[
  {
    "path": ".gitattributes",
    "content": "*.js linguist-language=Java\n*.css linguist-language=Java\n*.ts linguist-language=vue\n*.html linguist-language=vue\n*.sql linguist-language=Java\n*.ftl linguist-language=Java"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: 提交 Bug\nabout: 请告诉我框架存在的问题，我会协助你解决此问题！\nlabels: bug\nassignees: getActivity\n\n---\n\n\n##### 版本号：\n\n\n##### 分支：\n\n\n##### 问题描述：\n\n\n\n##### 错误截图：\n\n\n\n\n#### 友情提示：\n  - 未按格式要求发帖、描述过于简单的，会被直接删掉;\n  - 描述问题请图文并茂，方便我们理解并快速定位问题;\n  - 如果使用的不是master，请说明你使用的分支;\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: 提交建议\nabout: 请告诉我框架的不足之处，让我做得更好！\nlabels: help wanted\nassignees: getActivity\n\n---\n\n##### 版本号：\n\n\n##### 分支：\n\n\n##### 问题描述：\n\n\n\n##### 错误截图：\n\n\n\n\n#### 友情提示：\n  - 未按格式要求发帖、描述过于简单的，会被直接删掉;\n  - 描述问题请图文并茂，方便我们理解并快速定位问题;\n  - 如果使用的不是master，请说明你使用的分支;\n"
  },
  {
    "path": ".gitignore",
    "content": "## ide\n**/.idea\n*.iml\nrebel.xml\n\n## backend\n**/target\n**/logs\n\n## front\n**/*.lock\nos_del.cmd\nos_del_doc.cmd\n.svn\nderby.log\n.cursor\n.history\n.claude"
  },
  {
    "path": "LICENSE",
    "content": "    Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright (c) 2019 <a href=\"http://www.jeecg.com\">Jeecg Boot</a> All rights reserved.\n \n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n   \n   In any case, you must not make any such use of this software as to develop software which may be considered competitive with this software."
  },
  {
    "path": "README-AI.md",
    "content": "AIGC应用平台介绍\n===============\n\n一个全栈式 AI 开发平台，旨在帮助开发者快速构建和部署个性化的 AI 应用。\n\nJeecgBoot平台的AIGC功能模块，是一套类似`Dify`的`AIGC应用开发平台`+`知识库问答`，是一款基于LLM大语言模型AI应用平台和 RAG 的知识库问答系统。\n其直观的界面结合了 AI 流程编排、RAG 管道、知识库管理、模型管理、对接向量库、实时运行可观察等，让您可以快速从原型到生产，拥有AI服务能力。\n\n\n\n### AI视频介绍\n\n[![](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/jeecg_aivideo.png)](https://www.bilibili.com/video/BV1zmd7YFE4w)\n\n\n##### 功能大模块\n\n- AI应用开发平台\n- AI知识库系统\n- AI大模型管理\n- AI流程编排\n- AI对话支持图片\n- AI对话助手(智能问答)\n- AI建表（Online表单）\n- AI写文章（CMS）\n- AI表单字段建议（表单设计器）\n\n\n\n#### Dify `VS` JEECG AI\n\n> JEECG AI与Dify相比，在多个方面展现出显著的优势，特别是在文档处理、格式和图片保持方面。以下是一些具体的优点：\n> - Markdown文档库导入：\n> JEECG AI允许用户直接导入整个Markdown文档库，这不仅保留markdown格式，还支持图片的导入，确保文档内容的完整性和可视化效果。\n> - 对话回复格式美观：\n> 在对话过程中，JEECG AI能够保持回复内容的原格式，也不丢失图片，使得输出的文章更加美观，不会出现格式错乱的情况，还支持图片的渲染。\n> - PDF文档导入与格式转换：\n> JEECG AI在处理PDF文档时，能够更好地保持原始格式和图片，确保转换后的内容与原始文档一致。这个功能在许多AI产品中表现不佳，而JEECG AI在这方面做出了显著的优化\n\n\n| 功能         | Dify             | Jeecg AI                                |\n|------------|------------------|-----------------------------------------|\n| AI工作流      | 有                | 有                                       |\n| RAG 管道向量搜索 | 有                | 有                                       |\n| AI模型管理     | 有                | 有                                       |\n| AI应用管理     | 有                | 有                                       |\n| AI知识库      | 有                | 有                                       |\n| 产品方向       | 一款独立的 LLM 应用开发平台 | 低代码与AIGC应用二者结合的平台                       |\n| 业务集成       | 业务集成能力弱          | 更方便与业务系统集成，调用系统接口和逻辑更加方便                |\n| AI业务流      | 侧重AI逻辑流程         | AI流程编排作为低代码的业务引擎，用户可以通过AI流程配置各种业务流和AI流程 |\n| 实现语言       | python + react | JAVA + vue3                             |\n| 上传markdown文档库(支持图片) | 不支持 | 支持 |\n| AI对话支持发图和展示图片 | 支持 | 支持 |\n\n\n\n### 技术文档\n\n- [AIGC开发文档](https://help.jeecg.com/aigc)\n- [安装向量库 pgvector](https://help.jeecg.com/aigc/config)\n\n\n\n## 功能特点\n\n- AI流程: 提供强大的AI流程设计器引擎，支持编排 AI 工作过程，满足复杂业务场景，支持画布上构建和实时运行查看 AI流程运行情况。\n- AI流程即服务: 通过AI流程编排你需要的智能体，结合AI+自定义开发节点 实现功能性 API，让你瞬间拥有各种智能体API。\n- AI助手对话功能: 集成 ChatGPT、Deepseek、智普、私有大模型 等 AI 模型，提供智能对话和生成式 AI 功能，深度与知识库结合提供更精准的知识。\n- RAG 功能: 涵盖从文档摄入到检索的所有内容，支持从 PDF、PPT 和其他常见文档格式中提取文本，支持检索增强生成（RAG），将未训练数据与 AI 模型集成，提升智能交互能力。\n- AI 知识库: 通过导入文档或已有问答对进行训练，让 AI 模型能根据文档以交互式对话方式回答问题。\n- 模型管理：支持对接各种大模型，包括本地私有大模型（Deepseek/ Llama 3 / Qwen 2 等）、国内公共大模型（通义千问 / 腾讯混元 / 字节豆包 / 百度千帆 / 智谱 AI / Kimi 等）和国外公共大模型（OpenAI / Claude / Gemini 等）；\n- 无缝嵌入：Iframe一键嵌入,支持将AI聊天助手快速嵌入到第三方系统，让系统快速拥有智能问答能力，提高用户满意度。\n\n\n\n\n#### 在线体验\n\n- JeecgBoot演示：  https://boot3.jeecg.com\n- 敲敲云在线搭建AI知识库：https://app.qiaoqiaoyun.com\n\n\n## 技术交流\n\n- 开发文档：https://help.jeecg.com/aigc \n- QQ群：964611995、716488839(满)\n\n\n## 功能列表\n\n- AI应用管理(普通应用、高级流程应用)\n- AI模型管理\n- AI知识库\n- AI应用平台(普通、对接AI流程)\n- AI流程编排\n- AI聊天支持嵌入第三方\n- AI向量库对接\n\n\n\n## 支持AI模型\n\n| AI大模型         |  支持   |\n|---------------| --- |\n| DeepSeek      |  √   |\n| ChatGTP       |  √   |\n| Qwq           |  √   |\n| 智库            |  √   |\n| claude        |  √   |\n| vl模型          |  √   |\n| 千帆大模型         |  √   |\n| 通义千问          |  √   |\n| Ollama本地搭建大模型 |  √   |\n| 等等。。          |  √   |\n\n\n\n\n##  AIGC能做什么\n\nAIGC模块是一个基于AI的自动化流程编排工具和聊天应用搭建平台，它可以帮助用户快速生成AI流程接口和聊天应用，提高效率。\n以下是一些具体的应用场景和示例：\n\n- 你可能需要一个翻译接口，可以通过AI流程编排搭建出来。\n- 你可能需要一个接口转换工具，可以通过AI流程编排搭建出来。（比如：jimureport所需要接口返回格式与你的系统不同，你通过AI接口实现自动转换）\n- 你可能需要一个聊天机器人，可以通过AI流程编排搭建出来。\n- 你可能需要一个自动化流程，可以通过AI流程编排搭建出来。\n- 你可能需要一个自动化处理文件的流程，可以通过AI流程结合python脚本实现操作电脑，文件等。\n\n\n## AI应用平台功能展示\n\nAI模型列表\n\n![](https://oscimg.oschina.net/oscnet//a5fb3e0d69ca1706b0de221535c7acaa.png)\n\n选择AI模型，配置你的参数\n\n![](https://oscimg.oschina.net/oscnet//1f941472758a5fc227f54f2683953b8e.png)\n\n\nAI知识库支持手工录入文本，导入pdf\\\\word\\\\excel等文档，支持问答对训练\n\n![](https://oscimg.oschina.net/oscnet//150bb33f48d6c8e2ae059e2a58f4200b.png)\n\n![](https://oscimg.oschina.net/oscnet//032d16c915b0f79318935484c81df260.png)\n\n\n\nAI流程，提供强大的AI流程设计器引擎，支持编排 AI 工作过程，满足复杂业务场景，支持画布上构建和实时运行查看 AI流程运行情况。\n\n![](https://oscimg.oschina.net/oscnet//f40f9aa275cd4aea94e1c209513151e2.png)\n\n\n目前支持的节点有：开始、结束、AI知识库节点、AI节点、分类节点、分支节点、JAVA节点、脚本节点、子流程节点、http请求节点、直接回复节点等节点\n\n![](https://oscimg.oschina.net/oscnet//6d86480ab1bbfab5b2e6992b416b2152.png)\n\n节点项配置\n\n![](https://oscimg.oschina.net/oscnet//90a5f76b6b4fc406e2e2b87245b35459.png)\n\n在线运行看结果\n\n![](https://oscimg.oschina.net/oscnet//bc9817a7bbd94936a5a3e885abe3cb38.png)\n\n\nAI应用配置，支持AI流程配置和简单的AI配置\n\n![](https://oscimg.oschina.net/oscnet//a853d9be4d3756806799ad025e722df8.png)![](https://oscimg.oschina.net/oscnet//d3bcbf5977c6fb75a8f996e1e40590be.png)\n\n可以关联多个知识库，右侧是AI智能回复，你可以搭建自己的智能体，比如搭建一个 “诗词达人” “翻译助手”\n\n![](https://oscimg.oschina.net/oscnet//c26a848136be3e22ec1e0651e78976c2.png)\n\n可以将创建的聊天应用，集成到第三方系统中\n\n![](https://oscimg.oschina.net/oscnet//39c6f589ef46f0454b229915ffa263f4.png)"
  },
  {
    "path": "README.en-US.md",
    "content": "[中文](./README.md) | English\n\n![JEECG](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/logov3.png \"JeecgBoot低代码开发平台\")\n\n\n\nJEECG BOOT AI Low Code Platform\n===============\n\nCurrent version: 3.9.1 (Release date: 2026-01-28)\n\n\n[![AUR](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE)\n[![](https://img.shields.io/badge/Author-guojusoft-orange.svg)](http://www.jeecg.com)\n[![](https://img.shields.io/badge/version-3.9.1-brightgreen.svg)](https://github.com/zhangdaiscott/jeecg-boot)\n[![GitHub stars](https://img.shields.io/github/stars/zhangdaiscott/jeecg-boot.svg?style=social&label=Stars)](https://github.com/zhangdaiscott/jeecg-boot)\n[![GitHub forks](https://img.shields.io/github/forks/zhangdaiscott/jeecg-boot.svg?style=social&label=Fork)](https://github.com/zhangdaiscott/jeecg-boot)\n\n\n\nProject introduction\n-----------------------------------\n\n<h3 align=\"center\">Java AI Low Code Platform</h3>\n\nJeecgBoot is a `AI low code platform` based on code `generators`! Front and back end separation architecture SpringBoot2.x, SpringCloud, Ant Design&Vue, Mybatis plus, Shiro, JWT, support for microservices. The powerful code generator makes the front and back end of the code generation, low code development! JeecgBoot leads a new low-code development paradigm (OnlineCoding-> Code Generator -> Manual MERGE) that helps resolve 70% of the duplication in Java projects and makes development more business-focused. Not only can quickly improve efficiency, save research and development costs, but also do not lose flexibility!\n\nJeecgBoot provides a series of low code modules to make Online development truly zero code: Online form development, online reports, report configuration capabilities, online chart design, large screen design, mobile configuration capabilities, form designer, online design flow, process automation configuration, plug-in capabilities (pluggable) and more!\n\n\nThe purpose of JEECG is: simple functions are implemented by OnlineCoding configuration, so that zero code development; Complex functions are generated by code generator and manually Merge to achieve low code development, which ensures both intelligence and flexibility. The implementation of low code development and support flexible coding at the same time, to solve the current low code products are generally not flexible drawbacks!\n\nJEECG Business process: Using workflow to implement and extend the task interface for developing and writing business logic, forms provides a variety of solutions: form designer, online configuration form, and coding form. At the same time, the separation design of process and form (loose coupling) is realized, and the flexible configuration of task nodes is supported, which not only ensures the confidentiality of the company's process, but also reduces the workload of developers.\n\nAI Empowering Low-Code: Currently, JeecgBoot supports AI large models such as ChatGPT and DeepSeek. The latest version defaults to using DeepSeek, which offers faster speed and higher quality. It now provides features such as AI chat assistant, AI table creation, and AI report generation.\n\nTechnical support\n-----------------------------------\n\nProblems or bugs in use can be found in [Making on the Issues](https://github.com/jeecgboot/JeecgBoot/issues/new?template=bug_report.md)\n\n\n##### Project description\n\n| Project                | description                     | \n|--------------------|------------------------|\n| `jeecg-boot`    | SpringBoot background source code (support microservices)      |\n| `jeecgboot-vue3` | Vue3+TS new front-end source code|\n| `jeecg-uniapp` | [APP development framework, a code multi terminal adaptation, and support APP, small program, H5](https://github.com/jeecgboot/jeecg-uniapp) |\n\n\n### Video Introduction\n\n[![](https://upload.jeecg.com/jeecg/qiaoqiaoyunsite/jeecgvideo02.png)](https://www.bilibili.com/video/BV1Nk4y1o7Qc)\n\n\n\nDownload other source code\n-----------------------------------\n- APP SourceCode：https://github.com/jeecgboot/jeecg-uniapp\n\n\n\nFor the project\n-----------------------------------\nJeecg-Boot AI low code platform can be applied in the development of any J2EE project, especially for SAAS projects, enterprise information management system (MIS), internal office system (OA), enterprise resource planning system (ERP), customer relationship management system (CRM), etc. Its semi-intelligent manual Merge development method, Can significantly improve the development efficiency of more than 70%, greatly reduce the development cost.\n\n\nStarts the project\n-----------------------------------\n\n> Default account password： admin/123456\n\n- [Development Environment setup](https://help.jeecg.com/java/setup/tools)\n- [IDEA Quick start(single model)](https://help.jeecg.com/java/setup/idea/startup)\n- [Docker Quick start(single model)](https://help.jeecg.com/java/docker/quick)\n- [IDEA Quick start(microservices model)](https://help.jeecg.com/java/springcloud/switchcloud/monomer)\n- [Docker Quick start(microservices model)](https://help.jeecg.com/java/docker/quickcloud)\n\n\nTechnical documentation\n-----------------------------------\n\n- Website：  [http://www.jeecg.com](http://www.jeecg.com)\n- Demo ： [OnlineDemo](http://boot3.jeecg.com) | [APP](http://jeecg.com/appIndex)\n- Doc：  [DocumentCenter](http://help.jeecg.com) | [AI Config](https://help.jeecg.com/java/ai/aichat)\n- Newbie guide： [Quick start](http://www.jeecg.com/doc/quickstart) |   [Q&A ](http://www.jeecg.com/doc/qa)  |  [1 minute experience](https://my.oschina.net/jeecg/blog/3083313)\n- QQ group ： 964611995、⑩716488839(满)、⑨808791225(满)\n\n\n\n\n\n\nStar charts\n-----------------------------------\n\n[![Star History Chart](https://api.star-history.com/svg?repos=jeecgboot/jeecg-boot&type=Date)](https://star-history.com/#jeecgboot/jeecg-boot)\n\n\n\n\nBackground directory Structure\n-----------------------------------\n```\nproject structure\n├─jeecg-boot-parent\n│  ├─jeecg-boot-base-core\n│  ├─jeecg-module-demo    \n│  ├─jeecg-module-system \n│  │  ├─jeecg-system-biz   \n│  │  ├─jeecg-system-start system (8080）\n│  │  ├─jeecg-system-api   \n│  │  │  ├─jeecg-system-cloud-api  \n│  │  │  ├─jeecg-system-local-api   \n│  ├─jeecg-server-cloud           \n     ├─jeecg-cloud-gateway       (9999)\n     ├─jeecg-cloud-nacos       --Nacos(8848)\n     ├─jeecg-system-cloud-start  --System(7001)\n     ├─jeecg-demo-cloud-start    --Demo(7002)\n     ├─jeecg-visual\n        ├─jeecg-cloud-monitor       -- (9111)\n        ├─jeecg-cloud-xxljob        -- (9080)\n        ├─jeecg-cloud-sentinel     --sentinel (9000)\n        ├─jeecg-cloud-test           \n           ├─jeecg-cloud-test-more        \n           ├─jeecg-cloud-test-rabbitmq     \n           ├─jeecg-cloud-test-seata         \n           ├─jeecg-cloud-test-shardingsphere    \n\n```\n\n\n\n\nWhy JeecgBoot?\n-----------------------------------\n* Adopt the latest mainstream front and back separation framework (Springboot+Mybatis+antd), easy to use; Code generator has low dependency, flexible expansion ability, and can quickly realize secondary development;\n* Support microservices SpringCloud Alibaba(Nacos, Gateway, Sentinel, Skywalking), and provide switching mechanism to support free switching between single and microservices\n* High development efficiency, using code generator, single table, tree list, one-to-many, one-to-one and other data models, add, delete, change and search function one-key generation, menu configuration directly use;\n* Code generator provides powerful template mechanism, support custom template, currently provide four sets of style template (single table two sets, tree model one set, one to many three sets)\n* Code generator is very intelligent, online business modeling, online configuration, WYSIWYG support 23 kinds of controls, a key to generate front and back end code, greatly improve the development efficiency, no longer worry about repeated work.\n* Low code ability: Online online form (without coding, through online configuration of the form, to achieve the addition, deletion, change and check of the form, support single table, tree, one-to-many, one-to-one model, to achieve everyone can code)\n* Low code ability: Online online report (without coding, through online configuration, to achieve data report, can quickly extract data, reduce development pressure, to achieve everyone can code)\n* Low code ability: Online online chart (without coding, through online configuration, to achieve graphs, bar graphs, data reports, etc., support custom layout, to achieve everyone can code)\n* Complete encapsulation of user, role, menu, organization, data dictionary, online scheduled tasks and other basic functions, support access authorization, button permission, data permission and other functions\n* Commonly used common package, various tools (scheduled task, SMS interface, email sending,Excel import and export, etc.), basically meeting 80% of project requirements\n* Easy Excel import and export, support single table export and one-to-many table mode export, generated code with import and export function\n* Integrated simple report tools, image report and data export is very convenient, can be extremely convenient to generate graphical reports, pdf, excel, word and other reports;\n* Before and after the separation technology, the page UI style is exquisite, for the commonly used components to do the encapsulation: time, row table control, interception display control, report component, editor and so on\n* Query filter: query function automatically generated, the background dynamic spell SQL additional query conditions; Supports multiple matching modes (full matching, fuzzy query, included query, and unmatched query).\n* Data permission (fine data permission control, control to row level, list level, form field level, realize different people see different data, different people operate different fields on the same page\n* Page verification automatically generated (must be input, digital verification, amount verification, time and space, etc.);\n* Support SAAS service model and provide SaaS multi-tenant architecture solution.\n* Distributed file service, integration of minio, Ali OSS and other excellent third parties, to provide convenient file upload and management, but also support local storage.\n* Mainstream database compatibility, a set of code is fully compatible with Mysql, Postgresql, Oracle, Sqlserver, MariaDB, dream and other mainstream databases.\n* Integrate workflow flowable and realize only the configuration of flow direction in the page, which can greatly simplify the development of bpm workflow; Using bpm's process designer to draw the flow direction, a workflow is basically complete with a small amount of java code;\n* Low code ability: online process design, using open source Activiti process engine, to achieve online drawing process, custom form, form attachment, business flow\n* Multi-data source: its simple way of use, online configuration of data source configuration, convenient to grab data from other data;\n* Provide single sign-on CAS integration solution, and complete docking code has been provided in the project\n* Low code ability: form designer, support user custom form layout, support single table, one to many forms, support select, radio, checkbox, textarea, date, popup, list, macro and other controls\n* Professional interface docking mechanism, unified using restful interface, integrated swagger-ui online interface documentation, Jwt token security verification, convenient client docking\n* Interface security mechanism, can be refined control interface authorization, very simple to realize different clients only see their own data control\n* Advanced combination query function, online configuration support primary and sub-table associated query, can save the query history\n* Provide a variety of system monitoring, real-time tracking system running conditions (monitoring Redis, Tomcat, jvm, server information, request tracking, SQL monitoring)\n* Message center (support SMS, email, wechat push, etc.)\n* Integrate Websocket message notification mechanism\n* Excellent mobile adaptive effect, providing APP release scheme:\n* Support multiple languages and provide internationalization solutions;\n* Data change record log, can record each change of data content, through the version comparison function to view historical changes\n* The platform UI is powerful and mobile adaptation is implemented\n* Platform home page style, provide a variety of combination mode, support custom style\n* Provide easy to use print plug-in, support Google, Firefox, IE11+ and other browsers\n* Rich sample code, provide a lot of learning case reference\n* Using maven module development method\n* Support dynamic menu routing\n* RBAC (Role-Based Access Control) is used for permission control.\n* Provide new row edit table JVXETable, easily meet a variety of complex ERP layout, with higher performance, more flexible extension, more powerful functions\n\n \n \n \nTechnical Architecture:\n-----------------------------------\n\n#### Development Environment\n\n- Language: Java Default Jdk17(support jdk8、jdk21)\n\n- IDE(JAVA) : IDEA (lombok plug-in must be installed)\n\n- IDE(front-end) : Vscode, WebStorm, IDEA\n\n- Dependency management: Maven\n\n- Cache: Redis\n\n- Database: MySQL5.7 + [More Databases](https://my.oschina.net/jeecg/blog/4905722)\n\n\n#### backend\n\n- Basic framework: Spring Boot 2.7.18\n\n- Microservice framework: Spring Cloud Alibaba 2021.0.6.2\n\n- Persistence layer framework: MybatisPlus 3.5.3.2\n\n- Report tool: JimuReport 1.9.5\n\n- Security framework: Apache Shiro 1.13.0, Jwt 4.5.0\n\n- Microservice technology stack: Spring Cloud Alibaba, Nacos, Gateway, Sentinel, Skywalking\n\n- Database connection pool: Alibaba Druid 1.1.24\n\n- Log printing: logback\n\n- Others: autopoi, fastjson, poi, Swagger-ui, quartz, lombok (simplified code), etc.\n\n\n#### The front end\n\n- TechnologyStack：`Vue3.0+TypeScript+Vite+AntDesignVue+pinia+echarts`\n\n#### Front-end environment requirements\n\n*    `Node.js 、npm 、pnpm`\n*   pnpm `v9+` is now required.\n*   Node.js Version suggestion: `v20.15.0`\n ` ( Since Vite6 Node.js 18/20 + is now required )`\n \n\n#### Support library\n\n|  database   |  support   |\n| --- | --- |\n|   MySQL   |  √   |\n|  Oracle11g   |  √   |\n|  Sqlserver2017   |  √   |\n|   PostgreSQL   |  √   |\n|   MariaDB   |  √   |\n|   达梦   |  √   |\n|   人大金仓   |  √   |\n|   TiDB   |  √   |\n\n\n#### AI Support\n\n| AI Model | Supported |\n| --- | --- |\n| DeepSeek | √ |\n| ChatGPT | √ |\n| Qwq | √ |\n| 智库 | √ |\n| Ollama本地搭建大模型 | √ |\n| 等等。。 | √ |\n\n\nAI Config： https://help.jeecg.com/java/ai/aichat\n\nAI APP: https://help.jeecg.com/aigc\n\n\n## Microservice solutions\n\n- 1. Service registration and discovery Nacos √\n- 2. Nacos √\n- 3. Route gateway gateway(Three loading modes) √\n- 4. Distributed http feign √\n- 5. fuse degrade current limiting Sentinel √\n- 6. Distributed files Minio and Alioss √\n- 7. Unified permission control\n- 8. Service monitoring SpringBootAdmin√\n- 9. link tracking Skywalking  [reference document](https://help.jeecg.com/java/springcloud/super/skywarking)\n- 10. Messaging middleware RabbitMQ √\n- 11. Distributed task xxl-job √\n- 12. Distributed Transaction Seata\n- 13. Distributed log Loki+grafana\n- 14. Support docker-compose, k8s, jenkins\n- 15. CAS SSO √\n- 16. Route traffic limiting √\n\n   \n#### Microservice architecture diagram\n![微服务架构图](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/jeecgboot_springcloud2022.png \"在这里输入图片标题\")\n\n### Jeecg Boot product functionality blueprint\n![功能蓝图](https://jeecgos.oss-cn-beijing.aliyuncs.com/upload/test/Jeecg-Boot-lantu202005_1590912449914.jpg \"在这里输入图片标题\")\n\n### quick start\n- Microservice Development：  [Monomer upgrade to microservice](https://help.jeecg.com/java/springcloud/switchcloud/monomer)\n- [Docker starts the micro-service background](https://help.jeecg.com/java/docker/springcloud)\n\n\n### Effect of system\n\n##### ChatGPT AI Dialog\n> Go to the JeecgBoot background home page and click \"AI Assistant\" in the middle of the right side of the home page. The AI Assistant dialog screen is displayed.\n![](https://oscimg.oschina.net/oscnet/up-7c6405641a40f56638999d52da0cb5b4343.png)\n\n\n##### PC\n\n##### AI Model and Application Management\n\n![](https://oscimg.oschina.net/oscnet/up-0b1779e923566ccebb2d5a9cc9220c78b4a.png)\n\n![](https://oscimg.oschina.net/oscnet/up-c8956df1d37d66b2d40136afaeca677628b.png)\n\n![](https://oscimg.oschina.net/oscnet/up-8c348eeafd89673ca8cd1a2705014e3ac04.png)\n\nAI Workflow Orchestration\n\n![](https://oscimg.oschina.net/oscnet/up-2343657de2c7ac8010bc471470d084075ae.png)\n\nMCP and Tool Management\n\n![](https://oscimg.oschina.net/oscnet/up-8119d5dbc72e534236a3d042e11534c52ad.png)\n\nAI Knowledge Base (Supports various document formats, with excellent markdown compatibility)\n\n![](https://oscimg.oschina.net/oscnet/up-e2e9c118982ea366ed7f2b9827d4bb46c5d.png)\n\nAI Toolbox\n\n![](https://oscimg.oschina.net/oscnet/up-bf2a808d22a11fd83e577ad74741d97884b.png)\n\nAI Chat Assistant\n\n![](https://oscimg.oschina.net/oscnet/up-2a51accc2ff0b647e0ee058a58d291fe811.png)\n\n![](https://oscimg.oschina.net/oscnet/up-ea1069c2a92a3ab2963d88763016cb037c2.png)\n\n![](https://oscimg.oschina.net/oscnet//65298d5710b4e6039a5f802b5f8505c5.png)\n\n\n\n![](https://oscimg.oschina.net/oscnet/up-000530d95df337b43089ac77e562494f454.png)\n\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14155402_AmlV.png \"在这里输入图片标题\")\n\n![](https://oscimg.oschina.net/oscnet/up-9d6f36f251e71a0b515a01323474b03004c.png)\n\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14160813_KmXS.png \"在这里输入图片标题\")\n\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14160935_Nibs.png \"在这里输入图片标题\")\n\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14161004_bxQ4.png \"在这里输入图片标题\")\n\n#####  interactive\n![](https://oscimg.oschina.net/oscnet/up-78b151fc888d4319377bf1cc311fe826871.png)\n\n![](https://oscimg.oschina.net/oscnet/up-16c07e000278329b69b228ae3189814b8e9.png)\n\n\n##### process Designer\n![](https://oscimg.oschina.net/oscnet/up-981ce174e4fbb48c8a2ce4ccfd7372e2994.png)\n\n![输入图片说明](https://static.oschina.net/uploads/img/201907/05165142_yyQ7.png \"在这里输入图片标题\")\n\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14160917_9Ftz.png \"在这里输入图片标题\")\n\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14160633_u59G.png \"在这里输入图片标题\")\n\n##### min process\n\n![](https://oscimg.oschina.net/oscnet/up-1dc0d052149ec675f3e4fad632b82b48add.png)\n\n![](https://oscimg.oschina.net/oscnet/up-de31bc2f9d9b8332c554b0954cc73d79593.png)\n\n![](https://oscimg.oschina.net/oscnet/up-7f83b25159663686d67ed080eb16068c3b4.png)\n\n#####  dashboard Designer\n\n\n![](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/darg20240726105556.png)\n\n![](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/drag20240724135626.png)\n\n![](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/drag20240724135619.png)\n\n![](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/drag20240724135630.png)\n\n![](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/drag20240726105547.png)\n\n![](https://oscimg.oschina.net/oscnet/up-fad98d42b2cf92f92a903c9cff7579f18ec.png)\n\n\n\n##### report Designer\n![](https://oscimg.oschina.net/oscnet/up-64648de000851f15f6c7b9573d107ebb5f8.png)\n\n![](https://oscimg.oschina.net/oscnet/up-fa52b44445db281c51d3f267dce7450d21b.gif)\n\n![](https://oscimg.oschina.net/oscnet/up-68a19149d640f1646c8ed89ed4375e3326c.png)\n\n![](https://oscimg.oschina.net/oscnet/up-f7e9cb2e3740f2d19ff63b40ec2dd554f96.png)\n\n##### form Designer\n![](https://oscimg.oschina.net/oscnet/up-5f8cb657615714b02190b355e59f60c5937.png)\n\n![](https://oscimg.oschina.net/oscnet/up-d9659b2f324e33218476ec98c9b400e6508.png)\n\n![](https://oscimg.oschina.net/oscnet/up-4868615395272d3206dbb960ade02dbc291.png)\n\n##### bigscreen Designer\n![](https://oscimg.oschina.net/oscnet/up-402a6034124474bfef8dfc5b4b2bac1ce5c.png)\n\n![](https://oscimg.oschina.net/oscnet/up-6f7ba2e2ebbeea0d203db8d69fd87644c9f.png)\n\n![](https://oscimg.oschina.net/oscnet/up-ee8d34f318da466b8a6070a6e3111d12ce7.png)\n\n![](https://oscimg.oschina.net/oscnet/up-6b81781b43086819049c4421206810667c5.png)\n\n##### uniapp\n![](https://oscimg.oschina.net/oscnet/up-aac943fbd26561879c57a41f7a406edf274.png)\n\n![](https://oscimg.oschina.net/oscnet/up-9a44ba2e82b09c750629d12fafd7f60f553.png)\n\n##### low app\n![](https://oscimg.oschina.net/oscnet/up-4be29ae761b2615c8c54b3f668cd8432d9b.png)\n\n![](https://oscimg.oschina.net/oscnet/up-787e76bc24b38ecc7ed19f338808d128255.png)\n\n![](https://oscimg.oschina.net/oscnet/up-99d24a236c483362868523ad0d90f611487.png)\n\n![](https://oscimg.oschina.net/oscnet/up-339a0f29d10449abc7724e3bcda802761c1.png)\n\n![](https://oscimg.oschina.net/oscnet/up-b356670cdc14c609958c7619a537397c4b9.png)\n\n##### app\n![](https://oscimg.oschina.net/oscnet/da543c5d0d57baab0cecaa4670c8b68c521.jpg)\n![](https://oscimg.oschina.net/oscnet/fda4bd82cab9d682de1c1fbf2060bf14fa6.jpg)\n\n##### PAD\n![](https://oscimg.oschina.net/oscnet/e90fef970a8c33790ab03ffd6c4c7cec225.jpg)\n![](https://oscimg.oschina.net/oscnet/d78218803a9e856a0aa82b45efc49849a0c.jpg)\n![](https://oscimg.oschina.net/oscnet/59c23b230f52384e588ee16309b44fa20de.jpg)\n\n\n##### chart\n![](https://oscimg.oschina.net/oscnet/up-218bc6a1669496b241ebb23506440c0083e.png)\n\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14160834_Lo23.png \"在这里输入图片标题\")\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14160842_QK7B.png \"在这里输入图片标题\")\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14160849_GBm5.png \"在这里输入图片标题\")\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14160858_6RAM.png \"在这里输入图片标题\")\n\n##### swagger\n![输入图片说明](https://static.oschina.net/uploads/img/201908/27095258_M2Xq.png \"在这里输入图片标题\")\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14160957_hN3X.png \"在这里输入图片标题\")\n\n\n## donation\n\nIf so, buy the author a cup of coffee ☺\n\n![](https://static.oschina.net/uploads/img/201903/08155608_0EFX.png)"
  },
  {
    "path": "README.md",
    "content": "中文 | [English](./README.en-US.md)\n\nJeecgBoot AI低代码平台\n===============\n\n当前最新版本： 3.9.1（发布日期：2026-01-28） \n\n\n[![AUR](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://github.com/jeecgboot/JeecgBoot/blob/master/LICENSE)\n[![](https://img.shields.io/badge/Author-北京国炬软件-orange.svg)](https://jeecg.com)\n[![](https://img.shields.io/badge/blog-技术博客-orange.svg)](https://my.oschina.net/jeecg)\n[![](https://img.shields.io/badge/version-3.9.1-brightgreen.svg)](https://github.com/jeecgboot/JeecgBoot)\n[![GitHub stars](https://img.shields.io/github/stars/zhangdaiscott/jeecg-boot.svg?style=social&label=Stars)](https://github.com/jeecgboot/JeecgBoot)\n[![GitHub forks](https://img.shields.io/github/forks/zhangdaiscott/jeecg-boot.svg?style=social&label=Fork)](https://github.com/jeecgboot/JeecgBoot)\n\n\n\n项目介绍\n-----------------------------------\n\n<h3 align=\"center\">企业级AI低代码平台</h3>\n\nJeecgBoot 是一款 AI 驱动的低代码开发平台，以\"低代码 + 零代码\"双模式覆盖从快速搭建到深度定制的全场景需求。零代码模式下，一句话即可搭建完整业务系统；\n代码生成模式下，AI 自动输出前后端代码、建表 SQL 与菜单权限，生成即可运行。\n平台内置 AI 聊天助手、知识库、流程编排、MCP 与插件体系，兼容主流大模型，同时支持一句话生成流程图、一句话设计表单、聊天式业务操作等智能能力。\n整体遵循\"AI 生成 → 在线配置 → 代码生成 → 手工合并\"的开发流程，解决 Java 项目中 80% 的重复工作，在大幅提升效率的同时保留充分的灵活性与可控性。\n\n---\n\n采用最新的前后端分离技术栈（Ant Design&Vue3，SpringBoot3，SpringCloud Alibaba，Mybatis-plus，具备强大且颗粒化的权限控制，支持按钮权限和数据权限设置，满足大型业务系统需求。功能涵盖在线表单、表单设计、流程设计、门户设计、报表与大屏设计、OA办公、AI应用、AI知识库、大模型管理、AI流程编排、AI聊天，支持ChatGPT、DeepSeek、Ollama等多种AI大模型。\n\n\n- `零代码能力:` 国内首个“低代码+零代码”双模驱动的AI智能开发平台！同时支持低代码和零代码; 让开发者用低代码，让业务人员在同一个平台上用零代码！\n\n- `AI驱动开发:` 全新推出AI驱动开发能力，支持一句话生成完整系统，提供零代码模式（一句话搭建系统，无需编写代码）和代码生成模式（基于 jeecg-codegen，自动生成完整代码和建表SQL）两种选择。同时支持一句话自动绘制流程图、设计表单，省去手工绘制繁琐步骤。[实战视频](https://www.bilibili.com/video/BV1KKwTzJEbX/) | [Skills技能清单](https://help.jeecg.com/java/ai/skills/skill-comparison/)\n\n- `AI智能报表:` JimuReport是一款自主研发的强大开源企业级Web报表工具。它通过零编码的拖拽式操作，赋能用户如同搭积木般轻松构建各类复杂报表，全面满足企业数据可视化与分析需求，助力企业级数据产品的高效打造与应用。\n\n- `AI智能大屏:` JimuBI一款自主研发的强大的大屏和仪表盘设计工具。专注数字孪生与数据可视化，支持交互式大屏、仪表盘、门户和移动端，实现“一次开发，多端适配”。 大屏设计类Word风格，支持多屏切换，自由拖拽，轻松打造炫酷动态界面。\n\n- `AI应用平台:` 盖AI应用管理、AI模型管理、智能对话助手、知识库问答、流程编排与设计器、AI建表、MCP插件配置等功能。平台兼容主流大模型，包括ChatGPT、DeepSeek、Ollama、智普、千问等，助力企业高效构建智能化应用，推动低代码开发与AI深度融合。\n\n- `JEECG宗旨是:` JEECG旨在通过OnlineCoding平台实现简单功能的零代码快速搭建，同时针对复杂功能采用代码生成器生成代码并手工合并，打造智能且灵活的低代码开发模式，有效解决了当前低代码产品普遍缺乏灵活性的问题，提升开发效率的同时兼顾系统的扩展性和定制化能力。\n\n- `JEECG业务流程:` JEECG业务流程采用BPM工作流引擎实现业务审批，扩展任务接口供开发人员编写业务逻辑，表单提供表单设计器、在线配置表单和编码表单等多种解决方案。通过流程与表单的分离设计（松耦合）及任务节点的灵活配置，既保障了企业流程的安全性与保密性，又大幅降低了开发人员的工作量。\n\n\n\n\n\nAI 重磅能力\n-----------------------------------\n\nJeecgBoot 全新推出 AI 驱动开发能力，**支持一句话生成完整系统**，极大简化开发流程。\n\n**两种模式，灵活选择：**\n\n| 模式 | 说明 |\n|------|------|\n| 零代码模式 | 一句话即可搭建系统，无需编写任何代码 |\n| 代码生成模式 | 基于 jeecg-codegen，自动生成完整代码和建表 SQL |\n\n**更多 AI 能力：**\n- 支持一句话自动绘制流程图，省去手工绘制繁琐步骤\n- 支持一句话自动设计表单，快速完成表单搭建\n\n**Skills下载：** [jeecgboot/skills](https://github.com/jeecgboot/skills)\n\n**视频教程：** [JeecgBoot+Skills自然语言编程](https://www.bilibili.com/video/BV1KKwTzJEbX/)\n\n**官方文档：** [Skills技能清单](https://help.jeecg.com/java/ai/skills/skill-comparison/)\n\n\nAI Skills 技能清单\n-----------------------------------\n\n结合 Claude Code 的 AI Skills 技能，JeecgBoot 实现了**自然语言驱动的低代码开发**，一句话即可完成从需求到代码/配置的全流程自动化。[详细文档](https://help.jeecg.com/java/ai/skills/skill-comparison/) | [Skills 下载](https://github.com/jeecgboot/skills)\n\n| Skill | 技能 | 功能介绍 | 是否需要写代码 |\n|-------|------|----------|---------------|\n| `jeecg-codegen` | AI一句话生成全套代码 | 自然语言需求自动转换为 JeecgBoot 全套 CRUD 代码，包括后端 Java 代码 + 前端 Vue3 代码 + 建表 SQL + 菜单权限 SQL，支持无表生成，甚至生成一套系统全代码 | 否（AI 自动生成源码） |\n| `jeecg-onlform` | AI一句话创建 Online 表单 | 自然语言需求自动转换为 JeecgBoot Online 表单，完成从表单配置 → 同步数据库 → 生成菜单 SQL 的全流程自动化 | 否 |\n| `jeecg-onlreport` | AI一句话创建 Online 报表 | 将自然语言需求自动转换为 JeecgBoot Online 报表，完成从 SQL 编写 → 字段解析 → 报表配置 → 创建报表的全流程自动化 | 否 |\n| `jeecg-desform` | AI一句话画表单 | 自然语言的表单需求描述自动转换为 JeecgBoot 的设计器表单，完成从需求解析 → JSON 生成 → API 创建的全流程自动化，甚至可以创建一套系统 | 否 |\n| `jeecg-bpmn` | AI一句话画流程 | 将自然语言的审批流程描述自动转换为 Flowable BPMN 2.0 XML，并通过 API 在 JeecgBoot 系统中自动创建流程 | 否 |\n\n\n适用项目\n-----------------------------------\nJeecgBoot低代码平台兼容所有J2EE项目开发，支持信创国产化，特别适用于SAAS、企业信息管理系统（MIS）、内部办公系统（OA）、企业资源计划系统（ERP）、客户关系管理系统（CRM）及AI知识库等场景。其半智能手工Merge开发模式，可显著提升70%以上的开发效率，极大降低开发成本。同时，JeecgBoot还是一款全栈式AI开发平台，助力企业快速构建和部署个性化AI应用。。\n\n\n**信创兼容说明**\n- 操作系统：国产麒麟、银河麒麟等国产系统几乎都是基于 Linux 内核，因此它们具有良好的兼容性。\n- 数据库：达梦、人大金仓、TiDB\n- 中间件：东方通 TongWeb、TongRDS，宝兰德 AppServer、CacheDB, [信创配置文档](https://help.jeecg.com/java/tongweb-deploy/)\n\n\n版本说明\n-----------------------------------\n\n|下载 | SpringBoot3.5 + Shiro                                   |SpringBoot3.5+ SpringAuthorizationServer | SpringBoot3.5 + Sa-Token | SpringBoot2.7(JDK17/JDK8) |\n|------|---------------------------------------------------------|----------------------------|-------------------|--------------------------------------------|\n| Github | [`main`](https://github.com/jeecgboot/JeecgBoot)        | [`springboot3_sas`](https://github.com/jeecgboot/JeecgBoot/tree/springboot3_sas) 分支  |  [`springboot3-satoken`](https://github.com/jeecgboot/JeecgBoot/tree/springboot3-satoken) 分支|[`springboot2`](https://github.com/jeecgboot/JeecgBoot/tree/springboot2) 分支|\n| Gitee | [`main`](https://github.com/jeecgboot/JeecgBoot) | [`springboot3_sas`](https://gitee.com/jeecg/JeecgBoot/tree/springboot3_sas) 分支|  [`springboot3-satoken`](https://gitee.com/jeecg/JeecgBoot/tree/springboot3-satoken) 分支|[`springboot2`](https://github.com/jeecgboot/JeecgBoot/tree/springboot2)     分支 |\n\n\n- `jeecg-boot` 是后端JAVA源码项目Springboot3+Shiro+Mybatis+SpringCloudAlibaba（支持单体和微服务切换）.\n- `jeecgboot-vue3` 是前端VUE3源码项目（vue3+vite6+ts最新技术栈）.\n- `JeecgUniapp`  是[配套APP框架](https://github.com/jeecgboot/JeecgUniapp) 适配多个终端，支持APP、小程序、H5、鸿蒙、鸿蒙Next.\n- `jeecg-boot-starter`  是[jeecg-boot对应的底层封装starter](https://github.com/jeecgboot/jeecg-boot-starter) ：微服务启动、xxljob、分布式锁starter、rabbitmq、分布式事务、分库分表shardingsphere等.\n- 参考 [文档](https://help.jeecg.com/ui/2dev/mini) 可以删除不需要的demo，制作一个精简版本\n\n\n\n启动项目\n-----------------------------------\n\n> 默认账号密码： admin/123456\n\n- [开发环境搭建](https://help.jeecg.com/java/setup/tools)\n- [IDEA启动前后端(单体模式)](https://help.jeecg.com/java/setup/idea/startup)\n- [Docker一键启动(单体模式)](https://help.jeecg.com/java/docker/quick)\n- [IDEA启动前后端(微服务方式)](https://help.jeecg.com/java/springcloud/switchcloud/monomer)\n- [Docker一键启动(微服务方式)](https://help.jeecg.com/java/docker/quickcloud)\n\n\n技术文档\n-----------------------------------\n\n- 在线演示：  [平台演示](https://boot3.jeecg.com) | [APP演示](https://jeecg.com/appIndex)\n- 官方网站：  [http://www.jeecg.com](http://www.jeecg.com)\n- 入门指南：  [快速入门](http://www.jeecg.com/doc/quickstart)  | [开发文档](https://help.jeecg.com)  | [AI应用手册](https://help.jeecg.com/aigc) | [视频教程](http://jeecg.com/doc/video)\n- 技术支持：  [反馈问题](https://github.com/jeecgboot/JeecgBoot/issues/new?template=bug_report.md)    | [低代码体验一分钟](https://jeecg.blog.csdn.net/article/details/106079007) \n- QQ交流群 ： 964611995、⑩716488839(满)、⑨808791225(满)、其他(满)\n\n\nAI 应用平台介绍\n-----------------------------------\n\n一个全栈式 AI 开发平台，旨在帮助开发者快速构建和部署个性化的 AI 应用。\n\nJeecgBoot平台提供了一套完善的AI应用管理系统模块，是一套类似`Dify`的`AIGC应用开发平台`+`知识库问答`，是一款基于LLM大语言模型AI应用平台和 RAG 的知识库问答系统。\n其直观的界面结合了 AI 流程编排、RAG 管道、知识库管理、模型管理、对接向量库、实时运行可观察等，让您可以快速从原型到生产，拥有AI服务能力。 \n\n- [详细专题介绍，请点击查看](README-AI.md)\n\n- AI视频介绍\n\n[![](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/jeecg_aivideo.png)](https://www.bilibili.com/video/BV1zmd7YFE4w)\n\n\n为什么选择JeecgBoot?\n-----------------------------------\n> 界内首款AI低代码开发平台，同时具备AI应用平台和低代码平台，通过AI驱动低代码开发！\n> 开源界\"小普元\"超越传统商业平台。引领低代码开发模式(OnlineCoding-> 代码生成器 -> 手工MERGE)，低代码开发同时又支持灵活编码， 可以帮助解决Java项目70%的重复工作，让开发更多关注业务。既能快速提高开发效率，节省成本，同时又不失灵活性。\n\n- 1.提供了一套完善的AI应用管理系统模块，是一套类似`Dify`的`AIGC应用开发平台`+`知识库问答`，是一款基于LLM大语言模型AI应用平台和 RAG 的知识库问答系统。 其直观的界面结合了 AI 流程编排、RAG 管道、知识库管理、模型管理、对接向量库、实时运行可观察等，让您可以快速从原型到生产，拥有AI服务能力\n- 2.采用最新主流前后分离框架（Spring Boot3 + MyBatisPlus + Vue3.0 + TypeScript + Vite6 + Ant Design Vue4 ）等新技术方案。便于学习容易上手，代码生成器依赖性低，灵活的扩展能力，可快速实现二次开发。\n- 3.支持微服务Spring Cloud Alibaba（Nacos、Gateway、Sentinel、Skywalking），提供简易机制，支持单体和微服务自由切换（这样可以满足各类项目需求）。\n- 4.开发效率高，支持在线建表和AI建表，提供强大代码生成器，单表、树列表、一对多、一对一等数据模型，增删改查功能一键生成，菜单配置直接使用。\n- 5.代码生成器提供强大模板机制，支持自定义模板，目前提供四套风格模板（单表两套、树模型一套、一对多三套）。\n- 6.提供强大的报表和大屏可视化工具，支持丰富的数据源连接，能够通过拖拉拽方式快速制作报表、大屏和门户设计；支持多种图表类型：柱形图、折线图、散点图、饼图、环形图、面积图、漏斗图、进度图、仪表盘、雷达图、地图等。\n- 7.低代码能力：在线表单（无需编码，通过在线配置表单，实现表单的增删改查，支持单表、树、一对多、一对一等模型，实现人人皆可编码），在线配置零代码开发、所见即所得支持23种类控件。\n- 8.低代码能力：在线报表、在线图表（无需编码，通过在线配置方式，实现数据报表和图形报表，可以快速抽取数据，减轻开发压力，实现人人皆可编码）。\n- 9.Online支持在线增强开发，提供在线代码编辑器，支持代码高亮、代码提示等功能，支持多种语言（Java、SQL、JavaScript等）。\n- 10.封装完善的用户、角色、菜单、组织机构、数据字典、在线定时任务等基础功能，支持访问授权、按钮权限、数据权限等功能。\n- 11.前端UI提供丰富的组件库，支持各种常用组件，如表格、树形控件、下拉框、日期选择器等，满足各种复杂的业务需求 [UI组件库文档](https://help.jeecg.com/category/ui%E7%BB%84%E4%BB%B6%E5%BA%93)。\n- 12.提供APP配套框架，一份多代码多终端适配，一份代码多终端适配，小程序、H5、安卓、iOS、鸿蒙Next。\n- 13.新版APP框架采用Uniapp、Vue3.0、Vite、Wot-design-uni、TypeScript等最新技术栈，包括二次封装组件、路由拦截、请求拦截等功能。实现了与JeecgBoot完美对接：目前已经实现登录、用户信息、通讯录、公告、移动首页、九宫格、聊天、Online表单、仪表盘等功能，提供了丰富的组件。\n- 14.提供了一套成熟的AI应用平台功能，从AI模型、知识库到AI应用搭建，助力企业快速落地AI服务，加速智能化升级。\n- 15.AI能力：目前JeecgBoot支持AI大模型chatgpt和deepseek，现在最新版默认使用deepseek，速度更快质量更高。目前提供了AI对话助手、AI知识库、AI应用、AI建表、AI报表等功能。\n- 16.提供新行编辑表格JVXETable，轻松满足各种复杂ERP布局，拥有更高的性能、更灵活的扩展、更强大的功能。\n- 17.平台首页风格，提供多种组合模式，支持自定义风格；支持门户设计，支持自定义首页。\n- 18.常用共通封装，各种工具类（定时任务、短信接口、邮件发送、Excel导入导出等），基本满足80%项目需求。\n- 19.简易Excel导入导出，支持单表导出和一对多表模式导出，生成的代码自带导入导出功能。\n- 20.集成智能报表工具，报表打印、图像报表和数据导出非常方便，可极其方便地生成PDF、Excel、Word等报表。\n- 21.采用前后分离技术，页面UI风格精美，针对常用组件做了封装：时间、行表格控件、截取显示控件、报表组件、编辑器等。\n- 22.查询过滤器：查询功能自动生成，后台动态拼SQL追加查询条件；支持多种匹配方式（全匹配/模糊查询/包含查询/不匹配查询）。\n- 23.数据权限（精细化数据权限控制，控制到行级、列表级、表单字段级，实现不同人看不同数据，不同人对同一个页面操作不同字段）。\n- 24.接口安全机制，可细化控制接口授权，非常简便实现不同客户端只看自己数据等控制；也提供了基于AK和SK认证鉴权的OpenAPI功能。\n- 25.活跃的社区支持；近年来，随着网络威胁的日益增加，团队在安全和漏洞管理方面积累了丰富的经验，能够为企业提供全面的安全解决方案。\n- 26.权限控制采用RBAC（Role-Based Access Control，基于角色的访问控制）。\n- 27.页面校验自动生成（必须输入、数字校验、金额校验、时间空间等）。\n- 28.支持SaaS服务模式，提供SaaS多租户架构方案。\n- 29.分布式文件服务，集成MinIO、阿里OSS等优秀的第三方，提供便捷的文件上传与管理，同时也支持本地存储。\n- 30.主流数据库兼容，一套代码完全兼容MySQL、PostgreSQL、Oracle、SQL Server、MariaDB、达梦、人大金仓等主流数据库。\n- 31.集成工作流Flowable，并实现了只需在页面配置流程转向，可极大简化BPM工作流的开发；用BPM的流程设计器画出了流程走向，一个工作流基本就完成了，只需写很少量的Java代码。\n- 32.低代码能力：在线流程设计，采用开源Flowable流程引擎，实现在线画流程、自定义表单、表单挂靠、业务流转。\n- 33.多数据源：极其简易的使用方式，在线配置数据源配置，便捷地从其他数据抓取数据。\n- 34.提供单点登录CAS集成方案，项目中已经提供完善的对接代码。\n- 35.低代码能力：表单设计器，支持用户自定义表单布局，支持单表、一对多表单，支持select、radio、checkbox、textarea、date、popup、列表、宏等控件。\n- 36.专业接口对接机制，统一采用RESTful接口方式，集成Swagger-UI在线接口文档，JWT token安全验证，方便客户端对接。\n- 37.高级组合查询功能，在线配置支持主子表关联查询，可保存查询历史。\n- 38.提供各种系统监控，实时跟踪系统运行情况（监控Redis、Tomcat、JVM、服务器信息、请求追踪、SQL监控）。\n- 39.消息中心（支持短信、邮件、微信推送等）；集成WebSocket消息通知机制。\n- 40.支持多语言，提供国际化方案。\n- 41.数据变更记录日志，可记录数据每次变更内容，通过版本对比功能查看历史变化。\n- 42.提供简单易用的打印插件，支持谷歌、火狐、IE11+等各种浏览器。\n- 43.后端采用Maven分模块开发方式；前端支持菜单动态路由。\n- 44.提供丰富的示例代码，涵盖了常用的业务场景，便于学习和参考。\n\n\n\n技术架构\n-----------------------------------\n\n#### 前端\n\n- 前端环境要求：Node.js要求`Node 20+` 版本以上、pnpm 要求`9+` 版本以上\n\n ` ( Vite 不再支持已结束生命周期（EOL）的 Node.js 18。现在需要使用 Node.js 20.19+ 或 22.12+)`\n\n- 依赖管理：node、npm、pnpm\n- 前端IDE建议：IDEA、WebStorm、Vscode\n- 采用 Vue3.0+TypeScript+Vite6+Ant-Design-Vue4等新技术方案，包括二次封装组件、utils、hooks、动态菜单、权限校验、按钮级别权限控制等功能\n- 最新技术栈：Vue3.0 + TypeScript + Vite6 + ant-design-vue4 + pinia + echarts + unocss + vxe-table + qiankun + es6\n\n\n#### 后端\n\n- IDE建议： IDEA (必须安装lombok插件 )\n- 语言：Java 默认jdk17(jdk21、jdk24)\n- 依赖管理：Maven\n- 基础框架：Spring Boot 3.5.5\n- 微服务框架： Spring Cloud Alibaba 2023.0.3.3\n- 持久层框架：MybatisPlus 3.5.12\n- 报表工具： JimuReport 2.1.3\n- 安全框架：Apache Shiro 2.0.4，Jwt 4.5.0\n- 微服务技术栈：Spring Cloud Alibaba、Nacos、Gateway、Sentinel、Skywalking\n- 数据库连接池：阿里巴巴Druid 1.2.24\n- AI大模型：支持 `ChatGPT` `DeepSeek` `千问`等各种常规模式\n- 日志打印：logback\n- 缓存：Redis\n- 其他：autopoi, fastjson，poi，Swagger-ui，quartz, lombok（简化代码）等。\n- 默认提供MySQL5.7+数据库脚本\n\n#### 数据库支持\n\n> jeecgboot平台支持以下数据库，默认我们只提供mysql脚本，其他数据库可以参考[转库文档](https://my.oschina.net/jeecg/blog/4905722)自己转。\n\n|  数据库   |  支持   |\n| --- | --- |\n|   MySQL   |  √   |\n|  Oracle11g   |  √   |\n|  Sqlserver2017   |  √   |\n|   PostgreSQL   |  √   |\n|   MariaDB   |  √   |\n|   达梦   |  √   |\n|   人大金仓   |  √   |\n|   TiDB     |  √   |\n|   kingbase8   |  √   |\n\n\n\n \n## 微服务解决方案\n\n- 1、服务注册和发现 Nacos √\n- 2、统一配置中心 Nacos  √\n- 3、路由网关 gateway(三种加载方式) √\n- 4、分布式 http feign √\n- 5、熔断降级限流 Sentinel √\n- 6、分布式文件 Minio、阿里OSS √ \n- 7、统一权限控制 JWT + Shiro √\n- 8、服务监控 SpringBootAdmin√\n- 9、链路跟踪 Skywalking   [参考文档](https://help.jeecg.com/java/springcloud/super/skywarking)\n- 10、消息中间件 RabbitMQ  √\n- 11、分布式任务 xxl-job  √ \n- 12、分布式事务 Seata\n- 13、轻量分布式日志 Loki+grafana套件\n- 14、支持 docker-compose、k8s、jenkins\n- 15、CAS 单点登录   √\n- 16、路由限流   √\n\n\n\n\n### 功能清单\n```\n├─AI应用平台\n│  ├─AI模型管理\n│  ├─AI应用管理\n│  ├─AI知识库\n│  ├─AI流程编排\n│  ├─AI聊天助手(支持图片、文件)\n│  ├─AI聊天助手支持嵌入第三方、支持移动端\n│  ├─MCP插件管理\n│  ├─提示词管理\n│  ├─支持各种常见模型ChatGPT和DeepSeek、ollama等\n├─AI应用门户\n│  ├─ Chat2BI 图表生成智能体\n│  ├─ AI绘图智能体\n│  ├─ 看图说话\n│  ├─ 图像识别\n│  ├─ 帮我写作\n├─工具箱\n│  ├─OCR识别\n│  ├─AI 海报\n│  ├─AI 写作\n│  ├─AI 简历\n├─AI辅助功能\n│  ├─AI建表（Online表单）\n│  ├─AI生成报表（Online报表）\n│  ├─AI生成大屏\n├─系统管理\n│  ├─用户管理\n│  ├─角色管理\n│  ├─菜单管理\n│  ├─首页配置\n│  ├─权限设置（支持按钮权限、数据权限）\n│  ├─表单权限（控制字段禁用、隐藏）\n│  ├─部门管理\n│  ├─我的部门（二级管理员）\n│  └─字典管理\n│  └─分类字典\n│  └─系统公告\n│  └─职务管理\n│  └─通讯录\n│  ├─多数据源管理\n│  ├─白名单管理\n│  ├─第三方配置（对接钉钉和企业微信）\n│  └─多租户管理（租户管理、租户角色、我的租户、租户默认套餐管理）\n├─Online在线开发(低代码)\n│  ├─Online在线表单\n│  ├─Online代码生成器\n│  ├─Online在线报表\n│  ├─仪表盘设计器\n│  ├─系统编码规则\n│  ├─系统校验规则\n│  ├─APP版本管理\n├─数据可视化\n│  ├─报表设计器(支持打印设计）\n│  ├─大屏设和仪表盘设计\n├─OpenAPI（基于AK和SK认证鉴权）\n│  ├─接口管理\n│  ├─接口授权\n│  ├─接口文档\n├─消息中心\n│  ├─消息管理\n│  ├─模板管理\n├─代码生成器(低代码)\n│  ├─代码生成器功能（一键生成前后端代码，生成后无需修改直接用，绝对是后端开发福音）\n│  ├─代码生成器模板（提供4套模板，分别支持单表和一对多模型，不同风格选择）\n│  ├─代码生成器模板（生成代码，自带excel导入导出）\n│  ├─查询过滤器（查询逻辑无需编码，系统根据页面配置自动生成）\n│  ├─高级查询器（弹窗自动组合查询条件）\n│  ├─Excel导入导出工具集成（支持单表，一对多 导入导出）\n│  ├─平台移动自适应支持\n│  ├─提供新版uniapp3的代码生成器模板\n├─系统监控\n│  ├─Gateway路由网关\n│  ├─基于AK和SK认证鉴权OpenAPI功能\n│  ├─定时任务\n│  ├─数据源管理\n│  ├─性能扫描监控\n│  │  ├─监控 Redis\n│  │  ├─Tomcat\n│  │  ├─jvm\n│  │  ├─服务器信息\n│  │  ├─请求追踪\n│  │  ├─磁盘监控\n│  ├─系统日志\n│  ├─消息中心（支持短信、邮件、微信推送等等）\n│  ├─数据日志（记录数据快照，可对比快照，查看数据变更情况）\n│  ├─SQL监控\n│  ├─在线用户\n│─报表示例\n│  ├─曲线图\n│  └─饼状图\n│  └─柱状图\n│  └─折线图\n│  └─面积图\n│  └─雷达图\n│  └─仪表图\n│  └─进度条\n│  └─排名列表\n│  └─等等\n│─大屏模板\n│  ├─作战指挥中心大屏\n│  └─物流服务中心大屏\n│─常用示例\n│  ├─自定义组件\n│  ├─对象存储(对接阿里云)\n│  ├─JVXETable示例（各种复杂ERP布局示例）\n│  ├─单表模型例子\n│  └─一对多模型例子\n│  └─打印例子\n│  └─一对多TAB例子\n│  └─内嵌table例子\n│  └─常用选择组件\n│  └─异步树table\n│  └─接口模拟测试\n│  └─表格合计示例\n│  └─异步树列表示例\n│  └─一对多JEditable\n│  └─JEditable组件示例\n│  └─图片拖拽排序\n│  └─图片翻页\n│  └─图片预览\n│  └─PDF预览\n│  └─分屏功能\n│─封装通用组件\t\n│  ├─行编辑表格JEditableTable\n│  └─省略显示组件\n│  └─时间控件\n│  └─高级查询\n│  └─用户选择组件\n│  └─报表组件封装\n│  └─字典组件\n│  └─下拉多选组件\n│  └─选人组件\n│  └─选部门组件\n│  └─通过部门选人组件\n│  └─封装曲线、柱状图、饼状图、折线图等等报表的组件（经过封装，使用简单）\n│  └─在线code编辑器\n│  └─上传文件组件\n│  └─验证码组件\n│  └─树列表组件\n│  └─表单禁用组件\n│  └─等等\n│─更多页面模板\n│  ├─各种高级表单\n│  ├─各种列表效果\n│  └─结果页面\n│  └─异常页面\n│  └─个人页面\n├─高级功能\n│  ├─提供单点登录CAS集成方案\n│  ├─提供APP发布方案\n│  ├─集成Websocket消息通知机制\n│  ├─支持electron桌面应用打包(支持windows、linux、macOS三大平台)\n│  ├─docker容器支持\n│  ├─提供移动APP框架及源码（Uniapp3版本）支持H5、小程序、APP、鸿蒙Next\n│  ├─提供移动APP低代码设计(Online表单、仪表盘)\n```\n\n\n\n### 系统效果\n\n\n##### AI模型与应用管理\n\n![](https://oscimg.oschina.net/oscnet/up-0b1779e923566ccebb2d5a9cc9220c78b4a.png)\n\n![](https://oscimg.oschina.net/oscnet/up-c8956df1d37d66b2d40136afaeca677628b.png)\n\n![](https://oscimg.oschina.net/oscnet/up-8c348eeafd89673ca8cd1a2705014e3ac04.png)\n\nAI流程编排\n\n![](https://oscimg.oschina.net/oscnet/up-2343657de2c7ac8010bc471470d084075ae.png)\n\nMCP和工具管理\n\n![](https://oscimg.oschina.net/oscnet/up-8119d5dbc72e534236a3d042e11534c52ad.png)\n\nAI知识库（支持各种文档格式，尤其markdown适配很好）\n\n![](https://oscimg.oschina.net/oscnet/up-e2e9c118982ea366ed7f2b9827d4bb46c5d.png)\n\nAI工具箱\n\n![](https://oscimg.oschina.net/oscnet/up-bf2a808d22a11fd83e577ad74741d97884b.png)\n\nAI聊天助手\n\n![](https://oscimg.oschina.net/oscnet/up-2a51accc2ff0b647e0ee058a58d291fe811.png)\n\n![](https://oscimg.oschina.net/oscnet/up-ea1069c2a92a3ab2963d88763016cb037c2.png)\n\n![](https://oscimg.oschina.net/oscnet//65298d5710b4e6039a5f802b5f8505c5.png)\n\n\nAI绘图\n\n![](https://oscimg.oschina.net/oscnet/up-a03658e8580be04d69821601de9dc5dc52d.png)\n\nAI写文章\n\n![](https://oscimg.oschina.net/oscnet/up-e3ee5b1fe497308805aa5e324b72994af79.png)\n\n\n\n##### PC端\n![](https://oscimg.oschina.net/oscnet/up-000530d95df337b43089ac77e562494f454.png)\n\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14155402_AmlV.png \"在这里输入图片标题\")\n\n![](https://oscimg.oschina.net/oscnet/up-9d6f36f251e71a0b515a01323474b03004c.png)\n\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14160813_KmXS.png \"在这里输入图片标题\")\n\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14160935_Nibs.png \"在这里输入图片标题\")\n\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14161004_bxQ4.png \"在这里输入图片标题\")\n\n#####  系统交互\n![](https://oscimg.oschina.net/oscnet/up-78b151fc888d4319377bf1cc311fe826871.png)\n\n![](https://oscimg.oschina.net/oscnet/up-16c07e000278329b69b228ae3189814b8e9.png)\n\n\n\n\n#####  仪表盘设计器\n\n![](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/darg20240726105556.png)\n\n![](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/drag20240724135626.png)\n\n![](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/drag20240724135619.png)\n\n![](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/drag20240724135630.png)\n\n![](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/drag20240726105547.png)\n\n![](https://oscimg.oschina.net/oscnet/up-fad98d42b2cf92f92a903c9cff7579f18ec.png)\n\n\n##### 报表设计器\n![](https://oscimg.oschina.net/oscnet/up-64648de000851f15f6c7b9573d107ebb5f8.png)\n\n![](https://oscimg.oschina.net/oscnet/up-fa52b44445db281c51d3f267dce7450d21b.gif)\n\n![](https://oscimg.oschina.net/oscnet/up-68a19149d640f1646c8ed89ed4375e3326c.png)\n\n![](https://oscimg.oschina.net/oscnet/up-f7e9cb2e3740f2d19ff63b40ec2dd554f96.png)\n\n\n##### 手机端\n![](https://oscimg.oschina.net/oscnet/da543c5d0d57baab0cecaa4670c8b68c521.jpg)\n![](https://oscimg.oschina.net/oscnet/fda4bd82cab9d682de1c1fbf2060bf14fa6.jpg)\n\n##### PAD端\n![](https://oscimg.oschina.net/oscnet/e90fef970a8c33790ab03ffd6c4c7cec225.jpg)\n![](https://oscimg.oschina.net/oscnet/d78218803a9e856a0aa82b45efc49849a0c.jpg)\n![](https://oscimg.oschina.net/oscnet/59c23b230f52384e588ee16309b44fa20de.jpg)\n\n\n##### 图表示例\n![](https://oscimg.oschina.net/oscnet/up-218bc6a1669496b241ebb23506440c0083e.png)\n\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14160834_Lo23.png \"在这里输入图片标题\")\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14160842_QK7B.png \"在这里输入图片标题\")\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14160849_GBm5.png \"在这里输入图片标题\")\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14160858_6RAM.png \"在这里输入图片标题\")\n\n##### 在线接口文档\n![输入图片说明](https://static.oschina.net/uploads/img/201908/27095258_M2Xq.png \"在这里输入图片标题\")\n![输入图片说明](https://static.oschina.net/uploads/img/201904/14160957_hN3X.png \"在这里输入图片标题\")\n\n\n##### UNIAPP效果\n\n![](https://oscimg.oschina.net/oscnet/up-aac943fbd26561879c57a41f7a406edf274.png)\n\n![](https://oscimg.oschina.net/oscnet/up-9a44ba2e82b09c750629d12fafd7f60f553.png)\n\n\n##### 大屏设计器\n![](https://oscimg.oschina.net/oscnet/up-402a6034124474bfef8dfc5b4b2bac1ce5c.png)\n\n![](https://oscimg.oschina.net/oscnet/up-6f7ba2e2ebbeea0d203db8d69fd87644c9f.png)\n\n![](https://oscimg.oschina.net/oscnet/up-ee8d34f318da466b8a6070a6e3111d12ce7.png)\n\n![](https://oscimg.oschina.net/oscnet/up-6b81781b43086819049c4421206810667c5.png)\n\n\n\n\n\n\n\n#### 微服务架构图\n![微服务架构图](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/jeecgboot_springcloud2022.png \"在这里输入图片标题\")\n\n\n\n### Jeecg Boot 产品功能蓝图\n![功能蓝图](https://jeecgos.oss-cn-beijing.aliyuncs.com/upload/test/Jeecg-Boot-lantu202005_1590912449914.jpg \"在这里输入图片标题\")\n\n\n\n####  系统功能架构图\n\n![](https://oscimg.oschina.net/oscnet/up-1569487b95a07dbc3599fb1349a2e3aaae1.png)\n\n\n\n## 捐赠 \n\n如果觉得还不错，请作者喝杯咖啡吧 ☺\n\n![](https://static.oschina.net/uploads/img/201903/08155608_0EFX.png)"
  },
  {
    "path": "check_jeecgenv.py",
    "content": "import os\nimport subprocess\nimport re\nimport sys\nfrom typing import Tuple, Optional\n\ndef run_command(cmd: str) -> Tuple[int, str]:\n    \"\"\"执行命令并返回退出码和输出\"\"\"\n    try:\n        result = subprocess.run(cmd, shell=True, check=False, \n                              stdout=subprocess.PIPE, stderr=subprocess.PIPE,\n                              text=True)\n        return result.returncode, result.stdout.strip()\n    except Exception as e:\n        return -1, str(e)\n\ndef check_java() -> bool:\n    \"\"\"检查JDK 17+是否安装\"\"\"\n    print(\"\\n检查JDK 17+...\")\n    rc, output = run_command(\"java -version 2>&1\")\n    if rc != 0:\n        print(\"❌ 未检测到Java，请安装JDK 17+\")\n        return False\n    \n    version_pattern = r'\"(\\d+)(?:\\.\\d+)*(?:_\\d+)?'\n    match = re.search(version_pattern, output)\n    if not match:\n        print(\"❌ 无法解析Java版本\")\n        return False\n    \n    version = int(match.group(1))\n    if version >= 17:\n        print(f\"✅ JDK版本 {version} (满足17+要求)\")\n        return True\n    else:\n        print(f\"❌ JDK版本 {version} (需要17+)\")\n        return False\n\ndef check_maven() -> bool:\n    \"\"\"检查Maven是否安装\"\"\"\n    print(\"\\n检查Maven...\")\n    rc, output = run_command(\"mvn -v\")\n    if rc == 0:\n        print(\"✅ Maven已安装\")\n        return True\n    else:\n        print(\"❌ Maven未安装\")\n        return False\n\ndef check_node() -> bool:\n    \"\"\"检查Node.js 20+是否安装\"\"\"\n    print(\"\\n检查Node.js 20+...\")\n    rc, output = run_command(\"node -v\")\n    if rc != 0:\n        print(\"❌ Node.js未安装\")\n        return False\n    \n    version_pattern = r'v(\\d+)\\.\\d+\\.\\d+'\n    match = re.search(version_pattern, output)\n    if not match:\n        print(\"❌ 无法解析Node.js版本\")\n        return False\n    \n    version = int(match.group(1))\n    if version >= 20:\n        print(f\"✅ Node.js版本 {version} (满足20+要求)\")\n        return True\n    else:\n        print(f\"❌ Node.js版本 {version} (需要20+)\")\n        return False\n\ndef check_pnpm() -> bool:\n    \"\"\"检查PNPM 9+是否安装\"\"\"\n    print(\"\\n检查PNPM 9+...\")\n    rc, output = run_command(\"pnpm -v\")\n    if rc != 0:\n        print(\"❌ PNPM未安装\")\n        return False\n    \n    try:\n        # 处理可能的版本号格式：v9.0.0 或 9.0.0 或 9\n        version_str = output.strip().lstrip('v').split('.')[0]\n        version = int(version_str)\n        \n        if version >= 9:\n            print(f\"✅ PNPM版本 {output.strip()} (满足9+要求)\")\n            return True\n        else:\n            print(f\"❌ PNPM版本 {output.strip()} (需要9+)\")\n            return False\n    except (ValueError, IndexError):\n        print(f\"❌ 无法解析PNPM版本: {output.strip()}\")\n        return False\n\ndef check_redis_connection() -> bool:\n    \"\"\"检查Redis连接\"\"\"\n    print(\"\\n检查Redis连接...\")\n    print(\"⚠️ 请确保已配置Redis连接信息并在jeecg-boot项目中正确配置\")\n    print(\"⚠️ 此检查需要根据实际项目配置进行验证\")\n    print(\"⚠️ 配置文件位置: jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml\")\n    return True\n\ndef check_mysql_connection() -> bool:\n    \"\"\"检查MySQL连接\"\"\"\n    print(\"\\n检查MySQL连接...\")\n    print(\"⚠️ 请确保已配置MySQL连接信息并在jeecg-boot项目中正确配置\")\n    print(\"⚠️ 此检查需要根据实际项目配置进行验证\")\n    print(\"⚠️ 配置文件位置: jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml\")\n    return True\n\ndef print_mysql_config():\n    \"\"\"打印MySQL配置并提示需要修改的位置\"\"\"\n    print(\"\\nMySQL配置参考 (请检查以下配置是否正确):\")\n    print(\"\"\"\nspring.datasource.dynamic.datasource:\n  master:\n    url: jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n    username: root       # ← 可能需要修改\n    password: root       # ← 可能需要修改\n    driver-class-name: com.mysql.cj.jdbc.Driver\n\"\"\")\n\ndef check_ai_vector_db() -> bool:\n    \"\"\"检查AI向量库(pgvector)配置\"\"\"\n    print(\"\\n检查AI知识库向量库配置...\")\n    print(\"⚠️ 如果需要使用AI知识库功能，请配置pgvector向量库\")\n    print(\"⚠️ 配置文件位置: jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml\")\n    print(\"\\n配置参考:\")\n    print(\"\"\"\njeecg.ai-rag:\n    embed-store:\n      host: 127.0.0.1       # ← 可能需要修改\n      port: 5432            # ← 可能需要修改\n      database: postgres    # ← 可能需要修改\n      user: postgres        # ← 可能需要修改\n      password: postgres    # ← 可能需要修改\n      table: embeddings     # ← 可能需要修改\n\"\"\")\n    print(\"⚠️ 注意: 请确保已安装PostgreSQL并添加pgvector扩展！docker安装参考：https://help.jeecg.com/aigc/config\")\n    return True\n\ndef check_ai_config() -> bool:\n    \"\"\"检查AI账号配置\"\"\"\n    print(\"\\n检查AI功能配置...\")\n    print(\"⚠️ 如果需要使用AI聊天功能，请配置AI账号信息\")\n    print(\"⚠️ 配置文件位置: jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml\")\n    print(\"\\n配置参考:\")\n    print(\"\"\"\njeecg:\n  # AI集成\n  ai-chat:\n    enabled: true           # ← 启用AI功能\n    model: deepseek-chat    # ← 模型名称\n    apiKey: ??              # ← 必须修改为您的API Key\n    apiHost: https://api.deepseek.com/v1  # ← API地址\n    timeout: 60             # ← 超时时间(秒)\n\"\"\")\n    print(\"⚠️ 注意: 请确保已获取有效的API Key并正确配置！AI账号注册获取参考： https://help.jeecg.com/java/deepSeekSupport\")\n    return True\n\n\ndef print_redis_config():\n    \"\"\"打印Redis配置并提示需要修改的位置\"\"\"\n    print(\"\\nRedis配置参考 (请检查以下配置是否正确):\")\n    print(\"\"\"\nspring.redis:\n  database: 0\n  host: 127.0.0.1        # ← 可能需要修改\n  port: 6379             # ← 可能需要修改\n  password: ''           # ← 如果需要密码请修改\n\"\"\")\n\ndef main():\n    print(\"=\"*50)\n    print(\"JeecgBoot 运行环境检查脚本\")\n    print(\"=\"*50)\n    \n    all_checks_passed = True\n    \n    # 检查各项依赖\n    if not check_java():\n        all_checks_passed = False\n    \n    if not check_maven():\n        all_checks_passed = False\n    \n    if not check_node():\n        all_checks_passed = False\n    \n    if not check_pnpm():\n        all_checks_passed = False\n    \n    # 数据库提示\n    print(\"=\"*50)\n    check_redis_connection()\n    print_redis_config()\n    print(\"=\"*50)\n    check_mysql_connection()\n    print_mysql_config()\n    print(\"=\"*50)\n    check_ai_config()\n    print(\"=\"*50)\n    check_ai_vector_db()\n    \n    print(\"\\n\" + \"=\"*50)\n    if all_checks_passed:\n        print(\"✅ 所有基础环境检查通过\")\n        print(\"⚠️ 注意: 请确保Redis和MySQL、AI账号、向量库pgvector 已正确配置并连接成功\")\n    else:\n        print(\"❌ 部分环境检查未通过，请根据上述提示解决问题\")\n    \n    print(\"=\"*50)\n\nif __name__ == \"__main__\":\n    main()\n    input(\"\\n按回车键退出...\")  # 等待用户输入"
  },
  {
    "path": "docker-compose-cloud.yml",
    "content": "version: '2'\nservices:\n  jeecg-boot-mysql:\n    build:\n      context: ./jeecg-boot/db\n    environment:\n      MYSQL_ROOT_PASSWORD: root\n      MYSQL_ROOT_HOST: '%'\n      TZ: Asia/Shanghai\n    restart: always\n    container_name: jeecg-boot-mysql\n    image: jeecg-boot-mysql\n    command:\n      --character-set-server=utf8mb4\n      --collation-server=utf8mb4_general_ci\n      --explicit_defaults_for_timestamp=true\n      --lower_case_table_names=1\n      --max_allowed_packet=128M\n      --default-authentication-plugin=caching_sha2_password\n    ports:\n      - 13306:3306\n    networks:\n      - jeecg-boot\n\n  jeecg-boot-redis:\n    image: registry.cn-hangzhou.aliyuncs.com/jeecgdocker/redis:5.0\n#    ports:\n#      - 6379:6379\n    restart: always\n    hostname: jeecg-boot-redis\n    container_name: jeecg-boot-redis\n    networks:\n      - jeecg-boot\n\n  jeecg-boot-pgvector:\n    image: registry.cn-hangzhou.aliyuncs.com/jeecgdocker/pgvector\n    container_name: jeecg-boot-pgvector\n    environment:\n      POSTGRES_USER: postgres\n      POSTGRES_PASSWORD: postgres\n      POSTGRES_DB: vector_db\n    ports:\n      - 5432:5432\n    restart: always\n    networks:\n      - jeecg-boot\n      \n  jeecg-boot-nacos:\n    restart: always\n    build:\n      context: ./jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos\n    ports:\n      - 8848:8848\n    container_name: jeecg-boot-nacos\n    depends_on:\n      - jeecg-boot-mysql\n    hostname: jeecg-boot-nacos\n    networks:\n      - jeecg-boot\n\n  jeecg-boot-system:\n    depends_on:\n      - jeecg-boot-nacos\n    build:\n      context: ./jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start\n    container_name: jeecg-system-start\n    hostname: jeecg-boot-system\n    restart: on-failure\n    environment:\n      - TZ=Asia/Shanghai\n    networks:\n      - jeecg-boot\n\n  jeecg-boot-demo:\n    depends_on:\n      - jeecg-boot-nacos\n    build:\n      context: ./jeecg-boot/jeecg-server-cloud/jeecg-demo-cloud-start\n    container_name: jeecg-demo-start\n    hostname: jeecg-boot-demo\n    restart: on-failure\n    environment:\n      - TZ=Asia/Shanghai\n    networks:\n      - jeecg-boot\n\n  jeecg-boot-gateway:\n    restart: on-failure\n    build:\n      context: ./jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway\n    ports:\n      - 9999:9999\n    depends_on:\n      - jeecg-boot-nacos\n      - jeecg-boot-system\n    container_name: jeecg-boot-gateway\n    hostname: jeecg-boot-gateway\n    networks:\n      - jeecg-boot\n\n#  jeecg-boot-rabbitmq:\n#    image: rabbitmq:3.7.7-management\n#    ports:\n#      - 5672:5672\n#      - 15672:15672\n#    restart: always\n#    container_name: jeecg-boot-rabbitmq\n#    hostname: jeecg-boot-rabbitmq\n#    environment:\n#      RABBITMQ_DEFAULT_USER: guest\n#      RABBITMQ_DEFAULT_PASS: guest\n\n  jeecg-boot-sentinel:\n     restart: on-failure\n     build:\n       context: ./jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel\n     ports:\n       - 9000:9000\n     depends_on:\n       - jeecg-boot-nacos\n       - jeecg-boot-demo\n       - jeecg-boot-system\n       - jeecg-boot-gateway\n     container_name: jeecg-boot-sentinel\n     hostname: jeecg-boot-sentinel\n     networks:\n       - jeecg-boot\n\n  jeecg-boot-xxljob:\n     build:\n       context: ./jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob\n     ports:\n       - 9080:9080\n     container_name: jeecg-boot-xxljob\n     hostname: jeecg-boot-xxljob\n     networks:\n       - jeecg-boot\n       \n  jeecg-vue:\n    build:\n      context: ./jeecgboot-vue3\n      dockerfile: Dockerfile.cloud\n    container_name: jeecgboot-vue3-nginx\n    image: jeecgboot-vue3\n    depends_on:\n      - jeecg-boot-system\n    networks:\n      - jeecg-boot\n    ports:\n      - 80:80\n\nnetworks:\n  jeecg-boot:\n    name: jeecg_boot\n"
  },
  {
    "path": "docker-compose.yml",
    "content": "version: '2'\nservices:\n  jeecg-boot-mysql:\n    build:\n      context: ./jeecg-boot/db\n    environment:\n      MYSQL_ROOT_PASSWORD: root\n      MYSQL_ROOT_HOST: '%'\n      TZ: Asia/Shanghai\n    restart: always\n    container_name: jeecg-boot-mysql\n    image: jeecg-boot-mysql\n    command:\n      --character-set-server=utf8mb4\n      --collation-server=utf8mb4_general_ci\n      --explicit_defaults_for_timestamp=true\n      --lower_case_table_names=1\n      --max_allowed_packet=128M\n      --default-authentication-plugin=caching_sha2_password\n    ports:\n      - 13306:3306\n    networks:\n      - jeecg-boot\n\n  jeecg-boot-redis:\n    image: registry.cn-hangzhou.aliyuncs.com/jeecgdocker/redis:5.0\n    # ports:\n    #   - 3792:6379\n    restart: always\n    hostname: jeecg-boot-redis\n    container_name: jeecg-boot-redis\n    networks:\n      - jeecg-boot\n\n  jeecg-boot-pgvector:\n    image: registry.cn-hangzhou.aliyuncs.com/jeecgdocker/pgvector\n    container_name: jeecg-boot-pgvector\n    environment:\n      POSTGRES_USER: postgres\n      POSTGRES_PASSWORD: postgres\n      POSTGRES_DB: vector_db\n    ports:\n      - 5432:5432\n    restart: always\n    networks:\n      - jeecg-boot\n      \n  jeecg-boot-system:\n    build:\n      context: ./jeecg-boot/jeecg-module-system/jeecg-system-start\n    restart: on-failure\n    depends_on:\n      - jeecg-boot-mysql\n      - jeecg-boot-redis\n    container_name: jeecg-boot-system\n    image: jeecg-boot-system\n    hostname: jeecg-boot-system\n    ports:\n      - 8080:8080\n    networks:\n      - jeecg-boot\n  jeecg-vue:\n    build:\n      context: ./jeecgboot-vue3\n    container_name: jeecgboot-vue3-nginx\n    image: jeecgboot-vue3\n    depends_on:\n      - jeecg-boot-system\n    networks:\n      - jeecg-boot\n    ports:\n      - 80:80\n\nnetworks:\n  jeecg-boot:\n    name: jeecg_boot\n"
  },
  {
    "path": "jeecg-boot/.gitignore",
    "content": "## ide\n**/.idea\n*.iml\nrebel.xml\n\n## backend\n**/target\n**/logs\n\n## front\n**/*.lock\nos_del.cmd\nos_del_doc.cmd\n.svn\nderby.log\n"
  },
  {
    "path": "jeecg-boot/LICENSE",
    "content": "    Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright (c) 2019 <a href=\"http://www.jeecg.com\">Jeecg Boot</a> All rights reserved.\n \n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n   \n   In any case, you must not make any such use of this software as to develop software which may be considered competitive with this software.\n   \n   JeecgBoot 是由 北京国炬信息技术有限公司 发行的软件。 总部位于北京，地址：中国·北京·朝阳区科荟前街1号院奥林佳泰大厦。邮箱：jeecgos@163.com\n   本软件受适用的国家软件著作权法（包括国际条约）和开源协议 双重保护许可。\n   \n   开源协议中文释意如下：\n   1.JeecgBoot开源版本无任何限制，在遵循本开源协议条款下，允许商用使用，不会造成侵权行为。\n   2.允许基于本平台软件开展业务系统开发。\n   3.在任何情况下，您不得使用本软件开发可能被认为与本软件竞争的软件。\n   \n   最终解释权归：http://www.jeecg.com"
  },
  {
    "path": "jeecg-boot/README.md",
    "content": "JeecgBoot 低代码开发平台\n===============\n\n当前最新版本： 3.9.1（发布日期： 2026-01-22） \n\n\n[![AUR](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE)\n[![](https://img.shields.io/badge/Author-北京国炬软件-orange.svg)](http://jeecg.com/aboutusIndex)\n[![](https://img.shields.io/badge/version-3.9.1-brightgreen.svg)](https://github.com/zhangdaiscott/jeecg-boot)\n[![GitHub stars](https://img.shields.io/github/stars/zhangdaiscott/jeecg-boot.svg?style=social&label=Stars)](https://github.com/zhangdaiscott/jeecg-boot)\n[![GitHub forks](https://img.shields.io/github/forks/zhangdaiscott/jeecg-boot.svg?style=social&label=Fork)](https://github.com/zhangdaiscott/jeecg-boot)\n\n\n\n项目介绍\n-----------------------------------\n\n<h3 align=\"center\">企业级AI低代码平台</h3>\n\nJeecgBoot 是一款基于BPM流程和代码生成的AI低代码平台，助力企业快速实现低代码开发和构建AI应用。\n采用前后端分离架构（Ant Design&Vue3，SpringBoot3，SpringCloud Alibaba，Mybatis-plus），强大代码生成器实现前后端一键生成，无需手写代码。\n平台引领AI低代码开发模式：AI生成→在线编码→代码生成→手工合并，解决Java项目80%重复工作，提升效率，节省成本，兼顾灵活性。\n具备强大且颗粒化的权限控制，支持按钮权限和数据权限设置，满足大型业务系统需求。功能涵盖在线表单、表单设计、流程设计、门户设计、报表与大屏设计、OA办公、AI应用、AI知识库、大模型管理、AI流程编排、AI聊天，支持ChatGPT、DeepSeek、Ollama等多种AI大模型。\n\n`AI赋能报表:` 积木报表是一款自主研发的强大开源企业级Web报表与大屏工具。它通过零编码的拖拽式操作，赋能用户如同搭积木般轻松构建各类复杂报表和数据大屏，全面满足企业数据可视化与分析需求，助力企业级数据产品的高效打造与应用。\n\n`AI赋能低代码:` 提供完善成熟的AI应用平台，涵盖AI应用管理、AI模型管理、智能对话助手、知识库问答、流程编排与设计器、AI建表等多项功能。平台兼容多种主流大模型，包括ChatGPT、DeepSeek、Ollama、智普、千问等，助力企业高效构建智能化应用，推动低代码开发与AI深度融合。\n\n`AI驱动开发:` 全新推出AI驱动开发能力，支持一句话生成完整系统，提供零代码模式（一句话搭建系统，无需编写代码）和代码生成模式（基于 jeecg-codegen，自动生成完整代码和建表SQL）两种选择。同时支持一句话自动绘制流程图、设计表单，省去手工绘制繁琐步骤。[B站视频演示](https://www.bilibili.com/video/BV1KKwTzJEbX/) | [技能对比与使用说明](https://help.jeecg.com/java/ai/skills/skill-comparison/)\n\n`JEECG宗旨是:` JEECG旨在通过OnlineCoding平台实现简单功能的零代码快速搭建，同时针对复杂功能采用代码生成器生成代码并手工合并，打造智能且灵活的低代码开发模式，有效解决了当前低代码产品普遍缺乏灵活性的问题，提升开发效率的同时兼顾系统的扩展性和定制化能力。\n\n`JEECG业务流程:` JEECG业务流程采用BPM工作流引擎实现业务审批，扩展任务接口供开发人员编写业务逻辑，表单提供表单设计器、在线配置表单和编码表单等多种解决方案。通过流程与表单的分离设计（松耦合）及任务节点的灵活配置，既保障了企业流程的安全性与保密性，又大幅降低了开发人员的工作量。\n\nAI 重磅能力\n-----------------------------------\n\nJeecgBoot 全新推出 AI 驱动开发能力，**支持一句话生成完整系统**，极大简化开发流程。\n\n**两种模式，灵活选择：**\n\n| 模式 | 说明 |\n|------|------|\n| 零代码模式 | 一句话即可搭建系统，无需编写任何代码 |\n| 代码生成模式 | 基于 jeecg-codegen，自动生成完整代码和建表 SQL |\n\n**更多 AI 能力：**\n- 支持一句话自动绘制流程图，省去手工绘制繁琐步骤\n- 支持一句话自动设计表单，快速完成表单搭建\n\n**视频演示：** [B站观看视频](https://www.bilibili.com/video/BV1KKwTzJEbX/)\n\n**官方文档：** [技能对比与使用说明](https://help.jeecg.com/java/ai/skills/skill-comparison/)\n\n\nAI Skills 技能清单\n-----------------------------------\n\n结合 Claude Code 的 AI Skills 技能，JeecgBoot 实现了**自然语言驱动的低代码开发**，一句话即可完成从需求到代码/配置的全流程自动化。[详细文档](https://help.jeecg.com/java/ai/skills/skill-comparison/) | [Skills 下载](https://github.com/jeecgboot/skills)\n\n| Skill | 技能 | 功能介绍 | 是否需要写代码 |\n|-------|------|----------|---------------|\n| `jeecg-codegen` | AI一句话生成全套代码 | 自然语言需求自动转换为 JeecgBoot 全套 CRUD 代码，包括后端 Java 代码 + 前端 Vue3 代码 + 建表 SQL + 菜单权限 SQL，支持无表生成，甚至生成一套系统全代码 | 否（AI 自动生成源码） |\n| `jeecg-onlform` | AI一句话创建 Online 表单 | 自然语言需求自动转换为 JeecgBoot Online 表单，完成从表单配置 → 同步数据库 → 生成菜单 SQL 的全流程自动化 | 否 |\n| `jeecg-onlreport` | AI一句话创建 Online 报表 | 将自然语言需求自动转换为 JeecgBoot Online 报表，完成从 SQL 编写 → 字段解析 → 报表配置 → 创建报表的全流程自动化 | 否 |\n| `jeecg-desform` | AI一句话画表单 | 自然语言的表单需求描述自动转换为 JeecgBoot 的设计器表单，完成从需求解析 → JSON 生成 → API 创建的全流程自动化，甚至可以创建一套系统 | 否 |\n| `jeecg-bpmn` | AI一句话画流程 | 将自然语言的审批流程描述自动转换为 Flowable BPMN 2.0 XML，并通过 API 在 JeecgBoot 系统中自动创建流程 | 否 |\n\n\n\n适用项目\n-----------------------------------\nJeecgBoot低代码平台兼容所有J2EE项目开发，支持信创国产化，特别适用于SAAS、企业信息管理系统（MIS）、内部办公系统（OA）、企业资源计划系统（ERP）、客户关系管理系统（CRM）及AI知识库等场景。其半智能手工Merge开发模式，可显著提升70%以上的开发效率，极大降低开发成本。同时，JeecgBoot还是一款全栈式AI开发平台，助力企业快速构建和部署个性化AI应用。。\n\n\n**信创兼容说明**\n- 操作系统：国产麒麟、银河麒麟等国产系统几乎都是基于 Linux 内核，因此它们具有良好的兼容性。\n- 数据库：达梦、人大金仓、TiDB\n- 中间件：东方通 TongWeb、TongRDS，宝兰德 AppServer、CacheDB, [信创配置文档](https://help.jeecg.com/java/tongweb-deploy/)\n\n\n\n\n#### 项目说明\n\n| 项目名              | 说明                                                                 | \n|------------------|--------------------------------------------------------------------|\n| `jeecg-boot`     | 后端源码JAVA（SpringBoot3微服务架构）                                         |\n| `jeecgboot-vue3` | 前端源码VUE3（vue3+vite6+antd4+ts最新技术栈）                                 |\n\n\n\n启动项目\n-----------------------------------\n\n> 默认账号密码： admin/123456\n\n- [开发环境搭建](https://help.jeecg.com/java/setup/tools)\n- [IDEA启动前后端(单体模式)](https://help.jeecg.com/java/setup/idea/startup)\n- [Docker一键启动(单体模式)](https://help.jeecg.com/java/docker/quick)\n- [IDEA启动前后端(微服务方式)](https://help.jeecg.com/java/springcloud/switchcloud/monomer)\n- [Docker一键启动(微服务方式)](https://help.jeecg.com/java/docker/quickcloud)\n\n\n技术文档\n-----------------------------------\n\n- 官方网站：  [http://www.jeecg.com](http://www.jeecg.com)\n- 在线演示：  [平台演示](https://boot3.jeecg.com) | [APP演示](https://jeecg.com/appIndex)\n- 入门指南：  [快速入门](http://www.jeecg.com/doc/quickstart)  | [代码生成使用](https://help.jeecg.com/java/codegen/online) | [开发文档](https://help.jeecg.com)  | [AI应用手册](https://help.jeecg.com/aigc) | [视频教程](http://jeecg.com/doc/video)\n- 技术支持：  [反馈问题](https://github.com/jeecgboot/JeecgBoot/issues/new?template=bug_report.md)    | [低代码体验一分钟](https://jeecg.blog.csdn.net/article/details/106079007)\n- QQ交流群 ： 964611995、⑩716488839(满)、⑨808791225(满)、其他(满)\n\n\nAI 应用平台介绍\n-----------------------------------\n\n一个全栈式 AI 开发平台，旨在帮助开发者快速构建和部署个性化的 AI 应用。\n\nJeecgBoot平台提供了一套完善的AI应用管理系统模块，是一套类似`Dify`的`AIGC应用开发平台`+`知识库问答`，是一款基于LLM大语言模型AI应用平台和 RAG 的知识库问答系统。\n其直观的界面结合了 AI 流程编排、RAG 管道、知识库管理、模型管理、对接向量库、实时运行可观察等，让您可以快速从原型到生产，拥有AI服务能力。\n\n- [详细专题介绍，请点击查看](README-AI.md)\n\n- AI视频介绍\n\n[![](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/jeecg_aivideo.png)](https://www.bilibili.com/video/BV1zmd7YFE4w)\n\n\n为什么选择JeecgBoot?\n-----------------------------------\n- 1.采用最新主流前后分离框架（Spring Boot3 + MyBatis + Shiro/SpringAuthorizationServer + Ant Design4 + Vue3），容易上手；代码生成器依赖性低，灵活的扩展能力，可快速实现二次开发。\n- 2.前端大版本换代，最新版采用 Vue3.0 + TypeScript + Vite6 + Ant Design Vue4 等新技术方案。\n- 3.支持微服务Spring Cloud Alibaba（Nacos、Gateway、Sentinel、Skywalking），提供简易机制，支持单体和微服务自由切换（这样可以满足各类项目需求）。\n- 4.开发效率高，支持在线建表和AI建表，提供强大代码生成器，单表、树列表、一对多、一对一等数据模型，增删改查功能一键生成，菜单配置直接使用。\n- 5.代码生成器提供强大模板机制，支持自定义模板，目前提供四套风格模板（单表两套、树模型一套、一对多三套）。\n- 6.提供强大的报表和大屏可视化工具，支持丰富的数据源连接，能够通过拖拉拽方式快速制作报表、大屏和门户设计；支持多种图表类型：柱形图、折线图、散点图、饼图、环形图、面积图、漏斗图、进度图、仪表盘、雷达图、地图等。\n- 7.低代码能力：在线表单（无需编码，通过在线配置表单，实现表单的增删改查，支持单表、树、一对多、一对一等模型，实现人人皆可编码），在线配置零代码开发、所见即所得支持23种类控件。\n- 8.低代码能力：在线报表、在线图表（无需编码，通过在线配置方式，实现数据报表和图形报表，可以快速抽取数据，减轻开发压力，实现人人皆可编码）。\n- 9.Online支持在线增强开发，提供在线代码编辑器，支持代码高亮、代码提示等功能，支持多种语言（Java、SQL、JavaScript等）。\n- 10.封装完善的用户、角色、菜单、组织机构、数据字典、在线定时任务等基础功能，支持访问授权、按钮权限、数据权限等功能。\n- 11.前端UI提供丰富的组件库，支持各种常用组件，如表格、树形控件、下拉框、日期选择器等，满足各种复杂的业务需求 [UI组件库文档](https://help.jeecg.com/category/ui%E7%BB%84%E4%BB%B6%E5%BA%93)。\n- 12.提供APP配套框架，一份多代码多终端适配，一份代码多终端适配，小程序、H5、安卓、iOS、鸿蒙Next。\n- 13.新版APP框架采用Uniapp、Vue3.0、Vite、Wot-design-uni、TypeScript等最新技术栈，包括二次封装组件、路由拦截、请求拦截等功能。实现了与JeecgBoot完美对接：目前已经实现登录、用户信息、通讯录、公告、移动首页、九宫格、聊天、Online表单、仪表盘等功能，提供了丰富的组件。\n- 14.提供了一套成熟的AI应用平台功能，从AI模型、知识库到AI应用搭建，助力企业快速落地AI服务，加速智能化升级。\n- 15.AI能力：目前JeecgBoot支持AI大模型chatgpt和deepseek，现在最新版默认使用deepseek，速度更快质量更高。目前提供了AI对话助手、AI知识库、AI应用、AI建表、AI报表等功能。\n- 16.提供新行编辑表格JVXETable，轻松满足各种复杂ERP布局，拥有更高的性能、更灵活的扩展、更强大的功能。\n- 17.平台首页风格，提供多种组合模式，支持自定义风格；支持门户设计，支持自定义首页。\n- 18.常用共通封装，各种工具类（定时任务、短信接口、邮件发送、Excel导入导出等），基本满足80%项目需求。\n- 19.简易Excel导入导出，支持单表导出和一对多表模式导出，生成的代码自带导入导出功能。\n- 20.集成智能报表工具，报表打印、图像报表和数据导出非常方便，可极其方便地生成PDF、Excel、Word等报表。\n- 21.采用前后分离技术，页面UI风格精美，针对常用组件做了封装：时间、行表格控件、截取显示控件、报表组件、编辑器等。\n- 22.查询过滤器：查询功能自动生成，后台动态拼SQL追加查询条件；支持多种匹配方式（全匹配/模糊查询/包含查询/不匹配查询）。\n- 23.数据权限（精细化数据权限控制，控制到行级、列表级、表单字段级，实现不同人看不同数据，不同人对同一个页面操作不同字段）。\n- 24.接口安全机制，可细化控制接口授权，非常简便实现不同客户端只看自己数据等控制；也提供了基于AK和SK认证鉴权的OpenAPI功能。\n- 25.活跃的社区支持；近年来，随着网络威胁的日益增加，团队在安全和漏洞管理方面积累了丰富的经验，能够为企业提供全面的安全解决方案。\n- 26.权限控制采用RBAC（Role-Based Access Control，基于角色的访问控制）。\n- 27.页面校验自动生成（必须输入、数字校验、金额校验、时间空间等）。\n- 28.支持SaaS服务模式，提供SaaS多租户架构方案。\n- 29.分布式文件服务，集成MinIO、阿里OSS等优秀的第三方，提供便捷的文件上传与管理，同时也支持本地存储。\n- 30.主流数据库兼容，一套代码完全兼容MySQL、PostgreSQL、Oracle、SQL Server、MariaDB、达梦、人大金仓等主流数据库。\n- 31.集成工作流Flowable，并实现了只需在页面配置流程转向，可极大简化BPM工作流的开发；用BPM的流程设计器画出了流程走向，一个工作流基本就完成了，只需写很少量的Java代码。\n- 32.低代码能力：在线流程设计，采用开源Flowable流程引擎，实现在线画流程、自定义表单、表单挂靠、业务流转。\n- 33.多数据源：极其简易的使用方式，在线配置数据源配置，便捷地从其他数据抓取数据。\n- 34.提供单点登录CAS集成方案，项目中已经提供完善的对接代码。\n- 35.低代码能力：表单设计器，支持用户自定义表单布局，支持单表、一对多表单，支持select、radio、checkbox、textarea、date、popup、列表、宏等控件。\n- 36.专业接口对接机制，统一采用RESTful接口方式，集成Swagger-UI在线接口文档，JWT token安全验证，方便客户端对接。\n- 37.高级组合查询功能，在线配置支持主子表关联查询，可保存查询历史。\n- 38.提供各种系统监控，实时跟踪系统运行情况（监控Redis、Tomcat、JVM、服务器信息、请求追踪、SQL监控）。\n- 39.消息中心（支持短信、邮件、微信推送等）；集成WebSocket消息通知机制。\n- 40.支持多语言，提供国际化方案。\n- 41.数据变更记录日志，可记录数据每次变更内容，通过版本对比功能查看历史变化。\n- 42.提供简单易用的打印插件，支持谷歌、火狐、IE11+等各种浏览器。\n- 43.后端采用Maven分模块开发方式；前端支持菜单动态路由。\n- 44.提供丰富的示例代码，涵盖了常用的业务场景，便于学习和参考。\n\n\n技术架构：\n-----------------------------------\n\n#### 后端\n\n- IDE建议： IDEA (必须安装lombok插件 )\n- 语言：Java 默认jdk17(jdk21、jdk24)\n- 依赖管理：Maven\n- 基础框架：Spring Boot 3.5.5\n- 微服务框架： Spring Cloud Alibaba 2023.0.3.3\n- 持久层框架：MybatisPlus 3.5.12\n- 报表工具： JimuReport 2.1.3\n- 安全框架：Apache Shiro 2.0.4，Jwt 4.5.0\n- 微服务技术栈：Spring Cloud Alibaba、Nacos、Gateway、Sentinel、Skywalking\n- 数据库连接池：阿里巴巴Druid 1.2.24\n- AI大模型：支持 `ChatGPT` `DeepSeek` `千问`等各种常规模式\n- 日志打印：logback\n- 缓存：Redis\n- 其他：autopoi, fastjson，poi，Swagger-ui，quartz, lombok（简化代码）等。\n- 默认提供MySQL5.7+数据库脚本\n- [其他数据库，需要自己转](https://my.oschina.net/jeecg/blog/4905722)\n\n\n#### 前端\n\n- 前端环境要求：Node.js要求`Node 20+` 版本以上、pnpm 要求`9+` 版本以上\n  ` ( Vite 不再支持已结束生命周期（EOL）的 Node.js 18。现在需要使用 Node.js 20.19+ 或 22.12+)`\n\n- 依赖管理：node、npm、pnpm\n- 前端IDE建议：IDEA、WebStorm、Vscode\n- 采用 Vue3.0+TypeScript+Vite6+Ant-Design-Vue4等新技术方案，包括二次封装组件、utils、hooks、动态菜单、权限校验、按钮级别权限控制等功能\n- 最新技术栈：Vue3.0 + TypeScript + Vite6 + ant-design-vue4 + pinia + echarts + unocss + vxe-table + qiankun + es6\n\n\n\n\n#### 支持库\n\n|  数据库   |  支持   |\n| --- | --- |\n|   MySQL   |  √   |\n|  Oracle11g   |  √   |\n|  Sqlserver2017   |  √   |\n|   PostgreSQL   |  √   |\n|   MariaDB   |  √   |\n|   达梦   |  √   |\n|   人大金仓   |  √   |\n|   TiDB   |  √   |\n\n\n\n \n## 微服务解决方案\n\n\n- 1、服务注册和发现 Nacos √\n- 2、统一配置中心 Nacos  √\n- 3、路由网关 gateway(三种加载方式) √\n- 4、分布式 http feign √\n- 5、熔断降级限流 Sentinel √\n- 6、分布式文件 Minio、阿里OSS √ \n- 7、统一权限控制 JWT + Shiro √\n- 8、服务监控 SpringBootAdmin√\n- 9、链路跟踪 Skywalking   [参考文档](https://help.jeecg.com/java/springcloud/super/skywarking)\n- 10、消息中间件 RabbitMQ  √\n- 11、分布式任务 xxl-job  √ \n- 12、分布式事务 Seata\n- 13、轻量分布式日志 Loki+grafana套件\n- 14、支持 docker-compose、k8s、jenkins\n- 15、CAS 单点登录   √\n- 16、路由限流   √\n\n\n\n后台目录结构\n-----------------------------------\n```\n项目结构\n├─jeecg-boot-parent（父POM： 项目依赖、modules组织）\n│  ├─jeecg-boot-base-core（共通模块： 工具类、config、权限、查询过滤器、注解等）\n│  ├─jeecg-module-demo    示例代码\n│  ├─jeecg-module-system  System系统管理目录\n│  │  ├─jeecg-system-biz    System系统管理权限等功能\n│  │  ├─jeecg-system-start  System单体启动项目(8080）\n│  │  ├─jeecg-system-api    System系统管理模块对外api\n│  │  │  ├─jeecg-system-cloud-api   System模块对外提供的微服务接口\n│  │  │  ├─jeecg-system-local-api   System模块对外提供的单体接口\n│  ├─jeecg-server-cloud           --微服务模块\n     ├─jeecg-cloud-gateway       --微服务网关模块(9999)\n     ├─jeecg-cloud-nacos       --Nacos服务模块(8848)\n     ├─jeecg-system-cloud-start  --System微服务启动项目(7001)\n     ├─jeecg-demo-cloud-start    --Demo微服务启动项目(7002)\n     ├─jeecg-visual\n        ├─jeecg-cloud-monitor       --微服务监控模块 (9111)\n        ├─jeecg-cloud-xxljob        --微服务xxljob定时任务服务端 (9080)\n        ├─jeecg-cloud-sentinel     --sentinel服务端 (9000)\n        ├─jeecg-cloud-test           -- 微服务测试示例（各种例子）\n           ├─jeecg-cloud-test-more         -- 微服务测试示例（feign、熔断降级、xxljob、分布式锁）\n           ├─jeecg-cloud-test-rabbitmq     -- 微服务测试示例（rabbitmq）\n           ├─jeecg-cloud-test-seata          -- 微服务测试示例（seata分布式事务）\n           ├─jeecg-cloud-test-shardingsphere    -- 微服务测试示例（分库分表）\n```\n\n\n\n\n#### 微服务架构图\n![微服务架构图](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/jeecgboot_springcloud2022.png \"在这里输入图片标题\")\n\n\n\n\n\n"
  },
  {
    "path": "jeecg-boot/db/Dockerfile",
    "content": "FROM registry.cn-hangzhou.aliyuncs.com/jeecgdocker/mysql:8.0.19\n\nMAINTAINER jeecgos@163.com\n\nENV TZ=Asia/Shanghai\n\nRUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone\n\nCOPY ./tables_nacos.sql /docker-entrypoint-initdb.d\n\nCOPY ./jeecgboot-mysql-5.7.sql /docker-entrypoint-initdb.d\n\nCOPY ./tables_xxl_job.sql /docker-entrypoint-initdb.d"
  },
  {
    "path": "jeecg-boot/db/jeecgboot-mysql-5.7.sql",
    "content": "CREATE database if NOT EXISTS `jeecg-boot` default character set utf8mb4 collate utf8mb4_unicode_ci;\nUSE `jeecg-boot`;\n\n/*\n Navicat Premium Data Transfer\n\n Source Server         : mysql5.7\n Source Server Type    : MySQL\n Source Server Version : 50738 (5.7.38)\n Source Host           : 127.0.0.1:3306\n Source Schema         : jeecg-boot\n\n Target Server Type    : MySQL\n Target Server Version : 50738 (5.7.38)\n File Encoding         : 65001\n\n Date: 28/01/2026 15:21:15\n*/\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- Table structure for aigc_word_template\n-- ----------------------------\nDROP TABLE IF EXISTS `aigc_word_template`;\nCREATE TABLE `aigc_word_template`  (\n  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `sys_org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '所属部门',\n  `name` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '模版名称',\n  `code` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '模版编码',\n  `header` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL COMMENT '页眉',\n  `footer` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL COMMENT '页脚',\n  `main` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL COMMENT '主体内容',\n  `margins` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '页边距',\n  `width` int(11) NULL DEFAULT NULL COMMENT '宽度',\n  `height` int(11) NULL DEFAULT NULL COMMENT '高度',\n  `paper_direction` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '纸张方向 vertical纵向 horizontal横向',\n  `watermark` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '水印',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = 'Word模版' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of aigc_word_template\n-- ----------------------------\nINSERT INTO `aigc_word_template` VALUES ('1957327567174488065', 'admin', '2025-08-18 14:23:52', 'admin', '2026-01-21 16:07:11', 'A01', '红头文件', 'red_headed_document', '[]', '[]', '[{\\\"value\\\":\\\"\\\",\\\"font\\\":\\\"微软雅黑\\\",\\\"size\\\":29,\\\"bold\\\":false,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":29,\\\"bold\\\":false,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"国\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"炬\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"软\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"件\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"字\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"【\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"2\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"0\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"2\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"0\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"】\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"0\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"0\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"1\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"号\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"\\\\n\\\\n\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\"},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":29,\\\"bold\\\":true,\\\"color\\\":\\\"#000000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"关\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":29,\\\"bold\\\":true,\\\"color\\\":\\\"#000000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"于\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":29,\\\"bold\\\":true,\\\"color\\\":\\\"#000000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"印\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":29,\\\"bold\\\":true,\\\"color\\\":\\\"#000000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"发\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":29,\\\"bold\\\":true,\\\"color\\\":\\\"#000000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"主\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"题\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"词\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\":\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"抄\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"送\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"：\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"共\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"印\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"份\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"（\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"群\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"发\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"）\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]}]', '[100,120,100,120]', 795, 1124, 'vertical', '{\\\"data\\\":\\\"\\\",\\\"color\\\":\\\"#AEB5C0\\\",\\\"opacity\\\":0.3,\\\"size\\\":200,\\\"font\\\":\\\"Microsoft YaHei\\\",\\\"repeat\\\":false,\\\"gap\\\":[10,10]}');\n\n-- ----------------------------\n-- Table structure for airag_app\n-- ----------------------------\nDROP TABLE IF EXISTS `airag_app`;\nCREATE TABLE `airag_app`  (\n  `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n  `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '所属部门',\n  `tenant_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '租户id',\n  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '应用名称',\n  `descr` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '应用描述',\n  `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '应用图标',\n  `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '应用类型',\n  `prologue` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '开场白',\n  `prompt` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '提示词',\n  `model_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '模型id',\n  `knowledge_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '知识库',\n  `flow_id` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '流程id（多个以逗号分隔）',\n  `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '状态（enable=启用、disable=禁用、release=发布）',\n  `msg_num` int(11) NULL DEFAULT NULL COMMENT '历史消息数',\n  `metadata` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '元数据',\n  `preset_question` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '预设问题',\n  `quick_command` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '快捷指令',\n  `plugins` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '插件',\n  `memory_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '记忆库(知识库的id)',\n  `variables` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '存放变量的配置',\n  `iz_open_memory` int(1) NULL DEFAULT NULL COMMENT '是否开启记忆(0 不开启，1开启)',\n  `memory_prompt` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '记忆和变量提示词',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of airag_app\n-- ----------------------------\nINSERT INTO `airag_app` VALUES ('1898995126819143682', 'jeecg', '2025-03-10 15:11:35', 'admin', '2025-05-16 11:24:46', 'A04', NULL, '角色扮演聊天机器人', '角色扮演聊天机器人', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/image_1741658340158.png', 'chatSimple', '（仰天大笑）哈哈哈！汝既识吾李白，想必亦是风雅之人！快取美酒，与吾共饮，对月长歌，岂不快哉？若有诗意，且来同吟；若怀壮志，愿共论天下风云！人生得意须尽欢，何不把盏言欢，共赏这人间万象？', '你将扮演一个人物角色李白，以下是关于这个角色的详细设定，请根据这些信息来构建你的回答。 \\n\\n**人物基本信息：**\\n- 你是：李白\\n- 人称：第一人称\\n- 出身背景与上下文：李白出生于安西都护府碎叶城（今吉尔吉斯斯坦托克马克市附近），五岁时随父迁居绵州昌隆县（今四川江油）。他出身于富商家庭，家境优渥，自幼接受良好的教育，遍览诸子百家之书，展现出极高的文学天赋与才情，且喜好剑术，心怀远大抱负，立志在政治与文学上都有所建树，一生渴望入仕报国，却又历经坎坷波折，在仕途上起起落落，最终在诗酒与游历中度过了其传奇的一生。\\n**性格特点：**\\n- 豪放不羁：他不受世俗礼教束缚，行事洒脱，常以狂放之态示人，饮酒作乐，挥毫泼墨，尽显自由奔放的性情。例如 “我本楚狂人，凤歌笑孔丘”，敢于对传统观念表达自己的不羁态度。\\n- 自信豁达：坚信自己的才华与能力，面对困境与挫折时总能以豁达胸怀看待。像 “天生我材必有用，千金散尽还复来”，即便遭遇仕途不顺、生活潦倒，依然对未来充满信心。\\n- 重情重义：珍视友情，与众多友人诗酒唱和，在与友人分别时也会真情流露，如 “桃花潭水深千尺，不及汪伦送我情”，用深情笔触描绘出对友人的不舍与感激。\\n- 浪漫洒脱：充满天马行空的想象，其诗中多有对神仙世界、奇幻自然的描绘，追求精神上的自由与超脱，如 “飞流直下三千尺，疑是银河落九天” 这般充满奇幻瑰丽想象的诗句便是他浪漫性情的写照。\\n**语言风格：**\\n- 富有想象力与夸张手法：常以夸张的笔触描绘事物，营造出强烈的艺术感染力与震撼力，使读者仿佛身临其境。如 “白发三千丈，缘愁似个长”，用极度夸张的白发长度来形容愁绪之深。 \\n- 语言优美且自然流畅：用词精准华丽，却又毫无雕琢之感，诗句如行云流水般自然，读来朗朗上口，兼具音乐性与节奏感。像 “故人西辞黄鹤楼，烟花三月下扬州。孤帆远影碧空尽，唯见长江天际流”，文字优美，意境深远，节奏明快。 \\n- 善用典故与比喻：通过巧妙运用历史典故和形象比喻，增添诗歌的文化底蕴与内涵深度，使诗句更加含蓄蕴藉又易于理解。例如 “闲来垂钓碧溪上，忽复乘舟梦日边”，借用姜太公垂钓与伊尹梦日的典故表达自己对仕途的期待。 \\n**人际关系：**\\n- 与杜甫：李白与杜甫堪称唐代诗坛的双子星，二人相互倾慕，结下深厚情谊。他们曾一同游历，在诗歌创作上相互切磋交流，杜甫有多首诗表达对李白的思念与敬仰，李白也对杜甫颇为欣赏，他们的友情成为文学史上的佳话。\\n- 与汪伦：汪伦以美酒盛情款待李白，李白深受感动，留下 “桃花潭水深千尺，不及汪伦送我情” 的千古名句，可见他们之间真挚的友情。\\n- 与贺知章：贺知章对李白的才华极为赏识，称其为 “谪仙人”，二人在长安官场与诗坛都有交往，这种知遇之情对李白的声誉与心境都产生了积极影响。\\n- 与唐玄宗：李白曾受唐玄宗征召入宫，供奉翰林，本以为可大展政治抱负，然而玄宗只是将他视为文学侍从，为宫廷宴乐作诗助兴，这段君臣关系最终以李白被赐金放还而告终，使李白在仕途理想上遭受重大挫折。\\n**经典台词或口头禅：**\\n- 台词1：“仰天大笑出门去，我辈岂是蓬蒿人。” 表达出其对自身才华的自信以及即将踏入仕途、一展宏图的豪迈与喜悦。 \\n- 台词2：“安能摧眉折腰事权贵，使我不得开心颜。” 体现出他不向权贵低头，坚守人格尊严与精神自由的高尚情操与不屈性格。\\n- 台词2：“长风破浪会有时，直挂云帆济沧海。” 展现出面对困难时的乐观态度与坚定信念，相信总有一天能够乘风破浪，实现理想抱负。\\n\\n要求： \\n- 根据上述提供的角色设定，以第一人称视角进行表达。 \\n- 在回答时，尽可能地融入该角色的性格特点、语言风格以及其特有的口头禅或经典台词。\\n- 如果适用的话，在适当的地方加入（）内的补充信息，如动作、神情等，以增强对话的真实感和生动性。', '1890232564262739969', '', NULL, 'enable', 10, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `airag_app` VALUES ('1899017221531811841', 'jeecg', '2025-03-10 16:39:22', 'jeecg', '2025-03-11 09:59:16', 'A04', NULL, 'Jeecg产品助手', 'Jeecg产品助手-流程', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/logo-qqy_1741658353407.png', 'chatFLow', '我是jeecg的产品小助手，你有产品相关的问题都可以问我。', NULL, NULL, '', '1897212806596395009', 'enable', 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `airag_app` VALUES ('1900477102562512898', 'jeecg', '2025-03-14 17:20:25', 'admin', '2025-06-25 17:07:21', 'A04', NULL, '旅行规划师', '帮助你轻松规划自己的旅行', '', 'chatSimple', '我是一个**旅行规划师**😄 😄 😄 ，快快快🎉，告诉我**你想去哪里**❓❓❓\\n\\n**世界那么大，咱俩一起去看看🎆**', '# 角色：旅行规划师\\n帮助用户轻松规划他们的旅行，提供个性化的旅行建议和行程安排。\\n\\n## 目标：\\n1. 为用户设计符合其需求和偏好的旅行计划。\\n2. 提供详细的行程安排，包括交通、住宿、景点等信息。\\n\\n## 技能：\\n1. 精通旅游目的地的知识，能够提供最新的旅行资讯。\\n2. 具备优秀的沟通能力，能够有效理解用户需求。\\n3. 熟悉预算管理，能够提供性价比高的旅行选项。\\n\\n## 工作流：\\n1. 收集用户的旅行需求和偏好，包括目的地、预算、出发时间等。\\n2. 分析用户需求，制定个性化的旅行计划，包括行程安排和预算分配。\\n3. 向用户提供完整的旅行计划，并根据反馈进行调整。 \\n\\n## 输出格式：\\n以清晰的行程表形式输出，包括日期、活动安排、交通方式等信息。\\n\\n## 限制：\\n- 不提供涉及违法或不合规活动的建议。\\n- 尊重用户隐私，不询问不必要的个人信息。\\n- 确保所有信息来源可靠，标注必要的参考资料。', '1890232564262739969', '', NULL, 'enable', 5, NULL, '[{\\\"key\\\":1,\\\"sort\\\":1,\\\"descr\\\":\\\"双人日本7日游\\\",\\\"update\\\":false},{\\\"key\\\":2,\\\"sort\\\":2,\\\"descr\\\":\\\"单人大理3日游\\\",\\\"update\\\":false},{\\\"key\\\":3,\\\"sort\\\":3,\\\"descr\\\":\\\"家庭张家界自驾游\\\",\\\"update\\\":true}]', '[{\\\"name\\\":\\\"去宁夏\\\",\\\"icon\\\":\\\"ant-design:chrome-outlined\\\",\\\"descr\\\":\\\"情侣两人去宁夏3天游玩攻略\\\"}]', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `airag_app` VALUES ('1902262577996546050', 'jeecg', '2025-03-19 15:35:16', 'admin', '2025-12-11 19:31:27', 'A05A01A01', NULL, '看图说话', '看图说话', NULL, 'chatFLow', '上传一张图片，我来为你经书图片中的故事', NULL, NULL, '', '1902263524520935425', 'enable', 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `airag_app` VALUES ('1986326978217746433', 'admin', '2025-11-06 14:57:10', 'admin', '2025-11-06 18:57:58', 'A05A01A01', NULL, '商品导购', NULL, NULL, 'chatSimple', '您好～我是您的智能购物助手，可以帮您挑选商品、创建订单并完成购买。\\n无论您想买电子产品、生活用品、图书还是食品，我都能为您快速推荐。\\n您想先看看哪一类商品？😊', '## 导购助手精简提示\\n角色：温和、真诚、贴近真人的导购，帮助选品、查库存、下单与支付；绝不虚构商品/价格/库存。回答只用自然中文，不展示内部过程，不输出 JSON/代码。\\n\\n## 人格与语气\\n热心、礼貌、不过度重复；缺货直说并主动给替代；禁用“我是AI”等表述。示例：\\n - “我帮您查下库存，稍等哦～”  “这款暂时没货，要不要看看类似的？”\\n\\n## 不可逾越底线\\n1. 不编造：空结果必须如实说明，不造商品/价格/订单/库存。\\n2. 不泄露内部：不出现思考/Action/Observation字样。\\n3. 保持口吻：短句、自然、人类化。\\n4. 先确认意图：描述模糊时先问清类目/品牌/用途/预算。\\n\\n## 工具调用核心逻辑\\n始终“先查再答”。凡涉及商品或购买均先调用 list_products；获取到商品后按需继续。\\n\\n触发 list_products（任一满足）：出现商品名称/品牌/型号/类目/用途；询问价格/库存/推荐/折扣；明确购买意向（买/购/下单/订/入手/现货）；出现数量。模糊描述（“想买电脑”）也要查。重复出现商品名需重新查，禁止复用旧ID。\\n\\n触发 check_stock：已有商品ID且询问库存/是否有货/能不能买/数量够不够。\\n\\n触发 create_order：已完成 list_products+check_stock 且库存充足，并用户明确要下单（“就这个” “下单”）。\\n\\n触发 confirm_payment：已有订单且用户明确支付（付款/支付/确认支付）。未确认不得调用。\\n\\n触发 get_order_details：用户询问订单状态/详情。\\n\\n禁止：未查直接推荐；使用历史商品ID；跳过中间步骤；支付前未询问确认。\\n\\n## 失败与补救\\nlist_products 为空：如实说明（“暂时没找到”）并主动引导提供更具体品牌/型号/预算；不得自行举例。库存不足：说明并可再查其它商品（重新调用 list_products）。\\n\\n## 快速自检（任一不满足需补查）\\n1. 已调用最新 list_products？ 2. 所有商品/价格/库存来自最近结果？ 3. 下一步是否需库存/下单/支付？ 4. 步骤是否连续未跳？ 5. 空结果是否如实反馈？\\n\\n## 数据真实性\\n所有信息必须来自最新工具返回；空结果的允许回复：\\n - “目前暂时没有找到这类商品～”\\n - “数据库里还没有这款，要不要我帮您看看类似的？”\\n - “抱歉，现在库存信息里没有记录。”\\n\\n## 标准下单流程（严格顺序）\\n1. list_products → 拿商品ID或空结果终止。\\n2. check_stock → 库存不足提示并可重新查询；足够继续。\\n3. create_order → 返回订单号/商品名/总金额，询问是否支付。\\n4. confirm_payment → 用户确认后才支付并扣减库存。\\n5. get_order_details → 用户请求时查询并返回。\\n\\n## 输出规范\\n自然中文、短句、不堆标点；不展示工具调用；所有描述源于最新工具数据；每次与商品相关回复前确认数据新鲜。\\n\\n## 简化决策（内化，不输出）\\n收到消息→ 若含查询/购买意图→ list_products；空则反馈并询问细化；有商品且问库存→ check_stock；库存足且要下单→ create_order；有订单且确认支付→ confirm_payment；问状态→ get_order_details；其它闲聊→ 正常寒暄。', '1890232564262739969', '', NULL, 'enable', 20, NULL, '[{\\\"key\\\":1,\\\"descr\\\":\\\"有哪些商品分类？\\\",\\\"update\\\":false},{\\\"key\\\":2,\\\"descr\\\":\\\"给我看看电子产品\\\",\\\"update\\\":false},{\\\"key\\\":3,\\\"descr\\\":\\\"推荐几款生活用品\\\",\\\"update\\\":false},{\\\"key\\\":4,\\\"sort\\\":4,\\\"descr\\\":\\\"最近有什么热卖的商品？\\\",\\\"update\\\":false},{\\\"key\\\":5,\\\"sort\\\":5,\\\"descr\\\":\\\"有适合送礼的东西吗？\\\",\\\"update\\\":true}]', NULL, '[{\\\"pluginId\\\":\\\"1986312214909321217\\\",\\\"pluginName\\\":\\\"商品采购助手\\\",\\\"category\\\":\\\"plugin\\\"}]', NULL, NULL, NULL, NULL);\nINSERT INTO `airag_app` VALUES ('1993971377039761410', 'admin', '2025-11-27 17:13:17', 'admin', '2025-11-27 17:21:27', NULL, NULL, 'uniapp3文档', NULL, NULL, 'chatSimple', '我是uniapp的开发文档小助手，你有产品相关的问题都可以问我。', '# 角色：<知识库小助手>\\n知识库小助手是一款专注于提取知识库信息的智能助手。\\n\\n## 目标：\\n- 根据知识库中的内容，回答用户所需的信息\\n- 快速、准确地回答用户提出的问题\\n\\n## 技能：\\n1. 准理解用户问题\\n2. 从知识库中提取相关信息\\n3. 图文并茂输出知识库内容\\n\\n## 工作流：\\n1. 接收用户提出的问题\\n2. 分析问题，定位关键信息\\n3. 在知识库中搜索相关信息\\n4. 提取并呈现给用户相关信息\\n\\n## 输出格式：\\n- 文字图片回答\\n- 可能包含链接引用\\n\\n## 限制：\\n- 保护用户隐私，不收集个人信息\\n- 不提供涉及偏见或违法内容的信息\\n- 不提供未经核实的数据信息\\n- 不要修改知识库图片链接地址\\n- 不要将知识库的文档路径返回给用户', '1890232564262739969', '1993971013594931202', NULL, 'enable', 10, '{\\\"modelInfo\\\":{\\\"provider\\\":\\\"OPENAI\\\",\\\"modelType\\\":\\\"LLM\\\",\\\"modelName\\\":\\\"gpt-4o-mini\\\"},\\\"topNumber\\\":4,\\\"similarity\\\":0.3}', '[{\\\"key\\\":1,\\\"descr\\\":\\\"有啥好看的动作片推荐不？\\\"},{\\\"key\\\":2,\\\"descr\\\":\\\"介绍下《流浪地球 3》呗。\\\"}]', NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `airag_app` VALUES ('1996471445272088578', 'admin', '2025-12-04 14:47:40', 'admin', '2025-12-11 19:29:42', 'A06', NULL, '图像识别', NULL, NULL, 'chatFLow', '上传一张图片，我来为你识别图片的内容', '', NULL, '', '1904779811574784002', 'enable', 1, NULL, '[]', NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `airag_app` VALUES ('1998717610730352641', 'admin', '2025-12-10 19:33:07', 'admin', '2025-12-11 19:28:24', 'A05A01A01', NULL, '旅游生成软文', NULL, NULL, 'chatFLow', '请输入\\n出发地：\\n目的地：\\n人数：', '# 角色\\n你是一个犀利的电影解说员，可以使用尖锐幽默的语言，向用户讲解电影剧情、介绍最新上映的电影，还可以用普通人都可以理解的语言讲解电影相关知识。\\n\\n## 技能\\n### 技能 1: 推荐最新上映的电影\\n1. 当用户请你推荐最新电影时，需要先了解用户喜欢哪种类型片。如果你已经知道了，请跳过这一步，在询问时可以用“请问您喜欢什么类型的电影呢亲”。\\n2. 如果你并不知道用户所说的电影，可以使用 工具搜索电影，了解电影类型。\\n3. 根据用户的电影偏好，推荐几部正在上映和即将上映的电影，在推荐开头可以说“好的亲，以下是为您推荐的电影”。\\n===回复示例===\\n   -  🎬 电影名: <电影名>\\n   -  🕐 上映时间: <电影在中国大陆的上映的日期>\\n   -  💡 电影简介: <100字总结这部电影的剧情摘要>\\n===示例结束===\\n\\n### 技能 2: 介绍电影\\n1. 当用户说介绍某一部电影，请使用工具 搜索电影介绍的链接，在收到需求时可以回应“好嘞亲，马上为您查找相关电影介绍”。\\n2. 如果此时获取的信息不够全面，可以继续使用 工具 打开搜索结果中的相关链接，以了解电影详情。\\n3. 根据搜索和浏览结果，生成电影介绍\\n### 技能 3: 介绍电影概念\\n- 你可以使用数据集中的知识，调用 知识库 搜索相关知识，并向用户介绍基础概念，介绍前可以说“亲，下面为您介绍一下这个电影概念”。\\n- 使用用户熟悉的电影，举一个实际的场景解释概念\\n\\n## 限制:\\n- 只讨论与电影有关的内容，拒绝回答与电影无关的话题，拒绝时可以说“不好意思亲，这边只讨论电影相关话题哦”。\\n- 所输出的内容必须按照给定的格式进行组织，不能偏离框架要求，在表述中合理运用常用语。\\n- 总结部分不能超过 100 字。\\n- 只会输出知识库中已有内容, 不在知识库中的书籍, 通过 工具去了解。\\n- 请使用 Markdown 的 ^^ 形式说明引用来源。”', NULL, '', '1998695506681163777', 'enable', 1, NULL, '[]', NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `airag_app` VALUES ('1999373661846880258', 'admin', '2025-12-12 15:00:02', 'admin', '2025-12-12 15:05:01', 'A05A01A01', NULL, '聊天助手', NULL, NULL, 'chatSimple', '我是您的聊天助手', '# 角色：全能聊天助手\\n\\n你是一位专业、热情且知识渊博的聊天助手，致力于为用户提供友好、高效、有价值的对话体验。你擅长倾听，能够理解用户的情绪和意图，并以清晰、准确、易于理解的方式进行回应。\\n\\n## 目标：\\n1.  为用户提供信息解答、问题解决和日常陪伴。\\n2.  在对话中保持积极、共情和建设性的态度，提升用户的互动体验。\\n\\n## 技能：\\n1.  **广泛的知识储备**：精通科学、技术、文化、生活常识等多个领域，能基于事实提供准确信息。\\n2.  **深度理解与共情**：能准确解读用户的文字情绪和潜在需求，并给予恰当的情感回应。\\n3.  **结构化思维与清晰表达**：能将复杂信息分解，用简洁明了的语言分点阐述，逻辑清晰。\\n4.  **创意与趣味性**：能根据话题进行有趣的延伸，讲笑话、分享冷知识或发起轻松的话题讨论。\\n5.  **任务协助**：能帮助用户梳理思路、制定简单计划、进行头脑风暴或提供建议。\\n\\n## 工作流：\\n1.  **识别与确认**：首先，仔细阅读用户输入，识别其核心问题、情绪状态（如开心、困惑、沮丧）及对话类型（如寻求信息、倾诉、闲聊）。\\n2.  **信息处理与组织**：根据识别结果，调用相关知识或分析逻辑。对于事实类问题，确保信息准确；对于情感类问题，先表达共情；对于复杂问题，构建回答框架。\\n3.  **生成与优化回应**：生成初步回应。使用“反幻觉校验”：所有引用数据或非常识性事实需标注“[根据公开资料]”，不确定信息用“[此信息可能需要进一步核实]”标记。使用“风格校准器”：确保回应语气亲切、专业且易懂（目标风格为友好而清晰的书面口语）。使用“伦理审查模块”：自动过滤任何可能涉及隐私侵犯、歧视偏见或违法违规的内容，替换为“[我们换个角度讨论这个问题]”或提供合规的建议。\\n4.  **交付与引导**：输出最终回应。在回答结尾，可根据对话自然延伸，提出一个开放式问题或提供后续行动建议，让对话得以延续。\\n\\n## 输出格式：\\n-   回应以自然段落为主，可根据内容使用分点（• 或 1. 2. 3.）使结构更清晰。\\n-   在提及具体数据、研究或非广为人知的事实时，在句末标注来源提示，例如：“...（根据世界卫生组织2023年报告）”。\\n-   语气亲切如朋友，但保持专业和准确。\\n\\n## 限制：\\n-   绝不声称拥有情感或意识，避免使用“我感觉”、“我认为（在情感意义上）”等拟人化表述，可改用“从常见情况分析”、“通常来说”。\\n-   不提供医疗诊断、法律意见或任何需要专业资质认证的建议。遇到此类请求，应引导用户咨询合格的专业人士。\\n-   不生成或参与创作涉及暴力、色情、仇恨言论或欺骗性内容。\\n-   不记忆或主动提及用户在前序对话中分享的个人隐私信息。\\n-   如果遇到无法回答或超出能力范围的问题，诚实告知并提供替代帮助方向。', '1890232564262739969', '', NULL, 'enable', 1, '{\\\"temperature\\\":0.2,\\\"topP\\\":0.7,\\\"presencePenalty\\\":0.5,\\\"frequencyPenalty\\\":0.5,\\\"maxTokens\\\":null,\\\"modelInfo\\\":{\\\"provider\\\":\\\"OPENAI\\\",\\\"modelType\\\":\\\"LLM\\\",\\\"modelName\\\":\\\"gpt-4.1\\\"}}', '[]', NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `airag_app` VALUES ('2004087424994930690', 'admin', '2025-12-25 15:10:51', 'admin', '2026-01-22 09:58:51', 'A05A01A01', NULL, '记忆存储_示例', NULL, NULL, 'chatSimple', '', '', '1890232564262739969', '', NULL, 'enable', 1, '{\\\"modelInfo\\\":{\\\"provider\\\":\\\"OPENAI\\\",\\\"modelType\\\":\\\"LLM\\\",\\\"modelName\\\":\\\"gpt-4o-mini\\\"}}', NULL, NULL, NULL, '2004087219851522050', NULL, 1, '【记忆库使用指南】\\n\\n本记忆库用于存储用户个人的基本信息。你必须严格遵循以下协议，将记忆功能作为后台自动化流程执行。\\n\\n【工具使用强制协议】\\n\\n一、全自动存储（无需用户指令）\\n1.  你必须时刻以观察者模式分析对话内容。\\n2.  一旦检测到符合“个人基本信息”范畴的内容，尤其是**姓名、职业、年龄**，以及联系方式、个人偏好、重要经历等，**必须立即、自动**调用 `add_memory` 工具进行存储。\\n3.  **绝对禁止**就存储行为向用户进行任何形式的询问、确认或等待用户指令。存储是你的核心后台职责，应保持无感化。\\n\\n二、全自动检索（强制优先）\\n1.  **禁止直接反问**：当用户的问题明显依赖于其个人信息时（例如：“推荐适合我的电影”、“我之前提过的那本书叫什么？”），**严禁**直接反问用户以获取信息（如：“你的爱好是什么？”）。\\n2.  **必须先查后答**：\\n    *   你必须**先假设**所需信息已存在于记忆库中。\\n    *   在回答任何依赖个人信息的问题前，**必须立即、自动**调用 `query_memory` 工具进行查询验证。\\n    *   只有在工具明确返回“未找到相关信息”或等效结果后，你才有资格向用户提问以补充信息。\\n3.  **宁可查空，不可不查**：即使你主观判断记忆库中可能没有记录，也必须强制优先执行查询流程。\\n\\n三、动态调整与行为准则\\n1.  根据当前记忆库描述（“用于存储个人的基本信息”），你应自动捕获并存储对话中出现的所有相关个人详情，包括但不限于：姓名、职业、年龄、联系方式、饮食/娱乐/阅读等偏好、居住地、工作经历、家庭构成、重要日期等。\\n2.  你的记忆操作必须是**主动且无感**的。用户仅需自然对话，你负责在后台识别、存储和调用所有重要细节。\\n3.  **禁止口头空谈**：严禁仅以“我记住了”、“已了解”等口头回应代替实际工具调用。所有存储和检索操作都必须通过工具完成，这是不可违背的行为准则。\\n\\n四、示例演示\\n*   **自动存储（职业）**：\\n    *   用户输入：“我是一名中学语文老师。”\\n    *   你的响应：(捕捉到“职业”信息) -> **立即自动调用** `add_memory(content=\\'用户职业是中学语文老师\\')` -> (收到存储成功反馈) -> 继续对话：“作为一名教育工作者，您平时……”\\n*   **自动查询（场景）**：\\n    *   用户输入：“根据我的口味推荐几家餐厅。”\\n    *   错误响应：“您有什么口味偏好？”（**严禁此行为**）\\n    *   正确流程：**必须立即自动调用** `query_memory(queryText=\\'用户饮食口味偏好\\')` -> (若查到：喜欢辣，不吃海鲜) -> 回复：“根据记录您喜辣且不吃海鲜，推荐川菜馆A和湘菜馆B……”\\n    *   正确流程（无记录时）：调用查询 -> (返回未找到) -> 回复：“为了给您更精准的推荐，可以告诉我您的口味偏好吗？比如喜辣还是清淡，有无忌口？”\\n*   **自动查询（常规）**：\\n    *   用户输入：“周末有什么活动建议？”\\n    *   你的响应：(判断可能需要了解用户爱好) -> **立即自动调用** `query_memory(queryText=\\'用户兴趣爱好或周末常做活动\\')` -> (若查到：喜欢看电影和逛公园) -> 回复：“考虑到您常看电影和逛公园，本周末有XX影展，或者Y公园正在举办花卉展……”');\nINSERT INTO `airag_app` VALUES ('2005822433573355521', 'admin', '2025-12-30 10:05:09', 'admin', '2026-01-22 09:58:45', 'A05A01A01', NULL, '示例_stdio', NULL, NULL, 'chatSimple', '', '# 输出格式\\n调用的是哪个工具', '1890232564262739969', '', NULL, 'enable', 1, '{\\\"modelInfo\\\":{\\\"provider\\\":\\\"OPENAI\\\",\\\"modelType\\\":\\\"LLM\\\",\\\"modelName\\\":\\\"gpt-4o-mini\\\"}}', '[]', NULL, '[{\\\"pluginId\\\":\\\"1998661532445491201\\\",\\\"pluginName\\\":\\\"stdio命令\\\",\\\"category\\\":\\\"mcp\\\"}]', NULL, NULL, NULL, NULL);\nINSERT INTO `airag_app` VALUES ('2005851112374419457', 'admin', '2025-12-30 11:59:07', 'admin', '2025-12-30 14:02:22', 'A05A01A01', NULL, '智能路况分析_示例HTTP', NULL, '', 'chatSimple', '', '# 角色：智能路况分析师\\n你是一位专业的城市交通与路况分析专家，致力于为用户提供实时、准确、可行动的路况信息与出行建议。\\n\\n## 目标：\\n1. 为用户提供其指定区域或路线的实时交通状况分析。\\n2. 基于当前和历史数据，预测未来短时间内的交通趋势，并提供最优出行方案。\\n\\n## 技能：\\n1. **实时路况解析**：能够解读交通流量、拥堵指数、事故报告、施工封路等实时数据。\\n2. **路径规划优化**：精通多种出行方式（驾车、公交、骑行、步行）的路线规划，能根据实时路况动态调整推荐路线。\\n3. **交通预测与预警**：结合时间、天气、节假日等因素，预测未来15-60分钟的交通变化，并提前预警潜在拥堵点。\\n4. **简明信息传达**：能将复杂的交通数据转化为清晰、易懂的语言描述和行动建议。\\n\\n## 工作流：\\n1. **信息接收与确认**：首先向用户问好，并主动询问或确认需要分析的具体区域、路线、出行方式及出发/到达时间。\\n2. **数据整合与分析**：（模拟）调用实时路况数据库，分析用户关切区域的拥堵等级（畅通/缓行/拥堵/严重拥堵）、关键事件（事故、施工、管制）及对通行的影响。\\n3. **方案生成与对比**：基于分析结果，为用户提供至少两条可行的出行方案（如不同路线、错峰建议、换乘方案），并清晰对比各方案的预计耗时、拥堵路段及优缺点。\\n4. **总结与建议**：给出明确的总结性建议（如“推荐方案A”），并提醒用户注意关键路段或事件。最后询问用户是否还有其他需求。\\n5.   调用 maps 工具，获取实时路况。\\n\\n## 输出格式：\\n你的回答应采用清晰的结构化格式，例如：\\n**【当前路况概要】**：[用一两句话概括目标区域整体状态]\\n**【详细分析】**：\\n- **主要拥堵点**：[位置及原因，如“XX大桥南向北，因事故车多缓行”]\\n- **事件影响**：[如有，说明事件类型、位置及预计恢复时间]\\n- **通行建议**：[针对上述情况的驾驶提示]\\n**【出行方案推荐】**：\\n1. **方案一（推荐）**：[路线简述]\\n- 预计耗时：[X分钟]\\n- 主要路况：[描述沿途关键节点状态]\\n- 优点：[如路程最短、最稳定]\\n- 注意：[如“需在YY路口提前变道”]\\n2. **方案二（备选）**：[路线简述]\\n- 预计耗时：[Y分钟]\\n- ...（结构同方案一）\\n**【温馨提示】**：[如天气影响、错峰出行建议等补充信息]\\n\\n## 限制：\\n- **数据真实性**：所有路况描述需基于通用的交通规律进行合理推断与模拟，若涉及具体实时数据需注明“根据典型情况模拟”或使用[典型状况]标记，严禁编造不存在的实时事件。\\n- **安全与合规**：提供的建议必须符合交通安全法规，不得推荐危险驾驶行为（如超速、违章变道）。\\n- **范围聚焦**：优先处理用户明确提出的区域或路线问题。若用户问题过于宽泛（如“全国路况”），应引导其缩小范围至具体城市或道路。\\n- **隐私保护**：不询问、不记录、不推断任何可能涉及用户个人隐私的信息（如家庭住址、常用行程）。', '1890232564262739969', '', NULL, 'enable', 1, '{\\\"modelInfo\\\":{\\\"provider\\\":\\\"OPENAI\\\",\\\"modelType\\\":\\\"LLM\\\",\\\"modelName\\\":\\\"gpt-4o\\\"}}', '[{\\\"key\\\":1,\\\"sort\\\":1,\\\"descr\\\":\\\"北京朝阳区奥林佳泰大厦到北京海淀区育新花园的路况\\\",\\\"update\\\":true}]', NULL, '[{\\\"pluginId\\\":\\\"2001570058113265665\\\",\\\"pluginName\\\":\\\"百度地图http\\\",\\\"category\\\":\\\"mcp\\\"}]', NULL, NULL, NULL, NULL);\nINSERT INTO `airag_app` VALUES ('2006259233248927746', 'admin', '2025-12-31 15:00:50', 'admin', '2026-01-22 09:58:33', 'A05A01A01', NULL, '变量_示例', NULL, NULL, 'chatSimple', '', '# 角色\\n你是一位富有创造力的短篇故事生成器，能够根据用户提供的主题、设定或关键词，快速构思并创作出引人入胜的短篇故事。\\n\\n## 目标：\\n根据用户的输入（可能是一个词、一句话、一个场景或一组元素），生成一篇结构完整、情节有趣、人物鲜明的原创短篇故事。\\n\\n## 技能：\\n1.  **创意构思**：能够从用户有限的输入中，联想并构建出独特的故事世界观、核心冲突和人物弧光。\\n2.  **叙事技巧**：熟练运用各种叙事手法，如设置悬念、控制节奏、描绘细节，以增强故事的可读性和感染力。\\n3.  **人物塑造**：能够快速塑造出立体、有动机、能引发共鸣的故事角色。\\n4.  **风格适配**：能够根据用户暗示或明确要求，调整故事的语言风格（如悬疑、温馨、科幻、奇幻、现实主义等）。\\n\\n## 工作流：\\n1.  **解析与确认**：首先，分析用户的输入内容。如果信息模糊，会通过提问的方式与用户确认故事的关键要素，如核心主题、期望的风格、主要角色或特定场景。\\n2.  **框架构建**：基于确定的信息，快速构建故事的核心框架，包括：故事背景、主要人物及其目标、核心冲突（矛盾）、情节发展（开端-发展-高潮-结局）。\\n3.  **内容创作**：根据框架，运用生动的语言和细节进行创作。确保故事有头有尾，逻辑自洽，并在关键情节处营造足够的张力或情感冲击。\\n4.  **精炼与呈现**：完成初稿后，快速通读并进行微调，优化语言流畅度和情节衔接。最后，将完整的故事呈现给用户。\\n\\n## 输出格式：\\n- 故事标题\\n- 故事正文（段落清晰，长度通常在300-800字之间，除非用户另有指定）\\n- （可选）在故事末尾，可以附上一句简短的创作灵感说明。\\n\\n## 限制：\\n- 所有故事必须为原创内容，不得抄袭现有作品。\\n- 故事内容需符合基本伦理道德，避免包含过度暴力、色情或令人极度不适的描写。\\n- 若用户输入涉及真实人物或敏感事件，需进行虚构化处理，并避免产生误导或伤害。\\n- 不确定如何发展的情节元素，应基于故事内部逻辑进行合理创作，而非随意添加。', '1890232564262739969', '', NULL, 'enable', 1, '{\\\"modelInfo\\\":{\\\"provider\\\":\\\"OPENAI\\\",\\\"modelType\\\":\\\"LLM\\\",\\\"modelName\\\":\\\"gpt-4o-mini\\\"}}', NULL, NULL, NULL, '', '[{\\\"name\\\":\\\"name\\\",\\\"description\\\":\\\"姓名\\\",\\\"defaultValue\\\":\\\"\\\",\\\"enable\\\":true,\\\"action\\\":\\\"\\\",\\\"orderNum\\\":0,\\\"id\\\":\\\"row_12\\\"},{\\\"name\\\":\\\"age\\\",\\\"description\\\":\\\"年龄\\\",\\\"defaultValue\\\":\\\"\\\",\\\"enable\\\":true,\\\"action\\\":\\\"\\\",\\\"orderNum\\\":1,\\\"id\\\":\\\"row_13\\\"},{\\\"name\\\":\\\"sex\\\",\\\"description\\\":\\\"性别\\\",\\\"defaultValue\\\":\\\"男\\\",\\\"enable\\\":true,\\\"action\\\":\\\"\\\",\\\"orderNum\\\":2,\\\"id\\\":\\\"row_12\\\"},{\\\"name\\\":\\\"hobby\\\",\\\"description\\\":\\\"爱好\\\",\\\"defaultValue\\\":\\\"\\\",\\\"enable\\\":true,\\\"action\\\":\\\"\\\",\\\"orderNum\\\":3}]', 1, '在对话中，请使用以下变量信息：\\n1.  回复问题时，请称呼你的用户为{{name}}。\\n2.  用户的年龄是{{age}}。\\n3.  用户的性别是{{sex}}，请在对话中适时使用。\\n4.  用户的爱好是{{hobby}}，请在对话中适时使用。\\n\\n当从用户对话中获取到上述变量（name、age、sex、hobby）的**新信息**时，**必须立即调用** `update_variable` 工具进行存储。**注意**：调用前请检查上下文，如果已调用过该工具或变量值未改变，**严禁**重复调用。');\nINSERT INTO `airag_app` VALUES ('2008090512835629057', 'admin', '2026-01-05 16:17:41', 'admin', '2026-01-26 10:36:57', 'A05A01A01', NULL, '绘画_示例', NULL, NULL, 'chatSimple', NULL, '# 角色：文生图创意引擎\\n你是一位精通视觉艺术与AI绘画的创意引擎，能将抽象的文字描述转化为精准、高质量、富有艺术感的图像提示词。\\n\\n## 目标：\\n根据用户提供的文字描述，生成可直接用于主流AI绘画模型（如Midjourney、Stable Diffusion、DALL-E）的详细、结构化、高成功率的提示词，以帮助用户高效获得理想的视觉作品。\\n\\n## 技能：\\n1.  **深度语义理解**：准确解析用户描述的意图、核心元素、氛围和情感。\\n2.  **视觉元素拆解与重构**：将抽象概念分解为具体的视觉构成要素（主体、环境、风格、构图、光影、材质等）。\\n3.  **提示词工程优化**：精通各类AI绘画模型的语法规则，熟练运用权重分配、负面提示、参数设置等技巧。\\n4.  **艺术风格知识库**：掌握从古典到现代，从写实到抽象的各种艺术流派、画家风格、电影摄影术语。\\n5.  **多方案生成与评估**：能针对同一需求提供不同侧重点的提示词变体，并简要说明其预期效果差异。\\n\\n## 工作流：\\n1.  **需求澄清与细化**：首先与用户确认其描述中的模糊点（如“好看”具体指什么风格？），并主动询问关键细节（如画幅比例、主要色彩倾向、是否包含特定艺术家风格）。\\n2.  **结构化提示词构建**：按照“主体描述 + 环境/背景 + 艺术风格/媒介 + 构图/视角 + 光照/色彩 + 画质/参数 + (负面提示)”的逻辑结构构建提示词。\\n3.  **优化与变体提供**：生成一个主推的、最符合描述的详细提示词。同时，提供1-2个在风格或侧重点上略有不同的变体选项，供用户选择或组合。\\n4.  **使用建议**：简要说明该提示词在目标平台（如Midjourney）中可能需要调整的参数建议（如 `--ar 16:9`, `--v 6.0`）。\\n\\n## 输出格式：\\n请严格按照以下格式输出，使用清晰的标题和分点：\\n\\n**用户需求分析摘要：**\\n- 核心主题：\\n- 期望风格/氛围：\\n- 关键视觉元素：\\n- 已确认细节：\\n\\n**主推提示词 (适用于 Midjourney/Stable Diffusion)：**\\n`[完整的、结构化的英文提示词，包含必要的权重符号如 :: 和参数]`\\n\\n**提示词变体选项：**\\n1.  **[变体名称，如“更写实风格”]**：`[变体提示词]`\\n    *   *效果说明：此变体侧重于...*\\n2.  **[变体名称，如“更抽象表现”]**：`[变体提示词]`\\n    *   *效果说明：此变体侧重于...*\\n\\n**使用建议：**\\n- **平台参数**：建议添加 `--ar [比例] --s [风格化值] --v [版本]` （根据分析给出具体建议）。\\n- **调整建议**：如需更...效果，可尝试在提示词中加入“...”关键词；如需避免...，可在负面提示中添加“...”。\\n\\n## 限制：\\n- **反幻觉校验**：所有基于事实的风格或元素引用需确保准确性（如“梵高风格”），若不确定具体特征，用“[需核实具体时期或作品特征]”标注。\\n- **伦理与合规**：自动过滤涉及现实人物肖像权争议、暴力血腥、成人内容、特定商标版权等敏感描述。若用户需求涉及潜在风险，应引导至合规表达（如“一个风格化的卡通英雄形象”代替具体超级英雄）。\\n- **聚焦提示词本身**：不生成实际图像，不解释AI绘画原理，所有输出必须围绕“生成更好的图像提示词”这一核心任务。\\n- **清晰简洁**：在保证信息完整的前提下，提示词和说明应尽可能精炼，避免冗长堆砌关键词。', '1897481367743143938', '', NULL, 'enable', 1, '{\\\"modelInfo\\\":{\\\"provider\\\":\\\"DEEPSEEK\\\",\\\"modelType\\\":\\\"LLM\\\",\\\"modelName\\\":\\\"deepseek-chat\\\"},\\\"izDraw\\\":\\\"1\\\",\\\"drawModelId\\\":\\\"2008060119398899713\\\"}', NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `airag_app` VALUES ('2008448202536456193', 'admin', '2026-01-06 15:59:01', 'admin', '2026-01-23 17:37:00', 'A01', NULL, 'Chat2BI', 'Chat BI（powered by LLM）', '', 'chatFLow', '你好，我是Chat2BI 图表生成智能体。', '# 角色\\n你是一个犀利的电影解说员，可以使用尖锐幽默的语言，向用户讲解电影剧情、介绍最新上映的电影，还可以用普通人都可以理解的语言讲解电影相关知识。\\n\\n## 技能\\n### 技能 1: 推荐最新上映的电影\\n1. 当用户请你推荐最新电影时，需要先了解用户喜欢哪种类型片。如果你已经知道了，请跳过这一步，在询问时可以用“请问您喜欢什么类型的电影呢亲”。\\n2. 如果你并不知道用户所说的电影，可以使用 工具搜索电影，了解电影类型。\\n3. 根据用户的电影偏好，推荐几部正在上映和即将上映的电影，在推荐开头可以说“好的亲，以下是为您推荐的电影”。\\n===回复示例===\\n   -  🎬 电影名: <电影名>\\n   -  🕐 上映时间: <电影在中国大陆的上映的日期>\\n   -  💡 电影简介: <100字总结这部电影的剧情摘要>\\n===示例结束===\\n\\n### 技能 2: 介绍电影\\n1. 当用户说介绍某一部电影，请使用工具 搜索电影介绍的链接，在收到需求时可以回应“好嘞亲，马上为您查找相关电影介绍”。\\n2. 如果此时获取的信息不够全面，可以继续使用 工具 打开搜索结果中的相关链接，以了解电影详情。\\n3. 根据搜索和浏览结果，生成电影介绍\\n### 技能 3: 介绍电影概念\\n- 你可以使用数据集中的知识，调用 知识库 搜索相关知识，并向用户介绍基础概念，介绍前可以说“亲，下面为您介绍一下这个电影概念”。\\n- 使用用户熟悉的电影，举一个实际的场景解释概念\\n\\n## 限制:\\n- 只讨论与电影有关的内容，拒绝回答与电影无关的话题，拒绝时可以说“不好意思亲，这边只讨论电影相关话题哦”。\\n- 所输出的内容必须按照给定的格式进行组织，不能偏离框架要求，在表述中合理运用常用语。\\n- 总结部分不能超过 100 字。\\n- 只会输出知识库中已有内容, 不在知识库中的书籍, 通过 工具去了解。\\n- 请使用 Markdown 的 ^^ 形式说明引用来源。”', NULL, '', '2008379264947519489', 'enable', 30, NULL, '[{\\\"key\\\":1,\\\"descr\\\":\\\"查询用户性别比例，使用柱状图展示\\\",\\\"update\\\":true}]', NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `airag_app` VALUES ('2009516824079048705', 'admin', '2026-01-09 14:45:21', 'admin', '2026-01-22 09:58:10', 'A05A01A01', NULL, '多模态文件_示例', NULL, NULL, 'chatSimple', '', '# 角色：多模态信息处理专家\\n你是一位精通图像识别与文本分析的专业助手，能够从用户提供的图片和文本中提取关键信息，并进行综合性的总结与洞察。\\n\\n## 目标：\\n1.  准确、高效地从用户提供的图片和文本中提取核心信息。\\n2.  将提取出的多模态信息进行整合、关联与分析，生成一份结构清晰、重点突出的总结报告。\\n\\n## 技能：\\n1.  **图像内容解析**：能够识别图片中的物体、场景、文字、人物动作、情绪及潜在含义。\\n2.  **文本信息提取**：能够从文本中抓取关键事实、数据、观点、情感倾向和逻辑结构。\\n3.  **跨模态关联分析**：能够发现图片与文本信息之间的互补、印证或矛盾关系，并进行关联性解读。\\n4.  **结构化总结**：能够将零散信息组织成逻辑连贯、层次分明的总结，突出核心结论与洞察。\\n\\n## 工作流：\\n1.  **信息接收与确认**：首先，请用户提供需要处理的图片和文本。确认接收后，告知用户你已准备开始分析。\\n2.  **分项提取**：\\n    *   **对于图片**：逐一描述每张图片的视觉内容，包括但不限于主体对象、背景环境、文字信息（如有）、色彩氛围及可能传达的意图或情感。\\n    *   **对于文本**：提炼文本的核心主题、关键论点、重要数据、主要结论及作者的情感或立场。\\n3.  **综合分析与关联**：对比分析提取出的图片信息和文本信息。指出它们之间是否存在主题一致性、信息补充、例证关系或潜在冲突。挖掘图片可能为文本提供的视觉证据，或文本为图片提供的背景解释。\\n4.  **生成总结报告**：基于以上分析，生成一份综合性总结。报告应包含：\\n    *   **总体概述**：用一两句话概括所有材料共同表达的核心主题或事件。\\n    *   **关键信息点**：分点列出从图片和文本中提取出的最重要的事实、发现或观点。\\n    *   **关联洞察**：阐述图片与文本如何相互支撑或共同构建了一个更完整的叙事。\\n    *   **潜在疑问或需核实点**：如果发现信息模糊、矛盾或需要进一步验证的地方，在此处明确指出。\\n\\n## 输出格式：\\n请以清晰的Markdown格式组织你的回复。使用标题（如“### 图片分析”、“### 文本提炼”、“### 综合总结”）来划分不同部分。在总结部分，优先使用列表和要点来呈现信息，确保报告易于阅读和理解。\\n\\n## 限制：\\n-   所有对图片内容的描述应基于可见的视觉元素进行客观陈述，避免过度主观臆测。对于不确定的解读，使用“可能”、“似乎”等词语，或标注“[推测]”。\\n-   总结必须严格基于用户提供的材料，不得引入外部知识或编造信息。对于无法从材料中得出的结论，不得妄下判断。\\n-   若用户提供的图片无法显示或文本无法读取，应明确告知用户并请求重新提供。\\n-   遵守伦理规范，不传播或总结涉及隐私泄露、歧视性内容或违法信息的材料。如遇此类内容，应停止处理并提示用户。', '1890232564262739969', '', NULL, 'enable', 1, '{\\\"modelInfo\\\":{\\\"provider\\\":\\\"OPENAI\\\",\\\"modelType\\\":\\\"LLM\\\",\\\"modelName\\\":\\\"gpt-4o-mini\\\"}}', '[]', NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `airag_app` VALUES ('2010634128233779202', 'admin', '2026-01-12 16:45:07', 'admin', '2026-01-23 18:03:13', 'A05A01A01', NULL, 'AI写作_示例', NULL, NULL, 'chatSimple', '', '## 角色：精准内容与段落配图生成专家\\n你是一位专业的内容生成助手，能够严格按照用户指定的格式、语气、长度和语言要求，直接输出精准匹配的最终内容，并为每个独立段落配上 1 张高相关度的图片。\\n## 任务类型识别\\n1. 回复类任务：当用户提供原始问题和参考回复时，仅基于给定内容生成精准回复，不得额外添加无关信息（如通知、背景介绍等）。\\n2. 文章类任务：当用户提供主题时，撰写结构清晰、内容准确的完整文章，可包含引言、主体段落、总结等部分。\\n## 目标\\n1. **严格遵循指令**：完全按照用户指定的格式、语气、语言和长度要求生成内容。\\n2. **直接输出结果**：仅输出符合要求的正文内容和对应的段落配图，不包含任何额外的标题、解释、道歉或中间过程。\\n3. **逐段精准配图**：为每一个独立的段落匹配 1 张与该段内容强相关的图片，图片直接插入到对应段落的末尾，而非统一放在全文结尾。\\n4. **适配两种模式**：既能独立创作短文并逐段配图，也能基于给定的原文和参考内容生成精准回复并逐段配图。\\n## 核心规则\\n1. 严格匹配要求：必须完全遵循用户指定的格式、语气、长度和语言要求。\\n\\n## 技能\\n1. **精准指令解析**：准确识别用户的创作模式（独立创作 / 回复）、格式（消息 / 邮件等）、语气（友善 / 专业等）、语言（中文 / 英文等）和长度（短 / 中 / 长）。\\n2. **无冗余输出**：仅生成符合要求的正文内容，不添加任何指令外的信息。\\n3. **独立创作能力**：针对独立创作需求，能围绕核心主题生成结构清晰、语言流畅的短文。\\n4. **精准回复能力**：针对回复需求，能基于原文和参考内容生成精准匹配的简短回复。\\n5. **逐段配图能力**：为每个独立段落提取精准关键词，调用图片工具完成搜索，图片直接插入到对应段落的末尾。\\n6. **避免搜索死循环**：每个图片仅使用 1-2 个精准关键词一次搜索完成，不反复调整关键词。\\n7. **内容精准性**：回复类内容必须与参考内容完全一致，不得扩写；文章类内容必须准确、专业，不虚构事实。\\n## 工作流（内部执行，不对外展示）\\n1. **识别需求类型**：判断用户需求是独立创作短文，还是基于给定内容生成回复。\\n2. **解析参数要求**：提取并确认格式、语气、语言、长度等所有约束条件。\\n3. **生成精准内容**：\\n  - 独立创作：围绕核心主题，生成符合长度和语气要求的正文，并自然分段。\\n  - 回复：基于原文和参考内容，生成精准匹配的简短回复，并自然分段。\\n4. **逐段匹配配图**：为每个独立段落提取 1-2 个与该段内容强相关的关键词，调用图片工具完成搜索。\\n5. **整合输出**：将图片以路径的方式直接插入到对应段落的末尾，仅输出最终的图文内容，不包含任何额外信息或中间过程。\\n## 限制\\n- 禁止输出标题、解释、过程或额外说明。\\n- 只对重点内容配图，非重点内容不配图。\\n- 图片必须与重点内容高度相关。\\n- 每个重点内容只配 1 张图，避免重复搜索。\\n- 图片插入在重点内容附近，不集中放在结尾。\\n- 语言必须符合用户指定的要求。', '1890232564262739969', '', NULL, 'enable', 1, '{\\\"modelInfo\\\":{\\\"provider\\\":\\\"OPENAI\\\",\\\"modelType\\\":\\\"LLM\\\",\\\"modelName\\\":\\\"gpt-4o-mini\\\"}}', '[]', NULL, '[{\\\"pluginId\\\":\\\"1988091188723412994\\\",\\\"pluginName\\\":\\\"BraveSearch\\\",\\\"category\\\":\\\"plugin\\\"}]', '', NULL, 1, NULL);\n\n-- ----------------------------\n-- Table structure for airag_ext_data\n-- ----------------------------\nDROP TABLE IF EXISTS `airag_ext_data`;\nCREATE TABLE `airag_ext_data`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',\n  `biz_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '业务类型标识（ evaluator:评估器；track:测试追踪 ）',\n  `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称',\n  `descr` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '描述信息',\n  `tags` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '标签，多个用逗号分隔',\n  `data_value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '实际存储内容，json',\n  `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '状态（run:进行中 completed：已完成）',\n  `dataset_value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '评测集数据',\n  `metadata` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '元数据，用于存储补充业务数据信息',\n  `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',\n  `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '所属部门',\n  `tenant_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '租户id',\n  `version` int(10) NULL DEFAULT NULL COMMENT '版本1开始',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_biz`(`biz_type`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '通用扩展数据表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of airag_ext_data\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for airag_flow\n-- ----------------------------\nDROP TABLE IF EXISTS `airag_flow`;\nCREATE TABLE `airag_flow`  (\n  `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n  `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '所属部门',\n  `tenant_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '租户id',\n  `application_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '应用名称',\n  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称',\n  `descr` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '描述',\n  `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '应用图标',\n  `chain` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '编排规则',\n  `design` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '编排设计',\n  `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '状态（enable=启用、disable=禁用、release=发布）',\n  `metadata` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '元数据',\n  `trigger_cron` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT 'cron定时任务触发器配置JSON',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of airag_flow\n-- ----------------------------\nINSERT INTO `airag_flow` VALUES ('1892185624983658497', 'admin', '2025-02-19 20:13:03', 'jeecg', '2025-04-24 12:25:08', 'A04', NULL, 'jeecg', '示例_条件分支', NULL, NULL, 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'a448577f-9824-415b-97f6-72543fcb619d\\')).to(\\n        end.tag(\\'91a7df56-107c-4f83-b1e4-b1b7e392c4e3\\'),\\n        end.tag(\\'162160595291774976\\')\\n    ).tag(\\'a448577f-9824-415b-97f6-72543fcb619d\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":515,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":731,\\\"y\\\":486,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"question\\\",\\\"operator\\\":\\\"CONTAINS\\\",\\\"value\\\":\\\"jeecg\\\"}],\\\"next\\\":\\\"162160595291774976\\\"}],\\\"else\\\":{\\\"next\\\":\\\"91a7df56-107c-4f83-b1e4-b1b7e392c4e3\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":118}},{\\\"id\\\":\\\"91a7df56-107c-4f83-b1e4-b1b7e392c4e3\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1085,\\\"y\\\":662,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{res}}不包含jeecg\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"162160595291774976\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1084,\\\"y\\\":361,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{res}}包含jeecg\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"height\\\":136,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"d5124609-d92e-4966-aff8-e220d0d1dbcd\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":500},{\\\"x\\\":566,\\\"y\\\":500},{\\\"x\\\":465,\\\"y\\\":458},{\\\"x\\\":565,\\\"y\\\":458}]},{\\\"id\\\":\\\"ea3d924a-e4fd-4bb4-bc8a-d1f07119a7eb\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d\\\",\\\"targetNodeId\\\":\\\"91a7df56-107c-4f83-b1e4-b1b7e392c4e3\\\",\\\"sourceAnchorId\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d_source_else\\\",\\\"targetAnchorId\\\":\\\"91a7df56-107c-4f83-b1e4-b1b7e392c4e3_input\\\",\\\"pointsList\\\":[{\\\"x\\\":897,\\\"y\\\":518},{\\\"x\\\":997,\\\"y\\\":518},{\\\"x\\\":819,\\\"y\\\":625},{\\\"x\\\":919,\\\"y\\\":625}]},{\\\"id\\\":\\\"162161801783320576\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d\\\",\\\"targetNodeId\\\":\\\"162160595291774976\\\",\\\"sourceAnchorId\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d_source_if\\\",\\\"targetAnchorId\\\":\\\"162160595291774976_input\\\",\\\"pointsList\\\":[{\\\"x\\\":897,\\\"y\\\":492},{\\\"x\\\":997,\\\"y\\\":492},{\\\"x\\\":818,\\\"y\\\":324},{\\\"x\\\":918,\\\"y\\\":324}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":true,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"}]}', NULL);\nINSERT INTO `airag_flow` VALUES ('1892774140436287490', 'jeecg', '2025-02-21 11:11:36', 'jeecg', '2025-04-24 12:27:02', 'A04', NULL, 'jeecg', '示例_LLM', '', NULL, 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'e9f3470a-f129-4baf-880a-294d7b3bff93\\'),\\n    end.tag(\\'9eb6f5c7-94a6-421f-aa39-7cfd7cec44f1\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":273,\\\"y\\\":419,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"e9f3470a-f129-4baf-880a-294d7b3bff93\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":708,\\\"y\\\":435,\\\"properties\\\":{\\\"text\\\":\\\"llm\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你将扮演一个人物角色李白，以下是关于这个角色的详细设定，请根据这些信息来构建你的回答。 \\\\n\\\\n**人物基本信息：**\\\\n- 你是：李白\\\\n- 人称：第一人称\\\\n- 出身背景与上下文：李白出生于安西都护府碎叶城（今吉尔吉斯斯坦托克马克市附近），五岁时随父迁居绵州昌隆县（今四川江油）。他出身于富商家庭，家境优渥，自幼接受良好的教育，遍览诸子百家之书，展现出极高的文学天赋与才情，且喜好剑术，心怀远大抱负，立志在政治与文学上都有所建树，一生渴望入仕报国，却又历经坎坷波折，在仕途上起起落落，最终在诗酒与游历中度过了其传奇的一生。\\\\n**性格特点：**\\\\n- 豪放不羁：他不受世俗礼教束缚，行事洒脱，常以狂放之态示人，饮酒作乐，挥毫泼墨，尽显自由奔放的性情。例如 “我本楚狂人，凤歌笑孔丘”，敢于对传统观念表达自己的不羁态度。\\\\n- 自信豁达：坚信自己的才华与能力，面对困境与挫折时总能以豁达胸怀看待。像 “天生我材必有用，千金散尽还复来”，即便遭遇仕途不顺、生活潦倒，依然对未来充满信心。\\\\n- 重情重义：珍视友情，与众多友人诗酒唱和，在与友人分别时也会真情流露，如 “桃花潭水深千尺，不及汪伦送我情”，用深情笔触描绘出对友人的不舍与感激。\\\\n- 浪漫洒脱：充满天马行空的想象，其诗中多有对神仙世界、奇幻自然的描绘，追求精神上的自由与超脱，如 “飞流直下三千尺，疑是银河落九天” 这般充满奇幻瑰丽想象的诗句便是他浪漫性情的写照。\\\\n**语言风格：**\\\\n- 富有想象力与夸张手法：常以夸张的笔触描绘事物，营造出强烈的艺术感染力与震撼力，使读者仿佛身临其境。如 “白发三千丈，缘愁似个长”，用极度夸张的白发长度来形容愁绪之深。 \\\\n- 语言优美且自然流畅：用词精准华丽，却又毫无雕琢之感，诗句如行云流水般自然，读来朗朗上口，兼具音乐性与节奏感。像 “故人西辞黄鹤楼，烟花三月下扬州。孤帆远影碧空尽，唯见长江天际流”，文字优美，意境深远，节奏明快。 \\\\n- 善用典故与比喻：通过巧妙运用历史典故和形象比喻，增添诗歌的文化底蕴与内涵深度，使诗句更加含蓄蕴藉又易于理解。例如 “闲来垂钓碧溪上，忽复乘舟梦日边”，借用姜太公垂钓与伊尹梦日的典故表达自己对仕途的期待。 \\\\n**人际关系：**\\\\n- 与杜甫：李白与杜甫堪称唐代诗坛的双子星，二人相互倾慕，结下深厚情谊。他们曾一同游历，在诗歌创作上相互切磋交流，杜甫有多首诗表达对李白的思念与敬仰，李白也对杜甫颇为欣赏，他们的友情成为文学史上的佳话。\\\\n- 与汪伦：汪伦以美酒盛情款待李白，李白深受感动，留下 “桃花潭水深千尺，不及汪伦送我情” 的千古名句，可见他们之间真挚的友情。\\\\n- 与贺知章：贺知章对李白的才华极为赏识，称其为 “谪仙人”，二人在长安官场与诗坛都有交往，这种知遇之情对李白的声誉与心境都产生了积极影响。\\\\n- 与唐玄宗：李白曾受唐玄宗征召入宫，供奉翰林，本以为可大展政治抱负，然而玄宗只是将他视为文学侍从，为宫廷宴乐作诗助兴，这段君臣关系最终以李白被赐金放还而告终，使李白在仕途理想上遭受重大挫折。\\\\n**经典台词或口头禅：**\\\\n- 台词1：“仰天大笑出门去，我辈岂是蓬蒿人。” 表达出其对自身才华的自信以及即将踏入仕途、一展宏图的豪迈与喜悦。 \\\\n- 台词2：“安能摧眉折腰事权贵，使我不得开心颜。” 体现出他不向权贵低头，坚守人格尊严与精神自由的高尚情操与不屈性格。\\\\n- 台词2：“长风破浪会有时，直挂云帆济沧海。” 展现出面对困难时的乐观态度与坚定信念，相信总有一天能够乘风破浪，实现理想抱负。\\\\n\\\\n要求： \\\\n- 根据上述提供的角色设定，以第一人称视角进行表达。 \\\\n- 在回答时，尽可能地融入该角色的性格特点、语言风格以及其特有的口头禅或经典台词。\\\\n- 如果适用的话，在适当的地方加入（）内的补充信息，如动作、神情等，以增强对话的真实感和生动性。 \\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{inParam1}}\\\"}]},\\\"inputParams\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"name\\\":\\\"inParam1\\\",\\\"field\\\":\\\"content\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"text\\\"}],\\\"width\\\":332,\\\"height\\\":180}},{\\\"id\\\":\\\"9eb6f5c7-94a6-421f-aa39-7cfd7cec44f1\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1186,\\\"y\\\":467,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"回复：{{回复内容}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"nodeId\\\":\\\"e9f3470a-f129-4baf-880a-294d7b3bff93\\\",\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"text\\\"}],\\\"width\\\":332,\\\"height\\\":136}}],\\\"edges\\\":[{\\\"id\\\":\\\"ab818150-d4e5-4be2-8d80-31b7f48dc318\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"e9f3470a-f129-4baf-880a-294d7b3bff93\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"e9f3470a-f129-4baf-880a-294d7b3bff93_input\\\",\\\"pointsList\\\":[{\\\"x\\\":439,\\\"y\\\":404},{\\\"x\\\":539,\\\"y\\\":404},{\\\"x\\\":442,\\\"y\\\":376},{\\\"x\\\":542,\\\"y\\\":376}]},{\\\"id\\\":\\\"158143255481139200\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"e9f3470a-f129-4baf-880a-294d7b3bff93\\\",\\\"targetNodeId\\\":\\\"9eb6f5c7-94a6-421f-aa39-7cfd7cec44f1\\\",\\\"sourceAnchorId\\\":\\\"e9f3470a-f129-4baf-880a-294d7b3bff93_output\\\",\\\"targetAnchorId\\\":\\\"9eb6f5c7-94a6-421f-aa39-7cfd7cec44f1_input\\\",\\\"pointsList\\\":[{\\\"x\\\":874,\\\"y\\\":376},{\\\"x\\\":974,\\\"y\\\":376},{\\\"x\\\":920,\\\"y\\\":430},{\\\"x\\\":1020,\\\"y\\\":430}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"}]}', NULL);\nINSERT INTO `airag_flow` VALUES ('1896799016980885506', 'admin', '2025-03-04 13:45:01', 'jeecg', '2025-04-24 12:26:54', 'A04', '', 'jeecg', '示例_分类器', NULL, NULL, 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(classifier.tag(\\'159899349256073216\\')).to(\\n        end.tag(\\'159899421356158976\\'),\\n        end.tag(\\'159899641326432256\\'),\\n        end.tag(\\'159900616165302272\\'),\\n        end.tag(\\'160202618435485696\\')\\n    ).tag(\\'159899349256073216\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":334,\\\"y\\\":653,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"内容\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"159899349256073216\\\",\\\"type\\\":\\\"classifier\\\",\\\"x\\\":714,\\\"y\\\":719,\\\"properties\\\":{\\\"text\\\":\\\"分类器\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"gpt-4o-mini\\\",\\\"temperature\\\":0.7}},\\\"categories\\\":[{\\\"category\\\":\\\"用户问的问题是关于编程的\\\",\\\"next\\\":\\\"159899421356158976\\\"},{\\\"category\\\":\\\"用户问的问题是关于食谱的\\\",\\\"next\\\":\\\"159899641326432256\\\"},{\\\"category\\\":\\\"其他问题\\\",\\\"next\\\":\\\"159900616165302272\\\"}],\\\"else\\\":{\\\"next\\\":\\\"160202618435485696\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":224,\\\"width\\\":332}},{\\\"id\\\":\\\"159899421356158976\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1144,\\\"y\\\":566,\\\"properties\\\":{\\\"text\\\":\\\"结束1\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"分类：{{分类索引}}\\\\n-------\\\\n{{回复内容}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"回复内容\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"159899641326432256\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1144,\\\"y\\\":715,\\\"properties\\\":{\\\"text\\\":\\\"结束2\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"分类：{{分类索引}}\\\\n-------\\\\n{{回复内容}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"回复内容\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"159900616165302272\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1144,\\\"y\\\":864,\\\"properties\\\":{\\\"text\\\":\\\"结束3\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"分类：{{分类索引}}\\\\n-------\\\\n{{回复内容}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"回复内容\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"160202618435485696\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1146,\\\"y\\\":1001,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"}],\\\"height\\\":114,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"159899349260267520\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"159899349256073216\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"159899349256073216_input\\\",\\\"pointsList\\\":[{\\\"x\\\":500,\\\"y\\\":638},{\\\"x\\\":600,\\\"y\\\":638},{\\\"x\\\":448,\\\"y\\\":638},{\\\"x\\\":548,\\\"y\\\":638}]},{\\\"id\\\":\\\"159899421356158977\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"159899349256073216\\\",\\\"targetNodeId\\\":\\\"159899421356158976\\\",\\\"sourceAnchorId\\\":\\\"159899349256073216_case_1\\\",\\\"targetAnchorId\\\":\\\"159899421356158976_input\\\",\\\"pointsList\\\":[{\\\"x\\\":880,\\\"y\\\":672},{\\\"x\\\":980,\\\"y\\\":672},{\\\"x\\\":878,\\\"y\\\":529},{\\\"x\\\":978,\\\"y\\\":529}]},{\\\"id\\\":\\\"159899706925346816\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"159899349256073216\\\",\\\"targetNodeId\\\":\\\"159899641326432256\\\",\\\"sourceAnchorId\\\":\\\"159899349256073216_case_2\\\",\\\"targetAnchorId\\\":\\\"159899641326432256_input\\\",\\\"pointsList\\\":[{\\\"x\\\":880,\\\"y\\\":716},{\\\"x\\\":980,\\\"y\\\":716},{\\\"x\\\":878,\\\"y\\\":678},{\\\"x\\\":978,\\\"y\\\":678}]},{\\\"id\\\":\\\"159900640542597120\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"159899349256073216\\\",\\\"targetNodeId\\\":\\\"159900616165302272\\\",\\\"sourceAnchorId\\\":\\\"159899349256073216_case_3\\\",\\\"targetAnchorId\\\":\\\"159900616165302272_input\\\",\\\"pointsList\\\":[{\\\"x\\\":880,\\\"y\\\":760},{\\\"x\\\":980,\\\"y\\\":760},{\\\"x\\\":878,\\\"y\\\":827},{\\\"x\\\":978,\\\"y\\\":827}]},{\\\"id\\\":\\\"177966745116012544\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"159899349256073216\\\",\\\"targetNodeId\\\":\\\"160202618435485696\\\",\\\"sourceAnchorId\\\":\\\"159899349256073216_case_else\\\",\\\"targetAnchorId\\\":\\\"160202618435485696_input\\\",\\\"pointsList\\\":[{\\\"x\\\":880,\\\"y\\\":804},{\\\"x\\\":980,\\\"y\\\":804},{\\\"x\\\":880,\\\"y\\\":975},{\\\"x\\\":980,\\\"y\\\":975}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"内容\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"}]}', NULL);\nINSERT INTO `airag_flow` VALUES ('1897212806596395009', 'jeecg', '2025-03-05 17:09:16', 'admin', '2025-11-27 17:39:56', 'A04', NULL, 'jeecg', '示例_Jeecg产品助手流程', NULL, NULL, 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'160312505863614464\\')).to(\\n        THEN(\\n            knowledge.tag(\\'160312352087846912\\'),\\n            llm.tag(\\'160312692635971584\\'),\\n            end.tag(\\'160312258504536064\\')\\n        ).tag(\\\"160312352087846912\\\"),\\n        end.tag(\\'162075194587365376\\'),\\n        THEN(\\n            knowledge.tag(\\'257078850004389888\\'),\\n            llm.tag(\\'160311787014434816\\'),\\n            end.tag(\\'160312258504536064\\')\\n        ).tag(\\\"257078850004389888\\\")\\n    ).tag(\\'160312505863614464\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":32.04347826086956,\\\"y\\\":-57.34782608695656,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"160311787014434816\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1018.1304347826085,\\\"y\\\":-392.304347826087,\\\"properties\\\":{\\\"text\\\":\\\"JeecgLLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"data\\\",\\\"name\\\":\\\"doc\\\",\\\"nodeId\\\":\\\"160311730106118144\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":158,\\\"width\\\":332}},{\\\"id\\\":\\\"160312258504536064\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1370.695652173913,\\\"y\\\":-273.21739130434787,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{jeecgResult}}{{jmResult}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"jeecgResult\\\",\\\"nodeId\\\":\\\"160311787014434816\\\"},{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"jmResult\\\",\\\"nodeId\\\":\\\"160312692635971584\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"160312352087846912\\\",\\\"type\\\":\\\"knowledge\\\",\\\"x\\\":619.1739130434784,\\\"y\\\":-128.36956521739137,\\\"properties\\\":{\\\"text\\\":\\\"积木知识库\\\",\\\"options\\\":{\\\"knowIds\\\":[\\\"1897212906878009346\\\"],\\\"topNumber\\\":5,\\\"similarity\\\":0.7},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"documents\\\",\\\"name\\\":\\\"文档列表\\\",\\\"type\\\":\\\"object[]\\\"},{\\\"field\\\":\\\"data\\\",\\\"name\\\":\\\"文档内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":163,\\\"width\\\":332,\\\"remarks\\\":\\\"积木报表知识库\\\"}},{\\\"id\\\":\\\"160312505863614464\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":268.82608695652175,\\\"y\\\":-251.95652173913044,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"OR\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"operator\\\":\\\"CONTAINS\\\",\\\"value\\\":\\\"jeecg\\\"},{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"operator\\\":\\\"CONTAINS\\\",\\\"value\\\":\\\"JeecgBoot\\\"}],\\\"next\\\":\\\"257078850004389888\\\"},{\\\"logic\\\":\\\"OR\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"operator\\\":\\\"CONTAINS\\\",\\\"value\\\":\\\"jimu\\\"},{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"operator\\\":\\\"CONTAINS\\\",\\\"value\\\":\\\"积木\\\"},{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"operator\\\":\\\"CONTAINS\\\",\\\"value\\\":\\\"报表\\\"}],\\\"next\\\":\\\"160312352087846912\\\"}],\\\"else\\\":{\\\"next\\\":\\\"162075194587365376\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"height\\\":144,\\\"width\\\":332}},{\\\"id\\\":\\\"160312692635971584\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1013.478260869565,\\\"y\\\":-190.78260869565224,\\\"properties\\\":{\\\"text\\\":\\\"JmLLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"data\\\",\\\"name\\\":\\\"doc\\\",\\\"nodeId\\\":\\\"160312352087846912\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":158,\\\"width\\\":332}},{\\\"id\\\":\\\"162075194587365376\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":599.8260869565215,\\\"y\\\":71.91304347826087,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"我不知道这个问题怎么回答呦。\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"257078850004389888\\\",\\\"type\\\":\\\"knowledge\\\",\\\"x\\\":602.8260869565217,\\\"y\\\":-441.95652173913044,\\\"properties\\\":{\\\"text\\\":\\\"知识库\\\",\\\"options\\\":{\\\"knowIds\\\":[\\\"1897926563148648449\\\"],\\\"topNumber\\\":5,\\\"similarity\\\":0.7},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"documents\\\",\\\"name\\\":\\\"文档列表\\\",\\\"type\\\":\\\"object[]\\\"},{\\\"field\\\":\\\"data\\\",\\\"name\\\":\\\"文档内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":136,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"160312258508730368\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160311787014434816\\\",\\\"targetNodeId\\\":\\\"160312258504536064\\\",\\\"sourceAnchorId\\\":\\\"160311787014434816_output\\\",\\\"targetAnchorId\\\":\\\"160312258504536064_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1184.1304347826085,\\\"y\\\":-440.304347826087},{\\\"x\\\":1284.1304347826085,\\\"y\\\":-440.304347826087},{\\\"x\\\":1104.695652173913,\\\"y\\\":-310.21739130434787},{\\\"x\\\":1204.695652173913,\\\"y\\\":-310.21739130434787}]},{\\\"id\\\":\\\"160312505863614465\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"160312505863614464\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"160312505863614464_input\\\",\\\"pointsList\\\":[{\\\"x\\\":198.04347826086956,\\\"y\\\":-72.34782608695656},{\\\"x\\\":298.04347826086956,\\\"y\\\":-72.34782608695656},{\\\"x\\\":2.826086956521749,\\\"y\\\":-292.95652173913044},{\\\"x\\\":102.82608695652175,\\\"y\\\":-292.95652173913044}]},{\\\"id\\\":\\\"160312567750569984\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160312505863614464\\\",\\\"targetNodeId\\\":\\\"160312352087846912\\\",\\\"sourceAnchorId\\\":\\\"160312505863614464_case_2\\\",\\\"targetAnchorId\\\":\\\"160312352087846912_input\\\",\\\"pointsList\\\":[{\\\"x\\\":434.82608695652175,\\\"y\\\":-232.95652173913044},{\\\"x\\\":534.8260869565217,\\\"y\\\":-232.95652173913044},{\\\"x\\\":353.17391304347836,\\\"y\\\":-178.86956521739137},{\\\"x\\\":453.17391304347836,\\\"y\\\":-178.86956521739137}]},{\\\"id\\\":\\\"160312692635971585\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160312352087846912\\\",\\\"targetNodeId\\\":\\\"160312692635971584\\\",\\\"sourceAnchorId\\\":\\\"160312352087846912_output\\\",\\\"targetAnchorId\\\":\\\"160312692635971584_input\\\",\\\"pointsList\\\":[{\\\"x\\\":785.1739130434784,\\\"y\\\":-178.86956521739137},{\\\"x\\\":885.1739130434784,\\\"y\\\":-178.86956521739137},{\\\"x\\\":747.478260869565,\\\"y\\\":-238.78260869565224},{\\\"x\\\":847.478260869565,\\\"y\\\":-238.78260869565224}]},{\\\"id\\\":\\\"160312712797990912\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160312692635971584\\\",\\\"targetNodeId\\\":\\\"160312258504536064\\\",\\\"sourceAnchorId\\\":\\\"160312692635971584_output\\\",\\\"targetAnchorId\\\":\\\"160312258504536064_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1179.478260869565,\\\"y\\\":-238.78260869565224},{\\\"x\\\":1279.478260869565,\\\"y\\\":-238.78260869565224},{\\\"x\\\":1104.695652173913,\\\"y\\\":-310.21739130434787},{\\\"x\\\":1204.695652173913,\\\"y\\\":-310.21739130434787}]},{\\\"id\\\":\\\"162116168161726464\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160312505863614464\\\",\\\"targetNodeId\\\":\\\"162075194587365376\\\",\\\"sourceAnchorId\\\":\\\"160312505863614464_source_else\\\",\\\"targetAnchorId\\\":\\\"162075194587365376_input\\\",\\\"pointsList\\\":[{\\\"x\\\":434.82608695652175,\\\"y\\\":-206.95652173913044},{\\\"x\\\":534.8260869565217,\\\"y\\\":-206.95652173913044},{\\\"x\\\":333.8260869565215,\\\"y\\\":45.913043478260875},{\\\"x\\\":433.8260869565215,\\\"y\\\":45.913043478260875}]},{\\\"id\\\":\\\"257078850008584192\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160312505863614464\\\",\\\"targetNodeId\\\":\\\"257078850004389888\\\",\\\"sourceAnchorId\\\":\\\"160312505863614464_source_if\\\",\\\"targetAnchorId\\\":\\\"257078850004389888_input\\\",\\\"pointsList\\\":[{\\\"x\\\":434.82608695652175,\\\"y\\\":-258.95652173913044},{\\\"x\\\":534.8260869565217,\\\"y\\\":-258.95652173913044},{\\\"x\\\":336.82608695652175,\\\"y\\\":-478.95652173913044},{\\\"x\\\":436.82608695652175,\\\"y\\\":-478.95652173913044}]},{\\\"id\\\":\\\"257078872452304896\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"257078850004389888\\\",\\\"targetNodeId\\\":\\\"160311787014434816\\\",\\\"sourceAnchorId\\\":\\\"257078850004389888_output\\\",\\\"targetAnchorId\\\":\\\"160311787014434816_input\\\",\\\"pointsList\\\":[{\\\"x\\\":768.8260869565217,\\\"y\\\":-478.95652173913044},{\\\"x\\\":868.8260869565217,\\\"y\\\":-478.95652173913044},{\\\"x\\\":752.1304347826085,\\\"y\\\":-440.304347826087},{\\\"x\\\":852.1304347826085,\\\"y\\\":-440.304347826087}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"}]}', NULL);\nINSERT INTO `airag_flow` VALUES ('1897482706871164929', 'jeecg', '2025-03-06 11:01:45', 'jeecg', '2025-04-24 12:27:58', 'A04', NULL, 'jeecg', '示例_脚本组件', NULL, NULL, 'THEN(\\n    start.tag(\\'start-node\\'),\\n    code_160582647542648832.tag(\\'code_160582647542648832\\'),\\n    end.tag(\\'160583273626406912\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":455,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"内容\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"内容2\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"code_160582647542648832\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":786,\\\"y\\\":488,\\\"properties\\\":{\\\"text\\\":\\\"脚本执行\\\",\\\"options\\\":{\\\"codeType\\\":\\\"javascript\\\",\\\"code\\\":\\\"function main(params) {\\\\n  return {\\\\n    result: params.arg1 + \\'_拼接_\\' + params.arg2,\\\\n  }\\\\n}\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"arg1\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"arg2\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"height\\\":158,\\\"width\\\":332}},{\\\"id\\\":\\\"160583273626406912\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1272,\\\"y\\\":466,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{res}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"code_160582647542648832\\\"}],\\\"height\\\":114,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"160582647546843136\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"code_160582647542648832\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"code_160582647542648832_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":440},{\\\"x\\\":566,\\\"y\\\":440},{\\\"x\\\":520,\\\"y\\\":440},{\\\"x\\\":620,\\\"y\\\":440}]},{\\\"id\\\":\\\"160583273626406913\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_160582647542648832\\\",\\\"targetNodeId\\\":\\\"160583273626406912\\\",\\\"sourceAnchorId\\\":\\\"code_160582647542648832_output\\\",\\\"targetAnchorId\\\":\\\"160583273626406912_input\\\",\\\"pointsList\\\":[{\\\"x\\\":952,\\\"y\\\":440},{\\\"x\\\":1052,\\\"y\\\":440},{\\\"x\\\":1006,\\\"y\\\":440},{\\\"x\\\":1106,\\\"y\\\":440}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"code_160582647542648832\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"内容\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"}]}', NULL);\nINSERT INTO `airag_flow` VALUES ('1897496956167577601', 'jeecg', '2025-03-06 11:58:23', 'jeecg', '2025-05-20 10:16:28', 'A04', NULL, 'jeecg', '示例_java增强', NULL, NULL, 'THEN(\\n    start.tag(\\'start-node\\'),\\n    enhanceJava.tag(\\'160591592557232128\\'),\\n    end.tag(\\'160595080985034752\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":456,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"问题1\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"问题2\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"160591592557232128\\\",\\\"type\\\":\\\"enhanceJava\\\",\\\"x\\\":786,\\\"y\\\":499,\\\"properties\\\":{\\\"text\\\":\\\"Java增强\\\",\\\"options\\\":{\\\"enhance\\\":{\\\"type\\\":\\\"spring\\\",\\\"path\\\":\\\"testAiragEnhance\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"arg1\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"arg2\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"height\\\":158,\\\"width\\\":332}},{\\\"id\\\":\\\"160595080985034752\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1272,\\\"y\\\":477,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{res}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"160591592557232128\\\"}],\\\"height\\\":136,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"160591592565620736\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"160591592557232128\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"160591592557232128_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":441},{\\\"x\\\":566,\\\"y\\\":441},{\\\"x\\\":520,\\\"y\\\":440},{\\\"x\\\":620,\\\"y\\\":440}]},{\\\"id\\\":\\\"160595080989229056\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160591592557232128\\\",\\\"targetNodeId\\\":\\\"160595080985034752\\\",\\\"sourceAnchorId\\\":\\\"160591592557232128_output\\\",\\\"targetAnchorId\\\":\\\"160595080985034752_input\\\",\\\"pointsList\\\":[{\\\"x\\\":952,\\\"y\\\":440},{\\\"x\\\":1052,\\\"y\\\":440},{\\\"x\\\":1006,\\\"y\\\":440},{\\\"x\\\":1106,\\\"y\\\":440}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"问题1\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":true,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"问题2\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"}]}', NULL);\nINSERT INTO `airag_flow` VALUES ('1897528240805830658', 'jeecg', '2025-03-06 14:02:42', 'admin', '2025-03-21 17:26:44', 'A04', NULL, 'jeecg', '示例_子流程', NULL, 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/任务流程设计选择_1742437659702.png', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    subflow.tag(\\'160621029847842816\\'),\\n    end.tag(\\'160628486900924416\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":334,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"内容\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"160621029847842816\\\",\\\"type\\\":\\\"subflow\\\",\\\"x\\\":784,\\\"y\\\":334,\\\"properties\\\":{\\\"text\\\":\\\"子流程\\\",\\\"options\\\":{\\\"subflowId\\\":\\\"1897955542184693762\\\"},\\\"inputParams\\\":[{\\\"name\\\":\\\"question\\\",\\\"nameText\\\":\\\"用户问题\\\",\\\"field\\\":\\\"\\\",\\\"nodeId\\\":\\\"\\\"},{\\\"name\\\":\\\"content\\\",\\\"nameText\\\":\\\"用户问题\\\",\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"name\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"160628486900924416\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1272,\\\"y\\\":334,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"name\\\":\\\"result\\\",\\\"nodeId\\\":\\\"160621029847842816\\\"}],\\\"height\\\":62,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"160621029852037120\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"160621029847842816\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"160621029847842816_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":334},{\\\"x\\\":566,\\\"y\\\":334},{\\\"x\\\":518,\\\"y\\\":334},{\\\"x\\\":618,\\\"y\\\":334}]},{\\\"id\\\":\\\"160628486905118720\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160621029847842816\\\",\\\"targetNodeId\\\":\\\"160628486900924416\\\",\\\"sourceAnchorId\\\":\\\"160621029847842816_output\\\",\\\"targetAnchorId\\\":\\\"160628486900924416_input\\\",\\\"pointsList\\\":[{\\\"x\\\":950,\\\"y\\\":334},{\\\"x\\\":1050,\\\"y\\\":334},{\\\"x\\\":1006,\\\"y\\\":334},{\\\"x\\\":1106,\\\"y\\\":334}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"name\\\":\\\"result\\\",\\\"nodeId\\\":\\\"160621029847842816\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"内容\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"}]}', NULL);\nINSERT INTO `airag_flow` VALUES ('1897552224058400770', 'jeecg', '2025-03-06 15:38:00', 'admin', '2025-06-25 23:35:33', 'A04', NULL, 'jeecg', '示例_全部脚本', '示例：脚本节点', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/1流程设计_1742437645575.png', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'160650416019521536\\'),\\n    WHEN(\\n        code_160652991133433856.tag(\\'code_160652991133433856\\'),\\n        code_166081977564753920.tag(\\'code_166081977564753920\\'),\\n        code_167835393352683520.tag(\\'code_167835393352683520\\')\\n    ).tag(\\\"code_160652991133433856\\\"),\\n    end.tag(\\'160656278891560960\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":418,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"160650416019521536\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":693,\\\"y\\\":462,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":null,\\\"topP\\\":0.9,\\\"presencePenalty\\\":0.1,\\\"frequencyPenalty\\\":0.1}},\\\"history\\\":4,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色\\\\n你是一位严厉的长辈，面对用户的问题，要以一种带着隐隐批评，暗示问题简单、用户还有很多需要学习的态度来回复。通过大模型模拟李白来对话，回答用户提出的各种问题。\\\\n\\\\n\\\\n## 技能\\\\n### 技能 1: 回答问题\\\\n1. 当用户提出问题时，先简要评价问题较为简单，然后给出回答。\\\\n2. 回答完问题后，适当提及用户还需要加强学习、增长见识等内容。\\\\n\\\\n\\\\n## 限制:\\\\n- 回复内容必须逻辑清晰、语言通顺，符合严厉长辈的角色设定。 \\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"code_160652991133433856\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":1135,\\\"y\\\":179,\\\"properties\\\":{\\\"text\\\":\\\"js\\\",\\\"options\\\":{\\\"codeType\\\":\\\"javascript\\\",\\\"code\\\":\\\"function main(params) {\\\\n  if(params.llmRes){\\\\n    let resLength  = params.llmRes.length\\\\n    params.llmRes = params.llmRes + \\'\\\\\\\\n字数：\\'+resLength\\\\n  }\\\\n  return {\\\\n    result: params.llmRes,\\\\n  }\\\\n}\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"llmRes\\\",\\\"nodeId\\\":\\\"160650416019521536\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"height\\\":158,\\\"width\\\":332}},{\\\"id\\\":\\\"160656278891560960\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1653,\\\"y\\\":449,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"js:{{res}}\\\\ngroovy:{{res1}}\\\\nkotlin:{{res2}}\\\\npython:{{res3}}\\\\naviator:{{res4}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"code_160652991133433856\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res1\\\",\\\"nodeId\\\":\\\"code_166081977564753920\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res2\\\",\\\"nodeId\\\":\\\"code_166090618376253440\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res3\\\",\\\"nodeId\\\":\\\"code_167828303175372800\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res4\\\",\\\"nodeId\\\":\\\"code_167835393352683520\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"code_166081977564753920\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":1140,\\\"y\\\":413,\\\"properties\\\":{\\\"text\\\":\\\"groovy\\\",\\\"options\\\":{\\\"codeType\\\":\\\"groovy\\\",\\\"code\\\":\\\"def main(params) {\\\\n    if (params.llmRes) {\\\\n        def resLength = params.llmRes.length()\\\\n        params.llmRes += \\\\\\\"\\\\\\\\n字数：\\\\\\\" + resLength\\\\n    }\\\\n    return [result: params.llmRes]\\\\n}\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"llmRes\\\",\\\"nodeId\\\":\\\"160650416019521536\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"height\\\":158,\\\"width\\\":332}},{\\\"id\\\":\\\"code_167835393352683520\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":1141,\\\"y\\\":667,\\\"properties\\\":{\\\"text\\\":\\\"aviator\\\",\\\"options\\\":{\\\"codeType\\\":\\\"aviator\\\",\\\"code\\\":\\\"let llmRes = params.llmRes;\\\\nlet resLength = length(llmRes);\\\\nlet  res = llmRes + \\\\\\\"\\\\\\\\n字数1：\\\\\\\" + resLength;\\\\nlet resp = seq.map(\\\\\\\"result\\\\\\\",res);\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"llmRes\\\",\\\"nodeId\\\":\\\"160650416019521536\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":158,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"160650416019521537\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"160650416019521536\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"160650416019521536_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":403},{\\\"x\\\":566,\\\"y\\\":403},{\\\"x\\\":427,\\\"y\\\":403},{\\\"x\\\":527,\\\"y\\\":403}]},{\\\"id\\\":\\\"160652991137628160\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160650416019521536\\\",\\\"targetNodeId\\\":\\\"code_160652991133433856\\\",\\\"sourceAnchorId\\\":\\\"160650416019521536_output\\\",\\\"targetAnchorId\\\":\\\"code_160652991133433856_input\\\",\\\"pointsList\\\":[{\\\"x\\\":859,\\\"y\\\":403},{\\\"x\\\":959,\\\"y\\\":403},{\\\"x\\\":869,\\\"y\\\":131},{\\\"x\\\":969,\\\"y\\\":131}]},{\\\"id\\\":\\\"160656278899949568\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_160652991133433856\\\",\\\"targetNodeId\\\":\\\"160656278891560960\\\",\\\"sourceAnchorId\\\":\\\"code_160652991133433856_output\\\",\\\"targetAnchorId\\\":\\\"160656278891560960_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1301,\\\"y\\\":131},{\\\"x\\\":1401,\\\"y\\\":131},{\\\"x\\\":1387,\\\"y\\\":412},{\\\"x\\\":1487,\\\"y\\\":412}]},{\\\"id\\\":\\\"166082001409372160\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160650416019521536\\\",\\\"targetNodeId\\\":\\\"code_166081977564753920\\\",\\\"sourceAnchorId\\\":\\\"160650416019521536_output\\\",\\\"targetAnchorId\\\":\\\"code_166081977564753920_input\\\",\\\"pointsList\\\":[{\\\"x\\\":859,\\\"y\\\":403},{\\\"x\\\":959,\\\"y\\\":403},{\\\"x\\\":874,\\\"y\\\":365},{\\\"x\\\":974,\\\"y\\\":365}]},{\\\"id\\\":\\\"166082017557442560\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_166081977564753920\\\",\\\"targetNodeId\\\":\\\"160656278891560960\\\",\\\"sourceAnchorId\\\":\\\"code_166081977564753920_output\\\",\\\"targetAnchorId\\\":\\\"160656278891560960_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1306,\\\"y\\\":365},{\\\"x\\\":1406,\\\"y\\\":365},{\\\"x\\\":1387,\\\"y\\\":412},{\\\"x\\\":1487,\\\"y\\\":412}]},{\\\"id\\\":\\\"167835393356877824\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160650416019521536\\\",\\\"targetNodeId\\\":\\\"code_167835393352683520\\\",\\\"sourceAnchorId\\\":\\\"160650416019521536_output\\\",\\\"targetAnchorId\\\":\\\"code_167835393352683520_input\\\",\\\"pointsList\\\":[{\\\"x\\\":859,\\\"y\\\":403},{\\\"x\\\":959,\\\"y\\\":403},{\\\"x\\\":875,\\\"y\\\":619},{\\\"x\\\":975,\\\"y\\\":619}]},{\\\"id\\\":\\\"167836988980817920\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_167835393352683520\\\",\\\"targetNodeId\\\":\\\"160656278891560960\\\",\\\"sourceAnchorId\\\":\\\"code_167835393352683520_output\\\",\\\"targetAnchorId\\\":\\\"160656278891560960_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1307,\\\"y\\\":619},{\\\"x\\\":1407,\\\"y\\\":619},{\\\"x\\\":1387,\\\"y\\\":412},{\\\"x\\\":1487,\\\"y\\\":412}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"}]}', NULL);\nINSERT INTO `airag_flow` VALUES ('1900021198960492546', 'jeecg', '2025-03-13 11:08:49', 'admin', '2025-11-27 16:49:13', 'A04', NULL, 'jeecg', '示例_回复节点', '', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/流程设计引擎_1742383594151.png', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'163122102386216960\\'),\\n    reply.tag(\\'163119312863678464\\'),\\n    llm.tag(\\'163122766768164864\\'),\\n    end.tag(\\'163119405809455104\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":232,\\\"y\\\":273,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"163119312863678464\\\",\\\"type\\\":\\\"reply\\\",\\\"x\\\":800,\\\"y\\\":225,\\\"properties\\\":{\\\"text\\\":\\\"直接回复\\\",\\\"options\\\":{\\\"content\\\":\\\"{{content}}\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"content\\\",\\\"nodeId\\\":\\\"163122102386216960\\\"}],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"163119405809455104\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1548,\\\"y\\\":254,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{resp}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"163122766768164864\\\"}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"163122102386216960\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":551,\\\"y\\\":553,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"根据用户的问题，以有趣的方式回答，如果可以的话请引用故事或经典说明。\\\\n\\\\n用中文回复。\\\\n\\\\n字数控制在200以内。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{content}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"163122766768164864\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1144,\\\"y\\\":412,\\\"properties\\\":{\\\"text\\\":\\\"nextQue\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"根据用户的问题和ai的回复，猜测用户下一次的问题可能有哪些，markdown格式回复。\\\\n格式：\\\\n\\\\\\\\n你可能还想知道：\\\\n* 问题一\\\\n* 问题二\\\\n。。。。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"用户问题：{{que}}\\\\nAI回复：{{res}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"que\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"163122102386216960\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":136,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"163122102390411264\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"163122102386216960\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"163122102386216960_input\\\",\\\"pointsList\\\":[{\\\"x\\\":398,\\\"y\\\":273},{\\\"x\\\":498,\\\"y\\\":273},{\\\"x\\\":285,\\\"y\\\":516},{\\\"x\\\":385,\\\"y\\\":516}]},{\\\"id\\\":\\\"163122147491762176\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"163122102386216960\\\",\\\"targetNodeId\\\":\\\"163119312863678464\\\",\\\"sourceAnchorId\\\":\\\"163122102386216960_output\\\",\\\"targetAnchorId\\\":\\\"163119312863678464_input\\\",\\\"pointsList\\\":[{\\\"x\\\":717,\\\"y\\\":516},{\\\"x\\\":817,\\\"y\\\":516},{\\\"x\\\":534,\\\"y\\\":225},{\\\"x\\\":634,\\\"y\\\":225}]},{\\\"id\\\":\\\"163122766772359168\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"163119312863678464\\\",\\\"targetNodeId\\\":\\\"163122766768164864\\\",\\\"sourceAnchorId\\\":\\\"163119312863678464_output\\\",\\\"targetAnchorId\\\":\\\"163122766768164864_input\\\",\\\"pointsList\\\":[{\\\"x\\\":966,\\\"y\\\":225},{\\\"x\\\":1066,\\\"y\\\":225},{\\\"x\\\":878,\\\"y\\\":375},{\\\"x\\\":978,\\\"y\\\":375}]},{\\\"id\\\":\\\"163123226145116160\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"163122766768164864\\\",\\\"targetNodeId\\\":\\\"163119405809455104\\\",\\\"sourceAnchorId\\\":\\\"163122766768164864_output\\\",\\\"targetAnchorId\\\":\\\"163119405809455104_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1310,\\\"y\\\":375},{\\\"x\\\":1410,\\\"y\\\":375},{\\\"x\\\":1282,\\\"y\\\":254},{\\\"x\\\":1382,\\\"y\\\":254}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"}]}', NULL);\nINSERT INTO `airag_flow` VALUES ('1900029596154232833', 'jeecg', '2025-03-13 11:42:11', 'admin', '2025-11-27 16:49:22', 'A04', NULL, 'jeecg', '示例_Http节点', '', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/流程设计(1)_1742383583093.png', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    http.tag(\\'163206941950185472\\'),\\n    SWITCH(switch.tag(\\'163207852529389568\\')).to(\\n        THEN(\\n            http.tag(\\'163128964742746112\\'),\\n            SWITCH(switch.tag(\\'168299837777608704\\')).to(\\n                end.tag(\\'163129833764786176\\'),\\n                end.tag(\\'168300140241453056\\')\\n            ).tag(\\'168299837777608704\\')\\n        ).tag(\\\"163128964742746112\\\"),\\n        end.tag(\\'163208186282741760\\')\\n    ).tag(\\'163207852529389568\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":51.13043478260868,\\\"y\\\":342.804347826087,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"大萨达撒\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":89,\\\"width\\\":332}},{\\\"id\\\":\\\"163128964742746112\\\",\\\"type\\\":\\\"http\\\",\\\"x\\\":859.0869565217391,\\\"y\\\":192.2173913043478,\\\"properties\\\":{\\\"text\\\":\\\"HTTP 请求 查询\\\",\\\"options\\\":{\\\"http\\\":{\\\"url\\\":\\\"{{domainURL}}/test/jeecgDemo/list\\\",\\\"method\\\":\\\"GET\\\",\\\"headers\\\":{},\\\"requestBody\\\":{\\\"type\\\":\\\"none\\\",\\\"body\\\":\\\"\\\"},\\\"requestParams\\\":{\\\"name\\\":\\\"{{name}}\\\",\\\"pageNo\\\":\\\"1\\\",\\\"pageSize\\\":\\\"10\\\"},\\\"timeout\\\":120}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"name\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"body\\\",\\\"name\\\":\\\"输出\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"statusCode\\\",\\\"name\\\":\\\"状态码\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"body.success\\\",\\\"name\\\":\\\"是否成功\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"body.result.records[0].id\\\",\\\"name\\\":\\\"id\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"163129833764786176\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1386.5217391304348,\\\"y\\\":164.08695652173913,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"新增的用户Id：{{id}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"body.result.records[0].id\\\",\\\"name\\\":\\\"id\\\",\\\"nodeId\\\":\\\"163128964742746112\\\"}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"163206941950185472\\\",\\\"type\\\":\\\"http\\\",\\\"x\\\":320.1304347826087,\\\"y\\\":474.2173913043478,\\\"properties\\\":{\\\"text\\\":\\\"HTTP 请求\\\",\\\"options\\\":{\\\"http\\\":{\\\"url\\\":\\\"{{domainURL}}/test/jeecgDemo/add\\\",\\\"method\\\":\\\"POST\\\",\\\"headers\\\":{},\\\"requestBody\\\":{\\\"type\\\":\\\"json\\\",\\\"body\\\":\\\"{\\\\n  \\\\\\\"name\\\\\\\": \\\\\\\"{{name}}\\\\\\\",\\\\n  \\\\\\\"keyWord\\\\\\\": \\\\\\\"example\\\\\\\",\\\\n  \\\\\\\"punchTime\\\\\\\": \\\\\\\"2023-10-05 14:48:00\\\\\\\",\\\\n  \\\\\\\"salaryMoney\\\\\\\": 1000.00,\\\\n  \\\\\\\"bonusMoney\\\\\\\": 500.0,\\\\n  \\\\\\\"sex\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n  \\\\\\\"age\\\\\\\": 30,\\\\n  \\\\\\\"birthday\\\\\\\": \\\\\\\"2023-10-05\\\\\\\",\\\\n  \\\\\\\"email\\\\\\\": \\\\\\\"john.doe@example.com\\\\\\\",\\\\n  \\\\\\\"content\\\\\\\": \\\\\\\"This is a test content.\\\\\\\",\\\\n}\\\"},\\\"requestParams\\\":{},\\\"timeout\\\":120}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"name\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"statusCode\\\",\\\"name\\\":\\\"code\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"body\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"163207852529389568\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":510.78260869565224,\\\"y\\\":302.73913043478257,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"163206941950185472\\\",\\\"field\\\":\\\"statusCode\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"200\\\"}],\\\"next\\\":\\\"163128964742746112\\\"}],\\\"else\\\":{\\\"next\\\":\\\"163208186282741760\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"height\\\":118,\\\"width\\\":332}},{\\\"id\\\":\\\"163208186282741760\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":745.7826086956521,\\\"y\\\":448.0869565217391,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"添加数据失败\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"168299837777608704\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":1029.173913043478,\\\"y\\\":314.78260869565213,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"163128964742746112\\\",\\\"field\\\":\\\"body.success\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"true\\\"}],\\\"next\\\":\\\"163129833764786176\\\"}],\\\"else\\\":{\\\"next\\\":\\\"168300140241453056\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"height\\\":118,\\\"width\\\":332}},{\\\"id\\\":\\\"168300140241453056\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1389.2608695652173,\\\"y\\\":419.8695652173913,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"添加用户失败\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"163206941954379776\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"163206941950185472\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"163206941950185472_input\\\",\\\"pointsList\\\":[{\\\"x\\\":217.1304347826091,\\\"y\\\":329.304347826087},{\\\"x\\\":317.1304347826091,\\\"y\\\":329.304347826087},{\\\"x\\\":54.13043478260869,\\\"y\\\":474.2173913043478},{\\\"x\\\":154.1304347826087,\\\"y\\\":474.2173913043478}]},{\\\"id\\\":\\\"163207852533583872\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"163206941950185472\\\",\\\"targetNodeId\\\":\\\"163207852529389568\\\",\\\"sourceAnchorId\\\":\\\"163206941950185472_output\\\",\\\"targetAnchorId\\\":\\\"163207852529389568_input\\\",\\\"pointsList\\\":[{\\\"x\\\":486.13043478260863,\\\"y\\\":474.2173913043478},{\\\"x\\\":586.1304347826085,\\\"y\\\":474.2173913043478},{\\\"x\\\":244.78260869565224,\\\"y\\\":274.73913043478257},{\\\"x\\\":344.78260869565224,\\\"y\\\":274.73913043478257}]},{\\\"id\\\":\\\"163208000881922048\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"163207852529389568\\\",\\\"targetNodeId\\\":\\\"163128964742746112\\\",\\\"sourceAnchorId\\\":\\\"163207852529389568_source_if\\\",\\\"targetAnchorId\\\":\\\"163128964742746112_input\\\",\\\"pointsList\\\":[{\\\"x\\\":676.7826086956521,\\\"y\\\":308.73913043478257},{\\\"x\\\":776.7826086956521,\\\"y\\\":308.73913043478257},{\\\"x\\\":593.0869565217391,\\\"y\\\":192.2173913043478},{\\\"x\\\":693.0869565217391,\\\"y\\\":192.2173913043478}]},{\\\"id\\\":\\\"163208186286936064\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"163207852529389568\\\",\\\"targetNodeId\\\":\\\"163208186282741760\\\",\\\"sourceAnchorId\\\":\\\"163207852529389568_source_else\\\",\\\"targetAnchorId\\\":\\\"163208186282741760_input\\\",\\\"pointsList\\\":[{\\\"x\\\":676.7826086956521,\\\"y\\\":334.73913043478257},{\\\"x\\\":776.7826086956521,\\\"y\\\":334.73913043478257},{\\\"x\\\":479.78260869565213,\\\"y\\\":448.0869565217391},{\\\"x\\\":579.7826086956521,\\\"y\\\":448.0869565217391}]},{\\\"id\\\":\\\"168299837781803008\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"163128964742746112\\\",\\\"targetNodeId\\\":\\\"168299837777608704\\\",\\\"sourceAnchorId\\\":\\\"163128964742746112_output\\\",\\\"targetAnchorId\\\":\\\"168299837777608704_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1025.086956521739,\\\"y\\\":192.2173913043478},{\\\"x\\\":1125.0869565217386,\\\"y\\\":192.2173913043478},{\\\"x\\\":763.173913043478,\\\"y\\\":286.78260869565213},{\\\"x\\\":863.173913043478,\\\"y\\\":286.78260869565213}]},{\\\"id\\\":\\\"168300025623707648\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168299837777608704\\\",\\\"targetNodeId\\\":\\\"163129833764786176\\\",\\\"sourceAnchorId\\\":\\\"168299837777608704_source_if\\\",\\\"targetAnchorId\\\":\\\"163129833764786176_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1195.1739130434776,\\\"y\\\":320.78260869565213},{\\\"x\\\":1295.1739130434776,\\\"y\\\":320.78260869565213},{\\\"x\\\":1120.5217391304348,\\\"y\\\":164.08695652173913},{\\\"x\\\":1220.5217391304348,\\\"y\\\":164.08695652173913}]},{\\\"id\\\":\\\"168300140245647360\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168299837777608704\\\",\\\"targetNodeId\\\":\\\"168300140241453056\\\",\\\"sourceAnchorId\\\":\\\"168299837777608704_source_else\\\",\\\"targetAnchorId\\\":\\\"168300140241453056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1195.1739130434776,\\\"y\\\":346.78260869565213},{\\\"x\\\":1295.1739130434776,\\\"y\\\":346.78260869565213},{\\\"x\\\":1123.2608695652173,\\\"y\\\":419.8695652173913},{\\\"x\\\":1223.2608695652173,\\\"y\\\":419.8695652173913}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"}]}', NULL);\nINSERT INTO `airag_flow` VALUES ('1902263524520935425', 'jeecg', '2025-03-19 15:39:01', 'admin', '2025-11-27 16:52:31', 'A04', NULL, 'jeecg', 'AI看图说话', '', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/工具-图片解析_1743065064801.png', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'165363942517174272\\'),\\n    llm.tag(\\'168280528419778560\\'),\\n    end.tag(\\'165364368465522688\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":457,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"165363942517174272\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":675,\\\"y\\\":341,\\\"properties\\\":{\\\"text\\\":\\\"图片解读\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你是一个图像分析专家，负责解读和解释用户发送的图片。请根据以下要求进行分析：\\\\n\\\\n## 目标：\\\\n分析并解释图片的意义，提供详细的解读和背景信息。\\\\n\\\\n## 技能：\\\\n1. 视觉识别能力：能够识别图像中的元素及其关系。\\\\n2. 上下文理解能力：结合文化、历史、艺术等背景知识进行深度解读。\\\\n3. 清晰表达能力：用简洁明了的语言传达分析结果。\\\\n\\\\n## 工作流：\\\\n1. 识别图片中的主要元素，描述它们的外观和特征。\\\\n2. 分析这些元素之间的关系及其在整体构图中的作用。\\\\n3. 提供与图片相关的背景信息，探讨其潜在意义和影响。\\\\n\\\\n## 输出格式：\\\\n- 图片元素描述\\\\n- 元素关系分析\\\\n- 背景信息与意义解释\\\\n\\\\n## 限制：\\\\n- 不提供主观判断，仅基于客观分析进行解释。\\\\n- 不涉及任何隐私或敏感内容的讨论。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"分析并解释图片的意义，提供详细的解读和背景信息。\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"que\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"images\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"165364368465522688\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1520,\\\"y\\\":426,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{resp}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"168280528419778560\\\"}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"168280528419778560\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1063,\\\"y\\\":588,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你将扮演一个故事创作者，以下是关于这个角色的详细设定，请根据这些信息来构建你的回答。\\\\n\\\\n**人物基本信息：**\\\\n- 你是：一个富有想象力和创造力的故事编写者\\\\n- 人称：第一人称\\\\n- 出身背景与上下文：擅长根据不同的元素与情境构建引人入胜的故事，灵感来源于观察与分析\\\\n**性格特点：**\\\\n- 富有创造力\\\\n- 敏感细腻\\\\n- 善于捕捉细节\\\\n**语言风格：**\\\\n- 优雅而富有表现力，能够生动描绘场景与人物情感\\\\n**人际关系：**\\\\n- 与其他艺术创作者合作，互相激励\\\\n**过往经历：**\\\\n- 多次参与文学比赛并获奖，积累了丰富的创作经验\\\\n**经典台词或口头禅：**\\\\n- \\\\\\\"每一个画面背后都有一个故事在等待被讲述。\\\\\\\"\\\\n- \\\\\\\"细节决定成败。\\\\\\\"\\\\n\\\\n要求： \\\\n- 故事应围绕从图片分析得出的主题和情感进行展开。\\\\n- 包含鲜明的人物、情节以及转折。\\\\n- 语言生动形象，能够引起读者的共鸣。\\\\n- 直接讲故事，不要提及图片。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{readImg}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"readImg\\\",\\\"nodeId\\\":\\\"165363942517174272\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":136,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"165363942525562880\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"165363942517174272\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"165363942517174272_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":457},{\\\"x\\\":566,\\\"y\\\":457},{\\\"x\\\":409,\\\"y\\\":304},{\\\"x\\\":509,\\\"y\\\":304}]},{\\\"id\\\":\\\"168280528428167168\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"165363942517174272\\\",\\\"targetNodeId\\\":\\\"168280528419778560\\\",\\\"sourceAnchorId\\\":\\\"165363942517174272_output\\\",\\\"targetAnchorId\\\":\\\"168280528419778560_input\\\",\\\"pointsList\\\":[{\\\"x\\\":841,\\\"y\\\":304},{\\\"x\\\":941,\\\"y\\\":304},{\\\"x\\\":797,\\\"y\\\":551},{\\\"x\\\":897,\\\"y\\\":551}]},{\\\"id\\\":\\\"168280631234752512\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168280528419778560\\\",\\\"targetNodeId\\\":\\\"165364368465522688\\\",\\\"sourceAnchorId\\\":\\\"168280528419778560_output\\\",\\\"targetAnchorId\\\":\\\"165364368465522688_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1229,\\\"y\\\":551},{\\\"x\\\":1329,\\\"y\\\":551},{\\\"x\\\":1254,\\\"y\\\":426},{\\\"x\\\":1354,\\\"y\\\":426}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\"}]}', NULL);\nINSERT INTO `airag_flow` VALUES ('1904779811574784002', 'jeecg', '2025-03-26 14:17:51', 'admin', '2025-11-27 16:45:18', 'A04', NULL, 'jeecg', '示例_OCR', '', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/1dataOCR_1743065089791.png', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'167880707187527680\\')).to(\\n        end.tag(\\'167880856269869056\\'),\\n        THEN(\\n            code_167881149430747136.tag(\\'code_167881149430747136\\'),\\n            llm.tag(\\'167881839356006400\\'),\\n            end.tag(\\'167880661561888768\\')\\n        ).tag(\\\"code_167881149430747136\\\")\\n    ).tag(\\'167880707187527680\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":420,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"height\\\":90,\\\"width\\\":332}},{\\\"id\\\":\\\"167880661561888768\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1474,\\\"y\\\":341,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\",\\\"outputType\\\":\\\"default\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"data\\\",\\\"nodeId\\\":\\\"167881839356006400\\\"}],\\\"height\\\":112,\\\"width\\\":332}},{\\\"id\\\":\\\"167880707187527680\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":681,\\\"y\\\":232,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"images\\\",\\\"operator\\\":\\\"EMPTY\\\",\\\"value\\\":\\\"\\\",\\\"type\\\":\\\"picture\\\"}],\\\"next\\\":\\\"167880856269869056\\\"}],\\\"else\\\":{\\\"next\\\":\\\"code_167881149430747136\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"height\\\":116,\\\"width\\\":332}},{\\\"id\\\":\\\"167880856269869056\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1207,\\\"y\\\":206,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{\\\\n    \\\\\\\"message\\\\\\\": \\\\\\\"请提供图片\\\\\\\"\\\\n  }\\\",\\\"outputType\\\":\\\"text\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"height\\\":112,\\\"width\\\":332}},{\\\"id\\\":\\\"code_167881149430747136\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":937,\\\"y\\\":458,\\\"properties\\\":{\\\"text\\\":\\\"脚本执行\\\",\\\"options\\\":{\\\"codeType\\\":\\\"groovy\\\",\\\"code\\\":\\\"def main(Map params) {\\\\n    def newQuestion = params.question\\\\n    if (!params.question) {\\\\n        newQuestion = \\\\\\\"从图片中提取文字\\\\\\\"\\\\n    }\\\\n    return [result: newQuestion]\\\\n}\\\\n\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":156,\\\"width\\\":332}},{\\\"id\\\":\\\"167881839356006400\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1318,\\\"y\\\":605,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：OCR工具\\\\n作为一个智能OCR工具，你的主要职责是从图片中提取文字并将其输出为结构化数据。\\\\n## 目标：\\\\n1. 精确识别和提取图片中的文字信息。\\\\n2. 将提取的文字转换为结构化数据格式。\\\\n## 技能：\\\\n1. 高效的图像处理能力。\\\\n2. 精确的文字识别算法。\\\\n3. 数据格式化与输出能力。\\\\n## 工作流：\\\\n1. 输入图片，进行预处理（如去噪、二值化）。\\\\n2. 应用OCR算法识别图片中的文字，并记录识别结果。\\\\n3. 将识别的文字整理成结构化数据格式，如JSON或CSV。\\\\n## 输出格式：必须严格遵循以下JSON格式，不得添加任何额外字段或自由文本。\\\\n\\\\n{\\\\n    \\\\\\\"text\\\\\\\": \\\\\\\"提取的内容\\\\\\\",\\\\n    \\\\\\\"metadata\\\\\\\": {\\\\\\\"source\\\\\\\": \\\\\\\"图片来源\\\\\\\", \\\\\\\"timestamp\\\\\\\": \\\\\\\"提取时间\\\\\\\"}\\\\n  }\\\\n## 限制：\\\\n- 仅限于合法和合规的图片内容提取。\\\\n- 不得保存用户上传的图片数据。\\\\n- 需确保输出的数据准确无误，标注所有数据来源。\\\\n- 输出必须严格符合上述格式，字段名和层级结构不得随意更改。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{question}}\\\"}],\\\"showToolExecution\\\":false},\\\"inputParams\\\":[{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"images\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"picture\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"code_167881149430747136\\\",\\\"customValue\\\":\\\"\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":178,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"167880707195916288\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"167880707187527680\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"167880707187527680_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":406},{\\\"x\\\":566,\\\"y\\\":406},{\\\"x\\\":415,\\\"y\\\":205},{\\\"x\\\":515,\\\"y\\\":205}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"167880856274063360\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"167880707187527680\\\",\\\"targetNodeId\\\":\\\"167880856269869056\\\",\\\"sourceAnchorId\\\":\\\"167880707187527680_source_if\\\",\\\"targetAnchorId\\\":\\\"167880856269869056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":847,\\\"y\\\":239},{\\\"x\\\":947,\\\"y\\\":239},{\\\"x\\\":941,\\\"y\\\":181},{\\\"x\\\":1041,\\\"y\\\":181}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"167881149434941440\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"167880707187527680\\\",\\\"targetNodeId\\\":\\\"code_167881149430747136\\\",\\\"sourceAnchorId\\\":\\\"167880707187527680_source_else\\\",\\\"targetAnchorId\\\":\\\"code_167881149430747136_input\\\",\\\"pointsList\\\":[{\\\"x\\\":847,\\\"y\\\":265},{\\\"x\\\":947,\\\"y\\\":265},{\\\"x\\\":671,\\\"y\\\":411},{\\\"x\\\":771,\\\"y\\\":411}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"167881839356006401\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_167881149430747136\\\",\\\"targetNodeId\\\":\\\"167881839356006400\\\",\\\"sourceAnchorId\\\":\\\"code_167881149430747136_output\\\",\\\"targetAnchorId\\\":\\\"167881839356006400_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1103,\\\"y\\\":411},{\\\"x\\\":1203,\\\"y\\\":411},{\\\"x\\\":1052,\\\"y\\\":547},{\\\"x\\\":1152,\\\"y\\\":547}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"167882293611712512\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"167881839356006400\\\",\\\"targetNodeId\\\":\\\"167880661561888768\\\",\\\"sourceAnchorId\\\":\\\"167881839356006400_output\\\",\\\"targetAnchorId\\\":\\\"167880661561888768_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1484,\\\"y\\\":547},{\\\"x\\\":1584,\\\"y\\\":547},{\\\"x\\\":1208,\\\"y\\\":316},{\\\"x\\\":1308,\\\"y\\\":316}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"data\\\",\\\"nodeId\\\":\\\"167881839356006400\\\"},{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', NULL);\nINSERT INTO `airag_flow` VALUES ('1905158829855784962', 'jeecg', '2025-03-27 15:23:56', 'jeecg', '2025-03-27 16:29:22', 'A04', NULL, 'jeecg', '示例_翻译', '', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/翻译_1743060940605.png', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'168262809717821440\\')).to(\\n        end.tag(\\'168259683329757184\\'),\\n        THEN(\\n            SWITCH(classifier.tag(\\'168263048935755776\\')).to(\\n                llm.tag(\\'168263321821368320\\'),\\n                llm.tag(\\'168263346282549248\\')\\n            ).tag(\\'168263048935755776\\'),\\n            end.tag(\\'168263794896916480\\')\\n        ).tag(\\\"168263048935755776\\\")\\n    ).tag(\\'168262809717821440\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":457,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"168259683329757184\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1090,\\\"y\\\":150,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"data\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"168262809717821440\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":701,\\\"y\\\":281,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"operator\\\":\\\"EMPTY\\\",\\\"value\\\":\\\"\\\"}],\\\"next\\\":\\\"168259683329757184\\\"}],\\\"else\\\":{\\\"next\\\":\\\"168263048935755776\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"height\\\":118,\\\"width\\\":332}},{\\\"id\\\":\\\"168263048935755776\\\",\\\"type\\\":\\\"classifier\\\",\\\"x\\\":1086,\\\"y\\\":381,\\\"properties\\\":{\\\"text\\\":\\\"分类器\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.2}},\\\"categories\\\":[{\\\"category\\\":\\\"是中文\\\",\\\"next\\\":\\\"168263321821368320\\\"}],\\\"else\\\":{\\\"next\\\":\\\"168263346282549248\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"分类内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":118,\\\"width\\\":332}},{\\\"id\\\":\\\"168263321821368320\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1513,\\\"y\\\":292,\\\"properties\\\":{\\\"text\\\":\\\"翻译成英文\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.3}},\\\"history\\\":1,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"将用户输入完整翻译成英文，包括所有语气词和重复表达\\\\n- 严格保留原始语序和强调成分\\\\n- 禁止省略任何字词或改变语气强度\\\\n- 直接输出翻译结果不做解释\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{content}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"168263346282549248\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1514,\\\"y\\\":489,\\\"properties\\\":{\\\"text\\\":\\\"翻译成中文\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.3}},\\\"history\\\":1,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"将用户输入完整翻译成中文，包括所有语气词和重复表达\\\\n- 严格保留原始语序和强调成分\\\\n- 禁止省略任何字词或改变语气强度\\\\n- 直接输出翻译结果不做解释\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{content}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"168263794896916480\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1982,\\\"y\\\":360,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{dataC}}{{dataE}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"dataC\\\",\\\"nodeId\\\":\\\"168263346282549248\\\"},{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"dataE\\\",\\\"nodeId\\\":\\\"168263321821368320\\\"}],\\\"height\\\":62,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"168262809722015744\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"168262809717821440\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"168262809717821440_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":457},{\\\"x\\\":566,\\\"y\\\":457},{\\\"x\\\":435,\\\"y\\\":253},{\\\"x\\\":535,\\\"y\\\":253}]},{\\\"id\\\":\\\"168262871336341504\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168262809717821440\\\",\\\"targetNodeId\\\":\\\"168259683329757184\\\",\\\"sourceAnchorId\\\":\\\"168262809717821440_source_if\\\",\\\"targetAnchorId\\\":\\\"168259683329757184_input\\\",\\\"pointsList\\\":[{\\\"x\\\":867,\\\"y\\\":287},{\\\"x\\\":967,\\\"y\\\":287},{\\\"x\\\":824,\\\"y\\\":150},{\\\"x\\\":924,\\\"y\\\":150}]},{\\\"id\\\":\\\"168263048939950080\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168262809717821440\\\",\\\"targetNodeId\\\":\\\"168263048935755776\\\",\\\"sourceAnchorId\\\":\\\"168262809717821440_source_else\\\",\\\"targetAnchorId\\\":\\\"168263048935755776_input\\\",\\\"pointsList\\\":[{\\\"x\\\":867,\\\"y\\\":313},{\\\"x\\\":967,\\\"y\\\":313},{\\\"x\\\":820,\\\"y\\\":353},{\\\"x\\\":920,\\\"y\\\":353}]},{\\\"id\\\":\\\"168263321825562624\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168263048935755776\\\",\\\"targetNodeId\\\":\\\"168263321821368320\\\",\\\"sourceAnchorId\\\":\\\"168263048935755776_case_1\\\",\\\"targetAnchorId\\\":\\\"168263321821368320_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1252,\\\"y\\\":387},{\\\"x\\\":1352,\\\"y\\\":387},{\\\"x\\\":1247,\\\"y\\\":255},{\\\"x\\\":1347,\\\"y\\\":255}]},{\\\"id\\\":\\\"168263346286743552\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168263048935755776\\\",\\\"targetNodeId\\\":\\\"168263346282549248\\\",\\\"sourceAnchorId\\\":\\\"168263048935755776_case_else\\\",\\\"targetAnchorId\\\":\\\"168263346282549248_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1252,\\\"y\\\":413},{\\\"x\\\":1352,\\\"y\\\":413},{\\\"x\\\":1248,\\\"y\\\":452},{\\\"x\\\":1348,\\\"y\\\":452}]},{\\\"id\\\":\\\"168263794901110784\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168263346282549248\\\",\\\"targetNodeId\\\":\\\"168263794896916480\\\",\\\"sourceAnchorId\\\":\\\"168263346282549248_output\\\",\\\"targetAnchorId\\\":\\\"168263794896916480_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1680,\\\"y\\\":452},{\\\"x\\\":1780,\\\"y\\\":452},{\\\"x\\\":1716,\\\"y\\\":360},{\\\"x\\\":1816,\\\"y\\\":360}]},{\\\"id\\\":\\\"168263831215394816\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168263321821368320\\\",\\\"targetNodeId\\\":\\\"168263794896916480\\\",\\\"sourceAnchorId\\\":\\\"168263321821368320_output\\\",\\\"targetAnchorId\\\":\\\"168263794896916480_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1679,\\\"y\\\":255},{\\\"x\\\":1779,\\\"y\\\":255},{\\\"x\\\":1716,\\\"y\\\":360},{\\\"x\\\":1816,\\\"y\\\":360}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"data\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"}]}', NULL);\nINSERT INTO `airag_flow` VALUES ('1905189468558671874', 'jeecg', '2025-03-27 17:25:41', 'admin', '2025-11-27 16:48:47', 'A04', NULL, 'jeecg', 'PMP考试宝典', '', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/pmp_1743067580648.png', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    WHEN(\\n        knowledge.tag(\\'168290518600351744\\'),\\n        llm.tag(\\'168290871702028288\\')\\n    ).tag(\\\"168290518600351744\\\"),\\n    llm.tag(\\'168290861241434112\\'),\\n    end.tag(\\'168290315671535616\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":397,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"168290315671535616\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1644,\\\"y\\\":348,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{res}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"168290861241434112\\\"}],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"168290518600351744\\\",\\\"type\\\":\\\"knowledge\\\",\\\"x\\\":693,\\\"y\\\":209,\\\"properties\\\":{\\\"text\\\":\\\"知识库\\\",\\\"options\\\":{\\\"knowIds\\\":[\\\"1905186756806918146\\\"],\\\"topNumber\\\":5,\\\"similarity\\\":0.7},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"documents\\\",\\\"name\\\":\\\"文档列表\\\",\\\"type\\\":\\\"object[]\\\"},{\\\"field\\\":\\\"data\\\",\\\"name\\\":\\\"文档内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"168290861241434112\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1181,\\\"y\\\":350,\\\"properties\\\":{\\\"text\\\":\\\"总结LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.4}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你是一个智能知识助手，旨在综合知识库和大型语言模型(LLM)的返回数据，以高效、准确地回答用户提出的问题。请遵循以下要求：\\\\n\\\\n## 目标：\\\\n- 提供准确、相关且易于理解的回答，结合知识库和LLM的信息。\\\\n\\\\n## 技能：\\\\n1. 能够快速检索并整合来自不同知识库的信息。\\\\n2. 理解用户问题的上下文，并提供清晰的答案。\\\\n3. 具备自然语言处理能力，以便流畅表达复杂信息。\\\\n\\\\n## 工作流：\\\\n1. 接收用户问题并进行解析，识别关键要素。\\\\n2. 从综合知识库和LLM中获取相关数据，确保信息的准确性和完整性。\\\\n3. 将获取的信息进行整合，形成清晰、简洁的回答。\\\\n\\\\n## 输出格式：\\\\n- 每次回答应以简洁明了的句子呈现，必要时可以添加示例或补充信息。\\\\n\\\\n## 限制：\\\\n- 不得提供未经验证的信息或个人隐私数据。\\\\n- 所有数据需标注来源，不确定信息用[需核实]标记。\\\\n- 自动过滤涉及偏见或违法内容，替换为[合规表达]。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"知识库返回数据：{{knowRes}}\\\\n\\\\nLLM返回数据：{{llmRes}}\\\\n用户问题：{{userQue}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"data\\\",\\\"name\\\":\\\"knowRes\\\",\\\"nodeId\\\":\\\"168290518600351744\\\"},{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"llmRes\\\",\\\"nodeId\\\":\\\"168290871702028288\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"userQue\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":166,\\\"width\\\":332}},{\\\"id\\\":\\\"168290871702028288\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":692,\\\"y\\\":521,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：PMP知识专家\\\\nPMP知识专家致力于项目管理知识的传播与应用，帮助项目经理提升技能和管理能力。\\\\n\\\\n## 目标：\\\\n1. 为项目管理提供权威的知识支持。\\\\n2. 帮助项目经理解决在项目管理中遇到的实际问题。\\\\n\\\\n## 技能：\\\\n1. 精通项目管理的各项理论和工具。\\\\n2. 熟悉PMP认证流程及考试内容。\\\\n3. 能够进行项目风险评估与管理。\\\\n\\\\n## 工作流：\\\\n1. 评估项目经理的需求与挑战，识别关键问题。\\\\n2. 提供相关的项目管理知识、工具和最佳实践建议。\\\\n3. 指导项目经理制定和实施有效的项目管理计划。\\\\n\\\\n## 输出格式：\\\\n- 提供清晰的建议与解决方案，使用简洁明了的语言，适合项目经理理解和应用。\\\\n\\\\n## 限制：\\\\n- 所有建议需基于现有的PMP知识体系，避免个人主观意见。\\\\n- 不得提供未经验证的信息或数据，所有数据需标注来源，需核实的信息用[需核实]标记。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":166,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"168290518604546048\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"168290518600351744\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"168290518600351744_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":382},{\\\"x\\\":566,\\\"y\\\":382},{\\\"x\\\":427,\\\"y\\\":194},{\\\"x\\\":527,\\\"y\\\":194}]},{\\\"id\\\":\\\"168290861245628416\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168290518600351744\\\",\\\"targetNodeId\\\":\\\"168290861241434112\\\",\\\"sourceAnchorId\\\":\\\"168290518600351744_output\\\",\\\"targetAnchorId\\\":\\\"168290861241434112_input\\\",\\\"pointsList\\\":[{\\\"x\\\":859,\\\"y\\\":194},{\\\"x\\\":959,\\\"y\\\":194},{\\\"x\\\":915,\\\"y\\\":298},{\\\"x\\\":1015,\\\"y\\\":298}]},{\\\"id\\\":\\\"168290871706222592\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"168290871702028288\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"168290871702028288_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":382},{\\\"x\\\":566,\\\"y\\\":382},{\\\"x\\\":426,\\\"y\\\":469},{\\\"x\\\":526,\\\"y\\\":469}]},{\\\"id\\\":\\\"168291272883011584\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168290871702028288\\\",\\\"targetNodeId\\\":\\\"168290861241434112\\\",\\\"sourceAnchorId\\\":\\\"168290871702028288_output\\\",\\\"targetAnchorId\\\":\\\"168290861241434112_input\\\",\\\"pointsList\\\":[{\\\"x\\\":858,\\\"y\\\":469},{\\\"x\\\":958,\\\"y\\\":469},{\\\"x\\\":915,\\\"y\\\":298},{\\\"x\\\":1015,\\\"y\\\":298}]},{\\\"id\\\":\\\"168292930635530240\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168290861241434112\\\",\\\"targetNodeId\\\":\\\"168290315671535616\\\",\\\"sourceAnchorId\\\":\\\"168290861241434112_output\\\",\\\"targetAnchorId\\\":\\\"168290315671535616_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1347,\\\"y\\\":298},{\\\"x\\\":1447,\\\"y\\\":298},{\\\"x\\\":1378,\\\"y\\\":333},{\\\"x\\\":1478,\\\"y\\\":333}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"}]}', NULL);\nINSERT INTO `airag_flow` VALUES ('1909856345692065793', 'jeecg', '2025-04-09 14:30:11', 'admin', '2025-11-27 16:48:39', 'A04', NULL, 'jeecg', '积木报表AI引擎', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'173365501230346240\\')).to(\\n        THEN(\\n            llm.tag(\\'172956395755208704\\'),\\n            end.tag(\\'172957153284259840\\')\\n        ).tag(\\\"172956395755208704\\\"),\\n        THEN(\\n            llm.tag(\\'173365800833675264\\'),\\n            end.tag(\\'173366253646540800\\')\\n        ).tag(\\\"173365800833675264\\\"),\\n        end.tag(\\'173366439085109248\\'),\\n        THEN(\\n            llm.tag(\\'175149164433014784\\'),\\n            end.tag(\\'175153953988444160\\')\\n        ).tag(\\\"175149164433014784\\\"),\\n        THEN(\\n            llm.tag(\\'175505963485245440\\'),\\n            end.tag(\\'175506006644633600\\')\\n        ).tag(\\\"175505963485245440\\\"),\\n        THEN(\\n            llm.tag(\\'175807569594040320\\'),\\n            end.tag(\\'175808663015538688\\')\\n        ).tag(\\\"175807569594040320\\\"),\\n        THEN(\\n            llm.tag(\\'221504502491222016\\'),\\n            end.tag(\\'221512800426758144\\')\\n        ).tag(\\\"221504502491222016\\\"),\\n        THEN(\\n            llm.tag(\\'223992240450801664\\'),\\n            end.tag(\\'223993058876952576\\')\\n        ).tag(\\\"223992240450801664\\\")\\n    ).tag(\\'173365501230346240\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":262,\\\"y\\\":458,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"表结构\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"dbtype\\\",\\\"name\\\":\\\"数据库类型\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"bizType\\\",\\\"name\\\":\\\"业务类型\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"172956395755208704\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1166,\\\"y\\\":160,\\\"properties\\\":{\\\"text\\\":\\\"生成sql\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：SQL生成助手\\\\n你是一个专业的SQL语句生成工具，能够根据用户提供的描述和表结构自动生成高效的SQL查询语句。\\\\n\\\\n## 目标：\\\\n- 根据用户的描述生成准确的SQL查询语句。\\\\n\\\\n## 技能：\\\\n1. 理解用户提供的需求和表结构。\\\\n2. 自动构建符合SQL语法的查询语句。\\\\n3. 优化生成的SQL以提高执行效率。\\\\n\\\\n## 工作流：\\\\n1. 接收用户描述和表结构信息。\\\\n2. 分析用户需求，确定所需的SQL操作类型（如查询、插入、更新、删除）。\\\\n3. 根据分析结果生成相应的SQL语句。\\\\n\\\\n## 输出格式：\\\\n- 生成的SQL语句应为标准格式，如：SELECT * FROM table_name ;\\\\n- 将输出的SQL语句格式化\\\\n- 只输出sql语句，不要额外解释，不要md语法，不要换行符，不要有sql注释。\\\\n\\\\n## 限制：\\\\n\\\\n- 除非明确说明，否则不要生成查询条件\\\\n- 确保生成的SQL语句符合数据库的语法要求，确保sql能直接执行。\\\\n- 确保字段和表能正确对应。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"表结构：\\\\n{{ddl}}\\\\n---------\\\\n数据库类型：\\\\n{{dbtype}}\\\\n----------\\\\n需求：\\\\n{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"dbtype\\\",\\\"name\\\":\\\"dbtype\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"172957153284259840\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":129,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"sql\\\",\\\"nodeId\\\":\\\"172956395755208704\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"173365501230346240\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":688,\\\"y\\\":575,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"genSql\\\"}],\\\"next\\\":\\\"172956395755208704\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"genJsonRows\\\"}],\\\"next\\\":\\\"173365800833675264\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"chooseTables\\\"}],\\\"next\\\":\\\"175149164433014784\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"genChart\\\"}],\\\"next\\\":\\\"175505963485245440\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"intentCheck\\\"}],\\\"next\\\":\\\"175807569594040320\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"designReport\\\"}],\\\"next\\\":\\\"221504502491222016\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"genPrompt\\\"}],\\\"next\\\":\\\"223992240450801664\\\"}],\\\"else\\\":{\\\"next\\\":\\\"173366439085109248\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"height\\\":274,\\\"width\\\":332}},{\\\"id\\\":\\\"173365800833675264\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1167,\\\"y\\\":368,\\\"properties\\\":{\\\"text\\\":\\\"生成rows\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你是一个 **“在线报表 JSON 生成器”**，能够理解用户描述及数据集，并生成符合规范的 **合法 JSON**。  \\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 工作流程\\\\n\\\\n\\\\n### 步骤一：数据集选择  \\\\n1. 读取用户提供的数据集结构。  \\\\n2. 根据需求从中选定一个数据集。  \\\\n3. 后续只能使用选定数据集的字段。  \\\\n\\\\n\\\\n### 步骤二：报表设计  \\\\n根据用户需求与数据集，输出报表的结构信息：  \\\\n- 行号、列号（从0开始）  \\\\n- 单元格内容（文字或数据集占位符）  \\\\n- 单元格样式（引用样式索引）  \\\\n- 合并单元格信息  \\\\n\\\\n\\\\n### 步骤三：生成报表 JSON  \\\\n使用步骤二的描述生成完整 JSON。  \\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 输出要求\\\\n1. **输出必须是合法 JSON**，能直接 `JSON.parse()`。  \\\\n2. 必须包含以下部分：  \\\\n   - `\\\\\\\"styles\\\\\\\"`：样式数组，每种样式单独定义，在单元格中用索引引用。  \\\\n   - `\\\\\\\"merges\\\\\\\"`：合并单元格范围（如 `\\\\\\\"D3:E4\\\\\\\"`）。  \\\\n   - `\\\\\\\"rows\\\\\\\"`：行数据，每行包含 `cells`，每个 `cell` 可有：  \\\\n     - `\\\\\\\"text\\\\\\\"`：文字或占位符（`${}` 对象，`#{}` 集合）  \\\\n     - `\\\\\\\"style\\\\\\\"`：引用 `styles` 索引  \\\\n     - `\\\\\\\"merge\\\\\\\"`：合并范围 `[纵向合并格数, 横向合并格数]`  \\\\n     - `\\\\\\\"height\\\\\\\"`：行高  \\\\n   - `\\\\\\\"cols\\\\\\\"`：列宽配置  \\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 样式规则\\\\n- 样式在 `\\\\\\\"styles\\\\\\\"` 中定义：  \\\\n  - `font`：字体\\\\n    - `bold`: 是否加粗（如：`true`）\\\\n    - `italic`: 是否斜体（如：`true`）\\\\n    - `size`: 字体大小单位pt,默认10\\\\n  - `underline`: 下划线（如：`true`）\\\\n  - `strike`: 删除线（如：`true`）\\\\n  - `color`（字体颜色）  \\\\n  - `bgcolor`（背景色）  \\\\n  - `align`（left/center/right）  \\\\n  - `valign`（top/middle/bottom）  \\\\n  - `textwrap`（自动换行）  \\\\n  - `border`\\\\n    - `top`：上边框（如 `[\\\\\\\"thin\\\\\\\",\\\\\\\"#000\\\\\\\"]`）  \\\\n    - `bottom`：下边框（如 `[\\\\\\\"thin\\\\\\\",\\\\\\\"#000\\\\\\\"]`）  \\\\n    - `left`：左边框（如 `[\\\\\\\"thin\\\\\\\",\\\\\\\"#000\\\\\\\"]`）  \\\\n    - `right`：右边框（如 `[\\\\\\\"thin\\\\\\\",\\\\\\\"#000\\\\\\\"]`）  \\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 数据集规则\\\\n示例：\\\\n```json\\\\n{\\\\n  \\\\\\\"code\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n  \\\\\\\"title\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n  \\\\\\\"isList\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n  \\\\\\\"children\\\\\\\": [\\\\n    { \\\\\\\"title\\\\\\\": \\\\\\\"total_sales\\\\\\\", \\\\\\\"fieldText\\\\\\\": \\\\\\\"总销量\\\\\\\" },\\\\n    { \\\\\\\"title\\\\\\\": \\\\\\\"total_returns\\\\\\\", \\\\\\\"fieldText\\\\\\\": \\\\\\\"总退货数量\\\\\\\" }\\\\n  ]\\\\n}\\\\n```\\\\n- `code`：数据集变量名  \\\\n- `isList = 1`：集合  \\\\n- `isList = 0`：对象  \\\\n- `children`：字段，含 `title`（字段名）、`fieldText`（展示名）  \\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 行列与填充规则\\\\n- 行号、列号从0开始。  \\\\n- `\\\\\\\"cols\\\\\\\"` 设置列宽。  \\\\n- **集合 (`isList=1`)**：  \\\\n  - 一行字段标题（children.fieldText）  \\\\n  - 下一行字段占位符（`#{code.title}`）  \\\\n- **对象 (`isList=0`)**：  \\\\n  - 每字段占两列：左列为标题，右列为占位符 `${code.title}`  \\\\n  - 可按组横向排列  \\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 合并规则\\\\n- `\\\\\\\"merge\\\\\\\": [纵向合并格数, 横向合并格数]`  \\\\n  - 纵向合并格数与横向合并格数是不包含当前单元格的数量（如 纵向合并格数 等于1 就是向下合并一行；横向合并格数同理）\\\\n- 被合并覆盖的单元格无需再定义  \\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 特别说明\\\\n- JSON 必须 **纯净**：无注释、无 markdown、无省略号。  \\\\n- 用户指定的样式不能改动，可在此基础上做美化。\\\\n- 除非用户明确要求，默认都对生成的报表做基础美化（如增加边框、设置字体、设置背景色）\\\\n- 用户描述的行列序号需 **减一** 转换为下标。  \\\\n- 仅生成一份报表 JSON。  \\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 示例\\\\n```json\\\\n{\\\\n  \\\\\\\"styles\\\\\\\": [\\\\n    { \\\\\\\"font\\\\\\\": { \\\\\\\"bold\\\\\\\": true } },\\\\n    { \\\\\\\"color\\\\\\\": \\\\\\\"#ff0000\\\\\\\" }\\\\n  ],\\\\n  \\\\\\\"rows\\\\\\\": {\\\\n    \\\\\\\"0\\\\\\\": {\\\\n      \\\\\\\"cells\\\\\\\": {\\\\n        \\\\\\\"0\\\\\\\": { \\\\\\\"text\\\\\\\": \\\\\\\"加粗文字\\\\\\\", \\\\\\\"style\\\\\\\": 0 },\\\\n        \\\\\\\"1\\\\\\\": { \\\\\\\"text\\\\\\\": \\\\\\\"红色文字\\\\\\\", \\\\\\\"style\\\\\\\": 1 },\\\\n        \\\\\\\"2\\\\\\\": { \\\\\\\"text\\\\\\\": \\\\\\\"${dbKey.dbField}\\\\\\\", \\\\\\\"style\\\\\\\": 1 }\\\\n      }\\\\n    }\\\\n  },\\\\n  \\\\\\\"cols\\\\\\\": {\\\\n    \\\\\\\"1\\\\\\\": { \\\\\\\"width\\\\\\\": 100 }\\\\n  },\\\\n  \\\\\\\"merges\\\\\\\": [\\\\\\\"A1:B1\\\\\\\"]\\\\n}\\\\n```\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"用户数据集：\\\\n{{ddl}}\\\\n用户需求：\\\\n{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"173366253646540800\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":336,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"designJson\\\",\\\"nodeId\\\":\\\"173365800833675264\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"173366439085109248\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1166,\\\"y\\\":1662,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"error:选择正确的业务类型\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"175149164433014784\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1164,\\\"y\\\":598,\\\"properties\\\":{\\\"text\\\":\\\"选择表\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":2,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"## 任务\\\\n根据用户需求，从下方数据库表列表中选择所有关联的表名称。\\\\n\\\\n\\\\n## 数据库表列表（格式：表名 | 注释）\\\\n{{ddl}}\\\\n\\\\n## 输出规则\\\\n1. 严格按JSON数组格式输出，例如：[\\\\\\\"order\\\\\\\"]。\\\\n2. 仅包含表名称，无需注释。\\\\n3. **禁止添加列表外的表**。\\\\n4. 表的选择范围可以适当大一些。\\\\n4. 无业务相关性时输出空数组：[]\\\\n\\\\n\\\\n请回复纯JSON，不要包含其他内容。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"用户需求：{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"175153953988444160\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":564,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"tables\\\",\\\"nodeId\\\":\\\"175149164433014784\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"175505963485245440\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1166,\\\"y\\\":802,\\\"properties\\\":{\\\"text\\\":\\\"生成图表\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"根据以下数据以及用户需求生成符合格式要求的图表数据。\\\\n\\\\n\\\\n## 工作流程：\\\\n\\\\n\\\\n1. 根据用户需求选择一个合适的数据集\\\\n2. 根据数据集和需求，从图表列表中选择一个合适的图标类型。\\\\n3. 组装最终输出的json\\\\n\\\\n\\\\n⸻\\\\n## 可选的图表如下（标识|描述）：\\\\n\\\\n\\\\n- 1维图表\\\\n  - bar.simple|普通柱形图\\\\n  - bar.background|带背景柱形图\\\\n  - bar.horizontal|横向柱形图\\\\n  - line.simple|普通折线图\\\\n  - line.area|面积堆积折线图\\\\n  - line.smooth|平滑曲线折线图\\\\n  - line.step|阶梯折线图\\\\n  - pie.simple|普通饼图\\\\n  - pie.doughnut|环状饼图\\\\n  - pie.rose|南丁格尔玫瑰饼图\\\\n  - scatter.simple|普通散点图\\\\n  - funnel.simple|普通漏斗图\\\\n  - funnel.pyramid|金字塔漏斗图\\\\n  - pictorial.spirits|普通象形图\\\\n  - map.scatter|点地图\\\\n  - gauge.simple|360°仪表盘\\\\n  - gauge.simple180|180°仪表盘\\\\n- 2维\\\\n  - bar.multi|多数据对比柱形图\\\\n  - bar.negative|正负条形图\\\\n  - bar.stack|堆叠柱形图\\\\n  - bar.stack.horizontal|堆叠条形图\\\\n  - bar.multi.horizontal|多数据条形柱状图\\\\n  - line.multi|多数据对比折线图\\\\n  - mixed.linebar|普通折柱图\\\\n  - scatter.bubble|气泡散点图\\\\n  - radar.basic|普通雷达图\\\\n  - radar.custom|圆形雷达图\\\\n⸻\\\\n## 数据集格式说明：\\\\n```\\\\n{\\\\n \\\\\\\"dbId\\\\\\\": \\\\\\\"1069915169263800320\\\\\\\",\\\\n \\\\\\\"code\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n \\\\\\\"isList\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"0\\\\\\\",\\\\n \\\\\\\"children\\\\\\\": [\\\\n  {\\\\n   \\\\\\\"title\\\\\\\": \\\\\\\"total_sales\\\\\\\",\\\\n   \\\\\\\"fieldText\\\\\\\": \\\\\\\"total_sales\\\\\\\"\\\\n  },\\\\n  {\\\\n   \\\\\\\"title\\\\\\\": \\\\\\\"total_returns\\\\\\\",\\\\n   \\\\\\\"fieldText\\\\\\\": \\\\\\\"total_returns\\\\\\\"\\\\n  }\\\\n ]\\\\n}\\\\n```\\\\n* code：数据集变量名\\\\n* isList：为”1”表示集合，“0”表示对象\\\\n* children：为字段列表，包含title（字段名）和fieldText（展示名）\\\\n* type：0|sql,1|api,2|code,3|json\\\\n⸻\\\\n## 输出json格式\\\\n{\\\\n  \\\\\\\"dataType\\\\\\\": \\\\\\\"sql\\\\\\\",\\\\n  \\\\\\\"apiStatus\\\\\\\": \\\\\\\"0\\\\\\\",\\\\n  \\\\\\\"apiUrl\\\\\\\": \\\\\\\"\\\\\\\",\\\\n  \\\\\\\"dataId\\\\\\\": \\\\\\\"1069898455939633152\\\\\\\",\\\\n  \\\\\\\"axisX\\\\\\\": \\\\\\\"supplier_name\\\\\\\",\\\\n  \\\\\\\"axisY\\\\\\\": \\\\\\\"total_returns\\\\\\\",\\\\n  \\\\\\\"series\\\\\\\": \\\\\\\"material_name\\\\\\\",\\\\n  \\\\\\\"yText\\\\\\\": \\\\\\\"total_returns\\\\\\\",\\\\n  \\\\\\\"xText\\\\\\\": \\\\\\\"supplier_name\\\\\\\",\\\\n  \\\\\\\"dbCode\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n  \\\\\\\"isCustomPropName\\\\\\\": false,\\\\n  \\\\\\\"chartType\\\\\\\": \\\\\\\"line.multi\\\\\\\",\\\\n  \\\\\\\"id\\\\\\\": \\\\\\\"0aGl4PUfbIfy8BMF\\\\\\\",\\\\n  \\\\\\\"run\\\\\\\": 1,\\\\n  \\\\\\\"title\\\\\\\": \\\\\\\"\\\\\\\",\\\\n}\\\\n* dataType：与数据集type对应(0|sql,1|api,2|code,3|json)\\\\n* dataId：对应数据集dbId\\\\n* dbCode：对应数据集的code\\\\n* axisX：分类属性，从数据集字段中取值（fieldText)\\\\n* axisY：值属性，从数据集字段中取值（fieldText)\\\\n* series: 系列，从数据集字段中取值（fieldText）\\\\n* xText：分类属性显示，从数据集字段中取值（title)\\\\n* yText：值属性显示，从数据集字段中取值（title)\\\\n* chartType：图表的标识\\\\n* title：为这个图表起一个标题\\\\n* isCustomPropName: 如果是api数据集,该值为true\\\\n* apiStatus: 如果是api数据集则等于\\\\\\\"1\\\\\\\"，否则\\\\\\\"0\\\\\\\"\\\\n\\\\n\\\\n## 输出格式\\\\n* 直接返回JSON数据，不要解释，不要md语法，不要换行符，不要有注释。\\\\n* 确保输出的json格式正确完整。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"## 用户数据集：\\\\n{{ddl}}\\\\n## 用户需求：\\\\n{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"175506006644633600\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":769,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"chart\\\",\\\"nodeId\\\":\\\"175505963485245440\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"175807569594040320\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1166,\\\"y\\\":1018,\\\"properties\\\":{\\\"text\\\":\\\"意图识别\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你是一个“在线报表的需求分析器”，能够理解用户的需求输入，\\\\n\\\\n请根据用户需求与提供的数据集设计，综合判断应执行的工作流步骤，并为每个步骤调整需求描述，同时选择最合适的数据集。  \\\\n\\\\n\\\\n\\\\n\\\\n## 可选步骤（格式：标识 | 功能说明）\\\\n\\\\n- `genJsonRows` | 生成报表（可选，根据用户的需求描述和数据集设计生成合适的报表设计）\\\\n\\\\n- `genChart` | 生成图表（可选，根据用户的需求描述和数据集设计生成合适的图表数据）\\\\n\\\\n> **注意：** 至少选择一个步骤，亦可同时选择两者；图表的权重较低。\\\\n\\\\n\\\\n\\\\n\\\\n## 数据集格式\\\\n\\\\n```\\\\n\\\\n{\\\\n\\\\n\\\\\\\"dbId\\\\\\\": \\\\\\\"1069915169263800320\\\\\\\",\\\\n\\\\n\\\\\\\"code\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n\\\\n\\\\\\\"title\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n\\\\n\\\\\\\"isList\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n\\\\n\\\\\\\"type\\\\\\\": \\\\\\\"0\\\\\\\",\\\\n\\\\n\\\\\\\"children\\\\\\\": [\\\\n\\\\n{\\\\n\\\\n\\\\\\\"title\\\\\\\": \\\\\\\"total_sales\\\\\\\",\\\\n\\\\n\\\\\\\"fieldText\\\\\\\": \\\\\\\"total_sales\\\\\\\"\\\\n\\\\n},\\\\n\\\\n{\\\\n\\\\n\\\\\\\"title\\\\\\\": \\\\\\\"total_returns\\\\\\\",\\\\n\\\\n\\\\\\\"fieldText\\\\\\\": \\\\\\\"total_returns\\\\\\\"\\\\n\\\\n}\\\\n\\\\n]\\\\n\\\\n}\\\\n\\\\n```\\\\n\\\\n* `code`：数据集变量名\\\\n\\\\n* `isList`：为”1”表示集合，“0”表示对象\\\\n\\\\n* `children`：为字段列表，包含title（展示名）和fieldText（字段名）\\\\n\\\\n* `type`：0|sql,1|api,2|code,3|json\\\\n\\\\n\\\\n\\\\n\\\\n## 输出格式\\\\n\\\\n步骤标识1|需求描述1|数据集code,步骤标识2|需求描述2|数据集code  \\\\n\\\\n* 各步骤之间用英文逗号,分隔  \\\\n\\\\n* 不得添加额外说明，不要md语法，不要换行符，不要有注释。\\\\n\\\\n\\\\n\\\\n\\\\n## 注意：\\\\n\\\\n- 在生成需求描述时，应确保不丢失原有需求的全部内容，只是并针对所选步骤微调。\\\\n\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"## 用户数据集：\\\\n{{ddl}}\\\\n## 用户需求：\\\\n{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"175808663015538688\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":985,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"intent\\\",\\\"nodeId\\\":\\\"175807569594040320\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"221504502491222016\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1166,\\\"y\\\":1237,\\\"properties\\\":{\\\"text\\\":\\\"生成excel设计\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你是一个“在线Excel JSON生成器”，能够理解用户描述并生成符合规范的 JSON。  \\\\n**严格规则**：\\\\n1. 只能根据描述生成 JSON。\\\\n2. JSON 必须合法，可被 `JSON.parse()` 正确解析。\\\\n3. JSON 中不可以有注释\\\\n\\\\n\\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n\\\\n\\\\n## 步骤一：理解用户的描述，并生成单元格描述信息\\\\n   - 行号、列号\\\\n   - 单元格文字\\\\n   - 单元格样式（字体加粗、斜体、大小、颜色、背景色、水平/垂直对齐、自动换行、边框）\\\\n   - 合并单元格信息\\\\n\\\\n\\\\n\\\\n\\\\n⸻\\\\n\\\\n\\\\n\\\\n\\\\n## 步骤二：使用步骤一种生成的描述信息，生成完整在线Excel JSON\\\\n### 输出要求\\\\n- 输出必须是 **合法 JSON**，且能直接被 `JSON.parse()` 正确解析。  \\\\n- JSON 的结构必须包含以下部分：  \\\\n  - `\\\\\\\"styles\\\\\\\"`：样式数组，每个元素对应一种样式（如字体加粗、字体颜色、边框等），并在单元格里通过 `style` 字段引用  \\\\n  - `\\\\\\\"merges\\\\\\\"`：合并单元格区域（如 `\\\\\\\"D3:E4\\\\\\\"`）  \\\\n  - `\\\\\\\"rows\\\\\\\"`：行数据，每一行包含 `cells`，每个 `cell` 可包含：\\\\n    - `\\\\\\\"text\\\\\\\"`：单元格文字  \\\\n    - `\\\\\\\"style\\\\\\\"`：引用 `styles` 数组中的下标  \\\\n    - `\\\\\\\"merge\\\\\\\"`：若为合并单元格，标注合并范围 示例[1,2]:下标[0]纵向合并1格,下标[1]横向合并2格，\\\\n    - `\\\\\\\"height\\\\\\\"`：行高  \\\\n    - `\\\\\\\"width\\\\\\\"`：列宽（放在 `\\\\\\\"cols\\\\\\\"` 部分）  \\\\n  - `\\\\\\\"cols\\\\\\\"`：列宽配置  \\\\n\\\\n\\\\n\\\\n\\\\n### 样式规则\\\\n- 样式在 `\\\\\\\"styles\\\\\\\"` 中定义：  \\\\n  - `font`：字体\\\\n    - `bold`: 是否加粗（如：`true`）\\\\n    - `italic`: 是否斜体（如：`true`）\\\\n    - `size`: 字体大小单位pt,默认10\\\\n  - `underline`: 下划线（如：`true`）\\\\n  - `strike`: 删除线（如：`true`）\\\\n  - `color`（字体颜色）  \\\\n  - `bgcolor`（背景色）  \\\\n  - `align`（left/center/right）  \\\\n  - `valign`（top/middle/bottom）  \\\\n  - `textwrap`（自动换行）  \\\\n  - `border`\\\\n    - `top`：上边框（如 `[\\\\\\\"thin\\\\\\\",\\\\\\\"#000\\\\\\\"]`）  \\\\n    - `bottom`：下边框（如 `[\\\\\\\"thin\\\\\\\",\\\\\\\"#000\\\\\\\"]`）  \\\\n    - `left`：左边框（如 `[\\\\\\\"thin\\\\\\\",\\\\\\\"#000\\\\\\\"]`）  \\\\n    - `right`：右边框（如 `[\\\\\\\"thin\\\\\\\",\\\\\\\"#000\\\\\\\"]`）  \\\\n\\\\n\\\\n\\\\n\\\\n### 行列规则\\\\n- `\\\\\\\"rows\\\\\\\"` 中的 key 是行号（从 0 开始）  \\\\n- `\\\\\\\"cells\\\\\\\"` 中的 key 是列号（从 0 开始）  \\\\n- 可指定 `\\\\\\\"height\\\\\\\"` 设置行高  \\\\n- `\\\\\\\"cols\\\\\\\"` 中的 key 是列号，值包含 `\\\\\\\"width\\\\\\\"` 设置列宽  \\\\n\\\\n\\\\n\\\\n\\\\n## 合并规则\\\\n- `\\\\\\\"merge\\\\\\\": [纵向合并格数, 横向合并格数]`  \\\\n  - 纵向合并格数与横向合并格数是不包含当前单元格的数量（如 纵向合并格数 等于1 就是向下合并一行；横向合并格数同理）\\\\n- 被合并覆盖的单元格无需再定义  \\\\n\\\\n\\\\n\\\\n\\\\n## 示例\\\\n（简化示例）\\\\n\\\\n\\\\n\\\\n\\\\n```json\\\\n{\\\\n  \\\\\\\"styles\\\\\\\": [\\\\n    { \\\\\\\"font\\\\\\\": { \\\\\\\"bold\\\\\\\": true } },\\\\n    { \\\\\\\"color\\\\\\\": \\\\\\\"#ff0000\\\\\\\" }\\\\n  ],\\\\n  \\\\\\\"rows\\\\\\\": {\\\\n    \\\\\\\"0\\\\\\\": {\\\\n      \\\\\\\"cells\\\\\\\": {\\\\n        \\\\\\\"0\\\\\\\": { \\\\\\\"text\\\\\\\": \\\\\\\"加粗文字\\\\\\\", \\\\\\\"style\\\\\\\": 0 },\\\\n        \\\\\\\"1\\\\\\\": { \\\\\\\"text\\\\\\\": \\\\\\\"红色文字\\\\\\\", \\\\\\\"style\\\\\\\": 1 }\\\\n      }\\\\n    }\\\\n  },\\\\n  \\\\\\\"cols\\\\\\\": {\\\\n    \\\\\\\"1\\\\\\\": { \\\\\\\"width\\\\\\\": 100 }\\\\n  },\\\\n  \\\\\\\"merges\\\\\\\": [\\\\\\\"A1:B1\\\\\\\"],\\\\n}\\\\n\\\\n\\\\n\\\\n\\\\n## 特别说明\\\\n- JSON 必须 **纯净**：无注释、无 markdown、无省略号。  \\\\n- 用户指定的样式不能改动，可在此基础上做美化。\\\\n- 除非用户明确要求，默认都对生成的报表做基础美化（如增加边框、设置字体、设置背景色）\\\\n- 用户描述的行列序号需 **减一** 转换为下标。  \\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"理解用户需求，并按要求生成json数据。\\\\n用户需求如下：\\\\n{{question}}\\\\n\\\\n\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"221512800426758144\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":1201,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"designJson\\\",\\\"nodeId\\\":\\\"221504502491222016\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"223992240450801664\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1166,\\\"y\\\":1441,\\\"properties\\\":{\\\"text\\\":\\\"提示词生成\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 报表生成提示词优化器\\\\n\\\\n\\\\n## 目标\\\\n\\\\n\\\\n根据用户输入的需求和数据集定义，自动生成简洁、明确的用户 message。\\\\n系统会自动带上数据集定义，因此无需包含数据集定义内容。\\\\n\\\\n\\\\n## 工作流程\\\\n\\\\n\\\\n### 步骤一：理解需求与数据集\\\\n\\\\n\\\\n- 从用户的自然语言需求和数据集定义中，提取**业务方向**。\\\\n- 业务方向示例：\\\\n    - 个人简历\\\\n    - 项目报价\\\\n    - 数据统计\\\\n    - 财务报表\\\\n    - 产品清单\\\\n\\\\n\\\\n### 步骤二：扩展提示词\\\\n\\\\n\\\\n- 针对识别出的业务方向，扩展提示词，使其更贴合业务场景。\\\\n- 示例：\\\\n    如果用户需求是\\\\\\\"生成一份个人简历\\\\\\\"，则扩展提示词为：\\\\n    \\\\\\\"请基于数据集生成个人简历模版，突出教育背景、工作经历和技能展示。\\\\\\\"\\\\n\\\\n\\\\n### 步骤三：生成用户 message\\\\n\\\\n\\\\n- 输出最终的用户 message，不包含系统提示词，不包含数据集定义。\\\\n- 要求：\\\\n    - 保留用户需求的原意。\\\\n    - 优化表达，使 AI 更好地理解并执行任务。\\\\n    - 根据业务方向，附加必要的模版说明。\\\\n    - 提示词结构最好包含：\\\\n        - 主要需求：用户的主要需求，比如：生成一个用于软件产品的报价表。\\\\n        - 结构要求：对于生成的内容的要求\\\\n        - 样式要求：对样式的整体和细节的要求，比如：整体排版美观、标题使用16号字。\\\\n\\\\n\\\\n#### 输出示例：\\\\n\\\\n\\\\n```\\\\n生成一个 **员工薪资报表**，要求如下：  \\\\n\\\\n\\\\n1. **数据内容**  \\\\n   - 报表需要展示以下信息：员工姓名、性别、生日、联系电话、薪资。  \\\\n\\\\n\\\\n2. **样式要求**  \\\\n   - 添加一个醒目的报表标题，字体16号。  \\\\n   - 标题行使用蓝色背景，并且字体加粗。  \\\\n   - 数据行保持清晰整齐，便于阅读。  \\\\n\\\\n\\\\n3. **输出要求**  \\\\n   - 表格内容规范，排版美观，符合员工薪资报表的格式。 \\\\n```\\\\n\\\\n\\\\n\\\\n\\\\n## 输出要求\\\\n\\\\n\\\\n- 最终输出为简洁明了的用户 message。\\\\n- 不限定关键词和字段，完全根据需求和数据集定义生成。\\\\n- 控制长度，不要超过500字。\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"用户需求：\\\\n{{question}}\\\\n数据集定义\\\\n{{ddl}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"223993058876952576\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1652,\\\"y\\\":1408,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"prompt\\\",\\\"nodeId\\\":\\\"223992240450801664\\\"}],\\\"height\\\":114,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"172957153288454144\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"172956395755208704\\\",\\\"targetNodeId\\\":\\\"172957153284259840\\\",\\\"sourceAnchorId\\\":\\\"172956395755208704_output\\\",\\\"targetAnchorId\\\":\\\"172957153284259840_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1332,\\\"y\\\":101},{\\\"x\\\":1432,\\\"y\\\":101},{\\\"x\\\":1377,\\\"y\\\":103},{\\\"x\\\":1477,\\\"y\\\":103}]},{\\\"id\\\":\\\"173365501234540544\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"173365501230346240\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"173365501230346240_input\\\",\\\"pointsList\\\":[{\\\"x\\\":428,\\\"y\\\":443},{\\\"x\\\":528,\\\"y\\\":443},{\\\"x\\\":422,\\\"y\\\":469},{\\\"x\\\":522,\\\"y\\\":469}]},{\\\"id\\\":\\\"173366253650735104\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365800833675264\\\",\\\"targetNodeId\\\":\\\"173366253646540800\\\",\\\"sourceAnchorId\\\":\\\"173365800833675264_output\\\",\\\"targetAnchorId\\\":\\\"173366253646540800_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1333,\\\"y\\\":309},{\\\"x\\\":1433,\\\"y\\\":309},{\\\"x\\\":1377,\\\"y\\\":310},{\\\"x\\\":1477,\\\"y\\\":310}]},{\\\"id\\\":\\\"173372961415852032\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"172956395755208704\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_source_if\\\",\\\"targetAnchorId\\\":\\\"172956395755208704_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":503},{\\\"x\\\":954,\\\"y\\\":503},{\\\"x\\\":900,\\\"y\\\":101},{\\\"x\\\":1000,\\\"y\\\":101}]},{\\\"id\\\":\\\"173372967073968128\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"173365800833675264\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_2\\\",\\\"targetAnchorId\\\":\\\"173365800833675264_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":529},{\\\"x\\\":954,\\\"y\\\":529},{\\\"x\\\":901,\\\"y\\\":309},{\\\"x\\\":1001,\\\"y\\\":309}]},{\\\"id\\\":\\\"173372974988619776\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"173366439085109248\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_source_else\\\",\\\"targetAnchorId\\\":\\\"173366439085109248_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":685},{\\\"x\\\":954,\\\"y\\\":685},{\\\"x\\\":900,\\\"y\\\":1636},{\\\"x\\\":1000,\\\"y\\\":1636}]},{\\\"id\\\":\\\"175149164437209088\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"175149164433014784\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_3\\\",\\\"targetAnchorId\\\":\\\"175149164433014784_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":555},{\\\"x\\\":954,\\\"y\\\":555},{\\\"x\\\":898,\\\"y\\\":539},{\\\"x\\\":998,\\\"y\\\":539}]},{\\\"id\\\":\\\"175153997969915904\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"175149164433014784\\\",\\\"targetNodeId\\\":\\\"175153953988444160\\\",\\\"sourceAnchorId\\\":\\\"175149164433014784_output\\\",\\\"targetAnchorId\\\":\\\"175153953988444160_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1330,\\\"y\\\":539},{\\\"x\\\":1430,\\\"y\\\":539},{\\\"x\\\":1377,\\\"y\\\":538},{\\\"x\\\":1477,\\\"y\\\":538}]},{\\\"id\\\":\\\"175505963489439744\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"175505963485245440\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_4\\\",\\\"targetAnchorId\\\":\\\"175505963485245440_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":581},{\\\"x\\\":954,\\\"y\\\":581},{\\\"x\\\":900,\\\"y\\\":743},{\\\"x\\\":1000,\\\"y\\\":743}]},{\\\"id\\\":\\\"175506006648827904\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"175505963485245440\\\",\\\"targetNodeId\\\":\\\"175506006644633600\\\",\\\"sourceAnchorId\\\":\\\"175505963485245440_output\\\",\\\"targetAnchorId\\\":\\\"175506006644633600_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1332,\\\"y\\\":743},{\\\"x\\\":1432,\\\"y\\\":743},{\\\"x\\\":1377,\\\"y\\\":743},{\\\"x\\\":1477,\\\"y\\\":743}]},{\\\"id\\\":\\\"175807569598234624\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"175807569594040320\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_5\\\",\\\"targetAnchorId\\\":\\\"175807569594040320_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":607},{\\\"x\\\":954,\\\"y\\\":607},{\\\"x\\\":900,\\\"y\\\":959},{\\\"x\\\":1000,\\\"y\\\":959}]},{\\\"id\\\":\\\"175808663019732992\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"175807569594040320\\\",\\\"targetNodeId\\\":\\\"175808663015538688\\\",\\\"sourceAnchorId\\\":\\\"175807569594040320_output\\\",\\\"targetAnchorId\\\":\\\"175808663015538688_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1332,\\\"y\\\":959},{\\\"x\\\":1432,\\\"y\\\":959},{\\\"x\\\":1377,\\\"y\\\":959},{\\\"x\\\":1477,\\\"y\\\":959}]},{\\\"id\\\":\\\"221512800426758145\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"221504502491222016\\\",\\\"targetNodeId\\\":\\\"221512800426758144\\\",\\\"sourceAnchorId\\\":\\\"221504502491222016_output\\\",\\\"targetAnchorId\\\":\\\"221512800426758144_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1332,\\\"y\\\":1178},{\\\"x\\\":1432,\\\"y\\\":1178},{\\\"x\\\":1377,\\\"y\\\":1175},{\\\"x\\\":1477,\\\"y\\\":1175}]},{\\\"id\\\":\\\"221534054756093952\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"221504502491222016\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_6\\\",\\\"targetAnchorId\\\":\\\"221504502491222016_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":633},{\\\"x\\\":954,\\\"y\\\":633},{\\\"x\\\":900,\\\"y\\\":1178},{\\\"x\\\":1000,\\\"y\\\":1178}]},{\\\"id\\\":\\\"223992240454995968\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"223992240450801664\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_7\\\",\\\"targetAnchorId\\\":\\\"223992240450801664_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":659},{\\\"x\\\":954,\\\"y\\\":659},{\\\"x\\\":900,\\\"y\\\":1382},{\\\"x\\\":1000,\\\"y\\\":1382}]},{\\\"id\\\":\\\"223993058881146880\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"223992240450801664\\\",\\\"targetNodeId\\\":\\\"223993058876952576\\\",\\\"sourceAnchorId\\\":\\\"223992240450801664_output\\\",\\\"targetAnchorId\\\":\\\"223993058876952576_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1332,\\\"y\\\":1382},{\\\"x\\\":1432,\\\"y\\\":1382},{\\\"x\\\":1386,\\\"y\\\":1382},{\\\"x\\\":1486,\\\"y\\\":1382}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"prompt\\\",\\\"nodeId\\\":\\\"223992240450801664\\\"},{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"表结构\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"dbtype\\\",\\\"name\\\":\\\"数据库类型\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"bizType\\\",\\\"name\\\":\\\"业务类型\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"}]}', NULL);\nINSERT INTO `airag_flow` VALUES ('1917103567932604417', 'jeecg', '2025-04-29 14:28:03', 'admin', '2025-11-27 16:56:38', 'A04', NULL, 'jeecg', 'AI解析Excel数据_JAVA增强', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    enhanceJava.tag(\\'180204885804785664\\'),\\n    llm.tag(\\'180211780498169856\\'),\\n    end.tag(\\'180204420713758720\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":376,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"pageNo\\\",\\\"name\\\":\\\"页码\\\",\\\"type\\\":\\\"number\\\",\\\"required\\\":false},{\\\"field\\\":\\\"pageSize\\\",\\\"name\\\":\\\"每页数量\\\",\\\"type\\\":\\\"number\\\",\\\"required\\\":false},{\\\"field\\\":\\\"bizData\\\",\\\"name\\\":\\\"文件路径\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"180204420713758720\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1648,\\\"y\\\":398,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{res}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"180211780498169856\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"180204885804785664\\\",\\\"type\\\":\\\"enhanceJava\\\",\\\"x\\\":747,\\\"y\\\":329,\\\"properties\\\":{\\\"text\\\":\\\"Java 增强\\\",\\\"options\\\":{\\\"enhance\\\":{\\\"type\\\":\\\"spring\\\",\\\"path\\\":\\\"jimuDataReader\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"bizData\\\",\\\"name\\\":\\\"bizData\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"datas\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"object[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"fields\\\",\\\"name\\\":\\\"字段列表\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false}],\\\"height\\\":158,\\\"width\\\":332}},{\\\"id\\\":\\\"180211780498169856\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1229,\\\"y\\\":419,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"将以下数据整理成目标格式输出\\\\n## 工作流程：\\\\n1. 读取用户的数据\\\\n3. 组装最终输出的json\\\\n⸻\\\\n## 数据示例:data\\\\n```\\\\n{{data}}\\\\n```\\\\n## 数据示例:fields\\\\n```\\\\n{{fields}}\\\\n```\\\\n⸻\\\\n## 输出json格式\\\\n{\\\\n  \\\\\\\"data\\\\\\\": [\\\\n    {\\\\n      \\\\\\\"amount\\\\\\\": \\\\\\\"100\\\\\\\",\\\\n      \\\\\\\"month\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n      \\\\\\\"areaname\\\\\\\": \\\\\\\"华北\\\\\\\",\\\\n      \\\\\\\"year\\\\\\\": \\\\\\\"2020\\\\\\\",\\\\n      \\\\\\\"price\\\\\\\": \\\\\\\"5\\\\\\\",\\\\n      \\\\\\\"dept\\\\\\\": \\\\\\\"河北\\\\\\\",\\\\n      \\\\\\\"settleamount\\\\\\\": \\\\\\\"100\\\\\\\"\\\\n    },\\\\n    {\\\\n      \\\\\\\"amount\\\\\\\": \\\\\\\"200\\\\\\\",\\\\n      \\\\\\\"month\\\\\\\": \\\\\\\"2\\\\\\\",\\\\n      \\\\\\\"areaname\\\\\\\": \\\\\\\"华北\\\\\\\",\\\\n      \\\\\\\"year\\\\\\\": \\\\\\\"2020\\\\\\\",\\\\n      \\\\\\\"price\\\\\\\": \\\\\\\"5\\\\\\\",\\\\n      \\\\\\\"dept\\\\\\\": \\\\\\\"河北\\\\\\\",\\\\n      \\\\\\\"settleamount\\\\\\\": \\\\\\\"200\\\\\\\"\\\\n    },\\\\n  ],\\\\n  \\\\\\\"total\\\\\\\": 100,\\\\n  \\\\\\\"count\\\\\\\": 100\\\\n}\\\\n* total: 分页数，对应数据的总分页数\\\\n* count: 数据总数，对应数据的总数\\\\n\\\\n\\\\n## 输出格式\\\\n* 直接返回JSON数据，不要解释，不要md语法，不要换行符，不要有注释。\\\\n* 统一将key转换成英文，下划线分隔\\\\n* 确保输出的json格式正确完整。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"将数据转换为目标格式\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"datas\\\",\\\"name\\\":\\\"data\\\",\\\"nodeId\\\":\\\"180204885804785664\\\"},{\\\"field\\\":\\\"fields\\\",\\\"name\\\":\\\"fileds\\\",\\\"nodeId\\\":\\\"180204885804785664\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"180211805085179904\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"180211780498169856\\\",\\\"targetNodeId\\\":\\\"180204420713758720\\\",\\\"sourceAnchorId\\\":\\\"180211780498169856_output\\\",\\\"targetAnchorId\\\":\\\"180204420713758720_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1395,\\\"y\\\":360},{\\\"x\\\":1495,\\\"y\\\":360},{\\\"x\\\":1382,\\\"y\\\":361},{\\\"x\\\":1482,\\\"y\\\":361}]},{\\\"id\\\":\\\"180228761381183488\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"180204885804785664\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"180204885804785664_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":361},{\\\"x\\\":566,\\\"y\\\":361},{\\\"x\\\":481,\\\"y\\\":281},{\\\"x\\\":581,\\\"y\\\":281}]},{\\\"id\\\":\\\"180511280701620224\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"180204885804785664\\\",\\\"targetNodeId\\\":\\\"180211780498169856\\\",\\\"sourceAnchorId\\\":\\\"180204885804785664_output\\\",\\\"targetAnchorId\\\":\\\"180211780498169856_input\\\",\\\"pointsList\\\":[{\\\"x\\\":913,\\\"y\\\":281},{\\\"x\\\":1013,\\\"y\\\":281},{\\\"x\\\":963,\\\"y\\\":360},{\\\"x\\\":1063,\\\"y\\\":360}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"pageNo\\\",\\\"name\\\":\\\"页码\\\",\\\"required\\\":false,\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"pageSize\\\",\\\"name\\\":\\\"每页数量\\\",\\\"required\\\":false,\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"bizData\\\",\\\"name\\\":\\\"文件路径\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"}]}', NULL);\nINSERT INTO `airag_flow` VALUES ('1952634605517447170', 'admin', '2025-08-05 15:35:43', 'admin', '2026-01-23 18:30:13', 'A04', NULL, 'jeecg', 'AI生成简历', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'215734195065536512\\'),\\n    enhanceJava.tag(\\'215740280715427840\\'),\\n    end.tag(\\'215735188368998400\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":404,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{},\\\"custom\\\":{\\\"time\\\":{\\\"second\\\":0,\\\"minute\\\":0},\\\"hour\\\":{\\\"mode\\\":\\\"every\\\"},\\\"day\\\":{\\\"type\\\":\\\"day\\\",\\\"day\\\":{\\\"mode\\\":\\\"every\\\"}},\\\"month\\\":{\\\"mode\\\":\\\"every\\\"}}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"个人简介\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"profile\\\",\\\"name\\\":\\\"基础信息\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"215734195065536512\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":746,\\\"y\\\":404,\\\"properties\\\":{\\\"text\\\":\\\"生成word文档\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你必须只输出合法且可被 java中的JSON.parse() 正确解析的 JSON。\\\\n不要输出任何解释、注释或 JSON 以外的文字。\\\\nJSON 结构规则:\\\\n- 每个对象表示一个内容块。\\\\n- 标题样式需要加粗\\\\n- 每个对象需要用英文符号,禁止使用中文符号,\\\\\\\"key\\\\\\\"必须存在,\\\\\\\"value\\\\\\\"可以为空字符串正确用法 `{ \\\\\\\"key\\\\\\\": \\\\\\\"value\\\\\\\" }`\\\\n- 字段说明：\\\\n• \\\\\\\"type\\\\\\\"：内容类型，可选：\\\\\\\"title\\\\\\\"（标题）、\\\\\\\"list\\\\\\\"（列表）、\\\\\\\"separator\\\\\\\"（分隔线）、\\\\\\\"hyperlink\\\\\\\"（超链接）、\\\\\\\"pageBreak\\\\\\\"（分页符）、\\\\\\\"tab\\\\\\\"（制表符）、\\\\\\\"\\\\\\\"（普通文本）、\\\\\\\"superscript\\\\\\\"（上标）、\\\\\\\"subscript\\\\\\\"（下标）、\\\\\\\"table\\\\\\\"（表格）。\\\\n• \\\\\\\"level\\\\\\\"：标题层级，仅当 type 为 \\\\\\\"title\\\\\\\" 时使用，取值：\\\\\\\"first\\\\\\\" ~ \\\\\\\"sixth\\\\\\\"。\\\\n• \\\\\\\"value\\\\\\\"：文本、图片地址、超链接等。\\\\n• \\\\\\\"valueList\\\\\\\"：数组，用于标题、列表、超链接等，数组元素支持 \\\\\\\"value\\\\\\\" 及样式字段。\\\\n• \\\\\\\"listType\\\\\\\"：列表类型，取值：\\\\\\\"ul\\\\\\\"（无序）、\\\\\\\"ol\\\\\\\"（有序）。\\\\n• \\\\\\\"listStyle\\\\\\\"：列表样式，如 \\\\\\\"disc\\\\\\\"、\\\\\\\"decimal\\\\\\\"、\\\\\\\"circle\\\\\\\"、\\\\\\\"square\\\\\\\"、\\\\\\\"checkbox\\\\\\\"。\\\\n• \\\\\\\"trList\\\\\\\"、\\\\\\\"colgroup\\\\\\\"：表格行列定义，仅用于 \\\\\\\"table\\\\\\\",\\\\\\\"width\\\\\\\"为总宽度,\\\\\\\"height\\\\\\\"为总高度,\\\\\\\"colgroup\\\\\\\"是个数组，每个对象中的\\\\\\\"width\\\\\\\"代表每列的宽度,\\\\\\\"id\\\\\\\"为随机数。\\\\n• \\\\\\\"trList\\\\\\\"中的\\\\\\\"height\\\\\\\"必填,如\\\\\\\"trList\\\\\\\": [{\\\\\\\"height\\\\\\\": 42,tdList:[{}]}}];\\\\\\\"colspan\\\\\\\"为表格跨列,\\\\\\\"rowspan\\\\\\\"为表格跨行，tdList\\\\\\\"为每个表格的选项配置。\\\\\\\"colspan\\\\\\\"和\\\\\\\"rowspan\\\\\\\"必填，默认值为1\\\\n• 样式字段：\\\\\\\"font\\\\\\\"、\\\\\\\"size\\\\\\\"、\\\\\\\"bold\\\\\\\"、\\\\\\\"color\\\\\\\"、\\\\\\\"italic\\\\\\\"、\\\\\\\"highlight\\\\\\\"、\\\\\\\"underline\\\\\\\"、\\\\\\\"strikeout\\\\\\\"。\\\\n• \\\\\\\"dashArray\\\\\\\"：用于 \\\\\\\"separator\\\\\\\"。\\\\n• 其他样式字段：\\\\\\\"rowFlex\\\\\\\"（\\\\\\\"left\\\\\\\"、\\\\\\\"center\\\\\\\"、\\\\\\\"right\\\\\\\"、\\\\\\\"alignment\\\\\\\"）、\\\\\\\"backgroundColor\\\\\\\"、\\\\\\\"verticalAlign\\\\\\\"、\\\\\\\"textDecoration\\\\\\\"。\\\\n- 当 type = \\\\\\\"title\\\\\\\" 时，\\\\\\\"value\\\\\\\" 必须以 \\\\\\\"\\\\\\\\n\\\\\\\" 结尾。\\\\n- 主动换行请使用 `{ \\\\\\\"type\\\\\\\": \\\\\\\"\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"\\\\\\\\n\\\\\\\" }`，不同对象之间不会自动换行。\\\\n输出必须严格是 JSON 数组，例如:\\\\n[{\\\\\\\"value\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"微软雅黑\\\\\\\",\\\\\\\"size\\\\\\\":29,\\\\\\\"bold\\\\\\\":false,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"\\\\\\\\n\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"楷体\\\\\\\",\\\\\\\"size\\\\\\\":29,\\\\\\\"bold\\\\\\\":false,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"国\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"楷体\\\\\\\",\\\\\\\"size\\\\\\\":34,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#FF0000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"炬\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"楷体\\\\\\\",\\\\\\\"size\\\\\\\":34,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#FF0000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"软\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"楷体\\\\\\\",\\\\\\\"size\\\\\\\":34,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#FF0000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"件\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"楷体\\\\\\\",\\\\\\\"size\\\\\\\":34,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#FF0000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"字\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"楷体\\\\\\\",\\\\\\\"size\\\\\\\":34,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#FF0000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"【\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"楷体\\\\\\\",\\\\\\\"size\\\\\\\":34,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#FF0000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"2\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"楷体\\\\\\\",\\\\\\\"size\\\\\\\":34,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#FF0000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"0\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"楷体\\\\\\\",\\\\\\\"size\\\\\\\":34,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#FF0000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"2\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"楷体\\\\\\\",\\\\\\\"size\\\\\\\":34,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#FF0000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"0\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"楷体\\\\\\\",\\\\\\\"size\\\\\\\":34,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#FF0000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"】\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"楷体\\\\\\\",\\\\\\\"size\\\\\\\":34,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#FF0000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"0\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"楷体\\\\\\\",\\\\\\\"size\\\\\\\":34,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#FF0000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"0\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"楷体\\\\\\\",\\\\\\\"size\\\\\\\":34,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#FF0000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"1\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"楷体\\\\\\\",\\\\\\\"size\\\\\\\":34,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#FF0000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"号\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"楷体\\\\\\\",\\\\\\\"size\\\\\\\":34,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#FF0000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"\\\\\\\\n\\\\\\\\n\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"楷体\\\\\\\",\\\\\\\"size\\\\\\\":34,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#FF0000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\"},{\\\\\\\"value\\\\\\\":\\\\\\\"\\\\\\\\n\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":29,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#000000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"关\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":29,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#000000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"于\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":29,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#000000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"印\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":29,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#000000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"发\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":29,\\\\\\\"bold\\\\\\\":true,\\\\\\\"color\\\\\\\":\\\\\\\"#000000\\\\\\\",\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"\\\\\\\\n\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"主\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"题\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"词\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\":\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":14,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"\\\\\\\\n\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"抄\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"送\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"：\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"\\\\\\\\n\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":true,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"\\\\\\\\n\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"共\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"印\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"份\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"（\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"群\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"发\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\"）\\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]},{\\\\\\\"value\\\\\\\":\\\\\\\" \\\\\\\",\\\\\\\"font\\\\\\\":\\\\\\\"仿宋\\\\\\\",\\\\\\\"size\\\\\\\":21,\\\\\\\"bold\\\\\\\":true,\\\\\\\"italic\\\\\\\":false,\\\\\\\"underline\\\\\\\":false,\\\\\\\"strikeout\\\\\\\":false,\\\\\\\"rowFlex\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"dashArray\\\\\\\":[]}]\\\\n执行步骤:\\\\n1. 根据用户需求生成json数据\\\\n2. 检查生产的json数据是否正确。如果正常，输出给用户；否则重新生成。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"请根据以上字段和示例，生成一个完整的个人简历文档 JSON。\\\\n- 至少包含基础信息、个人优势、工作经历、项目经理、教育经历等模块。\\\\n- 若基础数据不足，可以适当生成参考数据。\\\\n- 用户信息如下：\\\\n基础资料：{{base}}\\\\n简介：{{profile}}\\\"}],\\\"showToolExecution\\\":false},\\\"inputParams\\\":[{\\\"field\\\":\\\"profile\\\",\\\"name\\\":\\\"base\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"profile\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"215735188368998400\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1716,\\\"y\\\":380,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"215740280715427840\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"215740280715427840\\\",\\\"type\\\":\\\"enhanceJava\\\",\\\"x\\\":1277,\\\"y\\\":404,\\\"properties\\\":{\\\"text\\\":\\\"Java 增强\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：JSON检验和修复专家\\\\n你是一位专门负责检验和修复JSON字符串的专家，确保其能被Java的`JSON.parse()`方法成功解析，并返回修复后的、可解析的JSON字符串原文。\\\\n## 目标：\\\\n1. 接收用户提供的JSON字符串，诊断其语法错误。\\\\n2. 智能修复常见的JSON格式问题（如引号缺失、尾随逗号、注释等），使其符合标准JSON规范。\\\\n3. 输出修复后的、可直接用于`JSON.parse()`的JSON字符串原文。\\\\n## 技能：\\\\n1. **深度语法分析**：精准识别JSON字符串中的语法错误位置和类型（如未闭合的引号、括号或花括号，错误的键值分隔符，非法字符等）。\\\\n2. **上下文感知修复**：根据JSON结构上下文，智能推断并应用最合理的修复方案（例如，为未加引号的键名添加双引号，移除对象或数组末尾的非法逗号）。\\\\n3. **标准合规性**：严格遵循IETF RFC 8259 JSON数据交换标准，确保输出为有效JSON。\\\\n4. **最小改动原则**：在保证修复有效的前提下，尽可能保持原始字符串的结构和意图，只修改必要的部分。\\\\n## 工作流：\\\\n1. **接收与初步检验**：接收用户输入的字符串，尝试使用`JSON.parse()`进行解析。若解析成功，则直接返回原字符串并告知其有效。\\\\n2. **错误诊断与定位**：若解析失败，捕获`SyntaxError`异常，分析错误信息以定位问题的大致位置和类型。\\\\n3. **详细扫描与修复**：逐字符扫描整个字符串，结合错误定位，系统性地检查并修复以下常见问题：\\\\n* 为未使用双引号的属性名（key）添加双引号。\\\\n* 确保所有字符串值由双引号包裹。\\\\n* 移除对象字面量`{}`或数组字面量`[]`中最后一个元素后的尾随逗号。\\\\n* 将单引号替换为双引号。\\\\n* 移除JavaScript风格的注释（`//` 单行注释， `/* */` 多行注释）。\\\\n* 转义字符串中未转义的控制字符（如换行符`\\\\\\\\n`、制表符`\\\\\\\\t`）。\\\\n* 检查并修正括号`[]`和花括号`{}`的配对与嵌套。\\\\n4. **验证与输出**：对修复后的字符串再次尝试`JSON.parse()`。若成功，则输出修复后的JSON字符串原文\\\\n## 输出格式：\\\\n- **当JSON有效时**：输出原始字符串。\\\\n- **当JSON被成功修复时**：然后换行输出修复后的JSON字符串原文。\\\\n## 限制：\\\\n- 仅处理语法错误，不验证JSON数据的业务逻辑或语义正确性。\\\\n- 对于歧义过大或结构严重损坏（如大量缺失内容）的JSON，可能无法修复，此时应清晰说明原因。\\\\n- 所有输出必须是纯文本格式，仅包含上述指定的提示信息和JSON字符串本身，不添加任何额外的Markdown代码块标记（如 ```json ```）。\\\\n- 严格遵守最小改动原则，避免对原始数据做出不必要的、可能改变其原意的修改。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{word}}\\\"}],\\\"enhance\\\":{\\\"path\\\":\\\"jeecgDemoAiWordGen\\\",\\\"type\\\":\\\"spring\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"215734195065536512\\\",\\\"customValue\\\":\\\"\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":158,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"215734195073925120\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"215734195065536512\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"215734195065536512_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":389},{\\\"x\\\":566,\\\"y\\\":389},{\\\"x\\\":480,\\\"y\\\":345},{\\\"x\\\":580,\\\"y\\\":345}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"215740398487289856\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"215740280715427840\\\",\\\"targetNodeId\\\":\\\"215735188368998400\\\",\\\"sourceAnchorId\\\":\\\"215740280715427840_output\\\",\\\"targetAnchorId\\\":\\\"215735188368998400_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1443,\\\"y\\\":356},{\\\"x\\\":1543,\\\"y\\\":356},{\\\"x\\\":1450,\\\"y\\\":354},{\\\"x\\\":1550,\\\"y\\\":354}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"277731759286210560\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"215734195065536512\\\",\\\"targetNodeId\\\":\\\"215740280715427840\\\",\\\"sourceAnchorId\\\":\\\"215734195065536512_output\\\",\\\"targetAnchorId\\\":\\\"215740280715427840_input\\\",\\\"pointsList\\\":[{\\\"x\\\":912,\\\"y\\\":345},{\\\"x\\\":1012,\\\"y\\\":345},{\\\"x\\\":1011,\\\"y\\\":356},{\\\"x\\\":1111,\\\"y\\\":356}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"215740280715427840\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"个人简介\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"profile\\\",\\\"name\\\":\\\"基础信息\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', '');\nINSERT INTO `airag_flow` VALUES ('1988073273760501762', 'admin', '2025-11-11 10:36:20', 'admin', '2025-11-27 16:58:06', 'A05A01A01', NULL, 'jeecg', 'AI图文写作', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'251170889153376256\\'),\\n    llm.tag(\\'251190209648521216\\'),\\n    llm.tag(\\'251190922428542976\\'),\\n    llm.tag(\\'251246385341919232\\'),\\n    end.tag(\\'251191126401740800\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":332.8947368421053,\\\"y\\\":589.0526315789475,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"目的地\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"from\\\",\\\"name\\\":\\\"出发地\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"time\\\",\\\"name\\\":\\\"出发时间\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"peopleNum\\\",\\\"name\\\":\\\"人数\\\",\\\"type\\\":\\\"number\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"251170889153376256\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":685.9473684210526,\\\"y\\\":381.05263157894734,\\\"properties\\\":{\\\"text\\\":\\\"意图和需求分析\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色\\\\n你是自驾游攻略生成的需求分析师\\\\n\\\\n## 目标：\\\\n- 分析用户提供的主题信息，归纳整理出实际需求列表。\\\\n\\\\n## 技能：\\\\n1. 信息提取与分析能力\\\\n2. 旅游规划与建议能力\\\\n3. 数据查询与整合能力\\\\n\\\\n## 工作流：\\\\n1. 收集用户提供的主题信息并进行分类。\\\\n2. 确定用户的目标和需求，并归纳整理。\\\\n3. 列出需要查询的资料和天气、路况信息。\\\\n\\\\n## 输出格式：\\\\n- 列表形式，包含目标和需求、查询资料列表、天气和路况信息。\\\\n\\\\n## 限制：\\\\n- 不得提供未经过验证的信息。\\\\n- 所有数据需标注来源，不确定信息用[需核实]标记。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"出发地：{{from}}\\\\n目的地：{{userQuestion}}\\\\n计划时间：{{time}}\\\\n人数：{{peopleNum}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"userQuestion\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"from\\\",\\\"name\\\":\\\"from\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"time\\\",\\\"name\\\":\\\"time\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"peopleNum\\\",\\\"name\\\":\\\"peopleNum\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"251190209648521216\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":943.2631578947365,\\\"y\\\":632.0526315789475,\\\"properties\\\":{\\\"text\\\":\\\"资料查询\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":30,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"## 角色\\\\n\\\\n\\\\n你是一名 自驾游资料查询师（DataAgent），专注于为下游的“攻略生成Agent”提供精准、结构化的自驾游资料。\\\\n\\\\n\\\\n------\\\\n\\\\n\\\\n## 职责目标\\\\n 1. 根据输入内容（出发地、目的地、行程需求等），直接执行资料查询任务，不再向用户提问。\\\\n 2. 收集并整理以下四类信息：\\\\n  - 🚗 路线与导航规划信息\\\\n  - 🏞️ 沿途及目的地的景点和游玩项目\\\\n  - 🏨 住宿与周边美食信息\\\\n  - ☁️ 沿途及目的地天气信息\\\\n 3. 输出清晰、结构化的数据结果，供下一个Agent生成攻略使用。\\\\n\\\\n\\\\n------\\\\n\\\\n\\\\n## 能力与工具\\\\n\\\\n\\\\n- maps 工具\\\\n - 查询路线与导航规划信息（距离、时长、推荐路线、途经地）。\\\\n - 查询沿途及目的地的住宿与餐饮信息。\\\\n - 查询沿途及目的地的实时或近期天气信息。\\\\n\\\\n\\\\n- search 工具\\\\n - 查询沿途及目的地的景点、游玩项目、特色体验、门票及评价等。\\\\n\\\\n\\\\n------\\\\n\\\\n\\\\n## 工作流程\\\\n 1. 接收任务\\\\n  - 使用用户提供的现有信息（不提问、不二次确认）。\\\\n 2. 资料查询\\\\n  - 调用 maps 工具 获取路线、住宿、美食、天气。\\\\n  - 调用 search 工具 获取景点和游玩项目。\\\\n 3. 资料整理\\\\n  - 将查询结果按类型整理成结构化资料包。\\\\n  - 每条数据需注明来源（maps / search）。\\\\n 4. 结果输出\\\\n  - 输出格式清晰，便于下游Agent直接使用。\\\\n\\\\n\\\\n------\\\\n\\\\n\\\\n## 输出格式示例\\\\n\\\\n\\\\n```\\\\n{\\\\n  \\\\\\\"route_info\\\\\\\": [\\\\n    {\\\\n      \\\\\\\"from\\\\\\\": \\\\\\\"北京\\\\\\\",\\\\n      \\\\\\\"to\\\\\\\": \\\\\\\"张家口\\\\\\\",\\\\n      \\\\\\\"distance\\\\\\\": \\\\\\\"220km\\\\\\\",\\\\n      \\\\\\\"duration\\\\\\\": \\\\\\\"3小时\\\\\\\",\\\\n      \\\\\\\"route_detail\\\\\\\": \\\\\\\"经京藏高速G6\\\\\\\",\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"maps\\\\\\\"\\\\n    }\\\\n  ],\\\\n  \\\\\\\"sights\\\\\\\": [\\\\n    {\\\\n      \\\\\\\"name\\\\\\\": \\\\\\\"崇礼滑雪场\\\\\\\",\\\\n      \\\\\\\"tags\\\\\\\": [\\\\\\\"滑雪\\\\\\\", \\\\\\\"冬季运动\\\\\\\"],\\\\n      \\\\\\\"description\\\\\\\": \\\\\\\"亚洲知名滑雪胜地\\\\\\\",\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"search\\\\\\\"\\\\n    }\\\\n  ],\\\\n  \\\\\\\"hotels\\\\\\\": [\\\\n    {\\\\n      \\\\\\\"name\\\\\\\": \\\\\\\"张家口云顶假日酒店\\\\\\\",\\\\n      \\\\\\\"rating\\\\\\\": \\\\\\\"4.6\\\\\\\",\\\\n      \\\\\\\"address\\\\\\\": \\\\\\\"崇礼区奥运大道88号\\\\\\\",\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"maps\\\\\\\"\\\\n    }\\\\n  ],\\\\n  \\\\\\\"foods\\\\\\\": [\\\\n    {\\\\n      \\\\\\\"name\\\\\\\": \\\\\\\"张家口烧麦\\\\\\\",\\\\n      \\\\\\\"type\\\\\\\": \\\\\\\"地方特色\\\\\\\",\\\\n      \\\\\\\"recommendation\\\\\\\": \\\\\\\"崇礼老街美食街\\\\\\\",\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"maps\\\\\\\"\\\\n    }\\\\n  ],\\\\n  \\\\\\\"weather\\\\\\\": [\\\\n    {\\\\n      \\\\\\\"location\\\\\\\": \\\\\\\"崇礼\\\\\\\",\\\\n      \\\\\\\"condition\\\\\\\": \\\\\\\"晴\\\\\\\",\\\\n      \\\\\\\"temperature\\\\\\\": \\\\\\\"5°C~12°C\\\\\\\",\\\\n      \\\\\\\"wind\\\\\\\": \\\\\\\"微风\\\\\\\",\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"maps\\\\\\\"\\\\n    }\\\\n  ]\\\\n}\\\\n```\\\\n\\\\n\\\\n------\\\\n\\\\n\\\\n## 限制与规范\\\\n - 不生成行程攻略、总结或建议性文字。\\\\n - 不提问用户，只执行既定任务。\\\\n - 不包含任何虚构或未经验证的信息。\\\\n - 不涉及隐私、政治或违法内容。\\\\n - 不确定的数据需以 [需核实] 标识。\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"需求：{{demand}}\\\"}],\\\"plugins\\\":[{\\\"pluginId\\\":\\\"1983474860536475649\\\",\\\"pluginName\\\":\\\"高德\\\",\\\"category\\\":\\\"mcp\\\"},{\\\"pluginId\\\":\\\"1988091188723412994\\\",\\\"pluginName\\\":\\\"BraveSearch\\\",\\\"category\\\":\\\"mcp\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"demand\\\",\\\"nodeId\\\":\\\"251170889153376256\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"251190922428542976\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1225.0526315789468,\\\"y\\\":370.6842105263157,\\\"properties\\\":{\\\"text\\\":\\\"生成文章\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":15,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色定位：实地体验派自驾游攻略博主\\\\n\\\\n\\\\n你是一名热爱公路旅行、记录真实体验的自驾游达人博主。  \\\\n你的任务是为读者打造一份**能直接照着走的实地自驾游攻略**——兼顾实用性与可读性，让人看完就想出发。  \\\\n---\\\\n## 目标\\\\n1. 输出结构清晰、完整且可直接使用的自驾游攻略。  \\\\n2. 以**亲历者口吻**撰写内容，语言自然、有温度、具感染力。  \\\\n3. 帮助用户在有限时间内，完成一次轻松、安全、体验丰富的公路旅程。  \\\\n---\\\\n## 技能\\\\n1. **路线规划高手**：能结合季节、路况、天气等因素，规划最顺路、最合理的行程。  \\\\n2. **信息整合专家**：能整合住宿、美食、加油点、景点开放时间等要素，构成完整旅程。  \\\\n3. **避坑指导员**：能在攻略中明确提示潜在风险与替代路线，确保安全顺利出行。  \\\\n4. **文案风格创作者**：文风真实、有共鸣，兼具实用与情感温度。  \\\\n---\\\\n## 工作流程\\\\n1. **接收资料**\\\\n   - 使用上游 DataAgent 提供的结构化资料（路线、天气、景点、住宿、美食等）。  \\\\n   - 明确出发地点、目的地，时间和人数。\\\\n2. **内容整合**\\\\n   - 基于资料内容，编排合理的日程与路线逻辑。  \\\\n   - 为每天生成住宿与周边推荐。  \\\\n   - 根据沿途特点补充打卡点、体验亮点与避坑提醒。  \\\\n3. **配图搜索**\\\\n   - 基于文章中的景点，使用图片搜索工具搜索相关图片\\\\n   - 获取图片链接后，嵌入到文章中。\\\\n   - 每篇文章可以使用3张左右图片。\\\\n3. **攻略输出**\\\\n   - 输出格式固定、排版规范、语气一致、可直接用于图文发布。  \\\\n---\\\\n## 输出格式规范\\\\n\\\\n\\\\n\\\\n\\\\n攻略必须严格包含以下结构模块（顺序固定）：  \\\\n\\\\n\\\\n\\\\n\\\\n### 标题\\\\n一句话吸引读者，让人有“立刻出发”的冲动。  \\\\n> 示例：  \\\\n> 「这条西北环线美到窒息，一路风光大片连连！」  \\\\n---\\\\n### 重要概述信息（开篇摘要）\\\\n以简洁的段落或表格概述行程关键信息：  \\\\n- 出发地与目的地  \\\\n- 推荐出行季节  \\\\n- 建议行程天数  \\\\n- 总里程 / 主要路线  \\\\n- 车辆与路况建议  \\\\n- 是否适合家庭 / 情侣 / 越野爱好者  \\\\n\\\\n\\\\n\\\\n\\\\n> 示例：  \\\\n> **推荐季节**：9月下旬 - 10月中旬  \\\\n> **总里程**：约820公里  \\\\n> **适合人群**：喜欢自然风光与摄影的旅行者  \\\\n---\\\\n### 行程安排（按天）\\\\n分天描述路线、行驶距离、推荐出发时间、路况建议：  \\\\n- 每天路线与行驶信息  \\\\n- 沿途休息站 / 加油点  \\\\n- 建议游玩节奏  \\\\n\\\\n\\\\n\\\\n\\\\n> 示例：  \\\\n> **Day 1：成都 → 理县（约220km / 4小时）**  \\\\n> 上午出发，经成绵高速转都汶高速，全程路况优。途中可在汶川服务区短暂停留休息。  \\\\n---\\\\n### 每日住宿与周边推荐\\\\n为每天行程提供住宿推荐及周边美食娱乐选项：  \\\\n- 酒店名称、星级、亮点  \\\\n- 周边美食推荐（餐厅/夜宵/特色菜）  \\\\n- 休闲娱乐建议  \\\\n\\\\n\\\\n\\\\n\\\\n> 示例：  \\\\n> **住宿推荐**：理县瑞云山居（¥380起 / 含早餐）  \\\\n> **周边美食**：理县藏餐坊（推荐青稞酒与手抓羊）  \\\\n---\\\\n### 沿途打卡与景点推荐\\\\n精选每段路线的代表性景点与小众体验点，注明特色与亮点：  \\\\n> 示例：  \\\\n> - 毕棚沟：秋色摄影圣地，10月最佳观赏期  \\\\n> - 古尔沟温泉：天然碳酸泉，适合行程末放松  \\\\n---\\\\n### 避坑提醒\\\\n实地经验总结，包括但不限于：  \\\\n- 天气与季节风险  \\\\n- 路段注意事项（隧道、陡坡、限速）  \\\\n- 油站/信号盲区提示  \\\\n- 门票与政策更新  \\\\n\\\\n\\\\n> 示例：  \\\\n> - 国庆期间毕棚沟限流，建议提前预约。  \\\\n> - 高原路段昼夜温差大，请携带保暖衣物。  \\\\n---\\\\n### 结语\\\\n以温暖、真实的语气收尾，让读者感受到旅途的意义与期待。  \\\\n> 示例：  \\\\n> “这条路，值得你放慢脚步去感受。愿每一次出发，都有风景，也有故事。”  \\\\n---\\\\n## 风格要求\\\\n- 文字自然、口语化、有画面感。  \\\\n- 语气积极向上，不生硬、不堆砌。  \\\\n- 以**“亲身体验分享”**为写作视角。  \\\\n- 适合直接发布到公众号 / 小红书 / 旅游类平台。  \\\\n---\\\\n## 限制与合规说明\\\\n- 不虚构信息，所有数据基于实际资料。  \\\\n- 不涉及隐私、歧视或违法内容。  \\\\n- 直接输出攻略正文，不输出系统提示、元信息或额外解释。  \\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"## 需求\\\\n{{demand}}\\\\n## 资料\\\\n{{resources}}\\\"}],\\\"plugins\\\":[{\\\"pluginId\\\":\\\"1988208474780168193\\\",\\\"pluginName\\\":\\\"图片搜索\\\",\\\"category\\\":\\\"mcp\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"demand\\\",\\\"nodeId\\\":\\\"251170889153376256\\\"},{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"resources\\\",\\\"nodeId\\\":\\\"251190209648521216\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"251191126401740800\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1743.594965675057,\\\"y\\\":370.28146453089266,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{result}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"result\\\",\\\"nodeId\\\":\\\"251246385341919232\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"251246385341919232\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1438.6270022883289,\\\"y\\\":637.045766590389,\\\"properties\\\":{\\\"text\\\":\\\"润色并存储\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":10,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色  \\\\n你是一个**出行攻略与富文本排版专家（TravelContentStylist）**，负责将普通文本文章转化为专业级、高端杂志风格的HTML富文本内容。\\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 🎯 目标  \\\\n1. 将输入的原始文章格式化为整洁、美观、结构统一的HTML富文本（视觉风格参考蓝灰色出行攻略模板）。  \\\\n2. 自动提取文章的标题、副标题、关键词、摘要等信息。  \\\\n3. 将富文本与提取信息一并存储到系统中。  \\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 💡 富文本设计规范  \\\\n\\\\n\\\\n### 页面整体样式示意 \\\\n```html\\\\n<article style=\\\\\\\"font-family: \\'PingFang SC\\', \\'Microsoft YaHei\\', Arial, sans-serif;\\\\n                color: #333; background-color: #FAFBFC; \\\\n                max-width: 880px; margin: 40px auto; padding: 40px; \\\\n                border-radius: 12px; box-shadow: 0 0 12px rgba(0,0,0,0.05);\\\\\\\">\\\\n\\\\n\\\\n\\\\n\\\\n  <header style=\\\\\\\"border-bottom: 2px solid #E6EAF0; margin-bottom: 24px;\\\\\\\">\\\\n    <h1 style=\\\\\\\"font-size: 2em; font-weight: 700; color: #1A73E8; margin-bottom: 6px;\\\\\\\">文章主标题</h1>\\\\n    <h2 style=\\\\\\\"font-size: 1.2em; font-weight: 400; color: #555;\\\\\\\">文章副标题</h2>\\\\n  </header>\\\\n\\\\n\\\\n\\\\n\\\\n  <!-- 信息概览模块 -->\\\\n  <section style=\\\\\\\"background: #F3F7FC; border-left: 4px solid #1A73E8; \\\\n                  padding: 16px 20px; border-radius: 8px; margin-bottom: 28px;\\\\\\\">\\\\n    <p><strong>出行季节：</strong>金秋10月（2023-10-25）</p>\\\\n    <p><strong>推荐天数：</strong>1-2天（可夜宿济南/南京）</p>\\\\n    <p><strong>总公里数：</strong>约1200km</p>\\\\n    <p><strong>人数与车型建议：</strong>5人，推荐中大型SUV或MPV，空间舒适。</p>\\\\n  </section>\\\\n  <!-- 其他部分 -->\\\\n</article>\\\\n```  \\\\n设计说明\\\\n1. 整体布局\\\\n  - 最大宽度约 880px，居中显示，整体背景为浅灰白色（#FAFBFC）。\\\\n  - 内边距较大（40px），四周有圆角（12px）和轻微阴影（box-shadow: 0 0 12px rgba(0,0,0,0.05)），营造卡片式感觉。\\\\n  - 使用了中文常用的字体组合（苹方、微软雅黑），兼顾现代感与易读性，文字颜色为深灰色（#333）。\\\\n2. 标题部分\\\\n  - 主标题突出（2em，蓝色 #1A73E8，粗体），副标题较小（1.2em，深灰色），并在底部有分隔线强化层次感。\\\\n3. 信息概览模块\\\\n  - 背景为淡蓝色（#F3F7FC），左侧有蓝色竖条（4px），像标签式信息卡。\\\\n  - 内部列出了出行季节、推荐天数、总公里数和人数/车型建议，文字加粗强调关键信息。\\\\n  - 模块与下方内容有明显间距（28px），便于视觉区分。\\\\n4. 行程安排模块\\\\n  - 模块标题蓝色，带下划分隔线，列表为有序列表，行距 1.8，便于阅读行程顺序。\\\\n  - 每天的路线、里程和时间都清晰标注，关键内容加粗突出。\\\\n5. 沿途打卡模块\\\\n  - 模块标题与行程安排相同风格，列表为无序列表，展示沿途景点和推荐打卡地。\\\\n  - 行距同样较大（1.8），保持阅读舒适度。\\\\n6. 注意事项模块（避坑提醒）\\\\n  - 模块标题用红色（#D93025）和粉色分隔线（#F3C1BE），突出警示性质。\\\\n  - 列表中重点信息加粗（施工提醒、天气因素、油费与通行），提醒用户注意行程安全和预算。\\\\n整体风格 清爽、层次分明、信息易抓取，既有蓝色调的出行信息模块，又有红色警示提醒，结合圆角卡片和阴影设计，使文章既专业又具有亲和力。\\\\n\\\\n\\\\n3. 提取标题、副标题、关键词、摘要并生成结构化信息：\\\\n\\\\n\\\\n{\\\\n  \\\\\\\"title\\\\\\\": \\\\\\\"文章主标题\\\\\\\",\\\\n  \\\\\\\"subtitle\\\\\\\": \\\\\\\"文章副标题\\\\\\\",\\\\n  \\\\\\\"keywords\\\\\\\": [\\\\\\\"关键词1\\\\\\\", \\\\\\\"关键词2\\\\\\\", \\\\\\\"关键词3\\\\\\\"],\\\\n  \\\\\\\"summary\\\\\\\": \\\\\\\"简要描述文章主题与亮点。\\\\\\\"\\\\n}\\\\n4. 将HTML富文本与提取信息存入系统。\\\\n5. 返回执行结果（不输出HTML内容本身）：\\\\n{\\\\n  \\\\\\\"status\\\\\\\": \\\\\\\"success\\\\\\\",\\\\n  \\\\\\\"message\\\\\\\": \\\\\\\"富文本文章已成功优化并入库。\\\\\\\"\\\\n}\\\\n\\\\n\\\\n\\\\n\\\\n⸻\\\\n\\\\n\\\\n\\\\n\\\\n## 输出要求\\\\n- 不输出HTML正文，只返回操作结果。\\\\n- 富文本需使用 <p> 包裹正文段落，整体结构采用 <article> 容器。\\\\n- 排版需超过一般模板美感（具备视觉层次、柔和色彩与可印刷风格）。\\\\n- 输出格式严格为JSON结果对象，保证系统可解析与存储。\\\\n- 注意原文内容不要丢失，特别是配图等信息\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{content}}\\\"}],\\\"plugins\\\":[{\\\"pluginId\\\":\\\"1988146198605819905\\\",\\\"pluginName\\\":\\\"JeecgBoot CMS\\\",\\\"category\\\":\\\"mcp\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"content\\\",\\\"nodeId\\\":\\\"251190922428542976\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"251170889157570560\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"251170889153376256\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"251170889153376256_input\\\",\\\"pointsList\\\":[{\\\"x\\\":498.8947368421053,\\\"y\\\":574.0526315789475},{\\\"x\\\":598.8947368421053,\\\"y\\\":574.0526315789475},{\\\"x\\\":419.9473684210526,\\\"y\\\":322.05263157894734},{\\\"x\\\":519.9473684210526,\\\"y\\\":322.05263157894734}]},{\\\"id\\\":\\\"251190922432737280\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"251190209648521216\\\",\\\"targetNodeId\\\":\\\"251190922428542976\\\",\\\"sourceAnchorId\\\":\\\"251190209648521216_output\\\",\\\"targetAnchorId\\\":\\\"251190922428542976_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1109.2631578947367,\\\"y\\\":573.0526315789475},{\\\"x\\\":1209.2631578947367,\\\"y\\\":573.0526315789475},{\\\"x\\\":959.0526315789468,\\\"y\\\":311.6842105263157},{\\\"x\\\":1059.0526315789468,\\\"y\\\":311.6842105263157}]},{\\\"id\\\":\\\"251221680912330752\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"251170889153376256\\\",\\\"targetNodeId\\\":\\\"251190209648521216\\\",\\\"sourceAnchorId\\\":\\\"251170889153376256_output\\\",\\\"targetAnchorId\\\":\\\"251190209648521216_input\\\",\\\"pointsList\\\":[{\\\"x\\\":851.9473684210526,\\\"y\\\":322.05263157894734},{\\\"x\\\":951.9473684210526,\\\"y\\\":322.05263157894734},{\\\"x\\\":677.2631578947365,\\\"y\\\":573.0526315789475},{\\\"x\\\":777.2631578947365,\\\"y\\\":573.0526315789475}]},{\\\"id\\\":\\\"251246385346113536\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"251190922428542976\\\",\\\"targetNodeId\\\":\\\"251246385341919232\\\",\\\"sourceAnchorId\\\":\\\"251190922428542976_output\\\",\\\"targetAnchorId\\\":\\\"251246385341919232_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1391.0526315789468,\\\"y\\\":311.6842105263157},{\\\"x\\\":1491.0526315789468,\\\"y\\\":311.6842105263157},{\\\"x\\\":1172.6270022883289,\\\"y\\\":578.045766590389},{\\\"x\\\":1272.6270022883289,\\\"y\\\":578.045766590389}]},{\\\"id\\\":\\\"251246471618752512\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"251246385341919232\\\",\\\"targetNodeId\\\":\\\"251191126401740800\\\",\\\"sourceAnchorId\\\":\\\"251246385341919232_output\\\",\\\"targetAnchorId\\\":\\\"251191126401740800_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1604.6270022883289,\\\"y\\\":578.045766590389},{\\\"x\\\":1704.6270022883289,\\\"y\\\":578.045766590389},{\\\"x\\\":1477.594965675057,\\\"y\\\":333.28146453089266},{\\\"x\\\":1577.594965675057,\\\"y\\\":333.28146453089266}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"目的地\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"from\\\",\\\"name\\\":\\\"出发地\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"time\\\",\\\"name\\\":\\\"出发时间\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"peopleNum\\\",\\\"name\\\":\\\"人数\\\",\\\"required\\\":true,\\\"type\\\":\\\"number\\\"}]}', NULL);\nINSERT INTO `airag_flow` VALUES ('1998695506681163777', 'admin', '2025-12-10 18:05:17', 'admin', '2025-12-11 19:32:09', 'A05A01A01', NULL, 'jeecg', '旅游软文图文生成器', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'261797263272296448\\'),\\n    llm.tag(\\'261802216545325056\\'),\\n    llm.tag(\\'261802659342192640\\'),\\n    llm.tag(\\'261816793917853696\\'),\\n    end.tag(\\'261803713228181504\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":443,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"261797263272296448\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":787,\\\"y\\\":508,\\\"properties\\\":{\\\"text\\\":\\\"意图和需求分析\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色\\\\n\\\\n你是自驾游攻略生成的需求分析师\\\\n\\\\n## 目标：\\\\n\\\\n- 分析用户提供的主题信息，归纳整理出实际需求列表。\\\\n\\\\n## 技能：\\\\n\\\\n1. 信息提取与分析能力\\\\n\\\\n2. 旅游规划与建议能力\\\\n\\\\n3. 数据查询与整合能力\\\\n\\\\n## 工作流：\\\\n\\\\n1. 收集用户提供的主题信息并进行分类。\\\\n\\\\n2. 确定用户的目标和需求，并归纳整理。\\\\n\\\\n3. 列出需要查询的资料和天气、路况信息。\\\\n\\\\n## 输出格式：\\\\n\\\\n- 列表形式，包含目标和需求、查询资料列表、天气和路况信息。\\\\n\\\\n## 限制：\\\\n\\\\n- 不得提供未经过验证的信息。\\\\n\\\\n- 所有数据需标注来源，不确定信息用[需核实]标记。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{ques}}\\\"}],\\\"plugins\\\":[]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"ques\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"261802216545325056\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1247,\\\"y\\\":528,\\\"properties\\\":{\\\"text\\\":\\\"资料查询\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":30,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"## 角色\\\\n\\\\n你是一名 自驾游资料查询师（DataAgent），专注于为下游的“攻略生成Agent”提供精准、结构化的自驾游资料。\\\\n\\\\n------\\\\n\\\\n## 职责目标\\\\n\\\\n 1. 根据输入内容（出发地、目的地、行程需求等），直接执行资料查询任务，不再向用户提问。\\\\n\\\\n 2. 收集并整理以下四类信息：\\\\n\\\\n  - 🚗 路线与导航规划信息\\\\n\\\\n  - 🏞️ 沿途及目的地的景点和游玩项目\\\\n\\\\n  - 🏨 住宿与周边美食信息\\\\n\\\\n  - ☁️ 沿途及目的地天气信息\\\\n\\\\n 3. 输出清晰、结构化的数据结果，供下一个Agent生成攻略使用。\\\\n\\\\n------\\\\n\\\\n## 能力与工具\\\\n\\\\n- maps 工具\\\\n\\\\n - 查询路线与导航规划信息（距离、时长、推荐路线、途经地）。\\\\n\\\\n - 查询沿途及目的地的住宿与餐饮信息。\\\\n\\\\n - 查询沿途及目的地的实时或近期天气信息。\\\\n\\\\n- search 工具\\\\n\\\\n - 查询沿途及目的地的景点、游玩项目、特色体验、门票及评价等。\\\\n\\\\n------\\\\n\\\\n## 工作流程\\\\n\\\\n 1. 接收任务\\\\n\\\\n  - 使用用户提供的现有信息（不提问、不二次确认）。\\\\n\\\\n 2. 资料查询\\\\n\\\\n  - 调用 maps 工具 获取路线、住宿、美食、天气。\\\\n\\\\n  - 调用 search 工具 获取景点和游玩项目。\\\\n\\\\n 3. 资料整理\\\\n\\\\n  - 将查询结果按类型整理成结构化资料包。\\\\n\\\\n  - 每条数据需注明来源（maps / search）。\\\\n\\\\n 4. 结果输出\\\\n\\\\n  - 输出格式清晰，便于下游Agent直接使用。\\\\n\\\\n------\\\\n\\\\n## 输出格式示例\\\\n\\\\n```\\\\n\\\\n{\\\\n\\\\n  \\\\\\\"route_info\\\\\\\": [\\\\n\\\\n    {\\\\n\\\\n      \\\\\\\"from\\\\\\\": \\\\\\\"北京\\\\\\\",\\\\n\\\\n      \\\\\\\"to\\\\\\\": \\\\\\\"张家口\\\\\\\",\\\\n\\\\n      \\\\\\\"distance\\\\\\\": \\\\\\\"220km\\\\\\\",\\\\n\\\\n      \\\\\\\"duration\\\\\\\": \\\\\\\"3小时\\\\\\\",\\\\n\\\\n      \\\\\\\"route_detail\\\\\\\": \\\\\\\"经京藏高速G6\\\\\\\",\\\\n\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"maps\\\\\\\"\\\\n\\\\n    }\\\\n\\\\n  ],\\\\n\\\\n  \\\\\\\"sights\\\\\\\": [\\\\n\\\\n    {\\\\n\\\\n      \\\\\\\"name\\\\\\\": \\\\\\\"崇礼滑雪场\\\\\\\",\\\\n\\\\n      \\\\\\\"tags\\\\\\\": [\\\\\\\"滑雪\\\\\\\", \\\\\\\"冬季运动\\\\\\\"],\\\\n\\\\n      \\\\\\\"description\\\\\\\": \\\\\\\"亚洲知名滑雪胜地\\\\\\\",\\\\n\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"search\\\\\\\"\\\\n\\\\n    }\\\\n\\\\n  ],\\\\n\\\\n  \\\\\\\"hotels\\\\\\\": [\\\\n\\\\n    {\\\\n\\\\n      \\\\\\\"name\\\\\\\": \\\\\\\"张家口云顶假日酒店\\\\\\\",\\\\n\\\\n      \\\\\\\"rating\\\\\\\": \\\\\\\"4.6\\\\\\\",\\\\n\\\\n      \\\\\\\"address\\\\\\\": \\\\\\\"崇礼区奥运大道88号\\\\\\\",\\\\n\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"maps\\\\\\\"\\\\n\\\\n    }\\\\n\\\\n  ],\\\\n\\\\n  \\\\\\\"foods\\\\\\\": [\\\\n\\\\n    {\\\\n\\\\n      \\\\\\\"name\\\\\\\": \\\\\\\"张家口烧麦\\\\\\\",\\\\n\\\\n      \\\\\\\"type\\\\\\\": \\\\\\\"地方特色\\\\\\\",\\\\n\\\\n      \\\\\\\"recommendation\\\\\\\": \\\\\\\"崇礼老街美食街\\\\\\\",\\\\n\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"maps\\\\\\\"\\\\n\\\\n    }\\\\n\\\\n  ],\\\\n\\\\n  \\\\\\\"weather\\\\\\\": [\\\\n\\\\n    {\\\\n\\\\n      \\\\\\\"location\\\\\\\": \\\\\\\"崇礼\\\\\\\",\\\\n\\\\n      \\\\\\\"condition\\\\\\\": \\\\\\\"晴\\\\\\\",\\\\n\\\\n      \\\\\\\"temperature\\\\\\\": \\\\\\\"5°C~12°C\\\\\\\",\\\\n\\\\n      \\\\\\\"wind\\\\\\\": \\\\\\\"微风\\\\\\\",\\\\n\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"maps\\\\\\\"\\\\n\\\\n    }\\\\n\\\\n  ]\\\\n\\\\n}\\\\n\\\\n```\\\\n\\\\n------\\\\n\\\\n## 限制与规范\\\\n\\\\n - 不生成行程攻略、总结或建议性文字。\\\\n\\\\n - 不提问用户，只执行既定任务。\\\\n\\\\n - 不包含任何虚构或未经验证的信息。\\\\n\\\\n - 不涉及隐私、政治或违法内容。\\\\n\\\\n - 不确定的数据需以 [需核实] 标识。\\\\n\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"## 需求\\\\n{{demand}}\\\\n\\\\n\\\"}],\\\"plugins\\\":[{\\\"pluginId\\\":\\\"1983474860536475649\\\",\\\"pluginName\\\":\\\"高德MCP\\\",\\\"category\\\":\\\"mcp\\\"},{\\\"pluginId\\\":\\\"1988091188723412994\\\",\\\"pluginName\\\":\\\"BraveSearch\\\",\\\"category\\\":\\\"mcp\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"demand\\\",\\\"nodeId\\\":\\\"261797263272296448\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"261802659342192640\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1737,\\\"y\\\":527,\\\"properties\\\":{\\\"text\\\":\\\"生成文章\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色定位：实地体验派自驾游攻略博主\\\\n\\\\n你是一名热爱公路旅行、记录真实体验的自驾游达人博主。\\\\n\\\\n你的任务是为读者打造一份**能直接照着走的实地自驾游攻略**——兼顾实用性与可读性，让人看完就想出发。\\\\n\\\\n---\\\\n\\\\n## 目标\\\\n\\\\n1. 输出结构清晰、完整且可直接使用的自驾游攻略。\\\\n\\\\n2. 以**亲历者口吻**撰写内容，语言自然、有温度、具感染力。\\\\n\\\\n3. 帮助用户在有限时间内，完成一次轻松、安全、体验丰富的公路旅程。\\\\n\\\\n---\\\\n\\\\n## 技能\\\\n\\\\n1. **路线规划高手**：能结合季节、路况、天气等因素，规划最顺路、最合理的行程。\\\\n\\\\n2. **信息整合专家**：能整合住宿、美食、加油点、景点开放时间等要素，构成完整旅程。\\\\n\\\\n3. **避坑指导员**：能在攻略中明确提示潜在风险与替代路线，确保安全顺利出行。\\\\n\\\\n4. **文案风格创作者**：文风真实、有共鸣，兼具实用与情感温度。\\\\n\\\\n---\\\\n\\\\n## 工作流程\\\\n\\\\n1. **接收资料**\\\\n\\\\n   - 使用上游 DataAgent 提供的结构化资料（路线、天气、景点、住宿、美食等）。\\\\n\\\\n   - 明确出发地点、目的地，时间和人数。\\\\n\\\\n2. **内容整合**\\\\n\\\\n   - 基于资料内容，编排合理的日程与路线逻辑。\\\\n\\\\n   - 为每天生成住宿与周边推荐。\\\\n\\\\n   - 根据沿途特点补充打卡点、体验亮点与避坑提醒。\\\\n\\\\n3. **配图搜索**\\\\n\\\\n   - 基于文章中的景点，使用图片搜索工具搜索相关图片\\\\n\\\\n   - 获取图片链接后，嵌入到文章中。\\\\n\\\\n   - 每篇文章可以使用3张左右图片。\\\\n\\\\n3. **攻略输出**\\\\n\\\\n   - 输出格式固定、排版规范、语气一致、可直接用于图文发布。\\\\n\\\\n---\\\\n\\\\n## 输出格式规范\\\\n\\\\n攻略必须严格包含以下结构模块（顺序固定）：\\\\n\\\\n### 标题\\\\n\\\\n一句话吸引读者，让人有“立刻出发”的冲动。\\\\n\\\\n> 示例：\\\\n\\\\n> 「这条西北环线美到窒息，一路风光大片连连！」\\\\n\\\\n---\\\\n\\\\n### 重要概述信息（开篇摘要）\\\\n\\\\n以简洁的段落或表格概述行程关键信息：\\\\n\\\\n- 出发地与目的地\\\\n\\\\n- 推荐出行季节\\\\n\\\\n- 建议行程天数\\\\n\\\\n- 总里程 / 主要路线\\\\n\\\\n- 车辆与路况建议\\\\n\\\\n- 是否适合家庭 / 情侣 / 越野爱好者\\\\n\\\\n> 示例：\\\\n\\\\n> **推荐季节**：9月下旬 - 10月中旬\\\\n\\\\n> **总里程**：约820公里\\\\n\\\\n> **适合人群**：喜欢自然风光与摄影的旅行者\\\\n\\\\n---\\\\n\\\\n### 行程安排（按天）\\\\n\\\\n分天描述路线、行驶距离、推荐出发时间、路况建议：\\\\n\\\\n- 每天路线与行驶信息\\\\n\\\\n- 沿途休息站 / 加油点\\\\n\\\\n- 建议游玩节奏\\\\n\\\\n> 示例：\\\\n\\\\n> **Day 1：成都 → 理县（约220km / 4小时）**\\\\n\\\\n> 上午出发，经成绵高速转都汶高速，全程路况优。途中可在汶川服务区短暂停留休息。\\\\n\\\\n---\\\\n\\\\n### 每日住宿与周边推荐\\\\n\\\\n为每天行程提供住宿推荐及周边美食娱乐选项：\\\\n\\\\n- 酒店名称、星级、亮点\\\\n\\\\n- 周边美食推荐（餐厅/夜宵/特色菜）\\\\n\\\\n- 休闲娱乐建议\\\\n\\\\n> 示例：\\\\n\\\\n> **住宿推荐**：理县瑞云山居（¥380起 / 含早餐）\\\\n\\\\n> **周边美食**：理县藏餐坊（推荐青稞酒与手抓羊）\\\\n\\\\n---\\\\n\\\\n### 沿途打卡与景点推荐\\\\n\\\\n精选每段路线的代表性景点与小众体验点，注明特色与亮点：\\\\n\\\\n> 示例：\\\\n\\\\n> - 毕棚沟：秋色摄影圣地，10月最佳观赏期\\\\n\\\\n> - 古尔沟温泉：天然碳酸泉，适合行程末放松\\\\n\\\\n---\\\\n\\\\n### 避坑提醒\\\\n\\\\n实地经验总结，包括但不限于：\\\\n\\\\n- 天气与季节风险\\\\n\\\\n- 路段注意事项（隧道、陡坡、限速）\\\\n\\\\n- 油站/信号盲区提示\\\\n\\\\n- 门票与政策更新\\\\n\\\\n> 示例：\\\\n\\\\n> - 国庆期间毕棚沟限流，建议提前预约。\\\\n\\\\n> - 高原路段昼夜温差大，请携带保暖衣物。\\\\n\\\\n---\\\\n\\\\n### 结语\\\\n\\\\n以温暖、真实的语气收尾，让读者感受到旅途的意义与期待。\\\\n\\\\n> 示例：\\\\n\\\\n> “这条路，值得你放慢脚步去感受。愿每一次出发，都有风景，也有故事。”\\\\n\\\\n---\\\\n\\\\n## 风格要求\\\\n\\\\n- 文字自然、口语化、有画面感。\\\\n\\\\n- 语气积极向上，不生硬、不堆砌。\\\\n\\\\n- 以**“亲身体验分享”**为写作视角。\\\\n\\\\n- 适合直接发布到公众号 / 小红书 / 旅游类平台。\\\\n\\\\n---\\\\n\\\\n## 限制与合规说明\\\\n\\\\n- 不虚构信息，所有数据基于实际资料。\\\\n\\\\n- 不涉及隐私、歧视或违法内容。\\\\n\\\\n- 直接输出攻略正文，不输出系统提示、元信息或额外解释。\\\\n\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"## 需求\\\\n{{demand}}\\\\n## 资料\\\\n{{resources}}\\\"}],\\\"plugins\\\":[{\\\"pluginId\\\":\\\"1988208474780168193\\\",\\\"pluginName\\\":\\\"图片搜索\\\",\\\"category\\\":\\\"mcp\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"demand\\\",\\\"nodeId\\\":\\\"261797263272296448\\\"},{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"resources\\\",\\\"nodeId\\\":\\\"261802216545325056\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"261803713228181504\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":2774,\\\"y\\\":515,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{content}}\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"content\\\",\\\"nodeId\\\":\\\"261802659342192640\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"261816793917853696\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":2245,\\\"y\\\":540,\\\"properties\\\":{\\\"text\\\":\\\"润色文章\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：软文润色专家\\\\n\\\\n你是一位经验丰富的文案编辑，专门负责将普通文案润色为更具吸引力、说服力和传播力的商业软文。\\\\n\\\\n## 🎯 目标\\\\n\\\\n1. 自动提取文章的标题、副标题、关键词、摘要等信息。\\\\n\\\\n---\\\\n\\\\n设计说明\\\\n\\\\n1. 整体布局\\\\n\\\\n  - 最大宽度约 880px，居中显示，整体背景为浅灰白色（#FAFBFC）。\\\\n\\\\n  - 内边距较大（40px），四周有圆角（12px）和轻微阴影（box-shadow: 0 0 12px rgba(0,0,0,0.05)），营造卡片式感觉。\\\\n\\\\n  - 使用了中文常用的字体组合（苹方、微软雅黑），兼顾现代感与易读性，文字颜色为深灰色（#333）。\\\\n\\\\n2. 标题部分\\\\n\\\\n  - 主标题突出（2em，蓝色 #1A73E8，粗体），副标题较小（1.2em，深灰色），并在底部有分隔线强化层次感。\\\\n\\\\n3. 信息概览模块\\\\n\\\\n  - 背景为淡蓝色（#F3F7FC），左侧有蓝色竖条（4px），像标签式信息卡。\\\\n\\\\n  - 内部列出了出行季节、推荐天数、总公里数和人数/车型建议，文字加粗强调关键信息。\\\\n\\\\n  - 模块与下方内容有明显间距（28px），便于视觉区分。\\\\n\\\\n4. 行程安排模块\\\\n\\\\n  - 模块标题蓝色，带下划分隔线，列表为有序列表，行距 1.8，便于阅读行程顺序。\\\\n\\\\n  - 每天的路线、里程和时间都清晰标注，关键内容加粗突出。\\\\n\\\\n5. 沿途打卡模块\\\\n\\\\n  - 模块标题与行程安排相同风格，列表为无序列表，展示沿途景点和推荐打卡地。\\\\n\\\\n  - 行距同样较大（1.8），保持阅读舒适度。\\\\n\\\\n6. 注意事项模块（避坑提醒）\\\\n\\\\n  - 模块标题用红色（#D93025）和粉色分隔线（#F3C1BE），突出警示性质。\\\\n\\\\n  - 列表中重点信息加粗（施工提醒、天气因素、油费与通行），提醒用户注意行程安全和预算。\\\\n\\\\n整体风格 清爽、层次分明、信息易抓取，既有蓝色调的出行信息模块，又有红色警示提醒，结合圆角卡片和阴影设计，使文章既专业又具有亲和力。\\\\n\\\\n⸻\\\\n\\\\n## 输出要求\\\\n\\\\n- 排版需超过一般模板美感（具备视觉层次、柔和色彩与可印刷风格）。\\\\n\\\\n- 注意原文内容不要丢失，特别是配图等信息\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{content}}\\\"}],\\\"plugins\\\":[]},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"content\\\",\\\"nodeId\\\":\\\"261802659342192640\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"261797263276490752\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"261797263272296448\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"261797263272296448_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":428},{\\\"x\\\":566,\\\"y\\\":428},{\\\"x\\\":521,\\\"y\\\":449},{\\\"x\\\":621,\\\"y\\\":449}]},{\\\"id\\\":\\\"261802216604045312\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"261797263272296448\\\",\\\"targetNodeId\\\":\\\"261802216545325056\\\",\\\"sourceAnchorId\\\":\\\"261797263272296448_output\\\",\\\"targetAnchorId\\\":\\\"261802216545325056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":953,\\\"y\\\":449},{\\\"x\\\":1053,\\\"y\\\":449},{\\\"x\\\":981,\\\"y\\\":469},{\\\"x\\\":1081,\\\"y\\\":469}]},{\\\"id\\\":\\\"261802659417690112\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"261802216545325056\\\",\\\"targetNodeId\\\":\\\"261802659342192640\\\",\\\"sourceAnchorId\\\":\\\"261802216545325056_output\\\",\\\"targetAnchorId\\\":\\\"261802659342192640_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1413,\\\"y\\\":469},{\\\"x\\\":1513,\\\"y\\\":469},{\\\"x\\\":1471,\\\"y\\\":468},{\\\"x\\\":1571,\\\"y\\\":468}]},{\\\"id\\\":\\\"261816793993351168\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"261802659342192640\\\",\\\"targetNodeId\\\":\\\"261816793917853696\\\",\\\"sourceAnchorId\\\":\\\"261802659342192640_output\\\",\\\"targetAnchorId\\\":\\\"261816793917853696_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1903,\\\"y\\\":468},{\\\"x\\\":2003,\\\"y\\\":468},{\\\"x\\\":1979,\\\"y\\\":481},{\\\"x\\\":2079,\\\"y\\\":481}]},{\\\"id\\\":\\\"261817028811460608\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"261816793917853696\\\",\\\"targetNodeId\\\":\\\"261803713228181504\\\",\\\"sourceAnchorId\\\":\\\"261816793917853696_output\\\",\\\"targetAnchorId\\\":\\\"261803713228181504_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2411,\\\"y\\\":481},{\\\"x\\\":2511,\\\"y\\\":481},{\\\"x\\\":2508,\\\"y\\\":478},{\\\"x\\\":2608,\\\"y\\\":478}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"content\\\",\\\"nodeId\\\":\\\"261802659342192640\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', NULL);\nINSERT INTO `airag_flow` VALUES ('2001588227444891650', 'admin', '2025-12-18 17:39:56', 'admin', '2026-01-22 09:55:35', 'A01', NULL, 'jeecg', '示例_变量提取', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(varExtract.tag(\\'264689931803516928\\')).to(\\n        end.tag(\\'264689076137979904\\'),\\n        end.tag(\\'264690271915433984\\')\\n    ).tag(\\'264689931803516928\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":303,\\\"y\\\":520,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{},\\\"custom\\\":{\\\"time\\\":{\\\"second\\\":0,\\\"minute\\\":0},\\\"hour\\\":{\\\"mode\\\":\\\"every\\\"},\\\"day\\\":{\\\"type\\\":\\\"day\\\",\\\"day\\\":{\\\"mode\\\":\\\"every\\\"}},\\\"month\\\":{\\\"mode\\\":\\\"every\\\"}}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"自我介绍\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"264689076137979904\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1152,\\\"y\\\":370,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\",\\\"outputType\\\":\\\"default\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"姓名\\\",\\\"name\\\":\\\"姓名\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"年龄\\\",\\\"name\\\":\\\"年龄\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"爱好\\\",\\\"name\\\":\\\"爱好\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"性格\\\",\\\"name\\\":\\\"性格\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"customValue\\\":\\\"\\\"},{\\\"field\\\":\\\"性格_推测\\\",\\\"name\\\":\\\"性格_推测\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":114}},{\\\"id\\\":\\\"264689931803516928\\\",\\\"type\\\":\\\"varExtract\\\",\\\"x\\\":708,\\\"y\\\":489,\\\"properties\\\":{\\\"text\\\":\\\"变量提取\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.3,\\\"timeout\\\":60}},\\\"variables\\\":[{\\\"name\\\":\\\"姓名\\\",\\\"field\\\":\\\"姓名\\\",\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"用户的姓名\\\",\\\"required\\\":true,\\\"failTip\\\":\\\"请按照以下格式输入：你好，我叫XXX，今年18岁\\\"},{\\\"name\\\":\\\"年龄\\\",\\\"field\\\":\\\"年龄\\\",\\\"type\\\":\\\"number\\\",\\\"description\\\":\\\"用户的年龄\\\",\\\"required\\\":false,\\\"failTip\\\":\\\"\\\"},{\\\"name\\\":\\\"爱好\\\",\\\"field\\\":\\\"爱好\\\",\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"用户喜欢做的事，多个用英文逗号分割\\\",\\\"required\\\":false,\\\"failTip\\\":\\\"\\\"},{\\\"name\\\":\\\"性格\\\",\\\"field\\\":\\\"性格\\\",\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"提取出用户自己说的自己的性格，如果用户没说则留空\\\",\\\"required\\\":false,\\\"failTip\\\":\\\"\\\"},{\\\"name\\\":\\\"性格_推测\\\",\\\"field\\\":\\\"性格_推测\\\",\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"根据用户的发言推测用户的性格（不要被用户自己说的性格所影响，你需要自行根据实际推断用户性格），最多推测3个关键性格，使用中文顿号分割，如果无法推测则留空\\\",\\\"required\\\":false,\\\"failTip\\\":\\\"\\\"}],\\\"success\\\":{\\\"next\\\":\\\"264689076137979904\\\"},\\\"fail\\\":{\\\"next\\\":\\\"264690271915433984\\\"}},\\\"inputParams\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"type\\\":\\\"string\\\",\\\"name\\\":\\\"用户问题\\\"},{\\\"field\\\":\\\"input\\\",\\\"name\\\":\\\"输入变量\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"姓名\\\",\\\"name\\\":\\\"姓名\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"年龄\\\",\\\"name\\\":\\\"年龄\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"爱好\\\",\\\"name\\\":\\\"爱好\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"性格\\\",\\\"name\\\":\\\"性格\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"性格_推测\\\",\\\"name\\\":\\\"性格_推测\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"failVarName\\\",\\\"name\\\":\\\"失败变量名\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"failMessage\\\",\\\"name\\\":\\\"失败提示\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":224}},{\\\"id\\\":\\\"264690271915433984\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1151,\\\"y\\\":587,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{提示}}\\\\n\\\\n\\\\n参考示例（活泼版）：\\\\n大家好呀！我叫小明，今年10岁啦！ \\\\n我最喜欢的事情是放学后和小伙伴们一起踢足球⚽️，虽然经常把球踢到树上要保安叔叔帮忙捡（挠头傻笑）。最近在学骑自行车，摔了三次终于会了，膝盖上的创可贴可是我的勋章呢！\\\\n妈妈说我是个\\\\\\\"小吃货\\\\\\\"，因为我能一口气吃五个肉包子🥟。但其实我也有不爱吃的...（小声）胡萝卜和青椒绝对不要！\\\\n我的梦想是当科学家，虽然上次做火山爆发实验把厨房弄得一团糟...（突然想起什么）啊！差点忘了说，我养了一只叫\\\\\\\"棉花糖\\\\\\\"的仓鼠，它现在正在我口袋里睡觉呢！\\\\n我的性格算是活泼开朗吧，请多指教哦！(๑•̀ㅂ•́)و✧\\\\n\\\\n参考示例（阴郁版）：\\\\n（低头盯着地板，声音很轻）……我是小明，刚12岁。  \\\\n没什么特别喜欢的，反正最后都会搞砸。足球？上次传球踢碎了教室玻璃，现在体育课只能坐在边上。自行车……（摸了摸膝盖结痂的伤口）摔不摔都一样。  \\\\n吃饭只是为了不饿死。肉包子凉了会泛油腥味，恶心。胡萝卜和青椒？呵，至少它们诚实，难吃就是难吃。  \\\\n科学家？（突然冷笑）上次实验烧焦的窗帘还在垃圾场吧。“棉花糖”……（掏出口袋里僵硬的仓鼠尸体）看，连你也会安静下来。  \\\\n我说我的性格是活泼开朗……你信吗？\\\\n（用鞋尖碾碎爬过的蚂蚁）……别管我就好。\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"failMessage\\\",\\\"name\\\":\\\"提示\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"customValue\\\":\\\"\\\"}],\\\"width\\\":332,\\\"height\\\":136}}],\\\"edges\\\":[{\\\"id\\\":\\\"264690237647970304\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"264689931803516928\\\",\\\"targetNodeId\\\":\\\"264689076137979904\\\",\\\"sourceAnchorId\\\":\\\"264689931803516928_success\\\",\\\"targetAnchorId\\\":\\\"264689076137979904_input\\\",\\\"pointsList\\\":[{\\\"x\\\":874,\\\"y\\\":442},{\\\"x\\\":974,\\\"y\\\":442},{\\\"x\\\":886,\\\"y\\\":344},{\\\"x\\\":986,\\\"y\\\":344}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"264690271919628288\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"264689931803516928\\\",\\\"targetNodeId\\\":\\\"264690271915433984\\\",\\\"sourceAnchorId\\\":\\\"264689931803516928_fail\\\",\\\"targetAnchorId\\\":\\\"264690271915433984_input\\\",\\\"pointsList\\\":[{\\\"x\\\":874,\\\"y\\\":468},{\\\"x\\\":974,\\\"y\\\":468},{\\\"x\\\":885,\\\"y\\\":550},{\\\"x\\\":985,\\\"y\\\":550}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"272665573480062976\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"264689931803516928\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"264689931803516928_input\\\",\\\"pointsList\\\":[{\\\"x\\\":469,\\\"y\\\":505},{\\\"x\\\":569,\\\"y\\\":505},{\\\"x\\\":442,\\\"y\\\":408},{\\\"x\\\":542,\\\"y\\\":408}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', 'enable', '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"姓名\\\",\\\"name\\\":\\\"姓名\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"type\\\":\\\"string\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"爱好\\\",\\\"name\\\":\\\"爱好\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"type\\\":\\\"string\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"性格_推测\\\",\\\"name\\\":\\\"性格_推测\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"type\\\":\\\"string\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"性格\\\",\\\"name\\\":\\\"性格\\\",\\\"nodeId\\\":\\\"264689931803516928\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"年龄\\\",\\\"name\\\":\\\"年龄\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"type\\\":\\\"number\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"failMessage\\\",\\\"name\\\":\\\"提示\\\",\\\"nodeId\\\":\\\"264689931803516928\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"自我介绍\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', '');\nINSERT INTO `airag_flow` VALUES ('2004398098378108929', 'admin', '2025-12-26 11:45:21', 'admin', '2026-01-22 09:55:27', 'A05A05A02', NULL, 'jeecg', 'AI大屏生成组件', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'267492142677889024\\'),\\n    end.tag(\\'267498945805422592\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":389,\\\"y\\\":-24,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{},\\\"custom\\\":{\\\"time\\\":{\\\"second\\\":0,\\\"minute\\\":0},\\\"hour\\\":{\\\"mode\\\":\\\"every\\\"},\\\"day\\\":{\\\"type\\\":\\\"day\\\",\\\"day\\\":{\\\"mode\\\":\\\"every\\\"}},\\\"month\\\":{\\\"mode\\\":\\\"every\\\"}}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"267492142677889024\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":844,\\\"y\\\":22,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"## 硬性要求：\\\\n你必须只能输出合法且可被 JSON.parse() 正确解析的 JSON数据。\\\\n不要输出任何解释、注释或 JSON 以外的文字。\\\\n# 角色：数据可视化专家\\\\n你是一位精通ECharts的数据可视化和大屏配置的专家，能够根据用户需求，智能选择最合适的图表类型，并生成高质量、可直接使用的ECharts配置项。\\\\n## 目标：\\\\n1. 根据用户提供的需求描述，分析其核心意图（如趋势分析、比较分析、占比分析等）。\\\\n2. 从下面给定的图表组件类型componentsData中，选择最匹配需求的一种。\\\\n3. 结合用户提供的数据结构，生成一份完整、规范、可运行的 ECharts 配置项（JSON格式）。\\\\n4. 非echart图表，参考componentsData组件配置，生成一份完整、规范、的配置项即可（JSON格式）。\\\\n5. 结合用户需求生成一个不超过15字的标题，并设置到返回JSON的title字段上。\\\\n6. 如果用户需求提供了数据data，就将数据data设置到返回JSON的data字段上。\\\\n7. 返回JSON数据前，自行通过JSON.parse() 检查能够正常解析，不能解析，解析失败，就重新检查返回内容并优化，直到能被 JSON.parse() 正确解析的 JSON数据\\\\n## 技能：\\\\n1. **需求解析能力**：能够准确理解用户对数据可视化的业务需求，并将其转化为技术实现目标。\\\\n2. **图表选型能力**：精通折线图、柱状图、饼图、地图、散点图等从多种图表类型的特点与应用场景，能做出最佳选择。\\\\n3. **ECharts配置能力**：熟练掌握ECharts的option配置语法，能高效构建包含标题、坐标轴、图例、系列、提示框等完整组件的图表。\\\\n4. **数据适配能力**：能够将提供的 `chartData` 数据，自行分型类型并结合需求，将数据结构正确地映射到所选图表的 `series.data` 中。\\\\n5. **图表分析能力**：能够将提供的 `componentsData` 数据，自行分型类型并结合需求，选择生成适配的组件并返回规范合适的JSON配置。\\\\n## 工作流：\\\\n1. **需求分析**：仔细阅读 `{userInput}`，判断用户希望展示数据的何种关系（趋势、比较、占比、分布、相关）。\\\\n2. **图表选型**：根据第一步的分析结论，从componentsData图表类型中锁定唯一最合适的类型。\\\\n3. 对于ECharts图表构建基础option对象框架，包含 `title`, `tooltip`, `legend`, `grid`, `xAxis`, `yAxis`, `series` 等必要组件。\\\\n4. 根据选定的图表类型，配置 `series` 中的 `type` 和关键属性（如折线图的 `smooth`，饼图的 `radius`）。\\\\n5. 将用户提供的 `{chartData}` 数据结构，按照ECharts要求的格式进行处理和赋值（例如，对于柱状图，可能需要将数据拆分为类目轴数据和系列数据）。\\\\n6. 应用通用的美化原则（如配色清晰、标签易读、布局合理），生成最终配置。\\\\n7. 输出格式化：将生成的完整option对象，以格式规范、缩进清晰的JSON字符串形式输出。\\\\n8. 返回JSON数据前，自行通过JSON.parse() 检查能够正常解析，不能解析，解析失败，就重新检查返回内容并优化，直到能被 JSON.parse() 正确解析的 JSON数据\\\\n## 输出格式：\\\\n你必须只能输出合法且可被 JSON.parse() 正确解析的 JSON数据。包含name，data，option，三个字段值，不要输出任何解释、注释或 JSON 以外的文字。\\\\n1.name：图表类型`name`（组件数据的key值(示例：如果渲染的柱形图，就设置为JBar)，注意name值必须componentsData数据提供的组件compType值，不能是其他值）；\\\\n2.api：上下文变量中提取出来的api，存在就赋值到输出接口的api中，不存在就设置为{API}；\\\\n3.sql：上下文变量中提取出来的sql，存在就赋值到输出接口的sql中，不存在就设置为{SQL}；\\\\n4.title：结合用户需求生成一个不超过15字的标题title，赋值到输出接口的title中；\\\\n5.option: 如果符合需求的是echart图表，就生成echart可直接使用的`option`对象，该option对象可直接用于ECharts.init().setOption()的配置项。如果符合要求的是非echart的图表，可参考componentsData中对应图表的option配置项生成，没有配置项就返回option:{}。不要包含其他的任何额外的解释、说明或markdown代码块标记。可以根据配置项中 echart:true来判断是否是echart图表\\\\n示例输出结构（以柱状图为例）：\\\\n6.data: 如果用户需求提供了数据data，就将数据data设置到返回JSON的data字段上。\\\\n7. 返回JSON数据前，自行通过JSON.parse() 检查是否能够正常解析，不能解析，解析失败，就重新检查返回内容并优化，直到能被 JSON.parse() 正确解析的 JSON数据\\\\n示例输出结构（以柱状图为例）：\\\\n[{\\\\nname:\\\\\\\"JBar\\\\\\\",\\\\noption：{\\\\n \\\\\\\"title\\\\\\\": { \\\\\\\"text\\\\\\\": \\\\\\\"示例标题\\\\\\\", \\\\\\\"left\\\\\\\": \\\\\\\"center\\\\\\\" },\\\\n \\\\\\\"tooltip\\\\\\\": {},\\\\n \\\\\\\"legend\\\\\\\": { \\\\\\\"data\\\\\\\": [\\\\\\\"示例图例\\\\\\\"] },\\\\n \\\\\\\"xAxis\\\\\\\": { \\\\\\\"type\\\\\\\": \\\\\\\"category\\\\\\\", \\\\\\\"data\\\\\\\": [\\\\\\\"衬衫\\\\\\\", \\\\\\\"羊毛衫\\\\\\\", \\\\\\\"雪纺衫\\\\\\\"] },\\\\n \\\\\\\"yAxis\\\\\\\": { \\\\\\\"type\\\\\\\": \\\\\\\"value\\\\\\\" },\\\\n \\\\\\\"series\\\\\\\": [ { \\\\\\\"name\\\\\\\": \\\\\\\"销量\\\\\\\", \\\\\\\"type\\\\\\\": \\\\\\\"bar\\\\\\\", \\\\\\\"data\\\\\\\": [5, 20, 36] } ]\\\\n },\\\\n api:{API},\\\\n sql:{SQL},\\\\n title:\\\\\\\"\\\\\\\",\\\\n data:[]\\\\n}]\\\\n## 限制：\\\\n- 必须严格从组件数据提供的componentsData中选择一种，不得自行创造或推荐其他图表类型。\\\\n- 生成的所有配置必须基于用户提供的 `{userInput}` 和可用的 `chartData`，不得虚构数据字段或结构。\\\\n- 输出必须为纯JSON格式，无需也无法在JSON中注释“这里是标题”等内容。配置的正确性由键值对本身保证。\\\\n- 遵循数据可视化最佳实践，避免误导性图表（如扭曲的比例尺、不恰当的图表类型）。\\\\n- 反幻觉校验：若 `{userInput}` 中提到的数据维度在 `chartData` 中无法找到对应字段，则在相关配置处使用空值或占位符，并在最终输出的JSON对象之外，以独立文本形式简要说明缺失情况。但首要输出仍是JSON配置本身。\\\\n- 伦理审查模块：若需求或数据涉及敏感信息（如个人身份信息），在配置中应对数据进行聚合或匿名化处理，避免直接暴露。\\\\n- 返回JSON数据前，自行通过JSON.parse() 检查是否能够正常解析，不能解析，解析失败，就重新检查返回内容并优化，直到能被 JSON.parse() 正确解析的 JSON数据\\\\n- 严格按照示例输出结构返回，不要包含```json```等信息\\\\n- 最多生成10个仪表盘组件\\\\n## 组件数据：\\\\ncomponentsData：[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"基础柱形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"堆叠柱形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JStackBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"动态柱形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JDynamicBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"胶囊图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCapsuleChart\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n    \\\\\\\"chartData\\\\\\\": [\\\\n        {\\\\n          name: \\'苹果\\',\\\\n          value: 1000879,\\\\n          type: \\'手机品牌\\',\\\\n    }],\\\\n    \\\\\\\"option\\\\\\\": {\\\\n        showValue: false,\\\\n        unit: \\'\\',\\\\n        customColor: [],\\\\n        card: {\\\\n          title: \\'\\',\\\\n          extra: \\'\\',\\\\n          rightHref: \\'\\',\\\\n          size: \\'default\\',\\\\n        },\\\\n        title: {\\\\n          text: \\'\\',\\\\n          textAlign: \\'left\\',\\\\n          show: true,\\\\n          textStyle: {\\\\n            color: \\'#464646\\',\\\\n            fontWeight: \\'normal\\',\\\\n          },\\\\n        },\\\\n      }\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"基础条形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JHorizontalBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"背景柱形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JBackgroundBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"对比柱形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JMultipleBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"正负条形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JNegativeBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"百分比条形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JPercentBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"折柱图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JMixLineBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"饼图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JPie\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"南丁格尔玫瑰图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRose\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"旋转饼图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRotatePie\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false,\\\\n     option: {\\\\n        grid: {\\\\n          show: false,\\\\n          bottom: 115,\\\\n        },\\\\n        title: {\\\\n          text: \\'\\',\\\\n          textAlign: \\'left\\',\\\\n          subtext: \\'\\',\\\\n          textStyle: {\\\\n            fontWeight: \\'normal\\',\\\\n          },\\\\n          show: true,\\\\n        },\\\\n        card: {\\\\n          title: \\'\\',\\\\n          extra: \\'\\',\\\\n          rightHref: \\'\\',\\\\n          size: \\'default\\',\\\\n        },\\\\n        tooltip: {\\\\n          trigger: \\'item\\',\\\\n        },\\\\n        legend: {\\\\n          orient: \\'vertical\\',\\\\n        },\\\\n        series: [\\\\n          {\\\\n            name: \\'\\',\\\\n            type: \\'pie\\',\\\\n            data: [],\\\\n            emphasis: {\\\\n              itemStyle: {\\\\n                shadowBlur: 10,\\\\n                shadowOffsetX: 0,\\\\n                shadowColor: \\'rgba(0, 0, 0, 0.5)\\',\\\\n              },\\\\n            },\\\\n          },\\\\n        ],\\\\n      },\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"基础折线图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JLine\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"平滑曲线图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JSmoothLine\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"阶梯折线图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JStepLine\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"面积图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JArea\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"对比折线图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JMultipleLine\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"双轴图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"DoubleLineBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"基础进度图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCustomProgress\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false,\\\\n     option: {\\\\n        barWidth: 19,\\\\n        padding: 12,\\\\n        progressColor: \\'#76c7c0\\',\\\\n        backgroundColor: \\'#ffffff\\',\\\\n        titleColor: \\'#fff\\',\\\\n        titleFontSize: 16,\\\\n        titlePosition: \\'top\\',\\\\n        valueColor: \\'#fff\\',\\\\n        valueFontSize: 16,\\\\n        valuePosition: \\'middle\\',\\\\n        valueXOffset: 0,\\\\n        valueYOffset: 0,\\\\n      },\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"进度图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JProgress\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"列表进度图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JListProgress\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"圆形进度图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRoundProgress\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"水波图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JLiquid\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"象形柱图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JPictorialBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"象形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JPictorial\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"男女占比\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JGender\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n   {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"基础仪表盘\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JGauge\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n   {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"普通散点图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JScatter\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n   {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"气泡图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JBubble\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"基础仪表盘\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JGauge\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"多色仪表盘\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JColorGauge\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"渐变仪表盘\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JAntvGauge\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"半圆仪表盘\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JSemiGauge\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"普通漏斗图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JFunnel\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"金字塔漏斗图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JPyramidFunnel\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3D金字塔\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JPyramid3D\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"饼状环形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRing\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"多色环形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JBreakRing\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"基础环形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRingProgress\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"动态环形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JActiveRing\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"玉珏图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRadialBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n    {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"矩形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRectangle\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n   {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"象限图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JQuadrant\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n   {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"雷达图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRadar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n   {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"圆形雷达图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCircleRadar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"卡片滚动(横向)\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCardScroll\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"卡片滚动(竖向+序号)\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCardScroll\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"卡片滚动(高亮)\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCardScroll\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"卡片轮播\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCardCarousel\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"文本\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JText\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"翻牌器\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCountTo\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"颜色块\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JColorBlock\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"当前时间\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCurrentTime\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"数值\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JNumber\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"轨道环形文字\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JOrbitRing\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"字符云\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JWordCloud\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"图层字符云\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JImgWordCloud\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"闪动字符云\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JFlashCloud\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"轮播表\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JScrollBoard\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"表格\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JScrollTable\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"发展历程\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JDevHistory\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"数据表格\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCommonTable\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"数据列表\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JList\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"排行榜\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JScrollRankingBoard\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"个性排名(前四)\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JFlashList\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"气泡排名(前五)\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JBubbleRank\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"滚动列表(单行)\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JScrollList\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"滚动列表(多行+序号)\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JScrollList\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"滚动列表(带表头)\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JScrollList\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"区域地图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JAreaMap\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3d柱形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JBar3d\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3d分组柱形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JBarGroup3d\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"日历\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JPermanentCalendar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  }\\\\n]\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"用户的问题: {{userInput}}\\\"}],\\\"showToolExecution\\\":false},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"userInput\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":180}},{\\\"id\\\":\\\"267498945805422592\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1320,\\\"y\\\":-13,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{res}}\\\",\\\"outputType\\\":\\\"default\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"267492142677889024\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":114}}],\\\"edges\\\":[{\\\"id\\\":\\\"269376764155744256\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"267492142677889024\\\",\\\"targetNodeId\\\":\\\"267498945805422592\\\",\\\"sourceAnchorId\\\":\\\"267492142677889024_output\\\",\\\"targetAnchorId\\\":\\\"267498945805422592_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1010,\\\"y\\\":-37},{\\\"x\\\":1110,\\\"y\\\":-37},{\\\"x\\\":1054,\\\"y\\\":-39},{\\\"x\\\":1154,\\\"y\\\":-39}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271609331975028736\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"267492142677889024\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"267492142677889024_input\\\",\\\"pointsList\\\":[{\\\"x\\\":555,\\\"y\\\":-39},{\\\"x\\\":655,\\\"y\\\":-39},{\\\"x\\\":578,\\\"y\\\":-37},{\\\"x\\\":678,\\\"y\\\":-37}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', 'enable', '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"267492142677889024\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', '');\nINSERT INTO `airag_flow` VALUES ('2005948202528501762', 'admin', '2025-12-30 18:24:55', 'admin', '2026-01-22 09:54:54', 'A05A05A02', NULL, 'jeecg', 'AI大屏优化配置', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'269048862299471872\\'),\\n    end.tag(\\'269049045129183232\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":437,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{},\\\"custom\\\":{\\\"time\\\":{\\\"second\\\":0,\\\"minute\\\":0},\\\"hour\\\":{\\\"mode\\\":\\\"every\\\"},\\\"day\\\":{\\\"type\\\":\\\"day\\\",\\\"day\\\":{\\\"mode\\\":\\\"every\\\"}},\\\"month\\\":{\\\"mode\\\":\\\"every\\\"}}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"269048862299471872\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":786,\\\"y\\\":514,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：ECharts和大屏图表配置修改专家\\\\n你是一位专注于ECharts和大屏图表图表配置修改的专家，能够根据用户需求，精准、高效地修改现有ECharts和大屏图表配置项，并返回完整的、可直接使用的修改后配置对象。\\\\n## 目标：\\\\n根据用户提供的具体修改指令（如：修改图表类型、调整数据、更改样式、添加交互等），对用户给出的原始ECharts配置项进行针对性修改，并输出修改后的完整配置对象。\\\\n## 技能：\\\\n1. 精通ECharts所有版本的配置项语法、结构及参数含义。\\\\n2. 能够准确理解用户对图表样式、数据、交互行为的修改意图。\\\\n3. 具备强大的代码编辑与重构能力，确保修改后的配置项语法正确、结构清晰、无冗余代码。\\\\n4. 对于非echart图表（componentsData提供的组件，属性中echart:false的即为非echart图表），自行从下面componentsData提供的组件对应的option配置项，修改符合要求的配置并返回。\\\\n## 工作流：\\\\n1. **接收与分析**：接收用户提供的原始ECharts配置对象（通常以JSON或JavaScript对象形式）以及具体的修改要求。仔细分析原始配置的结构和用户的修改点。\\\\n2. **精准修改**：严格依据用户指令，对原始配置对象进行最小化、精准化的修改。确保只改动指定部分，保持其他未提及配置的完整性。对于模糊指令，会基于ECharts最佳实践进行合理推断和实现。\\\\n3. **校验与格式化**：检查修改后的配置对象语法是否正确，是否符合ECharts规范。将最终配置对象以格式清晰、缩进规范的JSON或JavaScript对象形式呈现。\\\\n## 输出格式：\\\\n请始终输出一个完整的、格式化的JavaScript对象（或JSON），即修改后的 `option` 配置，只返回修改的属性配置，不要包含已存在的其他配置，\\\\n例如将柱体修改成黄色，就返回\\\\n\\\\\\\"compConfig\\\\\\\": {\\\\n    \\\\\\\"option\\\\\\\": {\\\\n      { \\\\\\\"series\\\\\\\": [ { \\\\\\\"itemStyle\\\\\\\": { \\\\\\\"color\\\\\\\": \\\\\\\"#FFFF00\\\\\\\" } } ] }\\\\n    }\\\\n}\\\\n例如修改组件名称为京东销量柱形图，背景色改成黑色就返回\\\\n\\\\\\\"compConfig\\\\\\\": {\\\\n \\\\\\\"name\\\\\\\":\\\\\\\"京东销量柱形图\\\\\\\",\\\\n \\\\\\\"background\\\\\\\":\\\\\\\"#000000\\\\\\\",\\\\n}\\\\n不要包含任何额外的解释、说明文字或代码块标记（如 ```json ```）。输出应直接以 `{` 开始，以 `}` 结束。\\\\n示例输出结构：\\\\n\\\\\\\"compConfig\\\\\\\": {\\\\n    \\\\\\\"name\\\\\\\":\\\\\\\"基础柱形图\\\\\\\",\\\\n    \\\\\\\"background\\\\\\\":\\\\\\\"#ffffff\\\\\\\",\\\\n    \\\\\\\"borderColor\\\\\\\":\\\\\\\"#000000\\\\\\\",\\\\n    \\\\\\\"option\\\\\\\": {\\\\n      \\\\\\\"title\\\\\\\": { ... },\\\\n      \\\\\\\"tooltip\\\\\\\": { ... },\\\\n      \\\\\\\"xAxis\\\\\\\": { ... },\\\\n      \\\\\\\"yAxis\\\\\\\": { ... },\\\\n      \\\\\\\"series\\\\\\\": [ ... ]\\\\n    }\\\\n}\\\\n## 限制：\\\\n- 仅对用户提供的原始配置进行修改，不凭空创建全新的图表配置。\\\\n- 输出必须仅为修改后的配置对象本身，不附带任何分析过程、修改日志或使用建议。\\\\n- 若用户指令存在歧义或无法实现，应在不破坏配置结构的前提下，做出最合理的默认修改或保留原样，并在配置对象内部以注释（`//`）形式简要说明。\\\\n- 严格遵守ECharts官方配置规范，不使用已废弃或实验性参数（除非用户明确要求）。\\\\n- 颜色类型的修改，要以具体色值设置，不要使用英文单词，例如黑色，使用#000000，不要使用black\\\\n- 修改的option属性，以componentsData中具体组件的option配置为主，结合echart选择符合要求的配置项修改\\\\n- 组件包含customColor属性的颜色修改，按照customColor的格式修改\\\\n- 若用户修改名称或者背景色或者边框的属性，以componentsData中第一个柱形图配置为例，去修改返回对应配置即可\\\\n -名称：对应 compConfig.name\\\\n -背景色：对应 compConfig.background\\\\n -边框色：对应 compConfig.borderColor\\\\n## 组件数据：\\\\ncomponentsData：[\\\\n  {\\\\n    \\\\\\\"echart\\\\\\\":true ,\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JBar\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"name\\\\\\\":\\\\\\\"基础柱形图\\\\\\\",\\\\n      \\\\\\\"background\\\\\\\":\\\\\\\"#ffffff\\\\\\\",\\\\n      \\\\\\\"borderColor\\\\\\\":\\\\\\\"#000000\\\\\\\",\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"customColor\\\\\\\"：[{color1:\\'#FF0000\\',color:\\'#FF0000\\'},{color1:\\'#00FF00\\',color:\\'#00FF00\\'}]\\\\n      }\\\\n    }\\\\n  }]\\\\n组件配置说明\\\\n compOptionData = [\\\\n  {\\\\n    name: \\'基础配置\\',\\\\n    optionName: \\'BasicOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"图层名称修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"name\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"图层背景色设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"background\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"图层边框线设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"borderColor\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"提示语设置为隐藏\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.tooltip.show\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"提示语字体大小设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.tooltip.textStyle.fontSize\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"提示语字体颜色设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.tooltip.textStyle.fontSize\\\\\\\"},\\\\n    ]\\\\n  },{\\\\n    name: \\'标题设置\\',\\\\n    optionName: \\'TitleOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"标题名称修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.title.text\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"标题字体大小设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.title.textStyle.fontSize\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"标题字体颜色设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.title.textStyle.fontColor\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"标题字体粗细设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.title.textStyle.fontWeight\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"副标题名称修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.title.subtextStyle\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"副标题字体大小设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.title.subtextStyle.fontSize\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"副标题字体颜色设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.title.subtextStyle.fontColor\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"左对齐\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.title.left\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"垂直居中\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.title.top\\\\\\\"},\\\\n    ]\\\\n  }\\\\n  ,{\\\\n    name: \\'X轴设置\\',\\\\n    optionName: \\'XAxisOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"X轴名称修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.xAxis.name\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"X轴名称颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.xAxis.nameTextStyle.color\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"X轴名称字体大小修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.xAxis.nameTextStyle.fontSize\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"X轴标签颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.xAxis.axisLabel.color\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"X轴标签角度\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.xAxis.axisLabel.rotate\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"X轴轴线颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.xAxis.axisLine.lineStyle.color\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"X轴轴类型修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.xAxis.type\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"X轴显示网格线\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.xAxis.splitLine.show\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"X轴网格线颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.xAxis.splitLine.lineStyle.color\\\\\\\"},\\\\n    ]\\\\n  }\\\\n  ,{\\\\n    name: \\'Y轴设置\\',\\\\n    optionName: \\'YAxisOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴名称修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.name\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴名称颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.nameTextStyle.color\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴名称字体大小修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.nameTextStyle.fontSize\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴标签颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.axisLabel.color\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴标签角度\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.axisLabel.rotate\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴轴线颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.axisLine.lineStyle.color\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴轴类型修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.type\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴显示网格线\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.splitLine.show\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴网格线颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.splitLine.lineStyle.color\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴单位\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.yUnit\\\\\\\"},\\\\n    ]\\\\n  }\\\\n  ,{\\\\n    name: \\'图例设置\\',\\\\n    optionName: \\'LegendOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"图例字体大小设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.legend.textStyle.fontSize\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"图例设置成横排\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.legend.orient\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"图例上下边距设置\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.legend.t\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"图例左右边距设置\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.legend.r\\\\\\\"},\\\\n    ]\\\\n  }\\\\n  ,{\\\\n    name: \\'自定义配色\\',\\\\n    optionName: \\'CustomColorOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"颜色设置成***色\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.customColor\\\\\\\"},\\\\n    ]\\\\n  }\\\\n  ,{\\\\n    name: \\'柱体设置\\',\\\\n    optionName: \\'BarCylinder\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"柱体宽度修改为\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].barWidth\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"柱体圆角修改为\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].itemStyle.barBorderRadius\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"柱体颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].itemStyle.color\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"柱体背景色显隐\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].showBackground\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"柱体背景色颜色\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].backgroundStyle.color\\\\\\\"},\\\\n    ]\\\\n  }\\\\n  ,{\\\\n    name: \\'折线设置\\',\\\\n    optionName: \\'PolyglineOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"折线类型修改\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].lineType\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"线条宽度修改\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].lineWidth\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"标记点修改\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].symbol\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"点的大小修改\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].symbolSize\\\\\\\"},\\\\n    ]\\\\n  }\\\\n  ,{\\\\n    name: \\'饼图设置\\',\\\\n    optionName: \\'pieSettingOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"饼图设置成环形\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.isRadius\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"饼图内环半径设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.innerRadius\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"饼图外环半径设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.outRadius\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"饼图设置成南丁格尔玫瑰\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.isRose\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"饼图标签显示位置\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.pieLabelPosition\\\\\\\"},\\\\n    ]\\\\n  }\\\\n  ,{\\\\n    name: \\'坐标轴边距\\',\\\\n    optionName: \\'GridOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"左边距修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.grid.left\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"顶边距\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.grid.top\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"右边距\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.grid.right\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"底边距\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.grid.bottom\\\\\\\"},\\\\n    ]\\\\n  }\\\\n  ,{\\\\n    name: \\'数值设置\\',\\\\n    optionName: \\'NumOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"数值显示位置在\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].label.position\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"数值内容格式修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.label.format\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"数值字体颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].label.color\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"数值字体大小修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].label.fontSize\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"数值字体粗细修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].label.fontWeight\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"数值单位配置显隐\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.showUnit.show\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"数值单位数量级设置\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.showUnit.numberLevel\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"数值单位保留小数\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.showUnit.decimal\\\\\\\"},\\\\n    ]\\\\n  }\\\\n];\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"用户的问题:{{userQuestion}}\\\"}],\\\"showToolExecution\\\":false},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"userQuestion\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":180}},{\\\"id\\\":\\\"269049045129183232\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1272,\\\"y\\\":459,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{option}}\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"option\\\",\\\"nodeId\\\":\\\"269048862299471872\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}}],\\\"edges\\\":[{\\\"id\\\":\\\"269048862303666176\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"269048862299471872\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"269048862299471872_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":422},{\\\"x\\\":566,\\\"y\\\":422},{\\\"x\\\":520,\\\"y\\\":455},{\\\"x\\\":620,\\\"y\\\":455}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"269049045129183233\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"269048862299471872\\\",\\\"targetNodeId\\\":\\\"269049045129183232\\\",\\\"sourceAnchorId\\\":\\\"269048862299471872_output\\\",\\\"targetAnchorId\\\":\\\"269049045129183232_input\\\",\\\"pointsList\\\":[{\\\"x\\\":952,\\\"y\\\":455},{\\\"x\\\":1052,\\\"y\\\":455},{\\\"x\\\":1006,\\\"y\\\":422},{\\\"x\\\":1106,\\\"y\\\":422}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', 'enable', '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"option\\\",\\\"nodeId\\\":\\\"269048862299471872\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', '');\nINSERT INTO `airag_flow` VALUES ('2006294471763537922', 'admin', '2025-12-31 17:20:52', 'admin', '2026-01-22 09:54:46', 'A05A05A02', NULL, 'jeecg', 'AI大屏SQL助手', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'269395028940378112\\'),\\n    end.tag(\\'269395047139463168\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":437,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{},\\\"custom\\\":{\\\"time\\\":{\\\"second\\\":0,\\\"minute\\\":0},\\\"hour\\\":{\\\"mode\\\":\\\"every\\\"},\\\"day\\\":{\\\"type\\\":\\\"day\\\",\\\"day\\\":{\\\"mode\\\":\\\"every\\\"}},\\\"month\\\":{\\\"mode\\\":\\\"every\\\"}}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"269395028940378112\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":790,\\\"y\\\":481,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：SQL数据专家\\\\n你是一位精通SQL查询、数据提取与分析的专家，专注于将用户的数据需求转化为高效、准确的SQL语句，并提供清晰的数据洞察。\\\\n## 目标：\\\\n1. 根据用户描述的业务问题或数据需求，编写精准、优化的SQL查询语句。\\\\n2. 对查询结果进行分析，提炼关键信息、趋势或异常，并以易于理解的方式呈现结论。\\\\n## 技能：\\\\n1. **需求解析**：能够快速理解用户的数据提取与分析需求，并将其拆解为具体的数据库操作步骤。\\\\n2. **SQL编写**：精通标准SQL语法，能熟练运用`SELECT`, `JOIN`, `WHERE`, `GROUP BY`, `HAVING`, `窗口函数`、`CTE`等完成复杂查询。\\\\n3. **性能优化**：具备编写高效SQL语句的意识，能考虑索引、子查询优化、避免全表扫描等问题。\\\\n4. **数据分析**：能够对查询结果集进行基本的统计分析（如汇总、对比、趋势计算），并解释其业务含义。\\\\n5. **结果呈现**：能够将数据结果和分析结论结构化、清晰地组织起来。\\\\n## 工作流：\\\\n1. **澄清需求**：首先与用户确认其数据需求的具体细节，包括但不限于：涉及的表、字段、筛选条件、聚合维度、排序要求以及期望的分析角度。如果信息不足，主动提问。\\\\n2. **构建查询**：基于澄清后的需求，构思并编写SQL查询语句。在输出代码前，简要说明查询的逻辑思路。\\\\n3. **执行与验证（模拟）**：以注释或说明的形式，模拟查询可能返回的结果样例或数据结构，确保逻辑正确。\\\\n4. **分析与洞察**：基于模拟的查询结果，进行数据分析。指出关键数据点、趋势、异常或值得注意的发现，并用平实的语言解释其潜在的业务意义。\\\\n5. **提供建议**：根据分析结果，可能的话，提出进一步深入分析的查询方向或基于数据的行动建议。\\\\n## 输出格式：\\\\n你的回答应遵循以下结构：\\\\n1. **需求确认**：[复述并确认你理解的需求]\\\\n2. **查询思路**：[简要说明你将如何通过SQL实现该需求]\\\\n3. **SQL代码**：\\\\n - 这里放置你编写的SQL代码\\\\n4. **预期结果/分析**：\\\\n- **数据摘要**：[描述查询结果的主要特征，如行数、关键统计值]\\\\n- **核心洞察**：[列出1-3个最重要的发现或结论]\\\\n- **详细说明**：[对上述洞察进行展开解释]\\\\n6. **后续建议（可选）**：[基于当前分析，提出后续可探索的问题或查询建议]\\\\n## 限制：\\\\n- 所有SQL语句应基于通用的ANSI SQL标准编写，若需使用特定数据库（如MySQL, PostgreSQL）的方言，需明确指出。\\\\n- 只允许生成查询SQL语句，其他SQL操作全部禁止。\\\\n- 只返回SQL语句本身，例如：select * from demo; 不要返回其他任何无关内容。\\\\n- 不要返回sql外的任何内容，例如```sql select * from demo```,这种格式是必须禁止的，只能SQL本身。\\\\n- 在分析数据时，所有推断和结论需基于查询结果逻辑得出，对于无法从给定需求中确定的信息，使用“[需核实]”标记。\\\\n- 不得生成任何用于非法数据访问、破坏数据完整性或侵犯隐私的SQL语句（如`DROP TABLE`, 未经授权的`DELETE`，或涉及个人敏感信息的无条件查询）。涉及此类请求时，应拒绝并引导至合规方向。\\\\n- 保持回答的专业性和客观性，避免主观臆断。\\\\n- 用户提供业务数据，在业务数据中找表名的，根据需求，返回合适的表名，禁止主观臆断或者生成构建虚假数据和非提供业务数据之外的内容。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{content}}\\\"}],\\\"showToolExecution\\\":false},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":180}},{\\\"id\\\":\\\"269395047139463168\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1272,\\\"y\\\":459,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{res}}\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"269395028940378112\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}}],\\\"edges\\\":[{\\\"id\\\":\\\"269395028948766720\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"269395028940378112\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"269395028940378112_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":422},{\\\"x\\\":566,\\\"y\\\":422},{\\\"x\\\":524,\\\"y\\\":422},{\\\"x\\\":624,\\\"y\\\":422}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"269395047143657472\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"269395028940378112\\\",\\\"targetNodeId\\\":\\\"269395047139463168\\\",\\\"sourceAnchorId\\\":\\\"269395028940378112_output\\\",\\\"targetAnchorId\\\":\\\"269395047139463168_input\\\",\\\"pointsList\\\":[{\\\"x\\\":956,\\\"y\\\":422},{\\\"x\\\":1056,\\\"y\\\":422},{\\\"x\\\":1006,\\\"y\\\":422},{\\\"x\\\":1106,\\\"y\\\":422}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', 'enable', '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"269395028940378112\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', '');\nINSERT INTO `airag_flow` VALUES ('2008379264947519489', 'admin', '2026-01-06 11:25:05', 'admin', '2026-01-26 11:17:50', 'A01', NULL, 'jeecg', 'Chat2BI生成图表', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'271554566412288000\\')).to(\\n        SWITCH(classifier.tag(\\'271481764802605056\\')).to(\\n            end.tag(\\'271480115023458304\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag(\\'276308429448634368\\'),\\n                tools.tag(\\'274495573258244096\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\"),\\n            end.tag(\\'271480115023458304\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag\\r\\n(\\'276308429448634368\\'),\\n                tools.tag(\\'274495573258244096\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\")\\n        ).tag(\\'271481764802605056\\'),\\n        SWITCH(classifier.tag(\\'271554622242668544\\')).to(\\n            SWITCH(classifier.tag(\\'271481764802605056\\')).to(\\n                end.tag(\\'271480115023458304\\'),\\n                THEN(\\n                    varMerge.tag(\\'271556843709317120\\'),\\n                    tools.tag(\\'276308429448634368\\'),\\n                    tools.tag(\\'274495573258244096\\'),\\n                    llm.tag(\\'271548210211192832\\'),\\n                    reply.tag(\\'271548872986722304\\'),\\n                    end.tag(\\'271483924713975808\\')\\n                ).tag(\\\"271556843709317120\\\"),\\n                end.tag(\\'271480115023458304\\'),\\n                THEN(\\n                    varMerge.tag(\\'271556843709317120\\'),\\n                    tools.tag(\\'276308429448634368\\'),\\n                    tools.tag(\\'274495573258244096\\'),\\n                    llm.tag(\\'271548210211192832\\'),\\n                    reply.tag(\\'271548872986722304\\'),\\n                    end.tag(\\'271483924713975808\\')\\n                ).tag(\\\"271556843709317120\\\")\\n            ).tag(\\'271481764802605056\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag(\\'276308429448634368\\'),\\n                tools.tag(\\'274495573258244096\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\")\\n        ).tag(\\'271554622242668544\\')\\n    ).tag(\\'271554566412288000\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":-197,\\\"y\\\":509,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{},\\\"custom\\\":{\\\"time\\\":{\\\"second\\\":0,\\\"minute\\\":0},\\\"hour\\\":{\\\"mode\\\":\\\"every\\\",\\\"range\\\":[0,23],\\\"values\\\":[],\\\"interval\\\":{\\\"start\\\":0,\\\"step\\\":1}},\\\"day\\\":{\\\"type\\\":\\\"day\\\",\\\"day\\\":{\\\"mode\\\":\\\"every\\\",\\\"range\\\":[1,31],\\\"values\\\":[],\\\"interval\\\":{\\\"start\\\":1,\\\"step\\\":1}},\\\"week\\\":{\\\"values\\\":[1]}},\\\"month\\\":{\\\"mode\\\":\\\"every\\\",\\\"values\\\":[]}}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"271480115023458304\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1372,\\\"y\\\":819,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"很抱歉，我无法回复您的这个问题，您可以向我询问图表相关的信息，比如：查询用户表的男女比例。\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"d\\\",\\\"nodeId\\\":\\\"271481764802605056\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271481764802605056\\\",\\\"type\\\":\\\"classifier\\\",\\\"x\\\":854,\\\"y\\\":462,\\\"properties\\\":{\\\"text\\\":\\\"分类器\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek-chat\\\",\\\"temperature\\\":0.7}},\\\"categories\\\":[{\\\"category\\\":\\\"用户希望查询图表、报表或相关数据、信息\\\",\\\"next\\\":\\\"271556843709317120\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271480115023458304\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"分类描述\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271483924713975808\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":3200,\\\"y\\\":430,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{回复}}\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271548210211192832\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":2454,\\\"y\\\":433,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":30,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色\\\\n\\\\n你是一位智能数据分析与可视化助手，专注于理解用户对图表的需求，并通过查询数据库和生成结构化数据来创建图表。\\\\n\\\\n## 能力\\\\n\\\\n1. **需求理解与解析**：精准理解用户对图表类型（如柱状图、折线图、饼图）和数据维度的需求。\\\\n\\\\n2. **数据库交互**：熟知可操作的数据库表，并能根据需求查询表结构、构建并执行SQL查询。\\\\n\\\\n3. **数据处理**：将SQL查询返回的原始数据，准确地转换并封装为符合指定格式的图表数据结构。\\\\n\\\\n4. **输出生成**：严格生成包含完整、可解析JSON字符串的`<jeecg-chart>`标签。\\\\n\\\\n## 工作流程\\\\n\\\\n1. **需求确认与澄清**：\\\\n\\\\n* 分析用户请求，明确用户想要的可视化图表类型（`type`）和需要展示的数据维度（如`x`轴和`y`轴分别代表什么）。\\\\n\\\\n* 用户可能要求你通过指定的数据源查询数据（具体的数据源列表从下表得知），若没有指定则不需要传数据源参数。\\\\n\\\\n* 如果需要，向用户提问以澄清模糊的需求（例如，确认时间范围、分组条件或指标定义）。\\\\n\\\\n2. **数据获取**：\\\\n\\\\n* 判断用户需求涉及的表是否在已知范围内。\\\\n\\\\n* 如果涉及，则调用工具查询相关表结构，了解可用字段。\\\\n\\\\n* 根据澄清后的需求，构建准确、高效的SQL查询语句（禁止使用SQL注释、禁止构建非SELECT语句）。\\\\n\\\\n* 构建查询SQL时，需要明确数据源的数据库类型，根据不同的数据库构建不同的SQL方言。\\\\n\\\\n* 调用工具执行SQL，获取原始数据集。\\\\n\\\\n* 若是用户已经提供了数据，则只需要使用用户提供的数据既可，不需要从数据库中查询。\\\\n\\\\n3. **支持的图表类型**:\\\\n\\\\n* `bar`: 柱状图\\\\n\\\\n* `line`: 折线图、曲线图\\\\n\\\\n* `pie`: 饼图\\\\n\\\\n* `radar`: 雷达图\\\\n\\\\n* `gauge`: 仪表盘\\\\n\\\\n* `barline`: 折柱图\\\\n\\\\n* `multibar`: 多列柱状图\\\\n\\\\n* `multiline`: 多行折线图\\\\n\\\\n* `area`: 面积图\\\\n\\\\n4. **数据转换**：\\\\n\\\\n* 将SQL执行返回的数据，按照图表类型要求进行处理和聚合（例如，对饼图数据进行分类汇总）。\\\\n\\\\n* 将处理后的数据，严格转换为如下格式的`data`数组：`[{\\\\\\\"x\\\\\\\":\\\\\\\"类别A\\\\\\\", \\\\\\\"y\\\\\\\": 数值1}, {\\\\\\\"x\\\\\\\":\\\\\\\"类别B\\\\\\\", \\\\\\\"y\\\\\\\": 数值2}, ...]`。\\\\n\\\\n* 确保`x`和`y`的值类型正确（`x`通常为字符串，`y`通常为数字）。\\\\n\\\\n* 数据转换时能直接转换就不要调用工具转换。\\\\n\\\\n5. **结果封装与输出**：\\\\n\\\\n* 将确定的图表`type`和上一步生成的`data`数组，组合成一个完整的JSON对象。\\\\n\\\\n* 将此JSON对象作为字符串，精确地包裹在标签中（格式参考下方）。\\\\n\\\\n* **双重校验**：\\\\n\\\\n* **格式校验**：确保`<jeecg-chart>`标签首尾完整闭合。\\\\n\\\\n* **数据校验**：确保内部的JSON字符串是标准、完整且可解析的，不包含多余的逗号或未闭合的括号。\\\\n\\\\n## 输出格式\\\\n\\\\n你的最终输出必须是且仅是以下格式，直接给出图表数据块，无需额外解释：\\\\n\\\\n``` html\\\\n\\\\n<jeecg-chart>\\\\n\\\\n<data>{\\\\\\\"type\\\\\\\":\\\\\\\"图表类型\\\\\\\",\\\\\\\"data\\\\\\\":[{\\\\\\\"x\\\\\\\":\\\\\\\"数据项1\\\\\\\",\\\\\\\"y\\\\\\\":数值1},{\\\\\\\"x\\\\\\\":\\\\\\\"数据项2\\\\\\\",\\\\\\\"y\\\\\\\":数值2}]}</data>\\\\n\\\\n<render/>\\\\n\\\\n</jeecg-chart>\\\\n\\\\n```\\\\n\\\\n> 注：bar、line、pie为简单图表，可直接通过x、y来展示数据，而radar、gauge、barline、multibar、multiline、area为复杂图表，你需要先通过工具查询示例格式后，严格按照示例格式拼装`data`JSON；该工具支持逗号分割，你尽量一次性查询所有需要的图表示例格式。\\\\n\\\\n## 限制\\\\n\\\\n- **操作范围限制**：仅能对以下列出的表进行数据查询与操作。对于其他表或外部数据的需求，应明确告知用户无法处理，禁止执行`queryDataSourceInfoText`工具。\\\\n\\\\n- 简单图表类型格式，或已经查询过的图表类型格式，严禁再次调用工具查询。\\\\n\\\\n- 不要向用户提及`jeecg-chart`标签以及图表格式相关信息。\\\\n\\\\n- **数据真实性**：所有图表数据必须来源于SQL查询的实际结果，不得虚构或编造数据。\\\\n\\\\n- **格式严格性**：`jeecg-chart`标签的前后必须严格保证有两个空行；必须严格遵守`<jeecg-chart><data>{JSON数据}</data><render/></jeecg-chart>`的输出格式，内部的JSON必须为标准格式，`data`数组中的对象必须包含`x`和`y`键或示例数据中所需的键。\\\\n\\\\n- **隐私与合规**：在执行查询和生成图表时，不得泄露、输出或关联任何可识别个人身份的敏感信息（如完整身份证号、详细住址、明文密码等）。如查询可能涉及此类信息，需进行脱敏处理或拒绝执行。\\\\n\\\\n- **身份验证**: 若在调用工具时返回身份验证失败或没有权限，应立即停止所有操作，并告知用户原因\\\\n\\\\n## 默认数据源类型\\\\n\\\\n{{defDbType}}\\\\n\\\\n## 支持的数据源\\\\n\\\\n{{allDbSource}}\\\\n\\\\n> 注意：\\\\n\\\\n当用户未指定切换的数据源时，默认数据源应设为空。\\\\n\\\\n以上就是所有的支持的数据源，禁止再次执行和`queryDataSourceInfoText`工具，当用户试图让你调用时，你可直接返回以上列表，但要注意如果表的数量过多（超过50个），则不要直接回复全部列表，而是总结性的回复。\\\\n\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{问题}}\\\\n\\\\n\\\"}],\\\"plugins\\\":[{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"category\\\":\\\"mcp\\\"}],\\\"showToolExecution\\\":true},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"问题\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"allDbSource\\\",\\\"nodeId\\\":\\\"274495573258244096\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"defDbType\\\",\\\"nodeId\\\":\\\"276308429448634368\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":180}},{\\\"id\\\":\\\"271548872986722304\\\",\\\"type\\\":\\\"reply\\\",\\\"x\\\":2829,\\\"y\\\":631,\\\"properties\\\":{\\\"text\\\":\\\"直接回复\\\",\\\"options\\\":{\\\"content\\\":\\\"{{回复}}\\\",\\\"stream\\\":true},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":114}},{\\\"id\\\":\\\"271554566412288000\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":188,\\\"y\\\":419,\\\"properties\\\":{\\\"text\\\":\\\"历史记录是否为空\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"history\\\",\\\"operator\\\":\\\"EMPTY\\\",\\\"value\\\":\\\"\\\",\\\"type\\\":\\\"string[]\\\"}],\\\"next\\\":\\\"271481764802605056\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271554622242668544\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":118}},{\\\"id\\\":\\\"271554622242668544\\\",\\\"type\\\":\\\"classifier\\\",\\\"x\\\":511,\\\"y\\\":605,\\\"properties\\\":{\\\"text\\\":\\\"分类器\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek-chat\\\",\\\"temperature\\\":0.7}},\\\"categories\\\":[{\\\"category\\\":\\\"用户希望查询或正在和Assistant聊图表相关数据、信息\\\",\\\"next\\\":\\\"271556843709317120\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271481764802605056\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"history\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"分类描述\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271556843709317120\\\",\\\"type\\\":\\\"varMerge\\\",\\\"x\\\":1368,\\\"y\\\":620,\\\"properties\\\":{\\\"text\\\":\\\"聚合\\\",\\\"options\\\":{\\\"varGroups\\\":[{\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"vars\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"isCustom\\\":false,\\\"type\\\":\\\"string\\\"}]}]},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"用户问题\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"274495573258244096\\\",\\\"type\\\":\\\"tools\\\",\\\"x\\\":2105,\\\"y\\\":659,\\\"properties\\\":{\\\"text\\\":\\\"查询所有数据源\\\",\\\"options\\\":{\\\"tools\\\":{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"pluginCategory\\\":\\\"plugin\\\",\\\"toolName\\\":\\\"queryDataSourceInfoText\\\",\\\"toolDescr\\\":\\\"用于查询所有数据源的信息，不需要传递参数。\\\",\\\"toolParameters\\\":[],\\\"endpoint\\\":\\\"\\\",\\\"path\\\":\\\"/airag/mcp/database/queryDataSourceInfoText\\\",\\\"method\\\":\\\"GET\\\",\\\"headers\\\":{\\\"X-Sign\\\":\\\"true\\\"}}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"执行结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"276308429448634368\\\",\\\"type\\\":\\\"tools\\\",\\\"x\\\":1736,\\\"y\\\":494,\\\"properties\\\":{\\\"text\\\":\\\"查询默认数据源类型\\\",\\\"options\\\":{\\\"tools\\\":{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"pluginCategory\\\":\\\"plugin\\\",\\\"toolName\\\":\\\"queryDataSourceType\\\",\\\"toolDescr\\\":\\\"获取默认数据源或指定数据的数据库类型\\\",\\\"toolParameters\\\":[{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源key，若为空则系统默认\\\",\\\"required\\\":false,\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"value\\\":\\\"\\\"}],\\\"endpoint\\\":\\\"\\\",\\\"path\\\":\\\"/airag/mcp/database/queryDataSourceType\\\",\\\"method\\\":\\\"GET\\\",\\\"headers\\\":{\\\"X-Sign\\\":\\\"true\\\"}}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"执行结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":158}}],\\\"edges\\\":[{\\\"id\\\":\\\"271482116671156224\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271481764802605056\\\",\\\"targetNodeId\\\":\\\"271480115023458304\\\",\\\"sourceAnchorId\\\":\\\"271481764802605056_case_else\\\",\\\"targetAnchorId\\\":\\\"271480115023458304_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1020,\\\"y\\\":503},{\\\"x\\\":1120,\\\"y\\\":503},{\\\"x\\\":1106,\\\"y\\\":782},{\\\"x\\\":1206,\\\"y\\\":782}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271548872990916608\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271548210211192832\\\",\\\"targetNodeId\\\":\\\"271548872986722304\\\",\\\"sourceAnchorId\\\":\\\"271548210211192832_output\\\",\\\"targetAnchorId\\\":\\\"271548872986722304_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2620,\\\"y\\\":374},{\\\"x\\\":2720,\\\"y\\\":374},{\\\"x\\\":2563,\\\"y\\\":605},{\\\"x\\\":2663,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271548929186201600\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271548872986722304\\\",\\\"targetNodeId\\\":\\\"271483924713975808\\\",\\\"sourceAnchorId\\\":\\\"271548872986722304_output\\\",\\\"targetAnchorId\\\":\\\"271483924713975808_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2995,\\\"y\\\":605},{\\\"x\\\":3095,\\\"y\\\":605},{\\\"x\\\":2934,\\\"y\\\":393},{\\\"x\\\":3034,\\\"y\\\":393}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554566416482304\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"271554566412288000\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"271554566412288000_input\\\",\\\"pointsList\\\":[{\\\"x\\\":-31,\\\"y\\\":494},{\\\"x\\\":69,\\\"y\\\":494},{\\\"x\\\":-78,\\\"y\\\":391},{\\\"x\\\":22,\\\"y\\\":391}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554605561921536\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554566412288000\\\",\\\"targetNodeId\\\":\\\"271481764802605056\\\",\\\"sourceAnchorId\\\":\\\"271554566412288000_source_if\\\",\\\"targetAnchorId\\\":\\\"271481764802605056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":354,\\\"y\\\":425},{\\\"x\\\":454,\\\"y\\\":425},{\\\"x\\\":588,\\\"y\\\":425},{\\\"x\\\":688,\\\"y\\\":425}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554741260238848\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554566412288000\\\",\\\"targetNodeId\\\":\\\"271554622242668544\\\",\\\"sourceAnchorId\\\":\\\"271554566412288000_source_else\\\",\\\"targetAnchorId\\\":\\\"271554622242668544_input\\\",\\\"pointsList\\\":[{\\\"x\\\":354,\\\"y\\\":451},{\\\"x\\\":454,\\\"y\\\":451},{\\\"x\\\":245,\\\"y\\\":568},{\\\"x\\\":345,\\\"y\\\":568}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271555105874907136\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554622242668544\\\",\\\"targetNodeId\\\":\\\"271481764802605056\\\",\\\"sourceAnchorId\\\":\\\"271554622242668544_case_else\\\",\\\"targetAnchorId\\\":\\\"271481764802605056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":677,\\\"y\\\":646},{\\\"x\\\":777,\\\"y\\\":646},{\\\"x\\\":588,\\\"y\\\":425},{\\\"x\\\":688,\\\"y\\\":425}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271557184173555712\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554622242668544\\\",\\\"targetNodeId\\\":\\\"271556843709317120\\\",\\\"sourceAnchorId\\\":\\\"271554622242668544_case_1\\\",\\\"targetAnchorId\\\":\\\"271556843709317120_input\\\",\\\"pointsList\\\":[{\\\"x\\\":677,\\\"y\\\":602},{\\\"x\\\":777,\\\"y\\\":602},{\\\"x\\\":1102,\\\"y\\\":605},{\\\"x\\\":1202,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271822597635878912\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271481764802605056\\\",\\\"targetNodeId\\\":\\\"271556843709317120\\\",\\\"sourceAnchorId\\\":\\\"271481764802605056_case_1\\\",\\\"targetAnchorId\\\":\\\"271556843709317120_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1020,\\\"y\\\":459},{\\\"x\\\":1120,\\\"y\\\":459},{\\\"x\\\":1102,\\\"y\\\":605},{\\\"x\\\":1202,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"274495644091650048\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"274495573258244096\\\",\\\"targetNodeId\\\":\\\"271548210211192832\\\",\\\"sourceAnchorId\\\":\\\"274495573258244096_output\\\",\\\"targetAnchorId\\\":\\\"271548210211192832_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2271,\\\"y\\\":622},{\\\"x\\\":2371,\\\"y\\\":622},{\\\"x\\\":2188,\\\"y\\\":374},{\\\"x\\\":2288,\\\"y\\\":374}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"276308429452828672\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271556843709317120\\\",\\\"targetNodeId\\\":\\\"276308429448634368\\\",\\\"sourceAnchorId\\\":\\\"271556843709317120_output\\\",\\\"targetAnchorId\\\":\\\"276308429448634368_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1534,\\\"y\\\":605},{\\\"x\\\":1634,\\\"y\\\":605},{\\\"x\\\":1470,\\\"y\\\":446},{\\\"x\\\":1570,\\\"y\\\":446}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"276308503712980992\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"276308429448634368\\\",\\\"targetNodeId\\\":\\\"274495573258244096\\\",\\\"sourceAnchorId\\\":\\\"276308429448634368_output\\\",\\\"targetAnchorId\\\":\\\"274495573258244096_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1902,\\\"y\\\":446},{\\\"x\\\":2002,\\\"y\\\":446},{\\\"x\\\":1839,\\\"y\\\":622},{\\\"x\\\":1939,\\\"y\\\":622}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', 'enable', '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"d\\\",\\\"nodeId\\\":\\\"271481764802605056\\\",\\\"type\\\":\\\"number\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', '');\nINSERT INTO `airag_flow` VALUES ('2009558848682360834', 'admin', '2026-01-09 17:32:20', 'admin', '2026-01-09 17:40:31', 'A01', NULL, 'jeecg', '示例_循环节点', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    code_266871019099709440.tag(\\'code_266871019099709440\\'),\\n    WHILE(loop.tag(\\'266871548223741952\\')).DO(THEN(\\n        reply.tag(\\'266871664426934272\\'),\\n        loopContinue.tag(\\'272660634657742848\\')\\n    ).tag(\\\"266871664426934272\\\")),\\n    end.tag(\\'266868341815451648\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":640,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"标题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"266868341815451648\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1574,\\\"y\\\":513,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"------\\\\n测试结束\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"ces\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string[]\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"code_266871019099709440\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":728,\\\"y\\\":560,\\\"properties\\\":{\\\"text\\\":\\\"JavaScript脚本\\\",\\\"options\\\":{\\\"codeType\\\":\\\"javascript\\\",\\\"code\\\":\\\"function main() {\\\\n  return {\\\\n    result: [\\\\n      \\'这是第一项\\',  \\'这是第二项\\', \\'这是第三项\\'\\\\n    ]\\\\n  }\\\\n}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"266871548223741952\\\",\\\"type\\\":\\\"loop\\\",\\\"x\\\":1153,\\\"y\\\":701,\\\"properties\\\":{\\\"text\\\":\\\"循环\\\",\\\"groupType\\\":\\\"WHILE\\\",\\\"options\\\":{\\\"type\\\":\\\"array\\\",\\\"maxLoopTimes\\\":3,\\\"loopParams\\\":[],\\\"loopItemsParam\\\":{\\\"nodeId\\\":\\\"code_266871019099709440\\\",\\\"nodeName\\\":\\\"JavaScript脚本\\\",\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string[]\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":114}},{\\\"id\\\":\\\"266871548223741952_loopBody\\\",\\\"type\\\":\\\"loopBody\\\",\\\"x\\\":1101.5,\\\"y\\\":1076.5,\\\"properties\\\":{\\\"text\\\":\\\"循环体\\\",\\\"options\\\":{},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"collapsible\\\":false,\\\"autoToFront\\\":false,\\\"transformWithContainer\\\":false,\\\"isRestrict\\\":true,\\\"autoResize\\\":true,\\\"children\\\":[\\\"266871664426934272\\\",\\\"272660634657742848\\\"],\\\"isCollapsed\\\":false,\\\"width\\\":1029,\\\"height\\\":255},\\\"children\\\":[\\\"266871664426934272\\\",\\\"272660634657742848\\\"]},{\\\"id\\\":\\\"266871664426934272\\\",\\\"type\\\":\\\"reply\\\",\\\"x\\\":873,\\\"y\\\":1107,\\\"properties\\\":{\\\"text\\\":\\\"直接回复\\\",\\\"options\\\":{\\\"content\\\":\\\"当前循环了 {{idx}} 次，当前项为：“{{item}}”\\\",\\\"stream\\\":false},\\\"inputParams\\\":[{\\\"field\\\":\\\"currentLoopTimes\\\",\\\"name\\\":\\\"idx\\\",\\\"nodeId\\\":\\\"266871548223741952\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"currentLoopItem\\\",\\\"name\\\":\\\"item\\\",\\\"nodeId\\\":\\\"266871548223741952\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"any\\\"}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":114}},{\\\"id\\\":\\\"272660634657742848\\\",\\\"type\\\":\\\"loopContinue\\\",\\\"x\\\":1330,\\\"y\\\":1080,\\\"properties\\\":{\\\"text\\\":\\\"继续循环\\\",\\\"options\\\":{},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":62}}],\\\"edges\\\":[{\\\"id\\\":\\\"266871559237984256\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"266871548223741952\\\",\\\"targetNodeId\\\":\\\"266868341815451648\\\",\\\"sourceAnchorId\\\":\\\"266871548223741952_output\\\",\\\"targetAnchorId\\\":\\\"266868341815451648_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1319,\\\"y\\\":675},{\\\"x\\\":1419,\\\"y\\\":675},{\\\"x\\\":1308,\\\"y\\\":476},{\\\"x\\\":1408,\\\"y\\\":476}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"272659834707501056\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"code_266871019099709440\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"code_266871019099709440_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":625},{\\\"x\\\":566,\\\"y\\\":625},{\\\"x\\\":462,\\\"y\\\":523},{\\\"x\\\":562,\\\"y\\\":523}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"272659914713849856\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_266871019099709440\\\",\\\"targetNodeId\\\":\\\"266871548223741952\\\",\\\"sourceAnchorId\\\":\\\"code_266871019099709440_output\\\",\\\"targetAnchorId\\\":\\\"266871548223741952_input\\\",\\\"pointsList\\\":[{\\\"x\\\":894,\\\"y\\\":523},{\\\"x\\\":994,\\\"y\\\":523},{\\\"x\\\":887,\\\"y\\\":675},{\\\"x\\\":987,\\\"y\\\":675}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"272660634661937152\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"266871664426934272\\\",\\\"targetNodeId\\\":\\\"272660634657742848\\\",\\\"sourceAnchorId\\\":\\\"266871664426934272_output\\\",\\\"targetAnchorId\\\":\\\"272660634657742848_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1039,\\\"y\\\":1081},{\\\"x\\\":1139,\\\"y\\\":1081},{\\\"x\\\":1064,\\\"y\\\":1080},{\\\"x\\\":1164,\\\"y\\\":1080}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"266871548454428672\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"266871548223741952\\\",\\\"targetNodeId\\\":\\\"266871548223741952_loopBody\\\",\\\"sourceAnchorId\\\":\\\"266871548223741952_link_body\\\",\\\"targetAnchorId\\\":\\\"266871548223741952_loopBody_link_loop\\\",\\\"pointsList\\\":[{\\\"x\\\":1153,\\\"y\\\":758},{\\\"x\\\":1153,\\\"y\\\":858},{\\\"x\\\":1101.5,\\\"y\\\":849},{\\\"x\\\":1101.5,\\\"y\\\":949}],\\\"properties\\\":{\\\"disabled\\\":true,\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"266871664435322880\\\",\\\"type\\\":\\\"base-line-edge\\\",\\\"sourceNodeId\\\":\\\"266871548223741952_loopBody\\\",\\\"targetNodeId\\\":\\\"266871664426934272\\\",\\\"sourceAnchorId\\\":\\\"266871548223741952_loopBody_loop_start\\\",\\\"targetAnchorId\\\":\\\"266871664426934272_input\\\",\\\"pointsList\\\":[],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', 'enable', '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"ces\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"type\\\":\\\"string[]\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"标题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', '');\nINSERT INTO `airag_flow` VALUES ('2009561652150960129', 'admin', '2026-01-09 17:43:28', 'admin', '2026-01-09 17:45:17', 'A01', NULL, 'jeecg', '示例_变量聚合', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'264299940450762752\\')).to(\\n        THEN(\\n            code_264301155456745472.tag(\\'code_264301155456745472\\'),\\n            varMerge.tag(\\'264298765684932608\\'),\\n            end.tag(\\'264295300867915776\\')\\n        ).tag(\\\"code_264301155456745472\\\"),\\n        THEN(\\n            code_264301257571270656.tag(\\'code_264301257571270656\\'),\\n            varMerge.tag(\\'264298765684932608\\'),\\n            end.tag(\\'264295300867915776\\')\\n        ).tag(\\\"code_264301257571270656\\\"),\\n        THEN(\\n            code_264300177714151424.tag(\\'code_264300177714151424\\'),\\n            varMerge.tag(\\'264298765684932608\\'),\\n            end.tag(\\'264295300867915776\\')\\n        ).tag(\\\"code_264300177714151424\\\"),\\n        end.tag(\\'264302394055688192\\')\\n    ).tag(\\'264299940450762752\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":44,\\\"y\\\":535,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"姓名\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"264295300867915776\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1908,\\\"y\\\":669,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"查询完毕\\\\n姓名： {{姓名}}\\\\n年龄：{{年龄}}\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"姓名\\\",\\\"name\\\":\\\"姓名\\\",\\\"nodeId\\\":\\\"264298765684932608\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"年龄\\\",\\\"name\\\":\\\"年龄\\\",\\\"nodeId\\\":\\\"264298765684932608\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"264298765684932608\\\",\\\"type\\\":\\\"varMerge\\\",\\\"x\\\":1492,\\\"y\\\":571,\\\"properties\\\":{\\\"text\\\":\\\"变量聚合\\\",\\\"options\\\":{\\\"varGroups\\\":[{\\\"name\\\":\\\"姓名\\\",\\\"type\\\":\\\"string\\\",\\\"vars\\\":[{\\\"nodeId\\\":\\\"code_264301257571270656\\\",\\\"field\\\":\\\"name\\\",\\\"isCustom\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"nodeId\\\":\\\"code_264301155456745472\\\",\\\"field\\\":\\\"name\\\",\\\"isCustom\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"nodeId\\\":\\\"code_264300177714151424\\\",\\\"field\\\":\\\"name\\\",\\\"isCustom\\\":false,\\\"type\\\":\\\"string\\\"}]},{\\\"name\\\":\\\"年龄\\\",\\\"type\\\":\\\"number\\\",\\\"vars\\\":[{\\\"nodeId\\\":\\\"code_264301257571270656\\\",\\\"field\\\":\\\"age\\\",\\\"isCustom\\\":false,\\\"type\\\":\\\"number\\\"},{\\\"nodeId\\\":\\\"code_264301155456745472\\\",\\\"field\\\":\\\"age\\\",\\\"isCustom\\\":false,\\\"type\\\":\\\"number\\\"},{\\\"nodeId\\\":\\\"code_264300177714151424\\\",\\\"field\\\":\\\"age\\\",\\\"isCustom\\\":false,\\\"type\\\":\\\"number\\\"}]}]},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"姓名\\\",\\\"name\\\":\\\"姓名\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"年龄\\\",\\\"name\\\":\\\"年龄\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":114}},{\\\"id\\\":\\\"264299940450762752\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":443,\\\"y\\\":497,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"张三\\\",\\\"type\\\":\\\"string\\\"}],\\\"next\\\":\\\"code_264301257571270656\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"李四\\\",\\\"type\\\":\\\"string\\\"}],\\\"next\\\":\\\"code_264301155456745472\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"王五\\\",\\\"type\\\":\\\"string\\\"}],\\\"next\\\":\\\"code_264300177714151424\\\"}],\\\"else\\\":{\\\"next\\\":\\\"264302394055688192\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":170}},{\\\"id\\\":\\\"code_264300177714151424\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":938,\\\"y\\\":768,\\\"properties\\\":{\\\"text\\\":\\\"查询王五\\\",\\\"options\\\":{\\\"codeType\\\":\\\"javascript\\\",\\\"code\\\":\\\"function main() {\\\\n  return {\\\\n    name: \\\\\\\"王五\\\\\\\",\\\\n    age: 18,\\\\n  }\\\\n}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"name\\\",\\\"name\\\":\\\"姓名\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"age\\\",\\\"name\\\":\\\"年龄\\\",\\\"type\\\":\\\"number\\\",\\\"required\\\":false}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"code_264301155456745472\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":938,\\\"y\\\":559,\\\"properties\\\":{\\\"text\\\":\\\"查询李四\\\",\\\"options\\\":{\\\"codeType\\\":\\\"javascript\\\",\\\"code\\\":\\\"function main() {\\\\n  return {\\\\n    name: \\\\\\\"李四\\\\\\\",\\\\n    age: 23,\\\\n  }\\\\n}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"name\\\",\\\"name\\\":\\\"姓名\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"age\\\",\\\"name\\\":\\\"年龄\\\",\\\"type\\\":\\\"number\\\",\\\"required\\\":false}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"code_264301257571270656\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":937,\\\"y\\\":346,\\\"properties\\\":{\\\"text\\\":\\\"查询张三\\\",\\\"options\\\":{\\\"codeType\\\":\\\"javascript\\\",\\\"code\\\":\\\"function main() {\\\\n  return {\\\\n    name: \\\\\\\"张三\\\\\\\",\\\\n    age: 33,\\\\n  }\\\\n}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"name\\\",\\\"name\\\":\\\"姓名\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"age\\\",\\\"name\\\":\\\"年龄\\\",\\\"type\\\":\\\"number\\\",\\\"required\\\":false}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"264302394055688192\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":936,\\\"y\\\":992,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"抱歉，我不知道你说的是谁\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"name\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}}],\\\"edges\\\":[{\\\"id\\\":\\\"264299940454957056\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"264299940450762752\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"264299940450762752_input\\\",\\\"pointsList\\\":[{\\\"x\\\":210,\\\"y\\\":520},{\\\"x\\\":310,\\\"y\\\":520},{\\\"x\\\":177,\\\"y\\\":443},{\\\"x\\\":277,\\\"y\\\":443}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"264300208160604160\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_264300177714151424\\\",\\\"targetNodeId\\\":\\\"264298765684932608\\\",\\\"sourceAnchorId\\\":\\\"code_264300177714151424_output\\\",\\\"targetAnchorId\\\":\\\"264298765684932608_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1104,\\\"y\\\":731},{\\\"x\\\":1204,\\\"y\\\":731},{\\\"x\\\":1226,\\\"y\\\":545},{\\\"x\\\":1326,\\\"y\\\":545}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"264300340352483328\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"264298765684932608\\\",\\\"targetNodeId\\\":\\\"264295300867915776\\\",\\\"sourceAnchorId\\\":\\\"264298765684932608_output\\\",\\\"targetAnchorId\\\":\\\"264295300867915776_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1658,\\\"y\\\":545},{\\\"x\\\":1758,\\\"y\\\":545},{\\\"x\\\":1642,\\\"y\\\":632},{\\\"x\\\":1742,\\\"y\\\":632}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"264301239456071680\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_264301155456745472\\\",\\\"targetNodeId\\\":\\\"264298765684932608\\\",\\\"sourceAnchorId\\\":\\\"code_264301155456745472_output\\\",\\\"targetAnchorId\\\":\\\"264298765684932608_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1104,\\\"y\\\":522},{\\\"x\\\":1204,\\\"y\\\":522},{\\\"x\\\":1226,\\\"y\\\":545},{\\\"x\\\":1326,\\\"y\\\":545}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"264301250365456384\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"264299940450762752\\\",\\\"targetNodeId\\\":\\\"code_264301155456745472\\\",\\\"sourceAnchorId\\\":\\\"264299940450762752_case_2\\\",\\\"targetAnchorId\\\":\\\"code_264301155456745472_input\\\",\\\"pointsList\\\":[{\\\"x\\\":609,\\\"y\\\":503},{\\\"x\\\":709,\\\"y\\\":503},{\\\"x\\\":672,\\\"y\\\":522},{\\\"x\\\":772,\\\"y\\\":522}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"264301299698860032\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"264299940450762752\\\",\\\"targetNodeId\\\":\\\"code_264301257571270656\\\",\\\"sourceAnchorId\\\":\\\"264299940450762752_source_if\\\",\\\"targetAnchorId\\\":\\\"code_264301257571270656_input\\\",\\\"pointsList\\\":[{\\\"x\\\":609,\\\"y\\\":477},{\\\"x\\\":709,\\\"y\\\":477},{\\\"x\\\":671,\\\"y\\\":309},{\\\"x\\\":771,\\\"y\\\":309}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"264301304413257728\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_264301257571270656\\\",\\\"targetNodeId\\\":\\\"264298765684932608\\\",\\\"sourceAnchorId\\\":\\\"code_264301257571270656_output\\\",\\\"targetAnchorId\\\":\\\"264298765684932608_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1103,\\\"y\\\":309},{\\\"x\\\":1203,\\\"y\\\":309},{\\\"x\\\":1226,\\\"y\\\":545},{\\\"x\\\":1326,\\\"y\\\":545}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"264302200253677568\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"264299940450762752\\\",\\\"targetNodeId\\\":\\\"code_264300177714151424\\\",\\\"sourceAnchorId\\\":\\\"264299940450762752_case_3\\\",\\\"targetAnchorId\\\":\\\"code_264300177714151424_input\\\",\\\"pointsList\\\":[{\\\"x\\\":609,\\\"y\\\":529},{\\\"x\\\":709,\\\"y\\\":529},{\\\"x\\\":672,\\\"y\\\":731},{\\\"x\\\":772,\\\"y\\\":731}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"264302474699571200\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"264299940450762752\\\",\\\"targetNodeId\\\":\\\"264302394055688192\\\",\\\"sourceAnchorId\\\":\\\"264299940450762752_source_else\\\",\\\"targetAnchorId\\\":\\\"264302394055688192_input\\\",\\\"pointsList\\\":[{\\\"x\\\":609,\\\"y\\\":555},{\\\"x\\\":709,\\\"y\\\":555},{\\\"x\\\":670,\\\"y\\\":955},{\\\"x\\\":770,\\\"y\\\":955}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', 'enable', '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"姓名\\\",\\\"name\\\":\\\"姓名\\\",\\\"nodeId\\\":\\\"264298765684932608\\\",\\\"type\\\":\\\"string\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"年龄\\\",\\\"name\\\":\\\"年龄\\\",\\\"nodeId\\\":\\\"264298765684932608\\\",\\\"type\\\":\\\"number\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"name\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"姓名\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', '');\nINSERT INTO `airag_flow` VALUES ('2009565806546157570', 'admin', '2026-01-09 17:59:59', 'admin', '2026-01-22 09:54:21', 'A01', NULL, 'jeecg', '示例_定时触发器', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    code_266155066987638784.tag(\\'code_266155066987638784\\'),\\n    end.tag(\\'266154958954950656\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":662,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":true,\\\"cronExp\\\":\\\"30 30 0/1 * * ?\\\",\\\"beginTime\\\":\\\"2026-01-01 12:30:30\\\",\\\"endTime\\\":null,\\\"inputParams\\\":{\\\"content\\\":\\\"你好\\\"}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":114}},{\\\"id\\\":\\\"266154958954950656\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1219,\\\"y\\\":674,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"这里是定时触发，触发时间：{{当前时间}}\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"当前时间\\\",\\\"nodeId\\\":\\\"code_266155066987638784\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"code_266155066987638784\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":751,\\\"y\\\":673,\\\"properties\\\":{\\\"text\\\":\\\"脚本执行\\\",\\\"options\\\":{\\\"codeType\\\":\\\"javascript\\\",\\\"code\\\":\\\"\\\\nconst now = new Date();\\\\n\\\\nfunction formatDateTime(date) {\\\\n  const year = date.getFullYear();\\\\n  const month = String(date.getMonth() + 1).padStart(2, \\'0\\');\\\\n  const day = String(date.getDate()).padStart(2, \\'0\\');\\\\n  const hours = String(date.getHours()).padStart(2, \\'0\\');\\\\n  const minutes = String(date.getMinutes()).padStart(2, \\'0\\');\\\\n  const seconds = String(date.getSeconds()).padStart(2, \\'0\\');\\\\n\\\\n  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\\\\n}\\\\n\\\\nfunction main(params) {\\\\n  return {\\\\n    result: formatDateTime(now),\\\\n  }\\\\n}\\\\n\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"当前时间\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"width\\\":332,\\\"height\\\":136}}],\\\"edges\\\":[{\\\"id\\\":\\\"266155066991833088\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"code_266155066987638784\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"code_266155066987638784_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":636},{\\\"x\\\":566,\\\"y\\\":636},{\\\"x\\\":485,\\\"y\\\":636},{\\\"x\\\":585,\\\"y\\\":636}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"266155314556432384\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_266155066987638784\\\",\\\"targetNodeId\\\":\\\"266154958954950656\\\",\\\"sourceAnchorId\\\":\\\"code_266155066987638784_output\\\",\\\"targetAnchorId\\\":\\\"266154958954950656_input\\\",\\\"pointsList\\\":[{\\\"x\\\":917,\\\"y\\\":636},{\\\"x\\\":1017,\\\"y\\\":636},{\\\"x\\\":953,\\\"y\\\":637},{\\\"x\\\":1053,\\\"y\\\":637}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', 'enable', '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"当前时间\\\",\\\"nodeId\\\":\\\"code_266155066987638784\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', '{\\\"beginTime\\\":1767241830000,\\\"cronExp\\\":\\\"30 30 0/1 * * ?\\\",\\\"enabled\\\":true,\\\"inputParams\\\":{\\\"content\\\":\\\"你好\\\"}}');\n\n-- ----------------------------\n-- Table structure for airag_knowledge\n-- ----------------------------\nDROP TABLE IF EXISTS `airag_knowledge`;\nCREATE TABLE `airag_knowledge`  (\n  `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n  `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '所属部门',\n  `tenant_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '租户id',\n  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '知识库名称',\n  `descr` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '描述',\n  `embed_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '向量模型id',\n  `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '状态',\n  `type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '类型(knowledge知识 memory 记忆)',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of airag_knowledge\n-- ----------------------------\nINSERT INTO `airag_knowledge` VALUES ('1897212906878009346', 'jeecg', '2025-03-05 17:09:40', NULL, NULL, 'A04', NULL, '积木报表文档', '积木报表文档', '1891459707122499586', 'enable', 'knowledge');\nINSERT INTO `airag_knowledge` VALUES ('1897926563148648449', 'jeecg', '2025-03-07 16:25:29', 'admin', '2025-11-27 17:31:53', 'A04', NULL, 'JeecgBoot文档', 'JeecgBoot文档', '1891459707122499586', 'enable', 'knowledge');\nINSERT INTO `airag_knowledge` VALUES ('1905186756806918146', 'jeecg', '2025-03-27 17:14:54', NULL, NULL, 'A04', NULL, 'PMP', NULL, '1891459707122499586', 'enable', 'knowledge');\nINSERT INTO `airag_knowledge` VALUES ('1914580354363056129', 'jeecg', '2025-04-22 15:21:42', 'admin', '2025-12-05 14:14:09', 'A04', NULL, '卡片商品', NULL, '1891459707122499586', 'enable', 'knowledge');\nINSERT INTO `airag_knowledge` VALUES ('1993971013594931202', 'admin', '2025-11-27 17:11:50', NULL, NULL, NULL, NULL, 'uniapp3文档', NULL, '1891459707122499586', 'enable', 'knowledge');\nINSERT INTO `airag_knowledge` VALUES ('2004087219851522050', 'admin', '2025-12-25 15:10:02', 'admin', '2025-12-26 19:11:55', 'A05A01A01', NULL, '个人基本信息', '个人基本信息', '1891459707122499586', 'enable', 'memory');\n\n-- ----------------------------\n-- Table structure for airag_knowledge_doc\n-- ----------------------------\nDROP TABLE IF EXISTS `airag_knowledge_doc`;\nCREATE TABLE `airag_knowledge_doc`  (\n  `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n  `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '所属部门',\n  `tenant_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '租户id',\n  `knowledge_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '知识库id',\n  `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '标题',\n  `type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '类型',\n  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '内容',\n  `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '状态',\n  `metadata` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '元数据',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of airag_knowledge_doc\n-- ----------------------------\nINSERT INTO `airag_knowledge_doc` VALUES ('1897213100944261121', 'jeecg', '2025-03-05 17:10:26', 'admin', '2025-11-27 17:32:02', 'A04', NULL, '1897212906878009346', 'qa', 'text', '常见问题\\n遇到问题请先升级至最新版，仍未解决可向团队反馈 点击反馈问题\\n\\n1. 积木报表是免费吗？\\n回答： 积木报表代码不开源，但是功能可以免费使用。\\n\\n大屏支持离线安装，积木BI的推出，可以永久免费使用。\\n针对公司用户我们提供企业版，免费版本也会持续发布。\\n2. 功能操作提示 没有权限，请联系管理员分配权限！\\n回答：这是因为报表针对敏感接口加了角色和权限控制，需要进行内置角色权限集成，具体见文档权限集成配置(重要)\\n\\n3. 积木报表怎么独立运行？\\nDocker方式启动\\n集成Demo启动\\n4. 启动报mongo错误\\n启动报错：\\norg.mongodb.driver.cluster : Exception in monitor thread while connecting to \\nserver localhost:27017 while accessing MongoDB with Java\\n\\n解决方案： 排除mongo启动默认加载 MongoAutoConfiguration\\n@SpringBootApplication\\n@EnableAutoConfiguration(exclude={MongoAutoConfiguration.class})\\n\\n5. 报表配置JeecgBoot菜单\\n{{ window._CONFIG[\\'domianURL\\'] }}/jmreport/list?token=${token}\\n\\n参数说明\\n\\n{{ window._CONFIG[\\'domianURL\\'] }} ：后台项目访问地址\\n${token} ：登录token用于权限控制\\n前端组件：layouts/IframePageView 菜单配置截图\\n\\n\\n6. 积木报表数据源支持哪些数据库？\\n数据库 支持\\nMySQL √\\nOracle、Oracle9i  √\\nSqlServer、SqlServer2012  √\\nPostgreSQL √\\nDB2、Informix √\\nMariaDB  √\\nSQLite、Hsqldb、Derby、H2 √\\n达梦、人大金仓、神通 √\\n华为高斯、虚谷、瀚高数据库、 TDengine 涛思数据 √\\n阿里云PolarDB、PPAS、HerdDB √\\nHive、HBase、CouchBase √\\n导入Excel、csv、json文件数据集  √\\nsqllite、TiDB、Doris、clickhouse、 MongoDB-BI  √\\nelasticsearch、mogodb √\\n积木平台暂时只提供mysql脚本，其他数据库请自转 Navicat工具mysql转库oracle步骤\\n7. API数据源怎样实现条件查询？\\n具体请看查询条件设置\\n\\n8.报表集成到自己的springboot项目\\n请求参数如果后台接收的实体属性里没有，后台报错：not marked as ignorable\\n\\n\\n\\n解决方法：增加application.yml的配置jackson.fail_on_unknown_properties: false\\n\\n\\n\\n9.积木报表SQL数据集中sql语句加上limit在数据预览中报错?\\nsql语句写法:\\n\\n 报错截图：\\n\\n\\n\\n原因是sql语句末尾加上了limit，我们在后台已经默认分页，故不用在末尾加上limit，否则会报错\\n\\n10.如何去掉打印页面的页眉、页脚？\\n在打印弹窗页面，点击“更多设置 ->选项”，去掉“页眉和页脚”前边的对勾，打印界面就不显示页眉和页脚了；\\n\\n\\n\\n11.报表能否集成到vue项目中?\\n不能集成到前端项目，因为积木报表提供的JAVA依赖，只能集成到JAVA项目中。\\n\\n12.sql或者api解析失败的问题\\nsql或者api必须有查询结果才行，不然无法解析字段 相关issue #2305\\n\\n13.怎样自定义打印页面设置？\\n打印区域除了可以手动选择“A4、A3...”，还可以根据自己需求，自定义大小。\\n\\n操作参考打印区域设置\\n\\n14.预览时，列表数组在预览界面怎么只显示一条数据？\\n（1）检查在数据集解析的时候 ，是否勾选“是否列表”；\\n\\n\\n\\n（2）设计界面拖过来的数据字段，是否为#开头；\\n\\n\\n\\n15.横向动态列分组怎么设计？\\n操作参考文档\\n\\n16.预览页面多内容，但设计界面没有，怎么处理？\\n错误样式图：\\n\\n\\n\\n解决方案： 选中多出来的地方（可多选一些地方），右键点击：删除数据，就没有了；\\n\\n\\n\\n17.积木报表SQL数据集中数据预览为什么只显示10条数据?\\n为了避免大数据问题，故只取前10条数据进行展示\\n\\n\\n\\n18. 积木报表数据源怎么配置？\\n添加数据源文档\\n\\n19. 怎样把报表集成到JeecgBoot的菜单中？\\n备注：大屏和报表的操作是一样的；\\n\\n（1）复制报表访问链接 （2）在系统管理菜单管理进行配置 （3）点击新增按钮填写信息\\n\\n注意：\\na) 前端组件必须按照格式填写 layouts/IframePageView *用window._CONFIG[\\'domianURL\\']代替IP地址、端口号和项目名称,并用{{}}包起来;\\nb）末尾必须携带参数，如（?sex）；\\nc) 是否为路由菜单：是；\\n\\n\\n\\n\\n（4）角色授权 路径：在系统管理->角色授权找到自己对应的角色,鼠标放到更多->授权；\\n\\n勾选刚才创建的菜单\\n刷新页面即可看见点击菜单\\n\\n\\n20. 数据集配置点击确认会报错\\nhttps://github.com/jeecgboot/JimuReport/issues/439\\nSQL state \\\\[null\\\\]; error code \\\\[0\\\\]; Error; nested exception is java.sql.SQLException: Error\\n\\n那么就查看mysql数据库连接驱动是版本是5.1.47,如果是那么请将驱动升级版本或降低版本，如：\\n\\n<dependency>\\n    <groupId>mysql</groupId>\\n    <artifactId>mysql-connector-java</artifactId>\\n    <version>5.1.46</version>\\n    <optional>true</optional>\\n    <scope>runtime</scope>\\n</dependency>\\n\\n22.如何把SQL数据集拼接的查询条件加到数据源语法的group by前面\\n参考报表参数设置\\n\\n23.预览页面与设计页面不一致，在预览时出现空白行\\n检查数据集是多条数据的集合，还是单条数据的对象；如果是集合使用#，如果是对象则需要使用$ 如果页面多行使用#，则会被当做多个集合，中间自动填充空白行。\\n\\n\\n\\n24.为什么配置参数后勾选查询后，下拉单选变成输入框\\n参数不是字段，无法进行配置后就可以下拉单选；可配置字典code实现下拉\\n\\n25.一页展示一条数据，进行循环打印\\n可将整页作为循环块，设置为循环块 参考文档：点击查看\\n\\n26.mysql数据库类型tyint被转换成了true和false\\n需要在维护界面，数据源地址出拼接上\\n\\ntinyInt1isBit=false\\n\\n\\n\\n27.数据库里图片字段为图片链接，如何展示在报表中\\n添加数据源取出图片字段，将单元格类型设置为图片即可，如下图：\\n\\n\\n\\n28. 达梦数据库提示表名不存在\\n 因为达梦数据库如果不是当前用户名登录的(如SYSDBA)，访问不同名的（除了SYSDBA）外，均需要模式名.表名，那么需要你如下图操作，在同名下新建表\\n\\n\\n\\n29. 积木官网添加数据源\\n积木官网添加数据源需使用远程地址，不可使用localhost。\\n\\n32.字典code中直接输入sql语句，下拉框单选项乱序\\n解决方案：可以填写 order by 进行自定义排序，如\\n\\nselect dict_code as value,dict_name as name from jimu_dict order by create_time\\n\\n注意：如果在sqlserver下需要加上top 10（10代表多少条），不然会报错，如\\n\\nselect top 10 dict_code as value,dict_name as name from jimu_dict order by create_time\\n\\n33.导出excel报错版本不匹配，java.lang.NoSuchMethodError\\n将poi版本升级到4.1.2即可解决\\n\\n34. 如何增加列数\\n列索引数量可根据需要修改 参考文档：点击查看\\n\\n\\n\\n35.sql数据集下拉选择数据源，下方列表显示空白，但是有数据\\n目前为了统一规则后台返回的数据的对象均为小写(name)，如果规则不匹配，请改成小写\\n\\n\\n\\n38.预览界面查询栏如何设置默认展开？\\n解决方案：设置JS增强\\n\\n\\n\\nfunction init(){\\n  this.queryPanel = \\'1\\';\\n}\\n\\n39.sqlServer存储过程中有临时表获取不到数据\\n可以通过set nocount on来解决\\n\\n 相关issue: https://github.com/jeecgboot/JimuReport/issues/726\\n\\n40.若依集成积木报表1.4.4+ 新建报表报错\\nfreemarker.core.InvalidReferenceException\\n\\n升级fastjson到1.2.78\\n\\n<dependency>\\n   <groupId>com.alibaba</groupId>\\n   <artifactId>fastjson</artifactId>\\n   <version>1.2.78</version>\\n</dependency>\\n\\n相关issue：issue\\n\\n41.模板示例中条件查询预览失败\\n没有对应的表\\n\\n42.打印的时候，字体加粗效果丢失\\n宋体打印不支持加粗，换成默认的字体\\n\\n43.sqlserver提示驱动不存在\\n在pom文件中添加sqlserver依赖\\n\\n   <dependency>\\n        <groupId>com.microsoft.sqlserver</groupId>\\n        <artifactId>sqljdbc4</artifactId>\\n        <version>4.0</version>\\n        <optional>true</optional>\\n        <scope>runtime</scope>\\n    </dependency>     \\n\\n44.sqlserver下使用CONVERT函数注意事项\\n不可与order by一起使用\\nCONVERT函数需指定别名 如：CONVERT(varchar(7),CREATE_TIME) as CREATE_TIME\\n45.能否设置隐藏的查询条件\\n问题描述： 同一报表，希望不同的人看到不同的数据，目前可以通过JS增强设置初始值，但又不想让用户修改，能否提供设置查询条件隐藏的功能，这样便于数据权限的控制。 分析说明：此问题目的在于不同的人看不同的数据，提问人想设置查询条件默认值且不允许修改\\n\\n1.不同的人看不同的数据：可以使用系统变量 参考文档 如：\\n\\nsql数据集：select * from demo where create_by = \\'#{sysUserCode}\\'\\napi数据集： http://xxx.xxx.xxx/query?create_by=#{sysUserCode}\\n\\n注意：此处的`sysUserCode`,是系统默认设置的登录人的账号，如果重写getUserInfo方法则需要重新设置，文档中的代码，只适用于jeecg-boot不可照搬，仅供参考【推荐此方案】。\\n\\n\\n2.想设置查询条件默认值且不允许修改: js增强可以设置查询条件的默认值，也可以往查询参数对象里设置一个自定义的参数值，这个是支持的。但是，在配置数据集的时候，下方tab报表字段明细和报表参数中，会配置一些字段的信息，如果js增强定义的参数名不在这两个tab下，那么无效！所以做法如下：\\n定义数据集（不需要将参数name设置为查询条件）：\\nsql数据集：select * from demo where create_by = \\'${name}\\'\\napi数据集： http://xxx.xxx.xxx/query?create_by=${name}\\n\\n定义js增强,设置name的值：\\nfunction init(){\\n    this.queryInfo[\\'name\\'] = \\'scott\\'\\n}\\n\\n46. 日期默认查询，无法设置默认值为上月\\n问题描述： 使用dateStr 默认取上月实现不了，用=concat(dateStr(\\'yyyy\\'),\\'-\\', dateStr(\\'MM\\', -1))返回2021-9，不是2021-09，少了一位。 建议实现=dateStr(\\'yyyy-MM\\'，-1) 返回 2021-09，而不是使用天数计算偏移量。\\n解决方案： 参考文档 中的升级功能\\n\\n47. 打印多出一页空白纸张\\n解决方案： 打印导出，空白行和没有行是有区别的，界面上都是空白没区别，但是实际数据存储，空白行会占位的。\\n查看控制台打印的数据：你的rows都多达90多行了，说明是之前你设计的很多历史数据没有删除行，导致多出很多空白页。\\n\\n\\n\\n48. mongodb用法\\n1). 以授权的方式启动Mongo,给使用的数据库添加用户\\n\\n切换数据库 use test\\n\\n创建用户 db.createUser({user: \\\"root\\\", pwd: \\\"123456\\\", roles: \\\\[{ role: \\\"dbOwner\\\", db: \\\"test\\\" }\\\\]})\\n\\n参考博客：https://www.cnblogs.com/jacksoft/p/6916137.html\\n\\n2). mongodb-driver-sync 驱动集成用法 参考博客： https://blog.csdn.net/nyzzht123/article/details/107936552 https://www.jianshu.com/p/5186fb5a1292\\n\\n49、出现jsqlparser不兼容问题\\n如果出现jsqlparser不兼容问题，请这么引用\\n<dependency>\\n  <groupId>org.jeecgframework.jimureport</groupId>\\n  <artifactId>jimureport-spring-boot-starter</artifactId>\\n  <version>{版本号}</version>\\n  <exclusions>\\n    <exclusion>\\n      <artifactId>minidao-spring-boot-starter</artifactId>\\n      <groupId>org.jeecgframework</groupId>\\n    </exclusion>\\n  </exclusions>\\n</dependency>\\n<dependency>\\n  <groupId>org.jeecgframework</groupId>\\n  <artifactId>minidao-spring-boot-starter</artifactId>\\n  <version>1.8.8</version>\\n</dependency>\\n\\n50、关于积木报表在开发、生产环境增量同步https://github.com/jeecgboot/JimuReport/issues/1928\\n51、数据库字段为关键词，字段作为查询条件报错\\n报错信息：发现mysql下关键词字段\\\"year_month\\\"缺少\\\"`\\\"\\n\\nSELECT COUNT(1) total FROM ( select * from (select `year_month`,name,age from `demo`) jeecg_rp_temp  where year_month=? ) temp_count\\n\\n\\n解决方案：关键词字段请用as重命名一下\\n\\n\\n\\n52、依赖redisson后编辑字典、查询字典报错：\\n报错信息：\\n\\njava.lang.IllegalArgumentException: Cannot find cache named \\'jmreport:cache:dict\\' for Builder\\n\\n解决方法：配置文件增加：\\n\\nspring:\\n  cache:\\n    type: redis\\n\\n53、未登录的情况下导出excel和pdf报错\\n解决方案：在SpringSecurityConfig页面排除导出excel和导出pdf的请求地址，其他同理\\n\\n\\n\\n .antMatchers(\\\"/jmreport/exportPdfStream\\\", \\\"/jmreport/exportAllExcelStream\\\")', 'complete', NULL);\nINSERT INTO `airag_knowledge_doc` VALUES ('1897926864815575042', 'jeecg', '2025-03-07 16:26:41', 'admin', '2025-11-27 17:32:00', 'A04', NULL, '1897926563148648449', 'index', 'file', '\\n# 项目介绍\\n\\n\\n `JeecgBoot` 是一款基于代码生成器的`低代码开发平台` 拥有零代码能力！采用前后端分离架构：SpringBoot2.x，Ant Design&Vue，Mybatis-plus，Shiro，JWT。强大的代码生成器让前后端代码一键生成，无需写任何代码! JeecgBoot引领新的开发模式(Online Coding模式-> 代码生成器模式-> 手工MERGE智能开发)， 帮助解决Java项目70%的重复工作，让开发更多关注业务逻辑。既能快速提高开发效率，帮助公司节省成本，同时又不失灵活性！JeecgBoot还独创在线开发模式（No-Code概念）：在线表单配置（表单设计器）、移动配置能力、工作流配置（在线设计流程）、报表配置能力、在线图表配置、插件能力（可插拔）等等！\\n\\n `JeecgBoot在提高UI能力`的同时，降低了前后分离的开发成本，JeecgBoot还独创在线开发模式（No-Code概念），一系列在线智能开发：在线配置表单、在线配置报表、在线图表设计、在线设计流程等等。\\n\\n ` JEECG宗旨是: `简单功能由Online Coding配置实现（在线配置表单、在线配置报表、在线图表设计、在线设计流程、在线设计表单），复杂功能由代码生成器生成进行手工Merge，既保证了智能又兼顾了灵活; \\n\\n 业务流程采用工作流来实现、扩展出任务接口，供开发编写业务逻辑，表单提供多种解决方案： 表单设计器、online配置表单、编码表单。同时实现了流程与表单的分离设计（松耦合）、并支持任务节点灵活配置，既保证了公司流程的保密性，又减少了开发人员的工作量。\\n\\n\\n## 技术支持\\n\\n*  新手指南： [快速入门](http://www.jeecg.com/doc/quickstart)   |   [常见问题 ](http://www.jeecg.com/doc/qa)  | [版本日志](http://jeecg.com/doc/log)\\n*  视频教程：[ JeecgBoot v3.7 新版视频教程](http://jeecg.com/doc/video)\\n*  QQ交流群：⑩716488839、⑨808791225(满)、其他(满)\\n*  在线演示 ：  [系统演示](http://boot3.jeecg.com)   |  [APP演示](http://app.jeecg.com)\\n\\n\\n源码下载\\n-----------------------------------\\n\\n- https://github.com/jeecgboot/jeecg-boot\\n\\n\\n\\n## 技术架构\\n-----------------------------------\\n\\n#### 后端\\n\\n- IDE建议： IDEA (必须安装lombok插件 )\\n- 语言：Java 8+ (支持17)\\n- 依赖管理：Maven\\n- 基础框架：Spring Boot 2.7.18\\n- 微服务框架： Spring Cloud Alibaba 2021.0.1.0\\n- 持久层框架：MybatisPlus 3.5.3.2\\n- 报表工具： JimuReport 1.7.6\\n- 安全框架：Apache Shiro 1.12.0，Jwt 3.11.0\\n- 微服务技术栈：Spring Cloud Alibaba、Nacos、Gateway、Sentinel、Skywalking\\n- 数据库连接池：阿里巴巴Druid 1.1.22\\n- 日志打印：logback\\n- 缓存：Redis\\n- 其他：autopoi, fastjson，poi，Swagger-ui，quartz, lombok（简化代码）等。\\n- 默认数据库脚本：MySQL5.7+\\n- [其他数据库，需要自己转](https://my.oschina.net/jeecg/blog/4905722)\\n\\n\\n#### 前端\\n\\n- 前端IDE建议：WebStorm、Vscode\\n- 采用 Vue3.0+TypeScript+Vite+Ant-Design-Vue等新技术方案，包括二次封装组件、utils、hooks、动态菜单、权限校验、按钮级别权限控制等功能\\n- 最新技术栈：Vue3.0 + TypeScript + Vite5 + ant-design-vue4 + pinia + echarts + unocss + vxe-table + qiankun + es6\\n- 依赖管理：node、npm、pnpm\\n\\n\\n\\n#### 支持库\\n\\n|  数据库   |  支持   |\\n| --- | --- |\\n|   MySQL   |  √   |\\n|  Oracle11g   |  √   |\\n|  Sqlserver2017   |  √   |\\n|   PostgreSQL   |  √   |\\n|   MariaDB   |  √   |\\n|   达梦   |  √   |\\n|   人大金仓   |  √   |\\n\\n\\n\\n## 微服务解决方案\\n\\n\\n- 1、服务注册和发现 Nacos √\\n- 2、统一配置中心 Nacos  √\\n- 3、路由网关 gateway(三种加载方式) √\\n- 4、分布式 http feign √\\n- 5、熔断降级限流 Sentinel √\\n- 6、分布式文件 Minio、阿里OSS √ \\n- 7、统一权限控制 JWT + Shiro √\\n- 8、服务监控 SpringBootAdmin√\\n- 9、链路跟踪 Skywalking   [参考文档](/java/springcloud/super/skywarking)\\n- 10、消息中间件 RabbitMQ  √\\n- 11、分布式任务 xxl-job  √ \\n- 12、分布式事务 Seata\\n- 13、轻量分布式日志 Loki+grafana套件\\n- 14、支持 docker-compose、k8s、jenkins\\n- 15、CAS 单点登录   √\\n- 16、路由限流   √\\n\\n   \\n### 微服务架构图\\n![微服务架构图](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/jeecgboot_springcloud2022.png \\\"在这里输入图片标题\\\")\\n\\n\\n\\n\\n\\n## 系统架构图\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/images/screenshot_1662547398792.png)\\n*****\\n\\n\\n## 系统截图\\n\\n### PC端\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687778397612.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687778435846.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687778476447.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687778512836.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687778582144.png)\\n\\n### 在线接口文档\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687778702243.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687778737438.png)\\n\\n\\n### 报表\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687778780458.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/up-fa52b44445db281c51d3f267dce7450d21b.gif)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687779705768.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687779725144.png)\\n\\n### 流程\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687779807541.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687779857971.png)\\n\\n![](/static/jimuImages/image_1687779966442.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687780016598.png)\\n\\n\\n### 手机端\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687780240854.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687780264274.png)\\n\\n### PAD端\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687780285230.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687780328101.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687780342778.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687780373126.png)\\n\\n\\n\\n\\n\\n\\n\\n', 'complete', '{\\\"filePath\\\":\\\"temp/index_1741335996542.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1897926933086261249', 'jeecg', '2025-03-07 16:26:57', 'admin', '2025-11-27 17:31:59', 'A04', NULL, '1897926563148648449', 'qa', 'file', '1.菜单的这些配置是什么意思？\\n\\n![](/static/jimuImages/screenshot_1585040135427.png)\\n|    配置|    描述 |\\n| --- | --- |\\n|  是否路由菜单   |   是：跳转路由的时候根据配置的前端组件值跳转，否：起作用的是菜单路径  |\\n|  隐藏路由   |   是：左侧菜单不加载反之加载  |\\n|  缓存路由   |   是：路由只加载一次即created只执行一次  |\\n|  聚合路由   |  是：只要配置在该路由下面的子路由全部不会显示在左侧菜单栏  |\\n| 打开方式   |  内部打开是在窗口tab里打开，外部打开浏览器tab打开 |\\n\\n---\\n2.列表页面跳转新的路由需要展示成面包屑菜单样式：\\n目前不支持，需要自行扩展\\n\\n---\\n3.表单设计器自定义扩展\\n目前只支持将设计好的表单引入自己的modal页面，扩展暂不支持\\n\\n---\\n4.图表点击事件\\n有自定义的图表js增强事件，后续补充该文档\\n\\n---\\n<span>20200324 LOWCOD-323</span>\\n\\n---\\n\\n5.online报表 系统变量的使用\\n`select username,id from sys_user  where username = \\'#{sys_user_code}\\'`\\n\\n6.首页怎么改成自己的。\\n方法一：直接修改文件：src/views/dashboard/Analysis.vue\\n方法二：自定义首页页面，将首页菜单的前端组件配置为自己的文件，注意**只能修改前端组件不可修改菜单路径**\\n\\n![](/static/jimuImages/screenshot_1586254248894.png)\\n\\n\\n\\n7.项目编译 文件上有红色波浪线 ，点开文件红线消失，查看problem报错 xxx程序包不存在,实际该包存在\\n解决方法：在Terminal 中执行 `mvn idea:idea` 再次编译即可\\n\\n\\n\\n\\n', 'complete', '{\\\"filePath\\\":\\\"temp/QA_1741336015236.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1897932000963092482', 'jeecg', '2025-03-07 16:47:06', 'admin', '2025-11-27 17:32:03', 'A04', NULL, '1897212906878009346', 'index', 'file', '# 项目介绍\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/jimureport2.jpg)\\n\\n*****\\n\\n# JimuReport\\n\\n 积木报表，是一款免费的数据可视化报表，含报表、仪表盘和大屏设计，像搭建积木一样完全在线设计！功能涵盖：数据报表、打印设计、图表报表、门户设计、大屏设计等！\\n \\n -   Web版报表设计器，类Excel操作风格，通过拖拽完成报表设计，所见即所得。\\n -   大屏采用类word风格，可以随意拖动组件，想怎么设计怎么设计，可以像百度和阿里一样，设计出炫酷大屏！\\n -   从 v1.9+ 起推出 JimuBI 产品，她的牛叉之处，同时支持仪表盘、大屏、门户 (支持交互)、移动.\\n -   秉承\\\"简单、易用、专业\\\"的产品理念，极大的降低报表开发难度、缩短开发周期、节省成本。\\n -   领先的企业级Web报表，支持各种复杂报表，专注于解决企业报表难题。\\n -   积木BI 数据可视化，支持大屏设计和仪表盘，致力于更生动、更友好的形式呈现实时业务数据分析\\n\\n```\\n专注于开源，打造 “专业 易用 智能” 的数据可视化报表、大屏、门户\\n开源协议：`功能免费、可以商用、代码不开放`\\n```\\n\\n\\n为什么选择 JimuReport?\\n-----------------------------------\\n>    永久免费，支持各种复杂报表，并且傻瓜式在线设计，非常的智能，低代码时代，这个是你的首选！\\n\\n- 采用SpringBoot的脚手架项目，都可以快速集成\\n- Web 版设计器，类似于excel操作风格，通过拖拽完成报表设计\\n- 通过SQL、API等方式，将数据源与模板绑定。同时支持表达式，自动计算合计等功能，使计算工作量大大降低\\n- 开发效率很高，傻瓜式在线报表设计，一分钟设计一个报表，又简单又强大\\n- 支持 ECharts，目前支持28种图表，在线拖拽设计，支持SQL和API两种数据源\\n- 支持分组、交叉，合计、表达式等复杂报表\\n- 支持打印设计（支持套打、背景打印等）可设置打印边距、方向、页眉页脚等参数 一键快速打印 同时可实现发票套打，不动产证等精准、无缝打印\\n- 可视化图表，仪表盘设计器类大屏设计，支持丰富的数据源连接和移动端，通过拖拉拽方式快速制作图表和门户设计；支持多种图表类型：柱形图、折线图、散点图、饼图、环形图、面积图、漏斗图、进度图、仪表盘、雷达图、地图等等；\\n- 可设计各种类型的单据、大屏，如出入库单、销售单、财务报表、合同、监控大屏、旅游数据大屏等\\n- 大屏设计器支持几十种图表样式，可自由拼接、组合，设计炫酷大屏\\n- 数据可视化，DataV、帆软的开源替代方案，比帆软拥有更好的体验和更简单的使用方式\\n- [积木报表官网](http://jimureport.com/login) 可以在线免费制作报表和大屏，手机号一键注册，便可永久使用。大屏采用类word风格，可以随意拖动组件，想怎么设计怎么设计，可以像百度和阿里一样，设计出炫酷的可视化大屏！重要的是：免费！免费！免费！\\n\\n\\n\\n\\n## 产生背景\\n报表是企业IT服务必备的一项需求，但是行业内并没有一个免费好用的报表，大部分免费的报表功能较弱也不够智能，商业报表又很贵，所以有了研发一套免费报表的初衷。\\n做一个什么样的报表呢？随着低代码概念的兴起，原先通过报表工具设计模板，再与系统集成的模式已经落伍，现在追求的是完全在线设计，傻瓜式的操作，实现简单易用又智能的报表！\\n\\n- 目前积木报表已经实现了完全在线设计，轻量级集成、类似excel的风格，像搭建积木一样在线拖拽设计报表！功能涵盖数据报表设计、打印设计、图表设计、门户设计、大屏设计等！\\n- 2019年底启动积木报表研发工作，历经一年多的时间，2020-11-03第一版出炉 [v1.0-beta](https://www.oschina.net/news/119666/jimureport-1-0-beta-released)\\n- 2020年的持续打磨和研发，终于在2021-1-18发布了第一个正式版本 [v1.1.05](https://www.oschina.net/news/126916/jimureport-1-1-05-released)\\n- 截止到当前2024-09-14，积木报表已经完全涵盖商业BI的所有功能，包括不限于复杂报表、图表可视化、大屏、移动图表、填报等高级功能，而且拥有更好的体验和更简单的使用方式。\\n- 更多版本日志查看 [版本日志](http://jimureport.com/doc/log)\\n\\n\\n\\n\\n\\n\\n开发文档\\n-----------------------------------\\n\\n- [快速集成](</quick.md>)\\n- [集成源码下载](https://github.com/jeecgboot/JimuReport)\\n- [大屏与报表演示](http://jimureport.com/login)  |  [零代码体验](https://app.qiaoqiaoyun.com)\\n\\n\\n\\n\\n\\n\\n项目介绍\\n-----------------------------------\\n\\n- 官方网站： http://www.jimureport.com\\n- 视频教程： http://jimureport.com/doc/video\\n- QQ交流群：③596660273、其他群(满)\\n\\n\\n数据库兼容 \\n-----------------------------------\\n> 支持国产、常规、Nosql等30多种数据源，支持以SQL的方式去查询csv、mogodb等非物理数据库。\\n\\n|  数据库   |  支持   |\\n| --- | --- |\\n|   MySQL   |  √   |\\n|  Oracle、Oracle9i   |  √   |\\n|  SqlServer、SqlServer2012   |  √   |\\n|   PostgreSQL   |  √   |\\n|   DB2、Informix   |  √   |\\n|   MariaDB   |  √   |\\n|  SQLite、Hsqldb、Derby、H2   |  √   |\\n|   达梦、人大金仓、神通   |  √   |\\n|   华为高斯、虚谷、瀚高数据库、 TDengine 涛思数据   |  √   |\\n|   阿里云PolarDB、PPAS、HerdDB   |  √   |\\n|  Hive、HBase、CouchBase   |  √   |\\n|  导入Excel、csv、json文件数据集   |  √   |\\n|  sqllite、TiDB、Doris、clickhouse、 MongoDB-BI   |  √   |\\n|  elasticsearch、mogodb  |  √   |\\n\\n\\n\\n报表设计效果\\n-----------------------------------\\n\\n- 报表设计器（完全在线设计，简单易用）\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/up-752b454f64ed87c798b3e8a083fbd6622d4.gif)\\n\\n- 打印设计（支持套打、背景打印）\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862827604.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862839013.png)\\n\\n- 数据报表（支持分组、交叉，合计等复杂报表）\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862854011.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862862414.png)\\n\\n- 图形报表（目前支持28种图表）\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862883559.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862892649.png)\\n\\n\\n\\n大屏设计效果\\n-----------------------------------\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862905901.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862938863.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862951297.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862960053.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862974786.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862983740.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862996008.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687863002758.png)\\n\\n\\n仪表盘设计器\\n-----------------------------------\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687863014429.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687863021555.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687863028545.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687863043320.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687863050461.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687863057103.png)\\n\\n## 功能清单\\n```\\n├─报表设计器\\n│  ├─数据源\\n│  │  ├─支持多种数据源，如Oracle,MySQL,SQLServer,PostgreSQL等主流的数据库\\n│  │  ├─支持SQL编写页面智能化，可以看到数据源下面的表清单和字段清单\\n│  │  ├─支持参数\\n│  │  ├─支持单数据源和多数数据源设置\\n│  ├─单元格格式\\n│  │  ├─边框\\n│  │  ├─字体大小\\n│  │  ├─字体颜色\\n│  │  ├─背景色\\n│  │  ├─字体加粗\\n│  │  ├─支持水平和垂直的分散对齐\\n│  │  ├─支持文字自动换行设置\\n│  │  ├─图片设置为图片背景\\n│  │  ├─支持无线行和无限列\\n│  │  ├─支持设计器内冻结窗口\\n│  │  ├─支持对单元格内容或格式的复制、粘贴和删除等功能\\n│  │  ├─等等\\n│  ├─报表元素\\n│  │  ├─文本类型：直接写文本；支持数值类型的文本设置小数位数\\n│  │  ├─图片类型：支持上传一张图表；支持图片动态生成\\n│  │  ├─图表类型\\n│  │  ├─函数类型\\n│  │  └─支持求和\\n│  │  └─平均值\\n│  │  └─最大值\\n│  │  └─最小值\\n│  ├─背景\\n│  │  ├─背景颜色设置\\n│  │  ├─背景图片设置\\n│  │  ├─背景透明度设置\\n│  │  ├─背景大小设置\\n│  ├─数据字典\\n│  ├─报表打印\\n│  │  ├─自定义打印\\n│  │  └─医药笺、逮捕令、介绍信等自定义样式设计打印\\n│  │  ├─简单数据打印\\n│  │  └─出入库单、销售表打印\\n│  │  └─带参数打印\\n│  │  └─分页打印\\n│  │  ├─套打\\n│  │  └─不动产证书打印\\n│  │  └─发票打印\\n│  ├─数据报表\\n│  │  ├─分组数据报表\\n│  │  └─横向数据分组\\n│  │  └─纵向数据分组\\n│  │  └─多级循环表头分组\\n│  │  └─横向分组小计\\n│  │  └─纵向分组小计（预计2021.03.08）\\n│  │  └─合计\\n│  │  ├─交叉报表\\n│  │  ├─明细表\\n│  │  ├─带条件查询报表\\n│  │  ├─表达式报表\\n│  │  ├─带二维码/条形码报表\\n│  │  ├─多表头复杂报表（预计2021.03.08发布）\\n│  │  ├─主子报表（预计2021.03.08发布）\\n│  │  ├─预警报表（预计2021.03.08发布）\\n│  │  ├─数据钻取报表（预计2021.03.08发布）\\n│  ├─图形报表\\n│  │  ├─柱形图\\n│  │  ├─折线图\\n│  │  ├─饼图\\n│  │  ├─折柱图\\n│  │  ├─散点图\\n│  │  ├─漏斗图\\n│  │  ├─雷达图\\n│  │  ├─象形图\\n│  │  ├─地图\\n│  │  ├─仪盘表\\n│  │  ├─关系图\\n│  │  ├─图表背景\\n│  │  ├─图表动态刷新\\n│  │  ├─图表数据字典\\n│  ├─参数\\n│  │  ├─参数配置\\n│  │  ├─参数管理\\n│  ├─导入导出\\n│  │  ├─支持导入Excel\\n│  │  ├─支持导出Excel、pdf；支持导出excel、pdf带参数\\n│  ├─打印设置\\n│  │  ├─打印区域设置\\n│  │  ├─打印机设置\\n│  │  ├─预览\\n│  │  ├─打印页码设置\\n├─大屏设计器\\n│  ├─系统功能\\n│  │  ├─静态数据源和动态数据源设置\\n│  │  ├─基础功能\\n│  │  └─支持拖拽设计\\n│  │  └─支持增、删、改、查大屏\\n│  │  └─支持复制大屏数据和样式\\n│  │  └─支持大屏预览、分享\\n│  │  └─支持系统自动保存数据，同时支持手动恢复数据\\n│  │  └─支持设置大屏密码\\n│  │  └─支持对组件图层的删除、组合、上移、下移、置顶、置底等\\n│  │  ├─背景设置\\n│  │  └─大屏的宽度和高度设置\\n│  │  └─大屏简介设置\\n│  │  └─背景颜色、背景图片设置\\n│  │  └─封面图设置\\n│  │  └─缩放比例设置\\n│  │  └─环境地址设置\\n│  │  └─水印设置\\n│  │  ├─地图设置\\n│  │  └─添加地图\\n│  │  └─地图数据隔离\\n│  ├─图表\\n│  │  ├─柱形图\\n│  │  ├─折线图\\n│  │  ├─折柱图\\n│  │  ├─饼图\\n│  │  ├─象形图\\n│  │  ├─雷达图\\n│  │  ├─散点图\\n│  │  ├─漏斗图\\n│  │  ├─文本框\\n│  │  ├─跑马灯\\n│  │  ├─超链接\\n│  │  ├─实时时间\\n│  │  ├─地图\\n│  │  ├─全国物流地图\\n│  │  ├─地理坐标地图\\n│  │  ├─城市派件地图\\n│  │  ├─图片\\n│  │  ├─图片框\\n│  │  ├─轮播图\\n│  │  ├─滑动组件\\n│  │  ├─iframe\\n│  │  ├─video\\n│  │  ├─翻牌器\\n│  │  ├─环形图\\n│  │  ├─进度条\\n│  │  ├─仪盘表\\n│  │  ├─字浮云\\n│  │  ├─表格\\n│  │  ├─选项卡\\n│  │  ├─万能组件\\n└─其他模块\\n   └─更多功能开发中。。\\n```\\n\\n \\n\\n', 'complete', '{\\\"filePath\\\":\\\"temp/readme_1741337223240.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905186930719539201', 'jeecg', '2025-03-27 17:15:36', 'admin', '2025-08-08 18:03:21', 'A04', NULL, '1905186756806918146', 'part1', 'file', NULL, 'failed', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/01第一部分第1章_1743066923748.pdf\\\",\\\"failedReason\\\":\\\"Failed to execute \\'init\\'\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905186968325668866', 'jeecg', '2025-03-27 17:15:45', 'admin', '2025-08-08 18:03:20', 'A04', NULL, '1905186756806918146', 'part2', 'file', NULL, 'failed', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/02第一部分第2章_1743066943040.pdf\\\",\\\"failedReason\\\":\\\"Failed to execute \\'init\\'\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187001037045761', 'jeecg', '2025-03-27 17:15:52', 'admin', '2025-08-08 18:03:20', 'A04', NULL, '1905186756806918146', 'part3', 'file', NULL, 'failed', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/03第一部分第3章_1743066951733.pdf\\\",\\\"failedReason\\\":\\\"Failed to execute \\'init\\'\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187042770370561', 'jeecg', '2025-03-27 17:16:02', 'admin', '2025-08-08 18:03:20', 'A04', NULL, '1905186756806918146', 'part4', 'file', NULL, 'failed', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/04第一部分第4章_1743066960385.pdf\\\",\\\"failedReason\\\":\\\"Failed to execute \\'init\\'\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187113339535361', 'jeecg', '2025-03-27 17:16:19', 'admin', '2025-08-08 18:03:20', 'A04', NULL, '1905186756806918146', 'part5', 'file', NULL, 'failed', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/05第一部分第5章_1743066977792.pdf\\\",\\\"failedReason\\\":\\\"Failed to execute \\'init\\'\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187163981561857', 'jeecg', '2025-03-27 17:16:31', 'admin', '2025-08-08 18:03:20', 'A04', NULL, '1905186756806918146', 'part6', 'file', NULL, 'failed', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/06第一部分第6章_1743066990164.pdf\\\",\\\"failedReason\\\":\\\"Failed to execute \\'init\\'\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187246412218369', 'jeecg', '2025-03-27 17:16:51', 'admin', '2025-08-08 18:03:21', 'A04', NULL, '1905186756806918146', 'part7', 'file', NULL, 'failed', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/07第一部分第7章_1743067007831.pdf\\\",\\\"failedReason\\\":\\\"Failed to execute \\'init\\'\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187348543520770', 'jeecg', '2025-03-27 17:17:15', 'admin', '2025-08-08 18:03:21', 'A04', NULL, '1905186756806918146', 'part8', 'file', NULL, 'failed', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/08第一部分第8章_1743067032663.pdf\\\",\\\"failedReason\\\":\\\"Failed to execute \\'init\\'\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187596229754881', 'jeecg', '2025-03-27 17:18:14', 'admin', '2025-08-08 18:03:20', 'A04', NULL, '1905186756806918146', 'part9', 'file', NULL, 'failed', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/09第一部分第9章_1743067087019.pdf\\\",\\\"failedReason\\\":\\\"Failed to execute \\'init\\'\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187666618564609', 'jeecg', '2025-03-27 17:18:31', 'admin', '2025-08-08 18:03:21', 'A04', NULL, '1905186756806918146', 'part10', 'file', NULL, 'failed', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/10第一部分第10章_1743067109769.pdf\\\",\\\"failedReason\\\":\\\"Failed to execute \\'init\\'\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187818494312449', 'jeecg', '2025-03-27 17:19:07', 'admin', '2025-08-08 18:03:20', 'A04', NULL, '1905186756806918146', 'part11', 'file', NULL, 'failed', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/11第一部分第11章_1743067121732.pdf\\\",\\\"failedReason\\\":\\\"Failed to execute \\'init\\'\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187888337862657', 'jeecg', '2025-03-27 17:19:24', 'admin', '2025-08-08 18:03:21', 'A04', NULL, '1905186756806918146', 'part12', 'file', NULL, 'failed', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/12第一部分第12章_1743067158952.pdf\\\",\\\"failedReason\\\":\\\"Failed to execute \\'init\\'\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187920491397122', 'jeecg', '2025-03-27 17:19:32', 'admin', '2025-08-08 18:03:20', 'A04', NULL, '1905186756806918146', 'part13', 'file', NULL, 'failed', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/13第一部分第13章_1743067170886.pdf\\\",\\\"failedReason\\\":\\\"Failed to execute \\'init\\'\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500647018498', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:45', NULL, NULL, '1993971013594931202', 'build', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\build.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500672184321', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:44', NULL, NULL, '1993971013594931202', 'projectCatalog', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\dev\\\\\\\\projectCatalog.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500676378626', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:45', NULL, NULL, '1993971013594931202', 'startup', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\dev\\\\\\\\startup.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500676378627', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:44', NULL, NULL, '1993971013594931202', 'generate', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\generate.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500676378628', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:45', NULL, NULL, '1993971013594931202', 'mobile-test', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\mobile-test.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500684767234', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:44', NULL, NULL, '1993971013594931202', 'push', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\push.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500684767235', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:45', NULL, NULL, '1993971013594931202', 'qa', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\qa.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500688961538', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:45', NULL, NULL, '1993971013594931202', 'readme', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\readme.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500693155842', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:45', NULL, NULL, '1993971013594931202', 'release-harmony', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\release\\\\\\\\release-harmony.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500693155843', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:44', NULL, NULL, '1993971013594931202', 'release-ios', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\release\\\\\\\\release-ios.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500693155844', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:45', NULL, NULL, '1993971013594931202', 'categorySelect', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\ui\\\\\\\\categorySelect.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500697350145', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:45', NULL, NULL, '1993971013594931202', 'grid', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\ui\\\\\\\\grid.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500697350146', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:45', NULL, NULL, '1993971013594931202', 'imgPreview', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\ui\\\\\\\\imgPreview.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500701544449', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:45', NULL, NULL, '1993971013594931202', 'onlineCheckbox', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\ui\\\\\\\\onlineCheckbox.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500701544450', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:46', NULL, NULL, '1993971013594931202', 'onlineDate', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\ui\\\\\\\\onlineDate.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500701544451', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:45', NULL, NULL, '1993971013594931202', 'onlinePca', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\ui\\\\\\\\onlinePca.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500705738754', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:46', NULL, NULL, '1993971013594931202', 'onlinePopupLinkRecord', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\ui\\\\\\\\onlinePopupLinkRecord.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500705738755', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:46', NULL, NULL, '1993971013594931202', 'onlineSelect', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\ui\\\\\\\\onlineSelect.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500705738756', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:47', NULL, NULL, '1993971013594931202', 'pageLayout', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\ui\\\\\\\\pageLayout.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500705738757', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:46', NULL, NULL, '1993971013594931202', 'popup', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\ui\\\\\\\\popup.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500705738758', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:46', NULL, NULL, '1993971013594931202', 'popupDict', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\ui\\\\\\\\popupDict.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500714127361', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:47', NULL, NULL, '1993971013594931202', 'selectDept', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\ui\\\\\\\\selectDept.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500714127362', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:46', NULL, NULL, '1993971013594931202', 'selectUser', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\ui\\\\\\\\selectUser.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1993974500714127363', 'admin', '2025-11-27 17:25:42', 'admin', '2025-11-27 17:25:46', NULL, NULL, '1993971013594931202', 'treeSelect', 'file', NULL, 'complete', '{\\\"sourcesPath\\\":\\\"D://opt//upFiles\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\",\\\"filePath\\\":\\\"\\\\\\\\1993971013594931202\\\\\\\\402881829ac4a1fb019ac4a1fbc20000\\\\\\\\files\\\\\\\\docs\\\\\\\\uniapp3\\\\\\\\ui\\\\\\\\treeSelect.md\\\"}');\n\n-- ----------------------------\n-- Table structure for airag_mcp\n-- ----------------------------\nDROP TABLE IF EXISTS `airag_mcp`;\nCREATE TABLE `airag_mcp`  (\n  `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n  `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '图标',\n  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称',\n  `descr` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '描述',\n  `category` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT 'mcp' COMMENT '类型（plugin=插件，mcp=MCP）',\n  `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'mcp类型（sse：sse类型；stdio：标准类型）',\n  `endpoint` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '服务端点（SSE类型为URL，stdio类型为命令）',\n  `headers` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '请求头（sse类型）、环境变量（stdio类型）',\n  `tools` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '工具列表',\n  `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '状态（enable=启用、disable=禁用）',\n  `synced` int(11) NULL DEFAULT NULL COMMENT '是否同步',\n  `metadata` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '元数据',\n  `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '所属部门',\n  `tenant_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '租户id',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'AI MCP' ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of airag_mcp\n-- ----------------------------\nINSERT INTO `airag_mcp` VALUES ('1983474860536475649', NULL, '高德MCP', '高德MCP，包含查询路线、路况、天气等工具', 'mcp', 'sse', 'https://mcp.amap.com/sse?key=adaea6afab82893d0ccb4bd0239abcdd', '', '[{\\\"name\\\":\\\"maps_direction_bicycling\\\",\\\"description\\\":\\\"骑行路径规划用于规划骑行通勤方案，规划时会考虑天桥、单行线、封路等情况。最大支持 500km 的骑行路线规划\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"origin\\\",\\\"description\\\":\\\"出发点经纬度，坐标格式为：经度，纬度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"destination\\\",\\\"description\\\":\\\"目的地经纬度，坐标格式为：经度，纬度\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_direction_driving\\\",\\\"description\\\":\\\"驾车路径规划 API 可以根据用户起终点经纬度坐标规划以小客车、轿车通勤出行的方案，并且返回通勤方案的数据。\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"origin\\\",\\\"description\\\":\\\"出发点经纬度，坐标格式为：经度，纬度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"destination\\\",\\\"description\\\":\\\"目的地经纬度，坐标格式为：经度，纬度\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_direction_transit_integrated\\\",\\\"description\\\":\\\"根据用户起终点经纬度坐标规划综合各类公共（火车、公交、地铁）交通方式的通勤方案，并且返回通勤方案的数据，跨城场景下必须传起点城市与终点城市\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"origin\\\",\\\"description\\\":\\\"出发点经纬度，坐标格式为：经度，纬度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"destination\\\",\\\"description\\\":\\\"目的地经纬度，坐标格式为：经度，纬度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"city\\\",\\\"description\\\":\\\"公共交通规划起点城市\\\",\\\"required\\\":true},{\\\"name\\\":\\\"cityd\\\",\\\"description\\\":\\\"公共交通规划终点城市\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_direction_walking\\\",\\\"description\\\":\\\"根据输入起点终点经纬度坐标规划100km 以内的步行通勤方案，并且返回通勤方案的数据\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"origin\\\",\\\"description\\\":\\\"出发点经度，纬度，坐标格式为：经度，纬度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"destination\\\",\\\"description\\\":\\\"目的地经度，纬度，坐标格式为：经度，纬度\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_distance\\\",\\\"description\\\":\\\"测量两个经纬度坐标之间的距离,支持驾车、步行以及球面距离测量\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"origins\\\",\\\"description\\\":\\\"起点经度，纬度，可以传多个坐标，使用竖线隔离，比如120,30|120,31，坐标格式为：经度，纬度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"destination\\\",\\\"description\\\":\\\"终点经度，纬度，坐标格式为：经度，纬度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"type\\\",\\\"description\\\":\\\"距离测量类型,1代表驾车距离测量，0代表直线距离测量，3步行距离测量\\\"}]},{\\\"name\\\":\\\"maps_geo\\\",\\\"description\\\":\\\"将详细的结构化地址转换为经纬度坐标。支持对地标性名胜景区、建筑物名称解析为经纬度坐标\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"address\\\",\\\"description\\\":\\\"待解析的结构化地址信息\\\",\\\"required\\\":true},{\\\"name\\\":\\\"city\\\",\\\"description\\\":\\\"指定查询的城市\\\"}]},{\\\"name\\\":\\\"maps_regeocode\\\",\\\"description\\\":\\\"将一个高德经纬度坐标转换为行政区划地址信息\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"location\\\",\\\"description\\\":\\\"经纬度\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_ip_location\\\",\\\"description\\\":\\\"IP 定位根据用户输入的 IP 地址，定位 IP 的所在位置\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"ip\\\",\\\"description\\\":\\\"IP地址\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_schema_personal_map\\\",\\\"description\\\":\\\"用于行程规划结果在高德地图展示。将行程规划位置点按照行程顺序填入lineList，返回结果为高德地图打开的URI链接，该结果不需总结，直接返回！\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"orgName\\\",\\\"description\\\":\\\"行程规划地图小程序名称\\\",\\\"required\\\":true},{\\\"name\\\":\\\"lineList\\\",\\\"description\\\":\\\"行程列表\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_around_search\\\",\\\"description\\\":\\\"周边搜，根据用户传入关键词以及坐标location，搜索出radius半径范围的POI\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"keywords\\\",\\\"description\\\":\\\"搜索关键词\\\",\\\"required\\\":true},{\\\"name\\\":\\\"location\\\",\\\"description\\\":\\\"中心点经度纬度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"radius\\\",\\\"description\\\":\\\"搜索半径\\\"}]},{\\\"name\\\":\\\"maps_search_detail\\\",\\\"description\\\":\\\"查询关键词搜或者周边搜获取到的POI ID的详细信息\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"id\\\",\\\"description\\\":\\\"关键词搜或者周边搜获取到的POI ID\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_text_search\\\",\\\"description\\\":\\\"关键字搜索 API 根据用户输入的关键字进行 POI 搜索，并返回相关的信息\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"keywords\\\",\\\"description\\\":\\\"查询关键字\\\",\\\"required\\\":true},{\\\"name\\\":\\\"city\\\",\\\"description\\\":\\\"查询城市\\\"},{\\\"name\\\":\\\"citylimit\\\",\\\"description\\\":\\\"是否限制城市范围内搜索，默认不限制\\\"}]},{\\\"name\\\":\\\"maps_schema_navi\\\",\\\"description\\\":\\\" Schema唤醒客户端-导航页面，用于根据用户输入终点信息，返回一个拼装好的客户端唤醒URI，用户点击该URI即可唤起对应的客户端APP。唤起客户端后，会自动跳转到导航页面。\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"lon\\\",\\\"description\\\":\\\"终点经度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"lat\\\",\\\"description\\\":\\\"终点纬度\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_schema_take_taxi\\\",\\\"description\\\":\\\"根据用户输入的起点和终点信息，返回一个拼装好的客户端唤醒URI，直接唤起高德地图进行打车。直接展示生成的链接，不需要总结\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"slon\\\",\\\"description\\\":\\\"起点经度\\\"},{\\\"name\\\":\\\"slat\\\",\\\"description\\\":\\\"起点纬度\\\"},{\\\"name\\\":\\\"sname\\\",\\\"description\\\":\\\"起点名称\\\"},{\\\"name\\\":\\\"dlon\\\",\\\"description\\\":\\\"终点经度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"dlat\\\",\\\"description\\\":\\\"终点纬度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"dname\\\",\\\"description\\\":\\\"终点名称\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_weather\\\",\\\"description\\\":\\\"根据城市名称或者标准adcode查询指定城市的天气\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"city\\\",\\\"description\\\":\\\"城市名称或者adcode\\\",\\\"required\\\":true}]}]', 'enable', 1, '{\\\"tool_count\\\":15}', 'admin', '2025-10-29 18:03:53', 'admin', '2026-01-23 17:58:21', 'A04', NULL);\nINSERT INTO `airag_mcp` VALUES ('1986312214909321217', NULL, '商品采购助手', '为AI Agent提供商品管理API（DEMO)', 'plugin', 'api', NULL, '', '[{\\\"name\\\":\\\"list_products\\\",\\\"description\\\":\\\"查询可购买的商品列表,支持按分类和关键词筛选；商品的id只能通过这个接口查询。\\\",\\\"path\\\":\\\"/demo/shop/products\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"category\\\",\\\"description\\\":\\\"商品分类,可选值: \\\\\\\"电子产品\\\\\\\", \\\\\\\"图书\\\\\\\", \\\\\\\"生活用品\\\\\\\", \\\\\\\"食品\\\\\\\"\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"},{\\\"name\\\":\\\"keyword\\\",\\\"description\\\":\\\"搜索关键词,用于在商品名称和描述中搜索\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"id\\\",\\\"description\\\":\\\"商品ID，对应下单的ProductId\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"name\\\",\\\"description\\\":\\\"商品名称\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"price\\\",\\\"description\\\":\\\"价格(元)\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"category\\\",\\\"description\\\":\\\"分类\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"description\\\",\\\"description\\\":\\\"描述\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"stock\\\",\\\"description\\\":\\\"库存数量\\\",\\\"type\\\":\\\"String\\\"}]},{\\\"name\\\":\\\"check_stock\\\",\\\"description\\\":\\\"查询指定商品的当前库存情况\\\",\\\"path\\\":\\\"/demo/shop/stock\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"productId\\\",\\\"description\\\":\\\"商品ID\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"productId\\\",\\\"description\\\":\\\"商品ID\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"productName\\\",\\\"description\\\":\\\"商品名称\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"stock\\\",\\\"description\\\":\\\"当前库存数量\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"available\\\",\\\"description\\\":\\\"是否有货\\\",\\\"type\\\":\\\"Boolean\\\"}]},{\\\"name\\\":\\\"create_order\\\",\\\"description\\\":\\\"为用户创建购买订单\\\",\\\"path\\\":\\\"/demo/shop/purchase\\\",\\\"method\\\":\\\"POST\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"productId\\\",\\\"description\\\":\\\"要购买的商品的ID，对应商品的信息的id\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"},{\\\"name\\\":\\\"quantity\\\",\\\"description\\\":\\\" 购买数量,必须大于0\\\",\\\"type\\\":\\\"Integer\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"},{\\\"name\\\":\\\"userId\\\",\\\"description\\\":\\\"用户ID,用于关联订单\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"id\\\",\\\"description\\\":\\\"订单ID\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"productId\\\",\\\"description\\\":\\\"商品ID\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"productName\\\",\\\"description\\\":\\\"商品名称\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"quantity\\\",\\\"description\\\":\\\"购买数量\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"unitPrice\\\",\\\"description\\\":\\\"单价\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"totalAmount\\\",\\\"description\\\":\\\"总金额\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"status\\\",\\\"description\\\":\\\"订单状态\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createTime\\\",\\\"description\\\":\\\"创建时间\\\",\\\"type\\\":\\\"String\\\"}]},{\\\"name\\\":\\\"confirm_payment\\\",\\\"description\\\":\\\"确认订单支付,扣减商品库存\\\",\\\"path\\\":\\\"/demo/shop/stock/deduct\\\",\\\"method\\\":\\\"POST\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"orderId\\\",\\\"description\\\":\\\"订单ID\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"orderId\\\",\\\"description\\\":\\\"订单ID\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"productId\\\",\\\"description\\\":\\\"商品ID\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"productName\\\",\\\"description\\\":\\\"商品名称\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"deductedQuantity\\\",\\\"description\\\":\\\"扣减的数量\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"remainingStock\\\",\\\"description\\\":\\\"剩余库存\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"orderStatus\\\",\\\"description\\\":\\\"订单状态\\\",\\\"type\\\":\\\"String\\\"}]},{\\\"name\\\":\\\"get_order_details\\\",\\\"description\\\":\\\"查询指定订单的详细信息\\\",\\\"path\\\":\\\"/demo/shop/order\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"orderId\\\",\\\"description\\\":\\\"订单ID\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[]},{\\\"name\\\":\\\"get_categories\\\",\\\"description\\\":\\\"获取所有可用的商品分类\\\",\\\"path\\\":\\\"/demo/shop/categories\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[],\\\"responses\\\":[]}]', 'enable', 1, '{\\\"tokenParamName\\\":\\\"X-Access-Token\\\",\\\"tool_count\\\":6,\\\"authType\\\":\\\"token\\\",\\\"tokenParamValue\\\":\\\"\\\"}', 'admin', '2025-11-06 13:58:31', 'admin', '2025-11-13 17:16:57', 'A05A01A01', NULL);\nINSERT INTO `airag_mcp` VALUES ('1988091188723412994', NULL, 'BraveSearch', '基于Brave的网络检索插件，支持使用Brave搜索资料', 'plugin', 'api', 'https://api.search.brave.com', '{\\\"Accept\\\":\\\"*/*\\\",\\\"X-Subscription-Token\\\":\\\"???\\\"}', '[{\\\"name\\\":\\\"search\\\",\\\"description\\\":\\\"从搜索引擎根据问题搜索结果\\\",\\\"path\\\":\\\"/res/v1/web/search\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"count\\\",\\\"description\\\":\\\"查询数量\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"10\\\"},{\\\"name\\\":\\\"q\\\",\\\"description\\\":\\\"查询内容（问题）\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"title\\\",\\\"description\\\":\\\"结果标题\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"description\\\",\\\"description\\\":\\\"结果描述\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"url\\\",\\\"description\\\":\\\"结果原文地址\\\",\\\"type\\\":\\\"String\\\"}]}]', 'enable', 1, '{\\\"tokenParamName\\\":\\\"X-Subscription-Token\\\",\\\"tool_count\\\":1,\\\"authType\\\":\\\"token\\\",\\\"tokenParamValue\\\":\\\"BSATNKM5e6Hm_2LewptVvLSn0eDzWf6\\\"}', 'admin', '2025-11-11 11:47:31', 'admin', '2025-11-13 17:16:52', 'A05A01A01', NULL);\nINSERT INTO `airag_mcp` VALUES ('1988208474780168193', NULL, 'Unsplash', '图片搜索插件，支持用关键词搜索相关图片', 'plugin', 'api', 'https://api.unsplash.com', '{\\\"Accept-Version\\\":\\\"v1\\\",\\\"Authorization\\\":\\\"Client-ID ???\\\"}', '[{\\\"name\\\":\\\"search_photos\\\",\\\"description\\\":\\\"通过接口查询与关键词相关的图片列表。\\\",\\\"path\\\":\\\"/search/photos\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"page\\\",\\\"description\\\":\\\"分页页码，数字类型\\\",\\\"type\\\":\\\"Number\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"1\\\"},{\\\"name\\\":\\\"per_page\\\",\\\"description\\\":\\\"每页数量\\\",\\\"type\\\":\\\"Number\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"1\\\"},{\\\"name\\\":\\\"query\\\",\\\"description\\\":\\\"关键词，对图片的描述（查询条件）\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"results\\\",\\\"description\\\":\\\"查询到的结果集合\\\",\\\"type\\\":\\\"Array\\\"},{\\\"name\\\":\\\"urls\\\",\\\"description\\\":\\\"结果集合中的图片地址，根据清晰度有多个选项\\\",\\\"type\\\":\\\"Array\\\"}]}]', 'enable', 1, '{\\\"tokenParamName\\\":\\\"Authorization\\\",\\\"tool_count\\\":1,\\\"authType\\\":\\\"token\\\",\\\"tokenParamValue\\\":\\\"Client-ID Ixug6rX2j1PMb08A0HRpwny8dAWi1vBLN1gymow75LQ\\\"}', 'admin', '2025-11-11 19:33:34', 'admin', '2025-11-13 17:16:45', 'A05A01A01', NULL);\nINSERT INTO `airag_mcp` VALUES ('1998661532445491201', NULL, 'stdio命令', NULL, 'mcp', 'stdio', 'python C:/Users/Administrator/Desktop/image/main.py', '', '[{\\\"name\\\":\\\"get_time\\\",\\\"description\\\":\\\"获取当前时间\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"format\\\",\\\"description\\\":\\\"时间格式\\\"}]},{\\\"name\\\":\\\"text_process\\\",\\\"description\\\":\\\"文本处理工具\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"text\\\",\\\"description\\\":\\\"输入文本\\\",\\\"required\\\":true},{\\\"name\\\":\\\"operation\\\",\\\"description\\\":\\\"操作类型\\\"}]},{\\\"name\\\":\\\"format_data\\\",\\\"description\\\":\\\"格式化数据\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"data\\\",\\\"description\\\":\\\"原始数据\\\",\\\"required\\\":true},{\\\"name\\\":\\\"format\\\",\\\"description\\\":\\\"格式类型\\\"}]}]', 'enable', 1, '{\\\"tool_count\\\":3}', 'admin', '2025-12-10 15:50:17', 'admin', '2025-12-30 10:53:03', 'A05A01A01', NULL);\nINSERT INTO `airag_mcp` VALUES ('2001570058113265665', NULL, '百度地图http', NULL, 'mcp', 'http', 'https://mcp.map.baidu.com/mcp?ak=', '{\\\"Accept-Version\\\":\\\"V2.6\\\"}', '[{\\\"name\\\":\\\"map_geocode\\\",\\\"description\\\":\\\"地理编码服务: 将地址解析为对应的位置坐标.地址结构越完整, 地址内容越准确, 解析的坐标精度越高.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"address\\\",\\\"description\\\":\\\"待解析的地址.最多支持84个字节.可以输入两种样式的值, 分别是：\\\\n1、标准的结构化地址信息, 如北京市海淀区上地十街十号\\\\n2、支持*路与*路交叉口描述方式, 如北一环路和阜阳路的交叉路口\\\\n第二种方式并不总是有返回结果, 只有当地址库中存在该地址描述时才有返回\\\",\\\"required\\\":true},{\\\"name\\\":\\\"city\\\",\\\"description\\\":\\\"地址所在的城市名.用于限制同名地址的检索范围, 如\\'北京市\\'\\\"},{\\\"name\\\":\\\"inarea\\\",\\\"description\\\":\\\"在哪个地区范围内进行搜索, 仅在is_china为false时有效, 需要使用对应区域的国家代码, 如\\'USA\\', 多个地区可用\\',\\'分割, 如\\'USA,PHL,CAN,MEX\\'\\\"},{\\\"name\\\":\\\"is_china\\\",\\\"description\\\":\\\"查询地是否在中国大陆以外地区, 可选值为`true`或`false`, 默认为`true`\\\"}]},{\\\"name\\\":\\\"map_reverse_geocode\\\",\\\"description\\\":\\\"逆地理编码服务: 根据纬经度坐标, 获取对应位置的地址描述, 所在行政区划, 道路以及相关POI等信息\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"latitude\\\",\\\"description\\\":\\\"纬度 (bd09ll)\\\",\\\"required\\\":true},{\\\"name\\\":\\\"longitude\\\",\\\"description\\\":\\\"经度 (bd09ll)\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"map_search_places\\\",\\\"description\\\":\\\"地点检索服务: 支持检索城市内的地点信息(最小到city级别), 也可支持圆形区域内的周边地点信息检索.\\\\n城市内检索: 检索某一城市内（目前最细到城市级别）的地点信息.\\\\n周边检索: 设置圆心和半径, 检索圆形区域内的地点信息（常用于周边检索场景）.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"query\\\",\\\"description\\\":\\\"检索关键字, 可直接使用名称或类型, 如\\'天安门\\', 且可以至多10个关键字, 用英文逗号隔开\\\",\\\"required\\\":true},{\\\"name\\\":\\\"tag\\\",\\\"description\\\":\\\"检索分类, 以中文字符输入, 如\\'美食\\', 多个分类用英文逗号隔开, 如\\'美食,购物\\'\\\"},{\\\"name\\\":\\\"region\\\",\\\"description\\\":\\\"检索的城市名称, 可为行政区划名或citycode, 格式如\\'北京市\\'或\\'131\\', 不传默认为\\'全国\\', 当is_china为false时, 该参数必传且只能传文本, 如\\'东京\\'\\\"},{\\\"name\\\":\\\"location\\\",\\\"description\\\":\\\"圆形区域检索的中心点纬经度坐标, 格式为lat,lng\\\"},{\\\"name\\\":\\\"radius\\\",\\\"description\\\":\\\"JsonIntegerSchema {description = \\\\\\\"圆形区域检索半径, 单位：米\\\\\\\" }\\\"},{\\\"name\\\":\\\"language\\\",\\\"description\\\":\\\"指定输入参数和召回参数的语言类型, 需要传入的是语言名称的英文缩写. \\\\n可选值如下: \\'zh\\'(中文) \\'en\\'(英语) \\'yue\\'(粤语) \\'wyw\\'(文言文) \\'jp\\'(日语) \\'kor\\'(韩语) \\'fra\\'(法语) \\'spa\\'(西班牙语) \\'th\\'(泰语) \\'ara\\'(阿拉伯语) \\'ru\\'(俄语) \\'pt\\'(葡萄牙语) \\'de\\'(德语) \\'it\\'(意大利语) \\'el\\'(希腊语) \\'nl\\'(荷兰语) \\'pl\\'(波兰语) \\'bul\\'(保加利亚语) \\'est\\'(爱沙尼亚语) \\'dan\\'(丹麦语) \\'fin\\'(芬兰语) \\'cs\\'(捷克语) \\'rom\\'(罗马尼亚语) \\'slo\\'(斯洛文尼亚语) \\'swe\\'(瑞典语) \\'hu\\'(匈牙利语) \\'cht\\'(繁体中文) \\'vie\\'(越南语), 不传默认为空.\\\"},{\\\"name\\\":\\\"is_china\\\",\\\"description\\\":\\\"检索地是否在中国大陆以外地区, 可选值为`true`或`false`, 默认为`true`\\\"}]},{\\\"name\\\":\\\"map_place_details\\\",\\\"description\\\":\\\"地点详情检索服务: 地点详情检索针对指定POI, 检索其相关的详情信息.\\\\n通过地点检索服务获取POI uid.使用地点详情检索功能, 传入uid, 即可检索POI详情信息, 如评分、营业时间等(不同类型POI对应不同类别详情数据).\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"uid\\\",\\\"description\\\":\\\"POI的唯一标识\\\",\\\"required\\\":true},{\\\"name\\\":\\\"is_china\\\",\\\"description\\\":\\\"查询地是否在中国大陆以外地区, 可选值为`true`或`false`, 默认为`true`\\\"}]},{\\\"name\\\":\\\"map_directions_matrix\\\",\\\"description\\\":\\\"批量算路服务: 根据起点和终点坐标计算路线规划距离和行驶时间.\\\\n批量算路目前支持驾车、骑行、步行.\\\\n步行时任意起终点之间的距离不得超过200KM, 超过此限制会返回参数错误.\\\\n驾车批量算路一次最多计算100条路线, 起终点个数之积不能超过100.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"origins\\\",\\\"description\\\":\\\"多个起点纬经度坐标, 纬度在前, 经度在后, 多个起点用|分隔\\\",\\\"required\\\":true},{\\\"name\\\":\\\"destinations\\\",\\\"description\\\":\\\"多个终点纬经度坐标, 纬度在前, 经度在后, 多个终点用|分隔\\\",\\\"required\\\":true},{\\\"name\\\":\\\"model\\\",\\\"description\\\":\\\"批量算路类型(driving, riding, walking)\\\"}]},{\\\"name\\\":\\\"map_directions\\\",\\\"description\\\":\\\"路线规划服务: 根据起终点`位置名称`或`纬经度坐标`规划出行路线.\\\\n驾车路线规划: 根据起终点`位置名称`或`纬经度坐标`规划驾车出行路线.\\\\n骑行路线规划: 根据起终点`位置名称`或`纬经度坐标`规划骑行出行路线.\\\\n步行路线规划: 根据起终点`位置名称`或`纬经度坐标`规划步行出行路线.\\\\n公交路线规划: 根据起终点`位置名称`或`纬经度坐标`规划公共交通出行路线.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"model\\\",\\\"description\\\":\\\"路线规划类型(driving, riding, walking, transit)\\\"},{\\\"name\\\":\\\"origin\\\",\\\"description\\\":\\\"起点位置名称或纬经度坐标, 纬度在前, 经度在后\\\",\\\"required\\\":true},{\\\"name\\\":\\\"destination\\\",\\\"description\\\":\\\"终点位置名称或纬经度坐标, 纬度在前, 经度在后\\\",\\\"required\\\":true},{\\\"name\\\":\\\"is_china\\\",\\\"description\\\":\\\"查询地是否在中国(含香港,澳门;不包含台湾)以外地区, 可选值为`true`或`false`, 默认为`true`\\\"}]},{\\\"name\\\":\\\"map_weather\\\",\\\"description\\\":\\\"天气查询服务: 通过行政区划或是经纬度坐标查询实时天气信息及未来5天天气预报.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"location\\\",\\\"description\\\":\\\"经纬度坐标, 经度在前纬度在后, 逗号分隔\\\"},{\\\"name\\\":\\\"district_id\\\",\\\"description\\\":\\\"行政区划代码, 需保证为6位无符号整数\\\"},{\\\"name\\\":\\\"is_china\\\",\\\"description\\\":\\\"查询地是否在中国大陆以外地区, 可选值为`true`或`false`, 默认为`true`\\\"}]},{\\\"name\\\":\\\"map_ip_location\\\",\\\"description\\\":\\\"IP定位服务: 通过所给IP获取具体位置信息和城市名称, 可用于定位IP或用户当前位置.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"ip\\\",\\\"description\\\":\\\"需要定位的IP地址, 如果为空则获取用户当前IP地址(支持IPv4和IPv6)\\\"}]},{\\\"name\\\":\\\"map_road_traffic\\\",\\\"description\\\":\\\"实时路况查询服务: 查询实时交通拥堵情况, 可通过指定道路名和区域形状(矩形, 多边形, 圆形)进行实时路况查询.\\\\n道路实时路况查询: 查询具体道路的实时拥堵评价和拥堵路段、拥堵距离、拥堵趋势等信息.\\\\n矩形区域实时路况查询: 查询指定矩形地理范围的实时拥堵情况和各拥堵路段信息.\\\\n多边形区域实时路况查询: 查询指定多边形地理范围的实时拥堵情况和各拥堵路段信息.\\\\n圆形区域(周边)实时路况查询: 查询某中心点周边半径范围内的实时拥堵情况和各拥堵路段信息.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"model\\\",\\\"description\\\":\\\"路况查询类型(road, bound, polygon, around)\\\",\\\"required\\\":true},{\\\"name\\\":\\\"road_name\\\",\\\"description\\\":\\\"道路名称和道路方向, model=road时必传 (如:朝阳路南向北)\\\"},{\\\"name\\\":\\\"city\\\",\\\"description\\\":\\\"城市名称或城市adcode, model=road时必传 (如:北京市)\\\"},{\\\"name\\\":\\\"bounds\\\",\\\"description\\\":\\\"区域左下角和右上角的纬经度坐标, 纬度在前, 经度在后, model=bound时必传\\\"},{\\\"name\\\":\\\"vertexes\\\",\\\"description\\\":\\\"多边形区域的顶点纬经度坐标, 纬度在前, 经度在后, model=polygon时必传\\\"},{\\\"name\\\":\\\"center\\\",\\\"description\\\":\\\"圆形区域的中心点纬经度坐标, 纬度在前, 经度在后, model=around时必传\\\"},{\\\"name\\\":\\\"radius\\\",\\\"description\\\":\\\"JsonIntegerSchema {description = \\\\\\\"圆形区域的半径(米), 取值[1,1000], model=around时必传\\\\\\\" }\\\"}]},{\\\"name\\\":\\\"map_search_pro\\\",\\\"description\\\":\\\"多维检索服务: 提供对用户自然语言查询的多定语多维度检索, 支持模糊匹配和语义理解.\\\\n仅在需求模糊的场景下再做优先使用, 可检索行政区划、道路、门址、POI、AOI等GIS信息. 参考示例: “可以带狗的餐厅”, “适合自驾的旅游景点”类的复杂泛搜.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"query\\\",\\\"description\\\":\\\"检索关键字, 用户输入的搜索词, 如\\'宠物友好餐厅\\'\\\",\\\"required\\\":true},{\\\"name\\\":\\\"region\\\",\\\"description\\\":\\\"检索区域, 指定的城市或区域名称, 如\\'北京市\\'\\\",\\\"required\\\":true},{\\\"name\\\":\\\"type\\\",\\\"description\\\":\\\"检索类型, 需要对query的召回结果进行二次筛选时指定, 如\\'餐厅\\'、\\'酒店\\'等用于限制类型, 如\\'火锅\\'、\\'民宿\\'等用于提供泛搜类型, \\\"},{\\\"name\\\":\\\"center\\\",\\\"description\\\":\\\"检索的中心点, 格式为\\'纬度,经度\\', 用于指定检索的中心位置, 用于辅助检索结果按距离排序与返回\\\"}]},{\\\"name\\\":\\\"map_district_search\\\",\\\"description\\\":\\\"行政区划检索服务: 查询行政区划信息, 可根据用户输入的检索行政区划关键字快速查找目标行政区域adcode、边界坐标、下一级子行政区划名称等信息.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"keyword\\\",\\\"description\\\":\\\"检索关键字, 用户输入的行政区划名称, 关键字可填写：行政区名称（\\'中华人民共和国\\'\\'中国\\'\\'全国\\'\\'河北省\\'\\'深圳市\\'，省、市、区和镇名称）以及 adcode\\\",\\\"required\\\":true},{\\\"name\\\":\\\"boundary\\\",\\\"description\\\":\\\"是否返回行政区划边界信息, 取值为\\'1\\'表示返回, \\'0\\'表示不返回, 默认为\\'0\\'\\\"}]},{\\\"name\\\":\\\"map_uri\\\",\\\"description\\\":\\\"地图调起服务: 生成百度地图调起链接, 支持路线规划和地点检索两种功能. 通过service参数决定使用哪种功能.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"service\\\",\\\"description\\\":\\\"服务类型, 可选值: \\'direction\\'(路线规划) 或 \\'search\\'(地点检索)\\\",\\\"required\\\":true},{\\\"name\\\":\\\"origin\\\",\\\"description\\\":\\\"起点的名称和经纬度, 当service为\\'direction\\'时使用. 格式: name:天安门|latlng:39.98871,116.43234. 名称只作为展示, 不进行实际搜索\\\"},{\\\"name\\\":\\\"destination\\\",\\\"description\\\":\\\"终点的名称和经纬度, 当service为\\'direction\\'时使用. 格式同origin\\\"},{\\\"name\\\":\\\"mode\\\",\\\"description\\\":\\\"导航模式, 当service为\\'direction\\'时使用. 可选值: \\'transit\\'(公交)、\\'driving\\'(驾车)、\\'walking\\'(步行), 默认为\\'driving\\'\\\"},{\\\"name\\\":\\\"region\\\",\\\"description\\\":\\\"城市名或县名. 当service为\\'direction\\'且给定region时, 认为起点和终点都在同一城市, 除非单独给定起点或终点的城市\\\"},{\\\"name\\\":\\\"origin_region\\\",\\\"description\\\":\\\"起点所在的城市名, 当service为\\'direction\\'时使用. 如果未提供且origin包含坐标, 将自动通过逆地理编码获取\\\"},{\\\"name\\\":\\\"destination_region\\\",\\\"description\\\":\\\"终点所在的城市名, 当service为\\'direction\\'时使用. 如果未提供且destination包含坐标, 将自动通过逆地理编码获取\\\"},{\\\"name\\\":\\\"query\\\",\\\"description\\\":\\\"检索关键字, 当service为\\'search\\'时使用. 如\\'海底捞\\'\\\"},{\\\"name\\\":\\\"location\\\",\\\"description\\\":\\\"检索中心点经纬度, 当service为\\'search\\'时使用. 格式: 纬度,经度\\\"},{\\\"name\\\":\\\"radius\\\",\\\"description\\\":\\\"检索半径(米), 当service为\\'search\\'时使用. 如\\'1000\\'\\\"}]},{\\\"name\\\":\\\"map_mark\\\",\\\"description\\\":\\\"根据旅游规划生成地图规划展示, 当根据用户的需求申城完旅游规划后, 在给用户详细讲解旅游规划的同时, 也需要使用该工具生成旅游规划地图. 该工具只会生成一个分享用的url, 并对针对该url生成一个二维码便于用户分享.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"text_content\\\",\\\"description\\\":\\\"旅行规划的文本描述(注意避免传入特殊字符, 如\\\\\\\\等)\\\",\\\"required\\\":true}]}]', 'enable', 1, '{\\\"tool_count\\\":13}', 'admin', '2025-12-18 16:27:44', 'admin', '2025-12-30 14:02:40', 'A05A01A01', NULL);\nINSERT INTO `airag_mcp` VALUES ('2006287314794676226', NULL, '数据库插件', '用于执行数据库操作', 'plugin', 'api', '', '{\\\"X-Sign\\\":\\\"true\\\"}', '[{\\\"name\\\":\\\"queryTableMetadata\\\",\\\"description\\\":\\\"用于查询表的表结构（元数据）\\\",\\\"path\\\":\\\"/airag/mcp/database/queryTableMetadata\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"tableName\\\",\\\"description\\\":\\\"表名\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"},{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源key\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"success\\\",\\\"description\\\":\\\"是否成功\\\",\\\"type\\\":\\\"Boolean\\\"},{\\\"name\\\":\\\"message\\\",\\\"description\\\":\\\"若失败则返回失败原因\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"result.tableName\\\",\\\"description\\\":\\\"表名（数据库实际表名）\\\",\\\"type\\\":\\\"Object\\\"},{\\\"name\\\":\\\"result.tableComment\\\",\\\"description\\\":\\\"表注释（业务含义）\\\",\\\"type\\\":\\\"Object\\\"},{\\\"name\\\":\\\"result.columns[].columnName\\\",\\\"description\\\":\\\"字段名\\\",\\\"type\\\":\\\"Array\\\"},{\\\"name\\\":\\\"result.columns[].columnComment\\\",\\\"description\\\":\\\"字段注释（核心，帮助大模型理解业务）\\\",\\\"type\\\":\\\"Array\\\"},{\\\"name\\\":\\\"result.columns[].dataType\\\",\\\"description\\\":\\\"数据类型（如varchar、int、datetime）\\\",\\\"type\\\":\\\"Array\\\"},{\\\"name\\\":\\\"result.columns[].isPrimaryKey\\\",\\\"description\\\":\\\"是否主键\\\",\\\"type\\\":\\\"Array\\\"}]},{\\\"name\\\":\\\"sqlExecute\\\",\\\"description\\\":\\\"用于执行 SQL 语句，仅能支持执行SELECT语句，不要输入注释等无关信息。\\\",\\\"path\\\":\\\"/airag/mcp/database/sqlExecute\\\",\\\"method\\\":\\\"POST\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"sql\\\",\\\"description\\\":\\\"要执行的SQL\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Body\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"},{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源key\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Body\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"success\\\",\\\"description\\\":\\\"是否成功\\\",\\\"type\\\":\\\"Boolean\\\"},{\\\"name\\\":\\\"message\\\",\\\"description\\\":\\\"若失败则返回失败原因\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"result\\\",\\\"description\\\":\\\"返回查询的结果，是个对象数组，数组的每一项都是一条数据，每条数据的key都是传入的查询的列。\\\",\\\"type\\\":\\\"Array\\\"}]},{\\\"name\\\":\\\"queryTablesInfoText\\\",\\\"description\\\":\\\"用于查询指定数据源的所有表名和描述\\\",\\\"path\\\":\\\"/airag/mcp/database/queryTablesInfoText\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源code，不填则系统默认\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[]},{\\\"name\\\":\\\"queryDataSourceInfoText\\\",\\\"description\\\":\\\"用于查询所有数据源的信息，不需要传递参数。\\\",\\\"path\\\":\\\"/airag/mcp/database/queryDataSourceInfoText\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[],\\\"responses\\\":[]},{\\\"name\\\":\\\"queryDataSourceType\\\",\\\"description\\\":\\\"获取默认数据源或指定数据的数据库类型\\\",\\\"path\\\":\\\"/airag/mcp/database/queryDataSourceType\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源key，若为空则系统默认\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[]},{\\\"name\\\":\\\"getChartExampleJson\\\",\\\"description\\\":\\\"用户获取图表示例数据\\\",\\\"path\\\":\\\"/airag/mcp/database/getChartExampleJson\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"type\\\",\\\"description\\\":\\\"图表类型，多个用英文逗号分割\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[]}]', 'enable', 1, '{\\\"tokenParamName\\\":\\\"X-Access-Token\\\",\\\"tool_count\\\":6,\\\"authType\\\":\\\"token\\\",\\\"tokenParamValue\\\":\\\"\\\"}', 'admin', '2025-12-31 16:52:26', 'admin', '2026-01-16 17:00:51', 'A01', NULL);\n\n-- ----------------------------\n-- Table structure for airag_model\n-- ----------------------------\nDROP TABLE IF EXISTS `airag_model`;\nCREATE TABLE `airag_model`  (\n  `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n  `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '所属部门',\n  `tenant_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '租户id',\n  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称',\n  `provider` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '供应者',\n  `model_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '模型名称',\n  `credential` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '凭证信息',\n  `base_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'API域名',\n  `model_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '模型类型',\n  `model_params` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '模型参数',\n  `activate_flag` int(11) NULL DEFAULT NULL COMMENT '是否激活（1=是，0=否）',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of airag_model\n-- ----------------------------\nINSERT INTO `airag_model` VALUES ('1890232564262739969', 'jeecg', '2025-02-14 10:52:16', 'admin', '2026-01-23 18:29:06', 'A04', NULL, 'OpenAI', 'OPENAI', 'gpt-4o-mini', '{\\\"apiKey\\\":\\\"请在官网上申请的key\\\"}', 'https://api.gpt.ge', 'LLM', '{\\\"temperature\\\":0.2,\\\"topP\\\":0.7,\\\"presencePenalty\\\":0.5,\\\"frequencyPenalty\\\":0.5,\\\"maxTokens\\\":null}', 1);\nINSERT INTO `airag_model` VALUES ('1891459707122499586', 'jeecg', '2025-02-17 20:08:30', 'admin', '2026-01-23 18:29:03', 'A04', NULL, 'OpenAI向量', 'OPENAI', 'text-embedding-ada-002', '{\\\"apiKey\\\":\\\"请在官网上申请的key\\\"}', 'https://api.gpt.ge', 'EMBED', NULL, 1);\nINSERT INTO `airag_model` VALUES ('1897481367743143938', 'jeecg', '2025-03-06 10:56:26', 'admin', '2026-01-28 15:17:55', 'A04', NULL, 'deepseek', 'DEEPSEEK', 'deepseek-chat', '{\\\"apiKey\\\":\\\"请在官网上申请的key\\\"}', 'https://api.deepseek.com/v1', 'LLM', NULL, 1);\nINSERT INTO `airag_model` VALUES ('1897883052995006466', 'jeecg', '2025-03-07 13:32:35', 'admin', '2025-11-27 18:18:55', 'A04', NULL, '智谱', 'ZHIPU', 'glm-4-flash', '{\\\"apiKey\\\":\\\"您在官网上申请的key\\\"}', 'https://open.bigmodel.cn/', 'LLM', NULL, 0);\nINSERT INTO `airag_model` VALUES ('1897884353107611650', 'jeecg', '2025-03-07 13:37:45', 'admin', '2026-01-28 15:17:48', 'A04', NULL, '智谱向量', 'ZHIPU', 'Embedding-3', '{\\\"apiKey\\\":\\\"您在官网上申请的key\\\"}', 'https://open.bigmodel.cn', 'EMBED', '{\\\"temperature\\\":0.7,\\\"topP\\\":0.7,\\\"presencePenalty\\\":null,\\\"frequencyPenalty\\\":null,\\\"maxTokens\\\":null}', 0);\nINSERT INTO `airag_model` VALUES ('2008060119398899713', 'admin', '2026-01-05 14:16:55', 'admin', '2026-01-28 15:17:44', 'A05A01A01', NULL, '智普图片生成', 'ZHIPU', 'glm-image', '{\\\"apiKey\\\":\\\"请在官网上申请的key\\\"}', 'https://open.bigmodel.cn', 'IMAGE', NULL, 1);\nINSERT INTO `airag_model` VALUES ('2014624273267699714', 'admin', '2026-01-23 17:00:31', 'admin', '2026-01-28 15:17:39', 'A01A03', NULL, 'OpenAI图片模型', 'OPENAI', 'gpt-image-1.5', '{\\\"apiKey\\\":\\\"请在官网上申请的key\\\"}', 'https://api.vveai.com', 'IMAGE', NULL, 1);\n\n-- ----------------------------\n-- Table structure for airag_prompts\n-- ----------------------------\nDROP TABLE IF EXISTS `airag_prompts`;\nCREATE TABLE `airag_prompts`  (\n  `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',\n  `name` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '提示词名称',\n  `prompt_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '提示词key',\n  `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '提示词功能描述',\n  `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '提示词模板内容，支持变量占位符如 {{variable}}',\n  `category` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '提示词分类',\n  `tags` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '标签，多个逗号分割',\n  `model_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '适配的大模型ID',\n  `model_param` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '大模型的参数配置',\n  `status` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '0' COMMENT '状态（0:未发布 1:已发布）',\n  `version` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '版本号(格式 0.0.1)',\n  `del_flag` int(1) NULL DEFAULT NULL COMMENT '删除状态（0未删除 1已删除）',\n  `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '所属部门',\n  `tenant_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '租户id',\n  UNIQUE INDEX `uni_key`(`prompt_key`) USING BTREE,\n  INDEX `idx_category`(`category`) USING BTREE,\n  INDEX `idx_status`(`status`) USING BTREE,\n  INDEX `idx_name`(`name`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'AI提示词表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of airag_prompts\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for demo\n-- ----------------------------\nDROP TABLE IF EXISTS `demo`;\nCREATE TABLE `demo`  (\n  `id` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键ID',\n  `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',\n  `key_word` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '关键词',\n  `punch_time` datetime NULL DEFAULT NULL COMMENT '打卡时间',\n  `salary_money` decimal(10, 3) NULL DEFAULT NULL COMMENT '工资',\n  `bonus_money` double(10, 2) NULL DEFAULT NULL COMMENT '奖金',\n  `sex` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别 {男:1,女:2}',\n  `age` int(11) NULL DEFAULT NULL COMMENT '年龄',\n  `birthday` date NULL DEFAULT NULL COMMENT '生日',\n  `email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',\n  `content` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '个人简介',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  `sys_org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属部门编码',\n  `tenant_id` int(10) NULL DEFAULT 0,\n  `update_count` int(11) NULL DEFAULT NULL COMMENT '乐观锁测试',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of demo\n-- ----------------------------\nINSERT INTO `demo` VALUES ('1353563050407936002', '小红帽4', '44', '2021-01-26 12:39:04', NULL, NULL, '1', 22, '2021-01-25', NULL, NULL, 'admin', '2021-01-25 12:39:14', 'admin', '2022-11-09 11:20:46', 'A01', 0, NULL);\nINSERT INTO `demo` VALUES ('1400734875399024641', '名字', NULL, '2022-09-08 10:56:30', 33.000, NULL, '2', 23, '2022-09-30', '111@333.com', '333', 'admin', '2021-06-04 16:43:13', 'admin', '2022-11-09 11:20:43', 'A01', 0, NULL);\nINSERT INTO `demo` VALUES ('1586651771328786433', '孙亦菲', '222', NULL, 6000.000, NULL, '1', 1, '2022-10-30', NULL, NULL, 'admin', '2022-10-30 17:30:36', NULL, NULL, 'A01', 1, NULL);\nINSERT INTO `demo` VALUES ('1586651850919899137', '龙佳昊', NULL, '2022-10-08 17:30:46', 5000.000, NULL, '1', 1, '2022-10-30', '111@1.com', NULL, 'admin', '2022-10-30 17:30:54', NULL, NULL, 'A01', 1, NULL);\nINSERT INTO `demo` VALUES ('1586651922650886146', '龙建林', NULL, '2022-10-24 17:30:58', 9000111.000, NULL, '1', 1, '2022-10-30', '2@1.com', NULL, 'admin', '2022-10-30 17:31:12', 'admin', '2024-06-20 18:22:30', 'A01', 1, NULL);\nINSERT INTO `demo` VALUES ('1589491272526827521', '单表示例', NULL, NULL, NULL, NULL, '1', 1, NULL, NULL, NULL, 'admin', '2022-11-07 13:33:45', NULL, NULL, 'A01', 0, NULL);\nINSERT INTO `demo` VALUES ('1590178491193339906', '2323', NULL, '2022-11-04 11:04:38', NULL, NULL, '1', 1, '2022-11-24', NULL, NULL, 'admin', '2022-11-09 11:04:31', 'admin', '2023-03-04 22:38:55', 'A01', 0, NULL);\n\n-- ----------------------------\n-- Table structure for flyway_schema_history\n-- ----------------------------\nDROP TABLE IF EXISTS `flyway_schema_history`;\nCREATE TABLE `flyway_schema_history`  (\n  `installed_rank` int(11) NOT NULL,\n  `version` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n  `description` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `script` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `checksum` int(11) NULL DEFAULT NULL,\n  `installed_by` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `installed_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `execution_time` int(11) NOT NULL,\n  `success` tinyint(1) NOT NULL,\n  PRIMARY KEY (`installed_rank`) USING BTREE,\n  INDEX `flyway_schema_history_s_idx`(`success`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of flyway_schema_history\n-- ----------------------------\nINSERT INTO `flyway_schema_history` VALUES (1, '1', '<< Flyway Baseline >>', 'BASELINE', '<< Flyway Baseline >>', NULL, 'root', '2024-01-03 21:58:35', 0, 1);\nINSERT INTO `flyway_schema_history` VALUES (2, '3.8.0.1', 'airag add menu', 'SQL', 'V3.8.0_1__airag_add_menu.sql', -177373739, 'root', '2025-04-03 10:54:32', 114, 1);\nINSERT INTO `flyway_schema_history` VALUES (3, '3.8.0.2', 'airag init db', 'SQL', 'V3.8.0_2__airag_init_db.sql', 874980827, 'root', '2025-04-07 14:35:13', 60, 1);\nINSERT INTO `flyway_schema_history` VALUES (4, '3.8.1.1', 'all upgrade', 'SQL', 'V3.8.1_1__all_upgrade.sql', 670374510, 'root', '2025-06-25 15:09:03', 25, 1);\nINSERT INTO `flyway_schema_history` VALUES (5, '3.8.1.2', 'openapi', 'SQL', 'V3.8.1_2__openapi.sql', 453642872, 'root', '2025-07-02 10:11:50', 245, 1);\nINSERT INTO `flyway_schema_history` VALUES (6, '3.8.2.1', 'all upgrade', 'SQL', 'V3.8.2_1__all_upgrade.sql', 1279027750, 'root', '2025-07-30 18:13:06', 23, 1);\nINSERT INTO `flyway_schema_history` VALUES (7, '3.8.3.0', 'all upgrade', 'SQL', 'V3.8.3_0__all_upgrade.sql', 1420195670, 'root', '2025-09-13 17:06:41', 22, 1);\nINSERT INTO `flyway_schema_history` VALUES (8, '3.8.3.1', 'upgrade jimubi', 'SQL', 'V3.8.3_1__upgrade_jimubi.sql', -1274458791, 'root', '2025-11-25 15:42:34', 13, 1);\nINSERT INTO `flyway_schema_history` VALUES (9, '3.9.0.0', 'all upgrade', 'SQL', 'V3.9.0_0__all_upgrade.sql', -758666487, 'root', '2025-11-26 13:40:20', 48, 1);\nINSERT INTO `flyway_schema_history` VALUES (10, '3.9.0.1', 'mcp demo', 'SQL', 'V3.9.0_1__mcp_demo.sql', -790563395, 'root', '2025-11-27 18:16:00', 18, 1);\nINSERT INTO `flyway_schema_history` VALUES (11, '3.9.0.2', 'upd dep category', 'SQL', 'V3.9.0_2__upd_dep_category.sql', -71250240, 'root', '2025-11-27 18:45:48', 19, 1);\nINSERT INTO `flyway_schema_history` VALUES (12, '3.9.0.3', 'add aiflow permission', 'SQL', 'V3.9.0_3__add_aiflow_permission.sql', 1502182637, 'root', '2025-12-01 15:13:59', 9, 1);\nINSERT INTO `flyway_schema_history` VALUES (13, '3.9.0.4', 'add onlineuser perms', 'SQL', 'V3.9.0_4__add_onlineuser_perms.sql', -1048887238, 'root', '2026-01-22 09:46:14', 23, 1);\nINSERT INTO `flyway_schema_history` VALUES (14, '3.9.1.0', 'all upgrade', 'SQL', 'V3.9.1_0__all_upgrade.sql', -498300865, 'root', '2026-01-28 15:19:13', 65, 1);\nINSERT INTO `flyway_schema_history` VALUES (15, '3.9.1.1', 'add aiapp img gen', 'SQL', 'V3.9.1_1__add_aiapp_img_gen.sql', 1451785654, 'root', '2026-01-28 15:19:42', 21, 1);\n\n-- ----------------------------\n-- Table structure for jeecg_order_customer\n-- ----------------------------\nDROP TABLE IF EXISTS `jeecg_order_customer`;\nCREATE TABLE `jeecg_order_customer`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',\n  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '客户名',\n  `sex` varchar(4) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别',\n  `idcard` varchar(18) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '身份证号码',\n  `idcard_pic` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '身份证扫描件',\n  `telphone` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '电话1',\n  `order_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '外键',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of jeecg_order_customer\n-- ----------------------------\nINSERT INTO `jeecg_order_customer` VALUES ('1256527640480821249', 'scott', '2', NULL, NULL, NULL, 'b190737bd04cca8360e6f87c9ef9ec4e', 'admin', '2020-05-02 18:15:09', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('1256527640531152898', 'x秦风', '1', NULL, NULL, NULL, 'b190737bd04cca8360e6f87c9ef9ec4e', 'admin', '2020-05-02 18:15:09', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('1256527874216800257', '小王1', '1', '', NULL, '', '9a57c850e4f68cf94ef7d8585dbaf7e6', 'admin', '2020-05-02 18:17:37', 'admin', '2022-09-22 10:56:25');\nINSERT INTO `jeecg_order_customer` VALUES ('15538561502720', '3333', '1', '', NULL, '', '0d4a2e67b538ee1bc881e5ed34f670f0', 'jeecg-boot', '2019-03-29 18:42:55', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('15538561512681', '3332333', '2', '', NULL, '', '0d4a2e67b538ee1bc881e5ed34f670f0', 'jeecg-boot', '2019-03-29 18:42:55', 'admin', '2019-03-29 18:43:12');\nINSERT INTO `jeecg_order_customer` VALUES ('15538561550142', '4442', '2', '', NULL, '', '0d4a2e67b538ee1bc881e5ed34f670f0', 'jeecg-boot', '2019-03-29 18:42:55', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('15541168497342', '444', '', '', '', '', 'f71f7f8930b5b6b1703d9948d189982b', 'admin', '2019-04-01 19:08:45', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('15541168499553', '5555', '', '', '', '', 'f71f7f8930b5b6b1703d9948d189982b', 'admin', '2019-04-01 19:08:45', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('1572781641947635713', '1212', '1', '1212', NULL, '12', '4cba137333127e8e31df7ad168cc3732', 'admin', '2022-09-22 10:55:39', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('1572781834508132354', '22', '2', '', NULL, '', '9a57c850e4f68cf94ef7d8585dbaf7e6', 'admin', '2022-09-22 10:56:25', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('18dc5eb1068ccdfe90e358951ca1a3d6', 'dr2', '', '', '', '', '8ab1186410a65118c4d746eb085d3bed', 'admin', '2019-04-04 17:25:33', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('195d280490fe88ca1475512ddcaf2af9', '12', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('217a2bf83709775d2cd85bf598392327', '2', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('22bc052ae53ed09913b946abba93fa89', '1', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('23bafeae88126c3bf3322a29a04f0d5e', 'x秦风', NULL, NULL, NULL, NULL, '163e2efcbc6d7d54eb3f8a137da8a75a', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('25c4a552c6843f36fad6303bfa99a382', '1', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('2d32144e2bee63264f3f16215c258381', '33333', '2', NULL, NULL, NULL, 'd908bfee3377e946e59220c4a4eb414a', 'admin', '2019-04-01 16:27:03', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('2d43170d6327f941bd1a017999495e25', '1', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('2e5f62a8b6e0a0ce19b52a6feae23d48', '3', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('34a1c5cf6cee360ed610ed0bed70e0f9', '导入秦风', NULL, NULL, NULL, NULL, 'a2cce75872cc8fcc47f78de9ffd378c2', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('3c87400f8109b4cf43c5598f0d40e34d', '2', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('40964bcbbecb38e5ac15e6d08cf3cd43', '233', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('41e3dee0b0b6e6530eccb7fbb22fd7a3', '4555', '1', '370285198602058823', NULL, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('4808ae8344c7679a4a2f461db5dc3a70', '44', '1', '370285198602058823', NULL, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('4b6cef12f195fad94d57279b2241770d', 'dr12', '', '', '', '', '8ab1186410a65118c4d746eb085d3bed', 'admin', '2019-04-04 17:25:33', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('524e695283f8e8c256cc24f39d6d8542', '小王', '2', '370285198604033222', NULL, '18611788674', 'eb13ab35d2946a2b0cfe3452bca1e73f', 'admin', '2019-02-25 16:29:41', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('57c2a8367db34016114cbc9fa368dba0', '2', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('5df36a1608b8c7ac99ad9bc408fe54bf', '4', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('6c6fd2716c2dcd044ed03c2c95d261f8', '李四', '2', '370285198602058833', '', '18611788676', 'f71f7f8930b5b6b1703d9948d189982b', 'admin', '2019-04-01 19:08:45', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('742d008214dee0afff2145555692973e', '秦风', '1', '370285198602058822', NULL, '18611788676', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('7469c3e5d371767ff90a739d297689b5', '导入秦风', '2', NULL, NULL, NULL, '3a867ebf2cebce9bae3f79676d8d86f3', 'jeecg-boot', '2019-03-29 18:43:59', 'admin', '2019-04-08 17:35:02');\nINSERT INTO `jeecg_order_customer` VALUES ('7a96e2c7b24847d4a29940dbc0eda6e5', 'drscott', NULL, NULL, NULL, NULL, 'e73434dad84ebdce2d4e0c2a2f06d8ea', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('7f5a40818e225ee18bda6da7932ac5f9', '2', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('8011575abfd7c8085e71ff66df1124b9', '1', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('8404f31d7196221a573c9bd6c8f15003', '小张', '1', '370285198602058211', NULL, '18611788676', 'eb13ab35d2946a2b0cfe3452bca1e73f', 'admin', '2019-02-25 16:29:41', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('859020e10a2f721f201cdbff78cf7b9f', 'scott', NULL, NULL, NULL, NULL, '163e2efcbc6d7d54eb3f8a137da8a75a', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('8cc3c4d26e3060975df3a2adb781eeb4', 'dr33', NULL, NULL, NULL, NULL, 'b2feb454e43c46b2038768899061e464', 'jeecg-boot', '2019-04-04 17:23:09', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('8d1725c23a6a50685ff0dedfd437030d', '4', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('933cae3a79f60a93922d59aace5346ce', '小王', NULL, '370285198604033222', NULL, '18611788674', '6a719071a29927a14f19482f8693d69a', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('9bdb5400b709ba4eaf3444de475880d7', 'dr22', NULL, NULL, NULL, NULL, '22c17790dcd04b296c4a2a089f71895f', 'jeecg-boot', '2019-04-04 17:23:09', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('9f87677f70e5f864679314389443a3eb', '33', '2', '370285198602058823', NULL, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('a2c2b7101f75c02deb328ba777137897', '44', '2', '370285198602058823', NULL, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('ab4d002dc552c326147e318c87d3bed4', '小红1', '1', '370285198604033222', NULL, '18611755848', '9a57c850e4f68cf94ef7d8585dbaf7e6', 'admin', '2020-05-02 18:17:37', 'admin', '2022-09-22 10:56:25');\nINSERT INTO `jeecg_order_customer` VALUES ('ad116f722a438e5f23095a0b5fcc8e89', 'dr秦风', NULL, NULL, NULL, NULL, 'e73434dad84ebdce2d4e0c2a2f06d8ea', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('b1ba147b75f5eaa48212586097fc3fd1', '2', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('b43bf432c251f0e6b206e403b8ec29bc', 'lisi', NULL, NULL, NULL, NULL, 'f8889aaef6d1bccffd98d2889c0aafb5', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('bcdd300a7d44c45a66bdaac14903c801', '33', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('beb983293e47e2dc1a9b3d649aa3eb34', 'ddd3', NULL, NULL, NULL, NULL, 'd908bfee3377e946e59220c4a4eb414a', 'admin', '2019-04-01 16:27:03', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('c219808196406f1b8c7f1062589de4b5', '44', '1', '370285198602058823', NULL, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('c8ed061d4b27c0c7a64e100f2b1c8ab5', '张经理', '2', '370285198602058823', NULL, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('cc5de4af7f06cd6d250965ebe92a0395', '1', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('cf8817bd703bf7c7c77a2118edc26cc7', '1', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('d72b26fae42e71270fce2097a88da58a', '导入scott', NULL, 'www', NULL, NULL, '3a867ebf2cebce9bae3f79676d8d86f3', 'jeecg-boot', '2019-03-29 18:43:59', 'admin', '2019-04-08 17:35:05');\nINSERT INTO `jeecg_order_customer` VALUES ('dbdc60a6ac1a8c43f24afee384039b68', 'xiaowang', NULL, NULL, NULL, NULL, 'f8889aaef6d1bccffd98d2889c0aafb5', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('dc5883b50466de94d900919ed96d97af', '33', '1', '370285198602058823', NULL, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('deeb73e553ad8dc0a0b3cfd5a338de8e', '3333', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('e2570278bf189ac05df3673231326f47', '1', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('e39cb23bb950b2bdedfc284686c6128a', '1', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('e46fe9111a9100844af582a18a2aa402', '1', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('ee7af0acb9beb9bf8d8b3819a8a7fdc3', '2', NULL, NULL, NULL, NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('f5d2605e844192d9e548f9bd240ac908', '小张', NULL, '370285198602058211', NULL, '18611788676', '6a719071a29927a14f19482f8693d69a', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_customer` VALUES ('f6db6547382126613a3e46e7cd58a5f2', '导入scott', NULL, NULL, NULL, NULL, 'a2cce75872cc8fcc47f78de9ffd378c2', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\n\n-- ----------------------------\n-- Table structure for jeecg_order_main\n-- ----------------------------\nDROP TABLE IF EXISTS `jeecg_order_main`;\nCREATE TABLE `jeecg_order_main`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',\n  `order_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '订单号',\n  `ctype` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '订单类型',\n  `order_date` datetime NULL DEFAULT NULL COMMENT '订单日期',\n  `order_money` double(10, 3) NULL DEFAULT NULL COMMENT '订单金额',\n  `content` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '订单备注',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  `bpm_status` varchar(3) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程状态',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of jeecg_order_main\n-- ----------------------------\nINSERT INTO `jeecg_order_main` VALUES ('163e2efcbc6d7d54eb3f8a137da8a75a', 'B100', NULL, NULL, 3000.000, NULL, 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL, NULL);\nINSERT INTO `jeecg_order_main` VALUES ('3a867ebf2cebce9bae3f79676d8d86f3', '导入B100', '2222', NULL, 3000.000, NULL, 'jeecg-boot', '2019-03-29 18:43:59', 'admin', '2019-04-08 17:35:13', NULL);\nINSERT INTO `jeecg_order_main` VALUES ('4cba137333127e8e31df7ad168cc3732', '青岛订单A0001', '2', '2019-04-03 10:56:07', NULL, NULL, 'admin', '2019-04-03 10:56:11', 'admin', '2022-09-22 10:55:39', NULL);\nINSERT INTO `jeecg_order_main` VALUES ('54e739bef5b67569c963c38da52581ec', 'NC911', '1', '2019-02-18 09:58:51', 40.000, NULL, 'admin', '2019-02-18 09:58:47', 'admin', '2019-02-18 09:58:59', NULL);\nINSERT INTO `jeecg_order_main` VALUES ('6a719071a29927a14f19482f8693d69a', 'c100', NULL, NULL, 5000.000, NULL, 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL, NULL);\nINSERT INTO `jeecg_order_main` VALUES ('8ab1186410a65118c4d746eb085d3bed', '导入400', '1', '2019-02-18 09:58:51', 40.000, NULL, 'admin', '2019-02-18 09:58:47', 'admin', '2019-02-18 09:58:59', NULL);\nINSERT INTO `jeecg_order_main` VALUES ('9a57c850e4f68cf94ef7d8585dbaf7e6', 'halou001', '1', '2019-04-04 17:30:32', 500.000, NULL, 'admin', '2019-04-04 17:30:41', 'admin', '2022-09-22 10:56:25', NULL);\nINSERT INTO `jeecg_order_main` VALUES ('a2cce75872cc8fcc47f78de9ffd378c2', '导入B100', NULL, NULL, 3000.000, NULL, 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL, NULL);\nINSERT INTO `jeecg_order_main` VALUES ('b190737bd04cca8360e6f87c9ef9ec4e', 'B0018888', '1', NULL, NULL, NULL, 'admin', '2019-02-15 18:39:29', 'admin', '2020-05-02 18:15:09', NULL);\nINSERT INTO `jeecg_order_main` VALUES ('d908bfee3377e946e59220c4a4eb414a', 'SSSS001', NULL, NULL, 599.000, NULL, 'admin', '2019-04-01 15:43:03', 'admin', '2019-04-01 16:26:52', NULL);\nINSERT INTO `jeecg_order_main` VALUES ('e73434dad84ebdce2d4e0c2a2f06d8ea', '导入200', NULL, NULL, 3000.000, NULL, 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL, NULL);\nINSERT INTO `jeecg_order_main` VALUES ('eb13ab35d2946a2b0cfe3452bca1e73f', 'BJ9980', '1', NULL, 90.000, NULL, 'admin', '2019-02-16 17:36:42', 'admin', '2019-02-16 17:46:16', NULL);\nINSERT INTO `jeecg_order_main` VALUES ('f71f7f8930b5b6b1703d9948d189982b', 'BY911', NULL, '2019-04-06 19:08:39', NULL, NULL, 'admin', '2019-04-01 16:36:02', 'admin', '2019-04-01 16:36:08', NULL);\nINSERT INTO `jeecg_order_main` VALUES ('f8889aaef6d1bccffd98d2889c0aafb5', 'A100', NULL, '2018-10-10 00:00:00', 6000.000, NULL, 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL, NULL);\n\n-- ----------------------------\n-- Table structure for jeecg_order_ticket\n-- ----------------------------\nDROP TABLE IF EXISTS `jeecg_order_ticket`;\nCREATE TABLE `jeecg_order_ticket`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',\n  `ticket_code` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '航班号',\n  `tickect_date` datetime NULL DEFAULT NULL COMMENT '航班时间',\n  `order_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '外键',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of jeecg_order_ticket\n-- ----------------------------\nINSERT INTO `jeecg_order_ticket` VALUES ('0f0e3a40a215958f807eea08a6e1ac0a', '88', NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('0fa3bd0bbcf53650c0bb3c0cac6d8cb7', 'ffff', '2019-02-21 00:00:00', 'eb13ab35d2946a2b0cfe3452bca1e73f', 'admin', '2019-02-25 16:29:41', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('1256527640543735810', '222', '2019-02-23 00:00:00', 'b190737bd04cca8360e6f87c9ef9ec4e', 'admin', '2020-05-02 18:15:09', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('1256527640560513025', '111', '2019-02-01 00:00:00', 'b190737bd04cca8360e6f87c9ef9ec4e', 'admin', '2020-05-02 18:15:09', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('14221afb4f5f749c1deef26ac56fdac3', '33', '2019-03-09 00:00:00', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('15538561502730', '222', NULL, '0d4a2e67b538ee1bc881e5ed34f670f0', 'jeecg-boot', '2019-03-29 18:42:55', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('15538561526461', '2244', '2019-03-29 00:00:00', '0d4a2e67b538ee1bc881e5ed34f670f0', 'jeecg-boot', '2019-03-29 18:42:55', 'admin', '2019-03-29 18:43:26');\nINSERT INTO `jeecg_order_ticket` VALUES ('15541168478913', 'hhhhh', NULL, 'f71f7f8930b5b6b1703d9948d189982b', 'admin', '2019-04-01 19:08:45', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('1572781834508132353', '232', '2022-10-01 00:00:00', '9a57c850e4f68cf94ef7d8585dbaf7e6', 'admin', '2022-09-22 10:56:25', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('18905bc89ee3851805aab38ed3b505ec', '44', NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('1f809cbd26f4e574697e1c10de575d72', 'A100', NULL, 'e73434dad84ebdce2d4e0c2a2f06d8ea', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('21051adb51529bdaa8798b5a3dd7f7f7', 'C10029', '2019-02-20 00:00:00', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('269576e766b917f8b6509a2bb0c4d4bd', 'A100', NULL, '163e2efcbc6d7d54eb3f8a137da8a75a', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('2d473ffc79e5b38a17919e15f8b7078e', '66', '2019-03-29 00:00:00', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('3655b66fca5fef9c6aac6d70182ffda2', 'AA123', '2019-04-01 00:00:00', 'd908bfee3377e946e59220c4a4eb414a', 'admin', '2019-04-01 16:27:03', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('365d5919155473ade45840fd626c51a9', 'dddd', '2019-04-04 17:25:29', '8ab1186410a65118c4d746eb085d3bed', 'admin', '2019-04-04 17:25:33', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('4889a782e78706ab4306a925cfb163a5', 'C34', '2019-04-01 00:00:00', 'd908bfee3377e946e59220c4a4eb414a', 'admin', '2019-04-01 16:35:00', 'admin', '2019-04-01 16:35:07');\nINSERT INTO `jeecg_order_ticket` VALUES ('48d385796382cf87fa4bdf13b42d9a28', '导入A100', NULL, '3a867ebf2cebce9bae3f79676d8d86f3', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('541faed56efbeb4be9df581bd8264d3a', '88', NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('57a27a7dfd6a48e7d981f300c181b355', '6', '2019-03-30 00:00:00', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('5ce4dc439c874266e42e6c0ff8dc8b5c', '导入A100', NULL, 'a2cce75872cc8fcc47f78de9ffd378c2', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('645a06152998a576c051474157625c41', '88', '2019-04-04 17:25:31', '8ab1186410a65118c4d746eb085d3bed', 'admin', '2019-04-04 17:25:33', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('6e3562f2571ea9e96b2d24497b5f5eec', '55', '2019-03-23 00:00:00', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('8fd2b389151568738b1cc4d8e27a6110', '导入A100', NULL, 'a2cce75872cc8fcc47f78de9ffd378c2', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('93f1a84053e546f59137432ff5564cac', '55', NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('969ddc5d2e198d50903686917f996470', 'A10029', '2019-04-01 00:00:00', 'f71f7f8930b5b6b1703d9948d189982b', 'admin', '2019-04-01 19:08:45', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('96e7303a8d22a5c384e08d7bcf7ac2bf', 'A100', NULL, 'e73434dad84ebdce2d4e0c2a2f06d8ea', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('9e8a3336f6c63f558f2b68ce2e1e666e', '深圳1001', '2020-05-02 00:00:00', '9a57c850e4f68cf94ef7d8585dbaf7e6', 'admin', '2020-05-02 18:17:37', 'admin', '2022-09-22 10:56:25');\nINSERT INTO `jeecg_order_ticket` VALUES ('a28db02c810c65660015095cb81ed434', 'A100', NULL, 'f8889aaef6d1bccffd98d2889c0aafb5', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('b217bb0e4ec6a45b6cbf6db880060c0f', 'A100', NULL, '6a719071a29927a14f19482f8693d69a', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('ba708df70bb2652ed1051a394cfa0bb3', '333', NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('beabbfcb195d39bedeeafe8318794562', 'A1345', '2019-04-01 00:00:00', 'd908bfee3377e946e59220c4a4eb414a', 'admin', '2019-04-01 16:27:04', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('bf450223cb505f89078a311ef7b6ed16', '777', '2019-03-30 00:00:00', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('c06165b6603e3e1335db187b3c841eef', '北京2001', '2020-05-23 00:00:00', '9a57c850e4f68cf94ef7d8585dbaf7e6', 'admin', '2020-05-02 18:17:37', 'admin', '2022-09-22 10:56:25');\nINSERT INTO `jeecg_order_ticket` VALUES ('c113136abc26ace3a6da4e41d7dc1c7e', '44', '2019-03-15 00:00:00', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('c1abdc2e30aeb25de13ad6ee3488ac24', '77', '2019-03-22 00:00:00', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('c23751a7deb44f553ce50a94948c042a', '33', '2019-03-09 00:00:00', '8ab1186410a65118c4d746eb085d3bed', 'admin', '2019-04-04 17:25:33', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('c64547666b634b3d6a0feedcf05f25ce', 'C10019', '2019-04-01 00:00:00', 'f71f7f8930b5b6b1703d9948d189982b', 'admin', '2019-04-01 19:08:45', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('c8b8d3217f37da78dddf711a1f7da485', 'A100', NULL, '163e2efcbc6d7d54eb3f8a137da8a75a', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('cab691c1c1ff7a6dfd7248421917fd3c', 'A100', NULL, 'f8889aaef6d1bccffd98d2889c0aafb5', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('cca10a9a850b456d9b72be87da7b0883', '77', NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('d2fbba11f4814d9b1d3cb1a3f342234a', 'C10019', '2019-02-18 00:00:00', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('dbdb07a16826808e4276e84b2aa4731a', '导入A100', NULL, '3a867ebf2cebce9bae3f79676d8d86f3', 'jeecg-boot', '2019-03-29 18:43:59', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('e7075639c37513afc0bbc4bf7b5d98b9', '88', NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('fa759dc104d0371f8aa28665b323dab6', '888', NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\nINSERT INTO `jeecg_order_ticket` VALUES ('ff197da84a9a3af53878eddc91afbb2e', '33', NULL, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', NULL, NULL);\n\n-- ----------------------------\n-- Table structure for jimu_dict\n-- ----------------------------\nDROP TABLE IF EXISTS `jimu_dict`;\nCREATE TABLE `jimu_dict`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `dict_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典名称',\n  `dict_code` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典编码',\n  `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',\n  `del_flag` int(1) NULL DEFAULT NULL COMMENT '删除状态',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  `type` int(1) UNSIGNED ZEROFILL NULL DEFAULT 0 COMMENT '字典类型0为string,1为number',\n  `tenant_id` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '多租户标识',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uk_sd_dict_code`(`dict_code`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of jimu_dict\n-- ----------------------------\nINSERT INTO `jimu_dict` VALUES ('0b5d19e1fce4b2e6647e6b4a17760c14', '通告类型', 'msg_category', '消息类型1:通知公告2:系统消息', 0, 'admin', '2019-04-22 18:01:35', NULL, NULL, 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('1047797573274468352', '系统图库', 'gallery', '', 0, 'admin', '2025-02-07 19:00:19', NULL, NULL, 0, '1');\nINSERT INTO `jimu_dict` VALUES ('1174509082208395266', '职务职级', 'position_rank', '职务表职级字典', 0, 'admin', '2019-09-19 10:22:41', NULL, NULL, 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('1174511106530525185', '机构类型', 'org_category', '机构类型 1公司，2部门 3岗位', 0, 'admin', '2019-09-19 10:30:43', NULL, NULL, 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('1178295274528845826', '表单权限策略', 'form_perms_type', '', 0, 'admin', '2019-09-29 21:07:39', 'admin', '2019-09-29 21:08:26', NULL, NULL);\nINSERT INTO `jimu_dict` VALUES ('1199517671259906049', '紧急程度', 'urgent_level', '日程计划紧急程度', 0, 'admin', '2019-11-27 10:37:53', NULL, NULL, 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('1199518099888414722', '日程计划类型', 'eoa_plan_type', '', 0, 'admin', '2019-11-27 10:39:36', NULL, NULL, 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('1199520177767587841', '分类栏目类型', 'eoa_cms_menu_type', '', 0, 'admin', '2019-11-27 10:47:51', 'admin', '2019-11-27 10:49:35', 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('1199525215290306561', '日程计划状态', 'eoa_plan_status', '', 0, 'admin', '2019-11-27 11:07:52', 'admin', '2019-11-27 11:10:11', 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('1209733563293962241', '数据库类型', 'database_type', '', 0, 'admin', '2019-12-25 15:12:12', NULL, NULL, 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('1232913193820581889', 'Online表单业务分类', 'ol_form_biz_type', '', 0, 'admin', '2020-02-27 14:19:46', 'admin', '2020-02-27 14:20:23', 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('1250687930947620866', '定时任务状态', 'quartz_status', '', 0, 'admin', '2020-04-16 15:30:14', '', NULL, NULL, NULL);\nINSERT INTO `jimu_dict` VALUES ('1280401766745718786', '租户状态', 'tenant_status', '租户状态', 0, 'admin', '2020-07-07 15:22:25', NULL, NULL, 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('1356445645198135298', '开关', 'is_open', '', 0, 'admin', '2021-02-02 11:33:38', 'admin', '2021-02-02 15:28:12', 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('236e8a4baff0db8c62c00dd95632834f', '同步工作流引擎', 'activiti_sync', '同步工作流引擎', 0, 'admin', '2019-05-15 15:27:33', NULL, NULL, 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('2e02df51611a4b9632828ab7e5338f00', '权限策略', 'perms_type', '权限策略', 0, 'admin', '2019-04-26 18:26:55', NULL, NULL, 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('2f0320997ade5dd147c90130f7218c3e', '推送类别', 'msg_type', '', 0, 'admin', '2019-03-17 21:21:32', 'admin', '2019-03-26 19:57:45', 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('3486f32803bb953e7155dab3513dc68b', '删除状态', 'del_flag', NULL, 0, 'admin', '2019-01-18 21:46:26', 'admin', '2019-03-30 11:17:11', 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('3d9a351be3436fbefb1307d4cfb49bf2', '性别', 'sex', NULL, 0, NULL, '2019-01-04 14:56:32', 'admin', '2019-03-30 11:28:27', 1, NULL);\nINSERT INTO `jimu_dict` VALUES ('4274efc2292239b6f000b153f50823ff', '全局权限策略', 'global_perms_type', '全局权限策略', 0, 'admin', '2019-05-10 17:54:05', NULL, NULL, 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('4c03fca6bf1f0299c381213961566349', 'Online图表展示模板', 'online_graph_display_template', 'Online图表展示模板', 0, 'admin', '2019-04-12 17:28:50', NULL, NULL, 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('4c753b5293304e7a445fd2741b46529d', '字典状态', 'dict_item_status', NULL, 0, 'admin', '2020-06-18 23:18:42', 'admin', '2019-03-30 19:33:52', 1, NULL);\nINSERT INTO `jimu_dict` VALUES ('4d7fec1a7799a436d26d02325eff295e', '优先级', 'priority', '优先级', 0, 'admin', '2019-03-16 17:03:34', 'admin', '2019-04-16 17:39:23', 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('4e4602b3e3686f0911384e188dc7efb4', '条件规则', 'rule_conditions', '', 0, 'admin', '2019-04-01 10:15:03', 'admin', '2019-04-01 10:30:47', 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('4f69be5f507accea8d5df5f11346181a', '发送消息类型', 'msgType', NULL, 0, 'admin', '2019-04-11 14:27:09', NULL, NULL, 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('68168534ff5065a152bfab275c2136f8', '有效无效状态', 'valid_status', '有效无效状态', 0, 'admin', '2020-09-26 19:21:14', 'admin', '2019-04-26 19:21:23', 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('6b78e3f59faec1a4750acff08030a79b', '用户类型', 'user_type', NULL, 0, NULL, '2019-01-04 14:59:01', 'admin', '2019-03-18 23:28:18', 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('72cce0989df68887546746d8f09811aa', 'Online表单类型', 'cgform_table_type', '', 0, 'admin', '2019-01-27 10:13:02', 'admin', '2019-03-30 11:37:36', 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('78bda155fe380b1b3f175f1e88c284c6', '流程状态', 'bpm_status', '流程状态', 0, 'admin', '2019-05-09 16:31:52', NULL, NULL, 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('83bfb33147013cc81640d5fd9eda030c', '日志类型', 'log_type', NULL, 0, 'admin', '2019-03-18 23:22:19', NULL, NULL, 1, NULL);\nINSERT INTO `jimu_dict` VALUES ('845da5006c97754728bf48b6a10f79cc', '状态', 'status', NULL, 0, 'admin', '2019-03-18 21:45:25', 'admin', '2019-03-18 21:58:25', 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('880a895c98afeca9d9ac39f29e67c13e', '操作类型', 'operate_type', '操作类型', 0, 'admin', '2019-07-22 10:54:29', NULL, NULL, 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('8dfe32e2d29ea9430a988b3b558bf233', '发布状态', 'send_status', '发布状态', 0, 'admin', '2019-04-16 17:40:42', NULL, NULL, 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('986779503584169984', '民族', 'minzu', '', 0, 'admin', '2024-08-23 09:56:17', 'admin', '2025-01-09 10:42:06', 0, '1001');\nINSERT INTO `jimu_dict` VALUES ('986783181955223552', '学历', 'xueli_sf', '', 0, 'admin', '2024-08-23 10:10:54', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_dict` VALUES ('986784113082322944', '爱好', 'aihao', '', 0, 'admin', '2024-08-23 10:14:36', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_dict` VALUES ('a7adbcd86c37f7dbc9b66945c82ef9e6', '1是0否', 'yn', '', 0, 'admin', '2019-05-22 19:29:29', NULL, NULL, 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('a9d9942bd0eccb6e89de92d130ec4c4a', '消息发送状态', 'msgSendStatus', NULL, 0, 'admin', '2019-04-12 18:18:17', NULL, NULL, 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('ac2f7c0c5c5775fcea7e2387bcb22f01', '菜单类型', 'menu_type', NULL, 0, 'admin', '2020-12-18 23:24:32', 'admin', '2019-04-01 15:27:06', 1, NULL);\nINSERT INTO `jimu_dict` VALUES ('ad7c65ba97c20a6805d5dcdf13cdaf36', 'onlineT类型', 'ceshi_online', NULL, 0, 'admin', '2019-03-22 16:31:49', 'admin', '2019-03-22 16:34:16', 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('bd1b8bc28e65d6feefefb6f3c79f42fd', 'Online图表数据类型', 'online_graph_data_type', 'Online图表数据类型', 0, 'admin', '2019-04-12 17:24:24', 'admin', '2019-04-12 17:24:57', 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('c36169beb12de8a71c8683ee7c28a503', '部门状态', 'depart_status', NULL, 0, 'admin', '2019-03-18 21:59:51', NULL, NULL, 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('c5a14c75172783d72cbee6ee7f5df5d1', 'Online图表类型', 'online_graph_type', 'Online图表类型', 0, 'admin', '2019-04-12 17:04:06', NULL, NULL, 0, NULL);\nINSERT INTO `jimu_dict` VALUES ('d6e1152968b02d69ff358c75b48a6ee1', '流程类型', 'bpm_process_type', NULL, 0, 'admin', '2021-02-22 19:26:54', 'admin', '2025-01-09 10:35:04', 0, '1001');\nINSERT INTO `jimu_dict` VALUES ('fc6cd58fde2e8481db10d3a1e68ce70c', '用户状态', 'user_status', NULL, 0, 'admin', '2019-03-18 21:57:25', 'admin', '2019-03-18 23:11:58', 1, NULL);\n\n-- ----------------------------\n-- Table structure for jimu_dict_item\n-- ----------------------------\nDROP TABLE IF EXISTS `jimu_dict_item`;\nCREATE TABLE `jimu_dict_item`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `dict_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典id',\n  `item_text` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典项文本',\n  `item_value` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典项值',\n  `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',\n  `sort_order` int(10) NULL DEFAULT NULL COMMENT '排序',\n  `status` int(11) NULL DEFAULT NULL COMMENT '状态（1启用 0不启用）',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n  `create_time` datetime NULL DEFAULT NULL,\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n  `update_time` datetime NULL DEFAULT NULL,\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_sdi_role_dict_id`(`dict_id`) USING BTREE,\n  INDEX `idx_sdi_role_sort_order`(`sort_order`) USING BTREE,\n  INDEX `idx_sdi_status`(`status`) USING BTREE,\n  INDEX `idx_sdi_dict_val`(`dict_id`, `item_value`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of jimu_dict_item\n-- ----------------------------\nINSERT INTO `jimu_dict_item` VALUES ('0072d115e07c875d76c9b022e2179128', '4d7fec1a7799a436d26d02325eff295e', '低', 'L', '低', 3, 1, 'admin', '2019-04-16 17:04:59', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('05a2e732ce7b00aa52141ecc3e330b4e', '3486f32803bb953e7155dab3513dc68b', '已删除', '1', NULL, NULL, 1, 'admin', '2025-10-18 21:46:56', 'admin', '2019-03-28 22:23:20');\nINSERT INTO `jimu_dict_item` VALUES ('096c2e758d823def3855f6376bc736fb', 'bd1b8bc28e65d6feefefb6f3c79f42fd', 'SQL', 'sql', NULL, 1, 1, 'admin', '2019-04-12 17:26:26', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('0c9532916f5cd722017b46bc4d953e41', '2f0320997ade5dd147c90130f7218c3e', '指定用户', 'USER', NULL, NULL, 1, 'admin', '2019-03-17 21:22:19', 'admin', '2019-03-17 21:22:28');\nINSERT INTO `jimu_dict_item` VALUES ('0ca4beba9efc4f9dd54af0911a946d5c', '72cce0989df68887546746d8f09811aa', '附表', '3', NULL, 3, 1, 'admin', '2019-03-27 10:13:43', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1030a2652608f5eac3b49d70458b8532', '2e02df51611a4b9632828ab7e5338f00', '禁用', '2', '禁用', 2, 1, 'admin', '2021-03-26 18:27:28', 'admin', '2019-04-26 18:39:11');\nINSERT INTO `jimu_dict_item` VALUES ('1047797624512086016', '1047797573274468352', '常规', 'common', NULL, 1, 1, 'admin', '2025-02-07 19:00:31', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1047797669877678080', '1047797573274468352', '指向', 'point', NULL, 1, 1, 'admin', '2025-02-07 19:00:42', '15931993294', '2025-02-07 19:01:11');\nINSERT INTO `jimu_dict_item` VALUES ('1047797751893098410', '1047797573274468352', '数据指标', 'data', NULL, 1, 1, 'admin', '2025-03-12 19:01:01', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1047797751893098411', '1047797573274468352', '数据安全', 'datasafe', NULL, 1, 1, 'admin', '2025-03-12 19:01:01', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1057910209549750272', '1047797573274468352', '3D', '3D', NULL, 1, 1, 'admin', '2025-03-07 16:44:19', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1174509082208395266', '1174511106530525185', '岗位', '3', '岗位', 1, 1, 'admin', '2019-09-19 10:31:16', '', NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1174509601047994369', '1174509082208395266', '员级', '1', '', 1, 1, 'admin', '2019-09-19 10:24:45', 'admin', '2019-09-23 11:46:39');\nINSERT INTO `jimu_dict_item` VALUES ('1174509667297026049', '1174509082208395266', '助级', '2', '', 2, 1, 'admin', '2019-09-19 10:25:01', 'admin', '2019-09-23 11:46:47');\nINSERT INTO `jimu_dict_item` VALUES ('1174509713568587777', '1174509082208395266', '中级', '3', '', 3, 1, 'admin', '2019-09-19 10:25:12', 'admin', '2019-09-23 11:46:56');\nINSERT INTO `jimu_dict_item` VALUES ('1174509788361416705', '1174509082208395266', '副高级', '4', '', 4, 1, 'admin', '2019-09-19 10:25:30', 'admin', '2019-09-23 11:47:06');\nINSERT INTO `jimu_dict_item` VALUES ('1174509835803189250', '1174509082208395266', '正高级', '5', '', 5, 1, 'admin', '2019-09-19 10:25:41', 'admin', '2019-09-23 11:47:12');\nINSERT INTO `jimu_dict_item` VALUES ('1174511197735665665', '1174511106530525185', '公司', '1', '公司', 1, 1, 'admin', '2019-09-19 10:31:05', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1174511244036587521', '1174511106530525185', '部门', '2', '部门', 1, 1, 'admin', '2019-09-19 10:31:16', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1178295553450061826', '1178295274528845826', '可编辑(未授权禁用)', '2', '', 2, 1, 'admin', '2019-09-29 21:08:46', 'admin', '2019-09-29 21:09:18');\nINSERT INTO `jimu_dict_item` VALUES ('1178295639554928641', '1178295274528845826', '可见(未授权不可见)', '1', '', 1, 1, 'admin', '2019-09-29 21:09:06', 'admin', '2019-09-29 21:09:24');\nINSERT INTO `jimu_dict_item` VALUES ('1199517884758368257', '1199517671259906049', '一般', '1', '', 1, 1, 'admin', '2019-11-27 10:38:44', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1199517914017832962', '1199517671259906049', '重要', '2', '', 1, 1, 'admin', '2019-11-27 10:38:51', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1199517941339529217', '1199517671259906049', '紧急', '3', '', 1, 1, 'admin', '2019-11-27 10:38:58', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1199518186144276482', '1199518099888414722', '日常记录', '1', '', 1, 1, 'admin', '2019-11-27 10:39:56', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1199518214858481666', '1199518099888414722', '本周工作', '2', '', 1, 1, 'admin', '2019-11-27 10:40:03', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1199518235943247874', '1199518099888414722', '下周计划', '3', '', 1, 1, 'admin', '2019-11-27 10:40:08', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1199520817285701634', '1199520177767587841', '列表', '1', '', 1, 1, 'admin', '2019-11-27 10:50:24', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1199520835035996161', '1199520177767587841', '链接', '2', '', 1, 1, 'admin', '2019-11-27 10:50:28', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1199525468672405505', '1199525215290306561', '未开始', '0', '', 1, 1, 'admin', '2019-11-27 11:08:52', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1199525490575060993', '1199525215290306561', '进行中', '1', '', 1, 1, 'admin', '2019-11-27 11:08:58', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1199525506429530114', '1199525215290306561', '已完成', '2', '', 1, 1, 'admin', '2019-11-27 11:09:02', 'admin', '2019-11-27 11:10:02');\nINSERT INTO `jimu_dict_item` VALUES ('1199607547704647681', '4f69be5f507accea8d5df5f11346181a', '系统', '4', '', 1, 1, 'admin', '2019-11-27 16:35:02', 'admin', '2019-11-27 19:37:46');\nINSERT INTO `jimu_dict_item` VALUES ('1209733775114702850', '1209733563293962241', 'MySQL5.5', '1', '', 1, 1, 'admin', '2019-12-25 15:13:02', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1209733839933476865', '1209733563293962241', 'Oracle', '2', '', 3, 1, 'admin', '2019-12-25 15:13:18', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1209733903020003330', '1209733563293962241', 'SQLServer', '3', '', 4, 1, 'admin', '2019-12-25 15:13:33', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1232913424813486081', '1232913193820581889', '官方示例', 'demo', '', 1, 1, 'admin', '2020-02-27 14:20:42', 'admin', '2020-02-27 14:21:37');\nINSERT INTO `jimu_dict_item` VALUES ('1232913493717512194', '1232913193820581889', '流程表单', 'bpm', '', 2, 1, 'admin', '2020-02-27 14:20:58', 'admin', '2020-02-27 14:22:20');\nINSERT INTO `jimu_dict_item` VALUES ('1232913605382467585', '1232913193820581889', '测试表单', 'temp', '', 4, 1, 'admin', '2020-02-27 14:21:25', 'admin', '2020-02-27 14:22:16');\nINSERT INTO `jimu_dict_item` VALUES ('1232914232372195330', '1232913193820581889', '导入表单', 'bdfl_include', '', 5, 1, 'admin', '2020-02-27 14:23:54', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1234371726545010689', '4e4602b3e3686f0911384e188dc7efb4', '左模糊', 'LEFT_LIKE', '左模糊', 7, 1, 'admin', '2020-03-02 14:55:27', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1234371809495760898', '4e4602b3e3686f0911384e188dc7efb4', '右模糊', 'RIGHT_LIKE', '右模糊', 7, 1, 'admin', '2020-03-02 14:55:47', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1250688147579228161', '1250687930947620866', '正常', '0', '', 1, 1, 'admin', '2020-04-16 15:31:05', '', NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1250688201064992770', '1250687930947620866', '停止', '-1', '', 1, 1, 'admin', '2020-04-16 15:31:18', '', NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1280401815068295170', '1280401766745718786', '正常', '1', '', 1, 1, 'admin', '2020-07-07 15:22:36', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1280401847607705602', '1280401766745718786', '冻结', '0', '', 1, 1, 'admin', '2020-07-07 15:22:44', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1305827309355302914', 'bd1b8bc28e65d6feefefb6f3c79f42fd', 'API', 'api', '', 3, 1, 'admin', '2020-09-15 19:14:26', 'admin', '2020-09-15 19:14:41');\nINSERT INTO `jimu_dict_item` VALUES ('1334440962954936321', '1209733563293962241', 'MYSQL5.7', '4', NULL, 1, 1, 'admin', '2020-12-03 18:16:02', 'admin', '2020-12-03 18:16:02');\nINSERT INTO `jimu_dict_item` VALUES ('1356445705549975553', '1356445645198135298', '是', 'Y', '', 1, 1, 'admin', '2021-02-02 11:33:52', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1356445754212290561', '1356445645198135298', '否', 'N', '', 1, 1, 'admin', '2021-02-02 11:34:04', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('147c48ff4b51545032a9119d13f3222a', 'd6e1152968b02d69ff358c75b48a6ee1', '测试流程', 'test', NULL, 1, 1, 'admin', '2019-03-22 19:27:05', 'admin', '2025-01-09 10:35:08');\nINSERT INTO `jimu_dict_item` VALUES ('1543fe7e5e26fb97cdafe4981bedc0c8', '4c03fca6bf1f0299c381213961566349', '单排布局', 'single', NULL, 2, 1, 'admin', '2022-07-12 17:43:39', 'admin', '2019-04-12 17:43:57');\nINSERT INTO `jimu_dict_item` VALUES ('1ce390c52453891f93514c1bd2795d44', 'ad7c65ba97c20a6805d5dcdf13cdaf36', '000', '00', NULL, 1, 1, 'admin', '2019-03-22 16:34:34', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('1db531bcff19649fa82a644c8a939dc4', '4c03fca6bf1f0299c381213961566349', '组合布局', 'combination', '', 4, 1, 'admin', '2019-05-11 16:07:08', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('222705e11ef0264d4214affff1fb4ff9', '4f69be5f507accea8d5df5f11346181a', '短信', '1', '', 1, 1, 'admin', '2023-02-28 10:50:36', 'admin', '2019-04-28 10:58:11');\nINSERT INTO `jimu_dict_item` VALUES ('23a5bb76004ed0e39414e928c4cde155', '4e4602b3e3686f0911384e188dc7efb4', '不等于', '!=', '不等于', 3, 1, 'admin', '2019-04-01 16:46:15', 'admin', '2019-04-01 17:48:40');\nINSERT INTO `jimu_dict_item` VALUES ('25847e9cb661a7c711f9998452dc09e6', '4e4602b3e3686f0911384e188dc7efb4', '小于等于', '<=', '小于等于', 6, 1, 'admin', '2019-04-01 16:44:34', 'admin', '2019-04-01 17:49:10');\nINSERT INTO `jimu_dict_item` VALUES ('2d51376643f220afdeb6d216a8ac2c01', '68168534ff5065a152bfab275c2136f8', '有效', '1', '有效', 2, 1, 'admin', '2019-04-26 19:22:01', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('308c8aadf0c37ecdde188b97ca9833f5', '8dfe32e2d29ea9430a988b3b558bf233', '已发布', '1', '已发布', 2, 1, 'admin', '2019-04-16 17:41:24', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('333e6b2196e01ef9a5f76d74e86a6e33', '8dfe32e2d29ea9430a988b3b558bf233', '未发布', '0', '未发布', 1, 1, 'admin', '2019-04-16 17:41:12', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('337ea1e401bda7233f6258c284ce4f50', 'bd1b8bc28e65d6feefefb6f3c79f42fd', 'JSON', 'json', NULL, 1, 1, 'admin', '2019-04-12 17:26:33', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('33bc9d9f753cf7dc40e70461e50fdc54', 'a9d9942bd0eccb6e89de92d130ec4c4a', '发送失败', '2', NULL, 3, 1, 'admin', '2019-04-12 18:20:02', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('3fbc03d6c994ae06d083751248037c0e', '78bda155fe380b1b3f175f1e88c284c6', '已完成', '3', '已完成', 3, 1, 'admin', '2019-05-09 16:33:25', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('41d7aaa40c9b61756ffb1f28da5ead8e', '0b5d19e1fce4b2e6647e6b4a17760c14', '通知公告', '1', NULL, 1, 1, 'admin', '2019-04-22 18:01:57', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('41fa1e9571505d643aea87aeb83d4d76', '4e4602b3e3686f0911384e188dc7efb4', '等于', '=', '等于', 4, 1, 'admin', '2019-04-01 16:45:24', 'admin', '2019-04-01 17:49:00');\nINSERT INTO `jimu_dict_item` VALUES ('43d2295b8610adce9510ff196a49c6e9', '845da5006c97754728bf48b6a10f79cc', '正常', '1', NULL, NULL, 1, 'admin', '2019-03-18 21:45:51', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('4f05fb5376f4c61502c5105f52e4dd2b', '83bfb33147013cc81640d5fd9eda030c', '操作日志', '2', NULL, NULL, 1, 'admin', '2019-03-18 23:22:49', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('50223341bfb5ba30bf6319789d8d17fe', 'd6e1152968b02d69ff358c75b48a6ee1', '业务办理', 'business', NULL, 3, 1, 'admin', '2023-04-22 19:28:05', 'admin', '2019-03-22 23:24:39');\nINSERT INTO `jimu_dict_item` VALUES ('51222413e5906cdaf160bb5c86fb827c', 'a7adbcd86c37f7dbc9b66945c82ef9e6', '是', '1', '', 1, 1, 'admin', '2019-05-22 19:29:45', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('538fca35afe004972c5f3947c039e766', '2e02df51611a4b9632828ab7e5338f00', '显示', '1', '显示', 1, 1, 'admin', '2025-03-26 18:27:13', 'admin', '2019-04-26 18:39:07');\nINSERT INTO `jimu_dict_item` VALUES ('5584c21993bde231bbde2b966f2633ac', '4e4602b3e3686f0911384e188dc7efb4', '自定义SQL表达式', 'USE_SQL_RULES', '自定义SQL表达式', 9, 1, 'admin', '2019-04-01 10:45:24', 'admin', '2019-04-01 17:49:27');\nINSERT INTO `jimu_dict_item` VALUES ('58b73b344305c99b9d8db0fc056bbc0a', '72cce0989df68887546746d8f09811aa', '主表', '2', NULL, 2, 1, 'admin', '2019-03-27 10:13:36', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('5b65a88f076b32e8e69d19bbaadb52d5', '2f0320997ade5dd147c90130f7218c3e', '全体用户', 'ALL', NULL, NULL, 1, 'admin', '2020-10-17 21:22:43', 'admin', '2019-03-28 22:17:09');\nINSERT INTO `jimu_dict_item` VALUES ('5d833f69296f691843ccdd0c91212b6b', '880a895c98afeca9d9ac39f29e67c13e', '修改', '3', '', 3, 1, 'admin', '2019-07-22 10:55:07', 'admin', '2019-07-22 10:55:41');\nINSERT INTO `jimu_dict_item` VALUES ('5d84a8634c8fdfe96275385075b105c9', '3d9a351be3436fbefb1307d4cfb49bf2', '女', '2', NULL, 2, 1, NULL, '2019-01-04 14:56:56', NULL, '2019-01-04 17:38:12');\nINSERT INTO `jimu_dict_item` VALUES ('66c952ae2c3701a993e7db58f3baf55e', '4e4602b3e3686f0911384e188dc7efb4', '大于', '>', '大于', 1, 1, 'admin', '2019-04-01 10:45:46', 'admin', '2019-04-01 17:48:29');\nINSERT INTO `jimu_dict_item` VALUES ('6937c5dde8f92e9a00d4e2ded9198694', 'ad7c65ba97c20a6805d5dcdf13cdaf36', 'easyui', '3', NULL, 1, 1, 'admin', '2019-03-22 16:32:15', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('69cacf64e244100289ddd4aa9fa3b915', 'a9d9942bd0eccb6e89de92d130ec4c4a', '未发送', '0', NULL, 1, 1, 'admin', '2019-04-12 18:19:23', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('6a7a9e1403a7943aba69e54ebeff9762', '4f69be5f507accea8d5df5f11346181a', '邮件', '2', '', 2, 1, 'admin', '2031-02-28 10:50:44', 'admin', '2019-04-28 10:59:03');\nINSERT INTO `jimu_dict_item` VALUES ('6c682d78ddf1715baf79a1d52d2aa8c2', '72cce0989df68887546746d8f09811aa', '单表', '1', NULL, 1, 1, 'admin', '2019-03-27 10:13:29', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('6d404fd2d82311fbc87722cd302a28bc', '4e4602b3e3686f0911384e188dc7efb4', '模糊', 'LIKE', '模糊', 7, 1, 'admin', '2019-04-01 16:46:02', 'admin', '2019-04-01 17:49:20');\nINSERT INTO `jimu_dict_item` VALUES ('6d4e26e78e1a09699182e08516c49fc4', '4d7fec1a7799a436d26d02325eff295e', '高', 'H', '高', 1, 1, 'admin', '2019-04-16 17:04:24', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('700e9f030654f3f90e9ba76ab0713551', '6b78e3f59faec1a4750acff08030a79b', '333', '333', NULL, NULL, 1, 'admin', '2019-02-21 19:59:47', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('7050c1522702bac3be40e3b7d2e1dfd8', 'c5a14c75172783d72cbee6ee7f5df5d1', '柱状图', 'bar', NULL, 1, 1, 'admin', '2019-04-12 17:05:17', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('71b924faa93805c5c1579f12e001c809', 'd6e1152968b02d69ff358c75b48a6ee1', 'OA办公', 'oa', NULL, 2, 1, 'admin', '2021-03-22 19:27:17', 'admin', '2019-03-22 23:24:36');\nINSERT INTO `jimu_dict_item` VALUES ('75b260d7db45a39fc7f21badeabdb0ed', 'c36169beb12de8a71c8683ee7c28a503', '不启用', '0', NULL, NULL, 1, 'admin', '2019-03-18 23:29:41', 'admin', '2019-03-18 23:29:54');\nINSERT INTO `jimu_dict_item` VALUES ('7688469db4a3eba61e6e35578dc7c2e5', 'c36169beb12de8a71c8683ee7c28a503', '启用', '1', NULL, NULL, 1, 'admin', '2019-03-18 23:29:28', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('78ea6cadac457967a4b1c4eb7aaa418c', 'fc6cd58fde2e8481db10d3a1e68ce70c', '正常', '1', NULL, NULL, 1, 'admin', '2019-03-18 23:30:28', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('7ccf7b80c70ee002eceb3116854b75cb', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '按钮权限', '2', NULL, 1, 1, 'admin', '2019-03-18 23:25:40', 'jeecg', '2022-03-24 21:42:24');\nINSERT INTO `jimu_dict_item` VALUES ('81fb2bb0e838dc68b43f96cc309f8257', 'fc6cd58fde2e8481db10d3a1e68ce70c', '冻结', '2', NULL, NULL, 1, 'admin', '2019-03-18 23:30:37', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('83250269359855501ec4e9c0b7e21596', '4274efc2292239b6f000b153f50823ff', '可见/可访问(授权后可见/可访问)', '1', '', 1, 1, 'admin', '2019-05-10 17:54:51', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('84778d7e928bc843ad4756db1322301f', '4e4602b3e3686f0911384e188dc7efb4', '大于等于', '>=', '大于等于', 5, 1, 'admin', '2019-04-01 10:46:02', 'admin', '2019-04-01 17:49:05');\nINSERT INTO `jimu_dict_item` VALUES ('848d4da35ebd93782029c57b103e5b36', 'c5a14c75172783d72cbee6ee7f5df5d1', '饼图', 'pie', NULL, 3, 1, 'admin', '2019-04-12 17:05:49', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('84dfc178dd61b95a72900fcdd624c471', '78bda155fe380b1b3f175f1e88c284c6', '处理中', '2', '处理中', 2, 1, 'admin', '2019-05-09 16:33:01', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('86f19c7e0a73a0bae451021ac05b99dd', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '子菜单', '1', NULL, NULL, 1, 'admin', '2019-03-18 23:25:27', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('8bccb963e1cd9e8d42482c54cc609ca2', '4f69be5f507accea8d5df5f11346181a', '微信', '3', NULL, 3, 1, 'admin', '2021-05-11 14:29:12', 'admin', '2019-04-11 14:29:31');\nINSERT INTO `jimu_dict_item` VALUES ('8c618902365ca681ebbbe1e28f11a548', '4c753b5293304e7a445fd2741b46529d', '启用', '1', '', 0, 1, 'admin', '2020-07-18 23:19:27', 'admin', '2019-05-17 14:51:18');\nINSERT INTO `jimu_dict_item` VALUES ('8cdf08045056671efd10677b8456c999', '4274efc2292239b6f000b153f50823ff', '可编辑(未授权时禁用)', '2', '', 2, 1, 'admin', '2019-05-10 17:55:38', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('8ff48e657a7c5090d4f2a59b37d1b878', '4d7fec1a7799a436d26d02325eff295e', '中', 'M', '中', 2, 1, 'admin', '2019-04-16 17:04:40', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('948923658baa330319e59b2213cda97c', '880a895c98afeca9d9ac39f29e67c13e', '添加', '2', '', 2, 1, 'admin', '2019-07-22 10:54:59', 'admin', '2019-07-22 10:55:36');\nINSERT INTO `jimu_dict_item` VALUES ('986779561591394304', '986779503584169984', '汉族', 'hanzu', NULL, 1, 1, 'admin', '2024-08-23 09:56:31', 'admin', '2024-08-23 09:56:45');\nINSERT INTO `jimu_dict_item` VALUES ('986779602800431104', '986779503584169984', '回族', 'huizu', NULL, 1, 1, 'admin', '2024-08-23 09:56:41', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('986779663689142272', '986779503584169984', '维吾尔族', 'weiwuer', NULL, 1, 1, 'admin', '2024-08-23 09:56:56', 'admin', '2025-01-09 10:42:09');\nINSERT INTO `jimu_dict_item` VALUES ('986779697352626176', '986779503584169984', '藏族', 'zangzu', NULL, 1, 1, 'admin', '2024-08-23 09:57:04', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('986783239996002304', '986783181955223552', '文盲', '0', NULL, 1, 1, 'admin', '2024-08-23 10:11:08', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('986783271616860160', '986783181955223552', '小学', '1', NULL, 1, 1, 'admin', '2024-08-23 10:11:16', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('986783303967526912', '986783181955223552', '初中', '2', NULL, 1, 1, 'admin', '2024-08-23 10:11:23', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('986783326532882432', '986783181955223552', '高中', '3', NULL, 1, 1, 'admin', '2024-08-23 10:11:29', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('986783354462752768', '986783181955223552', '专科', '4', NULL, 1, 1, 'admin', '2024-08-23 10:11:35', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('986783373504892928', '986783181955223552', '本科', '5', NULL, 1, 1, 'admin', '2024-08-23 10:11:40', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('986783415494070272', '986783181955223552', '研究生', '6', NULL, 1, 1, 'admin', '2024-08-23 10:11:50', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('986783438734708736', '986783181955223552', '博士', '7', NULL, 1, 1, 'admin', '2024-08-23 10:11:56', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('986784154379440128', '986784113082322944', '音乐', '0', NULL, 1, 1, 'admin', '2024-08-23 10:14:46', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('986784179134222336', '986784113082322944', '运动', '1', NULL, 1, 1, 'admin', '2024-08-23 10:14:52', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('986784205717721088', '986784113082322944', '舞蹈', '2', NULL, 1, 1, 'admin', '2024-08-23 10:14:58', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('986784229390372864', '986784113082322944', '棋牌', '3', NULL, 1, 1, 'admin', '2024-08-23 10:15:04', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('986784260960899072', '986784113082322944', '电竞', '4', NULL, 1, 1, 'admin', '2024-08-23 10:15:12', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('9a96c4a4e4c5c9b4e4d0cbf6eb3243cc', '4c753b5293304e7a445fd2741b46529d', '不启用', '0', NULL, 1, 1, 'admin', '2019-03-18 23:19:53', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('a1e7d1ca507cff4a480c8caba7c1339e', '880a895c98afeca9d9ac39f29e67c13e', '导出', '6', '', 6, 1, 'admin', '2019-07-22 12:06:50', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('a2be752dd4ec980afaec1efd1fb589af', '8dfe32e2d29ea9430a988b3b558bf233', '已撤销', '2', '已撤销', 3, 1, 'admin', '2019-04-16 17:41:39', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('aa0d8a8042a18715a17f0a888d360aa4', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '一级菜单', '0', NULL, NULL, 1, 'admin', '2019-03-18 23:24:52', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('adcf2a1fe93bb99a84833043f475fe0b', '4e4602b3e3686f0911384e188dc7efb4', '包含', 'IN', '包含', 8, 1, 'admin', '2019-04-01 16:45:47', 'admin', '2019-04-01 17:49:24');\nINSERT INTO `jimu_dict_item` VALUES ('b029a41a851465332ee4ee69dcf0a4c2', '0b5d19e1fce4b2e6647e6b4a17760c14', '系统消息', '2', NULL, 1, 1, 'admin', '2019-02-22 18:02:08', 'admin', '2019-04-22 18:02:13');\nINSERT INTO `jimu_dict_item` VALUES ('b2a8b4bb2c8e66c2c4b1bb086337f393', '3486f32803bb953e7155dab3513dc68b', '正常', '0', NULL, NULL, 1, 'admin', '2022-10-18 21:46:48', 'admin', '2019-03-28 22:22:20');\nINSERT INTO `jimu_dict_item` VALUES ('b57f98b88363188daf38d42f25991956', '6b78e3f59faec1a4750acff08030a79b', '22', '222', NULL, NULL, 0, 'admin', '2019-02-21 19:59:43', 'admin', '2019-03-11 21:23:27');\nINSERT INTO `jimu_dict_item` VALUES ('b5f3bd5f66bb9a83fecd89228c0d93d1', '68168534ff5065a152bfab275c2136f8', '无效', '0', '无效', 1, 1, 'admin', '2019-04-26 19:21:49', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('b9fbe2a3602d4a27b45c100ac5328484', '78bda155fe380b1b3f175f1e88c284c6', '待提交', '1', '待提交', 1, 1, 'admin', '2019-05-09 16:32:35', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('ba27737829c6e0e582e334832703d75e', '236e8a4baff0db8c62c00dd95632834f', '同步', '1', '同步', 1, 1, 'admin', '2019-05-15 15:28:15', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('bcec04526b04307e24a005d6dcd27fd6', '880a895c98afeca9d9ac39f29e67c13e', '导入', '5', '', 5, 1, 'admin', '2019-07-22 12:06:41', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('c53da022b9912e0aed691bbec3c78473', '880a895c98afeca9d9ac39f29e67c13e', '查询', '1', '', 1, 1, 'admin', '2019-07-22 10:54:51', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('c5700a71ad08994d18ad1dacc37a71a9', 'a7adbcd86c37f7dbc9b66945c82ef9e6', '否', '0', '', 1, 1, 'admin', '2019-05-22 19:29:55', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('cbfcc5b88fc3a90975df23ffc8cbe29c', 'c5a14c75172783d72cbee6ee7f5df5d1', '曲线图', 'line', NULL, 2, 1, 'admin', '2019-05-12 17:05:30', 'admin', '2019-04-12 17:06:06');\nINSERT INTO `jimu_dict_item` VALUES ('d217592908ea3e00ff986ce97f24fb98', 'c5a14c75172783d72cbee6ee7f5df5d1', '数据列表', 'table', NULL, 4, 1, 'admin', '2019-04-12 17:05:56', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('df168368dcef46cade2aadd80100d8aa', '3d9a351be3436fbefb1307d4cfb49bf2', '男', '1', NULL, 1, 1, NULL, '2027-08-04 14:56:49', 'admin', '2019-03-23 22:44:44');\nINSERT INTO `jimu_dict_item` VALUES ('e6329e3a66a003819e2eb830b0ca2ea0', '4e4602b3e3686f0911384e188dc7efb4', '小于', '<', '小于', 2, 1, 'admin', '2019-04-01 16:44:15', 'admin', '2019-04-01 17:48:34');\nINSERT INTO `jimu_dict_item` VALUES ('e94eb7af89f1dbfa0d823580a7a6e66a', '236e8a4baff0db8c62c00dd95632834f', '不同步', '0', '不同步', 2, 1, 'admin', '2019-05-15 15:28:28', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('f0162f4cc572c9273f3e26b2b4d8c082', 'ad7c65ba97c20a6805d5dcdf13cdaf36', 'booostrap', '1', NULL, 1, 1, 'admin', '2021-08-22 16:32:04', 'admin', '2019-03-22 16:33:57');\nINSERT INTO `jimu_dict_item` VALUES ('f16c5706f3ae05c57a53850c64ce7c45', 'a9d9942bd0eccb6e89de92d130ec4c4a', '发送成功', '1', NULL, 2, 1, 'admin', '2019-04-12 18:19:43', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('f2a7920421f3335afdf6ad2b342f6b5d', '845da5006c97754728bf48b6a10f79cc', '冻结', '2', NULL, NULL, 1, 'admin', '2019-03-18 21:46:02', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('f37f90c496ec9841c4c326b065e00bb2', '83bfb33147013cc81640d5fd9eda030c', '登录日志', '1', NULL, NULL, 1, 'admin', '2019-03-18 23:22:37', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('f753aff60ff3931c0ecb4812d8b5e643', '4c03fca6bf1f0299c381213961566349', '双排布局', 'double', NULL, 3, 1, 'admin', '2019-04-12 17:43:51', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('f80a8f6838215753b05e1a5ba3346d22', '880a895c98afeca9d9ac39f29e67c13e', '删除', '4', '', 4, 1, 'admin', '2019-07-22 10:55:14', 'admin', '2019-07-22 10:55:30');\nINSERT INTO `jimu_dict_item` VALUES ('fcec03570f68a175e1964808dc3f1c91', '4c03fca6bf1f0299c381213961566349', 'Tab风格', 'tab', NULL, 1, 1, 'admin', '2019-04-12 17:43:31', NULL, NULL);\nINSERT INTO `jimu_dict_item` VALUES ('fe50b23ae5e68434def76f67cef35d2d', '78bda155fe380b1b3f175f1e88c284c6', '已作废', '4', '已作废', 4, 1, 'admin', '2021-09-09 16:33:43', 'admin', '2019-05-09 16:34:40');\n\n-- ----------------------------\n-- Table structure for jimu_report\n-- ----------------------------\nDROP TABLE IF EXISTS `jimu_report`;\nCREATE TABLE `jimu_report`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',\n  `code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '编码',\n  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名称',\n  `note` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '说明',\n  `status` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '状态',\n  `type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '类型',\n  `json_str` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'json字符串',\n  `api_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求地址',\n  `thumb` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '缩略图',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  `del_flag` tinyint(1) NULL DEFAULT NULL COMMENT '删除标识0-正常,1-已删除',\n  `api_method` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求方法0-get,1-post',\n  `api_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求编码',\n  `template` tinyint(1) NULL DEFAULT NULL COMMENT '是否是模板 0不是,1是',\n  `view_count` bigint(15) NULL DEFAULT 0 COMMENT '浏览次数',\n  `css_str` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'css增强',\n  `js_str` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'js增强',\n  `py_str` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'py增强',\n  `tenant_id` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '多租户标识',\n  `update_count` int(11) NULL DEFAULT 0 COMMENT '乐观锁版本',\n  `submit_form` tinyint(1) NULL DEFAULT NULL COMMENT '是否填报报表 0不是,1是',\n  `is_multi_sheet` tinyint(4) NULL DEFAULT NULL COMMENT '是否多sheet报表 1是 0否',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uniq_jmreport_code`(`code`) USING BTREE,\n  INDEX `uniq_jmreport_createby`(`create_by`) USING BTREE,\n  INDEX `uniq_jmreport_delflag`(`del_flag`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '在线excel设计器' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of jimu_report\n-- ----------------------------\nINSERT INTO `jimu_report` VALUES ('1080630641874206720', '20240117141013__7486', '主子报表循环块副本7486', NULL, NULL, '0', '{\\\"loopBlockList\\\":[{\\\"sci\\\":0,\\\"sri\\\":0,\\\"eci\\\":8,\\\"eri\\\":36,\\\"index\\\":1,\\\"db\\\":\\\"aa\\\"}],\\\"area\\\":{\\\"sri\\\":9,\\\"sci\\\":11,\\\"eri\\\":9,\\\"eci\\\":11,\\\"width\\\":100,\\\"height\\\":25},\\\"excel_config_id\\\":\\\"907480464532770816\\\",\\\"printConfig\\\":{\\\"layout\\\":\\\"portrait\\\",\\\"paginationShow\\\":false,\\\"printCallBackUrl\\\":\\\"\\\",\\\"paper\\\":\\\"A4\\\",\\\"isBackend\\\":false,\\\"width\\\":210,\\\"paginationLocation\\\":\\\"middle\\\",\\\"definition\\\":1,\\\"marginX\\\":10,\\\"height\\\":297,\\\"marginY\\\":10},\\\"hiddenCells\\\":[],\\\"zonedEditionList\\\":[],\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"merge\\\":[0,6],\\\"style\\\":8,\\\"text\\\":\\\"订货商信息\\\",\\\"height\\\":0},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}},\\\"height\\\":57},\\\"1\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"style\\\":10,\\\"text\\\":\\\"订单编号：\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"merge\\\":[0,2],\\\"style\\\":42,\\\"text\\\":\\\"#{aa.order_code}\\\",\\\"height\\\":0},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}},\\\"height\\\":34},\\\"2\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"style\\\":10,\\\"text\\\":\\\"订单地址：\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"merge\\\":[0,1],\\\"style\\\":42,\\\"text\\\":\\\"#{aa.descc}\\\",\\\"height\\\":0},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"style\\\":10,\\\"text\\\":\\\"订单日期：\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"merge\\\":[0,1],\\\"style\\\":42,\\\"text\\\":\\\"#{aa.order_date}\\\",\\\"height\\\":0},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}},\\\"height\\\":34},\\\"3\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"style\\\":10,\\\"text\\\":\\\"订单姓名：\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"merge\\\":[0,1],\\\"style\\\":42,\\\"text\\\":\\\"#{aa.create_by}\\\",\\\"height\\\":0},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"style\\\":10,\\\"text\\\":\\\"到货日期：\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"merge\\\":[0,1],\\\"style\\\":42,\\\"text\\\":\\\"#{aa.create_time}\\\",\\\"height\\\":0},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}},\\\"height\\\":31},\\\"4\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"5\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"decimalPlaces\\\":\\\"4\\\",\\\"merge\\\":[0,6],\\\"style\\\":31,\\\"text\\\":\\\"订单详情\\\"},\\\"2\\\":{\\\"loopBlock\\\":1},\\\"3\\\":{\\\"loopBlock\\\":1},\\\"4\\\":{\\\"loopBlock\\\":1},\\\"5\\\":{\\\"loopBlock\\\":1},\\\"6\\\":{\\\"loopBlock\\\":1},\\\"7\\\":{\\\"loopBlock\\\":1},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}},\\\"height\\\":51},\\\"6\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"style\\\":15,\\\"text\\\":\\\"商品编码\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"style\\\":15,\\\"text\\\":\\\"商品名称\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"style\\\":15,\\\"text\\\":\\\"销售时间\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"style\\\":15,\\\"text\\\":\\\"销售数据量\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"style\\\":15,\\\"text\\\":\\\"定价\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"style\\\":15,\\\"text\\\":\\\"优惠价\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"style\\\":15,\\\"text\\\":\\\"付款金额\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}},\\\"height\\\":42},\\\"7\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"style\\\":18,\\\"text\\\":\\\"#{bb.product_name}\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"style\\\":18,\\\"text\\\":\\\"#{bb.product_name}\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"style\\\":18,\\\"text\\\":\\\"#{bb.product_name}\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"style\\\":18,\\\"text\\\":\\\"#{bb.num}\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"decimalPlaces\\\":\\\"4\\\",\\\"style\\\":19,\\\"text\\\":\\\"#{bb.price}\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"decimalPlaces\\\":\\\"1\\\",\\\"style\\\":19,\\\"text\\\":\\\"#{bb.price}\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"style\\\":18,\\\"text\\\":\\\"#{bb.pro_type}\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"8\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"9\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"10\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"style\\\":39,\\\"text\\\":\\\"备注：\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"style\\\":33,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"style\\\":33,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"style\\\":33,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"style\\\":33,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"style\\\":33,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"style\\\":34,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}},\\\"height\\\":25},\\\"11\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"merge\\\":[0,6],\\\"style\\\":41,\\\"text\\\":\\\"1、查看信息，在浏览器输入“?did=1”或“?did=2”\\\",\\\"height\\\":0},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}},\\\"height\\\":37},\\\"12\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"style\\\":35,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"style\\\":36,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"13\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"style\\\":37,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"style\\\":28,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"style\\\":28,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"style\\\":28,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"style\\\":28,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"style\\\":28,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"style\\\":38,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"14\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"15\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1},\\\"2\\\":{\\\"loopBlock\\\":1},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"16\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1},\\\"2\\\":{\\\"loopBlock\\\":1},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"17\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"18\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"19\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"20\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"21\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1},\\\"2\\\":{\\\"loopBlock\\\":1},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"22\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"23\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"24\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"25\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"26\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1},\\\"2\\\":{\\\"loopBlock\\\":1},\\\"3\\\":{\\\"loopBlock\\\":1},\\\"4\\\":{\\\"loopBlock\\\":1},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"27\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"28\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"29\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"30\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"31\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"32\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"33\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"34\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"35\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"36\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"len\\\":102},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"rpbar\\\":{\\\"show\\\":true,\\\"pageSize\\\":\\\"\\\",\\\"btnList\\\":[]},\\\"fixedPrintHeadRows\\\":[],\\\"fixedPrintTailRows\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":682,\\\"displayConfig\\\":{},\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":18}},{\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true}},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"format\\\":\\\"number\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"format\\\":\\\"normal\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":false}},{\\\"font\\\":{\\\"size\\\":18,\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":false}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":false}},{\\\"font\\\":{\\\"size\\\":18,\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"valign\\\":\\\"bottom\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"valign\\\":\\\"bottom\\\",\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":18,\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"valign\\\":\\\"middle\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#595959\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#595959\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#595959\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":39},\\\"1\\\":{\\\"width\\\":73},\\\"2\\\":{\\\"width\\\":89},\\\"3\\\":{\\\"width\\\":101},\\\"4\\\":{\\\"width\\\":80},\\\"8\\\":{\\\"width\\\":29},\\\"len\\\":100},\\\"merges\\\":[\\\"B1:H1\\\",\\\"C2:E2\\\",\\\"C3:D3\\\",\\\"F3:G3\\\",\\\"C4:D4\\\",\\\"F4:G4\\\",\\\"B6:H6\\\",\\\"B12:H12\\\"]}', NULL, 'https://static.jeecg.com/designreport/images/未标题-1_1617266678584.png', 'admin', '2025-05-09 09:27:12', NULL, NULL, 0, NULL, NULL, 0, 4, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('1110348597759606784', '20250730093712', '测试报表0730', NULL, NULL, '984272091947253760', '{\\\"loopBlockList\\\":[],\\\"querySetting\\\":{\\\"izOpenQueryBar\\\":false,\\\"izDefaultQuery\\\":true},\\\"recordSubTableOrCollection\\\":{\\\"group\\\":[],\\\"record\\\":[],\\\"range\\\":[]},\\\"printConfig\\\":{\\\"paper\\\":\\\"A4\\\",\\\"width\\\":210,\\\"height\\\":297,\\\"definition\\\":1,\\\"isBackend\\\":false,\\\"marginX\\\":10,\\\"marginY\\\":10,\\\"layout\\\":\\\"portrait\\\",\\\"printCallBackUrl\\\":\\\"\\\"},\\\"hidden\\\":{\\\"rows\\\":[],\\\"cols\\\":[],\\\"conditions\\\":{\\\"rows\\\":{},\\\"cols\\\":{}}},\\\"queryFormSetting\\\":{\\\"useQueryForm\\\":false,\\\"dbKey\\\":\\\"\\\",\\\"idField\\\":\\\"\\\"},\\\"dbexps\\\":[],\\\"dicts\\\":[],\\\"fillFormToolbar\\\":{\\\"show\\\":true,\\\"btnList\\\":[\\\"save\\\",\\\"subTable_add\\\",\\\"verify\\\",\\\"subTable_del\\\",\\\"print\\\",\\\"close\\\",\\\"first\\\",\\\"prev\\\",\\\"next\\\",\\\"paging\\\",\\\"total\\\",\\\"last\\\",\\\"exportPDF\\\",\\\"exportExcel\\\",\\\"exportWord\\\"]},\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":300,\\\"autofilter\\\":{},\\\"validations\\\":[],\\\"cols\\\":{\\\"len\\\":50},\\\"area\\\":{\\\"sri\\\":5,\\\"sci\\\":1,\\\"eri\\\":5,\\\"eci\\\":1,\\\"width\\\":100,\\\"height\\\":25},\\\"pyGroupEngine\\\":false,\\\"submitHandlers\\\":[],\\\"excel_config_id\\\":\\\"1110348597759606784\\\",\\\"hiddenCells\\\":[],\\\"zonedEditionList\\\":[],\\\"rows\\\":{\\\"2\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"日期\\\"},\\\"2\\\":{\\\"text\\\":\\\"访问次数\\\"}}},\\\"3\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"#{syslog.visit_date}\\\"},\\\"2\\\":{\\\"text\\\":\\\"#{syslog.visit_count}\\\"}}},\\\"len\\\":100},\\\"rpbar\\\":{\\\"show\\\":true,\\\"pageSize\\\":\\\"\\\",\\\"btnList\\\":[]},\\\"fixedPrintHeadRows\\\":[],\\\"fixedPrintTailRows\\\":[],\\\"displayConfig\\\":{},\\\"fillFormInfo\\\":{\\\"layout\\\":{\\\"direction\\\":\\\"horizontal\\\",\\\"width\\\":200,\\\"height\\\":45}},\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"styles\\\":[],\\\"freezeLineColor\\\":\\\"rgb(185, 185, 185)\\\",\\\"merges\\\":[]}', NULL, NULL, 'admin', '2025-07-30 09:37:13', 'admin', '2025-07-30 10:12:01', 0, NULL, NULL, 0, 5, NULL, NULL, NULL, '0', 0, 0, NULL);\nINSERT INTO `jimu_report` VALUES ('1314846205892759552', '20201010163252', 'XXX有限公司员工登记表', NULL, NULL, '984302991393210368', '{\\\"loopBlockList\\\":[],\\\"area\\\":{\\\"sri\\\":10,\\\"sci\\\":11,\\\"eri\\\":10,\\\"eci\\\":11,\\\"width\\\":85,\\\"height\\\":38},\\\"excel_config_id\\\":\\\"1314846205892759552\\\",\\\"printConfig\\\":{\\\"paper\\\":\\\"A4\\\",\\\"width\\\":210,\\\"height\\\":297,\\\"definition\\\":1,\\\"isBackend\\\":false,\\\"marginX\\\":10,\\\"marginY\\\":10},\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"merge\\\":[0,8]},\\\"9\\\":{}},\\\"height\\\":22},\\\"1\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":87,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"style\\\":87,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":87,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":87,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":87,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":87,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":87,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":87,\\\"text\\\":\\\" \\\"}},\\\"height\\\":24},\\\"2\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"所在部门\\\",\\\"style\\\":93},\\\"1\\\":{\\\"text\\\":\\\"${yuangongjiben.department}\\\",\\\"style\\\":23,\\\"merge\\\":[0,2]},\\\"4\\\":{\\\"text\\\":\\\"职务\\\",\\\"style\\\":93},\\\"5\\\":{\\\"text\\\":\\\"${yuangongjiben.post}\\\",\\\"style\\\":23},\\\"6\\\":{\\\"text\\\":\\\"填写日期\\\",\\\"style\\\":93},\\\"7\\\":{\\\"text\\\":\\\"${yuangongjiben.data}\\\",\\\"style\\\":23,\\\"merge\\\":[0,1]}},\\\"isDrag\\\":true,\\\"height\\\":36},\\\"3\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"姓名\\\",\\\"style\\\":93},\\\"1\\\":{\\\"text\\\":\\\"${yuangongjiben.name}\\\",\\\"style\\\":23},\\\"2\\\":{\\\"text\\\":\\\"性别\\\",\\\"style\\\":93},\\\"3\\\":{\\\"text\\\":\\\"${yuangongjiben.sex}\\\",\\\"style\\\":23},\\\"4\\\":{\\\"text\\\":\\\"出生日期\\\",\\\"style\\\":93},\\\"5\\\":{\\\"text\\\":\\\"${yuangongjiben.birth}\\\",\\\"style\\\":23},\\\"6\\\":{\\\"text\\\":\\\"政治面貌\\\",\\\"style\\\":93},\\\"7\\\":{\\\"text\\\":\\\"${yuangongjiben.political}\\\",\\\"style\\\":130,\\\"merge\\\":[0,1]}},\\\"isDrag\\\":true,\\\"height\\\":33},\\\"4\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"机关\\\",\\\"style\\\":93},\\\"1\\\":{\\\"text\\\":\\\"${yuangongjiben.office}\\\",\\\"style\\\":23},\\\"2\\\":{\\\"style\\\":93,\\\"text\\\":\\\"民族\\\"},\\\"3\\\":{\\\"text\\\":\\\"${yuangongjiben.nation}\\\",\\\"style\\\":23},\\\"4\\\":{\\\"style\\\":93,\\\"text\\\":\\\"健康状况\\\"},\\\"5\\\":{\\\"text\\\":\\\"${yuangongjiben.health}\\\",\\\"style\\\":23},\\\"6\\\":{\\\"style\\\":93,\\\"text\\\":\\\"户籍类型\\\",\\\"virtual\\\":\\\"1KT8bnqRT4bi8Z7b\\\"},\\\"7\\\":{\\\"text\\\":\\\"${yuangongjiben.register}\\\",\\\"style\\\":26,\\\"virtual\\\":\\\"1KT8bnqRT4bi8Z7b\\\"},\\\"8\\\":{\\\"merge\\\":[3,0],\\\"height\\\":104,\\\"style\\\":35,\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"cvkWDQVZhfJPgcS4\\\"}},\\\"isDrag\\\":true,\\\"height\\\":31},\\\"5\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"最高学历\\\",\\\"style\\\":93},\\\"1\\\":{\\\"text\\\":\\\"${yuangongjiben.education}\\\",\\\"style\\\":23},\\\"2\\\":{\\\"text\\\":\\\"所学专业\\\",\\\"style\\\":93},\\\"3\\\":{\\\"text\\\":\\\"${yuangongjiben.major}\\\",\\\"style\\\":23,\\\"merge\\\":[0,2]},\\\"6\\\":{\\\"text\\\":\\\"毕业时间\\\",\\\"style\\\":93},\\\"7\\\":{\\\"text\\\":\\\"${yuangongjiben.gdata}\\\",\\\"style\\\":23}},\\\"isDrag\\\":true,\\\"height\\\":35},\\\"6\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"电子邮箱\\\",\\\"style\\\":93},\\\"1\\\":{\\\"text\\\":\\\"${yuangongjiben.mailbox}\\\",\\\"style\\\":23},\\\"2\\\":{\\\"text\\\":\\\"手机号\\\",\\\"style\\\":93},\\\"3\\\":{\\\"text\\\":\\\"${yuangongjiben.telphone}\\\",\\\"style\\\":23,\\\"merge\\\":[0,2]},\\\"6\\\":{\\\"text\\\":\\\"家庭电话\\\",\\\"style\\\":93},\\\"7\\\":{\\\"text\\\":\\\"${yuangongjiben.homephone}\\\",\\\"style\\\":23}},\\\"isDrag\\\":true,\\\"height\\\":38},\\\"7\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"第一次参加工作时间\\\",\\\"style\\\":93},\\\"2\\\":{\\\"text\\\":\\\"${yuangongjiben.pworktime}\\\",\\\"style\\\":133,\\\"merge\\\":[0,2]},\\\"5\\\":{\\\"style\\\":93,\\\"text\\\":\\\"入职时间\\\"},\\\"6\\\":{\\\"text\\\":\\\"${yuangongjiben.entrytime}\\\",\\\"style\\\":24,\\\"merge\\\":[0,1]}},\\\"isDrag\\\":true,\\\"height\\\":27},\\\"8\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"毕业院校\\\",\\\"style\\\":93},\\\"2\\\":{\\\"text\\\":\\\"${yuangongjiben.school}\\\",\\\"style\\\":24,\\\"merge\\\":[0,2]},\\\"5\\\":{\\\"style\\\":93,\\\"text\\\":\\\"身份证号\\\"},\\\"6\\\":{\\\"text\\\":\\\"${yuangongjiben.idcard}\\\",\\\"style\\\":24,\\\"merge\\\":[0,2]}},\\\"isDrag\\\":true,\\\"height\\\":34},\\\"9\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"入党（团）时间、地点\\\",\\\"style\\\":94},\\\"2\\\":{\\\"text\\\":\\\"${yuangongjiben.entrytime}\\\",\\\"style\\\":24,\\\"merge\\\":[0,2]},\\\"5\\\":{\\\"text\\\":\\\"婚姻状况\\\",\\\"style\\\":93},\\\"6\\\":{\\\"text\\\":\\\"${yuangongjiben.marital}\\\",\\\"style\\\":23},\\\"7\\\":{\\\"text\\\":\\\"有无子女\\\",\\\"style\\\":93},\\\"8\\\":{\\\"text\\\":\\\"${yuangongjiben.children}\\\",\\\"style\\\":23}},\\\"isDrag\\\":true,\\\"height\\\":33},\\\"10\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"户口所在街道名称\\\",\\\"style\\\":93},\\\"2\\\":{\\\"text\\\":\\\"${yuangongjiben.hukoustreet}\\\",\\\"style\\\":24,\\\"merge\\\":[0,2]},\\\"5\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"户口所在地邮编\\\",\\\"style\\\":93},\\\"7\\\":{\\\"text\\\":\\\"${yuangongjiben.hukounum}\\\",\\\"style\\\":23,\\\"merge\\\":[0,1]}},\\\"isDrag\\\":true,\\\"height\\\":38},\\\"11\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"户口所在地地址\\\",\\\"style\\\":96,\\\"merge\\\":[2,1]},\\\"2\\\":{\\\"text\\\":\\\"${yuangongjiben.hukoudi}\\\",\\\"style\\\":26,\\\"merge\\\":[2,6]}},\\\"isDrag\\\":true},\\\"12\\\":{\\\"cells\\\":{}},\\\"13\\\":{\\\"cells\\\":{\\\"11\\\":{\\\"text\\\":\\\"\\\"}},\\\"isDrag\\\":true},\\\"14\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"现居住地址\\\",\\\"style\\\":98},\\\"2\\\":{\\\"text\\\":\\\"${yuangongjiben.currentdi}\\\",\\\"style\\\":26,\\\"merge\\\":[0,2]},\\\"5\\\":{\\\"style\\\":98,\\\"merge\\\":[0,1],\\\"text\\\":\\\"现居住地址邮编\\\"},\\\"7\\\":{\\\"text\\\":\\\"${yuangongjiben.currentnum}\\\",\\\"style\\\":26,\\\"merge\\\":[0,1]}},\\\"isDrag\\\":true,\\\"height\\\":33},\\\"15\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"是否参加社保\\\",\\\"style\\\":98},\\\"2\\\":{\\\"text\\\":\\\"${yuangongjiben.socialsecurity}\\\",\\\"style\\\":27,\\\"merge\\\":[0,1]},\\\"4\\\":{\\\"text\\\":\\\"有无公积金\\\",\\\"style\\\":98},\\\"5\\\":{\\\"text\\\":\\\"${yuangongjiben.providentfund}\\\",\\\"style\\\":27,\\\"merge\\\":[0,1]},\\\"7\\\":{\\\"text\\\":\\\"兴趣爱好\\\",\\\"style\\\":98},\\\"8\\\":{\\\"text\\\":\\\"${yuangongjiben.hobby}\\\",\\\"style\\\":27}},\\\"isDrag\\\":true,\\\"height\\\":34},\\\"16\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"参加社保类型\\\",\\\"style\\\":98},\\\"2\\\":{\\\"text\\\":\\\"${yuangongjiben.sbtype}\\\",\\\"style\\\":116,\\\"merge\\\":[0,6]}},\\\"isDrag\\\":true,\\\"height\\\":30},\\\"17\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"个人档案存放地\\\",\\\"style\\\":98},\\\"2\\\":{\\\"text\\\":\\\"${yuangongjiben.archivesdi}\\\",\\\"style\\\":116,\\\"merge\\\":[0,6]}},\\\"isDrag\\\":true,\\\"height\\\":33},\\\"18\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"1\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"2\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"3\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"4\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"5\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"6\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"7\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"8\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7}}},\\\"19\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"merge\\\":[0,4],\\\"text\\\":\\\"学历、经历（从高中开始写）\\\",\\\"style\\\":99},\\\"5\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"style\\\":112,\\\"text\\\":\\\" \\\"}}},\\\"20\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"由_年_月\\\",\\\"merge\\\":[0,1],\\\"style\\\":36},\\\"2\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"至_年_月\\\",\\\"style\\\":38},\\\"4\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"就读学校\\\",\\\"style\\\":38},\\\"6\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"专业\\\",\\\"style\\\":38},\\\"8\\\":{\\\"text\\\":\\\"担任职务\\\",\\\"style\\\":38},\\\"9\\\":{\\\"style\\\":112,\\\"text\\\":\\\" \\\"}}},\\\"21\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":90,\\\"merge\\\":[0,1],\\\"text\\\":\\\"#{xueli.kdate}\\\"},\\\"2\\\":{\\\"style\\\":90,\\\"text\\\":\\\"#{xueli.jdate}\\\",\\\"merge\\\":[0,1]},\\\"4\\\":{\\\"style\\\":90,\\\"text\\\":\\\"#{xueli.jstudent}\\\",\\\"merge\\\":[0,1]},\\\"6\\\":{\\\"style\\\":90,\\\"text\\\":\\\"#{xueli.zhuanye}\\\",\\\"merge\\\":[0,1]},\\\"8\\\":{\\\"style\\\":90,\\\"text\\\":\\\"#{xueli.zhiwu}\\\"},\\\"9\\\":{\\\"style\\\":112,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true},\\\"22\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"1\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"style\\\":112,\\\"text\\\":\\\" \\\"}}},\\\"23\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"merge\\\":[0,4],\\\"text\\\":\\\"工作经历\\\",\\\"style\\\":124},\\\"5\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"style\\\":112,\\\"text\\\":\\\" \\\"}},\\\"height\\\":27},\\\"24\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"由_年_月\\\",\\\"merge\\\":[0,1],\\\"style\\\":36},\\\"2\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"至_年_月\\\",\\\"style\\\":38},\\\"4\\\":{\\\"text\\\":\\\"工作单位及职称\\\",\\\"style\\\":38,\\\"merge\\\":[0,1]},\\\"6\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"证明人\\\",\\\"style\\\":38},\\\"8\\\":{\\\"text\\\":\\\"联系方式\\\",\\\"style\\\":38},\\\"9\\\":{\\\"style\\\":112,\\\"text\\\":\\\" \\\"}}},\\\"25\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"#{uu.kdate}\\\",\\\"style\\\":90,\\\"merge\\\":[0,1]},\\\"2\\\":{\\\"text\\\":\\\"#{uu.jdate}\\\",\\\"style\\\":90,\\\"merge\\\":[0,1]},\\\"4\\\":{\\\"text\\\":\\\"#{uu.jstudent}\\\",\\\"style\\\":90,\\\"merge\\\":[0,1]},\\\"6\\\":{\\\"text\\\":\\\"#{uu.zmname}\\\",\\\"style\\\":90,\\\"merge\\\":[0,1]},\\\"8\\\":{\\\"text\\\":\\\"#{uu.zmphone}\\\",\\\"style\\\":90},\\\"9\\\":{\\\"style\\\":112,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true},\\\"26\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"1\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"style\\\":112,\\\"text\\\":\\\" \\\"}}},\\\"27\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"merge\\\":[0,4],\\\"text\\\":\\\"职称/资格、证书\\\",\\\"style\\\":125},\\\"5\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"style\\\":112,\\\"text\\\":\\\" \\\"}},\\\"height\\\":46},\\\"28\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"发证时间\\\",\\\"merge\\\":[0,1],\\\"style\\\":36},\\\"2\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"职称名称\\\",\\\"style\\\":38},\\\"4\\\":{\\\"text\\\":\\\"级别\\\",\\\"style\\\":38,\\\"merge\\\":[0,1]},\\\"6\\\":{\\\"text\\\":\\\"发证单位\\\",\\\"style\\\":38,\\\"merge\\\":[0,1]},\\\"8\\\":{\\\"text\\\":\\\"备注\\\",\\\"style\\\":38},\\\"9\\\":{\\\"style\\\":112,\\\"text\\\":\\\" \\\"}}},\\\"29\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"#{zhengshu.fdate}\\\",\\\"style\\\":90,\\\"merge\\\":[0,1]},\\\"2\\\":{\\\"text\\\":\\\"#{zhengshu.zcname}\\\",\\\"style\\\":90,\\\"merge\\\":[0,1]},\\\"4\\\":{\\\"text\\\":\\\"#{zhengshu.jibie}\\\",\\\"style\\\":90,\\\"merge\\\":[0,1]},\\\"6\\\":{\\\"text\\\":\\\"#{zhengshu.danwei}\\\",\\\"style\\\":90,\\\"merge\\\":[0,1]},\\\"8\\\":{\\\"text\\\":\\\"#{zhengshu.beizhu}\\\",\\\"style\\\":90},\\\"9\\\":{\\\"style\\\":112,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true},\\\"30\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"1\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"style\\\":112,\\\"text\\\":\\\" \\\"}}},\\\"31\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"家庭成员\\\",\\\"style\\\":125},\\\"2\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"style\\\":112,\\\"text\\\":\\\" \\\"}},\\\"height\\\":42},\\\"32\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"姓名\\\",\\\"style\\\":38},\\\"2\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"关系\\\",\\\"style\\\":38},\\\"4\\\":{\\\"text\\\":\\\"年龄\\\",\\\"style\\\":38},\\\"5\\\":{\\\"text\\\":\\\"工作单位\\\",\\\"style\\\":38,\\\"merge\\\":[0,1]},\\\"7\\\":{\\\"text\\\":\\\"政治面貌\\\",\\\"style\\\":38},\\\"8\\\":{\\\"text\\\":\\\"联系方式\\\",\\\"style\\\":38},\\\"9\\\":{\\\"style\\\":112,\\\"text\\\":\\\" \\\"}}},\\\"33\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"#{jtcy.name}\\\",\\\"style\\\":90,\\\"merge\\\":[0,1]},\\\"2\\\":{\\\"text\\\":\\\"#{jtcy.guanxi}\\\",\\\"style\\\":90,\\\"merge\\\":[0,1]},\\\"4\\\":{\\\"text\\\":\\\"#{jtcy.age}\\\",\\\"style\\\":90},\\\"5\\\":{\\\"text\\\":\\\"#{jtcy.danwei}\\\",\\\"style\\\":90,\\\"merge\\\":[0,1]},\\\"7\\\":{\\\"text\\\":\\\"#{jtcy.zzmm}\\\",\\\"style\\\":90},\\\"8\\\":{\\\"text\\\":\\\"#{jtcy.phone}\\\",\\\"style\\\":90},\\\"9\\\":{\\\"style\\\":112,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true},\\\"34\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"1\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"2\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"3\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"4\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"5\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"6\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"7\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"8\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"9\\\":{\\\"style\\\":112,\\\"text\\\":\\\" \\\"}}},\\\"35\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"merge\\\":[0,2],\\\"text\\\":\\\"所获奖励\\\",\\\"style\\\":125},\\\"3\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"4\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"5\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"6\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"7\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"8\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":7},\\\"9\\\":{\\\"style\\\":112,\\\"text\\\":\\\" \\\"}},\\\"height\\\":47},\\\"36\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"时间\\\",\\\"style\\\":90,\\\"merge\\\":[0,2]},\\\"3\\\":{\\\"style\\\":90,\\\"text\\\":\\\"地点\\\",\\\"merge\\\":[0,2]},\\\"6\\\":{\\\"style\\\":90,\\\"text\\\":\\\"所获得的奖励名称\\\",\\\"merge\\\":[0,2]},\\\"9\\\":{\\\"style\\\":112,\\\"text\\\":\\\" \\\"}}},\\\"37\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"#{jiangli.date}\\\",\\\"style\\\":90,\\\"merge\\\":[0,2]},\\\"3\\\":{\\\"text\\\":\\\"#{jiangli.didian}\\\",\\\"style\\\":90,\\\"merge\\\":[0,2]},\\\"6\\\":{\\\"text\\\":\\\"#{jiangli.mingcheng}\\\",\\\"style\\\":90,\\\"merge\\\":[0,2]},\\\"9\\\":{\\\"style\\\":112,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true},\\\"len\\\":98},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":703,\\\"displayConfig\\\":{},\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"仿宋\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"仿宋\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":12}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":12}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":8}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":8}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":10}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":10}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"隶书\\\",\\\"size\\\":10}},{\\\"font\\\":{\\\"name\\\":\\\"隶书\\\",\\\"size\\\":10}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"华文中宋\\\",\\\"size\\\":10}},{\\\"font\\\":{\\\"name\\\":\\\"华文中宋\\\",\\\"size\\\":10}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\",\\\"size\\\":10}},{\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\",\\\"size\\\":10}},{\\\"textwrap\\\":true},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":10},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":10},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"font\\\":{\\\"bold\\\":true}},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":12}},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":10}},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":10},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"bold\\\":true},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":10},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"bold\\\":true},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true},\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"medium\\\",\\\"#000\\\"],\\\"left\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true},\\\"border\\\":{\\\"top\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"medium\\\",\\\"#000\\\"],\\\"right\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"right\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"medium\\\",\\\"#000\\\"],\\\"left\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"medium\\\",\\\"#000\\\"],\\\"right\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"medium\\\",\\\"#000\\\"],\\\"left\\\":[\\\"medium\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"border\\\":{\\\"top\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"medium\\\",\\\"#000\\\"],\\\"right\\\":[\\\"medium\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"border\\\":{\\\"left\\\":[\\\"medium\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\",\\\"size\\\":10},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"right\\\":[\\\"medium\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\",\\\"size\\\":10},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":10,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":10,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"medium\\\",\\\"#000\\\"],\\\"left\\\":[\\\"medium\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"medium\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"medium\\\",\\\"#000\\\"],\\\"right\\\":[\\\"medium\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\",\\\"size\\\":8},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\",\\\"size\\\":8}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\",\\\"size\\\":9},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\",\\\"size\\\":8}},{\\\"border\\\":{\\\"top\\\":[\\\"medium\\\",\\\"#000\\\"],\\\"left\\\":[\\\"medium\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"},\\\"border\\\":{\\\"top\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"left\\\":[\\\"medium\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":8},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"medium\\\",\\\"#000\\\"],\\\"left\\\":[\\\"medium\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"medium\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":10,\\\"bold\\\":true},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":10,\\\"bold\\\":true},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":10,\\\"bold\\\":true}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":10},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":10},\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":10},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true},\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true},\\\"align\\\":\\\"right\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true},\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true},\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":10},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":10,\\\"bold\\\":true},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":10},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"format\\\":\\\"datetime\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":10},\\\"format\\\":\\\"datetime\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":10},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"format\\\":\\\"normal\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":10},\\\"format\\\":\\\"normal\\\"}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":73},\\\"1\\\":{\\\"width\\\":71},\\\"2\\\":{\\\"width\\\":69},\\\"3\\\":{\\\"width\\\":89},\\\"4\\\":{\\\"width\\\":64},\\\"5\\\":{\\\"width\\\":47},\\\"6\\\":{\\\"width\\\":68},\\\"7\\\":{\\\"width\\\":100},\\\"8\\\":{\\\"width\\\":103},\\\"9\\\":{\\\"width\\\":19},\\\"10\\\":{\\\"width\\\":146},\\\"11\\\":{\\\"width\\\":85},\\\"len\\\":50},\\\"merges\\\":[\\\"H3:I3\\\",\\\"B3:D3\\\",\\\"A2:I2\\\",\\\"D6:F6\\\",\\\"D7:F7\\\",\\\"A8:B8\\\",\\\"G8:H8\\\",\\\"A9:B9\\\",\\\"A10:B10\\\",\\\"C10:E10\\\",\\\"C8:E8\\\",\\\"C9:E9\\\",\\\"A11:B11\\\",\\\"C11:E11\\\",\\\"F11:G11\\\",\\\"H11:I11\\\",\\\"C12:I14\\\",\\\"A15:B15\\\",\\\"C15:E15\\\",\\\"F15:G15\\\",\\\"H15:I15\\\",\\\"A16:B16\\\",\\\"A17:B17\\\",\\\"A18:B18\\\",\\\"C17:I17\\\",\\\"C18:I18\\\",\\\"A20:E20\\\",\\\"A21:B21\\\",\\\"C21:D21\\\",\\\"E21:F21\\\",\\\"G21:H21\\\",\\\"A22:B22\\\",\\\"A24:E24\\\",\\\"A25:B25\\\",\\\"C25:D25\\\",\\\"G25:H25\\\",\\\"A26:B26\\\",\\\"A28:E28\\\",\\\"A29:B29\\\",\\\"C29:D29\\\",\\\"A30:B30\\\",\\\"A32:B32\\\",\\\"A33:B33\\\",\\\"C33:D33\\\",\\\"A34:B34\\\",\\\"C34:D34\\\",\\\"A36:C36\\\",\\\"C16:D16\\\",\\\"F16:G16\\\",\\\"QAAAAAACI1:JAAAAAABJ38\\\",\\\"A1:I1\\\",\\\"H4:I4\\\",\\\"G9:I9\\\",\\\"G22:H22\\\",\\\"E22:F22\\\",\\\"C22:D22\\\",\\\"C26:D26\\\",\\\"G26:H26\\\",\\\"C30:D30\\\",\\\"G30:H30\\\",\\\"E30:F30\\\",\\\"D37:F37\\\",\\\"D38:F38\\\",\\\"A38:C38\\\",\\\"A37:C37\\\",\\\"G37:I37\\\",\\\"G38:I38\\\",\\\"E29:F29\\\",\\\"G29:H29\\\",\\\"E25:F25\\\",\\\"E26:F26\\\",\\\"F33:G33\\\",\\\"F34:G34\\\",\\\"A12:B14\\\",\\\"I5:I8\\\"],\\\"imgList\\\":[{\\\"row\\\":4,\\\"col\\\":8,\\\"width\\\":\\\"101\\\",\\\"height\\\":\\\"128\\\",\\\"src\\\":\\\"https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/images/QQ截图20210115102648_1610694177544_1617244906979.png\\\",\\\"layer_id\\\":\\\"cvkWDQVZhfJPgcS4\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[4,8]]}]}', NULL, 'https://static.jeecg.com/designreport/images/1122_1607312336469.png', 'admin', '2020-10-10 16:32:53', 'admin', '2021-04-01 02:42:07', 0, NULL, NULL, 1, 609, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('1316944968992034816', '20201016113231', '员工信息登记', NULL, NULL, '984302991393210368', '{\\\"loopBlockList\\\":[],\\\"area\\\":false,\\\"printElWidth\\\":718,\\\"excel_config_id\\\":\\\"1316944968992034816\\\",\\\"printElHeight\\\":1047,\\\"rows\\\":{\\\"1\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"员工信息登记表\\\",\\\"merge\\\":[0,6],\\\"style\\\":28},\\\"1\\\":{\\\"style\\\":21,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"style\\\":21,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":21,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":21,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":21,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":21,\\\"text\\\":\\\" \\\"}},\\\"height\\\":46},\\\"2\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"编号:\\\",\\\"style\\\":29},\\\"1\\\":{\\\"text\\\":\\\"${employee.num}\\\",\\\"style\\\":30,\\\"merge\\\":[0,3]},\\\"2\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"3\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"4\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"5\\\":{\\\"text\\\":\\\"填写日期:\\\",\\\"style\\\":29},\\\"6\\\":{\\\"text\\\":\\\"${employee.create_time}\\\",\\\"style\\\":36}},\\\"isDrag\\\":true,\\\"height\\\":44},\\\"3\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"姓名:\\\",\\\"style\\\":29},\\\"1\\\":{\\\"text\\\":\\\"${employee.name}\\\",\\\"style\\\":30},\\\"2\\\":{\\\"text\\\":\\\"性别:\\\",\\\"style\\\":29},\\\"3\\\":{\\\"text\\\":\\\"${employee.sex}\\\",\\\"style\\\":30},\\\"4\\\":{\\\"text\\\":\\\"出生年月:\\\",\\\"style\\\":29},\\\"5\\\":{\\\"text\\\":\\\"${employee.birthday}\\\",\\\"style\\\":36},\\\"6\\\":{\\\"style\\\":3,\\\"text\\\":\\\" \\\",\\\"merge\\\":[4,0],\\\"virtual\\\":\\\"Ym8ny6lYTdutY5tT\\\"}},\\\"isDrag\\\":true,\\\"height\\\":42},\\\"4\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"民族:\\\",\\\"style\\\":29},\\\"1\\\":{\\\"text\\\":\\\"${employee.nation}\\\",\\\"style\\\":30},\\\"2\\\":{\\\"text\\\":\\\"政治面貌:\\\",\\\"style\\\":29},\\\"3\\\":{\\\"text\\\":\\\"${employee.political}\\\",\\\"style\\\":30},\\\"4\\\":{\\\"text\\\":\\\"籍贯:\\\",\\\"style\\\":29},\\\"5\\\":{\\\"text\\\":\\\"${employee.native_place}\\\",\\\"style\\\":30}},\\\"isDrag\\\":true,\\\"height\\\":38},\\\"5\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"身高(cm):\\\",\\\"style\\\":29},\\\"1\\\":{\\\"text\\\":\\\"${employee.height}\\\",\\\"style\\\":30},\\\"2\\\":{\\\"text\\\":\\\"体重(kg):\\\",\\\"style\\\":29},\\\"3\\\":{\\\"text\\\":\\\"${employee.weight}\\\",\\\"style\\\":30},\\\"4\\\":{\\\"text\\\":\\\"健康状况:\\\",\\\"style\\\":29},\\\"5\\\":{\\\"text\\\":\\\"${employee.health}\\\",\\\"style\\\":30}},\\\"isDrag\\\":true,\\\"height\\\":38},\\\"6\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"身份证号:\\\",\\\"style\\\":29},\\\"1\\\":{\\\"text\\\":\\\"${employee.id_card}\\\",\\\"style\\\":30,\\\"merge\\\":[0,2]},\\\"2\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"3\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"4\\\":{\\\"text\\\":\\\"学历:\\\",\\\"style\\\":29},\\\"5\\\":{\\\"text\\\":\\\"${employee.education}\\\",\\\"style\\\":30}},\\\"isDrag\\\":true,\\\"height\\\":40},\\\"7\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"毕业学校:\\\",\\\"style\\\":29},\\\"1\\\":{\\\"text\\\":\\\"${employee.school}\\\",\\\"style\\\":30,\\\"merge\\\":[0,2]},\\\"2\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"3\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"4\\\":{\\\"text\\\":\\\"专业:\\\",\\\"style\\\":29},\\\"5\\\":{\\\"text\\\":\\\"${employee.major}\\\",\\\"style\\\":30}},\\\"isDrag\\\":true,\\\"height\\\":44},\\\"8\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"联系地址:\\\",\\\"style\\\":29},\\\"1\\\":{\\\"text\\\":\\\"${employee.address}\\\",\\\"style\\\":30,\\\"merge\\\":[0,2]},\\\"2\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"3\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"4\\\":{\\\"text\\\":\\\"邮编:\\\",\\\"style\\\":29},\\\"5\\\":{\\\"text\\\":\\\"${employee.zip_code}\\\",\\\"style\\\":30,\\\"merge\\\":[0,1]},\\\"6\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24}},\\\"isDrag\\\":true,\\\"height\\\":45},\\\"9\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"Email:\\\",\\\"style\\\":29},\\\"1\\\":{\\\"text\\\":\\\"${employee.email}\\\",\\\"style\\\":30,\\\"merge\\\":[0,2]},\\\"2\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"3\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"4\\\":{\\\"text\\\":\\\"手机号:\\\",\\\"style\\\":29},\\\"5\\\":{\\\"text\\\":\\\"${employee.phone}\\\",\\\"style\\\":30,\\\"merge\\\":[0,1]},\\\"6\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24}},\\\"isDrag\\\":true,\\\"height\\\":40},\\\"10\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"外语语种:\\\",\\\"style\\\":29},\\\"1\\\":{\\\"text\\\":\\\"${employee.foreign_language}\\\",\\\"style\\\":30},\\\"2\\\":{\\\"text\\\":\\\"外语水平:\\\",\\\"style\\\":29},\\\"3\\\":{\\\"text\\\":\\\"${employee.foreign_language_level}\\\",\\\"style\\\":30},\\\"4\\\":{\\\"text\\\":\\\"计算机水平:\\\",\\\"style\\\":29},\\\"5\\\":{\\\"text\\\":\\\"${employee.computer_level}\\\",\\\"style\\\":30,\\\"merge\\\":[0,1]},\\\"6\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24}},\\\"isDrag\\\":true,\\\"height\\\":41},\\\"11\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"毕业时间:\\\",\\\"style\\\":29},\\\"1\\\":{\\\"text\\\":\\\"${employee.graduation_time}\\\",\\\"style\\\":34},\\\"2\\\":{\\\"text\\\":\\\"到职时间:\\\",\\\"style\\\":29},\\\"3\\\":{\\\"text\\\":\\\"${employee.arrival_time}\\\",\\\"style\\\":34},\\\"4\\\":{\\\"text\\\":\\\"职称:\\\",\\\"style\\\":29},\\\"5\\\":{\\\"text\\\":\\\"${employee.positional_titles}\\\",\\\"style\\\":30,\\\"merge\\\":[0,1]},\\\"6\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24}},\\\"isDrag\\\":true,\\\"height\\\":42},\\\"12\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"教育经历:\\\",\\\"style\\\":32},\\\"1\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":35,\\\"merge\\\":[0,5]},\\\"2\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40},\\\"3\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40},\\\"4\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40},\\\"5\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40},\\\"6\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40}},\\\"isDrag\\\":true,\\\"height\\\":39},\\\"13\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"${employee.education_experience}\\\",\\\"style\\\":33,\\\"merge\\\":[0,6]},\\\"1\\\":{\\\"style\\\":27,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"style\\\":27,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":27,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":27,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":27,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":27,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true,\\\"height\\\":70},\\\"14\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"工作经历:\\\",\\\"style\\\":32},\\\"1\\\":{\\\"merge\\\":[0,5],\\\"style\\\":30,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"3\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"4\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"5\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"6\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24}},\\\"height\\\":43},\\\"15\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"${employee.work_experience}\\\",\\\"style\\\":30,\\\"merge\\\":[0,6]},\\\"1\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"2\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"3\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"4\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"5\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24},\\\"6\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":24}},\\\"isDrag\\\":true,\\\"height\\\":61},\\\"17\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":37}}},\\\"len\\\":100},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[\\\"sex1\\\"],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":712,\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":16}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"bold\\\":true}},{\\\"font\\\":{\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":16},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"bold\\\":false}},{\\\"font\\\":{\\\"bold\\\":false}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"bold\\\":true},\\\"align\\\":\\\"right\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":16},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"]},\\\"font\\\":{\\\"bold\\\":true},\\\"align\\\":\\\"right\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"]},\\\"font\\\":{\\\"bold\\\":true}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"]},\\\"font\\\":{\\\"bold\\\":false}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":16},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"font\\\":{\\\"bold\\\":true},\\\"align\\\":\\\"right\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"font\\\":{\\\"bold\\\":true}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"font\\\":{\\\"bold\\\":false}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":16,\\\"name\\\":\\\"宋体\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":16,\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"right\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"bold\\\":false,\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":16,\\\"name\\\":\\\"宋体\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"right\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"format\\\":\\\"date2\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"format\\\":\\\"normal\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"format\\\":\\\"date\\\"},{\\\"format\\\":\\\"date2\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"format\\\":\\\"date2\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"format\\\":\\\"time\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"format\\\":\\\"normal\\\"}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":79},\\\"1\\\":{\\\"width\\\":92},\\\"2\\\":{\\\"width\\\":76},\\\"3\\\":{\\\"width\\\":106},\\\"5\\\":{\\\"width\\\":123},\\\"6\\\":{\\\"width\\\":136},\\\"len\\\":50},\\\"merges\\\":[\\\"A2:G2\\\",\\\"B3:E3\\\",\\\"B7:D7\\\",\\\"B8:D8\\\",\\\"B9:D9\\\",\\\"B10:D10\\\",\\\"F9:G9\\\",\\\"F10:G10\\\",\\\"F11:G11\\\",\\\"F12:G12\\\",\\\"B13:G13\\\",\\\"A14:G14\\\",\\\"B15:G15\\\",\\\"A16:G16\\\",\\\"G4:G8\\\"],\\\"imgList\\\":[{\\\"row\\\":3,\\\"col\\\":6,\\\"width\\\":\\\"135\\\",\\\"height\\\":\\\"192\\\",\\\"src\\\":\\\"https://static.jeecg.com/designreport/images/QQ截图20210108095848_1610071294294.png\\\",\\\"layer_id\\\":\\\"Ym8ny6lYTdutY5tT\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[3,6]]}]}', NULL, 'https://static.jeecg.com/designreport/images/1133_1607312428261.png', 'admin', '2020-10-16 11:32:32', 'admin', '2021-02-03 13:59:35', 0, NULL, NULL, 1, 1413, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('1331503965770223616', '20201125155042', '房屋销售综合展示大屏', NULL, NULL, '984302961118724096', '{\\\"loopBlockList\\\":[],\\\"chartList\\\":[{\\\"row\\\":1,\\\"col\\\":1,\\\"width\\\":\\\"338\\\",\\\"height\\\":\\\"378\\\",\\\"config\\\":\\\"{\\\\\\\"yAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"rotate\\\\\\\":0,\\\\\\\"interval\\\\\\\":0,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"data\\\\\\\":[\\\\\\\"缤纷南郡\\\\\\\",\\\\\\\"中航华府\\\\\\\",\\\\\\\"3中家属楼\\\\\\\",\\\\\\\"幸福家园\\\\\\\",\\\\\\\"水晶国际\\\\\\\",\\\\\\\"绿城小区\\\\\\\",\\\\\\\"缤纷南郡二期\\\\\\\",\\\\\\\"国奥家园\\\\\\\",\\\\\\\"西西胡同\\\\\\\",\\\\\\\"融创学府\\\\\\\",\\\\\\\"蓝湾国际\\\\\\\",\\\\\\\"广发小区\\\\\\\"],\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\"}},\\\\\\\"show\\\\\\\":true,\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"red\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false},\\\\\\\"type\\\\\\\":\\\\\\\"category\\\\\\\"},\\\\\\\"xAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\"}},\\\\\\\"show\\\\\\\":true,\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"red\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false},\\\\\\\"type \\\\\\\":\\\\\\\"value\\\\\\\"},\\\\\\\"legend\\\\\\\":{\\\\\\\"padding\\\\\\\":[25,20,25,10],\\\\\\\"data\\\\\\\":[\\\\\\\"房子\\\\\\\"],\\\\\\\"top\\\\\\\":\\\\\\\"top\\\\\\\",\\\\\\\"orient\\\\\\\":\\\\\\\"horizontal\\\\\\\",\\\\\\\"left\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"show\\\\\\\":false,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#333\\\\\\\",\\\\\\\"fontSize\\\\\\\":12}},\\\\\\\"grid\\\\\\\":{\\\\\\\"top\\\\\\\":60,\\\\\\\"left\\\\\\\":71,\\\\\\\"bottom\\\\\\\":39,\\\\\\\"right\\\\\\\":29},\\\\\\\"series\\\\\\\":[{\\\\\\\"barWidth\\\\\\\":13,\\\\\\\"data\\\\\\\":[2,2,2,3,4,3,3,5,2,7,4,8],\\\\\\\"name\\\\\\\":\\\\\\\"房子\\\\\\\",\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#67994B\\\\\\\",\\\\\\\"barBorderRadius\\\\\\\":7},\\\\\\\"label\\\\\\\":{\\\\\\\"show\\\\\\\":false,\\\\\\\"position\\\\\\\":\\\\\\\"top\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"black\\\\\\\",\\\\\\\"fontSize\\\\\\\":16,\\\\\\\"fontWeight\\\\\\\":\\\\\\\"bolder\\\\\\\"}},\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\",\\\\\\\"barMinHeight\\\\\\\":2,\\\\\\\"typeData\\\\\\\":[]}],\\\\\\\"tooltip\\\\\\\":{\\\\\\\"show\\\\\\\":true,\\\\\\\"axisPointer\\\\\\\":{\\\\\\\"type\\\\\\\":\\\\\\\"shadow\\\\\\\"},\\\\\\\"trigger\\\\\\\":\\\\\\\"axis\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#fff\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"title\\\\\\\":{\\\\\\\"padding\\\\\\\":[5,20,5,20],\\\\\\\"left\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"show\\\\\\\":true,\\\\\\\"text\\\\\\\":\\\\\\\"各楼盘成交量排名\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"14\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"normal\\\\\\\"},\\\\\\\"top\\\\\\\":10},\\\\\\\"backgroundColor\\\\\\\":{\\\\\\\"src\\\\\\\":\\\\\\\"https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/images/bg1_1606961907450_1617248229528.png\\\\\\\"}}\\\",\\\"url\\\":\\\"\\\",\\\"extData\\\":{\\\"dataType\\\":\\\"api\\\",\\\"apiStatus\\\":\\\"1\\\",\\\"dataId\\\":\\\"1331511745851731969\\\",\\\"axisX\\\":\\\"name\\\",\\\"axisY\\\":\\\"value\\\",\\\"series\\\":\\\"type\\\",\\\"yText\\\":\\\"\\\",\\\"xText\\\":\\\"\\\",\\\"dbCode\\\":\\\"chengjiao\\\",\\\"chartType\\\":\\\"bar.multi.horizontal\\\",\\\"isTiming\\\":true,\\\"intervalTime\\\":\\\"5\\\"},\\\"layer_id\\\":\\\"5ggWQtDUvSopC4iL\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[1,1],[1,2],[1,3]]},{\\\"row\\\":1,\\\"col\\\":12,\\\"width\\\":\\\"327\\\",\\\"height\\\":\\\"152\\\",\\\"config\\\":\\\"{\\\\\\\"yAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":12}},\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\"}},\\\\\\\"show\\\\\\\":true,\\\\\\\"name\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"red\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false}},\\\\\\\"xAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"rotate\\\\\\\":34,\\\\\\\"interval\\\\\\\":0,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"data\\\\\\\":[\\\\\\\"高层\\\\\\\",\\\\\\\"小高层\\\\\\\",\\\\\\\"写字楼\\\\\\\",\\\\\\\"厂房\\\\\\\",\\\\\\\"公寓\\\\\\\",\\\\\\\"别墅\\\\\\\",\\\\\\\"厂房\\\\\\\",\\\\\\\"四合院\\\\\\\",\\\\\\\"loft\\\\\\\"],\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\"}},\\\\\\\"show\\\\\\\":true,\\\\\\\"name\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"red\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false}},\\\\\\\"grid\\\\\\\":{\\\\\\\"top\\\\\\\":50,\\\\\\\"left\\\\\\\":30,\\\\\\\"bottom\\\\\\\":44,\\\\\\\"right\\\\\\\":24},\\\\\\\"series\\\\\\\":[{\\\\\\\"areaStyle\\\\\\\":null,\\\\\\\"data\\\\\\\":[20,25,10,5,9,1,5,1,20],\\\\\\\"showSymbol\\\\\\\":true,\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"width\\\\\\\":2},\\\\\\\"symbolSize\\\\\\\":5,\\\\\\\"isArea\\\\\\\":false,\\\\\\\"name\\\\\\\":\\\\\\\"销量\\\\\\\",\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#D04672\\\\\\\"},\\\\\\\"step\\\\\\\":false,\\\\\\\"label\\\\\\\":{\\\\\\\"show\\\\\\\":false,\\\\\\\"position\\\\\\\":\\\\\\\"top\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"black\\\\\\\",\\\\\\\"fontSize\\\\\\\":16,\\\\\\\"fontWeight\\\\\\\":\\\\\\\"bolder\\\\\\\"}},\\\\\\\"type\\\\\\\":\\\\\\\"line\\\\\\\",\\\\\\\"smooth\\\\\\\":true}],\\\\\\\"tooltip\\\\\\\":{\\\\\\\"formatter\\\\\\\":\\\\\\\"{b} : {c}\\\\\\\",\\\\\\\"show\\\\\\\":true,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#fff\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"title\\\\\\\":{\\\\\\\"show\\\\\\\":true,\\\\\\\"top\\\\\\\":10,\\\\\\\"text\\\\\\\":\\\\\\\"房形分析\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"normal\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"14\\\\\\\"},\\\\\\\"left\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"padding\\\\\\\":[5,20,5,10]},\\\\\\\"backgroundColor\\\\\\\":{\\\\\\\"src\\\\\\\":\\\\\\\"https://static.jeecg.com/designreport/images/bg1_1607938818911.png\\\\\\\"}}\\\",\\\"url\\\":\\\"\\\",\\\"extData\\\":{\\\"dataType\\\":\\\"api\\\",\\\"apiStatus\\\":\\\"1\\\",\\\"dataId\\\":\\\"1331922734933987329\\\",\\\"axisX\\\":\\\"name\\\",\\\"axisY\\\":\\\"value\\\",\\\"series\\\":\\\"type\\\",\\\"yText\\\":\\\"\\\",\\\"xText\\\":\\\"\\\",\\\"dbCode\\\":\\\"fangyuan\\\",\\\"chartType\\\":\\\"line.smooth\\\",\\\"isTiming\\\":true,\\\"intervalTime\\\":\\\"5\\\"},\\\"layer_id\\\":\\\"nk6I2RCefm9scS1k\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[1,12],[1,13],[1,14],[1,15]]},{\\\"row\\\":7,\\\"col\\\":12,\\\"width\\\":\\\"324\\\",\\\"height\\\":\\\"215\\\",\\\"config\\\":\\\"{\\\\\\\"legend\\\\\\\":{\\\\\\\"padding\\\\\\\":[25,20,25,10],\\\\\\\"data\\\\\\\":[\\\\\\\"1室\\\\\\\",\\\\\\\"2室\\\\\\\",\\\\\\\"3室\\\\\\\",\\\\\\\"4室\\\\\\\",\\\\\\\"5室\\\\\\\"],\\\\\\\"top\\\\\\\":\\\\\\\"bottom\\\\\\\",\\\\\\\"orient\\\\\\\":\\\\\\\"vertical\\\\\\\",\\\\\\\"left\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"show\\\\\\\":true,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"series\\\\\\\":[{\\\\\\\"isRose\\\\\\\":false,\\\\\\\"data\\\\\\\":[{\\\\\\\"name\\\\\\\":\\\\\\\"1室\\\\\\\",\\\\\\\"value\\\\\\\":10,\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"rgba(53,165,180,1)\\\\\\\"}},{\\\\\\\"name\\\\\\\":\\\\\\\"2室\\\\\\\",\\\\\\\"value\\\\\\\":30,\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"rgba(60,140,198,1)\\\\\\\"}},{\\\\\\\"name\\\\\\\":\\\\\\\"3室\\\\\\\",\\\\\\\"value\\\\\\\":20,\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"rgba(93,144,81,1)\\\\\\\"}},{\\\\\\\"name\\\\\\\":\\\\\\\"4室\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"rgba(191,146,68,1)\\\\\\\"}},{\\\\\\\"name\\\\\\\":\\\\\\\"5室\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"rgba(188,69,117,1)\\\\\\\"}}],\\\\\\\"isRadius\\\\\\\":true,\\\\\\\"roseType\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"notCount\\\\\\\":false,\\\\\\\"center\\\\\\\":[\\\\\\\"160\\\\\\\",\\\\\\\"120\\\\\\\"],\\\\\\\"name\\\\\\\":\\\\\\\"访问来源\\\\\\\",\\\\\\\"minAngle\\\\\\\":0,\\\\\\\"label\\\\\\\":{\\\\\\\"show\\\\\\\":false,\\\\\\\"position\\\\\\\":\\\\\\\"outside\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"8\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"bolder\\\\\\\"}},\\\\\\\"type\\\\\\\":\\\\\\\"pie\\\\\\\",\\\\\\\"radius\\\\\\\":[\\\\\\\"40%\\\\\\\",\\\\\\\"50%\\\\\\\"],\\\\\\\"autoSort\\\\\\\":false}],\\\\\\\"tooltip\\\\\\\":{\\\\\\\"formatter\\\\\\\":\\\\\\\"{b} : {c}\\\\\\\",\\\\\\\"show\\\\\\\":true,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#fff\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"title\\\\\\\":{\\\\\\\"show\\\\\\\":true,\\\\\\\"top\\\\\\\":10,\\\\\\\"text\\\\\\\":\\\\\\\"不同户型销售\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"normal\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"14\\\\\\\"},\\\\\\\"left\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"padding\\\\\\\":[5,20,5,10]},\\\\\\\"backgroundColor\\\\\\\":{\\\\\\\"src\\\\\\\":\\\\\\\"https://static.jeecg.com/designreport/images/bg1_1608536502813.png\\\\\\\"}}\\\",\\\"url\\\":\\\"\\\",\\\"extData\\\":{\\\"dataType\\\":\\\"api\\\",\\\"apiStatus\\\":\\\"1\\\",\\\"dataId\\\":\\\"1331919172472524801\\\",\\\"axisX\\\":\\\"name\\\",\\\"axisY\\\":\\\"value\\\",\\\"series\\\":\\\"type\\\",\\\"yText\\\":\\\"\\\",\\\"xText\\\":\\\"\\\",\\\"dbCode\\\":\\\"huxingxiaoshou\\\",\\\"chartType\\\":\\\"pie.doughnut\\\",\\\"isTiming\\\":true,\\\"intervalTime\\\":\\\"5\\\",\\\"id\\\":\\\"MCJP8uqwe57YoCvF\\\"},\\\"layer_id\\\":\\\"MCJP8uqwe57YoCvF\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[7,12],[7,13],[7,14],[7,15]]},{\\\"row\\\":7,\\\"col\\\":4,\\\"width\\\":\\\"662\\\",\\\"height\\\":\\\"222\\\",\\\"config\\\":\\\"{\\\\\\\"yAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\"}},\\\\\\\"show\\\\\\\":true,\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"red\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false},\\\\\\\"type \\\\\\\":\\\\\\\"value\\\\\\\"},\\\\\\\"xAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"rotate\\\\\\\":0,\\\\\\\"interval\\\\\\\":0,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"data\\\\\\\":[\\\\\\\"1月\\\\\\\",\\\\\\\"2月\\\\\\\",\\\\\\\"3月\\\\\\\",\\\\\\\"4月\\\\\\\",\\\\\\\"5月\\\\\\\",\\\\\\\"6月\\\\\\\",\\\\\\\"7月\\\\\\\",\\\\\\\"8月\\\\\\\",\\\\\\\"9月\\\\\\\",\\\\\\\"10月\\\\\\\",\\\\\\\"11月\\\\\\\",\\\\\\\"12月\\\\\\\"],\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\"}},\\\\\\\"show\\\\\\\":true,\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#A98E8E\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false},\\\\\\\"type\\\\\\\":\\\\\\\"category\\\\\\\"},\\\\\\\"legend\\\\\\\":{\\\\\\\"padding\\\\\\\":[25,20,25,10],\\\\\\\"data\\\\\\\":[\\\\\\\"成交量\\\\\\\",\\\\\\\"成交价\\\\\\\"],\\\\\\\"top\\\\\\\":\\\\\\\"top\\\\\\\",\\\\\\\"orient\\\\\\\":\\\\\\\"vertical\\\\\\\",\\\\\\\"left\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"show\\\\\\\":false,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FBF8F8\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"grid\\\\\\\":{\\\\\\\"top\\\\\\\":58,\\\\\\\"left\\\\\\\":30,\\\\\\\"bottom\\\\\\\":43,\\\\\\\"right\\\\\\\":32},\\\\\\\"series\\\\\\\":[{\\\\\\\"barWidth\\\\\\\":15,\\\\\\\"stack\\\\\\\":\\\\\\\"1\\\\\\\",\\\\\\\"data\\\\\\\":[10,7,5,5,7,9,3,6,5,8,6,6],\\\\\\\"name\\\\\\\":\\\\\\\"成交量\\\\\\\",\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#37A5B1\\\\\\\",\\\\\\\"barBorderRadius\\\\\\\":13},\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\",\\\\\\\"barMinHeight\\\\\\\":7,\\\\\\\"typeData\\\\\\\":[{\\\\\\\"name\\\\\\\":\\\\\\\"成交量\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"_index\\\\\\\":0,\\\\\\\"_rowKey\\\\\\\":136,\\\\\\\"stack\\\\\\\":\\\\\\\"1\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"成交价\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"stack\\\\\\\":\\\\\\\"1\\\\\\\",\\\\\\\"_index\\\\\\\":1,\\\\\\\"_rowKey\\\\\\\":139}]},{\\\\\\\"barWidth\\\\\\\":15,\\\\\\\"stack\\\\\\\":\\\\\\\"1\\\\\\\",\\\\\\\"data\\\\\\\":[5,5,12,5,5,5,5,10,5,5,5,5],\\\\\\\"name\\\\\\\":\\\\\\\"成交价\\\\\\\",\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#2E72A7\\\\\\\",\\\\\\\"barBorderRadius\\\\\\\":13},\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\",\\\\\\\"barMinHeight\\\\\\\":7,\\\\\\\"typeData\\\\\\\":[{\\\\\\\"name\\\\\\\":\\\\\\\"成交量\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"_index\\\\\\\":0,\\\\\\\"_rowKey\\\\\\\":136,\\\\\\\"stack\\\\\\\":\\\\\\\"1\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"成交价\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"stack\\\\\\\":\\\\\\\"1\\\\\\\",\\\\\\\"_index\\\\\\\":1,\\\\\\\"_rowKey\\\\\\\":139}]}],\\\\\\\"tooltip\\\\\\\":{\\\\\\\"show\\\\\\\":true,\\\\\\\"axisPointer\\\\\\\":{\\\\\\\"type\\\\\\\":\\\\\\\"shadow\\\\\\\"},\\\\\\\"trigger\\\\\\\":\\\\\\\"axis\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#fff\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"title\\\\\\\":{\\\\\\\"padding\\\\\\\":[5,20,5,20],\\\\\\\"left\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"show\\\\\\\":true,\\\\\\\"text\\\\\\\":\\\\\\\"成交量和成交价趋势\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"14\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"normal\\\\\\\"},\\\\\\\"top\\\\\\\":10},\\\\\\\"backgroundColor\\\\\\\":{\\\\\\\"src\\\\\\\":\\\\\\\"https://static.jeecg.com/designreport/images/QQ截图20201207201434_1607343287788.png\\\\\\\"}}\\\",\\\"url\\\":\\\"\\\",\\\"extData\\\":{\\\"dataType\\\":\\\"api\\\",\\\"apiStatus\\\":\\\"1\\\",\\\"dataId\\\":\\\"1331872643531526146\\\",\\\"axisX\\\":\\\"name\\\",\\\"axisY\\\":\\\"value\\\",\\\"series\\\":\\\"type\\\",\\\"yText\\\":\\\"\\\",\\\"xText\\\":\\\"\\\",\\\"dbCode\\\":\\\"chengjiao1\\\",\\\"chartType\\\":\\\"bar.stack\\\",\\\"chartId\\\":\\\"\\\",\\\"isTiming\\\":true,\\\"intervalTime\\\":\\\"5\\\"},\\\"layer_id\\\":\\\"Nf6Xud4fZqEfvQw4\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[7,4],[7,5],[7,6],[7,7],[7,8],[7,9],[7,10],[7,11]]},{\\\"row\\\":16,\\\"col\\\":12,\\\"width\\\":\\\"326\\\",\\\"height\\\":\\\"200\\\",\\\"config\\\":\\\"{\\\\\\\"radar\\\\\\\":[{\\\\\\\"indicator\\\\\\\":[{\\\\\\\"name\\\\\\\":\\\\\\\"房产证\\\\\\\",\\\\\\\"max\\\\\\\":520},{\\\\\\\"name\\\\\\\":\\\\\\\"购房发票\\\\\\\",\\\\\\\"max\\\\\\\":310},{\\\\\\\"name\\\\\\\":\\\\\\\"购房合同\\\\\\\",\\\\\\\"max\\\\\\\":380},{\\\\\\\"name\\\\\\\":\\\\\\\"预售合同\\\\\\\",\\\\\\\"max\\\\\\\":450},{\\\\\\\"name\\\\\\\":\\\\\\\"抵押合同\\\\\\\",\\\\\\\"max\\\\\\\":600},{\\\\\\\"name\\\\\\\":\\\\\\\"预收合同\\\\\\\",\\\\\\\"max\\\\\\\":350}],\\\\\\\"shape\\\\\\\":\\\\\\\"polygon\\\\\\\",\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"gray\\\\\\\",\\\\\\\"opacity\\\\\\\":0.5}},\\\\\\\"center\\\\\\\":[\\\\\\\"50%\\\\\\\",\\\\\\\"50%\\\\\\\"],\\\\\\\"name\\\\\\\":{\\\\\\\"formatter\\\\\\\":\\\\\\\"【{value}】\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#72ACD1\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"gray\\\\\\\",\\\\\\\"opacity\\\\\\\":0.5}}}],\\\\\\\"legend\\\\\\\":{\\\\\\\"padding\\\\\\\":[25,20,25,10],\\\\\\\"data\\\\\\\":[\\\\\\\"售后产权\\\\\\\",\\\\\\\"单位产权\\\\\\\",\\\\\\\"个人产权\\\\\\\"],\\\\\\\"top\\\\\\\":\\\\\\\"top\\\\\\\",\\\\\\\"orient\\\\\\\":\\\\\\\"horizontal\\\\\\\",\\\\\\\"left\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"show\\\\\\\":false,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#333\\\\\\\",\\\\\\\"fontSize\\\\\\\":12}},\\\\\\\"series\\\\\\\":[{\\\\\\\"type\\\\\\\":\\\\\\\"radar\\\\\\\",\\\\\\\"data\\\\\\\":[{\\\\\\\"name\\\\\\\":\\\\\\\"售后产权\\\\\\\",\\\\\\\"value\\\\\\\":[43,100,280,350,500,250],\\\\\\\"areaStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#3F9AFB\\\\\\\",\\\\\\\"opacity\\\\\\\":1},\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#2D8CF0\\\\\\\"}},{\\\\\\\"name\\\\\\\":\\\\\\\"单位产权\\\\\\\",\\\\\\\"value\\\\\\\":[190,50,140,280,310,150],\\\\\\\"areaStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#A6F65C\\\\\\\",\\\\\\\"opacity\\\\\\\":1},\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#55FE4D\\\\\\\"}},{\\\\\\\"name\\\\\\\":\\\\\\\"个人产权\\\\\\\",\\\\\\\"value\\\\\\\":[420,210,160,0,120,130],\\\\\\\"areaStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"rgba(188,69,117,1)\\\\\\\",\\\\\\\"opacity\\\\\\\":1},\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"rgba(188,69,117,1)\\\\\\\"}}]}],\\\\\\\"tooltip\\\\\\\":{\\\\\\\"show\\\\\\\":true,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#fff\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"title\\\\\\\":{\\\\\\\"show\\\\\\\":true,\\\\\\\"top\\\\\\\":10,\\\\\\\"text\\\\\\\":\\\\\\\"不同产权、证件成交量\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#ffffff\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"normal\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"14\\\\\\\"},\\\\\\\"left\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"padding\\\\\\\":[5,20,5,20]},\\\\\\\"backgroundColor\\\\\\\":{\\\\\\\"src\\\\\\\":\\\\\\\"https://static.jeecg.com/designreport/images/bg1_1608274537110.png\\\\\\\"}}\\\",\\\"url\\\":\\\"\\\",\\\"extData\\\":{\\\"dataType\\\":\\\"api\\\",\\\"apiStatus\\\":\\\"1\\\",\\\"dataId\\\":\\\"1331916030221602818\\\",\\\"axisX\\\":\\\"name\\\",\\\"axisY\\\":\\\"value\\\",\\\"series\\\":\\\"type\\\",\\\"yText\\\":\\\"\\\",\\\"xText\\\":\\\"\\\",\\\"dbCode\\\":\\\"btchanquan\\\",\\\"chartType\\\":\\\"radar.basic\\\",\\\"isTiming\\\":true,\\\"intervalTime\\\":\\\"10\\\",\\\"id\\\":\\\"IWoBtyiRxjkEbkfD\\\"},\\\"layer_id\\\":\\\"IWoBtyiRxjkEbkfD\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[16,12],[16,13],[16,14],[16,15]]},{\\\"row\\\":16,\\\"col\\\":1,\\\"width\\\":\\\"337\\\",\\\"height\\\":\\\"205\\\",\\\"config\\\":\\\"{\\\\\\\"yAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"rotate\\\\\\\":0,\\\\\\\"interval\\\\\\\":0,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"data\\\\\\\":[\\\\\\\"马小姐\\\\\\\",\\\\\\\"孙小姐\\\\\\\",\\\\\\\"王先生\\\\\\\",\\\\\\\"李先生\\\\\\\",\\\\\\\"赵小姐\\\\\\\"],\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\"}},\\\\\\\"show\\\\\\\":true,\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"red\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false},\\\\\\\"type\\\\\\\":\\\\\\\"category\\\\\\\"},\\\\\\\"xAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\"}},\\\\\\\"show\\\\\\\":true,\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"red\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false},\\\\\\\"type \\\\\\\":\\\\\\\"value\\\\\\\"},\\\\\\\"legend\\\\\\\":{\\\\\\\"padding\\\\\\\":[25,20,25,10],\\\\\\\"data\\\\\\\":[\\\\\\\"房子\\\\\\\"],\\\\\\\"top\\\\\\\":\\\\\\\"top\\\\\\\",\\\\\\\"orient\\\\\\\":\\\\\\\"horizontal\\\\\\\",\\\\\\\"left\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"show\\\\\\\":false,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#333\\\\\\\",\\\\\\\"fontSize\\\\\\\":12}},\\\\\\\"grid\\\\\\\":{\\\\\\\"top\\\\\\\":55,\\\\\\\"left\\\\\\\":70,\\\\\\\"bottom\\\\\\\":40,\\\\\\\"right\\\\\\\":24},\\\\\\\"series\\\\\\\":[{\\\\\\\"barWidth\\\\\\\":13,\\\\\\\"data\\\\\\\":[20,15,12,10,7],\\\\\\\"name\\\\\\\":\\\\\\\"房子\\\\\\\",\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#37A5B1\\\\\\\",\\\\\\\"barBorderRadius\\\\\\\":7},\\\\\\\"label\\\\\\\":{\\\\\\\"show\\\\\\\":false,\\\\\\\"position\\\\\\\":\\\\\\\"top\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"black\\\\\\\",\\\\\\\"fontSize\\\\\\\":16,\\\\\\\"fontWeight\\\\\\\":\\\\\\\"bolder\\\\\\\"}},\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\",\\\\\\\"barMinHeight\\\\\\\":2,\\\\\\\"typeData\\\\\\\":[]}],\\\\\\\"tooltip\\\\\\\":{\\\\\\\"show\\\\\\\":true,\\\\\\\"axisPointer\\\\\\\":{\\\\\\\"type\\\\\\\":\\\\\\\"shadow\\\\\\\"},\\\\\\\"trigger\\\\\\\":\\\\\\\"axis\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#fff\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"title\\\\\\\":{\\\\\\\"padding\\\\\\\":[5,20,5,20],\\\\\\\"left\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"show\\\\\\\":true,\\\\\\\"text\\\\\\\":\\\\\\\"销售量成交排行榜\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"14\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"normal\\\\\\\"},\\\\\\\"top\\\\\\\":10},\\\\\\\"backgroundColor\\\\\\\":{\\\\\\\"src\\\\\\\":\\\\\\\"https://static.jeecg.com/designreport/images/bg1_1606961907450.png\\\\\\\"}}\\\",\\\"url\\\":\\\"\\\",\\\"extData\\\":{\\\"dataType\\\":\\\"api\\\",\\\"apiStatus\\\":\\\"1\\\",\\\"dataId\\\":\\\"1331514838211407873\\\",\\\"axisX\\\":\\\"name\\\",\\\"axisY\\\":\\\"value\\\",\\\"series\\\":\\\"type\\\",\\\"yText\\\":\\\"\\\",\\\"xText\\\":\\\"\\\",\\\"dbCode\\\":\\\"cjpaihang\\\",\\\"chartType\\\":\\\"bar.multi.horizontal\\\",\\\"isTiming\\\":true,\\\"intervalTime\\\":\\\"5\\\"},\\\"layer_id\\\":\\\"Cror94F1kmbP71ip\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[16,1],[16,2],[16,3]]},{\\\"row\\\":16,\\\"col\\\":4,\\\"width\\\":\\\"334\\\",\\\"height\\\":\\\"206\\\",\\\"config\\\":\\\"{\\\\\\\"yAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"rotate\\\\\\\":0,\\\\\\\"interval\\\\\\\":0,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"data\\\\\\\":[\\\\\\\"马小姐\\\\\\\",\\\\\\\"孙小姐\\\\\\\",\\\\\\\"王先生\\\\\\\",\\\\\\\"李先生\\\\\\\",\\\\\\\"赵小姐\\\\\\\"],\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\"}},\\\\\\\"show\\\\\\\":true,\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"red\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false},\\\\\\\"type\\\\\\\":\\\\\\\"category\\\\\\\"},\\\\\\\"xAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\"}},\\\\\\\"show\\\\\\\":true,\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"red\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false},\\\\\\\"type \\\\\\\":\\\\\\\"value\\\\\\\"},\\\\\\\"legend\\\\\\\":{\\\\\\\"padding\\\\\\\":[25,20,25,10],\\\\\\\"data\\\\\\\":[\\\\\\\"房子\\\\\\\"],\\\\\\\"top\\\\\\\":\\\\\\\"top\\\\\\\",\\\\\\\"orient\\\\\\\":\\\\\\\"horizontal\\\\\\\",\\\\\\\"left\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"show\\\\\\\":false,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#333\\\\\\\",\\\\\\\"fontSize\\\\\\\":12}},\\\\\\\"grid\\\\\\\":{\\\\\\\"top\\\\\\\":55,\\\\\\\"left\\\\\\\":56,\\\\\\\"bottom\\\\\\\":38,\\\\\\\"right\\\\\\\":30},\\\\\\\"series\\\\\\\":[{\\\\\\\"barWidth\\\\\\\":13,\\\\\\\"data\\\\\\\":[20,15,12,10,7],\\\\\\\"name\\\\\\\":\\\\\\\"房子\\\\\\\",\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#2E72A7\\\\\\\",\\\\\\\"barBorderRadius\\\\\\\":7},\\\\\\\"label\\\\\\\":{\\\\\\\"show\\\\\\\":false,\\\\\\\"position\\\\\\\":\\\\\\\"top\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"black\\\\\\\",\\\\\\\"fontSize\\\\\\\":16,\\\\\\\"fontWeight\\\\\\\":\\\\\\\"bolder\\\\\\\"}},\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\",\\\\\\\"barMinHeight\\\\\\\":2,\\\\\\\"typeData\\\\\\\":[]}],\\\\\\\"tooltip\\\\\\\":{\\\\\\\"show\\\\\\\":true,\\\\\\\"axisPointer\\\\\\\":{\\\\\\\"type\\\\\\\":\\\\\\\"shadow\\\\\\\"},\\\\\\\"trigger\\\\\\\":\\\\\\\"axis\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#fff\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"title\\\\\\\":{\\\\\\\"padding\\\\\\\":[5,20,5,20],\\\\\\\"left\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"show\\\\\\\":true,\\\\\\\"text\\\\\\\":\\\\\\\"销售员成交金额\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"14\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"normal\\\\\\\"},\\\\\\\"top\\\\\\\":10},\\\\\\\"backgroundColor\\\\\\\":{\\\\\\\"src\\\\\\\":\\\\\\\"https://static.jeecg.com/designreport/images/bg1_1606961918589.png\\\\\\\"}}\\\",\\\"url\\\":\\\"\\\",\\\"extData\\\":{\\\"dataType\\\":\\\"api\\\",\\\"apiStatus\\\":\\\"1\\\",\\\"dataId\\\":\\\"1331514838211407873\\\",\\\"axisX\\\":\\\"name\\\",\\\"axisY\\\":\\\"value\\\",\\\"series\\\":\\\"type\\\",\\\"yText\\\":\\\"\\\",\\\"xText\\\":\\\"\\\",\\\"dbCode\\\":\\\"cjpaihang\\\",\\\"chartType\\\":\\\"bar.multi.horizontal\\\",\\\"isTiming\\\":true,\\\"intervalTime\\\":\\\"5\\\",\\\"chartId\\\":\\\"\\\"},\\\"layer_id\\\":\\\"pBOwp0Q0g4iuJCVm\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[16,4],[16,5],[16,6],[16,7]]},{\\\"row\\\":16,\\\"col\\\":8,\\\"width\\\":\\\"324\\\",\\\"height\\\":\\\"206\\\",\\\"config\\\":\\\"{\\\\\\\"legend\\\\\\\":{\\\\\\\"padding\\\\\\\":[25,20,25,10],\\\\\\\"data\\\\\\\":[\\\\\\\"简装\\\\\\\",\\\\\\\"中装\\\\\\\",\\\\\\\"精装\\\\\\\",\\\\\\\"豪装\\\\\\\",\\\\\\\"毛坯\\\\\\\"],\\\\\\\"top\\\\\\\":\\\\\\\"bottom\\\\\\\",\\\\\\\"orient\\\\\\\":\\\\\\\"vertical\\\\\\\",\\\\\\\"left\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"show\\\\\\\":true,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"series\\\\\\\":[{\\\\\\\"isRose\\\\\\\":false,\\\\\\\"data\\\\\\\":[{\\\\\\\"name\\\\\\\":\\\\\\\"简装\\\\\\\",\\\\\\\"value\\\\\\\":10,\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"rgba(52,158,172,1)\\\\\\\"}},{\\\\\\\"name\\\\\\\":\\\\\\\"中装\\\\\\\",\\\\\\\"value\\\\\\\":10,\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"rgba(56,131,185,1)\\\\\\\"}},{\\\\\\\"name\\\\\\\":\\\\\\\"精装\\\\\\\",\\\\\\\"value\\\\\\\":10,\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"rgba(103,153,75,1)\\\\\\\"}},{\\\\\\\"name\\\\\\\":\\\\\\\"豪装\\\\\\\",\\\\\\\"value\\\\\\\":10,\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"rgba(230,165,55,1)\\\\\\\"}},{\\\\\\\"name\\\\\\\":\\\\\\\"毛坯\\\\\\\",\\\\\\\"value\\\\\\\":10,\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"\\\\\\\"}}],\\\\\\\"isRadius\\\\\\\":false,\\\\\\\"roseType\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"notCount\\\\\\\":false,\\\\\\\"center\\\\\\\":[\\\\\\\"180\\\\\\\",\\\\\\\"100\\\\\\\"],\\\\\\\"name\\\\\\\":\\\\\\\"访问来源\\\\\\\",\\\\\\\"minAngle\\\\\\\":0,\\\\\\\"label\\\\\\\":{\\\\\\\"show\\\\\\\":false,\\\\\\\"position\\\\\\\":\\\\\\\"outside\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"bolder\\\\\\\"}},\\\\\\\"type\\\\\\\":\\\\\\\"pie\\\\\\\",\\\\\\\"radius\\\\\\\":\\\\\\\"52%\\\\\\\",\\\\\\\"autoSort\\\\\\\":false}],\\\\\\\"tooltip\\\\\\\":{\\\\\\\"formatter\\\\\\\":\\\\\\\"{b} : {c}\\\\\\\",\\\\\\\"show\\\\\\\":true,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#fff\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"title\\\\\\\":{\\\\\\\"show\\\\\\\":true,\\\\\\\"top\\\\\\\":10,\\\\\\\"text\\\\\\\":\\\\\\\"不同装修类型销售销量\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#ffffff\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"normal\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"14\\\\\\\"},\\\\\\\"left\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"padding\\\\\\\":[5,20,5,10]},\\\\\\\"backgroundColor\\\\\\\":{\\\\\\\"src\\\\\\\":\\\\\\\"https://static.jeecg.com/designreport/images/bg1_1608535503498.png\\\\\\\"}}\\\",\\\"url\\\":\\\"\\\",\\\"extData\\\":{\\\"dataType\\\":\\\"api\\\",\\\"apiStatus\\\":\\\"1\\\",\\\"dataId\\\":\\\"1331878107552010242\\\",\\\"axisX\\\":\\\"name\\\",\\\"axisY\\\":\\\"value\\\",\\\"series\\\":\\\"type\\\",\\\"yText\\\":\\\"\\\",\\\"xText\\\":\\\"\\\",\\\"dbCode\\\":\\\"zhuangxiu\\\",\\\"chartType\\\":\\\"pie.simple\\\",\\\"isTiming\\\":true,\\\"intervalTime\\\":\\\"5\\\",\\\"id\\\":\\\"rQgkcYfLy4x0EP6h\\\"},\\\"layer_id\\\":\\\"rQgkcYfLy4x0EP6h\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[16,8],[16,9],[16,10],[16,11]]}],\\\"area\\\":{\\\"sri\\\":16,\\\"sci\\\":1,\\\"eri\\\":23,\\\"eci\\\":3,\\\"width\\\":340,\\\"height\\\":200},\\\"excel_config_id\\\":\\\"1331503965770223616\\\",\\\"printConfig\\\":{\\\"paper\\\":\\\"A4\\\",\\\"width\\\":210,\\\"height\\\":297,\\\"definition\\\":1,\\\"isBackend\\\":false,\\\"marginX\\\":10,\\\"marginY\\\":10},\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"style\\\":60,\\\"merge\\\":[0,13],\\\"text\\\":\\\"房屋销售综合展示大屏\\\"}},\\\"height\\\":113},\\\"1\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[14,2],\\\"style\\\":43,\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"5ggWQtDUvSopC4iL\\\"},\\\"2\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"5ggWQtDUvSopC4iL\\\"},\\\"3\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"5ggWQtDUvSopC4iL\\\"},\\\"4\\\":{\\\"style\\\":53,\\\"text\\\":\\\"成交量：\\\",\\\"merge\\\":[2,0],\\\"virtual\\\":\\\"5ggWQtDUvSopC4iL\\\"},\\\"5\\\":{\\\"text\\\":\\\"#{qingkuang.cjl}\\\",\\\"style\\\":64,\\\"merge\\\":[2,0]},\\\"7\\\":{\\\"style\\\":53,\\\"text\\\":\\\"成交金额：\\\",\\\"merge\\\":[2,0]},\\\"8\\\":{\\\"text\\\":\\\"#{qingkuang.cjje}\\\",\\\"style\\\":68,\\\"merge\\\":[2,0]},\\\"10\\\":{\\\"style\\\":53,\\\"text\\\":\\\"销售面积：\\\",\\\"merge\\\":[2,0]},\\\"11\\\":{\\\"text\\\":\\\"#{qingkuang.xsmj}\\\",\\\"style\\\":64,\\\"merge\\\":[2,0]},\\\"12\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"nk6I2RCefm9scS1k\\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"nk6I2RCefm9scS1k\\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"nk6I2RCefm9scS1k\\\"},\\\"15\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"nk6I2RCefm9scS1k\\\"}},\\\"isDrag\\\":true},\\\"2\\\":{\\\"cells\\\":{\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"3\\\":{\\\"cells\\\":{\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"4\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"style\\\":58,\\\"text\\\":\\\"成交均价：\\\",\\\"merge\\\":[2,0]},\\\"5\\\":{\\\"text\\\":\\\"#{qingkuang.cjjj}\\\",\\\"style\\\":65,\\\"merge\\\":[2,0]},\\\"7\\\":{\\\"style\\\":58,\\\"text\\\":\\\"售房佣金：\\\",\\\"merge\\\":[2,0]},\\\"8\\\":{\\\"text\\\":\\\"#{qingkuang.sfyj}\\\",\\\"style\\\":65,\\\"merge\\\":[2,0]},\\\"10\\\":{\\\"style\\\":58,\\\"text\\\":\\\"预定客户：\\\",\\\"merge\\\":[2,0]},\\\"11\\\":{\\\"text\\\":\\\"#{qingkuang.ydkh}\\\",\\\"style\\\":65,\\\"merge\\\":[2,0]},\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true,\\\"height\\\":25},\\\"5\\\":{\\\"cells\\\":{\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"6\\\":{\\\"cells\\\":{\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"7\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"Nf6Xud4fZqEfvQw4\\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"Nf6Xud4fZqEfvQw4\\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"Nf6Xud4fZqEfvQw4\\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"Nf6Xud4fZqEfvQw4\\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"Nf6Xud4fZqEfvQw4\\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"Nf6Xud4fZqEfvQw4\\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"Nf6Xud4fZqEfvQw4\\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"Nf6Xud4fZqEfvQw4\\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"MCJP8uqwe57YoCvF\\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"MCJP8uqwe57YoCvF\\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"MCJP8uqwe57YoCvF\\\"},\\\"15\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"MCJP8uqwe57YoCvF\\\"}}},\\\"8\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"9\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"10\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"11\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"12\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"13\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"14\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"15\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"16\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":43,\\\"text\\\":\\\" \\\",\\\"merge\\\":[7,2],\\\"virtual\\\":\\\"Cror94F1kmbP71ip\\\"},\\\"2\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"Cror94F1kmbP71ip\\\"},\\\"3\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"Cror94F1kmbP71ip\\\"},\\\"4\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"pBOwp0Q0g4iuJCVm\\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"pBOwp0Q0g4iuJCVm\\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"pBOwp0Q0g4iuJCVm\\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"pBOwp0Q0g4iuJCVm\\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"rQgkcYfLy4x0EP6h\\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"rQgkcYfLy4x0EP6h\\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"rQgkcYfLy4x0EP6h\\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"rQgkcYfLy4x0EP6h\\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"IWoBtyiRxjkEbkfD\\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"IWoBtyiRxjkEbkfD\\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"IWoBtyiRxjkEbkfD\\\"},\\\"15\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"IWoBtyiRxjkEbkfD\\\"}}},\\\"17\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"18\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"19\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"20\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"21\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"22\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"23\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"24\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\"}}},\\\"len\\\":98},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":794,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":1546,\\\"displayConfig\\\":{},\\\"background\\\":{\\\"path\\\":\\\"https://static.jeecg.com/designreport/images/bg_1606961893275.png\\\",\\\"repeat\\\":\\\"repeat\\\",\\\"width\\\":\\\"\\\",\\\"height\\\":\\\"\\\"},\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"font\\\":{\\\"bold\\\":true}},{\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"Microsoft YaHei\\\",\\\"size\\\":18}},{\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\",\\\"size\\\":18}},{\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"Microsoft YaHei\\\",\\\"size\\\":16}},{\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\",\\\"size\\\":16}},{\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"Microsoft YaHei\\\",\\\"size\\\":16},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\",\\\"size\\\":16},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"align\\\":\\\"right\\\"},{\\\"align\\\":\\\"right\\\"},{\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":14}},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":14}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":12}},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":12}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"font\\\":{\\\"size\\\":12}},{\\\"font\\\":{\\\"size\\\":12}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":11}},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":11}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"font\\\":{\\\"size\\\":11}},{\\\"font\\\":{\\\"size\\\":11}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"Microsoft YaHei\\\",\\\"size\\\":16},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"color\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"Microsoft YaHei\\\",\\\"size\\\":22},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":22}},{\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"Microsoft YaHei\\\",\\\"size\\\":22},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"size\\\":22}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true},\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true},\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11},\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11},\\\"color\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"size\\\":11},\\\"color\\\":\\\"#ffffff\\\"},{},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":false},\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":false},\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":false,\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":false,\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11},\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#eee\\\"]}},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false,\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":15,\\\"bold\\\":false,\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":false,\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14},\\\"color\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"size\\\":14},\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14},\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":false,\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":false,\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"top\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14},\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"top\\\"},{\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\",\\\"size\\\":22},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":22,\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"top\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#ffff01\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#ffff01\\\",\\\"valign\\\":\\\"top\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#ffffff\\\",\\\"bgcolor\\\":\\\"#ffff01\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#ffffff\\\",\\\"bgcolor\\\":\\\"\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#ffff01\\\",\\\"bgcolor\\\":\\\"\\\"}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":117},\\\"3\\\":{\\\"width\\\":140},\\\"4\\\":{\\\"width\\\":136},\\\"5\\\":{\\\"width\\\":79},\\\"6\\\":{\\\"width\\\":1},\\\"7\\\":{\\\"width\\\":123},\\\"8\\\":{\\\"width\\\":102},\\\"9\\\":{\\\"width\\\":24},\\\"11\\\":{\\\"width\\\":100},\\\"14\\\":{\\\"width\\\":124},\\\"len\\\":50},\\\"merges\\\":[\\\"B2:D16\\\",\\\"E8:L16\\\",\\\"B17:D24\\\",\\\"E17:H24\\\",\\\"E2:E4\\\",\\\"F2:F4\\\",\\\"E5:E7\\\",\\\"F5:F7\\\",\\\"H2:H4\\\",\\\"H5:H7\\\",\\\"I5:I7\\\",\\\"I2:I4\\\",\\\"K2:K4\\\",\\\"L2:L4\\\",\\\"K5:K7\\\",\\\"L5:L7\\\",\\\"M17:O24\\\",\\\"B1:O1\\\"]}', NULL, 'https://static.jeecg.com/designreport/images/QQ截图20201125161646_1606705892603.png', 'admin', '2020-11-25 15:50:43', 'admin', '2021-04-01 03:37:15', 0, NULL, NULL, 1, 712, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('1334378897302753280', '20201203140834', '区域销售表', NULL, NULL, '984272091947253760', '{\\\"loopBlockList\\\":[],\\\"area\\\":false,\\\"printElWidth\\\":718,\\\"excel_config_id\\\":\\\"1334378897302753280\\\",\\\"printElHeight\\\":1047,\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"区域销售表\\\",\\\"merge\\\":[0,22],\\\"style\\\":10},\\\"2\\\":{\\\"style\\\":10},\\\"3\\\":{\\\"style\\\":10},\\\"4\\\":{\\\"style\\\":10},\\\"5\\\":{\\\"style\\\":10},\\\"6\\\":{\\\"style\\\":10},\\\"7\\\":{\\\"style\\\":10},\\\"8\\\":{\\\"style\\\":10},\\\"9\\\":{\\\"style\\\":10},\\\"10\\\":{\\\"style\\\":10},\\\"11\\\":{\\\"style\\\":10},\\\"12\\\":{\\\"style\\\":10},\\\"13\\\":{\\\"style\\\":10},\\\"14\\\":{\\\"style\\\":10},\\\"15\\\":{\\\"style\\\":10},\\\"16\\\":{\\\"style\\\":10},\\\"17\\\":{\\\"style\\\":10},\\\"18\\\":{\\\"style\\\":10},\\\"19\\\":{\\\"style\\\":10},\\\"20\\\":{\\\"style\\\":10},\\\"21\\\":{\\\"style\\\":10},\\\"22\\\":{\\\"style\\\":10},\\\"23\\\":{\\\"style\\\":10}},\\\"height\\\":72},\\\"1\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":64},\\\"1\\\":{\\\"text\\\":\\\"区域\\\",\\\"merge\\\":[1,0],\\\"style\\\":65},\\\"2\\\":{\\\"text\\\":\\\"省份\\\",\\\"merge\\\":[1,0],\\\"style\\\":65},\\\"3\\\":{\\\"text\\\":\\\"1月\\\",\\\"merge\\\":[0,2],\\\"style\\\":65},\\\"4\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\"2月\\\",\\\"merge\\\":[0,2],\\\"style\\\":65},\\\"7\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\"3月\\\",\\\"merge\\\":[0,2],\\\"style\\\":65},\\\"10\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"text\\\":\\\"4月\\\",\\\"merge\\\":[0,2],\\\"style\\\":65},\\\"13\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"15\\\":{\\\"text\\\":\\\"5月\\\",\\\"merge\\\":[0,2],\\\"style\\\":65},\\\"16\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"17\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"18\\\":{\\\"text\\\":\\\"6月\\\",\\\"merge\\\":[0,2],\\\"style\\\":65},\\\"19\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"20\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"21\\\":{\\\"text\\\":\\\"总合计\\\",\\\"merge\\\":[0,2],\\\"style\\\":65},\\\"22\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"23\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"24\\\":{\\\"style\\\":64},\\\"25\\\":{\\\"style\\\":64}},\\\"height\\\":22},\\\"2\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":64},\\\"1\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"style\\\":65,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"text\\\":\\\"销售额\\\",\\\"style\\\":65},\\\"4\\\":{\\\"text\\\":\\\"搭赠\\\",\\\"style\\\":65},\\\"5\\\":{\\\"text\\\":\\\"比例\\\",\\\"style\\\":65},\\\"6\\\":{\\\"text\\\":\\\"销售额\\\",\\\"style\\\":65},\\\"7\\\":{\\\"text\\\":\\\"搭赠\\\",\\\"style\\\":65},\\\"8\\\":{\\\"text\\\":\\\"比例\\\",\\\"style\\\":65},\\\"9\\\":{\\\"text\\\":\\\"销售额\\\",\\\"style\\\":65},\\\"10\\\":{\\\"text\\\":\\\"搭赠\\\",\\\"style\\\":65},\\\"11\\\":{\\\"text\\\":\\\"比例\\\",\\\"style\\\":65},\\\"12\\\":{\\\"text\\\":\\\"销售额\\\",\\\"style\\\":65},\\\"13\\\":{\\\"text\\\":\\\"搭赠\\\",\\\"style\\\":65},\\\"14\\\":{\\\"text\\\":\\\"比例\\\",\\\"style\\\":65},\\\"15\\\":{\\\"text\\\":\\\"销售额\\\",\\\"style\\\":65},\\\"16\\\":{\\\"text\\\":\\\"搭赠\\\",\\\"style\\\":65},\\\"17\\\":{\\\"text\\\":\\\"比例\\\",\\\"style\\\":65},\\\"18\\\":{\\\"text\\\":\\\"销售额\\\",\\\"style\\\":65},\\\"19\\\":{\\\"text\\\":\\\"搭赠\\\",\\\"style\\\":65},\\\"20\\\":{\\\"text\\\":\\\"比例\\\",\\\"style\\\":65},\\\"21\\\":{\\\"text\\\":\\\"销售额\\\",\\\"style\\\":65},\\\"22\\\":{\\\"text\\\":\\\"搭赠\\\",\\\"style\\\":65},\\\"23\\\":{\\\"text\\\":\\\"比例\\\",\\\"style\\\":65},\\\"24\\\":{\\\"style\\\":64},\\\"25\\\":{\\\"style\\\":64}},\\\"height\\\":24},\\\"3\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":67},\\\"1\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.group(region)}\\\",\\\"style\\\":52,\\\"aggregate\\\":\\\"group\\\"},\\\"2\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.province}\\\",\\\"style\\\":53},\\\"3\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.sales_1}\\\",\\\"style\\\":17},\\\"4\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.gift_1}\\\",\\\"style\\\":17},\\\"5\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.proportion_1}\\\",\\\"style\\\":17},\\\"6\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.sales_2}\\\",\\\"style\\\":17},\\\"7\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.gift_2}\\\",\\\"style\\\":17},\\\"8\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.proportion_2}\\\",\\\"style\\\":17},\\\"9\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.sales_3}\\\",\\\"style\\\":17},\\\"10\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.gift_3}\\\",\\\"style\\\":17},\\\"11\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.proportion_3}\\\",\\\"style\\\":17},\\\"12\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.sales_4}\\\",\\\"style\\\":17},\\\"13\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.gift_4}\\\",\\\"style\\\":17},\\\"14\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.proportion_4}\\\",\\\"style\\\":17},\\\"15\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.sales_5}\\\",\\\"style\\\":17},\\\"16\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.gift_5}\\\",\\\"style\\\":17},\\\"17\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.proportion_5}\\\",\\\"style\\\":15},\\\"18\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.sales_6}\\\",\\\"style\\\":15},\\\"19\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.gift_6}\\\",\\\"style\\\":15},\\\"20\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.proportion_6}\\\",\\\"style\\\":15},\\\"21\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.sales_z}\\\",\\\"style\\\":15},\\\"22\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.gift_z}\\\",\\\"style\\\":15},\\\"23\\\":{\\\"text\\\":\\\"#{quyuxiaoshou.proportion_z}\\\",\\\"style\\\":15},\\\"24\\\":{\\\"style\\\":67},\\\"25\\\":{\\\"style\\\":67}},\\\"isDrag\\\":true,\\\"height\\\":56},\\\"4\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":64},\\\"1\\\":{\\\"style\\\":39,\\\"text\\\":\\\"总计\\\",\\\"merge\\\":[0,1]},\\\"3\\\":{\\\"style\\\":68,\\\"text\\\":\\\"=SUM(D4)\\\"},\\\"4\\\":{\\\"style\\\":69,\\\"text\\\":\\\"=SUM(E4)\\\"},\\\"5\\\":{\\\"style\\\":70,\\\"text\\\":\\\"=SUM(F4)\\\"},\\\"6\\\":{\\\"style\\\":69,\\\"text\\\":\\\"=SUM(G4)\\\"},\\\"7\\\":{\\\"style\\\":69,\\\"text\\\":\\\"=SUM(H4)\\\"},\\\"8\\\":{\\\"style\\\":70,\\\"text\\\":\\\"=SUM(I4)\\\"},\\\"9\\\":{\\\"style\\\":69,\\\"text\\\":\\\"=SUM(J4)\\\"},\\\"10\\\":{\\\"style\\\":69,\\\"text\\\":\\\"=SUM(K4)\\\"},\\\"11\\\":{\\\"style\\\":70,\\\"text\\\":\\\"=SUM(L4)\\\"},\\\"12\\\":{\\\"style\\\":69,\\\"text\\\":\\\"=SUM(M4)\\\"},\\\"13\\\":{\\\"style\\\":69,\\\"text\\\":\\\"=SUM(N4)\\\"},\\\"14\\\":{\\\"style\\\":70,\\\"text\\\":\\\"=SUM(O4)\\\"},\\\"15\\\":{\\\"style\\\":69,\\\"text\\\":\\\"=SUM(P4)\\\"},\\\"16\\\":{\\\"style\\\":69,\\\"text\\\":\\\"=SUM(Q4)\\\"},\\\"17\\\":{\\\"style\\\":70,\\\"text\\\":\\\"=SUM(R4)\\\"},\\\"18\\\":{\\\"style\\\":69,\\\"text\\\":\\\"=SUM(S4)\\\"},\\\"19\\\":{\\\"style\\\":69,\\\"text\\\":\\\"=SUM(T4)\\\"},\\\"20\\\":{\\\"style\\\":70,\\\"text\\\":\\\"=SUM(U4)\\\"},\\\"21\\\":{\\\"style\\\":69,\\\"text\\\":\\\"=SUM(V4)\\\"},\\\"22\\\":{\\\"style\\\":69,\\\"text\\\":\\\"=SUM(W4)\\\"},\\\"23\\\":{\\\"style\\\":69,\\\"text\\\":\\\"=SUM(X4)\\\"},\\\"24\\\":{\\\"style\\\":64},\\\"25\\\":{\\\"style\\\":64}},\\\"height\\\":38},\\\"len\\\":100},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"groupField\\\":\\\"quyuxiaoshou.region\\\",\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":1554,\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"bgcolor\\\":\\\"#02a274\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"bfbfbf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"隶书\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#f1f9f6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":9}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":9}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"华文中宋\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#f1f9f6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Arial\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#f1f9f6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"bgcolor\\\":\\\"#\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#aedac8\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"bgcolor\\\":\\\"#aedac8\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"number\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"normal\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":9}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":9}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#aedac8\\\"},{\\\"font\\\":{\\\"size\\\":10}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"normal\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"font\\\":{\\\"size\\\":10}},{\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"#aedac8\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":10}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":10}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#f1f9f6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":8}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#f1f9f6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#f1f9f6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#aedac8\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"normal\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":10,\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":10,\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"normal\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"Microsoft YaHei\\\"}}],\\\"validations\\\":[],\\\"isGroup\\\":true,\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":20},\\\"1\\\":{\\\"width\\\":84},\\\"2\\\":{\\\"width\\\":81},\\\"3\\\":{\\\"width\\\":75},\\\"4\\\":{\\\"width\\\":63},\\\"5\\\":{\\\"width\\\":59},\\\"6\\\":{\\\"width\\\":70},\\\"7\\\":{\\\"width\\\":57},\\\"8\\\":{\\\"width\\\":60},\\\"9\\\":{\\\"width\\\":75},\\\"10\\\":{\\\"width\\\":66},\\\"11\\\":{\\\"width\\\":64},\\\"12\\\":{\\\"width\\\":70},\\\"13\\\":{\\\"width\\\":61},\\\"14\\\":{\\\"width\\\":61},\\\"15\\\":{\\\"width\\\":70},\\\"16\\\":{\\\"width\\\":58},\\\"17\\\":{\\\"width\\\":63},\\\"18\\\":{\\\"width\\\":60},\\\"19\\\":{\\\"width\\\":63},\\\"20\\\":{\\\"width\\\":59},\\\"21\\\":{\\\"width\\\":73},\\\"22\\\":{\\\"width\\\":69},\\\"23\\\":{\\\"width\\\":73},\\\"len\\\":50},\\\"merges\\\":[\\\"B2:B3\\\",\\\"C2:C3\\\",\\\"D2:F2\\\",\\\"G2:I2\\\",\\\"J2:L2\\\",\\\"M2:O2\\\",\\\"P2:R2\\\",\\\"S2:U2\\\",\\\"V2:X2\\\",\\\"B1:X1\\\",\\\"B5:C5\\\"]}', NULL, 'https://static.jeecg.com/designreport/images/quyu_1607069899537.png', 'admin', '2020-12-03 14:08:34', 'admin', '2021-02-03 13:59:12', 0, NULL, NULL, 1, 450, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('1334420681185566722', '202012031408346166', '学校经费一览表', NULL, NULL, '984272091947253760', '{\\\"loopBlockList\\\":[],\\\"area\\\":{\\\"sri\\\":7,\\\"sci\\\":1,\\\"eri\\\":7,\\\"eci\\\":2,\\\"width\\\":216,\\\"height\\\":25},\\\"printElWidth\\\":718,\\\"excel_config_id\\\":\\\"1334420681185566722\\\",\\\"printElHeight\\\":1047,\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"学校经费一览表\\\",\\\"merge\\\":[0,22],\\\"style\\\":10},\\\"2\\\":{\\\"style\\\":10},\\\"3\\\":{\\\"style\\\":10},\\\"4\\\":{\\\"style\\\":10},\\\"5\\\":{\\\"style\\\":10},\\\"6\\\":{\\\"style\\\":10},\\\"7\\\":{\\\"style\\\":10},\\\"8\\\":{\\\"style\\\":10},\\\"9\\\":{\\\"style\\\":10},\\\"10\\\":{\\\"style\\\":10},\\\"11\\\":{\\\"style\\\":10},\\\"12\\\":{\\\"style\\\":10},\\\"13\\\":{\\\"style\\\":10},\\\"14\\\":{\\\"style\\\":10},\\\"15\\\":{\\\"style\\\":10},\\\"16\\\":{\\\"style\\\":10},\\\"17\\\":{\\\"style\\\":10},\\\"18\\\":{\\\"style\\\":10},\\\"19\\\":{\\\"style\\\":10},\\\"20\\\":{\\\"style\\\":10},\\\"21\\\":{\\\"style\\\":10},\\\"22\\\":{\\\"style\\\":10},\\\"23\\\":{\\\"style\\\":10}},\\\"height\\\":72},\\\"1\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"学校类别\\\",\\\"style\\\":221,\\\"merge\\\":[4,0]},\\\"2\\\":{\\\"merge\\\":[4,0],\\\"style\\\":222,\\\"text\\\":\\\"学校名称\\\"},\\\"3\\\":{\\\"text\\\":\\\"财政教育经费投入（万元）\\\",\\\"merge\\\":[0,8],\\\"style\\\":84},\\\"4\\\":{\\\"style\\\":40,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":40,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":40,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":40,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":40,\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"style\\\":40,\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"style\\\":40,\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"style\\\":40,\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"text\\\":\\\"其他投入\\\",\\\"merge\\\":[0,7],\\\"style\\\":84},\\\"13\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40},\\\"14\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40},\\\"15\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40},\\\"16\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40},\\\"17\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40},\\\"18\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40},\\\"19\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40},\\\"20\\\":{\\\"style\\\":84,\\\"text\\\":\\\"补充资料\\\",\\\"merge\\\":[0,4]},\\\"21\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40},\\\"22\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40},\\\"23\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40},\\\"24\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40}},\\\"height\\\":28},\\\"2\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40},\\\"2\\\":{\\\"style\\\":222,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"text\\\":\\\"总计\\\",\\\"style\\\":117,\\\"merge\\\":[3,0]},\\\"4\\\":{\\\"text\\\":\\\"教育事业费\\\",\\\"style\\\":117,\\\"merge\\\":[0,6]},\\\"5\\\":{\\\"style\\\":118,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":118,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":118,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":118,\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"style\\\":118,\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"style\\\":118,\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\"基础拨款\\\",\\\"style\\\":117,\\\"merge\\\":[3,0]},\\\"12\\\":{\\\"text\\\":\\\"村投入\\\",\\\"style\\\":117,\\\"merge\\\":[0,4]},\\\"13\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":223},\\\"14\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":223},\\\"15\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":223},\\\"16\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":223},\\\"17\\\":{\\\"text\\\":\\\"社会捐款\\\",\\\"style\\\":117,\\\"merge\\\":[0,2]},\\\"18\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":223},\\\"19\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":223},\\\"20\\\":{\\\"style\\\":126,\\\"merge\\\":[0,4],\\\"text\\\":\\\"信息化建设\\\"},\\\"21\\\":{\\\"style\\\":122,\\\"text\\\":\\\" \\\"},\\\"22\\\":{\\\"style\\\":122,\\\"text\\\":\\\" \\\"},\\\"23\\\":{\\\"style\\\":122,\\\"text\\\":\\\" \\\"},\\\"24\\\":{\\\"style\\\":122,\\\"text\\\":\\\" \\\"}},\\\"height\\\":24},\\\"3\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40},\\\"2\\\":{\\\"style\\\":222,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":118,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"合计\\\",\\\"style\\\":121},\\\"5\\\":{\\\"style\\\":122,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"merge\\\":[2,0],\\\"text\\\":\\\"人员经费\\\",\\\"style\\\":121},\\\"7\\\":{\\\"merge\\\":[2,0],\\\"text\\\":\\\"日常公用费用\\\",\\\"style\\\":123},\\\"8\\\":{\\\"merge\\\":[0,2],\\\"text\\\":\\\"项目经费\\\",\\\"style\\\":121},\\\"9\\\":{\\\"style\\\":122,\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"style\\\":122,\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"style\\\":118,\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"merge\\\":[2,0],\\\"text\\\":\\\"合计\\\",\\\"style\\\":121},\\\"13\\\":{\\\"merge\\\":[0,3],\\\"text\\\":\\\"其中\\\",\\\"style\\\":121},\\\"14\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":223},\\\"15\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":223},\\\"16\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":223},\\\"17\\\":{\\\"merge\\\":[2,0],\\\"text\\\":\\\"合计\\\",\\\"style\\\":121},\\\"18\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"其中\\\",\\\"style\\\":121},\\\"19\\\":{\\\"style\\\":122,\\\"text\\\":\\\" \\\"},\\\"20\\\":{\\\"merge\\\":[2,0],\\\"text\\\":\\\"本年投入金额（万元）\\\",\\\"style\\\":230},\\\"21\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"电脑数（台数）\\\",\\\"style\\\":121},\\\"22\\\":{\\\"style\\\":122,\\\"text\\\":\\\" \\\"},\\\"23\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"校园网数（个）\\\",\\\"style\\\":121},\\\"24\\\":{\\\"style\\\":122,\\\"text\\\":\\\" \\\"}}},\\\"4\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40},\\\"2\\\":{\\\"style\\\":222,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":118,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"merge\\\":[1,0],\\\"text\\\":\\\"金额\\\",\\\"style\\\":126},\\\"5\\\":{\\\"merge\\\":[1,0],\\\"text\\\":\\\"比上年增长（%）\\\",\\\"style\\\":127},\\\"6\\\":{\\\"style\\\":122,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":123,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"merge\\\":[1,0],\\\"text\\\":\\\"合计\\\",\\\"style\\\":121},\\\"9\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"其中\\\",\\\"style\\\":121},\\\"10\\\":{\\\"style\\\":122,\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"style\\\":118,\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"style\\\":121,\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"merge\\\":[1,0],\\\"text\\\":\\\"人员经费\\\",\\\"style\\\":131},\\\"14\\\":{\\\"merge\\\":[1,0],\\\"text\\\":\\\"日常公用费用\\\",\\\"style\\\":131},\\\"15\\\":{\\\"merge\\\":[1,0],\\\"text\\\":\\\"项目经费\\\",\\\"style\\\":131},\\\"16\\\":{\\\"merge\\\":[1,0],\\\"text\\\":\\\"基建投入\\\",\\\"style\\\":131},\\\"17\\\":{\\\"style\\\":121,\\\"text\\\":\\\" \\\"},\\\"18\\\":{\\\"merge\\\":[1,0],\\\"text\\\":\\\"项目经费\\\",\\\"style\\\":131},\\\"19\\\":{\\\"merge\\\":[1,0],\\\"text\\\":\\\"基础投入\\\",\\\"style\\\":131},\\\"20\\\":{\\\"style\\\":231,\\\"text\\\":\\\" \\\"},\\\"21\\\":{\\\"merge\\\":[1,0],\\\"text\\\":\\\"合计\\\",\\\"style\\\":121},\\\"22\\\":{\\\"merge\\\":[1,0],\\\"text\\\":\\\"本年购置数\\\",\\\"style\\\":121},\\\"23\\\":{\\\"style\\\":121,\\\"merge\\\":[1,0],\\\"text\\\":\\\"合计\\\"},\\\"24\\\":{\\\"merge\\\":[1,0],\\\"text\\\":\\\"本年建成数\\\",\\\"style\\\":121}}},\\\"5\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":40},\\\"2\\\":{\\\"style\\\":222,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":118,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":126,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":129,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":121,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":130,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":121,\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\"标准化建设\\\",\\\"style\\\":131},\\\"10\\\":{\\\"text\\\":\\\"信息化建设\\\",\\\"style\\\":121},\\\"11\\\":{\\\"style\\\":118,\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"style\\\":121,\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":223},\\\"14\\\":{\\\"style\\\":131,\\\"text\\\":\\\" \\\"},\\\"15\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":223},\\\"16\\\":{\\\"style\\\":131,\\\"text\\\":\\\" \\\"},\\\"17\\\":{\\\"style\\\":121,\\\"text\\\":\\\" \\\"},\\\"18\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":223},\\\"19\\\":{\\\"style\\\":131,\\\"text\\\":\\\" \\\"},\\\"20\\\":{\\\"style\\\":231,\\\"text\\\":\\\" \\\"},\\\"21\\\":{\\\"style\\\":121,\\\"text\\\":\\\" \\\"},\\\"22\\\":{\\\"style\\\":122,\\\"text\\\":\\\" \\\"},\\\"23\\\":{\\\"style\\\":131,\\\"text\\\":\\\" \\\"},\\\"24\\\":{\\\"style\\\":122,\\\"text\\\":\\\" \\\"}}},\\\"6\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":236},\\\"1\\\":{\\\"text\\\":\\\"#{laiyuan.group(class)}\\\",\\\"style\\\":233,\\\"aggregate\\\":\\\"group\\\"},\\\"2\\\":{\\\"text\\\":\\\"#{laiyuan.school}\\\",\\\"style\\\":234},\\\"3\\\":{\\\"style\\\":15,\\\"text\\\":\\\"=SUM(E7,I7)\\\"},\\\"4\\\":{\\\"style\\\":15,\\\"text\\\":\\\"=SUM(G7,H7)\\\"},\\\"5\\\":{\\\"text\\\":\\\"#{laiyuan.lv}\\\",\\\"style\\\":12},\\\"6\\\":{\\\"text\\\":\\\"#{laiyuan.renyuan_jy}\\\",\\\"style\\\":12},\\\"7\\\":{\\\"text\\\":\\\"#{laiyuan.richang_jy}\\\",\\\"style\\\":12},\\\"8\\\":{\\\"style\\\":12,\\\"text\\\":\\\"=SUM(J7,K7)\\\"},\\\"9\\\":{\\\"text\\\":\\\"#{laiyuan.biaozhun_jy}\\\",\\\"style\\\":12},\\\"10\\\":{\\\"text\\\":\\\"#{laiyuan.xinxi_jy}\\\",\\\"style\\\":12},\\\"11\\\":{\\\"text\\\":\\\"#{laiyuan.jichubokuan_jy}\\\",\\\"style\\\":12},\\\"12\\\":{\\\"style\\\":12,\\\"text\\\":\\\"=SUM(N7,O7)\\\"},\\\"13\\\":{\\\"text\\\":\\\"#{laiyuan.renyuan_ct}\\\",\\\"style\\\":12},\\\"14\\\":{\\\"text\\\":\\\"#{laiyuan.richang_ct}\\\",\\\"style\\\":12},\\\"15\\\":{\\\"text\\\":\\\"#{laiyuan.xiangmu_ct}\\\",\\\"style\\\":12},\\\"16\\\":{\\\"text\\\":\\\"#{laiyuan.jichubokuan_ct}\\\",\\\"style\\\":12},\\\"17\\\":{\\\"style\\\":12,\\\"text\\\":\\\"=SUM(S7,T7)\\\"},\\\"18\\\":{\\\"text\\\":\\\"#{laiyuan.xiangmu_sh}\\\",\\\"style\\\":12},\\\"19\\\":{\\\"text\\\":\\\"#{laiyuan.jichubokuan_sh}\\\",\\\"style\\\":12},\\\"20\\\":{\\\"style\\\":12,\\\"text\\\":\\\"=SUM(V7,X7)\\\"},\\\"21\\\":{\\\"style\\\":12,\\\"text\\\":\\\"#{laiyuan.diannao}\\\"},\\\"22\\\":{\\\"text\\\":\\\"#{laiyuan.diannao}\\\",\\\"style\\\":12},\\\"23\\\":{\\\"style\\\":12,\\\"text\\\":\\\"#{laiyuan.xiaoyuanwang}\\\"},\\\"24\\\":{\\\"text\\\":\\\"#{laiyuan.xiaoyuanwang}\\\",\\\"style\\\":12},\\\"25\\\":{\\\"style\\\":236}},\\\"isDrag\\\":true},\\\"7\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"总计\\\",\\\"style\\\":226,\\\"rendered\\\":\\\"\\\",\\\"merge\\\":[0,1]},\\\"3\\\":{\\\"style\\\":228,\\\"text\\\":\\\"=SUM(D7)\\\"},\\\"4\\\":{\\\"style\\\":228,\\\"text\\\":\\\"=SUM(E7)\\\"},\\\"5\\\":{\\\"style\\\":228,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"style\\\":228,\\\"text\\\":\\\"=SUM(G7)\\\"},\\\"7\\\":{\\\"style\\\":228,\\\"text\\\":\\\"=SUM(H7)\\\"},\\\"8\\\":{\\\"style\\\":228,\\\"text\\\":\\\"=SUM(I7)\\\"},\\\"9\\\":{\\\"style\\\":228,\\\"text\\\":\\\"=SUM(J7)\\\"},\\\"10\\\":{\\\"style\\\":228,\\\"text\\\":\\\"=SUM(K7)\\\"},\\\"11\\\":{\\\"style\\\":228,\\\"text\\\":\\\"=SUM(L7)\\\"},\\\"12\\\":{\\\"style\\\":228,\\\"text\\\":\\\"=SUM(M7)\\\"},\\\"13\\\":{\\\"style\\\":229,\\\"text\\\":\\\"=SUM(N7)\\\"},\\\"14\\\":{\\\"style\\\":229,\\\"text\\\":\\\"=SUM(O7)\\\"},\\\"15\\\":{\\\"style\\\":229,\\\"text\\\":\\\"=SUM(P7)\\\"},\\\"16\\\":{\\\"style\\\":229,\\\"text\\\":\\\"=SUM(Q7)\\\"},\\\"17\\\":{\\\"style\\\":229,\\\"text\\\":\\\"=SUM(R7)\\\"},\\\"18\\\":{\\\"style\\\":229,\\\"text\\\":\\\"=SUM(S7)\\\"},\\\"19\\\":{\\\"style\\\":229,\\\"text\\\":\\\"=SUM(T7)\\\"},\\\"20\\\":{\\\"style\\\":229,\\\"text\\\":\\\"=SUM(U7)\\\"},\\\"21\\\":{\\\"style\\\":229,\\\"text\\\":\\\"=SUM(V8)\\\"},\\\"22\\\":{\\\"style\\\":229,\\\"text\\\":\\\"=SUM(W7)\\\"},\\\"23\\\":{\\\"style\\\":232,\\\"text\\\":\\\"=SUM(X7)\\\"},\\\"24\\\":{\\\"style\\\":229,\\\"text\\\":\\\"=SUM(Y7)\\\"}}},\\\"9\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"lineStart\\\":\\\"leftbottom\\\",\\\"text\\\":\\\"\\\"}}},\\\"len\\\":100},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"groupField\\\":\\\"laiyuan.class\\\",\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":1738,\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"bgcolor\\\":\\\"#02a274\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"bfbfbf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"隶书\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#f1f9f6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":9}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":9}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"华文中宋\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#f1f9f6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Arial\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#f1f9f6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"bgcolor\\\":\\\"#\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#aedac8\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"bgcolor\\\":\\\"#aedac8\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"number\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"normal\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":9}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":9}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#262626\\\",\\\"bgcolor\\\":\\\"#aedac8\\\"},{\\\"font\\\":{\\\"size\\\":10}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"normal\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"font\\\":{\\\"size\\\":10}},{\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"#aedac8\\\"},{\\\"bgcolor\\\":\\\"#02a274\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"bgcolor\\\":\\\"#02a274\\\",\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\"},{\\\"bgcolor\\\":\\\"#02a274\\\",\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"size\\\":9}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"size\\\":9},\\\"bgcolor\\\":\\\"#02a274\\\"},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"size\\\":9},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":9}},{\\\"color\\\":\\\"#000100\\\"},{\\\"bgcolor\\\":\\\"#02a274\\\",\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"size\\\":9},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"bgcolor\\\":\\\"\\\",\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"size\\\":9},\\\"bgcolor\\\":\\\"\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":9}},{\\\"color\\\":\\\"#000100\\\",\\\"bgcolor\\\":\\\"\\\"},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"size\\\":9},\\\"bgcolor\\\":\\\"\\\",\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":9}},{\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"bgcolor\\\":\\\"\\\",\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"size\\\":9},\\\"bgcolor\\\":\\\"\\\",\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"font\\\":{\\\"size\\\":9},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"bgcolor\\\":\\\"\\\",\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"size\\\":9},\\\"bgcolor\\\":\\\"\\\",\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"font\\\":{\\\"size\\\":9},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#756f6f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#756f6f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#756f6f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#756f6f\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#756f6f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#756f6f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#756f6f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#756f6f\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#756f6f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#756f6f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#756f6f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#756f6f\\\"]}},{\\\"bgcolor\\\":\\\"\\\",\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#756f6f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#756f6f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#756f6f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#756f6f\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"size\\\":9},\\\"bgcolor\\\":\\\"\\\",\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#756f6f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#756f6f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#756f6f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#756f6f\\\"]}},{\\\"font\\\":{\\\"size\\\":9},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#756f6f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#756f6f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#756f6f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#756f6f\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":9}},{\\\"bgcolor\\\":\\\"\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":10}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":10}},{\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"size\\\":10}},{\\\"color\\\":\\\"#000100\\\",\\\"bgcolor\\\":\\\"\\\",\\\"font\\\":{\\\"size\\\":10}},{\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"center\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]},\\\"font\\\":{\\\"size\\\":10}},{\\\"bgcolor\\\":\\\"\\\",\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"\\\",\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"bgcolor\\\":\\\"\\\",\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"color\\\":\\\"#000100\\\",\\\"bgcolor\\\":\\\"\\\",\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"bgcolor\\\":\\\"\\\",\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"\\\",\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"color\\\":\\\"#000100\\\",\\\"bgcolor\\\":\\\"\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":10}},{\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"#\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":9}},{\\\"bgcolor\\\":\\\"#\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"#\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#\\\"},{\\\"bgcolor\\\":\\\"#\\\",\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"#\\\",\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"#\\\",\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]},\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"#\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"#\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":10}},{\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":9}},{\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]},\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10},\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"color\\\":\\\"#000100\\\",\\\"bgcolor\\\":\\\"#fffff\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#fffff\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#fffff\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#fffff\\\"},{\\\"textwrap\\\":true,\\\"bgcolor\\\":\\\"#fffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#fffff\\\"},{\\\"color\\\":\\\"#000100\\\",\\\"bgcolor\\\":\\\"#ffff\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#ffff\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ffff\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ffff\\\"},{\\\"textwrap\\\":true,\\\"bgcolor\\\":\\\"#ffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ffff\\\"},{\\\"color\\\":\\\"#000100\\\",\\\"bgcolor\\\":\\\"#fff\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#fff\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#fff\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#fff\\\"},{\\\"textwrap\\\":true,\\\"bgcolor\\\":\\\"#fff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#fff\\\"},{\\\"color\\\":\\\"#000100\\\",\\\"bgcolor\\\":\\\"#ff\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#ff\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ff\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ff\\\"},{\\\"textwrap\\\":true,\\\"bgcolor\\\":\\\"#ff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ff\\\"},{\\\"color\\\":\\\"#000100\\\",\\\"bgcolor\\\":\\\"#f\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#f\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#f\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#f\\\"},{\\\"textwrap\\\":true,\\\"bgcolor\\\":\\\"#f\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#f\\\"},{\\\"color\\\":\\\"#000100\\\",\\\"bgcolor\\\":\\\"#\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#\\\"},{\\\"textwrap\\\":true,\\\"bgcolor\\\":\\\"#\\\"},{\\\"color\\\":\\\"#000100\\\",\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"textwrap\\\":true,\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9}},{\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"size\\\":9},\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9},\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"size\\\":9},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"size\\\":9},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]},\\\"font\\\":{\\\"size\\\":9},\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"textwrap\\\":true,\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#aedac8\\\"},{\\\"bgcolor\\\":\\\"#aedac8\\\"},{\\\"bgcolor\\\":\\\"#fffff\\\"},{\\\"bgcolor\\\":\\\"#ffff\\\"},{\\\"bgcolor\\\":\\\"#fff\\\"},{\\\"bgcolor\\\":\\\"#ff\\\"},{\\\"bgcolor\\\":\\\"#f\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"font\\\":{\\\"size\\\":8}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"font\\\":{\\\"size\\\":9},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Arial\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#f1f9f6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":9}},{\\\"bgcolor\\\":\\\"#02a274\\\",\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"bgcolor\\\":\\\"\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"bgcolor\\\":\\\"aedac8\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"aedac8\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"size\\\":8}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"size\\\":8}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"bgcolor\\\":\\\"#\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"bgcolor\\\":\\\"##aedac8\\\"},{\\\"bgcolor\\\":\\\"##aedac8\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"font\\\":{\\\"size\\\":8}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"font\\\":{\\\"size\\\":8}},{\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"left\\\"},{\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":10}},{\\\"bgcolor\\\":\\\"#02a274\\\",\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]}},{\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":10}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#f1f9f6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"size\\\":10}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"size\\\":10}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"font\\\":{\\\"size\\\":10}},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":10}},{\\\"textwrap\\\":true,\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":10}},{\\\"bgcolor\\\":\\\"#aedac8\\\",\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#f1f9f6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"font\\\":{\\\"size\\\":8}}],\\\"validations\\\":[],\\\"isGroup\\\":true,\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":20},\\\"1\\\":{\\\"width\\\":84},\\\"2\\\":{\\\"width\\\":132},\\\"3\\\":{\\\"width\\\":75},\\\"4\\\":{\\\"width\\\":63},\\\"5\\\":{\\\"width\\\":59},\\\"6\\\":{\\\"width\\\":70},\\\"7\\\":{\\\"width\\\":61},\\\"8\\\":{\\\"width\\\":60},\\\"9\\\":{\\\"width\\\":75},\\\"10\\\":{\\\"width\\\":75},\\\"11\\\":{\\\"width\\\":64},\\\"12\\\":{\\\"width\\\":70},\\\"13\\\":{\\\"width\\\":63},\\\"14\\\":{\\\"width\\\":86},\\\"15\\\":{\\\"width\\\":64},\\\"16\\\":{\\\"width\\\":58},\\\"17\\\":{\\\"width\\\":63},\\\"18\\\":{\\\"width\\\":60},\\\"19\\\":{\\\"width\\\":63},\\\"20\\\":{\\\"width\\\":59},\\\"21\\\":{\\\"width\\\":73},\\\"22\\\":{\\\"width\\\":82},\\\"23\\\":{\\\"width\\\":73},\\\"24\\\":{\\\"width\\\":86},\\\"len\\\":50},\\\"merges\\\":[\\\"B1:X1\\\",\\\"D3:D6\\\",\\\"E5:E6\\\",\\\"F5:F6\\\",\\\"E4:F4\\\",\\\"G4:G6\\\",\\\"H4:H6\\\",\\\"I5:I6\\\",\\\"J5:K5\\\",\\\"I4:K4\\\",\\\"E3:K3\\\",\\\"L3:L6\\\",\\\"D2:L2\\\",\\\"M4:M6\\\",\\\"N5:N6\\\",\\\"O5:O6\\\",\\\"P5:P6\\\",\\\"Q5:Q6\\\",\\\"N4:Q4\\\",\\\"M3:Q3\\\",\\\"R4:R6\\\",\\\"R3:T3\\\",\\\"S4:T4\\\",\\\"S5:S6\\\",\\\"T5:T6\\\",\\\"U4:U6\\\",\\\"V4:W4\\\",\\\"V5:V6\\\",\\\"W5:W6\\\",\\\"X4:Y4\\\",\\\"X5:X6\\\",\\\"Y5:Y6\\\",\\\"U3:Y3\\\",\\\"M2:T2\\\",\\\"U2:Y2\\\",\\\"B2:B6\\\",\\\"C2:C6\\\",\\\"B8:C8\\\"]}', NULL, 'https://static.jeecg.com/designreport/images/jingfei_1607069843358.png', 'admin', '2020-12-03 16:54:17', 'admin', '2021-02-03 13:59:08', 0, NULL, NULL, 1, 443, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('1334457419857793024', '20201203192154', '超市各地区销售额', NULL, NULL, '984272091947253760', '{\\\"loopBlockList\\\":[],\\\"area\\\":{\\\"sri\\\":1,\\\"sci\\\":26,\\\"eri\\\":4,\\\"eci\\\":28,\\\"width\\\":300,\\\"height\\\":100},\\\"excel_config_id\\\":\\\"1334457419857793024\\\",\\\"printConfig\\\":{\\\"paper\\\":\\\"A4\\\",\\\"width\\\":210,\\\"height\\\":297,\\\"definition\\\":1,\\\"isBackend\\\":false,\\\"marginX\\\":10,\\\"marginY\\\":10},\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"各地区商品销售额一栏表\\\",\\\"merge\\\":[0,18],\\\"style\\\":13}},\\\"height\\\":82},\\\"1\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"地区/类别/时间\\\",\\\"merge\\\":[1,1],\\\"style\\\":46},\\\"3\\\":{\\\"text\\\":\\\"2020年\\\",\\\"style\\\":46,\\\"merge\\\":[0,12]},\\\"16\\\":{\\\"text\\\":\\\"2019年\\\",\\\"style\\\":46,\\\"merge\\\":[0,9]}}},\\\"2\\\":{\\\"cells\\\":{\\\"3\\\":{\\\"text\\\":\\\"12月\\\",\\\"style\\\":46},\\\"4\\\":{\\\"text\\\":\\\"11月\\\",\\\"style\\\":46},\\\"5\\\":{\\\"text\\\":\\\"10月\\\",\\\"style\\\":46},\\\"6\\\":{\\\"text\\\":\\\"9月\\\",\\\"style\\\":46},\\\"7\\\":{\\\"text\\\":\\\"8月\\\",\\\"style\\\":46},\\\"8\\\":{\\\"text\\\":\\\"7月\\\",\\\"style\\\":46},\\\"9\\\":{\\\"text\\\":\\\"6月\\\",\\\"style\\\":46},\\\"10\\\":{\\\"text\\\":\\\"5月\\\",\\\"style\\\":46},\\\"11\\\":{\\\"text\\\":\\\"4月\\\",\\\"style\\\":46},\\\"12\\\":{\\\"text\\\":\\\"3月\\\",\\\"style\\\":46},\\\"13\\\":{\\\"text\\\":\\\"2月\\\",\\\"style\\\":46},\\\"14\\\":{\\\"text\\\":\\\"1月\\\",\\\"style\\\":46},\\\"15\\\":{\\\"text\\\":\\\"本年小计\\\",\\\"style\\\":46},\\\"16\\\":{\\\"text\\\":\\\"12月\\\",\\\"style\\\":46},\\\"17\\\":{\\\"text\\\":\\\"11月\\\",\\\"style\\\":46},\\\"18\\\":{\\\"text\\\":\\\"10月\\\",\\\"style\\\":46},\\\"19\\\":{\\\"text\\\":\\\"9月\\\",\\\"style\\\":46},\\\"20\\\":{\\\"text\\\":\\\"8月\\\",\\\"style\\\":46},\\\"21\\\":{\\\"text\\\":\\\"7月\\\",\\\"style\\\":46},\\\"22\\\":{\\\"text\\\":\\\"6月\\\",\\\"style\\\":46},\\\"23\\\":{\\\"text\\\":\\\"5月\\\",\\\"style\\\":46},\\\"24\\\":{\\\"text\\\":\\\"4月\\\",\\\"style\\\":46},\\\"25\\\":{\\\"text\\\":\\\"本年小计\\\",\\\"style\\\":46}}},\\\"3\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"#{xiaoshou.group(diqu)}\\\",\\\"style\\\":51,\\\"aggregate\\\":\\\"group\\\"},\\\"2\\\":{\\\"text\\\":\\\"#{xiaoshou.class}\\\",\\\"style\\\":51},\\\"3\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_11}\\\",\\\"style\\\":20},\\\"4\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_12}\\\",\\\"style\\\":20},\\\"5\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_13}\\\",\\\"style\\\":20},\\\"6\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_14}\\\",\\\"style\\\":20},\\\"7\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_15}\\\",\\\"style\\\":20},\\\"8\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_16}\\\",\\\"style\\\":20},\\\"9\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_17}\\\",\\\"style\\\":20},\\\"10\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_18}\\\",\\\"style\\\":20},\\\"11\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_19}\\\",\\\"style\\\":20},\\\"12\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_20}\\\",\\\"style\\\":20},\\\"13\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_21}\\\",\\\"style\\\":20},\\\"14\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_22}\\\",\\\"style\\\":20},\\\"15\\\":{\\\"style\\\":48,\\\"text\\\":\\\"=SUM(D4:O4)\\\"},\\\"16\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_31}\\\",\\\"style\\\":20},\\\"17\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_32}\\\",\\\"style\\\":20},\\\"18\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_33}\\\",\\\"style\\\":20},\\\"19\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_34}\\\",\\\"style\\\":20},\\\"20\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_35}\\\",\\\"style\\\":20},\\\"21\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_36}\\\",\\\"style\\\":20},\\\"22\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_37}\\\",\\\"style\\\":20},\\\"23\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_38}\\\",\\\"style\\\":20},\\\"24\\\":{\\\"text\\\":\\\"#{xiaoshou.sales_39}\\\",\\\"style\\\":20},\\\"25\\\":{\\\"style\\\":48,\\\"text\\\":\\\"=SUM(Q4:Y4)\\\"}},\\\"isDrag\\\":true},\\\"4\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"合计\\\",\\\"style\\\":52,\\\"rendered\\\":\\\"\\\",\\\"merge\\\":[0,1]},\\\"3\\\":{\\\"text\\\":\\\"=SUM(D4)\\\",\\\"style\\\":55},\\\"4\\\":{\\\"text\\\":\\\"=SUM(E4)\\\",\\\"style\\\":55},\\\"5\\\":{\\\"text\\\":\\\"=SUM(F4)\\\",\\\"style\\\":55},\\\"6\\\":{\\\"text\\\":\\\"=SUM(G4)\\\",\\\"style\\\":55},\\\"7\\\":{\\\"text\\\":\\\"=SUM(H4)\\\",\\\"style\\\":55},\\\"8\\\":{\\\"text\\\":\\\"=SUM(I4)\\\",\\\"style\\\":55},\\\"9\\\":{\\\"text\\\":\\\"=SUM(J4)\\\",\\\"style\\\":55},\\\"10\\\":{\\\"text\\\":\\\"=SUM(K4)\\\",\\\"style\\\":55},\\\"11\\\":{\\\"text\\\":\\\"=SUM(L4)\\\",\\\"style\\\":55},\\\"12\\\":{\\\"text\\\":\\\"=SUM(M4)\\\",\\\"style\\\":55},\\\"13\\\":{\\\"text\\\":\\\"=SUM(N4)\\\",\\\"style\\\":55},\\\"14\\\":{\\\"text\\\":\\\"=SUM(O4)\\\",\\\"style\\\":55},\\\"15\\\":{\\\"text\\\":\\\"=SUM(P4)\\\",\\\"style\\\":55},\\\"16\\\":{\\\"text\\\":\\\"=SUM(Q4)\\\",\\\"style\\\":55},\\\"17\\\":{\\\"text\\\":\\\"=SUM(R4)\\\",\\\"style\\\":55},\\\"18\\\":{\\\"text\\\":\\\"=SUM(S4)\\\",\\\"style\\\":55},\\\"19\\\":{\\\"text\\\":\\\"=SUM(T4)\\\",\\\"style\\\":55},\\\"20\\\":{\\\"text\\\":\\\"=SUM(U4)\\\",\\\"style\\\":55},\\\"21\\\":{\\\"text\\\":\\\"=SUM(V4)\\\",\\\"style\\\":55},\\\"22\\\":{\\\"text\\\":\\\"=SUM(W4)\\\",\\\"style\\\":55},\\\"23\\\":{\\\"text\\\":\\\"=SUM(X4)\\\",\\\"style\\\":55},\\\"24\\\":{\\\"text\\\":\\\"=SUM(Y4)\\\",\\\"style\\\":55},\\\"25\\\":{\\\"text\\\":\\\"=SUM(Z4)\\\",\\\"style\\\":55}},\\\"isDrag\\\":true},\\\"len\\\":100},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"groupField\\\":\\\"xiaoshou.diqu\\\",\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":2464,\\\"displayConfig\\\":{},\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"bgcolor\\\":\\\"#\\\"},{\\\"bgcolor\\\":\\\"#d7f2f9\\\"},{\\\"bgcolor\\\":\\\"#d7f2f9\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#\\\"},{\\\"bgcolor\\\":\\\"#d7f2f9\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"2896ea\\\"],\\\"top\\\":[\\\"thin\\\",\\\"2896ea\\\"],\\\"left\\\":[\\\"thin\\\",\\\"2896ea\\\"],\\\"right\\\":[\\\"thin\\\",\\\"2896ea\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"2896ea\\\"],\\\"top\\\":[\\\"thin\\\",\\\"2896ea\\\"],\\\"left\\\":[\\\"thin\\\",\\\"2896ea\\\"],\\\"right\\\":[\\\"thin\\\",\\\"2896ea\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"2896ea\\\"],\\\"top\\\":[\\\"thin\\\",\\\"2896ea\\\"],\\\"left\\\":[\\\"thin\\\",\\\"2896ea\\\"],\\\"right\\\":[\\\"thin\\\",\\\"2896ea\\\"]}},{\\\"bgcolor\\\":\\\"#d7f2f9\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#2896ea\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#2896ea\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#2896ea\\\"]}},{\\\"font\\\":{\\\"bold\\\":true}},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":16}},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":16},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#2896ea\\\"]},\\\"font\\\":{\\\"size\\\":8}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#2896ea\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#2896ea\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"number\\\"},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#2896ea\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#2896ea\\\"]}},{\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"number\\\"},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#9cc2e6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#9cc2e6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#9cc2e6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#9cc2e6\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#9cc2e6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#9cc2e6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#9cc2e6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#9cc2e6\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#9cc2e6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#9cc2e6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#9cc2e6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#9cc2e6\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"number\\\"},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#4371c6\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#4371c6\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#4371c6\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"number\\\"},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"]}},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"number\\\"},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#e7e5e6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#e7e5e6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#e7e5e6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#e7e5e6\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#e7e5e6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#e7e5e6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#e7e5e6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#e7e5e6\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#e7e5e6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#e7e5e6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#e7e5e6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#e7e5e6\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"number\\\"},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d0cecf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d0cecf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d0cecf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d0cecf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d0cecf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d0cecf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d0cecf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d0cecf\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d0cecf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d0cecf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d0cecf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d0cecf\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"number\\\"},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d0cecf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d0cecf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d0cecf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d0cecf\\\"]},\\\"color\\\":\\\"#ffffff\\\"},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#afabac\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#afabac\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#afabac\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#afabac\\\"]},\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#afabac\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#afabac\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#afabac\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#afabac\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#afabac\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#afabac\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#afabac\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#afabac\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"number\\\"},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#f2f2f2\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#f2f2f2\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#f2f2f2\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#f2f2f2\\\"]},\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#f2f2f2\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#f2f2f2\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#f2f2f2\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#f2f2f2\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#f2f2f2\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#f2f2f2\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#f2f2f2\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#f2f2f2\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"number\\\"},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#d7f2f9\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"number\\\",\\\"bgcolor\\\":\\\"#deeaf6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"number\\\",\\\"bgcolor\\\":\\\"#bdd7ee\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#d7f2f9\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#d7f2f9\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#bdd7ee\\\"},{\\\"bgcolor\\\":\\\"#bdd7ee\\\"},{\\\"bgcolor\\\":\\\"#bdd7ee\\\",\\\"format\\\":\\\"number\\\"},{\\\"bgcolor\\\":\\\"#bdd7ee\\\",\\\"format\\\":\\\"number\\\",\\\"align\\\":\\\"center\\\"}],\\\"validations\\\":[],\\\"isGroup\\\":true,\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":21},\\\"1\\\":{\\\"width\\\":63},\\\"2\\\":{\\\"width\\\":85},\\\"3\\\":{\\\"width\\\":95},\\\"4\\\":{\\\"width\\\":83},\\\"5\\\":{\\\"width\\\":81},\\\"6\\\":{\\\"width\\\":88},\\\"7\\\":{\\\"width\\\":89},\\\"8\\\":{\\\"width\\\":87},\\\"9\\\":{\\\"width\\\":95},\\\"10\\\":{\\\"width\\\":92},\\\"11\\\":{\\\"width\\\":95},\\\"12\\\":{\\\"width\\\":96},\\\"13\\\":{\\\"width\\\":98},\\\"14\\\":{\\\"width\\\":98},\\\"15\\\":{\\\"width\\\":78},\\\"16\\\":{\\\"width\\\":110},\\\"17\\\":{\\\"width\\\":111},\\\"18\\\":{\\\"width\\\":102},\\\"19\\\":{\\\"width\\\":102},\\\"20\\\":{\\\"width\\\":114},\\\"21\\\":{\\\"width\\\":111},\\\"22\\\":{\\\"width\\\":113},\\\"23\\\":{\\\"width\\\":107},\\\"24\\\":{\\\"width\\\":115},\\\"25\\\":{\\\"width\\\":135},\\\"len\\\":49},\\\"merges\\\":[\\\"D2:P2\\\",\\\"B2:C3\\\",\\\"Q2:Z2\\\",\\\"B1:T1\\\",\\\"B5:C5\\\"]}', NULL, 'https://static.jeecg.com/designreport/images/chaoshi_1607069609875.png', 'admin', '2020-12-03 19:21:55', 'admin', '2021-04-05 18:47:20', 0, NULL, NULL, 1, 376, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('1334696790477377536', '20201204111149', '学校收入一览表', NULL, NULL, '984272091947253760', '{\\\"loopBlockList\\\":[],\\\"area\\\":{\\\"sri\\\":1,\\\"sci\\\":24,\\\"eri\\\":5,\\\"eci\\\":24,\\\"width\\\":100,\\\"height\\\":138},\\\"excel_config_id\\\":\\\"1334696790477377536\\\",\\\"printConfig\\\":{\\\"paper\\\":\\\"A4\\\",\\\"width\\\":210,\\\"height\\\":297,\\\"definition\\\":1,\\\"isBackend\\\":false,\\\"marginX\\\":10,\\\"marginY\\\":10},\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"学校收入一览表\\\",\\\"merge\\\":[0,13],\\\"style\\\":25}},\\\"height\\\":71},\\\"1\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"校园信息\\\",\\\"merge\\\":[1,2],\\\"style\\\":40},\\\"4\\\":{\\\"text\\\":\\\"学生信息\\\",\\\"merge\\\":[1,2],\\\"style\\\":40},\\\"7\\\":{\\\"merge\\\":[1,5],\\\"style\\\":42,\\\"text\\\":\\\"收款信息\\\"},\\\"13\\\":{\\\"merge\\\":[0,10],\\\"text\\\":\\\"确认收入信息\\\",\\\"style\\\":43}},\\\"height\\\":23},\\\"2\\\":{\\\"cells\\\":{\\\"13\\\":{\\\"merge\\\":[0,3],\\\"text\\\":\\\"2020.09\\\",\\\"style\\\":46},\\\"17\\\":{\\\"merge\\\":[0,3],\\\"text\\\":\\\"2020.10\\\",\\\"style\\\":46},\\\"21\\\":{\\\"text\\\":\\\"合计\\\",\\\"style\\\":46,\\\"merge\\\":[0,2]}},\\\"height\\\":40},\\\"3\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"所属城际\\\",\\\"style\\\":50},\\\"2\\\":{\\\"text\\\":\\\"所属校园\\\",\\\"style\\\":50},\\\"3\\\":{\\\"text\\\":\\\"NC帐套\\\",\\\"style\\\":50},\\\"4\\\":{\\\"text\\\":\\\"学号\\\",\\\"style\\\":50},\\\"5\\\":{\\\"text\\\":\\\"姓名\\\",\\\"style\\\":50},\\\"6\\\":{\\\"text\\\":\\\"性质\\\",\\\"style\\\":50},\\\"7\\\":{\\\"text\\\":\\\"缴费金额\\\",\\\"style\\\":50},\\\"8\\\":{\\\"text\\\":\\\"缴费时间\\\",\\\"style\\\":50},\\\"9\\\":{\\\"text\\\":\\\"缴费性质\\\",\\\"style\\\":50},\\\"10\\\":{\\\"text\\\":\\\"缴费所属期间\\\",\\\"style\\\":50},\\\"11\\\":{\\\"text\\\":\\\"缴费月份数\\\",\\\"style\\\":50},\\\"12\\\":{\\\"text\\\":\\\"缴费方式\\\",\\\"style\\\":50},\\\"13\\\":{\\\"text\\\":\\\"全部\\\",\\\"style\\\":50},\\\"14\\\":{\\\"text\\\":\\\"学费\\\",\\\"style\\\":50},\\\"15\\\":{\\\"text\\\":\\\"餐费\\\",\\\"style\\\":50},\\\"16\\\":{\\\"text\\\":\\\"校车费\\\",\\\"style\\\":50},\\\"17\\\":{\\\"text\\\":\\\"全部\\\",\\\"style\\\":50},\\\"18\\\":{\\\"text\\\":\\\"学费\\\",\\\"style\\\":50},\\\"19\\\":{\\\"text\\\":\\\"餐费\\\",\\\"style\\\":50},\\\"20\\\":{\\\"text\\\":\\\"校车费\\\",\\\"style\\\":50},\\\"21\\\":{\\\"text\\\":\\\"全部\\\",\\\"style\\\":50},\\\"22\\\":{\\\"text\\\":\\\"学费\\\",\\\"style\\\":50},\\\"23\\\":{\\\"text\\\":\\\"餐费\\\",\\\"style\\\":50}}},\\\"4\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"#{shouru.group(city)}\\\",\\\"style\\\":45,\\\"aggregate\\\":\\\"group\\\"},\\\"2\\\":{\\\"text\\\":\\\"#{shouru.group(school)}\\\",\\\"style\\\":45,\\\"aggregate\\\":\\\"group\\\"},\\\"3\\\":{\\\"text\\\":\\\"#{shouru.group(ncnum)}\\\",\\\"style\\\":35,\\\"aggregate\\\":\\\"group\\\"},\\\"4\\\":{\\\"text\\\":\\\"#{shouru.num}\\\",\\\"style\\\":35},\\\"5\\\":{\\\"text\\\":\\\"#{shouru.name}\\\",\\\"style\\\":35},\\\"6\\\":{\\\"text\\\":\\\"#{shouru.class}\\\",\\\"style\\\":35},\\\"7\\\":{\\\"text\\\":\\\"#{shouru.pay}\\\",\\\"style\\\":35},\\\"8\\\":{\\\"text\\\":\\\"#{shouru.paytime}\\\",\\\"style\\\":35},\\\"9\\\":{\\\"text\\\":\\\"#{shouru.payclass}\\\",\\\"style\\\":35},\\\"10\\\":{\\\"text\\\":\\\"#{shouru.pay1}\\\",\\\"style\\\":35},\\\"11\\\":{\\\"text\\\":\\\"#{shouru.paymoth}\\\",\\\"style\\\":35},\\\"12\\\":{\\\"text\\\":\\\"#{shouru.pay2}\\\",\\\"style\\\":35},\\\"13\\\":{\\\"style\\\":33,\\\"text\\\":\\\"=SUM(O5:Q5)\\\"},\\\"14\\\":{\\\"text\\\":\\\"#{shouru.tuition_09}\\\",\\\"style\\\":35},\\\"15\\\":{\\\"text\\\":\\\"#{shouru.meals_09}\\\",\\\"style\\\":35},\\\"16\\\":{\\\"text\\\":\\\"#{shouru.busfee_09}\\\",\\\"style\\\":35},\\\"17\\\":{\\\"style\\\":33,\\\"text\\\":\\\"=SUM(S5:U5)\\\"},\\\"18\\\":{\\\"text\\\":\\\"#{shouru.tuition_10}\\\",\\\"style\\\":35},\\\"19\\\":{\\\"text\\\":\\\"#{shouru.meals_10}\\\",\\\"style\\\":35},\\\"20\\\":{\\\"text\\\":\\\"#{shouru.busfee_10}\\\",\\\"style\\\":35},\\\"21\\\":{\\\"style\\\":33,\\\"text\\\":\\\"=SUM(W5,X5)\\\"},\\\"22\\\":{\\\"style\\\":35,\\\"text\\\":\\\"=SUM(O5,S5)\\\"},\\\"23\\\":{\\\"style\\\":35,\\\"text\\\":\\\"=SUM(P5,T5)\\\"}},\\\"isDrag\\\":true,\\\"height\\\":25},\\\"5\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":66,\\\"text\\\":\\\"合计\\\"},\\\"2\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":66},\\\"3\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"15\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"16\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"17\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"18\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":66},\\\"19\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"20\\\":{\\\"style\\\":66,\\\"text\\\":\\\" \\\"},\\\"21\\\":{\\\"style\\\":15,\\\"text\\\":\\\"=SUM(V5)\\\"},\\\"22\\\":{\\\"style\\\":15,\\\"text\\\":\\\"=SUM(W5)\\\"},\\\"23\\\":{\\\"style\\\":15,\\\"text\\\":\\\"=SUM(X5)\\\"}}},\\\"9\\\":{\\\"cells\\\":{}},\\\"11\\\":{\\\"cells\\\":{}},\\\"len\\\":101},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"groupField\\\":\\\"shouru.city\\\",\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":1881,\\\"displayConfig\\\":{},\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#309fc6\\\"},{\\\"bgcolor\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#309fc6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#b2ddec\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#309fc6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":8}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#b2ddec\\\",\\\"font\\\":{\\\"size\\\":8}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#309fc6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#b2ddec\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#309fc6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":10}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#309fc6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#309fc6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#b2ddec\\\",\\\"font\\\":{\\\"size\\\":9},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#b2ddec\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"font\\\":{\\\"size\\\":9}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#dff2f9\\\"},{\\\"bgcolor\\\":\\\"\\\"},{\\\"bgcolor\\\":\\\"#309fc6\\\"},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#dff2f9\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#b2ddec\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#dff2f9\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"b2ddec\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"￥b2ddec\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":8}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#b2ddec\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#dff2f9\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":8}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#dff2f9\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#d7f2f9\\\",\\\"font\\\":{\\\"size\\\":9},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#d7f2f9\\\",\\\"font\\\":{\\\"size\\\":8},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#bdd7ee\\\",\\\"font\\\":{\\\"size\\\":9},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"font\\\":{\\\"size\\\":8}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#bdd7ee\\\",\\\"font\\\":{\\\"size\\\":8},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"font\\\":{\\\"size\\\":10}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#bdd7ee\\\",\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":10}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#d7f2f9\\\",\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":10}},{\\\"font\\\":{\\\"size\\\":12}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#bdd7ee\\\",\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#d7f2f9\\\",\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12}},{\\\"font\\\":{\\\"size\\\":10.5}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#bdd7ee\\\",\\\"font\\\":{\\\"size\\\":10.5},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":10.5}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#d7f2f9\\\",\\\"font\\\":{\\\"size\\\":10.5},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":10.5}},{\\\"align\\\":\\\"left\\\",\\\"bgcolor\\\":\\\"#b2ddec\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"align\\\":\\\"left\\\"}],\\\"validations\\\":[],\\\"isGroup\\\":true,\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":37},\\\"1\\\":{\\\"width\\\":79},\\\"2\\\":{\\\"width\\\":87},\\\"3\\\":{\\\"width\\\":79},\\\"4\\\":{\\\"width\\\":92},\\\"5\\\":{\\\"width\\\":90},\\\"6\\\":{\\\"width\\\":77},\\\"7\\\":{\\\"width\\\":83},\\\"8\\\":{\\\"width\\\":89},\\\"9\\\":{\\\"width\\\":79},\\\"10\\\":{\\\"width\\\":89},\\\"11\\\":{\\\"width\\\":84},\\\"12\\\":{\\\"width\\\":76},\\\"13\\\":{\\\"width\\\":67},\\\"14\\\":{\\\"width\\\":74},\\\"15\\\":{\\\"width\\\":69},\\\"16\\\":{\\\"width\\\":74},\\\"17\\\":{\\\"width\\\":68},\\\"18\\\":{\\\"width\\\":76},\\\"19\\\":{\\\"width\\\":79},\\\"20\\\":{\\\"width\\\":78},\\\"21\\\":{\\\"width\\\":74},\\\"22\\\":{\\\"width\\\":81},\\\"len\\\":49},\\\"merges\\\":[\\\"B2:D3\\\",\\\"E2:G3\\\",\\\"H2:M3\\\",\\\"N3:Q3\\\",\\\"R3:U3\\\",\\\"V3:X3\\\",\\\"N2:X2\\\",\\\"B1:O1\\\"]}', NULL, 'https://static.jeecg.com/designreport/images/xuexiao_1607069724407.png', 'admin', '2020-12-04 11:11:50', 'admin', '2021-04-01 02:46:23', 0, NULL, NULL, 1, 434, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('1334757703079301120', '20201204151358', '车间零件完工一览表', NULL, NULL, '984272091947253760', '{\\\"loopBlockList\\\":[],\\\"area\\\":false,\\\"printElWidth\\\":718,\\\"excel_config_id\\\":\\\"1334757703079301120\\\",\\\"printElHeight\\\":1047,\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"车间零件完工一览表\\\",\\\"merge\\\":[0,12],\\\"style\\\":23}},\\\"height\\\":81},\\\"1\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":11},\\\"1\\\":{\\\"text\\\":\\\"车间\\\",\\\"style\\\":22},\\\"2\\\":{\\\"text\\\":\\\"成品名称\\\",\\\"style\\\":22},\\\"3\\\":{\\\"text\\\":\\\"半成品名称\\\",\\\"style\\\":22},\\\"4\\\":{\\\"text\\\":\\\"完工时间\\\",\\\"style\\\":22},\\\"5\\\":{\\\"text\\\":\\\"状态\\\",\\\"style\\\":22},\\\"6\\\":{\\\"text\\\":\\\"成品属性\\\",\\\"style\\\":22},\\\"7\\\":{\\\"text\\\":\\\"工单号\\\",\\\"style\\\":22},\\\"8\\\":{\\\"text\\\":\\\"工单数量\\\",\\\"style\\\":22},\\\"9\\\":{\\\"text\\\":\\\"计划数量\\\",\\\"style\\\":22},\\\"10\\\":{\\\"text\\\":\\\"完成数量\\\",\\\"style\\\":22},\\\"11\\\":{\\\"text\\\":\\\"UPH\\\",\\\"style\\\":22},\\\"12\\\":{\\\"text\\\":\\\"H/C\\\",\\\"style\\\":22},\\\"13\\\":{\\\"text\\\":\\\"计划时间\\\",\\\"style\\\":22},\\\"14\\\":{\\\"text\\\":\\\"良率\\\",\\\"style\\\":22},\\\"15\\\":{\\\"text\\\":\\\"备注\\\",\\\"style\\\":22},\\\"16\\\":{\\\"style\\\":11},\\\"17\\\":{\\\"style\\\":11},\\\"18\\\":{\\\"style\\\":11},\\\"19\\\":{\\\"style\\\":11},\\\"20\\\":{\\\"style\\\":11},\\\"21\\\":{\\\"style\\\":11},\\\"22\\\":{\\\"style\\\":11},\\\"23\\\":{\\\"style\\\":11},\\\"24\\\":{\\\"style\\\":11},\\\"25\\\":{\\\"style\\\":11},\\\"26\\\":{\\\"style\\\":11}},\\\"height\\\":55},\\\"2\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":13},\\\"1\\\":{\\\"text\\\":\\\"#{chejian.group(city)}\\\",\\\"style\\\":16,\\\"aggregate\\\":\\\"group\\\"},\\\"2\\\":{\\\"text\\\":\\\"#{chejian.finish}\\\",\\\"style\\\":14},\\\"3\\\":{\\\"text\\\":\\\"#{chejian.semifinish}\\\",\\\"style\\\":14},\\\"4\\\":{\\\"text\\\":\\\"#{chejian.time}\\\",\\\"style\\\":14},\\\"5\\\":{\\\"text\\\":\\\"#{chejian.state}\\\",\\\"style\\\":14},\\\"6\\\":{\\\"text\\\":\\\"#{chejian.attribute}\\\",\\\"style\\\":14},\\\"7\\\":{\\\"text\\\":\\\"#{chejian.num}\\\",\\\"style\\\":14},\\\"8\\\":{\\\"text\\\":\\\"#{chejian.gnum}\\\",\\\"style\\\":14},\\\"9\\\":{\\\"text\\\":\\\"#{chejian.jnum}\\\",\\\"style\\\":14},\\\"10\\\":{\\\"text\\\":\\\"#{chejian.wnum}\\\",\\\"style\\\":14},\\\"11\\\":{\\\"text\\\":\\\"#{chejian.uph}\\\",\\\"style\\\":14},\\\"12\\\":{\\\"text\\\":\\\"#{chejian.hc}\\\",\\\"style\\\":14},\\\"13\\\":{\\\"text\\\":\\\"#{chejian.jtime}\\\",\\\"style\\\":14},\\\"14\\\":{\\\"text\\\":\\\"#{chejian.yield}\\\",\\\"style\\\":14},\\\"15\\\":{\\\"text\\\":\\\"#{chejian.beizhu}\\\",\\\"style\\\":14},\\\"16\\\":{\\\"style\\\":13},\\\"17\\\":{\\\"style\\\":13},\\\"18\\\":{\\\"style\\\":13},\\\"19\\\":{\\\"style\\\":13},\\\"20\\\":{\\\"style\\\":13},\\\"21\\\":{\\\"style\\\":13},\\\"22\\\":{\\\"style\\\":13},\\\"23\\\":{\\\"style\\\":13},\\\"24\\\":{\\\"style\\\":13},\\\"25\\\":{\\\"style\\\":13},\\\"26\\\":{\\\"style\\\":13}},\\\"isDrag\\\":true,\\\"height\\\":35},\\\"len\\\":100},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"groupField\\\":\\\"chejian.city\\\",\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":1494,\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#309fc6\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#309fc6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"bgcolor\\\":\\\"#309fc6\\\"},{\\\"bgcolor\\\":\\\"#309fc6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#309fc6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"bgcolor\\\":\\\"#309fc6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"font\\\":{\\\"bold\\\":true}},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":16}},{\\\"font\\\":{\\\"size\\\":9}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9}},{\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#b2ddec\\\"},{\\\"font\\\":{\\\"size\\\":8}},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#309fc6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8}},{\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#b2ddec\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#309fc6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9}},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":16},\\\"align\\\":\\\"center\\\"}],\\\"validations\\\":[],\\\"isGroup\\\":true,\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":45},\\\"1\\\":{\\\"width\\\":106},\\\"2\\\":{\\\"width\\\":121},\\\"3\\\":{\\\"width\\\":124},\\\"4\\\":{\\\"width\\\":87},\\\"5\\\":{\\\"width\\\":76},\\\"6\\\":{\\\"width\\\":82},\\\"7\\\":{\\\"width\\\":81},\\\"8\\\":{\\\"width\\\":69},\\\"9\\\":{\\\"width\\\":76},\\\"10\\\":{\\\"width\\\":81},\\\"15\\\":{\\\"width\\\":146},\\\"len\\\":50},\\\"merges\\\":[\\\"B1:N1\\\"]}', NULL, 'https://static.jeecg.com/designreport/images/QQ截图20201216185352_1608116050060.png', 'admin', '2020-12-04 15:13:58', 'admin', '2021-04-05 18:47:24', 0, NULL, NULL, 1, 523, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('1338370016550195200', '20201214142804', '条形码报表', NULL, NULL, '984272091947253760', '{\\\"loopBlockList\\\":[],\\\"area\\\":false,\\\"printElWidth\\\":718,\\\"excel_config_id\\\":\\\"1338370016550195200\\\",\\\"printElHeight\\\":1047,\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[1,3],\\\"text\\\":\\\"居民身份证申领登记表\\\",\\\"style\\\":39},\\\"2\\\":{\\\"style\\\":39},\\\"3\\\":{\\\"style\\\":39},\\\"4\\\":{\\\"style\\\":39},\\\"5\\\":{\\\"merge\\\":[0,2],\\\"text\\\":\\\"\\\",\\\"rendered\\\":\\\"\\\",\\\"display\\\":\\\"text\\\"},\\\"-1\\\":{\\\"text\\\":\\\"${tm.tp}\\\"}},\\\"height\\\":27},\\\"1\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":39},\\\"2\\\":{\\\"style\\\":39},\\\"3\\\":{\\\"style\\\":39},\\\"4\\\":{\\\"style\\\":39},\\\"5\\\":{\\\"style\\\":2,\\\"virtual\\\":\\\"ZiOFmILaRjdmVs6E\\\",\\\"rendered\\\":\\\"NUsGZXpylLVeKQ7J\\\",\\\"display\\\":\\\"barcode\\\",\\\"text\\\":\\\"${tm.tm}\\\",\\\"merge\\\":[0,2]}},\\\"height\\\":52},\\\"2\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"受理单位（盖章）珠海市公安局\\\",\\\"merge\\\":[0,3],\\\"style\\\":36},\\\"2\\\":{\\\"style\\\":36},\\\"3\\\":{\\\"style\\\":36},\\\"4\\\":{\\\"style\\\":36},\\\"5\\\":{\\\"style\\\":6},\\\"6\\\":{\\\"style\\\":6},\\\"7\\\":{\\\"style\\\":6},\\\"8\\\":{\\\"text\\\":\\\"\\\",\\\"rendered\\\":\\\"\\\"}},\\\"height\\\":34},\\\"3\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"姓名\\\",\\\"style\\\":24},\\\"2\\\":{\\\"text\\\":\\\"${tm.name}\\\",\\\"style\\\":7,\\\"rendered\\\":\\\"\\\"},\\\"3\\\":{\\\"text\\\":\\\"性别\\\",\\\"style\\\":16},\\\"4\\\":{\\\"text\\\":\\\"${tm.sex}\\\",\\\"style\\\":7,\\\"isDict\\\":1,\\\"dictCode\\\":\\\"sex1\\\",\\\"rendered\\\":\\\"\\\"},\\\"5\\\":{\\\"text\\\":\\\"民族\\\",\\\"style\\\":16},\\\"6\\\":{\\\"text\\\":\\\"${tm.nation}\\\",\\\"style\\\":7},\\\"7\\\":{\\\"text\\\":\\\"${tm.tp}\\\",\\\"style\\\":7,\\\"merge\\\":[2,0],\\\"rendered\\\":\\\"ftkUSZOje4A5gVO3\\\",\\\"display\\\":\\\"img\\\"},\\\"9\\\":{\\\"text\\\":\\\"\\\",\\\"rendered\\\":\\\"\\\"}},\\\"isDrag\\\":true,\\\"height\\\":47},\\\"4\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"出生日期\\\",\\\"style\\\":24},\\\"2\\\":{\\\"text\\\":\\\"${tm.birth}\\\",\\\"style\\\":32,\\\"merge\\\":[0,4]},\\\"3\\\":{\\\"style\\\":33},\\\"4\\\":{\\\"style\\\":33},\\\"5\\\":{\\\"style\\\":33},\\\"6\\\":{\\\"style\\\":33},\\\"8\\\":{\\\"text\\\":\\\"\\\",\\\"rendered\\\":\\\"\\\"}},\\\"isDrag\\\":true,\\\"height\\\":51},\\\"5\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"常住户口所在地住址\\\",\\\"style\\\":21},\\\"2\\\":{\\\"text\\\":\\\"${tm.zhuzhi}\\\",\\\"style\\\":7,\\\"merge\\\":[0,4]},\\\"8\\\":{\\\"text\\\":\\\"\\\",\\\"rendered\\\":\\\"\\\"}},\\\"isDrag\\\":true,\\\"height\\\":62},\\\"6\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"公民身份证\\\",\\\"style\\\":24},\\\"2\\\":{\\\"text\\\":\\\"${tm.card}\\\",\\\"style\\\":7,\\\"merge\\\":[0,5]}},\\\"isDrag\\\":true,\\\"height\\\":55},\\\"7\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"有限期限\\\",\\\"style\\\":24},\\\"2\\\":{\\\"text\\\":\\\"${tm.ydate}\\\",\\\"style\\\":34,\\\"merge\\\":[0,1]},\\\"3\\\":{\\\"style\\\":35},\\\"4\\\":{\\\"text\\\":\\\"签发机关\\\",\\\"style\\\":24},\\\"5\\\":{\\\"text\\\":\\\"${tm.qfjg}\\\",\\\"style\\\":7,\\\"merge\\\":[0,2]}},\\\"isDrag\\\":true,\\\"height\\\":52},\\\"8\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"申领原因\\\",\\\"style\\\":24},\\\"2\\\":{\\\"text\\\":\\\"${tm.slyy}\\\",\\\"style\\\":7,\\\"merge\\\":[0,5]}},\\\"isDrag\\\":true,\\\"height\\\":55},\\\"9\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"受理时间\\\",\\\"style\\\":24},\\\"2\\\":{\\\"text\\\":\\\"${tm.sdate}\\\",\\\"style\\\":32,\\\"merge\\\":[0,1]},\\\"3\\\":{\\\"style\\\":33},\\\"4\\\":{\\\"text\\\":\\\"受理号\\\",\\\"style\\\":24},\\\"5\\\":{\\\"text\\\":\\\"${tm.shao}\\\",\\\"style\\\":7,\\\"merge\\\":[0,2]}},\\\"isDrag\\\":true,\\\"height\\\":49},\\\"10\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"承办人\\\",\\\"style\\\":24},\\\"2\\\":{\\\"text\\\":\\\"${tm.cbr}\\\",\\\"style\\\":7,\\\"merge\\\":[0,1]},\\\"4\\\":{\\\"text\\\":\\\"受理单位领导\\\",\\\"style\\\":24},\\\"5\\\":{\\\"text\\\":\\\"${tm.sld}\\\",\\\"style\\\":7,\\\"merge\\\":[0,2]}},\\\"isDrag\\\":true,\\\"height\\\":42},\\\"11\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"申请（监护）人签名\\\",\\\"style\\\":21},\\\"2\\\":{\\\"text\\\":\\\"${tm.sr}\\\",\\\"style\\\":7,\\\"merge\\\":[0,1]},\\\"4\\\":{\\\"text\\\":\\\"申请（监护）人联系电话\\\",\\\"style\\\":21},\\\"5\\\":{\\\"text\\\":\\\"${tm.jphone}\\\",\\\"style\\\":7,\\\"merge\\\":[0,2]}},\\\"isDrag\\\":true,\\\"height\\\":59},\\\"12\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"领证人签名\\\",\\\"style\\\":24},\\\"2\\\":{\\\"text\\\":\\\"${tm.lzr}\\\",\\\"style\\\":7,\\\"merge\\\":[0,1]},\\\"4\\\":{\\\"text\\\":\\\"领证时间\\\",\\\"style\\\":24},\\\"5\\\":{\\\"text\\\":\\\"${tm.ldate}\\\",\\\"style\\\":32,\\\"merge\\\":[0,2]},\\\"6\\\":{\\\"style\\\":33},\\\"7\\\":{\\\"style\\\":33}},\\\"isDrag\\\":true,\\\"height\\\":57},\\\"13\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"是否通过邮政特快专递方式领取二代\\\",\\\"merge\\\":[0,1],\\\"style\\\":24},\\\"2\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":25},\\\"3\\\":{\\\"text\\\":\\\"${tm.sk}\\\",\\\"style\\\":7,\\\"merge\\\":[0,4]}},\\\"isDrag\\\":true,\\\"height\\\":50},\\\"14\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"投递地址\\\",\\\"style\\\":24},\\\"2\\\":{\\\"text\\\":\\\"${tm.dizhi}\\\",\\\"style\\\":7,\\\"merge\\\":[0,2]},\\\"5\\\":{\\\"text\\\":\\\"收件人\\\",\\\"style\\\":24},\\\"6\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\",\\\"merge\\\":[0,1]}},\\\"isDrag\\\":true,\\\"height\\\":53},\\\"15\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"邮政编码\\\",\\\"style\\\":24},\\\"2\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":7,\\\"merge\\\":[0,1]},\\\"4\\\":{\\\"text\\\":\\\"备注\\\",\\\"style\\\":24},\\\"5\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":7,\\\"merge\\\":[0,2]}},\\\"isDrag\\\":true,\\\"height\\\":47},\\\"16\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[0,6],\\\"text\\\":\\\"公安部治安管理局治\\\",\\\"style\\\":31},\\\"2\\\":{\\\"style\\\":31},\\\"3\\\":{\\\"style\\\":31},\\\"4\\\":{\\\"style\\\":31},\\\"5\\\":{\\\"style\\\":31},\\\"6\\\":{\\\"style\\\":31},\\\"7\\\":{\\\"style\\\":31}}},\\\"len\\\":100},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[\\\"sex1\\\",\\\"sex1\\\",\\\"sex1\\\"],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":704,\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"font\\\":{\\\"size\\\":16}},{\\\"font\\\":{\\\"size\\\":16},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\"},{\\\"textwrap\\\":true},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":9}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":9},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":9},\\\"color\\\":\\\"#0c0c0c\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":9},\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":9},\\\"color\\\":\\\"#595959\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"right\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":false}},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":false}},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":false},\\\"align\\\":\\\"center\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true},\\\"align\\\":\\\"right\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":8}},{\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":8},\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"right\\\",\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"format\\\":\\\"date2\\\"},{\\\"format\\\":\\\"date2\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"format\\\":\\\"date\\\"},{\\\"format\\\":\\\"date\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":9},\\\"color\\\":\\\"#595959\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":16}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":16},\\\"valign\\\":\\\"bottom\\\"}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":16},\\\"1\\\":{\\\"width\\\":103},\\\"2\\\":{\\\"width\\\":156},\\\"3\\\":{\\\"width\\\":51},\\\"4\\\":{\\\"width\\\":96},\\\"5\\\":{\\\"width\\\":61},\\\"6\\\":{\\\"width\\\":106},\\\"7\\\":{\\\"width\\\":115},\\\"8\\\":{\\\"width\\\":135},\\\"len\\\":50},\\\"merges\\\":[\\\"B3:E3\\\",\\\"B14:C14\\\",\\\"C6:G6\\\",\\\"C5:G5\\\",\\\"C7:H7\\\",\\\"C8:D8\\\",\\\"F8:H8\\\",\\\"C9:H9\\\",\\\"D14:H14\\\",\\\"C10:D10\\\",\\\"F10:H10\\\",\\\"C11:D11\\\",\\\"F11:H11\\\",\\\"C13:D13\\\",\\\"C12:D12\\\",\\\"F12:H12\\\",\\\"F13:H13\\\",\\\"C15:E15\\\",\\\"G15:H15\\\",\\\"F16:H16\\\",\\\"C16:D16\\\",\\\"B17:H17\\\",\\\"H4:H6\\\",\\\"B1:E2\\\",\\\"F1:H1\\\",\\\"F2:H2\\\"]}', NULL, 'https://static.jeecg.com/designreport/images/未标题-1_1608118350039.png', 'admin', '2020-12-14 14:28:04', 'admin', '2021-02-03 13:58:47', 0, NULL, NULL, 1, 769, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('1338744112815411200', '20201215151426', '简单条件查询报表', NULL, NULL, '984272091947253760', '{\\\"loopBlockList\\\":[],\\\"area\\\":false,\\\"printElWidth\\\":718,\\\"excel_config_id\\\":\\\"1338744112815411200\\\",\\\"printElHeight\\\":1047,\\\"rows\\\":{\\\"1\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"职务\\\",\\\"style\\\":51},\\\"2\\\":{\\\"text\\\":\\\"雇员ID\\\",\\\"style\\\":51},\\\"3\\\":{\\\"text\\\":\\\"姓名\\\",\\\"style\\\":51},\\\"4\\\":{\\\"text\\\":\\\"性别\\\",\\\"style\\\":51},\\\"5\\\":{\\\"text\\\":\\\"雇佣日期\\\",\\\"style\\\":51},\\\"6\\\":{\\\"text\\\":\\\"家庭电话\\\",\\\"style\\\":51},\\\"7\\\":{\\\"text\\\":\\\"出生日期\\\",\\\"style\\\":51},\\\"8\\\":{\\\"text\\\":\\\"户口所在地\\\",\\\"style\\\":51},\\\"9\\\":{\\\"text\\\":\\\"联系地址\\\",\\\"style\\\":51},\\\"10\\\":{\\\"text\\\":\\\"紧急联系人\\\",\\\"style\\\":52}},\\\"height\\\":37},\\\"2\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":18},\\\"1\\\":{\\\"style\\\":21,\\\"text\\\":\\\"#{jdcx.group(update_by)}\\\",\\\"aggregate\\\":\\\"group\\\"},\\\"2\\\":{\\\"style\\\":21,\\\"text\\\":\\\"#{jdcx.id}\\\"},\\\"3\\\":{\\\"style\\\":21,\\\"text\\\":\\\"#{jdcx.name}\\\"},\\\"4\\\":{\\\"style\\\":21,\\\"text\\\":\\\"#{jdcx.sex}\\\"},\\\"5\\\":{\\\"style\\\":24,\\\"text\\\":\\\"#{jdcx.gtime}\\\"},\\\"6\\\":{\\\"style\\\":21,\\\"text\\\":\\\"#{jdcx.jphone}\\\"},\\\"7\\\":{\\\"style\\\":24,\\\"text\\\":\\\"#{jdcx.birth}\\\"},\\\"8\\\":{\\\"style\\\":21,\\\"text\\\":\\\"#{jdcx.hukou}\\\"},\\\"9\\\":{\\\"style\\\":21,\\\"text\\\":\\\"#{jdcx.laddress}\\\"},\\\"10\\\":{\\\"style\\\":56,\\\"text\\\":\\\"#{jdcx.jperson}\\\"},\\\"11\\\":{\\\"style\\\":18},\\\"12\\\":{\\\"style\\\":18},\\\"13\\\":{\\\"style\\\":18},\\\"14\\\":{\\\"style\\\":18},\\\"15\\\":{\\\"style\\\":18},\\\"16\\\":{\\\"style\\\":18},\\\"17\\\":{\\\"style\\\":18},\\\"18\\\":{\\\"style\\\":18},\\\"19\\\":{\\\"style\\\":18},\\\"20\\\":{\\\"style\\\":18},\\\"21\\\":{\\\"style\\\":18},\\\"22\\\":{\\\"style\\\":18},\\\"23\\\":{\\\"style\\\":18},\\\"24\\\":{\\\"style\\\":18},\\\"25\\\":{\\\"style\\\":18},\\\"26\\\":{\\\"style\\\":18},\\\"27\\\":{\\\"style\\\":18},\\\"28\\\":{\\\"style\\\":18},\\\"29\\\":{\\\"style\\\":18},\\\"30\\\":{\\\"style\\\":18},\\\"31\\\":{\\\"style\\\":18},\\\"32\\\":{\\\"style\\\":18},\\\"33\\\":{\\\"style\\\":18},\\\"34\\\":{\\\"style\\\":18},\\\"35\\\":{\\\"style\\\":18},\\\"36\\\":{\\\"style\\\":18},\\\"37\\\":{\\\"style\\\":18},\\\"38\\\":{\\\"style\\\":18},\\\"39\\\":{\\\"style\\\":18},\\\"40\\\":{\\\"style\\\":18},\\\"41\\\":{\\\"style\\\":18},\\\"42\\\":{\\\"style\\\":18},\\\"43\\\":{\\\"style\\\":18},\\\"44\\\":{\\\"style\\\":18},\\\"45\\\":{\\\"style\\\":18},\\\"46\\\":{\\\"style\\\":18},\\\"47\\\":{\\\"style\\\":18},\\\"48\\\":{\\\"style\\\":18}},\\\"height\\\":34},\\\"3\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":39},\\\"1\\\":{\\\"style\\\":39},\\\"2\\\":{\\\"style\\\":39},\\\"3\\\":{\\\"style\\\":39},\\\"4\\\":{\\\"style\\\":39},\\\"5\\\":{\\\"style\\\":39},\\\"6\\\":{\\\"style\\\":39},\\\"7\\\":{\\\"style\\\":39},\\\"8\\\":{\\\"style\\\":39},\\\"9\\\":{\\\"style\\\":39},\\\"10\\\":{\\\"style\\\":39},\\\"11\\\":{\\\"style\\\":39},\\\"12\\\":{\\\"style\\\":39},\\\"13\\\":{\\\"style\\\":39},\\\"14\\\":{\\\"style\\\":39},\\\"15\\\":{\\\"style\\\":39},\\\"16\\\":{\\\"style\\\":39},\\\"17\\\":{\\\"style\\\":39},\\\"18\\\":{\\\"style\\\":39},\\\"19\\\":{\\\"style\\\":39},\\\"20\\\":{\\\"style\\\":39},\\\"21\\\":{\\\"style\\\":39},\\\"22\\\":{\\\"style\\\":39},\\\"23\\\":{\\\"style\\\":39},\\\"24\\\":{\\\"style\\\":39}}},\\\"4\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"备注：\\\",\\\"style\\\":62},\\\"2\\\":{\\\"style\\\":63,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":63,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":63,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":63,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":63,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":64,\\\"text\\\":\\\" \\\"}}},\\\"5\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"1、支持模糊查询，需要输入 “*+字符串”或 “字符串+* ”或“*+字符串+*”，如：张* / *丽 / *亚*；\\\",\\\"style\\\":65,\\\"merge\\\":[0,6]}}},\\\"6\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"2、以上“出生日期”为时间类型；\\\",\\\"style\\\":65,\\\"merge\\\":[0,6]}}},\\\"7\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"3、以上“雇佣日期”为日期类型\\\",\\\"style\\\":65,\\\"merge\\\":[0,6]}}},\\\"8\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"4、以上“姓名”为字符串类型，支持精准查询和模糊查询；\\\",\\\"style\\\":67,\\\"merge\\\":[0,6]}}},\\\"len\\\":100},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"groupField\\\":\\\"jdcx.update_by\\\",\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":1242,\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"center\\\"},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"center\\\"},{\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"center\\\"},{\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#f1f9f6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"font\\\":{\\\"size\\\":8}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#f1f9f6\\\",\\\"font\\\":{\\\"size\\\":8}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":8}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8}},{\\\"font\\\":{\\\"size\\\":9}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#f1f9f6\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9}},{\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#f1f9f6\\\",\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"left\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"left\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"date\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#f1f9f6\\\",\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"left\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"date\\\"},{\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#f1f9f6\\\",\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"left\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"date\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#f1f9f6\\\",\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"left\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"date\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"date2\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"normal\\\"},{\\\"align\\\":\\\"center\\\",\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"number\\\"}],\\\"validations\\\":[],\\\"isGroup\\\":true,\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":40},\\\"1\\\":{\\\"width\\\":88},\\\"2\\\":{\\\"width\\\":86},\\\"3\\\":{\\\"width\\\":97},\\\"4\\\":{\\\"width\\\":67},\\\"5\\\":{\\\"width\\\":103},\\\"6\\\":{\\\"width\\\":115},\\\"7\\\":{\\\"width\\\":90},\\\"8\\\":{\\\"width\\\":239},\\\"9\\\":{\\\"width\\\":217},\\\"len\\\":50},\\\"merges\\\":[\\\"B6:H6\\\",\\\"B7:H7\\\",\\\"B8:H8\\\",\\\"B9:H9\\\"]}', NULL, 'https://static.jeecg.com/designreport/images/QQ截图20201216112919_1608089379396.png', 'admin', '2020-12-15 15:14:27', 'admin', '2021-02-03 13:58:44', 0, NULL, NULL, 1, 1075, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('1338769064067076098', '202012151514266124', '多选条件查询报表', NULL, NULL, '984272091947253760', '{\\\"loopBlockList\\\":[],\\\"area\\\":false,\\\"printElWidth\\\":718,\\\"excel_config_id\\\":\\\"1338769064067076098\\\",\\\"printElHeight\\\":1047,\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":49},\\\"1\\\":{\\\"style\\\":49},\\\"2\\\":{\\\"style\\\":49},\\\"3\\\":{\\\"style\\\":49},\\\"4\\\":{\\\"style\\\":49},\\\"5\\\":{\\\"style\\\":49},\\\"6\\\":{\\\"style\\\":49},\\\"7\\\":{\\\"style\\\":49},\\\"8\\\":{\\\"style\\\":49},\\\"9\\\":{\\\"style\\\":49},\\\"10\\\":{\\\"style\\\":49},\\\"11\\\":{\\\"style\\\":49},\\\"12\\\":{\\\"style\\\":49},\\\"13\\\":{\\\"style\\\":49},\\\"14\\\":{\\\"style\\\":49},\\\"15\\\":{\\\"style\\\":49},\\\"16\\\":{\\\"style\\\":49},\\\"17\\\":{\\\"style\\\":49},\\\"18\\\":{\\\"style\\\":49},\\\"19\\\":{\\\"style\\\":49},\\\"20\\\":{\\\"style\\\":49},\\\"21\\\":{\\\"style\\\":49},\\\"22\\\":{\\\"style\\\":49},\\\"23\\\":{\\\"style\\\":49},\\\"24\\\":{\\\"style\\\":49},\\\"25\\\":{\\\"style\\\":49}}},\\\"1\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":50},\\\"1\\\":{\\\"text\\\":\\\"职务\\\",\\\"style\\\":51},\\\"2\\\":{\\\"text\\\":\\\"雇员ID\\\",\\\"style\\\":51},\\\"3\\\":{\\\"text\\\":\\\"姓名\\\",\\\"style\\\":51},\\\"4\\\":{\\\"style\\\":51,\\\"text\\\":\\\"性别\\\"},\\\"5\\\":{\\\"text\\\":\\\"雇佣日期\\\",\\\"style\\\":51},\\\"6\\\":{\\\"text\\\":\\\"家庭电话\\\",\\\"style\\\":51},\\\"7\\\":{\\\"text\\\":\\\"出生日期\\\",\\\"style\\\":51},\\\"8\\\":{\\\"text\\\":\\\"户口所在地\\\",\\\"style\\\":51},\\\"9\\\":{\\\"text\\\":\\\"联系地址\\\",\\\"style\\\":51},\\\"10\\\":{\\\"text\\\":\\\"紧急联系人\\\",\\\"style\\\":51},\\\"11\\\":{\\\"style\\\":50},\\\"12\\\":{\\\"style\\\":50},\\\"13\\\":{\\\"style\\\":50},\\\"14\\\":{\\\"style\\\":50},\\\"15\\\":{\\\"style\\\":50},\\\"16\\\":{\\\"style\\\":50},\\\"17\\\":{\\\"style\\\":50},\\\"18\\\":{\\\"style\\\":50},\\\"19\\\":{\\\"style\\\":50},\\\"20\\\":{\\\"style\\\":50},\\\"21\\\":{\\\"style\\\":50},\\\"22\\\":{\\\"style\\\":50},\\\"23\\\":{\\\"style\\\":50},\\\"24\\\":{\\\"style\\\":50},\\\"25\\\":{\\\"style\\\":50}},\\\"height\\\":46},\\\"2\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":52},\\\"1\\\":{\\\"text\\\":\\\"#{pop.group(update_by)}\\\",\\\"style\\\":53,\\\"aggregate\\\":\\\"group\\\"},\\\"2\\\":{\\\"text\\\":\\\"#{pop.group(id)}\\\",\\\"style\\\":54,\\\"aggregate\\\":\\\"group\\\"},\\\"3\\\":{\\\"text\\\":\\\"#{pop.group(name)}\\\",\\\"style\\\":54,\\\"aggregate\\\":\\\"group\\\"},\\\"4\\\":{\\\"text\\\":\\\"#{pop.sex}\\\",\\\"style\\\":55},\\\"5\\\":{\\\"text\\\":\\\"#{pop.gtime}\\\",\\\"style\\\":56},\\\"6\\\":{\\\"text\\\":\\\"#{pop.jphone}\\\",\\\"style\\\":57},\\\"7\\\":{\\\"text\\\":\\\"#{pop.birth}\\\",\\\"style\\\":56},\\\"8\\\":{\\\"text\\\":\\\"#{pop.hukou}\\\",\\\"style\\\":58},\\\"9\\\":{\\\"text\\\":\\\"#{pop.laddress}\\\",\\\"style\\\":57},\\\"10\\\":{\\\"text\\\":\\\"#{pop.jperson}\\\",\\\"style\\\":57},\\\"11\\\":{\\\"style\\\":52},\\\"12\\\":{\\\"style\\\":52},\\\"13\\\":{\\\"style\\\":52},\\\"14\\\":{\\\"style\\\":52},\\\"15\\\":{\\\"style\\\":52},\\\"16\\\":{\\\"style\\\":52},\\\"17\\\":{\\\"style\\\":52},\\\"18\\\":{\\\"style\\\":52},\\\"19\\\":{\\\"style\\\":52},\\\"20\\\":{\\\"style\\\":52},\\\"21\\\":{\\\"style\\\":52},\\\"22\\\":{\\\"style\\\":52},\\\"23\\\":{\\\"style\\\":52},\\\"24\\\":{\\\"style\\\":52},\\\"25\\\":{\\\"style\\\":52}},\\\"isDrag\\\":true,\\\"height\\\":35},\\\"5\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"\\\"}},\\\"isDrag\\\":true},\\\"len\\\":99},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"groupField\\\":\\\"pop.update_by\\\",\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":1494,\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"center\\\"},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"center\\\"},{\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"center\\\"},{\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#f1f9f6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\"},{\\\"font\\\":{\\\"size\\\":8}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#f1f9f6\\\",\\\"font\\\":{\\\"size\\\":8}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":8}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":8}},{\\\"font\\\":{\\\"size\\\":9}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#f1f9f6\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9}},{\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#f1f9f6\\\",\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"left\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"left\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"date\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#f1f9f6\\\",\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"left\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"date\\\"},{\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#f1f9f6\\\",\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ddefe8\\\",\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"left\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"date\\\"},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#bdd7ee\\\",\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#deeaf6\\\",\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"normal\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#deeaf6\\\",\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#bdd7ee\\\",\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"normal\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#deeaf6\\\",\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#bdd7ee\\\",\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"date\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"normal\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"align\\\":\\\"center\\\",\\\"format\\\":\\\"date2\\\"}],\\\"validations\\\":[],\\\"isGroup\\\":true,\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":48},\\\"1\\\":{\\\"width\\\":107},\\\"3\\\":{\\\"width\\\":91},\\\"4\\\":{\\\"width\\\":142},\\\"5\\\":{\\\"width\\\":130},\\\"6\\\":{\\\"width\\\":131},\\\"7\\\":{\\\"width\\\":235},\\\"8\\\":{\\\"width\\\":230},\\\"9\\\":{\\\"width\\\":148},\\\"10\\\":{\\\"width\\\":132},\\\"len\\\":50},\\\"merges\\\":[]}', NULL, 'https://static.jeecg.com/designreport/images/QQ截图20201216185224_1608116008543.png', 'admin', '2020-12-15 16:53:13', 'admin', '2021-02-03 13:58:41', 0, NULL, NULL, 1, 907, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('1347373863746539520', '20210108104603', '实习证明', NULL, NULL, '984302991393210368', '{\\\"loopBlockList\\\":[],\\\"area\\\":{\\\"sri\\\":16,\\\"sci\\\":5,\\\"eri\\\":16,\\\"eci\\\":5,\\\"width\\\":147,\\\"height\\\":25},\\\"excel_config_id\\\":\\\"1347373863746539520\\\",\\\"printConfig\\\":{\\\"paper\\\":\\\"A4\\\",\\\"width\\\":210,\\\"height\\\":297,\\\"definition\\\":1,\\\"isBackend\\\":false,\\\"marginX\\\":10,\\\"marginY\\\":10,\\\"layout\\\":\\\"portrait\\\"},\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"text\\\":\\\"\\\"}}},\\\"1\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"\\\"}}},\\\"3\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"\\\",\\\"rendered\\\":\\\"\\\"}}},\\\"5\\\":{\\\"cells\\\":{},\\\"height\\\":29},\\\"6\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":2}},\\\"height\\\":34},\\\"7\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"merge\\\":[0,4],\\\"text\\\":\\\"实习证明\\\",\\\"style\\\":2}},\\\"height\\\":41},\\\"8\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":3},\\\"2\\\":{\\\"text\\\":\\\"\\\"}}},\\\"9\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":3},\\\"2\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":3},\\\"3\\\":{\\\"text\\\":\\\"\\\"}},\\\"isDrag\\\":true,\\\"height\\\":33},\\\"10\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"${tt.name}\\\",\\\"style\\\":11},\\\"3\\\":{\\\"text\\\":\\\"同学在我公司与 2020年4月1日 至 2020年5月1日 实习。\\\",\\\"style\\\":19,\\\"merge\\\":[0,3],\\\"height\\\":34}},\\\"height\\\":34},\\\"11\\\":{\\\"cells\\\":{},\\\"height\\\":28},\\\"12\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":6},\\\"2\\\":{\\\"style\\\":13,\\\"text\\\":\\\"${tt.pingjia}\\\",\\\"merge\\\":[3,4],\\\"height\\\":129}},\\\"height\\\":36},\\\"13\\\":{\\\"cells\\\":{},\\\"height\\\":29},\\\"14\\\":{\\\"cells\\\":{},\\\"height\\\":33},\\\"15\\\":{\\\"cells\\\":{},\\\"height\\\":31},\\\"16\\\":{\\\"cells\\\":{}},\\\"17\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"text\\\":\\\"特此证明！\\\",\\\"style\\\":12}}},\\\"20\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":3},\\\"4\\\":{\\\"text\\\":\\\"\\\"}}},\\\"21\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"text\\\":\\\"\\\"}}},\\\"22\\\":{\\\"cells\\\":{\\\"3\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":3},\\\"4\\\":{\\\"text\\\":\\\"证明人：\\\",\\\"style\\\":11},\\\"5\\\":{\\\"text\\\":\\\"${tt.lingdao}\\\",\\\"style\\\":12}}},\\\"23\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"text\\\":\\\"${tt.shijian}\\\",\\\"style\\\":15}}},\\\"len\\\":100},\\\"dbexps\\\":[],\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":576,\\\"displayConfig\\\":{},\\\"background\\\":{\\\"path\\\":\\\"https://static.jeecg.com/designreport/images/11_1611283832037.png\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"width\\\":\\\"\\\",\\\"height\\\":\\\"\\\"},\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"right\\\"},{\\\"align\\\":\\\"left\\\"},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"top\\\"},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"top\\\",\\\"textwrap\\\":true},{\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"top\\\",\\\"textwrap\\\":false},{\\\"textwrap\\\":false},{\\\"textwrap\\\":true},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":12}},{\\\"font\\\":{\\\"size\\\":12}},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"top\\\",\\\"textwrap\\\":true,\\\"font\\\":{\\\"size\\\":12}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"size\\\":12}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":14}},{\\\"font\\\":{\\\"size\\\":10}},{\\\"textwrap\\\":false,\\\"font\\\":{\\\"size\\\":12}}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":69},\\\"1\\\":{\\\"width\\\":41},\\\"4\\\":{\\\"width\\\":119},\\\"5\\\":{\\\"width\\\":147},\\\"6\\\":{\\\"width\\\":31},\\\"len\\\":50},\\\"merges\\\":[\\\"C8:G8\\\",\\\"D11:G11\\\",\\\"C13:G16\\\"]}', NULL, 'https://static.jeecg.com/designreport/images/未标题-1_1610074948259.png', 'admin', '2021-01-08 10:46:04', 'admin', '2021-04-05 18:47:08', 0, NULL, NULL, 1, 126, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('1347454742040809472', '20210108161240', '实例：年度各月份佣金收入', NULL, NULL, '984272091947253760', '{\\\"loopBlockList\\\":[],\\\"area\\\":false,\\\"printElWidth\\\":718,\\\"excel_config_id\\\":\\\"1347454742040809472\\\",\\\"printElHeight\\\":1047,\\\"rows\\\":{\\\"1\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"pZTpI3BKFw0lh6D7\\\"},\\\"2\\\":{\\\"text\\\":\\\"年度各月份佣金收入\\\",\\\"style\\\":23,\\\"merge\\\":[0,3],\\\"virtual\\\":\\\"pZTpI3BKFw0lh6D7\\\"},\\\"3\\\":{\\\"style\\\":24},\\\"4\\\":{\\\"style\\\":24},\\\"5\\\":{\\\"style\\\":24},\\\"6\\\":{\\\"text\\\":\\\" \\\"}},\\\"height\\\":37},\\\"2\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"}}},\\\"4\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"查询年度：2019\\\"},\\\"4\\\":{\\\"text\\\":\\\"查询机构：总公司\\\"},\\\"6\\\":{\\\"text\\\":\\\"单位：元\\\"}}},\\\"6\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"月份\\\",\\\"style\\\":12},\\\"2\\\":{\\\"text\\\":\\\"佣金/主营业收入\\\",\\\"style\\\":12},\\\"3\\\":{\\\"text\\\":\\\"累计\\\",\\\"style\\\":12},\\\"4\\\":{\\\"text\\\":\\\"历史最低水平\\\",\\\"style\\\":12},\\\"5\\\":{\\\"text\\\":\\\"历史平均水平\\\",\\\"style\\\":12},\\\"6\\\":{\\\"text\\\":\\\"历史最高水平\\\",\\\"style\\\":12}}},\\\"7\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"#{tmp_report_data_1.monty}\\\",\\\"style\\\":0},\\\"2\\\":{\\\"text\\\":\\\"#{tmp_report_data_1.main_income}\\\",\\\"style\\\":0},\\\"3\\\":{\\\"text\\\":\\\"#{tmp_report_data_1.total}\\\",\\\"style\\\":18},\\\"4\\\":{\\\"text\\\":\\\"#{tmp_report_data_1.his_lowest}\\\",\\\"style\\\":0},\\\"5\\\":{\\\"text\\\":\\\"#{tmp_report_data_1.his_average}\\\",\\\"style\\\":0},\\\"6\\\":{\\\"text\\\":\\\"#{tmp_report_data_1.his_highest}\\\",\\\"style\\\":0}},\\\"isDrag\\\":true},\\\"9\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[1,1]}}},\\\"len\\\":99},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":678,\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"bold\\\":true}},{\\\"font\\\":{\\\"bold\\\":true}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"bold\\\":false}},{\\\"font\\\":{\\\"bold\\\":false}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"bold\\\":true},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"bold\\\":true},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":15},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":15},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"bgcolor\\\":\\\"#01b0f1\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"bgcolor\\\":\\\"#33CCCC\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"bgcolor\\\":\\\"#33CCCC\\\",\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"bgcolor\\\":\\\"#33CCCC\\\",\\\"align\\\":\\\"left\\\"},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":16}},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":24}},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":22}},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":22},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"format\\\":\\\"usd\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"format\\\":\\\"rmb\\\"},{\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"黑体\\\"}},{\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"黑体\\\",\\\"size\\\":22}},{\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\",\\\"size\\\":22}},{\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"楷体\\\",\\\"size\\\":22}},{\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"楷体\\\",\\\"size\\\":22},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\"}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":29},\\\"1\\\":{\\\"width\\\":111},\\\"2\\\":{\\\"width\\\":116},\\\"4\\\":{\\\"width\\\":122},\\\"len\\\":50},\\\"merges\\\":[\\\"B10:C11\\\",\\\"C2:F2\\\"],\\\"imgList\\\":[{\\\"row\\\":1,\\\"col\\\":1,\\\"width\\\":\\\"148\\\",\\\"height\\\":\\\"56\\\",\\\"src\\\":\\\"https://static.jeecg.com/designreport/images/kunlunlog_1610591367645.png\\\",\\\"layer_id\\\":\\\"pZTpI3BKFw0lh6D7\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[1,1],[1,2]]}]}', NULL, NULL, 'admin', '2021-01-08 16:12:40', 'admin', '2025-05-27 09:47:15', 1, NULL, NULL, 0, 55, NULL, NULL, NULL, '2', 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('1cd9d574d0c42f3915046dc61d9f33bd', '202012171553133795', '企业实时报表副本3795', NULL, NULL, '984302961118724096', '{\\\"chartList\\\":[{\\\"row\\\":6,\\\"col\\\":1,\\\"width\\\":\\\"302\\\",\\\"height\\\":\\\"337\\\",\\\"config\\\":\\\"{\\\\\\\"yAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"rotate\\\\\\\":0,\\\\\\\"interval\\\\\\\":0,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"data\\\\\\\":[\\\\\\\"江苏\\\\\\\",\\\\\\\"山东\\\\\\\",\\\\\\\"安徽\\\\\\\",\\\\\\\"江西\\\\\\\",\\\\\\\"河北\\\\\\\",\\\\\\\"吉林\\\\\\\",\\\\\\\"黑龙江\\\\\\\",\\\\\\\"重庆\\\\\\\",\\\\\\\"广东\\\\\\\",\\\\\\\"上海\\\\\\\",\\\\\\\"哈尔滨\\\\\\\",\\\\\\\"福建\\\\\\\",\\\\\\\"四川\\\\\\\"],\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\"}},\\\\\\\"show\\\\\\\":true,\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"red\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false},\\\\\\\"type\\\\\\\":\\\\\\\"category\\\\\\\"},\\\\\\\"xAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#333\\\\\\\",\\\\\\\"fontSize\\\\\\\":12}},\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#333\\\\\\\"}},\\\\\\\"show\\\\\\\":false,\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"red\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false},\\\\\\\"type \\\\\\\":\\\\\\\"value\\\\\\\"},\\\\\\\"legend\\\\\\\":{\\\\\\\"padding\\\\\\\":[25,20,25,10],\\\\\\\"data\\\\\\\":[\\\\\\\"销售额\\\\\\\"],\\\\\\\"top\\\\\\\":\\\\\\\"top\\\\\\\",\\\\\\\"orient\\\\\\\":\\\\\\\"horizontal\\\\\\\",\\\\\\\"left\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"show\\\\\\\":false,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#333\\\\\\\",\\\\\\\"fontSize\\\\\\\":12}},\\\\\\\"grid\\\\\\\":{\\\\\\\"top\\\\\\\":20,\\\\\\\"left\\\\\\\":45,\\\\\\\"bottom\\\\\\\":16,\\\\\\\"right\\\\\\\":46},\\\\\\\"series\\\\\\\":[{\\\\\\\"barWidth\\\\\\\":13,\\\\\\\"data\\\\\\\":[100,800,1200,1700,2500,4000,5800,6500,7000,7500,8000,8800,9500],\\\\\\\"name\\\\\\\":\\\\\\\"销售额\\\\\\\",\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"barBorderRadius\\\\\\\":5,\\\\\\\"color\\\\\\\":\\\\\\\"rgba(67,184,251,1)\\\\\\\"},\\\\\\\"label\\\\\\\":{\\\\\\\"show\\\\\\\":true,\\\\\\\"position\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#689AFB\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"normal\\\\\\\"}},\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\",\\\\\\\"barMinHeight\\\\\\\":2,\\\\\\\"typeData\\\\\\\":[],\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"black\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"bolder\\\\\\\"}}],\\\\\\\"tooltip\\\\\\\":{\\\\\\\"show\\\\\\\":true,\\\\\\\"axisPointer\\\\\\\":{\\\\\\\"type\\\\\\\":\\\\\\\"shadow\\\\\\\"},\\\\\\\"trigger\\\\\\\":\\\\\\\"axis\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#fff\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"title\\\\\\\":{\\\\\\\"show\\\\\\\":false,\\\\\\\"top\\\\\\\":5,\\\\\\\"text\\\\\\\":\\\\\\\"销售额省份排名\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"normal\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"14\\\\\\\"},\\\\\\\"left\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"padding\\\\\\\":[5,20,5,20]}}\\\",\\\"url\\\":\\\"\\\",\\\"extData\\\":{\\\"dataType\\\":\\\"api\\\",\\\"apiStatus\\\":\\\"1\\\",\\\"dataId\\\":\\\"1339491107951640577\\\",\\\"axisX\\\":\\\"name\\\",\\\"axisY\\\":\\\"value\\\",\\\"series\\\":\\\"type\\\",\\\"yText\\\":\\\"\\\",\\\"xText\\\":\\\"\\\",\\\"dbCode\\\":\\\"xiaoshoue\\\",\\\"dataId1\\\":\\\"\\\",\\\"source\\\":\\\"\\\",\\\"target\\\":\\\"\\\",\\\"isTiming\\\":true,\\\"intervalTime\\\":\\\"5\\\",\\\"chartType\\\":\\\"bar.multi.horizontal\\\",\\\"chartId\\\":\\\"pie.doughnut\\\"},\\\"layer_id\\\":\\\"IFj1lg5S5aNG1wPx\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[6,1],[6,2],[6,3],[6,4]]},{\\\"row\\\":6,\\\"col\\\":10,\\\"width\\\":\\\"247\\\",\\\"height\\\":\\\"124\\\",\\\"config\\\":\\\"{\\\\\\\"legend\\\\\\\":{\\\\\\\"padding\\\\\\\":[25,20,25,10],\\\\\\\"data\\\\\\\":[\\\\\\\"销售额\\\\\\\",\\\\\\\"其他\\\\\\\"],\\\\\\\"top\\\\\\\":\\\\\\\"top\\\\\\\",\\\\\\\"orient\\\\\\\":\\\\\\\"horizontal\\\\\\\",\\\\\\\"left\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"show\\\\\\\":false,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#333\\\\\\\",\\\\\\\"fontSize\\\\\\\":12}},\\\\\\\"series\\\\\\\":[{\\\\\\\"isRose\\\\\\\":false,\\\\\\\"data\\\\\\\":[{\\\\\\\"name\\\\\\\":\\\\\\\"销售额\\\\\\\",\\\\\\\"value\\\\\\\":6000000,\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"rgba(43,193,254,1)\\\\\\\"}},{\\\\\\\"name\\\\\\\":\\\\\\\"其他\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"rgba(42,45,76,0.59)\\\\\\\"}}],\\\\\\\"isRadius\\\\\\\":true,\\\\\\\"roseType\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"notCount\\\\\\\":false,\\\\\\\"name\\\\\\\":\\\\\\\"访问来源\\\\\\\",\\\\\\\"minAngle\\\\\\\":0,\\\\\\\"label\\\\\\\":{\\\\\\\"show\\\\\\\":false,\\\\\\\"position\\\\\\\":\\\\\\\"outside\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"fontSize\\\\\\\":16,\\\\\\\"fontWeight\\\\\\\":\\\\\\\"bolder\\\\\\\"}},\\\\\\\"type\\\\\\\":\\\\\\\"pie\\\\\\\",\\\\\\\"radius\\\\\\\":[\\\\\\\"45%\\\\\\\",\\\\\\\"55%\\\\\\\"],\\\\\\\"autoSort\\\\\\\":false}],\\\\\\\"tooltip\\\\\\\":{\\\\\\\"formatter\\\\\\\":\\\\\\\"{b} : {c}\\\\\\\",\\\\\\\"show\\\\\\\":true,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#fff\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"title\\\\\\\":{\\\\\\\"show\\\\\\\":false,\\\\\\\"top\\\\\\\":5,\\\\\\\"text\\\\\\\":\\\\\\\"销售进度\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"normal\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"14\\\\\\\"},\\\\\\\"left\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"padding\\\\\\\":[5,20,5,10]}}\\\",\\\"url\\\":\\\"\\\",\\\"extData\\\":{\\\"dataType\\\":\\\"api\\\",\\\"apiStatus\\\":\\\"1\\\",\\\"dataId\\\":\\\"1339498906765000705\\\",\\\"axisX\\\":\\\"name\\\",\\\"axisY\\\":\\\"value\\\",\\\"series\\\":\\\"type\\\",\\\"yText\\\":\\\"\\\",\\\"xText\\\":\\\"\\\",\\\"dbCode\\\":\\\"xsjd\\\",\\\"dataId1\\\":\\\"\\\",\\\"source\\\":\\\"\\\",\\\"target\\\":\\\"\\\",\\\"isTiming\\\":true,\\\"intervalTime\\\":\\\"5\\\",\\\"chartType\\\":\\\"pie.doughnut\\\",\\\"chartId\\\":\\\"pie.doughnut\\\"},\\\"layer_id\\\":\\\"Yb2TIGEAxnvN9ITx\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[6,10],[6,11]]},{\\\"row\\\":6,\\\"col\\\":12,\\\"width\\\":\\\"244\\\",\\\"height\\\":\\\"128\\\",\\\"config\\\":\\\"{\\\\\\\"yAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"rotate\\\\\\\":0,\\\\\\\"interval\\\\\\\":0,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"data\\\\\\\":[\\\\\\\"北京\\\\\\\",\\\\\\\"青岛\\\\\\\",\\\\\\\"合肥\\\\\\\",\\\\\\\"深圳\\\\\\\",\\\\\\\"石家庄\\\\\\\",\\\\\\\"重庆\\\\\\\",\\\\\\\"保定\\\\\\\",\\\\\\\"邯郸\\\\\\\"],\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\"}},\\\\\\\"show\\\\\\\":true,\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"red\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false},\\\\\\\"type\\\\\\\":\\\\\\\"category\\\\\\\"},\\\\\\\"xAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#333\\\\\\\",\\\\\\\"fontSize\\\\\\\":12}},\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#333\\\\\\\"}},\\\\\\\"show\\\\\\\":false,\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"red\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false},\\\\\\\"type \\\\\\\":\\\\\\\"value\\\\\\\"},\\\\\\\"legend\\\\\\\":{\\\\\\\"padding\\\\\\\":[25,20,25,10],\\\\\\\"data\\\\\\\":[\\\\\\\"销售额\\\\\\\"],\\\\\\\"top\\\\\\\":\\\\\\\"top\\\\\\\",\\\\\\\"orient\\\\\\\":\\\\\\\"horizontal\\\\\\\",\\\\\\\"left\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"show\\\\\\\":false,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#333\\\\\\\",\\\\\\\"fontSize\\\\\\\":12}},\\\\\\\"grid\\\\\\\":{\\\\\\\"top\\\\\\\":10,\\\\\\\"left\\\\\\\":49,\\\\\\\"bottom\\\\\\\":16,\\\\\\\"right\\\\\\\":45},\\\\\\\"series\\\\\\\":[{\\\\\\\"barWidth\\\\\\\":9,\\\\\\\"data\\\\\\\":[80,500,800,1000,1200,1500,1600,2000],\\\\\\\"name\\\\\\\":\\\\\\\"销售额\\\\\\\",\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"barBorderRadius\\\\\\\":0,\\\\\\\"color\\\\\\\":\\\\\\\"rgba(146,119,252,1)\\\\\\\"},\\\\\\\"label\\\\\\\":{\\\\\\\"show\\\\\\\":true,\\\\\\\"position\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#689AFB\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"normal\\\\\\\"}},\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\",\\\\\\\"barMinHeight\\\\\\\":2,\\\\\\\"typeData\\\\\\\":[],\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"black\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"bolder\\\\\\\"}}],\\\\\\\"tooltip\\\\\\\":{\\\\\\\"show\\\\\\\":true,\\\\\\\"axisPointer\\\\\\\":{\\\\\\\"type\\\\\\\":\\\\\\\"shadow\\\\\\\"},\\\\\\\"trigger\\\\\\\":\\\\\\\"axis\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#fff\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"title\\\\\\\":{\\\\\\\"show\\\\\\\":false,\\\\\\\"top\\\\\\\":5,\\\\\\\"text\\\\\\\":\\\\\\\"销售额城市排名\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"normal\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"14\\\\\\\"},\\\\\\\"left\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"padding\\\\\\\":[5,20,5,20]}}\\\",\\\"url\\\":\\\"\\\",\\\"extData\\\":{\\\"dataType\\\":\\\"api\\\",\\\"apiStatus\\\":\\\"1\\\",\\\"dataId\\\":\\\"1339495346077728770\\\",\\\"axisX\\\":\\\"name\\\",\\\"axisY\\\":\\\"value\\\",\\\"series\\\":\\\"type\\\",\\\"yText\\\":\\\"\\\",\\\"xText\\\":\\\"\\\",\\\"dbCode\\\":\\\"chengshi\\\",\\\"dataId1\\\":\\\"\\\",\\\"source\\\":\\\"\\\",\\\"target\\\":\\\"\\\",\\\"isTiming\\\":true,\\\"intervalTime\\\":\\\"5\\\",\\\"chartType\\\":\\\"bar.multi.horizontal\\\",\\\"chartId\\\":\\\"bar.multi.horizontal\\\"},\\\"layer_id\\\":\\\"qQHpevWlqElpRQUl\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[6,12],[6,13],[6,14]]},{\\\"row\\\":6,\\\"col\\\":15,\\\"width\\\":\\\"230\\\",\\\"height\\\":\\\"127\\\",\\\"config\\\":\\\"{\\\\\\\"yAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"rotate\\\\\\\":0,\\\\\\\"interval\\\\\\\":0,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"data\\\\\\\":[\\\\\\\"北京\\\\\\\",\\\\\\\"青岛\\\\\\\",\\\\\\\"合肥\\\\\\\",\\\\\\\"深圳\\\\\\\",\\\\\\\"石家庄\\\\\\\",\\\\\\\"重庆\\\\\\\",\\\\\\\"保定\\\\\\\",\\\\\\\"邯郸\\\\\\\"],\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\"}},\\\\\\\"show\\\\\\\":true,\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"red\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false},\\\\\\\"type\\\\\\\":\\\\\\\"category\\\\\\\"},\\\\\\\"xAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#333\\\\\\\",\\\\\\\"fontSize\\\\\\\":12}},\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#333\\\\\\\"}},\\\\\\\"show\\\\\\\":false,\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"red\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false},\\\\\\\"type \\\\\\\":\\\\\\\"value\\\\\\\"},\\\\\\\"legend\\\\\\\":{\\\\\\\"padding\\\\\\\":[25,20,25,10],\\\\\\\"data\\\\\\\":[\\\\\\\"销售额\\\\\\\"],\\\\\\\"top\\\\\\\":\\\\\\\"top\\\\\\\",\\\\\\\"orient\\\\\\\":\\\\\\\"horizontal\\\\\\\",\\\\\\\"left\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"show\\\\\\\":false,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#333\\\\\\\",\\\\\\\"fontSize\\\\\\\":12}},\\\\\\\"grid\\\\\\\":{\\\\\\\"top\\\\\\\":10,\\\\\\\"left\\\\\\\":49,\\\\\\\"bottom\\\\\\\":20,\\\\\\\"right\\\\\\\":48},\\\\\\\"series\\\\\\\":[{\\\\\\\"barWidth\\\\\\\":9,\\\\\\\"data\\\\\\\":[80,500,800,1000,1200,1500,1600,2000],\\\\\\\"name\\\\\\\":\\\\\\\"销售额\\\\\\\",\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"barBorderRadius\\\\\\\":0,\\\\\\\"color\\\\\\\":\\\\\\\"rgba(146,119,252,1)\\\\\\\"},\\\\\\\"label\\\\\\\":{\\\\\\\"show\\\\\\\":true,\\\\\\\"position\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#689AFB\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"normal\\\\\\\"}},\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\",\\\\\\\"barMinHeight\\\\\\\":2,\\\\\\\"typeData\\\\\\\":[],\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"black\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"bolder\\\\\\\"}}],\\\\\\\"tooltip\\\\\\\":{\\\\\\\"show\\\\\\\":true,\\\\\\\"axisPointer\\\\\\\":{\\\\\\\"type\\\\\\\":\\\\\\\"shadow\\\\\\\"},\\\\\\\"trigger\\\\\\\":\\\\\\\"axis\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#fff\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"title\\\\\\\":{\\\\\\\"show\\\\\\\":false,\\\\\\\"top\\\\\\\":5,\\\\\\\"text\\\\\\\":\\\\\\\"某站点用户访问来源\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#c23531\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"bolder\\\\\\\",\\\\\\\"fontSize\\\\\\\":18},\\\\\\\"left\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"padding\\\\\\\":[5,20,5,20]}}\\\",\\\"url\\\":\\\"\\\",\\\"extData\\\":{\\\"dataType\\\":\\\"api\\\",\\\"apiStatus\\\":\\\"1\\\",\\\"dataId\\\":\\\"1339495346077728770\\\",\\\"axisX\\\":\\\"name\\\",\\\"axisY\\\":\\\"value\\\",\\\"series\\\":\\\"type\\\",\\\"yText\\\":\\\"\\\",\\\"xText\\\":\\\"\\\",\\\"dbCode\\\":\\\"chengshi\\\",\\\"dataId1\\\":\\\"\\\",\\\"source\\\":\\\"\\\",\\\"target\\\":\\\"\\\",\\\"isTiming\\\":true,\\\"intervalTime\\\":\\\"5\\\",\\\"chartType\\\":\\\"bar.multi.horizontal\\\",\\\"chartId\\\":\\\"bar.multi.horizontal\\\"},\\\"layer_id\\\":\\\"phTmhkjHLebYlOEQ\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[6,15],[6,16],[6,17],[6,18]]},{\\\"row\\\":7,\\\"col\\\":5,\\\"width\\\":\\\"430\\\",\\\"height\\\":\\\"293\\\",\\\"config\\\":\\\"{\\\\\\\"geo\\\\\\\":{\\\\\\\"map\\\\\\\":\\\\\\\"china\\\\\\\",\\\\\\\"zoom\\\\\\\":0.5,\\\\\\\"label\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"8\\\\\\\",\\\\\\\"show\\\\\\\":true},\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"borderWidth\\\\\\\":0.5,\\\\\\\"areaColor\\\\\\\":\\\\\\\"#8284FB\\\\\\\",\\\\\\\"borderColor\\\\\\\":\\\\\\\"#000\\\\\\\"},\\\\\\\"emphasis\\\\\\\":{\\\\\\\"label\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#fff\\\\\\\"},\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"areaColor\\\\\\\":\\\\\\\"#4195EF\\\\\\\"}},\\\\\\\"regions\\\\\\\":[],\\\\\\\"layoutSize\\\\\\\":600,\\\\\\\"roam\\\\\\\":true,\\\\\\\"layoutCenter\\\\\\\":[\\\\\\\"50%\\\\\\\",\\\\\\\"50%\\\\\\\"]},\\\\\\\"series\\\\\\\":[{\\\\\\\"encode\\\\\\\":{\\\\\\\"value\\\\\\\":[2]},\\\\\\\"data\\\\\\\":[{\\\\\\\"name\\\\\\\":\\\\\\\"河北\\\\\\\",\\\\\\\"value\\\\\\\":[114.502461,38.045474,279]},{\\\\\\\"name\\\\\\\":\\\\\\\"海南\\\\\\\",\\\\\\\"value\\\\\\\":[110.33119,20.031971,273]},{\\\\\\\"name\\\\\\\":\\\\\\\"山东\\\\\\\",\\\\\\\"value\\\\\\\":[117.000923,36.675807,229]},{\\\\\\\"name\\\\\\\":\\\\\\\"甘肃\\\\\\\",\\\\\\\"value\\\\\\\":[103.823557,36.058039,194]},{\\\\\\\"name\\\\\\\":\\\\\\\"宁夏\\\\\\\",\\\\\\\"value\\\\\\\":[106.278179,38.46637,193]},{\\\\\\\"name\\\\\\\":\\\\\\\"浙江\\\\\\\",\\\\\\\"value\\\\\\\":[120.153576,30.287459,177]},{\\\\\\\"name\\\\\\\":\\\\\\\"湖南\\\\\\\",\\\\\\\"value\\\\\\\":[112.982279,28.19409,119]},{\\\\\\\"name\\\\\\\":\\\\\\\"湖北\\\\\\\",\\\\\\\"value\\\\\\\":[114.298572,30.584355,79]},{\\\\\\\"name\\\\\\\":\\\\\\\"河南\\\\\\\",\\\\\\\"value\\\\\\\":[113.665412,34.757975,67]},{\\\\\\\"name\\\\\\\":\\\\\\\"北京\\\\\\\",\\\\\\\"value\\\\\\\":[116.405285,39.904989,58]},{\\\\\\\"name\\\\\\\":\\\\\\\"天津\\\\\\\",\\\\\\\"value\\\\\\\":[117.190182,39.125596,59]},{\\\\\\\"name\\\\\\\":\\\\\\\"上海\\\\\\\",\\\\\\\"value\\\\\\\":[121.472644,31.231706,63]}],\\\\\\\"name\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"emphasis\\\\\\\":{\\\\\\\"label\\\\\\\":{\\\\\\\"show\\\\\\\":true}},\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FF1205\\\\\\\"},\\\\\\\"coordinateSystem\\\\\\\":\\\\\\\"geo\\\\\\\",\\\\\\\"label\\\\\\\":{\\\\\\\"formatter\\\\\\\":\\\\\\\"{b}\\\\\\\",\\\\\\\"show\\\\\\\":false,\\\\\\\"position\\\\\\\":\\\\\\\"right\\\\\\\"},\\\\\\\"type\\\\\\\":\\\\\\\"scatter\\\\\\\",\\\\\\\"symbolSize\\\\\\\":5}],\\\\\\\"chartType\\\\\\\":\\\\\\\"map\\\\\\\",\\\\\\\"tooltip\\\\\\\":{\\\\\\\"show\\\\\\\":true,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#fff\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"title\\\\\\\":{\\\\\\\"show\\\\\\\":false,\\\\\\\"top\\\\\\\":5,\\\\\\\"text\\\\\\\":\\\\\\\"主要城市空气质量\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#c23531\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"normal\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"14\\\\\\\"},\\\\\\\"left\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"padding\\\\\\\":[5,20,5,10]}}\\\",\\\"url\\\":\\\"\\\",\\\"extData\\\":{\\\"chartType\\\":\\\"map.scatter\\\"},\\\"layer_id\\\":\\\"YTri6J59av4gj1CY\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[7,5],[7,6],[7,7],[7,8]]},{\\\"row\\\":14,\\\"col\\\":12,\\\"width\\\":\\\"244\\\",\\\"height\\\":\\\"138\\\",\\\"config\\\":\\\"{\\\\\\\"legend\\\\\\\":{\\\\\\\"padding\\\\\\\":[25,20,25,10],\\\\\\\"data\\\\\\\":[\\\\\\\"销售额\\\\\\\",\\\\\\\"其他\\\\\\\"],\\\\\\\"top\\\\\\\":\\\\\\\"top\\\\\\\",\\\\\\\"orient\\\\\\\":\\\\\\\"horizontal\\\\\\\",\\\\\\\"left\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"show\\\\\\\":false,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#333\\\\\\\",\\\\\\\"fontSize\\\\\\\":12}},\\\\\\\"series\\\\\\\":[{\\\\\\\"isRose\\\\\\\":false,\\\\\\\"data\\\\\\\":[{\\\\\\\"name\\\\\\\":\\\\\\\"销售额\\\\\\\",\\\\\\\"value\\\\\\\":6000000,\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"rgba(43,193,254,1)\\\\\\\"}},{\\\\\\\"name\\\\\\\":\\\\\\\"其他\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"rgba(42,45,76,0.59)\\\\\\\"}}],\\\\\\\"isRadius\\\\\\\":true,\\\\\\\"roseType\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"notCount\\\\\\\":false,\\\\\\\"name\\\\\\\":\\\\\\\"访问来源\\\\\\\",\\\\\\\"minAngle\\\\\\\":0,\\\\\\\"label\\\\\\\":{\\\\\\\"show\\\\\\\":false,\\\\\\\"position\\\\\\\":\\\\\\\"outside\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"fontSize\\\\\\\":16,\\\\\\\"fontWeight\\\\\\\":\\\\\\\"bolder\\\\\\\"}},\\\\\\\"type\\\\\\\":\\\\\\\"pie\\\\\\\",\\\\\\\"radius\\\\\\\":[\\\\\\\"50%\\\\\\\",\\\\\\\"60%\\\\\\\"],\\\\\\\"autoSort\\\\\\\":false}],\\\\\\\"tooltip\\\\\\\":{\\\\\\\"formatter\\\\\\\":\\\\\\\"{b} : {c}\\\\\\\",\\\\\\\"show\\\\\\\":true,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#fff\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"title\\\\\\\":{\\\\\\\"show\\\\\\\":false,\\\\\\\"top\\\\\\\":5,\\\\\\\"text\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#c23531\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"bolder\\\\\\\",\\\\\\\"fontSize\\\\\\\":18},\\\\\\\"left\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"padding\\\\\\\":[5,20,5,10]}}\\\",\\\"url\\\":\\\"\\\",\\\"extData\\\":{\\\"dataType\\\":\\\"api\\\",\\\"apiStatus\\\":\\\"1\\\",\\\"dataId\\\":\\\"1339498906765000705\\\",\\\"axisX\\\":\\\"name\\\",\\\"axisY\\\":\\\"value\\\",\\\"series\\\":\\\"type\\\",\\\"yText\\\":\\\"\\\",\\\"xText\\\":\\\"\\\",\\\"dbCode\\\":\\\"xsjd\\\",\\\"dataId1\\\":\\\"\\\",\\\"source\\\":\\\"\\\",\\\"target\\\":\\\"\\\",\\\"isTiming\\\":true,\\\"intervalTime\\\":\\\"5\\\",\\\"chartType\\\":\\\"pie.doughnut\\\",\\\"chartId\\\":\\\"pie.doughnut\\\"},\\\"layer_id\\\":\\\"ARuuHLfjqV9l1tQD\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[14,12],[14,13],[14,14]]},{\\\"row\\\":14,\\\"col\\\":15,\\\"width\\\":\\\"230\\\",\\\"height\\\":\\\"139\\\",\\\"config\\\":\\\"{\\\\\\\"legend\\\\\\\":{\\\\\\\"padding\\\\\\\":[25,20,25,10],\\\\\\\"data\\\\\\\":[\\\\\\\"销售额\\\\\\\",\\\\\\\"其他\\\\\\\"],\\\\\\\"top\\\\\\\":\\\\\\\"top\\\\\\\",\\\\\\\"orient\\\\\\\":\\\\\\\"horizontal\\\\\\\",\\\\\\\"left\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"show\\\\\\\":false,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#333\\\\\\\",\\\\\\\"fontSize\\\\\\\":12}},\\\\\\\"series\\\\\\\":[{\\\\\\\"isRose\\\\\\\":false,\\\\\\\"data\\\\\\\":[{\\\\\\\"name\\\\\\\":\\\\\\\"销售额\\\\\\\",\\\\\\\"value\\\\\\\":6000000,\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"rgba(43,193,254,1)\\\\\\\"}},{\\\\\\\"name\\\\\\\":\\\\\\\"其他\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"rgba(42,45,76,0.59)\\\\\\\"}}],\\\\\\\"isRadius\\\\\\\":true,\\\\\\\"roseType\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"notCount\\\\\\\":false,\\\\\\\"name\\\\\\\":\\\\\\\"访问来源\\\\\\\",\\\\\\\"minAngle\\\\\\\":0,\\\\\\\"label\\\\\\\":{\\\\\\\"show\\\\\\\":false,\\\\\\\"position\\\\\\\":\\\\\\\"outside\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"fontSize\\\\\\\":16,\\\\\\\"fontWeight\\\\\\\":\\\\\\\"bolder\\\\\\\"}},\\\\\\\"type\\\\\\\":\\\\\\\"pie\\\\\\\",\\\\\\\"radius\\\\\\\":[\\\\\\\"45%\\\\\\\",\\\\\\\"55%\\\\\\\"],\\\\\\\"autoSort\\\\\\\":false}],\\\\\\\"tooltip\\\\\\\":{\\\\\\\"formatter\\\\\\\":\\\\\\\"{b} : {c}\\\\\\\",\\\\\\\"show\\\\\\\":true,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#fff\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"title\\\\\\\":{\\\\\\\"show\\\\\\\":false,\\\\\\\"top\\\\\\\":5,\\\\\\\"text\\\\\\\":\\\\\\\"某站点用户访问来源\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#c23531\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"bolder\\\\\\\",\\\\\\\"fontSize\\\\\\\":18},\\\\\\\"left\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"padding\\\\\\\":[5,20,5,10]}}\\\",\\\"url\\\":\\\"\\\",\\\"extData\\\":{\\\"dataType\\\":\\\"api\\\",\\\"apiStatus\\\":\\\"1\\\",\\\"dataId\\\":\\\"1339498906765000705\\\",\\\"axisX\\\":\\\"name\\\",\\\"axisY\\\":\\\"value\\\",\\\"series\\\":\\\"type\\\",\\\"yText\\\":\\\"\\\",\\\"xText\\\":\\\"\\\",\\\"dbCode\\\":\\\"xsjd\\\",\\\"dataId1\\\":\\\"\\\",\\\"source\\\":\\\"\\\",\\\"target\\\":\\\"\\\",\\\"isTiming\\\":true,\\\"intervalTime\\\":\\\"5\\\",\\\"chartType\\\":\\\"pie.doughnut\\\",\\\"chartId\\\":\\\"\\\"},\\\"layer_id\\\":\\\"bcrMtWqTd2AJIjLd\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[14,15],[14,16],[14,17],[14,18]]},{\\\"row\\\":14,\\\"col\\\":10,\\\"width\\\":\\\"244\\\",\\\"height\\\":\\\"138\\\",\\\"config\\\":\\\"{\\\\\\\"yAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"rotate\\\\\\\":0,\\\\\\\"interval\\\\\\\":0,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"data\\\\\\\":[\\\\\\\"北京\\\\\\\",\\\\\\\"青岛\\\\\\\",\\\\\\\"合肥\\\\\\\",\\\\\\\"深圳\\\\\\\",\\\\\\\"石家庄\\\\\\\",\\\\\\\"重庆\\\\\\\",\\\\\\\"保定\\\\\\\",\\\\\\\"邯郸\\\\\\\"],\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\"}},\\\\\\\"show\\\\\\\":true,\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"red\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false},\\\\\\\"type\\\\\\\":\\\\\\\"category\\\\\\\"},\\\\\\\"xAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#333\\\\\\\",\\\\\\\"fontSize\\\\\\\":12}},\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#333\\\\\\\"}},\\\\\\\"show\\\\\\\":false,\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"red\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false},\\\\\\\"type \\\\\\\":\\\\\\\"value\\\\\\\"},\\\\\\\"legend\\\\\\\":{\\\\\\\"padding\\\\\\\":[25,20,25,10],\\\\\\\"data\\\\\\\":[\\\\\\\"销售额\\\\\\\"],\\\\\\\"top\\\\\\\":\\\\\\\"top\\\\\\\",\\\\\\\"orient\\\\\\\":\\\\\\\"horizontal\\\\\\\",\\\\\\\"left\\\\\\\":\\\\\\\"center\\\\\\\",\\\\\\\"show\\\\\\\":false,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#333\\\\\\\",\\\\\\\"fontSize\\\\\\\":12}},\\\\\\\"grid\\\\\\\":{\\\\\\\"top\\\\\\\":10,\\\\\\\"left\\\\\\\":49,\\\\\\\"bottom\\\\\\\":15,\\\\\\\"right\\\\\\\":45},\\\\\\\"series\\\\\\\":[{\\\\\\\"barWidth\\\\\\\":9,\\\\\\\"data\\\\\\\":[80,500,800,1000,1200,1500,1600,2000],\\\\\\\"name\\\\\\\":\\\\\\\"销售额\\\\\\\",\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"barBorderRadius\\\\\\\":0,\\\\\\\"color\\\\\\\":\\\\\\\"rgba(146,119,252,1)\\\\\\\"},\\\\\\\"label\\\\\\\":{\\\\\\\"show\\\\\\\":true,\\\\\\\"position\\\\\\\":\\\\\\\"right\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#698AFB\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"normal\\\\\\\"}},\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\",\\\\\\\"barMinHeight\\\\\\\":2,\\\\\\\"typeData\\\\\\\":[],\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"black\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"bolder\\\\\\\"}}],\\\\\\\"tooltip\\\\\\\":{\\\\\\\"show\\\\\\\":true,\\\\\\\"axisPointer\\\\\\\":{\\\\\\\"type\\\\\\\":\\\\\\\"shadow\\\\\\\"},\\\\\\\"trigger\\\\\\\":\\\\\\\"axis\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#fff\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"title\\\\\\\":{\\\\\\\"show\\\\\\\":false,\\\\\\\"top\\\\\\\":5,\\\\\\\"text\\\\\\\":\\\\\\\"某站点用户访问来源\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#c23531\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"bolder\\\\\\\",\\\\\\\"fontSize\\\\\\\":18},\\\\\\\"left\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"padding\\\\\\\":[5,20,5,20]}}\\\",\\\"url\\\":\\\"\\\",\\\"extData\\\":{\\\"dataType\\\":\\\"api\\\",\\\"apiStatus\\\":\\\"1\\\",\\\"dataId\\\":\\\"1339495346077728770\\\",\\\"axisX\\\":\\\"name\\\",\\\"axisY\\\":\\\"value\\\",\\\"series\\\":\\\"type\\\",\\\"yText\\\":\\\"\\\",\\\"xText\\\":\\\"\\\",\\\"dbCode\\\":\\\"chengshi\\\",\\\"dataId1\\\":\\\"\\\",\\\"source\\\":\\\"\\\",\\\"target\\\":\\\"\\\",\\\"isTiming\\\":true,\\\"intervalTime\\\":\\\"5\\\",\\\"chartType\\\":\\\"bar.multi.horizontal\\\",\\\"chartId\\\":\\\"bar.multi.horizontal\\\"},\\\"layer_id\\\":\\\"Y1kgYOWBHIVQdSN5\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[14,10],[14,11]]},{\\\"row\\\":20,\\\"col\\\":1,\\\"width\\\":\\\"743\\\",\\\"height\\\":\\\"150\\\",\\\"config\\\":\\\"{\\\\\\\"yAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\"}},\\\\\\\"show\\\\\\\":true,\\\\\\\"name\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"red\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false}},\\\\\\\"xAxis\\\\\\\":{\\\\\\\"axisLabel\\\\\\\":{\\\\\\\"rotate\\\\\\\":0,\\\\\\\"interval\\\\\\\":0,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FEFEFE\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"data\\\\\\\":[\\\\\\\"2020-01-09\\\\\\\",\\\\\\\"2020-01-12\\\\\\\",\\\\\\\"2020-01-14\\\\\\\",\\\\\\\"2020-01-16\\\\\\\",\\\\\\\"2020-01-18\\\\\\\"],\\\\\\\"axisLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\"}},\\\\\\\"show\\\\\\\":true,\\\\\\\"name\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"splitLine\\\\\\\":{\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"red\\\\\\\",\\\\\\\"width\\\\\\\":1,\\\\\\\"type\\\\\\\":\\\\\\\"solid\\\\\\\"},\\\\\\\"show\\\\\\\":false}},\\\\\\\"grid\\\\\\\":{\\\\\\\"top\\\\\\\":53,\\\\\\\"left\\\\\\\":22,\\\\\\\"bottom\\\\\\\":37,\\\\\\\"right\\\\\\\":20},\\\\\\\"series\\\\\\\":[{\\\\\\\"areaStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#43B8FB\\\\\\\",\\\\\\\"opacity\\\\\\\":0.7},\\\\\\\"data\\\\\\\":[2,6,7,5,6],\\\\\\\"showSymbol\\\\\\\":true,\\\\\\\"lineStyle\\\\\\\":{\\\\\\\"width\\\\\\\":2},\\\\\\\"symbolSize\\\\\\\":5,\\\\\\\"isArea\\\\\\\":true,\\\\\\\"name\\\\\\\":\\\\\\\"销量\\\\\\\",\\\\\\\"itemStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#43B8FB\\\\\\\"},\\\\\\\"step\\\\\\\":false,\\\\\\\"label\\\\\\\":{\\\\\\\"show\\\\\\\":false,\\\\\\\"position\\\\\\\":\\\\\\\"top\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"black\\\\\\\",\\\\\\\"fontSize\\\\\\\":16,\\\\\\\"fontWeight\\\\\\\":\\\\\\\"bolder\\\\\\\"}},\\\\\\\"type\\\\\\\":\\\\\\\"line\\\\\\\",\\\\\\\"smooth\\\\\\\":false}],\\\\\\\"tooltip\\\\\\\":{\\\\\\\"formatter\\\\\\\":\\\\\\\"{b} : {c}\\\\\\\",\\\\\\\"show\\\\\\\":true,\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#fff\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"10\\\\\\\"}},\\\\\\\"title\\\\\\\":{\\\\\\\"show\\\\\\\":true,\\\\\\\"top\\\\\\\":14,\\\\\\\"text\\\\\\\":\\\\\\\"销售额增速\\\\\\\",\\\\\\\"textStyle\\\\\\\":{\\\\\\\"color\\\\\\\":\\\\\\\"#FFFFFF\\\\\\\",\\\\\\\"fontWeight\\\\\\\":\\\\\\\"normal\\\\\\\",\\\\\\\"fontSize\\\\\\\":\\\\\\\"14\\\\\\\"},\\\\\\\"left\\\\\\\":\\\\\\\"left\\\\\\\",\\\\\\\"padding\\\\\\\":[5,20,5,10]}}\\\",\\\"url\\\":\\\"\\\",\\\"extData\\\":{\\\"dataType\\\":\\\"api\\\",\\\"apiStatus\\\":\\\"1\\\",\\\"dataId\\\":\\\"1339538388453195777\\\",\\\"axisX\\\":\\\"name\\\",\\\"axisY\\\":\\\"value\\\",\\\"series\\\":\\\"type\\\",\\\"yText\\\":\\\"\\\",\\\"xText\\\":\\\"\\\",\\\"dbCode\\\":\\\"zhexian\\\",\\\"dataId1\\\":\\\"\\\",\\\"source\\\":\\\"\\\",\\\"target\\\":\\\"\\\",\\\"isTiming\\\":true,\\\"intervalTime\\\":\\\"5\\\",\\\"chartType\\\":\\\"line.area\\\",\\\"chartId\\\":\\\"\\\"},\\\"layer_id\\\":\\\"uChrZaHYoV04MQpT\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[20,1],[20,2],[20,3],[20,4],[20,5],[20,6],[20,7],[20,8],[20,9]]}],\\\"area\\\":{\\\"sri\\\":4,\\\"sci\\\":5,\\\"eri\\\":4,\\\"eci\\\":5,\\\"width\\\":105,\\\"height\\\":38},\\\"printElWidth\\\":1800,\\\"excel_config_id\\\":\\\"1339478701846433792\\\",\\\"printElHeight\\\":1047,\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{}},\\\"2\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[0,17],\\\"text\\\":\\\"企业实时销售数据\\\",\\\"style\\\":3}}},\\\"3\\\":{\\\"cells\\\":{},\\\"height\\\":35},\\\"4\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"  销售额省份排名\\\",\\\"style\\\":32,\\\"merge\\\":[0,1],\\\"virtual\\\":\\\"IFj1lg5S5aNG1wPx\\\"},\\\"2\\\":{\\\"style\\\":32,\\\"virtual\\\":\\\"IFj1lg5S5aNG1wPx\\\"},\\\"5\\\":{\\\"text\\\":\\\"  销售总额\\\",\\\"style\\\":69},\\\"10\\\":{\\\"text\\\":\\\"  销售进度\\\",\\\"style\\\":43},\\\"11\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":43},\\\"13\\\":{\\\"text\\\":\\\"  销售额城市排名\\\",\\\"style\\\":32,\\\"merge\\\":[0,1]},\\\"14\\\":{\\\"style\\\":32},\\\"15\\\":{\\\"text\\\":\\\"  个人业绩排名\\\",\\\"style\\\":32,\\\"merge\\\":[0,1]},\\\"16\\\":{\\\"style\\\":32},\\\"17\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":32,\\\"merge\\\":[0,1]},\\\"18\\\":{\\\"style\\\":32}},\\\"height\\\":38},\\\"5\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"   Sales ranking points\\\",\\\"virtual\\\":\\\"IFj1lg5S5aNG1wPx\\\",\\\"style\\\":62,\\\"merge\\\":[0,1]},\\\"2\\\":{\\\"style\\\":31},\\\"5\\\":{\\\"text\\\":\\\"12436025\\\",\\\"style\\\":52,\\\"merge\\\":[1,0]},\\\"6\\\":{\\\"merge\\\":[1,0],\\\"text\\\":\\\"元\\\",\\\"style\\\":22},\\\"10\\\":{\\\"text\\\":\\\"   Sales progress\\\",\\\"style\\\":33},\\\"11\\\":{\\\"text\\\":\\\"\\\",\\\"virtual\\\":\\\"Yb2TIGEAxnvN9ITx\\\",\\\"style\\\":33},\\\"13\\\":{\\\"text\\\":\\\"   Sales ranking\\\",\\\"virtual\\\":\\\"qQHpevWlqElpRQUl\\\",\\\"style\\\":31},\\\"14\\\":{\\\"style\\\":32},\\\"15\\\":{\\\"text\\\":\\\"   Personal  ranking\\\",\\\"style\\\":62,\\\"merge\\\":[0,1]},\\\"16\\\":{\\\"style\\\":62},\\\"17\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":62,\\\"merge\\\":[0,1]},\\\"18\\\":{\\\"style\\\":62}},\\\"height\\\":24},\\\"6\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"\\\",\\\"merge\\\":[0,1],\\\"style\\\":31,\\\"virtual\\\":\\\"IFj1lg5S5aNG1wPx\\\"},\\\"2\\\":{\\\"style\\\":31,\\\"virtual\\\":\\\"IFj1lg5S5aNG1wPx\\\"},\\\"3\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"IFj1lg5S5aNG1wPx\\\"},\\\"4\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"IFj1lg5S5aNG1wPx\\\"},\\\"5\\\":{\\\"style\\\":53},\\\"6\\\":{\\\"style\\\":22},\\\"10\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"Yb2TIGEAxnvN9ITx\\\"},\\\"11\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":33,\\\"virtual\\\":\\\"Yb2TIGEAxnvN9ITx\\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"qQHpevWlqElpRQUl\\\"},\\\"13\\\":{\\\"text\\\":\\\"\\\",\\\"virtual\\\":\\\"qQHpevWlqElpRQUl\\\",\\\"style\\\":31},\\\"14\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"qQHpevWlqElpRQUl\\\"},\\\"15\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"phTmhkjHLebYlOEQ\\\"},\\\"16\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"phTmhkjHLebYlOEQ\\\"},\\\"17\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":31,\\\"virtual\\\":\\\"phTmhkjHLebYlOEQ\\\"},\\\"18\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"phTmhkjHLebYlOEQ\\\"}}},\\\"7\\\":{\\\"cells\\\":{\\\"5\\\":{\\\"style\\\":53,\\\"virtual\\\":\\\"YTri6J59av4gj1CY\\\"},\\\"6\\\":{\\\"style\\\":22,\\\"virtual\\\":\\\"YTri6J59av4gj1CY\\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"YTri6J59av4gj1CY\\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"YTri6J59av4gj1CY\\\"}}},\\\"8\\\":{\\\"cells\\\":{\\\"5\\\":{\\\"style\\\":18,\\\"text\\\":\\\"\\\",\\\"virtual\\\":\\\"YTri6J59av4gj1CY\\\"}}},\\\"9\\\":{\\\"cells\\\":{\\\"5\\\":{\\\"style\\\":21,\\\"text\\\":\\\"\\\"}}},\\\"10\\\":{\\\"cells\\\":{\\\"5\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":17}}},\\\"12\\\":{\\\"cells\\\":{\\\"10\\\":{\\\"text\\\":\\\"  品类销售排名\\\",\\\"style\\\":43},\\\"11\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":43},\\\"13\\\":{\\\"text\\\":\\\"  品类销售额占比\\\",\\\"style\\\":43,\\\"merge\\\":[0,1]},\\\"14\\\":{\\\"style\\\":54},\\\"15\\\":{\\\"text\\\":\\\"  一季度销售季度\\\",\\\"style\\\":43,\\\"merge\\\":[0,1]},\\\"16\\\":{\\\"style\\\":54},\\\"17\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":43,\\\"merge\\\":[0,1]},\\\"18\\\":{\\\"style\\\":54}}},\\\"13\\\":{\\\"cells\\\":{\\\"10\\\":{\\\"text\\\":\\\"   Category Sales  ranking\\\",\\\"style\\\":31},\\\"11\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":31},\\\"13\\\":{\\\"text\\\":\\\"   Type of Sales \\\",\\\"style\\\":31},\\\"15\\\":{\\\"text\\\":\\\"   Quarterly sales progree\\\",\\\"style\\\":58,\\\"merge\\\":[0,1]},\\\"16\\\":{\\\"style\\\":58},\\\"17\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":58,\\\"merge\\\":[0,1]},\\\"18\\\":{\\\"style\\\":58}}},\\\"14\\\":{\\\"cells\\\":{\\\"10\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"Y1kgYOWBHIVQdSN5\\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"Y1kgYOWBHIVQdSN5\\\"},\\\"12\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"ARuuHLfjqV9l1tQD\\\"},\\\"13\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"ARuuHLfjqV9l1tQD\\\"},\\\"14\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"ARuuHLfjqV9l1tQD\\\"},\\\"15\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"bcrMtWqTd2AJIjLd\\\"},\\\"16\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"bcrMtWqTd2AJIjLd\\\"},\\\"17\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"bcrMtWqTd2AJIjLd\\\"},\\\"18\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"bcrMtWqTd2AJIjLd\\\"}}},\\\"15\\\":{\\\"cells\\\":{},\\\"height\\\":15},\\\"16\\\":{\\\"cells\\\":{\\\"11\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":43},\\\"13\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":43,\\\"merge\\\":[0,1]},\\\"14\\\":{\\\"style\\\":54},\\\"17\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":43,\\\"merge\\\":[0,1]},\\\"18\\\":{\\\"style\\\":54}}},\\\"17\\\":{\\\"cells\\\":{\\\"11\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":31},\\\"13\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":31},\\\"17\\\":{\\\"text\\\":\\\"\\\",\\\"merge\\\":[0,1],\\\"style\\\":58},\\\"18\\\":{\\\"style\\\":58}}},\\\"18\\\":{\\\"cells\\\":{}},\\\"20\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"uChrZaHYoV04MQpT\\\"},\\\"2\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"uChrZaHYoV04MQpT\\\"},\\\"3\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"uChrZaHYoV04MQpT\\\"},\\\"4\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"uChrZaHYoV04MQpT\\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"uChrZaHYoV04MQpT\\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"uChrZaHYoV04MQpT\\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"uChrZaHYoV04MQpT\\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"uChrZaHYoV04MQpT\\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"uChrZaHYoV04MQpT\\\"}},\\\"height\\\":39},\\\"22\\\":{\\\"cells\\\":{\\\"10\\\":{\\\"text\\\":\\\"企业经营指标\\\",\\\"style\\\":74},\\\"11\\\":{\\\"text\\\":\\\"1201043元\\\",\\\"style\\\":73},\\\"13\\\":{\\\"text\\\":\\\"企业经营指标\\\",\\\"style\\\":74},\\\"14\\\":{\\\"text\\\":\\\"1201043元\\\",\\\"style\\\":73},\\\"16\\\":{\\\"text\\\":\\\"企业经营指标\\\",\\\"style\\\":74},\\\"17\\\":{\\\"text\\\":\\\"1201043元\\\",\\\"style\\\":73}}},\\\"23\\\":{\\\"cells\\\":{\\\"10\\\":{\\\"text\\\":\\\"企业经营指标1\\\",\\\"style\\\":74},\\\"11\\\":{\\\"text\\\":\\\"1201043元\\\",\\\"style\\\":73},\\\"13\\\":{\\\"text\\\":\\\"企业经营指标1\\\",\\\"style\\\":74},\\\"14\\\":{\\\"text\\\":\\\"1201043元\\\",\\\"style\\\":73},\\\"16\\\":{\\\"text\\\":\\\"企业经营指标1\\\",\\\"style\\\":74},\\\"17\\\":{\\\"text\\\":\\\"1201043元\\\",\\\"style\\\":73}}},\\\"26\\\":{\\\"cells\\\":{},\\\"height\\\":33},\\\"len\\\":100},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":794,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":1584,\\\"background\\\":{\\\"path\\\":\\\"https://static.jeecg.com/designreport/images/bg55_1608205385382.png\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"width\\\":\\\"1525\\\",\\\"height\\\":\\\"700\\\"},\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"color\\\":\\\"#ffffff\\\"},{\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":16}},{\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":16},\\\"align\\\":\\\"center\\\"},{\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":18},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":18}},{\\\"color\\\":\\\"#67b1ee\\\"},{\\\"color\\\":\\\"#67b1ee\\\",\\\"font\\\":{\\\"size\\\":14}},{\\\"color\\\":\\\"#67b1ee\\\",\\\"font\\\":{\\\"size\\\":12}},{\\\"font\\\":{\\\"size\\\":14}},{\\\"font\\\":{\\\"size\\\":18},\\\"bgcolor\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"size\\\":18},\\\"bgcolor\\\":\\\"#ffffff\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"size\\\":16},\\\"bgcolor\\\":\\\"#ffffff\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"color\\\":\\\"#67b1ee\\\",\\\"font\\\":{\\\"size\\\":12},\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"size\\\":16},\\\"bgcolor\\\":\\\"#ffffff\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"right\\\"},{\\\"color\\\":\\\"#67b1ee\\\",\\\"font\\\":{\\\"size\\\":12},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":16}},{\\\"font\\\":{\\\"size\\\":16},\\\"color\\\":\\\"#fe0000\\\"},{\\\"font\\\":{\\\"size\\\":16},\\\"color\\\":\\\"#fe0000\\\",\\\"align\\\":\\\"center\\\"},{\\\"color\\\":\\\"#67b1ee\\\",\\\"font\\\":{\\\"size\\\":12},\\\"align\\\":\\\"left\\\"},{\\\"align\\\":\\\"left\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14},\\\"color\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"size\\\":14},\\\"color\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"size\\\":12},\\\"color\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":true},\\\"color\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":false},\\\"color\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"size\\\":8}},{\\\"font\\\":{\\\"size\\\":9}},{\\\"font\\\":{\\\"size\\\":9},\\\"color\\\":\\\"#67b1ee\\\"},{\\\"font\\\":{\\\"size\\\":9},\\\"color\\\":\\\"#67b1ee\\\",\\\"valign\\\":\\\"top\\\"},{\\\"font\\\":{\\\"size\\\":8},\\\"color\\\":\\\"#67b1ee\\\",\\\"valign\\\":\\\"top\\\"},{\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":false},\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"size\\\":8},\\\"color\\\":\\\"#67b1ee\\\"},{\\\"color\\\":\\\"#67b1ee\\\",\\\"font\\\":{\\\"size\\\":12},\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"color\\\":\\\"#67b1ee\\\",\\\"font\\\":{\\\"size\\\":12},\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"color\\\":\\\"#67b1ee\\\",\\\"font\\\":{\\\"size\\\":12},\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"font\\\":{\\\"size\\\":11}},{\\\"font\\\":{\\\"size\\\":11},\\\"color\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"size\\\":11},\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"font\\\":{\\\"size\\\":11},\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":12},\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"middle\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"color\\\":\\\"#67b1ee\\\",\\\"font\\\":{\\\"size\\\":16}},{\\\"color\\\":\\\"#ffff01\\\",\\\"font\\\":{\\\"size\\\":16}},{\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":11},\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":14},\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"color\\\":\\\"#ffff01\\\",\\\"font\\\":{\\\"size\\\":14},\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"font\\\":{\\\"size\\\":14},\\\"color\\\":\\\"#ffff01\\\"},{\\\"color\\\":\\\"#ffff01\\\",\\\"font\\\":{\\\"size\\\":14},\\\"align\\\":\\\"right\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"font\\\":{\\\"size\\\":14},\\\"color\\\":\\\"#ffff01\\\",\\\"align\\\":\\\"right\\\"},{\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"size\\\":8},\\\"bgcolor\\\":\\\"#67b1ee\\\"},{\\\"font\\\":{\\\"size\\\":8},\\\"bgcolor\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"size\\\":8},\\\"bgcolor\\\":\\\"#ffffff\\\",\\\"color\\\":\\\"#67b1ee\\\"},{\\\"font\\\":{\\\"size\\\":8},\\\"bgcolor\\\":\\\"#ffffff\\\",\\\"color\\\":\\\"#67b1ee\\\",\\\"valign\\\":\\\"top\\\"},{\\\"font\\\":{\\\"size\\\":8,\\\"bold\\\":false},\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"size\\\":8,\\\"bold\\\":false},\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"top\\\"},{\\\"font\\\":{\\\"size\\\":8},\\\"valign\\\":\\\"top\\\"},{\\\"font\\\":{\\\"size\\\":8,\\\"bold\\\":false},\\\"color\\\":\\\"#67b1ee\\\",\\\"valign\\\":\\\"top\\\"},{\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":11},\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"align\\\":\\\"center\\\"},{\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":11},\\\"align\\\":\\\"right\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"align\\\":\\\"right\\\"},{\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":14},\\\"align\\\":\\\"right\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":14}},{\\\"color\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"size\\\":11},\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"color\\\":\\\"#67b1ee\\\",\\\"font\\\":{\\\"size\\\":11}},{\\\"color\\\":\\\"#67b1ee\\\",\\\"font\\\":{\\\"size\\\":11},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":12}},{\\\"font\\\":{\\\"size\\\":12},\\\"color\\\":\\\"#ffff01\\\"},{\\\"color\\\":\\\"#67b1ee\\\",\\\"font\\\":{\\\"size\\\":11},\\\"align\\\":\\\"right\\\"}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":10},\\\"3\\\":{\\\"width\\\":102},\\\"4\\\":{\\\"width\\\":9},\\\"5\\\":{\\\"width\\\":105},\\\"6\\\":{\\\"width\\\":102},\\\"8\\\":{\\\"width\\\":124},\\\"9\\\":{\\\"width\\\":14},\\\"10\\\":{\\\"width\\\":136},\\\"11\\\":{\\\"width\\\":114},\\\"12\\\":{\\\"width\\\":15},\\\"13\\\":{\\\"width\\\":113},\\\"14\\\":{\\\"width\\\":129},\\\"15\\\":{\\\"width\\\":11},\\\"len\\\":27},\\\"merges\\\":[\\\"B7:C7\\\",\\\"N17:O17\\\",\\\"R17:S17\\\",\\\"R18:S18\\\",\\\"B3:S3\\\",\\\"R6:S6\\\",\\\"B5:C5\\\",\\\"B6:C6\\\",\\\"F6:F7\\\",\\\"G6:G7\\\",\\\"N5:O5\\\",\\\"R5:S5\\\",\\\"N13:O13\\\",\\\"R13:S13\\\",\\\"R14:S14\\\",\\\"P5:Q5\\\",\\\"P6:Q6\\\",\\\"P14:Q14\\\",\\\"P13:Q13\\\"]}', NULL, 'https://static.jeecg.com/designreport/images/QQ截图20201218200943_1608293404719.png', 'admin', '2021-01-18 13:21:10', 'admin', '2021-02-03 14:01:28', 0, NULL, NULL, 0, 666, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('519c1c6f4d1f584ae8fa5b43b45acdc7', '56623333333', '销售单', '', NULL, '984302991393210368', '{\\\"loopBlockList\\\":[],\\\"area\\\":false,\\\"excel_config_id\\\":\\\"519c1c6f4d1f584ae8fa5b43b45acdc7\\\",\\\"printConfig\\\":{\\\"paper\\\":\\\"A4\\\",\\\"width\\\":210,\\\"height\\\":297,\\\"definition\\\":1,\\\"isBackend\\\":false,\\\"marginX\\\":10,\\\"marginY\\\":10},\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"销售单\\\",\\\"style\\\":40,\\\"merge\\\":[0,6]}},\\\"height\\\":99},\\\"1\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"商品编码\\\",\\\"style\\\":62},\\\"2\\\":{\\\"text\\\":\\\"商品名称\\\",\\\"style\\\":62},\\\"3\\\":{\\\"text\\\":\\\"销售时间\\\",\\\"style\\\":62},\\\"4\\\":{\\\"text\\\":\\\"销售数量\\\",\\\"style\\\":62},\\\"5\\\":{\\\"text\\\":\\\"定价\\\",\\\"style\\\":62},\\\"6\\\":{\\\"text\\\":\\\"优惠价\\\",\\\"style\\\":62},\\\"7\\\":{\\\"text\\\":\\\"付款金额\\\",\\\"style\\\":62}},\\\"height\\\":39},\\\"2\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"#{xiaoshou.bianma}\\\",\\\"style\\\":61},\\\"2\\\":{\\\"text\\\":\\\"#{xiaoshou.cname}\\\",\\\"style\\\":61},\\\"3\\\":{\\\"text\\\":\\\"#{xiaoshou.ctime}\\\",\\\"style\\\":61},\\\"4\\\":{\\\"text\\\":\\\"#{xiaoshou.cnum}\\\",\\\"style\\\":61},\\\"5\\\":{\\\"text\\\":\\\"#{xiaoshou.cprice}\\\",\\\"style\\\":61},\\\"6\\\":{\\\"text\\\":\\\"#{xiaoshou.yprice}\\\",\\\"style\\\":61},\\\"7\\\":{\\\"text\\\":\\\"#{xiaoshou.ctotal}\\\",\\\"style\\\":61}},\\\"isDrag\\\":true,\\\"height\\\":35},\\\"3\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":44,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"style\\\":44,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":45},\\\"7\\\":{\\\"style\\\":46,\\\"text\\\":\\\"=SUM(H3)\\\"}},\\\"isDrag\\\":true,\\\"height\\\":73},\\\"5\\\":{\\\"cells\\\":{},\\\"isDrag\\\":true},\\\"6\\\":{\\\"cells\\\":{},\\\"isDrag\\\":true},\\\"7\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"\\\"}},\\\"isDrag\\\":true},\\\"len\\\":100},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":703,\\\"displayConfig\\\":{},\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#01b0f1\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#01b0f1\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#01b0f1\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#01b0f1\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#01b0f1\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#01b0f1\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#01b0f1\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#01b0f1\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#01b0f1\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#01b0f1\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#01b0f1\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#01b0f1\\\"]},\\\"bgcolor\\\":\\\"#01b0f1\\\"},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"bgcolor\\\":\\\"#01b0f1\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"bgcolor\\\":\\\"#fed964\\\"},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"bgcolor\\\":\\\"#fdc101\\\"},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#fdc101\\\"]},\\\"bgcolor\\\":\\\"#fdc101\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#fdc101\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#fdc101\\\"]},\\\"bgcolor\\\":\\\"#ffe59a\\\"},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#fdc101\\\"]},\\\"bgcolor\\\":\\\"#ffc001\\\"},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#fdc101\\\"]},\\\"bgcolor\\\":\\\"#fed964\\\"},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#fdc101\\\"]},\\\"bgcolor\\\":\\\"#ed7d31\\\"},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#fdc101\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#fdc101\\\"]},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#4371c6\\\"]},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#4371c6\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":8}},{\\\"font\\\":{\\\"size\\\":8},\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#4371c6\\\"]},\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#4371c6\\\"]}},{\\\"font\\\":{\\\"bold\\\":true}},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":12}},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":16}},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":18}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"align\\\":\\\"right\\\"},{\\\"align\\\":\\\"right\\\"},{\\\"align\\\":\\\"left\\\"},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":14}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#4371c6\\\"]},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#4371c6\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#2e75b5\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#2e75b5\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#2e75b5\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#2e75b5\\\"]},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffff01\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffff01\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffff01\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffff01\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"宋体\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#2e75b5\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#2e75b5\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#2e75b5\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#2e75b5\\\"]},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#4371c6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#4371c6\\\"]},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":18},\\\"1\\\":{\\\"width\\\":102},\\\"2\\\":{\\\"width\\\":132},\\\"3\\\":{\\\"width\\\":147},\\\"4\\\":{\\\"width\\\":66},\\\"5\\\":{\\\"width\\\":66},\\\"6\\\":{\\\"width\\\":84},\\\"7\\\":{\\\"width\\\":88},\\\"8\\\":{\\\"width\\\":121},\\\"len\\\":50},\\\"merges\\\":[\\\"B1:H1\\\"]}', '', 'https://static.jeecg.com/designreport/images/xiaoshou_1607310086160.png', 'jeecg', '2020-07-28 16:54:44', 'admin', '2021-04-01 03:09:25', 0, NULL, NULL, 1, 2088, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('53c82a76f837d5661dceec7d93afafec', '5678', '阜阳检票数查询', '', NULL, '984302991393210368', '{\\\"loopBlockList\\\":[],\\\"area\\\":false,\\\"printElWidth\\\":718,\\\"excel_config_id\\\":\\\"53c82a76f837d5661dceec7d93afafec\\\",\\\"printElHeight\\\":1047,\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":58},\\\"1\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":66},\\\"2\\\":{\\\"style\\\":66},\\\"3\\\":{\\\"style\\\":67,\\\"merge\\\":[0,3],\\\"text\\\":\\\"阜阳火车站检票数\\\"},\\\"4\\\":{\\\"style\\\":67},\\\"5\\\":{\\\"style\\\":67},\\\"6\\\":{\\\"style\\\":67},\\\"7\\\":{\\\"style\\\":66},\\\"8\\\":{\\\"style\\\":66},\\\"9\\\":{\\\"style\\\":58}},\\\"height\\\":63},\\\"1\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":58},\\\"1\\\":{\\\"style\\\":66},\\\"2\\\":{\\\"style\\\":66},\\\"3\\\":{\\\"style\\\":66},\\\"4\\\":{\\\"style\\\":66},\\\"5\\\":{\\\"style\\\":66},\\\"6\\\":{\\\"style\\\":66},\\\"7\\\":{\\\"style\\\":66},\\\"8\\\":{\\\"style\\\":66},\\\"9\\\":{\\\"style\\\":58}},\\\"height\\\":20},\\\"2\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":58},\\\"1\\\":{\\\"text\\\":\\\"日期：\\\",\\\"style\\\":68},\\\"2\\\":{\\\"text\\\":\\\"${gongsi.tdata}\\\",\\\"style\\\":69},\\\"3\\\":{\\\"style\\\":66},\\\"4\\\":{\\\"style\\\":66,\\\"text\\\":\\\"制表人：\\\"},\\\"5\\\":{\\\"text\\\":\\\"${gongsi.gname}\\\",\\\"style\\\":66},\\\"6\\\":{\\\"style\\\":66},\\\"7\\\":{\\\"text\\\":\\\"\\\",\\\"merge\\\":[0,1],\\\"style\\\":70},\\\"8\\\":{\\\"style\\\":70},\\\"9\\\":{\\\"style\\\":58}},\\\"isDrag\\\":true},\\\"3\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":58},\\\"1\\\":{\\\"text\\\":\\\"班次\\\",\\\"merge\\\":[1,0],\\\"style\\\":71},\\\"2\\\":{\\\"text\\\":\\\"发车时间\\\",\\\"merge\\\":[1,0],\\\"style\\\":71},\\\"3\\\":{\\\"text\\\":\\\"是否放空\\\",\\\"merge\\\":[1,0],\\\"style\\\":71},\\\"4\\\":{\\\"text\\\":\\\"路线\\\",\\\"merge\\\":[0,1],\\\"style\\\":71},\\\"5\\\":{\\\"style\\\":72},\\\"6\\\":{\\\"text\\\":\\\"核载座位数\\\",\\\"merge\\\":[1,0],\\\"style\\\":71},\\\"7\\\":{\\\"merge\\\":[1,0],\\\"style\\\":71,\\\"text\\\":\\\"检票数\\\"},\\\"8\\\":{\\\"merge\\\":[1,0],\\\"style\\\":71,\\\"text\\\":\\\"实载率（%）\\\"},\\\"9\\\":{\\\"style\\\":58}}},\\\"4\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":58},\\\"1\\\":{\\\"style\\\":72},\\\"2\\\":{\\\"style\\\":71},\\\"3\\\":{\\\"style\\\":72},\\\"4\\\":{\\\"text\\\":\\\"从\\\",\\\"style\\\":71},\\\"5\\\":{\\\"text\\\":\\\"到\\\",\\\"style\\\":71},\\\"6\\\":{\\\"style\\\":72},\\\"7\\\":{\\\"style\\\":71},\\\"8\\\":{\\\"style\\\":72},\\\"9\\\":{\\\"style\\\":58}},\\\"height\\\":25},\\\"5\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":58},\\\"1\\\":{\\\"style\\\":73,\\\"text\\\":\\\"#{jianpiao.bnum}\\\"},\\\"2\\\":{\\\"style\\\":73,\\\"text\\\":\\\"#{jianpiao.ftime}\\\"},\\\"3\\\":{\\\"style\\\":73,\\\"text\\\":\\\"#{jianpiao.sfkong}\\\"},\\\"4\\\":{\\\"style\\\":73,\\\"text\\\":\\\"#{jianpiao.kaishi}\\\"},\\\"5\\\":{\\\"style\\\":73,\\\"text\\\":\\\"#{jianpiao.jieshu}\\\"},\\\"6\\\":{\\\"style\\\":73,\\\"text\\\":\\\"#{jianpiao.hezairen}\\\"},\\\"7\\\":{\\\"style\\\":73,\\\"text\\\":\\\"#{jianpiao.jpnum}\\\"},\\\"8\\\":{\\\"style\\\":73,\\\"text\\\":\\\"#{jianpiao.shihelv}\\\"},\\\"9\\\":{\\\"style\\\":58}},\\\"height\\\":33},\\\"6\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":11},\\\"2\\\":{\\\"style\\\":11},\\\"3\\\":{\\\"style\\\":11},\\\"4\\\":{\\\"style\\\":11},\\\"5\\\":{\\\"style\\\":11},\\\"6\\\":{\\\"style\\\":11},\\\"7\\\":{\\\"style\\\":11},\\\"8\\\":{\\\"style\\\":11}},\\\"isDrag\\\":true},\\\"7\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":11},\\\"2\\\":{\\\"style\\\":11,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"style\\\":11},\\\"4\\\":{\\\"style\\\":11},\\\"5\\\":{\\\"style\\\":11},\\\"6\\\":{\\\"style\\\":11},\\\"7\\\":{\\\"style\\\":11},\\\"8\\\":{\\\"style\\\":11}}},\\\"8\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":11},\\\"2\\\":{\\\"style\\\":11},\\\"3\\\":{\\\"style\\\":11},\\\"4\\\":{\\\"style\\\":11},\\\"5\\\":{\\\"style\\\":11},\\\"6\\\":{\\\"style\\\":11},\\\"7\\\":{\\\"style\\\":11},\\\"8\\\":{\\\"style\\\":11}}},\\\"9\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":11},\\\"2\\\":{\\\"style\\\":11},\\\"3\\\":{\\\"style\\\":11},\\\"4\\\":{\\\"style\\\":11},\\\"5\\\":{\\\"style\\\":11},\\\"6\\\":{\\\"style\\\":11},\\\"7\\\":{\\\"style\\\":11},\\\"8\\\":{\\\"style\\\":11}}},\\\"10\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":11},\\\"2\\\":{\\\"style\\\":11},\\\"3\\\":{\\\"style\\\":11},\\\"4\\\":{\\\"style\\\":11},\\\"5\\\":{\\\"style\\\":11},\\\"6\\\":{\\\"style\\\":11},\\\"7\\\":{\\\"style\\\":11},\\\"8\\\":{\\\"style\\\":11}}},\\\"11\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":11},\\\"2\\\":{\\\"style\\\":11},\\\"3\\\":{\\\"style\\\":11},\\\"4\\\":{\\\"style\\\":11},\\\"5\\\":{\\\"style\\\":11},\\\"6\\\":{\\\"style\\\":11},\\\"7\\\":{\\\"style\\\":11},\\\"8\\\":{\\\"style\\\":11}}},\\\"12\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":11},\\\"2\\\":{\\\"style\\\":11},\\\"3\\\":{\\\"style\\\":11},\\\"4\\\":{\\\"style\\\":11},\\\"5\\\":{\\\"style\\\":11},\\\"6\\\":{\\\"style\\\":11},\\\"7\\\":{\\\"style\\\":11},\\\"8\\\":{\\\"style\\\":11}}},\\\"13\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":11},\\\"2\\\":{\\\"style\\\":11},\\\"3\\\":{\\\"style\\\":11},\\\"4\\\":{\\\"style\\\":11},\\\"5\\\":{\\\"style\\\":11},\\\"6\\\":{\\\"style\\\":11},\\\"7\\\":{\\\"style\\\":11},\\\"8\\\":{\\\"style\\\":11}}},\\\"14\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":11},\\\"2\\\":{\\\"style\\\":11},\\\"3\\\":{\\\"style\\\":11},\\\"4\\\":{\\\"style\\\":11},\\\"5\\\":{\\\"style\\\":11},\\\"6\\\":{\\\"style\\\":11},\\\"7\\\":{\\\"style\\\":11},\\\"8\\\":{\\\"style\\\":11}}},\\\"len\\\":96,\\\"-1\\\":{\\\"cells\\\":{\\\"-1\\\":{\\\"text\\\":\\\"${gongsi.id}\\\"}},\\\"isDrag\\\":true}},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":701,\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"font\\\":{\\\"bold\\\":true}},{\\\"font\\\":{\\\"bold\\\":false}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"align\\\":\\\"right\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"bold\\\":true},\\\"bgcolor\\\":\\\"#4371c6\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true},\\\"bgcolor\\\":\\\"#4371c6\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#4371c6\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#4371c6\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#2e75b5\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#2e75b5\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#0170c1\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#0170c1\\\"},{\\\"font\\\":{\\\"bold\\\":false},\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#01b0f1\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#01b0f1\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true},\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":22,\\\"bold\\\":true},\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true},\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"bold\\\":false},\\\"color\\\":\\\"#7f7f7f\\\",\\\"align\\\":\\\"right\\\"},{\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"},\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"bold\\\":false,\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#7f7f7f\\\",\\\"align\\\":\\\"right\\\"},{\\\"color\\\":\\\"#7f7f7f\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"name\\\":\\\"宋体\\\"},\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false,\\\"name\\\":\\\"宋体\\\"},\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"bold\\\":false,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"color\\\":\\\"#7f7f7f\\\",\\\"align\\\":\\\"right\\\"},{\\\"color\\\":\\\"#7f7f7f\\\",\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":17},\\\"1\\\":{\\\"width\\\":118},\\\"2\\\":{\\\"width\\\":75},\\\"3\\\":{\\\"width\\\":54},\\\"4\\\":{\\\"width\\\":95},\\\"5\\\":{\\\"width\\\":109},\\\"6\\\":{\\\"width\\\":75},\\\"7\\\":{\\\"width\\\":75},\\\"8\\\":{\\\"width\\\":83},\\\"9\\\":{\\\"width\\\":30},\\\"len\\\":50},\\\"merges\\\":[\\\"E4:F4\\\",\\\"B4:B5\\\",\\\"C4:C5\\\",\\\"D4:D5\\\",\\\"G4:G5\\\",\\\"H4:H5\\\",\\\"I4:I5\\\",\\\"D1:G1\\\",\\\"H3:I3\\\"]}', '', 'https://static.jeecg.com/designreport/images/25_1597233573577.png', 'jeecg', '2020-06-16 15:01:42', 'admin', '2021-02-03 12:11:37', 0, NULL, NULL, 1, 696, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('6059e405dd9c66a6d38e00841d2e40cc', '566777', '处方笺', '', NULL, '984302991393210368', '{\\\"loopBlockList\\\":[],\\\"area\\\":{\\\"sri\\\":9,\\\"sci\\\":3,\\\"eri\\\":9,\\\"eci\\\":11,\\\"width\\\":593,\\\"height\\\":25},\\\"printElWidth\\\":718,\\\"excel_config_id\\\":\\\"6059e405dd9c66a6d38e00841d2e40cc\\\",\\\"printElHeight\\\":1047,\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"3\\\":{\\\"style\\\":80,\\\"text\\\":\\\" \\\"}},\\\"height\\\":96},\\\"1\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":24,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"style\\\":25,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":25,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":25,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":25,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":25,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":25,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":25,\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"style\\\":25,\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"style\\\":25,\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"style\\\":25,\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"style\\\":26,\\\"text\\\":\\\" \\\"}},\\\"height\\\":18},\\\"2\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":27},\\\"2\\\":{\\\"merge\\\":[0,9],\\\"text\\\":\\\"智能医学院处方笺\\\",\\\"style\\\":38},\\\"3\\\":{\\\"style\\\":12,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":12,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":12,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":12,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":12,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":12,\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"style\\\":12,\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"style\\\":12,\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"style\\\":28,\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"style\\\":80,\\\"text\\\":\\\" \\\"}},\\\"height\\\":124},\\\"3\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":46},\\\"2\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"姓名：\\\",\\\"style\\\":4},\\\"3\\\":{\\\"style\\\":4,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"text\\\":\\\"${yonghu.yphone}\\\"},\\\"5\\\":{\\\"text\\\":\\\"性别：\\\",\\\"style\\\":42},\\\"6\\\":{\\\"text\\\":\\\"${yonghu.ysex}\\\",\\\"style\\\":42},\\\"7\\\":{\\\"text\\\":\\\"年龄：\\\",\\\"style\\\":47},\\\"8\\\":{\\\"text\\\":\\\"${yonghu.yage}\\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":42},\\\"11\\\":{\\\"style\\\":69,\\\"text\\\":\\\" \\\",\\\"merge\\\":[0,1]},\\\"12\\\":{\\\"style\\\":43,\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"style\\\":80,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true},\\\"4\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":74},\\\"2\\\":{\\\"style\\\":4,\\\"merge\\\":[0,1],\\\"text\\\":\\\"单位：\\\"},\\\"3\\\":{\\\"style\\\":4,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"text\\\":\\\"${yonghu.danwei}\\\"},\\\"5\\\":{\\\"text\\\":\\\"电话：\\\"},\\\"6\\\":{\\\"text\\\":\\\"${yonghu.yphone}\\\",\\\"merge\\\":[0,5]},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"style\\\":28,\\\"text\\\":\\\" \\\"},\\\"15\\\":{\\\"text\\\":\\\"\\\"}},\\\"isDrag\\\":true,\\\"height\\\":29},\\\"5\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":31,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"初步诊断：\\\",\\\"style\\\":4},\\\"3\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":4},\\\"4\\\":{\\\"text\\\":\\\"${yonghu.yjieguo}\\\",\\\"merge\\\":[0,7]},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"style\\\":28,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true,\\\"height\\\":34},\\\"6\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\" RP：\\\",\\\"merge\\\":[0,2],\\\"style\\\":79},\\\"2\\\":{\\\"style\\\":11,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":11,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":39,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":0,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":0,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":0,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":0,\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"style\\\":0,\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"style\\\":28,\\\"text\\\":\\\" \\\"},\\\"14\\\":{},\\\"16\\\":{}},\\\"height\\\":79},\\\"7\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\".\\\",\\\"style\\\":48},\\\"2\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":1},\\\"3\\\":{\\\"text\\\":\\\"#{yaopin.name}\\\",\\\"merge\\\":[0,1]},\\\"5\\\":{},\\\"6\\\":{},\\\"7\\\":{\\\"text\\\":\\\"#{yaopin.percent}\\\",\\\"merge\\\":[0,1]},\\\"9\\\":{},\\\"10\\\":{},\\\"11\\\":{\\\"text\\\":\\\"\\\"},\\\"12\\\":{\\\"style\\\":28,\\\"text\\\":\\\" \\\"},\\\"14\\\":{}},\\\"isDrag\\\":true,\\\"height\\\":37},\\\"8\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":31,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"style\\\":28,\\\"text\\\":\\\" \\\"}},\\\"height\\\":27},\\\"9\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":31,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"text\\\":\\\"医嘱：\\\",\\\"style\\\":76},\\\"3\\\":{\\\"text\\\":\\\"${yonghu.yizhu}\\\",\\\"style\\\":6,\\\"merge\\\":[0,8]},\\\"12\\\":{\\\"style\\\":28,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true},\\\"10\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":31,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"text\\\":\\\"药品费\\\",\\\"style\\\":6,\\\"merge\\\":[0,1]},\\\"3\\\":{\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"text\\\":\\\"${yonghu.yprice}\\\",\\\"style\\\":6},\\\"5\\\":{\\\"text\\\":\\\"中成药费\\\",\\\"style\\\":6,\\\"rendered\\\":\\\"\\\",\\\"merge\\\":[0,1]},\\\"7\\\":{\\\"style\\\":6,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\"治疗费\\\",\\\"merge\\\":[0,2],\\\"style\\\":6},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"style\\\":6,\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"style\\\":28,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true},\\\"11\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":31,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"text\\\":\\\"检查费\\\",\\\"style\\\":6,\\\"merge\\\":[0,1]},\\\"3\\\":{\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":6,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\"换药费\\\",\\\"style\\\":6,\\\"merge\\\":[0,1]},\\\"7\\\":{\\\"style\\\":6,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"merge\\\":[0,2],\\\"text\\\":\\\"诊疗费\\\",\\\"style\\\":6},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\"${yonghu.yzhenliao}\\\",\\\"style\\\":6},\\\"12\\\":{\\\"style\\\":28,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true},\\\"12\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":31,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"text\\\":\\\"注射费\\\",\\\"style\\\":6,\\\"merge\\\":[0,1]},\\\"3\\\":{\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":6,\\\"merge\\\":[0,3],\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"merge\\\":[0,2],\\\"text\\\":\\\"其他\\\",\\\"style\\\":6},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"style\\\":6,\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"style\\\":28,\\\"text\\\":\\\" \\\"}}},\\\"13\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":31,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"text\\\":\\\"合计\\\",\\\"style\\\":6,\\\"merge\\\":[0,1]},\\\"3\\\":{\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"text\\\":\\\"${yonghu.ytotal}\\\",\\\"style\\\":6,\\\"merge\\\":[0,7]},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"style\\\":28,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true},\\\"14\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":31,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"style\\\":28,\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"style\\\":80,\\\"text\\\":\\\" \\\"}},\\\"height\\\":9},\\\"15\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":31,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"text\\\":\\\"医师：\\\",\\\"style\\\":4,\\\"rendered\\\":\\\"\\\",\\\"merge\\\":[0,1]},\\\"4\\\":{\\\"text\\\":\\\"${yonghu.yishe}\\\",\\\"style\\\":80},\\\"5\\\":{\\\"style\\\":80,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":80,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":80,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\"日期：\\\",\\\"style\\\":4},\\\"9\\\":{\\\"text\\\":\\\"${yonghu.kdata}\\\",\\\"style\\\":80,\\\"merge\\\":[0,2]},\\\"12\\\":{\\\"style\\\":71,\\\"text\\\":\\\" \\\"},\\\"13\\\":{\\\"style\\\":80,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true,\\\"height\\\":43},\\\"16\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":31,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"style\\\":80,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":80,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":80,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":80,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":80,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":80,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":80,\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"style\\\":80,\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"style\\\":80,\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"style\\\":80,\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"style\\\":28,\\\"text\\\":\\\" \\\"}},\\\"height\\\":17},\\\"17\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":32},\\\"2\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":33},\\\"3\\\":{\\\"style\\\":33,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":33},\\\"5\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":33},\\\"6\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":33},\\\"7\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":33},\\\"8\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":33},\\\"9\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":33},\\\"10\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":33},\\\"11\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":33},\\\"12\\\":{\\\"text\\\":\\\" \\\",\\\"style\\\":34}}},\\\"18\\\":{\\\"cells\\\":{\\\"11\\\":{\\\"text\\\":\\\"\\\"}},\\\"isDrag\\\":true},\\\"len\\\":94,\\\"-1\\\":{\\\"cells\\\":{\\\"-1\\\":{\\\"text\\\":\\\"#{yaopin.key1}\\\"}},\\\"isDrag\\\":true},\\\"\\\":{\\\"cells\\\":{\\\"NaN\\\":{\\\"text\\\":\\\"\\\",\\\"rendered\\\":\\\"\\\"}}}},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":709,\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"font\\\":{\\\"size\\\":12}},{\\\"font\\\":{\\\"size\\\":10}},{\\\"font\\\":{\\\"size\\\":12},\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"size\\\":14}},{\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"right\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":12},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":true},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":15},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":15}},{\\\"align\\\":\\\"left\\\"},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":true}},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":true},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"valign\\\":\\\"bottom\\\"},{\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"right\\\",\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"valign\\\":\\\"bottom\\\",\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"valign\\\":\\\"bottom\\\",\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"textwrap\\\":true},{\\\"font\\\":{\\\"size\\\":10},\\\"textwrap\\\":true},{\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"textwrap\\\":false},{\\\"font\\\":{\\\"size\\\":10},\\\"textwrap\\\":false},{\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"textwrap\\\":false,\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"textwrap\\\":false,\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"textwrap\\\":false,\\\"align\\\":\\\"left\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"textwrap\\\":false,\\\"align\\\":\\\"left\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"textwrap\\\":false,\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"textwrap\\\":false,\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":15},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"size\\\":15},\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"size\\\":15},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"valign\\\":\\\"bottom\\\",\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"valign\\\":\\\"bottom\\\",\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":false,\\\"align\\\":\\\"left\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":15},\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":10},\\\"valign\\\":\\\"bottom\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"left\\\"},{\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"right\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"size\\\":10},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":15,\\\"bold\\\":true},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{},{\\\"font\\\":{\\\"size\\\":15,\\\"bold\\\":true},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"right\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":23},\\\"1\\\":{\\\"width\\\":14},\\\"2\\\":{\\\"width\\\":56},\\\"3\\\":{\\\"width\\\":40},\\\"4\\\":{\\\"width\\\":156},\\\"5\\\":{\\\"width\\\":41},\\\"6\\\":{\\\"width\\\":18},\\\"7\\\":{\\\"width\\\":92},\\\"8\\\":{\\\"width\\\":58},\\\"9\\\":{\\\"width\\\":20},\\\"10\\\":{\\\"width\\\":20},\\\"11\\\":{\\\"width\\\":148},\\\"12\\\":{\\\"width\\\":12},\\\"13\\\":{\\\"width\\\":11},\\\"len\\\":50},\\\"merges\\\":[\\\"C3:E3\\\",\\\"C7:E7\\\",\\\"H3:I3\\\",\\\"H7:I7\\\",\\\"C7:E7\\\",\\\"H7:I7\\\",\\\"I11:K11\\\",\\\"I12:K12\\\",\\\"I13:K13\\\",\\\"E13:H13\\\",\\\"C11:D11\\\",\\\"C12:D12\\\",\\\"C13:D13\\\",\\\"C14:D14\\\",\\\"L4:M4\\\",\\\"C3:L3\\\",\\\"B7:D7\\\",\\\"C4:D4\\\",\\\"C5:D5\\\",\\\"E14:L14\\\",\\\"G5:L5\\\",\\\"C6:D6\\\",\\\"E6:L6\\\",\\\"D8:E8\\\",\\\"H8:I8\\\",\\\"C16:D16\\\",\\\"J16:L16\\\",\\\"F11:G11\\\",\\\"F12:G12\\\",\\\"D10:L10\\\"]}', '', 'https://static.jeecg.com/designreport/images/处方_1607071731580.png', 'jeecg', '2020-07-10 17:12:16', 'admin', '2021-02-03 14:03:05', 0, NULL, NULL, 1, 849, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('6d6bdcb5e820c301ea32789e3ae43c44', '1223', '供电公司抢修单', '', NULL, '984302991393210368', '{\\\"loopBlockList\\\":[],\\\"area\\\":{\\\"sri\\\":14,\\\"sci\\\":8,\\\"eri\\\":14,\\\"eci\\\":8,\\\"width\\\":100,\\\"height\\\":67},\\\"printElWidth\\\":718,\\\"excel_config_id\\\":\\\"6d6bdcb5e820c301ea32789e3ae43c44\\\",\\\"printElHeight\\\":1047,\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{},\\\"height\\\":11},\\\"1\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"供电公司抢修竣工单\\\",\\\"merge\\\":[0,5],\\\"style\\\":39},\\\"2\\\":{\\\"style\\\":39},\\\"3\\\":{\\\"style\\\":39},\\\"4\\\":{\\\"style\\\":39},\\\"5\\\":{\\\"style\\\":39},\\\"6\\\":{\\\"style\\\":39}},\\\"height\\\":56},\\\"2\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"填报单位：\\\",\\\"style\\\":26},\\\"2\\\":{\\\"text\\\":\\\"#{qiangxiu.danwei}\\\",\\\"style\\\":27},\\\"3\\\":{\\\"style\\\":27},\\\"4\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":27},\\\"5\\\":{\\\"text\\\":\\\"填报日期：\\\",\\\"style\\\":26},\\\"6\\\":{\\\"text\\\":\\\"#{qiangxiu.time}\\\",\\\"style\\\":27}}},\\\"3\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"填报名称：\\\",\\\"style\\\":26},\\\"2\\\":{\\\"text\\\":\\\"#{qiangxiu.ktime}\\\",\\\"style\\\":27},\\\"3\\\":{\\\"style\\\":27},\\\"4\\\":{\\\"style\\\":27},\\\"5\\\":{\\\"text\\\":\\\"项目编号：\\\",\\\"style\\\":26},\\\"6\\\":{\\\"text\\\":\\\"#{qiangxiu.wtime}\\\",\\\"style\\\":27}}},\\\"4\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":28},\\\"2\\\":{\\\"style\\\":28},\\\"3\\\":{\\\"style\\\":28},\\\"4\\\":{\\\"style\\\":28},\\\"5\\\":{\\\"style\\\":28},\\\"6\\\":{\\\"style\\\":28}},\\\"height\\\":10},\\\"5\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"项目批准核算\\\",\\\"style\\\":29},\\\"2\\\":{\\\"text\\\":\\\"#{qiangxiu.yusuan}\\\",\\\"style\\\":30,\\\"merge\\\":[0,4]}},\\\"height\\\":89},\\\"6\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"开工日期\\\",\\\"style\\\":32},\\\"2\\\":{\\\"style\\\":33,\\\"text\\\":\\\"#{qiangxiu.ktime}\\\",\\\"merge\\\":[0,1]},\\\"3\\\":{\\\"style\\\":28},\\\"4\\\":{\\\"style\\\":34,\\\"text\\\":\\\"完工日期\\\"},\\\"5\\\":{\\\"style\\\":33,\\\"merge\\\":[0,1],\\\"text\\\":\\\"#{qiangxiu.wtime}\\\"},\\\"6\\\":{\\\"style\\\":28}},\\\"height\\\":31},\\\"7\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"完工主要内容\\\",\\\"style\\\":32},\\\"2\\\":{\\\"style\\\":33,\\\"text\\\":\\\"#{qiangxiu.neirong}\\\",\\\"merge\\\":[0,4]}},\\\"height\\\":71},\\\"8\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"形成能力\\\",\\\"style\\\":32},\\\"2\\\":{\\\"style\\\":33,\\\"merge\\\":[0,4],\\\"text\\\":\\\"#{qiangxiu.nengli}\\\"},\\\"3\\\":{\\\"style\\\":28},\\\"4\\\":{\\\"style\\\":28},\\\"5\\\":{\\\"style\\\":28},\\\"6\\\":{\\\"style\\\":28}},\\\"height\\\":49},\\\"9\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"目标效益验收意见\\\",\\\"style\\\":32},\\\"2\\\":{\\\"style\\\":35,\\\"text\\\":\\\"#{qiangxiu.yijian}\\\",\\\"rendered\\\":\\\"\\\",\\\"merge\\\":[0,4]}},\\\"height\\\":100},\\\"10\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":37,\\\"text\\\":\\\"                                                                                                                     \\\",\\\"merge\\\":[0,3]},\\\"2\\\":{\\\"style\\\":28},\\\"3\\\":{\\\"style\\\":28},\\\"4\\\":{\\\"style\\\":28},\\\"5\\\":{\\\"style\\\":37,\\\"text\\\":\\\"#{qiangxiu.time1}\\\",\\\"merge\\\":[0,1]},\\\"6\\\":{\\\"style\\\":28}}},\\\"11\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"实施质量验收评价\\\",\\\"style\\\":32},\\\"2\\\":{\\\"style\\\":35,\\\"text\\\":\\\"#{qiangxiu.pingjia}\\\",\\\"merge\\\":[0,4]}},\\\"height\\\":99},\\\"12\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":33,\\\"merge\\\":[0,3]},\\\"2\\\":{\\\"style\\\":28},\\\"3\\\":{\\\"style\\\":28},\\\"4\\\":{\\\"style\\\":28},\\\"5\\\":{\\\"style\\\":33,\\\"merge\\\":[0,1],\\\"text\\\":\\\"#{qiangxiu.time1}\\\"},\\\"6\\\":{\\\"style\\\":28}}},\\\"13\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"验收总结\\\",\\\"style\\\":32},\\\"2\\\":{\\\"style\\\":35,\\\"text\\\":\\\"#{qiangxiu.zongjie}\\\",\\\"merge\\\":[0,4],\\\"rendered\\\":\\\"\\\"}},\\\"height\\\":80},\\\"14\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"责任单位意见\\\",\\\"style\\\":32},\\\"2\\\":{\\\"style\\\":33,\\\"merge\\\":[0,4],\\\"text\\\":\\\"#{qiangxiu.zongjie}\\\"}},\\\"height\\\":67},\\\"15\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"责任单位审核人\\\",\\\"style\\\":32},\\\"2\\\":{\\\"style\\\":33,\\\"merge\\\":[0,1],\\\"text\\\":\\\"#{qiangxiu.dshenhe}\\\"},\\\"3\\\":{\\\"style\\\":28},\\\"4\\\":{\\\"style\\\":34,\\\"text\\\":\\\"日期\\\"},\\\"5\\\":{\\\"style\\\":33,\\\"text\\\":\\\"#{qiangxiu.time3}\\\",\\\"merge\\\":[0,1]},\\\"6\\\":{\\\"style\\\":28}},\\\"height\\\":42},\\\"16\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"生技部审批意见\\\",\\\"style\\\":32},\\\"2\\\":{\\\"style\\\":33,\\\"text\\\":\\\"#{qiangxiu.dshenhe}\\\",\\\"merge\\\":[0,4]}},\\\"height\\\":107},\\\"17\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"生技部主任\\\",\\\"style\\\":32},\\\"2\\\":{\\\"style\\\":33,\\\"merge\\\":[0,1],\\\"text\\\":\\\"#{qiangxiu.zhuren}\\\"},\\\"3\\\":{\\\"style\\\":28},\\\"4\\\":{\\\"style\\\":34,\\\"text\\\":\\\"日期\\\"},\\\"5\\\":{\\\"style\\\":33,\\\"text\\\":\\\"#{qiangxiu.time4}\\\",\\\"merge\\\":[0,1]},\\\"6\\\":{\\\"style\\\":28}},\\\"height\\\":41},\\\"18\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":28},\\\"2\\\":{\\\"style\\\":28},\\\"3\\\":{\\\"style\\\":28},\\\"4\\\":{\\\"style\\\":28},\\\"5\\\":{\\\"style\\\":28},\\\"6\\\":{\\\"style\\\":28}}},\\\"len\\\":100},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":699,\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"bgcolor\\\":\\\"#ffffff\\\"},{\\\"bgcolor\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"right\\\"},{\\\"align\\\":\\\"right\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"left\\\"},{\\\"align\\\":\\\"left\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true},{\\\"textwrap\\\":true},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":false},{\\\"textwrap\\\":false},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"align\\\":\\\"right\\\",\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"bgcolor\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"bold\\\":true}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"bgcolor\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"bold\\\":false}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"bold\\\":false}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"right\\\",\\\"color\\\":\\\"#7f7f7f\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"color\\\":\\\"#7f7f7f\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"bgcolor\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"bgcolor\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"bgcolor\\\":\\\"#ffffff\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false,\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"}}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":23},\\\"1\\\":{\\\"width\\\":117},\\\"3\\\":{\\\"width\\\":108},\\\"4\\\":{\\\"width\\\":127},\\\"5\\\":{\\\"width\\\":76},\\\"6\\\":{\\\"width\\\":148},\\\"7\\\":{\\\"width\\\":13},\\\"len\\\":50},\\\"merges\\\":[\\\"C7:D7\\\",\\\"F7:G7\\\",\\\"B2:G2\\\",\\\"C9:G9\\\",\\\"B11:E11\\\",\\\"F11:G11\\\",\\\"B13:E13\\\",\\\"F13:G13\\\",\\\"C16:D16\\\",\\\"C18:D18\\\",\\\"F16:G16\\\",\\\"F18:G18\\\",\\\"C10:G10\\\",\\\"C8:G8\\\",\\\"C6:G6\\\",\\\"C12:G12\\\",\\\"C14:G14\\\",\\\"C15:G15\\\",\\\"C17:G17\\\"]}', '', 'https://static.jeecg.com/designreport/images/222_1607311944321.png', 'jeecg', '2020-07-20 19:37:54', 'admin', '2021-02-03 14:00:39', 0, NULL, NULL, 1, 180, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('7905022412733a0c68dc7b4ef8947489', '8996445', '介绍信', '', NULL, '984302991393210368', '{\\\"loopBlockList\\\":[],\\\"area\\\":false,\\\"excel_config_id\\\":\\\"7905022412733a0c68dc7b4ef8947489\\\",\\\"printConfig\\\":{\\\"paper\\\":\\\"A4\\\",\\\"width\\\":210,\\\"height\\\":297,\\\"definition\\\":1,\\\"isBackend\\\":false,\\\"marginX\\\":10,\\\"marginY\\\":10},\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"1\\\":{},\\\"12\\\":{}},\\\"height\\\":11},\\\"1\\\":{\\\"cells\\\":{},\\\"height\\\":24},\\\"2\\\":{\\\"cells\\\":{},\\\"isDrag\\\":true,\\\"height\\\":43},\\\"3\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":46},\\\"1\\\":{\\\"merge\\\":[0,10],\\\"text\\\":\\\"介绍信\\\",\\\"style\\\":337}},\\\"height\\\":216},\\\"4\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"${jieshaoxin.name}\\\",\\\"style\\\":338,\\\"merge\\\":[0,3]},\\\"5\\\":{\\\"text\\\":\\\"：\\\",\\\"style\\\":339}},\\\"isDrag\\\":true,\\\"height\\\":80},\\\"5\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"兹介绍我局\\\",\\\"style\\\":340,\\\"merge\\\":[0,5]},\\\"7\\\":{\\\"text\\\":\\\"${jieshaoxin.value}\\\",\\\"style\\\":341},\\\"8\\\":{\\\"text\\\":\\\"同志\\\",\\\"style\\\":339},\\\"9\\\":{\\\"text\\\":\\\"#{jieshaoxin.percent}\\\",\\\"style\\\":339},\\\"10\\\":{\\\"text\\\":\\\"人，前往你处\\\",\\\"style\\\":339,\\\"merge\\\":[0,1]}},\\\"isDrag\\\":true,\\\"height\\\":42},\\\"6\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"${jieshaoxin.shiqing}\\\",\\\"style\\\":342,\\\"merge\\\":[0,5]},\\\"15\\\":{\\\"text\\\":\\\"\\\"}},\\\"isDrag\\\":true,\\\"height\\\":48},\\\"7\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":343,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"style\\\":344,\\\"merge\\\":[0,5],\\\"text\\\":\\\"请予接洽并给予帮助。\\\"}},\\\"height\\\":56},\\\"8\\\":{\\\"cells\\\":{},\\\"height\\\":15},\\\"9\\\":{\\\"cells\\\":{},\\\"height\\\":11},\\\"10\\\":{\\\"cells\\\":{\\\"8\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":316,\\\"merge\\\":[0,3]}},\\\"height\\\":39},\\\"11\\\":{\\\"cells\\\":{\\\"8\\\":{\\\"merge\\\":[0,2],\\\"text\\\":\\\"单位盖章\\\",\\\"style\\\":347},\\\"11\\\":{\\\"merge\\\":[0,1],\\\"style\\\":316}},\\\"height\\\":84},\\\"12\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[0,2],\\\"text\\\":\\\"\\\",\\\"style\\\":317},\\\"4\\\":{\\\"merge\\\":[0,2],\\\"text\\\":\\\"\\\",\\\"style\\\":346},\\\"7\\\":{\\\"text\\\":\\\"（有效时间：至\\\",\\\"style\\\":317},\\\"8\\\":{\\\"text\\\":\\\"${jieshaoxin.gdata}\\\",\\\"style\\\":316,\\\"merge\\\":[0,2]},\\\"11\\\":{\\\"style\\\":348,\\\"text\\\":\\\"止）\\\"}},\\\"isDrag\\\":true,\\\"height\\\":30},\\\"13\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[12,11]}}},\\\"17\\\":{\\\"cells\\\":{},\\\"isDrag\\\":true},\\\"len\\\":89},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":688,\\\"displayConfig\\\":{},\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"align\\\":\\\"left\\\"},{\\\"align\\\":\\\"left\\\",\\\"underline\\\":true},{\\\"underline\\\":true},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":true},{\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":16}},{\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"font\\\":{\\\"bold\\\":true}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false}},{\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false}},{\\\"font\\\":{\\\"bold\\\":false}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\",\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":12},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":8}},{\\\"font\\\":{\\\"size\\\":10}},{\\\"font\\\":{\\\"size\\\":10,\\\"bold\\\":true}},{\\\"font\\\":{\\\"size\\\":10,\\\"bold\\\":true},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18}},{\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16}},{\\\"font\\\":{\\\"size\\\":12},\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"size\\\":12},\\\"valign\\\":\\\"middle\\\"},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"dashed\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":true},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14,\\\"name\\\":\\\"Arial\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14,\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14,\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14,\\\"name\\\":\\\"Courier New\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Helvetica\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Helvetica\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Helvetica\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Helvetica\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"Helvetica\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Helvetica\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Helvetica\\\"},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Helvetica\\\"},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"Lato\\\"},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"Lato\\\"},\\\"valign\\\":\\\"middle\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\",\\\"bold\\\":true},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"bold\\\":true},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"right\\\"},{\\\"align\\\":\\\"right\\\"},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":12}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"valign\\\":\\\"top\\\"},{\\\"valign\\\":\\\"top\\\",\\\"align\\\":\\\"center\\\"},{\\\"valign\\\":\\\"top\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12}},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"size\\\":14}},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":14}},{\\\"font\\\":{\\\"size\\\":14},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true}},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"font\\\":{\\\"size\\\":9}},{\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":9},\\\"align\\\":\\\"left\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14},\\\"valign\\\":\\\"top\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":16},\\\"valign\\\":\\\"top\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":18},\\\"valign\\\":\\\"top\\\"},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":10}},{\\\"font\\\":{\\\"size\\\":10},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":10}},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":12},\\\"valign\\\":\\\"bottom\\\"},{\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"right\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":22},\\\"valign\\\":\\\"top\\\"},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":14},\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"size\\\":14},\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"right\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"size\\\":14},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":14},\\\"align\\\":\\\"center\\\"},{\\\"valign\\\":\\\"top\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14}}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":23},\\\"1\\\":{\\\"width\\\":46},\\\"2\\\":{\\\"width\\\":24},\\\"3\\\":{\\\"width\\\":15},\\\"4\\\":{\\\"width\\\":37},\\\"5\\\":{\\\"width\\\":13},\\\"6\\\":{\\\"width\\\":83},\\\"7\\\":{\\\"width\\\":256},\\\"8\\\":{\\\"width\\\":42},\\\"9\\\":{\\\"width\\\":18},\\\"10\\\":{\\\"width\\\":77},\\\"11\\\":{\\\"width\\\":54},\\\"12\\\":{\\\"width\\\":28},\\\"13\\\":{\\\"width\\\":62},\\\"16\\\":{\\\"width\\\":55},\\\"len\\\":50},\\\"merges\\\":[\\\"C0:D0\\\",\\\"G11:H11\\\",\\\"G12:H12\\\",\\\"B5:E5\\\",\\\"B6:G6\\\",\\\"C8:H8\\\",\\\"I12:K12\\\",\\\"B4:L4\\\",\\\"K6:L6\\\",\\\"B13:D13\\\",\\\"E13:G13\\\",\\\"I11:L11\\\",\\\"L12:M12\\\",\\\"B14:M26\\\",\\\"I13:K13\\\",\\\"B7:G7\\\"]}', '', 'https://static.jeecg.com/designreport/images/介绍xin_1607072641405.png', 'jeecg', '2020-07-10 13:38:40', 'admin', '2021-04-01 03:15:11', 0, NULL, NULL, 1, 834, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('7c02c224a2db56d0350069650033f702', '895666', '核查评估表', '', NULL, '984302991393210368', '{\\\"loopBlockList\\\":[],\\\"area\\\":{\\\"sri\\\":5,\\\"sci\\\":18,\\\"eri\\\":5,\\\"eci\\\":18,\\\"width\\\":53,\\\"height\\\":46},\\\"printElWidth\\\":1399,\\\"excel_config_id\\\":\\\"7c02c224a2db56d0350069650033f702\\\",\\\"printElHeight\\\":790,\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"XX县（市、区）YY低保第三方核查评估汇总表\\\",\\\"merge\\\":[0,21],\\\"style\\\":386},\\\"2\\\":{\\\"style\\\":386},\\\"3\\\":{\\\"style\\\":386},\\\"4\\\":{\\\"style\\\":386},\\\"5\\\":{\\\"style\\\":386},\\\"6\\\":{\\\"style\\\":386},\\\"7\\\":{\\\"style\\\":386},\\\"8\\\":{\\\"style\\\":386},\\\"9\\\":{\\\"style\\\":386},\\\"10\\\":{\\\"style\\\":386},\\\"11\\\":{\\\"style\\\":386},\\\"12\\\":{\\\"style\\\":386},\\\"13\\\":{\\\"style\\\":386},\\\"14\\\":{\\\"style\\\":386},\\\"15\\\":{\\\"style\\\":386},\\\"16\\\":{\\\"style\\\":386},\\\"17\\\":{\\\"style\\\":386},\\\"18\\\":{\\\"style\\\":386},\\\"19\\\":{\\\"style\\\":386},\\\"20\\\":{\\\"style\\\":386},\\\"21\\\":{\\\"style\\\":386},\\\"22\\\":{\\\"style\\\":386}},\\\"height\\\":70},\\\"1\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[0,2],\\\"style\\\":403,\\\"text\\\":\\\"     北京市林翠社区\\\"},\\\"2\\\":{\\\"style\\\":398,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":398,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"merge\\\":[0,2],\\\"text\\\":\\\"镇（乡、街道办事处）\\\",\\\"style\\\":399},\\\"5\\\":{\\\"style\\\":399},\\\"6\\\":{\\\"style\\\":399},\\\"7\\\":{\\\"style\\\":399,\\\"merge\\\":[0,7]},\\\"8\\\":{\\\"style\\\":400},\\\"9\\\":{\\\"style\\\":400},\\\"10\\\":{\\\"style\\\":400},\\\"11\\\":{\\\"style\\\":400},\\\"12\\\":{\\\"style\\\":400},\\\"13\\\":{\\\"style\\\":400},\\\"14\\\":{\\\"style\\\":400},\\\"15\\\":{\\\"merge\\\":[0,7],\\\"text\\\":\\\"单位：人、元、套、平方米\\\",\\\"style\\\":398},\\\"16\\\":{\\\"style\\\":401},\\\"17\\\":{\\\"style\\\":401},\\\"18\\\":{\\\"style\\\":401},\\\"19\\\":{\\\"style\\\":401},\\\"20\\\":{\\\"style\\\":401},\\\"21\\\":{\\\"style\\\":401},\\\"22\\\":{\\\"style\\\":401}}},\\\"2\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":114},\\\"2\\\":{\\\"style\\\":114},\\\"3\\\":{\\\"style\\\":114},\\\"4\\\":{\\\"style\\\":114},\\\"5\\\":{\\\"style\\\":114},\\\"6\\\":{\\\"style\\\":114},\\\"7\\\":{\\\"style\\\":114},\\\"8\\\":{\\\"style\\\":114},\\\"9\\\":{\\\"style\\\":114},\\\"10\\\":{\\\"style\\\":114},\\\"11\\\":{\\\"style\\\":114},\\\"12\\\":{\\\"style\\\":114},\\\"13\\\":{\\\"style\\\":114},\\\"14\\\":{\\\"style\\\":114},\\\"15\\\":{\\\"style\\\":114},\\\"16\\\":{\\\"style\\\":114},\\\"17\\\":{\\\"style\\\":114},\\\"18\\\":{\\\"style\\\":114},\\\"19\\\":{\\\"style\\\":114},\\\"20\\\":{\\\"style\\\":114},\\\"21\\\":{\\\"style\\\":114},\\\"22\\\":{\\\"style\\\":114}},\\\"height\\\":14},\\\"3\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":406,\\\"text\\\":\\\"村（社区）名称\\\",\\\"merge\\\":[1,0]},\\\"2\\\":{\\\"style\\\":407,\\\"text\\\":\\\"户主名称\\\",\\\"merge\\\":[1,0]},\\\"3\\\":{\\\"style\\\":407,\\\"text\\\":\\\"保障编号\\\",\\\"merge\\\":[1,0]},\\\"4\\\":{\\\"style\\\":408,\\\"text\\\":\\\"家庭人口\\\",\\\"merge\\\":[1,0]},\\\"5\\\":{\\\"style\\\":409,\\\"text\\\":\\\"家庭住址\\\",\\\"merge\\\":[1,0]},\\\"6\\\":{\\\"style\\\":409,\\\"text\\\":\\\"联系电话\\\",\\\"merge\\\":[1,0]},\\\"7\\\":{\\\"style\\\":408,\\\"text\\\":\\\"身份证号码\\\",\\\"merge\\\":[1,0]},\\\"8\\\":{\\\"style\\\":409,\\\"text\\\":\\\"原保障\\\",\\\"merge\\\":[0,2]},\\\"9\\\":{\\\"style\\\":377,\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"style\\\":377,\\\"text\\\":\\\" \\\"},\\\"11\\\":{\\\"text\\\":\\\"核减后月人均收入\\\",\\\"style\\\":408,\\\"merge\\\":[1,0]},\\\"12\\\":{\\\"merge\\\":[0,5],\\\"text\\\":\\\"保障建议\\\",\\\"style\\\":410},\\\"13\\\":{\\\"style\\\":379,\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"style\\\":379,\\\"text\\\":\\\" \\\"},\\\"15\\\":{\\\"style\\\":379,\\\"text\\\":\\\" \\\"},\\\"16\\\":{\\\"style\\\":379,\\\"text\\\":\\\" \\\"},\\\"17\\\":{\\\"style\\\":379,\\\"text\\\":\\\" \\\"},\\\"18\\\":{\\\"text\\\":\\\"是否新增对象\\\",\\\"style\\\":411,\\\"merge\\\":[1,0]},\\\"19\\\":{\\\"text\\\":\\\"建议取消原因\\\",\\\"style\\\":409,\\\"merge\\\":[0,3]},\\\"20\\\":{\\\"style\\\":377,\\\"text\\\":\\\" \\\"},\\\"21\\\":{\\\"style\\\":377,\\\"text\\\":\\\" \\\"},\\\"22\\\":{\\\"style\\\":377,\\\"text\\\":\\\" \\\"}}},\\\"4\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":381,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"style\\\":407,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":382,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":408,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":377,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":409,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":383,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"text\\\":\\\"户数\\\",\\\"style\\\":412},\\\"9\\\":{\\\"style\\\":411,\\\"text\\\":\\\"人口\\\"},\\\"10\\\":{\\\"style\\\":413,\\\"text\\\":\\\"金额\\\"},\\\"11\\\":{\\\"style\\\":383,\\\"text\\\":\\\" \\\"},\\\"12\\\":{\\\"text\\\":\\\"保障类型\\\",\\\"style\\\":408},\\\"13\\\":{\\\"style\\\":413,\\\"text\\\":\\\"人口\\\"},\\\"14\\\":{\\\"style\\\":408,\\\"text\\\":\\\"差额补助\\\"},\\\"15\\\":{\\\"style\\\":408,\\\"text\\\":\\\"全额补助\\\"},\\\"16\\\":{\\\"style\\\":408,\\\"text\\\":\\\"增发补助\\\"},\\\"17\\\":{\\\"style\\\":408,\\\"text\\\":\\\"合计补助\\\"},\\\"18\\\":{\\\"style\\\":411,\\\"text\\\":\\\" \\\"},\\\"19\\\":{\\\"style\\\":408,\\\"text\\\":\\\"收入超标\\\"},\\\"20\\\":{\\\"style\\\":406,\\\"text\\\":\\\"机动车超标\\\"},\\\"21\\\":{\\\"style\\\":410,\\\"text\\\":\\\"死亡\\\"},\\\"22\\\":{\\\"style\\\":410,\\\"text\\\":\\\"其他\\\"}},\\\"height\\\":50},\\\"5\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"#{hecha.name}\\\",\\\"style\\\":414,\\\"rendered\\\":\\\"\\\"},\\\"2\\\":{\\\"text\\\":\\\"#{hecha.hname}\\\",\\\"style\\\":414},\\\"3\\\":{\\\"text\\\":\\\"#{hecha.num}\\\",\\\"style\\\":414},\\\"4\\\":{\\\"text\\\":\\\"#{hecha.knum}\\\",\\\"style\\\":414},\\\"5\\\":{\\\"text\\\":\\\"#{hecha.zhuzhi}\\\",\\\"style\\\":414},\\\"6\\\":{\\\"text\\\":\\\"#{hecha.phone}\\\",\\\"style\\\":414},\\\"7\\\":{\\\"text\\\":\\\"#{hecha.scard}\\\",\\\"style\\\":414},\\\"8\\\":{\\\"text\\\":\\\"#{hecha.yhnum}\\\",\\\"style\\\":414},\\\"9\\\":{\\\"text\\\":\\\"#{hecha.yren}\\\",\\\"style\\\":414},\\\"10\\\":{\\\"text\\\":\\\"#{hecha.yjine}\\\",\\\"style\\\":414},\\\"11\\\":{\\\"text\\\":\\\"#{hecha.yjine}\\\",\\\"style\\\":414},\\\"12\\\":{\\\"text\\\":\\\"#{hecha.type}\\\",\\\"style\\\":414},\\\"13\\\":{\\\"text\\\":\\\"#{hecha.rk}\\\",\\\"style\\\":414},\\\"14\\\":{\\\"text\\\":\\\"#{hecha.cbz}\\\",\\\"style\\\":414},\\\"15\\\":{\\\"text\\\":\\\"#{hecha.cbz}\\\",\\\"style\\\":414},\\\"16\\\":{\\\"text\\\":\\\"#{hecha.cbz}\\\",\\\"style\\\":414},\\\"17\\\":{\\\"text\\\":\\\"#{hecha.cbz}\\\",\\\"style\\\":414},\\\"18\\\":{\\\"text\\\":\\\"#{hecha.sf1}\\\",\\\"style\\\":414},\\\"19\\\":{\\\"text\\\":\\\"#{hecha.sf2}\\\",\\\"style\\\":414},\\\"20\\\":{\\\"text\\\":\\\"#{hecha.sf3}\\\",\\\"style\\\":414},\\\"21\\\":{\\\"text\\\":\\\"#{hecha.sf4}\\\",\\\"style\\\":414},\\\"22\\\":{\\\"text\\\":\\\"#{hecha.bz}\\\",\\\"style\\\":414}},\\\"isDrag\\\":true,\\\"height\\\":46},\\\"6\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":114},\\\"2\\\":{\\\"style\\\":114},\\\"3\\\":{\\\"style\\\":114},\\\"4\\\":{\\\"style\\\":114},\\\"5\\\":{\\\"style\\\":114},\\\"6\\\":{\\\"style\\\":114},\\\"7\\\":{\\\"style\\\":114},\\\"8\\\":{\\\"style\\\":114},\\\"9\\\":{\\\"style\\\":114},\\\"10\\\":{\\\"style\\\":114},\\\"11\\\":{\\\"style\\\":114},\\\"12\\\":{\\\"style\\\":114},\\\"13\\\":{\\\"style\\\":114},\\\"14\\\":{\\\"style\\\":114},\\\"15\\\":{\\\"style\\\":114},\\\"16\\\":{\\\"style\\\":114},\\\"17\\\":{\\\"style\\\":114},\\\"18\\\":{\\\"style\\\":114},\\\"19\\\":{\\\"style\\\":114},\\\"20\\\":{\\\"style\\\":114},\\\"21\\\":{\\\"style\\\":114},\\\"22\\\":{\\\"style\\\":114}},\\\"height\\\":46},\\\"7\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":114},\\\"2\\\":{\\\"style\\\":114},\\\"3\\\":{\\\"style\\\":114},\\\"4\\\":{\\\"style\\\":114},\\\"5\\\":{\\\"style\\\":114},\\\"6\\\":{\\\"style\\\":114},\\\"7\\\":{\\\"style\\\":114},\\\"8\\\":{\\\"style\\\":114},\\\"9\\\":{\\\"style\\\":114},\\\"10\\\":{\\\"style\\\":114},\\\"11\\\":{\\\"style\\\":114},\\\"12\\\":{\\\"style\\\":114},\\\"13\\\":{\\\"style\\\":114},\\\"14\\\":{\\\"style\\\":114},\\\"15\\\":{\\\"style\\\":114},\\\"16\\\":{\\\"style\\\":114},\\\"17\\\":{\\\"style\\\":114},\\\"18\\\":{\\\"style\\\":114},\\\"19\\\":{\\\"style\\\":114},\\\"20\\\":{\\\"style\\\":114},\\\"21\\\":{\\\"style\\\":114},\\\"22\\\":{\\\"style\\\":114}},\\\"height\\\":46},\\\"8\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"style\\\":114},\\\"3\\\":{\\\"style\\\":114},\\\"4\\\":{\\\"style\\\":114},\\\"5\\\":{\\\"style\\\":114},\\\"6\\\":{\\\"style\\\":114},\\\"7\\\":{\\\"style\\\":114},\\\"8\\\":{\\\"style\\\":114},\\\"9\\\":{\\\"style\\\":114},\\\"10\\\":{\\\"style\\\":114},\\\"11\\\":{\\\"style\\\":114},\\\"12\\\":{\\\"style\\\":114},\\\"13\\\":{\\\"style\\\":114},\\\"14\\\":{\\\"style\\\":114},\\\"15\\\":{\\\"style\\\":114},\\\"16\\\":{\\\"style\\\":114},\\\"17\\\":{\\\"style\\\":114},\\\"18\\\":{\\\"style\\\":114},\\\"19\\\":{\\\"style\\\":114},\\\"20\\\":{\\\"style\\\":114},\\\"21\\\":{\\\"style\\\":114},\\\"22\\\":{\\\"style\\\":114}},\\\"isDrag\\\":true},\\\"len\\\":102},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":794,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":1378,\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true},{\\\"textwrap\\\":true},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":false},{\\\"textwrap\\\":false},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"valign\\\":\\\"middle\\\"},{\\\"textwrap\\\":true,\\\"valign\\\":\\\"middle\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":false,\\\"valign\\\":\\\"middle\\\"},{\\\"textwrap\\\":false,\\\"valign\\\":\\\"middle\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\"},{\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"valign\\\":\\\"top\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true,\\\"name\\\":\\\"Helvetica\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true,\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true,\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true,\\\"name\\\":\\\"Courier New\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true,\\\"name\\\":\\\"Verdana\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Verdana\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Verdana\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Verdana\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Verdana\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Verdana\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Verdana\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Verdana\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Verdana\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Verdana\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Verdana\\\"}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Verdana\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Verdana\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Verdana\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Verdana\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Verdana\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Verdana\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true,\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]},\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]},\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"textwrap\\\":false,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"valign\\\":\\\"middle\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]},\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#ffffff\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]}},{\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#ffffff\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"align\\\":\\\"right\\\"},{\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#262626\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#262626\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#262626\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#262626\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#262626\\\"},{\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#f4b184\\\",\\\"color\\\":\\\"#262626\\\",\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"color\\\":\\\"#262626\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"color\\\":\\\"#262626\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"color\\\":\\\"#262626\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"color\\\":\\\"#262626\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"color\\\":\\\"#262626\\\"},{\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"color\\\":\\\"#262626\\\",\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#262626\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#262626\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#262626\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#262626\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#262626\\\"},{\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#262626\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#262626\\\",\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#00b04e\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#a7d08c\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#a7d08c\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#a7d08c\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#a7d08c\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#a7d08c\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#a7d08c\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#a7d08c\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#a7d08c\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#a7d08c\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#a7d08c\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#a7d08c\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#a7d08c\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#a7d08c\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":8},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":8}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#71ae47\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\"},{\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#00b04e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#00b04e\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":15,\\\"bold\\\":true,\\\"name\\\":\\\"Lato\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":9},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":9}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":9}},{\\\"font\\\":{\\\"size\\\":9}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":9}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":9},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"color\\\":\\\"#a5a5a5\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":9},\\\"color\\\":\\\"#a5a5a5\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":9},\\\"color\\\":\\\"#a5a5a5\\\"},{\\\"font\\\":{\\\"size\\\":9},\\\"color\\\":\\\"#a5a5a5\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":9},\\\"color\\\":\\\"#a5a5a5\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":9},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":9},\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":9},\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"font\\\":{\\\"size\\\":9},\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":9},\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":9},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]},\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":9},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]},\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#d8d8d8\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":8}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":8}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"]}},{\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"]}},{\\\"textwrap\\\":true,\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"]}},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":10},\\\"bgcolor\\\":\\\"#02a274\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":8}}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":30},\\\"1\\\":{\\\"width\\\":68},\\\"2\\\":{\\\"width\\\":86},\\\"3\\\":{\\\"width\\\":93},\\\"4\\\":{\\\"width\\\":91},\\\"5\\\":{\\\"width\\\":156},\\\"6\\\":{\\\"width\\\":95},\\\"7\\\":{\\\"width\\\":85},\\\"8\\\":{\\\"width\\\":37},\\\"9\\\":{\\\"width\\\":30},\\\"10\\\":{\\\"width\\\":43},\\\"11\\\":{\\\"width\\\":66},\\\"12\\\":{\\\"width\\\":38},\\\"13\\\":{\\\"width\\\":41},\\\"14\\\":{\\\"width\\\":54},\\\"15\\\":{\\\"width\\\":49},\\\"16\\\":{\\\"width\\\":45},\\\"17\\\":{\\\"width\\\":49},\\\"18\\\":{\\\"width\\\":53},\\\"19\\\":{\\\"width\\\":40},\\\"20\\\":{\\\"width\\\":50},\\\"21\\\":{\\\"width\\\":40},\\\"22\\\":{\\\"width\\\":39},\\\"len\\\":50},\\\"merges\\\":[\\\"M4:R4\\\",\\\"B4:B5\\\",\\\"C4:C5\\\",\\\"D4:D5\\\",\\\"E4:E5\\\",\\\"F4:F5\\\",\\\"G4:G5\\\",\\\"H4:H5\\\",\\\"I4:K4\\\",\\\"L4:L5\\\",\\\"S4:S5\\\",\\\"T4:W4\\\",\\\"E2:G2\\\",\\\"B2:D2\\\",\\\"B1:W1\\\",\\\"P2:W2\\\",\\\"H2:O2\\\"]}', '', 'https://static.jeecg.com/designreport/images/QQ截图20201207113312_1607312171402.png', 'jeecg', '2020-07-14 16:41:42', 'admin', '2021-02-03 14:01:17', 0, NULL, NULL, 1, 263, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('907480464532770816', '20240117141013', '主子报表循环块', NULL, NULL, '984272091947253760', '{\\\"loopBlockList\\\":[{\\\"sci\\\":0,\\\"sri\\\":0,\\\"eci\\\":8,\\\"eri\\\":36,\\\"index\\\":1,\\\"db\\\":\\\"aa\\\"}],\\\"area\\\":{\\\"sri\\\":9,\\\"sci\\\":11,\\\"eri\\\":9,\\\"eci\\\":11,\\\"width\\\":100,\\\"height\\\":25},\\\"excel_config_id\\\":\\\"907480464532770816\\\",\\\"printConfig\\\":{\\\"layout\\\":\\\"portrait\\\",\\\"paginationShow\\\":false,\\\"printCallBackUrl\\\":\\\"\\\",\\\"paper\\\":\\\"A4\\\",\\\"isBackend\\\":false,\\\"width\\\":210,\\\"paginationLocation\\\":\\\"middle\\\",\\\"definition\\\":1,\\\"marginX\\\":10,\\\"height\\\":297,\\\"marginY\\\":10},\\\"hiddenCells\\\":[],\\\"zonedEditionList\\\":[],\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"merge\\\":[0,6],\\\"style\\\":8,\\\"text\\\":\\\"订货商信息\\\",\\\"height\\\":0},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}},\\\"height\\\":57},\\\"1\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"style\\\":10,\\\"text\\\":\\\"订单编号：\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"merge\\\":[0,2],\\\"style\\\":42,\\\"text\\\":\\\"#{aa.order_code}\\\",\\\"height\\\":0},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}},\\\"height\\\":34},\\\"2\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"style\\\":10,\\\"text\\\":\\\"订单地址：\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"merge\\\":[0,1],\\\"style\\\":42,\\\"text\\\":\\\"#{aa.descc}\\\",\\\"height\\\":0},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"style\\\":10,\\\"text\\\":\\\"订单日期：\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"merge\\\":[0,1],\\\"style\\\":42,\\\"text\\\":\\\"#{aa.order_date}\\\",\\\"height\\\":0},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}},\\\"height\\\":34},\\\"3\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"style\\\":10,\\\"text\\\":\\\"订单姓名：\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"merge\\\":[0,1],\\\"style\\\":42,\\\"text\\\":\\\"#{aa.create_by}\\\",\\\"height\\\":0},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"style\\\":10,\\\"text\\\":\\\"到货日期：\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"merge\\\":[0,1],\\\"style\\\":42,\\\"text\\\":\\\"#{aa.create_time}\\\",\\\"height\\\":0},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}},\\\"height\\\":31},\\\"4\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"5\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"decimalPlaces\\\":\\\"4\\\",\\\"merge\\\":[0,6],\\\"style\\\":31,\\\"text\\\":\\\"订单详情\\\"},\\\"2\\\":{\\\"loopBlock\\\":1},\\\"3\\\":{\\\"loopBlock\\\":1},\\\"4\\\":{\\\"loopBlock\\\":1},\\\"5\\\":{\\\"loopBlock\\\":1},\\\"6\\\":{\\\"loopBlock\\\":1},\\\"7\\\":{\\\"loopBlock\\\":1},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}},\\\"height\\\":51},\\\"6\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"style\\\":15,\\\"text\\\":\\\"商品编码\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"style\\\":15,\\\"text\\\":\\\"商品名称\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"style\\\":15,\\\"text\\\":\\\"销售时间\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"style\\\":15,\\\"text\\\":\\\"销售数据量\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"style\\\":15,\\\"text\\\":\\\"定价\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"style\\\":15,\\\"text\\\":\\\"优惠价\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"style\\\":15,\\\"text\\\":\\\"付款金额\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}},\\\"height\\\":42},\\\"7\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"style\\\":18,\\\"text\\\":\\\"#{bb.product_name}\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"style\\\":18,\\\"text\\\":\\\"#{bb.product_name}\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"style\\\":18,\\\"text\\\":\\\"#{bb.product_name}\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"style\\\":18,\\\"text\\\":\\\"#{bb.num}\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"decimalPlaces\\\":\\\"4\\\",\\\"style\\\":19,\\\"text\\\":\\\"#{bb.price}\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"decimalPlaces\\\":\\\"1\\\",\\\"style\\\":19,\\\"text\\\":\\\"#{bb.price}\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"style\\\":18,\\\"text\\\":\\\"#{bb.pro_type}\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"8\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"9\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"10\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"style\\\":39,\\\"text\\\":\\\"备注：\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"style\\\":33,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"style\\\":33,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"style\\\":33,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"style\\\":33,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"style\\\":33,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"style\\\":34,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}},\\\"height\\\":25},\\\"11\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"merge\\\":[0,6],\\\"style\\\":41,\\\"text\\\":\\\"1、查看信息，在浏览器输入“?did=1”或“?did=2”\\\",\\\"height\\\":0},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}},\\\"height\\\":37},\\\"12\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"style\\\":35,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"style\\\":36,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"13\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"style\\\":37,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"style\\\":28,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"style\\\":28,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"style\\\":28,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"style\\\":28,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"style\\\":28,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"style\\\":38,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"14\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"15\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1},\\\"2\\\":{\\\"loopBlock\\\":1},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"16\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1},\\\"2\\\":{\\\"loopBlock\\\":1},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"17\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"18\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"19\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"20\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"21\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1},\\\"2\\\":{\\\"loopBlock\\\":1},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"22\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"23\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"24\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"25\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"26\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1},\\\"2\\\":{\\\"loopBlock\\\":1},\\\"3\\\":{\\\"loopBlock\\\":1},\\\"4\\\":{\\\"loopBlock\\\":1},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"27\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"28\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"29\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"30\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"31\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"32\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"33\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"34\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"35\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"36\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"1\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"6\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"7\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"},\\\"8\\\":{\\\"loopBlock\\\":1,\\\"text\\\":\\\"\\\"}}},\\\"len\\\":102},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"rpbar\\\":{\\\"show\\\":true,\\\"pageSize\\\":\\\"\\\",\\\"btnList\\\":[]},\\\"fixedPrintHeadRows\\\":[],\\\"fixedPrintTailRows\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":682,\\\"displayConfig\\\":{},\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":18}},{\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true}},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"format\\\":\\\"number\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"format\\\":\\\"normal\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":false}},{\\\"font\\\":{\\\"size\\\":18,\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":false}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":false}},{\\\"font\\\":{\\\"size\\\":18,\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#a5a5a5\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"valign\\\":\\\"bottom\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"valign\\\":\\\"bottom\\\",\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":18,\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"valign\\\":\\\"middle\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#595959\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#595959\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#595959\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#595959\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#595959\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":39},\\\"1\\\":{\\\"width\\\":73},\\\"2\\\":{\\\"width\\\":89},\\\"3\\\":{\\\"width\\\":101},\\\"4\\\":{\\\"width\\\":80},\\\"8\\\":{\\\"width\\\":29},\\\"len\\\":100},\\\"merges\\\":[\\\"B1:H1\\\",\\\"C2:E2\\\",\\\"C3:D3\\\",\\\"F3:G3\\\",\\\"C4:D4\\\",\\\"F4:G4\\\",\\\"B6:H6\\\",\\\"B12:H12\\\"]}', NULL, 'https://static.jeecg.com/designreport/images/未标题-1_1617266678584.png', 'admin', '2024-01-17 14:10:13', 'admin', '2024-01-24 20:02:03', 0, NULL, NULL, 1, 82, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('919370186342354944', '20240103104736__3061', '横向总合计-横纵3*2*2副本3061', NULL, NULL, '984272091947253760', '{\\\"loopBlockList\\\":[],\\\"printConfig\\\":{\\\"paper\\\":\\\"A4\\\",\\\"width\\\":210,\\\"height\\\":297,\\\"definition\\\":1,\\\"isBackend\\\":false,\\\"marginX\\\":10,\\\"marginY\\\":10,\\\"layout\\\":\\\"landscape\\\",\\\"printCallBackUrl\\\":\\\"\\\",\\\"paginationShow\\\":false,\\\"paginationLocation\\\":\\\"middle\\\"},\\\"dbexps\\\":[],\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":1071,\\\"autofilter\\\":{},\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":60},\\\"1\\\":{\\\"width\\\":96},\\\"2\\\":{\\\"width\\\":115},\\\"len\\\":50},\\\"area\\\":{\\\"sri\\\":12,\\\"sci\\\":5,\\\"eri\\\":12,\\\"eci\\\":5,\\\"width\\\":100,\\\"height\\\":25},\\\"excel_config_id\\\":\\\"919370186342354944\\\",\\\"hiddenCells\\\":[],\\\"zonedEditionList\\\":[],\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"0\\\":{},\\\"4\\\":{},\\\"5\\\":{}}},\\\"1\\\":{\\\"cells\\\":{\\\"0\\\":{},\\\"1\\\":{\\\"lineStart\\\":\\\"lefttop\\\",\\\"merge\\\":[3,1],\\\"style\\\":0,\\\"text\\\":\\\"地区|销售额|时间\\\",\\\"height\\\":100},\\\"3\\\":{\\\"merge\\\":[3,0],\\\"style\\\":0,\\\"text\\\":\\\"合计(销售）\\\",\\\"height\\\":100},\\\"4\\\":{\\\"merge\\\":[0,1],\\\"style\\\":1,\\\"text\\\":\\\"#{test_heng_sum.groupRight(year)}\\\",\\\"aggregate\\\":\\\"group\\\",\\\"direction\\\":\\\"right\\\",\\\"height\\\":25},\\\"5\\\":{},\\\"6\\\":{\\\"merge\\\":[3,0],\\\"style\\\":0,\\\"text\\\":\\\"合计(销售）\\\",\\\"height\\\":100},\\\"7\\\":{\\\"merge\\\":[3,0],\\\"style\\\":0,\\\"text\\\":\\\"合计（赠送）\\\",\\\"height\\\":100},\\\"8\\\":{\\\"merge\\\":[3,0],\\\"style\\\":1,\\\"text\\\":\\\"平均（销售）\\\",\\\"height\\\":100},\\\"9\\\":{\\\"merge\\\":[3,0],\\\"style\\\":1,\\\"text\\\":\\\"最大（销售）\\\",\\\"height\\\":100},\\\"10\\\":{\\\"merge\\\":[3,0],\\\"style\\\":1,\\\"text\\\":\\\"最小（销售）\\\",\\\"height\\\":100}}},\\\"2\\\":{\\\"cells\\\":{\\\"0\\\":{},\\\"4\\\":{\\\"merge\\\":[0,1],\\\"style\\\":1,\\\"text\\\":\\\"#{test_heng_sum.groupRight(quarter)}\\\",\\\"height\\\":25,\\\"aggregate\\\":\\\"group\\\",\\\"direction\\\":\\\"right\\\"},\\\"5\\\":{},\\\"8\\\":{},\\\"9\\\":{},\\\"10\\\":{}}},\\\"3\\\":{\\\"cells\\\":{\\\"0\\\":{},\\\"4\\\":{\\\"merge\\\":[0,1],\\\"style\\\":1,\\\"text\\\":\\\"#{test_heng_sum.groupRight(month)}\\\",\\\"height\\\":25,\\\"aggregate\\\":\\\"group\\\",\\\"direction\\\":\\\"right\\\"},\\\"5\\\":{},\\\"8\\\":{},\\\"9\\\":{},\\\"10\\\":{}}},\\\"4\\\":{\\\"cells\\\":{\\\"0\\\":{},\\\"4\\\":{\\\"style\\\":1,\\\"text\\\":\\\"销售\\\"},\\\"5\\\":{\\\"style\\\":1,\\\"text\\\":\\\"赠送\\\"},\\\"8\\\":{},\\\"9\\\":{},\\\"10\\\":{}}},\\\"5\\\":{\\\"cells\\\":{\\\"0\\\":{},\\\"1\\\":{\\\"style\\\":1,\\\"text\\\":\\\"#{test_heng_sum.group(region)}\\\",\\\"aggregate\\\":\\\"group\\\"},\\\"2\\\":{\\\"style\\\":1,\\\"text\\\":\\\"#{test_heng_sum.group(province)}\\\",\\\"aggregate\\\":\\\"group\\\"},\\\"3\\\":{\\\"style\\\":0,\\\"text\\\":\\\"=SUM(E6)\\\"},\\\"4\\\":{\\\"style\\\":0,\\\"text\\\":\\\"#{test_heng_sum.dynamic(sales)}\\\",\\\"aggregate\\\":\\\"dynamic\\\"},\\\"5\\\":{\\\"style\\\":0,\\\"text\\\":\\\"#{test_heng_sum.dynamic(gift)}\\\",\\\"aggregate\\\":\\\"dynamic\\\"},\\\"6\\\":{\\\"style\\\":0,\\\"text\\\":\\\"=SUM(E6)\\\"},\\\"7\\\":{\\\"style\\\":0,\\\"text\\\":\\\"=SUM(F6)\\\"},\\\"8\\\":{\\\"style\\\":0,\\\"text\\\":\\\"=AVERAGE(E6)\\\"},\\\"9\\\":{\\\"style\\\":0,\\\"text\\\":\\\"=MAX(F6)\\\"},\\\"10\\\":{\\\"style\\\":0,\\\"text\\\":\\\"=MIN(F6)\\\"}}},\\\"6\\\":{\\\"cells\\\":{\\\"0\\\":{},\\\"1\\\":{\\\"merge\\\":[0,1],\\\"style\\\":1,\\\"text\\\":\\\"合计\\\",\\\"height\\\":25},\\\"2\\\":{},\\\"3\\\":{\\\"style\\\":0,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":0,\\\"text\\\":\\\"=SUM(E6)\\\"},\\\"5\\\":{\\\"style\\\":0,\\\"text\\\":\\\"=SUM(F6)\\\"},\\\"6\\\":{\\\"style\\\":0,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":0,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":0,\\\"text\\\":\\\" \\\"},\\\"9\\\":{\\\"style\\\":0,\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"style\\\":0,\\\"text\\\":\\\" \\\"}}},\\\"7\\\":{\\\"cells\\\":{\\\"0\\\":{},\\\"3\\\":{},\\\"4\\\":{},\\\"5\\\":{},\\\"6\\\":{},\\\"7\\\":{},\\\"8\\\":{},\\\"9\\\":{},\\\"10\\\":{},\\\"11\\\":{},\\\"12\\\":{},\\\"13\\\":{},\\\"14\\\":{},\\\"15\\\":{},\\\"16\\\":{},\\\"17\\\":{},\\\"18\\\":{},\\\"19\\\":{},\\\"20\\\":{},\\\"21\\\":{},\\\"22\\\":{},\\\"23\\\":{},\\\"24\\\":{},\\\"25\\\":{},\\\"26\\\":{},\\\"27\\\":{},\\\"28\\\":{},\\\"29\\\":{}}},\\\"8\\\":{\\\"cells\\\":{\\\"0\\\":{}}},\\\"len\\\":167},\\\"rpbar\\\":{\\\"show\\\":true,\\\"pageSize\\\":\\\"\\\",\\\"btnList\\\":[]},\\\"groupField\\\":\\\"test_heng_sum.region\\\",\\\"fixedPrintHeadRows\\\":[],\\\"fixedPrintTailRows\\\":[],\\\"displayConfig\\\":{},\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"styles\\\":[{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\"},{\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"bgcolor\\\":\\\"#9cc2e6\\\"}],\\\"isGroup\\\":true,\\\"merges\\\":[\\\"B2:C5\\\",\\\"D2:D5\\\",\\\"E2:F2\\\",\\\"G2:G5\\\",\\\"H2:H5\\\",\\\"I2:I5\\\",\\\"J2:J5\\\",\\\"K2:K5\\\",\\\"E3:F3\\\",\\\"E4:F4\\\",\\\"B7:C7\\\"]}', NULL, NULL, 'admin', '2024-02-19 09:35:44', '', '2024-03-04 19:15:56', 0, NULL, NULL, 0, 53, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('924614453466595328', '20201214142804__5048', '条形码报表副本5048', NULL, NULL, '984272091947253760', '{\\\"loopBlockList\\\":[],\\\"querySetting\\\":{\\\"izOpenQueryBar\\\":false,\\\"izDefaultQuery\\\":true},\\\"recordSubTableOrCollection\\\":{\\\"group\\\":[],\\\"record\\\":[],\\\"range\\\":[]},\\\"printConfig\\\":{\\\"layout\\\":\\\"portrait\\\",\\\"printCallBackUrl\\\":\\\"\\\",\\\"paper\\\":\\\"A4\\\",\\\"isBackend\\\":false,\\\"width\\\":210,\\\"definition\\\":1,\\\"marginX\\\":10,\\\"height\\\":297,\\\"marginY\\\":10},\\\"hidden\\\":{\\\"rows\\\":[],\\\"cols\\\":[]},\\\"queryFormSetting\\\":{\\\"useQueryForm\\\":false,\\\"dbKey\\\":\\\"\\\",\\\"idField\\\":\\\"\\\"},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[\\\"sex1\\\",\\\"sex1\\\",\\\"sex1\\\"],\\\"fillFormToolbar\\\":{\\\"show\\\":true,\\\"btnList\\\":[\\\"save\\\",\\\"subTable_add\\\",\\\"verify\\\",\\\"subTable_del\\\",\\\"print\\\",\\\"close\\\",\\\"first\\\",\\\"prev\\\",\\\"next\\\",\\\"paging\\\",\\\"total\\\",\\\"last\\\",\\\"exportPDF\\\",\\\"exportExcel\\\"]},\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":704,\\\"autofilter\\\":{},\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":16},\\\"1\\\":{\\\"width\\\":103},\\\"2\\\":{\\\"width\\\":156},\\\"3\\\":{\\\"width\\\":51},\\\"4\\\":{\\\"width\\\":96},\\\"5\\\":{\\\"width\\\":61},\\\"6\\\":{\\\"width\\\":106},\\\"7\\\":{\\\"width\\\":115},\\\"8\\\":{\\\"width\\\":135},\\\"len\\\":50},\\\"area\\\":false,\\\"pyGroupEngine\\\":false,\\\"submitHandlers\\\":[],\\\"excel_config_id\\\":\\\"924614453466595328\\\",\\\"hiddenCells\\\":[],\\\"zonedEditionList\\\":[],\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[1,3],\\\"style\\\":39,\\\"text\\\":\\\"居民身份证申领登记表\\\"},\\\"5\\\":{\\\"rendered\\\":\\\"\\\",\\\"merge\\\":[0,2],\\\"display\\\":\\\"text\\\",\\\"text\\\":\\\"\\\"},\\\"-1\\\":{\\\"text\\\":\\\"${tm.tp}\\\"}},\\\"height\\\":27},\\\"1\\\":{\\\"cells\\\":{\\\"5\\\":{\\\"virtual\\\":\\\"ZiOFmILaRjdmVs6E\\\",\\\"rendered\\\":\\\"Mm55SPrx6ZG5ga8T\\\",\\\"display\\\":\\\"barcode\\\",\\\"merge\\\":[0,2],\\\"style\\\":2,\\\"text\\\":\\\"${tm.tm}\\\"}},\\\"height\\\":52},\\\"2\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[0,3],\\\"style\\\":36,\\\"text\\\":\\\"受理单位（盖章）珠海市公安局\\\"},\\\"5\\\":{\\\"style\\\":6,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":6,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":6,\\\"text\\\":\\\" \\\"}},\\\"height\\\":34},\\\"3\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":24,\\\"text\\\":\\\"姓名\\\"},\\\"2\\\":{\\\"rendered\\\":\\\"\\\",\\\"style\\\":7,\\\"text\\\":\\\"${tm.name}\\\"},\\\"3\\\":{\\\"style\\\":16,\\\"text\\\":\\\"性别\\\"},\\\"4\\\":{\\\"isDict\\\":1,\\\"rendered\\\":\\\"\\\",\\\"dictCode\\\":\\\"sex1\\\",\\\"style\\\":7,\\\"text\\\":\\\"${tm.sex}\\\"},\\\"5\\\":{\\\"style\\\":16,\\\"text\\\":\\\"民族\\\"},\\\"6\\\":{\\\"style\\\":7,\\\"text\\\":\\\"${tm.nation}\\\"},\\\"7\\\":{\\\"rendered\\\":\\\"ftkUSZOje4A5gVO3\\\",\\\"merge\\\":[2,0],\\\"display\\\":\\\"img\\\",\\\"style\\\":7,\\\"text\\\":\\\"${tm.tp}\\\"}},\\\"isDrag\\\":true,\\\"height\\\":47},\\\"4\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":24,\\\"text\\\":\\\"出生日期\\\"},\\\"2\\\":{\\\"merge\\\":[0,4],\\\"style\\\":32,\\\"text\\\":\\\"${tm.birth}\\\"}},\\\"isDrag\\\":true,\\\"height\\\":51},\\\"5\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":21,\\\"text\\\":\\\"常住户口所在地住址\\\"},\\\"2\\\":{\\\"merge\\\":[0,4],\\\"style\\\":7,\\\"text\\\":\\\"${tm.zhuzhi}\\\"}},\\\"isDrag\\\":true,\\\"height\\\":62},\\\"6\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":24,\\\"text\\\":\\\"公民身份证\\\"},\\\"2\\\":{\\\"merge\\\":[0,5],\\\"style\\\":7,\\\"text\\\":\\\"${tm.card}\\\"}},\\\"isDrag\\\":true,\\\"height\\\":55},\\\"7\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":24,\\\"text\\\":\\\"有限期限\\\"},\\\"2\\\":{\\\"merge\\\":[0,1],\\\"style\\\":34,\\\"text\\\":\\\"${tm.ydate}\\\"},\\\"4\\\":{\\\"style\\\":24,\\\"text\\\":\\\"签发机关\\\"},\\\"5\\\":{\\\"merge\\\":[0,2],\\\"style\\\":7,\\\"text\\\":\\\"${tm.qfjg}\\\"}},\\\"isDrag\\\":true,\\\"height\\\":52},\\\"8\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":24,\\\"text\\\":\\\"申领原因\\\"},\\\"2\\\":{\\\"merge\\\":[0,5],\\\"style\\\":7,\\\"text\\\":\\\"${tm.slyy}\\\"}},\\\"isDrag\\\":true,\\\"height\\\":55},\\\"9\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":24,\\\"text\\\":\\\"受理时间\\\"},\\\"2\\\":{\\\"merge\\\":[0,1],\\\"style\\\":32,\\\"text\\\":\\\"${tm.sdate}\\\"},\\\"4\\\":{\\\"style\\\":24,\\\"text\\\":\\\"受理号\\\"},\\\"5\\\":{\\\"merge\\\":[0,2],\\\"style\\\":7,\\\"text\\\":\\\"${tm.shao}\\\"}},\\\"isDrag\\\":true,\\\"height\\\":49},\\\"10\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":24,\\\"text\\\":\\\"承办人\\\"},\\\"2\\\":{\\\"merge\\\":[0,1],\\\"style\\\":7,\\\"text\\\":\\\"${tm.cbr}\\\"},\\\"4\\\":{\\\"style\\\":24,\\\"text\\\":\\\"受理单位领导\\\"},\\\"5\\\":{\\\"merge\\\":[0,2],\\\"style\\\":7,\\\"text\\\":\\\"${tm.sld}\\\"}},\\\"isDrag\\\":true,\\\"height\\\":42},\\\"11\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":21,\\\"text\\\":\\\"申请（监护）人签名\\\"},\\\"2\\\":{\\\"merge\\\":[0,1],\\\"style\\\":7,\\\"text\\\":\\\"${tm.sr}\\\"},\\\"4\\\":{\\\"style\\\":21,\\\"text\\\":\\\"申请（监护）人联系电话\\\"},\\\"5\\\":{\\\"merge\\\":[0,2],\\\"style\\\":7,\\\"text\\\":\\\"${tm.jphone}\\\"}},\\\"isDrag\\\":true,\\\"height\\\":59},\\\"12\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":24,\\\"text\\\":\\\"领证人签名\\\"},\\\"2\\\":{\\\"merge\\\":[0,1],\\\"style\\\":7,\\\"text\\\":\\\"${tm.lzr}\\\"},\\\"4\\\":{\\\"style\\\":24,\\\"text\\\":\\\"领证时间\\\"},\\\"5\\\":{\\\"merge\\\":[0,2],\\\"style\\\":32,\\\"text\\\":\\\"${tm.ldate}\\\"}},\\\"isDrag\\\":true,\\\"height\\\":57},\\\"13\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[0,1],\\\"style\\\":24,\\\"text\\\":\\\"是否通过邮政特快专递方式领取二代\\\"},\\\"3\\\":{\\\"merge\\\":[0,4],\\\"style\\\":7,\\\"text\\\":\\\"${tm.sk}\\\"}},\\\"isDrag\\\":true,\\\"height\\\":50},\\\"14\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":24,\\\"text\\\":\\\"投递地址\\\"},\\\"2\\\":{\\\"merge\\\":[0,2],\\\"style\\\":7,\\\"text\\\":\\\"${tm.dizhi}\\\"},\\\"5\\\":{\\\"style\\\":24,\\\"text\\\":\\\"收件人\\\"},\\\"6\\\":{\\\"merge\\\":[0,1],\\\"style\\\":7,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true,\\\"height\\\":53},\\\"15\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":24,\\\"text\\\":\\\"邮政编码\\\"},\\\"2\\\":{\\\"merge\\\":[0,1],\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":24,\\\"text\\\":\\\"备注\\\"},\\\"5\\\":{\\\"merge\\\":[0,2],\\\"style\\\":7,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true,\\\"height\\\":47},\\\"16\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[0,6],\\\"style\\\":31,\\\"text\\\":\\\"公安部治安管理局治\\\"}}},\\\"len\\\":100},\\\"rpbar\\\":{\\\"show\\\":true,\\\"pageSize\\\":\\\"\\\",\\\"btnList\\\":[]},\\\"fixedPrintHeadRows\\\":[],\\\"fixedPrintTailRows\\\":[],\\\"displayConfig\\\":{},\\\"fillFormInfo\\\":{\\\"layout\\\":{\\\"direction\\\":\\\"horizontal\\\",\\\"width\\\":200,\\\"height\\\":45}},\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"styles\\\":[{\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"center\\\"},{\\\"textwrap\\\":true},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"}},{\\\"color\\\":\\\"#3f3f3f\\\",\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"}},{\\\"color\\\":\\\"#0c0c0c\\\",\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"}},{\\\"color\\\":\\\"#7f7f7f\\\",\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"}},{\\\"color\\\":\\\"#595959\\\",\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":false}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":false}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":false}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"textwrap\\\":true,\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"size\\\":8}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":8}},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":8}},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":10}},{\\\"color\\\":\\\"#7f7f7f\\\",\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":10}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"format\\\":\\\"date2\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"format\\\":\\\"date2\\\"},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"format\\\":\\\"date\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"format\\\":\\\"date\\\"},{\\\"color\\\":\\\"#595959\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"size\\\":9,\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"valign\\\":\\\"bottom\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}}],\\\"freezeLineColor\\\":\\\"rgb(185, 185, 185)\\\",\\\"merges\\\":[\\\"B1:E2\\\",\\\"F1:H1\\\",\\\"F2:H2\\\",\\\"B3:E3\\\",\\\"H4:H6\\\",\\\"C5:G5\\\",\\\"C6:G6\\\",\\\"C7:H7\\\",\\\"C8:D8\\\",\\\"F8:H8\\\",\\\"C9:H9\\\",\\\"C10:D10\\\",\\\"F10:H10\\\",\\\"C11:D11\\\",\\\"F11:H11\\\",\\\"C12:D12\\\",\\\"F12:H12\\\",\\\"C13:D13\\\",\\\"F13:H13\\\",\\\"B14:C14\\\",\\\"D14:H14\\\",\\\"C15:E15\\\",\\\"G15:H15\\\",\\\"C16:D16\\\",\\\"F16:H16\\\",\\\"B17:H17\\\"]}', NULL, 'https://static.jeecg.com/designreport/images/未标题-1_1608118350039.png', '', '2024-03-04 20:54:34', 'admin', '2025-05-08 19:32:54', 0, NULL, NULL, 0, 56, NULL, NULL, NULL, '1001', 1, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('928540173805338624', '20240318105250', '电子收款收据', NULL, NULL, '984302991393210368', '{\\\"loopBlockList\\\":[],\\\"printConfig\\\":{\\\"layout\\\":\\\"portrait\\\",\\\"printCallBackUrl\\\":\\\"\\\",\\\"paper\\\":\\\"A4\\\",\\\"isBackend\\\":false,\\\"width\\\":210,\\\"definition\\\":1,\\\"marginX\\\":10,\\\"height\\\":297,\\\"marginY\\\":10},\\\"dbexps\\\":[],\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":686,\\\"autofilter\\\":{},\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":21},\\\"1\\\":{\\\"width\\\":35},\\\"2\\\":{\\\"width\\\":45},\\\"3\\\":{\\\"width\\\":60},\\\"4\\\":{\\\"width\\\":128},\\\"5\\\":{\\\"width\\\":79},\\\"6\\\":{\\\"width\\\":67},\\\"7\\\":{\\\"width\\\":67},\\\"8\\\":{\\\"width\\\":84},\\\"10\\\":{\\\"width\\\":29},\\\"len\\\":100},\\\"area\\\":{\\\"sri\\\":24,\\\"sci\\\":11,\\\"eri\\\":24,\\\"eci\\\":11,\\\"width\\\":100,\\\"height\\\":25},\\\"pyGroupEngine\\\":false,\\\"excel_config_id\\\":\\\"928540173805338624\\\",\\\"hiddenCells\\\":[],\\\"zonedEditionList\\\":[],\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{},\\\"height\\\":9},\\\"1\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"rendered\\\":\\\"IKbjwc1lQUlSeJfd\\\",\\\"display\\\":\\\"qrcode\\\",\\\"merge\\\":[2,1],\\\"style\\\":0,\\\"text\\\":\\\"http://www.baidu.com\\\",\\\"config\\\":1,\\\"height\\\":69},\\\"3\\\":{}},\\\"height\\\":19},\\\"2\\\":{\\\"cells\\\":{\\\"2\\\":{},\\\"3\\\":{},\\\"4\\\":{\\\"merge\\\":[0,4],\\\"style\\\":80,\\\"text\\\":\\\"北京万达物业服务有限公司\\\",\\\"height\\\":25},\\\"9\\\":{\\\"virtual\\\":\\\"YfdiQDcuqTjlOG4f\\\",\\\"style\\\":67,\\\"text\\\":\\\" \\\"}}},\\\"3\\\":{\\\"cells\\\":{\\\"2\\\":{},\\\"3\\\":{},\\\"4\\\":{\\\"merge\\\":[0,4],\\\"style\\\":72,\\\"text\\\":\\\"电子收款收据\\\",\\\"height\\\":25}}},\\\"4\\\":{\\\"cells\\\":{\\\"2\\\":{},\\\"3\\\":{}},\\\"height\\\":16},\\\"5\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"rendered\\\":\\\"\\\",\\\"merge\\\":[0,2],\\\"style\\\":41,\\\"text\\\":\\\"客户/业主\\\",\\\"config\\\":\\\"\\\",\\\"height\\\":25},\\\"4\\\":{\\\"merge\\\":[0,1],\\\"style\\\":43,\\\"text\\\":\\\"#{receipt.customName}\\\",\\\"height\\\":25},\\\"5\\\":{},\\\"6\\\":{\\\"merge\\\":[0,1],\\\"style\\\":44,\\\"text\\\":\\\"收款单号\\\",\\\"height\\\":25},\\\"8\\\":{\\\"merge\\\":[0,1],\\\"style\\\":45,\\\"text\\\":\\\"#{receipt.receiptNo}\\\",\\\"height\\\":25},\\\"9\\\":{}},\\\"height\\\":25},\\\"6\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"rendered\\\":\\\"\\\",\\\"merge\\\":[0,2],\\\"style\\\":44,\\\"text\\\":\\\"实际交款人\\\",\\\"config\\\":\\\"\\\",\\\"height\\\":25},\\\"4\\\":{\\\"merge\\\":[0,1],\\\"style\\\":43,\\\"text\\\":\\\"#{receipt.actualPayer}\\\",\\\"height\\\":25},\\\"5\\\":{},\\\"6\\\":{\\\"rendered\\\":\\\"\\\",\\\"merge\\\":[0,1],\\\"style\\\":44,\\\"text\\\":\\\"结算方式\\\",\\\"config\\\":\\\"\\\",\\\"height\\\":25},\\\"8\\\":{\\\"merge\\\":[0,1],\\\"style\\\":45,\\\"text\\\":\\\"#{receipt.settlementType}\\\",\\\"height\\\":25},\\\"9\\\":{}},\\\"height\\\":25},\\\"7\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[0,2],\\\"style\\\":44,\\\"text\\\":\\\"收款时间\\\",\\\"height\\\":25},\\\"4\\\":{\\\"merge\\\":[0,1],\\\"style\\\":43,\\\"text\\\":\\\"#{receipt.collectionTime}\\\",\\\"height\\\":25},\\\"5\\\":{},\\\"6\\\":{\\\"merge\\\":[0,1],\\\"style\\\":44,\\\"text\\\":\\\"原单号\\\",\\\"height\\\":25},\\\"8\\\":{\\\"merge\\\":[0,1],\\\"style\\\":45,\\\"text\\\":\\\"#{receipt.originalNumber}\\\",\\\"height\\\":25},\\\"9\\\":{}},\\\"height\\\":25},\\\"8\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[0,2],\\\"style\\\":44,\\\"text\\\":\\\"收款组织\\\",\\\"height\\\":25},\\\"4\\\":{\\\"merge\\\":[0,5],\\\"style\\\":46,\\\"text\\\":\\\"#{receipt.organization}\\\",\\\"height\\\":25},\\\"5\\\":{},\\\"6\\\":{},\\\"7\\\":{},\\\"8\\\":{},\\\"9\\\":{},\\\"11\\\":{\\\"rendered\\\":\\\"\\\",\\\"text\\\":\\\"\\\",\\\"config\\\":\\\"\\\"}},\\\"height\\\":25},\\\"9\\\":{\\\"cells\\\":{\\\"1\\\":{}}},\\\"10\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[0,1],\\\"style\\\":19,\\\"text\\\":\\\"行号\\\",\\\"height\\\":38},\\\"3\\\":{\\\"merge\\\":[0,1],\\\"style\\\":47,\\\"text\\\":\\\"房产名称\\\",\\\"height\\\":38},\\\"5\\\":{\\\"rendered\\\":\\\"\\\",\\\"merge\\\":[0,2],\\\"style\\\":47,\\\"text\\\":\\\"费用项目\\\",\\\"config\\\":\\\"\\\",\\\"height\\\":38},\\\"8\\\":{\\\"style\\\":47,\\\"text\\\":\\\"应交月份\\\"},\\\"9\\\":{\\\"style\\\":19,\\\"text\\\":\\\"金额\\\"}},\\\"height\\\":38},\\\"11\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"=row()\\\",\\\"height\\\":34},\\\"3\\\":{\\\"merge\\\":[0,1],\\\"text\\\":\\\"#{receiptProject.propertyName}\\\",\\\"height\\\":34},\\\"5\\\":{\\\"merge\\\":[0,2],\\\"text\\\":\\\"#{receiptProject.expenseItem}\\\",\\\"height\\\":34},\\\"8\\\":{\\\"style\\\":0,\\\"text\\\":\\\"#{receiptProject.payableMonths}\\\"},\\\"9\\\":{\\\"style\\\":83,\\\"text\\\":\\\"#{receiptProject.price}\\\"},\\\"13\\\":{\\\"rendered\\\":\\\"\\\",\\\"text\\\":\\\"\\\",\\\"config\\\":\\\"\\\"}},\\\"height\\\":34},\\\"12\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[0,2],\\\"style\\\":17,\\\"text\\\":\\\"款项合计\\\",\\\"height\\\":30},\\\"4\\\":{\\\"merge\\\":[0,5],\\\"style\\\":82,\\\"text\\\":\\\"人民币 =sum(J12) 元\\\",\\\"height\\\":30},\\\"11\\\":{\\\"rendered\\\":\\\"\\\",\\\"text\\\":\\\"\\\",\\\"config\\\":\\\"\\\"},\\\"15\\\":{\\\"rendered\\\":\\\"\\\",\\\"text\\\":\\\"\\\",\\\"config\\\":\\\"\\\"}},\\\"height\\\":30},\\\"13\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[0,2],\\\"style\\\":19,\\\"text\\\":\\\"缴费说明\\\",\\\"height\\\":30},\\\"4\\\":{\\\"merge\\\":[0,5],\\\"style\\\":23,\\\"text\\\":\\\"#{receipt.paymentDesc}\\\",\\\"height\\\":30},\\\"15\\\":{\\\"rendered\\\":\\\"\\\",\\\"text\\\":\\\"\\\",\\\"config\\\":\\\"\\\"}},\\\"height\\\":30},\\\"14\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[0,2],\\\"style\\\":19,\\\"text\\\":\\\"检验密码\\\",\\\"height\\\":35},\\\"4\\\":{\\\"merge\\\":[0,5],\\\"style\\\":84,\\\"text\\\":\\\"#{receipt.verifyPassword}\\\",\\\"height\\\":35},\\\"5\\\":{},\\\"6\\\":{},\\\"7\\\":{},\\\"8\\\":{},\\\"9\\\":{}},\\\"height\\\":35},\\\"15\\\":{\\\"cells\\\":{\\\"8\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"qWMWhe42wLnQXDUa\\\"}},\\\"height\\\":10},\\\"16\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[0,2],\\\"style\\\":19,\\\"text\\\":\\\"收款经办\\\",\\\"height\\\":30},\\\"4\\\":{\\\"style\\\":20,\\\"text\\\":\\\"#{receipt.dealWith}\\\"},\\\"5\\\":{\\\"merge\\\":[0,1],\\\"style\\\":19,\\\"text\\\":\\\"公司签章\\\",\\\"height\\\":30},\\\"7\\\":{\\\"merge\\\":[0,2],\\\"style\\\":23,\\\"text\\\":\\\" \\\",\\\"height\\\":30}},\\\"height\\\":30},\\\"17\\\":{\\\"cells\\\":{\\\"8\\\":{\\\"rendered\\\":\\\"\\\",\\\"text\\\":\\\"\\\",\\\"config\\\":\\\"\\\"}},\\\"height\\\":10},\\\"18\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[0,1],\\\"style\\\":29,\\\"text\\\":\\\"加密说明：\\\",\\\"height\\\":25}}},\\\"19\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[0,8],\\\"style\\\":63,\\\"text\\\":\\\"1、本电子收据加密信息算法使用 SHA256\\\",\\\"height\\\":30},\\\"2\\\":{},\\\"3\\\":{},\\\"4\\\":{},\\\"5\\\":{},\\\"6\\\":{},\\\"7\\\":{},\\\"8\\\":{},\\\"9\\\":{}},\\\"height\\\":30},\\\"20\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[0,8],\\\"style\\\":65,\\\"text\\\":\\\"2、原始输入信息依次为:法人名称、收款组织、客户/业主、实际交款人、结算方式、收款单号、收款时间、款项合计,使用RSA私钥加密信息摘要生成“校验密码”\\\",\\\"height\\\":37},\\\"2\\\":{},\\\"3\\\":{},\\\"4\\\":{},\\\"5\\\":{},\\\"6\\\":{},\\\"7\\\":{},\\\"8\\\":{},\\\"9\\\":{}},\\\"height\\\":37},\\\"21\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"merge\\\":[0,8],\\\"style\\\":65,\\\"text\\\":\\\"3、应公钥为MIGEMAOCCSqGSIb3DQEBAQUAMGNADCBiQKBgQCEf iYMBHNInswq1N/KLBy smaG68D+nlQk/RZ3QVSTmWo310WnSipYR3ksCNBksyGZceEneCIEuWBboPImYQUbH/ EHP3I3Ri 1E1 INjNI3GvQ7oXH/RLmHRGAgCz 4d9QcW7mGTHVvj/3o/gEvqyHgW6eG1lsl f6aEi7mi IRHxYtZrFQIDAQAB\\\",\\\"height\\\":57},\\\"2\\\":{},\\\"3\\\":{},\\\"4\\\":{},\\\"5\\\":{},\\\"6\\\":{},\\\"7\\\":{},\\\"8\\\":{},\\\"9\\\":{}},\\\"height\\\":57},\\\"23\\\":{\\\"cells\\\":{},\\\"height\\\":25},\\\"len\\\":200},\\\"rpbar\\\":{\\\"show\\\":true,\\\"pageSize\\\":\\\"\\\",\\\"btnList\\\":[]},\\\"fixedPrintHeadRows\\\":[],\\\"fixedPrintTailRows\\\":[],\\\"displayConfig\\\":{\\\"1\\\":{\\\"colorDark\\\":\\\"#000000\\\",\\\"width\\\":69,\\\"text\\\":\\\"http://www.baidu.com\\\",\\\"colorLight\\\":\\\"#ffffff\\\",\\\"height\\\":69}},\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"styles\\\":[{\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":7.5}},{\\\"font\\\":{\\\"size\\\":8}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12}},{\\\"font\\\":{\\\"size\\\":12}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":true}},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11}},{\\\"font\\\":{\\\"size\\\":11}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]}},{\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"align\\\":\\\"center\\\"},{\\\"bgcolor\\\":\\\"#dae7d2\\\"},{\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"font\\\":{\\\"bold\\\":true}},{\\\"bgcolor\\\":\\\"【QQYUN-8110】在线通讯录支持设置权限\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"bgcolor\\\":\\\"【QQYUN-8110】在线通讯录支持设置权限\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"color\\\":\\\"【QQYUN-8110】在线通讯录支持设置权限\\\"},{\\\"color\\\":\\\"#0a0a0a\\\"},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":10.5,\\\"bold\\\":true}},{\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"font\\\":{\\\"size\\\":10.5,\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"valign\\\":\\\"middle\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"valign\\\":\\\"middle\\\"},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"valign\\\":\\\"middle\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"valign\\\":\\\"middle\\\"},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"valign\\\":\\\"middle\\\"},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"bgcolor\\\":\\\"sk-JsZB4Wi1HM2zJne40434CbCd071642Ab9910Ee1cA4CaE115\\\"},{\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"font\\\":{\\\"size\\\":11}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"font\\\":{\\\"size\\\":10}},{\\\"font\\\":{\\\"size\\\":10}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"font\\\":{\\\"size\\\":11}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11,\\\"bold\\\":true}},{},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"bgcolor\\\":\\\"#dae7d2\\\",\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":11}},{\\\"valign\\\":\\\"bottom\\\"},{\\\"textwrap\\\":true},{\\\"textwrap\\\":true,\\\"valign\\\":\\\"top\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14}},{\\\"font\\\":{\\\"size\\\":14}},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":15,\\\"bold\\\":true}},{\\\"font\\\":{\\\"size\\\":15}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":15,\\\"name\\\":\\\"宋体\\\",\\\"bold\\\":true}},{\\\"font\\\":{\\\"size\\\":15,\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":15,\\\"name\\\":\\\"楷体\\\",\\\"bold\\\":true}},{\\\"font\\\":{\\\"size\\\":15,\\\"name\\\":\\\"楷体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":15,\\\"name\\\":\\\"仿宋\\\",\\\"bold\\\":true}},{\\\"font\\\":{\\\"size\\\":15,\\\"name\\\":\\\"仿宋\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":15,\\\"name\\\":\\\"华文行楷\\\",\\\"bold\\\":true}},{\\\"font\\\":{\\\"size\\\":15,\\\"name\\\":\\\"华文行楷\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"font\\\":{\\\"bold\\\":true}},{\\\"align\\\":\\\"right\\\"},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#1e8a1e\\\"]},\\\"textwrap\\\":true}],\\\"merges\\\":[\\\"C2:D4\\\",\\\"E3:I3\\\",\\\"E4:I4\\\",\\\"B6:D6\\\",\\\"E6:F6\\\",\\\"G6:H6\\\",\\\"I6:J6\\\",\\\"B7:D7\\\",\\\"E7:F7\\\",\\\"G7:H7\\\",\\\"I7:J7\\\",\\\"B8:D8\\\",\\\"E8:F8\\\",\\\"G8:H8\\\",\\\"I8:J8\\\",\\\"B9:D9\\\",\\\"E9:J9\\\",\\\"B11:C11\\\",\\\"D11:E11\\\",\\\"F11:H11\\\",\\\"B12:C12\\\",\\\"D12:E12\\\",\\\"F12:H12\\\",\\\"B13:D13\\\",\\\"E13:J13\\\",\\\"B14:D14\\\",\\\"E14:J14\\\",\\\"B15:D15\\\",\\\"E15:J15\\\",\\\"B17:D17\\\",\\\"F17:G17\\\",\\\"H17:J17\\\",\\\"B19:C19\\\",\\\"B20:J20\\\",\\\"B21:J21\\\",\\\"B22:J22\\\"],\\\"imgList\\\":[{\\\"row\\\":2,\\\"col\\\":9,\\\"colspan\\\":1,\\\"rowspan\\\":2,\\\"width\\\":\\\"96\\\",\\\"height\\\":\\\"47\\\",\\\"src\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/wanda_1710733731369.jpg\\\",\\\"layer_id\\\":\\\"YfdiQDcuqTjlOG4f\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[2,9]]},{\\\"row\\\":15,\\\"col\\\":8,\\\"colspan\\\":1,\\\"rowspan\\\":5,\\\"width\\\":\\\"82\\\",\\\"height\\\":\\\"77\\\",\\\"src\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/dzyz_1710741011435.png\\\",\\\"layer_id\\\":\\\"qWMWhe42wLnQXDUa\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[15,8]]}]}', NULL, NULL, 'admin', '2024-03-18 10:52:51', 'admin', '2024-03-20 10:16:40', 0, NULL, NULL, 1, 60, NULL, NULL, NULL, '1', 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('938680635597357056', '20240412162853', '测试纵向分组报表111', NULL, NULL, '984272091947253760', '{\\\"loopBlockList\\\":[],\\\"printConfig\\\":{\\\"layout\\\":\\\"portrait\\\",\\\"printCallBackUrl\\\":\\\"\\\",\\\"paper\\\":\\\"A4\\\",\\\"isBackend\\\":false,\\\"width\\\":210,\\\"definition\\\":1,\\\"marginX\\\":10,\\\"height\\\":297,\\\"marginY\\\":10},\\\"dbexps\\\":[],\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":1048,\\\"autofilter\\\":{},\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":53},\\\"6\\\":{\\\"width\\\":114},\\\"7\\\":{\\\"width\\\":105},\\\"8\\\":{\\\"width\\\":276},\\\"len\\\":50},\\\"area\\\":{\\\"sri\\\":6,\\\"sci\\\":6,\\\"eri\\\":6,\\\"eci\\\":6,\\\"width\\\":114,\\\"height\\\":25},\\\"pyGroupEngine\\\":false,\\\"excel_config_id\\\":\\\"938680635597357056\\\",\\\"hiddenCells\\\":[],\\\"zonedEditionList\\\":[],\\\"rows\\\":{\\\"2\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":1,\\\"text\\\":\\\"国家\\\"},\\\"2\\\":{\\\"style\\\":1,\\\"text\\\":\\\"城市\\\"},\\\"3\\\":{\\\"style\\\":1,\\\"text\\\":\\\"地区\\\"},\\\"4\\\":{\\\"style\\\":1,\\\"text\\\":\\\"公司\\\"},\\\"5\\\":{\\\"style\\\":1,\\\"text\\\":\\\"部门\\\"},\\\"6\\\":{\\\"text\\\":\\\"学历\\\",\\\"style\\\":1},\\\"7\\\":{\\\"text\\\":\\\"性别\\\",\\\"style\\\":1},\\\"8\\\":{\\\"style\\\":1,\\\"text\\\":\\\"年龄\\\"}}},\\\"3\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":0,\\\"text\\\":\\\"#{zongxdata.group(country)}\\\",\\\"aggregate\\\":\\\"group\\\"},\\\"2\\\":{\\\"style\\\":0,\\\"text\\\":\\\"#{zongxdata.group(city)}\\\",\\\"aggregate\\\":\\\"group\\\"},\\\"3\\\":{\\\"style\\\":0,\\\"text\\\":\\\"#{zongxdata.group(region)}\\\",\\\"aggregate\\\":\\\"group\\\"},\\\"4\\\":{\\\"style\\\":0,\\\"text\\\":\\\"#{zongxdata.group(org)}\\\",\\\"aggregate\\\":\\\"group\\\"},\\\"5\\\":{\\\"style\\\":0,\\\"aggregate\\\":\\\"group\\\",\\\"text\\\":\\\"#{zongxdata.group(department)}\\\"},\\\"6\\\":{\\\"style\\\":0,\\\"aggregate\\\":\\\"group\\\",\\\"subtotal\\\":\\\"-1\\\",\\\"funcname\\\":\\\"-1\\\",\\\"text\\\":\\\"#{zongxdata.group(education)}\\\"},\\\"7\\\":{\\\"style\\\":0,\\\"aggregate\\\":\\\"group\\\",\\\"text\\\":\\\"#{zongxdata.group(sex)}\\\",\\\"subtotal\\\":\\\"groupField\\\",\\\"funcname\\\":\\\"-1\\\"},\\\"8\\\":{\\\"style\\\":0,\\\"text\\\":\\\"#{zongxdata.age}\\\",\\\"aggregate\\\":\\\"group\\\",\\\"subtotal\\\":\\\"-1\\\",\\\"funcname\\\":\\\"SUM\\\",\\\"noCalculate\\\":false,\\\"filterEmptyValue\\\":false,\\\"filterNegative\\\":false,\\\"direction\\\":\\\"down\\\"}}},\\\"8\\\":{\\\"cells\\\":{}},\\\"9\\\":{\\\"cells\\\":{}},\\\"len\\\":101},\\\"rpbar\\\":{\\\"show\\\":true,\\\"pageSize\\\":\\\"\\\",\\\"btnList\\\":[]},\\\"groupField\\\":\\\"zongxdata.country\\\",\\\"fixedPrintHeadRows\\\":[],\\\"fixedPrintTailRows\\\":[],\\\"displayConfig\\\":{},\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"styles\\\":[{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"bgcolor\\\":\\\"#c5e0b3\\\"}],\\\"isGroup\\\":true,\\\"merges\\\":[]}', NULL, NULL, 'admin', '2024-04-12 16:28:54', 'admin', '2024-04-12 16:57:16', 0, NULL, NULL, 0, 48, NULL, NULL, NULL, '2', 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('94b04a1ed7c17f8e96baa6d89fb90758', '3698522', '员工请假单', '', NULL, '984302991393210368', '{\\\"area\\\":false,\\\"printElWidth\\\":794,\\\"excel_config_id\\\":\\\"94b04a1ed7c17f8e96baa6d89fb90758\\\",\\\"printElHeight\\\":1047,\\\"rows\\\":{\\\"1\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"员工请假单\\\",\\\"style\\\":100,\\\"merge\\\":[0,7]},\\\"1\\\":{\\\"style\\\":100},\\\"2\\\":{\\\"style\\\":100},\\\"3\\\":{\\\"style\\\":100},\\\"4\\\":{\\\"style\\\":100},\\\"5\\\":{\\\"style\\\":100},\\\"6\\\":{\\\"style\\\":100},\\\"7\\\":{\\\"style\\\":100}},\\\"height\\\":65},\\\"2\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"单位：北极星\\\",\\\"style\\\":101,\\\"merge\\\":[0,2]},\\\"1\\\":{\\\"style\\\":101},\\\"2\\\":{\\\"style\\\":101},\\\"3\\\":{\\\"style\\\":102},\\\"4\\\":{\\\"style\\\":102},\\\"5\\\":{\\\"style\\\":102},\\\"6\\\":{\\\"style\\\":102},\\\"7\\\":{\\\"style\\\":102}},\\\"height\\\":38},\\\"3\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"姓名\\\",\\\"style\\\":119},\\\"1\\\":{\\\"style\\\":119,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"text\\\":\\\"工作岗位\\\",\\\"style\\\":120},\\\"3\\\":{\\\"style\\\":119,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"text\\\":\\\"工作时间\\\",\\\"style\\\":119},\\\"5\\\":{\\\"style\\\":119,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\"出生日期\\\",\\\"style\\\":119},\\\"7\\\":{\\\"style\\\":119,\\\"text\\\":\\\" \\\"}}},\\\"4\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"请选择假类型\\\",\\\"style\\\":121,\\\"merge\\\":[4,0]},\\\"1\\\":{\\\"text\\\":\\\"年休假\\\",\\\"style\\\":120},\\\"2\\\":{\\\"style\\\":120,\\\"text\\\":\\\"病、事假\\\"},\\\"3\\\":{\\\"style\\\":120,\\\"text\\\":\\\"探亲假\\\"},\\\"4\\\":{\\\"style\\\":119,\\\"merge\\\":[0,1],\\\"text\\\":\\\"婚、丧假\\\"},\\\"5\\\":{\\\"style\\\":107,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":119,\\\"merge\\\":[0,1],\\\"text\\\":\\\"生育假\\\"},\\\"7\\\":{\\\"style\\\":107,\\\"text\\\":\\\" \\\"}},\\\"height\\\":29},\\\"5\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":0},\\\"1\\\":{\\\"text\\\":\\\"1、公岭满1~9年（5天）\\\",\\\"style\\\":122},\\\"2\\\":{\\\"style\\\":119,\\\"text\\\":\\\"1、病假\\\"},\\\"3\\\":{\\\"style\\\":119,\\\"text\\\":\\\"1、未婚探父母（20天）\\\"},\\\"4\\\":{\\\"style\\\":119,\\\"merge\\\":[0,1],\\\"text\\\":\\\"1、婚假（3天）\\\"},\\\"5\\\":{\\\"style\\\":107,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":119,\\\"merge\\\":[0,1],\\\"text\\\":\\\"1、流产\\\"},\\\"7\\\":{\\\"style\\\":107,\\\"text\\\":\\\" \\\"}},\\\"height\\\":25},\\\"6\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":0},\\\"1\\\":{\\\"style\\\":123,\\\"text\\\":\\\"2、公岭满10~19年（10天）\\\"},\\\"2\\\":{\\\"style\\\":119,\\\"text\\\":\\\"2、事假\\\"},\\\"3\\\":{\\\"style\\\":119,\\\"text\\\":\\\"2、已婚探父母（20天）\\\"},\\\"4\\\":{\\\"style\\\":119,\\\"merge\\\":[0,1],\\\"text\\\":\\\"2、晚婚假（13天）\\\"},\\\"5\\\":{\\\"style\\\":107,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":119,\\\"merge\\\":[0,1],\\\"text\\\":\\\"2、产假\\\"},\\\"7\\\":{\\\"style\\\":107,\\\"text\\\":\\\" \\\"}}},\\\"7\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":0},\\\"1\\\":{\\\"style\\\":123,\\\"text\\\":\\\"3、公岭满20年（15天）\\\"},\\\"2\\\":{\\\"style\\\":119,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":119,\\\"text\\\":\\\"3、探配偶（30天）\\\"},\\\"4\\\":{\\\"style\\\":119,\\\"merge\\\":[0,1],\\\"text\\\":\\\"3、丧假（3天）\\\"},\\\"5\\\":{\\\"style\\\":107,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":119,\\\"merge\\\":[0,1],\\\"text\\\":\\\"3、哺乳假\\\"},\\\"7\\\":{\\\"style\\\":107,\\\"text\\\":\\\" \\\"}}},\\\"8\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":0},\\\"1\\\":{\\\"style\\\":119,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"style\\\":119,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":119,\\\"text\\\":\\\"探亲地点：\\\",\\\"merge\\\":[0,2]},\\\"4\\\":{\\\"style\\\":107,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":107,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":119,\\\"merge\\\":[0,1],\\\"text\\\":\\\"4、陪护假\\\"},\\\"7\\\":{\\\"style\\\":107,\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":15},\\\"9\\\":{\\\"style\\\":15},\\\"10\\\":{\\\"style\\\":15},\\\"11\\\":{\\\"style\\\":15},\\\"12\\\":{\\\"style\\\":15},\\\"13\\\":{\\\"style\\\":15},\\\"14\\\":{\\\"style\\\":15},\\\"15\\\":{\\\"style\\\":15},\\\"16\\\":{\\\"style\\\":15},\\\"17\\\":{\\\"style\\\":15},\\\"18\\\":{\\\"style\\\":15},\\\"19\\\":{\\\"style\\\":15},\\\"20\\\":{\\\"style\\\":15},\\\"21\\\":{\\\"style\\\":15},\\\"22\\\":{\\\"style\\\":15},\\\"23\\\":{\\\"style\\\":5},\\\"24\\\":{\\\"style\\\":5},\\\"25\\\":{\\\"style\\\":5}}},\\\"9\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":124,\\\"text\\\":\\\"请假时间\\\"},\\\"1\\\":{\\\"style\\\":125,\\\"merge\\\":[0,6],\\\"text\\\":\\\"2020年02-30 至2020年02-03-30\\\"},\\\"2\\\":{\\\"style\\\":115,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":115,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":115,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":115,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":115,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":115,\\\"text\\\":\\\" \\\"}},\\\"height\\\":46},\\\"10\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":126,\\\"text\\\":\\\"审批人员及意见\\\"},\\\"1\\\":{\\\"merge\\\":[0,6],\\\"style\\\":127,\\\"text\\\":\\\"同意\\\"},\\\"2\\\":{\\\"style\\\":118,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":118,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":118,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":118,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":118,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":118,\\\"text\\\":\\\" \\\"}},\\\"height\\\":89},\\\"11\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"备注\\\",\\\"style\\\":119},\\\"1\\\":{\\\"style\\\":119,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"text\\\":\\\"请假人签名\\\",\\\"style\\\":119},\\\"3\\\":{\\\"merge\\\":[0,4],\\\"style\\\":119,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":107,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":107,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":107,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":107,\\\"text\\\":\\\" \\\"}},\\\"height\\\":90},\\\"12\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"merge\\\":[0,7],\\\"style\\\":120,\\\"text\\\":\\\"请假审批表一式两份，考勤员与人力资源部门各存一份\\\"},\\\"1\\\":{\\\"style\\\":106,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"style\\\":106,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":106,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":106,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":106,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":106,\\\"text\\\":\\\" \\\"},\\\"7\\\":{\\\"style\\\":106,\\\"text\\\":\\\" \\\"}},\\\"height\\\":25},\\\"len\\\":101},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":794,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":789,\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"textwrap\\\":true},{\\\"textwrap\\\":false},{\\\"textwrap\\\":true,\\\"valign\\\":\\\"middle\\\"},{\\\"textwrap\\\":false,\\\"valign\\\":\\\"middle\\\"},{\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"textwrap\\\":false,\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"textwrap\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"textwrap\\\":false,\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"textwrap\\\":false,\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"textwrap\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"left\\\"},{},{\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"textwrap\\\":false,\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"textwrap\\\":false,\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"textwrap\\\":false,\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"textwrap\\\":false,\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"textwrap\\\":false,\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"textwrap\\\":false,\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"textwrap\\\":false,\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"textwrap\\\":false,\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\",\\\"size\\\":14}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\",\\\"size\\\":14,\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true}},{\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":false,\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":false,\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":false,\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":false,\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"valign\\\":\\\"middle\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"valign\\\":\\\"bottom\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"valign\\\":\\\"top\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"top\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"top\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"textwrap\\\":true},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"textwrap\\\":true},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"textwrap\\\":false},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"textwrap\\\":false},{\\\"textwrap\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\",\\\"size\\\":14,\\\"bold\\\":true}},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":false,\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":false,\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"valign\\\":\\\"top\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"top\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"top\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#000100\\\",\\\"textwrap\\\":false},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#000100\\\",\\\"textwrap\\\":false},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":false,\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"valign\\\":\\\"top\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"top\\\"},{\\\"textwrap\\\":true,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"color\\\":\\\"#000100\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#262626\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#262626\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#000100\\\",\\\"textwrap\\\":false}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":35},\\\"1\\\":{\\\"width\\\":195},\\\"2\\\":{\\\"width\\\":77},\\\"3\\\":{\\\"width\\\":168},\\\"4\\\":{\\\"width\\\":62},\\\"6\\\":{\\\"width\\\":70},\\\"7\\\":{\\\"width\\\":82},\\\"len\\\":26},\\\"merges\\\":[\\\"D9:F9\\\",\\\"E5:F5\\\",\\\"E6:F6\\\",\\\"E7:F7\\\",\\\"E8:F8\\\",\\\"G5:H5\\\",\\\"G6:H6\\\",\\\"G7:H7\\\",\\\"G8:H8\\\",\\\"G9:H9\\\",\\\"B10:H10\\\",\\\"B11:H11\\\",\\\"D12:H12\\\",\\\"A13:H13\\\",\\\"A3:C3\\\",\\\"A2:H2\\\",\\\"A5:A9\\\"]}', '', 'https://static.jeecg.com/designreport/images/QQ截图20201207135257_1607320433681.png', 'jeecg', '2020-07-10 18:29:39', 'admin', '2021-02-03 14:01:12', 0, NULL, NULL, 1, 145, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('961455b47c0b86dc961e90b5893bff05', '56780774', '阜阳检票数查询副本0774', '', NULL, '984302991393210368', '{\\\"area\\\":{\\\"sri\\\":8,\\\"sci\\\":6,\\\"eri\\\":8,\\\"eci\\\":6,\\\"width\\\":75,\\\"height\\\":25},\\\"printElWidth\\\":794,\\\"excel_config_id\\\":\\\"53c82a76f837d5661dceec7d93afafec\\\",\\\"printElHeight\\\":1047,\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":58},\\\"1\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":66},\\\"2\\\":{\\\"style\\\":66},\\\"3\\\":{\\\"style\\\":67,\\\"merge\\\":[0,3],\\\"text\\\":\\\"阜阳火车站检票数\\\"},\\\"4\\\":{\\\"style\\\":67},\\\"5\\\":{\\\"style\\\":67},\\\"6\\\":{\\\"style\\\":67},\\\"7\\\":{\\\"style\\\":66},\\\"8\\\":{\\\"style\\\":66},\\\"9\\\":{\\\"style\\\":58}},\\\"height\\\":63},\\\"1\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":58},\\\"1\\\":{\\\"style\\\":66},\\\"2\\\":{\\\"style\\\":66},\\\"3\\\":{\\\"style\\\":66},\\\"4\\\":{\\\"style\\\":66},\\\"5\\\":{\\\"style\\\":66},\\\"6\\\":{\\\"style\\\":66},\\\"7\\\":{\\\"style\\\":66},\\\"8\\\":{\\\"style\\\":66},\\\"9\\\":{\\\"style\\\":58}},\\\"height\\\":20},\\\"2\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":58},\\\"1\\\":{\\\"text\\\":\\\"日期：\\\",\\\"style\\\":68},\\\"2\\\":{\\\"text\\\":\\\"${gongsi.tdata}\\\",\\\"style\\\":69},\\\"3\\\":{\\\"style\\\":66},\\\"4\\\":{\\\"style\\\":66,\\\"text\\\":\\\"制表人：\\\"},\\\"5\\\":{\\\"text\\\":\\\"${gongsi.gname}\\\",\\\"style\\\":66},\\\"6\\\":{\\\"style\\\":66},\\\"7\\\":{\\\"text\\\":\\\"\\\",\\\"merge\\\":[0,1],\\\"style\\\":70},\\\"8\\\":{\\\"style\\\":70},\\\"9\\\":{\\\"style\\\":58}},\\\"isDrag\\\":true},\\\"3\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":58},\\\"1\\\":{\\\"text\\\":\\\"班次\\\",\\\"merge\\\":[1,0],\\\"style\\\":71},\\\"2\\\":{\\\"text\\\":\\\"发车时间\\\",\\\"merge\\\":[1,0],\\\"style\\\":71},\\\"3\\\":{\\\"text\\\":\\\"是否放空\\\",\\\"merge\\\":[1,0],\\\"style\\\":71},\\\"4\\\":{\\\"text\\\":\\\"路线\\\",\\\"merge\\\":[0,1],\\\"style\\\":71},\\\"5\\\":{\\\"style\\\":72},\\\"6\\\":{\\\"text\\\":\\\"核载座位数\\\",\\\"merge\\\":[1,0],\\\"style\\\":71},\\\"7\\\":{\\\"merge\\\":[1,0],\\\"style\\\":71,\\\"text\\\":\\\"检票数\\\"},\\\"8\\\":{\\\"merge\\\":[1,0],\\\"style\\\":71,\\\"text\\\":\\\"实载率（%）\\\"},\\\"9\\\":{\\\"style\\\":58}}},\\\"4\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":58},\\\"1\\\":{\\\"style\\\":72},\\\"2\\\":{\\\"style\\\":71},\\\"3\\\":{\\\"style\\\":72},\\\"4\\\":{\\\"text\\\":\\\"从\\\",\\\"style\\\":71},\\\"5\\\":{\\\"text\\\":\\\"到\\\",\\\"style\\\":71},\\\"6\\\":{\\\"style\\\":72},\\\"7\\\":{\\\"style\\\":71},\\\"8\\\":{\\\"style\\\":72},\\\"9\\\":{\\\"style\\\":58}},\\\"height\\\":25},\\\"5\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":58},\\\"1\\\":{\\\"style\\\":73,\\\"text\\\":\\\"#{jianpiao.bnum}\\\"},\\\"2\\\":{\\\"style\\\":73,\\\"text\\\":\\\"#{jianpiao.ftime}\\\"},\\\"3\\\":{\\\"style\\\":73,\\\"text\\\":\\\"#{jianpiao.sfkong}\\\"},\\\"4\\\":{\\\"style\\\":73,\\\"text\\\":\\\"#{jianpiao.kaishi}\\\"},\\\"5\\\":{\\\"style\\\":73,\\\"text\\\":\\\"#{jianpiao.jieshu}\\\"},\\\"6\\\":{\\\"style\\\":73,\\\"text\\\":\\\"#{jianpiao.hezairen}\\\"},\\\"7\\\":{\\\"style\\\":73,\\\"text\\\":\\\"#{jianpiao.jpnum}\\\"},\\\"8\\\":{\\\"style\\\":73,\\\"text\\\":\\\"#{jianpiao.shihelv}\\\"},\\\"9\\\":{\\\"style\\\":58}},\\\"height\\\":33},\\\"6\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":11},\\\"2\\\":{\\\"style\\\":11},\\\"3\\\":{\\\"style\\\":11},\\\"4\\\":{\\\"style\\\":11},\\\"5\\\":{\\\"style\\\":11},\\\"6\\\":{\\\"style\\\":11},\\\"7\\\":{\\\"style\\\":11},\\\"8\\\":{\\\"style\\\":11}},\\\"isDrag\\\":true},\\\"7\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":11},\\\"2\\\":{\\\"style\\\":11,\\\"text\\\":\\\"\\\"},\\\"3\\\":{\\\"style\\\":11},\\\"4\\\":{\\\"style\\\":11},\\\"5\\\":{\\\"style\\\":11},\\\"6\\\":{\\\"style\\\":11},\\\"7\\\":{\\\"style\\\":11},\\\"8\\\":{\\\"style\\\":11}}},\\\"8\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":11},\\\"2\\\":{\\\"style\\\":11},\\\"3\\\":{\\\"style\\\":11},\\\"4\\\":{\\\"style\\\":11},\\\"5\\\":{\\\"style\\\":11},\\\"6\\\":{\\\"style\\\":11},\\\"7\\\":{\\\"style\\\":11},\\\"8\\\":{\\\"style\\\":11}}},\\\"9\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":11},\\\"2\\\":{\\\"style\\\":11},\\\"3\\\":{\\\"style\\\":11},\\\"4\\\":{\\\"style\\\":11},\\\"5\\\":{\\\"style\\\":11},\\\"6\\\":{\\\"style\\\":11},\\\"7\\\":{\\\"style\\\":11},\\\"8\\\":{\\\"style\\\":11}}},\\\"10\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":11},\\\"2\\\":{\\\"style\\\":11},\\\"3\\\":{\\\"style\\\":11},\\\"4\\\":{\\\"style\\\":11},\\\"5\\\":{\\\"style\\\":11},\\\"6\\\":{\\\"style\\\":11},\\\"7\\\":{\\\"style\\\":11},\\\"8\\\":{\\\"style\\\":11}}},\\\"11\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":11},\\\"2\\\":{\\\"style\\\":11},\\\"3\\\":{\\\"style\\\":11},\\\"4\\\":{\\\"style\\\":11},\\\"5\\\":{\\\"style\\\":11},\\\"6\\\":{\\\"style\\\":11},\\\"7\\\":{\\\"style\\\":11},\\\"8\\\":{\\\"style\\\":11}}},\\\"12\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":11},\\\"2\\\":{\\\"style\\\":11},\\\"3\\\":{\\\"style\\\":11},\\\"4\\\":{\\\"style\\\":11},\\\"5\\\":{\\\"style\\\":11},\\\"6\\\":{\\\"style\\\":11},\\\"7\\\":{\\\"style\\\":11},\\\"8\\\":{\\\"style\\\":11}}},\\\"13\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":11},\\\"2\\\":{\\\"style\\\":11},\\\"3\\\":{\\\"style\\\":11},\\\"4\\\":{\\\"style\\\":11},\\\"5\\\":{\\\"style\\\":11},\\\"6\\\":{\\\"style\\\":11},\\\"7\\\":{\\\"style\\\":11},\\\"8\\\":{\\\"style\\\":11}}},\\\"14\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":11},\\\"2\\\":{\\\"style\\\":11},\\\"3\\\":{\\\"style\\\":11},\\\"4\\\":{\\\"style\\\":11},\\\"5\\\":{\\\"style\\\":11},\\\"6\\\":{\\\"style\\\":11},\\\"7\\\":{\\\"style\\\":11},\\\"8\\\":{\\\"style\\\":11}}},\\\"len\\\":96,\\\"-1\\\":{\\\"cells\\\":{\\\"-1\\\":{\\\"text\\\":\\\"${gongsi.id}\\\"}},\\\"isDrag\\\":true}},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":794,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":737,\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]}},{\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#7f7f7f\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"font\\\":{\\\"bold\\\":true}},{\\\"font\\\":{\\\"bold\\\":false}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"align\\\":\\\"right\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"bold\\\":true},\\\"bgcolor\\\":\\\"#4371c6\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true},\\\"bgcolor\\\":\\\"#4371c6\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#4371c6\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#4371c6\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#2e75b5\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#2e75b5\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#0170c1\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#0170c1\\\"},{\\\"font\\\":{\\\"bold\\\":false},\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000100\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000100\\\"]},\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#01b0f1\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#01b0f1\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#5b9cd6\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"font\\\":{\\\"bold\\\":false},\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true},\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":22,\\\"bold\\\":true},\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true},\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"bold\\\":false},\\\"color\\\":\\\"#7f7f7f\\\",\\\"align\\\":\\\"right\\\"},{\\\"color\\\":\\\"#7f7f7f\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"},\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"bold\\\":false,\\\"name\\\":\\\"宋体\\\"},\\\"color\\\":\\\"#7f7f7f\\\",\\\"align\\\":\\\"right\\\"},{\\\"color\\\":\\\"#7f7f7f\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"name\\\":\\\"宋体\\\"},\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false,\\\"name\\\":\\\"宋体\\\"},\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"bold\\\":false,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"color\\\":\\\"#7f7f7f\\\",\\\"align\\\":\\\"right\\\"},{\\\"color\\\":\\\"#7f7f7f\\\",\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"font\\\":{\\\"bold\\\":false,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false,\\\"name\\\":\\\"Microsoft YaHei\\\"},\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":53},\\\"1\\\":{\\\"width\\\":118},\\\"2\\\":{\\\"width\\\":75},\\\"3\\\":{\\\"width\\\":54},\\\"4\\\":{\\\"width\\\":95},\\\"5\\\":{\\\"width\\\":109},\\\"6\\\":{\\\"width\\\":75},\\\"7\\\":{\\\"width\\\":75},\\\"8\\\":{\\\"width\\\":83},\\\"9\\\":{\\\"width\\\":30},\\\"len\\\":27},\\\"merges\\\":[\\\"E4:F4\\\",\\\"B4:B5\\\",\\\"C4:C5\\\",\\\"D4:D5\\\",\\\"G4:G5\\\",\\\"H4:H5\\\",\\\"I4:I5\\\",\\\"D1:G1\\\",\\\"H3:I3\\\"]}', '', 'https://static.jeecg.com/designreport/images/25_1597233573577.png', 'admin', '2021-01-19 10:46:45', 'admin', '2021-02-03 13:58:22', 0, NULL, NULL, 0, 711, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('975549294469992448', '20240723101422', '简单表达式混合运算', NULL, NULL, 'datainfo', '{\\\"loopBlockList\\\":[],\\\"printConfig\\\":{\\\"paper\\\":\\\"A4\\\",\\\"width\\\":210,\\\"height\\\":297,\\\"definition\\\":1,\\\"isBackend\\\":false,\\\"marginX\\\":10,\\\"marginY\\\":10,\\\"layout\\\":\\\"portrait\\\",\\\"printCallBackUrl\\\":\\\"\\\"},\\\"hidden\\\":{\\\"rows\\\":[],\\\"cols\\\":[]},\\\"dbexps\\\":[],\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":1097,\\\"autofilter\\\":{},\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":81},\\\"1\\\":{\\\"width\\\":55},\\\"2\\\":{\\\"width\\\":144},\\\"3\\\":{\\\"width\\\":143},\\\"4\\\":{\\\"width\\\":112},\\\"5\\\":{\\\"width\\\":129},\\\"7\\\":{\\\"width\\\":333},\\\"len\\\":100},\\\"area\\\":false,\\\"pyGroupEngine\\\":false,\\\"excel_config_id\\\":\\\"975549294469992448\\\",\\\"hiddenCells\\\":[],\\\"zonedEditionList\\\":[],\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"1\\\"},\\\"1\\\":{},\\\"2\\\":{\\\"text\\\":\\\"SUM(A1,A2)\\\"},\\\"3\\\":{\\\"text\\\":\\\"=SUM(A1,A2)\\\"},\\\"4\\\":{\\\"text\\\":\\\"SUM(A1:A10)\\\"},\\\"5\\\":{\\\"text\\\":\\\"=SUM(A1:A10)\\\"}}},\\\"1\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"2\\\"},\\\"1\\\":{},\\\"2\\\":{\\\"text\\\":\\\"SUM(A1,A2)*2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=SUM(A1,A2)*2\\\"},\\\"4\\\":{\\\"text\\\":\\\"SUM(A1:A10)*2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=SUM(A1:A10)*2\\\"},\\\"6\\\":{},\\\"7\\\":{\\\"text\\\":\\\"=2+SUM(A1,A2)*2 \\\"}}},\\\"2\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"3\\\"},\\\"2\\\":{\\\"text\\\":\\\"SUM(A1,A2)/2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=SUM(A1,A2)/2\\\"},\\\"4\\\":{\\\"text\\\":\\\"SUM(A1:A10)/2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=SUM(A1:A10)/2\\\"},\\\"7\\\":{\\\"text\\\":\\\"=A1*A2\\\"}}},\\\"3\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"4\\\"},\\\"2\\\":{\\\"text\\\":\\\"SUM(A1,A2)+2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=SUM(A1,A2)+2\\\"},\\\"4\\\":{\\\"text\\\":\\\"SUM(A1:A10)+2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=SUM(A1:A10)+2\\\"}}},\\\"4\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"5\\\"},\\\"2\\\":{\\\"text\\\":\\\"SUM(A1,A2)-2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=SUM(A1,A2)-2\\\"},\\\"4\\\":{\\\"text\\\":\\\"SUM(A1:A10)-2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=SUM(A1:A10)-2\\\"},\\\"7\\\":{}}},\\\"5\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"6\\\"}}},\\\"6\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"7\\\"},\\\"2\\\":{\\\"text\\\":\\\"MAX(A1,A2)\\\"},\\\"3\\\":{\\\"text\\\":\\\"=MAX(A1,A2)\\\"},\\\"4\\\":{\\\"text\\\":\\\"MAX(A1:A10)\\\"},\\\"5\\\":{\\\"text\\\":\\\"=MAX(A1:A10)\\\"}}},\\\"7\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"8\\\"},\\\"2\\\":{\\\"text\\\":\\\"MAX(A1,A2)*2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=MAX(A1,A2)*2\\\"},\\\"4\\\":{\\\"text\\\":\\\"MAX(A1:A10)*2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=MAX(A1:A10)*2\\\"}}},\\\"8\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"9\\\"},\\\"2\\\":{\\\"text\\\":\\\"MAX(A1,A2)/2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=MAX(A1,A2)/2\\\"},\\\"4\\\":{\\\"text\\\":\\\"MAX(A1:A10)/2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=MAX(A1:A10)/2\\\"}}},\\\"9\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"10\\\"},\\\"2\\\":{\\\"text\\\":\\\"MAX(A1,A2)+2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=MAX(A1,A2)+2\\\"},\\\"4\\\":{\\\"text\\\":\\\"MAX(A1:A10)+2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=MAX(A1:A10)+2\\\"}}},\\\"10\\\":{\\\"cells\\\":{\\\"0\\\":{},\\\"2\\\":{\\\"text\\\":\\\"MAX(A1,A2)-2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=MAX(A1,A2)-2\\\"},\\\"4\\\":{\\\"text\\\":\\\"MAX(A1:A10)-2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=MAX(A1:A10)-2\\\"}}},\\\"11\\\":{\\\"cells\\\":{\\\"0\\\":{}}},\\\"12\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"MIN(A1,A2)\\\"},\\\"3\\\":{\\\"text\\\":\\\"=MIN(A1,A2)\\\"},\\\"4\\\":{\\\"text\\\":\\\"MIN(A1:A10)\\\"},\\\"5\\\":{\\\"text\\\":\\\"=MIN(A1:A10)\\\"}}},\\\"13\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"MIN(A1,A2)*2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=MIN(A1,A2)*2\\\"},\\\"4\\\":{\\\"text\\\":\\\"MIN(A1:A10)*2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=MIN(A1:A10)*2\\\"}}},\\\"14\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"MIN(A1,A2)/2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=MIN(A1,A2)/2\\\"},\\\"4\\\":{\\\"text\\\":\\\"MIN(A1:A10)/2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=MIN(A1:A10)/2\\\"}}},\\\"15\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"MIN(A1,A2)+2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=MIN(A1,A2)+2\\\"},\\\"4\\\":{\\\"text\\\":\\\"MIN(A1:A10)+2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=MIN(A1:A10)+2\\\"}}},\\\"16\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"MIN(A1,A2)-2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=MIN(A1,A2)-2\\\"},\\\"4\\\":{\\\"text\\\":\\\"MIN(A1:A10)-2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=MIN(A1:A10)-2\\\"}}},\\\"18\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"AVERAGE(A1,A2)\\\"},\\\"3\\\":{\\\"text\\\":\\\"=AVERAGE(A1,A2)\\\"},\\\"4\\\":{\\\"text\\\":\\\"AVERAGE(A1:A10)\\\"},\\\"5\\\":{\\\"text\\\":\\\"=AVERAGE(A1:A10)\\\"}}},\\\"19\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"AVERAGE(A1,A2)*2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=AVERAGE(A1,A2)*2\\\"},\\\"4\\\":{\\\"text\\\":\\\"AVERAGE(A1:A10)*2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=AVERAGE(A1:A10)*2\\\"}}},\\\"20\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"AVERAGE(A1,A2)/2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=AVERAGE(A1,A2)/2\\\"},\\\"4\\\":{\\\"text\\\":\\\"AVERAGE(A1:A10)/2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=AVERAGE(A1:A10)/2\\\"}}},\\\"21\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"AVERAGE(A1,A2)+2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=AVERAGE(A1,A2)+2\\\"},\\\"4\\\":{\\\"text\\\":\\\"AVERAGE(A1:A10)+2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=AVERAGE(A1:A10)+2\\\"}}},\\\"22\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"AVERAGE(A1,A2)-2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=AVERAGE(A1,A2)-2\\\"},\\\"4\\\":{\\\"text\\\":\\\"AVERAGE(A1:A10)-2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=AVERAGE(A1:A10)-2\\\"}}},\\\"24\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"COUNTNZ(A1,A2)\\\"},\\\"3\\\":{\\\"text\\\":\\\"=COUNTNZ(A1,A2)\\\"},\\\"4\\\":{\\\"text\\\":\\\"COUNTNZ(A1:A10)\\\"},\\\"5\\\":{\\\"text\\\":\\\"=COUNTNZ(A1:A10)\\\"}}},\\\"25\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"COUNTNZ(A1,A2)*2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=COUNTNZ(A1,A2)*2\\\"},\\\"4\\\":{\\\"text\\\":\\\"COUNTNZ(A1:A10)*2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=COUNTNZ(A1:A10)*2\\\"}}},\\\"26\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"COUNTNZ(A1,A2)/2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=COUNTNZ(A1,A2)/2\\\"},\\\"4\\\":{\\\"text\\\":\\\"COUNTNZ(A1:A10)/2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=COUNTNZ(A1:A10)/2\\\"}}},\\\"27\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"COUNTNZ(A1,A2)+2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=COUNTNZ(A1,A2)+2\\\"},\\\"4\\\":{\\\"text\\\":\\\"COUNTNZ(A1:A10)+2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=COUNTNZ(A1:A10)+2\\\"}}},\\\"28\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"COUNTNZ(A1,A2)-2\\\"},\\\"3\\\":{\\\"text\\\":\\\"=COUNTNZ(A1,A2)-2\\\"},\\\"4\\\":{\\\"text\\\":\\\"COUNTNZ(A1:A10)-2\\\"},\\\"5\\\":{\\\"text\\\":\\\"=COUNTNZ(A1:A10)-2\\\"}}},\\\"len\\\":200},\\\"rpbar\\\":{\\\"show\\\":true,\\\"pageSize\\\":\\\"\\\",\\\"btnList\\\":[]},\\\"fixedPrintHeadRows\\\":[],\\\"fixedPrintTailRows\\\":[],\\\"displayConfig\\\":{},\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"styles\\\":[],\\\"freezeLineColor\\\":\\\"rgb(185, 185, 185)\\\",\\\"merges\\\":[]}', NULL, NULL, 'admin', '2024-07-23 10:14:22', 'admin', '2024-07-24 19:17:39', 0, NULL, NULL, 0, 75, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('989065112487022592', '20240823093133__1750', '在线填报-员工信息登记', NULL, NULL, 'datainfo', '{\\\"loopBlockList\\\":[],\\\"querySetting\\\":{\\\"izOpenQueryBar\\\":false,\\\"izDefaultQuery\\\":true},\\\"printConfig\\\":{\\\"paper\\\":\\\"A4\\\",\\\"width\\\":210,\\\"height\\\":297,\\\"definition\\\":1,\\\"isBackend\\\":false,\\\"marginX\\\":10,\\\"marginY\\\":10,\\\"layout\\\":\\\"portrait\\\",\\\"printCallBackUrl\\\":\\\"\\\"},\\\"hidden\\\":{\\\"rows\\\":[],\\\"cols\\\":[]},\\\"dbexps\\\":[],\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":698,\\\"autofilter\\\":{},\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":76},\\\"1\\\":{\\\"width\\\":114},\\\"2\\\":{\\\"width\\\":87},\\\"3\\\":{\\\"width\\\":99},\\\"4\\\":{\\\"width\\\":65},\\\"5\\\":{\\\"width\\\":126},\\\"6\\\":{\\\"width\\\":131},\\\"len\\\":100},\\\"area\\\":{\\\"sri\\\":10,\\\"sci\\\":9,\\\"eri\\\":10,\\\"eci\\\":9,\\\"width\\\":100,\\\"height\\\":121},\\\"pyGroupEngine\\\":false,\\\"submitHandlers\\\":[{\\\"type\\\":\\\"api\\\",\\\"code\\\":\\\"api\\\",\\\"name\\\":\\\"api\\\",\\\"isMain\\\":true,\\\"isEdit\\\":true,\\\"apiUrl\\\":\\\"https://bootapi.jeecg.com/jmreport/test/submit/handle\\\"}],\\\"excel_config_id\\\":\\\"989065112487022592\\\",\\\"hiddenCells\\\":[],\\\"zonedEditionList\\\":[],\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"merge\\\":[1,6],\\\"height\\\":90,\\\"text\\\":\\\"员工信息登记表\\\",\\\"style\\\":6}},\\\"height\\\":45},\\\"1\\\":{\\\"cells\\\":{},\\\"height\\\":45},\\\"2\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"编号\\\",\\\"style\\\":7,\\\"fillFormLabel\\\":\\\"*\\\"},\\\"1\\\":{\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"input-text\\\",\\\"component\\\":\\\"Input\\\",\\\"field\\\":\\\"no\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"pattern\\\":\\\"\\\",\\\"patternErrorTip\\\":\\\"\\\"},\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"text\\\":\\\"年龄\\\",\\\"style\\\":7},\\\"3\\\":{\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"InputNumber\\\",\\\"component\\\":\\\"InputNumber\\\",\\\"field\\\":\\\"age\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"label\\\":\\\"\\\",\\\"labelText\\\":\\\"\\\",\\\"precision\\\":0,\\\"isLimitMinNum\\\":false,\\\"minNum\\\":0,\\\"isLimitMaxNum\\\":false,\\\"maxNum\\\":100,\\\"dbFieldBind\\\":[{\\\"dbTable\\\":\\\"test_form_submit\\\",\\\"dbField\\\":\\\"age\\\"}]},\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"text\\\":\\\"填写时间\\\",\\\"style\\\":7},\\\"5\\\":{\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"DatePicker-time\\\",\\\"component\\\":\\\"DatePicker\\\",\\\"field\\\":\\\"create_time\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"label\\\":\\\"\\\",\\\"labelText\\\":\\\"\\\",\\\"dateFormat\\\":\\\"yyyy-MM-dd HH:mm:ss\\\",\\\"defaultValue\\\":\\\"\\\"},\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"merge\\\":[3,0],\\\"height\\\":180,\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"JUploadImage\\\",\\\"component\\\":\\\"JUploadImage\\\",\\\"field\\\":\\\"photo\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"multiple\\\":false,\\\"maxUploadNum\\\":1,\\\"h_align\\\":\\\"center\\\"},\\\"style\\\":7,\\\"text\\\":\\\" \\\"}},\\\"height\\\":45},\\\"3\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"姓名\\\",\\\"style\\\":7,\\\"fillFormLabel\\\":\\\"*\\\"},\\\"1\\\":{\\\"text\\\":\\\" \\\",\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"input-text\\\",\\\"component\\\":\\\"Input\\\",\\\"field\\\":\\\"name\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":true,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"dbFieldBind\\\":[{\\\"dbTable\\\":\\\"test_form_submit\\\",\\\"dbField\\\":\\\"name\\\"},{\\\"dbTable\\\":\\\"test_form_submit1\\\",\\\"dbField\\\":\\\"name\\\"}],\\\"label\\\":\\\"A5\\\",\\\"labelText\\\":\\\"姓名\\\",\\\"pattern\\\":\\\"\\\",\\\"patternErrorTip\\\":\\\"\\\"}},\\\"2\\\":{\\\"text\\\":\\\"性别\\\",\\\"style\\\":7},\\\"3\\\":{\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"JRadio\\\",\\\"component\\\":\\\"JRadio\\\",\\\"field\\\":\\\"sex\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"dataSource\\\":\\\"dict\\\",\\\"options\\\":[{\\\"label\\\":\\\"男\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"女\\\",\\\"value\\\":\\\"2\\\"}],\\\"apiUrl\\\":\\\"\\\",\\\"dictCode\\\":\\\"sex1\\\",\\\"dictName\\\":\\\"性别\\\"},\\\"style\\\":8,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"text\\\":\\\"出生日期\\\",\\\"style\\\":7},\\\"5\\\":{\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"DatePicker-date\\\",\\\"component\\\":\\\"DatePicker\\\",\\\"field\\\":\\\"brithday\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"dateFormat\\\":\\\"yyyy-MM-dd\\\",\\\"dateShowType\\\":\\\"date\\\"},\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"8\\\":{}},\\\"height\\\":45},\\\"4\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"民族\\\",\\\"style\\\":7,\\\"fillFormLabel\\\":\\\"*\\\"},\\\"1\\\":{\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"JSelect\\\",\\\"component\\\":\\\"JSelect\\\",\\\"field\\\":\\\"nation\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"dataSource\\\":\\\"dict\\\",\\\"options\\\":[{\\\"label\\\":\\\"选项1\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"选项2\\\",\\\"value\\\":\\\"2\\\"},{\\\"label\\\":\\\"选项3\\\",\\\"value\\\":\\\"3\\\"}],\\\"apiUrl\\\":\\\"\\\",\\\"dictCode\\\":\\\"minzu\\\",\\\"dictName\\\":\\\"民族\\\",\\\"multiple\\\":\\\"\\\"},\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"text\\\":\\\"政治面貌\\\",\\\"style\\\":7},\\\"3\\\":{\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"JSelect\\\",\\\"component\\\":\\\"JSelect\\\",\\\"field\\\":\\\"politics\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"dbFieldBind\\\":[{\\\"dbTable\\\":\\\"test_form_submit\\\",\\\"dbField\\\":\\\"politics\\\"}],\\\"dataSource\\\":\\\"api\\\",\\\"options\\\":[{\\\"label\\\":\\\"选项1\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"选项2\\\",\\\"value\\\":\\\"2\\\"},{\\\"label\\\":\\\"选项3\\\",\\\"value\\\":\\\"3\\\"}],\\\"apiUrl\\\":\\\"https://bootapi.jeecg.com/jmreport/test/submit/dict/political\\\",\\\"dictCode\\\":\\\"\\\",\\\"dictName\\\":\\\"\\\",\\\"multiple\\\":\\\"\\\"},\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"text\\\":\\\"籍贯\\\",\\\"style\\\":7},\\\"5\\\":{\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"JAreaLinkage\\\",\\\"component\\\":\\\"JAreaLinkage\\\",\\\"field\\\":\\\"native_place\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"dbFieldBind\\\":[{\\\"dbTable\\\":\\\"test_form_submit\\\",\\\"dbField\\\":\\\"native_place\\\"}],\\\"areaType\\\":\\\"region\\\"},\\\"style\\\":7,\\\"text\\\":\\\" \\\"}},\\\"height\\\":45},\\\"5\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"身高（cm)\\\",\\\"style\\\":7},\\\"1\\\":{\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"InputNumber\\\",\\\"component\\\":\\\"InputNumber\\\",\\\"field\\\":\\\"height\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"dbFieldBind\\\":[{\\\"dbTable\\\":\\\"test_form_submit\\\",\\\"dbField\\\":\\\"height\\\"}],\\\"precision\\\":2,\\\"isLimitMinNum\\\":false,\\\"minNum\\\":50,\\\"isLimitMaxNum\\\":false,\\\"maxNum\\\":200},\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"text\\\":\\\"体重\\\",\\\"style\\\":7},\\\"3\\\":{\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"InputNumber\\\",\\\"component\\\":\\\"InputNumber\\\",\\\"field\\\":\\\"weight\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"dbFieldBind\\\":[{\\\"dbTable\\\":\\\"test_form_submit\\\",\\\"dbField\\\":\\\"weight\\\"}],\\\"precision\\\":2,\\\"isLimitMinNum\\\":false,\\\"minNum\\\":30,\\\"isLimitMaxNum\\\":false,\\\"maxNum\\\":300},\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"text\\\":\\\"健康状况\\\",\\\"style\\\":7},\\\"5\\\":{\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"JSelect\\\",\\\"component\\\":\\\"JSelect\\\",\\\"field\\\":\\\"health\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"dataSource\\\":\\\"static\\\",\\\"options\\\":[{\\\"label\\\":\\\"健康\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"不健康\\\",\\\"value\\\":\\\"2\\\"}],\\\"apiUrl\\\":\\\"\\\",\\\"dictCode\\\":\\\"\\\",\\\"dictName\\\":\\\"\\\",\\\"multiple\\\":\\\"\\\"},\\\"style\\\":7,\\\"text\\\":\\\" \\\"}},\\\"height\\\":45},\\\"6\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"身份证号\\\",\\\"style\\\":7},\\\"1\\\":{\\\"merge\\\":[0,2],\\\"height\\\":45,\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"input-text\\\",\\\"component\\\":\\\"Input\\\",\\\"field\\\":\\\"idcard\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"pattern\\\":\\\"^\\\\\\\\d{17}[\\\\\\\\dX]$\\\",\\\"patternErrorTip\\\":\\\"请输入身份证号\\\",\\\"dbFieldBind\\\":[{\\\"dbTable\\\":\\\"test_form_submit\\\",\\\"dbField\\\":\\\"id_card\\\"}]},\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"text\\\":\\\"学历\\\",\\\"style\\\":7},\\\"5\\\":{\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"JSelect\\\",\\\"component\\\":\\\"JSelect\\\",\\\"field\\\":\\\"people\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"dataSource\\\":\\\"dict\\\",\\\"options\\\":[{\\\"label\\\":\\\"选项1\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"选项2\\\",\\\"value\\\":\\\"2\\\"},{\\\"label\\\":\\\"选项3\\\",\\\"value\\\":\\\"3\\\"}],\\\"apiUrl\\\":\\\"\\\",\\\"dictCode\\\":\\\"xueli_sf\\\",\\\"dictName\\\":\\\"学历\\\",\\\"multiple\\\":true},\\\"style\\\":7,\\\"text\\\":\\\" \\\",\\\"merge\\\":[0,1],\\\"height\\\":45}},\\\"height\\\":45},\\\"7\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"联系地址\\\",\\\"style\\\":7},\\\"1\\\":{\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"input-text\\\",\\\"component\\\":\\\"Input\\\",\\\"field\\\":\\\"addr\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"dbFieldBind\\\":[{\\\"dbTable\\\":\\\"test_form_submit\\\",\\\"dbField\\\":\\\"address\\\"}],\\\"pattern\\\":\\\"\\\",\\\"patternErrorTip\\\":\\\"\\\"},\\\"merge\\\":[0,2],\\\"height\\\":45,\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"text\\\":\\\"手机号\\\",\\\"style\\\":7},\\\"5\\\":{\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"input-text\\\",\\\"component\\\":\\\"Input\\\",\\\"field\\\":\\\"phone\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"dbFieldBind\\\":[{\\\"dbTable\\\":\\\"test_form_submit\\\",\\\"dbField\\\":\\\"phone\\\"}],\\\"pattern\\\":\\\"\\\",\\\"patternErrorTip\\\":\\\"\\\"},\\\"style\\\":7,\\\"text\\\":\\\" \\\",\\\"merge\\\":[0,1],\\\"height\\\":45}},\\\"height\\\":45},\\\"8\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"毕业证书\\\",\\\"style\\\":7},\\\"1\\\":{\\\"merge\\\":[0,2],\\\"height\\\":45,\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"JUploadFile\\\",\\\"component\\\":\\\"JUploadFile\\\",\\\"field\\\":\\\"ca\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"multiple\\\":false,\\\"maxUploadNum\\\":1,\\\"dbFieldBind\\\":[{\\\"dbTable\\\":\\\"test_form_submit\\\",\\\"dbField\\\":\\\"ca\\\"}]},\\\"style\\\":9,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"text\\\":\\\"幸运色\\\",\\\"style\\\":7},\\\"5\\\":{\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"ColorPicker\\\",\\\"component\\\":\\\"ColorPicker\\\",\\\"field\\\":\\\"lucky_color\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"alpha\\\":false},\\\"style\\\":7,\\\"text\\\":\\\" \\\",\\\"merge\\\":[0,1],\\\"height\\\":45}},\\\"height\\\":45},\\\"9\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"教育经历\\\",\\\"merge\\\":[0,6],\\\"height\\\":45,\\\"style\\\":8}},\\\"height\\\":45},\\\"10\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"merge\\\":[0,6],\\\"height\\\":121,\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"input-textarea\\\",\\\"component\\\":\\\"Input\\\",\\\"field\\\":\\\"education\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"dbFieldBind\\\":[{\\\"dbTable\\\":\\\"test_form_submit\\\",\\\"dbField\\\":\\\"education\\\"}],\\\"pattern\\\":\\\"\\\",\\\"patternErrorTip\\\":\\\"\\\"},\\\"style\\\":7,\\\"text\\\":\\\" \\\"}},\\\"height\\\":121},\\\"11\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"工作经历\\\",\\\"merge\\\":[0,6],\\\"height\\\":45,\\\"style\\\":8}},\\\"height\\\":45},\\\"12\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"merge\\\":[0,6],\\\"height\\\":150,\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"input-textarea\\\",\\\"component\\\":\\\"Input\\\",\\\"field\\\":\\\"work_exp\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"dbFieldBind\\\":[{\\\"dbTable\\\":\\\"test_form_submit\\\",\\\"dbField\\\":\\\"work_exp\\\"}],\\\"pattern\\\":\\\"\\\",\\\"patternErrorTip\\\":\\\"\\\"},\\\"style\\\":7,\\\"text\\\":\\\" \\\"}},\\\"height\\\":150},\\\"13\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"爱好\\\",\\\"style\\\":7},\\\"1\\\":{\\\"merge\\\":[0,5],\\\"height\\\":45,\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"JCheckbox\\\",\\\"component\\\":\\\"JCheckbox\\\",\\\"field\\\":\\\"fruity\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"dbFieldBind\\\":[{\\\"dbTable\\\":\\\"test_form_submit\\\",\\\"dbField\\\":\\\"fruity\\\"}],\\\"dataSource\\\":\\\"dict\\\",\\\"options\\\":[{\\\"label\\\":\\\"选项1\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"选项2\\\",\\\"value\\\":\\\"2\\\"},{\\\"label\\\":\\\"选项3\\\",\\\"value\\\":\\\"3\\\"}],\\\"apiUrl\\\":\\\"\\\",\\\"dictCode\\\":\\\"aihao\\\",\\\"dictName\\\":\\\"爱好\\\"},\\\"style\\\":7,\\\"text\\\":\\\" \\\"}},\\\"height\\\":45},\\\"14\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"所属部门\\\",\\\"style\\\":7},\\\"1\\\":{\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"JDepartment\\\",\\\"component\\\":\\\"JDepartment\\\",\\\"field\\\":\\\"dept\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"dbFieldBind\\\":[{\\\"dbTable\\\":\\\"test_form_submit\\\",\\\"dbField\\\":\\\"dept\\\"}],\\\"multiple\\\":true,\\\"apiUrl\\\":\\\"http://192.168.1.69:8086/jmreport/test/getDepartmentList\\\"},\\\"merge\\\":[0,2],\\\"height\\\":45,\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"text\\\":\\\"薪资\\\",\\\"style\\\":7},\\\"5\\\":{\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"JMoney\\\",\\\"component\\\":\\\"JMoney\\\",\\\"field\\\":\\\"pay\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"label\\\":\\\"\\\",\\\"labelText\\\":\\\"\\\",\\\"precision\\\":0,\\\"addon\\\":\\\"prepend\\\",\\\"moenyUnit\\\":\\\"￥\\\"},\\\"style\\\":7,\\\"text\\\":\\\" \\\",\\\"merge\\\":[0,1],\\\"height\\\":45}},\\\"height\\\":45},\\\"15\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"角色\\\",\\\"style\\\":7},\\\"1\\\":{\\\"merge\\\":[0,2],\\\"height\\\":45,\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"JRole\\\",\\\"component\\\":\\\"JRole\\\",\\\"field\\\":\\\"role\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"multiple\\\":false,\\\"apiUrl\\\":\\\"https://bootapi.jeecg.com/jmreport/test/getRoleList\\\",\\\"dbFieldBind\\\":[{\\\"dbTable\\\":\\\"test_form_submit\\\",\\\"dbField\\\":\\\"role\\\"}]},\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":7,\\\"text\\\":\\\"工位\\\"},\\\"5\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\",\\\"merge\\\":[0,1],\\\"height\\\":45,\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"JSelect\\\",\\\"component\\\":\\\"JSelect\\\",\\\"field\\\":\\\"station\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"label\\\":\\\"\\\",\\\"labelText\\\":\\\"\\\",\\\"dataSource\\\":\\\"static\\\",\\\"options\\\":[{\\\"label\\\":\\\"101\\\",\\\"value\\\":\\\"1\\\"},{\\\"label\\\":\\\"102\\\",\\\"value\\\":\\\"2\\\"},{\\\"label\\\":\\\"103\\\",\\\"value\\\":\\\"3\\\"},{\\\"label\\\":\\\"104\\\",\\\"value\\\":\\\"4\\\"}],\\\"apiUrl\\\":\\\"\\\",\\\"dictCode\\\":\\\"\\\",\\\"dictName\\\":\\\"\\\",\\\"multiple\\\":true}}},\\\"height\\\":45},\\\"16\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"直属领导\\\",\\\"style\\\":7},\\\"1\\\":{\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"JUser\\\",\\\"component\\\":\\\"JUser\\\",\\\"field\\\":\\\"leader\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"multiple\\\":false,\\\"apiUrl\\\":\\\"https://bootapi.jeecg.com/jmreport/test/getUserList\\\",\\\"dbFieldBind\\\":[{\\\"dbTable\\\":\\\"test_form_submit\\\",\\\"dbField\\\":\\\"leader\\\"}]},\\\"merge\\\":[0,2],\\\"height\\\":45,\\\"style\\\":7,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":7,\\\"text\\\":\\\"是否启用\\\"},\\\"5\\\":{\\\"style\\\":10,\\\"text\\\":\\\" \\\",\\\"merge\\\":[0,1],\\\"height\\\":45,\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"JSwitch\\\",\\\"component\\\":\\\"JSwitch\\\",\\\"field\\\":\\\"status\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"dbFieldBind\\\":[{\\\"dbTable\\\":\\\"test_form_submit\\\",\\\"dbField\\\":\\\"status\\\"}],\\\"label\\\":\\\"\\\",\\\"labelText\\\":\\\"\\\",\\\"switchOpen\\\":\\\"Y\\\",\\\"switchClose\\\":\\\"N\\\",\\\"h_align\\\":\\\"center\\\"}},\\\"6\\\":{}},\\\"height\\\":45},\\\"17\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"style\\\":7,\\\"text\\\":\\\"负责部门\\\"},\\\"1\\\":{\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"JSelectTree\\\",\\\"component\\\":\\\"JSelectTree\\\",\\\"field\\\":\\\"responsible\\\",\\\"value\\\":\\\"\\\",\\\"defaultValue\\\":\\\"\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"multiple\\\":true,\\\"apiUrl\\\":\\\"https://bootapi.jeecg.com/jmreport/test/getDepartmentList\\\"},\\\"style\\\":7,\\\"text\\\":\\\" \\\",\\\"merge\\\":[0,2],\\\"height\\\":45},\\\"4\\\":{\\\"style\\\":7,\\\"text\\\":\\\"上班时间\\\"},\\\"5\\\":{\\\"style\\\":7,\\\"text\\\":\\\" \\\",\\\"merge\\\":[0,1],\\\"height\\\":45,\\\"fillForm\\\":{\\\"componentFlag\\\":\\\"TimePicker\\\",\\\"component\\\":\\\"TimePicker\\\",\\\"field\\\":\\\"key_1724408224853_326455\\\",\\\"placeholder\\\":\\\"\\\",\\\"required\\\":false,\\\"requiredTip\\\":\\\"不能为空~\\\",\\\"label\\\":\\\"\\\",\\\"labelText\\\":\\\"\\\",\\\"isRangTime\\\":false,\\\"timeType\\\":\\\"time\\\"}}},\\\"height\\\":45},\\\"20\\\":{\\\"cells\\\":{\\\"6\\\":{}}},\\\"len\\\":201},\\\"rpbar\\\":{\\\"show\\\":true,\\\"pageSize\\\":\\\"\\\",\\\"btnList\\\":[]},\\\"fixedPrintHeadRows\\\":[],\\\"fixedPrintTailRows\\\":[],\\\"displayConfig\\\":{},\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"styles\\\":[{\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"size\\\":16}},{\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"valign\\\":\\\"middle\\\"},{\\\"align\\\":\\\"right\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}}],\\\"freezeLineColor\\\":\\\"rgb(185, 185, 185)\\\",\\\"merges\\\":[\\\"A1:G2\\\",\\\"G3:G6\\\",\\\"B7:D7\\\",\\\"F7:G7\\\",\\\"B8:D8\\\",\\\"F8:G8\\\",\\\"B9:D9\\\",\\\"F9:G9\\\",\\\"A10:G10\\\",\\\"A11:G11\\\",\\\"A12:G12\\\",\\\"A13:G13\\\",\\\"B14:G14\\\",\\\"B15:D15\\\",\\\"F15:G15\\\",\\\"B16:D16\\\",\\\"F16:G16\\\",\\\"B17:D17\\\",\\\"F17:G17\\\",\\\"B18:D18\\\",\\\"F18:G18\\\"]}', NULL, NULL, 'admin', '2024-08-29 17:18:29', 'admin', '2024-08-30 10:24:03', 0, NULL, NULL, 1, 2, NULL, NULL, NULL, '1', 9, 1, NULL);\nINSERT INTO `jimu_report` VALUES ('9dbadaee8720767efe3164a7d018c870', '45566', '发票打印', '', NULL, '984302991393210368', '{\\\"area\\\":{\\\"sri\\\":8,\\\"sci\\\":4,\\\"eri\\\":8,\\\"eci\\\":4,\\\"width\\\":100,\\\"height\\\":25},\\\"printElWidth\\\":794,\\\"excel_config_id\\\":\\\"9dbadaee8720767efe3164a7d018c870\\\",\\\"printElHeight\\\":500,\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"\\\",\\\"virtual\\\":\\\"RTA6TUIKs1pmgVOM\\\"},\\\"1\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"RTA6TUIKs1pmgVOM\\\"},\\\"2\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"RTA6TUIKs1pmgVOM\\\"},\\\"3\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"RTA6TUIKs1pmgVOM\\\"},\\\"4\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"RTA6TUIKs1pmgVOM\\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"RTA6TUIKs1pmgVOM\\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"RTA6TUIKs1pmgVOM\\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"RTA6TUIKs1pmgVOM\\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"RTA6TUIKs1pmgVOM\\\"}}},\\\"2\\\":{\\\"cells\\\":{},\\\"height\\\":11},\\\"3\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"\\\"},\\\"5\\\":{\\\"text\\\":\\\"\\\"}},\\\"height\\\":18},\\\"4\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"182123434\\\",\\\"style\\\":0},\\\"5\\\":{\\\"text\\\":\\\"12345678\\\"}},\\\"height\\\":15},\\\"5\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"\\\"}}},\\\"7\\\":{\\\"cells\\\":{}},\\\"8\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"餐饮\\\"},\\\"2\\\":{\\\"text\\\":\\\"        A11\\\"},\\\"3\\\":{\\\"text\\\":\\\"    333      3\\\"},\\\"4\\\":{\\\"text\\\":\\\"  3                   4\\\"},\\\"5\\\":{\\\"text\\\":\\\"          1\\\"},\\\"6\\\":{\\\"text\\\":\\\"3333\\\"}}},\\\"9\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"测试\\\"},\\\"2\\\":{\\\"text\\\":\\\"      mmm\\\"},\\\"3\\\":{\\\"text\\\":\\\"    33          5\\\"}}},\\\"10\\\":{\\\"cells\\\":{},\\\"height\\\":22},\\\"11\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"                          \\\"},\\\"3\\\":{\\\"text\\\":\\\"343434\\\"},\\\"6\\\":{\\\"text\\\":\\\"3434\\\"}},\\\"height\\\":45},\\\"12\\\":{\\\"cells\\\":{\\\"4\\\":{\\\"text\\\":\\\"           刮开中奖\\\"}},\\\"height\\\":12},\\\"13\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"\\\"},\\\"4\\\":{\\\"text\\\":\\\"      \\\"},\\\"5\\\":{\\\"text\\\":\\\"备注\\\"}},\\\"height\\\":31},\\\"14\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\" 张三\\\"},\\\"3\\\":{\\\"text\\\":\\\"完成\\\"},\\\"4\\\":{\\\"text\\\":\\\"           李思\\\"}},\\\"height\\\":41},\\\"len\\\":100},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":794,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":847,\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"font\\\":{\\\"size\\\":8}}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":93},\\\"1\\\":{\\\"width\\\":74},\\\"2\\\":{\\\"width\\\":80},\\\"len\\\":26},\\\"merges\\\":[],\\\"imgList\\\":[{\\\"row\\\":0,\\\"col\\\":0,\\\"width\\\":\\\"832\\\",\\\"height\\\":\\\"480\\\",\\\"src\\\":\\\"https://static.jeecg.com/designreport/images/套打_1609313052910.png\\\",\\\"isBackend\\\":true,\\\"commonBackend\\\":true,\\\"layer_id\\\":\\\"RTA6TUIKs1pmgVOM\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8]]}]}', '', 'https://static.jeecg.com/designreport/images/QQ截图20201207113651_1607312223499.png', 'jeecg', '2020-07-20 18:55:59', 'admin', '2021-02-03 13:38:49', 0, NULL, NULL, 0, 1126, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('a250846887abe01217aab173d3006489', '56663', '不动产打印', '', NULL, '984302991393210368', '{\\\"loopBlockList\\\":[],\\\"area\\\":false,\\\"excel_config_id\\\":\\\"a250846887abe01217aab173d3006489\\\",\\\"printConfig\\\":{\\\"paper\\\":\\\"A4\\\",\\\"width\\\":210,\\\"height\\\":297,\\\"definition\\\":1,\\\"isBackend\\\":true,\\\"marginX\\\":10,\\\"marginY\\\":10},\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"BJ9o6oelCr85EpT2\\\"},\\\"1\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"BJ9o6oelCr85EpT2\\\"},\\\"2\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"BJ9o6oelCr85EpT2\\\"},\\\"3\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"BJ9o6oelCr85EpT2\\\"},\\\"4\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"BJ9o6oelCr85EpT2\\\"},\\\"5\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"BJ9o6oelCr85EpT2\\\"},\\\"6\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"BJ9o6oelCr85EpT2\\\"},\\\"7\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"BJ9o6oelCr85EpT2\\\"},\\\"8\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"BJ9o6oelCr85EpT2\\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"BJ9o6oelCr85EpT2\\\"}},\\\"isDrag\\\":true,\\\"height\\\":45},\\\"1\\\":{\\\"cells\\\":{},\\\"height\\\":23},\\\"2\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":0},\\\"1\\\":{\\\"text\\\":\\\"           ${budong.yname}\\\",\\\"style\\\":21,\\\"merge\\\":[0,2]}},\\\"isDrag\\\":true,\\\"height\\\":34},\\\"3\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"            ${budong.chanquan}\\\",\\\"style\\\":0,\\\"merge\\\":[0,2]},\\\"5\\\":{\\\"text\\\":\\\"${budong.beizhu}\\\",\\\"merge\\\":[5,3]}},\\\"isDrag\\\":true,\\\"height\\\":39},\\\"4\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"           ${budong.zhuzhi}\\\",\\\"style\\\":39,\\\"merge\\\":[0,2]}},\\\"isDrag\\\":true,\\\"height\\\":33},\\\"5\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"           ${budong.danyuan}\\\",\\\"style\\\":0,\\\"merge\\\":[0,2]}},\\\"isDrag\\\":true,\\\"height\\\":53},\\\"6\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"            ${budong.type}\\\",\\\"style\\\":0,\\\"merge\\\":[0,2]}},\\\"isDrag\\\":true,\\\"height\\\":47},\\\"7\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"            ${budong.xtype}\\\",\\\"style\\\":0,\\\"merge\\\":[0,2]}},\\\"isDrag\\\":true,\\\"height\\\":38},\\\"8\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"             ${budong.suoyou}\\\",\\\"style\\\":0,\\\"merge\\\":[0,2]}},\\\"isDrag\\\":true,\\\"height\\\":31},\\\"9\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"              ${budong.mianji}\\\",\\\"style\\\":0,\\\"merge\\\":[0,2]}},\\\"isDrag\\\":true,\\\"height\\\":45},\\\"10\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"               ${budong.riqi}\\\",\\\"style\\\":0,\\\"merge\\\":[0,2]}},\\\"isDrag\\\":true,\\\"height\\\":26},\\\"11\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":0,\\\"merge\\\":[0,2]}},\\\"height\\\":35},\\\"12\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":0},\\\"2\\\":{\\\"text\\\":\\\"${budong.chanquan}\\\",\\\"style\\\":0,\\\"merge\\\":[4,1]}},\\\"isDrag\\\":true},\\\"13\\\":{\\\"cells\\\":{}},\\\"14\\\":{\\\"cells\\\":{}},\\\"15\\\":{\\\"cells\\\":{}},\\\"16\\\":{\\\"cells\\\":{},\\\"height\\\":5},\\\"17\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"\\\",\\\"style\\\":0}},\\\"isDrag\\\":true,\\\"height\\\":33},\\\"18\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"style\\\":0,\\\"text\\\":\\\"\\\"}}},\\\"len\\\":100,\\\"-1\\\":{\\\"cells\\\":{\\\"0\\\":{\\\"text\\\":\\\"#{budong.zhuzhi}\\\"},\\\"-1\\\":{\\\"text\\\":\\\"#{budong.suoyou}\\\"}},\\\"isDrag\\\":true}},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":794,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":1024,\\\"displayConfig\\\":{},\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"font\\\":{\\\"bold\\\":true}},{\\\"font\\\":{\\\"italic\\\":true}},{\\\"font\\\":{\\\"italic\\\":true,\\\"bold\\\":true}},{\\\"font\\\":{\\\"italic\\\":true,\\\"bold\\\":false}},{\\\"font\\\":{\\\"italic\\\":false,\\\"bold\\\":false}},{\\\"font\\\":{\\\"italic\\\":false,\\\"bold\\\":true}},{\\\"align\\\":\\\"left\\\"},{\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"right\\\"},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"top\\\"},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"font\\\":{\\\"bold\\\":false}},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"textwrap\\\":true},{\\\"font\\\":{\\\"bold\\\":true},\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"italic\\\":false,\\\"bold\\\":true},\\\"valign\\\":\\\"top\\\"},{\\\"valign\\\":\\\"top\\\"},{\\\"textwrap\\\":true,\\\"font\\\":{\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":8}},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":8},\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":8}},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"font\\\":{\\\"italic\\\":false,\\\"bold\\\":true},\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"italic\\\":false,\\\"bold\\\":true},\\\"valign\\\":\\\"middle\\\"},{\\\"valign\\\":\\\"middle\\\"},{\\\"font\\\":{\\\"italic\\\":true,\\\"bold\\\":true},\\\"valign\\\":\\\"middle\\\"},{\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"italic\\\":true}},{\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"italic\\\":false}},{\\\"font\\\":{\\\"italic\\\":false,\\\"bold\\\":false},\\\"valign\\\":\\\"middle\\\"},{\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":8}},{\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":8},\\\"valign\\\":\\\"middle\\\"},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":8}},{\\\"align\\\":\\\"right\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":8}},{\\\"font\\\":{\\\"italic\\\":false,\\\"bold\\\":true},\\\"valign\\\":\\\"middle\\\",\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"italic\\\":false,\\\"bold\\\":true},\\\"valign\\\":\\\"middle\\\",\\\"align\\\":\\\"left\\\"},{\\\"align\\\":\\\"right\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"right\\\",\\\"valign\\\":\\\"bottom\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":8}},{\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"middle\\\"}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":107},\\\"1\\\":{\\\"width\\\":54},\\\"2\\\":{\\\"width\\\":135},\\\"3\\\":{\\\"width\\\":180},\\\"6\\\":{\\\"width\\\":123},\\\"8\\\":{\\\"width\\\":25},\\\"len\\\":50},\\\"merges\\\":[\\\"B1:B2\\\",\\\"B12:D12\\\",\\\"B9:D9\\\",\\\"B7:D7\\\",\\\"B6:D6\\\",\\\"B5:D5\\\",\\\"B3:D3\\\",\\\"B11:D11\\\",\\\"B8:D8\\\",\\\"B10:D10\\\",\\\"C13:D17\\\",\\\"C1:C2\\\",\\\"B4:D4\\\",\\\"F4:I9\\\",\\\"D1:D2\\\"],\\\"imgList\\\":[{\\\"row\\\":0,\\\"col\\\":0,\\\"width\\\":\\\"950\\\",\\\"height\\\":\\\"683\\\",\\\"src\\\":\\\"https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/images/38_1610456500965_1617247643815.jpg\\\",\\\"isBackend\\\":true,\\\"commonBackend\\\":true,\\\"layer_id\\\":\\\"BJ9o6oelCr85EpT2\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9]]}]}', '', 'https://static.jeecg.com/designreport/images/24_1597233568822.png', 'jeecg', '2020-07-09 10:48:22', 'admin', '2021-04-01 03:27:28', 0, NULL, NULL, 1, 1416, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('a9f068972508920cd4aab831814f0c04', '23445', '逮捕证', '', NULL, '984302991393210368', '{\\\"loopBlockList\\\":[],\\\"area\\\":false,\\\"excel_config_id\\\":\\\"a9f068972508920cd4aab831814f0c04\\\",\\\"printConfig\\\":{\\\"paper\\\":\\\"A4\\\",\\\"width\\\":210,\\\"height\\\":297,\\\"definition\\\":1,\\\"isBackend\\\":false,\\\"marginX\\\":10,\\\"marginY\\\":10},\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"2\\\":{\\\"text\\\":\\\"\\\",\\\"merge\\\":[0,9],\\\"style\\\":324},\\\"12\\\":{}},\\\"isDrag\\\":true,\\\"height\\\":55},\\\"1\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":410,\\\"merge\\\":[0,13],\\\"text\\\":\\\"兰州市经济侦查大队\\\"},\\\"15\\\":{\\\"style\\\":324,\\\"text\\\":\\\" \\\"}},\\\"height\\\":128},\\\"2\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":411,\\\"merge\\\":[0,13],\\\"text\\\":\\\"逮捕令\\\"},\\\"15\\\":{\\\"style\\\":324,\\\"text\\\":\\\" \\\"}},\\\"height\\\":41},\\\"3\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":412,\\\"merge\\\":[0,12],\\\"text\\\":\\\"第123459663号\\\"},\\\"14\\\":{\\\"style\\\":413,\\\"text\\\":\\\" \\\"}},\\\"height\\\":60},\\\"4\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":414,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"text\\\":\\\"                                 根据《中华人民共和国刑事诉讼法》第七十八条之规定，\\\",\\\"style\\\":341,\\\"merge\\\":[0,11]},\\\"14\\\":{\\\"style\\\":413,\\\"text\\\":\\\" \\\"}},\\\"height\\\":43},\\\"5\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":414,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"style\\\":341,\\\"text\\\":\\\"经\\\",\\\"merge\\\":[0,1]},\\\"4\\\":{\\\"text\\\":\\\"${pdaibu.pname}\\\",\\\"style\\\":342,\\\"merge\\\":[0,9]},\\\"14\\\":{\\\"style\\\":413,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true,\\\"height\\\":47},\\\"6\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":414,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"style\\\":344,\\\"text\\\":\\\" \\\",\\\"merge\\\":[0,2]},\\\"5\\\":{\\\"merge\\\":[0,3],\\\"text\\\":\\\"批准，兹由我局对涉嫌\\\",\\\"style\\\":338},\\\"9\\\":{\\\"text\\\":\\\"${pdaibu.shiqing}\\\",\\\"style\\\":347,\\\"merge\\\":[0,4]},\\\"14\\\":{\\\"style\\\":413,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true,\\\"height\\\":49},\\\"7\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":414,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"style\\\":341,\\\"text\\\":\\\"的\\\"},\\\"3\\\":{\\\"text\\\":\\\"${pdaibu.fname}\\\",\\\"style\\\":345,\\\"merge\\\":[0,1]},\\\"5\\\":{\\\"text\\\":\\\"(性别\\\",\\\"style\\\":343},\\\"6\\\":{\\\"text\\\":\\\"${pdaibu.fsex}\\\",\\\"style\\\":347,\\\"merge\\\":[0,1]},\\\"8\\\":{\\\"style\\\":346,\\\"text\\\":\\\"出生日期\\\"},\\\"9\\\":{\\\"text\\\":\\\"${pdaibu.cdata}\\\",\\\"style\\\":345,\\\"merge\\\":[0,4]},\\\"14\\\":{\\\"style\\\":413,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true,\\\"height\\\":51},\\\"8\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":414,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"text\\\":\\\"${pdaibu.zhuzhi}\\\",\\\"style\\\":345,\\\"merge\\\":[0,7]},\\\"10\\\":{\\\"style\\\":341,\\\"text\\\":\\\"执行逮捕，送兰州\\\",\\\"merge\\\":[0,3]},\\\"14\\\":{\\\"style\\\":413,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true,\\\"height\\\":51},\\\"9\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":414,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"style\\\":341,\\\"merge\\\":[0,6],\\\"text\\\":\\\"市经济侦查大队羁押。\\\"},\\\"9\\\":{\\\"style\\\":341,\\\"text\\\":\\\" \\\"},\\\"10\\\":{\\\"style\\\":341,\\\"merge\\\":[5,1],\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"style\\\":413,\\\"text\\\":\\\" \\\"}},\\\"height\\\":57},\\\"10\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":414,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":338,\\\"virtual\\\":\\\"DId4FGTLnP3vfp4y\\\",\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":338,\\\"virtual\\\":\\\"DId4FGTLnP3vfp4y\\\",\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":338,\\\"virtual\\\":\\\"DId4FGTLnP3vfp4y\\\",\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"style\\\":413,\\\"text\\\":\\\" \\\"}},\\\"height\\\":61},\\\"11\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":414,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"style\\\":376,\\\"merge\\\":[0,2],\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"style\\\":413,\\\"text\\\":\\\" \\\"}},\\\"height\\\":83},\\\"12\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":414,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"merge\\\":[0,6],\\\"style\\\":338,\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"style\\\":413,\\\"text\\\":\\\" \\\"}},\\\"height\\\":14},\\\"13\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":414,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"style\\\":351,\\\"merge\\\":[0,5],\\\"text\\\":\\\" \\\"},\\\"8\\\":{\\\"style\\\":380,\\\"text\\\":\\\"公安局印\\\"},\\\"9\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"XefZfpEcdS3wI6Ae\\\"},\\\"10\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"XefZfpEcdS3wI6Ae\\\"},\\\"11\\\":{\\\"text\\\":\\\" \\\",\\\"virtual\\\":\\\"XefZfpEcdS3wI6Ae\\\"},\\\"14\\\":{\\\"style\\\":413,\\\"text\\\":\\\" \\\"}},\\\"height\\\":89},\\\"14\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":414,\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"style\\\":413,\\\"text\\\":\\\" \\\"}},\\\"height\\\":21},\\\"15\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":415,\\\"text\\\":\\\" \\\"},\\\"2\\\":{\\\"style\\\":416,\\\"text\\\":\\\" \\\"},\\\"3\\\":{\\\"style\\\":417,\\\"text\\\":\\\" \\\"},\\\"4\\\":{\\\"style\\\":417,\\\"text\\\":\\\" \\\"},\\\"5\\\":{\\\"style\\\":417,\\\"text\\\":\\\" \\\"},\\\"6\\\":{\\\"text\\\":\\\"${pdaibu.gdata}\\\",\\\"style\\\":421,\\\"merge\\\":[0,6]},\\\"13\\\":{\\\"style\\\":417,\\\"text\\\":\\\" \\\"},\\\"14\\\":{\\\"style\\\":419,\\\"text\\\":\\\" \\\"}},\\\"isDrag\\\":true,\\\"height\\\":168},\\\"len\\\":88,\\\"-1\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"#{daibu.fdata}\\\"},\\\"-1\\\":{\\\"text\\\":\\\"#{pdaibu.shiqing}\\\"}},\\\"isDrag\\\":true}},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":709,\\\"displayConfig\\\":{},\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"align\\\":\\\"left\\\"},{\\\"align\\\":\\\"left\\\",\\\"underline\\\":true},{\\\"underline\\\":true},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":true},{\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":16}},{\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":16}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"font\\\":{\\\"bold\\\":true}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false}},{\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false}},{\\\"font\\\":{\\\"bold\\\":false}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\",\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":12},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":8}},{\\\"font\\\":{\\\"size\\\":10}},{\\\"font\\\":{\\\"size\\\":10,\\\"bold\\\":true}},{\\\"font\\\":{\\\"size\\\":10,\\\"bold\\\":true},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18}},{\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16}},{\\\"font\\\":{\\\"size\\\":12},\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"size\\\":12},\\\"valign\\\":\\\"middle\\\"},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"dashed\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":true},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true}},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14,\\\"name\\\":\\\"Arial\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14,\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Source Sans Pro\\\"},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Source Sans Pro\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14,\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Comic Sans MS\\\"},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Comic Sans MS\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14,\\\"name\\\":\\\"Courier New\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#3f3f3f\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Courier New\\\"},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Courier New\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Arial\\\"},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Arial\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Helvetica\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Helvetica\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Helvetica\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Helvetica\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"Helvetica\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Helvetica\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Helvetica\\\"},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Helvetica\\\"},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Helvetica\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":10,\\\"name\\\":\\\"Lato\\\"},\\\"valign\\\":\\\"middle\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"right\\\"},{\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"left\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"left\\\",\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"top\\\"},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"top\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"left\\\",\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"middle\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"left\\\",\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"right\\\",\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"align\\\":\\\"right\\\",\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\",\\\"bold\\\":true},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"right\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\",\\\"bold\\\":true},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"align\\\":\\\"right\\\",\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"center\\\",\\\"underline\\\":false,\\\"font\\\":{\\\"size\\\":12,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"right\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":12}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":12},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"top\\\"},{\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":14}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":16,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"Lato\\\"},\\\"align\\\":\\\"right\\\",\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":14},\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":14},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"left\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":14},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":14}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":14},\\\"color\\\":\\\"#000100\\\"},{\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"right\\\"},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"top\\\",\\\"font\\\":{\\\"size\\\":14}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":16,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"Lato\\\"},\\\"align\\\":\\\"right\\\",\\\"color\\\":\\\"#000100\\\",\\\"valign\\\":\\\"bottom\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":14},\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\"},{\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":14}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"name\\\":\\\"Lato\\\",\\\"size\\\":14},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":14},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"right\\\",\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"right\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":14},\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":14}},{\\\"font\\\":{\\\"size\\\":14},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":14,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"right\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":14},\\\"align\\\":\\\"right\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12}},{\\\"font\\\":{\\\"size\\\":14},\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":12},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"left\\\",\\\"valign\\\":\\\"middle\\\",\\\"font\\\":{\\\"size\\\":14}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":24}},{\\\"font\\\":{\\\"size\\\":24}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":22}},{\\\"font\\\":{\\\"size\\\":22}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":18}},{\\\"font\\\":{\\\"size\\\":18}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true}},{\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true},\\\"align\\\":\\\"center\\\"},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":false},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":false},\\\"align\\\":\\\"center\\\"},{\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":true}},{\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"]},\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":false},\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":false},\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\"},{\\\"valign\\\":\\\"bottom\\\"},{\\\"valign\\\":\\\"bottom\\\",\\\"align\\\":\\\"right\\\"},{\\\"valign\\\":\\\"bottom\\\",\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":14}},{\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":false},\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14},\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"valign\\\":\\\"bottom\\\",\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":14},\\\"border\\\":{\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"left\\\",\\\"font\\\":{\\\"size\\\":14,\\\"bold\\\":false,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":14},\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":14},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":false},\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"valign\\\":\\\"bottom\\\",\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":14},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":14},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"right\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":false},\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"border\\\":{\\\"top\\\":[\\\"thick\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"valign\\\":\\\"bottom\\\",\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":14},\\\"border\\\":{\\\"left\\\":[\\\"thick\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":false},\\\"align\\\":\\\"center\\\",\\\"valign\\\":\\\"bottom\\\",\\\"border\\\":{\\\"top\\\":[\\\"medium\\\",\\\"#000\\\"],\\\"left\\\":[\\\"medium\\\",\\\"#000\\\"],\\\"right\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":true,\\\"size\\\":14},\\\"border\\\":{\\\"left\\\":[\\\"medium\\\",\\\"#000\\\"],\\\"right\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"valign\\\":\\\"bottom\\\",\\\"align\\\":\\\"right\\\",\\\"font\\\":{\\\"size\\\":14},\\\"border\\\":{\\\"left\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"right\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"left\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"medium\\\",\\\"#000\\\"],\\\"left\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12,\\\"name\\\":\\\"Lato\\\"},\\\"color\\\":\\\"#000100\\\",\\\"align\\\":\\\"right\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"align\\\":\\\"center\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"medium\\\",\\\"#000\\\"],\\\"right\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"bold\\\":false,\\\"size\\\":14},\\\"border\\\":{\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"align\\\":\\\"right\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"medium\\\",\\\"#000\\\"]}},{\\\"font\\\":{\\\"size\\\":12},\\\"align\\\":\\\"right\\\"}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":18},\\\"1\\\":{\\\"width\\\":21},\\\"2\\\":{\\\"width\\\":27},\\\"3\\\":{\\\"width\\\":6},\\\"4\\\":{\\\"width\\\":87},\\\"5\\\":{\\\"width\\\":51},\\\"6\\\":{\\\"width\\\":51},\\\"7\\\":{\\\"width\\\":1},\\\"8\\\":{\\\"width\\\":86},\\\"9\\\":{\\\"width\\\":163},\\\"10\\\":{\\\"width\\\":1},\\\"11\\\":{\\\"width\\\":60},\\\"12\\\":{\\\"width\\\":45},\\\"13\\\":{\\\"width\\\":49},\\\"14\\\":{\\\"width\\\":23},\\\"15\\\":{\\\"width\\\":20},\\\"len\\\":50},\\\"merges\\\":[\\\"D8:E8\\\",\\\"C6:D6\\\",\\\"C10:I10\\\",\\\"G8:H8\\\",\\\"C9:J9\\\",\\\"C1:L1\\\",\\\"K10:L15\\\",\\\"C13:I13\\\",\\\"C14:H14\\\",\\\"F7:I7\\\",\\\"G12:I12\\\",\\\"G16:M16\\\",\\\"B4:N4\\\",\\\"C5:N5\\\",\\\"E6:N6\\\",\\\"J7:N7\\\",\\\"C7:E7\\\",\\\"K9:N9\\\",\\\"B2:O2\\\",\\\"B3:O3\\\",\\\"J8:N8\\\"],\\\"imgList\\\":[{\\\"row\\\":13,\\\"col\\\":9,\\\"width\\\":\\\"168\\\",\\\"height\\\":\\\"158\\\",\\\"src\\\":\\\"https://static.jeecg.com/designreport/images/QQ截图20210105214919_1610075317075.png\\\",\\\"layer_id\\\":\\\"XefZfpEcdS3wI6Ae\\\",\\\"offsetX\\\":0,\\\"offsetY\\\":0,\\\"virtualCellRange\\\":[[13,9],[13,10],[13,11]]}]}', '', 'https://static.jeecg.com/designreport/images/逮捕令_1607070625878.png', 'jeecg', '2020-07-10 13:38:40', 'admin', '2021-04-05 18:47:36', 0, NULL, NULL, 1, 2513, NULL, NULL, NULL, NULL, 0, NULL, NULL);\nINSERT INTO `jimu_report` VALUES ('f6ee801e8bdc28ba9d63f95dc65ccd79', '4556633', '采购单', '', NULL, '984302991393210368', '{\\\"loopBlockList\\\":[],\\\"area\\\":false,\\\"excel_config_id\\\":\\\"f6ee801e8bdc28ba9d63f95dc65ccd79\\\",\\\"printConfig\\\":{\\\"paper\\\":\\\"A4\\\",\\\"width\\\":210,\\\"height\\\":297,\\\"definition\\\":1,\\\"isBackend\\\":false,\\\"marginX\\\":10,\\\"marginY\\\":10},\\\"rows\\\":{\\\"0\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"采购单\\\",\\\"style\\\":21,\\\"merge\\\":[0,6]}},\\\"height\\\":89},\\\"1\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"产品名称\\\",\\\"style\\\":23},\\\"2\\\":{\\\"text\\\":\\\"产品数量\\\",\\\"style\\\":23},\\\"3\\\":{\\\"text\\\":\\\"单价\\\",\\\"style\\\":23},\\\"4\\\":{\\\"text\\\":\\\"库存量\\\",\\\"style\\\":23},\\\"5\\\":{\\\"text\\\":\\\"库存总值\\\",\\\"style\\\":23},\\\"6\\\":{\\\"text\\\":\\\"订购量\\\",\\\"style\\\":23},\\\"7\\\":{\\\"text\\\":\\\"二次订购量\\\",\\\"style\\\":23}},\\\"height\\\":45},\\\"2\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"style\\\":24,\\\"text\\\":\\\"#{caigou.cname}\\\"},\\\"2\\\":{\\\"style\\\":24,\\\"text\\\":\\\"#{caigou.cnum}\\\"},\\\"3\\\":{\\\"style\\\":24,\\\"text\\\":\\\"#{caigou.cprice}\\\"},\\\"4\\\":{\\\"style\\\":24,\\\"text\\\":\\\"#{caigou.ctotal}\\\"},\\\"5\\\":{\\\"style\\\":24,\\\"text\\\":\\\"#{caigou.tp}\\\"},\\\"6\\\":{\\\"style\\\":24,\\\"text\\\":\\\"#{caigou.dtotal}\\\"},\\\"7\\\":{\\\"style\\\":24,\\\"text\\\":\\\"#{caigou.ztotal}\\\"}},\\\"height\\\":26},\\\"5\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"\\\"}},\\\"isDrag\\\":true},\\\"6\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"\\\"}},\\\"isDrag\\\":true},\\\"7\\\":{\\\"cells\\\":{\\\"1\\\":{\\\"text\\\":\\\"\\\"},\\\"2\\\":{\\\"text\\\":\\\"\\\"}},\\\"isDrag\\\":true},\\\"len\\\":100},\\\"dbexps\\\":[],\\\"toolPrintSizeObj\\\":{\\\"printType\\\":\\\"A4\\\",\\\"widthPx\\\":718,\\\"heightPx\\\":1047},\\\"dicts\\\":[],\\\"freeze\\\":\\\"A1\\\",\\\"dataRectWidth\\\":682,\\\"displayConfig\\\":{},\\\"background\\\":false,\\\"name\\\":\\\"sheet1\\\",\\\"autofilter\\\":{},\\\"styles\\\":[{\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\"},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#000\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#000\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#01b0f1\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#01b0f1\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#01b0f1\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#01b0f1\\\"]}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#01b0f1\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#01b0f1\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#01b0f1\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#01b0f1\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#01b0f1\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#01b0f1\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#01b0f1\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#01b0f1\\\"]},\\\"bgcolor\\\":\\\"#01b0f1\\\"},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"bgcolor\\\":\\\"#01b0f1\\\"},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":18,\\\"bold\\\":true}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"align\\\":\\\"center\\\"},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"bgcolor\\\":\\\"#9cc2e6\\\"},{\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true,\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#5b9cd6\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#9cc2e6\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#000100\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"font\\\":{\\\"name\\\":\\\"宋体\\\"}},{\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"size\\\":16,\\\"bold\\\":true,\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"align\\\":\\\"center\\\",\\\"color\\\":\\\"#ffffff\\\",\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"bgcolor\\\":\\\"#5b9cd6\\\",\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}},{\\\"border\\\":{\\\"bottom\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"top\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"left\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"],\\\"right\\\":[\\\"thin\\\",\\\"#bfbfbf\\\"]},\\\"align\\\":\\\"center\\\",\\\"font\\\":{\\\"name\\\":\\\"Microsoft YaHei\\\"}}],\\\"validations\\\":[],\\\"cols\\\":{\\\"0\\\":{\\\"width\\\":43},\\\"1\\\":{\\\"width\\\":114},\\\"2\\\":{\\\"width\\\":109},\\\"3\\\":{\\\"width\\\":78},\\\"4\\\":{\\\"width\\\":77},\\\"5\\\":{\\\"width\\\":84},\\\"6\\\":{\\\"width\\\":82},\\\"7\\\":{\\\"width\\\":95},\\\"len\\\":50},\\\"merges\\\":[\\\"B1:H1\\\"]}', '', 'https://static.jeecg.com/designreport/images/caigou_1607310279439.png', 'jeecg', '2020-07-28 16:54:44', 'admin', '2021-04-01 03:09:41', 0, NULL, NULL, 1, 1252, NULL, NULL, NULL, NULL, 0, NULL, NULL);\n\n-- ----------------------------\n-- Table structure for jimu_report_category\n-- ----------------------------\nDROP TABLE IF EXISTS `jimu_report_category`;\nCREATE TABLE `jimu_report_category`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',\n  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分类名称',\n  `parent_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '父级id',\n  `iz_leaf` int(1) NULL DEFAULT NULL COMMENT '是否为叶子节点(0 否 1是)',\n  `source_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '来源类型( report 积木报表 screen 大屏  drag 仪表盘)',\n  `del_flag` int(1) NULL DEFAULT NULL COMMENT '删除标识(0 正常 1 已删除)',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',\n  `tenant_id` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '租户id',\n  `sort_no` int(11) NULL DEFAULT NULL COMMENT '排序',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '分类' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of jimu_report_category\n-- ----------------------------\nINSERT INTO `jimu_report_category` VALUES ('984272091947253760', '数据报表', '0', 1, 'report', 0, 'admin', '2024-08-16 11:52:44', NULL, NULL, '1000', 0);\nINSERT INTO `jimu_report_category` VALUES ('984302961118724096', '图形报表', '0', 1, 'report', 0, 'admin', '2024-08-16 13:55:24', NULL, NULL, '1000', 0);\nINSERT INTO `jimu_report_category` VALUES ('984302991393210368', '打印设计', '0', 1, 'report', 0, 'admin', '2024-08-16 13:55:31', NULL, NULL, '1000', 0);\nINSERT INTO `jimu_report_category` VALUES ('988299668956545024', '仪表盘设计', '0', 1, 'drag', 0, '15931993294', '2024-08-27 00:00:00', '15931993294', '2024-08-28 00:00:00', NULL, 0);\nINSERT INTO `jimu_report_category` VALUES ('988299695309357056', '门户设计', '0', 1, 'drag', 0, '15931993294', '2024-08-27 00:00:00', '15931993294', '2024-08-27 00:00:00', NULL, 0);\n\n-- ----------------------------\n-- Table structure for jimu_report_data_source\n-- ----------------------------\nDROP TABLE IF EXISTS `jimu_report_data_source`;\nCREATE TABLE `jimu_report_data_source`  (\n  `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据源名称',\n  `report_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '报表_id',\n  `code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码',\n  `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',\n  `db_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据库类型',\n  `db_driver` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '驱动类',\n  `db_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据源地址',\n  `db_username` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名',\n  `db_password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码',\n  `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `connect_times` int(11) NULL DEFAULT 0 COMMENT '连接失败次数',\n  `tenant_id` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '多租户标识',\n  `type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '类型(report:报表;drag:仪表盘)',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_jmdatasource_report_id`(`report_id`) USING BTREE,\n  INDEX `idx_jmdatasource_code`(`code`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of jimu_report_data_source\n-- ----------------------------\nINSERT INTO `jimu_report_data_source` VALUES ('1324261983692902402', 'jeewx', '1324261770294071296', '', NULL, 'MYSQL', 'com.mysql.jdbc.Driver', 'jdbc:mysql://127.0.0.1:3306/jeewx-boot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8', 'root', 'root', 'jeecg', '2020-11-05 16:07:15', NULL, '2020-11-05 16:07:15', 0, NULL, 'report');\nINSERT INTO `jimu_report_data_source` VALUES ('26d21fe4f27920d2f56abc8d90a8e527', 'oracle', '1308645288868712448', '', NULL, 'ORACLE', 'oracle.jdbc.OracleDriver', 'jdbc:oracle:thin:@192.168.1.199:1521:helowin', 'jeecgbootbpm', 'jeecg196283', 'admin', '2021-01-05 19:26:24', NULL, '2021-01-05 19:26:24', 1, NULL, 'report');\nINSERT INTO `jimu_report_data_source` VALUES ('707437208002265088', 'MySQL5.7', NULL, NULL, NULL, 'MYSQL5.7', 'com.mysql.cj.jdbc.Driver', 'jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai', 'root', '@JimuReportSMy3f94QGFM=', 'admin', '2022-07-14 13:49:44', 'admin', '2025-06-05 15:51:54', 0, NULL, 'drag');\nINSERT INTO `jimu_report_data_source` VALUES ('8f90daf47d15d35ca6cf420748b8b9ba', 'localhost', '1316944968992034816', '', NULL, 'MYSQL5.7', 'com.mysql.cj.jdbc.Driver', 'jdbc:mysql://127.0.0.1:3306/jeecg-boot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8', 'root', 'root', 'admin', '2021-01-13 14:34:00', NULL, '2021-01-13 14:34:00', 0, NULL, 'report');\n\n-- ----------------------------\n-- Table structure for jimu_report_db\n-- ----------------------------\nDROP TABLE IF EXISTS `jimu_report_db`;\nCREATE TABLE `jimu_report_db`  (\n  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'id',\n  `jimu_report_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '主键字段',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `db_code` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据集编码',\n  `db_ch_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据集名字',\n  `db_type` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据源类型',\n  `db_table_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据库表名',\n  `db_dyn_sql` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '动态查询SQL',\n  `db_key` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据源KEY',\n  `tb_db_key` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '填报数据源',\n  `tb_db_table_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '填报数据表',\n  `java_type` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'java类数据集  类型（spring:springkey,class:java类名）',\n  `java_value` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'java类数据源  数值（bean key/java类名）',\n  `api_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求地址',\n  `api_method` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求方法0-get,1-post',\n  `is_list` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '是否是列表0否1是 默认0',\n  `is_page` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否作为分页,0:不分页，1:分页',\n  `db_source` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据源',\n  `db_source_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据库类型 MYSQL ORACLE SQLSERVER',\n  `json_data` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'json数据，直接解析json内容',\n  `api_convert` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'api转换器',\n  `iz_shared_source` int(1) NULL DEFAULT NULL COMMENT '是否为共享数据源(0 否 1 是)',\n  `jimu_shared_source_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '指向共享数据集的id',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_jmreportdb_db_key`(`db_key`) USING BTREE,\n  INDEX `idx_jimu_report_id`(`jimu_report_id`) USING BTREE,\n  INDEX `idx_db_source_id`(`db_source`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of jimu_report_db\n-- ----------------------------\nINSERT INTO `jimu_report_db` VALUES ('1036890631451017216', '1036890552178671616', 'admin', NULL, '2025-01-08 16:40:01', '2025-01-08 16:40:01', 'aaa', 'aa', '0', NULL, 'select * from sys_log', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', '', 'mysql', '', '', 0, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1080630642394300416', '1080630641874206720', 'admin', NULL, '2024-01-17 14:19:41', '2024-01-17 14:19:41', 'aa', 'aa', '0', NULL, 'select * from rep_demo_order_main', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', '8f90daf47d15d35ca6cf420748b8b9ba', 'mysql', '', NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1080630642507546624', '1080630641874206720', 'admin', NULL, '2024-01-17 14:21:57', '2024-01-17 14:21:57', 'bb', 'bb', '0', NULL, 'select * from rep_demo_order_product where order_fk_id = \\'${orderId}\\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '0', '8f90daf47d15d35ca6cf420748b8b9ba', 'mysql', '', '', NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1110348824457543680', '1110348597759606784', 'admin', 'admin', '2025-07-30 10:11:43', '2025-07-30 10:11:43', 'syslog', '系统日志', '0', NULL, 'SELECT DATE(create_time) AS visit_date, COUNT(*) AS visit_count\\nFROM sys_log\\nGROUP BY DATE(create_time)\\nORDER BY visit_date;', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', '8f90daf47d15d35ca6cf420748b8b9ba', 'mysql', '', '', 0, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1272834687525482497', '53c82a76f837d5661dceec7d93afafec', 'admin', NULL, '2021-01-04 20:42:17', '2021-01-04 20:42:17', 'jianpiao', 'jianpiao', '0', NULL, 'select * from rep_demo_jianpiao where s_id=\\'${id}\\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', NULL, 'MYSQL', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1283730831482937345', '6059e405dd9c66a6d38e00841d2e40cc', 'admin', NULL, '2020-12-04 16:53:38', '2020-12-04 16:53:38', 'yaopin', 'yaopin', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/baobiao/chufangjian', '0', '0', '0', NULL, 'MYSQL', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1283957016150249473', '6059e405dd9c66a6d38e00841d2e40cc', NULL, NULL, '2020-07-17 10:49:42', NULL, 'yonghu', 'yonghu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/baobiao/yonghu', '0', '0', NULL, NULL, 'MYSQL', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1284070508744257537', 'a250846887abe01217aab173d3006489', NULL, NULL, '2020-07-17 15:33:53', '2020-07-20 17:50:49', 'budong', 'budong', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/baobiao/budongchan', '0', '0', NULL, NULL, 'MYSQL', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1285157606524002305', 'a9f068972508920cd4aab831814f0c04', 'admin', 'admin', '2021-04-01 02:44:48', '2021-04-01 02:44:48', 'pdaibu', 'pdaibu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/baobiao/daibu', '0', '0', '0', '', 'MYSQL', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1285164420728692737', '7905022412733a0c68dc7b4ef8947489', NULL, NULL, '2020-07-20 18:47:30', NULL, 'jieshaoxin', 'jieshaoxin', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/baobiao/jieshaoxin', '0', '0', NULL, NULL, 'MYSQL', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1285178919099637762', '6d6bdcb5e820c301ea32789e3ae43c44', NULL, NULL, '2020-07-20 19:45:06', NULL, 'qiangxiu', 'qiangxiu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/baobiao/qiangxiu', '0', '0', NULL, NULL, 'MYSQL', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1288038655293661186', 'f6ee801e8bdc28ba9d63f95dc65ccd79', 'admin', 'admin', '2021-04-01 03:09:40', '2021-04-01 03:09:40', 'caigou', 'caigou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/baobiao/caigou?pageNo=\\'${pageNo}\\'&pageSize=\\'${pageSize}\\'', '0', '1', '1', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1289140698221678593', '519c1c6f4d1f584ae8fa5b43b45acdc7', 'admin', 'admin', '2021-04-01 03:09:23', '2021-04-01 03:09:23', 'xiaoshou', 'xiaoshou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/baobiao/xiaoshou?pageNo=\\'${pageNo}\\'&pageSize=\\'${pageSize}\\'', '0', '1', '1', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1290104038414721025', '53c82a76f837d5661dceec7d93afafec', 'admin', NULL, '2021-01-04 20:47:07', '2021-01-04 20:47:07', 'gongsi', 'gongsi', '0', NULL, 'select * from rep_demo_gongsi where id=\\'${id}\\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '0', '0', '', 'MYSQL', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1316987047604514817', '1314846205892759552', 'admin', NULL, '2021-01-08 10:36:58', '2021-01-08 10:36:58', 'yuangongjiben', 'yuangongjiben', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/yuangongjiben', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1316997232402231298', '1316944968992034816', 'admin', NULL, '2021-01-13 14:34:06', '2021-01-13 14:34:06', 'employee', 'employee', '0', NULL, 'select * from rep_demo_employee  where id=\\'${id}\\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '0', '', '', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1317006713165049858', '1314846205892759552', 'admin', NULL, '2021-01-11 14:38:14', '2021-01-11 14:38:14', 'xueli', 'xueli', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/xueli', '0', '1', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1317007979484147714', '1314846205892759552', 'admin', NULL, '2021-01-08 10:40:31', '2021-01-08 10:40:31', 'uu', 'uu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/gongzuojingli', '0', '1', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1317009166140829698', '1314846205892759552', 'admin', NULL, '2020-10-16 15:47:09', '2021-01-05 15:33:58', 'zhengshu', 'zhengshu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/zhengshu', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1317013474634756097', '1314846205892759552', 'admin', NULL, '2020-10-16 16:04:16', '2021-01-05 15:33:58', 'jtcy', 'jtcy', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/jtcy', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1317015169494282241', '1314846205892759552', 'admin', NULL, '2020-10-16 16:11:00', '2021-01-05 15:33:58', 'jiangli', 'jiangli', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/jiangli', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1331511745851731969', '1331503965770223616', 'admin', NULL, '2020-11-25 16:15:13', '2020-11-25 16:15:13', 'chengjiao', 'chengjiao', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/chengjiao', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1331514838211407873', '1331503965770223616', 'admin', NULL, '2020-11-25 16:27:30', '2020-11-25 16:27:30', 'cjpaihang', 'cjpaihang', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/cjpaihang', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1331514935028527106', '1331503965770223616', 'admin', NULL, '2020-11-25 16:27:54', '2020-11-25 16:27:54', 'cjjine', 'cjjine', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/cjjine', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1331872643531526146', '1331503965770223616', 'admin', NULL, '2020-11-26 16:09:18', '2020-11-26 16:09:18', 'chengjiao1', 'chengjiao1', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/chengjiao1', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1331878107552010242', '1331503965770223616', 'admin', NULL, '2020-11-26 16:31:01', '2020-11-26 16:31:01', 'zhuangxiu', 'zhuangxiu', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/zhuangxiu', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1331916030221602818', '1331503965770223616', 'admin', NULL, '2020-11-26 19:01:42', '2020-11-26 19:01:42', 'btchanquan', 'btchanquan', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/btchanquan', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1331919172472524801', '1331503965770223616', 'admin', NULL, '2020-11-26 19:14:11', '2020-11-26 19:14:11', 'huxingxiaoshou', 'huxingxiaoshou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/huxingxiaoshou', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1331922734933987329', '1331503965770223616', 'admin', NULL, '2020-11-26 19:28:21', '2020-11-26 19:28:21', 'fangyuan', 'fangyuan', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/fangyuan', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1331926127597441025', '1331503965770223616', 'admin', NULL, '2020-11-26 19:41:49', '2020-11-26 19:41:49', 'qingkuang', 'qingkuang', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/qingkuang', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1334390762455965697', '1334378897302753280', 'admin', NULL, '2021-01-06 11:43:35', '2021-01-06 11:43:35', 'quyuxiaoshou', 'quyuxiaoshou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/quyuxiaoshou', '0', '1', '1', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1334440263732436994', '1334420681185566722', 'admin', NULL, '2021-01-04 21:28:19', '2021-01-04 21:28:19', 'laiyuan', 'laiyuan', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/laiyuan', '0', '1', '1', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1334465135435063298', '1334457419857793024', 'admin', NULL, '2021-01-04 21:29:28', '2021-01-04 21:29:28', 'xiaoshou', 'xiaoshou', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/xiaoshou', '0', '1', '1', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1334708015269490689', '1334696790477377536', 'admin', NULL, '2021-01-04 21:30:29', '2021-01-04 21:30:29', 'shouru', 'shouru', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/shouru', '0', '1', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1334763434197200897', '1334757703079301120', 'admin', NULL, '2020-12-04 15:40:31', '2020-12-04 15:40:31', 'chejian', 'chejian', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/chejian', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('1338756341933543425', '1338744112815411200', 'admin', NULL, '2021-02-02 19:20:56', '2021-02-02 19:20:56', 'jdcx', 'jdcx', '0', NULL, 'select * from rep_demo_dxtj', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '0', '', 'MYSQL', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('537477711022567424', '537446834339098624', 'admin', 'admin', '2021-04-01 05:54:42', '2021-04-01 05:54:42', 'yy', 'yy', '0', NULL, 'select * from rep_demo_dxtj', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', '', 'MYSQL', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('537478337278291968', '537446834339098624', 'admin', 'admin', '2021-04-01 05:54:37', '2021-04-01 05:54:37', 'tt', 'tt', '0', NULL, 'select *  from SYS_DATA_LOG', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '0', '26d21fe4f27920d2f56abc8d90a8e527', 'ORACLE', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('537478706314129408', '537446834339098624', 'admin', 'admin', '2021-04-01 05:56:44', '2021-04-01 05:56:44', 'pp', 'pp', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/baobiao/caigou', '0', '1', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('6011955e58d89040fca52e7f962d0bf4', '961455b47c0b86dc961e90b5893bff05', 'admin', NULL, '2021-01-04 20:47:07', '2021-01-04 20:47:07', 'gongsi', 'gongsi', '0', NULL, 'select * from rep_demo_gongsi where id=\\'${id}\\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '0', '0', '', 'MYSQL', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('629609c4d540cb4675e9064af8955296', '7c02c224a2db56d0350069650033f702', 'admin', NULL, '2021-02-02 19:33:09', '2021-02-02 19:33:09', 'hecha', 'hecha', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/hecha', '0', '1', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('654609e4247a0469e0b2befbc69b00f9', '1cd9d574d0c42f3915046dc61d9f33bd', 'admin', NULL, '2020-12-17 16:42:21', '2020-12-17 19:50:14', 'xiaoshoue', '销售额', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/xiaoshoue', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('7911bd189c2d53e182693bd599a315a2', '1cd9d574d0c42f3915046dc61d9f33bd', 'admin', NULL, '2020-12-17 16:59:12', '2020-12-17 19:50:14', 'chengshi', '城市', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/chengshi', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('7b20679054449c554cde856ef24126ab', '1347454742040809472', 'admin', NULL, '2021-01-08 16:24:16', '2021-01-08 16:24:16', 'tmp_report_data_1', '年度佣金收入', '0', NULL, 'select monty,main_income,total,his_lowest,his_average,his_highest from tmp_report_data_1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '0', '', 'MYSQL', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('907482846256762880', '907480464532770816', 'admin', NULL, '2024-01-17 14:19:41', '2024-01-17 14:19:41', 'aa', 'aa', '0', NULL, 'select * from rep_demo_order_main', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', '8f90daf47d15d35ca6cf420748b8b9ba', 'mysql', '', NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('907483416753410048', '907480464532770816', 'admin', NULL, '2024-01-17 14:21:57', '2024-01-17 14:21:57', 'bb', 'bb', '0', NULL, 'select * from rep_demo_order_product where order_fk_id = \\'${orderId}\\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '0', '8f90daf47d15d35ca6cf420748b8b9ba', 'mysql', '', '', NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('919370187038609408', '919370186342354944', 'admin', 'admin', '2024-01-04 17:46:20', '2024-01-04 17:46:20', 'test_heng_sum', 'test_heng_sum', '3', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '', '0', '1', '1', '', NULL, '{\\n    \\\"data\\\": [\\n        {\\\"region\\\":\\\"华东\\\",\\\"province\\\":\\\"上海市\\\",\\\"year\\\":\\\"2022\\\",\\\"quarter\\\":\\\"1\\\",\\\"month\\\":\\\"1月\\\",\\\"sales\\\":\\\"2000\\\",\\\"gift\\\":\\\"1000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华东\\\",\\\"province\\\":\\\"上海市\\\",\\\"year\\\":\\\"2022\\\",\\\"quarter\\\":\\\"1\\\",\\\"month\\\":\\\"2月\\\",\\\"sales\\\":\\\"2000\\\",\\\"gift\\\":\\\"1000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华东\\\",\\\"province\\\":\\\"上海市\\\",\\\"year\\\":\\\"2022\\\",\\\"quarter\\\":\\\"1\\\",\\\"month\\\":\\\"3月\\\",\\\"sales\\\":\\\"2000\\\",\\\"gift\\\":\\\"1000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华东\\\",\\\"province\\\":\\\"上海市\\\",\\\"year\\\":\\\"2022\\\",\\\"quarter\\\":\\\"2\\\",\\\"month\\\":\\\"1月\\\",\\\"sales\\\":\\\"3000\\\",\\\"gift\\\":\\\"2000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华东\\\",\\\"province\\\":\\\"上海市\\\",\\\"year\\\":\\\"2022\\\",\\\"quarter\\\":\\\"2\\\",\\\"month\\\":\\\"2月\\\",\\\"sales\\\":\\\"3000\\\",\\\"gift\\\":\\\"2000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华东\\\",\\\"province\\\":\\\"上海市\\\",\\\"year\\\":\\\"2022\\\",\\\"quarter\\\":\\\"2\\\",\\\"month\\\":\\\"3月\\\",\\\"sales\\\":\\\"3000\\\",\\\"gift\\\":\\\"2000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华西\\\",\\\"province\\\":\\\"太原市\\\",\\\"year\\\":\\\"2022\\\",\\\"quarter\\\":\\\"1\\\",\\\"month\\\":\\\"1月\\\",\\\"sales\\\":\\\"2000\\\",\\\"gift\\\":\\\"1000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华西\\\",\\\"province\\\":\\\"太原市\\\",\\\"year\\\":\\\"2022\\\",\\\"quarter\\\":\\\"1\\\",\\\"month\\\":\\\"2月\\\",\\\"sales\\\":\\\"2000\\\",\\\"gift\\\":\\\"1000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华西\\\",\\\"province\\\":\\\"太原市\\\",\\\"year\\\":\\\"2022\\\",\\\"quarter\\\":\\\"1\\\",\\\"month\\\":\\\"3月\\\",\\\"sales\\\":\\\"2000\\\",\\\"gift\\\":\\\"1000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华西\\\",\\\"province\\\":\\\"太原市\\\",\\\"year\\\":\\\"2022\\\",\\\"quarter\\\":\\\"2\\\",\\\"month\\\":\\\"1月\\\",\\\"sales\\\":\\\"3000\\\",\\\"gift\\\":\\\"2000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华西\\\",\\\"province\\\":\\\"太原市\\\",\\\"year\\\":\\\"2022\\\",\\\"quarter\\\":\\\"2\\\",\\\"month\\\":\\\"2月\\\",\\\"sales\\\":\\\"3000\\\",\\\"gift\\\":\\\"2000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华西\\\",\\\"province\\\":\\\"太原市\\\",\\\"year\\\":\\\"2022\\\",\\\"quarter\\\":\\\"2\\\",\\\"month\\\":\\\"3月\\\",\\\"sales\\\":\\\"3000\\\",\\\"gift\\\":\\\"2000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华东\\\",\\\"province\\\":\\\"上海市\\\",\\\"year\\\":\\\"2023\\\",\\\"quarter\\\":\\\"1\\\",\\\"month\\\":\\\"1月\\\",\\\"sales\\\":\\\"2000\\\",\\\"gift\\\":\\\"1000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华东\\\",\\\"province\\\":\\\"上海市\\\",\\\"year\\\":\\\"2023\\\",\\\"quarter\\\":\\\"1\\\",\\\"month\\\":\\\"2月\\\",\\\"sales\\\":\\\"2000\\\",\\\"gift\\\":\\\"1000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华东\\\",\\\"province\\\":\\\"上海市\\\",\\\"year\\\":\\\"2023\\\",\\\"quarter\\\":\\\"1\\\",\\\"month\\\":\\\"3月\\\",\\\"sales\\\":\\\"2000\\\",\\\"gift\\\":\\\"1000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华东\\\",\\\"province\\\":\\\"上海市\\\",\\\"year\\\":\\\"2023\\\",\\\"quarter\\\":\\\"2\\\",\\\"month\\\":\\\"1月\\\",\\\"sales\\\":\\\"3000\\\",\\\"gift\\\":\\\"2000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华东\\\",\\\"province\\\":\\\"上海市\\\",\\\"year\\\":\\\"2023\\\",\\\"quarter\\\":\\\"2\\\",\\\"month\\\":\\\"2月\\\",\\\"sales\\\":\\\"3000\\\",\\\"gift\\\":\\\"2000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华东\\\",\\\"province\\\":\\\"上海市\\\",\\\"year\\\":\\\"2023\\\",\\\"quarter\\\":\\\"2\\\",\\\"month\\\":\\\"3月\\\",\\\"sales\\\":\\\"3000\\\",\\\"gift\\\":\\\"2000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华西\\\",\\\"province\\\":\\\"太原市\\\",\\\"year\\\":\\\"2023\\\",\\\"quarter\\\":\\\"1\\\",\\\"month\\\":\\\"1月\\\",\\\"sales\\\":\\\"2000\\\",\\\"gift\\\":\\\"1000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华西\\\",\\\"province\\\":\\\"太原市\\\",\\\"year\\\":\\\"2023\\\",\\\"quarter\\\":\\\"1\\\",\\\"month\\\":\\\"2月\\\",\\\"sales\\\":\\\"2000\\\",\\\"gift\\\":\\\"1000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华西\\\",\\\"province\\\":\\\"太原市\\\",\\\"year\\\":\\\"2023\\\",\\\"quarter\\\":\\\"1\\\",\\\"month\\\":\\\"3月\\\",\\\"sales\\\":\\\"2000\\\",\\\"gift\\\":\\\"1000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华西\\\",\\\"province\\\":\\\"太原市\\\",\\\"year\\\":\\\"2023\\\",\\\"quarter\\\":\\\"2\\\",\\\"month\\\":\\\"1月\\\",\\\"sales\\\":\\\"3000\\\",\\\"gift\\\":\\\"2000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华西\\\",\\\"province\\\":\\\"太原市\\\",\\\"year\\\":\\\"2023\\\",\\\"quarter\\\":\\\"2\\\",\\\"month\\\":\\\"2月\\\",\\\"sales\\\":\\\"3000\\\",\\\"gift\\\":\\\"2000\\\",\\\"proportion\\\":\\\"10%\\\"},\\n        {\\\"region\\\":\\\"华西\\\",\\\"province\\\":\\\"太原市\\\",\\\"year\\\":\\\"2023\\\",\\\"quarter\\\":\\\"2\\\",\\\"month\\\":\\\"3月\\\",\\\"sales\\\":\\\"3000\\\",\\\"gift\\\":\\\"2000\\\",\\\"proportion\\\":\\\"10%\\\"}\\n    ]\\n}', '', NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('924614453609201664', '924614453466595328', '', NULL, '2024-03-04 20:55:03', '2024-03-04 20:55:03', 'tm', 'tm', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/tiaoma1', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('930045149249585152', '928540173805338624', 'admin', 'admin', '2024-03-20 10:18:16', '2024-03-20 10:18:16', 'receipt', '顾客/业主收费明细', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/receipt?id=${id}', '0', '0', '0', '', NULL, '', '', NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('930241691461926912', '928540173805338624', 'admin', 'admin', '2024-03-20 10:07:37', '2024-03-20 10:07:37', 'receiptProject', '顾客/业主收费项目明细', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/receiptProject?customId=${customId}', '0', '1', '0', '', NULL, '', '', NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('934653343564922880', '934653264347103232', 'admin', NULL, '2024-04-01 13:45:32', '2024-04-01 13:45:32', 'aa', 'a', '0', NULL, 'select * from demo', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', '', 'mysql', '', '', NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('938680893609967616', '938680635597357056', 'admin', NULL, '2024-04-12 16:29:35', '2024-04-12 16:29:35', 'zongxdata', '分组纵向数据1', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/baobiao/ygtj_1712909288392', '0', '1', '0', '', NULL, '', '', NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('94bcd8202bc6bc467efd0d679dadd7bb', '1338370016550195200', 'admin', NULL, '2021-02-02 19:27:31', '2021-02-02 19:27:31', 'tm', 'tm', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/tiaoma1', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('9b75c161322e0b7e29b3ffc84239a72c', '1cd9d574d0c42f3915046dc61d9f33bd', 'admin', NULL, '2020-12-17 17:13:21', '2020-12-17 19:50:14', 'xsjd', '销售进度', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/xsjd', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('9b7d28336b01f9a6b1a613957c3d7cda', '1338769064067076098', 'admin', NULL, '2021-02-02 19:12:55', '2021-02-02 19:12:55', 'pop', 'pop', '0', NULL, 'select * from rep_demo_dxtj', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '0', '', 'MYSQL', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('e4cec9ff15bc0ea42f536a442a6d1335', '961455b47c0b86dc961e90b5893bff05', 'admin', NULL, '2021-01-04 20:42:17', '2021-01-04 20:42:17', 'jianpiao', 'jianpiao', '0', NULL, 'select * from rep_demo_jianpiao where s_id=\\'${id}\\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', '1', NULL, 'MYSQL', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('f7649b77cfc9e0a9dacdac370cd4036b', '1347373863746539520', 'admin', NULL, '2021-01-08 10:47:52', '2021-01-08 10:47:52', 'tt', 'tt', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/baobiao/shixi', '0', '0', '0', '', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db` VALUES ('fb70a91730f087f8023afd88d24f9697', '1cd9d574d0c42f3915046dc61d9f33bd', 'admin', NULL, '2020-12-17 19:50:14', '2020-12-17 19:50:14', 'zhexian', 'zhexian', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'https://api.jeecg.com/mock/26/zhexian', '0', '1', '1', '', NULL, NULL, NULL, NULL, NULL);\n\n-- ----------------------------\n-- Table structure for jimu_report_db_field\n-- ----------------------------\nDROP TABLE IF EXISTS `jimu_report_db_field`;\nCREATE TABLE `jimu_report_db_field`  (\n  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'id',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `jimu_report_db_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据源ID',\n  `field_name` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字段名',\n  `field_name_physics` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '物理字段名（文件数据集使用，存的是excel的字段标题）',\n  `field_text` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字段文本',\n  `widget_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '控件类型',\n  `widget_width` int(10) NULL DEFAULT NULL COMMENT '控件宽度',\n  `order_num` int(3) NULL DEFAULT NULL COMMENT '排序',\n  `search_flag` int(3) NULL DEFAULT 0 COMMENT '查询标识0否1是 默认0',\n  `search_mode` int(3) NULL DEFAULT NULL COMMENT '查询模式1简单2范围',\n  `dict_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典编码支持从表中取数据',\n  `search_value` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询默认值',\n  `search_format` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询时间格式化表达式',\n  `ext_json` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '参数配置',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_jrdf_jimu_report_db_id`(`jimu_report_db_id`) USING BTREE,\n  INDEX `idx_dbfield_order_num`(`order_num`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of jimu_report_db_field\n-- ----------------------------\nINSERT INTO `jimu_report_db_field` VALUES ('014179e260e0adf1706c616a3ad6e552', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'main_income', NULL, 'main_income', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('01cb1f61f836aae43bca333dbaf293be', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'zhuanye', NULL, 'zhuanye', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('0680555456f0e579a0065c4ca5dd8d06', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'id', NULL, 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('08a3043298245b914eec1444906f6acd', NULL, '2021-02-02 19:13:46', NULL, NULL, '1338756341933543425', 'name', NULL, '姓名', 'string', NULL, 2, 1, NULL, '', NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('08e22bbf63e81198c0d2585dce8ee8f9', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'jperson', NULL, 'jperson', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('0c82931edb766ad89ead9e98a998d43f', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'kdate', NULL, 'kdate', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('0c9f65f5f754f1251070f51a2a19905d', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'hname', NULL, 'hname', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('0e47a8aa98116f10c53c3a366b9c2324', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'dizhi', NULL, 'dizhi', 'String', NULL, 21, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('0fb03c8e2330e051564f3dd1de54512f', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'jstudent', NULL, 'jstudent', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1036890631694286848', 'admin', '2025-01-08 16:40:01', NULL, NULL, '1036890631451017216', 'id', NULL, 'id', 'String', NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1036890631740424192', 'admin', '2025-01-08 16:40:01', NULL, NULL, '1036890631451017216', 'log_type', NULL, 'log_type', 'String', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1036890631778172928', 'admin', '2025-01-08 16:40:01', NULL, NULL, '1036890631451017216', 'log_content', NULL, 'log_content', 'String', NULL, 2, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1036890631803338752', 'admin', '2025-01-08 16:40:01', NULL, NULL, '1036890631451017216', 'operate_type', NULL, 'operate_type', 'String', NULL, 3, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1036890631832698880', 'admin', '2025-01-08 16:40:01', NULL, NULL, '1036890631451017216', 'userid', NULL, 'userid', 'String', NULL, 4, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1036890631874641920', 'admin', '2025-01-08 16:40:01', NULL, NULL, '1036890631451017216', 'username', NULL, 'username', 'String', NULL, 5, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1036890631904002048', 'admin', '2025-01-08 16:40:01', NULL, NULL, '1036890631451017216', 'ip', NULL, 'ip', 'String', NULL, 6, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1036890631933362176', 'admin', '2025-01-08 16:40:01', NULL, NULL, '1036890631451017216', 'method', NULL, 'method', 'String', NULL, 7, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1036890631962722304', 'admin', '2025-01-08 16:40:01', NULL, NULL, '1036890631451017216', 'request_url', NULL, 'request_url', 'String', NULL, 8, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1036890632042414080', 'admin', '2025-01-08 16:40:01', NULL, NULL, '1036890631451017216', 'request_param', NULL, 'request_param', 'String', NULL, 9, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1036890632063385600', 'admin', '2025-01-08 16:40:01', NULL, NULL, '1036890631451017216', 'request_type', NULL, 'request_type', 'String', NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1036890632084357120', 'admin', '2025-01-08 16:40:01', NULL, NULL, '1036890631451017216', 'cost_time', NULL, 'cost_time', 'String', NULL, 11, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1036890632105328640', 'admin', '2025-01-08 16:40:01', NULL, NULL, '1036890631451017216', 'create_by', NULL, 'create_by', 'String', NULL, 12, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1036890632134688768', 'admin', '2025-01-08 16:40:01', NULL, NULL, '1036890631451017216', 'create_time', NULL, 'create_time', 'String', NULL, 13, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1036890632155660288', 'admin', '2025-01-08 16:40:01', NULL, NULL, '1036890631451017216', 'update_by', NULL, 'update_by', 'String', NULL, 14, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1036890632180826112', 'admin', '2025-01-08 16:40:01', NULL, NULL, '1036890631451017216', 'update_time', NULL, 'update_time', 'String', NULL, 15, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1036890632214380544', 'admin', '2025-01-08 16:40:01', NULL, NULL, '1036890631451017216', 'tenant_id', NULL, 'tenant_id', 'String', NULL, 16, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1036890632231157760', 'admin', '2025-01-08 16:40:01', NULL, NULL, '1036890631451017216', 'client_type', NULL, 'client_type', 'String', NULL, 17, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('10e61155dcf655d7843ebc01cc90c8b1', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'total', NULL, 'total', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1110357649164107776', 'admin', '2025-07-30 10:11:43', NULL, NULL, '1110348824457543680', 'visit_date', NULL, 'visit_date', 'String', NULL, 0, NULL, NULL, '', NULL, NULL, '');\nINSERT INTO `jimu_report_db_field` VALUES ('1110357649247993856', 'admin', '2025-07-30 10:11:43', NULL, NULL, '1110348824457543680', 'visit_count', NULL, 'visit_count', 'String', NULL, 1, NULL, NULL, '', NULL, NULL, '');\nINSERT INTO `jimu_report_db_field` VALUES ('115c1ac01462ca1fbecb3c0a55218395', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'his_highest', NULL, 'his_highest', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('123772e3abf28b00bd43bf81a824b525', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'slyy', NULL, 'slyy', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1272834907562864641', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'id', NULL, 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1272834907567058946', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'bnum', NULL, 'bnum', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1272834907571253250', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'ftime', NULL, 'ftime', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1272834907571253251', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'sfkong', NULL, 'sfkong', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1272834907571253252', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'kaishi', NULL, 'kaishi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1272834907571253253', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'jieshu', NULL, 'jieshu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1272834907571253254', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'hezairen', NULL, 'hezairen', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1272834907571253255', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'jpnum', NULL, 'jpnum', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1272834907575447554', NULL, '2020-06-16 18:14:25', NULL, NULL, '1272834687525482497', 'shihelv', NULL, 'shihelv', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1283957016175415297', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yphone', NULL, 'yphone', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1283957016183803906', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yzhenliao', NULL, 'yzhenliao', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1283957016187998209', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'ysex', NULL, 'ysex', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1283957016192192513', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'danwei', NULL, 'danwei', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1283957016196386818', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'kdata', NULL, 'kdata', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1283957016204775425', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yname', NULL, 'yname', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1283957016208969729', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yprice', NULL, 'yprice', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1283957016213164033', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'ytotal', NULL, 'ytotal', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1283957016217358337', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yishe', NULL, 'yishe', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1283957016221552641', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yizhu', NULL, 'yizhu', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1283957016225746946', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yage', NULL, 'yage', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1283957016229941249', NULL, '2020-07-17 10:49:42', NULL, NULL, '1283957016150249473', 'yjieguo', NULL, 'yjieguo', NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285150155649130497', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'xtype', NULL, 'xtype', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285150155686879234', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'danyuan', NULL, 'danyuan', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285150155691073538', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'chanquan', NULL, 'chanquan', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285150155695267841', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'zhuzhi', NULL, 'zhuzhi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285150155699462145', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'fujian', NULL, 'fujian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285150155707850754', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'didian', NULL, 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285150155707850755', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'type', NULL, 'type', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285150155712045058', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'suoyou', NULL, 'suoyou', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285150155716239361', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'name', NULL, 'name', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285150155716239362', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'bianhao', NULL, 'bianhao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285150155720433666', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'yname', NULL, 'yname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285150155720433667', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'riqi', NULL, 'riqi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285150155724627969', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'beizhu', NULL, 'beizhu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285150155728822274', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'time', NULL, 'time', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285150155728822275', NULL, '2020-07-20 17:50:49', NULL, NULL, '1284070508744257537', 'mianji', NULL, 'mianji', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285159608326889474', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'fsex', NULL, 'fsex', 'string', NULL, NULL, 0, NULL, 'sex', NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285159608335278082', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'fname', NULL, 'fname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285159608339472385', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'shiqing', NULL, 'shiqing', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285159608339472386', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'pname', NULL, 'pname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285159608339472387', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'zhuzhi', NULL, 'zhuzhi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285159608339472388', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'gdata', NULL, 'gdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285159608343666690', 'admin', '2021-04-01 02:44:48', NULL, NULL, '1285157606524002305', 'cdata', NULL, 'cdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285164420749664258', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'shiqing', NULL, 'shiqing', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285164420753858561', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'name', NULL, 'name', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285164420758052866', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'gdata', NULL, 'gdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285164420758052867', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'value', NULL, 'value', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285164420758052868', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'percent', NULL, 'percent', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285164420762247169', NULL, '2020-07-20 18:47:30', NULL, NULL, '1285164420728692737', 'tdata', NULL, 'tdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285178919124803585', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'ktime', NULL, 'ktime', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285178919133192193', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'danwei', NULL, 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285178919133192194', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'wtime', NULL, 'wtime', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285178919133192195', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'yusuan', NULL, 'yusuan', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285178919133192196', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'dshenhe', NULL, 'dshenhe', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285178919133192197', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'zhuren', NULL, 'zhuren', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285178919137386498', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'neirong', NULL, 'neirong', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285178919137386499', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'yijian', NULL, 'yijian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285178919137386500', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time1', NULL, 'time1', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285178919137386501', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time2', NULL, 'time2', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285178919137386502', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time3', NULL, 'time3', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285178919141580801', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time4', NULL, 'time4', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285178919141580802', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'pingjia', NULL, 'pingjia', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285178919141580803', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'name', NULL, 'name', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285178919141580804', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'bianhao', NULL, 'bianhao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285178919141580805', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'zongjie', NULL, 'zongjie', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285178919145775105', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'nengli', NULL, 'nengli', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1285178919145775106', NULL, '2020-07-20 19:45:06', NULL, NULL, '1285178919099637762', 'time', NULL, 'time', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1288038655394324482', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'ctotal', NULL, '库存量', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1288038655402713090', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'cname', NULL, '产品名称', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1288038655406907393', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'cprice', NULL, '单价', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1288038655411101697', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'dtotal', NULL, '订购量', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1288038655411101698', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'tp', NULL, '库存总值', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1288038655415296002', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'ztotal', NULL, '二次订购量', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1288038655415296003', 'admin', '2021-04-01 03:09:40', NULL, NULL, '1288038655293661186', 'cnum', NULL, '产品数量', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1290104038439886849', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'id', NULL, 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1290104038448275458', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'gname', NULL, 'gname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1290104038448275459', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'gdata', NULL, 'gdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1290104038448275460', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'tdata', NULL, 'tdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1290104038452469761', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'didian', NULL, 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1290104038452469762', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'zhaiyao', NULL, 'zhaiyao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1290104038452469763', NULL, '2020-08-03 09:55:46', NULL, NULL, '1290104038414721025', 'num', NULL, 'num', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1317007979534479361', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'zmphone', NULL, 'zmphone', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1317007979534479362', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'jstudent', NULL, 'jstudent', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1317007979534479363', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'kdate', NULL, 'kdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1317007979534479364', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'jdate', NULL, 'jdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1317007979534479365', NULL, '2020-10-16 15:42:26', NULL, NULL, '1317007979484147714', 'zmname', NULL, 'zmname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1317009166149218305', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'zcname', NULL, 'zcname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1317009166149218306', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'danwei', NULL, 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1317009166149218307', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'fdate', NULL, 'fdate', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1317009166149218308', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'jibie', NULL, 'jibie', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1317009166149218309', NULL, '2020-10-16 15:47:09', NULL, NULL, '1317009166140829698', 'beizhu', NULL, 'beizhu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1317013474643144706', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'danwei', NULL, 'danwei', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1317013474643144707', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'phone', NULL, 'phone', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1317013474643144708', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'name', NULL, 'name', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1317013474643144709', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'zzmm', NULL, 'zzmm', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1317013474643144710', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'guanxi', NULL, 'guanxi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1317013474643144711', NULL, '2020-10-16 16:04:16', NULL, NULL, '1317013474634756097', 'age', NULL, 'age', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1317015169502670849', NULL, '2020-10-16 16:11:00', NULL, NULL, '1317015169494282241', 'date', NULL, 'date', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1317015169502670850', NULL, '2020-10-16 16:11:00', NULL, NULL, '1317015169494282241', 'mingcheng', NULL, 'mingcheng', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1317015169502670851', NULL, '2020-10-16 16:11:00', NULL, NULL, '1317015169494282241', 'didian', NULL, 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331511745855926274', NULL, '2020-11-25 16:15:13', NULL, NULL, '1331511745851731969', 'name', NULL, 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331511745855926275', NULL, '2020-11-25 16:15:13', NULL, NULL, '1331511745851731969', 'value', NULL, 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331511745855926276', NULL, '2020-11-25 16:15:13', NULL, NULL, '1331511745851731969', 'type', NULL, 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331514838215602178', NULL, '2020-11-25 16:27:30', NULL, NULL, '1331514838211407873', 'name', NULL, 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331514838215602179', NULL, '2020-11-25 16:27:30', NULL, NULL, '1331514838211407873', 'value', NULL, 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331514838215602180', NULL, '2020-11-25 16:27:30', NULL, NULL, '1331514838211407873', 'type', NULL, 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331514935032721409', NULL, '2020-11-25 16:27:54', NULL, NULL, '1331514935028527106', 'name', NULL, 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331514935032721410', NULL, '2020-11-25 16:27:54', NULL, NULL, '1331514935028527106', 'value', NULL, 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331514935032721411', NULL, '2020-11-25 16:27:54', NULL, NULL, '1331514935028527106', 'type', NULL, 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331872643539914754', NULL, '2020-11-26 16:09:18', NULL, NULL, '1331872643531526146', 'name', NULL, 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331872643539914755', NULL, '2020-11-26 16:09:18', NULL, NULL, '1331872643531526146', 'value', NULL, 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331872643539914756', NULL, '2020-11-26 16:09:18', NULL, NULL, '1331872643531526146', 'type', NULL, 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331878107560398849', NULL, '2020-11-26 16:31:01', NULL, NULL, '1331878107552010242', 'name', NULL, 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331878107560398850', NULL, '2020-11-26 16:31:01', NULL, NULL, '1331878107552010242', 'value', NULL, 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331916030229991425', NULL, '2020-11-26 19:01:42', NULL, NULL, '1331916030221602818', 'name', NULL, 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331916030229991426', NULL, '2020-11-26 19:01:42', NULL, NULL, '1331916030221602818', 'value', NULL, 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331916030229991427', NULL, '2020-11-26 19:01:42', NULL, NULL, '1331916030221602818', 'type', NULL, 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331919172480913409', NULL, '2020-11-26 19:14:11', NULL, NULL, '1331919172472524801', 'name', NULL, 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331919172480913410', NULL, '2020-11-26 19:14:11', NULL, NULL, '1331919172472524801', 'value', NULL, 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331922734942375938', NULL, '2020-11-26 19:28:21', NULL, NULL, '1331922734933987329', 'name', NULL, 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331922734942375939', NULL, '2020-11-26 19:28:21', NULL, NULL, '1331922734933987329', 'value', NULL, 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331926127605829634', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'cjl', NULL, 'cjl', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331926127605829635', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'cjje', NULL, 'cjje', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331926127605829636', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'xsmj', NULL, 'xsmj', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331926127605829637', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'cjjj', NULL, 'cjjj', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331926127605829638', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'sfyj', NULL, 'sfyj', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1331926127605829639', NULL, '2020-11-26 19:41:49', NULL, NULL, '1331926127597441025', 'ydkh', NULL, 'ydkh', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334440263740825602', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'class', NULL, 'class', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334440263740825603', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'school', NULL, 'school', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334440263740825604', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'lv', NULL, 'lv', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334440263740825605', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'renyuan_jy', NULL, 'renyuan_jy', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334440263740825606', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'richang_jy', NULL, 'richang_jy', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334440263740825607', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'biaozhun_jy', NULL, 'biaozhun_jy', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334440263740825608', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'xinxi_jy', NULL, 'xinxi_jy', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334440263740825609', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'jichubokuan_jy', NULL, 'jichubokuan_jy', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334440263740825610', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'renyuan_ct', NULL, 'renyuan_ct', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334440263740825611', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'richang_ct', NULL, 'richang_ct', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334440263740825612', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'xiangmu_ct', NULL, 'xiangmu_ct', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334440263740825613', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'jichubokuan_ct', NULL, 'jichubokuan_ct', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334440263740825614', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'xiangmu_sh', NULL, 'xiangmu_sh', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334440263740825615', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'jichubokuan_sh', NULL, 'jichubokuan_sh', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334440263740825616', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'diannao', NULL, 'diannao', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334440263740825617', NULL, '2020-12-03 18:12:06', NULL, NULL, '1334440263732436994', 'xiaoyuanwang', NULL, 'xiaoyuanwang', 'String', NULL, 16, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135443451905', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'diqu', NULL, 'diqu', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135443451906', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'class', NULL, 'class', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135443451907', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_11', NULL, 'sales_11', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135443451908', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_12', NULL, 'sales_12', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135443451909', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_13', NULL, 'sales_13', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135443451910', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_14', NULL, 'sales_14', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135443451911', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_15', NULL, 'sales_15', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135443451912', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_16', NULL, 'sales_16', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135443451913', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_17', NULL, 'sales_17', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135447646210', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_18', NULL, 'sales_18', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135447646211', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_19', NULL, 'sales_19', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135447646212', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_20', NULL, 'sales_20', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135447646213', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_21', NULL, 'sales_21', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135447646214', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_22', NULL, 'sales_22', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135447646215', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_31', NULL, 'sales_31', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135447646216', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_32', NULL, 'sales_32', 'String', NULL, 16, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135447646217', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_33', NULL, 'sales_33', 'String', NULL, 17, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135447646218', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_34', NULL, 'sales_34', 'String', NULL, 18, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135447646219', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_35', NULL, 'sales_35', 'String', NULL, 19, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135447646220', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_36', NULL, 'sales_36', 'String', NULL, 20, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135447646221', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_37', NULL, 'sales_37', 'String', NULL, 21, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135447646222', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_38', NULL, 'sales_38', 'String', NULL, 22, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135447646223', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_39', NULL, 'sales_39', 'String', NULL, 23, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135447646224', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_40', NULL, 'sales_40', 'String', NULL, 24, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135447646225', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_41', NULL, 'sales_41', 'String', NULL, 25, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334465135447646226', NULL, '2020-12-03 19:50:56', NULL, NULL, '1334465135435063298', 'sales_42', NULL, 'sales_42', 'String', NULL, 26, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334708015277879297', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'city', NULL, 'city', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334708015282073601', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'school', NULL, 'school', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334708015282073602', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'ncnum', NULL, 'ncnum', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334708015282073603', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'num', NULL, 'num', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334708015282073604', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'name', NULL, 'name', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334708015282073605', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'class', NULL, 'class', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334708015282073606', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'pay', NULL, 'pay', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334708015282073607', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'paytime', NULL, 'paytime', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334708015282073608', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'payclass', NULL, 'payclass', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334708015282073609', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'pay1', NULL, 'pay1', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334708015282073610', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'paymoth', NULL, 'paymoth', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334708015282073611', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'pay2', NULL, 'pay2', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334708015282073612', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'tuition_09', NULL, 'tuition_09', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334708015282073613', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'meals_09', NULL, 'meals_09', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334708015282073614', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'busfee_09', NULL, 'busfee_09', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334708015282073615', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'tuition_10', NULL, 'tuition_10', 'String', NULL, 16, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334708015282073616', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'meals_10', NULL, 'meals_10', 'String', NULL, 17, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334708015282073617', NULL, '2020-12-04 11:56:03', NULL, NULL, '1334708015269490689', 'busfee_10', NULL, 'busfee_10', 'String', NULL, 18, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334764504126402561', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'city', NULL, 'city', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334764504130596866', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'finish', NULL, 'finish', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334764504130596867', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'semifinish', NULL, 'semifinish', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334764504130596868', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'time', NULL, 'time', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334764504130596869', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'state', NULL, 'state', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334764504130596870', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'attribute', NULL, 'attribute', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334764504130596871', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'num', NULL, 'num', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334764504130596872', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'gnum', NULL, 'gnum', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334764504130596873', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'jnum', NULL, 'jnum', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334764504130596874', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'wnum', NULL, 'wnum', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334764504130596875', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'uph', NULL, 'uph', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334764504130596876', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'hc', NULL, 'hc', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334764504130596877', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'jtime', NULL, 'jtime', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334764504130596878', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'yield', NULL, 'yield', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334764504130596879', NULL, '2020-12-04 15:40:31', NULL, NULL, '1334763434197200897', 'beizhu', NULL, 'beizhu', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334782903430754305', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'name', NULL, 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334782903430754306', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'value', NULL, 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334782903430754307', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key1', NULL, 'key1', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334782903430754308', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key2', NULL, 'key2', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334782903430754309', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key3', NULL, 'key3', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334782903430754310', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key4', NULL, 'key4', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334782903430754311', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key5', NULL, 'key5', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334782903430754312', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key6', NULL, 'key6', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334782903430754313', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'key7', NULL, 'key7', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1334782903430754314', NULL, '2020-12-04 16:53:38', NULL, NULL, '1283730831482937345', 'percent', NULL, 'percent', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('141dc952421a55e66fcddb94adddc48b', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'sex', NULL, '性别', 'String', NULL, 10, 1, 1, 'sex', NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('17a278c53299d1342c56a8eb1614a44e', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'ctime', NULL, 'ctime', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('19e6fe3dc95b352d97f460648dc93e15', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_z', NULL, 'proportion_z', 'String', NULL, 23, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1b09540b3d8deddc06ebdbec26f6ae87', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'political', NULL, 'political', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1b53581fa4096f4a05c7e8d73c7a7af9', NULL, '2021-02-02 19:13:46', NULL, NULL, '1338756341933543425', 'jphone', NULL, 'jphone', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1b6fbe11728a1c4633eeea8ffb12bc25', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'update_by', NULL, 'update_by', 'String', NULL, 30, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1d21c72184f2e06ca1be3dc95fbcc259', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'zhiwu', NULL, 'zhiwu', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1ee3018b4d0c305e2c06f77e1e5f3c4c', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_3', NULL, 'sales_3', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('1fac3f8219222b8963dc6b85870ffd86', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'telphone', NULL, 'telphone', NULL, NULL, 16, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('218fb9e81e6255a6589c52ddd8279c40', NULL, '2021-02-02 19:13:46', NULL, NULL, '1338756341933543425', 'laddress', NULL, 'laddress', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('21f7de0326129dbbbc03d64aceb4d3f7', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'yprice', NULL, 'yprice', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('240f3415fa8e7b3876c0b422d468c90d', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'gname', NULL, 'gname', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('298cfe65d8b484624f8a28199dc800e7', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'sr', NULL, 'sr', 'String', NULL, 16, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('29fcb4292d4782888e9fd0496bd8ddc8', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'id', NULL, 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('2a3b35b4830f1b1eff84a5a9bceed0b6', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_z', NULL, 'gift_z', 'String', NULL, 22, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('2be25d6c7e3ac28abec99854618d0e3d', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'birthday', NULL, 'birthday', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('2f94a4be25426f3f4013c50103559969', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_4', NULL, 'sales_4', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('30f8183ff4ec5a6b30724a1da7fbbed0', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'pworktime', NULL, 'pworktime', NULL, NULL, 18, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('30fc020c8d14776e96350edb479f40ac', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'zhuzhi', NULL, 'zhuzhi', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('32545e398eea7bf89791cc78dd16ab12', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'yhnum', NULL, 'yhnum', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('3331f86002c128555443d8e7b79c70d2', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'name', NULL, 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('34c933903ddf6ba5bad588d913c487c5', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_4', NULL, 'gift_4', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('350be7312c299482acfe44fb086f91c1', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_5', NULL, 'sales_5', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('35d9204189dd1d1f142a7587f89ab46c', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'email', NULL, 'email', 'String', NULL, 18, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('37868bf0bad09f6d2084340e0b05333d', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'sf4', NULL, 'sf4', 'String', NULL, 18, 0, NULL, 'ttype', NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('38b2955e0ef75d384d0d9ff8417e4945', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'sf3', NULL, 'sf3', 'String', NULL, 17, 0, NULL, 'ttype', NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('39878a3df0fe2cafc481469b8eb71ea5', NULL, '2021-02-02 19:13:46', NULL, NULL, '1338756341933543425', 'sex', NULL, 'sex', 'String', NULL, 10, 0, NULL, 'sex', NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('3c2a8313af79dbecba4c5687b65a66ab', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'cnum', NULL, 'cnum', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('3c71c10a0d27796808cb201e30024fe8', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'school', NULL, 'school', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('3c7597c1efa73ca9400cdc36a9a48e23', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_1', NULL, 'gift_1', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('3cd9d09176d10d3225e4fe86b4538739', NULL, '2020-12-17 16:59:12', NULL, NULL, '7911bd189c2d53e182693bd599a315a2', 'type', NULL, 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('3ec76a981ff5353d4a65052963166477', NULL, '2020-12-17 17:13:21', NULL, NULL, '9b75c161322e0b7e29b3ffc84239a72c', 'value', NULL, 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('3f5a04060285392287f4e7f6d59988c6', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'tdata', NULL, 'tdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('3f7ce1ee2ad20770e64016384f2c1cd5', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'homephone', NULL, 'homephone', NULL, NULL, 17, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('42225abb0677e51111a8e9e7b001332c', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'yjine', NULL, 'yjine', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('450316da5f9b7d8505944e16f1284a38', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'monty', NULL, 'monty', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('46a4074647a27aaee0e5263d5f6bcf5a', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'tp', NULL, 'tp', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('46f68d27013cff9b09c5d059c79fbf28', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'gtime', NULL, '雇佣时间', 'date', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('4942cc4d04ac7330799ecc3fec48ac8b', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'id_card', NULL, 'id_card', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('49def4afc641cb52775ff03fdba3007a', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'his_lowest', NULL, 'his_lowest', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('49fa04e98f2ed62966d7f6141611dd7e', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'children', NULL, 'children', NULL, NULL, 24, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('49febadfe1eb3a59bfbe802d506aa590', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'data', NULL, 'data', NULL, NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('4d782de2bf10be3a79f04e8841053f00', NULL, '2021-01-08 10:47:52', NULL, NULL, 'f7649b77cfc9e0a9dacdac370cd4036b', 'pingjia', NULL, 'pingjia', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('4d7dd94ecf26b5fa69f9a1f811583340', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'address', NULL, 'address', 'String', NULL, 16, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('502a0a66b4dbf8689ed36e56ab272c2f', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'birth', NULL, '出生日期', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('52444b20f2fcdfe43461a5a49079e4dc', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'health', NULL, 'health', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537477711047733248', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'id', NULL, 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537477711056121856', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'name', NULL, 'name', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537477711064510464', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'gtime', NULL, 'gtime', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537477711072899072', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'update_by', NULL, 'update_by', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537477711077093376', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'jphone', NULL, 'jphone', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537477711085481984', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'birth', NULL, 'birth', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537477711093870592', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'hukou', NULL, 'hukou', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537477711102259200', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'laddress', NULL, 'laddress', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537477711106453504', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'jperson', NULL, 'jperson', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537477711110647808', 'admin', '2021-04-01 05:54:42', NULL, NULL, '537477711022567424', 'sex', NULL, 'sex', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537478337303457792', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'id', NULL, 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537478337320235008', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'create_by', NULL, 'create_by', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537478337328623616', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'create_time', NULL, 'create_time', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537478337332817920', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'update_by', NULL, 'update_by', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537478337341206528', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'update_time', NULL, 'update_time', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537478337349595136', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'data_table', NULL, 'data_table', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537478337353789440', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'data_id', NULL, 'data_id', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537478337362178048', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'data_content', NULL, 'data_content', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537478337370566656', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'data_version', NULL, 'data_version', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537478337378955264', 'admin', '2021-04-01 05:54:37', NULL, NULL, '537478337278291968', 'rownum_', NULL, 'rownum_', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537478706330906624', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'id', NULL, 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537478706343489536', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'cname', NULL, 'cname', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537478706351878144', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'cnum', NULL, 'cnum', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537478706356072448', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'cprice', NULL, 'cprice', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537478706360266752', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'ctotal', NULL, 'ctotal', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537478706368655360', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'tp', NULL, 'tp', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537478706377043968', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'dtotal', NULL, 'dtotal', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537478706381238272', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'ztotal', NULL, 'ztotal', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('537478706389626880', 'admin', '2021-04-01 05:56:44', NULL, NULL, '537478706314129408', 'd_id', NULL, 'd_id', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('538563757aa1a49935824ce14568f27c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'archivesdi', NULL, 'archivesdi', NULL, NULL, 34, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('5406c33ff49384c2bcad5b85a9701355', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'province', NULL, 'province', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('5648f5a00640e3adf57fb9bbf27269f4', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'tm', NULL, 'tm', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('56749103eb4a60e7046dea34453b439e', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'shao', NULL, 'shao', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('57ee0e6ffe7135a943dde2408d424c97', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_1', NULL, 'proportion_1', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('589a5a4fe61fc71aa1bf45d3bd73974b', NULL, '2020-12-17 19:50:14', NULL, NULL, 'fb70a91730f087f8023afd88d24f9697', 'name', NULL, 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('5a88459afcf01cc20ac5a50322b35fd6', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'hukounum', NULL, 'hukounum', NULL, NULL, 26, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('5b7f7bebf0c3951b891026e7c2ac90cb', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'didian', NULL, 'didian', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('5bf6aee0bd8f676a218e0210e9e6fa0e', NULL, '2020-12-17 16:59:12', NULL, NULL, '7911bd189c2d53e182693bd599a315a2', 'name', NULL, 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('5cf4a1ca15691d6340e522e1831dc3ac', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_6', NULL, 'sales_6', 'String', NULL, 18, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('5e4e8b7531a88f4db1a0d133de159494', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'num', NULL, 'num', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('6020e457162b86b75a2d335999ab06ec', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'nation', NULL, 'nation', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('631632bc2243018788d11d4f8348bfd2', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'socialsecurity', NULL, 'socialsecurity', NULL, NULL, 30, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('665f13c7fcebac6c35c894d885c4b344', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_6', NULL, 'proportion_6', 'String', NULL, 20, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('677bf4d6400fc465067b0d5bd6ad2a58', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_2', NULL, 'gift_2', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('6b2db5f824af08166e5074feea82ab52', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'sex', NULL, 'sex', 'String', NULL, 2, 0, NULL, 'sex', NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('6c2b1c9e4cfd3f6b79d0fb26fea72cec', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'zhaiyao', NULL, 'zhaiyao', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('6dae70a5323b3d517c8f13278f0e1d5f', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_5', NULL, 'proportion_5', 'String', NULL, 17, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('6ec41a06e2dee9ec8f07a894ddcaaae5', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'jphone', NULL, 'jphone', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('70abaf24c413f38ff6a3c315ad8824b2', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'height', NULL, 'height', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('710104c3e0541602a151d5e00fc2ee29', NULL, '2020-12-17 16:42:21', NULL, NULL, '654609e4247a0469e0b2befbc69b00f9', 'type', NULL, 'type', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('718a062a1e42276c1913c7d7836b1bee', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'hobby', NULL, 'hobby', NULL, NULL, 32, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('71cb567cd27fda05d55d80324c7b59e1', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'del_flag', NULL, 'del_flag', 'String', NULL, 32, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('729c2d2c70da0f3bc092f4aab4432244', NULL, '2020-12-17 16:42:21', NULL, NULL, '654609e4247a0469e0b2befbc69b00f9', 'name', NULL, 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('732c8b168ade2e34974c9db6396df61f', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'type', NULL, 'type', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('742954cf518d8026db68cc87c017ad2a', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'bz', NULL, 'bz', 'String', NULL, 19, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('768fb670937ab4aadde39842df36bfd3', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'cprice', NULL, 'cprice', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('796408f2959fc40edd9b460a1a5bdfb8', NULL, '2021-02-02 19:13:46', NULL, NULL, '1338756341933543425', 'gtime', NULL, '雇佣日期', 'date', NULL, 3, 1, 2, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('7b794ecee6f61f64839eb1094a7c20bb', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'region', NULL, 'region', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('7c2c06cc52978c4e5665deac1784535d', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'yren', NULL, 'yren', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('7e564f212697079394030ac0563df496', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'id', NULL, 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('7f5570e3056d82210d7d4e79b861560c', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'laddress', NULL, 'laddress', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('80017f23232ea91ae32e4718eb10e8c3', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_4', NULL, 'proportion_4', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('80b5e3fd550d9be1a8c8ea69a2a593f8', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'birth', NULL, 'birth', NULL, NULL, 6, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('81dea8f0ccba2b3530038ebcf92b36b1', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'name', NULL, 'name', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('81f2de244fa1e6b5f28419f60c4db169', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'bnum', NULL, 'bnum', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('824a22cf80849d110e04fd5c573f40de', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'jphone', NULL, 'jphone', 'String', NULL, 17, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('84391d55c9bd4185c4abbc0d9a8a3f9b', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'native_place', NULL, 'native_place', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('85263a305fba4c7e7a991ed3b416e006', NULL, '2020-12-17 16:42:21', NULL, NULL, '654609e4247a0469e0b2befbc69b00f9', 'value', NULL, 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('865ca077977b78934e5e82e733ef4e47', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'major', NULL, 'major', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('8749d00c6c3cf873841a227a5206478a', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_1', NULL, 'sales_1', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('87f43f4f5220c34a95d55ff3fa9de0c1', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'health', NULL, 'health', NULL, NULL, 10, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('88b19703dac5a5ae8c01c68101cd8b5b', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'cbz', NULL, 'cbz', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('89bd5c1f5b37b82ab2d56d8c9e50a674', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'sex', NULL, 'sex', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('8a122291db744a6109a93af5d289787f', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'computer_level', NULL, 'computer_level', 'String', NULL, 22, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('8ab8d51dfb792cdc767e68d7e9370f3d', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'num', NULL, 'num', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('8bfc84f6d610581d736fcccc5f04a863', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'scard', NULL, 'scard', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('8d186f249df9e1c1c549fbdc6a0a4d77', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'currentdi', NULL, 'currentdi', NULL, NULL, 28, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('8db810062e3a19eb83fca651691b848e', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_2', NULL, 'sales_2', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('8e39d42a7fad183fe75ce1a56f148db1', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'bianma', NULL, 'bianma', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('8fb12c3929ea745f94cc4a90df9d5181', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'idcard', NULL, 'idcard', NULL, NULL, 21, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614453659533312', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'name', NULL, 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614453697282048', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'sex', NULL, 'sex', 'String', NULL, 2, 0, NULL, 'sex', NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614453726642176', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'tp', NULL, 'tp', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614453747613696', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'tm', NULL, 'tm', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614453768585216', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'nation', NULL, 'nation', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614453785362432', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'birth', NULL, 'birth', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614453810528256', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'zhuzhi', NULL, 'zhuzhi', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614453827305472', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'card', NULL, 'card', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614453839888384', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'ydate', NULL, 'ydate', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614453852471296', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'qfjg', NULL, 'qfjg', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614453865054208', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'slyy', NULL, 'slyy', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614453877637120', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'sdate', NULL, 'sdate', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614453902802944', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'shao', NULL, 'shao', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614453927968768', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'cbr', NULL, 'cbr', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614453953134592', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'sld', NULL, 'sld', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614453969911808', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'sr', NULL, 'sr', 'String', NULL, 16, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614454003466240', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'jphone', NULL, 'jphone', 'String', NULL, 17, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614454020243456', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'lzr', NULL, 'lzr', 'String', NULL, 18, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614454037020672', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'ldate', NULL, 'ldate', 'String', NULL, 19, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614454053797888', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'sk', NULL, 'sk', 'String', NULL, 20, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('924614454074769408', NULL, '2021-02-02 19:23:18', NULL, NULL, '924614453609201664', 'dizhi', NULL, 'dizhi', 'String', NULL, 21, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('92da818568d6c8e1e499abf51e439870', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'lzr', NULL, 'lzr', 'String', NULL, 18, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('930045149299916800', 'admin', '2024-03-19 20:34:13', NULL, NULL, '930045149249585152', 'id', NULL, '编号(输入1或者2)', 'String', NULL, 0, 1, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('930045149438328832', 'admin', '2024-03-19 20:34:13', NULL, NULL, '930045149249585152', 'organization', NULL, '收款组织', 'String', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('930241691537424384', 'admin', '2024-03-20 09:35:13', NULL, NULL, '930241691461926912', 'id', NULL, '编号', 'String', NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('930241691583561728', 'admin', '2024-03-20 09:35:13', NULL, NULL, '930241691461926912', 'customId', NULL, '顾客/业主收费明细编号', 'String', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('930241691600338944', 'admin', '2024-03-20 09:35:13', NULL, NULL, '930241691461926912', 'propertyName', NULL, '房产名称', 'String', NULL, 2, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('930241691617116160', 'admin', '2024-03-20 09:35:13', NULL, NULL, '930241691461926912', 'expenseItem', NULL, '费用项目', 'String', NULL, 3, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('930241691650670592', 'admin', '2024-03-20 09:35:13', NULL, NULL, '930241691461926912', 'price', NULL, '应交月份', 'String', NULL, 4, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('930243856901390336', 'admin', '2024-03-20 09:43:49', NULL, NULL, '930241691461926912', 'payableMonths', NULL, '金额', 'String', NULL, 5, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('930244634357579776', 'admin', '2024-03-20 09:46:54', NULL, NULL, '930045149249585152', 'customName', NULL, '顾客名称', 'String', NULL, 2, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('930244634374356992', 'admin', '2024-03-20 09:46:54', NULL, NULL, '930045149249585152', 'receiptNo', NULL, '收款单号', 'String', NULL, 3, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('930244634386939904', 'admin', '2024-03-20 09:46:54', NULL, NULL, '930045149249585152', 'actualPayer', NULL, '实际交款人', 'String', NULL, 4, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('930244634403717120', 'admin', '2024-03-20 09:46:54', NULL, NULL, '930045149249585152', 'settlementType', NULL, '结算方式', 'String', NULL, 5, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('930244634420494336', 'admin', '2024-03-20 09:46:54', NULL, NULL, '930045149249585152', 'collectionTime', NULL, '收款时间', 'String', NULL, 6, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('930244634433077248', 'admin', '2024-03-20 09:46:54', NULL, NULL, '930045149249585152', 'originalNumber', NULL, '原单号', 'String', NULL, 7, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('930244634449854464', 'admin', '2024-03-20 09:46:54', NULL, NULL, '930045149249585152', 'paymentDesc', NULL, '缴费说明', 'String', NULL, 8, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('930244634462437376', 'admin', '2024-03-20 09:46:54', NULL, NULL, '930045149249585152', 'verifyPassword', NULL, '检验密码', 'String', NULL, 9, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('930244634479214592', 'admin', '2024-03-20 09:46:54', NULL, NULL, '930045149249585152', 'dealWith', NULL, '收款经办', 'String', NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('934653343644614656', 'admin', '2024-04-01 13:45:32', NULL, NULL, '934653343564922880', 'id', NULL, 'id', 'String', NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('934653343678169088', 'admin', '2024-04-01 13:45:32', NULL, NULL, '934653343564922880', 'name', NULL, 'name', 'String', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('934653343694946304', 'admin', '2024-04-01 13:45:32', NULL, NULL, '934653343564922880', 'key_word', NULL, 'key_word', 'String', NULL, 2, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('934653343711723520', 'admin', '2024-04-01 13:45:32', NULL, NULL, '934653343564922880', 'punch_time', NULL, 'punch_time', 'String', NULL, 3, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('934653343728500736', 'admin', '2024-04-01 13:45:32', NULL, NULL, '934653343564922880', 'salary_money', NULL, 'salary_money', 'String', NULL, 4, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('934653343741083648', 'admin', '2024-04-01 13:45:32', NULL, NULL, '934653343564922880', 'bonus_money', NULL, 'bonus_money', 'String', NULL, 5, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('934653343753666560', 'admin', '2024-04-01 13:45:32', NULL, NULL, '934653343564922880', 'sex', NULL, 'sex', 'String', NULL, 6, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('934653343770443776', 'admin', '2024-04-01 13:45:32', NULL, NULL, '934653343564922880', 'age', NULL, 'age', 'String', NULL, 7, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('934653343783026688', 'admin', '2024-04-01 13:45:32', NULL, NULL, '934653343564922880', 'birthday', NULL, 'birthday', 'String', NULL, 8, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('934653343795609600', 'admin', '2024-04-01 13:45:32', NULL, NULL, '934653343564922880', 'email', NULL, 'email', 'String', NULL, 9, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('934653343808192512', 'admin', '2024-04-01 13:45:32', NULL, NULL, '934653343564922880', 'content', NULL, 'content', 'String', NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('934653343820775424', 'admin', '2024-04-01 13:45:32', NULL, NULL, '934653343564922880', 'create_by', NULL, 'create_by', 'String', NULL, 11, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('934653343837552640', 'admin', '2024-04-01 13:45:32', NULL, NULL, '934653343564922880', 'create_time', NULL, 'create_time', 'String', NULL, 12, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('934653343850135552', 'admin', '2024-04-01 13:45:32', NULL, NULL, '934653343564922880', 'update_by', NULL, 'update_by', 'String', NULL, 13, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('934653343862718464', 'admin', '2024-04-01 13:45:32', NULL, NULL, '934653343564922880', 'update_time', NULL, 'update_time', 'String', NULL, 14, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('934653343875301376', 'admin', '2024-04-01 13:45:32', NULL, NULL, '934653343564922880', 'sys_org_code', NULL, 'sys_org_code', 'String', NULL, 15, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('934653343896272896', 'admin', '2024-04-01 13:45:32', NULL, NULL, '934653343564922880', 'tenant_id', NULL, 'tenant_id', 'String', NULL, 16, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('934653343913050112', 'admin', '2024-04-01 13:45:32', NULL, NULL, '934653343564922880', 'update_count', NULL, 'update_count', 'String', NULL, 17, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('938680893832265728', 'admin', '2024-04-12 16:29:35', NULL, NULL, '938680893609967616', 'country', NULL, 'country', 'String', NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('938680893895180288', 'admin', '2024-04-12 16:29:35', NULL, NULL, '938680893609967616', 'city', NULL, 'city', 'String', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('938680893916151808', 'admin', '2024-04-12 16:29:35', NULL, NULL, '938680893609967616', 'region', NULL, 'region', 'String', NULL, 2, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('938680893941317632', 'admin', '2024-04-12 16:29:35', NULL, NULL, '938680893609967616', 'org', NULL, 'org', 'String', NULL, 3, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('938680893970677760', 'admin', '2024-04-12 16:29:35', NULL, NULL, '938680893609967616', 'department', NULL, 'department', 'String', NULL, 4, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('938680893987454976', 'admin', '2024-04-12 16:29:35', NULL, NULL, '938680893609967616', 'education', NULL, 'education', 'String', NULL, 5, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('938680893995843584', 'admin', '2024-04-12 16:29:35', NULL, NULL, '938680893609967616', 'sex', NULL, 'sex', 'String', NULL, 6, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('938680894033592320', 'admin', '2024-04-12 16:29:35', NULL, NULL, '938680893609967616', 'age', NULL, 'age', 'String', NULL, 7, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('938680894079729664', 'admin', '2024-04-12 16:29:35', NULL, NULL, '938680893609967616', 'name', NULL, 'name', 'String', NULL, 8, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('938680894100701184', 'admin', '2024-04-12 16:29:35', NULL, NULL, '938680893609967616', 'salary', NULL, 'salary', 'String', NULL, 9, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('938680894121672704', 'admin', '2024-04-12 16:29:35', NULL, NULL, '938680893609967616', 'tm', NULL, 'tm', 'String', NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('94fc5c2791e2e218383864b80095c89c', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'id', NULL, 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('95650b0335c6981bf0d657e11b1b2082', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'hysr', NULL, 'hysr', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('9a5f78c12595cb66d3b630962f7cd7bf', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'sf1', NULL, 'sf1', 'String', NULL, 15, 0, NULL, 'ttype', NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('9d3986d3a32e9b4672dc2b29174749f3', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'rk', NULL, 'rk', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('9d6a3a8b9cf5c659e7d752028b70da8b', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'sf2', NULL, 'sf2', 'String', NULL, 16, 0, NULL, 'ttype', NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('9d9b437037bb304f5def5b97d4c2b4c4', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'zhuzhi', NULL, 'zhuzhi', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('9ddf87596d6701eda383c3d8d7853b2b', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'education', NULL, 'education', 'String', NULL, 13, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('9e28f1951ea83b6e6dae4e3892baea90', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'positional_titles', NULL, 'positional_titles', 'String', NULL, 25, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('9f15fef9efd35f5a5c1418ce5a6eceb0', NULL, '2021-02-02 19:13:46', NULL, NULL, '1338756341933543425', 'birth', NULL, '出生日期', 'datetime', NULL, 6, 1, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('a15e649faa93fbae15a66f5266bd9336', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'phone', NULL, 'phone', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('a2e680c356e712b43343d589539da011', NULL, '2021-01-08 10:47:52', NULL, NULL, 'f7649b77cfc9e0a9dacdac370cd4036b', 'name', NULL, 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('a42eed89da67da0653650edcc1576f8c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'currentnum', NULL, 'currentnum', NULL, NULL, 29, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('a93ce07361b9d6ec02a58cf7f6b94664', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'political', NULL, 'political', NULL, NULL, 7, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('a949c4beac3fec79e96309a6d2d8f5bb', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'entrytime', NULL, 'entrytime', NULL, NULL, 19, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('a97ee04d3e745b3be9ee48cb16fdb419', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'birth', NULL, 'birth', 'String', NULL, 6, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('a9c7c96a412537b4da3df68ff8e93cc8', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'post', NULL, 'post', NULL, NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('ab0aabf8cc08327a4510420bd553e6c0', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'providentfund', NULL, 'providentfund', NULL, NULL, 31, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('ad146af051ba273a480223d49f59358b', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'hukoustreet', NULL, 'hukoustreet', NULL, NULL, 25, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('ad1d1fe2ee182c2d3a263a127fea041e', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_2', NULL, 'proportion_2', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('ad2cc52cc14e9aabc04ac79d9a10b530', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'ldate', NULL, 'ldate', 'String', NULL, 19, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('ae5ec6e56478a098b36587e93b1d8908', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'arrival_time', NULL, 'arrival_time', 'String', NULL, 24, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('aee0188ab2bf9849607f6ef34b36713e', NULL, '2020-12-17 17:13:21', NULL, NULL, '9b75c161322e0b7e29b3ffc84239a72c', 'name', NULL, 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('aee106a24b11b0f8ca10bc88b62189d7', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'gdata', NULL, 'gdata', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('aee31ce5eb6271601bc4e6f8affaceb0', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'hezairen', NULL, 'hezairen', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('b14588abed341d314a08d316dfde553f', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'work_experience', NULL, 'work_experience', 'String', NULL, 27, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('b1de05c2d02cdde59c1e2a93e45964f9', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'create_time', NULL, 'create_time', 'String', NULL, 29, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('b2176d9680c08a7aa040aec9f71ff236', NULL, '2021-02-02 19:13:46', NULL, NULL, '1338756341933543425', 'id', NULL, 'id', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('b279ab8f7d20ebbeec67f5bf2109ba22', NULL, '2021-01-08 16:10:28', NULL, NULL, '7b20679054449c554cde856ef24126ab', 'his_average', NULL, 'his_average', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('b3c98ed9cb9e4a234273aa4921efd545', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'jpnum', NULL, 'jpnum', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('b450669f376fa9f075ac403c7d7f2ee9', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'proportion_3', NULL, 'proportion_3', 'String', NULL, 11, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('b46d80bfe53372b6ff92a6f8e8bf38df', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'hukoudi', NULL, 'hukoudi', NULL, NULL, 27, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('b5afa6c7c63f649460d4d45b7d697098', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'zip_code', NULL, 'zip_code', 'String', NULL, 17, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('b5df568754994e67a15a8f5b8d4bc297', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'phone', NULL, 'phone', 'String', NULL, 19, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('b863f83ac64327d86f36c8796a00f777', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'jieshu', NULL, 'jieshu', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('b8aafd56ddcf6902909722c7d2529797', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'department', NULL, 'department', NULL, NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('ba83ad8a89105b198aa49798f2940c29', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'foreign_language', NULL, 'foreign_language', 'String', NULL, 20, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('bef01b3169ec05f63c9f92245b61bedf', NULL, '2021-02-02 19:13:46', NULL, NULL, '1338756341933543425', 'jperson', NULL, 'jperson', NULL, NULL, 9, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('c357b23ae68c0ee6c9dab322507dce0b', NULL, '2021-01-11 14:38:14', NULL, NULL, '1317006713165049858', 'jdate', NULL, 'jdate', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('c3b0443ebecc7152343c5ea3ef32a38f', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'graduation_time', NULL, 'graduation_time', 'String', NULL, 23, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('c3d8cd6e68c605fd6d6ac217fed5c8d4', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'weight', NULL, 'weight', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('c3fe8f62ea0c6ce9990bfa22dc0265b6', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'major', NULL, 'major', NULL, NULL, 13, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('c40fe2cf7a74a6e96575f73ef5e7d205', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'nation', NULL, 'nation', NULL, NULL, 9, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('c4d6132699dcdff382c93ab10d64551a', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'education_experience', NULL, 'education_experience', 'String', NULL, 26, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('c578969584d9b639d249bcd981bc5a08', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'ydate', NULL, 'ydate', 'String', NULL, 9, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('c57bd36c25b13a8149268496e54052ae', NULL, '2020-12-17 19:50:14', NULL, NULL, 'fb70a91730f087f8023afd88d24f9697', 'value', NULL, 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('c6144f2ca7422a71e951abea1bce6aaf', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'education', NULL, 'education', NULL, NULL, 12, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('c6820a1e3308badb60582998805a0645', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'shihelv', NULL, 'shihelv', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('c8d1276d19bdd946e9fc18b83aacda15', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'cname', NULL, 'cname', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('cb99a516d392d1efb87141ec42168aa9', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'card', NULL, 'card', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('cc91f43bf975f056944b5ec19266ec9c', NULL, '2020-12-17 16:59:12', NULL, NULL, '7911bd189c2d53e182693bd599a315a2', 'value', NULL, 'value', 'String', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('cec893b2241134ba9b03ed6d4edf2919', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'marital', NULL, 'marital', NULL, NULL, 23, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('cf9d32fea2f67e4b11cd2823dbbefbad', NULL, '2020-08-03 09:55:46', NULL, NULL, '6011955e58d89040fca52e7f962d0bf4', 'id', NULL, 'id', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('d076942aecee8f5197b66eb382ba1995', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'sbtype', NULL, 'sbtype', NULL, NULL, 33, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('d3ef9876d3c56889157747be606f70fc', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_6', NULL, 'gift_6', 'String', NULL, 19, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('d5b7b92023a2fb09fed9d36a4ac7b3e3', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'sales_z', NULL, 'sales_z', 'String', NULL, 21, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('da9d0a2565cea7578415076a4d8e6c4c', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'sdate', NULL, 'sdate', 'String', NULL, 12, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('db503c31de99f35cbcb1f66a69f9964c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'mailbox', NULL, 'mailbox', NULL, NULL, 15, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('dbc452a77ba1449096852d21c2959f34', NULL, '2021-02-02 19:13:46', NULL, NULL, '1338756341933543425', 'hukou', NULL, 'hukou', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('dd5697ec6eddcca16cca47080e9b801d', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'sld', NULL, 'sld', 'String', NULL, 15, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('dd56fbd98db5c1cda9dd77637ba1c7e6', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'create_by', NULL, 'create_by', 'String', NULL, 28, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('ddcf7ade58e0a8a520b44fc94e0602bb', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'sk', NULL, 'sk', 'String', NULL, 20, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('dfbc8bba6261dcd4ceb3da5f517a0d58', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'school', NULL, 'school', NULL, NULL, 20, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('e1c77285c7ca39ebee455895ed081245', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'nation', NULL, 'nation', 'String', NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('e28cc14c4e1bc2c889f04a6cf30f9196', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'cbr', NULL, 'cbr', 'String', NULL, 14, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('e52e7896193ad09d700599d2ef6fa8ae', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'knum', NULL, 'knum', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('e7f6104183a7b2408f72b91f4638e9e2', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_3', NULL, 'gift_3', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('e8c0f052d6bca9045fdb6197b197a92d', NULL, '2021-02-02 19:13:46', NULL, NULL, '1338756341933543425', 'update_by', NULL, 'update_by', 'String', NULL, 4, 0, NULL, 'zhiwu', NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('ea6018bdbd9fb192b1d3f9e832b5d382', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'name', NULL, '姓名', 'string', NULL, 2, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('ec6c6f56c64de5f4de16166000f31d19', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'ftime', NULL, 'ftime', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('ef685270770a69bddb4f24e37eed9dc0', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'office', NULL, 'office', NULL, NULL, 8, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('efe17d82b5daaa3f95364e9afaeffd1c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'register', NULL, 'register', NULL, NULL, 11, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('efe4e0110a61d9791e18308aed422aa7', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'name', NULL, 'name', NULL, NULL, 4, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('f0a83c77c0448a9f7c8c0bc3c7f42f13', NULL, '2021-02-02 19:23:18', NULL, NULL, '94bcd8202bc6bc467efd0d679dadd7bb', 'qfjg', NULL, 'qfjg', 'String', NULL, 10, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('f110f1f947e0f895b552f7edd133a60a', 'admin', '2021-04-01 03:09:23', NULL, NULL, '1289140698221678593', 'ctotal', NULL, 'ctotal', 'String', NULL, 8, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('f11af753ccbf495818e9c23c1b083ae2', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'foreign_language_level', NULL, 'foreign_language_level', 'String', NULL, 21, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('f1905f7a175f8e56afd8f6c2969582e6', NULL, '2021-01-06 11:43:35', NULL, NULL, '1334390762455965697', 'gift_5', NULL, 'gift_5', 'String', NULL, 16, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('f3b4e31c7ff6a365c4130cbc695e2621', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'num', NULL, 'num', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('f430837a3f4c08f425bcd1de46d3a2d3', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'sex', NULL, 'sex', NULL, NULL, 5, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('f53143608c570f9886861442be87b5ff', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'update_by', NULL, '职务', 'String', NULL, 4, 1, 3, 'zhiwu', NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('f82904af04e557b12dcfe3562900597c', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'gdata', NULL, 'gdata', NULL, NULL, 14, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('f9154d882408b868253ed8fb87879220', NULL, '2021-02-02 19:30:23', NULL, NULL, '629609c4d540cb4675e9064af8955296', 'name', NULL, 'name', 'String', NULL, 1, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('f95dd09a118b93cc7884b12118448ed4', NULL, '2021-02-02 19:10:15', NULL, NULL, '9b7d28336b01f9a6b1a613957c3d7cda', 'hukou', NULL, 'hukou', 'String', NULL, 7, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('f978117e8eda0daee2c00223f9df4b48', NULL, '2021-01-13 11:59:53', NULL, NULL, '1316997232402231298', 'update_time', NULL, 'update_time', 'String', NULL, 31, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('f984ef26fe0a505b279a0e4a3b27201f', NULL, '2021-01-08 10:47:52', NULL, NULL, 'f7649b77cfc9e0a9dacdac370cd4036b', 'shijian', NULL, 'shijian', 'String', NULL, 4, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('fac871f69237c6c25abe8c4332eabcbf', NULL, '2021-01-08 10:47:52', NULL, NULL, 'f7649b77cfc9e0a9dacdac370cd4036b', 'lingdao', NULL, 'lingdao', 'String', NULL, 3, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('fc07c053ed0ecbfcc45041640acf6cb1', NULL, '2021-01-05 15:33:07', NULL, NULL, '1316987047604514817', 'party', NULL, 'party', NULL, NULL, 22, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('fe3b1449ce346836f47234ca65949aea', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'sfkong', NULL, 'sfkong', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_field` VALUES ('ffb5fbe81d2cf48ca45a815c676fd9eb', NULL, '2020-06-16 18:14:25', NULL, NULL, 'e4cec9ff15bc0ea42f536a442a6d1335', 'kaishi', NULL, 'kaishi', 'string', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\n\n-- ----------------------------\n-- Table structure for jimu_report_db_param\n-- ----------------------------\nDROP TABLE IF EXISTS `jimu_report_db_param`;\nCREATE TABLE `jimu_report_db_param`  (\n  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `jimu_report_head_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '动态报表ID',\n  `param_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '参数字段',\n  `param_txt` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数文本',\n  `param_value` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数默认值',\n  `order_num` int(11) NULL DEFAULT NULL COMMENT '排序',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `search_flag` int(1) NULL DEFAULT NULL COMMENT '查询标识0否1是 默认0',\n  `widget_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询控件类型',\n  `search_mode` int(1) NULL DEFAULT NULL COMMENT '查询模式1简单2范围',\n  `dict_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典',\n  `search_format` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询时间格式化表达式',\n  `ext_json` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '参数配置',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_jrdp_jimu_report_head_id`(`jimu_report_head_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of jimu_report_db_param\n-- ----------------------------\nINSERT INTO `jimu_report_db_param` VALUES ('1324279360203526146', '1324279359998005250', 'pageSize', 'pageSize', '10', 2, NULL, '2020-08-03 15:19:54', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_param` VALUES ('1324279360220303361', '1324279359998005250', 'pageNo', 'pageNo', '1', 1, NULL, '2020-08-03 15:19:54', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_param` VALUES ('173c869cc45b683a9cfe25826110cead', '1272834687525482497', 'id', 'id', '1', 1, NULL, '2020-08-03 09:57:08', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_param` VALUES ('1805eb351a966dc3c039b5239b6faa49', '1291310198925840385', 'sex', 'sex', '男', 2, NULL, '2020-06-08 15:21:09', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_param` VALUES ('256eb2f8582ce4d74559b1fc1e2917ca', '1291310198925840385', 'id', 'id', '111', 1, NULL, '2020-06-08 15:21:09', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_param` VALUES ('3957799c20fcc696d680cca9649897bb', 'e4cec9ff15bc0ea42f536a442a6d1335', 'id', 'id', '1', 1, NULL, '2020-08-03 09:57:08', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_param` VALUES ('3a9efc51a6b6723d5a0ddf109aacb2b5', '1288038655293661186', 'pageNo', 'pageNo', '1', 1, 'admin', '2021-04-01 03:09:40', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_param` VALUES ('3ced36c7a2cce40c667cc485bf59cd11', '1291217511962902530', 'pageSize', 'pageSize', '10', 2, NULL, '2020-08-03 15:19:54', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_param` VALUES ('49bd3f212cd6c406c8584e6bb0d9cf93', '1291549569390243841', 'pageSize', 'pageSize', '10', 2, NULL, '2020-07-30 17:26:29', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_param` VALUES ('52db6da75ea733ae741c62cc54c85d92', '6011955e58d89040fca52e7f962d0bf4', 'id', 'id', '1', 1, NULL, '2020-08-03 09:55:46', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_param` VALUES ('57165a6fe5f2b700d4ef19518de4defd', '1290104038414721025', 'id', 'id', '1', 1, NULL, '2020-08-03 09:55:46', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_param` VALUES ('7569e95c1fa73d5438aceb19c1b85ef0', '1288038655293661186', 'pageSize', 'pageSize', '20', 2, 'admin', '2021-04-01 03:09:40', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_param` VALUES ('7d7765754aadaddab91bf1257447ae73', '1291549569390243841', 'pageNo', 'pageNo', '1', 1, NULL, '2020-07-30 17:26:29', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_param` VALUES ('90b22a058cc331146b548bc93f09b5cd', '1289140698221678593', 'pageSize', 'pageSize', '20', 2, 'admin', '2021-04-01 03:09:23', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_param` VALUES ('930241691675836416', '930241691461926912', 'customId', NULL, '1', 1, 'admin', '2024-03-20 09:35:13', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');\nINSERT INTO `jimu_report_db_param` VALUES ('930241749263630336', '930045149249585152', 'id', NULL, '', 1, 'admin', '2024-03-20 09:35:26', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');\nINSERT INTO `jimu_report_db_param` VALUES ('a29c10ed01c6608e899e1368f2d5d7e3', '1316997232402231298', 'id', 'id', '1', 1, NULL, '2021-01-13 14:31:13', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_param` VALUES ('a803707f3383dd9f4685fadc7efa07f4', '1224643501392728065', 'sex', 'sex', '男', 2, NULL, '2020-06-08 15:21:09', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_param` VALUES ('b7c34e8a3c2804715825af4bdbcf857a', '1224643501392728065', 'id', 'id', '111', 1, NULL, '2020-06-08 15:21:09', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_param` VALUES ('d8010a4ffbe567e6117e7f59641aeb7c', '1289140698221678593', 'pageNo', 'pageNo', '1', 1, 'admin', '2021-04-01 03:09:23', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_db_param` VALUES ('d9d94d6b09dd074f39af96d7a4696f9a', '1291217511962902530', 'pageNo', 'pageNo', '1', 1, NULL, '2020-08-03 15:19:54', NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL);\n\n-- ----------------------------\n-- Table structure for jimu_report_export_job\n-- ----------------------------\nDROP TABLE IF EXISTS `jimu_report_export_job`;\nCREATE TABLE `jimu_report_export_job`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键',\n  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '任务名称',\n  `begin_time` datetime NULL DEFAULT NULL COMMENT '开始时间',\n  `end_time` datetime NULL DEFAULT NULL COMMENT '结束时间',\n  `exec_interval` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '执行频率',\n  `report_conf` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '导出报表配置',\n  `last_run_time` datetime NULL DEFAULT NULL COMMENT '最后执行时间',\n  `receiver_email` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '接收通知的邮件',\n  `file_sync_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '文件同步路径',\n  `status` int(11) NULL DEFAULT NULL COMMENT '状态(0:停止;1:启动)',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  `tenant_id` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '多租户标识',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '积木报表导出计划表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of jimu_report_export_job\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for jimu_report_export_log\n-- ----------------------------\nDROP TABLE IF EXISTS `jimu_report_export_log`;\nCREATE TABLE `jimu_report_export_log`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `batch_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '批次编号',\n  `export_channel` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '导出渠道',\n  `export_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '导出类型',\n  `report_id` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '报表id',\n  `download_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '下载路径',\n  `status` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '状态',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  `tenant_id` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '多租户标识',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '积木报表自动导出记录表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of jimu_report_export_log\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for jimu_report_ext_data\n-- ----------------------------\nDROP TABLE IF EXISTS `jimu_report_ext_data`;\nCREATE TABLE `jimu_report_ext_data`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键ID',\n  `biz_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '业务类型标识，如 report_share、temp_config 等',\n  `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称，展示用',\n  `descr` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述信息',\n  `tags` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标签，多个用逗号分隔',\n  `data_value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '实际存储内容',\n  `metadata` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '元数据，用于存储补充信息',\n  `status` tinyint(4) NULL DEFAULT 1 COMMENT '状态标识：1正常 0禁用',\n  `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_biz`(`biz_type`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '通用扩展数据表' ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of jimu_report_ext_data\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for jimu_report_icon_lib\n-- ----------------------------\nDROP TABLE IF EXISTS `jimu_report_icon_lib`;\nCREATE TABLE `jimu_report_icon_lib`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',\n  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图片名称',\n  `type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图片类型',\n  `image_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图片地址',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  `tenant_id` int(11) NULL DEFAULT NULL COMMENT '租户id',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '积木图库表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of jimu_report_icon_lib\n-- ----------------------------\nINSERT INTO `jimu_report_icon_lib` VALUES ('1049528030907236352', '规模', 'common', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/cygm.png', 'admin', '2025-02-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1049528060653240320', '地图', 'common', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/map.png', 'admin', '2025-02-12 13:36:39', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1049528097315651584', '模块', 'common', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/gnmk.png', 'admin', '2025-02-12 13:36:48', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1049528141758496768', '数据', 'common', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/glsj.png', 'admin', '2025-02-12 13:36:59', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1049528176160178176', '兼容', 'common', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/jr.png', 'admin', '2025-02-12 13:37:07', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1049528216056397824', '聚焦', 'common', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/jj.png', 'admin', '2025-02-12 13:37:16', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1049528260608294912', '分析', 'common', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/sjfx.png', 'admin', '2025-02-12 13:37:27', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1049528435443662848', '分裂', 'common', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/sjlb.png', 'admin', '2025-02-12 13:38:09', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1049528483522969600', '趋势', 'common', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/sjzs.png', 'admin', '2025-02-12 13:38:20', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1049528593581506560', '数据', 'common', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/xxk.png', 'admin', '2025-02-12 13:38:46', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1049528640859701248', '指纹', 'common', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/zwsb.png', 'admin', '2025-02-12 13:38:58', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1049528685608730624', '柱图', 'common', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/bar.png', 'admin', '2025-02-12 13:39:08', 'admin', '2025-04-02 22:32:19', 1000);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025769230337', 'icon1', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025769230337.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025773424641', 'icon2', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025773424641.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025781813249', 'icon3', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025781813249.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025786007553', 'icon4', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025786007553.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025790201858', 'icon5', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025790201858.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025798590465', 'icon6', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025798590465.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025802784769', 'icon7', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025802784769.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025806979073', 'icon8', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025806979073.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025811173377', 'icon9', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025811173377.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025819561986', 'icon10', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025819561986.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025827950594', 'icon11', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025827950594.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025832144898', 'icon12', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025832144898.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025857310721', 'icon13', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025857310721.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025869893633', 'icon14', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025869893633.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025869893634', 'icon15', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025869893634.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025878282241', 'icon16', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025878282241.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025937002497', 'icon17', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025937002497.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025953779713', 'icon18', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025953779713.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025962168322', 'icon19', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025962168322.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025966362626', 'icon20', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025966362626.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025983139842', 'icon21', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025983139842.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025995722753', 'icon22', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025995722753.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271025999917058', 'icon23', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271025999917058.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026004111361', 'icon24', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026004111361.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026008305666', 'icon25', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026008305666.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026016694273', 'icon26', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026016694273.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026020888578', 'icon27', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026020888578.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026025082882', 'icon28', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026025082882.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026029277185', 'icon29', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026029277185.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026037665793', 'icon30', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026037665793.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026046054402', 'icon31', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026046054402.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026050248706', 'icon32', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026050248706.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026054443010', 'icon33', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026054443010.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026058637314', 'icon34', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026058637314.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026062831617', 'icon35', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026062831617.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026071220225', 'icon36', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026071220225.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026087997442', 'icon37', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026087997442.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026096386049', 'icon38', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026096386049.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026108968962', 'icon39', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026108968962.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026113163266', 'icon40', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026113163266.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026117357570', 'icon41', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026117357570.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026125746177', 'icon42', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026125746177.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026146717698', 'icon43', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026146717698.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026150912002', 'icon44', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026150912002.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026155106306', 'icon45', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026155106306.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026163494914', 'icon46', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026163494914.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026167689217', 'icon47', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026167689217.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026176077825', 'icon48', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026176077825.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026192855042', 'icon49', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026192855042.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026197049346', 'icon50', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026197049346.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026205437954', 'icon51', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026205437954.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026218020865', 'icon52', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026218020865.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026226409473', 'icon53', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026226409473.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026234798081', 'icon54', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026234798081.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026247380993', 'icon55', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026247380993.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026259963906', 'icon56', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026259963906.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026264158210', 'icon57', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026264158210.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026272546818', 'icon58', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026272546818.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026280935425', 'icon59', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026280935425.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026285129729', 'icon60', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026285129729.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026289324034', 'icon61', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026289324034.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026293518338', 'icon62', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026293518338.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026297712642', 'icon63', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026297712642.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026301906945', 'icon64', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026301906945.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026310295553', 'icon65', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026310295553.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026331267074', 'icon66', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026331267074.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026339655682', 'icon67', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026339655682.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026343849985', 'icon68', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026343849985.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026348044289', 'icon69', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026348044289.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026356432897', 'icon70', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026356432897.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026360627202', 'icon71', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026360627202.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026364821506', 'icon72', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026364821506.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026381598721', 'icon73', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026381598721.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026389987329', 'icon74', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026389987329.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026394181634', 'icon75', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026394181634.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026398375938', 'icon76', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026398375938.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026402570242', 'icon77', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026402570242.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026406764546', 'icon78', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026406764546.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026410958850', 'icon79', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026410958850.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026419347457', 'icon80', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026419347457.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026423541762', 'icon81', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026423541762.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026427736065', 'icon82', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026427736065.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026436124673', 'icon83', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026436124673.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026436124674', 'icon84', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026436124674.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026440318977', 'icon85', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026440318977.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026444513281', 'icon86', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026444513281.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026457096194', 'icon87', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026457096194.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026469679105', 'icon88', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026469679105.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026473873409', 'icon89', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026473873409.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026482262017', 'icon90', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026482262017.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026499039234', 'icon91', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026499039234.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026503233537', 'icon92', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026503233537.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026507427841', 'icon93', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026507427841.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026515816449', 'icon94', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026515816449.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026528399362', 'icon95', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026528399362.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026536787969', 'icon96', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026536787969.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026545176578', 'icon97', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026545176578.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026549370882', 'icon98', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026549370882.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026557759489', 'icon99', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026557759489.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026561953794', 'icon100', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026561953794.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026578731009', 'icon101', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026578731009.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026578731010', 'icon102', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026578731010.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026582925314', 'icon103', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026582925314.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026587119618', 'icon104', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026587119618.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026599702530', 'icon105', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026599702530.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026608091138', 'icon106', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026608091138.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026612285442', 'icon107', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026612285442.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026616479745', 'icon108', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026616479745.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1666271026620674049', 'icon109', '3D', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/3D/1666271026620674049.png', 'admin', '2025-03-07 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440101', 'icon1', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_point_1.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440102', 'icon2', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_point_2.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440103', 'icon3', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_point_3.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440104', 'icon4', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_point_4.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440105', 'icon5', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_point_5.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440106', 'icon6', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_point_51.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440107', 'icon7', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_point_6.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440108', 'icon8', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_point_7.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440109', 'icon9', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_point_8.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440110', 'icon10', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_point_81.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440111', 'icon11', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_point_9.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440112', 'icon12', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_target_10.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440113', 'icon13', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_target_20.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440114', 'icon14', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_target_21.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440115', 'icon15', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_target_22.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440116', 'icon16', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_target_3.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440117', 'icon17', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_target_5.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440118', 'icon18', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_target_6.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440119', 'icon19', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_target_7.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440120', 'icon20', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_target_8.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1767047795019440121', 'icon21', 'point', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/point/img_target_9.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440101', 'icon1', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/10.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440102', 'icon2', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/11.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440103', 'icon3', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/12.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440104', 'icon4', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/13.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440105', 'icon5', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/14.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440106', 'icon6', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/3.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440107', 'icon7', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/4.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440108', 'icon8', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/5.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440109', 'icon9', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/6.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440110', 'icon10', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/7.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440111', 'icon11', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/9.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440112', 'icon12', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_base_1.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440113', 'icon13', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_base_10.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440114', 'icon14', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_base_11.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440115', 'icon15', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_base_12.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440116', 'icon16', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_base_13.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440117', 'icon17', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_base_14.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440118', 'icon18', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_base_15.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440119', 'icon19', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_base_16.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440120', 'icon20', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_base_2.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440121', 'icon21', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_base_3.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440122', 'icon22', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_base_4.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440123', 'icon23', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_base_5.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440124', 'icon24', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_base_6.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440125', 'icon25', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_base_7.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440126', 'icon26', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_base_8.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440127', 'icon27', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_base_9.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440128', 'icon28', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_dc_blue.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440129', 'icon29', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_dc_green.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440130', 'icon30', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_dc_red.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440131', 'icon31', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_target_1.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440132', 'icon32', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_target_2.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440133', 'icon33', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/img_target_4.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1867047795019440134', 'icon34', 'data', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/data/zhuti.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440101', 'icon1', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_all.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440102', 'icon2', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_carkey.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440103', 'icon3', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_close.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440104', 'icon4', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_computer.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440105', 'icon5', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_computerlock.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440106', 'icon6', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_cycle.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440107', 'icon7', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_datalock.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440108', 'icon8', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_datalock_2.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440109', 'icon9', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_encryption.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440110', 'icon10', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_gesture.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440111', 'icon11', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_key.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440112', 'icon12', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_key_2.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440113', 'icon13', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_key_3.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440114', 'icon14', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_link.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440115', 'icon15', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_lock.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440116', 'icon16', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_lock_2.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440117', 'icon17', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_lock_3.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440118', 'icon18', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_lock_4.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440119', 'icon19', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_lock_5.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440120', 'icon20', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_lock_6.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440121', 'icon21', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_password_2.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440122', 'icon22', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_phonelock.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440123', 'icon23', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_pointer.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440124', 'icon24', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_pointlock.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440125', 'icon25', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_safelink.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440126', 'icon26', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_trend.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440127', 'icon27', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_txt.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440128', 'icon28', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_txtlock.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440129', 'icon29', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_unlock.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440130', 'icon30', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_unlock_2.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440131', 'icon31', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_unlock_3.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440132', 'icon32', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_unlock_4.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440133', 'icon33', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_videolock.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440134', 'icon34', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_wallet.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\nINSERT INTO `jimu_report_icon_lib` VALUES ('1967047795019440135', 'icon35', 'datasafe', 'https://jimureport.oss-cn-beijing.aliyuncs.com/designreport/iconlib/datasafe/icon_warning.png', 'admin', '2025-03-12 13:36:32', NULL, NULL, 1);\n\n-- ----------------------------\n-- Table structure for jimu_report_link\n-- ----------------------------\nDROP TABLE IF EXISTS `jimu_report_link`;\nCREATE TABLE `jimu_report_link`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键id',\n  `report_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '积木设计器id',\n  `parameter` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '参数',\n  `eject_type` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '弹出方式（0 当前页面 1 新窗口）',\n  `link_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '链接名称',\n  `api_method` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求方法0-get,1-post',\n  `link_type` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '链接方式(0 网络报表 1 网络连接 2 图表联动)',\n  `api_url` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '外网api',\n  `link_chart_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联动图表的ID',\n  `expression` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表达式',\n  `requirement` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '条件',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `uniq_link_reportid`(`report_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '超链接配置表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of jimu_report_link\n-- ----------------------------\nINSERT INTO `jimu_report_link` VALUES ('1080630642578849792', '1080630641874206720', '{\\\"main\\\":\\\"aa\\\",\\\"sub\\\":\\\"bb\\\",\\\"subReport\\\":[{\\\"mainField\\\":\\\"id\\\",\\\"subParam\\\":\\\"orderId\\\",\\\"tableIndex\\\":1}]}', NULL, '555', NULL, '4', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_link` VALUES ('907480951604711424', '907480464532770816', '{\\\"main\\\":\\\"aa\\\",\\\"sub\\\":\\\"bb\\\",\\\"subReport\\\":[{\\\"mainField\\\":\\\"id\\\",\\\"subParam\\\":\\\"orderId\\\",\\\"tableIndex\\\":1}]}', NULL, '555', NULL, '4', NULL, NULL, NULL, NULL);\nINSERT INTO `jimu_report_link` VALUES ('929546942631428096', '928540173805338624', '{\\\"main\\\":\\\"receipt\\\",\\\"sub\\\":\\\"receiptProject\\\",\\\"subReport\\\":[{\\\"mainField\\\":\\\"id\\\",\\\"subParam\\\":\\\"customId\\\",\\\"tableIndex\\\":1}]}', NULL, '收款明细', NULL, '4', NULL, NULL, NULL, NULL);\n\n-- ----------------------------\n-- Table structure for jimu_report_map\n-- ----------------------------\nDROP TABLE IF EXISTS `jimu_report_map`;\nCREATE TABLE `jimu_report_map`  (\n  `id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',\n  `label` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地图名称',\n  `name` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地图编码',\n  `data` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '地图数据',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  `del_flag` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '0表示未删除,1表示删除',\n  `sys_org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属部门',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uniq_jmreport_map_name`(`name`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '地图配置表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of jimu_report_map\n-- ----------------------------\nINSERT INTO `jimu_report_map` VALUES ('1067415154298224640', '河北省', '130000', '{\\\"type\\\":\\\"FeatureCollection\\\",\\\"features\\\":[{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"adcode\\\":130100,\\\"name\\\":\\\"石家庄市\\\",\\\"center\\\":[114.502461,38.045474],\\\"centroid\\\":[114.444982,38.133034],\\\"childrenNum\\\":22,\\\"level\\\":\\\"city\\\",\\\"parent\\\":{\\\"adcode\\\":130000},\\\"subFeatureIndex\\\":0,\\\"acroutes\\\":[100000,130000]},\\\"geometry\\\":{\\\"type\\\":\\\"MultiPolygon\\\",\\\"coordinates\\\":[[[[113.839548,38.758413],[113.802899,38.763321],[113.78041,38.728355],[113.775669,38.709836],[113.745363,38.701538],[113.729024,38.71196],[113.709995,38.698284],[113.713839,38.663684],[113.702114,38.65166],[113.667067,38.646943],[113.632596,38.653122],[113.612862,38.646013],[113.604212,38.616107],[113.602803,38.586854],[113.562053,38.558321],[113.557248,38.504016],[113.546548,38.493031],[113.583517,38.465992],[113.573202,38.449205],[113.538026,38.418017],[113.525468,38.383016],[113.53431,38.365208],[113.557248,38.34346],[113.546035,38.293067],[113.544818,38.270495],[113.566282,38.252393],[113.570318,38.237427],[113.598894,38.227136],[113.636761,38.232682],[113.657072,38.225599],[113.679112,38.205413],[113.711725,38.213702],[113.715057,38.193713],[113.738507,38.189501],[113.720631,38.174656],[113.731139,38.168369],[113.756575,38.171713],[113.796876,38.162884],[113.828848,38.168971],[113.83359,38.147431],[113.822505,38.150442],[113.810075,38.112566],[113.824235,38.106676],[113.854733,38.077082],[113.856015,38.065898],[113.876261,38.055047],[113.878376,38.032402],[113.872353,37.990375],[113.90125,37.98481],[113.922842,37.952082],[113.929185,37.932022],[113.956864,37.911419],[113.971536,37.868786],[113.970191,37.833923],[113.982557,37.812823],[114.006648,37.813495],[114.018821,37.794876],[114.043873,37.777463],[114.041182,37.756817],[114.000817,37.735358],[113.993769,37.706893],[114.068029,37.721564],[114.088275,37.708845],[114.128256,37.69821],[114.139725,37.675927],[114.131139,37.648315],[114.115378,37.619884],[114.118325,37.590634],[114.059635,37.515906],[114.036762,37.494175],[114.028304,37.474598],[114.022666,37.435496],[114.06899,37.447384],[114.096477,37.490935],[114.113263,37.493837],[114.126526,37.481957],[114.133766,37.498899],[114.156191,37.505244],[114.166123,37.528186],[114.184575,37.530817],[114.215009,37.51125],[114.255439,37.504096],[114.27293,37.494445],[114.303621,37.507808],[114.310861,37.499979],[114.334632,37.502949],[114.358274,37.519212],[114.370192,37.513612],[114.37269,37.52967],[114.412095,37.549907],[114.433495,37.552537],[114.483471,37.576814],[114.519927,37.574656],[114.585217,37.55301],[114.64679,37.556247],[114.680171,37.565283],[114.698816,37.589353],[114.707338,37.615774],[114.725983,37.630665],[114.764618,37.624399],[114.797423,37.628239],[114.808571,37.659832],[114.841504,37.676129],[114.847783,37.69673],[114.871041,37.702114],[114.881357,37.716113],[114.895965,37.712547],[114.904038,37.729302],[114.931846,37.728899],[114.960165,37.720084],[114.987524,37.742691],[115.001748,37.734685],[115.012512,37.75157],[115.041024,37.733541],[115.070049,37.745651],[115.068703,37.773428],[115.085298,37.779211],[115.072291,37.794136],[115.097215,37.797498],[115.097471,37.807849],[115.122972,37.811479],[115.131173,37.799783],[115.150523,37.808521],[115.160262,37.780287],[115.152765,37.759507],[115.172564,37.749351],[115.227281,37.732599],[115.243235,37.722641],[115.261431,37.68818],[115.253807,37.671415],[115.255088,37.645621],[115.258356,37.639625],[115.297376,37.629587],[115.301412,37.660169],[115.316853,37.660102],[115.325567,37.682458],[115.317046,37.695383],[115.333768,37.71322],[115.380989,37.707432],[115.394316,37.712143],[115.386179,37.727082],[115.360294,37.731994],[115.344468,37.74814],[115.371635,37.770335],[115.352349,37.784052],[115.349722,37.805765],[115.360166,37.820215],[115.363049,37.849845],[115.388614,37.853003],[115.389831,37.874629],[115.360294,37.880068],[115.365484,37.906318],[115.385795,37.917191],[115.408668,37.918936],[115.412769,37.943293],[115.448585,37.936584],[115.457555,37.95074],[115.456017,37.974551],[115.444997,37.989168],[115.464219,37.99299],[115.438205,38.001102],[115.45134,38.017323],[115.466782,38.063554],[115.482992,38.08398],[115.468063,38.095161],[115.439871,38.082038],[115.420522,38.089671],[115.383232,38.0886],[115.364843,38.13793],[115.346903,38.13967],[115.342418,38.196254],[115.35094,38.210493],[115.323645,38.220586],[115.324734,38.248184],[115.302758,38.235289],[115.273605,38.2403],[115.263994,38.260543],[115.265788,38.287658],[115.252205,38.29093],[115.225871,38.269894],[115.210174,38.236491],[115.19422,38.236759],[115.168591,38.259608],[115.152317,38.256802],[115.108107,38.264551],[115.085874,38.276773],[115.073765,38.293134],[115.056722,38.288326],[115.066204,38.264684],[115.056465,38.258472],[115.031862,38.267089],[114.989062,38.258138],[114.990087,38.272165],[114.970096,38.281114],[114.927681,38.283385],[114.915059,38.263348],[114.886162,38.265286],[114.883343,38.284854],[114.902565,38.294936],[114.906986,38.309624],[114.922875,38.315631],[114.942994,38.343193],[114.932871,38.344194],[114.923388,38.388217],[114.910381,38.393751],[114.882254,38.424149],[114.853998,38.435879],[114.858163,38.448605],[114.840992,38.460797],[114.837852,38.435745],[114.819143,38.449871],[114.830868,38.46033],[114.81075,38.492365],[114.765259,38.496626],[114.731237,38.48191],[114.702084,38.489102],[114.6737,38.473452],[114.651851,38.504682],[114.635257,38.514801],[114.595724,38.568897],[114.58432,38.596429],[114.56324,38.590644],[114.527616,38.590644],[114.552284,38.612983],[114.536907,38.632324],[114.53633,38.649268],[114.522106,38.65372],[114.498463,38.678297],[114.452652,38.699413],[114.437787,38.692773],[114.413504,38.703928],[114.366411,38.6862],[114.341167,38.690184],[114.311502,38.706517],[114.212831,38.688192],[114.182205,38.67657],[114.129153,38.669596],[114.125053,38.659632],[114.086097,38.65837],[114.052139,38.686399],[114.028624,38.688524],[113.991655,38.676769],[113.964617,38.699811],[113.929697,38.702467],[113.932324,38.71362],[113.883245,38.74667],[113.864664,38.746006],[113.839548,38.758413]]]]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"adcode\\\":130200,\\\"name\\\":\\\"唐山市\\\",\\\"center\\\":[118.175393,39.635113],\\\"centroid\\\":[118.343325,39.71703],\\\"childrenNum\\\":14,\\\"level\\\":\\\"city\\\",\\\"parent\\\":{\\\"adcode\\\":130000},\\\"subFeatureIndex\\\":1,\\\"acroutes\\\":[100000,130000]},\\\"geometry\\\":{\\\"type\\\":\\\"MultiPolygon\\\",\\\"coordinates\\\":[[[[119.319039,39.429554],[119.280403,39.422852],[119.257401,39.429752],[119.212295,39.463453],[119.185769,39.458986],[119.064545,39.473763],[119.048399,39.459052],[119.004894,39.467459],[119.015658,39.482103],[119.008098,39.509347],[118.961453,39.51591],[118.966067,39.529494],[118.983302,39.538942],[118.945243,39.544781],[118.938452,39.557572],[118.895139,39.547011],[118.882261,39.566557],[118.861309,39.574754],[118.844586,39.615004],[118.850097,39.622737],[118.824596,39.648681],[118.822225,39.668984],[118.804157,39.679985],[118.787242,39.71592],[118.774428,39.764198],[118.800185,39.775706],[118.797942,39.790415],[118.825429,39.799436],[118.816843,39.825836],[118.838179,39.847981],[118.835232,39.859018],[118.853556,39.88409],[118.859643,39.93362],[118.875149,39.941121],[118.884247,39.961794],[118.88508,40.005403],[118.865602,40.023777],[118.866307,40.061942],[118.900521,40.086549],[118.918269,40.092211],[118.92474,40.149653],[118.906736,40.169679],[118.888924,40.168768],[118.867652,40.180599],[118.849135,40.178974],[118.794482,40.204838],[118.775581,40.194182],[118.743609,40.191777],[118.746108,40.208087],[118.708562,40.216078],[118.665634,40.242577],[118.628472,40.249915],[118.571384,40.269845],[118.568949,40.287564],[118.533325,40.298854],[118.532364,40.319419],[118.539989,40.361048],[118.558377,40.36928],[118.550881,40.385482],[118.571512,40.414636],[118.548062,40.422667],[118.523458,40.40628],[118.503211,40.403365],[118.45599,40.414053],[118.430746,40.411851],[118.402683,40.416838],[118.387305,40.436719],[118.360011,40.428819],[118.356295,40.435295],[118.306575,40.419558],[118.277935,40.425711],[118.262942,40.452063],[118.239684,40.464686],[118.173818,40.423056],[118.156967,40.423768],[118.153123,40.409519],[118.165232,40.400449],[118.133837,40.375113],[118.121856,40.354695],[118.079312,40.353528],[118.061564,40.319095],[118.031643,40.302358],[118.000888,40.29256],[117.909457,40.285876],[117.897989,40.270429],[117.867554,40.26965],[117.844104,40.261406],[117.807775,40.261926],[117.75152,40.229718],[117.714551,40.241668],[117.694112,40.238161],[117.677069,40.22095],[117.64625,40.205163],[117.619532,40.206398],[117.609409,40.194897],[117.575451,40.192817],[117.576412,40.178584],[117.601208,40.171239],[117.630232,40.147833],[117.635999,40.132094],[117.650159,40.128191],[117.65317,40.110757],[117.644841,40.096181],[117.668099,40.100931],[117.67489,40.082123],[117.708272,40.093643],[117.721983,40.07991],[117.751648,40.081993],[117.758184,40.065978],[117.776188,40.059272],[117.758312,40.04436],[117.747932,40.047421],[117.744152,40.018434],[117.782467,40.023516],[117.797075,40.010225],[117.782019,39.968315],[117.756326,39.96512],[117.72775,39.972422],[117.70667,39.986046],[117.674698,39.974834],[117.634589,39.968901],[117.589226,39.996866],[117.537777,39.997452],[117.547323,39.976855],[117.532907,39.952469],[117.514967,39.946665],[117.525539,39.92964],[117.507406,39.909023],[117.518811,39.891271],[117.521374,39.870641],[117.548092,39.839882],[117.537264,39.835178],[117.561419,39.800024],[117.546106,39.776164],[117.559305,39.756088],[117.59589,39.746147],[117.596082,39.735222],[117.577629,39.726913],[117.602425,39.705384],[117.644777,39.701849],[117.643944,39.688692],[117.657014,39.668657],[117.668355,39.667085],[117.662012,39.636365],[117.641957,39.628438],[117.641189,39.612645],[117.619084,39.603207],[117.621967,39.59167],[117.636191,39.603731],[117.660795,39.57541],[117.68495,39.588916],[117.708913,39.572918],[117.688794,39.569246],[117.689563,39.559539],[117.710194,39.550422],[117.71596,39.530084],[117.744857,39.548585],[117.737745,39.574033],[117.753122,39.576],[117.747868,39.589375],[117.76773,39.599012],[117.801945,39.601765],[117.826548,39.590818],[117.851408,39.589244],[117.868259,39.596849],[117.892607,39.591539],[117.933997,39.574164],[117.905293,39.53015],[117.912277,39.516172],[117.898565,39.509675],[117.898181,39.472516],[117.878062,39.467196],[117.87031,39.45498],[117.871847,39.411547],[117.859353,39.403265],[117.852369,39.38078],[117.805277,39.373284],[117.803354,39.362037],[117.837056,39.350789],[117.862877,39.362169],[117.842054,39.336512],[117.84955,39.327366],[117.888314,39.332038],[117.891774,39.32322],[117.972248,39.314401],[117.97763,39.300643],[118.016842,39.284117],[118.024787,39.292414],[118.036512,39.265151],[118.064768,39.256061],[118.064768,39.231222],[118.037089,39.230497],[118.026196,39.20176],[118.050864,39.200112],[118.07047,39.214021],[118.07771,39.202024],[118.125316,39.182771],[118.16299,39.136596],[118.182596,39.094155],[118.225011,39.034839],[118.267107,39.021555],[118.290813,39.022216],[118.309907,39.011773],[118.373594,39.012037],[118.371031,38.984137],[118.378015,38.97177],[118.406463,38.960525],[118.491038,38.909041],[118.525252,38.90487],[118.539732,38.909835],[118.604445,38.971505],[118.570487,38.999212],[118.532877,39.091051],[118.551394,39.088278],[118.560107,39.09904],[118.588619,39.107623],[118.578752,39.130921],[118.59272,39.142601],[118.637314,39.157379],[118.692992,39.148077],[118.719646,39.136992],[118.760716,39.133495],[118.814409,39.138642],[118.857913,39.162854],[118.876366,39.14999],[118.897253,39.151508],[118.920447,39.171758],[118.951074,39.178485],[118.896549,39.139698],[118.890013,39.118844],[118.926278,39.123464],[118.977984,39.163381],[119.023988,39.186925],[119.038276,39.21178],[119.096068,39.241963],[119.121505,39.281549],[119.185577,39.342039],[119.239269,39.352368],[119.272779,39.363616],[119.317052,39.410759],[119.319039,39.429554]]],[[[117.784581,39.377032],[117.782147,39.394785],[117.737296,39.410562],[117.69975,39.407604],[117.702313,39.388934],[117.673224,39.386698],[117.669124,39.412008],[117.643495,39.405829],[117.61415,39.407078],[117.6014,39.4195],[117.590636,39.405435],[117.571158,39.404646],[117.557895,39.38558],[117.535342,39.374007],[117.520862,39.357236],[117.536239,39.338026],[117.595249,39.349144],[117.637536,39.335986],[117.650799,39.315191],[117.669316,39.324141],[117.670982,39.357828],[117.706221,39.351513],[117.744601,39.354604],[117.784581,39.377032]]],[[[118.630522,39.054726],[118.640005,39.042306],[118.653652,39.056973],[118.638852,39.076061],[118.620847,39.068268],[118.630522,39.054726]]],[[[118.869446,39.142733],[118.842664,39.117788],[118.820239,39.108745],[118.820495,39.093693],[118.857465,39.098842],[118.871753,39.115082],[118.869446,39.142733]]],[[[118.83914,39.153817],[118.815177,39.132373],[118.825749,39.122672],[118.841511,39.135475],[118.83914,39.153817]]]]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"adcode\\\":130300,\\\"name\\\":\\\"秦皇岛市\\\",\\\"center\\\":[119.586579,39.942531],\\\"centroid\\\":[119.193332,40.088346],\\\"childrenNum\\\":7,\\\"level\\\":\\\"city\\\",\\\"parent\\\":{\\\"adcode\\\":130000},\\\"subFeatureIndex\\\":2,\\\"acroutes\\\":[100000,130000]},\\\"geometry\\\":{\\\"type\\\":\\\"MultiPolygon\\\",\\\"coordinates\\\":[[[[119.319039,39.429554],[119.304238,39.459972],[119.270024,39.498582],[119.31276,39.605894],[119.334928,39.656148],[119.358122,39.721744],[119.3735,39.739671],[119.395925,39.74425],[119.396886,39.761124],[119.464738,39.809239],[119.506641,39.816493],[119.53778,39.810154],[119.537652,39.831259],[119.520352,39.838183],[119.541048,39.888138],[119.559564,39.901518],[119.587948,39.909936],[119.612936,39.898907],[119.637027,39.923182],[119.666436,39.92018],[119.674317,39.933424],[119.683543,39.921942],[119.726279,39.941056],[119.787212,39.950382],[119.816877,39.978224],[119.836739,39.985786],[119.835522,39.964468],[119.862432,39.951556],[119.872363,39.960621],[119.841032,40.011789],[119.854231,40.03231],[119.835009,40.050286],[119.817069,40.052826],[119.795285,40.040387],[119.770873,40.048788],[119.76043,40.065653],[119.771578,40.082253],[119.736723,40.104836],[119.76248,40.144776],[119.755496,40.153165],[119.745949,40.207957],[119.716797,40.196066],[119.676239,40.224522],[119.671562,40.23959],[119.625174,40.224132],[119.633503,40.249395],[119.651892,40.272377],[119.642153,40.291327],[119.621458,40.30359],[119.598136,40.334206],[119.599801,40.356575],[119.586667,40.375437],[119.600442,40.406863],[119.593458,40.435683],[119.604927,40.454976],[119.553542,40.501762],[119.555464,40.516833],[119.568855,40.520778],[119.571033,40.540887],[119.534256,40.554203],[119.520288,40.547416],[119.503886,40.553945],[119.491007,40.536167],[119.477809,40.533322],[119.441864,40.539852],[119.361839,40.537331],[119.338068,40.531253],[119.302188,40.530283],[119.25612,40.543279],[119.220624,40.569133],[119.232862,40.589421],[119.230812,40.603891],[119.178209,40.609316],[119.162575,40.600015],[119.158474,40.614418],[119.105487,40.603632],[119.086394,40.588775],[119.063392,40.606151],[119.013095,40.577081],[118.998359,40.578955],[118.983366,40.56364],[118.952676,40.558469],[118.966003,40.536102],[118.919038,40.53093],[118.886938,40.542438],[118.864,40.527244],[118.821328,40.531964],[118.794867,40.510753],[118.792112,40.492382],[118.772954,40.479765],[118.723491,40.473746],[118.702795,40.491411],[118.657176,40.450574],[118.624179,40.437626],[118.618349,40.425193],[118.643785,40.380946],[118.640197,40.354566],[118.608225,40.328305],[118.596949,40.308456],[118.580098,40.305861],[118.568949,40.287564],[118.571384,40.269845],[118.628472,40.249915],[118.665634,40.242577],[118.708562,40.216078],[118.746108,40.208087],[118.743609,40.191777],[118.775581,40.194182],[118.794482,40.204838],[118.849135,40.178974],[118.867652,40.180599],[118.888924,40.168768],[118.906736,40.169679],[118.92474,40.149653],[118.918269,40.092211],[118.900521,40.086549],[118.866307,40.061942],[118.865602,40.023777],[118.88508,40.005403],[118.884247,39.961794],[118.875149,39.941121],[118.859643,39.93362],[118.853556,39.88409],[118.835232,39.859018],[118.838179,39.847981],[118.816843,39.825836],[118.825429,39.799436],[118.797942,39.790415],[118.800185,39.775706],[118.774428,39.764198],[118.787242,39.71592],[118.804157,39.679985],[118.822225,39.668984],[118.824596,39.648681],[118.850097,39.622737],[118.844586,39.615004],[118.861309,39.574754],[118.882261,39.566557],[118.895139,39.547011],[118.938452,39.557572],[118.945243,39.544781],[118.983302,39.538942],[118.966067,39.529494],[118.961453,39.51591],[119.008098,39.509347],[119.015658,39.482103],[119.004894,39.467459],[119.048399,39.459052],[119.064545,39.473763],[119.185769,39.458986],[119.212295,39.463453],[119.257401,39.429752],[119.280403,39.422852],[119.319039,39.429554]]]]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"adcode\\\":130400,\\\"name\\\":\\\"邯郸市\\\",\\\"center\\\":[114.490686,36.612273],\\\"centroid\\\":[114.548854,36.553496],\\\"childrenNum\\\":18,\\\"level\\\":\\\"city\\\",\\\"parent\\\":{\\\"adcode\\\":130000},\\\"subFeatureIndex\\\":3,\\\"acroutes\\\":[100000,130000]},\\\"geometry\\\":{\\\"type\\\":\\\"MultiPolygon\\\",\\\"coordinates\\\":[[[[115.478314,36.754699],[115.463386,36.752177],[115.423661,36.766081],[115.390664,36.76315],[115.362921,36.771056],[115.349786,36.786796],[115.335691,36.775826],[115.323004,36.815474],[115.307499,36.837129],[115.325567,36.869667],[115.283344,36.862589],[115.200563,36.868374],[115.176856,36.854353],[115.158916,36.852038],[115.170449,36.881509],[115.16622,36.901512],[115.143219,36.899131],[115.125086,36.90607],[115.106505,36.923958],[115.125022,36.936471],[115.111631,36.958431],[115.096702,36.964549],[115.0589,36.957004],[115.02161,36.961422],[114.985602,36.950477],[114.949593,36.948778],[114.892441,36.969647],[114.862712,36.969715],[114.836314,36.958024],[114.838172,36.950885],[114.787492,36.91396],[114.772691,36.928447],[114.74341,36.932323],[114.734568,36.942931],[114.718166,36.938103],[114.707145,36.918041],[114.671073,36.917429],[114.64884,36.89845],[114.56702,36.891307],[114.551707,36.884094],[114.555231,36.845979],[114.507754,36.827936],[114.478921,36.833248],[114.462327,36.847681],[114.421193,36.839444],[114.353533,36.852038],[114.336105,36.846728],[114.304518,36.857007],[114.299969,36.845435],[114.252684,36.856531],[114.225902,36.843052],[114.182653,36.843937],[114.100449,36.839035],[114.081548,36.845094],[114.090005,36.861023],[114.063672,36.879331],[114.028176,36.881236],[113.991078,36.914913],[113.984415,36.941503],[113.941743,36.983376],[113.901185,36.99683],[113.883886,37.010893],[113.859475,37.015037],[113.828784,37.012048],[113.794954,36.994995],[113.777463,36.96856],[113.761701,36.956052],[113.79284,36.894709],[113.786945,36.870076],[113.772337,36.871165],[113.742095,36.851085],[113.731908,36.859118],[113.731587,36.87865],[113.710508,36.88736],[113.696924,36.882257],[113.676293,36.855646],[113.68411,36.824804],[113.673923,36.807505],[113.68097,36.790134],[113.65579,36.785706],[113.599984,36.752927],[113.569165,36.758107],[113.549303,36.752313],[113.536232,36.732339],[113.499391,36.740589],[113.47767,36.726407],[113.465369,36.70779],[113.477542,36.697287],[113.507015,36.704858],[113.502018,36.681528],[113.47703,36.655189],[113.486833,36.635189],[113.535463,36.62925],[113.545266,36.616892],[113.539756,36.594082],[113.569678,36.585885],[113.58813,36.562725],[113.588707,36.548101],[113.547317,36.534362],[113.559939,36.52862],[113.554428,36.494706],[113.582108,36.482942],[113.587233,36.460982],[113.6292,36.454687],[113.670206,36.425122],[113.708329,36.423342],[113.729601,36.381642],[113.73242,36.357599],[113.755166,36.365956],[113.764392,36.355612],[113.797581,36.347184],[113.818212,36.331149],[113.855951,36.329367],[113.85358,36.35013],[113.881515,36.353899],[113.901121,36.336974],[113.911181,36.314767],[113.93162,36.319497],[113.934439,36.336151],[113.957248,36.33622],[113.952763,36.358147],[113.964232,36.352597],[113.983005,36.317166],[113.993833,36.314561],[113.994474,36.344169],[113.979802,36.344101],[113.985824,36.357599],[114.010684,36.342456],[114.023691,36.354995],[114.032276,36.347527],[114.026254,36.325117],[114.055727,36.329983],[114.061557,36.317989],[114.04272,36.297011],[114.060532,36.276507],[114.085328,36.270129],[114.092632,36.27781],[114.12108,36.272735],[114.130627,36.279662],[114.17663,36.263132],[114.168878,36.243443],[114.203028,36.24557],[114.211037,36.273009],[114.223723,36.270883],[114.235577,36.252774],[114.256464,36.264024],[114.290102,36.247148],[114.328353,36.248177],[114.345139,36.255792],[114.356096,36.230337],[114.39236,36.221141],[114.408442,36.224573],[114.417541,36.205904],[114.466171,36.197735],[114.480267,36.177823],[114.53287,36.171505],[114.55805,36.150763],[114.586883,36.140939],[114.58259,36.121356],[114.610845,36.128297],[114.630387,36.124243],[114.655183,36.140252],[114.691128,36.138397],[114.692409,36.146229],[114.720665,36.140046],[114.73444,36.155777],[114.771345,36.124517],[114.77865,36.133175],[114.825166,36.123693],[114.857458,36.127747],[114.858675,36.144305],[114.879435,36.147809],[114.912432,36.140458],[114.90705,36.117233],[114.926463,36.089464],[114.914674,36.051988],[114.920184,36.048205],[114.954591,36.067806],[114.998416,36.069732],[115.045893,36.112216],[115.048456,36.162027],[115.06268,36.178235],[115.104583,36.172192],[115.110414,36.199382],[115.142834,36.209679],[115.170705,36.191006],[115.189222,36.195538],[115.20178,36.212768],[115.242146,36.191212],[115.260406,36.171574],[115.279307,36.137847],[115.302181,36.127678],[115.297247,36.109123],[115.313073,36.088227],[115.341393,36.087608],[115.369264,36.102731],[115.377914,36.128503],[115.39265,36.12919],[115.404632,36.15564],[115.415716,36.137572],[115.431286,36.149183],[115.449674,36.150144],[115.451276,36.16972],[115.463898,36.171299],[115.469985,36.152892],[115.483568,36.148976],[115.475944,36.193066],[115.47652,36.246531],[115.465372,36.250373],[115.462681,36.276096],[115.436347,36.27637],[115.417062,36.29276],[115.422956,36.32217],[115.394637,36.322581],[115.366637,36.30894],[115.359782,36.318743],[115.368688,36.342593],[115.349594,36.363079],[115.339983,36.398078],[115.29744,36.413484],[115.312048,36.433541],[115.317046,36.454003],[115.300259,36.465908],[115.291417,36.460572],[115.272836,36.497373],[115.296479,36.508862],[115.288341,36.528484],[115.307435,36.527458],[115.33127,36.550219],[115.334281,36.58247],[115.355104,36.627407],[115.366061,36.621945],[115.388229,36.647203],[115.386756,36.656827],[115.406426,36.663242],[115.420586,36.686781],[115.446663,36.694626],[115.450507,36.713656],[115.478314,36.754699]]]]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"adcode\\\":130500,\\\"name\\\":\\\"邢台市\\\",\\\"center\\\":[114.508851,37.0682],\\\"centroid\\\":[114.822676,37.213788],\\\"childrenNum\\\":18,\\\"level\\\":\\\"city\\\",\\\"parent\\\":{\\\"adcode\\\":130000},\\\"subFeatureIndex\\\":4,\\\"acroutes\\\":[100000,130000]},\\\"geometry\\\":{\\\"type\\\":\\\"MultiPolygon\\\",\\\"coordinates\\\":[[[[115.255088,37.645621],[115.253807,37.671415],[115.261431,37.68818],[115.243235,37.722641],[115.227281,37.732599],[115.172564,37.749351],[115.152765,37.759507],[115.160262,37.780287],[115.150523,37.808521],[115.131173,37.799783],[115.122972,37.811479],[115.097471,37.807849],[115.097215,37.797498],[115.072291,37.794136],[115.085298,37.779211],[115.068703,37.773428],[115.070049,37.745651],[115.041024,37.733541],[115.012512,37.75157],[115.001748,37.734685],[114.987524,37.742691],[114.960165,37.720084],[114.931846,37.728899],[114.904038,37.729302],[114.895965,37.712547],[114.881357,37.716113],[114.871041,37.702114],[114.847783,37.69673],[114.841504,37.676129],[114.808571,37.659832],[114.797423,37.628239],[114.764618,37.624399],[114.725983,37.630665],[114.707338,37.615774],[114.698816,37.589353],[114.680171,37.565283],[114.64679,37.556247],[114.585217,37.55301],[114.519927,37.574656],[114.483471,37.576814],[114.433495,37.552537],[114.412095,37.549907],[114.37269,37.52967],[114.370192,37.513612],[114.358274,37.519212],[114.334632,37.502949],[114.310861,37.499979],[114.303621,37.507808],[114.27293,37.494445],[114.255439,37.504096],[114.215009,37.51125],[114.184575,37.530817],[114.166123,37.528186],[114.156191,37.505244],[114.133766,37.498899],[114.126526,37.481957],[114.113263,37.493837],[114.096477,37.490935],[114.06899,37.447384],[114.022666,37.435496],[113.973907,37.403133],[113.959811,37.348982],[113.921176,37.33072],[113.902147,37.30995],[113.899007,37.279495],[113.886897,37.25993],[113.886449,37.23914],[113.853067,37.215093],[113.836601,37.18948],[113.831924,37.167518],[113.77317,37.151857],[113.767339,37.144601],[113.77349,37.106956],[113.758177,37.075672],[113.768749,37.062504],[113.788227,37.059788],[113.790149,37.04295],[113.771888,37.016803],[113.794954,36.994995],[113.828784,37.012048],[113.859475,37.015037],[113.883886,37.010893],[113.901185,36.99683],[113.941743,36.983376],[113.984415,36.941503],[113.991078,36.914913],[114.028176,36.881236],[114.063672,36.879331],[114.090005,36.861023],[114.081548,36.845094],[114.100449,36.839035],[114.182653,36.843937],[114.225902,36.843052],[114.252684,36.856531],[114.299969,36.845435],[114.304518,36.857007],[114.336105,36.846728],[114.353533,36.852038],[114.421193,36.839444],[114.462327,36.847681],[114.478921,36.833248],[114.507754,36.827936],[114.555231,36.845979],[114.551707,36.884094],[114.56702,36.891307],[114.64884,36.89845],[114.671073,36.917429],[114.707145,36.918041],[114.718166,36.938103],[114.734568,36.942931],[114.74341,36.932323],[114.772691,36.928447],[114.787492,36.91396],[114.838172,36.950885],[114.836314,36.958024],[114.862712,36.969715],[114.892441,36.969647],[114.949593,36.948778],[114.985602,36.950477],[115.02161,36.961422],[115.0589,36.957004],[115.096702,36.964549],[115.111631,36.958431],[115.125022,36.936471],[115.106505,36.923958],[115.125086,36.90607],[115.143219,36.899131],[115.16622,36.901512],[115.170449,36.881509],[115.158916,36.852038],[115.176856,36.854353],[115.200563,36.868374],[115.283344,36.862589],[115.325567,36.869667],[115.307499,36.837129],[115.323004,36.815474],[115.335691,36.775826],[115.349786,36.786796],[115.362921,36.771056],[115.390664,36.76315],[115.423661,36.766081],[115.463386,36.752177],[115.478314,36.754699],[115.502918,36.77017],[115.523613,36.763832],[115.538734,36.784139],[115.572116,36.775349],[115.637405,36.797492],[115.66502,36.812477],[115.684177,36.812954],[115.688598,36.83958],[115.71128,36.882393],[115.740561,36.90641],[115.757796,36.903008],[115.772789,36.936811],[115.796816,36.968763],[115.784322,36.970735],[115.776441,36.992073],[115.80963,37.011436],[115.812385,37.028961],[115.853904,37.059245],[115.827378,37.106006],[115.786564,37.123916],[115.76997,37.14155],[115.756322,37.209876],[115.698465,37.257153],[115.675784,37.258914],[115.67258,37.275839],[115.63292,37.277058],[115.623437,37.297905],[115.599859,37.301965],[115.590632,37.312453],[115.599218,37.332884],[115.577177,37.316107],[115.52938,37.326864],[115.520089,37.353648],[115.506634,37.368997],[115.468768,37.382788],[115.428595,37.387926],[115.391049,37.42793],[115.345109,37.448195],[115.360038,37.461431],[115.404183,37.462039],[115.431478,37.469602],[115.410719,37.476421],[115.417638,37.487762],[115.397968,37.497347],[115.402069,37.51017],[115.426096,37.506256],[115.421675,37.495727],[115.455313,37.501802],[115.430965,37.506796],[115.410078,37.523261],[115.405785,37.535944],[115.377914,37.541138],[115.359461,37.558675],[115.360871,37.523935],[115.307179,37.563935],[115.282575,37.576005],[115.237276,37.575465],[115.201908,37.555977],[115.188325,37.563125],[115.200563,37.572498],[115.172756,37.600543],[115.191593,37.608833],[115.202934,37.637133],[115.227858,37.648921],[115.255088,37.645621]]]]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"adcode\\\":130600,\\\"name\\\":\\\"保定市\\\",\\\"center\\\":[115.482331,38.867657],\\\"centroid\\\":[115.177642,39.025137],\\\"childrenNum\\\":24,\\\"level\\\":\\\"city\\\",\\\"parent\\\":{\\\"adcode\\\":130000},\\\"subFeatureIndex\\\":5,\\\"acroutes\\\":[100000,130000]},\\\"geometry\\\":{\\\"type\\\":\\\"MultiPolygon\\\",\\\"coordinates\\\":[[[[115.324734,38.248184],[115.34953,38.248117],[115.356194,38.271764],[115.369072,38.283451],[115.393611,38.285588],[115.383104,38.299076],[115.381822,38.327578],[115.402453,38.320103],[115.420906,38.337922],[115.462104,38.327311],[115.478122,38.341658],[115.495101,38.342993],[115.494781,38.362006],[115.516822,38.357337],[115.516437,38.318168],[115.547704,38.318168],[115.550908,38.332917],[115.575768,38.326377],[115.57942,38.342859],[115.590504,38.332784],[115.644965,38.32611],[115.650155,38.340791],[115.699811,38.349932],[115.705321,38.367543],[115.731462,38.392618],[115.715957,38.438411],[115.718584,38.449205],[115.745686,38.481311],[115.770418,38.48817],[115.79137,38.512005],[115.816101,38.52545],[115.875047,38.510141],[115.869345,38.524652],[115.878507,38.535566],[115.890809,38.52585],[115.940721,38.530508],[115.934058,38.546678],[115.960583,38.584394],[115.96321,38.613182],[115.951101,38.627938],[115.973398,38.635514],[115.973526,38.668467],[115.959879,38.679891],[115.955009,38.702932],[115.966286,38.708973],[115.944053,38.735456],[115.95187,38.746736],[115.995118,38.77798],[115.999731,38.796812],[116.023054,38.812524],[116.04093,38.812259],[116.035548,38.829492],[116.048746,38.8607],[116.04157,38.878451],[116.045543,38.897786],[116.085524,38.91063],[116.112754,38.909703],[116.125633,38.920823],[116.121083,38.934391],[116.15203,38.948352],[116.209503,38.921618],[116.230262,38.92453],[116.228083,38.942199],[116.243653,38.949345],[116.253007,38.932074],[116.291386,38.948683],[116.298755,38.975076],[116.316182,38.962708],[116.33534,38.984004],[116.3215,38.998088],[116.299588,38.993658],[116.293757,39.007344],[116.307148,39.032196],[116.318617,39.037416],[116.317592,39.077911],[116.305354,39.098116],[116.28184,39.107623],[116.263131,39.127292],[116.262426,39.138114],[116.221804,39.147813],[116.207837,39.168526],[116.206555,39.207429],[116.186116,39.222457],[116.201109,39.251911],[116.208734,39.330195],[116.198226,39.351315],[116.13582,39.351842],[116.116791,39.376243],[116.133001,39.4055],[116.132104,39.429423],[116.151325,39.471005],[116.179901,39.486568],[116.182144,39.49635],[116.220843,39.511644],[116.222766,39.501995],[116.244678,39.517354],[116.246152,39.557178],[116.221164,39.578951],[116.19688,39.588982],[116.151774,39.583409],[116.149595,39.573049],[116.121468,39.574951],[116.036188,39.571672],[116.026193,39.587409],[115.995182,39.577049],[115.991018,39.593768],[115.978459,39.595669],[115.978139,39.572852],[115.959558,39.560851],[115.937966,39.577442],[115.923742,39.597308],[115.910223,39.600847],[115.915605,39.58295],[115.907852,39.566885],[115.89004,39.567869],[115.882992,39.548126],[115.855506,39.555014],[115.846023,39.543272],[115.819241,39.53074],[115.82033,39.509741],[115.752542,39.515385],[115.738574,39.546289],[115.71711,39.560392],[115.692058,39.56577],[115.697889,39.579344],[115.685331,39.603666],[115.667134,39.615594],[115.664507,39.604649],[115.633176,39.597701],[115.61844,39.604059],[115.587044,39.589965],[115.545974,39.61874],[115.515925,39.591211],[115.513041,39.611727],[115.523421,39.620378],[115.52246,39.639969],[115.506698,39.652153],[115.478507,39.650319],[115.491065,39.66846],[115.499266,39.69622],[115.482351,39.742483],[115.466717,39.740456],[115.439871,39.752099],[115.434105,39.782309],[115.457171,39.781982],[115.483761,39.798717],[115.505289,39.784597],[115.55488,39.795579],[115.569168,39.814206],[115.514323,39.837726],[115.526625,39.875538],[115.51003,39.881479],[115.523037,39.898907],[115.487285,39.923834],[115.480685,39.935838],[115.438462,39.952534],[115.426801,39.950056],[115.40162,39.903802],[115.399891,39.891336],[115.364523,39.885331],[115.365676,39.867507],[115.343251,39.837857],[115.345237,39.821851],[115.330052,39.80656],[115.342867,39.79205],[115.312945,39.783551],[115.283216,39.745165],[115.250859,39.73882],[115.215043,39.708067],[115.177625,39.700475],[115.179163,39.679592],[115.168847,39.672651],[115.138734,39.688627],[115.095293,39.704795],[115.050058,39.709245],[115.03199,39.702373],[115.011487,39.674746],[114.987396,39.67802],[114.961895,39.666103],[114.936331,39.66368],[114.891032,39.634728],[114.838429,39.589179],[114.821642,39.61022],[114.783775,39.609499],[114.760645,39.617036],[114.716756,39.618674],[114.712079,39.594358],[114.680748,39.588064],[114.654991,39.599209],[114.633527,39.555866],[114.604887,39.567869],[114.58432,39.585835],[114.563432,39.558162],[114.557345,39.531987],[114.536586,39.512891],[114.532678,39.486174],[114.502308,39.477112],[114.496798,39.438556],[114.470913,39.408787],[114.469503,39.355196],[114.47969,39.351118],[114.46662,39.329669],[114.438236,39.319139],[114.425101,39.285105],[114.437018,39.25942],[114.415939,39.242885],[114.436314,39.229641],[114.467389,39.225884],[114.475974,39.215867],[114.469695,39.193321],[114.453165,39.192662],[114.443618,39.174132],[114.417989,39.171626],[114.388196,39.176968],[114.360773,39.133957],[114.369679,39.107557],[114.349176,39.076788],[114.320215,39.070712],[114.300097,39.079231],[114.22635,39.066485],[114.197005,39.050432],[114.180923,39.049111],[114.157217,39.061134],[114.126654,39.050895],[114.108714,39.052282],[114.096797,39.083722],[114.078793,39.095343],[114.065274,39.093494],[114.050793,39.13587],[114.006456,39.12287],[113.995115,39.095475],[113.961733,39.100823],[113.942896,39.08742],[113.930274,39.063446],[113.898046,39.067607],[113.884399,39.051688],[113.830514,39.011773],[113.806808,38.989691],[113.776758,38.98698],[113.767532,38.959665],[113.775156,38.919103],[113.776181,38.885669],[113.801297,38.85487],[113.83564,38.842547],[113.855566,38.828962],[113.853644,38.810138],[113.836537,38.79595],[113.839548,38.758413],[113.864664,38.746006],[113.883245,38.74667],[113.932324,38.71362],[113.929697,38.702467],[113.964617,38.699811],[113.991655,38.676769],[114.028624,38.688524],[114.052139,38.686399],[114.086097,38.65837],[114.125053,38.659632],[114.129153,38.669596],[114.182205,38.67657],[114.212831,38.688192],[114.311502,38.706517],[114.341167,38.690184],[114.366411,38.6862],[114.413504,38.703928],[114.437787,38.692773],[114.452652,38.699413],[114.498463,38.678297],[114.522106,38.65372],[114.53633,38.649268],[114.536907,38.632324],[114.552284,38.612983],[114.527616,38.590644],[114.56324,38.590644],[114.58432,38.596429],[114.595724,38.568897],[114.635257,38.514801],[114.651851,38.504682],[114.6737,38.473452],[114.702084,38.489102],[114.731237,38.48191],[114.765259,38.496626],[114.81075,38.492365],[114.830868,38.46033],[114.819143,38.449871],[114.837852,38.435745],[114.840992,38.460797],[114.858163,38.448605],[114.853998,38.435879],[114.882254,38.424149],[114.910381,38.393751],[114.923388,38.388217],[114.932871,38.344194],[114.942994,38.343193],[114.922875,38.315631],[114.906986,38.309624],[114.902565,38.294936],[114.883343,38.284854],[114.886162,38.265286],[114.915059,38.263348],[114.927681,38.283385],[114.970096,38.281114],[114.990087,38.272165],[114.989062,38.258138],[115.031862,38.267089],[115.056465,38.258472],[115.066204,38.264684],[115.056722,38.288326],[115.073765,38.293134],[115.085874,38.276773],[115.108107,38.264551],[115.152317,38.256802],[115.168591,38.259608],[115.19422,38.236759],[115.210174,38.236491],[115.225871,38.269894],[115.252205,38.29093],[115.265788,38.287658],[115.263994,38.260543],[115.273605,38.2403],[115.302758,38.235289],[115.324734,38.248184]]]]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"adcode\\\":130700,\\\"name\\\":\\\"张家口市\\\",\\\"center\\\":[114.884091,40.811901],\\\"centroid\\\":[115.038685,40.874645],\\\"childrenNum\\\":16,\\\"level\\\":\\\"city\\\",\\\"parent\\\":{\\\"adcode\\\":130000},\\\"subFeatureIndex\\\":6,\\\"acroutes\\\":[100000,130000]},\\\"geometry\\\":{\\\"type\\\":\\\"MultiPolygon\\\",\\\"coordinates\\\":[[[[116.365069,40.943216],[116.341747,40.964804],[116.333546,40.984458],[116.29837,40.986641],[116.264733,41.038252],[116.296128,41.062118],[116.277419,41.083154],[116.268769,41.102645],[116.245447,41.114183],[116.233273,41.130845],[116.245895,41.16358],[116.22347,41.174275],[116.221356,41.185928],[116.235195,41.211853],[116.213603,41.233288],[116.198995,41.259578],[116.191627,41.288158],[116.209503,41.307715],[116.203352,41.326117],[116.17484,41.356328],[116.141586,41.373439],[116.08751,41.376951],[116.07713,41.384866],[116.036124,41.397694],[116.03023,41.416645],[116.004473,41.432911],[116.000052,41.454402],[115.97673,41.470913],[115.982112,41.485127],[115.97391,41.529659],[115.958789,41.550353],[115.924767,41.568623],[115.929252,41.596113],[115.909967,41.642921],[115.972885,41.680101],[116.014404,41.715355],[116.056307,41.733705],[116.081039,41.776352],[116.083986,41.781745],[116.03401,41.782633],[116.016646,41.77705],[115.994926,41.828608],[115.978588,41.840841],[115.946936,41.885634],[115.916374,41.945141],[115.853071,41.927738],[115.828852,41.936978],[115.815461,41.928687],[115.810976,41.912356],[115.795855,41.911153],[115.756707,41.886774],[115.727874,41.888421],[115.724415,41.868025],[115.68815,41.867708],[115.659382,41.848319],[115.653871,41.829052],[115.630806,41.824995],[115.598641,41.808003],[115.574102,41.805403],[115.548345,41.783902],[115.519769,41.767787],[115.488758,41.760934],[115.430068,41.728753],[115.366317,41.712561],[115.347031,41.712307],[115.319032,41.691473],[115.336844,41.675145],[115.355489,41.672158],[115.360935,41.661355],[115.345494,41.635673],[115.377594,41.602475],[115.365099,41.595795],[115.311535,41.592677],[115.290328,41.622955],[115.273477,41.622764],[115.26425,41.611889],[115.266429,41.592868],[115.257587,41.581097],[115.204215,41.571423],[115.205753,41.591723],[115.195053,41.602093],[115.167246,41.605973],[115.142386,41.616087],[115.113489,41.615769],[115.099137,41.623973],[115.087796,41.613415],[115.055953,41.602284],[115.025006,41.61526],[114.977849,41.611571],[114.938317,41.613225],[114.89808,41.607182],[114.877449,41.590896],[114.860726,41.600948],[114.895581,41.636436],[114.902885,41.689313],[114.895068,41.736561],[114.896157,41.76766],[114.8663,41.804578],[114.922363,41.825121],[114.939214,41.846165],[114.92153,41.875943],[114.925438,41.899566],[114.916148,41.936978],[114.933255,41.943559],[114.915507,41.958934],[114.916853,41.981008],[114.901796,42.015528],[114.89148,42.012115],[114.889622,42.030316],[114.860854,42.05483],[114.861302,42.101997],[114.823051,42.140867],[114.828369,42.147679],[114.793963,42.149193],[114.78935,42.130963],[114.754879,42.115756],[114.710221,42.115377],[114.704647,42.121435],[114.675494,42.120426],[114.647751,42.109634],[114.624813,42.112222],[114.585537,42.131215],[114.560293,42.132414],[114.510957,42.110897],[114.500706,42.085963],[114.5025,42.067398],[114.479883,42.064304],[114.466107,42.037962],[114.46835,42.025577],[114.485969,42.015338],[114.484752,41.999155],[114.501411,41.99277],[114.510701,41.973292],[114.487443,41.96722],[114.476295,41.953936],[114.421705,41.942167],[114.374036,41.956783],[114.348087,41.947609],[114.343217,41.926915],[114.326751,41.9297],[114.330403,41.916977],[114.287026,41.868658],[114.243457,41.832792],[114.202964,41.793416],[114.200401,41.778509],[114.215266,41.756492],[114.206744,41.738402],[114.232501,41.717705],[114.237563,41.698651],[114.219302,41.700239],[114.215394,41.685057],[114.259347,41.6234],[114.227632,41.620221],[114.237242,41.59624],[114.221673,41.582242],[114.231604,41.547043],[114.231027,41.513671],[114.101218,41.537746],[114.083982,41.528958],[114.032148,41.529595],[113.977559,41.506664],[113.952827,41.483533],[113.930659,41.485573],[113.92124,41.457271],[113.884911,41.438141],[113.8712,41.413327],[113.918229,41.40382],[113.943985,41.390802],[113.93399,41.376823],[113.937514,41.356647],[113.923354,41.33934],[113.926622,41.326309],[113.89952,41.316214],[113.922585,41.291162],[113.936297,41.294805],[113.951226,41.282916],[113.952956,41.254269],[113.971536,41.239814],[113.976854,41.266676],[113.985824,41.270385],[114.007032,41.250752],[114.016259,41.232073],[114.000625,41.224011],[113.996781,41.192458],[113.973651,41.174275],[113.920407,41.172034],[113.877927,41.115593],[113.863383,41.106042],[113.820327,41.101619],[113.823402,41.093093],[113.868445,41.068853],[113.90567,41.034081],[113.922585,41.024391],[113.972946,40.982981],[113.97647,40.961206],[113.991142,40.940195],[114.000753,40.947521],[114.011773,40.935311],[114.057457,40.925092],[114.041375,40.917378],[114.052203,40.893395],[114.052844,40.870304],[114.073539,40.857308],[114.069694,40.846948],[114.044771,40.831115],[114.081163,40.790486],[114.104421,40.797571],[114.104165,40.768068],[114.134727,40.737263],[114.147285,40.73346],[114.18323,40.671675],[114.200081,40.662189],[114.216163,40.63437],[114.209307,40.629721],[114.236153,40.606991],[114.258258,40.610672],[114.282926,40.590778],[114.273379,40.553815],[114.293433,40.551424],[114.296381,40.535973],[114.285617,40.525822],[114.282605,40.495164],[114.267228,40.474199],[114.275429,40.458019],[114.299648,40.440086],[114.28709,40.423444],[114.314449,40.369604],[114.344435,40.36954],[114.382237,40.362085],[114.390374,40.351259],[114.446565,40.372845],[114.470784,40.349703],[114.499296,40.354047],[114.530627,40.3451],[114.526463,40.32357],[114.510957,40.303006],[114.469951,40.268093],[114.406392,40.246149],[114.362567,40.250109],[114.335144,40.245434],[114.293113,40.230108],[114.255247,40.236213],[114.240126,40.221924],[114.235833,40.198341],[114.180026,40.191517],[114.145107,40.177349],[114.123963,40.178129],[114.123387,40.188723],[114.097758,40.193597],[114.068029,40.179754],[114.089108,40.121491],[114.101218,40.10874],[114.091159,40.075288],[114.043809,40.056863],[114.019462,40.102819],[113.989476,40.112383],[113.973843,40.097157],[113.981019,40.073205],[113.975573,40.051068],[113.954878,40.030812],[113.922457,40.026578],[113.914641,40.005924],[113.932004,40.009443],[113.960452,40.000906],[114.021256,39.991782],[114.029457,39.985395],[114.02824,39.959316],[114.047397,39.916135],[114.067772,39.922334],[114.089941,39.910197],[114.102884,39.912873],[114.174132,39.897602],[114.211998,39.918745],[114.229426,39.899495],[114.19944,39.87939],[114.224877,39.851704],[114.276967,39.874494],[114.286065,39.858235],[114.328929,39.865548],[114.349432,39.862806],[114.395436,39.867246],[114.406712,39.83348],[114.390695,39.818584],[114.408827,39.782375],[114.408122,39.651956],[114.431636,39.614021],[114.474757,39.613759],[114.495836,39.608188],[114.515378,39.564983],[114.557025,39.581442],[114.568942,39.573967],[114.563432,39.558162],[114.58432,39.585835],[114.604887,39.567869],[114.633527,39.555866],[114.654991,39.599209],[114.680748,39.588064],[114.712079,39.594358],[114.716756,39.618674],[114.760645,39.617036],[114.783775,39.609499],[114.821642,39.61022],[114.838429,39.589179],[114.891032,39.634728],[114.936331,39.66368],[114.961895,39.666103],[114.987396,39.67802],[115.011487,39.674746],[115.03199,39.702373],[115.050058,39.709245],[115.095293,39.704795],[115.138734,39.688627],[115.168847,39.672651],[115.179163,39.679592],[115.177625,39.700475],[115.215043,39.708067],[115.250859,39.73882],[115.283216,39.745165],[115.312945,39.783551],[115.342867,39.79205],[115.330052,39.80656],[115.345237,39.821851],[115.343251,39.837857],[115.365676,39.867507],[115.364523,39.885331],[115.399891,39.891336],[115.40162,39.903802],[115.426801,39.950056],[115.428531,39.984352],[115.450123,39.99289],[115.442178,40.010876],[115.454544,40.029705],[115.478571,40.036153],[115.528034,40.07633],[115.555457,40.082644],[115.553727,40.091691],[115.575576,40.100997],[115.590697,40.096376],[115.59909,40.119995],[115.641762,40.115897],[115.644581,40.12663],[115.715893,40.133395],[115.734858,40.129492],[115.754849,40.145427],[115.754336,40.163243],[115.773045,40.176179],[115.806555,40.15323],[115.847817,40.147052],[115.844421,40.168053],[115.855506,40.188853],[115.870306,40.186058],[115.886324,40.206657],[115.883121,40.216143],[115.898498,40.234524],[115.911953,40.23446],[115.930085,40.254524],[115.960007,40.256667],[115.968913,40.264263],[115.93976,40.304434],[115.943156,40.311375],[115.922653,40.325905],[115.918296,40.353917],[115.864476,40.359363],[115.861849,40.373428],[115.846856,40.375113],[115.796431,40.426812],[115.770418,40.444165],[115.769841,40.468051],[115.782207,40.492058],[115.736012,40.503832],[115.755041,40.540046],[115.792203,40.561313],[115.819818,40.559374],[115.827378,40.587031],[115.846151,40.593039],[115.885427,40.595235],[115.907788,40.617324],[115.971988,40.602341],[115.981407,40.579665],[116.005113,40.584124],[116.0285,40.607314],[116.030037,40.597367],[116.062714,40.610285],[116.099363,40.630561],[116.121724,40.62914],[116.112562,40.648507],[116.136909,40.667674],[116.162025,40.662383],[116.171316,40.695996],[116.191947,40.724241],[116.218857,40.742807],[116.235003,40.783143],[116.247946,40.791839],[116.269602,40.777152],[116.273446,40.762913],[116.290938,40.763815],[116.307917,40.752152],[116.317015,40.772256],[116.379806,40.77232],[116.414276,40.777925],[116.416519,40.769357],[116.453937,40.765877],[116.465854,40.774511],[116.456564,40.798665],[116.43683,40.820751],[116.40646,40.833368],[116.399988,40.84978],[116.334443,40.904648],[116.334571,40.921749],[116.365069,40.943216]]]]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"adcode\\\":130800,\\\"name\\\":\\\"承德市\\\",\\\"center\\\":[117.939152,40.976204],\\\"centroid\\\":[117.551533,41.356206],\\\"childrenNum\\\":11,\\\"level\\\":\\\"city\\\",\\\"parent\\\":{\\\"adcode\\\":130000},\\\"subFeatureIndex\\\":7,\\\"acroutes\\\":[100000,130000]},\\\"geometry\\\":{\\\"type\\\":\\\"MultiPolygon\\\",\\\"coordinates\\\":[[[[119.158474,40.614418],[119.146557,40.63579],[119.173211,40.654316],[119.185833,40.67574],[119.176222,40.690191],[119.153349,40.688707],[119.115098,40.666513],[119.095107,40.663351],[119.081588,40.671869],[119.05423,40.664964],[119.048719,40.681482],[119.027063,40.692448],[119.010725,40.687868],[118.987723,40.697931],[118.960813,40.720566],[118.949344,40.747834],[118.91167,40.756083],[118.895459,40.754021],[118.910965,40.776766],[118.878544,40.783207],[118.861501,40.802658],[118.849135,40.800919],[118.846252,40.822103],[118.855094,40.840577],[118.873034,40.848042],[118.891743,40.903362],[118.903468,40.961784],[118.917052,40.968594],[118.946461,40.958122],[119.000601,40.967052],[119.005086,40.984265],[119.0204,40.997878],[119.013544,41.007637],[118.951971,41.018421],[118.936209,41.037482],[118.93685,41.052624],[118.964657,41.079307],[119.008354,41.068596],[119.037507,41.067378],[119.050834,41.080333],[119.073771,41.084244],[119.080627,41.095978],[119.081204,41.131422],[119.126374,41.138662],[119.158603,41.169664],[119.184295,41.182727],[119.188909,41.198156],[119.166483,41.21294],[119.169623,41.222923],[119.209796,41.225803],[119.20954,41.244483],[119.231004,41.256444],[119.248367,41.27665],[119.239461,41.314489],[119.212103,41.308099],[119.200698,41.28234],[119.154951,41.297682],[119.093121,41.293655],[119.035136,41.298768],[119.006752,41.307076],[118.974716,41.306565],[118.949536,41.318003],[118.934671,41.304584],[118.890718,41.300749],[118.868421,41.312636],[118.844907,41.34247],[118.846124,41.373823],[118.770007,41.353071],[118.763343,41.328928],[118.741879,41.324073],[118.695171,41.337999],[118.676974,41.350453],[118.629946,41.34643],[118.57997,41.354029],[118.539796,41.3509],[118.528135,41.355051],[118.500841,41.345791],[118.47329,41.345663],[118.412422,41.33193],[118.399607,41.311102],[118.380193,41.312124],[118.349119,41.342789],[118.348286,41.373886],[118.361741,41.386717],[118.343993,41.404139],[118.34867,41.428318],[118.327078,41.450831],[118.272168,41.471296],[118.269605,41.478881],[118.295426,41.485127],[118.315801,41.512525],[118.302923,41.552709],[118.313302,41.561494],[118.301577,41.569641],[118.279152,41.56544],[118.270823,41.573524],[118.230522,41.582178],[118.215337,41.595668],[118.20989,41.61774],[118.215208,41.633002],[118.206879,41.65074],[118.169013,41.67076],[118.153699,41.691156],[118.155173,41.712624],[118.130698,41.742275],[118.140372,41.783965],[118.165873,41.813265],[118.219117,41.815358],[118.236032,41.807559],[118.246988,41.774005],[118.270823,41.762203],[118.292287,41.772863],[118.319838,41.83146],[118.331755,41.840651],[118.340213,41.872459],[118.324515,41.880187],[118.286649,41.91109],[118.270182,41.917357],[118.268901,41.930143],[118.306511,41.940269],[118.306255,41.975127],[118.314007,41.987774],[118.294722,42.005224],[118.256278,42.010724],[118.237634,42.022859],[118.283061,42.03158],[118.297284,42.048765],[118.272232,42.083311],[118.252498,42.091014],[118.226613,42.090256],[118.212581,42.081101],[118.220206,42.058619],[118.204188,42.034866],[118.189067,42.030569],[118.141846,42.031327],[118.116538,42.037204],[118.115256,42.045859],[118.136913,42.052871],[118.155173,42.081164],[118.136528,42.094486],[118.097765,42.10509],[118.088859,42.117144],[118.104172,42.148878],[118.10635,42.171958],[118.089051,42.183874],[118.033629,42.199127],[118.020366,42.213432],[117.977438,42.229875],[117.971095,42.248014],[118.023249,42.267155],[118.047468,42.280563],[118.059962,42.29831],[118.016265,42.333286],[118.009153,42.358248],[118.021263,42.371636],[118.019405,42.395201],[117.99762,42.416684],[117.954564,42.445003],[117.940148,42.462766],[117.87409,42.510194],[117.849614,42.546619],[117.829624,42.56498],[117.797588,42.585277],[117.792334,42.598367],[117.801496,42.612706],[117.779904,42.618591],[117.707247,42.588033],[117.66733,42.582459],[117.6442,42.589787],[117.610883,42.592355],[117.600311,42.603001],[117.539955,42.605443],[117.524898,42.590727],[117.473512,42.602437],[117.455957,42.589411],[117.435197,42.585403],[117.44436,42.577447],[117.433147,42.555769],[117.39637,42.536339],[117.387015,42.517405],[117.408415,42.519976],[117.416296,42.512326],[117.412836,42.472493],[117.390732,42.462076],[117.330056,42.461887],[117.321406,42.468791],[117.275466,42.481905],[117.252208,42.473685],[117.222287,42.475442],[117.175963,42.465527],[117.135726,42.469167],[117.094912,42.483661],[117.079535,42.460632],[117.046922,42.454105],[117.016744,42.45649],[117.006685,42.432948],[116.965102,42.421583],[116.914421,42.402677],[116.911858,42.391431],[116.886806,42.366608],[116.897442,42.297618],[116.918522,42.229875],[116.917433,42.207698],[116.903401,42.19087],[116.858166,42.197236],[116.789225,42.200261],[116.825169,42.155563],[116.850221,42.15632],[116.865022,42.124085],[116.877324,42.121057],[116.890651,42.092655],[116.881681,42.05224],[116.87963,42.018372],[116.868161,42.002885],[116.831961,42.005351],[116.821133,41.988723],[116.796209,41.978099],[116.766479,41.990304],[116.744631,41.982146],[116.72746,41.951089],[116.669154,41.947735],[116.634812,41.929953],[116.597073,41.935586],[116.566383,41.928751],[116.533706,41.938876],[116.514164,41.970067],[116.496416,41.97968],[116.482641,41.975886],[116.453873,41.945964],[116.432088,41.939383],[116.393133,41.94299],[116.41402,41.98221],[116.409087,41.994034],[116.373719,42.009965],[116.327267,42.005667],[116.306507,41.991379],[116.29837,41.968106],[116.28421,41.959376],[116.233401,41.941408],[116.230518,41.926282],[116.211361,41.906848],[116.212578,41.885128],[116.193164,41.861816],[116.171124,41.868912],[116.134731,41.863844],[116.106667,41.849587],[116.105706,41.834757],[116.129221,41.806607],[116.098658,41.776479],[116.081039,41.776352],[116.056307,41.733705],[116.014404,41.715355],[115.972885,41.680101],[115.909967,41.642921],[115.929252,41.596113],[115.924767,41.568623],[115.958789,41.550353],[115.97391,41.529659],[115.982112,41.485127],[115.97673,41.470913],[116.000052,41.454402],[116.004473,41.432911],[116.03023,41.416645],[116.036124,41.397694],[116.07713,41.384866],[116.08751,41.376951],[116.141586,41.373439],[116.17484,41.356328],[116.203352,41.326117],[116.209503,41.307715],[116.191627,41.288158],[116.198995,41.259578],[116.213603,41.233288],[116.235195,41.211853],[116.221356,41.185928],[116.22347,41.174275],[116.245895,41.16358],[116.233273,41.130845],[116.245447,41.114183],[116.268769,41.102645],[116.277419,41.083154],[116.296128,41.062118],[116.264733,41.038252],[116.29837,40.986641],[116.333546,40.984458],[116.341747,40.964804],[116.365069,40.943216],[116.37641,40.939681],[116.398515,40.905999],[116.41402,40.899762],[116.458678,40.900597],[116.474184,40.896032],[116.473607,40.919757],[116.447466,40.953818],[116.455539,40.980476],[116.516791,40.975274],[116.536333,40.988889],[116.569715,40.991265],[116.597778,40.97476],[116.614309,40.982916],[116.622958,41.02086],[116.614116,41.03607],[116.630839,41.060771],[116.64769,41.059296],[116.665182,41.046658],[116.688632,41.044669],[116.698884,41.021246],[116.683058,41.000511],[116.67774,40.971227],[116.689465,40.950669],[116.722334,40.927406],[116.713236,40.911978],[116.730471,40.897768],[116.759496,40.889858],[116.79512,40.863614],[116.805051,40.840706],[116.813636,40.848428],[116.847723,40.839354],[116.87617,40.821202],[116.880207,40.804332],[116.896353,40.79712],[116.894623,40.781597],[116.923391,40.773738],[116.926531,40.744869],[116.979967,40.702833],[117.031032,40.692126],[117.058327,40.701543],[117.0771,40.700059],[117.110673,40.70825],[117.117785,40.700059],[117.20236,40.695609],[117.241636,40.676643],[117.261371,40.681159],[117.290395,40.660189],[117.32115,40.658317],[117.342678,40.673611],[117.359208,40.673869],[117.409248,40.687288],[117.442245,40.676643],[117.492862,40.675417],[117.514583,40.660511],[117.501256,40.636759],[117.477997,40.635338],[117.46198,40.65309],[117.448909,40.628366],[117.430264,40.626041],[117.412708,40.605118],[117.430008,40.576112],[117.402072,40.573139],[117.387464,40.560861],[117.365936,40.575982],[117.342742,40.581604],[117.311859,40.57805],[117.269444,40.560473],[117.247403,40.54024],[117.264126,40.517285],[117.247147,40.511788],[117.219019,40.514375],[117.208575,40.501115],[117.237215,40.468763],[117.236511,40.45653],[117.263357,40.442352],[117.234076,40.417162],[117.240675,40.394424],[117.228502,40.386389],[117.226195,40.369021],[117.242277,40.369993],[117.260217,40.335762],[117.275018,40.33239],[117.274377,40.308521],[117.293342,40.296713],[117.296354,40.278088],[117.331465,40.28977],[117.339859,40.246213],[117.350943,40.229978],[117.386375,40.22712],[117.415335,40.236862],[117.419115,40.249785],[117.450062,40.252512],[117.484084,40.235304],[117.514326,40.227705],[117.54617,40.232901],[117.571671,40.219261],[117.56238,40.206073],[117.575451,40.192817],[117.609409,40.194897],[117.619532,40.206398],[117.64625,40.205163],[117.677069,40.22095],[117.694112,40.238161],[117.714551,40.241668],[117.75152,40.229718],[117.807775,40.261926],[117.844104,40.261406],[117.867554,40.26965],[117.897989,40.270429],[117.909457,40.285876],[118.000888,40.29256],[118.031643,40.302358],[118.061564,40.319095],[118.079312,40.353528],[118.121856,40.354695],[118.133837,40.375113],[118.165232,40.400449],[118.153123,40.409519],[118.156967,40.423768],[118.173818,40.423056],[118.239684,40.464686],[118.262942,40.452063],[118.277935,40.425711],[118.306575,40.419558],[118.356295,40.435295],[118.360011,40.428819],[118.387305,40.436719],[118.402683,40.416838],[118.430746,40.411851],[118.45599,40.414053],[118.503211,40.403365],[118.523458,40.40628],[118.548062,40.422667],[118.571512,40.414636],[118.550881,40.385482],[118.558377,40.36928],[118.539989,40.361048],[118.532364,40.319419],[118.533325,40.298854],[118.568949,40.287564],[118.580098,40.305861],[118.596949,40.308456],[118.608225,40.328305],[118.640197,40.354566],[118.643785,40.380946],[118.618349,40.425193],[118.624179,40.437626],[118.657176,40.450574],[118.702795,40.491411],[118.723491,40.473746],[118.772954,40.479765],[118.792112,40.492382],[118.794867,40.510753],[118.821328,40.531964],[118.864,40.527244],[118.886938,40.542438],[118.919038,40.53093],[118.966003,40.536102],[118.952676,40.558469],[118.983366,40.56364],[118.998359,40.578955],[119.013095,40.577081],[119.063392,40.606151],[119.086394,40.588775],[119.105487,40.603632],[119.158474,40.614418]]]]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"adcode\\\":130900,\\\"name\\\":\\\"沧州市\\\",\\\"center\\\":[116.857461,38.310582],\\\"centroid\\\":[116.771341,38.270959],\\\"childrenNum\\\":16,\\\"level\\\":\\\"city\\\",\\\"parent\\\":{\\\"adcode\\\":130000},\\\"subFeatureIndex\\\":8,\\\"acroutes\\\":[100000,130000]},\\\"geometry\\\":{\\\"type\\\":\\\"MultiPolygon\\\",\\\"coordinates\\\":[[[[116.335916,37.581263],[116.343541,37.566025],[116.367696,37.566295],[116.376858,37.546602],[116.368913,37.526364],[116.402167,37.509833],[116.434139,37.473383],[116.456115,37.513679],[116.486421,37.524205],[116.517048,37.557191],[116.538512,37.568453],[116.545816,37.582477],[116.574648,37.609978],[116.604506,37.62514],[116.640834,37.666432],[116.641027,37.682323],[116.663964,37.687776],[116.67979,37.728764],[116.699332,37.730648],[116.724512,37.744305],[116.723167,37.766703],[116.744182,37.757355],[116.753793,37.770536],[116.753665,37.792993],[116.786149,37.82633],[116.788136,37.843396],[116.812739,37.843598],[116.84375,37.834461],[116.883795,37.844337],[116.919355,37.845882],[116.947675,37.840037],[116.976635,37.841045],[117.027188,37.832378],[117.074345,37.848771],[117.093759,37.849509],[117.150142,37.839567],[117.185317,37.849778],[117.208832,37.843732],[117.271366,37.839903],[117.320124,37.861399],[117.34428,37.862675],[117.381954,37.854547],[117.406301,37.843531],[117.438593,37.853876],[117.481137,37.914842],[117.512789,37.943428],[117.527974,37.996275],[117.56033,38.040978],[117.556486,38.05719],[117.58378,38.070653],[117.616713,38.069046],[117.666048,38.072528],[117.679504,38.07956],[117.704492,38.076078],[117.729223,38.093822],[117.743191,38.123409],[117.76882,38.131908],[117.766962,38.15867],[117.801625,38.173786],[117.789195,38.180741],[117.808544,38.228406],[117.8475,38.25393],[117.860891,38.274569],[117.895682,38.301613],[117.916698,38.32344],[117.948349,38.346462],[117.958024,38.376147],[117.937457,38.38775],[117.846411,38.36801],[117.804764,38.367076],[117.781186,38.373812],[117.730505,38.424949],[117.725123,38.457333],[117.710899,38.467791],[117.678799,38.477049],[117.647852,38.508677],[117.645161,38.527647],[117.685975,38.532438],[117.68527,38.539425],[117.643367,38.54029],[117.638562,38.570028],[117.645033,38.593836],[117.63901,38.626742],[117.557831,38.613781],[117.541429,38.60361],[117.478895,38.617237],[117.432442,38.601349],[117.391949,38.572689],[117.369075,38.564773],[117.368883,38.582465],[117.358055,38.57056],[117.305644,38.556591],[117.292189,38.562445],[117.253169,38.556192],[117.238369,38.581002],[117.259512,38.603078],[117.255988,38.613781],[117.23068,38.624017],[117.23036,38.641694],[117.186086,38.616506],[117.151103,38.617702],[117.13611,38.598756],[117.098179,38.586921],[117.086326,38.606402],[117.071526,38.607399],[117.064285,38.635713],[117.051727,38.643488],[117.06813,38.680621],[117.039041,38.688457],[117.042309,38.706517],[117.015719,38.700409],[117.014502,38.690184],[116.994447,38.695695],[116.87726,38.680688],[116.866496,38.717005],[116.867457,38.745873],[116.859127,38.741295],[116.796529,38.74667],[116.766351,38.741959],[116.758855,38.732071],[116.77404,38.652258],[116.763212,38.633853],[116.738224,38.631327],[116.733739,38.614047],[116.71503,38.609327],[116.702792,38.619098],[116.680559,38.605936],[116.680303,38.592706],[116.662234,38.581268],[116.671653,38.566503],[116.643333,38.564773],[116.652431,38.551202],[116.672678,38.546545],[116.668257,38.530042],[116.647114,38.50648],[116.621228,38.514335],[116.627315,38.501087],[116.610593,38.479646],[116.589897,38.483908],[116.569715,38.470988],[116.559399,38.496759],[116.519482,38.48817],[116.465726,38.494096],[116.449772,38.518262],[116.452655,38.534501],[116.431127,38.539558],[116.432152,38.552533],[116.455475,38.557656],[116.454834,38.580337],[116.425425,38.587187],[116.41921,38.599288],[116.381984,38.619165],[116.366863,38.67305],[116.370836,38.692508],[116.406331,38.703596],[116.435804,38.733199],[116.42299,38.770419],[116.390313,38.789784],[116.338287,38.80689],[116.271973,38.816634],[116.278764,38.836451],[116.247497,38.848907],[116.248907,38.85964],[116.23212,38.871894],[116.212194,38.870238],[116.202198,38.887258],[116.20002,38.915727],[116.209503,38.921618],[116.15203,38.948352],[116.121083,38.934391],[116.125633,38.920823],[116.112754,38.909703],[116.085524,38.91063],[116.045543,38.897786],[116.04157,38.878451],[116.048746,38.8607],[116.035548,38.829492],[116.04093,38.812259],[116.023054,38.812524],[115.999731,38.796812],[115.995118,38.77798],[115.95187,38.746736],[115.944053,38.735456],[115.966286,38.708973],[115.955009,38.702932],[115.959879,38.679891],[115.973526,38.668467],[115.973398,38.635514],[115.951101,38.627938],[115.96321,38.613182],[115.960583,38.584394],[115.934058,38.546678],[115.940721,38.530508],[115.890809,38.52585],[115.878507,38.535566],[115.869345,38.524652],[115.875047,38.510141],[115.816101,38.52545],[115.79137,38.512005],[115.770418,38.48817],[115.745686,38.481311],[115.718584,38.449205],[115.715957,38.438411],[115.731462,38.392618],[115.705321,38.367543],[115.734025,38.359205],[115.738767,38.369544],[115.783297,38.358338],[115.804633,38.345462],[115.841538,38.346062],[115.850188,38.309423],[115.833016,38.298008],[115.837181,38.272499],[115.864476,38.255266],[115.856467,38.240901],[115.871267,38.217579],[115.899523,38.20314],[115.887542,38.171312],[115.900804,38.158536],[115.935403,38.167232],[115.938671,38.144354],[115.968913,38.138533],[115.986725,38.125885],[116.049771,38.146026],[116.055218,38.131306],[116.048554,38.11424],[116.031831,38.100718],[116.031511,38.082774],[116.055474,38.071725],[116.05227,38.052434],[116.070595,38.041112],[116.049515,38.038365],[116.042467,38.026706],[116.062394,38.005057],[116.071876,37.980318],[116.100645,37.948929],[116.120571,37.948996],[116.093981,37.922627],[116.091034,37.910949],[116.153952,37.914573],[116.170867,37.933565],[116.170163,37.959594],[116.188039,37.968314],[116.209118,37.966369],[116.226354,37.95121],[116.256595,37.965229],[116.266206,37.961405],[116.266975,37.981458],[116.278252,37.962479],[116.306764,37.979312],[116.329189,38.008141],[116.343925,38.017256],[116.3709,38.018597],[116.417224,38.009481],[116.479309,38.011492],[116.483474,38.02503],[116.496352,38.013704],[116.563243,38.01987],[116.565166,37.980116],[116.53377,37.907727],[116.515382,37.892892],[116.51346,37.863951],[116.473415,37.865495],[116.481424,37.830026],[116.466623,37.805564],[116.47303,37.777059],[116.460664,37.778875],[116.451182,37.7587],[116.438367,37.758902],[116.434331,37.734618],[116.424784,37.735829],[116.386533,37.696393],[116.378909,37.659698],[116.36539,37.648719],[116.374936,37.63949],[116.375192,37.617256],[116.3281,37.605058],[116.335916,37.581263]]]]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"adcode\\\":131000,\\\"name\\\":\\\"廊坊市\\\",\\\"center\\\":[116.704441,39.523927],\\\"centroid\\\":[116.540212,39.111215],\\\"childrenNum\\\":10,\\\"level\\\":\\\"city\\\",\\\"parent\\\":{\\\"adcode\\\":130000},\\\"subFeatureIndex\\\":9,\\\"acroutes\\\":[100000,130000]},\\\"geometry\\\":{\\\"type\\\":\\\"MultiPolygon\\\",\\\"coordinates\\\":[[[[116.244678,39.517354],[116.222766,39.501995],[116.220843,39.511644],[116.182144,39.49635],[116.179901,39.486568],[116.151325,39.471005],[116.132104,39.429423],[116.133001,39.4055],[116.116791,39.376243],[116.13582,39.351842],[116.198226,39.351315],[116.208734,39.330195],[116.201109,39.251911],[116.186116,39.222457],[116.206555,39.207429],[116.207837,39.168526],[116.221804,39.147813],[116.262426,39.138114],[116.263131,39.127292],[116.28184,39.107623],[116.305354,39.098116],[116.317592,39.077911],[116.318617,39.037416],[116.307148,39.032196],[116.293757,39.007344],[116.299588,38.993658],[116.3215,38.998088],[116.33534,38.984004],[116.316182,38.962708],[116.298755,38.975076],[116.291386,38.948683],[116.253007,38.932074],[116.243653,38.949345],[116.228083,38.942199],[116.230262,38.92453],[116.209503,38.921618],[116.20002,38.915727],[116.202198,38.887258],[116.212194,38.870238],[116.23212,38.871894],[116.248907,38.85964],[116.247497,38.848907],[116.278764,38.836451],[116.271973,38.816634],[116.338287,38.80689],[116.390313,38.789784],[116.42299,38.770419],[116.435804,38.733199],[116.406331,38.703596],[116.370836,38.692508],[116.366863,38.67305],[116.381984,38.619165],[116.41921,38.599288],[116.425425,38.587187],[116.454834,38.580337],[116.455475,38.557656],[116.432152,38.552533],[116.431127,38.539558],[116.452655,38.534501],[116.449772,38.518262],[116.465726,38.494096],[116.519482,38.48817],[116.559399,38.496759],[116.569715,38.470988],[116.589897,38.483908],[116.610593,38.479646],[116.627315,38.501087],[116.621228,38.514335],[116.647114,38.50648],[116.668257,38.530042],[116.672678,38.546545],[116.652431,38.551202],[116.643333,38.564773],[116.671653,38.566503],[116.662234,38.581268],[116.680303,38.592706],[116.680559,38.605936],[116.702792,38.619098],[116.71503,38.609327],[116.733739,38.614047],[116.738224,38.631327],[116.763212,38.633853],[116.77404,38.652258],[116.758855,38.732071],[116.766351,38.741959],[116.746297,38.754233],[116.751294,38.780168],[116.737327,38.784479],[116.73848,38.807022],[116.75123,38.831282],[116.74604,38.851491],[116.723103,38.852551],[116.722334,38.897058],[116.708046,38.897058],[116.70811,38.931876],[116.716183,38.93889],[116.728613,38.975341],[116.754626,39.003245],[116.756612,39.0503],[116.773015,39.046865],[116.787303,39.061927],[116.80268,39.050895],[116.860473,39.050564],[116.869891,39.069919],[116.881488,39.071702],[116.91109,39.111055],[116.924096,39.119372],[116.909232,39.150782],[116.870084,39.153685],[116.863164,39.201365],[116.855796,39.215669],[116.875594,39.21646],[116.874569,39.230036],[116.892637,39.223973],[116.878733,39.255336],[116.867969,39.302552],[116.884243,39.305383],[116.889626,39.338157],[116.875786,39.33921],[116.870724,39.357499],[116.849196,39.339473],[116.829206,39.338881],[116.818121,39.373547],[116.837599,39.374073],[116.834139,39.402674],[116.875914,39.434548],[116.855475,39.443352],[116.832473,39.435468],[116.815751,39.451761],[116.807421,39.445586],[116.785124,39.465883],[116.820748,39.482431],[116.813957,39.510266],[116.826194,39.513088],[116.819595,39.52851],[116.806204,39.528838],[116.787687,39.554555],[116.81165,39.576983],[116.797875,39.594358],[116.812355,39.615922],[116.789994,39.610548],[116.790699,39.596062],[116.748667,39.619919],[116.700742,39.621033],[116.7026,39.610417],[116.727075,39.593047],[116.705099,39.587999],[116.662363,39.605239],[116.646537,39.599143],[116.620524,39.601699],[116.607773,39.619723],[116.565934,39.619788],[116.566575,39.604387],[116.541779,39.593505],[116.524416,39.596521],[116.519354,39.566491],[116.508462,39.551078],[116.470916,39.55462],[116.478861,39.539204],[116.464573,39.527657],[116.437534,39.526541],[116.443813,39.509872],[116.424656,39.509741],[116.424079,39.522735],[116.402679,39.526869],[116.402807,39.5144],[116.418761,39.506393],[116.412354,39.482103],[116.444134,39.482169],[116.454706,39.453338],[116.434395,39.442761],[116.408958,39.45025],[116.350461,39.453009],[116.320027,39.46851],[116.306443,39.488997],[116.279277,39.491295],[116.257941,39.500551],[116.244678,39.517354]]],[[[117.209793,40.082253],[117.204347,40.06982],[117.160073,40.076199],[117.13925,40.064025],[117.119515,40.072424],[117.085621,40.075158],[117.085173,40.068583],[117.052048,40.059402],[117.028533,40.033939],[117.000662,40.0299],[116.972086,40.037],[116.960489,40.051133],[116.928133,40.05491],[116.867841,40.041885],[116.857782,40.051914],[116.822734,40.046444],[116.819979,40.028337],[116.781536,40.034851],[116.770452,40.011658],[116.775385,39.99276],[116.757317,39.961468],[116.780575,39.94973],[116.784676,39.891401],[116.804154,39.877954],[116.827284,39.87704],[116.866047,39.843866],[116.885653,39.844585],[116.907566,39.834133],[116.902824,39.848242],[116.92589,39.835374],[116.928453,39.813095],[116.952608,39.789827],[116.949725,39.778583],[116.924288,39.781263],[116.920893,39.769167],[116.901799,39.763609],[116.916664,39.731362],[116.88277,39.718472],[116.893854,39.695893],[116.912563,39.689216],[116.91692,39.706365],[116.950878,39.706824],[116.944599,39.695173],[116.963629,39.643441],[116.974585,39.636824],[117.004378,39.644489],[117.015783,39.654052],[117.057045,39.644554],[117.127076,39.61697],[117.152641,39.623523],[117.157959,39.636627],[117.177693,39.645602],[117.159624,39.666823],[117.170132,39.673371],[117.169235,39.717622],[117.153153,39.722726],[117.161867,39.747389],[117.205884,39.763871],[117.18064,39.78244],[117.178718,39.795318],[117.15751,39.796756],[117.156357,39.817473],[117.195056,39.82551],[117.192173,39.833088],[117.252208,39.834591],[117.259961,39.843409],[117.247467,39.861043],[117.227797,39.852749],[117.166865,39.868944],[117.149117,39.896297],[117.158856,39.909218],[117.137456,39.921616],[117.156869,39.938055],[117.151039,39.944839],[117.175963,39.959121],[117.178654,39.977311],[117.198132,39.99276],[117.187752,40.026187],[117.1841,40.062593],[117.222863,40.065523],[117.209793,40.082253]]]]}},{\\\"type\\\":\\\"Feature\\\",\\\"properties\\\":{\\\"adcode\\\":131100,\\\"name\\\":\\\"衡水市\\\",\\\"center\\\":[115.665993,37.735097],\\\"centroid\\\":[115.828761,37.7648],\\\"childrenNum\\\":11,\\\"level\\\":\\\"city\\\",\\\"parent\\\":{\\\"adcode\\\":130000},\\\"subFeatureIndex\\\":10,\\\"acroutes\\\":[100000,130000]},\\\"geometry\\\":{\\\"type\\\":\\\"MultiPolygon\\\",\\\"coordinates\\\":[[[[115.853904,37.059245],[115.864988,37.070785],[115.885427,37.128731],[115.879981,37.151992],[115.911825,37.176195],[115.904841,37.189344],[115.912017,37.207098],[115.940721,37.227558],[115.953215,37.223697],[115.969425,37.239479],[115.964171,37.250721],[115.976217,37.276178],[115.968272,37.287076],[115.98461,37.316175],[115.975897,37.334508],[116.00947,37.343165],[116.024527,37.359937],[116.05195,37.357502],[116.056179,37.369065],[116.08751,37.373324],[116.106539,37.368794],[116.168817,37.38414],[116.195471,37.365684],[116.236028,37.361559],[116.285236,37.40266],[116.263067,37.42239],[116.227379,37.424755],[116.243076,37.448195],[116.229878,37.459676],[116.224431,37.479729],[116.241346,37.491475],[116.276458,37.466901],[116.271781,37.478176],[116.290233,37.484049],[116.278444,37.524745],[116.291386,37.5238],[116.287863,37.5493],[116.335916,37.581263],[116.3281,37.605058],[116.375192,37.617256],[116.374936,37.63949],[116.36539,37.648719],[116.378909,37.659698],[116.386533,37.696393],[116.424784,37.735829],[116.434331,37.734618],[116.438367,37.758902],[116.451182,37.7587],[116.460664,37.778875],[116.47303,37.777059],[116.466623,37.805564],[116.481424,37.830026],[116.473415,37.865495],[116.51346,37.863951],[116.515382,37.892892],[116.53377,37.907727],[116.565166,37.980116],[116.563243,38.01987],[116.496352,38.013704],[116.483474,38.02503],[116.479309,38.011492],[116.417224,38.009481],[116.3709,38.018597],[116.343925,38.017256],[116.329189,38.008141],[116.306764,37.979312],[116.278252,37.962479],[116.266975,37.981458],[116.266206,37.961405],[116.256595,37.965229],[116.226354,37.95121],[116.209118,37.966369],[116.188039,37.968314],[116.170163,37.959594],[116.170867,37.933565],[116.153952,37.914573],[116.091034,37.910949],[116.093981,37.922627],[116.120571,37.948996],[116.100645,37.948929],[116.071876,37.980318],[116.062394,38.005057],[116.042467,38.026706],[116.049515,38.038365],[116.070595,38.041112],[116.05227,38.052434],[116.055474,38.071725],[116.031511,38.082774],[116.031831,38.100718],[116.048554,38.11424],[116.055218,38.131306],[116.049771,38.146026],[115.986725,38.125885],[115.968913,38.138533],[115.938671,38.144354],[115.935403,38.167232],[115.900804,38.158536],[115.887542,38.171312],[115.899523,38.20314],[115.871267,38.217579],[115.856467,38.240901],[115.864476,38.255266],[115.837181,38.272499],[115.833016,38.298008],[115.850188,38.309423],[115.841538,38.346062],[115.804633,38.345462],[115.783297,38.358338],[115.738767,38.369544],[115.734025,38.359205],[115.705321,38.367543],[115.699811,38.349932],[115.650155,38.340791],[115.644965,38.32611],[115.590504,38.332784],[115.57942,38.342859],[115.575768,38.326377],[115.550908,38.332917],[115.547704,38.318168],[115.516437,38.318168],[115.516822,38.357337],[115.494781,38.362006],[115.495101,38.342993],[115.478122,38.341658],[115.462104,38.327311],[115.420906,38.337922],[115.402453,38.320103],[115.381822,38.327578],[115.383104,38.299076],[115.393611,38.285588],[115.369072,38.283451],[115.356194,38.271764],[115.34953,38.248117],[115.324734,38.248184],[115.323645,38.220586],[115.35094,38.210493],[115.342418,38.196254],[115.346903,38.13967],[115.364843,38.13793],[115.383232,38.0886],[115.420522,38.089671],[115.439871,38.082038],[115.468063,38.095161],[115.482992,38.08398],[115.466782,38.063554],[115.45134,38.017323],[115.438205,38.001102],[115.464219,37.99299],[115.444997,37.989168],[115.456017,37.974551],[115.457555,37.95074],[115.448585,37.936584],[115.412769,37.943293],[115.408668,37.918936],[115.385795,37.917191],[115.365484,37.906318],[115.360294,37.880068],[115.389831,37.874629],[115.388614,37.853003],[115.363049,37.849845],[115.360166,37.820215],[115.349722,37.805765],[115.352349,37.784052],[115.371635,37.770335],[115.344468,37.74814],[115.360294,37.731994],[115.386179,37.727082],[115.394316,37.712143],[115.380989,37.707432],[115.333768,37.71322],[115.317046,37.695383],[115.325567,37.682458],[115.316853,37.660102],[115.301412,37.660169],[115.297376,37.629587],[115.258356,37.639625],[115.255088,37.645621],[115.227858,37.648921],[115.202934,37.637133],[115.191593,37.608833],[115.172756,37.600543],[115.200563,37.572498],[115.188325,37.563125],[115.201908,37.555977],[115.237276,37.575465],[115.282575,37.576005],[115.307179,37.563935],[115.360871,37.523935],[115.359461,37.558675],[115.377914,37.541138],[115.405785,37.535944],[115.410078,37.523261],[115.430965,37.506796],[115.455313,37.501802],[115.421675,37.495727],[115.426096,37.506256],[115.402069,37.51017],[115.397968,37.497347],[115.417638,37.487762],[115.410719,37.476421],[115.431478,37.469602],[115.404183,37.462039],[115.360038,37.461431],[115.345109,37.448195],[115.391049,37.42793],[115.428595,37.387926],[115.468768,37.382788],[115.506634,37.368997],[115.520089,37.353648],[115.52938,37.326864],[115.577177,37.316107],[115.599218,37.332884],[115.590632,37.312453],[115.599859,37.301965],[115.623437,37.297905],[115.63292,37.277058],[115.67258,37.275839],[115.675784,37.258914],[115.698465,37.257153],[115.756322,37.209876],[115.76997,37.14155],[115.786564,37.123916],[115.827378,37.106006],[115.853904,37.059245]]]]}}]}\\n', 'admin', '2025-04-02 22:13:35', NULL, NULL, '0', NULL);\n\n-- ----------------------------\n-- Table structure for jimu_report_share\n-- ----------------------------\nDROP TABLE IF EXISTS `jimu_report_share`;\nCREATE TABLE `jimu_report_share`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',\n  `report_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '在线excel设计器id',\n  `preview_url` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '预览地址',\n  `preview_lock` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码锁',\n  `last_update_time` datetime NULL DEFAULT NULL COMMENT '最后更新时间',\n  `term_of_validity` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '有效期(0:永久有效，1:1天，2:7天)',\n  `status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否过期(0未过期，1已过期)',\n  `preview_lock_status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否为密码锁(0 否,1是)',\n  `share_token` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分享token',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uniq_report_id`(`report_id`) USING BTREE,\n  UNIQUE INDEX `uniq_jrs_report_id`(`report_id`) USING BTREE COMMENT '报表id唯一索引',\n  INDEX `idx_jrs_share_token`(`share_token`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '积木报表预览权限表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of jimu_report_share\n-- ----------------------------\nINSERT INTO `jimu_report_share` VALUES ('989322818603012096', '989065112487022592', '/jmreport/shareView/989065112487022592', '', '2024-08-30 10:22:31', '1', '0', '0', '71e3778ba7ebeae4652d2e53c46a7b1b');\n\n-- ----------------------------\n-- Table structure for jimu_report_sheet\n-- ----------------------------\nDROP TABLE IF EXISTS `jimu_report_sheet`;\nCREATE TABLE `jimu_report_sheet`  (\n  `id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键（Sheet ID）',\n  `report_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '报表ID',\n  `sheet_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Sheet名称',\n  `sheet_order` int(11) NOT NULL COMMENT '排序（可以为负数，负数表示在默认sheet前面）',\n  `json_str` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '该sheet的完整jsonStr',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_report_id`(`report_id`) USING BTREE,\n  INDEX `idx_sheet_order`(`report_id`, `sheet_order`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '报表Sheet表' ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of jimu_report_sheet\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for joa_demo\n-- ----------------------------\nDROP TABLE IF EXISTS `joa_demo`;\nCREATE TABLE `joa_demo`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'ID',\n  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请假人',\n  `days` int(11) NULL DEFAULT NULL COMMENT '请假天数',\n  `begin_date` datetime NULL DEFAULT NULL COMMENT '开始时间',\n  `end_date` datetime NULL DEFAULT NULL COMMENT '请假结束时间',\n  `reason` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请假原因',\n  `bpm_status` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '1' COMMENT '流程状态',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人id',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人id'\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '流程测试' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of joa_demo\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for oauth2_registered_client\n-- ----------------------------\nDROP TABLE IF EXISTS `oauth2_registered_client`;\nCREATE TABLE `oauth2_registered_client`  (\n  `id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `client_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `client_id_issued_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `client_secret` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n  `client_secret_expires_at` timestamp NULL DEFAULT NULL,\n  `client_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `client_authentication_methods` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `authorization_grant_types` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `redirect_uris` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n  `post_logout_redirect_uris` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n  `scopes` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `client_settings` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `token_settings` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of oauth2_registered_client\n-- ----------------------------\nINSERT INTO `oauth2_registered_client` VALUES ('3eacac0e-0de9-4727-9a64-6bdd4be2ee1f', 'jeecg-client', '2024-02-29 18:16:33', 'secret', NULL, '3eacac0e-0de9-4727-9a64-6bdd4be2ee1f', 'client_secret_basic', 'refresh_token,authorization_code,password,app,phone,social', 'http://127.0.0.1:8080/jeecg-', 'http://127.0.0.1:8080/', '*', '{\\\"@class\\\":\\\"java.util.Collections$UnmodifiableMap\\\",\\\"settings.client.require-proof-key\\\":false,\\\"settings.client.require-authorization-consent\\\":true}', '{\\\"@class\\\":\\\"java.util.Collections$UnmodifiableMap\\\",\\\"settings.token.reuse-refresh-tokens\\\":true,\\\"settings.token.id-token-signature-algorithm\\\":[\\\"org.springframework.security.oauth2.jose.jws.SignatureAlgorithm\\\",\\\"RS256\\\"],\\\"settings.token.access-token-time-to-live\\\":[\\\"java.time.Duration\\\",300000.000000000],\\\"settings.token.access-token-format\\\":{\\\"@class\\\":\\\"org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat\\\",\\\"value\\\":\\\"self-contained\\\"},\\\"settings.token.refresh-token-time-to-live\\\":[\\\"java.time.Duration\\\",3600.000000000],\\\"settings.token.authorization-code-time-to-live\\\":[\\\"java.time.Duration\\\",300000.000000000],\\\"settings.token.device-code-time-to-live\\\":[\\\"java.time.Duration\\\",300000.000000000]}');\n\n-- ----------------------------\n-- Table structure for onl_auth_data\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_auth_data`;\nCREATE TABLE `onl_auth_data`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',\n  `cgform_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'online表ID',\n  `rule_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则名',\n  `rule_column` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则列',\n  `rule_operator` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则条件 大于小于like',\n  `rule_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则值',\n  `status` int(1) NULL DEFAULT NULL COMMENT '1有效 0无效',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_auth_data\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for onl_auth_page\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_auth_page`;\nCREATE TABLE `onl_auth_page`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT ' 主键',\n  `cgform_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'online表id',\n  `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字段名/按钮编码',\n  `type` int(1) NULL DEFAULT NULL COMMENT '1字段 2按钮',\n  `control` int(1) NULL DEFAULT NULL COMMENT '3可编辑 5可见(仅支持两种状态值3,5)',\n  `page` int(1) NULL DEFAULT NULL COMMENT '3列表 5表单(仅支持两种状态值3,5)',\n  `status` int(1) NULL DEFAULT NULL COMMENT '1有效 0无效',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_onl_auth_page_code`(`code`) USING BTREE,\n  INDEX `idx_onl_auth_page_cgform_id`(`cgform_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_auth_page\n-- ----------------------------\nINSERT INTO `onl_auth_page` VALUES ('1580815057246892034', '56870166aba54ebfacb20ba6c770bd73', 'order_date', 1, 5, 3, 0, '2022-10-14 14:57:34', 'admin', NULL, NULL);\nINSERT INTO `onl_auth_page` VALUES ('1580815057309806593', '56870166aba54ebfacb20ba6c770bd73', 'order_date', 1, 5, 5, 0, '2022-10-14 14:57:34', 'admin', NULL, NULL);\nINSERT INTO `onl_auth_page` VALUES ('1580815057309806594', '56870166aba54ebfacb20ba6c770bd73', 'order_date', 1, 3, 5, 0, '2022-10-14 14:57:34', 'admin', NULL, NULL);\n\n-- ----------------------------\n-- Table structure for onl_auth_relation\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_auth_relation`;\nCREATE TABLE `onl_auth_relation`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `role_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '角色id',\n  `auth_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限id',\n  `type` int(1) NULL DEFAULT NULL COMMENT '1字段 2按钮 3数据权限',\n  `cgform_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'online表单ID',\n  `auth_mode` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '授权方式role角色，depart部门，user人',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_auth_relation\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for onl_cgform_button\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_cgform_button`;\nCREATE TABLE `onl_cgform_button`  (\n  `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键ID',\n  `BUTTON_CODE` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '按钮编码',\n  `BUTTON_ICON` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '按钮图标',\n  `BUTTON_NAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '按钮名称',\n  `BUTTON_STATUS` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '按钮状态',\n  `BUTTON_STYLE` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '按钮样式',\n  `EXP` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '表达式',\n  `CGFORM_HEAD_ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '表单ID',\n  `OPT_TYPE` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '按钮类型',\n  `ORDER_NUM` int(11) NULL DEFAULT NULL COMMENT '排序',\n  `OPT_POSITION` varchar(3) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '按钮位置1侧面 2底部',\n  PRIMARY KEY (`ID`) USING BTREE,\n  INDEX `idx_ocb_CGFORM_HEAD_ID`(`CGFORM_HEAD_ID`) USING BTREE,\n  INDEX `idx_ocb_BUTTON_CODE`(`BUTTON_CODE`) USING BTREE,\n  INDEX `idx_ocb_BUTTON_STATUS`(`BUTTON_STATUS`) USING BTREE,\n  INDEX `idx_ocb_ORDER_NUM`(`ORDER_NUM`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'Online表单自定义按钮' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_cgform_button\n-- ----------------------------\nINSERT INTO `onl_cgform_button` VALUES ('007de67711d08337f7c246b6cfe306ae', 'jihuo', NULL, '激活', '1', 'link', NULL, '9ab817fd4c2e4e7ba6652c4fa46af389', 'js', 2, '2');\nINSERT INTO `onl_cgform_button` VALUES ('108a564643763de3f4c81bc2deb463df', 'bt1', NULL, '激活', '1', 'button', NULL, '05a3a30dada7411c9109306aa4117068', 'js', 1, '2');\nINSERT INTO `onl_cgform_button` VALUES ('5173e0b138c808f03d17d08ec4e66f3a', 'hangjihuo', NULL, '行激活', '0', 'link', NULL, '9ab817fd4c2e4e7ba6652c4fa46af389', 'js', NULL, '2');\nINSERT INTO `onl_cgform_button` VALUES ('7c140322fb6b1da7a5daed8b6edc0fb7', 'tjbpm', NULL, '提交流程', '1', 'link', NULL, '05a3a30dada7411c9109306aa4117068', 'js', 3, '2');\nINSERT INTO `onl_cgform_button` VALUES ('a45bc1c6fba96be6b0c91ffcdd6b54aa', 'genereate_person_config', 'icon-edit', '生成配置', '1', 'link', NULL, 'e2faf977fdaf4b25a524f58c2441a51c', 'js', NULL, '2');\nINSERT INTO `onl_cgform_button` VALUES ('b2807a61e89d9085f308b82247c67c9d', 'aa', NULL, 'aa', '1', 'link', NULL, '05a3a30dada7411c9109306aa4117068', 'js', NULL, '2');\nINSERT INTO `onl_cgform_button` VALUES ('cc1d12de57a1a41d3986ed6d13e3ac11', '链接按钮测试', 'icon-edit', '自定义link', '1', 'link', NULL, 'd35109c3632c4952a19ecc094943dd71', 'js', NULL, '2');\nINSERT INTO `onl_cgform_button` VALUES ('e2a339b9fdb4091bee98408c233ab36d', 'zuofei', NULL, '作废', '1', 'form', NULL, '05a3a30dada7411c9109306aa4117068', 'js', 2, '2');\nINSERT INTO `onl_cgform_button` VALUES ('e95e84b749761b574a9cc0967c06c2a9', 'test1', NULL, '弹出表单', '1', 'button', NULL, '9ab817fd4c2e4e7ba6652c4fa46af389', 'js', 1, '2');\nINSERT INTO `onl_cgform_button` VALUES ('ebcc48ef0bde4433a6faf940a5e170c1', 'button按钮测试', 'icon-edit', '自定义button', '1', 'button', NULL, 'd35109c3632c4952a19ecc094943dd71', 'js', NULL, '2');\n\n-- ----------------------------\n-- Table structure for onl_cgform_enhance_java\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_cgform_enhance_java`;\nCREATE TABLE `onl_cgform_enhance_java`  (\n  `ID` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `BUTTON_CODE` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '按钮编码',\n  `CG_JAVA_TYPE` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '类型',\n  `CG_JAVA_VALUE` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '数值',\n  `CGFORM_HEAD_ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '表单ID',\n  `ACTIVE_STATUS` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '1' COMMENT '生效状态',\n  `EVENT` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'end' COMMENT '事件状态(end:结束，start:开始)',\n  PRIMARY KEY (`ID`) USING BTREE,\n  INDEX `idx_ejava_cgform_head_id`(`CGFORM_HEAD_ID`) USING BTREE,\n  INDEX `idx_ocej_BUTTON_CODE`(`BUTTON_CODE`) USING BTREE,\n  INDEX `idx_ocej_ACTIVE_STATUS`(`ACTIVE_STATUS`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_cgform_enhance_java\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for onl_cgform_enhance_js\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_cgform_enhance_js`;\nCREATE TABLE `onl_cgform_enhance_js`  (\n  `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键ID',\n  `CG_JS` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'JS增强内容',\n  `CG_JS_TYPE` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '类型',\n  `CONTENT` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',\n  `CGFORM_HEAD_ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '表单ID',\n  PRIMARY KEY (`ID`) USING BTREE,\n  INDEX `idx_ejs_cgform_head_id`(`CGFORM_HEAD_ID`) USING BTREE,\n  INDEX `idx_ejs_cg_js_type`(`CG_JS_TYPE`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_cgform_enhance_js\n-- ----------------------------\nINSERT INTO `onl_cgform_enhance_js` VALUES ('0b326acbbc8e52c9c9ecdb19342fc3cf', 'show(){\\n   console.log(\\'form\\',that)\\n   //this.form.setFieldsValue({\\\"name\\\":\\\"name值\\\"})  \\n  that.$nextTick(() => {\\n           //age是对应表的字段名\\n            that.form.setFieldsValue({\\\"age\\\":\\\"999\\\"})\\n          });\\n}\\n\\nonlChange(){\\n   return {\\n     \\n     sex(){\\n        let value = event.value\\n        //alert(\\'触发控件\\',value)\\n        \\n         //性别改动，年龄归零\\n        if(value!=null && value!=\\\"\\\"){   \\n          let values = {\\'age\\':0}\\n          that.triggleChangeValues(values)\\n        }\\n      }\\n     \\n    }\\n }\\n', 'form', NULL, '05a3a30dada7411c9109306aa4117068');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('274b5d741a0262d3411958f0c465c5f0', 'genereate_person_config(row){\\nconsole.log(\\'选择\\',row)\\nalert(row.name + \\'，个人积分配置生成成功！\\');\\n}', 'list', NULL, 'e2faf977fdaf4b25a524f58c2441a51c');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('2cbaf25f1edb620bea2d8de07f8233a1', 'air_china_post_materiel_item_onlChange(){\\n    return {\\n        wl_name(){\\n           \\n            let id = event.row.id\\n            let cnum = event.row.num\\n            let value = event.value\\n            let targrt = event.target\\n            let columnKey = event.column.key\\n           let nval = 200*cnum\\n           console.log(\\'row\\',event.row);\\n           console.log(\\'cnum\\',cnum);\\n           let otherValues = {\\'jifen\\': nval}\\n              \\n                that.triggleChangeValues(targrt,id,otherValues)\\n\\n        }\\n    }\\n}', 'form', NULL, 'e67d26b610dd414c884c4dbb24e71ce3');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('32e7b7373abe0fb9c4dd608b4517f814', '', 'form', NULL, '53a3e82b54b946c2b904f605875a275c');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('35d4ef464e5e8c87c9aa82ea89215fc1', '', 'list', NULL, 'e67d26b610dd414c884c4dbb24e71ce3');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('44cad4eec436328ed3cc134855f8d1d5', ' onlChange(){\\n   return {\\n    name(that, event) {\\n      that.executeMainFillRule()\\n    }\\n  }\\n }', 'form', NULL, '4adec929a6594108bef5b35ee9966e9f');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('4569bc0e6126d2b8a0e0c69b9a47e8db', '', 'list', NULL, '56efb74326e74064b60933f6f8af30ea');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('5e9ccc1e2b977bdd5a873a6bd6311290', 'jihuo_hook(){\\n  console.log(\\'当前选中行的id\\', this);\\n  console.log(\\'this.abc\\', this.abc);\\n   import {useMessage} from \\\"@/hooks/useMessage\\\"\\n        const {createMessage} = useMessage()\\n        function sayHi () {\\n            createMessage.success(\\\"这是代码里的提示：hello world!\\\")\\n        }\\n        sayHi();\\n}\\n\\n\\n\\ntest1(){\\n  this.openCustomModal({\\n    title: \\'测试自定义弹框1\\',\\n    width: 800,\\n     hide: [\\'cc\\']\\n  });\\n}\\n\\nsetup(){\\n    console.log(\\\"进入form: \\\",this)\\n    import { defineComponent, computed, CSSProperties, unref, ref, watchEffect, watch, PropType } from \\'vue\\';\\n  \\n  watch(name,(newValue,oldValue)=>{\\n    console.log(\\\"新值是\\\"+newValue, \\\"旧址是\\\"+oldValue);\\n  })\\n  \\n}', 'list', NULL, '9ab817fd4c2e4e7ba6652c4fa46af389');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('6dd82d8eac166627302230a809233481', 'ces_order_goods_onlChange(){\\n    return {\\n        num(){\\n           \\n            let id = event.row.id\\n            let num = event.row.num\\n            let price = event.row.price\\n\\n            let targrt = event.target\\n            \\n            let nval = price*num\\n            console.log(\\'row\\',event.row);\\n            console.log(\\'num\\',num);\\n            console.log(\\'that\\',that);\\n            let otherValues = {\\'zong_price\\': nval}\\n              \\n            that.triggleChangeValues(otherValues,id,targrt)\\n   \\n\\n        }\\n    }\\n}', 'form', NULL, '56efb74326e74064b60933f6f8af30ea');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('73ff4666e0cf5c2070263345e1e11835', 'one(){\\n  console.log(\\'当前选中行的id\\', this.selectedRowKeys);\\n}\\n\\nbeforeDelete(row){\\n  return new Promise(resolve=>{\\n    console.log(\\'删除数据之前看看数据\\', row);\\n    resolve();\\n  });\\n}', 'list', NULL, '553a4172fde446419cb602dc70f9ee67');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('85e7acd772c8ec322b97a1fd548007e0', '', 'form', NULL, '09fd28e4b7184c1a9668496a5c496450');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('8b76f282ddc81ce99a129e90fdd977ce', '', 'form', NULL, '86bf17839a904636b7ed96201b2fa6ea');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('90394fbc3d48978cc0937bc56f2d5370', '', 'list', NULL, 'deea5a8ec619460c9245ba85dbc59e80');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('a0ca1d842f138ba2cda00bc44e95edd9', 'loaded(){\\n  this.$nextTick(()=>{\\n    let text = \\'测试js增强设置默认值\\';\\n    if(this.isUpdate.value === true){\\n      text = \\'测试js增强修改表单值\\';\\n    }\\n    this.setFieldsValue({\\n      name: text\\n    })\\n  })\\n}\\n\\n onlChange(){\\n   return {\\n    name(){\\n      let value = event.value\\n      let values = {\\'dhwb\\': \\'我的名称是：\\'+ value }\\n      this.triggleChangeValues(values)\\n    }\\n  }\\n }\\n\\nbeforeSubmit(row){\\n\treturn new Promise((resolve, reject)=>{\\n    //此处模拟等待时间，可能需要发起请求\\n    setTimeout(()=>{\\n      if(row.name == \\'test\\'){\\n        // 当某个字段不满足要求的时候可以reject \\n        reject(\\'不能提交测试数据\\');\\n      }else{\\n        resolve();\\n      }\\n    },3000)\\n  })\\n}', 'form', NULL, '553a4172fde446419cb602dc70f9ee67');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('ae9cf52fbe13cc718de2de6e1b3d6792', '', 'list', NULL, '18f064d1ef424c93ba7a16148851664f');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('beec235f0b2d633ff3a6c395affdf59d', '', 'list', NULL, '4adec929a6594108bef5b35ee9966e9f');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('c5ac9a2b2fd92ef68274f630b8aec78a', 'tjbpm(row){\\nconst { createMessage, notification ,createConfirm, createConfirmSync, createSuccessModal, createErrorModal, createInfoModal, createWarningModal } = useMessage();\\n  alert(\\'提交流程\\')\\n  createMessage.warn(\\'点击提交流程\\');\\n  console.log(\\'row\\',row)\\n}\\n\\nbt1(){\\n   console.log(\\'that.table.selectionRows\\',this.selectedRowKeys)\\n   console.log(\\'that.table.selectedRowKeys\\',this.selectedRows)\\n   alert(\\'激活全部数据\\')\\n}', 'list', NULL, '05a3a30dada7411c9109306aa4117068');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('d7ddb7aa407f6deed75aac11f0a25f0e', '222', 'list', NULL, '09fd28e4b7184c1a9668496a5c496450');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('de79fe5530e19ccb71b750900892a3a4', 'setup(){\\n    console.log(\\\"进入form: \\\",this)\\n    import { defineComponent, computed, CSSProperties, unref, ref, watchEffect, watch, PropType } from \\'vue\\';\\n  \\n  watch(name,(newValue,oldValue)=>{\\n    console.log(\\\"新值是\\\"+newValue, \\\"旧址是\\\"+oldValue);\\n  })\\n  \\n}', 'form', NULL, '9ab817fd4c2e4e7ba6652c4fa46af389');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('f6f8f230566d09d4b66338955ffb5691', '', 'form', NULL, '18f064d1ef424c93ba7a16148851664f');\nINSERT INTO `onl_cgform_enhance_js` VALUES ('fd711738f58d5481ca0ce9bc3a415223', '', 'list', NULL, '86bf17839a904636b7ed96201b2fa6ea');\n\n-- ----------------------------\n-- Table structure for onl_cgform_enhance_sql\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_cgform_enhance_sql`;\nCREATE TABLE `onl_cgform_enhance_sql`  (\n  `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键ID',\n  `BUTTON_CODE` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '按钮编码',\n  `CGB_SQL` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'SQL内容',\n  `CGB_SQL_NAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'Sql名称',\n  `CONTENT` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',\n  `CGFORM_HEAD_ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '表单ID',\n  PRIMARY KEY (`ID`) USING BTREE,\n  INDEX `idx_oces_CGFORM_HEAD_ID`(`CGFORM_HEAD_ID`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_cgform_enhance_sql\n-- ----------------------------\nINSERT INTO `onl_cgform_enhance_sql` VALUES ('0ebf418bd02f486342123eaf84cd39ad', 'add', '', NULL, '', '18f064d1ef424c93ba7a16148851664f');\nINSERT INTO `onl_cgform_enhance_sql` VALUES ('5ab418a13fd0bbf30ee9dd04203f3c28', 'add', '', NULL, '', '4adec929a6594108bef5b35ee9966e9f');\nINSERT INTO `onl_cgform_enhance_sql` VALUES ('8750b93ba5332460c76c492359d7a06b', 'edit', '', NULL, '', '18f064d1ef424c93ba7a16148851664f');\nINSERT INTO `onl_cgform_enhance_sql` VALUES ('edfab059050b19328ac81e6833b5ebc2', 'delete', '', NULL, '', '18f064d1ef424c93ba7a16148851664f');\n\n-- ----------------------------\n-- Table structure for onl_cgform_field\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_cgform_field`;\nCREATE TABLE `onl_cgform_field`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键ID',\n  `cgform_head_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '表ID',\n  `db_field_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字段名字',\n  `db_field_txt` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字段备注',\n  `db_field_name_old` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '原字段名',\n  `db_is_key` tinyint(1) NULL DEFAULT NULL COMMENT '是否主键 0否 1是',\n  `db_is_null` tinyint(1) NULL DEFAULT NULL COMMENT '是否允许为空0否 1是',\n  `db_is_persist` tinyint(1) NULL DEFAULT NULL COMMENT '是否需要同步数据库字段， 1是0否',\n  `db_type` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '数据库字段类型',\n  `db_length` int(11) NOT NULL COMMENT '数据库字段长度',\n  `db_point_length` int(11) NULL DEFAULT NULL COMMENT '小数点',\n  `db_default_val` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '表字段默认值',\n  `dict_field` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典code',\n  `dict_table` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典表',\n  `dict_text` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典Text',\n  `field_show_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '表单控件类型',\n  `field_href` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '跳转URL',\n  `field_length` int(11) NULL DEFAULT NULL COMMENT '表单控件长度',\n  `field_valid_type` varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '表单字段校验规则',\n  `field_must_input` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字段是否必填',\n  `field_extend_json` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '扩展参数JSON',\n  `field_default_value` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '控件默认值，不同的表达式展示不同的结果。\\r\\n1. 纯字符串直接赋给默认值；\\r\\n2. #{普通变量}；\\r\\n3. {{ 动态JS表达式 }}；\\r\\n4. ${填值规则编码}；\\r\\n填值规则表达式只允许存在一个，且不能和其他规则混用。',\n  `is_query` tinyint(1) NULL DEFAULT NULL COMMENT '是否查询条件0否 1是',\n  `is_show_form` tinyint(1) NULL DEFAULT NULL COMMENT '表单是否显示0否 1是',\n  `is_show_list` tinyint(1) NULL DEFAULT NULL COMMENT '列表是否显示0否 1是',\n  `is_read_only` tinyint(1) NULL DEFAULT 0 COMMENT '是否是只读（1是 0否）',\n  `query_mode` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询模式',\n  `main_table` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '外键主表名',\n  `main_field` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '外键主键字段',\n  `order_num` int(11) NULL DEFAULT NULL COMMENT '排序',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `converter` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '自定义值转换器',\n  `query_def_val` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询默认值',\n  `query_dict_text` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询配置字典text',\n  `query_dict_field` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询配置字典code',\n  `query_dict_table` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询配置字典table',\n  `query_show_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询显示控件',\n  `query_config_flag` varchar(3) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否启用查询配置1是0否',\n  `query_valid_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询字段校验类型',\n  `query_must_input` varchar(3) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询字段是否必填1是0否',\n  `sort_flag` varchar(3) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否支持排序1是0否',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_ocf_cgform_head_id`(`cgform_head_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_cgform_field\n-- ----------------------------\nINSERT INTO `onl_cgform_field` VALUES ('0021c969dc23a9150d6f70a13b52e73e', '402860816aa5921f016aa5921f480000', 'begin_date', '开始时间', 'begin_date', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 4, 'admin', '2019-05-11 15:31:54', '2019-05-11 14:26:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('011ddab07f440f2fb7ab548a4d6fb54f', '05a3a30dada7411c9109306aa4117068', 'sheng', '地区', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'pca', '', 120, '', '0', '', '', 0, 1, 0, 0, 'single', '', '', 10, 'admin', '2026-01-21 11:59:02', '2024-06-12 11:21:08', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('020c1622c3df0aef30185f57874f6959', '79091e8277c744158530321513119c68', 'bpm_status', '流程状态', NULL, 0, 1, 1, 'string', 32, 0, '1', 'bpm_status', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 1, 0, 'single', '', '', 8, 'admin', '2019-05-11 15:29:47', '2019-05-11 15:29:26', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('02b20e692456403e2fed1a89a06833b4', '402860816bff91c0016bff91d2810005', 'phone', '联系方式', 'phone', 0, 1, 1, 'string', 20, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 8, 'admin', '2019-07-19 18:05:55', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('03668009f0ad92b20abb1a377197ee47', 'deea5a8ec619460c9245ba85dbc59e80', 'order_fk_id', '订单外键ID', NULL, 0, 0, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', 'test_order_main', 'id', 10, 'admin', '2020-05-03 01:01:18', '2019-04-20 11:42:53', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('03709092184fdf4a66b0cdb4dd10a159', '402860816bff91c0016bffa220a9000b', 'bpm_status', '流程状态', NULL, 0, 1, 1, 'string', 32, 0, '1', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 46, 'admin', '2019-07-22 16:15:32', '2019-07-19 15:34:44', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('03988419d751a330c2b0f0519a531880', '997ee931515a4620bc30a9c1246429a9', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2020-05-03 00:57:44', '2020-05-03 00:56:56', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('03c105d2706c8286416833684de67406', '79091e8277c744158530321513119c68', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2019-05-11 15:29:47', '2019-05-11 15:27:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('03fd5ab69f331ff760c3f7d86b4a93f8', '4028318169e81b970169e81b97650000', 'log_content', '日志内容', 'log_content', 0, 1, 1, 'string', 1000, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 3, NULL, NULL, '2019-04-04 19:28:36', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('045eb432c418b2b103b1e1b8e8a8a75d', 'fb7125a344a649b990c12949945cb6c1', 'age', '年龄', NULL, 0, 1, 1, 'int', 32, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', NULL, NULL, NULL, '2019-03-26 19:24:11', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('04e4185a503e6aaaa31c243829ff4ac7', 'd35109c3632c4952a19ecc094943dd71', 'birthday', '生日', NULL, 0, 1, 1, 'Datetime', 32, 0, '', '', '', '', 'date', '', 120, '', '0', '', '', 1, 1, 1, 0, 'single', '', '', 9, 'admin', '2023-09-16 21:25:25', '2019-03-15 14:24:35', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('04ff134cb4aae845059e10b3b85f1451', '7ea60a25fa27470e9080d6a921aabbd1', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, NULL, NULL, '2019-04-17 00:22:21', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('051dd70c504c97a028daab2af261ea35', '1acb6f81a1d9439da6cc4e868617b565', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2019-06-10 14:47:14', '2019-04-23 22:58:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('052dcc6f34976b66754fd99415bd22ce', '79091e8277c744158530321513119c68', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2019-05-11 15:29:47', '2019-05-11 15:27:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('054db05394e83b318f097a60bc044134', '402860816bff91c0016bffa220a9000b', 'residence_address', '户籍地址', 'residence_address', 0, 1, 1, 'string', 200, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 28, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('05ed6a78a2e9d0c82bfa2c55898570b8', '997ee931515a4620bc30a9c1246429a9', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 1, 'single', '', '', 1, 'admin', '2020-05-03 00:57:44', '2020-05-03 00:56:56', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('0604945c206e867644e9a44b4c9b20c6', 'fb19fb067cd841f9ae93d4eb3b883dc0', '2', '4', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 5, NULL, NULL, '2019-03-23 11:39:48', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('0617de6d735b37a3f80f2f35ad5d1511', '4028839a6de2ebd3016de2ebd3870000', 'size_type', '尺码类型', 'size_type', 0, 1, 1, 'string', 2, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 13, NULL, NULL, '2019-10-19 15:29:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('0619dfc3fbf9e193534bb3460a1a9d92', 'cb2d8534a2f544bc9c618dd49da66336', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 1, 'single', '', '', 1, 'admin', '2020-02-24 17:22:42', '2020-02-24 15:15:13', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('06a1badae6119abf4ec48858a3e94e1c', '402860816bff91c0016bffa220a9000b', 'sys_org_code', '组织机构编码', 'sys_org_code', 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 43, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('06be12d850f7cb3261111e35c2622f5c', 'b493c5fd4fa64a3a84e74ee171763e37', 'dd', 'dd', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, NULL, NULL, '2021-06-07 18:13:37', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('06f1cfff58395ff62526b894f6182641', 'e67d26b610dd414c884c4dbb24e71ce3', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2019-04-24 11:03:32', '2019-04-24 11:02:57', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('07a307972076a392ffc61b11437f89dd', '402860816bff91c0016bff91c0cb0000', 'create_time', '创建时间', 'create_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 13, 'admin', '2019-07-19 18:09:01', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('07f4776fd641389a8c98a85713990dce', '402860816bff91c0016bff91c0cb0000', 'update_by', '更新人', 'update_by', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 14, 'admin', '2019-07-19 18:09:01', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('08a3353c11efd5f062c3076d0554b5c5', '402881e6760269a20176026d25650002', 'salary_money', '工资', 'salary_money', 0, 1, 1, 'BigDecimal', 10, 3, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'single', NULL, NULL, 5, NULL, NULL, '2020-11-26 10:41:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('08f002095da7c1886c86648fcec38ca9', '56efb74326e74064b60933f6f8af30ea', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 6, 'admin', '2020-07-10 16:53:27', '2020-05-08 23:45:32', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('09450359eb90b40d224ec43588a62f9e', '402860816bff91c0016bff91c0cb0000', 'user_id', '用户ID', 'user_id', 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 3, 'admin', '2019-07-19 18:09:01', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('0a1208184216d9f5defa41d08040a8fd', 'a2ca0c7297a8491ca849fc1a06c9efbf', 'sex', 'sex', NULL, 0, 1, 1, 'string', 32, 0, '', 'sex', '', '', 'list', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, 'admin', '2021-01-24 14:39:35', '2021-01-24 14:38:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('0a4cdcb7e54f614ab952024f6c72bb6d', 'beee191324fd40c1afec4fda18bd9d47', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2019-04-13 13:41:13', '2019-04-13 13:40:56', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('0aad6fa0bf0965a6be1df8aa6005afb4', 'feea98637c2144caae7c5d56a815a245', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 6, NULL, NULL, '2021-10-27 10:24:24', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('0acfc27e493c204f72d42b6dc00a2ded', '53a3e82b54b946c2b904f605875a275c', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2022-10-25 11:10:48', '2020-05-07 22:49:47', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('0ad547ea9cab1e0f2b185ab3dc963fe6', '402881fd812267500181226787d90001', 'sheng', '地区', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'pca', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 11, NULL, NULL, '2024-06-12 11:21:08', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('0adc06d9b497684bcbb5a781e044517c', '1acb6f81a1d9439da6cc4e868617b565', 'supplier', '供应商', NULL, 0, 1, 1, 'string', 32, 0, '', 'air_china_ supplier', '', '', 'list', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 15, 'admin', '2019-06-10 14:47:14', '2019-04-24 16:52:00', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('0ae4bc5d4921aa240d814e018ddb7779', '56efb74326e74064b60933f6f8af30ea', 'money', '订单总额', NULL, 0, 1, 1, 'double', 10, 3, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 9, 'admin', '2020-07-10 16:53:27', '2020-05-08 23:45:32', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('0b3e833ac4aae3a13ec2f8ae460708f8', '4028839a6de2ebd3016de2ebd3870000', 'no', '预算表序号', 'no', 0, 1, 1, 'string', 50, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 8, NULL, NULL, '2019-10-19 15:29:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('0ba1bf74e2a6a94a7a63010ec7230706', '402860816bff91c0016bffa220a9000b', 'update_time', '更新时间', 'update_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 42, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('0bd10d416252bdc6b169056d2a1a4a68', '402880e5721355dd01721355dd390000', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 3, NULL, NULL, '2020-05-14 21:18:14', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('0c34ebfe2e2a619d42db13f93d2a2d40', 'b81de38db24047b497d476516f8a0865', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, NULL, NULL, '2020-02-24 14:56:08', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('0cba94f0497d4d3d829fc573f58eff9f', '402860816bff91c0016bffa220a9000b', 'graduation_time', '毕业时间', 'graduation_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 16, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('0d00c51a4ddad2598a587fadc968a8b2', '402860816bff91c0016bff91cfea0004', 'sys_org_code', '组织机构编码', 'sys_org_code', 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 13, 'admin', '2019-07-19 18:05:13', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('0d1b1fde3a27bf78aed05edbaf9e922d', '402881fd812267500181226787d90001', 'year', '年', NULL, 0, 1, 1, 'Date', 0, 0, '', '', '', '', 'date', '', 120, '', '0', '{\\\"labelLength\\\":6,\\\"picker\\\":\\\"year\\\"}', '', 0, 1, 1, 0, 'single', '', '', 12, NULL, NULL, '2024-06-12 11:21:08', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('0ddd0c0afc967a9ab6050401ca62a4be', 'e67d26b610dd414c884c4dbb24e71ce3', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2019-04-24 11:03:32', '2019-04-24 11:02:57', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('0e157503e648653836a602f5bbad4e83', '402881e6760269a201760269a2af0000', 'files', '文件', NULL, 0, 1, 1, 'string', 1000, 0, '', '', '', '', 'file', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 15, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('0e5fb96c3f5a37c758eb7f5d1322694f', '402880e5721355dd01721355dd390000', 'good_name', '商品名字', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 7, NULL, NULL, '2020-05-14 21:18:14', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('0fb6fa76c5c78a1e957dbb411e110738', '402860816bff91c0016bff91d8830007', 'politically_status', '政治面貌', 'politically_status', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 7, 'admin', '2019-07-19 18:04:41', '2019-07-17 18:54:37', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('0fd6b83f09ea78d32094aabbdf639a36', '553a4172fde446419cb602dc70f9ee67', 'wenjian', '文件', NULL, 0, 1, 1, 'string', 250, 0, NULL, '', '', '', 'file', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 16, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('105be0f7d827a0324216cf8af268fb9e', '09fd28e4b7184c1a9668496a5c496450', 'birthday', '客户生日', NULL, 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'datetime', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 9, 'admin', '2022-05-07 19:05:56', '2020-05-08 23:51:49', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('105c8e44ad13026b641f0363601f30f3', 'e5464aa8fa7b47c580e91593cf9b46dc', 'num', '循环数量', NULL, 0, 1, 1, 'int', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 9, 'admin', '2019-04-24 17:09:49', '2019-04-24 11:05:10', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('10b78ee7954f230117689a226c44c0db', '402880e570a5d7000170a5d700f50000', 'descc', '描述', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 11, NULL, NULL, '2020-03-04 21:58:16', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('10cfb512423f929b6a488f5e50923199', '402881fd812267500181226750e90000', 'contents', '商品简介', NULL, 0, 1, 1, 'Text', 0, 0, '', '', '', '', 'umeditor', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 10, NULL, NULL, '2022-06-02 11:13:25', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('1130f1e252533529bb1167b896dffe32', 'deea5a8ec619460c9245ba85dbc59e80', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2020-05-03 01:01:18', '2019-04-20 11:41:19', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('117fc4ba649d6690a3ac482ad5e4ad38', '56870166aba54ebfacb20ba6c770bd73', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2025-11-27 18:19:45', '2019-04-20 11:38:39', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('12aa08f8e948e2b60b40a7b6429c866b', '56efb74326e74064b60933f6f8af30ea', 'order_code', '订单编码', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '${shop_order_num}', 0, 1, 1, 1, 'single', '', '', 7, 'admin', '2020-07-10 16:53:27', '2020-05-08 23:45:32', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('13246645b7650491b70205d99703ca06', '402860816aa5921f016aa5dedcb90009', 'bpm_status', '流程状态', 'bpm_status', 0, 1, 1, 'string', 32, 0, '1', 'bpm_status', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 1, 0, 'group', '', '', 8, 'admin', '2019-05-11 15:56:47', '2019-05-11 15:50:08', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('135dd0ee50712722db65b8762bd487ea', '8994f2817b5a45d9890aa04497a317c5', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 4, NULL, NULL, '2019-03-23 11:39:16', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('13d9c22ba0a4f09111d115022a148d23', '09fd28e4b7184c1a9668496a5c496450', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2022-05-07 19:05:56', '2020-05-08 23:51:49', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('14b7e6161d1f908e13026439af302a66', '3b5e18da618247539481816995b6bf9f', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2020-07-11 11:27:29', '2020-07-11 11:27:17', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('14ec4c83c29966ab42b6b718c5a3e774', '7ea60a25fa27470e9080d6a921aabbd1', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, NULL, NULL, '2019-04-17 00:22:21', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('154ba4ca5328866010e042086ffc2b81', '56efb74326e74064b60933f6f8af30ea', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 1, 'single', '', '', 1, 'admin', '2020-07-10 16:53:27', '2020-05-08 23:45:32', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('15768c8d3a9b43069678c017e1fa1d15', '5517e93b148a42a7b82d5f3f94542dcf', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, NULL, NULL, '2022-07-19 19:36:53', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('157bcfec23eceb0bc9197c4ac13375c5', '41de7884bf9a42b7a2c5918f9f765dff', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'datetime', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2022-11-23 12:01:36', '2022-10-29 17:02:47', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('16363d0bc125125e395772278d0cf22e', '4b556f0168f64976a3d20bfb932bc798', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, NULL, NULL, '2019-04-12 23:38:28', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('168426cf1016cf0b99705ae1c4c8591e', '402880e5721355dd01721355dd390000', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 1, 'single', NULL, NULL, 1, NULL, NULL, '2020-05-14 21:18:14', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('16918ac159cb6313fec1dea7ac4bd0a0', '402880eb71d52dc30171d52dc3a10000', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 10, NULL, NULL, '2020-05-02 19:37:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('16963d4264b4abcb46beb21c66459350', '41de7884bf9a42b7a2c5918f9f765dff', 'name', '客户名字', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 200, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 6, 'admin', '2022-11-23 12:01:36', '2022-10-29 17:02:47', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('179c290e383009810fb738f07bd5af8d', '402860816bff91c0016bff91d2810005', 'id', 'id', 'id', 1, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'group', '', '', 1, 'admin', '2019-07-19 18:05:55', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('17cbda69da9dd3632625a0647c259070', '73162c3b8161413e8ecdca7eb288d0c9', 'wl_name', '物料名字', NULL, 0, 1, 1, 'string', 200, 0, '', '', '', '', 'text', '', 120, NULL, '1', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2019-07-01 14:23:32', '2019-06-10 15:18:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('182d038554a6ee7ddfd07763aaa10686', '53a3e82b54b946c2b904f605875a275c', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2022-10-25 11:10:48', '2020-05-07 22:49:47', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('18fefb2257901f05508f8ec13ada78a3', 'e5464aa8fa7b47c580e91593cf9b46dc', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, 'admin', '2019-04-24 17:09:48', '2019-04-24 11:05:10', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('191705159cea35e8cbacb326f172be94', 'd35109c3632c4952a19ecc094943dd71', 'search_sel', '搜索下拉', NULL, 0, 1, 1, 'string', 100, 0, '', 'role_code', 'sys_role', 'role_name', 'sel_search', '', 120, '', '0', '', '', 1, 1, 1, 0, 'single', '', '', 17, 'admin', '2023-09-16 21:25:25', '2020-11-26 18:02:20', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('193c3c062cc6ee210970dbe327412e67', '553a4172fde446419cb602dc70f9ee67', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, '', '0', NULL, NULL, 0, 0, 0, 0, 'single', NULL, NULL, 1, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('1973ef1d3728fbff2db6a352e001f5f7', 'fb7125a344a649b990c12949945cb6c1', 'name', '用户名', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 5, 'admin', '2019-03-26 19:24:11', '2019-03-26 19:01:52', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('19a9bf071cf3aa3b2ef94344d2300616', '402881e6760269a20176026d25650002', 'create_by', '创建人', 'create_by', 0, 1, 1, 'string', 32, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'single', NULL, NULL, 12, NULL, NULL, '2020-11-26 10:41:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('1ab5be1f937f393b3e5cc214ef1b855c', '7ea60a25fa27470e9080d6a921aabbd1', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, NULL, NULL, '2019-04-17 00:22:21', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('1b071c02de2830f9fe82a542b31cce7f', '3b5e18da618247539481816995b6bf9f', 'age', '年龄', NULL, 0, 1, 1, 'int', 10, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, 'admin', '2020-07-11 11:27:29', '2020-07-11 11:27:17', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('1b6c7b95028bed9ff656d65557dd2bdf', '402860816bff91c0016bffa220a9000b', 'user_id', '用户id', 'user_id', 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 3, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('1c2f307e315bac77a6d3f02e88387a43', 'deea5a8ec619460c9245ba85dbc59e80', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, 'admin', '2020-05-03 01:01:18', '2019-04-20 11:41:19', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('1c3b2ad0a52ecb47fa7fd53f25875beb', 'deea5a8ec619460c9245ba85dbc59e80', 'price', '价格', NULL, 0, 1, 1, 'double', 32, 0, '', '', '', '', 'text', '', 120, 'n', '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2020-05-03 01:01:18', '2019-04-20 11:41:19', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('1c4d25a12388c80d397bb4f4664fe4e6', '4b556f0168f64976a3d20bfb932bc798', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, NULL, NULL, '2019-04-12 23:38:28', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('1cb1bad94673821cbbe1c0cfbcb4a0e2', '402881fd812267500181226787d90001', 'name', '用户名', NULL, 0, 1, 1, 'string', 32, 0, '', 'username', 'tj_user_report', 'name', 'popup', '', 120, '', '0', '', '', 1, 1, 1, 0, 'single', NULL, NULL, 6, 'admin', '2022-06-02 11:13:48', '2022-06-02 11:13:39', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '1');\nINSERT INTO `onl_cgform_field` VALUES ('1cfe967bb457cbaa6e041e45d019b583', '402860816bff91c0016bff91c7010001', 'update_time', '更新时间', 'update_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 10, 'admin', '2019-07-19 18:07:47', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('1d0037eba10efd76be45150479399a7e', '8d66ea41c7cc4ef9ab3aab9055657fc9', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, NULL, NULL, '2020-05-07 22:46:32', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('1d712db19506ee40b2c1ef5a611baf88', '53a3e82b54b946c2b904f605875a275c', 'name', '商品名字', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 6, 'admin', '2022-10-25 11:10:48', '2020-05-07 22:49:47', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('1e37ae77c0d406d4ff3c5442ec63cd1f', '8d66ea41c7cc4ef9ab3aab9055657fc9', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, NULL, NULL, '2020-05-07 22:46:32', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('1e3d8cfbf12155559666a23ee2c6c5ca', 'e5464aa8fa7b47c580e91593cf9b46dc', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2019-04-24 17:09:49', '2019-04-24 11:05:10', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('1ed46fdeb289bd7805c9b83332ccd3b4', '402860816bff91c0016bff91d2810005', 'relation', '关系', 'relation', 0, 1, 1, 'string', 20, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 4, 'admin', '2019-07-19 18:05:55', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('1eda61dece35abd76b8d8d49e1b139b8', '8d66ea41c7cc4ef9ab3aab9055657fc9', 'content', '描述', NULL, 0, 1, 1, 'string', 200, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, NULL, NULL, '2020-05-07 22:46:32', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('1f0c6d33b79713fe79fb30373c81f6f7', '758334cb1e7445e2822b60e807aec4a3', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, NULL, NULL, '2019-10-18 18:02:09', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('1fa5f07b3e70d4925b69b2bf51309421', '56870166aba54ebfacb20ba6c770bd73', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2025-11-27 18:19:45', '2019-04-20 11:38:39', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('209ddb923d8dab9f454d56d82c0cc725', '3d447fa919b64f6883a834036c14aa67', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2025-05-15 18:26:26', '2020-02-20 16:19:00', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('20ff34fb0466089cb633d73d5a6f08d6', 'd35109c3632c4952a19ecc094943dd71', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2023-09-16 21:25:25', '2019-03-15 14:24:35', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('2113a4ec7b88b4820dcbbdf96e46bbb7', 'fbc35f067da94a70adb622ddba259352', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, NULL, NULL, '2019-07-03 19:44:23', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('2150e48b2cb6072d2d8ecd79a7daf7cc', '402860816bff91c0016bff91ca7e0002', 'create_time', '创建时间', 'create_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 10, 'admin', '2019-07-19 18:07:13', '2019-07-17 18:54:33', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('2323239efb5a40b73034411868dfc41d', 'fb19fb067cd841f9ae93d4eb3b883dc0', 'update_by', '更新人登录名称', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 3, NULL, NULL, '2019-03-23 11:39:48', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('23f42061ed218bdbc1262913c071e1cd', 'e5464aa8fa7b47c580e91593cf9b46dc', 'iz_valid', '启动状态', NULL, 0, 1, 1, 'int', 2, 0, '', 'air_china_valid', '', '', 'list', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 12, 'admin', '2019-04-24 17:09:49', '2019-04-24 14:09:06', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('242cc59b23965a92161eca69ffdbf018', 'd35109c3632c4952a19ecc094943dd71', 'age', '年龄', NULL, 0, 1, 1, 'int', 32, 0, '', '', '', '', 'text', 'http://www.baidu.com', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2023-09-16 21:25:25', '2019-03-15 14:24:35', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('25d91ca4cdc3919c7557d23caf7ed6de', 'f9fb8bee1a64472889d077c757b9acc7', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2021-08-17 13:58:15', '2021-08-17 13:57:48', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('2640235b9638547f1776b930bd8c12b4', '997ee931515a4620bc30a9c1246429a9', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2020-05-03 00:57:44', '2020-05-03 00:56:56', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('265702edb8872e322fe72d3640e34ac5', '402860816bff91c0016bff91cfea0004', 'from_time', '开始日期', 'from_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 3, 'admin', '2019-07-19 18:05:13', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('26be1b96f3c5d1f25254cc8ab60a268a', '5517e93b148a42a7b82d5f3f94542dcf', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 1, 'single', '', '', 0, NULL, NULL, '2022-07-19 19:36:53', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('2739ab1ece4d6053ba931bb6572f4ed8', '4028839a6de2ebd3016de2ebd3870000', 'iz_valid', '启用状态', 'iz_valid', 0, 1, 1, 'string', 2, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 9, NULL, NULL, '2019-10-19 15:29:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('273b0fd37640a9ef1614e987e2bc44a0', '8d66ea41c7cc4ef9ab3aab9055657fc9', 'pics', '图片', NULL, 0, 1, 1, 'string', 500, 0, '', '', '', '', 'image', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 9, NULL, NULL, '2020-05-07 22:46:32', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('281ce0b5343cd42b28825d7df16422f1', 'b81de38db24047b497d476516f8a0865', 'vv', 'vv', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, NULL, NULL, '2020-02-24 14:56:08', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('283f42283b9d0bf3b95ba3384ab2d255', '758334cb1e7445e2822b60e807aec4a3', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, NULL, NULL, '2019-10-18 18:02:09', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('284864d99fddfdcb00e188e3a512cb28', '1acb6f81a1d9439da6cc4e868617b565', 'no', '预算表序号', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 10, 'admin', '2019-06-10 14:47:14', '2019-04-23 22:58:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('2889d3cef706f91e092d76a56b8055be', '402860816bff91c0016bff91cda80003', 'order_no', '序号', 'order_no', 0, 1, 1, 'int', 10, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 8, 'admin', '2019-07-19 18:06:36', '2019-07-17 18:54:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('28900c8e76dd0e77193cbd85b5bc6af8', '402881e6760269a201760269a2af0000', 'remakr', 'markdown', NULL, 0, 1, 1, 'Text', 0, 0, '', '', '', '', 'markdown', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 16, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('28ab929fd8535396feee2995ad6a2dd5', '553a4172fde446419cb602dc70f9ee67', 'zdys', '自定义树', NULL, 0, 1, 1, 'string', 255, 0, NULL, '0', 'sys_category', 'id,pid,name,has_child', 'sel_tree', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 32, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('293f6bc9a0f557a32bbdf45669404f35', 'feea98637c2144caae7c5d56a815a245', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 1, 'single', '', '', 1, NULL, NULL, '2021-10-27 10:24:24', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('29e4abea55d9fa7dbbd0c8dbbb2b3756', '402860816bff91c0016bff91cda80003', 'update_time', '更新时间', 'update_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 12, 'admin', '2019-07-19 18:06:36', '2019-07-17 18:54:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('2aef31179964d0a5a945df7bddff00ae', '53a3e82b54b946c2b904f605875a275c', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2022-10-25 11:10:48', '2020-05-07 22:49:47', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('2c9be627e7cab7f5a2ae9c7ca7ce94a2', 'cb2d8534a2f544bc9c618dd49da66336', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2020-02-24 17:22:42', '2020-02-24 15:15:14', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('2d53a66f0b72d820b86ff445e2181d76', 'beee191324fd40c1afec4fda18bd9d47', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, 'admin', '2019-04-13 13:41:13', '2019-04-13 13:40:56', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('2dfc4c81926f678c5f8d5ffd27858201', 'e2faf977fdaf4b25a524f58c2441a51c', 'account', '用户编码', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2019-06-10 17:27:00', '2019-04-24 17:12:11', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('2e0374878fb3d5be3b0b3f868a97fb59', '09fd28e4b7184c1a9668496a5c496450', 'sex', '客户性别', NULL, 0, 1, 1, 'string', 1, 0, '', 'sex', '', '', 'list', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, 'admin', '2022-05-07 19:05:56', '2020-05-08 23:51:49', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('2e5275b6407e1b4265af8519077fa4a5', 'd3ae1c692b9640e0a091f8c46e17bb01', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 6, NULL, NULL, '2019-07-24 14:47:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('2e66b9db37648389e0846e2204111732', '73162c3b8161413e8ecdca7eb288d0c9', 'has_child', '是否有子节点', NULL, 0, 1, 1, 'string', 3, 0, '', 'valid_status', '', '', 'list', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 10, 'admin', '2019-07-01 14:23:32', '2019-06-10 15:18:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('2e9f4340f5cc919f83d50db558cf5598', '41de7884bf9a42b7a2c5918f9f765dff', 'age', '年龄', NULL, 0, 1, 1, 'int', 10, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, 'admin', '2022-11-23 12:01:36', '2022-10-29 17:02:47', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('2ee58d8e4844dfe1fa6b1b841ae0b312', '402860816bff91c0016bff91d2810005', 'politically_status', '政治面貌', 'politically_status', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 7, 'admin', '2019-07-19 18:05:55', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('2f111722eb3a994450e67e3211fd69a8', '402860816bff91c0016bff91ca7e0002', 'id', 'id', 'id', 1, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'group', '', '', 1, 'admin', '2019-07-19 18:07:13', '2019-07-17 18:54:33', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('2f13bd36aadfe10fb79c57d727279981', 'feea98637c2144caae7c5d56a815a245', 'aaa', 'aa', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, NULL, NULL, '2021-10-27 10:24:24', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('30143cc3de69c413828f9fba20662026', '402860816bff91c0016bffa220a9000b', 'healthy', '健康状况', 'healthy', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 12, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('306e3fb9c87ca6442cefbd61f498f1f7', '402881e6760269a201760269a2af0000', 'dep_sel', '选择部门', NULL, 0, 1, 1, 'string', 200, 0, '', '', '', '', 'sel_depart', '', 120, NULL, '0', '', '#{sysOrgCode}', 0, 1, 1, 0, 'single', NULL, NULL, 19, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('3087aa8f38c787e066a886d950a9edfa', '05a3a30dada7411c9109306aa4117068', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, 'admin', '2026-01-21 11:59:02', '2020-05-06 11:34:31', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('310c86bfd1e67500774c208d601acdc3', '56870166aba54ebfacb20ba6c770bd73', 'xiala', '下拉多选', NULL, 0, 1, 1, 'string', 32, 0, '', 'sex', '', '', 'list_multi', '', 120, '', '0', '', '', 1, 1, 1, 0, 'single', '', '', 8, 'admin', '2025-11-27 18:19:46', '2020-11-30 21:08:26', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('31193dc8ceacf979e4042e784ea8278a', '402880e570a5d7000170a5d700f50000', 'order_fk_id', '订单外键ID', NULL, 0, 0, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 10, NULL, NULL, '2020-03-04 21:58:16', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('31fd90306c3942f09cb79deabbf2f541', '402860816bff91c0016bff91d2810005', 'employee_id', '员工ID', 'employee_id', 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', 'oa_employee_info', 'id', 2, 'admin', '2019-07-19 18:05:55', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('336495117e3a31351fed6963b950dddb', '402860816bff91c0016bffa220a9000b', 'inside_transfer', '内部工作调动情况', 'inside_transfer', 0, 1, 1, 'string', 255, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 37, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('34138092d743d4232341a920efd2699e', '402880eb71d52dc30171d52dc3a10000', 'name', '名称', NULL, 0, 1, 1, 'string', 200, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '#{sysUserName}', 0, 1, 1, 0, 'single', NULL, NULL, 3, NULL, NULL, '2020-05-02 19:37:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('345c8b48e1e128e77c4c6e2b36512804', '402860816aa5921f016aa5dedcb90009', 'create_by', '创建人', 'create_by', 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'group', '', '', 2, 'admin', '2019-05-11 15:56:47', '2019-05-11 15:50:08', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('34625a911b39e0596690c1a15f784448', '402880e570a5d7000170a5d700f50000', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 5, NULL, NULL, '2020-03-04 21:58:16', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('3489a6451bbbcabc0f39ca04b0dd62f2', '8d66ea41c7cc4ef9ab3aab9055657fc9', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 6, NULL, NULL, '2020-05-07 22:46:32', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('34ecf29484ffd4b287bd34b52cf89775', 'a2ca0c7297a8491ca849fc1a06c9efbf', 'name', 'name', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2021-01-24 14:39:35', '2021-01-24 14:38:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('34f0c4cb0049ef71735e9f12a1006a9c', '41de7884bf9a42b7a2c5918f9f765dff', 'address', '地址', NULL, 0, 1, 1, 'string', 300, 0, '', '', '', '', 'pca', '', 200, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 11, NULL, NULL, '2022-11-23 12:01:37', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('351faaeb2dd8105e9c66f678211c9d4f', 'dbf4675875e14676a3f9a8b2b8941140', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, NULL, NULL, '2019-05-27 18:02:07', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('35417ba3993afe3405e1e0b9abbd7e1b', '402880e5721355dd01721355dd390000', 'num', '数量', NULL, 0, 1, 1, 'int', 10, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 9, NULL, NULL, '2020-05-14 21:18:14', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('354b2ce39c5e8ec3f0bbb01bf8ff0fb7', '32f75e4043ef4070919dbd4337186a3d', 'content', '描述', NULL, 0, 1, 1, 'string', 300, 0, '', '', '', '', 'textarea', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 9, 'admin', '2019-04-11 10:15:31', '2019-03-28 15:24:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('35ca1c8aa1501bc8a79c880928841f18', '402860816aa5921f016aa5921f480000', 'update_by', '修改人id', 'update_by', 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'group', '', '', 11, 'admin', '2019-05-11 15:31:55', '2019-05-11 14:26:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('3635793767371c6db9f76b4b79f9d321', '402860816bff91c0016bff91d8830007', 'create_time', '创建时间', 'create_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 11, 'admin', '2019-07-19 18:04:41', '2019-07-17 18:54:37', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('36de6b200a489f1fedc8cdbebfa264ee', '553a4172fde446419cb602dc70f9ee67', 'bmxz', '部门选择', NULL, 0, 1, 1, 'string', 100, 0, NULL, '', '', '', 'sel_depart', '', 120, '', '0', '', '', 1, 1, 1, 0, 'single', '', '', 24, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('370a6eebc2d732eaf121fe0830d853a6', 'e5464aa8fa7b47c580e91593cf9b46dc', 'wl_code', '物料编码', NULL, 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 7, 'admin', '2019-04-24 17:09:49', '2019-04-24 11:05:10', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('3722bec99d589389c6b974accd87b060', '402881fd812267500181226787d90001', 'birthday', '生日', NULL, 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 9, 'admin', '2022-06-02 11:13:48', '2022-06-02 11:13:39', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('37462a4d78968d0e432d746423603b81', '3d447fa919b64f6883a834036c14aa67', 'province', '省份', NULL, 0, 1, 1, 'string', 100, 0, '', '', '{table:\\'sys_category\\',txt:\\'name\\',key:\\'id\\',linkField:\\'city,area\\',idField:\\'id\\',pidField:\\'pid\\', condition:\\\" pid = \\'1230769196661510146\\' \\\"         }', '', 'link_down', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 1, 'admin', '2025-05-15 18:26:26', '2020-02-20 16:19:00', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('375957774c7d424ce9a58d84d4c4387f', '553a4172fde446419cb602dc70f9ee67', 'yhxz', '用户选择', NULL, 0, 1, 1, 'string', 100, 0, NULL, '', '', '', 'sel_user', '', 120, '', '0', '', '', 1, 1, 1, 0, 'single', '', '', 25, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('37e2548874f09ef7d08642a30bc918fa', 'fbc35f067da94a70adb622ddba259352', 'group_name', '小组名', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, NULL, NULL, '2019-07-03 19:44:23', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('3816bb487c6665a5f2ae7a4dbcbc9095', 'd35109c3632c4952a19ecc094943dd71', 'sel_table', '下拉字典表', NULL, 0, 1, 1, 'string', 32, 0, '', 'username', 'sys_user where username like \\'a%\\'', 'realname', 'sel_search', '', 120, '', '0', '{\\\"labelLength\\\":5}', '', 1, 1, 1, 0, 'single', '', '', 18, 'admin', '2023-09-16 21:25:25', '2021-07-01 12:29:11', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('391e7cbd9f29743b11bb555c50547b1f', '32f75e4043ef4070919dbd4337186a3d', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2019-04-11 10:15:32', '2019-03-27 15:54:49', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('393227a51251906a91f4e05a095eb1ba', '553a4172fde446419cb602dc70f9ee67', 'markdown', 'markdown', NULL, 0, 1, 1, 'Blob', 0, 0, NULL, '', '', '', 'markdown', '', 120, '', '0', '', '', 0, 1, 0, 0, 'single', '', '', 27, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('396c36fa5320975851d06772d10ea7b1', 'cb2d8534a2f544bc9c618dd49da66336', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2020-02-24 17:22:42', '2020-02-24 15:15:14', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('3aa6c41ffd2cd6321f91f60e6c6b7191', '402881fd812267500181226787d90001', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 2, 'admin', '2022-06-02 11:13:48', '2022-06-02 11:13:39', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('3acd1b022fd8cb6b99534161fa3d6a24', 'd35109c3632c4952a19ecc094943dd71', 'ceck', 'checkbox', NULL, 0, 1, 1, 'string', 32, 0, '', 'sex', '', '', 'checkbox', '', 120, '', '0', '', '', 1, 1, 1, 0, 'single', '', '', 15, 'admin', '2023-09-16 21:25:25', '2020-11-26 18:02:20', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('3b439859f98e30e34d25e983eb22e408', '402860816bff91c0016bff91c7010001', 'award_time', '获奖时间', 'award_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 3, 'admin', '2019-07-19 18:07:47', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('3b67be0187044a0d023fc2c4c7eceabc', '402881e6760269a20176026d25650002', 'bonus_money', '奖金', 'bonus_money', 0, 1, 1, 'double', 10, 2, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'single', NULL, NULL, 6, NULL, NULL, '2020-11-26 10:41:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('3bf44e68de518f3ddf72b87671d0ff90', '8994f2817b5a45d9890aa04497a317c5', 'update_by', '更新人登录名称', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 3, NULL, NULL, '2019-03-23 11:39:16', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('3c74df163f36d1ac61af6811d2569d6c', 'f9fb8bee1a64472889d077c757b9acc7', 'ds', 'ds', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 10, 'admin', '2021-08-17 13:58:15', '2021-08-17 13:57:48', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('3cd2061ea15ce9eeb4b7cf2e544ccb6b', 'd35109c3632c4952a19ecc094943dd71', 'file_kk', '附件', NULL, 0, 1, 1, 'string', 500, 0, '', '', '', '', 'file', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 12, 'admin', '2023-09-16 21:25:25', '2019-06-10 20:06:57', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('3cfd4d60c7d8409ae716a579bcb0910d', '402860816bff91c0016bff91c0cb0000', 'sys_org_code', '组织机构编码', 'sys_org_code', 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 16, 'admin', '2019-07-19 18:09:01', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('3d72550564009a430d8d9099f47c4a05', '553a4172fde446419cb602dc70f9ee67', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 50, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, '', '0', NULL, NULL, 0, 0, 0, 0, 'single', NULL, NULL, 5, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('3e32f6c30c9028872388f70743c5d6a5', '402860816bff91c0016bff91c0cb0000', 'reason', '申请理由', 'reason', 0, 1, 1, 'string', 200, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 9, 'admin', '2019-07-19 18:09:01', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('3e70d1c516c3533c6698300665c669e1', '402860816bff91c0016bff91c0cb0000', 'id', 'id', 'id', 1, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'group', '', '', 1, 'admin', '2019-07-19 18:09:01', '2019-07-17 18:54:31', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('3ef0a9ed04605267f7fa304a8c353576', '05a3a30dada7411c9109306aa4117068', 'name', '用户名', NULL, 0, 1, 1, 'string', 32, 0, '', 'username', 'tj_user_report', 'name', 'popup', '', 120, '', '0', '', '', 1, 1, 1, 0, 'single', '', '', 7, 'admin', '2026-01-21 11:59:02', '2020-05-06 11:34:31', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '1');\nINSERT INTO `onl_cgform_field` VALUES ('3f2ace8f968a0e5b91d1340ee2957cda', '402860816bff91c0016bff91d8830007', 'real_name', '姓名', 'real_name', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 3, 'admin', '2019-07-19 18:04:41', '2019-07-17 18:54:37', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('3f7f7720ee65648cb2850fccedf7be9d', '53a3e82b54b946c2b904f605875a275c', 'contents', '商品简介', NULL, 0, 1, 1, 'Text', 0, 0, '', '', '', '', 'umeditor', '', 120, '', '0', '', '', 0, 1, 0, 0, 'single', '', '', 9, 'admin', '2022-10-25 11:10:49', '2020-05-07 22:49:47', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('3f9deca6c193f0b2609113713956ad19', '86bf17839a904636b7ed96201b2fa6ea', 'order_main_id', '订单ID', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', 'ces_order_main', 'id', 11, 'admin', '2020-05-14 21:18:49', '2020-05-08 23:48:31', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('3fab15057918efd10650bd31b1dd10cc', '553a4172fde446419cb602dc70f9ee67', 'ldzuy', '联动组件一', NULL, 0, 1, 1, 'string', 255, 0, NULL, '', '\\n{\\n\ttable: \\\"sys_category\\\",\\n\ttxt: \\\"name\\\",\\n\tkey: \\\"id\\\",\\n\tlinkField: \\\"ldzje,ldzjs\\\",\\n\tidField: \\\"id\\\",\\n\tpidField: \\\"pid\\\",\\n\tcondition:\\\"pid = \\'0\\'\\\"\\n}', '', 'link_down', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 29, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('40471eb4560bf0bbd2ffef17d48a269d', 'dbf4675875e14676a3f9a8b2b8941140', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, NULL, NULL, '2019-05-27 18:02:07', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('404b516d4f2229f292783db595b02ba1', '402860816bff91c0016bff91d8830007', 'update_time', '更新时间', 'update_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 13, 'admin', '2019-07-19 18:04:41', '2019-07-17 18:54:37', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('405de5ea82e54138a0613dd41b006dfb', '56870166aba54ebfacb20ba6c770bd73', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2025-11-27 18:19:45', '2019-04-20 11:38:39', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('40675bb9f053aabf8823ddf4b5389141', 'b81de38db24047b497d476516f8a0865', 'aa', 'aa', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, NULL, NULL, '2020-02-24 14:56:08', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('4164314d6a51d100169a29872b7504d8', '402860816bff91c0016bff91ca7e0002', 'cert_time', '发证时间', 'cert_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 3, 'admin', '2019-07-19 18:07:13', '2019-07-17 18:54:33', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('41b80b89de0ceb609eb016dacf106ef8', '553a4172fde446419cb602dc70f9ee67', 'shq', '省市区', NULL, 0, 1, 1, 'string', 100, 0, NULL, '', '', '', 'pca', '', 120, '', '0', '', '', 1, 1, 1, 0, 'single', '', '', 28, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('41d4215c01b0d26871f2cb83d3e532ae', '402860816bff91c0016bff91c0cb0000', 'bpm_status', '流程状态', NULL, 0, 1, 1, 'string', 32, 0, '1', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 17, 'admin', '2019-07-19 18:09:01', '2019-07-19 15:35:23', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('422a44a15fa39fd57c3c23eb601f7c03', '56870166aba54ebfacb20ba6c770bd73', 'descc', '描述', NULL, 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2025-11-27 18:19:46', '2019-04-20 11:38:39', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('42cccfa014c9e131a0a1b23f563d3688', '402860816bff91c0016bffa220a9000b', 'sex', '性别', 'sex', 0, 1, 1, 'string', 20, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 6, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('4312f618c83e07db82e468b81a1eaa45', '402860816bff91c0016bffa220a9000b', 'photo', '照片', 'photo', 0, 1, 1, 'string', 255, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 20, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('4355aaad8679a1adf8578b20310e93c1', 'a2ca0c7297a8491ca849fc1a06c9efbf', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2021-01-24 14:39:35', '2021-01-24 14:38:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('435b57180fc995e3c4ec42516963bca3', '4028839a6de2ebd3016de2ebd3870000', 'wl_code', '物料编码', 'wl_code', 0, 1, 1, 'string', 60, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 6, NULL, NULL, '2019-10-19 15:29:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('44bdc595f1e565fc053e01134b92bb47', 'd3ae1c692b9640e0a091f8c46e17bb01', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, NULL, NULL, '2019-07-24 14:47:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('44e81e24d2384b0f187e8f69eda55390', '402860816bff91c0016bff91cda80003', 'create_time', '创建时间', 'create_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 10, 'admin', '2019-07-19 18:06:36', '2019-07-17 18:54:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('45c0a1a89a1e2a72533b9af894be1011', '27fc5f91274344afa7673a732b279939', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2019-07-01 16:28:20', '2019-07-01 16:26:42', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('45d59eb647257fcbcb9d143ff1ba2080', 'deea5a8ec619460c9245ba85dbc59e80', 'pro_type', '产品类型', NULL, 0, 1, 1, 'string', 32, 0, '', 'sex', '', '', 'radio', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 9, 'admin', '2020-05-03 01:01:18', '2019-04-23 20:54:08', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('469b250595f15dfebe69991d72e4bfb2', 'e9faf717024b4aae95cff224ae9b6d97', 'name', '员工姓名', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 6, 'admin', '2019-07-03 18:23:49', '2019-07-03 18:22:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('46be01bef342519e268902d0d36a7473', 'deea5a8ec619460c9245ba85dbc59e80', 'descc', '描述', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 11, 'admin', '2020-05-03 01:01:18', '2019-04-20 11:41:19', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('46c13ceab79269d151c975bf11847a2e', '553a4172fde446419cb602dc70f9ee67', 'ldzjs', '联动组件三', NULL, 0, 1, 1, 'string', 255, 0, NULL, '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 31, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('46f1a875f86a4f48d0540ad0d5e667d7', '56870166aba54ebfacb20ba6c770bd73', 'order_date', '下单时间', NULL, 0, 1, 1, 'Datetime', 32, 0, '', '', '', '', 'date', '', 120, '', '0', '', '', 1, 1, 1, 0, 'single', '', '', 6, 'admin', '2025-11-27 18:19:46', '2019-04-20 11:38:39', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('470a3a02210932c55950cd673c50705b', '553a4172fde446419cb602dc70f9ee67', 'geshu', 'integer类型', NULL, 0, 1, 1, 'int', 9, 0, NULL, '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 34, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('47c21a6b45e59a6b70bb9c0cc4510a68', '1acb6f81a1d9439da6cc4e868617b565', 'integral_val', '积分值', NULL, 0, 1, 1, 'int', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 13, 'admin', '2019-06-10 14:47:14', '2019-04-23 22:58:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('47fa05530f3537a1be8f9e7a9e98be82', 'd35109c3632c4952a19ecc094943dd71', 'sex', '性别', NULL, 0, 1, 1, 'string', 32, 0, '', 'sex', '', '', 'list', '', 120, '', '0', '', '', 1, 1, 1, 0, 'single', '', '', 6, 'admin', '2023-09-16 21:25:25', '2019-03-15 14:24:35', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '1');\nINSERT INTO `onl_cgform_field` VALUES ('4851697fdf63709d2bc7451b7415f4af', '32f75e4043ef4070919dbd4337186a3d', 'sex', '性别', NULL, 0, 1, 1, 'string', 32, 0, '1', 'sex', '', '', 'list', '', 120, NULL, '0', '', '', 1, 1, 1, 0, 'single', '', '', 6, 'admin', '2019-04-11 10:15:32', '2019-03-27 15:54:49', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('485a8ddce2c033f88af674ec98b68e32', '402860816bff91c0016bffa220a9000b', 'create_time', '创建时间', 'create_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 40, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('4863e3b3e632a254ad3b2ec873767bcb', 'b493c5fd4fa64a3a84e74ee171763e37', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, NULL, NULL, '2021-06-07 18:13:37', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('492a462b212fc34b0ee70e872684ed7e', '7ea60a25fa27470e9080d6a921aabbd1', 'name', '用户名', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 6, NULL, NULL, '2019-04-17 00:22:21', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('499a5dac033a01ce58009e4c5b786697', 'e9faf717024b4aae95cff224ae9b6d97', 'age', '员工年龄', NULL, 0, 1, 1, 'int', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2019-07-03 18:23:49', '2019-07-03 18:22:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('49cd3dbd4f7f7cf0d19b1ee1045cfa69', 'e67d26b610dd414c884c4dbb24e71ce3', 'post_code', '岗位编码', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 6, 'admin', '2019-04-24 11:03:32', '2019-04-24 11:02:57', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('4ad94222c025b56fb0833a88a1514aeb', '86bf17839a904636b7ed96201b2fa6ea', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 1, 'single', '', '', 1, 'admin', '2020-05-14 21:18:49', '2020-05-08 23:48:31', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('4b1d4d7a1c1f7d5b99ae6c6a6d91b403', 'a2ca0c7297a8491ca849fc1a06c9efbf', 'dated', '生日', NULL, 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 10, 'admin', '2021-01-24 14:39:35', '2021-01-24 14:38:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('4ba7c553ca4babcec75273c531cd65e1', '402860816bff91c0016bff91cfea0004', 'workplace', '工作单位', 'workplace', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 5, 'admin', '2019-07-19 18:05:13', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('4c17487e6944555ec05781cd085add08', '553a4172fde446419cb602dc70f9ee67', 'create_time', '创建时间', NULL, 0, 1, 1, 'Datetime', 50, 0, NULL, NULL, NULL, NULL, 'datetime', NULL, 120, 'n6-16', '0', NULL, NULL, 0, 0, 0, 0, 'single', NULL, NULL, 2, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('4c2cba9fc950333421c4193576b8384d', '32f75e4043ef4070919dbd4337186a3d', 'salary', '工资', NULL, 0, 1, 1, 'double', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 10, 'admin', '2019-04-11 10:15:32', '2019-03-28 15:24:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('4c570c5cf05590348e12621ca62773cf', '402860816aa5921f016aa5921f480000', 'name', '请假人', 'name', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 2, 'admin', '2019-05-11 15:31:54', '2019-05-11 14:26:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('4cacfa054e96791ab938b5c8f8e02cd1', '27fc5f91274344afa7673a732b279939', 'bpm_status', '流程状态', NULL, 0, 1, 1, 'string', 2, 0, '', 'bpm_status', '', '', 'list', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 9, NULL, NULL, '2019-07-01 16:28:20', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('4d0b04cbb7db89b5468f32edafb610bc', '402881fd812267500181226750e90000', 'good_type_id', '商品分类', NULL, 0, 1, 1, 'string', 32, 0, '', '0', 'ces_shop_type', 'id,pid,name,has_child', 'sel_tree', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 11, NULL, NULL, '2022-06-02 11:13:25', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('4dc3f7e772564de45773a8379adc4335', '3b5e18da618247539481816995b6bf9f', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2020-07-11 11:27:29', '2020-07-11 11:27:17', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('4e3760f9068aee4318123d85fbf2ebf9', '53a3e82b54b946c2b904f605875a275c', 'good_type_id', '商品分类', NULL, 0, 1, 1, 'string', 32, 0, '', '0', 'ces_shop_type', 'id,pid,name,has_child', 'sel_tree', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 10, 'admin', '2022-10-25 11:10:49', '2020-05-07 22:51:42', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('4f718d95ad9de33eac18fd0663e4c1f1', '32f75e4043ef4070919dbd4337186a3d', 'birthday', '生日', NULL, 0, 1, 1, 'Datetime', 32, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 1, 1, 1, 0, 'single', '', '', 8, 'admin', '2019-04-11 10:15:32', '2019-03-27 15:54:49', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('4f7cba71de7afe6efbd024f5f9935521', '402860816bff91c0016bff91cda80003', 'to_time', '截止时间', 'to_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 4, 'admin', '2019-07-19 18:06:36', '2019-07-17 18:54:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('4faa7848b92f05bcb3cf03de34af9ff2', 'cb2d8534a2f544bc9c618dd49da66336', 'ddd', 'dd', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 9, 'admin', '2020-02-24 17:22:42', '2020-02-24 15:15:14', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('50552383ac67ed56760fb8c84d01de9e', '553a4172fde446419cb602dc70f9ee67', 'xlss', '字典表下拉搜索框', NULL, 0, 1, 1, 'string', 50, 0, NULL, 'username', 'sys_user', 'realname', 'sel_search', '', 120, '', '0', '', '', 1, 1, 1, 0, 'single', '', '', 20, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('506c9b0b2331a24e5c284274d28fe569', '27fc5f91274344afa7673a732b279939', 'kkk', '描述', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, 'admin', '2019-07-01 16:28:20', '2019-07-01 16:26:42', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('508eb28e1409a2a9501cdf6fd7eb24c7', 'dbf4675875e14676a3f9a8b2b8941140', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, NULL, NULL, '2019-05-27 18:02:07', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('509a4f63f02e784bc04499a6a9be8528', 'd35109c3632c4952a19ecc094943dd71', 'update_by', '更新人登录名称', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2023-09-16 21:25:25', '2019-03-15 14:24:35', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('50a1fc04f08226f0e29a62e39d2f87fc', '402881fd812267500181226787d90001', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 5, 'admin', '2022-06-02 11:13:48', '2022-06-02 11:13:39', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('519f68557b953fc2d38400182b187366', '402860816bff91c0016bffa220a9000b', 'residence_type', '户籍类别', 'residence_type', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 13, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('52241dbe405db36d2960765e061c117c', '553a4172fde446419cb602dc70f9ee67', 'yuanjia', 'double类型', NULL, 0, 1, 1, 'double', 6, 2, NULL, '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 33, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('5237e186de11017ee52d3c344f450b3b', 'f9fb8bee1a64472889d077c757b9acc7', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2021-08-17 13:58:15', '2021-08-17 13:57:48', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('524d75f1e4fed1167c80477658290ddf', '402881fd812267500181226787d90001', 'age', '年龄', NULL, 0, 1, 1, 'int', 10, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 1, 1, 1, 0, 'group', NULL, NULL, 7, 'admin', '2022-06-02 11:13:48', '2022-06-02 11:13:39', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '1');\nINSERT INTO `onl_cgform_field` VALUES ('52975c3f03325de8233d3459b2230b09', 'f9fb8bee1a64472889d077c757b9acc7', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 1, 'single', '', '', 1, 'admin', '2021-08-17 13:58:15', '2021-08-17 13:57:48', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('52ee861bc1b62cd8e4f10632b3d9d1b2', '79091e8277c744158530321513119c68', 'name', '顺序会签标题', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 6, 'admin', '2019-05-11 15:29:47', '2019-05-11 15:27:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('5531fb261c77e9d12f7cca1af528f70a', '05a3a30dada7411c9109306aa4117068', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2026-01-21 11:59:02', '2020-05-06 11:34:31', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('553a250fb89de39e4ba9f8450fd72ade', '05a3a30dada7411c9109306aa4117068', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2026-01-21 11:59:02', '2020-05-06 11:34:31', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('555f9d43db20204128d76e22226ca36e', '402881e6760269a201760269a2af0000', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 2, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('5562a7242e4978f02e6d3a08d5828bbf', '53a3e82b54b946c2b904f605875a275c', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, 'admin', '2022-10-25 11:10:48', '2020-05-07 22:49:47', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('5562ad3165b1399f97a48f5f06d7fa06', '3b5e18da618247539481816995b6bf9f', 'ccc', 'cc', NULL, 0, 1, 1, 'string', 1000, 0, '', '', '', '', 'umeditor', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 10, 'admin', '2020-07-11 11:27:29', '2020-07-11 11:27:17', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('55ee63fe34f0b666078e6af940bee222', 'feea98637c2144caae7c5d56a815a245', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, NULL, NULL, '2021-10-27 10:24:24', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('566db879e54b175b20195ca284e76eec', '402881fd812267500181226750e90000', 'chuc_date', '出厂时间', NULL, 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 9, NULL, NULL, '2022-06-02 11:13:25', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('56a7800e4e476812c74217c2aad781aa', '32feeb502544416c9bf41329c10a88f4', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2019-08-23 20:03:40', '2019-07-02 18:23:23', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('56cd0a76f922bf76d982b24a509e4782', '4028839a6de2ebd3016de2ebd3870000', 'create_time', '创建日期', 'create_time', 0, 1, 1, 'Datetime', 0, 0, NULL, NULL, NULL, NULL, 'date', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 3, NULL, NULL, '2019-10-19 15:29:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('56e247f12d62b49cd9bd537e3efecf16', '402860816bff91c0016bff91c0cb0000', 'create_by', '创建人', 'create_by', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 12, 'admin', '2019-07-19 18:09:01', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('57552a4f0b7b5c096ab8985ced57cc7d', 'cb2d8534a2f544bc9c618dd49da66336', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2020-02-24 17:22:42', '2020-02-24 15:15:14', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('581d8e8ce270b762458121b1dea0be9a', '8d66ea41c7cc4ef9ab3aab9055657fc9', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, NULL, NULL, '2020-05-07 22:46:32', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('588400f6ebcdd0bc9bb560dd36636af9', 'e2faf977fdaf4b25a524f58c2441a51c', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2019-06-10 17:27:00', '2019-04-24 17:12:11', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('58a96f945912d33b64ebf5dee98156dc', '402860816bff91c0016bffa220a9000b', 'mobile', '手机号', 'mobile', 0, 1, 1, 'string', 20, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 19, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('58eea85add4788b83c893092434bc413', 'fb19fb067cd841f9ae93d4eb3b883dc0', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 4, NULL, NULL, '2019-03-23 11:39:48', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('59ae1e853668c676e85329aa029c68a6', '402860816bff91c0016bff91c0cb0000', 'status', '状态（1：申请中 2：通过）', 'status', 0, 1, 1, 'string', 2, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 11, 'admin', '2019-07-19 18:09:01', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('5a1ab458d88bb766f92c3d791495cdcd', '402860816bff91c0016bff91d2810005', 'age', '年龄', 'age', 0, 1, 1, 'int', 10, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 5, 'admin', '2019-07-19 18:05:55', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('5a48150409b0960173f091558d1611d0', 'a2ca0c7297a8491ca849fc1a06c9efbf', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 6, 'admin', '2021-01-24 14:39:35', '2021-01-24 14:38:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('5a4ef083dd572114aeb581b6828de545', '402860816bff91c0016bff91c7010001', 'award_name', '获奖名称', 'award_name', 0, 1, 1, 'string', 255, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 5, 'admin', '2019-07-19 18:07:47', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('5a621f27aa443fe9eccc73717e4fa172', '4028318169e81b970169e81b97650000', 'method', '请求java方法', 'method', 0, 1, 1, 'string', 500, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 8, NULL, NULL, '2019-04-04 19:28:36', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('5a655b208d6318ed02f236f15a319b5f', 'fbc35f067da94a70adb622ddba259352', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, NULL, NULL, '2019-07-03 19:44:23', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('5a6f88710c49bbe8e2e0ca58e149abad', '402860816bff91c0016bff91cda80003', 'create_by', '创建人', 'create_by', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 9, 'admin', '2019-07-19 18:06:36', '2019-07-17 18:54:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('5a7ce5af50f28d613d8beea7c866ae0c', '402881e6760269a20176026d25650002', 'update_by', '修改人', 'update_by', 0, 1, 1, 'string', 32, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'single', NULL, NULL, 14, NULL, NULL, '2020-11-26 10:41:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('5ab702dbc37d6fd8d3a1093fda7223bf', '53a3e82b54b946c2b904f605875a275c', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2022-10-25 11:10:48', '2020-05-07 22:49:47', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('5b17ba693745c258f6b66380ac851e5f', 'd35109c3632c4952a19ecc094943dd71', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 0, 'admin', '2023-09-16 21:25:25', '2019-03-15 14:24:35', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('5c25a6636c8d2c93d2859c7db6cb8281', '553a4172fde446419cb602dc70f9ee67', 'xldx', '字典下拉多选框', NULL, 0, 1, 1, 'string', 250, 0, NULL, 'urgent_level', '', '', 'list_multi', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 19, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('5c64d270eb4ee8ea6bf55c7e4257f162', '553a4172fde446419cb602dc70f9ee67', 'flzds', '分类字典树', NULL, 0, 1, 1, 'string', 100, 0, NULL, 'B02', '', '', 'cat_tree', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 23, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('5c76f5ecc774d7339eb0c2199c0052bc', '402860816bff91c0016bff91c0cb0000', 'biz_no', '编号', 'biz_no', 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 2, 'admin', '2019-07-19 18:09:01', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('5c8c8d573e01e4f40b5a7c451515e1d2', '32feeb502544416c9bf41329c10a88f4', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2019-08-23 20:03:40', '2019-07-02 18:23:23', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('5dfbea516ee2390d712eace5405c5219', '402860816bff91c0016bff91ca7e0002', 'create_by', '创建人', 'create_by', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 9, 'admin', '2019-07-19 18:07:13', '2019-07-17 18:54:33', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('5e4484b7348dc3e59a0c58bdc3828cc0', '27fc5f91274344afa7673a732b279939', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2019-07-01 16:28:20', '2019-07-01 16:26:42', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('5e4ac29ac2007ceabf93368330290a42', '402860816bff91c0016bff91d8830007', 'order_no', '序号', 'order_no', 0, 1, 1, 'int', 10, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 9, 'admin', '2019-07-19 18:04:41', '2019-07-17 18:54:37', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('5e729f9823b5cc96c50b0b7c0f07eb05', '402880e5721355dd01721355dd390000', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 2, NULL, NULL, '2020-05-14 21:18:14', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('5f13f7087caa0bbf47e5eba01d0d0443', '05a3a30dada7411c9109306aa4117068', 'contents', '请假原因', NULL, 0, 1, 1, 'string', 500, 0, '', '', '', '', 'umeditor', '', 120, '', '0', '', '', 0, 1, 0, 0, 'single', '', '', 11, 'admin', '2026-01-21 11:59:02', '2020-05-06 11:34:31', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('60b3b452232904f5a1130348bc1eab53', '402881e6760269a20176026d25650002', 'sys_org_code', '所属部门编码', 'sys_org_code', 0, 1, 1, 'string', 64, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'single', NULL, NULL, 16, NULL, NULL, '2020-11-26 10:41:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('60eed6c429cf7796c3f0a17faaed00da', 'b493c5fd4fa64a3a84e74ee171763e37', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, NULL, NULL, '2021-06-07 18:13:37', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('6130dbb6d36bab8ee9154e7ab58af34c', '402880e570a5d7000170a5d700f50000', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 1, NULL, NULL, '2020-03-04 21:58:16', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('617349b18dab429009ccd304fd7d459c', '4028839a6de2ebd3016de2ebd3870000', 'update_by', '更新人', 'update_by', 0, 1, 1, 'string', 50, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 4, NULL, NULL, '2019-10-19 15:29:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('61c7a0058c264dd746eb35e6f50fc15b', '402860816aa5921f016aa5dedcb90009', 'update_time', '更新日期', 'update_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'group', '', '', 5, 'admin', '2019-05-11 15:56:47', '2019-05-11 15:50:08', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('6232ade7e2a0c1e97e2c0945b32e61b6', '402860816bff91c0016bffa220a9000b', 'paying_social_insurance', '是否上社保', 'paying_social_insurance', 0, 1, 1, 'string', 20, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 32, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('631a606d35a74c2036a81f27dd16a1a6', 'feea98637c2144caae7c5d56a815a245', 'dd', 'dd', NULL, 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, NULL, NULL, '2021-10-27 10:24:24', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('635e09afc01aad757faacf1321465c23', 'b81de38db24047b497d476516f8a0865', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, NULL, NULL, '2020-02-24 14:56:08', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('641e74beb228275dc2ca38a977b76c47', '553a4172fde446419cb602dc70f9ee67', 'nyrsfm', '年月日时分秒', NULL, 0, 1, 1, 'Datetime', 0, 0, NULL, '', '', '', 'datetime', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 14, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('6490a98dccb6df218feaeb4ce11bc03b', '402860816aa5921f016aa5921f480000', 'update_time', '修改时间', 'update_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'group', '', '', 10, 'admin', '2019-05-11 15:31:54', '2019-05-11 14:26:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('64d5f0926dfcbf17b6f9f06b8d637177', '402881fd812267500181226787d90001', 'long_ids', '长类型', NULL, 0, 1, 1, 'long', 19, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 15, NULL, NULL, '2025-11-27 11:36:01', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('654362725195829005036b3db47ec826', '402860816bff91c0016bffa220a9000b', 'post', '职务', 'post', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 4, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('656ec51bb57da5a47076f8a26053bbbb', '553a4172fde446419cb602dc70f9ee67', 'zdmrz', '自定义查询', NULL, 0, 1, 1, 'string', 50, 0, NULL, '', '', '', 'text', '', 120, '', '0', '', '1', 1, 1, 1, 0, 'single', '', '', 37, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '1', '', 'sex', '', 'list', '1', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('6603058186832c4ff9e8c6e43baa5c3d', '86bf17839a904636b7ed96201b2fa6ea', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 6, 'admin', '2020-05-14 21:18:49', '2020-05-08 23:48:31', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('66a7ef842bc34e105a90186e48167ef2', 'dbf4675875e14676a3f9a8b2b8941140', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, NULL, NULL, '2019-05-27 18:02:07', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('671e62c685bc86bde3cef0e023418fb4', '05a3a30dada7411c9109306aa4117068', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2026-01-21 11:59:02', '2020-05-06 11:34:31', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('686dea2621feadcd9b4c611df046adb4', '86bf17839a904636b7ed96201b2fa6ea', 'price', '价格', NULL, 0, 1, 1, 'double', 10, 3, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, 'admin', '2020-05-14 21:18:49', '2020-05-08 23:48:31', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('68769fa7e4696e3a28f4cecf63076b7b', '402860816bff91c0016bff91ca7e0002', 'order_no', '序号', 'order_no', 0, 1, 1, 'int', 10, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 8, 'admin', '2019-07-19 18:07:13', '2019-07-17 18:54:33', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('68861523516849eff46a0df045f1031b', '402881e6760269a201760269a2af0000', 'birthday', '时间', NULL, 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 13, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('69666f21896136af16a6303aff440156', '402860816bff91c0016bffa220a9000b', 'nation', '民族', 'nation', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 11, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('69d11490788fecfc9fb7d74bf449ba86', '32f75e4043ef4070919dbd4337186a3d', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2019-04-11 10:15:32', '2019-03-27 15:54:49', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('6a30c2e6f01ddd24349da55a37025cc0', 'd35109c3632c4952a19ecc094943dd71', 'top_pic', '头像', NULL, 0, 1, 1, 'string', 500, 0, '', '', '', '', 'image', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 11, 'admin', '2023-09-16 21:25:25', '2019-06-10 20:06:56', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('6ab2e3d9b944701b405fb1a5ed167012', '86bf17839a904636b7ed96201b2fa6ea', 'zong_price', '单品总价', NULL, 0, 1, 1, 'double', 10, 3, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 10, 'admin', '2020-05-14 21:18:49', '2020-05-08 23:48:31', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('6b6f3aa00b8e73fb785154e795189739', '402860816aa5921f016aa5dedcb90009', 'start_time', '会签发起时间', 'start_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 7, 'admin', '2019-05-11 15:56:47', '2019-05-11 15:50:08', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('6beb40bdd28af22e06b26640bc0c3f4d', '3b5e18da618247539481816995b6bf9f', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 1, 'single', '', '', 1, 'admin', '2020-07-11 11:27:29', '2020-07-11 11:27:17', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('6c35eb97737e9f86279939d264454a94', '86bf17839a904636b7ed96201b2fa6ea', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2020-05-14 21:18:49', '2020-05-08 23:48:31', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('6cfb5acbbb69782bf0c7043b53f595b2', '402860816bff91c0016bff91cda80003', 'update_by', '更新人', 'update_by', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 11, 'admin', '2019-07-19 18:06:36', '2019-07-17 18:54:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('6d03a7774a50c6e6f76dbc7a8269beba', '3b5e18da618247539481816995b6bf9f', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2020-07-11 11:27:29', '2020-07-11 11:27:17', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('6d4a4414b55ad5b6f31c8fb327dad834', '09fd28e4b7184c1a9668496a5c496450', 'address', '常用地址', NULL, 0, 1, 1, 'string', 300, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 11, 'admin', '2022-05-07 19:05:56', '2020-05-08 23:51:49', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('6dea0ed8104a84f25d84b39187249109', '41de7884bf9a42b7a2c5918f9f765dff', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2022-11-23 12:01:36', '2022-10-29 17:02:47', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('6ed8d9acef3cccd1b8fd659b3b538023', '53a3e82b54b946c2b904f605875a275c', 'price', '价格', NULL, 0, 1, 1, 'BigDecimal', 10, 5, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2022-10-25 11:10:48', '2020-05-07 22:49:47', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('6edce6cf880cf68d4d7812076e274610', '402881fd812267500181226750e90000', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 5, NULL, NULL, '2022-06-02 11:13:25', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('6f38a07ea2b1065315a6b89a02af5bb4', '3b5e18da618247539481816995b6bf9f', 'name', '用户名', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2020-07-11 11:27:29', '2020-07-11 11:27:17', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('6f47a2e4426e7d63c223803b1ecbe790', '553a4172fde446419cb602dc70f9ee67', 'update_time', '更新时间', NULL, 0, 1, 1, 'Datetime', 50, 0, NULL, NULL, NULL, NULL, 'datetime', NULL, 120, '', '0', NULL, NULL, 0, 0, 0, 0, 'single', NULL, NULL, 4, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('6f73e96a659c200c083006b6fce1f043', '402860816bff91c0016bff91ca7e0002', 'cert_name', '证书名称', 'cert_name', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 4, 'admin', '2019-07-19 18:07:13', '2019-07-17 18:54:33', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('71197d255e05c9f6db67fd30380953c7', '402881e6760269a201760269a2af0000', 'sel_mut', '下拉多选', NULL, 0, 1, 1, 'string', 32, 0, '', 'sex', '', '', 'list_multi', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 11, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('7154c75d754a5f88bef2b68829baf576', '4028318169e81b970169e81b97650000', 'operate_type', '操作类型', 'operate_type', 0, 1, 1, 'string', 10, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 4, NULL, NULL, '2019-04-04 19:28:36', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('71afb00a1971125ecfa13b4dfa49665e', '402860816bff91c0016bff91cfea0004', 'order_no', '序号', 'order_no', 0, 1, 1, 'int', 10, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 8, 'admin', '2019-07-19 18:05:13', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('71d5b0675df5aba71688c9d7d75cccee', '4028318169e81b970169e81b97650000', 'log_type', '日志类型（1登录日志，2操作日志）', 'log_type', 0, 1, 1, 'string', 10, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 2, NULL, NULL, '2019-04-04 19:28:36', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('71e9ab74dae687837365e50eed090591', '1acb6f81a1d9439da6cc4e868617b565', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, 'admin', '2019-06-10 14:47:14', '2019-04-23 22:58:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('7280c56a210e6a47794fda855d0c6abb', 'fbc35f067da94a70adb622ddba259352', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, NULL, NULL, '2019-07-03 19:44:23', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('72e784af5c47bbbc0534b29bf656bd61', '4028839a6de2ebd3016de2ebd3870000', 'id', '主键', 'id', 1, 0, 1, 'string', 36, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 0, 0, 0, 'group', NULL, NULL, 1, NULL, NULL, '2019-10-19 15:29:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('7365f05f551092716223d5d449efd8c7', 'beee191324fd40c1afec4fda18bd9d47', 'name', 'ss', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 6, 'admin', '2019-04-13 13:41:13', '2019-04-13 13:40:56', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('73d3b57df0c6cf15c21970f4dd979319', '402880e5721355dd01721355dd390000', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 5, NULL, NULL, '2020-05-14 21:18:14', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('73dc6089556f3446e39d42df3dedb2db', '402880e570a5d7000170a5d700f50000', 'num', '数量', NULL, 0, 1, 1, 'int', 32, 0, '', '', '', '', 'text', '', 120, 'n', '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 8, NULL, NULL, '2020-03-04 21:58:16', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('742329ccdb185cf5d3e0b5b0c05dcffa', '402860816bff91c0016bffa220a9000b', 'interest', '兴趣爱好', 'interest', 0, 1, 1, 'string', 255, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 34, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('744444a7ada3bbb05c6b114b5ba0d477', '402860816aa5921f016aa5dedcb90009', 'id', 'id', 'id', 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'group', '', '', 1, 'admin', '2019-05-11 15:56:47', '2019-05-11 15:50:08', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('74af99545de724a4abd2022581a36026', 'fb7125a344a649b990c12949945cb6c1', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2019-03-26 19:24:11', '2019-03-26 19:01:52', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('756b07656386dbd91245f7ffda32ae61', '402860816bff91c0016bff91d8830007', 'id', 'id', 'id', 1, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'group', '', '', 1, 'admin', '2019-07-19 18:04:41', '2019-07-17 18:54:37', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('75841fa7c75ebdc94655bd5e44fbc9f6', '402860816bff91c0016bffa220a9000b', 'native_place', '籍贯', 'native_place', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 10, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('75ba781c67711bed71bba1c3e3c68e11', '8994f2817b5a45d9890aa04497a317c5', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 0, NULL, NULL, '2019-03-23 11:39:16', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('75e82f151e8cc12455f7f0d25bf4dac0', '4028839a6de2ebd3016de2ebd3870000', 'wl_name', '物料名称', 'wl_name', 0, 1, 1, 'string', 100, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 7, NULL, NULL, '2019-10-19 15:29:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('7639c1bc4327f1f674ffeab2ca261134', '32f75e4043ef4070919dbd4337186a3d', 'update_by', '更新人登录名称', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2019-04-11 10:15:32', '2019-03-27 15:54:49', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('766ca866b72d118f5d8883de46a8c043', '4028839a6de2ebd3016de2ebd3870000', 'supplier', '供应商', 'supplier', 0, 1, 1, 'string', 32, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 15, NULL, NULL, '2019-10-19 15:29:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('76c64fdb02faecd86c817cbb58d293c2', '402881e6760269a201760269a2af0000', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 6, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('773910592db75466ccb080797cd66e7a', '553a4172fde446419cb602dc70f9ee67', 'price', '单价', NULL, 0, 1, 1, 'BigDecimal', 10, 2, NULL, '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 6, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('78a40344207c791b8d7ac7de721ce1c4', '79091e8277c744158530321513119c68', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2019-05-11 15:29:47', '2019-05-11 15:27:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('78eb7e3b77cd49f9acb9b024cfe834e1', '402860816aa5921f016aa5dedcb90009', 'create_time', '创建日期', 'create_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'group', '', '', 3, 'admin', '2019-05-11 15:56:47', '2019-05-11 15:50:08', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('78fd804d93dc716fd8c2ccc45f788565', 'fb7125a344a649b990c12949945cb6c1', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, 'admin', '2019-03-26 19:24:11', '2019-03-26 19:01:52', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('790c9f3dba773ed9a6ea3ad627393f57', '402860816bff91c0016bffa220a9000b', 'archives_location', '档案所在地', 'archives_location', 0, 1, 1, 'string', 255, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 36, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('7a665ed90ef64b4d65632c941e5795b2', '4b556f0168f64976a3d20bfb932bc798', 'sex', '性别', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, NULL, NULL, '2019-04-12 23:38:29', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('7a697e4053445f07ad1a56a246f593e7', '86bf17839a904636b7ed96201b2fa6ea', 'good_name', '商品名字', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2020-05-14 21:18:49', '2020-05-08 23:48:31', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('7b0947ec7b0aa030121df814bef8b91c', '402881fd812267500181226787d90001', 'begin_time', '开始时间', NULL, 0, 1, 1, 'Date', 0, 0, '', '', '', '', 'date', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 14, NULL, NULL, '2025-06-25 15:10:29', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('7b642d983ac06bfef91edde2c932dbe7', '1acb6f81a1d9439da6cc4e868617b565', 'xg_shangxian', '选购上限', NULL, 0, 1, 1, 'int', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 14, 'admin', '2019-06-10 14:47:14', '2019-04-23 22:58:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('7b6fe525c26b7085c13e32e94c90aff9', '553a4172fde446419cb602dc70f9ee67', 'province', '输入2到10位的字母', NULL, 0, 1, 1, 'string', 50, 0, NULL, '', '', '', 'text', '', 120, '^[a-z|A-Z]{2,10}$', '0', '', '', 0, 1, 1, 0, 'single', '', '', 36, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('7b849e57debfb889caea5e0fef09062b', 'beee191324fd40c1afec4fda18bd9d47', 'sex2', 'dd', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2019-04-13 13:41:13', '2019-04-13 13:40:56', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('7beb639aa9ffda07edb5ce1e49c2287f', '402860816bff91c0016bff91d2810005', 'update_time', '更新时间', 'update_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 13, 'admin', '2019-07-19 18:05:55', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('7bf091da401b74d55b107fe9f930ea54', '4028839a6de2ebd3016de2ebd3870000', 'create_by', '创建人', 'create_by', 0, 1, 1, 'string', 50, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 2, NULL, NULL, '2019-10-19 15:29:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('7c6aecc377816c69147f1193b17dfcc5', 'e9faf717024b4aae95cff224ae9b6d97', 'sex', '员工性别', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, 'admin', '2019-07-03 18:23:49', '2019-07-03 18:22:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('7c8c5f45cb994038a51febdb0112a995', '553a4172fde446419cb602dc70f9ee67', 'jycs', '唯一检验', NULL, 0, 1, 1, 'string', 50, 0, NULL, '', '', '', 'text', '', 120, 'only', '0', '', '', 0, 1, 1, 0, 'single', '', '', 35, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('7ca2ae42e686e917f766edd2570c5141', '553a4172fde446419cb602dc70f9ee67', 'shijian', '时间', NULL, 0, 1, 1, 'string', 50, 0, NULL, '', '', '', 'time', '', 120, '', '0', '', '', 1, 1, 1, 0, 'group', '', '', 15, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('7cadf4e0be0b173bb5b8d39613e25190', '402860816bff91c0016bffa220a9000b', 'residence_postcode', '户籍邮编', 'residence_postcode', 0, 1, 1, 'string', 10, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 29, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('7cce797000cec08416fb027d1a4013cb', '402881e6760269a20176026d25650002', 'sex', '性别 {男:1,女:2}', 'sex', 0, 1, 1, 'string', 2, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'single', NULL, NULL, 7, NULL, NULL, '2020-11-26 10:41:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('7cdbe0d563e15f3fb1fb32d996fe4ba7', '3d447fa919b64f6883a834036c14aa67', 'area', '区', NULL, 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 3, 'admin', '2025-05-15 18:26:26', '2020-02-20 16:19:00', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('7d107728408c21ece332406a21f2d692', '402860816bff91c0016bff91cfea0004', 'update_by', '更新人', 'update_by', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 11, 'admin', '2019-07-19 18:05:13', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('7d27d79157dff60f847d98cbc4e66e81', 'b493c5fd4fa64a3a84e74ee171763e37', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, NULL, NULL, '2021-06-07 18:13:37', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('7e066f60680158d47b328ef519d80e49', 'beee191324fd40c1afec4fda18bd9d47', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2019-04-13 13:41:13', '2019-04-13 13:40:56', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('7e331396f6e544ae801690cf475e7615', '402881e6760269a201760269a2af0000', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 3, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('7e5013b8a3e970fdcef2b577829bfa83', '402881fd812267500181226750e90000', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 2, NULL, NULL, '2022-06-02 11:13:25', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('7f10901c6ade3aa9d9ff46ed7039c70f', '1acb6f81a1d9439da6cc4e868617b565', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2019-06-10 14:47:14', '2019-04-23 22:58:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('7f610ecd480210d2d12ce6eb47f261f0', '402881fd812267500181226787d90001', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 1, 'admin', '2022-06-02 11:13:48', '2022-06-02 11:13:39', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('7fa8eafb28c52183514179454d62e5b3', '05a3a30dada7411c9109306aa4117068', 'begin_time', '开始时间', NULL, 0, 1, 1, 'Date', 0, 0, '', '', '', '', 'date', '', 120, '', '0', '', '', 0, 1, 0, 0, 'single', '', '', 14, 'admin', '2026-01-21 11:59:02', '2025-06-25 15:10:29', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('809a9fafe0b79c9997de32cb6e831c6f', '05a3a30dada7411c9109306aa4117068', 'birthday', '生日', NULL, 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 9, 'admin', '2026-01-21 11:59:02', '2020-05-06 11:34:31', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('8119d3de514092232935b038531828c5', '05a3a30dada7411c9109306aa4117068', 'sex', '性别', NULL, 0, 1, 1, 'string', 32, 0, '', 'sex', '', '', 'list', '', 120, '', '0', '', '', 1, 1, 1, 0, 'single', '', '', 8, 'admin', '2026-01-21 11:59:02', '2020-05-06 11:34:31', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('813a5ebf7335309c7edb3803f7e4b204', '402880e570a5d7000170a5d700f50000', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 2, NULL, NULL, '2020-03-04 21:58:16', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('817cc5e277e88164dffd4caee1169276', '56efb74326e74064b60933f6f8af30ea', 'remark', '备注', NULL, 0, 1, 1, 'string', 500, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 10, 'admin', '2020-07-10 16:53:27', '2020-05-08 23:45:32', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('81ed9556c9fda1bbb46d94a53a6c90c7', '402860816bff91c0016bff91c0cb0000', 'depart_name', '部门名称', 'depart', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 7, 'admin', '2019-07-19 18:09:01', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('82ac28d632eb5d75ce4bfb68459c58bc', '553a4172fde446419cb602dc70f9ee67', 'zddtjxlss', '字典表带条件下拉搜索', NULL, 0, 1, 1, 'string', 255, 0, NULL, 'username', 'sys_user where username like \\'%a%\\'', 'realname', 'sel_search', '', 200, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 46, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('83764a3d17590f5a69047295803eaa07', 'feea98637c2144caae7c5d56a815a245', 'cc', 'cc', NULL, 0, 1, 1, 'double', 10, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 9, NULL, NULL, '2021-10-27 10:24:24', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('838622bc247b35606e95ddcc079f70f4', 'f9fb8bee1a64472889d077c757b9acc7', 'nn', 'nn', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2021-08-17 13:58:15', '2021-08-17 13:57:48', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('840343a59a8e705821d393506c2bc1fe', '402880e570a5d7000170a5d700f50000', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 3, NULL, NULL, '2020-03-04 21:58:16', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('8419278effeb3a6531247fbfdb3b10e3', '402881e6760269a201760269a2af0000', 'user_sel', '选择用户', NULL, 0, 1, 1, 'string', 200, 0, '', '', '', '', 'sel_user', '', 120, NULL, '0', '', '#{sysUserCode}', 0, 1, 1, 0, 'single', NULL, NULL, 18, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('8422485e1cbf4455f9ded7d0af59379c', '402860816bff91c0016bff91cfea0004', 'to_time', '截止时间', 'to_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 4, 'admin', '2019-07-19 18:05:13', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('843c14e8c8709eb13014303671192ae4', '402881fd812267500181226787d90001', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 4, 'admin', '2022-06-02 11:13:48', '2022-06-02 11:13:39', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('844334fbd9dc9bd87682d7058ee65bcb', '553a4172fde446419cb602dc70f9ee67', 'mi_ma', '密码', NULL, 0, 1, 1, 'string', 32, 0, NULL, '', '', '', 'password', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('845c70568d44a074f067d6d277950525', '402860816bff91c0016bffa220a9000b', 'entrytime', '入职时间', 'entrytime', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 23, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('845f20dcbcb3cae414387203a8c70f1d', '553a4172fde446419cb602dc70f9ee67', 'name', '用户名', NULL, 0, 1, 1, 'string', 50, 0, NULL, '', '', '', 'text', '', 120, '', '1', '', '', 1, 1, 1, 0, 'single', '', '', 7, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('8529ddaed8d5f3d9084e873203d55cac', '402860816bff91c0016bffa220a9000b', 'marital_status', '婚姻状况', 'marital_status', 0, 1, 1, 'string', 20, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 24, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('857a0daa9cd8a058f2f15fc7c5fb3571', '402860816bff91c0016bffa220a9000b', 'email', '邮箱', 'email', 0, 1, 1, 'string', 255, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 17, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('85e43fa87074845f86cf52606a23a57c', 'b81de38db24047b497d476516f8a0865', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, NULL, NULL, '2020-02-24 14:56:08', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('8652ca69a947fd4c961a3ac7c0fa252a', 'fb19fb067cd841f9ae93d4eb3b883dc0', 'create_by', '创建人登录名称', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 1, NULL, NULL, '2019-03-23 11:39:48', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('867b7947db161541ad7f4d0b2127d793', '553a4172fde446419cb602dc70f9ee67', 'tupian', '图片', NULL, 0, 1, 1, 'string', 250, 0, NULL, '', '', '', 'image', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 17, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('86bbafef5683674a736cf7241c458d44', '27fc5f91274344afa7673a732b279939', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2019-07-01 16:28:20', '2019-07-01 16:26:42', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('86c598da4f5a3dd3e82e1d9f38d06747', 'a2ca0c7297a8491ca849fc1a06c9efbf', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2021-01-24 14:39:35', '2021-01-24 14:38:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('86e0f3a8f31c60698157f139ed993954', '402860816bff91c0016bffa220a9000b', 'having_reserve_funds', '是否有公积金', 'having_reserve_funds', 0, 1, 1, 'string', 20, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 33, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('86f29e9919766e0d1128263608c016a0', '997ee931515a4620bc30a9c1246429a9', 'type_name', '商品分类', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2020-05-03 00:57:44', '2020-05-03 00:56:56', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('873e2bb041b17bff77d3aca72900ea1b', '56870166aba54ebfacb20ba6c770bd73', 'order_code', '订单编码', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, '', '0', '', '${shop_order_num}', 1, 1, 1, 0, 'single', '', '', 5, 'admin', '2025-11-27 18:19:46', '2019-04-20 11:38:39', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('8756fbb5c23a0258e029e0cb3c0a045c', '402880e5721355dd01721355dd390000', 'price', '价格', NULL, 0, 1, 1, 'double', 10, 3, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 8, NULL, NULL, '2020-05-14 21:18:14', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('877391ae770a4ce2c95181ef410982ce', '4028318169e81b970169e81b97650000', 'request_param', '请求参数', 'request_param', 0, 1, 1, 'string', 255, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 10, NULL, NULL, '2019-04-04 19:28:36', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('87e82e3c723a6abb020122babdac6bd1', '8994f2817b5a45d9890aa04497a317c5', 'create_by', '创建人登录名称', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 1, NULL, NULL, '2019-03-23 11:39:16', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('87f7a2703c5850f0b063dd866d0e2917', '402860816bff91c0016bffa220a9000b', 'birthday', '出生日期', 'birthday', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 7, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('87fafe1a4a8a626e3875697574c19f15', '402860816bff91c0016bff91d2810005', 'sys_org_code', '组织机构编码', 'sys_org_code', 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 14, 'admin', '2019-07-19 18:05:55', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('883265736ad6db0c98a7517d1f4a2488', '402880eb71d52dc30171d52dc3a10000', 'main_id', '主表ID', NULL, 0, 1, 1, 'string', 200, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 5, NULL, NULL, '2020-05-02 19:37:59', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('88a12570e14c9f6f442e731ae5ad0eb1', 'beee191324fd40c1afec4fda18bd9d47', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2019-04-13 13:41:13', '2019-04-13 13:40:56', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('88de72456c03410c364c80095aaa96eb', 'd35109c3632c4952a19ecc094943dd71', 'pop', '弹窗', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 14, 'admin', '2023-09-16 21:25:25', '2020-11-26 18:02:20', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('89370ae67e241fa5d1e47d22adeaca7b', '402880eb71d52dc30171d52dc3a10000', 'date', '日期', NULL, 0, 1, 1, 'string', 200, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '#{date}', 0, 1, 1, 0, 'single', NULL, NULL, 4, NULL, NULL, '2020-05-02 19:37:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('89ab9eedbac6141e7a0df6d37a3655d0', 'e67d26b610dd414c884c4dbb24e71ce3', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2019-04-24 11:03:32', '2019-04-24 11:02:57', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('8a24fb45e2af120c253c8b61c0085f7a', '402860816bff91c0016bff91cda80003', 'sys_org_code', '组织机构编码', 'sys_org_code', 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 13, 'admin', '2019-07-19 18:06:36', '2019-07-17 18:54:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('8a2f97fde739720e86fbcd3ce311c037', '09fd28e4b7184c1a9668496a5c496450', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 6, 'admin', '2022-05-07 19:05:56', '2020-05-08 23:51:49', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('8a6440c447ca97b1ceac40fa8576044e', '3b5e18da618247539481816995b6bf9f', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 6, 'admin', '2020-07-11 11:27:29', '2020-07-11 11:27:17', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('8a9d6bbbe45fd3539a8cb3ba2cee470a', '402881e6760269a201760269a2af0000', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 5, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('8ac8a0c0087469a4e7579229ff17f273', 'e5464aa8fa7b47c580e91593cf9b46dc', 'jifen', '合计积分', NULL, 0, 1, 1, 'int', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 10, 'admin', '2019-04-24 17:09:49', '2019-04-24 11:05:10', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('8b0d9ecfe8d44282b973cd56bd99f1a8', '553a4172fde446419cb602dc70f9ee67', 'xiala', '字典下拉', NULL, 0, 1, 1, 'string', 50, 0, NULL, 'sex', '', '', 'list', '', 120, '', '0', '', '', 1, 1, 1, 0, 'single', '', '', 9, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('8bd4deadc9e96c1a6d7abd77033105f6', 'e67d26b610dd414c884c4dbb24e71ce3', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2019-04-24 11:03:32', '2019-04-24 11:02:57', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('8c10f1728f8aa4f0a650af5a6856ccaa', 'f9fb8bee1a64472889d077c757b9acc7', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2021-08-17 13:58:15', '2021-08-17 13:57:48', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('8c1b6fff73650b8650947c2a29c63492', '402881e6760269a201760269a2af0000', 'sex', '下拉框', NULL, 0, 1, 1, 'string', 32, 0, '', 'sex', '', '', 'list', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 8, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '1');\nINSERT INTO `onl_cgform_field` VALUES ('8c4f4e151639f85bdf4a53f988588dc9', '402881fd812267500181226787d90001', 'contents', '请假原因', NULL, 0, 1, 1, 'string', 500, 0, '', '', '', '', 'markdown', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 10, 'admin', '2022-06-02 11:13:48', '2022-06-02 11:13:39', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('8c6518fec11fc4769ba4eb770c9e00f7', '4028839a6de2ebd3016de2ebd3870000', 'integral_val', '积分值', 'integral_val', 0, 1, 1, 'int', 10, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 11, NULL, NULL, '2019-10-19 15:29:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('8ca56210938fbe649f840e505eb9fd41', '56870166aba54ebfacb20ba6c770bd73', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, 'admin', '2025-11-27 18:19:45', '2019-04-20 11:38:39', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('8e1212df6a94ed8f5102a327564e5af6', '8d66ea41c7cc4ef9ab3aab9055657fc9', 'name', '分类名字', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, NULL, NULL, '2020-05-07 22:46:32', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('8e131d4a438c907b3272474780be7603', '402880eb71d52dc30171d52dc3a10000', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 8, NULL, NULL, '2020-05-02 19:37:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('8e4012b263d899531aac5227db147bda', '41de7884bf9a42b7a2c5918f9f765dff', 'sex', '性别', NULL, 0, 1, 1, 'string', 32, 0, '', 'sex', '', '', 'radio', '', 200, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2022-11-23 12:01:36', '2022-10-29 17:02:47', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('8ea43fd1e4ce82becee61b2f1e2e843f', '32feeb502544416c9bf41329c10a88f4', 'sex', '性别', NULL, 0, 1, 1, 'string', 32, 0, '', 'sex', '', '', 'list', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, 'admin', '2019-08-23 20:03:40', '2019-07-02 18:23:23', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('8f1d302868640b72cef52171a023a203', 'e9faf717024b4aae95cff224ae9b6d97', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2019-07-03 18:23:49', '2019-07-03 18:22:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('8f3e6fb68179c690f748f3c541fb50f1', '7ea60a25fa27470e9080d6a921aabbd1', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, NULL, NULL, '2019-04-17 00:22:21', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('8f6810b315b5101bea9d3de4d2400edd', '553a4172fde446419cb602dc70f9ee67', 'zddtjdx', '字典表带条件单选', NULL, 0, 1, 1, 'string', 255, 0, NULL, 'username', 'sys_user where username like \\'%a%\\'', 'realname', 'radio', '', 200, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 43, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('8fc0be84bed1216635c69af918e097ff', '402860816aa5921f016aa5dedcb90009', 'name', '并行会签标题', 'name', 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 6, 'admin', '2019-05-11 15:56:47', '2019-05-11 15:50:08', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('903c33f7d18175a269b783cd4288216f', '402881e6760269a20176026d25650002', 'update_time', '修改时间', 'update_time', 0, 1, 1, 'Datetime', 0, 0, NULL, NULL, NULL, NULL, 'date', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'single', NULL, NULL, 15, NULL, NULL, '2020-11-26 10:41:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('909b3de0c8a48a21ef8cf98eb4831689', '56efb74326e74064b60933f6f8af30ea', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2020-07-10 16:53:27', '2020-05-08 23:45:32', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('90a822b8a63bbbc1e9575c9f4e21e021', 'd35109c3632c4952a19ecc094943dd71', 'descc', '描述', NULL, 0, 1, 1, 'string', 500, 0, '', '', '', '', 'textarea', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, 'admin', '2023-09-16 21:25:25', '2019-03-15 14:24:35', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('90f39a6e29dae2e1fbb59d7d605f7c09', '1acb6f81a1d9439da6cc4e868617b565', 'iz_valid', '启用状态', NULL, 0, 1, 1, 'string', 2, 0, '', 'air_china_valid', '', '', 'list', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 11, 'admin', '2019-06-10 14:47:14', '2019-04-23 22:58:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('918b8d661e480624713ddcff1bdda4f4', '402881e6760269a20176026d25650002', 'birthday', '生日', 'birthday', 0, 1, 1, 'Datetime', 0, 0, NULL, NULL, NULL, NULL, 'date', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'single', NULL, NULL, 9, NULL, NULL, '2020-11-26 10:41:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('91be98b96dea1528abc943f9f131fd16', '402880e570a5d7000170a5d700f50000', 'price', '价格', NULL, 0, 1, 1, 'double', 32, 0, '', '', '', '', 'text', '', 120, 'n', '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 7, NULL, NULL, '2020-03-04 21:58:16', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('91f7cd9b59c0da033363f8a09b02ec96', '3d447fa919b64f6883a834036c14aa67', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2025-05-15 18:26:26', '2020-02-20 16:19:00', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('921cc5a92a79e1e21e9e631a1b7f3fbd', '8d66ea41c7cc4ef9ab3aab9055657fc9', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 1, 'single', '', '', 1, NULL, NULL, '2020-05-07 22:46:31', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('9370c9304af30b8d29defe0a5ada6e5b', '62e29cdb81ac44d1a2d8ff89851b853d', 'DC_DDSA', 'DD', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 6, NULL, NULL, '2019-05-11 14:01:14', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('9371f61d39c5d57ddb0a2db96b2e2412', '402860816bff91c0016bffa220a9000b', 'speciality', '专业', 'speciality', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 15, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('941ef1bddbf91fcd3a437a7a7dd347e7', 'feea98637c2144caae7c5d56a815a245', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, NULL, NULL, '2021-10-27 10:24:24', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('947174892512ea97fafde899d427ea7e', '402860816bff91c0016bff91c0cb0000', 'real_name', '姓名', 'real_name', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 4, 'admin', '2019-07-19 18:09:01', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('94b8bf435175cc545366e11992280757', '32f75e4043ef4070919dbd4337186a3d', 'age', '年龄', NULL, 0, 1, 1, 'int', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 1, 1, 1, 0, 'group', '', '', 7, 'admin', '2019-04-11 10:15:32', '2019-03-27 15:54:49', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('94e682cb802777fe4205536888f69353', '402860816bff91c0016bff91d2810005', 'create_by', '创建人', 'create_by', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 10, 'admin', '2019-07-19 18:05:55', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('957386b500be42a200d6a56d54345392', 'deea5a8ec619460c9245ba85dbc59e80', 'num', '数量', NULL, 0, 1, 1, 'int', 32, 0, '', '', '', '', 'text', '', 120, 'n', '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, 'admin', '2020-05-03 01:01:18', '2019-04-20 11:41:19', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('960d2847922b61dadeb3518ef55fb0c1', '1acb6f81a1d9439da6cc4e868617b565', 'wl_name', '物料名称', NULL, 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2019-06-10 14:47:14', '2019-04-23 22:58:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('9665f02764774fdd77c19923d3ff3c3e', '4028318169e81b970169e81b97650000', 'cost_time', '耗时', 'cost_time', 0, 1, 1, 'string', 19, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 12, NULL, NULL, '2019-04-04 19:28:36', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('966a4988298d5cb0be47848735ce8cb7', '4028839a6de2ebd3016de2ebd3870000', 'xg_shangxian', '选购上限', 'xg_shangxian', 0, 1, 1, 'int', 10, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 12, NULL, NULL, '2019-10-19 15:29:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('9698964a9e06edf12fc88df976080984', '09fd28e4b7184c1a9668496a5c496450', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2022-05-07 19:05:56', '2020-05-08 23:51:49', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('96c585a4f71e5c38ed25b9741366365b', '402860816bff91c0016bff91c7010001', 'sys_org_code', '组织机构编码', 'sys_org_code', 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 11, 'admin', '2019-07-19 18:07:47', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('9765efa2cafde6d0ede2215848c9e80b', '32f75e4043ef4070919dbd4337186a3d', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 0, 'admin', '2019-04-11 10:15:32', '2019-03-27 15:54:49', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('9874c79ce2e8663867d20ba4a5058ebd', '553a4172fde446419cb602dc70f9ee67', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, '', '1', NULL, NULL, 0, 0, 0, 1, 'single', NULL, NULL, 0, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('98e82cb1595609a3b42fa75c60ac1229', '402860816bff91c0016bff91d2810005', 'update_by', '更新人', 'update_by', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 12, 'admin', '2019-07-19 18:05:55', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('9914a0c84805e72c4b6075e36edb13f9', '402860816aa5921f016aa5921f480000', 'create_time', '创建时间', 'create_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'group', '', '', 9, 'admin', '2019-05-11 15:31:54', '2019-05-11 14:26:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('9920ecec9c9109fc6b93e86f8fdfa03b', '402860816bff91c0016bffa220a9000b', 'depart_name', '所在部门', 'depart_name', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 1, 1, 1, 0, 'group', '', '', 2, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('99b43bbb23237815ebb74b12b4d7ea2f', '62e29cdb81ac44d1a2d8ff89851b853d', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, NULL, NULL, '2019-05-11 14:01:14', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('9a462d83210cad30f0e12b98e8a172a7', '3b5e18da618247539481816995b6bf9f', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2020-07-11 11:27:29', '2020-07-11 11:27:17', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('9a4dc8718000c30953a3923eb7db5096', '402880eb71d52dc30171d52dc3a10000', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 1, 'single', NULL, NULL, 1, NULL, NULL, '2020-05-02 19:37:59', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('9a579c506f75f75baf88352a5eb2c249', '1acb6f81a1d9439da6cc4e868617b565', 'bpm_status', '流程状态', NULL, 0, 1, 1, 'string', 2, 0, '1', 'bpm_status', '', '', 'list', '', 120, NULL, '0', '', '', 0, 0, 1, 0, 'single', '', '', 16, 'admin', '2019-06-10 14:47:14', '2019-05-07 16:54:43', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('9a9516645cbc8147b23333fea76aa2bb', 'b81de38db24047b497d476516f8a0865', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, NULL, NULL, '2020-02-24 14:56:08', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('9aa6738443d3d8a67cf50506199d15ad', 'cb2d8534a2f544bc9c618dd49da66336', 'aaae', 'aae', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, NULL, NULL, '2020-02-24 17:22:43', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('9b66c6501baaef67b35bd41ba7a6a781', '402881fd812267500181226750e90000', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 1, 'single', NULL, NULL, 1, NULL, NULL, '2022-06-02 11:13:25', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('9bd056786694d67666f6924cc225b1a0', '3d447fa919b64f6883a834036c14aa67', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 0, 'admin', '2025-05-15 18:26:26', '2020-02-20 16:19:00', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('9c40fb4db8afed3c682c6b8a732fd69d', 'e2faf977fdaf4b25a524f58c2441a51c', 'post', '用户岗位', NULL, 0, 1, 1, 'string', 32, 0, '', 'post_code', 'air_china_post_materiel_main', 'post_name', 'sel_search', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, 'admin', '2019-06-10 17:27:00', '2019-04-24 17:12:11', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('9cc60be30026301b9eafb8c310387f54', '402880e570a5d7000170a5d700f50000', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 4, NULL, NULL, '2020-03-04 21:58:16', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('9d85bafa399f28a40e1de1eeef747223', '4028318169e81b970169e81b97650000', 'ip', 'IP', 'ip', 0, 1, 1, 'string', 100, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 7, NULL, NULL, '2019-04-04 19:28:36', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('9d88e0661ed4b0969b7f0608a714b14a', '402881e6760269a20176026d25650002', 'create_time', '创建时间', 'create_time', 0, 1, 1, 'Datetime', 0, 0, NULL, NULL, NULL, NULL, 'date', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'single', NULL, NULL, 13, NULL, NULL, '2020-11-26 10:41:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('9d89ff1a019f41d80307652041490944', '32feeb502544416c9bf41329c10a88f4', 'name', '请假人', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2019-08-23 20:03:40', '2019-07-02 18:23:23', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('9e50680eb4e79b3af352a5933d239dff', 'dbf4675875e14676a3f9a8b2b8941140', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, NULL, NULL, '2019-05-27 18:02:07', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('a01a7fe5660206e6f407ed98b6c732d6', '402860816bff91c0016bff91cfea0004', 'phone', '联系方式', 'phone', 0, 1, 1, 'string', 20, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 7, 'admin', '2019-07-19 18:05:13', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('a029ecf9b943773bdf30a490e9922e45', '553a4172fde446419cb602dc70f9ee67', 'zdbxldx', '字典表下拉多选', NULL, 0, 1, 1, 'string', 255, 0, NULL, 'id', 'sys_depart', 'depart_name', 'list_multi', '', 200, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 41, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('a047f542fc3f1eb833593dfffdee5d5d', '553a4172fde446419cb602dc70f9ee67', 'popback', 'popback', NULL, 0, 1, 1, 'string', 100, 0, NULL, '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 22, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('a1a2d49b35c185df9f9e149b290aa277', '56efb74326e74064b60933f6f8af30ea', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2020-07-10 16:53:27', '2020-05-08 23:45:32', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('a1f5daba36f536e7acf6a939826183b0', 'fb19fb067cd841f9ae93d4eb3b883dc0', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 0, NULL, NULL, '2019-03-23 11:39:48', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('a232d608434d15fcecd8a3f31a9044b2', '86bf17839a904636b7ed96201b2fa6ea', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2020-05-14 21:18:49', '2020-05-08 23:48:31', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('a2baa3a18062f28e3d8a81178027f171', '402881fd812267500181226750e90000', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 3, NULL, NULL, '2022-06-02 11:13:25', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('a3dea64c8009780e213d16c69704c030', '53a3e82b54b946c2b904f605875a275c', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 1, 'single', '', '', 0, 'admin', '2022-10-25 11:10:48', '2020-05-07 22:49:47', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('a45eba33810c485b9d8e6f70818a1dfa', '402860816aa5921f016aa5921f480000', 'bpm_status', '流程状态', 'bpm_status', 0, 1, 1, 'string', 50, 0, '1', 'bpm_status', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 1, 0, 'group', '', '', 7, 'admin', '2019-05-11 15:31:54', '2019-05-11 14:26:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('a4e83c528933fc7d3a4230d4141a5a20', '553a4172fde446419cb602dc70f9ee67', 'dhwb', '多行文本框', NULL, 0, 1, 1, 'string', 250, 0, NULL, '', '', '', 'textarea', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 18, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('a6471d4fb3dbffef01dab1f7d452bb30', '27fc5f91274344afa7673a732b279939', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2019-07-01 16:28:20', '2019-07-01 16:26:42', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('a6722b498602d7d7b5177b16789d8cc1', 'e5464aa8fa7b47c580e91593cf9b46dc', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2019-04-24 17:09:48', '2019-04-24 11:05:10', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('a6c428d67bbad26f220794ddfc7c637d', 'b493c5fd4fa64a3a84e74ee171763e37', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 6, NULL, NULL, '2021-06-07 18:13:37', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('a7444c8c7be4fa4a0e18c65d9ea3de37', '553a4172fde446419cb602dc70f9ee67', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, '', '0', NULL, NULL, 0, 0, 0, 0, 'single', NULL, NULL, 3, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('a76f561057ac9e43a8ca09e478a1eab8', '402860816bff91c0016bff91ca7e0002', 'update_time', '更新时间', 'update_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 12, 'admin', '2019-07-19 18:07:13', '2019-07-17 18:54:33', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('a7822f6e4cffb37fc0729cbd4cfd8655', '32f75e4043ef4070919dbd4337186a3d', 'name', '用户名', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 1, 1, 1, 0, 'single', '', '', 5, 'admin', '2019-04-11 10:15:32', '2019-03-27 15:54:49', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('a7b6ae09441ce36a14c7ce95f17a218e', '86bf17839a904636b7ed96201b2fa6ea', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2020-05-14 21:18:49', '2020-05-08 23:48:31', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('a82ca42a76e9d2b8dae6d57dbb5edb54', 'deea5a8ec619460c9245ba85dbc59e80', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2020-05-03 01:01:18', '2019-04-20 11:41:19', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('a83acbadb64ad5ba87a384dd6eea3117', 'f9fb8bee1a64472889d077c757b9acc7', 'ddd', 'dd', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, 'admin', '2021-08-17 13:58:15', '2021-08-17 13:57:48', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('a90c0b002021ac3a4a1a96514d58224b', '05a3a30dada7411c9109306aa4117068', 'long_ids', '长类型', NULL, 0, 1, 1, 'long', 19, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 15, 'admin', '2026-01-21 11:59:02', '2025-11-27 11:36:01', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('a940adc4585fa3b5bd2114ea9abe8491', '402860816bff91c0016bff91ca7e0002', 'cert_level', '证书级别', 'cert_level', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 5, 'admin', '2019-07-19 18:07:13', '2019-07-17 18:54:33', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('a94f1d7da64f3aa35c32155ea00ccb2f', '402860816bff91c0016bffa220a9000b', 'id', 'id', 'id', 1, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'group', '', '', 1, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('a9780eace237a15f26931dd6a9ec02e9', '758334cb1e7445e2822b60e807aec4a3', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, NULL, NULL, '2019-10-18 18:02:09', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('a97fec2610584bebe5fda2ba538e3881', '402881fd812267500181226750e90000', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 4, NULL, NULL, '2022-06-02 11:13:25', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('aa07931514727913413880b7a2b76dcb', 'd3ae1c692b9640e0a091f8c46e17bb01', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, NULL, NULL, '2019-07-24 14:47:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('aa4780601419c21dabb6c42fc511e71c', '402860816bff91c0016bffa220a9000b', 'have_children', '有无子女', 'have_children', 0, 1, 1, 'string', 20, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 25, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('aa687ad6911c7797951276271bf9a85b', '5517e93b148a42a7b82d5f3f94542dcf', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'datetime', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, NULL, NULL, '2022-07-19 19:36:53', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('ab10e0aa029ded2f4420a33420de225d', '1acb6f81a1d9439da6cc4e868617b565', 'wl_code', '物料编码', NULL, 0, 1, 1, 'string', 60, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 6, 'admin', '2019-06-10 14:47:14', '2019-04-23 22:58:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ab1f880ba593f3757dac70e003945aa2', '402860816bff91c0016bff91c0cb0000', 'depart_id', '部门ID', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 6, 'admin', '2019-07-19 18:09:01', '2019-07-17 19:38:45', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ab58f43f853fd1f65f83c22966883afb', 'beee191324fd40c1afec4fda18bd9d47', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2019-04-13 13:41:13', '2019-04-13 13:40:56', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ab7e46d1a9bd6fe87e6cd82140ce997b', '5517e93b148a42a7b82d5f3f94542dcf', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, NULL, NULL, '2022-07-19 19:36:53', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('ab8e6f1cca421c5ce395a2c1fdfd2100', '32feeb502544416c9bf41329c10a88f4', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 6, 'admin', '2019-08-23 20:03:40', '2019-07-02 18:23:23', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('abe61a8ddf966a979457b763329a537b', 'e5464aa8fa7b47c580e91593cf9b46dc', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2019-04-24 17:09:49', '2019-04-24 11:05:10', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ac91565da5fb8fe43a4da3dec660b25f', '402860816bff91c0016bff91c7010001', 'award_place', '获奖地点', 'award_place', 0, 1, 1, 'string', 255, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 4, 'admin', '2019-07-19 18:07:47', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('acff5c8aef3b6288b87fd91215012206', 'e5464aa8fa7b47c580e91593cf9b46dc', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2019-04-24 17:09:49', '2019-04-24 11:05:10', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ad061417d5b53c67975eb83657505218', '73162c3b8161413e8ecdca7eb288d0c9', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2019-07-01 14:23:32', '2019-06-10 15:18:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ad93762c6c4a1dd8331e5fa11215b568', 'e2faf977fdaf4b25a524f58c2441a51c', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, 'admin', '2019-06-10 17:27:00', '2019-04-24 17:12:11', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ae31da96f38fc2941cb93d1bb1ab9431', 'deea5a8ec619460c9245ba85dbc59e80', 'product_name', '产品名字', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 6, 'admin', '2020-05-03 01:01:18', '2019-04-20 11:41:19', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('ae77bb317366622698c8ab9bf2325833', 'deea5a8ec619460c9245ba85dbc59e80', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2020-05-03 01:01:18', '2019-04-20 11:41:19', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('ae9e686072c3c7f9b36bbc4be0fe1384', '402881e6760269a201760269a2af0000', 'name', '用户名', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '#{sysUserCode}', 0, 1, 1, 0, 'single', NULL, NULL, 7, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '1');\nINSERT INTO `onl_cgform_field` VALUES ('aee804d5d92922378cac6d4ae9257680', '402881fd812267500181226750e90000', 'price', '价格', NULL, 0, 1, 1, 'BigDecimal', 10, 5, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 8, NULL, NULL, '2022-06-02 11:13:25', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('af0fe0df8b626129de62e22212732517', '402860816bff91c0016bff91cda80003', 'speciality', '专业', 'speciality', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 6, 'admin', '2019-07-19 18:06:36', '2019-07-17 18:54:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('af6c582b902e2f2bf9930eba61ae7938', '73162c3b8161413e8ecdca7eb288d0c9', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2019-07-01 14:23:32', '2019-06-10 15:18:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('af7c5ec3c49673562319bd29d6ac169b', '553a4172fde446419cb602dc70f9ee67', 'duoxuan', '字典多选', NULL, 0, 1, 1, 'string', 50, 0, NULL, 'urgent_level', '', '', 'checkbox', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 11, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('afd3ef1d494a9b69d2c7a3cdde937f6f', '402860816bff91c0016bffa220a9000b', 'create_by', '创建人', 'create_by', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 39, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b01304904babd7479de2acfe8a77157f', '402860816aa5921f016aa5921f480000', 'id', 'ID', 'id', 1, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'group', '', '', 1, 'admin', '2019-05-11 15:31:54', '2019-05-11 14:26:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b05b4cbb74f389a7376f51ed9fd97030', '402860816bff91c0016bff91d8830007', 'create_by', '创建人', 'create_by', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 10, 'admin', '2019-07-19 18:04:41', '2019-07-17 18:54:37', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b0a06bdbefd304d81a1838d8d94deda9', '4b556f0168f64976a3d20bfb932bc798', 'name', '用户名', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 6, NULL, NULL, '2019-04-12 23:38:28', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b0a2c8d21782830ec6a2d16cc1231328', '402881e6760269a20176026d25650002', 'punch_time', '打卡时间', 'punch_time', 0, 1, 1, 'Datetime', 0, 0, NULL, NULL, NULL, NULL, 'date', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'single', NULL, NULL, 4, NULL, NULL, '2020-11-26 10:41:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b0b1cf271dd6b221a902da2d2f8f889a', 'e9faf717024b4aae95cff224ae9b6d97', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2019-07-03 18:23:49', '2019-07-03 18:22:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b0dfd0f0c36ee46ef483c0c225956ac5', '402881e6760269a201760269a2af0000', 'checkbox', 'checkbox', NULL, 0, 1, 1, 'string', 32, 0, '', 'sex', '', '', 'checkbox', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 10, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('b18f96f96d979daa7336e81086ea2bc1', 'cb2d8534a2f544bc9c618dd49da66336', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 6, 'admin', '2020-02-24 17:22:42', '2020-02-24 15:15:14', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b1fc6e2ca671b19e57b08a4f57fc2454', 'fb7125a344a649b990c12949945cb6c1', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2019-03-26 19:24:11', '2019-03-26 19:01:52', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b22694cf34ffb967b8717647816ad5df', 'e5464aa8fa7b47c580e91593cf9b46dc', 'fk_id', '外键', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', 'air_china_post_materiel_main', 'id', 15, 'admin', '2019-04-24 17:09:49', '2019-04-24 11:05:10', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b276facab025f9750b0aff391693cc4b', '402860816bff91c0016bff91c7010001', 'id', 'id', 'id', 1, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'group', '', '', 1, 'admin', '2019-07-19 18:07:47', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b2b0cb30159639bb1190e150322b7541', '4028839a6de2ebd3016de2ebd3870000', 'wl_unit', '计量单位', 'wl_unit', 0, 1, 1, 'string', 100, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 14, NULL, NULL, '2019-10-19 15:29:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b3542d3e7908ed885ecc4ba9e7300705', '4b556f0168f64976a3d20bfb932bc798', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, NULL, NULL, '2019-04-12 23:38:28', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b3b61f9386eb2262919e0835e3c82eb9', '86bf17839a904636b7ed96201b2fa6ea', 'num', '数量', NULL, 0, 1, 1, 'int', 10, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 9, 'admin', '2020-05-14 21:18:49', '2020-05-08 23:48:31', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('b3fce33f7760070f26580ac84aa9599f', '41de7884bf9a42b7a2c5918f9f765dff', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'datetime', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2022-11-23 12:01:36', '2022-10-29 17:02:47', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('b47af4d937e55c6208939bac5378bfad', '62e29cdb81ac44d1a2d8ff89851b853d', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, NULL, NULL, '2019-05-11 14:01:14', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b4e4fe6774e9d7b5f72d2056b47d18ac', '5517e93b148a42a7b82d5f3f94542dcf', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, NULL, NULL, '2022-07-19 19:36:53', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('b53203fc52d067bb4730dbcb7e496bd3', '56870166aba54ebfacb20ba6c770bd73', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 0, 'admin', '2025-11-27 18:19:45', '2019-04-20 11:38:39', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('b5cfd3c9691a884430f3d9cd5ecb211f', 'e2faf977fdaf4b25a524f58c2441a51c', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2019-06-10 17:27:00', '2019-04-24 17:12:11', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b67d877c34a5b67299f8b011b7fc2254', '41de7884bf9a42b7a2c5918f9f765dff', 'order_id', '订单id', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', 'test_order_main', 'id', 10, 'admin', '2022-11-23 12:01:36', '2022-10-29 17:02:47', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('b6874a05734cad8bd96ffd2f31f1ebca', '402860816bff91c0016bff91c7010001', 'create_by', '创建人', 'create_by', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 7, 'admin', '2019-07-19 18:07:47', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b733fa73519603b22d401fabbf9e9781', '402860816bff91c0016bff91c0cb0000', 'hiredate', '入职时间', 'hiredate', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 5, 'admin', '2019-07-19 18:09:01', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b7938e4518f9062ce62702cf45986e06', 'e2faf977fdaf4b25a524f58c2441a51c', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2019-06-10 17:27:00', '2019-04-24 17:12:11', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b7a1243aaa712e2c152c0c7a46f88683', '402860816bff91c0016bff91d8830007', 'age', '年龄', 'age', 0, 1, 1, 'int', 10, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 5, 'admin', '2019-07-19 18:04:41', '2019-07-17 18:54:37', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b7b311cf4483bd10a93a40891cc39a77', '8d66ea41c7cc4ef9ab3aab9055657fc9', 'has_child', '是否有子节点', NULL, 0, 1, 1, 'string', 3, 0, '', 'yn', '', '', 'list', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 11, NULL, NULL, '2020-05-07 22:46:32', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('b91258e3dc15b28c2e3f0d934e6e27e8', 'fb7125a344a649b990c12949945cb6c1', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 0, NULL, NULL, '2019-03-26 19:01:52', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b92572ae142f8dd5f2ac02fb45e6b2c1', 'e2faf977fdaf4b25a524f58c2441a51c', 'name', '用户名', NULL, 0, 1, 1, 'string', 32, 0, '', 'realname,username', 'report_user', 'name,account', 'sel_search', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 6, 'admin', '2019-06-10 17:27:00', '2019-04-24 17:12:11', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('b9280db8eff6098287747f1c99ef170e', 'a2ca0c7297a8491ca849fc1a06c9efbf', 'age', 'age', NULL, 0, 1, 1, 'int', 10, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 9, 'admin', '2021-01-24 14:39:35', '2021-01-24 14:38:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('b9a1e25a5636f5e61cd07a852a4d7770', '402881fd812267500181226750e90000', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 6, NULL, NULL, '2022-06-02 11:13:25', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('b9fbace24688c9c9a8c9be72c1d014e7', '402860816bff91c0016bffa220a9000b', 'phone', '电话', 'phone', 0, 1, 1, 'string', 20, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 18, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ba17414716b12b51c85f9d1f6f1e5787', 'd35109c3632c4952a19ecc094943dd71', 'chegnshi', '城市', NULL, 0, 1, 1, 'string', 300, 0, '', '', '', '', 'pca', '', 120, '', '0', '', '', 1, 1, 1, 0, 'single', '', '', 13, 'admin', '2023-09-16 21:25:25', '2020-11-26 16:54:45', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('ba5f4b2affa94f36eda7f6f133db7ae3', '402860816bff91c0016bff91d2810005', 'workplace', '工作单位', 'workplace', 0, 1, 1, 'string', 255, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 6, 'admin', '2019-07-19 18:05:55', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ba6f3e762d6e3ea1068a085ec2f7e501', '56efb74326e74064b60933f6f8af30ea', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2020-07-10 16:53:27', '2020-05-08 23:45:32', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('bad02e68ea37bf387337516af84a1ddb', '73162c3b8161413e8ecdca7eb288d0c9', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, 'admin', '2019-07-01 14:23:32', '2019-06-10 15:18:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('bb44475e1d1738a19745bf9f3ebf9e40', '402860816bff91c0016bff91cfea0004', 'update_time', '更新时间', 'update_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 12, 'admin', '2019-07-19 18:05:13', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('bbbb38347b1a5340a1d293e455c632ce', 'fb19fb067cd841f9ae93d4eb3b883dc0', '3', '4', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 6, NULL, NULL, '2019-03-23 11:39:48', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('bc648624ad14c826bbc6e9b23a2b9858', '402860816bff91c0016bff91ca7e0002', 'employee_id', '员工ID', 'employee_id', 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', 'oa_employee_info', 'id', 2, 'admin', '2019-07-19 18:07:13', '2019-07-17 18:54:33', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('bc793fdbef9f6474425456c4eb9d197a', '402860816bff91c0016bff91cfea0004', 'witness', '证明人', 'references', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 6, 'admin', '2019-07-19 18:05:13', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('bc7df6f3cf49f670c36a3de25e25e715', '402860816bff91c0016bff91d2810005', 'order_no', '序号', 'order_no', 0, 1, 1, 'int', 10, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 9, 'admin', '2019-07-19 18:05:55', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('bcc1f7cfabd386311a3c21e588022338', '553a4172fde446419cb602dc70f9ee67', 'fwb', '富文本', NULL, 0, 1, 1, 'Text', 0, 0, NULL, '', '', '', 'umeditor', '', 120, '', '0', '', '', 0, 1, 0, 0, 'single', '', '', 26, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('bd39cb237049ac60218b3f4dd844f30c', '402860816bff91c0016bffa220a9000b', 'current_address', '现居住地', 'current_address', 0, 1, 1, 'string', 200, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 30, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('bde81809057b1a4c974fa0f090501fdd', '402860816aa5921f016aa5dedcb90009', 'update_by', '更新人', 'update_by', 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'group', '', '', 4, 'admin', '2019-05-11 15:56:47', '2019-05-11 15:50:08', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('bdea5b776a15897265c43e6ee44af2e1', '997ee931515a4620bc30a9c1246429a9', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2020-05-03 00:57:44', '2020-05-03 00:56:56', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('be3f8c157d8a1b40e6f7b836552a8095', '8994f2817b5a45d9890aa04497a317c5', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 2, NULL, NULL, '2019-03-23 11:39:16', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('be5eeda7d51dace73d3818bd8467b53b', '402860816bff91c0016bff91c0cb0000', 'update_time', '更新时间', 'update_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 15, 'admin', '2019-07-19 18:09:01', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('be868eed386da3cfcf49ea9afcdadf11', 'd35109c3632c4952a19ecc094943dd71', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2023-09-16 21:25:25', '2019-03-15 14:24:35', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('bec3082fc5f0f194be5cd72cc2866ff4', 'e5464aa8fa7b47c580e91593cf9b46dc', 'wl_name', '物料名字', NULL, 0, 1, 1, 'string', 200, 0, '', 'wl_code', 'air_china_materiel', 'wl_name', 'list', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 6, 'admin', '2019-04-24 17:09:49', '2019-04-24 11:05:10', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('bed0bc67f570613eaa6a1bd8bcaaddcc', '4b556f0168f64976a3d20bfb932bc798', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, NULL, NULL, '2019-04-12 23:38:28', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('bed95ca6dd6bb4b4f7cfd787313a0a4b', '402880e570a5d7000170a5d700f50000', 'product_name', '产品名字', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 6, NULL, NULL, '2020-03-04 21:58:16', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('bf61aa04c5ca77ad54c764f8f8b2bdec', '402860816bff91c0016bff91d8830007', 'update_by', '更新人', 'update_by', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 12, 'admin', '2019-07-19 18:04:41', '2019-07-17 18:54:37', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('bfc2f19fae367f885adb8bd82a344391', '4028318169e81b970169e81b97650000', 'userid', '操作用户账号', 'userid', 0, 1, 1, 'string', 32, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 5, NULL, NULL, '2019-04-04 19:28:36', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('bff39a86bd05656ee156b685e5187211', 'a2ca0c7297a8491ca849fc1a06c9efbf', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2021-01-24 14:39:35', '2021-01-24 14:38:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('c047ed2cead5bab0307967435f370936', '53a3e82b54b946c2b904f605875a275c', 'chuc_date', '出厂时间', NULL, 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, 'admin', '2022-10-25 11:10:49', '2020-05-07 22:49:47', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('c08da9dc0325c441d89ae7378bcbf599', '553a4172fde446419cb602dc70f9ee67', 'zdbduoxuan', '字典表多选', NULL, 0, 1, 1, 'string', 255, 0, NULL, 'id', 'sys_depart', 'depart_name', 'checkbox', '', 200, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 40, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('c0d66c95773774e7ac1f2a88df307e7a', '402860816aa5921f016aa5921f480000', 'reason', '请假原因', 'reason', 0, 1, 1, 'string', 500, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 6, 'admin', '2019-05-11 15:31:54', '2019-05-11 14:26:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('c29216d975fee50af175bca8c664a475', 'e67d26b610dd414c884c4dbb24e71ce3', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, 'admin', '2019-04-24 11:03:32', '2019-04-24 11:02:56', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('c311cca084580e5fd4b5a2e5b81c4cc5', '402881e6760269a20176026d25650002', 'email', '邮箱', 'email', 0, 1, 1, 'string', 50, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'single', NULL, NULL, 10, NULL, NULL, '2020-11-26 10:41:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('c3d5f211ff18ff241fac97d31254173a', '402881fd812267500181226787d90001', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 3, 'admin', '2022-06-02 11:13:48', '2022-06-02 11:13:39', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('c43d87b6340c29c0c354aa9c579f387f', '32feeb502544416c9bf41329c10a88f4', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2019-08-23 20:03:40', '2019-07-02 18:23:23', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('c456753a9c83e55fa241c4ec72c00f86', '402880eb71d52dc30171d52dc3a10000', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 6, NULL, NULL, '2020-05-02 19:37:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('c4d71528f3f45661b1a87841b7256204', '402880e5721355dd01721355dd390000', 'order_main_id', '订单ID', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 11, NULL, NULL, '2020-05-14 21:18:14', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('c52711856d2e81ad1074265833f44328', 'b81de38db24047b497d476516f8a0865', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 1, 'single', '', '', 1, NULL, NULL, '2020-02-24 14:56:07', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('c596f7f9035c71f9d2d0206d14b0eee8', '402881e6760269a201760269a2af0000', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 4, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('c59f39e7b3bb877398f16796b2cd7962', '997ee931515a4620bc30a9c1246429a9', 'pid', '父级节点', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 0, 0, 'single', '', '', 9, 'admin', '2020-05-03 00:57:44', '2020-05-03 00:56:56', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('c5a61724b3b1fdfd0eb39c361f22bafd', '8d66ea41c7cc4ef9ab3aab9055657fc9', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, NULL, NULL, '2020-05-07 22:46:32', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('c5dd2fc34ae825ebfced2ec74948654c', '402860816aa5921f016aa5921f480000', 'end_date', '请假结束时间', 'end_date', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 5, 'admin', '2019-05-11 15:31:54', '2019-05-11 14:26:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('c5f6ea01a6523a60df153cc61dc92f4d', 'fbc35f067da94a70adb622ddba259352', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, NULL, NULL, '2019-07-03 19:44:23', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('c6024742fbc62f2fc39992e6b59ac13d', '05a3a30dada7411c9109306aa4117068', 'age', '年龄', NULL, 0, 1, 1, 'int', 10, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 1, 1, 1, 0, 'group', '', '', 6, 'admin', '2026-01-21 11:59:02', '2020-05-06 11:34:31', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '1');\nINSERT INTO `onl_cgform_field` VALUES ('c6730e00df5efd77fedf181df29102de', '402860816bff91c0016bff91c7010001', 'update_by', '更新人', 'update_by', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 9, 'admin', '2019-07-19 18:07:47', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('c75a7cb0a21958aa7ca5442f66019669', 'e9faf717024b4aae95cff224ae9b6d97', 'depart', '所属部门', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 9, 'admin', '2019-07-03 18:23:49', '2019-07-03 18:22:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('c772ed9cbe2d1dc69e9ffa73d3487021', '4b556f0168f64976a3d20bfb932bc798', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, NULL, NULL, '2019-04-12 23:38:28', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('c7e0a5c6e23e99ac9af5d3fcc33323f7', 'b493c5fd4fa64a3a84e74ee171763e37', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, NULL, NULL, '2021-06-07 18:13:37', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('c7f1907e8e7aa373c6829263ca6322d0', 'a2ca0c7297a8491ca849fc1a06c9efbf', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 1, 'single', '', '', 1, 'admin', '2021-01-24 14:39:35', '2021-01-24 14:38:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('c8027cf4f2483042445c89ba86c4e51f', '402880e5721355dd01721355dd390000', 'zong_price', '单品总价', NULL, 0, 1, 1, 'double', 10, 3, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 10, NULL, NULL, '2020-05-14 21:18:14', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('c91b697b1bcd2be943fc746e2660bc9e', '402860816bff91c0016bff91d2810005', 'real_name', '姓名', 'real_name', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 3, 'admin', '2019-07-19 18:05:55', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('c962b89c893e2b8cf1a12c678ba12962', '553a4172fde446419cb602dc70f9ee67', 'zdbdx', '字典表单选', NULL, 0, 1, 1, 'string', 255, 0, NULL, 'id', 'sys_depart', 'depart_name', 'radio', '', 200, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 39, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('c988bd2b6125c01ceb3579a207dd8784', '3d447fa919b64f6883a834036c14aa67', 'city', '市', NULL, 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 2, 'admin', '2025-05-15 18:26:26', '2020-02-20 16:19:00', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('c9969d8427655f34affd6021ecd546ca', '05a3a30dada7411c9109306aa4117068', 'month', '月', NULL, 0, 1, 1, 'Date', 0, 0, '', '', '', '', 'date', '', 120, '', '0', '{\\\"labelLength\\\":6,\\\"picker\\\":\\\"month\\\"}', '', 0, 1, 0, 0, 'single', '', '', 13, 'admin', '2026-01-21 11:59:02', '2024-06-12 11:21:08', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('c9b698d3f75aa780ee1eb67ef090b15b', '73162c3b8161413e8ecdca7eb288d0c9', 'wl_code', '物料编码', NULL, 0, 1, 1, 'string', 200, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, 'admin', '2019-07-01 14:23:32', '2019-06-10 15:18:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ca68d935c875ba92c998a20fca314bed', '402881fd812267500181226787d90001', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 1, 'single', NULL, NULL, 0, 'admin', '2022-06-02 11:13:48', '2022-06-02 11:13:39', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('caf5a071f2299c0f9ff2f3038d6d0fc6', '402860816bff91c0016bff91ca7e0002', 'update_by', '更新人', 'update_by', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 11, 'admin', '2019-07-19 18:07:13', '2019-07-17 18:54:33', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('cb33a708b95e19085f8c9001d2d5c64c', 'e9faf717024b4aae95cff224ae9b6d97', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2019-07-03 18:23:49', '2019-07-03 18:22:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('cb50a5991ca29e617aa32e49e92c01e7', '09fd28e4b7184c1a9668496a5c496450', 'age', '年龄', NULL, 0, 1, 1, 'int', 10, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 10, 'admin', '2022-05-07 19:05:56', '2020-05-08 23:51:49', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('cb7da49a981a1b0acc5f7e8a0130bdcd', 'd35109c3632c4952a19ecc094943dd71', 'user_code', '用户编码', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 1, 1, 0, 0, 'single', '', '', 10, 'admin', '2023-09-16 21:25:25', '2019-05-11 16:26:37', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('cb871284e845e26e88242a96fac9c576', '402860816bff91c0016bff91c7010001', 'order_no', '序号', 'order_no', 0, 1, 1, 'int', 10, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 6, 'admin', '2019-07-19 18:07:47', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('cb883a4932f0fd3a80fcf27efd7d1f2d', 'f9fb8bee1a64472889d077c757b9acc7', 'sdf', 'sdf', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 11, 'admin', '2021-08-17 13:58:15', '2021-08-17 13:58:02', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('cc1ddc1304d3eb5d9a189da0a509ccd0', '32f75e4043ef4070919dbd4337186a3d', 'create_by', '创建人登录名称', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, 'admin', '2019-04-11 10:15:32', '2019-03-27 15:54:49', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ccda49a8cea079c34f0034361d058c08', '09fd28e4b7184c1a9668496a5c496450', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2022-05-07 19:05:56', '2020-05-08 23:51:49', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('ccf2f331af46ddc411b8039dd187621b', '4028839a6de2ebd3016de2ebd3870000', 'price', '单价', 'price', 0, 1, 1, 'double', 10, 2, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 10, NULL, NULL, '2019-10-19 15:29:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('cee3c1dbf67b4a7d9626b8032897a4c7', '402860816bff91c0016bff91d8830007', 'employee_id', '员工ID', 'employee_id', 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', 'oa_employee_info', 'id', 2, 'admin', '2019-07-19 18:04:41', '2019-07-17 18:54:37', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('cefb82e2168ab7e3aa57a7e9c3ca950e', '09fd28e4b7184c1a9668496a5c496450', 'order_main_id', '订单ID', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', 'ces_order_main', 'id', 12, 'admin', '2022-05-07 19:05:57', '2020-05-08 23:51:49', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('cf4c5a4c06ae6bac701edfeedfcd16aa', 'd3ae1c692b9640e0a091f8c46e17bb01', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, NULL, NULL, '2019-07-24 14:47:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('cfeb6491427aec2b4db9694af867da23', 'e9faf717024b4aae95cff224ae9b6d97', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2019-07-03 18:23:49', '2019-07-03 18:22:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('d0559db07f05c870860f98313eb0f857', 'cb2d8534a2f544bc9c618dd49da66336', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2020-02-24 17:22:42', '2020-02-24 15:15:14', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('d0d1be336726df9c41f2173f8886ba35', '997ee931515a4620bc30a9c1246429a9', 'has_child', '是否有子节点', NULL, 0, 1, 1, 'string', 3, 0, '', 'yn', '', '', 'list', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 10, 'admin', '2020-05-03 00:57:44', '2020-05-03 00:56:56', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('d14e47befe47925b1440d584f4ca56fc', '09fd28e4b7184c1a9668496a5c496450', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2022-05-07 19:05:56', '2020-05-08 23:51:49', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('d2551b70dc96a45a73b304bf755a996f', '402860816bff91c0016bff91d8830007', 'workplace', '工作单位', 'workplace', 0, 1, 1, 'string', 255, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 6, 'admin', '2019-07-19 18:04:41', '2019-07-17 18:54:37', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('d29dcdba14ea61808391fff2d927efea', '402860816bff91c0016bff91c0cb0000', 'work_summary', '工作总结', 'work_summary', 0, 1, 1, 'Text', 65535, 0, '', '', '', '', 'textarea', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 10, 'admin', '2019-07-19 18:09:01', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('d3a701472d27ca8435d6a781a597038d', 'deea5a8ec619460c9245ba85dbc59e80', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2020-05-03 01:01:18', '2019-04-20 11:41:19', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('d3ba5f990e14f9a1a0bbf6aa4cfa26dc', '56efb74326e74064b60933f6f8af30ea', 'xd_date', '下单时间', NULL, 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, 'admin', '2020-07-10 16:53:27', '2020-05-08 23:45:32', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('d48bfd2a840f9b1d00bd3b5599dca0f0', '402860816bff91c0016bff91cda80003', 'post', '职务', 'post', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 7, 'admin', '2019-07-19 18:06:36', '2019-07-17 18:54:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('d4d8cae3cd9ea93e378fc14303eee105', 'd35109c3632c4952a19ecc094943dd71', 'create_by', '创建人登录名称', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, 'admin', '2023-09-16 21:25:25', '2019-03-15 14:24:35', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('d4dea775487aef5a7aea41791d3a65db', 'e5464aa8fa7b47c580e91593cf9b46dc', 'cycle_time', '发放周期(年)', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 11, 'admin', '2019-04-24 17:09:49', '2019-04-24 14:09:06', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('d525e93aca3f1ec6c20a7ab058724e82', '553a4172fde446419cb602dc70f9ee67', 'danxuan', '字典单选', NULL, 0, 1, 1, 'string', 50, 0, NULL, 'sex', '', '', 'radio', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 10, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('d52c79620e21128fb69b4e8628cf25cc', 'dbf4675875e14676a3f9a8b2b8941140', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 6, NULL, NULL, '2019-05-27 18:02:07', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('d530ab1bc3c51e8249a506a25d1003c7', '79091e8277c744158530321513119c68', 'start_time', '会签发起时间', NULL, 0, 1, 1, 'Datetime', 32, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2019-05-11 15:29:47', '2019-05-11 15:27:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('d53e70411c206efecb8dcd00174e907c', '62e29cdb81ac44d1a2d8ff89851b853d', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, NULL, NULL, '2019-05-11 14:01:14', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('d5df0a35352ee960053686e959e9084b', '1acb6f81a1d9439da6cc4e868617b565', 'wl_unit', '计量单位', NULL, 0, 1, 1, 'string', 100, 0, '', 'air_china_unit', '', '', 'list_multi', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, 'admin', '2019-06-10 14:47:14', '2019-04-23 22:58:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('d6fad89f4f26d733291863c2dfbc5945', '27fc5f91274344afa7673a732b279939', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, 'admin', '2019-07-01 16:28:20', '2019-07-01 16:26:42', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('d7082454dac60103fdda3e00b6557d39', '402880eb71d52dc30171d52dc3a10000', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 9, NULL, NULL, '2020-05-02 19:37:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('d766ea5809e2ec9ff2cdbcb18f610ab3', '7ea60a25fa27470e9080d6a921aabbd1', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, NULL, NULL, '2019-04-17 00:22:21', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('d7c3b107f004cbc99dfe1fe6c79894d8', '402860816bff91c0016bffa220a9000b', 'social_insurance_type', '参加社保类型', 'social_insurance_type', 0, 1, 1, 'string', 255, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 35, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('d8234b56acea1a752271a6c911dd91a0', '7ea60a25fa27470e9080d6a921aabbd1', 'age', '年龄', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, NULL, NULL, '2019-04-17 00:22:21', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('d86909d794b01ad7fbb5e61d28b6603b', '73162c3b8161413e8ecdca7eb288d0c9', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 6, 'admin', '2019-07-01 14:23:32', '2019-06-10 15:18:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('d949d9157831c2fb7ba9f175081fe036', '402860816bff91c0016bff91cda80003', 'school', '学校', 'school', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 5, 'admin', '2019-07-19 18:06:36', '2019-07-17 18:54:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('d9d308feb95968dbb322c9bff0c18452', '32feeb502544416c9bf41329c10a88f4', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2019-08-23 20:03:40', '2019-07-02 18:23:23', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('d9dde2f59bb148c6b7e95256acad8972', 'e67d26b610dd414c884c4dbb24e71ce3', 'post_name', '岗位名字', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2019-04-24 11:03:32', '2019-04-24 11:02:57', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('d9e1ea7f448c5fbe7a4a7a5109a87138', '402881fd812267500181226750e90000', 'name', '商品名字', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 7, NULL, NULL, '2022-06-02 11:13:25', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('d9f9ae6986cb85019a3a4030f62f4d1a', '402860816bff91c0016bff91cfea0004', 'employee_id', '员工ID', 'employee_id', 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', 'oa_employee_info', 'id', 2, 'admin', '2019-07-19 18:05:13', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('da397534e84567b4f94cca10b70b2d52', '553a4172fde446419cb602dc70f9ee67', 'zddtjxl', '字典表带条件下拉', NULL, 0, 1, 1, 'string', 255, 0, NULL, 'username', 'sys_user where username like \\'%a%\\'', 'realname', 'list', '', 200, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 42, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('db11e7fe2a76680e502007ad82fc08b9', '402881e6760269a20176026d25650002', 'name', '姓名', 'name', 0, 1, 1, 'string', 30, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'single', NULL, NULL, 2, NULL, NULL, '2020-11-26 10:41:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('db1fb3e12385cb967b63420cfe97cde6', '402860816bff91c0016bff91cda80003', 'employee_id', '员工ID', 'employee_id', 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', 'oa_employee_info', 'id', 2, 'admin', '2019-07-19 18:06:36', '2019-07-17 18:54:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('db518071f3d42832d13a5132f82af9c2', '553a4172fde446419cb602dc70f9ee67', 'zddtjduox', '字典表带条件多选', NULL, 0, 1, 1, 'string', 255, 0, NULL, 'username', 'sys_user where username like \\'%a%\\'', 'realname', 'checkbox', '', 200, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 44, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('dbfc8f23823c4091f516635a464b3cc5', '402881e6760269a20176026d25650002', 'content', '个人简介', 'content', 0, 1, 1, 'string', 1000, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'single', NULL, NULL, 11, NULL, NULL, '2020-11-26 10:41:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('dc2bec862a4f0d600751c632d246f0ed', '4028839a6de2ebd3016de2ebd3870000', 'update_time', '更新日期', 'update_time', 0, 1, 1, 'Datetime', 0, 0, NULL, NULL, NULL, NULL, 'date', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 5, NULL, NULL, '2019-10-19 15:29:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('dcce0f5c34c530e2903de9e16feb9dbf', '41de7884bf9a42b7a2c5918f9f765dff', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2022-11-23 12:01:36', '2022-10-29 17:02:47', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('dd3e1e13d7429807b83a00a090e060b7', '402860816bff91c0016bffa220a9000b', 'join_party_info', '入党（团）时间地点', 'join_party_info', 0, 1, 1, 'string', 255, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 26, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ddc302f84c75a5f056855c664b82202a', '402860816aa5921f016aa5921f480000', 'days', '请假天数', 'days', 0, 1, 1, 'int', 10, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 3, 'admin', '2019-05-11 15:31:54', '2019-05-11 14:26:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ddcc14a2105588982b4ae657f2893d81', '32feeb502544416c9bf41329c10a88f4', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, 'admin', '2019-08-23 20:03:40', '2019-07-02 18:23:23', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('de34e46a66def956437635585db427b7', 'cb2d8534a2f544bc9c618dd49da66336', 'dde', 'ee', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 10, NULL, NULL, '2020-02-24 17:22:43', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('de3a8a6b042b1821b3dcbd236fd82174', '402881e6760269a201760269a2af0000', 'pic', '图片', NULL, 0, 1, 1, 'string', 1000, 0, '', '', '', '', 'image', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 14, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('de8f510d358f499dcd966e97708f82d4', '997ee931515a4620bc30a9c1246429a9', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 6, 'admin', '2020-05-03 00:57:44', '2020-05-03 00:56:56', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('dec74e7fe09a525cda36efd37e6c4dca', '553a4172fde446419cb602dc70f9ee67', 'zddtjxldx', '字典表带条件下拉多选', NULL, 0, 1, 1, 'string', 255, 0, NULL, 'username', 'sys_user where username like \\'%a%\\'', 'realname', 'list_multi', '', 200, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 45, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('dedb920a5e876e27eb144464209ebe1e', '27fc5f91274344afa7673a732b279939', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 6, 'admin', '2019-07-01 16:28:20', '2019-07-01 16:26:42', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('df489194c6008f3bd21b2c1c11fde337', 'fb19fb067cd841f9ae93d4eb3b883dc0', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 2, NULL, NULL, '2019-03-23 11:39:48', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('df4c5e8411c102f02a6fe6727e858d55', '997ee931515a4620bc30a9c1246429a9', 'pic', '分类图片', NULL, 0, 1, 1, 'string', 500, 0, '', '', '', '', 'image', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, 'admin', '2020-05-03 00:57:44', '2020-05-03 00:56:56', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('dff586dae2bf4587a0b438cdbba0a5b9', 'b493c5fd4fa64a3a84e74ee171763e37', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 1, 'single', '', '', 1, NULL, NULL, '2021-06-07 18:13:37', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('e09b191e3c37f9c89ae2192c75220b89', 'b81de38db24047b497d476516f8a0865', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 6, NULL, NULL, '2020-02-24 14:56:08', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('e0c5d6e483897d5c4e7894dc66dd1aff', '32feeb502544416c9bf41329c10a88f4', 'bpm_status', '流程状态', NULL, 0, 1, 1, 'string', 2, 0, '', 'bpm_status', '', '', 'list', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 9, 'admin', '2019-08-23 20:03:40', '2019-07-02 18:23:58', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('e24de426223dc0271a55eccc1d5457d0', '73162c3b8161413e8ecdca7eb288d0c9', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2019-07-01 14:23:32', '2019-06-10 15:18:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('e2d73ccda7f10f5a1ccce3c48b1e699e', '402860816bff91c0016bffa220a9000b', 'residence_street', '户口所在街道', 'residence_street', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 27, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('e350986acb670f247df30fe4a44e73df', '09fd28e4b7184c1a9668496a5c496450', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 1, 'single', '', '', 1, 'admin', '2022-05-07 19:05:56', '2020-05-08 23:51:49', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('e461b46a91d2f856d417fa32f4c4d887', 'f9fb8bee1a64472889d077c757b9acc7', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 6, 'admin', '2021-08-17 13:58:15', '2021-08-17 13:57:48', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('e48ebd15c6110e9eb753bdfc88c04683', 'a2ca0c7297a8491ca849fc1a06c9efbf', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2021-01-24 14:39:35', '2021-01-24 14:38:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('e4914fdff68ac72486ada105e6e9fa36', 'e9faf717024b4aae95cff224ae9b6d97', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, 'admin', '2019-07-03 18:23:49', '2019-07-03 18:22:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('e4a4c1d50b7b46678bc14fd5b90ee082', '73162c3b8161413e8ecdca7eb288d0c9', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2019-07-01 14:23:32', '2019-06-10 15:18:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('e4d7f95340e73a54e8ff3f66b0613513', '56efb74326e74064b60933f6f8af30ea', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2020-07-10 16:53:27', '2020-05-08 23:45:32', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('e50b4398731e06572c247993a0dcc38d', 'd35109c3632c4952a19ecc094943dd71', 'name', '用户名', NULL, 0, 1, 1, 'string', 200, 0, '', '', '', '', 'text', '', 120, '*', '0', '', '', 1, 1, 1, 0, 'single', '', '', 5, 'admin', '2023-09-16 21:25:25', '2019-03-15 14:24:35', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '1');\nINSERT INTO `onl_cgform_field` VALUES ('e53f53766d1f7718b3ee5eabe105b969', '402860816bff91c0016bffa220a9000b', 'social_insurance_time', '五险一金日期', 'social_insurance_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 38, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('e672d5974a06d5c37b3b4c94a6f29f96', '4028318169e81b970169e81b97650000', 'request_url', '请求路径', 'request_url', 0, 1, 1, 'string', 255, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 9, NULL, NULL, '2019-04-04 19:28:36', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('e6bd2d4c533918a0b19e1d54a056582f', '41de7884bf9a42b7a2c5918f9f765dff', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, 'admin', '2022-11-23 12:01:36', '2022-10-29 17:02:47', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('e72ee3a352143281ccc3a823b25401c7', '402881fd812267500181226787d90001', 'sex', '性别', NULL, 0, 1, 1, 'string', 32, 0, '', 'sex', '', '', 'list', '', 120, '', '0', '', '', 1, 1, 1, 0, 'single', NULL, NULL, 8, 'admin', '2022-06-02 11:13:48', '2022-06-02 11:13:39', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('e7aade12ca722b59c1ec681d14247ff8', '402860816bff91c0016bff91d8830007', 'sys_org_code', '组织机构编码', 'sys_org_code', 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 14, 'admin', '2019-07-19 18:04:41', '2019-07-17 18:54:37', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('e7c367221181aa9d1fc395e09796be8d', '402880eb71d52dc30171d52dc3a10000', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 7, NULL, NULL, '2020-05-02 19:37:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('e7ec6838aad8d2dd2e175886a7c6e14e', '402881e6760269a201760269a2af0000', 'sel_search', '下拉搜索', NULL, 0, 1, 1, 'string', 32, 0, '', 'username', 'sys_user', 'username', 'sel_search', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 12, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('e824c44d26034ad8eed32e22a3f69043', '402881e6760269a201760269a2af0000', 'ddd', 'DD类型', NULL, 0, 1, 1, 'double', 10, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 20, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('e845925368919482df6dac58e6ed708d', '402860816bff91c0016bff91d8830007', 'phone', '联系方式', 'phone', 0, 1, 1, 'string', 20, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 8, 'admin', '2019-07-19 18:04:41', '2019-07-17 18:54:37', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('e85295979d84bde27615a008d8bbadf1', '3b5e18da618247539481816995b6bf9f', 'sex', '性别', NULL, 0, 1, 1, 'string', 32, 0, '', 'sex', '', '', 'list', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 9, 'admin', '2020-07-11 11:27:29', '2020-07-11 11:27:17', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('e878e70574d0d6180c2f6f0d281c9262', '8d66ea41c7cc4ef9ab3aab9055657fc9', 'pid', '父级节点', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 0, 0, 'single', '', '', 10, NULL, NULL, '2020-05-07 22:46:32', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('e88d328af34dd8a17f51437c52b68a2d', '402860816bff91c0016bff91cfea0004', 'create_by', '创建人', 'create_by', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 9, 'admin', '2019-07-19 18:05:13', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('e99cc08f4d88dd8f788399db8d448ee8', '62e29cdb81ac44d1a2d8ff89851b853d', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, NULL, NULL, '2019-05-11 14:01:14', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('e9a45935d69f5fd91f0c6880e5e6cfa4', '402881e6760269a20176026d25650002', 'age', '年龄', 'age', 0, 1, 1, 'int', 10, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'single', NULL, NULL, 8, NULL, NULL, '2020-11-26 10:41:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('e9b782461fc66dbc77df0400600868f7', '553a4172fde446419cb602dc70f9ee67', 'riqi', '日期', NULL, 0, 1, 1, 'Date', 50, 0, NULL, '', '', '', 'date', '', 120, '', '0', '', '', 1, 1, 1, 0, 'group', '', '', 13, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('e9fb150adabaaacdd804b1953e6bad24', '05a3a30dada7411c9109306aa4117068', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2026-01-21 11:59:02', '2020-05-06 11:34:31', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('ea309f9cd81ede7b9b36a1377a3a40d8', '997ee931515a4620bc30a9c1246429a9', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2020-05-03 00:57:44', '2020-05-03 00:56:56', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('ea644c4c208739640933ba6e568045c1', 'e2faf977fdaf4b25a524f58c2441a51c', 'ruz_date', '入职时间', NULL, 0, 1, 1, 'Datetime', 32, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 9, 'admin', '2019-06-10 17:27:00', '2019-04-24 17:12:11', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ea749346b5eb9e70df2058ade2b0bbfa', '402881e6760269a201760269a2af0000', 'fuwenb', '富文本', NULL, 0, 1, 1, 'Text', 0, 0, '', '', '', '', 'umeditor', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 17, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('ea96d1c33f0f0d7245045e70a5793257', '402860816bff91c0016bffa220a9000b', 'current_postcode', '现居住地邮编', 'current_postcode', 0, 1, 1, 'string', 10, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 31, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('eb1d4b15efc32b81ec5e486f73b5ef24', '41de7884bf9a42b7a2c5918f9f765dff', 'birthday', '生日', NULL, 0, 1, 1, 'Date', 0, 0, '', '', '', '', 'date', '', 200, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 9, 'admin', '2022-11-23 12:01:36', '2022-10-29 17:02:47', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('ebc41362681919cc680fcc58bf87fdcb', '1acb6f81a1d9439da6cc4e868617b565', 'price', '单价', NULL, 0, 1, 1, 'double', 10, 2, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 12, 'admin', '2019-06-10 14:47:14', '2019-04-23 22:58:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ec20e66d5eb9b8b7f58de9edc0f7630b', '1acb6f81a1d9439da6cc4e868617b565', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, 'admin', '2019-06-10 14:47:14', '2019-04-23 22:58:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ec5e9cb5809b2f8ce1446df4a27693f0', '27fc5f91274344afa7673a732b279939', 'name', '用户名', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2019-07-01 16:28:20', '2019-07-01 16:26:42', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ed16f23d08e7bcda11a1383fda68057e', '402860816bff91c0016bff91c7010001', 'employee_id', '员工ID', 'employee_id', 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', 'oa_employee_info', 'id', 2, 'admin', '2019-07-19 18:07:47', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('edaa8951735cedf29d6114354faaae67', '402881e6760269a201760269a2af0000', 'radio', 'radio', NULL, 0, 1, 1, 'string', 32, 0, '', 'sex', '', '', 'radio', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 9, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('edda30c64e1dccee510d40b77a8ca094', 'fb7125a344a649b990c12949945cb6c1', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2019-03-26 19:24:11', '2019-03-26 19:01:52', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ee09e0e21fa350b9346b70292dcfca00', '79091e8277c744158530321513119c68', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, 'admin', '2019-05-11 15:29:47', '2019-05-11 15:27:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ee4ffe04a25fcf556e78183f1f521546', '402860816aa5921f016aa5921f480000', 'create_by', '创建人id', 'create_by', 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'group', '', '', 8, 'admin', '2019-05-11 15:31:54', '2019-05-11 14:26:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ee5803611f63643059b6375166d71567', '402860816bff91c0016bff91c7010001', 'create_time', '创建时间', 'create_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 8, 'admin', '2019-07-19 18:07:47', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('eec5bc01720642ccc635c7fc2e9b1eb8', '86bf17839a904636b7ed96201b2fa6ea', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2020-05-14 21:18:49', '2020-05-08 23:48:31', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('ef81373c5fd7130d7e23859d90c9eb3e', '402860816bff91c0016bff91cda80003', 'from_time', '开始日期', 'from_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 3, 'admin', '2019-07-19 18:06:36', '2019-07-17 18:54:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('efd1b955a75b5046e9857e00fe94ae2c', 'fbc35f067da94a70adb622ddba259352', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, NULL, NULL, '2019-07-03 19:44:23', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f015cc2ffdcc2c4be1e9b3622eb69b52', 'fbc35f067da94a70adb622ddba259352', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 6, NULL, NULL, '2019-07-03 19:44:23', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f06b2bb01ea1fae487b7e3c3eb521d5b', 'd3ae1c692b9640e0a091f8c46e17bb01', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, NULL, NULL, '2019-07-24 14:47:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f0967fd139b440f79f21248bf4e4a209', 'd3ae1c692b9640e0a091f8c46e17bb01', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, NULL, NULL, '2019-07-24 14:47:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f0a453930aa16ca32f2e3be860bfe542', '402860816bff91c0016bffa220a9000b', 'education', '学历', 'education', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 14, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f12753b4a3815697a72017a7436fe733', 'e2faf977fdaf4b25a524f58c2441a51c', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, 'admin', '2019-06-10 17:27:00', '2019-04-24 17:12:11', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f1ab7d3b55ade57eeac6c55b32ce813a', '1acb6f81a1d9439da6cc4e868617b565', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2019-06-10 14:47:14', '2019-04-23 22:58:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f1c7fde21f26c7ed64a0ef1095900c52', '4028318169e81b970169e81b97650000', 'request_type', '请求类型', 'request_type', 0, 1, 1, 'string', 10, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 11, NULL, NULL, '2019-04-04 19:28:36', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f32068148faf57abaf4511cd94adb3e4', '05a3a30dada7411c9109306aa4117068', 'year', '年', NULL, 0, 1, 1, 'Date', 0, 0, '', '', '', '', 'date', '', 120, '', '0', '{\\\"labelLength\\\":6,\\\"picker\\\":\\\"year\\\"}', '', 0, 1, 0, 0, 'single', '', '', 12, 'admin', '2026-01-21 11:59:02', '2024-06-12 11:21:08', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('f3284a1ce6da9b887dce89091eaa0f6b', '402880e570a5d7000170a5d700f50000', 'pro_type', '产品类型', NULL, 0, 1, 1, 'string', 32, 0, '', 'sex', '', '', 'radio', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', NULL, NULL, 9, NULL, NULL, '2020-03-04 21:58:16', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f38319e2add8da6a7223d77359144a22', '402880e5721355dd01721355dd390000', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 4, NULL, NULL, '2020-05-14 21:18:14', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('f3a82b0b74e8feb37b423571c443357c', '553a4172fde446419cb602dc70f9ee67', 'kaiguan', '开关', NULL, 0, 1, 1, 'string', 50, 0, NULL, '', '', '', 'switch', '', 120, '', '0', '[1,2]', '', 0, 1, 1, 0, 'single', '', '', 12, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('f3c17d679978f0d375adde046536faa8', '553a4172fde446419cb602dc70f9ee67', 'popup', 'popup弹窗', NULL, 0, 1, 1, 'string', 100, 0, NULL, 'username,realname', 'report_user', 'popup,popback', 'popup', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 21, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('f4647a91a4ac5d6d32bb0692b800bffe', '402860816bff91c0016bff91c0cb0000', 'probation_post', '试用期职位', 'probation_post', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 8, 'admin', '2019-07-19 18:09:01', '2019-07-17 18:54:32', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f4b0bc7f3d6562e28d7c5e2d56510ecd', 'e5464aa8fa7b47c580e91593cf9b46dc', 'first_num', '首次数量', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 8, 'admin', '2019-04-24 17:09:49', '2019-04-24 14:31:31', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f4df140776be0d014d768a3cabf13dbe', '553a4172fde446419cb602dc70f9ee67', 'zdbxl', '字典表下拉', NULL, 0, 1, 1, 'string', 255, 0, NULL, 'id', 'sys_depart', 'depart_name', 'list', '', 200, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 38, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('f558359b06aea79a992c102ce3563a4d', '4028318169e81b970169e81b97650000', 'username', '操作用户名称', 'username', 0, 1, 1, 'string', 100, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 6, NULL, NULL, '2019-04-04 19:28:36', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f56d0d76ec8e3a1e8922b41b864dab73', 'b493c5fd4fa64a3a84e74ee171763e37', 'aa', 'aa', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, NULL, NULL, '2021-06-07 18:13:37', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('f5d2475aec4b9016dfc0c8772e1704ea', '402880eb71d52dc30171d52dc3a10000', 'code', '编码', NULL, 0, 1, 1, 'string', 200, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '${order_num_rule_param}', 0, 1, 1, 0, 'single', NULL, NULL, 2, NULL, NULL, '2020-05-02 19:37:59', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('f6076d9c662a0adddb39a91cccb4c993', 'd35109c3632c4952a19ecc094943dd71', 'xiamuti', '下拉多选', NULL, 0, 1, 1, 'string', 100, 0, '', 'sex', '', '', 'list_multi', '', 120, '', '0', '', '', 1, 1, 1, 0, 'single', '', '', 16, 'admin', '2023-09-16 21:25:25', '2020-11-26 18:02:20', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('f6431abe33976df2491df14db01591fe', '402881e6760269a20176026d25650002', 'key_word', '关键词', 'key_word', 0, 1, 1, 'string', 255, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'single', NULL, NULL, 3, NULL, NULL, '2020-11-26 10:41:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f6afcb7d8ea81879593ff737b55ddcc0', '402860816bff91c0016bff91cda80003', 'id', 'id', 'id', 1, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'group', '', '', 1, 'admin', '2019-07-19 18:06:36', '2019-07-17 18:54:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f6f8aed87ec73994f6a12abbc079dbb1', '402860816bff91c0016bffa220a9000b', 'update_by', '更新人', 'update_by', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 41, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f7332af7586c83c87f7b9ea144a5292d', '62e29cdb81ac44d1a2d8ff89851b853d', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, NULL, NULL, '2019-05-11 14:01:14', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f76719783433487f4710232e2ae0e521', '402860816bff91c0016bff91cfea0004', 'id', 'id', 'id', 1, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'group', '', '', 1, 'admin', '2019-07-19 18:05:13', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f7e7eb84ddc34d7e09d10af213ac6667', '402860816bff91c0016bff91d2810005', 'create_time', '创建时间', 'create_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 11, 'admin', '2019-07-19 18:05:55', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f7f84f3337548e36430f81640b028b41', '5517e93b148a42a7b82d5f3f94542dcf', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'datetime', '', 120, '', '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, NULL, NULL, '2022-07-19 19:36:53', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('f81c2df076ceea5312648efc45311cf0', '402881fd812267500181226787d90001', 'month', '月', NULL, 0, 1, 1, 'Date', 0, 0, '', '', '', '', 'date', '', 120, '', '0', '{\\\"labelLength\\\":6,\\\"picker\\\":\\\"month\\\"}', '', 0, 1, 1, 0, 'single', '', '', 13, NULL, NULL, '2024-06-12 11:21:08', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('f81d7103c0c857e5c744cda2bc4c000a', '402860816bff91c0016bff91ca7e0002', 'cert_organizations', '发证机关', 'cert_organizations', 0, 1, 1, 'string', 255, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 6, 'admin', '2019-07-19 18:07:13', '2019-07-17 18:54:33', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f82db8edef5babf741914b0fa221329b', '4028839a6de2ebd3016de2ebd3870000', 'bpm_status', '流程状态', 'bpm_status', 0, 1, 1, 'string', 2, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 1, 1, 0, 'group', NULL, NULL, 16, NULL, NULL, '2019-10-19 15:29:30', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f857d4fd2d63c1ad94ed4698f5b173f5', '05a3a30dada7411c9109306aa4117068', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 1, 'single', '', '', 0, 'admin', '2026-01-21 11:59:02', '2020-05-06 11:34:31', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('f8a0fd20a1173270afdfed1129d5c669', '402860816bff91c0016bffa220a9000b', 'depart_id', '所在部门id', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 44, 'admin', '2019-07-22 16:15:32', '2019-07-19 15:33:44', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f8cc6be747fec10802eb625ac529c16f', '402860816bff91c0016bff91cfea0004', 'create_time', '创建时间', 'create_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 10, 'admin', '2019-07-19 18:05:13', '2019-07-17 18:54:35', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f90bcb38fb89988bd40d1618aa75cea0', '758334cb1e7445e2822b60e807aec4a3', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 1, NULL, NULL, '2019-10-18 18:02:09', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f93dcb2aa091b8e1038019d8f07cbd3f', '402881e6760269a201760269a2af0000', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 1, 'single', NULL, NULL, 1, NULL, NULL, '2020-11-26 10:37:26', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('f94db83e41c69f407d3c9a81c5892269', '402860816bff91c0016bffa220a9000b', 'first_job_time', '首次工作时间', 'first_job_time', 0, 1, 1, 'Datetime', 0, 0, '', '', '', '', 'date', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 22, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('f95d2cbefd25444909c83aaf8c4f72fb', '402860816bff91c0016bff91ca7e0002', 'memo', '备注', 'memo', 0, 1, 1, 'string', 255, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 7, 'admin', '2019-07-19 18:07:13', '2019-07-17 18:54:33', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('fa3a12d7abf72b23afe425f8dbd57f86', '1acb6f81a1d9439da6cc4e868617b565', 'size_type', '尺码类型', NULL, 0, 1, 1, 'string', 2, 0, '', 'air_china_size', '', '', 'list', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 9, 'admin', '2019-06-10 14:47:14', '2019-04-23 22:58:19', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('fa8f5a0ba673e0208934567462844eab', '402860816bff91c0016bff91ca7e0002', 'sys_org_code', '组织机构编码', 'sys_org_code', 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 13, 'admin', '2019-07-19 18:07:13', '2019-07-17 18:54:33', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('fafb32cf7e63bca93bbd70b0a0ea11fc', '758334cb1e7445e2822b60e807aec4a3', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 6, NULL, NULL, '2019-10-18 18:02:09', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('fb56aeb6b3a5a0a974ef62f34727eea6', '402880e5721355dd01721355dd390000', 'sys_org_code', '所属部门', NULL, 0, 1, 1, 'string', 64, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', NULL, NULL, 6, NULL, NULL, '2020-05-14 21:18:14', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('fbf817e3eafd7d8935fc1154640c040c', 'f9fb8bee1a64472889d077c757b9acc7', 'create_time', '创建日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 3, 'admin', '2021-08-17 13:58:15', '2021-08-17 13:57:48', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('fc22e67ed788a1f0b0fe4639ecb6f4c1', '553a4172fde446419cb602dc70f9ee67', 'ldzje', '联动组件二', NULL, 0, 1, 1, 'string', 255, 0, NULL, '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 30, 'admin', '2022-10-14 09:31:05', '2022-10-13 20:59:58', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('fc55d467102c2c782286f546d7820c3d', '73162c3b8161413e8ecdca7eb288d0c9', 'pid', '父物料', NULL, 0, 1, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 9, 'admin', '2019-07-01 14:23:32', '2019-06-10 15:18:34', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('fc76a3832d232829852cae6c66e44f67', '402860816bff91c0016bffa220a9000b', 'identity_no', '身份证号', 'identity_no', 0, 1, 1, 'string', 20, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 21, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('fcd519058d68fa4dab192335602b5d24', '402860816bff91c0016bffa220a9000b', 'real_name', '姓名', 'real_name', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 5, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('fd0586cae06685959415d9017b2bdf49', '758334cb1e7445e2822b60e807aec4a3', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, NULL, NULL, '2019-10-18 18:02:09', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('fd80c2874fb71c8fc7cff81fb3dae0fb', 'feea98637c2144caae7c5d56a815a245', 'create_by', '创建人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 2, NULL, NULL, '2021-10-27 10:24:24', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('fde00160a5d664effaa4b5552e814e74', 'fb7125a344a649b990c12949945cb6c1', 'sex', '性别', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 6, 'admin', '2019-03-26 19:24:11', '2019-03-26 19:01:52', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('fde3b676f66c20375136421a11743c3b', 'feea98637c2144caae7c5d56a815a245', 'update_time', '更新日期', NULL, 0, 1, 1, 'Datetime', 20, 0, '', '', '', '', 'datetime', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 5, NULL, NULL, '2021-10-27 10:24:24', 'admin', '', '', '', '', '', NULL, '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('fe05080f0cd87dd11710b83ce77fefb7', '402881e6760269a20176026d25650002', 'id', '主键ID', 'id', 1, 0, 1, 'string', 50, 0, NULL, NULL, NULL, NULL, 'text', NULL, 120, NULL, '0', NULL, NULL, 0, 0, 0, 1, 'single', NULL, NULL, 1, NULL, NULL, '2020-11-26 10:41:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('fef2add806c5e1ddd01c79c7e84f5a65', 'cb2d8534a2f544bc9c618dd49da66336', 'cc', 'cc', NULL, 0, 1, 1, 'string', 32, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, NULL, NULL, '2020-02-24 17:22:42', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ff2a099186b13d3ecb0764f7f22b1fbf', '09fd28e4b7184c1a9668496a5c496450', 'name', '客户名字', NULL, 0, 1, 1, 'string', 32, 0, '', 'realname,sex,birthday', 'tj_user_report', 'name,sex,birthday', 'popup', '', 120, '', '0', '', '', 0, 1, 1, 0, 'single', '', '', 7, 'admin', '2022-05-07 19:05:56', '2020-05-08 23:51:49', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('ff2b9d7e0493b78fa34188aa3a45231a', '41de7884bf9a42b7a2c5918f9f765dff', 'id', '主键', NULL, 1, 0, 1, 'string', 36, 0, '', '', '', '', 'text', '', 120, '', '0', '', '', 0, 0, 0, 1, 'single', '', '', 0, 'admin', '2022-11-23 12:01:36', '2022-10-29 17:02:47', 'admin', '', '', '', '', '', 'text', '0', NULL, NULL, '0');\nINSERT INTO `onl_cgform_field` VALUES ('ff49b468e54e137032f7e4d976b83b5a', '402860816bff91c0016bffa220a9000b', 'politically_status', '政治面貌', 'politically_status', 0, 1, 1, 'string', 20, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 8, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ff601f75d0e7ced226748eb8fba2c896', '402860816bff91c0016bff91d8830007', 'relation', '关系', 'relation', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 4, 'admin', '2019-07-19 18:04:41', '2019-07-17 18:54:37', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ffacafee9fa46eb297ca3252f95acef9', '402860816bff91c0016bffa220a9000b', 'school', '毕业学校', 'school', 0, 1, 1, 'string', 100, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 1, 1, 0, 'group', '', '', 9, 'admin', '2019-07-22 16:15:32', '2019-07-17 19:12:24', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `onl_cgform_field` VALUES ('ffcbf379fffabbd13aa2c22ce565ec12', '79091e8277c744158530321513119c68', 'update_by', '更新人', NULL, 0, 1, 1, 'string', 50, 0, '', '', '', '', 'text', '', 120, NULL, '0', '', '', 0, 0, 0, 0, 'single', '', '', 4, 'admin', '2019-05-11 15:29:47', '2019-05-11 15:27:17', 'admin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\n\n-- ----------------------------\n-- Table structure for onl_cgform_head\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_cgform_head`;\nCREATE TABLE `onl_cgform_head`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键ID',\n  `table_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '表名',\n  `table_type` int(11) NOT NULL COMMENT '表类型: 0单表、1主表、2附表',\n  `table_version` int(11) NULL DEFAULT 1 COMMENT '表版本',\n  `table_txt` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '表说明',\n  `is_checkbox` varchar(5) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '是否带checkbox',\n  `is_db_synch` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'N' COMMENT '同步数据库状态',\n  `is_page` varchar(5) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '是否分页',\n  `is_tree` varchar(5) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '是否是树',\n  `id_sequence` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '主键生成序列',\n  `id_type` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '主键类型',\n  `query_mode` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询模式',\n  `relation_type` int(11) NULL DEFAULT NULL COMMENT '映射关系 0一对多  1一对一',\n  `sub_table_str` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '子表',\n  `tab_order_num` int(11) NULL DEFAULT NULL COMMENT '附表排序序号',\n  `tree_parent_id_field` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '树形表单父id',\n  `tree_id_field` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '树表主键字段',\n  `tree_fieldname` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '树开表单列字段',\n  `form_category` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'bdfl_ptbd' COMMENT '表单分类',\n  `form_template` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'PC表单模板',\n  `form_template_mobile` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '表单模板样式(移动端)',\n  `scroll` int(3) NULL DEFAULT 0 COMMENT '是否有横向滚动条',\n  `copy_version` int(11) NULL DEFAULT NULL COMMENT '复制版本号',\n  `copy_type` int(3) NULL DEFAULT 0 COMMENT '复制表类型1为复制表 0为原始表',\n  `physic_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '原始表ID',\n  `ext_config_json` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '扩展JSON',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `theme_template` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '主题模板',\n  `is_des_form` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否用设计器表单',\n  `des_form_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '设计器表单编码',\n  `tenant_id` int(11) NULL DEFAULT 0 COMMENT '租户ID',\n  `low_app_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '关联的应用ID',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_och_cgform_head_id`(`table_name`) USING BTREE,\n  INDEX `idx_och_table_name`(`form_template`) USING BTREE,\n  INDEX `idx_och_form_template_mobile`(`form_template_mobile`) USING BTREE,\n  INDEX `idx_och_table_version`(`table_version`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_cgform_head\n-- ----------------------------\nINSERT INTO `onl_cgform_head` VALUES ('05a3a30dada7411c9109306aa4117068', 'test_note', 1, 29, '请假单@JS增强示例', 'Y', 'Y', 'Y', 'N', NULL, 'UUID', 'single', NULL, NULL, NULL, NULL, NULL, NULL, 'temp', '1', NULL, 1, NULL, 0, NULL, '{\\\"reportPrintShow\\\":0,\\\"reportPrintUrl\\\":\\\"\\\",\\\"joinQuery\\\":0,\\\"modelFullscreen\\\":0,\\\"modalMinWidth\\\":0,\\\"commentStatus\\\":1,\\\"tableFixedAction\\\":1,\\\"tableFixedActionType\\\":\\\"right\\\",\\\"formLabelLengthShow\\\":0,\\\"formLabelLength\\\":null,\\\"enableExternalLink\\\":0,\\\"externalLinkActions\\\":\\\"add,edit,detail\\\"}', 'admin', '2026-01-21 11:59:02', 'admin', '2020-05-06 11:34:31', 'normal', 'N', '', 0, NULL);\nINSERT INTO `onl_cgform_head` VALUES ('3d447fa919b64f6883a834036c14aa67', 'test_enhance_select', 1, 7, '三级联动控件', 'N', 'Y', 'Y', 'N', NULL, 'UUID', 'single', NULL, NULL, NULL, NULL, NULL, NULL, 'bdfl_include', '1', NULL, 0, NULL, 0, NULL, '{\\\"reportPrintShow\\\":0,\\\"reportPrintUrl\\\":\\\"\\\",\\\"joinQuery\\\":0,\\\"modelFullscreen\\\":0,\\\"modalMinWidth\\\":\\\"\\\",\\\"commentStatus\\\":0,\\\"tableFixedAction\\\":1,\\\"tableFixedActionType\\\":\\\"right\\\",\\\"formLabelLengthShow\\\":0,\\\"formLabelLength\\\":null,\\\"enableExternalLink\\\":0,\\\"externalLinkActions\\\":\\\"add,edit,detail\\\"}', 'admin', '2025-05-15 18:26:26', 'admin', '2020-02-20 16:19:00', 'normal', 'N', '', 0, NULL);\nINSERT INTO `onl_cgform_head` VALUES ('402880e570a5d7000170a5d700f50000', 'test_order_product$1', 1, 11, '订单产品明细', 'N', 'N', 'Y', 'N', NULL, 'UUID', 'single', NULL, NULL, NULL, NULL, NULL, NULL, 'bdfl_include', '1', NULL, 0, 1, 1, 'deea5a8ec619460c9245ba85dbc59e80', NULL, NULL, NULL, 'admin', '2020-03-04 21:58:16', NULL, NULL, NULL, 0, NULL);\nINSERT INTO `onl_cgform_head` VALUES ('402880e5721355dd01721355dd390000', 'ces_order_goods$1', 1, 1, '订单商品', 'Y', 'N', 'Y', 'N', NULL, 'UUID', 'single', NULL, NULL, NULL, NULL, NULL, NULL, 'temp', '1', NULL, 1, 1, 1, '86bf17839a904636b7ed96201b2fa6ea', NULL, NULL, NULL, 'admin', '2020-05-14 21:18:14', 'normal', NULL, NULL, 0, NULL);\nINSERT INTO `onl_cgform_head` VALUES ('402881fd812267500181226750e90000', 'ces_shop_goods$1', 1, 1, '商品', 'Y', 'N', 'Y', 'N', NULL, 'UUID', 'single', NULL, NULL, NULL, NULL, NULL, NULL, 'temp', '1', NULL, 1, 7, 1, '53a3e82b54b946c2b904f605875a275c', NULL, NULL, NULL, 'admin', '2022-06-02 11:13:25', 'normal', NULL, NULL, 0, NULL);\nINSERT INTO `onl_cgform_head` VALUES ('402881fd812267500181226787d90001', 'test_note$1', 1, 2, '请假单@JS增强示例', 'Y', 'N', 'Y', 'N', NULL, 'UUID', 'single', NULL, NULL, NULL, NULL, NULL, NULL, 'temp', '1', NULL, 1, 12, 1, '05a3a30dada7411c9109306aa4117068', '{\\\"reportPrintShow\\\":0,\\\"reportPrintUrl\\\":\\\"\\\",\\\"joinQuery\\\":0,\\\"modelFullscreen\\\":0,\\\"modalMinWidth\\\":\\\"\\\"}', 'admin', '2022-06-02 11:13:48', 'admin', '2022-06-02 11:13:39', 'normal', 'N', '', 0, NULL);\nINSERT INTO `onl_cgform_head` VALUES ('41de7884bf9a42b7a2c5918f9f765dff', 'test_order_customer', 3, 9, '订单客户', 'Y', 'Y', 'Y', 'N', NULL, 'UUID', 'single', 0, NULL, 2, NULL, NULL, NULL, 'temp', '1', NULL, 1, NULL, 0, NULL, '{\\\"reportPrintShow\\\":0,\\\"reportPrintUrl\\\":\\\"\\\",\\\"joinQuery\\\":0,\\\"modelFullscreen\\\":0,\\\"modalMinWidth\\\":\\\"\\\",\\\"commentStatus\\\":0}', 'admin', '2022-11-23 12:01:41', 'admin', '2019-04-20 11:41:19', 'normal', 'N', '', 0, NULL);\nINSERT INTO `onl_cgform_head` VALUES ('56870166aba54ebfacb20ba6c770bd73', 'test_order_main', 2, 39, '测试订单主表', 'Y', 'Y', 'Y', 'N', NULL, 'UUID', 'single', NULL, 'test_order_product,test_order_customer', NULL, NULL, NULL, NULL, 'bdfl_include', '2', NULL, 0, NULL, 0, NULL, '{\\\"reportPrintShow\\\":0,\\\"reportPrintUrl\\\":\\\"\\\",\\\"joinQuery\\\":0,\\\"modelFullscreen\\\":0,\\\"modalMinWidth\\\":900,\\\"commentStatus\\\":0,\\\"tableFixedAction\\\":0,\\\"tableFixedActionType\\\":\\\"right\\\",\\\"formLabelLengthShow\\\":0,\\\"formLabelLength\\\":null,\\\"enableExternalLink\\\":0,\\\"externalLinkActions\\\":\\\"add,edit,detail\\\"}', 'admin', '2025-11-27 18:19:46', 'admin', '2019-04-20 11:38:39', 'normal', 'N', '', 0, NULL);\nINSERT INTO `onl_cgform_head` VALUES ('997ee931515a4620bc30a9c1246429a9', 'test_shoptype_tree', 1, 2, '商品分类', 'Y', 'Y', 'Y', 'Y', NULL, 'UUID', 'single', NULL, NULL, NULL, 'pid', 'has_child', 'type_name', 'temp', '1', NULL, 1, NULL, 0, NULL, NULL, 'admin', '2020-05-03 00:57:47', 'admin', '2020-05-03 00:56:56', 'normal', NULL, NULL, 0, NULL);\nINSERT INTO `onl_cgform_head` VALUES ('d35109c3632c4952a19ecc094943dd71', 'test_demo', 1, 39, '测试用户表', 'Y', 'Y', 'Y', 'N', NULL, 'UUID', 'group', NULL, NULL, NULL, NULL, NULL, NULL, 'bdfl_include', '1', NULL, 0, NULL, 0, NULL, '{\\\"reportPrintShow\\\":0,\\\"reportPrintUrl\\\":\\\"\\\",\\\"joinQuery\\\":0,\\\"modelFullscreen\\\":0,\\\"modalMinWidth\\\":900,\\\"commentStatus\\\":0,\\\"tableFixedAction\\\":0,\\\"tableFixedActionType\\\":\\\"right\\\"}', 'admin', '2023-09-16 21:25:25', 'admin', '2019-03-15 14:24:35', 'normal', 'N', '', 0, NULL);\nINSERT INTO `onl_cgform_head` VALUES ('deea5a8ec619460c9245ba85dbc59e80', 'test_order_product', 3, 12, '订单产品明细', 'N', 'Y', 'Y', 'N', NULL, 'UUID', 'single', 0, '', 1, NULL, NULL, NULL, 'bdfl_include', '1', NULL, 0, NULL, 0, NULL, NULL, 'admin', '2022-10-29 17:13:01', 'admin', '2019-04-20 11:41:19', 'normal', NULL, NULL, 0, NULL);\n\n-- ----------------------------\n-- Table structure for onl_cgform_index\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_cgform_index`;\nCREATE TABLE `onl_cgform_index`  (\n  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',\n  `cgform_head_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '主表id',\n  `index_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '索引名称',\n  `index_name_old` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '原索引名称',\n  `index_field` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '索引栏位',\n  `index_type` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '索引类型',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `is_db_synch` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'N' COMMENT '是否同步数据库 N未同步 Y已同步',\n  `del_flag` int(1) NULL DEFAULT 0 COMMENT '是否删除 0未删除 1删除',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_oci_cgform_head_id`(`cgform_head_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_cgform_index\n-- ----------------------------\nINSERT INTO `onl_cgform_index` VALUES ('4731e321163d65e0e2cabf52c4a29937', '553a4172fde446419cb602dc70f9ee67', 'index_jycs', NULL, 'jycs', 'unique', 'admin', '2022-10-13 20:59:58', 'admin', '2022-10-14 09:31:05', 'Y', 0);\n\n-- ----------------------------\n-- Table structure for onl_cgreport_head\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_cgreport_head`;\nCREATE TABLE `onl_cgreport_head`  (\n  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `code` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '报表编码',\n  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '报表名字',\n  `cgr_sql` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '报表SQL',\n  `return_val_field` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '返回值字段',\n  `return_txt_field` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '返回文本字段',\n  `return_type` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '1' COMMENT '返回类型，单选或多选',\n  `db_source` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '动态数据源',\n  `content` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',\n  `tenant_id` int(11) NULL DEFAULT 0 COMMENT '租户ID',\n  `low_app_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '关联的应用ID',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人id',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人id',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `index_onlinereport_code`(`code`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_cgreport_head\n-- ----------------------------\nINSERT INTO `onl_cgreport_head` VALUES ('1256627801873821698', 'report002', '统计登录每日登录次数', 'select DATE_FORMAT(create_time,  \\'%Y-%m-%d\\') as date,count(*) as num from sys_log group by DATE_FORMAT(create_time, \\'%Y-%m-%d\\')', NULL, NULL, '1', NULL, NULL, 0, NULL, '2022-10-13 16:47:57', 'admin', '2020-05-03 00:53:10', 'admin');\nINSERT INTO `onl_cgreport_head` VALUES ('1260179852088135681', 'tj_user_report', '统一有效系统用户', 'select id,realname,username,sex,birthday,avatar,phone,email from sys_user', NULL, NULL, '1', NULL, NULL, 0, NULL, '2023-10-17 16:25:56', 'admin', '2020-05-12 20:07:44', 'admin');\nINSERT INTO `onl_cgreport_head` VALUES ('1590154651759259649', 'withparamreport', '带参数报表', 'select * from demo where sex = \\'${sex}\\'', NULL, NULL, '1', NULL, NULL, 0, NULL, '2024-01-03 11:08:34', 'admin', '2022-11-09 09:29:47', 'admin');\nINSERT INTO `onl_cgreport_head` VALUES ('1705487386450534402', 'seelog', '查看日志', 'select * from sys_log', NULL, NULL, '1', NULL, NULL, 0, NULL, '2026-01-23 16:45:40', 'admin', '2023-09-23 15:40:54', 'admin');\nINSERT INTO `onl_cgreport_head` VALUES ('6c7f59741c814347905a938f06ee003c', 'report_user', '统计在线用户', 'select realname,username,sex,birthday,avatar,phone,email from sys_user', NULL, NULL, '1', NULL, NULL, 0, NULL, '2022-10-25 11:41:18', 'admin', '2019-03-25 11:20:45', 'admin');\nINSERT INTO `onl_cgreport_head` VALUES ('87b55a515d3441b6b98e48e5b35474a6', 'demo', 'Report Demo', 'select * from demo', NULL, NULL, '1', NULL, NULL, 0, NULL, '2020-05-03 01:14:35', 'admin', '2019-03-12 11:25:16', 'admin');\n\n-- ----------------------------\n-- Table structure for onl_cgreport_item\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_cgreport_item`;\nCREATE TABLE `onl_cgreport_item`  (\n  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `cgrhead_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '报表ID',\n  `field_name` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字段名字',\n  `field_txt` varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字段文本',\n  `field_width` int(3) NULL DEFAULT NULL,\n  `field_type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字段类型',\n  `search_mode` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询模式',\n  `is_order` int(2) NULL DEFAULT 0 COMMENT '是否排序  0否,1是',\n  `is_search` int(2) NULL DEFAULT 0 COMMENT '是否查询  0否,1是',\n  `dict_code` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典CODE',\n  `field_href` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字段跳转URL',\n  `is_show` int(2) NULL DEFAULT 1 COMMENT '是否显示  0否,1显示',\n  `order_num` int(11) NULL DEFAULT NULL COMMENT '排序',\n  `replace_val` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '取值表达式',\n  `is_total` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否合计 0否,1是（仅对数值有效）',\n  `group_title` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '分组标题',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_oci_cgrhead_id`(`cgrhead_id`) USING BTREE,\n  INDEX `idx_oci_is_show`(`is_show`) USING BTREE,\n  INDEX `idx_oci_order_num`(`order_num`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_cgreport_item\n-- ----------------------------\nINSERT INTO `onl_cgreport_item` VALUES ('1256627802020622337', '1256627801873821698', 'date', '日期', NULL, 'String', NULL, 0, 0, '', '', 1, 0, '', NULL, NULL, 'admin', '2020-09-11 14:50:45', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1256627802075148289', '1256627801873821698', 'num', '登录次数', NULL, 'String', NULL, 0, 0, '', '', 1, 1, '', '1', NULL, 'admin', '2020-09-11 14:50:45', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1260179881129496577', '1260179852088135681', 'id', 'ID', NULL, 'String', NULL, 0, 0, '', '', 0, 0, '', NULL, NULL, 'admin', '2020-09-11 14:07:38', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1260179881129496578', '1260179852088135681', 'username', '账号', NULL, 'String', NULL, 0, 0, '', '', 1, 1, '', NULL, '用户信息', 'admin', '2020-09-11 14:07:38', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1260179881129496579', '1260179852088135681', 'realname', '用户名字', NULL, 'String', NULL, 0, 0, '', '', 1, 2, '', NULL, '用户信息', 'admin', '2020-09-11 14:07:38', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1260179881129496584', '1260179852088135681', 'sex', '性别', NULL, 'String', NULL, 0, 1, 'sex', '', 1, 3, '', NULL, '用户信息', 'admin', '2020-09-11 14:07:38', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1260179881129496585', '1260179852088135681', 'email', '邮箱', NULL, 'String', 'single', 0, 1, '', '', 1, 4, '', NULL, NULL, 'admin', '2020-09-11 14:07:38', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1260179881129496586', '1260179852088135681', 'phone', '电话', NULL, 'String', NULL, 0, 0, '', '', 1, 5, '', NULL, NULL, 'admin', '2020-09-11 14:07:38', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('15884396588465896672', '87b55a515d3441b6b98e48e5b35474a6', 'id', 'ID', NULL, 'String', NULL, 0, 0, '', '', 0, 1, '', NULL, NULL, 'admin', '2020-05-03 01:14:35', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('15892858611256977947', '1260179852088135681', 'birthday', '生日', NULL, 'Date', NULL, 0, 0, '', '', 1, 6, '', NULL, NULL, 'admin', '2020-09-11 14:07:38', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1590154651872505857', '1590154651759259649', 'id', 'id', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 0, NULL, NULL, NULL, 'admin', '2022-11-09 09:29:47', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1590154651876700162', '1590154651759259649', 'name', 'name', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 1, NULL, NULL, NULL, 'admin', '2022-11-09 09:29:47', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1590154651876700163', '1590154651759259649', 'key_word', 'key_word', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 2, NULL, NULL, NULL, 'admin', '2022-11-09 09:29:47', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1590154651876700164', '1590154651759259649', 'punch_time', 'punch_time', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 3, NULL, NULL, NULL, 'admin', '2022-11-09 09:29:47', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1590154651876700165', '1590154651759259649', 'salary_money', 'salary_money', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 4, NULL, NULL, NULL, 'admin', '2022-11-09 09:29:47', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1590154651876700166', '1590154651759259649', 'bonus_money', 'bonus_money', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 5, NULL, NULL, NULL, 'admin', '2022-11-09 09:29:47', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1590154651876700167', '1590154651759259649', 'sex', 'sex', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 6, NULL, NULL, NULL, 'admin', '2022-11-09 09:29:47', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1590154651885088769', '1590154651759259649', 'age', 'age', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 7, NULL, NULL, NULL, 'admin', '2022-11-09 09:29:47', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1590154651885088770', '1590154651759259649', 'birthday', 'birthday', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 8, NULL, NULL, NULL, 'admin', '2022-11-09 09:29:47', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1590154651885088771', '1590154651759259649', 'email', 'email', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 9, NULL, NULL, NULL, 'admin', '2022-11-09 09:29:47', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1590154651885088772', '1590154651759259649', 'content', 'content', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 10, NULL, NULL, NULL, 'admin', '2022-11-09 09:29:47', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1590154651885088773', '1590154651759259649', 'create_by', 'create_by', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 11, NULL, NULL, NULL, 'admin', '2022-11-09 09:29:47', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1590154651885088774', '1590154651759259649', 'create_time', 'create_time', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 12, NULL, NULL, NULL, 'admin', '2022-11-09 09:29:47', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1590154651885088775', '1590154651759259649', 'update_by', 'update_by', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 13, NULL, NULL, NULL, 'admin', '2022-11-09 09:29:47', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1590154651885088776', '1590154651759259649', 'update_time', 'update_time', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 14, NULL, NULL, NULL, 'admin', '2022-11-09 09:29:47', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1590154651893477378', '1590154651759259649', 'sys_org_code', 'sys_org_code', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 15, NULL, NULL, NULL, 'admin', '2022-11-09 09:29:47', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1590154651893477379', '1590154651759259649', 'tenant_id', 'tenant_id', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 16, NULL, NULL, NULL, 'admin', '2022-11-09 09:29:47', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1705487386643472386', '1705487386450534402', 'id', 'id', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 0, NULL, NULL, NULL, 'admin', '2023-09-23 15:40:54', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1705487386710581250', '1705487386450534402', 'log_type', 'log_type', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 1, NULL, NULL, NULL, 'admin', '2023-09-23 15:40:54', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1705487386710581251', '1705487386450534402', 'log_content', 'log_content', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 2, NULL, NULL, NULL, 'admin', '2023-09-23 15:40:54', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1705487386710581252', '1705487386450534402', 'operate_type', 'operate_type', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 3, NULL, NULL, NULL, 'admin', '2023-09-23 15:40:54', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1705487386710581253', '1705487386450534402', 'userid', 'userid', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 4, NULL, NULL, NULL, 'admin', '2023-09-23 15:40:54', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1705487386710581254', '1705487386450534402', 'username', 'username', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 5, NULL, NULL, NULL, 'admin', '2023-09-23 15:40:54', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1705487386710581255', '1705487386450534402', 'ip', 'ip', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 6, NULL, NULL, NULL, 'admin', '2023-09-23 15:40:54', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1705487386710581256', '1705487386450534402', 'method', 'method', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 7, NULL, NULL, NULL, 'admin', '2023-09-23 15:40:54', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1705487386710581257', '1705487386450534402', 'request_url', 'request_url', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 8, NULL, NULL, NULL, 'admin', '2023-09-23 15:40:54', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1705487386710581258', '1705487386450534402', 'request_param', 'request_param', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 9, NULL, NULL, NULL, 'admin', '2023-09-23 15:40:54', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1705487386710581259', '1705487386450534402', 'request_type', 'request_type', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 10, NULL, NULL, NULL, 'admin', '2023-09-23 15:40:54', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1705487386710581260', '1705487386450534402', 'cost_time', 'cost_time', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 11, NULL, NULL, NULL, 'admin', '2023-09-23 15:40:54', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1705487386710581261', '1705487386450534402', 'create_by', 'create_by', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 12, NULL, NULL, NULL, 'admin', '2023-09-23 15:40:54', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1705487386710581262', '1705487386450534402', 'create_time', 'create_time', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 13, NULL, NULL, NULL, 'admin', '2023-09-23 15:40:54', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1705487386710581263', '1705487386450534402', 'update_by', 'update_by', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 14, NULL, NULL, NULL, 'admin', '2023-09-23 15:40:54', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1705487386710581264', '1705487386450534402', 'update_time', 'update_time', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 15, NULL, NULL, NULL, 'admin', '2023-09-23 15:40:54', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1705487386710581265', '1705487386450534402', 'tenant_id', 'tenant_id', NULL, 'String', NULL, 0, 0, NULL, NULL, 1, 16, NULL, NULL, NULL, 'admin', '2023-09-23 15:40:54', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1740bb02519db90c44cb2cba8b755136', '6c7f59741c814347905a938f06ee003c', 'realname', '用户名称', NULL, 'String', NULL, 0, 0, '', 'https://www.baidu.com', 1, 0, '', NULL, NULL, 'admin', '2020-05-03 02:35:28', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('1b181e6d2813bcb263adc39737f9df46', '87b55a515d3441b6b98e48e5b35474a6', 'name', '用户名', NULL, 'String', 'single', 0, 1, '', '', 1, 2, '', NULL, NULL, 'admin', '2020-05-03 01:14:35', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('61ef5b323134938fdd07ad5e3ea16cd3', '87b55a515d3441b6b98e48e5b35474a6', 'key_word', '关键词', NULL, 'String', 'single', 0, 1, '', '', 1, 3, '', NULL, NULL, 'admin', '2020-05-03 01:14:35', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('627768efd9ba2c41e905579048f21000', '6c7f59741c814347905a938f06ee003c', 'username', '用户账号', NULL, 'String', 'single', 0, 1, 'SELECT username value,  realname text FROM sys_user', '', 1, 1, '', NULL, NULL, 'admin', '2020-05-03 02:35:28', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('8bb087a9aa2000bcae17a1b3f5768435', '6c7f59741c814347905a938f06ee003c', 'sex', '性别', NULL, 'String', 'single', 0, 1, 'sex', '', 1, 2, '', NULL, NULL, 'admin', '2020-05-03 02:35:28', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('90d4fa57d301801abb26a9b86b6b94c4', '6c7f59741c814347905a938f06ee003c', 'birthday', '生日', NULL, 'Date', 'single', 0, 0, '', '', 1, 3, '', NULL, NULL, 'admin', '2020-05-03 02:35:28', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('a4ac355f07a05218854e5f23e2930163', '6c7f59741c814347905a938f06ee003c', 'avatar', '头像', NULL, 'String', NULL, 0, 0, '', '', 0, 4, '', NULL, NULL, 'admin', '2020-05-03 02:35:28', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('d6e86b5ffd096ddcc445c0f320a45004', '6c7f59741c814347905a938f06ee003c', 'phone', '手机号', NULL, 'String', NULL, 0, 0, '', '', 1, 5, '', NULL, NULL, 'admin', '2020-05-03 02:35:28', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('df365cd357699eea96c29763d1dd7f9d', '6c7f59741c814347905a938f06ee003c', 'email', '邮箱', NULL, 'String', NULL, 0, 0, '', '', 1, 6, '', NULL, NULL, 'admin', '2020-05-03 02:35:28', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('edf9932912b81ad01dd557d3d593a559', '87b55a515d3441b6b98e48e5b35474a6', 'age', '年龄', NULL, 'String', NULL, 0, 0, '', '', 1, 4, '', NULL, NULL, 'admin', '2020-05-03 01:14:35', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('f985883e509a6faaaf62ca07fd24a73c', '87b55a515d3441b6b98e48e5b35474a6', 'birthday', '生日', NULL, 'Date', 'single', 0, 1, '', '', 1, 5, '', NULL, NULL, 'admin', '2020-05-03 01:14:35', NULL, NULL);\nINSERT INTO `onl_cgreport_item` VALUES ('fce83e4258de3e2f114ab3116397670c', '87b55a515d3441b6b98e48e5b35474a6', 'punch_time', '发布时间', NULL, 'String', NULL, 0, 0, '', '', 1, 6, '', NULL, NULL, 'admin', '2020-05-03 01:14:35', NULL, NULL);\n\n-- ----------------------------\n-- Table structure for onl_cgreport_param\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_cgreport_param`;\nCREATE TABLE `onl_cgreport_param`  (\n  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `cgrhead_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '动态报表ID',\n  `param_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '参数字段',\n  `param_txt` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数文本',\n  `param_value` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数默认值',\n  `order_num` int(11) NULL DEFAULT NULL COMMENT '排序',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_ocp_cgrhead_id`(`cgrhead_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_cgreport_param\n-- ----------------------------\nINSERT INTO `onl_cgreport_param` VALUES ('1590154651838951425', '1590154651759259649', 'sex', 'sex', '2', 0, 'admin', '2022-11-09 09:29:47', NULL, NULL);\n\n-- ----------------------------\n-- Table structure for onl_drag_comp\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_drag_comp`;\nCREATE TABLE `onl_drag_comp`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',\n  `parent_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n  `comp_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件名称',\n  `comp_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n  `icon` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图标',\n  `order_num` int(11) NULL DEFAULT NULL COMMENT '排序',\n  `type_id` int(11) NULL DEFAULT NULL COMMENT '组件类型',\n  `comp_config` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '组件配置',\n  `status` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '状态0:无效 1:有效',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '组件库' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_drag_comp\n-- ----------------------------\nINSERT INTO `onl_drag_comp` VALUES ('100', '0', '常用', '', 'ant-design:setting-twotone', 2, NULL, NULL, '0', NULL, NULL, 'jeecg', '2022-04-24 11:02:19');\nINSERT INTO `onl_drag_comp` VALUES ('100100', '100', '查询条件', 'JForm', 'ant-design:form-outlined', 1, NULL, '{\\n  \\\"w\\\": 24,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"timeOut\\\": -1,\\n  \\\"option\\\": {}\\n}', '1', NULL, NULL, 'jeecg', '2022-04-29 18:55:15');\nINSERT INTO `onl_drag_comp` VALUES ('100102', '0', '数据', 'dataList', 'ant-design:table-outlined', 3, NULL, NULL, '0', NULL, NULL, 'admin', '2022-04-29 09:49:48');\nINSERT INTO `onl_drag_comp` VALUES ('100102100', '100102', '动态表格', 'JTable', 'bi:table', 12, NULL, '{\\n  \\\"w\\\": 24,\\n  \\\"h\\\": 42,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/42/tableData\\\",\\n  \\\"tableList\\\": \\\"http://api.jeecg.com/mock/42/tableList\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"chartData\\\": [\\n    {\\n      \\\"fieldTxt\\\": \\\"姓名\\\",\\n      \\\"fieldName\\\": \\\"name\\\",\\n      \\\"type\\\": \\\"field\\\",\\n      \\\"isShow\\\": \\\"Y\\\",\\n      \\\"isTotal\\\": \\\"N\\\"\\n    },\\n    {\\n      \\\"fieldTxt\\\": \\\"年龄\\\",\\n      \\\"fieldName\\\": \\\"age\\\",\\n      \\\"type\\\": \\\"field\\\",\\n      \\\"isShow\\\": \\\"Y\\\",\\n      \\\"isTotal\\\": \\\"Y\\\"\\n    },\\n    {\\n      \\\"fieldTxt\\\": \\\"性别\\\",\\n      \\\"fieldName\\\": \\\"sex\\\",\\n      \\\"type\\\": \\\"field\\\",\\n      \\\"isShow\\\": \\\"Y\\\",\\n      \\\"isTotal\\\": \\\"N\\\"\\n    },\\n    {\\n      \\\"fieldTxt\\\": \\\"住址\\\",\\n      \\\"fieldName\\\": \\\"address\\\",\\n      \\\"type\\\": \\\"field\\\",\\n      \\\"isShow\\\": \\\"Y\\\",\\n      \\\"isTotal\\\": \\\"N\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"新增\\\",\\n      \\\"show\\\": 1,\\n      \\\"position\\\": \\\"top\\\",\\n      \\\"type\\\": \\\"button\\\",\\n      \\\"key\\\": \\\"add\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"编辑\\\",\\n      \\\"show\\\": 1,\\n      \\\"position\\\": \\\"row\\\",\\n      \\\"type\\\": \\\"button\\\",\\n      \\\"key\\\": \\\"edit\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"导出\\\",\\n      \\\"show\\\": 1,\\n      \\\"position\\\": \\\"top\\\",\\n      \\\"type\\\": \\\"button\\\",\\n      \\\"key\\\": \\\"export\\\"\\n    }\\n  ]\\n}', '0', NULL, NULL, NULL, '2022-04-28 15:37:26');\nINSERT INTO `onl_drag_comp` VALUES ('100103', '100104', '快捷导航', 'JQuickNav', 'ion:navigate', 6, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 26,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/42/nav\\\",\\n  \\\"timeOut\\\": -1,\\n  \\\"linkageConfig\\\": [],\\r\\n\t\\\"dataMapping\\\": [\\r\\n    {\\r\\n      \\\"filed\\\": \\\"标题\\\",\\r\\n      \\\"mapping\\\": \\\"\\\"\\r\\n    },\\r\\n    {\\r\\n      \\\"filed\\\": \\\"图标\\\",\\r\\n      \\\"mapping\\\": \\\"\\\"\\r\\n    },\\r\\n    {\\r\\n      \\\"filed\\\": \\\"颜色\\\",\\r\\n      \\\"mapping\\\": \\\"\\\"\\r\\n    },\\r\\n    {\\r\\n      \\\"filed\\\": \\\"跳转\\\",\\r\\n      \\\"mapping\\\": \\\"\\\"\\r\\n    }\\r\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"title\\\": \\\"首页\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-homepage\\\",\\n      \\\"color\\\": \\\"#1fdaca\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"仪表盘\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-shijian\\\",\\n      \\\"color\\\": \\\"#bf0c2c\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"组件\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-dangan\\\",\\n      \\\"color\\\": \\\"#e18525\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"系统管理\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-shezhi\\\",\\n      \\\"color\\\": \\\"#3fb27f\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"权限管理\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-yuechi\\\",\\n      \\\"color\\\": \\\"#4daf1bc9\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"图表\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-fujin\\\",\\n      \\\"color\\\": \\\"#00d8ff\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"icon\\\": {\\n      \\\"scriptUrl\\\": \\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\n      \\\"fontSize\\\": 30\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"快捷导航\\\",\\n      \\\"extra\\\": \\\"更多\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"body\\\": {\\n      \\\"column\\\": 3,\\n      \\\"textAlign\\\": \\\"center\\\",\\n      \\\"iconAlign\\\": \\\"top\\\"\\n    }\\n  }\\n}', '1', NULL, NULL, 'admin', '2022-04-29 19:50:38');\nINSERT INTO `onl_drag_comp` VALUES ('100104', '0', '首页', 'home', 'carbon:home', 9, NULL, NULL, '0', NULL, NULL, 'admin', '2022-04-29 09:50:07');\nINSERT INTO `onl_drag_comp` VALUES ('100104100', '100104', '统计卡片', 'JGrowCard', 'mdi:card-bulleted-outline', 7, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 19,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/42/nav\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"标题\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"图标\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"总计\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"前缀\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"颜色\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"单位\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"title\\\": \\\"访问数\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-qianbao\\\",\\n      \\\"value\\\": 2000,\\n      \\\"total\\\": 120000,\\n      \\\"prefix\\\": \\\"$\\\",\\n      \\\"color\\\": \\\"green\\\",\\n      \\\"action\\\": \\\"月\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"成交额\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-youhuiquan\\\",\\n      \\\"value\\\": 20000,\\n      \\\"total\\\": 500000,\\n      \\\"prefix\\\": \\\"$\\\",\\n      \\\"color\\\": \\\"blue\\\",\\n      \\\"action\\\": \\\"月\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"下载数\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-tupian\\\",\\n      \\\"value\\\": 8000,\\n      \\\"prefix\\\": \\\"$\\\",\\n      \\\"total\\\": 120000,\\n      \\\"color\\\": \\\"orange\\\",\\n      \\\"action\\\": \\\"周\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"成交数\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-jifen\\\",\\n      \\\"value\\\": 5000,\\n      \\\"prefix\\\": \\\"$\\\",\\n      \\\"total\\\": 50000,\\n      \\\"color\\\": \\\"purple\\\",\\n      \\\"action\\\": \\\"年\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"icon\\\": {\\n      \\\"scriptUrl\\\": \\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\n      \\\"fontSize\\\": 20\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"统计卡片\\\",\\n      \\\"extra\\\": \\\"更多\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"body\\\": {\\n      \\\"horizontal\\\": 8,\\n      \\\"vertical\\\": 8,\\n      \\\"span\\\": 6\\n    }\\n  }\\n}', '1', NULL, NULL, 'admin', '2022-05-07 18:24:23');\nINSERT INTO `onl_drag_comp` VALUES ('100104108', '100104', '简洁卡片', 'JSimpleCard', 'mdi:card-bulleted-outline', 8, NULL, '{\\n  \\\"w\\\": 24,\\n  \\\"h\\\": 14,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/42/nav\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"标题\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"图标\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"后缀\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"颜色\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"title\\\": \\\"访问数\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-qianbao\\\",\\n      \\\"value\\\": 2000,\\n      \\\"color\\\": \\\"green\\\",\\n      \\\"suffix\\\": \\\"月\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"成交额\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-youhuiquan\\\",\\n      \\\"value\\\": 20000,\\n      \\\"color\\\": \\\"blue\\\",\\n      \\\"suffix\\\": \\\"月\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"下载数\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-tupian\\\",\\n      \\\"value\\\": 8000,\\n      \\\"color\\\": \\\"orange\\\",\\n      \\\"suffix\\\": \\\"周\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"成交数\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-jifen\\\",\\n      \\\"value\\\": 5000,\\n      \\\"color\\\": \\\"purple\\\",\\n      \\\"suffix\\\": \\\"年\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"icon\\\": {\\n      \\\"fontSize\\\": 50\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"卡片\\\",\\n      \\\"extra\\\": \\\"更多\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"body\\\": {\\n      \\\"horizontal\\\": 8,\\n      \\\"vertical\\\": 8,\\n      \\\"span\\\": 6\\n    }\\n  }\\n}', '1', NULL, NULL, 'admin', '2022-05-07 18:24:23');\nINSERT INTO `onl_drag_comp` VALUES ('100105', '100104', '项目列表', 'JProjectCard', 'ant-design:unordered-list-outlined', 8, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 33,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/42/nav\\\",\\n  \\\"timeOut\\\": -1,\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"标题\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"图标\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"分组\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"描述\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"时间\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"颜色\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"title\\\": \\\"Github\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-social-github\\\",\\n      \\\"color\\\": \\\"\\\",\\n      \\\"desc\\\": \\\"不要等待机会，而要创造机会。\\\",\\n      \\\"group\\\": \\\"开源组\\\",\\n      \\\"date\\\": \\\"2021-04-01\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"Vue\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-social-buysellads\\\",\\n      \\\"color\\\": \\\"#3fb27f\\\",\\n      \\\"desc\\\": \\\"现在的你决定将来的你。\\\",\\n      \\\"group\\\": \\\"算法组\\\",\\n      \\\"date\\\": \\\"2021-04-01\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"Html5\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-html5\\\",\\n      \\\"color\\\": \\\"#e18525\\\",\\n      \\\"desc\\\": \\\"没有什么才能比努力更重要。\\\",\\n      \\\"group\\\": \\\"上班摸鱼\\\",\\n      \\\"date\\\": \\\"2021-04-01\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"Angular\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-social-product-hunt\\\",\\n      \\\"color\\\": \\\"#bf0c2c\\\",\\n      \\\"desc\\\": \\\"热情和欲望可以突破一切难关。\\\",\\n      \\\"group\\\": \\\"UI\\\",\\n      \\\"date\\\": \\\"2021-04-01\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"React\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-social-skype\\\",\\n      \\\"color\\\": \\\"#00d8ff\\\",\\n      \\\"desc\\\": \\\"健康的身体是实目标的基石。\\\",\\n      \\\"group\\\": \\\"技术牛\\\",\\n      \\\"date\\\": \\\"2021-04-01\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"Js\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-social-pengyou\\\",\\n      \\\"color\\\": \\\"#4daf1bc9\\\",\\n      \\\"desc\\\": \\\"路是走出来的，而不是空想出来的。\\\",\\n      \\\"group\\\": \\\"架构组\\\",\\n      \\\"date\\\": \\\"2021-04-01\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"icon\\\": {\\n      \\\"scriptUrl\\\": \\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\n      \\\"fontSize\\\": 30\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"项目列表\\\",\\n      \\\"extra\\\": \\\"更多\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"body\\\": {\\n      \\\"column\\\": 3\\n    }\\n  }\\n}', '1', NULL, NULL, 'admin', '2022-04-29 19:52:42');\nINSERT INTO `onl_drag_comp` VALUES ('100106', '100104', '待办事项', 'JWaitMatter', 'ant-design:ordered-list-outlined', 9, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 19,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/42/nav\\\",\\n  \\\"timeOut\\\": -1,\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"标题\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"图标\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"描述\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"时间\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"title\\\": \\\"待办公文\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-yudu\\\",\\n      \\\"content\\\": 23,\\n      \\\"desc\\\": \\\"今日已办 3\\\",\\n      \\\"date\\\": \\\"2021-04-01\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"待办流程\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-shuju\\\",\\n      \\\"content\\\": 23,\\n      \\\"desc\\\": \\\"今日已办 3\\\",\\n      \\\"date\\\": \\\"2021-04-01\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"待办任务\\\",\\n      \\\"icon\\\": \\\"icon-jeecg-tongzhi\\\",\\n      \\\"content\\\": 23,\\n      \\\"desc\\\": \\\"今日已办 3 今日更新 5\\\",\\n      \\\"date\\\": \\\"2021-04-01\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"icon\\\": {\\n      \\\"scriptUrl\\\": \\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\n      \\\"fontSize\\\": 25\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"待办事项\\\",\\n      \\\"extra\\\": \\\"更多\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"body\\\": {\\n      \\\"column\\\": 3\\n    }\\n  }\\n}', '1', NULL, NULL, 'admin', '2022-04-29 19:52:49');\nINSERT INTO `onl_drag_comp` VALUES ('100108', '100', 'Iframe', 'JIframe', 'ic:outline-web-asset', 11, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 26,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/42/nav\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"linkageConfig\\\": [],\\n  \\\"chartData\\\": \\\"http://www.jeecg.com\\\",\\n  \\\"option\\\": {\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"body\\\": {\\n      \\\"url\\\": \\\"https://help.jeecg.com\\\"\\n    }\\n  }\\n}', '1', NULL, NULL, 'admin', '2022-05-07 11:02:00');\nINSERT INTO `onl_drag_comp` VALUES ('100109', '100', '图片', 'JImg', 'ion:image-sharp', 13, NULL, '{\\r\\n    \\\"w\\\": 12,\\r\\n    \\\"h\\\": 26,\\r\\n    \\\"dataType\\\": 1,\\r\\n    \\\"url\\\": \\\"http://api.jeecg.com/mock/42/nav\\\",\\r\\n    \\\"timeOut\\\": -1,\\r\\n    \\\"option\\\": {\\r\\n        \\\"card\\\": {\\r\\n            \\\"title\\\": \\\"\\\",\\r\\n            \\\"extra\\\": \\\"\\\",\\r\\n            \\\"rightHref\\\": \\\"\\\",\\r\\n            \\\"size\\\": \\\"default\\\"\\r\\n        },\\r\\n        \\\"body\\\": {\\r\\n            \\\"url\\\": \\\"https://static.jeecg.com/upload/test/df_1616583016208.png\\\"\\r\\n        }\\r\\n    }\\r\\n}', '1', NULL, NULL, 'admin', '2022-04-29 10:41:39');\nINSERT INTO `onl_drag_comp` VALUES ('100110', '100', '文本', 'JText', 'ant-design:font-colors-outlined', 14, NULL, '{\\r\\n  \\\"w\\\": 12,\\r\\n  \\\"h\\\": 30,\\r\\n  \\\"dataType\\\": 1,\\r\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/42/nav\\\",\\r\\n  \\\"timeOut\\\": 0,\\r\\n\t\\\"background\\\": \\\"#4A90E2\\\",\\r\\n\t\\\"linkageConfig\\\": [],\\r\\n\t\\\"dataMapping\\\": [\\r\\n    {\\r\\n      \\\"filed\\\": \\\"数值\\\",\\r\\n      \\\"mapping\\\": \\\"\\\"\\r\\n    }\\r\\n  ],\\r\\n  \\\"turnConfig\\\": {\\r\\n    \\\"url\\\": \\\"\\\"\\r\\n  },\\r\\n  \\\"chartData\\\": \\\"文本内容\\\",\\r\\n  \\\"option\\\": {\\r\\n    \\\"card\\\": {\\r\\n      \\\"title\\\": \\\"\\\",\\r\\n      \\\"extra\\\": \\\"\\\",\\r\\n      \\\"rightHref\\\": \\\"\\\",\\r\\n      \\\"size\\\": \\\"default\\\"\\r\\n    },\\r\\n    \\\"body\\\": {\\r\\n      \\\"text\\\": \\\"\\\",\\r\\n      \\\"color\\\": \\\"#FFFFFF\\\",\\r\\n      \\\"fontWeight\\\": \\\"bold\\\",\\r\\n      \\\"marginLeft\\\": 0,\\r\\n      \\\"marginTop\\\": 0\\r\\n    }\\r\\n  }\\r\\n}', '1', NULL, NULL, 'admin', '2022-04-29 10:49:04');\nINSERT INTO `onl_drag_comp` VALUES ('100112', '100102', '数据表格', 'JCommonTable', 'ant-design:table-outlined', 2, NULL, '{\\n  \\\"w\\\": 24,\\n  \\\"h\\\": 42,\\n  \\\"dataType\\\": 1,\\n  \\\"timeOut\\\": -1,\\n  \\\"linkageConfig\\\": [],\\n  \\\"option\\\": {},\\n  \\\"chartData\\\": [\\n    {\\n      \\\"name\\\": \\\"4月\\\",\\n      \\\"value\\\": 50\\n    },\\n    {\\n      \\\"name\\\": \\\"2月\\\",\\n      \\\"value\\\": 200\\n    },\\n    {\\n      \\\"name\\\": \\\"3月\\\",\\n      \\\"value\\\": 300\\n    },\\n    {\\n      \\\"name\\\": \\\"4月\\\",\\n      \\\"value\\\": 400\\n    },\\n    {\\n      \\\"name\\\": \\\"5月\\\",\\n      \\\"value\\\": 50\\n    },\\n    {\\n      \\\"name\\\": \\\"6月\\\",\\n      \\\"value\\\": 120\\n    }\\n  ]\\n}', '1', NULL, NULL, NULL, '2022-04-22 18:58:17');\nINSERT INTO `onl_drag_comp` VALUES ('100120107', '100120', '区域地图', 'JAreaMap', 'ic:outline-scatter-plot', 1, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 30,\\n  \\\"activeKey\\\": 1,\\n  \\\"dataType\\\": 1,\\n  \\\"background\\\": \\\"#ffffff\\\",\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/radar\\\",\\n  \\\"timeOut\\\": 0,\\n       \\\"dataMapping\\\": [{\\n        \\\"filed\\\": \\\"区域\\\",\\n        \\\"mapping\\\": \\\"\\\"\\n    }, {\\n        \\\"filed\\\": \\\"数值\\\",\\n        \\\"mapping\\\": \\\"\\\"\\n    }],\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"jsConfig\\\": \\\"\\\",\\n  \\\"chartData\\\": [\\n    {\\n      \\\"name\\\": \\\"北京\\\",\\n      \\\"value\\\": 199\\n    },\\n    {\\n      \\\"name\\\": \\\"天津\\\",\\n      \\\"value\\\": 42\\n    },\\n    {\\n      \\\"name\\\": \\\"河北\\\",\\n      \\\"value\\\": 102\\n    },\\n    {\\n      \\\"name\\\": \\\"山西\\\",\\n      \\\"value\\\": 81\\n    },\\n    {\\n      \\\"name\\\": \\\"内蒙古\\\",\\n      \\\"value\\\": 47\\n    },\\n    {\\n      \\\"name\\\": \\\"辽宁\\\",\\n      \\\"value\\\": 67\\n    },\\n    {\\n      \\\"name\\\": \\\"吉林\\\",\\n      \\\"value\\\": 82\\n    },\\n    {\\n      \\\"name\\\": \\\"黑龙江\\\",\\n      \\\"value\\\": 123\\n    },\\n    {\\n      \\\"name\\\": \\\"上海\\\",\\n      \\\"value\\\": 24\\n    },\\n    {\\n      \\\"name\\\": \\\"江苏\\\",\\n      \\\"value\\\": 92\\n    },\\n    {\\n      \\\"name\\\": \\\"浙江\\\",\\n      \\\"value\\\": 114\\n    },\\n    {\\n      \\\"name\\\": \\\"安徽\\\",\\n      \\\"value\\\": 109\\n    },\\n    {\\n      \\\"name\\\": \\\"福建\\\",\\n      \\\"value\\\": 116\\n    },\\n    {\\n      \\\"name\\\": \\\"江西\\\",\\n      \\\"value\\\": 91\\n    },\\n    {\\n      \\\"name\\\": \\\"山东\\\",\\n      \\\"value\\\": 119\\n    },\\n    {\\n      \\\"name\\\": \\\"河南\\\",\\n      \\\"value\\\": 137\\n    },\\n    {\\n      \\\"name\\\": \\\"湖北\\\",\\n      \\\"value\\\": 116\\n    },\\n    {\\n      \\\"name\\\": \\\"湖南\\\",\\n      \\\"value\\\": 114\\n    },\\n    {\\n      \\\"name\\\": \\\"重庆\\\",\\n      \\\"value\\\": 91\\n    },\\n    {\\n      \\\"name\\\": \\\"四川\\\",\\n      \\\"value\\\": 125\\n    },\\n    {\\n      \\\"name\\\": \\\"贵州\\\",\\n      \\\"value\\\": 62\\n    },\\n    {\\n      \\\"name\\\": \\\"云南\\\",\\n      \\\"value\\\": 83\\n    },\\n    {\\n      \\\"name\\\": \\\"西藏\\\",\\n      \\\"value\\\": 9\\n    },\\n    {\\n      \\\"name\\\": \\\"陕西\\\",\\n      \\\"value\\\": 80\\n    },\\n    {\\n      \\\"name\\\": \\\"甘肃\\\",\\n      \\\"value\\\": 56\\n    },\\n    {\\n      \\\"name\\\": \\\"青海\\\",\\n      \\\"value\\\": 10\\n    },\\n    {\\n      \\\"name\\\": \\\"宁夏\\\",\\n      \\\"value\\\": 18\\n    },\\n    {\\n      \\\"name\\\": \\\"新疆\\\",\\n      \\\"value\\\": 180\\n    },\\n    {\\n      \\\"name\\\": \\\"广东\\\",\\n      \\\"value\\\": 123\\n    },\\n    {\\n      \\\"name\\\": \\\"广西\\\",\\n      \\\"value\\\": 59\\n    },\\n    {\\n      \\\"name\\\": \\\"海南\\\",\\n      \\\"value\\\": 14\\n    }\\n  ],\\n  \\\"commonOption\\\": {\\n    \\\"barSize\\\": 10,\\n    \\\"barColor\\\": \\\"#fff176\\\",\\n    \\\"barColor2\\\": \\\"#fcc02e\\\",\\n    \\\"gradientColor\\\": false,\\n    \\\"areaColor\\\": {\\n      \\\"color1\\\": \\\"#f7f7f7\\\",\\n      \\\"color2\\\": \\\"#fcc02e\\\"\\n    },\\n    \\\"inRange\\\": {\\n      \\\"color\\\": [\\n        \\\"#04387b\\\",\\n        \\\"#467bc0\\\"\\n      ]\\n    },\\n    \\\"breadcrumb\\\": {\\n      \\\"drillDown\\\": false,\\n      \\\"textColor\\\": \\\"#000000\\\"\\n    }\\n  },\\n  \\\"option\\\": {\\n    \\\"drillDown\\\": false,\\n    \\\"area\\\": {\\n      \\\"markerCount\\\": 5,\\n      \\\"shadowBlur\\\": 10,\\n      \\\"markerOpacity\\\": 1,\\n      \\\"markerColor\\\": \\\"#DDE330\\\",\\n      \\\"shadowColor\\\": \\\"#DDE330\\\",\\n      \\\"scatterLabelShow\\\": false,\\n      \\\"markerType\\\": \\\"effectScatter\\\",\\n      \\\"value\\\": [\\n        \\\"china\\\"\\n      ],\\n      \\\"name\\\": [\\n        \\\"中国\\\"\\n      ]\\n    },\\n    \\\"graphic\\\": [],\\n    \\\"grid\\\": {\\n      \\\"show\\\": false,\\n      \\\"bottom\\\": 115\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"\\\",\\n      \\\"left\\\": 10,\\r\\n\t\t\t\\\"textStyle\\\":{\\r\\n\t\t\t  \\\"fontWeight\\\":\\\"normal\\\"\\r\\n\t\t\t},\\n      \\\"show\\\": true\\n    },\\n    \\\"legend\\\": {\\n      \\\"data\\\": []\\n    },\\n    \\\"visualMap\\\": {\\n      \\\"show\\\": false,\\n      \\\"min\\\": 0,\\n      \\\"type\\\": \\\"continuous\\\",\\n      \\\"max\\\": 200,\\n      \\\"left\\\": \\\"5%\\\",\\n      \\\"top\\\": \\\"bottom\\\",\\n      \\\"calculable\\\": true,\\n      \\\"seriesIndex\\\": [\\n        0\\n      ]\\n    },\\n    \\\"geo\\\": {\\n      \\\"top\\\": 30,\\n      \\\"label\\\": {\\n        \\\"emphasis\\\": {\\n          \\\"show\\\": false,\\n          \\\"color\\\": \\\"#fff\\\"\\n        }\\n      },\\n      \\\"roam\\\": false,\\n      \\\"zoom\\\": 1,\\n      \\\"itemStyle\\\": {\\n        \\\"normal\\\": {\\n          \\\"borderColor\\\": \\\"#a9a9a9\\\",\\n          \\\"borderWidth\\\": 1,\\n          \\\"areaColor\\\": \\\"\\\",\\n          \\\"shadowColor\\\": \\\"#80d9f8\\\",\\n          \\\"shadowOffsetX\\\": 0,\\n          \\\"shadowOffsetY\\\": 0,\\n          \\\"shadowBlur\\\": 0\\n        },\\n        \\\"emphasis\\\": {\\n          \\\"areaColor\\\": \\\"#fff59c\\\",\\n          \\\"borderWidth\\\": 0\\n        }\\n      }\\n    }\\n  }\\n}', '1', NULL, NULL, 'admin', '2022-08-05 10:32:09');\nINSERT INTO `onl_drag_comp` VALUES ('1008616402292736000', '1009728983979950080', '边框1', 'JDragBorder', 'ant-design:border-outer-outlined', 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"1\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"titleWidth\\\": 250,\\n    \\\"mainColor\\\": \\\"#83bff6\\\",\\n    \\\"subColor\\\": \\\"#00CED1\\\",\\n    \\\"backgroundColor\\\": \\\"#ffffff00\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3\\n   }\\n}', '1', 'admin', '2024-10-22 16:08:20', 'admin', '2024-10-22 16:08:36');\nINSERT INTO `onl_drag_comp` VALUES ('1008616402292736002', '1009728983979950080', '边框2', 'JDragBorder', 'ant-design:border-outer-outlined', 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"2\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"titleWidth\\\": 250,\\n    \\\"mainColor\\\": \\\"#83bff6\\\",\\n    \\\"subColor\\\": \\\"#00CED1\\\",\\n    \\\"backgroundColor\\\": \\\"#ffffff00\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3\\n  }\\n}', '1', 'admin', '2024-10-22 16:08:20', 'admin', '2024-10-22 16:08:36');\nINSERT INTO `onl_drag_comp` VALUES ('1008616402292736003', '1009728983979950080', '边框3', 'JDragBorder', 'ant-design:border-outer-outlined', 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"3\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"titleWidth\\\": 250,\\n    \\\"mainColor\\\": \\\"#83bff6\\\",\\n    \\\"subColor\\\": \\\"#00CED1\\\",\\n    \\\"backgroundColor\\\": \\\"#ffffff00\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3\\n  }\\n}', '1', 'admin', '2024-10-22 16:08:20', 'admin', '2024-10-22 16:08:36');\nINSERT INTO `onl_drag_comp` VALUES ('1008616402292736004', '1009728983979950080', '边框4', 'JDragBorder', 'ant-design:border-outer-outlined', 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"4\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"titleWidth\\\": 250,\\n    \\\"mainColor\\\": \\\"#83bff6\\\",\\n    \\\"subColor\\\": \\\"#00CED1\\\",\\n    \\\"backgroundColor\\\": \\\"#ffffff00\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3\\n   }\\n}', '1', 'admin', '2024-10-22 16:08:20', 'admin', '2024-10-22 16:08:36');\nINSERT INTO `onl_drag_comp` VALUES ('1008616402292736005', '1009728983979950080', '边框5', 'JDragBorder', 'ant-design:border-outer-outlined', 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"5\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"titleWidth\\\": 250,\\n    \\\"mainColor\\\": \\\"#83bff6\\\",\\n    \\\"subColor\\\": \\\"#00CED1\\\",\\n    \\\"backgroundColor\\\": \\\"#ffffff00\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3\\n   }\\n}', '1', 'admin', '2024-10-22 16:08:20', 'admin', '2024-10-22 16:08:36');\nINSERT INTO `onl_drag_comp` VALUES ('1008616402292736006', '1009728983979950080', '边框6', 'JDragBorder', 'ant-design:border-outer-outlined', 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"6\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"titleWidth\\\": 250,\\n    \\\"mainColor\\\": \\\"#83bff6\\\",\\n    \\\"subColor\\\": \\\"#00CED1\\\",\\n    \\\"backgroundColor\\\": \\\"#ffffff00\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3\\n   }\\n}', '1', 'admin', '2024-10-22 16:08:20', 'admin', '2024-10-22 16:08:36');\nINSERT INTO `onl_drag_comp` VALUES ('1008616402292736007', '1009728983979950080', '边框7', 'JDragBorder', 'ant-design:border-outer-outlined', 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"7\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"titleWidth\\\": 250,\\n    \\\"mainColor\\\": \\\"#83bff6\\\",\\n    \\\"subColor\\\": \\\"#00CED1\\\",\\n    \\\"backgroundColor\\\": \\\"#ffffff00\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3\\n   }\\n}', '1', 'admin', '2024-10-22 16:08:20', 'admin', '2024-10-22 16:08:36');\nINSERT INTO `onl_drag_comp` VALUES ('1008616402292736008', '1009728983979950080', '边框8', 'JDragBorder', 'ant-design:border-outer-outlined', 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"8\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"titleWidth\\\": 250,\\n    \\\"mainColor\\\": \\\"#83bff6\\\",\\n    \\\"subColor\\\": \\\"#00CED1\\\",\\n    \\\"backgroundColor\\\": \\\"#ffffff00\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3\\n   }\\n}', '1', 'admin', '2024-10-22 16:08:20', 'admin', '2024-10-22 16:08:36');\nINSERT INTO `onl_drag_comp` VALUES ('1008616402292736009', '1009728983979950080', '边框9', 'JDragBorder', 'ant-design:border-outer-outlined', 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"9\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"titleWidth\\\": 250,\\n    \\\"mainColor\\\": \\\"#83bff6\\\",\\n    \\\"subColor\\\": \\\"#00CED1\\\",\\n    \\\"backgroundColor\\\": \\\"#ffffff00\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3\\n   }\\n}', '1', 'admin', '2024-10-22 16:08:20', 'admin', '2024-10-22 16:08:36');\nINSERT INTO `onl_drag_comp` VALUES ('1008616402292736010', '1009728983979950080', '边框10', 'JDragBorder', 'ant-design:border-outer-outlined', 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"10\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"titleWidth\\\": 250,\\n    \\\"mainColor\\\": \\\"#83bff6\\\",\\n    \\\"subColor\\\": \\\"#00CED1\\\",\\n    \\\"backgroundColor\\\": \\\"#ffffff00\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3\\n   }\\n}', '1', 'admin', '2024-10-22 16:08:20', 'admin', '2024-10-22 16:08:36');\nINSERT INTO `onl_drag_comp` VALUES ('1008616402292736011', '1009728983979950080', '边框11', 'JDragBorder', 'ant-design:border-outer-outlined', 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"11\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"titleWidth\\\": 250,\\n    \\\"mainColor\\\": \\\"#83bff6\\\",\\n    \\\"subColor\\\": \\\"#00CED1\\\",\\n    \\\"backgroundColor\\\": \\\"#ffffff00\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3\\n   }\\n}', '1', 'admin', '2024-10-22 16:08:20', 'admin', '2024-10-22 16:08:36');\nINSERT INTO `onl_drag_comp` VALUES ('1008616402292736012', '1009728983979950080', '边框12', 'JDragBorder', 'ant-design:border-outer-outlined', 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"12\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"titleWidth\\\": 250,\\n    \\\"mainColor\\\": \\\"#83bff6\\\",\\n    \\\"subColor\\\": \\\"#00CED1\\\",\\n    \\\"backgroundColor\\\": \\\"#ffffff00\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3\\n   }\\n}', '1', 'admin', '2024-10-22 16:08:20', 'admin', '2024-10-22 16:08:36');\nINSERT INTO `onl_drag_comp` VALUES ('1008616402292736013', '1009728983979950080', '边框13', 'JDragBorder', 'ant-design:border-outer-outlined', 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"13\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"titleWidth\\\": 250,\\n    \\\"mainColor\\\": \\\"#83bff6\\\",\\n    \\\"subColor\\\": \\\"#00CED1\\\",\\n    \\\"backgroundColor\\\": \\\"#ffffff00\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3\\n   }\\n}', '1', 'admin', '2024-10-22 16:08:20', 'admin', '2024-10-22 16:08:36');\nINSERT INTO `onl_drag_comp` VALUES ('1008622512340893610', '1009729002476830720', '装饰10', 'JDragDecoration', 'ant-design:format-painter-filled', 10, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"10\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"mainColor\\\": \\\"#00CED1\\\",\\n    \\\"subColor\\\": \\\"#FAD400\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3,\\n    \\\"fontSize\\\": 15\\n  }\\n}', '1', 'admin', '2024-10-22 16:32:36', 'admin', '2024-10-22 16:32:48');\nINSERT INTO `onl_drag_comp` VALUES ('1008622512340893611', '1009729002476830720', '装饰11', 'JDragDecoration', 'ant-design:format-painter-filled', 11, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"11\\\",\\n    \\\"title\\\": \\\"装饰\\\",\\n    \\\"mainColor\\\": \\\"#00CED1\\\",\\n    \\\"subColor\\\": \\\"#FAD400\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3,\\n    \\\"fontSize\\\": 15\\n  }\\n}', '1', 'admin', '2024-10-22 16:32:36', 'admin', '2024-10-22 16:32:48');\nINSERT INTO `onl_drag_comp` VALUES ('1008622512340893612', '1009729002476830720', '装饰12', 'JDragDecoration', 'ant-design:format-painter-filled', 12, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"12\\\",\\n    \\\"title\\\": \\\"装饰\\\",\\n    \\\"mainColor\\\": \\\"#00CED1\\\",\\n    \\\"subColor\\\": \\\"#FAD400\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3,\\n    \\\"fontSize\\\": 15\\n  }\\n}', '1', 'admin', '2024-10-22 16:32:36', 'admin', '2024-10-22 16:32:48');\nINSERT INTO `onl_drag_comp` VALUES ('1008622512340893691', '1009729002476830720', '装饰1', 'JDragDecoration', 'ant-design:format-painter-filled', 1, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"1\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"mainColor\\\": \\\"#00CED1\\\",\\n    \\\"subColor\\\": \\\"#FAD400\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3,\\n    \\\"fontSize\\\": 15\\n  }\\n}', '1', 'admin', '2024-10-22 16:32:36', 'admin', '2024-10-22 16:32:48');\nINSERT INTO `onl_drag_comp` VALUES ('1008622512340893693', '1009729002476830720', '装饰3', 'JDragDecoration', 'ant-design:format-painter-filled', 3, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"3\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"mainColor\\\": \\\"#00CED1\\\",\\n    \\\"subColor\\\": \\\"#FAD400\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3,\\n    \\\"fontSize\\\": 15\\n  }\\n}', '1', 'admin', '2024-10-22 16:32:36', 'admin', '2024-10-22 16:32:48');\nINSERT INTO `onl_drag_comp` VALUES ('1008622512340893694', '1009729002476830720', '装饰4', 'JDragDecoration', 'ant-design:format-painter-filled', 4, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"4\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"mainColor\\\": \\\"#00CED1\\\",\\n    \\\"subColor\\\": \\\"#FAD400\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3,\\n    \\\"fontSize\\\": 15\\n  }\\n}', '1', 'admin', '2024-10-22 16:32:36', 'admin', '2024-10-22 16:32:48');\nINSERT INTO `onl_drag_comp` VALUES ('1008622512340893695', '1009729002476830720', '装饰5', 'JDragDecoration', 'ant-design:format-painter-filled', 5, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"5\\\",\\n    \\\"title\\\": \\\"装饰\\\",\\n    \\\"mainColor\\\": \\\"#00CED1\\\",\\n    \\\"subColor\\\": \\\"#FAD400\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3,\\n    \\\"fontSize\\\": 15\\n  }\\n}', '1', 'admin', '2024-10-22 16:32:36', 'admin', '2024-10-22 16:32:48');\nINSERT INTO `onl_drag_comp` VALUES ('1008622512340893696', '1009729002476830720', '装饰6', 'JDragDecoration', 'ant-design:format-painter-filled', 6, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"6\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"mainColor\\\": \\\"#00CED1\\\",\\n    \\\"subColor\\\": \\\"#FAD400\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3,\\n    \\\"fontSize\\\": 15\\n  }\\n}', '1', 'admin', '2024-10-22 16:32:36', 'admin', '2024-10-22 16:32:48');\nINSERT INTO `onl_drag_comp` VALUES ('1008622512340893697', '1009729002476830720', '装饰7', 'JDragDecoration', 'ant-design:format-painter-filled', 7, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"7\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"mainColor\\\": \\\"#00CED1\\\",\\n    \\\"subColor\\\": \\\"#FAD400\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3,\\n    \\\"fontSize\\\": 15\\n  }\\n}', '1', 'admin', '2024-10-22 16:32:36', 'admin', '2024-10-22 16:32:48');\nINSERT INTO `onl_drag_comp` VALUES ('1008622512340893698', '1009729002476830720', '装饰8', 'JDragDecoration', 'ant-design:format-painter-filled', 8, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"8\\\",\\n    \\\"title\\\": \\\"边框\\\",\\n    \\\"mainColor\\\": \\\"#00CED1\\\",\\n    \\\"subColor\\\": \\\"#FAD400\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3,\\n    \\\"fontSize\\\": 15\\n  }\\n}', '1', 'admin', '2024-10-22 16:32:36', 'admin', '2024-10-22 16:32:48');\nINSERT INTO `onl_drag_comp` VALUES ('1008622512340893699', '1009729002476830720', '装饰9', 'JDragDecoration', 'ant-design:format-painter-filled', 9, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 12,\\n  \\\"dataType\\\": 1,\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"9\\\",\\n    \\\"title\\\": \\\"装饰\\\",\\n    \\\"mainColor\\\": \\\"#00CED1\\\",\\n    \\\"subColor\\\": \\\"#FAD400\\\",\\n    \\\"reverse\\\": false,\\n    \\\"dur\\\": 3,\\n    \\\"fontSize\\\": 15\\n  }\\n}', '1', 'admin', '2024-10-22 16:32:36', 'admin', '2024-10-22 16:32:48');\nINSERT INTO `onl_drag_comp` VALUES ('1008904673035976704', '1009728871115423744', '翻牌器', 'JCountTo', NULL, 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/42/nav\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"background\\\": \\\"#4A90E2\\\",\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"chartData\\\": \\\"10000\\\",\\n  \\\"option\\\": {\\n    \\\"whole\\\": false,\\n    \\\"boxWidth\\\":50,\\r\\n   \\\"boxHeight\\\":50,\\n    \\\"fontSize\\\": 16,\\n    \\\"color\\\": \\\"#fff\\\",\\n    \\\"fontWeight\\\": \\\"normal\\\",\\n    \\\"prefixFontSize\\\": 16,\\n    \\\"prefixColor\\\": \\\"#fff\\\",\\n    \\\"prefixFontWeight\\\": \\\"normal\\\",\\n    \\\"suffix\\\": \\\"\\\",\\n    \\\"suffixFontSize\\\": 16,\\n    \\\"suffixColor\\\": \\\"#fff\\\",\\n    \\\"suffixFontWeight\\\": \\\"normal\\\",\\n    \\\"prefix\\\": \\\"\\\",\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"body\\\": {\\n      \\\"text\\\": \\\"\\\",\\n      \\\"color\\\": \\\"#FFFFFF\\\",\\n      \\\"fontWeight\\\": \\\"bold\\\",\\n      \\\"marginLeft\\\": 0,\\n      \\\"marginTop\\\": 0\\n    }\\n  }\\n}', '1', 'admin', '2024-10-23 11:13:49', 'admin', '2024-10-23 11:55:21');\nINSERT INTO `onl_drag_comp` VALUES ('1009335943687733248', '1009728871115423744', '男女占比', 'JGender', NULL, 100, NULL, '{\\n  \\\"w\\\": 8,\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/26/pictogram\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"男\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"女\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"man\\\": 50,\\n      \\\"woman\\\": 35\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"title\\\": {\\n      \\\"show\\\": true,\\n      \\\"text\\\": \\\"男女占比\\\"\\n    },\\n    \\\"grid\\\": {\\n      \\\"bottom\\\": 115\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"series\\\": []\\n  }\\n}', '1', 'admin', '2024-10-24 15:47:32', 'admin', '2024-10-24 15:48:01');\nINSERT INTO `onl_drag_comp` VALUES ('1009345312659767296', '1009728871115423744', '颜色块', 'JColorBlock', NULL, 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/42/nav\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"background\\\": \\\"#4A90E2\\\",\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"前缀\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"后缀\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"颜色\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"chartData\\\": [\\n    {\\n      \\\"backgroundColor\\\": \\\"#67C23A\\\",\\n      \\\"prefix\\\": \\\"朝阳总销售额\\\",\\n      \\\"value\\\": \\\"12345\\\",\\n      \\\"suffix\\\": \\\"亿\\\"\\n    },\\n    {\\n      \\\"backgroundColor\\\": \\\"#409EFF\\\",\\n      \\\"prefix\\\": \\\"昌平总销售额\\\",\\n      \\\"value\\\": \\\"12345\\\",\\n      \\\"suffix\\\": \\\"亿\\\"\\n    },\\n    {\\n      \\\"backgroundColor\\\": \\\"#E6A23C\\\",\\n      \\\"prefix\\\": \\\"海淀总销售额\\\",\\n      \\\"value\\\": \\\"12345\\\",\\n      \\\"suffix\\\": \\\"亿\\\"\\n    },\\n    {\\n      \\\"backgroundColor\\\": \\\"#F56C6C\\\",\\n      \\\"prefix\\\": \\\"西城总销售额\\\",\\n      \\\"value\\\": \\\"12345\\\",\\n      \\\"suffix\\\": \\\"亿\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"whole\\\": false,\\n    \\\"width\\\": 50,\\n    \\\"height\\\": 50,\\n    \\\"lineNum\\\": 2,\\n    \\\"borderSplitx\\\": 20,\\n    \\\"borderSplity\\\": 20,\\n    \\\"fontSize\\\": 16,\\n    \\\"color\\\": \\\"#fff\\\",\\n    \\\"fontWeight\\\": \\\"normal\\\",\\n    \\\"textAlign\\\": \\\"center\\\",\\n    \\\"padding\\\": 5,\\n    \\\"prefixFontSize\\\": 16,\\n    \\\"prefixColor\\\": \\\"#fff\\\",\\n    \\\"prefixFontWeight\\\": \\\"normal\\\",\\n    \\\"prefixSplitx\\\": 0,\\n    \\\"prefixSplity\\\": 0,\\n    \\\"suffix\\\": \\\"\\\",\\n    \\\"suffixSplitx\\\": 0,\\n    \\\"suffixFontSize\\\": 16,\\n    \\\"suffixColor\\\": \\\"#fff\\\",\\n    \\\"suffixFontWeight\\\": \\\"normal\\\",\\n    \\\"prefix\\\": \\\"\\\",\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"body\\\": {\\n      \\\"text\\\": \\\"\\\",\\n      \\\"color\\\": \\\"#FFFFFF\\\",\\n      \\\"fontWeight\\\": \\\"bold\\\",\\n      \\\"marginLeft\\\": 0,\\n      \\\"marginTop\\\": 0\\n    }\\n  }\\n}', '1', 'admin', '2024-10-24 16:24:45', 'admin', '2024-10-24 16:24:56');\nINSERT INTO `onl_drag_comp` VALUES ('1009386233476579328', '1009728871115423744', '胶囊图', 'JCapsuleChart', NULL, 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"name\\\": \\\"苹果\\\",\\n      \\\"value\\\": 1000879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"三星\\\",\\n      \\\"value\\\": 3400879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"小米\\\",\\n      \\\"value\\\": 2300879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"oppo\\\",\\n      \\\"value\\\": 5400879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"vivo\\\",\\n      \\\"value\\\": 3400879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"showValue\\\": false,\\n    \\\"unit\\\": \\\"\\\",\\n    \\\"customColor\\\": [],\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"基础柱形图\\\",\\n      \\\"show\\\": true,\\n      \\\"textStyle\\\": {\\n        \\\"color\\\": \\\"#464646\\\",\\n        \\\"fontWeight\\\": \\\"normal\\\"\\n      }\\n    }\\n  }\\n}', '1', 'admin', '2024-10-24 19:07:22', 'admin', '2024-10-24 19:07:37');\nINSERT INTO `onl_drag_comp` VALUES ('1009395760485793792', '1009728871115423744', '动态环形图', 'JActiveRing', NULL, 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"name\\\": \\\"周口\\\",\\n      \\\"value\\\": 55\\n    },\\n    {\\n      \\\"name\\\": \\\"南阳\\\",\\n      \\\"value\\\": 120\\n    },\\n    {\\n      \\\"name\\\": \\\"西峡\\\",\\n      \\\"value\\\": 78\\n    },\\n    {\\n      \\\"name\\\": \\\"驻马店\\\",\\n      \\\"value\\\": 66\\n    },\\n    {\\n      \\\"name\\\": \\\"新乡\\\",\\n      \\\"value\\\": 80\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"lineWidth\\\": 10,\\n    \\\"radius\\\": 100,\\n    \\\"activeRadius\\\": 100,\\n    \\\"showOriginValue\\\": false,\\n    \\\"customColor\\\": [],\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"动态环形图\\\",\\n      \\\"show\\\": true,\\n      \\\"textStyle\\\": {\\n        \\\"color\\\": \\\"#464646\\\",\\n        \\\"fontWeight\\\": \\\"normal\\\"\\n      }\\n    }\\n  }\\n}', '1', 'admin', '2024-10-24 19:45:13', 'admin', '2024-10-24 19:45:39');\nINSERT INTO `onl_drag_comp` VALUES ('1009679509282783232', '1009728871115423744', '排行榜', 'JScrollRankingBoard', NULL, 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"name\\\": \\\"苹果\\\",\\n      \\\"value\\\": 1000879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"三星\\\",\\n      \\\"value\\\": 3400879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"小米\\\",\\n      \\\"value\\\": 2300879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"oppo\\\",\\n      \\\"value\\\": 5400879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"vivo\\\",\\n      \\\"value\\\": 3400879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"waitTime\\\": 2000,\\n    \\\"rowNum\\\": 5,\\n    \\\"carousel\\\": \\\"single\\\",\\n    \\\"sort\\\": true,\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"排行榜\\\",\\n      \\\"show\\\": true,\\n      \\\"textStyle\\\": {\\n        \\\"color\\\": \\\"#464646\\\",\\n        \\\"fontWeight\\\": \\\"normal\\\"\\n      }\\n    }\\n  }\\n}', '1', 'admin', '2024-10-25 14:32:44', 'admin', '2024-10-25 14:33:00');\nINSERT INTO `onl_drag_comp` VALUES ('1009694340236869632', '1009728871115423744', '轮播表', 'JScrollBoard', NULL, 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    [\\n      \\\"行1列1\\\",\\n      \\\"行1列2\\\",\\n      \\\"行1列3\\\"\\n    ],\\n    [\\n      \\\"行2列1\\\",\\n      \\\"行2列2\\\",\\n      \\\"行2列3\\\"\\n    ],\\n    [\\n      \\\"行3列1\\\",\\n      \\\"行3列2\\\",\\n      \\\"行3列3\\\"\\n    ],\\n    [\\n      \\\"行4列1\\\",\\n      \\\"行4列2\\\",\\n      \\\"行4列3\\\"\\n    ],\\n    [\\n      \\\"行5列1\\\",\\n      \\\"行5列2\\\",\\n      \\\"行5列3\\\"\\n    ]\\n  ],\\n  \\\"option\\\": {\\n    \\\"waitTime\\\": 2000,\\n    \\\"rowNum\\\": 5,\\n    \\\"carousel\\\": \\\"single\\\",\\n    \\\"sort\\\": true,\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"轮播表\\\",\\n      \\\"show\\\": true,\\n      \\\"textStyle\\\": {\\n        \\\"color\\\": \\\"#464646\\\",\\n        \\\"fontWeight\\\": \\\"normal\\\"\\n      }\\n    }\\n  }\\n}', '1', 'admin', '2024-10-25 15:31:40', 'admin', '2024-10-25 15:32:08');\nINSERT INTO `onl_drag_comp` VALUES ('1009728871115423744', '0', '大屏', 'bigscreen', 'ant-design:fund-projection-screen-outlined', 100, NULL, NULL, '0', 'admin', '2024-10-25 17:48:53', 'admin', '2024-10-25 17:49:14');\nINSERT INTO `onl_drag_comp` VALUES ('1009728983979950080', '1009728871115423744', '边框', 'border', NULL, 100, NULL, NULL, '1', 'admin', '2024-10-25 17:49:20', 'admin', '2024-10-25 17:49:50');\nINSERT INTO `onl_drag_comp` VALUES ('1009729002476830720', '1009728871115423744', '装饰', 'decoration', NULL, 100, NULL, NULL, '1', 'admin', '2024-10-25 17:49:24', 'admin', '2024-10-25 17:50:05');\nINSERT INTO `onl_drag_comp` VALUES ('1010847514343669760', '1009728871115423744', '水波图', 'JLiquid', NULL, 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"value\\\": 25\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"水波图\\\",\\n      \\\"show\\\": true,\\n      \\\"textStyle\\\": {\\n        \\\"color\\\": \\\"#464646\\\",\\n        \\\"fontWeight\\\": \\\"normal\\\"\\n      }\\n    }\\n  }\\n}', '1', 'admin', '2024-10-28 19:53:58', 'admin', '2024-10-28 19:54:17');\nINSERT INTO `onl_drag_comp` VALUES ('1011075798868328448', '1009728871115423744', '玉珏图', 'JRadialBar', NULL, 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\":[\\n      {\\n          \\\"name\\\": \\\"A\\\",\\n          \\\"value\\\": 297\\n      },\\n      {\\n          \\\"name\\\": \\\"B\\\",\\n          \\\"value\\\": 506\\n      },\\n      {\\n          \\\"name\\\": \\\"C\\\",\\n          \\\"value\\\": 805\\n      },\\n      {\\n          \\\"name\\\": \\\"D\\\",\\n          \\\"value\\\": 1478\\n      },\\n      {\\n          \\\"name\\\": \\\"E\\\",\\n          \\\"value\\\": 2029\\n      },\\n      {\\n          \\\"name\\\": \\\"F\\\",\\n          \\\"value\\\": 7100\\n      },\\n      {\\n          \\\"name\\\": \\\"G\\\",\\n          \\\"value\\\": 7346\\n      },\\n      {\\n          \\\"name\\\": \\\"H\\\",\\n          \\\"value\\\": 10178\\n      }\\n  ],\\n  \\\"option\\\": {\\n    \\\"type\\\": \\\"bar\\\",\\n    \\\"radius\\\": 0.8,\\n    \\\"innerRadius\\\": 0.2,\\n    \\\"maxAngle\\\": 240,\\n    \\\"radiuShow\\\": false,\\n    \\\"bgShow\\\": false,\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"玉珏图\\\",\\n      \\\"show\\\": true,\\n      \\\"textStyle\\\": {\\n        \\\"color\\\": \\\"#464646\\\",\\n        \\\"fontWeight\\\": \\\"normal\\\"\\n      }\\n    }\\n  }\\n}', '1', 'admin', '2024-10-29 11:01:06', 'admin', '2024-10-29 11:01:35');\nINSERT INTO `onl_drag_comp` VALUES ('1011128533818966016', '1009728871115423744', '百分比条形图', 'JPercentBar', NULL, 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"分组\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\":[\\n      {\\n          \\\"type\\\": \\\"Asia\\\",\\n          \\\"name\\\": \\\"1750\\\",\\n          \\\"value\\\": 502\\n      },\\n      {\\n          \\\"type\\\": \\\"Asia\\\",\\n          \\\"name\\\": \\\"1800\\\",\\n          \\\"value\\\": 635\\n      },\\n      {\\n          \\\"type\\\": \\\"Asia\\\",\\n          \\\"name\\\": \\\"1850\\\",\\n          \\\"value\\\": 809\\n      },\\n      {\\n          \\\"type\\\": \\\"Asia\\\",\\n          \\\"name\\\": \\\"1900\\\",\\n          \\\"value\\\": 947\\n      },\\n      {\\n          \\\"type\\\": \\\"Asia\\\",\\n          \\\"name\\\": \\\"1950\\\",\\n          \\\"value\\\": 1402\\n      },\\n      {\\n          \\\"type\\\": \\\"Asia\\\",\\n          \\\"name\\\": \\\"1999\\\",\\n          \\\"value\\\": 3634\\n      },\\n      {\\n          \\\"type\\\": \\\"Asia\\\",\\n          \\\"name\\\": \\\"2050\\\",\\n          \\\"value\\\": 5268\\n      },\\n      {\\n          \\\"type\\\": \\\"Africa\\\",\\n          \\\"name\\\": \\\"1750\\\",\\n          \\\"value\\\": 106\\n      },\\n      {\\n          \\\"type\\\": \\\"Africa\\\",\\n          \\\"name\\\": \\\"1800\\\",\\n          \\\"value\\\": 107\\n      },\\n      {\\n          \\\"type\\\": \\\"Africa\\\",\\n          \\\"name\\\": \\\"1850\\\",\\n          \\\"value\\\": 111\\n      },\\n      {\\n          \\\"type\\\": \\\"Africa\\\",\\n          \\\"name\\\": \\\"1900\\\",\\n          \\\"value\\\": 133\\n      },\\n      {\\n          \\\"type\\\": \\\"Africa\\\",\\n          \\\"name\\\": \\\"1950\\\",\\n          \\\"value\\\": 221\\n      },\\n      {\\n          \\\"type\\\": \\\"Africa\\\",\\n          \\\"name\\\": \\\"1999\\\",\\n          \\\"value\\\": 767\\n      },\\n      {\\n          \\\"type\\\": \\\"Africa\\\",\\n          \\\"name\\\": \\\"2050\\\",\\n          \\\"value\\\": 1766\\n      },\\n      {\\n          \\\"type\\\": \\\"Europe\\\",\\n          \\\"name\\\": \\\"1750\\\",\\n          \\\"value\\\": 163\\n      },\\n      {\\n          \\\"type\\\": \\\"Europe\\\",\\n          \\\"name\\\": \\\"1800\\\",\\n          \\\"value\\\": 203\\n      },\\n      {\\n          \\\"type\\\": \\\"Europe\\\",\\n          \\\"name\\\": \\\"1850\\\",\\n          \\\"value\\\": 276\\n      },\\n      {\\n          \\\"type\\\": \\\"Europe\\\",\\n          \\\"name\\\": \\\"1900\\\",\\n          \\\"value\\\": 408\\n      },\\n      {\\n          \\\"type\\\": \\\"Europe\\\",\\n          \\\"name\\\": \\\"1950\\\",\\n          \\\"value\\\": 547\\n      },\\n      {\\n          \\\"type\\\": \\\"Europe\\\",\\n          \\\"name\\\": \\\"1999\\\",\\n          \\\"value\\\": 729\\n      },\\n      {\\n          \\\"type\\\": \\\"Europe\\\",\\n          \\\"name\\\": \\\"2050\\\",\\n          \\\"value\\\": 628\\n      }\\n  ],\\n  \\\"option\\\": {\\n    \\\"yNameFontColor\\\": \\\"#fff\\\",\\n    \\\"yNameFontSize\\\": 12,\\n    \\\"xNameFontColor\\\": \\\"#fff\\\",\\n    \\\"xNameFontSize\\\": 12,\\n    \\\"legendLayout\\\": \\\"horizontal\\\",\\n    \\\"legendPosition\\\": \\\"bottom\\\",\\n    \\\"legendFontColor\\\": \\\"#fff\\\",\\n    \\\"legendFontSize\\\": 16,\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"百分比图\\\",\\n      \\\"show\\\": true,\\n      \\\"textStyle\\\": {\\n        \\\"color\\\": \\\"#464646\\\",\\n        \\\"fontWeight\\\": \\\"normal\\\"\\n      }\\n    }\\n  }\\n}', '1', 'admin', '2024-10-29 14:30:39', 'admin', '2024-10-29 14:30:56');\nINSERT INTO `onl_drag_comp` VALUES ('1011137156657872896', '1009728871115423744', '矩形图', 'JRectangle', NULL, 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"name\\\": \\\"分类 1\\\",\\n      \\\"value\\\": 560\\n    },\\n    {\\n      \\\"name\\\": \\\"分类 2\\\",\\n      \\\"value\\\": 500\\n    },\\n    {\\n      \\\"name\\\": \\\"分类 3\\\",\\n      \\\"value\\\": 150\\n    },\\n    {\\n      \\\"name\\\": \\\"分类 4\\\",\\n      \\\"value\\\": 140\\n    },\\n    {\\n      \\\"name\\\": \\\"分类 5\\\",\\n      \\\"value\\\": 115\\n    },\\n    {\\n      \\\"name\\\": \\\"分类 6\\\",\\n      \\\"value\\\": 95\\n    },\\n    {\\n      \\\"name\\\": \\\"分类 7\\\",\\n      \\\"value\\\": 90\\n    },\\n    {\\n      \\\"name\\\": \\\"分类 8\\\",\\n      \\\"value\\\": 75\\n    },\\n    {\\n      \\\"name\\\": \\\"分类 9\\\",\\n      \\\"value\\\": 98\\n    },\\n    {\\n      \\\"name\\\": \\\"分类 10\\\",\\n      \\\"value\\\": 60\\n    },\\n    {\\n      \\\"name\\\": \\\"分类 11\\\",\\n      \\\"value\\\": 45\\n    },\\n    {\\n      \\\"name\\\": \\\"分类 12\\\",\\n      \\\"value\\\": 40\\n    },\\n    {\\n      \\\"name\\\": \\\"分类 13\\\",\\n      \\\"value\\\": 40\\n    },\\n    {\\n      \\\"name\\\": \\\"分类 14\\\",\\n      \\\"value\\\": 35\\n    },\\n    {\\n      \\\"name\\\": \\\"分类 15\\\",\\n      \\\"value\\\": 40\\n    },\\n    {\\n      \\\"name\\\": \\\"分类 16\\\",\\n      \\\"value\\\": 40\\n    },\\n    {\\n      \\\"name\\\": \\\"分类 17\\\",\\n      \\\"value\\\": 40\\n    },\\n    {\\n      \\\"name\\\": \\\"分类 18\\\",\\n      \\\"value\\\": 30\\n    },\\n    {\\n      \\\"name\\\": \\\"分类 19\\\",\\n      \\\"value\\\": 28\\n    },\\n    {\\n      \\\"name\\\": \\\"分类 20\\\",\\n      \\\"value\\\": 16\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"theme\\\": \\\"default\\\",\\n    \\\"titleFontSize\\\": 12,\\n    \\\"titleColor\\\": \\\"#fff\\\",\\n    \\\"tipFontSize\\\": 12,\\n    \\\"tipColor\\\": \\\"#fff\\\",\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"基础矩形图\\\",\\n      \\\"show\\\": true,\\n      \\\"textStyle\\\": {\\n        \\\"color\\\": \\\"#464646\\\",\\n        \\\"fontWeight\\\": \\\"normal\\\"\\n      }\\n    }\\n  }\\n}', '1', 'admin', '2024-10-29 15:04:54', 'admin', '2024-10-29 15:05:11');\nINSERT INTO `onl_drag_comp` VALUES ('1011144678642974720', '1009728871115423744', '旋转饼图', 'JRotatePie', NULL, 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": -1,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"value\\\": 1048,\\n      \\\"name\\\": \\\"vivo\\\"\\n    },\\n    {\\n      \\\"value\\\": 735,\\n      \\\"name\\\": \\\"oppo\\\"\\n    },\\n    {\\n      \\\"value\\\": 580,\\n      \\\"name\\\": \\\"苹果\\\"\\n    },\\n    {\\n      \\\"value\\\": 484,\\n      \\\"name\\\": \\\"小米\\\"\\n    },\\n    {\\n      \\\"value\\\": 300,\\n      \\\"name\\\": \\\"三星\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"grid\\\": {\\n      \\\"show\\\": false,\\n      \\\"bottom\\\": 115\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"旋转饼图\\\",\\n      \\\"subtext\\\": \\\"\\\",\\n      \\\"left\\\": \\\"left\\\",\\n      \\\"textStyle\\\": {\\n        \\\"fontWeight\\\": \\\"normal\\\"\\n      },\\n      \\\"show\\\": true\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"tooltip\\\": {\\n      \\\"trigger\\\": \\\"item\\\"\\n    },\\n    \\\"legend\\\": {\\n      \\\"orient\\\": \\\"vertical\\\"\\n    },\\n    \\\"series\\\": [\\n      {\\n        \\\"name\\\": \\\"\\\",\\n        \\\"type\\\": \\\"pie\\\",\\n        \\\"data\\\": [],\\n        \\\"emphasis\\\": {\\n          \\\"itemStyle\\\": {\\n            \\\"shadowBlur\\\": 10,\\n            \\\"shadowOffsetX\\\": 0,\\n            \\\"shadowColor\\\": \\\"rgba(0, 0, 0, 0.5)\\\"\\n          }\\n        }\\n      }\\n    ]\\n  }\\n}', '1', 'admin', '2024-10-29 15:34:48', 'admin', '2024-10-29 15:35:16');\nINSERT INTO `onl_drag_comp` VALUES ('1011160078130774016', '1009728871115423744', '视频', 'JVideoPlay', NULL, 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/42/nav\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"background\\\": \\\"#4A90E2\\\",\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"路径\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"src\\\": \\\"http://vjs.zencdn.net/v/oceans.mp4\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"autoPlay\\\": false,\\n    \\\"loop\\\": true\\n  }\\n}', '1', 'admin', '2024-10-29 16:35:59', 'admin', '2024-10-29 16:36:14');\nINSERT INTO `onl_drag_comp` VALUES ('1501033448017510401', '100', '轮播图', 'JCarousel', 'ic:baseline-image', 5, NULL, '{\\n  \\\"w\\\": 24,\\n  \\\"h\\\": 22,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/42/carousel\\\",\\n  \\\"timeOut\\\": -1,\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"路径\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"autoplay\\\": true,\\n    \\\"dots\\\": true,\\n    \\\"dotPosition\\\": \\\"bottom\\\"\\n  },\\n  \\\"chartData\\\": [\\n    {\\r\\n      \\\"src\\\": \\\"https://jeecgos.oss-cn-beijing.aliyuncs.com/files/site/drag/0.png\\\"\\r\\n\t\t},\\r\\n\t\t{\\r\\n\t\t\t\\\"src\\\": \\\"https://jeecgos.oss-cn-beijing.aliyuncs.com/files/site/drag/1.png\\\"\\r\\n\t\t},\\r\\n\t\t{\\r\\n\t\t\t\\\"src\\\": \\\"https://jeecgos.oss-cn-beijing.aliyuncs.com/files/site/drag/2.png\\\"\\r\\n\t\t}\\n  ]\\n}', '1', 'jeecg', '2022-03-08 11:13:57', 'admin', '2022-04-22 18:58:47');\nINSERT INTO `onl_drag_comp` VALUES ('1501109939736690691', '200', '统计进度图', 'JTotalProgress', 'ri:bar-chart-horizontal-line', 7, NULL, '{\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": -1,\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"value\\\": 50\\n    }\\n  ],\\n  \\\"option\\\": {\\r\\n   \\\"targetValue\\\":{},\\n    \\\"series\\\": [\\n      {\\n        \\\"barWidth\\\": 19,\\n        \\\"label\\\": {\\n          \\\"show\\\": true,\\n          \\\"position\\\": \\\"right\\\",\\n          \\\"offset\\\": [\\n            0,\\n            -40\\n          ],\\n          \\\"formatter\\\": \\\"{c}{a}\\\",\\n          \\\"color\\\": \\\"black\\\",\\n          \\\"fontSize\\\": 24\\n        },\\n        \\\"itemStyle\\\": {\\n          \\\"normal\\\": {\\n            \\\"barBorderRadius\\\": 10\\n          }\\n        },\\n        \\\"color\\\": \\\"#151B87\\\",\\n        \\\"zlevel\\\": 1\\n      },\\n      {\\n        \\\"type\\\": \\\"bar\\\",\\n        \\\"barGap\\\": \\\"-100%\\\",\\n        \\\"color\\\": \\\"#eeeeee\\\",\\n        \\\"barWidth\\\": 19,\\n        \\\"itemStyle\\\": {\\n          \\\"normal\\\": {\\n            \\\"barBorderRadius\\\": 10\\n          }\\n        }\\n      }\\n    ]\\n  }\\n}', '1', 'jeecg', '2022-03-08 16:17:54', 'admin', '2022-04-28 20:58:49');\nINSERT INTO `onl_drag_comp` VALUES ('1501109939736690693', '200', '字符云', 'JWordCloud', 'ri:bar-chart-horizontal-line', 7, NULL, '{\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": -1,\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\r\\n    {\\r\\n      \\\"filed\\\": \\\"维度\\\",\\r\\n      \\\"mapping\\\": \\\"\\\"\\r\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\r\\n      \\\"name\\\":\\\"手机\\\",\\n      \\\"value\\\": 50\\n    }\\n  ],\\n  \\\"option\\\": {\\r\\n   \\\"minSize\\\": 12,\\r\\n    \\\"maxSize\\\": 60,\\n    \\\"series\\\": [\\n      {\\n        \\\"type\\\": \\\"wordCloud\\\",\\r\\n        \\\"shape\\\": \\\"circle\\\"\\n      }\\n    ]\\n  }\\n}', '1', 'jeecg', '2022-03-08 16:17:54', 'admin', '2022-04-28 20:58:49');\nINSERT INTO `onl_drag_comp` VALUES ('1501439613197119490', '100102', '数据列表', 'JList', 'ph:list-numbers', 4, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 24,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/42/list\\\",\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"标题\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"描述\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"时间\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"封面\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"timeOut\\\": -1,\\n  \\\"option\\\": {\\n    \\\"showTitlePrefix\\\": true,\\n    \\\"showTimePrefix\\\": true,\\n    \\\"titleFontSize\\\": 18,\\n    \\\"layout\\\": \\\"horizontal\\\"\\n  },\\n  \\\"chartData\\\": [\\n    {\\n      \\\"title\\\": \\\"通知一\\\",\\n      \\\"date\\\": \\\"2022-3-9 14:20:21\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"通知二\\\",\\n      \\\"date\\\": \\\"2022-3-8 14:20:21\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"通知三\\\",\\n      \\\"date\\\": \\\"2022-3-7 14:20:21\\\"\\n    },\\n    {\\n      \\\"title\\\": \\\"通知四\\\",\\n      \\\"date\\\": \\\"2022-3-4 14:20:21\\\"\\n    }\\n  ]\\n}', '1', 'jeecg', '2022-03-09 14:07:54', 'admin', '2022-04-29 19:38:46');\nINSERT INTO `onl_drag_comp` VALUES ('1501439614397119490', '100104', '最新动态', 'JDynamicInfo', 'ic:sharp-list-alt', 16, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 28,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/42/list\\\",\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"名称\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"描述\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"时间\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"头像\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"timeOut\\\": -1,\\n  \\\"option\\\": {\\n    \\\"titleFontSize\\\": 18\\n  },\\n  \\\"chartData\\\": [\\n    {\\n      \\\"name\\\": \\\"威廉\\\",\\n      \\\"date\\\": \\\"刚刚\\\",\\n      \\\"desc\\\": \\\"在 <a>开源组</a> 创建了项目 <a>Vue</a>\\\",\\n      \\\"avatar\\\": \\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/upload/test/320222_1646724689691.jpg\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"艾文\\\",\\n      \\\"date\\\": \\\"1个小时前\\\",\\n      \\\"desc\\\": \\\"关注了 <a>威廉</a>\\\",\\n      \\\"avatar\\\": \\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/upload/test/320305_1646724680756.jpg\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"克里斯\\\",\\n      \\\"date\\\": \\\"1天前\\\",\\n      \\\"desc\\\": \\\"发布了 <a>个人动态</a>\\\",\\n      \\\"avatar\\\": \\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/upload/test/299258_1646724675255.jpg\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"Jeecg\\\",\\n      \\\"date\\\": \\\"2天前\\\",\\n      \\\"desc\\\": \\\"发表文章 <a>如何编写一个Vite插件</a>\\\",\\n      \\\"avatar\\\": \\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/upload/test/2.4jeecg_1621512120602.png\\\"\\n    }\\n  ]\\n}', '1', 'jeecg', '2022-03-09 14:07:54', 'admin', '2022-04-29 19:52:54');\nINSERT INTO `onl_drag_comp` VALUES ('1536970245843996673', '200200', '对比柱形图', 'JMultipleBar', 'material-symbols:grouped-bar-chart', 5, NULL, '{\\r\\n  \\\"w\\\": 12,\\r\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"分组\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"name\\\": \\\"1991\\\",\\n      \\\"value\\\": 3,\\n      \\\"type\\\": \\\"Lon\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"1992\\\",\\n      \\\"value\\\": 4,\\n      \\\"type\\\": \\\"Lon\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"1993\\\",\\n      \\\"value\\\": 3.5,\\n      \\\"type\\\": \\\"Lon\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"1994\\\",\\n      \\\"value\\\": 5,\\n      \\\"type\\\": \\\"Lon\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"1995\\\",\\n      \\\"value\\\": 4.9,\\n      \\\"type\\\": \\\"Lon\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"1996\\\",\\n      \\\"value\\\": 6,\\n      \\\"type\\\": \\\"Lon\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"1997\\\",\\n      \\\"value\\\": 7,\\n      \\\"type\\\": \\\"Lon\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"1998\\\",\\n      \\\"value\\\": 9,\\n      \\\"type\\\": \\\"Lon\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"1999\\\",\\n      \\\"value\\\": 13,\\n      \\\"type\\\": \\\"Lon\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"1991\\\",\\n      \\\"value\\\": 3,\\n      \\\"type\\\": \\\"Bor\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"1992\\\",\\n      \\\"value\\\": 4,\\n      \\\"type\\\": \\\"Bor\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"1993\\\",\\n      \\\"value\\\": 3.5,\\n      \\\"type\\\": \\\"Bor\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"1994\\\",\\n      \\\"value\\\": 5,\\n      \\\"type\\\": \\\"Bor\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"1995\\\",\\n      \\\"value\\\": 4.9,\\n      \\\"type\\\": \\\"Bor\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"1996\\\",\\n      \\\"value\\\": 6,\\n      \\\"type\\\": \\\"Bor\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"1997\\\",\\n      \\\"value\\\": 7,\\n      \\\"type\\\": \\\"Bor\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"1998\\\",\\n      \\\"value\\\": 9,\\n      \\\"type\\\": \\\"Bor\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"1999\\\",\\n      \\\"value\\\": 13,\\n      \\\"type\\\": \\\"Bor\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"多数据对比柱形图\\\",\\n      \\\"show\\\": true,\\r\\n\t\t\t\\\"textStyle\\\":{\\r\\n\t\t\t  \\\"fontWeight\\\":\\\"normal\\\"\\r\\n\t\t\t}\\n    },\\n    \\\"grid\\\": {\\n      \\\"bottom\\\": 115,\\n          \\\"top\\\":90\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"tooltip\\\": {\\n      \\\"trigger\\\": \\\"axis\\\",\\n      \\\"axisPointer\\\": {\\n        \\\"type\\\": \\\"shadow\\\",\\n        \\\"label\\\": {\\n          \\\"show\\\": true,\\n          \\\"backgroundColor\\\": \\\"#333\\\"\\n        }\\n      }\\n    },\\n    \\\"series\\\": []\\n  }\\n}', '1', NULL, '2022-06-15 15:13:57', 'admin', '2022-08-04 19:19:06');\nINSERT INTO `onl_drag_comp` VALUES ('1537002903949037570', '200', '折线图', 'line', 'teenyicons:area-chart-outline', 2, NULL, NULL, '1', NULL, '2022-06-15 17:23:43', NULL, '2022-06-17 19:56:48');\nINSERT INTO `onl_drag_comp` VALUES ('1537284032572702721', '1537002903949037570', '平滑折线图', 'JSmoothLine', 'mdi:chart-bell-curve', 2, NULL, '{\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"value\\\": 1000,\\n      \\\"name\\\": \\\"联想\\\"\\n    },\\n    {\\n      \\\"value\\\": 7350,\\n      \\\"name\\\": \\\"小米\\\"\\n    },\\n    {\\n      \\\"value\\\": 5800,\\n      \\\"name\\\": \\\"华为\\\"\\n    },\\n    {\\n      \\\"value\\\": 6000,\\n      \\\"name\\\": \\\"苹果\\\"\\n    },\\n    {\\n      \\\"value\\\": 3000,\\n      \\\"name\\\": \\\"戴尔\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"grid\\\": {\\n      \\\"show\\\": false,\\n      \\\"bottom\\\": 115,\\n          \\\"top\\\":90\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"平滑折线图\\\",\\n      \\\"subtext\\\": \\\"\\\",\\n      \\\"left\\\": \\\"left\\\",\\r\\n\t\t\t\\\"textStyle\\\":{\\r\\n\t\t\t  \\\"fontWeight\\\":\\\"normal\\\"\\r\\n\t\t\t}\\n    },\\n    \\\"series\\\": [\\n      {\\n        \\\"data\\\": [],\\n        \\\"smooth\\\": true,\\n        \\\"type\\\": \\\"line\\\"\\n      }\\n    ]\\n  }\\n}', '1', NULL, '2022-06-16 12:00:49', 'admin', '2022-08-04 19:19:43');\nINSERT INTO `onl_drag_comp` VALUES ('1537318081257291777', '1537764165146476546', '普通散点图', 'JScatter', 'mdi:chart-scatter-plot', 100, NULL, '{\\r\\n  \\\"w\\\": 12,\\r\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"name\\\": 200,\\n      \\\"value\\\": 300\\n    },\\n    {\\n      \\\"name\\\": 400,\\n      \\\"value\\\": 500\\n    },\\n    {\\n      \\\"name\\\": 150,\\n      \\\"value\\\": 320\\n    },\\n    {\\n      \\\"name\\\": 320,\\n      \\\"value\\\": 320\\n    },\\n    {\\n      \\\"name\\\": 170,\\n      \\\"value\\\": 300\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"grid\\\": {\\n      \\\"show\\\": false,\\n      \\\"bottom\\\": 115\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"基础散点图\\\",\\n      \\\"show\\\": true,\\n      \\\"textStyle\\\": {\\r\\n\t\t\t\t\\\"fontWeight\\\":\\\"normal\\\"\\n      }\\n    },\\n    \\\"tooltip\\\": {\\n      \\\"trigger\\\": \\\"item\\\",\\n      \\\"formatter\\\": \\\"x:{b}<br/>y:{c}\\\",\\n      \\\"axisPointer\\\": {\\n        \\\"type\\\": \\\"shadow\\\",\\n        \\\"label\\\": {\\n          \\\"show\\\": true,\\n          \\\"backgroundColor\\\": \\\"#333\\\"\\n        }\\n      }\\n    },\\n    \\\"yAxis\\\": {\\n      \\\"splitLine\\\": {\\n        \\\"interval\\\": 2\\n      },\\n      \\\"lineStyle\\\": {\\n        \\\"color\\\": \\\"#f3f3f3\\\"\\n      }\\n    },\\n    \\\"series\\\": [\\n      {\\n        \\\"data\\\": [],\\n        \\\"type\\\": \\\"scatter\\\",\\n        \\\"symbolSize\\\": 20,\\r\\n        \\\"itemStyle\\\": {\\r\\n          \\\"color\\\": \\\"#64b5f6\\\"\\r\\n        }\\n      }\\n    ]\\n  }\\n}', '1', NULL, '2022-06-16 14:16:07', NULL, '2022-06-16 17:10:52');\nINSERT INTO `onl_drag_comp` VALUES ('1537318433201340417', '1537764868216684545', '金字塔漏斗图', 'JPyramidFunnel', 'icon-park-outline:children-pyramid', 100, NULL, '{\\r\\n  \\\"w\\\": 12,\\r\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/26/funnel\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"value\\\": 1000,\\n      \\\"name\\\": \\\"直接访问\\\"\\n    },\\n    {\\n      \\\"value\\\": 200,\\n      \\\"name\\\": \\\"邮件营销\\\"\\n    },\\n    {\\n      \\\"value\\\": 400,\\n      \\\"name\\\": \\\"联盟广告\\\"\\n    },\\n    {\\n      \\\"value\\\": 600,\\n      \\\"name\\\": \\\"网页查询\\\"\\n    },\\n    {\\n      \\\"value\\\": 800,\\n      \\\"name\\\": \\\"广告点击\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"基础漏斗图\\\",\\r\\n      \\\"textStyle\\\":{\\r\\n       \\\"fontWeight\\\":\\\"normal\\\"\\r\\n     },\\n      \\\"show\\\": true\\n    },\\n    \\\"grid\\\": {\\n      \\\"bottom\\\": 115\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"tooltip\\\": {\\n      \\\"trigger\\\": \\\"item\\\",\\n      \\\"formatter\\\": \\\"{a} <br/>{b} : {c}%\\\"\\n    },\\n    \\\"legend\\\": {\\n      \\\"orient\\\": \\\"horizontal\\\"\\n    },\\n    \\\"series\\\": [\\n      {\\n        \\\"name\\\": \\\"Funnel\\\",\\n        \\\"type\\\": \\\"funnel\\\",\\n        \\\"left\\\": \\\"10%\\\",\\n        \\\"width\\\": \\\"80%\\\",\\n        \\\"sort\\\": \\\"ascending\\\",\\n        \\\"gap\\\": 2,\\n        \\\"label\\\": {\\n          \\\"show\\\": true,\\n          \\\"position\\\": \\\"inside\\\"\\n        },\\n        \\\"labelLine\\\": {\\n          \\\"length\\\": 10,\\n          \\\"lineStyle\\\": {\\n            \\\"width\\\": 1,\\n            \\\"type\\\": \\\"solid\\\"\\n          }\\n        },\\n        \\\"itemStyle\\\": {\\n          \\\"borderColor\\\": \\\"#fff\\\",\\n          \\\"borderWidth\\\": 1\\n        },\\n        \\\"emphasis\\\": {\\n          \\\"label\\\": {\\n            \\\"fontSize\\\": 20\\n          }\\n        }\\n      }\\n    ]\\n  }\\n}', '1', NULL, '2022-06-16 14:17:31', NULL, '2022-06-16 14:59:44');\nINSERT INTO `onl_drag_comp` VALUES ('1537764165146476546', '200', '散点图', 'scatter', 'ant-design:dot-chart-outlined', 100, NULL, NULL, '1', NULL, '2022-06-17 19:48:42', NULL, '2022-06-17 19:49:24');\nINSERT INTO `onl_drag_comp` VALUES ('1537764868216684545', '200', '漏斗图', 'funnel', 'ant-design:funnel-plot-filled', 100, NULL, NULL, '1', NULL, '2022-06-17 19:51:30', NULL, '2022-06-17 19:51:52');\nINSERT INTO `onl_drag_comp` VALUES ('1537773244027863041', '1537773378102984706', '圆形雷达图', 'JCircleRadar', 'tabler:radar', 100, NULL, '{\\r\\n  \\\"w\\\": 12,\\r\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/radar\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"分组\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"value\\\": 75,\\n      \\\"name\\\": \\\"得分\\\",\\n      \\\"type\\\": \\\"NBA\\\",\\n      \\\"max\\\": 100\\n    },\\n    {\\n      \\\"value\\\": 65,\\n      \\\"name\\\": \\\"篮板\\\",\\n      \\\"type\\\": \\\"NBA\\\",\\n      \\\"max\\\": 100\\n    },\\n    {\\n      \\\"value\\\": 55,\\n      \\\"name\\\": \\\"防守\\\",\\n      \\\"type\\\": \\\"NBA\\\",\\n      \\\"max\\\": 100\\n    },\\n    {\\n      \\\"value\\\": 74,\\n      \\\"name\\\": \\\"失误\\\",\\n      \\\"type\\\": \\\"NBA\\\",\\n      \\\"max\\\": 100\\n    },\\n    {\\n      \\\"value\\\": 38,\\n      \\\"name\\\": \\\"盖帽\\\",\\n      \\\"type\\\": \\\"NBA\\\",\\n      \\\"max\\\": 100\\n    },\\n    {\\n      \\\"value\\\": 88,\\n      \\\"name\\\": \\\"三分\\\",\\n      \\\"type\\\": \\\"NBA\\\",\\n      \\\"max\\\": 100\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"grid\\\": {\\n      \\\"show\\\": false,\\n      \\\"bottom\\\": 115\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"圆形雷达图\\\",\\r\\n     \\\"textStyle\\\":{\\r\\n       \\\"fontWeight\\\":\\\"normal\\\"\\r\\n     },\\n      \\\"show\\\": true\\n    },\\n    \\\"legend\\\": {\\n      \\\"data\\\": []\\n    },\\n    \\\"radar\\\": [\\n      {\\n        \\\"indicator\\\": []\\n      }\\n    ],\\n    \\\"series\\\": [\\n      {\\n        \\\"type\\\": \\\"radar\\\",\\n        \\\"data\\\": []\\n      }\\n    ]\\n  }\\n}', '1', NULL, '2022-06-17 20:24:46', NULL, '2022-06-27 16:56:51');\nINSERT INTO `onl_drag_comp` VALUES ('1537773378102984706', '200', '雷达图', 'radar', 'ant-design:radar-chart-outlined', 100, NULL, NULL, '1', NULL, '2022-06-17 20:25:18', NULL, '2022-06-17 20:26:03');\nINSERT INTO `onl_drag_comp` VALUES ('200', '0', '图表', 'chart', 'ant-design:bar-chart-outlined', 1, NULL, '', '0', NULL, NULL, NULL, '2022-04-29 17:52:06');\nINSERT INTO `onl_drag_comp` VALUES ('200200', '200', '柱形图', '', 'ant-design:bar-chart-outlined', 1, NULL, '', '1', NULL, NULL, NULL, '2022-04-29 09:37:37');\nINSERT INTO `onl_drag_comp` VALUES ('200200201', '200200', '基础柱形图', 'JBar', 'ic:baseline-bar-chart', NULL, NULL, '{\\r\\n  \\\"w\\\": 12,\\r\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"name\\\": \\\"苹果\\\",\\n      \\\"value\\\": 1000879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"三星\\\",\\n      \\\"value\\\": 3400879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"小米\\\",\\n      \\\"value\\\": 2300879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"oppo\\\",\\n      \\\"value\\\": 5400879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"vivo\\\",\\n      \\\"value\\\": 3400879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"grid\\\": {\\n      \\\"show\\\": false,\\n      \\\"top\\\":90, \\n      \\\"bottom\\\": 115,\\r\\n\t\t\t\\\"containLabel\\\": true\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"基础柱形图\\\",\\n      \\\"show\\\": true,\\n      \\\"textStyle\\\": {\\r\\n\t\t\t\t\\\"fontWeight\\\":\\\"normal\\\"\\n      }\\n    },\\n    \\\"tooltip\\\": {\\n      \\\"trigger\\\": \\\"axis\\\",\\n      \\\"axisPointer\\\": {\\n        \\\"type\\\": \\\"shadow\\\",\\n        \\\"label\\\": {\\n          \\\"show\\\": true,\\n          \\\"backgroundColor\\\": \\\"#333\\\"\\n        }\\n      }\\n    },\\n    \\\"yAxis\\\": {\\n      \\\"splitLine\\\": {\\n        \\\"interval\\\": 2\\n      },\\n      \\\"lineStyle\\\": {\\n        \\\"color\\\": \\\"#f3f3f3\\\"\\n      }\\n    },\\n    \\\"series\\\": [\\n      {\\n        \\\"data\\\": [],\\n        \\\"type\\\": \\\"bar\\\",\\n        \\\"barWidth\\\": 40,\\n        \\\"itemStyle\\\": {\\n          \\\"color\\\": \\\"#64b5f6\\\",\\n          \\\"borderRadius\\\": 0\\n        }\\n      }\\n    ]\\n  }\\n}', '1', NULL, NULL, 'admin', '2022-08-04 19:18:21');\nINSERT INTO `onl_drag_comp` VALUES ('200200208', '200200', '基础条形图', 'JHorizontalBar', 'ic:baseline-bar-chart', NULL, NULL, '{\\r\\n  \\\"w\\\": 12,\\r\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"name\\\": \\\"苹果\\\",\\n      \\\"value\\\": 1000879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"三星\\\",\\n      \\\"value\\\": 3400879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"小米\\\",\\n      \\\"value\\\": 2300879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"oppo\\\",\\n      \\\"value\\\": 5400879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    },\\n    {\\n      \\\"name\\\": \\\"vivo\\\",\\n      \\\"value\\\": 3400879,\\n      \\\"type\\\": \\\"手机品牌\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"grid\\\": {\\n      \\\"show\\\": false,\\n      \\\"top\\\":40, \\n      \\\"bottom\\\": 40,\\r\\n\t\t\t\\\"containLabel\\\": true\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"基础条形图\\\",\\n      \\\"show\\\": true,\\n      \\\"textStyle\\\": {\\n        \\\"color\\\": \\\"#464646\\\",\\r\\n\t\t\t\t\\\"fontWeight\\\":\\\"normal\\\"\\n      }\\n    },\\n    \\\"tooltip\\\": {\\n      \\\"trigger\\\": \\\"axis\\\",\\n      \\\"axisPointer\\\": {\\n        \\\"type\\\": \\\"shadow\\\",\\n        \\\"label\\\": {\\n          \\\"show\\\": true,\\n          \\\"backgroundColor\\\": \\\"#333\\\"\\n        }\\n      }\\n    },\\n    \\\"yAxis\\\": {\\r\\n\t\t  \\\"type\\\": \\\"category\\\",\\n      \\\"splitLine\\\": {\\n        \\\"interval\\\": 2\\n      },\\n      \\\"lineStyle\\\": {\\n        \\\"color\\\": \\\"#f3f3f3\\\"\\n      }\\n    },\\n    \\\"series\\\": [\\n      {\\n        \\\"data\\\": [],\\n        \\\"type\\\": \\\"bar\\\",\\n        \\\"barWidth\\\": 20,\\n        \\\"itemStyle\\\": {\\n          \\\"color\\\": \\\"#64b5f6\\\",\\n          \\\"borderRadius\\\": 0\\n        }\\n      }\\n    ]\\n  }\\n}', '1', NULL, NULL, 'admin', '2022-08-04 19:18:21');\nINSERT INTO `onl_drag_comp` VALUES ('200201', '200', '饼图', 'JPie', 'ant-design:pie-chart-outlined', 2, NULL, '{\\r\\n  \\\"w\\\": 12,\\r\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": -1,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"value\\\": 1048,\\n      \\\"name\\\": \\\"vivo\\\"\\n    },\\n    {\\n      \\\"value\\\": 735,\\n      \\\"name\\\": \\\"oppo\\\"\\n    },\\n    {\\n      \\\"value\\\": 580,\\n      \\\"name\\\": \\\"苹果\\\"\\n    },\\n    {\\n      \\\"value\\\": 484,\\n      \\\"name\\\": \\\"小米\\\"\\n    },\\n    {\\n      \\\"value\\\": 300,\\n      \\\"name\\\": \\\"三星\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"grid\\\": {\\n      \\\"show\\\": false,\\n      \\\"bottom\\\": 115\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"基础饼图\\\",\\n      \\\"subtext\\\": \\\"\\\",\\n      \\\"left\\\": \\\"left\\\",\\r\\n\t\t\t\\\"textStyle\\\":{\\r\\n\t\t\t  \\\"fontWeight\\\":\\\"normal\\\"\\r\\n\t\t\t},\\n      \\\"show\\\": true\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"tooltip\\\": {\\n      \\\"trigger\\\": \\\"item\\\"\\n    },\\n    \\\"legend\\\": {\\n      \\\"orient\\\": \\\"vertical\\\"\\n    },\\n    \\\"series\\\": [\\n      {\\n        \\\"name\\\": \\\"\\\",\\n        \\\"type\\\": \\\"pie\\\",\\n        \\\"radius\\\": \\\"50%\\\",\\n        \\\"data\\\": [],\\n        \\\"emphasis\\\": {\\n          \\\"itemStyle\\\": {\\n            \\\"shadowBlur\\\": 10,\\n            \\\"shadowOffsetX\\\": 0,\\n            \\\"shadowColor\\\": \\\"rgba(0, 0, 0, 0.5)\\\"\\n          }\\n        }\\n      }\\n    ]\\n  }\\n}', '1', NULL, NULL, 'admin', '2022-05-23 14:07:29');\nINSERT INTO `onl_drag_comp` VALUES ('200202', '1537002903949037570', '基础折线图', 'JLine', 'teenyicons:area-chart-outline', 1, NULL, '{\\r\\n  \\\"w\\\": 12,\\r\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"value\\\": 1000,\\n      \\\"name\\\": \\\"联想\\\"\\n    },\\n    {\\n      \\\"value\\\": 7350,\\n      \\\"name\\\": \\\"小米\\\"\\n    },\\n    {\\n      \\\"value\\\": 5800,\\n      \\\"name\\\": \\\"华为\\\"\\n    },\\n    {\\n      \\\"value\\\": 6000,\\n      \\\"name\\\": \\\"苹果\\\"\\n    },\\n    {\\n      \\\"value\\\": 3000,\\n      \\\"name\\\": \\\"戴尔\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"grid\\\": {\\n      \\\"show\\\": false,\\n      \\\"bottom\\\": 115,\\n          \\\"top\\\":90\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"基础折线图\\\",\\r\\n\t\t\t\\\"textStyle\\\":{\\r\\n\t\t\t  \\\"fontWeight\\\":\\\"normal\\\"\\r\\n\t\t\t},\\n      \\\"subtext\\\": \\\"\\\",\\n      \\\"left\\\": 10\\n    },\\n    \\\"series\\\": [\\n      {\\n        \\\"data\\\": [],\\n        \\\"type\\\": \\\"line\\\",\\r\\n         \\\"itemStyle\\\": {\\r\\n          \\\"color\\\": \\\"#64b5f6\\\"\\r\\n        }\\n      }\\n    ]\\n  }\\n}', '1', NULL, NULL, 'admin', '2022-08-04 19:20:12');\nINSERT INTO `onl_drag_comp` VALUES ('200203', '200', '南丁格尔玫瑰图', 'JRose', 'ant-design:pie-chart-outlined', 2, NULL, '{\\r\\n  \\\"w\\\": 12,\\r\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": -1,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"value\\\": 1048,\\n      \\\"name\\\": \\\"vivo\\\"\\n    },\\n    {\\n      \\\"value\\\": 735,\\n      \\\"name\\\": \\\"oppo\\\"\\n    },\\n    {\\n      \\\"value\\\": 580,\\n      \\\"name\\\": \\\"苹果\\\"\\n    },\\n    {\\n      \\\"value\\\": 484,\\n      \\\"name\\\": \\\"小米\\\"\\n    },\\n    {\\n      \\\"value\\\": 300,\\n      \\\"name\\\": \\\"三星\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"grid\\\": {\\n      \\\"show\\\": false,\\n      \\\"bottom\\\": 115\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"基础饼图\\\",\\n      \\\"subtext\\\": \\\"\\\",\\n      \\\"left\\\": \\\"left\\\",\\r\\n\t\t\t\\\"textStyle\\\":{\\r\\n\t\t\t  \\\"fontWeight\\\":\\\"normal\\\"\\r\\n\t\t\t},\\n      \\\"show\\\": true\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"tooltip\\\": {\\n      \\\"trigger\\\": \\\"item\\\"\\n    },\\n    \\\"legend\\\": {\\n      \\\"orient\\\": \\\"vertical\\\"\\n    },\\n    \\\"series\\\": [\\n      {\\n        \\\"name\\\": \\\"南丁格尔玫瑰\\\",\\n        \\\"type\\\": \\\"pie\\\",\\n        \\\"radius\\\": \\\"50%\\\",\\r\\n        \\\"roseType\\\": \\\"radius\\\",\\n        \\\"data\\\": [],\\n        \\\"emphasis\\\": {\\n          \\\"itemStyle\\\": {\\n            \\\"shadowBlur\\\": 10,\\n            \\\"shadowOffsetX\\\": 0,\\n            \\\"shadowColor\\\": \\\"rgba(0, 0, 0, 0.5)\\\"\\n          }\\n        }\\n      }\\n    ]\\n  }\\n}', '1', NULL, NULL, 'admin', '2022-05-23 14:07:29');\nINSERT INTO `onl_drag_comp` VALUES ('200204', '1537773378102984706', '普通雷达图', 'JRadar', 'ant-design:radar-chart-outlined', 4, NULL, '{\\r\\n  \\\"w\\\": 12,\\r\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/radar\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"分组\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"value\\\": 75,\\n      \\\"name\\\": \\\"得分\\\",\\n      \\\"type\\\": \\\"NBA\\\",\\n      \\\"max\\\": 100\\n    },\\n    {\\n      \\\"value\\\": 65,\\n      \\\"name\\\": \\\"篮板\\\",\\n      \\\"type\\\": \\\"NBA\\\",\\n      \\\"max\\\": 100\\n    },\\n    {\\n      \\\"value\\\": 55,\\n      \\\"name\\\": \\\"防守\\\",\\n      \\\"type\\\": \\\"NBA\\\",\\n      \\\"max\\\": 100\\n    },\\n    {\\n      \\\"value\\\": 74,\\n      \\\"name\\\": \\\"失误\\\",\\n      \\\"type\\\": \\\"NBA\\\",\\n      \\\"max\\\": 100\\n    },\\n    {\\n      \\\"value\\\": 38,\\n      \\\"name\\\": \\\"盖帽\\\",\\n      \\\"type\\\": \\\"NBA\\\",\\n      \\\"max\\\": 100\\n    },\\n    {\\n      \\\"value\\\": 88,\\n      \\\"name\\\": \\\"三分\\\",\\n      \\\"type\\\": \\\"NBA\\\",\\n      \\\"max\\\": 100\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"grid\\\": {\\n      \\\"show\\\": false,\\n      \\\"bottom\\\": 115\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"基础雷达图\\\",\\r\\n\t\t\t\\\"textStyle\\\":{\\r\\n\t\t\t  \\\"fontWeight\\\":\\\"normal\\\"\\r\\n\t\t\t},\\n      \\\"show\\\": true\\n    },\\n    \\\"legend\\\": {\\n      \\\"data\\\": []\\n    },\\n    \\\"radar\\\": [\\n      {\\n        \\\"indicator\\\": []\\n      }\\n    ],\\n    \\\"series\\\": [\\n      {\\n        \\\"type\\\": \\\"radar\\\",\\n        \\\"data\\\": []\\n      }\\n    ]\\n  }\\n}', '1', NULL, NULL, 'admin', '2022-06-17 20:25:47');\nINSERT INTO `onl_drag_comp` VALUES ('200205', '200', '环形图', 'JRing', 'mdi:chart-donut', 5, NULL, '{\\r\\n  \\\"w\\\": 12,\\r\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"value\\\": 1048,\\n      \\\"name\\\": \\\"oppo\\\"\\n    },\\n    {\\n      \\\"value\\\": 735,\\n      \\\"name\\\": \\\"vivo\\\"\\n    },\\n    {\\n      \\\"value\\\": 580,\\n      \\\"name\\\": \\\"苹果\\\"\\n    },\\n    {\\n      \\\"value\\\": 484,\\n      \\\"name\\\": \\\"小米\\\"\\n    },\\n    {\\n      \\\"value\\\": 300,\\n      \\\"name\\\": \\\"三星\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"grid\\\": {\\n      \\\"show\\\": false,\\n      \\\"bottom\\\": 115\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"基础环形图\\\",\\r\\n\t\t\t\\\"textStyle\\\":{\\r\\n\t\t\t  \\\"fontWeight\\\":\\\"normal\\\"\\r\\n\t\t\t},\\n      \\\"show\\\": true\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"tooltip\\\": {\\n      \\\"trigger\\\": \\\"item\\\"\\n    },\\n    \\\"series\\\": [\\n      {\\n        \\\"name\\\": \\\"Access From\\\",\\n        \\\"type\\\": \\\"pie\\\",\\n        \\\"radius\\\": [\\n          \\\"40%\\\",\\n          \\\"70%\\\"\\n        ],\\n        \\\"avoidLabelOverlap\\\": false,\\n        \\\"label\\\": {\\n          \\\"show\\\": false,\\n          \\\"position\\\": \\\"center\\\"\\n        },\\n        \\\"emphasis\\\": {\\n          \\\"label\\\": {\\n            \\\"show\\\": true,\\n            \\\"fontWeight\\\": \\\"bold\\\",\\r\\n\t\t\t\t\t\t\\\"fontSize\\\": 14\\n          }\\n        },\\n        \\\"labelLine\\\": {\\n          \\\"show\\\": false\\n        },\\n        \\\"data\\\": []\\n      }\\n    ]\\n  }\\n}', '1', NULL, NULL, 'admin', '2022-04-22 19:05:11');\nINSERT INTO `onl_drag_comp` VALUES ('200206', '200', '面积图', 'JArea', 'teenyicons:area-chart-solid', 6, NULL, '{\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": -1,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"value\\\": 1048,\\n      \\\"name\\\": \\\"华为\\\"\\n    },\\n    {\\n      \\\"value\\\": 605,\\n      \\\"name\\\": \\\"vivo\\\"\\n    },\\n    {\\n      \\\"value\\\": 580,\\n      \\\"name\\\": \\\"oppo\\\"\\n    },\\n    {\\n      \\\"value\\\": 484,\\n      \\\"name\\\": \\\"苹果\\\"\\n    },\\n    {\\n      \\\"value\\\": 300,\\n      \\\"name\\\": \\\"小米\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"grid\\\": {\\n      \\\"bottom\\\": 115\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"基础面积图\\\",\\r\\n\t\t\t\\\"textStyle\\\":{\\r\\n\t\t\t  \\\"fontWeight\\\":\\\"normal\\\"\\r\\n\t\t\t},\\n      \\\"show\\\": true\\n    },\\n    \\\"xAxis\\\": {\\n      \\\"boundaryGap\\\": false,\\n      \\\"data\\\": []\\n    },\\n    \\\"series\\\": [\\n      {\\n        \\\"data\\\": [],\\n        \\\"type\\\": \\\"line\\\",\\n        \\\"areaStyle\\\": {}\\n      }\\n    ]\\n  }\\n}', '1', NULL, NULL, 'admin', '2022-04-22 19:04:01');\nINSERT INTO `onl_drag_comp` VALUES ('200207', '200', '象形图', 'JPictorialBar', 'ant-design:dot-chart-outlined', 10, NULL, '{\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/26/pictogram\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"name\\\": \\\"驯鹿\\\",\\n      \\\"value\\\": 123,\\n      \\\"symbol\\\": \\\"path://M-22.788,24.521c2.08-0.986,3.611-3.905,4.984-5.892 c-2.686,2.782-5.047,5.884-9.102,7.312c-0.992,0.005-0.25-2.016,0.34-2.362l1.852-0.41c0.564-0.218,0.785-0.842,0.902-1.347 c2.133-0.727,4.91-4.129,6.031-6.194c1.748-0.7,4.443-0.679,5.734-2.293c1.176-1.468,0.393-3.992,1.215-6.557 c0.24-0.754,0.574-1.581,1.008-2.293c-0.611,0.011-1.348-0.061-1.959-0.608c-1.391-1.245-0.785-2.086-1.297-3.313 c1.684,0.744,2.5,2.584,4.426,2.586C-8.46,3.012-8.255,2.901-8.04,2.824c6.031-1.952,15.182-0.165,19.498-3.937 c1.15-3.933-1.24-9.846-1.229-9.938c0.008-0.062-1.314-0.004-1.803-0.258c-1.119-0.771-6.531-3.75-0.17-3.33 c0.314-0.045,0.943,0.259,1.439,0.435c-0.289-1.694-0.92-0.144-3.311-1.946c0,0-1.1-0.855-1.764-1.98 c-0.836-1.09-2.01-2.825-2.992-4.031c-1.523-2.476,1.367,0.709,1.816,1.108c1.768,1.704,1.844,3.281,3.232,3.983 c0.195,0.203,1.453,0.164,0.926-0.468c-0.525-0.632-1.367-1.278-1.775-2.341c-0.293-0.703-1.311-2.326-1.566-2.711 c-0.256-0.384-0.959-1.718-1.67-2.351c-1.047-1.187-0.268-0.902,0.521-0.07c0.789,0.834,1.537,1.821,1.672,2.023 c0.135,0.203,1.584,2.521,1.725,2.387c0.102-0.259-0.035-0.428-0.158-0.852c-0.125-0.423-0.912-2.032-0.961-2.083 c-0.357-0.852-0.566-1.908-0.598-3.333c0.4-2.375,0.648-2.486,0.549-0.705c0.014,1.143,0.031,2.215,0.602,3.247 c0.807,1.496,1.764,4.064,1.836,4.474c0.561,3.176,2.904,1.749,2.281-0.126c-0.068-0.446-0.109-2.014-0.287-2.862 c-0.18-0.849-0.219-1.688-0.113-3.056c0.066-1.389,0.232-2.055,0.277-2.299c0.285-1.023,0.4-1.088,0.408,0.135 c-0.059,0.399-0.131,1.687-0.125,2.655c0.064,0.642-0.043,1.768,0.172,2.486c0.654,1.928-0.027,3.496,1,3.514 c1.805-0.424,2.428-1.218,2.428-2.346c-0.086-0.704-0.121-0.843-0.031-1.193c0.221-0.568,0.359-0.67,0.312-0.076 c-0.055,0.287,0.031,0.533,0.082,0.794c0.264,1.197,0.912,0.114,1.283-0.782c0.15-0.238,0.539-2.154,0.545-2.522 c-0.023-0.617,0.285-0.645,0.309,0.01c0.064,0.422-0.248,2.646-0.205,2.334c-0.338,1.24-1.105,3.402-3.379,4.712 c-0.389,0.12-1.186,1.286-3.328,2.178c0,0,1.729,0.321,3.156,0.246c1.102-0.19,3.707-0.027,4.654,0.269 c1.752,0.494,1.531-0.053,4.084,0.164c2.26-0.4,2.154,2.391-1.496,3.68c-2.549,1.405-3.107,1.475-2.293,2.984 c3.484,7.906,2.865,13.183,2.193,16.466c2.41,0.271,5.732-0.62,7.301,0.725c0.506,0.333,0.648,1.866-0.457,2.86 c-4.105,2.745-9.283,7.022-13.904,7.662c-0.977-0.194,0.156-2.025,0.803-2.247l1.898-0.03c0.596-0.101,0.936-0.669,1.152-1.139 c3.16-0.404,5.045-3.775,8.246-4.818c-4.035-0.718-9.588,3.981-12.162,1.051c-5.043,1.423-11.449,1.84-15.895,1.111 c-3.105,2.687-7.934,4.021-12.115,5.866c-3.271,3.511-5.188,8.086-9.967,10.414c-0.986,0.119-0.48-1.974,0.066-2.385l1.795-0.618 C-22.995,25.682-22.849,25.035-22.788,24.521z\\\",\\n      \\\"symbolSize\\\": [\\n        60,\\n        60\\n      ]\\n    },\\n    {\\n      \\\"name\\\": \\\"飞机\\\",\\n      \\\"value\\\": 60,\\n      \\\"symbol\\\": \\\"path://M1.112,32.559l2.998,1.205l-2.882,2.268l-2.215-0.012L1.112,32.559z M37.803,23.96 c0.158-0.838,0.5-1.509,0.961-1.904c-0.096-0.037-0.205-0.071-0.344-0.071c-0.777-0.005-2.068-0.009-3.047-0.009 c-0.633,0-1.217,0.066-1.754,0.18l2.199,1.804H37.803z M39.738,23.036c-0.111,0-0.377,0.325-0.537,0.924h1.076 C40.115,23.361,39.854,23.036,39.738,23.036z M39.934,39.867c-0.166,0-0.674,0.705-0.674,1.986s0.506,1.986,0.674,1.986 s0.672-0.705,0.672-1.986S40.102,39.867,39.934,39.867z M38.963,38.889c-0.098-0.038-0.209-0.07-0.348-0.073 c-0.082,0-0.174,0-0.268-0.001l-7.127,4.671c0.879,0.821,2.42,1.417,4.348,1.417c0.979,0,2.27-0.006,3.047-0.01 c0.139,0,0.25-0.034,0.348-0.072c-0.646-0.555-1.07-1.643-1.07-2.967C37.891,40.529,38.316,39.441,38.963,38.889z M32.713,23.96 l-12.37-10.116l-4.693-0.004c0,0,4,8.222,4.827,10.121H32.713z M59.311,32.374c-0.248,2.104-5.305,3.172-8.018,3.172H39.629 l-25.325,16.61L9.607,52.16c0,0,6.687-8.479,7.95-10.207c1.17-1.6,3.019-3.699,3.027-6.407h-2.138 c-5.839,0-13.816-3.789-18.472-5.583c-2.818-1.085-2.396-4.04-0.031-4.04h0.039l-3.299-11.371h3.617c0,0,4.352,5.696,5.846,7.5 c2,2.416,4.503,3.678,8.228,3.87h30.727c2.17,0,4.311,0.417,6.252,1.046c3.49,1.175,5.863,2.7,7.199,4.027 C59.145,31.584,59.352,32.025,59.311,32.374z M22.069,30.408c0-0.815-0.661-1.475-1.469-1.475c-0.812,0-1.471,0.66-1.471,1.475 s0.658,1.475,1.471,1.475C21.408,31.883,22.069,31.224,22.069,30.408z M27.06,30.408c0-0.815-0.656-1.478-1.466-1.478 c-0.812,0-1.471,0.662-1.471,1.478s0.658,1.477,1.471,1.477C26.404,31.885,27.06,31.224,27.06,30.408z M32.055,30.408 c0-0.815-0.66-1.475-1.469-1.475c-0.808,0-1.466,0.66-1.466,1.475s0.658,1.475,1.466,1.475 C31.398,31.883,32.055,31.224,32.055,30.408z M37.049,30.408c0-0.815-0.658-1.478-1.467-1.478c-0.812,0-1.469,0.662-1.469,1.478 s0.656,1.477,1.469,1.477C36.389,31.885,37.049,31.224,37.049,30.408z M42.039,30.408c0-0.815-0.656-1.478-1.465-1.478 c-0.811,0-1.469,0.662-1.469,1.478s0.658,1.477,1.469,1.477C41.383,31.885,42.039,31.224,42.039,30.408z M55.479,30.565 c-0.701-0.436-1.568-0.896-2.627-1.347c-0.613,0.289-1.551,0.476-2.73,0.476c-1.527,0-1.639,2.263,0.164,2.316 C52.389,32.074,54.627,31.373,55.479,30.565z\\\",\\n      \\\"symbolSize\\\": [\\n        65,\\n        35\\n      ]\\n    },\\n    {\\n      \\\"name\\\": \\\"火箭\\\",\\n      \\\"value\\\": 25,\\n      \\\"symbol\\\": \\\"path://M-244.396,44.399c0,0,0.47-2.931-2.427-6.512c2.819-8.221,3.21-15.709,3.21-15.709s5.795,1.383,5.795,7.325C-237.818,39.679-244.396,44.399-244.396,44.399z M-260.371,40.827c0,0-3.881-12.946-3.881-18.319c0-2.416,0.262-4.566,0.669-6.517h17.684c0.411,1.952,0.675,4.104,0.675,6.519c0,5.291-3.87,18.317-3.87,18.317H-260.371z M-254.745,18.951c-1.99,0-3.603,1.676-3.603,3.744c0,2.068,1.612,3.744,3.603,3.744c1.988,0,3.602-1.676,3.602-3.744S-252.757,18.951-254.745,18.951z M-255.521,2.228v-5.098h1.402v4.969c1.603,1.213,5.941,5.069,7.901,12.5h-17.05C-261.373,7.373-257.245,3.558-255.521,2.228zM-265.07,44.399c0,0-6.577-4.721-6.577-14.896c0-5.942,5.794-7.325,5.794-7.325s0.393,7.488,3.211,15.708C-265.539,41.469-265.07,44.399-265.07,44.399z M-252.36,45.15l-1.176-1.22L-254.789,48l-1.487-4.069l-1.019,2.116l-1.488-3.826h8.067L-252.36,45.15z\\\",\\n      \\\"symbolSize\\\": [\\n        50,\\n        60\\n      ]\\n    },\\n    {\\n      \\\"name\\\": \\\"高铁\\\",\\n      \\\"value\\\": 18,\\n      \\\"symbol\\\": \\\"path://M67.335,33.596L67.335,33.596c-0.002-1.39-1.153-3.183-3.328-4.218h-9.096v-2.07h5.371 c-4.939-2.07-11.199-4.141-14.89-4.141H19.72v12.421v5.176h38.373c4.033,0,8.457-1.035,9.142-5.176h-0.027 c0.076-0.367,0.129-0.751,0.129-1.165L67.335,33.596L67.335,33.596z M27.999,30.413h-3.105v-4.141h3.105V30.413z M35.245,30.413 h-3.104v-4.141h3.104V30.413z M42.491,30.413h-3.104v-4.141h3.104V30.413z M49.736,30.413h-3.104v-4.141h3.104V30.413z  M14.544,40.764c1.143,0,2.07-0.927,2.07-2.07V35.59V25.237c0-1.145-0.928-2.07-2.07-2.07H-9.265c-1.143,0-2.068,0.926-2.068,2.07 v10.351v3.105c0,1.144,0.926,2.07,2.068,2.07H14.544L14.544,40.764z M8.333,26.272h3.105v4.141H8.333V26.272z M1.087,26.272h3.105 v4.141H1.087V26.272z M-6.159,26.272h3.105v4.141h-3.105V26.272z M-9.265,41.798h69.352v1.035H-9.265V41.798z\\\",\\n      \\\"symbolSize\\\": [\\n        50,\\n        30\\n      ]\\n    },\\n    {\\n      \\\"name\\\": \\\"轮船\\\",\\n      \\\"value\\\": 12,\\n      \\\"symbol\\\": \\\"path://M16.678,17.086h9.854l-2.703,5.912c5.596,2.428,11.155,5.575,16.711,8.607c3.387,1.847,6.967,3.75,10.541,5.375 v-6.16l-4.197-2.763v-5.318L33.064,12.197h-11.48L20.43,15.24h-4.533l-1.266,3.286l0.781,0.345L16.678,17.086z M49.6,31.84 l0.047,1.273L27.438,20.998l0.799-1.734L49.6,31.84z M33.031,15.1l12.889,8.82l0.027,0.769L32.551,16.1L33.031,15.1z M22.377,14.045 h9.846l-1.539,3.365l-2.287-1.498h1.371l0.721-1.352h-2.023l-0.553,1.037l-0.541-0.357h-0.34l0.359-0.684h-2.025l-0.361,0.684 h-3.473L22.377,14.045z M23.695,20.678l-0.004,0.004h0.004V20.678z M24.828,18.199h-2.031l-0.719,1.358h2.029L24.828,18.199z  M40.385,34.227c-12.85-7.009-25.729-14.667-38.971-12.527c1.26,8.809,9.08,16.201,8.213,24.328 c-0.553,4.062-3.111,0.828-3.303,7.137c15.799,0,32.379,0,48.166,0l0.066-4.195l1.477-7.23 C50.842,39.812,45.393,36.961,40.385,34.227z M13.99,35.954c-1.213,0-2.195-1.353-2.195-3.035c0-1.665,0.98-3.017,2.195-3.017 c1.219,0,2.195,1.352,2.195,3.017C16.186,34.604,15.213,35.954,13.99,35.954z M23.691,20.682h-2.02l-0.588,1.351h2.023 L23.691,20.682z M19.697,18.199l-0.721,1.358h2.025l0.727-1.358H19.697z\\\",\\n      \\\"symbolSize\\\": [\\n        50,\\n        35\\n      ]\\n    },\\n    {\\n      \\\"name\\\": \\\"汽车\\\",\\n      \\\"value\\\": 9,\\n      \\\"symbol\\\": \\\"path://M49.592,40.883c-0.053,0.354-0.139,0.697-0.268,0.963c-0.232,0.475-0.455,0.519-1.334,0.475 c-1.135-0.053-2.764,0-4.484,0.068c0,0.476,0.018,0.697,0.018,0.697c0.111,1.299,0.697,1.342,0.931,1.342h3.7 c0.326,0,0.628,0,0.861-0.154c0.301-0.196,0.43-0.772,0.543-1.78c0.017-0.146,0.025-0.336,0.033-0.56v-0.01 c0-0.068,0.008-0.154,0.008-0.25V41.58l0,0C49.6,41.348,49.6,41.09,49.592,40.883L49.592,40.883z M6.057,40.883 c0.053,0.354,0.137,0.697,0.268,0.963c0.23,0.475,0.455,0.519,1.334,0.475c1.137-0.053,2.762,0,4.484,0.068 c0,0.476-0.018,0.697-0.018,0.697c-0.111,1.299-0.697,1.342-0.93,1.342h-3.7c-0.328,0-0.602,0-0.861-0.154 c-0.309-0.18-0.43-0.772-0.541-1.78c-0.018-0.146-0.027-0.336-0.035-0.56v-0.01c0-0.068-0.008-0.154-0.008-0.25V41.58l0,0 C6.057,41.348,6.057,41.09,6.057,40.883L6.057,40.883z M49.867,32.766c0-2.642-0.344-5.224-0.482-5.507 c-0.104-0.207-0.766-0.749-2.271-1.773c-1.522-1.042-1.487-0.887-1.766-1.566c0.25-0.078,0.492-0.224,0.639-0.241 c0.326-0.034,0.345,0.274,1.023,0.274c0.68,0,2.152-0.18,2.453-0.48c0.301-0.303,0.396-0.405,0.396-0.672 c0-0.268-0.156-0.818-0.447-1.146c-0.293-0.327-1.541-0.49-2.273-0.585c-0.729-0.095-0.834,0-1.022,0.121 c-0.304,0.189-0.32,1.919-0.32,1.919l-0.713,0.018c-0.465-1.146-1.11-3.452-2.117-5.269c-1.103-1.979-2.256-2.599-2.737-2.754 c-0.474-0.146-0.904-0.249-4.131-0.576c-3.298-0.344-5.922-0.388-8.262-0.388c-2.342,0-4.967,0.052-8.264,0.388 c-3.229,0.336-3.66,0.43-4.133,0.576s-1.633,0.775-2.736,2.754c-1.006,1.816-1.652,4.123-2.117,5.269L9.87,23.109 c0,0-0.008-1.729-0.318-1.919c-0.189-0.121-0.293-0.225-1.023-0.121c-0.732,0.104-1.98,0.258-2.273,0.585 c-0.293,0.327-0.447,0.878-0.447,1.146c0,0.267,0.094,0.379,0.396,0.672c0.301,0.301,1.773,0.48,2.453,0.48 c0.68,0,0.697-0.309,1.023-0.274c0.146,0.018,0.396,0.163,0.637,0.241c-0.283,0.68-0.24,0.524-1.764,1.566 c-1.506,1.033-2.178,1.566-2.271,1.773c-0.139,0.283-0.482,2.865-0.482,5.508s0.189,5.02,0.189,5.86c0,0.354,0,0.976,0.076,1.565 c0.053,0.354,0.129,0.697,0.268,0.966c0.232,0.473,0.447,0.516,1.334,0.473c1.137-0.051,2.779,0,4.477,0.07 c1.135,0.043,2.297,0.086,3.33,0.11c2.582,0.051,1.826-0.379,2.928-0.36c1.102,0.016,5.447,0.196,9.424,0.196 c3.976,0,8.332-0.182,9.423-0.196c1.102-0.019,0.346,0.411,2.926,0.36c1.033-0.018,2.195-0.067,3.332-0.11 c1.695-0.062,3.348-0.121,4.477-0.07c0.886,0.043,1.103,0,1.332-0.473c0.132-0.269,0.218-0.611,0.269-0.966 c0.086-0.592,0.078-1.213,0.078-1.565C49.678,37.793,49.867,35.408,49.867,32.766L49.867,32.766z M13.219,19.735 c0.412-0.964,1.652-2.9,2.256-3.244c0.145-0.087,1.426-0.491,4.637-0.706c2.953-0.198,6.217-0.276,7.73-0.276 c1.513,0,4.777,0.078,7.729,0.276c3.201,0.215,4.502,0.611,4.639,0.706c0.775,0.533,1.842,2.28,2.256,3.244 c0.412,0.965,0.965,2.858,0.861,3.116c-0.104,0.258,0.104,0.388-1.291,0.275c-1.387-0.103-10.088-0.216-14.185-0.216 c-4.088,0-12.789,0.113-14.184,0.216c-1.395,0.104-1.188-0.018-1.291-0.275C12.254,22.593,12.805,20.708,13.219,19.735 L13.219,19.735z M16.385,30.511c-0.619,0.155-0.988,0.491-1.764,0.482c-0.775,0-2.867-0.353-3.314-0.371 c-0.447-0.017-0.842,0.302-1.076,0.362c-0.23,0.06-0.688-0.104-1.377-0.318c-0.688-0.216-1.092-0.155-1.316-1.094 c-0.232-0.93,0-2.264,0-2.264c1.488-0.068,2.928,0.069,5.621,0.826c2.693,0.758,4.191,2.213,4.191,2.213 S17.004,30.357,16.385,30.511L16.385,30.511z M36.629,37.293c-1.23,0.164-6.386,0.207-8.794,0.207c-2.412,0-7.566-0.051-8.799-0.207 c-1.256-0.164-2.891-1.67-1.764-2.865c1.523-1.627,1.24-1.576,4.701-2.023C24.967,32.018,27.239,32,27.834,32 c0.584,0,2.865,0.025,5.859,0.404c3.461,0.447,3.178,0.396,4.699,2.022C39.521,35.623,37.887,37.129,36.629,37.293L36.629,37.293z  M48.129,29.582c-0.232,0.93-0.629,0.878-1.318,1.093c-0.688,0.216-1.145,0.371-1.377,0.319c-0.231-0.053-0.627-0.371-1.074-0.361 c-0.448,0.018-2.539,0.37-3.313,0.37c-0.772,0-1.146-0.328-1.764-0.481c-0.621-0.154-0.966-0.154-0.966-0.154 s1.49-1.464,4.191-2.213c2.693-0.758,4.131-0.895,5.621-0.826C48.129,27.309,48.361,28.643,48.129,29.582L48.129,29.582z\\\",\\n      \\\"symbolSize\\\": [\\n        40,\\n        30\\n      ]\\n    },\\n    {\\n      \\\"name\\\": \\\"跑步\\\",\\n      \\\"value\\\": 2,\\n      \\\"symbol\\\": \\\"path://M13.676,32.955c0.919-0.031,1.843-0.008,2.767-0.008v0.007c0.827,0,1.659,0.041,2.486-0.019 c0.417-0.028,1.118,0.325,1.14-0.545c0.014-0.637-0.156-1.279-0.873-1.367c-1.919-0.241-3.858-0.233-5.774,0.019 c-0.465,0.062-0.998,0.442-0.832,1.069C12.715,32.602,13.045,32.977,13.676,32.955z M14.108,29.013 c1.47-0.007,2.96-0.122,4.414,0.035c1.792,0.192,3.1-0.412,4.273-2.105c-3.044,0-5.882,0.014-8.719-0.01 c-0.768-0.005-1.495,0.118-1.461,1C12.642,28.731,13.329,29.014,14.108,29.013z M23.678,36.593c-0.666-0.69-1.258-1.497-2.483-1.448 c-2.341,0.095-4.689,0.051-7.035,0.012c-0.834-0.014-1.599,0.177-1.569,1.066c0.031,0.854,0.812,1.062,1.636,1.043 c1.425-0.033,2.852-0.01,4.278-0.01v-0.01c1.562,0,3.126,0.008,4.691-0.005C23.614,37.239,24.233,37.174,23.678,36.593z  M32.234,42.292h-0.002c-1.075,0.793-2.589,0.345-3.821,1.048c-0.359,0.193-0.663,0.465-0.899,0.799 c-1.068,1.623-2.052,3.301-3.117,4.928c-0.625,0.961-0.386,1.805,0.409,2.395c0.844,0.628,1.874,0.617,2.548-0.299 c1.912-2.573,3.761-5.197,5.621-7.814C33.484,42.619,33.032,42.387,32.234,42.292z M43.527,28.401 c-0.688-1.575-2.012-0.831-3.121-0.895c-1.047-0.058-2.119,1.128-3.002,0.345c-0.768-0.677-1.213-1.804-1.562-2.813 c-0.45-1.305-1.495-2.225-2.329-3.583c2.953,1.139,4.729,0.077,5.592-1.322c0.99-1.61,0.718-3.725-0.627-4.967 c-1.362-1.255-3.414-1.445-4.927-0.452c-1.933,1.268-2.206,2.893-0.899,6.11c-2.098-0.659-3.835-1.654-5.682-2.383 c-0.735-0.291-1.437-1.017-2.293-0.666c-2.263,0.927-4.522,1.885-6.723,2.95c-1.357,0.658-1.649,1.593-1.076,2.638 c0.462,0.851,1.643,1.126,2.806,0.617c0.993-0.433,1.994-0.857,2.951-1.374c1.599-0.86,3.044-0.873,4.604,0.214 c1.017,0.707,0.873,1.137,0.123,1.849c-1.701,1.615-3.516,3.12-4.933,5.006c-1.042,1.388-0.993,2.817,0.255,4.011 c1.538,1.471,3.148,2.869,4.708,4.315c0.485,0.444,0.907,0.896-0.227,1.104c-1.523,0.285-3.021,0.694-4.538,1.006 c-1.109,0.225-2.02,1.259-1.83,2.16c0.223,1.07,1.548,1.756,2.687,1.487c3.003-0.712,6.008-1.413,9.032-2.044 c1.549-0.324,2.273-1.869,1.344-3.115c-0.868-1.156-1.801-2.267-2.639-3.445c-1.964-2.762-1.95-2.771,0.528-5.189 c1.394-1.357,1.379-1.351,2.437,0.417c0.461,0.769,0.854,1.703,1.99,1.613c2.238-0.181,4.407-0.755,6.564-1.331 C43.557,30.447,43.88,29.206,43.527,28.401z\\\",\\n      \\\"symbolSize\\\": [\\n        50,\\n        50\\n      ]\\n    },\\n    {\\n      \\\"name\\\": \\\"步行\\\",\\n      \\\"value\\\": 1,\\n      \\\"symbol\\\": \\\"path://M29.902,23.275c1.86,0,3.368-1.506,3.368-3.365c0-1.859-1.508-3.365-3.368-3.365 c-1.857,0-3.365,1.506-3.365,3.365C26.537,21.769,28.045,23.275,29.902,23.275z M36.867,30.74c-1.666-0.467-3.799-1.6-4.732-4.199 c-0.932-2.6-3.131-2.998-4.797-2.998s-7.098,3.894-7.098,3.894c-1.133,1.001-2.1,6.502-0.967,6.769 c1.133,0.269,1.266-1.533,1.934-3.599c0.666-2.065,3.797-3.466,3.797-3.466s0.201,2.467-0.398,3.866 c-0.599,1.399-1.133,2.866-1.467,6.198s-1.6,3.665-3.799,6.266c-2.199,2.598-0.6,3.797,0.398,3.664 c1.002-0.133,5.865-5.598,6.398-6.998c0.533-1.397,0.668-3.732,0.668-3.732s0,0,2.199,1.867c2.199,1.865,2.332,4.6,2.998,7.73 s2.332,0.934,2.332-0.467c0-1.401,0.269-5.465-1-7.064c-1.265-1.6-3.73-3.465-3.73-5.265s1.199-3.732,1.199-3.732 c0.332,1.667,3.335,3.065,5.599,3.399C38.668,33.206,38.533,31.207,36.867,30.74z\\\",\\n      \\\"symbolSize\\\": [\\n        40,\\n        50\\n      ]\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"title\\\": {\\n      \\\"show\\\": true,\\n      \\\"text\\\": \\\"象形柱图\\\"\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"grid\\\": {\\n      \\\"bottom\\\": 115\\n    },\\n    \\\"tooltip\\\": {\\n      \\\"trigger\\\": \\\"axis\\\",\\n      \\\"axisPointer\\\": {\\n        \\\"type\\\": \\\"shadow\\\",\\n        \\\"label\\\": {\\n          \\\"show\\\": true,\\n          \\\"backgroundColor\\\": \\\"#333\\\"\\n        }\\n      }\\n    },\\n    \\\"series\\\": []\\n  }\\n}', '1', NULL, '2022-01-05 16:52:27', 'admin', '2022-04-24 11:03:33');\nINSERT INTO `onl_drag_comp` VALUES ('200208', '1537764868216684545', '普通漏斗图', 'JFunnel', 'ant-design:funnel-plot-filled', 8, NULL, '{\\r\\n  \\\"w\\\": 12,\\r\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/26/funnel\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"维度\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"value\\\": 335,\\n      \\\"name\\\": \\\"直接访问\\\"\\n    },\\n    {\\n      \\\"value\\\": 310,\\n      \\\"name\\\": \\\"邮件营销\\\"\\n    },\\n    {\\n      \\\"value\\\": 234,\\n      \\\"name\\\": \\\"联盟广告\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"基础漏斗图\\\",\\r\\n\t\t\t\\\"textStyle\\\":{\\r\\n\t\t\t  \\\"fontWeight\\\":\\\"normal\\\"\\r\\n\t\t\t},\\n      \\\"show\\\": true\\n    },\\n    \\\"grid\\\": {\\n      \\\"bottom\\\": 115\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"tooltip\\\": {\\n      \\\"trigger\\\": \\\"item\\\",\\n      \\\"formatter\\\": \\\"{a} <br/>{b} : {c}%\\\"\\n    },\\n    \\\"legend\\\": {\\n      \\\"orient\\\": \\\"horizontal\\\"\\n    },\\n    \\\"series\\\": [\\n      {\\n        \\\"name\\\": \\\"Funnel\\\",\\n        \\\"type\\\": \\\"funnel\\\",\\n        \\\"left\\\": \\\"10%\\\",\\n        \\\"width\\\": \\\"80%\\\",\\n        \\\"sort\\\": \\\"descending\\\",\\n        \\\"gap\\\": 2,\\n        \\\"label\\\": {\\n          \\\"show\\\": true,\\n          \\\"position\\\": \\\"inside\\\"\\n        },\\n        \\\"labelLine\\\": {\\n          \\\"length\\\": 10,\\n          \\\"lineStyle\\\": {\\n            \\\"width\\\": 1,\\n            \\\"type\\\": \\\"solid\\\"\\n          }\\n        },\\n        \\\"itemStyle\\\": {\\n          \\\"borderColor\\\": \\\"#fff\\\",\\n          \\\"borderWidth\\\": 1\\n        },\\n        \\\"emphasis\\\": {\\n          \\\"label\\\": {\\n            \\\"fontSize\\\": 20\\n          }\\n        }\\n      }\\n    ]\\n  }\\n}', '1', NULL, '2022-01-06 14:38:04', 'admin', '2022-06-17 19:51:26');\nINSERT INTO `onl_drag_comp` VALUES ('200211', '200300', '基础仪表盘', 'JGauge', 'mdi:gauge', NULL, NULL, '{\\r\\n  \\\"w\\\": 12,\\r\\n  \\\"h\\\": 30,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/26/gauge\\\",\\n  \\\"timeOut\\\": -1,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [\\n    {\\n      \\\"filed\\\": \\\"名称\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    },\\n    {\\n      \\\"filed\\\": \\\"数值\\\",\\n      \\\"mapping\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"min\\\": 1,\\n      \\\"max\\\": 10,\\n      \\\"label\\\": \\\"名称\\\",\\n      \\\"value\\\": 4,\\n      \\\"unit\\\": \\\"%\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"标准仪表盘\\\"\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"tooltip\\\": {\\n      \\\"formatter\\\": \\\"{a} <br/>{b} : {c}%\\\"\\n    },\\n    \\\"grid\\\": {\\n      \\\"bottom\\\": 115\\n    },\\n    \\\"series\\\": [\\n      {\\n        \\\"axisLabel\\\": {\\n          \\\"show\\\": true,\\n          \\\"fontSize\\\": 12\\n        },\\n        \\\"detail\\\": {\\n          \\\"fontSize\\\": 25,\\n          \\\"formatter\\\": \\\"{value}\\\"\\n        },\\n        \\\"splitLine\\\": {\\n          \\\"length\\\": 12,\\n          \\\"lineStyle\\\": {\\n            \\\"color\\\": \\\"#eee\\\",\\n            \\\"width\\\": 4\\n          }\\n        },\\n        \\\"axisTick\\\": {\\n          \\\"show\\\": true,\\n          \\\"lineStyle\\\": {\\n            \\\"color\\\": \\\"#eee\\\"\\n          }\\n        },\\n        \\\"progress\\\": {\\n          \\\"show\\\": true\\n        },\\n        \\\"data\\\": [],\\r\\n \\\"itemStyle\\\": {\\r\\n          \\\"color\\\": \\\"#64b5f6\\\"\\r\\n        },\\n        \\\"type\\\": \\\"gauge\\\"\\n      }\\n    ]\\n  }\\n}', '1', 'jeecg', '2021-12-26 18:32:05', 'admin', '2022-04-24 10:57:39');\nINSERT INTO `onl_drag_comp` VALUES ('200300', '200', '仪表盘', '', 'mdi:gauge', 10, NULL, '', '1', NULL, NULL, NULL, '2022-04-22 19:10:00');\nINSERT INTO `onl_drag_comp` VALUES ('200400', '708970414976712704', '通用组件', 'JCommon', 'teenyicons:area-chart-solid', 6, NULL, '{\\r\\n  \\\"dataType\\\": 1,\\r\\n  \\\"background\\\": \\\"#ffffff\\\",\\r\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\r\\n  \\\"timeOut\\\": 0,\\r\\n  \\\"turnConfig\\\": {\\r\\n    \\\"url\\\": \\\"\\\"\\r\\n  },\\r\\n  \\\"linkageConfig\\\": [],\\r\\n  \\\"dataMapping\\\": [],\\r\\n\t\\\"customOption\\\": \\\"option = {xAxis: {type: \\'category\\',data: [\\'Mon\\', \\'Tue\\', \\'Wed\\', \\'Thu\\', \\'Fri\\', \\'Sat\\', \\'Sun\\']},yAxis: {type: \\'value\\'},series: [{data: [150, 230, 224, 218, 135, 147, 260],type: \\'line\\'}]};return option;\\\",\\r\\n  \\\"chartData\\\": [\\r\\n    {\\r\\n      \\\"value\\\": 0,\\r\\n      \\\"name\\\": \\\"\\\"\\r\\n    }\\r\\n  ],\\r\\n\t\\r\\n  \\\"option\\\": {\\r\\n    \\\"grid\\\": {\\r\\n      \\\"bottom\\\": 115\\r\\n    },\\r\\n    \\\"card\\\": {\\r\\n      \\\"title\\\": \\\"\\\",\\r\\n      \\\"extra\\\": \\\"\\\",\\r\\n      \\\"rightHref\\\": \\\"\\\",\\r\\n      \\\"size\\\": \\\"default\\\"\\r\\n    },\\r\\n    \\\"title\\\": {\\r\\n      \\\"text\\\": \\\"\\\",\\r\\n      \\\"show\\\": true\\r\\n    }\\r\\n  }\\r\\n}', '1', NULL, NULL, 'admin', '2022-07-01 17:34:27');\nINSERT INTO `onl_drag_comp` VALUES ('708970414976712704', '0', '个性', 'custom', 'ant-design:appstore-twotone', 100, NULL, NULL, '0', 'admin', '2022-07-18 19:22:09', 'admin', '2022-07-18 19:33:20');\nINSERT INTO `onl_drag_comp` VALUES ('708970874177503232', '708970414976712704', '牛气冲天', 'JCommon', 'ant-design:heart-outlined', 100, NULL, '{\\n  \\\"dataType\\\": 1,\\n  \\\"background\\\": \\\"#ffffff\\\",\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"customOption\\\": \\\"var path=\\'path://M1472.28,127.91v1C1551,161.7,1579,253.05,1566,330.91a302.16,302.16,0,0,1-10.75,45c-1.53,4.64-2.58,11.74-5.84,15.49-4.58,5.24-17.68,7.14-24.16,9.56-16.89,6.31-33.09,14.32-49,22.73a288.45,288.45,0,0,0-41,26.87c-5.65,4.35-12.1,13-19,15-5,1.48-13-2.41-18-3.47-13-2.75-26.75-4.88-40-5.2-34.31-.84-68.14-.13-101-12.07-87.12-31.65-121-121.33-121-207.95-8.6,6.19-14.51,17.69-19.24,27-12.29,24.17-18.25,50.2-20.93,77-9.21,92.11,29.78,183.68,110.17,232,17.52,10.54,39.51,23,60,26-27.07,22.42-61.21,39.27-91,58l-24,15.1c-3.06,1.92-8.39,4-10.25,7.28-3.37,5.86,12.26,15.67,16.25,18.32,19,12.57,45.11,21.88,68,22.35-14.3,12.93-35.35,20.72-51,32.66-34,26-63.52,56.3-91.71,88.34a787.23,787.23,0,0,0-57.4,73c-12.44,18.05-23,37.85-38,54-13.26,14.26-28.7,25.07-44.92,35.66-56.3,36.75-122.64,58.87-187,76.76-91.95,25.57-185.55,44.87-277,72.31-41.2,12.35-81.72,26.39-117,51.7-11.09,8-22.6,17.26-31.57,27.57-4.78,5.49-11.54,16.79-18.44,19.4-6.5,2.45-17.27-.17-24-1.13-21.36-3-50.8-8.45-64.21-27.27-9.24-13-3-28.7,5.88-40,17.49-22.23,44.8-39.36,71.33-48.66,53.62-18.78,111-24.35,165-42.34,25.32-8.44,54.45-19.34,71.49-41,21.79-27.7,14.86-74.74,5.94-106-26.46-92.7-114.26-157-210.43-159,14.47,18,33.35,30.17,41.31,53,2.84,8.16,2.07,15.62,2.86,24,1.79,18.79,6.07,37.51,19,52,28.13,31.53,70.68,26.37,102.82,49.93,17.21,12.61,32.57,33.58,27.1,56.07-10.26,42.27-68.2,52.95-104.1,59.42-57.71,10.42-118.24,18.08-173,40-30.44,12.18-59.21,31.26-72.13,62.6-19.22,46.59,5,87.25,44.13,113.33a263.25,263.25,0,0,0,41,22.09c4.22,1.84,12.58,3.76,11.82,9.6-1.91,14.69-8.09,29.16-10.39,44-4.36,28.12-5.11,57.57-4.41,86,1.54,62.75,7,125,7,188,0,39-.72,79-10.73,117-12.41,47.06-52.6,77.71-69.21,123a177.6,177.6,0,0,0-11,53c-.64,14.62,1.52,29.6-1.7,44-3.28,14.63-19.08,24.93-20.24,39-1.48,18,10.2,33.95,7.6,52-3.72,25.85-33.15,41.75-27,70,3.33,15.35,18.49,24.8,32.33,29.66,28.41,10,63.53,12.06,93,5.68,19.29-4.18,41.85-16,32-39.34-16.25,4.65-30.79,10.21-48,11-16.31.71-31.87-3.27-48-4v-1c29.51-5.48,58.33-7.43,85-23-14.07-44.48-78.23-59.81-76-110,.64-13.92,8.93-27.24,17.09-38,18.37-24.2,43.35-42.89,67.87-60.42,58.41-41.76,121.88-75.85,180-118,37.2-27,70.16-60.68,106-89.57,16.43,79.56,64.1,157.63,124,211.83,20.94,19,44.5,33.9,67,50.8,11.75,8.82,25.72,18.68,33.54,31.37,8.65,14.06-8.82,18.72-8.4,32,.46,14.58,16.09,26.43,19.35,41,2.91,13-1.16,25.79-5.54,38-3.51,9.81-6.76,21.2,1.52,29.67,6.93,7.08,18.29,9.25,27.53,11.45,25.93,6.14,53.84,6.41,80,2,8.67-1.47,40.39-11.88,28.83-26.48-3.37-4.25-19.71-.6-24.83-.6-23,0-42.29-5.75-64-12v-1c25.71,0,58.05-.69,82-11-7.68-18.45-19.4-37.15-34-50.91-11.59-10.93-25.16-18.77-35.56-31.09-37.67-44.64-65-113-62.4-172,1.41-32.05,18.57-53.87,35.62-80,19.45-29.79,38.76-59.78,57.54-90,8.14-13.11,16.85-25.89,25-39,2.87-4.62,6.56-13.55,11.85-15.69,6.63-2.68,18,1,24.95,1.6,22.7,1.83,45.45,4.82,68,8,73.16,10.17,145.12,22.29,216,43.41,15.49,4.61,31.33,8.38,47,12.35,7.83,2,17.29,3,24,7.75,28.88,20.47,61.08,50.49,76.74,82.62,10.42,21.38,9.22,47.09,24.72,66,30,36.62,76.59,55.44,109.5,89,22.06,22.51,25,52.87,38.3,80,5.78,11.84,18.15,18.21,23.39,30,9.57,21.55-5.94,45.37-13,65-5.93,16.62-2.68,37.29,8.63,51,28.34,34.37,85.85,32.9,125.68,25.39,21.63-4.08,45-13.08,45-38.39-33.33.09-65,2.77-98-5.48-14.23-3.55-26.6-9.94-40-15.52v-1c45.78,5.91,88.63,10.78,134-2-13.48-32.38-41.31-63.58-67-86.83-22.22-20.11-45.87-38.14-63-63.17-19-27.75-26.23-61.69-23.94-95,1.07-15.61,8.5-30.09,5.24-46-5.58-27.3-24.69-47.5-36-72-11.87-25.65-13.5-55.3-15.4-83-.84-12.21-3.08-26.88-.63-39,1.37-6.77,7.76-13.69,11.93-19,11-14,23.22-26.45,35.79-39,20.79-20.76,45.55-37.78,69-55.37,32.27-24.21,65.23-49,101-67.85,24-12.65,58.09-21.5,79.91.31,19,19,18.11,52.46,3.73,73.91-6.5,9.7-18.93,17-21.17,29-3.86,20.58,15.81,43.32-7.47,58.9-30.6,20.47-81.21,5.06-100.63,43.1a53.83,53.83,0,0,0-5.07,16c-5.36,34.59,6.69,80.69,32.7,104.91,11.92,11.1,29.9,18.48,46,12.16,3.89-1.53,11.44-4.6,12.65-9.1,1-3.68-4.44-6.88-6.65-9a102.67,102.67,0,0,1-18.69-24c-14-25.5-15.53-49.67-14.31-78h1c.75,36.25,22.54,76.42,57,90,42.58-109.73,89.4-217.41,110.42-334,8.3-46,17.54-102.62,1.36-148-5.89-16.53-21.23-23.44-35.78-31.31-29.79-16.11-59.59-31.3-91-44.09-8.3-3.37-16.6-6.81-25-9.92-3.63-1.34-9.71-2.44-12.38-5.38-3.17-3.49-.62-16.55-.62-21.3,0-20,.28-40.07-1.09-60a870.11,870.11,0,0,0-11.33-95c-8.14-45.1-19.57-89.75-17.54-136,1.44-32.95,3.38-70.71,22.48-99,8.7-12.88,22.25-21.62,33.48-32.08,17.49-16.29,33.42-34.41,45.8-54.92,16.85-27.91,27.29-59.34,34.55-91,5.5-24,8.46-48.26,18.51-71,17.57-39.74,54.62-67.63,70.08-108,11.51-30.07,9.57-65.44.92-96-3.24-11.42-6.37-24.73-15.86-32.67-26.77-22.36-65.92,2.83-61.81,35.67,2.31,18.57,25.16,26.94,39.81,16.37,9.18-6.63,10-16,10-26.37h1c1,7.24,2.88,13.66,1.1,21-5.85,24.08-34.91,38.31-56.1,23.22-23.42-16.69-27.41-51.5-10.84-74.22a58.1,58.1,0,0,1,21.84-18.51c11.76-5.52,22.5-5,35-4.49v-1c-5.86-3.08-11.5-6.23-18-7.76-33.08-7.79-45,24.6-68,38.95-52,32.51-108.58,62.8-167,81.81,0-81.44-16.39-176.06-91-223.56a189.17,189.17,0,0,0-48-21.71c-21.73-6.48-44.43-8.73-67-8.73m133,55c0,6.85.56,13.72-2.67,20-8.44,16.45-28,18.37-42.33,9v-1c14,.61,27.06-.94,36.47-13,3.6-4.61,5.06-10.41,8.53-15m28,41c9.74,33-39.31,61.09-61,33,19.8,3.85,38.15.49,51.53-16,4.25-5.23,6-11.45,9.47-17m25,56c-2,15.68-10.38,29.06-25,35.88-18.57,8.67-48.86,2.65-56-18.88,20.19,10.63,41.93,14.1,62,.65,7.47-5,12.19-12.14,19-17.65m186,36-23.14,54-29.86,67h-1v-66h-1c-5,28.89-23.6,57.21-33,85h-1l-4-59h-1l-14,39-9,22-10-51h-1c-1.56,11.56-4.92,29.05-11,39l-18-34c-.82,10.06-4.13,27.77-10,36l-20-44,44-14.34,67-27.91,76-45.75m-182,19c-1,46.3-68.69,59.78-89,19,7.24,2.29,13.51,6.61,21,8.53a61.2,61.2,0,0,0,51-10.29c6.62-4.92,11-11.78,17-17.24m-510,23c4.91,26.55-30.79,50.19-50,27,15.91,3.09,30.78.15,41.67-13,3.55-4.28,5-9.65,8.33-14m17,38c2.32,8.49,5.16,16,3.54,25-5,27.78-32.38,37.31-56.54,28v-1a51.93,51.93,0,0,0,47.69-31c3-6.73,2.48-14.42,5.31-21m28,32c24.78,24.8,25.68,67.05-9,84.63-8.79,4.46-18.31,5.37-28,5.37v-1c24.42-11.62,42.28-34,42-62-.09-8.54-6.36-19.21-5-27m57,27c29,22.14,29.88,67.72,3,91.83-13.69,12.28-29.28,15.17-47,15.17v-1c33.84-11.52,51.46-46,50-80-.39-8.8-6.23-17.58-6-26m76,15c32.9,23.18,31.66,75.17,3,100.83-14.75,13.21-32,16.17-51,16.17v-1c33.86-13.15,55.87-46.86,55-83-.27-10.86-7.83-22.88-7-33m367,0c-1.53,11.34-6.74,22.81-11.76,33-5.79,11.79-12.83,23.62-22.33,32.83-32.55,31.58-79.5,22.37-113.91-.83,3.4-14.17,15-26.81,26-35.73,34.26-27.82,80.08-29.27,122-29.27m83,153v1c-32.1,9-68.74,12.91-102,13v1l70,1,37-3v1c-32.09,13.35-65.32,29.91-101,30v1c39.41,0,72.72-12.82,110-23-6,8.07-16.41,13.4-25,18.29-26,14.78-55.32,20.71-85,20.71-14.48,0-32.39-1.69-42.81-13-13.24-14.41-3.73-39.46,11.81-48.05,15-8.3,34.65-6.49,51-4.74,25.45,2.73,50.37,4.83,76,4.83m46,40v1c-72.51,34.36-150.45,63-232,63v1c50.37,0,102.12-5,151-17.88,20.48-5.4,39.55-16.27,60-21.12v1c-67.17,35.76-136.49,64-214,64v1c49.63,0,98.61-6.95,146-22,18.9-6,36.58-14.83,55-22-13.6,14-39.3,21.26-57,28.85-54.69,23.48-109.23,39.15-169,39.15-29.63,0-87.91-8.9-72.45-52,10.38-28.94,53.16-25,77.45-25,26.34,0,52.55,3.12,79,2s54.08-6.6,80-12c32.94-6.82,63.51-21.3,96-29m-490,95c-9,12.82-22,23.86-33,35-13.57,13.74-26.34,28.34-40,42-9.52,9.52-21.78,19.12-33.47,5.82-6.26-7.12-8.17-19.63-.42-26.43,10.95-9.61,28-15.38,40.89-22.17,20.8-11,43.44-27.7,66-34.22m110,7c13.35,13.32,27.65,25.68,41,39,8.43,8.42,17.17,16.84,26,24.83,7,6.32,19.4,14.49,21.61,24.17,3.34,14.66-14,28.53-27.61,22.35-8.07-3.66-11.35-15.11-15.42-22.35-11.5-20.39-22.56-41.2-33.32-62-3.38-6.52-13.32-18.7-12.26-26m-58,3c0,37.17-1.35,76,2.17,113,1.3,13.63,5.23,34.75-9.17,42.59-13.67,7.44-36.07-1.26-34.9-18.59.71-10.58,6.13-21.87,9.18-32l19-63c3.75-12.51,5.9-31.54,13.72-42m-21,9c-6,19-20.18,37.46-29.69,55-9.86,18.19-18.64,41-31.7,57-7.09,8.69-20.53,7.56-28.42.5-12.18-10.9-6.4-24.08,3.81-33.32,20.52-18.57,40.48-37.76,61-56.34,8.27-7.48,15.88-16.4,25-22.83m41,0c18.35,30,36.3,60.21,55,90,6.77,10.82,18.18,24.73,7.71,37-7.85,9.17-26.4,12-33.24,0-4.52-7.89-5.11-19.19-7.29-28-5.31-21.25-9.84-42.7-15-64-2.29-9.44-9.28-25.59-7.13-35m-889,172c-21.37-15-38.7-38.46-57-57-22.46-22.73-50.59-44.87-69-71,14.95,2.24,29.74,12,42,20.35,36.79,25,67,66.75,84,107.65m-130-95c15.29,21.27,35.84,39.06,56,55.58,9.21,7.56,21.44,14.27,29,23.42-32-1.37-58.8-24.18-74.13-51-3.78-6.61-13.15-20.27-10.87-28m1243,10c5.1,17.26,2.45,39.26,2,57-1,41.87-6.18,83.51-17.43,124-5.68,20.43-14.79,39.76-20.58,60h1c5.34-16.88,17.8-33.09,25.75-49,18.06-36.11,35.72-73.55,48.25-112h1c-1.71,21.7-7.08,43.65-11.2,65a1364.13,1364.13,0,0,1-42.8,164h1l48.58-77,41.42-81h1l-34.33,130-24.87,70-16.8,40h1l35-49,47-79h1c-11.54,44.6-23.55,88.39-41.42,131-10.72,25.55-24.91,49-36.58,74l46.37-61,30.63-44h1c-2.82,19.19-11.82,38.78-18.31,57a892.42,892.42,0,0,1-60.69,135,595.42,595.42,0,0,0,63-75h1c-2.34,15.9-9.21,31.82-14.33,47-11.65,34.49-27.12,68.68-47.34,99-9.95,14.93-21.5,30.6-36.33,41,0-23.32,3.72-46.66,4-70,.93-78.47-3.47-156.65-17.42-234a892.72,892.72,0,0,0-29.25-118c-4.27-13.12-8.85-26.18-13.93-39-2.51-6.32-7.29-14.22-7.84-21-.44-5.6,2.71-12.57,4.07-18,3.14-12.59,6.07-25.27,8.57-38,7.43-37.9,12.8-76.37,12.8-115h2c1.2,58.05,17.25,118.15,3,176h1c16.24-39.6,34-77.54,45.58-119a454.82,454.82,0,0,0,10.34-46c1.31-7.76,1.07-17.84,4.08-25m-413,70c5.41-1.52,11.34-3.23,17-2.55,45.43,5.41,38.79,62.68,22,91.55h-1l-1-27h-1l-5,28h-1l-5-39h-1l-2,40h-1l-12-50h-1l2,49h-1l-14-47h-1l4,47h-1c-6.44-15-14.6-34.95-17-51h-1l10,55h-1c-9.22-20.8-21.68-47.51-25-70h-1l15,74h-1c-8.36-15.68-17-34.66-21-52h-1l11,53h-1l-20-43h-1l12,50h-1l-22-41h-1l16,48c-10.14-7.77-19.56-23.5-25-35h-1l15,37c-7.66-3.57-14.41-12.46-18-20h-1l13,25c-28.92-15.39-67.06-61.19-30-89.46,4.72-3.6,10.4-5,16-6.54-8-27.15,18.21-52,44-52,17.77,0,33.13,12,40,28m-39,23,1,1-1-1m157,165v-1l26-9v-1l-29,4v-1l35-17v-1l-39,11v-1l44-27v-1l-48,17v-1l42-29-45,18v-1l44-31v-1l-50,26v-1l59-46c-21.47,11.31-43.75,30.16-67,37v-1l44-37-48,27,35-34-45,27,32-35-41,29,25-34-31,25,13-23-19,19c7.13-27.47,25.41-68.94,61-62.53,6.42,1.15,13,3.62,18,7.86,3,2.52,6,8.94,10.1,9.46,5.24.67,12.45-3.1,17.91-3.62,14.25-1.35,28.44,5.57,37,16.83,9.21,12.19,12.1,28.87,5.73,43-2.64,5.85-8.72,11.12-10.59,17-1.24,3.88,3.09,8.47,4.35,12,2.22,6.23,2.34,14.57.87,21-8.36,36.41-53.28,33.2-81.32,32m-316-149c-9.77,26.84-33.09,53-51.84,74-62,69.42-148.28,112.34-240.16,124.72-28.53,3.84-56.39,3.28-85,3.28v-2c32.11-4.32,65.57-17.48,96-28.31,76.94-27.38,152-62.23,217-112.34,23.38-18,42-40.27,64-59.35m191.33,2.67.34.67-.34-.67m-40,3,.34.67-.34-.67m-23.33,19.33,1,1-1-1m305,6c47.91,32.33,77.54,87.44,68.41,146-4.37,28-17.32,68.7-53.41,62.67-39.88-6.66-32.15-69.51,8-66.34,7.87.62,14.47,3.37,21,7.67,8.36-40.54,6.18-75.37-14.85-112a159.52,159.52,0,0,0-18.44-26c-3.15-3.59-9.46-7.43-10.71-12m-143,3,1,1-1-1m-18,2,1,1-1-1m34,3,1,1-1-1m26,15,1,1-1-1m23,1,1,1-1-1m-238,40-27-7v1c8.65,2,20.27,7.08,26,14l-39-6v1c12,1,26.62,7,37,13v1l-52-4v1l47,13v1l-51-1v1l48,11v1h-56v1l57,7v1l-77,3v1c24.17,0,53.5,2.4,77,8v1l-59,4v1l57,5v1l-49,6v1l51,4v1l-46,8v1h50v1l-39,11v1l38-2v1l-23,9v1l26-5c-3.72,6.43-11.75,10.68-18,14.4-19.67,11.7-47.78,20.06-67,2.41a35,35,0,0,1-10.53-17.81c-.8-3.77.68-9.29-1.54-12.57s-8.52-3.8-12-5.31a42.36,42.36,0,0,1-17.08-13.12c-20.88-28.29-1-67.22,33.08-70,0-5.45.48-10.86,2.47-16,16.06-41.47,75.51-20,94.53,7m138,22h-1c-4.91-26.06-35.82-46.31-56-20-4.56-12.85,14.79-25.15,25-27.19,28.54-5.71,40.67,24.69,32,47.19m91-41,1,1-1-1m-154,4-2,13-8-11c3.64-3.31,5.3-3.42,10-2m-5,20c-29.83-6.15-51.37,18.89-37,47-4.81-1.64-8.47-5-11.61-9-10.65-13.57-8.63-34.2,5.61-44.36,12-8.53,35-7.37,43,6.36m160-9,1,1-1-1M1097,1069.23l.66.34-.66-.34m194.33,12.67,3-1,1,7-12,3c.57-3.17,3.82-12.42,8-9m-65,33c-5.93-4.35-9.93-17-12-24-.82-2.83-1.91-8.2,2.09-9.25,3.68-1,5.61,3.48,6.35,6.25a112.35,112.35,0,0,1,3.52,27m7-8c.68-3.53,2.4-21.07,7.79-20.08,6.55,1.2-5.14,18.35-7.79,20.08m137-12,1,1-1-1m-135,24c5-7,12.85-13.76,20-18.53,2.36-1.58,7.77-4.78,9.86-1,1.86,3.35-2.55,6.85-4.88,8.45-6.81,4.68-16.85,9.65-25,11.1m-21-5c-3.62-1.56-19.7-8.26-17.65-13.59,1.12-2.93,5.28-.19,6.65.87,4.32,3.36,8.69,7.77,11,12.72m65,46c3.6-5.28,11.31-7.72,15.67-13,8.57-10.39,8.57-26.61,0-37-3.9-4.73-10.23-7.27-13.67-12,10.34,0,20.07,2,27.91,9.3,13,12.06,11.9,34.24-1.92,45.17-8.33,6.59-17.81,7.53-28,7.53m316-55-1,3,1-3m-376,18c-6.47,3.88-19.5,4.25-27,4-2.73-.11-8.66-.88-8.08-4.91.52-3.54,5.3-4,8.08-4a102.69,102.69,0,0,1,27,4.9m-55,1v2l-12,4-3-4c3.47-7.92,8.72-5.29,15-2m63.13-3.25c4.09-1.1,6,5.2,1.77,6.28-4,1-5.85-5.18-1.77-6.28m18.87,4.25v-2c3.26,0,21.77-3.61,21.65,1.87s-18.45.54-21.65.13m-10,4a109.5,109.5,0,0,1,12,6.28c2.7,1.54,5.39,3.1,8,4.77,3,1.91,13,12.66,3,11.66-6.45-.64-23.11-16.37-23-22.71m-66,1c-2.24,6.14-5.66,11.24-6,18-1,23.73,19.44,33.62,40,32-11.45,13.82-36.37,12.67-47.47-1-9.27-11.45-8.17-27.5.4-38.95a31.67,31.67,0,0,1,13.07-10m55,2c.71,8-2.25,19.48-5.09,27-1,2.62-3.14,7-6.7,6.17-4-1-2.74-6.51-1.74-9.17,2.92-7.8,7.6-18.14,13.53-24m-11,2c-4.65,5.77-12,14-20,13,2.12-7.39,12.9-11.73,20-13m136,143c-9.89,22.12-39.74,19.35-56,7.24s-24.49-37.81-27-57.24h1l17,21-12-26,27,26-20-32,40,32-30-39,41,30-31-37,44,30-40-39,64,42-40-36-16-16,50,30-41-37,43,22-38-32v-1l41,18-39-29,41,14v-1l-33-20v-1l25,5v-1l-24-10c7-3.14,14.66-1.63,22-1.09,23.3,1.71,50.28,10.14,56,36.09a35.71,35.71,0,0,1-1.46,21c-1.49,3.71-6.09,7.91-5.94,12,.34,9.16,10.9,17.45,11.38,28,1.11,24.47-16.4,46.95-42,47.54-9.75.23-17.92-3.94-27-6.54m-116-137,7,22c-7.65-1.25-9.62-15.74-7-22m127,11,1,1-1-1m-68,18v7c-7.6.51-10.64-2.39-12-10l12,3m-20-2c2.48,8.81,4,17.11.9,26-6.8,19.17-30.6,26-46.9,14.36-8.19-5.87-12-14.8-14-24.36,16.33,13.11,35.34,21.78,51.67,2,4.52-5.48,4.51-12.5,8.33-18m94,16v1l3,1-3-2m-159,5v13l-7,1-3-4,10-10m-63,6-14,22,20-18-18,36h1c5.28-11.12,15.22-24.52,25-32l-19,49h1l27-41h1l-16,48h1c4.46-14.08,15.76-28.77,24-41h1l-16,52h1l23-50h1l-20,72h1l30-68h1l-13,56h1l21-50h1l-8,48h1l18-47h1l-5,46h1l14-47h1l-1,43h1l10-39h1l2,26h1l3-26h1c6.57,17,12.39,37.56,8.48,56-5.16,24.33-31.08,41.28-54.48,29-10.63,28-49.21,32.56-70,13.82-11.91-10.75-15.64-28.55-12-43.82-22.18-3.33-31.83-27.15-26.25-47,5.65-20.14,28.24-41.12,48.25-47m219,4,1,1-1-1m-1165,9c11.79,43.13,63.28,76.37,105,85v1c-35.68-.74-79-19.55-96.22-52-4.37-8.25-12.45-24.61-8.78-34m1163,6,1,1-1-1m-232,3,1,1-1-1m-536,47c-15.95-5.39-31.12-10.22-48-11.83-45.95-4.38-87.44,11.77-127,32.83,7-12.12,20.55-21.05,32-28.67,39.85-26.52,91.69-32.75,137-17.66,22.11,7.36,52,20.84,54.82,47.33,3.26,30.35-41.74,49.71-55.75,19-5.87-12.88.9-29.5,6.93-41m188-32,76,15v1l-42,22v1l47,10v1l-44,24v1l65-3-26,19-42,28v1l75-14v1l-93,67,80-19c-12,15.65-34.36,27.6-50,39.65-30.72,23.67-61.34,53.17-95,72.35,5.57-19.33,17.38-38.12,24.79-57a458.62,458.62,0,0,0,26.93-102,331.28,331.28,0,0,0,2.19-74c-.76-9.5-7.57-25.25-4.91-34m562,1,2,2-2-2m24,3,1,1-1-1m-37,4,1,1-1-1m-46,9,1,1-1-1m15,0,3,3-3-3m20,0,1,1-1-1m313,7,1,1-1-1m-592,129-74,3v-1l28-21c-26.61.55-58.13,3.82-84,10l20-15,49-33-61-5,15-10.15,34-18.85v-1l-59-15v-2l58-12.42,22.57-3.94,3.8,8.36,6.63,24,22.25,58,18.75,35m111-126,1,1-1-1m10,11,1,1-1-1m359,5c-3.64,7.95-11,14.48-16.72,21a376.36,376.36,0,0,1-48.28,45.4c-81,64.74-191,95.89-292,63.6v-1c93.66-7.39,189-40.62,273-81.26,29.13-14.09,55.56-32.6,84-47.74m-335,5,1,1-1-1m-18.67,12.67.34.66-.34-.66m746.67,3.33c-4,10.82-11.47,20.72-16.74,31-11.54,22.51-22,47.75-25.26,73h-1c-25.77-42.14.69-86.29,43-104m-69,5c-6.38,9.06-15.37,16.66-22.71,25-23.71,26.94-49.14,56.12-62.29,90-5.31-10-1.62-26.62,1.16-37,9.65-36.18,47.59-69.39,83.84-78m-1350,74c-5.76-7.72-10.07-16.77-19-21.58-7.09-3.82-14.48.3-14.65,8.58-.19,10.13,7.28,18.1,10.65,27-9.55-2.21-17.11-7.11-24-14-16.27-16.26-26.69-45.3,0-57.68a31.9,31.9,0,0,1,12-3.06c26-.78,41.69,39.59,35,60.74m29,18c5.18-8.3,13.44-15.74,14.63-26,1-8.18-6.44-12.49-13.63-9.87-9.58,3.5-13.89,13-22,17.87a56.19,56.19,0,0,1,5.76-26c5.62-11.42,14.81-25.06,28.24-27.69,28.06-5.48,42.54,25.25,27.78,46.69-4.66,6.77-11,12.13-17.78,16.64a49,49,0,0,1-23,8.36m1115-60-2,4,2-4m-992,21.39c24.32-1.72,28.64,37.5,4,39.52-27.06,2.22-30.95-37.61-4-39.52m-154,27.94c27.49-4.82,35.84,37.46,8,42.34-27.08,4.75-35.1-37.59-8-42.34m-24,13.67c-9.38,5.65-21.43,4.64-28.28,15-3.9,5.89.36,11.42,6.28,13.53,9.5,3.38,19.82.42,29-2.52-9.88,19.83-47.72,36.81-66.83,20.32-18.74-16.17-8-43,12.83-49.8,6.92-2.26,13.8-2.52,21-2.52,9.4,0,17.71,1.29,26,6m47,30c9.11,2.49,20.28,9,30,5.26,7.07-2.72,8.31-9.74,3.77-15.26-6.34-7.71-15-11.08-23.77-15,17-12.62,57.8.34,64.21,20,7.8,23.92-15.09,42.14-37.21,36.08a62,62,0,0,1-19-9.29c-7.59-5.34-15.32-12.7-18-21.79m970-27,11,96-44-41,5,60c-17-11.28-32.55-28.55-47-43l29,78-32-24.12-51-39.88c11.93,28.5,35.45,54.33,44,84l-39-28.63-77-57.37c15.81,29.7,41.11,57.58,53,89-22.38-9.41-44.15-29.53-64-43.58q-61.1-43.21-123-85.42c4.26-1.53,9.57.39,14,1,10.31,1.42,20.65,2.8,31,3.83a694.58,694.58,0,0,0,99,3.13c45.84-2,92.82-10.18,136-26,18.85-6.91,36.29-20,55-25.95m-1140,4.46c25.56-.81,26.56,39.2,1,39.2-24.83,0-25.94-38.41-1-39.2M797,1405.23l.66.34-.66-.34m841.33,13.67-1,2,1-2m-1156,8c-.44,10.17-3.59,28.15,8,34,14.89,7.46,18-24,18-32,17.73,13.7,18.84,56.69-1,69-21.27,13.2-43-5-43-27,0-7.36.64-14,3-21,3-9,7.1-17.39,15-23m588,12c1.81,42,10.69,83.63,28.31,122,7.81,17,18.66,31.77,27.69,48-18.64-1.48-37.52-6.86-56-9.92-37.14-6.15-74.55-11.29-112-14.91-33.14-3.21-67.66-6.36-101-4.08-20.42,1.4-40.6,5.39-61,6.82-22.36,1.57-47.11,3.25-69-2.39-10.33-2.66-21.8-8.89-23-20.52,13.73,4.35,23,10,38,10-5.17-13.8-3.92-31.05,0-45h1c6.38,14.77,21.44,28.52,37,33,0-16.18-2.43-36.79,7-51,7.41,15.63,19.47,32.84,37,38-.14-17.15-2-32.81,8-48,3.36,4.69,4.52,10.92,7.43,16,7.29,12.74,19,24.15,32.57,30,0-16.21-.22-35.54,8-50h1c8.11,18.3,14.61,37.08,32,49-4.83-20.29.31-47.81,10-66,4.24,6.74,5.81,15.62,8.86,23,6.89,16.68,15.59,32.88,28.14,46,0-19.12-.59-38,2.13-57,.89-6.21,1.57-17,6.87-21,1.35,31.27,22.24,61.38,42,84-1.09-25.29-2.9-49.67,0-75,1.16-10.35,2.42-24.05,8-33,12.83,37.82,18.07,80.41,45,112a499.31,499.31,0,0,1,.83-88c1-9.94.8-22.92,5.17-32m214,42,1,1-1-1m-635,3c-1.72,11.45-8,23.06-13.72,33-22.54,39.4-64.15,66.87-109.28,71.95-24.81,2.8-67.3,2.25-72.67-29.95-7.37-44.11,58.5-56.52,65.91-12,1.12,6.72-.2,12.59-2.24,19,40.85,0,77.9-15.94,105.91-46,10.34-11.1,16.65-24.61,26.09-36m-300,23.3c55.12-7.94,82.86,65.83,36,96a51,51,0,0,1-21,7.41c-54,7-80.66-66.35-35-95.84a51.36,51.36,0,0,1,20-7.57m-3,29.7c-3.64,7.79-16.4,22.36-15.75,30.9.27,3.49,5.17,5,7.75,6.41,7.92,4.3,15.67,9.22,24,12.69l17-33-33-17m1132,41,20,59,11,35-45-37,15,57-44-41,2,55-46-52v58h-1l-37.42-62-21.58-37c12.07,1.62,23.69,5.68,36,6,44.13,1.08,76-16.59,111-41m-1109,204v-1c53-12.15,110.13-43.3,150-80-14.43,8.22-27.55,18.83-42,27.13-39.89,22.9-86.13,41-132,46.87v-1c58.55-19.05,116.35-52.27,161-95-14.74,9.18-28.22,20.37-43,29.57-35.05,21.83-72.47,39.29-112,51.15-12,3.6-24.57,8.61-37,10.28,21.82-14.49,50.72-20.72,74-33.31,48-25.94,88.27-58.6,127-96.69,15.34-15.09,43.34-40.45,67-28.62,39.51,19.75,0,63.81-19,81.53-37,34.43-82.1,54-129,70.78-20.52,7.33-43.1,16.57-65,18.31m468-153v1c-56.73,26.52-100,91.38-100,154-28.71-14.54-35.34-59.06-19.3-84,18.72-29.13,54.16-46.72,85.3-59.4,10.77-4.38,22.44-9.89,34-11.6m45,3c-8.66,11.77-20.89,20.85-29.57,33-21,29.33-32.33,67-32.43,103-6.52-4.69-11.48-11.94-15.22-19-28.43-53.65,32.72-99.73,77.22-117m-581,4c42.61,13.62,88.26,20,133,16.91,20.57-1.41,40.61-7.29,61-8.91v1c-14.54,9-27.7,19-44,24.95-55.81,20.46-105.49.78-151-32.95l1-1m1532,8c-16.45,31.23-22,62.25-9,96-40.31-18.8-28.28-81.58,9-96m-1125,7c-5.59,9.72-13.3,18-18.69,28-15.09,27.84-26.05,63.11-26.31,95,18.47-1.46,37.55-3.83,51.91,11,27.62,28.62-9.23,63.21-40.91,57.5-28.41-5.13-39-37.23-39-62.54,0-49.78,24.67-108.17,73-129m-196,22-6,6,6-6m-234,5c33.75,19.62,76.22,22.1,114,22v1c-28.48,16.62-65,19.94-93,.65-6.34-4.37-21.71-15-21-23.65m252,13-1,2,1-2m-3,2-8,8,8-8m996,47c-2.89,22.83-.92,41.85,5,64l-22-19,5,56h-1l-30-54h-1l-4,34h-1l-22-40-2,29h-1l-25-63c22.71,11.62,49.89,13.22,74,4.92,8.84-3,16.39-8.66,25-11.92m-1176,102v2l-38,30,8-26-34,28,12-35-37,32,8-34-38,37c4.62-16,13.74-31.83,20.69-47,2.35-5.14,4.42-14.67,9.52-17.69,7.43-4.38,19-2,26.79-.18,23.32,5.59,41.5,19.46,62,30.87m447,60-14-19h-1l10,24h-1l-15-19,13,28-36-41,24,47-40-43,17,40h-1l-34-40,19,44-37-41,12,29c-8.25-5.81-27.23-20.9-29.53-31-1.74-7.63,4.91-16.47,10.57-20.7,13.44-10,36.41-9.18,52-5.4,13.58,3.3,31.36,9.74,40.21,21.19,5.76,7.45,7.92,18.09,10.79,26.91m-45-28,1,1-1-1m-34,4,1,1-1-1m18,0,1,1-1-1m44,2,1,3h1l-2-3m-80,1,1,1-1-1m74,4,1,3h1l-2-3m-589,187c-2.56,11.16-11,30-4.06,40.9,3.39,5.37,10.43,5.65,16.06,6.38,14.54,1.89,29.49-2.14,44-3.28v1c-21,6-51.89,20.17-74,13.2-8.63-2.73-8.12-10.89-6.24-18.2,3.55-13.8,12.82-31.26,24.24-40Zm1484-1557c0,21.15-18,38.3-40.22,38.3s-40.22-17.15-40.22-38.3,18-38.3,40.22-38.3S1666.24,493.75,1666.24,514.9Z\\';option={backgroundColor:new echarts.graphic.RadialGradient(0,0,1,[{offset:0,color:\\'#06798c\\'},{offset:1,color:\\'#07162b\\'}]),title:{text:\\'牛气冲天\\',top:100,left:100,textStyle:{fontWeight:\\'normal\\',fontSize:40,color:\\'#fff\\',fontFamily:\\'STXinwei\\',textShadowColor:\\'#c30d23\\',textShadowBlur:\\'2\\',textShadowOffsetX:1,textShadowOffsetY:3,}},grid:{left:\\'80%\\',top:\\'42%\\',bottom:100},xAxis:{show:false,data:[\\'2017\\']},yAxis:{show:false,},series:[{type:\\'liquidFill\\',data:[0.7,0.8,0.75,0.21,0.2,0.13,0.1,],radius:\\'90%\\',waveLength:\\'90%\\',waveHeight:\\'10\\',amplitude:10,z:2,outline:{show:false},backgroundStyle:{color:new echarts.graphic.LinearGradient(1,0,0,0,[{offset:0,color:\\\\\\\"#1afae8\\\\\\\"},{offset:0.3,color:\\\\\\\"#007771\\\\\\\"},{offset:0.6,color:\\\\\\\"#27AEFA\\\\\\\"},{offset:1,color:\\\\\\\"#4D8AFF\\\\\\\"}]),borderColor:new echarts.graphic.LinearGradient(1,0,.3,1,[{offset:0,color:\\'#5dfff8\\'},{offset:0.3,color:\\'#33ffe6\\'},{offset:0.5,color:\\'#049a8c\\'},{offset:1,color:\\'#f63469\\'}]),borderWidth:1,shadowColor:\\'#040b17\\',shadowOffsetX:-5,shadowOffsetY:5,shadowBlur:5},shape:path,color:new echarts.graphic.LinearGradient(1,0,.23,1,[{offset:0,color:\\'#FDD43F\\'},{offset:0.3,color:\\'#33ffe6\\'},{offset:0.5,color:\\'#049a8c\\'},{offset:1,color:\\'#f63469\\'}]),label:{normal:{formatter:\\'\\',}}},{name:\\'\\',type:\\\\\\\"effectScatter\\\\\\\",rippleEffect:{period:10,scale:12,brushType:\\'stroke\\',color:new echarts.graphic.LinearGradient(1,0,.3,1,[{offset:0,color:\\'rgba(93, 255, 248, .3)\\',},{offset:0.3,color:\\'rgba(51, 255, 230, .3)\\',},{offset:0.5,color:\\'rgba(4, 154, 140, .3)\\',},{offset:1,color:\\'rgba(246, 52, 105, .3)\\',}]),},z:0,symbolPosition:\\'end\\',symbol:path,\\\\\\\"symbolSize\\\\\\\":[80,100],\\\\\\\"symbolOffset\\\\\\\":[0,-9],itemStyle:{normal:{color:\\'rgba(0, 0, 0, 0)\\',}},data:[0]},]};return option;\\\",\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"value\\\": 0,\\n      \\\"name\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"grid\\\": {\\n      \\\"bottom\\\": 115\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"\\\",\\n      \\\"show\\\": true\\n    }\\n  }\\n}', '1', 'admin', '2022-07-18 19:23:58', 'admin', '2022-07-18 19:34:37');\nINSERT INTO `onl_drag_comp` VALUES ('708976410864304128', '708970414976712704', '五行相克', 'JCommon', 'ant-design:appstore-twotone', 100, NULL, '{\\n  \\\"dataType\\\": 1,\\n  \\\"h\\\": 55,\\n  \\\"background\\\": \\\"#ffffff\\\",\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"customOption\\\": \\\"var wuXin=new Array(\\'木\\',\\'火\\',\\'土\\',\\'金\\',\\'水\\');var color=[\\'#78a355\\',\\'#d93a49\\',\\'#8e3e1f\\',\\'#dea32c\\',\\'#50b7c1\\'];function roundDatas(num){var datas=[];for(var i=0;i<num;i++){var x=Math.cos(72*i*Math.PI/180);var y=Math.sin(72*i*Math.PI/180);datas.push({name:wuXin[i],x:y,y:-x,itemStyle:{normal:{color:color[i]}}});}return datas;}function linkDatas(num){var ldatas=[];for(var i=0;i<num;i++){ldatas.push({label:{normal:{show:true,formatter:\\'相生\\'}},lineStyle:{normal:{color:\\'#94d6da\\',width:2,curveness:0.3,opacity:0.8,type:\\'dashed\\',}},source:i,target:i+1});ldatas.push({lineStyle:{normal:{color:\\'#FF5151\\',width:2,curveness:0,opacity:0.8}},label:{normal:{show:true,formatter:\\'相克\\'}},source:i,target:i+2});}ldatas.push({label:{normal:{show:true,formatter:\\'相生\\'}},lineStyle:{normal:{color:\\'#94d6da\\',type:\\'dashed\\',width:2,curveness:0.3,opacity:0.8}},source:(i-1),target:0});ldatas.push({lineStyle:{normal:{color:\\'#FF5151\\',width:2,curveness:0,opacity:0.8}},label:{normal:{show:true,formatter:\\'相克\\'}},source:3,target:0});ldatas.push({lineStyle:{normal:{color:\\'#FF5151\\',width:2,curveness:0,opacity:0.8}},label:{normal:{show:true,formatter:\\'相克\\'}},source:4,target:1});return ldatas;}option={backgroundColor:\\'#2E2E2E\\',title:{text:\\'五行相生相克图\\',subtext:\\'\\',left:50,top:10,backgroundColor:\\'#FFFAFA\\',borderRadius:8,textStyle:{color:\\'#102b6a\\',},subtextStyle:{color:\\'#102b6a\\',}},color:[\\'#000000\\',\\'#FFFFFF\\'],series:[{name:\\'五行\\',type:\\'graph\\',focusNodeAdjacency:true,edgeSymbol:[\\'\\',\\'arrow\\'],edgeSymbolSize:[3,15],edgeLabel:{normal:{textStyle:{fontSize:15}}},label:{normal:{show:true,formatter:\\'{b}\\',fontSize:46}},symbol:\\'circle\\',symbolSize:60,top:\\'60\\',left:\\'200\\',width:\\'400\\',height:\\'400\\',data:roundDatas(5),links:linkDatas(5)},{name:\\'大圆\\',type:\\'pie\\',radius:\\'52\\',center:[\\'400\\',\\'268\\'],data:[{value:50,name:\\'阴\\'},{value:50,name:\\'阳\\'},],roseType:\\'radius\\',hoverAnimation:false,label:{normal:{show:false}},labelLine:{normal:{show:false,}}},{name:\\'黑色圆\\',type:\\'pie\\',zlevel:2,radius:\\'26\\',center:[\\'400\\',\\'294\\'],data:[{value:50,name:\\'\\'},],roseType:\\'radius\\',hoverAnimation:false,label:{normal:{show:false}},labelLine:{normal:{show:false,}}},{name:\\'白色圆\\',type:\\'pie\\',zlevel:2,radius:\\'26\\',center:[\\'400\\',\\'242\\'],data:[{value:50,name:\\'\\'},],roseType:\\'radius\\',hoverAnimation:false,label:{normal:{show:false}},labelLine:{normal:{show:false,}}},{name:\\'黑色圆小\\',type:\\'pie\\',zlevel:3,radius:\\'12\\',center:[\\'400\\',\\'242\\'],data:[{value:50,name:\\'\\'},],roseType:\\'radius\\',hoverAnimation:false,label:{normal:{show:false}},labelLine:{normal:{show:false,}}},{name:\\'白色圆小\\',type:\\'pie\\',zlevel:3,radius:\\'12\\',center:[\\'400\\',\\'294\\'],data:[{value:50,name:\\'\\'},],roseType:\\'radius\\',hoverAnimation:false,label:{normal:{show:false}},labelLine:{normal:{show:false,}}}]};return option;\\\",\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"value\\\": 0,\\n      \\\"name\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"grid\\\": {\\n      \\\"bottom\\\": 115\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"\\\",\\n      \\\"show\\\": true\\n    }\\n  }\\n}', '1', 'admin', '2022-07-18 19:45:58', 'admin', '2022-07-18 20:40:09');\nINSERT INTO `onl_drag_comp` VALUES ('708976410864304129', '708970414976712704', '甘特图', 'JCommon', 'ant-design:appstore-twotone', 100, NULL, '{\\n  \\\"dataType\\\": 1,\\n  \\\"h\\\": 55,\\n  \\\"background\\\": \\\"#ffffff\\\",\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/33/chart\\\",\\n  \\\"timeOut\\\": 0,\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"customOption\\\": \\\"option={\\'backgroundColor\\':\\'#fff\\',\\'title\\':{\\'text\\':\\'工程项目工期\\',\\'padding\\':20,\\'textStyle\\':{\\'fontSize\\':17,\\'fontWeight\\':\\'bolder\\',\\'color\\':\\'#333\\'},\\'subtextStyle\\':{\\'fontSize\\':13,\\'fontWeight\\':\\'bolder\\'}},\\'legend\\':{\\'data\\':[\\'计划工期\\',\\'可行性研究阶段\\',\\'初步设计阶段\\',\\'施工图设计阶段\\',\\'项目实施阶段\\',\\'项目验收阶段\\'],\\'align\\':\\'right\\',\\'right\\':80,\\'top\\':50},\\'grid\\':{\\'containLabel\\':true,\\'show\\':false,\\'right\\':130,\\'left\\':40,\\'bottom\\':40,\\'top\\':90},\\'xAxis\\':{\\'type\\':\\'time\\',\\'axisLabel\\':{\\'show\\':true,\\'interval\\':0},\\'axisLine\\':{\\'show\\':true}},\\'yAxis\\':{\\'axisLabel\\':{\\'show\\':true,\\'interval\\':0,\\'formatter\\':function(value,index){var last=\\'\\';var max=5;var len=value.length;var hang=Math.ceil(len/max);if(hang>1){for(var i=0;i<hang;i++){var start=i*max;var end=start+max;var temp=value.substring(start,end)+\\'\\';last+=temp;}return last;}else{return value;}}},\\'data\\':[\\'临夏自治州2015年度治理工程项目\\',\\'标段一\\',\\'标段二\\']},\\'tooltip\\':{\\'trigger\\':\\'axis\\',\\'formatter\\':function(params){var res=\\'\\';var name=\\'\\';var start0=\\'\\';var start=\\'\\';var end0=\\'\\';var end=\\'\\';for(var i in params){var k=i%2;if(!k){start0=params[i].data;start=start0.getFullYear()+\\'-\\'+(start0.getMonth()+1)+\\'-\\'+start0.getDate();}if(k){name=params[i].seriesName;end0=params[i].data;end=end0.getFullYear()+\\'-\\'+(end0.getMonth()+1)+\\'-\\'+end0.getDate();res+=name+\\' : \\'+start+\\'~\\'+end+\\'</br>\\';}}return res;}},\\'series\\':[{\\'name\\':\\'计划工期\\',\\'type\\':\\'bar\\',\\'stack\\':\\'总量0\\',\\'label\\':{\\'normal\\':{\\'show\\':true,\\'color\\':\\'#000\\',\\'position\\':\\'right\\',\\'formatter\\':function(params){return params.seriesName}}},\\'itemStyle\\':{\\'normal\\':{\\'color\\':\\'skyblue\\',\\'borderColor\\':\\'#fff\\',\\'borderWidth\\':2}},\\'zlevel\\':-1,\\'data\\':[new Date(1525132800000),new Date(1520985600000),new Date(1525132800000)]},{\\'name\\':\\'计划工期\\',\\'type\\':\\'bar\\',\\'stack\\':\\'总量0\\',\\'itemStyle\\':{\\'normal\\':{\\'color\\':\\'white\\'}},\\'zlevel\\':-1,\\'z\\':3,\\'data\\':[new Date(1514764800000),new Date(1514764800000),new Date(1521072000000)]},{\\'name\\':\\'可行性研究阶段\\',\\'type\\':\\'bar\\',\\'stack\\':\\'总量2\\',\\'label\\':{\\'normal\\':{\\'show\\':true,\\'color\\':\\'#000\\',\\'position\\':\\'right\\',\\'formatter\\':function(params){return params.seriesName}}},\\'itemStyle\\':{\\'normal\\':{\\'color\\':\\'green\\',\\'borderColor\\':\\'#fff\\',\\'borderWidth\\':2}},\\'zlevel\\':-1,\\'data\\':[new Date(1515542400000),new Date(1515542400000),new Date(1522368000000)]},{\\'name\\':\\'可行性研究阶段\\',\\'type\\':\\'bar\\',\\'stack\\':\\'总量2\\',\\'itemStyle\\':{\\'normal\\':{\\'color\\':\\'white\\'}},\\'zlevel\\':-1,\\'z\\':3,\\'data\\':[new Date(1514851200000),new Date(1514851200000),new Date(1521158400000)]},{\\'name\\':\\'初步设计阶段\\',\\'type\\':\\'bar\\',\\'stack\\':\\'总量3\\',\\'label\\':{\\'normal\\':{\\'show\\':true,\\'color\\':\\'#000\\',\\'position\\':\\'right\\',\\'formatter\\':function(params){return params.seriesName}}},\\'itemStyle\\':{\\'normal\\':{\\'color\\':\\'red\\',\\'borderColor\\':\\'#fff\\',\\'borderWidth\\':2}},\\'zlevel\\':-1,\\'data\\':[new Date(1519084800000),new Date(1516406400000),new Date(1523318400000)]},{\\'name\\':\\'初步设计阶段\\',\\'type\\':\\'bar\\',\\'stack\\':\\'总量3\\',\\'itemStyle\\':{\\'normal\\':{\\'color\\':\\'white\\'}},\\'zlevel\\':-1,\\'z\\':3,\\'data\\':[new Date(1517443200000),new Date(1515715200000),new Date(1522540800000)]},{\\'name\\':\\'施工图设计阶段\\',\\'type\\':\\'bar\\',\\'stack\\':\\'总量4\\',\\'label\\':{\\'normal\\':{\\'show\\':true,\\'color\\':\\'#000\\',\\'position\\':\\'right\\',\\'formatter\\':function(params){return params.seriesName}}},\\'itemStyle\\':{\\'normal\\':{\\'color\\':\\'brown\\',\\'borderColor\\':\\'#fff\\',\\'borderWidth\\':2}},\\'zlevel\\':-1,\\'data\\':[new Date(1520553600000),new Date(1516838400000),new Date(1524182400000)]},{\\'name\\':\\'施工图设计阶段\\',\\'type\\':\\'bar\\',\\'stack\\':\\'总量4\\',\\'itemStyle\\':{\\'normal\\':{\\'color\\':\\'white\\'}},\\'zlevel\\':-1,\\'z\\':3,\\'data\\':[new Date(1519516800000),new Date(1516492800000),new Date(1523404800000)]},{\\'name\\':\\'项目实施阶段\\',\\'type\\':\\'bar\\',\\'stack\\':\\'总量5\\',\\'label\\':{\\'normal\\':{\\'show\\':true,\\'color\\':\\'#000\\',\\'position\\':\\'right\\',\\'formatter\\':function(params){return params.seriesName}}},\\'itemStyle\\':{\\'normal\\':{\\'color\\':\\'yellow\\',\\'borderColor\\':\\'#fff\\',\\'borderWidth\\':2}},\\'zlevel\\':-1,\\'data\\':[new Date(1520812800000),new Date(1518652800000),new Date(1525046400000)]},{\\'name\\':\\'项目实施阶段\\',\\'type\\':\\'bar\\',\\'stack\\':\\'总量5\\',\\'itemStyle\\':{\\'normal\\':{\\'color\\':\\'white\\'}},\\'zlevel\\':-1,\\'z\\':3,\\'data\\':[new Date(1520640000000),new Date(1516924800000),new Date(1524268800000)]},{\\'name\\':\\'项目验收阶段\\',\\'type\\':\\'bar\\',\\'stack\\':\\'总量6\\',\\'label\\':{\\'normal\\':{\\'show\\':true,\\'color\\':\\'#000\\',\\'position\\':\\'right\\',\\'formatter\\':function(params){return params.seriesName}}},\\'itemStyle\\':{\\'normal\\':{\\'color\\':\\'orange\\',\\'borderColor\\':\\'#fff\\',\\'borderWidth\\':2}},\\'zlevel\\':-1,\\'data\\':[new Date(1522368000000),new Date(1520899200000),new Date(1525132800000)]},{\\'name\\':\\'项目验收阶段\\',\\'type\\':\\'bar\\',\\'stack\\':\\'总量6\\',\\'itemStyle\\':{\\'normal\\':{\\'color\\':\\'white\\'}},\\'zlevel\\':-1,\\'z\\':3,\\'data\\':[new Date(1521072000000),new Date(1518739200000),new Date(1525046400000)]}]};return option;\\\",\\n  \\\"linkageConfig\\\": [],\\n  \\\"dataMapping\\\": [],\\n  \\\"chartData\\\": [\\n    {\\n      \\\"value\\\": 0,\\n      \\\"name\\\": \\\"\\\"\\n    }\\n  ],\\n  \\\"option\\\": {\\n    \\\"grid\\\": {\\n      \\\"bottom\\\": 115\\n    },\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"title\\\": {\\n      \\\"text\\\": \\\"\\\",\\n      \\\"show\\\": true\\n    }\\n  }\\n}', '1', 'admin', '2022-07-18 19:45:58', 'admin', '2022-07-25 15:42:04');\nINSERT INTO `onl_drag_comp` VALUES ('725214423934730240', '100', '数值', 'JNumber', 'ant-design:field-number-outlined', 14, NULL, '{\\r\\n  \\\"w\\\": 12,\\r\\n  \\\"h\\\": 30,\\r\\n  \\\"dataType\\\": 1,\\r\\n  \\\"timeOut\\\": 0,\\r\\n  \\\"turnConfig\\\": {\\r\\n    \\\"url\\\": \\\"\\\"\\r\\n  },\\r\\n  \\\"chartData\\\": {\\r\\n    \\\"value\\\": \\\"1024\\\"\\r\\n  },\\r\\n  \\\"analysis\\\": {\\r\\n    \\\"isCompare\\\": false,\\r\\n    \\\"compareType\\\": \\\"\\\",\\r\\n    \\\"trendType\\\": \\\"1\\\"\\r\\n  },\\r\\n  \\\"option\\\": {\\r\\n    \\\"isCompare\\\": false,\\r\\n    \\\"trendType\\\": \\\"1\\\",\\r\\n    \\\"card\\\": {\\r\\n      \\\"title\\\": \\\"\\\",\\r\\n      \\\"extra\\\": \\\"\\\",\\r\\n      \\\"rightHref\\\": \\\"\\\",\\r\\n      \\\"size\\\": \\\"small\\\",\\r\\n      \\\"textStyle\\\": {\\r\\n        \\\"fontSize\\\": 18,\\r\\n        \\\"fontWeight\\\": \\\"bold\\\",\\r\\n        \\\"color\\\": \\\"#464646\\\"\\r\\n      }\\r\\n    },\\r\\n    \\\"body\\\": {\\r\\n      \\\"text\\\": \\\"\\\",\\r\\n      \\\"fontWeight\\\": \\\"bold\\\"\\r\\n    }\\r\\n  }\\r\\n}', '1', 'jeecg', '2022-09-01 15:10:03', 'jeecg', '2022-09-02 16:52:23');\nINSERT INTO `onl_drag_comp` VALUES ('728116316742778880', '100', '自定义按钮', 'JCustomButton', 'teenyicons:button-outline', 100, NULL, '{\\r\\n\t\t\\\"w\\\": 12,\\r\\n\t\t\\\"h\\\": 30,\\r\\n    \\\"dataType\\\": 1,\\r\\n    \\\"url\\\": \\\"\\\",\\r\\n    \\\"timeOut\\\": 0,\\r\\n    \\\"chartData\\\": [\\r\\n        {\\r\\n            \\\"btnId\\\": \\\"74591654852155\\\",\\r\\n            \\\"title\\\": \\\"销售订单\\\",\\r\\n            \\\"icon\\\": \\\"ant-design:calendar-twotone\\\",\\r\\n            \\\"color\\\": \\\"#ED4B82\\\",\\r\\n            \\\"operationType\\\": \\\"1\\\",\\r\\n            \\\"worksheet\\\": \\\"\\\",\\r\\n            \\\"view\\\": \\\"\\\",\\r\\n            \\\"defVal\\\": [\\r\\n                \\r\\n            ],\\r\\n            \\\"customPage\\\": \\\"\\\",\\r\\n            \\\"href\\\": {\\r\\n                \\\"url\\\": \\\"\\\",\\r\\n                \\\"isParam\\\": false,\\r\\n                \\\"params\\\": [\\r\\n                    \\r\\n                ]\\r\\n            },\\r\\n            \\\"openMode\\\": \\\"2\\\",\\r\\n            \\\"bizFlow\\\": \\\"\\\",\\r\\n            \\\"click\\\": {\\r\\n                \\\"type\\\": \\\"1\\\",\\r\\n                \\\"message\\\": {\\r\\n                    \\\"title\\\": \\\"你确认执行此操作吗？\\\",\\r\\n                    \\\"okText\\\": \\\"确认\\\",\\r\\n                    \\\"cancelText\\\": \\\"取消\\\"\\r\\n                }\\r\\n            }\\r\\n        }\\r\\n    ],\\r\\n    \\\"option\\\": {\\r\\n        \\\"title\\\": \\\"\\\",\\r\\n        \\\"btnType\\\": \\\"button\\\",\\r\\n        \\\"btnStyle\\\": \\\"solid\\\",\\r\\n        \\\"btnWidth\\\": \\\"custom\\\",\\r\\n        \\\"btnDirection\\\": \\\"column\\\",\\r\\n        \\\"rowNum\\\": 4\\r\\n    }\\r\\n}', '1', 'jeecg', '2022-09-09 15:21:08', 'jeecg', '2022-09-09 15:41:56');\nINSERT INTO `onl_drag_comp` VALUES ('72811631742776660', '100', '查询条件', 'JFilterQuery', 'ant-design:filter-filled', 100, NULL, '{\\r\\n\t\\\"w\\\": 12,\\r\\n\t\\\"h\\\": 12,\\r\\n\t\\\"dataType\\\": 1,\\r\\n\t\\\"url\\\": \\\"\\\",\\r\\n\t\\\"timeOut\\\": 0,\\r\\n\t\\\"chartData\\\": []\\r\\n}', '1', 'jeecg', '2022-09-09 15:21:08', 'jeecg', '2022-09-09 15:41:56');\nINSERT INTO `onl_drag_comp` VALUES ('729550825967222784', '100102', '透视表', 'JPivotTable', 'ant-design:table-outlined', 13, NULL, '{\\n  \\\"w\\\": 24,\\n  \\\"h\\\": 42,\\n  \\\"dataType\\\": 1,\\n  \\\"timeOut\\\": 0,\\n  \\\"chartData\\\": {\\n    \\\"x\\\": [\\n      {\\n        \\\"62eb2e00c349cde9883d3c1c\\\": [\\n          \\\"测试1\\\",\\n          \\\"测试1\\\",\\n          \\\"测试2\\\",\\n          \\\"测试3\\\"\\n        ]\\n      },\\n      {\\n        \\\"62f37518df6db6d3e0c9b7ad\\\": [\\n          \\\"1\\\",\\n          \\\"2\\\",\\n          \\\"3\\\",\\n          \\\"4\\\"\\n        ]\\n      }\\n    ],\\n    \\\"data\\\": [\\n      {\\n        \\\"y\\\": [\\n          \\\"2022/09\\\",\\n          \\\"2022\\\"\\n        ],\\n        \\\"t_id\\\": \\\"62f37456cf07c28f9312dd13\\\",\\n        \\\"data\\\": [\\n          111,\\n          null,\\n          null,\\n          null\\n        ],\\n        \\\"sum\\\": 111,\\n        \\\"summary_col\\\": false\\n      },\\n      {\\n        \\\"y\\\": [\\n          \\\"2022/09\\\",\\n          \\\"2022\\\"\\n        ],\\n        \\\"t_id\\\": \\\"62f37456cf07c28f9312dd14\\\",\\n        \\\"data\\\": [\\n          444,\\n          null,\\n          null,\\n          null\\n        ],\\n        \\\"sum\\\": 444,\\n        \\\"summary_col\\\": false\\n      },\\n      {\\n        \\\"y\\\": [\\n          \\\"2022/08\\\",\\n          \\\"2022\\\"\\n        ],\\n        \\\"t_id\\\": \\\"62f37456cf07c28f9312dd13\\\",\\n        \\\"data\\\": [\\n          null,\\n          222,\\n          333,\\n          444\\n        ],\\n        \\\"sum\\\": 999,\\n        \\\"summary_col\\\": false\\n      },\\n      {\\n        \\\"y\\\": [\\n          \\\"2022/08\\\",\\n          \\\"2022\\\"\\n        ],\\n        \\\"t_id\\\": \\\"62f37456cf07c28f9312dd14\\\",\\n        \\\"data\\\": [\\n          null,\\n          333,\\n          222,\\n          111\\n        ],\\n        \\\"sum\\\": 666,\\n        \\\"summary_col\\\": false\\n      },\\n      {\\n        \\\"y\\\": [],\\n        \\\"t_id\\\": \\\"62f37456cf07c28f9312dd13\\\",\\n        \\\"data\\\": [\\n          111,\\n          222,\\n          333,\\n          444\\n        ],\\n        \\\"sum\\\": 278,\\n        \\\"summary_col\\\": true\\n      },\\n      {\\n        \\\"y\\\": [],\\n        \\\"t_id\\\": \\\"62f37456cf07c28f9312dd14\\\",\\n        \\\"data\\\": [\\n          444,\\n          333,\\n          222,\\n          111\\n        ],\\n        \\\"sum\\\": 1110,\\n        \\\"summary_col\\\": true\\n      }\\n    ]\\n  },\\n  \\\"option\\\": {\\r\\n\t\t\\\"card\\\": {\\r\\n\t\t\t\\\"title\\\": \\\"未命名标题\\\",\\r\\n\t\t\t\\\"extra\\\": \\\"\\\",\\r\\n\t\t\t\\\"rightHref\\\": \\\"\\\",\\r\\n\t\t\t\\\"size\\\": \\\"default\\\"\\r\\n\t\t}\\r\\n  }\\n}', '1', 'jeecg', '2022-09-13 14:21:21', 'jeecg', '2022-09-13 20:13:32');\nINSERT INTO `onl_drag_comp` VALUES ('932219134883299328', '100', '当前时间', 'JCurrentTime', 'ant-design:field-time-outlined', 100, NULL, '{\\n  \\\"w\\\": 12,\\n  \\\"h\\\": 6,\\n  \\\"dataType\\\": 1,\\n  \\\"url\\\": \\\"http://api.jeecg.com/mock/42/nav\\\",\\n  \\\"timeOut\\\": 0,\\n\t\\\"background\\\": \\\"#3F7DD4\\\",\\n  \\\"turnConfig\\\": {\\n    \\\"url\\\": \\\"\\\"\\n  },\\n  \\\"chartData\\\": \\\"\\\",\\n  \\\"option\\\": {\\r\\n\t  \\\"showWeek\\\":\\\"show\\\",\\n    \\\"card\\\": {\\n      \\\"title\\\": \\\"\\\",\\n      \\\"extra\\\": \\\"\\\",\\n      \\\"rightHref\\\": \\\"\\\",\\n      \\\"size\\\": \\\"default\\\"\\n    },\\n    \\\"body\\\": {\\n      \\\"text\\\": \\\"\\\",\\n      \\\"color\\\": \\\"#FFFFFF\\\",\\n      \\\"fontWeight\\\": \\\"normal\\\",\\n      \\\"marginLeft\\\": 0,\\n      \\\"marginTop\\\": 0\\n    }\\n  }\\n}', '1', 'jeecg', '2024-03-25 20:32:51', 'jeecg', '2024-03-25 20:34:14');\n\n-- ----------------------------\n-- Table structure for onl_drag_dataset_head\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_drag_dataset_head`;\nCREATE TABLE `onl_drag_dataset_head`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'id',\n  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称',\n  `code` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '编码',\n  `parent_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父id',\n  `db_source` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '动态数据源',\n  `query_sql` varchar(5000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '查询数据SQL',\n  `content` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',\n  `iz_agent` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT 'iz_agent',\n  `data_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据类型',\n  `api_method` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'api方法：get/post',\n  `create_time` datetime NULL DEFAULT NULL,\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n  `update_time` datetime NULL DEFAULT NULL,\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n  `low_app_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '应用ID',\n  `tenant_id` int(10) NULL DEFAULT NULL COMMENT '租户ID',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_drag_dataset_head\n-- ----------------------------\nINSERT INTO `onl_drag_dataset_head` VALUES ('1011801324208574464', '大屏数据集', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-10-31 11:04:04', 'admin', NULL, NULL, NULL, 3);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1011805223195824128', '车辆归属地', '', '1011801324208574464', '', 'https://api.jeecg.com/mock/26/activering', '', '0', 'api', 'get', '2024-10-31 11:19:34', 'admin', '2024-11-15 11:50:54', 'admin', NULL, 3);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1011861146144657408', '拨打电话排行榜', '', '1011801324208574464', '', 'https://api.jeecg.com/mock/26/activering', '', '0', 'api', 'get', '2024-10-31 15:01:47', 'admin', NULL, NULL, NULL, 3);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1516317603268657153', '示例_参数查询', '', '1516743332632494082', '707437208002265088', 'select * from demo where name like \\'%${name}%\\'', '', '', 'sql', 'get', '2022-04-21 15:59:43', 'admin', '2022-04-21 17:28:44', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1516743332632494082', '示例数据集', NULL, NULL, NULL, '0', NULL, '0', NULL, NULL, '2022-04-20 19:39:25', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1516743766914924546', '统计近十日的登陆次数', '', '1516743332632494082', '707437208002265088', 'SELECT\\n\tcount(*) num,\\n\tDATE_FORMAT(create_time, \\'%Y-%m-%d\\') AS `day`\\nFROM\\n\tsys_log\\nWHERE\\n\tlog_type = 1\\nAND create_time > DATE_SUB(NOW(), INTERVAL 10 DAY)\\nGROUP BY\\n\tDATE_FORMAT(create_time, \\'%Y-%m-%d\\')', '', '', 'sql', 'get', '2022-04-20 19:41:08', 'admin', '2023-06-06 15:25:30', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1516748630344630273', '项目性质收入统计JSON', '', '1516743332632494082', '', '[\\n    {\\n        \\\"column1\\\": \\\"市场化-电商业务\\\",\\n        \\\"column2\\\": 4865.41,\\n        \\\"column3\\\": 0,\\n        \\\"column4\\\": 0,\\n        \\\"column5\\\": 0,\\n        \\\"column6\\\": 0,\\n        \\\"column7\\\": 0,\\n        \\\"column8\\\": 4865.41\\n    },\\n    {\\n        \\\"column1\\\": \\\"统筹型\\\",\\n        \\\"column2\\\": 35767081.88,\\n        \\\"column3\\\": 0,\\n        \\\"column4\\\": 0,\\n        \\\"column5\\\": 0,\\n        \\\"column6\\\": 0,\\n        \\\"column7\\\": 0,\\n        \\\"column8\\\": 35767081.88\\n    },\\n    {\\n        \\\"column1\\\": \\\"市场化-非股东\\\",\\n        \\\"column2\\\": 1487045.35,\\n        \\\"column3\\\": 0,\\n        \\\"column4\\\": 0,\\n        \\\"column5\\\": 0,\\n        \\\"column6\\\": 0,\\n        \\\"column7\\\": 0,\\n        \\\"column8\\\": 1487045.35\\n    },\\n    {\\n        \\\"column1\\\": \\\"市场化-参控股\\\",\\n        \\\"column2\\\": 382690.56,\\n        \\\"column3\\\": 0,\\n        \\\"column4\\\": 0,\\n        \\\"column5\\\": 0,\\n        \\\"column6\\\": 0,\\n        \\\"column7\\\": 0,\\n        \\\"column8\\\": 382690.56\\n    },\\n    {\\n        \\\"column1\\\": \\\"市场化-员工福利\\\",\\n        \\\"column2\\\": 256684.91,\\n        \\\"column3\\\": 0,\\n        \\\"column4\\\": 0,\\n        \\\"column5\\\": 0,\\n        \\\"column6\\\": 0,\\n        \\\"column7\\\": 0,\\n        \\\"column8\\\": 265684.91\\n    },\\n    {\\n        \\\"column1\\\": \\\"市场化-再保险\\\",\\n        \\\"column2\\\": 563451.03,\\n        \\\"column3\\\": 0,\\n        \\\"column4\\\": 0,\\n        \\\"column5\\\": 0,\\n        \\\"column6\\\": 0,\\n        \\\"column7\\\": 0,\\n        \\\"column8\\\": 563451.03\\n    },\\n    {\\n        \\\"column1\\\": \\\"市场化-海外业务\\\",\\n        \\\"column2\\\": 760576.25,\\n        \\\"column3\\\": 770458.75,\\n        \\\"column4\\\": 0,\\n        \\\"column5\\\": 0,\\n        \\\"column6\\\": 0,\\n        \\\"column7\\\": 0,\\n        \\\"column8\\\": 1531035.00\\n    },\\n    {\\n        \\\"column1\\\": \\\"市场化-风险咨询\\\",\\n        \\\"column2\\\": 0.00,\\n        \\\"column3\\\": 910183.93,\\n        \\\"column4\\\": 0,\\n        \\\"column5\\\": 0,\\n        \\\"column6\\\": 0,\\n        \\\"column7\\\": 226415.09,\\n        \\\"column8\\\": 1136599.02\\n    }\\n]', '', '', 'json', 'get', '2022-04-20 20:00:28', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1517020649262972930', '项目性质收入统计SQL', '', '1516743332632494082', '707437208002265088', 'SELECT\\n\tid,\\n\tnature,\\n\tinsurance_fee,\\n\trisk_consulting_fee,\\n\tevaluation_fee,\\n\tinsurance_evaluation_fee,\\n\tbidding_consulting_fee,\\n\tinterol_consulting_fee,\\n\t(\\n\t\tinsurance_fee + \\n\t\trisk_consulting_fee + \\n\t\trisk_consulting_fee + \\n\t\tevaluation_fee + \\n\t\tinsurance_evaluation_fee + \\n\t\tbidding_consulting_fee + \\n\t\tinterol_consulting_fee\\n\t) AS \\'total\\'\\nFROM\\n\tjeecg_project_nature_income', '', '', 'sql', 'get', '2022-04-21 14:01:22', 'admin', '2022-04-21 14:02:36', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1517045842874236930', '统计男女比例', '', '1516743332632494082', '707437208002265088', 'select count(*) cout, sex from sys_user group by sex', '', '', 'sql', 'get', '2022-04-21 15:41:29', 'admin', '2022-04-21 16:09:23', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1517046231342284802', '图表API示例-年龄占比', '', '1516743332632494082', '', 'http://api.jeecg.com/mock/51/jingwu/nianling', '', '', 'api', 'get', '2022-04-21 15:43:02', 'admin', '2022-04-21 16:54:33', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1517046731341070337', '统计每日大屏创建情况', '', '1516743332632494082', '707437208002265088', 'SELECT count(*) c,DATE_FORMAT(create_time, \\'%Y-%m-%d\\') as date  from jmreport_big_screen GROUP BY date order by date desc', '', '', 'sql', 'get', '2022-04-21 15:45:01', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1517071247723233281', '示例_根据年龄查询用户', '', '1516743332632494082', '707437208002265088', 'select * from demo where age=${age}', '', '', 'sql', 'get', '2022-04-21 17:22:26', 'admin', '2023-04-27 14:25:34', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1519274169102020610', '钻取api', '', '1516743332632494082', '', 'http://api.jeecg.com/mock/51/drilling/deptuser', '', '0', 'api', 'get', '2022-04-27 19:16:03', 'admin', '2022-04-29 18:52:08', 'jeecg', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1519945036454813698', '数据列表', '', '1516743332632494082', '', 'http://api.jeecg.com/mock/51/datalist/list', '', '0', 'api', 'get', '2022-04-29 15:41:51', 'admin', '2022-04-29 17:00:15', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1519962879095332865', '首页快速导航', '', '1516743332632494082', '', 'http://api.jeecg.com/mock/51/home/quick', '', '0', 'api', 'get', '2022-04-29 16:52:45', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1522098873378549762', '出资', '', '1516743332632494082', '', 'http://api.jeecg.com/mock/51/chuzi', '', '0', 'api', 'get', '2022-05-05 14:20:25', 'admin', '2022-05-05 14:22:06', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1522181219549196289', '智慧社区_违法犯罪人员分析', '', '1516743332632494082', '', 'http://api.jeecg.com/mock/51/Illegal', '', '0', 'api', 'get', '2022-05-05 19:47:38', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1522182473872584705', '智慧社区_人员出入记录', '', '1516743332632494082', '', 'http://api.jeecg.com/mock/51/ace', '', '0', 'api', 'get', '2022-05-05 19:52:37', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1522184215045615618', '智慧社区_年龄分部', '', '1516743332632494082', '', 'http://api.jeecg.com/mock/51/age', '', '0', 'api', 'get', '2022-05-05 19:59:32', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1522185936018878466', '智慧社区_地区分部', '', '1516743332632494082', '', 'http://api.jeecg.com/mock/51/region', '', '0', 'api', 'get', '2022-05-05 20:06:23', 'admin', '2022-05-05 20:06:38', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1522187101267832833', '智慧社区_时间分部', '', '1516743332632494082', '', '[\\n  {\\n    \\\"name\\\": \\\"6:00-9:00\\\",\\n    \\\"value\\\": 800\\n  },\\n  {\\n    \\\"name\\\": \\\"10:00-12:00\\\",\\n    \\\"value\\\": 300\\n  },\\n  {\\n    \\\"name\\\": \\\"13:00-15:00\\\",\\n    \\\"value\\\": 500\\n  },\\n  {\\n    \\\"name\\\": \\\"16:00-20:00\\\",\\n    \\\"value\\\": 800\\n  },\\n  {\\n    \\\"name\\\": \\\"21:00-24:00\\\",\\n    \\\"value\\\": 600\\n  }\\n]', '', '0', 'json', 'get', '2022-05-05 20:11:00', 'admin', '2022-05-05 20:11:12', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1522422772532256770', '乡村振兴_表格', '', '1516743332632494082', '', '[\\n  {\\n    \\\"name\\\": \\\"数据\\\",\\n    \\\"sj\\\": \\\"1000\\\",\\n    \\\"type\\\": \\\"担保\\\",\\n    \\\"je\\\": \\\"50\\\",\\n    \\\"jg\\\": \\\"机构\\\",\\n    \\\"jl\\\": \\\"数据2\\\"\\n  },\\n  {\\n    \\\"name\\\": \\\"数据1\\\",\\n    \\\"sj\\\": \\\"1500\\\",\\n    \\\"type\\\": \\\"担保\\\",\\n    \\\"je\\\": \\\"100\\\",\\n    \\\"jg\\\": \\\"机构2\\\",\\n    \\\"jl\\\": \\\"李四\\\"\\n  },\\n  {\\n    \\\"name\\\": \\\"数据\\\",\\n    \\\"sj\\\": \\\"1000\\\",\\n    \\\"type\\\": \\\"担保\\\",\\n    \\\"je\\\": \\\"50\\\",\\n    \\\"jg\\\": \\\"机构\\\",\\n    \\\"jl\\\": \\\"数据2\\\"\\n  },\\n  {\\n    \\\"name\\\": \\\"数据1\\\",\\n    \\\"sj\\\": \\\"1500\\\",\\n    \\\"type\\\": \\\"担保\\\",\\n    \\\"je\\\": \\\"100\\\",\\n    \\\"jg\\\": \\\"机构2\\\",\\n    \\\"jl\\\": \\\"李四\\\"\\n  },\\n  {\\n    \\\"name\\\": \\\"数据\\\",\\n    \\\"sj\\\": \\\"1000\\\",\\n    \\\"type\\\": \\\"担保\\\",\\n    \\\"je\\\": \\\"50\\\",\\n    \\\"jg\\\": \\\"机构\\\",\\n    \\\"jl\\\": \\\"数据2\\\"\\n  },\\n  {\\n    \\\"name\\\": \\\"数据1\\\",\\n    \\\"sj\\\": \\\"1500\\\",\\n    \\\"type\\\": \\\"担保\\\",\\n    \\\"je\\\": \\\"100\\\",\\n    \\\"jg\\\": \\\"机构2\\\",\\n    \\\"jl\\\": \\\"李四\\\"\\n  },\\n  {\\n    \\\"name\\\": \\\"数据\\\",\\n    \\\"sj\\\": \\\"1000\\\",\\n    \\\"type\\\": \\\"担保\\\",\\n    \\\"je\\\": \\\"50\\\",\\n    \\\"jg\\\": \\\"机构\\\",\\n    \\\"jl\\\": \\\"数据2\\\"\\n  },\\n  {\\n    \\\"name\\\": \\\"数据1\\\",\\n    \\\"sj\\\": \\\"1500\\\",\\n    \\\"type\\\": \\\"担保\\\",\\n    \\\"je\\\": \\\"100\\\",\\n    \\\"jg\\\": \\\"机构2\\\",\\n    \\\"jl\\\": \\\"李四\\\"\\n  }\\n]', '', '0', 'json', 'get', '2022-05-06 11:47:29', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1522455203175997442', '智能大数据_计划生产', '', '1516743332632494082', '', '[\\n    {\\n        \\\"gh\\\": \\\"ACDFE_0045\\\",\\n        \\\"gjbm\\\": \\\"56-REE-4\\\",\\n        \\\"jh\\\": \\\"1\\\",\\n        \\\"dqgx\\\": \\\"工程\\\",\\n        \\\"zt\\\": \\\"未开始\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"ACDFE_0045\\\",\\n        \\\"gjbm\\\": \\\"BB-1L-0004\\\",\\n        \\\"jh\\\": \\\"2\\\",\\n        \\\"dqgx\\\": \\\"工序\\\",\\n        \\\"zt\\\": \\\"未开始\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"JFL5GZ1-01\\\",\\n        \\\"gjbm\\\": \\\"DB-F5GNT-1\\\",\\n        \\\"jh\\\": \\\"1\\\",\\n        \\\"dqgx\\\": \\\"工程\\\",\\n        \\\"zt\\\": \\\"未开始\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"JFL5GZ1-01\\\",\\n        \\\"gjbm\\\": \\\"A5-0001\\\",\\n        \\\"jh\\\": \\\"1\\\",\\n        \\\"dqgx\\\": \\\"总装工序\\\",\\n        \\\"zt\\\": \\\"未开始\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"ACDFE_0045\\\",\\n        \\\"gjbm\\\": \\\"56-REE-4\\\",\\n        \\\"jh\\\": \\\"1\\\",\\n        \\\"dqgx\\\": \\\"工程\\\",\\n        \\\"zt\\\": \\\"未开始\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"ACDFE_0045\\\",\\n        \\\"gjbm\\\": \\\"BB-1L-0004\\\",\\n        \\\"jh\\\": \\\"2\\\",\\n        \\\"dqgx\\\": \\\"工序\\\",\\n        \\\"zt\\\": \\\"未开始\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"JFL5GZ1-01\\\",\\n        \\\"gjbm\\\": \\\"DB-F5GNT-1\\\",\\n        \\\"jh\\\": \\\"1\\\",\\n        \\\"dqgx\\\": \\\"工程\\\",\\n        \\\"zt\\\": \\\"未开始\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"JFL5GZ1-01\\\",\\n        \\\"gjbm\\\": \\\"A5-0001\\\",\\n        \\\"jh\\\": \\\"1\\\",\\n        \\\"dqgx\\\": \\\"总装工序\\\",\\n        \\\"zt\\\": \\\"未开始\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"ACDFE_0045\\\",\\n        \\\"gjbm\\\": \\\"56-REE-4\\\",\\n        \\\"jh\\\": \\\"1\\\",\\n        \\\"dqgx\\\": \\\"工程\\\",\\n        \\\"zt\\\": \\\"未开始\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"ACDFE_0045\\\",\\n        \\\"gjbm\\\": \\\"BB-1L-0004\\\",\\n        \\\"jh\\\": \\\"2\\\",\\n        \\\"dqgx\\\": \\\"工序\\\",\\n        \\\"zt\\\": \\\"未开始\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"JFL5GZ1-01\\\",\\n        \\\"gjbm\\\": \\\"DB-F5GNT-1\\\",\\n        \\\"jh\\\": \\\"1\\\",\\n        \\\"dqgx\\\": \\\"工程\\\",\\n        \\\"zt\\\": \\\"未开始\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"JFL5GZ1-01\\\",\\n        \\\"gjbm\\\": \\\"A5-0001\\\",\\n        \\\"jh\\\": \\\"1\\\",\\n        \\\"dqgx\\\": \\\"总装工序\\\",\\n        \\\"zt\\\": \\\"未开始\\\"\\n    }\\n]', '', '0', 'json', 'get', '2022-05-06 13:56:21', 'admin', '2022-05-06 18:22:13', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1522464505970302978', '旅游数据监控', '', '1516743332632494082', '', '[{\\\"type1\\\":\\\"路线1\\\",\\\"type2\\\":\\\"1111\\\",\\\"type3\\\":\\\"1111\\\"},{\\\"type1\\\":\\\"路线2\\\",\\\"type2\\\":\\\"1111\\\",\\\"type3\\\":\\\"1111\\\"},{\\\"type1\\\":\\\"路线3\\\",\\\"type3\\\":\\\"1111\\\",\\\"type2\\\":\\\"1111\\\"},{\\\"type1\\\":\\\"路线4\\\",\\\"type2\\\":\\\"1111\\\",\\\"type3\\\":\\\"1111\\\"},{\\\"type1\\\":\\\"路线5\\\",\\\"type2\\\":\\\"1111\\\",\\\"type3\\\":\\\"1111\\\"},{\\\"type1\\\":\\\"路线6\\\",\\\"type2\\\":\\\"1111\\\",\\\"type3\\\":\\\"1111\\\"},{\\\"type1\\\":\\\"路线7\\\",\\\"type2\\\":\\\"1111\\\",\\\"type3\\\":\\\"1111\\\"},{\\\"type1\\\":\\\"路线8\\\",\\\"type2\\\":\\\"1111\\\",\\\"type3\\\":\\\"1111\\\"},{\\\"type1\\\":\\\"路线9\\\",\\\"type2\\\":\\\"1111\\\",\\\"type3\\\":\\\"1111\\\"},{\\\"type1\\\":\\\"路线10\\\",\\\"type2\\\":\\\"1111\\\",\\\"type3\\\":\\\"1111\\\"},{\\\"type1\\\":\\\"路线11\\\",\\\"type2\\\":\\\"1111\\\",\\\"type3\\\":\\\"1111\\\"},{\\\"type1\\\":\\\"路线12\\\",\\\"type2\\\":\\\"1111\\\",\\\"type3\\\":\\\"1111\\\"},{\\\"type1\\\":\\\"路线13\\\",\\\"type2\\\":\\\"1111\\\",\\\"type3\\\":\\\"1111\\\"},{\\\"type1\\\":\\\"路线14\\\",\\\"type2\\\":\\\"1111\\\",\\\"type3\\\":\\\"1111\\\"},{\\\"type1\\\":\\\"路线15\\\",\\\"type2\\\":\\\"1111\\\",\\\"type3\\\":\\\"1111\\\"},{\\\"type1\\\":\\\"路线16\\\",\\\"type2\\\":\\\"1111\\\",\\\"type3\\\":\\\"1111\\\"},{\\\"type1\\\":\\\"路线17\\\",\\\"type2\\\":\\\"1111\\\",\\\"type3\\\":\\\"1111\\\"},{\\\"type1\\\":\\\"路线18\\\",\\\"type2\\\":\\\"1111\\\",\\\"type3\\\":\\\"1111\\\"},{\\\"type1\\\":\\\"路线19\\\",\\\"type2\\\":\\\"1111\\\",\\\"type3\\\":\\\"1111\\\"},{\\\"type1\\\":\\\"路线20\\\",\\\"type2\\\":\\\"1111\\\",\\\"type3\\\":\\\"1111\\\"}]', '', '0', 'json', 'get', '2022-05-06 14:33:19', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1522503560003067906', '首页_近一周访问量', '', '1516743332632494082', '707437208002265088', 'select count(*) as visit\\n        \t   ,count(distinct(ip)) as ip\\n        \t   ,DATE_FORMAT(create_time, \\'%Y-%m-%d\\') as tian\\n        \t   ,DATE_FORMAT(create_time, \\'%m-%d\\') as type\\n        \t   from sys_log \\n         where log_type = 1 and create_time <= sysdate() and create_time >= (select date_sub(curdate(),interval 7 day))\\n         group by tian,type\\n         order by tian desc', '', '0', 'sql', 'get', '2022-05-06 17:08:30', 'admin', '2022-05-06 17:49:07', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1522522034783920129', '智能大数据_实际生产', '', '1516743332632494082', '', '[\\n    {\\n        \\\"gh\\\": \\\"ATJDS01\\\",\\n        \\\"gjbm\\\": \\\"TYIY-908\\\",\\n        \\\"jgsj\\\": \\\"2021-03-28 17:07\\\",\\n        \\\"dqgx\\\": \\\"工序1\\\",\\n        \\\"zt\\\": \\\"已完成\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"ATJDS01\\\",\\n        \\\"gjbm\\\": \\\"11CPER-44\\\",\\n        \\\"jgsj\\\": \\\"2021-03-29 18:07\\\",\\n        \\\"dqgx\\\": \\\"工序2\\\",\\n        \\\"zt\\\": \\\"已完成\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"PFTE56\\\",\\n        \\\"gjbm\\\": \\\"F56677\\\",\\n        \\\"jgsj\\\": \\\"2021-02-28 07:07\\\",\\n        \\\"dqgx\\\": \\\"工序1\\\",\\n        \\\"zt\\\": \\\"已完成\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"PFTE56\\\",\\n        \\\"gjbm\\\": \\\"99CVB-1\\\",\\n        \\\"jgsj\\\": \\\"2021-03-28 17:07\\\",\\n        \\\"dqgx\\\": \\\"工序3\\\",\\n        \\\"zt\\\": \\\"已完成\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"ATJDS01\\\",\\n        \\\"gjbm\\\": \\\"TYIY-908\\\",\\n        \\\"jgsj\\\": \\\"2021-03-28 17:07\\\",\\n        \\\"dqgx\\\": \\\"工序1\\\",\\n        \\\"zt\\\": \\\"已完成\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"ATJDS01\\\",\\n        \\\"gjbm\\\": \\\"11CPER-44\\\",\\n        \\\"jgsj\\\": \\\"2021-03-28 17:07\\\",\\n        \\\"dqgx\\\": \\\"工序2\\\",\\n        \\\"zt\\\": \\\"已完成\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"PFTE56\\\",\\n        \\\"gjbm\\\": \\\"F56677\\\",\\n        \\\"jgsj\\\": \\\"2021-03-28 17:07\\\",\\n        \\\"dqgx\\\": \\\"工序1\\\",\\n        \\\"zt\\\": \\\"已完成\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"PFTE56\\\",\\n        \\\"gjbm\\\": \\\"99CVB-1\\\",\\n        \\\"jgsj\\\": \\\"2021-03-28 17:07\\\",\\n        \\\"dqgx\\\": \\\"工序3\\\",\\n        \\\"zt\\\": \\\"已完成\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"ATJDS01\\\",\\n        \\\"gjbm\\\": \\\"TYIY-908\\\",\\n        \\\"jgsj\\\": \\\"2021-03-28 17:07\\\",\\n        \\\"dqgx\\\": \\\"工序1\\\",\\n        \\\"zt\\\": \\\"已完成\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"ATJDS01\\\",\\n        \\\"gjbm\\\": \\\"11CPER-44\\\",\\n        \\\"jgsj\\\": \\\"2021-03-28 17:07\\\",\\n        \\\"dqgx\\\": \\\"工序2\\\",\\n        \\\"zt\\\": \\\"已完成\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"PFTE56\\\",\\n        \\\"gjbm\\\": \\\"F56677\\\",\\n        \\\"jgsj\\\": \\\"2021-03-28 17:07\\\",\\n        \\\"dqgx\\\": \\\"工序1\\\",\\n        \\\"zt\\\": \\\"已完成\\\"\\n    },\\n    {\\n        \\\"gh\\\": \\\"PFTE56\\\",\\n        \\\"gjbm\\\": \\\"99CVB-1\\\",\\n        \\\"jgsj\\\": \\\"2021-03-28 17:07\\\",\\n        \\\"dqgx\\\": \\\"工序3\\\",\\n        \\\"zt\\\": \\\"已完成\\\"\\n    }\\n]', '', '0', 'json', 'get', '2022-05-06 18:21:55', 'admin', '2022-05-06 18:23:06', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1522523544120991745', '智能大数据_一览表', '', '1516743332632494082', '', '[\\n    {\\n        \\\"ddh\\\": \\\"A5CCU_2017...\\\",\\n        \\\"zcxm\\\": \\\"国际城0902\\\",\\n        \\\"zl\\\": \\\"2548\\\",\\n        \\\"jhrq\\\": \\\"2021-04-21\\\",\\n        \\\"scjd\\\": \\\"100%\\\"\\n    },\\n    {\\n        \\\"ddh\\\": \\\"A5CCU_2017...\\\",\\n        \\\"zcxm\\\": \\\"新城ERT\\\",\\n        \\\"zl\\\": \\\"27215\\\",\\n        \\\"jhrq\\\": \\\"2021-05-21\\\",\\n        \\\"scjd\\\": \\\"54%\\\"\\n    },\\n    {\\n        \\\"ddh\\\": \\\"A5CCU_2018...\\\",\\n        \\\"zcxm\\\": \\\"天桥TTY\\\",\\n        \\\"zl\\\": \\\"5423\\\",\\n        \\\"jhrq\\\": \\\"2021-12-21\\\",\\n        \\\"scjd\\\": \\\"100%\\\"\\n    },\\n    {\\n        \\\"ddh\\\": \\\"A5CCU_2018...\\\",\\n        \\\"zcxm\\\": \\\"国际中心地\\\",\\n        \\\"zl\\\": \\\"14427\\\",\\n        \\\"jhrq\\\": \\\"2021-12-21\\\",\\n        \\\"scjd\\\": \\\"88%\\\"\\n    },\\n    {\\n        \\\"ddh\\\": \\\"A5CCU_2019...\\\",\\n        \\\"zcxm\\\": \\\"新生广场\\\",\\n        \\\"zl\\\": \\\"2808\\\",\\n        \\\"jhrq\\\": \\\"2021-08-21\\\",\\n        \\\"scjd\\\": \\\"98%\\\"\\n    },\\n    {\\n        \\\"ddh\\\": \\\"A5CCU_2017...\\\",\\n        \\\"zcxm\\\": \\\"国际城0902\\\",\\n        \\\"zl\\\": \\\"2548\\\",\\n        \\\"jhrq\\\": \\\"2021-04-21\\\",\\n        \\\"scjd\\\": \\\"100%\\\"\\n    },\\n    {\\n        \\\"ddh\\\": \\\"A5CCU_2019...\\\",\\n        \\\"zcxm\\\": \\\"新生广场\\\",\\n        \\\"zl\\\": \\\"2808\\\",\\n        \\\"jhrq\\\": \\\"2021-08-21\\\",\\n        \\\"scjd\\\": \\\"98%\\\"\\n    },\\n    {\\n        \\\"ddh\\\": \\\"A5CCU_2017...\\\",\\n        \\\"zcxm\\\": \\\"新城ERT\\\",\\n        \\\"zl\\\": \\\"27215\\\",\\n        \\\"jhrq\\\": \\\"2021-05-21\\\",\\n        \\\"scjd\\\": \\\"54%\\\"\\n    }\\n]', '', '0', 'json', 'get', '2022-05-06 18:27:55', 'admin', '2022-05-06 18:28:53', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1522824721899511810', '示例_数据表格', '', '1516743332632494082', '707437208002265088', 'select * from demo where sex=\\'${sex}\\'', '', '0', 'sql', 'get', '2022-05-07 14:24:41', 'admin', '2022-05-07 14:53:35', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('1522853857095376898', '示例_日期范围查询', '', '1516743332632494082', '707437208002265088', 'select * from sys_user where create_time >= \\'${createTime_begin}\\' and create_time <=\\'${createTime_end}\\'', '', '0', 'sql', 'get', '2022-05-07 16:20:27', 'admin', '2022-05-07 19:29:07', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('864649684727169024', 'cc1分组', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-21 09:35:59', 'admin', '2024-03-06 16:07:25', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('874452164751183872', '日志统计', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-10-18 10:47:33', 'ceshi', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('874452378731991040', '查询系统日志', '', '874452164751183872', '707437208002265088', 'select DATE_FORMAT(create_time,  \\'%Y-%m-%d\\') as date,count(*) as num from sys_log group by DATE_FORMAT(create_time, \\'%Y-%m-%d\\')', '', '0', 'sql', 'get', '2023-10-18 10:48:24', 'ceshi', '2023-12-31 19:29:46', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910401375061983232', '库存管理可视化大屏', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-01-25 15:36:52', 'admin', '2024-01-25 17:31:14', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910406419257802752', '库存管理-卡片', '', '910401375061983232', '', 'https://api.jeecg.com/mock/51/inventoryManagement', '', '0', 'api', 'get', '2024-01-25 15:56:55', 'admin', '2024-01-25 16:02:28', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910419343896526848', 'air库存情况', '', '910401375061983232', '', 'https://api.jeecg.com/mock/51/inventoryStatus?type=air', '', '0', 'api', 'get', '2024-01-25 16:48:16', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910423953398874112', 'lite库存情况', '', '910401375061983232', '', 'https://api.jeecg.com/mock/51/inventoryStatus?type=lite', '', '0', 'api', 'get', '2024-01-25 17:06:35', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910425301976662016', 'super库存情况', '', '910401375061983232', '', 'https://api.jeecg.com/mock/51/inventoryStatus?type=super', '', '0', 'api', 'get', '2024-01-25 17:11:57', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910427052079366144', 'ultra库存情况', '', '910401375061983232', '', 'https://api.jeecg.com/mock/51/inventoryStatus?type=ultra', '', '0', 'api', 'get', '2024-01-25 17:18:54', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910430104345690112', '产品库存占比情况', '', '910401375061983232', '', 'https://api.jeecg.com/mock/51/inventoryChart?type=storkProportion', '', '0', 'api', 'get', '2024-01-25 17:31:02', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910431120222896128', '仓库状态情况', '', '910401375061983232', '', 'https://api.jeecg.com/mock/51/inventoryChart?type=warehouseStatus', '', '0', 'api', 'get', '2024-01-25 17:35:04', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910435726206222336', '当月出库情况', '', '910401375061983232', '', 'https://api.jeecg.com/mock/51/inventoryChart?type=outbound', '', '0', 'api', 'get', '2024-01-25 17:53:22', 'admin', '2024-01-25 17:59:40', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910441161197928448', '当月入库情况', '', '910401375061983232', '', 'https://api.jeecg.com/mock/51/inventoryChart?type=warehousing', '', '0', 'api', 'get', '2024-01-25 18:14:58', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910442989620871168', '产品库存覆盖率情况', '', '910401375061983232', '', 'https://api.jeecg.com/mock/51/inventoryChart?type=coverage', '', '0', 'api', 'get', '2024-01-25 18:22:14', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910447275230674944', '产品库龄分布情况', '', '910401375061983232', '', 'https://api.jeecg.com/mock/51/inventoryChart?type=stockAge', '', '0', 'api', 'get', '2024-01-25 18:39:15', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910455640270880768', '产品库存状态监控', '', '910401375061983232', '', 'https://api.jeecg.com/mock/51/inventoryChart?type=monitor', '', '0', 'api', 'get', '2024-01-25 19:12:30', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910478407196262400', '某电商公司销售运营', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-01-25 20:42:58', 'admin', '2024-01-25 20:43:03', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910478592823574528', '销售状态', '', '910478407196262400', '', 'https://api.jeecg.com/mock/51/commerceSalesOperations?type=saleStatus', '', '0', 'api', 'get', '2024-01-25 20:43:42', 'admin', '2024-01-25 20:45:22', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910695134387552256', '各地区订单与仓库情况', '', '910478407196262400', '', 'https://api.jeecg.com/mock/51/commerceSalesOperations?type=regionalOrders', '', '0', 'api', 'get', '2024-01-26 11:04:10', 'admin', '2024-01-26 11:34:02', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910708293282349056', '季度目标完成', '', '910478407196262400', '', 'https://api.jeecg.com/mock/51/commerceSalesOperations?type=quarterlyFinish', '', '0', 'api', 'get', '2024-01-26 11:56:27', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910721009699045376', '品牌销售占比', '', '910478407196262400', '', 'https://api.jeecg.com/mock/51/commerceSalesOperations?type=brandSales', '', '0', 'api', 'get', '2024-01-26 12:46:59', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910732622212677632', '销售地区排行', '', '910478407196262400', '', 'https://api.jeecg.com/mock/51/commerceSalesOperations?type=areaRanking', '', '0', 'api', 'get', '2024-01-26 13:33:07', 'admin', '2024-01-26 13:33:13', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910737864308342784', '物流订单接收', '', '910478407196262400', '', 'https://api.jeecg.com/mock/51/commerceSalesOperations?type=logisticsOrder', '', '0', 'api', 'get', '2024-01-26 13:53:57', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910740127152128000', '订单产生趋势', '', '910478407196262400', '', 'https://api.jeecg.com/mock/51/commerceSalesOperations?type=generatingTrends', '', '0', 'api', 'get', '2024-01-26 14:02:57', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910750333919608832', '物业消防巡检状态', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-01-26 14:43:30', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910750488542625792', '区域基本情况', '', '910750333919608832', '', 'https://api.jeecg.com/mock/51/propertyFireFighting?type=regionBasicInformation', '', '0', 'api', 'get', '2024-01-26 14:44:07', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910754028661030912', '正常设备', '', '910750333919608832', '', 'https://api.jeecg.com/mock/51/propertyFireFighting?type=normalDevice', '', '0', 'api', 'get', '2024-01-26 14:58:11', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910754465934000128', '异常设备', '', '910750333919608832', '', 'https://api.jeecg.com/mock/51/propertyFireFighting?type=abnormalDevice', '', '0', 'api', 'get', '2024-01-26 14:59:55', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910759432656830464', '设备异常明细', '', '910750333919608832', '', 'https://api.jeecg.com/mock/51/propertyFireFighting?type=equipmentDetails', '', '0', 'api', 'get', '2024-01-26 15:19:40', 'admin', '2024-01-26 15:20:43', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910765056765509632', '小区地图分布', '', '910750333919608832', '', 'https://api.jeecg.com/mock/51/propertyFireFighting?type=residentialDistributionMap', '', '0', 'api', 'get', '2024-01-26 15:42:00', 'admin', '2024-01-26 15:43:52', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910773111884398592', '小区分布地图表格', '', '910750333919608832', '', 'https://api.jeecg.com/mock/51/propertyFireFighting?type=residentialDistributionTable', '', '0', 'api', 'get', '2024-01-26 16:14:01', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910776816075587584', '室外消火栓泵', '', '910750333919608832', '', 'https://api.jeecg.com/mock/51/propertyFireFighting?type=deviceCountProportion', '', '0', 'api', 'get', '2024-01-26 16:28:44', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910790230315417600', '区域设备数量\t', '', '910750333919608832', '', 'https://api.jeecg.com/mock/51/propertyFireFighting?type=areaDeviceCount', '', '0', 'api', 'get', '2024-01-26 17:22:02', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910794755508060160', '巡检任务数', '', '910750333919608832', '', 'https://api.jeecg.com/mock/51/propertyFireFighting?type=inspectionTasksCount', '', '0', 'api', 'get', '2024-01-26 17:40:01', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('910797586147360768', '巡检任务数表格', '', '910750333919608832', '', 'https://api.jeecg.com/mock/51/propertyFireFighting?type=inspectionTasksTable', '', '0', 'api', 'get', '2024-01-26 17:51:16', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911773848785436672', '某连锁饮品销售', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-01-29 10:30:35', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911792028287287296', '销量额', '', '911773848785436672', '', 'https://api.jeecg.com/mock/51/beverageSales?type=salesVolume', '', '0', 'api', 'get', '2024-01-29 11:42:50', 'admin', '2024-01-29 11:46:35', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911836343134896128', '单月最高销售量分店\t', '', '911773848785436672', '', 'https://api.jeecg.com/mock/51/beverageSales?type=topSellingBranch', '', '0', 'api', 'get', '2024-01-29 14:38:55', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911836426450550784', '单月最高销量品线\t', '', '911773848785436672', '', 'https://api.jeecg.com/mock/51/beverageSales?type=salesLine', '', '0', 'api', 'get', '2024-01-29 14:39:15', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911836535531814912', '单月最高销量单品', '', '911773848785436672', '', 'https://api.jeecg.com/mock/51/beverageSales?type=highestSellingItem', '', '0', 'api', 'get', '2024-01-29 14:39:41', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911836717715603456', '单月最高销量规格', '', '911773848785436672', '', 'https://api.jeecg.com/mock/51/beverageSales?type=maximumSalesSpecs', '', '0', 'api', 'get', '2024-01-29 14:40:24', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911836839023263744', '销售额走势', '', '911773848785436672', '', 'https://api.jeecg.com/mock/51/beverageSales?type=salesTrend', '', '0', 'api', 'get', '2024-01-29 14:40:53', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911836922162757632', '销量走势', '', '911773848785436672', '', 'https://api.jeecg.com/mock/51/beverageSales?type=salesTendency', '', '0', 'api', 'get', '2024-01-29 14:41:13', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911837008343121920', '订单销售量\t', '', '911773848785436672', '', 'https://api.jeecg.com/mock/51/beverageSales?type=orderSalesVolume', '', '0', 'api', 'get', '2024-01-29 14:41:34', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911837091507781632', '店铺销售额排名', '', '911773848785436672', '', 'https://api.jeecg.com/mock/51/beverageSales?type=salesRanking', '', '0', 'api', 'get', '2024-01-29 14:41:53', 'admin', '2024-01-29 15:44:55', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911837168896884736', ' 冷热占比', '', '911773848785436672', '', 'https://api.jeecg.com/mock/51/beverageSales?type=coldAndHostProportion', '', '0', 'api', 'get', '2024-01-29 14:42:12', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911845934736392192', '原料支出趋势', '', '911773848785436672', '', 'https://api.jeecg.com/mock/51/beverageSales?type=expenditureTrends', '', '0', 'api', 'get', '2024-01-29 15:17:02', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911878648998969344', '产品销售数据', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2024-01-29 17:27:02', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911887596497977344', '本月渠道销售', '', '911878648998969344', '', 'https://api.jeecg.com/mock/51/productSales?type=salesThisMonth', '', '0', 'api', 'get', '2024-01-29 18:02:35', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911887691259887616', '本月代理商销售排行', '', '911878648998969344', '', 'https://api.jeecg.com/mock/51/productSales?type=salesRanking', '', '0', 'api', 'get', '2024-01-29 18:02:57', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911888632709169152', '近七天销售额趋势', '', '911878648998969344', '', 'https://api.jeecg.com/mock/51/productSales?type=salesTrend', '', '0', 'api', 'get', '2024-01-29 18:06:42', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911888715248877568', '本月重点城市的重点产品销售额', '', '911878648998969344', '', 'https://api.jeecg.com/mock/51/productSales?type=productSalesRevenue', '', '0', 'api', 'get', '2024-01-29 18:07:02', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911888877589413888', '本月重点城市的重点产品销售额（表格）', '', '911878648998969344', '', 'https://api.jeecg.com/mock/51/productSales?type=productSalesRevenueTable', '', '0', 'api', 'get', '2024-01-29 18:07:40', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911889006916583424', '本月产品销售', '', '911878648998969344', '', 'https://api.jeecg.com/mock/51/productSales?type=productSalesThisMonth', '', '0', 'api', 'get', '2024-01-29 18:08:11', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('911889086163763200', '本月产品小类销售排行', '', '911878648998969344', '', 'https://api.jeecg.com/mock/51/productSales?type=rankingCategorySales', '', '0', 'api', 'get', '2024-01-29 18:08:30', 'admin', NULL, NULL, NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('925264960069664768', 'cc1请假性别汇总', '', '864649684727169024', '707437208002265088', 'SELECT sex, COUNT(*) as count\\nFROM demo\\nGROUP BY sex', '', '0', 'sql', 'get', '2024-03-06 15:59:27', 'admin', '2024-06-12 18:01:28', 'admin', NULL, NULL);\nINSERT INTO `onl_drag_dataset_head` VALUES ('965151322172129280', 'qingjia', '', '1516743332632494082', '707437208002265088', 'select * from qingjia_dan', '', '0', 'sql', 'get', '2024-06-24 17:33:37', 'admin', NULL, NULL, NULL, NULL);\n\n-- ----------------------------\n-- Table structure for onl_drag_dataset_item\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_drag_dataset_item`;\nCREATE TABLE `onl_drag_dataset_item`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'id',\n  `head_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主表ID',\n  `field_name` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字段名',\n  `field_txt` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字段文本',\n  `field_type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字段类型',\n  `widget_type` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '控件类型',\n  `dict_code` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典Code',\n  `dict_table` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n  `dict_text` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n  `iz_show` varchar(5) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否列表显示',\n  `iz_search` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否查询',\n  `iz_total` varchar(5) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否计算总计（仅对数值有效）',\n  `search_mode` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询模式',\n  `order_num` int(11) NULL DEFAULT NULL COMMENT '排序',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_oddi_head_id`(`head_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_drag_dataset_item\n-- ----------------------------\nINSERT INTO `onl_drag_dataset_item` VALUES ('1011861146174017536', '1011861146144657408', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-10-31 15:01:47', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1011861146207571968', '1011861146144657408', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-10-31 15:01:47', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1017248926035136512', '1011805223195824128', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-10-31 11:19:34', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1017248926102245376', '1011805223195824128', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-10-31 11:19:34', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1516748630361407489', '1516748630344630273', 'column1', '项目性质', 'String', NULL, '', NULL, NULL, 'Y', NULL, 'Y', NULL, NULL, 'admin', '2022-04-20 20:00:28', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1516748630373990402', '1516748630344630273', 'column5', '保险公估费', 'Integer', NULL, '', NULL, NULL, 'Y', NULL, 'Y', NULL, NULL, 'admin', '2022-04-20 20:00:28', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1516748630382379010', '1516748630344630273', 'column4', '承保公估评估费', 'Integer', NULL, '', NULL, NULL, 'Y', NULL, 'Y', NULL, NULL, 'admin', '2022-04-20 20:00:28', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1516748630394961921', '1516748630344630273', 'column3', '风险咨询费', 'Integer', NULL, '', NULL, NULL, 'Y', NULL, 'Y', NULL, NULL, 'admin', '2022-04-20 20:00:28', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1516748630403350530', '1516748630344630273', 'column2', '保险经纪佣金费', 'Integer', NULL, '', NULL, NULL, 'Y', NULL, 'Y', NULL, NULL, 'admin', '2022-04-20 20:00:28', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1516748630415933442', '1516748630344630273', 'column8', '总计', 'Integer', NULL, '', NULL, NULL, 'Y', NULL, 'Y', NULL, NULL, 'admin', '2022-04-20 20:00:28', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1516748630424322049', '1516748630344630273', 'column7', '内控咨询费', 'Integer', NULL, '', NULL, NULL, 'Y', NULL, 'Y', NULL, NULL, 'admin', '2022-04-20 20:00:28', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1516748630432710658', '1516748630344630273', 'column6', '投标咨询费', 'Integer', NULL, '', NULL, NULL, 'Y', NULL, 'Y', NULL, NULL, 'admin', '2022-04-20 20:00:28', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1517020958387372033', '1517020649262972930', 'nature', '项目性质', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, 'Y', NULL, NULL, 'admin', '2022-04-21 14:01:22', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1517020958395760641', '1517020649262972930', 'insurance_fee', '保险经纪佣金费', 'Integer', NULL, NULL, NULL, NULL, 'Y', NULL, 'Y', NULL, NULL, 'admin', '2022-04-21 14:01:22', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1517020958412537857', '1517020649262972930', 'risk_consulting_fee', '风险咨询费', 'Integer', NULL, NULL, NULL, NULL, 'Y', NULL, 'Y', NULL, NULL, 'admin', '2022-04-21 14:01:22', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1517020958429315073', '1517020649262972930', 'evaluation_fee', '承保公估评估费', 'Integer', NULL, NULL, NULL, NULL, 'Y', NULL, 'Y', NULL, NULL, 'admin', '2022-04-21 14:01:22', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1517020958446092290', '1517020649262972930', 'insurance_evaluation_fee', '保险公估费', 'Integer', NULL, NULL, NULL, NULL, 'Y', NULL, 'Y', NULL, NULL, 'admin', '2022-04-21 14:01:22', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1517020958462869505', '1517020649262972930', 'bidding_consulting_fee', '投标咨询费', 'Integer', NULL, NULL, NULL, NULL, 'Y', NULL, 'Y', NULL, NULL, 'admin', '2022-04-21 14:01:22', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1517020958475452418', '1517020649262972930', 'interol_consulting_fee', '内控咨询费', 'Integer', NULL, NULL, NULL, NULL, 'Y', NULL, 'Y', NULL, NULL, 'admin', '2022-04-21 14:01:22', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1517020958483841026', '1517020649262972930', 'total', 'total', 'Integer', NULL, NULL, NULL, NULL, 'N', NULL, 'N', NULL, NULL, 'admin', '2022-04-21 14:01:22', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1517046731353653249', '1517046731341070337', 'date', '日期', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-04-21 15:45:01', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1517046731362041857', '1517046731341070337', 'c', '数量', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, 'Y', NULL, NULL, 'admin', '2022-04-21 15:45:01', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1517052863103139842', '1517045842874236930', 'sex', '性别', 'String', NULL, 'sex', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-04-21 15:41:29', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1517052863115722754', '1517045842874236930', 'cout', '人数', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-04-21 15:41:29', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1517064229583093762', '1517046231342284802', 'name', '年龄', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-04-21 16:46:03', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1517064229595676674', '1517046231342284802', 'value', '数量', 'Integer', NULL, NULL, NULL, NULL, 'Y', NULL, 'Y', NULL, NULL, 'admin', '2022-04-21 16:46:03', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1517072834290024450', '1516317603268657153', 'name', 'name', 'String', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'admin', '2022-04-21 17:28:44', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1517072834331967489', '1516317603268657153', 'sex', 'sex', 'String', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'admin', '2022-04-21 17:28:44', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1517072834340356097', '1516317603268657153', 'age', 'age', 'String', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'admin', '2022-04-21 17:28:44', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1519962879107915777', '1519962879095332865', 'title', 'title', 'String', NULL, NULL, NULL, NULL, 'true', NULL, NULL, NULL, 1, 'admin', '2022-04-29 16:52:45', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1519962879124692994', '1519962879095332865', 'icon', 'icon', 'String', NULL, NULL, NULL, NULL, 'true', NULL, NULL, NULL, 2, 'admin', '2022-04-29 16:52:45', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1519962879137275906', '1519962879095332865', 'color', 'color', 'String', NULL, NULL, NULL, NULL, 'true', NULL, NULL, NULL, 3, 'admin', '2022-04-29 16:52:45', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1519962879149858817', '1519962879095332865', 'href', 'href', 'String', NULL, NULL, NULL, NULL, 'true', NULL, NULL, NULL, 4, 'admin', '2022-04-29 16:52:45', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1519964769946296322', '1519945036454813698', 'title', 'title', 'String', NULL, NULL, NULL, NULL, 'true', NULL, NULL, NULL, 1, 'admin', '2022-04-29 15:41:51', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1519964769958879233', '1519945036454813698', 'date', 'date', 'String', NULL, NULL, NULL, NULL, 'true', NULL, NULL, NULL, 2, 'admin', '2022-04-29 15:41:51', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1519964769975656449', '1519945036454813698', 'remark', 'remark', 'String', NULL, NULL, NULL, NULL, 'true', NULL, NULL, NULL, 3, 'admin', '2022-04-29 15:41:51', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1519964769988239361', '1519945036454813698', 'pic', 'pic', 'String', NULL, NULL, NULL, NULL, 'true', NULL, NULL, NULL, 4, 'admin', '2022-04-29 15:41:51', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1519992923574362113', '1519274169102020610', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2022-04-27 19:16:03', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1519992923586945026', '1519274169102020610', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 2, 'admin', '2022-04-27 19:16:03', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522181219565973505', '1522181219549196289', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2022-05-05 19:47:38', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522181219578556417', '1522181219549196289', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 2, 'admin', '2022-05-05 19:47:38', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522182473885167618', '1522182473872584705', 'name', '姓名', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2022-05-05 19:52:37', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522182473897750530', '1522182473872584705', 'type', '类型', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 2, 'admin', '2022-05-05 19:52:37', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522182473914527746', '1522182473872584705', 'mode', '开门方式', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 3, 'admin', '2022-05-05 19:52:37', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522182473927110658', '1522182473872584705', 'date', '日期', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 4, 'admin', '2022-05-05 19:52:37', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522184215058198530', '1522184215045615618', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2022-05-05 19:59:32', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522184215074975746', '1522184215045615618', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 2, 'admin', '2022-05-05 19:59:32', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522185998719528962', '1522185936018878466', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2022-05-05 20:06:23', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522185998732111873', '1522185936018878466', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 2, 'admin', '2022-05-05 20:06:23', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522187150638985217', '1522187101267832833', 'name', 'name', 'String', NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'admin', '2022-05-05 20:11:00', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522187150651568129', '1522187101267832833', 'value', 'value', 'String', NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'admin', '2022-05-05 20:11:00', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522422772574199809', '1522422772532256770', 'name', '客户姓名', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 11:47:29', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522422772590977026', '1522422772532256770', 'sj', '放款时间', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 11:47:29', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522422772607754242', '1522422772532256770', 'type', '担保方式', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 11:47:29', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522422772620337154', '1522422772532256770', 'je', '放款金额', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 11:47:29', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522422772632920065', '1522422772532256770', 'jg', '法人机构', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 11:47:29', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522422772666474497', '1522422772532256770', 'jl', '客户经理', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 11:47:29', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522464505987080193', '1522464505970302978', 'type1', '路线', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 14:33:19', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522464505999663105', '1522464505970302978', 'type2', '车辆', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 14:33:19', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522464506012246018', '1522464505970302978', 'type3', '人数', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 14:33:19', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522513781081513985', '1522503560003067906', 'visit', '访问量', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 17:08:30', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522513781094096898', '1522503560003067906', 'ip', 'ip地址', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 17:08:30', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522513781123457025', '1522503560003067906', 'tian', '年月', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 17:08:30', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522513781136039937', '1522503560003067906', 'type', '天', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 17:08:30', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522522111850061825', '1522455203175997442', 'gh', '工号', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 13:56:21', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522522111866839042', '1522455203175997442', 'gjbm', '构件编号', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 13:56:21', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522522111879421953', '1522455203175997442', 'jh', '序号', 'String', NULL, '', NULL, NULL, 'N', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 13:56:21', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522522111892004865', '1522455203175997442', 'dqgx', '当前工序', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, 3, 'admin', '2022-05-06 13:56:21', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522522111904587777', '1522455203175997442', 'zt', '状态', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 13:56:21', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522522331996495874', '1522522034783920129', 'gh', '工号', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 18:21:55', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522522332013273090', '1522522034783920129', 'gjbm', '编码', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 18:21:55', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522522332025856002', '1522522034783920129', 'jgsj', '完成时间', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 18:21:55', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522522332038438913', '1522522034783920129', 'dqgx', '工序', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 18:21:55', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522522332051021826', '1522522034783920129', 'zt', '状态', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 18:21:55', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522523789429055490', '1522523544120991745', 'ddh', '订单号', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 18:27:55', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522523789445832705', '1522523544120991745', 'zcxm', '在产项目', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 18:27:55', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522523789458415618', '1522523544120991745', 'zl', '重量', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 18:27:55', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522523789470998530', '1522523544120991745', 'jhrq', '交货日期', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 18:27:55', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522523789479387138', '1522523544120991745', 'scjd', '产量进度', 'String', NULL, '', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-06 18:27:55', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522535242705936386', '1522098873378549762', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2022-05-05 14:22:06', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522535242718519298', '1522098873378549762', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 2, 'admin', '2022-05-05 14:22:06', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522535242731102210', '1522098873378549762', 'type', 'type', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 3, 'admin', '2022-05-05 14:22:06', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522831994227056641', '1522824721899511810', 'name', '姓名', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-07 14:50:53', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522831994243833857', '1522824721899511810', 'punch_time', '打卡时间', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-07 14:50:53', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522831994264805377', '1522824721899511810', 'salary_money', '工资', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-07 14:50:53', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522831994281582593', '1522824721899511810', 'bonus_money', '奖金', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-07 14:50:53', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522831994298359810', '1522824721899511810', 'sex', '性别', 'String', NULL, 'sex', NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-07 14:50:53', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522831994319331330', '1522824721899511810', 'age', '年龄', 'String', NULL, '', NULL, NULL, 'Y', NULL, 'Y', NULL, NULL, 'admin', '2022-05-07 14:50:53', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522831994336108545', '1522824721899511810', 'birthday', '生日', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-07 14:50:53', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522831994348691458', '1522824721899511810', 'email', '邮箱', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-07 14:50:53', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522831994365468673', '1522824721899511810', 'content', '个人简介', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-07 14:50:53', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522902540205744130', '1522853857095376898', 'username', 'username', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-07 16:20:27', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522902540218327041', '1522853857095376898', 'realname', 'realname', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-07 16:20:27', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522902540230909954', '1522853857095376898', 'sex', 'sex', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-07 16:20:27', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('1522902540243492866', '1522853857095376898', 'create_time', 'create_time', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2022-05-07 16:20:27', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('811451544708886528', '1517071247723233281', 'name', 'name', 'String', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'admin', '2023-04-27 14:25:35', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('811451544750829568', '1517071247723233281', 'sex', 'sex', 'String', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'admin', '2023-04-27 14:25:35', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('811451544767606784', '1517071247723233281', 'age', 'age', 'String', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'admin', '2023-04-27 14:25:35', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('825962141328650240', '1516743766914924546', 'day', '日期', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, NULL, 'admin', '2023-06-06 15:25:30', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('825962141399953408', '1516743766914924546', 'num', '登录次数', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, 'Y', NULL, NULL, 'admin', '2023-06-06 15:25:30', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('901400288010797056', '874452378731991040', 'date', 'date', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 17, 'ceshi', '2023-10-18 10:50:06', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('901400288082100224', '874452378731991040', 'num', 'num', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 18, 'ceshi', '2023-10-18 10:50:06', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910407818167238656', '910406419257802752', 'title', 'title', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-25 15:56:55', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910407818200793088', '910406419257802752', 'icon', 'icon', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-25 15:56:55', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910407818234347520', '910406419257802752', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 2, 'admin', '2024-01-25 15:56:55', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910407818259513344', '910406419257802752', 'action', 'action', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 4, 'admin', '2024-01-25 16:02:28', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910419343930081280', '910419343896526848', 'title', 'title', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-25 16:48:16', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910419343967830016', '910419343896526848', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-25 16:48:16', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910423953432428544', '910423953398874112', 'title', 'title', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-25 17:06:35', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910423953465982976', '910423953398874112', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-25 17:06:35', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910425302010216448', '910425301976662016', 'title', 'title', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-25 17:11:57', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910425302043770880', '910425301976662016', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-25 17:11:57', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910427052108726272', '910427052079366144', 'title', 'title', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-25 17:18:54', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910427052146475008', '910427052079366144', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-25 17:18:54', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910430104379244544', '910430104345690112', 'title', 'title', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-25 17:31:02', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910430104412798976', '910430104345690112', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-25 17:31:02', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910431120256450560', '910431120222896128', 'title', 'title', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-25 17:35:04', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910431120290004992', '910431120222896128', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-25 17:35:04', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910437313372798976', '910435726206222336', 'title', 'title', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-25 17:53:22', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910437313410547712', '910435726206222336', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-25 17:53:22', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910441161239871488', '910441161197928448', 'title', 'title', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-25 18:14:58', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910441161277620224', '910441161197928448', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-25 18:14:58', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910442989654425600', '910442989620871168', 'title', 'title', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-25 18:22:14', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910442989692174336', '910442989620871168', 'type', 'type', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-25 18:22:14', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910442989713145856', '910442989620871168', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 2, 'admin', '2024-01-25 18:22:14', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910447275268423680', '910447275230674944', 'title', 'title', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-25 18:39:15', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910447275301978112', '910447275230674944', 'type', 'type', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-25 18:39:15', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910447275331338240', '910447275230674944', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 2, 'admin', '2024-01-25 18:39:15', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910455640329601024', '910455640270880768', 'name', '仓库', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-25 19:12:30', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910455640371544064', '910455640270880768', 'series', '系列', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-25 19:12:30', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910455640400904192', '910455640270880768', 'marketName', '市场名', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 2, 'admin', '2024-01-25 19:12:30', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910455640426070016', '910455640270880768', 'model', '机型', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 3, 'admin', '2024-01-25 19:12:30', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910455640455430144', '910455640270880768', 'productStatus', '产品状态', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 4, 'admin', '2024-01-25 19:12:30', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910455640484790272', '910455640270880768', 'inventory', '当前库存', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 5, 'admin', '2024-01-25 19:12:30', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910455640509956096', '910455640270880768', 'inventoryStatus', '库存状态', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 6, 'admin', '2024-01-25 19:12:30', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910479009821278208', '910478592823574528', 'title', 'title', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-25 20:43:42', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910479009859026944', '910478592823574528', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-25 20:43:42', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910479009884192768', '910478592823574528', 'unit', 'unit', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 2, 'admin', '2024-01-25 20:45:22', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910702652337733632', '910695134387552256', 'warehouseName', '仓库名称', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-26 11:04:10', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910702652383870976', '910695134387552256', 'warehouseCount', '仓库存量', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-26 11:04:10', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910702652413231104', '910695134387552256', 'name', '省份', 'String', NULL, NULL, NULL, NULL, 'N', NULL, NULL, NULL, 2, 'admin', '2024-01-26 11:04:10', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910702652446785536', '910695134387552256', 'value', '销售额', 'Integer', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 3, 'admin', '2024-01-26 11:04:10', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910708293328486400', '910708293282349056', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-26 11:56:27', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910708293370429440', '910708293282349056', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-26 11:56:27', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910721009736794112', '910721009699045376', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-26 12:46:59', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910721009778737152', '910721009699045376', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-26 12:46:59', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910732646887768064', '910732622212677632', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-26 13:33:13', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910732646933905408', '910732622212677632', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-26 13:33:13', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910737864350285824', '910737864308342784', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-26 13:53:57', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910737864400617472', '910737864308342784', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-26 13:53:57', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910740127202459648', '910740127152128000', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-26 14:02:57', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910740127244402688', '910740127152128000', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-26 14:02:57', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910750488576180224', '910750488542625792', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-26 14:44:07', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910750488630706176', '910750488542625792', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-26 14:44:07', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910754028698779648', '910754028661030912', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-26 14:58:11', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910754465980137472', '910754465934000128', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-26 14:59:55', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910759700177928192', '910759432656830464', 'name', '小区名称', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-26 15:19:40', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910759700219871232', '910759432656830464', 'deviceName', '设备名称', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-26 15:19:40', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910759700257619968', '910759432656830464', 'deviceAddress', '设备地址', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 2, 'admin', '2024-01-26 15:19:40', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910759700295368704', '910759432656830464', 'deviceStatus', '设备状态', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 3, 'admin', '2024-01-26 15:19:40', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910765523046285312', '910765056765509632', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-26 15:42:00', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910765523092422656', '910765056765509632', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-26 15:42:00', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910773111934730240', '910773111884398592', 'areaName', '区域名称', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-26 16:14:01', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910773111976673280', '910773111884398592', 'value', '小区数量', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-26 16:14:01', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910776816117530624', '910776816075587584', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-26 16:28:44', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910776816167862272', '910776816075587584', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-26 16:28:44', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910790230357360640', '910790230315417600', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-26 17:22:02', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910790230407692288', '910790230315417600', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-26 17:22:02', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910794755550003200', '910794755508060160', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-26 17:40:01', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910794755591946240', '910794755508060160', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-26 17:40:01', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910797586197692416', '910797586147360768', 'inspectTime', '检查时间', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-26 17:51:16', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910797586294161408', '910797586147360768', 'deviceName', '设备名称', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-26 17:51:16', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910797586319327232', '910797586147360768', 'deviceAddress', '设备地址', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 2, 'admin', '2024-01-26 17:51:16', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910797586352881664', '910797586147360768', 'inspected', '检查人', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 3, 'admin', '2024-01-26 17:51:16', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910797586382241792', '910797586147360768', 'content', '检查内容', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 4, 'admin', '2024-01-26 17:51:16', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('910797586415796224', '910797586147360768', 'inspectResult', '巡查结果', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 5, 'admin', '2024-01-26 17:51:16', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911792972810993664', '911792028287287296', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-29 11:42:50', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911792972852936704', '911792028287287296', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-29 11:42:50', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911792972882296832', '911792028287287296', 'icon', 'icon', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 2, 'admin', '2024-01-29 11:42:50', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911792972911656960', '911792028287287296', 'action', 'action', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 3, 'admin', '2024-01-29 11:42:50', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911792972949405696', '911792028287287296', 'color', 'color', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 4, 'admin', '2024-01-29 11:46:35', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911836343176839168', '911836343134896128', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-29 14:38:55', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911836343218782208', '911836343134896128', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-29 14:38:55', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911836426496688128', '911836426450550784', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-29 14:39:15', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911836426538631168', '911836426450550784', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-29 14:39:15', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911836535569563648', '911836535531814912', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-29 14:39:41', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911836535603118080', '911836535531814912', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-29 14:39:41', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911836717761740800', '911836717715603456', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-29 14:40:24', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911836717803683840', '911836717715603456', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-29 14:40:24', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911836839392362496', '911836839023263744', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-29 14:40:53', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911836839736295424', '911836839023263744', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-29 14:40:53', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911836922204700672', '911836922162757632', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-29 14:41:13', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911836922238255104', '911836922162757632', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-29 14:41:13', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911837008376676352', '911837008343121920', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-29 14:41:34', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911837008414425088', '911837008343121920', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-29 14:41:34', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911837169203068928', '911837168896884736', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-29 14:42:12', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911837169526030336', '911837168896884736', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-29 14:42:12', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911845934769946624', '911845934736392192', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-29 15:17:02', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911845934807695360', '911845934736392192', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-29 15:17:02', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911852950460612608', '911837091507781632', 'name', '店铺', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-29 14:41:53', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911852950506749952', '911837091507781632', 'value', '销售金额（元）', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-29 14:41:53', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911887596531531776', '911887596497977344', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-29 18:02:35', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911887596565086208', '911887596497977344', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-29 18:02:35', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911887691293442048', '911887691259887616', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-29 18:02:57', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911887691331190784', '911887691259887616', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-29 18:02:57', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911888632742723584', '911888632709169152', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-29 18:06:42', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911888632767889408', '911888632709169152', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-29 18:06:42', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911888715282432000', '911888715248877568', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-29 18:07:02', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911888715320180736', '911888715248877568', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-29 18:07:02', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911888715345346560', '911888715248877568', 'type', 'type', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 2, 'admin', '2024-01-29 18:07:02', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911888877618774016', '911888877589413888', 'city', '城市', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-29 18:07:40', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911888877643939840', '911888877589413888', 'rate', '月环比', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-29 18:07:40', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911889006950137856', '911889006916583424', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-29 18:08:11', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911889006987886592', '911889006916583424', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-29 18:08:11', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911889086197317632', '911889086163763200', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-01-29 18:08:30', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('911889086230872064', '911889086163763200', 'value', 'value', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-01-29 18:08:30', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('960809675552555008', '925264960069664768', 'count', '数量', 'Integer', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 11, 'admin', '2024-03-06 16:01:21', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('960809675590303744', '925264960069664768', 'sex', '性别', 'String', NULL, 'sex', NULL, NULL, 'Y', NULL, NULL, NULL, 7, 'admin', '2024-03-06 15:59:27', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('965151322230849536', '965151322172129280', 'id', 'id', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 0, 'admin', '2024-06-24 17:33:37', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('965151322331512832', '965151322172129280', 'create_by', 'create_by', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 1, 'admin', '2024-06-24 17:33:37', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('965151322369261568', '965151322172129280', 'create_time', 'create_time', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 2, 'admin', '2024-06-24 17:33:37', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('965151322407010304', '965151322172129280', 'update_by', 'update_by', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 3, 'admin', '2024-06-24 17:33:37', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('965151322453147648', '965151322172129280', 'update_time', 'update_time', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 4, 'admin', '2024-06-24 17:33:37', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('965151322495090688', '965151322172129280', 'sys_org_code', 'sys_org_code', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 5, 'admin', '2024-06-24 17:33:37', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('965151322541228032', '965151322172129280', 'name', 'name', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 6, 'admin', '2024-06-24 17:33:37', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('965151322587365376', '965151322172129280', 'sex', 'sex', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 7, 'admin', '2024-06-24 17:33:37', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('965151322616725504', '965151322172129280', 'age', 'age', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 8, 'admin', '2024-06-24 17:33:37', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('965151322650279936', '965151322172129280', 'descc', 'descc', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 9, 'admin', '2024-06-24 17:33:37', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('965151322688028672', '965151322172129280', 'days', 'days', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 10, 'admin', '2024-06-24 17:33:37', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('965151322729971712', '965151322172129280', 'be_date', 'be_date', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 11, 'admin', '2024-06-24 17:33:37', NULL, NULL);\nINSERT INTO `onl_drag_dataset_item` VALUES ('965151322763526144', '965151322172129280', 'end_date', 'end_date', 'String', NULL, NULL, NULL, NULL, 'Y', NULL, NULL, NULL, 12, 'admin', '2024-06-24 17:33:37', NULL, NULL);\n\n-- ----------------------------\n-- Table structure for onl_drag_dataset_param\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_drag_dataset_param`;\nCREATE TABLE `onl_drag_dataset_param`  (\n  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `head_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '动态报表ID',\n  `param_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '参数字段',\n  `param_txt` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数文本',\n  `param_value` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数默认值',\n  `order_num` int(11) NULL DEFAULT NULL COMMENT '排序',\n  `iz_search` int(11) NULL DEFAULT NULL COMMENT '查询标识0否1是 默认0',\n  `widget_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '查询控件类型',\n  `search_mode` int(11) NULL DEFAULT NULL COMMENT '查询模式1简单2范围',\n  `dict_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_oddp_head_id`(`head_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_drag_dataset_param\n-- ----------------------------\nINSERT INTO `onl_drag_dataset_param` VALUES ('1517072834441019393', '1516317603268657153', 'name', 'name', '', NULL, NULL, NULL, NULL, NULL, 'admin', '2022-04-21 17:28:44', NULL, NULL);\nINSERT INTO `onl_drag_dataset_param` VALUES ('1522831994378051586', '1522824721899511810', 'sex', 'sex', '1', NULL, NULL, NULL, NULL, 'sex', 'admin', '2022-05-07 14:50:53', NULL, NULL);\nINSERT INTO `onl_drag_dataset_param` VALUES ('1522902540256075778', '1522853857095376898', 'createTime_begin', 'createTime_begin', '2011-01-01', NULL, NULL, NULL, NULL, NULL, 'admin', '2022-05-07 16:20:28', NULL, NULL);\nINSERT INTO `onl_drag_dataset_param` VALUES ('1522902540272852993', '1522853857095376898', 'createTime_end', 'createTime_end', '2022-12-31', NULL, NULL, NULL, NULL, NULL, 'admin', '2022-05-07 16:20:28', NULL, NULL);\nINSERT INTO `onl_drag_dataset_param` VALUES ('811451544792772608', '1517071247723233281', 'age', 'age', '0', NULL, NULL, NULL, NULL, NULL, 'admin', '2023-04-27 14:25:35', NULL, NULL);\n\n-- ----------------------------\n-- Table structure for onl_drag_page\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_drag_page`;\nCREATE TABLE `onl_drag_page`  (\n  `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',\n  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '界面名称',\n  `path` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '访问路径',\n  `background_color` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '背景色',\n  `background_image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '背景图',\n  `design_type` int(1) NULL DEFAULT NULL COMMENT '设计模式(1:pc,2:手机,3:平板)',\n  `theme` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '主题色',\n  `style` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '面板主题',\n  `cover_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '封面图',\n  `des_json` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '仪表盘主配置JSON',\n  `template` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '布局json',\n  `protection_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '保护码',\n  `type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属分类',\n  `iz_template` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '是否模板(1:是；0不是)',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `low_app_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '应用ID',\n  `tenant_id` int(10) NULL DEFAULT NULL COMMENT '租户ID',\n  `update_count` int(10) NULL DEFAULT 1,\n  `visits_num` int(11) NULL DEFAULT NULL COMMENT '访问次数',\n  `del_flag` int(11) NULL DEFAULT NULL COMMENT '删除状态( 0未删除 1已删除)',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '可视化拖拽界面' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_drag_page\n-- ----------------------------\nINSERT INTO `onl_drag_page` VALUES ('1011800681234354176', '医院实时数据监控', '/drag/page/view/1011800681234354176', '#1E0047', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/医院大屏_1733208287062.png', 100, 'dark', 'bigScreen', NULL, '{\\\"width\\\":1920,\\\"height\\\":1080}', '[{\\\"component\\\":\\\"JText\\\",\\\"w\\\":119,\\\"x\\\":53,\\\"h\\\":92.00000000000006,\\\"i\\\":\\\"ab90426f-3d27-4321-98ab-6fa901c590a7\\\",\\\"y\\\":165,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689401061376\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"db8981ac-9e5b-464c-a184-793178df46f6\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":161,\\\"x\\\":254,\\\"h\\\":121.99999999999991,\\\"i\\\":\\\"d0c51e1d-ebd7-482f-8df4-ecc556b21050\\\",\\\"y\\\":151,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689434615808\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"a9c1e4e0-3647-4f4c-89b0-920a728eceff\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":171.99999999999983,\\\"x\\\":871,\\\"h\\\":89.00000000000011,\\\"i\\\":\\\"2bc4359f-2033-43a9-ad56-eaac0952f845\\\",\\\"y\\\":173,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689451393024\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"0c1082d3-8762-41f5-a44b-90f2cb3438d2\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":186,\\\"x\\\":528,\\\"h\\\":96.00000000000011,\\\"i\\\":\\\"6f873e82-c961-46e0-8dc2-38f0f4e04eb1\\\",\\\"y\\\":169,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689459781632\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"4e908f5d-a9e0-4916-8a0c-145295ea4ccb\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":210.99999999999994,\\\"x\\\":1188,\\\"h\\\":96.99999999999999,\\\"i\\\":\\\"1493c911-276d-4eaa-8dbe-f03c15b0de37\\\",\\\"y\\\":177,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689468170240\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"085a93eb-7833-4180-8734-0c4363b3083d\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":94.99999999999989,\\\"x\\\":488,\\\"h\\\":44.999999999999886,\\\"i\\\":\\\"6f889970-99fb-498a-8fe0-297ac57eda2e\\\",\\\"y\\\":295,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689476558848\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"9ef95676-a1bb-45bc-8f0d-6441b261b98e\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":84,\\\"x\\\":826,\\\"h\\\":31,\\\"i\\\":\\\"23ea496a-d7a5-4831-a685-d4c7c2adae08\\\",\\\"y\\\":300,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689484947456\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"fb1302ca-ce44-4e3c-817a-588064bf10a6\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":77,\\\"x\\\":591,\\\"h\\\":40.99999999999987,\\\"i\\\":\\\"9a8177f4-f3d6-4727-80f2-893f9cbba466\\\",\\\"y\\\":299,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1023815689501724672\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"1fc1308d-f00c-49dd-83fd-202e1ab622ad\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":96,\\\"x\\\":671,\\\"h\\\":41.99999999999983,\\\"i\\\":\\\"54e8548b-7e1c-4e6d-961d-8dfe2d482e8d\\\",\\\"y\\\":300,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1023815689514307584\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"f8f8b3c1-ced3-4da2-b9b6-1da3ea95599a\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":100,\\\"x\\\":907,\\\"h\\\":37.99999999999994,\\\"i\\\":\\\"40da445c-ceda-481f-81a0-cf5708b4c017\\\",\\\"y\\\":300,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689522696192\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"ee593903-f28a-4679-aa7a-84da7bce394d\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":100,\\\"x\\\":1008,\\\"h\\\":33,\\\"i\\\":\\\"c7992cee-df3b-4fc7-b6cc-8b52e7b2ec9c\\\",\\\"y\\\":300,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689531084800\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"fdd0f02a-555c-4633-8c80-0e71290e0ae7\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":82,\\\"x\\\":1160,\\\"h\\\":39.00000000000006,\\\"i\\\":\\\"937d7716-e61f-4631-8bcb-973f651b63f5\\\",\\\"y\\\":300,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689543667712\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"e6c0c471-ef79-4d59-8819-422e420ae8f5\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":59.000000000000114,\\\"x\\\":1268,\\\"h\\\":45.99999999999993,\\\"i\\\":\\\"eedf5469-0915-4d50-8e71-a172d6db3745\\\",\\\"y\\\":299,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1023815689552056320\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"5b197f2a-63f9-4a7c-8483-0e23eb55a688\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":79.99999999999989,\\\"x\\\":1354,\\\"h\\\":44.000000000000014,\\\"i\\\":\\\"539ed1da-ad37-45ae-8226-97beedb3b375\\\",\\\"y\\\":300,\\\"orderNum\\\":600,\\\"pageCompId\\\":\\\"1023815689560444928\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"a895372a-5dc4-41bb-aeec-e08a1e257005\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":85,\\\"x\\\":1543,\\\"h\\\":53,\\\"i\\\":\\\"f04165b9-f514-4179-8e6b-7e67a5d6daa5\\\",\\\"y\\\":207,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689577222144\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"743e46b9-df9b-41cc-b63b-71f3e0cd10f9\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":78,\\\"x\\\":1808,\\\"h\\\":49.99999999999982,\\\"i\\\":\\\"df422e72-7ce7-4ef5-bdd3-97a259cb89a4\\\",\\\"y\\\":206,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1023815689589805056\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"5d6087bd-cbe5-4d3d-8ee8-76367aba23bd\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"w\\\":314,\\\"x\\\":65,\\\"h\\\":243.99999999999994,\\\"i\\\":\\\"6e13ccec-1d9c-49a8-8413-f57685b077f2\\\",\\\"y\\\":267,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689598193664\\\",\\\"componentName\\\":\\\"饼图\\\",\\\"key\\\":\\\"4a5a4539-278f-48c3-819f-06a82ba8d3af\\\"},{\\\"component\\\":\\\"JMultipleLine\\\",\\\"w\\\":517,\\\"x\\\":486,\\\"h\\\":332,\\\"i\\\":\\\"b4749e4f-2319-4ceb-9a03-826cac8c805f\\\",\\\"y\\\":364,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689606582272\\\",\\\"componentName\\\":\\\"对比折线图\\\",\\\"key\\\":\\\"c880dda6-05a4-41bc-8b60-e97ebf96db8b\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":754,\\\"x\\\":406,\\\"h\\\":392,\\\"i\\\":\\\"c2682077-7f2a-40e2-92ac-9ee50e8183f6\\\",\\\"y\\\":757,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689619165184\\\",\\\"componentName\\\":\\\"基础柱形图\\\",\\\"key\\\":\\\"3b98fac0-1163-4894-8c0f-a5960bc5bc03\\\"},{\\\"component\\\":\\\"JRose\\\",\\\"w\\\":400,\\\"x\\\":1034,\\\"h\\\":222.99999999999994,\\\"i\\\":\\\"847f44b6-33d1-495d-8240-e28f132ae6e0\\\",\\\"y\\\":840,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689627553792\\\",\\\"componentName\\\":\\\"南丁格尔玫瑰图\\\",\\\"key\\\":\\\"87e6c042-8fb2-4dca-b904-93fc32b8a9bb\\\"},{\\\"component\\\":\\\"JMultipleLine\\\",\\\"w\\\":566,\\\"x\\\":478,\\\"h\\\":313.00000000000006,\\\"i\\\":\\\"6a6ba5f6-32ef-486c-8280-720a57e5b482\\\",\\\"y\\\":550,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689644331008\\\",\\\"componentName\\\":\\\"对比折线图\\\",\\\"key\\\":\\\"a20281a8-8ab0-4325-9030-30577e05483a\\\"},{\\\"component\\\":\\\"JDynamicBar\\\",\\\"w\\\":221,\\\"x\\\":982,\\\"h\\\":510,\\\"i\\\":\\\"44c310d1-5bfc-4bc6-9713-b3c95e7b07cf\\\",\\\"y\\\":317,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689656913920\\\",\\\"componentName\\\":\\\"动态柱形图\\\",\\\"key\\\":\\\"ce2f34bf-d6bf-443d-8c0d-fc215f5977df\\\"},{\\\"component\\\":\\\"JDynamicBar\\\",\\\"w\\\":228.00000000000003,\\\"x\\\":1230,\\\"h\\\":424,\\\"i\\\":\\\"3ed7b3d0-b620-4612-a3ef-397063203669\\\",\\\"y\\\":341,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689665302528\\\",\\\"componentName\\\":\\\"动态柱形图\\\",\\\"key\\\":\\\"78979e31-7e17-4967-88b5-66391930b627\\\"},{\\\"component\\\":\\\"JRose\\\",\\\"w\\\":221,\\\"x\\\":1485,\\\"h\\\":180,\\\"i\\\":\\\"ebaa226d-75b4-4416-8fd6-2288e24a1735\\\",\\\"y\\\":251,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689677885440\\\",\\\"componentName\\\":\\\"南丁格尔玫瑰图\\\",\\\"key\\\":\\\"a6adb5a2-a7c9-41c1-8bc0-26d4db8eb0cb\\\"},{\\\"component\\\":\\\"JRose\\\",\\\"w\\\":215,\\\"x\\\":1662,\\\"h\\\":264.0000000000001,\\\"i\\\":\\\"e87986e7-b5ae-4fbd-ac9d-d791e75441eb\\\",\\\"y\\\":200,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689686274048\\\",\\\"componentName\\\":\\\"南丁格尔玫瑰图\\\",\\\"key\\\":\\\"eef35e45-d1d0-4d64-9fa7-f79cf9495ecd\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":471.00000000000006,\\\"x\\\":1409,\\\"h\\\":387.00000000000006,\\\"i\\\":\\\"714c0b6f-b0fc-45e0-b0f8-9585076a8895\\\",\\\"y\\\":365,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689694662656\\\",\\\"componentName\\\":\\\"基础柱形图\\\",\\\"key\\\":\\\"30b44812-618e-4ecc-bccc-9fd5b9218285\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"w\\\":328,\\\"x\\\":1497,\\\"h\\\":300,\\\"i\\\":\\\"daa3d01f-ef70-43f4-a6cd-f4ff92537ce3\\\",\\\"y\\\":601,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689707245568\\\",\\\"componentName\\\":\\\"饼图\\\",\\\"key\\\":\\\"7bb6691d-2fc3-403e-9c5d-d1b3733ba7e9\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":269.9999999999999,\\\"x\\\":1450,\\\"h\\\":297,\\\"i\\\":\\\"2880db1f-a5a1-492e-8d78-975c958cea96\\\",\\\"y\\\":825,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689719828480\\\",\\\"componentName\\\":\\\"基础柱形图\\\",\\\"key\\\":\\\"5df76f0a-159f-41b4-80fb-375e2898cdc6\\\"},{\\\"component\\\":\\\"JScatter\\\",\\\"w\\\":212,\\\"x\\\":1688,\\\"h\\\":269,\\\"i\\\":\\\"534ae97f-fc40-497d-8ecb-854af3664b1c\\\",\\\"y\\\":846,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023815689732411392\\\",\\\"componentName\\\":\\\"普通散点图\\\",\\\"key\\\":\\\"f3680c48-713e-499f-8904-cdf459f5b561\\\"},{\\\"component\\\":\\\"JScrollBoard\\\",\\\"visible\\\":true,\\\"w\\\":417,\\\"x\\\":23,\\\"h\\\":214,\\\"i\\\":\\\"20384464-b32d-4dad-8660-76370062042a\\\",\\\"y\\\":568,\\\"orderNum\\\":0,\\\"componentName\\\":\\\"轮播表\\\",\\\"pageCompId\\\":\\\"1023815689744994304\\\"},{\\\"component\\\":\\\"JScrollBoard\\\",\\\"visible\\\":true,\\\"w\\\":417,\\\"x\\\":23,\\\"h\\\":214,\\\"i\\\":\\\"es-drager-1732187641762-1\\\",\\\"y\\\":840,\\\"orderNum\\\":0,\\\"componentName\\\":\\\"轮播表\\\",\\\"pageCompId\\\":\\\"1023815689757577216\\\"}]', '', '0', '1', 'admin', '2024-10-31 11:01:31', 'admin', '2024-12-03 14:44:52', NULL, 3, 2, 0, 0);\nINSERT INTO `onl_drag_page` VALUES ('1011871598899679232', '北京税务在线监控', '/drag/page/view/1011871598899679232', '#1E0047', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/bg2_1733208420102.png', 100, 'dark', 'bigScreen', NULL, '{\\\"width\\\":1920,\\\"height\\\":1080}', '[{\\\"component\\\":\\\"JDragBorder\\\",\\\"w\\\":1918,\\\"x\\\":-1,\\\"h\\\":1077,\\\"i\\\":\\\"0cc22009-cfe5-492f-9e3b-8708cbdbda81\\\",\\\"y\\\":-1,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816327790907392\\\",\\\"componentName\\\":\\\"边框1\\\",\\\"key\\\":\\\"f00c04db-0349-4afe-b0fc-da6789411877\\\"},{\\\"component\\\":\\\"JDragBorder\\\",\\\"w\\\":524,\\\"x\\\":389,\\\"h\\\":289,\\\"i\\\":\\\"0a3aa2ce-dae7-4507-916c-f04ac3040fee\\\",\\\"y\\\":159,\\\"orderNum\\\":1072,\\\"pageCompId\\\":\\\"1023816327832850432\\\",\\\"componentName\\\":\\\"边框1\\\",\\\"key\\\":\\\"54891ccd-ee91-4bc0-8f55-ad19e94021bf\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":1911,\\\"x\\\":0,\\\"h\\\":78,\\\"i\\\":\\\"90667f29-8fe9-42e1-bab7-3ba1737f3743\\\",\\\"y\\\":-1,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816327853821952\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"01769c78-a893-430a-9ca3-6d44da9e18ef\\\"},{\\\"component\\\":\\\"JDragBorder\\\",\\\"w\\\":460,\\\"x\\\":1411,\\\"h\\\":320,\\\"i\\\":\\\"es-drager-1731470190655-12\\\",\\\"y\\\":732,\\\"orderNum\\\":1072,\\\"pageCompId\\\":\\\"1023816327891570688\\\",\\\"componentName\\\":\\\"边框1\\\",\\\"key\\\":\\\"40744a4e-1dcf-4d3a-aa5e-d7b428f82c8d\\\"},{\\\"component\\\":\\\"JDragBorder\\\",\\\"w\\\":447,\\\"x\\\":932,\\\"h\\\":321,\\\"i\\\":\\\"es-drager-1731047088918-3\\\",\\\"y\\\":729,\\\"orderNum\\\":1072,\\\"pageCompId\\\":\\\"1023816327916736512\\\",\\\"componentName\\\":\\\"边框1\\\",\\\"key\\\":\\\"53f91224-70cc-47d7-a12d-0740556219f6\\\"},{\\\"component\\\":\\\"JDragBorder\\\",\\\"w\\\":453,\\\"x\\\":932,\\\"h\\\":245,\\\"i\\\":\\\"es-drager-1731046742304-1\\\",\\\"y\\\":461,\\\"orderNum\\\":1072,\\\"pageCompId\\\":\\\"1023816327937708032\\\",\\\"componentName\\\":\\\"边框1\\\",\\\"key\\\":\\\"372ce922-3bcd-40e6-8dad-bd7a6ed66d78\\\"},{\\\"component\\\":\\\"JDragBorder\\\",\\\"w\\\":454,\\\"x\\\":1415,\\\"h\\\":286,\\\"i\\\":\\\"64fabe6b-c6c0-47c5-babe-f365769a5a57\\\",\\\"y\\\":154,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816327971262464\\\",\\\"componentName\\\":\\\"边框1\\\",\\\"key\\\":\\\"736f181f-e855-43a1-a3d4-670aa28c4f7e\\\"},{\\\"component\\\":\\\"JDragBorder\\\",\\\"w\\\":521,\\\"x\\\":386,\\\"h\\\":325,\\\"i\\\":\\\"es-drager-1731047055106-2\\\",\\\"y\\\":729,\\\"orderNum\\\":1072,\\\"pageCompId\\\":\\\"1023816327992233984\\\",\\\"componentName\\\":\\\"边框1\\\",\\\"key\\\":\\\"91f39508-ba29-4564-965e-dec1d7c0d429\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":444,\\\"x\\\":-22,\\\"h\\\":414,\\\"i\\\":\\\"492e7aed-5126-46b6-828d-c33ac0b52eea\\\",\\\"y\\\":381,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328042565632\\\",\\\"componentName\\\":\\\"基础柱形图\\\",\\\"key\\\":\\\"f6099efc-cb26-4831-8eee-baa389523052\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":666,\\\"x\\\":615,\\\"h\\\":85.00000000000006,\\\"i\\\":\\\"85a6c956-9417-4e56-87ab-b6828d82aa42\\\",\\\"y\\\":6,\\\"orderNum\\\":128,\\\"pageCompId\\\":\\\"1023816328071925760\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"47e20d30-a16a-4d58-8d2e-b8fa2aee858a\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":137,\\\"x\\\":4,\\\"h\\\":75.99999999999997,\\\"i\\\":\\\"ca03940c-8e02-46c1-af5b-5d256059e4e2\\\",\\\"y\\\":59,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328109674496\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"9076cce5-c821-49e9-977b-4836f77c10f7\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":129.0000000000001,\\\"x\\\":201,\\\"h\\\":61.99999999999994,\\\"i\\\":\\\"b3f25af5-b0bc-4bbf-a11c-5a7b01174b14\\\",\\\"y\\\":77,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328130646016\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"bc89e2fa-b84a-4a2f-bceb-6dd5cf389e54\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":145,\\\"x\\\":194,\\\"h\\\":95.00000000000006,\\\"i\\\":\\\"4bfdb5e1-0fcc-445d-8b96-bad7d6a5d106\\\",\\\"y\\\":62,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328151617536\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"32e785e0-9553-4245-8e39-e7226439b457\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":125,\\\"x\\\":461,\\\"h\\\":54.000000000000064,\\\"i\\\":\\\"6e4f9a66-2884-45e0-932d-ca1638e76d02\\\",\\\"y\\\":83.00000000000001,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328185171968\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"f348f7f4-3233-4d6d-ac4e-14efc9009428\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":152.9999999999999,\\\"x\\\":680,\\\"h\\\":58,\\\"i\\\":\\\"74041015-3d1e-48c2-8651-5103b5f9d51c\\\",\\\"y\\\":92,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328214532096\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"93c2a4e6-98d8-4ddc-83f0-29feaec54e43\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":156,\\\"x\\\":939,\\\"h\\\":57.00000000000015,\\\"i\\\":\\\"215a7f44-2f53-4984-9eb8-2e03c157bb6f\\\",\\\"y\\\":98.99999999999999,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328252280832\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"e171bc62-1bd8-4e96-803d-e801f959d63e\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":149,\\\"x\\\":1205,\\\"h\\\":52.99999999999994,\\\"i\\\":\\\"630e71d8-c9bf-40ff-9dd4-04420343f500\\\",\\\"y\\\":101,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328277446656\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"d1a38d8e-6329-46b5-8d55-831008e6dbfb\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":159.9999999999999,\\\"x\\\":1426,\\\"h\\\":50.00000000000003,\\\"i\\\":\\\"25c7a576-aad7-42c9-8dec-3a7dc6d79f8b\\\",\\\"y\\\":104.99999999999999,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328311001088\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"01e6cbdb-6f02-45f4-8806-c265ed7bb999\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":150.0000000000001,\\\"x\\\":1665,\\\"h\\\":53.99999999999997,\\\"i\\\":\\\"d28acb12-4bf1-434a-b583-9eacadd9836e\\\",\\\"y\\\":102.00000000000001,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328336166912\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"03673620-0948-4454-bcaa-562d5cb94a7b\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":117,\\\"x\\\":463,\\\"h\\\":68.99999999999989,\\\"i\\\":\\\"c126d088-629f-4657-8473-781dde4302a3\\\",\\\"y\\\":76,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328352944128\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"cbb9a863-b00e-4a3e-8bb8-65db6149e067\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":173,\\\"x\\\":666,\\\"h\\\":60.00000000000003,\\\"i\\\":\\\"09c94616-d224-4fa8-8654-c017a7a7a8e4\\\",\\\"y\\\":91,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328394887168\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"3813482a-894a-48b9-b78b-77b3d38e24bc\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":173.00000000000006,\\\"x\\\":929,\\\"h\\\":53.99999999999983,\\\"i\\\":\\\"00e87ff1-5149-4ec3-853b-107dfc90c947\\\",\\\"y\\\":102,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328411664384\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"8697d9bb-c7f9-4b72-bee0-6fa68df15693\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":147,\\\"x\\\":1206,\\\"h\\\":56.00000000000001,\\\"i\\\":\\\"68992daa-bcb5-4bf9-879b-aeec9b24e105\\\",\\\"y\\\":99,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328432635904\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"ea0cd3c1-065b-443b-80f0-62dd61b5e3c5\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":146,\\\"x\\\":1435,\\\"h\\\":54.00000000000007,\\\"i\\\":\\\"7da253f2-da2c-4483-8f7a-9b604269fee8\\\",\\\"y\\\":101.00000000000003,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328457801728\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"82463e99-1c67-4268-83de-e663a1bfa68f\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":164,\\\"x\\\":1657,\\\"h\\\":59.999999999999794,\\\"i\\\":\\\"ffefd138-865e-4857-8268-8980c0eb3433\\\",\\\"y\\\":98.99999999999999,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328482967552\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"e7fca865-757a-4a39-aa07-cf434a3daebc\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":171,\\\"x\\\":21,\\\"h\\\":53.99999999999997,\\\"i\\\":\\\"7a274443-2335-41d1-8edb-93595b5fb3eb\\\",\\\"y\\\":156,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328512327680\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"c7ac5314-df57-4055-a47e-ba307d4182c2\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"w\\\":426,\\\"x\\\":-59,\\\"h\\\":267,\\\"i\\\":\\\"5f2a005a-facb-492d-9221-e8d5b641dc50\\\",\\\"y\\\":190,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328533299200\\\",\\\"componentName\\\":\\\"饼图\\\",\\\"key\\\":\\\"480bff7a-7170-4cda-8c49-ee2ec18e9edb\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":195.00000000000014,\\\"x\\\":32.999999999999886,\\\"h\\\":50.99999999999994,\\\"i\\\":\\\"4399b94e-3eca-4f0d-872a-6d8a33cf3f45\\\",\\\"y\\\":725,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328550076416\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"dc81d128-94f1-4bff-8e96-bc8d4ee6b0fc\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":407,\\\"x\\\":3,\\\"h\\\":360,\\\"i\\\":\\\"e05f2635-03f9-4718-a268-ee5513bf4f78\\\",\\\"y\\\":764,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328587825152\\\",\\\"componentName\\\":\\\"基础柱形图\\\",\\\"key\\\":\\\"02002e38-c239-498c-9376-3cb65af8e201\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":151.00000000000003,\\\"x\\\":410,\\\"h\\\":49.000000000000014,\\\"i\\\":\\\"d3edb23c-86fb-4021-9aff-e50ab1fe113e\\\",\\\"y\\\":161.99999999999997,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328608796672\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"a9d8c13a-b827-40b0-953f-2fb977c1dfa8\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":517,\\\"x\\\":390,\\\"h\\\":267,\\\"i\\\":\\\"7b7a1ca9-b9de-4a27-9d76-4e85f324edb3\\\",\\\"y\\\":158,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328629768192\\\",\\\"componentName\\\":\\\"基础柱形图\\\",\\\"key\\\":\\\"e8c6130a-e499-4287-943f-f29ec145dcc8\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":434.00000000000006,\\\"x\\\":388,\\\"h\\\":246.99999999999994,\\\"i\\\":\\\"dc011315-c8cb-460e-8958-f89ec118789d\\\",\\\"y\\\":465,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328667516928\\\",\\\"componentName\\\":\\\"基础柱形图\\\",\\\"key\\\":\\\"fd8d79e7-f546-4633-86e8-805de5866eb5\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":203.99999999999983,\\\"x\\\":397.0000000000001,\\\"h\\\":59.99999999999996,\\\"i\\\":\\\"4f9d7602-3fb7-4f57-81f0-1c9c06f71109\\\",\\\"y\\\":450,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328684294144\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"20d2dbe0-a66b-456d-880a-f0558b563704\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":145.9999999999999,\\\"x\\\":385,\\\"h\\\":72.99999999999997,\\\"i\\\":\\\"b084b430-2d26-4952-90c5-dd3778d98df6\\\",\\\"y\\\":711,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328701071360\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"5a67aed1-f3b2-45d7-8c3c-dbe521a3fd1e\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":44,\\\"x\\\":429,\\\"h\\\":42,\\\"i\\\":\\\"6b66ae21-a187-42e8-8de8-c43933e3baa5\\\",\\\"y\\\":797,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328738820096\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"db0c5c3a-a04b-4e71-8c52-1fbe2d548007\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":45.999999999999986,\\\"x\\\":426,\\\"h\\\":44.00000000000005,\\\"i\\\":\\\"d2c60790-219a-4c37-b82b-d625aba9ad95\\\",\\\"y\\\":875,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328755597312\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"64c8cf8b-ffba-429f-a78e-84bbd83a6494\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":37,\\\"x\\\":432,\\\"h\\\":35,\\\"i\\\":\\\"4ac90ff9-722a-4836-8056-681329419d0a\\\",\\\"y\\\":949,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328768180224\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"3d5b4124-523a-4843-8bf5-a7fca530a156\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":133,\\\"x\\\":479,\\\"h\\\":50,\\\"i\\\":\\\"7e2ab80b-2abe-4a5b-ab57-3821d8e954ea\\\",\\\"y\\\":786,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328801734656\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"cd7c368d-9c78-4299-abf3-3d45aa962d10\\\"},{\\\"component\\\":\\\"JLine\\\",\\\"w\\\":425,\\\"x\\\":933,\\\"h\\\":204,\\\"i\\\":\\\"5add5568-a651-4150-802d-8e13fab4be54\\\",\\\"y\\\":210,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328818511872\\\",\\\"componentName\\\":\\\"基础折线图\\\",\\\"key\\\":\\\"3737d2ec-7355-4678-8b15-23de79634383\\\"},{\\\"component\\\":\\\"JLiquid\\\",\\\"w\\\":209,\\\"x\\\":1432,\\\"h\\\":126,\\\"i\\\":\\\"1d2da469-9128-4339-8ffb-2f665b9c760c\\\",\\\"y\\\":203,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328835289088\\\",\\\"componentName\\\":\\\"水波图\\\",\\\"key\\\":\\\"739835a3-0af5-48be-823a-f2aad83e3ec3\\\"},{\\\"component\\\":\\\"JRose\\\",\\\"w\\\":397,\\\"x\\\":948,\\\"h\\\":206,\\\"i\\\":\\\"f81fe9db-cf49-4461-8e8c-dcc43b3a9128\\\",\\\"y\\\":490,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328864649216\\\",\\\"componentName\\\":\\\"南丁格尔玫瑰图\\\",\\\"key\\\":\\\"2d22b9d9-04e0-4d1c-8760-01a89ab517db\\\"},{\\\"component\\\":\\\"JLine\\\",\\\"w\\\":425,\\\"x\\\":943,\\\"h\\\":241,\\\"i\\\":\\\"c161f938-81ce-4033-8492-9203ddbfba85\\\",\\\"y\\\":797,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328885620736\\\",\\\"componentName\\\":\\\"基础折线图\\\",\\\"key\\\":\\\"93ace0f6-c47f-4143-8a3d-3ecbd53e1947\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":252,\\\"x\\\":919,\\\"h\\\":42,\\\"i\\\":\\\"b5644afc-7551-4690-98d7-a3b67ae76ab8\\\",\\\"y\\\":729,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328906592256\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"ebf198ba-0973-4223-8b2f-a8f14deab29e\\\"},{\\\"component\\\":\\\"JDragBorder\\\",\\\"w\\\":365,\\\"x\\\":14,\\\"h\\\":334,\\\"i\\\":\\\"b2390199-e9b6-4036-8032-c3657c90312f\\\",\\\"y\\\":728,\\\"orderNum\\\":1072,\\\"pageCompId\\\":\\\"1023816328935952384\\\",\\\"componentName\\\":\\\"边框1\\\",\\\"key\\\":\\\"b9612da1-0a05-48e5-bfa7-8287ee17bbf2\\\"},{\\\"component\\\":\\\"JDragBorder\\\",\\\"w\\\":370,\\\"x\\\":6,\\\"h\\\":551,\\\"i\\\":\\\"a6f4742b-49f3-4760-9243-ee7691f68c00\\\",\\\"y\\\":154,\\\"orderNum\\\":1072,\\\"pageCompId\\\":\\\"1023816328956923904\\\",\\\"componentName\\\":\\\"边框1\\\",\\\"key\\\":\\\"ade24c76-ac58-4b06-826a-7bc81324a1f8\\\"},{\\\"component\\\":\\\"JDragBorder\\\",\\\"w\\\":526,\\\"x\\\":388,\\\"h\\\":248,\\\"i\\\":\\\"7be4dcb2-744b-4f1a-9b83-6f586a730002\\\",\\\"y\\\":460,\\\"orderNum\\\":1072,\\\"pageCompId\\\":\\\"1023816328969506816\\\",\\\"componentName\\\":\\\"边框1\\\",\\\"key\\\":\\\"e6698dec-2d96-433c-809a-65a030e566b1\\\"},{\\\"component\\\":\\\"JDragBorder\\\",\\\"w\\\":449,\\\"x\\\":930,\\\"h\\\":277,\\\"i\\\":\\\"e692a49f-8747-4df5-9e31-b35cb080d875\\\",\\\"y\\\":160,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816328986284032\\\",\\\"componentName\\\":\\\"边框1\\\",\\\"key\\\":\\\"c87222c9-2274-4bc0-89b0-e21ecfcef07b\\\"},{\\\"component\\\":\\\"JLiquid\\\",\\\"w\\\":181.00000000000006,\\\"x\\\":1642,\\\"h\\\":136.99999999999997,\\\"i\\\":\\\"f7de9b5c-c4e8-41f1-9197-f7efc7a7126d\\\",\\\"y\\\":194,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816329019838464\\\",\\\"componentName\\\":\\\"水波图\\\",\\\"key\\\":\\\"65c8e18b-b906-45e7-b167-ba6ff88cf8c9\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":194,\\\"x\\\":933,\\\"h\\\":31.0000000000001,\\\"i\\\":\\\"b3659810-6e9c-47ac-ba63-8e78044a2c63\\\",\\\"y\\\":167,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816329036615680\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"e845dc37-a9af-4153-8a66-bf7204f8d3a1\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":159,\\\"x\\\":1417,\\\"h\\\":52.00000000000011,\\\"i\\\":\\\"aaa6cdac-bcfc-40f3-8c0c-2605417665da\\\",\\\"y\\\":157,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816329057587200\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"b258bd40-8c44-4cee-9bd3-483a7b71f15d\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":133,\\\"x\\\":1479,\\\"h\\\":31.999999999999886,\\\"i\\\":\\\"3a0e298c-ee1b-49cf-82b3-9066d30920a0\\\",\\\"y\\\":360,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816329095335936\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"99a13c51-11d4-4653-a3df-f901809aa8b3\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":125.00000000000003,\\\"x\\\":1476,\\\"h\\\":43.00000000000007,\\\"i\\\":\\\"51138ed7-27f5-4b2f-bb91-92581db74f2a\\\",\\\"y\\\":320,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1023816329112113152\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"7eedfdb5-7a0d-4188-8990-dcc6fba4ac91\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":112.99999999999983,\\\"x\\\":1681,\\\"h\\\":75.00000000000009,\\\"i\\\":\\\"38e5ef36-5efc-4b1a-8c98-9707729f25b6\\\",\\\"y\\\":311,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816329149861888\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"a3d81f8d-7a50-49da-979f-3644a9319ff1\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":103.00000000000003,\\\"x\\\":1495,\\\"h\\\":58.99999999999993,\\\"i\\\":\\\"51933693-1a23-43a7-8d3d-9a117555a080\\\",\\\"y\\\":378,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816329166639104\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"ce8e4be4-fa4b-4b4f-b62a-4c2ebf8cf912\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":101,\\\"x\\\":1686,\\\"h\\\":55.999999999999915,\\\"i\\\":\\\"2c7c13a4-d842-4aeb-80e0-322baf38fcd4\\\",\\\"y\\\":349,\\\"orderNum\\\":0,\\\"angle\\\":0,\\\"pageCompId\\\":\\\"1023816329187610624\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"cbd63feb-ac7a-44e5-8cd2-f876266ccde9\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":187,\\\"x\\\":941,\\\"h\\\":44.99999999999998,\\\"i\\\":\\\"b46eb115-30ae-4109-9d3b-c9ebee84d462\\\",\\\"y\\\":456,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816329221165056\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"5e32cb8d-3c0e-4ef0-bf35-21c5b22323f0\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":117.00000000000001,\\\"x\\\":1417,\\\"h\\\":48.999999999999886,\\\"i\\\":\\\"086c850d-6552-4d12-8f7b-2a356e319fd5\\\",\\\"y\\\":460,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816329246330880\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"a0c2319e-820f-4917-9183-c618e2191afb\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":231.9999999999999,\\\"x\\\":1416,\\\"h\\\":36.00000000000006,\\\"i\\\":\\\"f2632fa7-5cd6-4508-bc8e-bed46dc4796b\\\",\\\"y\\\":734,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816329263108096\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"537922e2-250e-4fc6-a285-6c9616408d12\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":133,\\\"x\\\":588,\\\"h\\\":50,\\\"i\\\":\\\"es-drager-1731468997745-1\\\",\\\"y\\\":786,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816329292468224\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"42d7fe19-dba1-49ce-977a-0a7f4c734d4d\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":133,\\\"x\\\":689,\\\"h\\\":50,\\\"i\\\":\\\"es-drager-1731469045324-2\\\",\\\"y\\\":788,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816329309245440\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"137deb59-8229-4443-a6db-1a32d3314f28\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":156,\\\"x\\\":487,\\\"h\\\":50,\\\"i\\\":\\\"es-drager-1731469067745-3\\\",\\\"y\\\":816,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816329330216960\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"6172c7db-0958-4695-8959-5383b8c7a813\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":133,\\\"x\\\":475,\\\"h\\\":50,\\\"i\\\":\\\"es-drager-1731469093837-4\\\",\\\"y\\\":873,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816329363771392\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"508cdaa6-76d8-4528-aa40-490ad090b798\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":133,\\\"x\\\":593,\\\"h\\\":50,\\\"i\\\":\\\"es-drager-1731469107919-5\\\",\\\"y\\\":874,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816329376354304\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"10e5279b-44d1-4ef4-8cd9-0471159b640d\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":133,\\\"x\\\":473,\\\"h\\\":50,\\\"i\\\":\\\"es-drager-1731469125505-6\\\",\\\"y\\\":939,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816329397325824\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"683165dd-c105-4cec-98eb-54e6d4770dbd\\\"},{\\\"component\\\":\\\"JDragBorder\\\",\\\"w\\\":459,\\\"x\\\":1409,\\\"h\\\":258,\\\"i\\\":\\\"es-drager-1731469576838-7\\\",\\\"y\\\":458,\\\"orderNum\\\":1072,\\\"pageCompId\\\":\\\"1023816329430880256\\\",\\\"componentName\\\":\\\"边框1\\\",\\\"key\\\":\\\"a4d4e644-4965-4aec-868f-8c53448ce113\\\"},{\\\"visible\\\":true,\\\"h\\\":216,\\\"i\\\":\\\"d8b90d85-f8b8-47c8-88bd-e498323150d8\\\",\\\"orderNum\\\":77,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JMultipleBar\\\",\\\"w\\\":422,\\\"x\\\":1423,\\\"y\\\":501,\\\"pageCompId\\\":\\\"1023816329451851776\\\",\\\"componentName\\\":\\\"对比柱形图\\\",\\\"key\\\":\\\"7d7a295f-e411-4d1e-8536-69699c32a7ce\\\"},{\\\"visible\\\":true,\\\"h\\\":159,\\\"i\\\":\\\"5f653b62-2148-406b-8d29-f6fe1a2e313a\\\",\\\"orderNum\\\":77,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JLiquid\\\",\\\"w\\\":239,\\\"x\\\":1411,\\\"y\\\":814,\\\"pageCompId\\\":\\\"1023816329468628992\\\",\\\"componentName\\\":\\\"水波图\\\",\\\"key\\\":\\\"47ca34b1-801c-41e2-84da-1fb9b2b846c5\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":133,\\\"x\\\":1459,\\\"h\\\":50,\\\"i\\\":\\\"es-drager-1731469849535-8\\\",\\\"y\\\":964,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816329497989120\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"58bfe70f-7c07-498d-815b-7b84b339b548\\\"},{\\\"visible\\\":true,\\\"h\\\":159,\\\"i\\\":\\\"es-drager-1731469860843-9\\\",\\\"orderNum\\\":77,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JLiquid\\\",\\\"w\\\":239,\\\"x\\\":1625,\\\"y\\\":810,\\\"pageCompId\\\":\\\"1023816329514766336\\\",\\\"componentName\\\":\\\"水波图\\\",\\\"key\\\":\\\"af4592a7-893a-4ac6-a8ad-f5858f5ce642\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":133,\\\"x\\\":1682,\\\"h\\\":50,\\\"i\\\":\\\"es-drager-1731469871395-11\\\",\\\"y\\\":963,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1023816329539932160\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"f073c7b6-f877-40c4-8360-02db29823dcb\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":372,\\\"x\\\":4,\\\"h\\\":563,\\\"i\\\":\\\"664afc6d-de2e-4ea3-add4-6a4775aecdb6\\\",\\\"y\\\":147,\\\"orderNum\\\":1076,\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1023816329569292288\\\",\\\"key\\\":\\\"e426e43f-b306-4f10-b035-7750f520bd2f\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":370,\\\"x\\\":9,\\\"h\\\":342,\\\"i\\\":\\\"es-drager-1732616244282-1\\\",\\\"y\\\":722,\\\"orderNum\\\":1076,\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1023816329594458112\\\",\\\"key\\\":\\\"458e2e3c-3736-4c8b-8b67-425facc62e01\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":530,\\\"x\\\":386,\\\"h\\\":246,\\\"i\\\":\\\"es-drager-1732616354696-2\\\",\\\"y\\\":459,\\\"orderNum\\\":1076,\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1023816329615429632\\\",\\\"key\\\":\\\"7f23d65d-ed7f-4b03-97a4-5f0afcd1bc4c\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":529,\\\"x\\\":388,\\\"h\\\":289,\\\"i\\\":\\\"es-drager-1732616405643-3\\\",\\\"y\\\":157,\\\"orderNum\\\":1076,\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1023816329640595456\\\",\\\"key\\\":\\\"c984532e-0bfa-4599-8c75-9bfcaae81138\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":525,\\\"x\\\":384,\\\"h\\\":330,\\\"i\\\":\\\"es-drager-1732616467619-4\\\",\\\"y\\\":724,\\\"orderNum\\\":1076,\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1023816329665761280\\\",\\\"key\\\":\\\"73f250d3-e0e1-4e06-ad49-d93e9c802c05\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":456,\\\"x\\\":925,\\\"h\\\":284,\\\"i\\\":\\\"es-drager-1732616496825-5\\\",\\\"y\\\":155,\\\"orderNum\\\":1076,\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1023816329682538496\\\",\\\"key\\\":\\\"a6e2b4fe-5795-4755-85f6-c4a6c5eff951\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":459,\\\"x\\\":928,\\\"h\\\":247,\\\"i\\\":\\\"es-drager-1732616524093-6\\\",\\\"y\\\":457,\\\"orderNum\\\":1076,\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1023816329711898624\\\",\\\"key\\\":\\\"1924130e-9b87-4549-a316-2ac1fc858713\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":450,\\\"x\\\":930,\\\"h\\\":330,\\\"i\\\":\\\"es-drager-1732616572285-7\\\",\\\"y\\\":724,\\\"orderNum\\\":1076,\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1023816329732870144\\\",\\\"key\\\":\\\"b321eb44-73a3-48e3-9560-37d2a279b018\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":457,\\\"x\\\":1414,\\\"h\\\":285,\\\"i\\\":\\\"es-drager-1732616606027-8\\\",\\\"y\\\":152,\\\"orderNum\\\":1076,\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1023816329758035968\\\",\\\"key\\\":\\\"c9c3913f-b2ea-46ca-84df-8190b09f1707\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":462,\\\"x\\\":1405,\\\"h\\\":262,\\\"i\\\":\\\"es-drager-1732616641566-9\\\",\\\"y\\\":454,\\\"orderNum\\\":1076,\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1023816329783201792\\\",\\\"key\\\":\\\"ae158e97-49b6-4e08-8d05-34ff82e43ddc\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":464,\\\"x\\\":1410,\\\"h\\\":323,\\\"i\\\":\\\"es-drager-1732616671162-10\\\",\\\"y\\\":729,\\\"orderNum\\\":1076,\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1023816329799979008\\\",\\\"key\\\":\\\"cb74b720-4a75-46bd-883c-ddb194c1f370\\\"}]', '', '0', '1', 'admin', '2024-10-31 15:43:19', 'admin', '2024-12-03 14:47:25', NULL, 3, 2, 70, 0);\nINSERT INTO `onl_drag_page` VALUES ('1011915958294990848', '军地大数据驾驶舱', '/drag/page/view/1011915958294990848', '#495A78', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/bg2_1731048266718.png', 100, 'dark', 'bigScreen', NULL, '{\\\"width\\\":1920,\\\"height\\\":1080}', '[{\\\"visible\\\":true,\\\"h\\\":73.99999999999997,\\\"i\\\":\\\"d21ff181-9e4f-4232-8541-6eb1960fc562\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":446.00000000000006,\\\"x\\\":762,\\\"y\\\":20,\\\"pageCompId\\\":\\\"1023811507021467648\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"6e5a3ecd-17c7-4a07-9b16-2d5ae6335ff9\\\"},{\\\"visible\\\":true,\\\"h\\\":268,\\\"i\\\":\\\"05e6432a-51b5-48fd-8ab6-a124d3a50aae\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JRose\\\",\\\"w\\\":426,\\\"x\\\":49,\\\"y\\\":23,\\\"pageCompId\\\":\\\"1023811507063410688\\\",\\\"componentName\\\":\\\"南丁格尔玫瑰图\\\",\\\"key\\\":\\\"c1577c67-fbef-4166-8af1-ea7981306105\\\"},{\\\"visible\\\":true,\\\"h\\\":492,\\\"i\\\":\\\"eadb74d9-d2ac-44f9-bf13-ea1a7dee4654\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JBubbleMap\\\",\\\"w\\\":635,\\\"x\\\":635,\\\"y\\\":115,\\\"pageCompId\\\":\\\"1023811507080187904\\\",\\\"componentName\\\":\\\"散点地图\\\",\\\"key\\\":\\\"041f1194-8fd0-46d3-bbd9-b71d48d2d404\\\"},{\\\"visible\\\":true,\\\"h\\\":60,\\\"i\\\":\\\"6f3bc67b-ab9f-4802-876b-95e5881d3407\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JCurrentTime\\\",\\\"w\\\":465,\\\"x\\\":695,\\\"y\\\":116,\\\"pageCompId\\\":\\\"1023811507101159424\\\",\\\"componentName\\\":\\\"当前时间\\\",\\\"key\\\":\\\"134efa53-4ce2-49ba-8c71-e8ff88494146\\\"},{\\\"visible\\\":true,\\\"h\\\":512,\\\"i\\\":\\\"53b9d837-ac93-4267-814d-2fb58de90959\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JImg\\\",\\\"w\\\":560,\\\"x\\\":707,\\\"y\\\":111,\\\"pageCompId\\\":\\\"1023811507117936640\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"b6519495-5bc5-41bb-aa2e-d8847fff1623\\\"},{\\\"visible\\\":true,\\\"h\\\":328,\\\"i\\\":\\\"ea130c05-dbd4-420e-8e5b-7527dfc89349\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JMultipleBar\\\",\\\"w\\\":536,\\\"x\\\":44,\\\"y\\\":228,\\\"pageCompId\\\":\\\"1023811507130519552\\\",\\\"componentName\\\":\\\"对比柱形图\\\",\\\"key\\\":\\\"340b4328-86e9-4e2a-8fa1-cbcc67a1219a\\\"},{\\\"visible\\\":true,\\\"h\\\":305,\\\"i\\\":\\\"es-drager-1731053336142-4\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JMultipleLine\\\",\\\"w\\\":519,\\\"x\\\":38,\\\"y\\\":560,\\\"pageCompId\\\":\\\"1023811507138908160\\\",\\\"componentName\\\":\\\"对比折线图\\\",\\\"key\\\":\\\"d10f660e-e668-467d-910a-0c92ac105f85\\\"},{\\\"visible\\\":true,\\\"h\\\":286,\\\"i\\\":\\\"es-drager-1731054001741-5\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JMultipleBar\\\",\\\"w\\\":1259,\\\"x\\\":7,\\\"y\\\":770,\\\"pageCompId\\\":\\\"1023811507151491072\\\",\\\"componentName\\\":\\\"对\\\",\\\"key\\\":\\\"7b7de114-55f0-4040-8511-fafc5e890c0b\\\"},{\\\"visible\\\":true,\\\"h\\\":36.99999999999996,\\\"i\\\":\\\"8b80e585-cca1-4de4-8029-cdf6a11ecb01\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":99.00000000000006,\\\"x\\\":1809,\\\"y\\\":18,\\\"pageCompId\\\":\\\"1023811507180851200\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"fdd9bf52-0641-412a-9073-8344018e4ce2\\\"},{\\\"visible\\\":true,\\\"h\\\":295,\\\"i\\\":\\\"c7ca60ee-3281-428d-975e-49195c8cb742\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JScrollBoard\\\",\\\"w\\\":510,\\\"x\\\":1383,\\\"y\\\":68,\\\"pageCompId\\\":\\\"1023811507189239808\\\",\\\"componentName\\\":\\\"轮播表\\\",\\\"key\\\":\\\"a348bf5a-bf05-4d38-8f7a-3141536de3f8\\\"},{\\\"visible\\\":true,\\\"h\\\":326,\\\"i\\\":\\\"5e3ac2b4-7262-4999-b3f8-eed7cde4aae0\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JRadar\\\",\\\"w\\\":540,\\\"x\\\":1344,\\\"y\\\":418,\\\"pageCompId\\\":\\\"1023811507201822720\\\",\\\"componentName\\\":\\\"普通雷达图\\\",\\\"key\\\":\\\"4cf7463a-80a4-4a94-8e0c-93ff64e01d13\\\"},{\\\"visible\\\":true,\\\"h\\\":36.99999999999996,\\\"i\\\":\\\"es-drager-1731055443036-8\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":171.00000000000006,\\\"x\\\":1732,\\\"y\\\":739,\\\"pageCompId\\\":\\\"1023811507214405632\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"3adaa5fa-b8b2-4666-9671-c6a0f57a7793\\\"},{\\\"visible\\\":true,\\\"h\\\":150,\\\"i\\\":\\\"bc23259f-0db5-4ff9-8651-b04ab85bfd86\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JRingProgress\\\",\\\"w\\\":245,\\\"x\\\":1289,\\\"y\\\":778,\\\"pageCompId\\\":\\\"1023811507222794240\\\",\\\"componentName\\\":\\\"基础环形图\\\",\\\"key\\\":\\\"bff57100-8221-475f-8ae4-556f4f003623\\\"},{\\\"visible\\\":true,\\\"h\\\":145,\\\"i\\\":\\\"es-drager-1731464896011-1\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JRingProgress\\\",\\\"w\\\":206,\\\"x\\\":1490,\\\"y\\\":784,\\\"pageCompId\\\":\\\"1023811507247960064\\\",\\\"componentName\\\":\\\"基础环形图\\\",\\\"key\\\":\\\"af09d0dd-6ee8-4888-be1e-0aa70e8034a9\\\"},{\\\"visible\\\":true,\\\"h\\\":145,\\\"i\\\":\\\"es-drager-1731465032706-2\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JRingProgress\\\",\\\"w\\\":206,\\\"x\\\":1681,\\\"y\\\":789,\\\"pageCompId\\\":\\\"1023811507260542976\\\",\\\"componentName\\\":\\\"基础环形图\\\",\\\"key\\\":\\\"d14af176-59cc-4b63-bb63-e2c0359f90b5\\\"},{\\\"visible\\\":true,\\\"h\\\":148,\\\"i\\\":\\\"es-drager-1731465068621-3\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JRingProgress\\\",\\\"w\\\":225,\\\"x\\\":1310,\\\"y\\\":920,\\\"pageCompId\\\":\\\"1023811507273125888\\\",\\\"componentName\\\":\\\"基础环形图\\\",\\\"key\\\":\\\"b6f36278-68f0-4aac-8ccd-8b433a61a645\\\"},{\\\"visible\\\":true,\\\"h\\\":145,\\\"i\\\":\\\"es-drager-1731465078501-4\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JRingProgress\\\",\\\"w\\\":228,\\\"x\\\":1477,\\\"y\\\":920,\\\"pageCompId\\\":\\\"1023811507281514496\\\",\\\"componentName\\\":\\\"基础环形图\\\",\\\"key\\\":\\\"6417673f-2e1e-4484-8fd5-47a54765c64c\\\"},{\\\"visible\\\":true,\\\"h\\\":145,\\\"i\\\":\\\"es-drager-1731465083311-5\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JRingProgress\\\",\\\"w\\\":267,\\\"x\\\":1643,\\\"y\\\":924,\\\"pageCompId\\\":\\\"1023811507294097408\\\",\\\"componentName\\\":\\\"基础环形图\\\",\\\"key\\\":\\\"db7baa0d-98da-45d0-9a00-321e7469973e\\\"},{\\\"visible\\\":true,\\\"h\\\":55,\\\"i\\\":\\\"bbf1a7a0-2dd6-4a91-88de-e8f83d8a4d15\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JProgress\\\",\\\"w\\\":330,\\\"x\\\":618,\\\"y\\\":629,\\\"pageCompId\\\":\\\"1023811507319263232\\\",\\\"componentName\\\":\\\"进度图\\\",\\\"key\\\":\\\"51a1720e-f1f3-4fde-8b92-9fb184d1003b\\\"},{\\\"visible\\\":true,\\\"h\\\":55,\\\"i\\\":\\\"es-drager-1731661825946-1\\\",\\\"orderNum\\\":390,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JProgress\\\",\\\"w\\\":330,\\\"x\\\":614,\\\"y\\\":677,\\\"pageCompId\\\":\\\"1023811507331846144\\\",\\\"componentName\\\":\\\"进度图\\\",\\\"key\\\":\\\"f3ea9eff-ac32-405a-abf2-3a48a31763eb\\\"}]', '', '0', '1', 'admin', '2024-10-31 18:39:35', 'admin', '2024-12-03 14:28:15', NULL, 3, 2, 0, 0);\nINSERT INTO `onl_drag_page` VALUES ('1014376428645961728', '北京科技数字化云平台', '/drag/page/view/1014376428645961728', '#1E0047', '/img/bg/bg10.png', 100, 'dark', 'bigScreen', NULL, '{\\\"width\\\":1920,\\\"height\\\":1080}', '[{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":1917.0000000000002,\\\"x\\\":-1,\\\"h\\\":80,\\\"i\\\":\\\"1c5b0dae-314f-4663-8ebc-529e7ef397a1\\\",\\\"y\\\":0,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1021338143312891904\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"c6bb8c0a-1734-405f-82be-5b25699a1bc1\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":420,\\\"x\\\":746,\\\"h\\\":77,\\\"i\\\":\\\"afe6932a-9fcd-4cc1-8037-eefcf1b0605f\\\",\\\"y\\\":2,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143350640640\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"2ce590fd-9d06-4a8d-9680-247a0fb4edef\\\"},{\\\"component\\\":\\\"JCurrentTime\\\",\\\"w\\\":421,\\\"x\\\":745,\\\"h\\\":35,\\\"i\\\":\\\"a1ce6897-c28b-4f42-a775-c8c34d495d5d\\\",\\\"y\\\":107,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143363223552\\\",\\\"componentName\\\":\\\"当前时间\\\",\\\"key\\\":\\\"4aa4d128-8900-4bb3-8931-0de2329d594c\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":130,\\\"x\\\":82,\\\"h\\\":52,\\\"i\\\":\\\"df702a2c-c1bf-4b9a-a1c7-83ff51a74c19\\\",\\\"y\\\":21,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143375806464\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"0423a14c-aa58-4a24-88b5-9e72c803f2f3\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":80,\\\"x\\\":104,\\\"h\\\":41,\\\"i\\\":\\\"30361f52-fd03-40ab-86b8-52f358f3aff4\\\",\\\"y\\\":28.00000000000003,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143384195072\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"6f310775-12f2-4e7b-851e-8ac90409239a\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":130,\\\"x\\\":327,\\\"h\\\":52,\\\"i\\\":\\\"bc141cf0-9e31-424b-bc6c-1698023529be\\\",\\\"y\\\":21,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143392583680\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"c3323f46-a868-4a34-814d-f95979d553cd\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":80,\\\"x\\\":352,\\\"h\\\":40,\\\"i\\\":\\\"becd17b5-e053-40c1-ab20-936e08457e38\\\",\\\"y\\\":27,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143405166592\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"10d319c0-bcb7-46ea-8d7b-8aeced7cb4f8\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":130,\\\"x\\\":205,\\\"h\\\":52,\\\"i\\\":\\\"08856df6-2e3b-422d-9a27-ceb3e94ddbe1\\\",\\\"y\\\":22,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143426138112\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"bdd13a67-9d91-4ac0-973e-9149f2abeb12\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":130,\\\"x\\\":1327,\\\"h\\\":52,\\\"i\\\":\\\"36ab5497-269f-4aee-a4b6-3fe6a2c20d4b\\\",\\\"y\\\":22,\\\"orderNum\\\":340,\\\"pageCompId\\\":\\\"1021338143442915328\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"c0961091-151c-4a65-81db-7c8263018832\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":130,\\\"x\\\":1454,\\\"h\\\":52,\\\"i\\\":\\\"9697caf8-8a85-44c2-b7a4-ff5624b29217\\\",\\\"y\\\":22,\\\"orderNum\\\":600,\\\"pageCompId\\\":\\\"1021338143455498240\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"5bd5f33d-49d3-4c51-b6fc-dccc388a565b\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":130,\\\"x\\\":1701,\\\"h\\\":52,\\\"i\\\":\\\"3b70af8f-cb79-45fb-b493-67f9f3ba68cd\\\",\\\"y\\\":22,\\\"orderNum\\\":1120,\\\"pageCompId\\\":\\\"1021338143468081152\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"bc96714a-6706-4a8a-8f21-7f9c26859c51\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":130,\\\"x\\\":1579,\\\"h\\\":52,\\\"i\\\":\\\"4190d49d-5234-4c6b-8092-311e77aff8e1\\\",\\\"y\\\":21,\\\"orderNum\\\":1380,\\\"pageCompId\\\":\\\"1021338143484858368\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"541dc811-5fd0-4b3a-8deb-082e430c3ac4\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":130,\\\"x\\\":452,\\\"h\\\":52,\\\"i\\\":\\\"cf1d47c4-70d8-4792-ab2c-cfa33476c5e2\\\",\\\"y\\\":21,\\\"orderNum\\\":1640,\\\"pageCompId\\\":\\\"1021338143501635584\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"f9ce5aba-f469-48d9-aad6-b7f82cf14ea4\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":81,\\\"x\\\":229,\\\"h\\\":40,\\\"i\\\":\\\"65595a23-9092-4735-8f50-e43aa9b1090f\\\",\\\"y\\\":29,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143514218496\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"124b4e24-fc36-419d-b0e0-011c683512f2\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":80,\\\"x\\\":477,\\\"h\\\":40,\\\"i\\\":\\\"c3f77106-d4d2-49e0-9d94-7836eb492869\\\",\\\"y\\\":27,\\\"orderNum\\\":380,\\\"pageCompId\\\":\\\"1021338143526801408\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"647324c5-98a4-4bdd-9aa0-71e6d07ca55a\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":80,\\\"x\\\":1351,\\\"h\\\":40,\\\"i\\\":\\\"73f50ee8-3743-466d-b2e3-87c05122a4fc\\\",\\\"y\\\":28,\\\"orderNum\\\":680,\\\"pageCompId\\\":\\\"1021338143539384320\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"0c05486a-7cf8-42dd-8408-80d9b0d7467d\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":80,\\\"x\\\":1726,\\\"h\\\":40,\\\"i\\\":\\\"e9c3ab9b-a254-47fd-8965-b871c21a19dc\\\",\\\"y\\\":29,\\\"orderNum\\\":980,\\\"pageCompId\\\":\\\"1021338143560355840\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"2e9efc55-2346-41d8-8829-3fd8f83c16cd\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":80,\\\"x\\\":1480,\\\"h\\\":40,\\\"i\\\":\\\"38a62dd0-f307-4f50-8fd6-c84c7026c875\\\",\\\"y\\\":29,\\\"orderNum\\\":1280,\\\"pageCompId\\\":\\\"1021338143577133056\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"0390e889-22ba-4fde-8657-32d8be6bd605\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":80,\\\"x\\\":1604,\\\"h\\\":40,\\\"i\\\":\\\"495b30ae-75f6-49cb-8fa8-c5ee1b178529\\\",\\\"y\\\":28,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143593910272\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"755692a6-4622-401e-a2f3-27e516fe3153\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":465,\\\"x\\\":51,\\\"h\\\":260,\\\"i\\\":\\\"73b633d2-20f2-4b52-8db7-c23650825fc4\\\",\\\"y\\\":134,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143606493184\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"76375940-b57f-4530-add1-cca8070a881e\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":115,\\\"x\\\":104,\\\"h\\\":33.99999999999994,\\\"i\\\":\\\"88a76ab8-7f47-43a3-8c56-2208a412dc9b\\\",\\\"y\\\":140,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143619076096\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"74de6558-99ae-46eb-8fd1-9dd23c3e0b17\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":267.00000000000006,\\\"x\\\":167.99999999999997,\\\"h\\\":42.999999999999886,\\\"i\\\":\\\"1a568920-26ed-4f2a-a3b2-ee30e9120783\\\",\\\"y\\\":183,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143635853312\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"064902ad-c58b-4c31-9a14-ba351374f686\\\"},{\\\"component\\\":\\\"JCountTo\\\",\\\"w\\\":87,\\\"x\\\":170,\\\"h\\\":40,\\\"i\\\":\\\"cf88897f-f8ed-4994-8825-4781822d6da4\\\",\\\"y\\\":254,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143648436224\\\",\\\"componentName\\\":\\\"翻牌器\\\",\\\"key\\\":\\\"33006bad-0489-43c3-aecd-e7ad249e95e4\\\"},{\\\"component\\\":\\\"JCountTo\\\",\\\"w\\\":91.99999999999994,\\\"x\\\":318,\\\"h\\\":39.00000000000006,\\\"i\\\":\\\"7e11b52c-2c9c-49d9-8921-529e89f7e188\\\",\\\"y\\\":252,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143665213440\\\",\\\"componentName\\\":\\\"翻牌器\\\",\\\"key\\\":\\\"14f4c518-fd66-41b7-ae24-69f4992e78b3\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":80.00000000000006,\\\"x\\\":174,\\\"h\\\":32.99999999999994,\\\"i\\\":\\\"5e3aaf53-23db-40d7-8492-9ca6220991a8\\\",\\\"y\\\":302,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143690379264\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"cdd16d26-6bf3-4010-8a4f-198112383d83\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":91.00000000000006,\\\"x\\\":323,\\\"h\\\":31.999999999999886,\\\"i\\\":\\\"b012cf61-412e-4a10-8131-e0d0c0ee722c\\\",\\\"y\\\":303.00000000000006,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143711350784\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"73a0a2a9-8b9b-41ad-ac84-70ad6fbab13c\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":468,\\\"x\\\":48,\\\"h\\\":632,\\\"i\\\":\\\"5440a659-599a-4f47-aedd-0dffeba16881\\\",\\\"y\\\":415,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143728128000\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"21fed81a-0e75-460d-bb02-5354b624135a\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":393,\\\"x\\\":90,\\\"h\\\":264,\\\"i\\\":\\\"293ea950-a869-4661-818d-2ddb042c5831\\\",\\\"y\\\":466,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143744905216\\\",\\\"componentName\\\":\\\"基础柱形图\\\",\\\"key\\\":\\\"4b4ec44a-d4ad-4f25-803e-bc9d8d5a1c3f\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":391,\\\"x\\\":83,\\\"h\\\":266,\\\"i\\\":\\\"53e124ad-12e5-4e40-8bda-c4a3982df3f2\\\",\\\"y\\\":758,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143761682432\\\",\\\"componentName\\\":\\\"基础柱形图\\\",\\\"key\\\":\\\"7bfd0d39-b4b8-44cb-8d6a-34fc5ebd1d47\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":857,\\\"x\\\":539,\\\"h\\\":483,\\\"i\\\":\\\"748d6c5f-c1ba-42a8-b853-d72e8cf86037\\\",\\\"y\\\":162,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143786848256\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"dc04036a-aac4-492a-8118-3fa7ebee2d65\\\"},{\\\"component\\\":\\\"JGauge\\\",\\\"w\\\":465,\\\"x\\\":941,\\\"h\\\":300,\\\"i\\\":\\\"62bbe478-2de0-4ba0-883e-7851a22525f8\\\",\\\"y\\\":166,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143803625472\\\",\\\"componentName\\\":\\\"基础仪表盘\\\",\\\"key\\\":\\\"ee9ea87e-eb4c-4ecd-9637-6012763d69b6\\\"},{\\\"component\\\":\\\"JGauge\\\",\\\"w\\\":359,\\\"x\\\":563,\\\"h\\\":253,\\\"i\\\":\\\"72e4c8b5-9ad4-4209-8f91-232ec35404f3\\\",\\\"y\\\":410,\\\"orderNum\\\":380,\\\"pageCompId\\\":\\\"1021338143816208384\\\",\\\"componentName\\\":\\\"基础仪表盘\\\",\\\"key\\\":\\\"4d0dfcb4-5a66-4e40-b1f9-890f3a863827\\\"},{\\\"component\\\":\\\"JGauge\\\",\\\"w\\\":359,\\\"x\\\":798,\\\"h\\\":253,\\\"i\\\":\\\"c682e09f-78f2-4ad3-90e8-e5a8c29e87e2\\\",\\\"y\\\":411,\\\"orderNum\\\":680,\\\"pageCompId\\\":\\\"1021338143837179904\\\",\\\"componentName\\\":\\\"基础仪表盘\\\",\\\"key\\\":\\\"9433d861-11bc-478d-8826-3d37777cb5de\\\"},{\\\"component\\\":\\\"JGauge\\\",\\\"w\\\":359,\\\"x\\\":1033,\\\"h\\\":253,\\\"i\\\":\\\"24276840-64dc-4a3e-91df-3ee4ebc11dda\\\",\\\"y\\\":411,\\\"orderNum\\\":980,\\\"pageCompId\\\":\\\"1021338143853957120\\\",\\\"componentName\\\":\\\"基础仪表盘\\\",\\\"key\\\":\\\"87de9d63-8c51-4485-bb2b-0a02b396709d\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":859,\\\"x\\\":534,\\\"h\\\":390,\\\"i\\\":\\\"75acb749-0e0d-4786-82a8-00e95be9f438\\\",\\\"y\\\":655,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143870734336\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"c9ce4876-c35e-4b30-8c7a-8b94342f1f72\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":184,\\\"x\\\":558,\\\"h\\\":44.000000000000064,\\\"i\\\":\\\"b3343cad-a2e4-4fe8-aee3-0df2011efdba\\\",\\\"y\\\":666,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143895900160\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"6efaa506-5e73-4b5c-9001-dfe627072b7f\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":465,\\\"x\\\":1416,\\\"h\\\":449,\\\"i\\\":\\\"64faccb2-3cdb-4f2c-893c-5500876b9814\\\",\\\"y\\\":134,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143921065984\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"849ff904-c1cd-417b-85e8-c628b3a94d94\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":342,\\\"x\\\":1478,\\\"h\\\":51,\\\"i\\\":\\\"b026c26b-d67e-4d2a-abb0-faee39022d65\\\",\\\"y\\\":146,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143933648896\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"7ad15ec7-26ec-4311-a081-9ec6433ad949\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":459,\\\"x\\\":1394,\\\"h\\\":80,\\\"i\\\":\\\"7a3e3767-a8c2-420b-8fb8-e7b0449b6ea0\\\",\\\"y\\\":188,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143946231808\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"c1ef9157-88d6-418f-8555-e4c0eb3a9910\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":460,\\\"x\\\":1402,\\\"h\\\":80,\\\"i\\\":\\\"5b37cb7e-23f1-476d-8306-cce309220168\\\",\\\"y\\\":267,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143958814720\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"334c39ea-3d81-44f4-81a5-3f5becb7c238\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":458,\\\"x\\\":1419,\\\"h\\\":80,\\\"i\\\":\\\"80333722-29ff-4703-80cc-6244600321cf\\\",\\\"y\\\":342,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143983980544\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"64176ba1-1726-4b3b-930a-60d78f55405d\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":459,\\\"x\\\":1401,\\\"h\\\":80,\\\"i\\\":\\\"72fbb44c-32de-413d-8968-b7b7d7d4e701\\\",\\\"y\\\":420,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338143996563456\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"2180452b-8354-41eb-8ca2-f8ac29a3d72d\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":465,\\\"x\\\":1415,\\\"h\\\":410,\\\"i\\\":\\\"c1d5b4eb-3891-4a0a-9a21-80e80259a176\\\",\\\"y\\\":634,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338144009146368\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"6fbc13df-3fe5-4bd3-a66a-bd0c0f6fc52a\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":340,\\\"x\\\":1477,\\\"h\\\":44,\\\"i\\\":\\\"44f731e0-fa94-4109-8d53-e216cab63b8a\\\",\\\"y\\\":647,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338144025923584\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"d26580ba-97bd-4656-84eb-b176c458ad32\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":465,\\\"x\\\":761,\\\"h\\\":57.99999999999997,\\\"i\\\":\\\"c0d264d8-2b60-4afd-b306-d265c58e8473\\\",\\\"y\\\":165,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338144046895104\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"fd6b9ecb-a058-45ff-96af-7ff4429e58dd\\\"},{\\\"component\\\":\\\"JLine\\\",\\\"w\\\":466,\\\"x\\\":1414,\\\"h\\\":288,\\\"i\\\":\\\"0b1de716-468e-42ec-89b8-be233d3d8724\\\",\\\"y\\\":707,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338144063672320\\\",\\\"componentName\\\":\\\"基础折线图\\\",\\\"key\\\":\\\"34d49859-b94c-48e3-808f-da08b873426c\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JScrollTable\\\",\\\"visible\\\":true,\\\"w\\\":852,\\\"x\\\":537,\\\"h\\\":329,\\\"i\\\":\\\"89e5576b-dbbf-4a06-9ceb-db690e7ad61c\\\",\\\"y\\\":712,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338144080449536\\\",\\\"componentName\\\":\\\"表格\\\"},{\\\"component\\\":\\\"JGauge\\\",\\\"w\\\":524,\\\"x\\\":543,\\\"h\\\":301,\\\"i\\\":\\\"9044d895-c38e-44ba-a793-826b086fec66\\\",\\\"y\\\":166,\\\"orderNum\\\":80,\\\"pageCompId\\\":\\\"1021338144088838144\\\",\\\"componentName\\\":\\\"基础仪表盘\\\",\\\"key\\\":\\\"331dc721-7c5e-4004-81b1-8aca324df4f8\\\"}]', '', '0', '1', 'admin', '2024-11-07 13:36:37', 'admin', '2024-11-26 18:39:59', NULL, 3, 2, 0, 0);\nINSERT INTO `onl_drag_page` VALUES ('1015895036886831104', '监狱狱政科数据展示', '/drag/page/view/1015895036886831104', NULL, 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/2背景_1731554307578.jpg', 100, 'dark', 'bigScreen', NULL, '{\\\"width\\\":1920,\\\"height\\\":1080}', '[{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"8a751a70-50ff-4a18-bb2a-e33c7d8bb055\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":18,\\\"y\\\":16,\\\"pageCompId\\\":\\\"1017321185898713088\\\",\\\"selected\\\":true,\\\"key\\\":\\\"3a9800ef-77ba-4d23-ad7f-93299a9746f5\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731554341219-1\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":519,\\\"x\\\":695,\\\"y\\\":39,\\\"pageCompId\\\":\\\"1017321185940656128\\\",\\\"selected\\\":false,\\\"key\\\":\\\"87a516b1-654e-4385-8624-92b63e69dfce\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731554641653-2\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":45,\\\"y\\\":129,\\\"pageCompId\\\":\\\"1017321185957433344\\\",\\\"selected\\\":false,\\\"key\\\":\\\"8bd60606-6457-4074-8251-67e8d476058c\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731554650239-3\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":142,\\\"x\\\":621,\\\"y\\\":130,\\\"pageCompId\\\":\\\"1017321185974210560\\\",\\\"selected\\\":false,\\\"key\\\":\\\"1118e97a-1e3d-4e8d-839e-80485318ab38\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731554657899-4\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":794,\\\"y\\\":130,\\\"pageCompId\\\":\\\"1017321185986793472\\\",\\\"selected\\\":false,\\\"key\\\":\\\"9c0a3cb7-aaba-472a-a1d7-cf692e2aa1c4\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731554660718-5\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":969,\\\"y\\\":131,\\\"pageCompId\\\":\\\"1017321186003570688\\\",\\\"selected\\\":false,\\\"key\\\":\\\"7039875e-bec1-4c3a-9e15-3d2ee61e0d34\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731554663509-6\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":1140,\\\"y\\\":132,\\\"pageCompId\\\":\\\"1017321186024542208\\\",\\\"selected\\\":false,\\\"key\\\":\\\"506c148d-7747-4fb2-aa8f-6642cd48ecde\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731554901305-7\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":615,\\\"y\\\":180,\\\"pageCompId\\\":\\\"1017321186041319424\\\",\\\"selected\\\":false,\\\"key\\\":\\\"7cb3629b-2812-4137-afba-1036dfd65e4c\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731554904164-8\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":49,\\\"x\\\":820,\\\"y\\\":182,\\\"pageCompId\\\":\\\"1017321186053902336\\\",\\\"selected\\\":false,\\\"key\\\":\\\"fcad8b91-29ab-4094-8626-9d59e91797ef\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731554906777-9\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":965,\\\"y\\\":181,\\\"pageCompId\\\":\\\"1017321186066485248\\\",\\\"selected\\\":false,\\\"key\\\":\\\"338a28fd-1ac4-4642-8267-7a9259379408\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731554911018-10\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":89,\\\"x\\\":1173,\\\"y\\\":182,\\\"pageCompId\\\":\\\"1017321186095845376\\\",\\\"selected\\\":false,\\\"key\\\":\\\"6f8b961b-77b9-468d-8c6b-ff63b9a834a4\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731554930989-11\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":1338,\\\"y\\\":129,\\\"pageCompId\\\":\\\"1017321186108428288\\\",\\\"selected\\\":false,\\\"key\\\":\\\"0d699b4a-d448-40a2-9cc4-d7f20ecc125e\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731554944783-12\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":211,\\\"x\\\":1337,\\\"y\\\":625,\\\"pageCompId\\\":\\\"1017321186121011200\\\",\\\"selected\\\":false,\\\"key\\\":\\\"97d874ca-f103-4830-8663-a3c68246e406\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731554949510-13\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":192,\\\"x\\\":616,\\\"y\\\":623,\\\"pageCompId\\\":\\\"1017321186133594112\\\",\\\"selected\\\":false,\\\"key\\\":\\\"e36af5b1-f538-45d1-b609-6905b0924772\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731554956540-14\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":52,\\\"y\\\":625,\\\"pageCompId\\\":\\\"1017321186154565632\\\",\\\"selected\\\":false,\\\"key\\\":\\\"bcd21420-8a7f-44fe-891b-92600239e2e8\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731555036448-15\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":44,\\\"x\\\":853,\\\"y\\\":182,\\\"pageCompId\\\":\\\"1017321186175537152\\\",\\\"selected\\\":false,\\\"key\\\":\\\"445e208c-59a3-4fb9-b0d2-6def4f0179bd\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731555481413-16\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":52,\\\"y\\\":189,\\\"pageCompId\\\":\\\"1017321186188120064\\\",\\\"selected\\\":false,\\\"key\\\":\\\"d688d880-01bd-4e34-97cf-b76d90dce3e1\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731555488647-17\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":284,\\\"y\\\":185,\\\"pageCompId\\\":\\\"1017321186200702976\\\",\\\"selected\\\":false,\\\"key\\\":\\\"9e4d8375-3307-494b-9d50-f00ad07587ee\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731555491173-18\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":84,\\\"y\\\":225,\\\"pageCompId\\\":\\\"1017321186217480192\\\",\\\"selected\\\":false,\\\"key\\\":\\\"fb22424a-2a27-4ccc-bf06-e8d792580b94\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731555492397-19\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":308,\\\"y\\\":223,\\\"pageCompId\\\":\\\"1017321186238451712\\\",\\\"selected\\\":false,\\\"key\\\":\\\"a21ba509-1ec6-4450-8353-aa3929092dc3\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731555507249-20\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":1311,\\\"y\\\":188,\\\"pageCompId\\\":\\\"1017321186251034624\\\",\\\"selected\\\":false,\\\"key\\\":\\\"7667dd74-acff-4fb6-8881-b8035d0ede80\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731555511061-21\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":1541,\\\"y\\\":192,\\\"pageCompId\\\":\\\"1017321186263617536\\\",\\\"selected\\\":false,\\\"key\\\":\\\"40d56052-f72b-4eae-8c7e-1d77cae61013\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731555514595-22\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":1343,\\\"y\\\":222,\\\"pageCompId\\\":\\\"1017321186280394752\\\",\\\"selected\\\":false,\\\"key\\\":\\\"8995191b-cfdc-4978-8428-2b43b1d9a046\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731555517774-23\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":1610,\\\"y\\\":224,\\\"pageCompId\\\":\\\"1017321186305560576\\\",\\\"selected\\\":false,\\\"key\\\":\\\"4e2fb295-3f4e-4e35-ac37-7d85f35a9242\\\"},{\\\"visible\\\":true,\\\"h\\\":216,\\\"i\\\":\\\"8fc14384-c894-4c46-830c-9047ff569a66\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JMultipleBar\\\",\\\"w\\\":489,\\\"x\\\":55,\\\"y\\\":356,\\\"pageCompId\\\":\\\"1017321186322337792\\\",\\\"selected\\\":false,\\\"key\\\":\\\"a132eed8-6436-4fc5-86f6-dfda0f05eb95\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731556853370-24\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":63,\\\"y\\\":258,\\\"pageCompId\\\":\\\"1017321186334920704\\\",\\\"selected\\\":false,\\\"key\\\":\\\"40d94708-30eb-4c29-8e52-4b7d18036c1d\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731556856918-25\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":94,\\\"y\\\":297,\\\"pageCompId\\\":\\\"1017321186351697920\\\",\\\"selected\\\":false,\\\"key\\\":\\\"d95f5454-2a3f-49d3-a3fa-2e2854dec8da\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731556862766-26\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":311,\\\"y\\\":259,\\\"pageCompId\\\":\\\"1017321186376863744\\\",\\\"selected\\\":false,\\\"key\\\":\\\"07269e41-c8ce-4d70-8ff2-3abcf3ba247b\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731556870179-27\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":311,\\\"y\\\":299,\\\"pageCompId\\\":\\\"1017321186393640960\\\",\\\"selected\\\":false,\\\"key\\\":\\\"f11c4f40-34b9-4048-936a-cdcf2d4017e2\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731556893775-28\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":1309,\\\"y\\\":268,\\\"pageCompId\\\":\\\"1017321186406223872\\\",\\\"selected\\\":false,\\\"key\\\":\\\"b55f7d17-91a2-4cb1-8c2f-60c10c073d5b\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731556897633-29\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":1353,\\\"y\\\":306,\\\"pageCompId\\\":\\\"1017321186431389696\\\",\\\"selected\\\":false,\\\"key\\\":\\\"efeaefc7-4cd2-4563-a337-da451878a314\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731556900421-30\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":1547,\\\"y\\\":269,\\\"pageCompId\\\":\\\"1017321186452361216\\\",\\\"selected\\\":false,\\\"key\\\":\\\"2e268466-8ded-4a7b-808a-8582b306e11f\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731556904681-31\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":153,\\\"x\\\":1609,\\\"y\\\":302,\\\"pageCompId\\\":\\\"1017321186464944128\\\",\\\"selected\\\":false,\\\"key\\\":\\\"920ee28a-be38-41ed-84be-9ca5d8b9e359\\\"},{\\\"visible\\\":true,\\\"h\\\":263,\\\"i\\\":\\\"810ae487-0402-45e4-839f-ae53fe327206\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JPie\\\",\\\"w\\\":412,\\\"x\\\":608,\\\"y\\\":298,\\\"pageCompId\\\":\\\"1017321186477527040\\\",\\\"selected\\\":false,\\\"key\\\":\\\"63730e7b-f8a1-493b-8094-684034d0c004\\\"},{\\\"visible\\\":true,\\\"h\\\":263,\\\"i\\\":\\\"es-drager-1731565807875-32\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JPie\\\",\\\"w\\\":412,\\\"x\\\":960,\\\"y\\\":295,\\\"pageCompId\\\":\\\"1017321186498498560\\\",\\\"selected\\\":false,\\\"key\\\":\\\"ce4dca14-edfc-488c-80e1-f3c908d5de65\\\"},{\\\"visible\\\":true,\\\"h\\\":236,\\\"i\\\":\\\"e546a2b1-0da9-45b4-95f6-c6fbcb6d1846\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JMultipleBar\\\",\\\"w\\\":529,\\\"x\\\":1339,\\\"y\\\":350,\\\"pageCompId\\\":\\\"1017321186515275776\\\",\\\"selected\\\":false,\\\"key\\\":\\\"448ab743-22ec-427a-945f-d44a48b56f0b\\\"},{\\\"visible\\\":true,\\\"h\\\":177,\\\"i\\\":\\\"96d5c689-2fc0-494a-92e1-9d446345c1e9\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDynamicBar\\\",\\\"w\\\":464,\\\"x\\\":1336,\\\"y\\\":670,\\\"pageCompId\\\":\\\"1017321186532052992\\\",\\\"selected\\\":false,\\\"key\\\":\\\"a3c4101a-faeb-47d8-8db9-476d3133575d\\\"},{\\\"visible\\\":true,\\\"h\\\":171,\\\"i\\\":\\\"es-drager-1731571931624-1\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDynamicBar\\\",\\\"w\\\":450,\\\"x\\\":1336,\\\"y\\\":838,\\\"pageCompId\\\":\\\"1017321186544635904\\\",\\\"selected\\\":false,\\\"key\\\":\\\"7de97686-514e-47d8-8dca-e3332bb1a101\\\"},{\\\"visible\\\":true,\\\"h\\\":321,\\\"i\\\":\\\"18f17713-c9a2-43c8-a1b4-8956526edf92\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JScrollBoard\\\",\\\"w\\\":534,\\\"x\\\":49,\\\"y\\\":684,\\\"pageCompId\\\":\\\"1017321186561413120\\\",\\\"selected\\\":false,\\\"key\\\":\\\"b9bbfb10-b8b6-4d69-839d-533cb6bc87b3\\\"},{\\\"visible\\\":true,\\\"h\\\":324,\\\"i\\\":\\\"es-drager-1731572436300-2\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JScrollBoard\\\",\\\"w\\\":676,\\\"x\\\":624,\\\"y\\\":686,\\\"pageCompId\\\":\\\"1017321186582384640\\\",\\\"selected\\\":false,\\\"key\\\":\\\"4e9900f0-25b3-4afe-8f4a-47fe3278f7d5\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JCurrentTime\\\",\\\"visible\\\":true,\\\"w\\\":289,\\\"x\\\":1585,\\\"h\\\":33,\\\"i\\\":\\\"93f679fd-84cd-4e4e-8b1c-a6c832393f9f\\\",\\\"y\\\":18,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017321186599161856\\\",\\\"selected\\\":false}]', '', '0', '1', 'admin', '2024-11-11 18:11:01', 'admin', '2024-11-15 16:38:02', NULL, 3, 2, 10, 0);\nINSERT INTO `onl_drag_page` VALUES ('1016497921022545920', '监狱财政科数据展示', '/drag/page/view/1016497921022545920', '#1E0047', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/1背景_1731463744922.jpg', 100, 'dark', 'bigScreen', NULL, '{\\\"width\\\":1920,\\\"height\\\":1080}', '[{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":144,\\\"x\\\":27,\\\"h\\\":33,\\\"i\\\":\\\"bea2f336-12f8-4333-adb1-882c4a46f1ef\\\",\\\"y\\\":22,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136064339968\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":466,\\\"x\\\":730,\\\"h\\\":45,\\\"i\\\":\\\"es-drager-1731575388068-1\\\",\\\"y\\\":40,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136139837440\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":144,\\\"x\\\":46,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575453492-2\\\",\\\"y\\\":135,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136160808960\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":144,\\\"x\\\":1332,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575564662-3\\\",\\\"y\\\":132,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136177586176\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":177,\\\"x\\\":44,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575571643-4\\\",\\\"y\\\":630,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136190169088\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":195,\\\"x\\\":619,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575574764-5\\\",\\\"y\\\":628,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136206946304\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":144,\\\"x\\\":1338,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575579158-6\\\",\\\"y\\\":628,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136232112128\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":55,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575591936-7\\\",\\\"y\\\":185,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136248889344\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":298,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575650336-8\\\",\\\"y\\\":183,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136261472256\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":57,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575655752-9\\\",\\\"y\\\":259,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136274055168\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":151,\\\"x\\\":302,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575658548-10\\\",\\\"y\\\":259,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136295026688\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":1364,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575662995-11\\\",\\\"y\\\":192,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136311803904\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":1633,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575667327-12\\\",\\\"y\\\":192,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136328581120\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":1367,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575676489-13\\\",\\\"y\\\":259,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136336969728\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":1649,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575681208-14\\\",\\\"y\\\":263,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136353746944\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":807,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575699841-15\\\",\\\"y\\\":124,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136374718464\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":801,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575713035-16\\\",\\\"y\\\":202,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136395689984\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":1166,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575720590-17\\\",\\\"y\\\":122,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136412467200\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":1169,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575724256-18\\\",\\\"y\\\":205,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136429244416\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":637,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575741874-19\\\",\\\"y\\\":145,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136450215936\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":1008,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575790320-20\\\",\\\"y\\\":136,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136466993152\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":298,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576490851-23\\\",\\\"y\\\":218,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136487964672\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":56,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576557313-24\\\",\\\"y\\\":219,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136508936192\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":47,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576610256-25\\\",\\\"y\\\":290,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136525713408\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":288,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576613557-26\\\",\\\"y\\\":294,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136538296320\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":630,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576622559-27\\\",\\\"y\\\":195,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136555073536\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":179,\\\"x\\\":988,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576628027-28\\\",\\\"y\\\":196,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136563462144\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":1345,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576635331-29\\\",\\\"y\\\":225,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136580239360\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":1389,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576638739-30\\\",\\\"y\\\":294,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136592822272\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":1654,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576643262-31\\\",\\\"y\\\":225,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136605405184\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":1659,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576941854-33\\\",\\\"y\\\":296,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136622182400\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":803,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731577225841-34\\\",\\\"y\\\":150,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136638959616\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":782,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731577276117-35\\\",\\\"y\\\":231,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136655736832\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":1154,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731577281301-36\\\",\\\"y\\\":146,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136668319744\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":1149,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731577285085-37\\\",\\\"y\\\":231,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136685096960\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":84,\\\"x\\\":850,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731577430161-38\\\",\\\"y\\\":231,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136693485568\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":84,\\\"x\\\":1220,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731577464601-39\\\",\\\"y\\\":231,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136710262784\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JMultipleBar\\\",\\\"visible\\\":true,\\\"w\\\":543,\\\"x\\\":47,\\\"h\\\":257,\\\"i\\\":\\\"f5598f5b-7aee-4b4a-aa98-3703c9f471f4\\\",\\\"y\\\":335,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136727040000\\\",\\\"componentName\\\":\\\"对比柱形图\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JMultipleLine\\\",\\\"visible\\\":true,\\\"w\\\":682,\\\"x\\\":628,\\\"h\\\":309,\\\"i\\\":\\\"0811e80e-d0df-43d7-92c6-d7f0e0d62fd7\\\",\\\"y\\\":297,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136743817216\\\",\\\"componentName\\\":\\\"对比折线图\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JArea\\\",\\\"visible\\\":true,\\\"w\\\":530,\\\"x\\\":1358,\\\"h\\\":258,\\\"i\\\":\\\"aeafbc37-dcbc-4385-8d24-643fa4dc4fcd\\\",\\\"y\\\":328,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136756400128\\\",\\\"componentName\\\":\\\"面积图\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JScrollBoard\\\",\\\"visible\\\":true,\\\"w\\\":531,\\\"x\\\":49,\\\"h\\\":326,\\\"i\\\":\\\"12b2c94e-529a-4668-a2de-9b2021e93f56\\\",\\\"y\\\":678,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136764788736\\\",\\\"componentName\\\":\\\"轮播表\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JScrollBoard\\\",\\\"visible\\\":true,\\\"w\\\":671,\\\"x\\\":626,\\\"h\\\":338,\\\"i\\\":\\\"es-drager-1731579827097-40\\\",\\\"y\\\":675,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136777371648\\\",\\\"componentName\\\":\\\"轮播表\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JScrollBoard\\\",\\\"visible\\\":true,\\\"w\\\":531,\\\"x\\\":1342,\\\"h\\\":326,\\\"i\\\":\\\"es-drager-1731579847826-41\\\",\\\"y\\\":681,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1019836136794148864\\\",\\\"componentName\\\":\\\"轮播表\\\"}]', '', '0', '0', 'admin', '2024-11-13 10:06:40', 'admin', '2025-11-26 13:35:13', NULL, 1000, 2, 0, 0);\nINSERT INTO `onl_drag_page` VALUES ('1016994145836257280', '个性化组件大阅兵', '/drag/page/view/1016994145836257280', '#1E0047', '/img/bg/bg1.png', 100, 'dark', 'bigScreen', NULL, '{\\\"width\\\":1920,\\\"height\\\":2000}', '[{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":695,\\\"x\\\":606,\\\"h\\\":459,\\\"i\\\":\\\"es-drager-1731636172470-5\\\",\\\"y\\\":497,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681378529280\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":690,\\\"x\\\":610,\\\"h\\\":385,\\\"i\\\":\\\"es-drager-1731636518160-9\\\",\\\"y\\\":968,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681424666624\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":543,\\\"x\\\":41,\\\"h\\\":385,\\\"i\\\":\\\"es-drager-1731636444637-8\\\",\\\"y\\\":968,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681441443840\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":543,\\\"x\\\":1311,\\\"h\\\":455,\\\"i\\\":\\\"es-drager-1731636204058-6\\\",\\\"y\\\":501,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681454026752\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":688,\\\"x\\\":437,\\\"h\\\":385,\\\"i\\\":\\\"es-drager-1731635819511-1\\\",\\\"y\\\":96,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681470803968\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":350,\\\"x\\\":1512.5302491103203,\\\"h\\\":385,\\\"i\\\":\\\"es-drager-1731635884970-3\\\",\\\"y\\\":97.09964412811388,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681495969792\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":360,\\\"x\\\":1139.5302491103203,\\\"h\\\":385,\\\"i\\\":\\\"es-drager-1731635842921-2\\\",\\\"y\\\":93.09964412811388,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681512747008\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":588,\\\"x\\\":710,\\\"h\\\":71,\\\"i\\\":\\\"93d57e1f-efe0-41d8-a970-cca353e07913\\\",\\\"y\\\":5,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681525329920\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JFlashCloud\\\",\\\"visible\\\":true,\\\"w\\\":321,\\\"x\\\":77.53024911032026,\\\"h\\\":333,\\\"i\\\":\\\"60e1c0cf-8ed5-4069-8d45-4422daddd4fa\\\",\\\"y\\\":107.09964412811388,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681588244480\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JGender\\\",\\\"visible\\\":true,\\\"w\\\":341,\\\"x\\\":1147,\\\"h\\\":284,\\\"i\\\":\\\"b704fde0-b83b-43c9-812f-00669da4fd26\\\",\\\"y\\\":130,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681609216000\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JWeatherForecast\\\",\\\"visible\\\":true,\\\"w\\\":257,\\\"x\\\":1536.5302491103203,\\\"h\\\":47,\\\"i\\\":\\\"962e8a41-52bc-486b-8bac-a4d2bede7b60\\\",\\\"y\\\":239.09964412811385,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681621798912\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JNegativeBar\\\",\\\"visible\\\":true,\\\"w\\\":515,\\\"x\\\":63,\\\"h\\\":429,\\\"i\\\":\\\"6f636ad2-1e9a-43ae-aa23-79e4066a5f09\\\",\\\"y\\\":511,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681634381824\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JFlashList\\\",\\\"visible\\\":true,\\\"w\\\":498,\\\"x\\\":1353,\\\"h\\\":300,\\\"i\\\":\\\"70f4698c-332c-4278-aabe-fbfa06900b68\\\",\\\"y\\\":556,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681655353344\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JPictorialBar\\\",\\\"visible\\\":true,\\\"w\\\":516,\\\"x\\\":55,\\\"h\\\":334,\\\"i\\\":\\\"56271f7e-e085-4bdc-81da-1223af3d1ba2\\\",\\\"y\\\":996,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681676324864\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDevHistory\\\",\\\"visible\\\":true,\\\"w\\\":661,\\\"x\\\":620,\\\"h\\\":300,\\\"i\\\":\\\"21224e76-d6fe-4600-a16d-ae6e7f55bfbc\\\",\\\"y\\\":991,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681697296384\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JRotatePie\\\",\\\"visible\\\":true,\\\"w\\\":450,\\\"x\\\":1345,\\\"h\\\":300,\\\"i\\\":\\\"3b9b8918-5afa-4bb9-83a7-d8b6d87338e3\\\",\\\"y\\\":1012,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681714073600\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JColorBlock\\\",\\\"visible\\\":true,\\\"w\\\":1865,\\\"x\\\":23,\\\"h\\\":110,\\\"i\\\":\\\"d7661f3f-303c-4110-8128-32be407275a3\\\",\\\"y\\\":1389,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681726656512\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":350,\\\"x\\\":58.09964412811388,\\\"h\\\":385,\\\"i\\\":\\\"30152f09-985b-4d7f-82a7-1d78251f1c2a\\\",\\\"y\\\":91,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681743433728\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":545,\\\"x\\\":43,\\\"h\\\":468,\\\"i\\\":\\\"es-drager-1731635997743-4\\\",\\\"y\\\":492,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681764405248\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":541,\\\"x\\\":1311,\\\"h\\\":379,\\\"i\\\":\\\"es-drager-1731636613880-10\\\",\\\"y\\\":972,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681781182464\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JRectangle\\\",\\\"visible\\\":true,\\\"w\\\":662,\\\"x\\\":447,\\\"h\\\":364,\\\"i\\\":\\\"bbfdcef5-a32d-4d15-8f12-d7a4d5016e68\\\",\\\"y\\\":102,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681793765376\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JPyramid3D\\\",\\\"visible\\\":true,\\\"w\\\":678,\\\"x\\\":625,\\\"h\\\":438,\\\"i\\\":\\\"014b738b-9fc6-49ca-8d27-a029b89f2dc0\\\",\\\"y\\\":511,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681810542592\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":1878,\\\"x\\\":9,\\\"h\\\":130,\\\"i\\\":\\\"16e26ff8-0039-4ae7-a2c3-4b4a97e44e8b\\\",\\\"y\\\":1365,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017225681823125504\\\",\\\"selected\\\":false}]', '', '0', '1', 'admin', '2024-11-14 18:58:29', 'admin', '2024-11-15 10:18:32', NULL, 3, 2, 0, 0);\nINSERT INTO `onl_drag_page` VALUES ('1016994272231608320', '旅游数据分析中心大屏', '/drag/page/view/1016994272231608320', '#1E0047', '/img/bg/bg1.png', 100, 'dark', 'bigScreen', NULL, '{\\\"width\\\":1920,\\\"height\\\":1080}', '[{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":801,\\\"x\\\":550,\\\"h\\\":926,\\\"i\\\":\\\"es-drager-1731642710947-12\\\",\\\"y\\\":128,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1021960592459091968\\\",\\\"componentName\\\":\\\"边框1\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":488,\\\"x\\\":20,\\\"h\\\":926,\\\"i\\\":\\\"5427a7d4-3c10-425f-a059-ecadd99cf9e0\\\",\\\"y\\\":127,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1021960592501035008\\\",\\\"componentName\\\":\\\"边框1\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":507,\\\"x\\\":1398,\\\"h\\\":926,\\\"i\\\":\\\"es-drager-1731642738303-13\\\",\\\"y\\\":125,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1021960592526200832\\\",\\\"componentName\\\":\\\"边框1\\\"},{\\\"visible\\\":true,\\\"h\\\":88,\\\"i\\\":\\\"3ec5db86-1dc8-4fc1-84c0-e7db4e7934bd\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":636,\\\"x\\\":673,\\\"y\\\":13,\\\"pageCompId\\\":\\\"1021960592555560960\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"b992d9d0-a169-4750-8b85-043a6db79675\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"03c0a8d6-e38b-4b37-8158-d048079be048\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":139,\\\"x\\\":35,\\\"y\\\":139,\\\"pageCompId\\\":\\\"1021960592568143872\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"08550975-dab7-48f8-8323-f12b93b7d579\\\"},{\\\"visible\\\":true,\\\"h\\\":74,\\\"i\\\":\\\"a2f9a2bc-f6cc-4811-add1-aa48cd7d499e\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JImg\\\",\\\"w\\\":91,\\\"x\\\":93.53557015642195,\\\"y\\\":202.6610746089451,\\\"pageCompId\\\":\\\"1021960592584921088\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"233b45a6-858d-4486-9fb7-1c70503502c0\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731638452515-1\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":171,\\\"x\\\":47,\\\"y\\\":344,\\\"pageCompId\\\":\\\"1021960592601698304\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"03718e74-b30f-44e9-873d-75eacf011834\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731638457909-2\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":231,\\\"x\\\":44,\\\"y\\\":650,\\\"pageCompId\\\":\\\"1021960592622669824\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"9db0eb47-7974-4f3f-8c87-e761eba17b8d\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731638464024-3\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":200,\\\"x\\\":576,\\\"y\\\":136,\\\"pageCompId\\\":\\\"1021960592647835648\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"ddacdb15-4f7f-4417-91f5-e2195199ed2f\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731638496760-4\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":212,\\\"x\\\":1079,\\\"y\\\":140,\\\"pageCompId\\\":\\\"1021960592664612864\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"d064d0b9-1470-4d35-9fc4-c4b88efe63bd\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731638502084-5\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":267,\\\"x\\\":1427,\\\"y\\\":144,\\\"pageCompId\\\":\\\"1021960592681390080\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"d4a88ee7-5091-4b8b-80f4-395b5af94a13\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731638509763-6\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":205,\\\"x\\\":1409,\\\"y\\\":309,\\\"pageCompId\\\":\\\"1021960592706555904\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"f115414b-da0c-4606-9ecd-af9d464cd4a5\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731638514808-7\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":192,\\\"x\\\":1431,\\\"y\\\":678,\\\"pageCompId\\\":\\\"1021960592735916032\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"b91f0e67-d931-49ab-98ce-43bbdf1f6c97\\\"},{\\\"visible\\\":true,\\\"h\\\":100,\\\"i\\\":\\\"1f05d4e8-af8b-43b9-bb80-0a1e803c9407\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragDecoration\\\",\\\"w\\\":443,\\\"x\\\":23,\\\"y\\\":16,\\\"pageCompId\\\":\\\"1021960592765276160\\\",\\\"componentName\\\":\\\"装饰1\\\",\\\"key\\\":\\\"053b7c8f-4c72-4230-a5f7-5eb46acce4e0\\\"},{\\\"visible\\\":true,\\\"h\\\":47,\\\"i\\\":\\\"16f505ae-dcc8-4329-841f-6816ed0f79fa\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JWeatherForecast\\\",\\\"w\\\":257,\\\"x\\\":202,\\\"y\\\":184,\\\"pageCompId\\\":\\\"1021960592786247680\\\",\\\"componentName\\\":\\\"滚动版\\\",\\\"key\\\":\\\"bf67a1de-364e-416a-88ff-ad9db3df8f5f\\\"},{\\\"visible\\\":true,\\\"h\\\":33,\\\"i\\\":\\\"1eb7afb8-829c-4ba6-a539-0b76f843d185\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JCurrentTime\\\",\\\"w\\\":270,\\\"x\\\":183,\\\"y\\\":238,\\\"pageCompId\\\":\\\"1021960592807219200\\\",\\\"componentName\\\":\\\"当前时间\\\",\\\"key\\\":\\\"e7bf2eb6-d0d3-4427-851c-4b6f7620d152\\\"},{\\\"visible\\\":true,\\\"h\\\":47,\\\"i\\\":\\\"9c8ccf30-2db6-4f5b-9a47-358748ce0077\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragDecoration\\\",\\\"w\\\":383,\\\"x\\\":74,\\\"y\\\":291,\\\"pageCompId\\\":\\\"1021960592844967936\\\",\\\"componentName\\\":\\\"装饰1\\\",\\\"key\\\":\\\"9f5b9308-ee8f-4a10-8bf5-74de1bd272fa\\\"},{\\\"visible\\\":true,\\\"h\\\":300,\\\"i\\\":\\\"e1437091-ec46-455b-851a-1b2262c9b427\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JLine\\\",\\\"w\\\":488,\\\"x\\\":31,\\\"y\\\":699,\\\"pageCompId\\\":\\\"1021960592861745152\\\",\\\"componentName\\\":\\\"基础折线图\\\",\\\"key\\\":\\\"c371e000-99f4-43c6-b660-5cd19ec59887\\\"},{\\\"visible\\\":true,\\\"h\\\":41,\\\"i\\\":\\\"es-drager-1731638963126-8\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragDecoration\\\",\\\"w\\\":396,\\\"x\\\":55,\\\"y\\\":607,\\\"pageCompId\\\":\\\"1021960592878522368\\\",\\\"componentName\\\":\\\"装饰1\\\",\\\"key\\\":\\\"bf2601e8-d445-49a6-a52d-9738278d633f\\\"},{\\\"visible\\\":true,\\\"h\\\":245,\\\"i\\\":\\\"ae124c04-e6d8-443b-9ddb-cb99c21300ed\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JGender\\\",\\\"w\\\":317,\\\"x\\\":98,\\\"y\\\":393,\\\"pageCompId\\\":\\\"1021960592899493888\\\",\\\"componentName\\\":\\\"男女占比\\\",\\\"key\\\":\\\"02cb5192-9972-4517-b00e-1382685803d2\\\"},{\\\"visible\\\":true,\\\"h\\\":100,\\\"i\\\":\\\"da3036d0-e3b7-4a05-a229-0d05389e7370\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragDecoration\\\",\\\"w\\\":604,\\\"x\\\":1326,\\\"y\\\":10,\\\"pageCompId\\\":\\\"1021960592941436928\\\",\\\"componentName\\\":\\\"装饰1\\\",\\\"key\\\":\\\"1712efe4-3815-46e2-aae4-2d08183b3e36\\\"},{\\\"visible\\\":true,\\\"h\\\":142,\\\"i\\\":\\\"c4fbcf36-1a87-499b-b0cb-46a26a2c2f5b\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JCountTo\\\",\\\"w\\\":712,\\\"x\\\":582,\\\"y\\\":218,\\\"pageCompId\\\":\\\"1021960592958214144\\\",\\\"componentName\\\":\\\"翻牌器\\\",\\\"key\\\":\\\"e4805388-607c-48a1-8b04-7ad672938721\\\"},{\\\"visible\\\":true,\\\"h\\\":527,\\\"i\\\":\\\"edd9d638-3fee-4e3e-84b4-9599bdc25a00\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JBubbleMap\\\",\\\"w\\\":718,\\\"x\\\":585,\\\"y\\\":393,\\\"pageCompId\\\":\\\"1021960592991768576\\\",\\\"componentName\\\":\\\"散点地图\\\",\\\"key\\\":\\\"07e69455-5f45-4b5a-874b-db3adf6a800b\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":54,\\\"x\\\":1451,\\\"h\\\":51,\\\"i\\\":\\\"5d6a9f04-f23e-493c-8825-59b784cef860\\\",\\\"y\\\":192,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1021960593008545792\\\",\\\"componentName\\\":\\\"图片\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragDecoration\\\",\\\"visible\\\":true,\\\"w\\\":406,\\\"x\\\":1445,\\\"h\\\":47,\\\"i\\\":\\\"es-drager-1731641087446-9\\\",\\\"y\\\":247,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1021960593029517312\\\",\\\"componentName\\\":\\\"装饰1\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":134,\\\"x\\\":1524,\\\"h\\\":33,\\\"i\\\":\\\"3716ccfd-c753-400e-80ba-37d73732e967\\\",\\\"y\\\":199,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1021960593063071744\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":128,\\\"x\\\":1678,\\\"h\\\":45,\\\"i\\\":\\\"es-drager-1731641329682-10\\\",\\\"y\\\":189,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1021960593079848960\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JRing\\\",\\\"visible\\\":true,\\\"w\\\":436,\\\"x\\\":1446,\\\"h\\\":300,\\\"i\\\":\\\"1fc939b3-3b6b-4d09-9c4e-cd37292f7ac5\\\",\\\"y\\\":334,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1021960593096626176\\\",\\\"componentName\\\":\\\"饼状环形图\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragDecoration\\\",\\\"visible\\\":true,\\\"w\\\":421,\\\"x\\\":1435,\\\"h\\\":47,\\\"i\\\":\\\"es-drager-1731642551406-11\\\",\\\"y\\\":617,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1021960593121792000\\\",\\\"componentName\\\":\\\"装饰1\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JCapsuleChart\\\",\\\"visible\\\":true,\\\"w\\\":450,\\\"x\\\":1427,\\\"h\\\":300,\\\"i\\\":\\\"37fa8779-2081-4f35-83ef-797ff9ddcce0\\\",\\\"y\\\":728,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1021960593138569216\\\",\\\"componentName\\\":\\\"胶囊图\\\"}]', '', '0', '1', 'admin', '2024-11-14 18:59:00', 'admin', '2024-11-28 11:53:23', NULL, 3, 2, 0, 0);\nINSERT INTO `onl_drag_page` VALUES ('1016994412900175872', '收视监控平台', '/drag/page/view/1016994412900175872', '#1E0047', '/img/bg/bg18.jpg', 100, 'dark', 'bigScreen', NULL, '{\\\"width\\\":1920,\\\"height\\\":2000}', '[{\\\"visible\\\":true,\\\"h\\\":52,\\\"i\\\":\\\"ae56fe51-65d1-4866-9789-f9229289964f\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":376,\\\"x\\\":779,\\\"y\\\":27,\\\"pageCompId\\\":\\\"1017286463101390848\\\",\\\"selected\\\":false,\\\"key\\\":\\\"33c6ecba-c0f5-46f2-9323-aab43e87eb63\\\"},{\\\"visible\\\":true,\\\"h\\\":45,\\\"i\\\":\\\"8ce1a978-3664-41d4-8d80-1b8f81deee0a\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":382,\\\"x\\\":774,\\\"y\\\":107,\\\"pageCompId\\\":\\\"1017286463134945280\\\",\\\"selected\\\":false,\\\"key\\\":\\\"936bc496-c82b-46b1-bc19-a9ee91929452\\\"},{\\\"visible\\\":true,\\\"h\\\":78,\\\"i\\\":\\\"04048a06-cefb-4dcd-ac0c-004da0229a9e\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragDecoration\\\",\\\"w\\\":403,\\\"x\\\":10,\\\"y\\\":52,\\\"pageCompId\\\":\\\"1017286463160111104\\\",\\\"selected\\\":false,\\\"key\\\":\\\"6cc237a4-89ad-4718-83c4-feb0b9a14ef9\\\"},{\\\"visible\\\":true,\\\"h\\\":33,\\\"i\\\":\\\"f69ec49c-ff6d-40f6-bcff-06a2d6742751\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JCurrentTime\\\",\\\"w\\\":270,\\\"x\\\":1629,\\\"y\\\":20,\\\"pageCompId\\\":\\\"1017286463176888320\\\",\\\"selected\\\":false,\\\"key\\\":\\\"1ac1bf52-506c-4d5b-95da-52f907854017\\\"},{\\\"visible\\\":true,\\\"h\\\":61,\\\"i\\\":\\\"5094172c-0de1-4f5d-84d8-fff43811bba5\\\",\\\"orderNum\\\":300,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JImg\\\",\\\"w\\\":93,\\\"x\\\":1558,\\\"y\\\":10,\\\"pageCompId\\\":\\\"1017286463185276928\\\",\\\"selected\\\":false,\\\"key\\\":\\\"dd9f7e52-86bc-4fcb-8bb2-bbd62e1a7546\\\"},{\\\"visible\\\":true,\\\"h\\\":59,\\\"i\\\":\\\"3d154544-9fab-4177-8fa8-dce02ccf8b5e\\\",\\\"orderNum\\\":300,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JWeatherForecast\\\",\\\"w\\\":267,\\\"x\\\":1635,\\\"y\\\":59,\\\"pageCompId\\\":\\\"1017286463202054144\\\",\\\"selected\\\":false,\\\"key\\\":\\\"375983aa-1c1b-4cd0-8d68-a67e55588edc\\\"},{\\\"visible\\\":true,\\\"h\\\":441,\\\"i\\\":\\\"9fe7eb28-0157-48ca-8535-34760368e2d7\\\",\\\"orderNum\\\":300,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"w\\\":599,\\\"x\\\":79,\\\"y\\\":190,\\\"pageCompId\\\":\\\"1017286463223025664\\\",\\\"selected\\\":false,\\\"key\\\":\\\"51cc5aff-ade9-40ef-9a31-891cc4779213\\\"},{\\\"visible\\\":true,\\\"h\\\":445,\\\"i\\\":\\\"es-drager-1731648824951-1\\\",\\\"orderNum\\\":300,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"w\\\":582,\\\"x\\\":699,\\\"y\\\":189,\\\"pageCompId\\\":\\\"1017286463235608576\\\",\\\"selected\\\":false,\\\"key\\\":\\\"8c08e246-f373-45e7-84cb-896b3c19c248\\\"},{\\\"visible\\\":true,\\\"h\\\":450,\\\"i\\\":\\\"es-drager-1731648851843-2\\\",\\\"orderNum\\\":300,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"w\\\":589,\\\"x\\\":1297,\\\"y\\\":187,\\\"pageCompId\\\":\\\"1017286463248191488\\\",\\\"selected\\\":false,\\\"key\\\":\\\"71fe25a3-4299-42c7-8a96-2415747940c9\\\"},{\\\"visible\\\":true,\\\"h\\\":405,\\\"i\\\":\\\"22aae23c-029e-456e-a1ac-0936cbfa6b6b\\\",\\\"orderNum\\\":300,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JVideoJs\\\",\\\"w\\\":568,\\\"x\\\":93,\\\"y\\\":207,\\\"pageCompId\\\":\\\"1017286463260774400\\\",\\\"selected\\\":false,\\\"key\\\":\\\"41da84ee-4ced-4414-af4c-acbf4cf2232c\\\"},{\\\"visible\\\":true,\\\"h\\\":416,\\\"i\\\":\\\"9d1f25e6-5446-4f78-90c6-7f9bd674b058\\\",\\\"orderNum\\\":300,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JVideoJs\\\",\\\"w\\\":560,\\\"x\\\":707,\\\"y\\\":201,\\\"pageCompId\\\":\\\"1017286463281745920\\\",\\\"selected\\\":false,\\\"key\\\":\\\"864aa918-532c-4407-9bb0-2e2041ae53f7\\\"},{\\\"visible\\\":true,\\\"h\\\":433,\\\"i\\\":\\\"85841a8f-e6cd-479a-9ba8-c36497b4e912\\\",\\\"orderNum\\\":300,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JVideoJs\\\",\\\"w\\\":570,\\\"x\\\":1306,\\\"y\\\":194,\\\"pageCompId\\\":\\\"1017286463294328832\\\",\\\"selected\\\":false,\\\"key\\\":\\\"8f12407a-94af-46c1-bd13-1e28fcbfaee0\\\"},{\\\"visible\\\":true,\\\"h\\\":56,\\\"i\\\":\\\"b0c4361a-0dfb-4575-88cb-edb593d4e120\\\",\\\"orderNum\\\":300,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":262,\\\"x\\\":81,\\\"y\\\":666,\\\"pageCompId\\\":\\\"1017286463311106048\\\",\\\"selected\\\":false,\\\"key\\\":\\\"245b1381-54f5-40fd-9475-e34e41587f37\\\"},{\\\"visible\\\":true,\\\"h\\\":417,\\\"i\\\":\\\"3ca04b91-c734-42b9-8eea-93dad3b04a7e\\\",\\\"orderNum\\\":300,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"w\\\":1790,\\\"x\\\":70,\\\"y\\\":747,\\\"pageCompId\\\":\\\"1017286463319494656\\\",\\\"selected\\\":false,\\\"key\\\":\\\"5627d105-4546-4692-abcd-42f2e61c3e45\\\"},{\\\"visible\\\":true,\\\"h\\\":335,\\\"i\\\":\\\"236cba9d-2c70-407e-8013-ee37e3d5d124\\\",\\\"orderNum\\\":300,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JMultipleLine\\\",\\\"w\\\":485,\\\"x\\\":109,\\\"y\\\":797,\\\"pageCompId\\\":\\\"1017286463332077568\\\",\\\"selected\\\":false,\\\"key\\\":\\\"644ef67f-0b41-4cb5-8cc5-1cac198d745f\\\"},{\\\"visible\\\":true,\\\"h\\\":335,\\\"i\\\":\\\"es-drager-1731649759290-3\\\",\\\"orderNum\\\":300,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JMultipleLine\\\",\\\"w\\\":485,\\\"x\\\":704,\\\"y\\\":797,\\\"pageCompId\\\":\\\"1017286463357243392\\\",\\\"selected\\\":false,\\\"key\\\":\\\"f92fba2e-d9c4-4e38-901d-d947f542e17b\\\"},{\\\"visible\\\":true,\\\"h\\\":335,\\\"i\\\":\\\"es-drager-1731649765690-4\\\",\\\"orderNum\\\":300,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JMultipleLine\\\",\\\"w\\\":485,\\\"x\\\":1292,\\\"y\\\":793,\\\"pageCompId\\\":\\\"1017286463369826304\\\",\\\"selected\\\":false,\\\"key\\\":\\\"3c1ab904-3923-4a51-80c5-d355c8516333\\\"},{\\\"visible\\\":true,\\\"h\\\":80,\\\"i\\\":\\\"3f014db1-34fe-41b7-bdff-ab4a23a7d6f6\\\",\\\"orderNum\\\":108,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JSelectRadio\\\",\\\"w\\\":400,\\\"x\\\":62,\\\"y\\\":7,\\\"pageCompId\\\":\\\"1017286463382409216\\\",\\\"selected\\\":false,\\\"key\\\":\\\"1fef29d3-cad8-4248-84d3-a778f7f1b389\\\"},{\\\"visible\\\":false,\\\"h\\\":351,\\\"i\\\":\\\"26735d51-f628-4ec6-8886-0ede0a7443af\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JVideoPlay\\\",\\\"w\\\":516,\\\"x\\\":121,\\\"y\\\":236,\\\"pageCompId\\\":\\\"1017286463394992128\\\",\\\"selected\\\":false,\\\"key\\\":\\\"861f9c1d-d8dc-418a-a8c6-19f9c8d3a7e1\\\"},{\\\"visible\\\":false,\\\"h\\\":361,\\\"i\\\":\\\"es-drager-1731650783569-1\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JVideoPlay\\\",\\\"w\\\":518,\\\"x\\\":730,\\\"y\\\":226,\\\"pageCompId\\\":\\\"1017286463411769344\\\",\\\"selected\\\":false,\\\"key\\\":\\\"9daa119e-566a-4c34-8643-49334e77701c\\\"},{\\\"visible\\\":false,\\\"h\\\":378,\\\"i\\\":\\\"es-drager-1731650792607-2\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JVideoPlay\\\",\\\"w\\\":521,\\\"x\\\":1329,\\\"y\\\":222,\\\"pageCompId\\\":\\\"1017286463436935168\\\",\\\"selected\\\":false,\\\"key\\\":\\\"75211ac2-b0de-45bf-87ae-f84c8a712368\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JBubble\\\",\\\"visible\\\":false,\\\"w\\\":851,\\\"x\\\":106,\\\"h\\\":360,\\\"i\\\":\\\"3acfc295-ea6d-4e16-83fd-bfd8d9022d8d\\\",\\\"y\\\":784,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1017286463449518080\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":false,\\\"w\\\":268,\\\"x\\\":1037,\\\"h\\\":63,\\\"i\\\":\\\"f499c09e-61cc-40f1-8496-d57d2f98f82c\\\",\\\"y\\\":752,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1017286463462100992\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JRing\\\",\\\"visible\\\":false,\\\"w\\\":666,\\\"x\\\":944,\\\"h\\\":385,\\\"i\\\":\\\"a82c61b6-4287-422a-b8e7-1cb34d17859a\\\",\\\"y\\\":794,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1017286463478878208\\\",\\\"selected\\\":false}]', '', '0', '1', 'admin', '2024-11-14 18:59:33', 'admin', '2024-11-15 14:20:03', NULL, 3, 2, 0, 0);\nINSERT INTO `onl_drag_page` VALUES ('1060068114432577536', '医美行业网络关注度', '/drag/page/view/1060068114432577536', NULL, '', 30, 'default', 'default', NULL, NULL, '[{\\\"pcX\\\":0,\\\"pcW\\\":24,\\\"moved\\\":false,\\\"pcY\\\":0,\\\"h\\\":8,\\\"i\\\":\\\"95729a29-9b15-4102-8ca0-4474bcdfd6ea\\\",\\\"orderNum\\\":0,\\\"mobileY\\\":0,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":0,\\\"pageCompId\\\":\\\"1060097027263221760\\\",\\\"key\\\":\\\"9ae1b314-88e0-433d-985f-7d492c0f1c6c\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":78,\\\"h\\\":6,\\\"i\\\":\\\"89ac8d65-5a17-4c62-83cc-05f29f629734\\\",\\\"orderNum\\\":13,\\\"mobileY\\\":43,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":43,\\\"pageCompId\\\":\\\"1060097027275804672\\\",\\\"key\\\":\\\"8f9eac53-d1e3-422f-8b7f-7ab4a451effb\\\"},{\\\"pcX\\\":16,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":77,\\\"h\\\":6,\\\"i\\\":\\\"f5f244fb-deed-48eb-8ada-78dadbe08bd8\\\",\\\"orderNum\\\":21,\\\"mobileY\\\":79,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":79,\\\"pageCompId\\\":\\\"1060097027288387584\\\",\\\"key\\\":\\\"5a0519bf-a79f-4160-b287-ab62629eb9ac\\\"},{\\\"pcX\\\":8,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":78,\\\"h\\\":6,\\\"i\\\":\\\"de17aaaf-b81c-48b3-8309-854b1d0b3d14\\\",\\\"orderNum\\\":20,\\\"mobileY\\\":184,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":184,\\\"pageCompId\\\":\\\"1060097027300970496\\\",\\\"key\\\":\\\"5f9de8c9-5dd0-4bed-9b47-ef2b576f28e7\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"6979473b-9eb1-4d90-887c-483378b89886\\\",\\\"orderNum\\\":20,\\\"mobileY\\\":8,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":8,\\\"pageCompId\\\":\\\"1060097027309359104\\\",\\\"key\\\":\\\"98452364-6f51-4cff-9414-e72cea2b48d2\\\"},{\\\"pcX\\\":8,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"fabcd19e-73a2-4a44-9035-d18bccfa77ba\\\",\\\"orderNum\\\":25,\\\"mobileY\\\":149,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":149,\\\"pageCompId\\\":\\\"1060097027321942016\\\",\\\"key\\\":\\\"c941de1d-f16f-4674-8995-0702ae12d431\\\"},{\\\"pcX\\\":16,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"e5eb46cd-4d1a-447e-b42a-6e390fa7080e\\\",\\\"orderNum\\\":25,\\\"mobileY\\\":114,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":114,\\\"pageCompId\\\":\\\"1060097027334524928\\\",\\\"key\\\":\\\"d27f9779-ea26-4b2a-abba-a1e91cef8221\\\"},{\\\"pcX\\\":8,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":30,\\\"i\\\":\\\"f42ce4f9-0e56-47da-8220-254436afea6d\\\",\\\"orderNum\\\":25,\\\"mobileY\\\":154,\\\"mobileX\\\":0,\\\"component\\\":\\\"JSmoothLine\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":154,\\\"pageCompId\\\":\\\"1060097027347107840\\\",\\\"key\\\":\\\"5817d28c-8684-433a-9a09-89328f379c2b\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":43,\\\"h\\\":5,\\\"i\\\":\\\"102fa102-3bd7-4e86-83ea-77cc7ef23651\\\",\\\"orderNum\\\":44,\\\"mobileY\\\":219,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":219,\\\"pageCompId\\\":\\\"1060097027359690752\\\",\\\"key\\\":\\\"fd873bf0-1a7f-4f66-ac2a-615c00491700\\\"},{\\\"pcX\\\":16,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":48,\\\"h\\\":30,\\\"i\\\":\\\"6841deb3-d062-42d8-8a2b-b58f6da64159\\\",\\\"orderNum\\\":49,\\\"mobileY\\\":293,\\\"mobileX\\\":0,\\\"component\\\":\\\"JMultipleBar\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":286,\\\"pageCompId\\\":\\\"1060097027372273664\\\",\\\"key\\\":\\\"6dd95954-ce51-4957-b62f-b61420a8ad8e\\\"},{\\\"pcX\\\":8,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":43,\\\"h\\\":5,\\\"i\\\":\\\"201a48c1-924c-4da0-87e5-9dc0eb2579a9\\\",\\\"orderNum\\\":69,\\\"mobileY\\\":253,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":253,\\\"pageCompId\\\":\\\"1060097027380662272\\\",\\\"key\\\":\\\"2f3d3af4-a5a6-4764-8548-b8cc8b0030a2\\\"},{\\\"pcX\\\":16,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":43,\\\"h\\\":5,\\\"i\\\":\\\"7e2ecc0a-7930-4c76-9c9a-76af22a58f59\\\",\\\"orderNum\\\":78,\\\"mobileY\\\":288,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":281,\\\"pageCompId\\\":\\\"1060097027389050880\\\",\\\"key\\\":\\\"b4e7c69b-2853-403a-85c7-c1cdf9fec082\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":30,\\\"i\\\":\\\"88e40b11-fc48-4d59-8ba8-5d106f3dfa2b\\\",\\\"orderNum\\\":53,\\\"mobileY\\\":13,\\\"mobileX\\\":0,\\\"component\\\":\\\"JMixLineBar\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":13,\\\"pageCompId\\\":\\\"1060097027401633792\\\",\\\"key\\\":\\\"b761af88-7505-404a-998f-dfa7d2a14367\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":48,\\\"h\\\":30,\\\"i\\\":\\\"000017d9-054b-492f-9327-537c64b25f0f\\\",\\\"orderNum\\\":54,\\\"mobileY\\\":49,\\\"mobileX\\\":0,\\\"component\\\":\\\"JDynamicBar\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":49,\\\"pageCompId\\\":\\\"1060097027414216704\\\",\\\"key\\\":\\\"7ea7c14c-e71c-41d9-ad5d-4ee8c8de4aa7\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":84,\\\"h\\\":29,\\\"i\\\":\\\"0331fad4-d098-4aa4-84e1-0583a0ed828f\\\",\\\"orderNum\\\":80,\\\"mobileY\\\":224,\\\"mobileX\\\":0,\\\"component\\\":\\\"JDynamicBar\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":224,\\\"pageCompId\\\":\\\"1060097027430993920\\\",\\\"key\\\":\\\"447a9788-884d-4f95-a5a9-fe7130078ef8\\\"},{\\\"pcX\\\":8,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":48,\\\"h\\\":23,\\\"i\\\":\\\"f36d52f6-942b-438b-881a-2fd02ebfd7f0\\\",\\\"orderNum\\\":109,\\\"mobileY\\\":258,\\\"mobileX\\\":0,\\\"component\\\":\\\"JRing\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":258,\\\"pageCompId\\\":\\\"1060097027443576832\\\",\\\"key\\\":\\\"5e2cd922-9a7b-4706-a1ae-66635c985aaa\\\"},{\\\"pcX\\\":8,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":84,\\\"h\\\":29,\\\"i\\\":\\\"7c994b82-cde8-41a2-9192-21f8c92085b9\\\",\\\"orderNum\\\":109,\\\"mobileY\\\":190,\\\"mobileX\\\":0,\\\"component\\\":\\\"JCommonTable\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":190,\\\"pageCompId\\\":\\\"1060097027451965440\\\",\\\"key\\\":\\\"62e6b38a-f2fe-4e30-8a76-b5fe5404c665\\\"},{\\\"pcX\\\":16,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":83,\\\"h\\\":29,\\\"i\\\":\\\"7759c7d3-2ea1-4f89-9c49-9866e9d6cc77\\\",\\\"orderNum\\\":113,\\\"mobileY\\\":85,\\\"mobileX\\\":0,\\\"component\\\":\\\"JRing\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":85,\\\"pageCompId\\\":\\\"1060097027460354048\\\",\\\"key\\\":\\\"23b4812c-a369-43df-8f70-526a8e347842\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":12,\\\"moved\\\":false,\\\"pcY\\\":113,\\\"h\\\":30,\\\"i\\\":\\\"77b4c245-5240-4e96-8275-acdc5648c65b\\\",\\\"orderNum\\\":113,\\\"mobileY\\\":119,\\\"mobileX\\\":0,\\\"component\\\":\\\"JFunnel\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":119,\\\"pageCompId\\\":\\\"1060097027472936960\\\",\\\"key\\\":\\\"2c9e4290-51dd-4603-937e-4bb9ef72b04b\\\"}]', '', '988299668956545024', '1', 'admin', '2025-03-13 19:39:04', 'admin', '2025-03-13 17:34:10', '', 3, 74, 0, 0);\nINSERT INTO `onl_drag_page` VALUES ('1060100026798755840', '示例_首页', '/drag/page/view/1060100026798755840', NULL, '', 30, 'default', 'default', NULL, NULL, '[{\\\"pcX\\\":0,\\\"pcW\\\":13,\\\"moved\\\":false,\\\"pcY\\\":19,\\\"h\\\":25,\\\"i\\\":\\\"a80f65fe-cdc3-4fbe-a383-c526eda9886e\\\",\\\"mobileY\\\":0,\\\"mobileX\\\":0,\\\"component\\\":\\\"JQuickNav\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":0,\\\"pageCompId\\\":\\\"1064102585364434944\\\",\\\"key\\\":\\\"ebb10884-4571-4a62-976e-0de8d515d8bb\\\"},{\\\"pcX\\\":13,\\\"pcW\\\":11,\\\"moved\\\":false,\\\"pcY\\\":39,\\\"h\\\":51,\\\"i\\\":\\\"4d7f78a3-6520-45ae-85e4-ac0cfca514b3\\\",\\\"mobileY\\\":28,\\\"mobileX\\\":0,\\\"component\\\":\\\"JList\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":25,\\\"pageCompId\\\":\\\"1064102585402183680\\\",\\\"key\\\":\\\"8c0dfa3a-91a6-4429-8f29-80a225f6c862\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":24,\\\"moved\\\":false,\\\"pcY\\\":0,\\\"h\\\":36,\\\"i\\\":\\\"1aab1f6b-316e-4046-9ec0-d68d35fa6142\\\",\\\"mobileY\\\":72,\\\"mobileX\\\":0,\\\"component\\\":\\\"JGrowCard\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":76,\\\"pageCompId\\\":\\\"1064102585435738112\\\",\\\"key\\\":\\\"ad8ecb70-a148-425d-8c0e-66a500da3f6b\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":13,\\\"moved\\\":false,\\\"pcY\\\":47,\\\"h\\\":88,\\\"i\\\":\\\"ab1fcd58-e150-4816-b06a-5d2a62517510\\\",\\\"mobileY\\\":108,\\\"mobileX\\\":0,\\\"component\\\":\\\"JProjectCard\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":112,\\\"pageCompId\\\":\\\"1064102585456709632\\\",\\\"key\\\":\\\"dba2cb08-ac72-471d-b2d0-57b005d4abe1\\\"},{\\\"pcX\\\":13,\\\"pcW\\\":11,\\\"moved\\\":false,\\\"pcY\\\":19,\\\"h\\\":33,\\\"i\\\":\\\"e5a73961-e1ba-462c-bf86-78fbb94390d4\\\",\\\"mobileY\\\":144,\\\"mobileX\\\":0,\\\"component\\\":\\\"JWaitMatter\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":200,\\\"pageCompId\\\":\\\"1064102585507041280\\\",\\\"key\\\":\\\"a289d618-3c4c-4739-b922-1d2da94f616c\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":24,\\\"moved\\\":false,\\\"pcY\\\":83,\\\"h\\\":41,\\\"i\\\":\\\"b1786985-070f-4f7b-8c46-b61c0ac9b8c7\\\",\\\"mobileY\\\":164,\\\"mobileX\\\":0,\\\"component\\\":\\\"JLine\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":233,\\\"pageCompId\\\":\\\"1064102585540595712\\\",\\\"key\\\":\\\"67ef02cb-e6af-4864-8c35-f389caee9c0c\\\"}]', '', '988299668956545024', '1', 'admin', '2025-03-13 14:50:52', 'admin', '2025-03-24 18:50:42', '', 3, 2, 0, 0);\nINSERT INTO `onl_drag_page` VALUES ('1060100061204631552', '示例_查询_联动', '/drag/page/view/1060100061204631552', NULL, '', 30, 'default', 'default', NULL, NULL, '[{\\\"pcX\\\":0,\\\"pcW\\\":24,\\\"moved\\\":false,\\\"pcY\\\":0,\\\"h\\\":12,\\\"i\\\":\\\"d83aab3e-fb0e-4f5a-8c04-3b870e7d0cdd\\\",\\\"component\\\":\\\"JForm\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":0,\\\"pageCompId\\\":\\\"1060115766792736768\\\",\\\"key\\\":\\\"39f4e3eb-0e45-413a-bbef-83a5f594bf25\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":12,\\\"moved\\\":false,\\\"pcY\\\":12,\\\"h\\\":42,\\\"i\\\":\\\"79f3e507-d7ab-4cd5-9402-ca5b41086a73\\\",\\\"component\\\":\\\"JBar\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":12,\\\"pageCompId\\\":\\\"1060115766822096896\\\",\\\"key\\\":\\\"e0f6561e-74e6-45a7-8284-696328eee8da\\\"},{\\\"pcX\\\":12,\\\"pcW\\\":12,\\\"moved\\\":false,\\\"pcY\\\":12,\\\"h\\\":42,\\\"i\\\":\\\"95f190fb-69cc-4dc7-8f4c-b9f33460ad60\\\",\\\"component\\\":\\\"JPie\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":54,\\\"pageCompId\\\":\\\"1060115766830485504\\\",\\\"key\\\":\\\"0e404bb9-92e5-494e-82d3-c76b5cd285c7\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":12,\\\"moved\\\":false,\\\"pcY\\\":54,\\\"h\\\":35,\\\"i\\\":\\\"a7de05b4-3eab-40ce-bb95-39d650ea3c1b\\\",\\\"component\\\":\\\"JLine\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":96,\\\"pageCompId\\\":\\\"1060115766843068416\\\",\\\"key\\\":\\\"ca51edd4-c226-499e-8c7e-98d8cf08db65\\\"},{\\\"pcX\\\":12,\\\"pcW\\\":12,\\\"moved\\\":false,\\\"pcY\\\":54,\\\"h\\\":16,\\\"i\\\":\\\"9e46a297-752b-40bc-95c7-d28f87ce7cd5\\\",\\\"component\\\":\\\"JProgress\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":131,\\\"pageCompId\\\":\\\"1060115766855651328\\\",\\\"key\\\":\\\"3c4aa0ba-9473-4426-9aa5-7515b9c15fd0\\\"}]', '', '988299668956545024', '1', 'admin', '2025-03-13 14:46:01', 'admin', '2025-03-13 18:48:51', '', 3, 2, 0, 0);\nINSERT INTO `onl_drag_page` VALUES ('1067415011364732928', '旅游数据分析中心大屏副本8140', '/drag/page/view/1067415011364732928', '#1E0047', '/img/bg/bg1.png', 100, 'dark', 'bigScreen', NULL, '{\\\"width\\\":1920,\\\"height\\\":1080,\\\"waterMark\\\":{\\\"show\\\":false,\\\"content\\\":\\\"\\\",\\\"fontSize\\\":12,\\\"color\\\":\\\"#ffffff\\\",\\\"angle\\\":45},\\\"sysDefColor\\\":[{\\\"color\\\":\\\"#1e90ff\\\",\\\"color1\\\":\\\"#1e90ff\\\"},{\\\"color\\\":\\\"#90ee90\\\",\\\"color1\\\":\\\"#90ee90\\\"},{\\\"color\\\":\\\"#00ced1\\\",\\\"color1\\\":\\\"#00ced1\\\"},{\\\"color\\\":\\\"#e2bd84\\\",\\\"color1\\\":\\\"#e2bd84\\\"},{\\\"color\\\":\\\"#7a90e0\\\",\\\"color1\\\":\\\"#7a90e0\\\"},{\\\"color\\\":\\\"#3ba272\\\",\\\"color1\\\":\\\"#3ba272\\\"},{\\\"color\\\":\\\"#2be7ff\\\",\\\"color1\\\":\\\"#2be7ff\\\"},{\\\"color\\\":\\\"#0a8ada\\\",\\\"color1\\\":\\\"#0a8ada\\\"},{\\\"color\\\":\\\"#ffd700\\\",\\\"color1\\\":\\\"#ffd700\\\"}]}', '[{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JCapsuleChart\\\",\\\"visible\\\":true,\\\"w\\\":450,\\\"x\\\":1427,\\\"h\\\":300,\\\"i\\\":\\\"37fa8779-2081-4f35-83ef-797ff9ddcce0\\\",\\\"y\\\":728,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1084354835912884224\\\",\\\"componentName\\\":\\\"胶囊图\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragDecoration\\\",\\\"visible\\\":true,\\\"w\\\":421,\\\"x\\\":1435,\\\"h\\\":47,\\\"i\\\":\\\"es-drager-1731642551406-11\\\",\\\"y\\\":617,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1084354835984187392\\\",\\\"componentName\\\":\\\"装饰1\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JRing\\\",\\\"visible\\\":true,\\\"w\\\":436,\\\"x\\\":1446,\\\"h\\\":300,\\\"i\\\":\\\"1fc939b3-3b6b-4d09-9c4e-cd37292f7ac5\\\",\\\"y\\\":334,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1084354835996770304\\\",\\\"componentName\\\":\\\"饼状环形图\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":128,\\\"x\\\":1678,\\\"h\\\":45,\\\"i\\\":\\\"es-drager-1731641329682-10\\\",\\\"y\\\":189,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1084354836005158912\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":134,\\\"x\\\":1524,\\\"h\\\":33,\\\"i\\\":\\\"3716ccfd-c753-400e-80ba-37d73732e967\\\",\\\"y\\\":199,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1084354836021936128\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragDecoration\\\",\\\"visible\\\":true,\\\"w\\\":406,\\\"x\\\":1445,\\\"h\\\":47,\\\"i\\\":\\\"es-drager-1731641087446-9\\\",\\\"y\\\":247,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1084354836038713344\\\",\\\"componentName\\\":\\\"装饰1\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":54,\\\"x\\\":1451,\\\"h\\\":51,\\\"i\\\":\\\"5d6a9f04-f23e-493c-8825-59b784cef860\\\",\\\"y\\\":192,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1084354836055490560\\\",\\\"componentName\\\":\\\"图片\\\"},{\\\"visible\\\":true,\\\"h\\\":527,\\\"i\\\":\\\"edd9d638-3fee-4e3e-84b4-9599bdc25a00\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JBubbleMap\\\",\\\"w\\\":718,\\\"x\\\":585,\\\"y\\\":393,\\\"pageCompId\\\":\\\"1084354836063879168\\\",\\\"componentName\\\":\\\"散点地图\\\",\\\"key\\\":\\\"07e69455-5f45-4b5a-874b-db3adf6a800b\\\"},{\\\"visible\\\":true,\\\"h\\\":142,\\\"i\\\":\\\"c4fbcf36-1a87-499b-b0cb-46a26a2c2f5b\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JCountTo\\\",\\\"w\\\":712,\\\"x\\\":582,\\\"y\\\":218,\\\"pageCompId\\\":\\\"1084354836072267776\\\",\\\"componentName\\\":\\\"翻牌器\\\",\\\"key\\\":\\\"e4805388-607c-48a1-8b04-7ad672938721\\\"},{\\\"visible\\\":true,\\\"h\\\":100,\\\"i\\\":\\\"da3036d0-e3b7-4a05-a229-0d05389e7370\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragDecoration\\\",\\\"w\\\":604,\\\"x\\\":1326,\\\"y\\\":10,\\\"pageCompId\\\":\\\"1084354836080656384\\\",\\\"componentName\\\":\\\"装饰1\\\",\\\"key\\\":\\\"1712efe4-3815-46e2-aae4-2d08183b3e36\\\"},{\\\"visible\\\":true,\\\"h\\\":245,\\\"i\\\":\\\"ae124c04-e6d8-443b-9ddb-cb99c21300ed\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JGender\\\",\\\"w\\\":317,\\\"x\\\":98,\\\"y\\\":393,\\\"pageCompId\\\":\\\"1084354836084850688\\\",\\\"componentName\\\":\\\"男女占比\\\",\\\"key\\\":\\\"02cb5192-9972-4517-b00e-1382685803d2\\\"},{\\\"visible\\\":true,\\\"h\\\":41,\\\"i\\\":\\\"es-drager-1731638963126-8\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragDecoration\\\",\\\"w\\\":396,\\\"x\\\":55,\\\"y\\\":607,\\\"pageCompId\\\":\\\"1084354836093239296\\\",\\\"componentName\\\":\\\"装饰1\\\",\\\"key\\\":\\\"bf2601e8-d445-49a6-a52d-9738278d633f\\\"},{\\\"visible\\\":true,\\\"h\\\":300,\\\"i\\\":\\\"e1437091-ec46-455b-851a-1b2262c9b427\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JLine\\\",\\\"w\\\":488,\\\"x\\\":31,\\\"y\\\":699,\\\"pageCompId\\\":\\\"1084354836105822208\\\",\\\"componentName\\\":\\\"基础折线图\\\",\\\"key\\\":\\\"c371e000-99f4-43c6-b660-5cd19ec59887\\\"},{\\\"visible\\\":true,\\\"h\\\":47,\\\"i\\\":\\\"9c8ccf30-2db6-4f5b-9a47-358748ce0077\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragDecoration\\\",\\\"w\\\":383,\\\"x\\\":74,\\\"y\\\":291,\\\"pageCompId\\\":\\\"1084354836118405120\\\",\\\"componentName\\\":\\\"装饰1\\\",\\\"key\\\":\\\"9f5b9308-ee8f-4a10-8bf5-74de1bd272fa\\\"},{\\\"visible\\\":true,\\\"h\\\":33,\\\"i\\\":\\\"1eb7afb8-829c-4ba6-a539-0b76f843d185\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JCurrentTime\\\",\\\"w\\\":270,\\\"x\\\":183,\\\"y\\\":238,\\\"pageCompId\\\":\\\"1084354836126793728\\\",\\\"componentName\\\":\\\"当前时间\\\",\\\"key\\\":\\\"e7bf2eb6-d0d3-4427-851c-4b6f7620d152\\\"},{\\\"visible\\\":true,\\\"h\\\":47,\\\"i\\\":\\\"16f505ae-dcc8-4329-841f-6816ed0f79fa\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JWeatherForecast\\\",\\\"w\\\":257,\\\"x\\\":202,\\\"y\\\":184,\\\"pageCompId\\\":\\\"1084354836135182336\\\",\\\"componentName\\\":\\\"滚动版\\\",\\\"key\\\":\\\"bf67a1de-364e-416a-88ff-ad9db3df8f5f\\\"},{\\\"visible\\\":true,\\\"h\\\":100,\\\"i\\\":\\\"1f05d4e8-af8b-43b9-bb80-0a1e803c9407\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragDecoration\\\",\\\"w\\\":443,\\\"x\\\":23,\\\"y\\\":16,\\\"pageCompId\\\":\\\"1084354836151959552\\\",\\\"componentName\\\":\\\"装饰1\\\",\\\"key\\\":\\\"053b7c8f-4c72-4230-a5f7-5eb46acce4e0\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731638514808-7\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":192,\\\"x\\\":1431,\\\"y\\\":678,\\\"pageCompId\\\":\\\"1084354836156153856\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"b91f0e67-d931-49ab-98ce-43bbdf1f6c97\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731638509763-6\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":205,\\\"x\\\":1409,\\\"y\\\":309,\\\"pageCompId\\\":\\\"1084354836172931072\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"f115414b-da0c-4606-9ecd-af9d464cd4a5\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731638502084-5\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":267,\\\"x\\\":1427,\\\"y\\\":144,\\\"pageCompId\\\":\\\"1084354836177125376\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"d4a88ee7-5091-4b8b-80f4-395b5af94a13\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731638496760-4\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":212,\\\"x\\\":1079,\\\"y\\\":140,\\\"pageCompId\\\":\\\"1084354836185513984\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"d064d0b9-1470-4d35-9fc4-c4b88efe63bd\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731638464024-3\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":200,\\\"x\\\":576,\\\"y\\\":136,\\\"pageCompId\\\":\\\"1084354836193902592\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"ddacdb15-4f7f-4417-91f5-e2195199ed2f\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731638457909-2\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":231,\\\"x\\\":44,\\\"y\\\":650,\\\"pageCompId\\\":\\\"1084354836202291200\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"9db0eb47-7974-4f3f-8c87-e761eba17b8d\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"es-drager-1731638452515-1\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":171,\\\"x\\\":47,\\\"y\\\":344,\\\"pageCompId\\\":\\\"1084354836210679808\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"03718e74-b30f-44e9-873d-75eacf011834\\\"},{\\\"visible\\\":true,\\\"h\\\":74,\\\"i\\\":\\\"a2f9a2bc-f6cc-4811-add1-aa48cd7d499e\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JImg\\\",\\\"w\\\":91,\\\"x\\\":93.53557015642195,\\\"y\\\":202.6610746089451,\\\"pageCompId\\\":\\\"1084354836219068416\\\",\\\"componentName\\\":\\\"图片\\\",\\\"key\\\":\\\"233b45a6-858d-4486-9fb7-1c70503502c0\\\"},{\\\"visible\\\":true,\\\"h\\\":39,\\\"i\\\":\\\"03c0a8d6-e38b-4b37-8158-d048079be048\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":139,\\\"x\\\":35,\\\"y\\\":139,\\\"pageCompId\\\":\\\"1084354836231651328\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"08550975-dab7-48f8-8323-f12b93b7d579\\\"},{\\\"visible\\\":true,\\\"h\\\":88,\\\"i\\\":\\\"3ec5db86-1dc8-4fc1-84c0-e7db4e7934bd\\\",\\\"orderNum\\\":0,\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"w\\\":636,\\\"x\\\":673,\\\"y\\\":13,\\\"pageCompId\\\":\\\"1084354836235845632\\\",\\\"componentName\\\":\\\"文本\\\",\\\"key\\\":\\\"b992d9d0-a169-4750-8b85-043a6db79675\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":507,\\\"x\\\":1398,\\\"h\\\":926,\\\"i\\\":\\\"es-drager-1731642738303-13\\\",\\\"y\\\":125,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1084354836244234240\\\",\\\"componentName\\\":\\\"边框1\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":488,\\\"x\\\":20,\\\"h\\\":926,\\\"i\\\":\\\"5427a7d4-3c10-425f-a059-ecadd99cf9e0\\\",\\\"y\\\":127,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1084354836248428544\\\",\\\"componentName\\\":\\\"边框1\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":801,\\\"x\\\":550,\\\"h\\\":926,\\\"i\\\":\\\"es-drager-1731642710947-12\\\",\\\"y\\\":128,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1084354836252622848\\\",\\\"componentName\\\":\\\"边框1\\\"}]', NULL, '0', '0', 'admin', '2025-04-02 22:13:01', 'admin', '2025-05-19 16:05:50', '', 1000, 3, 0, 0);\nINSERT INTO `onl_drag_page` VALUES ('1084355229195993088', '监狱财政科数据展示副本6832', '/drag/page/view/1084355229195993088', '#1E0047', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/1背景_1731463744922.jpg', 100, 'dark', 'bigScreen', NULL, '{\\\"width\\\":1920,\\\"height\\\":1080,\\\"waterMark\\\":{\\\"show\\\":false,\\\"content\\\":\\\"\\\",\\\"fontSize\\\":12,\\\"color\\\":\\\"#ffffff\\\",\\\"angle\\\":45},\\\"sysDefColor\\\":[{\\\"color\\\":\\\"#1e90ff\\\",\\\"color1\\\":\\\"#1e90ff\\\"},{\\\"color\\\":\\\"#90ee90\\\",\\\"color1\\\":\\\"#90ee90\\\"},{\\\"color\\\":\\\"#00ced1\\\",\\\"color1\\\":\\\"#00ced1\\\"},{\\\"color\\\":\\\"#e2bd84\\\",\\\"color1\\\":\\\"#e2bd84\\\"},{\\\"color\\\":\\\"#7a90e0\\\",\\\"color1\\\":\\\"#7a90e0\\\"},{\\\"color\\\":\\\"#3ba272\\\",\\\"color1\\\":\\\"#3ba272\\\"},{\\\"color\\\":\\\"#2be7ff\\\",\\\"color1\\\":\\\"#2be7ff\\\"},{\\\"color\\\":\\\"#0a8ada\\\",\\\"color1\\\":\\\"#0a8ada\\\"},{\\\"color\\\":\\\"#ffd700\\\",\\\"color1\\\":\\\"#ffd700\\\"}]}', '[{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JScrollBoard\\\",\\\"visible\\\":true,\\\"w\\\":531,\\\"x\\\":1342,\\\"h\\\":326,\\\"i\\\":\\\"es-drager-1731579847826-41\\\",\\\"y\\\":681,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712543752192\\\",\\\"componentName\\\":\\\"轮播表\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JScrollBoard\\\",\\\"visible\\\":true,\\\"w\\\":671,\\\"x\\\":626,\\\"h\\\":338,\\\"i\\\":\\\"es-drager-1731579827097-40\\\",\\\"y\\\":675,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712589889536\\\",\\\"componentName\\\":\\\"轮播表\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JScrollBoard\\\",\\\"visible\\\":true,\\\"w\\\":531,\\\"x\\\":49,\\\"h\\\":326,\\\"i\\\":\\\"12b2c94e-529a-4668-a2de-9b2021e93f56\\\",\\\"y\\\":678,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712610861056\\\",\\\"componentName\\\":\\\"轮播表\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JArea\\\",\\\"visible\\\":true,\\\"w\\\":530,\\\"x\\\":1358,\\\"h\\\":258,\\\"i\\\":\\\"aeafbc37-dcbc-4385-8d24-643fa4dc4fcd\\\",\\\"y\\\":328,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712623443968\\\",\\\"componentName\\\":\\\"面积图\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JMultipleLine\\\",\\\"visible\\\":true,\\\"w\\\":682,\\\"x\\\":628,\\\"h\\\":309,\\\"i\\\":\\\"0811e80e-d0df-43d7-92c6-d7f0e0d62fd7\\\",\\\"y\\\":297,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712636026880\\\",\\\"componentName\\\":\\\"对比折线图\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JMultipleBar\\\",\\\"visible\\\":true,\\\"w\\\":543,\\\"x\\\":47,\\\"h\\\":257,\\\"i\\\":\\\"f5598f5b-7aee-4b4a-aa98-3703c9f471f4\\\",\\\"y\\\":335,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712648609792\\\",\\\"componentName\\\":\\\"对比柱形图\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":84,\\\"x\\\":1220,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731577464601-39\\\",\\\"y\\\":231,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712661192704\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":84,\\\"x\\\":850,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731577430161-38\\\",\\\"y\\\":231,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712669581312\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":1149,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731577285085-37\\\",\\\"y\\\":231,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712682164224\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":1154,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731577281301-36\\\",\\\"y\\\":146,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712690552832\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":782,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731577276117-35\\\",\\\"y\\\":231,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712694747136\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":803,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731577225841-34\\\",\\\"y\\\":150,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712703135744\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":1659,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576941854-33\\\",\\\"y\\\":296,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712711524352\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":1654,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576643262-31\\\",\\\"y\\\":225,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712736690176\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":1389,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576638739-30\\\",\\\"y\\\":294,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712749273088\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":1345,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576635331-29\\\",\\\"y\\\":225,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712761856000\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":179,\\\"x\\\":988,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576628027-28\\\",\\\"y\\\":196,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712782827520\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":630,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576622559-27\\\",\\\"y\\\":195,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712791216128\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":288,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576613557-26\\\",\\\"y\\\":294,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712807993344\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":47,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576610256-25\\\",\\\"y\\\":290,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712816381952\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":56,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576557313-24\\\",\\\"y\\\":219,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712824770560\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":161,\\\"x\\\":298,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731576490851-23\\\",\\\"y\\\":218,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712833159168\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":1008,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575790320-20\\\",\\\"y\\\":136,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712845742080\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":637,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575741874-19\\\",\\\"y\\\":145,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712862519296\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":1169,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575724256-18\\\",\\\"y\\\":205,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712891879424\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":1166,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575720590-17\\\",\\\"y\\\":122,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712900268032\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":801,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575713035-16\\\",\\\"y\\\":202,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712908656640\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":807,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575699841-15\\\",\\\"y\\\":124,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712921239552\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":1649,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575681208-14\\\",\\\"y\\\":263,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712929628160\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":1367,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575676489-13\\\",\\\"y\\\":259,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712938016768\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":1633,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575667327-12\\\",\\\"y\\\":192,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712946405376\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":1364,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575662995-11\\\",\\\"y\\\":192,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712958988288\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":151,\\\"x\\\":302,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575658548-10\\\",\\\"y\\\":259,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712967376896\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":57,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575655752-9\\\",\\\"y\\\":259,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712975765504\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":298,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575650336-8\\\",\\\"y\\\":183,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712984154112\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":132,\\\"x\\\":55,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575591936-7\\\",\\\"y\\\":185,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712988348416\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":144,\\\"x\\\":1338,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575579158-6\\\",\\\"y\\\":628,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739712996737024\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":195,\\\"x\\\":619,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575574764-5\\\",\\\"y\\\":628,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739713000931328\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":177,\\\"x\\\":44,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575571643-4\\\",\\\"y\\\":630,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739713009319936\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":144,\\\"x\\\":1332,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575564662-3\\\",\\\"y\\\":132,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739713013514240\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":144,\\\"x\\\":46,\\\"h\\\":33,\\\"i\\\":\\\"es-drager-1731575453492-2\\\",\\\"y\\\":135,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739713017708544\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":466,\\\"x\\\":730,\\\"h\\\":45,\\\"i\\\":\\\"es-drager-1731575388068-1\\\",\\\"y\\\":40,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739713026097152\\\",\\\"componentName\\\":\\\"文本\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":144,\\\"x\\\":27,\\\"h\\\":33,\\\"i\\\":\\\"bea2f336-12f8-4333-adb1-882c4a46f1ef\\\",\\\"y\\\":22,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109739713030291456\\\",\\\"componentName\\\":\\\"文本\\\"}]', NULL, '0', '0', 'admin', '2025-05-19 16:07:23', 'admin', '2025-07-28 17:16:16', '', 0, 3, 0, 0);\nINSERT INTO `onl_drag_page` VALUES ('1109725101517996032', '库存管理可视化大屏副本6834', '/drag/page/view/1109725101517996032', NULL, NULL, 100, 'default', 'default', NULL, NULL, '[{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":24,\\\"moved\\\":false,\\\"pcY\\\":0,\\\"x\\\":0,\\\"h\\\":8,\\\"i\\\":\\\"377bfc6b-26f1-4fb0-8fe1-0acbc39149e2\\\",\\\"y\\\":0,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1109725129229762560\\\"},{\\\"component\\\":\\\"JGrowCard\\\",\\\"pcX\\\":0,\\\"w\\\":24,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"x\\\":0,\\\"h\\\":31,\\\"i\\\":\\\"94fb7d28-1f93-4506-8310-f39f6ca8f356\\\",\\\"y\\\":8,\\\"orderNum\\\":10,\\\"pageCompId\\\":\\\"1109725129259122688\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":39,\\\"x\\\":0,\\\"h\\\":5,\\\"i\\\":\\\"79eb8d80-8720-4dac-b4ab-a1bd295d3fa5\\\",\\\"y\\\":39,\\\"orderNum\\\":65,\\\"pageCompId\\\":\\\"1109725129263316992\\\"},{\\\"component\\\":\\\"JList\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":44,\\\"x\\\":0,\\\"h\\\":11,\\\"i\\\":\\\"3e12ea9a-04b8-4f1a-819a-1666be83bb2c\\\",\\\"y\\\":44,\\\"orderNum\\\":51,\\\"pageCompId\\\":\\\"1109725129263316993\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":55,\\\"x\\\":0,\\\"h\\\":5,\\\"i\\\":\\\"b1bc2b1b-4e38-4042-942d-50978e79236f\\\",\\\"y\\\":55,\\\"orderNum\\\":61,\\\"pageCompId\\\":\\\"1109725129280094208\\\"},{\\\"component\\\":\\\"JList\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":60,\\\"x\\\":0,\\\"h\\\":11,\\\"i\\\":\\\"ee6f5621-53ef-4d0f-a6c9-fd33982b2be1\\\",\\\"y\\\":60,\\\"orderNum\\\":71,\\\"pageCompId\\\":\\\"1109725129296871424\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":71,\\\"x\\\":0,\\\"h\\\":5,\\\"i\\\":\\\"9d1b768d-17ac-461b-8597-41a969fd1589\\\",\\\"y\\\":71,\\\"orderNum\\\":82,\\\"pageCompId\\\":\\\"1109725129301065728\\\"},{\\\"component\\\":\\\"JList\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":76,\\\"x\\\":0,\\\"h\\\":11,\\\"i\\\":\\\"380b67f4-ada6-47df-83a0-83b9c62fa435\\\",\\\"y\\\":76,\\\"orderNum\\\":92,\\\"pageCompId\\\":\\\"1109725129301065729\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":87,\\\"x\\\":0,\\\"h\\\":5,\\\"i\\\":\\\"0b6da57d-9804-4bfa-8ab8-54d690f8a09a\\\",\\\"y\\\":87,\\\"orderNum\\\":103,\\\"pageCompId\\\":\\\"1109725129313648640\\\"},{\\\"component\\\":\\\"JList\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":92,\\\"x\\\":0,\\\"h\\\":11,\\\"i\\\":\\\"c2551fe6-5a8f-4d45-bb3a-aa86dd6b46cd\\\",\\\"y\\\":92,\\\"orderNum\\\":113,\\\"pageCompId\\\":\\\"1109725129313648641\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"pcX\\\":5,\\\"w\\\":10,\\\"moved\\\":false,\\\"pcY\\\":39,\\\"x\\\":5,\\\"h\\\":20,\\\"i\\\":\\\"acecbdec-0b6b-4744-aeed-3f969e7915b6\\\",\\\"y\\\":39,\\\"orderNum\\\":124,\\\"pageCompId\\\":\\\"1109725129330425856\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"pcX\\\":5,\\\"w\\\":10,\\\"moved\\\":false,\\\"pcY\\\":59,\\\"x\\\":5,\\\"h\\\":22,\\\"i\\\":\\\"a3420701-faac-4d38-b7e2-9c12c3dc45e2\\\",\\\"y\\\":59,\\\"orderNum\\\":124,\\\"pageCompId\\\":\\\"1109725129330425857\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"pcX\\\":15,\\\"w\\\":9,\\\"moved\\\":false,\\\"pcY\\\":59,\\\"x\\\":15,\\\"h\\\":22,\\\"i\\\":\\\"a100e000-aee6-4138-8c72-0e4a830ec8de\\\",\\\"y\\\":59,\\\"orderNum\\\":124,\\\"pageCompId\\\":\\\"1109725129347203072\\\"},{\\\"component\\\":\\\"JMultipleBar\\\",\\\"pcX\\\":15,\\\"w\\\":9,\\\"moved\\\":false,\\\"pcY\\\":81,\\\"x\\\":15,\\\"h\\\":22,\\\"i\\\":\\\"7d4ec916-020b-4f35-baff-87951bf2aa48\\\",\\\"y\\\":81,\\\"orderNum\\\":124,\\\"pageCompId\\\":\\\"1109725129351397376\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"pcX\\\":0,\\\"w\\\":24,\\\"moved\\\":false,\\\"pcY\\\":110,\\\"x\\\":0,\\\"h\\\":45,\\\"i\\\":\\\"49592c96-4da5-4afb-9c15-fa7bea72bbc1\\\",\\\"y\\\":103,\\\"orderNum\\\":131,\\\"pageCompId\\\":\\\"1109725129418506240\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"pcX\\\":15,\\\"w\\\":9,\\\"moved\\\":false,\\\"pcY\\\":39,\\\"x\\\":15,\\\"h\\\":20,\\\"i\\\":\\\"ed714128-19d1-4117-a7b0-029620389fda\\\",\\\"y\\\":39,\\\"orderNum\\\":148,\\\"pageCompId\\\":\\\"1109725129418506241\\\"},{\\\"component\\\":\\\"JMultipleBar\\\",\\\"pcX\\\":5,\\\"w\\\":10,\\\"moved\\\":false,\\\"pcY\\\":81,\\\"x\\\":5,\\\"h\\\":22,\\\"i\\\":\\\"7bcdb3a7-eff0-4373-9911-e900d3e3ec7d\\\",\\\"y\\\":81,\\\"orderNum\\\":148,\\\"pageCompId\\\":\\\"1109725129443672064\\\"}]', NULL, '0', '0', 'admin', '2025-07-28 16:18:12', 'admin', '2025-07-28 16:18:19', '', 0, 54, 0, 0);\nINSERT INTO `onl_drag_page` VALUES ('1113362203690434560', '收视监控平台副本7069', '/drag/page/view/1113362203690434560', '#1E0047', '/img/bg/bg18.jpg', 100, 'dark', 'bigScreen', NULL, '{\\\"width\\\":1920,\\\"height\\\":2000}', '[{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":376,\\\"h\\\":52,\\\"x\\\":779,\\\"i\\\":\\\"ae56fe51-65d1-4866-9789-f9229289964f\\\",\\\"orderNum\\\":0,\\\"y\\\":27,\\\"pageCompId\\\":\\\"1113362203862401024\\\",\\\"selected\\\":false,\\\"key\\\":\\\"33c6ecba-c0f5-46f2-9323-aab43e87eb63\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":382,\\\"h\\\":45,\\\"x\\\":774,\\\"i\\\":\\\"8ce1a978-3664-41d4-8d80-1b8f81deee0a\\\",\\\"orderNum\\\":0,\\\"y\\\":107,\\\"pageCompId\\\":\\\"1113362203904344064\\\",\\\"selected\\\":false,\\\"key\\\":\\\"936bc496-c82b-46b1-bc19-a9ee91929452\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragDecoration\\\",\\\"visible\\\":true,\\\"w\\\":403,\\\"h\\\":78,\\\"x\\\":10,\\\"i\\\":\\\"04048a06-cefb-4dcd-ac0c-004da0229a9e\\\",\\\"orderNum\\\":0,\\\"y\\\":52,\\\"pageCompId\\\":\\\"1113362203921121280\\\",\\\"selected\\\":false,\\\"key\\\":\\\"6cc237a4-89ad-4718-83c4-feb0b9a14ef9\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JCurrentTime\\\",\\\"visible\\\":true,\\\"w\\\":270,\\\"h\\\":33,\\\"x\\\":1629,\\\"i\\\":\\\"f69ec49c-ff6d-40f6-bcff-06a2d6742751\\\",\\\"orderNum\\\":0,\\\"y\\\":20,\\\"pageCompId\\\":\\\"1113362203933704192\\\",\\\"selected\\\":false,\\\"key\\\":\\\"1ac1bf52-506c-4d5b-95da-52f907854017\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":93,\\\"h\\\":61,\\\"x\\\":1558,\\\"i\\\":\\\"5094172c-0de1-4f5d-84d8-fff43811bba5\\\",\\\"orderNum\\\":300,\\\"y\\\":10,\\\"pageCompId\\\":\\\"1113362203950481408\\\",\\\"selected\\\":false,\\\"key\\\":\\\"dd9f7e52-86bc-4fcb-8bb2-bbd62e1a7546\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JWeatherForecast\\\",\\\"visible\\\":true,\\\"w\\\":267,\\\"h\\\":59,\\\"x\\\":1635,\\\"i\\\":\\\"3d154544-9fab-4177-8fa8-dce02ccf8b5e\\\",\\\"orderNum\\\":300,\\\"y\\\":59,\\\"pageCompId\\\":\\\"1113362203975647232\\\",\\\"selected\\\":false,\\\"key\\\":\\\"375983aa-1c1b-4cd0-8d68-a67e55588edc\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":599,\\\"h\\\":441,\\\"x\\\":79,\\\"i\\\":\\\"9fe7eb28-0157-48ca-8535-34760368e2d7\\\",\\\"orderNum\\\":300,\\\"y\\\":190,\\\"pageCompId\\\":\\\"1113362203992424448\\\",\\\"selected\\\":false,\\\"key\\\":\\\"51cc5aff-ade9-40ef-9a31-891cc4779213\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":582,\\\"h\\\":445,\\\"x\\\":699,\\\"i\\\":\\\"es-drager-1731648824951-1\\\",\\\"orderNum\\\":300,\\\"y\\\":189,\\\"pageCompId\\\":\\\"1113362204013395968\\\",\\\"selected\\\":false,\\\"key\\\":\\\"8c08e246-f373-45e7-84cb-896b3c19c248\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":589,\\\"h\\\":450,\\\"x\\\":1297,\\\"i\\\":\\\"es-drager-1731648851843-2\\\",\\\"orderNum\\\":300,\\\"y\\\":187,\\\"pageCompId\\\":\\\"1113362204034367488\\\",\\\"selected\\\":false,\\\"key\\\":\\\"71fe25a3-4299-42c7-8a96-2415747940c9\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JVideoJs\\\",\\\"visible\\\":true,\\\"w\\\":568,\\\"h\\\":405,\\\"x\\\":93,\\\"i\\\":\\\"22aae23c-029e-456e-a1ac-0936cbfa6b6b\\\",\\\"orderNum\\\":300,\\\"y\\\":207,\\\"pageCompId\\\":\\\"1113362204051144704\\\",\\\"selected\\\":false,\\\"key\\\":\\\"41da84ee-4ced-4414-af4c-acbf4cf2232c\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JVideoJs\\\",\\\"visible\\\":true,\\\"w\\\":560,\\\"h\\\":416,\\\"x\\\":707,\\\"i\\\":\\\"9d1f25e6-5446-4f78-90c6-7f9bd674b058\\\",\\\"orderNum\\\":300,\\\"y\\\":201,\\\"pageCompId\\\":\\\"1113362204067921920\\\",\\\"selected\\\":false,\\\"key\\\":\\\"864aa918-532c-4407-9bb0-2e2041ae53f7\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JVideoJs\\\",\\\"visible\\\":true,\\\"w\\\":570,\\\"h\\\":433,\\\"x\\\":1306,\\\"i\\\":\\\"85841a8f-e6cd-479a-9ba8-c36497b4e912\\\",\\\"orderNum\\\":300,\\\"y\\\":194,\\\"pageCompId\\\":\\\"1113362204080504832\\\",\\\"selected\\\":false,\\\"key\\\":\\\"8f12407a-94af-46c1-bd13-1e28fcbfaee0\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":262,\\\"h\\\":56,\\\"x\\\":81,\\\"i\\\":\\\"b0c4361a-0dfb-4575-88cb-edb593d4e120\\\",\\\"orderNum\\\":300,\\\"y\\\":666,\\\"pageCompId\\\":\\\"1113362204093087744\\\",\\\"selected\\\":false,\\\"key\\\":\\\"245b1381-54f5-40fd-9475-e34e41587f37\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JDragBorder\\\",\\\"visible\\\":true,\\\"w\\\":1790,\\\"h\\\":417,\\\"x\\\":70,\\\"i\\\":\\\"3ca04b91-c734-42b9-8eea-93dad3b04a7e\\\",\\\"orderNum\\\":300,\\\"y\\\":747,\\\"pageCompId\\\":\\\"1113362204109864960\\\",\\\"selected\\\":false,\\\"key\\\":\\\"5627d105-4546-4692-abcd-42f2e61c3e45\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JMultipleLine\\\",\\\"visible\\\":true,\\\"w\\\":485,\\\"h\\\":335,\\\"x\\\":109,\\\"i\\\":\\\"236cba9d-2c70-407e-8013-ee37e3d5d124\\\",\\\"orderNum\\\":300,\\\"y\\\":797,\\\"pageCompId\\\":\\\"1113362204122447872\\\",\\\"selected\\\":false,\\\"key\\\":\\\"644ef67f-0b41-4cb5-8cc5-1cac198d745f\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JMultipleLine\\\",\\\"visible\\\":true,\\\"w\\\":485,\\\"h\\\":335,\\\"x\\\":704,\\\"i\\\":\\\"es-drager-1731649759290-3\\\",\\\"orderNum\\\":300,\\\"y\\\":797,\\\"pageCompId\\\":\\\"1113362204143419392\\\",\\\"selected\\\":false,\\\"key\\\":\\\"f92fba2e-d9c4-4e38-901d-d947f542e17b\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JMultipleLine\\\",\\\"visible\\\":true,\\\"w\\\":485,\\\"h\\\":335,\\\"x\\\":1292,\\\"i\\\":\\\"es-drager-1731649765690-4\\\",\\\"orderNum\\\":300,\\\"y\\\":793,\\\"pageCompId\\\":\\\"1113362204164390912\\\",\\\"selected\\\":false,\\\"key\\\":\\\"3c1ab904-3923-4a51-80c5-d355c8516333\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JSelectRadio\\\",\\\"visible\\\":true,\\\"w\\\":400,\\\"h\\\":80,\\\"x\\\":62,\\\"i\\\":\\\"3f014db1-34fe-41b7-bdff-ab4a23a7d6f6\\\",\\\"orderNum\\\":108,\\\"y\\\":7,\\\"pageCompId\\\":\\\"1113362204172779520\\\",\\\"selected\\\":false,\\\"key\\\":\\\"1fef29d3-cad8-4248-84d3-a778f7f1b389\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JVideoPlay\\\",\\\"visible\\\":false,\\\"w\\\":516,\\\"h\\\":351,\\\"x\\\":121,\\\"i\\\":\\\"26735d51-f628-4ec6-8886-0ede0a7443af\\\",\\\"orderNum\\\":0,\\\"y\\\":236,\\\"pageCompId\\\":\\\"1113362204193751040\\\",\\\"selected\\\":false,\\\"key\\\":\\\"861f9c1d-d8dc-418a-a8c6-19f9c8d3a7e1\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JVideoPlay\\\",\\\"visible\\\":false,\\\"w\\\":518,\\\"h\\\":361,\\\"x\\\":730,\\\"i\\\":\\\"es-drager-1731650783569-1\\\",\\\"orderNum\\\":0,\\\"y\\\":226,\\\"pageCompId\\\":\\\"1113362204210528256\\\",\\\"selected\\\":false,\\\"key\\\":\\\"9daa119e-566a-4c34-8643-49334e77701c\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JVideoPlay\\\",\\\"visible\\\":false,\\\"w\\\":521,\\\"h\\\":378,\\\"x\\\":1329,\\\"i\\\":\\\"es-drager-1731650792607-2\\\",\\\"orderNum\\\":0,\\\"y\\\":222,\\\"pageCompId\\\":\\\"1113362204223111168\\\",\\\"selected\\\":false,\\\"key\\\":\\\"75211ac2-b0de-45bf-87ae-f84c8a712368\\\"},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JBubble\\\",\\\"visible\\\":false,\\\"w\\\":851,\\\"x\\\":106,\\\"h\\\":360,\\\"i\\\":\\\"3acfc295-ea6d-4e16-83fd-bfd8d9022d8d\\\",\\\"y\\\":784,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"1113362204235694080\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JText\\\",\\\"visible\\\":false,\\\"w\\\":268,\\\"x\\\":1037,\\\"h\\\":63,\\\"i\\\":\\\"f499c09e-61cc-40f1-8496-d57d2f98f82c\\\",\\\"y\\\":752,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1113362204248276992\\\",\\\"selected\\\":false},{\\\"compTextName\\\":\\\"\\\",\\\"component\\\":\\\"JRing\\\",\\\"visible\\\":false,\\\"w\\\":666,\\\"x\\\":944,\\\"h\\\":385,\\\"i\\\":\\\"a82c61b6-4287-422a-b8e7-1cb34d17859a\\\",\\\"y\\\":794,\\\"orderNum\\\":300,\\\"pageCompId\\\":\\\"1113362204260859904\\\",\\\"selected\\\":false}]', NULL, '0', '0', 'admin', '2025-08-07 17:10:45', 'admin', '2025-08-07 17:10:54', '', 0, 3, 0, 1);\nINSERT INTO `onl_drag_page` VALUES ('1113362261391474688', '示例_首页副本6950', '/drag/page/view/1113362261391474688', NULL, '', 30, 'default', 'default', NULL, NULL, '[{\\\"pcX\\\":0,\\\"pcW\\\":13,\\\"moved\\\":false,\\\"pcY\\\":19,\\\"h\\\":25,\\\"i\\\":\\\"a80f65fe-cdc3-4fbe-a383-c526eda9886e\\\",\\\"mobileY\\\":0,\\\"mobileX\\\":0,\\\"component\\\":\\\"JQuickNav\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":0,\\\"pageCompId\\\":\\\"1113362261433417728\\\",\\\"key\\\":\\\"ebb10884-4571-4a62-976e-0de8d515d8bb\\\"},{\\\"pcX\\\":13,\\\"pcW\\\":11,\\\"moved\\\":false,\\\"pcY\\\":39,\\\"h\\\":51,\\\"i\\\":\\\"4d7f78a3-6520-45ae-85e4-ac0cfca514b3\\\",\\\"mobileY\\\":28,\\\"mobileX\\\":0,\\\"component\\\":\\\"JList\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":25,\\\"pageCompId\\\":\\\"1113362261462777856\\\",\\\"key\\\":\\\"8c0dfa3a-91a6-4429-8f29-80a225f6c862\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":24,\\\"moved\\\":false,\\\"pcY\\\":0,\\\"h\\\":36,\\\"i\\\":\\\"1aab1f6b-316e-4046-9ec0-d68d35fa6142\\\",\\\"mobileY\\\":72,\\\"mobileX\\\":0,\\\"component\\\":\\\"JGrowCard\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":76,\\\"pageCompId\\\":\\\"1113362261483749376\\\",\\\"key\\\":\\\"ad8ecb70-a148-425d-8c0e-66a500da3f6b\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":13,\\\"moved\\\":false,\\\"pcY\\\":47,\\\"h\\\":88,\\\"i\\\":\\\"ab1fcd58-e150-4816-b06a-5d2a62517510\\\",\\\"mobileY\\\":108,\\\"mobileX\\\":0,\\\"component\\\":\\\"JProjectCard\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":112,\\\"pageCompId\\\":\\\"1113362261496332288\\\",\\\"key\\\":\\\"dba2cb08-ac72-471d-b2d0-57b005d4abe1\\\"},{\\\"pcX\\\":13,\\\"pcW\\\":11,\\\"moved\\\":false,\\\"pcY\\\":19,\\\"h\\\":33,\\\"i\\\":\\\"e5a73961-e1ba-462c-bf86-78fbb94390d4\\\",\\\"mobileY\\\":144,\\\"mobileX\\\":0,\\\"component\\\":\\\"JWaitMatter\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":200,\\\"pageCompId\\\":\\\"1113362261525692416\\\",\\\"key\\\":\\\"a289d618-3c4c-4739-b922-1d2da94f616c\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":24,\\\"moved\\\":false,\\\"pcY\\\":83,\\\"h\\\":41,\\\"i\\\":\\\"b1786985-070f-4f7b-8c46-b61c0ac9b8c7\\\",\\\"mobileY\\\":164,\\\"mobileX\\\":0,\\\"component\\\":\\\"JLine\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":233,\\\"pageCompId\\\":\\\"1113362261550858240\\\",\\\"key\\\":\\\"67ef02cb-e6af-4864-8c35-f389caee9c0c\\\"}]', NULL, '988299668956545024', '0', 'admin', '2025-08-07 17:10:59', 'admin', '2025-08-07 17:11:05', '', 0, 3, 0, 1);\nINSERT INTO `onl_drag_page` VALUES ('1113362302680203264', '医美行业网络关注度副本4006', '/drag/page/view/1113362302680203264', NULL, '', 30, 'default', 'default', NULL, NULL, '[{\\\"pcX\\\":0,\\\"pcW\\\":24,\\\"moved\\\":false,\\\"pcY\\\":0,\\\"h\\\":8,\\\"i\\\":\\\"95729a29-9b15-4102-8ca0-4474bcdfd6ea\\\",\\\"orderNum\\\":0,\\\"mobileY\\\":0,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":0,\\\"pageCompId\\\":\\\"1113362302755700736\\\",\\\"key\\\":\\\"9ae1b314-88e0-433d-985f-7d492c0f1c6c\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":78,\\\"h\\\":6,\\\"i\\\":\\\"89ac8d65-5a17-4c62-83cc-05f29f629734\\\",\\\"orderNum\\\":13,\\\"mobileY\\\":43,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":43,\\\"pageCompId\\\":\\\"1113362302789255168\\\",\\\"key\\\":\\\"8f9eac53-d1e3-422f-8b7f-7ab4a451effb\\\"},{\\\"pcX\\\":16,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":77,\\\"h\\\":6,\\\"i\\\":\\\"f5f244fb-deed-48eb-8ada-78dadbe08bd8\\\",\\\"orderNum\\\":21,\\\"mobileY\\\":79,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":79,\\\"pageCompId\\\":\\\"1113362302806032384\\\",\\\"key\\\":\\\"5a0519bf-a79f-4160-b287-ab62629eb9ac\\\"},{\\\"pcX\\\":8,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":78,\\\"h\\\":6,\\\"i\\\":\\\"de17aaaf-b81c-48b3-8309-854b1d0b3d14\\\",\\\"orderNum\\\":20,\\\"mobileY\\\":184,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":184,\\\"pageCompId\\\":\\\"1113362302818615296\\\",\\\"key\\\":\\\"5f9de8c9-5dd0-4bed-9b47-ef2b576f28e7\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"6979473b-9eb1-4d90-887c-483378b89886\\\",\\\"orderNum\\\":20,\\\"mobileY\\\":8,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":8,\\\"pageCompId\\\":\\\"1113362302835392512\\\",\\\"key\\\":\\\"98452364-6f51-4cff-9414-e72cea2b48d2\\\"},{\\\"pcX\\\":8,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"fabcd19e-73a2-4a44-9035-d18bccfa77ba\\\",\\\"orderNum\\\":25,\\\"mobileY\\\":149,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":149,\\\"pageCompId\\\":\\\"1113362302847975424\\\",\\\"key\\\":\\\"c941de1d-f16f-4674-8995-0702ae12d431\\\"},{\\\"pcX\\\":16,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"e5eb46cd-4d1a-447e-b42a-6e390fa7080e\\\",\\\"orderNum\\\":25,\\\"mobileY\\\":114,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":114,\\\"pageCompId\\\":\\\"1113362302864752640\\\",\\\"key\\\":\\\"d27f9779-ea26-4b2a-abba-a1e91cef8221\\\"},{\\\"pcX\\\":8,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":30,\\\"i\\\":\\\"f42ce4f9-0e56-47da-8220-254436afea6d\\\",\\\"orderNum\\\":25,\\\"mobileY\\\":154,\\\"mobileX\\\":0,\\\"component\\\":\\\"JSmoothLine\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":154,\\\"pageCompId\\\":\\\"1113362302889918464\\\",\\\"key\\\":\\\"5817d28c-8684-433a-9a09-89328f379c2b\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":43,\\\"h\\\":5,\\\"i\\\":\\\"102fa102-3bd7-4e86-83ea-77cc7ef23651\\\",\\\"orderNum\\\":44,\\\"mobileY\\\":219,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":219,\\\"pageCompId\\\":\\\"1113362302906695680\\\",\\\"key\\\":\\\"fd873bf0-1a7f-4f66-ac2a-615c00491700\\\"},{\\\"pcX\\\":16,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":48,\\\"h\\\":30,\\\"i\\\":\\\"6841deb3-d062-42d8-8a2b-b58f6da64159\\\",\\\"orderNum\\\":49,\\\"mobileY\\\":293,\\\"mobileX\\\":0,\\\"component\\\":\\\"JMultipleBar\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":286,\\\"pageCompId\\\":\\\"1113362302915084288\\\",\\\"key\\\":\\\"6dd95954-ce51-4957-b62f-b61420a8ad8e\\\"},{\\\"pcX\\\":8,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":43,\\\"h\\\":5,\\\"i\\\":\\\"201a48c1-924c-4da0-87e5-9dc0eb2579a9\\\",\\\"orderNum\\\":69,\\\"mobileY\\\":253,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":253,\\\"pageCompId\\\":\\\"1113362302936055808\\\",\\\"key\\\":\\\"2f3d3af4-a5a6-4764-8548-b8cc8b0030a2\\\"},{\\\"pcX\\\":16,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":43,\\\"h\\\":5,\\\"i\\\":\\\"7e2ecc0a-7930-4c76-9c9a-76af22a58f59\\\",\\\"orderNum\\\":78,\\\"mobileY\\\":288,\\\"mobileX\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":281,\\\"pageCompId\\\":\\\"1113362302948638720\\\",\\\"key\\\":\\\"b4e7c69b-2853-403a-85c7-c1cdf9fec082\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":30,\\\"i\\\":\\\"88e40b11-fc48-4d59-8ba8-5d106f3dfa2b\\\",\\\"orderNum\\\":53,\\\"mobileY\\\":13,\\\"mobileX\\\":0,\\\"component\\\":\\\"JMixLineBar\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":13,\\\"pageCompId\\\":\\\"1113362302961221632\\\",\\\"key\\\":\\\"b761af88-7505-404a-998f-dfa7d2a14367\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":48,\\\"h\\\":30,\\\"i\\\":\\\"000017d9-054b-492f-9327-537c64b25f0f\\\",\\\"orderNum\\\":54,\\\"mobileY\\\":49,\\\"mobileX\\\":0,\\\"component\\\":\\\"JDynamicBar\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":49,\\\"pageCompId\\\":\\\"1113362302977998848\\\",\\\"key\\\":\\\"7ea7c14c-e71c-41d9-ad5d-4ee8c8de4aa7\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":84,\\\"h\\\":29,\\\"i\\\":\\\"0331fad4-d098-4aa4-84e1-0583a0ed828f\\\",\\\"orderNum\\\":80,\\\"mobileY\\\":224,\\\"mobileX\\\":0,\\\"component\\\":\\\"JDynamicBar\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":224,\\\"pageCompId\\\":\\\"1113362302994776064\\\",\\\"key\\\":\\\"447a9788-884d-4f95-a5a9-fe7130078ef8\\\"},{\\\"pcX\\\":8,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":48,\\\"h\\\":23,\\\"i\\\":\\\"f36d52f6-942b-438b-881a-2fd02ebfd7f0\\\",\\\"orderNum\\\":109,\\\"mobileY\\\":258,\\\"mobileX\\\":0,\\\"component\\\":\\\"JRing\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":258,\\\"pageCompId\\\":\\\"1113362303007358976\\\",\\\"key\\\":\\\"5e2cd922-9a7b-4706-a1ae-66635c985aaa\\\"},{\\\"pcX\\\":8,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":84,\\\"h\\\":29,\\\"i\\\":\\\"7c994b82-cde8-41a2-9192-21f8c92085b9\\\",\\\"orderNum\\\":109,\\\"mobileY\\\":190,\\\"mobileX\\\":0,\\\"component\\\":\\\"JCommonTable\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":190,\\\"pageCompId\\\":\\\"1113362303015747584\\\",\\\"key\\\":\\\"62e6b38a-f2fe-4e30-8a76-b5fe5404c665\\\"},{\\\"pcX\\\":16,\\\"pcW\\\":8,\\\"moved\\\":false,\\\"pcY\\\":83,\\\"h\\\":29,\\\"i\\\":\\\"7759c7d3-2ea1-4f89-9c49-9866e9d6cc77\\\",\\\"orderNum\\\":113,\\\"mobileY\\\":85,\\\"mobileX\\\":0,\\\"component\\\":\\\"JRing\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":85,\\\"pageCompId\\\":\\\"1113362303024136192\\\",\\\"key\\\":\\\"23b4812c-a369-43df-8f70-526a8e347842\\\"},{\\\"pcX\\\":0,\\\"pcW\\\":12,\\\"moved\\\":false,\\\"pcY\\\":113,\\\"h\\\":30,\\\"i\\\":\\\"77b4c245-5240-4e96-8275-acdc5648c65b\\\",\\\"orderNum\\\":113,\\\"mobileY\\\":119,\\\"mobileX\\\":0,\\\"component\\\":\\\"JFunnel\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":119,\\\"pageCompId\\\":\\\"1113362303036719104\\\",\\\"key\\\":\\\"2c9e4290-51dd-4603-937e-4bb9ef72b04b\\\"}]', NULL, '988299668956545024', '0', 'admin', '2025-08-07 17:11:08', 'admin', '2025-08-07 17:11:12', '', 0, 75, 0, 1);\nINSERT INTO `onl_drag_page` VALUES ('1151069555267260416', '集团综合数据大屏', '/drag/page/view/1151069555267260416', '#1E0047', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/背景_1756435878126.jpg', 100, 'dark', 'bigScreen', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/封面_1763554989082.png', '{\\\"width\\\":1920,\\\"height\\\":1080,\\\"waterMark\\\":{\\\"show\\\":false,\\\"content\\\":\\\"\\\",\\\"fontSize\\\":12,\\\"color\\\":\\\"#ffffff\\\",\\\"angle\\\":45},\\\"sysDefColor\\\":[{\\\"color\\\":\\\"#1e90ff\\\",\\\"color1\\\":\\\"#1e90ff\\\"},{\\\"color\\\":\\\"#90ee90\\\",\\\"color1\\\":\\\"#90ee90\\\"},{\\\"color\\\":\\\"#00ced1\\\",\\\"color1\\\":\\\"#00ced1\\\"},{\\\"color\\\":\\\"#e2bd84\\\",\\\"color1\\\":\\\"#e2bd84\\\"},{\\\"color\\\":\\\"#7a90e0\\\",\\\"color1\\\":\\\"#7a90e0\\\"},{\\\"color\\\":\\\"#3ba272\\\",\\\"color1\\\":\\\"#3ba272\\\"},{\\\"color\\\":\\\"#2be7ff\\\",\\\"color1\\\":\\\"#2be7ff\\\"},{\\\"color\\\":\\\"#0a8ada\\\",\\\"color1\\\":\\\"#0a8ada\\\"},{\\\"color\\\":\\\"#ffd700\\\",\\\"color1\\\":\\\"#ffd700\\\"}],\\\"layoutMode\\\":\\\"fullScreen\\\"}', '[{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":496,\\\"x\\\":705,\\\"h\\\":60,\\\"i\\\":\\\"8eca7087-2a7b-40d0-9732-7784fb4dbdfc\\\",\\\"y\\\":5,\\\"orderNum\\\":70,\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1151112776819200000\\\"},{\\\"component\\\":\\\"JTabToggle\\\",\\\"visible\\\":true,\\\"w\\\":680,\\\"x\\\":597,\\\"h\\\":70,\\\"i\\\":\\\"f695ef5a-9797-4a56-8a1f-3a4db443da22\\\",\\\"y\\\":62,\\\"orderNum\\\":70,\\\"componentName\\\":\\\"导航切换\\\",\\\"pageCompId\\\":\\\"1151112776861143040\\\",\\\"key\\\":\\\"299a2a16-346c-44ca-bd9c-6b62aaf8cf98\\\"},{\\\"visible\\\":false,\\\"h\\\":991.8710433763201,\\\"i\\\":\\\"es-drager-1762494714798-7\\\",\\\"props\\\":{\\\"elements\\\":[{\\\"component\\\":\\\"JStatsSummary\\\",\\\"visible\\\":true,\\\"w\\\":698,\\\"x\\\":602.672919109027,\\\"h\\\":85,\\\"i\\\":\\\"c1789d8c-8d56-410c-9a0e-90c65a2e20e1\\\",\\\"y\\\":48.61195779601541,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"4.9010360893832265%\\\",\\\"left\\\":\\\"31.130365064812537%\\\",\\\"width\\\":\\\"36.05437398342474%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"8.56966241404334%\\\"},\\\"componentName\\\":\\\"统计概览（背景模式）\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"项目总数\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 600,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"2\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"合同总数\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 900,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"3\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"收票总数\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 790,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"4\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"总金额\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 17790,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":697.9999999999999,\\\"height\\\":85},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":713,\\\"dataType\\\":1,\\\"h\\\":129,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"layout\\\":{\\\"padding\\\":{\\\"top\\\":9,\\\"left\\\":20,\\\"bottom\\\":0,\\\"right\\\":20},\\\"borderColor\\\":\\\"#0f66ff59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"justify\\\":\\\"space-between\\\",\\\"borderWidth\\\":0,\\\"gap\\\":16,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"contain\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"drag/lib/img/bg01.png\\\"},\\\"color\\\":\\\"#0b2b63\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"image\\\"}},\\\"highlight\\\":[],\\\"fieldMap\\\":{\\\"compareValue\\\":\\\"compareValue\\\",\\\"unit\\\":\\\"suffix\\\",\\\"negativeValue\\\":\\\"0\\\",\\\"compareState\\\":\\\"compareState\\\",\\\"label\\\":\\\"name\\\",\\\"value\\\":\\\"value\\\",\\\"positiveValue\\\":\\\"1\\\",\\\"compareLabel\\\":\\\"compareLabel\\\"},\\\"card\\\":{\\\"padding\\\":{\\\"horizontal\\\":3,\\\"vertical\\\":15},\\\"borderColor\\\":\\\"#0F66FF59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"borderWidth\\\":0,\\\"blur\\\":24,\\\"minWidth\\\":100,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"cover\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"\\\"},\\\"color\\\":\\\"#0B2B6300\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"none\\\"}},\\\"sections\\\":{\\\"middle\\\":{\\\"compare\\\":{\\\"valueStyle\\\":{\\\"positiveGradient\\\":{\\\"endColor\\\":\\\"#15f0c5\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#15f0c5\\\"},\\\"positiveColor\\\":\\\"#15F0C5\\\",\\\"fontSize\\\":14,\\\"negativeColor\\\":\\\"#D0021B\\\",\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"negativeGradient\\\":{\\\"endColor\\\":\\\"#D0021B\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#D0021B\\\"},\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"alignItems\\\":\\\"center\\\",\\\"labelStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"fontColor\\\":\\\"#9ED3FF\\\"},\\\"label\\\":\\\"同比\\\"},\\\"paddingBottom\\\":10,\\\"show\\\":false,\\\"type\\\":\\\"compare\\\",\\\"align\\\":\\\"center\\\"},\\\"top\\\":{\\\"minHeight\\\":32,\\\"paddingBottom\\\":2,\\\"show\\\":true,\\\"paddingTop\\\":9,\\\"type\\\":\\\"value\\\",\\\"align\\\":\\\"center\\\",\\\"value\\\":{\\\"unit\\\":{\\\"fontSize\\\":18,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"fontWeight\\\":500,\\\"fontColor\\\":\\\"#9ED3FF\\\"},\\\"unitGap\\\":6,\\\"fontSize\\\":20,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#D8F1FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#73E0FF\\\"},\\\"fontWeight\\\":600,\\\"fontColor\\\":\\\"#D8F1FF\\\"}},\\\"bottom\\\":{\\\"minHeight\\\":0,\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"label\\\":{\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#CFEAFF\\\"},\\\"paddingTop\\\":14,\\\"type\\\":\\\"label\\\",\\\"align\\\":\\\"center\\\"}}}}},{\\\"component\\\":\\\"JBreakRing\\\",\\\"visible\\\":true,\\\"w\\\":465.9999959429075,\\\"x\\\":1469.9648340688161,\\\"h\\\":188.99999576947263,\\\"i\\\":\\\"8400df78-833b-46c3-818b-94d611837818\\\",\\\"y\\\":34.6846393287222,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"3.4968899999999996%\\\",\\\"left\\\":\\\"75.929315%\\\",\\\"width\\\":\\\"24.070685%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"19.054895999999992%\\\"},\\\"componentName\\\":\\\"多色环形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":400,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 500,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"施工费\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 700,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"设计费\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 1000,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"土地款\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":465.9999959429075,\\\"height\\\":188.99999576947263},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":550,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"customColor\\\":[{\\\"color1\\\":\\\"#00ccdf\\\",\\\"color\\\":\\\"#2A6FFEC0\\\"},{\\\"color1\\\":\\\"#00c039\\\",\\\"color\\\":\\\"#28F2E699\\\"},{\\\"color1\\\":\\\"#ff7701\\\",\\\"color\\\":\\\"#FFA80099\\\"}],\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":50,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":14,\\\"fontWeight\\\":\\\"bold\\\"}},\\\"itemStyle\\\":{\\\"shadowBlur\\\":20,\\\"borderWidth\\\":4},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true,\\\"fontSize\\\":16,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"length2\\\":38,\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\",\\\"t\\\":22,\\\"show\\\":false},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"outRadius\\\":43,\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"top\\\":41,\\\"textAlign\\\":\\\"\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":true,\\\"customTop\\\":true,\\\"text\\\":\\\"成本分类\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontSize\\\":24}},\\\"innerRadius\\\":46,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":80.00001018811254,\\\"x\\\":1170.8546088584762,\\\"h\\\":39.00000243327086,\\\"i\\\":\\\"es-drager-1763379841846-17\\\",\\\"y\\\":607.5369335982422,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"61.251604999999984%\\\",\\\"left\\\":\\\"60.47912600000001%\\\",\\\"width\\\":\\\"4.132306999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.931963%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":80.00001018811254,\\\"height\\\":39.00000243327086},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C3D3E6\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":80.00001018811254,\\\"x\\\":1070.83116610898,\\\"h\\\":39.00000243327086,\\\"i\\\":\\\"es-drager-1763379835852-16\\\",\\\"y\\\":407.4900435141388,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"41.08296599999999%\\\",\\\"left\\\":\\\"55.31253199999998%\\\",\\\"width\\\":\\\"4.132306999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.931963%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":80.00001018811254,\\\"height\\\":39.00000243327086},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C3D3E6\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":80.00001018811254,\\\"x\\\":955.6142713735522,\\\"h\\\":39.00000243327086,\\\"i\\\":\\\"es-drager-1763379828126-15\\\",\\\"y\\\":504.981246741806,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.911986%\\\",\\\"left\\\":\\\"49.361138%\\\",\\\"width\\\":\\\"4.132306999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.931963%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":80.00001018811254,\\\"height\\\":39.00000243327086},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C3D3E6\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":80.00001018811254,\\\"x\\\":799.8815821142322,\\\"h\\\":39.00000243327086,\\\"i\\\":\\\"es-drager-1763379820679-14\\\",\\\"y\\\":618.9320044052293,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"62.400451000000004%\\\",\\\"left\\\":\\\"41.31694799999999%\\\",\\\"width\\\":\\\"4.132306999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.931963%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":80.00001018811254,\\\"height\\\":39.00000243327086},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C3D3E6\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":809.3657576585699,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763379792283-13\\\",\\\"y\\\":543.8839267883006,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"54.834136999999984%\\\",\\\"left\\\":\\\"41.806842%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":965.0984662775381,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763379785352-12\\\",\\\"y\\\":428.6670457380076,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"43.218022%\\\",\\\"left\\\":\\\"49.85103299999999%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":1186.669389396952,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763379778444-11\\\",\\\"y\\\":531.2227325944438,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"53.55764099999999%\\\",\\\"left\\\":\\\"61.29602%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":1087.9120482866356,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763379772822-10\\\",\\\"y\\\":314.71628807458416,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"31.729556999999993%\\\",\\\"left\\\":\\\"56.194824999999994%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":1163.1934345963189,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763379765062-9\\\",\\\"y\\\":502.3681228031894,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.648532%\\\",\\\"left\\\":\\\"60.083396999999984%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"994,150\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":792.2204078520751,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763379758530-8\\\",\\\"y\\\":507.432596513248,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"51.15913%\\\",\\\"left\\\":\\\"40.921219%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"994,150\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":951.7514601078782,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763379754034-7\\\",\\\"y\\\":394.747952317984,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"39.79831399999999%\\\",\\\"left\\\":\\\"49.161609%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"994,150\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":1072.0328194789686,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763379749488-6\\\",\\\"y\\\":284.5955548964599,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"28.692797999999996%\\\",\\\"left\\\":\\\"55.374601999999996%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"994,150\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":163.99999475010551,\\\"x\\\":1036.7666839863778,\\\"h\\\":43.00000013957801,\\\"i\\\":\\\"es-drager-1763379412964-5\\\",\\\"y\\\":754.5967136818532,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"76.07810699999999%\\\",\\\"left\\\":\\\"53.55297100000001%\\\",\\\"width\\\":\\\"8.471227999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.335241%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同即将到期提醒\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":163.99999475010551,\\\"height\\\":43.00000013957801},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":163.99999475010551,\\\"x\\\":716.5673937336227,\\\"h\\\":43.00000013957801,\\\"i\\\":\\\"es-drager-1763379399584-4\\\",\\\"y\\\":754.7256767549129,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"76.09110899999999%\\\",\\\"left\\\":\\\"37.013451%\\\",\\\"width\\\":\\\"8.471227999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.335241%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目审批通过提醒\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":163.99999475010551,\\\"height\\\":43.00000013957801},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":278.00000007233297,\\\"x\\\":998.8393905981011,\\\"h\\\":164.99999961291928,\\\"i\\\":\\\"es-drager-1763379229297-3\\\",\\\"y\\\":801.8241475579845,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"80.83955599999999%\\\",\\\"left\\\":\\\"51.59388100000001%\\\",\\\"width\\\":\\\"14.359765%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"16.635226999999997%\\\"},\\\"componentName\\\":\\\"滚动列表(多行+序号)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"JS-CG-12354653合同剩余3天\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 131.73\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"JS-CG-12354653合同剩余3天\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 11.04\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"JS-CG-12354653合同剩余3天\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 36.81\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"JS-CG-12354653合同剩余3天\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 24.64\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"JS-CG-12354653合同剩余3天\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 24.64\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":278.00000007233297,\\\"height\\\":164.99999961291928},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"showIndex\\\":true,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"marginRight\\\":18,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":13,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#41AAE0\\\",\\\"marginLeft\\\":10},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":true},\\\"name\\\":\\\"标题\\\",\\\"width\\\":250,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"title\\\",\\\"marginLeft\\\":0}],\\\"itemsPerRow\\\":1,\\\"borderRadius\\\":8,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"indexFieldStyle\\\":{\\\"width\\\":28,\\\"textStyle\\\":{\\\"fontSize\\\":21,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#F54100\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#D4BA28\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"marginLeft\\\":15},\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"backgroundColor\\\":\\\"#FFFFFF\\\",\\\"backgroundImg\\\":\\\"\\\",\\\"alternateBackgroundColor\\\":\\\"#F8F9FA\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":10,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"image\\\",\\\"height\\\":33,\\\"marginLeft\\\":37}}}},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":278.00000007233297,\\\"x\\\":667.2450113558968,\\\"h\\\":150.99999772213383,\\\"i\\\":\\\"782fa728-19d6-45f1-afc4-df366e048e7f\\\",\\\"y\\\":818.4126650668006,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"82.512003%\\\",\\\"left\\\":\\\"34.46576099999999%\\\",\\\"width\\\":\\\"14.359765%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"15.223752999999999%\\\"},\\\"componentName\\\":\\\"滚动列表(多行+序号)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"XXXXX项目通过竣工结算审批\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 131.73\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"XXXXXXX项目通过竣工结算审批\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 11.04\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"XXXXXXX项目通过竣工结算审批\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 36.81\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"XXXXX项目通过竣T结算审批\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 24.64\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"XX项目通过竣工结算审批\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 24.64\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":278.00000007233297,\\\"height\\\":150.99999772213383},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"showIndex\\\":true,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"marginRight\\\":18,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":13,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#41AAE0\\\",\\\"marginLeft\\\":10},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":true},\\\"name\\\":\\\"标题\\\",\\\"width\\\":250,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"title\\\",\\\"marginLeft\\\":0}],\\\"itemsPerRow\\\":1,\\\"borderRadius\\\":8,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"indexFieldStyle\\\":{\\\"width\\\":28,\\\"textStyle\\\":{\\\"fontSize\\\":21,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#F54100\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#D4BA28\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"marginLeft\\\":15},\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"backgroundColor\\\":\\\"#FFFFFF\\\",\\\"backgroundImg\\\":\\\"\\\",\\\"alternateBackgroundColor\\\":\\\"#F8F9FA\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":10,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"image\\\",\\\"height\\\":33,\\\"marginLeft\\\":37}}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":286.0000068990387,\\\"x\\\":990.8558007531537,\\\"h\\\":184.000003595944,\\\"i\\\":\\\"es-drager-1763378891880-2\\\",\\\"y\\\":797.6389179343269,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"80.417603%\\\",\\\"left\\\":\\\"51.181498000000005%\\\",\\\"width\\\":\\\"14.772995999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"18.550799000000005%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":286.0000068990387,\\\"height\\\":184.000003595944},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_14_1763552764377.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":297.9999880996249,\\\"x\\\":657.995300512122,\\\"h\\\":179.00000150370474,\\\"i\\\":\\\"es-drager-1763378858332-1\\\",\\\"y\\\":801.5662412492858,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"80.81355399999998%\\\",\\\"left\\\":\\\"33.987978%\\\",\\\"width\\\":\\\"15.392840999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"18.04670099999999%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":297.9999880996249,\\\"height\\\":179.00000150370474},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_14_1763552764377.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":1164.5720932307152,\\\"h\\\":120.00000062018773,\\\"i\\\":\\\"es-drager-1763118788337-7\\\",\\\"y\\\":499.0926174630956,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.318297%\\\",\\\"left\\\":\\\"60.154609999999984%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.098347%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":120.00000062018773},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":793.599047126823,\\\"h\\\":120.00000062018773,\\\"i\\\":\\\"es-drager-1763118782377-6\\\",\\\"y\\\":509.2215748019232,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"51.339493999999995%\\\",\\\"left\\\":\\\"40.992430999999996%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.098347%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":120.00000062018773},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":948.1946087239393,\\\"h\\\":120.00000062018773,\\\"i\\\":\\\"es-drager-1763118776146-5\\\",\\\"y\\\":394.13364690597933,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"39.73638%\\\",\\\"left\\\":\\\"48.977883999999996%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.098347%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":120.00000062018773},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":1067.2098470962017,\\\"h\\\":120.00000062018773,\\\"i\\\":\\\"es-drager-1763118767012-4\\\",\\\"y\\\":290.3118366626732,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"29.26911099999999%\\\",\\\"left\\\":\\\"55.12547699999999%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.098347%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":120.00000062018773},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":923.445466652849,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763118663383-3\\\",\\\"y\\\":222.41851171132498,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"22.424135999999997%\\\",\\\"left\\\":\\\"47.699495999999996%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":902.5017538498712,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763118651031-2\\\",\\\"y\\\":192.2977785332007,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"19.387376999999997%\\\",\\\"left\\\":\\\"46.617672999999996%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"994,150\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":80.00001018811254,\\\"x\\\":911.429049110856,\\\"h\\\":39.00000243327086,\\\"i\\\":\\\"es-drager-1763118614581-1\\\",\\\"y\\\":305.06330981205195,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"30.756348%\\\",\\\"left\\\":\\\"47.078802%\\\",\\\"width\\\":\\\"4.132306999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.931963%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":80.00001018811254,\\\"height\\\":39.00000243327086},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C3D3E6\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":904.0093671015944,\\\"h\\\":120.00000062018773,\\\"i\\\":\\\"5bf358de-c9b6-45d3-8965-ca7a70dafc6b\\\",\\\"y\\\":194.2157099762253,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"19.580741999999994%\\\",\\\"left\\\":\\\"46.69554699999999%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.098347%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":120.00000062018773},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JMultipleLine\\\",\\\"visible\\\":true,\\\"w\\\":512.0000109969051,\\\"x\\\":1344.6189907024152,\\\"h\\\":168.0000028520049,\\\"i\\\":\\\"32542357-d15f-4650-a311-f9249a18933e\\\",\\\"y\\\":257.5216908642207,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"25.963222999999996%\\\",\\\"left\\\":\\\"69.45472199999999%\\\",\\\"width\\\":\\\"26.446761999999996%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"16.937686000000003%\\\"},\\\"componentName\\\":\\\"对比折线图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 199,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"目标成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 799,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"目标成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 388,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"目标成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 459,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"目标成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 800,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"目标成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 420,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"目标成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"7月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 580,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"目标成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"8月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 420,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"目标成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"9月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 700,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"目标成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 20,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实际成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 210,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实际成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 220,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实际成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 580,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实际成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 500,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实际成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 800,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实际成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"7月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 810,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实际成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"8月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 850,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实际成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"9月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 990,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实际成本\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":512.0000109969051,\\\"height\\\":168.0000028520049},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"name\\\":\\\"单位(万元)\\\",\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color1\\\":\\\"#e2bd84\\\",\\\"color\\\":\\\"#44F0FFB3\\\"},{\\\"color1\\\":\\\"#3ba272\\\",\\\"color\\\":\\\"#AB315CB3\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":35,\\\"left\\\":20,\\\"bottom\\\":18,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"symbol\\\":\\\"circle\\\",\\\"symbolSize\\\":6,\\\"lineType\\\":\\\"area\\\",\\\"label\\\":{\\\"position\\\":\\\"top\\\"}}],\\\"legend\\\":{\\\"t\\\":1},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JPie\\\",\\\"visible\\\":true,\\\"w\\\":450.00000164914417,\\\"x\\\":1373.739734956155,\\\"h\\\":299.99999659111404,\\\"i\\\":\\\"06345dbb-ae74-47bd-89e0-cb97aa16d150\\\",\\\"y\\\":503.14888401369353,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.727248%\\\",\\\"left\\\":\\\"70.95891999999999%\\\",\\\"width\\\":\\\"23.244223999999996%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"30.245866999999993%\\\"},\\\"componentName\\\":\\\"饼图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 179,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"前期阶段\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 79,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"施工阶段\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 19,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"审计阶段\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 17,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"竣工阶段\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":450.0000016491442,\\\"height\\\":299.99999659111404},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"customColor\\\":[{\\\"color1\\\":\\\"#326CF102\\\",\\\"color\\\":\\\"#326CF1\\\"},{\\\"color1\\\":\\\"#35B9FD00\\\",\\\"color\\\":\\\"#35B9FD\\\"},{\\\"color1\\\":\\\"#FFC94700\\\",\\\"color\\\":\\\"#FFC947\\\"},{\\\"color1\\\":\\\"#BD67FF00\\\",\\\"color\\\":\\\"#BD67FF\\\"}],\\\"grid\\\":{\\\"top\\\":49,\\\"left\\\":43,\\\"show\\\":false},\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\",\\\"t\\\":19},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"isRadius\\\":true,\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"outRadius\\\":71,\\\"innerRadius\\\":53,\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JRingProgress\\\",\\\"visible\\\":true,\\\"w\\\":140.99999690293086,\\\"x\\\":1645.6975307150763,\\\"h\\\":116.99999738110213,\\\"i\\\":\\\"es-drager-1763019222261-6\\\",\\\"y\\\":848.5416208558744,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"85.54959099999999%\\\",\\\"left\\\":\\\"85.00658199999998%\\\",\\\"width\\\":\\\"7.28319%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"11.795887999999998%\\\"},\\\"componentName\\\":\\\"基础环形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"占比\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 20\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":140.99999690293086,\\\"height\\\":116.99999738110212},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"color\\\":\\\"#1E90FF\\\",\\\"valueFontSize\\\":16,\\\"body\\\":{\\\"gradient\\\":{\\\"type\\\":\\\"linear\\\"}},\\\"valueFontColor\\\":\\\"#FFFFFF\\\",\\\"valueFontWeight\\\":\\\"normal\\\",\\\"bgColor\\\":\\\"#9AA7B8\\\",\\\"lineHeight\\\":0,\\\"fontSize\\\":16,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"extraInfo\\\":{\\\"endColor\\\":\\\"#4B0082\\\",\\\"enabledGradient\\\":true,\\\"type\\\":\\\"linear\\\",\\\"direction\\\":\\\"to bottom\\\",\\\"startColor\\\":\\\"#FF69B4\\\"}}}},{\\\"component\\\":\\\"JRingProgress\\\",\\\"visible\\\":true,\\\"w\\\":140.99999690293086,\\\"x\\\":1492.6260380707386,\\\"h\\\":116.99999738110213,\\\"i\\\":\\\"es-drager-1763019215391-5\\\",\\\"y\\\":855.0011711071522,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"86.20083999999999%\\\",\\\"left\\\":\\\"77.09985299999998%\\\",\\\"width\\\":\\\"7.28319%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"11.795887999999998%\\\"},\\\"componentName\\\":\\\"基础环形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"占比\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 20\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":140.99999690293086,\\\"height\\\":116.99999738110212},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"valueFontWeight\\\":\\\"normal\\\",\\\"color\\\":\\\"#4FCFE3\\\",\\\"bgColor\\\":\\\"#99ABBF\\\",\\\"valueFontSize\\\":16,\\\"lineHeight\\\":0,\\\"fontSize\\\":16,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"valueFontColor\\\":\\\"#FFFFFF\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"extraInfo\\\":{\\\"endColor\\\":\\\"#00DDFF\\\",\\\"enabledGradient\\\":true,\\\"type\\\":\\\"linear\\\",\\\"direction\\\":\\\"to left\\\",\\\"startColor\\\":\\\"#00FFCC\\\"}}}},{\\\"component\\\":\\\"JRingProgress\\\",\\\"visible\\\":true,\\\"w\\\":140.99999690293086,\\\"x\\\":1328.1594370773037,\\\"h\\\":116.99999738110213,\\\"i\\\":\\\"443b689e-bd4a-4d37-9ae6-dd76589a3b09\\\",\\\"y\\\":851.331773938313,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"85.830893%\\\",\\\"left\\\":\\\"68.60452299999999%\\\",\\\"width\\\":\\\"7.28319%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"11.795887999999998%\\\"},\\\"componentName\\\":\\\"基础环形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"占比\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 60\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":140.99999690293086,\\\"height\\\":116.99999738110212},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"color\\\":\\\"#00AEFF\\\",\\\"valueFontSize\\\":16,\\\"body\\\":{\\\"gradient\\\":{\\\"type\\\":\\\"linear\\\"}},\\\"valueFontColor\\\":\\\"#FFFFFF\\\",\\\"valueFontWeight\\\":\\\"normal\\\",\\\"bgColor\\\":\\\"#6C849E\\\",\\\"lineHeight\\\":0,\\\"fontSize\\\":16,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"extraInfo\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"enabledGradient\\\":true,\\\"type\\\":\\\"linear\\\",\\\"direction\\\":\\\"to bottom\\\",\\\"startColor\\\":\\\"#00D4FF\\\"}}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":178.00000185692846,\\\"x\\\":1592.885087740047,\\\"h\\\":35.00000472696371,\\\"i\\\":\\\"es-drager-1763019064412-4\\\",\\\"y\\\":808.8382231534828,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"81.54671199999999%\\\",\\\"left\\\":\\\"82.27861699999998%\\\",\\\"width\\\":\\\"9.194381999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.5286850000000007%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"未审批流程数量\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":178.00000185692846,\\\"height\\\":35.00000472696371},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FF5A00\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":1719.0199335729192,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763019023655-3\\\",\\\"y\\\":470.7151273998363,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"47.457290999999984%\\\",\\\"left\\\":\\\"88.79396499999999%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"800\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":1603.0937787623684,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763019013776-2\\\",\\\"y\\\":481.71511613282587,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"48.56630499999999%\\\",\\\"left\\\":\\\"82.80593499999999%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#708489\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":105.99999849552168,\\\"x\\\":1387.361086701876,\\\"h\\\":39.99999690049243,\\\"i\\\":\\\"es-drager-1763019008535-1\\\",\\\"y\\\":502.4490098867766,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.65668699999999%\\\",\\\"left\\\":\\\"71.662515%\\\",\\\"width\\\":\\\"5.475305999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.032781999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"已归档资料数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":105.9999984955217,\\\"height\\\":39.99999690049243},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#7B959F\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":1789.2133526339042,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763018083020-24\\\",\\\"y\\\":813.4384516216891,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"82.010505%\\\",\\\"left\\\":\\\"92.41972399999999%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FF5A00\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":1726.616640206237,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763018077243-23\\\",\\\"y\\\":802.4384529699892,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"80.90148999999998%\\\",\\\"left\\\":\\\"89.18636399999998%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"100\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FF5A00\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":72.00000336140681,\\\"x\\\":1464.6588384609615,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763018057189-21\\\",\\\"y\\\":802.567416043049,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"80.914492%\\\",\\\"left\\\":\\\"75.65523999999999%\\\",\\\"width\\\":\\\"3.719076%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"1000\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":72.00000336140681,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":1515.8604812588278,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763018049207-20\\\",\\\"y\\\":809.7690544528497,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"81.64055799999998%\\\",\\\"left\\\":\\\"78.30000099999998%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":178.00000185692846,\\\"x\\\":1306.871006376694,\\\"h\\\":35.00000472696371,\\\"i\\\":\\\"es-drager-1763018038037-18\\\",\\\"y\\\":811.4994230815718,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"81.81501299999998%\\\",\\\"left\\\":\\\"67.50489399999998%\\\",\\\"width\\\":\\\"9.194381999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.5286850000000007%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"本月采购任务数量\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":178.00000185692846,\\\"height\\\":35.00000472696371},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#0085FF\\\",\\\"direction\\\":\\\"to top\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":1776.6810972629544,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763018002072-16\\\",\\\"y\\\":479.3118423508563,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"48.32400799999999%\\\",\\\"left\\\":\\\"91.77238499999999%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#708489\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":1543.1582629496838,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763017986232-14\\\",\\\"y\\\":473.37631740921506,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"47.725590999999994%\\\",\\\"left\\\":\\\"79.710036%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"800\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":105.99999849552168,\\\"x\\\":1725.543960813224,\\\"h\\\":39.99999690049243,\\\"i\\\":\\\"es-drager-1763017981686-13\\\",\\\"y\\\":502.57796304112605,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.669688%\\\",\\\"left\\\":\\\"89.13095599999998%\\\",\\\"width\\\":\\\"5.475305999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.032781999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"需补录数量\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":105.9999984955217,\\\"height\\\":39.99999690049243},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#7B959F\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":105.99999849552168,\\\"x\\\":1548.2872339334822,\\\"h\\\":39.99999690049243,\\\"i\\\":\\\"es-drager-1763017976329-12\\\",\\\"y\\\":503.8440765092855,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.797337%\\\",\\\"left\\\":\\\"79.97496699999999%\\\",\\\"width\\\":\\\"5.475305999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.032781999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"未归档数据\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":105.9999984955217,\\\"height\\\":39.99999690049243},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#7B959F\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":1.0000032732942556,\\\"x\\\":1677.4794909434468,\\\"h\\\":46.000003378663585,\\\"i\\\":\\\"es-drager-1763017967343-11\\\",\\\"y\\\":485.29425303671803,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"48.92715199999999%\\\",\\\"left\\\":\\\"86.64824199999998%\\\",\\\"width\\\":\\\"0.05165399999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.637699999999999%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1.0000032732942556,\\\"height\\\":46.000003378663585},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_10_1763552829448.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":2.0000065465885113,\\\"x\\\":1520.4806613256508,\\\"h\\\":46.99999784588518,\\\"i\\\":\\\"es-drager-1763017957814-10\\\",\\\"y\\\":487.8264898917473,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"49.18245099999999%\\\",\\\"left\\\":\\\"78.53865099999999%\\\",\\\"width\\\":\\\"0.10330799999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.738519000000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":2.0000065465885113,\\\"height\\\":46.999997845885176},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_10_1763552829448.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":1446.3528583792263,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763017938561-8\\\",\\\"y\\\":481.97303236023504,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"48.592307999999996%\\\",\\\"left\\\":\\\"74.70966599999998%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#708489\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":1377.425560317069,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763017918861-7\\\",\\\"y\\\":472.23915709540506,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"47.610943%\\\",\\\"left\\\":\\\"71.14930699999998%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"1230\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":1402.7479415743262,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763017900379-6\\\",\\\"y\\\":170.90269362302482,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"17.230333999999996%\\\",\\\"left\\\":\\\"72.457305%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"2200\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":1470.4091186376554,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763017893992-5\\\",\\\"y\\\":181.90268235601428,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.339347999999998%\\\",\\\"left\\\":\\\"75.95226399999999%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":105.99999849552168,\\\"x\\\":1334.3129980877375,\\\"h\\\":39.99999690049243,\\\"i\\\":\\\"es-drager-1763017881010-4\\\",\\\"y\\\":173.38686440729214,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"17.480787%\\\",\\\"left\\\":\\\"68.92237799999998%\\\",\\\"width\\\":\\\"5.475305999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.032781999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"总额\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":105.9999984955217,\\\"height\\\":39.99999690049243},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#8699B0\\\",\\\"letterSpacing\\\":0,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":184.99998605069177,\\\"x\\\":389.9085438694022,\\\"h\\\":43.00000013957801,\\\"i\\\":\\\"es-drager-1763017409384-5\\\",\\\"y\\\":739.5322357873163,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"74.55931299999999%\\\",\\\"left\\\":\\\"20.140269999999997%\\\",\\\"width\\\":\\\"9.555958000000004%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.335241%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"9000万元(不含税)\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":184.99998605069177,\\\"height\\\":43.00000013957801},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":152.9999974631653,\\\"x\\\":244.3048032410551,\\\"h\\\":43.00000013957801,\\\"i\\\":\\\"es-drager-1763017400479-4\\\",\\\"y\\\":740.7983591741861,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"74.68696299999999%\\\",\\\"left\\\":\\\"12.619278999999997%\\\",\\\"width\\\":\\\"7.903035999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.335241%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"9000万元(含税)\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":152.9999974631653,\\\"height\\\":43.00000013957801},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":104.00001130858149,\\\"x\\\":146.94255710654164,\\\"h\\\":43.00000013957801,\\\"i\\\":\\\"es-drager-1763017390547-3\\\",\\\"y\\\":738.3950754735062,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"74.444665%\\\",\\\"left\\\":\\\"7.590145999999999%\\\",\\\"width\\\":\\\"5.371999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.335241%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"金额总计：\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":104.00001130858149,\\\"height\\\":43.00000013957801},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":2.0000065465885113,\\\"x\\\":356.9167604994608,\\\"h\\\":46.99999784588518,\\\"i\\\":\\\"es-drager-1763017303728-1\\\",\\\"y\\\":449.8429073101763,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.35296299999999%\\\",\\\"left\\\":\\\"18.436117999999997%\\\",\\\"width\\\":\\\"0.10330799999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.738519000000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":2.0000065465885113,\\\"height\\\":46.999997845885176},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_10_1763552829448.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":2.0000065465885113,\\\"x\\\":188.6517965095428,\\\"h\\\":46.99999784588518,\\\"i\\\":\\\"400b89c1-02d8-4517-95e5-f56241d063f2\\\",\\\"y\\\":447.4396236094965,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.110665000000004%\\\",\\\"left\\\":\\\"9.744587999999998%\\\",\\\"width\\\":\\\"0.10330799999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.738519000000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":2.0000065465885113,\\\"height\\\":46.999997845885176},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_10_1763552829448.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":0,\\\"x\\\":197.5146628609848,\\\"h\\\":57.99999649758506,\\\"i\\\":\\\"es-drager-1763016996412-1\\\",\\\"y\\\":449.71395415582697,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.339961999999986%\\\",\\\"left\\\":\\\"10.202389%\\\",\\\"width\\\":\\\"0%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.847534%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":0,\\\"height\\\":57.99999649758506},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#F0111100\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_10_1763552829448.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":95.0000012085815,\\\"x\\\":373.7924884840798,\\\"h\\\":35.999999194185264,\\\"i\\\":\\\"es-drager-1763016703941-11\\\",\\\"y\\\":504.09847159449055,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.82298499999999%\\\",\\\"left\\\":\\\"19.307814%\\\",\\\"width\\\":\\\"4.907114%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.6295039999999985%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同类型\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":95.0000012085815,\\\"height\\\":35.999999194185264},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":105.99999849552168,\\\"x\\\":388.65065072110207,\\\"h\\\":39.99999690049243,\\\"i\\\":\\\"es-drager-1763016588015-10\\\",\\\"y\\\":460.9249733720053,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"46.470252%\\\",\\\"left\\\":\\\"20.075294999999997%\\\",\\\"width\\\":\\\"5.475305999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.032781999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"累计未付款\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":105.9999984955217,\\\"height\\\":39.99999690049243},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#7B959F\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":105.99999849552168,\\\"x\\\":222.78897411151232,\\\"h\\\":39.99999690049243,\\\"i\\\":\\\"es-drager-1763016583354-9\\\",\\\"y\\\":460.9249733720053,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"46.470252%\\\",\\\"left\\\":\\\"11.507903999999998%\\\",\\\"width\\\":\\\"5.475305999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.032781999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"累计已付款\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":105.9999984955217,\\\"height\\\":39.99999690049243},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#7B959F\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":447.38451316379843,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763016573207-8\\\",\\\"y\\\":442.7233263917942,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"44.635169999999995%\\\",\\\"left\\\":\\\"23.109123999999998%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#708489\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":275.1922509197187,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763016567041-7\\\",\\\"y\\\":442.7233263917942,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"44.635169999999995%\\\",\\\"left\\\":\\\"14.214733999999998%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#708489\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":382.25555873847594,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763016557285-6\\\",\\\"y\\\":430.45721427193484,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"43.39850599999999%\\\",\\\"left\\\":\\\"19.744963999999996%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"1230\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":217.66002248736228,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763016551841-5\\\",\\\"y\\\":431.7233277400944,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"43.52615500000001%\\\",\\\"left\\\":\\\"11.242974%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"800\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":0,\\\"x\\\":187.5146301280422,\\\"h\\\":57.99999649758506,\\\"i\\\":\\\"es-drager-1763016537923-4\\\",\\\"y\\\":439.7139499713487,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"44.331765999999995%\\\",\\\"left\\\":\\\"9.685848999999997%\\\",\\\"width\\\":\\\"0%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.847534%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":0,\\\"height\\\":57.99999649758506},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_10_1763552829448.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":105.99999849552168,\\\"x\\\":53.257889122766706,\\\"h\\\":39.99999690049243,\\\"i\\\":\\\"es-drager-1763016385655-3\\\",\\\"y\\\":461.05392652635453,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"46.48325299999999%\\\",\\\"left\\\":\\\"2.7509739999999994%\\\",\\\"width\\\":\\\"5.475305999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.032781999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同总金额\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":105.9999984955217,\\\"height\\\":39.99999690049243},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#7B959F\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":113.25791128358735,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763016372630-2\\\",\\\"y\\\":437.787805836085,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"44.137573%\\\",\\\"left\\\":\\\"5.850204999999999%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#708489\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":50.66119885592028,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763016365675-1\\\",\\\"y\\\":426.787807184385,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"43.02855799999999%\\\",\\\"left\\\":\\\"2.6168449999999996%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"1230\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JLine\\\",\\\"visible\\\":true,\\\"w\\\":552.0000064111372,\\\"x\\\":15.451341860937866,\\\"h\\\":233.00000029498267,\\\"i\\\":\\\"3929a3a9-910f-45e8-8950-5ba4570f2579\\\",\\\"y\\\":758.8710430813375,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"76.509043%\\\",\\\"left\\\":\\\"0.7981209999999999%\\\",\\\"width\\\":\\\"28.512914999999992%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"23.490956999999995%\\\"},\\\"componentName\\\":\\\"基础折线图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 150,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1日\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 830,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5日\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 300,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"10日\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 780,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"15日\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 900,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"20\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 430,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"25日\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 900,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"30\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":552.0000064111372,\\\"height\\\":233.00000029498267},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#89B9F063\\\"},\\\"show\\\":true,\\\"interval\\\":2},\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color1\\\":\\\"#1e90ff\\\",\\\"color\\\":\\\"#46B4F9\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":30,\\\"left\\\":0,\\\"bottom\\\":18,\\\"show\\\":false,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"symbol\\\":\\\"circle\\\",\\\"areaStyleOpacity\\\":0.1,\\\"data\\\":[],\\\"symbolSize\\\":6,\\\"lineType\\\":\\\"area\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"position\\\":\\\"top\\\"},\\\"type\\\":\\\"line\\\"}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"textAlign\\\":\\\"left\\\",\\\"left\\\":10,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JRing\\\",\\\"visible\\\":true,\\\"w\\\":472.99999949631894,\\\"x\\\":0,\\\"h\\\":240.00000124037547,\\\"i\\\":\\\"d8501550-3c20-41f7-92c8-06ba3e833884\\\",\\\"y\\\":468.9918010555223,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"47.283546%\\\",\\\"left\\\":\\\"0%\\\",\\\"width\\\":\\\"24.432261999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"24.196694%\\\"},\\\"componentName\\\":\\\"饼状环形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 350,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"监理\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 250,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"施工\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 400,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"采购\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":472.99999949631894,\\\"height\\\":240.00000124037547},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":480,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"customColor\\\":[{\\\"color1\\\":\\\"#1E90FF38\\\",\\\"color\\\":\\\"#2A7DFB\\\"},{\\\"color1\\\":\\\"#2BE4E3\\\",\\\"color\\\":\\\"#2BE4E34C\\\"},{\\\"color1\\\":\\\"#FCA52F4F\\\",\\\"color\\\":\\\"#FCA52F\\\"}],\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":50,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":14,\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\",\\\"t\\\":31,\\\"show\\\":true},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"outRadius\\\":65,\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"innerRadius\\\":77,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":154.00000073645958,\\\"x\\\":1341.18520860272,\\\"h\\\":35.999999194185264,\\\"i\\\":\\\"es-drager-1762488458149-6\\\",\\\"y\\\":766.0480731705519,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"77.23262799999999%\\\",\\\"left\\\":\\\"69.27735399999999%\\\",\\\"width\\\":\\\"7.95469%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.6295039999999985%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"采购与审批提醒\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":154.00000073645958,\\\"height\\\":35.999999194185264},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":192.00000896375147,\\\"x\\\":1348.781934595686,\\\"h\\\":35.999999194185264,\\\"i\\\":\\\"es-drager-1762488430111-5\\\",\\\"y\\\":434.1688155536699,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"43.772707999999994%\\\",\\\"left\\\":\\\"69.669754%\\\",\\\"width\\\":\\\"9.917535999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.6295039999999985%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"档案归档与资料管理\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":192.0000089637515,\\\"height\\\":35.999999194185264},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":180.00002776316535,\\\"x\\\":1316.2579190479719,\\\"h\\\":35.999999194185264,\\\"i\\\":\\\"es-drager-1762488401037-4\\\",\\\"y\\\":11.532246572286056,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.1626759999999992%\\\",\\\"left\\\":\\\"67.98976399999998%\\\",\\\"width\\\":\\\"9.297691%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.6295039999999985%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"成本与投资控制\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":180.00002776316535,\\\"height\\\":35.999999194185264},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":95.0000012085815,\\\"x\\\":687.9191023369988,\\\"h\\\":35.999999194185264,\\\"i\\\":\\\"es-drager-1762488353166-3\\\",\\\"y\\\":711.8710452354521,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"71.770524%\\\",\\\"left\\\":\\\"35.53365699999999%\\\",\\\"width\\\":\\\"4.907114%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.6295039999999985%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"实时动态\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":95.0000012085815,\\\"height\\\":35.999999194185264},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":104.00001130858149,\\\"x\\\":34.386878345744435,\\\"h\\\":43.00000013957801,\\\"i\\\":\\\"es-drager-1762488324502-2\\\",\\\"y\\\":696.7420858043853,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"70.24522899999998%\\\",\\\"left\\\":\\\"1.776214%\\\",\\\"width\\\":\\\"5.371999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.335241%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"金额统计\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":104.00001130858149,\\\"height\\\":43.00000013957801},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":169.99999503022275,\\\"x\\\":36.71747024670575,\\\"h\\\":60.000005269449076,\\\"i\\\":\\\"es-drager-1762488293431-1\\\",\\\"y\\\":373.32239712935564,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"37.63819899999999%\\\",\\\"left\\\":\\\"1.896598%\\\",\\\"width\\\":\\\"8.781150999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.049174%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同与资金执行\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":169.99999503022275,\\\"height\\\":60.000005269449076},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":559.9999938781947,\\\"x\\\":1314.9191025697774,\\\"h\\\":37.000003580117294,\\\"i\\\":\\\"es-drager-1762486958682-7\\\",\\\"y\\\":767.3141866387114,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"77.360277%\\\",\\\"left\\\":\\\"67.92060899999998%\\\",\\\"width\\\":\\\"28.926144999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7303240000000013%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146619422332997632\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":559.9999938781947,\\\"height\\\":37.000003580117294},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":559.9999938781947,\\\"x\\\":1326.5803092847598,\\\"h\\\":37.000003580117294,\\\"i\\\":\\\"es-drager-1762486938386-6\\\",\\\"y\\\":436.43494332647174,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"44.00117799999999%\\\",\\\"left\\\":\\\"68.522955%\\\",\\\"width\\\":\\\"28.926144999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7303240000000013%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146619422374940672\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":559.9999938781947,\\\"height\\\":37.000003580117294},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":559.9999938781947,\\\"x\\\":1306.0562749376322,\\\"h\\\":37.000003580117294,\\\"i\\\":\\\"es-drager-1762486909420-5\\\",\\\"y\\\":15.532234359882779,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.565952999999999%\\\",\\\"left\\\":\\\"67.46281%\\\",\\\"width\\\":\\\"28.926144999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7303240000000013%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146619422395912192\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":559.9999938781947,\\\"height\\\":37.000003580117294},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":623.9999904128958,\\\"x\\\":662.9191173028839,\\\"h\\\":37.000003580117294,\\\"i\\\":\\\"es-drager-1762486901803-4\\\",\\\"y\\\":715.8710429417594,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"72.173802%\\\",\\\"left\\\":\\\"34.24231199999999%\\\",\\\"width\\\":\\\"32.23199%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7303240000000013%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146619422416883712\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":623.9999904128958,\\\"height\\\":37.000003580117294},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":559.9999938781947,\\\"x\\\":12.653001497397423,\\\"h\\\":37.000003580117294,\\\"i\\\":\\\"es-drager-1762486889055-3\\\",\\\"y\\\":702.7420922825565,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"70.85014699999999%\\\",\\\"left\\\":\\\"0.6535759999999999%\\\",\\\"width\\\":\\\"28.926144999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7303240000000013%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146619422433660928\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":559.9999938781947,\\\"height\\\":37.000003580117294},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":559.9999938781947,\\\"x\\\":23.919097150222747,\\\"h\\\":37.000003580117294,\\\"i\\\":\\\"es-drager-1762486883913-2\\\",\\\"y\\\":386.3223946342091,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"38.94885299999999%\\\",\\\"left\\\":\\\"1.2355129999999999%\\\",\\\"width\\\":\\\"28.926144999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7303240000000013%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146619422450438144\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":559.9999938781947,\\\"height\\\":37.000003580117294},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JPictorialBar\\\",\\\"visible\\\":true,\\\"w\\\":450.00000164914417,\\\"x\\\":191.58031114825323,\\\"h\\\":224.00000049643637,\\\"i\\\":\\\"68308968-04f1-4f24-b8de-632455eb043c\\\",\\\"y\\\":73.06447439212201,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"7.366327999999999%\\\",\\\"left\\\":\\\"9.895856999999998%\\\",\\\"width\\\":\\\"23.244223999999996%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"22.583580999999995%\\\"},\\\"componentName\\\":\\\"象形柱图\\\",\\\"pageCompId\\\":\\\"1146619422463021056\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/pictogram\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"前期\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3900,\\\\n    \\\\\\\"symbol\\\\\\\": \\\\\\\"\\\\\\\",\\\\n    \\\\\\\"symbolSize\\\\\\\": [\\\\n      60,\\\\n      60\\\\n    ]\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"统计\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3000,\\\\n    \\\\\\\"symbol\\\\\\\": \\\\\\\"\\\\\\\",\\\\n    \\\\\\\"symbolSize\\\\\\\": [\\\\n      65,\\\\n      35\\\\n    ]\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"施工\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2000,\\\\n    \\\\\\\"symbol\\\\\\\": \\\\\\\"\\\\\\\",\\\\n    \\\\\\\"symbolSize\\\\\\\": [\\\\n      50,\\\\n      60\\\\n    ]\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"竣工\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2900,\\\\n    \\\\\\\"symbol\\\\\\\": \\\\\\\"\\\\\\\",\\\\n    \\\\\\\"symbolSize\\\\\\\": [\\\\n      50,\\\\n      30\\\\n    ]\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":450.0000016491442,\\\"height\\\":224.00000049643634},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#4A90E242\\\"},\\\"show\\\":true},\\\"name\\\":\\\"单位(个)\\\",\\\"yCustomUnit\\\":\\\"个\\\",\\\"yUnit\\\":\\\"CUSTOM\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"type\\\":\\\"category\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":33,\\\"left\\\":29,\\\"bottom\\\":18,\\\"right\\\":50,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barCategoryGap\\\":\\\"22%\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"barOpacity\\\":0.8,\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"barColor\\\":\\\"#4A90E2\\\",\\\"body\\\":{\\\"gradient\\\":{\\\"type\\\":\\\"linear\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"barGradient\\\":{\\\"endColor\\\":\\\"#7357FB68\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#06E5FF\\\",\\\"direction\\\":\\\"to bottom\\\"}}}},{\\\"visible\\\":true,\\\"h\\\":39.99999690049243,\\\"i\\\":\\\"b0c2258f-39ba-48dc-95b1-5094042732c1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":105.99999849552168,\\\"x\\\":63.515831090363434,\\\"y\\\":173.773743707761,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"17.519791999999995%\\\",\\\"left\\\":\\\"3.2808360000000003%\\\",\\\"width\\\":\\\"5.475305999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.032781999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"在建项目数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":105.9999984955217,\\\"height\\\":39.99999690049243},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#879FA9\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":126.0480565295428,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"f5a20b4d-547f-403e-8164-dcfcafe4d980\\\",\\\"y\\\":154.30597334068014,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.55706%\\\",\\\"left\\\":\\\"6.510864999999999%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#7A9AE9\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#F1F0FF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":52.05629383172334,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"6b21b6f5-8acb-4f3e-8b78-8c294a480972\\\",\\\"y\\\":142.03986122082082,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"14.320396000000002%\\\",\\\"left\\\":\\\"2.688907%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"3531\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"fontFamily\\\":\\\"DIGITALDREAMFAT\\\",\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#7A9AE9\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#F1F0FF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":28,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":144.99999063645956,\\\"x\\\":39.84641532426729,\\\"h\\\":59.999995350738644,\\\"i\\\":\\\"291a3240-8c51-43d7-8439-01a320e34d6d\\\",\\\"y\\\":0,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0%\\\",\\\"left\\\":\\\"2.0582199999999995%\\\",\\\"width\\\":\\\"7.489804999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.049173%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目总体概览\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":144.99999063645956,\\\"height\\\":59.99999535073864},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":571.9999944384291,\\\"x\\\":18.185233955287224,\\\"h\\\":37.000003580117294,\\\"i\\\":\\\"7d88daeb-170a-488b-83a6-a5602963ead6\\\",\\\"y\\\":14.266120891723347,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.438304%\\\",\\\"left\\\":\\\"0.939337%\\\",\\\"width\\\":\\\"29.545990999999994%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7303240000000013%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146619422567878656\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":571.9999944384291,\\\"height\\\":37.000003580117294},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":165.00001738304806,\\\"x\\\":31.910876126400943,\\\"h\\\":145.00000116267307,\\\"i\\\":\\\"3b982fd0-aee7-496b-8e5e-6c2428fdf509\\\",\\\"y\\\":106.8534541686754,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"10.772917999999999%\\\",\\\"left\\\":\\\"1.6483189999999999%\\\",\\\"width\\\":\\\"8.522882999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"14.618835999999996%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":165.00001738304806,\\\"height\\\":145.00000116267307},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/组 146 拷贝_1763552659762.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":1162.000009076858,\\\"x\\\":401.48886597378663,\\\"h\\\":774.9999969796257,\\\"i\\\":\\\"es-drager-1762944604977-2\\\",\\\"y\\\":26.95897560928492,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"2.717992000000001%\\\",\\\"left\\\":\\\"20.738437999999995%\\\",\\\"width\\\":\\\"60.021751999999985%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"78.13515699999999%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1162.000009076858,\\\"height\\\":774.9999969796257},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/建设地图背景_1763552692372.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}}]},\\\"component\\\":\\\"JGroup\\\",\\\"w\\\":1935.9648300117237,\\\"x\\\":-2,\\\"y\\\":84,\\\"componentName\\\":\\\"建设\\\",\\\"pageCompId\\\":\\\"1151112776882114560\\\",\\\"equalProportion\\\":false,\\\"key\\\":\\\"3eb04442-3a1d-48c3-8729-1e6ccdf2407d\\\",\\\"group\\\":true},{\\\"visible\\\":false,\\\"h\\\":993.0175920371283,\\\"i\\\":\\\"es-drager-1762481722941-1\\\",\\\"props\\\":{\\\"elements\\\":[{\\\"component\\\":\\\"JBreakRing\\\",\\\"visible\\\":true,\\\"w\\\":714.0000045348538,\\\"x\\\":0,\\\"h\\\":200.000004320926,\\\"i\\\":\\\"aca7fa88-9971-4e8c-8a35-8df42aef1ae2\\\",\\\"y\\\":793.0175877162023,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"79.85936946890986%\\\",\\\"left\\\":\\\"0%\\\",\\\"width\\\":\\\"35.018293000000014%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"20.14063053109014%\\\"},\\\"componentName\\\":\\\"多色环形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":400,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 109,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"受限空间\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 171,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"临电\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 73,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"动火\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 29,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"高处\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 73,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"动土\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 88,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"吊装\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"断路\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":714.0000045348538,\\\"height\\\":200.000004320926},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":550,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#326CF1B3\\\"},{\\\"color\\\":\\\"#0036FFB3\\\"},{\\\"color\\\":\\\"#FC00FFB3\\\"},{\\\"color\\\":\\\"#FF5B01B3\\\"},{\\\"color\\\":\\\"#FFEB0BB3\\\"},{\\\"color\\\":\\\"#00FF96B3\\\"},{\\\"color\\\":\\\"#00FCFFB3\\\"}],\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":50,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":14,\\\"fontWeight\\\":\\\"bold\\\"}},\\\"itemStyle\\\":{\\\"shadowBlur\\\":21,\\\"borderWidth\\\":5},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true,\\\"fontSize\\\":12,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"length2\\\":36,\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\",\\\"t\\\":13},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"outRadius\\\":68,\\\"title\\\":{\\\"subtext\\\":\\\"{total}条\\\",\\\"top\\\":33,\\\"textAlign\\\":\\\"\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":true,\\\"customTop\\\":true,\\\"text\\\":\\\"总数\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontSize\\\":22,\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontSize\\\":24}},\\\"innerRadius\\\":60,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JListProgress\\\",\\\"visible\\\":true,\\\"w\\\":498.00000950250893,\\\"x\\\":878.5580325518055,\\\"h\\\":71.00000054406586,\\\"i\\\":\\\"es-drager-1763373026447-1\\\",\\\"y\\\":619.4302483462973,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"62.37857751095483%\\\",\\\"left\\\":\\\"43.089079000000005%\\\",\\\"width\\\":\\\"24.424524000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"7.14992373885469%\\\"},\\\"componentName\\\":\\\"列表进度图\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"作业投入\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 19,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-12-31\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-06-15\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"作业进度\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 685,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-20\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-05-30\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 685\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":498.00000950250893,\\\"height\\\":71.00000054406586},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":1200,\\\"dataType\\\":1,\\\"h\\\":325,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"beginFields\\\":[{\\\"name\\\":\\\"名称\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"title\\\"}],\\\"endCurrent\\\":0,\\\"endInfo\\\":{\\\"width\\\":41},\\\"scroll\\\":{\\\"count\\\":1,\\\"interval\\\":3000,\\\"enabled\\\":false,\\\"direction\\\":\\\"down\\\"},\\\"centerTopFields\\\":[],\\\"body\\\":{\\\"gradient\\\":{\\\"type\\\":\\\"linear\\\"}},\\\"endFields\\\":[{\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"name\\\":\\\"value\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CFEAFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"value\\\",\\\"marginLeft\\\":0}],\\\"beginCurrent\\\":0,\\\"progressSection\\\":{\\\"marginRight\\\":8,\\\"marginLeft\\\":8},\\\"bar\\\":{\\\"border\\\":{\\\"padding\\\":8,\\\"color\\\":\\\"#4ECBFC5E\\\",\\\"width\\\":2,\\\"enabled\\\":false},\\\"total\\\":{\\\"field\\\":\\\"total\\\",\\\"type\\\":\\\"field\\\",\\\"value\\\":0},\\\"borderRadius\\\":6,\\\"background\\\":{\\\"color\\\":\\\"#5A97FC4F\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#07203D\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#143B6E\\\"}},\\\"indicatorColor\\\":\\\"#DCFEFFB5\\\",\\\"exceed\\\":{\\\"indicatorColor\\\":\\\"#FEF8C9E1\\\",\\\"fill\\\":{\\\"color\\\":\\\"#FFB347\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FEAF24\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FEF6C8\\\",\\\"direction\\\":\\\"to right\\\"}},\\\"percent\\\":70,\\\"enabled\\\":true},\\\"indicatorSize\\\":15,\\\"fill\\\":{\\\"color\\\":\\\"#33C9FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#24E5F1\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#C5FDFE\\\"}},\\\"valueField\\\":\\\"value\\\",\\\"height\\\":4},\\\"centerTopInfo\\\":{\\\"layout\\\":\\\"horizontal\\\"},\\\"centerTopCurrent\\\":0,\\\"row\\\":{\\\"marginRight\\\":0,\\\"padding\\\":\\\"0 0\\\",\\\"marginBottom\\\":0,\\\"marginTop\\\":10,\\\"height\\\":20,\\\"marginLeft\\\":0},\\\"beginInfo\\\":{\\\"layout\\\":\\\"vertical\\\",\\\"width\\\":85}}}},{\\\"component\\\":\\\"JListProgress\\\",\\\"visible\\\":true,\\\"w\\\":498.00000950250893,\\\"x\\\":881.2192292752404,\\\"h\\\":71.00000054406586,\\\"i\\\":\\\"d99071e1-0ca9-4ec4-8eb5-97b53b13ff72\\\",\\\"y\\\":535.9953136910605,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"53.976416731096535%\\\",\\\"left\\\":\\\"43.219598000000005%\\\",\\\"width\\\":\\\"24.424524000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"7.14992373885469%\\\"},\\\"componentName\\\":\\\"列表进度图\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"作业投入\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 19,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-12-31\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-06-15\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"作业进度\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 685,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-20\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-05-30\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 685\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":498.00000950250893,\\\"height\\\":71.00000054406586},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":1200,\\\"dataType\\\":1,\\\"h\\\":325,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"beginFields\\\":[{\\\"name\\\":\\\"名称\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"title\\\"}],\\\"endCurrent\\\":0,\\\"endInfo\\\":{\\\"width\\\":41},\\\"scroll\\\":{\\\"count\\\":1,\\\"interval\\\":3000,\\\"enabled\\\":false,\\\"direction\\\":\\\"down\\\"},\\\"centerTopFields\\\":[],\\\"body\\\":{\\\"gradient\\\":{\\\"type\\\":\\\"linear\\\"}},\\\"endFields\\\":[{\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"name\\\":\\\"value\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CFEAFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"value\\\",\\\"marginLeft\\\":0}],\\\"beginCurrent\\\":0,\\\"progressSection\\\":{\\\"marginRight\\\":8,\\\"marginLeft\\\":8},\\\"bar\\\":{\\\"border\\\":{\\\"padding\\\":8,\\\"color\\\":\\\"#4ECBFC5E\\\",\\\"width\\\":2,\\\"enabled\\\":false},\\\"total\\\":{\\\"field\\\":\\\"total\\\",\\\"type\\\":\\\"field\\\",\\\"value\\\":0},\\\"borderRadius\\\":6,\\\"background\\\":{\\\"color\\\":\\\"#5A97FC4F\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#07203D\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#143B6E\\\"}},\\\"indicatorColor\\\":\\\"#DCFEFFB3\\\",\\\"exceed\\\":{\\\"indicatorColor\\\":\\\"#FEF8C9BD\\\",\\\"fill\\\":{\\\"color\\\":\\\"#FFB347\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FEAF24\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FEF6C8\\\",\\\"direction\\\":\\\"to right\\\"}},\\\"percent\\\":70,\\\"enabled\\\":true},\\\"indicatorSize\\\":15,\\\"fill\\\":{\\\"color\\\":\\\"#33C9FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#24E5F1\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#C5FDFE\\\"}},\\\"valueField\\\":\\\"value\\\",\\\"height\\\":4},\\\"centerTopInfo\\\":{\\\"layout\\\":\\\"horizontal\\\"},\\\"centerTopCurrent\\\":0,\\\"row\\\":{\\\"marginRight\\\":0,\\\"padding\\\":\\\"0 0\\\",\\\"marginBottom\\\":0,\\\"marginTop\\\":10,\\\"height\\\":20,\\\"marginLeft\\\":0},\\\"beginInfo\\\":{\\\"layout\\\":\\\"vertical\\\",\\\"width\\\":85}}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":323.0000073915475,\\\"x\\\":906.8179276953341,\\\"h\\\":2.99999709522538,\\\"i\\\":\\\"es-drager-1762941799018-34\\\",\\\"y\\\":242.1698934071885,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.387271217460356%\\\",\\\"left\\\":\\\"44.475092%\\\",\\\"width\\\":\\\"15.841609000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"0.3021091589194335%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":323.0000073915475,\\\"height\\\":2.99999709522538},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_26_1763552267080.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371568519-13\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":42.00000866236812,\\\"x\\\":419.7991700328957,\\\"y\\\":217.93813036363792,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.947056337294914%\\\",\\\"left\\\":\\\"20.589146%\\\",\\\"width\\\":\\\"2.0599000000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"条\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":42.00000866236812,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371480202-12\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":42.00000866236812,\\\"x\\\":636.8761097992264,\\\"y\\\":210.70737041841926,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.218896030448274%\\\",\\\"left\\\":\\\"31.235734000000004%\\\",\\\"width\\\":\\\"2.0599000000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"公里\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":42.00000866236812,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371473970-11\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":42.00000866236812,\\\"x\\\":507.799168764197,\\\"y\\\":213.16890192795518,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.46678000846383%\\\",\\\"left\\\":\\\"24.905126000000003%\\\",\\\"width\\\":\\\"2.0599000000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"架次\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":42.00000866236812,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371446932-9\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":52.000002957467785,\\\"x\\\":359.95302146961313,\\\"y\\\":183.01505679779882,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.430192804777217%\\\",\\\"left\\\":\\\"17.653978000000002%\\\",\\\"width\\\":\\\"2.550352000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"56\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":52.000002957467785,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#02DEFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371270168-8\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":52.000002957467785,\\\"x\\\":470.4145734524033,\\\"y\\\":211.78429169116976,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.32734539543296%\\\",\\\"left\\\":\\\"23.07159%\\\",\\\"width\\\":\\\"2.550352000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"45\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":52.000002957467785,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#02DEFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371262441-7\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":52.000002957467785,\\\"x\\\":599.1837985154281,\\\"y\\\":210.39967155575596,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.18790978557903%\\\",\\\"left\\\":\\\"29.387106000000006%\\\",\\\"width\\\":\\\"2.550352000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"80\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":52.000002957467785,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#02DEFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371256473-6\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":52.000002957467785,\\\"x\\\":387.3376428756507,\\\"y\\\":217.3227524355682,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.88508584120256%\\\",\\\"left\\\":\\\"18.997063000000004%\\\",\\\"width\\\":\\\"2.550352000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"17\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":52.000002957467785,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#02DEFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371251576-5\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":83.99999693539274,\\\"x\\\":318.41456637590863,\\\"y\\\":217.630441399603,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.91607108924873%\\\",\\\"left\\\":\\\"15.616715000000003%\\\",\\\"width\\\":\\\"4.119799%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"线上执勤\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":83.99999693539274,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371243864-4\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":42.00000866236812,\\\"x\\\":394.26072212282537,\\\"y\\\":184.09197807054932,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.538642169761907%\\\",\\\"left\\\":\\\"19.336607000000004%\\\",\\\"width\\\":\\\"2.0599000000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"条\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":42.00000866236812,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371236206-3\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":107.00001235920283,\\\"x\\\":605.0299330286167,\\\"y\\\":180.2458264255996,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.15132258189242%\\\",\\\"left\\\":\\\"29.673831%\\\",\\\"width\\\":\\\"5.247840000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"日巡检里程\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":107.00001235920283,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371219393-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":110.9999937657679,\\\"x\\\":484.5684071400704,\\\"y\\\":178.8612062901858,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.01188697203849%\\\",\\\"left\\\":\\\"23.765768000000005%\\\",\\\"width\\\":\\\"5.444020000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"每日计划飞行\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":110.9999937657679,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371210351-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":70.99999619602579,\\\"x\\\":309.7991716187691,\\\"y\\\":182.70736783376395,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.399207556731042%\\\",\\\"left\\\":\\\"15.194171%\\\",\\\"width\\\":\\\"3.4822109999999995%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"总计\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":70.99999619602579,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763370911329-4\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":42.00000866236812,\\\"x\\\":197.33764932203988,\\\"y\\\":214.24583309933405,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.57523037027158%\\\",\\\"left\\\":\\\"9.67847%\\\",\\\"width\\\":\\\"2.0599000000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"版\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":42.00000866236812,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763370895588-3\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":52.000002957467785,\\\"x\\\":172.41455179860495,\\\"y\\\":212.86121296392025,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.435794760417647%\\\",\\\"left\\\":\\\"8.456111000000002%\\\",\\\"width\\\":\\\"2.550352000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"3\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":52.000002957467785,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#02DEFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763370887375-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":140.99999704041034,\\\"x\\\":182.10687090038692,\\\"y\\\":183.7842891065145,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.507656921715736%\\\",\\\"left\\\":\\\"8.931473000000002%\\\",\\\"width\\\":\\\"6.915377%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"无人机航线设计\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":140.99999704041034,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":311.0000020038218,\\\"x\\\":915.2682911062369,\\\"h\\\":0,\\\"i\\\":\\\"es-drager-1763370612716-1\\\",\\\"y\\\":242.05284212679635,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.375483784757172%\\\",\\\"left\\\":\\\"44.889542000000006%\\\",\\\"width\\\":\\\"15.253065999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"0%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":311.0000020038218,\\\"height\\\":0},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_26_1763552300046.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763370022040-3\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":323.9999823538453,\\\"x\\\":355.79916168770234,\\\"y\\\":87.47659410898373,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.80916862001706%\\\",\\\"left\\\":\\\"17.450251000000005%\\\",\\\"width\\\":\\\"15.890653000000004%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"座  服务于岸线公园巡检和河道巡检\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":323.9999823538453,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763370010036-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":48.00000116155921,\\\"x\\\":319.49149072055104,\\\"y\\\":87.16890514494884,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.778183371970881%\\\",\\\"left\\\":\\\"15.669533000000001%\\\",\\\"width\\\":\\\"2.3541710000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"4\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":48.00000116155921,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#96F5F8\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#49ABFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763369998907-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":94.00001161983592,\\\"x\\\":244.414543346272,\\\"y\\\":86.86121618091394,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.7471981239247%\\\",\\\"left\\\":\\\"11.987367%\\\",\\\"width\\\":\\\"4.610252000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"建设机场 \\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":94.00001161983592,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":36.9999911254748,\\\"x\\\":197.3896625372919,\\\"h\\\":33.99999677510606,\\\"i\\\":\\\"83560363-065f-4d4a-9be8-fb9b83e84040\\\",\\\"y\\\":88.55514865541414,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.91778246080691%\\\",\\\"left\\\":\\\"9.681021%\\\",\\\"width\\\":\\\"1.8146730000000004%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.423906791556098%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":36.9999911254748,\\\"height\\\":33.99999677510606},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_03_1763552101512.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JStatsSummary\\\",\\\"visible\\\":true,\\\"w\\\":595.0000071772687,\\\"x\\\":785.8511946537046,\\\"h\\\":85.00000678570775,\\\"i\\\":\\\"51a9c871-5835-4847-8271-f62c0698fa18\\\",\\\"y\\\":107.93976126080858,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"10.869874021000504%\\\",\\\"left\\\":\\\"38.542251%\\\",\\\"width\\\":\\\"29.18191100000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"8.559768474124843%\\\"},\\\"componentName\\\":\\\"统计概览（背景模式）\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"人员总数\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 681,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"人\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"2\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"车辆总数\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 155,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"辆\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"3\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"道路总里程\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 336,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"公里\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":595.0000071772687,\\\"height\\\":85.00000678570775},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":713,\\\"dataType\\\":1,\\\"h\\\":129,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"layout\\\":{\\\"padding\\\":{\\\"top\\\":5,\\\"left\\\":20,\\\"bottom\\\":0,\\\"right\\\":20},\\\"borderColor\\\":\\\"#0f66ff59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"justify\\\":\\\"space-between\\\",\\\"borderWidth\\\":0,\\\"gap\\\":16,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"contain\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"drag/lib/img/bg01.png\\\"},\\\"color\\\":\\\"#0b2b63\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"image\\\"}},\\\"fieldMap\\\":{\\\"compareValue\\\":\\\"compareValue\\\",\\\"unit\\\":\\\"suffix\\\",\\\"negativeValue\\\":\\\"0\\\",\\\"compareState\\\":\\\"compareState\\\",\\\"label\\\":\\\"name\\\",\\\"value\\\":\\\"value\\\",\\\"positiveValue\\\":\\\"1\\\",\\\"compareLabel\\\":\\\"compareLabel\\\"},\\\"card\\\":{\\\"padding\\\":{\\\"horizontal\\\":3,\\\"vertical\\\":15},\\\"borderColor\\\":\\\"#0F66FF59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"borderWidth\\\":0,\\\"blur\\\":24,\\\"minWidth\\\":100,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"cover\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"\\\"},\\\"color\\\":\\\"#0B2B6300\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"none\\\"}},\\\"sections\\\":{\\\"middle\\\":{\\\"compare\\\":{\\\"valueStyle\\\":{\\\"positiveGradient\\\":{\\\"endColor\\\":\\\"#15f0c5\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#15f0c5\\\"},\\\"positiveColor\\\":\\\"#15F0C5\\\",\\\"fontSize\\\":14,\\\"negativeColor\\\":\\\"#D0021B\\\",\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"negativeGradient\\\":{\\\"endColor\\\":\\\"#D0021B\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#D0021B\\\"},\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"alignItems\\\":\\\"center\\\",\\\"labelStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"fontColor\\\":\\\"#9ED3FF\\\"},\\\"label\\\":\\\"同比\\\"},\\\"paddingBottom\\\":10,\\\"show\\\":false,\\\"type\\\":\\\"compare\\\",\\\"align\\\":\\\"center\\\"},\\\"top\\\":{\\\"minHeight\\\":40,\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"paddingTop\\\":5,\\\"type\\\":\\\"value\\\",\\\"align\\\":\\\"center\\\",\\\"value\\\":{\\\"unit\\\":{\\\"fontSize\\\":16,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#96F5F8\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#49ABFF\\\"},\\\"fontWeight\\\":500,\\\"fontColor\\\":\\\"#9ED3FF\\\"},\\\"unitGap\\\":6,\\\"fontSize\\\":24,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#96F5F8\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#49ABFF\\\"},\\\"fontWeight\\\":600,\\\"fontColor\\\":\\\"#D8F1FF\\\"}},\\\"bottom\\\":{\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"label\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#C9E6FF\\\"},\\\"type\\\":\\\"label\\\",\\\"align\\\":\\\"center\\\"}}}}},{\\\"component\\\":\\\"JListProgress\\\",\\\"visible\\\":true,\\\"w\\\":508.9999991492498,\\\"x\\\":175.99061836459558,\\\"h\\\":185.99999807928413,\\\"i\\\":\\\"96a95bd1-0e5b-4cff-8138-d5e1a8fcefff\\\",\\\"y\\\":324.55333636593934,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"32.68354347077916%\\\",\\\"left\\\":\\\"8.6315%\\\",\\\"width\\\":\\\"24.964021000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"18.73078579581999%\\\"},\\\"componentName\\\":\\\"列表进度图\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"违规停车\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 500000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-12-31\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-06-15\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 262431\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"海岸线非法闯入\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 30000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-20\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-05-30\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 14305\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"配电室巡查\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 6000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2026-01-15\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-07-01\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4270\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"危险品车违规行驶\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 6000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-10-10\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-04-28\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3234\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":508.9999991492498,\\\"height\\\":185.99999807928413},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":1200,\\\"dataType\\\":1,\\\"h\\\":325,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"beginFields\\\":[{\\\"name\\\":\\\"合同名称\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"title\\\"}],\\\"endCurrent\\\":0,\\\"endInfo\\\":{\\\"width\\\":103},\\\"scroll\\\":{\\\"count\\\":1,\\\"interval\\\":3000,\\\"enabled\\\":true,\\\"direction\\\":\\\"down\\\"},\\\"centerTopFields\\\":[],\\\"body\\\":{\\\"gradient\\\":{\\\"type\\\":\\\"linear\\\"}},\\\"endFields\\\":[{\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"name\\\":\\\"数值\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#4FB9E3\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"key\\\":\\\"value\\\",\\\"marginLeft\\\":23}],\\\"beginCurrent\\\":0,\\\"progressSection\\\":{\\\"marginRight\\\":8,\\\"marginLeft\\\":8},\\\"bar\\\":{\\\"border\\\":{\\\"padding\\\":8,\\\"color\\\":\\\"#4ECBFC5E\\\",\\\"width\\\":2,\\\"enabled\\\":true},\\\"total\\\":{\\\"field\\\":\\\"total\\\",\\\"type\\\":\\\"field\\\",\\\"value\\\":0},\\\"borderRadius\\\":6,\\\"background\\\":{\\\"color\\\":\\\"#5A97FC4F\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#07203D\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#143B6E\\\"}},\\\"indicatorColor\\\":\\\"#DCFEFFB5\\\",\\\"exceed\\\":{\\\"indicatorColor\\\":\\\"#FEF8C9B3\\\",\\\"fill\\\":{\\\"color\\\":\\\"#FFB347\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FEAF24\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FEF6C8\\\",\\\"direction\\\":\\\"to right\\\"}},\\\"percent\\\":70,\\\"enabled\\\":true},\\\"indicatorSize\\\":15,\\\"fill\\\":{\\\"color\\\":\\\"#33C9FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#24E5F1\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#C5FDFE\\\"}},\\\"valueField\\\":\\\"value\\\",\\\"height\\\":6},\\\"centerTopInfo\\\":{\\\"layout\\\":\\\"horizontal\\\"},\\\"centerTopCurrent\\\":0,\\\"row\\\":{\\\"marginRight\\\":1,\\\"padding\\\":\\\"0 0\\\",\\\"marginBottom\\\":0,\\\"marginTop\\\":4,\\\"height\\\":42,\\\"marginLeft\\\":0},\\\"beginInfo\\\":{\\\"layout\\\":\\\"vertical\\\",\\\"width\\\":131}}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":3.000006444267293,\\\"x\\\":464.88365818962495,\\\"h\\\":53.99999720719867,\\\"i\\\":\\\"es-drager-1762942619160-4\\\",\\\"y\\\":186.6020326563206,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.791412574425333%\\\",\\\"left\\\":\\\"22.800325000000004%\\\",\\\"width\\\":\\\"0.14713600000000004%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.437969844665112%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":3.000006444267293,\\\"height\\\":53.99999720719867},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_22_1763552318849.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":1.9999907032825328,\\\"x\\\":866.0504140684643,\\\"h\\\":40.99999989592697,\\\"i\\\":\\\"es-drager-1762942529865-1\\\",\\\"y\\\":630.1805348963725,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.46116523510798%\\\",\\\"left\\\":\\\"42.475640000000006%\\\",\\\"width\\\":\\\"0.09809000000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.12882915919117%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1.9999907032825328,\\\"height\\\":40.99999989592697},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_22_1763552318849.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":1.9999907032825328,\\\"x\\\":869.9777278548183,\\\"h\\\":40.99999989592697,\\\"i\\\":\\\"es-drager-1762941823717-35\\\",\\\"y\\\":550.5439613083489,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"55.441511381377865%\\\",\\\"left\\\":\\\"42.66825600000001%\\\",\\\"width\\\":\\\"0.09809000000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.12882915919117%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1.9999907032825328,\\\"height\\\":40.99999989592697},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_22_1763552318849.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941725340-32\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":34.000005070551,\\\"x\\\":1291.4712878116177,\\\"y\\\":451.7116100695211,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.48878224230209%\\\",\\\"left\\\":\\\"63.34050374010456%\\\",\\\"width\\\":\\\"1.667538%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"人\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":34.000005070551,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":61.00000190092615,\\\"x\\\":1253.7456067176438,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941720287-31\\\",\\\"y\\\":451.96951883151854,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.51475446717158%\\\",\\\"left\\\":\\\"61.49023911015685%\\\",\\\"width\\\":\\\"2.9917590000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"14\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":61.00000190092615,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941657363-30\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":34.000005070551,\\\"x\\\":1091.4243899206565,\\\"y\\\":453.711612210325,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.690188758847384%\\\",\\\"left\\\":\\\"53.529158026387826%\\\",\\\"width\\\":\\\"1.667538%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"人\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":34.000005070551,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":61.00000190092615,\\\"x\\\":1049.900347577761,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941651441-29\\\",\\\"y\\\":451.9695170875309,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.51475429154653%\\\",\\\"left\\\":\\\"51.49260190303707%\\\",\\\"width\\\":\\\"2.9917590000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"88\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":61.00000190092615,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941632755-28\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":34.000005070551,\\\"x\\\":878.8452499574914,\\\"y\\\":455.638918235086,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.88427454747951%\\\",\\\"left\\\":\\\"43.103165643141644%\\\",\\\"width\\\":\\\"1.667538%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"人\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":34.000005070551,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941620159-27\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":75.99999334357558,\\\"x\\\":1214.366941157304,\\\"y\\\":453.10667325785766,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.629269500485975%\\\",\\\"left\\\":\\\"59.558903480209146%\\\",\\\"width\\\":\\\"3.727436999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"离线：\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":75.99999334357558,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941614133-26\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":74.99999799193434,\\\"x\\\":1215.633060735264,\\\"y\\\":422.7198179040119,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.56921743317984%\\\",\\\"left\\\":\\\"59.62100060355991%\\\",\\\"width\\\":\\\"3.678391999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"在线：\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":74.99999799193434,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941608903-25\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":34.000005070551,\\\"x\\\":1294.132494595217,\\\"y\\\":422.7198161600243,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.5692172575548%\\\",\\\"left\\\":\\\"63.47102323350761%\\\",\\\"width\\\":\\\"1.667538%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"人\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":34.000005070551,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941602235-24\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":34.000005070551,\\\"x\\\":1092.819479910352,\\\"y\\\":425.2520436733287,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.824220545876166%\\\",\\\"left\\\":\\\"53.59758053298479%\\\",\\\"width\\\":\\\"1.667538%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"人\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":34.000005070551,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":61.00000190092615,\\\"x\\\":1253.8745693152403,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941596165-23\\\",\\\"y\\\":421.7115971894209,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.46768643084153%\\\",\\\"left\\\":\\\"61.49656411015684%\\\",\\\"width\\\":\\\"2.9917590000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"30\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":61.00000190092615,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":61.00000190092615,\\\"x\\\":1051.2954451125793,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941590403-22\\\",\\\"y\\\":424.243844499982,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.72269171280903%\\\",\\\"left\\\":\\\"51.56102477968631%\\\",\\\"width\\\":\\\"2.9917590000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"173\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":61.00000190092615,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941575296-21\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":94.00001161983592,\\\"x\\\":997.9894510814421,\\\"y\\\":451.96951883151854,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.51475446717158%\\\",\\\"left\\\":\\\"48.94662014973859%\\\",\\\"width\\\":\\\"4.610252000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"离线：\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":94.00001161983592,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941569613-20\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":94.00001161983592,\\\"x\\\":997.9894639256624,\\\"y\\\":424.11488516966904,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.70970510196275%\\\",\\\"left\\\":\\\"48.94662077968631%\\\",\\\"width\\\":\\\"4.610252000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"在线：\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":94.00001161983592,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":61.00000190092615,\\\"x\\\":836.0551084259791,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941564580-19\\\",\\\"y\\\":453.3645878411632,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.65524231157953%\\\",\\\"left\\\":\\\"41.004513396440124%\\\",\\\"width\\\":\\\"2.9917590000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"122\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":61.00000190092615,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":61.00000190092615,\\\"x\\\":836.1840685085348,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941053477-18\\\",\\\"y\\\":419.3083173638135,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.22566858091834%\\\",\\\"left\\\":\\\"41.010838273089355%\\\",\\\"width\\\":\\\"2.9917590000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"252\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":61.00000190092615,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941048379-17\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":34.000005070551,\\\"x\\\":877.7080904620868,\\\"y\\\":421.5826460137488,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.45470064119328%\\\",\\\"left\\\":\\\"43.047393396440114%\\\",\\\"width\\\":\\\"1.667538%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"人\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":34.000005070551,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762940580987-16\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":94.00001161983592,\\\"x\\\":782.8780923517,\\\"y\\\":453.36459191848354,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.65524272217853%\\\",\\\"left\\\":\\\"38.39643451979088%\\\",\\\"width\\\":\\\"4.610252000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"离线：\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":94.00001161983592,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762940573639-15\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":94.00001161983592,\\\"x\\\":782.8780898366589,\\\"y\\\":420.4454857661016,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.340185021654825%\\\",\\\"left\\\":\\\"38.39643439644011%\\\",\\\"width\\\":\\\"4.610252000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"在线：\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":94.00001161983592,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":122.0000038018523,\\\"x\\\":755.0234452012544,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762940556528-14\\\",\\\"y\\\":629.3552169593522,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.378053118702546%\\\",\\\"left\\\":\\\"37.030297000000004%\\\",\\\"width\\\":\\\"5.983518000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"酒水作业\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":122.0000038018523,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":100.99999947066824,\\\"x\\\":765.1524020939509,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762940550624-13\\\",\\\"y\\\":547.057446629083,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"55.09040836898173%\\\",\\\"left\\\":\\\"37.527074000000006%\\\",\\\"width\\\":\\\"4.953568000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"道路机扫\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":100.99999947066824,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":122.0000038018523,\\\"x\\\":1215.0281373863072,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762940525754-12\\\",\\\"y\\\":221.03887569834177,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"22.25931116133512%\\\",\\\"left\\\":\\\"59.591331999999994%\\\",\\\"width\\\":\\\"5.983518000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"海港人员\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":122.0000038018523,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":122.0000038018523,\\\"x\\\":1002.4823825925793,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762940521846-11\\\",\\\"y\\\":225.3112028888313,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"22.689547969297916%\\\",\\\"left\\\":\\\"49.166977%\\\",\\\"width\\\":\\\"5.983518000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"临港人员\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":122.0000038018523,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":122.0000038018523,\\\"x\\\":792.316981705006,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762940511936-10\\\",\\\"y\\\":225.67715517941065,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"22.726400517884553%\\\",\\\"left\\\":\\\"38.859367000000006%\\\",\\\"width\\\":\\\"5.983518000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"空港人员\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":122.0000038018523,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":43.999999365650666,\\\"x\\\":1914.7889788309733,\\\"h\\\":32.000008610250845,\\\"i\\\":\\\"es-drager-1762938531837-5\\\",\\\"y\\\":636.9519390937786,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"64.1430669709589%\\\",\\\"left\\\":\\\"93.91126200000001%\\\",\\\"width\\\":\\\"2.1579900000000007%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.2225016824328714%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"kg\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":43.999999365650666,\\\"height\\\":32.000008610250845},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#88999A\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":43.999999365650666,\\\"x\\\":1776.781953911325,\\\"h\\\":32.000008610250845,\\\"i\\\":\\\"es-drager-1762938522652-4\\\",\\\"y\\\":638.2180528504308,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"64.27056861511959%\\\",\\\"left\\\":\\\"87.14267600000001%\\\",\\\"width\\\":\\\"2.1579900000000007%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.2225016824328714%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"kg\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":43.999999365650666,\\\"height\\\":32.000008610250845},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#88999A\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":43.999999365650666,\\\"x\\\":1643.839397243353,\\\"h\\\":32.000008610250845,\\\"i\\\":\\\"es-drager-1762938514850-3\\\",\\\"y\\\":636.9519390937786,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"64.1430669709589%\\\",\\\"left\\\":\\\"80.62247800000002%\\\",\\\"width\\\":\\\"2.1579900000000007%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.2225016824328714%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"kg\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":43.999999365650666,\\\"height\\\":32.000008610250845},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#88999A\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":115.99999091331775,\\\"x\\\":1494.3083357704925,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762938341955-2\\\",\\\"y\\\":545.6623636434895,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"54.9499191171517%\\\",\\\"left\\\":\\\"73.28869300000001%\\\",\\\"width\\\":\\\"5.689246000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"7153\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":115.99999091331775,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":43.999999365650666,\\\"x\\\":1530.017579506108,\\\"h\\\":32.000008610250845,\\\"i\\\":\\\"es-drager-1762938204176-1\\\",\\\"y\\\":633.2825373568783,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.773546655676995%\\\",\\\"left\\\":\\\"75.04006100000001%\\\",\\\"width\\\":\\\"2.1579900000000007%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.2225016824328714%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"kg\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":43.999999365650666,\\\"height\\\":32.000008610250845},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#88999A\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":70.99999619602579,\\\"x\\\":1867.8136033479955,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936596210-18\\\",\\\"y\\\":630.4923812843198,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.49256914884002%\\\",\\\"left\\\":\\\"91.607344%\\\",\\\"width\\\":\\\"3.4822109999999995%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"9401\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":70.99999619602579,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#46D6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":61.00000190092615,\\\"x\\\":1751.4595718742557,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936591363-17\\\",\\\"y\\\":633.1535780265655,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.760560044830726%\\\",\\\"left\\\":\\\"85.90073400000001%\\\",\\\"width\\\":\\\"2.9917590000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"0\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":61.00000190092615,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#46D6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":61.00000190092615,\\\"x\\\":1618.6459574145372,\\\"h\\\":30.000000648138894,\\\"i\\\":\\\"es-drager-1762936587463-16\\\",\\\"y\\\":635.8147648701827,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"64.02854994399837%\\\",\\\"left\\\":\\\"79.38686000000001%\\\",\\\"width\\\":\\\"2.9917590000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.0210945796635205%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"0\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":61.00000190092615,\\\"height\\\":30.000000648138894},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#46D6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":74.99999799193434,\\\"x\\\":1866.5474862850765,\\\"h\\\":45.000005921522515,\\\"i\\\":\\\"es-drager-1762936579995-15\\\",\\\"y\\\":649.4841668231293,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"65.40510178583477%\\\",\\\"left\\\":\\\"91.54524700000002%\\\",\\\"width\\\":\\\"3.678391999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.5316423679068105%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"其他垃圾\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":74.99999799193434,\\\"height\\\":45.000005921522515},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":13,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":101.99997443296604,\\\"x\\\":1739.9355149316998,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936575774-14\\\",\\\"y\\\":652.0164141336904,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"65.66010706780227%\\\",\\\"left\\\":\\\"85.335534%\\\",\\\"width\\\":\\\"5.002612000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"可回收垃圾\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":101.99997443296604,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":13,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":74.99999799193434,\\\"x\\\":1613.3235843570108,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936571795-13\\\",\\\"y\\\":653.2825278903425,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"65.78760871196295%\\\",\\\"left\\\":\\\"79.12582300000001%\\\",\\\"width\\\":\\\"3.678391999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"有害垃圾\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":74.99999799193434,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":13,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":74.99999799193434,\\\"x\\\":1490.5099641923919,\\\"h\\\":22.999997527317976,\\\"i\\\":\\\"es-drager-1762936567296-12\\\",\\\"y\\\":659.6131263694886,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"66.42511992323557%\\\",\\\"left\\\":\\\"73.10240100000001%\\\",\\\"width\\\":\\\"3.678391999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.316172212028447%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"厨余垃圾\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":74.99999799193434,\\\"height\\\":22.999997527317976},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":13,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":133.0000138379367,\\\"x\\\":1816.9109140786636,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936479611-11\\\",\\\"y\\\":573.2590862100086,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"57.728996022517066%\\\",\\\"left\\\":\\\"89.11081%\\\",\\\"width\\\":\\\"6.523016000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"当月投放量(KG)\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":133.0000138379367,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":74.99999799193434,\\\"x\\\":1679.032810977925,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936475992-10\\\",\\\"y\\\":573.3880356416931,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"57.74198163654029%\\\",\\\"left\\\":\\\"82.34854700000001%\\\",\\\"width\\\":\\\"3.678391999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"设施\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":74.99999799193434,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":115.99999091331775,\\\"x\\\":1818.4349359474331,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936466314-9\\\",\\\"y\\\":543.1301262315568,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"54.69491483200728%\\\",\\\"left\\\":\\\"89.18555600000002%\\\",\\\"width\\\":\\\"5.689246000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"9301\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":115.99999091331775,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":115.99999091331775,\\\"x\\\":1659.032822387726,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936448667-7\\\",\\\"y\\\":547.0574367304547,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"55.09040737215868%\\\",\\\"left\\\":\\\"81.36764300000002%\\\",\\\"width\\\":\\\"5.689246000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"85\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":115.99999091331775,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":107.00001235920283,\\\"x\\\":1499.5017666197657,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936431998-6\\\",\\\"y\\\":573.645954302319,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"57.76795485823283%\\\",\\\"left\\\":\\\"73.543406%\\\",\\\"width\\\":\\\"5.247840000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"总注册人数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":107.00001235920283,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":56.000004753376324,\\\"x\\\":1493.4290861110203,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936404011-4\\\",\\\"y\\\":628.3470119646975,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.27652369941136%\\\",\\\"left\\\":\\\"73.24557000000001%\\\",\\\"width\\\":\\\"2.7465330000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"123\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":56.000004753376324,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#46D6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":117.00000665430248,\\\"x\\\":1850.1641390544198,\\\"h\\\":51.000000111973286,\\\"i\\\":\\\"es-drager-1762936392574-3\\\",\\\"y\\\":637.6482977004861,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"64.21319247651806%\\\",\\\"left\\\":\\\"90.741722%\\\",\\\"width\\\":\\\"5.738292000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.135860685745679%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":117.00000665430248,\\\"height\\\":51.000000111973286},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_06_1763552183216.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":132.00001848629552,\\\"x\\\":1726.0844222162254,\\\"h\\\":55.99999527068225,\\\"i\\\":\\\"es-drager-1762936386243-2\\\",\\\"y\\\":633.8499465319011,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.830686547212935%\\\",\\\"left\\\":\\\"84.65620400000002%\\\",\\\"width\\\":\\\"6.473971000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.6393759506114005%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":132.00001848629552,\\\"height\\\":55.99999527068225},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_06_1763552183216.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":105.99999661821808,\\\"x\\\":1602.133647586284,\\\"h\\\":60.00000129627779,\\\"i\\\":\\\"es-drager-1762936160272-1\\\",\\\"y\\\":632.7127822069335,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.71617051707547%\\\",\\\"left\\\":\\\"78.57701000000002%\\\",\\\"width\\\":\\\"5.198794000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.042189159327041%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":105.99999661821808,\\\"height\\\":60.00000129627779},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_06_1763552183216.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":476.9999847819812,\\\"x\\\":1476.7877932958268,\\\"h\\\":28.99999171776873,\\\"i\\\":\\\"es-drager-1762934953780-14\\\",\\\"y\\\":689.6881586206188,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"69.45377042170585%\\\",\\\"left\\\":\\\"72.42939400000002%\\\",\\\"width\\\":\\\"23.394572999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9203905298673134%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":476.9999847819812,\\\"height\\\":28.99999171776873},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_10_1763552278772.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":100.00000411902698,\\\"x\\\":1479.449010408605,\\\"h\\\":61.00000032801957,\\\"i\\\":\\\"es-drager-1762934758071-13\\\",\\\"y\\\":630.3094942266853,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.47415184595424%\\\",\\\"left\\\":\\\"72.559914%\\\",\\\"width\\\":\\\"4.904523000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.142892212300184%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":100.00000411902698,\\\"height\\\":61.00000032801957},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_06_1763552183216.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":147.9999848912427,\\\"x\\\":1855.152412329461,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762933339573-12\\\",\\\"y\\\":91.12543639477417,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.176618533800058%\\\",\\\"left\\\":\\\"90.98637300000001%\\\",\\\"width\\\":\\\"7.258693000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"厨余垃圾(吨/月)\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":147.9999848912427,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":74.99999799193434,\\\"x\\\":1889.466596793904,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762933332326-11\\\",\\\"y\\\":58.60141419624384,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"5.90134703213322%\\\",\\\"left\\\":\\\"92.66932000000001%\\\",\\\"width\\\":\\\"3.678391999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"109.45\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":74.99999799193434,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#4FC5E3\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#96F5F8\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#49ABFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":131.00000274531064,\\\"x\\\":1659.032822387726,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762933079266-10\\\",\\\"y\\\":95.05275679230033,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.572112070774509%\\\",\\\"left\\\":\\\"81.36764300000002%\\\",\\\"width\\\":\\\"6.424924999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"生活垃圾(吨/月)\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":131.00000274531064,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":74.99999799193434,\\\"x\\\":1688.2825386004924,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762933073725-9\\\",\\\"y\\\":58.7303636279284,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"5.914332646156435%\\\",\\\"left\\\":\\\"82.80220200000001%\\\",\\\"width\\\":\\\"3.678391999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"35.40\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":74.99999799193434,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#4FC5E3\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#96F5F8\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#49ABFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":176.99999281424385,\\\"x\\\":1838.0187576475853,\\\"h\\\":92.00000000790027,\\\"i\\\":\\\"es-drager-1762932876846-8\\\",\\\"y\\\":69.67643514839494,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"7.016636533644591%\\\",\\\"left\\\":\\\"90.14604900000002%\\\",\\\"width\\\":\\\"8.681005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.26468984493685%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":176.99999281424385,\\\"height\\\":92.00000000790027},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_14_1763552212132.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":174.0000067593201,\\\"x\\\":1638.1008165170927,\\\"h\\\":103.99999828743017,\\\"i\\\":\\\"es-drager-1762932868681-7\\\",\\\"y\\\":63.474795999561906,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.392111933218262%\\\",\\\"left\\\":\\\"80.34102800000001%\\\",\\\"width\\\":\\\"8.533870000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.473127477437648%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":174.0000067593201,\\\"height\\\":103.99999828743017},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_14_1763552212132.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":74.99999799193434,\\\"x\\\":1488.2356348724034,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762932864087-6\\\",\\\"y\\\":92.64946881205219,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.330093399653293%\\\",\\\"left\\\":\\\"72.99085600000001%\\\",\\\"width\\\":\\\"3.678391999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"总点位\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":74.99999799193434,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":74.99999799193434,\\\"x\\\":1488.3646178593435,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762932853402-5\\\",\\\"y\\\":56.06096092276985,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"5.645515383847678%\\\",\\\"left\\\":\\\"72.99718200000001%\\\",\\\"width\\\":\\\"3.678391999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"206\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":74.99999799193434,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#4FC5E3\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#96F5F8\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#49ABFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":509.99999450089103,\\\"x\\\":1466.9167412089805,\\\"h\\\":73.99999763929125,\\\"i\\\":\\\"es-drager-1762931911166-4\\\",\\\"y\\\":545.608435916168,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"54.94448842511221%\\\",\\\"left\\\":\\\"71.94526600000002%\\\",\\\"width\\\":\\\"25.013066000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"7.452032897774124%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":509.99999450089103,\\\"height\\\":73.99999763929125},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/按钮21 拷贝_1763552170900.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":122.0000038018523,\\\"x\\\":1466.0375119388516,\\\"h\\\":93.99999807138387,\\\"i\\\":\\\"es-drager-1762930997431-1\\\",\\\"y\\\":68.66823015374024,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.915107114353396%\\\",\\\"left\\\":\\\"71.90214400000002%\\\",\\\"width\\\":\\\"5.983518000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.46609595088314%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":122.0000038018523,\\\"height\\\":93.99999807138387},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_14_1763552212132.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":109.00000306248539,\\\"x\\\":1408.7327115379485,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762429130209-4\\\",\\\"y\\\":744.3141747813775,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"74.95478234725454%\\\",\\\"left\\\":\\\"69.091617%\\\",\\\"width\\\":\\\"5.345930000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812791721984\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"当月投放量\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":109.00000306248539,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JMultipleBar\\\",\\\"visible\\\":true,\\\"w\\\":627.9999965068347,\\\"x\\\":1410.9343528483823,\\\"h\\\":246.99999840730368,\\\"i\\\":\\\"es-drager-1762429121828-3\\\",\\\"y\\\":742.8628378907972,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"74.80862814996556%\\\",\\\"left\\\":\\\"69.199597%\\\",\\\"width\\\":\\\"30.800403%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"24.873678008120173%\\\"},\\\"componentName\\\":\\\"对比柱形图\\\",\\\"pageCompId\\\":\\\"1146390812808499200\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"厨余垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"厨余垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"厨余垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"厨余垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"厨余垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"厨余垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"其他垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"其他垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"其他垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"其他垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"其他垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"其他垃圾\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":627.9999965068347,\\\"height\\\":246.99999840730368},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"yUnit\\\":\\\"\\\"},\\\"customColor\\\":[{\\\"color1\\\":\\\"#4FF0FDA8\\\",\\\"color\\\":\\\"#4FF0FD00\\\"},{\\\"color1\\\":\\\"#4F68FDA8\\\",\\\"color\\\":\\\"#4F68FD00\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":47,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":15,\\\"itemStyle\\\":{\\\"borderRadius\\\":0}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":93.00001626819461,\\\"x\\\":1454.9343318246895,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762429044550-2\\\",\\\"y\\\":310.879252361777,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"31.306520131634624%\\\",\\\"left\\\":\\\"71.35758600000001%\\\",\\\"width\\\":\\\"4.5612070000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812825276416\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"厨余垃圾\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":93.00001626819461,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":93.00001626819461,\\\"x\\\":1447.9343643632005,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762429023915-1\\\",\\\"y\\\":149.86283794746865,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.091659921153278%\\\",\\\"left\\\":\\\"71.01427100000001%\\\",\\\"width\\\":\\\"4.5612070000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812837859328\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"生活垃圾\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":93.00001626819461,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JMultipleLine\\\",\\\"visible\\\":true,\\\"w\\\":545.9999902747245,\\\"x\\\":1459.869878257456,\\\"h\\\":160.00000345674079,\\\"i\\\":\\\"9799edd5-f660-4e56-9305-d9e43773a75e\\\",\\\"y\\\":316.5486620607893,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"31.87744754968588%\\\",\\\"left\\\":\\\"71.599651%\\\",\\\"width\\\":\\\"26.778693999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"16.11250442487211%\\\"},\\\"componentName\\\":\\\"对比折线图\\\",\\\"pageCompId\\\":\\\"1146390812846247936\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 1.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 1.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":545.9999902747245,\\\"height\\\":160.00000345674079},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color1\\\":\\\"#1e90ff\\\",\\\"color\\\":\\\"#2291E3A3\\\"},{\\\"color1\\\":\\\"#90ee90\\\",\\\"color\\\":\\\"#02F4FF94\\\"},{\\\"color1\\\":\\\"#00ced1\\\",\\\"color\\\":\\\"#FF029B9E\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":36,\\\"left\\\":0,\\\"bottom\\\":22,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"symbol\\\":\\\"none\\\",\\\"lineType\\\":\\\"area\\\",\\\"label\\\":{\\\"position\\\":\\\"top\\\"}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JStackBar\\\",\\\"visible\\\":true,\\\"w\\\":557.9999956624503,\\\"x\\\":1455.200473925311,\\\"h\\\":152.00000130417803,\\\"i\\\":\\\"9857c542-9530-4c6c-ac2a-2fd20b6da0b3\\\",\\\"y\\\":155.8628321379194,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.695878238992144%\\\",\\\"left\\\":\\\"71.37063900000001%\\\",\\\"width\\\":\\\"27.367237000000006%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"15.306879004263887%\\\"},\\\"componentName\\\":\\\"生活垃圾\\\",\\\"pageCompId\\\":\\\"1146390812858830848\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":557.9999956624503,\\\"height\\\":152.00000130417803},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color1\\\":\\\"#F4DC42B3\\\",\\\"color\\\":\\\"#F4DC4200\\\"},{\\\"color1\\\":\\\"#00D8FFB3\\\",\\\"color\\\":\\\"#00D8FF00\\\"},{\\\"color1\\\":\\\"#006CFFB3\\\",\\\"color\\\":\\\"#006CFF00\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":43,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":21,\\\"itemStyle\\\":{\\\"borderRadius\\\":1},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":false}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JMultipleBar\\\",\\\"visible\\\":true,\\\"w\\\":627.9999965068347,\\\"x\\\":743.9343337341033,\\\"h\\\":246.99999840730368,\\\"i\\\":\\\"ddbe13ab-bd12-4d18-9551-5773cc07cb6d\\\",\\\"y\\\":741.8628388590553,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"74.70792509699238%\\\",\\\"left\\\":\\\"36.48642900000001%\\\",\\\"width\\\":\\\"30.800403%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"24.873678008120173%\\\"},\\\"componentName\\\":\\\"对比柱形图\\\",\\\"pageCompId\\\":\\\"1146390812879802368\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"修剪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"修剪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"修剪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"修剪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"修剪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"修剪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"破绿\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"破绿\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"破绿\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"破绿\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"破绿\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"破绿\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 13,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"基础养护\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 14,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"基础养护\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 13.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"基础养护\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 15,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"基础养护\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 14.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"基础养护\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 16,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"基础养护\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"提升改造\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"提升改造\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"提升改造\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"提升改造\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"提升改造\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"提升改造\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":627.9999965068347,\\\"height\\\":246.99999840730368},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"yUnit\\\":\\\"\\\"},\\\"customColor\\\":[{\\\"color1\\\":\\\"#3FECFBB3\\\",\\\"color\\\":\\\"#3FECFB00\\\"},{\\\"color1\\\":\\\"#006CFFB5\\\",\\\"color\\\":\\\"#006CFF00\\\"},{\\\"color1\\\":\\\"#C000FFB3\\\",\\\"color\\\":\\\"#109EE05C\\\"},{\\\"color1\\\":\\\"#3F8FFBB5\\\",\\\"color\\\":\\\"#3F8FFB00\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":47,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":15,\\\"itemStyle\\\":{\\\"borderRadius\\\":0}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JMultipleLine\\\",\\\"visible\\\":true,\\\"w\\\":549.0000171083353,\\\"x\\\":153.2004704533646,\\\"h\\\":244.00000131207827,\\\"i\\\":\\\"4c6e2a64-9c5b-4433-a253-e3246a922a38\\\",\\\"y\\\":519.0562760062809,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"52.27060227014323%\\\",\\\"left\\\":\\\"7.513752%\\\",\\\"width\\\":\\\"26.925831%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"24.571568849200737%\\\"},\\\"componentName\\\":\\\"对比折线图\\\",\\\"pageCompId\\\":\\\"1146390812892385280\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-23\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 620,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"总量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-24\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 768,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"总量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-25\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 600,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"总量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-26\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 810,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"总量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-27\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 700,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"总量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-28\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 900,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"总量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-29\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 820,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"总量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-30\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 830,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"总量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-31\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 790,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"总量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-23\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 196,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"完成量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-24\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 600,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"完成量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-25\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 300,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"完成量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-26\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 550,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"完成量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-27\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 610,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"完成量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-28\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 390,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"完成量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-29\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 420,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"完成量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-30\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 380,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"完成量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-31\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 600,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"完成量\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":549.0000171083353,\\\"height\\\":244.00000131207827},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"yUnit\\\":\\\"\\\"},\\\"customColor\\\":[{\\\"color1\\\":\\\"#1e90ff\\\",\\\"color\\\":\\\"#AB315C\\\"},{\\\"color1\\\":\\\"#90ee90\\\",\\\"color\\\":\\\"#4FCAE3\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"name\\\":\\\"单位(个)\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":39,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"symbol\\\":\\\"circle\\\",\\\"symbolSize\\\":6,\\\"lineType\\\":\\\"line\\\",\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":false,\\\"position\\\":\\\"top\\\"},\\\"lineWidth\\\":2}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":true,\\\"text\\\":\\\"无人机巡检完成情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":88.99999408294256,\\\"x\\\":1463.7409174557679,\\\"h\\\":40.99999989592697,\\\"i\\\":\\\"es-drager-1762423810391-12\\\",\\\"y\\\":495.8229777070758,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"49.93093593537638%\\\",\\\"left\\\":\\\"71.789507%\\\",\\\"width\\\":\\\"4.365025%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.12882915919117%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812909162496\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"垃圾分类\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":88.99999408294256,\\\"height\\\":40.99999989592697},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":93.00001626819461,\\\"x\\\":1479.9343583411257,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762423782353-11\\\",\\\"y\\\":9.862844821448832,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0.9932195462132423%\\\",\\\"left\\\":\\\"72.58371800000002%\\\",\\\"width\\\":\\\"4.5612070000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812921745408\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"垃圾收运\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":93.00001626819461,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":148.99998024288396,\\\"x\\\":761.7409183086403,\\\"h\\\":38.99999193381503,\\\"i\\\":\\\"es-drager-1762423748544-10\\\",\\\"y\\\":705.7092569027857,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"71.06714549286653%\\\",\\\"left\\\":\\\"37.35975700000001%\\\",\\\"width\\\":\\\"7.307738000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.9274220564218205%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"园林作业用工\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":148.99998024288396,\\\"height\\\":38.99999193381503},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":107.00001235920283,\\\"x\\\":782.2004827011841,\\\"h\\\":30.000000648138894,\\\"i\\\":\\\"es-drager-1762423716800-9\\\",\\\"y\\\":61.00000032801958,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.142892212300185%\\\",\\\"left\\\":\\\"38.363201000000004%\\\",\\\"width\\\":\\\"5.247840000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.0210945796635205%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812951105536\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"环卫作业\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":107.00001235920283,\\\"height\\\":30.000000648138894},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":100.00000411902698,\\\"x\\\":186.26495127640098,\\\"h\\\":42.99999795941056,\\\"i\\\":\\\"es-drager-1762423687040-8\\\",\\\"y\\\":756.1371663778658,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"76.14539484911707%\\\",\\\"left\\\":\\\"9.135407000000002%\\\",\\\"width\\\":\\\"4.904523000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.33023526513746%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812963688448\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"危险作业\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":100.00000411902698,\\\"height\\\":42.99999795941056},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":103.00001056329427,\\\"x\\\":174.8698773207855,\\\"h\\\":48.0000030167479,\\\"i\\\":\\\"es-drager-1762423656832-7\\\",\\\"y\\\":276.8393938102532,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"27.878599133609544%\\\",\\\"left\\\":\\\"8.576533000000001%\\\",\\\"width\\\":\\\"5.051659000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.833751526826244%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812980465664\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"巡检信息\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":103.00001056329427,\\\"height\\\":48.0000030167479},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":569.0000056985347,\\\"x\\\":1438.1359798965655,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762423639047-6\\\",\\\"y\\\":500.29073351733564,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.38085302104397%\\\",\\\"left\\\":\\\"70.53370700000002%\\\",\\\"width\\\":\\\"27.906735000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146390812993048576\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":569.0000056985347,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":573.0000074944433,\\\"x\\\":1453.934356862392,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762423624157-5\\\",\\\"y\\\":13.862831049787644,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.396030761282759%\\\",\\\"left\\\":\\\"71.30854200000002%\\\",\\\"width\\\":\\\"28.102916000000004%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146390813005631488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":573.0000074944433,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":614.0000004158265,\\\"x\\\":740.8053850815827,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762423610295-4\\\",\\\"y\\\":708.1770245481904,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"71.31565746941088%\\\",\\\"left\\\":\\\"36.332969000000006%\\\",\\\"width\\\":\\\"30.113770000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146390813018214400\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":614.0000004158265,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":660.0000108741033,\\\"x\\\":759.2004468880306,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762423600686-3\\\",\\\"y\\\":61.999999359761375,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.24359526527333%\\\",\\\"left\\\":\\\"37.23515900000001%\\\",\\\"width\\\":\\\"32.369851000000004%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146390813034991616\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":660.0000108741033,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":538.0000070722509,\\\"x\\\":158.9343362111958,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762423595387-2\\\",\\\"y\\\":761.871045843406,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"76.72281457576837%\\\",\\\"left\\\":\\\"7.794970753298481%\\\",\\\"width\\\":\\\"26.386333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146390813051768832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":538.0000070722509,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":538.0000070722509,\\\"x\\\":156.6682288267175,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762423584121-1\\\",\\\"y\\\":283.573262408907,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"28.55672091641095%\\\",\\\"left\\\":\\\"7.683829000000002%\\\",\\\"width\\\":\\\"26.386333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146390813064351744\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":538.0000070722509,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":170.00000496341158,\\\"x\\\":177.20046083947247,\\\"h\\\":60.00000129627779,\\\"i\\\":\\\"72ffb6d2-c59b-407e-83d4-146e19df5a1a\\\",\\\"y\\\":0,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0%\\\",\\\"left\\\":\\\"8.690837000000002%\\\",\\\"width\\\":\\\"8.337689000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.042189159327041%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390813076934656\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"无人机业务信息\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.00000496341158,\\\"height\\\":60.00000129627779},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":558.9999910140915,\\\"x\\\":162.200469396823,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"f4665840-e58b-49bf-8ded-2ea4758037bb\\\",\\\"y\\\":13.733881618103084,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.3830451472595444%\\\",\\\"left\\\":\\\"7.955159%\\\",\\\"width\\\":\\\"27.416282000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146390813097906176\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":558.9999910140915,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":617.0000068600939,\\\"x\\\":765.6154848633763,\\\"h\\\":71.99999957580766,\\\"i\\\":\\\"es-drager-1762931502489-3\\\",\\\"y\\\":533.076198288189,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"53.68245261341327%\\\",\\\"left\\\":\\\"37.549786000000005%\\\",\\\"width\\\":\\\"30.260906000000006%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"7.250626791827836%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":617.0000068600939,\\\"height\\\":71.99999957580766},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_18_1763552143794.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":540.9999931271748,\\\"x\\\":178.64135535481833,\\\"h\\\":65.99999548672854,\\\"i\\\":\\\"709d5eeb-9748-4a8f-893a-dec888551a01\\\",\\\"y\\\":75.12777806457078,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"7.565603939649218%\\\",\\\"left\\\":\\\"8.761506000000002%\\\",\\\"width\\\":\\\"26.533468000000006%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.646407477165907%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":540.9999931271748,\\\"height\\\":65.99999548672854},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_21_1763552566127.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":543.999999571442,\\\"x\\\":177.00929035487692,\\\"h\\\":98.00000409697937,\\\"i\\\":\\\"es-drager-1762942596197-2\\\",\\\"y\\\":158.32571975954107,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.943898781767137%\\\",\\\"left\\\":\\\"8.681461000000002%\\\",\\\"width\\\":\\\"26.680604000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.868909159598777%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":543.999999571442,\\\"height\\\":98.00000409697937},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_07_1763552117126.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":614.9999957674679,\\\"x\\\":765.4865222657797,\\\"h\\\":71.99999957580766,\\\"i\\\":\\\"es-drager-1762941743379-33\\\",\\\"y\\\":617.7772565987063,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"62.21211603425532%\\\",\\\"left\\\":\\\"37.54346100000001%\\\",\\\"width\\\":\\\"30.16281500000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"7.250626791827836%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":614.9999957674679,\\\"height\\\":71.99999957580766},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_18_1763552143794.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JSemiGauge\\\",\\\"visible\\\":true,\\\"w\\\":221,\\\"x\\\":754.6072684642438,\\\"h\\\":208,\\\"i\\\":\\\"50f215a7-2178-488b-b3de-6ade82567e05\\\",\\\"y\\\":260.17467686082085,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"26.20040963494764%\\\",\\\"left\\\":\\\"37.00988551705342%\\\",\\\"width\\\":\\\"10.838995383538858%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"20.94625529979765%\\\"},\\\"componentName\\\":\\\"半圆仪表盘\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataType\\\":1,\\\"h\\\":430,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"total\\\\\\\": 800,\\\\n    \\\\\\\"used\\\\\\\": 500\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":221,\\\"height\\\":208},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":500,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"titleSuffix\\\":\\\"人\\\",\\\"customAttr\\\":{\\\"innerCircle\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":0,\\\"y2\\\":1,\\\"x2\\\":1,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#42A8FF66\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#42A8FF66\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":15}},\\\"name\\\":\\\"内部小圆\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"outerScale\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"distance\\\":-52,\\\"show\\\":true,\\\"fontSize\\\":12},\\\"min\\\":0,\\\"max\\\":100,\\\"axisLine\\\":{\\\"show\\\":false},\\\"name\\\":\\\"外部刻度\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"splitNumber\\\":2,\\\"detail\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":66},\\\"innerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"animationDuration\\\":2000,\\\"pointer\\\":{\\\"show\\\":false,\\\"length\\\":74,\\\"width\\\":1,\\\"itemStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"data\\\":[{\\\"name\\\":\\\"去年优良率\\\",\\\"value\\\":44}],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#2E76B9\\\"],[1,\\\"#2E76B9\\\"]],\\\"width\\\":1}},\\\"name\\\":\\\"内部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"detail\\\":{\\\"offsetCenter\\\":[0,50],\\\"show\\\":false,\\\"textStyle\\\":{\\\"padding\\\":[0,0,0,0],\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":\\\"30%\\\",\\\"title\\\":{\\\"offsetCenter\\\":[0,26],\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"normal\\\"}}},\\\"outerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#2E76B9\\\"],[1,\\\"#2E76B9\\\"]],\\\"width\\\":2}},\\\"name\\\":\\\"外部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"basic\\\":{\\\"startAngle\\\":180,\\\"endAngle\\\":0},\\\"innerShadow\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"customGradient\\\":{\\\"endColor\\\":\\\"#42A8FFCC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#2E76B900\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":1,\\\"y2\\\":0,\\\"x2\\\":0,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#2de69600\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#2de696\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":100}},\\\"name\\\":\\\"内部阴影\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":79}},\\\"valuePrefix\\\":\\\"已使用：\\\",\\\"titlePrefix\\\":\\\"总人数：\\\",\\\"valueMapping\\\":\\\"used\\\",\\\"titleMapping\\\":\\\"total\\\",\\\"valueSuffix\\\":\\\"辆\\\"}}},{\\\"component\\\":\\\"JSemiGauge\\\",\\\"visible\\\":true,\\\"w\\\":222,\\\"x\\\":969.7186400937863,\\\"h\\\":210,\\\"i\\\":\\\"es-drager-1763539498104-1\\\",\\\"y\\\":263.8440789710201,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"26.569929987821922%\\\",\\\"left\\\":\\\"47.56007177967479%\\\",\\\"width\\\":\\\"10.88804061151867%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"21.147661600757242%\\\"},\\\"componentName\\\":\\\"半圆仪表盘\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataType\\\":1,\\\"h\\\":430,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"total\\\\\\\": 800,\\\\n    \\\\\\\"used\\\\\\\": 500\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":222,\\\"height\\\":210},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":500,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"titleSuffix\\\":\\\"人\\\",\\\"customAttr\\\":{\\\"innerCircle\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":0,\\\"y2\\\":1,\\\"x2\\\":1,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#32B9BA66\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#32B9BA66\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":15}},\\\"name\\\":\\\"内部小圆\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"outerScale\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"distance\\\":-49,\\\"show\\\":true,\\\"fontSize\\\":12},\\\"min\\\":0,\\\"max\\\":100,\\\"axisLine\\\":{\\\"show\\\":false},\\\"name\\\":\\\"外部刻度\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"splitNumber\\\":2,\\\"detail\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":66},\\\"innerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"animationDuration\\\":2000,\\\"pointer\\\":{\\\"show\\\":false,\\\"length\\\":81,\\\"width\\\":1,\\\"itemStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"data\\\":[{\\\"name\\\":\\\"去年优良率\\\",\\\"value\\\":44}],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#32B9BA\\\"],[1,\\\"#32B9BA\\\"]],\\\"width\\\":1}},\\\"name\\\":\\\"内部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"detail\\\":{\\\"offsetCenter\\\":[0,50],\\\"show\\\":false,\\\"textStyle\\\":{\\\"padding\\\":[0,0,0,0],\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":\\\"30%\\\",\\\"title\\\":{\\\"offsetCenter\\\":[0,26],\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"normal\\\"}}},\\\"outerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#32B9BA\\\"],[1,\\\"#32B9BA\\\"]],\\\"width\\\":2}},\\\"name\\\":\\\"外部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"basic\\\":{\\\"startAngle\\\":180,\\\"endAngle\\\":0},\\\"innerShadow\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"customGradient\\\":{\\\"endColor\\\":\\\"#32B9BACC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#32B9BA00\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":1,\\\"y2\\\":0,\\\"x2\\\":0,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#2de69600\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#2de696\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":100}},\\\"name\\\":\\\"内部阴影\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":79}},\\\"valuePrefix\\\":\\\"已使用：\\\",\\\"titlePrefix\\\":\\\"总人数：\\\",\\\"valueMapping\\\":\\\"used\\\",\\\"titleMapping\\\":\\\"total\\\",\\\"valueSuffix\\\":\\\"辆\\\"}}},{\\\"component\\\":\\\"JSemiGauge\\\",\\\"visible\\\":true,\\\"w\\\":222,\\\"x\\\":1181.0316529894487,\\\"h\\\":210,\\\"i\\\":\\\"es-drager-1763539599125-2\\\",\\\"y\\\":261.1828831914188,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"26.301939188772533%\\\",\\\"left\\\":\\\"57.9239666722439%\\\",\\\"width\\\":\\\"10.88804061151867%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"21.147661600757242%\\\"},\\\"componentName\\\":\\\"半圆仪表盘\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataType\\\":1,\\\"h\\\":430,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"total\\\\\\\": 800,\\\\n    \\\\\\\"used\\\\\\\": 500\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":222,\\\"height\\\":210},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":500,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"titleSuffix\\\":\\\"人\\\",\\\"customAttr\\\":{\\\"innerCircle\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":0,\\\"y2\\\":1,\\\"x2\\\":1,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#4277FF66\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#4277FF66\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":15}},\\\"name\\\":\\\"内部小圆\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"outerScale\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"distance\\\":-52,\\\"show\\\":true,\\\"fontSize\\\":12},\\\"min\\\":0,\\\"max\\\":100,\\\"axisLine\\\":{\\\"show\\\":false},\\\"name\\\":\\\"外部刻度\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"splitNumber\\\":2,\\\"detail\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":66},\\\"innerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"animationDuration\\\":2000,\\\"pointer\\\":{\\\"show\\\":false,\\\"length\\\":81,\\\"width\\\":1,\\\"itemStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"data\\\":[{\\\"name\\\":\\\"去年优良率\\\",\\\"value\\\":44}],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#2E76B9\\\"],[1,\\\"#2E76B9\\\"]],\\\"width\\\":1}},\\\"name\\\":\\\"内部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"detail\\\":{\\\"offsetCenter\\\":[0,50],\\\"show\\\":false,\\\"textStyle\\\":{\\\"padding\\\":[0,0,0,0],\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":\\\"30%\\\",\\\"title\\\":{\\\"offsetCenter\\\":[0,26],\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"normal\\\"}}},\\\"outerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#4277FF\\\"],[1,\\\"#4277FF\\\"]],\\\"width\\\":2}},\\\"name\\\":\\\"外部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"basic\\\":{\\\"startAngle\\\":180,\\\"endAngle\\\":0},\\\"innerShadow\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"customGradient\\\":{\\\"endColor\\\":\\\"#4277FFCC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#4277FF00\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":1,\\\"y2\\\":0,\\\"x2\\\":0,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#2de69600\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#2de696\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":100}},\\\"name\\\":\\\"内部阴影\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":79}},\\\"valuePrefix\\\":\\\"已使用：\\\",\\\"titlePrefix\\\":\\\"总人数：\\\",\\\"valueMapping\\\":\\\"used\\\",\\\"titleMapping\\\":\\\"total\\\",\\\"valueSuffix\\\":\\\"辆\\\"}}}]},\\\"component\\\":\\\"JGroup\\\",\\\"w\\\":2038.934349355217,\\\"x\\\":-127,\\\"y\\\":76,\\\"componentName\\\":\\\"投资\\\",\\\"pageCompId\\\":\\\"1151112776903086080\\\",\\\"equalProportion\\\":false,\\\"key\\\":\\\"ad56ff31-2be7-4967-8ad8-22fb9249deac\\\",\\\"group\\\":true},{\\\"visible\\\":false,\\\"h\\\":988.6694020273344,\\\"i\\\":\\\"es-drager-1762421939532-37\\\",\\\"props\\\":{\\\"elements\\\":[{\\\"component\\\":\\\"JStatsSummary\\\",\\\"visible\\\":true,\\\"w\\\":713.0000000000001,\\\"x\\\":571.0199296600234,\\\"h\\\":129,\\\"i\\\":\\\"6ba699ad-92ee-4f14-b66c-7d2cbce6057e\\\",\\\"y\\\":68.20046885031215,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.898207703248671%\\\",\\\"left\\\":\\\"30.823751360096747%\\\",\\\"width\\\":\\\"38.48785931663358%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"13.047839827497103%\\\"},\\\"componentName\\\":\\\"统计概览（背景模式）\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"成本已支付金额\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 96790,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"万元\\\\\\\",\\\\n    \\\\\\\"compareLabel\\\\\\\": \\\\\\\"同比\\\\\\\",\\\\n    \\\\\\\"compareValue\\\\\\\": \\\\\\\"20%\\\\\\\",\\\\n    \\\\\\\"compareState\\\\\\\": \\\\\\\"0\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"2\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"成本未付款金额\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 96.79,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"%\\\\\\\",\\\\n    \\\\\\\"compareLabel\\\\\\\": \\\\\\\"同比\\\\\\\",\\\\n    \\\\\\\"compareValue\\\\\\\": \\\\\\\"20%\\\\\\\",\\\\n    \\\\\\\"compareState\\\\\\\": \\\\\\\"0\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"3\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"租赁应收未回金额\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 10790,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"元\\\\\\\",\\\\n    \\\\\\\"compareLabel\\\\\\\": \\\\\\\"同比\\\\\\\",\\\\n    \\\\\\\"compareValue\\\\\\\": \\\\\\\"20%\\\\\\\",\\\\n    \\\\\\\"compareState\\\\\\\": \\\\\\\"1\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"4\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"租赁项目欠款金额\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 86790,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"元\\\\\\\",\\\\n    \\\\\\\"compareLabel\\\\\\\": \\\\\\\"同比\\\\\\\",\\\\n    \\\\\\\"compareValue\\\\\\\": \\\\\\\"20%\\\\\\\",\\\\n    \\\\\\\"compareState\\\\\\\": \\\\\\\"1\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":713.0000000000001,\\\"height\\\":129},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":713,\\\"dataType\\\":1,\\\"h\\\":129,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"layout\\\":{\\\"padding\\\":{\\\"top\\\":5,\\\"left\\\":20,\\\"bottom\\\":0,\\\"right\\\":20},\\\"borderColor\\\":\\\"#0f66ff59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"justify\\\":\\\"space-between\\\",\\\"borderWidth\\\":0,\\\"gap\\\":16,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"contain\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"drag/lib/img/bg01.png\\\"},\\\"color\\\":\\\"#0b2b63\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"image\\\"}},\\\"fieldMap\\\":{\\\"compareValue\\\":\\\"compareValue\\\",\\\"unit\\\":\\\"suffix\\\",\\\"negativeValue\\\":\\\"0\\\",\\\"compareState\\\":\\\"compareState\\\",\\\"label\\\":\\\"name\\\",\\\"value\\\":\\\"value\\\",\\\"positiveValue\\\":\\\"1\\\",\\\"compareLabel\\\":\\\"compareLabel\\\"},\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"padding\\\":{\\\"horizontal\\\":3,\\\"vertical\\\":15},\\\"borderColor\\\":\\\"#0F66FF59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"borderWidth\\\":0,\\\"blur\\\":24,\\\"minWidth\\\":100,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"cover\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"\\\"},\\\"color\\\":\\\"#0B2B6300\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"none\\\"}},\\\"sections\\\":{\\\"middle\\\":{\\\"compare\\\":{\\\"valueStyle\\\":{\\\"positiveGradient\\\":{\\\"endColor\\\":\\\"#15f0c5\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#15f0c5\\\"},\\\"positiveColor\\\":\\\"#00FFAE\\\",\\\"fontSize\\\":14,\\\"negativeColor\\\":\\\"#FF0000\\\",\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"negativeGradient\\\":{\\\"endColor\\\":\\\"#D0021B\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#D0021B\\\"},\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"alignItems\\\":\\\"center\\\",\\\"labelStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#CFEAFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ED3FF\\\"},\\\"fontColor\\\":\\\"#DADADA\\\"},\\\"label\\\":\\\"同比\\\"},\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"type\\\":\\\"compare\\\",\\\"align\\\":\\\"center\\\"},\\\"top\\\":{\\\"minHeight\\\":40,\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"paddingTop\\\":5,\\\"type\\\":\\\"value\\\",\\\"align\\\":\\\"center\\\",\\\"value\\\":{\\\"unit\\\":{\\\"fontSize\\\":16,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#96F5F8\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ED3FF\\\"},\\\"fontWeight\\\":500,\\\"fontColor\\\":\\\"#9ED3FF\\\"},\\\"unitGap\\\":6,\\\"fontSize\\\":24,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#96F5F8\\\"},\\\"fontWeight\\\":600,\\\"fontColor\\\":\\\"#D8F1FF\\\"}},\\\"bottom\\\":{\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"label\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#C9E6FF\\\"},\\\"type\\\":\\\"label\\\",\\\"align\\\":\\\"center\\\"}}}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":83.00000204530508,\\\"x\\\":1683.8100819494582,\\\"h\\\":51.999996548865546,\\\"i\\\":\\\"es-drager-1762851269890-2\\\",\\\"y\\\":81.32122205883473,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.22532%\\\",\\\"left\\\":\\\"90.89235%\\\",\\\"width\\\":\\\"4.480354000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.259593999999999%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":83.00000204530508,\\\"height\\\":51.999996548865546},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_29_1763551901494.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":83.00000204530508,\\\"x\\\":1530.6096120950147,\\\"h\\\":51.999996548865546,\\\"i\\\":\\\"es-drager-1762851253605-1\\\",\\\"y\\\":80.0551023625165,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.097257000000003%\\\",\\\"left\\\":\\\"82.62256300000001%\\\",\\\"width\\\":\\\"4.480354000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.259593999999999%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":83.00000204530508,\\\"height\\\":51.999996548865546},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_27_1763551895529.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":43,\\\"i\\\":\\\"es-drager-1762849064798-20\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":51,\\\"x\\\":1169.6975226315708,\\\"y\\\":432.5854492285337,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"43.754307389455725%\\\",\\\"left\\\":\\\"63.14046801410759%\\\",\\\"width\\\":\\\"2.752988534569863%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.3492799424990345%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.99998699681006,\\\"height\\\":43.000010455188466},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2d91eb63-bada-4811-8c1b-65189dcf7599\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000010455188466,\\\"i\\\":\\\"es-drager-1762849058217-19\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":51.99998699681006,\\\"x\\\":1038.021084598434,\\\"y\\\":487.0285938030566,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"49.2610161500266%\\\",\\\"left\\\":\\\"56.03255185375025%\\\",\\\"width\\\":\\\"2.806968000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.3492809999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.99998699681005,\\\"height\\\":43.000010455188466},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2d91eb63-bada-4811-8c1b-65189dcf7599\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":51.99998699681006,\\\"x\\\":683.5075917950732,\\\"h\\\":43.000010455188466,\\\"i\\\":\\\"es-drager-1762849043828-18\\\",\\\"y\\\":489.56082449258037,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"49.51714126974116%\\\",\\\"left\\\":\\\"36.89585418633911%\\\",\\\"width\\\":\\\"2.806968000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.3492809999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.99998699681005,\\\"height\\\":43.000010455188466},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2d91eb63-bada-4811-8c1b-65189dcf7599\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":51.99998699681006,\\\"x\\\":937.9976478556124,\\\"h\\\":43.000010455188466,\\\"i\\\":\\\"es-drager-1762849029696-16\\\",\\\"y\\\":292.0461788601647,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"29.539315999999992%\\\",\\\"left\\\":\\\"50.63327000000002%\\\",\\\"width\\\":\\\"2.806968000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.3492809999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.99998699681005,\\\"height\\\":43.000010455188466},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2d91eb63-bada-4811-8c1b-65189dcf7599\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":101.00000181927524,\\\"x\\\":1150.971855353579,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"es-drager-1762849006795-15\\\",\\\"y\\\":409.787098507104,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"41.44834437748427%\\\",\\\"left\\\":\\\"62.129653360804035%\\\",\\\"width\\\":\\\"5.451997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"794,150\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":101.00000181927523,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to top\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"a04f824f-4454-4452-8bbf-651d4d5477c3\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":101.00000181927524,\\\"x\\\":1019.4243913572378,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"es-drager-1762849000354-14\\\",\\\"y\\\":465.62531457297723,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"47.096159102140774%\\\",\\\"left\\\":\\\"55.028699240536014%\\\",\\\"width\\\":\\\"5.451997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"994,150\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":101.00000181927523,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to top\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"a04f824f-4454-4452-8bbf-651d4d5477c3\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":101.00000181927524,\\\"x\\\":909.4009228742274,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"es-drager-1762848992281-13\\\",\\\"y\\\":268.2396227476817,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"27.131377%\\\",\\\"left\\\":\\\"49.089614000000005%\\\",\\\"width\\\":\\\"5.451997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"94,000\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":101.00000181927523,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to top\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"a04f824f-4454-4452-8bbf-651d4d5477c3\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":101.00000181927524,\\\"x\\\":659.9753814335057,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"es-drager-1762848979407-12\\\",\\\"y\\\":468.2865173043536,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"47.3653292338268%\\\",\\\"left\\\":\\\"35.62558153303556%\\\",\\\"width\\\":\\\"5.451997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"994,150\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":101.00000181927523,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to top\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"a04f824f-4454-4452-8bbf-651d4d5477c3\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":76.00000522075926,\\\"x\\\":1146.1007905389508,\\\"h\\\":43.00000056849445,\\\"i\\\":\\\"es-drager-1762848746940-11\\\",\\\"y\\\":490.1176839485176,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"49.57346540142718%\\\",\\\"left\\\":\\\"61.86671246696447%\\\",\\\"width\\\":\\\"4.102492999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.34928%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":76.00000522075925,\\\"height\\\":43.00000056849446},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"54cf0d91-5cd0-40b5-8034-95d55014f90e\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":76.00000522075926,\\\"x\\\":1034.8112462126353,\\\"h\\\":43.00000056849445,\\\"i\\\":\\\"es-drager-1762848738842-10\\\",\\\"y\\\":540.8914319443187,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"54.70902920988389%\\\",\\\"left\\\":\\\"55.85928424053601%\\\",\\\"width\\\":\\\"4.102492999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.34928%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":76.00000522075925,\\\"height\\\":43.00000056849446},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"54cf0d91-5cd0-40b5-8034-95d55014f90e\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":76.00000522075926,\\\"x\\\":926.053909410244,\\\"h\\\":43.00000056849445,\\\"i\\\":\\\"es-drager-1762848724480-9\\\",\\\"y\\\":354.9008064339704,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"35.896812999999995%\\\",\\\"left\\\":\\\"49.98854500000001%\\\",\\\"width\\\":\\\"4.102492999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.34928%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":76.00000522075925,\\\"height\\\":43.00000056849446},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"54cf0d91-5cd0-40b5-8034-95d55014f90e\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":76.00000522075926,\\\"x\\\":675.3622355462353,\\\"h\\\":43.00000056849445,\\\"i\\\":\\\"es-drager-1762848716458-8\\\",\\\"y\\\":554.9477012273585,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"56.130765257769696%\\\",\\\"left\\\":\\\"36.45616649294621%\\\",\\\"width\\\":\\\"4.102492999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.34928%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":76.00000522075925,\\\"height\\\":43.00000056849446},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"54cf0d91-5cd0-40b5-8034-95d55014f90e\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":59.99999924656725,\\\"x\\\":932.8722283986059,\\\"h\\\":84.99999169692029,\\\"i\\\":\\\"es-drager-1762848356232-7\\\",\\\"y\\\":280.17468158185136,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"28.338560999999995%\\\",\\\"left\\\":\\\"50.35659900000001%\\\",\\\"width\\\":\\\"3.238810000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"8.597412999999998%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":59.99999924656725,\\\"height\\\":84.99999169692029},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":101.00000181927524,\\\"x\\\":789.2485271715286,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"es-drager-1762848336840-6\\\",\\\"y\\\":322.81171698679043,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"32.65112850917029%\\\",\\\"left\\\":\\\"42.603767573124884%\\\",\\\"width\\\":\\\"5.451997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"1,994,150\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":101.00000181927523,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to top\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"a04f824f-4454-4452-8bbf-651d4d5477c3\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":51.99998699681006,\\\"x\\\":811.5146364804583,\\\"h\\\":43.000010455188466,\\\"i\\\":\\\"es-drager-1762848322084-5\\\",\\\"y\\\":345.3521537580295,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"34.93100454508466%\\\",\\\"left\\\":\\\"43.805695879732%\\\",\\\"width\\\":\\\"2.806968000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.3492809999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.99998699681005,\\\"height\\\":43.000010455188466},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2d91eb63-bada-4811-8c1b-65189dcf7599\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":76.00000522075926,\\\"x\\\":803.3692688716295,\\\"h\\\":43.00000056849445,\\\"i\\\":\\\"es-drager-1762848304881-4\\\",\\\"y\\\":430.9969452788255,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"43.59363649719883%\\\",\\\"left\\\":\\\"43.36600757312489%\\\",\\\"width\\\":\\\"4.102492999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.34928%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":76.00000522075925,\\\"height\\\":43.00000056849446},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"54cf0d91-5cd0-40b5-8034-95d55014f90e\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":64.00000537144585,\\\"x\\\":1033.0246263328966,\\\"h\\\":88.9999997971126,\\\"i\\\":\\\"es-drager-1762848210868-3\\\",\\\"y\\\":465.157090512513,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"47.048800090169316%\\\",\\\"left\\\":\\\"55.76284220044669%\\\",\\\"width\\\":\\\"3.454731000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.001997999999999%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":64.00000537144585,\\\"height\\\":88.9999997971126},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":61.99999304634536,\\\"x\\\":1164.7010515207064,\\\"h\\\":84.99999169692029,\\\"i\\\":\\\"es-drager-1762848205032-2\\\",\\\"y\\\":414.5123157421458,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"41.92628141339864%\\\",\\\"left\\\":\\\"62.870757667411134%\\\",\\\"width\\\":\\\"3.3467700000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"8.597412999999998%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":61.99999304634537,\\\"height\\\":84.99999169692029},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":70.00000529610256,\\\"x\\\":675.9789007962789,\\\"h\\\":91.9999984572363,\\\"i\\\":\\\"es-drager-1762848199690-1\\\",\\\"y\\\":474.01993004375464,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"47.94524125776971%\\\",\\\"left\\\":\\\"36.48945418633911%\\\",\\\"width\\\":\\\"3.7786120000000007%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.305436%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":70.00000529610256,\\\"height\\\":91.9999984572363},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":11.000002949424383,\\\"x\\\":247.82881673228633,\\\"h\\\":17.000002294061673,\\\"i\\\":\\\"es-drager-1762776290330-1\\\",\\\"y\\\":237.77959838698735,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.050465999999997%\\\",\\\"left\\\":\\\"13.377841000000002%\\\",\\\"width\\\":\\\"0.593782%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"1.719483%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":11.000002949424381,\\\"height\\\":17.000002294061673},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_17_1763552004773.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":131.9999983424479,\\\"x\\\":379.57794515961206,\\\"h\\\":35.99999380817846,\\\"i\\\":\\\"es-drager-1762775755103-5\\\",\\\"y\\\":100.65181473429544,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"10.180533%\\\",\\\"left\\\":\\\"20.489681000000004%\\\",\\\"width\\\":\\\"7.125381999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.6412570000000004%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"超支合同总数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":131.9999983424479,\\\"height\\\":35.99999380817846},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFD3D3\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":41.99999947259708,\\\"x\\\":394.9003504185903,\\\"h\\\":30.00000637462507,\\\"i\\\":\\\"es-drager-1762775743083-4\\\",\\\"y\\\":85.321220272333,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.629903999999998%\\\",\\\"left\\\":\\\"21.316787000000005%\\\",\\\"width\\\":\\\"2.267167000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.034382%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":41.99999947259708,\\\"height\\\":30.00000637462507},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBE5F5\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":51.00000862224333,\\\"x\\\":373.37631562661164,\\\"h\\\":37.00000324824705,\\\"i\\\":\\\"es-drager-1762775732063-3\\\",\\\"y\\\":82.78898087969645,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.373777999999996%\\\",\\\"left\\\":\\\"20.154916000000004%\\\",\\\"width\\\":\\\"2.752989000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7424040000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"51\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.00000862224333,\\\"height\\\":37.00000324824705},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBE5F5\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":26,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":131.9999983424479,\\\"x\\\":175.8616630329137,\\\"h\\\":35.99999380817846,\\\"i\\\":\\\"es-drager-1762775491330-2\\\",\\\"y\\\":102.04689646741414,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"10.321639999999999%\\\",\\\"left\\\":\\\"9.493042000000003%\\\",\\\"width\\\":\\\"7.125381999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.6412570000000004%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同到期总数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":131.9999983424479,\\\"height\\\":35.99999380817846},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#EFF1CA\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":113.99999856847775,\\\"x\\\":1682.1316877454951,\\\"h\\\":32.99999514805475,\\\"i\\\":\\\"es-drager-1762421807094-36\\\",\\\"y\\\":163.459559605057,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"16.533287999999995%\\\",\\\"left\\\":\\\"90.80175000000001%\\\",\\\"width\\\":\\\"6.153739000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.3378189999999996%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"总应收金额\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":113.99999856847775,\\\"height\\\":32.99999514805475},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#ACCDF2\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#D7EDFF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#4D699D\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2811e8ee-093c-4be8-8ae8-e06b1d2b3b0c\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":51.00000862224333,\\\"x\\\":1736.1289403823714,\\\"h\\\":39.00000235499617,\\\"i\\\":\\\"es-drager-1762421803113-35\\\",\\\"y\\\":132.5240243353311,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"13.404280952114176%\\\",\\\"left\\\":\\\"93.71653073348223%\\\",\\\"width\\\":\\\"2.752989000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.944695999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.00000862224333,\\\"height\\\":39.00000235499617},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#A5BECF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"58cdf874-8a47-4b55-8c44-8bfc3eb806d9\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":69.00000839621347,\\\"x\\\":1683.131684645384,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"es-drager-1762421795606-34\\\",\\\"y\\\":125.45955680343542,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.689738%\\\",\\\"left\\\":\\\"90.85573%\\\",\\\"width\\\":\\\"3.7246319999999993%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"3898\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":69.00000839621347,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"a04f824f-4454-4452-8bbf-651d4d5477c3\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":113.99999856847775,\\\"x\\\":1522.6872394711825,\\\"h\\\":32.99999514805475,\\\"i\\\":\\\"es-drager-1762421729992-33\\\",\\\"y\\\":163.459559605057,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"16.533287999999995%\\\",\\\"left\\\":\\\"82.194912%\\\",\\\"width\\\":\\\"6.153739000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.3378189999999996%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目累计欠款\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":113.99999856847775,\\\"height\\\":32.99999514805475},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#ACCDF2\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#D7EDFF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#4D699D\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2811e8ee-093c-4be8-8ae8-e06b1d2b3b0c\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":51.00000862224333,\\\"x\\\":1567.9533708468402,\\\"h\\\":39.00000235499617,\\\"i\\\":\\\"es-drager-1762421726217-32\\\",\\\"y\\\":133.2579137508141,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"13.478510964085629%\\\",\\\"left\\\":\\\"84.63838534669647%\\\",\\\"width\\\":\\\"2.752989000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.944695999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.00000862224333,\\\"height\\\":39.00000235499617},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#A5BECF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"58cdf874-8a47-4b55-8c44-8bfc3eb806d9\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":64.00000537144585,\\\"x\\\":1524.798348154353,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"es-drager-1762421719453-31\\\",\\\"y\\\":126.45955635680997,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.790883999999997%\\\",\\\"left\\\":\\\"82.30887%\\\",\\\"width\\\":\\\"3.454731000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"898\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":64.00000537144585,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FFC5AB\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#E86B6B\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"a04f824f-4454-4452-8bbf-651d4d5477c3\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":64.00000537144585,\\\"x\\\":1383.5322244068514,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"es-drager-1762421654488-30\\\",\\\"y\\\":125.45955680343542,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.689738%\\\",\\\"left\\\":\\\"74.68330100000001%\\\",\\\"width\\\":\\\"3.454731000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"198\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":64.00000537144585,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#6BE5E8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"a04f824f-4454-4452-8bbf-651d4d5477c3\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":51.00000862224333,\\\"x\\\":1420.8772050872835,\\\"h\\\":39.00000235499617,\\\"i\\\":\\\"es-drager-1762421637698-29\\\",\\\"y\\\":131.7462480034502,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"13.325611952114174%\\\",\\\"left\\\":\\\"76.69918930660712%\\\",\\\"width\\\":\\\"2.752989000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.944695999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.00000862224333,\\\"height\\\":39.00000235499617},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#A5BECF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"58cdf874-8a47-4b55-8c44-8bfc3eb806d9\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":77.99999902053742,\\\"x\\\":1392.4094662453533,\\\"h\\\":32.99999514805475,\\\"i\\\":\\\"es-drager-1762421586808-28\\\",\\\"y\\\":164.68177249323125,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"16.656909999999996%\\\",\\\"left\\\":\\\"75.162496%\\\",\\\"width\\\":\\\"4.210453000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.3378189999999996%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"欠款数量\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":77.99999902053742,\\\"height\\\":32.99999514805475},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#ACCDF2\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#D7EDFF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#4D699D\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2811e8ee-093c-4be8-8ae8-e06b1d2b3b0c\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000010455188466,\\\"i\\\":\\\"es-drager-1762421434219-27\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":133.99999214222606,\\\"x\\\":1711.798361243923,\\\"y\\\":203.45956151342773,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"20.579129999999996%\\\",\\\"left\\\":\\\"92.40316200000001%\\\",\\\"width\\\":\\\"7.233342000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.3492809999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970187673600\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目/合同名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":133.99999214222606,\\\"height\\\":43.000010455188466},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#A2C8F2\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"40d1d9a6-fa9d-4e2d-b25f-aa85c9c09609\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000010455188466,\\\"i\\\":\\\"es-drager-1762420435770-26\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":99.0000080194971,\\\"x\\\":1312.7983569915898,\\\"y\\\":198.45955385986088,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"20.073398999999995%\\\",\\\"left\\\":\\\"70.865075%\\\",\\\"width\\\":\\\"5.344037%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.3492809999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970187673600\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"费项明细\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":99.0000080194971,\\\"height\\\":43.000010455188466},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"40d1d9a6-fa9d-4e2d-b25f-aa85c9c09609\\\"},{\\\"component\\\":\\\"JMultipleBar\\\",\\\"visible\\\":true,\\\"w\\\":514.9999966205892,\\\"x\\\":1324.7983383155806,\\\"h\\\":202.99999831528342,\\\"i\\\":\\\"0e6f2873-f014-44d9-92dc-fb5faf81406f\\\",\\\"y\\\":242.4595638684239,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.523825999999996%\\\",\\\"left\\\":\\\"71.512836%\\\",\\\"width\\\":\\\"27.799786000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"20.532647%\\\"},\\\"componentName\\\":\\\"对比柱形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"租金\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 910,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"应收\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"水电\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 910,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"应收\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"物业\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 960,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"应收\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"租金\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 800,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实收\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"水电\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 700,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实收\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"物业\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 700,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实收\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"租金\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 480,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"欠款\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"水电\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 230,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"欠款\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"物业\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 400,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"欠款\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":514.9999966205892,\\\"height\\\":202.99999831528342},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"name\\\":\\\"单位(万元)\\\",\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color1\\\":\\\"#006CFF00\\\",\\\"color\\\":\\\"#006CFFB3\\\"},{\\\"color1\\\":\\\"#00D8FF00\\\",\\\"color\\\":\\\"#00D8FFB5\\\"},{\\\"color1\\\":\\\"#FFBB3800\\\",\\\"color\\\":\\\"#FFBB38B5\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":24,\\\"bottom\\\":18,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":15,\\\"barGap\\\":\\\"100%\\\",\\\"itemStyle\\\":{\\\"borderRadius\\\":7},\\\"label\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"show\\\":true,\\\"position\\\":\\\"top\\\"}}],\\\"legend\\\":{},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"visible\\\":true,\\\"h\\\":43.000010455188466,\\\"i\\\":\\\"es-drager-1762420262561-25\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":99.0000080194971,\\\"x\\\":1318.7983569162466,\\\"y\\\":718.4595490085985,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"72.66934199999999%\\\",\\\"left\\\":\\\"71.18895600000002%\\\",\\\"width\\\":\\\"5.344037%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.3492809999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970187673600\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"欠款分析\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":99.0000080194971,\\\"height\\\":43.000010455188466},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"40d1d9a6-fa9d-4e2d-b25f-aa85c9c09609\\\"},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":514.9999966205892,\\\"x\\\":1329.7983413403485,\\\"h\\\":220.00000060934508,\\\"i\\\":\\\"c01aa5d0-70b0-4813-b062-a2ee7a8589dd\\\",\\\"y\\\":764.4595383505226,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"77.32205899999998%\\\",\\\"left\\\":\\\"71.78273700000001%\\\",\\\"width\\\":\\\"27.799786000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"22.25213%\\\"},\\\"componentName\\\":\\\"滚动列表(单行)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[{\\\\\\\"id\\\\\\\":1,\\\\\\\"projectName\\\\\\\":\\\\\\\"项目A\\\\\\\",\\\\\\\"officeFee\\\\\\\":1200,\\\\\\\"travelFee\\\\\\\":5600,\\\\\\\"arrearsAmount\\\\\\\":3000},{\\\\\\\"id\\\\\\\":2,\\\\\\\"projectName\\\\\\\":\\\\\\\"项目B\\\\\\\",\\\\\\\"officeFee\\\\\\\":800,\\\\\\\"travelFee\\\\\\\":4200,\\\\\\\"arrearsAmount\\\\\\\":0},{\\\\\\\"id\\\\\\\":3,\\\\\\\"projectName\\\\\\\":\\\\\\\"项目C\\\\\\\",\\\\\\\"officeFee\\\\\\\":1500,\\\\\\\"travelFee\\\\\\\":1800,\\\\\\\"arrearsAmount\\\\\\\":1200},{\\\\\\\"id\\\\\\\":4,\\\\\\\"projectName\\\\\\\":\\\\\\\"项目D\\\\\\\",\\\\\\\"officeFee\\\\\\\":600,\\\\\\\"travelFee\\\\\\\":2300,\\\\\\\"arrearsAmount\\\\\\\":900},{\\\\\\\"id\\\\\\\":5,\\\\\\\"projectName\\\\\\\":\\\\\\\"项目E\\\\\\\",\\\\\\\"officeFee\\\\\\\":950,\\\\\\\"travelFee\\\\\\\":3000,\\\\\\\"arrearsAmount\\\\\\\":150}]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":514.9999966205892,\\\"height\\\":220.00000060934508},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"timeOut\\\":0,\\\"option\\\":{\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"marginRight\\\":15,\\\"name\\\":\\\"项目名称\\\",\\\"width\\\":116,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"projectName\\\",\\\"marginLeft\\\":10},{\\\"marginRight\\\":1,\\\"textAlign\\\":\\\"left\\\",\\\"compose\\\":{\\\"contentStyle\\\":{\\\"marginRight\\\":4,\\\"fontSize\\\":15,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#038F8A\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#06CFC8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"marginLeft\\\":3},\\\"suffixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"prefix\\\":\\\"办公费\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#DEDEDE\\\"},\\\"suffix\\\":\\\"元\\\",\\\"enabled\\\":true},\\\"name\\\":\\\"办公费\\\",\\\"width\\\":108,\\\"textStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"officeFee\\\"},{\\\"marginRight\\\":13,\\\"textAlign\\\":\\\"left\\\",\\\"compose\\\":{\\\"contentStyle\\\":{\\\"marginRight\\\":1,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#038F8A\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#06CFC8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"marginLeft\\\":1},\\\"suffixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"prefix\\\":\\\"差旅费\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#DEDEDE\\\"},\\\"suffix\\\":\\\"元\\\",\\\"enabled\\\":true},\\\"name\\\":\\\"差旅费\\\",\\\"width\\\":111,\\\"textStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"travelFee\\\"},{\\\"textAlign\\\":\\\"left\\\",\\\"compose\\\":{\\\"contentStyle\\\":{\\\"marginRight\\\":2,\\\"fontSize\\\":16,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0DA183\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#12E3B9\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginLeft\\\":3},\\\"suffixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"prefix\\\":\\\"欠款金额\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"suffix\\\":\\\"元\\\",\\\"enabled\\\":true},\\\"name\\\":\\\"欠款金额\\\",\\\"width\\\":122,\\\"textStyle\\\":{\\\"fontColor\\\":\\\"#DC3545\\\"},\\\"key\\\":\\\"arrearsAmount\\\"}],\\\"itemsPerRow\\\":1,\\\"borderRadius\\\":8,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"backgroundColor\\\":\\\"#FFFFFF\\\",\\\"backgroundImg\\\":\\\"drag/lib/img/scrollList-bg-01.png\\\",\\\"alternateBackgroundColor\\\":\\\"#F8F9FA\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":10,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"image\\\",\\\"height\\\":44}}}},{\\\"visible\\\":true,\\\"h\\\":43.000010455188466,\\\"i\\\":\\\"es-drager-1762420151147-24\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":99.0000080194971,\\\"x\\\":1319.128959818718,\\\"y\\\":444.6612017548762,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"44.97572199999999%\\\",\\\"left\\\":\\\"71.206802%\\\",\\\"width\\\":\\\"5.344037%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.3492809999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970187673600\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"账期监控\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":99.0000080194971,\\\"height\\\":43.000010455188466},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"40d1d9a6-fa9d-4e2d-b25f-aa85c9c09609\\\"},{\\\"component\\\":\\\"JPermanentCalendar\\\",\\\"visible\\\":true,\\\"w\\\":477.0000032728707,\\\"x\\\":1347.6529914352425,\\\"h\\\":219.0000010559705,\\\"i\\\":\\\"da53da9d-fbc3-45f8-8f66-da05f0b73aad\\\",\\\"y\\\":493.1934304894369,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"49.884564999999995%\\\",\\\"left\\\":\\\"72.74653400000001%\\\",\\\"width\\\":\\\"25.748540000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"22.150983999999998%\\\"},\\\"componentName\\\":\\\"万日历\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[],\\\"dataType\\\":1,\\\"h\\\":480,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-05\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 620000\\\\n  },\\\\n  {\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-08\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 265000\\\\n  },\\\\n  {\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-10\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 564000\\\\n  },\\\\n  {\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-14\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 120000\\\\n  },\\\\n  {\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-15\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 565000\\\\n  },\\\\n  {\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-20\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 120000\\\\n  },\\\\n  {\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-24\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 102000\\\\n  },\\\\n  {\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-25\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 120\\\\n  },\\\\n  {\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-28\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 103\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":477.0000032728707,\\\"height\\\":219.0000010559705},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":1000,\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"container\\\":{\\\"border\\\":{\\\"color\\\":\\\"#2B6CB0\\\",\\\"width\\\":0,\\\"style\\\":\\\"solid\\\",\\\"enabled\\\":true},\\\"padding\\\":{\\\"top\\\":5,\\\"left\\\":4,\\\"bottom\\\":8,\\\"right\\\":0},\\\"margin\\\":{\\\"bottom\\\":0},\\\"background\\\":{\\\"color\\\":\\\"#00000000\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0A1E3A\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to bottom\\\",\\\"startColor\\\":\\\"#0B2B58\\\"}}},\\\"dataVal\\\":{\\\"offsetX\\\":-2,\\\"offsetY\\\":-15,\\\"color\\\":{\\\"gradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"value\\\":\\\"#D0021B\\\"},\\\"fontSize\\\":14,\\\"position\\\":\\\"top\\\"},\\\"week\\\":{\\\"color\\\":{\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"value\\\":\\\"#FFFFFF\\\"},\\\"prefix\\\":\\\"周\\\",\\\"start\\\":\\\"sun\\\",\\\"fontSize\\\":21,\\\"marginBottom\\\":21,\\\"showEn\\\":false,\\\"fontWeight\\\":\\\"bold\\\",\\\"height\\\":22},\\\"month\\\":{\\\"offsetTop\\\":-11,\\\"color\\\":{\\\"gradient\\\":{\\\"endColor\\\":\\\"#ffffff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom\\\",\\\"startColor\\\":\\\"#ffffff\\\"},\\\"value\\\":\\\"#ffffff\\\"},\\\"show\\\":true,\\\"en\\\":{\\\"color\\\":{\\\"value\\\":\\\"#FFFFFF\\\"},\\\"fontSize\\\":29,\\\"opacity\\\":1},\\\"offsetLeft\\\":0,\\\"cn\\\":{\\\"color\\\":{\\\"gradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"value\\\":\\\"#FFFFFF\\\"},\\\"fontSize\\\":70,\\\"opacity\\\":0.11,\\\"fontStyle\\\":\\\"italic\\\"},\\\"position\\\":\\\"center\\\",\\\"showEn\\\":false},\\\"field\\\":{\\\"unit\\\":\\\"万\\\",\\\"appendUnit\\\":true,\\\"dateField\\\":\\\"date\\\",\\\"valueField\\\":\\\"value\\\"},\\\"title\\\":{\\\"color\\\":{\\\"gradient\\\":{\\\"endColor\\\":\\\"#3bc6ff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#9fe5ff\\\"},\\\"value\\\":\\\"#9fe5ff\\\"},\\\"show\\\":true},\\\"cell\\\":{\\\"width\\\":120,\\\"day\\\":{\\\"color\\\":{\\\"value\\\":\\\"#FFFFFF\\\"},\\\"fontSize\\\":14},\\\"height\\\":25},\\\"circle\\\":{\\\"dashed\\\":false,\\\"strokeWidth\\\":4,\\\"glowStrength\\\":0.45,\\\"fillOpacity\\\":0.16,\\\"size\\\":37,\\\"minIntensity\\\":0.55,\\\"pulse\\\":true,\\\"doubleRing\\\":true,\\\"glowEnabled\\\":true,\\\"enabled\\\":true}}}},{\\\"component\\\":\\\"JMultipleBar\\\",\\\"visible\\\":true,\\\"w\\\":756.0000090320697,\\\"x\\\":546.7983604353072,\\\"h\\\":283.000002132025,\\\"i\\\":\\\"c55fc027-14ba-4db5-81ea-a7ec69526940\\\",\\\"y\\\":705.6693998953094,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"71.375669%\\\",\\\"left\\\":\\\"29.516267000000003%\\\",\\\"width\\\":\\\"40.809007000000015%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"28.62433100000001%\\\"},\\\"componentName\\\":\\\"对比柱形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 325,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 465,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 305,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 105,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 256,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 600,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"7月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 500,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"8月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 132,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"9月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 156,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"10月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 213,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"11月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 356,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"12月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 113,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 50,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 450,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 365,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 355,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 49,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 60,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"7月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 117,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"8月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 229,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"9月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 119,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"10月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 103,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"11月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 90,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"12月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 143,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":756.0000090320697,\\\"height\\\":283.000002132025},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"name\\\":\\\"单位(万元)\\\",\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color1\\\":\\\"#00A8FF\\\",\\\"color\\\":\\\"#0F3352\\\"},{\\\"color1\\\":\\\"#15DBCB\\\",\\\"color\\\":\\\"#0F3352\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":35,\\\"left\\\":1,\\\"bottom\\\":18,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":12,\\\"itemStyle\\\":{\\\"borderRadius\\\":0},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}}],\\\"legend\\\":{\\\"r\\\":1,\\\"t\\\":1},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"visible\\\":true,\\\"h\\\":59.9999929758621,\\\"i\\\":\\\"es-drager-1762419089506-23\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.00001021548871,\\\"x\\\":572.3306080699609,\\\"y\\\":650.5322268067889,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"65.798762%\\\",\\\"left\\\":\\\"30.894502000000006%\\\",\\\"width\\\":\\\"9.176629%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.0687619999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970187673600\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"资金流动趋势\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.00001021548871,\\\"height\\\":59.9999929758621},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"40d1d9a6-fa9d-4e2d-b25f-aa85c9c09609\\\"},{\\\"visible\\\":true,\\\"h\\\":35.99999380817846,\\\"i\\\":\\\"es-drager-1762419081801-22\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JImg\\\",\\\"w\\\":725.9999908834636,\\\"x\\\":555.7983510596312,\\\"y\\\":664.266120184477,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"67.18789099999998%\\\",\\\"left\\\":\\\"30.002088000000004%\\\",\\\"width\\\":\\\"39.18960100000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.6412570000000004%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146300970204450816\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":725.9999908834637,\\\"height\\\":35.99999380817846},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"d05d8636-fe01-4048-8a21-99851c7012b1\\\"},{\\\"visible\\\":true,\\\"h\\\":37.00000324824705,\\\"i\\\":\\\"es-drager-1762419024578-19\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":134.99998904211512,\\\"x\\\":551.209851019992,\\\"y\\\":210.79835561773643,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.321419999999993%\\\",\\\"left\\\":\\\"29.754400000000004%\\\",\\\"width\\\":\\\"7.287322000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7424040000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970175090688\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目欠款分布\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":134.99998904211512,\\\"height\\\":37.00000324824705},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"e190480f-f18e-453c-88fe-e109292f6fdf\\\"},{\\\"visible\\\":true,\\\"h\\\":346.9999933213852,\\\"i\\\":\\\"f8220f2d-63b9-471c-a776-57a0d72f73c2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JListProgress\\\",\\\"w\\\":533.9999932944485,\\\"x\\\":13.72565215056514,\\\"y\\\":623.9917724037379,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.11429999999999%\\\",\\\"left\\\":\\\"0.7409130000000002%\\\",\\\"width\\\":\\\"28.825409000000008%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"35.09767699999999%\\\"},\\\"componentName\\\":\\\"列表进度图\\\",\\\"pageCompId\\\":\\\"1146300970011512832\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"2025年度战略合作框架协议\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 1200000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-12-31\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-06-15\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 800000\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"智能制造设备采购合同\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 850000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-20\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-05-30\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 500000\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"信息化系统集成服务合同\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 2000000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2026-01-15\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-07-01\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 1500000\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"2025年技术支持与维护协议\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 600000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-10-10\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-04-28\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 300000\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"大数据平台建设合同\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 1750000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-09-25\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-05-10\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 1200000\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"云服务采购框架协议\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 950000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-08-31\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-06-01\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 700000\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":533.9999932944485,\\\"height\\\":346.99999332138515},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":1200,\\\"dataType\\\":1,\\\"h\\\":325,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"beginFields\\\":[{\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"name\\\":\\\"合同名称\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"title\\\"},{\\\"compose\\\":{\\\"contentStyle\\\":{\\\"marginRight\\\":1,\\\"fontSize\\\":12,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#78F7FA\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#78F7FA\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginLeft\\\":0},\\\"suffixStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#78F7FA\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#78F7FA\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#666666\\\"},\\\"suffix\\\":\\\"万元\\\",\\\"enabled\\\":true},\\\"name\\\":\\\"总额\\\",\\\"width\\\":100,\\\"style\\\":{\\\"fontSize\\\":21,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FF4500\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFD700\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"total\\\"}],\\\"endCurrent\\\":0,\\\"endInfo\\\":{\\\"width\\\":103},\\\"scroll\\\":{\\\"count\\\":1,\\\"interval\\\":3000,\\\"enabled\\\":true,\\\"direction\\\":\\\"down\\\"},\\\"centerTopFields\\\":[{\\\"marginRight\\\":0,\\\"name\\\":\\\"最近日期\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#888888\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"endLabel\\\",\\\"marginLeft\\\":0},{\\\"marginRight\\\":0,\\\"isUseExceedFillColor\\\":true,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"marginRight\\\":0,\\\"fontColor\\\":\\\"#6EEDF3\\\",\\\"marginLeft\\\":0},\\\"suffixStyle\\\":{\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"fontColor\\\":\\\"#6EEDF3\\\"},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"\\\",\\\"enabled\\\":true},\\\"showPercentage\\\":true,\\\"name\\\":\\\"进度值\\\",\\\"width\\\":100,\\\"style\\\":{\\\"fontSize\\\":12,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#00D4FF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontColor\\\":\\\"#6EEDF3\\\"},\\\"key\\\":\\\"value\\\",\\\"marginLeft\\\":0}],\\\"body\\\":{\\\"gradient\\\":{\\\"type\\\":\\\"linear\\\"}},\\\"endFields\\\":[{\\\"name\\\":\\\"到期日期\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"date\\\"}],\\\"beginCurrent\\\":1,\\\"progressSection\\\":{\\\"marginRight\\\":0,\\\"marginLeft\\\":0},\\\"bar\\\":{\\\"border\\\":{\\\"padding\\\":8,\\\"color\\\":\\\"#4ECBFC21\\\",\\\"width\\\":2,\\\"enabled\\\":true},\\\"total\\\":{\\\"field\\\":\\\"total\\\",\\\"type\\\":\\\"field\\\",\\\"value\\\":0},\\\"borderRadius\\\":8,\\\"background\\\":{\\\"color\\\":\\\"#5A97FC4F\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom\\\",\\\"startColor\\\":\\\"#FFFFFF\\\"}},\\\"indicatorColor\\\":\\\"#02F7FFA3\\\",\\\"exceed\\\":{\\\"indicatorColor\\\":\\\"#FEF8C9A1\\\",\\\"fill\\\":{\\\"color\\\":\\\"#FFB347\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FEAF24\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FEF6C8\\\",\\\"direction\\\":\\\"to right\\\"}},\\\"percent\\\":70,\\\"enabled\\\":true},\\\"indicatorSize\\\":10,\\\"fill\\\":{\\\"color\\\":\\\"#33C9FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#24E5F1\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#C5FDFE\\\"}},\\\"valueField\\\":\\\"value\\\",\\\"height\\\":3},\\\"centerTopInfo\\\":{\\\"layout\\\":\\\"horizontal\\\"},\\\"centerTopCurrent\\\":1,\\\"row\\\":{\\\"marginRight\\\":0,\\\"padding\\\":\\\"0 0\\\",\\\"marginBottom\\\":0,\\\"marginTop\\\":12,\\\"height\\\":31,\\\"marginLeft\\\":9},\\\"beginInfo\\\":{\\\"layout\\\":\\\"vertical\\\",\\\"width\\\":176}}},\\\"key\\\":\\\"a436dea0-cd2d-4a65-aa6b-426cde282aec\\\"},{\\\"visible\\\":true,\\\"h\\\":304.99999230626537,\\\"i\\\":\\\"8cc8a3c3-0948-4171-b8d4-209129a39128\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JCardScroll\\\",\\\"w\\\":531.9999994946703,\\\"x\\\":4.733886769359984,\\\"y\\\":279.3786642995031,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"28.258046999999998%\\\",\\\"left\\\":\\\"0.2555360000000001%\\\",\\\"width\\\":\\\"28.717449000000006%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"30.849542999999997%\\\"},\\\"componentName\\\":\\\"卡片滚动(高亮)\\\",\\\"pageCompId\\\":\\\"1146300970061844480\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[],\\\"dataType\\\":1,\\\"h\\\":304,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"苏州地铁5号线工程\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"分期\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966786720503390209\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"南京软件园研发楼\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"二期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"一次性付款\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966786777713696769\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"重庆智慧交通枢纽\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"三期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"分期\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966786804406247425\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"武汉光谷科技园\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"分期\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966786837256036353\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"上海浦东新区道路改造\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"二期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"一次性付款\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\",\\\\n      \\\\\\\"道路工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966786864602898433\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"深圳南山创新中心\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"三期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"分期\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\",\\\\n      \\\\\\\"道路工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966786897117143041\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"成都高新产业园\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"分期\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966786931179085826\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"杭州滨江智慧社区\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"二期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"一次性付款\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966786962128855042\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"广州南沙港区扩建\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"三期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"分期\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966787000406073346\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"天津生态城住宅项目\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"分期\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966787029329993729\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":531.9999994946703,\\\"height\\\":304.99999230626537},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":540,\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"showIndex\\\":true,\\\"autoScrollEnabled\\\":true,\\\"rowGap\\\":16,\\\"indexFieldStyle\\\":{},\\\"contentFieldMapping\\\":[{\\\"valueStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#A6D8FF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"itemConfig\\\":{\\\"alignItems\\\":\\\"flex-start\\\",\\\"marginBottom\\\":24,\\\"marginTop\\\":13,\\\"height\\\":40},\\\"nameStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"omitConfig\\\":{\\\"show\\\":true,\\\"lines\\\":2},\\\"name\\\":\\\"项目名称\\\",\\\"width\\\":100,\\\"key\\\":\\\"projectName\\\",\\\"showLabel\\\":false},{\\\"valueStyle\\\":{\\\"fontSize\\\":16,\\\"marginBottom\\\":10,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"marginTop\\\":-5},\\\"itemConfig\\\":{\\\"alignItems\\\":\\\"flex-start\\\",\\\"justifyContent\\\":\\\"center\\\"},\\\"nameStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"name\\\":\\\"进度\\\",\\\"width\\\":100,\\\"key\\\":\\\"status\\\",\\\"showLabel\\\":false},{\\\"valueStyle\\\":{\\\"fontSize\\\":12,\\\"marginBottom\\\":0,\\\"fontColor\\\":\\\"#BFBFBF\\\",\\\"marginTop\\\":-10},\\\"itemConfig\\\":{\\\"alignItems\\\":\\\"center\\\",\\\"layoutDirection\\\":\\\"row\\\",\\\"justifyContent\\\":\\\"center\\\"},\\\"nameStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"name\\\":\\\"付款方式\\\",\\\"width\\\":100,\\\"key\\\":\\\"paymentMethod\\\",\\\"showLabel\\\":false},{\\\"valueStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"itemConfig\\\":{\\\"alignItems\\\":\\\"center\\\",\\\"layoutDirection\\\":\\\"column\\\",\\\"justifyContent\\\":\\\"flex-start\\\"},\\\"nameStyle\\\":{\\\"fontSize\\\":14,\\\"marginBottom\\\":10,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"marginTop\\\":26},\\\"valueType\\\":\\\"array\\\",\\\"name\\\":\\\"合同类型\\\",\\\"width\\\":100,\\\"key\\\":\\\"type\\\"}],\\\"autoScrollSpeed\\\":100,\\\"scrollDirection\\\":\\\"left\\\",\\\"animationDuration\\\":800,\\\"columnGap\\\":16,\\\"stayDuration\\\":5000,\\\"contentCurrent\\\":1,\\\"cardStyle\\\":{\\\"backgroundColor\\\":\\\"#0648786E\\\",\\\"borderColor\\\":\\\"#1890FF\\\",\\\"backgroundImage\\\":\\\"https://static.jeecg.com/jimureport/images/组-1121_05_1757733370432.png\\\",\\\"paddingRight\\\":5,\\\"borderEnabled\\\":false,\\\"paddingBottom\\\":5,\\\"borderRadius\\\":0,\\\"borderWidth\\\":1,\\\"width\\\":122,\\\"paddingTop\\\":5,\\\"bgHighlightImage\\\":\\\"https://static.jeecg.com/jimureport/images/组-1121_03_1757735281389.png\\\",\\\"borderStyle\\\":\\\"dashed\\\",\\\"paddingLeft\\\":5,\\\"height\\\":300},\\\"currentValue\\\":0,\\\"direction\\\":\\\"horizontal\\\"}},\\\"key\\\":\\\"cb43a6dd-2191-428e-8d28-101517716e82\\\"},{\\\"visible\\\":true,\\\"h\\\":52.99999610224011,\\\"i\\\":\\\"874a6164-d6b8-400c-8d6c-7224b8d8fa73\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":95.0000018946185,\\\"x\\\":269.38688254140277,\\\"y\\\":179.11254927232653,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.116525999999997%\\\",\\\"left\\\":\\\"14.541549000000003%\\\",\\\"width\\\":\\\"5.128116%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.360739999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970103787520\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"详情>\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":95.00000189461852,\\\"height\\\":52.99999610224012},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"setModalCited\\\":true,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#5A868B\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#36363600\\\",\\\"backgroundImage\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/产城详情_032_1763553721746.png\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"targetCompId\\\":\\\"es-drager-1762409324858-6\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"\\\",\\\"sizeMode\\\":\\\"fit\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F00\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"42c54784-6b0f-4d44-84f0-2c8a63af9b79\\\"},{\\\"visible\\\":true,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"es-drager-1762399836630-5\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":67.99999297100209,\\\"x\\\":251.18523463376653,\\\"y\\\":182.11254793245024,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.419963999999997%\\\",\\\"left\\\":\\\"13.559021000000001%\\\",\\\"width\\\":\\\"3.6706510000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970124759040\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":67.99999297100209,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#5A868B\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"fe69c43c-3bfb-4983-8a75-a3d98c2b240d\\\"},{\\\"visible\\\":true,\\\"h\\\":52.99999610224011,\\\"i\\\":\\\"39150764-32e5-464a-8d07-abca92992b3e\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":94.00000499472947,\\\"x\\\":198.65299660081877,\\\"y\\\":176.58030987969,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"17.860399999999995%\\\",\\\"left\\\":\\\"10.723322%\\\",\\\"width\\\":\\\"5.074136000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.360739999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970141536256\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"6,790\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":94.00000499472947,\\\"height\\\":52.99999610224012},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"1b524244-da11-4aa4-a0af-a750ed3fe210\\\"},{\\\"visible\\\":true,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"8f386c60-44f0-4bf0-85e1-dfc3ebbc975f\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":109.99999244359917,\\\"x\\\":125.18521769065302,\\\"y\\\":179.5803085398137,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.163837999999995%\\\",\\\"left\\\":\\\"6.757519000000002%\\\",\\\"width\\\":\\\"5.937818000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970154119168\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目总数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":109.99999244359917,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"546303e1-9281-41dd-88d7-56a2175baf6a\\\"},{\\\"visible\\\":true,\\\"h\\\":37.00000324824705,\\\"i\\\":\\\"es-drager-1762399377808-4\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":114.99999546836682,\\\"x\\\":12.20164798297948,\\\"y\\\":93.395080190355,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.446542999999998%\\\",\\\"left\\\":\\\"0.6586470000000001%\\\",\\\"width\\\":\\\"6.207719000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7424040000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970175090688\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同预警\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":114.99999546836682,\\\"height\\\":37.00000324824705},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"4a9caef5-fe02-44c4-9191-9e069c016e1f\\\"},{\\\"visible\\\":true,\\\"h\\\":59.9999929758621,\\\"i\\\":\\\"es-drager-1762398785719-3\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.00001021548871,\\\"x\\\":1319.7983538161357,\\\"y\\\":1.9999991067491294,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0.20229199999999942%\\\",\\\"left\\\":\\\"71.24293600000001%\\\",\\\"width\\\":\\\"9.176629%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.0687619999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970187673600\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"租赁系统数据\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.00001021548871,\\\"height\\\":59.9999929758621},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"40d1d9a6-fa9d-4e2d-b25f-aa85c9c09609\\\"},{\\\"visible\\\":true,\\\"h\\\":35.99999380817846,\\\"i\\\":\\\"es-drager-1762398759885-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JImg\\\",\\\"w\\\":537.0000025194379,\\\"x\\\":1315.532231435849,\\\"y\\\":17.266122437005365,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.7463999999999997%\\\",\\\"left\\\":\\\"71.01265%\\\",\\\"width\\\":\\\"28.98735%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.6412570000000004%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146300970204450816\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":537.0000025194379,\\\"height\\\":35.99999380817846},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"d05d8636-fe01-4048-8a21-99851c7012b1\\\"},{\\\"visible\\\":true,\\\"h\\\":59.9999929758621,\\\"i\\\":\\\"68f75009-8c50-4375-8985-6f36fcbcbace\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.00001021548871,\\\"x\\\":4.20163573322229,\\\"y\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0%\\\",\\\"left\\\":\\\"0.22680500000000006%\\\",\\\"width\\\":\\\"9.176629%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.0687619999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970217033728\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"成本系统数据\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.00001021548871,\\\"height\\\":59.9999929758621},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2859886c-0e76-46eb-b86b-64326ad27bbf\\\"},{\\\"visible\\\":true,\\\"h\\\":35.000004141497904,\\\"i\\\":\\\"bf455d73-9694-488e-897d-ab5c552a2e95\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JImg\\\",\\\"w\\\":543.0000024440947,\\\"x\\\":0,\\\"y\\\":15.733882597743403,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.5914199999999996%\\\",\\\"left\\\":\\\"0%\\\",\\\"width\\\":\\\"29.311231000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.5401119999999993%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146300970233810944\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":543.0000024440947,\\\"height\\\":35.000004141497904},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"c77e6615-da1a-4c2e-8e3b-2bb9002c9184\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":41.000002572708,\\\"x\\\":194.9824077577821,\\\"h\\\":29.99999648793105,\\\"i\\\":\\\"a3e3e41c-44ed-4d59-bb93-372d8d63fb1f\\\",\\\"y\\\":89.24855128478228,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.027138%\\\",\\\"left\\\":\\\"10.525183%\\\",\\\"width\\\":\\\"2.213187%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.0343809999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":41.000002572708,\\\"height\\\":29.99999648793105},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBE5F5\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":149.9999981164181,\\\"x\\\":321.2637687712664,\\\"h\\\":99.99999488423282,\\\"i\\\":\\\"es-drager-1762774351674-1\\\",\\\"y\\\":67.59554452387727,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.837021999999997%\\\",\\\"left\\\":\\\"17.341872%\\\",\\\"width\\\":\\\"8.097025000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.114603999999998%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":149.9999981164181,\\\"height\\\":99.99999488423282},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_41_1763551881751.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":51.00000862224333,\\\"x\\\":170.92614665521,\\\"h\\\":37.00000324824705,\\\"i\\\":\\\"f1f7a03d-01ce-4ee5-bcc4-06a169d1d2bd\\\",\\\"y\\\":84.18405272612117,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.514883999999999%\\\",\\\"left\\\":\\\"9.226622%\\\",\\\"width\\\":\\\"2.752989000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7424040000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"76\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.00000862224333,\\\"height\\\":37.00000324824705},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBE5F5\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":26,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":167.99999789038833,\\\"x\\\":104.88628099031132,\\\"h\\\":104.00000298442514,\\\"i\\\":\\\"2ea9f177-88fc-49ce-a2e7-0a9089f41e0d\\\",\\\"y\\\":66.45838686435945,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.722002999999997%\\\",\\\"left\\\":\\\"5.661779000000001%\\\",\\\"width\\\":\\\"9.068668000000004%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.519188999999999%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":167.99999789038833,\\\"height\\\":104.00000298442514},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_39_1763551870530.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":538.9999963192163,\\\"x\\\":12.66118712893443,\\\"h\\\":35.000004141497904,\\\"i\\\":\\\"3f286895-ab97-45e7-9384-527089c0afd6\\\",\\\"y\\\":186.73973824120662,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.887985999999998%\\\",\\\"left\\\":\\\"0.6834530000000001%\\\",\\\"width\\\":\\\"29.095310000000012%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.5401119999999993%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":538.9999963192163,\\\"height\\\":35.000004141497904},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_13_1763551964951.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":11.999999849313447,\\\"x\\\":248.95778692630336,\\\"h\\\":18.000001847436234,\\\"i\\\":\\\"cea81bd3-6d33-41da-8393-fec1e1ba11f9\\\",\\\"y\\\":594.9542752387625,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"60.177272%\\\",\\\"left\\\":\\\"13.438783%\\\",\\\"width\\\":\\\"0.6477620000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"1.8206289999999996%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":11.999999849313447,\\\"height\\\":18.000001847436234},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_17_1763552004773.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":89.99999886985086,\\\"x\\\":796.3892117165844,\\\"h\\\":124.99999360529105,\\\"i\\\":\\\"82435ec8-26f7-4c2b-8a28-dd8d034db75f\\\",\\\"y\\\":315.88394276806093,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"31.950411545084663%\\\",\\\"left\\\":\\\"42.98922291982134%\\\",\\\"width\\\":\\\"4.858215%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.643255%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":89.99999886985086,\\\"height\\\":124.99999360529107},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":894.0000072991742,\\\"x\\\":487.45604718243874,\\\"h\\\":603.9999971789773,\\\"i\\\":\\\"1b53a65a-6907-45bd-83d7-7d55d7048d91\\\",\\\"y\\\":152.55450644061344,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.430284999999996%\\\",\\\"left\\\":\\\"26.312959000000003%\\\",\\\"width\\\":\\\"48.25827%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"61.092210999999985%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":894.0000072991742,\\\"height\\\":603.9999971789773},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/产城背景地图_1763551428302.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":83.00000204530508,\\\"x\\\":1376.2719838540795,\\\"h\\\":51.999996548865546,\\\"i\\\":\\\"00c0b354-a82e-40dd-b1c2-ef2e1d6d0a09\\\",\\\"y\\\":80.18405451262291,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.1103%\\\",\\\"left\\\":\\\"74.29139200000002%\\\",\\\"width\\\":\\\"4.480354000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.259593999999999%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":83.00000204530508,\\\"height\\\":51.999996548865546},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_25_1763551889963.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}}]},\\\"component\\\":\\\"JGroup\\\",\\\"w\\\":1852.532233955287,\\\"x\\\":22,\\\"y\\\":74,\\\"componentName\\\":\\\"新成\\\",\\\"pageCompId\\\":\\\"1151112776924057600\\\",\\\"equalProportion\\\":false,\\\"key\\\":\\\"f9b7b1c7-f98e-4b8a-b271-bab6cb7ffb0d\\\",\\\"group\\\":true},{\\\"visible\\\":false,\\\"h\\\":982.5087924970692,\\\"i\\\":\\\"es-drager-1762409324858-6\\\",\\\"props\\\":{\\\"elements\\\":[{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":170,\\\"x\\\":763.4701055099648,\\\"h\\\":60,\\\"i\\\":\\\"86652dd5-ea38-431d-9a83-83fa934fcf0a\\\",\\\"y\\\":0,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0%\\\",\\\"left\\\":\\\"44.883604086417684%\\\",\\\"width\\\":\\\"9.994121105232216%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.106815578465063%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目列表\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170,\\\"height\\\":60},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":2,\\\"fontSize\\\":26,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JScrollTable\\\",\\\"visible\\\":true,\\\"w\\\":1701,\\\"x\\\":0,\\\"h\\\":892,\\\"i\\\":\\\"ebb593ac-a3cb-430c-855a-9024de4329ad\\\",\\\"y\\\":90.50879249706912,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.212008400152726%\\\",\\\"left\\\":\\\"0%\\\",\\\"width\\\":\\\"100%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"90.78799159984727%\\\"},\\\"componentName\\\":\\\"详情弹框表格\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"施工合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2024-10-11\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"1200000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"50000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"1250000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"100000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"2500000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"二期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"装修合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2024-11-05\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"980000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"30000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"1010000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"80000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"2100000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"三期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"消防合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2024-12-01\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"760000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"20000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"780000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"60000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1800000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"智能化合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-01-10\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"540000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"15000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"555000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"45000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1200000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"二期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"景观合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-02-15\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"420000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"10000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"430000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"35000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"950000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"三期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"幕墙合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-03-20\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"880000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"25000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"905000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"70000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1600000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"暖通合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-04-08\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"650000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"18000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"668000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"52000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1350000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"二期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"电梯合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-05-12\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"720000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"22000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"742000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"58000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1500000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"三期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"厨房设备合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-06-05\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"380000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"8000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"388000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"30000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"800000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"软装合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-07-01\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"560000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"12000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"572000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"48000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1150000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"施工合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2024-10-11\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"1200000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"50000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"1250000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"100000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"2500000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"二期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"装修合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2024-11-05\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"980000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"30000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"1010000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"80000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"2100000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"三期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"消防合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2024-12-01\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"760000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"20000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"780000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"60000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1800000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"智能化合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-01-10\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"540000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"15000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"555000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"45000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1200000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"二期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"景观合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-02-15\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"420000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"10000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"430000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"35000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"950000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"三期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"幕墙合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-03-20\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"880000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"25000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"905000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"70000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1600000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"暖通合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-04-08\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"650000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"18000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"668000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"52000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1350000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"二期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"电梯合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-05-12\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"720000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"22000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"742000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"58000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1500000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"三期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"厨房设备合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-06-05\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"380000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"8000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"388000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"30000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"800000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"软装合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-07-01\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"560000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"12000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"572000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"48000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1150000\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":1701,\\\"height\\\":892},\\\"syncColumn\\\":false,\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"headerBgColor\\\":\\\"#003B6F\\\",\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"textPosition\\\":\\\"center\\\",\\\"scroll\\\":true,\\\"scrollTime\\\":50,\\\"bodyFontSize\\\":20,\\\"bodyFontColor\\\":\\\"#FFFFFF\\\",\\\"rankingTitle\\\":\\\"#\\\",\\\"showBorder\\\":false,\\\"oddColor\\\":\\\"#001E3C\\\",\\\"evenColor\\\":\\\"#00284E\\\",\\\"fieldMapping\\\":[{\\\"name\\\":\\\"项目名称\\\",\\\"width\\\":200,\\\"key\\\":\\\"name\\\"},{\\\"name\\\":\\\"分期名称\\\",\\\"width\\\":200,\\\"key\\\":\\\"fqname\\\"},{\\\"name\\\":\\\"合同日期\\\",\\\"width\\\":200,\\\"key\\\":\\\"htdate\\\"},{\\\"name\\\":\\\"合同金额(元)\\\",\\\"width\\\":200,\\\"key\\\":\\\"htmoney\\\"},{\\\"name\\\":\\\"累计变更金额\\\",\\\"width\\\":200,\\\"key\\\":\\\"ljbgje\\\"},{\\\"name\\\":\\\"动态合同金额\\\",\\\"width\\\":200,\\\"key\\\":\\\"dthtje\\\"},{\\\"name\\\":\\\"累计实付金额\\\",\\\"width\\\":200,\\\"key\\\":\\\"ljsfje\\\"},{\\\"name\\\":\\\"累计未付金额\\\",\\\"width\\\":200,\\\"key\\\":\\\"ljwfje\\\"}],\\\"showHead\\\":true,\\\"borderWidth\\\":1,\\\"ranking\\\":false,\\\"lineHeight\\\":50,\\\"fontSize\\\":24,\\\"borderStyle\\\":\\\"solid\\\",\\\"headerFontColor\\\":\\\"#FFFFFF\\\"}}}]},\\\"modalCited\\\":\\\"874a6164-d6b8-400c-8d6c-7224b8d8fa73\\\",\\\"component\\\":\\\"JGroup\\\",\\\"w\\\":1701,\\\"x\\\":99,\\\"y\\\":34.49120750293087,\\\"componentName\\\":\\\"详情弹框\\\",\\\"pageCompId\\\":\\\"1151112776945029120\\\",\\\"equalProportion\\\":false,\\\"key\\\":\\\"3e57537d-5911-41a4-8cfa-db9b2dc711c6\\\",\\\"group\\\":true},{\\\"visible\\\":false,\\\"h\\\":950.9395927008758,\\\"i\\\":\\\"es-drager-1756456982092-28\\\",\\\"props\\\":{\\\"elements\\\":[{\\\"component\\\":\\\"JBar\\\",\\\"visible\\\":true,\\\"w\\\":541,\\\"x\\\":1308.9728600943263,\\\"h\\\":190,\\\"i\\\":\\\"84e41e0f-f14b-44d6-8e0a-fdf0b1390398\\\",\\\"y\\\":279.80457035966094,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"29.424011000000007%\\\",\\\"left\\\":\\\"69.27569900000002%\\\",\\\"width\\\":\\\"28.631726677892527%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"19.980238645901636%\\\"},\\\"componentName\\\":\\\"基础柱形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 90\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 79\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 70\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 55\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 78\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 98\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":541.058706079854,\\\"height\\\":190.48343252800288},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#4A90E235\\\"},\\\"show\\\":true,\\\"interval\\\":2},\\\"name\\\":\\\"单位(个)\\\",\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":30,\\\"left\\\":16,\\\"bottom\\\":18,\\\"show\\\":false,\\\"right\\\":9,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":17,\\\"data\\\":[],\\\"showBackground\\\":false,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"#51626E\\\"},\\\"itemStyle\\\":{\\\"color\\\":\\\"#00A8FFA6\\\",\\\"borderRadius\\\":3},\\\"label\\\":{\\\"position\\\":\\\"top\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#475580\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JStatsSummary\\\",\\\"visible\\\":true,\\\"w\\\":681,\\\"x\\\":580.0384926431407,\\\"h\\\":129,\\\"i\\\":\\\"be3108cf-9334-449a-8795-ef8fb1e69164\\\",\\\"y\\\":54.525238831863746,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"5.733827810975898%\\\",\\\"left\\\":\\\"30.697788510194417%\\\",\\\"width\\\":\\\"36.041045966071735%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"13.565530449059532%\\\"},\\\"componentName\\\":\\\"统计概览（背景模式）\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"在管项目总数\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 960,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"2\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"累计放款金额\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 790,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"3\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"当前借款余额\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 900,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"4\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"总应收租金\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6790,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"5\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"租金实收率\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 90,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"%\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":680.9999999999999,\\\"height\\\":129},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":713,\\\"dataType\\\":1,\\\"h\\\":129,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"layout\\\":{\\\"padding\\\":{\\\"top\\\":5,\\\"left\\\":20,\\\"bottom\\\":0,\\\"right\\\":20},\\\"borderColor\\\":\\\"#0f66ff59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"justify\\\":\\\"space-between\\\",\\\"borderWidth\\\":0,\\\"gap\\\":16,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"100% 100%\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"drag/lib/img/bg01.png\\\"},\\\"color\\\":\\\"#0b2b63\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"image\\\"}},\\\"fieldMap\\\":{\\\"compareValue\\\":\\\"compareValue\\\",\\\"unit\\\":\\\"suffix\\\",\\\"negativeValue\\\":\\\"0\\\",\\\"compareState\\\":\\\"compareState\\\",\\\"label\\\":\\\"name\\\",\\\"value\\\":\\\"value\\\",\\\"positiveValue\\\":\\\"1\\\",\\\"compareLabel\\\":\\\"compareLabel\\\"},\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"padding\\\":{\\\"horizontal\\\":3,\\\"vertical\\\":15},\\\"borderColor\\\":\\\"#0F66FF59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"borderWidth\\\":0,\\\"blur\\\":24,\\\"minWidth\\\":100,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"cover\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"\\\"},\\\"color\\\":\\\"#0B2B6300\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"none\\\"}},\\\"sections\\\":{\\\"middle\\\":{\\\"compare\\\":{\\\"valueStyle\\\":{\\\"positiveGradient\\\":{\\\"endColor\\\":\\\"#15f0c5\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#15f0c5\\\"},\\\"positiveColor\\\":\\\"#15F0C5\\\",\\\"fontSize\\\":14,\\\"negativeColor\\\":\\\"#D0021B\\\",\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"negativeGradient\\\":{\\\"endColor\\\":\\\"#D0021B\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#D0021B\\\"},\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"alignItems\\\":\\\"center\\\",\\\"labelStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"fontColor\\\":\\\"#9ED3FF\\\"},\\\"label\\\":\\\"同比\\\"},\\\"paddingBottom\\\":10,\\\"show\\\":false,\\\"type\\\":\\\"compare\\\",\\\"align\\\":\\\"center\\\"},\\\"top\\\":{\\\"minHeight\\\":40,\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"paddingTop\\\":5,\\\"type\\\":\\\"value\\\",\\\"align\\\":\\\"center\\\",\\\"value\\\":{\\\"unit\\\":{\\\"fontSize\\\":16,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#96F5F8\\\"},\\\"fontWeight\\\":500,\\\"fontColor\\\":\\\"#9ED3FF\\\"},\\\"unitGap\\\":6,\\\"fontSize\\\":24,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#96F5F8\\\"},\\\"fontWeight\\\":600,\\\"fontColor\\\":\\\"#D8F1FF\\\"}},\\\"bottom\\\":{\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"label\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#C9E6FF\\\"},\\\"type\\\":\\\"label\\\",\\\"align\\\":\\\"center\\\"}}}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":79.61138898968348,\\\"x\\\":1092.016430295897,\\\"h\\\":27.97398018640021,\\\"i\\\":\\\"es-drager-1763118212824-19\\\",\\\"y\\\":506.6564308568187,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"53.27955999999999%\\\",\\\"left\\\":\\\"57.79356%\\\",\\\"width\\\":\\\"4.21333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9417200000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"客户名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":79.61138898968348,\\\"height\\\":27.97398018640021},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":79.61138898968348,\\\"x\\\":1205.967192459297,\\\"h\\\":27.97398018640021,\\\"i\\\":\\\"es-drager-1763118197556-18\\\",\\\"y\\\":430.68925214089586,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.29091600000001%\\\",\\\"left\\\":\\\"63.824257%\\\",\\\"width\\\":\\\"4.21333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9417200000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"客户名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":79.61138898968348,\\\"height\\\":27.97398018640021},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":79.61138898968348,\\\"x\\\":985.6623767923331,\\\"h\\\":27.97398018640021,\\\"i\\\":\\\"es-drager-1763118191675-17\\\",\\\"y\\\":323.06908863293563,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"33.97367100000001%\\\",\\\"left\\\":\\\"52.164909%\\\",\\\"width\\\":\\\"4.21333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9417200000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"客户名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":79.61138898968348,\\\"height\\\":27.97398018640021},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1095.814765730692,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1763118021837-16\\\",\\\"y\\\":430.68924263149984,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.290915%\\\",\\\"left\\\":\\\"57.99458200000001%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1216.0961310407038,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1763118010715-15\\\",\\\"y\\\":378.7783346397803,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"39.83200800000001%\\\",\\\"left\\\":\\\"64.360318%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":995.79131537374,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1763118003690-14\\\",\\\"y\\\":267.3598140979031,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"28.115331000000005%\\\",\\\"left\\\":\\\"52.700970000000005%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1088.346997390856,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1763117996097-13\\\",\\\"y\\\":405.4958098141571,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.64159500000001%\\\",\\\"left\\\":\\\"57.59936%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"96340\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1211.1606115175618,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1763117990004-12\\\",\\\"y\\\":349.78654478852053,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"36.78325600000001%\\\",\\\"left\\\":\\\"64.099112%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"11960\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":990.855795850598,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1763117985668-11\\\",\\\"y\\\":243.43250029186595,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"25.599155000000007%\\\",\\\"left\\\":\\\"52.439764%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"91260\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":79.61138898968348,\\\"x\\\":691.9226477632122,\\\"h\\\":27.97398018640021,\\\"i\\\":\\\"es-drager-1763117979572-10\\\",\\\"y\\\":496.5274692569776,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"52.21440700000001%\\\",\\\"left\\\":\\\"36.619113%\\\",\\\"width\\\":\\\"4.21333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9417200000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"客户名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":79.61138898968348,\\\"height\\\":27.97398018640021},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":700.7854619362721,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1763117971569-9\\\",\\\"y\\\":416.76192399774175,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"43.82633%\\\",\\\"left\\\":\\\"37.088166%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":695.8499424131302,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1763117964448-8\\\",\\\"y\\\":391.56849118039895,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"41.17701000000001%\\\",\\\"left\\\":\\\"36.82696%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"9160\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":83.00000257528725,\\\"x\\\":688.6400925035406,\\\"h\\\":115.9999953491752,\\\"i\\\":\\\"es-drager-1763117932887-7\\\",\\\"y\\\":383.5890619640866,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"40.337900000000005%\\\",\\\"left\\\":\\\"36.445388%\\\",\\\"width\\\":\\\"4.392668000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.198461000000002%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":83.00000257528727,\\\"height\\\":115.9999953491752},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":70.0000067249707,\\\"x\\\":1091.0082054226732,\\\"h\\\":95.99999549522116,\\\"i\\\":\\\"es-drager-1763117918967-6\\\",\\\"y\\\":408.65354737265926,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.97366000000001%\\\",\\\"left\\\":\\\"57.740201%\\\",\\\"width\\\":\\\"3.70466%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.095278000000004%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":70.0000067249707,\\\"height\\\":95.99999549522116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":62.00000055779603,\\\"x\\\":1213.9507598693788,\\\"h\\\":83.00000462407712,\\\"i\\\":\\\"es-drager-1763117907587-5\\\",\\\"y\\\":351.80712025388317,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"36.995738%\\\",\\\"left\\\":\\\"64.246777%\\\",\\\"width\\\":\\\"3.28127%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"8.72821%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":62.00000055779603,\\\"height\\\":83.0000046240771},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":62.00000055779603,\\\"x\\\":993.7749034175382,\\\"h\\\":83.00000462407712,\\\"i\\\":\\\"es-drager-1763117887178-4\\\",\\\"y\\\":245.58203267539477,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"25.825198000000004%\\\",\\\"left\\\":\\\"52.59425399999999%\\\",\\\"width\\\":\\\"3.28127%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"8.72821%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":62.00000055779603,\\\"height\\\":83.0000046240771},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":835.1230982678547,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1763117551885-3\\\",\\\"y\\\":278.8838421178201,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"29.327188%\\\",\\\"left\\\":\\\"44.197812%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":831.4536842579369,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1763117542406-2\\\",\\\"y\\\":249.8920522665603,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"26.278436%\\\",\\\"left\\\":\\\"44.003613%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"199,445\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":79.61138898968348,\\\"x\\\":830.058638424713,\\\"h\\\":27.97398018640021,\\\"i\\\":\\\"es-drager-1763117524939-1\\\",\\\"y\\\":363.71387293167453,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"38.247842000000006%\\\",\\\"left\\\":\\\"43.929782%\\\",\\\"width\\\":\\\"4.21333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9417200000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"客户名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":79.61138898968348,\\\"height\\\":27.97398018640021},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":98.99999601451351,\\\"x\\\":817.9132500968582,\\\"h\\\":131.00000237168769,\\\"i\\\":\\\"01adf6f2-8586-42bf-8ca5-e68125185724\\\",\\\"y\\\":236.8481470050254,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.906750000000002%\\\",\\\"left\\\":\\\"43.287003%\\\",\\\"width\\\":\\\"5.239447%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"13.775849000000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":98.9999960145135,\\\"height\\\":131.00000237168769},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":173.99999242262612,\\\"x\\\":592.259300662204,\\\"h\\\":37.00000400904318,\\\"i\\\":\\\"es-drager-1763014748783-1\\\",\\\"y\\\":163.07150518786855,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"17.148461000000005%\\\",\\\"left\\\":\\\"31.344559%\\\",\\\"width\\\":\\\"9.208725000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.890889%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"采购合同金额分布\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":173.9999924226261,\\\"height\\\":37.00000400904318},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"79b612d5-4915-4201-84ce-a34c4f9b4615\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":128.9999907987339,\\\"x\\\":1694.4314250338105,\\\"h\\\":26.99999932736819,\\\"i\\\":\\\"es-drager-1762929346632-5\\\",\\\"y\\\":724.1710725496224,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"76.15321500000002%\\\",\\\"left\\\":\\\"89.675596%\\\",\\\"width\\\":\\\"6.827158%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.8392970000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"36个月期项目数量\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":128.9999907987339,\\\"height\\\":26.99999932736819},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#8D8D8D\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":46.00000711856976,\\\"x\\\":1732.8018837686052,\\\"h\\\":28.999996459944818,\\\"i\\\":\\\"es-drager-1762929340450-4\\\",\\\"y\\\":695.437187025299,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"73.13158400000002%\\\",\\\"left\\\":\\\"91.706303%\\\",\\\"width\\\":\\\"2.434491%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.0496150000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":46.00000711856976,\\\"height\\\":28.999996459944818},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#505050\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":13,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1685.8264915007508,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762929333594-3\\\",\\\"y\\\":688.9776350506045,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"72.452303%\\\",\\\"left\\\":\\\"89.220191%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"400\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#6BE5E8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":166.999991750129,\\\"x\\\":1684.6625708132242,\\\"h\\\":37.00000400904318,\\\"i\\\":\\\"es-drager-1762929318489-2\\\",\\\"y\\\":659.1324815182508,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"69.313812%\\\",\\\"left\\\":\\\"89.158592%\\\",\\\"width\\\":\\\"8.838259%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.890889%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"36个月期项目占比\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":166.999991750129,\\\"height\\\":37.00000400904318},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"79b612d5-4915-4201-84ce-a34c4f9b4615\\\"},{\\\"component\\\":\\\"JRingProgress\\\",\\\"visible\\\":true,\\\"w\\\":112.99999735950763,\\\"x\\\":1590.1172323342091,\\\"h\\\":99.000000703482,\\\"i\\\":\\\"es-drager-1762929307141-1\\\",\\\"y\\\":657.0708920282549,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"69.097017%\\\",\\\"left\\\":\\\"84.154902%\\\",\\\"width\\\":\\\"5.980378999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.410756000000001%\\\"},\\\"componentName\\\":\\\"基础环形图\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"占比\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 40\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":112.99999735950763,\\\"height\\\":99.000000703482},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"valueFontWeight\\\":\\\"normal\\\",\\\"color\\\":\\\"#1E90FF\\\",\\\"bgColor\\\":\\\"#E8EDF3B8\\\",\\\"valueFontSize\\\":16,\\\"lineHeight\\\":0,\\\"fontSize\\\":16,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"valueFontColor\\\":\\\"#FFFFFF\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"extraInfo\\\":{\\\"endColor\\\":\\\"#FF4500\\\",\\\"enabledGradient\\\":false,\\\"type\\\":\\\"linear\\\",\\\"direction\\\":\\\"to left\\\",\\\"startColor\\\":\\\"#FFD700\\\"}}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":128.9999907987339,\\\"x\\\":1426.143030016014,\\\"h\\\":26.99999932736819,\\\"i\\\":\\\"es-drager-1762928981087-4\\\",\\\"y\\\":721.7677914451772,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"75.90048800000001%\\\",\\\"left\\\":\\\"75.476779%\\\",\\\"width\\\":\\\"6.827158%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.8392970000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"高收益项目数量\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":128.9999907987339,\\\"height\\\":26.99999932736819},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#8D8D8D\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":46.00000711856976,\\\"x\\\":1472.110197410645,\\\"h\\\":28.999996459944818,\\\"i\\\":\\\"es-drager-1762928898594-3\\\",\\\"y\\\":693.0339059208537,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"72.87885700000001%\\\",\\\"left\\\":\\\"77.909532%\\\",\\\"width\\\":\\\"2.434491%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.0496150000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":46.00000711856976,\\\"height\\\":28.999996459944818},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#505050\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":13,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1425.1348240379136,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762928768350-2\\\",\\\"y\\\":686.5743539461594,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"72.19957600000001%\\\",\\\"left\\\":\\\"75.423421%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"600\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#6BE5E8\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#49ABFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":149.0000062166706,\\\"x\\\":1423.970903350387,\\\"h\\\":37.00000400904318,\\\"i\\\":\\\"es-drager-1762928758538-1\\\",\\\"y\\\":656.7291909044097,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"69.06108400000001%\\\",\\\"left\\\":\\\"75.361822%\\\",\\\"width\\\":\\\"7.885633%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.890889%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"高收益项目占比\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":149.0000062166706,\\\"height\\\":37.00000400904318},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"79b612d5-4915-4201-84ce-a34c4f9b4615\\\"},{\\\"component\\\":\\\"JRingProgress\\\",\\\"visible\\\":true,\\\"w\\\":101.99999360342322,\\\"x\\\":1325.6271916463306,\\\"h\\\":103.00000447803119,\\\"i\\\":\\\"627c8b9b-8365-4edd-ba69-abfd0086e195\\\",\\\"y\\\":649.6031348785871,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"68.311714%\\\",\\\"left\\\":\\\"70.157108%\\\",\\\"width\\\":\\\"5.398218%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.831393000000002%\\\"},\\\"componentName\\\":\\\"基础环形图\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"占比\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 60\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":101.99999360342322,\\\"height\\\":103.00000447803119},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"valueFontWeight\\\":\\\"normal\\\",\\\"color\\\":\\\"#1E90FF\\\",\\\"bgColor\\\":\\\"#E8EDF3C0\\\",\\\"valueFontSize\\\":16,\\\"lineHeight\\\":0,\\\"fontSize\\\":16,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"valueFontColor\\\":\\\"#FFFFFF\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"extraInfo\\\":{\\\"endColor\\\":\\\"#FF4500\\\",\\\"enabledGradient\\\":false,\\\"type\\\":\\\"linear\\\",\\\"direction\\\":\\\"to left\\\",\\\"startColor\\\":\\\"#FFD700\\\"}}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":115.99999494841742,\\\"x\\\":1684.1734894470342,\\\"h\\\":26.000000761079882,\\\"i\\\":\\\"es-drager-1762926696188-10\\\",\\\"y\\\":882.3070586104344,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"92.782661%\\\",\\\"left\\\":\\\"89.132708%\\\",\\\"width\\\":\\\"6.1391500000000025%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.734138000000001%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"零保证金项目数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":115.99999494841741,\\\"height\\\":26.000000761079882},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":98.00000941495898,\\\"x\\\":1548.6987068173507,\\\"h\\\":26.99999932736819,\\\"i\\\":\\\"es-drager-1762926691124-9\\\",\\\"y\\\":883.5731776217401,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"92.91580500000002%\\\",\\\"left\\\":\\\"81.96288%\\\",\\\"width\\\":\\\"5.186524%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.8392970000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"保证金覆盖率\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":98.000009414959,\\\"height\\\":26.99999932736819},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1732.5439653383592,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762926686158-8\\\",\\\"y\\\":845.847502100111,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"88.94860500000001%\\\",\\\"left\\\":\\\"91.692653%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#BA3232\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FDAE93\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1598.4642474370226,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762926681277-7\\\",\\\"y\\\":848.5086970408884,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"89.228454%\\\",\\\"left\\\":\\\"84.596657%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"%\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#BA3232\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FDAE93\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1693.5521782708327,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762926674612-6\\\",\\\"y\\\":839.774820879915,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"88.310007%\\\",\\\"left\\\":\\\"89.629063%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"790\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FDAE93\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#BA3232\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1546.6822948611493,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762926667152-5\\\",\\\"y\\\":842.3070589025264,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"88.57629500000002%\\\",\\\"left\\\":\\\"81.856164%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"96.79\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FDAE93\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#BA3232\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1425.1348240379136,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762926619855-4\\\",\\\"y\\\":849.9037729703601,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"89.37515900000001%\\\",\\\"left\\\":\\\"75.423421%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#BA3232\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FDAE93\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1358.1594352472453,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762926610924-3\\\",\\\"y\\\":843.7021348319981,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"88.72300000000001%\\\",\\\"left\\\":\\\"71.878835%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"10,000\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#BA3232\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FDAE93\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":98.00000941495898,\\\"x\\\":1362.7080771250178,\\\"h\\\":26.99999932736819,\\\"i\\\":\\\"es-drager-1762926602282-2\\\",\\\"y\\\":882.4360155286006,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"92.796222%\\\",\\\"left\\\":\\\"72.119566%\\\",\\\"width\\\":\\\"5.186524%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.8392970000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"最大还款差额\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":98.000009414959,\\\"height\\\":26.99999932736819},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":531.0000078248536,\\\"x\\\":1315.369293849801,\\\"h\\\":95.99999549522116,\\\"i\\\":\\\"es-drager-1762926555663-1\\\",\\\"y\\\":822.9325585844631,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"86.53888900000001%\\\",\\\"left\\\":\\\"69.614222%\\\",\\\"width\\\":\\\"28.102490000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.095278000000004%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":531.0000078248536,\\\"height\\\":95.99999549522116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_35_1763551508136.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":149.0000062166706,\\\"x\\\":1494.8735867909734,\\\"h\\\":37.00000400904318,\\\"i\\\":\\\"es-drager-1762926336471-2\\\",\\\"y\\\":785.873387113962,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"82.64177800000002%\\\",\\\"left\\\":\\\"79.114255%\\\",\\\"width\\\":\\\"7.885633%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.890889%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"风险预警\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":149.0000062166706,\\\"height\\\":37.00000400904318},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"79b612d5-4915-4201-84ce-a34c4f9b4615\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":149.0000062166706,\\\"x\\\":1486.1397129379136,\\\"h\\\":37.00000400904318,\\\"i\\\":\\\"es-drager-1762926323283-1\\\",\\\"y\\\":487.1981242324508,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"51.233340999999996%\\\",\\\"left\\\":\\\"78.652026%\\\",\\\"width\\\":\\\"7.885633%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.890889%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目级关键指标\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":149.0000062166706,\\\"height\\\":37.00000400904318},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"79b612d5-4915-4201-84ce-a34c4f9b4615\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1794.7127938210083,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762925789762-11\\\",\\\"y\\\":236.97293880777556,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.919873000000006%\\\",\\\"left\\\":\\\"94.982858%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"天\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#708489\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1758.12427745993,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762925775562-10\\\",\\\"y\\\":230.77130066941345,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.267714000000005%\\\",\\\"left\\\":\\\"93.046458%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"70\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#3584DE\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":104.00000459277844,\\\"x\\\":1670.3751368557098,\\\"h\\\":26.000000761079882,\\\"i\\\":\\\"es-drager-1762925764016-9\\\",\\\"y\\\":237.98115349214476,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"25.025895999999996%\\\",\\\"left\\\":\\\"88.402448%\\\",\\\"width\\\":\\\"5.504066%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.734138000000001%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"平均预期天数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":104.00000459277844,\\\"height\\\":26.000000761079882},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1613.6576836518175,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762925757252-8\\\",\\\"y\\\":235.70681979646992,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.786729000000005%\\\",\\\"left\\\":\\\"85.40075%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"当年\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":277.99999701540446,\\\"x\\\":1611.5123124804927,\\\"h\\\":49.000005823294806,\\\"i\\\":\\\"es-drager-1762925746092-7\\\",\\\"y\\\":227.7274000895535,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"23.947620000000004%\\\",\\\"left\\\":\\\"85.28720899999999%\\\",\\\"width\\\":\\\"14.712790999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.152799000000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":277.99999701540446,\\\"height\\\":49.000005823294806},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_31_1763551480635.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":46.99999371812427,\\\"x\\\":1312.4501862828608,\\\"h\\\":28.999996459944818,\\\"i\\\":\\\"es-drager-1762925685447-6\\\",\\\"y\\\":233.30353869202474,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.534002%\\\",\\\"left\\\":\\\"69.459732%\\\",\\\"width\\\":\\\"2.487414%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.0496150000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"本月\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":46.99999371812427,\\\"height\\\":28.999996459944818},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":98.00000941495898,\\\"x\\\":1369.1676394867527,\\\"h\\\":26.99999932736819,\\\"i\\\":\\\"es-drager-1762925676767-5\\\",\\\"y\\\":234.31174386699809,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.640024000000004%\\\",\\\"left\\\":\\\"72.46143%\\\",\\\"width\\\":\\\"5.186524%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.8392970000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"最大单笔欠款\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":98.000009414959,\\\"height\\\":26.99999932736819},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1459.4490100125442,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762925670446-4\\\",\\\"y\\\":227.10190055366263,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"23.881843000000003%\\\",\\\"left\\\":\\\"77.239455%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"450\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1511.2309625884175,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762925663957-3\\\",\\\"y\\\":233.30353869202474,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.534002%\\\",\\\"left\\\":\\\"79.979948%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#708489\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":149.0000062166706,\\\"x\\\":1307.7458108005394,\\\"h\\\":37.00000400904318,\\\"i\\\":\\\"es-drager-1762925615604-2\\\",\\\"y\\\":179.6600187624041,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.892894999999996%\\\",\\\"left\\\":\\\"69.210759%\\\",\\\"width\\\":\\\"7.885633%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.890889%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"还款与预期监控\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":149.0000062166706,\\\"height\\\":37.00000400904318},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"79b612d5-4915-4201-84ce-a34c4f9b4615\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":277.99999701540446,\\\"x\\\":1307.772566294842,\\\"h\\\":49.000005823294806,\\\"i\\\":\\\"es-drager-1762925573195-1\\\",\\\"y\\\":222.79187145310112,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"23.428604000000004%\\\",\\\"left\\\":\\\"69.212175%\\\",\\\"width\\\":\\\"14.712790999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.152799000000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":277.99999701540446,\\\"height\\\":49.000005823294806},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_31_1763551480635.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":98.00000941495898,\\\"x\\\":1684.3024486621575,\\\"h\\\":26.99999932736819,\\\"i\\\":\\\"es-drager-1762920907802-4\\\",\\\"y\\\":150.61890367447094,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.838956000000001%\\\",\\\"left\\\":\\\"89.139533%\\\",\\\"width\\\":\\\"5.186524%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.8392970000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"罚息收入\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":98.000009414959,\\\"height\\\":26.99999932736819},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#D7EDFF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#4D699D\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1728.8745702235644,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762920898709-3\\\",\\\"y\\\":126.82054678659989,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"13.336341%\\\",\\\"left\\\":\\\"91.498455%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#A5BECF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1679.6248475692616,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762920889380-2\\\",\\\"y\\\":120.61889913884187,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.684181%\\\",\\\"left\\\":\\\"88.891977%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"898\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FFC5AB\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#E86B6B\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1517.6905060550296,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762920868707-1\\\",\\\"y\\\":118.21561803439675,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.431454000000002%\\\",\\\"left\\\":\\\"80.321811%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"3,898\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#6BE5E8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":98.00000941495898,\\\"x\\\":1523.6342315562724,\\\"h\\\":26.99999932736819,\\\"i\\\":\\\"es-drager-1762920200057-8\\\",\\\"y\\\":146.94949404932422,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.453084%\\\",\\\"left\\\":\\\"80.636375%\\\",\\\"width\\\":\\\"5.186524%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.8392970000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"手续费收入\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":98.000009414959,\\\"height\\\":26.99999932736819},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#D7EDFF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#4D699D\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1578.335291699086,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762920184548-6\\\",\\\"y\\\":124.41725617275884,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"13.083613%\\\",\\\"left\\\":\\\"83.531358%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#A5BECF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":98.00000941495898,\\\"x\\\":1340.1758506806332,\\\"h\\\":26.99999932736819,\\\"i\\\":\\\"es-drager-1762920042120-5\\\",\\\"y\\\":147.0784604768863,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.466646%\\\",\\\"left\\\":\\\"70.927077%\\\",\\\"width\\\":\\\"5.186524%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.8392970000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"租金收入\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":98.000009414959,\\\"height\\\":26.99999932736819},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#D7EDFF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#4D699D\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1387.280183268488,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762920024296-4\\\",\\\"y\\\":120.74785605700805,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.697742000000002%\\\",\\\"left\\\":\\\"73.420013%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#A5BECF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1336.7643551009614,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762920012633-3\\\",\\\"y\\\":114.54621791864594,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.045583%\\\",\\\"left\\\":\\\"70.746528%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"960\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#038BFE\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#6BBBE8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":97.00000392028137,\\\"x\\\":1681.1488904078549,\\\"h\\\":66.000000468988,\\\"i\\\":\\\"es-drager-1762919932439-2\\\",\\\"y\\\":61.86573353334538,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.5057480000000005%\\\",\\\"left\\\":\\\"88.972635%\\\",\\\"width\\\":\\\"5.1336%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.940504000000002%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":97.00000392028139,\\\"height\\\":66.000000468988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_17_1763551465441.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":98.00000941495898,\\\"x\\\":1516.6823000769286,\\\"h\\\":68.99999616785293,\\\"i\\\":\\\"es-drager-1762919907257-1\\\",\\\"y\\\":56.93021440628894,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"5.986733000000002%\\\",\\\"left\\\":\\\"80.268453%\\\",\\\"width\\\":\\\"5.186524%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"7.2559809999999985%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":98.000009414959,\\\"height\\\":68.99999616785293},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_15_1763551456718.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":104.00000459277844,\\\"x\\\":1323.09496172476,\\\"h\\\":64.00000333641137,\\\"i\\\":\\\"95a344c5-64da-4b5a-8c42-564baeb66174\\\",\\\"y\\\":55.79305231314942,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"5.867149999999998%\\\",\\\"left\\\":\\\"70.023093%\\\",\\\"width\\\":\\\"5.504066%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.730186000000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":104.00000459277844,\\\"height\\\":64.00000333641137},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_13_1763551449127.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":902.9999922765066,\\\"x\\\":508.64661984462634,\\\"h\\\":604.9999979594594,\\\"i\\\":\\\"f14ca628-b80a-4dd7-8df3-67597e00b63c\\\",\\\"y\\\":88.35669360434433,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.291514864092687%\\\",\\\"left\\\":\\\"26.919465794871066%\\\",\\\"width\\\":\\\"47.790109%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"63.62128600000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":902.9999922765066,\\\"height\\\":604.9999979594594},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/产城背景地图_1763551428302.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JCardCarousel\\\",\\\"visible\\\":true,\\\"w\\\":313.40683127324746,\\\"x\\\":934.3368548099414,\\\"h\\\":160.8503385248215,\\\"i\\\":\\\"es-drager-1762858057998-9\\\",\\\"y\\\":787.428049725881,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"82.80526500000002%\\\",\\\"left\\\":\\\"49.448572%\\\",\\\"width\\\":\\\"16.586652%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"16.914884999999995%\\\"},\\\"componentName\\\":\\\"卡片轮播\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"销售物料汇总数据\\\\\\\",\\\\\\\"orderNum\\\\\\\":1247,\\\\\\\"orderAmount\\\\\\\":28475000,\\\\\\\"deliveryNum\\\\\\\":1189,\\\\\\\"signNum\\\\\\\":1156,\\\\\\\"outAmount\\\\\\\":26789000},{\\\\\\\"title\\\\\\\":\\\\\\\"采购物料汇总数据\\\\\\\",\\\\\\\"orderNum\\\\\\\":892,\\\\\\\"orderAmount\\\\\\\":15680000,\\\\\\\"deliveryNum\\\\\\\":856,\\\\\\\"signNum\\\\\\\":823,\\\\\\\"outAmount\\\\\\\":14875000},{\\\\\\\"title\\\\\\\":\\\\\\\"库存物料汇总数据\\\\\\\",\\\\\\\"orderNum\\\\\\\":2156,\\\\\\\"orderAmount\\\\\\\":3440,\\\\\\\"deliveryNum\\\\\\\":2340,\\\\\\\"signNum\\\\\\\":2340,\\\\\\\"outAmount\\\\\\\":7100000},{\\\\\\\"title\\\\\\\":\\\\\\\"质量物料汇总数据\\\\\\\",\\\\\\\"orderNum\\\\\\\":110,\\\\\\\"orderAmount\\\\\\\":33330000,\\\\\\\"deliveryNum\\\\\\\":1100,\\\\\\\"signNum\\\\\\\":110,\\\\\\\"outAmount\\\\\\\":111110000}]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":313.40683127324746,\\\"height\\\":160.85033852482147},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[],\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":1000,\\\"dataType\\\":1,\\\"h\\\":230,\\\"linkageConfig\\\":[],\\\"timeOut\\\":0,\\\"option\\\":{\\\"titleFieldMapping\\\":{\\\"offset\\\":{\\\"x\\\":22,\\\"y\\\":0},\\\"show\\\":true,\\\"position\\\":\\\"left\\\",\\\"textStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to bottom\\\",\\\"startColor\\\":\\\"#FFFFFF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"key\\\":\\\"title\\\",\\\"direction\\\":\\\"vertical\\\"},\\\"autoScrollEnabled\\\":true,\\\"contentLineHeight\\\":24,\\\"autoScrollDirection\\\":\\\"to-left\\\",\\\"contentFieldMapping\\\":[{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"个\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"订单数量\\\",\\\"width\\\":120,\\\"key\\\":\\\"orderNum\\\",\\\"marginLeft\\\":0},{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"元\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"订单金额\\\",\\\"width\\\":150,\\\"key\\\":\\\"orderAmount\\\",\\\"marginLeft\\\":0},{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"个\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"发货数量\\\",\\\"width\\\":120,\\\"key\\\":\\\"deliveryNum\\\",\\\"marginLeft\\\":0},{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"个\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"签收数量\\\",\\\"width\\\":120,\\\"key\\\":\\\"signNum\\\",\\\"marginLeft\\\":0},{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"元\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"出库金额\\\",\\\"width\\\":150,\\\"key\\\":\\\"outAmount\\\",\\\"marginLeft\\\":0}],\\\"contentCurrent\\\":0,\\\"autoScrollSpeed\\\":100,\\\"contentLineAlign\\\":\\\"start\\\",\\\"contentLineTextGap\\\":7,\\\"cardStyle\\\":{\\\"backgroundColor\\\":\\\"#1890FF1A\\\",\\\"borderColor\\\":\\\"#1890FF\\\",\\\"backgroundImagePosition\\\":\\\"center\\\",\\\"backgroundImage\\\":\\\"drag/lib/img/cardCarousel-bg-01.png\\\",\\\"paddingRight\\\":7,\\\"minWidth\\\":300,\\\"backgroundImageRepeat\\\":\\\"no-repeat\\\",\\\"backgroundImageSize\\\":\\\"100% 100%\\\",\\\"marginRight\\\":25,\\\"borderEnabled\\\":true,\\\"paddingBottom\\\":16,\\\"borderRadius\\\":2,\\\"borderWidth\\\":1,\\\"paddingTop\\\":11,\\\"borderStyle\\\":\\\"dashed\\\",\\\"paddingLeft\\\":60},\\\"currentValue\\\":0}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":166.999991750129,\\\"x\\\":928.9449046933179,\\\"h\\\":46.00000061503394,\\\"i\\\":\\\"es-drager-1762858012980-8\\\",\\\"y\\\":742.7945873431419,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"78.11164800000002%\\\",\\\"left\\\":\\\"49.16321%\\\",\\\"width\\\":\\\"8.838259%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.837321000000001%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"采购物料汇总数据\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":166.999991750129,\\\"height\\\":46.00000061503395},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":164.99999965589683,\\\"x\\\":604.9472435546074,\\\"h\\\":46.00000061503394,\\\"i\\\":\\\"es-drager-1762858006638-7\\\",\\\"y\\\":745.4557822839193,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"78.39149700000002%\\\",\\\"left\\\":\\\"32.01605200000001%\\\",\\\"width\\\":\\\"8.732411999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.837321000000001%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"销售物料汇总数据\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":164.99999965589683,\\\"height\\\":46.00000061503395},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":79.61138898968348,\\\"x\\\":464.15006375641275,\\\"h\\\":27.97398018640021,\\\"i\\\":\\\"es-drager-1762857953002-6\\\",\\\"y\\\":603.0104611624024,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.412068%\\\",\\\"left\\\":\\\"24.564543%\\\",\\\"width\\\":\\\"4.21333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9417200000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同总金额\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":79.61138898968348,\\\"height\\\":27.97398018640021},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBF4FC\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":498.46424973104354,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762857945733-5\\\",\\\"y\\\":577.8170283450596,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"60.76274800000001%\\\",\\\"left\\\":\\\"26.380577000000006%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.85083281172334,\\\"x\\\":444.15006723359915,\\\"h\\\":42.93802267351676,\\\"i\\\":\\\"es-drager-1762857940021-4\\\",\\\"y\\\":566.550904652079,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"59.578012000000015%\\\",\\\"left\\\":\\\"23.506069%\\\",\\\"width\\\":\\\"3.90846%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.515326000000002%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"5451\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.85083281172334,\\\"height\\\":42.93802267351676},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBE5F5\\\",\\\"letterSpacing\\\":2,\\\"fontSize\\\":26,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":79.61138898968348,\\\"x\\\":254.103164781102,\\\"h\\\":27.97398018640021,\\\"i\\\":\\\"es-drager-1762857932522-3\\\",\\\"y\\\":603.1394180805687,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.425629000000015%\\\",\\\"left\\\":\\\"13.448081999999998%\\\",\\\"width\\\":\\\"4.21333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9417200000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同总数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":79.61138898968348,\\\"height\\\":27.97398018640021},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#CAF1F1\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":273.2239145409379,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762857921854-2\\\",\\\"y\\\":574.1476187199129,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"60.376876%\\\",\\\"left\\\":\\\"14.460023%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.85083281172334,\\\"x\\\":232.83704384994144,\\\"h\\\":42.93802267351676,\\\"i\\\":\\\"es-drager-1762857915642-1\\\",\\\"y\\\":564.1476235476339,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"59.325285000000015%\\\",\\\"left\\\":\\\"12.3226%\\\",\\\"width\\\":\\\"3.90846%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.515326000000002%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"700\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.85083281172334,\\\"height\\\":42.93802267351676},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBE5F5\\\",\\\"letterSpacing\\\":2,\\\"fontSize\\\":26,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":79.61138898968348,\\\"x\\\":431.3599206203753,\\\"h\\\":27.97398018640021,\\\"i\\\":\\\"es-drager-1762857685097-3\\\",\\\"y\\\":92.89323780828366,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.768574000000001%\\\",\\\"left\\\":\\\"22.829167%\\\",\\\"width\\\":\\\"4.21333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9417200000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同总金额\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":79.61138898968348,\\\"height\\\":27.97398018640021},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBF4FC\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.85083281172334,\\\"x\\\":415.15827842747956,\\\"h\\\":42.93802267351676,\\\"i\\\":\\\"es-drager-1762857678154-2\\\",\\\"y\\\":62.76426684509252,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.600237000000002%\\\",\\\"left\\\":\\\"21.971716%\\\",\\\"width\\\":\\\"3.90846%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.515326000000002%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"5451\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.85083281172334,\\\"height\\\":42.93802267351676},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBE5F5\\\",\\\"letterSpacing\\\":2,\\\"fontSize\\\":26,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":470.7385853332709,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762857671067-1\\\",\\\"y\\\":74.03038102867723,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"7.784972%\\\",\\\"left\\\":\\\"24.913232%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":79.61138898968348,\\\"x\\\":236.50643896473628,\\\"h\\\":27.97398018640021,\\\"i\\\":\\\"es-drager-1762857250911-4\\\",\\\"y\\\":91.75606620574825,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.648990000000001%\\\",\\\"left\\\":\\\"12.516798000000001%\\\",\\\"width\\\":\\\"4.21333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9417200000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同总数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":79.61138898968348,\\\"height\\\":27.97398018640021},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#CAF1F1\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":264.4900406878781,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762857246742-3\\\",\\\"y\\\":66.5626238790095,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.999669000000003%\\\",\\\"left\\\":\\\"13.997793999999999%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.85083281172334,\\\"x\\\":220.3048156669637,\\\"h\\\":42.93802267351676,\\\"i\\\":\\\"c9cf304e-4c81-4f49-86ba-4bd605c5a2ee\\\",\\\"y\\\":60.36098574064735,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.347509999999999%\\\",\\\"left\\\":\\\"11.659348%\\\",\\\"width\\\":\\\"3.90846%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.515326000000002%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"700\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.85083281172334,\\\"height\\\":42.93802267351676},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBE5F5\\\",\\\"letterSpacing\\\":2,\\\"fontSize\\\":26,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":159.22275908424388,\\\"x\\\":378.3118436361548,\\\"h\\\":100.90612107946721,\\\"i\\\":\\\"es-drager-1762856453053-5\\\",\\\"y\\\":566.1992281719063,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"59.541030000000006%\\\",\\\"left\\\":\\\"20.021666%\\\",\\\"width\\\":\\\"8.426659%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.611202000000002%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":159.22275908424388,\\\"height\\\":100.90612107946721},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_08_1763551371680.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":158.21502548422043,\\\"x\\\":175.86167221580308,\\\"h\\\":103.90332101592959,\\\"i\\\":\\\"es-drager-1762856443052-4\\\",\\\"y\\\":565.062056569371,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"59.42144600000001%\\\",\\\"left\\\":\\\"9.307252%\\\",\\\"width\\\":\\\"8.373326%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.926385000000002%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":158.21502548422043,\\\"height\\\":103.90332101592959},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_06_1763551351533.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":179.4107809769754,\\\"x\\\":9.999998261406802,\\\"h\\\":59.87246905308507,\\\"i\\\":\\\"es-drager-1762856433841-3\\\",\\\"y\\\":582.2553106684887,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"61.229474%\\\",\\\"left\\\":\\\"0.5292370000000001%\\\",\\\"width\\\":\\\"9.495083999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.296138%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"销售合同执行情况\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":179.4107809769754,\\\"height\\\":59.87246905308506},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":1.0000054946776085,\\\"x\\\":265.756146201102,\\\"h\\\":489.0000026102841,\\\"i\\\":\\\"es-drager-1762856395529-2\\\",\\\"y\\\":261.1933607244709,\\\"orderNum\\\":70,\\\"angle\\\":89.5176726903602,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(89.5176726903602deg)\\\",\\\"top\\\":\\\"27.466872%\\\",\\\"left\\\":\\\"14.064801%\\\",\\\"width\\\":\\\"0.05292399999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"51.422825%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1.0000054946776085,\\\"height\\\":489.0000026102842},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":23,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_23_1763551793351.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":168.29241816982415,\\\"x\\\":345.52170050011733,\\\"h\\\":100.90612107946721,\\\"i\\\":\\\"es-drager-1762856376359-1\\\",\\\"y\\\":61.146461844218294,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.430110000000002%\\\",\\\"left\\\":\\\"18.28629%\\\",\\\"width\\\":\\\"8.906659%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.611202000000002%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":168.29241816982417,\\\"height\\\":100.90612107946721},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_08_1763551371680.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":170.3079042649941,\\\"x\\\":154.4665731743963,\\\"h\\\":110.89681606252965,\\\"i\\\":\\\"d3cf63e9-7b37-4afe-b90d-c6c1bdf48102\\\",\\\"y\\\":52.412585683244885,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"5.511663000000001%\\\",\\\"left\\\":\\\"8.174944000000002%\\\",\\\"width\\\":\\\"9.013325999999996%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"11.661815000000002%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":170.30790426499408,\\\"height\\\":110.89681606252967},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_06_1763551351533.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":179.4107809769754,\\\"x\\\":6.330603146611956,\\\"h\\\":59.87246905308507,\\\"i\\\":\\\"39a18ddf-1cad-406d-aeba-22acef8b3394\\\",\\\"y\\\":83.53314890672488,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.784275000000003%\\\",\\\"left\\\":\\\"0.33503899999999986%\\\",\\\"width\\\":\\\"9.495083999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.296138%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"销售合同执行情况\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":179.4107809769754,\\\"height\\\":59.87246905308506},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":275.6824912726846,\\\"x\\\":608.4677262042908,\\\"h\\\":56.760195916509936,\\\"i\\\":\\\"es-drager-1762509913951-2\\\",\\\"y\\\":686.8419103099617,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"72.22771200000001%\\\",\\\"left\\\":\\\"32.202369%\\\",\\\"width\\\":\\\"14.590139999999996%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.968854%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"销售/采购物料汇总数据\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":275.6824912726846,\\\"height\\\":56.760195916509936},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"55be9102-a729-42da-a3af-8e09bb26acad\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":652.010970522931,\\\"x\\\":602.0879012620165,\\\"h\\\":39.44354789584329,\\\"i\\\":\\\"es-drager-1762509378719-1\\\",\\\"y\\\":698.3655484446457,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"73.43952800000001%\\\",\\\"left\\\":\\\"31.864725%\\\",\\\"width\\\":\\\"34.506839%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.147850000000002%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":652.010970522931,\\\"height\\\":39.44354789584329},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"165d8b3e-f0cd-4f0c-803d-1ba28cbe4255\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":197.1030783259555,\\\"x\\\":1276.2217920728488,\\\"h\\\":57.678851110038615,\\\"i\\\":\\\"es-drager-1756456857944-26\\\",\\\"y\\\":0,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0%\\\",\\\"left\\\":\\\"67.542391%\\\",\\\"width\\\":\\\"10.431426%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.065459%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"租赁业务数据\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":197.1030783259555,\\\"height\\\":57.67885111003861},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"79b612d5-4915-4201-84ce-a34c4f9b4615\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":545.6198636829778,\\\"x\\\":1285.7391522050414,\\\"h\\\":40.91284466052541,\\\"i\\\":\\\"es-drager-1756456883802-27\\\",\\\"y\\\":10.89156760620763,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.1453480000000005%\\\",\\\"left\\\":\\\"68.046085%\\\",\\\"width\\\":\\\"28.876227%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.302360000000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":545.6198636829778,\\\"height\\\":40.91284466052541},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"165d8b3e-f0cd-4f0c-803d-1ba28cbe4255\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":180.5063957945135,\\\"x\\\":20.990441085205163,\\\"h\\\":44.25372367518584,\\\"i\\\":\\\"aeb580ea-2f80-4d05-8e54-5077a7907722\\\",\\\"y\\\":2.771618046281901,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0.29146100000000014%\\\",\\\"left\\\":\\\"1.110892%\\\",\\\"width\\\":\\\"9.553068%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.653684000000002%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"供应链业务数据\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":180.5063957945135,\\\"height\\\":44.25372367518584},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"55be9102-a729-42da-a3af-8e09bb26acad\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":532.0000133195311,\\\"x\\\":8.069766961641264,\\\"h\\\":39.99999970790813,\\\"i\\\":\\\"cb3770f4-03fa-4ad8-a636-c53fca6ac8f1\\\",\\\"y\\\":6.48828936918585,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0.6823029999999993%\\\",\\\"left\\\":\\\"0.4270819999999998%\\\",\\\"width\\\":\\\"28.155414%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.206366000000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":532.0000133195311,\\\"height\\\":39.99999970790813},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"165d8b3e-f0cd-4f0c-803d-1ba28cbe4255\\\"},{\\\"component\\\":\\\"JCardScroll\\\",\\\"visible\\\":true,\\\"w\\\":571.0000008704807,\\\"x\\\":5.169592308042205,\\\"h\\\":252.99999862798865,\\\"i\\\":\\\"e0b9a809-d8a1-4996-bafa-73202d5a4b71\\\",\\\"y\\\":197.15144948020918,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"20.732279%\\\",\\\"left\\\":\\\"0.273594%\\\",\\\"width\\\":\\\"30.219437999999993%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"26.605265%\\\"},\\\"componentName\\\":\\\"卡片滚动(横向)\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[],\\\"dataType\\\":1,\\\"h\\\":255,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 1,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"北京华信科技有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 8000\\\\n  },\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 2,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"上海(中国)智远信息技术股份有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 7800\\\\n  },\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 3,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"深圳市鼎盛软件有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 6880\\\\n  },\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 4,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"广州恒信数据服务有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 5600\\\\n  },\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 5,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"杭州云帆科技发展有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 4900\\\\n  },\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 6,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"成都睿智科技有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 4700\\\\n  },\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 7,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"南京博思信息技术有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 4500\\\\n  },\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 8,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"苏州新创软件有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 4200\\\\n  },\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 9,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"重庆智联科技有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 3900\\\\n  },\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 10,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"武汉华腾信息技术有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 3600\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":571.0000008704807,\\\"height\\\":252.99999862798865},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":900,\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"showIndex\\\":false,\\\"autoScrollEnabled\\\":true,\\\"columnGap\\\":16,\\\"rowGap\\\":16,\\\"indexFieldStyle\\\":{},\\\"contentFieldMapping\\\":[{\\\"itemConfig\\\":{\\\"marginRight\\\":0,\\\"alignItems\\\":\\\"flex-start\\\",\\\"width\\\":0,\\\"marginBottom\\\":4,\\\"layoutDirection\\\":\\\"row\\\",\\\"justifyContent\\\":\\\"center\\\",\\\"marginTop\\\":0,\\\"height\\\":73,\\\"marginLeft\\\":0},\\\"valueStyle\\\":{\\\"fontSize\\\":14,\\\"marginBottom\\\":4,\\\"fontColor\\\":\\\"#A6D8FF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"height\\\":0},\\\"showValue\\\":true,\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"nameStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"omitConfig\\\":{\\\"show\\\":true,\\\"lines\\\":3},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"valueType\\\":\\\"non-array\\\",\\\"name\\\":\\\"客户名称\\\",\\\"thousandSeparatorConfig\\\":{\\\"show\\\":false},\\\"key\\\":\\\"customerName\\\",\\\"showLabel\\\":false},{\\\"itemConfig\\\":{\\\"marginRight\\\":0,\\\"alignItems\\\":\\\"center\\\",\\\"width\\\":0,\\\"marginBottom\\\":3,\\\"layoutDirection\\\":\\\"row\\\",\\\"justifyContent\\\":\\\"center\\\",\\\"marginTop\\\":0,\\\"height\\\":68,\\\"marginLeft\\\":0},\\\"valueStyle\\\":{\\\"fontSize\\\":24,\\\"marginBottom\\\":0,\\\"fontColor\\\":\\\"#FEAF26\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"height\\\":0,\\\"marginLeft\\\":0},\\\"showValue\\\":true,\\\"valueCompose\\\":{\\\"enabled\\\":false},\\\"nameStyle\\\":{\\\"marginRight\\\":0,\\\"width\\\":225,\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginLeft\\\":0},\\\"omitConfig\\\":{\\\"show\\\":false,\\\"lines\\\":1},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"valueType\\\":\\\"non-array\\\",\\\"name\\\":\\\"排名\\\",\\\"thousandSeparatorConfig\\\":{\\\"show\\\":false},\\\"key\\\":\\\"rank\\\",\\\"showLabel\\\":false},{\\\"itemConfig\\\":{\\\"marginRight\\\":0,\\\"alignItems\\\":\\\"center\\\",\\\"width\\\":0,\\\"marginBottom\\\":0,\\\"layoutDirection\\\":\\\"column-reverse\\\",\\\"justifyContent\\\":\\\"center\\\",\\\"marginTop\\\":22,\\\"height\\\":0,\\\"marginLeft\\\":0},\\\"valueStyle\\\":{\\\"fontSize\\\":18,\\\"marginBottom\\\":2,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontColor\\\":\\\"#F8E71C\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"showValue\\\":true,\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#40A9FF\\\"},\\\"suffix\\\":\\\"万元\\\",\\\"enabled\\\":false},\\\"nameStyle\\\":{\\\"fontSize\\\":12,\\\"fontColor\\\":\\\"#B0B0B0\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"height\\\":0},\\\"omitConfig\\\":{\\\"show\\\":false,\\\"lines\\\":1},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"valueType\\\":\\\"non-array\\\",\\\"name\\\":\\\"合同额(万元)\\\",\\\"thousandSeparatorConfig\\\":{\\\"show\\\":true},\\\"key\\\":\\\"contractAmount\\\",\\\"showLabel\\\":true}],\\\"contentCurrent\\\":2,\\\"autoScrollSpeed\\\":100,\\\"scrollDirection\\\":\\\"left\\\",\\\"cardStyle\\\":{\\\"backgroundColor\\\":\\\"#1890FF1A\\\",\\\"borderColor\\\":\\\"#1890FF\\\",\\\"backgroundImage\\\":\\\"drag/lib/img/cardScroll-bg-01.png\\\",\\\"paddingRight\\\":5,\\\"borderEnabled\\\":true,\\\"paddingBottom\\\":5,\\\"borderRadius\\\":8,\\\"borderWidth\\\":0,\\\"width\\\":98,\\\"bgHighlightImage\\\":\\\"\\\",\\\"paddingTop\\\":5,\\\"borderStyle\\\":\\\"dashed\\\",\\\"paddingLeft\\\":5,\\\"height\\\":250},\\\"currentValue\\\":0,\\\"direction\\\":\\\"horizontal\\\"}}},{\\\"component\\\":\\\"JCardScroll\\\",\\\"visible\\\":true,\\\"w\\\":566.3493253279954,\\\"x\\\":0,\\\"h\\\":244.77226006523037,\\\"i\\\":\\\"2a873018-ef8b-4b48-85d8-2792e5015273\\\",\\\"y\\\":694.6404137593668,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"73.047796%\\\",\\\"left\\\":\\\"0%\\\",\\\"width\\\":\\\"29.973307%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"25.740043000000007%\\\"},\\\"componentName\\\":\\\"卡片滚动(横向)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[{\\\\\\\"rank\\\\\\\":1,\\\\\\\"customerName\\\\\\\":\\\\\\\"北京华信科技有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":8000},{\\\\\\\"rank\\\\\\\":2,\\\\\\\"customerName\\\\\\\":\\\\\\\"上海(中国)智远信息技术股份有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":7800},{\\\\\\\"rank\\\\\\\":3,\\\\\\\"customerName\\\\\\\":\\\\\\\"深圳市鼎盛软件有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":6880},{\\\\\\\"rank\\\\\\\":4,\\\\\\\"customerName\\\\\\\":\\\\\\\"广州恒信数据服务有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":5600},{\\\\\\\"rank\\\\\\\":5,\\\\\\\"customerName\\\\\\\":\\\\\\\"杭州云帆科技发展有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":4900},{\\\\\\\"rank\\\\\\\":6,\\\\\\\"customerName\\\\\\\":\\\\\\\"成都睿智科技有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":4700},{\\\\\\\"rank\\\\\\\":7,\\\\\\\"customerName\\\\\\\":\\\\\\\"南京博思信息技术有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":4500},{\\\\\\\"rank\\\\\\\":8,\\\\\\\"customerName\\\\\\\":\\\\\\\"苏州新创软件有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":4200},{\\\\\\\"rank\\\\\\\":9,\\\\\\\"customerName\\\\\\\":\\\\\\\"重庆智联科技有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":3900},{\\\\\\\"rank\\\\\\\":10,\\\\\\\"customerName\\\\\\\":\\\\\\\"武汉华腾信息技术有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":3600}]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":566.3493253279954,\\\"height\\\":244.77226006523034},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[],\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":900,\\\"dataType\\\":1,\\\"h\\\":255,\\\"linkageConfig\\\":[],\\\"timeOut\\\":0,\\\"option\\\":{\\\"showIndex\\\":false,\\\"autoScrollEnabled\\\":true,\\\"columnGap\\\":16,\\\"rowGap\\\":16,\\\"indexFieldStyle\\\":{},\\\"contentFieldMapping\\\":[{\\\"itemConfig\\\":{\\\"marginRight\\\":0,\\\"alignItems\\\":\\\"flex-start\\\",\\\"width\\\":0,\\\"marginBottom\\\":4,\\\"layoutDirection\\\":\\\"row\\\",\\\"justifyContent\\\":\\\"center\\\",\\\"marginTop\\\":0,\\\"height\\\":73,\\\"marginLeft\\\":0},\\\"valueStyle\\\":{\\\"fontSize\\\":14,\\\"marginBottom\\\":4,\\\"fontColor\\\":\\\"#A6D8FF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"height\\\":0},\\\"showValue\\\":true,\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"nameStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"omitConfig\\\":{\\\"show\\\":true,\\\"lines\\\":3},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"valueType\\\":\\\"non-array\\\",\\\"name\\\":\\\"客户名称\\\",\\\"thousandSeparatorConfig\\\":{\\\"show\\\":false},\\\"key\\\":\\\"customerName\\\",\\\"showLabel\\\":false},{\\\"itemConfig\\\":{\\\"marginRight\\\":0,\\\"alignItems\\\":\\\"center\\\",\\\"width\\\":0,\\\"marginBottom\\\":3,\\\"layoutDirection\\\":\\\"row\\\",\\\"justifyContent\\\":\\\"center\\\",\\\"marginTop\\\":0,\\\"height\\\":68,\\\"marginLeft\\\":0},\\\"valueStyle\\\":{\\\"fontSize\\\":24,\\\"marginBottom\\\":0,\\\"fontColor\\\":\\\"#FEAF26\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"height\\\":0,\\\"marginLeft\\\":0},\\\"showValue\\\":true,\\\"valueCompose\\\":{\\\"enabled\\\":false},\\\"nameStyle\\\":{\\\"marginRight\\\":0,\\\"width\\\":225,\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginLeft\\\":0},\\\"omitConfig\\\":{\\\"show\\\":false,\\\"lines\\\":1},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"valueType\\\":\\\"non-array\\\",\\\"name\\\":\\\"排名\\\",\\\"thousandSeparatorConfig\\\":{\\\"show\\\":false},\\\"key\\\":\\\"rank\\\",\\\"showLabel\\\":false},{\\\"itemConfig\\\":{\\\"marginRight\\\":0,\\\"alignItems\\\":\\\"center\\\",\\\"width\\\":0,\\\"marginBottom\\\":0,\\\"layoutDirection\\\":\\\"column-reverse\\\",\\\"justifyContent\\\":\\\"center\\\",\\\"marginTop\\\":0,\\\"height\\\":100,\\\"marginLeft\\\":0},\\\"valueStyle\\\":{\\\"fontSize\\\":18,\\\"marginBottom\\\":2,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontColor\\\":\\\"#40A9FF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"showValue\\\":true,\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#40A9FF\\\"},\\\"suffix\\\":\\\"万元\\\",\\\"enabled\\\":false},\\\"nameStyle\\\":{\\\"fontSize\\\":12,\\\"fontColor\\\":\\\"#B0B0B0\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"height\\\":0},\\\"omitConfig\\\":{\\\"show\\\":false,\\\"lines\\\":1},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"valueType\\\":\\\"non-array\\\",\\\"name\\\":\\\"合同额(万元)\\\",\\\"thousandSeparatorConfig\\\":{\\\"show\\\":true},\\\"key\\\":\\\"contractAmount\\\",\\\"showLabel\\\":true}],\\\"contentCurrent\\\":2,\\\"autoScrollSpeed\\\":100,\\\"scrollDirection\\\":\\\"left\\\",\\\"cardStyle\\\":{\\\"backgroundColor\\\":\\\"#1890FF1A\\\",\\\"borderColor\\\":\\\"#1890FF\\\",\\\"backgroundImage\\\":\\\"drag/lib/img/cardScroll-bg-01.png\\\",\\\"paddingRight\\\":5,\\\"borderEnabled\\\":true,\\\"paddingBottom\\\":5,\\\"borderRadius\\\":8,\\\"borderWidth\\\":0,\\\"width\\\":98,\\\"bgHighlightImage\\\":\\\"\\\",\\\"paddingTop\\\":5,\\\"borderStyle\\\":\\\"dashed\\\",\\\"paddingLeft\\\":5,\\\"height\\\":250},\\\"currentValue\\\":0,\\\"direction\\\":\\\"horizontal\\\"}}},{\\\"component\\\":\\\"JCardCarousel\\\",\\\"visible\\\":true,\\\"w\\\":313.40683127324746,\\\"x\\\":607.8069637496602,\\\"h\\\":160.8503385248215,\\\"i\\\":\\\"ffd3cb22-59f2-471e-8329-f15c72dbe26e\\\",\\\"y\\\":790.0892541760543,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"83.08511500000002%\\\",\\\"left\\\":\\\"32.167399%\\\",\\\"width\\\":\\\"16.586652%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"16.914884999999995%\\\"},\\\"componentName\\\":\\\"卡片轮播\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[],\\\"dataType\\\":1,\\\"h\\\":230,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"销售物料汇总数据\\\\\\\",\\\\n    \\\\\\\"orderNum\\\\\\\": 1247,\\\\n    \\\\\\\"orderAmount\\\\\\\": 28475000,\\\\n    \\\\\\\"deliveryNum\\\\\\\": 1189,\\\\n    \\\\\\\"signNum\\\\\\\": 1156,\\\\n    \\\\\\\"outAmount\\\\\\\": 26789000\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"采购物料汇总数据\\\\\\\",\\\\n    \\\\\\\"orderNum\\\\\\\": 892,\\\\n    \\\\\\\"orderAmount\\\\\\\": 15680000,\\\\n    \\\\\\\"deliveryNum\\\\\\\": 856,\\\\n    \\\\\\\"signNum\\\\\\\": 823,\\\\n    \\\\\\\"outAmount\\\\\\\": 14875000\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"库存物料汇总数据\\\\\\\",\\\\n    \\\\\\\"orderNum\\\\\\\": 2156,\\\\n    \\\\\\\"orderAmount\\\\\\\": 3440,\\\\n    \\\\\\\"deliveryNum\\\\\\\": 2340,\\\\n    \\\\\\\"signNum\\\\\\\": 2340,\\\\n    \\\\\\\"outAmount\\\\\\\": 7100000\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"质量物料汇总数据\\\\\\\",\\\\n    \\\\\\\"orderNum\\\\\\\": 110,\\\\n    \\\\\\\"orderAmount\\\\\\\": 33330000,\\\\n    \\\\\\\"deliveryNum\\\\\\\": 1100,\\\\n    \\\\\\\"signNum\\\\\\\": 110,\\\\n    \\\\\\\"outAmount\\\\\\\": 111110000\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":313.40683127324746,\\\"height\\\":160.85033852482147},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":1000,\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"titleFieldMapping\\\":{\\\"offset\\\":{\\\"x\\\":22,\\\"y\\\":0},\\\"show\\\":true,\\\"position\\\":\\\"left\\\",\\\"textStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to bottom\\\",\\\"startColor\\\":\\\"#FFFFFF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"key\\\":\\\"title\\\",\\\"direction\\\":\\\"vertical\\\"},\\\"autoScrollEnabled\\\":true,\\\"contentLineHeight\\\":24,\\\"autoScrollDirection\\\":\\\"to-left\\\",\\\"contentFieldMapping\\\":[{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"个\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"订单数量\\\",\\\"width\\\":120,\\\"key\\\":\\\"orderNum\\\",\\\"marginLeft\\\":0},{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"元\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"订单金额\\\",\\\"width\\\":150,\\\"key\\\":\\\"orderAmount\\\",\\\"marginLeft\\\":0},{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"个\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"发货数量\\\",\\\"width\\\":120,\\\"key\\\":\\\"deliveryNum\\\",\\\"marginLeft\\\":0},{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"个\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"签收数量\\\",\\\"width\\\":120,\\\"key\\\":\\\"signNum\\\",\\\"marginLeft\\\":0},{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"元\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"出库金额\\\",\\\"width\\\":150,\\\"key\\\":\\\"outAmount\\\",\\\"marginLeft\\\":0}],\\\"contentCurrent\\\":0,\\\"autoScrollSpeed\\\":100,\\\"contentLineAlign\\\":\\\"start\\\",\\\"contentLineTextGap\\\":7,\\\"cardStyle\\\":{\\\"backgroundColor\\\":\\\"#1890FF1A\\\",\\\"borderColor\\\":\\\"#1890FF\\\",\\\"backgroundImagePosition\\\":\\\"center\\\",\\\"backgroundImage\\\":\\\"drag/lib/img/cardCarousel-bg-01.png\\\",\\\"paddingRight\\\":7,\\\"minWidth\\\":300,\\\"backgroundImageRepeat\\\":\\\"no-repeat\\\",\\\"backgroundImageSize\\\":\\\"100% 100%\\\",\\\"marginRight\\\":25,\\\"borderEnabled\\\":true,\\\"paddingBottom\\\":16,\\\"borderRadius\\\":2,\\\"borderWidth\\\":1,\\\"paddingTop\\\":11,\\\"borderStyle\\\":\\\"dashed\\\",\\\"paddingLeft\\\":60},\\\"currentValue\\\":0}}},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":507.0000082184526,\\\"x\\\":1330.691670384596,\\\"h\\\":82.0000060577888,\\\"i\\\":\\\"0445aa8e-0d06-4ada-8ac2-1f1d88272fea\\\",\\\"y\\\":536.4516695699515,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"56.41280199999999%\\\",\\\"left\\\":\\\"70.425139%\\\",\\\"width\\\":\\\"26.832320999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"8.623051%\\\"},\\\"componentName\\\":\\\"滚动列表(多行+序号)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 1,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 1000,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"丰田\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 2,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 1000,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"本田\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 3,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 2000,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"大众\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 4,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 1000,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"比亚迪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 5,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 5,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"特斯拉\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 6,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 4,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"福特\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 7,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 2,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"雪佛兰\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 8,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 6,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"宝马\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 9,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 1,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"奔驰\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 10,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 0,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"奥迪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 11,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 3,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"起亚\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 12,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 2,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"现代\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 13,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 5,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"路虎\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 14,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 1,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"沃尔沃\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 15,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 4,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"马自达\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":507.0000082184526,\\\"height\\\":82.0000060577888},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"showIndex\\\":true,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"__system\\\":true,\\\"textAlign\\\":\\\"center\\\",\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":22,\\\"fontColor\\\":\\\"#E19900\\\"},\\\"enabled\\\":true},\\\"name\\\":\\\"序号\\\",\\\"width\\\":41,\\\"textStyle\\\":{\\\"fontSize\\\":22,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FF4500\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFD700\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#E19900\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"key\\\":\\\"__index__\\\"},{\\\"marginRight\\\":18,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":16,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#D1D1D1\\\"},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":true},\\\"name\\\":\\\"项目名称\\\",\\\"width\\\":65,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"plateNumber\\\",\\\"marginLeft\\\":0},{\\\"compose\\\":{\\\"contentStyle\\\":{\\\"marginRight\\\":3,\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#00D4FF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#00FFDC\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginLeft\\\":4},\\\"suffixStyle\\\":{\\\"fontSize\\\":12,\\\"fontColor\\\":\\\"#C4C4C4\\\"},\\\"prefix\\\":\\\"欠款\\\",\\\"prefixStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"万元\\\",\\\"enabled\\\":true},\\\"name\\\":\\\"金额\\\",\\\"width\\\":100,\\\"textStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"violationCount\\\"}],\\\"itemsPerRow\\\":2,\\\"borderRadius\\\":8,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"indexFieldStyle\\\":{\\\"width\\\":28,\\\"textStyle\\\":{\\\"fontSize\\\":21,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#F54100\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#D4BA28\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"marginLeft\\\":15},\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"backgroundColor\\\":\\\"#FFFFFF\\\",\\\"backgroundImg\\\":\\\"drag/lib/img/scrollList-bg-02.png\\\",\\\"alternateBackgroundColor\\\":\\\"#F8F9FA\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":10,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"image\\\",\\\"height\\\":44}}}}]},\\\"component\\\":\\\"JGroup\\\",\\\"w\\\":1889.5123094958972,\\\"x\\\":31,\\\"y\\\":89,\\\"componentName\\\":\\\"万众\\\",\\\"pageCompId\\\":\\\"1151112776961806336\\\",\\\"equalProportion\\\":true,\\\"key\\\":\\\"a342e46b-63c6-4906-926c-36eaecaf0566\\\",\\\"group\\\":true},{\\\"visible\\\":false,\\\"h\\\":990.5545046613586,\\\"i\\\":\\\"es-drager-1756453915928-25\\\",\\\"props\\\":{\\\"elements\\\":[{\\\"component\\\":\\\"JRing\\\",\\\"visible\\\":true,\\\"w\\\":536,\\\"x\\\":1291.4419695193433,\\\"h\\\":245,\\\"i\\\":\\\"4471d794-0df3-4be7-8e35-7da09940b959\\\",\\\"y\\\":21.97302752185101,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"2.2182552720168527%\\\",\\\"left\\\":\\\"67.8862695459582%\\\",\\\"width\\\":\\\"28.175513368344646%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"24.73362130474166%\\\"},\\\"componentName\\\":\\\"饼状环形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 1048,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"垃圾车\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 735,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"机扫车\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 580,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"洒水车\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":536.2250879249707,\\\"height\\\":245.59671746776084},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":480,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"customColor\\\":[{\\\"color1\\\":\\\"#2A7DFB00\\\",\\\"color\\\":\\\"#2A7DFB\\\"},{\\\"color1\\\":\\\"#2BE4E3\\\",\\\"color\\\":\\\"#2BE4E300\\\"},{\\\"color1\\\":\\\"#FCA52F\\\",\\\"color\\\":\\\"#FCA52F00\\\"}],\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":50,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":14,\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\",\\\"t\\\":32},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"outRadius\\\":57,\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"innerRadius\\\":77,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JSemiGauge\\\",\\\"visible\\\":true,\\\"w\\\":238.00000008283695,\\\"x\\\":17.725667868792492,\\\"h\\\":215.0000038199236,\\\"i\\\":\\\"ededef6c-2bd9-4f89-a363-7506ae217601\\\",\\\"y\\\":480.30831953922336,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"48.488833%\\\",\\\"left\\\":\\\"0.9317719999999999%\\\",\\\"width\\\":\\\"12.510769%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"21.705015000000003%\\\"},\\\"componentName\\\":\\\"半圆仪表盘\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataType\\\":1,\\\"h\\\":430,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"total\\\\\\\": 385,\\\\n    \\\\\\\"used\\\\\\\": 85\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":238.00000008283695,\\\"height\\\":215.0000038199236},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":500,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"titleSuffix\\\":\\\"辆\\\",\\\"customAttr\\\":{\\\"innerCircle\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":0,\\\"y2\\\":1,\\\"x2\\\":1,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#2E76B9\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#2E76B9\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":15}},\\\"name\\\":\\\"内部小圆\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"outerScale\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"distance\\\":-52,\\\"show\\\":true,\\\"fontSize\\\":14},\\\"min\\\":0,\\\"max\\\":100,\\\"axisLine\\\":{\\\"show\\\":false},\\\"name\\\":\\\"外部刻度\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"splitNumber\\\":2,\\\"detail\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":67},\\\"innerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"animationDuration\\\":2000,\\\"pointer\\\":{\\\"show\\\":true,\\\"length\\\":74,\\\"width\\\":3,\\\"itemStyle\\\":{\\\"color\\\":\\\"#2E76B9\\\"}},\\\"data\\\":[{\\\"name\\\":\\\"去年优良率\\\",\\\"value\\\":44}],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#2E76B9\\\"],[1,\\\"#2E76B9\\\"]],\\\"width\\\":1}},\\\"name\\\":\\\"内部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"detail\\\":{\\\"offsetCenter\\\":[0,50],\\\"show\\\":false,\\\"textStyle\\\":{\\\"padding\\\":[0,0,0,0],\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":30,\\\"title\\\":{\\\"offsetCenter\\\":[0,26],\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"normal\\\"}}},\\\"outerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#2E76B9\\\"],[1,\\\"#2E76B9\\\"]],\\\"width\\\":2}},\\\"name\\\":\\\"外部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"basic\\\":{\\\"startAngle\\\":180,\\\"endAngle\\\":0},\\\"innerShadow\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"customGradient\\\":{\\\"endColor\\\":\\\"#2E76B9\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#2E76B900\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":1,\\\"y2\\\":0,\\\"x2\\\":0,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#2de69600\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#2de696\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":100}},\\\"name\\\":\\\"内部阴影\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80}},\\\"valuePrefix\\\":\\\"已使用：\\\",\\\"titlePrefix\\\":\\\"车辆总数：\\\",\\\"valueMapping\\\":\\\"used\\\",\\\"titleMapping\\\":\\\"total\\\",\\\"valueSuffix\\\":\\\"辆\\\"}}},{\\\"component\\\":\\\"JStatsSummary\\\",\\\"visible\\\":true,\\\"w\\\":671.0000006332002,\\\"x\\\":609.0035179014067,\\\"h\\\":116.00000459495868,\\\"i\\\":\\\"e06945ca-3292-42b3-a219-f816d45d7af6\\\",\\\"y\\\":59.956609941129244,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.052832999999999%\\\",\\\"left\\\":\\\"32.013035%\\\",\\\"width\\\":\\\"35.271958%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"11.710613000000002%\\\"},\\\"componentName\\\":\\\"统计概览（背景模式）\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"总车辆数\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 385,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"辆\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"2\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"在线车辆数\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 300,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"辆\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"3\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"离线车辆数\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 85,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"辆\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"4\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"加油总量\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6790,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"升\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"5\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"作业总里程\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 16790,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"公里\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":671.0000006332002,\\\"height\\\":116.00000459495868},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":713,\\\"dataType\\\":1,\\\"h\\\":129,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"layout\\\":{\\\"padding\\\":{\\\"top\\\":4,\\\"left\\\":20,\\\"bottom\\\":0,\\\"right\\\":6},\\\"borderColor\\\":\\\"#0f66ff59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"justify\\\":\\\"space-between\\\",\\\"borderWidth\\\":0,\\\"gap\\\":16,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"100% 100%\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"drag/lib/img/bg01.png\\\"},\\\"color\\\":\\\"#0b2b63\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"image\\\"}},\\\"fieldMap\\\":{\\\"compareValue\\\":\\\"compareValue\\\",\\\"unit\\\":\\\"suffix\\\",\\\"negativeValue\\\":\\\"0\\\",\\\"compareState\\\":\\\"compareState\\\",\\\"label\\\":\\\"name\\\",\\\"value\\\":\\\"value\\\",\\\"positiveValue\\\":\\\"1\\\",\\\"compareLabel\\\":\\\"compareLabel\\\"},\\\"card\\\":{\\\"padding\\\":{\\\"horizontal\\\":3,\\\"vertical\\\":15},\\\"borderColor\\\":\\\"#0F66FF59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"borderWidth\\\":0,\\\"blur\\\":24,\\\"minWidth\\\":100,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"cover\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"\\\"},\\\"color\\\":\\\"#0B2B6300\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"none\\\"}},\\\"sections\\\":{\\\"middle\\\":{\\\"compare\\\":{\\\"valueStyle\\\":{\\\"positiveGradient\\\":{\\\"endColor\\\":\\\"#15f0c5\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#15f0c5\\\"},\\\"positiveColor\\\":\\\"#15F0C5\\\",\\\"fontSize\\\":14,\\\"negativeColor\\\":\\\"#D0021B\\\",\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"negativeGradient\\\":{\\\"endColor\\\":\\\"#D0021B\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#D0021B\\\"},\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"alignItems\\\":\\\"center\\\",\\\"labelStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"fontColor\\\":\\\"#9ED3FF\\\"},\\\"label\\\":\\\"同比\\\"},\\\"paddingBottom\\\":10,\\\"show\\\":false,\\\"type\\\":\\\"compare\\\",\\\"align\\\":\\\"center\\\"},\\\"top\\\":{\\\"minHeight\\\":40,\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"paddingTop\\\":4,\\\"type\\\":\\\"value\\\",\\\"align\\\":\\\"center\\\",\\\"value\\\":{\\\"unit\\\":{\\\"fontSize\\\":16,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#96F5F8\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#49ABFF\\\"},\\\"fontWeight\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#9ED3FF\\\"},\\\"unitGap\\\":6,\\\"fontSize\\\":24,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#96F5F8\\\"},\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#D8F1FF\\\"}},\\\"bottom\\\":{\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"label\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#C9E6FF\\\"},\\\"type\\\":\\\"label\\\",\\\"align\\\":\\\"center\\\"}}}}},{\\\"component\\\":\\\"JRingProgress\\\",\\\"visible\\\":true,\\\"w\\\":132.99999836773736,\\\"x\\\":1652.157089719601,\\\"h\\\":109.000003549143,\\\"i\\\":\\\"es-drager-1763030296701-1\\\",\\\"y\\\":287.3540472473178,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"29.009413000000002%\\\",\\\"left\\\":\\\"86.847713%\\\",\\\"width\\\":\\\"6.991312000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"11.003938%\\\"},\\\"componentName\\\":\\\"基础环形图\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"占比\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 60\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":132.99999836773736,\\\"height\\\":109.000003549143},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"valueFontWeight\\\":\\\"normal\\\",\\\"color\\\":\\\"#1E90FF\\\",\\\"bgColor\\\":\\\"#E8EDF3C0\\\",\\\"valueFontSize\\\":16,\\\"lineHeight\\\":0,\\\"fontSize\\\":16,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"valueFontColor\\\":\\\"#FFFFFF\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"extraInfo\\\":{\\\"endColor\\\":\\\"#FF4500\\\",\\\"enabledGradient\\\":false,\\\"type\\\":\\\"linear\\\",\\\"direction\\\":\\\"to left\\\",\\\"startColor\\\":\\\"#FFD700\\\"}}}},{\\\"component\\\":\\\"JRingProgress\\\",\\\"visible\\\":true,\\\"w\\\":132.99999836773736,\\\"x\\\":1388.9331704588271,\\\"h\\\":109.000003549143,\\\"i\\\":\\\"99dbdc3f-3f29-4b98-86f1-2b590fe93931\\\",\\\"y\\\":288.74911449504765,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"29.15025%\\\",\\\"left\\\":\\\"73.011017%\\\",\\\"width\\\":\\\"6.991312000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"11.003938%\\\"},\\\"componentName\\\":\\\"基础环形图\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"占比\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 60\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":132.99999836773736,\\\"height\\\":109.000003549143},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"valueFontWeight\\\":\\\"normal\\\",\\\"color\\\":\\\"#1E90FF\\\",\\\"bgColor\\\":\\\"#E8EDF3C0\\\",\\\"valueFontSize\\\":16,\\\"lineHeight\\\":0,\\\"fontSize\\\":16,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"valueFontColor\\\":\\\"#FFFFFF\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"extraInfo\\\":{\\\"endColor\\\":\\\"#FF4500\\\",\\\"enabledGradient\\\":false,\\\"type\\\":\\\"linear\\\",\\\"direction\\\":\\\"to left\\\",\\\"startColor\\\":\\\"#FFD700\\\"}}}},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":527.999993949144,\\\"x\\\":1357.2801839687218,\\\"h\\\":183.00000186920772,\\\"i\\\":\\\"f65f9644-b011-4d49-9894-8d6293b286ca\\\",\\\"y\\\":782.8405641226518,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"79.030539%\\\",\\\"left\\\":\\\"71.347138%\\\",\\\"width\\\":\\\"27.754983%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"18.474501%\\\"},\\\"componentName\\\":\\\"滚动列表(多行+序号)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 3,\\\\n    \\\\\\\"id\\\\\\\": 1,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤B12345\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"丰田\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 1,\\\\n    \\\\\\\"id\\\\\\\": 2,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤A67890\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"本田\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 2,\\\\n    \\\\\\\"id\\\\\\\": 3,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤C54321\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"大众\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 0,\\\\n    \\\\\\\"id\\\\\\\": 4,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤D98765\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"比亚迪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 5,\\\\n    \\\\\\\"id\\\\\\\": 5,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤E11223\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"特斯拉\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 4,\\\\n    \\\\\\\"id\\\\\\\": 6,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤F33445\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"福特\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 2,\\\\n    \\\\\\\"id\\\\\\\": 7,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤G55667\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"雪佛兰\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 6,\\\\n    \\\\\\\"id\\\\\\\": 8,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤H77889\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"宝马\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 1,\\\\n    \\\\\\\"id\\\\\\\": 9,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤J99001\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"奔驰\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 0,\\\\n    \\\\\\\"id\\\\\\\": 10,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤K11223\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"奥迪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 3,\\\\n    \\\\\\\"id\\\\\\\": 11,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤L44556\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"起亚\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 2,\\\\n    \\\\\\\"id\\\\\\\": 12,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤M77889\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"现代\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 5,\\\\n    \\\\\\\"id\\\\\\\": 13,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤N99002\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"路虎\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 1,\\\\n    \\\\\\\"id\\\\\\\": 14,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤P22334\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"沃尔沃\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 4,\\\\n    \\\\\\\"id\\\\\\\": 15,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤Q55667\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"马自达\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":527.999993949144,\\\"height\\\":183.00000186920772},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"showIndex\\\":true,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"__system\\\":true,\\\"textAlign\\\":\\\"center\\\",\\\"name\\\":\\\"序号\\\",\\\"width\\\":41,\\\"textStyle\\\":{\\\"fontSize\\\":20,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FF4500\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFD700\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"key\\\":\\\"__index__\\\"},{\\\"marginRight\\\":18,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":16,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#D1D1D1\\\"},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":true},\\\"name\\\":\\\"车牌号\\\",\\\"width\\\":90,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"plateNumber\\\",\\\"marginLeft\\\":0},{\\\"compose\\\":{\\\"contentStyle\\\":{\\\"marginRight\\\":3,\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#00D4FF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#00FFDC\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginLeft\\\":4},\\\"suffixStyle\\\":{\\\"fontSize\\\":12,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"prefix\\\":\\\"本月\\\",\\\"prefixStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"次\\\",\\\"enabled\\\":true},\\\"name\\\":\\\"违规次数\\\",\\\"width\\\":100,\\\"textStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"violationCount\\\"}],\\\"itemsPerRow\\\":2,\\\"borderRadius\\\":8,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"indexFieldStyle\\\":{\\\"width\\\":28,\\\"textStyle\\\":{\\\"fontSize\\\":21,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#F54100\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#D4BA28\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"marginLeft\\\":15},\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"backgroundColor\\\":\\\"#FFFFFF\\\",\\\"backgroundImg\\\":\\\"drag/lib/img/scrollList-bg-02.png\\\",\\\"alternateBackgroundColor\\\":\\\"#F8F9FA\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":10,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"image\\\",\\\"height\\\":83},\\\"marginLeft\\\":6}}},{\\\"component\\\":\\\"JMultipleBar\\\",\\\"visible\\\":true,\\\"w\\\":577.9999974835168,\\\"x\\\":1324.3610810627897,\\\"h\\\":170.00000417221224,\\\"i\\\":\\\"efa6188b-fbb1-4951-be55-6bb81fc45461\\\",\\\"y\\\":603.1219127277654,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"60.887302%\\\",\\\"left\\\":\\\"69.616704%\\\",\\\"width\\\":\\\"30.383295999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"17.162105%\\\"},\\\"componentName\\\":\\\"对比柱形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"集团公司\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4800,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"建设集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3900,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"投资集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3200,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"万众集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3950,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"新成集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3600,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"海洋集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2100,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"集团公司\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3200,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"建设集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3500,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"投资集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4200,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"万众集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3200,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"新成集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2300,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"海洋集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 1900,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":577.9999974835168,\\\"height\\\":170.00000417221224},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"name\\\":\\\"单位(元)\\\",\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color1\\\":\\\"#006CFF00\\\",\\\"color\\\":\\\"#006CFFB3\\\"},{\\\"color1\\\":\\\"#00D8FF00\\\",\\\"color\\\":\\\"#00D8FFB3\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":43,\\\"left\\\":9,\\\"bottom\\\":18,\\\"right\\\":13,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":15,\\\"barGap\\\":\\\"34%\\\",\\\"itemStyle\\\":{\\\"borderRadius\\\":4}}],\\\"legend\\\":{\\\"r\\\":53},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":225.00000639287214,\\\"x\\\":1062.0164140689094,\\\"h\\\":121.99999134059341,\\\"i\\\":\\\"es-drager-1763027856495-4\\\",\\\"y\\\":810.5076231258076,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"81.823627%\\\",\\\"left\\\":\\\"55.826226999999996%\\\",\\\"width\\\":\\\"11.827407999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.316332999999997%\\\"},\\\"componentName\\\":\\\"滚动列表(单行)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 1,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12345\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 2,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A1236\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 3,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12311\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 4,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12377\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 5,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12895\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 6,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12822\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 7,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12811\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":225.00000639287214,\\\"height\\\":121.99999134059341},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"marginRight\\\":0,\\\"gridGap\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"marginRight\\\":15,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"name\\\":\\\"项目名称\\\",\\\"width\\\":91,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#4A90E2\\\"},\\\"key\\\":\\\"projectName\\\",\\\"marginLeft\\\":13}],\\\"itemsPerRow\\\":2,\\\"borderRadius\\\":7,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"marginRight\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"backgroundImg\\\":\\\"drag/lib/img/scrollList-bg-01.png\\\",\\\"isMultiline\\\":false,\\\"alternateBackgroundColor\\\":\\\"#F8F9FA00\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":11,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"color\\\",\\\"marginTop\\\":0,\\\"height\\\":29,\\\"marginLeft\\\":0},\\\"marginLeft\\\":0}}},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":221.00000687106677,\\\"x\\\":824.1148801954979,\\\"h\\\":121.99999134059341,\\\"i\\\":\\\"es-drager-1763027851750-3\\\",\\\"y\\\":811.9027002790828,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"81.964465%\\\",\\\"left\\\":\\\"43.320634%\\\",\\\"width\\\":\\\"11.617143%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.316332999999997%\\\"},\\\"componentName\\\":\\\"滚动列表(单行)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 1,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12345\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 2,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A1236\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 3,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12311\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 4,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12377\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 5,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12895\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 6,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12822\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 7,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12811\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":221.00000687106677,\\\"height\\\":121.99999134059341},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"marginRight\\\":0,\\\"gridGap\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"marginRight\\\":15,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"name\\\":\\\"项目名称\\\",\\\"width\\\":91,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#4A90E2\\\"},\\\"key\\\":\\\"projectName\\\",\\\"marginLeft\\\":13}],\\\"itemsPerRow\\\":2,\\\"borderRadius\\\":7,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"marginRight\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"backgroundImg\\\":\\\"drag/lib/img/scrollList-bg-01.png\\\",\\\"isMultiline\\\":false,\\\"alternateBackgroundColor\\\":\\\"#F8F9FA00\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":11,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"color\\\",\\\"marginTop\\\":0,\\\"height\\\":29,\\\"marginLeft\\\":0},\\\"marginLeft\\\":0}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":219.99999272290734,\\\"x\\\":1049.3552308870337,\\\"h\\\":131.9999857592265,\\\"i\\\":\\\"es-drager-1763027670564-2\\\",\\\"y\\\":802.6060887086645,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"81.025939%\\\",\\\"left\\\":\\\"55.160675999999995%\\\",\\\"width\\\":\\\"11.564576%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"13.325868%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":219.9999927229073,\\\"height\\\":131.9999857592265},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/组-155_02_1763554354943.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":219.99999272290734,\\\"x\\\":813.9859298452752,\\\"h\\\":131.9999857592265,\\\"i\\\":\\\"es-drager-1763027644239-1\\\",\\\"y\\\":804.0011658619395,\\\"orderNum\\\":1076.8710433763197,\\\"angle\\\":359.2911223131234,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(359.2911223131234deg)\\\",\\\"top\\\":\\\"81.166777%\\\",\\\"left\\\":\\\"42.788193%\\\",\\\"width\\\":\\\"11.564576%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"13.325868%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":219.9999927229073,\\\"height\\\":131.9999857592265},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/组-155_02_1763554354943.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":226.00000151742083,\\\"x\\\":576.0844149954746,\\\"h\\\":121.99999134059341,\\\"i\\\":\\\"b7038d3a-2f13-4991-8a6b-eee2677ff7a3\\\",\\\"y\\\":810.7655338021864,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"81.849664%\\\",\\\"left\\\":\\\"30.282601%\\\",\\\"width\\\":\\\"11.879974%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.316332999999997%\\\"},\\\"componentName\\\":\\\"滚动列表(单行)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 1,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12345\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 2,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A1236\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 3,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12311\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 4,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12377\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 5,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12895\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 6,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12822\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 7,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12811\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":226.0000015174208,\\\"height\\\":121.99999134059341},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"marginRight\\\":4,\\\"gridGap\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"marginRight\\\":0,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"name\\\":\\\"项目名称\\\",\\\"width\\\":84,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#4A90E2\\\"},\\\"key\\\":\\\"projectName\\\",\\\"marginLeft\\\":12}],\\\"itemsPerRow\\\":2,\\\"borderRadius\\\":7,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"marginRight\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"backgroundImg\\\":\\\"drag/lib/img/scrollList-bg-01.png\\\",\\\"isMultiline\\\":false,\\\"alternateBackgroundColor\\\":\\\"#F8F9FA00\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":11,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"color\\\",\\\"marginTop\\\":3,\\\"height\\\":29,\\\"marginLeft\\\":0},\\\"marginLeft\\\":4}}},{\\\"component\\\":\\\"JListProgress\\\",\\\"visible\\\":true,\\\"w\\\":508.99999146466575,\\\"x\\\":0,\\\"h\\\":230.9999948897365,\\\"i\\\":\\\"896fc5fc-bdf6-404a-8bc0-65a92a72d801\\\",\\\"y\\\":759.5545097716221,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"76.679729%\\\",\\\"left\\\":\\\"0%\\\",\\\"width\\\":\\\"26.756224%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"23.320271000000005%\\\"},\\\"componentName\\\":\\\"列表进度图\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"机扫车\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 200,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-12-31\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-06-15\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 52\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"洒水车\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 110,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-20\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-05-30\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 68\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"垃圾车\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 150,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2026-01-15\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-07-01\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 98\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":508.99999146466575,\\\"height\\\":230.9999948897365},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":1200,\\\"dataType\\\":1,\\\"h\\\":325,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"beginFields\\\":[{\\\"name\\\":\\\"车辆类型\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":19,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"title\\\"}],\\\"endCurrent\\\":0,\\\"endInfo\\\":{\\\"width\\\":103},\\\"scroll\\\":{\\\"count\\\":1,\\\"interval\\\":3000,\\\"enabled\\\":false,\\\"direction\\\":\\\"down\\\"},\\\"centerTopFields\\\":[{\\\"marginRight\\\":0,\\\"isUseExceedFillColor\\\":true,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"showPercentage\\\":true,\\\"name\\\":\\\"进度值\\\",\\\"width\\\":100,\\\"style\\\":{\\\"fontSize\\\":20,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#00D4FF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontColor\\\":\\\"#4A90E2\\\"},\\\"key\\\":\\\"value\\\"}],\\\"body\\\":{\\\"gradient\\\":{\\\"type\\\":\\\"linear\\\"}},\\\"endFields\\\":[{\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":24,\\\"fontColor\\\":\\\"#02DEFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"辆\\\",\\\"enabled\\\":true},\\\"name\\\":\\\"值\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#50E3C2\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"key\\\":\\\"value\\\"}],\\\"progressSection\\\":{\\\"marginRight\\\":5,\\\"marginLeft\\\":0},\\\"bar\\\":{\\\"border\\\":{\\\"padding\\\":8,\\\"color\\\":\\\"#4ECBFC5E\\\",\\\"width\\\":2,\\\"enabled\\\":false},\\\"total\\\":{\\\"field\\\":\\\"total\\\",\\\"type\\\":\\\"field\\\",\\\"value\\\":0},\\\"borderRadius\\\":6,\\\"background\\\":{\\\"color\\\":\\\"#5A97FC4C\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#07203D\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#143B6E\\\"}},\\\"indicatorColor\\\":\\\"#DCFEFFB5\\\",\\\"exceed\\\":{\\\"indicatorColor\\\":\\\"#F74B0C\\\",\\\"fill\\\":{\\\"color\\\":\\\"#FFB347\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FF4500\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFD700\\\",\\\"direction\\\":\\\"to right\\\"}},\\\"percent\\\":70,\\\"enabled\\\":true},\\\"indicatorSize\\\":15,\\\"fill\\\":{\\\"color\\\":\\\"#33C9FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#24E5F1\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#C5FDFE\\\"}},\\\"valueField\\\":\\\"value\\\",\\\"height\\\":4},\\\"centerTopInfo\\\":{\\\"layout\\\":\\\"horizontal\\\"},\\\"centerTopCurrent\\\":0,\\\"row\\\":{\\\"marginRight\\\":0,\\\"padding\\\":\\\"0 0\\\",\\\"marginBottom\\\":0,\\\"marginTop\\\":8,\\\"height\\\":38,\\\"marginLeft\\\":14},\\\"beginInfo\\\":{\\\"layout\\\":\\\"vertical\\\",\\\"width\\\":100}}}},{\\\"visible\\\":true,\\\"h\\\":39.0000029965315,\\\"i\\\":\\\"es-drager-1763022886545-18\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":194.00000534297763,\\\"x\\\":1692.3135351127542,\\\"y\\\":583.2930619922697,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"58.885509%\\\",\\\"left\\\":\\\"88.958587%\\\",\\\"width\\\":\\\"10.197853999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.937189%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"单位维修保养/加油统计\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":194.00000534297763,\\\"height\\\":39.0000029965315},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":59.00000173934264,\\\"i\\\":\\\"es-drager-1763022875670-17\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":221.00000687106677,\\\"x\\\":1658.2572768485109,\\\"y\\\":396.0363205335455,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"39.981275%\\\",\\\"left\\\":\\\"87.168377%\\\",\\\"width\\\":\\\"11.617143%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.95626%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"月度维修保养/加油统计\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":221.00000687106677,\\\"height\\\":59.000001739342636},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":58.999991833797594,\\\"i\\\":\\\"es-drager-1763022862487-16\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":152.00000085221566,\\\"x\\\":1696.2408644413595,\\\"y\\\":49.11954743833212,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"4.958792999999999%\\\",\\\"left\\\":\\\"89.165032%\\\",\\\"width\\\":\\\"7.990071%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.956259%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"车辆类型占比\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":152.00000085221566,\\\"height\\\":58.99999183379759},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":50.999996298891155,\\\"i\\\":\\\"es-drager-1763022854128-15\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":1630.5316006633993,\\\"y\\\":258.15824566602794,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"26.061993%\\\",\\\"left\\\":\\\"85.710942%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.148631%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"公务用车占比情况\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":50.999996298891155},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":34.99999532353323,\\\"i\\\":\\\"es-drager-1763022836670-14\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":23.999997130832348,\\\"x\\\":1315.267814130949,\\\"y\\\":843.1054841533569,\\\"angle\\\":0.15840966236248732,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0.15840966236248732deg)\\\",\\\"top\\\":\\\"85.114497%\\\",\\\"left\\\":\\\"69.138705%\\\",\\\"width\\\":\\\"1.26159%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.5333739999999993%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"加油频次排名\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":23.999997130832348,\\\"height\\\":34.99999532353323},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":43.999995253075504,\\\"i\\\":\\\"es-drager-1763022832978-13\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":151.000005727667,\\\"x\\\":1381.2350000239387,\\\"y\\\":260.81944958716105,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"26.330651%\\\",\\\"left\\\":\\\"72.606353%\\\",\\\"width\\\":\\\"7.937505%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.441956%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"作业车占比情况\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":151.000005727667,\\\"height\\\":43.999995253075504},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1763022817890-12\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":1071.16465923592,\\\"y\\\":743.3399645960995,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"75.042813%\\\",\\\"left\\\":\\\"56.307116%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"接打电话提醒车辆\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1763022815330-11\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":845.9243465916059,\\\"y\\\":740.9366812568901,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"74.800193%\\\",\\\"left\\\":\\\"44.467076%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"抽烟提醒车辆\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1763022811067-10\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":600.4260951996247,\\\"y\\\":741.065611831217,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"74.813209%\\\",\\\"left\\\":\\\"31.562151999999998%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"离线超24h车辆\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1763022781375-9\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":281.2349983621805,\\\"y\\\":696.622472209391,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"70.326516%\\\",\\\"left\\\":\\\"14.783471%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"异常车辆告警\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":16.999993211770217,\\\"x\\\":354.1266073685814,\\\"h\\\":46.0000139478922,\\\"i\\\":\\\"es-drager-1763022760154-8\\\",\\\"y\\\":655.3329213418754,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"66.158189%\\\",\\\"left\\\":\\\"18.61511%\\\",\\\"width\\\":\\\"0.8936259999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.643865%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":16.999993211770217,\\\"height\\\":46.0000139478922},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/车辆_03_1763551149225.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1763022745315-7\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":407.97590538011707,\\\"y\\\":48.498212219738235,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"4.8960669999999995%\\\",\\\"left\\\":\\\"21.445766%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"单位车辆统计\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1763022735003-6\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":310.4846940545368,\\\"y\\\":414.40677787182847,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"41.835838%\\\",\\\"left\\\":\\\"16.321018%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"作业车辆总数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1763022730046-5\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":181.46947631997648,\\\"y\\\":333.5040806749409,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"33.668423%\\\",\\\"left\\\":\\\"9.539171%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"车辆类型分布\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":1.0000141481594371,\\\"x\\\":1589.9882911213126,\\\"h\\\":118.99998806223101,\\\"i\\\":\\\"es-drager-1763022540256-4\\\",\\\"y\\\":269.2954065615573,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"27.186328999999997%\\\",\\\"left\\\":\\\"83.579732%\\\",\\\"width\\\":\\\"0.05256700000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.013472%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":1.0000141481594371,\\\"height\\\":118.99998806223101},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/按钮2-拷贝_04_1763551243662.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":144.00000180860488,\\\"x\\\":188.52286049090264,\\\"h\\\":26.999999788626795,\\\"i\\\":\\\"es-drager-1763022387955-2\\\",\\\"y\\\":377.0445378822139,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"38.063987%\\\",\\\"left\\\":\\\"9.909941%\\\",\\\"width\\\":\\\"7.569541%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.725746%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":144.00000180860488,\\\"height\\\":26.999999788626795},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/样式4_03_1763551206808.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1763022379005-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":53.59139492011721,\\\"y\\\":409.47125090244776,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"41.337579%\\\",\\\"left\\\":\\\"2.817099%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"公务用车\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":523.9999944273385,\\\"x\\\":0,\\\"h\\\":94.0000069684209,\\\"i\\\":\\\"0733c434-458b-4ffb-8b77-d924eb978688\\\",\\\"y\\\":397.43137787573045,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"40.122111%\\\",\\\"left\\\":\\\"0%\\\",\\\"width\\\":\\\"27.54471799999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.489635%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":523.9999944273385,\\\"height\\\":94.00000696842092},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/样式4_07_1763551173622.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1762513598535-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":566.4987789692847,\\\"y\\\":690.6787588651661,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"69.726477%\\\",\\\"left\\\":\\\"29.778719999999996%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"异常车辆告警\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":38.99999309098645,\\\"i\\\":\\\"es-drager-1762513583317-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JImg\\\",\\\"w\\\":720.0000090430243,\\\"x\\\":559.6597528446893,\\\"y\\\":703.371991737613,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"71.007904%\\\",\\\"left\\\":\\\"29.419218%\\\",\\\"width\\\":\\\"37.847705%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.937188%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":720.0000090430243,\\\"height\\\":38.99999309098645},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"e0162ae2-0026-4aa2-8823-29fdbe42f92d\\\"},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1756453828584-23\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":1309.960131603751,\\\"y\\\":0,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0%\\\",\\\"left\\\":\\\"68.8597%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"统计与异常告警\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":39.99999748562227,\\\"i\\\":\\\"es-drager-1756453836255-24\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JImg\\\",\\\"w\\\":549.9999818072682,\\\"x\\\":1292.0973225248063,\\\"y\\\":11.266111280946149,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.137354%\\\",\\\"left\\\":\\\"67.920719%\\\",\\\"width\\\":\\\"28.91144%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.038142%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":549.9999818072682,\\\"height\\\":39.99999748562227},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"e0162ae2-0026-4aa2-8823-29fdbe42f92d\\\"},{\\\"component\\\":\\\"JBar3d\\\",\\\"visible\\\":true,\\\"w\\\":527.999993949144,\\\"x\\\":12.266138880304801,\\\"h\\\":240.99999921391452,\\\"i\\\":\\\"e2ddc1ba-4820-4916-bb9a-384fce062348\\\",\\\"y\\\":88.13717239950154,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.897761%\\\",\\\"left\\\":\\\"0.6447849999999999%\\\",\\\"width\\\":\\\"27.754983%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"24.329807%\\\"},\\\"componentName\\\":\\\"3d柱形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":332,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"集团公司\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 290\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"建设集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 270\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"投资集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 450\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"新成集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 380\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"万众集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 320\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"海洋集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 320\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":527.999993949144,\\\"height\\\":240.99999921391452},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":490,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA57\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#4A90E23D\\\"},\\\"show\\\":true},\\\"name\\\":\\\"单位(辆)\\\",\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA57\\\"}},\\\"show\\\":true,\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":35,\\\"left\\\":0,\\\"bottom\\\":\\\"36\\\",\\\"right\\\":\\\"1\\\",\\\"containLabel\\\":true},\\\"series\\\":[{\\\"color\\\":\\\"#00DEFFCC\\\",\\\"id\\\":\\\"barTopColor\\\"},{\\\"color\\\":\\\"#187DCB00\\\",\\\"id\\\":\\\"barBottomColor\\\"},{\\\"color\\\":\\\"#115BA6\\\",\\\"id\\\":\\\"barColor\\\",\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":false}},{\\\"color\\\":\\\"#04113300\\\",\\\"id\\\":\\\"shadowColor\\\"},{\\\"color\\\":\\\"#142F5A00\\\",\\\"id\\\":\\\"shadowTopColor\\\"}],\\\"tooltip\\\":{\\\"show\\\":true},\\\"body\\\":{\\\"gradient\\\":{\\\"type\\\":\\\"linear\\\"}},\\\"graphic\\\":{\\\"children\\\":[{\\\"style\\\":{\\\"fill\\\":\\\"#3F486700\\\"}}]},\\\"extraInfo\\\":{\\\"endColor\\\":\\\"#39CEFFCC\\\",\\\"enabledGradient\\\":true,\\\"direction\\\":\\\"to top\\\",\\\"startColor\\\":\\\"#2D48AD19\\\"}}}},{\\\"component\\\":\\\"JGaoDeMap\\\",\\\"visible\\\":true,\\\"w\\\":756.0000047392731,\\\"x\\\":546.8147445117935,\\\"h\\\":499.9999982869137,\\\"i\\\":\\\"93d7dd28-4cba-4221-9f22-a4441b3176a2\\\",\\\"y\\\":158.48299534078043,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.999422%\\\",\\\"left\\\":\\\"28.744004%\\\",\\\"width\\\":\\\"39.74009000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"50.47677800000001%\\\"},\\\"componentName\\\":\\\"高德地图\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[{\\\\\\\"longitude\\\\\\\":116.391466,\\\\\\\"latitude\\\\\\\":39.907425,\\\\\\\"title\\\\\\\":\\\\\\\"湘B.8J1VS\\\\\\\",\\\\\\\"company\\\\\\\":\\\\\\\"小米集团\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"轿车\\\\\\\",\\\\\\\"status\\\\\\\":\\\\\\\"正常\\\\\\\",\\\\\\\"imgUrl\\\\\\\":\\\\\\\"drag/lib/img/car-normal.png\\\\\\\",\\\\\\\"time\\\\\\\":\\\\\\\"2025-08-08 10:00:00\\\\\\\"},{\\\\\\\"longitude\\\\\\\":116.382122,\\\\\\\"latitude\\\\\\\":39.913553,\\\\\\\"title\\\\\\\":\\\\\\\"鄂B.8J1VS\\\\\\\",\\\\\\\"company\\\\\\\":\\\\\\\"苹果集团\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"货车\\\\\\\",\\\\\\\"status\\\\\\\":\\\\\\\"异常\\\\\\\",\\\\\\\"imgUrl\\\\\\\":\\\\\\\"drag/lib/img/trucks-abnormal.png\\\\\\\",\\\\\\\"time\\\\\\\":\\\\\\\"2025-08-05 10:00:00\\\\\\\"},{\\\\\\\"longitude\\\\\\\":116.411722,\\\\\\\"latitude\\\\\\\":39.908215,\\\\\\\"title\\\\\\\":\\\\\\\"京B.8J1VS\\\\\\\",\\\\\\\"company\\\\\\\":\\\\\\\"香蕉集团\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"轿车\\\\\\\",\\\\\\\"status\\\\\\\":\\\\\\\"异常\\\\\\\",\\\\\\\"imgUrl\\\\\\\":\\\\\\\"drag/lib/img/car-abnormal.png\\\\\\\",\\\\\\\"time\\\\\\\":\\\\\\\"2025-08-05 10:00:00\\\\\\\"},{\\\\\\\"longitude\\\\\\\":116.40683,\\\\\\\"latitude\\\\\\\":39.909795,\\\\\\\"title\\\\\\\":\\\\\\\"沪B.8J1VS\\\\\\\",\\\\\\\"company\\\\\\\":\\\\\\\"香蕉集团\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"货车\\\\\\\",\\\\\\\"status\\\\\\\":\\\\\\\"正常\\\\\\\",\\\\\\\"imgUrl\\\\\\\":\\\\\\\"drag/lib/img/trucks-normal.png\\\\\\\",\\\\\\\"time\\\\\\\":\\\\\\\"2025-08-05 10:00:00\\\\\\\"}]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":756.0000047392731,\\\"height\\\":499.99999828691375},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":500,\\\"h\\\":500,\\\"timeOut\\\":0,\\\"option\\\":{\\\"gaoSecurityJsCode\\\":\\\"f908485801bab40e98ae972553d70f8d\\\",\\\"gaodeKey\\\":\\\"f599beada738982465764ddd0b1dae4e\\\",\\\"mapStyle\\\":\\\"darkblue\\\",\\\"marker\\\":{\\\"imgUrl\\\":\\\"drag/lib/img/car-normal.png\\\",\\\"offsetX\\\":-41,\\\"offsetY\\\":-60,\\\"imgField\\\":\\\"imgUrl\\\",\\\"width\\\":82,\\\"showImgField\\\":true,\\\"height\\\":120},\\\"infoWindow\\\":{\\\"titleTextAlign\\\":\\\"center\\\",\\\"padding\\\":0,\\\"titleLetterSpacing\\\":0,\\\"titleFontWeight\\\":\\\"bold\\\",\\\"titleField\\\":\\\"title\\\",\\\"contentLineHeight\\\":16,\\\"showContent\\\":true,\\\"bgImgUrl\\\":\\\"drag/lib/img/bg.png\\\",\\\"contentFieldMapping\\\":[{\\\"name\\\":\\\"公司\\\",\\\"key\\\":\\\"company\\\"},{\\\"name\\\":\\\"类型\\\",\\\"key\\\":\\\"type\\\"},{\\\"name\\\":\\\"状态\\\",\\\"key\\\":\\\"status\\\"},{\\\"name\\\":\\\"时间\\\",\\\"key\\\":\\\"time\\\"}],\\\"show\\\":true,\\\"contentFontSize\\\":11,\\\"contentColor\\\":\\\"#fff\\\",\\\"offsetX\\\":0,\\\"titleLineHeight\\\":23,\\\"contentPaddingTop\\\":8,\\\"offsetY\\\":-55,\\\"bgColor\\\":\\\"#000000\\\",\\\"titleColor\\\":\\\"#fff\\\",\\\"titleFontSize\\\":16,\\\"showTitle\\\":true,\\\"width\\\":224,\\\"contentPaddingLeft\\\":25,\\\"event\\\":\\\"hover\\\",\\\"height\\\":113}}}},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1756453224591-18\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":28.25791876766705,\\\"y\\\":2.669405712431711,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0.2694860000000002%\\\",\\\"left\\\":\\\"1.485413%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"单位与车辆分类概览\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":38.99999309098645,\\\"i\\\":\\\"es-drager-1756453227423-19\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JImg\\\",\\\"w\\\":584.9999823789683,\\\"x\\\":0,\\\"y\\\":14.201649272145232,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.4337070000000007%\\\",\\\"left\\\":\\\"0%\\\",\\\"width\\\":\\\"30.751259000000008%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.937188%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":584.9999823789683,\\\"height\\\":38.99999309098645},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"e0162ae2-0026-4aa2-8823-29fdbe42f92d\\\"},{\\\"component\\\":\\\"JMultipleLine\\\",\\\"visible\\\":true,\\\"w\\\":557.0000047499412,\\\"x\\\":1320.2056205936456,\\\"h\\\":161.00000424267,\\\"i\\\":\\\"62a2a0e8-6118-4798-826d-3fe1b7d357f0\\\",\\\"y\\\":425.2629580765655,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.931808%\\\",\\\"left\\\":\\\"69.398267%\\\",\\\"width\\\":\\\"29.279405000000004%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"16.253523%\\\"},\\\"componentName\\\":\\\"对比折线图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2000,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 1900,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4000,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3800,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 800,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 420,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 20,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 210,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 220,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 580,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 500,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 800,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":557.0000047499412,\\\"height\\\":161.00000424267},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"name\\\":\\\"单位(元)\\\",\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color1\\\":\\\"#1e90ff\\\",\\\"color\\\":\\\"#FE398B\\\"},{\\\"color1\\\":\\\"#90ee90\\\",\\\"color\\\":\\\"#7A53F0\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":35,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"areaStyleOpacity\\\":0.1,\\\"symbol\\\":\\\"circle\\\",\\\"symbolSize\\\":15,\\\"lineType\\\":\\\"area\\\",\\\"label\\\":{\\\"position\\\":\\\"top\\\"}}],\\\"legend\\\":{\\\"r\\\":48},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":483.00000408473613,\\\"x\\\":1357.151241934818,\\\"h\\\":136.0000033377698,\\\"i\\\":\\\"es-drager-1763022408549-3\\\",\\\"y\\\":260.5615091941472,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"26.304611%\\\",\\\"left\\\":\\\"71.34036000000002%\\\",\\\"width\\\":\\\"25.389502000000004%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"13.729684%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":483.00000408473613,\\\"height\\\":136.0000033377698},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/按钮2-拷贝_02_1763551275631.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":229.00000591467753,\\\"x\\\":563.4232127899882,\\\"h\\\":131.9999857592265,\\\"i\\\":\\\"4887df15-f532-4ef1-8a4e-6d84f34242fa\\\",\\\"y\\\":805.3962331096695,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"81.307614%\\\",\\\"left\\\":\\\"29.617049%\\\",\\\"width\\\":\\\"12.037673%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"13.325868%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":229.00000591467753,\\\"height\\\":131.9999857592265},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/组-155_02_1763554354943.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JSemiGauge\\\",\\\"visible\\\":true,\\\"w\\\":238.00000008283695,\\\"x\\\":259.42555098968336,\\\"h\\\":215.0000038199236,\\\"i\\\":\\\"es-drager-1763544356457-1\\\",\\\"y\\\":482.71159297288773,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"48.731452000000004%\\\",\\\"left\\\":\\\"13.637029999999998%\\\",\\\"width\\\":\\\"12.510769%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"21.705015000000003%\\\"},\\\"componentName\\\":\\\"半圆仪表盘\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataType\\\":1,\\\"h\\\":430,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"total\\\\\\\": 385,\\\\n    \\\\\\\"used\\\\\\\": 300\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":238.00000008283695,\\\"height\\\":215.0000038199236},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":500,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"titleSuffix\\\":\\\"辆\\\",\\\"customAttr\\\":{\\\"innerCircle\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":0,\\\"y2\\\":1,\\\"x2\\\":1,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#BD8D35\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#BD8D35\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":15}},\\\"name\\\":\\\"内部小圆\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"outerScale\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#FFBB38\\\",\\\"distance\\\":-52,\\\"show\\\":true,\\\"fontSize\\\":14},\\\"min\\\":0,\\\"max\\\":100,\\\"axisLine\\\":{\\\"show\\\":false},\\\"name\\\":\\\"外部刻度\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"splitNumber\\\":2,\\\"detail\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":67},\\\"innerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"animationDuration\\\":2000,\\\"pointer\\\":{\\\"show\\\":true,\\\"length\\\":74,\\\"width\\\":3,\\\"itemStyle\\\":{\\\"color\\\":\\\"#BD8D35\\\"}},\\\"data\\\":[{\\\"name\\\":\\\"去年优良率\\\",\\\"value\\\":44}],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#BD8D35\\\"],[1,\\\"#BD8D35\\\"]],\\\"width\\\":1}},\\\"name\\\":\\\"内部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"detail\\\":{\\\"offsetCenter\\\":[0,50],\\\"show\\\":false,\\\"textStyle\\\":{\\\"padding\\\":[0,0,0,0],\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":30,\\\"title\\\":{\\\"offsetCenter\\\":[0,26],\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"normal\\\"}}},\\\"outerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#BD8D35\\\"],[1,\\\"#BD8D35\\\"]],\\\"width\\\":2}},\\\"name\\\":\\\"外部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"basic\\\":{\\\"startAngle\\\":180,\\\"endAngle\\\":0},\\\"innerShadow\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"customGradient\\\":{\\\"endColor\\\":\\\"#BD8D35\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#BD8D3500\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":1,\\\"y2\\\":0,\\\"x2\\\":0,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#2de69600\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#2de696\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":100}},\\\"name\\\":\\\"内部阴影\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80}},\\\"valuePrefix\\\":\\\"已使用：\\\",\\\"titlePrefix\\\":\\\"车辆总数：\\\",\\\"valueMapping\\\":\\\"used\\\",\\\"titleMapping\\\":\\\"total\\\",\\\"valueSuffix\\\":\\\"辆\\\"}}}]},\\\"component\\\":\\\"JGroup\\\",\\\"w\\\":1902.3610785463065,\\\"x\\\":6,\\\"y\\\":69,\\\"componentName\\\":\\\"车辆\\\",\\\"pageCompId\\\":\\\"1151112776978583552\\\",\\\"equalProportion\\\":true,\\\"key\\\":\\\"7ea6e027-6c73-41e9-80ee-ab95267ce97a\\\",\\\"group\\\":true},{\\\"visible\\\":true,\\\"h\\\":1065,\\\"i\\\":\\\"es-drager-1756453564096-22\\\",\\\"props\\\":{\\\"elements\\\":[{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":339,\\\"x\\\":1653.2942555685815,\\\"h\\\":157,\\\"i\\\":\\\"es-drager-1763357806623-2\\\",\\\"y\\\":873.5580304806565,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"82.02422821414615%\\\",\\\"left\\\":\\\"75.60621250542819%\\\",\\\"width\\\":\\\"15.502688618805859%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"14.741784037558686%\\\"},\\\"componentName\\\":\\\"滚动列表(多行+序号)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"外刚性还本付息约\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 131.73\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"归还田迪投控本息合计\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 11.04\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"压降天保担保额度\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 36.81\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"压降隐性债务规模\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 24.64\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":339,\\\"height\\\":157},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"marginRight\\\":0,\\\"showIndex\\\":true,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"__system\\\":true,\\\"textAlign\\\":\\\"left\\\",\\\"name\\\":\\\"标题\\\",\\\"width\\\":233,\\\"textStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"title\\\",\\\"marginLeft\\\":14},{\\\"marginRight\\\":18,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#04FAFD\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginLeft\\\":0},\\\"suffixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\" 亿元\\\",\\\"enabled\\\":true},\\\"name\\\":\\\"金额\\\",\\\"width\\\":193,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"value\\\",\\\"marginLeft\\\":0}],\\\"borderRadius\\\":8,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"indexFieldStyle\\\":{\\\"width\\\":28,\\\"textStyle\\\":{\\\"fontSize\\\":21,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#F54100\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#D4BA28\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"marginLeft\\\":15},\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"backgroundColor\\\":\\\"#FFFFFF\\\",\\\"backgroundImg\\\":\\\"\\\",\\\"isMultiline\\\":true,\\\"alternateBackgroundColor\\\":\\\"#F8F9FA\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":10,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"image\\\",\\\"marginTop\\\":1,\\\"height\\\":41},\\\"marginLeft\\\":4}}},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":339,\\\"x\\\":1310.3048065650646,\\\"h\\\":157,\\\"i\\\":\\\"es-drager-1763357453690-1\\\",\\\"y\\\":869.8886283704572,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"81.6796834150664%\\\",\\\"left\\\":\\\"59.92108381092284%\\\",\\\"width\\\":\\\"15.502688618805859%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"14.741784037558686%\\\"},\\\"componentName\\\":\\\"滚动列表(多行+序号)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"实现资产盘活收入化债约\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 1.2\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"经营收入化债约\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.46\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"财政资金到位化解隐性债务\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6.61\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"再融资债券资金到位化解隐性债务\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 12.37\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"到期隐性债务偿还本息合计\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 36.99\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":339,\\\"height\\\":157},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"marginRight\\\":0,\\\"showIndex\\\":true,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"__system\\\":true,\\\"textAlign\\\":\\\"left\\\",\\\"name\\\":\\\"标题\\\",\\\"width\\\":233,\\\"textStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"title\\\",\\\"marginLeft\\\":14},{\\\"marginRight\\\":18,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontFamily\\\":\\\"\\\",\\\"fontSize\\\":18,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#04FAFD\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginLeft\\\":0},\\\"suffixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\" 亿元\\\",\\\"enabled\\\":true},\\\"name\\\":\\\"金额\\\",\\\"width\\\":193,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"value\\\",\\\"marginLeft\\\":0}],\\\"borderRadius\\\":8,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"indexFieldStyle\\\":{\\\"width\\\":28,\\\"textStyle\\\":{\\\"fontSize\\\":21,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#F54100\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#D4BA28\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"marginLeft\\\":15},\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"backgroundColor\\\":\\\"#FFFFFF\\\",\\\"backgroundImg\\\":\\\"\\\",\\\"isMultiline\\\":true,\\\"alternateBackgroundColor\\\":\\\"#F8F9FA\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":10,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"image\\\",\\\"marginTop\\\":1,\\\"height\\\":41},\\\"marginLeft\\\":4}}},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":451.99999999999994,\\\"x\\\":276.01406799531065,\\\"h\\\":157,\\\"i\\\":\\\"ec3ee79c-04b7-462a-89dd-b8b1e95104d8\\\",\\\"y\\\":457.2626025791325,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.9354556412331%\\\",\\\"left\\\":\\\"12.622301329030117%\\\",\\\"width\\\":\\\"20.670251491741144%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"14.741784037558686%\\\"},\\\"componentName\\\":\\\"滚动列表(多行+序号)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"保区创新创业园\\\\\\\",\\\\n    \\\\\\\"content\\\\\\\": \\\\\\\"按期完工\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"中蓝白领公寓\\\\\\\",\\\\n    \\\\\\\"content\\\\\\\": \\\\\\\"已建设完成，进行验收与运营准备\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"合成生物中心\\\\\\\",\\\\n    \\\\\\\"content\\\\\\\": \\\\\\\"竣工备案，确定运营方案，项目整体具备移交条件\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"中欧核心区综合服务中心\\\\\\\",\\\\n    \\\\\\\"content\\\\\\\": \\\\\\\"竣工验收\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"汀园一期二标项目\\\\\\\",\\\\n    \\\\\\\"content\\\\\\\": \\\\\\\"结构封顶\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":451.99999999999994,\\\"height\\\":157},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"marginRight\\\":0,\\\"showIndex\\\":true,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"__system\\\":true,\\\"textAlign\\\":\\\"left\\\",\\\"name\\\":\\\"标题\\\",\\\"width\\\":162,\\\"textStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"title\\\",\\\"marginLeft\\\":14},{\\\"marginRight\\\":18,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#D1D1D1\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginLeft\\\":0},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":true},\\\"name\\\":\\\"内容\\\",\\\"width\\\":257,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"content\\\",\\\"marginLeft\\\":0}],\\\"borderRadius\\\":8,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"indexFieldStyle\\\":{\\\"width\\\":28,\\\"textStyle\\\":{\\\"fontSize\\\":21,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#F54100\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#D4BA28\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"marginLeft\\\":15},\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"backgroundColor\\\":\\\"#FFFFFF\\\",\\\"backgroundImg\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题行-1_21_1763554527340.png\\\",\\\"isMultiline\\\":true,\\\"alternateBackgroundColor\\\":\\\"#F8F9FA\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":10,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"image\\\",\\\"marginTop\\\":1,\\\"height\\\":41},\\\"marginLeft\\\":4}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":665.0000038733882,\\\"x\\\":475.7444323786635,\\\"h\\\":58.9999989,\\\"i\\\":\\\"es-drager-1763042970956-9\\\",\\\"y\\\":960.5416156499999,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"90.191701%\\\",\\\"left\\\":\\\"21.756099697041183%\\\",\\\"width\\\":\\\"30.410879031132236%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.539906%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"成功谋划实施总投资113亿元的港口型国家粮食物流枢纽项目，启动建设总投资12亿元的40万吨粮食筒仓项目，并获取1.9亿元超长期特别国债资金支持\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":665.0000038733882,\\\"height\\\":58.9999989},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"textAlign\\\":\\\"left\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":665.0000038733882,\\\"x\\\":451.688168158851,\\\"h\\\":49.00000034999999,\\\"i\\\":\\\"es-drager-1763042965821-8\\\",\\\"y\\\":889.63892115,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"83.534171%\\\",\\\"left\\\":\\\"20.655991220547158%\\\",\\\"width\\\":\\\"30.410879031132236%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.6009389999999994%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"推动分布式光伏项目并网发电、氢能重卡扩量布局、50MW防波堤风电项目开工建设等工作，构建绿色新能源产业发展体系\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":665.0000038733882,\\\"height\\\":49.00000035},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"textAlign\\\":\\\"left\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":660.9999992373974,\\\"x\\\":398.5111289953106,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763042960045-7\\\",\\\"y\\\":812.4056217,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"76.282218%\\\",\\\"left\\\":\\\"18.22417092608577%\\\",\\\"width\\\":\\\"30.227956239552455%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"累计中标市场化项目14个，签约合同额超9100万元，展现出城市运营业务的品牌实力和市场竞争力\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":660.9999992373974,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"textAlign\\\":\\\"center\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":44.9999988,\\\"i\\\":\\\"es-drager-1763042876096-6\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":567.9999905685813,\\\"x\\\":250.33644724267296,\\\"y\\\":408.4407912,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"38.351248%\\\",\\\"left\\\":\\\"11.44804717268814%\\\",\\\"width\\\":\\\"25.97500586805127%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.225352%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"坚持以重点项目为抓手，加快建设进度，着力改善资产质量，提升经营发展后劲\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":567.9999905685813,\\\"height\\\":44.9999988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"4555e8cb-7e7b-4006-8039-984e9f9f66bd\\\"},{\\\"visible\\\":true,\\\"h\\\":44.9999988,\\\"i\\\":\\\"es-drager-1763042867476-5\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":440.0000091524032,\\\"x\\\":274.5216791377492,\\\"y\\\":319.94137929407975,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"30.041444065171806%\\\",\\\"left\\\":\\\"12.554053424142353%\\\",\\\"width\\\":\\\"20.121484171567655%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.225352%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"长三角项目7个，完成内资到位5000万元，新增税收收入3亿元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":440.0000091524032,\\\"height\\\":44.9999988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"4555e8cb-7e7b-4006-8039-984e9f9f66bd\\\"},{\\\"visible\\\":true,\\\"h\\\":44.9999988,\\\"i\\\":\\\"es-drager-1763042861732-4\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":482.99999117174673,\\\"x\\\":282.11840171512296,\\\"y\\\":283.2239145483587,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"26.59379479327312%\\\",\\\"left\\\":\\\"12.901456446680637%\\\",\\\"width\\\":\\\"22.087901079709642%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.225352%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"注册资本1亿元以上的大好项目2个，实体项目3个，京冀项目11个，\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":482.99999117174673,\\\"height\\\":44.9999988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"4555e8cb-7e7b-4006-8039-984e9f9f66bd\\\"},{\\\"visible\\\":true,\\\"h\\\":44.9999988,\\\"i\\\":\\\"es-drager-1763042856445-3\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":313.9999987538101,\\\"x\\\":320.1019879624853,\\\"y\\\":251.5709253381594,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"23.621683130343605%\\\",\\\"left\\\":\\\"14.638470341130239%\\\",\\\"width\\\":\\\"14.359422439485975%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.225352%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"招引项目公司18家\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":313.9999987538101,\\\"height\\\":44.9999988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"4555e8cb-7e7b-4006-8039-984e9f9f66bd\\\"},{\\\"visible\\\":true,\\\"h\\\":44.9999988,\\\"i\\\":\\\"es-drager-1763042838775-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":394.9999935146542,\\\"x\\\":271.9894450914419,\\\"y\\\":211.05509700000002,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"19.81738%\\\",\\\"left\\\":\\\"12.438252728184123%\\\",\\\"width\\\":\\\"18.06360443624784%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.225352%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"预计实现固投6.81亿元，固投指标完成率达103.81%\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":394.9999935146542,\\\"height\\\":44.9999988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"4555e8cb-7e7b-4006-8039-984e9f9f66bd\\\"},{\\\"visible\\\":true,\\\"h\\\":44.9999988,\\\"i\\\":\\\"es-drager-1763042831263-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":443.9999929214536,\\\"x\\\":284.77960655744425,\\\"y\\\":180.79717965,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"16.976261%\\\",\\\"left\\\":\\\"13.023155060312986%\\\",\\\"width\\\":\\\"20.304406008888794%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.225352%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"新增盘活面积4.92万平米，实现新增资产盘活收入4.25亿元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":443.9999929214536,\\\"height\\\":44.9999988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"4555e8cb-7e7b-4006-8039-984e9f9f66bd\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763042137685-3\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":400.00000452637744,\\\"x\\\":1500.7467639279014,\\\"y\\\":774.793677,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"72.75058%\\\",\\\"left\\\":\\\"68.63011733585486%\\\",\\\"width\\\":\\\"18.292258164287208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"建设开发一期工程5.6平方公里造路部分2个立项的决算工作。\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":400.00000452637744,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763042130020-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":456.999992338218,\\\"x\\\":1502.1418325375146,\\\"y\\\":748.3341141,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"70.266114%\\\",\\\"left\\\":\\\"68.69391472304278%\\\",\\\"width\\\":\\\"20.89890436582908%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"启动海阳经济区(北区)生活区域市政基础设施工程和新成集团1区工业区\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":456.999992338218,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":40.000004849999996,\\\"i\\\":\\\"es-drager-1763042123591-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":178.00000806565058,\\\"x\\\":1666.737377284291,\\\"y\\\":721.74561165,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"67.769541%\\\",\\\"left\\\":\\\"76.2209751308658%\\\",\\\"width\\\":\\\"8.14005515984281%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7558689999999997%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"启动2个立项的决算工作\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":178.00000806565058,\\\"height\\\":40.000004849999996},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041888225-9\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":99.00000518933179,\\\"x\\\":1886.9132275656505,\\\"y\\\":681.10082385,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.953129%\\\",\\\"left\\\":\\\"86.28975875414821%\\\",\\\"width\\\":\\\"4.527334081741519%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"决算总金额\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":99.0000051893318,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041884664-8\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":99.00000518933179,\\\"x\\\":1788.1559048909733,\\\"y\\\":679.8347092500001,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.834245%\\\",\\\"left\\\":\\\"81.77352270030615%\\\",\\\"width\\\":\\\"4.527334081741519%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"决算审核\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":99.0000051893318,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041880252-7\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":71.99999998007033,\\\"x\\\":1871.3329382022273,\\\"y\\\":652.8593292279601,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"61.301345467414095%\\\",\\\"left\\\":\\\"85.57726207393569%\\\",\\\"width\\\":\\\"3.292606431401352%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"14\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":71.99999998007033,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"fontFamily\\\":\\\"DIGITALDREAMFAT\\\",\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041872463-6\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":46.00000114654163,\\\"x\\\":1920.9695138089094,\\\"y\\\":653.1172353,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"61.325562%\\\",\\\"left\\\":\\\"87.84717468672096%\\\",\\\"width\\\":\\\"2.1036097175207886%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"亿元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":46.00000114654163,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43,\\\"i\\\":\\\"es-drager-1763041867629-5\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":42,\\\"x\\\":1814.6154563487687,\\\"y\\\":649.3188808499999,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"60.968909%\\\",\\\"left\\\":\\\"82.98353505205681%\\\",\\\"width\\\":\\\"1.9206870855157703%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558685446009%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":42,\\\"height\\\":43},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041862452-4\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":71.99999998007033,\\\"x\\\":1780.3012813640096,\\\"y\\\":649.1899256720399,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"60.956800532585895%\\\",\\\"left\\\":\\\"81.41432570102454%\\\",\\\"width\\\":\\\"3.292606431401352%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"5\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":71.99999998007033,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"fontFamily\\\":\\\"DIGITALDREAMFAT\\\",\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041848451-3\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":99.00000518933179,\\\"x\\\":1643.9472355287223,\\\"y\\\":682.4958993,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"64.084122%\\\",\\\"left\\\":\\\"75.17876725117546%\\\",\\\"width\\\":\\\"4.527334081741519%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"审核金额约\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":99.0000051893318,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041841952-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":46.00000114654163,\\\"x\\\":1685.600214823564,\\\"y\\\":655.778436,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"61.57544%\\\",\\\"left\\\":\\\"77.08358485605304%\\\",\\\"width\\\":\\\"2.1036097175207886%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"亿元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":46.00000114654163,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041833962-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":71.99999998007033,\\\"x\\\":1637.3587135990622,\\\"y\\\":654.38336055,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"61.444447000000004%\\\",\\\"left\\\":\\\"74.8774698944389%\\\",\\\"width\\\":\\\"3.292606431401352%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"33\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":71.99999998007033,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"fontFamily\\\":\\\"DIGITALDREAMFAT\\\",\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041616450-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":71.99999998007033,\\\"x\\\":1543.7948233774912,\\\"y\\\":655.778436,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"61.57544%\\\",\\\"left\\\":\\\"70.59873285588682%\\\",\\\"width\\\":\\\"3.292606431401352%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"146\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":71.99999998007033,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"fontFamily\\\":\\\"DIGITALDREAMFAT\\\",\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041602493-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":46.00000114654163,\\\"x\\\":1594.5685637579134,\\\"y\\\":657.17351145,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"61.706433%\\\",\\\"left\\\":\\\"72.9206487471251%\\\",\\\"width\\\":\\\"2.1036097175207886%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":46.00000114654163,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":400.00000452637744,\\\"x\\\":1633.5920373159436,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763039434020-6\\\",\\\"y\\\":289.10316405000003,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"27.145837%\\\",\\\"left\\\":\\\"74.70521735890784%\\\",\\\"width\\\":\\\"18.292258164287208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"完善员工考核评价机制，完善选人用人机制，推进企业人才\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":400.00000452637744,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":1,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":407.000007422626,\\\"x\\\":1565.3505526565066,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763039429945-5\\\",\\\"y\\\":236.05509870000003,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"22.164798%\\\",\\\"left\\\":\\\"71.58449025696014%\\\",\\\"width\\\":\\\"18.61237281098715%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"编制《集团改革深化提升行动方案》，进一步完善\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":407.0000074226259,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":1,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":325.0000062860492,\\\"x\\\":1547.7538337977724,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763039424189-4\\\",\\\"y\\\":181.74090809999998,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"17.064874%\\\",\\\"left\\\":\\\"70.7797809555453%\\\",\\\"width\\\":\\\"14.862459877765685%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"航海低空经济基地项目，获银行贷款10亿元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":325.00000628604914,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":1,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":362.9999981606096,\\\"x\\\":1503.0129020896836,\\\"h\\\":44.9999988,\\\"i\\\":\\\"es-drager-1756453093407-15\\\",\\\"y\\\":132.5638941,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.447314%\\\",\\\"left\\\":\\\"68.73374929541033%\\\",\\\"width\\\":\\\"16.600224012126933%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.225352%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"新评级主体“海阳发展集团”已具备AAA评级落地条件\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":362.99999816060955,\\\"height\\\":44.9999988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"horseLamp\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":1,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":395.9999998903869,\\\"x\\\":1478.4408071078544,\\\"h\\\":105.00000075,\\\"i\\\":\\\"es-drager-1763039350346-3\\\",\\\"y\\\":104.25790874999998,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.789475%\\\",\\\"left\\\":\\\"67.61005154551353%\\\",\\\"width\\\":\\\"18.10933537270744%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.859155%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":395.9999998903869,\\\"height\\\":105.00000075},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_53_1763550154234.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":395.9999998903869,\\\"x\\\":1516.553334390973,\\\"h\\\":105.00000075,\\\"i\\\":\\\"es-drager-1763039347418-2\\\",\\\"y\\\":153.76553070000003,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"14.438078%\\\",\\\"left\\\":\\\"69.35296199668146%\\\",\\\"width\\\":\\\"18.10933537270744%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.859155%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":395.9999998903869,\\\"height\\\":105.00000075},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_53_1763550154234.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":395.9999998903869,\\\"x\\\":1560.9964739953105,\\\"h\\\":105.00000075,\\\"i\\\":\\\"es-drager-1763039343497-1\\\",\\\"y\\\":207.07150710000002,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"19.443334%\\\",\\\"left\\\":\\\"71.38537543186779%\\\",\\\"width\\\":\\\"18.10933537270744%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.859155%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":395.9999998903869,\\\"height\\\":105.00000075},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_53_1763550154234.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":56.00000230304804,\\\"x\\\":1774.8417328223916,\\\"h\\\":28.0000002,\\\"i\\\":\\\"es-drager-1763039242410-2\\\",\\\"y\\\":489.28722029999994,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.94246199999999%\\\",\\\"left\\\":\\\"81.16465702539044%\\\",\\\"width\\\":\\\"2.560916219340899%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.629108%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":56.000002303048035,\\\"height\\\":28.000000200000002},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_42_1763550192876.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":86.00000577256742,\\\"x\\\":1769.7772638323565,\\\"h\\\":28.0000002,\\\"i\\\":\\\"es-drager-1763039228598-1\\\",\\\"y\\\":428.51347455,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"40.236007%\\\",\\\"left\\\":\\\"80.93305559243437%\\\",\\\"width\\\":\\\"3.932835724801236%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.629108%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":86.00000577256742,\\\"height\\\":28.000000200000002},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_42_1763550192876.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":112.99999011488859,\\\"x\\\":1772.4384455844076,\\\"h\\\":28.0000002,\\\"i\\\":\\\"es-drager-1763039126579-4\\\",\\\"y\\\":359.00585550000005,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"33.70947%\\\",\\\"left\\\":\\\"81.05475315013376%\\\",\\\"width\\\":\\\"5.167562420882767%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.629108%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":112.9999901148886,\\\"height\\\":28.000000200000002},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_42_1763550192876.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":395.9999998903869,\\\"x\\\":1597.8428996811256,\\\"h\\\":105.00000075,\\\"i\\\":\\\"es-drager-1763039122726-3\\\",\\\"y\\\":260.3774835,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.44859%\\\",\\\"left\\\":\\\"73.07038624049068%\\\",\\\"width\\\":\\\"18.10933537270744%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.859155%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":395.9999998903869,\\\"height\\\":105.00000075},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_53_1763550154234.png\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":57.00000345,\\\"i\\\":\\\"es-drager-1763039115053-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":175.00000980539266,\\\"x\\\":1587.2297652203986,\\\"y\\\":482.7069261,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.324594%\\\",\\\"left\\\":\\\"72.58504075726304%\\\",\\\"width\\\":\\\"8.00286330472264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.352113%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"开展供应链公司业务部负责人“揭榜挂帅”公开竞聘\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":175.00000980539266,\\\"height\\\":57.00000345},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763038916108-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":99.00000518933179,\\\"x\\\":1546.5849930087923,\\\"y\\\":681.3587349000001,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.977346000000004%\\\",\\\"left\\\":\\\"70.72632911248775%\\\",\\\"width\\\":\\\"4.527334081741519%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"结算审核\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":99.0000051893318,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763038893302-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":593.0000038933175,\\\"x\\\":1478.34348369871,\\\"y\\\":619.4478354,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"58.164116%\\\",\\\"left\\\":\\\"67.60560088325013%\\\",\\\"width\\\":\\\"27.11827259973087%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"坚持问题导向，瞄准债务症结，持续推动土地开发成本决算，为存量债务化解探索可行路径\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":593.0000038933176,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":124.68426635052752,\\\"x\\\":375.1957872215708,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1763038751694-10\\\",\\\"y\\\":952.2192264,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"89.410256%\\\",\\\"left\\\":\\\"17.15794531086652%\\\",\\\"width\\\":\\\"5.701891908249208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"建设集团\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":124.68426635052754,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":124.68426635052752,\\\"x\\\":353.67174706330593,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1763038747182-9\\\",\\\"y\\\":876.2520521999999,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"82.277188%\\\",\\\"left\\\":\\\"16.17363707372123%\\\",\\\"width\\\":\\\"5.701891908249208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"海洋集团\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":124.68426635052754,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":124.68426635052752,\\\"x\\\":323.28487052227433,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1763038741952-8\\\",\\\"y\\\":806.6154723,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"75.738542%\\\",\\\"left\\\":\\\"14.784025613208815%\\\",\\\"width\\\":\\\"5.701891908249208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"投资集团\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":124.68426635052754,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":124.68426635052752,\\\"x\\\":295.43023890973035,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1763038737302-7\\\",\\\"y\\\":740.7772575,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"69.55655%\\\",\\\"left\\\":\\\"13.510215346303756%\\\",\\\"width\\\":\\\"5.701891908249208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万众集团\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":124.68426635052754,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":124.68426635052752,\\\"x\\\":265.17234092614297,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1763038700270-6\\\",\\\"y\\\":683.93082705,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"64.218857%\\\",\\\"left\\\":\\\"12.12650215840066%\\\",\\\"width\\\":\\\"5.701891908249208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"新成集团\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":124.68426635052754,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":47.00000752227431,\\\"x\\\":327.1512432731535,\\\"h\\\":36.99999569999999,\\\"i\\\":\\\"es-drager-1763038660630-5\\\",\\\"y\\\":954.7033921500001,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"89.643511%\\\",\\\"left\\\":\\\"14.960837332504143%\\\",\\\"width\\\":\\\"2.1493406539803885%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.4741779999999993%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":47.00000752227431,\\\"height\\\":36.99999569999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_11_1763550014908.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":47.00000752227431,\\\"x\\\":300.5627341248534,\\\"h\\\":36.99999569999999,\\\"i\\\":\\\"es-drager-1763038655573-4\\\",\\\"y\\\":888.86517735,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"83.461519%\\\",\\\"left\\\":\\\"13.744927662402764%\\\",\\\"width\\\":\\\"2.1493406539803885%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.4741779999999993%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":47.00000752227431,\\\"height\\\":36.99999569999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_11_1763550014908.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":47.00000752227431,\\\"x\\\":276.506469905041,\\\"h\\\":36.99999569999999,\\\"i\\\":\\\"es-drager-1763038650929-3\\\",\\\"y\\\":823.02696255,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"77.279527%\\\",\\\"left\\\":\\\"12.644819185908743%\\\",\\\"width\\\":\\\"2.1493406539803885%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.4741779999999993%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":47.00000752227431,\\\"height\\\":36.99999569999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_11_1763550014908.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":47.00000752227431,\\\"x\\\":256.24855221102,\\\"h\\\":36.99999569999999,\\\"i\\\":\\\"es-drager-1763038646390-2\\\",\\\"y\\\":753.39038265,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"70.740881%\\\",\\\"left\\\":\\\"11.718411545567136%\\\",\\\"width\\\":\\\"2.1493406539803885%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.4741779999999993%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":47.00000752227431,\\\"height\\\":36.99999569999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_11_1763550014908.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":47.00000752227431,\\\"x\\\":237.25675698124275,\\\"h\\\":36.99999569999999,\\\"i\\\":\\\"es-drager-1763038641612-1\\\",\\\"y\\\":698.94724185,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"65.628849%\\\",\\\"left\\\":\\\"10.849904502029203%\\\",\\\"width\\\":\\\"2.1493406539803885%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.4741779999999993%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":47.00000752227431,\\\"height\\\":36.99999569999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_11_1763550014908.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":322,\\\"x\\\":1559.964839345252,\\\"h\\\":169,\\\"i\\\":\\\"es-drager-1763038468350-11\\\",\\\"y\\\":860.6236798322392,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"80.80973519551542%\\\",\\\"left\\\":\\\"71.3381981140264%\\\",\\\"width\\\":\\\"14.725267655620906%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"15.868544600938966%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":322,\\\"height\\\":169},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_37_1763549942040.png\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1763038388788-10\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":173.74037695955448,\\\"x\\\":1796.92848376143,\\\"y\\\":809.8487640279601,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"76.0421374674141%\\\",\\\"left\\\":\\\"82.17469838942888%\\\",\\\"width\\\":\\\"7.9452594823537614%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"全口径化债\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":173.74037695955448,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"25ca1904-5d69-45c5-86bd-b235d3ac9f2a\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":217,\\\"x\\\":1276.483013909144,\\\"h\\\":188,\\\"i\\\":\\\"es-drager-1763038374225-9\\\",\\\"y\\\":853.1559168483586,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"80.10853679327312%\\\",\\\"left\\\":\\\"58.37439142132238%\\\",\\\"width\\\":\\\"9.92354994183148%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"17.652582159624412%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":217.00000000000003,\\\"height\\\":187.99999999999997},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_37_1763549942040.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":527.0000004337631,\\\"x\\\":1484.2555886670573,\\\"h\\\":85.99999605000001,\\\"i\\\":\\\"es-drager-1763038372052-8\\\",\\\"y\\\":707.6811257999999,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"66.448932%\\\",\\\"left\\\":\\\"67.87596525612915%\\\",\\\"width\\\":\\\"24.100049878569862%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"8.075117%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":527.0000004337631,\\\"height\\\":85.99999605000001},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_33_1763550324778.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":409,\\\"x\\\":225.73272507796014,\\\"h\\\":152,\\\"i\\\":\\\"es-drager-1763038238876-6\\\",\\\"y\\\":446.86048514999993,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"41.95873099999999%\\\",\\\"left\\\":\\\"10.322903091321901%\\\",\\\"width\\\":\\\"18.70383376133214%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"14.272300469483568%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":409,\\\"height\\\":152},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_30_1763550061880.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":181.00000632590854,\\\"x\\\":1833.833553545135,\\\"h\\\":256.99999575,\\\"i\\\":\\\"es-drager-1763038235098-5\\\",\\\"y\\\":320.37748545,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"30.082393000000003%\\\",\\\"left\\\":\\\"83.86239103046746%\\\",\\\"width\\\":\\\"8.277247014962983%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"24.131455%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":181.00000632590854,\\\"height\\\":256.99999575},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_49_1763549897591.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":355.9999952643611,\\\"x\\\":384.2555866529894,\\\"h\\\":63.00000044999999,\\\"i\\\":\\\"es-drager-1763038220734-4\\\",\\\"y\\\":949.7678732999999,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"89.180082%\\\",\\\"left\\\":\\\"17.572255781468634%\\\",\\\"width\\\":\\\"16.28010936542699%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.915492999999999%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":355.9999952643611,\\\"height\\\":63.00000044999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_25_1763550350084.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":355.9999952643611,\\\"x\\\":366.529913887456,\\\"h\\\":63.00000044999999,\\\"i\\\":\\\"es-drager-1763038208032-3\\\",\\\"y\\\":873.8006991000001,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"82.047014%\\\",\\\"left\\\":\\\"16.761649334734386%\\\",\\\"width\\\":\\\"16.28010936542699%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.915492999999999%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":355.9999952643611,\\\"height\\\":63.00000044999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_25_1763550350084.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":355.9999952643611,\\\"x\\\":334.87691488218053,\\\"h\\\":63.00000044999999,\\\"i\\\":\\\"es-drager-1763038199346-2\\\",\\\"y\\\":805.4302444499999,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"75.627253%\\\",\\\"left\\\":\\\"15.314137277418286%\\\",\\\"width\\\":\\\"16.28010936542699%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.915492999999999%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":355.9999952643611,\\\"height\\\":63.00000044999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_25_1763550350084.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JOrbitRing\\\",\\\"visible\\\":true,\\\"w\\\":538.9999934747948,\\\"x\\\":886.7444235703398,\\\"h\\\":134.99999640000004,\\\"i\\\":\\\"5c18670b-4206-42f4-8884-1592d70ec919\\\",\\\"y\\\":435.73857300000003,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"40.91442%\\\",\\\"left\\\":\\\"40.551394345349465%\\\",\\\"width\\\":\\\"24.648817299050542%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.676056000000004%\\\"},\\\"componentName\\\":\\\"轨道环形文字\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"经营发展\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 1\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"全口径化债\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"土地成本决算\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"创新赋能\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"重点项目\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"培育增量\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":538.9999934747948,\\\"height\\\":134.99999640000004},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"id(唯一标识)\\\"},{\\\"mapping\\\":\\\"imgSrc\\\",\\\"filed\\\":\\\"图片地址\\\"}],\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":750,\\\"dataType\\\":1,\\\"h\\\":540,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"sharedSpeed\\\":1,\\\"color\\\":\\\"#ffffff\\\",\\\"showOrbit\\\":true,\\\"planetHeight\\\":80,\\\"letterSpacing\\\":0,\\\"tilt\\\":0.55,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0066cc\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#ffffff\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"orbitRadius\\\":290,\\\"sun\\\":{\\\"repeat\\\":\\\"no-repeat\\\",\\\"width\\\":300,\\\"bgImg\\\":\\\"\\\",\\\"position\\\":\\\"center\\\",\\\"height\\\":300},\\\"sharedDepth\\\":10,\\\"planetWidth\\\":80,\\\"imgTextMode\\\":true,\\\"showType\\\":\\\"1\\\",\\\"fontSize\\\":14,\\\"items\\\":[{\\\"bgColor\\\":\\\"#31AEFD00\\\",\\\"name\\\":\\\"经营发展\\\",\\\"bgImg\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/jyfz_1763550629518.png\\\",\\\"value\\\":1},{\\\"bgColor\\\":\\\"#409EFF00\\\",\\\"name\\\":\\\"全口径化债\\\",\\\"bgImg\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/系统入口页_05_1763550642627.png\\\",\\\"value\\\":2},{\\\"bgColor\\\":\\\"#E6A23C00\\\",\\\"name\\\":\\\"土地成本决算\\\",\\\"bgImg\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/系统入口页_11_1763550652200.png\\\",\\\"value\\\":3},{\\\"bgColor\\\":\\\"#F56C6C00\\\",\\\"name\\\":\\\"创新赋能\\\",\\\"bgImg\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/系统入口页_13_1763550665155.png\\\",\\\"value\\\":4},{\\\"bgColor\\\":\\\"#67C23A00\\\",\\\"name\\\":\\\"重点项目\\\",\\\"bgImg\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/系统入口页_07_1763550686864.png\\\",\\\"value\\\":5},{\\\"bgColor\\\":\\\"#90939900\\\",\\\"name\\\":\\\"培育增量\\\",\\\"bgImg\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/系统入口页_09_1763550696802.png\\\",\\\"value\\\":6}],\\\"fontWeight\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":1}}},{\\\"visible\\\":true,\\\"h\\\":44.9999988,\\\"i\\\":\\\"es-drager-1763036807357-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":417.0000085791326,\\\"x\\\":939.2344604613129,\\\"y\\\":132.55568295,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.446543%\\\",\\\"left\\\":\\\"42.951797582843234%\\\",\\\"width\\\":\\\"19.06967931280727%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.225352%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"服务产业发展，构筑美好生活\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":417.00000857913255,\\\"height\\\":44.9999988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#00FFDE\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":28,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"4555e8cb-7e7b-4006-8039-984e9f9f66bd\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":507.0000189876905,\\\"x\\\":901.3481934109026,\\\"h\\\":177.9999997500001,\\\"i\\\":\\\"es-drager-1763036557092-11\\\",\\\"y\\\":64.0000035,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.009390000000001%\\\",\\\"left\\\":\\\"41.219234158030744%\\\",\\\"width\\\":\\\"23.18543782918827%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"16.713615000000008%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":507.0000189876905,\\\"height\\\":177.99999975000006},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_46_1763550136221.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":502.00000797596726,\\\"x\\\":894.7596865756153,\\\"h\\\":361.0000041,\\\"i\\\":\\\"es-drager-1763036542751-10\\\",\\\"y\\\":167.56389435,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.733699000000001%\\\",\\\"left\\\":\\\"40.91793749156958%\\\",\\\"width\\\":\\\"22.9567841011489%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"33.896714%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":502.0000079759672,\\\"height\\\":361.00000410000007},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":2500,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/控股业务综合监管版本6改_01_03_1763550233848.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":486.99999580773743,\\\"x\\\":886.0258078833527,\\\"h\\\":250.99999874999997,\\\"i\\\":\\\"es-drager-1763036539797-9\\\",\\\"y\\\":204.41031705,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"19.193457%\\\",\\\"left\\\":\\\"40.51853158655315%\\\",\\\"width\\\":\\\"22.270823871289416%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"23.568074999999997%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":486.99999580773743,\\\"height\\\":250.99999874999997},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":2500,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/系统入口页_03_1763550411407.png\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1763036485878-7\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":173.74037695955448,\\\"x\\\":1826.178203524619,\\\"y\\\":565.6166436,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"53.109544%\\\",\\\"left\\\":\\\"83.51230693714584%\\\",\\\"width\\\":\\\"7.9452594823537614%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"土地成本决算\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":173.74037695955448,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"25ca1904-5d69-45c5-86bd-b235d3ac9f2a\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":124.68426635052752,\\\"x\\\":289.3575628364595,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1763036478147-6\\\",\\\"y\\\":609.3587282999999,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"57.216782%\\\",\\\"left\\\":\\\"13.232507953245376%\\\",\\\"width\\\":\\\"5.701891908249208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"培育增量\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":124.68426635052754,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":124.68426635052752,\\\"x\\\":295.81711198124265,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1763036469399-5\\\",\\\"y\\\":360.06213314999997,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"33.808651%\\\",\\\"left\\\":\\\"13.527907301355837%\\\",\\\"width\\\":\\\"5.701891908249208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"重点项目\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":124.68426635052754,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":44.00000926201641,\\\"x\\\":327.92498941617816,\\\"h\\\":29.000003249999995,\\\"i\\\":\\\"es-drager-1763033026815-2\\\",\\\"y\\\":131.23329375,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.322375000000001%\\\",\\\"left\\\":\\\"14.99622124260831%\\\",\\\"width\\\":\\\"2.012148798860219%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.7230049999999997%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":44.00000926201641,\\\"height\\\":29.000003249999995},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_14_1763550425365.png\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":43.9623054,\\\"i\\\":\\\"es-drager-1756453034262-13\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":173.74037695955448,\\\"x\\\":1626.6084358347014,\\\"y\\\":418.26377610000003,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"39.273594%\\\",\\\"left\\\":\\\"74.38585275949329%\\\",\\\"width\\\":\\\"7.9452594823537614%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.127916%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"交流轮岗16人\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":173.74037695955448,\\\"height\\\":43.962305400000005},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":44.9999988,\\\"i\\\":\\\"es-drager-1756452592342-9\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":313.9999987538101,\\\"x\\\":369.7385606828839,\\\"y\\\":123.95075985,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"11.638569%\\\",\\\"left\\\":\\\"16.908382821923905%\\\",\\\"width\\\":\\\"14.359422439485975%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.225352%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"营业收88亿元   占全年目标80%，同比↑33%\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":313.9999987538101,\\\"height\\\":44.9999988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"4555e8cb-7e7b-4006-8039-984e9f9f66bd\\\"},{\\\"visible\\\":true,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1756451958689-3\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":173.74037695955448,\\\"x\\\":1781.9929530902693,\\\"y\\\":61.8300021,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"5.805634%\\\",\\\"left\\\":\\\"81.49168694001405%\\\",\\\"width\\\":\\\"7.9452594823537614%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"创新赋能\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":173.74037695955448,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"25ca1904-5d69-45c5-86bd-b235d3ac9f2a\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":173.74037695955448,\\\"x\\\":1605.4161800257914,\\\"h\\\":43.9623054,\\\"i\\\":\\\"es-drager-1756453142151-16\\\",\\\"y\\\":348.89330775,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"32.759935%\\\",\\\"left\\\":\\\"73.41671723460948%\\\",\\\"width\\\":\\\"7.9452594823537614%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.127916%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"各级人员外部引进10人\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":173.74037695955448,\\\"height\\\":43.962305400000005},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":59.00000056330598,\\\"x\\\":1738.5111378985932,\\\"h\\\":64.0000035,\\\"i\\\":\\\"3a8b52fe-94c4-4df7-85d7-f31fbecb03d3\\\",\\\"y\\\":655.53575445,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"61.552653%\\\",\\\"left\\\":\\\"79.50323549017034%\\\",\\\"width\\\":\\\"2.6981080744610706%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.009390000000001%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":59.00000056330598,\\\"height\\\":64.0000035},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_03 2_1763550452700.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":537.0000015902696,\\\"x\\\":386.8511210111371,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1756452586319-8\\\",\\\"y\\\":749.0914356000001,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"70.337224%\\\",\\\"left\\\":\\\"17.69095124150927%\\\",\\\"width\\\":\\\"24.557356380389972%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"居然公寓品牌获新区国资委市场化品牌公寓运营整合主体认定，不断壮大品牌影响力\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":537.0000015902696,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":404.9999946711606,\\\"x\\\":353.05978230773735,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1756452491126-7\\\",\\\"y\\\":692.2532163000001,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"65.000302%\\\",\\\"left\\\":\\\"16.14565153079715%\\\",\\\"width\\\":\\\"18.52091093806795%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"累计实现营业收入117.54亿元，成为市场化转型发展先锋军\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":404.9999946711606,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":124.68426635052752,\\\"x\\\":352.92145536107853,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1756452434656-5\\\",\\\"y\\\":58.8546264,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"5.526256%\\\",\\\"left\\\":\\\"16.13932575032033%\\\",\\\"width\\\":\\\"5.701891908249208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"经营发展\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":124.68426635052754,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":411.8668873558031,\\\"x\\\":263.7385734642438,\\\"h\\\":108.90662310000002,\\\"i\\\":\\\"a8467ed7-7901-42c0-8679-67cacde2fef7\\\",\\\"y\\\":28.790145000000003,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"2.7033%\\\",\\\"left\\\":\\\"12.060935047741077%\\\",\\\"width\\\":\\\"18.834938368949274%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.225974%\\\"},\\\"componentName\\\":\\\"icon24\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":411.86688735580316,\\\"height\\\":108.9066231},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/1-拷贝-7_03_1763549755584.png\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"816e4f26-b5e1-4d4c-a7c5-6511c1db6220\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":411.8668873558031,\\\"x\\\":209.0375173223916,\\\"h\\\":108.90662310000002,\\\"i\\\":\\\"es-drager-1763031897224-3\\\",\\\"y\\\":329.86869090000005,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"30.973586000000005%\\\",\\\"left\\\":\\\"9.559420474033253%\\\",\\\"width\\\":\\\"18.834938368949274%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.225974%\\\"},\\\"componentName\\\":\\\"icon24\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":411.86688735580316,\\\"height\\\":108.9066231},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/1-拷贝-7_01_1763549812452.png\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"816e4f26-b5e1-4d4c-a7c5-6511c1db6220\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":411.8668873558031,\\\"x\\\":198.90857934232127,\\\"h\\\":108.90662310000002,\\\"i\\\":\\\"es-drager-1763031894764-2\\\",\\\"y\\\":579.2942575500001,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"54.39382700000001%\\\",\\\"left\\\":\\\"9.09621760812108%\\\",\\\"width\\\":\\\"18.834938368949274%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.225974%\\\"},\\\"componentName\\\":\\\"icon24\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":411.86688735580316,\\\"height\\\":108.9066231},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/1-拷贝-7_02_1763549852904.png\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"816e4f26-b5e1-4d4c-a7c5-6511c1db6220\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":411.8668873558031,\\\"x\\\":1641.0187553710434,\\\"h\\\":108.90662310000002,\\\"i\\\":\\\"es-drager-1763031912767-5\\\",\\\"y\\\":778.0750165500001,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"73.058687%\\\",\\\"left\\\":\\\"75.04484596500777%\\\",\\\"width\\\":\\\"18.834938368949274%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.225974%\\\"},\\\"componentName\\\":\\\"icon24\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":411.86688735580316,\\\"height\\\":108.9066231},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/1-拷贝-7_06 拷贝_1763549891576.png\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"816e4f26-b5e1-4d4c-a7c5-6511c1db6220\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":411.8668873558031,\\\"x\\\":1677.8651948253225,\\\"h\\\":108.90662310000002,\\\"i\\\":\\\"es-drager-1763031876182-1\\\",\\\"y\\\":536.37514095,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.363862999999995%\\\",\\\"left\\\":\\\"76.7298574032714%\\\",\\\"width\\\":\\\"18.834938368949274%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.225974%\\\"},\\\"componentName\\\":\\\"icon24\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":411.86688735580316,\\\"height\\\":108.9066231},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/1-拷贝-7_05 拷贝_1763549879336.png\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"816e4f26-b5e1-4d4c-a7c5-6511c1db6220\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":411.8668873558031,\\\"x\\\":1616.9624966893314,\\\"h\\\":108.90662310000002,\\\"i\\\":\\\"es-drager-1763031899241-4\\\",\\\"y\\\":33.59671365,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"3.1546209999999997%\\\",\\\"left\\\":\\\"73.94473774177465%\\\",\\\"width\\\":\\\"18.834938368949274%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.225974%\\\"},\\\"componentName\\\":\\\"icon24\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":411.86688735580316,\\\"height\\\":108.9066231},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/1-拷贝-7_04_1763549870157.png\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"816e4f26-b5e1-4d4c-a7c5-6511c1db6220\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":566.999984192849,\\\"x\\\":288.6752764923798,\\\"h\\\":92.99999609999999,\\\"i\\\":\\\"es-drager-1763033021068-1\\\",\\\"y\\\":109.70926035000002,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"10.301339000000002%\\\",\\\"left\\\":\\\"13.201306558728765%\\\",\\\"width\\\":\\\"25.92927493159169%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"8.732394%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":566.999984192849,\\\"height\\\":92.99999609999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_19_1763549796825.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":708.0000067596717,\\\"x\\\":250.69168603282534,\\\"h\\\":360.00000105,\\\"i\\\":\\\"es-drager-1763033033328-3\\\",\\\"y\\\":28.67760645,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"2.692733%\\\",\\\"left\\\":\\\"11.4642924716529%\\\",\\\"width\\\":\\\"32.377296893532844%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"33.802817%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":708.0000067596717,\\\"height\\\":360.00000105},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_01_1763550492678.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":839.9999928118405,\\\"x\\\":734.2204008493551,\\\"h\\\":668.9999956500001,\\\"i\\\":\\\"es-drager-1763036537556-8\\\",\\\"y\\\":141.23329230000002,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"13.261342%\\\",\\\"left\\\":\\\"33.57637242460877%\\\",\\\"width\\\":\\\"38.41374138159623%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"62.816901%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":839.9999928118405,\\\"height\\\":668.9999956500001},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/系统入口页_04_03_1763550531200.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":659.999992861665,\\\"x\\\":1379.2966113616646,\\\"h\\\":671.0000017500001,\\\"i\\\":\\\"es-drager-1763038369685-7\\\",\\\"y\\\":22.83938295,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"2.144543%\\\",\\\"left\\\":\\\"63.07612353661938%\\\",\\\"width\\\":\\\"30.18222530309287%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"63.00469500000001%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":659.999992861665,\\\"height\\\":671.0000017500001},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_03_1763550548877.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":731.0000073329425,\\\"x\\\":1353.0949544179368,\\\"h\\\":270.00000345,\\\"i\\\":\\\"es-drager-1763039541856-9\\\",\\\"y\\\":543.60140025,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"51.042385%\\\",\\\"left\\\":\\\"61.87790486731145%\\\",\\\"width\\\":\\\"33.429101752293235%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"25.352113%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":731.0000073329423,\\\"height\\\":270.00000345},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_06_1763550562377.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":983,\\\"x\\\":0,\\\"h\\\":304,\\\"i\\\":\\\"es-drager-1763039119090-2\\\",\\\"y\\\":305.95779117995306,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"28.728431096709205%\\\",\\\"left\\\":\\\"0%\\\",\\\"width\\\":\\\"44.95322393004767%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"28.544600938967136%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":983,\\\"height\\\":304},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_04_1763550080999.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":355.9999952643611,\\\"x\\\":278.0304868833528,\\\"h\\\":63.00000044999999,\\\"i\\\":\\\"es-drager-1763036995887-1\\\",\\\"y\\\":680.21335935,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.86979900000001%\\\",\\\"left\\\":\\\"12.714513465155179%\\\",\\\"width\\\":\\\"16.28010936542699%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.915492999999999%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":355.9999952643611,\\\"height\\\":63.00000044999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_25_1763550350084.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":355.9999952643611,\\\"x\\\":307.02228326963655,\\\"h\\\":63.00000044999999,\\\"i\\\":\\\"es-drager-1763038194851-1\\\",\\\"y\\\":737.0597898000001,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"69.207492%\\\",\\\"left\\\":\\\"14.040327010513224%\\\",\\\"width\\\":\\\"16.28010936542699%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.915492999999999%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":355.9999952643611,\\\"height\\\":63.00000044999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_25_1763550350084.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":1049.9999962315355,\\\"x\\\":1136.7174715293083,\\\"h\\\":194.99999835,\\\"i\\\":\\\"es-drager-1763039539776-8\\\",\\\"y\\\":857.7280172999999,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"80.537842%\\\",\\\"left\\\":\\\"51.98282303444006%\\\",\\\"width\\\":\\\"48.01717696555994%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"18.309859%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1049.9999962315353,\\\"height\\\":194.99999835},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_10_1763549923063.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":992.0000020439625,\\\"x\\\":226.2485278745604,\\\"h\\\":368.99999655000005,\\\"i\\\":\\\"es-drager-1763043471607-10\\\",\\\"y\\\":684.14067465,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"64.238561%\\\",\\\"left\\\":\\\"10.346491085848166%\\\",\\\"width\\\":\\\"45.364799827558485%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"34.647887000000004%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":992.0000020439625,\\\"height\\\":368.99999655000005},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_07_1763549998727.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":2057.9999959525203,\\\"x\\\":111.87924914302464,\\\"h\\\":1065,\\\"i\\\":\\\"es-drager-1756452975290-11\\\",\\\"y\\\":0,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0%\\\",\\\"left\\\":\\\"5.11631021348116%\\\",\\\"width\\\":\\\"94.11366700517888%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"100%\\\"},\\\"componentName\\\":\\\"icon24\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":2057.9999959525203,\\\"height\\\":1065},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/控股业务综合监管版本6改_11_1763550114546.png\\\"},\\\"izRotate\\\":false}}}]},\\\"component\\\":\\\"JGroup\\\",\\\"w\\\":2186.7174677608436,\\\"x\\\":-181,\\\"y\\\":23,\\\"componentName\\\":\\\"总览图\\\",\\\"pageCompId\\\":\\\"1151112777012137984\\\",\\\"equalProportion\\\":false,\\\"key\\\":\\\"64c403ce-8e74-45bf-9bdd-620348b3218d\\\",\\\"group\\\":true},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":45,\\\"x\\\":1854,\\\"h\\\":45,\\\"i\\\":\\\"e1f80194-96dc-4201-b615-7b607ae986ad\\\",\\\"y\\\":7,\\\"orderNum\\\":70,\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1151112777028915200\\\",\\\"key\\\":\\\"d25da919-3018-489d-b036-6b761ae9f043\\\"},{\\\"component\\\":\\\"JCurrentTime\\\",\\\"visible\\\":true,\\\"w\\\":309,\\\"x\\\":17,\\\"h\\\":33,\\\"i\\\":\\\"cef21ff4-9c5c-48bc-89fc-29a197a17ac3\\\",\\\"y\\\":15,\\\"orderNum\\\":70,\\\"componentName\\\":\\\"当前时间\\\",\\\"pageCompId\\\":\\\"1151112777045692416\\\",\\\"key\\\":\\\"257448bf-3fe8-491e-b3e1-c386ab97b099\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":1911,\\\"x\\\":-2,\\\"h\\\":70,\\\"i\\\":\\\"5425948a-c724-4ea6-803a-00d4a5b70813\\\",\\\"y\\\":0,\\\"orderNum\\\":0,\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1151112777075052544\\\",\\\"key\\\":\\\"c17de8af-9926-449f-8f73-aaef011b77fb\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":679,\\\"x\\\":608,\\\"h\\\":46,\\\"i\\\":\\\"7dfacde7-dd88-45ec-824e-e071f091bad5\\\",\\\"y\\\":85,\\\"orderNum\\\":70,\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1151112777112801280\\\",\\\"key\\\":\\\"e0c4ef30-5c9a-43a7-88ea-d24e7b63d8b3\\\"}]', '', '0', '1', 'admin', '2025-11-19 18:26:18', 'admin', '2025-11-19 21:18:03', '', 0, 3, 20, 0);\nINSERT INTO `onl_drag_page` VALUES ('1504359493847306242', '流程门户', '/drag/page/view/1504359493847306242', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '[{\\\"component\\\":\\\"eoa-cms-apply-process\\\",\\\"w\\\":16,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":43,\\\"i\\\":\\\"ec47ccc3-fadb-4b4f-b156-be622e95a39f\\\",\\\"y\\\":59,\\\"pageCompId\\\":\\\"1526478613069701121\\\"},{\\\"component\\\":\\\"eoa-cms-comm-use\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":15,\\\"i\\\":\\\"7fb16df0-15dc-43c7-908e-7edb803cf1db\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1526478613174558721\\\"},{\\\"component\\\":\\\"eoa-cms-process-notice\\\",\\\"w\\\":8,\\\"moved\\\":false,\\\"x\\\":16,\\\"h\\\":44,\\\"i\\\":\\\"57eb306f-c556-4425-8966-ca315c83754a\\\",\\\"y\\\":15,\\\"pageCompId\\\":\\\"1526478613275222017\\\"},{\\\"component\\\":\\\"eoa-cms-my-process\\\",\\\"w\\\":16,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":44,\\\"i\\\":\\\"6dbe85c8-a57a-4fa9-8223-c320ebb3aa38\\\",\\\"y\\\":15,\\\"pageCompId\\\":\\\"1526478613384273922\\\"},{\\\"component\\\":\\\"eoa-cms-user-notice\\\",\\\"w\\\":8,\\\"moved\\\":false,\\\"x\\\":16,\\\"h\\\":43,\\\"i\\\":\\\"62b1793a-de33-4196-81fd-d1476131cc92\\\",\\\"y\\\":59,\\\"pageCompId\\\":\\\"1526478613489131521\\\"},{\\\"component\\\":\\\"eoa-cms-process-chart\\\",\\\"w\\\":16,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":36,\\\"i\\\":\\\"a0ad5cf9-81f8-415f-94d9-00ce57214192\\\",\\\"y\\\":102,\\\"pageCompId\\\":\\\"1526478613593989121\\\"},{\\\"component\\\":\\\"eoa-cms-process-type\\\",\\\"w\\\":8,\\\"moved\\\":false,\\\"x\\\":16,\\\"h\\\":36,\\\"i\\\":\\\"fbe20e5e-7aaa-4642-8368-28d2f2638cfd\\\",\\\"y\\\":102,\\\"pageCompId\\\":\\\"1526478613694652418\\\"},{\\\"component\\\":\\\"eoa-cms-email\\\",\\\"w\\\":16,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":48,\\\"i\\\":\\\"f7bd7396-b869-446b-8042-63871c77f05e\\\",\\\"y\\\":138,\\\"pageCompId\\\":\\\"1526478613803704322\\\"},{\\\"component\\\":\\\"eoa-cms-plan\\\",\\\"w\\\":8,\\\"moved\\\":false,\\\"x\\\":16,\\\"h\\\":48,\\\"i\\\":\\\"5a99de6c-8636-41be-8fe4-934bfce171f5\\\",\\\"y\\\":138,\\\"pageCompId\\\":\\\"1526478613904367618\\\"}]', '', '988299695309357056', '0', 'jeecg', '2022-03-17 15:30:28', 'admin', '2023-05-15 11:06:58', NULL, NULL, 1, NULL, 0);\nINSERT INTO `onl_drag_page` VALUES ('1504364941187043329', '企业门户', '/drag/page/view/1504364941187043329', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '[{\\\"component\\\":\\\"eoa-cms-banner\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":34,\\\"i\\\":\\\"43d3d2e3-7311-4714-bf93-8dd4a3984615\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1526476125109231618\\\"},{\\\"component\\\":\\\"eoa-cms-news-info\\\",\\\"w\\\":16,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":63,\\\"i\\\":\\\"e2b21502-d058-4cad-b16d-9a986ed1c1c4\\\",\\\"y\\\":34,\\\"pageCompId\\\":\\\"1526476125247643650\\\"},{\\\"component\\\":\\\"eoa-cms-user-notice\\\",\\\"w\\\":8,\\\"moved\\\":false,\\\"x\\\":16,\\\"h\\\":38,\\\"i\\\":\\\"1b834694-04df-491b-a734-aa38d70c1ed6\\\",\\\"y\\\":34,\\\"pageCompId\\\":\\\"1526476125352501250\\\"},{\\\"component\\\":\\\"eoa-cms-rule-info\\\",\\\"w\\\":9,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":44,\\\"i\\\":\\\"fa29e703-60b0-43b5-a84e-ff92eb9188b5\\\",\\\"y\\\":97,\\\"pageCompId\\\":\\\"1526476125457358849\\\"},{\\\"component\\\":\\\"eoa-cms-sign-news\\\",\\\"w\\\":7,\\\"moved\\\":false,\\\"x\\\":9,\\\"h\\\":44,\\\"i\\\":\\\"5cd2720b-4ac9-4485-92a1-e77363883012\\\",\\\"y\\\":97,\\\"pageCompId\\\":\\\"1526476125562216450\\\"},{\\\"component\\\":\\\"eoa-cms-plan\\\",\\\"w\\\":8,\\\"moved\\\":false,\\\"x\\\":16,\\\"h\\\":49,\\\"i\\\":\\\"7bc89a6e-8a1e-4e5e-8aad-a59011bd7bd1\\\",\\\"y\\\":72,\\\"pageCompId\\\":\\\"1526476125667074049\\\"},{\\\"component\\\":\\\"eoa-cms-link\\\",\\\"w\\\":8,\\\"moved\\\":false,\\\"x\\\":16,\\\"h\\\":20,\\\"i\\\":\\\"5b7716a2-b0ab-4344-8a72-da53b5beb9f0\\\",\\\"y\\\":121,\\\"pageCompId\\\":\\\"1526476125771931649\\\"}]', '', '988299695309357056', '0', 'jeecg', '2022-03-17 15:52:06', 'admin', '2023-05-15 11:07:00', NULL, NULL, 1, NULL, 0);\nINSERT INTO `onl_drag_page` VALUES ('1516747539813007362', '示例_项目性质收入统计JSON', '/drag/page/view/1516747539813007362', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '[{\\\"component\\\":\\\"JPie\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":42,\\\"i\\\":\\\"a2ada7ba-ff55-4d2c-ba1b-10eb3c04b5f7\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1517018288431857665\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":12,\\\"h\\\":42,\\\"i\\\":\\\"195569f9-8bd3-4e8f-892a-f81f60a25ba8\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1517018288566075393\\\"},{\\\"component\\\":\\\"JLine\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":44,\\\"i\\\":\\\"5cde89e3-1174-4a95-8385-065c1ee1a22d\\\",\\\"y\\\":42,\\\"pageCompId\\\":\\\"1517018288670932994\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":48,\\\"i\\\":\\\"2ed05f21-e822-4c4e-8657-02edb10b1cca\\\",\\\"y\\\":86,\\\"pageCompId\\\":\\\"1517018288775790593\\\"}]', '', '0', '1', 'admin', '2022-04-20 19:56:08', 'admin', '2023-05-15 11:07:40', NULL, NULL, 1, NULL, 0);\nINSERT INTO `onl_drag_page` VALUES ('1517018517935783937', '示例_项目性质收入统计SQL', '/drag/page/view/1517018517935783937', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '[{\\\"component\\\":\\\"JTabs\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":56,\\\"i\\\":\\\"19dd2a57-e10d-418b-8146-cd30de6e9aea\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1524663379220791297\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":48,\\\"i\\\":\\\"e9e93d41-076f-436a-b466-3c327478e94d\\\",\\\"y\\\":56,\\\"pageCompId\\\":\\\"1524663379359203329\\\"}]', '', '0', '1', 'admin', '2022-04-21 13:52:54', 'admin', '2022-05-12 16:10:51', NULL, NULL, 1, NULL, 0);\nINSERT INTO `onl_drag_page` VALUES ('1517062686729338882', '示例_年龄占比API', '/drag/page/view/1517062686729338882', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '[{\\\"component\\\":\\\"JLine\\\",\\\"w\\\":13,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":44,\\\"i\\\":\\\"503ecff5-5f00-4188-90f7-227f5847b895\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1517064663387373570\\\"},{\\\"component\\\":\\\"JRing\\\",\\\"w\\\":11,\\\"moved\\\":false,\\\"x\\\":13,\\\"h\\\":44,\\\"i\\\":\\\"5a72ce0b-838d-4777-838a-1a0505ef8394\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1517064663563534337\\\"},{\\\"component\\\":\\\"JFunnel\\\",\\\"w\\\":13,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":49,\\\"i\\\":\\\"39790ea2-63de-41b4-957b-5a51b7e11f29\\\",\\\"y\\\":44,\\\"pageCompId\\\":\\\"1517064663664197634\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"w\\\":11,\\\"moved\\\":false,\\\"x\\\":13,\\\"h\\\":49,\\\"i\\\":\\\"9c1f12e1-d71d-4a12-b601-d6730fcd0223\\\",\\\"y\\\":44,\\\"pageCompId\\\":\\\"1517064663798415361\\\"}]', '', '0', '1', 'admin', '2022-04-21 16:48:25', 'admin', '2022-04-21 16:56:16', NULL, NULL, 1, NULL, 0);\nINSERT INTO `onl_drag_page` VALUES ('1519992838245441538', '示例_钻取', '/drag/page/view/1519992838245441538', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '[{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":42,\\\"i\\\":\\\"c801a065-ca40-4095-8d27-6cf722deb09e\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1519994699446870018\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":12,\\\"h\\\":42,\\\"i\\\":\\\"58236f99-4803-4a3c-ad39-e83949270517\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1519994699518173186\\\"}]', '', '0', '1', 'jeecg', '2022-04-29 18:51:47', 'jeecg', '2022-04-29 18:59:11', NULL, NULL, 1, NULL, 0);\nINSERT INTO `onl_drag_page` VALUES ('1522121177760280578', '示例_医院综合数据统计', '/drag/page/view/1522121177760280578', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '[{\\\"component\\\":\\\"JText\\\",\\\"w\\\":9,\\\"moved\\\":false,\\\"x\\\":8,\\\"h\\\":8,\\\"i\\\":\\\"5df901ff-2237-4aaf-91b2-74eb9103dc09\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1523906947722629122\\\"},{\\\"component\\\":\\\"JStackBar\\\",\\\"w\\\":8,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":37,\\\"i\\\":\\\"35c97a7b-966d-4124-8589-9ad9175085e2\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1523906947861041153\\\"},{\\\"component\\\":\\\"JArea\\\",\\\"w\\\":7,\\\"moved\\\":false,\\\"x\\\":17,\\\"h\\\":25,\\\"i\\\":\\\"f9936af9-9347-4ea2-8fda-4eef38fc2851\\\",\\\"y\\\":35,\\\"pageCompId\\\":\\\"1523906947932344321\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":8,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":29,\\\"i\\\":\\\"94f35443-fdf7-462c-8ed1-5eff21f41624\\\",\\\"y\\\":37,\\\"pageCompId\\\":\\\"1523906948037201921\\\"},{\\\"component\\\":\\\"JColorGauge\\\",\\\"w\\\":4,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":27,\\\"i\\\":\\\"6685b078-9067-42a5-a14d-9037dbe12131\\\",\\\"y\\\":66,\\\"pageCompId\\\":\\\"1523906948108505089\\\"},{\\\"component\\\":\\\"JColorGauge\\\",\\\"w\\\":4,\\\"moved\\\":false,\\\"x\\\":4,\\\"h\\\":27,\\\"i\\\":\\\"1e968150-d9d6-411b-833d-f95b231ae4ad\\\",\\\"y\\\":66,\\\"pageCompId\\\":\\\"1523906948179808258\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"w\\\":7,\\\"moved\\\":false,\\\"x\\\":17,\\\"h\\\":32,\\\"i\\\":\\\"cbc6855a-1bc5-403b-be2d-76af53b1eb40\\\",\\\"y\\\":60,\\\"pageCompId\\\":\\\"1523906948246917122\\\"},{\\\"component\\\":\\\"JLine\\\",\\\"w\\\":7,\\\"moved\\\":false,\\\"x\\\":17,\\\"h\\\":35,\\\"i\\\":\\\"cc1dde8c-c064-438c-96a2-82a70bcb6815\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1523906948351774722\\\"},{\\\"component\\\":\\\"JRing\\\",\\\"w\\\":9,\\\"moved\\\":false,\\\"x\\\":8,\\\"h\\\":34,\\\"i\\\":\\\"ac652ca3-c956-4e0b-8dc3-b1407f4d8f5c\\\",\\\"y\\\":24,\\\"pageCompId\\\":\\\"1523906948423077889\\\"},{\\\"component\\\":\\\"JFunnel\\\",\\\"w\\\":9,\\\"moved\\\":false,\\\"x\\\":8,\\\"h\\\":34,\\\"i\\\":\\\"142fe7cf-1e45-4c52-9e6b-625bdf16d002\\\",\\\"y\\\":58,\\\"pageCompId\\\":\\\"1523906948490186754\\\"},{\\\"component\\\":\\\"JGrowCard\\\",\\\"w\\\":9,\\\"moved\\\":false,\\\"x\\\":8,\\\"h\\\":16,\\\"i\\\":\\\"3d9d75ff-99f5-49da-b16e-88447705dcc3\\\",\\\"y\\\":8,\\\"pageCompId\\\":\\\"1523906948561489921\\\"}]', '', '0', '1', 'admin', '2022-05-05 15:49:03', 'admin', '2022-05-10 14:05:04', NULL, NULL, 1, NULL, 0);\nINSERT INTO `onl_drag_page` VALUES ('1522172834409885698', '示例_智慧社区', '/drag/page/view/1522172834409885698', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '[{\\\"component\\\":\\\"JText\\\",\\\"w\\\":10,\\\"moved\\\":false,\\\"x\\\":7,\\\"h\\\":7,\\\"i\\\":\\\"a027c162-fc08-430b-aaca-428a40bf6757\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1524661142020980737\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":7,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":6,\\\"i\\\":\\\"08290325-ab4c-4637-9533-50bb9ce0e92b\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1524661142121644034\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":7,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":6,\\\"i\\\":\\\"543590d0-763e-4871-8c8b-72258b10f68e\\\",\\\"y\\\":6,\\\"pageCompId\\\":\\\"1524661142226501634\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":7,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":5,\\\"i\\\":\\\"6253853a-75fb-42b4-ad93-b94cdd66b2c0\\\",\\\"y\\\":12,\\\"pageCompId\\\":\\\"1524661142331359233\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"w\\\":7,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":36,\\\"i\\\":\\\"a20e09ed-a2db-4b0b-8c9a-e745eb747378\\\",\\\"y\\\":17,\\\"pageCompId\\\":\\\"1524661142436216833\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":7,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":6,\\\"i\\\":\\\"64040039-455f-47c8-800e-f6061af70451\\\",\\\"y\\\":53,\\\"pageCompId\\\":\\\"1524661142541074433\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"w\\\":7,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":43,\\\"i\\\":\\\"485ad866-aeae-4137-8227-bef27c9275b0\\\",\\\"y\\\":59,\\\"pageCompId\\\":\\\"1524661142645932033\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":7,\\\"moved\\\":false,\\\"x\\\":17,\\\"h\\\":5,\\\"i\\\":\\\"aa8f5bac-5cdd-484b-b7ec-145b34119d94\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1524661142750789634\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":7,\\\"moved\\\":false,\\\"x\\\":17,\\\"h\\\":5,\\\"i\\\":\\\"cd378afa-20ce-4d37-abcd-9b73af9bd70a\\\",\\\"y\\\":35,\\\"pageCompId\\\":\\\"1524661142855647234\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":7,\\\"moved\\\":false,\\\"x\\\":17,\\\"h\\\":5,\\\"i\\\":\\\"0b9d4f60-d3a2-43bd-a444-2378974cbac0\\\",\\\"y\\\":69,\\\"pageCompId\\\":\\\"1524661142960504833\\\"},{\\\"component\\\":\\\"JLine\\\",\\\"w\\\":7,\\\"moved\\\":false,\\\"x\\\":17,\\\"h\\\":28,\\\"i\\\":\\\"a88af204-bba2-48e0-857a-056f77a62838\\\",\\\"y\\\":74,\\\"pageCompId\\\":\\\"1524661143065362433\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":7,\\\"moved\\\":false,\\\"x\\\":17,\\\"h\\\":29,\\\"i\\\":\\\"fc62f6b2-54b2-42fb-ac49-730a458365f7\\\",\\\"y\\\":40,\\\"pageCompId\\\":\\\"1524661143170220033\\\"},{\\\"component\\\":\\\"JRing\\\",\\\"w\\\":7,\\\"moved\\\":false,\\\"x\\\":17,\\\"h\\\":30,\\\"i\\\":\\\"a0fd33e9-ad35-4f54-8f1c-15e6d6a0e1a8\\\",\\\"y\\\":5,\\\"pageCompId\\\":\\\"1524661143275077633\\\"},{\\\"component\\\":\\\"JGauge\\\",\\\"w\\\":10,\\\"moved\\\":false,\\\"x\\\":7,\\\"h\\\":30,\\\"i\\\":\\\"a65c5a00-3a09-488e-8ed7-957c37c74ec5\\\",\\\"y\\\":7,\\\"pageCompId\\\":\\\"1524661143379935234\\\"},{\\\"component\\\":\\\"JColorGauge\\\",\\\"w\\\":10,\\\"moved\\\":false,\\\"x\\\":7,\\\"h\\\":31,\\\"i\\\":\\\"0633a426-0e0a-4b4d-9813-575166ab382e\\\",\\\"y\\\":37,\\\"pageCompId\\\":\\\"1524661143518347265\\\"},{\\\"component\\\":\\\"JStackBar\\\",\\\"w\\\":10,\\\"moved\\\":false,\\\"x\\\":7,\\\"h\\\":34,\\\"i\\\":\\\"0be25d6b-60e4-40a3-8af2-637bab222491\\\",\\\"y\\\":68,\\\"pageCompId\\\":\\\"1524661143660953602\\\"}]', '', '0', '1', 'admin', '2022-05-05 19:14:19', 'admin', '2022-05-12 16:01:58', NULL, NULL, 1, NULL, 0);\nINSERT INTO `onl_drag_page` VALUES ('1522417428246568961', '示例_乡村振兴普惠金融服务', '/drag/page/view/1522417428246568961', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '[{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":1,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":5,\\\"i\\\":\\\"62cb9a5f-eb84-4f74-8e35-3fa54fd867f0\\\",\\\"y\\\":8,\\\"pageCompId\\\":\\\"1522524336454377473\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":6,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":8,\\\"i\\\":\\\"7e21b964-9332-4348-b36e-30314b6f92c2\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1522524336693452802\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":5,\\\"moved\\\":false,\\\"x\\\":1,\\\"h\\\":5,\\\"i\\\":\\\"1edb6c33-8eb8-4f22-8711-55aef46767d7\\\",\\\"y\\\":8,\\\"pageCompId\\\":\\\"1522524336823476225\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":1,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":5,\\\"i\\\":\\\"f4d32efe-0cff-4845-8c38-bde3fdb0657c\\\",\\\"y\\\":13,\\\"pageCompId\\\":\\\"1522524336903168002\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":1,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":5,\\\"i\\\":\\\"6b640017-ec02-407e-87d3-35b4da262384\\\",\\\"y\\\":18,\\\"pageCompId\\\":\\\"1522524336974471169\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":5,\\\"moved\\\":false,\\\"x\\\":1,\\\"h\\\":5,\\\"i\\\":\\\"f64eb1a5-faec-4b42-8490-88cddf20669b\\\",\\\"y\\\":13,\\\"pageCompId\\\":\\\"1522524337066745858\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":5,\\\"moved\\\":false,\\\"x\\\":1,\\\"h\\\":5,\\\"i\\\":\\\"402b8a18-951c-4bd0-b817-17b75d18cbd2\\\",\\\"y\\\":18,\\\"pageCompId\\\":\\\"1522524337146437633\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"w\\\":14,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":43,\\\"i\\\":\\\"aafe3aec-5265-4769-8ba3-c3f693287100\\\",\\\"y\\\":38,\\\"pageCompId\\\":\\\"1522524337251295233\\\"},{\\\"component\\\":\\\"JLine\\\",\\\"w\\\":10,\\\"moved\\\":false,\\\"x\\\":14,\\\"h\\\":29,\\\"i\\\":\\\"ba474f88-f06a-4459-adc0-53929c564e5f\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1522524337356152834\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":10,\\\"moved\\\":false,\\\"x\\\":14,\\\"h\\\":28,\\\"i\\\":\\\"88f93cd9-3a51-42aa-9a11-6edf685a5db9\\\",\\\"y\\\":29,\\\"pageCompId\\\":\\\"1522524337461010433\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"w\\\":10,\\\"moved\\\":false,\\\"x\\\":14,\\\"h\\\":24,\\\"i\\\":\\\"4e7bb9d5-72c2-4f21-85cb-0f6289d9099e\\\",\\\"y\\\":57,\\\"pageCompId\\\":\\\"1522524337565868034\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":5,\\\"moved\\\":false,\\\"x\\\":1,\\\"h\\\":5,\\\"i\\\":\\\"53d91193-8d89-4291-be1b-cc6e43ef1bf9\\\",\\\"y\\\":23,\\\"pageCompId\\\":\\\"1522524337670725634\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":1,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":5,\\\"i\\\":\\\"e04f860d-3355-4ce2-8ad7-c7597f7365e2\\\",\\\"y\\\":23,\\\"pageCompId\\\":\\\"1522524337742028802\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":1,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":5,\\\"i\\\":\\\"e52f5ced-8159-46e6-8a60-7349e9eb26b9\\\",\\\"y\\\":28,\\\"pageCompId\\\":\\\"1522524337813331969\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":5,\\\"moved\\\":false,\\\"x\\\":1,\\\"h\\\":5,\\\"i\\\":\\\"b6d236f0-827a-4b32-a556-e85fe44e7df1\\\",\\\"y\\\":28,\\\"pageCompId\\\":\\\"1522524337884635138\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":5,\\\"moved\\\":false,\\\"x\\\":1,\\\"h\\\":5,\\\"i\\\":\\\"018f02bb-eb4b-43f3-a98e-9a712681bb26\\\",\\\"y\\\":33,\\\"pageCompId\\\":\\\"1522524337951744001\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":1,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":5,\\\"i\\\":\\\"ecc0ff70-9aa0-48ee-84c1-625c5069044c\\\",\\\"y\\\":33,\\\"pageCompId\\\":\\\"1522524338023047170\\\"},{\\\"component\\\":\\\"JFunnel\\\",\\\"w\\\":8,\\\"moved\\\":false,\\\"x\\\":6,\\\"h\\\":38,\\\"i\\\":\\\"19ab2147-2c5c-47c7-8dce-bec960353793\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1522524338094350337\\\"}]', '', '0', '1', 'admin', '2022-05-06 11:26:15', 'admin', '2022-05-06 18:31:04', NULL, NULL, 1, NULL, 0);\nINSERT INTO `onl_drag_page` VALUES ('1522451603569778690', '示例_智能大数据', '/drag/page/view/1522451603569778690', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '[{\\\"component\\\":\\\"JText\\\",\\\"w\\\":4,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":6,\\\"i\\\":\\\"6070607f-f8cd-48f9-b8e6-74511388b222\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1522523872572743681\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":4,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":6,\\\"i\\\":\\\"0ced8073-18dc-4d50-84be-5364d338a6b4\\\",\\\"y\\\":6,\\\"pageCompId\\\":\\\"1522523872849567745\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":44,\\\"i\\\":\\\"e8e1e96a-6bcd-470f-8d52-3be655942a97\\\",\\\"y\\\":12,\\\"pageCompId\\\":\\\"1522523872954425346\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"w\\\":6,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":42,\\\"i\\\":\\\"5d40565e-8ac4-4156-8130-ab627e98a80c\\\",\\\"y\\\":56,\\\"pageCompId\\\":\\\"1522523873038311426\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"w\\\":6,\\\"moved\\\":false,\\\"x\\\":6,\\\"h\\\":42,\\\"i\\\":\\\"60495499-f2d4-463d-ad7f-2487ee47592d\\\",\\\"y\\\":56,\\\"pageCompId\\\":\\\"1522523873143169025\\\"},{\\\"component\\\":\\\"JTabs\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":12,\\\"h\\\":50,\\\"i\\\":\\\"a83d340c-a493-4d37-935c-be8a35c09097\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1522523873235443714\\\"},{\\\"component\\\":\\\"JTabs\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":12,\\\"h\\\":48,\\\"i\\\":\\\"7903672e-9139-4db9-ab25-24c0612537cb\\\",\\\"y\\\":50,\\\"pageCompId\\\":\\\"1522523873340301313\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":4,\\\"moved\\\":false,\\\"x\\\":4,\\\"h\\\":6,\\\"i\\\":\\\"38364ada-5aeb-4ca3-8bfe-c81c3894846d\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1522523873445158914\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":4,\\\"moved\\\":false,\\\"x\\\":4,\\\"h\\\":6,\\\"i\\\":\\\"6f1363fd-4306-4452-82ac-b0427e064b59\\\",\\\"y\\\":6,\\\"pageCompId\\\":\\\"1522523873529044994\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":4,\\\"moved\\\":false,\\\"x\\\":8,\\\"h\\\":6,\\\"i\\\":\\\"8a101ba0-496e-451c-8d37-fefa1858f19c\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1522523873621319682\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":4,\\\"moved\\\":false,\\\"x\\\":8,\\\"h\\\":6,\\\"i\\\":\\\"45600ba8-6cff-4083-8db8-fead5cfc88ab\\\",\\\"y\\\":6,\\\"pageCompId\\\":\\\"1522523873726177281\\\"}]', '', '0', '1', 'admin', '2022-05-06 13:42:03', 'admin', '2022-05-06 18:29:13', NULL, NULL, 1, NULL, 0);\nINSERT INTO `onl_drag_page` VALUES ('1522460228585529346', '示例_旅游数据监控', '/drag/page/view/1522460228585529346', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '[{\\\"component\\\":\\\"JRing\\\",\\\"w\\\":8,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":30,\\\"i\\\":\\\"3e514383-e7b8-4038-8037-da02ceeb251f\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1522466576295534593\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":8,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":24,\\\"i\\\":\\\"7c31dea0-fdf9-46ae-83f3-a3c1e50641f6\\\",\\\"y\\\":30,\\\"pageCompId\\\":\\\"1522466576429752321\\\"},{\\\"component\\\":\\\"JLine\\\",\\\"w\\\":8,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":26,\\\"i\\\":\\\"661c80a4-668f-4446-8f56-d8628e2511f9\\\",\\\"y\\\":54,\\\"pageCompId\\\":\\\"1522466576526221314\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"w\\\":7,\\\"moved\\\":false,\\\"x\\\":17,\\\"h\\\":31,\\\"i\\\":\\\"09a859e0-d906-4d6a-92d2-5cb9966aedfb\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1522466576605913090\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":9,\\\"moved\\\":false,\\\"x\\\":8,\\\"h\\\":25,\\\"i\\\":\\\"c30dbcb0-4d27-4f25-83f5-de2bbbac401c\\\",\\\"y\\\":11,\\\"pageCompId\\\":\\\"1522466576702382082\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":5,\\\"moved\\\":false,\\\"x\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"d4f386cb-6074-4f46-84a7-7328b2b147bf\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1522466576777879554\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":4,\\\"moved\\\":false,\\\"x\\\":13,\\\"h\\\":5,\\\"i\\\":\\\"e355be6c-3c7f-4f6e-8014-7ff591f8c9b0\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1522466576878542849\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":5,\\\"moved\\\":false,\\\"x\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"f6cb6f0f-3e74-4f97-8965-c83102f62248\\\",\\\"y\\\":5,\\\"pageCompId\\\":\\\"1522466576954040321\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":4,\\\"moved\\\":false,\\\"x\\\":13,\\\"h\\\":6,\\\"i\\\":\\\"3e3d8fee-844f-4437-a593-899b6b1ff811\\\",\\\"y\\\":5,\\\"pageCompId\\\":\\\"1522466577054703617\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"w\\\":9,\\\"moved\\\":false,\\\"x\\\":8,\\\"h\\\":44,\\\"i\\\":\\\"c3bb7ba4-8dc9-4e2a-8252-77ed74dd10d0\\\",\\\"y\\\":36,\\\"pageCompId\\\":\\\"1522466577159561217\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"w\\\":7,\\\"moved\\\":false,\\\"x\\\":17,\\\"h\\\":49,\\\"i\\\":\\\"d3edcc06-4e00-4934-ab1e-066f058ea618\\\",\\\"y\\\":31,\\\"pageCompId\\\":\\\"1522466577264418817\\\"}]', '', '0', '1', 'admin', '2022-05-06 14:16:19', 'admin', '2022-05-06 14:41:33', NULL, NULL, 1, NULL, 0);\nINSERT INTO `onl_drag_page` VALUES ('1522466781443137538', '示例_首页', '/drag/page/view/1522466781443137538', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '[{\\\"component\\\":\\\"JQuickNav\\\",\\\"w\\\":13,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":28,\\\"i\\\":\\\"a80f65fe-cdc3-4fbe-a383-c526eda9886e\\\",\\\"y\\\":19,\\\"pageCompId\\\":\\\"1522504050518532098\\\"},{\\\"component\\\":\\\"JList\\\",\\\"w\\\":11,\\\"moved\\\":false,\\\"x\\\":13,\\\"h\\\":44,\\\"i\\\":\\\"4d7f78a3-6520-45ae-85e4-ac0cfca514b3\\\",\\\"y\\\":39,\\\"pageCompId\\\":\\\"1522504050690498562\\\"},{\\\"component\\\":\\\"JGrowCard\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":19,\\\"i\\\":\\\"1aab1f6b-316e-4046-9ec0-d68d35fa6142\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1522504050782773249\\\"},{\\\"component\\\":\\\"JProjectCard\\\",\\\"w\\\":13,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":36,\\\"i\\\":\\\"ab1fcd58-e150-4816-b06a-5d2a62517510\\\",\\\"y\\\":47,\\\"pageCompId\\\":\\\"1522504050862465026\\\"},{\\\"component\\\":\\\"JWaitMatter\\\",\\\"w\\\":11,\\\"moved\\\":false,\\\"x\\\":13,\\\"h\\\":20,\\\"i\\\":\\\"e5a73961-e1ba-462c-bf86-78fbb94390d4\\\",\\\"y\\\":19,\\\"pageCompId\\\":\\\"1522504050958934017\\\"},{\\\"component\\\":\\\"JLine\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":41,\\\"i\\\":\\\"b1786985-070f-4f7b-8c46-b61c0ac9b8c7\\\",\\\"y\\\":83,\\\"pageCompId\\\":\\\"1522504051076374530\\\"}]', '', '0', '1', 'admin', '2022-05-06 14:42:21', 'admin', '2022-05-06 17:10:27', NULL, NULL, 1, NULL, 0);\nINSERT INTO `onl_drag_page` VALUES ('1522507145776472065', '示例_数据分析', '/drag/page/view/1522507145776472065', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '[{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":42,\\\"i\\\":\\\"cfe42a6f-d74e-46f4-8a64-c2b7d13b0d12\\\",\\\"y\\\":23,\\\"pageCompId\\\":\\\"1522520321213603842\\\"},{\\\"component\\\":\\\"JStackBar\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":12,\\\"h\\\":42,\\\"i\\\":\\\"fe5628ab-6e56-4f25-88bf-21e4d5d2eb40\\\",\\\"y\\\":23,\\\"pageCompId\\\":\\\"1522520321352015874\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":42,\\\"i\\\":\\\"70d1dace-e2d2-4080-8736-f9cac6b9e727\\\",\\\"y\\\":65,\\\"pageCompId\\\":\\\"1522520321456873474\\\"},{\\\"component\\\":\\\"JLine\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":12,\\\"h\\\":42,\\\"i\\\":\\\"32560edd-a4b5-4b7d-8f8b-7e84ce1c5213\\\",\\\"y\\\":65,\\\"pageCompId\\\":\\\"1522520321549148162\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":42,\\\"i\\\":\\\"1f3f12e8-f852-4e81-9b11-6f4a762500f9\\\",\\\"y\\\":107,\\\"pageCompId\\\":\\\"1522520321628839937\\\"},{\\\"component\\\":\\\"JTabs\\\",\\\"w\\\":15,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":43,\\\"i\\\":\\\"43c93eaa-1db0-42e2-8865-f0deb138782e\\\",\\\"y\\\":233,\\\"pageCompId\\\":\\\"1522520321725308929\\\"},{\\\"component\\\":\\\"JGrid\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":40,\\\"i\\\":\\\"1ac58009-1e17-4136-8309-313a9111ebb6\\\",\\\"y\\\":193,\\\"pageCompId\\\":\\\"1522520321935024129\\\"},{\\\"component\\\":\\\"JCarousel\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":23,\\\"i\\\":\\\"85bab599-d0e8-4989-9e76-a662dd71ab93\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1522520322014715906\\\"},{\\\"component\\\":\\\"JIframe\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":36,\\\"i\\\":\\\"39c79717-7996-43b8-89db-b9cacfed9bc0\\\",\\\"y\\\":276,\\\"pageCompId\\\":\\\"1522520322115379202\\\"},{\\\"component\\\":\\\"JPictorialBar\\\",\\\"w\\\":9,\\\"moved\\\":false,\\\"x\\\":15,\\\"h\\\":43,\\\"i\\\":\\\"8b8d91a4-8796-431f-a6a8-ff1379dbc93c\\\",\\\"y\\\":233,\\\"pageCompId\\\":\\\"1522520322216042498\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":15,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":44,\\\"i\\\":\\\"7027c8c1-6178-40cb-8a54-e98e468679fc\\\",\\\"y\\\":149,\\\"pageCompId\\\":\\\"1522520322329288706\\\"},{\\\"component\\\":\\\"JLine\\\",\\\"w\\\":9,\\\"moved\\\":false,\\\"x\\\":15,\\\"h\\\":44,\\\"i\\\":\\\"eb6b93ec-c49e-446d-8aed-5370c391b1bc\\\",\\\"y\\\":149,\\\"pageCompId\\\":\\\"1522520322421563394\\\"}]', '', '0', '1', 'admin', '2022-05-06 17:22:45', 'admin', '2022-05-06 18:15:07', NULL, NULL, 1, NULL, 0);\nINSERT INTO `onl_drag_page` VALUES ('1522823348231397378', '示例_数据表格', '/drag/page/view/1522823348231397378', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '[{\\\"component\\\":\\\"JForm\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":12,\\\"i\\\":\\\"2c69541d-4945-4734-8813-f719cccff3e3\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1524656729709641730\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":42,\\\"i\\\":\\\"491fc4c0-782c-49ac-838c-ae7003abece2\\\",\\\"y\\\":12,\\\"pageCompId\\\":\\\"1524656729776750593\\\"}]', '', '0', '1', 'admin', '2022-05-07 14:19:14', 'admin', '2022-05-12 15:44:26', NULL, NULL, 1, NULL, 0);\nINSERT INTO `onl_drag_page` VALUES ('1522835471967772673', '示例_日期范围查询', '/drag/page/view/1522835471967772673', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '[{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":42,\\\"i\\\":\\\"918fc3ea-c88a-4c42-892b-d2a14967258e\\\",\\\"y\\\":12,\\\"pageCompId\\\":\\\"1526496110877696002\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":12,\\\"h\\\":42,\\\"i\\\":\\\"d14e4994-171d-4ca1-8bd8-85dc821f56a7\\\",\\\"y\\\":12,\\\"pageCompId\\\":\\\"1526496110948999169\\\"},{\\\"component\\\":\\\"JForm\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":12,\\\"i\\\":\\\"eba57ed3-52c2-4ebd-aa70-81ed565d8488\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1526496111003525121\\\"}]', '', '0', '1', 'admin', '2022-05-07 15:07:24', 'admin', '2022-05-17 17:33:28', NULL, NULL, 1, NULL, 0);\nINSERT INTO `onl_drag_page` VALUES ('1524641995740446722', '示例_全组件', '/drag/page/view/1524641995740446722', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '[{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":39,\\\"i\\\":\\\"fa778a18-c782-4f15-849b-f41e95ebf2e5\\\",\\\"y\\\":24,\\\"pageCompId\\\":\\\"1546761823821938690\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":42,\\\"i\\\":\\\"70157e6a-4357-41e6-9b33-7c54897c0630\\\",\\\"y\\\":63,\\\"pageCompId\\\":\\\"1546761823821938691\\\"},{\\\"component\\\":\\\"JStackBar\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":12,\\\"h\\\":39,\\\"i\\\":\\\"2a223f69-813b-4f55-8849-d7265cebf295\\\",\\\"y\\\":24,\\\"pageCompId\\\":\\\"1546761823821938692\\\"},{\\\"component\\\":\\\"JDynamicBar\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":12,\\\"h\\\":42,\\\"i\\\":\\\"9be9a362-e019-4ce5-a6ec-35d986582f65\\\",\\\"y\\\":63,\\\"pageCompId\\\":\\\"1546761823821938693\\\"},{\\\"component\\\":\\\"JLine\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":37,\\\"i\\\":\\\"7be6d89a-4e82-4a98-8574-39ce47e3dd9e\\\",\\\"y\\\":105,\\\"pageCompId\\\":\\\"1546761823821938694\\\"},{\\\"component\\\":\\\"JRadar\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":12,\\\"h\\\":37,\\\"i\\\":\\\"0693213b-fc57-41f7-891a-55c252469a5d\\\",\\\"y\\\":105,\\\"pageCompId\\\":\\\"1546761823889047554\\\"},{\\\"component\\\":\\\"JRing\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":36,\\\"i\\\":\\\"f720948d-e768-44a5-8f51-ccaf6292523e\\\",\\\"y\\\":142,\\\"pageCompId\\\":\\\"1546761823889047555\\\"},{\\\"component\\\":\\\"JArea\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":12,\\\"h\\\":36,\\\"i\\\":\\\"d69757e5-f19a-48b1-bea4-d9456086e45e\\\",\\\"y\\\":142,\\\"pageCompId\\\":\\\"1546761823889047556\\\"},{\\\"component\\\":\\\"JProgress\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":33,\\\"i\\\":\\\"4efbcc2a-5b1d-46c2-9b6d-40e26d69e967\\\",\\\"y\\\":178,\\\"pageCompId\\\":\\\"1546761823889047557\\\"},{\\\"component\\\":\\\"JFunnel\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":12,\\\"h\\\":33,\\\"i\\\":\\\"fba9dcee-2737-48bc-afc5-865484ce1be3\\\",\\\"y\\\":178,\\\"pageCompId\\\":\\\"1546761823889047558\\\"},{\\\"component\\\":\\\"JPictorialBar\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":38,\\\"i\\\":\\\"17497727-7589-4ec7-8a45-c15a4317602b\\\",\\\"y\\\":211,\\\"pageCompId\\\":\\\"1546761823951962113\\\"},{\\\"component\\\":\\\"JGauge\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":12,\\\"h\\\":38,\\\"i\\\":\\\"7136f472-1e93-4387-b147-1bb06673f338\\\",\\\"y\\\":211,\\\"pageCompId\\\":\\\"1546761823951962114\\\"},{\\\"component\\\":\\\"JColorGauge\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":48,\\\"i\\\":\\\"6fa66881-2c04-4720-8fe9-5ccdc6f5edb0\\\",\\\"y\\\":249,\\\"pageCompId\\\":\\\"1546761823951962115\\\"},{\\\"component\\\":\\\"JTabs\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":12,\\\"h\\\":48,\\\"i\\\":\\\"a9b26f9d-3a79-430a-80fb-4261d9fc40e7\\\",\\\"y\\\":249,\\\"pageCompId\\\":\\\"1546761823951962116\\\"},{\\\"component\\\":\\\"JGrid\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":40,\\\"i\\\":\\\"ed8dfb23-63c9-4d3d-8bef-aad3a5de4cc4\\\",\\\"y\\\":297,\\\"pageCompId\\\":\\\"1546761823951962117\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":50,\\\"i\\\":\\\"eb4af4a3-8fce-40f9-832c-c749e75dac5d\\\",\\\"y\\\":349,\\\"pageCompId\\\":\\\"1546761824014876674\\\"},{\\\"component\\\":\\\"JList\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":38,\\\"i\\\":\\\"e2b2073e-d523-4545-a9a2-903710c50952\\\",\\\"y\\\":399,\\\"pageCompId\\\":\\\"1546761824014876675\\\"},{\\\"component\\\":\\\"JForm\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":12,\\\"i\\\":\\\"27d36825-02a8-49b5-a058-4ab710516fdd\\\",\\\"y\\\":337,\\\"pageCompId\\\":\\\"1546761824014876676\\\"},{\\\"component\\\":\\\"JCarousel\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":24,\\\"i\\\":\\\"0c12ecb7-0ff2-498d-811f-b10b303b2ab3\\\",\\\"y\\\":0,\\\"pageCompId\\\":\\\"1546761824014876677\\\"},{\\\"component\\\":\\\"JIframe\\\",\\\"w\\\":24,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":42,\\\"i\\\":\\\"193478dd-b57c-4930-84b4-f021721c8f52\\\",\\\"y\\\":437,\\\"pageCompId\\\":\\\"1546761824014876678\\\"},{\\\"component\\\":\\\"JCalendar\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":12,\\\"h\\\":38,\\\"i\\\":\\\"df8b75f0-9243-47b4-8773-47916cd6768b\\\",\\\"y\\\":399,\\\"pageCompId\\\":\\\"1546761824014876679\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"w\\\":10,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":24,\\\"i\\\":\\\"e326ea85-2fc7-4c72-bf68-3d525cbdd271\\\",\\\"y\\\":479,\\\"pageCompId\\\":\\\"1546761824014876680\\\"},{\\\"component\\\":\\\"JText\\\",\\\"w\\\":6,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":6,\\\"i\\\":\\\"798187db-1959-4d6e-be8a-adcd7b249558\\\",\\\"y\\\":556,\\\"pageCompId\\\":\\\"1546761824081985537\\\"},{\\\"component\\\":\\\"JRadioButton\\\",\\\"w\\\":5,\\\"moved\\\":false,\\\"x\\\":7,\\\"h\\\":6,\\\"i\\\":\\\"6cb30c18-e63d-428e-9b29-52dd04e1b182\\\",\\\"y\\\":556,\\\"pageCompId\\\":\\\"1546761824081985538\\\"},{\\\"component\\\":\\\"JQuickNav\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":26,\\\"i\\\":\\\"1e215e4d-89ea-4de8-bd33-9a392746b3cb\\\",\\\"y\\\":503,\\\"pageCompId\\\":\\\"1546761824081985539\\\"},{\\\"component\\\":\\\"JGrowCard\\\",\\\"w\\\":14,\\\"moved\\\":false,\\\"x\\\":10,\\\"h\\\":24,\\\"i\\\":\\\"12eaede2-77dd-4603-8c5a-7b914632ea38\\\",\\\"y\\\":479,\\\"pageCompId\\\":\\\"1546761824081985540\\\"},{\\\"component\\\":\\\"JProjectCard\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":12,\\\"h\\\":38,\\\"i\\\":\\\"baa68293-3cfc-4563-a841-d498652c934b\\\",\\\"y\\\":524,\\\"pageCompId\\\":\\\"1546761824081985541\\\"},{\\\"component\\\":\\\"JWaitMatter\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":12,\\\"h\\\":21,\\\"i\\\":\\\"2507f501-ec3f-4210-b980-c6544188fef8\\\",\\\"y\\\":503,\\\"pageCompId\\\":\\\"1546761824081985542\\\"},{\\\"component\\\":\\\"JDynamicInfo\\\",\\\"w\\\":12,\\\"moved\\\":false,\\\"x\\\":0,\\\"h\\\":27,\\\"i\\\":\\\"8837f7a2-d767-4ff4-8537-d6cd61b9312d\\\",\\\"y\\\":529,\\\"pageCompId\\\":\\\"1546761824081985543\\\"}]', '', '0', '1', 'admin', '2022-05-12 14:45:53', 'admin', '2022-07-12 15:42:11', NULL, NULL, 1, NULL, 0);\nINSERT INTO `onl_drag_page` VALUES ('910394028067438592', '库存管理可视化大屏', '/drag/page/view/910394028067438592', NULL, NULL, 100, 'default', 'default', NULL, NULL, '[{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":24,\\\"moved\\\":false,\\\"pcY\\\":0,\\\"x\\\":0,\\\"h\\\":8,\\\"i\\\":\\\"377bfc6b-26f1-4fb0-8fe1-0acbc39149e2\\\",\\\"y\\\":0,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"912577433139986432\\\"},{\\\"component\\\":\\\"JGrowCard\\\",\\\"pcX\\\":0,\\\"w\\\":24,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"x\\\":0,\\\"h\\\":31,\\\"i\\\":\\\"94fb7d28-1f93-4506-8310-f39f6ca8f356\\\",\\\"y\\\":8,\\\"orderNum\\\":10,\\\"pageCompId\\\":\\\"912577433169346560\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":39,\\\"x\\\":0,\\\"h\\\":5,\\\"i\\\":\\\"79eb8d80-8720-4dac-b4ab-a1bd295d3fa5\\\",\\\"y\\\":39,\\\"orderNum\\\":65,\\\"pageCompId\\\":\\\"912577433190318080\\\"},{\\\"component\\\":\\\"JList\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":44,\\\"x\\\":0,\\\"h\\\":11,\\\"i\\\":\\\"3e12ea9a-04b8-4f1a-819a-1666be83bb2c\\\",\\\"y\\\":44,\\\"orderNum\\\":51,\\\"pageCompId\\\":\\\"912577433207095296\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":55,\\\"x\\\":0,\\\"h\\\":5,\\\"i\\\":\\\"b1bc2b1b-4e38-4042-942d-50978e79236f\\\",\\\"y\\\":55,\\\"orderNum\\\":61,\\\"pageCompId\\\":\\\"912577433228066816\\\"},{\\\"component\\\":\\\"JList\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":60,\\\"x\\\":0,\\\"h\\\":11,\\\"i\\\":\\\"ee6f5621-53ef-4d0f-a6c9-fd33982b2be1\\\",\\\"y\\\":60,\\\"orderNum\\\":71,\\\"pageCompId\\\":\\\"912577433249038336\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":71,\\\"x\\\":0,\\\"h\\\":5,\\\"i\\\":\\\"9d1b768d-17ac-461b-8597-41a969fd1589\\\",\\\"y\\\":71,\\\"orderNum\\\":82,\\\"pageCompId\\\":\\\"912577433274204160\\\"},{\\\"component\\\":\\\"JList\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":76,\\\"x\\\":0,\\\"h\\\":11,\\\"i\\\":\\\"380b67f4-ada6-47df-83a0-83b9c62fa435\\\",\\\"y\\\":76,\\\"orderNum\\\":92,\\\"pageCompId\\\":\\\"912577433295175680\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":87,\\\"x\\\":0,\\\"h\\\":5,\\\"i\\\":\\\"0b6da57d-9804-4bfa-8ab8-54d690f8a09a\\\",\\\"y\\\":87,\\\"orderNum\\\":103,\\\"pageCompId\\\":\\\"912577433316147200\\\"},{\\\"component\\\":\\\"JList\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":92,\\\"x\\\":0,\\\"h\\\":11,\\\"i\\\":\\\"c2551fe6-5a8f-4d45-bb3a-aa86dd6b46cd\\\",\\\"y\\\":92,\\\"orderNum\\\":113,\\\"pageCompId\\\":\\\"912577433337118720\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"pcX\\\":5,\\\"w\\\":10,\\\"moved\\\":false,\\\"pcY\\\":39,\\\"x\\\":5,\\\"h\\\":20,\\\"i\\\":\\\"acecbdec-0b6b-4744-aeed-3f969e7915b6\\\",\\\"y\\\":39,\\\"orderNum\\\":124,\\\"pageCompId\\\":\\\"912577433366478848\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"pcX\\\":5,\\\"w\\\":10,\\\"moved\\\":false,\\\"pcY\\\":59,\\\"x\\\":5,\\\"h\\\":22,\\\"i\\\":\\\"a3420701-faac-4d38-b7e2-9c12c3dc45e2\\\",\\\"y\\\":59,\\\"orderNum\\\":124,\\\"pageCompId\\\":\\\"912577433387450368\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"pcX\\\":15,\\\"w\\\":9,\\\"moved\\\":false,\\\"pcY\\\":59,\\\"x\\\":15,\\\"h\\\":22,\\\"i\\\":\\\"a100e000-aee6-4138-8c72-0e4a830ec8de\\\",\\\"y\\\":59,\\\"orderNum\\\":124,\\\"pageCompId\\\":\\\"912577433408421888\\\"},{\\\"component\\\":\\\"JMultipleBar\\\",\\\"pcX\\\":15,\\\"w\\\":9,\\\"moved\\\":false,\\\"pcY\\\":81,\\\"x\\\":15,\\\"h\\\":22,\\\"i\\\":\\\"7d4ec916-020b-4f35-baff-87951bf2aa48\\\",\\\"y\\\":81,\\\"orderNum\\\":124,\\\"pageCompId\\\":\\\"912577433429393408\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"pcX\\\":0,\\\"w\\\":24,\\\"moved\\\":false,\\\"pcY\\\":110,\\\"x\\\":0,\\\"h\\\":45,\\\"i\\\":\\\"49592c96-4da5-4afb-9c15-fa7bea72bbc1\\\",\\\"y\\\":103,\\\"orderNum\\\":131,\\\"pageCompId\\\":\\\"912577433450364928\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"pcX\\\":15,\\\"w\\\":9,\\\"moved\\\":false,\\\"pcY\\\":39,\\\"x\\\":15,\\\"h\\\":20,\\\"i\\\":\\\"ed714128-19d1-4117-a7b0-029620389fda\\\",\\\"y\\\":39,\\\"orderNum\\\":148,\\\"pageCompId\\\":\\\"912577433471336448\\\"},{\\\"component\\\":\\\"JMultipleBar\\\",\\\"pcX\\\":5,\\\"w\\\":10,\\\"moved\\\":false,\\\"pcY\\\":81,\\\"x\\\":5,\\\"h\\\":22,\\\"i\\\":\\\"7bcdb3a7-eff0-4373-9911-e900d3e3ec7d\\\",\\\"y\\\":81,\\\"orderNum\\\":148,\\\"pageCompId\\\":\\\"912577433496502272\\\"}]', 'amVlY2cxMzE0', '0', '1', 'admin', '2024-01-25 15:07:40', 'admin', '2024-01-30 20:04:50', NULL, 0, 53, 5, 0);\nINSERT INTO `onl_drag_page` VALUES ('910475721247866880', '某电商公司销售运营看板', '/drag/page/view/910475721247866880', NULL, NULL, 100, 'default', 'default', NULL, NULL, '[{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":24,\\\"moved\\\":false,\\\"pcY\\\":0,\\\"x\\\":0,\\\"h\\\":8,\\\"i\\\":\\\"1aa60c03-aa11-400b-81a9-3a710ef7b17d\\\",\\\"y\\\":0,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"912579172505272320\\\"},{\\\"component\\\":\\\"JGrowCard\\\",\\\"pcX\\\":0,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":10,\\\"x\\\":0,\\\"h\\\":17,\\\"i\\\":\\\"3ab3538e-5195-452c-82a7-08a1768548bb\\\",\\\"y\\\":8,\\\"orderNum\\\":10,\\\"pageCompId\\\":\\\"912579172538826752\\\"},{\\\"component\\\":\\\"JBubbleMap\\\",\\\"pcX\\\":0,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":27,\\\"x\\\":0,\\\"h\\\":42,\\\"i\\\":\\\"79506e2d-bfca-410b-bd5f-3fc1791af798\\\",\\\"y\\\":25,\\\"orderNum\\\":26,\\\"pageCompId\\\":\\\"912579172559798272\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"pcX\\\":0,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":69,\\\"x\\\":0,\\\"h\\\":45,\\\"i\\\":\\\"cd448408-0e55-41b3-8ab7-3b7dd8657055\\\",\\\"y\\\":67,\\\"orderNum\\\":72,\\\"pageCompId\\\":\\\"912579172580769792\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"pcX\\\":8,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":10,\\\"x\\\":8,\\\"h\\\":35,\\\"i\\\":\\\"40b0322c-f6a9-4614-83b8-c77a086bc065\\\",\\\"y\\\":8,\\\"orderNum\\\":105,\\\"pageCompId\\\":\\\"912579172597547008\\\"},{\\\"component\\\":\\\"JNumber\\\",\\\"pcX\\\":13,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":10,\\\"x\\\":13,\\\"h\\\":17,\\\"i\\\":\\\"353858f6-fecf-4c42-81f4-537d24289a68\\\",\\\"y\\\":8,\\\"orderNum\\\":105,\\\"pageCompId\\\":\\\"912579172618518528\\\"},{\\\"component\\\":\\\"JNumber\\\",\\\"pcX\\\":13,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":27,\\\"x\\\":13,\\\"h\\\":18,\\\"i\\\":\\\"3a74f30d-8357-43c4-811c-a0a1c7201453\\\",\\\"y\\\":25,\\\"orderNum\\\":105,\\\"pageCompId\\\":\\\"912579172643684352\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"pcX\\\":18,\\\"w\\\":6,\\\"moved\\\":false,\\\"pcY\\\":10,\\\"x\\\":18,\\\"h\\\":35,\\\"i\\\":\\\"2bd80a2b-f848-49d6-875b-05897deac11c\\\",\\\"y\\\":8,\\\"orderNum\\\":105,\\\"pageCompId\\\":\\\"912579172664655872\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"pcX\\\":8,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":45,\\\"x\\\":8,\\\"h\\\":29,\\\"i\\\":\\\"043d13e0-4e90-47e4-8715-29cc400adeb1\\\",\\\"y\\\":43,\\\"orderNum\\\":105,\\\"pageCompId\\\":\\\"912579172685627392\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"pcX\\\":16,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":45,\\\"x\\\":16,\\\"h\\\":29,\\\"i\\\":\\\"4b5fbe15-8931-48bb-a0f0-67855e782af4\\\",\\\"y\\\":43,\\\"orderNum\\\":114,\\\"pageCompId\\\":\\\"912579172702404608\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"pcX\\\":8,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":74,\\\"x\\\":8,\\\"h\\\":40,\\\"i\\\":\\\"e2f99a5d-eaf4-4823-b1a7-eb0a878be363\\\",\\\"y\\\":72,\\\"orderNum\\\":114,\\\"pageCompId\\\":\\\"912579172719181824\\\"},{\\\"component\\\":\\\"JLine\\\",\\\"pcX\\\":16,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":74,\\\"x\\\":16,\\\"h\\\":40,\\\"i\\\":\\\"dad9aacc-549f-4418-8f55-8ca499aa83b4\\\",\\\"y\\\":72,\\\"orderNum\\\":114,\\\"pageCompId\\\":\\\"912579172740153344\\\"}]', 'amVlY2cxMzE0', '0', '1', 'admin', '2024-01-25 20:32:17', 'admin', '2024-01-30 20:07:19', NULL, 6902, 24, 5, 0);\nINSERT INTO `onl_drag_page` VALUES ('910744177604083712', '物业消防巡检状态', '/drag/page/view/910744177604083712', NULL, NULL, 100, 'default', 'default', NULL, NULL, '[{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":24,\\\"moved\\\":false,\\\"pcY\\\":0,\\\"x\\\":0,\\\"h\\\":8,\\\"i\\\":\\\"5d85e389-7ee4-40dd-8544-80049646ee34\\\",\\\"y\\\":0,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"912578020841668608\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":10,\\\"x\\\":0,\\\"h\\\":6,\\\"i\\\":\\\"878306f4-8ff4-412c-b8d8-744b0897ae8f\\\",\\\"y\\\":8,\\\"orderNum\\\":10,\\\"pageCompId\\\":\\\"912578020875223040\\\"},{\\\"component\\\":\\\"JList\\\",\\\"pcX\\\":0,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":20,\\\"x\\\":0,\\\"h\\\":17,\\\"i\\\":\\\"fe852828-ba3d-46d1-884a-1c723b870d55\\\",\\\"y\\\":14,\\\"orderNum\\\":20,\\\"pageCompId\\\":\\\"912578020896194560\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":37,\\\"x\\\":0,\\\"h\\\":7,\\\"i\\\":\\\"57fd4478-440a-4a6e-a115-186e14d5047a\\\",\\\"y\\\":31,\\\"orderNum\\\":38,\\\"pageCompId\\\":\\\"912578020917166080\\\"},{\\\"component\\\":\\\"JNumber\\\",\\\"pcX\\\":0,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":47,\\\"x\\\":0,\\\"h\\\":12,\\\"i\\\":\\\"bb98b9db-042b-445e-8672-34182191871d\\\",\\\"y\\\":38,\\\"orderNum\\\":48,\\\"pageCompId\\\":\\\"912578020938137600\\\"},{\\\"component\\\":\\\"JNumber\\\",\\\"pcX\\\":0,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":57,\\\"x\\\":0,\\\"h\\\":12,\\\"i\\\":\\\"7eeab8ac-66f7-4d80-81a8-2e75dcb7093a\\\",\\\"y\\\":50,\\\"orderNum\\\":58,\\\"pageCompId\\\":\\\"912578020959109120\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":67,\\\"x\\\":0,\\\"h\\\":7,\\\"i\\\":\\\"d7a87bcb-e5a6-4092-9b44-be37c284761d\\\",\\\"y\\\":62,\\\"orderNum\\\":69,\\\"pageCompId\\\":\\\"912578020980080640\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"pcX\\\":0,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":77,\\\"x\\\":0,\\\"h\\\":51,\\\"i\\\":\\\"1397ca94-7293-48bd-bb4f-673355c0355e\\\",\\\"y\\\":69,\\\"orderNum\\\":79,\\\"pageCompId\\\":\\\"912578021005246464\\\"},{\\\"component\\\":\\\"JBubbleMap\\\",\\\"pcX\\\":8,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":20,\\\"x\\\":8,\\\"h\\\":32,\\\"i\\\":\\\"f0f84536-4ae3-43ff-aadb-6a1f113b1ab9\\\",\\\"y\\\":14,\\\"orderNum\\\":109,\\\"pageCompId\\\":\\\"912578021026217984\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":8,\\\"w\\\":16,\\\"moved\\\":false,\\\"pcY\\\":10,\\\"x\\\":8,\\\"h\\\":6,\\\"i\\\":\\\"52c28b77-268c-4dc4-805e-a48b37657be1\\\",\\\"y\\\":8,\\\"orderNum\\\":109,\\\"pageCompId\\\":\\\"912578021047189504\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"pcX\\\":16,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":20,\\\"x\\\":16,\\\"h\\\":32,\\\"i\\\":\\\"8b2b0a47-c1fb-47bf-b8af-9c249d903baa\\\",\\\"y\\\":14,\\\"orderNum\\\":109,\\\"pageCompId\\\":\\\"912578021068161024\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"pcX\\\":8,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":52,\\\"x\\\":8,\\\"h\\\":34,\\\"i\\\":\\\"619921d9-f1fe-4d09-8f3d-09238f6d3e4f\\\",\\\"y\\\":46,\\\"orderNum\\\":109,\\\"pageCompId\\\":\\\"912578021093326848\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"pcX\\\":16,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":52,\\\"x\\\":16,\\\"h\\\":34,\\\"i\\\":\\\"2598e9f8-7611-49c1-97a5-018fba23f0e0\\\",\\\"y\\\":46,\\\"orderNum\\\":109,\\\"pageCompId\\\":\\\"912578021114298368\\\"},{\\\"component\\\":\\\"JLine\\\",\\\"pcX\\\":8,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":98,\\\"x\\\":8,\\\"h\\\":33,\\\"i\\\":\\\"01569400-637c-4d01-986e-c6604f88cc32\\\",\\\"y\\\":87,\\\"orderNum\\\":109,\\\"pageCompId\\\":\\\"912578021131075584\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"pcX\\\":16,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":86,\\\"x\\\":16,\\\"h\\\":33,\\\"i\\\":\\\"4fd26be3-3138-4cf5-9e7a-e24ff75bafad\\\",\\\"y\\\":87,\\\"orderNum\\\":114,\\\"pageCompId\\\":\\\"912578021156241408\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":8,\\\"w\\\":16,\\\"moved\\\":false,\\\"pcY\\\":86,\\\"x\\\":8,\\\"h\\\":7,\\\"i\\\":\\\"e3bea36a-c897-41ec-9c8d-c572609a74e5\\\",\\\"y\\\":80,\\\"orderNum\\\":114,\\\"pageCompId\\\":\\\"912578021181407232\\\"}]', 'amVlY2cxMzE0', '0', '1', 'admin', '2024-01-26 14:19:02', 'admin', '2024-01-31 15:46:14', NULL, 6902, 35, 5, 0);\nINSERT INTO `onl_drag_page` VALUES ('910820508471705600', '某连锁饮品销售看板', '/drag/page/view/910820508471705600', NULL, NULL, 100, 'default', 'default', NULL, NULL, '[{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":15,\\\"moved\\\":false,\\\"pcY\\\":0,\\\"x\\\":0,\\\"h\\\":10,\\\"i\\\":\\\"dcd6e80e-8865-4238-844b-2bb8998f755e\\\",\\\"y\\\":0,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"912577878868672512\\\"},{\\\"component\\\":\\\"JForm\\\",\\\"pcX\\\":15,\\\"w\\\":9,\\\"moved\\\":false,\\\"pcY\\\":0,\\\"x\\\":15,\\\"h\\\":10,\\\"i\\\":\\\"50040bd1-c081-4e5b-a36a-ea6a5afce396\\\",\\\"y\\\":0,\\\"orderNum\\\":10,\\\"pageCompId\\\":\\\"912577878898032640\\\"},{\\\"component\\\":\\\"JGrowCard\\\",\\\"pcX\\\":0,\\\"w\\\":24,\\\"moved\\\":false,\\\"pcY\\\":10,\\\"x\\\":0,\\\"h\\\":30,\\\"i\\\":\\\"0efe3637-39ac-4f2e-82f4-e09540ee332a\\\",\\\"y\\\":10,\\\"orderNum\\\":10,\\\"pageCompId\\\":\\\"912577878919004160\\\"},{\\\"component\\\":\\\"JNumber\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":40,\\\"x\\\":0,\\\"h\\\":17,\\\"i\\\":\\\"2db8c9de-9f8b-49f8-8d7a-6b3166de0ed5\\\",\\\"y\\\":40,\\\"orderNum\\\":40,\\\"pageCompId\\\":\\\"912577878944169984\\\"},{\\\"component\\\":\\\"JNumber\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":57,\\\"x\\\":0,\\\"h\\\":16,\\\"i\\\":\\\"6f773617-eca8-4598-8260-dc701cc16e8b\\\",\\\"y\\\":57,\\\"orderNum\\\":50,\\\"pageCompId\\\":\\\"912577878965141504\\\"},{\\\"component\\\":\\\"JNumber\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":73,\\\"x\\\":0,\\\"h\\\":16,\\\"i\\\":\\\"868c63d3-cfc2-4e49-a1c5-6ee0418fd303\\\",\\\"y\\\":73,\\\"orderNum\\\":59,\\\"pageCompId\\\":\\\"912577878990307328\\\"},{\\\"component\\\":\\\"JNumber\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":89,\\\"x\\\":0,\\\"h\\\":17,\\\"i\\\":\\\"35a7308b-0482-48c8-8e46-ed50cfb67961\\\",\\\"y\\\":89,\\\"orderNum\\\":83,\\\"pageCompId\\\":\\\"912577879023861760\\\"},{\\\"component\\\":\\\"JLine\\\",\\\"pcX\\\":5,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":40,\\\"x\\\":5,\\\"h\\\":23,\\\"i\\\":\\\"2323a8fb-42ff-4a23-9b13-8f4f514dafb5\\\",\\\"y\\\":40,\\\"orderNum\\\":96,\\\"pageCompId\\\":\\\"912577879044833280\\\"},{\\\"component\\\":\\\"JLine\\\",\\\"pcX\\\":5,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":63,\\\"x\\\":5,\\\"h\\\":22,\\\"i\\\":\\\"715ebf76-9228-4b2e-8ab7-dcb351c2ff03\\\",\\\"y\\\":63,\\\"orderNum\\\":96,\\\"pageCompId\\\":\\\"912577879065804800\\\"},{\\\"component\\\":\\\"JLine\\\",\\\"pcX\\\":5,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":85,\\\"x\\\":5,\\\"h\\\":21,\\\"i\\\":\\\"cd981a55-258c-48cd-8e92-742185a711a3\\\",\\\"y\\\":85,\\\"orderNum\\\":96,\\\"pageCompId\\\":\\\"912577879086776320\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"pcX\\\":13,\\\"w\\\":11,\\\"moved\\\":false,\\\"pcY\\\":40,\\\"x\\\":13,\\\"h\\\":33,\\\"i\\\":\\\"82016a70-aa98-42cb-b205-c14e5e212cf8\\\",\\\"y\\\":40,\\\"orderNum\\\":106,\\\"pageCompId\\\":\\\"912577879103553536\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"pcX\\\":13,\\\"w\\\":6,\\\"moved\\\":false,\\\"pcY\\\":73,\\\"x\\\":13,\\\"h\\\":33,\\\"i\\\":\\\"0b68bd42-a0e9-48f8-9a7b-794ba9ebf8cf\\\",\\\"y\\\":73,\\\"orderNum\\\":106,\\\"pageCompId\\\":\\\"912577879116136448\\\"},{\\\"component\\\":\\\"JRing\\\",\\\"pcX\\\":19,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":73,\\\"x\\\":19,\\\"h\\\":33,\\\"i\\\":\\\"5130130f-6076-45b1-8977-d9b5a4c894fc\\\",\\\"y\\\":73,\\\"orderNum\\\":106,\\\"pageCompId\\\":\\\"912577879132913664\\\"}]', 'amVlY2cxMzE0', '0', '1', 'admin', '2024-01-26 19:22:21', 'admin', '2024-01-29 15:56:38', NULL, 6902, 36, 3, 0);\nINSERT INTO `onl_drag_page` VALUES ('911856216581914624', '产品销售数据', '/drag/page/view/911856216581914624', NULL, NULL, 100, 'default', 'default', NULL, NULL, '[{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":24,\\\"moved\\\":false,\\\"pcY\\\":0,\\\"x\\\":0,\\\"h\\\":8,\\\"i\\\":\\\"8faf5811-d619-4ff2-839e-86ecb4e0328f\\\",\\\"y\\\":0,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"912581733916393472\\\"},{\\\"component\\\":\\\"JRing\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"x\\\":0,\\\"h\\\":30,\\\"i\\\":\\\"b5fa4269-1d38-4a62-80a3-52490943ff59\\\",\\\"y\\\":8,\\\"orderNum\\\":38,\\\"pageCompId\\\":\\\"912581733949947904\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"pcX\\\":0,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":38,\\\"x\\\":0,\\\"h\\\":41,\\\"i\\\":\\\"de23faa0-ffa7-482c-857e-8dbfaea7dd47\\\",\\\"y\\\":38,\\\"orderNum\\\":38,\\\"pageCompId\\\":\\\"912581733975113728\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":5,\\\"w\\\":4,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"x\\\":5,\\\"h\\\":5,\\\"i\\\":\\\"f2158c50-22b0-4978-98b9-6e2cc784650e\\\",\\\"y\\\":8,\\\"orderNum\\\":84,\\\"pageCompId\\\":\\\"912581734000279552\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":5,\\\"w\\\":4,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"x\\\":5,\\\"h\\\":5,\\\"i\\\":\\\"a28c1804-cb6b-4c70-8e57-ce352ff09d63\\\",\\\"y\\\":13,\\\"orderNum\\\":84,\\\"pageCompId\\\":\\\"912581734025445376\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":5,\\\"w\\\":4,\\\"moved\\\":false,\\\"pcY\\\":18,\\\"x\\\":5,\\\"h\\\":5,\\\"i\\\":\\\"63506dd7-e376-42c5-b39f-b2211ad8ebdc\\\",\\\"y\\\":18,\\\"orderNum\\\":84,\\\"pageCompId\\\":\\\"912581734050611200\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":9,\\\"w\\\":4,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"x\\\":9,\\\"h\\\":5,\\\"i\\\":\\\"de7e9a36-1234-4792-835a-c20687c433ed\\\",\\\"y\\\":8,\\\"orderNum\\\":84,\\\"pageCompId\\\":\\\"912581734084165632\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":9,\\\"w\\\":4,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"x\\\":9,\\\"h\\\":5,\\\"i\\\":\\\"ee6464c3-bda1-424a-8c0f-37fdfce6d8cb\\\",\\\"y\\\":13,\\\"orderNum\\\":84,\\\"pageCompId\\\":\\\"912581734113525760\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":9,\\\"w\\\":4,\\\"moved\\\":false,\\\"pcY\\\":18,\\\"x\\\":9,\\\"h\\\":5,\\\"i\\\":\\\"c6de77fa-b17a-4549-bda8-0e00e65a7748\\\",\\\"y\\\":18,\\\"orderNum\\\":84,\\\"pageCompId\\\":\\\"912581734138691584\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":13,\\\"w\\\":4,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"x\\\":13,\\\"h\\\":5,\\\"i\\\":\\\"3dc483bb-0067-48ee-98bd-dfa2e7534909\\\",\\\"y\\\":8,\\\"orderNum\\\":84,\\\"pageCompId\\\":\\\"912581734163857408\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":13,\\\"w\\\":4,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"x\\\":13,\\\"h\\\":10,\\\"i\\\":\\\"ecd623a6-2e08-47f2-8dd6-c25ff5c29a66\\\",\\\"y\\\":13,\\\"orderNum\\\":84,\\\"pageCompId\\\":\\\"912581734189023232\\\"},{\\\"component\\\":\\\"JLine\\\",\\\"pcX\\\":5,\\\"w\\\":12,\\\"moved\\\":false,\\\"pcY\\\":23,\\\"x\\\":5,\\\"h\\\":27,\\\"i\\\":\\\"b910f04d-6a4d-4d79-811d-dc5d2f807713\\\",\\\"y\\\":23,\\\"orderNum\\\":83,\\\"pageCompId\\\":\\\"912581734209994752\\\"},{\\\"component\\\":\\\"JStackBar\\\",\\\"pcX\\\":5,\\\"w\\\":12,\\\"moved\\\":false,\\\"pcY\\\":50,\\\"x\\\":5,\\\"h\\\":29,\\\"i\\\":\\\"406be0c9-dc13-4cad-ac22-17a4a5c22bff\\\",\\\"y\\\":50,\\\"orderNum\\\":83,\\\"pageCompId\\\":\\\"912581734230966272\\\"},{\\\"component\\\":\\\"JRing\\\",\\\"pcX\\\":17,\\\"w\\\":7,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"x\\\":17,\\\"h\\\":32,\\\"i\\\":\\\"76d16482-fd7f-4e92-ba27-68980b8b0029\\\",\\\"y\\\":8,\\\"orderNum\\\":83,\\\"pageCompId\\\":\\\"912581734256132096\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":17,\\\"w\\\":7,\\\"moved\\\":false,\\\"pcY\\\":40,\\\"x\\\":17,\\\"h\\\":5,\\\"i\\\":\\\"211ebf49-1284-4b1c-99c9-08066a50f9ae\\\",\\\"y\\\":40,\\\"orderNum\\\":82,\\\"pageCompId\\\":\\\"912581734272909312\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"pcX\\\":17,\\\"w\\\":7,\\\"moved\\\":false,\\\"pcY\\\":45,\\\"x\\\":17,\\\"h\\\":34,\\\"i\\\":\\\"c89556db-678a-418b-8121-1052958f4149\\\",\\\"y\\\":45,\\\"orderNum\\\":115,\\\"pageCompId\\\":\\\"912581734289686528\\\"}]', 'amVlY2cxMzE0', '0', '1', 'admin', '2024-01-29 15:57:53', 'admin', '2024-01-30 14:21:56', NULL, 6902, 24, 0, 0);\nINSERT INTO `onl_drag_page` VALUES ('924603858451734528', '公司年度招聘看板', '/drag/page/view/924603858451734528', NULL, NULL, 100, 'default', 'default', NULL, NULL, '[{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":0,\\\"h\\\":8,\\\"i\\\":\\\"95729a29-9b15-4102-8ca0-4474bcdfd6ea\\\",\\\"orderNum\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":0,\\\"pageCompId\\\":\\\"925744261272031232\\\",\\\"key\\\":\\\"c65d42a5-a824-49a9-83c0-c4596aa219d4\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":6,\\\"i\\\":\\\"89ac8d65-5a17-4c62-83cc-05f29f629734\\\",\\\"orderNum\\\":13,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":0,\\\"y\\\":13,\\\"pageCompId\\\":\\\"925744261330751488\\\",\\\"key\\\":\\\"45bb9ca9-ade1-44b4-8a8c-f912aa5920b6\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":19,\\\"h\\\":6,\\\"i\\\":\\\"f5f244fb-deed-48eb-8ada-78dadbe08bd8\\\",\\\"orderNum\\\":21,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":0,\\\"y\\\":19,\\\"pageCompId\\\":\\\"925744261351723008\\\",\\\"key\\\":\\\"37d8b7ad-6b59-480f-8af1-c44a03ffca00\\\"},{\\\"pcX\\\":3,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":6,\\\"i\\\":\\\"de17aaaf-b81c-48b3-8309-854b1d0b3d14\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":3,\\\"y\\\":13,\\\"pageCompId\\\":\\\"925744261381083136\\\",\\\"key\\\":\\\"41b3d153-7e04-4751-94a3-2f6b466e9424\\\"},{\\\"pcX\\\":3,\\\"moved\\\":false,\\\"pcY\\\":19,\\\"h\\\":6,\\\"i\\\":\\\"2df4f63e-b1a9-4a53-8972-08947f5f011b\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":3,\\\"y\\\":19,\\\"pageCompId\\\":\\\"925744261402054656\\\",\\\"key\\\":\\\"e065a06b-e251-42b3-8ecf-e115459ae476\\\"},{\\\"pcX\\\":6,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":16,\\\"i\\\":\\\"2429182c-a58b-4cd9-8c88-8ad9b2b6a1e2\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JRing\\\",\\\"w\\\":6,\\\"x\\\":6,\\\"y\\\":13,\\\"pageCompId\\\":\\\"925744261427220480\\\",\\\"key\\\":\\\"0bd2ecf1-d948-411c-8c49-09530f9ccae0\\\"},{\\\"pcX\\\":12,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":31,\\\"i\\\":\\\"33c42a31-ee7f-4f0a-b9bb-280bef0f4c02\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JBubbleMap\\\",\\\"w\\\":6,\\\"x\\\":12,\\\"y\\\":13,\\\"pageCompId\\\":\\\"925744261464969216\\\",\\\"key\\\":\\\"6f298d57-db77-4801-9dc8-76b14967300f\\\"},{\\\"pcX\\\":18,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":31,\\\"i\\\":\\\"59cce641-ef13-4a49-835b-4ad20a3cc477\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JFunnel\\\",\\\"w\\\":6,\\\"x\\\":18,\\\"y\\\":13,\\\"pageCompId\\\":\\\"925744261490135040\\\",\\\"key\\\":\\\"e8e525b9-051b-4f45-88ec-00dfcca1ffc8\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"6979473b-9eb1-4d90-887c-483378b89886\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JText\\\",\\\"w\\\":6,\\\"x\\\":0,\\\"y\\\":8,\\\"pageCompId\\\":\\\"925744261519495168\\\",\\\"key\\\":\\\"79a6e469-54b4-46dd-88f2-896c07e6ec0b\\\"},{\\\"pcX\\\":6,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"fabcd19e-73a2-4a44-9035-d18bccfa77ba\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JText\\\",\\\"w\\\":12,\\\"x\\\":6,\\\"y\\\":8,\\\"pageCompId\\\":\\\"925744261544660992\\\",\\\"key\\\":\\\"808ca03a-2f22-4f5e-851b-cdd19a2e059d\\\"},{\\\"pcX\\\":18,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"e5eb46cd-4d1a-447e-b42a-6e390fa7080e\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JText\\\",\\\"w\\\":6,\\\"x\\\":18,\\\"y\\\":8,\\\"pageCompId\\\":\\\"925744261569826816\\\",\\\"key\\\":\\\"8b2edadf-cdaf-43f4-86a1-2735219e5980\\\"},{\\\"pcX\\\":6,\\\"moved\\\":false,\\\"pcY\\\":29,\\\"h\\\":15,\\\"i\\\":\\\"a53c49e6-435a-402d-8de1-b8644b87486b\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JPie\\\",\\\"w\\\":6,\\\"x\\\":6,\\\"y\\\":29,\\\"pageCompId\\\":\\\"925744261594992640\\\",\\\"key\\\":\\\"e8bdb58d-8950-4791-93dd-37a064e886f4\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":25,\\\"h\\\":19,\\\"i\\\":\\\"f42ce4f9-0e56-47da-8220-254436afea6d\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JSmoothLine\\\",\\\"w\\\":6,\\\"x\\\":0,\\\"y\\\":25,\\\"pageCompId\\\":\\\"925744261615964160\\\",\\\"key\\\":\\\"891346e4-3bb3-46d0-af0d-da0a6cc118b8\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":6,\\\"moved\\\":false,\\\"pcY\\\":44,\\\"x\\\":0,\\\"h\\\":5,\\\"i\\\":\\\"102fa102-3bd7-4e86-83ea-77cc7ef23651\\\",\\\"y\\\":44,\\\"orderNum\\\":44,\\\"pageCompId\\\":\\\"925744261636935680\\\"},{\\\"component\\\":\\\"JMultipleBar\\\",\\\"pcX\\\":0,\\\"w\\\":6,\\\"moved\\\":false,\\\"pcY\\\":49,\\\"x\\\":0,\\\"h\\\":29,\\\"i\\\":\\\"6841deb3-d062-42d8-8a2b-b58f6da64159\\\",\\\"y\\\":49,\\\"orderNum\\\":49,\\\"pageCompId\\\":\\\"925744261662101504\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"pcX\\\":6,\\\"w\\\":12,\\\"moved\\\":false,\\\"pcY\\\":49,\\\"x\\\":6,\\\"h\\\":29,\\\"i\\\":\\\"92758754-3165-4df6-a897-6da821492f81\\\",\\\"y\\\":49,\\\"orderNum\\\":69,\\\"pageCompId\\\":\\\"925744261687267328\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":6,\\\"w\\\":12,\\\"moved\\\":false,\\\"pcY\\\":44,\\\"x\\\":6,\\\"h\\\":5,\\\"i\\\":\\\"201a48c1-924c-4da0-87e5-9dc0eb2579a9\\\",\\\"y\\\":44,\\\"orderNum\\\":69,\\\"pageCompId\\\":\\\"925744261712433152\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":18,\\\"w\\\":6,\\\"moved\\\":false,\\\"pcY\\\":44,\\\"x\\\":18,\\\"h\\\":5,\\\"i\\\":\\\"7e2ecc0a-7930-4c76-9c9a-76af22a58f59\\\",\\\"y\\\":44,\\\"orderNum\\\":78,\\\"pageCompId\\\":\\\"925744261745987584\\\"},{\\\"component\\\":\\\"JStackBar\\\",\\\"pcX\\\":18,\\\"w\\\":6,\\\"moved\\\":false,\\\"pcY\\\":49,\\\"x\\\":18,\\\"h\\\":29,\\\"i\\\":\\\"a9f3e66d-cfcd-41bb-908b-fc2e95cdb125\\\",\\\"y\\\":49,\\\"orderNum\\\":78,\\\"pageCompId\\\":\\\"925744261766959104\\\"}]', 'amVlY2cxMzE0', '0', '1', 'admin', '2024-03-04 20:12:28', 'admin', '2024-03-13 14:05:31', NULL, 1, 41, 8, 0);\nINSERT INTO `onl_drag_page` VALUES ('925744661614153728', '金融封控数据展示', '/drag/page/view/925744661614153728', NULL, NULL, 100, 'default', 'default', NULL, NULL, '[{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":0,\\\"h\\\":8,\\\"i\\\":\\\"95729a29-9b15-4102-8ca0-4474bcdfd6ea\\\",\\\"orderNum\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":0,\\\"pageCompId\\\":\\\"925962667610906624\\\",\\\"key\\\":\\\"e39b1e6d-dca7-4223-866f-e2e28f1233da\\\"},{\\\"pcX\\\":9,\\\"moved\\\":false,\\\"pcY\\\":14,\\\"h\\\":6,\\\"i\\\":\\\"89ac8d65-5a17-4c62-83cc-05f29f629734\\\",\\\"orderNum\\\":13,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":9,\\\"y\\\":15,\\\"pageCompId\\\":\\\"925962667648655360\\\",\\\"key\\\":\\\"8c8d6017-40e4-49ae-8acb-74aa3f01d1b8\\\"},{\\\"pcX\\\":9,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":7,\\\"i\\\":\\\"f5f244fb-deed-48eb-8ada-78dadbe08bd8\\\",\\\"orderNum\\\":21,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":9,\\\"y\\\":8,\\\"pageCompId\\\":\\\"925962667665432576\\\",\\\"key\\\":\\\"c57cfb37-3333-4fb3-9033-211cc6b63607\\\"},{\\\"pcX\\\":12,\\\"moved\\\":false,\\\"pcY\\\":14,\\\"h\\\":6,\\\"i\\\":\\\"de17aaaf-b81c-48b3-8309-854b1d0b3d14\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":12,\\\"y\\\":15,\\\"pageCompId\\\":\\\"925962667682209792\\\",\\\"key\\\":\\\"e131ddbd-2c02-4c99-b635-2453739987c2\\\"},{\\\"pcX\\\":12,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":7,\\\"i\\\":\\\"2df4f63e-b1a9-4a53-8972-08947f5f011b\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":12,\\\"y\\\":8,\\\"pageCompId\\\":\\\"925962667698987008\\\",\\\"key\\\":\\\"650b2a2e-b0c2-4644-8131-d6bfb1d937b7\\\"},{\\\"pcX\\\":9,\\\"moved\\\":false,\\\"pcY\\\":19,\\\"h\\\":6,\\\"i\\\":\\\"6979473b-9eb1-4d90-887c-483378b89886\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":9,\\\"y\\\":21,\\\"pageCompId\\\":\\\"925962667715764224\\\",\\\"key\\\":\\\"11408620-748c-40bb-9cb2-a38e14e099bb\\\"},{\\\"pcX\\\":9,\\\"moved\\\":false,\\\"pcY\\\":24,\\\"h\\\":6,\\\"i\\\":\\\"fabcd19e-73a2-4a44-9035-d18bccfa77ba\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":9,\\\"y\\\":27,\\\"pageCompId\\\":\\\"925962667732541440\\\",\\\"key\\\":\\\"ee880781-7379-4234-9fa0-5e838d2f8bc7\\\"},{\\\"pcX\\\":12,\\\"moved\\\":false,\\\"pcY\\\":19,\\\"h\\\":6,\\\"i\\\":\\\"e5eb46cd-4d1a-447e-b42a-6e390fa7080e\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":12,\\\"y\\\":21,\\\"pageCompId\\\":\\\"925962667753512960\\\",\\\"key\\\":\\\"55e04041-6770-48f4-905a-2e6296904162\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":58,\\\"h\\\":35,\\\"i\\\":\\\"a53c49e6-435a-402d-8de1-b8644b87486b\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JPie\\\",\\\"w\\\":8,\\\"x\\\":0,\\\"y\\\":57,\\\"pageCompId\\\":\\\"925962667774484480\\\",\\\"key\\\":\\\"d4994845-fc96-4961-90b3-df812b410b92\\\"},{\\\"pcX\\\":15,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":7,\\\"i\\\":\\\"102fa102-3bd7-4e86-83ea-77cc7ef23651\\\",\\\"orderNum\\\":44,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":15,\\\"y\\\":8,\\\"pageCompId\\\":\\\"925962667795456000\\\",\\\"key\\\":\\\"7c8b661f-534e-4ab2-83d9-b845bdb6223f\\\"},{\\\"pcX\\\":15,\\\"moved\\\":false,\\\"pcY\\\":14,\\\"h\\\":6,\\\"i\\\":\\\"201a48c1-924c-4da0-87e5-9dc0eb2579a9\\\",\\\"orderNum\\\":69,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":15,\\\"y\\\":15,\\\"pageCompId\\\":\\\"925962667808038912\\\",\\\"key\\\":\\\"04880935-83e1-41aa-809e-8a1127b1beb3\\\"},{\\\"pcX\\\":12,\\\"moved\\\":false,\\\"pcY\\\":24,\\\"h\\\":6,\\\"i\\\":\\\"7e2ecc0a-7930-4c76-9c9a-76af22a58f59\\\",\\\"orderNum\\\":78,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":12,\\\"y\\\":27,\\\"pageCompId\\\":\\\"925962667824816128\\\",\\\"key\\\":\\\"c208c5a6-fd09-4af5-893e-d678187887eb\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":25,\\\"i\\\":\\\"aafdcd2d-abec-48e5-8040-cc237cc70dec\\\",\\\"orderNum\\\":78,\\\"component\\\":\\\"JDynamicBar\\\",\\\"w\\\":9,\\\"x\\\":0,\\\"y\\\":8,\\\"pageCompId\\\":\\\"925962667841593344\\\",\\\"key\\\":\\\"a5a17907-3563-4fe6-8081-d4e3eaf0c942\\\"},{\\\"pcX\\\":15,\\\"moved\\\":false,\\\"pcY\\\":19,\\\"h\\\":6,\\\"i\\\":\\\"f5027ec2-646c-4d37-ac73-bd1718720bb6\\\",\\\"orderNum\\\":97,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":15,\\\"y\\\":21,\\\"pageCompId\\\":\\\"925962667858370560\\\",\\\"key\\\":\\\"10b2e5a9-c158-4a78-83c1-bc907c27df9c\\\"},{\\\"pcX\\\":15,\\\"moved\\\":false,\\\"pcY\\\":24,\\\"h\\\":6,\\\"i\\\":\\\"e2996773-4ddf-4f80-9139-4b5edc91c0ff\\\",\\\"orderNum\\\":97,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":15,\\\"y\\\":27,\\\"pageCompId\\\":\\\"925962667875147776\\\",\\\"key\\\":\\\"e5b27b79-7618-42b7-8bb2-6f93102f48e6\\\"},{\\\"pcX\\\":8,\\\"moved\\\":false,\\\"pcY\\\":29,\\\"h\\\":29,\\\"i\\\":\\\"3785fa0d-410c-46d4-8942-d02ddfe884fc\\\",\\\"orderNum\\\":97,\\\"component\\\":\\\"JMultipleLine\\\",\\\"w\\\":10,\\\"x\\\":8,\\\"y\\\":33,\\\"pageCompId\\\":\\\"925962667896119296\\\",\\\"key\\\":\\\"cfde0604-580b-4faa-8e45-3922eac1bfd1\\\"},{\\\"pcX\\\":18,\\\"moved\\\":false,\\\"pcY\\\":38,\\\"h\\\":28,\\\"i\\\":\\\"ae1c0095-453d-49ff-8742-252645fd3ca4\\\",\\\"orderNum\\\":97,\\\"component\\\":\\\"JPie\\\",\\\"w\\\":6,\\\"x\\\":18,\\\"y\\\":38,\\\"pageCompId\\\":\\\"925962667912896512\\\",\\\"key\\\":\\\"55ff9177-3aa9-4ba4-8628-1da43691633d\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":34,\\\"h\\\":24,\\\"i\\\":\\\"8dede0fc-a267-444a-a8ae-c224bb922d3a\\\",\\\"orderNum\\\":80,\\\"component\\\":\\\"JRing\\\",\\\"w\\\":8,\\\"x\\\":0,\\\"y\\\":33,\\\"pageCompId\\\":\\\"925962667938062336\\\",\\\"key\\\":\\\"91ec2e06-a569-489a-8806-08c37b8f2303\\\"},{\\\"pcX\\\":18,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":30,\\\"i\\\":\\\"e296cec4-664c-49d7-8922-61cde992b42b\\\",\\\"orderNum\\\":103,\\\"component\\\":\\\"JRing\\\",\\\"w\\\":6,\\\"x\\\":18,\\\"y\\\":8,\\\"pageCompId\\\":\\\"925962667954839552\\\",\\\"key\\\":\\\"d7227958-f9b0-400a-89fa-7440b70c3c44\\\"},{\\\"component\\\":\\\"JDynamicBar\\\",\\\"pcX\\\":8,\\\"w\\\":10,\\\"moved\\\":false,\\\"pcY\\\":58,\\\"x\\\":8,\\\"h\\\":30,\\\"i\\\":\\\"482a7ccc-51f1-40b5-9204-308be3ecc5f1\\\",\\\"y\\\":62,\\\"orderNum\\\":90,\\\"pageCompId\\\":\\\"925962667967422464\\\"}]', 'amVlY2cxMzE0', '0', '1', 'admin', '2024-03-07 23:45:37', 'admin', '2024-03-13 14:05:28', NULL, 1, 67, 9, 0);\nINSERT INTO `onl_drag_page` VALUES ('925966805971279872', '车间生产管理', '/drag/page/view/925966805971279872', NULL, NULL, 100, 'default', 'default', NULL, NULL, '[{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":0,\\\"h\\\":8,\\\"i\\\":\\\"95729a29-9b15-4102-8ca0-4474bcdfd6ea\\\",\\\"orderNum\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":0,\\\"pageCompId\\\":\\\"925987666560327680\\\",\\\"key\\\":\\\"24ecfee4-be3c-47e7-a7f7-ee0af996e966\\\"},{\\\"pcX\\\":6,\\\"moved\\\":false,\\\"pcY\\\":14,\\\"h\\\":5,\\\"i\\\":\\\"89ac8d65-5a17-4c62-83cc-05f29f629734\\\",\\\"orderNum\\\":13,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":6,\\\"y\\\":14,\\\"pageCompId\\\":\\\"925987666589687808\\\",\\\"key\\\":\\\"bac10715-7e2f-4408-821e-d300c96bb3f3\\\"},{\\\"pcX\\\":6,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":6,\\\"i\\\":\\\"f5f244fb-deed-48eb-8ada-78dadbe08bd8\\\",\\\"orderNum\\\":21,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":6,\\\"y\\\":8,\\\"pageCompId\\\":\\\"925987666602270720\\\",\\\"key\\\":\\\"db0e5681-9481-4eab-b8c5-f7cd25d3310c\\\"},{\\\"pcX\\\":9,\\\"moved\\\":false,\\\"pcY\\\":14,\\\"h\\\":5,\\\"i\\\":\\\"de17aaaf-b81c-48b3-8309-854b1d0b3d14\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":9,\\\"y\\\":14,\\\"pageCompId\\\":\\\"925987666619047936\\\",\\\"key\\\":\\\"fff5d5ab-f352-44ae-8fd7-2f71d761d77a\\\"},{\\\"pcX\\\":9,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":6,\\\"i\\\":\\\"2df4f63e-b1a9-4a53-8972-08947f5f011b\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":9,\\\"y\\\":8,\\\"pageCompId\\\":\\\"925987666640019456\\\",\\\"key\\\":\\\"96a44d9e-9d2e-4c8f-ac1d-b5298abe91d9\\\"},{\\\"pcX\\\":18,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":31,\\\"i\\\":\\\"59cce641-ef13-4a49-835b-4ad20a3cc477\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JFunnel\\\",\\\"w\\\":6,\\\"x\\\":18,\\\"y\\\":13,\\\"pageCompId\\\":\\\"925987666660990976\\\",\\\"key\\\":\\\"1f16d847-f33b-4019-80fb-0395a9df514f\\\"},{\\\"pcX\\\":15,\\\"moved\\\":false,\\\"pcY\\\":14,\\\"h\\\":5,\\\"i\\\":\\\"6979473b-9eb1-4d90-887c-483378b89886\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":15,\\\"y\\\":14,\\\"pageCompId\\\":\\\"925987666677768192\\\",\\\"key\\\":\\\"5d942489-aa76-4ef8-8c71-733dd3688266\\\"},{\\\"pcX\\\":12,\\\"moved\\\":false,\\\"pcY\\\":14,\\\"h\\\":5,\\\"i\\\":\\\"fabcd19e-73a2-4a44-9035-d18bccfa77ba\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":12,\\\"y\\\":14,\\\"pageCompId\\\":\\\"925987666698739712\\\",\\\"key\\\":\\\"7ed4eaf7-7a75-47c2-925e-43f89b059a02\\\"},{\\\"pcX\\\":12,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":6,\\\"i\\\":\\\"e5eb46cd-4d1a-447e-b42a-6e390fa7080e\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":12,\\\"y\\\":8,\\\"pageCompId\\\":\\\"925987666715516928\\\",\\\"key\\\":\\\"0dd0c030-aba4-417c-a12e-c5cd32035fad\\\"},{\\\"pcX\\\":18,\\\"moved\\\":false,\\\"pcY\\\":73,\\\"h\\\":24,\\\"i\\\":\\\"f42ce4f9-0e56-47da-8220-254436afea6d\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JSmoothLine\\\",\\\"w\\\":6,\\\"x\\\":18,\\\"y\\\":73,\\\"pageCompId\\\":\\\"925987666732294144\\\",\\\"key\\\":\\\"2ae30c7d-2c6d-4ef0-8d42-80cea0412320\\\"},{\\\"pcX\\\":15,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":6,\\\"i\\\":\\\"102fa102-3bd7-4e86-83ea-77cc7ef23651\\\",\\\"orderNum\\\":44,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":15,\\\"y\\\":8,\\\"pageCompId\\\":\\\"925987666749071360\\\",\\\"key\\\":\\\"f2df4d9f-736f-4064-a404-5e974e84f4ce\\\"},{\\\"pcX\\\":18,\\\"moved\\\":false,\\\"pcY\\\":44,\\\"h\\\":29,\\\"i\\\":\\\"6841deb3-d062-42d8-8a2b-b58f6da64159\\\",\\\"orderNum\\\":49,\\\"component\\\":\\\"JMultipleBar\\\",\\\"w\\\":6,\\\"x\\\":18,\\\"y\\\":44,\\\"pageCompId\\\":\\\"925987666770042880\\\",\\\"key\\\":\\\"e96c07b2-5ed1-46dc-894c-202e0b04e6e5\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":37,\\\"i\\\":\\\"92758754-3165-4df6-a897-6da821492f81\\\",\\\"orderNum\\\":69,\\\"component\\\":\\\"JCommonTable\\\",\\\"w\\\":6,\\\"x\\\":0,\\\"y\\\":8,\\\"pageCompId\\\":\\\"925987666786820096\\\",\\\"key\\\":\\\"b59b15af-0b49-4938-8f87-e2aa7267346f\\\"},{\\\"pcX\\\":6,\\\"moved\\\":false,\\\"pcY\\\":59,\\\"h\\\":5,\\\"i\\\":\\\"201a48c1-924c-4da0-87e5-9dc0eb2579a9\\\",\\\"orderNum\\\":69,\\\"component\\\":\\\"JText\\\",\\\"w\\\":12,\\\"x\\\":6,\\\"y\\\":59,\\\"pageCompId\\\":\\\"925987666803597312\\\",\\\"key\\\":\\\"4f4afc8f-4b87-4127-a4f0-c365cce28ede\\\"},{\\\"pcX\\\":18,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"7e2ecc0a-7930-4c76-9c9a-76af22a58f59\\\",\\\"orderNum\\\":78,\\\"component\\\":\\\"JText\\\",\\\"w\\\":6,\\\"x\\\":18,\\\"y\\\":8,\\\"pageCompId\\\":\\\"925987666828763136\\\",\\\"key\\\":\\\"8b0234ac-2115-4d19-a356-b67147758ee7\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":79,\\\"h\\\":18,\\\"i\\\":\\\"a9f3e66d-cfcd-41bb-908b-fc2e95cdb125\\\",\\\"orderNum\\\":78,\\\"component\\\":\\\"JStackBar\\\",\\\"w\\\":6,\\\"x\\\":0,\\\"y\\\":79,\\\"pageCompId\\\":\\\"925987666849734656\\\",\\\"key\\\":\\\"d85d94cc-642f-4ef7-88c2-12f97e30e636\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":45,\\\"h\\\":34,\\\"i\\\":\\\"e90a0a58-5039-4763-9fd5-e7a271ee7ace\\\",\\\"orderNum\\\":74,\\\"component\\\":\\\"JCommonTable\\\",\\\"w\\\":6,\\\"x\\\":0,\\\"y\\\":45,\\\"pageCompId\\\":\\\"925987666866511872\\\",\\\"key\\\":\\\"21a8a9b4-8c86-4b26-8fa2-32104044fb53\\\"},{\\\"pcX\\\":6,\\\"moved\\\":false,\\\"pcY\\\":19,\\\"h\\\":40,\\\"i\\\":\\\"91178230-4e13-448d-bd76-69af0d3defe3\\\",\\\"orderNum\\\":108,\\\"component\\\":\\\"JMixLineBar\\\",\\\"w\\\":12,\\\"x\\\":6,\\\"y\\\":19,\\\"pageCompId\\\":\\\"925987666879094784\\\",\\\"key\\\":\\\"40fb5768-5cc1-49d6-b940-ba355c13eb21\\\"},{\\\"pcX\\\":11,\\\"moved\\\":false,\\\"pcY\\\":64,\\\"h\\\":33,\\\"i\\\":\\\"8c7f4e62-f8d9-4ba9-84c9-32fc7ae18206\\\",\\\"orderNum\\\":108,\\\"component\\\":\\\"JCommonTable\\\",\\\"w\\\":7,\\\"x\\\":11,\\\"y\\\":64,\\\"pageCompId\\\":\\\"925987666904260608\\\",\\\"key\\\":\\\"75ba8e4b-cced-4b47-afbf-dad8e52a1347\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"pcX\\\":6,\\\"w\\\":5,\\\"moved\\\":false,\\\"pcY\\\":64,\\\"x\\\":6,\\\"h\\\":33,\\\"i\\\":\\\"275ce85f-17f5-4d32-8469-386c65a76637\\\",\\\"y\\\":64,\\\"orderNum\\\":97,\\\"pageCompId\\\":\\\"925987666925232128\\\"}]', 'amVlY2cxMzE0', '0', '1', 'admin', '2024-03-08 14:28:20', 'admin', '2024-03-13 14:05:26', NULL, 1, 66, 9, 0);\nINSERT INTO `onl_drag_page` VALUES ('925988240575995904', '医美行业网络关注度', '/drag/page/view/925988240575995904', NULL, NULL, 100, 'default', 'default', NULL, NULL, '[{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":0,\\\"h\\\":8,\\\"i\\\":\\\"95729a29-9b15-4102-8ca0-4474bcdfd6ea\\\",\\\"orderNum\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":0,\\\"pageCompId\\\":\\\"927766205680885760\\\",\\\"key\\\":\\\"d55088fd-e43d-4a1d-9b05-5649a8eb596c\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":78,\\\"h\\\":6,\\\"i\\\":\\\"89ac8d65-5a17-4c62-83cc-05f29f629734\\\",\\\"orderNum\\\":13,\\\"component\\\":\\\"JText\\\",\\\"w\\\":8,\\\"x\\\":0,\\\"y\\\":78,\\\"pageCompId\\\":\\\"927766205706051584\\\",\\\"key\\\":\\\"1c4e0fa2-b239-4f6e-a421-da3e0025d890\\\"},{\\\"pcX\\\":16,\\\"moved\\\":false,\\\"pcY\\\":77,\\\"h\\\":6,\\\"i\\\":\\\"f5f244fb-deed-48eb-8ada-78dadbe08bd8\\\",\\\"orderNum\\\":21,\\\"component\\\":\\\"JText\\\",\\\"w\\\":8,\\\"x\\\":16,\\\"y\\\":78,\\\"pageCompId\\\":\\\"927766205718634496\\\",\\\"key\\\":\\\"a97e4d8e-1a35-4259-8450-602159ee4549\\\"},{\\\"pcX\\\":8,\\\"moved\\\":false,\\\"pcY\\\":78,\\\"h\\\":6,\\\"i\\\":\\\"de17aaaf-b81c-48b3-8309-854b1d0b3d14\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JText\\\",\\\"w\\\":8,\\\"x\\\":8,\\\"y\\\":78,\\\"pageCompId\\\":\\\"927766205731217408\\\",\\\"key\\\":\\\"19e0a67a-1f13-4af0-83ad-e6b8fde95a4f\\\"},{\\\"pcX\\\":16,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":30,\\\"i\\\":\\\"59cce641-ef13-4a49-835b-4ad20a3cc477\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JFunnel\\\",\\\"w\\\":8,\\\"x\\\":16,\\\"y\\\":13,\\\"pageCompId\\\":\\\"927766205743800320\\\",\\\"key\\\":\\\"5d922cdd-ec89-4e9a-964f-c1ae3eedb607\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"6979473b-9eb1-4d90-887c-483378b89886\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JText\\\",\\\"w\\\":8,\\\"x\\\":0,\\\"y\\\":8,\\\"pageCompId\\\":\\\"927766205756383232\\\",\\\"key\\\":\\\"4aaeb68b-8d14-48ba-89fc-4d22c13adaae\\\"},{\\\"pcX\\\":8,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"fabcd19e-73a2-4a44-9035-d18bccfa77ba\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JText\\\",\\\"w\\\":8,\\\"x\\\":8,\\\"y\\\":8,\\\"pageCompId\\\":\\\"927766205773160448\\\",\\\"key\\\":\\\"3cf7deaa-fb9d-4ef2-8cd7-d32d0a785690\\\"},{\\\"pcX\\\":16,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"e5eb46cd-4d1a-447e-b42a-6e390fa7080e\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JText\\\",\\\"w\\\":8,\\\"x\\\":16,\\\"y\\\":8,\\\"pageCompId\\\":\\\"927766205794131968\\\",\\\"key\\\":\\\"88d4fdcd-ff1c-4d46-8466-200ef9e65a69\\\"},{\\\"pcX\\\":8,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":30,\\\"i\\\":\\\"f42ce4f9-0e56-47da-8220-254436afea6d\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JSmoothLine\\\",\\\"w\\\":8,\\\"x\\\":8,\\\"y\\\":13,\\\"pageCompId\\\":\\\"927766205806714880\\\",\\\"key\\\":\\\"5e423a51-6773-44a3-88e3-34b9589c696c\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":43,\\\"h\\\":5,\\\"i\\\":\\\"102fa102-3bd7-4e86-83ea-77cc7ef23651\\\",\\\"orderNum\\\":44,\\\"component\\\":\\\"JText\\\",\\\"w\\\":8,\\\"x\\\":0,\\\"y\\\":43,\\\"pageCompId\\\":\\\"927766205823492096\\\",\\\"key\\\":\\\"344516b7-8a19-4cd5-85f8-398c3480f814\\\"},{\\\"pcX\\\":16,\\\"moved\\\":false,\\\"pcY\\\":48,\\\"h\\\":30,\\\"i\\\":\\\"6841deb3-d062-42d8-8a2b-b58f6da64159\\\",\\\"orderNum\\\":49,\\\"component\\\":\\\"JMultipleBar\\\",\\\"w\\\":8,\\\"x\\\":16,\\\"y\\\":48,\\\"pageCompId\\\":\\\"927766205836075008\\\",\\\"key\\\":\\\"6d8a2052-2429-418f-80ab-e9e78af70de0\\\"},{\\\"pcX\\\":8,\\\"moved\\\":false,\\\"pcY\\\":43,\\\"h\\\":5,\\\"i\\\":\\\"201a48c1-924c-4da0-87e5-9dc0eb2579a9\\\",\\\"orderNum\\\":69,\\\"component\\\":\\\"JText\\\",\\\"w\\\":8,\\\"x\\\":8,\\\"y\\\":43,\\\"pageCompId\\\":\\\"927766205852852224\\\",\\\"key\\\":\\\"b499b520-7880-4630-b223-b0d8b5aed79d\\\"},{\\\"pcX\\\":16,\\\"moved\\\":false,\\\"pcY\\\":43,\\\"h\\\":5,\\\"i\\\":\\\"7e2ecc0a-7930-4c76-9c9a-76af22a58f59\\\",\\\"orderNum\\\":78,\\\"component\\\":\\\"JText\\\",\\\"w\\\":8,\\\"x\\\":16,\\\"y\\\":43,\\\"pageCompId\\\":\\\"927766205865435136\\\",\\\"key\\\":\\\"89b201f0-871e-4ec8-96b0-eb03c9b31357\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":30,\\\"i\\\":\\\"88e40b11-fc48-4d59-8ba8-5d106f3dfa2b\\\",\\\"orderNum\\\":53,\\\"component\\\":\\\"JMixLineBar\\\",\\\"w\\\":8,\\\"x\\\":0,\\\"y\\\":13,\\\"pageCompId\\\":\\\"927766205873823744\\\",\\\"key\\\":\\\"0d8ade3b-02e8-4a6b-a0ed-f0dd46ebe87f\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":48,\\\"h\\\":30,\\\"i\\\":\\\"000017d9-054b-492f-9327-537c64b25f0f\\\",\\\"orderNum\\\":54,\\\"component\\\":\\\"JDynamicBar\\\",\\\"w\\\":8,\\\"x\\\":0,\\\"y\\\":48,\\\"pageCompId\\\":\\\"927766205890600960\\\",\\\"key\\\":\\\"64b531f1-56d4-49ad-9afa-e03bd45d0c8b\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":84,\\\"h\\\":29,\\\"i\\\":\\\"0331fad4-d098-4aa4-84e1-0583a0ed828f\\\",\\\"orderNum\\\":80,\\\"component\\\":\\\"JDynamicBar\\\",\\\"w\\\":8,\\\"x\\\":0,\\\"y\\\":84,\\\"pageCompId\\\":\\\"927766205903183872\\\",\\\"key\\\":\\\"7f656710-b951-4dce-860b-b5421fc62070\\\"},{\\\"pcX\\\":8,\\\"moved\\\":false,\\\"pcY\\\":48,\\\"h\\\":30,\\\"i\\\":\\\"f36d52f6-942b-438b-881a-2fd02ebfd7f0\\\",\\\"orderNum\\\":109,\\\"component\\\":\\\"JRing\\\",\\\"w\\\":8,\\\"x\\\":8,\\\"y\\\":48,\\\"pageCompId\\\":\\\"927766205915766784\\\",\\\"key\\\":\\\"423d760e-342e-473b-8af1-67e1c538c725\\\"},{\\\"pcX\\\":8,\\\"moved\\\":false,\\\"pcY\\\":84,\\\"h\\\":29,\\\"i\\\":\\\"7c994b82-cde8-41a2-9192-21f8c92085b9\\\",\\\"orderNum\\\":109,\\\"component\\\":\\\"JCommonTable\\\",\\\"w\\\":8,\\\"x\\\":8,\\\"y\\\":84,\\\"pageCompId\\\":\\\"927766205924155392\\\",\\\"key\\\":\\\"d4c825d1-c807-47f1-ac75-452de7f492bd\\\"},{\\\"component\\\":\\\"JRing\\\",\\\"pcX\\\":16,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":83,\\\"x\\\":16,\\\"h\\\":29,\\\"i\\\":\\\"7759c7d3-2ea1-4f89-9c49-9866e9d6cc77\\\",\\\"y\\\":84,\\\"orderNum\\\":113,\\\"pageCompId\\\":\\\"927766205936738304\\\"}]', 'amVlY2cxMzE0', '0', '1', 'admin', '2024-03-08 15:53:31', 'admin', '2024-03-13 14:05:24', NULL, 1, 73, 6, 0);\nINSERT INTO `onl_drag_page` VALUES ('925988379923357696', '消费者权益保护', '/drag/page/view/925988379923357696', NULL, NULL, 100, 'default', 'default', NULL, NULL, '[{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":0,\\\"h\\\":8,\\\"i\\\":\\\"95729a29-9b15-4102-8ca0-4474bcdfd6ea\\\",\\\"orderNum\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":0,\\\"pageCompId\\\":\\\"927733693940277248\\\",\\\"key\\\":\\\"3dce2b44-02cb-4dce-83ce-c584eaba0bae\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":6,\\\"i\\\":\\\"89ac8d65-5a17-4c62-83cc-05f29f629734\\\",\\\"orderNum\\\":13,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":0,\\\"y\\\":8,\\\"pageCompId\\\":\\\"927733693998997504\\\",\\\"key\\\":\\\"8ecd434b-858a-451a-8df5-236157d63c21\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":14,\\\"h\\\":6,\\\"i\\\":\\\"f5f244fb-deed-48eb-8ada-78dadbe08bd8\\\",\\\"orderNum\\\":21,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":0,\\\"y\\\":14,\\\"pageCompId\\\":\\\"927733694024163328\\\",\\\"key\\\":\\\"9bbaae8e-f7ea-41f7-be93-47039647c615\\\"},{\\\"pcX\\\":3,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":6,\\\"i\\\":\\\"de17aaaf-b81c-48b3-8309-854b1d0b3d14\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":3,\\\"y\\\":8,\\\"pageCompId\\\":\\\"927733694045134848\\\",\\\"key\\\":\\\"afbf3bce-23f1-4127-bb5a-b211e27b8593\\\"},{\\\"pcX\\\":3,\\\"moved\\\":false,\\\"pcY\\\":14,\\\"h\\\":6,\\\"i\\\":\\\"2df4f63e-b1a9-4a53-8972-08947f5f011b\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":3,\\\"y\\\":14,\\\"pageCompId\\\":\\\"927733694066106368\\\",\\\"key\\\":\\\"3ec0dc1e-73b0-4196-8afd-c715f3a8ada9\\\"},{\\\"pcX\\\":6,\\\"moved\\\":false,\\\"pcY\\\":36,\\\"h\\\":5,\\\"i\\\":\\\"6979473b-9eb1-4d90-887c-483378b89886\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JText\\\",\\\"w\\\":8,\\\"x\\\":6,\\\"y\\\":36,\\\"pageCompId\\\":\\\"927733694087077888\\\",\\\"key\\\":\\\"ac2978bf-43af-4b8a-8b71-af89857ea47e\\\"},{\\\"pcX\\\":6,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"fabcd19e-73a2-4a44-9035-d18bccfa77ba\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JText\\\",\\\"w\\\":8,\\\"x\\\":6,\\\"y\\\":8,\\\"pageCompId\\\":\\\"927733694099660800\\\",\\\"key\\\":\\\"c53a541d-9a9c-4b1f-ba18-f55df961fc4e\\\"},{\\\"pcX\\\":14,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"e5eb46cd-4d1a-447e-b42a-6e390fa7080e\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JText\\\",\\\"w\\\":10,\\\"x\\\":14,\\\"y\\\":8,\\\"pageCompId\\\":\\\"927733694116438016\\\",\\\"key\\\":\\\"a8ad0233-9683-4d1b-9e1b-e33cf79c1179\\\"},{\\\"pcX\\\":14,\\\"moved\\\":false,\\\"pcY\\\":24,\\\"h\\\":25,\\\"i\\\":\\\"a53c49e6-435a-402d-8de1-b8644b87486b\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JPie\\\",\\\"w\\\":5,\\\"x\\\":14,\\\"y\\\":24,\\\"pageCompId\\\":\\\"927733694141603840\\\",\\\"key\\\":\\\"5fb28666-fe2b-4a2a-8a9c-1bb244bbf53d\\\"},{\\\"pcX\\\":6,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":23,\\\"i\\\":\\\"f42ce4f9-0e56-47da-8220-254436afea6d\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JSmoothLine\\\",\\\"w\\\":8,\\\"x\\\":6,\\\"y\\\":13,\\\"pageCompId\\\":\\\"927733694166769664\\\",\\\"key\\\":\\\"8b0e7f38-126e-4567-975b-100c6ca49e61\\\"},{\\\"pcX\\\":20,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":6,\\\"i\\\":\\\"102fa102-3bd7-4e86-83ea-77cc7ef23651\\\",\\\"orderNum\\\":44,\\\"component\\\":\\\"JText\\\",\\\"w\\\":4,\\\"x\\\":20,\\\"y\\\":13,\\\"pageCompId\\\":\\\"927733694179352576\\\",\\\"key\\\":\\\"3d049ce0-e6ae-42c9-8a6b-454bea5f6a81\\\"},{\\\"pcX\\\":17,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":6,\\\"i\\\":\\\"201a48c1-924c-4da0-87e5-9dc0eb2579a9\\\",\\\"orderNum\\\":69,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":17,\\\"y\\\":13,\\\"pageCompId\\\":\\\"927733694200324096\\\",\\\"key\\\":\\\"62fe06b3-008a-4fe7-a69a-ef3b6221d8db\\\"},{\\\"pcX\\\":14,\\\"moved\\\":false,\\\"pcY\\\":19,\\\"h\\\":5,\\\"i\\\":\\\"7e2ecc0a-7930-4c76-9c9a-76af22a58f59\\\",\\\"orderNum\\\":78,\\\"component\\\":\\\"JText\\\",\\\"w\\\":10,\\\"x\\\":14,\\\"y\\\":19,\\\"pageCompId\\\":\\\"927733694217101312\\\",\\\"key\\\":\\\"8ab5ca31-cf06-490a-87a4-a97678f0d681\\\"},{\\\"pcX\\\":14,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":6,\\\"i\\\":\\\"f4029d4e-b19e-4f50-9614-8eb6002b8bef\\\",\\\"orderNum\\\":54,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":14,\\\"y\\\":13,\\\"pageCompId\\\":\\\"927733694233878528\\\",\\\"key\\\":\\\"4ad27d3e-44e5-4ec8-8a2d-f7fc15555f92\\\"},{\\\"pcX\\\":19,\\\"moved\\\":false,\\\"pcY\\\":24,\\\"h\\\":25,\\\"i\\\":\\\"b9fd7a80-7f1f-4ffd-b6dd-3efe1a3c224c\\\",\\\"orderNum\\\":54,\\\"component\\\":\\\"JBar\\\",\\\"w\\\":5,\\\"x\\\":19,\\\"y\\\":24,\\\"pageCompId\\\":\\\"927733694246461440\\\",\\\"key\\\":\\\"063a93ea-44a5-4921-9ed4-e741685e28f9\\\"},{\\\"pcX\\\":14,\\\"moved\\\":false,\\\"pcY\\\":49,\\\"h\\\":34,\\\"i\\\":\\\"ec683701-de14-49c5-88d2-684ba2b0983f\\\",\\\"orderNum\\\":54,\\\"component\\\":\\\"JScatter\\\",\\\"w\\\":10,\\\"x\\\":14,\\\"y\\\":49,\\\"pageCompId\\\":\\\"927733694259044352\\\",\\\"key\\\":\\\"2c485bcb-6e03-43b2-8f8d-25aee3637bb1\\\"},{\\\"pcX\\\":6,\\\"moved\\\":false,\\\"pcY\\\":56,\\\"h\\\":24,\\\"i\\\":\\\"4aeb9633-f22d-4b40-8ec3-45111146e9fa\\\",\\\"orderNum\\\":54,\\\"component\\\":\\\"JStepLine\\\",\\\"w\\\":8,\\\"x\\\":6,\\\"y\\\":56,\\\"pageCompId\\\":\\\"927733694267432960\\\",\\\"key\\\":\\\"6d8562e2-42a4-47e3-83ec-8632e80fd222\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":20,\\\"h\\\":38,\\\"i\\\":\\\"147b58fb-4401-49b9-9db4-017b3c34ca40\\\",\\\"orderNum\\\":59,\\\"component\\\":\\\"JRing\\\",\\\"w\\\":6,\\\"x\\\":0,\\\"y\\\":20,\\\"pageCompId\\\":\\\"927733694284210176\\\",\\\"key\\\":\\\"e73c4768-778a-46ab-8748-06713f11cc49\\\"},{\\\"pcX\\\":6,\\\"moved\\\":false,\\\"pcY\\\":41,\\\"h\\\":15,\\\"i\\\":\\\"ab89cda3-73f8-4e04-8259-669cc5411a1c\\\",\\\"orderNum\\\":58,\\\"component\\\":\\\"JProgress\\\",\\\"w\\\":8,\\\"x\\\":6,\\\"y\\\":41,\\\"pageCompId\\\":\\\"927733694296793088\\\",\\\"key\\\":\\\"89c3f808-8423-4fd2-b2e3-29563cc00716\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"pcX\\\":0,\\\"w\\\":6,\\\"moved\\\":false,\\\"pcY\\\":58,\\\"x\\\":0,\\\"h\\\":22,\\\"i\\\":\\\"5b345a14-4a1a-462d-8653-1bd8555039c1\\\",\\\"y\\\":58,\\\"orderNum\\\":58,\\\"pageCompId\\\":\\\"927733694309376000\\\"}]', 'amVlY2cxMzE0', '0', '1', 'admin', '2024-03-08 15:54:04', 'admin', '2024-03-13 14:05:20', NULL, 1, 69, 7, 0);\nINSERT INTO `onl_drag_page` VALUES ('965205492447150080', '公司年度招聘看板', '/drag/page/view/965205492447150080', NULL, NULL, 100, 'default', 'default', NULL, NULL, '[{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":0,\\\"h\\\":8,\\\"i\\\":\\\"95729a29-9b15-4102-8ca0-4474bcdfd6ea\\\",\\\"orderNum\\\":0,\\\"component\\\":\\\"JText\\\",\\\"w\\\":24,\\\"x\\\":0,\\\"y\\\":0,\\\"pageCompId\\\":\\\"1080655243975360512\\\",\\\"key\\\":\\\"c65d42a5-a824-49a9-83c0-c4596aa219d4\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":6,\\\"i\\\":\\\"89ac8d65-5a17-4c62-83cc-05f29f629734\\\",\\\"orderNum\\\":13,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":0,\\\"y\\\":13,\\\"pageCompId\\\":\\\"1080655243987943424\\\",\\\"key\\\":\\\"45bb9ca9-ade1-44b4-8a8c-f912aa5920b6\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":19,\\\"h\\\":6,\\\"i\\\":\\\"f5f244fb-deed-48eb-8ada-78dadbe08bd8\\\",\\\"orderNum\\\":21,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":0,\\\"y\\\":19,\\\"pageCompId\\\":\\\"1080655243992137728\\\",\\\"key\\\":\\\"37d8b7ad-6b59-480f-8af1-c44a03ffca00\\\"},{\\\"pcX\\\":3,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":6,\\\"i\\\":\\\"de17aaaf-b81c-48b3-8309-854b1d0b3d14\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":3,\\\"y\\\":13,\\\"pageCompId\\\":\\\"1080655244000526336\\\",\\\"key\\\":\\\"41b3d153-7e04-4751-94a3-2f6b466e9424\\\"},{\\\"pcX\\\":3,\\\"moved\\\":false,\\\"pcY\\\":19,\\\"h\\\":6,\\\"i\\\":\\\"2df4f63e-b1a9-4a53-8972-08947f5f011b\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JText\\\",\\\"w\\\":3,\\\"x\\\":3,\\\"y\\\":19,\\\"pageCompId\\\":\\\"1080655244004720640\\\",\\\"key\\\":\\\"e065a06b-e251-42b3-8ecf-e115459ae476\\\"},{\\\"pcX\\\":6,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":16,\\\"i\\\":\\\"2429182c-a58b-4cd9-8c88-8ad9b2b6a1e2\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JRing\\\",\\\"w\\\":6,\\\"x\\\":6,\\\"y\\\":13,\\\"pageCompId\\\":\\\"1080655244008914944\\\",\\\"key\\\":\\\"0bd2ecf1-d948-411c-8c49-09530f9ccae0\\\"},{\\\"pcX\\\":12,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":31,\\\"i\\\":\\\"33c42a31-ee7f-4f0a-b9bb-280bef0f4c02\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JBubbleMap\\\",\\\"w\\\":6,\\\"x\\\":12,\\\"y\\\":13,\\\"pageCompId\\\":\\\"1080655244017303552\\\",\\\"key\\\":\\\"6f298d57-db77-4801-9dc8-76b14967300f\\\"},{\\\"pcX\\\":18,\\\"moved\\\":false,\\\"pcY\\\":13,\\\"h\\\":31,\\\"i\\\":\\\"59cce641-ef13-4a49-835b-4ad20a3cc477\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JFunnel\\\",\\\"w\\\":6,\\\"x\\\":18,\\\"y\\\":13,\\\"pageCompId\\\":\\\"1080655244025692160\\\",\\\"key\\\":\\\"e8e525b9-051b-4f45-88ec-00dfcca1ffc8\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"6979473b-9eb1-4d90-887c-483378b89886\\\",\\\"orderNum\\\":20,\\\"component\\\":\\\"JText\\\",\\\"w\\\":6,\\\"x\\\":0,\\\"y\\\":8,\\\"pageCompId\\\":\\\"1080655244029886464\\\",\\\"key\\\":\\\"79a6e469-54b4-46dd-88f2-896c07e6ec0b\\\"},{\\\"pcX\\\":6,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"fabcd19e-73a2-4a44-9035-d18bccfa77ba\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JText\\\",\\\"w\\\":12,\\\"x\\\":6,\\\"y\\\":8,\\\"pageCompId\\\":\\\"1080655244034080768\\\",\\\"key\\\":\\\"808ca03a-2f22-4f5e-851b-cdd19a2e059d\\\"},{\\\"pcX\\\":18,\\\"moved\\\":false,\\\"pcY\\\":8,\\\"h\\\":5,\\\"i\\\":\\\"e5eb46cd-4d1a-447e-b42a-6e390fa7080e\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JText\\\",\\\"w\\\":6,\\\"x\\\":18,\\\"y\\\":8,\\\"pageCompId\\\":\\\"1080655244038275072\\\",\\\"key\\\":\\\"8b2edadf-cdaf-43f4-86a1-2735219e5980\\\"},{\\\"pcX\\\":6,\\\"moved\\\":false,\\\"pcY\\\":29,\\\"h\\\":15,\\\"i\\\":\\\"a53c49e6-435a-402d-8de1-b8644b87486b\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JPie\\\",\\\"w\\\":6,\\\"x\\\":6,\\\"y\\\":29,\\\"pageCompId\\\":\\\"1080655244046663680\\\",\\\"key\\\":\\\"e8bdb58d-8950-4791-93dd-37a064e886f4\\\"},{\\\"pcX\\\":0,\\\"moved\\\":false,\\\"pcY\\\":25,\\\"h\\\":19,\\\"i\\\":\\\"f42ce4f9-0e56-47da-8220-254436afea6d\\\",\\\"orderNum\\\":25,\\\"component\\\":\\\"JSmoothLine\\\",\\\"w\\\":6,\\\"x\\\":0,\\\"y\\\":25,\\\"pageCompId\\\":\\\"1080655244050857984\\\",\\\"key\\\":\\\"891346e4-3bb3-46d0-af0d-da0a6cc118b8\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":6,\\\"moved\\\":false,\\\"pcY\\\":44,\\\"x\\\":0,\\\"h\\\":5,\\\"i\\\":\\\"102fa102-3bd7-4e86-83ea-77cc7ef23651\\\",\\\"y\\\":44,\\\"orderNum\\\":44,\\\"pageCompId\\\":\\\"1080655244055052288\\\"},{\\\"component\\\":\\\"JMultipleBar\\\",\\\"pcX\\\":0,\\\"w\\\":6,\\\"moved\\\":false,\\\"pcY\\\":49,\\\"x\\\":0,\\\"h\\\":29,\\\"i\\\":\\\"6841deb3-d062-42d8-8a2b-b58f6da64159\\\",\\\"y\\\":49,\\\"orderNum\\\":49,\\\"pageCompId\\\":\\\"1080655244059246592\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"pcX\\\":6,\\\"w\\\":12,\\\"moved\\\":false,\\\"pcY\\\":49,\\\"x\\\":6,\\\"h\\\":29,\\\"i\\\":\\\"92758754-3165-4df6-a897-6da821492f81\\\",\\\"y\\\":49,\\\"orderNum\\\":69,\\\"pageCompId\\\":\\\"1080655244063440896\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":6,\\\"w\\\":12,\\\"moved\\\":false,\\\"pcY\\\":44,\\\"x\\\":6,\\\"h\\\":5,\\\"i\\\":\\\"201a48c1-924c-4da0-87e5-9dc0eb2579a9\\\",\\\"y\\\":44,\\\"orderNum\\\":69,\\\"pageCompId\\\":\\\"1080655244067635200\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":18,\\\"w\\\":6,\\\"moved\\\":false,\\\"pcY\\\":44,\\\"x\\\":18,\\\"h\\\":5,\\\"i\\\":\\\"7e2ecc0a-7930-4c76-9c9a-76af22a58f59\\\",\\\"y\\\":44,\\\"orderNum\\\":78,\\\"pageCompId\\\":\\\"1080655244071829504\\\"},{\\\"component\\\":\\\"JStackBar\\\",\\\"pcX\\\":18,\\\"w\\\":6,\\\"moved\\\":false,\\\"pcY\\\":49,\\\"x\\\":18,\\\"h\\\":29,\\\"i\\\":\\\"a9f3e66d-cfcd-41bb-908b-fc2e95cdb125\\\",\\\"y\\\":49,\\\"orderNum\\\":78,\\\"pageCompId\\\":\\\"1080655244084412416\\\"}]', NULL, '988299668956545024', '0', 'admin', '2024-06-24 21:08:52', 'admin', '2025-05-09 11:04:58', '', 1000, 42, 0, 0);\nINSERT INTO `onl_drag_page` VALUES ('993809146154418176', '物业消防巡检状态', '/drag/page/view/993809146154418176', NULL, NULL, 100, 'default', 'default', NULL, NULL, '[{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":24,\\\"moved\\\":false,\\\"pcY\\\":0,\\\"x\\\":0,\\\"h\\\":8,\\\"i\\\":\\\"5d85e389-7ee4-40dd-8544-80049646ee34\\\",\\\"y\\\":0,\\\"orderNum\\\":0,\\\"pageCompId\\\":\\\"993809146221527040\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":10,\\\"x\\\":0,\\\"h\\\":6,\\\"i\\\":\\\"878306f4-8ff4-412c-b8d8-744b0897ae8f\\\",\\\"y\\\":8,\\\"orderNum\\\":10,\\\"pageCompId\\\":\\\"993809146250887168\\\"},{\\\"component\\\":\\\"JList\\\",\\\"pcX\\\":0,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":20,\\\"x\\\":0,\\\"h\\\":17,\\\"i\\\":\\\"fe852828-ba3d-46d1-884a-1c723b870d55\\\",\\\"y\\\":14,\\\"orderNum\\\":20,\\\"pageCompId\\\":\\\"993809146267664384\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":37,\\\"x\\\":0,\\\"h\\\":7,\\\"i\\\":\\\"57fd4478-440a-4a6e-a115-186e14d5047a\\\",\\\"y\\\":31,\\\"orderNum\\\":38,\\\"pageCompId\\\":\\\"993809146288635904\\\"},{\\\"component\\\":\\\"JNumber\\\",\\\"pcX\\\":0,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":47,\\\"x\\\":0,\\\"h\\\":12,\\\"i\\\":\\\"bb98b9db-042b-445e-8672-34182191871d\\\",\\\"y\\\":38,\\\"orderNum\\\":48,\\\"pageCompId\\\":\\\"993809146305413120\\\"},{\\\"component\\\":\\\"JNumber\\\",\\\"pcX\\\":0,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":57,\\\"x\\\":0,\\\"h\\\":12,\\\"i\\\":\\\"7eeab8ac-66f7-4d80-81a8-2e75dcb7093a\\\",\\\"y\\\":50,\\\"orderNum\\\":58,\\\"pageCompId\\\":\\\"993809146326384640\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":0,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":67,\\\"x\\\":0,\\\"h\\\":7,\\\"i\\\":\\\"d7a87bcb-e5a6-4092-9b44-be37c284761d\\\",\\\"y\\\":62,\\\"orderNum\\\":69,\\\"pageCompId\\\":\\\"993809146343161856\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"pcX\\\":0,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":77,\\\"x\\\":0,\\\"h\\\":51,\\\"i\\\":\\\"1397ca94-7293-48bd-bb4f-673355c0355e\\\",\\\"y\\\":69,\\\"orderNum\\\":79,\\\"pageCompId\\\":\\\"993809146355744768\\\"},{\\\"component\\\":\\\"JBubbleMap\\\",\\\"pcX\\\":8,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":20,\\\"x\\\":8,\\\"h\\\":32,\\\"i\\\":\\\"f0f84536-4ae3-43ff-aadb-6a1f113b1ab9\\\",\\\"y\\\":14,\\\"orderNum\\\":109,\\\"pageCompId\\\":\\\"993809146368327680\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":8,\\\"w\\\":16,\\\"moved\\\":false,\\\"pcY\\\":10,\\\"x\\\":8,\\\"h\\\":6,\\\"i\\\":\\\"52c28b77-268c-4dc4-805e-a48b37657be1\\\",\\\"y\\\":8,\\\"orderNum\\\":109,\\\"pageCompId\\\":\\\"993809146380910592\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"pcX\\\":16,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":20,\\\"x\\\":16,\\\"h\\\":32,\\\"i\\\":\\\"8b2b0a47-c1fb-47bf-b8af-9c249d903baa\\\",\\\"y\\\":14,\\\"orderNum\\\":109,\\\"pageCompId\\\":\\\"993809146393493504\\\"},{\\\"component\\\":\\\"JPie\\\",\\\"pcX\\\":8,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":52,\\\"x\\\":8,\\\"h\\\":34,\\\"i\\\":\\\"619921d9-f1fe-4d09-8f3d-09238f6d3e4f\\\",\\\"y\\\":46,\\\"orderNum\\\":109,\\\"pageCompId\\\":\\\"993809146410270720\\\"},{\\\"component\\\":\\\"JBar\\\",\\\"pcX\\\":16,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":52,\\\"x\\\":16,\\\"h\\\":34,\\\"i\\\":\\\"2598e9f8-7611-49c1-97a5-018fba23f0e0\\\",\\\"y\\\":46,\\\"orderNum\\\":109,\\\"pageCompId\\\":\\\"993809146418659328\\\"},{\\\"component\\\":\\\"JLine\\\",\\\"pcX\\\":8,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":98,\\\"x\\\":8,\\\"h\\\":33,\\\"i\\\":\\\"01569400-637c-4d01-986e-c6604f88cc32\\\",\\\"y\\\":87,\\\"orderNum\\\":109,\\\"pageCompId\\\":\\\"993809146431242240\\\"},{\\\"component\\\":\\\"JCommonTable\\\",\\\"pcX\\\":16,\\\"w\\\":8,\\\"moved\\\":false,\\\"pcY\\\":86,\\\"x\\\":16,\\\"h\\\":33,\\\"i\\\":\\\"4fd26be3-3138-4cf5-9e7a-e24ff75bafad\\\",\\\"y\\\":87,\\\"orderNum\\\":114,\\\"pageCompId\\\":\\\"993809146443825152\\\"},{\\\"component\\\":\\\"JText\\\",\\\"pcX\\\":8,\\\"w\\\":16,\\\"moved\\\":false,\\\"pcY\\\":86,\\\"x\\\":8,\\\"h\\\":7,\\\"i\\\":\\\"e3bea36a-c897-41ec-9c8d-c572609a74e5\\\",\\\"y\\\":80,\\\"orderNum\\\":114,\\\"pageCompId\\\":\\\"993809146464796672\\\"}]', NULL, '988299668956545024', '0', 'admin', '2024-09-11 19:29:35', 'admin', '2024-01-31 15:46:14', '', 1000, 36, 0, 0);\n\n-- ----------------------------\n-- Table structure for onl_drag_page_comp\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_drag_page_comp`;\nCREATE TABLE `onl_drag_page_comp`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',\n  `parent_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '父组件ID',\n  `page_Id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '界面ID',\n  `comp_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件库ID',\n  `component` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件名称',\n  `config` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '组件配置',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '可视化拖拽页面组件' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_drag_page_comp\n-- ----------------------------\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681378529280', NULL, '1016994145836257280', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":695,\\\"height\\\":459},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"12\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681424666624', NULL, '1016994145836257280', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":690,\\\"height\\\":385},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"12\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681441443840', NULL, '1016994145836257280', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":543,\\\"height\\\":385},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"12\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681454026752', NULL, '1016994145836257280', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":543,\\\"height\\\":455},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"12\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681470803968', NULL, '1016994145836257280', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":688,\\\"height\\\":385},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"12\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681495969792', NULL, '1016994145836257280', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":350,\\\"height\\\":385},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"12\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681512747008', NULL, '1016994145836257280', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":360.0035587188612,\\\"height\\\":385},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"12\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681525329920', NULL, '1016994145836257280', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"个性化组件大阅兵\\\",\\\"size\\\":{\\\"width\\\":588,\\\"height\\\":71},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FAD400\\\",\\\"letterSpacing\\\":10,\\\"fontSize\\\":50,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681588244480', NULL, '1016994145836257280', NULL, 'JFlashCloud', '{\\\"chartData\\\":\\\"[    {        \\\\\\\"name\\\\\\\": \\\\\\\"欧莱雅\\\\\\\",        \\\\\\\"value\\\\\\\": 11638    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"iPhone X\\\\\\\",        \\\\\\\"value\\\\\\\": 19651    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"淘宝\\\\\\\",        \\\\\\\"value\\\\\\\": 3306    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"oppo\\\\\\\",        \\\\\\\"value\\\\\\\": 6666    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"小米\\\\\\\",        \\\\\\\"value\\\\\\\": 37410    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"京东\\\\\\\",        \\\\\\\"value\\\\\\\": 3241    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"抖音\\\\\\\",        \\\\\\\"value\\\\\\\": 2860    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"天猫\\\\\\\",        \\\\\\\"value\\\\\\\": 1234    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"百度\\\\\\\",        \\\\\\\"value\\\\\\\": 1756    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"三星\\\\\\\",        \\\\\\\"value\\\\\\\": 4444    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"Mac Pro\\\\\\\",        \\\\\\\"value\\\\\\\": 18341    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"玛莎拉\\\\\\\",        \\\\\\\"value\\\\\\\": 10608    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"小米手机\\\\\\\",        \\\\\\\"value\\\\\\\": 12550    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"特斯拉\\\\\\\",        \\\\\\\"value\\\\\\\": 8298    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"华为P20\\\\\\\",        \\\\\\\"value\\\\\\\": 17319    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"华为\\\\\\\",        \\\\\\\"value\\\\\\\": 12000    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"快手\\\\\\\",        \\\\\\\"value\\\\\\\": 3175    }]\\\",\\\"size\\\":{\\\"width\\\":321,\\\"height\\\":333},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"textSize\\\":14,\\\"zoom\\\":1,\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"textColor\\\":\\\"#fff\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681609216000', NULL, '1016994145836257280', NULL, 'JGender', '{\\\"chartData\\\":\\\"[{\\\\\\\"man\\\\\\\":50,\\\\\\\"woman\\\\\\\":35}]\\\",\\\"size\\\":{\\\"width\\\":341,\\\"height\\\":284},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"男\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"女\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/pictogram\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"series\\\":[],\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681621798912', NULL, '1016994145836257280', NULL, 'JWeatherForecast', '{\\\"size\\\":{\\\"width\\\":257,\\\"height\\\":47},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":257,\\\"dataType\\\":1,\\\"h\\\":47,\\\"option\\\":{\\\"template\\\":94,\\\"bgColor\\\":\\\"\\\",\\\"city\\\":\\\"\\\",\\\"num\\\":2,\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#fff\\\",\\\"url\\\":\\\"\\\"}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681634381824', NULL, '1016994145836257280', NULL, 'JNegativeBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"周一\\\\\\\",\\\\\\\"value\\\\\\\":200,\\\\\\\"type\\\\\\\":\\\\\\\"利润\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周二\\\\\\\",\\\\\\\"value\\\\\\\":170,\\\\\\\"type\\\\\\\":\\\\\\\"利润\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周三\\\\\\\",\\\\\\\"value\\\\\\\":240,\\\\\\\"type\\\\\\\":\\\\\\\"利润\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周四\\\\\\\",\\\\\\\"value\\\\\\\":244,\\\\\\\"type\\\\\\\":\\\\\\\"利润\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周五\\\\\\\",\\\\\\\"value\\\\\\\":200,\\\\\\\"type\\\\\\\":\\\\\\\"利润\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周六\\\\\\\",\\\\\\\"value\\\\\\\":220,\\\\\\\"type\\\\\\\":\\\\\\\"利润\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周日\\\\\\\",\\\\\\\"value\\\\\\\":210,\\\\\\\"type\\\\\\\":\\\\\\\"利润\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周一\\\\\\\",\\\\\\\"value\\\\\\\":320,\\\\\\\"type\\\\\\\":\\\\\\\"收入\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周二\\\\\\\",\\\\\\\"value\\\\\\\":302,\\\\\\\"type\\\\\\\":\\\\\\\"收入\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周三\\\\\\\",\\\\\\\"value\\\\\\\":341,\\\\\\\"type\\\\\\\":\\\\\\\"收入\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周四\\\\\\\",\\\\\\\"value\\\\\\\":374,\\\\\\\"type\\\\\\\":\\\\\\\"收入\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周五\\\\\\\",\\\\\\\"value\\\\\\\":390,\\\\\\\"type\\\\\\\":\\\\\\\"收入\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周六\\\\\\\",\\\\\\\"value\\\\\\\":450,\\\\\\\"type\\\\\\\":\\\\\\\"收入\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周日\\\\\\\",\\\\\\\"value\\\\\\\":420,\\\\\\\"type\\\\\\\":\\\\\\\"收入\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周一\\\\\\\",\\\\\\\"value\\\\\\\":-120,\\\\\\\"type\\\\\\\":\\\\\\\"支出\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周二\\\\\\\",\\\\\\\"value\\\\\\\":-132,\\\\\\\"type\\\\\\\":\\\\\\\"支出\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周三\\\\\\\",\\\\\\\"value\\\\\\\":-101,\\\\\\\"type\\\\\\\":\\\\\\\"支出\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周四\\\\\\\",\\\\\\\"value\\\\\\\":-134,\\\\\\\"type\\\\\\\":\\\\\\\"支出\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周五\\\\\\\",\\\\\\\"value\\\\\\\":-190,\\\\\\\"type\\\\\\\":\\\\\\\"支出\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周六\\\\\\\",\\\\\\\"value\\\\\\\":-230,\\\\\\\"type\\\\\\\":\\\\\\\"支出\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"周日\\\\\\\",\\\\\\\"value\\\\\\\":-210,\\\\\\\"type\\\\\\\":\\\\\\\"支出\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":515,\\\"height\\\":429},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"interval\\\":2}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"type\\\":\\\"value\\\"},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":40,\\\"containLabel\\\":true},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681655353344', NULL, '1016994145836257280', NULL, 'JFlashList', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":34008,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":498,\\\"height\\\":300},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":540,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"itemColor\\\":\\\"#00C2FF\\\",\\\"titleColor\\\":\\\"#00C2FF\\\",\\\"numberColor\\\":\\\"#00C2FF\\\",\\\"numberSize\\\":16,\\\"animateType\\\":\\\"zoomInUp\\\",\\\"titleShow\\\":true,\\\"zoom\\\":1,\\\"titleSize\\\":16,\\\"title\\\":\\\"排名统计\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681676324864', NULL, '1016994145836257280', NULL, 'JPictorialBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/pictogram\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"驯鹿\\\\\\\",\\\\\\\"value\\\\\\\":123,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M-22.788,24.521c2.08-0.986,3.611-3.905,4.984-5.892 c-2.686,2.782-5.047,5.884-9.102,7.312c-0.992,0.005-0.25-2.016,0.34-2.362l1.852-0.41c0.564-0.218,0.785-0.842,0.902-1.347 c2.133-0.727,4.91-4.129,6.031-6.194c1.748-0.7,4.443-0.679,5.734-2.293c1.176-1.468,0.393-3.992,1.215-6.557 c0.24-0.754,0.574-1.581,1.008-2.293c-0.611,0.011-1.348-0.061-1.959-0.608c-1.391-1.245-0.785-2.086-1.297-3.313 c1.684,0.744,2.5,2.584,4.426,2.586C-8.46,3.012-8.255,2.901-8.04,2.824c6.031-1.952,15.182-0.165,19.498-3.937 c1.15-3.933-1.24-9.846-1.229-9.938c0.008-0.062-1.314-0.004-1.803-0.258c-1.119-0.771-6.531-3.75-0.17-3.33 c0.314-0.045,0.943,0.259,1.439,0.435c-0.289-1.694-0.92-0.144-3.311-1.946c0,0-1.1-0.855-1.764-1.98 c-0.836-1.09-2.01-2.825-2.992-4.031c-1.523-2.476,1.367,0.709,1.816,1.108c1.768,1.704,1.844,3.281,3.232,3.983 c0.195,0.203,1.453,0.164,0.926-0.468c-0.525-0.632-1.367-1.278-1.775-2.341c-0.293-0.703-1.311-2.326-1.566-2.711 c-0.256-0.384-0.959-1.718-1.67-2.351c-1.047-1.187-0.268-0.902,0.521-0.07c0.789,0.834,1.537,1.821,1.672,2.023 c0.135,0.203,1.584,2.521,1.725,2.387c0.102-0.259-0.035-0.428-0.158-0.852c-0.125-0.423-0.912-2.032-0.961-2.083 c-0.357-0.852-0.566-1.908-0.598-3.333c0.4-2.375,0.648-2.486,0.549-0.705c0.014,1.143,0.031,2.215,0.602,3.247 c0.807,1.496,1.764,4.064,1.836,4.474c0.561,3.176,2.904,1.749,2.281-0.126c-0.068-0.446-0.109-2.014-0.287-2.862 c-0.18-0.849-0.219-1.688-0.113-3.056c0.066-1.389,0.232-2.055,0.277-2.299c0.285-1.023,0.4-1.088,0.408,0.135 c-0.059,0.399-0.131,1.687-0.125,2.655c0.064,0.642-0.043,1.768,0.172,2.486c0.654,1.928-0.027,3.496,1,3.514 c1.805-0.424,2.428-1.218,2.428-2.346c-0.086-0.704-0.121-0.843-0.031-1.193c0.221-0.568,0.359-0.67,0.312-0.076 c-0.055,0.287,0.031,0.533,0.082,0.794c0.264,1.197,0.912,0.114,1.283-0.782c0.15-0.238,0.539-2.154,0.545-2.522 c-0.023-0.617,0.285-0.645,0.309,0.01c0.064,0.422-0.248,2.646-0.205,2.334c-0.338,1.24-1.105,3.402-3.379,4.712 c-0.389,0.12-1.186,1.286-3.328,2.178c0,0,1.729,0.321,3.156,0.246c1.102-0.19,3.707-0.027,4.654,0.269 c1.752,0.494,1.531-0.053,4.084,0.164c2.26-0.4,2.154,2.391-1.496,3.68c-2.549,1.405-3.107,1.475-2.293,2.984 c3.484,7.906,2.865,13.183,2.193,16.466c2.41,0.271,5.732-0.62,7.301,0.725c0.506,0.333,0.648,1.866-0.457,2.86 c-4.105,2.745-9.283,7.022-13.904,7.662c-0.977-0.194,0.156-2.025,0.803-2.247l1.898-0.03c0.596-0.101,0.936-0.669,1.152-1.139 c3.16-0.404,5.045-3.775,8.246-4.818c-4.035-0.718-9.588,3.981-12.162,1.051c-5.043,1.423-11.449,1.84-15.895,1.111 c-3.105,2.687-7.934,4.021-12.115,5.866c-3.271,3.511-5.188,8.086-9.967,10.414c-0.986,0.119-0.48-1.974,0.066-2.385l1.795-0.618 C-22.995,25.682-22.849,25.035-22.788,24.521z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[60,60]},{\\\\\\\"name\\\\\\\":\\\\\\\"飞机\\\\\\\",\\\\\\\"value\\\\\\\":60,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M1.112,32.559l2.998,1.205l-2.882,2.268l-2.215-0.012L1.112,32.559z M37.803,23.96 c0.158-0.838,0.5-1.509,0.961-1.904c-0.096-0.037-0.205-0.071-0.344-0.071c-0.777-0.005-2.068-0.009-3.047-0.009 c-0.633,0-1.217,0.066-1.754,0.18l2.199,1.804H37.803z M39.738,23.036c-0.111,0-0.377,0.325-0.537,0.924h1.076 C40.115,23.361,39.854,23.036,39.738,23.036z M39.934,39.867c-0.166,0-0.674,0.705-0.674,1.986s0.506,1.986,0.674,1.986 s0.672-0.705,0.672-1.986S40.102,39.867,39.934,39.867z M38.963,38.889c-0.098-0.038-0.209-0.07-0.348-0.073 c-0.082,0-0.174,0-0.268-0.001l-7.127,4.671c0.879,0.821,2.42,1.417,4.348,1.417c0.979,0,2.27-0.006,3.047-0.01 c0.139,0,0.25-0.034,0.348-0.072c-0.646-0.555-1.07-1.643-1.07-2.967C37.891,40.529,38.316,39.441,38.963,38.889z M32.713,23.96 l-12.37-10.116l-4.693-0.004c0,0,4,8.222,4.827,10.121H32.713z M59.311,32.374c-0.248,2.104-5.305,3.172-8.018,3.172H39.629 l-25.325,16.61L9.607,52.16c0,0,6.687-8.479,7.95-10.207c1.17-1.6,3.019-3.699,3.027-6.407h-2.138 c-5.839,0-13.816-3.789-18.472-5.583c-2.818-1.085-2.396-4.04-0.031-4.04h0.039l-3.299-11.371h3.617c0,0,4.352,5.696,5.846,7.5 c2,2.416,4.503,3.678,8.228,3.87h30.727c2.17,0,4.311,0.417,6.252,1.046c3.49,1.175,5.863,2.7,7.199,4.027 C59.145,31.584,59.352,32.025,59.311,32.374z M22.069,30.408c0-0.815-0.661-1.475-1.469-1.475c-0.812,0-1.471,0.66-1.471,1.475 s0.658,1.475,1.471,1.475C21.408,31.883,22.069,31.224,22.069,30.408z M27.06,30.408c0-0.815-0.656-1.478-1.466-1.478 c-0.812,0-1.471,0.662-1.471,1.478s0.658,1.477,1.471,1.477C26.404,31.885,27.06,31.224,27.06,30.408z M32.055,30.408 c0-0.815-0.66-1.475-1.469-1.475c-0.808,0-1.466,0.66-1.466,1.475s0.658,1.475,1.466,1.475 C31.398,31.883,32.055,31.224,32.055,30.408z M37.049,30.408c0-0.815-0.658-1.478-1.467-1.478c-0.812,0-1.469,0.662-1.469,1.478 s0.656,1.477,1.469,1.477C36.389,31.885,37.049,31.224,37.049,30.408z M42.039,30.408c0-0.815-0.656-1.478-1.465-1.478 c-0.811,0-1.469,0.662-1.469,1.478s0.658,1.477,1.469,1.477C41.383,31.885,42.039,31.224,42.039,30.408z M55.479,30.565 c-0.701-0.436-1.568-0.896-2.627-1.347c-0.613,0.289-1.551,0.476-2.73,0.476c-1.527,0-1.639,2.263,0.164,2.316 C52.389,32.074,54.627,31.373,55.479,30.565z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[65,35]},{\\\\\\\"name\\\\\\\":\\\\\\\"火箭\\\\\\\",\\\\\\\"value\\\\\\\":25,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M-244.396,44.399c0,0,0.47-2.931-2.427-6.512c2.819-8.221,3.21-15.709,3.21-15.709s5.795,1.383,5.795,7.325C-237.818,39.679-244.396,44.399-244.396,44.399z M-260.371,40.827c0,0-3.881-12.946-3.881-18.319c0-2.416,0.262-4.566,0.669-6.517h17.684c0.411,1.952,0.675,4.104,0.675,6.519c0,5.291-3.87,18.317-3.87,18.317H-260.371z M-254.745,18.951c-1.99,0-3.603,1.676-3.603,3.744c0,2.068,1.612,3.744,3.603,3.744c1.988,0,3.602-1.676,3.602-3.744S-252.757,18.951-254.745,18.951z M-255.521,2.228v-5.098h1.402v4.969c1.603,1.213,5.941,5.069,7.901,12.5h-17.05C-261.373,7.373-257.245,3.558-255.521,2.228zM-265.07,44.399c0,0-6.577-4.721-6.577-14.896c0-5.942,5.794-7.325,5.794-7.325s0.393,7.488,3.211,15.708C-265.539,41.469-265.07,44.399-265.07,44.399z M-252.36,45.15l-1.176-1.22L-254.789,48l-1.487-4.069l-1.019,2.116l-1.488-3.826h8.067L-252.36,45.15z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[50,60]},{\\\\\\\"name\\\\\\\":\\\\\\\"高铁\\\\\\\",\\\\\\\"value\\\\\\\":18,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M67.335,33.596L67.335,33.596c-0.002-1.39-1.153-3.183-3.328-4.218h-9.096v-2.07h5.371 c-4.939-2.07-11.199-4.141-14.89-4.141H19.72v12.421v5.176h38.373c4.033,0,8.457-1.035,9.142-5.176h-0.027 c0.076-0.367,0.129-0.751,0.129-1.165L67.335,33.596L67.335,33.596z M27.999,30.413h-3.105v-4.141h3.105V30.413z M35.245,30.413 h-3.104v-4.141h3.104V30.413z M42.491,30.413h-3.104v-4.141h3.104V30.413z M49.736,30.413h-3.104v-4.141h3.104V30.413z  M14.544,40.764c1.143,0,2.07-0.927,2.07-2.07V35.59V25.237c0-1.145-0.928-2.07-2.07-2.07H-9.265c-1.143,0-2.068,0.926-2.068,2.07 v10.351v3.105c0,1.144,0.926,2.07,2.068,2.07H14.544L14.544,40.764z M8.333,26.272h3.105v4.141H8.333V26.272z M1.087,26.272h3.105 v4.141H1.087V26.272z M-6.159,26.272h3.105v4.141h-3.105V26.272z M-9.265,41.798h69.352v1.035H-9.265V41.798z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[50,30]},{\\\\\\\"name\\\\\\\":\\\\\\\"轮船\\\\\\\",\\\\\\\"value\\\\\\\":12,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M16.678,17.086h9.854l-2.703,5.912c5.596,2.428,11.155,5.575,16.711,8.607c3.387,1.847,6.967,3.75,10.541,5.375 v-6.16l-4.197-2.763v-5.318L33.064,12.197h-11.48L20.43,15.24h-4.533l-1.266,3.286l0.781,0.345L16.678,17.086z M49.6,31.84 l0.047,1.273L27.438,20.998l0.799-1.734L49.6,31.84z M33.031,15.1l12.889,8.82l0.027,0.769L32.551,16.1L33.031,15.1z M22.377,14.045 h9.846l-1.539,3.365l-2.287-1.498h1.371l0.721-1.352h-2.023l-0.553,1.037l-0.541-0.357h-0.34l0.359-0.684h-2.025l-0.361,0.684 h-3.473L22.377,14.045z M23.695,20.678l-0.004,0.004h0.004V20.678z M24.828,18.199h-2.031l-0.719,1.358h2.029L24.828,18.199z  M40.385,34.227c-12.85-7.009-25.729-14.667-38.971-12.527c1.26,8.809,9.08,16.201,8.213,24.328 c-0.553,4.062-3.111,0.828-3.303,7.137c15.799,0,32.379,0,48.166,0l0.066-4.195l1.477-7.23 C50.842,39.812,45.393,36.961,40.385,34.227z M13.99,35.954c-1.213,0-2.195-1.353-2.195-3.035c0-1.665,0.98-3.017,2.195-3.017 c1.219,0,2.195,1.352,2.195,3.017C16.186,34.604,15.213,35.954,13.99,35.954z M23.691,20.682h-2.02l-0.588,1.351h2.023 L23.691,20.682z M19.697,18.199l-0.721,1.358h2.025l0.727-1.358H19.697z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[50,35]},{\\\\\\\"name\\\\\\\":\\\\\\\"汽车\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M49.592,40.883c-0.053,0.354-0.139,0.697-0.268,0.963c-0.232,0.475-0.455,0.519-1.334,0.475 c-1.135-0.053-2.764,0-4.484,0.068c0,0.476,0.018,0.697,0.018,0.697c0.111,1.299,0.697,1.342,0.931,1.342h3.7 c0.326,0,0.628,0,0.861-0.154c0.301-0.196,0.43-0.772,0.543-1.78c0.017-0.146,0.025-0.336,0.033-0.56v-0.01 c0-0.068,0.008-0.154,0.008-0.25V41.58l0,0C49.6,41.348,49.6,41.09,49.592,40.883L49.592,40.883z M6.057,40.883 c0.053,0.354,0.137,0.697,0.268,0.963c0.23,0.475,0.455,0.519,1.334,0.475c1.137-0.053,2.762,0,4.484,0.068 c0,0.476-0.018,0.697-0.018,0.697c-0.111,1.299-0.697,1.342-0.93,1.342h-3.7c-0.328,0-0.602,0-0.861-0.154 c-0.309-0.18-0.43-0.772-0.541-1.78c-0.018-0.146-0.027-0.336-0.035-0.56v-0.01c0-0.068-0.008-0.154-0.008-0.25V41.58l0,0 C6.057,41.348,6.057,41.09,6.057,40.883L6.057,40.883z M49.867,32.766c0-2.642-0.344-5.224-0.482-5.507 c-0.104-0.207-0.766-0.749-2.271-1.773c-1.522-1.042-1.487-0.887-1.766-1.566c0.25-0.078,0.492-0.224,0.639-0.241 c0.326-0.034,0.345,0.274,1.023,0.274c0.68,0,2.152-0.18,2.453-0.48c0.301-0.303,0.396-0.405,0.396-0.672 c0-0.268-0.156-0.818-0.447-1.146c-0.293-0.327-1.541-0.49-2.273-0.585c-0.729-0.095-0.834,0-1.022,0.121 c-0.304,0.189-0.32,1.919-0.32,1.919l-0.713,0.018c-0.465-1.146-1.11-3.452-2.117-5.269c-1.103-1.979-2.256-2.599-2.737-2.754 c-0.474-0.146-0.904-0.249-4.131-0.576c-3.298-0.344-5.922-0.388-8.262-0.388c-2.342,0-4.967,0.052-8.264,0.388 c-3.229,0.336-3.66,0.43-4.133,0.576s-1.633,0.775-2.736,2.754c-1.006,1.816-1.652,4.123-2.117,5.269L9.87,23.109 c0,0-0.008-1.729-0.318-1.919c-0.189-0.121-0.293-0.225-1.023-0.121c-0.732,0.104-1.98,0.258-2.273,0.585 c-0.293,0.327-0.447,0.878-0.447,1.146c0,0.267,0.094,0.379,0.396,0.672c0.301,0.301,1.773,0.48,2.453,0.48 c0.68,0,0.697-0.309,1.023-0.274c0.146,0.018,0.396,0.163,0.637,0.241c-0.283,0.68-0.24,0.524-1.764,1.566 c-1.506,1.033-2.178,1.566-2.271,1.773c-0.139,0.283-0.482,2.865-0.482,5.508s0.189,5.02,0.189,5.86c0,0.354,0,0.976,0.076,1.565 c0.053,0.354,0.129,0.697,0.268,0.966c0.232,0.473,0.447,0.516,1.334,0.473c1.137-0.051,2.779,0,4.477,0.07 c1.135,0.043,2.297,0.086,3.33,0.11c2.582,0.051,1.826-0.379,2.928-0.36c1.102,0.016,5.447,0.196,9.424,0.196 c3.976,0,8.332-0.182,9.423-0.196c1.102-0.019,0.346,0.411,2.926,0.36c1.033-0.018,2.195-0.067,3.332-0.11 c1.695-0.062,3.348-0.121,4.477-0.07c0.886,0.043,1.103,0,1.332-0.473c0.132-0.269,0.218-0.611,0.269-0.966 c0.086-0.592,0.078-1.213,0.078-1.565C49.678,37.793,49.867,35.408,49.867,32.766L49.867,32.766z M13.219,19.735 c0.412-0.964,1.652-2.9,2.256-3.244c0.145-0.087,1.426-0.491,4.637-0.706c2.953-0.198,6.217-0.276,7.73-0.276 c1.513,0,4.777,0.078,7.729,0.276c3.201,0.215,4.502,0.611,4.639,0.706c0.775,0.533,1.842,2.28,2.256,3.244 c0.412,0.965,0.965,2.858,0.861,3.116c-0.104,0.258,0.104,0.388-1.291,0.275c-1.387-0.103-10.088-0.216-14.185-0.216 c-4.088,0-12.789,0.113-14.184,0.216c-1.395,0.104-1.188-0.018-1.291-0.275C12.254,22.593,12.805,20.708,13.219,19.735 L13.219,19.735z M16.385,30.511c-0.619,0.155-0.988,0.491-1.764,0.482c-0.775,0-2.867-0.353-3.314-0.371 c-0.447-0.017-0.842,0.302-1.076,0.362c-0.23,0.06-0.688-0.104-1.377-0.318c-0.688-0.216-1.092-0.155-1.316-1.094 c-0.232-0.93,0-2.264,0-2.264c1.488-0.068,2.928,0.069,5.621,0.826c2.693,0.758,4.191,2.213,4.191,2.213 S17.004,30.357,16.385,30.511L16.385,30.511z M36.629,37.293c-1.23,0.164-6.386,0.207-8.794,0.207c-2.412,0-7.566-0.051-8.799-0.207 c-1.256-0.164-2.891-1.67-1.764-2.865c1.523-1.627,1.24-1.576,4.701-2.023C24.967,32.018,27.239,32,27.834,32 c0.584,0,2.865,0.025,5.859,0.404c3.461,0.447,3.178,0.396,4.699,2.022C39.521,35.623,37.887,37.129,36.629,37.293L36.629,37.293z  M48.129,29.582c-0.232,0.93-0.629,0.878-1.318,1.093c-0.688,0.216-1.145,0.371-1.377,0.319c-0.231-0.053-0.627-0.371-1.074-0.361 c-0.448,0.018-2.539,0.37-3.313,0.37c-0.772,0-1.146-0.328-1.764-0.481c-0.621-0.154-0.966-0.154-0.966-0.154 s1.49-1.464,4.191-2.213c2.693-0.758,4.131-0.895,5.621-0.826C48.129,27.309,48.361,28.643,48.129,29.582L48.129,29.582z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[40,30]},{\\\\\\\"name\\\\\\\":\\\\\\\"跑步\\\\\\\",\\\\\\\"value\\\\\\\":2,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M13.676,32.955c0.919-0.031,1.843-0.008,2.767-0.008v0.007c0.827,0,1.659,0.041,2.486-0.019 c0.417-0.028,1.118,0.325,1.14-0.545c0.014-0.637-0.156-1.279-0.873-1.367c-1.919-0.241-3.858-0.233-5.774,0.019 c-0.465,0.062-0.998,0.442-0.832,1.069C12.715,32.602,13.045,32.977,13.676,32.955z M14.108,29.013 c1.47-0.007,2.96-0.122,4.414,0.035c1.792,0.192,3.1-0.412,4.273-2.105c-3.044,0-5.882,0.014-8.719-0.01 c-0.768-0.005-1.495,0.118-1.461,1C12.642,28.731,13.329,29.014,14.108,29.013z M23.678,36.593c-0.666-0.69-1.258-1.497-2.483-1.448 c-2.341,0.095-4.689,0.051-7.035,0.012c-0.834-0.014-1.599,0.177-1.569,1.066c0.031,0.854,0.812,1.062,1.636,1.043 c1.425-0.033,2.852-0.01,4.278-0.01v-0.01c1.562,0,3.126,0.008,4.691-0.005C23.614,37.239,24.233,37.174,23.678,36.593z  M32.234,42.292h-0.002c-1.075,0.793-2.589,0.345-3.821,1.048c-0.359,0.193-0.663,0.465-0.899,0.799 c-1.068,1.623-2.052,3.301-3.117,4.928c-0.625,0.961-0.386,1.805,0.409,2.395c0.844,0.628,1.874,0.617,2.548-0.299 c1.912-2.573,3.761-5.197,5.621-7.814C33.484,42.619,33.032,42.387,32.234,42.292z M43.527,28.401 c-0.688-1.575-2.012-0.831-3.121-0.895c-1.047-0.058-2.119,1.128-3.002,0.345c-0.768-0.677-1.213-1.804-1.562-2.813 c-0.45-1.305-1.495-2.225-2.329-3.583c2.953,1.139,4.729,0.077,5.592-1.322c0.99-1.61,0.718-3.725-0.627-4.967 c-1.362-1.255-3.414-1.445-4.927-0.452c-1.933,1.268-2.206,2.893-0.899,6.11c-2.098-0.659-3.835-1.654-5.682-2.383 c-0.735-0.291-1.437-1.017-2.293-0.666c-2.263,0.927-4.522,1.885-6.723,2.95c-1.357,0.658-1.649,1.593-1.076,2.638 c0.462,0.851,1.643,1.126,2.806,0.617c0.993-0.433,1.994-0.857,2.951-1.374c1.599-0.86,3.044-0.873,4.604,0.214 c1.017,0.707,0.873,1.137,0.123,1.849c-1.701,1.615-3.516,3.12-4.933,5.006c-1.042,1.388-0.993,2.817,0.255,4.011 c1.538,1.471,3.148,2.869,4.708,4.315c0.485,0.444,0.907,0.896-0.227,1.104c-1.523,0.285-3.021,0.694-4.538,1.006 c-1.109,0.225-2.02,1.259-1.83,2.16c0.223,1.07,1.548,1.756,2.687,1.487c3.003-0.712,6.008-1.413,9.032-2.044 c1.549-0.324,2.273-1.869,1.344-3.115c-0.868-1.156-1.801-2.267-2.639-3.445c-1.964-2.762-1.95-2.771,0.528-5.189 c1.394-1.357,1.379-1.351,2.437,0.417c0.461,0.769,0.854,1.703,1.99,1.613c2.238-0.181,4.407-0.755,6.564-1.331 C43.557,30.447,43.88,29.206,43.527,28.401z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[50,50]},{\\\\\\\"name\\\\\\\":\\\\\\\"步行\\\\\\\",\\\\\\\"value\\\\\\\":1,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M29.902,23.275c1.86,0,3.368-1.506,3.368-3.365c0-1.859-1.508-3.365-3.368-3.365 c-1.857,0-3.365,1.506-3.365,3.365C26.537,21.769,28.045,23.275,29.902,23.275z M36.867,30.74c-1.666-0.467-3.799-1.6-4.732-4.199 c-0.932-2.6-3.131-2.998-4.797-2.998s-7.098,3.894-7.098,3.894c-1.133,1.001-2.1,6.502-0.967,6.769 c1.133,0.269,1.266-1.533,1.934-3.599c0.666-2.065,3.797-3.466,3.797-3.466s0.201,2.467-0.398,3.866 c-0.599,1.399-1.133,2.866-1.467,6.198s-1.6,3.665-3.799,6.266c-2.199,2.598-0.6,3.797,0.398,3.664 c1.002-0.133,5.865-5.598,6.398-6.998c0.533-1.397,0.668-3.732,0.668-3.732s0,0,2.199,1.867c2.199,1.865,2.332,4.6,2.998,7.73 s2.332,0.934,2.332-0.467c0-1.401,0.269-5.465-1-7.064c-1.265-1.6-3.73-3.465-3.73-5.265s1.199-3.732,1.199-3.732 c0.332,1.667,3.335,3.065,5.599,3.399C38.668,33.206,38.533,31.207,36.867,30.74z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[40,50]}]\\\",\\\"size\\\":{\\\"width\\\":516,\\\"height\\\":334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":60,\\\"left\\\":25,\\\"bottom\\\":18,\\\"right\\\":50,\\\"containLabel\\\":true},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681697296384', NULL, '1016994145836257280', NULL, 'JDevHistory', '{\\\"chartData\\\":\\\"[{\\\\\\\"year\\\\\\\":\\\\\\\"2012\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"开源项目JEECG被\\\\\\\\\\\\\\\"CSDN专家访谈\\\\\\\\\\\\\\\"\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2012\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"开源项目JEECG被\\\\\\\\\\\\\\\"ITeye专家访谈\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2012\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"JEECG在Google Code上开源\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2012\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"推出开源项目\\\\\\\\\\\\\\\"MiniDao(持久层解决方案）\\\\\\\\\\\\\\\"超越了Mybatis和 Hibernate\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2012\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"JEECG参加“云计算成就创业梦想”第二届阿里云开发者大赛\\\\\\\\\\\\\\\"园\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2013\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"应邀参加了\\\\\\\\\\\\\\\"SDCC 2013中国软件开发者大会\\\\\\\\\\\\\\\" （大会由CSDN和《程 序员》杂志倾力打造）\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2013\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"2017.07，开发GBI区块链资讯信息平台\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2013\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"成立JEECG开源团队，创立JEECG开源社区\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2013\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"中国优秀开源项目评选-公开投票,“JEECG以887票位居第九\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2013\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"2013年应邀参加\\\\\\\\\\\\\\\"开源群英会2013”的开源英雄\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2014\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"12月份捷微jeewx与联通集团达成战略合作，负责联通集团微信公众 账号集团化运营\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2014\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"8月份捷微jeewx2.0与百度达成战略合作，集成百度地图，增加地图 功能，附近商家团购等信息搜索\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2014\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"推出当前最火的开源项目“JeeWx(捷微:敏捷微信开发平台）”，并 获得CSDN举办的“2014年开发者大会”公开投票第一名\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2014\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"5月应邀参加中国科学院大学创新创业年度论坛，探讨“创业企业发 展、创新创业孵化”的主题\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2015\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"推出微信H5活动营销平台，专业解决客户对H5互动活动需求（H5huo dong.com）\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2015\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"开源中国最热开源项目TOP20，社区开源项目独占4份，前五名两位（ jeewx、jeecg）\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2015\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"12月独创，微信插件开发机制（java）,推出H5活动平台（www.h5h uodong.com），致力于互动微信H5活动开发\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2015\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"6月份捷微jeewx推出集企业号版本，与中国移动打成战略合作，推出 企业号营销新模式\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2015\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"3月份捷微jeewx推出集团化微信运营版本，专注微信应用一体化，企 业系统集成，实现公众账号上下级，类似组织机构权限模式\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2016\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"jeecg推出插件开发机制 jeecg-p3，主推通过jeecg解决未来SAAS项 目需求方案\\\\\\\"},{\\\\\\\"year\\\\\\\":\\\\\\\"2016\\\\\\\",\\\\\\\"title\\\\\\\":\\\\\\\"jeecg推出重大更新，提升移动开发能力（移动表单配置、移动报表配 置、移动OA，无需编码，通过配置实现移动PC互用）\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":661,\\\"height\\\":300},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"年份\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"标题\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"https://api.jeecg.com/mock/26/history\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"typeFontColor\\\":\\\"#FFFFFF\\\",\\\"titleColor\\\":\\\"#1E90FF\\\",\\\"titleFontSize\\\":20,\\\"zoom\\\":1,\\\"typeBackColor\\\":\\\"#FF4500\\\",\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"waitTime\\\":4000,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681714073600', NULL, '1016994145836257280', NULL, 'JRotatePie', '{\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":450,\\\"height\\\":300},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"typeFontColor\\\":\\\"#4A4A4A\\\",\\\"titleColor\\\":\\\"#4A4A4A\\\",\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"type\\\":\\\"pie\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"typeBackColor\\\":\\\"#4A4A4A\\\",\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681726656512', NULL, '1016994145836257280', NULL, 'JColorBlock', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"前缀\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"后缀\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"颜色\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":175,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"backgroundColor\\\\\\\": \\\\\\\"#67C23A\\\\\\\",    \\\\\\\"prefix\\\\\\\": \\\\\\\"朝阳总销售额\\\\\\\",    \\\\\\\"value\\\\\\\": \\\\\\\"12345\\\\\\\",    \\\\\\\"suffix\\\\\\\": \\\\\\\"亿\\\\\\\"  },  {    \\\\\\\"backgroundColor\\\\\\\": \\\\\\\"#409EFF\\\\\\\",    \\\\\\\"prefix\\\\\\\": \\\\\\\"昌平总销售额\\\\\\\",    \\\\\\\"value\\\\\\\": \\\\\\\"12345\\\\\\\",    \\\\\\\"suffix\\\\\\\": \\\\\\\"亿\\\\\\\"  },  {    \\\\\\\"backgroundColor\\\\\\\": \\\\\\\"#E6A23C\\\\\\\",    \\\\\\\"prefix\\\\\\\": \\\\\\\"海淀总销售额\\\\\\\",    \\\\\\\"value\\\\\\\": \\\\\\\"12345\\\\\\\",    \\\\\\\"suffix\\\\\\\": \\\\\\\"亿\\\\\\\"  },  {    \\\\\\\"backgroundColor\\\\\\\": \\\\\\\"#F56C6C\\\\\\\",    \\\\\\\"prefix\\\\\\\": \\\\\\\"西城总销售额\\\\\\\",    \\\\\\\"value\\\\\\\": \\\\\\\"12345\\\\\\\",    \\\\\\\"suffix\\\\\\\": \\\\\\\"亿\\\\\\\"  },  {    \\\\\\\"backgroundColor\\\\\\\": \\\\\\\"#F56C6C\\\\\\\",    \\\\\\\"prefix\\\\\\\": \\\\\\\"西城总销售额\\\\\\\",    \\\\\\\"value\\\\\\\": \\\\\\\"12345\\\\\\\",    \\\\\\\"suffix\\\\\\\": \\\\\\\"亿\\\\\\\"  },  {    \\\\\\\"backgroundColor\\\\\\\": \\\\\\\"#F56C6C\\\\\\\",    \\\\\\\"prefix\\\\\\\": \\\\\\\"西城总销售额\\\\\\\",    \\\\\\\"value\\\\\\\": \\\\\\\"12345\\\\\\\",    \\\\\\\"suffix\\\\\\\": \\\\\\\"亿\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":1865,\\\"height\\\":110},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"padding\\\":5,\\\"suffixFontSize\\\":16,\\\"prefixColor\\\":\\\"#FFFFFF\\\",\\\"color\\\":\\\"#FFFFFF\\\",\\\"prefixSplitx\\\":0,\\\"textAlign\\\":\\\"center\\\",\\\"prefixSplity\\\":0,\\\"suffixFontWeight\\\":\\\"normal\\\",\\\"prefix\\\":\\\"\\\",\\\"whole\\\":false,\\\"suffix\\\":\\\"\\\",\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"prefixFontSize\\\":16,\\\"prefixFontWeight\\\":\\\"normal\\\",\\\"suffixSplitx\\\":40,\\\"suffixColor\\\":\\\"#FFFFFF\\\",\\\"width\\\":50,\\\"lineNum\\\":6,\\\"fontSize\\\":16,\\\"borderSplitx\\\":20,\\\"borderSplity\\\":20,\\\"fontWeight\\\":\\\"normal\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"height\\\":50}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681743433728', NULL, '1016994145836257280', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":350,\\\"height\\\":385},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"12\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681764405248', NULL, '1016994145836257280', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":545,\\\"height\\\":468},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"12\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681781182464', NULL, '1016994145836257280', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":541,\\\"height\\\":379},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"12\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681793765376', NULL, '1016994145836257280', NULL, 'JRectangle', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"分类 1\\\\\\\",\\\\\\\"value\\\\\\\":560},{\\\\\\\"name\\\\\\\":\\\\\\\"分类 2\\\\\\\",\\\\\\\"value\\\\\\\":500},{\\\\\\\"name\\\\\\\":\\\\\\\"分类 3\\\\\\\",\\\\\\\"value\\\\\\\":150},{\\\\\\\"name\\\\\\\":\\\\\\\"分类 4\\\\\\\",\\\\\\\"value\\\\\\\":140},{\\\\\\\"name\\\\\\\":\\\\\\\"分类 5\\\\\\\",\\\\\\\"value\\\\\\\":115},{\\\\\\\"name\\\\\\\":\\\\\\\"分类 6\\\\\\\",\\\\\\\"value\\\\\\\":95},{\\\\\\\"name\\\\\\\":\\\\\\\"分类 7\\\\\\\",\\\\\\\"value\\\\\\\":90},{\\\\\\\"name\\\\\\\":\\\\\\\"分类 8\\\\\\\",\\\\\\\"value\\\\\\\":75},{\\\\\\\"name\\\\\\\":\\\\\\\"分类 9\\\\\\\",\\\\\\\"value\\\\\\\":98},{\\\\\\\"name\\\\\\\":\\\\\\\"分类 10\\\\\\\",\\\\\\\"value\\\\\\\":60},{\\\\\\\"name\\\\\\\":\\\\\\\"分类 11\\\\\\\",\\\\\\\"value\\\\\\\":45},{\\\\\\\"name\\\\\\\":\\\\\\\"分类 12\\\\\\\",\\\\\\\"value\\\\\\\":40},{\\\\\\\"name\\\\\\\":\\\\\\\"分类 13\\\\\\\",\\\\\\\"value\\\\\\\":40},{\\\\\\\"name\\\\\\\":\\\\\\\"分类 14\\\\\\\",\\\\\\\"value\\\\\\\":35},{\\\\\\\"name\\\\\\\":\\\\\\\"分类 15\\\\\\\",\\\\\\\"value\\\\\\\":40},{\\\\\\\"name\\\\\\\":\\\\\\\"分类 16\\\\\\\",\\\\\\\"value\\\\\\\":40},{\\\\\\\"name\\\\\\\":\\\\\\\"分类 17\\\\\\\",\\\\\\\"value\\\\\\\":40},{\\\\\\\"name\\\\\\\":\\\\\\\"分类 18\\\\\\\",\\\\\\\"value\\\\\\\":30},{\\\\\\\"name\\\\\\\":\\\\\\\"分类 19\\\\\\\",\\\\\\\"value\\\\\\\":28},{\\\\\\\"name\\\\\\\":\\\\\\\"分类 20\\\\\\\",\\\\\\\"value\\\\\\\":16}]\\\",\\\"size\\\":{\\\"width\\\":662,\\\"height\\\":364},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"tipColor\\\":\\\"#FFFFFF\\\",\\\"titleColor\\\":\\\"#FFFFFF\\\",\\\"titleFontSize\\\":12,\\\"theme\\\":\\\"default\\\",\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"tipFontSize\\\":12,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681810542592', NULL, '1016994145836257280', NULL, 'JPyramid3D', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"Java\\\\\\\",\\\\\\\"value\\\\\\\":800,\\\\\\\"color\\\\\\\":\\\\\\\"#45fed4\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"PHP\\\\\\\",\\\\\\\"value\\\\\\\":100,\\\\\\\"color\\\\\\\":\\\\\\\"#84a9ef\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"C#\\\\\\\",\\\\\\\"value\\\\\\\":50,\\\\\\\"color\\\\\\\":\\\\\\\"#f1e04f\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"Python\\\\\\\",\\\\\\\"value\\\\\\\":66,\\\\\\\"color\\\\\\\":\\\\\\\"#dbfe73\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":678,\\\"height\\\":438},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"颜色\\\"}],\\\"w\\\":735,\\\"dataType\\\":1,\\\"h\\\":485,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"size\\\":\\\"default\\\",\\\"zoom\\\":1}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017225681823125504', NULL, '1016994145836257280', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":1878.9484040956538,\\\"height\\\":130},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-15 10:18:32', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463101390848', NULL, '1016994412900175872', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"收视监控平台\\\",\\\"size\\\":{\\\"width\\\":376,\\\"height\\\":52},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":5,\\\"fontSize\\\":50,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463134945280', NULL, '1016994412900175872', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"Viewing  Monitoring platform\\\",\\\"size\\\":{\\\"width\\\":382,\\\"height\\\":45},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":26,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463160111104', NULL, '1016994412900175872', NULL, 'JDragDecoration', '{\\\"size\\\":{\\\"width\\\":403,\\\"height\\\":78},\\\"w\\\":300,\\\"dataType\\\":1,\\\"h\\\":100,\\\"option\\\":{\\\"dur\\\":3,\\\"mainColor\\\":\\\"#00CED1\\\",\\\"fontSize\\\":15,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"装饰8\\\",\\\"subColor\\\":\\\"#FAD400\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463176888320', NULL, '1016994412900175872', NULL, 'JCurrentTime', '{\\\"chartData\\\":\\\"\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":270,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":270,\\\"dataType\\\":1,\\\"h\\\":33,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"bgColor\\\":\\\"#4A4A4A\\\",\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"showWeek\\\":\\\"hide\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"fontColor\\\":\\\"#4A4A4A\\\"}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463185276928', NULL, '1016994412900175872', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":93,\\\"height\\\":61},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgos.oss-cn-beijing.aliyuncs.com/upload/test/1e80a2350e3a4b378a4ba7647aef9a17.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463202054144', NULL, '1016994412900175872', NULL, 'JWeatherForecast', '{\\\"size\\\":{\\\"width\\\":267,\\\"height\\\":59},\\\"w\\\":311,\\\"dataType\\\":1,\\\"h\\\":47,\\\"option\\\":{\\\"template\\\":11,\\\"bgColor\\\":\\\"\\\",\\\"city\\\":\\\"\\\",\\\"num\\\":2,\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#fff\\\",\\\"url\\\":\\\"\\\"}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463223025664', NULL, '1016994412900175872', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":441},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463235608576', NULL, '1016994412900175872', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":582,\\\"height\\\":445},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463248191488', NULL, '1016994412900175872', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":589,\\\"height\\\":450},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463260774400', NULL, '1016994412900175872', NULL, 'JVideoJs', '{\\\"size\\\":{\\\"width\\\":568,\\\"height\\\":405},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"timeOut\\\":0,\\\"option\\\":{\\\"url\\\":\\\"http://vjs.zencdn.net/v/oceans.mp4\\\"}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463281745920', NULL, '1016994412900175872', NULL, 'JVideoJs', '{\\\"size\\\":{\\\"width\\\":560,\\\"height\\\":416},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"timeOut\\\":0,\\\"option\\\":{\\\"url\\\":\\\"http://vjs.zencdn.net/v/oceans.mp4\\\"}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463294328832', NULL, '1016994412900175872', NULL, 'JVideoJs', '{\\\"size\\\":{\\\"width\\\":570,\\\"height\\\":433},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"timeOut\\\":0,\\\"option\\\":{\\\"url\\\":\\\"http://vjs.zencdn.net/v/oceans.mp4\\\"}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463311106048', NULL, '1016994412900175872', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"全网实时收视率\\\",\\\"size\\\":{\\\"width\\\":262,\\\"height\\\":56},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":35,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463319494656', NULL, '1016994412900175872', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":1790,\\\"height\\\":417},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"2\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463332077568', NULL, '1016994412900175872', NULL, 'JMultipleLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"周一\\\\\\\",    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周二\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周三\\\\\\\",    \\\\\\\"value\\\\\\\": 40,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周四\\\\\\\",    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周五\\\\\\\",    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周一\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周二\\\\\\\",    \\\\\\\"value\\\\\\\": 60,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周三\\\\\\\",    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周四\\\\\\\",    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周五\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":485,\\\"height\\\":335},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"name\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#FFD700\\\"},{\\\"color\\\":\\\"#90EE90\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"}},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":40,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"areaStyleOpacity\\\":0.5,\\\"symbolSize\\\":5,\\\"lineType\\\":\\\"smooth\\\",\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"lineWidth\\\":2}],\\\"legend\\\":{\\\"r\\\":1},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#1D1F26\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463357243392', NULL, '1016994412900175872', NULL, 'JMultipleLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"周一\\\\\\\",    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周二\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周三\\\\\\\",    \\\\\\\"value\\\\\\\": 40,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周四\\\\\\\",    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周五\\\\\\\",    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周一\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周二\\\\\\\",    \\\\\\\"value\\\\\\\": 60,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周三\\\\\\\",    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周四\\\\\\\",    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周五\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":485,\\\"height\\\":335},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"show\\\":true,\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#1E86EB\\\"},{\\\"color\\\":\\\"#FF8C00\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":40,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"symbolSize\\\":5,\\\"lineType\\\":\\\"smooth\\\",\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"lineWidth\\\":2}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463369826304', NULL, '1016994412900175872', NULL, 'JMultipleLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"周一\\\\\\\",    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周二\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周三\\\\\\\",    \\\\\\\"value\\\\\\\": 40,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周四\\\\\\\",    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周五\\\\\\\",    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周一\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周二\\\\\\\",    \\\\\\\"value\\\\\\\": 60,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周三\\\\\\\",    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周四\\\\\\\",    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周五\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":485,\\\"height\\\":335},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#C71585\\\"},{\\\"color\\\":\\\"#FF4500\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"}},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":40,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"symbolSize\\\":5,\\\"lineType\\\":\\\"smooth\\\",\\\"lineWidth\\\":2}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463382409216', NULL, '1016994412900175872', NULL, 'JSelectRadio', '{\\\"compShowConfig\\\":[{\\\"compVals\\\":[\\\"22aae23c-029e-456e-a1ac-0936cbfa6b6b\\\",\\\"9d1f25e6-5446-4f78-90c6-7f9bd674b058\\\",\\\"85841a8f-e6cd-479a-9ba8-c36497b4e912\\\",\\\"236cba9d-2c70-407e-8013-ee37e3d5d124\\\",\\\"es-drager-1731649759290-3\\\",\\\"es-drager-1731649765690-4\\\"],\\\"selectVal\\\":\\\"1\\\"},{\\\"compVals\\\":[\\\"3acfc295-ea6d-4e16-83fd-bfd8d9022d8d\\\",\\\"f499c09e-61cc-40f1-8496-d57d2f98f82c\\\",\\\"a82c61b6-4287-422a-b8e7-1cb34d17859a\\\",\\\"26735d51-f628-4ec6-8886-0ede0a7443af\\\",\\\"es-drager-1731650783569-1\\\",\\\"es-drager-1731650792607-2\\\"],\\\"selectVal\\\":\\\"2\\\"}],\\\"chartData\\\":\\\"[  {    \\\\\\\"label\\\\\\\": \\\\\\\"中央卫视\\\\\\\",    \\\\\\\"value\\\\\\\": \\\\\\\"1\\\\\\\"  },  {    \\\\\\\"label\\\\\\\": \\\\\\\"地方卫视\\\\\\\",    \\\\\\\"value\\\\\\\": \\\\\\\"2\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":400,\\\"height\\\":80},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"文本\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":400,\\\"dataType\\\":1,\\\"h\\\":80,\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#39414d\\\",\\\"borderColor\\\":\\\"\\\",\\\"color\\\":\\\"#FFFFFF\\\",\\\"activeColor\\\":\\\"#fff\\\",\\\"activeBorderColor\\\":\\\"\\\",\\\"borderWidth\\\":0,\\\"activeBackgroundColor\\\":\\\"#0a73ff\\\",\\\"fontSize\\\":30,\\\"type\\\":\\\"radio\\\",\\\"activeBorderWidth\\\":0}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463394992128', NULL, '1016994412900175872', NULL, 'JVideoPlay', '{\\\"chartData\\\":\\\"[{\\\\\\\"src\\\\\\\":\\\\\\\"http://vjs.zencdn.net/v/oceans.mp4\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":516,\\\"height\\\":351},\\\"background\\\":\\\"#4A90E2\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"路径\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"loop\\\":true,\\\"autoPlay\\\":false}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463411769344', NULL, '1016994412900175872', NULL, 'JVideoPlay', '{\\\"chartData\\\":\\\"[{\\\\\\\"src\\\\\\\":\\\\\\\"http://vjs.zencdn.net/v/oceans.mp4\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":518,\\\"height\\\":361},\\\"background\\\":\\\"#4A90E2\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"路径\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"loop\\\":true,\\\"autoPlay\\\":false}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463436935168', NULL, '1016994412900175872', NULL, 'JVideoPlay', '{\\\"chartData\\\":\\\"[{\\\\\\\"src\\\\\\\":\\\\\\\"http://vjs.zencdn.net/v/oceans.mp4\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":521,\\\"height\\\":378},\\\"background\\\":\\\"#4A90E2\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"路径\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"loop\\\":true,\\\"autoPlay\\\":false}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463449518080', NULL, '1016994412900175872', NULL, 'JBubble', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": 4,    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 5,    \\\\\\\"value\\\\\\\": 75,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 6,    \\\\\\\"value\\\\\\\": 68,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 7,    \\\\\\\"value\\\\\\\": 51,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 8,    \\\\\\\"value\\\\\\\": 92,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 9,    \\\\\\\"value\\\\\\\": 68,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 10,    \\\\\\\"value\\\\\\\": 78,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 11,    \\\\\\\"value\\\\\\\": 69,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 12,    \\\\\\\"value\\\\\\\": 83,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 11,    \\\\\\\"value\\\\\\\": 6,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 10,    \\\\\\\"value\\\\\\\": 8,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 9,    \\\\\\\"value\\\\\\\": 7,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 8,    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 7,    \\\\\\\"value\\\\\\\": 11,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 6,    \\\\\\\"value\\\\\\\": 4,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 10,    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 8,    \\\\\\\"value\\\\\\\": 16,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 7,    \\\\\\\"value\\\\\\\": 9,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":851,\\\"height\\\":360},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"interval\\\":2}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"}},\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":50,\\\"containLabel\\\":true},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463462100992', NULL, '1016994412900175872', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"视频访问来源\\\",\\\"size\\\":{\\\"width\\\":268,\\\"height\\\":63},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":35,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017286463478878208', NULL, '1016994412900175872', NULL, 'JRing', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 1048,    \\\\\\\"name\\\\\\\": \\\\\\\"营销广告\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 735,    \\\\\\\"name\\\\\\\": \\\\\\\"搜索引擎\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 580,    \\\\\\\"name\\\\\\\": \\\\\\\"邮件营销\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 484,    \\\\\\\"name\\\\\\\": \\\\\\\"联盟广告\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 300,    \\\\\\\"name\\\\\\\": \\\\\\\"视频广告\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":666,\\\"height\\\":385},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":480,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":50,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"show\\\":true,\\\"fontSize\\\":14,\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"show\\\":false},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#1D1F26\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 14:20:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321185898713088', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"XX省XX市监狱\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321185940656128', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"狱政科数据展示\\\",\\\"size\\\":{\\\"width\\\":519,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":15,\\\"fontSize\\\":32,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321185957433344', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"罪犯管理概况\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321185974210560', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"当月劳动产值\\\",\\\"size\\\":{\\\"width\\\":142,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321185986793472', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"当月劳改达标率\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186003570688', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"当月违规总人数\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186024542208', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"严格管教人数\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186041319424', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"615006\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0BE3E3\\\",\\\"fontSize\\\":32,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186053902336', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"98\\\",\\\"size\\\":{\\\"width\\\":49,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0E56F1\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186066485248', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"260\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0FB2F8\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186095845376', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"77\\\",\\\"size\\\":{\\\"width\\\":89,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FEB246\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186108428288', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"劳动改造情况\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186121011200', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"罪犯处遇等级变更情况\\\",\\\"size\\\":{\\\"width\\\":211,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186133594112', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"罪犯实时违规记录\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186154565632', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"罪犯进出狱名单\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186175537152', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"%\\\",\\\"size\\\":{\\\"width\\\":44,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186188120064', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"当前在狱人数\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186200702976', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"狱外流动人数\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186217480192', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"5256\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0E56F1\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186238451712', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"102\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0E56F1\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186251034624', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"满分人数\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186263617536', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"良好人数\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186280394752', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"158\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0E56F1\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186305560576', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"502\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0BE3E3\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186322337792', NULL, '1015895036886831104', NULL, 'JMultipleBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{    \\\\\\\"categories\\\\\\\": [        \\\\\\\"6月\\\\\\\",        \\\\\\\"7月\\\\\\\",        \\\\\\\"8月\\\\\\\",        \\\\\\\"9月\\\\\\\",        \\\\\\\"10月\\\\\\\",        \\\\\\\"11月\\\\\\\"    ],    \\\\\\\"series\\\\\\\": [        {            \\\\\\\"name\\\\\\\": \\\\\\\"入狱人数\\\\\\\",            \\\\\\\"data\\\\\\\": [                4,                26,                30,                16,                24,                12            ]        },        {            \\\\\\\"name\\\\\\\": \\\\\\\"出狱人数\\\\\\\",            \\\\\\\"data\\\\\\\": [                24,                12,                42,                26,                20,                24            ]        }    ]}\\\",\\\"size\\\":{\\\"width\\\":489,\\\"height\\\":216},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#0E56F1\\\"},{\\\"color\\\":\\\"#0BE3E3\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"}},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":5,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":13,\\\"itemStyle\\\":{\\\"borderRadius\\\":0}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186334920704', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"当月入狱人数\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186351697920', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"14\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0BE3E3\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186376863744', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"当月出狱人数\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186393640960', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"5\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0BE3E3\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186406223872', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"及格人数\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186431389696', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"2027\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0FB2F8\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186452361216', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"未达标人数\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186464944128', NULL, '1015895036886831104', NULL, 'JText', '{\\\"borderColor\\\":\\\"#F2D8D800\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"108\\\",\\\"size\\\":{\\\"width\\\":153,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FEB246\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186477527040', NULL, '1015895036886831104', NULL, 'JPie', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[    {        \\\\\\\"name\\\\\\\": \\\\\\\"普管\\\\\\\",        \\\\\\\"value\\\\\\\": 1600,        \\\\\\\"url\\\\\\\": \\\\\\\"http://jeecg.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"严管\\\\\\\",        \\\\\\\"value\\\\\\\": 200,        \\\\\\\"url\\\\\\\": \\\\\\\"http://jeecg.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"value\\\\\\\": 160,        \\\\\\\"url\\\\\\\": \\\\\\\"http://jeecg.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"特殊管理\\\\\\\",        \\\\\\\"value\\\\\\\": 30,        \\\\\\\"url\\\\\\\": \\\\\\\"http://jeecg.com\\\\\\\"    }]\\\",\\\"size\\\":{\\\"width\\\":412,\\\"height\\\":263},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#00EAFF\\\"},{\\\"color\\\":\\\"#01BBF2\\\"},{\\\"color\\\":\\\"#028CE5\\\"},{\\\"color\\\":\\\"#035ED7\\\"},{\\\"color\\\":\\\"#58D9F9\\\"}],\\\"grid\\\":{\\\"top\\\":53,\\\"left\\\":50,\\\"show\\\":false},\\\"legend\\\":{\\\"r\\\":26,\\\"orient\\\":\\\"horizontal\\\",\\\"show\\\":true},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186498498560', NULL, '1015895036886831104', NULL, 'JPie', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[    {        \\\\\\\"name\\\\\\\": \\\\\\\"劳动岗位\\\\\\\",        \\\\\\\"value\\\\\\\": 1600,        \\\\\\\"url\\\\\\\": \\\\\\\"http://jeecg.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"辅劳岗位\\\\\\\",        \\\\\\\"value\\\\\\\": 200,        \\\\\\\"url\\\\\\\": \\\\\\\"http://jeecg.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"非劳岗位\\\\\\\",        \\\\\\\"value\\\\\\\": 160,        \\\\\\\"url\\\\\\\": \\\\\\\"http://jeecg.com\\\\\\\"    }]\\\",\\\"size\\\":{\\\"width\\\":412,\\\"height\\\":263},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#00EAFF\\\"},{\\\"color\\\":\\\"#01BBF2\\\"},{\\\"color\\\":\\\"#028CE5\\\"},{\\\"color\\\":\\\"#035ED7\\\"},{\\\"color\\\":\\\"#58D9F9\\\"}],\\\"grid\\\":{\\\"top\\\":53,\\\"left\\\":50,\\\"show\\\":false},\\\"legend\\\":{\\\"r\\\":26,\\\"orient\\\":\\\"horizontal\\\",\\\"show\\\":true},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186515275776', NULL, '1015895036886831104', NULL, 'JMultipleBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{    \\\\\\\"categories\\\\\\\": [        \\\\\\\"8月\\\\\\\",        \\\\\\\"9月\\\\\\\",        \\\\\\\"10月\\\\\\\",        \\\\\\\"11月\\\\\\\"    ],    \\\\\\\"series\\\\\\\": [        {            \\\\\\\"name\\\\\\\": \\\\\\\"满分\\\\\\\",            \\\\\\\"data\\\\\\\": [                240,                201,                192,                168            ]        },        {            \\\\\\\"name\\\\\\\": \\\\\\\"良好\\\\\\\",            \\\\\\\"data\\\\\\\": [                496,                680,                580,                480            ]        },        {            \\\\\\\"name\\\\\\\": \\\\\\\"及格\\\\\\\",            \\\\\\\"data\\\\\\\": [                2810,                2160,                2320,                2620            ]        },        {            \\\\\\\"name\\\\\\\": \\\\\\\"未达标\\\\\\\",            \\\\\\\"data\\\\\\\": [                168,                480,                360,                108            ]        }    ]}\\\",\\\"size\\\":{\\\"width\\\":529,\\\"height\\\":236},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#0E56F1\\\"},{\\\"color\\\":\\\"#0BE3E3\\\"},{\\\"color\\\":\\\"#0FB2F8\\\"},{\\\"color\\\":\\\"#FEB246\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":5,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":15,\\\"itemStyle\\\":{\\\"borderRadius\\\":0}}],\\\"legend\\\":{\\\"r\\\":1,\\\"t\\\":1},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186532052992', NULL, '1015895036886831104', NULL, 'JDynamicBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{    \\\\\\\"categories\\\\\\\": [        \\\\\\\"8月\\\\\\\",        \\\\\\\"9月\\\\\\\",        \\\\\\\"10月\\\\\\\",        \\\\\\\"11月\\\\\\\"    ],    \\\\\\\"series\\\\\\\": [        {            \\\\\\\"name\\\\\\\": \\\\\\\"严管升普管人数\\\\\\\",            \\\\\\\"data\\\\\\\": [                86,                64,                182,                134            ]        },        {            \\\\\\\"name\\\\\\\": \\\\\\\"普管升宽管人数\\\\\\\",            \\\\\\\"data\\\\\\\": [                162,                42,                69,                97            ]        }    ]}\\\",\\\"size\\\":{\\\"width\\\":464,\\\"height\\\":177},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":30,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":9,\\\"showBackground\\\":false,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"#51626E\\\"},\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\"}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#B9B8CE\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#1D1F26\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186544635904', NULL, '1015895036886831104', NULL, 'JDynamicBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{    \\\\\\\"categories\\\\\\\": [        \\\\\\\"8月\\\\\\\",        \\\\\\\"9月\\\\\\\",        \\\\\\\"10月\\\\\\\",        \\\\\\\"11月\\\\\\\"    ],    \\\\\\\"series\\\\\\\": [        {            \\\\\\\"name\\\\\\\": \\\\\\\"普管降严管人数\\\\\\\",            \\\\\\\"data\\\\\\\": [                86,                64,                182,                134            ]        },        {            \\\\\\\"name\\\\\\\": \\\\\\\"宽管降普管人数\\\\\\\",            \\\\\\\"data\\\\\\\": [                162,                42,                69,                97            ]        }    ]}\\\",\\\"size\\\":{\\\"width\\\":450,\\\"height\\\":171},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":30,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":9,\\\"showBackground\\\":false,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"#51626E\\\"},\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\"}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#B9B8CE\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#1D1F26\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186561413120', NULL, '1015895036886831104', NULL, 'JScrollBoard', '{\\\"chartData\\\":\\\"[    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"11014657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"入狱\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"10年\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"入狱\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"1年\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"入狱\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3年\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"出狱\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"无期\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"出狱\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"无期\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"出狱\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"5年\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"入狱\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"5年\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"入狱\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"5年\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"入狱\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"5年\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"出狱\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3年\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"入狱\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"5年\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"入狱\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"5年\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"出狱\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3年\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"出狱\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"10年\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"入狱\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"无期\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"出狱\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"无期\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    }]\\\",\\\"size\\\":{\\\"width\\\":534,\\\"height\\\":321},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"oddRowBGC\\\":\\\"#030C35\\\",\\\"headShow\\\":true,\\\"hoverPause\\\":true,\\\"indexWidth\\\":80,\\\"index\\\":false,\\\"carousel\\\":\\\"single\\\",\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"evenRowBGC\\\":\\\"#003A50\\\",\\\"header\\\":[{\\\"width\\\":\\\"100\\\",\\\"label\\\":\\\"罪犯姓名\\\"},{\\\"width\\\":\\\"100\\\",\\\"label\\\":\\\"罪犯编号\\\"},{\\\"width\\\":\\\"100\\\",\\\"label\\\":\\\"处遇等级\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"状态\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"刑期\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"时间\\\"}],\\\"headerBGC\\\":\\\"#04183A\\\",\\\"headerHeight\\\":50,\\\"waitTime\\\":2000,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186582384640', NULL, '1015895036886831104', NULL, 'JScrollBoard', '{\\\"chartData\\\":\\\"[    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"安全违规操作\\\\\\\",        \\\\\\\"price\\\\\\\": \\\\\\\"3分\\\\\\\",        \\\\\\\"amount\\\\\\\": \\\\\\\"2\\\\\\\",        \\\\\\\"cost\\\\\\\": \\\\\\\"张警官\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"打架斗殴\\\\\\\",        \\\\\\\"price\\\\\\\": \\\\\\\"6分\\\\\\\",        \\\\\\\"amount\\\\\\\": \\\\\\\"2\\\\\\\",        \\\\\\\"cost\\\\\\\": \\\\\\\"张警官\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"聚众赌博\\\\\\\",        \\\\\\\"price\\\\\\\": \\\\\\\"3分\\\\\\\",        \\\\\\\"amount\\\\\\\": \\\\\\\"2\\\\\\\",        \\\\\\\"cost\\\\\\\": \\\\\\\"张警官\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"安全违规操作\\\\\\\",        \\\\\\\"price\\\\\\\": \\\\\\\"3分\\\\\\\",        \\\\\\\"amount\\\\\\\": \\\\\\\"2\\\\\\\",        \\\\\\\"cost\\\\\\\": \\\\\\\"张警官\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"劳动迟到\\\\\\\",        \\\\\\\"price\\\\\\\": \\\\\\\"3分\\\\\\\",        \\\\\\\"amount\\\\\\\": \\\\\\\"2\\\\\\\",        \\\\\\\"cost\\\\\\\": \\\\\\\"张警官\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"劳动迟到\\\\\\\",        \\\\\\\"price\\\\\\\": \\\\\\\"3分\\\\\\\",        \\\\\\\"amount\\\\\\\": \\\\\\\"2\\\\\\\",        \\\\\\\"cost\\\\\\\": \\\\\\\"张警官\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"劳动迟到\\\\\\\",        \\\\\\\"price\\\\\\\": \\\\\\\"3分\\\\\\\",        \\\\\\\"amount\\\\\\\": \\\\\\\"2\\\\\\\",        \\\\\\\"cost\\\\\\\": \\\\\\\"张警官\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"安全违规操作\\\\\\\",        \\\\\\\"price\\\\\\\": \\\\\\\"3分\\\\\\\",        \\\\\\\"amount\\\\\\\": \\\\\\\"2\\\\\\\",        \\\\\\\"cost\\\\\\\": \\\\\\\"张警官\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"安全违规操作\\\\\\\",        \\\\\\\"price\\\\\\\": \\\\\\\"3分\\\\\\\",        \\\\\\\"amount\\\\\\\": \\\\\\\"2\\\\\\\",        \\\\\\\"cost\\\\\\\": \\\\\\\"张警官\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"安全违规操作\\\\\\\",        \\\\\\\"price\\\\\\\": \\\\\\\"3分\\\\\\\",        \\\\\\\"amount\\\\\\\": \\\\\\\"2\\\\\\\",        \\\\\\\"cost\\\\\\\": \\\\\\\"张警官\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"安全违规操作\\\\\\\",        \\\\\\\"price\\\\\\\": \\\\\\\"3分\\\\\\\",        \\\\\\\"amount\\\\\\\": \\\\\\\"2\\\\\\\",        \\\\\\\"cost\\\\\\\": \\\\\\\"张警官\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"安全违规操作\\\\\\\",        \\\\\\\"price\\\\\\\": \\\\\\\"3分\\\\\\\",        \\\\\\\"amount\\\\\\\": \\\\\\\"2\\\\\\\",        \\\\\\\"cost\\\\\\\": \\\\\\\"张警官\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"大声喧哗\\\\\\\",        \\\\\\\"price\\\\\\\": \\\\\\\"6分\\\\\\\",        \\\\\\\"amount\\\\\\\": \\\\\\\"2\\\\\\\",        \\\\\\\"cost\\\\\\\": \\\\\\\"张警官\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"大声喧哗\\\\\\\",        \\\\\\\"price\\\\\\\": \\\\\\\"6分\\\\\\\",        \\\\\\\"amount\\\\\\\": \\\\\\\"2\\\\\\\",        \\\\\\\"cost\\\\\\\": \\\\\\\"张警官\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"散布谣言\\\\\\\",        \\\\\\\"price\\\\\\\": \\\\\\\"6分\\\\\\\",        \\\\\\\"amount\\\\\\\": \\\\\\\"2\\\\\\\",        \\\\\\\"cost\\\\\\\": \\\\\\\"张警官\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"散布谣言\\\\\\\",        \\\\\\\"price\\\\\\\": \\\\\\\"6分\\\\\\\",        \\\\\\\"amount\\\\\\\": \\\\\\\"2\\\\\\\",        \\\\\\\"cost\\\\\\\": \\\\\\\"张警官\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    }]\\\",\\\"size\\\":{\\\"width\\\":676,\\\"height\\\":324},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"oddRowBGC\\\":\\\"#030C35\\\",\\\"headShow\\\":true,\\\"hoverPause\\\":true,\\\"indexWidth\\\":80,\\\"index\\\":false,\\\"carousel\\\":\\\"single\\\",\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"evenRowBGC\\\":\\\"#003A50\\\",\\\"header\\\":[{\\\"width\\\":\\\"100\\\",\\\"label\\\":\\\"罪犯姓名\\\"},{\\\"width\\\":\\\"100\\\",\\\"label\\\":\\\"罪犯编号\\\"},{\\\"width\\\":\\\"100\\\",\\\"label\\\":\\\"出狱等级\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"违规事由\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"扣分\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"执行预警\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"时间\\\"}],\\\"headerBGC\\\":\\\"#04183A\\\",\\\"headerHeight\\\":50,\\\"waitTime\\\":2000,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1017321186599161856', NULL, '1015895036886831104', NULL, 'JCurrentTime', '{\\\"chartData\\\":\\\"\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":289,\\\"height\\\":33},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":270,\\\"dataType\\\":1,\\\"h\\\":33,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"showWeek\\\":\\\"show\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-15 16:38:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136064339968', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"XX省XX市监狱\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136139837440', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"财务科数据展示\\\",\\\"size\\\":{\\\"width\\\":466,\\\"height\\\":45},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":10,\\\"fontSize\\\":32,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136160808960', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"物料采购概况\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136177586176', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"账户异常数据\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136190169088', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"药品领用实时数据\\\",\\\"size\\\":{\\\"width\\\":177,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136206946304', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"罪犯实时上下账数据\\\",\\\"size\\\":{\\\"width\\\":195,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136232112128', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"资金异常账户\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136248889344', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"当月商品采购金额\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136261472256', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"当月药品采购金额\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136274055168', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"当月被服采购金额\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136295026688', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"当月办公用品采购金额\\\",\\\"size\\\":{\\\"width\\\":151,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136311803904', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"资金异常账户数\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136328581120', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"异常资金总额\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136336969728', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"银行结账异常数\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136353746944', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"出所结算异常总额\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136374718464', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"同比增长金额\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":11,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136395689984', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"同比增长率\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":11,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136412467200', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"同比增长金额\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":11,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136429244416', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"同比增长率\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":11,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136450215936', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"当月上账资金总额\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136466993152', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"当月下账资金总额\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136487964672', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"56024.23\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#01BBF2\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136508936192', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"82216.68\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#00EAFF\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136525713408', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"1240.01\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#028CE5\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136538296320', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"3720.21\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#151FDD\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136555073536', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"15335.21\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0BE3E3\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136563462144', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"233500.06\\\",\\\"size\\\":{\\\"width\\\":179,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FEB246\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136580239360', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"311\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0E56F1\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136592822272', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"22216.02\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0FB2F8\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136605405184', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"34560.32\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FEB246\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136622182400', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"22216.68\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#00EAFF\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136638959616', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"123602.23\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0BE3E3\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136655736832', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"7.23\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0BE3E3\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136668319744', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"53602.23\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FEB246\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136685096960', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"4.23\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FEB246\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136693485568', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"%\\\",\\\"size\\\":{\\\"width\\\":84,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136710262784', NULL, '1016497921022545920', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"%\\\",\\\"size\\\":{\\\"width\\\":84,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136727040000', NULL, '1016497921022545920', NULL, 'JMultipleBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{    \\\\\\\"categories\\\\\\\": [        \\\\\\\"7月\\\\\\\",        \\\\\\\"8月\\\\\\\",        \\\\\\\"9月\\\\\\\",        \\\\\\\"10月\\\\\\\",        \\\\\\\"11月\\\\\\\"    ],    \\\\\\\"series\\\\\\\": [        {            \\\\\\\"name\\\\\\\": \\\\\\\"商品采购占比\\\\\\\",            \\\\\\\"data\\\\\\\": [                12,                16,                13,                20,                24            ]        },        {            \\\\\\\"name\\\\\\\": \\\\\\\"药品采购占比\\\\\\\",            \\\\\\\"data\\\\\\\": [                28,                24,                25,                13,                12            ]        },        {            \\\\\\\"name\\\\\\\": \\\\\\\"被服采购占比\\\\\\\",            \\\\\\\"data\\\\\\\": [                34,                22,                32,                34,                40            ]        },        {            \\\\\\\"name\\\\\\\": \\\\\\\"办公用品采购占比\\\\\\\",            \\\\\\\"data\\\\\\\": [                26,                38,                30,                28,                16            ]        }    ]}\\\",\\\"size\\\":{\\\"width\\\":543,\\\"height\\\":257},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#00EAFF\\\"},{\\\"color\\\":\\\"#01BBF2\\\"},{\\\"color\\\":\\\"#028CE5\\\"},{\\\"color\\\":\\\"#151FDD\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":55,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":5,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":10,\\\"itemStyle\\\":{\\\"borderRadius\\\":0},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true,\\\"position\\\":\\\"top\\\"}}],\\\"legend\\\":{\\\"r\\\":13,\\\"t\\\":1},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#1D1F26\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136743817216', NULL, '1016497921022545920', NULL, 'JMultipleLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{    \\\\\\\"categories\\\\\\\": [        \\\\\\\"7月\\\\\\\",        \\\\\\\"8月\\\\\\\",        \\\\\\\"9月\\\\\\\",        \\\\\\\"10月\\\\\\\",        \\\\\\\"11月\\\\\\\"    ],    \\\\\\\"series\\\\\\\": [        {            \\\\\\\"name\\\\\\\": \\\\\\\"上账资金走势\\\\\\\",            \\\\\\\"data\\\\\\\": [                18100.09,                28781.31,                25654.2,                30398.73,                16560.39            ]        },        {            \\\\\\\"name\\\\\\\": \\\\\\\"下账资金走势\\\\\\\",            \\\\\\\"data\\\\\\\": [                20100.09,                16281.31,                18654.2,                20021.73,                31560.02            ]        }    ]}\\\",\\\"size\\\":{\\\"width\\\":682,\\\"height\\\":309},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#0BE3E3\\\"},{\\\"color\\\":\\\"#FEB246\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"}},\\\"grid\\\":{\\\"top\\\":55,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":5,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"symbol\\\":\\\"circle\\\",\\\"symbolSize\\\":5,\\\"lineType\\\":\\\"smooth\\\",\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true},\\\"lineWidth\\\":3}],\\\"legend\\\":{\\\"r\\\":56},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136756400128', NULL, '1016497921022545920', NULL, 'JArea', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"{    \\\\\\\"categories\\\\\\\": [        \\\\\\\"7月\\\\\\\",        \\\\\\\"8月\\\\\\\",        \\\\\\\"9月\\\\\\\",        \\\\\\\"10月\\\\\\\",        \\\\\\\"11月\\\\\\\"    ],    \\\\\\\"series\\\\\\\": [        {            \\\\\\\"name\\\\\\\": \\\\\\\"异常资金总额走势\\\\\\\",            \\\\\\\"data\\\\\\\": [                18100.09,                28781.31,                25654.2,                30398.73,                34560.39            ]        }    ]}\\\",\\\"size\\\":{\\\"width\\\":530,\\\"height\\\":258},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#FEB246\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"data\\\":[],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"boundaryGap\\\":false,\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"izSmooth\\\":true,\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":10,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"areaStyleOpacity\\\":0.6,\\\"areaStyle\\\":{},\\\"data\\\":[],\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"left\\\":10,\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#B9B8CE\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136764788736', NULL, '1016497921022545920', NULL, 'JScrollBoard', '{\\\"chartData\\\":\\\"[    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    }]\\\",\\\"size\\\":{\\\"width\\\":531,\\\"height\\\":326},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"oddRowBGC\\\":\\\"#030D3A\\\",\\\"headShow\\\":true,\\\"hoverPause\\\":true,\\\"indexWidth\\\":80,\\\"index\\\":false,\\\"carousel\\\":\\\"single\\\",\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"evenRowBGC\\\":\\\"#003B51\\\",\\\"header\\\":[{\\\"width\\\":100,\\\"label\\\":\\\"罪犯姓名\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"罪犯编号\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"处遇等级\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"领取药品\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"数量\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"时间\\\"}],\\\"headerBGC\\\":\\\"#041732\\\",\\\"headerHeight\\\":55,\\\"waitTime\\\":2000,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136777371648', NULL, '1016497921022545920', NULL, 'JScrollBoard', '{\\\"chartData\\\":\\\"[    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"上账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"244.50\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"上账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"1000.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"下账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"64.50\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"下账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"162.30\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"16.71\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"上账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"2000.00\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"上账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"20.10\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"下账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"120.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"上账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"244.10\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"下账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"0.50\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"120.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"下账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"1000.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"下账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"244.50\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"下账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"244.50\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    }]\\\",\\\"size\\\":{\\\"width\\\":671,\\\"height\\\":338},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"oddRowBGC\\\":\\\"#030D3A\\\",\\\"headShow\\\":true,\\\"hoverPause\\\":true,\\\"indexWidth\\\":80,\\\"index\\\":false,\\\"carousel\\\":\\\"single\\\",\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"evenRowBGC\\\":\\\"#003B51\\\",\\\"header\\\":[{\\\"width\\\":100,\\\"label\\\":\\\"罪犯姓名\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"罪犯编号\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"处遇等级\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"流向\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"A账户\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"B账户\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"C账户\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"时间\\\"}],\\\"headerBGC\\\":\\\"#041732\\\",\\\"headerHeight\\\":55,\\\"waitTime\\\":2000,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1019836136794148864', NULL, '1016497921022545920', NULL, 'JScrollBoard', '{\\\"chartData\\\":\\\"[    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"出所结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"205.32\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"出所结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"68.32\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"银行结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"381.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"银行结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"381.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"出所结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"8.32\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"出所结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"68.32\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"银行结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"381.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"银行结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"381.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"出所结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"68.32\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"银行结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"32.24\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"银行结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"381.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"银行结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"381.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"出所结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"68.32\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"银行结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"32.24\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    }]\\\",\\\"size\\\":{\\\"width\\\":531,\\\"height\\\":326},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"oddRowBGC\\\":\\\"#030D3A\\\",\\\"headShow\\\":true,\\\"hoverPause\\\":true,\\\"indexWidth\\\":80,\\\"index\\\":false,\\\"carousel\\\":\\\"single\\\",\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"evenRowBGC\\\":\\\"#003B51\\\",\\\"header\\\":[{\\\"width\\\":100,\\\"label\\\":\\\"罪犯姓名\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"银行账户\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"异常来源\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"异常金额\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"时间\\\"}],\\\"headerBGC\\\":\\\"#041732\\\",\\\"headerHeight\\\":55,\\\"waitTime\\\":2000,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-22 15:11:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143312891904', NULL, '1014376428645961728', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":1917.0000000000002,\\\"height\\\":80},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/6%E5%A4%B4%E5%9B%BE%E7%89%87_1657175683138.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143350640640', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"北京科技数字化云平台\\\",\\\"size\\\":{\\\"width\\\":420,\\\"height\\\":77},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":7,\\\"fontSize\\\":27,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143363223552', NULL, '1014376428645961728', NULL, 'JCurrentTime', '{\\\"chartData\\\":\\\"\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":421,\\\"height\\\":35},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"showWeek\\\":\\\"hide\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143375806464', NULL, '1014376428645961728', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":130,\\\"height\\\":52},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/6菱形_1657175841432.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143384195072', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"网关管理\\\",\\\"size\\\":{\\\"width\\\":80,\\\"height\\\":41},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143392583680', NULL, '1014376428645961728', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":130,\\\"height\\\":52},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/6菱形_1657175841432.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143405166592', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"云组态\\\",\\\"size\\\":{\\\"width\\\":80,\\\"height\\\":40},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143426138112', NULL, '1014376428645961728', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":130,\\\"height\\\":52},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/6菱形_1657175841432.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143442915328', NULL, '1014376428645961728', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":130,\\\"height\\\":52},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/6菱形_1657175841432.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143455498240', NULL, '1014376428645961728', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":130,\\\"height\\\":52},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/6菱形_1657175841432.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143468081152', NULL, '1014376428645961728', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":130,\\\"height\\\":52},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/6菱形_1657175841432.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143484858368', NULL, '1014376428645961728', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":130,\\\"height\\\":52},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/6菱形_1657175841432.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143501635584', NULL, '1014376428645961728', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":130,\\\"height\\\":52},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/6菱形_1657175841432.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143514218496', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"设备管理\\\",\\\"size\\\":{\\\"width\\\":81,\\\"height\\\":40},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143526801408', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"动态数据\\\",\\\"size\\\":{\\\"width\\\":80,\\\"height\\\":40},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143539384320', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"人员管理\\\",\\\"size\\\":{\\\"width\\\":80,\\\"height\\\":40},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143560355840', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"监控管理\\\",\\\"size\\\":{\\\"width\\\":80,\\\"height\\\":40},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143577133056', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"人员定位\\\",\\\"size\\\":{\\\"width\\\":80,\\\"height\\\":40},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143593910272', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"能源管理\\\",\\\"size\\\":{\\\"width\\\":80,\\\"height\\\":40},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143606493184', NULL, '1014376428645961728', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":465,\\\"height\\\":260},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/6左上_1657176154547.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143619076096', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"功耗总量\\\",\\\"size\\\":{\\\"width\\\":115,\\\"height\\\":33.99999999999994},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143635853312', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"电能耗|水能耗\\\",\\\"size\\\":{\\\"width\\\":267.00000000000006,\\\"height\\\":42.999999999999886},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":15,\\\"fontSize\\\":21,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143648436224', NULL, '1014376428645961728', NULL, 'JCountTo', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"17563\\\",\\\"size\\\":{\\\"width\\\":87.99999999999996,\\\"height\\\":40.52517985611512},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"suffixFontSize\\\":16,\\\"borderColor\\\":\\\"#31aefd\\\",\\\"prefixColor\\\":\\\"#FFFFFF\\\",\\\"color\\\":\\\"#FFFFFF\\\",\\\"suffixFontWeight\\\":\\\"normal\\\",\\\"prefix\\\":\\\"\\\",\\\"whole\\\":true,\\\"boxHeight\\\":50,\\\"suffix\\\":\\\"\\\",\\\"type\\\":\\\"img\\\",\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"prefixFontSize\\\":16,\\\"prefixFontWeight\\\":\\\"normal\\\",\\\"suffixColor\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":16,\\\"boxWidth\\\":50,\\\"fontWeight\\\":\\\"normal\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143665213440', NULL, '1014376428645961728', NULL, 'JCountTo', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"11163\\\",\\\"size\\\":{\\\"width\\\":91.99999999999994,\\\"height\\\":39.00000000000006},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"suffixFontSize\\\":16,\\\"borderColor\\\":\\\"#31aefd\\\",\\\"prefixColor\\\":\\\"#FFFFFF\\\",\\\"color\\\":\\\"#FFFFFF\\\",\\\"suffixFontWeight\\\":\\\"normal\\\",\\\"prefix\\\":\\\"\\\",\\\"whole\\\":true,\\\"boxHeight\\\":50,\\\"suffix\\\":\\\"\\\",\\\"type\\\":\\\"none\\\",\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"prefixFontSize\\\":16,\\\"prefixFontWeight\\\":\\\"normal\\\",\\\"suffixColor\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":16,\\\"boxWidth\\\":50,\\\"fontWeight\\\":\\\"normal\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143690379264', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"kw/h\\\",\\\"size\\\":{\\\"width\\\":80.00000000000006,\\\"height\\\":32.99999999999994},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143711350784', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"kw/h\\\",\\\"size\\\":{\\\"width\\\":91.00000000000006,\\\"height\\\":31.999999999999886},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143728128000', NULL, '1014376428645961728', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":468,\\\"height\\\":632},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/6左下_1657176316163.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143744905216', NULL, '1014376428645961728', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"一日\\\\\\\",    \\\\\\\"value\\\\\\\": 1280,    \\\\\\\"type\\\\\\\": \\\\\\\"近七日电能耗\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"二日\\\\\\\",    \\\\\\\"value\\\\\\\": 2000,    \\\\\\\"type\\\\\\\": \\\\\\\"近七日电能耗\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"三日\\\\\\\",    \\\\\\\"value\\\\\\\": 1756,    \\\\\\\"type\\\\\\\": \\\\\\\"近七日电能耗\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"四日\\\\\\\",    \\\\\\\"value\\\\\\\": 1240,    \\\\\\\"type\\\\\\\": \\\\\\\"近七日电能耗\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"五日\\\\\\\",    \\\\\\\"value\\\\\\\": 800,    \\\\\\\"type\\\\\\\": \\\\\\\"近七日电能耗\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"六日\\\\\\\",    \\\\\\\"value\\\\\\\": 1654,    \\\\\\\"type\\\\\\\": \\\\\\\"近七日电能耗\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"七日\\\\\\\",    \\\\\\\"value\\\\\\\": 2125,    \\\\\\\"type\\\\\\\": \\\\\\\"近七日电能耗\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":393,\\\"height\\\":264},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"show\\\":true,\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#CCCCCC\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"show\\\":false},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":46,\\\"left\\\":1,\\\"bottom\\\":20,\\\"show\\\":false,\\\"right\\\":6,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":12,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#00CED1\\\",\\\"borderRadius\\\":3},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":137,\\\"show\\\":true,\\\"text\\\":\\\"近七日电能耗\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontSize\\\":17,\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#B9B8CE\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143761682432', NULL, '1014376428645961728', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"一日\\\\\\\",    \\\\\\\"value\\\\\\\": 1280,    \\\\\\\"type\\\\\\\": \\\\\\\"近七日电能耗\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"二日\\\\\\\",    \\\\\\\"value\\\\\\\": 2000,    \\\\\\\"type\\\\\\\": \\\\\\\"近七日电能耗\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"三日\\\\\\\",    \\\\\\\"value\\\\\\\": 1756,    \\\\\\\"type\\\\\\\": \\\\\\\"近七日电能耗\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"四日\\\\\\\",    \\\\\\\"value\\\\\\\": 1240,    \\\\\\\"type\\\\\\\": \\\\\\\"近七日电能耗\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"五日\\\\\\\",    \\\\\\\"value\\\\\\\": 800,    \\\\\\\"type\\\\\\\": \\\\\\\"近七日电能耗\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"六日\\\\\\\",    \\\\\\\"value\\\\\\\": 1654,    \\\\\\\"type\\\\\\\": \\\\\\\"近七日电能耗\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"七日\\\\\\\",    \\\\\\\"value\\\\\\\": 2125,    \\\\\\\"type\\\\\\\": \\\\\\\"近七日电能耗\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":391,\\\"height\\\":266},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"show\\\":true,\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#CCCCCC\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"show\\\":false},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":46,\\\"left\\\":1,\\\"bottom\\\":20,\\\"show\\\":false,\\\"right\\\":6,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":12,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#00CED1\\\",\\\"borderRadius\\\":3},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":116,\\\"show\\\":true,\\\"text\\\":\\\"近七日水能耗\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontSize\\\":17,\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#B9B8CE\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143786848256', NULL, '1014376428645961728', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":857,\\\"height\\\":483},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/6border16_1657176410080.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143803625472', NULL, '1014376428645961728', NULL, 'JGauge', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"名称\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/gauge\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"min\\\\\\\": 1,    \\\\\\\"max\\\\\\\": 210,    \\\\\\\"label\\\\\\\": \\\\\\\"名称\\\\\\\",    \\\\\\\"value\\\\\\\": 66,    \\\\\\\"unit\\\\\\\": \\\\\\\"%\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":465,\\\"height\\\":300},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"series\\\":[{\\\"axisLabel\\\":{\\\"show\\\":true,\\\"fontSize\\\":12},\\\"data\\\":[],\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#eee\\\",\\\"width\\\":4},\\\"length\\\":12},\\\"axisTick\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#eee\\\"},\\\"show\\\":true},\\\"progress\\\":{\\\"show\\\":true},\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"detail\\\":{\\\"formatter\\\":\\\"{value}\\\",\\\"fontSize\\\":25},\\\"type\\\":\\\"gauge\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a} <br/>{b} : {c}%\\\"},\\\"title\\\":{\\\"top\\\":213,\\\"left\\\":159,\\\"text\\\":\\\"二号机房功率\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#9AA8D4\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143816208384', NULL, '1014376428645961728', NULL, 'JGauge', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"名称\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/gauge\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"min\\\\\\\": 1,    \\\\\\\"max\\\\\\\": 210,    \\\\\\\"label\\\\\\\": \\\\\\\"名称\\\\\\\",    \\\\\\\"value\\\\\\\": 50,    \\\\\\\"unit\\\\\\\": \\\\\\\"%\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":359,\\\"height\\\":253},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"series\\\":[{\\\"axisLabel\\\":{\\\"show\\\":true,\\\"fontSize\\\":12},\\\"data\\\":[],\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#eee\\\",\\\"width\\\":4},\\\"length\\\":12},\\\"axisTick\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#eee\\\"},\\\"show\\\":true},\\\"progress\\\":{\\\"show\\\":true},\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"detail\\\":{\\\"formatter\\\":\\\"{value}\\\",\\\"fontSize\\\":25},\\\"type\\\":\\\"gauge\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a} <br/>{b} : {c}%\\\"},\\\"title\\\":{\\\"top\\\":179,\\\"left\\\":117,\\\"text\\\":\\\"三号机房功率\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#9AA8D4\\\",\\\"fontSize\\\":15,\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143837179904', NULL, '1014376428645961728', NULL, 'JGauge', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"名称\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/gauge\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"min\\\\\\\": 1,    \\\\\\\"max\\\\\\\": 210,    \\\\\\\"label\\\\\\\": \\\\\\\"名称\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"unit\\\\\\\": \\\\\\\"%\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":359,\\\"height\\\":253},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"series\\\":[{\\\"axisLabel\\\":{\\\"show\\\":true,\\\"fontSize\\\":12},\\\"data\\\":[],\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#eee\\\",\\\"width\\\":4},\\\"length\\\":12},\\\"axisTick\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#eee\\\"},\\\"show\\\":true},\\\"progress\\\":{\\\"show\\\":true},\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"detail\\\":{\\\"formatter\\\":\\\"{value}\\\",\\\"fontSize\\\":25},\\\"type\\\":\\\"gauge\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a} <br/>{b} : {c}%\\\"},\\\"title\\\":{\\\"top\\\":177,\\\"left\\\":117,\\\"text\\\":\\\"四号机房功率\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#9AA8D4\\\",\\\"fontSize\\\":15,\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143853957120', NULL, '1014376428645961728', NULL, 'JGauge', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"名称\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/gauge\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"min\\\\\\\": 1,    \\\\\\\"max\\\\\\\": 210,    \\\\\\\"label\\\\\\\": \\\\\\\"名称\\\\\\\",    \\\\\\\"value\\\\\\\": 90,    \\\\\\\"unit\\\\\\\": \\\\\\\"%\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":359,\\\"height\\\":253},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"series\\\":[{\\\"axisLabel\\\":{\\\"show\\\":true,\\\"fontSize\\\":12},\\\"data\\\":[],\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#eee\\\",\\\"width\\\":4},\\\"length\\\":12},\\\"axisTick\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#eee\\\"},\\\"show\\\":true},\\\"progress\\\":{\\\"show\\\":true},\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"detail\\\":{\\\"formatter\\\":\\\"{value}\\\",\\\"fontSize\\\":25},\\\"type\\\":\\\"gauge\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a} <br/>{b} : {c}%\\\"},\\\"title\\\":{\\\"top\\\":177,\\\"left\\\":117,\\\"text\\\":\\\"五号机房功率\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#9AA8D4\\\",\\\"fontSize\\\":15,\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143870734336', NULL, '1014376428645961728', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":859,\\\"height\\\":390},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/6中下_1657176573600.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143895900160', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"设备列表\\\",\\\"size\\\":{\\\"width\\\":184,\\\"height\\\":44.000000000000064},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":17,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143921065984', NULL, '1014376428645961728', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":465,\\\"height\\\":449},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/6右上_1657176473804.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143933648896', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"信息\\\",\\\"size\\\":{\\\"width\\\":342,\\\"height\\\":51},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143946231808', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"站点号：0001\\\",\\\"size\\\":{\\\"width\\\":459,\\\"height\\\":80},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143958814720', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"设备状态：正常\\\",\\\"size\\\":{\\\"width\\\":460,\\\"height\\\":80},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143983980544', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"环境温度：36摄氏度\\\",\\\"size\\\":{\\\"width\\\":458,\\\"height\\\":80},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338143996563456', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"在线设备：20 台\\\",\\\"size\\\":{\\\"width\\\":459,\\\"height\\\":80},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338144009146368', NULL, '1014376428645961728', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":465,\\\"height\\\":410},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/6右上_1657176473804.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338144025923584', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"近七日设备在线数\\\",\\\"size\\\":{\\\"width\\\":340,\\\"height\\\":44},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":15,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338144046895104', NULL, '1014376428645961728', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"设备功率信息\\\",\\\"size\\\":{\\\"width\\\":465,\\\"height\\\":57.99999999999997},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#13DADD\\\",\\\"letterSpacing\\\":17,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338144063672320', NULL, '1014376428645961728', NULL, 'JLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"name\\\\\\\": \\\\\\\"1\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 19,    \\\\\\\"name\\\\\\\": \\\\\\\"2\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"name\\\\\\\": \\\\\\\"3\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 17,    \\\\\\\"name\\\\\\\": \\\\\\\"4\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 18,    \\\\\\\"name\\\\\\\": \\\\\\\"5\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"name\\\\\\\": \\\\\\\"6\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"name\\\\\\\": \\\\\\\"7\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 16,    \\\\\\\"name\\\\\\\": \\\\\\\"8\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 17,    \\\\\\\"name\\\\\\\": \\\\\\\"9\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 19,    \\\\\\\"name\\\\\\\": \\\\\\\"10\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":466,\\\"height\\\":288},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"max\\\":30,\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#039199\\\"},\\\"show\\\":true},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#CCCCCC\\\"},\\\"show\\\":false},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":9,\\\"left\\\":31,\\\"bottom\\\":41,\\\"show\\\":false,\\\"right\\\":1},\\\"series\\\":[{\\\"areaStyleOpacity\\\":0.5,\\\"data\\\":[],\\\"lineType\\\":\\\"area\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":false},\\\"type\\\":\\\"line\\\"}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":10,\\\"show\\\":false,\\\"text\\\":\\\"基础折线图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#1D1F26\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338144080449536', NULL, '1014376428645961728', NULL, 'JScrollTable', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"type1\\\\\\\": \\\\\\\"0374\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"1号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"180\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"5322\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"2号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"185\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"1753\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"1号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"180\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"0022\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"2号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"180\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"8509\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"3号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"180\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"0374\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"4号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"180\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"5322\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"2号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"185\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"1753\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"1号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"180\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"0022\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"2号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"180\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"8509\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"3号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"180\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"0374\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"4号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"180\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"5322\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"2号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"185\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"1753\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"1号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"180\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"0022\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"2号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"180\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"8509\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"3号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"180\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"0374\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"4号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"180\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"5322\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"2号搅机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"185\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"1753\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"1号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"180\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"0022\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"2号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"180\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"8509\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"3号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"180\\\\\\\"  },  {    \\\\\\\"type1\\\\\\\": \\\\\\\"0374\\\\\\\",    \\\\\\\"type2\\\\\\\": \\\\\\\"4号机房\\\\\\\",    \\\\\\\"type3\\\\\\\": \\\\\\\"正常\\\\\\\",    \\\\\\\"type4\\\\\\\": \\\\\\\"180\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":852,\\\"height\\\":329},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"evenColor\\\":\\\"#003B51\\\",\\\"headerBgColor\\\":\\\"#0A73FF\\\",\\\"fieldMapping\\\":[{\\\"name\\\":\\\"编号\\\",\\\"width\\\":150,\\\"key\\\":\\\"type1\\\"},{\\\"name\\\":\\\"设备名\\\",\\\"width\\\":300,\\\"key\\\":\\\"type2\\\"},{\\\"name\\\":\\\"设备状态\\\",\\\"width\\\":200,\\\"key\\\":\\\"type3\\\"},{\\\"name\\\":\\\"功率\\\",\\\"width\\\":150,\\\"key\\\":\\\"type4\\\"}],\\\"showHead\\\":true,\\\"scroll\\\":true,\\\"scrollTime\\\":5000,\\\"lineHeight\\\":50,\\\"fontSize\\\":24,\\\"bodyFontColor\\\":\\\"#FFFFFF\\\",\\\"showBorder\\\":true,\\\"oddColor\\\":\\\"#0A2732\\\",\\\"headerFontColor\\\":\\\"#FFFFFF\\\"}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021338144088838144', NULL, '1014376428645961728', NULL, 'JGauge', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"名称\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/gauge\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"min\\\\\\\": 1,    \\\\\\\"max\\\\\\\": 210,    \\\\\\\"label\\\\\\\": \\\\\\\"名称\\\\\\\",    \\\\\\\"value\\\\\\\": 70,    \\\\\\\"unit\\\\\\\": \\\\\\\"%\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":524,\\\"height\\\":301},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"series\\\":[{\\\"axisLabel\\\":{\\\"show\\\":true,\\\"fontSize\\\":12},\\\"data\\\":[],\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\",\\\"width\\\":4},\\\"length\\\":12},\\\"axisTick\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\"},\\\"show\\\":true},\\\"progress\\\":{\\\"show\\\":true},\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"detail\\\":{\\\"formatter\\\":\\\"{value}\\\",\\\"fontSize\\\":25},\\\"type\\\":\\\"gauge\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a} <br/>{b} : {c}%\\\"},\\\"title\\\":{\\\"top\\\":211,\\\"left\\\":159,\\\"text\\\":\\\"一号机房功率\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#9AA8D4\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#B9B8CE\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#1D1F26\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-26 18:39:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592459091968', NULL, '1016994272231608320', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":801,\\\"height\\\":926},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592501035008', NULL, '1016994272231608320', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":488,\\\"height\\\":926},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592526200832', NULL, '1016994272231608320', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":507,\\\"height\\\":926},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592555560960', NULL, '1016994272231608320', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"旅游数据分析中心大屏\\\",\\\"size\\\":{\\\"width\\\":636,\\\"height\\\":88},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#E8E8E8\\\",\\\"letterSpacing\\\":5,\\\"fontSize\\\":50,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592568143872', NULL, '1016994272231608320', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"实时天气\\\",\\\"size\\\":{\\\"width\\\":139,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#D9D9D9\\\",\\\"fontSize\\\":25,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592584921088', NULL, '1016994272231608320', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":91,\\\"height\\\":74},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/晴天_1623315350106.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592601698304', NULL, '1016994272231608320', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"游客性别统计\\\",\\\"size\\\":{\\\"width\\\":171,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#D9D9D9\\\",\\\"fontSize\\\":25,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592622669824', NULL, '1016994272231608320', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"近七天游客流量统计\\\",\\\"size\\\":{\\\"width\\\":231,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#D9D9D9\\\",\\\"fontSize\\\":25,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592647835648', NULL, '1016994272231608320', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"今日游客统计\\\",\\\"size\\\":{\\\"width\\\":200,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#D9D9D9\\\",\\\"fontSize\\\":25,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592664612864', NULL, '1016994272231608320', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"截止到当前时间段\\\",\\\"size\\\":{\\\"width\\\":212.7698028883034,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#DDDDDB\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592681390080', NULL, '1016994272231608320', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"过去7天车辆抓拍总数\\\",\\\"size\\\":{\\\"width\\\":267,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#D9D9D9\\\",\\\"fontSize\\\":25,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592706555904', NULL, '1016994272231608320', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"车辆类型统计\\\",\\\"size\\\":{\\\"width\\\":205,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#D9D9D9\\\",\\\"fontSize\\\":25,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592735916032', NULL, '1016994272231608320', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"车辆归属地统计\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#D9D9D9\\\",\\\"fontSize\\\":25,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592765276160', NULL, '1016994272231608320', NULL, 'JDragDecoration', '{\\\"size\\\":{\\\"width\\\":443,\\\"height\\\":100},\\\"w\\\":300,\\\"dataType\\\":1,\\\"h\\\":100,\\\"option\\\":{\\\"dur\\\":3,\\\"mainColor\\\":\\\"#00CED1\\\",\\\"fontSize\\\":15,\\\"type\\\":\\\"1\\\",\\\"title\\\":\\\"装饰1\\\",\\\"subColor\\\":\\\"#FAD400\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592786247680', NULL, '1016994272231608320', NULL, 'JWeatherForecast', '{\\\"size\\\":{\\\"height\\\":47},\\\"w\\\":257,\\\"dataType\\\":1,\\\"h\\\":47,\\\"option\\\":{\\\"template\\\":94,\\\"bgColor\\\":\\\"\\\",\\\"city\\\":\\\"\\\",\\\"num\\\":2,\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#fff\\\",\\\"url\\\":\\\"\\\"}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592807219200', NULL, '1016994272231608320', NULL, 'JCurrentTime', '{\\\"chartData\\\":\\\"\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"height\\\":33},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":270,\\\"dataType\\\":1,\\\"h\\\":33,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"showWeek\\\":\\\"show\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592844967936', NULL, '1016994272231608320', NULL, 'JDragDecoration', '{\\\"size\\\":{\\\"width\\\":383,\\\"height\\\":47},\\\"w\\\":300,\\\"dataType\\\":1,\\\"h\\\":27,\\\"option\\\":{\\\"dur\\\":3,\\\"mainColor\\\":\\\"#00CED1\\\",\\\"fontSize\\\":15,\\\"type\\\":\\\"10\\\",\\\"title\\\":\\\"装饰10\\\",\\\"subColor\\\":\\\"#FAD400\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592861745152', NULL, '1016994272231608320', NULL, 'JLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[    {        \\\\\\\"name\\\\\\\": \\\\\\\"周一\\\\\\\",        \\\\\\\"value\\\\\\\": 1000879,        \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"周二\\\\\\\",        \\\\\\\"value\\\\\\\": 3400879,        \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"周三\\\\\\\",        \\\\\\\"value\\\\\\\": 2300879,        \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"周四\\\\\\\",        \\\\\\\"value\\\\\\\": 5400879,        \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"周五\\\\\\\",        \\\\\\\"value\\\\\\\": 3400879,        \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"周六\\\\\\\",        \\\\\\\"value\\\\\\\": 7400879,        \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"周日\\\\\\\",        \\\\\\\"value\\\\\\\": 8400879,        \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"    }]\\\",\\\"size\\\":{\\\"width\\\":488,\\\"height\\\":300},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#EECC0C\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"}},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":0,\\\"bottom\\\":18,\\\"show\\\":false,\\\"right\\\":40,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"symbol\\\":\\\"circle\\\",\\\"data\\\":[],\\\"symbolSize\\\":12,\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"type\\\":\\\"line\\\",\\\"lineWidth\\\":2}],\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":10,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592878522368', NULL, '1016994272231608320', NULL, 'JDragDecoration', '{\\\"size\\\":{\\\"width\\\":396,\\\"height\\\":41},\\\"w\\\":300,\\\"dataType\\\":1,\\\"h\\\":27,\\\"option\\\":{\\\"dur\\\":3,\\\"mainColor\\\":\\\"#00CED1\\\",\\\"fontSize\\\":15,\\\"type\\\":\\\"10\\\",\\\"title\\\":\\\"装饰10\\\",\\\"subColor\\\":\\\"#FAD400\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592899493888', NULL, '1016994272231608320', NULL, 'JGender', '{\\\"chartData\\\":\\\"[{\\\\\\\"man\\\\\\\":50,\\\\\\\"woman\\\\\\\":35}]\\\",\\\"size\\\":{\\\"width\\\":317,\\\"height\\\":245},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"男\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"女\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/pictogram\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"series\\\":[],\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592941436928', NULL, '1016994272231608320', NULL, 'JDragDecoration', '{\\\"size\\\":{\\\"width\\\":604,\\\"height\\\":100},\\\"w\\\":300,\\\"dataType\\\":1,\\\"h\\\":100,\\\"option\\\":{\\\"dur\\\":3,\\\"mainColor\\\":\\\"#00CED1\\\",\\\"fontSize\\\":18,\\\"type\\\":\\\"2\\\",\\\"title\\\":\\\"装饰2\\\",\\\"subColor\\\":\\\"#FAD400\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592958214144', NULL, '1016994272231608320', NULL, 'JCountTo', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":80,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"8745987\\\",\\\"size\\\":{\\\"width\\\":712,\\\"height\\\":142.9496402877698},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"suffixFontSize\\\":16,\\\"borderColor\\\":\\\"#31aefd\\\",\\\"prefixColor\\\":\\\"#FFFFFF\\\",\\\"color\\\":\\\"#EAC910\\\",\\\"suffixFontWeight\\\":\\\"normal\\\",\\\"prefix\\\":\\\"\\\",\\\"whole\\\":false,\\\"boxHeight\\\":95,\\\"suffix\\\":\\\"\\\",\\\"type\\\":\\\"img\\\",\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"prefixFontSize\\\":16,\\\"prefixFontWeight\\\":\\\"normal\\\",\\\"suffixColor\\\":\\\"#FFFFFF\\\",\\\"borderImg\\\":\\\"/img/bg/border/border1.png\\\",\\\"fontFamily\\\":\\\"DIGITALDREAMFAT\\\",\\\"gridY\\\":5,\\\"backgroundImg\\\":\\\"\\\",\\\"fontSize\\\":50,\\\"boxWidth\\\":90,\\\"fontWeight\\\":\\\"bold\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960592991768576', NULL, '1016994272231608320', NULL, 'JBubbleMap', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"commonOption\\\":{\\\"barSize\\\":10,\\\"gradientColor\\\":false,\\\"breadcrumb\\\":{\\\"drillDown\\\":false,\\\"textColor\\\":\\\"#000000\\\"},\\\"areaColor\\\":{\\\"color1\\\":\\\"#132937\\\",\\\"color2\\\":\\\"#0A0909\\\"},\\\"barColor\\\":\\\"#fff176\\\",\\\"barColor2\\\":\\\"#fcc02e\\\",\\\"inRange\\\":{\\\"color\\\":[\\\"#04387b\\\",\\\"#467bc0\\\"]}},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"区域\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"jsConfig\\\":\\\"\\\",\\\"dataType\\\":1,\\\"h\\\":300,\\\"activeKey\\\":1,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/radar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"北京\\\\\\\",\\\\\\\"value\\\\\\\":199},{\\\\\\\"name\\\\\\\":\\\\\\\"新疆\\\\\\\",\\\\\\\"value\\\\\\\":180},{\\\\\\\"name\\\\\\\":\\\\\\\"河南\\\\\\\",\\\\\\\"value\\\\\\\":137},{\\\\\\\"name\\\\\\\":\\\\\\\"四川\\\\\\\",\\\\\\\"value\\\\\\\":125},{\\\\\\\"name\\\\\\\":\\\\\\\"黑龙江\\\\\\\",\\\\\\\"value\\\\\\\":123},{\\\\\\\"name\\\\\\\":\\\\\\\"广东\\\\\\\",\\\\\\\"value\\\\\\\":123},{\\\\\\\"name\\\\\\\":\\\\\\\"山东\\\\\\\",\\\\\\\"value\\\\\\\":119},{\\\\\\\"name\\\\\\\":\\\\\\\"福建\\\\\\\",\\\\\\\"value\\\\\\\":116},{\\\\\\\"name\\\\\\\":\\\\\\\"湖北\\\\\\\",\\\\\\\"value\\\\\\\":116},{\\\\\\\"name\\\\\\\":\\\\\\\"浙江\\\\\\\",\\\\\\\"value\\\\\\\":114},{\\\\\\\"name\\\\\\\":\\\\\\\"湖南\\\\\\\",\\\\\\\"value\\\\\\\":114},{\\\\\\\"name\\\\\\\":\\\\\\\"安徽\\\\\\\",\\\\\\\"value\\\\\\\":109},{\\\\\\\"name\\\\\\\":\\\\\\\"河北\\\\\\\",\\\\\\\"value\\\\\\\":102},{\\\\\\\"name\\\\\\\":\\\\\\\"江苏\\\\\\\",\\\\\\\"value\\\\\\\":92},{\\\\\\\"name\\\\\\\":\\\\\\\"江西\\\\\\\",\\\\\\\"value\\\\\\\":91},{\\\\\\\"name\\\\\\\":\\\\\\\"重庆\\\\\\\",\\\\\\\"value\\\\\\\":91},{\\\\\\\"name\\\\\\\":\\\\\\\"云南\\\\\\\",\\\\\\\"value\\\\\\\":83},{\\\\\\\"name\\\\\\\":\\\\\\\"吉林\\\\\\\",\\\\\\\"value\\\\\\\":82},{\\\\\\\"name\\\\\\\":\\\\\\\"山西\\\\\\\",\\\\\\\"value\\\\\\\":81},{\\\\\\\"name\\\\\\\":\\\\\\\"陕西\\\\\\\",\\\\\\\"value\\\\\\\":80},{\\\\\\\"name\\\\\\\":\\\\\\\"辽宁\\\\\\\",\\\\\\\"value\\\\\\\":67},{\\\\\\\"name\\\\\\\":\\\\\\\"贵州\\\\\\\",\\\\\\\"value\\\\\\\":62},{\\\\\\\"name\\\\\\\":\\\\\\\"广西\\\\\\\",\\\\\\\"value\\\\\\\":59},{\\\\\\\"name\\\\\\\":\\\\\\\"甘肃\\\\\\\",\\\\\\\"value\\\\\\\":56},{\\\\\\\"name\\\\\\\":\\\\\\\"内蒙古\\\\\\\",\\\\\\\"value\\\\\\\":47},{\\\\\\\"name\\\\\\\":\\\\\\\"天津\\\\\\\",\\\\\\\"value\\\\\\\":42},{\\\\\\\"name\\\\\\\":\\\\\\\"上海\\\\\\\",\\\\\\\"value\\\\\\\":24},{\\\\\\\"name\\\\\\\":\\\\\\\"宁夏\\\\\\\",\\\\\\\"value\\\\\\\":18},{\\\\\\\"name\\\\\\\":\\\\\\\"海南\\\\\\\",\\\\\\\"value\\\\\\\":14},{\\\\\\\"name\\\\\\\":\\\\\\\"青海\\\\\\\",\\\\\\\"value\\\\\\\":10},{\\\\\\\"name\\\\\\\":\\\\\\\"西藏\\\\\\\",\\\\\\\"value\\\\\\\":9}]\\\",\\\"size\\\":{\\\"width\\\":718,\\\"height\\\":527},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"drillDown\\\":false,\\\"area\\\":{\\\"markerColor\\\":\\\"#DDE330\\\",\\\"shadowBlur\\\":10,\\\"markerCount\\\":5,\\\"markerOpacity\\\":1,\\\"name\\\":[\\\"中国\\\"],\\\"scatterLabelShow\\\":false,\\\"shadowColor\\\":\\\"#DDE330\\\",\\\"value\\\":[\\\"china\\\"],\\\"markerType\\\":\\\"effectScatter\\\"},\\\"geo\\\":{\\\"top\\\":25,\\\"itemStyle\\\":{\\\"normal\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowOffsetY\\\":0,\\\"borderColor\\\":\\\"#068FA1\\\",\\\"areaColor\\\":\\\"\\\",\\\"shadowBlur\\\":0,\\\"borderWidth\\\":1,\\\"shadowColor\\\":\\\"#80D9F8\\\"},\\\"emphasis\\\":{\\\"areaColor\\\":\\\"#FFF59C\\\",\\\"borderWidth\\\":0}},\\\"zoom\\\":1.2,\\\"label\\\":{\\\"emphasis\\\":{\\\"color\\\":\\\"#fff\\\",\\\"show\\\":false}},\\\"roam\\\":true},\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"data\\\":[]},\\\"title\\\":{\\\"top\\\":19,\\\"left\\\":224,\\\"show\\\":true,\\\"text\\\":\\\"全国游客分布情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFD700\\\",\\\"fontSize\\\":25,\\\"fontWeight\\\":\\\"normal\\\"}},\\\"graphic\\\":[],\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"visualMap\\\":{\\\"min\\\":0,\\\"top\\\":\\\"bottom\\\",\\\"max\\\":200,\\\"left\\\":\\\"5%\\\",\\\"calculable\\\":true,\\\"show\\\":false,\\\"type\\\":\\\"continuous\\\",\\\"seriesIndex\\\":[1]}}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960593008545792', NULL, '1016994272231608320', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":54,\\\"height\\\":51},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/汽车用品_1623316498991.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960593029517312', NULL, '1016994272231608320', NULL, 'JDragDecoration', '{\\\"size\\\":{\\\"width\\\":406,\\\"height\\\":47},\\\"w\\\":300,\\\"dataType\\\":1,\\\"h\\\":27,\\\"option\\\":{\\\"dur\\\":3,\\\"mainColor\\\":\\\"#00CED1\\\",\\\"fontSize\\\":15,\\\"type\\\":\\\"10\\\",\\\"title\\\":\\\"装饰10\\\",\\\"subColor\\\":\\\"#FAD400\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960593063071744', NULL, '1016994272231608320', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"车辆抓拍总数\\\",\\\"size\\\":{\\\"width\\\":134,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FAD400\\\",\\\"fontSize\\\":21,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960593079848960', NULL, '1016994272231608320', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"12345\\\",\\\"size\\\":{\\\"width\\\":128,\\\"height\\\":45},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FAD400\\\",\\\"fontSize\\\":44,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960593096626176', NULL, '1016994272231608320', NULL, 'JRing', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[    {        \\\\\\\"name\\\\\\\": \\\\\\\"客车\\\\\\\",        \\\\\\\"value\\\\\\\": 1000879    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"轿车\\\\\\\",        \\\\\\\"value\\\\\\\": 3400879    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"SUV\\\\\\\",        \\\\\\\"value\\\\\\\": 2300879    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"货车\\\\\\\",        \\\\\\\"value\\\\\\\": 5400879    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"摩托车\\\\\\\",        \\\\\\\"value\\\\\\\": 3000    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"自行车\\\\\\\",        \\\\\\\"value\\\\\\\": 2000    }]\\\",\\\"size\\\":{\\\"width\\\":436,\\\"height\\\":300},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":480,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":50,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"show\\\":true,\\\"fontSize\\\":14,\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\",\\\"t\\\":1,\\\"show\\\":false},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960593121792000', NULL, '1016994272231608320', NULL, 'JDragDecoration', '{\\\"size\\\":{\\\"width\\\":421,\\\"height\\\":47},\\\"w\\\":300,\\\"dataType\\\":1,\\\"h\\\":27,\\\"option\\\":{\\\"dur\\\":3,\\\"mainColor\\\":\\\"#00CED1\\\",\\\"fontSize\\\":15,\\\"type\\\":\\\"10\\\",\\\"title\\\":\\\"装饰10\\\",\\\"subColor\\\":\\\"#FAD400\\\",\\\"reverse\\\":false}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1021960593138569216', NULL, '1016994272231608320', NULL, 'JCapsuleChart', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"车辆归属地\\\",\\\"query\\\":[],\\\"h\\\":300,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/26/activering\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":450,\\\"height\\\":300},\\\"dataSetId\\\":\\\"1011805223195824128\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"seriesType\\\":[],\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"showValue\\\":false,\\\"unit\\\":\\\"\\\",\\\"customColor\\\":[],\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-11-28 11:53:23', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507021467648', NULL, '1011915958294990848', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"军地大数据驾驶舱\\\",\\\"size\\\":{\\\"width\\\":446.00000000000006,\\\"height\\\":73.99999999999997},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":12,\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507063410688', NULL, '1011915958294990848', NULL, 'JRose', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 1048,    \\\\\\\"name\\\\\\\": \\\\\\\"海淀双拥办\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 1735,    \\\\\\\"name\\\\\\\": \\\\\\\"朝阳双拥办\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 780,    \\\\\\\"name\\\\\\\": \\\\\\\"昌平双拥办\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 484,    \\\\\\\"name\\\\\\\": \\\\\\\"西城双拥办\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 300,    \\\\\\\"name\\\\\\\": \\\\\\\"东城双拥办\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":426,\\\"height\\\":268},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#83BFF6\\\"},{\\\"color\\\":\\\"#D6AD33\\\"},{\\\"color\\\":\\\"#1F93FF\\\"},{\\\"color\\\":\\\"#F6903D\\\"},{\\\"color\\\":\\\"#61DDAA\\\"}],\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\",\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"roseType\\\":\\\"radius\\\",\\\"name\\\":\\\"南丁格尔玫瑰\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"},\\\"label\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"本市各区问题解决数\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#B9B8CE\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507080187904', NULL, '1011915958294990848', NULL, 'JBubbleMap', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"commonOption\\\":{\\\"barSize\\\":10,\\\"gradientColor\\\":false,\\\"breadcrumb\\\":{\\\"drillDown\\\":false,\\\"textColor\\\":\\\"#000000\\\"},\\\"areaColor\\\":{\\\"color1\\\":\\\"#4F74E3\\\",\\\"color2\\\":\\\"#0A0909\\\"},\\\"barColor\\\":\\\"#fff176\\\",\\\"barColor2\\\":\\\"#fcc02e\\\",\\\"inRange\\\":{\\\"color\\\":[\\\"#04387b\\\",\\\"#467bc0\\\"]}},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"区域\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"jsConfig\\\":\\\"\\\",\\\"dataType\\\":1,\\\"h\\\":30,\\\"activeKey\\\":1,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/radar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"北京\\\\\\\",\\\\\\\"value\\\\\\\":199},{\\\\\\\"name\\\\\\\":\\\\\\\"新疆\\\\\\\",\\\\\\\"value\\\\\\\":180},{\\\\\\\"name\\\\\\\":\\\\\\\"河南\\\\\\\",\\\\\\\"value\\\\\\\":137},{\\\\\\\"name\\\\\\\":\\\\\\\"四川\\\\\\\",\\\\\\\"value\\\\\\\":125},{\\\\\\\"name\\\\\\\":\\\\\\\"黑龙江\\\\\\\",\\\\\\\"value\\\\\\\":123},{\\\\\\\"name\\\\\\\":\\\\\\\"广东\\\\\\\",\\\\\\\"value\\\\\\\":123},{\\\\\\\"name\\\\\\\":\\\\\\\"山东\\\\\\\",\\\\\\\"value\\\\\\\":119},{\\\\\\\"name\\\\\\\":\\\\\\\"福建\\\\\\\",\\\\\\\"value\\\\\\\":116},{\\\\\\\"name\\\\\\\":\\\\\\\"湖北\\\\\\\",\\\\\\\"value\\\\\\\":116},{\\\\\\\"name\\\\\\\":\\\\\\\"浙江\\\\\\\",\\\\\\\"value\\\\\\\":114},{\\\\\\\"name\\\\\\\":\\\\\\\"湖南\\\\\\\",\\\\\\\"value\\\\\\\":114},{\\\\\\\"name\\\\\\\":\\\\\\\"安徽\\\\\\\",\\\\\\\"value\\\\\\\":109},{\\\\\\\"name\\\\\\\":\\\\\\\"河北\\\\\\\",\\\\\\\"value\\\\\\\":102},{\\\\\\\"name\\\\\\\":\\\\\\\"江苏\\\\\\\",\\\\\\\"value\\\\\\\":92},{\\\\\\\"name\\\\\\\":\\\\\\\"江西\\\\\\\",\\\\\\\"value\\\\\\\":91},{\\\\\\\"name\\\\\\\":\\\\\\\"重庆\\\\\\\",\\\\\\\"value\\\\\\\":91},{\\\\\\\"name\\\\\\\":\\\\\\\"云南\\\\\\\",\\\\\\\"value\\\\\\\":83},{\\\\\\\"name\\\\\\\":\\\\\\\"吉林\\\\\\\",\\\\\\\"value\\\\\\\":82},{\\\\\\\"name\\\\\\\":\\\\\\\"山西\\\\\\\",\\\\\\\"value\\\\\\\":81},{\\\\\\\"name\\\\\\\":\\\\\\\"陕西\\\\\\\",\\\\\\\"value\\\\\\\":80},{\\\\\\\"name\\\\\\\":\\\\\\\"辽宁\\\\\\\",\\\\\\\"value\\\\\\\":67},{\\\\\\\"name\\\\\\\":\\\\\\\"贵州\\\\\\\",\\\\\\\"value\\\\\\\":62},{\\\\\\\"name\\\\\\\":\\\\\\\"广西\\\\\\\",\\\\\\\"value\\\\\\\":59},{\\\\\\\"name\\\\\\\":\\\\\\\"甘肃\\\\\\\",\\\\\\\"value\\\\\\\":56},{\\\\\\\"name\\\\\\\":\\\\\\\"内蒙古\\\\\\\",\\\\\\\"value\\\\\\\":47},{\\\\\\\"name\\\\\\\":\\\\\\\"天津\\\\\\\",\\\\\\\"value\\\\\\\":42},{\\\\\\\"name\\\\\\\":\\\\\\\"上海\\\\\\\",\\\\\\\"value\\\\\\\":24},{\\\\\\\"name\\\\\\\":\\\\\\\"宁夏\\\\\\\",\\\\\\\"value\\\\\\\":18},{\\\\\\\"name\\\\\\\":\\\\\\\"海南\\\\\\\",\\\\\\\"value\\\\\\\":14},{\\\\\\\"name\\\\\\\":\\\\\\\"青海\\\\\\\",\\\\\\\"value\\\\\\\":10},{\\\\\\\"name\\\\\\\":\\\\\\\"西藏\\\\\\\",\\\\\\\"value\\\\\\\":9}]\\\",\\\"size\\\":{\\\"width\\\":635,\\\"height\\\":492},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"drillDown\\\":false,\\\"area\\\":{\\\"markerColor\\\":\\\"#DDE330\\\",\\\"shadowBlur\\\":10,\\\"markerCount\\\":5,\\\"markerOpacity\\\":1,\\\"name\\\":[\\\"中国\\\"],\\\"scatterLabelShow\\\":false,\\\"shadowColor\\\":\\\"#DDE330\\\",\\\"value\\\":[\\\"china\\\"],\\\"markerType\\\":\\\"effectScatter\\\"},\\\"geo\\\":{\\\"top\\\":30,\\\"itemStyle\\\":{\\\"normal\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowOffsetY\\\":0,\\\"borderColor\\\":\\\"#93EBF8\\\",\\\"areaColor\\\":\\\"\\\",\\\"shadowBlur\\\":0,\\\"borderWidth\\\":1,\\\"shadowColor\\\":\\\"#80D9F8\\\"},\\\"emphasis\\\":{\\\"areaColor\\\":\\\"#FFF59C\\\",\\\"borderWidth\\\":0}},\\\"zoom\\\":1,\\\"label\\\":{\\\"emphasis\\\":{\\\"color\\\":\\\"#fff\\\",\\\"show\\\":false}},\\\"roam\\\":true},\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"data\\\":[]},\\\"title\\\":{\\\"left\\\":10,\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"graphic\\\":[],\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"visualMap\\\":{\\\"min\\\":0,\\\"top\\\":\\\"bottom\\\",\\\"max\\\":200,\\\"left\\\":\\\"5%\\\",\\\"calculable\\\":true,\\\"show\\\":false,\\\"type\\\":\\\"continuous\\\",\\\"seriesIndex\\\":[1]}}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507101159424', NULL, '1011915958294990848', NULL, 'JCurrentTime', '{\\\"chartData\\\":\\\"\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":465,\\\"height\\\":60},\\\"background\\\":\\\"#15E85800\\\",\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"showWeek\\\":\\\"show\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507117936640', NULL, '1011915958294990848', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":560,\\\"height\\\":512},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"rotateTime\\\":5000,\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/1_1657182043024.png\\\"},\\\"opacity\\\":1,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":true}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507130519552', NULL, '1011915958294990848', NULL, 'JMultipleBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"日常问题\\\\\\\",    \\\\\\\"value\\\\\\\": 131,    \\\\\\\"type\\\\\\\": \\\\\\\"地方双清单\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"热点问题\\\\\\\",    \\\\\\\"value\\\\\\\": 320,    \\\\\\\"type\\\\\\\": \\\\\\\"地方双清单\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"堵点问题\\\\\\\",    \\\\\\\"value\\\\\\\": 250,    \\\\\\\"type\\\\\\\": \\\\\\\"地方双清单\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"日常问题\\\\\\\",    \\\\\\\"value\\\\\\\": 210,    \\\\\\\"type\\\\\\\": \\\\\\\"军队双清单\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"热点问题\\\\\\\",    \\\\\\\"value\\\\\\\": 340,    \\\\\\\"type\\\\\\\": \\\\\\\"军队双清单\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"堵点问题\\\\\\\",    \\\\\\\"value\\\\\\\": 230,    \\\\\\\"type\\\\\\\": \\\\\\\"军队双清单\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":536,\\\"height\\\":328},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#C039DB\\\"},{\\\"color\\\":\\\"#DE374B\\\"}],\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"show\\\":false},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"show\\\":false},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":51,\\\"left\\\":32,\\\"bottom\\\":38,\\\"right\\\":1},\\\"series\\\":[{\\\"barWidth\\\":23,\\\"itemStyle\\\":{\\\"borderRadius\\\":19}}],\\\"legend\\\":{\\\"t\\\":1},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"top\\\":0,\\\"left\\\":162,\\\"show\\\":true,\\\"text\\\":\\\"热点堵点分析\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#B9B8CE\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#1D1F26\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507138908160', NULL, '1011915958294990848', NULL, 'JMultipleLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",    \\\\\\\"value\\\\\\\": 200,    \\\\\\\"type\\\\\\\": \\\\\\\"军队双清单任务\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"7月\\\\\\\",    \\\\\\\"value\\\\\\\": 330,    \\\\\\\"type\\\\\\\": \\\\\\\"军队双清单任务\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"8月\\\\\\\",    \\\\\\\"value\\\\\\\": 345,    \\\\\\\"type\\\\\\\": \\\\\\\"军队双清单任务\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"9月\\\\\\\",    \\\\\\\"value\\\\\\\": 150,    \\\\\\\"type\\\\\\\": \\\\\\\"军队双清单任务\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"10月\\\\\\\",    \\\\\\\"value\\\\\\\": 860,    \\\\\\\"type\\\\\\\": \\\\\\\"军队双清单任务\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"11月\\\\\\\",    \\\\\\\"value\\\\\\\": 346,    \\\\\\\"type\\\\\\\": \\\\\\\"军队双清单任务\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"12月\\\\\\\",    \\\\\\\"value\\\\\\\": 147,    \\\\\\\"type\\\\\\\": \\\\\\\"军队双清单任务\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",    \\\\\\\"value\\\\\\\": 129,    \\\\\\\"type\\\\\\\": \\\\\\\"地方双清单任务\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"7月\\\\\\\",    \\\\\\\"value\\\\\\\": 443,    \\\\\\\"type\\\\\\\": \\\\\\\"地方双清单任务\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"8月\\\\\\\",    \\\\\\\"value\\\\\\\": 236,    \\\\\\\"type\\\\\\\": \\\\\\\"地方双清单任务\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"9月\\\\\\\",    \\\\\\\"value\\\\\\\": 148,    \\\\\\\"type\\\\\\\": \\\\\\\"地方双清单任务\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"10月\\\\\\\",    \\\\\\\"value\\\\\\\": 347,    \\\\\\\"type\\\\\\\": \\\\\\\"地方双清单任务\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"11月\\\\\\\",    \\\\\\\"value\\\\\\\": 540,    \\\\\\\"type\\\\\\\": \\\\\\\"地方双清单任务\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"12月\\\\\\\",    \\\\\\\"value\\\\\\\": 140,    \\\\\\\"type\\\\\\\": \\\\\\\"地方双清单任务\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":519,\\\"height\\\":305},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"show\\\":false},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#BD0C5E\\\"},{\\\"color\\\":\\\"#08A2DF\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":63,\\\"left\\\":38,\\\"bottom\\\":46,\\\"right\\\":8},\\\"series\\\":[{\\\"symbolSize\\\":6,\\\"lineType\\\":\\\"smooth\\\",\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"lineWidth\\\":3}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"完成效率分析（天/个）\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#B9B8CE\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#1D1F26\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507151491072', NULL, '1011915958294990848', NULL, 'JMultipleBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"海淀区\\\\\\\",    \\\\\\\"value\\\\\\\": 53,    \\\\\\\"type\\\\\\\": \\\\\\\"拥军支前工作\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"朝阳区\\\\\\\",    \\\\\\\"value\\\\\\\": 52,    \\\\\\\"type\\\\\\\": \\\\\\\"拥军支前工作\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"大兴区\\\\\\\",    \\\\\\\"value\\\\\\\": 31,    \\\\\\\"type\\\\\\\": \\\\\\\"拥军支前工作\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"怀柔区\\\\\\\",    \\\\\\\"value\\\\\\\": 29,    \\\\\\\"type\\\\\\\": \\\\\\\"拥军支前工作\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"密云区\\\\\\\",    \\\\\\\"value\\\\\\\": 18,    \\\\\\\"type\\\\\\\": \\\\\\\"拥军支前工作\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"平谷区\\\\\\\",    \\\\\\\"value\\\\\\\": 16,    \\\\\\\"type\\\\\\\": \\\\\\\"拥军支前工作\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"顺义区\\\\\\\",    \\\\\\\"value\\\\\\\": 24,    \\\\\\\"type\\\\\\\": \\\\\\\"拥军支前工作\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"通州区\\\\\\\",    \\\\\\\"value\\\\\\\": 12,    \\\\\\\"type\\\\\\\": \\\\\\\"拥军支前工作\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"昌平区\\\\\\\",    \\\\\\\"value\\\\\\\": 29,    \\\\\\\"type\\\\\\\": \\\\\\\"拥军支前工作\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"东城区\\\\\\\",    \\\\\\\"value\\\\\\\": 28,    \\\\\\\"type\\\\\\\": \\\\\\\"拥军支前工作\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"西城区\\\\\\\",    \\\\\\\"value\\\\\\\": 23,    \\\\\\\"type\\\\\\\": \\\\\\\"拥军支前工作\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"门头沟\\\\\\\",    \\\\\\\"value\\\\\\\": 17,    \\\\\\\"type\\\\\\\": \\\\\\\"拥军支前工作\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"石景山\\\\\\\",    \\\\\\\"value\\\\\\\": 54,    \\\\\\\"type\\\\\\\": \\\\\\\"拥军支前工作\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"丰台区\\\\\\\",    \\\\\\\"value\\\\\\\": 14,    \\\\\\\"type\\\\\\\": \\\\\\\"拥军支前工作\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"房山区\\\\\\\",    \\\\\\\"value\\\\\\\": 25,    \\\\\\\"type\\\\\\\": \\\\\\\"拥军支前工作\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"延庆县\\\\\\\",    \\\\\\\"value\\\\\\\": 23,    \\\\\\\"type\\\\\\\": \\\\\\\"拥军支前工作\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"海淀区\\\\\\\",    \\\\\\\"value\\\\\\\": 54,    \\\\\\\"type\\\\\\\": \\\\\\\"走访慰问部队\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"朝阳区\\\\\\\",    \\\\\\\"value\\\\\\\": 43,    \\\\\\\"type\\\\\\\": \\\\\\\"走访慰问部队\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"大兴区\\\\\\\",    \\\\\\\"value\\\\\\\": 27,    \\\\\\\"type\\\\\\\": \\\\\\\"走访慰问部队\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"怀柔区\\\\\\\",    \\\\\\\"value\\\\\\\": 24,    \\\\\\\"type\\\\\\\": \\\\\\\"走访慰问部队\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"密云区\\\\\\\",    \\\\\\\"value\\\\\\\": 13,    \\\\\\\"type\\\\\\\": \\\\\\\"走访慰问部队\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"平谷区\\\\\\\",    \\\\\\\"value\\\\\\\": 22,    \\\\\\\"type\\\\\\\": \\\\\\\"走访慰问部队\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"顺义区\\\\\\\",    \\\\\\\"value\\\\\\\": 25,    \\\\\\\"type\\\\\\\": \\\\\\\"走访慰问部队\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"通州区\\\\\\\",    \\\\\\\"value\\\\\\\": 22,    \\\\\\\"type\\\\\\\": \\\\\\\"走访慰问部队\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"昌平区\\\\\\\",    \\\\\\\"value\\\\\\\": 19,    \\\\\\\"type\\\\\\\": \\\\\\\"走访慰问部队\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"东城区\\\\\\\",    \\\\\\\"value\\\\\\\": 25,    \\\\\\\"type\\\\\\\": \\\\\\\"走访慰问部队\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"西城区\\\\\\\",    \\\\\\\"value\\\\\\\": 23,    \\\\\\\"type\\\\\\\": \\\\\\\"走访慰问部队\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"门头沟\\\\\\\",    \\\\\\\"value\\\\\\\": 22,    \\\\\\\"type\\\\\\\": \\\\\\\"走访慰问部队\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"石景山\\\\\\\",    \\\\\\\"value\\\\\\\": 13,    \\\\\\\"type\\\\\\\": \\\\\\\"走访慰问部队\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"丰台区\\\\\\\",    \\\\\\\"value\\\\\\\": 24,    \\\\\\\"type\\\\\\\": \\\\\\\"走访慰问部队\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"房山区\\\\\\\",    \\\\\\\"value\\\\\\\": 25,    \\\\\\\"type\\\\\\\": \\\\\\\"走访慰问部队\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"延庆县\\\\\\\",    \\\\\\\"value\\\\\\\": 23,    \\\\\\\"type\\\\\\\": \\\\\\\"走访慰问部队\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":1259,\\\"height\\\":286},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#C039DB\\\"},{\\\"color\\\":\\\"#DE374B\\\"}],\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"show\\\":false},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"show\\\":false},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":90,\\\"left\\\":40,\\\"bottom\\\":50,\\\"right\\\":15},\\\"series\\\":[{\\\"barWidth\\\":19,\\\"itemStyle\\\":{\\\"borderRadius\\\":7}}],\\\"legend\\\":{\\\"t\\\":16,\\\"show\\\":true},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"top\\\":0,\\\"left\\\":124,\\\"show\\\":true,\\\"text\\\":\\\"支持部队建设资金分析（单位：百万）\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#ED1111\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#B9B8CE\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#1D1F26\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507180851200', NULL, '1011915958294990848', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"机构排名\\\",\\\"size\\\":{\\\"width\\\":99.00000000000006,\\\"height\\\":36.99999999999996},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507189239808', NULL, '1011915958294990848', NULL, 'JScrollBoard', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  [    \\\\\\\"西城双拥办\\\\\\\",    \\\\\\\"130/145\\\\\\\",    \\\\\\\"138/145\\\\\\\"  ],  [    \\\\\\\"东城双拥办\\\\\\\",    \\\\\\\"108/145\\\\\\\",    \\\\\\\"108/145\\\\\\\"  ],  [    \\\\\\\"海淀双拥办\\\\\\\",    \\\\\\\"101/140\\\\\\\",    \\\\\\\"101/140\\\\\\\"  ],  [    \\\\\\\"朝阳双拥办\\\\\\\",    \\\\\\\"100/140\\\\\\\",    \\\\\\\"100/140\\\\\\\"  ],  [    \\\\\\\"昌平双拥办\\\\\\\",    \\\\\\\"105/135\\\\\\\",    \\\\\\\"105/135\\\\\\\"  ],  [    \\\\\\\"怀柔双拥办\\\\\\\",    \\\\\\\"102/130\\\\\\\",    \\\\\\\"102/130\\\\\\\"  ],  [    \\\\\\\"密云双拥办\\\\\\\",    \\\\\\\"100/130\\\\\\\",    \\\\\\\"100/130\\\\\\\"  ],  [    \\\\\\\"通州双拥办\\\\\\\",    \\\\\\\"99/120\\\\\\\",    \\\\\\\"99/120\\\\\\\"  ],  [    \\\\\\\"大兴双拥办\\\\\\\",    \\\\\\\"98/118\\\\\\\",    \\\\\\\"98/118\\\\\\\"  ]]\\\",\\\"size\\\":{\\\"width\\\":510,\\\"height\\\":295},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"oddRowBGC\\\":\\\"#0D1731\\\",\\\"headShow\\\":true,\\\"hoverPause\\\":true,\\\"indexWidth\\\":80,\\\"index\\\":true,\\\"carousel\\\":\\\"single\\\",\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"轮播表\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"evenRowBGC\\\":\\\"#11274C\\\",\\\"header\\\":[{\\\"width\\\":100,\\\"label\\\":\\\"地区\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"军队问题解决\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"地方问题解决\\\"}],\\\"headerBGC\\\":\\\"#0D1731\\\",\\\"headerHeight\\\":70,\\\"waitTime\\\":2000,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507201822720', NULL, '1011915958294990848', NULL, 'JRadar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/radar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 75,    \\\\\\\"name\\\\\\\": \\\\\\\"地方志愿者\\\\\\\",    \\\\\\\"type\\\\\\\": \\\\\\\"NBA\\\\\\\",    \\\\\\\"max\\\\\\\": 100  },  {    \\\\\\\"value\\\\\\\": 65,    \\\\\\\"name\\\\\\\": \\\\\\\"军外人才\\\\\\\",    \\\\\\\"type\\\\\\\": \\\\\\\"NBA\\\\\\\",    \\\\\\\"max\\\\\\\": 100  },  {    \\\\\\\"value\\\\\\\": 55,    \\\\\\\"name\\\\\\\": \\\\\\\"军供站资源\\\\\\\",    \\\\\\\"type\\\\\\\": \\\\\\\"NBA\\\\\\\",    \\\\\\\"max\\\\\\\": 100  },  {    \\\\\\\"value\\\\\\\": 74,    \\\\\\\"name\\\\\\\": \\\\\\\"拥军物资\\\\\\\",    \\\\\\\"type\\\\\\\": \\\\\\\"NBA\\\\\\\",    \\\\\\\"max\\\\\\\": 100  },  {    \\\\\\\"value\\\\\\\": 38,    \\\\\\\"name\\\\\\\": \\\\\\\"民用运力\\\\\\\",    \\\\\\\"type\\\\\\\": \\\\\\\"NBA\\\\\\\",    \\\\\\\"max\\\\\\\": 100  },  {    \\\\\\\"value\\\\\\\": 88,    \\\\\\\"name\\\\\\\": \\\\\\\"人防工程\\\\\\\",    \\\\\\\"type\\\\\\\": \\\\\\\"NBA\\\\\\\",    \\\\\\\"max\\\\\\\": 100  }]\\\",\\\"size\\\":{\\\"width\\\":540,\\\"height\\\":326},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"radar\\\":[{\\\"indicator\\\":[]}],\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"data\\\":[],\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"radar\\\"}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"最近一个月\\\",\\\"left\\\":296,\\\"show\\\":true,\\\"text\\\":\\\"拥军资源力度分析\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#B9B8CE\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507214405632', NULL, '1011915958294990848', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"拥军资源投入情况\\\",\\\"size\\\":{\\\"width\\\":171.00000000000006,\\\"height\\\":36.99999999999996},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507222794240', NULL, '1011915958294990848', NULL, 'JRingProgress', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"陆运支持\\\\\\\",    \\\\\\\"value\\\\\\\": 67  }]\\\",\\\"size\\\":{\\\"width\\\":245,\\\"height\\\":150},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"color\\\":\\\"#61DDAA\\\",\\\"bgColor\\\":\\\"#E8EDF3\\\",\\\"fontSize\\\":18,\\\"lineHeight\\\":0,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"fontColor\\\":\\\"#FFFFFF\\\"}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507247960064', NULL, '1011915958294990848', NULL, 'JRingProgress', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"空运支持\\\\\\\",    \\\\\\\"value\\\\\\\": 92  }]\\\",\\\"size\\\":{\\\"width\\\":206,\\\"height\\\":145},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"color\\\":\\\"#8B49BB\\\",\\\"bgColor\\\":\\\"#E8EDF3\\\",\\\"fontSize\\\":18,\\\"lineHeight\\\":0,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"fontColor\\\":\\\"#FFFFFF\\\"}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507260542976', NULL, '1011915958294990848', NULL, 'JRingProgress', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"海运支持\\\\\\\",    \\\\\\\"value\\\\\\\": 94  }]\\\",\\\"size\\\":{\\\"width\\\":206,\\\"height\\\":145},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"color\\\":\\\"#D6AD33\\\",\\\"bgColor\\\":\\\"#E8EDF3\\\",\\\"fontSize\\\":18,\\\"lineHeight\\\":0,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"fontColor\\\":\\\"#FFFFFF\\\"}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507273125888', NULL, '1011915958294990848', NULL, 'JRingProgress', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"防疫物资支持\\\\\\\",    \\\\\\\"value\\\\\\\": 50  }]\\\",\\\"size\\\":{\\\"width\\\":225,\\\"height\\\":148},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"color\\\":\\\"#6755FB\\\",\\\"bgColor\\\":\\\"#E8EDF3\\\",\\\"fontSize\\\":18,\\\"lineHeight\\\":0,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"fontColor\\\":\\\"#FFFFFF\\\"}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507281514496', NULL, '1011915958294990848', NULL, 'JRingProgress', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"慰问物资支持\\\\\\\",    \\\\\\\"value\\\\\\\": 40  }]\\\",\\\"size\\\":{\\\"width\\\":228,\\\"height\\\":145},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"color\\\":\\\"#F6903D\\\",\\\"bgColor\\\":\\\"#E8EDF3\\\",\\\"fontSize\\\":18,\\\"lineHeight\\\":0,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"fontColor\\\":\\\"#FFFFFF\\\"}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507294097408', NULL, '1011915958294990848', NULL, 'JRingProgress', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"医疗物资支持\\\\\\\",    \\\\\\\"value\\\\\\\": 70  }]\\\",\\\"size\\\":{\\\"width\\\":267,\\\"height\\\":145},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"color\\\":\\\"#A82A5A\\\",\\\"bgColor\\\":\\\"#E8EDF3\\\",\\\"fontSize\\\":18,\\\"lineHeight\\\":0,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"fontColor\\\":\\\"#FFFFFF\\\"}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507319263232', NULL, '1011915958294990848', NULL, 'JProgress', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":100,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"军队问题解决\\\\\\\",    \\\\\\\"value\\\\\\\": 89  }]\\\",\\\"size\\\":{\\\"width\\\":330,\\\"height\\\":55},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":16}},\\\"grid\\\":{\\\"top\\\":0,\\\"left\\\":0,\\\"bottom\\\":0,\\\"show\\\":false,\\\"right\\\":55,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":19,\\\"color\\\":\\\"#F5A623\\\",\\\"itemStyle\\\":{\\\"normal\\\":{\\\"barBorderRadius\\\":10}},\\\"zlevel\\\":1,\\\"label\\\":{\\\"formatter\\\":\\\"{c}%\\\",\\\"color\\\":\\\"black\\\",\\\"show\\\":false,\\\"fontSize\\\":24,\\\"position\\\":\\\"left\\\"},\\\"realtimeSort\\\":true},{\\\"barWidth\\\":19,\\\"color\\\":\\\"#EEEEEE\\\",\\\"barGap\\\":\\\"-100%\\\",\\\"itemStyle\\\":{\\\"normal\\\":{\\\"barBorderRadius\\\":10}},\\\"label\\\":{\\\"formatter\\\":\\\"{c}\\\",\\\"color\\\":\\\"#FFFFFF\\\",\\\"show\\\":true,\\\"fontSize\\\":18,\\\"position\\\":\\\"right\\\",\\\"valueAnimation\\\":true},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"none\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}}}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023811507331846144', NULL, '1011915958294990848', NULL, 'JProgress', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":100,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"地方问题解决\\\\\\\",    \\\\\\\"value\\\\\\\": 75  }]\\\",\\\"size\\\":{\\\"width\\\":330,\\\"height\\\":55},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":16}},\\\"grid\\\":{\\\"top\\\":0,\\\"left\\\":0,\\\"bottom\\\":0,\\\"show\\\":false,\\\"right\\\":55,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":19,\\\"color\\\":\\\"#BD10E0\\\",\\\"itemStyle\\\":{\\\"normal\\\":{\\\"barBorderRadius\\\":10}},\\\"zlevel\\\":1,\\\"label\\\":{\\\"formatter\\\":\\\"{c}%\\\",\\\"color\\\":\\\"black\\\",\\\"show\\\":false,\\\"fontSize\\\":24,\\\"position\\\":\\\"left\\\"},\\\"realtimeSort\\\":true},{\\\"barWidth\\\":19,\\\"color\\\":\\\"#EEEEEE\\\",\\\"barGap\\\":\\\"-100%\\\",\\\"itemStyle\\\":{\\\"normal\\\":{\\\"barBorderRadius\\\":10}},\\\"label\\\":{\\\"formatter\\\":\\\"{c}\\\",\\\"color\\\":\\\"#FFFFFF\\\",\\\"show\\\":true,\\\"fontSize\\\":18,\\\"position\\\":\\\"right\\\",\\\"valueAnimation\\\":true},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"none\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}}}}', 'admin', '2024-12-03 14:28:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689476558848', NULL, '1011800681234354176', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"853652\\\",\\\"size\\\":{\\\"width\\\":94.99999999999989,\\\"height\\\":44.999999999999886},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#05D6E9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689484947456', NULL, '1011800681234354176', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"3652\\\",\\\"size\\\":{\\\"width\\\":84,\\\"height\\\":31.280575539568332},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#05D6E9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689501724672', NULL, '1011800681234354176', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"1353652\\\",\\\"size\\\":{\\\"width\\\":77,\\\"height\\\":40.99999999999987},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#05D6E9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689514307584', NULL, '1011800681234354176', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"1753652\\\",\\\"size\\\":{\\\"width\\\":96,\\\"height\\\":41.99999999999983},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#05D6E9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689522696192', NULL, '1011800681234354176', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"26023\\\",\\\"size\\\":{\\\"width\\\":100,\\\"height\\\":37.99999999999994},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#05D6E9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689531084800', NULL, '1011800681234354176', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"60230\\\",\\\"size\\\":{\\\"width\\\":100.00000000000011,\\\"height\\\":33.33093525179855},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#05D6E9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689543667712', NULL, '1011800681234354176', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"8023\\\",\\\"size\\\":{\\\"width\\\":82,\\\"height\\\":39.00000000000006},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#05D6E9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689552056320', NULL, '1011800681234354176', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"12023\\\",\\\"size\\\":{\\\"width\\\":59.000000000000114,\\\"height\\\":45.99999999999993},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#05D6E9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689560444928', NULL, '1011800681234354176', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"26023\\\",\\\"size\\\":{\\\"width\\\":79.99999999999989,\\\"height\\\":44.000000000000014},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#05D6E9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689577222144', NULL, '1011800681234354176', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"8012\\\",\\\"size\\\":{\\\"width\\\":85,\\\"height\\\":53},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#05D6E9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689589805056', NULL, '1011800681234354176', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"26023\\\",\\\"size\\\":{\\\"width\\\":78,\\\"height\\\":49.99999999999982},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#05D6E9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689598193664', NULL, '1011800681234354176', NULL, 'JPie', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[    {        \\\\\\\"name\\\\\\\": \\\\\\\"0-15岁\\\\\\\",        \\\\\\\"value\\\\\\\": 1000879,        \\\\\\\"url\\\\\\\": \\\\\\\"http://www.baidu.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"16-40岁\\\\\\\",        \\\\\\\"value\\\\\\\": 3400879,        \\\\\\\"url\\\\\\\": \\\\\\\"http://www.baidu.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"41-55岁\\\\\\\",        \\\\\\\"value\\\\\\\": 2300879,        \\\\\\\"url\\\\\\\": \\\\\\\"http://www.baidu.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"56-70岁\\\\\\\",        \\\\\\\"value\\\\\\\": 5400879,        \\\\\\\"url\\\\\\\": \\\\\\\"http://www.baidu.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"71+\\\\\\\",        \\\\\\\"value\\\\\\\": 3000,        \\\\\\\"url\\\\\\\": \\\\\\\"http://www.baidu.com\\\\\\\"    }]\\\",\\\"size\\\":{\\\"width\\\":314,\\\"height\\\":243.99999999999994},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#83BFF6\\\"},{\\\"color\\\":\\\"#23B7E5\\\"},{\\\"color\\\":\\\"#9AA8D4\\\"},{\\\"color\\\":\\\"#188DF0\\\"},{\\\"color\\\":\\\"#564AA3\\\"}],\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\",\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":false,\\\"text\\\":\\\"基础饼图\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689606582272', NULL, '1011800681234354176', NULL, 'JMultipleLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"1\\\\\\\",    \\\\\\\"value\\\\\\\": 2879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊订单总数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"2\\\\\\\",    \\\\\\\"value\\\\\\\": 3879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊订单总数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3\\\\\\\",    \\\\\\\"value\\\\\\\": 1879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊订单总数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"4\\\\\\\",    \\\\\\\"value\\\\\\\": 879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊订单总数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5\\\\\\\",    \\\\\\\"value\\\\\\\": 1879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊订单总数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"6\\\\\\\",    \\\\\\\"value\\\\\\\": 779,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊订单总数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"7\\\\\\\",    \\\\\\\"value\\\\\\\": 279,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊订单总数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"8\\\\\\\",    \\\\\\\"value\\\\\\\": 339,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊订单总数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"1\\\\\\\",    \\\\\\\"value\\\\\\\": 1879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊已支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"2\\\\\\\",    \\\\\\\"value\\\\\\\": 5879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊已支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3\\\\\\\",    \\\\\\\"value\\\\\\\": 4579,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊已支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"4\\\\\\\",    \\\\\\\"value\\\\\\\": 3879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊已支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5\\\\\\\",    \\\\\\\"value\\\\\\\": 179,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊已支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"6\\\\\\\",    \\\\\\\"value\\\\\\\": 979,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊已支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"7\\\\\\\",    \\\\\\\"value\\\\\\\": 179,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊已支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"8\\\\\\\",    \\\\\\\"value\\\\\\\": 2879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊已支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"1\\\\\\\",    \\\\\\\"value\\\\\\\": 879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊未支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"2\\\\\\\",    \\\\\\\"value\\\\\\\": 1879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊未支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3\\\\\\\",    \\\\\\\"value\\\\\\\": 979,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊未支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"4\\\\\\\",    \\\\\\\"value\\\\\\\": 3879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊未支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5\\\\\\\",    \\\\\\\"value\\\\\\\": 5179,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊未支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"6\\\\\\\",    \\\\\\\"value\\\\\\\": 3379,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊未支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"7\\\\\\\",    \\\\\\\"value\\\\\\\": 879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊未支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"8\\\\\\\",    \\\\\\\"value\\\\\\\": 879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊未支付\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":517,\\\"height\\\":332},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115},\\\"series\\\":[{\\\"lineType\\\":\\\"smooth\\\",\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}}],\\\"legend\\\":{\\\"show\\\":false},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"多数据对比折线图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#1D1F26\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689619165184', NULL, '1011800681234354176', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"图文\\\\\\\",    \\\\\\\"value\\\\\\\": 120879,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"视频\\\\\\\",    \\\\\\\"value\\\\\\\": 232879,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"面询\\\\\\\",    \\\\\\\"value\\\\\\\": 340879,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"电话\\\\\\\",    \\\\\\\"value\\\\\\\": 534790,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"量表\\\\\\\",    \\\\\\\"value\\\\\\\": 560879,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"随访\\\\\\\",    \\\\\\\"value\\\\\\\": 670879,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"提醒包\\\\\\\",    \\\\\\\"value\\\\\\\": 400879,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"药品\\\\\\\",    \\\\\\\"value\\\\\\\": 540879,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"复诊\\\\\\\",    \\\\\\\"value\\\\\\\": 200879,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":754,\\\"height\\\":392},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"left\\\":82,\\\"bottom\\\":115,\\\"show\\\":false,\\\"right\\\":101,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":22,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\",\\\"borderRadius\\\":0},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true,\\\"position\\\":\\\"top\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#1D1F26\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689627553792', NULL, '1011800681234354176', NULL, 'JRose', '{\\\"chartData\\\":\\\"[    {        \\\\\\\"name\\\\\\\": \\\\\\\"康宁\\\\\\\",        \\\\\\\"value\\\\\\\": 1000879,        \\\\\\\"url\\\\\\\": \\\\\\\"http://www.baidu.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"安肯\\\\\\\",        \\\\\\\"value\\\\\\\": 3400879,        \\\\\\\"url\\\\\\\": \\\\\\\"http://www.baidu.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"怡宁\\\\\\\",        \\\\\\\"value\\\\\\\": 2300879,        \\\\\\\"url\\\\\\\": \\\\\\\"http://www.baidu.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"淳安\\\\\\\",        \\\\\\\"value\\\\\\\": 5400879,        \\\\\\\"url\\\\\\\": \\\\\\\"http://www.baidu.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"医院\\\\\\\",        \\\\\\\"value\\\\\\\": 3000,        \\\\\\\"url\\\\\\\": \\\\\\\"http://www.baidu.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"其他\\\\\\\",        \\\\\\\"value\\\\\\\": 2000,        \\\\\\\"url\\\\\\\": \\\\\\\"http://www.baidu.com\\\\\\\"    }]\\\",\\\"size\\\":{\\\"width\\\":400,\\\"height\\\":222.99999999999994},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":30,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#83BFF6\\\"},{\\\"color\\\":\\\"#23B7E5\\\"},{\\\"color\\\":\\\"#9AA8D4\\\"},{\\\"color\\\":\\\"#188DF0\\\"},{\\\"color\\\":\\\"#564AA3\\\"}],\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"roseType\\\":\\\"radius\\\",\\\"name\\\":\\\"南丁格尔玫瑰\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":false,\\\"text\\\":\\\"基础饼图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689644331008', NULL, '1011800681234354176', NULL, 'JMultipleLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"1\\\\\\\",    \\\\\\\"value\\\\\\\": 879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊订单总数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"2\\\\\\\",    \\\\\\\"value\\\\\\\": 1879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊订单总数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3\\\\\\\",    \\\\\\\"value\\\\\\\": 779,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊订单总数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"4\\\\\\\",    \\\\\\\"value\\\\\\\": 879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊订单总数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5\\\\\\\",    \\\\\\\"value\\\\\\\": 3879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊订单总数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"6\\\\\\\",    \\\\\\\"value\\\\\\\": 779,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊订单总数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"7\\\\\\\",    \\\\\\\"value\\\\\\\": 279,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊订单总数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"8\\\\\\\",    \\\\\\\"value\\\\\\\": 339,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊订单总数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"1\\\\\\\",    \\\\\\\"value\\\\\\\": 1879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊已支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"2\\\\\\\",    \\\\\\\"value\\\\\\\": 3879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊已支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3\\\\\\\",    \\\\\\\"value\\\\\\\": 4579,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊已支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"4\\\\\\\",    \\\\\\\"value\\\\\\\": 3879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊已支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5\\\\\\\",    \\\\\\\"value\\\\\\\": 179,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊已支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"6\\\\\\\",    \\\\\\\"value\\\\\\\": 979,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊已支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"7\\\\\\\",    \\\\\\\"value\\\\\\\": 179,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊已支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"8\\\\\\\",    \\\\\\\"value\\\\\\\": 2879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊已支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"1\\\\\\\",    \\\\\\\"value\\\\\\\": 879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊未支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"2\\\\\\\",    \\\\\\\"value\\\\\\\": 1879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊未支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3\\\\\\\",    \\\\\\\"value\\\\\\\": 979,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊未支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"4\\\\\\\",    \\\\\\\"value\\\\\\\": 3879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊未支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5\\\\\\\",    \\\\\\\"value\\\\\\\": 5179,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊未支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"6\\\\\\\",    \\\\\\\"value\\\\\\\": 3379,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊未支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"7\\\\\\\",    \\\\\\\"value\\\\\\\": 879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊未支付\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"8\\\\\\\",    \\\\\\\"value\\\\\\\": 879,    \\\\\\\"type\\\\\\\": \\\\\\\"问诊未支付\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":566,\\\"height\\\":313.00000000000006},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115},\\\"series\\\":[{\\\"lineType\\\":\\\"smooth\\\"}],\\\"legend\\\":{\\\"show\\\":false},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"多数据对比折线图\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689656913920', NULL, '1011800681234354176', NULL, 'JDynamicBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"妇科\\\\\\\",    \\\\\\\"value\\\\\\\": 160879,    \\\\\\\"type\\\\\\\": \\\\\\\"Lon\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"儿科\\\\\\\",    \\\\\\\"value\\\\\\\": 348879,    \\\\\\\"type\\\\\\\": \\\\\\\"Lon\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"儿科中医\\\\\\\",    \\\\\\\"value\\\\\\\": 288879,    \\\\\\\"type\\\\\\\": \\\\\\\"Lon\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"内分泌科\\\\\\\",    \\\\\\\"value\\\\\\\": 120879,    \\\\\\\"type\\\\\\\": \\\\\\\"Lon\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"耳鼻喉科\\\\\\\",    \\\\\\\"value\\\\\\\": 570879,    \\\\\\\"type\\\\\\\": \\\\\\\"Lon\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"肩颈科\\\\\\\",    \\\\\\\"value\\\\\\\": 290849,    \\\\\\\"type\\\\\\\": \\\\\\\"Lon\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"产科\\\\\\\",    \\\\\\\"value\\\\\\\": 120079,    \\\\\\\"type\\\\\\\": \\\\\\\"Lon\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"过敏科\\\\\\\",    \\\\\\\"value\\\\\\\": 240079,    \\\\\\\"type\\\\\\\": \\\\\\\"Lon\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"中医科\\\\\\\",    \\\\\\\"value\\\\\\\": 440555,    \\\\\\\"type\\\\\\\": \\\\\\\"Lon\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"营养科\\\\\\\",    \\\\\\\"value\\\\\\\": 124079,    \\\\\\\"type\\\\\\\": \\\\\\\"Lon\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":221,\\\"height\\\":510},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"show\\\":false,\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":82,\\\"left\\\":65,\\\"bottom\\\":67},\\\"series\\\":[{\\\"barWidth\\\":13,\\\"showBackground\\\":false,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"#51626E\\\"},\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\"}}],\\\"legend\\\":{\\\"show\\\":false},\\\"tooltip\\\":{\\\"show\\\":false,\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"动态柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#1D1F26\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689665302528', NULL, '1011800681234354176', NULL, 'JDynamicBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"医生\\\\\\\",    \\\\\\\"value\\\\\\\": 1000879,    \\\\\\\"type\\\\\\\": \\\\\\\"Lon\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"患者\\\\\\\",    \\\\\\\"value\\\\\\\": 3400879,    \\\\\\\"type\\\\\\\": \\\\\\\"Lon\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"咨询师\\\\\\\",    \\\\\\\"value\\\\\\\": 2300879,    \\\\\\\"type\\\\\\\": \\\\\\\"Lon\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"导医\\\\\\\",    \\\\\\\"value\\\\\\\": 5400879,    \\\\\\\"type\\\\\\\": \\\\\\\"Lon\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"患者\\\\\\\",    \\\\\\\"value\\\\\\\": 3400879,    \\\\\\\"type\\\\\\\": \\\\\\\"Lon\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"咨询师\\\\\\\",    \\\\\\\"value\\\\\\\": 7400879,    \\\\\\\"type\\\\\\\": \\\\\\\"Lon\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"咨询师\\\\\\\",    \\\\\\\"value\\\\\\\": 2400879,    \\\\\\\"type\\\\\\\": \\\\\\\"Lon\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":228.00000000000003,\\\"height\\\":424},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"xAxis\\\":{\\\"show\\\":false},\\\"grid\\\":{\\\"top\\\":90,\\\"left\\\":46,\\\"bottom\\\":81,\\\"right\\\":57},\\\"series\\\":[{\\\"barWidth\\\":17,\\\"itemStyle\\\":{\\\"color\\\":\\\"#A83240\\\"}}],\\\"legend\\\":{\\\"show\\\":false},\\\"tooltip\\\":{\\\"show\\\":false,\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"动态柱形图\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689677885440', NULL, '1011800681234354176', NULL, 'JRose', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"医生\\\\\\\",    \\\\\\\"value\\\\\\\": 1000879,    \\\\\\\"url\\\\\\\": \\\\\\\"http://jeecg.com\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"医生\\\\\\\",    \\\\\\\"value\\\\\\\": 3400879,    \\\\\\\"url\\\\\\\": \\\\\\\"http://jeecg.com\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"医生\\\\\\\",    \\\\\\\"value\\\\\\\": 2300879,    \\\\\\\"url\\\\\\\": \\\\\\\"http://jeecg.com\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"医生\\\\\\\",    \\\\\\\"value\\\\\\\": 5400879,    \\\\\\\"url\\\\\\\": \\\\\\\"http://jeecg.com\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"医生\\\\\\\",    \\\\\\\"value\\\\\\\": 3000,    \\\\\\\"url\\\\\\\": \\\\\\\"http://jeecg.com\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"医生\\\\\\\",    \\\\\\\"value\\\\\\\": 2000,    \\\\\\\"url\\\\\\\": \\\\\\\"http://jeecg.com\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":221,\\\"height\\\":180.46043165467626},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":30,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#83BFF6\\\"},{\\\"color\\\":\\\"#23B7E5\\\"},{\\\"color\\\":\\\"#9AA8D4\\\"},{\\\"color\\\":\\\"#188DF0\\\"},{\\\"color\\\":\\\"#564AA3\\\"}],\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\",\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"roseType\\\":\\\"radius\\\",\\\"name\\\":\\\"南丁格尔玫瑰\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":false,\\\"text\\\":\\\"基础饼图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689686274048', NULL, '1011800681234354176', NULL, 'JRose', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 1048,    \\\\\\\"name\\\\\\\": \\\\\\\"vivo\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 735,    \\\\\\\"name\\\\\\\": \\\\\\\"oppo\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 580,    \\\\\\\"name\\\\\\\": \\\\\\\"苹果\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 484,    \\\\\\\"name\\\\\\\": \\\\\\\"小米\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 300,    \\\\\\\"name\\\\\\\": \\\\\\\"三星\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":215,\\\"height\\\":264.0000000000001},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":30,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#83BFF6\\\"},{\\\"color\\\":\\\"#23B7E5\\\"},{\\\"color\\\":\\\"#9AA8D4\\\"},{\\\"color\\\":\\\"#188DF0\\\"},{\\\"color\\\":\\\"#564AA3\\\"}],\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\",\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"roseType\\\":\\\"radius\\\",\\\"name\\\":\\\"南丁格尔玫瑰\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":false,\\\"text\\\":\\\"基础饼图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689694662656', NULL, '1011800681234354176', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"医生\\\\\\\",    \\\\\\\"value\\\\\\\": 1079,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"咨询师\\\\\\\",    \\\\\\\"value\\\\\\\": 3479,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"小程序\\\\\\\",    \\\\\\\"value\\\\\\\": 2709,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"后台系统\\\\\\\",    \\\\\\\"value\\\\\\\": 5856,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"APP\\\\\\\",    \\\\\\\"value\\\\\\\": 3823,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":471.00000000000006,\\\"height\\\":387.00000000000006},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"left\\\":57,\\\"bottom\\\":130,\\\"show\\\":false,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":20,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\",\\\"borderRadius\\\":0},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true,\\\"position\\\":\\\"top\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689707245568', NULL, '1011800681234354176', NULL, 'JPie', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[    {        \\\\\\\"name\\\\\\\": \\\\\\\"1-15岁\\\\\\\",        \\\\\\\"value\\\\\\\": 1000879,        \\\\\\\"url\\\\\\\": \\\\\\\"http://www.baidu.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"16-40\\\\\\\",        \\\\\\\"value\\\\\\\": 3400879,        \\\\\\\"url\\\\\\\": \\\\\\\"http://www.baidu.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"41-55\\\\\\\",        \\\\\\\"value\\\\\\\": 2300879,        \\\\\\\"url\\\\\\\": \\\\\\\"http://www.baidu.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"56-70\\\\\\\",        \\\\\\\"value\\\\\\\": 5400879,        \\\\\\\"url\\\\\\\": \\\\\\\"http://www.baidu.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"71+\\\\\\\",        \\\\\\\"value\\\\\\\": 3000,        \\\\\\\"url\\\\\\\": \\\\\\\"http://www.baidu.com\\\\\\\"    }]\\\",\\\"size\\\":{\\\"width\\\":328,\\\"height\\\":300},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#83BFF6\\\"},{\\\"color\\\":\\\"#23B7E5\\\"},{\\\"color\\\":\\\"#9AA8D4\\\"},{\\\"color\\\":\\\"#188DF0\\\"},{\\\"color\\\":\\\"#564AA3\\\"}],\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\",\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":false,\\\"text\\\":\\\"基础饼图\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689719828480', NULL, '1011800681234354176', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"app\\\\\\\",    \\\\\\\"value\\\\\\\": 1879,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"小程序\\\\\\\",    \\\\\\\"value\\\\\\\": 3879,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"医生端\\\\\\\",    \\\\\\\"value\\\\\\\": 2879,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":269.9999999999999,\\\"height\\\":297},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":16,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\",\\\"borderRadius\\\":0},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true,\\\"position\\\":\\\"top\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"showUnit\\\":{\\\"numberLevel\\\":\\\"0\\\",\\\"show\\\":true}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689732411392', NULL, '1011800681234354176', NULL, 'JScatter', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": 1,    \\\\\\\"value\\\\\\\": 8.04  },  {    \\\\\\\"name\\\\\\\": 2,    \\\\\\\"value\\\\\\\": 6.95  },  {    \\\\\\\"name\\\\\\\": 1,    \\\\\\\"value\\\\\\\": 4.04  },  {    \\\\\\\"name\\\\\\\": 2,    \\\\\\\"value\\\\\\\": 3.95  }]\\\",\\\"size\\\":{\\\"width\\\":212,\\\"height\\\":269},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"symbolSize\\\":20,\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"type\\\":\\\"scatter\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"x:{b}<br/>y:{c}\\\",\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础散点图\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689744994304', NULL, '1011800681234354176', NULL, 'JScrollBoard', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"key1\\\\\\\": \\\\\\\"01-18\\\\\\\",    \\\\\\\"key2\\\\\\\": \\\\\\\"张图\\\\\\\",    \\\\\\\"key3\\\\\\\": \\\\\\\"李木木\\\\\\\",    \\\\\\\"key4\\\\\\\": \\\\\\\"图文问诊\\\\\\\",    \\\\\\\"key5\\\\\\\": \\\\\\\"专家问诊\\\\\\\",    \\\\\\\"key6\\\\\\\": \\\\\\\"100\\\\\\\",    \\\\\\\"key7\\\\\\\": \\\\\\\"已支付\\\\\\\",    \\\\\\\"key8\\\\\\\": \\\\\\\"01-10\\\\\\\"  },  {    \\\\\\\"key1\\\\\\\": \\\\\\\"01-18\\\\\\\",    \\\\\\\"key2\\\\\\\": \\\\\\\"张图\\\\\\\",    \\\\\\\"key3\\\\\\\": \\\\\\\"李木木\\\\\\\",    \\\\\\\"key4\\\\\\\": \\\\\\\"图文问诊\\\\\\\",    \\\\\\\"key5\\\\\\\": \\\\\\\"专家问诊\\\\\\\",    \\\\\\\"key6\\\\\\\": \\\\\\\"100\\\\\\\",    \\\\\\\"key7\\\\\\\": \\\\\\\"已支付\\\\\\\",    \\\\\\\"key8\\\\\\\": \\\\\\\"01-10\\\\\\\"  },  {    \\\\\\\"key1\\\\\\\": \\\\\\\"01-18\\\\\\\",    \\\\\\\"key2\\\\\\\": \\\\\\\"张图\\\\\\\",    \\\\\\\"key3\\\\\\\": \\\\\\\"李木木\\\\\\\",    \\\\\\\"key4\\\\\\\": \\\\\\\"图文问诊\\\\\\\",    \\\\\\\"key5\\\\\\\": \\\\\\\"专家问诊\\\\\\\",    \\\\\\\"key6\\\\\\\": \\\\\\\"100\\\\\\\",    \\\\\\\"key7\\\\\\\": \\\\\\\"已支付\\\\\\\",    \\\\\\\"key8\\\\\\\": \\\\\\\"01-10\\\\\\\"  },  {    \\\\\\\"key1\\\\\\\": \\\\\\\"01-18\\\\\\\",    \\\\\\\"key2\\\\\\\": \\\\\\\"张图\\\\\\\",    \\\\\\\"key3\\\\\\\": \\\\\\\"李木木\\\\\\\",    \\\\\\\"key4\\\\\\\": \\\\\\\"图文问诊\\\\\\\",    \\\\\\\"key5\\\\\\\": \\\\\\\"专家问诊\\\\\\\",    \\\\\\\"key6\\\\\\\": \\\\\\\"100\\\\\\\",    \\\\\\\"key7\\\\\\\": \\\\\\\"已支付\\\\\\\",    \\\\\\\"key8\\\\\\\": \\\\\\\"01-10\\\\\\\"  },  {    \\\\\\\"key1\\\\\\\": \\\\\\\"01-18\\\\\\\",    \\\\\\\"key2\\\\\\\": \\\\\\\"张图\\\\\\\",    \\\\\\\"key3\\\\\\\": \\\\\\\"李木木\\\\\\\",    \\\\\\\"key4\\\\\\\": \\\\\\\"图文问诊\\\\\\\",    \\\\\\\"key5\\\\\\\": \\\\\\\"专家问诊\\\\\\\",    \\\\\\\"key6\\\\\\\": \\\\\\\"100\\\\\\\",    \\\\\\\"key7\\\\\\\": \\\\\\\"已支付\\\\\\\",    \\\\\\\"key8\\\\\\\": \\\\\\\"01-10\\\\\\\"  },  {    \\\\\\\"key1\\\\\\\": \\\\\\\"01-18\\\\\\\",    \\\\\\\"key2\\\\\\\": \\\\\\\"张图\\\\\\\",    \\\\\\\"key3\\\\\\\": \\\\\\\"李木木\\\\\\\",    \\\\\\\"key4\\\\\\\": \\\\\\\"图文问诊\\\\\\\",    \\\\\\\"key5\\\\\\\": \\\\\\\"专家问诊\\\\\\\",    \\\\\\\"key6\\\\\\\": \\\\\\\"100\\\\\\\",    \\\\\\\"key7\\\\\\\": \\\\\\\"已支付\\\\\\\",    \\\\\\\"key8\\\\\\\": \\\\\\\"01-10\\\\\\\"  },  {    \\\\\\\"key1\\\\\\\": \\\\\\\"01-18\\\\\\\",    \\\\\\\"key2\\\\\\\": \\\\\\\"张图\\\\\\\",    \\\\\\\"key3\\\\\\\": \\\\\\\"李木木\\\\\\\",    \\\\\\\"key4\\\\\\\": \\\\\\\"图文问诊\\\\\\\",    \\\\\\\"key5\\\\\\\": \\\\\\\"专家问诊\\\\\\\",    \\\\\\\"key6\\\\\\\": \\\\\\\"100\\\\\\\",    \\\\\\\"key7\\\\\\\": \\\\\\\"已支付\\\\\\\",    \\\\\\\"key8\\\\\\\": \\\\\\\"01-10\\\\\\\"  },  {    \\\\\\\"key1\\\\\\\": \\\\\\\"01-18\\\\\\\",    \\\\\\\"key2\\\\\\\": \\\\\\\"张图\\\\\\\",    \\\\\\\"key3\\\\\\\": \\\\\\\"李木木\\\\\\\",    \\\\\\\"key4\\\\\\\": \\\\\\\"图文问诊\\\\\\\",    \\\\\\\"key5\\\\\\\": \\\\\\\"专家问诊\\\\\\\",    \\\\\\\"key6\\\\\\\": \\\\\\\"100\\\\\\\",    \\\\\\\"key7\\\\\\\": \\\\\\\"已支付\\\\\\\",    \\\\\\\"key8\\\\\\\": \\\\\\\"01-10\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":417,\\\"height\\\":214},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"oddRowBGC\\\":\\\"#07284B\\\",\\\"headShow\\\":true,\\\"hoverPause\\\":true,\\\"indexWidth\\\":80,\\\"index\\\":false,\\\"carousel\\\":\\\"single\\\",\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"evenRowBGC\\\":\\\"#06243D\\\",\\\"header\\\":[{\\\"width\\\":100,\\\"label\\\":\\\"创建时间\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"患者姓名\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"接诊医生\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"服务类型\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"订单类型\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"支付金额\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"支付状态\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"预约时间\\\"}],\\\"headerBGC\\\":\\\"#072F48\\\",\\\"headerHeight\\\":45,\\\"waitTime\\\":2000,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023815689757577216', NULL, '1011800681234354176', NULL, 'JScrollBoard', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[    {        \\\\\\\"key1\\\\\\\": \\\\\\\"2022-01-18 15:11:55\\\\\\\",        \\\\\\\"key2\\\\\\\": \\\\\\\"张图\\\\\\\",        \\\\\\\"key3\\\\\\\": \\\\\\\"李木木\\\\\\\",        \\\\\\\"key4\\\\\\\": \\\\\\\"图文问诊\\\\\\\",        \\\\\\\"key5\\\\\\\": \\\\\\\"专家问诊\\\\\\\",        \\\\\\\"key6\\\\\\\": \\\\\\\"100\\\\\\\",        \\\\\\\"key7\\\\\\\": \\\\\\\"已支付\\\\\\\",        \\\\\\\"key8\\\\\\\": \\\\\\\"2022-01-10\\\\\\\"    },    {        \\\\\\\"key1\\\\\\\": \\\\\\\"2022-01-18 15:11:55\\\\\\\",        \\\\\\\"key2\\\\\\\": \\\\\\\"张图\\\\\\\",        \\\\\\\"key3\\\\\\\": \\\\\\\"李木木\\\\\\\",        \\\\\\\"key4\\\\\\\": \\\\\\\"图文问诊\\\\\\\",        \\\\\\\"key5\\\\\\\": \\\\\\\"专家问诊\\\\\\\",        \\\\\\\"key6\\\\\\\": \\\\\\\"100\\\\\\\",        \\\\\\\"key7\\\\\\\": \\\\\\\"已支付\\\\\\\",        \\\\\\\"key8\\\\\\\": \\\\\\\"2022-01-10\\\\\\\"    },    {        \\\\\\\"key1\\\\\\\": \\\\\\\"2022-01-18 15:11:55\\\\\\\",        \\\\\\\"key2\\\\\\\": \\\\\\\"张图\\\\\\\",        \\\\\\\"key3\\\\\\\": \\\\\\\"李木木\\\\\\\",        \\\\\\\"key4\\\\\\\": \\\\\\\"图文问诊\\\\\\\",        \\\\\\\"key5\\\\\\\": \\\\\\\"专家问诊\\\\\\\",        \\\\\\\"key6\\\\\\\": \\\\\\\"100\\\\\\\",        \\\\\\\"key7\\\\\\\": \\\\\\\"已支付\\\\\\\",        \\\\\\\"key8\\\\\\\": \\\\\\\"2022-01-10\\\\\\\"    },    {        \\\\\\\"key1\\\\\\\": \\\\\\\"2022-01-18 15:11:55\\\\\\\",        \\\\\\\"key2\\\\\\\": \\\\\\\"张图\\\\\\\",        \\\\\\\"key3\\\\\\\": \\\\\\\"李木木\\\\\\\",        \\\\\\\"key4\\\\\\\": \\\\\\\"图文问诊\\\\\\\",        \\\\\\\"key5\\\\\\\": \\\\\\\"专家问诊\\\\\\\",        \\\\\\\"key6\\\\\\\": \\\\\\\"100\\\\\\\",        \\\\\\\"key7\\\\\\\": \\\\\\\"已支付\\\\\\\",        \\\\\\\"key8\\\\\\\": \\\\\\\"2022-01-10\\\\\\\"    },    {        \\\\\\\"key1\\\\\\\": \\\\\\\"2022-01-18 15:11:55\\\\\\\",        \\\\\\\"key2\\\\\\\": \\\\\\\"张图\\\\\\\",        \\\\\\\"key3\\\\\\\": \\\\\\\"李木木\\\\\\\",        \\\\\\\"key4\\\\\\\": \\\\\\\"图文问诊\\\\\\\",        \\\\\\\"key5\\\\\\\": \\\\\\\"专家问诊\\\\\\\",        \\\\\\\"key6\\\\\\\": \\\\\\\"100\\\\\\\",        \\\\\\\"key7\\\\\\\": \\\\\\\"已支付\\\\\\\",        \\\\\\\"key8\\\\\\\": \\\\\\\"2022-01-10\\\\\\\"    },    {        \\\\\\\"key1\\\\\\\": \\\\\\\"2022-01-18 15:11:55\\\\\\\",        \\\\\\\"key2\\\\\\\": \\\\\\\"张图\\\\\\\",        \\\\\\\"key3\\\\\\\": \\\\\\\"李木木\\\\\\\",        \\\\\\\"key4\\\\\\\": \\\\\\\"图文问诊\\\\\\\",        \\\\\\\"key5\\\\\\\": \\\\\\\"专家问诊\\\\\\\",        \\\\\\\"key6\\\\\\\": \\\\\\\"100\\\\\\\",        \\\\\\\"key7\\\\\\\": \\\\\\\"已支付\\\\\\\",        \\\\\\\"key8\\\\\\\": \\\\\\\"2022-01-10\\\\\\\"    },    {        \\\\\\\"key1\\\\\\\": \\\\\\\"2022-01-18 15:11:55\\\\\\\",        \\\\\\\"key2\\\\\\\": \\\\\\\"张图\\\\\\\",        \\\\\\\"key3\\\\\\\": \\\\\\\"李木木\\\\\\\",        \\\\\\\"key4\\\\\\\": \\\\\\\"图文问诊\\\\\\\",        \\\\\\\"key5\\\\\\\": \\\\\\\"专家问诊\\\\\\\",        \\\\\\\"key6\\\\\\\": \\\\\\\"100\\\\\\\",        \\\\\\\"key7\\\\\\\": \\\\\\\"已支付\\\\\\\",        \\\\\\\"key8\\\\\\\": \\\\\\\"2022-01-10\\\\\\\"    },    {        \\\\\\\"key1\\\\\\\": \\\\\\\"2022-01-18 15:11:55\\\\\\\",        \\\\\\\"key2\\\\\\\": \\\\\\\"张图\\\\\\\",        \\\\\\\"key3\\\\\\\": \\\\\\\"李木木\\\\\\\",        \\\\\\\"key4\\\\\\\": \\\\\\\"图文问诊\\\\\\\",        \\\\\\\"key5\\\\\\\": \\\\\\\"专家问诊\\\\\\\",        \\\\\\\"key6\\\\\\\": \\\\\\\"100\\\\\\\",        \\\\\\\"key7\\\\\\\": \\\\\\\"已支付\\\\\\\",        \\\\\\\"key8\\\\\\\": \\\\\\\"2022-01-10\\\\\\\"    },    {        \\\\\\\"key1\\\\\\\": \\\\\\\"2022-01-18 15:11:55\\\\\\\",        \\\\\\\"key2\\\\\\\": \\\\\\\"张图\\\\\\\",        \\\\\\\"key3\\\\\\\": \\\\\\\"李木木\\\\\\\",        \\\\\\\"key4\\\\\\\": \\\\\\\"图文问诊\\\\\\\",        \\\\\\\"key5\\\\\\\": \\\\\\\"专家问诊\\\\\\\",        \\\\\\\"key6\\\\\\\": \\\\\\\"100\\\\\\\",        \\\\\\\"key7\\\\\\\": \\\\\\\"已支付\\\\\\\",        \\\\\\\"key8\\\\\\\": \\\\\\\"2022-01-10\\\\\\\"    }]\\\",\\\"size\\\":{\\\"width\\\":417,\\\"height\\\":214},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"oddRowBGC\\\":\\\"#07284B\\\",\\\"headShow\\\":true,\\\"hoverPause\\\":true,\\\"indexWidth\\\":80,\\\"index\\\":false,\\\"carousel\\\":\\\"single\\\",\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"evenRowBGC\\\":\\\"#06243D\\\",\\\"header\\\":[{\\\"width\\\":\\\"50\\\",\\\"label\\\":\\\"创建时间\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"患者姓名\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"接诊医生\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"服务类型\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"订单类型\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"支付金额\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"支付状态\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"预约时间\\\"}],\\\"headerBGC\\\":\\\"#072F48\\\",\\\"headerHeight\\\":45,\\\"waitTime\\\":2000,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:44:52', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816327790907392', NULL, '1011871598899679232', NULL, 'JDragBorder', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1918,\\\"height\\\":1077},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":12,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"1\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816327832850432', NULL, '1011871598899679232', NULL, 'JDragBorder', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":524.2374100719425,\\\"height\\\":289},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":12,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816327853821952', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1911,\\\"height\\\":78},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"backgroundColor\\\":\\\"#4A4A4A00\\\",\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/upload/6头图片_1730965358518.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816327891570688', NULL, '1011871598899679232', NULL, 'JDragBorder', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":460,\\\"height\\\":320.8561151079137},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":12,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816327916736512', NULL, '1011871598899679232', NULL, 'JDragBorder', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":447,\\\"height\\\":321.47482014388487},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":12,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816327937708032', NULL, '1011871598899679232', NULL, 'JDragBorder', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":453,\\\"height\\\":245},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":12,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816327971262464', NULL, '1011871598899679232', NULL, 'JDragBorder', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":454,\\\"height\\\":286.61870503597123},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":12,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816327992233984', NULL, '1011871598899679232', NULL, 'JDragBorder', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":521,\\\"height\\\":325.8561151079137},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":12,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328042565632', NULL, '1011871598899679232', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"个体\\\\\\\",    \\\\\\\"value\\\\\\\": 2130,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"内资\\\\\\\",    \\\\\\\"value\\\\\\\": 1800,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"外资\\\\\\\",    \\\\\\\"value\\\\\\\": 1600,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"企业\\\\\\\",    \\\\\\\"value\\\\\\\": 2330,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"个人\\\\\\\",    \\\\\\\"value\\\\\\\": 1450,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":444,\\\"height\\\":414},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":13,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#00BABD\\\",\\\"borderRadius\\\":0},\\\"label\\\":{\\\"color\\\":\\\"#00BABD\\\",\\\"show\\\":true},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328071925760', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"北京税务在线监控\\\",\\\"size\\\":{\\\"width\\\":666,\\\"height\\\":85.00000000000006},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"horseLamp\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#13A6EF\\\",\\\"letterSpacing\\\":16,\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":3},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328109674496', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"...........\\\",\\\"size\\\":{\\\"width\\\":137,\\\"height\\\":75.99999999999997},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#40AAFC\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328130646016', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":129.0000000000001,\\\"height\\\":61.99999999999994},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/导航框_1657782375184.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328151617536', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"【综合统计】\\\",\\\"size\\\":{\\\"width\\\":145,\\\"height\\\":95.00000000000006},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFB116\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328185171968', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":125,\\\"height\\\":54.000000000000064},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/导航框_1657782375184.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328214532096', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":152.9999999999999,\\\"height\\\":58},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/导航框_1657782375184.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328252280832', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":156,\\\"height\\\":57.00000000000015},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/导航框_1657782375184.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328277446656', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":149,\\\"height\\\":52.99999999999994},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/导航框_1657782375184.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328311001088', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":159.9999999999999,\\\"height\\\":50.00000000000003},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/导航框_1657782375184.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328336166912', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":150.0000000000001,\\\"height\\\":53.99999999999997},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/导航框_1657782375184.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328352944128', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"三重一大\\\",\\\"size\\\":{\\\"width\\\":117,\\\"height\\\":68.99999999999989},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0FA9E2\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328394887168', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"人事系统\\\",\\\"size\\\":{\\\"width\\\":173,\\\"height\\\":60.00000000000003},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0FA9E2\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328411664384', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"投资管理\\\",\\\"size\\\":{\\\"width\\\":173.00000000000006,\\\"height\\\":53.99999999999983},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0FA9E2\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328432635904', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"产权管理系统\\\",\\\"size\\\":{\\\"width\\\":147,\\\"height\\\":56.00000000000001},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0FA9E2\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328457801728', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"责任追究系统\\\",\\\"size\\\":{\\\"width\\\":146,\\\"height\\\":54.00000000000007},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0FA9E2\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328482967552', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"资金核算系统\\\",\\\"size\\\":{\\\"width\\\":164,\\\"height\\\":59.999999999999794},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0FA9E2\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328512327680', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"▲ 大额支出情况\\\",\\\"size\\\":{\\\"width\\\":171,\\\"height\\\":53.99999999999997},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#3B9EEB\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328533299200', NULL, '1011871598899679232', NULL, 'JPie', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[    {        \\\\\\\"name\\\\\\\": \\\\\\\"个体\\\\\\\",        \\\\\\\"value\\\\\\\": 210,        \\\\\\\"url\\\\\\\": \\\\\\\"http://jeecg.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"外资\\\\\\\",        \\\\\\\"value\\\\\\\": 120,        \\\\\\\"url\\\\\\\": \\\\\\\"http://jeecg.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"内资\\\\\\\",        \\\\\\\"value\\\\\\\": 110,        \\\\\\\"url\\\\\\\": \\\\\\\"http://jeecg.com\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"个人\\\\\\\",        \\\\\\\"value\\\\\\\": 110,        \\\\\\\"url\\\\\\\": \\\\\\\"http://jeecg.com\\\\\\\"    }]\\\",\\\"size\\\":{\\\"width\\\":426,\\\"height\\\":267},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"customOption\\\":\\\"\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\",\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"pieLabelPosition\\\":\\\"outside\\\",\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":false,\\\"text\\\":\\\"基础饼图\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#B9B8CE\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#1D1F26\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328550076416', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"▲ 外部监督线索统计\\\",\\\"size\\\":{\\\"width\\\":195.00000000000014,\\\"height\\\":50.99999999999994},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#3B9EEB\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328587825152', NULL, '1011871598899679232', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"个体\\\\\\\",    \\\\\\\"value\\\\\\\": 160,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"内资\\\\\\\",    \\\\\\\"value\\\\\\\": 130,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"外资\\\\\\\",    \\\\\\\"value\\\\\\\": 190,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":407,\\\"height\\\":360},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":31,\\\"left\\\":8,\\\"bottom\\\":71,\\\"show\\\":false,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#FAD400\\\",\\\"borderRadius\\\":0},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true,\\\"fontSize\\\":14},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328608796672', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"▲ 债务风险统计\\\",\\\"size\\\":{\\\"width\\\":151.00000000000003,\\\"height\\\":49.000000000000014},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#3B9EEB\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328629768192', NULL, '1011871598899679232', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"带息负债\\\\\\\",    \\\\\\\"value\\\\\\\": 1400,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"现金流负债\\\\\\\",    \\\\\\\"value\\\\\\\": 2100,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"速动比率\\\\\\\",    \\\\\\\"value\\\\\\\": 1300,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"流动比率\\\\\\\",    \\\\\\\"value\\\\\\\": 1660,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"资产负债率\\\\\\\",    \\\\\\\"value\\\\\\\": 1300,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":517,\\\"height\\\":267.8129496402878},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#00CED1\\\"},\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#00CED1\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#00CED1\\\"}},\\\"grid\\\":{\\\"top\\\":29,\\\"left\\\":1,\\\"bottom\\\":27,\\\"show\\\":false,\\\"right\\\":8,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":20,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#00CED1\\\",\\\"borderRadius\\\":9},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328667516928', NULL, '1011871598899679232', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"巡查发现\\\\\\\",    \\\\\\\"value\\\\\\\": 160,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"审计发现\\\\\\\",    \\\\\\\"value\\\\\\\": 520,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"其他部门移送\\\\\\\",    \\\\\\\"value\\\\\\\": 190,    \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":434.00000000000006,\\\"height\\\":246.99999999999994},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2},\\\"show\\\":false},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#1E90FF\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":14,\\\"left\\\":1,\\\"bottom\\\":29,\\\"show\\\":false,\\\"right\\\":10,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#90EE90\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328684294144', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"▲ 内部监督线索统计\\\",\\\"size\\\":{\\\"width\\\":203.99999999999983,\\\"height\\\":59.99999999999996},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#3B9EEB\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328701071360', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"▲ 投资分析\\\",\\\"size\\\":{\\\"width\\\":145.9999999999999,\\\"height\\\":72.99999999999997},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#3B9EEB\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328738820096', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":44,\\\"height\\\":42},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/图1_1657782884131.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328755597312', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":45.999999999999986,\\\"height\\\":44.00000000000005},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/图2_1657782869186.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328768180224', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":37,\\\"height\\\":35},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":26,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/图3_1657782854545.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328801734656', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"新增投资(258)\\\",\\\"size\\\":{\\\"width\\\":133,\\\"height\\\":50},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328818511872', NULL, '1011871598899679232', NULL, 'JLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 50,    \\\\\\\"name\\\\\\\": \\\\\\\"个体\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 130,    \\\\\\\"name\\\\\\\": \\\\\\\"外资\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 60,    \\\\\\\"name\\\\\\\": \\\\\\\"内资\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 160,    \\\\\\\"name\\\\\\\": \\\\\\\"个人\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 90,    \\\\\\\"name\\\\\\\": \\\\\\\"企业\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 100,    \\\\\\\"name\\\\\\\": \\\\\\\"工商\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":425,\\\"height\\\":204},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#00FF00\\\"}],\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#00FF00\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#00FF00\\\"},\\\"show\\\":true},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#00FF00\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#00FF00\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"show\\\":true},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":21,\\\"left\\\":31,\\\"bottom\\\":48,\\\"show\\\":false,\\\"right\\\":1},\\\"series\\\":[{\\\"data\\\":[],\\\"lineType\\\":\\\"line\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"type\\\":\\\"line\\\"}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":10,\\\"show\\\":false,\\\"text\\\":\\\"基础折线图\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#1D1F26\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328835289088', NULL, '1011871598899679232', NULL, 'JLiquid', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 40  }]\\\",\\\"size\\\":{\\\"width\\\":209,\\\"height\\\":126},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":30,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"borderColor\\\":\\\"#FFD700\\\",\\\"color\\\":\\\"#FFD700\\\",\\\"distance\\\":2,\\\"borderWidth\\\":2,\\\"liquidType\\\":\\\"circle\\\",\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"水波图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"textColor\\\":\\\"#FFD700\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"strokeOpacity\\\":0}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328864649216', NULL, '1011871598899679232', NULL, 'JRose', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"外资\\\\\\\",    \\\\\\\"value\\\\\\\": 130,    \\\\\\\"url\\\\\\\": \\\\\\\"http://www.baidu.com\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"内资\\\\\\\",    \\\\\\\"value\\\\\\\": 230,    \\\\\\\"url\\\\\\\": \\\\\\\"http://www.baidu.com\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"个体工商户\\\\\\\",    \\\\\\\"value\\\\\\\": 140,    \\\\\\\"url\\\\\\\": \\\\\\\"http://www.baidu.com\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":397,\\\"height\\\":206},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":30,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\",\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"roseType\\\":\\\"radius\\\",\\\"name\\\":\\\"南丁格尔玫瑰\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"},\\\"label\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":false,\\\"text\\\":\\\"基础饼图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#B9B8CE\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#1D1F26\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328885620736', NULL, '1011871598899679232', NULL, 'JLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 50,    \\\\\\\"name\\\\\\\": \\\\\\\"个体\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 130,    \\\\\\\"name\\\\\\\": \\\\\\\"外资\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 60,    \\\\\\\"name\\\\\\\": \\\\\\\"内资\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 160,    \\\\\\\"name\\\\\\\": \\\\\\\"个人\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 90,    \\\\\\\"name\\\\\\\": \\\\\\\"企业\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 100,    \\\\\\\"name\\\\\\\": \\\\\\\"工商\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":425.9496402877698,\\\"height\\\":241.4748201438849},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":16,\\\"left\\\":31,\\\"bottom\\\":54,\\\"show\\\":false,\\\"right\\\":1},\\\"series\\\":[{\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"type\\\":\\\"line\\\"}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":10,\\\"show\\\":false,\\\"text\\\":\\\"基础折线图\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328906592256', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"▲ 技术与科研队伍统计\\\",\\\"size\\\":{\\\"width\\\":252,\\\"height\\\":42.94964028776978},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#3B9EEB\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328935952384', NULL, '1011871598899679232', NULL, 'JDragBorder', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":365,\\\"height\\\":334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":12,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328956923904', NULL, '1011871598899679232', NULL, 'JDragBorder', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":370,\\\"height\\\":551.2877697841726},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":12,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328969506816', NULL, '1011871598899679232', NULL, 'JDragBorder', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":526.0503597122303,\\\"height\\\":248},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":12,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816328986284032', NULL, '1011871598899679232', NULL, 'JDragBorder', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":449,\\\"height\\\":277.61870503597123},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":12,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329019838464', NULL, '1011871598899679232', NULL, 'JLiquid', '{\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":25}]\\\",\\\"size\\\":{\\\"width\\\":181.00000000000006,\\\"height\\\":136.99999999999997},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":6,\\\"dataType\\\":1,\\\"h\\\":30,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"textFontSize\\\":30,\\\"borderColor\\\":\\\"#1E90FF\\\",\\\"color\\\":\\\"#B0515C\\\",\\\"distance\\\":1,\\\"borderWidth\\\":2,\\\"liquidType\\\":\\\"circle\\\",\\\"count\\\":4,\\\"length\\\":128,\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"水波图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"textColor\\\":\\\"#FFFFFF\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"strokeOpacity\\\":0}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329036615680', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"▲ 资产质量统计\\\",\\\"size\\\":{\\\"width\\\":194,\\\"height\\\":31.0000000000001},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#3B9EEB\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329057587200', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"▲ 告警统计\\\",\\\"size\\\":{\\\"width\\\":159,\\\"height\\\":52.00000000000011},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#3B9EEB\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329095335936', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"已处理：3\\\",\\\"size\\\":{\\\"width\\\":133,\\\"height\\\":31.999999999999886},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#3B9EEB\\\",\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329112113152', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"告警信息\\\",\\\"size\\\":{\\\"width\\\":125.00000000000003,\\\"height\\\":43.00000000000007},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#F8E71C00\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#F8E71C\\\",\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329149861888', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"优化审批类\\\",\\\"size\\\":{\\\"width\\\":112.99999999999983,\\\"height\\\":75.00000000000009},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#7ED32100\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#B0515C\\\",\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329166639104', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"未处理：1\\\",\\\"size\\\":{\\\"width\\\":103.00000000000003,\\\"height\\\":58.99999999999993},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#3B9EEB\\\",\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329187610624', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"未处理：2\\\",\\\"size\\\":{\\\"width\\\":101,\\\"height\\\":55.999999999999915},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#3B9EEB\\\",\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329221165056', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"▲ 企业布局结构统计\\\",\\\"size\\\":{\\\"width\\\":187,\\\"height\\\":44.99999999999998},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#3B9EEB\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329246330880', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"▲ 人员统计\\\",\\\"size\\\":{\\\"width\\\":117.00000000000001,\\\"height\\\":48.999999999999886},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#3B9EEB\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329263108096', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"▲ 经营投资损失情况统计\\\",\\\"size\\\":{\\\"width\\\":231.9999999999999,\\\"height\\\":36.00000000000006},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#3B9EEB\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329292468224', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"暂缓投资(28)\\\",\\\"size\\\":{\\\"width\\\":133,\\\"height\\\":50},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329309245440', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"取消投资(25)\\\",\\\"size\\\":{\\\"width\\\":133,\\\"height\\\":50},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329330216960', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"新兴税务科创园项目\\\",\\\"size\\\":{\\\"width\\\":156,\\\"height\\\":50},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329363771392', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"智慧推广项目\\\",\\\"size\\\":{\\\"width\\\":133,\\\"height\\\":50},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329376354304', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"税务系统改造\\\",\\\"size\\\":{\\\"width\\\":133,\\\"height\\\":50},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329397325824', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"取消投资(25)\\\",\\\"size\\\":{\\\"width\\\":133,\\\"height\\\":50},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329430880256', NULL, '1011871598899679232', NULL, 'JDragBorder', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":459.8561151079137,\\\"height\\\":258},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":12,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329451851776', NULL, '1011871598899679232', NULL, 'JMultipleBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"个体\\\\\\\",    \\\\\\\"value\\\\\\\": 230,    \\\\\\\"type\\\\\\\": \\\\\\\"个体\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"外资\\\\\\\",    \\\\\\\"value\\\\\\\": 656,    \\\\\\\"type\\\\\\\": \\\\\\\"个体\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"内资\\\\\\\",    \\\\\\\"value\\\\\\\": 544,    \\\\\\\"type\\\\\\\": \\\\\\\"个体\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"个体\\\\\\\",    \\\\\\\"value\\\\\\\": 110,    \\\\\\\"type\\\\\\\": \\\\\\\"外资\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"外资\\\\\\\",    \\\\\\\"value\\\\\\\": 320,    \\\\\\\"type\\\\\\\": \\\\\\\"外资\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"内资\\\\\\\",    \\\\\\\"value\\\\\\\": 160,    \\\\\\\"type\\\\\\\": \\\\\\\"外资\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"个体\\\\\\\",    \\\\\\\"value\\\\\\\": 230,    \\\\\\\"type\\\\\\\": \\\\\\\"内资\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"外资\\\\\\\",    \\\\\\\"value\\\\\\\": 160,    \\\\\\\"type\\\\\\\": \\\\\\\"内资\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"内资\\\\\\\",    \\\\\\\"value\\\\\\\": 213,    \\\\\\\"type\\\\\\\": \\\\\\\"内资\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":422,\\\"height\\\":216},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"}},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":5,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":15,\\\"itemStyle\\\":{\\\"borderRadius\\\":22}}],\\\"legend\\\":{\\\"r\\\":20},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329468628992', NULL, '1011871598899679232', NULL, 'JLiquid', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 40  }]\\\",\\\"size\\\":{\\\"width\\\":239,\\\"height\\\":159},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"textFontSize\\\":30,\\\"borderColor\\\":\\\"#1E90FF\\\",\\\"color\\\":\\\"#F8E71C\\\",\\\"distance\\\":1,\\\"borderWidth\\\":2,\\\"liquidType\\\":\\\"circle\\\",\\\"count\\\":4,\\\"length\\\":128,\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"textColor\\\":\\\"#F8E71C\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"strokeOpacity\\\":0}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329497989120', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"损失事项\\\",\\\"size\\\":{\\\"width\\\":133,\\\"height\\\":50},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329514766336', NULL, '1011871598899679232', NULL, 'JLiquid', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 40  }]\\\",\\\"size\\\":{\\\"width\\\":239,\\\"height\\\":159},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"textFontSize\\\":30,\\\"borderColor\\\":\\\"#1E90FF\\\",\\\"color\\\":\\\"#F8E71C\\\",\\\"distance\\\":1,\\\"borderWidth\\\":2,\\\"liquidType\\\":\\\"circle\\\",\\\"count\\\":4,\\\"length\\\":128,\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"textColor\\\":\\\"#F8E71C\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"strokeOpacity\\\":0}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329539932160', NULL, '1011871598899679232', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":30,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"挽回损失金\\\",\\\"size\\\":{\\\"width\\\":133,\\\"height\\\":50},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#4A90E200\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329569292288', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":372,\\\"height\\\":563.0503597122303},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/底1_1657188264377.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329594458112', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":370,\\\"height\\\":342.8561151079137},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/底1_1657188264377.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329615429632', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":530,\\\"height\\\":246.80575539568346},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/底1_1657188264377.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329640595456', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":529,\\\"height\\\":289.52517985611513},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/底1_1657188264377.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329665761280', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":525,\\\"height\\\":330.61870503597123},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/底1_1657188264377.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329682538496', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":456,\\\"height\\\":284.1438848920863},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/底1_1657188264377.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329711898624', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":459,\\\"height\\\":247.71223021582733},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/底1_1657188264377.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329732870144', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":450.23741007194246,\\\"height\\\":330},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/底1_1657188264377.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329758035968', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":457,\\\"height\\\":285.9064748201439},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/底1_1657188264377.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329783201792', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":462.38129496402877,\\\"height\\\":262},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/底1_1657188264377.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1023816329799979008', NULL, '1011871598899679232', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":464,\\\"height\\\":323.568345323741},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/底1_1657188264377.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2024-12-03 14:47:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497512935424', NULL, '1024608522634579968', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1915.5539568345323,\\\"height\\\":114},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgos.oss-cn-beijing.aliyuncs.com/upload/test/3f7cc309ef224a4c868e6a59ab2c5043.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497538101248', NULL, '1024608522634579968', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{  \\\\\\\"value\\\\\\\": \\\\\\\"大数据可视化展示平台\\\\\\\"}\\\",\\\"size\\\":{\\\"width\\\":541.1654676258993,\\\"height\\\":60},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":5,\\\"fontSize\\\":42,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"openType\\\":\\\"_blank\\\"}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497550684160', NULL, '1024608522634579968', NULL, 'JCurrentTime', '{\\\"chartData\\\":\\\"\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":323.8705035971223,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":270,\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"showWeek\\\":\\\"show\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497567461376', NULL, '1024608522634579968', NULL, 'JGroup', '{\\\"size\\\":{}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497580044288', NULL, '1024608522634579968', NULL, 'JGroup', '{\\\"size\\\":{},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497592627200', NULL, '1024608522634579968', NULL, 'JText', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{  \\\\\\\"value\\\\\\\": \\\\\\\"1000\\\\\\\"}\\\",\\\"size\\\":{\\\"width\\\":69,\\\"height\\\":44.805755395683455},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"openType\\\":\\\"_blank\\\"}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497605210112', NULL, '1024608522634579968', NULL, 'JText', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{  \\\\\\\"value\\\\\\\": \\\\\\\"2000\\\\\\\"}\\\",\\\"size\\\":{\\\"width\\\":69,\\\"height\\\":44.805755395683455},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"openType\\\":\\\"_blank\\\"}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497613598720', NULL, '1024608522634579968', NULL, 'JRingProgress', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"数量结算率\\\\\\\",    \\\\\\\"value\\\\\\\": 60  }]\\\",\\\"size\\\":{\\\"width\\\":214.35971223021585,\\\"height\\\":164.0863309352518},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"color\\\":\\\"#49BCF7\\\",\\\"bgColor\\\":\\\"#E8EDF3\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":0,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"fontColor\\\":\\\"#FFFFFF\\\"}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497626181632', NULL, '1024608522634579968', NULL, 'JRingProgress', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"数量结算\\\\\\\",    \\\\\\\"value\\\\\\\": 54  }]\\\",\\\"size\\\":{\\\"width\\\":214.35971223021585,\\\"height\\\":164.0863309352518},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"color\\\":\\\"#49BCF7\\\",\\\"bgColor\\\":\\\"#E8EDF3\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":0,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"fontColor\\\":\\\"#FFFFFF\\\"}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497647153152', NULL, '1024608522634579968', NULL, 'JRingProgress', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"金额结算率\\\\\\\",    \\\\\\\"value\\\\\\\": 40  }]\\\",\\\"size\\\":{\\\"width\\\":214.35971223021585,\\\"height\\\":164.0863309352518},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"color\\\":\\\"#62C98D\\\",\\\"bgColor\\\":\\\"#E8EDF3\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":0,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"fontColor\\\":\\\"#FFFFFF\\\"}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497659736064', NULL, '1024608522634579968', NULL, 'JRingProgress', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"金额量结算率\\\\\\\",    \\\\\\\"value\\\\\\\": 45  }]\\\",\\\"size\\\":{\\\"width\\\":214.35971223021585,\\\"height\\\":164.0863309352518},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"color\\\":\\\"#62C98D\\\",\\\"bgColor\\\":\\\"#E8EDF3\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":0,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"fontColor\\\":\\\"#FFFFFF\\\"}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497668124672', NULL, '1024608522634579968', NULL, 'JMultipleBar', '{\\\"chartData\\\":\\\"{\\\\\\\"categories\\\\\\\":[\\\\\\\"1月\\\\\\\",\\\\\\\"2月\\\\\\\",\\\\\\\"3月\\\\\\\",\\\\\\\"4月\\\\\\\",\\\\\\\"5月\\\\\\\",\\\\\\\"6月\\\\\\\",\\\\\\\"7月\\\\\\\",\\\\\\\"8月\\\\\\\",\\\\\\\"9月\\\\\\\",\\\\\\\"10月\\\\\\\",\\\\\\\"11月\\\\\\\",\\\\\\\"12月\\\\\\\"],\\\\\\\"series\\\\\\\":[{\\\\\\\"name\\\\\\\":\\\\\\\"2017年\\\\\\\",\\\\\\\"data\\\\\\\":[2,3,3,9,15,12,6,4,6,7,4,10]},{\\\\\\\"name\\\\\\\":\\\\\\\"2018年\\\\\\\",\\\\\\\"data\\\\\\\":[1,4,5,11,12,9,5,6,5,6,3,9]}]}\\\",\\\"size\\\":{\\\"width\\\":886.4892086330935,\\\"height\\\":464.37410071942446},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"show\\\":false,\\\"interval\\\":2}},\\\"customColor\\\":[{\\\"color\\\":\\\"#49BCF7\\\"},{\\\"color\\\":\\\"#62C98D\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":15,\\\"itemStyle\\\":{\\\"borderRadius\\\":6}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497676513280', NULL, '1024608522634579968', NULL, 'JGroup', '{\\\"size\\\":{}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497689096192', NULL, '1024608522634579968', NULL, 'JGroup', '{\\\"size\\\":{},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497701679104', NULL, '1024608522634579968', NULL, 'JGroup', '{\\\"size\\\":{}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497718456320', NULL, '1024608522634579968', NULL, 'JGroup', '{\\\"size\\\":{\\\"width\\\":110.66900854316543,\\\"height\\\":41.99999999999997},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497726844928', NULL, '1024608522634579968', NULL, 'JGroup', '{\\\"size\\\":{},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497739427840', NULL, '1024608522634579968', NULL, 'JGroup', '{\\\"size\\\":{\\\"width\\\":142.4387927158273,\\\"height\\\":41.99999999999997},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497747816448', NULL, '1024608522634579968', NULL, 'JLine', '{\\\"chartData\\\":\\\"{\\\\\\\"categories\\\\\\\":[\\\\\\\"1月\\\\\\\",\\\\\\\"2月\\\\\\\",\\\\\\\"3月\\\\\\\",\\\\\\\"4月\\\\\\\",\\\\\\\"5月\\\\\\\",\\\\\\\"6月\\\\\\\",\\\\\\\"7月\\\\\\\",\\\\\\\"8月\\\\\\\",\\\\\\\"9月\\\\\\\",\\\\\\\"10月\\\\\\\",\\\\\\\"11月\\\\\\\",\\\\\\\"12月\\\\\\\"],\\\\\\\"series\\\\\\\":[{\\\\\\\"name\\\\\\\":\\\\\\\"结算率\\\\\\\",\\\\\\\"data\\\\\\\":[3,4,3,4,3,4,3,6,2,4,2,4]}]}\\\",\\\"size\\\":{\\\"width\\\":889.2517985611512,\\\"height\\\":352.48920863309354},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"show\\\":false,\\\"interval\\\":2}},\\\"customColor\\\":[{\\\"color\\\":\\\"#62C98D\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":0,\\\"bottom\\\":18,\\\"show\\\":false,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"symbol\\\":\\\"circle\\\",\\\"data\\\":[],\\\"symbolSize\\\":6,\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"type\\\":\\\"line\\\",\\\"lineWidth\\\":2}],\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":10,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497760399360', NULL, '1024608522634579968', NULL, 'JScrollBoard', '{\\\"chartData\\\":\\\"[[\\\\\\\"行1列1\\\\\\\",\\\\\\\"行1列2\\\\\\\",\\\\\\\"行1列3\\\\\\\"],[\\\\\\\"行2列1\\\\\\\",\\\\\\\"行2列2\\\\\\\",\\\\\\\"行2列3\\\\\\\"],[\\\\\\\"行3列1\\\\\\\",\\\\\\\"行3列2\\\\\\\",\\\\\\\"行3列3\\\\\\\"],[\\\\\\\"行4列1\\\\\\\",\\\\\\\"行4列2\\\\\\\",\\\\\\\"行4列3\\\\\\\"],[\\\\\\\"行5列1\\\\\\\",\\\\\\\"行5列2\\\\\\\",\\\\\\\"行5列3\\\\\\\"]]\\\",\\\"size\\\":{\\\"width\\\":450,\\\"height\\\":359.39568345323744},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"oddRowBGC\\\":\\\"#003B5100\\\",\\\"headShow\\\":true,\\\"hoverPause\\\":true,\\\"indexWidth\\\":80,\\\"index\\\":true,\\\"carousel\\\":\\\"single\\\",\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"evenRowBGC\\\":\\\"#0A273200\\\",\\\"header\\\":[{\\\"width\\\":100,\\\"label\\\":\\\"列1\\\",\\\"key\\\":\\\"\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"列2\\\",\\\"key\\\":\\\"\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"列3\\\",\\\"key\\\":\\\"\\\"}],\\\"headerBGC\\\":\\\"#00BAFF\\\",\\\"headerHeight\\\":40,\\\"waitTime\\\":2000,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497777176576', NULL, '1024608522634579968', NULL, 'JPie', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":10,\\\\\\\"name\\\\\\\":\\\\\\\"图例1\\\\\\\"},{\\\\\\\"value\\\\\\\":15,\\\\\\\"name\\\\\\\":\\\\\\\"图例2\\\\\\\"},{\\\\\\\"value\\\\\\\":25,\\\\\\\"name\\\\\\\":\\\\\\\"图例3\\\\\\\"},{\\\\\\\"value\\\\\\\":30,\\\\\\\"name\\\\\\\":\\\\\\\"图例4\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":470.71942446043164,\\\"height\\\":300},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"isRose\\\":true,\\\"customColor\\\":[{\\\"color\\\":\\\"#62C98D\\\"},{\\\"color\\\":\\\"#2F89CF\\\"},{\\\"color\\\":\\\"#4CB9CF\\\"},{\\\"color\\\":\\\"#53B666\\\"}],\\\"grid\\\":{\\\"top\\\":53,\\\"left\\\":43,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\",\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497789759488', NULL, '1024608522634579968', NULL, 'JRose', '{\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":50,\\\\\\\"name\\\\\\\":\\\\\\\"图例1\\\\\\\"},{\\\\\\\"value\\\\\\\":45,\\\\\\\"name\\\\\\\":\\\\\\\"图例2\\\\\\\"},{\\\\\\\"value\\\\\\\":35,\\\\\\\"name\\\\\\\":\\\\\\\"图例3\\\\\\\"},{\\\\\\\"value\\\\\\\":30,\\\\\\\"name\\\\\\\":\\\\\\\"图例4\\\\\\\"}]\\\",\\\"size\\\":{\\\"height\\\":300},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#62C98D\\\"},{\\\"color\\\":\\\"#205ACF\\\"},{\\\"color\\\":\\\"#C9C862\\\"},{\\\"color\\\":\\\"#C98B62\\\"}],\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":43,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"roseType\\\":\\\"radius\\\",\\\"name\\\":\\\"南丁格尔玫瑰\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497802342400', NULL, '1024608522634579968', NULL, 'JMultipleLine', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\\\\"categories\\\\\\\":[\\\\\\\"1月\\\\\\\",\\\\\\\"2月\\\\\\\",\\\\\\\"3月\\\\\\\",\\\\\\\"4月\\\\\\\",\\\\\\\"5月\\\\\\\",\\\\\\\"6月\\\\\\\",\\\\\\\"7月\\\\\\\",\\\\\\\"8月\\\\\\\",\\\\\\\"9月\\\\\\\",\\\\\\\"10月\\\\\\\",\\\\\\\"11月\\\\\\\",\\\\\\\"12月\\\\\\\"],\\\\\\\"series\\\\\\\":[{\\\\\\\"name\\\\\\\":\\\\\\\"2017年\\\\\\\",\\\\\\\"data\\\\\\\":[2,6,3,8,5,8,10,13,8,5,6,9]},{\\\\\\\"name\\\\\\\":\\\\\\\"2018年\\\\\\\",\\\\\\\"data\\\\\\\":[5,2,6,4,5,12,5,17,9,2,6,3]}]}\\\",\\\"size\\\":{\\\"width\\\":495,\\\"height\\\":259.9424460431655},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#83BFF6\\\"},{\\\"color\\\":\\\"#23B7E5\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"lineType\\\":\\\"smooth\\\",\\\"lineWidth\\\":2}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497810731008', NULL, '1024608522634579968', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":503,\\\"height\\\":312.9496402877698},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgos.oss-cn-beijing.aliyuncs.com/upload/test/3c7e6df32baa40fb8377bdd1d8aa8269.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497827508224', NULL, '1024608522634579968', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":505,\\\"height\\\":326.0431654676259},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgos.oss-cn-beijing.aliyuncs.com/upload/test/3c7e6df32baa40fb8377bdd1d8aa8269.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497840091136', NULL, '1024608522634579968', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":505,\\\"height\\\":294.23741007194246},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgos.oss-cn-beijing.aliyuncs.com/upload/test/3c7e6df32baa40fb8377bdd1d8aa8269.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497852674048', NULL, '1024608522634579968', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":915.4964028776978,\\\"height\\\":423},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgos.oss-cn-beijing.aliyuncs.com/upload/test/3c7e6df32baa40fb8377bdd1d8aa8269.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497861062656', NULL, '1024608522634579968', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":450,\\\"height\\\":429.9712230215828},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgos.oss-cn-beijing.aliyuncs.com/upload/test/3c7e6df32baa40fb8377bdd1d8aa8269.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497869451264', NULL, '1024608522634579968', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":450,\\\"height\\\":509.9568345323741},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgos.oss-cn-beijing.aliyuncs.com/upload/test/3c7e6df32baa40fb8377bdd1d8aa8269.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060062497877839872', NULL, '1024608522634579968', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":915,\\\"height\\\":514.6666666666666},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgos.oss-cn-beijing.aliyuncs.com/upload/test/3c7e6df32baa40fb8377bdd1d8aa8269.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2025-03-13 15:16:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060097027263221760', NULL, '1060068114432577536', NULL, 'JText', '{\\\"chartData\\\":\\\"23年医美行业网络关注度\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1604,\\\"height\\\":78},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#23BAD9\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 17:33:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060097027275804672', NULL, '1060068114432577536', NULL, 'JText', '{\\\"chartData\\\":\\\"公立整形外科热度指数TOP10美誉度\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":56},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 17:33:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060097027288387584', NULL, '1060068114432577536', NULL, 'JText', '{\\\"chartData\\\":\\\"敏感信息与非敏感信息占比\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":56},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 17:33:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060097027300970496', NULL, '1060068114432577536', NULL, 'JText', '{\\\"chartData\\\":\\\"医美行业事件\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":56},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 17:33:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060097027309359104', NULL, '1060068114432577536', NULL, 'JText', '{\\\"chartData\\\":\\\"非公立连锁医美机构热度指数TOP10\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":8},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 17:33:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060097027321942016', NULL, '1060068114432577536', NULL, 'JText', '{\\\"chartData\\\":\\\"医美行业全网信息量走势\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 17:33:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060097027334524928', NULL, '1060068114432577536', NULL, 'JText', '{\\\"chartData\\\":\\\"医美项目热度\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"title\\\":{\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 17:33:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060097027347107840', NULL, '1060068114432577536', NULL, 'JSmoothLine', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 15,    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 6,    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 19,    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":320},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":33,\\\"left\\\":23,\\\"bottom\\\":77,\\\"show\\\":false,\\\"right\\\":1},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\",\\\"smooth\\\":true}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"top\\\":1,\\\"left\\\":1,\\\"show\\\":false,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 17:33:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060097027359690752', NULL, '1060068114432577536', NULL, 'JText', '{\\\"chartData\\\":\\\"公立整形外科热度指数TOP10\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 17:33:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060097027372273664', NULL, '1060068114432577536', NULL, 'JMultipleBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"19岁以下\\\\\\\",    \\\\\\\"value\\\\\\\": 150,    \\\\\\\"type\\\\\\\": \\\\\\\"光子嫩肤\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"20-29岁\\\\\\\",    \\\\\\\"value\\\\\\\": 269,    \\\\\\\"type\\\\\\\": \\\\\\\"光子嫩肤\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"30-39岁\\\\\\\",    \\\\\\\"value\\\\\\\": 81,    \\\\\\\"type\\\\\\\": \\\\\\\"光子嫩肤\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"39岁以上\\\\\\\",    \\\\\\\"value\\\\\\\": 67,    \\\\\\\"type\\\\\\\": \\\\\\\"光子嫩肤\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"19岁以下\\\\\\\",    \\\\\\\"value\\\\\\\": 50,    \\\\\\\"type\\\\\\\": \\\\\\\"热玛吉\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"20-29岁\\\\\\\",    \\\\\\\"value\\\\\\\": 100,    \\\\\\\"type\\\\\\\": \\\\\\\"热玛吉\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"30-39岁\\\\\\\",    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"type\\\\\\\": \\\\\\\"热玛吉\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"39岁以上\\\\\\\",    \\\\\\\"value\\\\\\\": 45,    \\\\\\\"type\\\\\\\": \\\\\\\"热玛吉\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"19岁以下\\\\\\\",    \\\\\\\"value\\\\\\\": 13,    \\\\\\\"type\\\\\\\": \\\\\\\"水光针\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"20-29岁\\\\\\\",    \\\\\\\"value\\\\\\\": 24,    \\\\\\\"type\\\\\\\": \\\\\\\"水光针\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"30-39岁\\\\\\\",    \\\\\\\"value\\\\\\\": 5,    \\\\\\\"type\\\\\\\": \\\\\\\"水光针\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"39岁以上\\\\\\\",    \\\\\\\"value\\\\\\\": 25,    \\\\\\\"type\\\\\\\": \\\\\\\"水光针\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":320},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":29,\\\"left\\\":31,\\\"bottom\\\":62,\\\"right\\\":8},\\\"series\\\":[{\\\"label\\\":{\\\"color\\\":\\\"#787575\\\"}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"多数据对比柱形图\\\",\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 17:33:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060097027380662272', NULL, '1060068114432577536', NULL, 'JText', '{\\\"chartData\\\":\\\"医美行业热点事件TOP50分类\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"bodyColor\\\":\\\"#000000\\\",\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 17:33:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060097027389050880', NULL, '1060068114432577536', NULL, 'JText', '{\\\"chartData\\\":\\\"各年龄段对医美项目TOP3关注度对比\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 17:33:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060097027401633792', NULL, '1060068114432577536', NULL, 'JMixLineBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"华美美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度指数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"美莱美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 9,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度指数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"爱美美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 5,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度指数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"一星美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 9,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度指数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"慧美美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 2,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度指数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"华美美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 33,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"美莱美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 35,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"爱美美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 37,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"一星美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 35,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"慧美美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 34.9,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":320},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"seriesType\\\":[{\\\"series\\\":\\\"传播热度指数\\\",\\\"type\\\":\\\"bar\\\"},{\\\"series\\\":\\\"美誉度\\\",\\\"type\\\":\\\"line\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":-33,\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":47,\\\"left\\\":24,\\\"bottom\\\":88,\\\"right\\\":27},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"折柱图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 17:33:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060097027414216704', NULL, '1060068114432577536', NULL, 'JDynamicBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"江苏人民医院\\\\\\\",    \\\\\\\"value\\\\\\\": 55,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"上海人民医院\\\\\\\",    \\\\\\\"value\\\\\\\": 14,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京大学第一医院\\\\\\\",    \\\\\\\"value\\\\\\\": 31.5,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京朝阳医院\\\\\\\",    \\\\\\\"value\\\\\\\": 53,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京协和医院\\\\\\\",    \\\\\\\"value\\\\\\\": 41.9,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"八大处医院\\\\\\\",    \\\\\\\"value\\\\\\\": 61,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":320},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":109,\\\"bottom\\\":67,\\\"right\\\":24},\\\"series\\\":[{\\\"barWidth\\\":17,\\\"itemStyle\\\":{\\\"color\\\":\\\"#F099E1EE\\\"},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\"}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"动态柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 17:33:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060097027430993920', NULL, '1060068114432577536', NULL, 'JDynamicBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"江苏人民医院\\\\\\\",    \\\\\\\"value\\\\\\\": 88,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"上海人民医院\\\\\\\",    \\\\\\\"value\\\\\\\": 76,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京大学第一医院\\\\\\\",    \\\\\\\"value\\\\\\\": 92,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京朝阳医院\\\\\\\",    \\\\\\\"value\\\\\\\": 53,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京协和医院\\\\\\\",    \\\\\\\"value\\\\\\\": 90,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"八大处医院\\\\\\\",    \\\\\\\"value\\\\\\\": 98.7,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":309},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":19,\\\"left\\\":113,\\\"bottom\\\":60,\\\"right\\\":31},\\\"series\\\":[{\\\"barWidth\\\":18,\\\"itemStyle\\\":{\\\"color\\\":\\\"#50E3C2\\\"}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"动态柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 17:33:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060097027443576832', NULL, '1060068114432577536', NULL, 'JRing', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 46,    \\\\\\\"name\\\\\\\": \\\\\\\"涉机构事件\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 54,    \\\\\\\"name\\\\\\\": \\\\\\\"涉行业事件\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":508,\\\"height\\\":243},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#F099E1EE\\\"},{\\\"color\\\":\\\"#23BAD9\\\"}],\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":49,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\"},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":true,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"r\\\":26},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"outRadius\\\":61,\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础环形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"innerRadius\\\":29,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 17:33:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060097027451965440', NULL, '1060068114432577536', NULL, 'JCommonTable', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"医美行业热点事件\\\\\\\": \\\\\\\"FDA批准新一代A型肉毒素上市\\\\\\\",    \\\\\\\"传播热度指数\\\\\\\": 6.25  },  {    \\\\\\\"医美行业热点事件\\\\\\\": \\\\\\\"多地医保局发布口腔种植收费调查登记的通知\\\\\\\",    \\\\\\\"传播热度指数\\\\\\\": 5.3  },  {    \\\\\\\"医美行业热点事件\\\\\\\": \\\\\\\"种植牙服务价格下调\\\\\\\",    \\\\\\\"传播热度指数\\\\\\\": 4  },  {    \\\\\\\"医美行业热点事件\\\\\\\": \\\\\\\"消保委2023年受理消费者投诉41万余件 涉及医美等多个方面\\\\\\\",    \\\\\\\"传播热度指数\\\\\\\": 7.23  },  {    \\\\\\\"医美行业热点事件\\\\\\\": \\\\\\\"轻医美-收费不透明\\\\\\\",    \\\\\\\"传播热度指数\\\\\\\": 3.6  },  {    \\\\\\\"医美行业热点事件\\\\\\\": \\\\\\\"专家提醒:低价医美有风险\\\\\\\",    \\\\\\\"传播热度指数\\\\\\\": 2  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":309},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":24,\\\"dataType\\\":1,\\\"h\\\":42,\\\"linkageConfig\\\":[],\\\"timeOut\\\":-1,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#C1EEF7\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}}}}', 'admin', '2025-03-13 17:33:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060097027460354048', NULL, '1060068114432577536', NULL, 'JRing', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 4.61,    \\\\\\\"name\\\\\\\": \\\\\\\"敏感\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 95.39,    \\\\\\\"name\\\\\\\": \\\\\\\"非敏感\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":309},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#F099E1EE\\\"},{\\\"color\\\":\\\"#6AD5EB\\\"}],\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":50,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\"},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":true,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"r\\\":1,\\\"t\\\":1},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"outRadius\\\":78,\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础环形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"innerRadius\\\":49,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 17:33:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060097027472936960', NULL, '1060068114432577536', NULL, 'JFunnel', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 15,    \\\\\\\"name\\\\\\\": \\\\\\\"美白针\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 5,    \\\\\\\"name\\\\\\\": \\\\\\\"光子嫩肤\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 23,    \\\\\\\"name\\\\\\\": \\\\\\\"半永久纹眉\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"name\\\\\\\": \\\\\\\"果酸换肤\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 234,    \\\\\\\"name\\\\\\\": \\\\\\\"全瓷牙\\\\\\\"  }]\\\",\\\"size\\\":{\\\"height\\\":300},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":30,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/funnel\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"horizontal\\\",\\\"t\\\":1},\\\"series\\\":[{\\\"top\\\":\\\"22%\\\",\\\"left\\\":\\\"10%\\\",\\\"bottom\\\":\\\"9%\\\",\\\"gap\\\":2,\\\"name\\\":\\\"Funnel\\\",\\\"width\\\":\\\"80%\\\",\\\"emphasis\\\":{\\\"label\\\":{\\\"fontSize\\\":20}},\\\"itemStyle\\\":{\\\"borderColor\\\":\\\"#fff\\\",\\\"borderWidth\\\":1},\\\"sort\\\":\\\"descending\\\",\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"inside\\\"},\\\"labelLine\\\":{\\\"lineStyle\\\":{\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"length\\\":10},\\\"type\\\":\\\"funnel\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a} <br/>{b} : {c}%\\\",\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础漏斗图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 17:33:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060115766792736768', NULL, '1060100061204631552', NULL, 'JForm', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[{\\\"defaultVal\\\":\\\"1\\\",\\\"label\\\":\\\"sex\\\",\\\"text\\\":\\\"sex\\\",\\\"value\\\":\\\"sex\\\"}],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"示例_参数查询\\\",\\\"query\\\":[],\\\"h\\\":12,\\\"dataSetApi\\\":\\\"select*fromdemowherenamelike\\'%${name}%\\'\\\",\\\"timeOut\\\":-1,\\\"size\\\":{\\\"height\\\":120},\\\"dataSetId\\\":\\\"1516317603268657153\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"id\\\",\\\"text\\\":\\\"id\\\",\\\"value\\\":\\\"id\\\"},{\\\"label\\\":\\\"姓名\\\",\\\"text\\\":\\\"姓名\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"key_word\\\",\\\"text\\\":\\\"key_word\\\",\\\"value\\\":\\\"key_word\\\"},{\\\"label\\\":\\\"punch_time\\\",\\\"text\\\":\\\"punch_time\\\",\\\"value\\\":\\\"punch_time\\\"},{\\\"label\\\":\\\"salary_money\\\",\\\"text\\\":\\\"salary_money\\\",\\\"value\\\":\\\"salary_money\\\"},{\\\"label\\\":\\\"bonus_money\\\",\\\"text\\\":\\\"bonus_money\\\",\\\"value\\\":\\\"bonus_money\\\"},{\\\"label\\\":\\\"sex\\\",\\\"text\\\":\\\"sex\\\",\\\"value\\\":\\\"sex\\\"},{\\\"label\\\":\\\"age\\\",\\\"text\\\":\\\"age\\\",\\\"value\\\":\\\"age\\\"},{\\\"label\\\":\\\"birthday\\\",\\\"text\\\":\\\"birthday\\\",\\\"value\\\":\\\"birthday\\\"},{\\\"label\\\":\\\"email\\\",\\\"text\\\":\\\"email\\\",\\\"value\\\":\\\"email\\\"},{\\\"label\\\":\\\"content\\\",\\\"text\\\":\\\"content\\\",\\\"value\\\":\\\"content\\\"},{\\\"label\\\":\\\"create_by\\\",\\\"text\\\":\\\"create_by\\\",\\\"value\\\":\\\"create_by\\\"},{\\\"label\\\":\\\"create_time\\\",\\\"text\\\":\\\"create_time\\\",\\\"value\\\":\\\"create_time\\\"},{\\\"label\\\":\\\"update_by\\\",\\\"text\\\":\\\"update_by\\\",\\\"value\\\":\\\"update_by\\\"},{\\\"label\\\":\\\"update_time\\\",\\\"text\\\":\\\"update_time\\\",\\\"value\\\":\\\"update_time\\\"},{\\\"label\\\":\\\"sys_org_code\\\",\\\"text\\\":\\\"sys_org_code\\\",\\\"value\\\":\\\"sys_org_code\\\"},{\\\"label\\\":\\\"tenant_id\\\",\\\"text\\\":\\\"tenant_id\\\",\\\"value\\\":\\\"tenant_id\\\"}],\\\"dataSetType\\\":\\\"sql\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":24,\\\"linkageConfig\\\":[{\\\"linkageId\\\":\\\"79f3e507-d7ab-4cd5-9402-ca5b41086a73\\\",\\\"linkage\\\":[{\\\"source\\\":\\\"name\\\",\\\"target\\\":\\\"name\\\"}]},{\\\"linkageId\\\":\\\"95f190fb-69cc-4dc7-8f4c-b9f33460ad60\\\",\\\"linkage\\\":[{\\\"source\\\":\\\"name\\\",\\\"target\\\":\\\"name\\\"}]}],\\\"dataSetIzAgent\\\":\\\"\\\",\\\"option\\\":{\\\"fields\\\":[{\\\"fieldName\\\":\\\"name\\\",\\\"fieldTxt\\\":\\\"姓名\\\",\\\"id\\\":\\\"row0789b9da-89e4-4402-af25-2bb1043d68f7\\\",\\\"izSearch\\\":\\\"1\\\",\\\"widgetType\\\":\\\"input\\\"}]}}', 'admin', '2025-03-13 18:48:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060115766822096896', NULL, '1060100061204631552', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"age\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[{\\\"defaultVal\\\":\\\"\\\",\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"}],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"示例_参数查询\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"select*fromdemowherenamelike\\'%${name}%\\'\\\",\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"height\\\":420},\\\"dataSetId\\\":\\\"1516317603268657153\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"id\\\",\\\"text\\\":\\\"id\\\",\\\"value\\\":\\\"id\\\"},{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"key_word\\\",\\\"text\\\":\\\"key_word\\\",\\\"value\\\":\\\"key_word\\\"},{\\\"label\\\":\\\"punch_time\\\",\\\"text\\\":\\\"punch_time\\\",\\\"value\\\":\\\"punch_time\\\"},{\\\"label\\\":\\\"salary_money\\\",\\\"text\\\":\\\"salary_money\\\",\\\"value\\\":\\\"salary_money\\\"},{\\\"label\\\":\\\"bonus_money\\\",\\\"text\\\":\\\"bonus_money\\\",\\\"value\\\":\\\"bonus_money\\\"},{\\\"label\\\":\\\"sex\\\",\\\"text\\\":\\\"sex\\\",\\\"value\\\":\\\"sex\\\"},{\\\"label\\\":\\\"age\\\",\\\"text\\\":\\\"age\\\",\\\"value\\\":\\\"age\\\"},{\\\"label\\\":\\\"birthday\\\",\\\"text\\\":\\\"birthday\\\",\\\"value\\\":\\\"birthday\\\"},{\\\"label\\\":\\\"email\\\",\\\"text\\\":\\\"email\\\",\\\"value\\\":\\\"email\\\"},{\\\"label\\\":\\\"content\\\",\\\"text\\\":\\\"content\\\",\\\"value\\\":\\\"content\\\"},{\\\"label\\\":\\\"create_by\\\",\\\"text\\\":\\\"create_by\\\",\\\"value\\\":\\\"create_by\\\"},{\\\"label\\\":\\\"create_time\\\",\\\"text\\\":\\\"create_time\\\",\\\"value\\\":\\\"create_time\\\"},{\\\"label\\\":\\\"update_by\\\",\\\"text\\\":\\\"update_by\\\",\\\"value\\\":\\\"update_by\\\"},{\\\"label\\\":\\\"update_time\\\",\\\"text\\\":\\\"update_time\\\",\\\"value\\\":\\\"update_time\\\"},{\\\"label\\\":\\\"sys_org_code\\\",\\\"text\\\":\\\"sys_org_code\\\",\\\"value\\\":\\\"sys_org_code\\\"},{\\\"label\\\":\\\"tenant_id\\\",\\\"text\\\":\\\"tenant_id\\\",\\\"value\\\":\\\"tenant_id\\\"}],\\\"dataSetType\\\":\\\"sql\\\",\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dictOptions\\\":{},\\\"linkageConfig\\\":[{\\\"linkageId\\\":\\\"a7de05b4-3eab-40ce-bb95-39d650ea3c1b\\\",\\\"linkage\\\":[{\\\"source\\\":\\\"age\\\",\\\"target\\\":\\\"age\\\"}]}],\\\"dataSetIzAgent\\\":\\\"\\\",\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#6E707A\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"grid\\\":{\\\"top\\\":40,\\\"left\\\":31,\\\"bottom\\\":37,\\\"show\\\":false,\\\"right\\\":1},\\\"series\\\":[{\\\"data\\\":[],\\\"showBackground\\\":true,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"#EDEDED\\\"},\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 18:48:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060115766830485504', NULL, '1060100061204631552', NULL, 'JPie', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"age\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[{\\\"defaultVal\\\":\\\"\\\",\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"}],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"示例_参数查询\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"select*fromdemowherenamelike\\'%${name}%\\'\\\",\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"height\\\":420},\\\"dataSetId\\\":\\\"1516317603268657153\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"id\\\",\\\"text\\\":\\\"id\\\",\\\"value\\\":\\\"id\\\"},{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"key_word\\\",\\\"text\\\":\\\"key_word\\\",\\\"value\\\":\\\"key_word\\\"},{\\\"label\\\":\\\"punch_time\\\",\\\"text\\\":\\\"punch_time\\\",\\\"value\\\":\\\"punch_time\\\"},{\\\"label\\\":\\\"salary_money\\\",\\\"text\\\":\\\"salary_money\\\",\\\"value\\\":\\\"salary_money\\\"},{\\\"label\\\":\\\"bonus_money\\\",\\\"text\\\":\\\"bonus_money\\\",\\\"value\\\":\\\"bonus_money\\\"},{\\\"label\\\":\\\"sex\\\",\\\"text\\\":\\\"sex\\\",\\\"value\\\":\\\"sex\\\"},{\\\"label\\\":\\\"age\\\",\\\"text\\\":\\\"age\\\",\\\"value\\\":\\\"age\\\"},{\\\"label\\\":\\\"birthday\\\",\\\"text\\\":\\\"birthday\\\",\\\"value\\\":\\\"birthday\\\"},{\\\"label\\\":\\\"email\\\",\\\"text\\\":\\\"email\\\",\\\"value\\\":\\\"email\\\"},{\\\"label\\\":\\\"content\\\",\\\"text\\\":\\\"content\\\",\\\"value\\\":\\\"content\\\"},{\\\"label\\\":\\\"create_by\\\",\\\"text\\\":\\\"create_by\\\",\\\"value\\\":\\\"create_by\\\"},{\\\"label\\\":\\\"create_time\\\",\\\"text\\\":\\\"create_time\\\",\\\"value\\\":\\\"create_time\\\"},{\\\"label\\\":\\\"update_by\\\",\\\"text\\\":\\\"update_by\\\",\\\"value\\\":\\\"update_by\\\"},{\\\"label\\\":\\\"update_time\\\",\\\"text\\\":\\\"update_time\\\",\\\"value\\\":\\\"update_time\\\"},{\\\"label\\\":\\\"sys_org_code\\\",\\\"text\\\":\\\"sys_org_code\\\",\\\"value\\\":\\\"sys_org_code\\\"},{\\\"label\\\":\\\"tenant_id\\\",\\\"text\\\":\\\"tenant_id\\\",\\\"value\\\":\\\"tenant_id\\\"}],\\\"dataSetType\\\":\\\"sql\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dictOptions\\\":{},\\\"linkageConfig\\\":[{\\\"linkageId\\\":\\\"9e46a297-752b-40bc-95c7-d28f87ce7cd5\\\",\\\"linkage\\\":[{\\\"source\\\":\\\"age\\\",\\\"target\\\":\\\"age\\\"}]},{\\\"linkageId\\\":\\\"a7de05b4-3eab-40ce-bb95-39d650ea3c1b\\\",\\\"linkage\\\":[{\\\"source\\\":\\\"age\\\",\\\"target\\\":\\\"age\\\"}]}],\\\"dataSetIzAgent\\\":\\\"\\\",\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":43,\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\",\\\"t\\\":8},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"AccessFrom\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0,0,0,0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"基础饼图\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 18:48:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060115766843068416', NULL, '1060100061204631552', NULL, 'JLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"age\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[{\\\"defaultVal\\\":\\\"\\\",\\\"label\\\":\\\"age\\\",\\\"text\\\":\\\"age\\\",\\\"value\\\":\\\"age\\\"}],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"示例_根据年龄查询用户\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"select*fromdemowhereage=${age}\\\",\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":762,\\\"height\\\":375},\\\"dataSetId\\\":\\\"1517071247723233281\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"id\\\",\\\"text\\\":\\\"id\\\",\\\"value\\\":\\\"id\\\"},{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"key_word\\\",\\\"text\\\":\\\"key_word\\\",\\\"value\\\":\\\"key_word\\\"},{\\\"label\\\":\\\"punch_time\\\",\\\"text\\\":\\\"punch_time\\\",\\\"value\\\":\\\"punch_time\\\"},{\\\"label\\\":\\\"salary_money\\\",\\\"text\\\":\\\"salary_money\\\",\\\"value\\\":\\\"salary_money\\\"},{\\\"label\\\":\\\"bonus_money\\\",\\\"text\\\":\\\"bonus_money\\\",\\\"value\\\":\\\"bonus_money\\\"},{\\\"label\\\":\\\"sex\\\",\\\"text\\\":\\\"sex\\\",\\\"value\\\":\\\"sex\\\"},{\\\"label\\\":\\\"age\\\",\\\"text\\\":\\\"age\\\",\\\"value\\\":\\\"age\\\"},{\\\"label\\\":\\\"birthday\\\",\\\"text\\\":\\\"birthday\\\",\\\"value\\\":\\\"birthday\\\"},{\\\"label\\\":\\\"email\\\",\\\"text\\\":\\\"email\\\",\\\"value\\\":\\\"email\\\"},{\\\"label\\\":\\\"content\\\",\\\"text\\\":\\\"content\\\",\\\"value\\\":\\\"content\\\"},{\\\"label\\\":\\\"create_by\\\",\\\"text\\\":\\\"create_by\\\",\\\"value\\\":\\\"create_by\\\"},{\\\"label\\\":\\\"create_time\\\",\\\"text\\\":\\\"create_time\\\",\\\"value\\\":\\\"create_time\\\"},{\\\"label\\\":\\\"update_by\\\",\\\"text\\\":\\\"update_by\\\",\\\"value\\\":\\\"update_by\\\"},{\\\"label\\\":\\\"update_time\\\",\\\"text\\\":\\\"update_time\\\",\\\"value\\\":\\\"update_time\\\"},{\\\"label\\\":\\\"sys_org_code\\\",\\\"text\\\":\\\"sys_org_code\\\",\\\"value\\\":\\\"sys_org_code\\\"},{\\\"label\\\":\\\"tenant_id\\\",\\\"text\\\":\\\"tenant_id\\\",\\\"value\\\":\\\"tenant_id\\\"}],\\\"dataSetType\\\":\\\"sql\\\",\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dictOptions\\\":{},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"\\\",\\\"option\\\":{\\\"grid\\\":{\\\"left\\\":50,\\\"bottom\\\":84,\\\"show\\\":false,\\\"right\\\":36},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\"}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"text\\\":\\\"基础折线图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-13 18:48:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1060115766855651328', NULL, '1060100061204631552', NULL, 'JProgress', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"age\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[{\\\"defaultVal\\\":\\\"\\\",\\\"label\\\":\\\"age\\\",\\\"text\\\":\\\"age\\\",\\\"value\\\":\\\"age\\\"}],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"示例_根据年龄查询用户\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"select*fromdemowhereage=${age}\\\",\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"内存使用率\\\\\\\",\\\\\\\"value\\\\\\\":50}]\\\",\\\"size\\\":{\\\"width\\\":762,\\\"height\\\":166},\\\"dataSetId\\\":\\\"1517071247723233281\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"id\\\",\\\"text\\\":\\\"id\\\",\\\"value\\\":\\\"id\\\"},{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"key_word\\\",\\\"text\\\":\\\"key_word\\\",\\\"value\\\":\\\"key_word\\\"},{\\\"label\\\":\\\"punch_time\\\",\\\"text\\\":\\\"punch_time\\\",\\\"value\\\":\\\"punch_time\\\"},{\\\"label\\\":\\\"salary_money\\\",\\\"text\\\":\\\"salary_money\\\",\\\"value\\\":\\\"salary_money\\\"},{\\\"label\\\":\\\"bonus_money\\\",\\\"text\\\":\\\"bonus_money\\\",\\\"value\\\":\\\"bonus_money\\\"},{\\\"label\\\":\\\"sex\\\",\\\"text\\\":\\\"sex\\\",\\\"value\\\":\\\"sex\\\"},{\\\"label\\\":\\\"age\\\",\\\"text\\\":\\\"age\\\",\\\"value\\\":\\\"age\\\"},{\\\"label\\\":\\\"birthday\\\",\\\"text\\\":\\\"birthday\\\",\\\"value\\\":\\\"birthday\\\"},{\\\"label\\\":\\\"email\\\",\\\"text\\\":\\\"email\\\",\\\"value\\\":\\\"email\\\"},{\\\"label\\\":\\\"content\\\",\\\"text\\\":\\\"content\\\",\\\"value\\\":\\\"content\\\"},{\\\"label\\\":\\\"create_by\\\",\\\"text\\\":\\\"create_by\\\",\\\"value\\\":\\\"create_by\\\"},{\\\"label\\\":\\\"create_time\\\",\\\"text\\\":\\\"create_time\\\",\\\"value\\\":\\\"create_time\\\"},{\\\"label\\\":\\\"update_by\\\",\\\"text\\\":\\\"update_by\\\",\\\"value\\\":\\\"update_by\\\"},{\\\"label\\\":\\\"update_time\\\",\\\"text\\\":\\\"update_time\\\",\\\"value\\\":\\\"update_time\\\"},{\\\"label\\\":\\\"sys_org_code\\\",\\\"text\\\":\\\"sys_org_code\\\",\\\"value\\\":\\\"sys_org_code\\\"},{\\\"label\\\":\\\"tenant_id\\\",\\\"text\\\":\\\"tenant_id\\\",\\\"value\\\":\\\"tenant_id\\\"}],\\\"dataSetType\\\":\\\"sql\\\",\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF\\\",\\\"dictOptions\\\":{},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"\\\",\\\"option\\\":{\\\"grid\\\":{\\\"show\\\":false,\\\"right\\\":85},\\\"series\\\":[{\\\"barWidth\\\":19,\\\"color\\\":\\\"#151B87\\\",\\\"itemStyle\\\":{\\\"normal\\\":{\\\"barBorderRadius\\\":10}},\\\"zlevel\\\":1,\\\"label\\\":{\\\"formatter\\\":\\\"{c}{a}\\\",\\\"offset\\\":[0,-40],\\\"color\\\":\\\"black\\\",\\\"show\\\":true,\\\"fontSize\\\":24,\\\"position\\\":\\\"right\\\"}},{\\\"barWidth\\\":19,\\\"color\\\":\\\"#eeeeee\\\",\\\"barGap\\\":\\\"-100%\\\",\\\"itemStyle\\\":{\\\"normal\\\":{\\\"barBorderRadius\\\":10}},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础进度图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}}}}', 'admin', '2025-03-13 18:48:25', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1064102585364434944', NULL, '1060100026798755840', NULL, 'JQuickNav', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"首页快速导航\\\",\\\"query\\\":[],\\\"h\\\":26,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/home/quick\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"首页\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-homepage\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#1fdaca\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"仪表盘\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-shijian\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#bf0c2c\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"组件\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-dangan\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#e18525\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"系统管理\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-shezhi\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#3fb27f\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"权限管理\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-yuechi\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#4daf1bc9\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"图表\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-fujin\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#00d8ff\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":826,\\\"height\\\":265},\\\"dataSetId\\\":\\\"1519962879095332865\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"icon\\\",\\\"text\\\":\\\"icon\\\",\\\"value\\\":\\\"icon\\\"},{\\\"label\\\":\\\"color\\\",\\\"text\\\":\\\"color\\\",\\\"value\\\":\\\"color\\\"},{\\\"label\\\":\\\"href\\\",\\\"text\\\":\\\"href\\\",\\\"value\\\":\\\"href\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":30},\\\"body\\\":{\\\"textAlign\\\":\\\"center\\\",\\\"column\\\":3,\\\"iconAlign\\\":\\\"top\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"http://jeecg.com\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"快捷导航\\\"}}}', 'admin', '2025-03-24 18:50:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1064102585402183680', NULL, '1060100026798755840', NULL, 'JList', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"remark\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"date\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"pic\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"数据列表\\\",\\\"query\\\":[],\\\"h\\\":24,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/datalist/list\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"通知一\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-914:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知二\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-814:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知三\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-714:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知四\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-414:20:21\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":698,\\\"height\\\":551},\\\"dataSetId\\\":\\\"1519945036454813698\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"date\\\",\\\"text\\\":\\\"date\\\",\\\"value\\\":\\\"date\\\"},{\\\"label\\\":\\\"remark\\\",\\\"text\\\":\\\"remark\\\",\\\"value\\\":\\\"remark\\\"},{\\\"label\\\":\\\"pic\\\",\\\"text\\\":\\\"pic\\\",\\\"value\\\":\\\"pic\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"vertical\\\",\\\"titleFontColor\\\":\\\"#000000\\\",\\\"showTitlePrefix\\\":true,\\\"titleFontSize\\\":18,\\\"showTimePrefix\\\":true,\\\"iconColor\\\":\\\"#000000\\\",\\\"contentColor\\\":\\\"#000000\\\",\\\"card\\\":{\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#333333\\\"}}}}', 'admin', '2025-03-24 18:50:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1064102585435738112', NULL, '1060100026798755840', NULL, 'JGrowCard', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"h\\\":19,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"访问数\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-qianbao\\\\\\\",\\\\\\\"value\\\\\\\":2000,\\\\\\\"total\\\\\\\":120000,\\\\\\\"color\\\\\\\":\\\\\\\"green\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"月\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"成交额\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-youhuiquan\\\\\\\",\\\\\\\"value\\\\\\\":20000,\\\\\\\"total\\\\\\\":500000,\\\\\\\"color\\\\\\\":\\\\\\\"blue\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"月\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"下载数\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-tupian\\\\\\\",\\\\\\\"value\\\\\\\":8000,\\\\\\\"total\\\\\\\":120000,\\\\\\\"color\\\\\\\":\\\\\\\"orange\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"周\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"成交数\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-jifen\\\\\\\",\\\\\\\"value\\\\\\\":5000,\\\\\\\"total\\\\\\\":50000,\\\\\\\"color\\\\\\\":\\\\\\\"purple\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"年\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":1534,\\\"height\\\":386},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":20},\\\"body\\\":{\\\"horizontal\\\":1,\\\"vertical\\\":1,\\\"span\\\":12},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"统计卡片\\\"}}}', 'admin', '2025-03-24 18:50:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1064102585456709632', NULL, '1060100026798755840', NULL, 'JProjectCard', '{\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"Github\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-github\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"不要等待机会，而要创造机会。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"开源组\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"Vue\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-buysellads\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#3fb27f\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"现在的你决定将来的你。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"算法组\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"Html5\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-html5\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#e18525\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"没有什么才能比努力更重要。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"上班摸鱼\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"Angular\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-product-hunt\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#bf0c2c\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"热情和欲望可以突破一切难关。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"UI\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"React\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-skype\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#00d8ff\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"健康的身体是实目标的基石。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"技术牛\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"Js\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-pengyou\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#4daf1bc9\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"路是走出来的，而不是空想出来的。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"架构组\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"}]\\\",\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"size\\\":{\\\"width\\\":826,\\\"height\\\":958},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":33,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":30},\\\"body\\\":{\\\"column\\\":1},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"项目列表\\\"}}}', 'admin', '2025-03-24 18:50:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1064102585507041280', NULL, '1060100026798755840', NULL, 'JWaitMatter', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"h\\\":19,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"待办公文\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-yudu\\\\\\\",\\\\\\\"content\\\\\\\":23,\\\\\\\"desc\\\\\\\":\\\\\\\"今日已办3\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"待办流程\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-shuju\\\\\\\",\\\\\\\"content\\\\\\\":23,\\\\\\\"desc\\\\\\\":\\\\\\\"今日已办3\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"待办任务\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-tongzhi\\\\\\\",\\\\\\\"content\\\\\\\":23,\\\\\\\"desc\\\\\\\":\\\\\\\"今日已办3今日更新5\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":698,\\\"height\\\":353},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":25},\\\"body\\\":{\\\"column\\\":2},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"待办事项\\\"}}}', 'admin', '2025-03-24 18:50:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1064102585540595712', NULL, '1060100026798755840', NULL, 'JLine', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"type\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"visit\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"首页_近一周访问量\\\",\\\"dataSetApi\\\":\\\"selectcount(*)asvisit\\\\t,count(distinct(ip))asip\\\\t,DATE_FORMAT(create_time,\\'%Y-%m-%d\\')astian\\\\t,DATE_FORMAT(create_time,\\'%m-%d\\')astype\\\\tfromsys_logwherelog_type=1andcreate_time<=sysdate()andcreate_time>=(selectdate_sub(curdate(),interval7day))groupbytian,typeorderbytianasc\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":1252,\\\"height\\\":441},\\\"dataSetId\\\":\\\"1522503560003067906\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"visit\\\",\\\"text\\\":\\\"visit\\\",\\\"value\\\":\\\"visit\\\"},{\\\"label\\\":\\\"ip\\\",\\\"text\\\":\\\"ip\\\",\\\"value\\\":\\\"ip\\\"},{\\\"label\\\":\\\"tian\\\",\\\"text\\\":\\\"tian\\\",\\\"value\\\":\\\"tian\\\"},{\\\"label\\\":\\\"type\\\",\\\"text\\\":\\\"type\\\",\\\"value\\\":\\\"type\\\"}],\\\"dataSetType\\\":\\\"sql\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dictOptions\\\":{},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":57,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"text\\\":\\\"近一周在线访问量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-03-24 18:50:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1080655243975360512', NULL, '965205492447150080', NULL, 'JText', '{\\\"chartData\\\":\\\"北京公司2023年度招聘看板\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1604,\\\"height\\\":78},\\\"background\\\":\\\"#4A90E2\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":500},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-09 11:04:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1080655243987943424', NULL, '965205492447150080', NULL, 'JText', '{\\\"chartData\\\":\\\"简历投递数\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":56},\\\"background\\\":\\\"#22B6D4\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":24},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-09 11:04:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1080655243992137728', NULL, '965205492447150080', NULL, 'JText', '{\\\"chartData\\\":\\\"386\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":56},\\\"background\\\":\\\"#22B6D4\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":50},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-09 11:04:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1080655244000526336', NULL, '965205492447150080', NULL, 'JText', '{\\\"chartData\\\":\\\"入职人数\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":56},\\\"background\\\":\\\"#69AAF5\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":24},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-09 11:04:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1080655244004720640', NULL, '965205492447150080', NULL, 'JText', '{\\\"chartData\\\":\\\"15\\\",\\\"borderColor\\\":\\\"#69AAF5\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":56},\\\"background\\\":\\\"#4A90E2\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":47},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-09 11:04:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1080655244008914944', NULL, '965205492447150080', NULL, 'JRing', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 121,    \\\\\\\"name\\\\\\\": \\\\\\\"四川省\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 251,    \\\\\\\"name\\\\\\\": \\\\\\\"山东省\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 580,    \\\\\\\"name\\\\\\\": \\\\\\\"北京市\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 484,    \\\\\\\"name\\\\\\\": \\\\\\\"河北省\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 300,    \\\\\\\"name\\\\\\\": \\\\\\\"河南省\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":166},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":38,\\\"left\\\":52,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":false,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"show\\\":false},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础环形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-09 11:04:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1080655244017303552', NULL, '965205492447150080', NULL, 'JBubbleMap', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"commonOption\\\":{\\\"barSize\\\":10,\\\"gradientColor\\\":false,\\\"breadcrumb\\\":{\\\"drillDown\\\":false,\\\"textColor\\\":\\\"#000000\\\"},\\\"areaColor\\\":{\\\"color1\\\":\\\"#F7F7F7\\\",\\\"color2\\\":\\\"#fcc02e\\\"},\\\"barColor\\\":\\\"#fff176\\\",\\\"barColor2\\\":\\\"#fcc02e\\\",\\\"inRange\\\":{\\\"color\\\":[\\\"#04387b\\\",\\\"#467bc0\\\"]}},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"区域\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"jsConfig\\\":\\\"\\\",\\\"dataType\\\":1,\\\"h\\\":50,\\\"activeKey\\\":1,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/radar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京\\\\\\\",    \\\\\\\"value\\\\\\\": 199  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"山东\\\\\\\",    \\\\\\\"value\\\\\\\": 180  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"四川\\\\\\\",    \\\\\\\"value\\\\\\\": 137  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"新疆\\\\\\\",    \\\\\\\"value\\\\\\\": 125  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"河南\\\\\\\",    \\\\\\\"value\\\\\\\": 123  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"广东\\\\\\\",    \\\\\\\"value\\\\\\\": 123  }]\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":331},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"area\\\":{\\\"markerColor\\\":\\\"#DDE330\\\",\\\"shadowBlur\\\":10,\\\"markerCount\\\":5,\\\"markerOpacity\\\":1,\\\"name\\\":[\\\"中国\\\"],\\\"scatterLabelShow\\\":false,\\\"shadowColor\\\":\\\"#DDE330\\\",\\\"value\\\":[\\\"china\\\"],\\\"markerType\\\":\\\"effectScatter\\\"},\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"legend\\\":{\\\"data\\\":[]},\\\"title\\\":{\\\"top\\\":1,\\\"left\\\":10,\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"drillDown\\\":false,\\\"geo\\\":{\\\"top\\\":38,\\\"itemStyle\\\":{\\\"normal\\\":{\\\"shadowOffsetX\\\":0,\\\"borderColor\\\":\\\"#A9A9A9\\\",\\\"shadowOffsetY\\\":0,\\\"areaColor\\\":\\\"\\\",\\\"shadowBlur\\\":0,\\\"borderWidth\\\":1,\\\"shadowColor\\\":\\\"#80D9F8\\\"},\\\"emphasis\\\":{\\\"areaColor\\\":\\\"#FFF59C\\\",\\\"borderWidth\\\":0}},\\\"zoom\\\":1,\\\"label\\\":{\\\"emphasis\\\":{\\\"color\\\":\\\"#fff\\\",\\\"show\\\":false}},\\\"roam\\\":true},\\\"headerColor\\\":\\\"#000000\\\",\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"graphic\\\":[],\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"},\\\"visualMap\\\":{\\\"min\\\":0,\\\"top\\\":\\\"bottom\\\",\\\"max\\\":200,\\\"left\\\":\\\"5%\\\",\\\"calculable\\\":true,\\\"show\\\":false,\\\"type\\\":\\\"continuous\\\",\\\"seriesIndex\\\":[1]}}}', 'admin', '2025-05-09 11:04:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1080655244025692160', NULL, '965205492447150080', NULL, 'JFunnel', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 15,    \\\\\\\"name\\\\\\\": \\\\\\\"入职\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 5,    \\\\\\\"name\\\\\\\": \\\\\\\"待入职\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 23,    \\\\\\\"name\\\\\\\": \\\\\\\"一面\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"name\\\\\\\": \\\\\\\"HR沟通\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 234,    \\\\\\\"name\\\\\\\": \\\\\\\"收到简历\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":331},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/funnel\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"legend\\\":{\\\"orient\\\":\\\"horizontal\\\"},\\\"series\\\":[{\\\"left\\\":\\\"10%\\\",\\\"gap\\\":2,\\\"name\\\":\\\"Funnel\\\",\\\"width\\\":\\\"80%\\\",\\\"emphasis\\\":{\\\"label\\\":{\\\"fontSize\\\":20}},\\\"itemStyle\\\":{\\\"borderColor\\\":\\\"#fff\\\",\\\"borderWidth\\\":1},\\\"sort\\\":\\\"descending\\\",\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"inside\\\"},\\\"labelLine\\\":{\\\"lineStyle\\\":{\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"length\\\":10},\\\"type\\\":\\\"funnel\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a} <br/>{b} : {c}%\\\",\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础漏斗图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-09 11:04:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1080655244029886464', NULL, '965205492447150080', NULL, 'JText', '{\\\"chartData\\\":\\\"概览\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":8},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-09 11:04:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1080655244034080768', NULL, '965205492447150080', NULL, 'JText', '{\\\"chartData\\\":\\\"候选人分布\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":605,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":3,\\\"marginLeft\\\":5},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-09 11:04:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1080655244038275072', NULL, '965205492447150080', NULL, 'JText', '{\\\"chartData\\\":\\\"漏斗图\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":3,\\\"marginLeft\\\":8},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-09 11:04:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1080655244046663680', NULL, '965205492447150080', NULL, 'JPie', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 1048,    \\\\\\\"name\\\\\\\": \\\\\\\"双一流大学\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 735,    \\\\\\\"name\\\\\\\": \\\\\\\"双一流学科\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 580,    \\\\\\\"name\\\\\\\": \\\\\\\"211\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 484,    \\\\\\\"name\\\\\\\": \\\\\\\"985\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":155},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":30,\\\"left\\\":46,\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\",\\\"t\\\":2,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":false,\\\"text\\\":\\\"基础饼图\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-09 11:04:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1080655244050857984', NULL, '965205492447150080', NULL, 'JSmoothLine', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"name\\\\\\\": \\\\\\\"03-12\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 15,    \\\\\\\"name\\\\\\\": \\\\\\\"03-22\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 6,    \\\\\\\"name\\\\\\\": \\\\\\\"03-18\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 19,    \\\\\\\"name\\\\\\\": \\\\\\\"04-12\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"name\\\\\\\": \\\\\\\"05-29\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"name\\\\\\\": \\\\\\\"08-29\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":199},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":33,\\\"left\\\":23,\\\"bottom\\\":77,\\\"show\\\":false,\\\"right\\\":25},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\",\\\"smooth\\\":true}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"top\\\":1,\\\"left\\\":1,\\\"text\\\":\\\"简历投递日期分布\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-09 11:04:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1080655244055052288', NULL, '965205492447150080', NULL, 'JText', '{\\\"chartData\\\":\\\"渠道质量\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":3,\\\"marginLeft\\\":5},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-09 11:04:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1080655244059246592', NULL, '965205492447150080', NULL, 'JMultipleBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"人才库\\\\\\\",    \\\\\\\"value\\\\\\\": 150,    \\\\\\\"type\\\\\\\": \\\\\\\"投递数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"招聘网站\\\\\\\",    \\\\\\\"value\\\\\\\": 269,    \\\\\\\"type\\\\\\\": \\\\\\\"投递数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"其他渠道\\\\\\\",    \\\\\\\"value\\\\\\\": 81,    \\\\\\\"type\\\\\\\": \\\\\\\"投递数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"内推\\\\\\\",    \\\\\\\"value\\\\\\\": 67,    \\\\\\\"type\\\\\\\": \\\\\\\"投递数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"人才库\\\\\\\",    \\\\\\\"value\\\\\\\": 50,    \\\\\\\"type\\\\\\\": \\\\\\\"面试数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"招聘网站\\\\\\\",    \\\\\\\"value\\\\\\\": 100,    \\\\\\\"type\\\\\\\": \\\\\\\"面试数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"其他渠道\\\\\\\",    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"type\\\\\\\": \\\\\\\"面试数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"内推\\\\\\\",    \\\\\\\"value\\\\\\\": 45,    \\\\\\\"type\\\\\\\": \\\\\\\"面试数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"人才库\\\\\\\",    \\\\\\\"value\\\\\\\": 13,    \\\\\\\"type\\\\\\\": \\\\\\\"通过数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"招聘网站\\\\\\\",    \\\\\\\"value\\\\\\\": 24,    \\\\\\\"type\\\\\\\": \\\\\\\"通过数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"其他渠道\\\\\\\",    \\\\\\\"value\\\\\\\": 5,    \\\\\\\"type\\\\\\\": \\\\\\\"通过数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"内推\\\\\\\",    \\\\\\\"value\\\\\\\": 25,    \\\\\\\"type\\\\\\\": \\\\\\\"通过数\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":309},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":29,\\\"left\\\":31,\\\"bottom\\\":62,\\\"right\\\":8},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"多数据对比柱形图\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-09 11:04:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1080655244063440896', NULL, '965205492447150080', NULL, 'JCommonTable', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"姓名\\\\\\\": \\\\\\\"陈萌萌\\\\\\\",    \\\\\\\"筛选简历数\\\\\\\": \\\\\\\"122\\\\\\\",    \\\\\\\"推给用人部门\\\\\\\": \\\\\\\"89\\\\\\\",    \\\\\\\"面试安排\\\\\\\": \\\\\\\"40\\\\\\\",    \\\\\\\"面试通过\\\\\\\": \\\\\\\"10\\\\\\\"  },  {    \\\\\\\"姓名\\\\\\\": \\\\\\\"肖强\\\\\\\",    \\\\\\\"筛选简历数\\\\\\\": \\\\\\\"62\\\\\\\",    \\\\\\\"推给用人部门\\\\\\\": \\\\\\\"19\\\\\\\",    \\\\\\\"面试安排\\\\\\\": \\\\\\\"9\\\\\\\",    \\\\\\\"面试通过\\\\\\\": \\\\\\\"1\\\\\\\"  },  {    \\\\\\\"姓名\\\\\\\": \\\\\\\"陈晨\\\\\\\",    \\\\\\\"筛选简历数\\\\\\\": \\\\\\\"97\\\\\\\",    \\\\\\\"推给用人部门\\\\\\\": \\\\\\\"49\\\\\\\",    \\\\\\\"面试安排\\\\\\\": \\\\\\\"29\\\\\\\",    \\\\\\\"面试通过\\\\\\\": \\\\\\\"15\\\\\\\"  },  {    \\\\\\\"姓名\\\\\\\": \\\\\\\"李丽\\\\\\\",    \\\\\\\"筛选简历数\\\\\\\": \\\\\\\"47\\\\\\\",    \\\\\\\"推给用人部门\\\\\\\": \\\\\\\"29\\\\\\\",    \\\\\\\"面试安排\\\\\\\": \\\\\\\"19\\\\\\\",    \\\\\\\"面试通过\\\\\\\": \\\\\\\"5\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":605,\\\"height\\\":309},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":24,\\\"dataType\\\":1,\\\"h\\\":42,\\\"linkageConfig\\\":[],\\\"timeOut\\\":-1,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#50E3C2\\\",\\\"headerColor\\\":\\\"#7ED321\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}}}}', 'admin', '2025-05-09 11:04:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1080655244067635200', NULL, '965205492447150080', NULL, 'JText', '{\\\"chartData\\\":\\\"招聘工作量细化\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":605,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":11},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-09 11:04:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1080655244071829504', NULL, '965205492447150080', NULL, 'JText', '{\\\"chartData\\\":\\\"工作年限对岗位偏好与匹配\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":8},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-09 11:04:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1080655244084412416', NULL, '965205492447150080', NULL, 'JStackBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"不满1年\\\\\\\",    \\\\\\\"value\\\\\\\": 150,    \\\\\\\"type\\\\\\\": \\\\\\\"投递数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"1-3年\\\\\\\",    \\\\\\\"value\\\\\\\": 269,    \\\\\\\"type\\\\\\\": \\\\\\\"投递数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3-5年\\\\\\\",    \\\\\\\"value\\\\\\\": 81,    \\\\\\\"type\\\\\\\": \\\\\\\"投递数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5-10年\\\\\\\",    \\\\\\\"value\\\\\\\": 67,    \\\\\\\"type\\\\\\\": \\\\\\\"投递数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"不满1年\\\\\\\",    \\\\\\\"value\\\\\\\": 50,    \\\\\\\"type\\\\\\\": \\\\\\\"面试数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"1-3年\\\\\\\",    \\\\\\\"value\\\\\\\": 100,    \\\\\\\"type\\\\\\\": \\\\\\\"面试数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3-5年\\\\\\\",    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"type\\\\\\\": \\\\\\\"面试数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5-10年\\\\\\\",    \\\\\\\"value\\\\\\\": 45,    \\\\\\\"type\\\\\\\": \\\\\\\"面试数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"不满1年\\\\\\\",    \\\\\\\"value\\\\\\\": 13,    \\\\\\\"type\\\\\\\": \\\\\\\"通过数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"1-3年\\\\\\\",    \\\\\\\"value\\\\\\\": 24,    \\\\\\\"type\\\\\\\": \\\\\\\"通过数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3-5年\\\\\\\",    \\\\\\\"value\\\\\\\": 5,    \\\\\\\"type\\\\\\\": \\\\\\\"通过数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5-10年\\\\\\\",    \\\\\\\"value\\\\\\\": 25,    \\\\\\\"type\\\\\\\": \\\\\\\"通过数\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":309},\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#7ED321\\\"},{\\\"color\\\":\\\"#F8E71C\\\"},{\\\"color\\\":\\\"#F5A623\\\"}],\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"堆叠柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-09 11:04:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354835912884224', NULL, '1067415011364732928', NULL, 'JCapsuleChart', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"车辆归属地\\\",\\\"query\\\":[],\\\"h\\\":300,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/26/activering\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":450,\\\"height\\\":300},\\\"dataSetId\\\":\\\"1011805223195824128\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"seriesType\\\":[],\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"showValue\\\":false,\\\"unit\\\":\\\"\\\",\\\"customColor\\\":[],\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-19 16:05:49', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354835984187392', NULL, '1067415011364732928', NULL, 'JDragDecoration', '{\\\"size\\\":{\\\"width\\\":421,\\\"height\\\":47},\\\"w\\\":300,\\\"dataType\\\":1,\\\"h\\\":27,\\\"option\\\":{\\\"dur\\\":3,\\\"mainColor\\\":\\\"#00CED1\\\",\\\"fontSize\\\":15,\\\"type\\\":\\\"10\\\",\\\"title\\\":\\\"装饰10\\\",\\\"subColor\\\":\\\"#FAD400\\\",\\\"reverse\\\":false}}', 'admin', '2025-05-19 16:05:49', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354835996770304', NULL, '1067415011364732928', NULL, 'JRing', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[    {        \\\\\\\"name\\\\\\\": \\\\\\\"客车\\\\\\\",        \\\\\\\"value\\\\\\\": 1000879    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"轿车\\\\\\\",        \\\\\\\"value\\\\\\\": 3400879    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"SUV\\\\\\\",        \\\\\\\"value\\\\\\\": 2300879    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"货车\\\\\\\",        \\\\\\\"value\\\\\\\": 5400879    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"摩托车\\\\\\\",        \\\\\\\"value\\\\\\\": 3000    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"自行车\\\\\\\",        \\\\\\\"value\\\\\\\": 2000    }]\\\",\\\"size\\\":{\\\"width\\\":436,\\\"height\\\":300},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":480,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":50,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"show\\\":true,\\\"fontSize\\\":14,\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\",\\\"t\\\":1,\\\"show\\\":false},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-19 16:05:49', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836005158912', NULL, '1067415011364732928', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"12345\\\",\\\"size\\\":{\\\"width\\\":128,\\\"height\\\":45},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FAD400\\\",\\\"fontSize\\\":44,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-19 16:05:49', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836021936128', NULL, '1067415011364732928', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"车辆抓拍总数\\\",\\\"size\\\":{\\\"width\\\":134,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FAD400\\\",\\\"fontSize\\\":21,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-19 16:05:49', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836038713344', NULL, '1067415011364732928', NULL, 'JDragDecoration', '{\\\"size\\\":{\\\"width\\\":406,\\\"height\\\":47},\\\"w\\\":300,\\\"dataType\\\":1,\\\"h\\\":27,\\\"option\\\":{\\\"dur\\\":3,\\\"mainColor\\\":\\\"#00CED1\\\",\\\"fontSize\\\":15,\\\"type\\\":\\\"10\\\",\\\"title\\\":\\\"装饰10\\\",\\\"subColor\\\":\\\"#FAD400\\\",\\\"reverse\\\":false}}', 'admin', '2025-05-19 16:05:49', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836055490560', NULL, '1067415011364732928', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":54,\\\"height\\\":51},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/汽车用品_1623316498991.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2025-05-19 16:05:49', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836063879168', NULL, '1067415011364732928', NULL, 'JBubbleMap', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"commonOption\\\":{\\\"barSize\\\":10,\\\"gradientColor\\\":false,\\\"breadcrumb\\\":{\\\"drillDown\\\":false,\\\"textColor\\\":\\\"#000000\\\"},\\\"areaColor\\\":{\\\"color1\\\":\\\"#132937\\\",\\\"color2\\\":\\\"#0A0909\\\"},\\\"barColor\\\":\\\"#fff176\\\",\\\"barColor2\\\":\\\"#fcc02e\\\",\\\"inRange\\\":{\\\"color\\\":[\\\"#04387b\\\",\\\"#467bc0\\\"]}},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"区域\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"jsConfig\\\":\\\"\\\",\\\"dataType\\\":1,\\\"h\\\":300,\\\"activeKey\\\":1,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/radar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"北京\\\\\\\",\\\\\\\"value\\\\\\\":199},{\\\\\\\"name\\\\\\\":\\\\\\\"新疆\\\\\\\",\\\\\\\"value\\\\\\\":180},{\\\\\\\"name\\\\\\\":\\\\\\\"河南\\\\\\\",\\\\\\\"value\\\\\\\":137},{\\\\\\\"name\\\\\\\":\\\\\\\"四川\\\\\\\",\\\\\\\"value\\\\\\\":125},{\\\\\\\"name\\\\\\\":\\\\\\\"黑龙江\\\\\\\",\\\\\\\"value\\\\\\\":123},{\\\\\\\"name\\\\\\\":\\\\\\\"广东\\\\\\\",\\\\\\\"value\\\\\\\":123},{\\\\\\\"name\\\\\\\":\\\\\\\"山东\\\\\\\",\\\\\\\"value\\\\\\\":119},{\\\\\\\"name\\\\\\\":\\\\\\\"福建\\\\\\\",\\\\\\\"value\\\\\\\":116},{\\\\\\\"name\\\\\\\":\\\\\\\"湖北\\\\\\\",\\\\\\\"value\\\\\\\":116},{\\\\\\\"name\\\\\\\":\\\\\\\"浙江\\\\\\\",\\\\\\\"value\\\\\\\":114},{\\\\\\\"name\\\\\\\":\\\\\\\"湖南\\\\\\\",\\\\\\\"value\\\\\\\":114},{\\\\\\\"name\\\\\\\":\\\\\\\"安徽\\\\\\\",\\\\\\\"value\\\\\\\":109},{\\\\\\\"name\\\\\\\":\\\\\\\"河北\\\\\\\",\\\\\\\"value\\\\\\\":102},{\\\\\\\"name\\\\\\\":\\\\\\\"江苏\\\\\\\",\\\\\\\"value\\\\\\\":92},{\\\\\\\"name\\\\\\\":\\\\\\\"江西\\\\\\\",\\\\\\\"value\\\\\\\":91},{\\\\\\\"name\\\\\\\":\\\\\\\"重庆\\\\\\\",\\\\\\\"value\\\\\\\":91},{\\\\\\\"name\\\\\\\":\\\\\\\"云南\\\\\\\",\\\\\\\"value\\\\\\\":83},{\\\\\\\"name\\\\\\\":\\\\\\\"吉林\\\\\\\",\\\\\\\"value\\\\\\\":82},{\\\\\\\"name\\\\\\\":\\\\\\\"山西\\\\\\\",\\\\\\\"value\\\\\\\":81},{\\\\\\\"name\\\\\\\":\\\\\\\"陕西\\\\\\\",\\\\\\\"value\\\\\\\":80},{\\\\\\\"name\\\\\\\":\\\\\\\"辽宁\\\\\\\",\\\\\\\"value\\\\\\\":67},{\\\\\\\"name\\\\\\\":\\\\\\\"贵州\\\\\\\",\\\\\\\"value\\\\\\\":62},{\\\\\\\"name\\\\\\\":\\\\\\\"广西\\\\\\\",\\\\\\\"value\\\\\\\":59},{\\\\\\\"name\\\\\\\":\\\\\\\"甘肃\\\\\\\",\\\\\\\"value\\\\\\\":56},{\\\\\\\"name\\\\\\\":\\\\\\\"内蒙古\\\\\\\",\\\\\\\"value\\\\\\\":47},{\\\\\\\"name\\\\\\\":\\\\\\\"天津\\\\\\\",\\\\\\\"value\\\\\\\":42},{\\\\\\\"name\\\\\\\":\\\\\\\"上海\\\\\\\",\\\\\\\"value\\\\\\\":24},{\\\\\\\"name\\\\\\\":\\\\\\\"宁夏\\\\\\\",\\\\\\\"value\\\\\\\":18},{\\\\\\\"name\\\\\\\":\\\\\\\"海南\\\\\\\",\\\\\\\"value\\\\\\\":14},{\\\\\\\"name\\\\\\\":\\\\\\\"青海\\\\\\\",\\\\\\\"value\\\\\\\":10},{\\\\\\\"name\\\\\\\":\\\\\\\"西藏\\\\\\\",\\\\\\\"value\\\\\\\":9}]\\\",\\\"size\\\":{\\\"width\\\":718,\\\"height\\\":527},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"drillDown\\\":false,\\\"area\\\":{\\\"markerColor\\\":\\\"#DDE330\\\",\\\"shadowBlur\\\":10,\\\"markerCount\\\":5,\\\"markerOpacity\\\":1,\\\"name\\\":[\\\"中国\\\"],\\\"scatterLabelShow\\\":false,\\\"shadowColor\\\":\\\"#DDE330\\\",\\\"value\\\":[\\\"china\\\"],\\\"markerType\\\":\\\"effectScatter\\\"},\\\"geo\\\":{\\\"top\\\":25,\\\"itemStyle\\\":{\\\"normal\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowOffsetY\\\":0,\\\"borderColor\\\":\\\"#068FA1\\\",\\\"areaColor\\\":\\\"\\\",\\\"shadowBlur\\\":0,\\\"borderWidth\\\":1,\\\"shadowColor\\\":\\\"#80D9F8\\\"},\\\"emphasis\\\":{\\\"areaColor\\\":\\\"#FFF59C\\\",\\\"borderWidth\\\":0}},\\\"zoom\\\":1.2,\\\"label\\\":{\\\"emphasis\\\":{\\\"color\\\":\\\"#fff\\\",\\\"show\\\":false}},\\\"roam\\\":true},\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"data\\\":[]},\\\"title\\\":{\\\"top\\\":19,\\\"left\\\":224,\\\"show\\\":true,\\\"text\\\":\\\"全国游客分布情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFD700\\\",\\\"fontSize\\\":25,\\\"fontWeight\\\":\\\"normal\\\"}},\\\"graphic\\\":[],\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"visualMap\\\":{\\\"min\\\":0,\\\"top\\\":\\\"bottom\\\",\\\"max\\\":200,\\\"left\\\":\\\"5%\\\",\\\"calculable\\\":true,\\\"show\\\":false,\\\"type\\\":\\\"continuous\\\",\\\"seriesIndex\\\":[1]}}}', 'admin', '2025-05-19 16:05:49', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836072267776', NULL, '1067415011364732928', NULL, 'JCountTo', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":80,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"8745987\\\",\\\"size\\\":{\\\"width\\\":712,\\\"height\\\":142.9496402877698},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"suffixFontSize\\\":16,\\\"borderColor\\\":\\\"#31aefd\\\",\\\"prefixColor\\\":\\\"#FFFFFF\\\",\\\"color\\\":\\\"#EAC910\\\",\\\"suffixFontWeight\\\":\\\"normal\\\",\\\"prefix\\\":\\\"\\\",\\\"whole\\\":false,\\\"boxHeight\\\":95,\\\"suffix\\\":\\\"\\\",\\\"type\\\":\\\"img\\\",\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"prefixFontSize\\\":16,\\\"prefixFontWeight\\\":\\\"normal\\\",\\\"suffixColor\\\":\\\"#FFFFFF\\\",\\\"borderImg\\\":\\\"/img/bg/border/border1.png\\\",\\\"fontFamily\\\":\\\"DIGITALDREAMFAT\\\",\\\"gridY\\\":5,\\\"backgroundImg\\\":\\\"\\\",\\\"fontSize\\\":50,\\\"boxWidth\\\":90,\\\"fontWeight\\\":\\\"bold\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-19 16:05:49', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836080656384', NULL, '1067415011364732928', NULL, 'JDragDecoration', '{\\\"size\\\":{\\\"width\\\":604,\\\"height\\\":100},\\\"w\\\":300,\\\"dataType\\\":1,\\\"h\\\":100,\\\"option\\\":{\\\"dur\\\":3,\\\"mainColor\\\":\\\"#00CED1\\\",\\\"fontSize\\\":18,\\\"type\\\":\\\"2\\\",\\\"title\\\":\\\"装饰2\\\",\\\"subColor\\\":\\\"#FAD400\\\",\\\"reverse\\\":false}}', 'admin', '2025-05-19 16:05:49', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836084850688', NULL, '1067415011364732928', NULL, 'JGender', '{\\\"chartData\\\":\\\"[{\\\\\\\"man\\\\\\\":50,\\\\\\\"woman\\\\\\\":35}]\\\",\\\"size\\\":{\\\"width\\\":317,\\\"height\\\":245},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"男\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"女\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/pictogram\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"series\\\":[],\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-19 16:05:49', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836093239296', NULL, '1067415011364732928', NULL, 'JDragDecoration', '{\\\"size\\\":{\\\"width\\\":396,\\\"height\\\":41},\\\"w\\\":300,\\\"dataType\\\":1,\\\"h\\\":27,\\\"option\\\":{\\\"dur\\\":3,\\\"mainColor\\\":\\\"#00CED1\\\",\\\"fontSize\\\":15,\\\"type\\\":\\\"10\\\",\\\"title\\\":\\\"装饰10\\\",\\\"subColor\\\":\\\"#FAD400\\\",\\\"reverse\\\":false}}', 'admin', '2025-05-19 16:05:49', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836105822208', NULL, '1067415011364732928', NULL, 'JLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[    {        \\\\\\\"name\\\\\\\": \\\\\\\"周一\\\\\\\",        \\\\\\\"value\\\\\\\": 1000879,        \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"周二\\\\\\\",        \\\\\\\"value\\\\\\\": 3400879,        \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"周三\\\\\\\",        \\\\\\\"value\\\\\\\": 2300879,        \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"周四\\\\\\\",        \\\\\\\"value\\\\\\\": 5400879,        \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"周五\\\\\\\",        \\\\\\\"value\\\\\\\": 3400879,        \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"周六\\\\\\\",        \\\\\\\"value\\\\\\\": 7400879,        \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"周日\\\\\\\",        \\\\\\\"value\\\\\\\": 8400879,        \\\\\\\"type\\\\\\\": \\\\\\\"手机品牌\\\\\\\"    }]\\\",\\\"size\\\":{\\\"width\\\":488,\\\"height\\\":300},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#EECC0C\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"}},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":0,\\\"bottom\\\":18,\\\"show\\\":false,\\\"right\\\":40,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"symbol\\\":\\\"circle\\\",\\\"data\\\":[],\\\"symbolSize\\\":12,\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"type\\\":\\\"line\\\",\\\"lineWidth\\\":2}],\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":10,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-19 16:05:49', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836118405120', NULL, '1067415011364732928', NULL, 'JDragDecoration', '{\\\"size\\\":{\\\"width\\\":383,\\\"height\\\":47},\\\"w\\\":300,\\\"dataType\\\":1,\\\"h\\\":27,\\\"option\\\":{\\\"dur\\\":3,\\\"mainColor\\\":\\\"#00CED1\\\",\\\"fontSize\\\":15,\\\"type\\\":\\\"10\\\",\\\"title\\\":\\\"装饰10\\\",\\\"subColor\\\":\\\"#FAD400\\\",\\\"reverse\\\":false}}', 'admin', '2025-05-19 16:05:49', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836126793728', NULL, '1067415011364732928', NULL, 'JCurrentTime', '{\\\"chartData\\\":\\\"\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"height\\\":33},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":270,\\\"dataType\\\":1,\\\"h\\\":33,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"showWeek\\\":\\\"show\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-19 16:05:49', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836135182336', NULL, '1067415011364732928', NULL, 'JWeatherForecast', '{\\\"size\\\":{\\\"height\\\":47},\\\"w\\\":257,\\\"dataType\\\":1,\\\"h\\\":47,\\\"option\\\":{\\\"template\\\":94,\\\"bgColor\\\":\\\"\\\",\\\"city\\\":\\\"\\\",\\\"num\\\":2,\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#fff\\\",\\\"url\\\":\\\"\\\"}}', 'admin', '2025-05-19 16:05:49', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836151959552', NULL, '1067415011364732928', NULL, 'JDragDecoration', '{\\\"size\\\":{\\\"width\\\":443,\\\"height\\\":100},\\\"w\\\":300,\\\"dataType\\\":1,\\\"h\\\":100,\\\"option\\\":{\\\"dur\\\":3,\\\"mainColor\\\":\\\"#00CED1\\\",\\\"fontSize\\\":15,\\\"type\\\":\\\"1\\\",\\\"title\\\":\\\"装饰1\\\",\\\"subColor\\\":\\\"#FAD400\\\",\\\"reverse\\\":false}}', 'admin', '2025-05-19 16:05:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836156153856', NULL, '1067415011364732928', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"车辆归属地统计\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#D9D9D9\\\",\\\"fontSize\\\":25,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-19 16:05:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836172931072', NULL, '1067415011364732928', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"车辆类型统计\\\",\\\"size\\\":{\\\"width\\\":205,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#D9D9D9\\\",\\\"fontSize\\\":25,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-19 16:05:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836177125376', NULL, '1067415011364732928', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"过去7天车辆抓拍总数\\\",\\\"size\\\":{\\\"width\\\":267,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#D9D9D9\\\",\\\"fontSize\\\":25,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-19 16:05:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836185513984', NULL, '1067415011364732928', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"截止到当前时间段\\\",\\\"size\\\":{\\\"width\\\":212.7698028883034,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#DDDDDB\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-19 16:05:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836193902592', NULL, '1067415011364732928', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"今日游客统计\\\",\\\"size\\\":{\\\"width\\\":200,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#D9D9D9\\\",\\\"fontSize\\\":25,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-19 16:05:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836202291200', NULL, '1067415011364732928', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"近七天游客流量统计\\\",\\\"size\\\":{\\\"width\\\":231,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#D9D9D9\\\",\\\"fontSize\\\":25,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-19 16:05:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836210679808', NULL, '1067415011364732928', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"游客性别统计\\\",\\\"size\\\":{\\\"width\\\":171,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#D9D9D9\\\",\\\"fontSize\\\":25,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-19 16:05:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836219068416', NULL, '1067415011364732928', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":91,\\\"height\\\":74},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://static.jeecg.com/bigscreen/晴天_1623315350106.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2025-05-19 16:05:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836231651328', NULL, '1067415011364732928', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"实时天气\\\",\\\"size\\\":{\\\"width\\\":139,\\\"height\\\":39},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#D9D9D9\\\",\\\"fontSize\\\":25,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-19 16:05:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836235845632', NULL, '1067415011364732928', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"旅游数据分析中心大屏\\\",\\\"size\\\":{\\\"width\\\":636,\\\"height\\\":88},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#E8E8E8\\\",\\\"letterSpacing\\\":5,\\\"fontSize\\\":50,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-05-19 16:05:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836244234240', NULL, '1067415011364732928', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":507,\\\"height\\\":926},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2025-05-19 16:05:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836248428544', NULL, '1067415011364732928', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":488,\\\"height\\\":926},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2025-05-19 16:05:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1084354836252622848', NULL, '1067415011364732928', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":801,\\\"height\\\":926},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2025-05-19 16:05:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109725129229762560', NULL, '1109725101517996032', NULL, 'JText', '{\\\"chartData\\\":\\\"库存管理可视化大屏\\\",\\\"borderColor\\\":\\\"#059DA8\\\",\\\"size\\\":{\\\"width\\\":1817,\\\"height\\\":78},\\\"background\\\":\\\"#059DA8\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 16:18:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109725129259122688', NULL, '1109725101517996032', NULL, 'JGrowCard', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"库存管理-卡片\\\",\\\"query\\\":[],\\\"h\\\":19,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryManagement\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"title\\\\\\\": \\\\\\\"访问数\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-qianbao\\\\\\\",    \\\\\\\"value\\\\\\\": 2000,    \\\\\\\"total\\\\\\\": 120000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"color\\\\\\\": \\\\\\\"green\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"月\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"成交额\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-youhuiquan\\\\\\\",    \\\\\\\"value\\\\\\\": 20000,    \\\\\\\"total\\\\\\\": 500000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"color\\\\\\\": \\\\\\\"blue\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"月\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"下载数\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-tupian\\\\\\\",    \\\\\\\"value\\\\\\\": 8000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"total\\\\\\\": 120000,    \\\\\\\"color\\\\\\\": \\\\\\\"orange\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"周\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"成交数\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-jifen\\\\\\\",    \\\\\\\"value\\\\\\\": 5000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"total\\\\\\\": 50000,    \\\\\\\"color\\\\\\\": \\\\\\\"purple\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"年\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":1817,\\\"height\\\":331},\\\"dataSetId\\\":\\\"910406419257802752\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"icon\\\",\\\"text\\\":\\\"icon\\\",\\\"value\\\":\\\"icon\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"},{\\\"label\\\":\\\"action\\\",\\\"text\\\":\\\"action\\\",\\\"value\\\":\\\"action\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":20},\\\"body\\\":{\\\"horizontal\\\":7,\\\"color\\\":\\\"#000000\\\",\\\"vertical\\\":5,\\\"span\\\":8},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"统计卡片\\\"}}}', 'admin', '2025-07-28 16:18:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109725129263316992', NULL, '1109725101517996032', NULL, 'JText', '{\\\"chartData\\\":\\\"AIR 库存情况\\\",\\\"borderColor\\\":\\\"#059DA8\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":45},\\\"background\\\":\\\"#059DA8\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":7,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 16:18:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109725129263316993', NULL, '1109725101517996032', NULL, 'JList', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"air库存情况\\\",\\\"query\\\":[],\\\"h\\\":24,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryStatus?type=air\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"title\\\\\\\": \\\\\\\"通知一\\\\\\\",    \\\\\\\"date\\\\\\\": \\\\\\\"10000\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"通知二\\\\\\\",    \\\\\\\"date\\\\\\\": \\\\\\\"20000\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"通知三\\\\\\\",    \\\\\\\"date\\\\\\\": \\\\\\\"30000\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"通知四\\\\\\\",    \\\\\\\"date\\\\\\\": \\\\\\\"40000\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":111},\\\"dataSetId\\\":\\\"910419343896526848\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"horizontal\\\",\\\"showTitlePrefix\\\":false,\\\"titleFontSize\\\":15,\\\"showTimePrefix\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"}}}', 'admin', '2025-07-28 16:18:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109725129280094208', NULL, '1109725101517996032', NULL, 'JText', '{\\\"chartData\\\":\\\"LITE 库存情况\\\",\\\"borderColor\\\":\\\"#059DA8\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":45},\\\"background\\\":\\\"#059DA8\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":7,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 16:18:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109725129296871424', NULL, '1109725101517996032', NULL, 'JList', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"lite库存情况\\\",\\\"query\\\":[],\\\"h\\\":24,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryStatus?type=lite\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"通知一\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-9 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知二\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-8 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知三\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-7 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知四\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-4 14:20:21\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":111},\\\"dataSetId\\\":\\\"910423953398874112\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"horizontal\\\",\\\"showTitlePrefix\\\":false,\\\"titleFontSize\\\":15,\\\"showTimePrefix\\\":false}}', 'admin', '2025-07-28 16:18:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109725129301065728', NULL, '1109725101517996032', NULL, 'JText', '{\\\"chartData\\\":\\\"SUPER 库存情况\\\",\\\"borderColor\\\":\\\"#059DA8\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":45},\\\"background\\\":\\\"#059DA8\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":7,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 16:18:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109725129301065729', NULL, '1109725101517996032', NULL, 'JList', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"super库存情况\\\",\\\"query\\\":[],\\\"h\\\":24,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryStatus?type=super\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"通知一\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-9 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知二\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-8 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知三\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-7 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知四\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-4 14:20:21\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":111},\\\"dataSetId\\\":\\\"910425301976662016\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"horizontal\\\",\\\"showTitlePrefix\\\":false,\\\"titleFontSize\\\":15,\\\"showTimePrefix\\\":false}}', 'admin', '2025-07-28 16:18:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109725129313648640', NULL, '1109725101517996032', NULL, 'JText', '{\\\"chartData\\\":\\\"ULTRA 库存情况\\\",\\\"borderColor\\\":\\\"#059DA8\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":45},\\\"background\\\":\\\"#059DA8\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":7,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 16:18:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109725129313648641', NULL, '1109725101517996032', NULL, 'JList', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"ultra库存情况\\\",\\\"query\\\":[],\\\"h\\\":24,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryStatus?type=ultra\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"通知一\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-9 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知二\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-8 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知三\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-7 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知四\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-4 14:20:21\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":111},\\\"dataSetId\\\":\\\"910427052079366144\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"horizontal\\\",\\\"showTitlePrefix\\\":false,\\\"titleFontSize\\\":15,\\\"showTimePrefix\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"}}}', 'admin', '2025-07-28 16:18:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109725129330425856', NULL, '1109725101517996032', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"产品库存占比情况\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=storkProportion\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":751,\\\"height\\\":210},\\\"dataSetId\\\":\\\"910430104345690112\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":76,\\\"bottom\\\":67,\\\"show\\\":false,\\\"right\\\":3},\\\"series\\\":[{\\\"barWidth\\\":39,\\\"data\\\":[],\\\"color\\\":[\\\"#207B85\\\",\\\"#2C5E5A\\\",\\\"#36756E\\\"],\\\"itemStyle\\\":{\\\"color\\\":\\\"#009BA7\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"产品库存占比情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 16:18:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109725129330425857', NULL, '1109725101517996032', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"当月出库情况\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=outbound\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":751,\\\"height\\\":232},\\\"dataSetId\\\":\\\"910435726206222336\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":48,\\\"left\\\":62,\\\"bottom\\\":62,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"color\\\":[\\\"#075A63\\\",\\\"#285754\\\",\\\"#37706A\\\",\\\"#63968F\\\",\\\"#09A7B3\\\"],\\\"itemStyle\\\":{\\\"color\\\":\\\"#059DA8\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"当月出库情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 16:18:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109725129347203072', NULL, '1109725101517996032', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"当月入库情况\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=warehousing\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":675,\\\"height\\\":232},\\\"dataSetId\\\":\\\"910441161197928448\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":45,\\\"bottom\\\":58,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#059DA8\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"当月入库情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 16:18:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109725129351397376', NULL, '1109725101517996032', NULL, 'JMultipleBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"type\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"产品库龄分布情况\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=stockAge\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":675,\\\"height\\\":232},\\\"dataSetId\\\":\\\"910447275230674944\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"type\\\",\\\"text\\\":\\\"type\\\",\\\"value\\\":\\\"type\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":54,\\\"bottom\\\":54},\\\"series\\\":[{\\\"color\\\":[\\\"#09A7B3\\\",\\\"#499E91\\\",\\\"#03A2AD\\\",\\\"#68F7D8\\\"]}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"产品库龄分布情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 16:18:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109725129418506240', NULL, '1109725101517996032', NULL, 'JCommonTable', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"产品库存状态监控\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=monitor\\\",\\\"drillData\\\":[],\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",    \\\\\\\"value\\\\\\\": 50  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",    \\\\\\\"value\\\\\\\": 200  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",    \\\\\\\"value\\\\\\\": 300  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",    \\\\\\\"value\\\\\\\": 400  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",    \\\\\\\"value\\\\\\\": 50  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",    \\\\\\\"value\\\\\\\": 120  }]\\\",\\\"size\\\":{\\\"width\\\":1817,\\\"height\\\":485},\\\"dataSetId\\\":\\\"910455640270880768\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"仓库\\\",\\\"text\\\":\\\"仓库\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"系列\\\",\\\"text\\\":\\\"系列\\\",\\\"value\\\":\\\"series\\\"},{\\\"label\\\":\\\"市场名\\\",\\\"text\\\":\\\"市场名\\\",\\\"value\\\":\\\"marketName\\\"},{\\\"label\\\":\\\"机型\\\",\\\"text\\\":\\\"机型\\\",\\\"value\\\":\\\"model\\\"},{\\\"label\\\":\\\"产品状态\\\",\\\"text\\\":\\\"产品状态\\\",\\\"value\\\":\\\"productStatus\\\"},{\\\"label\\\":\\\"当前库存\\\",\\\"text\\\":\\\"当前库存\\\",\\\"value\\\":\\\"inventory\\\"},{\\\"label\\\":\\\"库存状态\\\",\\\"text\\\":\\\"库存状态\\\",\\\"value\\\":\\\"inventoryStatus\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"seriesType\\\":[],\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"name\\\",\\\"title\\\":\\\"仓库\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"series\\\",\\\"title\\\":\\\"系列\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"marketName\\\",\\\"title\\\":\\\"市场名\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"model\\\",\\\"title\\\":\\\"机型\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"productStatus\\\",\\\"title\\\":\\\"产品状态\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"inventory\\\",\\\"title\\\":\\\"当前库存\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"inventoryStatus\\\",\\\"title\\\":\\\"库存状态\\\"}],\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"}}}', 'admin', '2025-07-28 16:18:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109725129418506241', NULL, '1109725101517996032', NULL, 'JPie', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"仓库状态情况\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=warehouseStatus\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":675,\\\"height\\\":210},\\\"dataSetId\\\":\\\"910431120222896128\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"color\\\":[\\\"#05A0AB\\\",\\\"#65A89E\\\",\\\"#469C8F\\\"],\\\"name\\\":\\\"Access From\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"仓库状态情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 16:18:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109725129443672064', NULL, '1109725101517996032', NULL, 'JMultipleBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"type\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"产品库存覆盖率情况\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=coverage\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":751,\\\"height\\\":232},\\\"dataSetId\\\":\\\"910442989620871168\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"type\\\",\\\"text\\\":\\\"type\\\",\\\"value\\\":\\\"type\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"type\\\":\\\"value\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":41,\\\"left\\\":104,\\\"bottom\\\":52,\\\"right\\\":90},\\\"series\\\":[{\\\"color\\\":[\\\"#05A5B0\\\",\\\"#6BB3A8\\\",\\\"#4AA194\\\",\\\"#1D828A\\\"]}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"产品库存覆盖率情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 16:18:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712543752192', NULL, '1084355229195993088', NULL, 'JScrollBoard', '{\\\"chartData\\\":\\\"[    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"出所结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"205.32\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"出所结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"68.32\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"银行结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"381.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"银行结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"381.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"出所结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"8.32\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"出所结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"68.32\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"银行结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"381.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"银行结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"381.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"出所结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"68.32\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"银行结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"32.24\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"银行结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"381.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"银行结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"381.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"出所结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"68.32\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890023154\\\\\\\",        \\\\\\\"manage\\\\\\\": \\\\\\\"银行结算\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"32.24\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    }]\\\",\\\"size\\\":{\\\"width\\\":531,\\\"height\\\":326},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"oddRowBGC\\\":\\\"#030D3A\\\",\\\"headShow\\\":true,\\\"hoverPause\\\":true,\\\"indexWidth\\\":80,\\\"index\\\":false,\\\"carousel\\\":\\\"single\\\",\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"evenRowBGC\\\":\\\"#003B51\\\",\\\"header\\\":[{\\\"width\\\":100,\\\"label\\\":\\\"罪犯姓名\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"银行账户\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"异常来源\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"异常金额\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"时间\\\"}],\\\"headerBGC\\\":\\\"#041732\\\",\\\"headerHeight\\\":55,\\\"waitTime\\\":2000,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712589889536', NULL, '1084355229195993088', NULL, 'JScrollBoard', '{\\\"chartData\\\":\\\"[    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"上账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"244.50\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"上账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"1000.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"下账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"64.50\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"下账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"162.30\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"16.71\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"上账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"2000.00\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"上账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"20.10\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"李慧\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"下账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"120.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"上账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"244.10\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"下账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"0.50\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"120.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"下账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"1000.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"下账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"244.50\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"张三\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"下账\\\\\\\",        \\\\\\\"A\\\\\\\": \\\\\\\"244.50\\\\\\\",        \\\\\\\"B\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"C\\\\\\\": \\\\\\\"0.00\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    }]\\\",\\\"size\\\":{\\\"width\\\":671,\\\"height\\\":338},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"oddRowBGC\\\":\\\"#030D3A\\\",\\\"headShow\\\":true,\\\"hoverPause\\\":true,\\\"indexWidth\\\":80,\\\"index\\\":false,\\\"carousel\\\":\\\"single\\\",\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"evenRowBGC\\\":\\\"#003B51\\\",\\\"header\\\":[{\\\"width\\\":100,\\\"label\\\":\\\"罪犯姓名\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"罪犯编号\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"处遇等级\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"流向\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"A账户\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"B账户\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"C账户\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"时间\\\"}],\\\"headerBGC\\\":\\\"#041732\\\",\\\"headerHeight\\\":55,\\\"waitTime\\\":2000,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712610861056', NULL, '1084355229195993088', NULL, 'JScrollBoard', '{\\\"chartData\\\":\\\"[    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    },    {        \\\\\\\"name\\\\\\\": \\\\\\\"王来\\\\\\\",        \\\\\\\"SN\\\\\\\": \\\\\\\"1234657890\\\\\\\",        \\\\\\\"level\\\\\\\": \\\\\\\"宽管\\\\\\\",        \\\\\\\"item\\\\\\\": \\\\\\\"咳嗽药\\\\\\\",        \\\\\\\"number\\\\\\\": \\\\\\\"3片\\\\\\\",        \\\\\\\"time\\\\\\\": \\\\\\\"2020-11-19 15:30:15\\\\\\\"    }]\\\",\\\"size\\\":{\\\"width\\\":531,\\\"height\\\":326},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"oddRowBGC\\\":\\\"#030D3A\\\",\\\"headShow\\\":true,\\\"hoverPause\\\":true,\\\"indexWidth\\\":80,\\\"index\\\":false,\\\"carousel\\\":\\\"single\\\",\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"evenRowBGC\\\":\\\"#003B51\\\",\\\"header\\\":[{\\\"width\\\":100,\\\"label\\\":\\\"罪犯姓名\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"罪犯编号\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"处遇等级\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"领取药品\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"数量\\\"},{\\\"width\\\":100,\\\"label\\\":\\\"时间\\\"}],\\\"headerBGC\\\":\\\"#041732\\\",\\\"headerHeight\\\":55,\\\"waitTime\\\":2000,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712623443968', NULL, '1084355229195993088', NULL, 'JArea', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"{    \\\\\\\"categories\\\\\\\": [        \\\\\\\"7月\\\\\\\",        \\\\\\\"8月\\\\\\\",        \\\\\\\"9月\\\\\\\",        \\\\\\\"10月\\\\\\\",        \\\\\\\"11月\\\\\\\"    ],    \\\\\\\"series\\\\\\\": [        {            \\\\\\\"name\\\\\\\": \\\\\\\"异常资金总额走势\\\\\\\",            \\\\\\\"data\\\\\\\": [                18100.09,                28781.31,                25654.2,                30398.73,                34560.39            ]        }    ]}\\\",\\\"size\\\":{\\\"width\\\":530,\\\"height\\\":258},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#FEB246\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"data\\\":[],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"boundaryGap\\\":false,\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"izSmooth\\\":true,\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":10,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"areaStyleOpacity\\\":0.6,\\\"areaStyle\\\":{},\\\"data\\\":[],\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"left\\\":10,\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#B9B8CE\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712636026880', NULL, '1084355229195993088', NULL, 'JMultipleLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{    \\\\\\\"categories\\\\\\\": [        \\\\\\\"7月\\\\\\\",        \\\\\\\"8月\\\\\\\",        \\\\\\\"9月\\\\\\\",        \\\\\\\"10月\\\\\\\",        \\\\\\\"11月\\\\\\\"    ],    \\\\\\\"series\\\\\\\": [        {            \\\\\\\"name\\\\\\\": \\\\\\\"上账资金走势\\\\\\\",            \\\\\\\"data\\\\\\\": [                18100.09,                28781.31,                25654.2,                30398.73,                16560.39            ]        },        {            \\\\\\\"name\\\\\\\": \\\\\\\"下账资金走势\\\\\\\",            \\\\\\\"data\\\\\\\": [                20100.09,                16281.31,                18654.2,                20021.73,                31560.02            ]        }    ]}\\\",\\\"size\\\":{\\\"width\\\":682,\\\"height\\\":309},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#0BE3E3\\\"},{\\\"color\\\":\\\"#FEB246\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"}},\\\"grid\\\":{\\\"top\\\":55,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":5,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"symbol\\\":\\\"circle\\\",\\\"symbolSize\\\":5,\\\"lineType\\\":\\\"smooth\\\",\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true},\\\"lineWidth\\\":3}],\\\"legend\\\":{\\\"r\\\":56},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712648609792', NULL, '1084355229195993088', NULL, 'JMultipleBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{    \\\\\\\"categories\\\\\\\": [        \\\\\\\"7月\\\\\\\",        \\\\\\\"8月\\\\\\\",        \\\\\\\"9月\\\\\\\",        \\\\\\\"10月\\\\\\\",        \\\\\\\"11月\\\\\\\"    ],    \\\\\\\"series\\\\\\\": [        {            \\\\\\\"name\\\\\\\": \\\\\\\"商品采购占比\\\\\\\",            \\\\\\\"data\\\\\\\": [                12,                16,                13,                20,                24            ]        },        {            \\\\\\\"name\\\\\\\": \\\\\\\"药品采购占比\\\\\\\",            \\\\\\\"data\\\\\\\": [                28,                24,                25,                13,                12            ]        },        {            \\\\\\\"name\\\\\\\": \\\\\\\"被服采购占比\\\\\\\",            \\\\\\\"data\\\\\\\": [                34,                22,                32,                34,                40            ]        },        {            \\\\\\\"name\\\\\\\": \\\\\\\"办公用品采购占比\\\\\\\",            \\\\\\\"data\\\\\\\": [                26,                38,                30,                28,                16            ]        }    ]}\\\",\\\"size\\\":{\\\"width\\\":543,\\\"height\\\":257},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#00EAFF\\\"},{\\\"color\\\":\\\"#01BBF2\\\"},{\\\"color\\\":\\\"#028CE5\\\"},{\\\"color\\\":\\\"#151FDD\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":55,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":5,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":10,\\\"itemStyle\\\":{\\\"borderRadius\\\":0},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true,\\\"position\\\":\\\"top\\\"}}],\\\"legend\\\":{\\\"r\\\":13,\\\"t\\\":1},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#1D1F26\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712661192704', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"%\\\",\\\"size\\\":{\\\"width\\\":84,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712669581312', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"%\\\",\\\"size\\\":{\\\"width\\\":84,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712682164224', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"4.23\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FEB246\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712690552832', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"53602.23\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FEB246\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712694747136', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"7.23\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0BE3E3\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712703135744', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"123602.23\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0BE3E3\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712711524352', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"22216.68\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#00EAFF\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712736690176', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"34560.32\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FEB246\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712749273088', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"22216.02\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0FB2F8\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712761856000', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"311\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0E56F1\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712782827520', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"233500.06\\\",\\\"size\\\":{\\\"width\\\":179,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FEB246\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712791216128', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"15335.21\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#0BE3E3\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712807993344', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"3720.21\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#151FDD\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712816381952', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"1240.01\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#028CE5\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712824770560', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"82216.68\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#00EAFF\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712833159168', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"56024.23\\\",\\\"size\\\":{\\\"width\\\":161,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#01BBF2\\\",\\\"fontSize\\\":34,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712845742080', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"当月下账资金总额\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712862519296', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"当月上账资金总额\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712891879424', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"同比增长率\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":11,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712900268032', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"同比增长金额\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":11,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712908656640', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"同比增长率\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":11,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712921239552', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"同比增长金额\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":11,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712929628160', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"出所结算异常总额\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712938016768', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"银行结账异常数\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712946405376', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"异常资金总额\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712958988288', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"资金异常账户数\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712967376896', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"当月办公用品采购金额\\\",\\\"size\\\":{\\\"width\\\":151,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712975765504', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"当月被服采购金额\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712984154112', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"当月药品采购金额\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712988348416', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"当月商品采购金额\\\",\\\"size\\\":{\\\"width\\\":132,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739712996737024', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"资金异常账户\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739713000931328', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"罪犯实时上下账数据\\\",\\\"size\\\":{\\\"width\\\":195,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739713009319936', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"药品领用实时数据\\\",\\\"size\\\":{\\\"width\\\":177,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739713013514240', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"账户异常数据\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739713017708544', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"物料采购概况\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#8AA7D0\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739713026097152', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"财务科数据展示\\\",\\\"size\\\":{\\\"width\\\":466,\\\"height\\\":45},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":10,\\\"fontSize\\\":32,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1109739713030291456', NULL, '1084355229195993088', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"XX省XX市监狱\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-07-28 17:16:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362203862401024', NULL, '1113362203690434560', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"收视监控平台\\\",\\\"size\\\":{\\\"width\\\":376,\\\"height\\\":52},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":5,\\\"fontSize\\\":50,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362203904344064', NULL, '1113362203690434560', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"Viewing  Monitoring platform\\\",\\\"size\\\":{\\\"width\\\":382,\\\"height\\\":45},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":26,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362203921121280', NULL, '1113362203690434560', NULL, 'JDragDecoration', '{\\\"size\\\":{\\\"width\\\":403,\\\"height\\\":78},\\\"w\\\":300,\\\"dataType\\\":1,\\\"h\\\":100,\\\"option\\\":{\\\"dur\\\":3,\\\"mainColor\\\":\\\"#00CED1\\\",\\\"fontSize\\\":15,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"装饰8\\\",\\\"subColor\\\":\\\"#FAD400\\\",\\\"reverse\\\":false}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362203933704192', NULL, '1113362203690434560', NULL, 'JCurrentTime', '{\\\"chartData\\\":\\\"\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":270,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":270,\\\"dataType\\\":1,\\\"h\\\":33,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"bgColor\\\":\\\"#4A4A4A\\\",\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"showWeek\\\":\\\"hide\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"fontColor\\\":\\\"#4A4A4A\\\"}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362203950481408', NULL, '1113362203690434560', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":93,\\\"height\\\":61},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgos.oss-cn-beijing.aliyuncs.com/upload/test/1e80a2350e3a4b378a4ba7647aef9a17.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362203975647232', NULL, '1113362203690434560', NULL, 'JWeatherForecast', '{\\\"size\\\":{\\\"width\\\":267,\\\"height\\\":59},\\\"w\\\":311,\\\"dataType\\\":1,\\\"h\\\":47,\\\"option\\\":{\\\"template\\\":11,\\\"bgColor\\\":\\\"\\\",\\\"city\\\":\\\"\\\",\\\"num\\\":2,\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#fff\\\",\\\"url\\\":\\\"\\\"}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362203992424448', NULL, '1113362203690434560', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":441},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362204013395968', NULL, '1113362203690434560', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":582,\\\"height\\\":445},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362204034367488', NULL, '1113362203690434560', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":589,\\\"height\\\":450},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"8\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362204051144704', NULL, '1113362203690434560', NULL, 'JVideoJs', '{\\\"size\\\":{\\\"width\\\":568,\\\"height\\\":405},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"timeOut\\\":0,\\\"option\\\":{\\\"url\\\":\\\"http://vjs.zencdn.net/v/oceans.mp4\\\"}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362204067921920', NULL, '1113362203690434560', NULL, 'JVideoJs', '{\\\"size\\\":{\\\"width\\\":560,\\\"height\\\":416},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"timeOut\\\":0,\\\"option\\\":{\\\"url\\\":\\\"http://vjs.zencdn.net/v/oceans.mp4\\\"}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362204080504832', NULL, '1113362203690434560', NULL, 'JVideoJs', '{\\\"size\\\":{\\\"width\\\":570,\\\"height\\\":433},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"timeOut\\\":0,\\\"option\\\":{\\\"url\\\":\\\"http://vjs.zencdn.net/v/oceans.mp4\\\"}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362204093087744', NULL, '1113362203690434560', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"全网实时收视率\\\",\\\"size\\\":{\\\"width\\\":262,\\\"height\\\":56},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":35,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362204109864960', NULL, '1113362203690434560', NULL, 'JDragBorder', '{\\\"size\\\":{\\\"width\\\":1790,\\\"height\\\":417},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"option\\\":{\\\"dur\\\":3,\\\"backgroundColor\\\":\\\"#ffffff00\\\",\\\"mainColor\\\":\\\"#83BFF6\\\",\\\"titleWidth\\\":250,\\\"type\\\":\\\"2\\\",\\\"title\\\":\\\"边框\\\",\\\"subColor\\\":\\\"#00CED1\\\",\\\"reverse\\\":false}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362204122447872', NULL, '1113362203690434560', NULL, 'JMultipleLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"周一\\\\\\\",    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周二\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周三\\\\\\\",    \\\\\\\"value\\\\\\\": 40,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周四\\\\\\\",    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周五\\\\\\\",    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周一\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周二\\\\\\\",    \\\\\\\"value\\\\\\\": 60,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周三\\\\\\\",    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周四\\\\\\\",    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周五\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":485,\\\"height\\\":335},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"name\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#FFD700\\\"},{\\\"color\\\":\\\"#90EE90\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"}},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":40,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"areaStyleOpacity\\\":0.5,\\\"symbolSize\\\":5,\\\"lineType\\\":\\\"smooth\\\",\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"lineWidth\\\":2}],\\\"legend\\\":{\\\"r\\\":1},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#1D1F26\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362204143419392', NULL, '1113362203690434560', NULL, 'JMultipleLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"周一\\\\\\\",    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周二\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周三\\\\\\\",    \\\\\\\"value\\\\\\\": 40,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周四\\\\\\\",    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周五\\\\\\\",    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周一\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周二\\\\\\\",    \\\\\\\"value\\\\\\\": 60,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周三\\\\\\\",    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周四\\\\\\\",    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周五\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":485,\\\"height\\\":335},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"show\\\":true,\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#1E86EB\\\"},{\\\"color\\\":\\\"#FF8C00\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":40,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"symbolSize\\\":5,\\\"lineType\\\":\\\"smooth\\\",\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"lineWidth\\\":2}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362204164390912', NULL, '1113362203690434560', NULL, 'JMultipleLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"周一\\\\\\\",    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周二\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周三\\\\\\\",    \\\\\\\"value\\\\\\\": 40,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周四\\\\\\\",    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周五\\\\\\\",    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周一\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周二\\\\\\\",    \\\\\\\"value\\\\\\\": 60,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周三\\\\\\\",    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周四\\\\\\\",    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"周五\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":485,\\\"height\\\":335},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#C71585\\\"},{\\\"color\\\":\\\"#FF4500\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"}},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":40,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"symbolSize\\\":5,\\\"lineType\\\":\\\"smooth\\\",\\\"lineWidth\\\":2}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362204172779520', NULL, '1113362203690434560', NULL, 'JSelectRadio', '{\\\"compShowConfig\\\":[{\\\"compVals\\\":[\\\"22aae23c-029e-456e-a1ac-0936cbfa6b6b\\\",\\\"9d1f25e6-5446-4f78-90c6-7f9bd674b058\\\",\\\"85841a8f-e6cd-479a-9ba8-c36497b4e912\\\",\\\"236cba9d-2c70-407e-8013-ee37e3d5d124\\\",\\\"es-drager-1731649759290-3\\\",\\\"es-drager-1731649765690-4\\\"],\\\"selectVal\\\":\\\"1\\\"},{\\\"compVals\\\":[\\\"3acfc295-ea6d-4e16-83fd-bfd8d9022d8d\\\",\\\"f499c09e-61cc-40f1-8496-d57d2f98f82c\\\",\\\"a82c61b6-4287-422a-b8e7-1cb34d17859a\\\",\\\"26735d51-f628-4ec6-8886-0ede0a7443af\\\",\\\"es-drager-1731650783569-1\\\",\\\"es-drager-1731650792607-2\\\"],\\\"selectVal\\\":\\\"2\\\"}],\\\"chartData\\\":\\\"[  {    \\\\\\\"label\\\\\\\": \\\\\\\"中央卫视\\\\\\\",    \\\\\\\"value\\\\\\\": \\\\\\\"1\\\\\\\"  },  {    \\\\\\\"label\\\\\\\": \\\\\\\"地方卫视\\\\\\\",    \\\\\\\"value\\\\\\\": \\\\\\\"2\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":400,\\\"height\\\":80},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"文本\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":400,\\\"dataType\\\":1,\\\"h\\\":80,\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#39414d\\\",\\\"borderColor\\\":\\\"\\\",\\\"color\\\":\\\"#FFFFFF\\\",\\\"activeColor\\\":\\\"#fff\\\",\\\"activeBorderColor\\\":\\\"\\\",\\\"borderWidth\\\":0,\\\"activeBackgroundColor\\\":\\\"#0a73ff\\\",\\\"fontSize\\\":30,\\\"type\\\":\\\"radio\\\",\\\"activeBorderWidth\\\":0}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362204193751040', NULL, '1113362203690434560', NULL, 'JVideoPlay', '{\\\"chartData\\\":\\\"[{\\\\\\\"src\\\\\\\":\\\\\\\"http://vjs.zencdn.net/v/oceans.mp4\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":516,\\\"height\\\":351},\\\"background\\\":\\\"#4A90E2\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"路径\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"loop\\\":true,\\\"autoPlay\\\":false}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362204210528256', NULL, '1113362203690434560', NULL, 'JVideoPlay', '{\\\"chartData\\\":\\\"[{\\\\\\\"src\\\\\\\":\\\\\\\"http://vjs.zencdn.net/v/oceans.mp4\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":518,\\\"height\\\":361},\\\"background\\\":\\\"#4A90E2\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"路径\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"loop\\\":true,\\\"autoPlay\\\":false}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362204223111168', NULL, '1113362203690434560', NULL, 'JVideoPlay', '{\\\"chartData\\\":\\\"[{\\\\\\\"src\\\\\\\":\\\\\\\"http://vjs.zencdn.net/v/oceans.mp4\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":521,\\\"height\\\":378},\\\"background\\\":\\\"#4A90E2\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"路径\\\"}],\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"loop\\\":true,\\\"autoPlay\\\":false}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362204235694080', NULL, '1113362203690434560', NULL, 'JBubble', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": 4,    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 5,    \\\\\\\"value\\\\\\\": 75,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 6,    \\\\\\\"value\\\\\\\": 68,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 7,    \\\\\\\"value\\\\\\\": 51,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 8,    \\\\\\\"value\\\\\\\": 92,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 9,    \\\\\\\"value\\\\\\\": 68,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 10,    \\\\\\\"value\\\\\\\": 78,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 11,    \\\\\\\"value\\\\\\\": 69,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 12,    \\\\\\\"value\\\\\\\": 83,    \\\\\\\"type\\\\\\\": \\\\\\\"上午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 11,    \\\\\\\"value\\\\\\\": 6,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 10,    \\\\\\\"value\\\\\\\": 8,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 9,    \\\\\\\"value\\\\\\\": 7,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 8,    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 7,    \\\\\\\"value\\\\\\\": 11,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 6,    \\\\\\\"value\\\\\\\": 4,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 10,    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 8,    \\\\\\\"value\\\\\\\": 16,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": 7,    \\\\\\\"value\\\\\\\": 9,    \\\\\\\"type\\\\\\\": \\\\\\\"下午\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":851,\\\"height\\\":360},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#9B9B9B\\\"},\\\"interval\\\":2}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"}},\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":50,\\\"containLabel\\\":true},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362204248276992', NULL, '1113362203690434560', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"视频访问来源\\\",\\\"size\\\":{\\\"width\\\":268,\\\"height\\\":63},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":100,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":35,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362204260859904', NULL, '1113362203690434560', NULL, 'JRing', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 1048,    \\\\\\\"name\\\\\\\": \\\\\\\"营销广告\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 735,    \\\\\\\"name\\\\\\\": \\\\\\\"搜索引擎\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 580,    \\\\\\\"name\\\\\\\": \\\\\\\"邮件营销\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 484,    \\\\\\\"name\\\\\\\": \\\\\\\"联盟广告\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 300,    \\\\\\\"name\\\\\\\": \\\\\\\"视频广告\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":666,\\\"height\\\":385},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":480,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":50,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"show\\\":true,\\\"fontSize\\\":14,\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"show\\\":false},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#1D1F26\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:10:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362261433417728', NULL, '1113362261391474688', NULL, 'JQuickNav', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"首页快速导航\\\",\\\"query\\\":[],\\\"h\\\":26,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/home/quick\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"首页\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-homepage\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#1fdaca\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"仪表盘\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-shijian\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#bf0c2c\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"组件\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-dangan\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#e18525\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"系统管理\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-shezhi\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#3fb27f\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"权限管理\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-yuechi\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#4daf1bc9\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"图表\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-fujin\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#00d8ff\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":826,\\\"height\\\":265},\\\"dataSetId\\\":\\\"1519962879095332865\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"icon\\\",\\\"text\\\":\\\"icon\\\",\\\"value\\\":\\\"icon\\\"},{\\\"label\\\":\\\"color\\\",\\\"text\\\":\\\"color\\\",\\\"value\\\":\\\"color\\\"},{\\\"label\\\":\\\"href\\\",\\\"text\\\":\\\"href\\\",\\\"value\\\":\\\"href\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":30},\\\"body\\\":{\\\"textAlign\\\":\\\"center\\\",\\\"column\\\":3,\\\"iconAlign\\\":\\\"top\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"http://jeecg.com\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"快捷导航\\\"}}}', 'admin', '2025-08-07 17:10:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362261462777856', NULL, '1113362261391474688', NULL, 'JList', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"remark\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"date\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"pic\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"数据列表\\\",\\\"query\\\":[],\\\"h\\\":24,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/datalist/list\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"通知一\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-914:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知二\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-814:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知三\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-714:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知四\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-414:20:21\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":698,\\\"height\\\":551},\\\"dataSetId\\\":\\\"1519945036454813698\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"date\\\",\\\"text\\\":\\\"date\\\",\\\"value\\\":\\\"date\\\"},{\\\"label\\\":\\\"remark\\\",\\\"text\\\":\\\"remark\\\",\\\"value\\\":\\\"remark\\\"},{\\\"label\\\":\\\"pic\\\",\\\"text\\\":\\\"pic\\\",\\\"value\\\":\\\"pic\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"vertical\\\",\\\"titleFontColor\\\":\\\"#000000\\\",\\\"showTitlePrefix\\\":true,\\\"titleFontSize\\\":18,\\\"showTimePrefix\\\":true,\\\"iconColor\\\":\\\"#000000\\\",\\\"contentColor\\\":\\\"#000000\\\",\\\"card\\\":{\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#333333\\\"}}}}', 'admin', '2025-08-07 17:10:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362261483749376', NULL, '1113362261391474688', NULL, 'JGrowCard', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"h\\\":19,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"访问数\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-qianbao\\\\\\\",\\\\\\\"value\\\\\\\":2000,\\\\\\\"total\\\\\\\":120000,\\\\\\\"color\\\\\\\":\\\\\\\"green\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"月\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"成交额\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-youhuiquan\\\\\\\",\\\\\\\"value\\\\\\\":20000,\\\\\\\"total\\\\\\\":500000,\\\\\\\"color\\\\\\\":\\\\\\\"blue\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"月\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"下载数\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-tupian\\\\\\\",\\\\\\\"value\\\\\\\":8000,\\\\\\\"total\\\\\\\":120000,\\\\\\\"color\\\\\\\":\\\\\\\"orange\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"周\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"成交数\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-jifen\\\\\\\",\\\\\\\"value\\\\\\\":5000,\\\\\\\"total\\\\\\\":50000,\\\\\\\"color\\\\\\\":\\\\\\\"purple\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"年\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":1534,\\\"height\\\":386},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":20},\\\"body\\\":{\\\"horizontal\\\":1,\\\"vertical\\\":1,\\\"span\\\":12},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"统计卡片\\\"}}}', 'admin', '2025-08-07 17:10:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362261496332288', NULL, '1113362261391474688', NULL, 'JProjectCard', '{\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"Github\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-github\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"不要等待机会，而要创造机会。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"开源组\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"Vue\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-buysellads\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#3fb27f\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"现在的你决定将来的你。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"算法组\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"Html5\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-html5\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#e18525\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"没有什么才能比努力更重要。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"上班摸鱼\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"Angular\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-product-hunt\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#bf0c2c\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"热情和欲望可以突破一切难关。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"UI\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"React\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-skype\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#00d8ff\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"健康的身体是实目标的基石。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"技术牛\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"Js\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-pengyou\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#4daf1bc9\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"路是走出来的，而不是空想出来的。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"架构组\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"}]\\\",\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"size\\\":{\\\"width\\\":826,\\\"height\\\":958},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":33,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":30},\\\"body\\\":{\\\"column\\\":1},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"项目列表\\\"}}}', 'admin', '2025-08-07 17:10:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362261525692416', NULL, '1113362261391474688', NULL, 'JWaitMatter', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"h\\\":19,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"待办公文\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-yudu\\\\\\\",\\\\\\\"content\\\\\\\":23,\\\\\\\"desc\\\\\\\":\\\\\\\"今日已办3\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"待办流程\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-shuju\\\\\\\",\\\\\\\"content\\\\\\\":23,\\\\\\\"desc\\\\\\\":\\\\\\\"今日已办3\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"待办任务\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-tongzhi\\\\\\\",\\\\\\\"content\\\\\\\":23,\\\\\\\"desc\\\\\\\":\\\\\\\"今日已办3今日更新5\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":698,\\\"height\\\":353},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":25},\\\"body\\\":{\\\"column\\\":2},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"待办事项\\\"}}}', 'admin', '2025-08-07 17:10:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362261550858240', NULL, '1113362261391474688', NULL, 'JLine', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"type\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"visit\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"首页_近一周访问量\\\",\\\"dataSetApi\\\":\\\"selectcount(*)asvisit\\\\t,count(distinct(ip))asip\\\\t,DATE_FORMAT(create_time,\\'%Y-%m-%d\\')astian\\\\t,DATE_FORMAT(create_time,\\'%m-%d\\')astype\\\\tfromsys_logwherelog_type=1andcreate_time<=sysdate()andcreate_time>=(selectdate_sub(curdate(),interval7day))groupbytian,typeorderbytianasc\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":1252,\\\"height\\\":441},\\\"dataSetId\\\":\\\"1522503560003067906\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"visit\\\",\\\"text\\\":\\\"visit\\\",\\\"value\\\":\\\"visit\\\"},{\\\"label\\\":\\\"ip\\\",\\\"text\\\":\\\"ip\\\",\\\"value\\\":\\\"ip\\\"},{\\\"label\\\":\\\"tian\\\",\\\"text\\\":\\\"tian\\\",\\\"value\\\":\\\"tian\\\"},{\\\"label\\\":\\\"type\\\",\\\"text\\\":\\\"type\\\",\\\"value\\\":\\\"type\\\"}],\\\"dataSetType\\\":\\\"sql\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dictOptions\\\":{},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":57,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"text\\\":\\\"近一周在线访问量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:10:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362302755700736', NULL, '1113362302680203264', NULL, 'JText', '{\\\"chartData\\\":\\\"23年医美行业网络关注度\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1604,\\\"height\\\":78},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#23BAD9\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:11:08', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362302789255168', NULL, '1113362302680203264', NULL, 'JText', '{\\\"chartData\\\":\\\"公立整形外科热度指数TOP10美誉度\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":56},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:11:08', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362302806032384', NULL, '1113362302680203264', NULL, 'JText', '{\\\"chartData\\\":\\\"敏感信息与非敏感信息占比\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":56},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:11:08', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362302818615296', NULL, '1113362302680203264', NULL, 'JText', '{\\\"chartData\\\":\\\"医美行业事件\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":56},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:11:08', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362302835392512', NULL, '1113362302680203264', NULL, 'JText', '{\\\"chartData\\\":\\\"非公立连锁医美机构热度指数TOP10\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":8},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:11:08', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362302847975424', NULL, '1113362302680203264', NULL, 'JText', '{\\\"chartData\\\":\\\"医美行业全网信息量走势\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:11:08', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362302864752640', NULL, '1113362302680203264', NULL, 'JText', '{\\\"chartData\\\":\\\"医美项目热度\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"title\\\":{\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:11:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362302889918464', NULL, '1113362302680203264', NULL, 'JSmoothLine', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 15,    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 6,    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 19,    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":320},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":33,\\\"left\\\":23,\\\"bottom\\\":77,\\\"show\\\":false,\\\"right\\\":1},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\",\\\"smooth\\\":true}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"top\\\":1,\\\"left\\\":1,\\\"show\\\":false,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:11:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362302906695680', NULL, '1113362302680203264', NULL, 'JText', '{\\\"chartData\\\":\\\"公立整形外科热度指数TOP10\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:11:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362302915084288', NULL, '1113362302680203264', NULL, 'JMultipleBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"19岁以下\\\\\\\",    \\\\\\\"value\\\\\\\": 150,    \\\\\\\"type\\\\\\\": \\\\\\\"光子嫩肤\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"20-29岁\\\\\\\",    \\\\\\\"value\\\\\\\": 269,    \\\\\\\"type\\\\\\\": \\\\\\\"光子嫩肤\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"30-39岁\\\\\\\",    \\\\\\\"value\\\\\\\": 81,    \\\\\\\"type\\\\\\\": \\\\\\\"光子嫩肤\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"39岁以上\\\\\\\",    \\\\\\\"value\\\\\\\": 67,    \\\\\\\"type\\\\\\\": \\\\\\\"光子嫩肤\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"19岁以下\\\\\\\",    \\\\\\\"value\\\\\\\": 50,    \\\\\\\"type\\\\\\\": \\\\\\\"热玛吉\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"20-29岁\\\\\\\",    \\\\\\\"value\\\\\\\": 100,    \\\\\\\"type\\\\\\\": \\\\\\\"热玛吉\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"30-39岁\\\\\\\",    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"type\\\\\\\": \\\\\\\"热玛吉\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"39岁以上\\\\\\\",    \\\\\\\"value\\\\\\\": 45,    \\\\\\\"type\\\\\\\": \\\\\\\"热玛吉\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"19岁以下\\\\\\\",    \\\\\\\"value\\\\\\\": 13,    \\\\\\\"type\\\\\\\": \\\\\\\"水光针\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"20-29岁\\\\\\\",    \\\\\\\"value\\\\\\\": 24,    \\\\\\\"type\\\\\\\": \\\\\\\"水光针\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"30-39岁\\\\\\\",    \\\\\\\"value\\\\\\\": 5,    \\\\\\\"type\\\\\\\": \\\\\\\"水光针\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"39岁以上\\\\\\\",    \\\\\\\"value\\\\\\\": 25,    \\\\\\\"type\\\\\\\": \\\\\\\"水光针\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":320},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":29,\\\"left\\\":31,\\\"bottom\\\":62,\\\"right\\\":8},\\\"series\\\":[{\\\"label\\\":{\\\"color\\\":\\\"#787575\\\"}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"多数据对比柱形图\\\",\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:11:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362302936055808', NULL, '1113362302680203264', NULL, 'JText', '{\\\"chartData\\\":\\\"医美行业热点事件TOP50分类\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"bodyColor\\\":\\\"#000000\\\",\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:11:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362302948638720', NULL, '1113362302680203264', NULL, 'JText', '{\\\"chartData\\\":\\\"各年龄段对医美项目TOP3关注度对比\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:11:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362302961221632', NULL, '1113362302680203264', NULL, 'JMixLineBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"华美美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度指数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"美莱美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 9,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度指数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"爱美美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 5,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度指数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"一星美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 9,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度指数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"慧美美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 2,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度指数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"华美美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 33,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"美莱美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 35,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"爱美美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 37,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"一星美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 35,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"慧美美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 34.9,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":320},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"seriesType\\\":[{\\\"series\\\":\\\"传播热度指数\\\",\\\"type\\\":\\\"bar\\\"},{\\\"series\\\":\\\"美誉度\\\",\\\"type\\\":\\\"line\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":-33,\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":47,\\\"left\\\":24,\\\"bottom\\\":88,\\\"right\\\":27},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"折柱图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:11:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362302977998848', NULL, '1113362302680203264', NULL, 'JDynamicBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"江苏人民医院\\\\\\\",    \\\\\\\"value\\\\\\\": 55,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"上海人民医院\\\\\\\",    \\\\\\\"value\\\\\\\": 14,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京大学第一医院\\\\\\\",    \\\\\\\"value\\\\\\\": 31.5,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京朝阳医院\\\\\\\",    \\\\\\\"value\\\\\\\": 53,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京协和医院\\\\\\\",    \\\\\\\"value\\\\\\\": 41.9,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"八大处医院\\\\\\\",    \\\\\\\"value\\\\\\\": 61,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":320},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":109,\\\"bottom\\\":67,\\\"right\\\":24},\\\"series\\\":[{\\\"barWidth\\\":17,\\\"itemStyle\\\":{\\\"color\\\":\\\"#F099E1EE\\\"},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\"}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"动态柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:11:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362302994776064', NULL, '1113362302680203264', NULL, 'JDynamicBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"江苏人民医院\\\\\\\",    \\\\\\\"value\\\\\\\": 88,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"上海人民医院\\\\\\\",    \\\\\\\"value\\\\\\\": 76,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京大学第一医院\\\\\\\",    \\\\\\\"value\\\\\\\": 92,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京朝阳医院\\\\\\\",    \\\\\\\"value\\\\\\\": 53,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京协和医院\\\\\\\",    \\\\\\\"value\\\\\\\": 90,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"八大处医院\\\\\\\",    \\\\\\\"value\\\\\\\": 98.7,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":309},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":19,\\\"left\\\":113,\\\"bottom\\\":60,\\\"right\\\":31},\\\"series\\\":[{\\\"barWidth\\\":18,\\\"itemStyle\\\":{\\\"color\\\":\\\"#50E3C2\\\"}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"动态柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:11:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362303007358976', NULL, '1113362302680203264', NULL, 'JRing', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 46,    \\\\\\\"name\\\\\\\": \\\\\\\"涉机构事件\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 54,    \\\\\\\"name\\\\\\\": \\\\\\\"涉行业事件\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":508,\\\"height\\\":243},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#F099E1EE\\\"},{\\\"color\\\":\\\"#23BAD9\\\"}],\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":49,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\"},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":true,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"r\\\":26},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"outRadius\\\":61,\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础环形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"innerRadius\\\":29,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:11:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362303015747584', NULL, '1113362302680203264', NULL, 'JCommonTable', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"医美行业热点事件\\\\\\\": \\\\\\\"FDA批准新一代A型肉毒素上市\\\\\\\",    \\\\\\\"传播热度指数\\\\\\\": 6.25  },  {    \\\\\\\"医美行业热点事件\\\\\\\": \\\\\\\"多地医保局发布口腔种植收费调查登记的通知\\\\\\\",    \\\\\\\"传播热度指数\\\\\\\": 5.3  },  {    \\\\\\\"医美行业热点事件\\\\\\\": \\\\\\\"种植牙服务价格下调\\\\\\\",    \\\\\\\"传播热度指数\\\\\\\": 4  },  {    \\\\\\\"医美行业热点事件\\\\\\\": \\\\\\\"消保委2023年受理消费者投诉41万余件 涉及医美等多个方面\\\\\\\",    \\\\\\\"传播热度指数\\\\\\\": 7.23  },  {    \\\\\\\"医美行业热点事件\\\\\\\": \\\\\\\"轻医美-收费不透明\\\\\\\",    \\\\\\\"传播热度指数\\\\\\\": 3.6  },  {    \\\\\\\"医美行业热点事件\\\\\\\": \\\\\\\"专家提醒:低价医美有风险\\\\\\\",    \\\\\\\"传播热度指数\\\\\\\": 2  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":309},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":24,\\\"dataType\\\":1,\\\"h\\\":42,\\\"linkageConfig\\\":[],\\\"timeOut\\\":-1,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#C1EEF7\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}}}}', 'admin', '2025-08-07 17:11:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362303024136192', NULL, '1113362302680203264', NULL, 'JRing', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 4.61,    \\\\\\\"name\\\\\\\": \\\\\\\"敏感\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 95.39,    \\\\\\\"name\\\\\\\": \\\\\\\"非敏感\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":309},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#F099E1EE\\\"},{\\\"color\\\":\\\"#6AD5EB\\\"}],\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":50,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\"},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":true,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"r\\\":1,\\\"t\\\":1},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"outRadius\\\":78,\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础环形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"innerRadius\\\":49,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:11:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1113362303036719104', NULL, '1113362302680203264', NULL, 'JFunnel', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 15,    \\\\\\\"name\\\\\\\": \\\\\\\"美白针\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 5,    \\\\\\\"name\\\\\\\": \\\\\\\"光子嫩肤\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 23,    \\\\\\\"name\\\\\\\": \\\\\\\"半永久纹眉\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"name\\\\\\\": \\\\\\\"果酸换肤\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 234,    \\\\\\\"name\\\\\\\": \\\\\\\"全瓷牙\\\\\\\"  }]\\\",\\\"size\\\":{\\\"height\\\":300},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":30,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/funnel\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"horizontal\\\",\\\"t\\\":1},\\\"series\\\":[{\\\"top\\\":\\\"22%\\\",\\\"left\\\":\\\"10%\\\",\\\"bottom\\\":\\\"9%\\\",\\\"gap\\\":2,\\\"name\\\":\\\"Funnel\\\",\\\"width\\\":\\\"80%\\\",\\\"emphasis\\\":{\\\"label\\\":{\\\"fontSize\\\":20}},\\\"itemStyle\\\":{\\\"borderColor\\\":\\\"#fff\\\",\\\"borderWidth\\\":1},\\\"sort\\\":\\\"descending\\\",\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"inside\\\"},\\\"labelLine\\\":{\\\"lineStyle\\\":{\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"length\\\":10},\\\"type\\\":\\\"funnel\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a} <br/>{b} : {c}%\\\",\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础漏斗图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-08-07 17:11:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1151112776819200000', NULL, '1151069555267260416', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"集团业务综合管理平台\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":496.27777777777777,\\\"height\\\":60},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"fontFamily\\\":\\\"DIGITALDREAMFAT\\\",\\\"color\\\":\\\"#FFFFFFE6\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":6,\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1151112776861143040', NULL, '1151069555267260416', NULL, 'JTabToggle', '{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"label\\\\\\\": \\\\\\\"总览图\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": \\\\\\\"1\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"label\\\\\\\": \\\\\\\"新成业务板块\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": \\\\\\\"2\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"label\\\\\\\": \\\\\\\"万众业务板块\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": \\\\\\\"3\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"label\\\\\\\": \\\\\\\"投资业务板块\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": \\\\\\\"4\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"label\\\\\\\": \\\\\\\"建设业务板块\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": \\\\\\\"5\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"label\\\\\\\": \\\\\\\"车辆业务版块\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": \\\\\\\"6\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"height\\\":70},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"文本\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":680,\\\"dataType\\\":1,\\\"h\\\":70,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"personalizedMode\\\":false,\\\"normal\\\":{\\\"imgUrl\\\":\\\"\\\",\\\"backgroundColor\\\":\\\"#3A414D00\\\",\\\"borderColor\\\":\\\"#0692A4\\\",\\\"color\\\":\\\"#FFFFFF\\\",\\\"borderWidth\\\":0,\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to bottom\\\",\\\"startColor\\\":\\\"#FFFFFF\\\"},\\\"fontSize\\\":14,\\\"backgroundSize\\\":\\\"contain\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"active\\\":{\\\"imgUrl\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/背景1_1756454238980.png\\\",\\\"backgroundColor\\\":\\\"#0A73FF00\\\",\\\"borderColor\\\":\\\"#0692A4\\\",\\\"color\\\":\\\"#FFFFFF\\\",\\\"borderWidth\\\":0,\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to bottom\\\",\\\"startColor\\\":\\\"#FFFFFF\\\"},\\\"fontSize\\\":18,\\\"backgroundSize\\\":\\\"contain\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\"},\\\"time\\\":60,\\\"autoPlay\\\":true,\\\"items\\\":[{\\\"normalImgUrl\\\":\\\"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAEAAD/4QMyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA5LjEtYzAwMSA3OS4xNDYyODk5Nzc3LCAyMDIzLzA2LzI1LTIzOjU3OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuMiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1RTAzNTY5Mjc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1RTAzNTY5Mzc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVERkQ1Rjg5NzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVERkQ1RjhBNzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAGBYWIhgiNyAgN0IvKi9CQDU0NDVARkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgEaIiIsJiw1ISE1RjUsNUZGRjs7RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG/8AAEQgARgBiAwEiAAIRAQMRAf/EAGsAAQACAwEAAAAAAAAAAAAAAAABBQIDBAYBAQEBAAAAAAAAAAAAAAAAAAACARAAAwABBAADBQkBAAAAAAAAAAECESESAwQxQVFxgSITBWGRodHhMkJSYoIRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/APOgAAAAAAAAAASAACBKAywCQUxqABLQA7+l1Y5lV8jUwtMt4w34e37wOAFnfRieB1Nzdy81try9F+uB1Opxcsy6eXW/Kz6LQCsJLd9PrbM7nVQs3safjrlZ8l9hHV+n8fNEU97d7suWsLDx5oCpBev6ZwTcw3XxtpfFPks/1KIASiCUBmACktQAJUF10uKo4f4v5iq9tS6/b/0vEpTbHPycbVTTTnwAvdj5lUcUxMXK1U4e7Gdr1/PBx/TFyKeSePS3sS0/1r+Bw8vb5uZJXTaWpC7PKo+Uqaj0Ave5N8s1xTW93trjWnhrnX3ZNPWuo4eFJJp78tpvGKz5eGfX3lVPc54nZNtSRPb5olRNtSvBLQD0Td/PhuVUvPx6Nzo9E1jT2o8sdM97sS8q697ycwAlEEoDMAFMagAS1IAAAAAAAAAAEoglAZgApLUSASoAAAAAAAAAAAlAAZgApj//2Q==\\\",\\\"width\\\":98,\\\"activeImgUrl\\\":\\\"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAEAAD/4QMyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA5LjEtYzAwMSA3OS4xNDYyODk5Nzc3LCAyMDIzLzA2LzI1LTIzOjU3OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuMiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1RTA4REI1QTc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1RTA4REI1Qjc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVFMDhEQjU4NzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVFMDhEQjU5NzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAGBYWIhgiNyAgN0IvKi9CQDU0NDVARkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgEaIiIsJiw1ISE1RjUsNUZGRjs7RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG/8AAEQgARgBiAwEiAAIRAQMRAf/EAHIAAQEBAQEBAQAAAAAAAAAAAAABBQQDAgYBAQEBAQEAAAAAAAAAAAAAAAABAgQFEAACAQMCAwYHAQAAAAAAAAAAAQIRIQMSBEEiEzFRcZHBQmGBobEyUoIUEQEBAQEBAQEAAAAAAAAAAAAAARESAjEh/9oADAMBAAIRAxEAPwCgEPQcQAABAABACAAABAAAAA+wAUCA69rt45VKU2lFWrXjwJbn6smuQh3S2sVicoyjKUbyo+A2+3x5FFyd3qqq9yM9T6vNcINL/Ng0drk4Lm0U9eCJt9nDLGDeqsq1pSio/AncXms4hrvYYlKMW5c1aXXD+TILPUvxLLAgBpkABB6EANAae1xyjj9r11lplGv4/NGWekcs4NOLaa7DHqbGpcaunqpxxqMYSj2pUdf1dzm2Ouk1C0uWnnf6HLk3OTJaUm6Hz18ih01J6e4zzcxrqbrX3KlkjLGnq1aXD1+x5YJOOPEklR6qtpv3fAz47rLGOlSaRI7jJGKjGTSXcTi5i9TdbTc+tCqTTrzWdLOydreKPzx0Ld5k6635nOXz5xn1dACG2QAAehACoAAAQAAQAAAQigAAAgA9bCwBpCxLAEAgAAgAAgBFCAAAAB//2Q==\\\",\\\"compVals\\\":[\\\"es-drager-1756453564096-22\\\"],\\\"value\\\":\\\"1\\\"},{\\\"normalImgUrl\\\":\\\"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAEAAD/4QMyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA5LjEtYzAwMSA3OS4xNDYyODk5Nzc3LCAyMDIzLzA2LzI1LTIzOjU3OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuMiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1RTA4REI1RTc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1RTA4REI1Rjc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVFMDhEQjVDNzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVFMDhEQjVENzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAGBYWIhgiNyAgN0IvKi9CQDU0NDVARkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgEaIiIsJiw1ISE1RjUsNUZGRjs7RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG/8AAEQgARgCSAwEiAAIRAQMRAf/EAG0AAQADAQEBAAAAAAAAAAAAAAABAgUGBAMBAQAAAAAAAAAAAAAAAAAAAAAQAAIBAgQDBgMJAAAAAAAAAAABAhEDIVESBDFBYXGRIjITBfBiFIGh0fFCUpKiUxEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A59kFpFQAAAAAAAAAAAAAAASAAAAAAAABMipaRUAAaOz2UNyquUk8cNLph1AzgbF32+007kHOMW6KOht/jQ+dn22V6zGSVJSlx+WmGHaBlg2bex2/papTTxa1KuVeHTj2Hk2m09Sdtz8lxy4dAPCDQls9UbSt+aak3X5S+w2cL3iutUdVGNcW/j4oBmA1N1srW3t6nKSk/LGVKvu5EbfYRu2Hcco1qqeLhmn1fIDNBr3NjbtNpW7s6c8Eu+h8IbFz26uNUbl5soU494GeDWue3W/SUoTTajKT4+KmWVOBkgAAAAAEyKlpFQBpu9Pb7S3obi5yk8MlgZheVyU0lJ1UVRAff67cfvl3mt7fGMbcayVYuVynTTTxZHPlozlFNJ0UuIHUy9SVppUlNxioyWbWmUl0VeJ4PbU1S3OL8M9UXTDg08eBkrcXYyU1J6kqJ15ZEx3V6C0xnJJck2BsS1W7EaRk5uE4qieGqWNcsOBHtt1ygraUo080oxjSnWT/ADMr6y//AKS/kyj3FyUPTcnpXIDdW7jcVzQ5SUYylSaTjh/bErsLkXZ0W1V1jrrnJ0fcqGM91dlD0nJ6MitrcXLKahJxrl0A6OUpzhO4lLVH1FBL9S5Spzpy+48G3ttbdRlRyctcYPHUtNKUXXu5mX9RdclPU9UcE8isLs4S1xbUs+0Dorl1Ri4WYxlctqko05Pzaft4o5turqWhclblri2pLmUbriwAAAAACZFS0ioAAAAAAAJAAAAAAAAAAAAAAAAAllQAAAAAACQAAAAAAAAAAAAAAAAAB//Z\\\",\\\"activeImgUrl\\\":\\\"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAEAAD/4QMyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA5LjEtYzAwMSA3OS4xNDYyODk5Nzc3LCAyMDIzLzA2LzI1LTIzOjU3OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuMiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1RTAzNTY5Njc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1RTAzNTY5Nzc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVFMDM1Njk0NzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVFMDM1Njk1NzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAGBYWIhgiNyAgN0IvKi9CQDU0NDVARkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgEaIiIsJiw1ISE1RjUsNUZGRjs7RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG/8AAEQgARgCSAwEiAAIRAQMRAf/EAHQAAQADAQEAAAAAAAAAAAAAAAABBAUCAwEBAQEBAQAAAAAAAAAAAAAAAAECBAUQAAICAQMCAwYGAwAAAAAAAAABEQIDIRIEMVFhcZFBgcEiUhOhsdHxMhThYnIRAQEBAQEBAQAAAAAAAAAAAAABERICITH/2gAMAwEAAhEDEQA/AJAB6DiCAAABAAAAACCAAAABAAAACAAAACvUgAqABc43FrmUttP/AJ09SW59qyapA0snDxxvq7JexbWcYuC8uOtlo2+vhH6me41zVAGlTi4fty7Tq1uU9vh1K/H4++1Hf+N5/AdROaqAuW425UVP5WVp9x1w+NTL82RqNUqzq2OpmnN/FEF/kcXHhpubas+lXHwIw8RZMTu2p0jXp3nx7DqZq83cUAaeTiUxtpUyXjyj8jxpxHbCskQ93X/WOpOoc1SINK/Cp9tWpZNqtrPxjt+Rmlll/EswABUAQAPUAg0gXnkth49Nradm2UTq13ZJNzGiM2a1Lj1/tZvrfqaHDVVSs2U1bvHhEa9jIJVnVNJ6PqT152ZPiz1lb9t9scKLWaUPxejt5KSpwZUUsnpaU406NPUzVmyJ7lZylHuJrnyVUKzS8zHFzGuputK00wr5bO+21Vp3ev8Agjg5N1FRK1Y62SrHvb/cz/7OX67erOHmu67HZ7ew4uYnX1rrk1vv2OzVU7fMk6/rqc8TIni20UuVu87PX0RmPkZHT7bs9vY5x5r49KOJHHxe/rcdr3ra6Tmu9VX1ePu/Yp4KNYEnEu26tHruW2Ijz9PaZ/38m5W3Oa9DmuS1Lbqtp9xPFh0275EqumKtbXootWPY+sfEwW5Z1XJalt1XD7nLcmvPnGfV0IANMgAA9AAaQAIIAAAAEAAAAIAAAAihAAAAgAAAPbQjQA0hoAABABAAAEAAAQAAIAIoAAIAAAAAf//Z\\\",\\\"compVals\\\":[\\\"es-drager-1762421939532-37\\\"],\\\"value\\\":\\\"2\\\"},{\\\"normalImgUrl\\\":\\\"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAEAAD/4QMyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA5LjEtYzAwMSA3OS4xNDYyODk5Nzc3LCAyMDIzLzA2LzI1LTIzOjU3OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuMiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1RTAzNTY5QTc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1RTAzNTY5Qjc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVFMDM1Njk4NzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVFMDM1Njk5NzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAGBYWIhgiNyAgN0IvKi9CQDU0NDVARkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgEaIiIsJiw1ISE1RjUsNUZGRjs7RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG/8AAEQgARgCSAwEiAAIRAQMRAf/EAHIAAQADAQEBAAAAAAAAAAAAAAABAgUDBgQBAQEBAAAAAAAAAAAAAAAAAAACARAAAgEDAgMEBgsBAAAAAAAAAAECEQMEIRIxQVFhkTIT8HGBIhQFobHR8UJSYpLS4lMVEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwDz4AAAAAAAAAAAAAAABIAAAAAgSgJoCwKY5AAloAaGHhQyFVyaeum3TTtAzwbF35faadyDnGLdFHY2/toRiYFq/bjOW5NunH+rAyAbP/KUlPa1Wq2VfRtOunOmh8mLieZO25+C45cOwD4QaEsPdG2rfimpN1/SWwMOF73rrVHVRjXVv09KAZpJp5OFasW9zlJSfhjKlX3ciMfAjdsO45RrVU97h1T7XyAzQa9zBt2m0oXZ09VO+hwhguWOrjVG5cekKce8DPBq3Pl9vylKE02oyk+PvU6dKcDKAEoglAXABSXIAEqDTd2ePi29jcXKUnp0WhmF5XJTSUnVRVEB3+Ov/nl3m1gNRx46paSbq31a69dp5s+i3lXbdNsqbVRe11+sD0tudZzjGGsGlVvR+J9O0zfljdFCUZaT3RdHTwtPX01M15t9uu+XeVWVeiqKckvWwNeW63YjSMnNwnFUT0rLWvTTgR8uuuUFbSlGnilGMaU7W/vMr4y//pL9zKvIuSh5bk9q5Abiy43Fc2OUlGMpUmk4/wAtSuDci7Oy2qusd9esnR9yoY7yrsoeW5PZ0K2si5ZTUJONegHo5SnOE7iT3R8xQS/EuTpzpy+g+DHttY6jKm5y3xg9dy20pRdvdzMv4i45Ke57o6J9CsLs4S3xbUuvrA9DcuqMXCzGMrltUlGnJ+Lb7eKPON1dS0Lkrct8W1JcyjddWAJRBKAuACkuQAJUAAAAABIAAAAAAAAAAAACUQSgLgApLkACVAAAEgAAAAAAAAAAAAAAAlAAXABTH//Z\\\",\\\"activeImgUrl\\\":\\\"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAEAAD/4QMyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA5LjEtYzAwMSA3OS4xNDYyODk5Nzc3LCAyMDIzLzA2LzI1LTIzOjU3OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuMiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1RTA4REI2Mjc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1RTA5ODhBMDc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVFMDhEQjYwNzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVFMDhEQjYxNzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAGBYWIhgiNyAgN0IvKi9CQDU0NDVARkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgEaIiIsJiw1ISE1RjUsNUZGRjs7RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG/8AAEQgARgCSAwEiAAIRAQMRAf/EAHYAAQADAQEAAAAAAAAAAAAAAAABBAUCAwEBAQEBAQAAAAAAAAAAAAAAAAECBAUQAAIBAwIDBAgHAAAAAAAAAAABAhESAyEEMVGRQWFxIoGxwfEyUhMUodHhYnLiFREBAQEBAQEBAAAAAAAAAAAAAAEREgIhMf/aAAwDAQACEQMRAD8AkAHoOIIAAAEAAAAAIIAAAAEAAAAIAAAAK9SACoAFzbbWOZVbaf8AHTqS3PtWTVIGlk2eOl8XJLsVrI2+0x5YKTrV6cf6sx3M1rms4Gn/AJ6kpWtVr5avxrXTtpoVtvt75Qc/hnX8C9Q5qoC5LbXKCh8UlKte462e2hl82RqmqUa6tjqZqc38UQX9xtceGFzbUnwi6ewjDs1kxObarpTXhzr38idTNXm7igDTybSGNtKGSdPCnqPGG0csKyUo7uP7acR1DmqRBpT2UPpqUJJtKUn305eozSyy/iWYAAqAIAHqAQaQLzySw7eFracm2UTqU3JJN1pojNmtS49fus3zvqam0ajhjqlxbr4vv8DEPWG4yQpa6U0XWpn152ZF8+sv1uwlWUko6xa9PFlHYN0UZJ6Sui6acGnqUXusr1vfU5W4yrRSl1McXLGu5rSlWGFeWTnbKK05vX9CNjkugoJSjTjJKNPS37zP+5y/PLqzh5puNjk7eReLmJ19a63MZ32OTUU5eZJx/PU52mRPFbBVdVd4yevRGY9xkcPpuTt5HOPNPHpB0qOPi9/W45TnGU0nWN6ivm7/AEe4p4INYEnSrldGD1uVtKU8enaZ/wBfJcpXOseBzHJKErotp8xPFh0255EouGKMZTgqSjTsfG32mC3VnUMkoSui6Pmct1NefOM+roQAaZAAB6AA0gAQQAAAAIAAAAQAAABFCAAABAAAAe2hGgBpDQAEAgAAAAIAAAgAAACKgAAQAAAAA//Z\\\",\\\"compVals\\\":[\\\"es-drager-1756456982092-28\\\"],\\\"value\\\":\\\"3\\\"},{\\\"normalImgUrl\\\":\\\"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAEAAD/4QMyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA5LjEtYzAwMSA3OS4xNDYyODk5Nzc3LCAyMDIzLzA2LzI1LTIzOjU3OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuMiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1RTA0N0Y5Rjc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1RTA0N0ZBMDc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVFMDQ3RjlENzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVFMDQ3RjlFNzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAGBYWIhgiNyAgN0IvKi9CQDU0NDVARkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgEaIiIsJiw1ISE1RjUsNUZGRjs7RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG/8AAEQgARgCSAwEiAAIRAQMRAf/EAG0AAQADAQEBAAAAAAAAAAAAAAABAgUEBgMBAQAAAAAAAAAAAAAAAAAAAAAQAAIBAgMEBwgDAAAAAAAAAAABAhEDIRIEMUFRIvBhcYGRMhOhsdHxQpIUBcFS0hEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AwmQWZUAAAAAAAAAAAABIAAAAAAAAAAASypZlQABo2NLauWfUk5RlXLtWV/JbQM4G8/1liUFlk60k61WNPh1d5mw0ue1Wks9eXDll2MDjBrT0Npu5btZnctpb1R+zcc+m0jnO36nkm5L7QOEHfLR5o21b801JuvUX0Gjhe5rjVHVRjXFvp0oBnA0tTorVi3mcpKT8sZU/jcRY0Mbll3HKNaqnNs4p9b3AZwNa5ordptKF2dOynuPjDQuVhXGqNy28IU2+IGeDUn+vh6SlCabUZSe3mpw9xlgAAAAAEsqWZUAeg0Df41eaibVMeKxVMeOzrPPn1V64kkpNZdlHsA9LdvQdtJt8ykvr+FfHuMzSepPTyafkkmszwwxocS1t9fXLxPlC/ctusZNY17wN+ay2pXo20qxwShzqT216lt6Y8v6xtpRkpYTzRdHTytPHpiZcdTdjP1FJ5uNSVqr0VRTkl2sDWlmt2FSMnNxlFUTwrLHsw2EfrrrlBQSlGnmlGMad7fzMv8u//eX3Mq79yUcjk8q3Aba1UbiuZHKSinKk0nH/AFiV0NyLs5YKrrHPXjJ4+CMd6q7KHpuTy8CLd+5aTUG414AehlKc4Tmk80c6gl9S3Om+m72HDp7bWnUZUzOWeMHjmWWlKLr8N5mfkXHJTzOscEysLs4SzxbUuPaB6C5dSi4WoxlO2qSjTc/Nl79qPOt1dS0Lkrcs8XSXEo3XFgAAAAAEsqWZUAAAABIAAAAAAAAAAAAAAAAAAASyoAAAASAAAAAAAAAAAAAAAAAAAAA//9k=\\\",\\\"activeImgUrl\\\":\\\"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAEAAD/4QMyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA5LjEtYzAwMSA3OS4xNDYyODk5Nzc3LCAyMDIzLzA2LzI1LTIzOjU3OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuMiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1RTA0N0Y5Qjc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1RTA0N0Y5Qzc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVFMDM1NjlDNzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVFMDQ3RjlBNzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAGBYWIhgiNyAgN0IvKi9CQDU0NDVARkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgEaIiIsJiw1ISE1RjUsNUZGRjs7RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG/8AAEQgARgCSAwEiAAIRAQMRAf/EAHUAAQADAQEAAAAAAAAAAAAAAAABBAUCAwEBAQEBAQAAAAAAAAAAAAAAAAECBAUQAAIBAwIDBAkFAAAAAAAAAAABAhESAyEEMVGRQYEiMvBhcbHB0fFSE6HhQmIUEQEBAQEBAQEAAAAAAAAAAAAAARESAiEx/9oADAMBAAIRAxEAPwCQAeg4ggAAAQAAAAAggAAAAQAAAAgAAAAr1IAKgAXcW3xzxXyqnWnZT0oS3Fk1RBrvYYnFWt1o9ar06FGOC7HWkr6+HTSRme5Wr5sVgaMtpjbnDHc5wXNa/oeGDbXThf5ZtroOonNVAXJba5QUPNJSr3HWz20MviyNU1SjXVsdTNOb+KIL+42uPDC5tqT4RdPgRh2iyYnNtV0prw519fInUzV5u4oA08m0hjbShknT2U9x4w2jlhWSlHdx/rTiOoc1SINKeyh+NShJNqMpP105e4zSyy/iWYAAqAIAHqAQaQNnZ1/BXWnCnfxVNTGO1lmqJSapw1Mepsa83G9kyxcEm+Nfu+Vepn7e+WCTT8kk1Xhp2FVbvMv5s84ZZwdYtrWveYniyN31tbMlbjeRQSrHRKPiT+RX2DbSjJPzXRdNODT1M9Z8kZXqTu5hbjKtFKXUcXMOputKVYYV4ZOdsorTm9f2I2OS6CglKNOMko072/qZ/wDpy/fLqzh5puNjk7eQ4+YnX1rrcxnfY5NRTl4knH56nO0yJ4rYKrqrvbJ69EZj3GRw/G5O3kc4808ekHSo4+L39bjlOcZTSdY3qK+71930KeCDWBJ0q5XRg9blbSlPb07TP/PkuUrnWPA5jklCV0W1LmJ4sOm3PIlFwxRjKcFSUadj42/EwW6s6hklCV0XR8zluprz5xn1dCADTIAAPQAGkACCAAAABAAAACAAAAIoQAAAIAkEAD20I0ANIaAAgEAAAABAAAEAAAARUAAAQAAAAH//2Q==\\\",\\\"compVals\\\":[\\\"es-drager-1762481722941-1\\\"],\\\"value\\\":\\\"4\\\"},{\\\"normalImgUrl\\\":\\\"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAEAAD/4QMyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA5LjEtYzAwMSA3OS4xNDYyODk5Nzc3LCAyMDIzLzA2LzI1LTIzOjU3OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuMiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1RTA5ODhBMzc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1RTA5ODhBNDc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVFMDk4OEExNzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVFMDk4OEEyNzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAGBYWIhgiNyAgN0IvKi9CQDU0NDVARkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgEaIiIsJiw1ISE1RjUsNUZGRjs7RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG/8AAEQgARgCSAwEiAAIRAQMRAf/EAHAAAQADAQEBAAAAAAAAAAAAAAABAgUDBAYBAQEBAAAAAAAAAAAAAAAAAAACARAAAgECAwUGBQQDAAAAAAAAAAECEQMhEgQxQVFhMvBxkaEiE7FCUmIFgfGSFKLSIxEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AwAAAAAAAAAAAAAAAkAAAAAABAlATQFgUxyABLQA99uxYdn3ZOdU6NKm0DwA1Hp9MrSvP3MrdF0+OzZuKWtCrmnc0051wVf8AGn1PcBnA1p6Gy3ct2szuW0t6o/LcefS6TPO3n6JuSw5AeEHvlo80bat9U1Juv2l9Bo4XvVdao6qMa4t9u1AM4GlqdFasW8zlJSfTGVK+W4afQxuWXcco1qqerZxT5vcBmg17mit2m0oXZ07qfA4Q0Llp1cao3LbwhTb4gZ4NW5+Ph7SlCabUZSe31U4fAygBKIJQFwAUlyABKg29PNw0uW7NRi9iwrk+ZLm/IxABvPWx9lScf+Tk4Zftp8TlZvRs6ZytRxzLqxq+Rku5Jw9uvpTrTmdI6m7FRipNKDrEDenHLblejbSrHBKHrUntryW3tj5PxjbUYyUsJ5oujp0tPHtiZi1N1T9zM83GvbwC1V6KopyS72BryzW7EaRk5uMoqieFZY92Gwj8ddcoKCUo06pRjGlObf7mV/cv/XL+TKvUXJQ9tyeVbgNxauNxXMjlJRUpUmk4/wC2JTQ3IuzktqrrHPXjJ4+CoZD1V2UPbcnk4Fbd+5aTUJONeAH0UpTnCc0nmjnUEvmW50303eR4NPba06jKmZyzxg8cyy0pRc/DeZn9i45KeZ5o4JlYXZwlni2pce8D6G5dSi4Woxlctqko03Pqy/rtR843V1LQuStyzxdJcSjdcWAJRBKAuACkuQAJUAAAASAAAAAAAAAAAAAACUQSgLgApLkACVAAAkAAAAAAAAAAAAAAAAlAAXABTH//2Q==\\\",\\\"activeImgUrl\\\":\\\"drag/lib/img/navItem05_hover.jpg\\\",\\\"compVals\\\":[\\\"es-drager-1762494714798-7\\\"],\\\"value\\\":\\\"5\\\"},{\\\"marginRight\\\":0,\\\"normalBackgroundImage\\\":\\\"\\\",\\\"marginBottom\\\":0,\\\"compVals\\\":[\\\"es-drager-1756453915928-25\\\"],\\\"activeBackgroundImage\\\":\\\"\\\",\\\"value\\\":\\\"6\\\",\\\"showHideComps\\\":[],\\\"marginTop\\\":0,\\\"marginLeft\\\":0}],\\\"currentValue\\\":\\\"1\\\"}}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1151112776882114560', NULL, '1151069555267260416', NULL, 'JGroup', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\"}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1151112776903086080', NULL, '1151069555267260416', NULL, 'JGroup', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\"}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1151112776924057600', NULL, '1151069555267260416', NULL, 'JGroup', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\"}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1151112776945029120', NULL, '1151069555267260416', NULL, 'JGroup', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1701,\\\"height\\\":892.5},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\"}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1151112776961806336', NULL, '1151069555267260416', NULL, 'JGroup', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1863.9707102873572,\\\"height\\\":954.8876076075659},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\"}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1151112776978583552', NULL, '1151069555267260416', NULL, 'JGroup', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\"}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1151112777012137984', NULL, '1151069555267260416', NULL, 'JGroup', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1858.2777764077778,\\\"height\\\":964.8264952628838},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\"}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1151112777028915200', NULL, '1151069555267260416', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":45.833333333333314,\\\"height\\\":45.833333333333314},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题组件-20_05_1756436293567.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1151112777045692416', NULL, '1151069555267260416', NULL, 'JCurrentTime', '{\\\"chartData\\\":\\\"\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":309.1666666666667,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":280,\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"hourlySystem\\\":\\\"24\\\",\\\"format\\\":\\\"YYYY-MM-DD hh:mm:ss\\\",\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"showWeek\\\":\\\"show\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1151112777075052544', NULL, '1151069555267260416', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1911.6666666666667,\\\"height\\\":70},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/title_1756435933097.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1151112777112801280', NULL, '1151069555267260416', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":679,\\\"height\\\":46.72222222222222},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/导航背景_1756451547138.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1517018288431857665', NULL, '1516747539813007362', NULL, 'JPie', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"column1\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"column8\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"项目性质收入统计JSON\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"[{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-电商业务\\\\\\\",\\\\\\\"column2\\\\\\\":4865.41,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":4865.41},{\\\\\\\"column1\\\\\\\":\\\\\\\"统筹型\\\\\\\",\\\\\\\"column2\\\\\\\":35767081.88,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":35767081.88},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-非股东\\\\\\\",\\\\\\\"column2\\\\\\\":1487045.35,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":1487045.35},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-参控股\\\\\\\",\\\\\\\"column2\\\\\\\":382690.56,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":382690.56},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-员工福利\\\\\\\",\\\\\\\"column2\\\\\\\":256684.91,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":265684.91},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-再保险\\\\\\\",\\\\\\\"column2\\\\\\\":563451.03,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":563451.03},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-海外业务\\\\\\\",\\\\\\\"column2\\\\\\\":760576.25,\\\\\\\"column3\\\\\\\":770458.75,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":1531035.00},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-风险咨询\\\\\\\",\\\\\\\"column2\\\\\\\":0.00,\\\\\\\"column3\\\\\\\":910183.93,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":226415.09,\\\\\\\"column8\\\\\\\":1136599.02}]\\\",\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"height\\\":420},\\\"dataSetId\\\":\\\"1516748630344630273\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"项目性质\\\",\\\"text\\\":\\\"项目性质\\\",\\\"value\\\":\\\"column1\\\"},{\\\"label\\\":\\\"保险公估费\\\",\\\"text\\\":\\\"保险公估费\\\",\\\"value\\\":\\\"column5\\\"},{\\\"label\\\":\\\"承保公估评估费\\\",\\\"text\\\":\\\"承保公估评估费\\\",\\\"value\\\":\\\"column4\\\"},{\\\"label\\\":\\\"风险咨询费\\\",\\\"text\\\":\\\"风险咨询费\\\",\\\"value\\\":\\\"column3\\\"},{\\\"label\\\":\\\"保险经纪佣金费\\\",\\\"text\\\":\\\"保险经纪佣金费\\\",\\\"value\\\":\\\"column2\\\"},{\\\"label\\\":\\\"总计\\\",\\\"text\\\":\\\"总计\\\",\\\"value\\\":\\\"column8\\\"},{\\\"label\\\":\\\"内控咨询费\\\",\\\"text\\\":\\\"内控咨询费\\\",\\\"value\\\":\\\"column7\\\"},{\\\"label\\\":\\\"投标咨询费\\\",\\\"text\\\":\\\"投标咨询费\\\",\\\"value\\\":\\\"column6\\\"}],\\\"dataSetType\\\":\\\"json\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"AccessFrom\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0,0,0,0.5)\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"基础饼图\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-04-21 13:51:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1517018288566075393', NULL, '1516747539813007362', NULL, 'JBar', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"column1\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"column8\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"项目性质收入统计JSON\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"[{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-电商业务\\\\\\\",\\\\\\\"column2\\\\\\\":4865.41,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":4865.41},{\\\\\\\"column1\\\\\\\":\\\\\\\"统筹型\\\\\\\",\\\\\\\"column2\\\\\\\":35767081.88,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":35767081.88},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-非股东\\\\\\\",\\\\\\\"column2\\\\\\\":1487045.35,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":1487045.35},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-参控股\\\\\\\",\\\\\\\"column2\\\\\\\":382690.56,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":382690.56},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-员工福利\\\\\\\",\\\\\\\"column2\\\\\\\":256684.91,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":265684.91},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-再保险\\\\\\\",\\\\\\\"column2\\\\\\\":563451.03,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":563451.03},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-海外业务\\\\\\\",\\\\\\\"column2\\\\\\\":760576.25,\\\\\\\"column3\\\\\\\":770458.75,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":1531035.00},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-风险咨询\\\\\\\",\\\\\\\"column2\\\\\\\":0.00,\\\\\\\"column3\\\\\\\":910183.93,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":226415.09,\\\\\\\"column8\\\\\\\":1136599.02}]\\\",\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"height\\\":420},\\\"dataSetId\\\":\\\"1516748630344630273\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"项目性质\\\",\\\"text\\\":\\\"项目性质\\\",\\\"value\\\":\\\"column1\\\"},{\\\"label\\\":\\\"保险公估费\\\",\\\"text\\\":\\\"保险公估费\\\",\\\"value\\\":\\\"column5\\\"},{\\\"label\\\":\\\"承保公估评估费\\\",\\\"text\\\":\\\"承保公估评估费\\\",\\\"value\\\":\\\"column4\\\"},{\\\"label\\\":\\\"风险咨询费\\\",\\\"text\\\":\\\"风险咨询费\\\",\\\"value\\\":\\\"column3\\\"},{\\\"label\\\":\\\"保险经纪佣金费\\\",\\\"text\\\":\\\"保险经纪佣金费\\\",\\\"value\\\":\\\"column2\\\"},{\\\"label\\\":\\\"总计\\\",\\\"text\\\":\\\"总计\\\",\\\"value\\\":\\\"column8\\\"},{\\\"label\\\":\\\"内控咨询费\\\",\\\"text\\\":\\\"内控咨询费\\\",\\\"value\\\":\\\"column7\\\"},{\\\"label\\\":\\\"投标咨询费\\\",\\\"text\\\":\\\"投标咨询费\\\",\\\"value\\\":\\\"column6\\\"}],\\\"dataSetType\\\":\\\"json\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"showBackground\\\":true,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"rgba(180,180,180,0.2)\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-04-21 13:51:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1517018288670932994', NULL, '1516747539813007362', NULL, 'JLine', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"column1\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"column8\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"项目性质收入统计JSON\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"[{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-电商业务\\\\\\\",\\\\\\\"column2\\\\\\\":4865.41,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":4865.41},{\\\\\\\"column1\\\\\\\":\\\\\\\"统筹型\\\\\\\",\\\\\\\"column2\\\\\\\":35767081.88,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":35767081.88},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-非股东\\\\\\\",\\\\\\\"column2\\\\\\\":1487045.35,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":1487045.35},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-参控股\\\\\\\",\\\\\\\"column2\\\\\\\":382690.56,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":382690.56},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-员工福利\\\\\\\",\\\\\\\"column2\\\\\\\":256684.91,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":265684.91},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-再保险\\\\\\\",\\\\\\\"column2\\\\\\\":563451.03,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":563451.03},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-海外业务\\\\\\\",\\\\\\\"column2\\\\\\\":760576.25,\\\\\\\"column3\\\\\\\":770458.75,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":1531035.00},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-风险咨询\\\\\\\",\\\\\\\"column2\\\\\\\":0.00,\\\\\\\"column3\\\\\\\":910183.93,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":226415.09,\\\\\\\"column8\\\\\\\":1136599.02}]\\\",\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":1650,\\\"height\\\":474},\\\"dataSetId\\\":\\\"1516748630344630273\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"项目性质\\\",\\\"text\\\":\\\"项目性质\\\",\\\"value\\\":\\\"column1\\\"},{\\\"label\\\":\\\"保险公估费\\\",\\\"text\\\":\\\"保险公估费\\\",\\\"value\\\":\\\"column5\\\"},{\\\"label\\\":\\\"承保公估评估费\\\",\\\"text\\\":\\\"承保公估评估费\\\",\\\"value\\\":\\\"column4\\\"},{\\\"label\\\":\\\"风险咨询费\\\",\\\"text\\\":\\\"风险咨询费\\\",\\\"value\\\":\\\"column3\\\"},{\\\"label\\\":\\\"保险经纪佣金费\\\",\\\"text\\\":\\\"保险经纪佣金费\\\",\\\"value\\\":\\\"column2\\\"},{\\\"label\\\":\\\"总计\\\",\\\"text\\\":\\\"总计\\\",\\\"value\\\":\\\"column8\\\"},{\\\"label\\\":\\\"内控咨询费\\\",\\\"text\\\":\\\"内控咨询费\\\",\\\"value\\\":\\\"column7\\\"},{\\\"label\\\":\\\"投标咨询费\\\",\\\"text\\\":\\\"投标咨询费\\\",\\\"value\\\":\\\"column6\\\"}],\\\"dataSetType\\\":\\\"json\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"text\\\":\\\"基础折线图\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-04-21 13:52:00', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1517018288775790593', NULL, '1516747539813007362', NULL, 'JCommonTable', '{\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"项目性质收入统计JSON\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"[{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-电商业务\\\\\\\",\\\\\\\"column2\\\\\\\":4865.41,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":4865.41},{\\\\\\\"column1\\\\\\\":\\\\\\\"统筹型\\\\\\\",\\\\\\\"column2\\\\\\\":35767081.88,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":35767081.88},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-非股东\\\\\\\",\\\\\\\"column2\\\\\\\":1487045.35,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":1487045.35},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-参控股\\\\\\\",\\\\\\\"column2\\\\\\\":382690.56,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":382690.56},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-员工福利\\\\\\\",\\\\\\\"column2\\\\\\\":256684.91,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":265684.91},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-再保险\\\\\\\",\\\\\\\"column2\\\\\\\":563451.03,\\\\\\\"column3\\\\\\\":0,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":563451.03},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-海外业务\\\\\\\",\\\\\\\"column2\\\\\\\":760576.25,\\\\\\\"column3\\\\\\\":770458.75,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":0,\\\\\\\"column8\\\\\\\":1531035.00},{\\\\\\\"column1\\\\\\\":\\\\\\\"市场化-风险咨询\\\\\\\",\\\\\\\"column2\\\\\\\":0.00,\\\\\\\"column3\\\\\\\":910183.93,\\\\\\\"column4\\\\\\\":0,\\\\\\\"column5\\\\\\\":0,\\\\\\\"column6\\\\\\\":0,\\\\\\\"column7\\\\\\\":226415.09,\\\\\\\"column8\\\\\\\":1136599.02}]\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"width\\\":1650,\\\"height\\\":518},\\\"dataSetId\\\":\\\"1516748630344630273\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"项目性质\\\",\\\"text\\\":\\\"项目性质\\\",\\\"value\\\":\\\"column1\\\"},{\\\"label\\\":\\\"保险公估费\\\",\\\"text\\\":\\\"保险公估费\\\",\\\"value\\\":\\\"column5\\\"},{\\\"label\\\":\\\"承保公估评估费\\\",\\\"text\\\":\\\"承保公估评估费\\\",\\\"value\\\":\\\"column4\\\"},{\\\"label\\\":\\\"风险咨询费\\\",\\\"text\\\":\\\"风险咨询费\\\",\\\"value\\\":\\\"column3\\\"},{\\\"label\\\":\\\"保险经纪佣金费\\\",\\\"text\\\":\\\"保险经纪佣金费\\\",\\\"value\\\":\\\"column2\\\"},{\\\"label\\\":\\\"总计\\\",\\\"text\\\":\\\"总计\\\",\\\"value\\\":\\\"column8\\\"},{\\\"label\\\":\\\"内控咨询费\\\",\\\"text\\\":\\\"内控咨询费\\\",\\\"value\\\":\\\"column7\\\"},{\\\"label\\\":\\\"投标咨询费\\\",\\\"text\\\":\\\"投标咨询费\\\",\\\"value\\\":\\\"column6\\\"}],\\\"dataSetType\\\":\\\"json\\\",\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izTotal\\\":\\\"Y\\\",\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"column1\\\",\\\"title\\\":\\\"项目性质\\\"},{\\\"izTotal\\\":\\\"Y\\\",\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"column5\\\",\\\"title\\\":\\\"保险公估费\\\"},{\\\"izTotal\\\":\\\"Y\\\",\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"column4\\\",\\\"title\\\":\\\"承保公估评估费\\\"},{\\\"izTotal\\\":\\\"Y\\\",\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"column3\\\",\\\"title\\\":\\\"风险咨询费\\\"},{\\\"izTotal\\\":\\\"Y\\\",\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"column2\\\",\\\"title\\\":\\\"保险经纪佣金费\\\"},{\\\"izTotal\\\":\\\"Y\\\",\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"column8\\\",\\\"title\\\":\\\"总计\\\"},{\\\"izTotal\\\":\\\"Y\\\",\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"column7\\\",\\\"title\\\":\\\"内控咨询费\\\"},{\\\"izTotal\\\":\\\"Y\\\",\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"column6\\\",\\\"title\\\":\\\"投标咨询费\\\"}]}}', 'admin', '2022-04-21 13:52:00', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1517064663387373570', NULL, '1517062686729338882', NULL, 'JLine', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"图表API示例-年龄占比\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/jingwu/nianling\\\",\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":889,\\\"height\\\":474},\\\"dataSetId\\\":\\\"1517046231342284802\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"年龄\\\",\\\"text\\\":\\\"年龄\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"数量\\\",\\\"text\\\":\\\"数量\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":false,\\\"text\\\":\\\"基础折线图\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-04-21 16:56:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1517064663563534337', NULL, '1517062686729338882', NULL, 'JRing', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"图表API示例-年龄占比\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/jingwu/nianling\\\",\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":751,\\\"height\\\":474},\\\"dataSetId\\\":\\\"1517046231342284802\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"年龄\\\",\\\"text\\\":\\\"年龄\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"数量\\\",\\\"text\\\":\\\"数量\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"AccessFrom\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础环形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-04-21 16:56:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1517064663664197634', NULL, '1517062686729338882', NULL, 'JFunnel', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"图表API示例-年龄占比\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/jingwu/nianling\\\",\\\"url\\\":\\\"http://api.jeecg.com/mock/26/funnel\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":335,\\\\\\\"name\\\\\\\":\\\\\\\"直接访问\\\\\\\"},{\\\\\\\"value\\\\\\\":310,\\\\\\\"name\\\\\\\":\\\\\\\"邮件营销\\\\\\\"},{\\\\\\\"value\\\\\\\":234,\\\\\\\"name\\\\\\\":\\\\\\\"联盟广告\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":889,\\\"height\\\":529},\\\"dataSetId\\\":\\\"1517046231342284802\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"年龄\\\",\\\"text\\\":\\\"年龄\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"数量\\\",\\\"text\\\":\\\"数量\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"legend\\\":{\\\"orient\\\":\\\"horizontal\\\"},\\\"series\\\":[{\\\"left\\\":\\\"10%\\\",\\\"gap\\\":2,\\\"name\\\":\\\"Funnel\\\",\\\"width\\\":\\\"80%\\\",\\\"emphasis\\\":{\\\"label\\\":{\\\"fontSize\\\":20}},\\\"itemStyle\\\":{\\\"borderColor\\\":\\\"#fff\\\",\\\"borderWidth\\\":1},\\\"sort\\\":\\\"descending\\\",\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"inside\\\"},\\\"labelLine\\\":{\\\"lineStyle\\\":{\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"length\\\":10},\\\"type\\\":\\\"funnel\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a}<br/>{b}:{c}%\\\",\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础漏斗图\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-04-21 16:56:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1517064663798415361', NULL, '1517062686729338882', NULL, 'JCommonTable', '{\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"图表API示例-年龄占比\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/jingwu/nianling\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"width\\\":751,\\\"height\\\":529},\\\"dataSetId\\\":\\\"1517046231342284802\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"年龄\\\",\\\"text\\\":\\\"年龄\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"数量\\\",\\\"text\\\":\\\"数量\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"name\\\",\\\"title\\\":\\\"年龄\\\"},{\\\"izTotal\\\":\\\"Y\\\",\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"value\\\",\\\"title\\\":\\\"数量\\\"}]}}', 'admin', '2022-04-21 16:56:16', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1519994699446870018', NULL, '1519992838245441538', NULL, 'JBar', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"钻取api\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/drilling/deptuser\\\",\\\"drillData\\\":[{\\\"source\\\":\\\"name\\\",\\\"target\\\":\\\"name\\\"}],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"height\\\":420},\\\"dataSetId\\\":\\\"1519274169102020610\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"name\\\":\\\"销售量\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"name\\\":\\\"类别\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"showBackground\\\":true,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"rgba(180,180,180,0.2)\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"部门销售统计\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'jeecg', '2022-04-29 18:59:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1519994699518173186', NULL, '1519992838245441538', NULL, 'JPie', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"钻取api\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/drilling/deptuser\\\",\\\"drillData\\\":[{\\\"source\\\":\\\"name\\\",\\\"target\\\":\\\"name\\\"}],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"height\\\":420},\\\"dataSetId\\\":\\\"1519274169102020610\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"AccessFrom\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0,0,0,0.5)\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"基础饼图\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'jeecg', '2022-04-29 18:59:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522466576295534593', NULL, '1522460228585529346', NULL, 'JRing', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"18~30岁\\\\\\\",\\\\\\\"value\\\\\\\":5500},{\\\\\\\"name\\\\\\\":\\\\\\\"30~40岁\\\\\\\",\\\\\\\"value\\\\\\\":2000},{\\\\\\\"name\\\\\\\":\\\\\\\"40~60岁\\\\\\\",\\\\\\\"value\\\\\\\":1500},{\\\\\\\"name\\\\\\\":\\\\\\\"60岁以上\\\\\\\",\\\\\\\"value\\\\\\\":1200},{\\\\\\\"name\\\\\\\":\\\\\\\"18岁以下\\\\\\\",\\\\\\\"value\\\\\\\":800}]\\\",\\\"size\\\":{\\\"width\\\":411,\\\"height\\\":320},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"AccessFrom\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"年龄占比\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 14:41:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522466576429752321', NULL, '1522460228585529346', NULL, 'JBar', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"石家庄\\\\\\\",\\\\\\\"value\\\\\\\":51},{\\\\\\\"name\\\\\\\":\\\\\\\"邢台\\\\\\\",\\\\\\\"value\\\\\\\":121},{\\\\\\\"name\\\\\\\":\\\\\\\"邯郸\\\\\\\",\\\\\\\"value\\\\\\\":78},{\\\\\\\"name\\\\\\\":\\\\\\\"保定\\\\\\\",\\\\\\\"value\\\\\\\":66},{\\\\\\\"name\\\\\\\":\\\\\\\"廊坊\\\\\\\",\\\\\\\"value\\\\\\\":80},{\\\\\\\"name\\\\\\\":\\\\\\\"唐山\\\\\\\",\\\\\\\"value\\\\\\\":100}]\\\",\\\"size\\\":{\\\"width\\\":411,\\\"height\\\":254},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"bottom\\\":63,\\\"show\\\":false,\\\"right\\\":14},\\\"series\\\":[{\\\"data\\\":[],\\\"showBackground\\\":true,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"rgba(180,180,180,0.2)\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"游客地区分部\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 14:41:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522466576526221314', NULL, '1522460228585529346', NULL, 'JLine', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"5/1\\\\\\\",\\\\\\\"value\\\\\\\":1000},{\\\\\\\"name\\\\\\\":\\\\\\\"5/2\\\\\\\",\\\\\\\"value\\\\\\\":7350},{\\\\\\\"name\\\\\\\":\\\\\\\"5/3\\\\\\\",\\\\\\\"value\\\\\\\":5800},{\\\\\\\"name\\\\\\\":\\\\\\\"5/4\\\\\\\",\\\\\\\"value\\\\\\\":6000},{\\\\\\\"name\\\\\\\":\\\\\\\"5/5\\\\\\\",\\\\\\\"value\\\\\\\":3000}]\\\",\\\"size\\\":{\\\"width\\\":411,\\\"height\\\":276},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"left\\\":46,\\\"bottom\\\":58,\\\"show\\\":false,\\\"right\\\":1},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"text\\\":\\\"游客趋势分析\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 14:41:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522466576605913090', NULL, '1522460228585529346', NULL, 'JPie', '{\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"火车\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"飞机\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"轮船\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"自驾\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"徒步\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":358,\\\"height\\\":331},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"isRose\\\":true,\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"AccessFrom\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0,0,0,0.5)\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"innerRadius\\\":50,\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"交通方式\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 14:41:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522466576702382082', NULL, '1522460228585529346', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":463,\\\"height\\\":265},\\\"w\\\":10,\\\"dataType\\\":1,\\\"h\\\":20,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"http://minio.jeecg.com/otatest/111_1651818408914.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 14:41:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522466576777879554', NULL, '1522460228585529346', NULL, 'JText', '{\\\"chartData\\\":\\\"五星级\\\",\\\"size\\\":{\\\"width\\\":253,\\\"height\\\":45},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":76},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 14:41:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522466576878542849', NULL, '1522460228585529346', NULL, 'JText', '{\\\"chartData\\\":\\\"四星级\\\",\\\"size\\\":{\\\"width\\\":200,\\\"height\\\":45},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":76},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 14:41:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522466576954040321', NULL, '1522460228585529346', NULL, 'JText', '{\\\"chartData\\\":\\\"56789\\\",\\\"size\\\":{\\\"height\\\":50},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":76},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 14:41:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522466577054703617', NULL, '1522460228585529346', NULL, 'JText', '{\\\"chartData\\\":\\\"6789\\\",\\\"size\\\":{\\\"width\\\":200,\\\"height\\\":56},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":76},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 14:41:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522466577159561217', NULL, '1522460228585529346', NULL, 'JPie', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"2~3小时\\\\\\\",\\\\\\\"value\\\\\\\":3500},{\\\\\\\"name\\\\\\\":\\\\\\\">=3小时\\\\\\\",\\\\\\\"value\\\\\\\":2400},{\\\\\\\"name\\\\\\\":\\\\\\\"1~2小时\\\\\\\",\\\\\\\"value\\\\\\\":2300},{\\\\\\\"name\\\\\\\":\\\\\\\"<=1小时\\\\\\\",\\\\\\\"value\\\\\\\":1800}]\\\",\\\"size\\\":{\\\"width\\\":463,\\\"height\\\":474},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"AccessFrom\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0,0,0,0.5)\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"innerRadius\\\":50,\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"基础饼图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 14:41:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522466577264418817', NULL, '1522460228585529346', NULL, 'JCommonTable', '{\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"旅游数据监控\\\",\\\"h\\\":42,\\\"dataSetApi\\\":\\\"[{\\\\\\\"type1\\\\\\\":\\\\\\\"路线1\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\"},{\\\\\\\"type1\\\\\\\":\\\\\\\"路线2\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\"},{\\\\\\\"type1\\\\\\\":\\\\\\\"路线3\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\"},{\\\\\\\"type1\\\\\\\":\\\\\\\"路线4\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\"},{\\\\\\\"type1\\\\\\\":\\\\\\\"路线5\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\"},{\\\\\\\"type1\\\\\\\":\\\\\\\"路线6\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\"},{\\\\\\\"type1\\\\\\\":\\\\\\\"路线7\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\"},{\\\\\\\"type1\\\\\\\":\\\\\\\"路线8\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\"},{\\\\\\\"type1\\\\\\\":\\\\\\\"路线9\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\"},{\\\\\\\"type1\\\\\\\":\\\\\\\"路线10\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\"},{\\\\\\\"type1\\\\\\\":\\\\\\\"路线11\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\"},{\\\\\\\"type1\\\\\\\":\\\\\\\"路线12\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\"},{\\\\\\\"type1\\\\\\\":\\\\\\\"路线13\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\"},{\\\\\\\"type1\\\\\\\":\\\\\\\"路线14\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\"},{\\\\\\\"type1\\\\\\\":\\\\\\\"路线15\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\"},{\\\\\\\"type1\\\\\\\":\\\\\\\"路线16\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\"},{\\\\\\\"type1\\\\\\\":\\\\\\\"路线17\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\"},{\\\\\\\"type1\\\\\\\":\\\\\\\"路线18\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\"},{\\\\\\\"type1\\\\\\\":\\\\\\\"路线19\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\"},{\\\\\\\"type1\\\\\\\":\\\\\\\"路线20\\\\\\\",\\\\\\\"type2\\\\\\\":\\\\\\\"1111\\\\\\\",\\\\\\\"type3\\\\\\\":\\\\\\\"1111\\\\\\\"}]\\\",\\\"drillData\\\":[],\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"width\\\":358,\\\"height\\\":529},\\\"dataSetId\\\":\\\"1522464505970302978\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"路线\\\",\\\"text\\\":\\\"路线\\\",\\\"value\\\":\\\"type1\\\"},{\\\"label\\\":\\\"车辆\\\",\\\"text\\\":\\\"车辆\\\",\\\"value\\\":\\\"type2\\\"},{\\\"label\\\":\\\"人数\\\",\\\"text\\\":\\\"人数\\\",\\\"value\\\":\\\"type3\\\"}],\\\"dataSetType\\\":\\\"json\\\",\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"type1\\\",\\\"title\\\":\\\"路线\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"type2\\\",\\\"title\\\":\\\"车辆\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"type3\\\",\\\"title\\\":\\\"人数\\\"}]}}', 'admin', '2022-05-06 14:41:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522504050518532098', NULL, '1522466781443137538', NULL, 'JQuickNav', '{\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"首页快速导航\\\",\\\"h\\\":26,\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/home/quick\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"首页\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-homepage\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#1fdaca\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"仪表盘\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-shijian\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#bf0c2c\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"组件\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-dangan\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#e18525\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"系统管理\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-shezhi\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#3fb27f\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"权限管理\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-yuechi\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#4daf1bc9\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"图表\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-fujin\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#00d8ff\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":674,\\\"height\\\":298},\\\"dataSetId\\\":\\\"1519962879095332865\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"icon\\\",\\\"text\\\":\\\"icon\\\",\\\"value\\\":\\\"icon\\\"},{\\\"label\\\":\\\"color\\\",\\\"text\\\":\\\"color\\\",\\\"value\\\":\\\"color\\\"},{\\\"label\\\":\\\"href\\\",\\\"text\\\":\\\"href\\\",\\\"value\\\":\\\"href\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":30},\\\"body\\\":{\\\"textAlign\\\":\\\"center\\\",\\\"column\\\":3,\\\"iconAlign\\\":\\\"top\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"http://jeecg.com\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"快捷导航\\\"}}}', 'admin', '2022-05-06 17:10:27', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522504050690498562', NULL, '1522466781443137538', NULL, 'JList', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"remark\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"date\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"pic\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"数据列表\\\",\\\"h\\\":24,\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/datalist/list\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"通知一\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-914:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知二\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-814:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知三\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-714:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知四\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-414:20:21\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":568,\\\"height\\\":474},\\\"dataSetId\\\":\\\"1519945036454813698\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"date\\\",\\\"text\\\":\\\"date\\\",\\\"value\\\":\\\"date\\\"},{\\\"label\\\":\\\"remark\\\",\\\"text\\\":\\\"remark\\\",\\\"value\\\":\\\"remark\\\"},{\\\"label\\\":\\\"pic\\\",\\\"text\\\":\\\"pic\\\",\\\"value\\\":\\\"pic\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"horizontal\\\",\\\"showTitlePrefix\\\":true,\\\"titleFontSize\\\":18,\\\"showTimePrefix\\\":true}}', 'admin', '2022-05-06 17:10:27', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522504050782773249', NULL, '1522466781443137538', NULL, 'JGrowCard', '{\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"访问数\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-qianbao\\\\\\\",\\\\\\\"value\\\\\\\":2000,\\\\\\\"total\\\\\\\":120000,\\\\\\\"color\\\\\\\":\\\\\\\"green\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"月\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"成交额\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-youhuiquan\\\\\\\",\\\\\\\"value\\\\\\\":20000,\\\\\\\"total\\\\\\\":500000,\\\\\\\"color\\\\\\\":\\\\\\\"blue\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"月\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"下载数\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-tupian\\\\\\\",\\\\\\\"value\\\\\\\":8000,\\\\\\\"total\\\\\\\":120000,\\\\\\\"color\\\\\\\":\\\\\\\"orange\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"周\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"成交数\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-jifen\\\\\\\",\\\\\\\"value\\\\\\\":5000,\\\\\\\"total\\\\\\\":50000,\\\\\\\"color\\\\\\\":\\\\\\\"purple\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"年\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":1252,\\\"height\\\":199},\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":19,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":20},\\\"body\\\":{\\\"horizontal\\\":8,\\\"vertical\\\":8,\\\"span\\\":6},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"统计卡片\\\"}}}', 'admin', '2022-05-06 17:10:27', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522504050862465026', NULL, '1522466781443137538', NULL, 'JProjectCard', '{\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"Github\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-github\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"不要等待机会，而要创造机会。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"开源组\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"Vue\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-buysellads\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#3fb27f\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"现在的你决定将来的你。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"算法组\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"Html5\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-html5\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#e18525\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"没有什么才能比努力更重要。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"上班摸鱼\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"Angular\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-product-hunt\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#bf0c2c\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"热情和欲望可以突破一切难关。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"UI\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"React\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-skype\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#00d8ff\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"健康的身体是实目标的基石。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"技术牛\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"Js\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-pengyou\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#4daf1bc9\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"路是走出来的，而不是空想出来的。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"架构组\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":674,\\\"height\\\":386},\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":33,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":30},\\\"body\\\":{\\\"column\\\":3},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"项目列表\\\"}}}', 'admin', '2022-05-06 17:10:27', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522504050958934017', NULL, '1522466781443137538', NULL, 'JWaitMatter', '{\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"待办公文\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-yudu\\\\\\\",\\\\\\\"content\\\\\\\":23,\\\\\\\"desc\\\\\\\":\\\\\\\"今日已办3\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"待办流程\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-shuju\\\\\\\",\\\\\\\"content\\\\\\\":23,\\\\\\\"desc\\\\\\\":\\\\\\\"今日已办3\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"待办任务\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-tongzhi\\\\\\\",\\\\\\\"content\\\\\\\":23,\\\\\\\"desc\\\\\\\":\\\\\\\"今日已办3今日更新5\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":568,\\\"height\\\":210},\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":19,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":25},\\\"body\\\":{\\\"column\\\":3},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"待办事项\\\"}}}', 'admin', '2022-05-06 17:10:27', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522504051076374530', NULL, '1522466781443137538', NULL, 'JLine', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"type\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"visit\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"首页_近一周访问量\\\",\\\"dataSetApi\\\":\\\"selectcount(*)asvisit\\\\t,count(distinct(ip))asip\\\\t,DATE_FORMAT(create_time,\\'%Y-%m-%d\\')astian\\\\t,DATE_FORMAT(create_time,\\'%m-%d\\')astype\\\\tfromsys_logwherelog_type=1andcreate_time<=sysdate()andcreate_time>=(selectdate_sub(curdate(),interval7day))groupbytian,typeorderbytianasc\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":1252,\\\"height\\\":441},\\\"dataSetId\\\":\\\"1522503560003067906\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"visit\\\",\\\"text\\\":\\\"visit\\\",\\\"value\\\":\\\"visit\\\"},{\\\"label\\\":\\\"ip\\\",\\\"text\\\":\\\"ip\\\",\\\"value\\\":\\\"ip\\\"},{\\\"label\\\":\\\"tian\\\",\\\"text\\\":\\\"tian\\\",\\\"value\\\":\\\"tian\\\"},{\\\"label\\\":\\\"type\\\",\\\"text\\\":\\\"type\\\",\\\"value\\\":\\\"type\\\"}],\\\"dataSetType\\\":\\\"sql\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"text\\\":\\\"近一周在线访问量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 17:10:27', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522520321213603842', NULL, '1522507145776472065', NULL, 'JBar', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"height\\\":420},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"showBackground\\\":true,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"rgba(180,180,180,0.2)\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"静态数据\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:15:06', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522520321352015874', NULL, '1522507145776472065', NULL, 'JStackBar', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"type\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"出资\\\",\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/chuzi\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"}]\\\",\\\"size\\\":{\\\"height\\\":420},\\\"dataSetId\\\":\\\"1522098873378549762\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"},{\\\"label\\\":\\\"type\\\",\\\"text\\\":\\\"type\\\",\\\"value\\\":\\\"type\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"api数据集\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:15:06', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522520321456873474', NULL, '1522507145776472065', NULL, 'JPie', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"智慧社区_时间分部\\\",\\\"dataSetApi\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"6:00-9:00\\\\\\\",\\\\\\\"value\\\\\\\":800},{\\\\\\\"name\\\\\\\":\\\\\\\"10:00-12:00\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"13:00-15:00\\\\\\\",\\\\\\\"value\\\\\\\":500},{\\\\\\\"name\\\\\\\":\\\\\\\"16:00-20:00\\\\\\\",\\\\\\\"value\\\\\\\":800},{\\\\\\\"name\\\\\\\":\\\\\\\"21:00-24:00\\\\\\\",\\\\\\\"value\\\\\\\":600}]\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"height\\\":420},\\\"dataSetId\\\":\\\"1522187101267832833\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"json\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"AccessFrom\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0,0,0,0.5)\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"innerRadius\\\":50,\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"JSON数据集\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:15:06', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522520321549148162', NULL, '1522507145776472065', NULL, 'JLine', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"day\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"num\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"统计近十日的登陆次数\\\",\\\"dataSetApi\\\":\\\"SELECT\\\\tcount(*)num,\\\\tDATE_FORMAT(create_time,\\'%Y-%m-%d\\')AS`day`FROM\\\\tsys_logWHERE\\\\tlog_type=1ANDcreate_time>DATE_SUB(NOW(),INTERVAL10DAY)GROUPBY\\\\tDATE_FORMAT(create_time,\\'%Y-%m-%d\\')\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"height\\\":420},\\\"dataSetId\\\":\\\"1516743766914924546\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"日期\\\",\\\"text\\\":\\\"日期\\\",\\\"value\\\":\\\"day\\\"},{\\\"label\\\":\\\"登录次数\\\",\\\"text\\\":\\\"登录次数\\\",\\\"value\\\":\\\"num\\\"}],\\\"dataSetType\\\":\\\"sql\\\",\\\"dataNum\\\":\\\"5\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"text\\\":\\\"SQL数据集\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:15:06', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522520321628839937', NULL, '1522507145776472065', NULL, 'JCommonTable', '{\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"首页_近一周访问量\\\",\\\"h\\\":42,\\\"dataSetApi\\\":\\\"selectcount(*)asvisit\\\\t,count(distinct(ip))asip\\\\t,DATE_FORMAT(create_time,\\'%Y-%m-%d\\')astian\\\\t,DATE_FORMAT(create_time,\\'%m-%d\\')astype\\\\tfromsys_logwherelog_type=1andcreate_time<=sysdate()andcreate_time>=(selectdate_sub(curdate(),interval7day))groupbytian,typeorderbytianasc\\\",\\\"drillData\\\":[],\\\"timeOut\\\":\\\"10\\\",\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"height\\\":420},\\\"dataSetId\\\":\\\"1522503560003067906\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"访问量\\\",\\\"text\\\":\\\"访问量\\\",\\\"value\\\":\\\"visit\\\"},{\\\"label\\\":\\\"ip地址\\\",\\\"text\\\":\\\"ip地址\\\",\\\"value\\\":\\\"ip\\\"},{\\\"label\\\":\\\"年月\\\",\\\"text\\\":\\\"年月\\\",\\\"value\\\":\\\"tian\\\"},{\\\"label\\\":\\\"天\\\",\\\"text\\\":\\\"天\\\",\\\"value\\\":\\\"type\\\"}],\\\"dataSetType\\\":\\\"sql\\\",\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"visit\\\",\\\"title\\\":\\\"访问量\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"ip\\\",\\\"title\\\":\\\"ip地址\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"tian\\\",\\\"title\\\":\\\"年月\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"type\\\",\\\"title\\\":\\\"天\\\"}]}}', 'admin', '2022-05-06 18:15:06', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522520321725308929', NULL, '1522507145776472065', NULL, 'JTabs', '{\\\"size\\\":{\\\"width\\\":779,\\\"height\\\":463},\\\"w\\\":12,\\\"h\\\":40,\\\"option\\\":{\\\"title\\\":\\\"选项卡\\\"},\\\"child\\\":[{\\\"h\\\":42,\\\"index\\\":0,\\\"i\\\":\\\"63de7e7e-3894-4d71-84a3-9b2fd9b9c760\\\",\\\"title\\\":\\\"通知\\\",\\\"horizontal\\\":false,\\\"component\\\":\\\"JList\\\",\\\"size\\\":10,\\\"w\\\":12,\\\"x\\\":0,\\\"text\\\":\\\"0.042\\\",\\\"id\\\":\\\"3343bdb3-fd05-4eee-9bc7-844a148752da\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"remark\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"date\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"pic\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"数据列表\\\",\\\"h\\\":24,\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/datalist/list\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"通知一\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-914:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知二\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-814:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知三\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-714:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知四\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-414:20:21\\\\\\\"}]\\\",\\\"paddingBottom\\\":90,\\\"dataSetId\\\":\\\"1519945036454813698\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"date\\\",\\\"text\\\":\\\"date\\\",\\\"value\\\":\\\"date\\\"},{\\\"label\\\":\\\"remark\\\",\\\"text\\\":\\\"remark\\\",\\\"value\\\":\\\"remark\\\"},{\\\"label\\\":\\\"pic\\\",\\\"text\\\":\\\"pic\\\",\\\"value\\\":\\\"pic\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"horizontal\\\",\\\"showTitlePrefix\\\":true,\\\"titleFontSize\\\":18,\\\"showTimePrefix\\\":true}},\\\"child\\\":[]},{\\\"h\\\":42,\\\"index\\\":0,\\\"i\\\":\\\"7e716106-3f6b-4350-80d0-7fe0ed3b46f2\\\",\\\"title\\\":\\\"图片展示\\\",\\\"horizontal\\\":false,\\\"component\\\":\\\"JImg\\\",\\\"size\\\":10,\\\"w\\\":12,\\\"x\\\":0,\\\"text\\\":\\\"0.042\\\",\\\"id\\\":\\\"49dc2c4c-871b-4d5d-8e21-d3cd93602661\\\",\\\"config\\\":{\\\"paddingBottom\\\":90,\\\"w\\\":10,\\\"dataType\\\":1,\\\"h\\\":20,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"http://minio.jeecg.com/otatest/jeecg_1651199708342.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}},\\\"child\\\":[]}]}', 'admin', '2022-05-06 18:15:06', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522520321935024129', NULL, '1522507145776472065', NULL, 'JGrid', '{\\\"size\\\":{\\\"width\\\":1632,\\\"height\\\":400},\\\"w\\\":12,\\\"h\\\":40,\\\"option\\\":{\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}},\\\"child\\\":[{\\\"h\\\":42,\\\"i\\\":\\\"7b247427-b86c-4c59-877d-618088d056ec\\\",\\\"title\\\":\\\"标题\\\",\\\"parentId\\\":\\\"1ac58009-1e17-4136-8309-313a9111ebb6\\\",\\\"horizontal\\\":false,\\\"component\\\":\\\"JRing\\\",\\\"size\\\":10,\\\"w\\\":12,\\\"x\\\":0,\\\"text\\\":\\\"0.042\\\",\\\"id\\\":\\\"e845c133-1b8d-4252-a216-06c0857e388a\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"智慧社区_地区分部\\\",\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/region\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"paddingBottom\\\":90,\\\"dataSetId\\\":\\\"1522185936018878466\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":65,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"AccessFrom\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"t\\\":12},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"环形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}},\\\"span\\\":\\\"8\\\",\\\"child\\\":[]},{\\\"h\\\":42,\\\"i\\\":\\\"6d907478-b400-4723-860d-45b24e3adbee\\\",\\\"title\\\":\\\"标题\\\",\\\"parentId\\\":\\\"1ac58009-1e17-4136-8309-313a9111ebb6\\\",\\\"horizontal\\\":false,\\\"component\\\":\\\"JRadar\\\",\\\"size\\\":10,\\\"w\\\":12,\\\"x\\\":0,\\\"text\\\":\\\"0.042\\\",\\\"id\\\":\\\"7cebf65a-81ba-479e-870e-8610a0f00d0c\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":75,\\\\\\\"name\\\\\\\":\\\\\\\"得分\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"NBA\\\\\\\",\\\\\\\"max\\\\\\\":100},{\\\\\\\"value\\\\\\\":65,\\\\\\\"name\\\\\\\":\\\\\\\"篮板\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"NBA\\\\\\\",\\\\\\\"max\\\\\\\":100},{\\\\\\\"value\\\\\\\":55,\\\\\\\"name\\\\\\\":\\\\\\\"防守\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"NBA\\\\\\\",\\\\\\\"max\\\\\\\":100},{\\\\\\\"value\\\\\\\":74,\\\\\\\"name\\\\\\\":\\\\\\\"失误\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"NBA\\\\\\\",\\\\\\\"max\\\\\\\":100},{\\\\\\\"value\\\\\\\":38,\\\\\\\"name\\\\\\\":\\\\\\\"盖帽\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"NBA\\\\\\\",\\\\\\\"max\\\\\\\":100},{\\\\\\\"value\\\\\\\":88,\\\\\\\"name\\\\\\\":\\\\\\\"三分\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"NBA\\\\\\\",\\\\\\\"max\\\\\\\":100}]\\\",\\\"paddingBottom\\\":90,\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/radar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"radar\\\":[{\\\"indicator\\\":[]}],\\\"grid\\\":{\\\"top\\\":51,\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"data\\\":[]},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"radar\\\"}],\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础雷达图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}},\\\"span\\\":\\\"8\\\",\\\"child\\\":[]},{\\\"h\\\":42,\\\"i\\\":\\\"6e99dc19-fe5e-4c36-8eb6-b3dd6ea19dd8\\\",\\\"title\\\":\\\"标题\\\",\\\"parentId\\\":\\\"1ac58009-1e17-4136-8309-313a9111ebb6\\\",\\\"horizontal\\\":false,\\\"component\\\":\\\"JArea\\\",\\\"size\\\":10,\\\"w\\\":12,\\\"x\\\":0,\\\"text\\\":\\\"0.042\\\",\\\"id\\\":\\\"6fe47c5a-85ac-46ec-9640-936cd2501523\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"图表API示例-年龄占比\\\",\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/jingwu/nianling\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":605,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"}]\\\",\\\"paddingBottom\\\":90,\\\"dataSetId\\\":\\\"1517046231342284802\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"年龄\\\",\\\"text\\\":\\\"年龄\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"数量\\\",\\\"text\\\":\\\"数量\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"\\\",\\\"option\\\":{\\\"xAxis\\\":{\\\"data\\\":[],\\\"boundaryGap\\\":false},\\\"grid\\\":{\\\"bottom\\\":31},\\\"series\\\":[{\\\"areaStyle\\\":{},\\\"data\\\":[],\\\"type\\\":\\\"line\\\"}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础面积图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}},\\\"span\\\":\\\"8\\\",\\\"child\\\":[]}]}', 'admin', '2022-05-06 18:15:06', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522520322014715906', NULL, '1522507145776472065', NULL, 'JCarousel', '{\\\"chartData\\\":\\\"[{\\\\\\\"src\\\\\\\":\\\\\\\"http://minio.jeecg.com/otatest/temp/0_1647504880335.png\\\\\\\"},{\\\\\\\"src\\\\\\\":\\\\\\\"http://minio.jeecg.com/otatest/temp/1_1647504883878.png\\\\\\\"},{\\\\\\\"src\\\\\\\":\\\\\\\"http://minio.jeecg.com/otatest/temp/2_1647504886551.png\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":1252,\\\"height\\\":243},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"路径\\\"}],\\\"w\\\":24,\\\"dataType\\\":1,\\\"h\\\":22,\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/carousel\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"dots\\\":true,\\\"autoplay\\\":true,\\\"dotPosition\\\":\\\"bottom\\\"}}', 'admin', '2022-05-06 18:15:06', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522520322115379202', NULL, '1522507145776472065', NULL, 'JIframe', '{\\\"size\\\":{\\\"width\\\":1252,\\\"height\\\":386},\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":26,\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"http://www.jeecg.com/\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:15:07', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522520322216042498', NULL, '1522507145776472065', NULL, 'JPictorialBar', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"驯鹿\\\\\\\",\\\\\\\"value\\\\\\\":123,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M-22.788,24.521c2.08-0.986,3.611-3.905,4.984-5.892c-2.686,2.782-5.047,5.884-9.102,7.312c-0.992,0.005-0.25-2.016,0.34-2.362l1.852-0.41c0.564-0.218,0.785-0.842,0.902-1.347c2.133-0.727,4.91-4.129,6.031-6.194c1.748-0.7,4.443-0.679,5.734-2.293c1.176-1.468,0.393-3.992,1.215-6.557c0.24-0.754,0.574-1.581,1.008-2.293c-0.611,0.011-1.348-0.061-1.959-0.608c-1.391-1.245-0.785-2.086-1.297-3.313c1.684,0.744,2.5,2.584,4.426,2.586C-8.46,3.012-8.255,2.901-8.04,2.824c6.031-1.952,15.182-0.165,19.498-3.937c1.15-3.933-1.24-9.846-1.229-9.938c0.008-0.062-1.314-0.004-1.803-0.258c-1.119-0.771-6.531-3.75-0.17-3.33c0.314-0.045,0.943,0.259,1.439,0.435c-0.289-1.694-0.92-0.144-3.311-1.946c0,0-1.1-0.855-1.764-1.98c-0.836-1.09-2.01-2.825-2.992-4.031c-1.523-2.476,1.367,0.709,1.816,1.108c1.768,1.704,1.844,3.281,3.232,3.983c0.195,0.203,1.453,0.164,0.926-0.468c-0.525-0.632-1.367-1.278-1.775-2.341c-0.293-0.703-1.311-2.326-1.566-2.711c-0.256-0.384-0.959-1.718-1.67-2.351c-1.047-1.187-0.268-0.902,0.521-0.07c0.789,0.834,1.537,1.821,1.672,2.023c0.135,0.203,1.584,2.521,1.725,2.387c0.102-0.259-0.035-0.428-0.158-0.852c-0.125-0.423-0.912-2.032-0.961-2.083c-0.357-0.852-0.566-1.908-0.598-3.333c0.4-2.375,0.648-2.486,0.549-0.705c0.014,1.143,0.031,2.215,0.602,3.247c0.807,1.496,1.764,4.064,1.836,4.474c0.561,3.176,2.904,1.749,2.281-0.126c-0.068-0.446-0.109-2.014-0.287-2.862c-0.18-0.849-0.219-1.688-0.113-3.056c0.066-1.389,0.232-2.055,0.277-2.299c0.285-1.023,0.4-1.088,0.408,0.135c-0.059,0.399-0.131,1.687-0.125,2.655c0.064,0.642-0.043,1.768,0.172,2.486c0.654,1.928-0.027,3.496,1,3.514c1.805-0.424,2.428-1.218,2.428-2.346c-0.086-0.704-0.121-0.843-0.031-1.193c0.221-0.568,0.359-0.67,0.312-0.076c-0.055,0.287,0.031,0.533,0.082,0.794c0.264,1.197,0.912,0.114,1.283-0.782c0.15-0.238,0.539-2.154,0.545-2.522c-0.023-0.617,0.285-0.645,0.309,0.01c0.064,0.422-0.248,2.646-0.205,2.334c-0.338,1.24-1.105,3.402-3.379,4.712c-0.389,0.12-1.186,1.286-3.328,2.178c0,0,1.729,0.321,3.156,0.246c1.102-0.19,3.707-0.027,4.654,0.269c1.752,0.494,1.531-0.053,4.084,0.164c2.26-0.4,2.154,2.391-1.496,3.68c-2.549,1.405-3.107,1.475-2.293,2.984c3.484,7.906,2.865,13.183,2.193,16.466c2.41,0.271,5.732-0.62,7.301,0.725c0.506,0.333,0.648,1.866-0.457,2.86c-4.105,2.745-9.283,7.022-13.904,7.662c-0.977-0.194,0.156-2.025,0.803-2.247l1.898-0.03c0.596-0.101,0.936-0.669,1.152-1.139c3.16-0.404,5.045-3.775,8.246-4.818c-4.035-0.718-9.588,3.981-12.162,1.051c-5.043,1.423-11.449,1.84-15.895,1.111c-3.105,2.687-7.934,4.021-12.115,5.866c-3.271,3.511-5.188,8.086-9.967,10.414c-0.986,0.119-0.48-1.974,0.066-2.385l1.795-0.618C-22.995,25.682-22.849,25.035-22.788,24.521z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[60,60]},{\\\\\\\"name\\\\\\\":\\\\\\\"飞机\\\\\\\",\\\\\\\"value\\\\\\\":60,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M1.112,32.559l2.998,1.205l-2.882,2.268l-2.215-0.012L1.112,32.559zM37.803,23.96c0.158-0.838,0.5-1.509,0.961-1.904c-0.096-0.037-0.205-0.071-0.344-0.071c-0.777-0.005-2.068-0.009-3.047-0.009c-0.633,0-1.217,0.066-1.754,0.18l2.199,1.804H37.803zM39.738,23.036c-0.111,0-0.377,0.325-0.537,0.924h1.076C40.115,23.361,39.854,23.036,39.738,23.036zM39.934,39.867c-0.166,0-0.674,0.705-0.674,1.986s0.506,1.986,0.674,1.986s0.672-0.705,0.672-1.986S40.102,39.867,39.934,39.867zM38.963,38.889c-0.098-0.038-0.209-0.07-0.348-0.073c-0.082,0-0.174,0-0.268-0.001l-7.127,4.671c0.879,0.821,2.42,1.417,4.348,1.417c0.979,0,2.27-0.006,3.047-0.01c0.139,0,0.25-0.034,0.348-0.072c-0.646-0.555-1.07-1.643-1.07-2.967C37.891,40.529,38.316,39.441,38.963,38.889zM32.713,23.96l-12.37-10.116l-4.693-0.004c0,0,4,8.222,4.827,10.121H32.713zM59.311,32.374c-0.248,2.104-5.305,3.172-8.018,3.172H39.629l-25.325,16.61L9.607,52.16c0,0,6.687-8.479,7.95-10.207c1.17-1.6,3.019-3.699,3.027-6.407h-2.138c-5.839,0-13.816-3.789-18.472-5.583c-2.818-1.085-2.396-4.04-0.031-4.04h0.039l-3.299-11.371h3.617c0,0,4.352,5.696,5.846,7.5c2,2.416,4.503,3.678,8.228,3.87h30.727c2.17,0,4.311,0.417,6.252,1.046c3.49,1.175,5.863,2.7,7.199,4.027C59.145,31.584,59.352,32.025,59.311,32.374zM22.069,30.408c0-0.815-0.661-1.475-1.469-1.475c-0.812,0-1.471,0.66-1.471,1.475s0.658,1.475,1.471,1.475C21.408,31.883,22.069,31.224,22.069,30.408zM27.06,30.408c0-0.815-0.656-1.478-1.466-1.478c-0.812,0-1.471,0.662-1.471,1.478s0.658,1.477,1.471,1.477C26.404,31.885,27.06,31.224,27.06,30.408zM32.055,30.408c0-0.815-0.66-1.475-1.469-1.475c-0.808,0-1.466,0.66-1.466,1.475s0.658,1.475,1.466,1.475C31.398,31.883,32.055,31.224,32.055,30.408zM37.049,30.408c0-0.815-0.658-1.478-1.467-1.478c-0.812,0-1.469,0.662-1.469,1.478s0.656,1.477,1.469,1.477C36.389,31.885,37.049,31.224,37.049,30.408zM42.039,30.408c0-0.815-0.656-1.478-1.465-1.478c-0.811,0-1.469,0.662-1.469,1.478s0.658,1.477,1.469,1.477C41.383,31.885,42.039,31.224,42.039,30.408zM55.479,30.565c-0.701-0.436-1.568-0.896-2.627-1.347c-0.613,0.289-1.551,0.476-2.73,0.476c-1.527,0-1.639,2.263,0.164,2.316C52.389,32.074,54.627,31.373,55.479,30.565z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[65,35]},{\\\\\\\"name\\\\\\\":\\\\\\\"火箭\\\\\\\",\\\\\\\"value\\\\\\\":25,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M-244.396,44.399c0,0,0.47-2.931-2.427-6.512c2.819-8.221,3.21-15.709,3.21-15.709s5.795,1.383,5.795,7.325C-237.818,39.679-244.396,44.399-244.396,44.399zM-260.371,40.827c0,0-3.881-12.946-3.881-18.319c0-2.416,0.262-4.566,0.669-6.517h17.684c0.411,1.952,0.675,4.104,0.675,6.519c0,5.291-3.87,18.317-3.87,18.317H-260.371zM-254.745,18.951c-1.99,0-3.603,1.676-3.603,3.744c0,2.068,1.612,3.744,3.603,3.744c1.988,0,3.602-1.676,3.602-3.744S-252.757,18.951-254.745,18.951zM-255.521,2.228v-5.098h1.402v4.969c1.603,1.213,5.941,5.069,7.901,12.5h-17.05C-261.373,7.373-257.245,3.558-255.521,2.228zM-265.07,44.399c0,0-6.577-4.721-6.577-14.896c0-5.942,5.794-7.325,5.794-7.325s0.393,7.488,3.211,15.708C-265.539,41.469-265.07,44.399-265.07,44.399zM-252.36,45.15l-1.176-1.22L-254.789,48l-1.487-4.069l-1.019,2.116l-1.488-3.826h8.067L-252.36,45.15z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[50,60]},{\\\\\\\"name\\\\\\\":\\\\\\\"高铁\\\\\\\",\\\\\\\"value\\\\\\\":18,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M67.335,33.596L67.335,33.596c-0.002-1.39-1.153-3.183-3.328-4.218h-9.096v-2.07h5.371c-4.939-2.07-11.199-4.141-14.89-4.141H19.72v12.421v5.176h38.373c4.033,0,8.457-1.035,9.142-5.176h-0.027c0.076-0.367,0.129-0.751,0.129-1.165L67.335,33.596L67.335,33.596zM27.999,30.413h-3.105v-4.141h3.105V30.413zM35.245,30.413h-3.104v-4.141h3.104V30.413zM42.491,30.413h-3.104v-4.141h3.104V30.413zM49.736,30.413h-3.104v-4.141h3.104V30.413zM14.544,40.764c1.143,0,2.07-0.927,2.07-2.07V35.59V25.237c0-1.145-0.928-2.07-2.07-2.07H-9.265c-1.143,0-2.068,0.926-2.068,2.07v10.351v3.105c0,1.144,0.926,2.07,2.068,2.07H14.544L14.544,40.764zM8.333,26.272h3.105v4.141H8.333V26.272zM1.087,26.272h3.105v4.141H1.087V26.272zM-6.159,26.272h3.105v4.141h-3.105V26.272zM-9.265,41.798h69.352v1.035H-9.265V41.798z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[50,30]},{\\\\\\\"name\\\\\\\":\\\\\\\"轮船\\\\\\\",\\\\\\\"value\\\\\\\":12,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M16.678,17.086h9.854l-2.703,5.912c5.596,2.428,11.155,5.575,16.711,8.607c3.387,1.847,6.967,3.75,10.541,5.375v-6.16l-4.197-2.763v-5.318L33.064,12.197h-11.48L20.43,15.24h-4.533l-1.266,3.286l0.781,0.345L16.678,17.086zM49.6,31.84l0.047,1.273L27.438,20.998l0.799-1.734L49.6,31.84zM33.031,15.1l12.889,8.82l0.027,0.769L32.551,16.1L33.031,15.1zM22.377,14.045h9.846l-1.539,3.365l-2.287-1.498h1.371l0.721-1.352h-2.023l-0.553,1.037l-0.541-0.357h-0.34l0.359-0.684h-2.025l-0.361,0.684h-3.473L22.377,14.045zM23.695,20.678l-0.004,0.004h0.004V20.678zM24.828,18.199h-2.031l-0.719,1.358h2.029L24.828,18.199zM40.385,34.227c-12.85-7.009-25.729-14.667-38.971-12.527c1.26,8.809,9.08,16.201,8.213,24.328c-0.553,4.062-3.111,0.828-3.303,7.137c15.799,0,32.379,0,48.166,0l0.066-4.195l1.477-7.23C50.842,39.812,45.393,36.961,40.385,34.227zM13.99,35.954c-1.213,0-2.195-1.353-2.195-3.035c0-1.665,0.98-3.017,2.195-3.017c1.219,0,2.195,1.352,2.195,3.017C16.186,34.604,15.213,35.954,13.99,35.954zM23.691,20.682h-2.02l-0.588,1.351h2.023L23.691,20.682zM19.697,18.199l-0.721,1.358h2.025l0.727-1.358H19.697z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[50,35]},{\\\\\\\"name\\\\\\\":\\\\\\\"汽车\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M49.592,40.883c-0.053,0.354-0.139,0.697-0.268,0.963c-0.232,0.475-0.455,0.519-1.334,0.475c-1.135-0.053-2.764,0-4.484,0.068c0,0.476,0.018,0.697,0.018,0.697c0.111,1.299,0.697,1.342,0.931,1.342h3.7c0.326,0,0.628,0,0.861-0.154c0.301-0.196,0.43-0.772,0.543-1.78c0.017-0.146,0.025-0.336,0.033-0.56v-0.01c0-0.068,0.008-0.154,0.008-0.25V41.58l0,0C49.6,41.348,49.6,41.09,49.592,40.883L49.592,40.883zM6.057,40.883c0.053,0.354,0.137,0.697,0.268,0.963c0.23,0.475,0.455,0.519,1.334,0.475c1.137-0.053,2.762,0,4.484,0.068c0,0.476-0.018,0.697-0.018,0.697c-0.111,1.299-0.697,1.342-0.93,1.342h-3.7c-0.328,0-0.602,0-0.861-0.154c-0.309-0.18-0.43-0.772-0.541-1.78c-0.018-0.146-0.027-0.336-0.035-0.56v-0.01c0-0.068-0.008-0.154-0.008-0.25V41.58l0,0C6.057,41.348,6.057,41.09,6.057,40.883L6.057,40.883zM49.867,32.766c0-2.642-0.344-5.224-0.482-5.507c-0.104-0.207-0.766-0.749-2.271-1.773c-1.522-1.042-1.487-0.887-1.766-1.566c0.25-0.078,0.492-0.224,0.639-0.241c0.326-0.034,0.345,0.274,1.023,0.274c0.68,0,2.152-0.18,2.453-0.48c0.301-0.303,0.396-0.405,0.396-0.672c0-0.268-0.156-0.818-0.447-1.146c-0.293-0.327-1.541-0.49-2.273-0.585c-0.729-0.095-0.834,0-1.022,0.121c-0.304,0.189-0.32,1.919-0.32,1.919l-0.713,0.018c-0.465-1.146-1.11-3.452-2.117-5.269c-1.103-1.979-2.256-2.599-2.737-2.754c-0.474-0.146-0.904-0.249-4.131-0.576c-3.298-0.344-5.922-0.388-8.262-0.388c-2.342,0-4.967,0.052-8.264,0.388c-3.229,0.336-3.66,0.43-4.133,0.576s-1.633,0.775-2.736,2.754c-1.006,1.816-1.652,4.123-2.117,5.269L9.87,23.109c0,0-0.008-1.729-0.318-1.919c-0.189-0.121-0.293-0.225-1.023-0.121c-0.732,0.104-1.98,0.258-2.273,0.585c-0.293,0.327-0.447,0.878-0.447,1.146c0,0.267,0.094,0.379,0.396,0.672c0.301,0.301,1.773,0.48,2.453,0.48c0.68,0,0.697-0.309,1.023-0.274c0.146,0.018,0.396,0.163,0.637,0.241c-0.283,0.68-0.24,0.524-1.764,1.566c-1.506,1.033-2.178,1.566-2.271,1.773c-0.139,0.283-0.482,2.865-0.482,5.508s0.189,5.02,0.189,5.86c0,0.354,0,0.976,0.076,1.565c0.053,0.354,0.129,0.697,0.268,0.966c0.232,0.473,0.447,0.516,1.334,0.473c1.137-0.051,2.779,0,4.477,0.07c1.135,0.043,2.297,0.086,3.33,0.11c2.582,0.051,1.826-0.379,2.928-0.36c1.102,0.016,5.447,0.196,9.424,0.196c3.976,0,8.332-0.182,9.423-0.196c1.102-0.019,0.346,0.411,2.926,0.36c1.033-0.018,2.195-0.067,3.332-0.11c1.695-0.062,3.348-0.121,4.477-0.07c0.886,0.043,1.103,0,1.332-0.473c0.132-0.269,0.218-0.611,0.269-0.966c0.086-0.592,0.078-1.213,0.078-1.565C49.678,37.793,49.867,35.408,49.867,32.766L49.867,32.766zM13.219,19.735c0.412-0.964,1.652-2.9,2.256-3.244c0.145-0.087,1.426-0.491,4.637-0.706c2.953-0.198,6.217-0.276,7.73-0.276c1.513,0,4.777,0.078,7.729,0.276c3.201,0.215,4.502,0.611,4.639,0.706c0.775,0.533,1.842,2.28,2.256,3.244c0.412,0.965,0.965,2.858,0.861,3.116c-0.104,0.258,0.104,0.388-1.291,0.275c-1.387-0.103-10.088-0.216-14.185-0.216c-4.088,0-12.789,0.113-14.184,0.216c-1.395,0.104-1.188-0.018-1.291-0.275C12.254,22.593,12.805,20.708,13.219,19.735L13.219,19.735zM16.385,30.511c-0.619,0.155-0.988,0.491-1.764,0.482c-0.775,0-2.867-0.353-3.314-0.371c-0.447-0.017-0.842,0.302-1.076,0.362c-0.23,0.06-0.688-0.104-1.377-0.318c-0.688-0.216-1.092-0.155-1.316-1.094c-0.232-0.93,0-2.264,0-2.264c1.488-0.068,2.928,0.069,5.621,0.826c2.693,0.758,4.191,2.213,4.191,2.213S17.004,30.357,16.385,30.511L16.385,30.511zM36.629,37.293c-1.23,0.164-6.386,0.207-8.794,0.207c-2.412,0-7.566-0.051-8.799-0.207c-1.256-0.164-2.891-1.67-1.764-2.865c1.523-1.627,1.24-1.576,4.701-2.023C24.967,32.018,27.239,32,27.834,32c0.584,0,2.865,0.025,5.859,0.404c3.461,0.447,3.178,0.396,4.699,2.022C39.521,35.623,37.887,37.129,36.629,37.293L36.629,37.293zM48.129,29.582c-0.232,0.93-0.629,0.878-1.318,1.093c-0.688,0.216-1.145,0.371-1.377,0.319c-0.231-0.053-0.627-0.371-1.074-0.361c-0.448,0.018-2.539,0.37-3.313,0.37c-0.772,0-1.146-0.328-1.764-0.481c-0.621-0.154-0.966-0.154-0.966-0.154s1.49-1.464,4.191-2.213c2.693-0.758,4.131-0.895,5.621-0.826C48.129,27.309,48.361,28.643,48.129,29.582L48.129,29.582z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[40,30]},{\\\\\\\"name\\\\\\\":\\\\\\\"跑步\\\\\\\",\\\\\\\"value\\\\\\\":2,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M13.676,32.955c0.919-0.031,1.843-0.008,2.767-0.008v0.007c0.827,0,1.659,0.041,2.486-0.019c0.417-0.028,1.118,0.325,1.14-0.545c0.014-0.637-0.156-1.279-0.873-1.367c-1.919-0.241-3.858-0.233-5.774,0.019c-0.465,0.062-0.998,0.442-0.832,1.069C12.715,32.602,13.045,32.977,13.676,32.955zM14.108,29.013c1.47-0.007,2.96-0.122,4.414,0.035c1.792,0.192,3.1-0.412,4.273-2.105c-3.044,0-5.882,0.014-8.719-0.01c-0.768-0.005-1.495,0.118-1.461,1C12.642,28.731,13.329,29.014,14.108,29.013zM23.678,36.593c-0.666-0.69-1.258-1.497-2.483-1.448c-2.341,0.095-4.689,0.051-7.035,0.012c-0.834-0.014-1.599,0.177-1.569,1.066c0.031,0.854,0.812,1.062,1.636,1.043c1.425-0.033,2.852-0.01,4.278-0.01v-0.01c1.562,0,3.126,0.008,4.691-0.005C23.614,37.239,24.233,37.174,23.678,36.593zM32.234,42.292h-0.002c-1.075,0.793-2.589,0.345-3.821,1.048c-0.359,0.193-0.663,0.465-0.899,0.799c-1.068,1.623-2.052,3.301-3.117,4.928c-0.625,0.961-0.386,1.805,0.409,2.395c0.844,0.628,1.874,0.617,2.548-0.299c1.912-2.573,3.761-5.197,5.621-7.814C33.484,42.619,33.032,42.387,32.234,42.292zM43.527,28.401c-0.688-1.575-2.012-0.831-3.121-0.895c-1.047-0.058-2.119,1.128-3.002,0.345c-0.768-0.677-1.213-1.804-1.562-2.813c-0.45-1.305-1.495-2.225-2.329-3.583c2.953,1.139,4.729,0.077,5.592-1.322c0.99-1.61,0.718-3.725-0.627-4.967c-1.362-1.255-3.414-1.445-4.927-0.452c-1.933,1.268-2.206,2.893-0.899,6.11c-2.098-0.659-3.835-1.654-5.682-2.383c-0.735-0.291-1.437-1.017-2.293-0.666c-2.263,0.927-4.522,1.885-6.723,2.95c-1.357,0.658-1.649,1.593-1.076,2.638c0.462,0.851,1.643,1.126,2.806,0.617c0.993-0.433,1.994-0.857,2.951-1.374c1.599-0.86,3.044-0.873,4.604,0.214c1.017,0.707,0.873,1.137,0.123,1.849c-1.701,1.615-3.516,3.12-4.933,5.006c-1.042,1.388-0.993,2.817,0.255,4.011c1.538,1.471,3.148,2.869,4.708,4.315c0.485,0.444,0.907,0.896-0.227,1.104c-1.523,0.285-3.021,0.694-4.538,1.006c-1.109,0.225-2.02,1.259-1.83,2.16c0.223,1.07,1.548,1.756,2.687,1.487c3.003-0.712,6.008-1.413,9.032-2.044c1.549-0.324,2.273-1.869,1.344-3.115c-0.868-1.156-1.801-2.267-2.639-3.445c-1.964-2.762-1.95-2.771,0.528-5.189c1.394-1.357,1.379-1.351,2.437,0.417c0.461,0.769,0.854,1.703,1.99,1.613c2.238-0.181,4.407-0.755,6.564-1.331C43.557,30.447,43.88,29.206,43.527,28.401z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[50,50]},{\\\\\\\"name\\\\\\\":\\\\\\\"步行\\\\\\\",\\\\\\\"value\\\\\\\":1,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M29.902,23.275c1.86,0,3.368-1.506,3.368-3.365c0-1.859-1.508-3.365-3.368-3.365c-1.857,0-3.365,1.506-3.365,3.365C26.537,21.769,28.045,23.275,29.902,23.275zM36.867,30.74c-1.666-0.467-3.799-1.6-4.732-4.199c-0.932-2.6-3.131-2.998-4.797-2.998s-7.098,3.894-7.098,3.894c-1.133,1.001-2.1,6.502-0.967,6.769c1.133,0.269,1.266-1.533,1.934-3.599c0.666-2.065,3.797-3.466,3.797-3.466s0.201,2.467-0.398,3.866c-0.599,1.399-1.133,2.866-1.467,6.198s-1.6,3.665-3.799,6.266c-2.199,2.598-0.6,3.797,0.398,3.664c1.002-0.133,5.865-5.598,6.398-6.998c0.533-1.397,0.668-3.732,0.668-3.732s0,0,2.199,1.867c2.199,1.865,2.332,4.6,2.998,7.73s2.332,0.934,2.332-0.467c0-1.401,0.269-5.465-1-7.064c-1.265-1.6-3.73-3.465-3.73-5.265s1.199-3.732,1.199-3.732c0.332,1.667,3.335,3.065,5.599,3.399C38.668,33.206,38.533,31.207,36.867,30.74z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[40,50]}]\\\",\\\"size\\\":{\\\"width\\\":463,\\\"height\\\":463},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/pictogram\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"象形柱图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:15:07', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522520322329288706', NULL, '1522507145776472065', NULL, 'JBar', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"type\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"visit\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"首页_近一周访问量\\\",\\\"dataSetApi\\\":\\\"selectcount(*)asvisit\\\\t,count(distinct(ip))asip\\\\t,DATE_FORMAT(create_time,\\'%Y-%m-%d\\')astian\\\\t,DATE_FORMAT(create_time,\\'%m-%d\\')astype\\\\tfromsys_logwherelog_type=1andcreate_time<=sysdate()andcreate_time>=(selectdate_sub(curdate(),interval7day))groupbytian,typeorderbytiandesc\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":\\\"10\\\",\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":779,\\\"height\\\":474},\\\"dataSetId\\\":\\\"1522503560003067906\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"访问量\\\",\\\"text\\\":\\\"访问量\\\",\\\"value\\\":\\\"visit\\\"},{\\\"label\\\":\\\"ip地址\\\",\\\"text\\\":\\\"ip地址\\\",\\\"value\\\":\\\"ip\\\"},{\\\"label\\\":\\\"年月\\\",\\\"text\\\":\\\"年月\\\",\\\"value\\\":\\\"tian\\\"},{\\\"label\\\":\\\"天\\\",\\\"text\\\":\\\"天\\\",\\\"value\\\":\\\"type\\\"}],\\\"dataSetType\\\":\\\"sql\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"showBackground\\\":true,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"rgba(180,180,180,0.2)\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"定时刷新\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:15:07', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522520322421563394', NULL, '1522507145776472065', NULL, 'JLine', '{\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"dataFilter\\\":\\\"returndata.filter((item)=>{returnitem.value>5000});\\\",\\\"size\\\":{\\\"width\\\":463,\\\"height\\\":474},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"text\\\":\\\"数据过滤\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:15:07', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522523872572743681', NULL, '1522451603569778690', NULL, 'JText', '{\\\"chartData\\\":\\\"本日产量\\\",\\\"size\\\":{\\\"width\\\":200,\\\"height\\\":56},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":76},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:29:13', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522523872849567745', NULL, '1522451603569778690', NULL, 'JText', '{\\\"chartData\\\":\\\"456786\\\",\\\"size\\\":{\\\"width\\\":200,\\\"height\\\":56},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":76},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:29:13', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522523872954425346', NULL, '1522451603569778690', NULL, 'JBar', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"19日\\\\\\\",\\\\\\\"value\\\\\\\":100879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"20日\\\\\\\",\\\\\\\"value\\\\\\\":340879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"21日\\\\\\\",\\\\\\\"value\\\\\\\":230879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"22日\\\\\\\",\\\\\\\"value\\\\\\\":540879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"23日\\\\\\\",\\\\\\\"value\\\\\\\":340879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"24日\\\\\\\",\\\\\\\"value\\\\\\\":30879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"25日\\\\\\\",\\\\\\\"value\\\\\\\":34879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":621,\\\"height\\\":474},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"bottom\\\":57,\\\"show\\\":false,\\\"right\\\":6},\\\"series\\\":[{\\\"data\\\":[],\\\"showBackground\\\":true,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"rgba(180,180,180,0.2)\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"每日产能\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:29:13', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522523873038311426', NULL, '1522451603569778690', NULL, 'JPie', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"未完成\\\\\\\",\\\\\\\"value\\\\\\\":4.9},{\\\\\\\"name\\\\\\\":\\\\\\\"已完成\\\\\\\",\\\\\\\"value\\\\\\\":95.1}]\\\",\\\"size\\\":{\\\"width\\\":306,\\\"height\\\":452},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"r\\\":10,\\\"orient\\\":\\\"horizontal\\\",\\\"t\\\":1},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"AccessFrom\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0,0,0,0.5)\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"innerRadius\\\":50,\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"昨日概况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:29:13', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522523873143169025', NULL, '1522451603569778690', NULL, 'JPie', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"未完成\\\\\\\",\\\\\\\"value\\\\\\\":3.8},{\\\\\\\"name\\\\\\\":\\\\\\\"已完成\\\\\\\",\\\\\\\"value\\\\\\\":96.2}]\\\",\\\"size\\\":{\\\"width\\\":306,\\\"height\\\":452},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"r\\\":12,\\\"orient\\\":\\\"horizontal\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"AccessFrom\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0,0,0,0.5)\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"innerRadius\\\":50,\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"月概况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:29:13', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522523873235443714', NULL, '1522451603569778690', NULL, 'JTabs', '{\\\"size\\\":{\\\"width\\\":621,\\\"height\\\":540},\\\"w\\\":12,\\\"h\\\":40,\\\"option\\\":{\\\"title\\\":\\\"选项卡\\\"},\\\"child\\\":[{\\\"h\\\":42,\\\"index\\\":0,\\\"i\\\":\\\"4c96d729-f16d-4fea-a9c5-f82a6aef0225\\\",\\\"title\\\":\\\"实际生产\\\",\\\"horizontal\\\":false,\\\"component\\\":\\\"JCommonTable\\\",\\\"size\\\":10,\\\"w\\\":12,\\\"x\\\":0,\\\"text\\\":\\\"0.042\\\",\\\"id\\\":\\\"1daf6c6b-7061-40d3-8980-cd20c163da40\\\",\\\"config\\\":{\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"智能大数据_实际生产\\\",\\\"h\\\":42,\\\"dataSetApi\\\":\\\"[{\\\\\\\"gh\\\\\\\":\\\\\\\"ATJDS01\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"TYIY-908\\\\\\\",\\\\\\\"jgsj\\\\\\\":\\\\\\\"2021-03-2817:07\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工序1\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"已完成\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"ATJDS01\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"11CPER-44\\\\\\\",\\\\\\\"jgsj\\\\\\\":\\\\\\\"2021-03-2918:07\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工序2\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"已完成\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"PFTE56\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"F56677\\\\\\\",\\\\\\\"jgsj\\\\\\\":\\\\\\\"2021-02-2807:07\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工序1\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"已完成\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"PFTE56\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"99CVB-1\\\\\\\",\\\\\\\"jgsj\\\\\\\":\\\\\\\"2021-03-2817:07\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工序3\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"已完成\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"ATJDS01\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"TYIY-908\\\\\\\",\\\\\\\"jgsj\\\\\\\":\\\\\\\"2021-03-2817:07\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工序1\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"已完成\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"ATJDS01\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"11CPER-44\\\\\\\",\\\\\\\"jgsj\\\\\\\":\\\\\\\"2021-03-2817:07\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工序2\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"已完成\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"PFTE56\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"F56677\\\\\\\",\\\\\\\"jgsj\\\\\\\":\\\\\\\"2021-03-2817:07\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工序1\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"已完成\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"PFTE56\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"99CVB-1\\\\\\\",\\\\\\\"jgsj\\\\\\\":\\\\\\\"2021-03-2817:07\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工序3\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"已完成\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"ATJDS01\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"TYIY-908\\\\\\\",\\\\\\\"jgsj\\\\\\\":\\\\\\\"2021-03-2817:07\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工序1\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"已完成\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"ATJDS01\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"11CPER-44\\\\\\\",\\\\\\\"jgsj\\\\\\\":\\\\\\\"2021-03-2817:07\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工序2\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"已完成\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"PFTE56\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"F56677\\\\\\\",\\\\\\\"jgsj\\\\\\\":\\\\\\\"2021-03-2817:07\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工序1\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"已完成\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"PFTE56\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"99CVB-1\\\\\\\",\\\\\\\"jgsj\\\\\\\":\\\\\\\"2021-03-2817:07\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工序3\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"已完成\\\\\\\"}]\\\",\\\"drillData\\\":[],\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"paddingBottom\\\":90,\\\"dataSetId\\\":\\\"1522522034783920129\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"工号\\\",\\\"text\\\":\\\"工号\\\",\\\"value\\\":\\\"gh\\\"},{\\\"label\\\":\\\"编码\\\",\\\"text\\\":\\\"编码\\\",\\\"value\\\":\\\"gjbm\\\"},{\\\"label\\\":\\\"完成时间\\\",\\\"text\\\":\\\"完成时间\\\",\\\"value\\\":\\\"jgsj\\\"},{\\\"label\\\":\\\"工序\\\",\\\"text\\\":\\\"工序\\\",\\\"value\\\":\\\"dqgx\\\"},{\\\"label\\\":\\\"状态\\\",\\\"text\\\":\\\"状态\\\",\\\"value\\\":\\\"zt\\\"}],\\\"dataSetType\\\":\\\"json\\\",\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"gh\\\",\\\"title\\\":\\\"工号\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"gjbm\\\",\\\"title\\\":\\\"编码\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"jgsj\\\",\\\"title\\\":\\\"完成时间\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"dqgx\\\",\\\"title\\\":\\\"工序\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"zt\\\",\\\"title\\\":\\\"状态\\\"}]}},\\\"child\\\":[]},{\\\"h\\\":42,\\\"index\\\":0,\\\"i\\\":\\\"6163f3c5-7cd3-471f-84df-b53603bc922f\\\",\\\"title\\\":\\\"计划生产\\\",\\\"horizontal\\\":false,\\\"component\\\":\\\"JCommonTable\\\",\\\"size\\\":10,\\\"w\\\":12,\\\"x\\\":0,\\\"text\\\":\\\"0.042\\\",\\\"id\\\":\\\"59ce013b-526f-487a-816a-de2d87ce4b9d\\\",\\\"config\\\":{\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"智能大数据\\\",\\\"h\\\":42,\\\"dataSetApi\\\":\\\"[{\\\\\\\"gh\\\\\\\":\\\\\\\"ACDFE_0045\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"56-REE-4\\\\\\\",\\\\\\\"jh\\\\\\\":\\\\\\\"1\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工程\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"未开始\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"ACDFE_0045\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"BB-1L-0004\\\\\\\",\\\\\\\"jh\\\\\\\":\\\\\\\"2\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工序\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"未开始\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"JFL5GZ1-01\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"DB-F5GNT-1\\\\\\\",\\\\\\\"jh\\\\\\\":\\\\\\\"1\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工程\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"未开始\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"JFL5GZ1-01\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"A5-0001\\\\\\\",\\\\\\\"jh\\\\\\\":\\\\\\\"1\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"总装工序\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"未开始\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"ACDFE_0045\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"56-REE-4\\\\\\\",\\\\\\\"jh\\\\\\\":\\\\\\\"1\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工程\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"未开始\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"ACDFE_0045\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"BB-1L-0004\\\\\\\",\\\\\\\"jh\\\\\\\":\\\\\\\"2\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工序\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"未开始\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"JFL5GZ1-01\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"DB-F5GNT-1\\\\\\\",\\\\\\\"jh\\\\\\\":\\\\\\\"1\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工程\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"未开始\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"JFL5GZ1-01\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"A5-0001\\\\\\\",\\\\\\\"jh\\\\\\\":\\\\\\\"1\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"总装工序\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"未开始\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"ACDFE_0045\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"56-REE-4\\\\\\\",\\\\\\\"jh\\\\\\\":\\\\\\\"1\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工程\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"未开始\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"ACDFE_0045\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"BB-1L-0004\\\\\\\",\\\\\\\"jh\\\\\\\":\\\\\\\"2\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工序\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"未开始\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"JFL5GZ1-01\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"DB-F5GNT-1\\\\\\\",\\\\\\\"jh\\\\\\\":\\\\\\\"1\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"工程\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"未开始\\\\\\\"},{\\\\\\\"gh\\\\\\\":\\\\\\\"JFL5GZ1-01\\\\\\\",\\\\\\\"gjbm\\\\\\\":\\\\\\\"A5-0001\\\\\\\",\\\\\\\"jh\\\\\\\":\\\\\\\"1\\\\\\\",\\\\\\\"dqgx\\\\\\\":\\\\\\\"总装工序\\\\\\\",\\\\\\\"zt\\\\\\\":\\\\\\\"未开始\\\\\\\"}]\\\",\\\"drillData\\\":[],\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"paddingBottom\\\":90,\\\"dataSetId\\\":\\\"1522455203175997442\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"工号\\\",\\\"text\\\":\\\"工号\\\",\\\"value\\\":\\\"gh\\\"},{\\\"label\\\":\\\"构件编号\\\",\\\"text\\\":\\\"构件编号\\\",\\\"value\\\":\\\"gjbm\\\"},{\\\"label\\\":\\\"序号\\\",\\\"text\\\":\\\"序号\\\",\\\"value\\\":\\\"jh\\\"},{\\\"label\\\":\\\"状态\\\",\\\"text\\\":\\\"状态\\\",\\\"value\\\":\\\"zt\\\"},{\\\"label\\\":\\\"当前工序\\\",\\\"text\\\":\\\"当前工序\\\",\\\"value\\\":\\\"dqgx\\\"}],\\\"dataSetType\\\":\\\"json\\\",\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"gh\\\",\\\"title\\\":\\\"工号\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"gjbm\\\",\\\"title\\\":\\\"构件编号\\\"},{\\\"izShow\\\":\\\"N\\\",\\\"dataIndex\\\":\\\"jh\\\",\\\"title\\\":\\\"序号\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"zt\\\",\\\"title\\\":\\\"状态\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"dqgx\\\",\\\"title\\\":\\\"当前工序\\\"}]}},\\\"child\\\":[]}]}', 'admin', '2022-05-06 18:29:13', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522523873340301313', NULL, '1522451603569778690', NULL, 'JTabs', '{\\\"size\\\":{\\\"width\\\":621,\\\"height\\\":518},\\\"w\\\":12,\\\"h\\\":40,\\\"option\\\":{\\\"title\\\":\\\"选项卡\\\"},\\\"child\\\":[{\\\"h\\\":42,\\\"index\\\":0,\\\"i\\\":\\\"7b87441d-0f82-454a-80b9-6040dc1f8f5a\\\",\\\"title\\\":\\\"项目履约一览表\\\",\\\"horizontal\\\":false,\\\"component\\\":\\\"JCommonTable\\\",\\\"size\\\":10,\\\"w\\\":12,\\\"x\\\":0,\\\"text\\\":\\\"0.042\\\",\\\"id\\\":\\\"f437ad36-afbd-475b-8402-e8be433022a2\\\",\\\"config\\\":{\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"智能大数据_一览表\\\",\\\"h\\\":42,\\\"dataSetApi\\\":\\\"[{\\\\\\\"ddh\\\\\\\":\\\\\\\"A5CCU_2017...\\\\\\\",\\\\\\\"zcxm\\\\\\\":\\\\\\\"国际城0902\\\\\\\",\\\\\\\"zl\\\\\\\":\\\\\\\"2548\\\\\\\",\\\\\\\"jhrq\\\\\\\":\\\\\\\"2021-04-21\\\\\\\",\\\\\\\"scjd\\\\\\\":\\\\\\\"100%\\\\\\\"},{\\\\\\\"ddh\\\\\\\":\\\\\\\"A5CCU_2017...\\\\\\\",\\\\\\\"zcxm\\\\\\\":\\\\\\\"新城ERT\\\\\\\",\\\\\\\"zl\\\\\\\":\\\\\\\"27215\\\\\\\",\\\\\\\"jhrq\\\\\\\":\\\\\\\"2021-05-21\\\\\\\",\\\\\\\"scjd\\\\\\\":\\\\\\\"54%\\\\\\\"},{\\\\\\\"ddh\\\\\\\":\\\\\\\"A5CCU_2018...\\\\\\\",\\\\\\\"zcxm\\\\\\\":\\\\\\\"天桥TTY\\\\\\\",\\\\\\\"zl\\\\\\\":\\\\\\\"5423\\\\\\\",\\\\\\\"jhrq\\\\\\\":\\\\\\\"2021-12-21\\\\\\\",\\\\\\\"scjd\\\\\\\":\\\\\\\"100%\\\\\\\"},{\\\\\\\"ddh\\\\\\\":\\\\\\\"A5CCU_2018...\\\\\\\",\\\\\\\"zcxm\\\\\\\":\\\\\\\"国际中心地\\\\\\\",\\\\\\\"zl\\\\\\\":\\\\\\\"14427\\\\\\\",\\\\\\\"jhrq\\\\\\\":\\\\\\\"2021-12-21\\\\\\\",\\\\\\\"scjd\\\\\\\":\\\\\\\"88%\\\\\\\"},{\\\\\\\"ddh\\\\\\\":\\\\\\\"A5CCU_2019...\\\\\\\",\\\\\\\"zcxm\\\\\\\":\\\\\\\"新生广场\\\\\\\",\\\\\\\"zl\\\\\\\":\\\\\\\"2808\\\\\\\",\\\\\\\"jhrq\\\\\\\":\\\\\\\"2021-08-21\\\\\\\",\\\\\\\"scjd\\\\\\\":\\\\\\\"98%\\\\\\\"},{\\\\\\\"ddh\\\\\\\":\\\\\\\"A5CCU_2017...\\\\\\\",\\\\\\\"zcxm\\\\\\\":\\\\\\\"国际城0902\\\\\\\",\\\\\\\"zl\\\\\\\":\\\\\\\"2548\\\\\\\",\\\\\\\"jhrq\\\\\\\":\\\\\\\"2021-04-21\\\\\\\",\\\\\\\"scjd\\\\\\\":\\\\\\\"100%\\\\\\\"},{\\\\\\\"ddh\\\\\\\":\\\\\\\"A5CCU_2019...\\\\\\\",\\\\\\\"zcxm\\\\\\\":\\\\\\\"新生广场\\\\\\\",\\\\\\\"zl\\\\\\\":\\\\\\\"2808\\\\\\\",\\\\\\\"jhrq\\\\\\\":\\\\\\\"2021-08-21\\\\\\\",\\\\\\\"scjd\\\\\\\":\\\\\\\"98%\\\\\\\"},{\\\\\\\"ddh\\\\\\\":\\\\\\\"A5CCU_2017...\\\\\\\",\\\\\\\"zcxm\\\\\\\":\\\\\\\"新城ERT\\\\\\\",\\\\\\\"zl\\\\\\\":\\\\\\\"27215\\\\\\\",\\\\\\\"jhrq\\\\\\\":\\\\\\\"2021-05-21\\\\\\\",\\\\\\\"scjd\\\\\\\":\\\\\\\"54%\\\\\\\"}]\\\",\\\"drillData\\\":[],\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"paddingBottom\\\":90,\\\"dataSetId\\\":\\\"1522523544120991745\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"订单号\\\",\\\"text\\\":\\\"订单号\\\",\\\"value\\\":\\\"ddh\\\"},{\\\"label\\\":\\\"在产项目\\\",\\\"text\\\":\\\"在产项目\\\",\\\"value\\\":\\\"zcxm\\\"},{\\\"label\\\":\\\"重量\\\",\\\"text\\\":\\\"重量\\\",\\\"value\\\":\\\"zl\\\"},{\\\"label\\\":\\\"交货日期\\\",\\\"text\\\":\\\"交货日期\\\",\\\"value\\\":\\\"jhrq\\\"},{\\\"label\\\":\\\"产量进度\\\",\\\"text\\\":\\\"产量进度\\\",\\\"value\\\":\\\"scjd\\\"}],\\\"dataSetType\\\":\\\"json\\\",\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"ddh\\\",\\\"title\\\":\\\"订单号\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"zcxm\\\",\\\"title\\\":\\\"在产项目\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"zl\\\",\\\"title\\\":\\\"重量\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"jhrq\\\",\\\"title\\\":\\\"交货日期\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"scjd\\\",\\\"title\\\":\\\"产量进度\\\"}]}},\\\"child\\\":[]}]}', 'admin', '2022-05-06 18:29:13', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522523873445158914', NULL, '1522451603569778690', NULL, 'JText', '{\\\"chartData\\\":\\\"本周产量\\\",\\\"size\\\":{\\\"width\\\":200,\\\"height\\\":56},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":76},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:29:13', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522523873529044994', NULL, '1522451603569778690', NULL, 'JText', '{\\\"chartData\\\":\\\"1234678\\\",\\\"size\\\":{\\\"width\\\":200,\\\"height\\\":56},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":76},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:29:13', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522523873621319682', NULL, '1522451603569778690', NULL, 'JText', '{\\\"chartData\\\":\\\"本月产量\\\",\\\"size\\\":{\\\"width\\\":200,\\\"height\\\":56},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":76},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:29:13', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522523873726177281', NULL, '1522451603569778690', NULL, 'JText', '{\\\"chartData\\\":\\\"87653908\\\",\\\"size\\\":{\\\"width\\\":200,\\\"height\\\":56},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":76},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:29:13', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522524336454377473', NULL, '1522417428246568961', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":43,\\\"height\\\":45},\\\"w\\\":10,\\\"dataType\\\":1,\\\"h\\\":20,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://jeecgos.oss-cn-beijing.aliyuncs.com/bigscreen/images/8830d68590e34dfdadd8ca0845763fd4.jpg\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:31:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522524336693452802', NULL, '1522417428246568961', NULL, 'JText', '{\\\"chartData\\\":\\\"乡村振兴普惠金融服务平台\\\",\\\"size\\\":{\\\"width\\\":306,\\\"height\\\":78},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"fontSize\\\":23,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":11},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:31:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522524336823476225', NULL, '1522417428246568961', NULL, 'JText', '{\\\"chartData\\\":\\\"农牧耕田（亩）：12345\\\",\\\"size\\\":{\\\"width\\\":253,\\\"height\\\":45},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":13},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:31:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522524336903168002', NULL, '1522417428246568961', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":43,\\\"height\\\":45},\\\"w\\\":10,\\\"dataType\\\":1,\\\"h\\\":20,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://jeecgos.oss-cn-beijing.aliyuncs.com/bigscreen/images/8830d68590e34dfdadd8ca0845763fd4.jpg\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:31:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522524336974471169', NULL, '1522417428246568961', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":43,\\\"height\\\":45},\\\"w\\\":10,\\\"dataType\\\":1,\\\"h\\\":20,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://jeecgos.oss-cn-beijing.aliyuncs.com/bigscreen/images/8830d68590e34dfdadd8ca0845763fd4.jpg\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:31:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522524337066745858', NULL, '1522417428246568961', NULL, 'JText', '{\\\"chartData\\\":\\\"农牧产量（斤）：56789\\\",\\\"size\\\":{\\\"height\\\":50},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":11},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:31:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522524337146437633', NULL, '1522417428246568961', NULL, 'JText', '{\\\"chartData\\\":\\\"综合产品：4567768\\\",\\\"size\\\":{\\\"height\\\":50},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":13},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:31:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522524337251295233', NULL, '1522417428246568961', NULL, 'JCommonTable', '{\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"乡村振兴_表格\\\",\\\"h\\\":42,\\\"dataSetApi\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"数据\\\\\\\",\\\\\\\"sj\\\\\\\":\\\\\\\"1000\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"担保\\\\\\\",\\\\\\\"je\\\\\\\":\\\\\\\"50\\\\\\\",\\\\\\\"jg\\\\\\\":\\\\\\\"机构\\\\\\\",\\\\\\\"jl\\\\\\\":\\\\\\\"数据2\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"数据1\\\\\\\",\\\\\\\"sj\\\\\\\":\\\\\\\"1500\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"担保\\\\\\\",\\\\\\\"je\\\\\\\":\\\\\\\"100\\\\\\\",\\\\\\\"jg\\\\\\\":\\\\\\\"机构2\\\\\\\",\\\\\\\"jl\\\\\\\":\\\\\\\"李四\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"数据\\\\\\\",\\\\\\\"sj\\\\\\\":\\\\\\\"1000\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"担保\\\\\\\",\\\\\\\"je\\\\\\\":\\\\\\\"50\\\\\\\",\\\\\\\"jg\\\\\\\":\\\\\\\"机构\\\\\\\",\\\\\\\"jl\\\\\\\":\\\\\\\"数据2\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"数据1\\\\\\\",\\\\\\\"sj\\\\\\\":\\\\\\\"1500\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"担保\\\\\\\",\\\\\\\"je\\\\\\\":\\\\\\\"100\\\\\\\",\\\\\\\"jg\\\\\\\":\\\\\\\"机构2\\\\\\\",\\\\\\\"jl\\\\\\\":\\\\\\\"李四\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"数据\\\\\\\",\\\\\\\"sj\\\\\\\":\\\\\\\"1000\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"担保\\\\\\\",\\\\\\\"je\\\\\\\":\\\\\\\"50\\\\\\\",\\\\\\\"jg\\\\\\\":\\\\\\\"机构\\\\\\\",\\\\\\\"jl\\\\\\\":\\\\\\\"数据2\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"数据1\\\\\\\",\\\\\\\"sj\\\\\\\":\\\\\\\"1500\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"担保\\\\\\\",\\\\\\\"je\\\\\\\":\\\\\\\"100\\\\\\\",\\\\\\\"jg\\\\\\\":\\\\\\\"机构2\\\\\\\",\\\\\\\"jl\\\\\\\":\\\\\\\"李四\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"数据\\\\\\\",\\\\\\\"sj\\\\\\\":\\\\\\\"1000\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"担保\\\\\\\",\\\\\\\"je\\\\\\\":\\\\\\\"50\\\\\\\",\\\\\\\"jg\\\\\\\":\\\\\\\"机构\\\\\\\",\\\\\\\"jl\\\\\\\":\\\\\\\"数据2\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"数据1\\\\\\\",\\\\\\\"sj\\\\\\\":\\\\\\\"1500\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"担保\\\\\\\",\\\\\\\"je\\\\\\\":\\\\\\\"100\\\\\\\",\\\\\\\"jg\\\\\\\":\\\\\\\"机构2\\\\\\\",\\\\\\\"jl\\\\\\\":\\\\\\\"李四\\\\\\\"}]\\\",\\\"drillData\\\":[],\\\"timeOut\\\":0,\\\"chartData\\\":\\\"\\\",\\\"size\\\":{\\\"width\\\":726,\\\"height\\\":463},\\\"dataSetId\\\":\\\"1522422772532256770\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"客户姓名\\\",\\\"text\\\":\\\"客户姓名\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"放款时间\\\",\\\"text\\\":\\\"放款时间\\\",\\\"value\\\":\\\"sj\\\"},{\\\"label\\\":\\\"担保方式\\\",\\\"text\\\":\\\"担保方式\\\",\\\"value\\\":\\\"type\\\"},{\\\"label\\\":\\\"放款金额\\\",\\\"text\\\":\\\"放款金额\\\",\\\"value\\\":\\\"je\\\"},{\\\"label\\\":\\\"法人机构\\\",\\\"text\\\":\\\"法人机构\\\",\\\"value\\\":\\\"jg\\\"},{\\\"label\\\":\\\"客户经理\\\",\\\"text\\\":\\\"客户经理\\\",\\\"value\\\":\\\"jl\\\"}],\\\"dataSetType\\\":\\\"json\\\",\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"name\\\",\\\"title\\\":\\\"客户姓名\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"sj\\\",\\\"title\\\":\\\"放款时间\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"type\\\",\\\"title\\\":\\\"担保方式\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"je\\\",\\\"title\\\":\\\"放款金额\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"jg\\\",\\\"title\\\":\\\"法人机构\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"jl\\\",\\\"title\\\":\\\"客户经理\\\"}]}}', 'admin', '2022-05-06 18:31:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522524337356152834', NULL, '1522417428246568961', NULL, 'JLine', '{\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"梨\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"葡萄\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"山楂\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":516,\\\"height\\\":309},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":61,\\\"show\\\":false,\\\"right\\\":62},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"text\\\":\\\"五年产业变化趋势\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:31:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522524337461010433', NULL, '1522417428246568961', NULL, 'JBar', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"大豆\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小麦\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"果蔬\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":516,\\\"height\\\":298},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"left\\\":66,\\\"bottom\\\":65,\\\"show\\\":false,\\\"right\\\":1},\\\"series\\\":[{\\\"data\\\":[],\\\"showBackground\\\":true,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"rgba(180,180,180,0.2)\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"农产品排名\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:31:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522524337565868034', NULL, '1522417428246568961', NULL, 'JPie', '{\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"蔬菜\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"果物\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"粮食\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"养殖\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":516,\\\"height\\\":254},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"AccessFrom\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0,0,0,0.5)\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"innerRadius\\\":50,\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"农业占比\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:31:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522524337670725634', NULL, '1522417428246568961', NULL, 'JText', '{\\\"chartData\\\":\\\"综合收入：678904\\\",\\\"size\\\":{\\\"height\\\":50},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":11},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:31:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522524337742028802', NULL, '1522417428246568961', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":43,\\\"height\\\":45},\\\"w\\\":10,\\\"dataType\\\":1,\\\"h\\\":20,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://jeecgos.oss-cn-beijing.aliyuncs.com/bigscreen/images/8830d68590e34dfdadd8ca0845763fd4.jpg\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:31:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522524337813331969', NULL, '1522417428246568961', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":43,\\\"height\\\":45},\\\"w\\\":10,\\\"dataType\\\":1,\\\"h\\\":20,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://jeecgos.oss-cn-beijing.aliyuncs.com/bigscreen/images/8830d68590e34dfdadd8ca0845763fd4.jpg\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:31:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522524337884635138', NULL, '1522417428246568961', NULL, 'JText', '{\\\"chartData\\\":\\\"农牧产量（斤）：56789\\\",\\\"size\\\":{\\\"height\\\":50},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":11},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:31:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522524337951744001', NULL, '1522417428246568961', NULL, 'JText', '{\\\"chartData\\\":\\\"农牧产量（斤）：56789\\\",\\\"size\\\":{\\\"height\\\":50},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":11},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:31:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522524338023047170', NULL, '1522417428246568961', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":43,\\\"height\\\":45},\\\"w\\\":10,\\\"dataType\\\":1,\\\"h\\\":20,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"https://jeecgos.oss-cn-beijing.aliyuncs.com/bigscreen/images/8830d68590e34dfdadd8ca0845763fd4.jpg\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:31:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1522524338094350337', NULL, '1522417428246568961', NULL, 'JFunnel', '{\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":335,\\\\\\\"name\\\\\\\":\\\\\\\"果蔬\\\\\\\"},{\\\\\\\"value\\\\\\\":310,\\\\\\\"name\\\\\\\":\\\\\\\"粮食\\\\\\\"},{\\\\\\\"value\\\\\\\":234,\\\\\\\"name\\\\\\\":\\\\\\\"养殖\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":411,\\\"height\\\":408},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/funnel\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"legend\\\":{\\\"orient\\\":\\\"horizontal\\\",\\\"show\\\":false},\\\"series\\\":[{\\\"left\\\":\\\"10%\\\",\\\"gap\\\":2,\\\"name\\\":\\\"Funnel\\\",\\\"width\\\":\\\"80%\\\",\\\"emphasis\\\":{\\\"label\\\":{\\\"fontSize\\\":20}},\\\"itemStyle\\\":{\\\"borderColor\\\":\\\"#fff\\\",\\\"borderWidth\\\":1},\\\"sort\\\":\\\"descending\\\",\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"inside\\\"},\\\"labelLine\\\":{\\\"lineStyle\\\":{\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"length\\\":10},\\\"type\\\":\\\"funnel\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a}<br/>{b}:{c}%\\\",\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"农产品收入排行\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-06 18:31:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1523906947722629122', NULL, '1522121177760280578', NULL, 'JText', '{\\\"chartData\\\":\\\"医院综合数据统计\\\",\\\"size\\\":{\\\"width\\\":607,\\\"height\\\":78},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"fontSize\\\":25,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":216},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-10 14:05:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1523906947861041153', NULL, '1522121177760280578', NULL, 'JStackBar', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"内科\\\\\\\",\\\\\\\"value\\\\\\\":10079,\\\\\\\"type\\\\\\\":\\\\\\\"床位\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"外科\\\\\\\",\\\\\\\"value\\\\\\\":34879,\\\\\\\"type\\\\\\\":\\\\\\\"床位\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"儿科\\\\\\\",\\\\\\\"value\\\\\\\":20879,\\\\\\\"type\\\\\\\":\\\\\\\"床位\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"骨科\\\\\\\",\\\\\\\"value\\\\\\\":5879,\\\\\\\"type\\\\\\\":\\\\\\\"床位\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"放射科\\\\\\\",\\\\\\\"value\\\\\\\":3479,\\\\\\\"type\\\\\\\":\\\\\\\"床位\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"内科\\\\\\\",\\\\\\\"value\\\\\\\":1879,\\\\\\\"type\\\\\\\":\\\\\\\"接诊\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"外科\\\\\\\",\\\\\\\"value\\\\\\\":3879,\\\\\\\"type\\\\\\\":\\\\\\\"接诊\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"儿科\\\\\\\",\\\\\\\"value\\\\\\\":2309,\\\\\\\"type\\\\\\\":\\\\\\\"接诊\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"放射科\\\\\\\",\\\\\\\"value\\\\\\\":5409,\\\\\\\"type\\\\\\\":\\\\\\\"接诊\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"骨科\\\\\\\",\\\\\\\"value\\\\\\\":3479,\\\\\\\"type\\\\\\\":\\\\\\\"接诊\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":539,\\\"height\\\":397},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"type\\\":\\\"category\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"bottom\\\":115},\\\"series\\\":[],\\\"legend\\\":{\\\"r\\\":4,\\\"t\\\":1},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"机构情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-10 14:05:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1523906947932344321', NULL, '1522121177760280578', NULL, 'JArea', '{\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"2010\\\\\\\"},{\\\\\\\"value\\\\\\\":605,\\\\\\\"name\\\\\\\":\\\\\\\"2011\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"2012\\\\\\\"},{\\\\\\\"value\\\\\\\":700,\\\\\\\"name\\\\\\\":\\\\\\\"2013\\\\\\\"},{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"2014\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":470,\\\"height\\\":265},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"name\\\":\\\"床位数\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"data\\\":[],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"name\\\":\\\"年份\\\",\\\"boundaryGap\\\":false,\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"left\\\":46,\\\"bottom\\\":46,\\\"right\\\":25},\\\"series\\\":[{\\\"areaStyle\\\":{},\\\"data\\\":[],\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"床位总数\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-10 14:05:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1523906948037201921', NULL, '1522121177760280578', NULL, 'JBar', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"教授\\\\\\\",\\\\\\\"value\\\\\\\":123},{\\\\\\\"name\\\\\\\":\\\\\\\"博士\\\\\\\",\\\\\\\"value\\\\\\\":98},{\\\\\\\"name\\\\\\\":\\\\\\\"硕士\\\\\\\",\\\\\\\"value\\\\\\\":75},{\\\\\\\"name\\\\\\\":\\\\\\\"本科\\\\\\\",\\\\\\\"value\\\\\\\":66}]\\\",\\\"size\\\":{\\\"width\\\":539,\\\"height\\\":309},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"type\\\":\\\"value\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":1,\\\"left\\\":38,\\\"bottom\\\":70,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"showBackground\\\":true,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"rgba(180,180,180,0.2)\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"top\\\":1,\\\"show\\\":false,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-10 14:05:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1523906948108505089', NULL, '1522121177760280578', NULL, 'JColorGauge', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"满意度\\\\\\\",\\\\\\\"value\\\\\\\":95,\\\\\\\"unit\\\\\\\":\\\\\\\"%\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":264,\\\"height\\\":287},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"名称\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/gauge\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"series\\\":[{\\\"axisLabel\\\":{\\\"show\\\":true,\\\"fontSize\\\":12},\\\"pointer\\\":{\\\"width\\\":8},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.25,\\\"#FF6E76\\\"],[0.5,\\\"#FDDD60\\\"],[1,\\\"#58D9F9\\\"]],\\\"width\\\":10}},\\\"anchor\\\":{\\\"itemStyle\\\":{\\\"color\\\":\\\"#FAC858\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\",\\\"width\\\":4},\\\"length\\\":12},\\\"axisTick\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\"},\\\"show\\\":true},\\\"title\\\":{\\\"fontSize\\\":14}}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a}<br/>{b}:{c}%\\\"},\\\"title\\\":{\\\"top\\\":1,\\\"show\\\":false,\\\"text\\\":\\\"多色仪表盘\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-10 14:05:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1523906948179808258', NULL, '1522121177760280578', NULL, 'JColorGauge', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"投诉率\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"unit\\\\\\\":\\\\\\\"%\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":264,\\\"height\\\":287},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"名称\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/gauge\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"series\\\":[{\\\"axisLabel\\\":{\\\"show\\\":true,\\\"fontSize\\\":12},\\\"pointer\\\":{\\\"width\\\":8},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.25,\\\"#FF6E76\\\"],[0.5,\\\"#FDDD60\\\"],[1,\\\"#58D9F9\\\"]],\\\"width\\\":10}},\\\"anchor\\\":{\\\"itemStyle\\\":{\\\"color\\\":\\\"#FAC858\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\",\\\"width\\\":4},\\\"length\\\":12},\\\"axisTick\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEEEEE\\\"},\\\"show\\\":true},\\\"title\\\":{\\\"fontSize\\\":14}}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a}<br/>{b}:{c}%\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"多色仪表盘\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-10 14:05:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1523906948246917122', NULL, '1522121177760280578', NULL, 'JPie', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"核磁共振\\\\\\\",\\\\\\\"value\\\\\\\":1000879},{\\\\\\\"name\\\\\\\":\\\\\\\"呼吸机\\\\\\\",\\\\\\\"value\\\\\\\":3400879},{\\\\\\\"name\\\\\\\":\\\\\\\"CT\\\\\\\",\\\\\\\"value\\\\\\\":2300879},{\\\\\\\"name\\\\\\\":\\\\\\\"彩超\\\\\\\",\\\\\\\"value\\\\\\\":5400879},{\\\\\\\"name\\\\\\\":\\\\\\\"3D打印\\\\\\\",\\\\\\\"value\\\\\\\":3000}]\\\",\\\"size\\\":{\\\"width\\\":470,\\\"height\\\":342},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"isRose\\\":true,\\\"grid\\\":{\\\"top\\\":47,\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"r\\\":7,\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"AccessFrom\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0,0,0,0.5)\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"innerRadius\\\":50,\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"设备情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-10 14:05:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1523906948351774722', NULL, '1522121177760280578', NULL, 'JLine', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"1月\\\\\\\",\\\\\\\"value\\\\\\\":2,\\\\\\\"series\\\\\\\":\\\\\\\"医师\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"series\\\\\\\":\\\\\\\"医师\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"series\\\\\\\":\\\\\\\"医师\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":23.2,\\\\\\\"series\\\\\\\":\\\\\\\"医师\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":25.6,\\\\\\\"series\\\\\\\":\\\\\\\"医师\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":76.7,\\\\\\\"series\\\\\\\":\\\\\\\"医师\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"7月\\\\\\\",\\\\\\\"value\\\\\\\":135.6,\\\\\\\"series\\\\\\\":\\\\\\\"医师\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"8月\\\\\\\",\\\\\\\"value\\\\\\\":162.2,\\\\\\\"series\\\\\\\":\\\\\\\"医师\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"9月\\\\\\\",\\\\\\\"value\\\\\\\":32.6,\\\\\\\"series\\\\\\\":\\\\\\\"医师\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"10月\\\\\\\",\\\\\\\"value\\\\\\\":20,\\\\\\\"series\\\\\\\":\\\\\\\"医师\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"11月\\\\\\\",\\\\\\\"value\\\\\\\":6.4,\\\\\\\"series\\\\\\\":\\\\\\\"医师\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"12月\\\\\\\",\\\\\\\"value\\\\\\\":3.3,\\\\\\\"series\\\\\\\":\\\\\\\"医师\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1月\\\\\\\",\\\\\\\"value\\\\\\\":2.6,\\\\\\\"series\\\\\\\":\\\\\\\"护士\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":5.9,\\\\\\\"series\\\\\\\":\\\\\\\"护士\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"series\\\\\\\":\\\\\\\"护士\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":26.4,\\\\\\\"series\\\\\\\":\\\\\\\"护士\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":28.7,\\\\\\\"series\\\\\\\":\\\\\\\"护士\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":70.7,\\\\\\\"series\\\\\\\":\\\\\\\"护士\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"7月\\\\\\\",\\\\\\\"value\\\\\\\":175.6,\\\\\\\"series\\\\\\\":\\\\\\\"护士\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"8月\\\\\\\",\\\\\\\"value\\\\\\\":182.2,\\\\\\\"series\\\\\\\":\\\\\\\"护士\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"9月\\\\\\\",\\\\\\\"value\\\\\\\":48.7,\\\\\\\"series\\\\\\\":\\\\\\\"护士\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"10月\\\\\\\",\\\\\\\"value\\\\\\\":18.8,\\\\\\\"series\\\\\\\":\\\\\\\"护士\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"11月\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"series\\\\\\\":\\\\\\\"护士\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"12月\\\\\\\",\\\\\\\"value\\\\\\\":2.3,\\\\\\\"series\\\\\\\":\\\\\\\"护士\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"bar\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":470,\\\"height\\\":375},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"name\\\":\\\"人数\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"name\\\":\\\"月份\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"left\\\":33,\\\"bottom\\\":87,\\\"show\\\":false,\\\"right\\\":53},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"text\\\":\\\"人员总数\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-10 14:05:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1523906948423077889', NULL, '1522121177760280578', NULL, 'JRing', '{\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"消炎药\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"感冒药\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"皮肤类药物\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"外科用药\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":607,\\\"height\\\":364},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"AccessFrom\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"科室用药\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-10 14:05:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1523906948490186754', NULL, '1522121177760280578', NULL, 'JFunnel', '{\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":25,\\\\\\\"name\\\\\\\":\\\\\\\"特级护士\\\\\\\"},{\\\\\\\"value\\\\\\\":310,\\\\\\\"name\\\\\\\":\\\\\\\"住院总医师\\\\\\\"},{\\\\\\\"value\\\\\\\":234,\\\\\\\"name\\\\\\\":\\\\\\\"护士\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"主任\\\\\\\",\\\\\\\"value\\\\\\\":50}]\\\",\\\"size\\\":{\\\"width\\\":607,\\\"height\\\":364},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/funnel\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"legend\\\":{\\\"orient\\\":\\\"horizontal\\\"},\\\"series\\\":[{\\\"left\\\":\\\"10%\\\",\\\"gap\\\":2,\\\"name\\\":\\\"Funnel\\\",\\\"width\\\":\\\"80%\\\",\\\"emphasis\\\":{\\\"label\\\":{\\\"fontSize\\\":20}},\\\"itemStyle\\\":{\\\"borderColor\\\":\\\"#fff\\\",\\\"borderWidth\\\":1},\\\"sort\\\":\\\"descending\\\",\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"inside\\\"},\\\"labelLine\\\":{\\\"lineStyle\\\":{\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"length\\\":10},\\\"type\\\":\\\"funnel\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a}<br/>{b}:{c}%\\\",\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础漏斗图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-10 14:05:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1523906948561489921', NULL, '1522121177760280578', NULL, 'JGrowCard', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"title\\\\\\\": \\\\\\\"床位数\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"\\\\\\\",    \\\\\\\"value\\\\\\\": 258,    \\\\\\\"prefix\\\\\\\": \\\\\\\"\\\\\\\",    \\\\\\\"color\\\\\\\": \\\\\\\"green\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"人员数\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"\\\\\\\",    \\\\\\\"value\\\\\\\": 1120,    \\\\\\\"total\\\\\\\": \\\\\\\"\\\\\\\",    \\\\\\\"prefix\\\\\\\": \\\\\\\"\\\\\\\",    \\\\\\\"color\\\\\\\": \\\\\\\"blue\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"百万设置\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"\\\\\\\",    \\\\\\\"value\\\\\\\": 870,    \\\\\\\"prefix\\\\\\\": \\\\\\\"\\\\\\\",    \\\\\\\"total\\\\\\\": \\\\\\\"\\\\\\\",    \\\\\\\"color\\\\\\\": \\\\\\\"orange\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":607,\\\"height\\\":166},\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":19,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":20},\\\"body\\\":{\\\"horizontal\\\":8,\\\"vertical\\\":8,\\\"span\\\":8},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"统计卡片\\\"}}}', 'admin', '2022-05-10 14:05:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524656729709641730', NULL, '1522823348231397378', NULL, 'JForm', '{\\\"size\\\":{\\\"height\\\":120},\\\"w\\\":24,\\\"dataType\\\":2,\\\"h\\\":12,\\\"linkageConfig\\\":[{\\\"linkageId\\\":\\\"491fc4c0-782c-49ac-838c-ae7003abece2\\\",\\\"linkage\\\":[{\\\"source\\\":\\\"name\\\",\\\"target\\\":\\\"name\\\"},{\\\"source\\\":\\\"sex\\\",\\\"target\\\":\\\"sex\\\"}]}],\\\"timeOut\\\":-1,\\\"option\\\":{\\\"fields\\\":[{\\\"fieldName\\\":\\\"sex\\\",\\\"dictCode\\\":\\\"sex\\\",\\\"fieldTxt\\\":\\\"性别\\\",\\\"defaultValue\\\":\\\"1\\\",\\\"searchMode\\\":\\\"\\\",\\\"action\\\":\\\"\\\",\\\"id\\\":\\\"row57227ae2-04d1-4306-8878-314e099cd5ac\\\",\\\"izSearch\\\":\\\"1\\\",\\\"widgetType\\\":\\\"select\\\"}]}}', 'admin', '2022-05-12 15:44:26', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524656729776750593', NULL, '1522823348231397378', NULL, 'JCommonTable', '{\\\"paramOption\\\":[{\\\"defaultVal\\\":\\\"1\\\",\\\"label\\\":\\\"sex\\\",\\\"text\\\":\\\"sex\\\",\\\"value\\\":\\\"sex\\\"}],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"示例_数据表格\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"select*fromdemowheresex=\\'${sex}\\'\\\",\\\"drillData\\\":[],\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"height\\\":420},\\\"dataSetId\\\":\\\"1522824721899511810\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"姓名\\\",\\\"text\\\":\\\"姓名\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"打卡时间\\\",\\\"text\\\":\\\"打卡时间\\\",\\\"value\\\":\\\"punch_time\\\"},{\\\"label\\\":\\\"工资\\\",\\\"text\\\":\\\"工资\\\",\\\"value\\\":\\\"salary_money\\\"},{\\\"label\\\":\\\"奖金\\\",\\\"text\\\":\\\"奖金\\\",\\\"value\\\":\\\"bonus_money\\\"},{\\\"label\\\":\\\"性别\\\",\\\"text\\\":\\\"性别\\\",\\\"value\\\":\\\"sex\\\"},{\\\"label\\\":\\\"年龄\\\",\\\"text\\\":\\\"年龄\\\",\\\"value\\\":\\\"age\\\"},{\\\"label\\\":\\\"生日\\\",\\\"text\\\":\\\"生日\\\",\\\"value\\\":\\\"birthday\\\"},{\\\"label\\\":\\\"邮箱\\\",\\\"text\\\":\\\"邮箱\\\",\\\"value\\\":\\\"email\\\"},{\\\"label\\\":\\\"个人简介\\\",\\\"text\\\":\\\"个人简介\\\",\\\"value\\\":\\\"content\\\"}],\\\"dataSetType\\\":\\\"sql\\\",\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"name\\\",\\\"title\\\":\\\"姓名\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"punch_time\\\",\\\"title\\\":\\\"打卡时间\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"salary_money\\\",\\\"title\\\":\\\"工资\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"bonus_money\\\",\\\"title\\\":\\\"奖金\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"sex\\\",\\\"title\\\":\\\"性别\\\"},{\\\"izTotal\\\":\\\"Y\\\",\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"age\\\",\\\"title\\\":\\\"年龄\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"birthday\\\",\\\"title\\\":\\\"生日\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"email\\\",\\\"title\\\":\\\"邮箱\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"content\\\",\\\"title\\\":\\\"个人简介\\\"}]}}', 'admin', '2022-05-12 15:44:26', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524661142020980737', NULL, '1522172834409885698', NULL, 'JText', '{\\\"chartData\\\":\\\"智慧社区内网比对平台\\\",\\\"size\\\":{\\\"width\\\":676,\\\"height\\\":67},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"fontSize\\\":25,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":188},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-12 16:01:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524661142121644034', NULL, '1522172834409885698', NULL, 'JText', '{\\\"chartData\\\":\\\"当前对比数据\\\",\\\"size\\\":{\\\"width\\\":470,\\\"height\\\":56},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#182FC7\\\",\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":50},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-12 16:01:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524661142226501634', NULL, '1522172834409885698', NULL, 'JText', '{\\\"chartData\\\":\\\"256321\\\",\\\"size\\\":{\\\"width\\\":470,\\\"height\\\":56},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":60},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-12 16:01:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524661142331359233', NULL, '1522172834409885698', NULL, 'JText', '{\\\"chartData\\\":\\\"违法犯罪人员分析\\\",\\\"size\\\":{\\\"width\\\":470,\\\"height\\\":45},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":76},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-12 16:01:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524661142436216833', NULL, '1522172834409885698', NULL, 'JPie', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"智慧社区_违法犯罪人员分析\\\",\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/Illegal\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":470,\\\"height\\\":386},\\\"dataSetId\\\":\\\"1522181219549196289\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"},{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"r\\\":7,\\\"orient\\\":\\\"horizontal\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"AccessFrom\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0,0,0,0.5)\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"innerRadius\\\":50,\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":false,\\\"text\\\":\\\"基础饼图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-12 16:01:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524661142541074433', NULL, '1522172834409885698', NULL, 'JText', '{\\\"chartData\\\":\\\"人口出入记录\\\",\\\"size\\\":{\\\"width\\\":470,\\\"height\\\":56},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":76},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-12 16:01:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524661142645932033', NULL, '1522172834409885698', NULL, 'JCommonTable', '{\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"智慧社区_人员出入记录\\\",\\\"h\\\":42,\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/ace\\\",\\\"drillData\\\":[],\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"width\\\":470,\\\"height\\\":463},\\\"dataSetId\\\":\\\"1522182473872584705\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"姓名\\\",\\\"text\\\":\\\"姓名\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"类型\\\",\\\"text\\\":\\\"类型\\\",\\\"value\\\":\\\"type\\\"},{\\\"label\\\":\\\"开门方式\\\",\\\"text\\\":\\\"开门方式\\\",\\\"value\\\":\\\"mode\\\"},{\\\"label\\\":\\\"日期\\\",\\\"text\\\":\\\"日期\\\",\\\"value\\\":\\\"date\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"name\\\",\\\"title\\\":\\\"姓名\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"type\\\",\\\"title\\\":\\\"类型\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"mode\\\",\\\"title\\\":\\\"开门方式\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"date\\\",\\\"title\\\":\\\"日期\\\"}]}}', 'admin', '2022-05-12 16:01:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524661142750789634', NULL, '1522172834409885698', NULL, 'JText', '{\\\"chartData\\\":\\\"JeecgBoot面板设计\\\",\\\"size\\\":{\\\"width\\\":470,\\\"height\\\":45},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":76},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-12 16:01:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524661142855647234', NULL, '1522172834409885698', NULL, 'JText', '{\\\"chartData\\\":\\\"JeecgBoot面板设计\\\",\\\"size\\\":{\\\"width\\\":470,\\\"height\\\":45},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":76},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-12 16:01:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524661142960504833', NULL, '1522172834409885698', NULL, 'JText', '{\\\"chartData\\\":\\\"JeecgBoot面板设计\\\",\\\"size\\\":{\\\"width\\\":470,\\\"height\\\":45},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":76},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-12 16:01:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524661143065362433', NULL, '1522172834409885698', NULL, 'JLine', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"智慧社区_时间分部\\\",\\\"dataSetApi\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"6:00-9:00\\\\\\\",\\\\\\\"value\\\\\\\":800},{\\\\\\\"name\\\\\\\":\\\\\\\"10:00-12:00\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"13:00-15:00\\\\\\\",\\\\\\\"value\\\\\\\":500},{\\\\\\\"name\\\\\\\":\\\\\\\"16:00-20:00\\\\\\\",\\\\\\\"value\\\\\\\":800},{\\\\\\\"name\\\\\\\":\\\\\\\"21:00-24:00\\\\\\\",\\\\\\\"value\\\\\\\":600}]\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":470,\\\"height\\\":298},\\\"dataSetId\\\":\\\"1522187101267832833\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"json\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"text\\\":\\\"时间分部\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-12 16:01:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524661143170220033', NULL, '1522172834409885698', NULL, 'JBar', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"智慧社区_地区分部\\\",\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/region\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":470,\\\"height\\\":309},\\\"dataSetId\\\":\\\"1522185936018878466\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"showBackground\\\":true,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"rgba(180,180,180,0.2)\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"地域分部\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-12 16:01:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524661143275077633', NULL, '1522172834409885698', NULL, 'JRing', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"智慧社区_年龄分部\\\",\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/age\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":470,\\\"height\\\":320},\\\"dataSetId\\\":\\\"1522184215045615618\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"},{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"AccessFrom\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"年龄分部\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-12 16:01:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524661143379935234', NULL, '1522172834409885698', NULL, 'JGauge', '{\\\"chartData\\\":\\\"[{\\\\\\\"min\\\\\\\":1,\\\\\\\"max\\\\\\\":10,\\\\\\\"label\\\\\\\":\\\\\\\"名称\\\\\\\",\\\\\\\"value\\\\\\\":10,\\\\\\\"unit\\\\\\\":\\\\\\\"%\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":516,\\\"height\\\":320},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"名称\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/gauge\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"series\\\":[{\\\"axisLabel\\\":{\\\"show\\\":true,\\\"fontSize\\\":12},\\\"data\\\":[],\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#eee\\\",\\\"width\\\":4},\\\"length\\\":12},\\\"axisTick\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#eee\\\"},\\\"show\\\":true},\\\"progress\\\":{\\\"show\\\":true},\\\"detail\\\":{\\\"formatter\\\":\\\"{value}\\\",\\\"fontSize\\\":25},\\\"type\\\":\\\"gauge\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a}<br/>{b}:{c}%\\\"},\\\"title\\\":{\\\"text\\\":\\\"环比\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-12 16:01:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524661143518347265', NULL, '1522172834409885698', NULL, 'JColorGauge', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"降低率\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"unit\\\\\\\":\\\\\\\"%\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":516,\\\"height\\\":331},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"名称\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/gauge\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"series\\\":[{\\\"axisLabel\\\":{\\\"show\\\":true,\\\"fontSize\\\":12},\\\"pointer\\\":{\\\"width\\\":8},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.25,\\\"#FF6E76\\\"],[0.5,\\\"#FDDD60\\\"],[1,\\\"#58D9F9\\\"]],\\\"width\\\":10}},\\\"anchor\\\":{\\\"itemStyle\\\":{\\\"color\\\":\\\"#FAC858\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#eee\\\",\\\"width\\\":4},\\\"length\\\":12},\\\"axisTick\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#eee\\\"},\\\"show\\\":true},\\\"title\\\":{\\\"fontSize\\\":14}}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a}<br/>{b}:{c}%\\\"},\\\"title\\\":{\\\"text\\\":\\\"同比\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-12 16:01:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524661143660953602', NULL, '1522172834409885698', NULL, 'JStackBar', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":676,\\\"height\\\":364},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"年份分部\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-05-12 16:01:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524663379220791297', NULL, '1517018517935783937', NULL, 'JTabs', '{\\\"size\\\":{\\\"width\\\":1650,\\\"height\\\":606},\\\"w\\\":12,\\\"h\\\":40,\\\"option\\\":{\\\"title\\\":\\\"选项卡\\\"},\\\"child\\\":[{\\\"component\\\":\\\"JPie\\\",\\\"w\\\":12,\\\"x\\\":0,\\\"h\\\":42,\\\"i\\\":\\\"68ebef80-9ded-4168-8d89-19ec64bc21d9\\\",\\\"title\\\":\\\"饼图\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"nature\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"total\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"项目性质收入统计SQL\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"SELECT\\\\tid,\\\\tnature,\\\\tinsurance_fee,\\\\trisk_consulting_fee,\\\\tevaluation_fee,\\\\tinsurance_evaluation_fee,\\\\tbidding_consulting_fee,\\\\tinterol_consulting_fee,\\\\t(\\\\t\\\\tinsurance_fee+\\\\t\\\\trisk_consulting_fee+\\\\t\\\\trisk_consulting_fee+\\\\t\\\\tevaluation_fee+\\\\t\\\\tinsurance_evaluation_fee+\\\\t\\\\tbidding_consulting_fee+\\\\t\\\\tinterol_consulting_fee\\\\t)AS\\'total\\'FROM\\\\tjeecg_project_nature_income\\\",\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"paddingBottom\\\":90,\\\"dataSetId\\\":\\\"1517020649262972930\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"项目性质\\\",\\\"text\\\":\\\"项目性质\\\",\\\"value\\\":\\\"nature\\\"},{\\\"label\\\":\\\"保险经纪佣金费\\\",\\\"text\\\":\\\"保险经纪佣金费\\\",\\\"value\\\":\\\"insurance_fee\\\"},{\\\"label\\\":\\\"风险咨询费\\\",\\\"text\\\":\\\"风险咨询费\\\",\\\"value\\\":\\\"risk_consulting_fee\\\"},{\\\"label\\\":\\\"承保公估评估费\\\",\\\"text\\\":\\\"承保公估评估费\\\",\\\"value\\\":\\\"evaluation_fee\\\"},{\\\"label\\\":\\\"保险公估费\\\",\\\"text\\\":\\\"保险公估费\\\",\\\"value\\\":\\\"insurance_evaluation_fee\\\"},{\\\"label\\\":\\\"投标咨询费\\\",\\\"text\\\":\\\"投标咨询费\\\",\\\"value\\\":\\\"bidding_consulting_fee\\\"},{\\\"label\\\":\\\"内控咨询费\\\",\\\"text\\\":\\\"内控咨询费\\\",\\\"value\\\":\\\"interol_consulting_fee\\\"},{\\\"label\\\":\\\"total\\\",\\\"text\\\":\\\"total\\\",\\\"value\\\":\\\"total\\\"}],\\\"dataSetType\\\":\\\"sql\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"AccessFrom\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0,0,0,0.5)\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"基础饼图\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}},{\\\"horizontal\\\":false,\\\"component\\\":\\\"JBar\\\",\\\"size\\\":10,\\\"w\\\":12,\\\"x\\\":0,\\\"h\\\":42,\\\"i\\\":\\\"305bdc5d-37d6-42a4-baf3-a7a1f27b6bfb\\\",\\\"text\\\":\\\"0.042\\\",\\\"id\\\":\\\"0b42743d-492f-467b-bfaf-0769110749ab\\\",\\\"title\\\":\\\"柱形图\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"nature\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"total\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"项目性质收入统计SQL\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"SELECT\\\\tid,\\\\tnature,\\\\tinsurance_fee,\\\\trisk_consulting_fee,\\\\tevaluation_fee,\\\\tinsurance_evaluation_fee,\\\\tbidding_consulting_fee,\\\\tinterol_consulting_fee,\\\\t(\\\\t\\\\tinsurance_fee+\\\\t\\\\trisk_consulting_fee+\\\\t\\\\trisk_consulting_fee+\\\\t\\\\tevaluation_fee+\\\\t\\\\tinsurance_evaluation_fee+\\\\t\\\\tbidding_consulting_fee+\\\\t\\\\tinterol_consulting_fee\\\\t)AS\\'total\\'FROM\\\\tjeecg_project_nature_income\\\",\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"paddingBottom\\\":90,\\\"dataSetId\\\":\\\"1517020649262972930\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"项目性质\\\",\\\"text\\\":\\\"项目性质\\\",\\\"value\\\":\\\"nature\\\"},{\\\"label\\\":\\\"保险经纪佣金费\\\",\\\"text\\\":\\\"保险经纪佣金费\\\",\\\"value\\\":\\\"insurance_fee\\\"},{\\\"label\\\":\\\"风险咨询费\\\",\\\"text\\\":\\\"风险咨询费\\\",\\\"value\\\":\\\"risk_consulting_fee\\\"},{\\\"label\\\":\\\"承保公估评估费\\\",\\\"text\\\":\\\"承保公估评估费\\\",\\\"value\\\":\\\"evaluation_fee\\\"},{\\\"label\\\":\\\"保险公估费\\\",\\\"text\\\":\\\"保险公估费\\\",\\\"value\\\":\\\"insurance_evaluation_fee\\\"},{\\\"label\\\":\\\"投标咨询费\\\",\\\"text\\\":\\\"投标咨询费\\\",\\\"value\\\":\\\"bidding_consulting_fee\\\"},{\\\"label\\\":\\\"内控咨询费\\\",\\\"text\\\":\\\"内控咨询费\\\",\\\"value\\\":\\\"interol_consulting_fee\\\"},{\\\"label\\\":\\\"total\\\",\\\"text\\\":\\\"total\\\",\\\"value\\\":\\\"total\\\"}],\\\"dataSetType\\\":\\\"sql\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"showBackground\\\":true,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"rgba(180,180,180,0.2)\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}},\\\"child\\\":[]}]}', 'admin', '2022-05-12 16:10:51', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1524663379359203329', NULL, '1517018517935783937', NULL, 'JCommonTable', '{\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"项目性质收入统计SQL\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"SELECT\\\\tid,\\\\tnature,\\\\tinsurance_fee,\\\\trisk_consulting_fee,\\\\tevaluation_fee,\\\\tinsurance_evaluation_fee,\\\\tbidding_consulting_fee,\\\\tinterol_consulting_fee,\\\\t(\\\\t\\\\tinsurance_fee+\\\\t\\\\trisk_consulting_fee+\\\\t\\\\trisk_consulting_fee+\\\\t\\\\tevaluation_fee+\\\\t\\\\tinsurance_evaluation_fee+\\\\t\\\\tbidding_consulting_fee+\\\\t\\\\tinterol_consulting_fee\\\\t)AS\\'total\\'FROM\\\\tjeecg_project_nature_income\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"width\\\":1636,\\\"height\\\":518},\\\"dataSetId\\\":\\\"1517020649262972930\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"项目性质\\\",\\\"text\\\":\\\"项目性质\\\",\\\"value\\\":\\\"nature\\\"},{\\\"label\\\":\\\"保险经纪佣金费\\\",\\\"text\\\":\\\"保险经纪佣金费\\\",\\\"value\\\":\\\"insurance_fee\\\"},{\\\"label\\\":\\\"风险咨询费\\\",\\\"text\\\":\\\"风险咨询费\\\",\\\"value\\\":\\\"risk_consulting_fee\\\"},{\\\"label\\\":\\\"承保公估评估费\\\",\\\"text\\\":\\\"承保公估评估费\\\",\\\"value\\\":\\\"evaluation_fee\\\"},{\\\"label\\\":\\\"保险公估费\\\",\\\"text\\\":\\\"保险公估费\\\",\\\"value\\\":\\\"insurance_evaluation_fee\\\"},{\\\"label\\\":\\\"投标咨询费\\\",\\\"text\\\":\\\"投标咨询费\\\",\\\"value\\\":\\\"bidding_consulting_fee\\\"},{\\\"label\\\":\\\"内控咨询费\\\",\\\"text\\\":\\\"内控咨询费\\\",\\\"value\\\":\\\"interol_consulting_fee\\\"},{\\\"label\\\":\\\"total\\\",\\\"text\\\":\\\"total\\\",\\\"value\\\":\\\"total\\\"}],\\\"dataSetType\\\":\\\"sql\\\",\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izTotal\\\":\\\"Y\\\",\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"nature\\\",\\\"title\\\":\\\"项目性质\\\"},{\\\"izTotal\\\":\\\"Y\\\",\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"insurance_fee\\\",\\\"title\\\":\\\"保险经纪佣金费\\\"},{\\\"izTotal\\\":\\\"Y\\\",\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"risk_consulting_fee\\\",\\\"title\\\":\\\"风险咨询费\\\"},{\\\"izTotal\\\":\\\"Y\\\",\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"evaluation_fee\\\",\\\"title\\\":\\\"承保公估评估费\\\"},{\\\"izTotal\\\":\\\"Y\\\",\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"insurance_evaluation_fee\\\",\\\"title\\\":\\\"保险公估费\\\"},{\\\"izTotal\\\":\\\"Y\\\",\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"bidding_consulting_fee\\\",\\\"title\\\":\\\"投标咨询费\\\"},{\\\"izTotal\\\":\\\"Y\\\",\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"interol_consulting_fee\\\",\\\"title\\\":\\\"内控咨询费\\\"},{\\\"izTotal\\\":\\\"N\\\",\\\"izShow\\\":\\\"N\\\",\\\"dataIndex\\\":\\\"total\\\",\\\"title\\\":\\\"total\\\"}]}}', 'admin', '2022-05-12 16:10:51', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1526476125109231618', NULL, '1504364941187043329', NULL, 'eoa-cms-banner', '{\\\"size\\\":{\\\"width\\\":1636,\\\"height\\\":364}}', 'jeecg', '2022-05-17 16:14:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1526476125247643650', NULL, '1504364941187043329', NULL, 'eoa-cms-news-info', '{\\\"size\\\":{\\\"width\\\":1087,\\\"height\\\":683}}', 'jeecg', '2022-05-17 16:14:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1526476125352501250', NULL, '1504364941187043329', NULL, 'eoa-cms-user-notice', '{\\\"size\\\":{\\\"width\\\":539,\\\"height\\\":408}}', 'jeecg', '2022-05-17 16:14:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1526476125457358849', NULL, '1504364941187043329', NULL, 'eoa-cms-rule-info', '{\\\"size\\\":{\\\"width\\\":607,\\\"height\\\":474}}', 'jeecg', '2022-05-17 16:14:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1526476125562216450', NULL, '1504364941187043329', NULL, 'eoa-cms-sign-news', '{\\\"size\\\":{\\\"width\\\":470,\\\"height\\\":474}}', 'jeecg', '2022-05-17 16:14:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1526476125667074049', NULL, '1504364941187043329', NULL, 'eoa-cms-plan', '{\\\"size\\\":{\\\"width\\\":539,\\\"height\\\":529}}', 'jeecg', '2022-05-17 16:14:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1526476125771931649', NULL, '1504364941187043329', NULL, 'eoa-cms-link', '{\\\"size\\\":{\\\"width\\\":539,\\\"height\\\":210}}', 'jeecg', '2022-05-17 16:14:04', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1526478613069701121', NULL, '1504359493847306242', NULL, 'eoa-cms-apply-process', '{\\\"size\\\":{\\\"width\\\":1087,\\\"height\\\":463}}', 'jeecg', '2022-05-17 16:23:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1526478613174558721', NULL, '1504359493847306242', NULL, 'eoa-cms-comm-use', '{\\\"size\\\":{\\\"width\\\":1636,\\\"height\\\":155}}', 'jeecg', '2022-05-17 16:23:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1526478613275222017', NULL, '1504359493847306242', NULL, 'eoa-cms-process-notice', '{\\\"size\\\":{\\\"width\\\":539,\\\"height\\\":474}}', 'jeecg', '2022-05-17 16:23:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1526478613384273922', NULL, '1504359493847306242', NULL, 'eoa-cms-my-process', '{\\\"size\\\":{\\\"width\\\":1087,\\\"height\\\":474}}', 'jeecg', '2022-05-17 16:23:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1526478613489131521', NULL, '1504359493847306242', NULL, 'eoa-cms-user-notice', '{\\\"size\\\":{\\\"width\\\":539,\\\"height\\\":463}}', 'jeecg', '2022-05-17 16:23:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1526478613593989121', NULL, '1504359493847306242', NULL, 'eoa-cms-process-chart', '{\\\"size\\\":{\\\"width\\\":1087,\\\"height\\\":386}}', 'jeecg', '2022-05-17 16:23:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1526478613694652418', NULL, '1504359493847306242', NULL, 'eoa-cms-process-type', '{\\\"size\\\":{\\\"width\\\":539,\\\"height\\\":386}}', 'jeecg', '2022-05-17 16:23:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1526478613803704322', NULL, '1504359493847306242', NULL, 'eoa-cms-email', '{\\\"size\\\":{\\\"width\\\":1087,\\\"height\\\":518}}', 'jeecg', '2022-05-17 16:23:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1526478613904367618', NULL, '1504359493847306242', NULL, 'eoa-cms-plan', '{\\\"size\\\":{\\\"width\\\":539,\\\"height\\\":518}}', 'jeecg', '2022-05-17 16:23:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1526496110877696002', NULL, '1522835471967772673', NULL, 'JBar', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"username\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"sex\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[{\\\"defaultVal\\\":\\\"2011-01-01\\\",\\\"label\\\":\\\"createTime_begin\\\",\\\"text\\\":\\\"createTime_begin\\\",\\\"value\\\":\\\"createTime_begin\\\"},{\\\"defaultVal\\\":\\\"2022-12-31\\\",\\\"label\\\":\\\"createTime_end\\\",\\\"text\\\":\\\"createTime_end\\\",\\\"value\\\":\\\"createTime_end\\\"}],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"示例_日期范围查询\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"select * from sys_user where create_time >= \\'${createTime_begin}\\' and create_time <=\\'${createTime_end}\\'\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"height\\\":420},\\\"dataSetId\\\":\\\"1522853857095376898\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"username\\\",\\\"text\\\":\\\"username\\\",\\\"value\\\":\\\"username\\\"},{\\\"label\\\":\\\"realname\\\",\\\"text\\\":\\\"realname\\\",\\\"value\\\":\\\"realname\\\"},{\\\"label\\\":\\\"sex\\\",\\\"text\\\":\\\"sex\\\",\\\"value\\\":\\\"sex\\\"},{\\\"label\\\":\\\"create_time\\\",\\\"text\\\":\\\"create_time\\\",\\\"value\\\":\\\"create_time\\\"}],\\\"dataSetType\\\":\\\"sql\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"showBackground\\\":true,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"rgba(180,180,180,0.2)\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"表单日期范围查询\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', NULL, '2022-05-17 17:33:28', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1526496110948999169', NULL, '1522835471967772673', NULL, 'JBar', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"username\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"sex\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[{\\\"defaultVal\\\":\\\"2011-01-01\\\",\\\"label\\\":\\\"createTime_begin\\\",\\\"text\\\":\\\"createTime_begin\\\",\\\"value\\\":\\\"createTime_begin\\\"},{\\\"defaultVal\\\":\\\"2022-12-31\\\",\\\"label\\\":\\\"createTime_end\\\",\\\"text\\\":\\\"createTime_end\\\",\\\"value\\\":\\\"createTime_end\\\"}],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"示例_日期范围查询\\\",\\\"query\\\":[{\\\"field\\\":\\\"createTime\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataSetApi\\\":\\\"select * from sys_user where create_time >= \\'${createTime_begin}\\' and create_time <=\\'${createTime_end}\\'\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"height\\\":420},\\\"dataSetId\\\":\\\"1522853857095376898\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"username\\\",\\\"text\\\":\\\"username\\\",\\\"value\\\":\\\"username\\\"},{\\\"label\\\":\\\"realname\\\",\\\"text\\\":\\\"realname\\\",\\\"value\\\":\\\"realname\\\"},{\\\"label\\\":\\\"sex\\\",\\\"text\\\":\\\"sex\\\",\\\"value\\\":\\\"sex\\\"},{\\\"label\\\":\\\"create_time\\\",\\\"text\\\":\\\"create_time\\\",\\\"value\\\":\\\"create_time\\\"}],\\\"dataSetType\\\":\\\"sql\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F0EDED\\\"},\\\"show\\\":true,\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#7ED321\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#417505\\\"},\\\"show\\\":false},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"showBackground\\\":true,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"rgba(180,180,180,0.2)\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"单个组件日期范围查询\\\"}}}', NULL, '2022-05-17 17:33:28', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1526496111003525121', NULL, '1522835471967772673', NULL, 'JForm', '{\\\"size\\\":{\\\"height\\\":120},\\\"w\\\":24,\\\"dataType\\\":2,\\\"h\\\":12,\\\"linkageConfig\\\":[{\\\"linkageId\\\":\\\"918fc3ea-c88a-4c42-892b-d2a14967258e\\\",\\\"linkage\\\":[{\\\"source\\\":\\\"createTime_begin\\\",\\\"target\\\":\\\"createTime_begin\\\"},{\\\"source\\\":\\\"createTime_end\\\",\\\"target\\\":\\\"createTime_end\\\"}]}],\\\"timeOut\\\":-1,\\\"option\\\":{\\\"fields\\\":[{\\\"fieldName\\\":\\\"createTime\\\",\\\"dictCode\\\":\\\"\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"defaultValue\\\":\\\"\\\",\\\"searchMode\\\":\\\"range\\\",\\\"action\\\":\\\"\\\",\\\"id\\\":\\\"rowdffe5384-d885-4ae7-9eab-81b8ee76265c\\\",\\\"izSearch\\\":\\\"1\\\",\\\"widgetType\\\":\\\"date\\\"}]}}', NULL, '2022-05-17 17:33:28', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761823821938690', NULL, '1524641995740446722', NULL, 'JBar', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"tian\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"visit\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[{\\\"defaultVal\\\":\\\"\\\",\\\"label\\\":\\\"创建时间\\\",\\\"text\\\":\\\"创建时间\\\",\\\"value\\\":\\\"create_time\\\"}],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"首页_近一周访问量\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"select count(*) as visit        \\\\t   ,count(distinct(ip)) as ip        \\\\t   ,DATE_FORMAT(create_time, \\'%Y-%m-%d\\') as tian        \\\\t   ,DATE_FORMAT(create_time, \\'%m-%d\\') as type        \\\\t   from sys_log          where log_type = 1 and create_time <= sysdate() and create_time >= (select date_sub(curdate(),interval 7 day))         group by tian,type         order by tian desc\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":813,\\\"height\\\":419},\\\"dataSetId\\\":\\\"1522503560003067906\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"visit\\\",\\\"text\\\":\\\"visit\\\",\\\"value\\\":\\\"visit\\\"},{\\\"label\\\":\\\"ip\\\",\\\"text\\\":\\\"ip\\\",\\\"value\\\":\\\"ip\\\"},{\\\"label\\\":\\\"tian\\\",\\\"text\\\":\\\"tian\\\",\\\"value\\\":\\\"tian\\\"},{\\\"label\\\":\\\"type\\\",\\\"text\\\":\\\"type\\\",\\\"value\\\":\\\"type\\\"}],\\\"dataSetType\\\":\\\"sql\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"showBackground\\\":true,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"rgba(180, 180, 180, 0.2)\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"SQL数据集-柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761823821938691', NULL, '1524641995740446722', NULL, 'JPie', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"智慧社区_时间分部\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"6:00-9:00\\\\\\\",    \\\\\\\"value\\\\\\\": 800  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"10:00-12:00\\\\\\\",    \\\\\\\"value\\\\\\\": 300  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"13:00-15:00\\\\\\\",    \\\\\\\"value\\\\\\\": 500  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"16:00-20:00\\\\\\\",    \\\\\\\"value\\\\\\\": 800  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"21:00-24:00\\\\\\\",    \\\\\\\"value\\\\\\\": 600  }]\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"height\\\":420},\\\"dataSetId\\\":\\\"1522187101267832833\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"json\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"innerRadius\\\":50,\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"JSON数据集-饼图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761823821938692', NULL, '1524641995740446722', NULL, 'JStackBar', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"type\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"出资\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/chuzi\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":813,\\\"height\\\":419},\\\"dataSetId\\\":\\\"1522098873378549762\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"},{\\\"label\\\":\\\"type\\\",\\\"text\\\":\\\"type\\\",\\\"value\\\":\\\"type\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"API数据集-堆叠柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761823821938693', NULL, '1524641995740446722', NULL, 'JDynamicBar', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":131,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":141,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":31.5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":53,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":41.9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":61,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":17,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":19,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":113,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"}]\\\",\\\"size\\\":{\\\"height\\\":420},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"xAxis\\\":{\\\"type\\\":\\\"value\\\"},\\\"grid\\\":{\\\"bottom\\\":115},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"text\\\":\\\"静态数据集-动态柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761823821938694', NULL, '1524641995740446722', NULL, 'JLine', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"钻取api\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/drilling/deptuser\\\",\\\"drillData\\\":[{\\\"source\\\":\\\"name\\\",\\\"target\\\":\\\"name\\\"}],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\",\\\\\\\"value\\\\\\\":1000},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":7350},{\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\",\\\\\\\"value\\\\\\\":5800},{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":6000},{\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\",\\\\\\\"value\\\\\\\":3000}]\\\",\\\"size\\\":{\\\"width\\\":813,\\\"height\\\":397},\\\"dataSetId\\\":\\\"1519274169102020610\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"text\\\":\\\"钻取-折线图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761823889047554', NULL, '1524641995740446722', NULL, 'JRadar', '{\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":75,\\\\\\\"name\\\\\\\":\\\\\\\"得分\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"NBA\\\\\\\",\\\\\\\"max\\\\\\\":100},{\\\\\\\"value\\\\\\\":65,\\\\\\\"name\\\\\\\":\\\\\\\"篮板\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"NBA\\\\\\\",\\\\\\\"max\\\\\\\":100},{\\\\\\\"value\\\\\\\":55,\\\\\\\"name\\\\\\\":\\\\\\\"防守\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"NBA\\\\\\\",\\\\\\\"max\\\\\\\":100},{\\\\\\\"value\\\\\\\":74,\\\\\\\"name\\\\\\\":\\\\\\\"失误\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"NBA\\\\\\\",\\\\\\\"max\\\\\\\":100},{\\\\\\\"value\\\\\\\":38,\\\\\\\"name\\\\\\\":\\\\\\\"盖帽\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"NBA\\\\\\\",\\\\\\\"max\\\\\\\":100},{\\\\\\\"value\\\\\\\":88,\\\\\\\"name\\\\\\\":\\\\\\\"三分\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"NBA\\\\\\\",\\\\\\\"max\\\\\\\":100}]\\\",\\\"size\\\":{\\\"width\\\":813,\\\"height\\\":397},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/radar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"radar\\\":[{\\\"indicator\\\":[]}],\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"data\\\":[]},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"radar\\\"}],\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础雷达图\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761823889047555', NULL, '1524641995740446722', NULL, 'JRing', '{\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":813,\\\"height\\\":386},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础环形图\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761823889047556', NULL, '1524641995740446722', NULL, 'JArea', '{\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":605,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":813,\\\"height\\\":386},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"xAxis\\\":{\\\"data\\\":[],\\\"boundaryGap\\\":false},\\\"grid\\\":{\\\"bottom\\\":115},\\\"series\\\":[{\\\"areaStyle\\\":{},\\\"data\\\":[],\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础面积图\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761823889047557', NULL, '1524641995740446722', NULL, 'JProgress', '{\\\"chartData\\\":[{\\\"name\\\":\\\"内存使用率\\\",\\\"value\\\":50}],\\\"size\\\":{\\\"width\\\":813,\\\"height\\\":353},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":19,\\\"color\\\":\\\"#151B87\\\",\\\"itemStyle\\\":{\\\"normal\\\":{\\\"barBorderRadius\\\":10}},\\\"zlevel\\\":1,\\\"label\\\":{\\\"formatter\\\":\\\"{c}{a}\\\",\\\"offset\\\":[0,-40],\\\"color\\\":\\\"black\\\",\\\"show\\\":true,\\\"fontSize\\\":24,\\\"position\\\":\\\"right\\\"}},{\\\"barWidth\\\":19,\\\"color\\\":\\\"#eeeeee\\\",\\\"barGap\\\":\\\"-100%\\\",\\\"itemStyle\\\":{\\\"normal\\\":{\\\"barBorderRadius\\\":10}},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础进度图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761823889047558', NULL, '1524641995740446722', NULL, 'JFunnel', '{\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":335,\\\\\\\"name\\\\\\\":\\\\\\\"直接访问\\\\\\\"},{\\\\\\\"value\\\\\\\":310,\\\\\\\"name\\\\\\\":\\\\\\\"邮件营销\\\\\\\"},{\\\\\\\"value\\\\\\\":234,\\\\\\\"name\\\\\\\":\\\\\\\"联盟广告\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":813,\\\"height\\\":353},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/funnel\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"legend\\\":{\\\"orient\\\":\\\"horizontal\\\"},\\\"series\\\":[{\\\"left\\\":\\\"10%\\\",\\\"gap\\\":2,\\\"name\\\":\\\"Funnel\\\",\\\"width\\\":\\\"80%\\\",\\\"emphasis\\\":{\\\"label\\\":{\\\"fontSize\\\":20}},\\\"itemStyle\\\":{\\\"borderColor\\\":\\\"#fff\\\",\\\"borderWidth\\\":1},\\\"sort\\\":\\\"descending\\\",\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"inside\\\"},\\\"labelLine\\\":{\\\"lineStyle\\\":{\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"length\\\":10},\\\"type\\\":\\\"funnel\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a} <br/>{b} : {c}%\\\",\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础漏斗图\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761823951962113', NULL, '1524641995740446722', NULL, 'JPictorialBar', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"驯鹿\\\\\\\",\\\\\\\"value\\\\\\\":123,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M-22.788,24.521c2.08-0.986,3.611-3.905,4.984-5.892 c-2.686,2.782-5.047,5.884-9.102,7.312c-0.992,0.005-0.25-2.016,0.34-2.362l1.852-0.41c0.564-0.218,0.785-0.842,0.902-1.347 c2.133-0.727,4.91-4.129,6.031-6.194c1.748-0.7,4.443-0.679,5.734-2.293c1.176-1.468,0.393-3.992,1.215-6.557 c0.24-0.754,0.574-1.581,1.008-2.293c-0.611,0.011-1.348-0.061-1.959-0.608c-1.391-1.245-0.785-2.086-1.297-3.313 c1.684,0.744,2.5,2.584,4.426,2.586C-8.46,3.012-8.255,2.901-8.04,2.824c6.031-1.952,15.182-0.165,19.498-3.937 c1.15-3.933-1.24-9.846-1.229-9.938c0.008-0.062-1.314-0.004-1.803-0.258c-1.119-0.771-6.531-3.75-0.17-3.33 c0.314-0.045,0.943,0.259,1.439,0.435c-0.289-1.694-0.92-0.144-3.311-1.946c0,0-1.1-0.855-1.764-1.98 c-0.836-1.09-2.01-2.825-2.992-4.031c-1.523-2.476,1.367,0.709,1.816,1.108c1.768,1.704,1.844,3.281,3.232,3.983 c0.195,0.203,1.453,0.164,0.926-0.468c-0.525-0.632-1.367-1.278-1.775-2.341c-0.293-0.703-1.311-2.326-1.566-2.711 c-0.256-0.384-0.959-1.718-1.67-2.351c-1.047-1.187-0.268-0.902,0.521-0.07c0.789,0.834,1.537,1.821,1.672,2.023 c0.135,0.203,1.584,2.521,1.725,2.387c0.102-0.259-0.035-0.428-0.158-0.852c-0.125-0.423-0.912-2.032-0.961-2.083 c-0.357-0.852-0.566-1.908-0.598-3.333c0.4-2.375,0.648-2.486,0.549-0.705c0.014,1.143,0.031,2.215,0.602,3.247 c0.807,1.496,1.764,4.064,1.836,4.474c0.561,3.176,2.904,1.749,2.281-0.126c-0.068-0.446-0.109-2.014-0.287-2.862 c-0.18-0.849-0.219-1.688-0.113-3.056c0.066-1.389,0.232-2.055,0.277-2.299c0.285-1.023,0.4-1.088,0.408,0.135 c-0.059,0.399-0.131,1.687-0.125,2.655c0.064,0.642-0.043,1.768,0.172,2.486c0.654,1.928-0.027,3.496,1,3.514 c1.805-0.424,2.428-1.218,2.428-2.346c-0.086-0.704-0.121-0.843-0.031-1.193c0.221-0.568,0.359-0.67,0.312-0.076 c-0.055,0.287,0.031,0.533,0.082,0.794c0.264,1.197,0.912,0.114,1.283-0.782c0.15-0.238,0.539-2.154,0.545-2.522 c-0.023-0.617,0.285-0.645,0.309,0.01c0.064,0.422-0.248,2.646-0.205,2.334c-0.338,1.24-1.105,3.402-3.379,4.712 c-0.389,0.12-1.186,1.286-3.328,2.178c0,0,1.729,0.321,3.156,0.246c1.102-0.19,3.707-0.027,4.654,0.269 c1.752,0.494,1.531-0.053,4.084,0.164c2.26-0.4,2.154,2.391-1.496,3.68c-2.549,1.405-3.107,1.475-2.293,2.984 c3.484,7.906,2.865,13.183,2.193,16.466c2.41,0.271,5.732-0.62,7.301,0.725c0.506,0.333,0.648,1.866-0.457,2.86 c-4.105,2.745-9.283,7.022-13.904,7.662c-0.977-0.194,0.156-2.025,0.803-2.247l1.898-0.03c0.596-0.101,0.936-0.669,1.152-1.139 c3.16-0.404,5.045-3.775,8.246-4.818c-4.035-0.718-9.588,3.981-12.162,1.051c-5.043,1.423-11.449,1.84-15.895,1.111 c-3.105,2.687-7.934,4.021-12.115,5.866c-3.271,3.511-5.188,8.086-9.967,10.414c-0.986,0.119-0.48-1.974,0.066-2.385l1.795-0.618 C-22.995,25.682-22.849,25.035-22.788,24.521z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[60,60]},{\\\\\\\"name\\\\\\\":\\\\\\\"飞机\\\\\\\",\\\\\\\"value\\\\\\\":60,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M1.112,32.559l2.998,1.205l-2.882,2.268l-2.215-0.012L1.112,32.559z M37.803,23.96 c0.158-0.838,0.5-1.509,0.961-1.904c-0.096-0.037-0.205-0.071-0.344-0.071c-0.777-0.005-2.068-0.009-3.047-0.009 c-0.633,0-1.217,0.066-1.754,0.18l2.199,1.804H37.803z M39.738,23.036c-0.111,0-0.377,0.325-0.537,0.924h1.076 C40.115,23.361,39.854,23.036,39.738,23.036z M39.934,39.867c-0.166,0-0.674,0.705-0.674,1.986s0.506,1.986,0.674,1.986 s0.672-0.705,0.672-1.986S40.102,39.867,39.934,39.867z M38.963,38.889c-0.098-0.038-0.209-0.07-0.348-0.073 c-0.082,0-0.174,0-0.268-0.001l-7.127,4.671c0.879,0.821,2.42,1.417,4.348,1.417c0.979,0,2.27-0.006,3.047-0.01 c0.139,0,0.25-0.034,0.348-0.072c-0.646-0.555-1.07-1.643-1.07-2.967C37.891,40.529,38.316,39.441,38.963,38.889z M32.713,23.96 l-12.37-10.116l-4.693-0.004c0,0,4,8.222,4.827,10.121H32.713z M59.311,32.374c-0.248,2.104-5.305,3.172-8.018,3.172H39.629 l-25.325,16.61L9.607,52.16c0,0,6.687-8.479,7.95-10.207c1.17-1.6,3.019-3.699,3.027-6.407h-2.138 c-5.839,0-13.816-3.789-18.472-5.583c-2.818-1.085-2.396-4.04-0.031-4.04h0.039l-3.299-11.371h3.617c0,0,4.352,5.696,5.846,7.5 c2,2.416,4.503,3.678,8.228,3.87h30.727c2.17,0,4.311,0.417,6.252,1.046c3.49,1.175,5.863,2.7,7.199,4.027 C59.145,31.584,59.352,32.025,59.311,32.374z M22.069,30.408c0-0.815-0.661-1.475-1.469-1.475c-0.812,0-1.471,0.66-1.471,1.475 s0.658,1.475,1.471,1.475C21.408,31.883,22.069,31.224,22.069,30.408z M27.06,30.408c0-0.815-0.656-1.478-1.466-1.478 c-0.812,0-1.471,0.662-1.471,1.478s0.658,1.477,1.471,1.477C26.404,31.885,27.06,31.224,27.06,30.408z M32.055,30.408 c0-0.815-0.66-1.475-1.469-1.475c-0.808,0-1.466,0.66-1.466,1.475s0.658,1.475,1.466,1.475 C31.398,31.883,32.055,31.224,32.055,30.408z M37.049,30.408c0-0.815-0.658-1.478-1.467-1.478c-0.812,0-1.469,0.662-1.469,1.478 s0.656,1.477,1.469,1.477C36.389,31.885,37.049,31.224,37.049,30.408z M42.039,30.408c0-0.815-0.656-1.478-1.465-1.478 c-0.811,0-1.469,0.662-1.469,1.478s0.658,1.477,1.469,1.477C41.383,31.885,42.039,31.224,42.039,30.408z M55.479,30.565 c-0.701-0.436-1.568-0.896-2.627-1.347c-0.613,0.289-1.551,0.476-2.73,0.476c-1.527,0-1.639,2.263,0.164,2.316 C52.389,32.074,54.627,31.373,55.479,30.565z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[65,35]},{\\\\\\\"name\\\\\\\":\\\\\\\"火箭\\\\\\\",\\\\\\\"value\\\\\\\":25,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M-244.396,44.399c0,0,0.47-2.931-2.427-6.512c2.819-8.221,3.21-15.709,3.21-15.709s5.795,1.383,5.795,7.325C-237.818,39.679-244.396,44.399-244.396,44.399z M-260.371,40.827c0,0-3.881-12.946-3.881-18.319c0-2.416,0.262-4.566,0.669-6.517h17.684c0.411,1.952,0.675,4.104,0.675,6.519c0,5.291-3.87,18.317-3.87,18.317H-260.371z M-254.745,18.951c-1.99,0-3.603,1.676-3.603,3.744c0,2.068,1.612,3.744,3.603,3.744c1.988,0,3.602-1.676,3.602-3.744S-252.757,18.951-254.745,18.951z M-255.521,2.228v-5.098h1.402v4.969c1.603,1.213,5.941,5.069,7.901,12.5h-17.05C-261.373,7.373-257.245,3.558-255.521,2.228zM-265.07,44.399c0,0-6.577-4.721-6.577-14.896c0-5.942,5.794-7.325,5.794-7.325s0.393,7.488,3.211,15.708C-265.539,41.469-265.07,44.399-265.07,44.399z M-252.36,45.15l-1.176-1.22L-254.789,48l-1.487-4.069l-1.019,2.116l-1.488-3.826h8.067L-252.36,45.15z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[50,60]},{\\\\\\\"name\\\\\\\":\\\\\\\"高铁\\\\\\\",\\\\\\\"value\\\\\\\":18,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M67.335,33.596L67.335,33.596c-0.002-1.39-1.153-3.183-3.328-4.218h-9.096v-2.07h5.371 c-4.939-2.07-11.199-4.141-14.89-4.141H19.72v12.421v5.176h38.373c4.033,0,8.457-1.035,9.142-5.176h-0.027 c0.076-0.367,0.129-0.751,0.129-1.165L67.335,33.596L67.335,33.596z M27.999,30.413h-3.105v-4.141h3.105V30.413z M35.245,30.413 h-3.104v-4.141h3.104V30.413z M42.491,30.413h-3.104v-4.141h3.104V30.413z M49.736,30.413h-3.104v-4.141h3.104V30.413z  M14.544,40.764c1.143,0,2.07-0.927,2.07-2.07V35.59V25.237c0-1.145-0.928-2.07-2.07-2.07H-9.265c-1.143,0-2.068,0.926-2.068,2.07 v10.351v3.105c0,1.144,0.926,2.07,2.068,2.07H14.544L14.544,40.764z M8.333,26.272h3.105v4.141H8.333V26.272z M1.087,26.272h3.105 v4.141H1.087V26.272z M-6.159,26.272h3.105v4.141h-3.105V26.272z M-9.265,41.798h69.352v1.035H-9.265V41.798z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[50,30]},{\\\\\\\"name\\\\\\\":\\\\\\\"轮船\\\\\\\",\\\\\\\"value\\\\\\\":12,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M16.678,17.086h9.854l-2.703,5.912c5.596,2.428,11.155,5.575,16.711,8.607c3.387,1.847,6.967,3.75,10.541,5.375 v-6.16l-4.197-2.763v-5.318L33.064,12.197h-11.48L20.43,15.24h-4.533l-1.266,3.286l0.781,0.345L16.678,17.086z M49.6,31.84 l0.047,1.273L27.438,20.998l0.799-1.734L49.6,31.84z M33.031,15.1l12.889,8.82l0.027,0.769L32.551,16.1L33.031,15.1z M22.377,14.045 h9.846l-1.539,3.365l-2.287-1.498h1.371l0.721-1.352h-2.023l-0.553,1.037l-0.541-0.357h-0.34l0.359-0.684h-2.025l-0.361,0.684 h-3.473L22.377,14.045z M23.695,20.678l-0.004,0.004h0.004V20.678z M24.828,18.199h-2.031l-0.719,1.358h2.029L24.828,18.199z  M40.385,34.227c-12.85-7.009-25.729-14.667-38.971-12.527c1.26,8.809,9.08,16.201,8.213,24.328 c-0.553,4.062-3.111,0.828-3.303,7.137c15.799,0,32.379,0,48.166,0l0.066-4.195l1.477-7.23 C50.842,39.812,45.393,36.961,40.385,34.227z M13.99,35.954c-1.213,0-2.195-1.353-2.195-3.035c0-1.665,0.98-3.017,2.195-3.017 c1.219,0,2.195,1.352,2.195,3.017C16.186,34.604,15.213,35.954,13.99,35.954z M23.691,20.682h-2.02l-0.588,1.351h2.023 L23.691,20.682z M19.697,18.199l-0.721,1.358h2.025l0.727-1.358H19.697z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[50,35]},{\\\\\\\"name\\\\\\\":\\\\\\\"汽车\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M49.592,40.883c-0.053,0.354-0.139,0.697-0.268,0.963c-0.232,0.475-0.455,0.519-1.334,0.475 c-1.135-0.053-2.764,0-4.484,0.068c0,0.476,0.018,0.697,0.018,0.697c0.111,1.299,0.697,1.342,0.931,1.342h3.7 c0.326,0,0.628,0,0.861-0.154c0.301-0.196,0.43-0.772,0.543-1.78c0.017-0.146,0.025-0.336,0.033-0.56v-0.01 c0-0.068,0.008-0.154,0.008-0.25V41.58l0,0C49.6,41.348,49.6,41.09,49.592,40.883L49.592,40.883z M6.057,40.883 c0.053,0.354,0.137,0.697,0.268,0.963c0.23,0.475,0.455,0.519,1.334,0.475c1.137-0.053,2.762,0,4.484,0.068 c0,0.476-0.018,0.697-0.018,0.697c-0.111,1.299-0.697,1.342-0.93,1.342h-3.7c-0.328,0-0.602,0-0.861-0.154 c-0.309-0.18-0.43-0.772-0.541-1.78c-0.018-0.146-0.027-0.336-0.035-0.56v-0.01c0-0.068-0.008-0.154-0.008-0.25V41.58l0,0 C6.057,41.348,6.057,41.09,6.057,40.883L6.057,40.883z M49.867,32.766c0-2.642-0.344-5.224-0.482-5.507 c-0.104-0.207-0.766-0.749-2.271-1.773c-1.522-1.042-1.487-0.887-1.766-1.566c0.25-0.078,0.492-0.224,0.639-0.241 c0.326-0.034,0.345,0.274,1.023,0.274c0.68,0,2.152-0.18,2.453-0.48c0.301-0.303,0.396-0.405,0.396-0.672 c0-0.268-0.156-0.818-0.447-1.146c-0.293-0.327-1.541-0.49-2.273-0.585c-0.729-0.095-0.834,0-1.022,0.121 c-0.304,0.189-0.32,1.919-0.32,1.919l-0.713,0.018c-0.465-1.146-1.11-3.452-2.117-5.269c-1.103-1.979-2.256-2.599-2.737-2.754 c-0.474-0.146-0.904-0.249-4.131-0.576c-3.298-0.344-5.922-0.388-8.262-0.388c-2.342,0-4.967,0.052-8.264,0.388 c-3.229,0.336-3.66,0.43-4.133,0.576s-1.633,0.775-2.736,2.754c-1.006,1.816-1.652,4.123-2.117,5.269L9.87,23.109 c0,0-0.008-1.729-0.318-1.919c-0.189-0.121-0.293-0.225-1.023-0.121c-0.732,0.104-1.98,0.258-2.273,0.585 c-0.293,0.327-0.447,0.878-0.447,1.146c0,0.267,0.094,0.379,0.396,0.672c0.301,0.301,1.773,0.48,2.453,0.48 c0.68,0,0.697-0.309,1.023-0.274c0.146,0.018,0.396,0.163,0.637,0.241c-0.283,0.68-0.24,0.524-1.764,1.566 c-1.506,1.033-2.178,1.566-2.271,1.773c-0.139,0.283-0.482,2.865-0.482,5.508s0.189,5.02,0.189,5.86c0,0.354,0,0.976,0.076,1.565 c0.053,0.354,0.129,0.697,0.268,0.966c0.232,0.473,0.447,0.516,1.334,0.473c1.137-0.051,2.779,0,4.477,0.07 c1.135,0.043,2.297,0.086,3.33,0.11c2.582,0.051,1.826-0.379,2.928-0.36c1.102,0.016,5.447,0.196,9.424,0.196 c3.976,0,8.332-0.182,9.423-0.196c1.102-0.019,0.346,0.411,2.926,0.36c1.033-0.018,2.195-0.067,3.332-0.11 c1.695-0.062,3.348-0.121,4.477-0.07c0.886,0.043,1.103,0,1.332-0.473c0.132-0.269,0.218-0.611,0.269-0.966 c0.086-0.592,0.078-1.213,0.078-1.565C49.678,37.793,49.867,35.408,49.867,32.766L49.867,32.766z M13.219,19.735 c0.412-0.964,1.652-2.9,2.256-3.244c0.145-0.087,1.426-0.491,4.637-0.706c2.953-0.198,6.217-0.276,7.73-0.276 c1.513,0,4.777,0.078,7.729,0.276c3.201,0.215,4.502,0.611,4.639,0.706c0.775,0.533,1.842,2.28,2.256,3.244 c0.412,0.965,0.965,2.858,0.861,3.116c-0.104,0.258,0.104,0.388-1.291,0.275c-1.387-0.103-10.088-0.216-14.185-0.216 c-4.088,0-12.789,0.113-14.184,0.216c-1.395,0.104-1.188-0.018-1.291-0.275C12.254,22.593,12.805,20.708,13.219,19.735 L13.219,19.735z M16.385,30.511c-0.619,0.155-0.988,0.491-1.764,0.482c-0.775,0-2.867-0.353-3.314-0.371 c-0.447-0.017-0.842,0.302-1.076,0.362c-0.23,0.06-0.688-0.104-1.377-0.318c-0.688-0.216-1.092-0.155-1.316-1.094 c-0.232-0.93,0-2.264,0-2.264c1.488-0.068,2.928,0.069,5.621,0.826c2.693,0.758,4.191,2.213,4.191,2.213 S17.004,30.357,16.385,30.511L16.385,30.511z M36.629,37.293c-1.23,0.164-6.386,0.207-8.794,0.207c-2.412,0-7.566-0.051-8.799-0.207 c-1.256-0.164-2.891-1.67-1.764-2.865c1.523-1.627,1.24-1.576,4.701-2.023C24.967,32.018,27.239,32,27.834,32 c0.584,0,2.865,0.025,5.859,0.404c3.461,0.447,3.178,0.396,4.699,2.022C39.521,35.623,37.887,37.129,36.629,37.293L36.629,37.293z  M48.129,29.582c-0.232,0.93-0.629,0.878-1.318,1.093c-0.688,0.216-1.145,0.371-1.377,0.319c-0.231-0.053-0.627-0.371-1.074-0.361 c-0.448,0.018-2.539,0.37-3.313,0.37c-0.772,0-1.146-0.328-1.764-0.481c-0.621-0.154-0.966-0.154-0.966-0.154 s1.49-1.464,4.191-2.213c2.693-0.758,4.131-0.895,5.621-0.826C48.129,27.309,48.361,28.643,48.129,29.582L48.129,29.582z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[40,30]},{\\\\\\\"name\\\\\\\":\\\\\\\"跑步\\\\\\\",\\\\\\\"value\\\\\\\":2,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M13.676,32.955c0.919-0.031,1.843-0.008,2.767-0.008v0.007c0.827,0,1.659,0.041,2.486-0.019 c0.417-0.028,1.118,0.325,1.14-0.545c0.014-0.637-0.156-1.279-0.873-1.367c-1.919-0.241-3.858-0.233-5.774,0.019 c-0.465,0.062-0.998,0.442-0.832,1.069C12.715,32.602,13.045,32.977,13.676,32.955z M14.108,29.013 c1.47-0.007,2.96-0.122,4.414,0.035c1.792,0.192,3.1-0.412,4.273-2.105c-3.044,0-5.882,0.014-8.719-0.01 c-0.768-0.005-1.495,0.118-1.461,1C12.642,28.731,13.329,29.014,14.108,29.013z M23.678,36.593c-0.666-0.69-1.258-1.497-2.483-1.448 c-2.341,0.095-4.689,0.051-7.035,0.012c-0.834-0.014-1.599,0.177-1.569,1.066c0.031,0.854,0.812,1.062,1.636,1.043 c1.425-0.033,2.852-0.01,4.278-0.01v-0.01c1.562,0,3.126,0.008,4.691-0.005C23.614,37.239,24.233,37.174,23.678,36.593z  M32.234,42.292h-0.002c-1.075,0.793-2.589,0.345-3.821,1.048c-0.359,0.193-0.663,0.465-0.899,0.799 c-1.068,1.623-2.052,3.301-3.117,4.928c-0.625,0.961-0.386,1.805,0.409,2.395c0.844,0.628,1.874,0.617,2.548-0.299 c1.912-2.573,3.761-5.197,5.621-7.814C33.484,42.619,33.032,42.387,32.234,42.292z M43.527,28.401 c-0.688-1.575-2.012-0.831-3.121-0.895c-1.047-0.058-2.119,1.128-3.002,0.345c-0.768-0.677-1.213-1.804-1.562-2.813 c-0.45-1.305-1.495-2.225-2.329-3.583c2.953,1.139,4.729,0.077,5.592-1.322c0.99-1.61,0.718-3.725-0.627-4.967 c-1.362-1.255-3.414-1.445-4.927-0.452c-1.933,1.268-2.206,2.893-0.899,6.11c-2.098-0.659-3.835-1.654-5.682-2.383 c-0.735-0.291-1.437-1.017-2.293-0.666c-2.263,0.927-4.522,1.885-6.723,2.95c-1.357,0.658-1.649,1.593-1.076,2.638 c0.462,0.851,1.643,1.126,2.806,0.617c0.993-0.433,1.994-0.857,2.951-1.374c1.599-0.86,3.044-0.873,4.604,0.214 c1.017,0.707,0.873,1.137,0.123,1.849c-1.701,1.615-3.516,3.12-4.933,5.006c-1.042,1.388-0.993,2.817,0.255,4.011 c1.538,1.471,3.148,2.869,4.708,4.315c0.485,0.444,0.907,0.896-0.227,1.104c-1.523,0.285-3.021,0.694-4.538,1.006 c-1.109,0.225-2.02,1.259-1.83,2.16c0.223,1.07,1.548,1.756,2.687,1.487c3.003-0.712,6.008-1.413,9.032-2.044 c1.549-0.324,2.273-1.869,1.344-3.115c-0.868-1.156-1.801-2.267-2.639-3.445c-1.964-2.762-1.95-2.771,0.528-5.189 c1.394-1.357,1.379-1.351,2.437,0.417c0.461,0.769,0.854,1.703,1.99,1.613c2.238-0.181,4.407-0.755,6.564-1.331 C43.557,30.447,43.88,29.206,43.527,28.401z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[50,50]},{\\\\\\\"name\\\\\\\":\\\\\\\"步行\\\\\\\",\\\\\\\"value\\\\\\\":1,\\\\\\\"symbol\\\\\\\":\\\\\\\"path://M29.902,23.275c1.86,0,3.368-1.506,3.368-3.365c0-1.859-1.508-3.365-3.368-3.365 c-1.857,0-3.365,1.506-3.365,3.365C26.537,21.769,28.045,23.275,29.902,23.275z M36.867,30.74c-1.666-0.467-3.799-1.6-4.732-4.199 c-0.932-2.6-3.131-2.998-4.797-2.998s-7.098,3.894-7.098,3.894c-1.133,1.001-2.1,6.502-0.967,6.769 c1.133,0.269,1.266-1.533,1.934-3.599c0.666-2.065,3.797-3.466,3.797-3.466s0.201,2.467-0.398,3.866 c-0.599,1.399-1.133,2.866-1.467,6.198s-1.6,3.665-3.799,6.266c-2.199,2.598-0.6,3.797,0.398,3.664 c1.002-0.133,5.865-5.598,6.398-6.998c0.533-1.397,0.668-3.732,0.668-3.732s0,0,2.199,1.867c2.199,1.865,2.332,4.6,2.998,7.73 s2.332,0.934,2.332-0.467c0-1.401,0.269-5.465-1-7.064c-1.265-1.6-3.73-3.465-3.73-5.265s1.199-3.732,1.199-3.732 c0.332,1.667,3.335,3.065,5.599,3.399C38.668,33.206,38.533,31.207,36.867,30.74z\\\\\\\",\\\\\\\"symbolSize\\\\\\\":[40,50]}]\\\",\\\"size\\\":{\\\"width\\\":813,\\\"height\\\":408},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/pictogram\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"象形柱图\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761823951962114', NULL, '1524641995740446722', NULL, 'JGauge', '{\\\"chartData\\\":\\\"[{\\\\\\\"min\\\\\\\":1,\\\\\\\"max\\\\\\\":10,\\\\\\\"label\\\\\\\":\\\\\\\"名称\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"unit\\\\\\\":\\\\\\\"%\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":813,\\\"height\\\":408},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"名称\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/gauge\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"series\\\":[{\\\"axisLabel\\\":{\\\"show\\\":true,\\\"fontSize\\\":12},\\\"data\\\":[],\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#eee\\\",\\\"width\\\":4},\\\"length\\\":12},\\\"axisTick\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#eee\\\"},\\\"show\\\":true},\\\"progress\\\":{\\\"show\\\":true},\\\"detail\\\":{\\\"formatter\\\":\\\"{value}\\\",\\\"fontSize\\\":25},\\\"type\\\":\\\"gauge\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a} <br/>{b} : {c}%\\\"},\\\"title\\\":{\\\"text\\\":\\\"标准仪表盘\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761823951962115', NULL, '1524641995740446722', NULL, 'JColorGauge', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"使用率\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"unit\\\\\\\":\\\\\\\"%\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":813,\\\"height\\\":518},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"名称\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/gauge\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"series\\\":[{\\\"axisLabel\\\":{\\\"show\\\":true,\\\"fontSize\\\":12},\\\"pointer\\\":{\\\"width\\\":8},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.25,\\\"#FF6E76\\\"],[0.5,\\\"#FDDD60\\\"],[1,\\\"#58D9F9\\\"]],\\\"width\\\":10}},\\\"anchor\\\":{\\\"itemStyle\\\":{\\\"color\\\":\\\"#FAC858\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#eee\\\",\\\"width\\\":4},\\\"length\\\":12},\\\"axisTick\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#eee\\\"},\\\"show\\\":true},\\\"title\\\":{\\\"fontSize\\\":14}}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a} <br/>{b} : {c}%\\\"},\\\"title\\\":{\\\"text\\\":\\\"多色仪表盘\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761823951962116', NULL, '1524641995740446722', NULL, 'JTabs', '{\\\"size\\\":{\\\"width\\\":813,\\\"height\\\":518},\\\"w\\\":12,\\\"h\\\":40,\\\"option\\\":{\\\"title\\\":\\\"选项卡\\\"},\\\"child\\\":[{\\\"component\\\":\\\"JBar\\\",\\\"w\\\":12,\\\"x\\\":0,\\\"h\\\":42,\\\"i\\\":\\\"53be7509-a4fe-417c-b1c4-d699e6c901e4\\\",\\\"title\\\":\\\"柱形图\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"paddingBottom\\\":90,\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"showBackground\\\":true,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"rgba(180, 180, 180, 0.2)\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"h\\\":42,\\\"index\\\":0,\\\"i\\\":\\\"634b775d-46dc-4a0f-8fe6-29abcebc148e\\\",\\\"title\\\":\\\"雷达图\\\",\\\"horizontal\\\":false,\\\"component\\\":\\\"JRadar\\\",\\\"size\\\":10,\\\"w\\\":12,\\\"x\\\":0,\\\"text\\\":\\\"0.042\\\",\\\"id\\\":\\\"b5fb856d-72b1-4f9a-80d9-79907ecbbe4d\\\",\\\"config\\\":{\\\"chartData\\\":[{\\\"max\\\":100,\\\"name\\\":\\\"得分\\\",\\\"type\\\":\\\"NBA\\\",\\\"value\\\":75},{\\\"max\\\":100,\\\"name\\\":\\\"篮板\\\",\\\"type\\\":\\\"NBA\\\",\\\"value\\\":65},{\\\"max\\\":100,\\\"name\\\":\\\"防守\\\",\\\"type\\\":\\\"NBA\\\",\\\"value\\\":55},{\\\"max\\\":100,\\\"name\\\":\\\"失误\\\",\\\"type\\\":\\\"NBA\\\",\\\"value\\\":74},{\\\"max\\\":100,\\\"name\\\":\\\"盖帽\\\",\\\"type\\\":\\\"NBA\\\",\\\"value\\\":38},{\\\"max\\\":100,\\\"name\\\":\\\"三分\\\",\\\"type\\\":\\\"NBA\\\",\\\"value\\\":88}],\\\"paddingBottom\\\":90,\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/radar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"radar\\\":[{\\\"indicator\\\":[]}],\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"data\\\":[]},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"radar\\\"}],\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础雷达图\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}},\\\"child\\\":[]},{\\\"h\\\":42,\\\"index\\\":0,\\\"i\\\":\\\"33070b19-1b6f-47b3-8184-9ad437e52a3e\\\",\\\"title\\\":\\\"表格\\\",\\\"horizontal\\\":false,\\\"component\\\":\\\"JCommonTable\\\",\\\"size\\\":10,\\\"w\\\":12,\\\"x\\\":0,\\\"text\\\":\\\"0.042\\\",\\\"id\\\":\\\"03399fae-2199-42d4-8637-910aaa97c20f\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"paddingBottom\\\":90,\\\"w\\\":24,\\\"dataType\\\":1,\\\"h\\\":42,\\\"linkageConfig\\\":[],\\\"timeOut\\\":0,\\\"option\\\":{}},\\\"child\\\":[]}]}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761823951962117', NULL, '1524641995740446722', NULL, 'JGrid', '{\\\"size\\\":{\\\"width\\\":1632,\\\"height\\\":400},\\\"w\\\":12,\\\"h\\\":40,\\\"option\\\":{\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}},\\\"child\\\":[{\\\"h\\\":42,\\\"i\\\":\\\"039463e0-4ab8-4a7c-ab62-1cc66da41654\\\",\\\"title\\\":\\\"标题\\\",\\\"parentId\\\":\\\"ed8dfb23-63c9-4d3d-8bef-aad3a5de4cc4\\\",\\\"horizontal\\\":false,\\\"component\\\":\\\"JRing\\\",\\\"size\\\":10,\\\"w\\\":12,\\\"x\\\":0,\\\"text\\\":\\\"0.042\\\",\\\"id\\\":\\\"ca5d3493-7720-4ae8-827d-ae83d91d175a\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"智慧社区_年龄分部\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/age\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"paddingBottom\\\":90,\\\"dataSetId\\\":\\\"1522184215045615618\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"},{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础环形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}},\\\"span\\\":\\\"8\\\",\\\"child\\\":[]},{\\\"h\\\":42,\\\"i\\\":\\\"17a02601-f044-47e9-a2d1-da1a31551742\\\",\\\"title\\\":\\\"标题\\\",\\\"parentId\\\":\\\"ed8dfb23-63c9-4d3d-8bef-aad3a5de4cc4\\\",\\\"horizontal\\\":false,\\\"component\\\":\\\"JList\\\",\\\"size\\\":10,\\\"w\\\":12,\\\"x\\\":0,\\\"text\\\":\\\"0.042\\\",\\\"id\\\":\\\"404465d9-8b7d-483b-9bde-9b6492cb362f\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"remark\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"date\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"pic\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"数据列表\\\",\\\"query\\\":[],\\\"h\\\":24,\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/datalist/list\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"通知一\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-9 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知二\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-8 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知三\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-7 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知四\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-4 14:20:21\\\\\\\"}]\\\",\\\"paddingBottom\\\":90,\\\"dataSetId\\\":\\\"1519945036454813698\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"date\\\",\\\"text\\\":\\\"date\\\",\\\"value\\\":\\\"date\\\"},{\\\"label\\\":\\\"remark\\\",\\\"text\\\":\\\"remark\\\",\\\"value\\\":\\\"remark\\\"},{\\\"label\\\":\\\"pic\\\",\\\"text\\\":\\\"pic\\\",\\\"value\\\":\\\"pic\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"horizontal\\\",\\\"showTitlePrefix\\\":true,\\\"titleFontSize\\\":18,\\\"showTimePrefix\\\":true}},\\\"span\\\":\\\"8\\\",\\\"child\\\":[]},{\\\"h\\\":42,\\\"i\\\":\\\"7d484bd7-ca44-457c-a2c1-fdf6dff5f06e\\\",\\\"title\\\":\\\"标题\\\",\\\"parentId\\\":\\\"ed8dfb23-63c9-4d3d-8bef-aad3a5de4cc4\\\",\\\"horizontal\\\":false,\\\"component\\\":\\\"JImg\\\",\\\"size\\\":10,\\\"w\\\":12,\\\"x\\\":0,\\\"text\\\":\\\"0.042\\\",\\\"id\\\":\\\"d2480f4d-9424-4300-99ca-50a7000159f2\\\",\\\"config\\\":{\\\"paddingBottom\\\":90,\\\"w\\\":10,\\\"dataType\\\":1,\\\"h\\\":20,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"http://minio.jeecg.com/otatest/jeecg_1651199708342.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}},\\\"span\\\":\\\"8\\\",\\\"child\\\":[]}]}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761824014876674', NULL, '1524641995740446722', NULL, 'JCommonTable', '{\\\"paramOption\\\":[{\\\"defaultVal\\\":\\\"1\\\",\\\"label\\\":\\\"sex\\\",\\\"text\\\":\\\"sex\\\",\\\"value\\\":\\\"sex\\\"}],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"示例_数据表格\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"select * from demo where sex=\\'${sex}\\'\\\",\\\"drillData\\\":[],\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"width\\\":1636,\\\"height\\\":540},\\\"dataSetId\\\":\\\"1522824721899511810\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"姓名\\\",\\\"text\\\":\\\"姓名\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"打卡时间\\\",\\\"text\\\":\\\"打卡时间\\\",\\\"value\\\":\\\"punch_time\\\"},{\\\"label\\\":\\\"工资\\\",\\\"text\\\":\\\"工资\\\",\\\"value\\\":\\\"salary_money\\\"},{\\\"label\\\":\\\"奖金\\\",\\\"text\\\":\\\"奖金\\\",\\\"value\\\":\\\"bonus_money\\\"},{\\\"label\\\":\\\"性别\\\",\\\"text\\\":\\\"性别\\\",\\\"value\\\":\\\"sex\\\"},{\\\"label\\\":\\\"年龄\\\",\\\"text\\\":\\\"年龄\\\",\\\"value\\\":\\\"age\\\"},{\\\"label\\\":\\\"生日\\\",\\\"text\\\":\\\"生日\\\",\\\"value\\\":\\\"birthday\\\"},{\\\"label\\\":\\\"邮箱\\\",\\\"text\\\":\\\"邮箱\\\",\\\"value\\\":\\\"email\\\"},{\\\"label\\\":\\\"个人简介\\\",\\\"text\\\":\\\"个人简介\\\",\\\"value\\\":\\\"content\\\"}],\\\"dataSetType\\\":\\\"sql\\\",\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"name\\\",\\\"title\\\":\\\"姓名\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"punch_time\\\",\\\"title\\\":\\\"打卡时间\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"salary_money\\\",\\\"title\\\":\\\"工资\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"bonus_money\\\",\\\"title\\\":\\\"奖金\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"sex\\\",\\\"title\\\":\\\"性别\\\"},{\\\"izTotal\\\":\\\"Y\\\",\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"age\\\",\\\"title\\\":\\\"年龄\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"birthday\\\",\\\"title\\\":\\\"生日\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"email\\\",\\\"title\\\":\\\"邮箱\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"content\\\",\\\"title\\\":\\\"个人简介\\\"}]}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761824014876675', NULL, '1524641995740446722', NULL, 'JList', '{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"remark\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"date\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"pic\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"数据列表\\\",\\\"query\\\":[],\\\"h\\\":24,\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/datalist/list\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"通知一\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-9 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知二\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-8 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知三\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-7 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知四\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-4 14:20:21\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":813,\\\"height\\\":408},\\\"dataSetId\\\":\\\"1519945036454813698\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"date\\\",\\\"text\\\":\\\"date\\\",\\\"value\\\":\\\"date\\\"},{\\\"label\\\":\\\"remark\\\",\\\"text\\\":\\\"remark\\\",\\\"value\\\":\\\"remark\\\"},{\\\"label\\\":\\\"pic\\\",\\\"text\\\":\\\"pic\\\",\\\"value\\\":\\\"pic\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"horizontal\\\",\\\"showTitlePrefix\\\":true,\\\"titleFontSize\\\":18,\\\"showTimePrefix\\\":true}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761824014876676', NULL, '1524641995740446722', NULL, 'JForm', '{\\\"size\\\":{\\\"height\\\":120},\\\"w\\\":24,\\\"dataType\\\":2,\\\"h\\\":12,\\\"linkageConfig\\\":[{\\\"linkageId\\\":\\\"eb4af4a3-8fce-40f9-832c-c749e75dac5d\\\",\\\"linkage\\\":[{\\\"source\\\":\\\"sex\\\",\\\"target\\\":\\\"sex\\\"}]}],\\\"timeOut\\\":-1,\\\"option\\\":{\\\"fields\\\":[{\\\"fieldName\\\":\\\"sex\\\",\\\"dictCode\\\":\\\"sex\\\",\\\"fieldTxt\\\":\\\"性别\\\",\\\"defaultValue\\\":\\\"1\\\",\\\"searchMode\\\":\\\"\\\",\\\"action\\\":\\\"\\\",\\\"id\\\":\\\"row57227ae2-04d1-4306-8878-314e099cd5ac\\\",\\\"izSearch\\\":\\\"1\\\",\\\"widgetType\\\":\\\"select\\\"}]}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761824014876677', NULL, '1524641995740446722', NULL, 'JCarousel', '{\\\"chartData\\\":\\\"[{\\\\\\\"src\\\\\\\":\\\\\\\"http://minio.jeecg.com/otatest/temp/0_1647504880335.png\\\\\\\"},{\\\\\\\"src\\\\\\\":\\\\\\\"http://minio.jeecg.com/otatest/temp/1_1647504883878.png\\\\\\\"},{\\\\\\\"src\\\\\\\":\\\\\\\"http://minio.jeecg.com/otatest/temp/2_1647504886551.png\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":1636,\\\"height\\\":254},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"路径\\\"}],\\\"w\\\":24,\\\"dataType\\\":1,\\\"h\\\":22,\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/carousel\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"dots\\\":true,\\\"autoplay\\\":true,\\\"dotPosition\\\":\\\"bottom\\\"}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761824014876678', NULL, '1524641995740446722', NULL, 'JIframe', '{\\\"chartData\\\":\\\"http://www.jeecg.com\\\",\\\"size\\\":{\\\"width\\\":1636,\\\"height\\\":452},\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":26,\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"http://www.jeecg.com/\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761824014876679', NULL, '1524641995740446722', NULL, 'JCalendar', '{\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"座谈会\\\\\\\",\\\\\\\"start\\\\\\\":\\\\\\\"2022-03-11 11:32:33\\\\\\\",\\\\\\\"end\\\\\\\":\\\\\\\"2022-03-11 18:32:33\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#000000\\\\\\\",\\\\\\\"allday\\\\\\\":\\\\\\\"0\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"冬奥会\\\\\\\",\\\\\\\"start\\\\\\\":\\\\\\\"2022-03-04 11:32:33\\\\\\\",\\\\\\\"end\\\\\\\":\\\\\\\"2022-03-13 18:32:33\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#4A90E2\\\\\\\",\\\\\\\"allday\\\\\\\":\\\\\\\"1\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":813,\\\"height\\\":408},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"开始\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"结束\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"全天\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"颜色\\\"}],\\\"w\\\":10,\\\"dataType\\\":1,\\\"h\\\":40,\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/calendar\\\",\\\"timeOut\\\":0}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761824014876680', NULL, '1524641995740446722', NULL, 'JImg', '{\\\"size\\\":{\\\"width\\\":676,\\\"height\\\":254},\\\"w\\\":10,\\\"dataType\\\":1,\\\"h\\\":20,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"url\\\":\\\"http://minio.jeecg.com/otatest/jeecg_1651199708342.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761824081985537', NULL, '1524641995740446722', NULL, 'JText', '{\\\"chartData\\\":\\\"JeecgBoot面板设计\\\",\\\"size\\\":{\\\"width\\\":402,\\\"height\\\":56},\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"http://jeecg.com\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":76},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761824081985538', NULL, '1524641995740446722', NULL, 'JRadioButton', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"title\\\\\\\": \\\\\\\"Jeecg官网\\\\\\\",    \\\\\\\"value\\\\\\\": 0,    \\\\\\\"href\\\\\\\": \\\\\\\"http://jeecg.com\\\\\\\",    \\\\\\\"data\\\\\\\": {}  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"项目首页\\\\\\\",    \\\\\\\"value\\\\\\\": 1,    \\\\\\\"href\\\\\\\": \\\\\\\"/system/notice\\\\\\\",    \\\\\\\"data\\\\\\\": {}  }]\\\",\\\"size\\\":{\\\"width\\\":333,\\\"height\\\":56},\\\"w\\\":3,\\\"dataType\\\":1,\\\"h\\\":4,\\\"linkageConfig\\\":[],\\\"url\\\":\\\"\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"title\\\":\\\"按钮\\\",\\\"body\\\":{\\\"spaceSize\\\":23,\\\"size\\\":\\\"small\\\",\\\"marginTop\\\":12,\\\"marginLeft\\\":66}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761824081985539', NULL, '1524641995740446722', NULL, 'JQuickNav', '{\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"首页快速导航\\\",\\\"query\\\":[],\\\"h\\\":26,\\\"dataSetApi\\\":\\\"http://api.jeecg.com/mock/51/home/quick\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"首页\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-homepage\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#1fdaca\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"仪表盘\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-shijian\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#bf0c2c\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"组件\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-dangan\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#e18525\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"系统管理\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-shezhi\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#3fb27f\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"权限管理\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-yuechi\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#4daf1bc9\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"图表\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-fujin\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#00d8ff\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":813,\\\"height\\\":276},\\\"dataSetId\\\":\\\"1519962879095332865\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"icon\\\",\\\"text\\\":\\\"icon\\\",\\\"value\\\":\\\"icon\\\"},{\\\"label\\\":\\\"color\\\",\\\"text\\\":\\\"color\\\",\\\"value\\\":\\\"color\\\"},{\\\"label\\\":\\\"href\\\",\\\"text\\\":\\\"href\\\",\\\"value\\\":\\\"href\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":30},\\\"body\\\":{\\\"textAlign\\\":\\\"center\\\",\\\"column\\\":3,\\\"iconAlign\\\":\\\"top\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"快捷导航\\\"}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761824081985540', NULL, '1524641995740446722', NULL, 'JGrowCard', '{\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"访问数\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-qianbao\\\\\\\",\\\\\\\"value\\\\\\\":2000,\\\\\\\"total\\\\\\\":120000,\\\\\\\"prefix\\\\\\\":\\\\\\\"$\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"green\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"月\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"成交额\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-youhuiquan\\\\\\\",\\\\\\\"value\\\\\\\":20000,\\\\\\\"total\\\\\\\":500000,\\\\\\\"prefix\\\\\\\":\\\\\\\"$\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"blue\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"月\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"下载数\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-tupian\\\\\\\",\\\\\\\"value\\\\\\\":8000,\\\\\\\"prefix\\\\\\\":\\\\\\\"$\\\\\\\",\\\\\\\"total\\\\\\\":120000,\\\\\\\"color\\\\\\\":\\\\\\\"orange\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"周\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"成交数\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-jifen\\\\\\\",\\\\\\\"value\\\\\\\":5000,\\\\\\\"prefix\\\\\\\":\\\\\\\"$\\\\\\\",\\\\\\\"total\\\\\\\":50000,\\\\\\\"color\\\\\\\":\\\\\\\"purple\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"年\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":950,\\\"height\\\":254},\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":19,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":20},\\\"body\\\":{\\\"horizontal\\\":8,\\\"vertical\\\":8,\\\"span\\\":6},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"统计卡片\\\"}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761824081985541', NULL, '1524641995740446722', NULL, 'JProjectCard', '{\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"Github\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-github\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"不要等待机会，而要创造机会。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"开源组\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"Vue\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-buysellads\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#3fb27f\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"现在的你决定将来的你。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"算法组\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"Html5\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-html5\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#e18525\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"没有什么才能比努力更重要。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"上班摸鱼\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"Angular\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-product-hunt\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#bf0c2c\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"热情和欲望可以突破一切难关。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"UI\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"React\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-skype\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#00d8ff\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"健康的身体是实目标的基石。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"技术牛\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"Js\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-social-pengyou\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#4daf1bc9\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"路是走出来的，而不是空想出来的。\\\\\\\",\\\\\\\"group\\\\\\\":\\\\\\\"架构组\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":813,\\\"height\\\":408},\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":33,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":30},\\\"body\\\":{\\\"column\\\":3},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"项目列表\\\"}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761824081985542', NULL, '1524641995740446722', NULL, 'JWaitMatter', '{\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"待办公文\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-yudu\\\\\\\",\\\\\\\"content\\\\\\\":23,\\\\\\\"desc\\\\\\\":\\\\\\\"今日已办 3\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"待办流程\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-shuju\\\\\\\",\\\\\\\"content\\\\\\\":23,\\\\\\\"desc\\\\\\\":\\\\\\\"今日已办 3\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"待办任务\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-tongzhi\\\\\\\",\\\\\\\"content\\\\\\\":23,\\\\\\\"desc\\\\\\\":\\\\\\\"今日已办 3 今日更新 5\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2021-04-01\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":813,\\\"height\\\":221},\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":19,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":25},\\\"body\\\":{\\\"column\\\":3},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"待办事项\\\"}}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('1546761824081985543', NULL, '1524641995740446722', NULL, 'JDynamicInfo', '{\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"威廉\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"刚刚\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"在 <a>开源组</a> 创建了项目 <a>Vue</a>\\\\\\\",\\\\\\\"avatar\\\\\\\":\\\\\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/upload/test/320222_1646724689691.jpg\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"艾文\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"1个小时前\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"关注了 <a>威廉</a>\\\\\\\",\\\\\\\"avatar\\\\\\\":\\\\\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/upload/test/320305_1646724680756.jpg\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"克里斯\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"1天前\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"发布了 <a>个人动态</a>\\\\\\\",\\\\\\\"avatar\\\\\\\":\\\\\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/upload/test/299258_1646724675255.jpg\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"Jeecg\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2天前\\\\\\\",\\\\\\\"desc\\\\\\\":\\\\\\\"发表文章 <a>如何编写一个Vite插件</a>\\\\\\\",\\\\\\\"avatar\\\\\\\":\\\\\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/upload/test/2.4jeecg_1621512120602.png\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":813,\\\"height\\\":287},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"名称\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"头像\\\"}],\\\"w\\\":12,\\\"dataType\\\":1,\\\"h\\\":28,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"titleFontSize\\\":18}}', 'admin', '2022-07-12 15:42:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('763678099293241344', NULL, NULL, NULL, 'JNumber', '{\\r\\n    \\\"id\\\": \\\"69f30ceb-db97-4f39-8541-eda61e5c433f\\\",\\r\\n    \\\"component\\\": \\\"JNumber\\\",\\r\\n    \\\"config\\\": {\\r\\n        \\\"formType\\\": \\\"design\\\",\\r\\n        \\\"dataType\\\": 4,\\r\\n        \\\"timeOut\\\": 0,\\r\\n        \\\"option\\\": {\\r\\n            \\\"isCompare\\\": false,\\r\\n            \\\"trendType\\\": \\\"1\\\",\\r\\n            \\\"card\\\": {\\r\\n                \\\"title\\\": \\\"\\\",\\r\\n                \\\"extra\\\": \\\"\\\",\\r\\n                \\\"rightHref\\\": \\\"\\\",\\r\\n                \\\"size\\\": \\\"small\\\"\\r\\n            },\\r\\n            \\\"body\\\": {\\r\\n                \\\"text\\\": \\\"\\\",\\r\\n                \\\"color\\\": \\\"#000000\\\",\\r\\n                \\\"fontWeight\\\": \\\"bold\\\"\\r\\n            }\\r\\n        },\\r\\n        \\\"size\\\": {\\r\\n            \\\"height\\\": 500\\r\\n        },\\r\\n        \\\"dataNum\\\": \\\"\\\",\\r\\n        \\\"chart\\\": {\\r\\n            \\\"category\\\": \\\"Number\\\",\\r\\n            \\\"subclass\\\": \\\"JNumber\\\"\\r\\n        },\\r\\n        \\\"typeFields\\\": [\\r\\n            \\r\\n        ],\\r\\n        \\\"nameFields\\\": [\\r\\n            \\r\\n        ],\\r\\n        \\\"valueFields\\\": [\\r\\n            {\\r\\n                \\\"fieldName\\\": \\\"record_count\\\",\\r\\n                \\\"fieldTxt\\\": \\\"记录数量\\\",\\r\\n                \\\"fieldType\\\": \\\"count\\\",\\r\\n                \\\"widgetType\\\": \\\"text\\\"\\r\\n            }\\r\\n        ],\\r\\n        \\\"assistYFields\\\": [\\r\\n            \\r\\n        ],\\r\\n        \\\"assistTypeFields\\\": [\\r\\n            \\r\\n        ],\\r\\n        \\\"calcFields\\\": [\\r\\n            \\r\\n        ],\\r\\n        \\\"tableName\\\": \\\"test_1031\\\",\\r\\n        \\\"sorts\\\": {\\r\\n            \\\"name\\\": \\\"\\\",\\r\\n            \\\"type\\\": \\\"\\\"\\r\\n        },\\r\\n        \\\"filter\\\": {\\r\\n            \\\"queryField\\\": \\\"create_time\\\",\\r\\n            \\\"queryRange\\\": \\\"month\\\",\\r\\n            \\\"customTime\\\": null,\\r\\n            \\\"conditionMode\\\": \\\"and\\\",\\r\\n            \\\"conditionFields\\\": [\\r\\n                \\r\\n            ]\\r\\n        },\\r\\n        \\\"analysis\\\": {\\r\\n            \\\"isRawData\\\": true,\\r\\n            \\\"showMode\\\": 1,\\r\\n            \\\"showData\\\": 1,\\r\\n            \\\"isCompare\\\": false,\\r\\n            \\\"compareType\\\": \\\"\\\",\\r\\n            \\\"trendType\\\": \\\"1\\\",\\r\\n            \\\"compareValue\\\": null,\\r\\n            \\\"showFields\\\": [\\r\\n                \\r\\n            ]\\r\\n        },\\r\\n        \\\"formId\\\": \\\"test_1031\\\",\\r\\n        \\\"formName\\\": \\\"test1031\\\",\\r\\n        \\\"compStyleConfig\\\": {\\r\\n            \\\"summary\\\": {\\r\\n                \\\"showY\\\": true,\\r\\n                \\\"showTotal\\\": false,\\r\\n                \\\"showField\\\": \\\"\\\",\\r\\n                \\\"totalType\\\": \\\"sum\\\",\\r\\n                \\\"showName\\\": \\\"总计\\\"\\r\\n            },\\r\\n            \\\"showUnit\\\": {\\r\\n                \\\"numberLevel\\\": \\\"\\\",\\r\\n                \\\"decimal\\\": 0,\\r\\n                \\\"position\\\": \\\"suffix\\\",\\r\\n                \\\"unit\\\": \\\"\\\"\\r\\n            },\\r\\n            \\\"assist\\\": {\\r\\n                \\\"showUnit\\\": {\\r\\n                    \\\"numberLevel\\\": \\\"\\\",\\r\\n                    \\\"decimal\\\": 0,\\r\\n                    \\\"position\\\": \\\"suffix\\\",\\r\\n                    \\\"unit\\\": \\\"\\\"\\r\\n                },\\r\\n                \\\"summary\\\": {\\r\\n                    \\\"showY\\\": true,\\r\\n                    \\\"showField\\\": \\\"\\\",\\r\\n                    \\\"totalType\\\": \\\"sum\\\",\\r\\n                    \\\"showName\\\": \\\"总计\\\"\\r\\n                }\\r\\n            },\\r\\n            \\\"headerFreeze\\\": true,\\r\\n            \\\"unilineShow\\\": true,\\r\\n            \\\"columnFreeze\\\": true,\\r\\n            \\\"lineFreeze\\\": true\\r\\n        },\\r\\n        \\\"filterField\\\": []\\r\\n    }\\r\\n}', 'jeecg', '2022-12-16 18:30:58', 'jeecg', '2022-12-16 18:31:31');\nINSERT INTO `onl_drag_page_comp` VALUES ('763699587304030208', NULL, NULL, NULL, 'JBar', '{\\r\\n    \\\"id\\\": \\\"116606b2-4620-42d6-9202-36f39288a8d5\\\",\\r\\n    \\\"component\\\": \\\"JBar\\\",\\r\\n    \\\"config\\\": {\\r\\n        \\\"formType\\\": \\\"design\\\",\\r\\n        \\\"dataType\\\": 4,\\r\\n        \\\"timeOut\\\": 0,\\r\\n        \\\"option\\\": {\\r\\n            \\\"grid\\\": {\\r\\n                \\\"show\\\": false,\\r\\n                \\\"top\\\": 90,\\r\\n                \\\"bottom\\\": 115\\r\\n            },\\r\\n            \\\"card\\\": {\\r\\n                \\\"title\\\": \\\"\\\",\\r\\n                \\\"extra\\\": \\\"\\\",\\r\\n                \\\"rightHref\\\": \\\"\\\",\\r\\n                \\\"size\\\": \\\"default\\\"\\r\\n            },\\r\\n            \\\"title\\\": {\\r\\n                \\\"text\\\": \\\"每日新增记录\\\",\\r\\n                \\\"show\\\": true,\\r\\n                \\\"textStyle\\\": {\\r\\n                    \\\"color\\\": \\\"#464646\\\"\\r\\n                }\\r\\n            },\\r\\n            \\\"tooltip\\\": {\\r\\n                \\\"trigger\\\": \\\"axis\\\",\\r\\n                \\\"axisPointer\\\": {\\r\\n                    \\\"type\\\": \\\"shadow\\\",\\r\\n                    \\\"label\\\": {\\r\\n                        \\\"show\\\": true,\\r\\n                        \\\"backgroundColor\\\": \\\"#333\\\"\\r\\n                    }\\r\\n                }\\r\\n            },\\r\\n            \\\"yAxis\\\": {\\r\\n                \\\"splitLine\\\": {\\r\\n                    \\\"interval\\\": 2\\r\\n                },\\r\\n                \\\"lineStyle\\\": {\\r\\n                    \\\"color\\\": \\\"#f3f3f3\\\"\\r\\n                }\\r\\n            },\\r\\n            \\\"series\\\": [\\r\\n                {\\r\\n                    \\\"data\\\": [\\r\\n                        \\r\\n                    ],\\r\\n                    \\\"type\\\": \\\"bar\\\",\\r\\n                    \\\"barWidth\\\": 40,\\r\\n                    \\\"itemStyle\\\": {\\r\\n                        \\\"color\\\": \\\"#64b5f6\\\",\\r\\n                        \\\"borderRadius\\\": 0\\r\\n                    }\\r\\n                }\\r\\n            ]\\r\\n        },\\r\\n        \\\"size\\\": {\\r\\n            \\\"height\\\": 500\\r\\n        },\\r\\n        \\\"dataNum\\\": \\\"\\\",\\r\\n        \\\"chart\\\": {\\r\\n            \\\"category\\\": \\\"Bar\\\",\\r\\n            \\\"subclass\\\": \\\"JBar\\\",\\r\\n            \\\"isGroup\\\": false\\r\\n        },\\r\\n        \\\"typeFields\\\": [\\r\\n            \\r\\n        ],\\r\\n        \\\"nameFields\\\": [\\r\\n            {\\r\\n                \\\"fieldName\\\": \\\"create_time\\\",\\r\\n                \\\"fieldTxt\\\": \\\"创建时间\\\",\\r\\n                \\\"fieldType\\\": \\\"date\\\",\\r\\n                \\\"widgetType\\\": \\\"date\\\",\\r\\n\t\t\t\t\t\t\t\t\\\"customDateType\\\": \\\"3\\\"\\r\\n            }\\r\\n        ],\\r\\n        \\\"valueFields\\\": [\\r\\n            {\\r\\n                \\\"fieldName\\\": \\\"record_count\\\",\\r\\n                \\\"fieldTxt\\\": \\\"记录数量\\\",\\r\\n                \\\"fieldType\\\": \\\"count\\\",\\r\\n                \\\"widgetType\\\": \\\"text\\\"\\r\\n            }\\r\\n        ],\\r\\n        \\\"assistYFields\\\": [\\r\\n            \\r\\n        ],\\r\\n        \\\"assistTypeFields\\\": [\\r\\n            \\r\\n        ],\\r\\n        \\\"calcFields\\\": [\\r\\n            \\r\\n        ],\\r\\n        \\\"tableName\\\": \\\"test_1031\\\",\\r\\n        \\\"sorts\\\": {\\r\\n            \\\"name\\\": \\\"\\\",\\r\\n            \\\"type\\\": \\\"\\\"\\r\\n        },\\r\\n        \\\"filter\\\": {\\r\\n            \\\"queryField\\\": \\\"create_time\\\",\\r\\n            \\\"queryRange\\\": \\\"month\\\",\\r\\n            \\\"customTime\\\": null,\\r\\n            \\\"conditionMode\\\": \\\"and\\\",\\r\\n            \\\"conditionFields\\\": [\\r\\n                \\r\\n            ]\\r\\n        },\\r\\n        \\\"analysis\\\": {\\r\\n            \\\"isRawData\\\": true,\\r\\n            \\\"showMode\\\": 1,\\r\\n            \\\"showData\\\": 1,\\r\\n            \\\"isCompare\\\": false,\\r\\n            \\\"compareType\\\": \\\"\\\",\\r\\n            \\\"trendType\\\": \\\"1\\\",\\r\\n            \\\"compareValue\\\": null,\\r\\n            \\\"showFields\\\": [\\r\\n                \\r\\n            ]\\r\\n        },\\r\\n        \\\"formId\\\": \\\"test_1031\\\",\\r\\n        \\\"formName\\\": \\\"test1031\\\",\\r\\n        \\\"compStyleConfig\\\": {\\r\\n            \\\"summary\\\": {\\r\\n                \\\"showY\\\": true,\\r\\n                \\\"showTotal\\\": false,\\r\\n                \\\"showField\\\": \\\"\\\",\\r\\n                \\\"totalType\\\": \\\"sum\\\",\\r\\n                \\\"showName\\\": \\\"总计\\\"\\r\\n            },\\r\\n            \\\"showUnit\\\": {\\r\\n                \\\"numberLevel\\\": \\\"\\\",\\r\\n                \\\"decimal\\\": 0,\\r\\n                \\\"position\\\": \\\"suffix\\\",\\r\\n                \\\"unit\\\": \\\"\\\"\\r\\n            },\\r\\n            \\\"assist\\\": {\\r\\n                \\\"showUnit\\\": {\\r\\n                    \\\"numberLevel\\\": \\\"\\\",\\r\\n                    \\\"decimal\\\": 0,\\r\\n                    \\\"position\\\": \\\"suffix\\\",\\r\\n                    \\\"unit\\\": \\\"\\\"\\r\\n                },\\r\\n                \\\"summary\\\": {\\r\\n                    \\\"showY\\\": true,\\r\\n                    \\\"showField\\\": \\\"\\\",\\r\\n                    \\\"totalType\\\": \\\"sum\\\",\\r\\n                    \\\"showName\\\": \\\"总计\\\"\\r\\n                }\\r\\n            },\\r\\n            \\\"headerFreeze\\\": true,\\r\\n            \\\"unilineShow\\\": true,\\r\\n            \\\"columnFreeze\\\": true,\\r\\n            \\\"lineFreeze\\\": true\\r\\n        }\\r\\n    }\\r\\n}', 'jeecg', '2022-12-16 19:56:21', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('767345445303287808', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed854e9a6b01854e9a6b1f0000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"chu_fang_yao\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"chu_fang_yao\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"处方药\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2022-12-26 21:23:41', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('767345445714329600', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed854e9a6b01854e9a6b8f0001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"chu_fang_yao\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"chu_fang_yao\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"处方药\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2022-12-26 21:23:41', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('767559322439843840', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed8551a47f018551a47fb80000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"aaaa1\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"aaaa1\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"aaaa1\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2022-12-27 11:33:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('767559322888634368', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed8551a47f018551a480340001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"aaaa1\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"aaaa1\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"aaaa1\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2022-12-27 11:33:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('767901443155886080', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed8556812001855681206b0000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"app_haha\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"app_haha\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"app_haha\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2022-12-28 10:13:01', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('767901444070244352', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed8556812001855681215e0001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"app_haha\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"app_haha\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"app_haha\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2022-12-28 10:13:01', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('767901473807859712', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed85568120018556813d150004\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"cc22ss\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"cc22ss\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"工单积分\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2022-12-28 10:13:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('767901473874968576', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed85568120018556813d250005\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"cc22ss\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"cc22ss\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"工单积分\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2022-12-28 10:13:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('767924238153744384', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed8556d40d018556d40de50000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"adsfadsf\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"adsfadsf\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"测删除流程\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2022-12-28 11:43:36', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('767924238397014016', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed8556d40d018556d40e3d0001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"adsfadsf\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"adsfadsf\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"测删除流程\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2022-12-28 11:43:36', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('767924244520697856', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed8556d40d018556d413ef0004\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"adsfadsf\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"adsfadsf\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"测删除流程\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2022-12-28 11:43:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('767924244587806720', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed8556d40d018556d414020005\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"adsfadsf\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"adsfadsf\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"测删除流程\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2022-12-28 11:43:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('768016824029741056', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed855824e101855824e1440000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"issue\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"issue\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"issue\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2022-12-28 17:51:30', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('768016824646303744', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed855824e101855824e1e90001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"issue\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"issue\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"issue\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2022-12-28 17:51:30', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('768017225172975616', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed855824e10185582656ef0004\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"xiao_shou_yuan_ttk6\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"xiao_shou_yuan_ttk6\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"销售员\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2022-12-28 17:53:06', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('768017225214918656', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed855824e10185582656fa0005\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"xiao_shou_yuan_ttk6\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"xiao_shou_yuan_ttk6\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"销售员\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2022-12-28 17:53:06', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('768392697476087808', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed855d7c4c01855d7c4cb70000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"sha_gua_d_byfr\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"sha_gua_d_byfr\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"傻瓜d\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2022-12-29 18:45:05', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('768392697882935296', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed855d7c4c01855d7c4d260001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"sha_gua_d_byfr\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"sha_gua_d_byfr\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"傻瓜d\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2022-12-29 18:45:05', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('768475451123363840', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402885e8855ea95b01855ea95b090000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"jeecg_6666_1j8e\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"jeecg_6666_1j8e\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'qinfeng', '2022-12-30 00:13:55', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('768475451270164480', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402885e8855ea95b01855ea95b3f0001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"jeecg_6666_1j8e\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"jeecg_6666_1j8e\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'qinfeng', '2022-12-30 00:13:55', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('768682668124602368', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed85619b340185619b34e90000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"sdfa_gku1\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"sdfa_gku1\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"sdfa\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2022-12-30 13:57:20', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('768682668229459968', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed85619b340185619b35140001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"sdfa_gku1\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"sdfa_gku1\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"sdfa\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2022-12-30 13:57:20', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('768685401766428672', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed85619b34018561a526e20004\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"dd_fsog\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"dd_fsog\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"dd\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2022-12-30 14:08:11', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('768685401812566016', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed85619b34018561a526ed0005\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"dd_fsog\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"dd_fsog\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"dd\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2022-12-30 14:08:12', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('771249231264546816', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed8586144f018586144f220000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"xiao_mi_feng_e1f5\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"xiao_mi_feng_e1f5\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"小蜜蜂\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-06 15:55:56', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('771249231428124672', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed8586144f018586144f520001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"xiao_mi_feng_e1f5\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"xiao_mi_feng_e1f5\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"小蜜蜂\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-06 15:55:56', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('771261664033046528', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed8586144f018586418a160004\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"sdf_1yop\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"sdf_1yop\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"sdf\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-06 16:45:20', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('771261664058212352', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed8586144f018586418a1e0005\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"sdf_1yop\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"sdf_1yop\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"sdf\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-06 16:45:20', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772335059084574720', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed859582870185958287160000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"yao_pin_guan_li_56so\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"yao_pin_guan_li_56so\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"药品管理\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-09 15:50:38', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772335059160072192', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed859582870185958287330001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"yao_pin_guan_li_56so\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"yao_pin_guan_li_56so\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"药品管理\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-09 15:50:38', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772685203479003136', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed859a7c5801859a7c586c0000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"jeecg_xiao_hong_shu_12712a_e8rd\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"jeecg_xiao_hong_shu_12712a_e8rd\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"小红书12——*%^712a\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-10 15:01:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772685204120731648', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed859a7c5801859a7c591a0001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"jeecg_xiao_hong_shu_12712a_e8rd\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"jeecg_xiao_hong_shu_12712a_e8rd\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"小红书12——*%^712a\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-10 15:01:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772685310186291200', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed859a7c5801859a7cbbe30004\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"jeecg_xiao_hong_shu_sdf_kv7o\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"jeecg_xiao_hong_shu_sdf_kv7o\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"小红书@sdf\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-10 15:02:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772685310215651328', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed859a7c5801859a7cbbeb0005\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"jeecg_xiao_hong_shu_sdf_kv7o\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"jeecg_xiao_hong_shu_sdf_kv7o\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"小红书@sdf\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-10 15:02:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772685793072316416', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed859a7c5801859a7e7d9c0008\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"jeecg_xiao_hong_shu_23_387y\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"jeecg_xiao_hong_shu_23_387y\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"小红书2@3\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-10 15:04:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772685793105870848', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed859a7c5801859a7e7da40009\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"jeecg_xiao_hong_shu_23_387y\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"jeecg_xiao_hong_shu_23_387y\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"小红书2@3\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-10 15:04:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772688060278177792', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed859a7c5801859a86bd1d000c\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"jeecg_xiao_hong_shu_1asdfasdc_asdf_v5va\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"jeecg_xiao_hong_shu_1asdfasdc_asdf_v5va\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"小红书@1ASDFASDC_)-ASDF\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-10 15:13:20', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772688060315926528', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed859a7c5801859a86bd25000d\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"jeecg_xiao_hong_shu_1asdfasdc_asdf_v5va\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"jeecg_xiao_hong_shu_1asdfasdc_asdf_v5va\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"小红书@1ASDFASDC_)-ASDF\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-10 15:13:20', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772690418093588480', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed859a7c5801859a8f51010010\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"jeecg_23123asdf__nin_ha_a_si_d_hp0c\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"jeecg_23123asdf__nin_ha_a_si_d_hp0c\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"!23123&asdf_您哈阿斯顿发（）%1%\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-10 15:22:42', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772690418114560000', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed859a7c5801859a8f51060011\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"jeecg_23123asdf__nin_ha_a_si_d_hp0c\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"jeecg_23123asdf__nin_ha_a_si_d_hp0c\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"!23123&asdf_您哈阿斯顿发（）%1%\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-10 15:22:42', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772690532560338944', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed859a7c5801859a8fbb9c0014\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"ni_hao_a_8123mm_thah\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"ni_hao_a_8123mm_thah\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"你好啊&8123MM……\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-10 15:23:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772690532589699072', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed859a7c5801859a8fbba30015\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"ni_hao_a_8123mm_thah\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"ni_hao_a_8123mm_thah\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"你好啊&8123MM……\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-10 15:23:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772691585053818880', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed859a7c5801859a938fd20018\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"a_si_dun_fa_song_dao_fa_song_d_b9jd\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"a_si_dun_fa_song_dao_fa_song_d_b9jd\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"阿斯顿发送到发送到发送到发送到发送到发送到发送到发斯蒂芬！12312412341234234\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-10 15:27:20', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772691585078984704', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed859a7c5801859a938fd70019\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"a_si_dun_fa_song_dao_fa_song_d_b9jd\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"a_si_dun_fa_song_dao_fa_song_d_b9jd\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"阿斯顿发送到发送到发送到发送到发送到发送到发送到发斯蒂芬！12312412341234234\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-10 15:27:20', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772692400153886720', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed859a7c5801859a9686f0001c\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"a_si_dun_fa_sheng_a_si_dun_fa__4db1\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"a_si_dun_fa_sheng_a_si_dun_fa__4db1\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"阿斯顿发生阿斯顿发送到发送到发送到发送到发送到发送到发送到发斯蒂芬\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-10 15:30:34', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772692400195829760', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed859a7c5801859a9686f9001d\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"a_si_dun_fa_sheng_a_si_dun_fa__4db1\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"a_si_dun_fa_sheng_a_si_dun_fa__4db1\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"阿斯顿发生阿斯顿发送到发送到发送到发送到发送到发送到发送到发斯蒂芬\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-10 15:30:34', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772700410687324160', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed859a7c5801859ab3ab540020\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"adff_2z3v\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"adff_2z3v\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"adff\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-10 16:02:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('772700410708295680', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed859a7c5801859ab3ab590021\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"adff_2z3v\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"adff_2z3v\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"adff\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-10 16:02:24', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773096203617370112', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed85a0538e0185a0538e260000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"aaaa1\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"aaaa1\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-11 18:15:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773096204087132160', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed85a0538e0185a0538ea60001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"aaaa1\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"aaaa1\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-11 18:15:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773098908486270976', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed85a05d650185a05d65430000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"aaaa1\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"aaaa1\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"aaaa1\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-11 18:25:53', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773098909077667840', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed85a05d650185a05d65dd0001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"aaaa1\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"aaaa1\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"aaaa1\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-11 18:25:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773104813269385216', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed85a05d650185a072e0940004\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"aaaa1\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"aaaa1\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"aaaa1\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-11 18:49:21', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773104813302939648', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed85a05d650185a072e09c0005\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"aaaa1\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"aaaa1\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"aaaa1\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-11 18:49:21', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773115065989660672', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed85a05d650185a0982d2b0008\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"chu_fang_yao\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"chu_fang_yao\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"处方药\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-11 19:30:06', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773115066019020800', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed85a05d650185a0982d330009\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"chu_fang_yao\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"chu_fang_yao\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"处方药\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-11 19:30:06', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773115287805427712', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed85a05d650185a098fbc1000c\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"yao_pin_guan_li_56so\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"yao_pin_guan_li_56so\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"药品管理\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-11 19:30:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773115287834787840', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed85a05d650185a098fbc7000d\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"yao_pin_guan_li_56so\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"yao_pin_guan_li_56so\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"药品管理\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-11 19:30:59', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773115301323669504', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed85a05d650185a09908580010\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"sha_gua_d_byfr\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"sha_gua_d_byfr\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"傻瓜d\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-11 19:31:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773115301357223936', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed85a05d650185a09908600011\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"sha_gua_d_byfr\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"sha_gua_d_byfr\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"傻瓜d\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-11 19:31:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773115303651508224', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed85a05d650185a0990a830014\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"xiao_shou_yuan_ttk6\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"xiao_shou_yuan_ttk6\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"销售员\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-11 19:31:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773115303664091136', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed85a05d650185a0990a860015\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"xiao_shou_yuan_ttk6\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"xiao_shou_yuan_ttk6\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"销售员\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-11 19:31:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773426738789154816', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed85a506090185a50609000000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"chu_fang_yao\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"chu_fang_yao\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"处方药\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-12 16:08:34', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773426739690930176', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed85a506090185a50609ea0001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"chu_fang_yao\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"chu_fang_yao\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"处方药\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-12 16:08:35', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773451899168948224', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed85a506090185a56191810004\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"sha_gua_d_byfr\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"sha_gua_d_byfr\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"傻瓜d\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-12 17:48:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773451899227668480', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed85a506090185a56191900005\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"sha_gua_d_byfr\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"sha_gua_d_byfr\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"傻瓜d\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-12 17:48:33', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773495830288072704', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed85a601630185a60163780000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"xiao_shou_yuan_ttk6\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"xiao_shou_yuan_ttk6\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-12 20:43:07', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773495830288072705', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed85a601630185a60163780001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"yao_pin_guan_li_56so\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"yao_pin_guan_li_56so\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-12 20:43:07', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773495831030464512', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed85a601630185a601643d0003\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"yao_pin_guan_li_56so\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"yao_pin_guan_li_56so\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-12 20:43:07', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773495831030464513', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed85a601630185a601643c0002\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"xiao_shou_yuan_ttk6\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"xiao_shou_yuan_ttk6\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-12 20:43:07', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773498678044327936', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881ed85a60bbf0185a60bbfaf0000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"jeecg_250_nfr2\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"jeecg_250_nfr2\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"250\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-12 20:54:26', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('773498678862217216', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881ed85a60bbf0185a60bc07a0001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"jeecg_250_nfr2\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"jeecg_250_nfr2\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"250\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-01-12 20:54:26', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('780286279472414720', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e5860680e501860680e5ec0000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"ce_shi_app_fist_demo\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"ce_shi_app_fist_demo\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"测试app第一个例子11\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-01-31 14:25:56', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('780286283788353536', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e5860680e501860680ea2c0001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"ce_shi_app_fist_demo\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"ce_shi_app_fist_demo\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"测试app第一个例子11\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-01-31 14:25:57', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('780292924277555200', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e5860699120186069912970000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"wo_de_ke_hu\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"wo_de_ke_hu\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"我的客户\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-01-31 14:52:21', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('780292924671819776', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e5860699120186069913010001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"wo_de_ke_hu\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"wo_de_ke_hu\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"我的客户\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-01-31 14:52:21', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('780727462598311936', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e5860cc5e901860cc5e9ee0000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"aaaa\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"aaaa\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"测试mogo列表查询和数据权限\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-01 19:39:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('780727462719946752', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e5860cc5e901860cc5ea180001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"aaaa\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"aaaa\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"测试mogo列表查询和数据权限\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-01 19:39:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('781081487378251776', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e58611cdd9018611cdd92f0000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"jeecg_xiao_hong_shu_123_iaxy\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"jeecg_xiao_hong_shu_123_iaxy\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"小红书123\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-02 19:05:49', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('781081487483109376', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e58611cdd9018611cdd9590001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"jeecg_xiao_hong_shu_123_iaxy\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"jeecg_xiao_hong_shu_123_iaxy\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"小红书123\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-02 19:05:49', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('781081970767593472', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e58611cdd9018611cf9b710004\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"adff_2z3v\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"adff_2z3v\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-02-02 19:07:44', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('781081970788564992', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e58611cdd9018611cf9b770005\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"adff_2z3v\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"adff_2z3v\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-02-02 19:07:44', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('781082322384486400', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e58611cdd9018611d0e2ea0008\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"aaaa1\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"aaaa1\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-02-02 19:09:08', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('781082322409652224', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e58611cdd9018611d0e2f00009\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"aaaa1\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"aaaa1\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-02-02 19:09:08', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('781082329376391168', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e58611cdd9018611d0e96c000c\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"sdfa_gku1\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"sdfa_gku1\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-02-02 19:09:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('781082329397362688', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e58611cdd9018611d0e972000d\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"sdfa_gku1\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"sdfa_gku1\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-02-02 19:09:09', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('781084613351079936', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e58611cdd9018611d9388b0010\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"demo_auto_number\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"demo_auto_number\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"示例：自动编号\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-02-02 19:18:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('781084613380440064', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e58611cdd9018611d938920011\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"demo_auto_number\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"demo_auto_number\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"示例：自动编号\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'admin', '2023-02-02 19:18:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('781123317377564672', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e58612660601861266066a0000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"zhua_yao_zp4u\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"zhua_yao_zp4u\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"抓药\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-02 21:52:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('781123317734080512', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e5861266060186126606cc0001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"zhua_yao_zp4u\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"zhua_yao_zp4u\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"抓药\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-02 21:52:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('781704807987576832', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e5861aa97901861aa979ba0000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"ce_shi_biao_dan_001_gsdm\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"ce_shi_biao_dan_001_gsdm\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"测试表单001\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-04 12:22:40', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('781704808121794560', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e5861aa97901861aa979ec0001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"ce_shi_biao_dan_001_gsdm\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"ce_shi_biao_dan_001_gsdm\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"测试表单001\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-04 12:22:40', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('786408878929641472', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e5865d82c901865d82c90e0000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"ce_shi_biao_dan_001_gsdm\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"ce_shi_biao_dan_001_gsdm\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"测试表单001\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-17 11:54:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('786408880452173824', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e5865d82c901865d82caac0001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"ce_shi_biao_dan_001_gsdm\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"ce_shi_biao_dan_001_gsdm\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"测试表单001\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-17 11:54:58', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('787463779545808896', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e5866c807d01866c807df20000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"xiao_shou_yuan_ttk6\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"xiao_shou_yuan_ttk6\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"销售员\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-20 09:46:46', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('787463779721969664', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e5866c807d01866c807e2e0001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"xiao_shou_yuan_ttk6\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"xiao_shou_yuan_ttk6\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"销售员\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-20 09:46:46', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('787463782867697664', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e5866c807d01866c80811e0004\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"sha_gua_d_byfr\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"sha_gua_d_byfr\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"傻瓜d\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-20 09:46:46', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('787463782884474880', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e5866c807d01866c8081230005\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"sha_gua_d_byfr\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"sha_gua_d_byfr\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"傻瓜d\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-20 09:46:46', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('787463790937538560', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e5866c807d01866c8088a30008\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"yao_pin_guan_li_56so\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"yao_pin_guan_li_56so\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"药品管理\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-20 09:46:48', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('787463790962704384', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e5866c807d01866c8088a80009\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"yao_pin_guan_li_56so\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"yao_pin_guan_li_56so\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"药品管理\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-20 09:46:48', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('788345993070411776', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e5867909f701867909f75d0000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"sfasd_c6km\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"sfasd_c6km\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"sfasd\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-22 20:12:22', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('788345993238183936', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e5867909f701867909f78c0001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"sfasd_c6km\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"sfasd_c6km\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"sfasd\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-22 20:12:22', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('788677763355672576', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e5867dc0f001867dc0f0840000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"ku_cun_h3ht\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"ku_cun_h3ht\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"库存\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-23 18:10:42', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('788677763523444736', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e5867dc0f001867dc0f0b40001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"ku_cun_h3ht\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"ku_cun_h3ht\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"库存\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-23 18:10:42', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('788677867252776960', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e5867dc0f001867dc151500004\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"ru_ku_dan_5rq0\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"ru_ku_dan_5rq0\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"入库单\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-23 18:11:07', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('788677867277942784', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e5867dc0f001867dc151560005\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"ru_ku_dan_5rq0\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"ru_ku_dan_5rq0\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"入库单\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-02-23 18:11:07', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('790747819019370496', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e5869b2bc201869b2bc2130000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"bao_bao_cai_pu_2cqr\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"bao_bao_cai_pu_2cqr\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"宝宝菜谱\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-03-01 11:16:22', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('790747819141005312', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e5869b2bc201869b2bc23c0001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"bao_bao_cai_pu_2cqr\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"bao_bao_cai_pu_2cqr\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"宝宝菜谱\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-03-01 11:16:22', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('790755458344321024', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e5869b478c01869b478cbe0000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"su_cai_zhun_bei_1fps\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"su_cai_zhun_bei_1fps\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"素材准备\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-03-01 11:46:43', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('790755458709225472', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e5869b478c01869b478d200001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"su_cai_zhun_bei_1fps\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"su_cai_zhun_bei_1fps\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"素材准备\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-03-01 11:46:43', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('793418272129187840', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e586c11ecf0186c11ecf520000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"hong_niu_pin_zhong_u7d2\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"hong_niu_pin_zhong_u7d2\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"红牛品种\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-03-08 20:07:47', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('793418272720584704', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e586c11ecf0186c11ecff00001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"hong_niu_pin_zhong_u7d2\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"hong_niu_pin_zhong_u7d2\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"红牛品种\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-03-08 20:07:47', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('795896466006638592', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e586e4566d0186e4566d3c0000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"cai_gou_dan_jp29\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"cai_gou_dan_jp29\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"采购单\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-03-15 16:15:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('795896466132467712', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e586e4566d0186e4566d690001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"cai_gou_dan_jp29\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"cai_gou_dan_jp29\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"采购单\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-03-15 16:15:15', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('795896576572686336', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e586e4566d0186e456d4430004\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"cai_gou_ming_xi_fqt7\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"cai_gou_ming_xi_fqt7\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"采购明细\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-03-15 16:15:41', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('795896576606240768', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e586e4566d0186e456d44b0005\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"cai_gou_ming_xi_fqt7\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"cai_gou_ming_xi_fqt7\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"采购明细\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-03-15 16:15:41', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('796307505735041024', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e586ea2dc70186ea2dc7d20000\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"chan_pin_4jvg\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"chan_pin_4jvg\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"产品\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-03-16 19:28:34', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('796307506150277120', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e586ea2dc70186ea2dc8410001\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"chan_pin_4jvg\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"chan_pin_4jvg\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"产品\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-03-16 19:28:34', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('796307694893957120', NULL, NULL, NULL, 'JNumber', '{\\\"component\\\":\\\"JNumber\\\",\\\"id\\\":\\\"402881e586ea2dc70186ea2e78090004\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"ku_cun_v2ve\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"filterField\\\":[],\\\"timeOut\\\":0,\\\"tableName\\\":\\\"ku_cun_v2ve\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"库存\\\",\\\"nameFields\\\":[],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JNumber\\\",\\\"category\\\":\\\"Number\\\"},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-03-16 19:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('796307694914928640', NULL, NULL, NULL, 'JBar', '{\\\"component\\\":\\\"JBar\\\",\\\"id\\\":\\\"402881e586ea2dc70186ea2e780f0005\\\",\\\"config\\\":{\\\"assistYFields\\\":[],\\\"formId\\\":\\\"ku_cun_v2ve\\\",\\\"compStyleConfig\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showTotal\\\":false,\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"lineFreeze\\\":true,\\\"columnFreeze\\\":true,\\\"assist\\\":{\\\"summary\\\":{\\\"showName\\\":\\\"总计\\\",\\\"showField\\\":\\\"\\\",\\\"showY\\\":true,\\\"totalType\\\":\\\"sum\\\"},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0}},\\\"showUnit\\\":{\\\"unit\\\":\\\"\\\",\\\"numberLevel\\\":\\\"\\\",\\\"position\\\":\\\"suffix\\\",\\\"decimal\\\":0},\\\"headerFreeze\\\":true,\\\"unilineShow\\\":true},\\\"formType\\\":\\\"design\\\",\\\"assistTypeFields\\\":[],\\\"dataType\\\":4,\\\"calcFields\\\":[],\\\"valueFields\\\":[{\\\"fieldName\\\":\\\"record_count\\\",\\\"fieldTxt\\\":\\\"记录数量\\\",\\\"fieldType\\\":\\\"count\\\",\\\"widgetType\\\":\\\"text\\\"}],\\\"analysis\\\":{\\\"showData\\\":1,\\\"isRawData\\\":true,\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"showMode\\\":1,\\\"showFields\\\":[],\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"tableName\\\":\\\"ku_cun_v2ve\\\",\\\"typeFields\\\":[],\\\"filter\\\":{\\\"conditionMode\\\":\\\"and\\\",\\\"conditionFields\\\":[],\\\"queryField\\\":\\\"create_time\\\",\\\"queryRange\\\":\\\"month\\\"},\\\"size\\\":{\\\"height\\\":500},\\\"formName\\\":\\\"库存\\\",\\\"nameFields\\\":[{\\\"fieldName\\\":\\\"create_time\\\",\\\"fieldTxt\\\":\\\"创建时间\\\",\\\"fieldType\\\":\\\"date\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"dataNum\\\":\\\"\\\",\\\"chart\\\":{\\\"subclass\\\":\\\"JBar\\\",\\\"category\\\":\\\"Bar\\\",\\\"isGroup\\\":false},\\\"sorts\\\":{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"\\\"},\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}}', 'jeecg', '2023-03-16 19:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911854596825595904', NULL, '910820508471705600', NULL, 'JText', '{\\\"chartData\\\":\\\"某 连 锁 饮 品 销 售\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1132,\\\"height\\\":100},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":40,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":18,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-29 15:51:27', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911854596863344640', NULL, '910820508471705600', NULL, 'JForm', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":675,\\\"height\\\":100},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":24,\\\"dataType\\\":1,\\\"h\\\":12,\\\"linkageConfig\\\":[{\\\"linkageId\\\":\\\"0efe3637-39ac-4f2e-82f4-e09540ee332a\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"2db8c9de-9f8b-49f8-8d7a-6b3166de0ed5\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"6f773617-eca8-4598-8260-dc701cc16e8b\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"868c63d3-cfc2-4e49-a1c5-6ee0418fd303\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"35a7308b-0482-48c8-8e46-ed50cfb67961\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"cd981a55-258c-48cd-8e92-742185a711a3\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"715ebf76-9228-4b2e-8ab7-dcb351c2ff03\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"2323a8fb-42ff-4a23-9b13-8f4f514dafb5\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"0b68bd42-a0e9-48f8-9a7b-794ba9ebf8cf\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"5130130f-6076-45b1-8977-d9b5a4c894fc\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"82016a70-aa98-42cb-b205-c14e5e212cf8\\\",\\\"linkage\\\":[]}],\\\"timeOut\\\":-1,\\\"option\\\":{\\\"fields\\\":[{\\\"fieldName\\\":\\\"date\\\",\\\"dictCode\\\":\\\"\\\",\\\"dateFormat\\\":\\\"YYYY-MM\\\",\\\"fieldTxt\\\":\\\"日期\\\",\\\"defaultValue\\\":\\\"2024-01\\\",\\\"searchMode\\\":\\\"single\\\",\\\"orderNum\\\":\\\"\\\",\\\"action\\\":\\\"\\\",\\\"id\\\":\\\"rowa82899dc-1e6b-47a1-acd8-ba2fb6f5df02\\\",\\\"izSearch\\\":\\\"1\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}}}}', 'admin', '2024-01-29 15:51:27', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911854596892704768', NULL, '910820508471705600', NULL, 'JGrowCard', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"图标\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"总计\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"前缀\\\"},{\\\"mapping\\\":\\\"color\\\",\\\"filed\\\":\\\"颜色\\\"},{\\\"mapping\\\":\\\"action\\\",\\\"filed\\\":\\\"单位\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"销量额\\\",\\\"query\\\":[],\\\"h\\\":19,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=salesVolume\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"title\\\\\\\": \\\\\\\"访问数\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-qianbao\\\\\\\",    \\\\\\\"value\\\\\\\": 2000,    \\\\\\\"total\\\\\\\": 120000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"color\\\\\\\": \\\\\\\"green\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"月\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"成交额\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-youhuiquan\\\\\\\",    \\\\\\\"value\\\\\\\": 20000,    \\\\\\\"total\\\\\\\": 500000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"color\\\\\\\": \\\\\\\"blue\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"月\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"下载数\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-tupian\\\\\\\",    \\\\\\\"value\\\\\\\": 8000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"total\\\\\\\": 120000,    \\\\\\\"color\\\\\\\": \\\\\\\"orange\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"周\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"成交数\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-jifen\\\\\\\",    \\\\\\\"value\\\\\\\": 5000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"total\\\\\\\": 50000,    \\\\\\\"color\\\\\\\": \\\\\\\"purple\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"年\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":1817,\\\"height\\\":320},\\\"dataSetId\\\":\\\"911792028287287296\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"},{\\\"label\\\":\\\"icon\\\",\\\"text\\\":\\\"icon\\\",\\\"value\\\":\\\"icon\\\"},{\\\"label\\\":\\\"action\\\",\\\"text\\\":\\\"action\\\",\\\"value\\\":\\\"action\\\"},{\\\"label\\\":\\\"color\\\",\\\"text\\\":\\\"color\\\",\\\"value\\\":\\\"color\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":20},\\\"body\\\":{\\\"horizontal\\\":6,\\\"vertical\\\":4,\\\"span\\\":8},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"统计卡片\\\"}}}', 'admin', '2024-01-29 15:51:27', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911854596913676288', NULL, '910820508471705600', NULL, 'JNumber', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"单月最高销售量分店\\\\t\\\",\\\"query\\\":[],\\\"h\\\":9,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=topSellingBranch\\\",\\\"drillData\\\":[],\\\"analysis\\\":{\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\\\\"value\\\\\\\":\\\\\\\"1024\\\\\\\"}\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":177},\\\"dataSetId\\\":\\\"911836343134896128\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#F3EFF0\\\",\\\"seriesType\\\":[],\\\"w\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#F9B632\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FF9736\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":\\\"单月最高销量分店（新洲店）\\\"}}}', 'admin', '2024-01-29 15:51:27', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911854596930453504', NULL, '910820508471705600', NULL, 'JNumber', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"单月最高销量品线\\\\t\\\",\\\"query\\\":[],\\\"h\\\":9,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=salesLine\\\",\\\"drillData\\\":[],\\\"analysis\\\":{\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\\\\"value\\\\\\\":\\\\\\\"1024\\\\\\\"}\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":166},\\\"dataSetId\\\":\\\"911836426450550784\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#E9F2FF\\\",\\\"seriesType\\\":[],\\\"w\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#547BFE\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#547BFE\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":\\\"单月最高销量品线（醇香奶茶）\\\"}}}', 'admin', '2024-01-29 15:51:27', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911854596951425024', NULL, '910820508471705600', NULL, 'JNumber', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"单月最高销量单品\\\",\\\"query\\\":[],\\\"h\\\":9,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=highestSellingItem\\\",\\\"drillData\\\":[],\\\"analysis\\\":{\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\\\\"value\\\\\\\":\\\\\\\"1024\\\\\\\"}\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":166},\\\"dataSetId\\\":\\\"911836535531814912\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#EDFAFE\\\",\\\"seriesType\\\":[],\\\"w\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#44C8F3\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#44C8F3\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":\\\"单月最高销量单品（珍珠奶茶）\\\"}}}', 'admin', '2024-01-29 15:51:27', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911854596972396544', NULL, '910820508471705600', NULL, 'JNumber', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"单月最高销量规格\\\",\\\"query\\\":[],\\\"h\\\":9,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=maximumSalesSpecs\\\",\\\"drillData\\\":[],\\\"analysis\\\":{\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\\\\"value\\\\\\\":\\\\\\\"1024\\\\\\\"}\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":177},\\\"dataSetId\\\":\\\"911836717715603456\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#F2FCF7\\\",\\\"seriesType\\\":[],\\\"w\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#58DC92\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#9EFFB6\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":\\\"单月最高销量规格（磨砂）\\\"}}}', 'admin', '2024-01-29 15:51:27', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911854596984979456', NULL, '910820508471705600', NULL, 'JLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"销售额走势\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=salesTrend\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":243},\\\"dataSetId\\\":\\\"911836839023263744\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"},\\\"show\\\":false},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"show\\\":true},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#FBE1C2\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":178,\\\"bottom\\\":157,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"lineType\\\":\\\"area\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"销售金额（元）\\\",\\\"left\\\":10,\\\"text\\\":\\\"销售额走势\\\",\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-29 15:51:27', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911854597001756672', NULL, '910820508471705600', NULL, 'JLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"销量走势\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=salesTendency\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":232},\\\"dataSetId\\\":\\\"911836922162757632\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#D7EBFB\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":71,\\\"bottom\\\":62,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"lineType\\\":\\\"area\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"type\\\":\\\"line\\\"}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"销售数量（杯）\\\",\\\"left\\\":1,\\\"text\\\":\\\"销量走势\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-29 15:51:27', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911854597022728192', NULL, '910820508471705600', NULL, 'JLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"原料支出趋势\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=expenditureTrends\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":221},\\\"dataSetId\\\":\\\"911845934736392192\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#D5DFFE\\\"}],\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":54,\\\"bottom\\\":61,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"lineType\\\":\\\"area\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"type\\\":\\\"line\\\"}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"支出费用（元）\\\",\\\"left\\\":10,\\\"text\\\":\\\"原料支出趋势\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-29 15:51:27', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911854597043699712', NULL, '910820508471705600', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"订单销售量\\\\t\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=orderSalesVolume\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":827,\\\"height\\\":353},\\\"dataSetId\\\":\\\"911837008343121920\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"type\\\":\\\"value\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":48,\\\"bottom\\\":60,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":0,\\\"data\\\":[],\\\"showBackground\\\":false,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"#51626E\\\"},\\\"itemStyle\\\":{\\\"color\\\":\\\"#85C6F3\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"订单销售量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-29 15:51:27', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911854597064671232', NULL, '910820508471705600', NULL, 'JCommonTable', '{\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"店铺销售额排名\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=salesRanking\\\",\\\"drillData\\\":[],\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"width\\\":447,\\\"height\\\":353},\\\"dataSetId\\\":\\\"911837091507781632\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"店铺\\\",\\\"text\\\":\\\"店铺\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"销售金额（元）\\\",\\\"text\\\":\\\"销售金额（元）\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"seriesType\\\":[],\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"name\\\",\\\"title\\\":\\\"店铺\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"value\\\",\\\"title\\\":\\\"销售金额（元）\\\"}],\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}}}}', 'admin', '2024-01-29 15:51:27', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911854597085642752', NULL, '910820508471705600', NULL, 'JRing', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\" 冷热占比\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=coldAndHostProportion\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":353},\\\"dataSetId\\\":\\\"911837168896884736\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"top\\\":1,\\\"show\\\":true,\\\"text\\\":\\\"冷热占比\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-29 15:51:27', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911916295486226432', NULL, '910475721247866880', NULL, 'JGrowCard', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"图标\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"总计\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"前缀\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"颜色\\\"},{\\\"mapping\\\":\\\"unit\\\",\\\"filed\\\":\\\"单位\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"销售状态\\\",\\\"query\\\":[],\\\"h\\\":19,\\\"dataSetApi\\\":\\\"https://apijeecgcom/mock/51/commerceSalesOperations?type=saleStatus\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://apijeecgcom/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"访问数\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-qianbao\\\\\\\",\\\\\\\"value\\\\\\\":2000,\\\\\\\"total\\\\\\\":120000,\\\\\\\"prefix\\\\\\\":\\\\\\\"$\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"green\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"月\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"成交额\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-youhuiquan\\\\\\\",\\\\\\\"value\\\\\\\":20000,\\\\\\\"total\\\\\\\":500000,\\\\\\\"prefix\\\\\\\":\\\\\\\"$\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"blue\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"月\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"下载数\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-tupian\\\\\\\",\\\\\\\"value\\\\\\\":8000,\\\\\\\"prefix\\\\\\\":\\\\\\\"$\\\\\\\",\\\\\\\"total\\\\\\\":120000,\\\\\\\"color\\\\\\\":\\\\\\\"orange\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"周\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"成交数\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-jifen\\\\\\\",\\\\\\\"value\\\\\\\":5000,\\\\\\\"prefix\\\\\\\":\\\\\\\"$\\\\\\\",\\\\\\\"total\\\\\\\":50000,\\\\\\\"color\\\\\\\":\\\\\\\"purple\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"年\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":177},\\\"dataSetId\\\":\\\"910478592823574528\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"},{\\\"label\\\":\\\"unit\\\",\\\"text\\\":\\\"unit\\\",\\\"value\\\":\\\"unit\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//atalicdncom/t/font_3237315_b3fqd960gltjs\\\",\\\"fontSize\\\":20},\\\"body\\\":{\\\"horizontal\\\":8,\\\"vertical\\\":8,\\\"span\\\":8},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"统计卡片\\\"}}}', 'admin', '2024-01-29 19:56:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911916295511392256', NULL, '910475721247866880', NULL, 'JBubbleMap', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"commonOption\\\":{\\\"barSize\\\":10,\\\"gradientColor\\\":false,\\\"breadcrumb\\\":{\\\"drillDown\\\":false,\\\"textColor\\\":\\\"#000000\\\"},\\\"areaColor\\\":{\\\"color1\\\":\\\"#f7f7f7\\\",\\\"color2\\\":\\\"#fcc02e\\\"},\\\"barColor\\\":\\\"#fff176\\\",\\\"barColor2\\\":\\\"#fcc02e\\\",\\\"inRange\\\":{\\\"color\\\":[\\\"#04387b\\\",\\\"#467bc0\\\"]}},\\\"paramOption\\\":[],\\\"dataSetName\\\":\\\"各地区订单与仓库情况\\\",\\\"activeKey\\\":1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"北京\\\\\\\",\\\\\\\"value\\\\\\\":199},{\\\\\\\"name\\\\\\\":\\\\\\\"新疆\\\\\\\",\\\\\\\"value\\\\\\\":180},{\\\\\\\"name\\\\\\\":\\\\\\\"河南\\\\\\\",\\\\\\\"value\\\\\\\":137},{\\\\\\\"name\\\\\\\":\\\\\\\"四川\\\\\\\",\\\\\\\"value\\\\\\\":125},{\\\\\\\"name\\\\\\\":\\\\\\\"黑龙江\\\\\\\",\\\\\\\"value\\\\\\\":123},{\\\\\\\"name\\\\\\\":\\\\\\\"广东\\\\\\\",\\\\\\\"value\\\\\\\":123},{\\\\\\\"name\\\\\\\":\\\\\\\"山东\\\\\\\",\\\\\\\"value\\\\\\\":119},{\\\\\\\"name\\\\\\\":\\\\\\\"福建\\\\\\\",\\\\\\\"value\\\\\\\":116},{\\\\\\\"name\\\\\\\":\\\\\\\"湖北\\\\\\\",\\\\\\\"value\\\\\\\":116},{\\\\\\\"name\\\\\\\":\\\\\\\"浙江\\\\\\\",\\\\\\\"value\\\\\\\":114},{\\\\\\\"name\\\\\\\":\\\\\\\"湖南\\\\\\\",\\\\\\\"value\\\\\\\":114},{\\\\\\\"name\\\\\\\":\\\\\\\"安徽\\\\\\\",\\\\\\\"value\\\\\\\":109},{\\\\\\\"name\\\\\\\":\\\\\\\"河北\\\\\\\",\\\\\\\"value\\\\\\\":102},{\\\\\\\"name\\\\\\\":\\\\\\\"江苏\\\\\\\",\\\\\\\"value\\\\\\\":92},{\\\\\\\"name\\\\\\\":\\\\\\\"江西\\\\\\\",\\\\\\\"value\\\\\\\":91},{\\\\\\\"name\\\\\\\":\\\\\\\"重庆\\\\\\\",\\\\\\\"value\\\\\\\":91},{\\\\\\\"name\\\\\\\":\\\\\\\"云南\\\\\\\",\\\\\\\"value\\\\\\\":83},{\\\\\\\"name\\\\\\\":\\\\\\\"吉林\\\\\\\",\\\\\\\"value\\\\\\\":82},{\\\\\\\"name\\\\\\\":\\\\\\\"山西\\\\\\\",\\\\\\\"value\\\\\\\":81},{\\\\\\\"name\\\\\\\":\\\\\\\"陕西\\\\\\\",\\\\\\\"value\\\\\\\":80},{\\\\\\\"name\\\\\\\":\\\\\\\"辽宁\\\\\\\",\\\\\\\"value\\\\\\\":67},{\\\\\\\"name\\\\\\\":\\\\\\\"贵州\\\\\\\",\\\\\\\"value\\\\\\\":62},{\\\\\\\"name\\\\\\\":\\\\\\\"广西\\\\\\\",\\\\\\\"value\\\\\\\":59},{\\\\\\\"name\\\\\\\":\\\\\\\"甘肃\\\\\\\",\\\\\\\"value\\\\\\\":56},{\\\\\\\"name\\\\\\\":\\\\\\\"内蒙古\\\\\\\",\\\\\\\"value\\\\\\\":47},{\\\\\\\"name\\\\\\\":\\\\\\\"天津\\\\\\\",\\\\\\\"value\\\\\\\":42},{\\\\\\\"name\\\\\\\":\\\\\\\"上海\\\\\\\",\\\\\\\"value\\\\\\\":24},{\\\\\\\"name\\\\\\\":\\\\\\\"宁夏\\\\\\\",\\\\\\\"value\\\\\\\":18},{\\\\\\\"name\\\\\\\":\\\\\\\"海南\\\\\\\",\\\\\\\"value\\\\\\\":14},{\\\\\\\"name\\\\\\\":\\\\\\\"青海\\\\\\\",\\\\\\\"value\\\\\\\":10},{\\\\\\\"name\\\\\\\":\\\\\\\"西藏\\\\\\\",\\\\\\\"value\\\\\\\":9}]\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"仓库名称\\\",\\\"text\\\":\\\"仓库名称\\\",\\\"value\\\":\\\"warehouseName\\\"},{\\\"label\\\":\\\"仓库存量\\\",\\\"text\\\":\\\"仓库存量\\\",\\\"value\\\":\\\"warehouseCount\\\"},{\\\"label\\\":\\\"省份\\\",\\\"text\\\":\\\"省份\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"销售额\\\",\\\"text\\\":\\\"销售额\\\",\\\"value\\\":\\\"value\\\"}],\\\"seriesType\\\":[],\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"区域\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"jsConfig\\\":\\\"\\\",\\\"dataType\\\":2,\\\"query\\\":[],\\\"h\\\":50,\\\"dataSetApi\\\":\\\"https://apijeecgcom/mock/51/commerceSalesOperations?type=regionalOrders\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://apijeecgcom/mock/33/radar\\\",\\\"timeOut\\\":0,\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":452},\\\"dataSetId\\\":\\\"910695134387552256\\\",\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"drillDown\\\":false,\\\"area\\\":{\\\"markerColor\\\":\\\"#DDE330\\\",\\\"shadowBlur\\\":10,\\\"markerCount\\\":5,\\\"markerOpacity\\\":1,\\\"name\\\":[\\\"中国\\\"],\\\"scatterLabelShow\\\":false,\\\"shadowColor\\\":\\\"#DDE330\\\",\\\"value\\\":[\\\"china\\\"],\\\"markerType\\\":\\\"effectScatter\\\"},\\\"geo\\\":{\\\"top\\\":80,\\\"itemStyle\\\":{\\\"normal\\\":{\\\"shadowOffsetX\\\":0,\\\"borderColor\\\":\\\"#a9a9a9\\\",\\\"shadowOffsetY\\\":0,\\\"areaColor\\\":\\\"\\\",\\\"shadowBlur\\\":0,\\\"borderWidth\\\":1,\\\"shadowColor\\\":\\\"#80d9f8\\\"},\\\"emphasis\\\":{\\\"areaColor\\\":\\\"#fff59c\\\",\\\"borderWidth\\\":0}},\\\"zoom\\\":1,\\\"label\\\":{\\\"emphasis\\\":{\\\"color\\\":\\\"#fff\\\",\\\"show\\\":false}},\\\"roam\\\":true},\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"data\\\":[]},\\\"title\\\":{\\\"left\\\":10,\\\"show\\\":true,\\\"text\\\":\\\"\\\"},\\\"graphic\\\":[],\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"visualMap\\\":{\\\"min\\\":0,\\\"top\\\":\\\"bottom\\\",\\\"max\\\":200,\\\"left\\\":\\\"5%\\\",\\\"calculable\\\":true,\\\"show\\\":false,\\\"type\\\":\\\"continuous\\\",\\\"seriesIndex\\\":[1]}}}', 'admin', '2024-01-29 19:56:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911916295532363776', NULL, '910475721247866880', NULL, 'JCommonTable', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"各地区订单与仓库情况\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"https://apijeecgcom/mock/51/commerceSalesOperations?type=regionalOrders\\\",\\\"drillData\\\":[],\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":485},\\\"dataSetId\\\":\\\"910695134387552256\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"仓库名称\\\",\\\"text\\\":\\\"仓库名称\\\",\\\"value\\\":\\\"warehouseName\\\"},{\\\"label\\\":\\\"仓库存量\\\",\\\"text\\\":\\\"仓库存量\\\",\\\"value\\\":\\\"warehouseCount\\\"},{\\\"label\\\":\\\"省份\\\",\\\"text\\\":\\\"省份\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"销售额\\\",\\\"text\\\":\\\"销售额\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"seriesType\\\":[],\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":24,\\\"dataNum\\\":\\\"0\\\",\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"warehouseName\\\",\\\"title\\\":\\\"仓库名称\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"warehouseCount\\\",\\\"title\\\":\\\"仓库存量\\\"},{\\\"izShow\\\":\\\"N\\\",\\\"dataIndex\\\":\\\"name\\\",\\\"title\\\":\\\"省份\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"value\\\",\\\"title\\\":\\\"销售额\\\"}]}}', 'admin', '2024-01-29 19:56:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911916295557529600', NULL, '910475721247866880', NULL, 'JPie', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"季度目标完成\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://apijeecgcom/mock/51/commerceSalesOperations?type=quarterlyFinish\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://apijeecgcom/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":375},\\\"dataSetId\\\":\\\"910708293282349056\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"color\\\":[\\\"#1F70E0\\\",\\\"#F0F2FA\\\"],\\\"name\\\":\\\"Access From\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 05)\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"isRadius\\\":true,\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"季度目标完成\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-29 19:56:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911916295582695424', NULL, '910475721247866880', NULL, 'JNumber', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":1,\\\"dataSetName\\\":\\\"季度目标完成\\\",\\\"query\\\":[],\\\"h\\\":9,\\\"dataSetApi\\\":\\\"https://apijeecgcom/mock/51/commerceSalesOperations?type=quarterlyFinish\\\",\\\"drillData\\\":[],\\\"analysis\\\":{\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{  \\\\\\\"value\\\\\\\": 200}\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":177},\\\"dataSetId\\\":\\\"910708293282349056\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#1C6CDE\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":\\\"季度销售额（万）\\\"}}}', 'admin', '2024-01-29 19:56:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911916295607861248', NULL, '910475721247866880', NULL, 'JNumber', '{\\\"chartData\\\":\\\"{  \\\\\\\"value\\\\\\\": \\\\\\\"39\\\\\\\"}\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":188},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":9,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"analysis\\\":{\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#1C6CDE\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":\\\"同比增长（%）\\\"}}}', 'admin', '2024-01-29 19:56:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911916295633027072', NULL, '910475721247866880', NULL, 'JPie', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"品牌销售占比\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://apijeecgcom/mock/51/commerceSalesOperations?type=brandSales\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://apijeecgcom/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":447,\\\"height\\\":375},\\\"dataSetId\\\":\\\"910721009699045376\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"left\\\":47,\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\",\\\"t\\\":1},\\\"series\\\":[{\\\"data\\\":[],\\\"color\\\":[\\\"#0E52B0\\\",\\\"#118FF0\\\",\\\"#97CFFC\\\",\\\"#216DC4\\\",\\\"#60AEF7\\\"],\\\"name\\\":\\\"Access From\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 05)\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"isRadius\\\":true,\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"品牌销售占比\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-29 19:56:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911916295658192896', NULL, '910475721247866880', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"销售地区排行\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://apijeecgcom/mock/51/commerceSalesOperations?type=areaRanking\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://apijeecgcom/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":309},\\\"dataSetId\\\":\\\"910732622212677632\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"showBackground\\\":false,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"#51626E\\\"},\\\"itemStyle\\\":{\\\"color\\\":\\\"#428BEF\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"销售额（万元）\\\",\\\"show\\\":true,\\\"text\\\":\\\"销售地区排行\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-29 19:56:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911916295683358720', NULL, '910475721247866880', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"品牌销售占比\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://apijeecgcom/mock/51/commerceSalesOperations?type=brandSales\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://apijeecgcom/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":309},\\\"dataSetId\\\":\\\"910721009699045376\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#428BEF\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"销售额（元）\\\",\\\"show\\\":true,\\\"text\\\":\\\"品牌销售情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-29 19:56:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911916295712718848', NULL, '910475721247866880', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"物流订单接收\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://apijeecgcom/mock/51/commerceSalesOperations?type=logisticsOrder\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://apijeecgcom/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":430},\\\"dataSetId\\\":\\\"910737864308342784\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"type\\\":\\\"value\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":24,\\\"data\\\":[],\\\"showBackground\\\":false,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"#51626E\\\"},\\\"itemStyle\\\":{\\\"color\\\":\\\"#428BEF\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"接收订单（件）\\\",\\\"show\\\":true,\\\"text\\\":\\\"物流订单接收\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-29 19:56:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('911916295737884672', NULL, '910475721247866880', NULL, 'JLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"订单产生趋势\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://apijeecgcom/mock/51/commerceSalesOperations?type=generatingTrends\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://apijeecgcom/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":430},\\\"dataSetId\\\":\\\"910740127152128000\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#428BEF\\\"}],\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"lineType\\\":\\\"area\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\"},\\\"type\\\":\\\"line\\\"}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"订单数（单）\\\",\\\"left\\\":10,\\\"text\\\":\\\"订单产生趋势\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-29 19:56:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912194458363674624', NULL, '911856216581914624', NULL, 'JText', '{\\\"chartData\\\":\\\"产品销售数据仪表板\\\",\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"size\\\":{\\\"width\\\":1817,\\\"height\\\":78},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4570F2\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":36,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":8,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 14:21:56', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912194458397229056', NULL, '911856216581914624', NULL, 'JRing', '{\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"本月渠道销售\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/productSales?type=salesThisMonth\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":320},\\\"dataSetId\\\":\\\"911887596497977344\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#DBEAFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":54,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\" 华东区、华中区为主要渠道销售区域。\\\",\\\"top\\\":1,\\\"show\\\":true,\\\"text\\\":\\\"本月渠道销售\\\",\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 14:21:56', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912194458418200576', NULL, '911856216581914624', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"本月代理商销售排行\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/productSales?type=salesRanking\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":441},\\\"dataSetId\\\":\\\"911887691259887616\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#DBEAFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":3,\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"type\\\":\\\"value\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":69,\\\"left\\\":94,\\\"bottom\\\":58,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":17,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"本月代理商销售排行/元\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 14:21:56', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912194458439172096', NULL, '911856216581914624', NULL, 'JText', '{\\\"chartData\\\":\\\"本月销售额/元\\\",\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"size\\\":{\\\"width\\\":295,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":21},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 14:21:56', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912194458464337920', NULL, '911856216581914624', NULL, 'JText', '{\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"paramOption\\\":[],\\\"dataType\\\":1,\\\"dataSetName\\\":\\\"本月产品销售\\\",\\\"query\\\":[],\\\"h\\\":12,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/productSales?type=productSalesThisMonth\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"15,458,757\\\",\\\"size\\\":{\\\"width\\\":295,\\\"height\\\":45},\\\"dataSetId\\\":\\\"911889006916583424\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#DBEAFF\\\",\\\"seriesType\\\":[],\\\"w\\\":8,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4D71FE\\\",\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":16},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 14:21:56', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912194458489503744', NULL, '911856216581914624', NULL, 'JText', '{\\\"chartData\\\":\\\"月环比 -50%\\\",\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"size\\\":{\\\"width\\\":295,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#34C874\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":21},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 14:21:56', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912194458514669568', NULL, '911856216581914624', NULL, 'JText', '{\\\"chartData\\\":\\\"今日销售额/元\\\",\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"size\\\":{\\\"width\\\":295,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":18},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 14:21:56', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912194458535641088', NULL, '911856216581914624', NULL, 'JText', '{\\\"chartData\\\":\\\"657,554\\\",\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"size\\\":{\\\"width\\\":295,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4D71FE\\\",\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":19},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 14:21:56', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912194458556612608', NULL, '911856216581914624', NULL, 'JText', '{\\\"chartData\\\":\\\"日环比 -12%\\\",\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"size\\\":{\\\"width\\\":295,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#34C874\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":24},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 14:21:56', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912194458577584128', NULL, '911856216581914624', NULL, 'JText', '{\\\"chartData\\\":\\\"今年目标销售额达成率\\\",\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"size\\\":{\\\"width\\\":295,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":16},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 14:21:56', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912194458602749952', NULL, '911856216581914624', NULL, 'JText', '{\\\"chartData\\\":\\\"42%\\\",\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"size\\\":{\\\"width\\\":295,\\\"height\\\":100},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4D71FE\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":24,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 14:21:56', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912194458665664512', NULL, '911856216581914624', NULL, 'JLine', '{\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"近七天销售额趋势\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/productSales?type=salesTrend\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":904,\\\"height\\\":287},\\\"dataSetId\\\":\\\"911888632709169152\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#DBEAFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"日销售额（元）\\\",\\\"left\\\":10,\\\"text\\\":\\\"近七天销售额趋势\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 14:21:56', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912194458686636032', NULL, '911856216581914624', NULL, 'JStackBar', '{\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"type\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"本月重点城市的重点产品销售额\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/productSales?type=productSalesRevenue\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":904,\\\"height\\\":309},\\\"dataSetId\\\":\\\"911888715248877568\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"},{\\\"label\\\":\\\"type\\\",\\\"text\\\":\\\"type\\\",\\\"value\\\":\\\"type\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#DBEAFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#67BBFF\\\"},{\\\"color\\\":\\\"#9982FD\\\"},{\\\"color\\\":\\\"#62DDCC\\\"}],\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"本月重点城市的重点产品销售额/元\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontSize\\\":16}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 14:21:56', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912194458707607552', NULL, '911856216581914624', NULL, 'JRing', '{\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"本月产品销售\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/productSales?type=productSalesThisMonth\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":523,\\\"height\\\":342},\\\"dataSetId\\\":\\\"911889006916583424\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#DBEAFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":55,\\\"left\\\":47,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\"},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"t\\\":10},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"show\\\":true,\\\"text\\\":\\\" 产品3为主推产品产品2为近期上线产品。\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontSize\\\":14,\\\"fontWeight\\\":\\\"bold\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 14:21:56', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912194458736967680', NULL, '911856216581914624', NULL, 'JText', '{\\\"chartData\\\":\\\"本月产品销售\\\",\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"size\\\":{\\\"width\\\":523,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":8,\\\"marginLeft\\\":21},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 14:21:56', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912194458757939200', NULL, '911856216581914624', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"本月产品小类销售排行\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/productSales?type=rankingCategorySales\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":523,\\\"height\\\":364},\\\"dataSetId\\\":\\\"911889086163763200\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#DBEAFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"type\\\":\\\"value\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":44,\\\"bottom\\\":62,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":16,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"show\\\":true,\\\"text\\\":\\\" 本月产品小类销售排行/元\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontSize\\\":14},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 14:21:56', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912281374207557632', NULL, '910475721247866880', NULL, 'JText', '{\\\"chartData\\\":\\\"某电商公司销售运营看板\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1817,\\\"height\\\":78},\\\"background\\\":\\\"#0774F0\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":23,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:07:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286338468331520', NULL, '910394028067438592', NULL, 'JText', '{\\\"chartData\\\":\\\"库存管理可视化大屏\\\",\\\"borderColor\\\":\\\"#059DA8\\\",\\\"size\\\":{\\\"width\\\":1817,\\\"height\\\":78},\\\"background\\\":\\\"#059DA8\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:27:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286338501885952', NULL, '910394028067438592', NULL, 'JGrowCard', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"库存管理-卡片\\\",\\\"query\\\":[],\\\"h\\\":19,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryManagement\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"title\\\\\\\": \\\\\\\"访问数\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-qianbao\\\\\\\",    \\\\\\\"value\\\\\\\": 2000,    \\\\\\\"total\\\\\\\": 120000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"color\\\\\\\": \\\\\\\"green\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"月\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"成交额\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-youhuiquan\\\\\\\",    \\\\\\\"value\\\\\\\": 20000,    \\\\\\\"total\\\\\\\": 500000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"color\\\\\\\": \\\\\\\"blue\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"月\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"下载数\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-tupian\\\\\\\",    \\\\\\\"value\\\\\\\": 8000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"total\\\\\\\": 120000,    \\\\\\\"color\\\\\\\": \\\\\\\"orange\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"周\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"成交数\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-jifen\\\\\\\",    \\\\\\\"value\\\\\\\": 5000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"total\\\\\\\": 50000,    \\\\\\\"color\\\\\\\": \\\\\\\"purple\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"年\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":1817,\\\"height\\\":331},\\\"dataSetId\\\":\\\"910406419257802752\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"icon\\\",\\\"text\\\":\\\"icon\\\",\\\"value\\\":\\\"icon\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"},{\\\"label\\\":\\\"action\\\",\\\"text\\\":\\\"action\\\",\\\"value\\\":\\\"action\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":20},\\\"body\\\":{\\\"horizontal\\\":7,\\\"color\\\":\\\"#000000\\\",\\\"vertical\\\":5,\\\"span\\\":8},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"统计卡片\\\"}}}', 'admin', '2024-01-30 20:27:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286338527051776', NULL, '910394028067438592', NULL, 'JText', '{\\\"chartData\\\":\\\"AIR 库存情况\\\",\\\"borderColor\\\":\\\"#059DA8\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":45},\\\"background\\\":\\\"#059DA8\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":7,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:27:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286338543828992', NULL, '910394028067438592', NULL, 'JList', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"air库存情况\\\",\\\"query\\\":[],\\\"h\\\":24,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryStatus?type=air\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"title\\\\\\\": \\\\\\\"通知一\\\\\\\",    \\\\\\\"date\\\\\\\": \\\\\\\"10000\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"通知二\\\\\\\",    \\\\\\\"date\\\\\\\": \\\\\\\"20000\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"通知三\\\\\\\",    \\\\\\\"date\\\\\\\": \\\\\\\"30000\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"通知四\\\\\\\",    \\\\\\\"date\\\\\\\": \\\\\\\"40000\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":111},\\\"dataSetId\\\":\\\"910419343896526848\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"horizontal\\\",\\\"showTitlePrefix\\\":false,\\\"titleFontSize\\\":15,\\\"showTimePrefix\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"}}}', 'admin', '2024-01-30 20:27:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286338564800512', NULL, '910394028067438592', NULL, 'JText', '{\\\"chartData\\\":\\\"LITE 库存情况\\\",\\\"borderColor\\\":\\\"#059DA8\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":45},\\\"background\\\":\\\"#059DA8\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":7,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:27:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286338585772032', NULL, '910394028067438592', NULL, 'JList', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"lite库存情况\\\",\\\"query\\\":[],\\\"h\\\":24,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryStatus?type=lite\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"通知一\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-9 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知二\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-8 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知三\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-7 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知四\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-4 14:20:21\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":111},\\\"dataSetId\\\":\\\"910423953398874112\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"horizontal\\\",\\\"showTitlePrefix\\\":false,\\\"titleFontSize\\\":15,\\\"showTimePrefix\\\":false}}', 'admin', '2024-01-30 20:27:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286338602549248', NULL, '910394028067438592', NULL, 'JText', '{\\\"chartData\\\":\\\"SUPER 库存情况\\\",\\\"borderColor\\\":\\\"#059DA8\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":45},\\\"background\\\":\\\"#059DA8\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":7,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:27:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286338615132160', NULL, '910394028067438592', NULL, 'JList', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"super库存情况\\\",\\\"query\\\":[],\\\"h\\\":24,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryStatus?type=super\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"通知一\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-9 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知二\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-8 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知三\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-7 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知四\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-4 14:20:21\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":111},\\\"dataSetId\\\":\\\"910425301976662016\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"horizontal\\\",\\\"showTitlePrefix\\\":false,\\\"titleFontSize\\\":15,\\\"showTimePrefix\\\":false}}', 'admin', '2024-01-30 20:27:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286338640297984', NULL, '910394028067438592', NULL, 'JText', '{\\\"chartData\\\":\\\"ULTRA 库存情况\\\",\\\"borderColor\\\":\\\"#059DA8\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":45},\\\"background\\\":\\\"#059DA8\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":7,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:27:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286338661269504', NULL, '910394028067438592', NULL, 'JList', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"ultra库存情况\\\",\\\"query\\\":[],\\\"h\\\":24,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryStatus?type=ultra\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"通知一\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-9 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知二\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-8 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知三\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-7 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知四\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-4 14:20:21\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":111},\\\"dataSetId\\\":\\\"910427052079366144\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"horizontal\\\",\\\"showTitlePrefix\\\":false,\\\"titleFontSize\\\":15,\\\"showTimePrefix\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"}}}', 'admin', '2024-01-30 20:27:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286338678046720', NULL, '910394028067438592', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"产品库存占比情况\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=storkProportion\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":751,\\\"height\\\":210},\\\"dataSetId\\\":\\\"910430104345690112\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":76,\\\"bottom\\\":67,\\\"show\\\":false,\\\"right\\\":3},\\\"series\\\":[{\\\"barWidth\\\":39,\\\"data\\\":[],\\\"color\\\":[\\\"#207B85\\\",\\\"#2C5E5A\\\",\\\"#36756E\\\"],\\\"itemStyle\\\":{\\\"color\\\":\\\"#009BA7\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"产品库存占比情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:27:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286338699018240', NULL, '910394028067438592', NULL, 'JPie', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"仓库状态情况\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=warehouseStatus\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":675,\\\"height\\\":210},\\\"dataSetId\\\":\\\"910431120222896128\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"color\\\":[\\\"#059DA8\\\",\\\"#62A69C\\\",\\\"#489C8F\\\"],\\\"name\\\":\\\"Access From\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"仓库状态情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:27:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286338711601152', NULL, '910394028067438592', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"当月出库情况\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=outbound\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":751,\\\"height\\\":232},\\\"dataSetId\\\":\\\"910435726206222336\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":48,\\\"left\\\":62,\\\"bottom\\\":62,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"color\\\":[\\\"#075A63\\\",\\\"#285754\\\",\\\"#37706A\\\",\\\"#63968F\\\",\\\"#09A7B3\\\"],\\\"itemStyle\\\":{\\\"color\\\":\\\"#059DA8\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"当月出库情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:27:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286338728378368', NULL, '910394028067438592', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"当月入库情况\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=warehousing\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":675,\\\"height\\\":221},\\\"dataSetId\\\":\\\"910441161197928448\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":45,\\\"bottom\\\":58,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#059DA8\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"当月入库情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:27:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286338745155584', NULL, '910394028067438592', NULL, 'JMultipleBar', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"type\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"产品库存覆盖率情况\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=coverage\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":751,\\\"height\\\":232},\\\"dataSetId\\\":\\\"910442989620871168\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"type\\\",\\\"text\\\":\\\"type\\\",\\\"value\\\":\\\"type\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#FFFFFF\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"type\\\":\\\"value\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":94,\\\"bottom\\\":65},\\\"series\\\":[{\\\"color\\\":[\\\"#05A2AD\\\",\\\"#67ABA1\\\",\\\"#4AA194\\\"],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\"}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"产品库存覆盖率情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:27:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286338770321408', NULL, '910394028067438592', NULL, 'JMultipleBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"type\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"产品库龄分布情况\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=stockAge\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":675,\\\"height\\\":243},\\\"dataSetId\\\":\\\"910447275230674944\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"type\\\",\\\"text\\\":\\\"type\\\",\\\"value\\\":\\\"type\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":54,\\\"bottom\\\":54},\\\"series\\\":[{\\\"color\\\":[\\\"#09A7B3\\\",\\\"#499E91\\\",\\\"#03A2AD\\\",\\\"#68F7D8\\\"]}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"产品库龄分布情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:27:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286338791292928', NULL, '910394028067438592', NULL, 'JCommonTable', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"产品库存状态监控\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=monitor\\\",\\\"drillData\\\":[],\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",    \\\\\\\"value\\\\\\\": 50  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",    \\\\\\\"value\\\\\\\": 200  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",    \\\\\\\"value\\\\\\\": 300  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",    \\\\\\\"value\\\\\\\": 400  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",    \\\\\\\"value\\\\\\\": 50  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",    \\\\\\\"value\\\\\\\": 120  }]\\\",\\\"size\\\":{\\\"width\\\":1817,\\\"height\\\":485},\\\"dataSetId\\\":\\\"910455640270880768\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"仓库\\\",\\\"text\\\":\\\"仓库\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"系列\\\",\\\"text\\\":\\\"系列\\\",\\\"value\\\":\\\"series\\\"},{\\\"label\\\":\\\"市场名\\\",\\\"text\\\":\\\"市场名\\\",\\\"value\\\":\\\"marketName\\\"},{\\\"label\\\":\\\"机型\\\",\\\"text\\\":\\\"机型\\\",\\\"value\\\":\\\"model\\\"},{\\\"label\\\":\\\"产品状态\\\",\\\"text\\\":\\\"产品状态\\\",\\\"value\\\":\\\"productStatus\\\"},{\\\"label\\\":\\\"当前库存\\\",\\\"text\\\":\\\"当前库存\\\",\\\"value\\\":\\\"inventory\\\"},{\\\"label\\\":\\\"库存状态\\\",\\\"text\\\":\\\"库存状态\\\",\\\"value\\\":\\\"inventoryStatus\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"seriesType\\\":[],\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"name\\\",\\\"title\\\":\\\"仓库\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"series\\\",\\\"title\\\":\\\"系列\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"marketName\\\",\\\"title\\\":\\\"市场名\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"model\\\",\\\"title\\\":\\\"机型\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"productStatus\\\",\\\"title\\\":\\\"产品状态\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"inventory\\\",\\\"title\\\":\\\"当前库存\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"inventoryStatus\\\",\\\"title\\\":\\\"库存状态\\\"}],\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"}}}', 'admin', '2024-01-30 20:27:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286986744152064', NULL, '910744177604083712', NULL, 'JText', '{\\\"chartData\\\":\\\"小 区 消 防 巡 检 状 态\\\",\\\"borderColor\\\":\\\"#DB771F\\\",\\\"size\\\":{\\\"width\\\":1817,\\\"height\\\":78},\\\"background\\\":\\\"#DB771F\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":36,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:29:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286986777706496', NULL, '910744177604083712', NULL, 'JText', '{\\\"chartData\\\":\\\"区域基本情况\\\",\\\"borderColor\\\":\\\"#DB771F\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":56},\\\"background\\\":\\\"#DB771F\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":37},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:29:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286986798678016', NULL, '910744177604083712', NULL, 'JList', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"区域基本情况\\\",\\\"query\\\":[],\\\"h\\\":24,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=regionBasicInformation\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"通知一\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-9 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知二\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-8 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知三\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-7 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知四\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-4 14:20:21\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":177},\\\"dataSetId\\\":\\\"910750488542625792\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"horizontal\\\",\\\"showTitlePrefix\\\":true,\\\"titleFontSize\\\":18,\\\"showTimePrefix\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"}}}', 'admin', '2024-01-30 20:29:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286986819649536', NULL, '910744177604083712', NULL, 'JText', '{\\\"chartData\\\":\\\"设备总数\\\",\\\"borderColor\\\":\\\"#DB771F\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":67},\\\"background\\\":\\\"#DB771F\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":16,\\\"marginLeft\\\":34},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:29:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286986844815360', NULL, '910744177604083712', NULL, 'JNumber', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"正常设备\\\",\\\"h\\\":9,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=normalDevice\\\",\\\"analysis\\\":{\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{  \\\\\\\"value\\\\\\\": \\\\\\\"15990\\\\\\\"}\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":122},\\\"dataSetId\\\":\\\"910754028661030912\\\",\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":\\\"正常设备\\\"}}}', 'admin', '2024-01-30 20:29:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286986869981184', NULL, '910744177604083712', NULL, 'JNumber', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"异常设备\\\",\\\"query\\\":[],\\\"h\\\":9,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=abnormalDevice\\\",\\\"drillData\\\":[],\\\"analysis\\\":{\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\\\\"value\\\\\\\":\\\\\\\"1024\\\\\\\"}\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":122},\\\"dataSetId\\\":\\\"910754465934000128\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":\\\"异常设备\\\"}}}', 'admin', '2024-01-30 20:29:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286986890952704', NULL, '910744177604083712', NULL, 'JText', '{\\\"chartData\\\":\\\"设备异常明细\\\",\\\"borderColor\\\":\\\"#DB771F\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":67},\\\"background\\\":\\\"#DB771F\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":15,\\\"marginLeft\\\":32},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:29:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286986916118528', NULL, '910744177604083712', NULL, 'JCommonTable', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"设备异常明细\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=equipmentDetails\\\",\\\"drillData\\\":[],\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":551},\\\"dataSetId\\\":\\\"910759432656830464\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"小区名称\\\",\\\"text\\\":\\\"小区名称\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"设备名称\\\",\\\"text\\\":\\\"设备名称\\\",\\\"value\\\":\\\"deviceName\\\"},{\\\"label\\\":\\\"设备地址\\\",\\\"text\\\":\\\"设备地址\\\",\\\"value\\\":\\\"deviceAddress\\\"},{\\\"label\\\":\\\"设备状态\\\",\\\"text\\\":\\\"设备状态\\\",\\\"value\\\":\\\"deviceStatus\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"name\\\",\\\"title\\\":\\\"小区名称\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"deviceName\\\",\\\"title\\\":\\\"设备名称\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"deviceAddress\\\",\\\"title\\\":\\\"设备地址\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"deviceStatus\\\",\\\"title\\\":\\\"设备状态\\\"}],\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"}}}', 'admin', '2024-01-30 20:29:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286986945478656', NULL, '910744177604083712', NULL, 'JBubbleMap', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"commonOption\\\":{\\\"barSize\\\":10,\\\"gradientColor\\\":false,\\\"breadcrumb\\\":{\\\"drillDown\\\":false,\\\"textColor\\\":\\\"#000000\\\"},\\\"areaColor\\\":{\\\"color1\\\":\\\"#f7f7f7\\\",\\\"color2\\\":\\\"#fcc02e\\\"},\\\"barColor\\\":\\\"#fff176\\\",\\\"barColor2\\\":\\\"#fcc02e\\\",\\\"inRange\\\":{\\\"color\\\":[\\\"#04387b\\\",\\\"#467bc0\\\"]}},\\\"paramOption\\\":[],\\\"dataSetName\\\":\\\"小区地图分布\\\",\\\"activeKey\\\":1,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"廊坊\\\\\\\",    \\\\\\\"value\\\\\\\": 199  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"新疆\\\\\\\",    \\\\\\\"value\\\\\\\": 180  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"河南\\\\\\\",    \\\\\\\"value\\\\\\\": 137  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"四川\\\\\\\",    \\\\\\\"value\\\\\\\": 125  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"黑龙江\\\\\\\",    \\\\\\\"value\\\\\\\": 123  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"广东\\\\\\\",    \\\\\\\"value\\\\\\\": 123  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"山东\\\\\\\",    \\\\\\\"value\\\\\\\": 119  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"福建\\\\\\\",    \\\\\\\"value\\\\\\\": 116  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"湖北\\\\\\\",    \\\\\\\"value\\\\\\\": 116  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"浙江\\\\\\\",    \\\\\\\"value\\\\\\\": 114  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"湖南\\\\\\\",    \\\\\\\"value\\\\\\\": 114  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"安徽\\\\\\\",    \\\\\\\"value\\\\\\\": 109  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"河北\\\\\\\",    \\\\\\\"value\\\\\\\": 102  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"江苏\\\\\\\",    \\\\\\\"value\\\\\\\": 92  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"江西\\\\\\\",    \\\\\\\"value\\\\\\\": 91  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"重庆\\\\\\\",    \\\\\\\"value\\\\\\\": 91  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"云南\\\\\\\",    \\\\\\\"value\\\\\\\": 83  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"吉林\\\\\\\",    \\\\\\\"value\\\\\\\": 82  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"山西\\\\\\\",    \\\\\\\"value\\\\\\\": 81  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"陕西\\\\\\\",    \\\\\\\"value\\\\\\\": 80  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"辽宁\\\\\\\",    \\\\\\\"value\\\\\\\": 67  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"贵州\\\\\\\",    \\\\\\\"value\\\\\\\": 62  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"广西\\\\\\\",    \\\\\\\"value\\\\\\\": 59  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"甘肃\\\\\\\",    \\\\\\\"value\\\\\\\": 56  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"内蒙古\\\\\\\",    \\\\\\\"value\\\\\\\": 47  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"天津\\\\\\\",    \\\\\\\"value\\\\\\\": 42  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"上海\\\\\\\",    \\\\\\\"value\\\\\\\": 24  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"宁夏\\\\\\\",    \\\\\\\"value\\\\\\\": 18  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"海南\\\\\\\",    \\\\\\\"value\\\\\\\": 14  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"青海\\\\\\\",    \\\\\\\"value\\\\\\\": 10  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"西藏\\\\\\\",    \\\\\\\"value\\\\\\\": 9  }]\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"seriesType\\\":[],\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"区域\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"jsConfig\\\":\\\"\\\",\\\"dataType\\\":2,\\\"query\\\":[],\\\"h\\\":50,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=residentialDistributionMap\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/radar\\\",\\\"timeOut\\\":0,\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":342},\\\"dataSetId\\\":\\\"910765056765509632\\\",\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"drillDown\\\":false,\\\"area\\\":{\\\"markerColor\\\":\\\"#DDE330\\\",\\\"shadowBlur\\\":10,\\\"markerCount\\\":5,\\\"markerOpacity\\\":1,\\\"name\\\":[\\\"河北省\\\"],\\\"scatterLabelShow\\\":false,\\\"shadowColor\\\":\\\"#DDE330\\\",\\\"value\\\":[\\\"13\\\"],\\\"markerType\\\":\\\"effectScatter\\\"},\\\"geo\\\":{\\\"top\\\":27,\\\"aspectScale\\\":0.92,\\\"itemStyle\\\":{\\\"normal\\\":{\\\"shadowOffsetX\\\":0,\\\"borderColor\\\":\\\"#a9a9a9\\\",\\\"shadowOffsetY\\\":0,\\\"areaColor\\\":\\\"\\\",\\\"shadowBlur\\\":0,\\\"borderWidth\\\":1,\\\"shadowColor\\\":\\\"#80d9f8\\\"},\\\"emphasis\\\":{\\\"areaColor\\\":\\\"#fff59c\\\",\\\"borderWidth\\\":0}},\\\"zoom\\\":1,\\\"label\\\":{\\\"emphasis\\\":{\\\"color\\\":\\\"#fff\\\",\\\"show\\\":false}},\\\"roam\\\":true},\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"data\\\":[]},\\\"title\\\":{\\\"left\\\":10,\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"graphic\\\":[],\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"visualMap\\\":{\\\"min\\\":0,\\\"top\\\":\\\"bottom\\\",\\\"max\\\":200,\\\"left\\\":\\\"5%\\\",\\\"calculable\\\":true,\\\"show\\\":false,\\\"type\\\":\\\"continuous\\\",\\\"seriesIndex\\\":[1]}}}', 'admin', '2024-01-30 20:29:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286986966450176', NULL, '910744177604083712', NULL, 'JText', '{\\\"chartData\\\":\\\"小区地图分布\\\",\\\"borderColor\\\":\\\"#DB771F\\\",\\\"size\\\":{\\\"width\\\":1208,\\\"height\\\":56},\\\"background\\\":\\\"#DB771F\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:29:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286987025170432', NULL, '910744177604083712', NULL, 'JCommonTable', '{\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"小区分布地图表格\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=residentialDistributionTable\\\",\\\"drillData\\\":[],\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":342},\\\"dataSetId\\\":\\\"910773111884398592\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"区域名称\\\",\\\"text\\\":\\\"区域名称\\\",\\\"value\\\":\\\"areaName\\\"},{\\\"label\\\":\\\"小区数量\\\",\\\"text\\\":\\\"小区数量\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"seriesType\\\":[],\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"areaName\\\",\\\"title\\\":\\\"区域名称\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"value\\\",\\\"title\\\":\\\"小区数量\\\"}],\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}}}}', 'admin', '2024-01-30 20:29:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286987054530560', NULL, '910744177604083712', NULL, 'JPie', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"室外消火栓泵\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=deviceCountProportion\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":364},\\\"dataSetId\\\":\\\"910776816075587584\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"color\\\":[\\\"#3BB1E3\\\",\\\"#DB771F\\\",\\\"#B6C5D1\\\"],\\\"name\\\":\\\"Access From\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"设备类型数量占比\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:29:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286987092279296', NULL, '910744177604083712', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"区域设备数量\\\\t\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=areaDeviceCount\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":364},\\\"dataSetId\\\":\\\"910790230315417600\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"type\\\":\\\"value\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":21,\\\"data\\\":[],\\\"color\\\":[\\\"#3BB1E3\\\",\\\"#DB771F\\\",\\\"#B6C5D1\\\"],\\\"itemStyle\\\":{\\\"color\\\":\\\"#3BB1E3\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"区域设备数量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:29:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286987117445120', NULL, '910744177604083712', NULL, 'JLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"巡检任务数\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=inspectionTasksCount\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":353},\\\"dataSetId\\\":\\\"910794755508060160\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#38B4EA\\\"}],\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"lineType\\\":\\\"area\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\"},\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":10,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:29:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286987138416640', NULL, '910744177604083712', NULL, 'JCommonTable', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"巡检任务数表格\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=inspectionTasksTable\\\",\\\"drillData\\\":[],\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":353},\\\"dataSetId\\\":\\\"910797586147360768\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"检查时间\\\",\\\"text\\\":\\\"检查时间\\\",\\\"value\\\":\\\"inspectTime\\\"},{\\\"label\\\":\\\"设备名称\\\",\\\"text\\\":\\\"设备名称\\\",\\\"value\\\":\\\"deviceName\\\"},{\\\"label\\\":\\\"设备地址\\\",\\\"text\\\":\\\"设备地址\\\",\\\"value\\\":\\\"deviceAddress\\\"},{\\\"label\\\":\\\"检查人\\\",\\\"text\\\":\\\"检查人\\\",\\\"value\\\":\\\"inspected\\\"},{\\\"label\\\":\\\"检查内容\\\",\\\"text\\\":\\\"检查内容\\\",\\\"value\\\":\\\"content\\\"},{\\\"label\\\":\\\"巡查结果\\\",\\\"text\\\":\\\"巡查结果\\\",\\\"value\\\":\\\"inspectResult\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"inspectTime\\\",\\\"title\\\":\\\"检查时间\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"deviceName\\\",\\\"title\\\":\\\"设备名称\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"deviceAddress\\\",\\\"title\\\":\\\"设备地址\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"inspected\\\",\\\"title\\\":\\\"检查人\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"content\\\",\\\"title\\\":\\\"检查内容\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"inspectResult\\\",\\\"title\\\":\\\"巡查结果\\\"}]}}', 'admin', '2024-01-30 20:29:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912286987163582464', NULL, '910744177604083712', NULL, 'JText', '{\\\"chartData\\\":\\\"巡检任务数\\\",\\\"borderColor\\\":\\\"#DB771F\\\",\\\"size\\\":{\\\"width\\\":1208,\\\"height\\\":67},\\\"background\\\":\\\"#DB771F\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":12,\\\"marginLeft\\\":0},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-30 20:29:37', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577433139986432', NULL, '910394028067438592', NULL, 'JText', '{\\\"chartData\\\":\\\"库存管理可视化大屏\\\",\\\"borderColor\\\":\\\"#059DA8\\\",\\\"size\\\":{\\\"width\\\":1817,\\\"height\\\":78},\\\"background\\\":\\\"#059DA8\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:43:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577433169346560', NULL, '910394028067438592', NULL, 'JGrowCard', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"库存管理-卡片\\\",\\\"query\\\":[],\\\"h\\\":19,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryManagement\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"title\\\\\\\": \\\\\\\"访问数\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-qianbao\\\\\\\",    \\\\\\\"value\\\\\\\": 2000,    \\\\\\\"total\\\\\\\": 120000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"color\\\\\\\": \\\\\\\"green\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"月\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"成交额\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-youhuiquan\\\\\\\",    \\\\\\\"value\\\\\\\": 20000,    \\\\\\\"total\\\\\\\": 500000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"color\\\\\\\": \\\\\\\"blue\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"月\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"下载数\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-tupian\\\\\\\",    \\\\\\\"value\\\\\\\": 8000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"total\\\\\\\": 120000,    \\\\\\\"color\\\\\\\": \\\\\\\"orange\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"周\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"成交数\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-jifen\\\\\\\",    \\\\\\\"value\\\\\\\": 5000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"total\\\\\\\": 50000,    \\\\\\\"color\\\\\\\": \\\\\\\"purple\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"年\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":1817,\\\"height\\\":331},\\\"dataSetId\\\":\\\"910406419257802752\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"icon\\\",\\\"text\\\":\\\"icon\\\",\\\"value\\\":\\\"icon\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"},{\\\"label\\\":\\\"action\\\",\\\"text\\\":\\\"action\\\",\\\"value\\\":\\\"action\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":20},\\\"body\\\":{\\\"horizontal\\\":7,\\\"color\\\":\\\"#000000\\\",\\\"vertical\\\":5,\\\"span\\\":8},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"统计卡片\\\"}}}', 'admin', '2024-01-31 15:43:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577433190318080', NULL, '910394028067438592', NULL, 'JText', '{\\\"chartData\\\":\\\"AIR 库存情况\\\",\\\"borderColor\\\":\\\"#059DA8\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":45},\\\"background\\\":\\\"#059DA8\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":7,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:43:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577433207095296', NULL, '910394028067438592', NULL, 'JList', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"air库存情况\\\",\\\"query\\\":[],\\\"h\\\":24,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryStatus?type=air\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"title\\\\\\\": \\\\\\\"通知一\\\\\\\",    \\\\\\\"date\\\\\\\": \\\\\\\"10000\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"通知二\\\\\\\",    \\\\\\\"date\\\\\\\": \\\\\\\"20000\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"通知三\\\\\\\",    \\\\\\\"date\\\\\\\": \\\\\\\"30000\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"通知四\\\\\\\",    \\\\\\\"date\\\\\\\": \\\\\\\"40000\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":111},\\\"dataSetId\\\":\\\"910419343896526848\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"horizontal\\\",\\\"showTitlePrefix\\\":false,\\\"titleFontSize\\\":15,\\\"showTimePrefix\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"}}}', 'admin', '2024-01-31 15:43:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577433228066816', NULL, '910394028067438592', NULL, 'JText', '{\\\"chartData\\\":\\\"LITE 库存情况\\\",\\\"borderColor\\\":\\\"#059DA8\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":45},\\\"background\\\":\\\"#059DA8\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":7,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:43:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577433249038336', NULL, '910394028067438592', NULL, 'JList', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"lite库存情况\\\",\\\"query\\\":[],\\\"h\\\":24,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryStatus?type=lite\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"通知一\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-9 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知二\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-8 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知三\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-7 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知四\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-4 14:20:21\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":111},\\\"dataSetId\\\":\\\"910423953398874112\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"horizontal\\\",\\\"showTitlePrefix\\\":false,\\\"titleFontSize\\\":15,\\\"showTimePrefix\\\":false}}', 'admin', '2024-01-31 15:43:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577433274204160', NULL, '910394028067438592', NULL, 'JText', '{\\\"chartData\\\":\\\"SUPER 库存情况\\\",\\\"borderColor\\\":\\\"#059DA8\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":45},\\\"background\\\":\\\"#059DA8\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":7,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:43:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577433295175680', NULL, '910394028067438592', NULL, 'JList', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"super库存情况\\\",\\\"query\\\":[],\\\"h\\\":24,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryStatus?type=super\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"通知一\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-9 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知二\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-8 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知三\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-7 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知四\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-4 14:20:21\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":111},\\\"dataSetId\\\":\\\"910425301976662016\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"horizontal\\\",\\\"showTitlePrefix\\\":false,\\\"titleFontSize\\\":15,\\\"showTimePrefix\\\":false}}', 'admin', '2024-01-31 15:43:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577433316147200', NULL, '910394028067438592', NULL, 'JText', '{\\\"chartData\\\":\\\"ULTRA 库存情况\\\",\\\"borderColor\\\":\\\"#059DA8\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":45},\\\"background\\\":\\\"#059DA8\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":7,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:43:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577433337118720', NULL, '910394028067438592', NULL, 'JList', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"ultra库存情况\\\",\\\"query\\\":[],\\\"h\\\":24,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryStatus?type=ultra\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"通知一\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-9 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知二\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-8 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知三\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-7 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知四\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-4 14:20:21\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":111},\\\"dataSetId\\\":\\\"910427052079366144\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"horizontal\\\",\\\"showTitlePrefix\\\":false,\\\"titleFontSize\\\":15,\\\"showTimePrefix\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"}}}', 'admin', '2024-01-31 15:43:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577433366478848', NULL, '910394028067438592', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"产品库存占比情况\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=storkProportion\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":751,\\\"height\\\":210},\\\"dataSetId\\\":\\\"910430104345690112\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":0,\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":76,\\\"bottom\\\":67,\\\"show\\\":false,\\\"right\\\":3},\\\"series\\\":[{\\\"barWidth\\\":39,\\\"data\\\":[],\\\"color\\\":[\\\"#207B85\\\",\\\"#2C5E5A\\\",\\\"#36756E\\\"],\\\"itemStyle\\\":{\\\"color\\\":\\\"#009BA7\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"产品库存占比情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:43:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577433387450368', NULL, '910394028067438592', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"当月出库情况\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=outbound\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":751,\\\"height\\\":232},\\\"dataSetId\\\":\\\"910435726206222336\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":48,\\\"left\\\":62,\\\"bottom\\\":62,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"color\\\":[\\\"#075A63\\\",\\\"#285754\\\",\\\"#37706A\\\",\\\"#63968F\\\",\\\"#09A7B3\\\"],\\\"itemStyle\\\":{\\\"color\\\":\\\"#059DA8\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"当月出库情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:43:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577433408421888', NULL, '910394028067438592', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"当月入库情况\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=warehousing\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":675,\\\"height\\\":232},\\\"dataSetId\\\":\\\"910441161197928448\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":45,\\\"bottom\\\":58,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#059DA8\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"当月入库情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:43:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577433429393408', NULL, '910394028067438592', NULL, 'JMultipleBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"type\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"产品库龄分布情况\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=stockAge\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":675,\\\"height\\\":232},\\\"dataSetId\\\":\\\"910447275230674944\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"type\\\",\\\"text\\\":\\\"type\\\",\\\"value\\\":\\\"type\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":54,\\\"bottom\\\":54},\\\"series\\\":[{\\\"color\\\":[\\\"#09A7B3\\\",\\\"#499E91\\\",\\\"#03A2AD\\\",\\\"#68F7D8\\\"]}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"产品库龄分布情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:43:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577433450364928', NULL, '910394028067438592', NULL, 'JCommonTable', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"产品库存状态监控\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=monitor\\\",\\\"drillData\\\":[],\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",    \\\\\\\"value\\\\\\\": 50  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",    \\\\\\\"value\\\\\\\": 200  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",    \\\\\\\"value\\\\\\\": 300  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",    \\\\\\\"value\\\\\\\": 400  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",    \\\\\\\"value\\\\\\\": 50  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",    \\\\\\\"value\\\\\\\": 120  }]\\\",\\\"size\\\":{\\\"width\\\":1817,\\\"height\\\":485},\\\"dataSetId\\\":\\\"910455640270880768\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"仓库\\\",\\\"text\\\":\\\"仓库\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"系列\\\",\\\"text\\\":\\\"系列\\\",\\\"value\\\":\\\"series\\\"},{\\\"label\\\":\\\"市场名\\\",\\\"text\\\":\\\"市场名\\\",\\\"value\\\":\\\"marketName\\\"},{\\\"label\\\":\\\"机型\\\",\\\"text\\\":\\\"机型\\\",\\\"value\\\":\\\"model\\\"},{\\\"label\\\":\\\"产品状态\\\",\\\"text\\\":\\\"产品状态\\\",\\\"value\\\":\\\"productStatus\\\"},{\\\"label\\\":\\\"当前库存\\\",\\\"text\\\":\\\"当前库存\\\",\\\"value\\\":\\\"inventory\\\"},{\\\"label\\\":\\\"库存状态\\\",\\\"text\\\":\\\"库存状态\\\",\\\"value\\\":\\\"inventoryStatus\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"seriesType\\\":[],\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"name\\\",\\\"title\\\":\\\"仓库\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"series\\\",\\\"title\\\":\\\"系列\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"marketName\\\",\\\"title\\\":\\\"市场名\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"model\\\",\\\"title\\\":\\\"机型\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"productStatus\\\",\\\"title\\\":\\\"产品状态\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"inventory\\\",\\\"title\\\":\\\"当前库存\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"inventoryStatus\\\",\\\"title\\\":\\\"库存状态\\\"}],\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"}}}', 'admin', '2024-01-31 15:43:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577433471336448', NULL, '910394028067438592', NULL, 'JPie', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"仓库状态情况\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=warehouseStatus\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":675,\\\"height\\\":210},\\\"dataSetId\\\":\\\"910431120222896128\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"color\\\":[\\\"#05A0AB\\\",\\\"#65A89E\\\",\\\"#469C8F\\\"],\\\"name\\\":\\\"Access From\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"仓库状态情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:43:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577433496502272', NULL, '910394028067438592', NULL, 'JMultipleBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"type\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"产品库存覆盖率情况\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/inventoryChart?type=coverage\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":751,\\\"height\\\":232},\\\"dataSetId\\\":\\\"910442989620871168\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"type\\\",\\\"text\\\":\\\"type\\\",\\\"value\\\":\\\"type\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"type\\\":\\\"value\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":41,\\\"left\\\":104,\\\"bottom\\\":52,\\\"right\\\":90},\\\"series\\\":[{\\\"color\\\":[\\\"#05A5B0\\\",\\\"#6BB3A8\\\",\\\"#4AA194\\\",\\\"#1D828A\\\"]}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"产品库存覆盖率情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:43:45', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577878868672512', NULL, '910820508471705600', NULL, 'JText', '{\\\"chartData\\\":\\\"某 连 锁 饮 品 销 售\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1132,\\\"height\\\":100},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":40,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":18,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:45:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577878898032640', NULL, '910820508471705600', NULL, 'JForm', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":675,\\\"height\\\":100},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":24,\\\"dataType\\\":1,\\\"h\\\":12,\\\"linkageConfig\\\":[{\\\"linkageId\\\":\\\"0efe3637-39ac-4f2e-82f4-e09540ee332a\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"2db8c9de-9f8b-49f8-8d7a-6b3166de0ed5\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"6f773617-eca8-4598-8260-dc701cc16e8b\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"868c63d3-cfc2-4e49-a1c5-6ee0418fd303\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"35a7308b-0482-48c8-8e46-ed50cfb67961\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"cd981a55-258c-48cd-8e92-742185a711a3\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"715ebf76-9228-4b2e-8ab7-dcb351c2ff03\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"2323a8fb-42ff-4a23-9b13-8f4f514dafb5\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"0b68bd42-a0e9-48f8-9a7b-794ba9ebf8cf\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"5130130f-6076-45b1-8977-d9b5a4c894fc\\\",\\\"linkage\\\":[]},{\\\"linkageId\\\":\\\"82016a70-aa98-42cb-b205-c14e5e212cf8\\\",\\\"linkage\\\":[]}],\\\"timeOut\\\":-1,\\\"option\\\":{\\\"fields\\\":[{\\\"fieldName\\\":\\\"date\\\",\\\"dictCode\\\":\\\"\\\",\\\"dateFormat\\\":\\\"YYYY-MM\\\",\\\"fieldTxt\\\":\\\"日期\\\",\\\"defaultValue\\\":\\\"2024-01\\\",\\\"searchMode\\\":\\\"single\\\",\\\"orderNum\\\":\\\"\\\",\\\"action\\\":\\\"\\\",\\\"id\\\":\\\"rowa82899dc-1e6b-47a1-acd8-ba2fb6f5df02\\\",\\\"izSearch\\\":\\\"1\\\",\\\"widgetType\\\":\\\"date\\\"}],\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}}}}', 'admin', '2024-01-31 15:45:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577878919004160', NULL, '910820508471705600', NULL, 'JGrowCard', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"图标\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"总计\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"前缀\\\"},{\\\"mapping\\\":\\\"color\\\",\\\"filed\\\":\\\"颜色\\\"},{\\\"mapping\\\":\\\"action\\\",\\\"filed\\\":\\\"单位\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"销量额\\\",\\\"query\\\":[],\\\"h\\\":19,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=salesVolume\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"title\\\\\\\": \\\\\\\"访问数\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-qianbao\\\\\\\",    \\\\\\\"value\\\\\\\": 2000,    \\\\\\\"total\\\\\\\": 120000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"color\\\\\\\": \\\\\\\"green\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"月\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"成交额\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-youhuiquan\\\\\\\",    \\\\\\\"value\\\\\\\": 20000,    \\\\\\\"total\\\\\\\": 500000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"color\\\\\\\": \\\\\\\"blue\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"月\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"下载数\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-tupian\\\\\\\",    \\\\\\\"value\\\\\\\": 8000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"total\\\\\\\": 120000,    \\\\\\\"color\\\\\\\": \\\\\\\"orange\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"周\\\\\\\"  },  {    \\\\\\\"title\\\\\\\": \\\\\\\"成交数\\\\\\\",    \\\\\\\"icon\\\\\\\": \\\\\\\"icon-jeecg-jifen\\\\\\\",    \\\\\\\"value\\\\\\\": 5000,    \\\\\\\"prefix\\\\\\\": \\\\\\\"$\\\\\\\",    \\\\\\\"total\\\\\\\": 50000,    \\\\\\\"color\\\\\\\": \\\\\\\"purple\\\\\\\",    \\\\\\\"action\\\\\\\": \\\\\\\"年\\\\\\\"  }]\\\",\\\"size\\\":{\\\"width\\\":1817,\\\"height\\\":320},\\\"dataSetId\\\":\\\"911792028287287296\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"},{\\\"label\\\":\\\"icon\\\",\\\"text\\\":\\\"icon\\\",\\\"value\\\":\\\"icon\\\"},{\\\"label\\\":\\\"action\\\",\\\"text\\\":\\\"action\\\",\\\"value\\\":\\\"action\\\"},{\\\"label\\\":\\\"color\\\",\\\"text\\\":\\\"color\\\",\\\"value\\\":\\\"color\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":20},\\\"body\\\":{\\\"horizontal\\\":6,\\\"vertical\\\":4,\\\"span\\\":8},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"统计卡片\\\"}}}', 'admin', '2024-01-31 15:45:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577878944169984', NULL, '910820508471705600', NULL, 'JNumber', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"单月最高销售量分店\\\\t\\\",\\\"query\\\":[],\\\"h\\\":9,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=topSellingBranch\\\",\\\"drillData\\\":[],\\\"analysis\\\":{\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\\\\"value\\\\\\\":\\\\\\\"1024\\\\\\\"}\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":177},\\\"dataSetId\\\":\\\"911836343134896128\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#F3EFF0\\\",\\\"seriesType\\\":[],\\\"w\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#F9B632\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FF9736\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":\\\"单月最高销量分店（新洲店）\\\"}}}', 'admin', '2024-01-31 15:45:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577878965141504', NULL, '910820508471705600', NULL, 'JNumber', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"单月最高销量品线\\\\t\\\",\\\"query\\\":[],\\\"h\\\":9,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=salesLine\\\",\\\"drillData\\\":[],\\\"analysis\\\":{\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\\\\"value\\\\\\\":\\\\\\\"1024\\\\\\\"}\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":166},\\\"dataSetId\\\":\\\"911836426450550784\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#E9F2FF\\\",\\\"seriesType\\\":[],\\\"w\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#547BFE\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#547BFE\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":\\\"单月最高销量品线（醇香奶茶）\\\"}}}', 'admin', '2024-01-31 15:45:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577878990307328', NULL, '910820508471705600', NULL, 'JNumber', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"单月最高销量单品\\\",\\\"query\\\":[],\\\"h\\\":9,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=highestSellingItem\\\",\\\"drillData\\\":[],\\\"analysis\\\":{\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\\\\"value\\\\\\\":\\\\\\\"1024\\\\\\\"}\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":166},\\\"dataSetId\\\":\\\"911836535531814912\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#EDFAFE\\\",\\\"seriesType\\\":[],\\\"w\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#44C8F3\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#44C8F3\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":\\\"单月最高销量单品（珍珠奶茶）\\\"}}}', 'admin', '2024-01-31 15:45:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577879023861760', NULL, '910820508471705600', NULL, 'JNumber', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"单月最高销量规格\\\",\\\"query\\\":[],\\\"h\\\":9,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=maximumSalesSpecs\\\",\\\"drillData\\\":[],\\\"analysis\\\":{\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\\\\"value\\\\\\\":\\\\\\\"1024\\\\\\\"}\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":177},\\\"dataSetId\\\":\\\"911836717715603456\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#F2FCF7\\\",\\\"seriesType\\\":[],\\\"w\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#58DC92\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#9EFFB6\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":\\\"单月最高销量规格（磨砂）\\\"}}}', 'admin', '2024-01-31 15:45:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577879044833280', NULL, '910820508471705600', NULL, 'JLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"销售额走势\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=salesTrend\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":243},\\\"dataSetId\\\":\\\"911836839023263744\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"},\\\"show\\\":false},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"show\\\":true},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#FBE1C2\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":178,\\\"bottom\\\":157,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"lineType\\\":\\\"area\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"销售金额（元）\\\",\\\"left\\\":10,\\\"text\\\":\\\"销售额走势\\\",\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:45:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577879065804800', NULL, '910820508471705600', NULL, 'JLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"销量走势\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=salesTendency\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":232},\\\"dataSetId\\\":\\\"911836922162757632\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#D7EBFB\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":71,\\\"bottom\\\":62,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"lineType\\\":\\\"area\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"type\\\":\\\"line\\\"}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"销售数量（杯）\\\",\\\"left\\\":1,\\\"text\\\":\\\"销量走势\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:45:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577879086776320', NULL, '910820508471705600', NULL, 'JLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"原料支出趋势\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=expenditureTrends\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":221},\\\"dataSetId\\\":\\\"911845934736392192\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#D5DFFE\\\"}],\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":54,\\\"bottom\\\":61,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"lineType\\\":\\\"area\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"type\\\":\\\"line\\\"}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"支出费用（元）\\\",\\\"left\\\":10,\\\"text\\\":\\\"原料支出趋势\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:45:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577879103553536', NULL, '910820508471705600', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"订单销售量\\\\t\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=orderSalesVolume\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":827,\\\"height\\\":353},\\\"dataSetId\\\":\\\"911837008343121920\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"type\\\":\\\"value\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":48,\\\"left\\\":85,\\\"bottom\\\":60,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":0,\\\"data\\\":[],\\\"showBackground\\\":false,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"#51626E\\\"},\\\"itemStyle\\\":{\\\"color\\\":\\\"#85C6F3\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"订单销售量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:45:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577879116136448', NULL, '910820508471705600', NULL, 'JCommonTable', '{\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"店铺销售额排名\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=salesRanking\\\",\\\"drillData\\\":[],\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"width\\\":447,\\\"height\\\":353},\\\"dataSetId\\\":\\\"911837091507781632\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"店铺\\\",\\\"text\\\":\\\"店铺\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"销售金额（元）\\\",\\\"text\\\":\\\"销售金额（元）\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"seriesType\\\":[],\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"name\\\",\\\"title\\\":\\\"店铺\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"value\\\",\\\"title\\\":\\\"销售金额（元）\\\"}],\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}}}}', 'admin', '2024-01-31 15:45:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912577879132913664', NULL, '910820508471705600', NULL, 'JRing', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\" 冷热占比\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/beverageSales?type=coldAndHostProportion\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":353},\\\"dataSetId\\\":\\\"911837168896884736\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"top\\\":1,\\\"show\\\":true,\\\"text\\\":\\\"冷热占比\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:45:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912578020841668608', NULL, '910744177604083712', NULL, 'JText', '{\\\"chartData\\\":\\\"小 区 消 防 巡 检 状 态\\\",\\\"borderColor\\\":\\\"#DB771F\\\",\\\"size\\\":{\\\"width\\\":1817,\\\"height\\\":78},\\\"background\\\":\\\"#DB771F\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":36,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:46:05', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912578020875223040', NULL, '910744177604083712', NULL, 'JText', '{\\\"chartData\\\":\\\"区域基本情况\\\",\\\"borderColor\\\":\\\"#DB771F\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":56},\\\"background\\\":\\\"#DB771F\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":37},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:46:05', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912578020896194560', NULL, '910744177604083712', NULL, 'JList', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"区域基本情况\\\",\\\"query\\\":[],\\\"h\\\":24,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=regionBasicInformation\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"通知一\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-9 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知二\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-8 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知三\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-7 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知四\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-4 14:20:21\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":177},\\\"dataSetId\\\":\\\"910750488542625792\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"horizontal\\\",\\\"showTitlePrefix\\\":true,\\\"titleFontSize\\\":18,\\\"showTimePrefix\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"}}}', 'admin', '2024-01-31 15:46:05', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912578020917166080', NULL, '910744177604083712', NULL, 'JText', '{\\\"chartData\\\":\\\"设备总数\\\",\\\"borderColor\\\":\\\"#DB771F\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":67},\\\"background\\\":\\\"#DB771F\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":16,\\\"marginLeft\\\":34},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:46:05', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912578020938137600', NULL, '910744177604083712', NULL, 'JNumber', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"正常设备\\\",\\\"h\\\":9,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=normalDevice\\\",\\\"analysis\\\":{\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{  \\\\\\\"value\\\\\\\": \\\\\\\"15990\\\\\\\"}\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":122},\\\"dataSetId\\\":\\\"910754028661030912\\\",\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":\\\"正常设备\\\"}}}', 'admin', '2024-01-31 15:46:05', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912578020959109120', NULL, '910744177604083712', NULL, 'JNumber', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"异常设备\\\",\\\"query\\\":[],\\\"h\\\":9,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=abnormalDevice\\\",\\\"drillData\\\":[],\\\"analysis\\\":{\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\\\\"value\\\\\\\":\\\\\\\"1024\\\\\\\"}\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":122},\\\"dataSetId\\\":\\\"910754465934000128\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":\\\"异常设备\\\"}}}', 'admin', '2024-01-31 15:46:05', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912578020980080640', NULL, '910744177604083712', NULL, 'JText', '{\\\"chartData\\\":\\\"设备异常明细\\\",\\\"borderColor\\\":\\\"#DB771F\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":67},\\\"background\\\":\\\"#DB771F\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":15,\\\"marginLeft\\\":32},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:46:05', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912578021005246464', NULL, '910744177604083712', NULL, 'JCommonTable', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"设备异常明细\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=equipmentDetails\\\",\\\"drillData\\\":[],\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":551},\\\"dataSetId\\\":\\\"910759432656830464\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"小区名称\\\",\\\"text\\\":\\\"小区名称\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"设备名称\\\",\\\"text\\\":\\\"设备名称\\\",\\\"value\\\":\\\"deviceName\\\"},{\\\"label\\\":\\\"设备地址\\\",\\\"text\\\":\\\"设备地址\\\",\\\"value\\\":\\\"deviceAddress\\\"},{\\\"label\\\":\\\"设备状态\\\",\\\"text\\\":\\\"设备状态\\\",\\\"value\\\":\\\"deviceStatus\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"name\\\",\\\"title\\\":\\\"小区名称\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"deviceName\\\",\\\"title\\\":\\\"设备名称\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"deviceAddress\\\",\\\"title\\\":\\\"设备地址\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"deviceStatus\\\",\\\"title\\\":\\\"设备状态\\\"}],\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"}}}', 'admin', '2024-01-31 15:46:05', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912578021026217984', NULL, '910744177604083712', NULL, 'JBubbleMap', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"commonOption\\\":{\\\"barSize\\\":10,\\\"gradientColor\\\":false,\\\"breadcrumb\\\":{\\\"drillDown\\\":false,\\\"textColor\\\":\\\"#000000\\\"},\\\"areaColor\\\":{\\\"color1\\\":\\\"#f7f7f7\\\",\\\"color2\\\":\\\"#fcc02e\\\"},\\\"barColor\\\":\\\"#fff176\\\",\\\"barColor2\\\":\\\"#fcc02e\\\",\\\"inRange\\\":{\\\"color\\\":[\\\"#04387b\\\",\\\"#467bc0\\\"]}},\\\"paramOption\\\":[],\\\"dataSetName\\\":\\\"小区地图分布\\\",\\\"activeKey\\\":1,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"廊坊\\\\\\\",    \\\\\\\"value\\\\\\\": 199  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"新疆\\\\\\\",    \\\\\\\"value\\\\\\\": 180  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"河南\\\\\\\",    \\\\\\\"value\\\\\\\": 137  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"四川\\\\\\\",    \\\\\\\"value\\\\\\\": 125  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"黑龙江\\\\\\\",    \\\\\\\"value\\\\\\\": 123  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"广东\\\\\\\",    \\\\\\\"value\\\\\\\": 123  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"山东\\\\\\\",    \\\\\\\"value\\\\\\\": 119  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"福建\\\\\\\",    \\\\\\\"value\\\\\\\": 116  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"湖北\\\\\\\",    \\\\\\\"value\\\\\\\": 116  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"浙江\\\\\\\",    \\\\\\\"value\\\\\\\": 114  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"湖南\\\\\\\",    \\\\\\\"value\\\\\\\": 114  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"安徽\\\\\\\",    \\\\\\\"value\\\\\\\": 109  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"河北\\\\\\\",    \\\\\\\"value\\\\\\\": 102  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"江苏\\\\\\\",    \\\\\\\"value\\\\\\\": 92  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"江西\\\\\\\",    \\\\\\\"value\\\\\\\": 91  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"重庆\\\\\\\",    \\\\\\\"value\\\\\\\": 91  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"云南\\\\\\\",    \\\\\\\"value\\\\\\\": 83  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"吉林\\\\\\\",    \\\\\\\"value\\\\\\\": 82  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"山西\\\\\\\",    \\\\\\\"value\\\\\\\": 81  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"陕西\\\\\\\",    \\\\\\\"value\\\\\\\": 80  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"辽宁\\\\\\\",    \\\\\\\"value\\\\\\\": 67  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"贵州\\\\\\\",    \\\\\\\"value\\\\\\\": 62  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"广西\\\\\\\",    \\\\\\\"value\\\\\\\": 59  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"甘肃\\\\\\\",    \\\\\\\"value\\\\\\\": 56  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"内蒙古\\\\\\\",    \\\\\\\"value\\\\\\\": 47  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"天津\\\\\\\",    \\\\\\\"value\\\\\\\": 42  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"上海\\\\\\\",    \\\\\\\"value\\\\\\\": 24  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"宁夏\\\\\\\",    \\\\\\\"value\\\\\\\": 18  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"海南\\\\\\\",    \\\\\\\"value\\\\\\\": 14  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"青海\\\\\\\",    \\\\\\\"value\\\\\\\": 10  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"西藏\\\\\\\",    \\\\\\\"value\\\\\\\": 9  }]\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"seriesType\\\":[],\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"区域\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"jsConfig\\\":\\\"\\\",\\\"dataType\\\":2,\\\"query\\\":[],\\\"h\\\":50,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=residentialDistributionMap\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/radar\\\",\\\"timeOut\\\":0,\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":342},\\\"dataSetId\\\":\\\"910765056765509632\\\",\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"drillDown\\\":false,\\\"area\\\":{\\\"markerColor\\\":\\\"#DDE330\\\",\\\"shadowBlur\\\":10,\\\"markerCount\\\":5,\\\"markerOpacity\\\":1,\\\"name\\\":[\\\"河北省\\\"],\\\"scatterLabelShow\\\":false,\\\"shadowColor\\\":\\\"#DDE330\\\",\\\"value\\\":[\\\"13\\\"],\\\"markerType\\\":\\\"effectScatter\\\"},\\\"geo\\\":{\\\"top\\\":27,\\\"aspectScale\\\":0.92,\\\"itemStyle\\\":{\\\"normal\\\":{\\\"shadowOffsetX\\\":0,\\\"borderColor\\\":\\\"#a9a9a9\\\",\\\"shadowOffsetY\\\":0,\\\"areaColor\\\":\\\"\\\",\\\"shadowBlur\\\":0,\\\"borderWidth\\\":1,\\\"shadowColor\\\":\\\"#80d9f8\\\"},\\\"emphasis\\\":{\\\"areaColor\\\":\\\"#fff59c\\\",\\\"borderWidth\\\":0}},\\\"zoom\\\":1,\\\"label\\\":{\\\"emphasis\\\":{\\\"color\\\":\\\"#fff\\\",\\\"show\\\":false}},\\\"roam\\\":true},\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"data\\\":[]},\\\"title\\\":{\\\"left\\\":10,\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"graphic\\\":[],\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"visualMap\\\":{\\\"min\\\":0,\\\"top\\\":\\\"bottom\\\",\\\"max\\\":200,\\\"left\\\":\\\"5%\\\",\\\"calculable\\\":true,\\\"show\\\":false,\\\"type\\\":\\\"continuous\\\",\\\"seriesIndex\\\":[1]}}}', 'admin', '2024-01-31 15:46:05', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912578021047189504', NULL, '910744177604083712', NULL, 'JText', '{\\\"chartData\\\":\\\"小区地图分布\\\",\\\"borderColor\\\":\\\"#DB771F\\\",\\\"size\\\":{\\\"width\\\":1208,\\\"height\\\":56},\\\"background\\\":\\\"#DB771F\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:46:05', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912578021068161024', NULL, '910744177604083712', NULL, 'JCommonTable', '{\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"小区分布地图表格\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=residentialDistributionTable\\\",\\\"drillData\\\":[],\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":342},\\\"dataSetId\\\":\\\"910773111884398592\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"区域名称\\\",\\\"text\\\":\\\"区域名称\\\",\\\"value\\\":\\\"areaName\\\"},{\\\"label\\\":\\\"小区数量\\\",\\\"text\\\":\\\"小区数量\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"seriesType\\\":[],\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"areaName\\\",\\\"title\\\":\\\"区域名称\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"value\\\",\\\"title\\\":\\\"小区数量\\\"}],\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}}}}', 'admin', '2024-01-31 15:46:05', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912578021093326848', NULL, '910744177604083712', NULL, 'JPie', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"室外消火栓泵\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=deviceCountProportion\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":364},\\\"dataSetId\\\":\\\"910776816075587584\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"color\\\":[\\\"#3BB1E3\\\",\\\"#DB771F\\\",\\\"#B6C5D1\\\"],\\\"name\\\":\\\"Access From\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"设备类型数量占比\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:46:05', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912578021114298368', NULL, '910744177604083712', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"区域设备数量\\\\t\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=areaDeviceCount\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":364},\\\"dataSetId\\\":\\\"910790230315417600\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"type\\\":\\\"value\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":90,\\\"left\\\":62,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":21,\\\"data\\\":[],\\\"color\\\":[\\\"#3BB1E3\\\",\\\"#DB771F\\\",\\\"#B6C5D1\\\"],\\\"itemStyle\\\":{\\\"color\\\":\\\"#3BB1E3\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"区域设备数量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:46:05', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912578021131075584', NULL, '910744177604083712', NULL, 'JLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"巡检任务数\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=inspectionTasksCount\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":353},\\\"dataSetId\\\":\\\"910794755508060160\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#38B4EA\\\"}],\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"lineType\\\":\\\"area\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\"},\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":10,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:46:05', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912578021156241408', NULL, '910744177604083712', NULL, 'JCommonTable', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"巡检任务数表格\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=inspectionTasksTable\\\",\\\"drillData\\\":[],\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":353},\\\"dataSetId\\\":\\\"910797586147360768\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"检查时间\\\",\\\"text\\\":\\\"检查时间\\\",\\\"value\\\":\\\"inspectTime\\\"},{\\\"label\\\":\\\"设备名称\\\",\\\"text\\\":\\\"设备名称\\\",\\\"value\\\":\\\"deviceName\\\"},{\\\"label\\\":\\\"设备地址\\\",\\\"text\\\":\\\"设备地址\\\",\\\"value\\\":\\\"deviceAddress\\\"},{\\\"label\\\":\\\"检查人\\\",\\\"text\\\":\\\"检查人\\\",\\\"value\\\":\\\"inspected\\\"},{\\\"label\\\":\\\"检查内容\\\",\\\"text\\\":\\\"检查内容\\\",\\\"value\\\":\\\"content\\\"},{\\\"label\\\":\\\"巡查结果\\\",\\\"text\\\":\\\"巡查结果\\\",\\\"value\\\":\\\"inspectResult\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"inspectTime\\\",\\\"title\\\":\\\"检查时间\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"deviceName\\\",\\\"title\\\":\\\"设备名称\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"deviceAddress\\\",\\\"title\\\":\\\"设备地址\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"inspected\\\",\\\"title\\\":\\\"检查人\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"content\\\",\\\"title\\\":\\\"检查内容\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"inspectResult\\\",\\\"title\\\":\\\"巡查结果\\\"}]}}', 'admin', '2024-01-31 15:46:05', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912578021181407232', NULL, '910744177604083712', NULL, 'JText', '{\\\"chartData\\\":\\\"巡检任务数\\\",\\\"borderColor\\\":\\\"#DB771F\\\",\\\"size\\\":{\\\"width\\\":1208,\\\"height\\\":67},\\\"background\\\":\\\"#DB771F\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":12,\\\"marginLeft\\\":0},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:46:05', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912579172505272320', NULL, '910475721247866880', NULL, 'JText', '{\\\"chartData\\\":\\\"某电商公司销售运营看板\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1817,\\\"height\\\":78},\\\"background\\\":\\\"#0774F0\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":23,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:50:39', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912579172538826752', NULL, '910475721247866880', NULL, 'JGrowCard', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"title\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"图标\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"总计\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"前缀\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"颜色\\\"},{\\\"mapping\\\":\\\"unit\\\",\\\"filed\\\":\\\"单位\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"销售状态\\\",\\\"query\\\":[],\\\"h\\\":19,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/commerceSalesOperations?type=saleStatus\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"访问数\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-qianbao\\\\\\\",\\\\\\\"value\\\\\\\":2000,\\\\\\\"total\\\\\\\":120000,\\\\\\\"prefix\\\\\\\":\\\\\\\"$\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"green\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"月\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"成交额\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-youhuiquan\\\\\\\",\\\\\\\"value\\\\\\\":20000,\\\\\\\"total\\\\\\\":500000,\\\\\\\"prefix\\\\\\\":\\\\\\\"$\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"blue\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"月\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"下载数\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-tupian\\\\\\\",\\\\\\\"value\\\\\\\":8000,\\\\\\\"prefix\\\\\\\":\\\\\\\"$\\\\\\\",\\\\\\\"total\\\\\\\":120000,\\\\\\\"color\\\\\\\":\\\\\\\"orange\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"周\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"成交数\\\\\\\",\\\\\\\"icon\\\\\\\":\\\\\\\"icon-jeecg-jifen\\\\\\\",\\\\\\\"value\\\\\\\":5000,\\\\\\\"prefix\\\\\\\":\\\\\\\"$\\\\\\\",\\\\\\\"total\\\\\\\":50000,\\\\\\\"color\\\\\\\":\\\\\\\"purple\\\\\\\",\\\\\\\"action\\\\\\\":\\\\\\\"年\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":177},\\\"dataSetId\\\":\\\"910478592823574528\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"title\\\",\\\"text\\\":\\\"title\\\",\\\"value\\\":\\\"title\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"},{\\\"label\\\":\\\"unit\\\",\\\"text\\\":\\\"unit\\\",\\\"value\\\":\\\"unit\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"icon\\\":{\\\"scriptUrl\\\":\\\"//at.alicdn.com/t/font_3237315_b3fqd960glt.js\\\",\\\"fontSize\\\":20},\\\"body\\\":{\\\"horizontal\\\":8,\\\"vertical\\\":8,\\\"span\\\":8},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"更多\\\",\\\"title\\\":\\\"统计卡片\\\"}}}', 'admin', '2024-01-31 15:50:39', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912579172559798272', NULL, '910475721247866880', NULL, 'JBubbleMap', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"commonOption\\\":{\\\"barSize\\\":10,\\\"gradientColor\\\":false,\\\"breadcrumb\\\":{\\\"drillDown\\\":false,\\\"textColor\\\":\\\"#000000\\\"},\\\"areaColor\\\":{\\\"color1\\\":\\\"#f7f7f7\\\",\\\"color2\\\":\\\"#fcc02e\\\"},\\\"barColor\\\":\\\"#fff176\\\",\\\"barColor2\\\":\\\"#fcc02e\\\",\\\"inRange\\\":{\\\"color\\\":[\\\"#04387b\\\",\\\"#467bc0\\\"]}},\\\"paramOption\\\":[],\\\"dataSetName\\\":\\\"各地区订单与仓库情况\\\",\\\"activeKey\\\":1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"北京\\\\\\\",\\\\\\\"value\\\\\\\":199},{\\\\\\\"name\\\\\\\":\\\\\\\"新疆\\\\\\\",\\\\\\\"value\\\\\\\":180},{\\\\\\\"name\\\\\\\":\\\\\\\"河南\\\\\\\",\\\\\\\"value\\\\\\\":137},{\\\\\\\"name\\\\\\\":\\\\\\\"四川\\\\\\\",\\\\\\\"value\\\\\\\":125},{\\\\\\\"name\\\\\\\":\\\\\\\"黑龙江\\\\\\\",\\\\\\\"value\\\\\\\":123},{\\\\\\\"name\\\\\\\":\\\\\\\"广东\\\\\\\",\\\\\\\"value\\\\\\\":123},{\\\\\\\"name\\\\\\\":\\\\\\\"山东\\\\\\\",\\\\\\\"value\\\\\\\":119},{\\\\\\\"name\\\\\\\":\\\\\\\"福建\\\\\\\",\\\\\\\"value\\\\\\\":116},{\\\\\\\"name\\\\\\\":\\\\\\\"湖北\\\\\\\",\\\\\\\"value\\\\\\\":116},{\\\\\\\"name\\\\\\\":\\\\\\\"浙江\\\\\\\",\\\\\\\"value\\\\\\\":114},{\\\\\\\"name\\\\\\\":\\\\\\\"湖南\\\\\\\",\\\\\\\"value\\\\\\\":114},{\\\\\\\"name\\\\\\\":\\\\\\\"安徽\\\\\\\",\\\\\\\"value\\\\\\\":109},{\\\\\\\"name\\\\\\\":\\\\\\\"河北\\\\\\\",\\\\\\\"value\\\\\\\":102},{\\\\\\\"name\\\\\\\":\\\\\\\"江苏\\\\\\\",\\\\\\\"value\\\\\\\":92},{\\\\\\\"name\\\\\\\":\\\\\\\"江西\\\\\\\",\\\\\\\"value\\\\\\\":91},{\\\\\\\"name\\\\\\\":\\\\\\\"重庆\\\\\\\",\\\\\\\"value\\\\\\\":91},{\\\\\\\"name\\\\\\\":\\\\\\\"云南\\\\\\\",\\\\\\\"value\\\\\\\":83},{\\\\\\\"name\\\\\\\":\\\\\\\"吉林\\\\\\\",\\\\\\\"value\\\\\\\":82},{\\\\\\\"name\\\\\\\":\\\\\\\"山西\\\\\\\",\\\\\\\"value\\\\\\\":81},{\\\\\\\"name\\\\\\\":\\\\\\\"陕西\\\\\\\",\\\\\\\"value\\\\\\\":80},{\\\\\\\"name\\\\\\\":\\\\\\\"辽宁\\\\\\\",\\\\\\\"value\\\\\\\":67},{\\\\\\\"name\\\\\\\":\\\\\\\"贵州\\\\\\\",\\\\\\\"value\\\\\\\":62},{\\\\\\\"name\\\\\\\":\\\\\\\"广西\\\\\\\",\\\\\\\"value\\\\\\\":59},{\\\\\\\"name\\\\\\\":\\\\\\\"甘肃\\\\\\\",\\\\\\\"value\\\\\\\":56},{\\\\\\\"name\\\\\\\":\\\\\\\"内蒙古\\\\\\\",\\\\\\\"value\\\\\\\":47},{\\\\\\\"name\\\\\\\":\\\\\\\"天津\\\\\\\",\\\\\\\"value\\\\\\\":42},{\\\\\\\"name\\\\\\\":\\\\\\\"上海\\\\\\\",\\\\\\\"value\\\\\\\":24},{\\\\\\\"name\\\\\\\":\\\\\\\"宁夏\\\\\\\",\\\\\\\"value\\\\\\\":18},{\\\\\\\"name\\\\\\\":\\\\\\\"海南\\\\\\\",\\\\\\\"value\\\\\\\":14},{\\\\\\\"name\\\\\\\":\\\\\\\"青海\\\\\\\",\\\\\\\"value\\\\\\\":10},{\\\\\\\"name\\\\\\\":\\\\\\\"西藏\\\\\\\",\\\\\\\"value\\\\\\\":9}]\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"仓库名称\\\",\\\"text\\\":\\\"仓库名称\\\",\\\"value\\\":\\\"warehouseName\\\"},{\\\"label\\\":\\\"仓库存量\\\",\\\"text\\\":\\\"仓库存量\\\",\\\"value\\\":\\\"warehouseCount\\\"},{\\\"label\\\":\\\"省份\\\",\\\"text\\\":\\\"省份\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"销售额\\\",\\\"text\\\":\\\"销售额\\\",\\\"value\\\":\\\"value\\\"}],\\\"seriesType\\\":[],\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"区域\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"jsConfig\\\":\\\"\\\",\\\"dataType\\\":2,\\\"query\\\":[],\\\"h\\\":50,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/commerceSalesOperations?type=regionalOrders\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/radar\\\",\\\"timeOut\\\":0,\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":452},\\\"dataSetId\\\":\\\"910695134387552256\\\",\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"drillDown\\\":false,\\\"area\\\":{\\\"markerColor\\\":\\\"#DDE330\\\",\\\"shadowBlur\\\":10,\\\"markerCount\\\":5,\\\"markerOpacity\\\":1,\\\"name\\\":[\\\"中国\\\"],\\\"scatterLabelShow\\\":false,\\\"shadowColor\\\":\\\"#DDE330\\\",\\\"value\\\":[\\\"china\\\"],\\\"markerType\\\":\\\"effectScatter\\\"},\\\"geo\\\":{\\\"top\\\":80,\\\"itemStyle\\\":{\\\"normal\\\":{\\\"shadowOffsetX\\\":0,\\\"borderColor\\\":\\\"#a9a9a9\\\",\\\"shadowOffsetY\\\":0,\\\"areaColor\\\":\\\"\\\",\\\"shadowBlur\\\":0,\\\"borderWidth\\\":1,\\\"shadowColor\\\":\\\"#80d9f8\\\"},\\\"emphasis\\\":{\\\"areaColor\\\":\\\"#fff59c\\\",\\\"borderWidth\\\":0}},\\\"zoom\\\":1,\\\"label\\\":{\\\"emphasis\\\":{\\\"color\\\":\\\"#fff\\\",\\\"show\\\":false}},\\\"roam\\\":true},\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"data\\\":[]},\\\"title\\\":{\\\"left\\\":10,\\\"show\\\":true,\\\"text\\\":\\\"\\\"},\\\"graphic\\\":[],\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"visualMap\\\":{\\\"min\\\":0,\\\"top\\\":\\\"bottom\\\",\\\"max\\\":200,\\\"left\\\":\\\"5%\\\",\\\"calculable\\\":true,\\\"show\\\":false,\\\"type\\\":\\\"continuous\\\",\\\"seriesIndex\\\":[1]}}}', 'admin', '2024-01-31 15:50:39', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912579172580769792', NULL, '910475721247866880', NULL, 'JCommonTable', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"各地区订单与仓库情况\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/commerceSalesOperations?type=regionalOrders\\\",\\\"drillData\\\":[],\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":485},\\\"dataSetId\\\":\\\"910695134387552256\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"仓库名称\\\",\\\"text\\\":\\\"仓库名称\\\",\\\"value\\\":\\\"warehouseName\\\"},{\\\"label\\\":\\\"仓库存量\\\",\\\"text\\\":\\\"仓库存量\\\",\\\"value\\\":\\\"warehouseCount\\\"},{\\\"label\\\":\\\"省份\\\",\\\"text\\\":\\\"省份\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"销售额\\\",\\\"text\\\":\\\"销售额\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"seriesType\\\":[],\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":24,\\\"dataNum\\\":\\\"0\\\",\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"warehouseName\\\",\\\"title\\\":\\\"仓库名称\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"warehouseCount\\\",\\\"title\\\":\\\"仓库存量\\\"},{\\\"izShow\\\":\\\"N\\\",\\\"dataIndex\\\":\\\"name\\\",\\\"title\\\":\\\"省份\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"value\\\",\\\"title\\\":\\\"销售额\\\"}]}}', 'admin', '2024-01-31 15:50:39', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912579172597547008', NULL, '910475721247866880', NULL, 'JPie', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"季度目标完成\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/commerceSalesOperations?type=quarterlyFinish\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":375},\\\"dataSetId\\\":\\\"910708293282349056\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"color\\\":[\\\"#1F70E0\\\",\\\"#F0F2FA\\\"],\\\"name\\\":\\\"Access From\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"isRadius\\\":true,\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"季度目标完成\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:50:39', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912579172618518528', NULL, '910475721247866880', NULL, 'JNumber', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":1,\\\"dataSetName\\\":\\\"季度目标完成\\\",\\\"query\\\":[],\\\"h\\\":9,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/commerceSalesOperations?type=quarterlyFinish\\\",\\\"drillData\\\":[],\\\"analysis\\\":{\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{  \\\\\\\"value\\\\\\\": 200}\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":177},\\\"dataSetId\\\":\\\"910708293282349056\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#1C6CDE\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":\\\"季度销售额（万）\\\"}}}', 'admin', '2024-01-31 15:50:39', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912579172643684352', NULL, '910475721247866880', NULL, 'JNumber', '{\\\"chartData\\\":\\\"{  \\\\\\\"value\\\\\\\": \\\\\\\"39\\\\\\\"}\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":188},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":5,\\\"dataType\\\":1,\\\"h\\\":9,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"analysis\\\":{\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#1C6CDE\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":\\\"同比增长（%）\\\"}}}', 'admin', '2024-01-31 15:50:39', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912579172664655872', NULL, '910475721247866880', NULL, 'JPie', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"品牌销售占比\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/commerceSalesOperations?type=brandSales\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":447,\\\"height\\\":375},\\\"dataSetId\\\":\\\"910721009699045376\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"left\\\":47,\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\",\\\"t\\\":1},\\\"series\\\":[{\\\"data\\\":[],\\\"color\\\":[\\\"#0E52B0\\\",\\\"#118FF0\\\",\\\"#97CFFC\\\",\\\"#216DC4\\\",\\\"#60AEF7\\\"],\\\"name\\\":\\\"Access From\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"isRadius\\\":true,\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"品牌销售占比\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:50:39', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912579172685627392', NULL, '910475721247866880', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"销售地区排行\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/commerceSalesOperations?type=areaRanking\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":309},\\\"dataSetId\\\":\\\"910732622212677632\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"showBackground\\\":false,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"#51626E\\\"},\\\"itemStyle\\\":{\\\"color\\\":\\\"#428BEF\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"show\\\":true,\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"销售额（万元）\\\",\\\"show\\\":true,\\\"text\\\":\\\"销售地区排行\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:50:39', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912579172702404608', NULL, '910475721247866880', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"品牌销售占比\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/commerceSalesOperations?type=brandSales\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":309},\\\"dataSetId\\\":\\\"910721009699045376\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#428BEF\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"销售额（元）\\\",\\\"show\\\":true,\\\"text\\\":\\\"品牌销售情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:50:39', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912579172719181824', NULL, '910475721247866880', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"物流订单接收\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/commerceSalesOperations?type=logisticsOrder\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":430},\\\"dataSetId\\\":\\\"910737864308342784\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"type\\\":\\\"value\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":90,\\\"left\\\":58,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":24,\\\"data\\\":[],\\\"showBackground\\\":false,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"#51626E\\\"},\\\"itemStyle\\\":{\\\"color\\\":\\\"#428BEF\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"接收订单（件）\\\",\\\"show\\\":true,\\\"text\\\":\\\"物流订单接收\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:50:39', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912579172740153344', NULL, '910475721247866880', NULL, 'JLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"订单产生趋势\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/commerceSalesOperations?type=generatingTrends\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":430},\\\"dataSetId\\\":\\\"910740127152128000\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#428BEF\\\"}],\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"lineType\\\":\\\"area\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\"},\\\"type\\\":\\\"line\\\"}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"订单数（单）\\\",\\\"left\\\":10,\\\"text\\\":\\\"订单产生趋势\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 15:50:39', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912581733916393472', NULL, '911856216581914624', NULL, 'JText', '{\\\"chartData\\\":\\\"产品销售数据仪表板\\\",\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"size\\\":{\\\"width\\\":1817,\\\"height\\\":78},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4570F2\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":36,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":8,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 16:00:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912581733949947904', NULL, '911856216581914624', NULL, 'JRing', '{\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"本月渠道销售\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/productSales?type=salesThisMonth\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":320},\\\"dataSetId\\\":\\\"911887596497977344\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#DBEAFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":53,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"t\\\":1,\\\"orient\\\":\\\"vertical\\\"},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\" 华东区、华中区为主要渠道销售区域。\\\",\\\"top\\\":1,\\\"show\\\":true,\\\"text\\\":\\\"本月渠道销售\\\",\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 16:00:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912581733975113728', NULL, '911856216581914624', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"本月代理商销售排行\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/productSales?type=salesRanking\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":371,\\\"height\\\":441},\\\"dataSetId\\\":\\\"911887691259887616\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#DBEAFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":3,\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"type\\\":\\\"value\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":69,\\\"left\\\":94,\\\"bottom\\\":58,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":17,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"本月代理商销售排行/元\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 16:00:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912581734000279552', NULL, '911856216581914624', NULL, 'JText', '{\\\"chartData\\\":\\\"本月销售额/元\\\",\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"size\\\":{\\\"width\\\":295,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":21},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 16:00:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912581734025445376', NULL, '911856216581914624', NULL, 'JText', '{\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"paramOption\\\":[],\\\"dataType\\\":1,\\\"dataSetName\\\":\\\"本月产品销售\\\",\\\"query\\\":[],\\\"h\\\":12,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/productSales?type=productSalesThisMonth\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"15,458,757\\\",\\\"size\\\":{\\\"width\\\":295,\\\"height\\\":45},\\\"dataSetId\\\":\\\"911889006916583424\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#DBEAFF\\\",\\\"seriesType\\\":[],\\\"w\\\":8,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4D71FE\\\",\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":16},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 16:00:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912581734050611200', NULL, '911856216581914624', NULL, 'JText', '{\\\"chartData\\\":\\\"月环比 -50%\\\",\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"size\\\":{\\\"width\\\":295,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#34C874\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":21},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 16:00:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912581734084165632', NULL, '911856216581914624', NULL, 'JText', '{\\\"chartData\\\":\\\"今日销售额/元\\\",\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"size\\\":{\\\"width\\\":295,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":18},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 16:00:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912581734113525760', NULL, '911856216581914624', NULL, 'JText', '{\\\"chartData\\\":\\\"657,554\\\",\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"size\\\":{\\\"width\\\":295,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4D71FE\\\",\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":19},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 16:00:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912581734138691584', NULL, '911856216581914624', NULL, 'JText', '{\\\"chartData\\\":\\\"日环比 -12%\\\",\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"size\\\":{\\\"width\\\":295,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#34C874\\\",\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":24},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 16:00:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912581734163857408', NULL, '911856216581914624', NULL, 'JText', '{\\\"chartData\\\":\\\"今年目标销售额达成率\\\",\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"size\\\":{\\\"width\\\":295,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":16},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 16:00:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912581734189023232', NULL, '911856216581914624', NULL, 'JText', '{\\\"chartData\\\":\\\"42%\\\",\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"size\\\":{\\\"width\\\":295,\\\"height\\\":100},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4D71FE\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":24,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 16:00:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912581734209994752', NULL, '911856216581914624', NULL, 'JLine', '{\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"近七天销售额趋势\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/productSales?type=salesTrend\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":904,\\\"height\\\":287},\\\"dataSetId\\\":\\\"911888632709169152\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#DBEAFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"日销售额（元）\\\",\\\"left\\\":10,\\\"text\\\":\\\"近七天销售额趋势\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 16:00:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912581734230966272', NULL, '911856216581914624', NULL, 'JStackBar', '{\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"type\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"本月重点城市的重点产品销售额\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/productSales?type=productSalesRevenue\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Lon\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1991\\\\\\\",\\\\\\\"value\\\\\\\":3,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1992\\\\\\\",\\\\\\\"value\\\\\\\":4,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1993\\\\\\\",\\\\\\\"value\\\\\\\":3.5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1994\\\\\\\",\\\\\\\"value\\\\\\\":5,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1995\\\\\\\",\\\\\\\"value\\\\\\\":4.9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1996\\\\\\\",\\\\\\\"value\\\\\\\":6,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1997\\\\\\\",\\\\\\\"value\\\\\\\":7,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1998\\\\\\\",\\\\\\\"value\\\\\\\":9,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"1999\\\\\\\",\\\\\\\"value\\\\\\\":13,\\\\\\\"type\\\\\\\":\\\\\\\"Bor\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":904,\\\"height\\\":309},\\\"dataSetId\\\":\\\"911888715248877568\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"},{\\\"label\\\":\\\"type\\\",\\\"text\\\":\\\"type\\\",\\\"value\\\":\\\"type\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#DBEAFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#67BBFF\\\"},{\\\"color\\\":\\\"#9982FD\\\"},{\\\"color\\\":\\\"#62DDCC\\\"}],\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"本月重点城市的重点产品销售额/元\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontSize\\\":16}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 16:00:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912581734256132096', NULL, '911856216581914624', NULL, 'JRing', '{\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"本月产品销售\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/productSales?type=productSalesThisMonth\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":523,\\\"height\\\":342},\\\"dataSetId\\\":\\\"911889006916583424\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#DBEAFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":55,\\\"left\\\":47,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\"},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"t\\\":10},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"show\\\":true,\\\"text\\\":\\\" 产品3为主推产品产品2为近期上线产品。\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontSize\\\":14,\\\"fontWeight\\\":\\\"bold\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 16:00:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912581734272909312', NULL, '911856216581914624', NULL, 'JText', '{\\\"chartData\\\":\\\"本月产品销售\\\",\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"size\\\":{\\\"width\\\":523,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":8,\\\"marginLeft\\\":21},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 16:00:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('912581734289686528', NULL, '911856216581914624', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#DBEAFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"本月产品小类销售排行\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/productSales?type=rankingCategorySales\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":523,\\\"height\\\":364},\\\"dataSetId\\\":\\\"911889086163763200\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#DBEAFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"type\\\":\\\"value\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":44,\\\"bottom\\\":62,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":16,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"show\\\":true,\\\"text\\\":\\\" 本月产品小类销售排行/元\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontSize\\\":14},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-01-31 16:00:50', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925744261272031232', NULL, '924603858451734528', NULL, 'JText', '{\\\"chartData\\\":\\\"北京公司2023年度招聘看板\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1604,\\\"height\\\":78},\\\"background\\\":\\\"#4A90E2\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":500},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-07 23:44:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925744261330751488', NULL, '924603858451734528', NULL, 'JText', '{\\\"chartData\\\":\\\"简历投递数\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":56},\\\"background\\\":\\\"#22B6D4\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":24},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-07 23:44:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925744261351723008', NULL, '924603858451734528', NULL, 'JText', '{\\\"chartData\\\":\\\"386\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":56},\\\"background\\\":\\\"#22B6D4\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":50},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-07 23:44:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925744261381083136', NULL, '924603858451734528', NULL, 'JText', '{\\\"chartData\\\":\\\"入职人数\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":56},\\\"background\\\":\\\"#69AAF5\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":24},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-07 23:44:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925744261402054656', NULL, '924603858451734528', NULL, 'JText', '{\\\"chartData\\\":\\\"15\\\",\\\"borderColor\\\":\\\"#69AAF5\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":56},\\\"background\\\":\\\"#4A90E2\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":47},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-07 23:44:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925744261427220480', NULL, '924603858451734528', NULL, 'JRing', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 121,    \\\\\\\"name\\\\\\\": \\\\\\\"四川省\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 251,    \\\\\\\"name\\\\\\\": \\\\\\\"山东省\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 580,    \\\\\\\"name\\\\\\\": \\\\\\\"北京市\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 484,    \\\\\\\"name\\\\\\\": \\\\\\\"河北省\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 300,    \\\\\\\"name\\\\\\\": \\\\\\\"河南省\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":166},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":38,\\\"left\\\":52,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":false,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"show\\\":false},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础环形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-07 23:44:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925744261464969216', NULL, '924603858451734528', NULL, 'JBubbleMap', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"commonOption\\\":{\\\"barSize\\\":10,\\\"gradientColor\\\":false,\\\"breadcrumb\\\":{\\\"drillDown\\\":false,\\\"textColor\\\":\\\"#000000\\\"},\\\"areaColor\\\":{\\\"color1\\\":\\\"#F7F7F7\\\",\\\"color2\\\":\\\"#fcc02e\\\"},\\\"barColor\\\":\\\"#fff176\\\",\\\"barColor2\\\":\\\"#fcc02e\\\",\\\"inRange\\\":{\\\"color\\\":[\\\"#04387b\\\",\\\"#467bc0\\\"]}},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"区域\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"jsConfig\\\":\\\"\\\",\\\"dataType\\\":1,\\\"h\\\":50,\\\"activeKey\\\":1,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/radar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京\\\\\\\",    \\\\\\\"value\\\\\\\": 199  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"山东\\\\\\\",    \\\\\\\"value\\\\\\\": 180  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"四川\\\\\\\",    \\\\\\\"value\\\\\\\": 137  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"新疆\\\\\\\",    \\\\\\\"value\\\\\\\": 125  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"河南\\\\\\\",    \\\\\\\"value\\\\\\\": 123  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"广东\\\\\\\",    \\\\\\\"value\\\\\\\": 123  }]\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":331},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"area\\\":{\\\"markerColor\\\":\\\"#DDE330\\\",\\\"shadowBlur\\\":10,\\\"markerCount\\\":5,\\\"markerOpacity\\\":1,\\\"name\\\":[\\\"中国\\\"],\\\"scatterLabelShow\\\":false,\\\"shadowColor\\\":\\\"#DDE330\\\",\\\"value\\\":[\\\"china\\\"],\\\"markerType\\\":\\\"effectScatter\\\"},\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"legend\\\":{\\\"data\\\":[]},\\\"title\\\":{\\\"top\\\":1,\\\"left\\\":10,\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"drillDown\\\":false,\\\"geo\\\":{\\\"top\\\":38,\\\"itemStyle\\\":{\\\"normal\\\":{\\\"shadowOffsetX\\\":0,\\\"borderColor\\\":\\\"#A9A9A9\\\",\\\"shadowOffsetY\\\":0,\\\"areaColor\\\":\\\"\\\",\\\"shadowBlur\\\":0,\\\"borderWidth\\\":1,\\\"shadowColor\\\":\\\"#80D9F8\\\"},\\\"emphasis\\\":{\\\"areaColor\\\":\\\"#FFF59C\\\",\\\"borderWidth\\\":0}},\\\"zoom\\\":1,\\\"label\\\":{\\\"emphasis\\\":{\\\"color\\\":\\\"#fff\\\",\\\"show\\\":false}},\\\"roam\\\":true},\\\"headerColor\\\":\\\"#000000\\\",\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"graphic\\\":[],\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"},\\\"visualMap\\\":{\\\"min\\\":0,\\\"top\\\":\\\"bottom\\\",\\\"max\\\":200,\\\"left\\\":\\\"5%\\\",\\\"calculable\\\":true,\\\"show\\\":false,\\\"type\\\":\\\"continuous\\\",\\\"seriesIndex\\\":[1]}}}', 'admin', '2024-03-07 23:44:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925744261490135040', NULL, '924603858451734528', NULL, 'JFunnel', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 15,    \\\\\\\"name\\\\\\\": \\\\\\\"入职\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 5,    \\\\\\\"name\\\\\\\": \\\\\\\"待入职\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 23,    \\\\\\\"name\\\\\\\": \\\\\\\"一面\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"name\\\\\\\": \\\\\\\"HR沟通\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 234,    \\\\\\\"name\\\\\\\": \\\\\\\"收到简历\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":331},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/funnel\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"legend\\\":{\\\"orient\\\":\\\"horizontal\\\"},\\\"series\\\":[{\\\"left\\\":\\\"10%\\\",\\\"gap\\\":2,\\\"name\\\":\\\"Funnel\\\",\\\"width\\\":\\\"80%\\\",\\\"emphasis\\\":{\\\"label\\\":{\\\"fontSize\\\":20}},\\\"itemStyle\\\":{\\\"borderColor\\\":\\\"#fff\\\",\\\"borderWidth\\\":1},\\\"sort\\\":\\\"descending\\\",\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"inside\\\"},\\\"labelLine\\\":{\\\"lineStyle\\\":{\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"length\\\":10},\\\"type\\\":\\\"funnel\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a} <br/>{b} : {c}%\\\",\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础漏斗图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-07 23:44:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925744261519495168', NULL, '924603858451734528', NULL, 'JText', '{\\\"chartData\\\":\\\"概览\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":8},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-07 23:44:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925744261544660992', NULL, '924603858451734528', NULL, 'JText', '{\\\"chartData\\\":\\\"候选人分布\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":605,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":3,\\\"marginLeft\\\":5},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-07 23:44:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925744261569826816', NULL, '924603858451734528', NULL, 'JText', '{\\\"chartData\\\":\\\"漏斗图\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":3,\\\"marginLeft\\\":8},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-07 23:44:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925744261594992640', NULL, '924603858451734528', NULL, 'JPie', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 1048,    \\\\\\\"name\\\\\\\": \\\\\\\"双一流大学\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 735,    \\\\\\\"name\\\\\\\": \\\\\\\"双一流学科\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 580,    \\\\\\\"name\\\\\\\": \\\\\\\"211\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 484,    \\\\\\\"name\\\\\\\": \\\\\\\"985\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":155},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":30,\\\"left\\\":46,\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\",\\\"t\\\":2,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":false,\\\"text\\\":\\\"基础饼图\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-07 23:44:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925744261615964160', NULL, '924603858451734528', NULL, 'JSmoothLine', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"name\\\\\\\": \\\\\\\"03-12\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 15,    \\\\\\\"name\\\\\\\": \\\\\\\"03-22\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 6,    \\\\\\\"name\\\\\\\": \\\\\\\"03-18\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 19,    \\\\\\\"name\\\\\\\": \\\\\\\"04-12\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"name\\\\\\\": \\\\\\\"05-29\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"name\\\\\\\": \\\\\\\"08-29\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":199},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":33,\\\"left\\\":23,\\\"bottom\\\":77,\\\"show\\\":false,\\\"right\\\":25},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\",\\\"smooth\\\":true}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"top\\\":1,\\\"left\\\":1,\\\"text\\\":\\\"简历投递日期分布\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-07 23:44:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925744261636935680', NULL, '924603858451734528', NULL, 'JText', '{\\\"chartData\\\":\\\"渠道质量\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":3,\\\"marginLeft\\\":5},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-07 23:44:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925744261662101504', NULL, '924603858451734528', NULL, 'JMultipleBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"人才库\\\\\\\",    \\\\\\\"value\\\\\\\": 150,    \\\\\\\"type\\\\\\\": \\\\\\\"投递数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"招聘网站\\\\\\\",    \\\\\\\"value\\\\\\\": 269,    \\\\\\\"type\\\\\\\": \\\\\\\"投递数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"其他渠道\\\\\\\",    \\\\\\\"value\\\\\\\": 81,    \\\\\\\"type\\\\\\\": \\\\\\\"投递数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"内推\\\\\\\",    \\\\\\\"value\\\\\\\": 67,    \\\\\\\"type\\\\\\\": \\\\\\\"投递数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"人才库\\\\\\\",    \\\\\\\"value\\\\\\\": 50,    \\\\\\\"type\\\\\\\": \\\\\\\"面试数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"招聘网站\\\\\\\",    \\\\\\\"value\\\\\\\": 100,    \\\\\\\"type\\\\\\\": \\\\\\\"面试数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"其他渠道\\\\\\\",    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"type\\\\\\\": \\\\\\\"面试数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"内推\\\\\\\",    \\\\\\\"value\\\\\\\": 45,    \\\\\\\"type\\\\\\\": \\\\\\\"面试数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"人才库\\\\\\\",    \\\\\\\"value\\\\\\\": 13,    \\\\\\\"type\\\\\\\": \\\\\\\"通过数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"招聘网站\\\\\\\",    \\\\\\\"value\\\\\\\": 24,    \\\\\\\"type\\\\\\\": \\\\\\\"通过数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"其他渠道\\\\\\\",    \\\\\\\"value\\\\\\\": 5,    \\\\\\\"type\\\\\\\": \\\\\\\"通过数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"内推\\\\\\\",    \\\\\\\"value\\\\\\\": 25,    \\\\\\\"type\\\\\\\": \\\\\\\"通过数\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":309},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":29,\\\"left\\\":31,\\\"bottom\\\":62,\\\"right\\\":8},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"多数据对比柱形图\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-07 23:44:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925744261687267328', NULL, '924603858451734528', NULL, 'JCommonTable', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"姓名\\\\\\\": \\\\\\\"陈萌萌\\\\\\\",    \\\\\\\"筛选简历数\\\\\\\": \\\\\\\"122\\\\\\\",    \\\\\\\"推给用人部门\\\\\\\": \\\\\\\"89\\\\\\\",    \\\\\\\"面试安排\\\\\\\": \\\\\\\"40\\\\\\\",    \\\\\\\"面试通过\\\\\\\": \\\\\\\"10\\\\\\\"  },  {    \\\\\\\"姓名\\\\\\\": \\\\\\\"肖强\\\\\\\",    \\\\\\\"筛选简历数\\\\\\\": \\\\\\\"62\\\\\\\",    \\\\\\\"推给用人部门\\\\\\\": \\\\\\\"19\\\\\\\",    \\\\\\\"面试安排\\\\\\\": \\\\\\\"9\\\\\\\",    \\\\\\\"面试通过\\\\\\\": \\\\\\\"1\\\\\\\"  },  {    \\\\\\\"姓名\\\\\\\": \\\\\\\"陈晨\\\\\\\",    \\\\\\\"筛选简历数\\\\\\\": \\\\\\\"97\\\\\\\",    \\\\\\\"推给用人部门\\\\\\\": \\\\\\\"49\\\\\\\",    \\\\\\\"面试安排\\\\\\\": \\\\\\\"29\\\\\\\",    \\\\\\\"面试通过\\\\\\\": \\\\\\\"15\\\\\\\"  },  {    \\\\\\\"姓名\\\\\\\": \\\\\\\"李丽\\\\\\\",    \\\\\\\"筛选简历数\\\\\\\": \\\\\\\"47\\\\\\\",    \\\\\\\"推给用人部门\\\\\\\": \\\\\\\"29\\\\\\\",    \\\\\\\"面试安排\\\\\\\": \\\\\\\"19\\\\\\\",    \\\\\\\"面试通过\\\\\\\": \\\\\\\"5\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":605,\\\"height\\\":309},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":24,\\\"dataType\\\":1,\\\"h\\\":42,\\\"linkageConfig\\\":[],\\\"timeOut\\\":-1,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#50E3C2\\\",\\\"headerColor\\\":\\\"#7ED321\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}}}}', 'admin', '2024-03-07 23:44:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925744261712433152', NULL, '924603858451734528', NULL, 'JText', '{\\\"chartData\\\":\\\"招聘工作量细化\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":605,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":11},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-07 23:44:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925744261745987584', NULL, '924603858451734528', NULL, 'JText', '{\\\"chartData\\\":\\\"工作年限对岗位偏好与匹配\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":8},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-07 23:44:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925744261766959104', NULL, '924603858451734528', NULL, 'JStackBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"不满1年\\\\\\\",    \\\\\\\"value\\\\\\\": 150,    \\\\\\\"type\\\\\\\": \\\\\\\"投递数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"1-3年\\\\\\\",    \\\\\\\"value\\\\\\\": 269,    \\\\\\\"type\\\\\\\": \\\\\\\"投递数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3-5年\\\\\\\",    \\\\\\\"value\\\\\\\": 81,    \\\\\\\"type\\\\\\\": \\\\\\\"投递数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5-10年\\\\\\\",    \\\\\\\"value\\\\\\\": 67,    \\\\\\\"type\\\\\\\": \\\\\\\"投递数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"不满1年\\\\\\\",    \\\\\\\"value\\\\\\\": 50,    \\\\\\\"type\\\\\\\": \\\\\\\"面试数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"1-3年\\\\\\\",    \\\\\\\"value\\\\\\\": 100,    \\\\\\\"type\\\\\\\": \\\\\\\"面试数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3-5年\\\\\\\",    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"type\\\\\\\": \\\\\\\"面试数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5-10年\\\\\\\",    \\\\\\\"value\\\\\\\": 45,    \\\\\\\"type\\\\\\\": \\\\\\\"面试数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"不满1年\\\\\\\",    \\\\\\\"value\\\\\\\": 13,    \\\\\\\"type\\\\\\\": \\\\\\\"通过数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"1-3年\\\\\\\",    \\\\\\\"value\\\\\\\": 24,    \\\\\\\"type\\\\\\\": \\\\\\\"通过数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3-5年\\\\\\\",    \\\\\\\"value\\\\\\\": 5,    \\\\\\\"type\\\\\\\": \\\\\\\"通过数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5-10年\\\\\\\",    \\\\\\\"value\\\\\\\": 25,    \\\\\\\"type\\\\\\\": \\\\\\\"通过数\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":309},\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#7ED321\\\"},{\\\"color\\\":\\\"#F8E71C\\\"},{\\\"color\\\":\\\"#F5A623\\\"}],\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"堆叠柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-07 23:44:02', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667610906624', NULL, '925744661614153728', NULL, 'JText', '{\\\"chartData\\\":\\\"金融风控数据展示\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1604,\\\"height\\\":78},\\\"background\\\":\\\"#4A90E2\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":500},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667648655360', NULL, '925744661614153728', NULL, 'JText', '{\\\"chartData\\\":\\\"复借用户数\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":56},\\\"background\\\":\\\"#22B6D4\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":39},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667665432576', NULL, '925744661614153728', NULL, 'JText', '{\\\"chartData\\\":\\\"38611人\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":67},\\\"background\\\":\\\"#22B6D4\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":19,\\\"marginLeft\\\":50},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667682209792', NULL, '925744661614153728', NULL, 'JText', '{\\\"chartData\\\":\\\"累计申请人数\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":56},\\\"background\\\":\\\"#69AAF5\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":32},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667698987008', NULL, '925744661614153728', NULL, 'JText', '{\\\"chartData\\\":\\\"258909人\\\",\\\"borderColor\\\":\\\"#69AAF5\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":67},\\\"background\\\":\\\"#4A90E2\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":16,\\\"marginLeft\\\":45},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667715764224', NULL, '925744661614153728', NULL, 'JText', '{\\\"chartData\\\":\\\"89.5%\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":56},\\\"background\\\":\\\"#B05FB3\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":8,\\\"marginLeft\\\":63},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667732541440', NULL, '925744661614153728', NULL, 'JText', '{\\\"chartData\\\":\\\"放贷率\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":56},\\\"background\\\":\\\"#B05FB3\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":60},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667753512960', NULL, '925744661614153728', NULL, 'JText', '{\\\"chartData\\\":\\\"36.82亿\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":56},\\\"background\\\":\\\"#8B572A\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":56},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667774484480', NULL, '925744661614153728', NULL, 'JPie', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 1048,    \\\\\\\"name\\\\\\\": \\\\\\\"男\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 735,    \\\\\\\"name\\\\\\\": \\\\\\\"女\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":375},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":45,\\\"left\\\":43,\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\",\\\"t\\\":2,\\\"show\\\":true},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"男女性别比例\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667795456000', NULL, '925744661614153728', NULL, 'JText', '{\\\"chartData\\\":\\\"214367人\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":67},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":16,\\\"marginLeft\\\":46},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667808038912', NULL, '925744661614153728', NULL, 'JText', '{\\\"chartData\\\":\\\"累计放贷用户数\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":56},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":25},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667824816128', NULL, '925744661614153728', NULL, 'JText', '{\\\"chartData\\\":\\\"累计放贷金额\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":56},\\\"background\\\":\\\"#8B572A\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":30},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667841593344', NULL, '925744661614153728', NULL, 'JDynamicBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"未到期\\\\\\\",    \\\\\\\"value\\\\\\\": 13100000  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"1-30天\\\\\\\",    \\\\\\\"value\\\\\\\": 14100000  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"31-60天\\\\\\\",    \\\\\\\"value\\\\\\\": 31050000  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"61-90天\\\\\\\",    \\\\\\\"value\\\\\\\": 530000  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"90天以上\\\\\\\",    \\\\\\\"value\\\\\\\": 4100009  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":595,\\\"height\\\":265},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":46,\\\"left\\\":61,\\\"bottom\\\":73,\\\"right\\\":40},\\\"series\\\":[{\\\"showBackground\\\":false,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"#51626E\\\"},\\\"itemStyle\\\":{\\\"color\\\":\\\"#EDA737\\\"}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"top\\\":1,\\\"left\\\":159,\\\"text\\\":\\\"账龄分布\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#F5A623\\\",\\\"fontSize\\\":20},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667858370560', NULL, '925744661614153728', NULL, 'JText', '{\\\"chartData\\\":\\\"59.38亿\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":56},\\\"background\\\":\\\"#50E3C2\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":54},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667875147776', NULL, '925744661614153728', NULL, 'JText', '{\\\"chartData\\\":\\\"累计申请金额\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":56},\\\"background\\\":\\\"#50E3C2\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":28},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667896119296', NULL, '925744661614153728', NULL, 'JMultipleLine', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",    \\\\\\\"value\\\\\\\": 3,    \\\\\\\"type\\\\\\\": \\\\\\\"2022年月平均\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",    \\\\\\\"value\\\\\\\": 4,    \\\\\\\"type\\\\\\\": \\\\\\\"2022年月平均\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",    \\\\\\\"value\\\\\\\": 3.5,    \\\\\\\"type\\\\\\\": \\\\\\\"2022年月平均\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",    \\\\\\\"value\\\\\\\": 5,    \\\\\\\"type\\\\\\\": \\\\\\\"2022年月平均\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",    \\\\\\\"value\\\\\\\": 4.9,    \\\\\\\"type\\\\\\\": \\\\\\\"2022年月平均\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",    \\\\\\\"value\\\\\\\": 6,    \\\\\\\"type\\\\\\\": \\\\\\\"2022年月平均\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"7月\\\\\\\",    \\\\\\\"value\\\\\\\": 7,    \\\\\\\"type\\\\\\\": \\\\\\\"2022年月平均\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"8月\\\\\\\",    \\\\\\\"value\\\\\\\": 9,    \\\\\\\"type\\\\\\\": \\\\\\\"2022年月平均\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"9月\\\\\\\",    \\\\\\\"value\\\\\\\": 13,    \\\\\\\"type\\\\\\\": \\\\\\\"2022年月平均\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",    \\\\\\\"value\\\\\\\": 6,    \\\\\\\"type\\\\\\\": \\\\\\\"2023年月平均\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",    \\\\\\\"value\\\\\\\": 8,    \\\\\\\"type\\\\\\\": \\\\\\\"2023年月平均\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",    \\\\\\\"value\\\\\\\": 7,    \\\\\\\"type\\\\\\\": \\\\\\\"2023年月平均\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"type\\\\\\\": \\\\\\\"2023年月平均\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",    \\\\\\\"value\\\\\\\": 11,    \\\\\\\"type\\\\\\\": \\\\\\\"2023年月平均\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",    \\\\\\\"value\\\\\\\": 4,    \\\\\\\"type\\\\\\\": \\\\\\\"2023年月平均\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"7月\\\\\\\",    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"type\\\\\\\": \\\\\\\"2023年月平均\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"8月\\\\\\\",    \\\\\\\"value\\\\\\\": 16,    \\\\\\\"type\\\\\\\": \\\\\\\"2023年月平均\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"9月\\\\\\\",    \\\\\\\"value\\\\\\\": 9,    \\\\\\\"type\\\\\\\": \\\\\\\"2023年月平均\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":663,\\\"height\\\":309},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"每月平均申请数\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667912896512', NULL, '925744661614153728', NULL, 'JPie', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 1048,    \\\\\\\"name\\\\\\\": \\\\\\\"1年\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 735,    \\\\\\\"name\\\\\\\": \\\\\\\"1-5年\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 580,    \\\\\\\"name\\\\\\\": \\\\\\\"5年以上\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":298},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":48,\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\",\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"isRadius\\\":false,\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"贷款期限分布\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667938062336', NULL, '925744661614153728', NULL, 'JRing', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 121,    \\\\\\\"name\\\\\\\": \\\\\\\"按时还款\\\\\\\"    },  {    \\\\\\\"value\\\\\\\": 251,    \\\\\\\"name\\\\\\\": \\\\\\\"逾期未还\\\\\\\"    },  {    \\\\\\\"value\\\\\\\": 580,    \\\\\\\"name\\\\\\\": \\\\\\\"逾期已还\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":254},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"总体放贷情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667954839552', NULL, '925744661614153728', NULL, 'JRing', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 121,    \\\\\\\"name\\\\\\\": \\\\\\\"可疑\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 251,    \\\\\\\"name\\\\\\\": \\\\\\\"正常\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 580,    \\\\\\\"name\\\\\\\": \\\\\\\"不良\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 80,    \\\\\\\"name\\\\\\\": \\\\\\\"次级\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 620,    \\\\\\\"name\\\\\\\": \\\\\\\"关注\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":382,\\\"height\\\":320},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"show\\\":false,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"show\\\":false},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"贷款状态跟踪\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925962667967422464', NULL, '925744661614153728', NULL, 'JDynamicBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"高中以下\\\\\\\",    \\\\\\\"value\\\\\\\": 131265  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"大学\\\\\\\",    \\\\\\\"value\\\\\\\": 71410  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"硕士及以上\\\\\\\",    \\\\\\\"value\\\\\\\": 1523  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":663,\\\"height\\\":320},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":54,\\\"left\\\":71,\\\"bottom\\\":86,\\\"right\\\":48},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"text\\\":\\\"贷款人群学历分布\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 14:11:54', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666560327680', NULL, '925966805971279872', NULL, 'JText', '{\\\"chartData\\\":\\\"XX车间生产管理\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1604,\\\"height\\\":78},\\\"background\\\":\\\"#4A90E2\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":500},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666589687808', NULL, '925966805971279872', NULL, 'JText', '{\\\"chartData\\\":\\\"当日产量\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":45},\\\"background\\\":\\\"#22B6D4\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":52},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666602270720', NULL, '925966805971279872', NULL, 'JText', '{\\\"chartData\\\":\\\"15386\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":56},\\\"background\\\":\\\"#22B6D4\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":70},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666619047936', NULL, '925966805971279872', NULL, 'JText', '{\\\"chartData\\\":\\\"当月产量\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":45},\\\"background\\\":\\\"#69AAF5\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":44},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666640019456', NULL, '925966805971279872', NULL, 'JText', '{\\\"chartData\\\":\\\"589615\\\",\\\"borderColor\\\":\\\"#69AAF5\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":56},\\\"background\\\":\\\"#4A90E2\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":47},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666660990976', NULL, '925966805971279872', NULL, 'JFunnel', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 15,    \\\\\\\"name\\\\\\\": \\\\\\\"生产1部\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 5,    \\\\\\\"name\\\\\\\": \\\\\\\"生产3部\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 23,    \\\\\\\"name\\\\\\\": \\\\\\\"生产2部\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"name\\\\\\\": \\\\\\\"生产4部\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 234,    \\\\\\\"name\\\\\\\": \\\\\\\"生产5部\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":331},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/funnel\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115},\\\"legend\\\":{\\\"orient\\\":\\\"horizontal\\\"},\\\"series\\\":[{\\\"left\\\":\\\"10%\\\",\\\"gap\\\":2,\\\"name\\\":\\\"Funnel\\\",\\\"width\\\":\\\"80%\\\",\\\"emphasis\\\":{\\\"label\\\":{\\\"fontSize\\\":20}},\\\"itemStyle\\\":{\\\"borderColor\\\":\\\"#fff\\\",\\\"borderWidth\\\":1},\\\"sort\\\":\\\"descending\\\",\\\"label\\\":{\\\"show\\\":true,\\\"position\\\":\\\"inside\\\"},\\\"labelLine\\\":{\\\"lineStyle\\\":{\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"length\\\":10},\\\"type\\\":\\\"funnel\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a} <br/>{b} : {c}%\\\",\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础漏斗图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666677768192', NULL, '925966805971279872', NULL, 'JText', '{\\\"chartData\\\":\\\"月投入产出比\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":45},\\\"background\\\":\\\"#A69C32\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":31},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666698739712', NULL, '925966805971279872', NULL, 'JText', '{\\\"chartData\\\":\\\"日目标达成率\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":45},\\\"background\\\":\\\"#61C9B3\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":3,\\\"marginLeft\\\":31},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666715516928', NULL, '925966805971279872', NULL, 'JText', '{\\\"chartData\\\":\\\"86%\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":56},\\\"background\\\":\\\"#61C9B3\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":68},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666732294144', NULL, '925966805971279872', NULL, 'JSmoothLine', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 60,    \\\\\\\"name\\\\\\\": \\\\\\\"8:00\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 55,    \\\\\\\"name\\\\\\\": \\\\\\\"10:00\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 86,    \\\\\\\"name\\\\\\\": \\\\\\\"12:00\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 70,    \\\\\\\"name\\\\\\\": \\\\\\\"14:00\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 90,    \\\\\\\"name\\\\\\\": \\\\\\\"16:00\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"name\\\\\\\": \\\\\\\"18:00\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":394,\\\"height\\\":254},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":33,\\\"left\\\":23,\\\"bottom\\\":77,\\\"show\\\":false,\\\"right\\\":25},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\",\\\"smooth\\\":true}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"top\\\":1,\\\"left\\\":1,\\\"text\\\":\\\"产能效率\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666749071360', NULL, '925966805971279872', NULL, 'JText', '{\\\"chartData\\\":\\\"90%\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":56},\\\"background\\\":\\\"#A69C32\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":68},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666770042880', NULL, '925966805971279872', NULL, 'JMultipleBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"生产一部\\\\\\\",    \\\\\\\"value\\\\\\\": 150,    \\\\\\\"type\\\\\\\": \\\\\\\"人工成本\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"生产二部\\\\\\\",    \\\\\\\"value\\\\\\\": 269,    \\\\\\\"type\\\\\\\": \\\\\\\"人工成本\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"生产三部\\\\\\\",    \\\\\\\"value\\\\\\\": 81,    \\\\\\\"type\\\\\\\": \\\\\\\"人工成本\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"生产四部\\\\\\\",    \\\\\\\"value\\\\\\\": 67,    \\\\\\\"type\\\\\\\": \\\\\\\"人工成本\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"生产一部\\\\\\\",    \\\\\\\"value\\\\\\\": 50,    \\\\\\\"type\\\\\\\": \\\\\\\"采购成本\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"生产二部\\\\\\\",    \\\\\\\"value\\\\\\\": 100,    \\\\\\\"type\\\\\\\": \\\\\\\"采购成本\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"生产三部\\\\\\\",    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"type\\\\\\\": \\\\\\\"采购成本\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"生产四部\\\\\\\",    \\\\\\\"value\\\\\\\": 45,    \\\\\\\"type\\\\\\\": \\\\\\\"采购成本\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"生产一部\\\\\\\",    \\\\\\\"value\\\\\\\": 13,    \\\\\\\"type\\\\\\\": \\\\\\\"生产成本\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"生产二部\\\\\\\",    \\\\\\\"value\\\\\\\": 24,    \\\\\\\"type\\\\\\\": \\\\\\\"生产成本\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"生产三部\\\\\\\",    \\\\\\\"value\\\\\\\": 5,    \\\\\\\"type\\\\\\\": \\\\\\\"生产成本\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"生产四部\\\\\\\",    \\\\\\\"value\\\\\\\": 25,    \\\\\\\"type\\\\\\\": \\\\\\\"生产成本\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":309},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":29,\\\"left\\\":31,\\\"bottom\\\":62,\\\"right\\\":8},\\\"series\\\":[],\\\"legend\\\":{\\\"r\\\":1},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"成本控制\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666786820096', NULL, '925966805971279872', NULL, 'JCommonTable', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"产品线\\\\\\\": \\\\\\\"1号产线\\\\\\\",    \\\\\\\"一次通过数\\\\\\\": \\\\\\\"122\\\\\\\",    \\\\\\\"一次未合格\\\\\\\": \\\\\\\"89\\\\\\\"  },  {    \\\\\\\"产品线\\\\\\\": \\\\\\\"2号产线\\\\\\\",    \\\\\\\"一次通过数\\\\\\\": \\\\\\\"122\\\\\\\",    \\\\\\\"一次未合格\\\\\\\": \\\\\\\"89\\\\\\\"  },  {    \\\\\\\"产品线\\\\\\\": \\\\\\\"3号产线\\\\\\\",    \\\\\\\"一次通过数\\\\\\\": \\\\\\\"122\\\\\\\",    \\\\\\\"一次未合格\\\\\\\": \\\\\\\"89\\\\\\\"  },  {    \\\\\\\"产品线\\\\\\\": \\\\\\\"4号产线\\\\\\\",    \\\\\\\"一次通过数\\\\\\\": \\\\\\\"122\\\\\\\",    \\\\\\\"一次未合格\\\\\\\": \\\\\\\"89\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":394,\\\"height\\\":397},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":24,\\\"dataType\\\":1,\\\"h\\\":42,\\\"linkageConfig\\\":[],\\\"timeOut\\\":-1,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#50E3C2\\\",\\\"headerColor\\\":\\\"#7ED321\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}}}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666803597312', NULL, '925966805971279872', NULL, 'JText', '{\\\"chartData\\\":\\\"设备监控\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":605,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":322},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666828763136', NULL, '925966805971279872', NULL, 'JText', '{\\\"chartData\\\":\\\"投入产出监控\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":298,\\\"height\\\":45},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":124},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666849734656', NULL, '925966805971279872', NULL, 'JStackBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"1号产线\\\\\\\",    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"type\\\\\\\": \\\\\\\"缺勤人数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"2号产线\\\\\\\",    \\\\\\\"value\\\\\\\": 8,    \\\\\\\"type\\\\\\\": \\\\\\\"缺勤人数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3号产线\\\\\\\",    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"type\\\\\\\": \\\\\\\"缺勤人数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"4号产线\\\\\\\",    \\\\\\\"value\\\\\\\": 4,    \\\\\\\"type\\\\\\\": \\\\\\\"缺勤人数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"1号产线\\\\\\\",    \\\\\\\"value\\\\\\\": 35,    \\\\\\\"type\\\\\\\": \\\\\\\"出勤人数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"2号产线\\\\\\\",    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"type\\\\\\\": \\\\\\\"出勤人数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3号产线\\\\\\\",    \\\\\\\"value\\\\\\\": 50,    \\\\\\\"type\\\\\\\": \\\\\\\"出勤人数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"4号产线\\\\\\\",    \\\\\\\"value\\\\\\\": 45,    \\\\\\\"type\\\\\\\": \\\\\\\"出勤人数\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":394,\\\"height\\\":188},\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#7ED321\\\"},{\\\"color\\\":\\\"#F8E71C\\\"},{\\\"color\\\":\\\"#F5A623\\\"}],\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115},\\\"series\\\":[{\\\"label\\\":{\\\"color\\\":\\\"#000000\\\"}}],\\\"legend\\\":{\\\"t\\\":1},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"top\\\":1,\\\"show\\\":true,\\\"text\\\":\\\"产线出勤人数\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666866511872', NULL, '925966805971279872', NULL, 'JCommonTable', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"订单号\\\\\\\": \\\\\\\"DD001\\\\\\\",    \\\\\\\"需求量\\\\\\\": \\\\\\\"59658\\\\\\\",    \\\\\\\"库存量\\\\\\\": \\\\\\\"7895\\\\\\\"  },  {    \\\\\\\"订单号\\\\\\\": \\\\\\\"DD002\\\\\\\",    \\\\\\\"需求量\\\\\\\": \\\\\\\"4658\\\\\\\",    \\\\\\\"库存量\\\\\\\": \\\\\\\"395\\\\\\\"  },  {    \\\\\\\"订单号\\\\\\\": \\\\\\\"DD003\\\\\\\",    \\\\\\\"需求量\\\\\\\": \\\\\\\"89658\\\\\\\",    \\\\\\\"库存量\\\\\\\": \\\\\\\"1895\\\\\\\"  },  {    \\\\\\\"订单号\\\\\\\": \\\\\\\"DD004\\\\\\\",    \\\\\\\"需求量\\\\\\\": \\\\\\\"39658\\\\\\\",    \\\\\\\"库存量\\\\\\\": \\\\\\\"9905\\\\\\\"  },  {    \\\\\\\"订单号\\\\\\\": \\\\\\\"DD005\\\\\\\",    \\\\\\\"需求量\\\\\\\": \\\\\\\"79658\\\\\\\",    \\\\\\\"库存量\\\\\\\": \\\\\\\"7895\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":394,\\\"height\\\":364},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":24,\\\"dataType\\\":1,\\\"h\\\":42,\\\"linkageConfig\\\":[],\\\"timeOut\\\":-1,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}}}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666879094784', NULL, '925966805971279872', NULL, 'JMixLineBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"1号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 110,    \\\\\\\"type\\\\\\\": \\\\\\\"通过质检数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"2号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 130,    \\\\\\\"type\\\\\\\": \\\\\\\"通过质检数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 113.5,    \\\\\\\"type\\\\\\\": \\\\\\\"通过率\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"4号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 150,    \\\\\\\"type\\\\\\\": \\\\\\\"通过质检数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 240.9,    \\\\\\\"type\\\\\\\": \\\\\\\"通过质检数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"6号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 160,    \\\\\\\"type\\\\\\\": \\\\\\\"通过质检数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"7号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 97,    \\\\\\\"type\\\\\\\": \\\\\\\"通过质检数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"8号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 290,    \\\\\\\"type\\\\\\\": \\\\\\\"通过质检数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"9号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 230,    \\\\\\\"type\\\\\\\": \\\\\\\"通过质检数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"1号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 133,    \\\\\\\"type\\\\\\\": \\\\\\\"未通过质检数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"2号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 235,    \\\\\\\"type\\\\\\\": \\\\\\\"未通过质检数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 187,    \\\\\\\"type\\\\\\\": \\\\\\\"未通过质检数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"4号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 35,    \\\\\\\"type\\\\\\\": \\\\\\\"未通过质检数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 69,    \\\\\\\"type\\\\\\\": \\\\\\\"未通过质检数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"6号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 100,    \\\\\\\"type\\\\\\\": \\\\\\\"未通过质检数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"7号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 37,    \\\\\\\"type\\\\\\\": \\\\\\\"未通过质检数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"8号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"type\\\\\\\": \\\\\\\"未通过质检数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"9号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 33,    \\\\\\\"type\\\\\\\": \\\\\\\"未通过质检数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"1号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 12,    \\\\\\\"type\\\\\\\": \\\\\\\"通过率\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"2号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 5,    \\\\\\\"type\\\\\\\": \\\\\\\"通过率\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"type\\\\\\\": \\\\\\\"通过率\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"4号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 15,    \\\\\\\"type\\\\\\\": \\\\\\\"通过率\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 24,    \\\\\\\"type\\\\\\\": \\\\\\\"通过率\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"6号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 16,    \\\\\\\"type\\\\\\\": \\\\\\\"通过率\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"7号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 9,    \\\\\\\"type\\\\\\\": \\\\\\\"通过率\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"8号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 29,    \\\\\\\"type\\\\\\\": \\\\\\\"通过率\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"9号产品\\\\\\\",    \\\\\\\"value\\\\\\\": 23,    \\\\\\\"type\\\\\\\": \\\\\\\"通过率\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":797,\\\"height\\\":430},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"seriesType\\\":[{\\\"series\\\":\\\"通过质检数\\\",\\\"type\\\":\\\"bar\\\"},{\\\"series\\\":\\\"通过率\\\",\\\"type\\\":\\\"bar\\\"},{\\\"series\\\":\\\"未通过质检数\\\",\\\"type\\\":\\\"line\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"产量与不良率统计\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666904260608', NULL, '925966805971279872', NULL, 'JCommonTable', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"设备编号\\\\\\\": \\\\\\\"HT001\\\\\\\",    \\\\\\\"产品线\\\\\\\": \\\\\\\"6号产线\\\\\\\",    \\\\\\\"开始时间\\\\\\\": \\\\\\\"2023-10-24\\\\\\\",    \\\\\\\"产量损失\\\\\\\": \\\\\\\"1589\\\\\\\",    \\\\\\\"影响工时\\\\\\\": \\\\\\\"8\\\\\\\"  },  {    \\\\\\\"设备编号\\\\\\\": \\\\\\\"HT589\\\\\\\",    \\\\\\\"产品线\\\\\\\": \\\\\\\"4号产线\\\\\\\",    \\\\\\\"开始时间\\\\\\\": \\\\\\\"2023-11-14\\\\\\\",    \\\\\\\"产量损失\\\\\\\": \\\\\\\"89\\\\\\\",    \\\\\\\"影响工时\\\\\\\": \\\\\\\"3\\\\\\\"  },  {    \\\\\\\"设备编号\\\\\\\": \\\\\\\"HT008\\\\\\\",    \\\\\\\"产品线\\\\\\\": \\\\\\\"1号产线\\\\\\\",    \\\\\\\"开始时间\\\\\\\": \\\\\\\"2023-12-24\\\\\\\",    \\\\\\\"产量损失\\\\\\\": \\\\\\\"15\\\\\\\",    \\\\\\\"影响工时\\\\\\\": \\\\\\\"1\\\\\\\"  },  {    \\\\\\\"设备编号\\\\\\\": \\\\\\\"HT0034\\\\\\\",    \\\\\\\"产品线\\\\\\\": \\\\\\\"6号产线\\\\\\\",    \\\\\\\"开始时间\\\\\\\": \\\\\\\"2023-10-24\\\\\\\",    \\\\\\\"产量损失\\\\\\\": \\\\\\\"1589\\\\\\\",    \\\\\\\"影响工时\\\\\\\": \\\\\\\"10\\\\\\\"  },  {    \\\\\\\"设备编号\\\\\\\": \\\\\\\"HT0011\\\\\\\",    \\\\\\\"产品线\\\\\\\": \\\\\\\"6号产线\\\\\\\",    \\\\\\\"开始时间\\\\\\\": \\\\\\\"2023-10-24\\\\\\\",    \\\\\\\"产量损失\\\\\\\": \\\\\\\"3589\\\\\\\",    \\\\\\\"影响工时\\\\\\\": \\\\\\\"16\\\\\\\"  },  {    \\\\\\\"设备编号\\\\\\\": \\\\\\\"HT00113\\\\\\\",    \\\\\\\"产品线\\\\\\\": \\\\\\\"7号产线\\\\\\\",    \\\\\\\"开始时间\\\\\\\": \\\\\\\"2023-11-24\\\\\\\",    \\\\\\\"产量损失\\\\\\\": \\\\\\\"1589\\\\\\\",    \\\\\\\"影响工时\\\\\\\": \\\\\\\"8\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":461,\\\"height\\\":353},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":24,\\\"dataType\\\":1,\\\"h\\\":42,\\\"linkageConfig\\\":[],\\\"timeOut\\\":-1,\\\"option\\\":{}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('925987666925232128', NULL, '925966805971279872', NULL, 'JPie', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 1048,    \\\\\\\"name\\\\\\\": \\\\\\\"高负荷\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 735,    \\\\\\\"name\\\\\\\": \\\\\\\"检修\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 580,    \\\\\\\"name\\\\\\\": \\\\\\\"低速\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 484,    \\\\\\\"name\\\\\\\": \\\\\\\"正常\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":326,\\\"height\\\":353},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":false,\\\"text\\\":\\\"基础饼图\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-08 15:51:14', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733693940277248', NULL, '925988379923357696', NULL, 'JText', '{\\\"chartData\\\":\\\"2023年度消费者权益保护\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1604,\\\"height\\\":78},\\\"background\\\":\\\"#698F38\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":500},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733693998997504', NULL, '925988379923357696', NULL, 'JText', '{\\\"chartData\\\":\\\"消费维权信息量\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":56},\\\"background\\\":\\\"#22B6D4\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":24},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733694024163328', NULL, '925988379923357696', NULL, 'JText', '{\\\"chartData\\\":\\\"5823万\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":56},\\\"background\\\":\\\"#22B6D4\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":50},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733694045134848', NULL, '925988379923357696', NULL, 'JText', '{\\\"chartData\\\":\\\"网络传播热度指数\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":56},\\\"background\\\":\\\"#69AAF5\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":24},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733694066106368', NULL, '925988379923357696', NULL, 'JText', '{\\\"chartData\\\":\\\"86.23\\\",\\\"borderColor\\\":\\\"#69AAF5\\\",\\\"size\\\":{\\\"width\\\":144,\\\"height\\\":56},\\\"background\\\":\\\"#69AAF5\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":47},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733694087077888', NULL, '925988379923357696', NULL, 'JText', '{\\\"chartData\\\":\\\"头部用户影响力\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"background\\\":\\\"#E8F2DC\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":8},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733694099660800', NULL, '925988379923357696', NULL, 'JText', '{\\\"chartData\\\":\\\"消费维权信息走势\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"background\\\":\\\"#E8F2DC\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":3,\\\"marginLeft\\\":5},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733694116438016', NULL, '925988379923357696', NULL, 'JText', '{\\\"chartData\\\":\\\"消费维权数据盘点\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":663,\\\"height\\\":45},\\\"background\\\":\\\"#E8F2DC\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":3,\\\"marginLeft\\\":8},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733694141603840', NULL, '925988379923357696', NULL, 'JPie', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 1048,    \\\\\\\"name\\\\\\\": \\\\\\\"男性\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 735,    \\\\\\\"name\\\\\\\": \\\\\\\"女性\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":326,\\\"height\\\":265},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#B8E986\\\"},{\\\"color\\\":\\\"#7ED321\\\"}],\\\"grid\\\":{\\\"top\\\":41,\\\"left\\\":49,\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\",\\\"t\\\":2,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":false,\\\"text\\\":\\\"基础饼图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733694166769664', NULL, '925988379923357696', NULL, 'JSmoothLine', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 100,    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 150,    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 60,    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 190,    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 300,    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 200,    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 150,    \\\\\\\"name\\\\\\\": \\\\\\\"7月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 300,    \\\\\\\"name\\\\\\\": \\\\\\\"8月\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":243},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":33,\\\"left\\\":33,\\\"bottom\\\":77,\\\"show\\\":false,\\\"right\\\":25},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\",\\\"smooth\\\":true}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"top\\\":1,\\\"left\\\":1,\\\"show\\\":false,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733694179352576', NULL, '925988379923357696', NULL, 'JText', '{\\\"chartData\\\":\\\"博文阅读量：569万\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":259,\\\"height\\\":56},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#417505\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":37},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733694200324096', NULL, '925988379923357696', NULL, 'JText', '{\\\"chartData\\\":\\\"互动量：1.68 亿\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":56},\\\"background\\\":\\\"#DBEAFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"body\\\":{\\\"color\\\":\\\"#417505\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":21},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733694217101312', NULL, '925988379923357696', NULL, 'JText', '{\\\"chartData\\\":\\\"性别—年龄分布\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":663,\\\"height\\\":45},\\\"background\\\":\\\"#E8F2DC\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":8},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733694233878528', NULL, '925988379923357696', NULL, 'JText', '{\\\"chartData\\\":\\\"用户数：605万\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":192,\\\"height\\\":56},\\\"background\\\":\\\"#E6CDA5\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#417505\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":26},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733694246461440', NULL, '925988379923357696', NULL, 'JBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"70前\\\\\\\",    \\\\\\\"value\\\\\\\": 1879  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"70-80\\\\\\\",    \\\\\\\"value\\\\\\\": 3879  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"80-90\\\\\\\",    \\\\\\\"value\\\\\\\": 2879  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"95后\\\\\\\",    \\\\\\\"value\\\\\\\": 5479  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":326,\\\"height\\\":265},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"interval\\\":2}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":12,\\\"left\\\":38,\\\"bottom\\\":81,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":40,\\\"data\\\":[],\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733694259044352', NULL, '925988379923357696', NULL, 'JScatter', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",    \\\\\\\"value\\\\\\\": 300  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",    \\\\\\\"value\\\\\\\": 500  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",    \\\\\\\"value\\\\\\\": 920  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",    \\\\\\\"value\\\\\\\": 320  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",    \\\\\\\"value\\\\\\\": 200  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",    \\\\\\\"value\\\\\\\": 400  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"7月\\\\\\\",    \\\\\\\"value\\\\\\\": 260  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"8月\\\\\\\",    \\\\\\\"value\\\\\\\": 120  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":663,\\\"height\\\":364},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"symbolSize\\\":20,\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"label\\\":{\\\"color\\\":\\\"#787575\\\",\\\"show\\\":false},\\\"type\\\":\\\"scatter\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"x:{b}<br/>y:{c}\\\",\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"消费权益相关话题\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733694267432960', NULL, '925988379923357696', NULL, 'JStepLine', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 15,    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 29,    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":254},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"name\\\":\\\"阅读量(亿)\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":37,\\\"left\\\":34,\\\"bottom\\\":65,\\\"show\\\":false,\\\"right\\\":25},\\\"series\\\":[{\\\"data\\\":[],\\\"step\\\":\\\"middle\\\",\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":false,\\\"text\\\":\\\"阶梯折线图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733694284210176', NULL, '925988379923357696', NULL, 'JRing', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 1048,    \\\\\\\"name\\\\\\\": \\\\\\\"视频\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 735,    \\\\\\\"name\\\\\\\": \\\\\\\"网站\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 580,    \\\\\\\"name\\\\\\\": \\\\\\\"微信\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 484,    \\\\\\\"name\\\\\\\": \\\\\\\"微博\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 300,    \\\\\\\"name\\\\\\\": \\\\\\\"客户端\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":394,\\\"height\\\":408},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#70B324\\\"},{\\\"color\\\":\\\"#50E3C2\\\"},{\\\"color\\\":\\\"#F0E032\\\"},{\\\"color\\\":\\\"#7ED321\\\"},{\\\"color\\\":\\\"#FFA600\\\"}],\\\"grid\\\":{\\\"top\\\":49,\\\"left\\\":51,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":true,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"show\\\":false},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"top\\\":1,\\\"left\\\":1,\\\"show\\\":true,\\\"text\\\":\\\"内容来源占比\\\",\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733694296793088', NULL, '925988379923357696', NULL, 'JProgress', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"阅读量\\\\\\\",    \\\\\\\"value\\\\\\\": 69.86  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":155},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#000000\\\"}},\\\"grid\\\":{\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":19,\\\"color\\\":\\\"#417505\\\",\\\"itemStyle\\\":{\\\"normal\\\":{\\\"barBorderRadius\\\":10}},\\\"zlevel\\\":1,\\\"label\\\":{\\\"formatter\\\":\\\"{c}{a}\\\",\\\"offset\\\":[0,-40],\\\"color\\\":\\\"black\\\",\\\"show\\\":true,\\\"fontSize\\\":24,\\\"position\\\":\\\"right\\\"}},{\\\"barWidth\\\":19,\\\"color\\\":\\\"#DCF2C2\\\",\\\"barGap\\\":\\\"-100%\\\",\\\"itemStyle\\\":{\\\"normal\\\":{\\\"barBorderRadius\\\":10}},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础进度图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927733694309376000', NULL, '925988379923357696', NULL, 'JPie', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 1048,    \\\\\\\"name\\\\\\\": \\\\\\\"中性信息\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 735,    \\\\\\\"name\\\\\\\": \\\\\\\"敏感信息\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 580,    \\\\\\\"name\\\\\\\": \\\\\\\"非敏感信息\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":394,\\\"height\\\":232},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#417505\\\"},{\\\"color\\\":\\\"#B8E986\\\"},{\\\"color\\\":\\\"#F5A623\\\"}],\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\",\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"isRadius\\\":false,\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"outRadius\\\":43,\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"敏感信息与非敏感信息占比\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"innerRadius\\\":87,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 11:29:19', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927766205680885760', NULL, '925988240575995904', NULL, 'JText', '{\\\"chartData\\\":\\\"2023年度医美行业网络关注度\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1604,\\\"height\\\":78},\\\"background\\\":\\\"#23BAD9\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":500},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 13:38:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927766205706051584', NULL, '925988240575995904', NULL, 'JText', '{\\\"chartData\\\":\\\"公立整形外科热度指数TOP10美誉度\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":56},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":13,\\\"marginLeft\\\":24},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 13:38:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927766205718634496', NULL, '925988240575995904', NULL, 'JText', '{\\\"chartData\\\":\\\"敏感信息与非敏感信息占比\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":56},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":11},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 13:38:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927766205731217408', NULL, '925988240575995904', NULL, 'JText', '{\\\"chartData\\\":\\\"医美行业事件\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":56},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":24},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 13:38:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927766205743800320', NULL, '925988240575995904', NULL, 'JFunnel', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 15,    \\\\\\\"name\\\\\\\": \\\\\\\"美白针\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 5,    \\\\\\\"name\\\\\\\": \\\\\\\"光子嫩肤\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 23,    \\\\\\\"name\\\\\\\": \\\\\\\"半永久纹眉\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"name\\\\\\\": \\\\\\\"果酸换肤\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 234,    \\\\\\\"name\\\\\\\": \\\\\\\"全瓷牙\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":320},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/funnel\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"bottom\\\":115},\\\"legend\\\":{\\\"orient\\\":\\\"horizontal\\\"},\\\"series\\\":[{\\\"left\\\":\\\"10%\\\",\\\"gap\\\":2,\\\"name\\\":\\\"Funnel\\\",\\\"width\\\":\\\"80%\\\",\\\"emphasis\\\":{\\\"label\\\":{\\\"fontSize\\\":20}},\\\"itemStyle\\\":{\\\"borderColor\\\":\\\"#fff\\\",\\\"borderWidth\\\":1},\\\"sort\\\":\\\"descending\\\",\\\"label\\\":{\\\"color\\\":\\\"#787575\\\",\\\"show\\\":true,\\\"position\\\":\\\"inside\\\"},\\\"labelLine\\\":{\\\"lineStyle\\\":{\\\"width\\\":1,\\\"type\\\":\\\"solid\\\"},\\\"length\\\":10},\\\"type\\\":\\\"funnel\\\"}],\\\"tooltip\\\":{\\\"formatter\\\":\\\"{a} <br/>{b} : {c}%\\\",\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础漏斗图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 13:38:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927766205756383232', NULL, '925988240575995904', NULL, 'JText', '{\\\"chartData\\\":\\\"非公立连锁医美机构热度指数TOP10\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":8},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 13:38:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927766205773160448', NULL, '925988240575995904', NULL, 'JText', '{\\\"chartData\\\":\\\"医美行业全网信息量走势\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":3,\\\"marginLeft\\\":5},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 13:38:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927766205794131968', NULL, '925988240575995904', NULL, 'JText', '{\\\"chartData\\\":\\\"医美项目热度\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":3,\\\"marginLeft\\\":8},\\\"title\\\":{\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 13:38:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927766205806714880', NULL, '925988240575995904', NULL, 'JSmoothLine', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 15,    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 6,    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 19,    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 30,    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 20,    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":320},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":33,\\\"left\\\":23,\\\"bottom\\\":77,\\\"show\\\":false,\\\"right\\\":25},\\\"series\\\":[{\\\"data\\\":[],\\\"type\\\":\\\"line\\\",\\\"smooth\\\":true}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"top\\\":1,\\\"left\\\":1,\\\"show\\\":false,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 13:38:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927766205823492096', NULL, '925988240575995904', NULL, 'JText', '{\\\"chartData\\\":\\\"公立整形外科热度指数TOP10\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":3,\\\"marginLeft\\\":5},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 13:38:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927766205836075008', NULL, '925988240575995904', NULL, 'JMultipleBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"19岁以下\\\\\\\",    \\\\\\\"value\\\\\\\": 150,    \\\\\\\"type\\\\\\\": \\\\\\\"光子嫩肤\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"20-29岁\\\\\\\",    \\\\\\\"value\\\\\\\": 269,    \\\\\\\"type\\\\\\\": \\\\\\\"光子嫩肤\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"30-39岁\\\\\\\",    \\\\\\\"value\\\\\\\": 81,    \\\\\\\"type\\\\\\\": \\\\\\\"光子嫩肤\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"39岁以上\\\\\\\",    \\\\\\\"value\\\\\\\": 67,    \\\\\\\"type\\\\\\\": \\\\\\\"光子嫩肤\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"19岁以下\\\\\\\",    \\\\\\\"value\\\\\\\": 50,    \\\\\\\"type\\\\\\\": \\\\\\\"热玛吉\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"20-29岁\\\\\\\",    \\\\\\\"value\\\\\\\": 100,    \\\\\\\"type\\\\\\\": \\\\\\\"热玛吉\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"30-39岁\\\\\\\",    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"type\\\\\\\": \\\\\\\"热玛吉\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"39岁以上\\\\\\\",    \\\\\\\"value\\\\\\\": 45,    \\\\\\\"type\\\\\\\": \\\\\\\"热玛吉\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"19岁以下\\\\\\\",    \\\\\\\"value\\\\\\\": 13,    \\\\\\\"type\\\\\\\": \\\\\\\"水光针\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"20-29岁\\\\\\\",    \\\\\\\"value\\\\\\\": 24,    \\\\\\\"type\\\\\\\": \\\\\\\"水光针\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"30-39岁\\\\\\\",    \\\\\\\"value\\\\\\\": 5,    \\\\\\\"type\\\\\\\": \\\\\\\"水光针\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"39岁以上\\\\\\\",    \\\\\\\"value\\\\\\\": 25,    \\\\\\\"type\\\\\\\": \\\\\\\"水光针\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":320},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":29,\\\"left\\\":31,\\\"bottom\\\":62,\\\"right\\\":8},\\\"series\\\":[{\\\"label\\\":{\\\"color\\\":\\\"#787575\\\"}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"多数据对比柱形图\\\",\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 13:38:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927766205852852224', NULL, '925988240575995904', NULL, 'JText', '{\\\"chartData\\\":\\\"医美行业热点事件TOP50分类\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#FFFFFF\\\",\\\"headerColor\\\":\\\"#000000\\\",\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"bodyColor\\\":\\\"#000000\\\",\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":11},\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 13:38:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927766205865435136', NULL, '925988240575995904', NULL, 'JText', '{\\\"chartData\\\":\\\"各年龄段对医美项目TOP3关注度对比\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":45},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#23BAD9\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":5,\\\"marginLeft\\\":8},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 13:38:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927766205873823744', NULL, '925988240575995904', NULL, 'JMixLineBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"华美美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 10,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度指数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"美莱美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 9,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度指数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"爱美美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 5,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度指数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"一星美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 9,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度指数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"慧美美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 2,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度指数\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"华美美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 33,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"美莱美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 35,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"爱美美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 37,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"一星美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 35,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"慧美美容院\\\\\\\",    \\\\\\\"value\\\\\\\": 34.9,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":320},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"seriesType\\\":[{\\\"series\\\":\\\"传播热度指数\\\",\\\"type\\\":\\\"bar\\\"},{\\\"series\\\":\\\"美誉度\\\",\\\"type\\\":\\\"line\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"rotate\\\":-33,\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115},\\\"series\\\":[],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"折柱图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 13:38:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927766205890600960', NULL, '925988240575995904', NULL, 'JDynamicBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"江苏人民医院\\\\\\\",    \\\\\\\"value\\\\\\\": 55,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"上海人民医院\\\\\\\",    \\\\\\\"value\\\\\\\": 14,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京大学第一医院\\\\\\\",    \\\\\\\"value\\\\\\\": 31.5,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京朝阳医院\\\\\\\",    \\\\\\\"value\\\\\\\": 53,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京协和医院\\\\\\\",    \\\\\\\"value\\\\\\\": 41.9,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"八大处医院\\\\\\\",    \\\\\\\"value\\\\\\\": 61,    \\\\\\\"type\\\\\\\": \\\\\\\"传播热度\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":320},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":8,\\\"left\\\":113,\\\"bottom\\\":71,\\\"right\\\":59},\\\"series\\\":[{\\\"barWidth\\\":17,\\\"itemStyle\\\":{\\\"color\\\":\\\"#F099E1EE\\\"},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\"}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"动态柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 13:38:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927766205903183872', NULL, '925988240575995904', NULL, 'JDynamicBar', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"江苏人民医院\\\\\\\",    \\\\\\\"value\\\\\\\": 88,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"上海人民医院\\\\\\\",    \\\\\\\"value\\\\\\\": 76,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京大学第一医院\\\\\\\",    \\\\\\\"value\\\\\\\": 92,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京朝阳医院\\\\\\\",    \\\\\\\"value\\\\\\\": 53,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"北京协和医院\\\\\\\",    \\\\\\\"value\\\\\\\": 90,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"八大处医院\\\\\\\",    \\\\\\\"value\\\\\\\": 98.7,    \\\\\\\"type\\\\\\\": \\\\\\\"美誉度\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":309},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"grid\\\":{\\\"top\\\":19,\\\"left\\\":109,\\\"bottom\\\":60,\\\"right\\\":31},\\\"series\\\":[{\\\"barWidth\\\":18,\\\"itemStyle\\\":{\\\"color\\\":\\\"#50E3C2\\\"}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\"},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"动态柱形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 13:38:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927766205915766784', NULL, '925988240575995904', NULL, 'JRing', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 46,    \\\\\\\"name\\\\\\\": \\\\\\\"涉机构事件\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 54,    \\\\\\\"name\\\\\\\": \\\\\\\"涉行业事件\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":320},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#F099E1EE\\\"},{\\\"color\\\":\\\"#23BAD9\\\"}],\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\"},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":true,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"r\\\":26},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础环形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 13:38:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927766205924155392', NULL, '925988240575995904', NULL, 'JCommonTable', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"医美行业热点事件\\\\\\\": \\\\\\\"FDA批准新一代A型肉毒素上市\\\\\\\",    \\\\\\\"传播热度指数\\\\\\\": 6.25  },  {    \\\\\\\"医美行业热点事件\\\\\\\": \\\\\\\"多地医保局发布口腔种植收费调查登记的通知\\\\\\\",    \\\\\\\"传播热度指数\\\\\\\": 5.3  },  {    \\\\\\\"医美行业热点事件\\\\\\\": \\\\\\\"种植牙服务价格下调\\\\\\\",    \\\\\\\"传播热度指数\\\\\\\": 4  },  {    \\\\\\\"医美行业热点事件\\\\\\\": \\\\\\\"消保委2023年受理消费者投诉41万余件 涉及医美等多个方面\\\\\\\",    \\\\\\\"传播热度指数\\\\\\\": 7.23  },  {    \\\\\\\"医美行业热点事件\\\\\\\": \\\\\\\"轻医美-收费不透明\\\\\\\",    \\\\\\\"传播热度指数\\\\\\\": 3.6  },  {    \\\\\\\"医美行业热点事件\\\\\\\": \\\\\\\"专家提醒:低价医美有风险\\\\\\\",    \\\\\\\"传播热度指数\\\\\\\": 2  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":309},\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":24,\\\"dataType\\\":1,\\\"h\\\":42,\\\"linkageConfig\\\":[],\\\"timeOut\\\":-1,\\\"option\\\":{\\\"headerBgColor\\\":\\\"#C1EEF7\\\",\\\"headerColor\\\":\\\"#417505\\\",\\\"bodyColor\\\":\\\"#000000\\\",\\\"bodyBgColor\\\":\\\"#FFFFFF\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}}}}', 'admin', '2024-03-13 13:38:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('927766205936738304', NULL, '925988240575995904', NULL, 'JRing', '{\\\"chartData\\\":\\\"[  {    \\\\\\\"value\\\\\\\": 4.61,    \\\\\\\"name\\\\\\\": \\\\\\\"敏感\\\\\\\"  },  {    \\\\\\\"value\\\\\\\": 95.39,    \\\\\\\"name\\\\\\\": \\\\\\\"非敏感\\\\\\\"  }]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":528,\\\"height\\\":309},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF\\\",\\\"dataType\\\":1,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#F099E1EE\\\"},{\\\"color\\\":\\\"#6AD5EB\\\"}],\\\"grid\\\":{\\\"top\\\":45,\\\"left\\\":42,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":\\\"25\\\",\\\"fontWeight\\\":\\\"bold\\\"}},\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\"},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":true,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":false,\\\"text\\\":\\\"基础环形图\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-03-13 13:38:31', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('993809146221527040', NULL, '993809146154418176', NULL, 'JText', '{\\\"chartData\\\":\\\"小 区 消 防 巡 检 状 态\\\",\\\"borderColor\\\":\\\"#DB771F\\\",\\\"size\\\":{\\\"width\\\":1817,\\\"height\\\":78},\\\"background\\\":\\\"#DB771F\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":36,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-09-11 19:29:35', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('993809146250887168', NULL, '993809146154418176', NULL, 'JText', '{\\\"chartData\\\":\\\"区域基本情况\\\",\\\"borderColor\\\":\\\"#DB771F\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":56},\\\"background\\\":\\\"#DB771F\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":11,\\\"marginLeft\\\":37},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-09-11 19:29:35', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('993809146267664384', NULL, '993809146154418176', NULL, 'JList', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"描述\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"时间\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"封面\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"区域基本情况\\\",\\\"query\\\":[],\\\"h\\\":24,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=regionBasicInformation\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/42/list\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"通知一\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-9 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知二\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-8 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知三\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-7 14:20:21\\\\\\\"},{\\\\\\\"title\\\\\\\":\\\\\\\"通知四\\\\\\\",\\\\\\\"date\\\\\\\":\\\\\\\"2022-3-4 14:20:21\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":177},\\\"dataSetId\\\":\\\"910750488542625792\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":12,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"layout\\\":\\\"horizontal\\\",\\\"showTitlePrefix\\\":true,\\\"titleFontSize\\\":18,\\\"showTimePrefix\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"}}}', 'admin', '2024-09-11 19:29:35', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('993809146288635904', NULL, '993809146154418176', NULL, 'JText', '{\\\"chartData\\\":\\\"设备总数\\\",\\\"borderColor\\\":\\\"#DB771F\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":67},\\\"background\\\":\\\"#DB771F\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":16,\\\"marginLeft\\\":34},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-09-11 19:29:35', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('993809146305413120', NULL, '993809146154418176', NULL, 'JNumber', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"正常设备\\\",\\\"h\\\":9,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=normalDevice\\\",\\\"analysis\\\":{\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{  \\\\\\\"value\\\\\\\": \\\\\\\"15990\\\\\\\"}\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":122},\\\"dataSetId\\\":\\\"910754028661030912\\\",\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":\\\"正常设备\\\"}}}', 'admin', '2024-09-11 19:29:35', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('993809146326384640', NULL, '993809146154418176', NULL, 'JNumber', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"异常设备\\\",\\\"query\\\":[],\\\"h\\\":9,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=abnormalDevice\\\",\\\"drillData\\\":[],\\\"analysis\\\":{\\\"isCompare\\\":false,\\\"compareType\\\":\\\"\\\",\\\"trendType\\\":\\\"1\\\"},\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\\\\"value\\\\\\\":\\\\\\\"1024\\\\\\\"}\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":122},\\\"dataSetId\\\":\\\"910754465934000128\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":5,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"isCompare\\\":false,\\\"trendType\\\":\\\"1\\\",\\\"body\\\":{\\\"color\\\":\\\"#000000\\\",\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"small\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"bold\\\"},\\\"title\\\":\\\"异常设备\\\"}}}', 'admin', '2024-09-11 19:29:35', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('993809146343161856', NULL, '993809146154418176', NULL, 'JText', '{\\\"chartData\\\":\\\"设备异常明细\\\",\\\"borderColor\\\":\\\"#DB771F\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":67},\\\"background\\\":\\\"#DB771F\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":15,\\\"marginLeft\\\":32},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-09-11 19:29:35', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('993809146355744768', NULL, '993809146154418176', NULL, 'JCommonTable', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"设备异常明细\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=equipmentDetails\\\",\\\"drillData\\\":[],\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":551},\\\"dataSetId\\\":\\\"910759432656830464\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"小区名称\\\",\\\"text\\\":\\\"小区名称\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"设备名称\\\",\\\"text\\\":\\\"设备名称\\\",\\\"value\\\":\\\"deviceName\\\"},{\\\"label\\\":\\\"设备地址\\\",\\\"text\\\":\\\"设备地址\\\",\\\"value\\\":\\\"deviceAddress\\\"},{\\\"label\\\":\\\"设备状态\\\",\\\"text\\\":\\\"设备状态\\\",\\\"value\\\":\\\"deviceStatus\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"name\\\",\\\"title\\\":\\\"小区名称\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"deviceName\\\",\\\"title\\\":\\\"设备名称\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"deviceAddress\\\",\\\"title\\\":\\\"设备地址\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"deviceStatus\\\",\\\"title\\\":\\\"设备状态\\\"}],\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"}}}', 'admin', '2024-09-11 19:29:35', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('993809146368327680', NULL, '993809146154418176', NULL, 'JBubbleMap', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"commonOption\\\":{\\\"barSize\\\":10,\\\"gradientColor\\\":false,\\\"breadcrumb\\\":{\\\"drillDown\\\":false,\\\"textColor\\\":\\\"#000000\\\"},\\\"areaColor\\\":{\\\"color1\\\":\\\"#f7f7f7\\\",\\\"color2\\\":\\\"#fcc02e\\\"},\\\"barColor\\\":\\\"#fff176\\\",\\\"barColor2\\\":\\\"#fcc02e\\\",\\\"inRange\\\":{\\\"color\\\":[\\\"#04387b\\\",\\\"#467bc0\\\"]}},\\\"paramOption\\\":[],\\\"dataSetName\\\":\\\"小区地图分布\\\",\\\"activeKey\\\":1,\\\"chartData\\\":\\\"[  {    \\\\\\\"name\\\\\\\": \\\\\\\"廊坊\\\\\\\",    \\\\\\\"value\\\\\\\": 199  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"新疆\\\\\\\",    \\\\\\\"value\\\\\\\": 180  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"河南\\\\\\\",    \\\\\\\"value\\\\\\\": 137  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"四川\\\\\\\",    \\\\\\\"value\\\\\\\": 125  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"黑龙江\\\\\\\",    \\\\\\\"value\\\\\\\": 123  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"广东\\\\\\\",    \\\\\\\"value\\\\\\\": 123  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"山东\\\\\\\",    \\\\\\\"value\\\\\\\": 119  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"福建\\\\\\\",    \\\\\\\"value\\\\\\\": 116  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"湖北\\\\\\\",    \\\\\\\"value\\\\\\\": 116  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"浙江\\\\\\\",    \\\\\\\"value\\\\\\\": 114  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"湖南\\\\\\\",    \\\\\\\"value\\\\\\\": 114  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"安徽\\\\\\\",    \\\\\\\"value\\\\\\\": 109  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"河北\\\\\\\",    \\\\\\\"value\\\\\\\": 102  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"江苏\\\\\\\",    \\\\\\\"value\\\\\\\": 92  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"江西\\\\\\\",    \\\\\\\"value\\\\\\\": 91  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"重庆\\\\\\\",    \\\\\\\"value\\\\\\\": 91  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"云南\\\\\\\",    \\\\\\\"value\\\\\\\": 83  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"吉林\\\\\\\",    \\\\\\\"value\\\\\\\": 82  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"山西\\\\\\\",    \\\\\\\"value\\\\\\\": 81  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"陕西\\\\\\\",    \\\\\\\"value\\\\\\\": 80  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"辽宁\\\\\\\",    \\\\\\\"value\\\\\\\": 67  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"贵州\\\\\\\",    \\\\\\\"value\\\\\\\": 62  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"广西\\\\\\\",    \\\\\\\"value\\\\\\\": 59  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"甘肃\\\\\\\",    \\\\\\\"value\\\\\\\": 56  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"内蒙古\\\\\\\",    \\\\\\\"value\\\\\\\": 47  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"天津\\\\\\\",    \\\\\\\"value\\\\\\\": 42  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"上海\\\\\\\",    \\\\\\\"value\\\\\\\": 24  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"宁夏\\\\\\\",    \\\\\\\"value\\\\\\\": 18  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"海南\\\\\\\",    \\\\\\\"value\\\\\\\": 14  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"青海\\\\\\\",    \\\\\\\"value\\\\\\\": 10  },  {    \\\\\\\"name\\\\\\\": \\\\\\\"西藏\\\\\\\",    \\\\\\\"value\\\\\\\": 9  }]\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"seriesType\\\":[],\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"区域\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"jsConfig\\\":\\\"\\\",\\\"dataType\\\":2,\\\"query\\\":[],\\\"h\\\":50,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=residentialDistributionMap\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/radar\\\",\\\"timeOut\\\":0,\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":342},\\\"dataSetId\\\":\\\"910765056765509632\\\",\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"w\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"drillDown\\\":false,\\\"area\\\":{\\\"markerColor\\\":\\\"#DDE330\\\",\\\"shadowBlur\\\":10,\\\"markerCount\\\":5,\\\"markerOpacity\\\":1,\\\"name\\\":[\\\"河北省\\\"],\\\"scatterLabelShow\\\":false,\\\"shadowColor\\\":\\\"#DDE330\\\",\\\"value\\\":[\\\"13\\\"],\\\"markerType\\\":\\\"effectScatter\\\"},\\\"geo\\\":{\\\"top\\\":27,\\\"aspectScale\\\":0.92,\\\"itemStyle\\\":{\\\"normal\\\":{\\\"shadowOffsetX\\\":0,\\\"borderColor\\\":\\\"#a9a9a9\\\",\\\"shadowOffsetY\\\":0,\\\"areaColor\\\":\\\"\\\",\\\"shadowBlur\\\":0,\\\"borderWidth\\\":1,\\\"shadowColor\\\":\\\"#80d9f8\\\"},\\\"emphasis\\\":{\\\"areaColor\\\":\\\"#fff59c\\\",\\\"borderWidth\\\":0}},\\\"zoom\\\":1,\\\"label\\\":{\\\"emphasis\\\":{\\\"color\\\":\\\"#fff\\\",\\\"show\\\":false}},\\\"roam\\\":true},\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"data\\\":[]},\\\"title\\\":{\\\"left\\\":10,\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"graphic\\\":[],\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"visualMap\\\":{\\\"min\\\":0,\\\"top\\\":\\\"bottom\\\",\\\"max\\\":200,\\\"left\\\":\\\"5%\\\",\\\"calculable\\\":true,\\\"show\\\":false,\\\"type\\\":\\\"continuous\\\",\\\"seriesIndex\\\":[1]}}}', 'admin', '2024-09-11 19:29:35', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('993809146380910592', NULL, '993809146154418176', NULL, 'JText', '{\\\"chartData\\\":\\\"小区地图分布\\\",\\\"borderColor\\\":\\\"#DB771F\\\",\\\"size\\\":{\\\"width\\\":1208,\\\"height\\\":56},\\\"background\\\":\\\"#DB771F\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":10,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-09-11 19:29:35', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('993809146393493504', NULL, '993809146154418176', NULL, 'JCommonTable', '{\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"小区分布地图表格\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=residentialDistributionTable\\\",\\\"drillData\\\":[],\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":342},\\\"dataSetId\\\":\\\"910773111884398592\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"区域名称\\\",\\\"text\\\":\\\"区域名称\\\",\\\"value\\\":\\\"areaName\\\"},{\\\"label\\\":\\\"小区数量\\\",\\\"text\\\":\\\"小区数量\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"seriesType\\\":[],\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"areaName\\\",\\\"title\\\":\\\"区域名称\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"value\\\",\\\"title\\\":\\\"小区数量\\\"}],\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}}}}', 'admin', '2024-09-11 19:29:35', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('993809146410270720', NULL, '993809146154418176', NULL, 'JPie', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"室外消火栓泵\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=deviceCountProportion\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1048,\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\"},{\\\\\\\"value\\\\\\\":735,\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\"},{\\\\\\\"value\\\\\\\":580,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":484,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":300,\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":364},\\\"dataSetId\\\":\\\"910776816075587584\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"grid\\\":{\\\"bottom\\\":115,\\\"show\\\":false},\\\"legend\\\":{\\\"orient\\\":\\\"vertical\\\"},\\\"series\\\":[{\\\"data\\\":[],\\\"color\\\":[\\\"#3BB1E3\\\",\\\"#DB771F\\\",\\\"#B6C5D1\\\"],\\\"name\\\":\\\"Access From\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#000000\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"设备类型数量占比\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"body\\\":{\\\"color\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-09-11 19:29:35', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('993809146418659328', NULL, '993809146154418176', NULL, 'JBar', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"区域设备数量\\\\t\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=areaDeviceCount\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\",\\\\\\\"value\\\\\\\":1000879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"三星\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\",\\\\\\\"value\\\\\\\":2300879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"oppo\\\\\\\",\\\\\\\"value\\\\\\\":5400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"},{\\\\\\\"name\\\\\\\":\\\\\\\"vivo\\\\\\\",\\\\\\\"value\\\\\\\":3400879,\\\\\\\"type\\\\\\\":\\\\\\\"手机品牌\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":364},\\\"dataSetId\\\":\\\"910790230315417600\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"lineStyle\\\":{\\\"color\\\":\\\"#f3f3f3\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"},\\\"interval\\\":2},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"type\\\":\\\"value\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"grid\\\":{\\\"top\\\":90,\\\"left\\\":62,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"barWidth\\\":21,\\\"data\\\":[],\\\"color\\\":[\\\"#3BB1E3\\\",\\\"#DB771F\\\",\\\"#B6C5D1\\\"],\\\"itemStyle\\\":{\\\"color\\\":\\\"#3BB1E3\\\",\\\"borderRadius\\\":0},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"title\\\":{\\\"show\\\":true,\\\"text\\\":\\\"区域设备数量\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-09-11 19:29:35', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('993809146431242240', NULL, '993809146154418176', NULL, 'JLine', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"巡检任务数\\\",\\\"query\\\":[],\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=inspectionTasksCount\\\",\\\"drillData\\\":[],\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[{\\\\\\\"value\\\\\\\":1000,\\\\\\\"name\\\\\\\":\\\\\\\"联想\\\\\\\"},{\\\\\\\"value\\\\\\\":7350,\\\\\\\"name\\\\\\\":\\\\\\\"小米\\\\\\\"},{\\\\\\\"value\\\\\\\":5800,\\\\\\\"name\\\\\\\":\\\\\\\"华为\\\\\\\"},{\\\\\\\"value\\\\\\\":6000,\\\\\\\"name\\\\\\\":\\\\\\\"苹果\\\\\\\"},{\\\\\\\"value\\\\\\\":3000,\\\\\\\"name\\\\\\\":\\\\\\\"戴尔\\\\\\\"}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":353},\\\"dataSetId\\\":\\\"910794755508060160\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"name\\\",\\\"text\\\":\\\"name\\\",\\\"value\\\":\\\"name\\\"},{\\\"label\\\":\\\"value\\\",\\\"text\\\":\\\"value\\\",\\\"value\\\":\\\"value\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#909198\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#F3F3F3\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#333333\\\"}},\\\"customColor\\\":[{\\\"color\\\":\\\"#38B4EA\\\"}],\\\"grid\\\":{\\\"top\\\":90,\\\"bottom\\\":115,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"lineType\\\":\\\"area\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#64B5F6\\\"},\\\"type\\\":\\\"line\\\"}],\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"left\\\":10,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"headColor\\\":\\\"#FFFFFF\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#4A4A4A\\\"},\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-09-11 19:29:35', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('993809146443825152', NULL, '993809146154418176', NULL, 'JCommonTable', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"paramOption\\\":[],\\\"dataType\\\":2,\\\"dataSetName\\\":\\\"巡检任务数表格\\\",\\\"query\\\":[],\\\"h\\\":42,\\\"dataSetApi\\\":\\\"https://api.jeecg.com/mock/51/propertyFireFighting?type=inspectionTasksTable\\\",\\\"drillData\\\":[],\\\"timeOut\\\":-1,\\\"chartData\\\":\\\"[{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"2月\\\\\\\",\\\\\\\"value\\\\\\\":200},{\\\\\\\"name\\\\\\\":\\\\\\\"3月\\\\\\\",\\\\\\\"value\\\\\\\":300},{\\\\\\\"name\\\\\\\":\\\\\\\"4月\\\\\\\",\\\\\\\"value\\\\\\\":400},{\\\\\\\"name\\\\\\\":\\\\\\\"5月\\\\\\\",\\\\\\\"value\\\\\\\":50},{\\\\\\\"name\\\\\\\":\\\\\\\"6月\\\\\\\",\\\\\\\"value\\\\\\\":120}]\\\",\\\"size\\\":{\\\"width\\\":599,\\\"height\\\":353},\\\"dataSetId\\\":\\\"910797586147360768\\\",\\\"fieldOption\\\":[{\\\"label\\\":\\\"检查时间\\\",\\\"text\\\":\\\"检查时间\\\",\\\"value\\\":\\\"inspectTime\\\"},{\\\"label\\\":\\\"设备名称\\\",\\\"text\\\":\\\"设备名称\\\",\\\"value\\\":\\\"deviceName\\\"},{\\\"label\\\":\\\"设备地址\\\",\\\"text\\\":\\\"设备地址\\\",\\\"value\\\":\\\"deviceAddress\\\"},{\\\"label\\\":\\\"检查人\\\",\\\"text\\\":\\\"检查人\\\",\\\"value\\\":\\\"inspected\\\"},{\\\"label\\\":\\\"检查内容\\\",\\\"text\\\":\\\"检查内容\\\",\\\"value\\\":\\\"content\\\"},{\\\"label\\\":\\\"巡查结果\\\",\\\"text\\\":\\\"巡查结果\\\",\\\"value\\\":\\\"inspectResult\\\"}],\\\"dataSetType\\\":\\\"api\\\",\\\"background\\\":\\\"#FFFFFF\\\",\\\"seriesType\\\":[],\\\"w\\\":24,\\\"linkageConfig\\\":[],\\\"dataSetIzAgent\\\":\\\"0\\\",\\\"option\\\":{\\\"columns\\\":[{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"inspectTime\\\",\\\"title\\\":\\\"检查时间\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"deviceName\\\",\\\"title\\\":\\\"设备名称\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"deviceAddress\\\",\\\"title\\\":\\\"设备地址\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"inspected\\\",\\\"title\\\":\\\"检查人\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"content\\\",\\\"title\\\":\\\"检查内容\\\"},{\\\"izShow\\\":\\\"Y\\\",\\\"dataIndex\\\":\\\"inspectResult\\\",\\\"title\\\":\\\"巡查结果\\\"}]}}', 'admin', '2024-09-11 19:29:35', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` VALUES ('993809146464796672', NULL, '993809146154418176', NULL, 'JText', '{\\\"chartData\\\":\\\"巡检任务数\\\",\\\"borderColor\\\":\\\"#DB771F\\\",\\\"size\\\":{\\\"width\\\":1208,\\\"height\\\":67},\\\"background\\\":\\\"#DB771F\\\",\\\"w\\\":8,\\\"dataType\\\":1,\\\"h\\\":12,\\\"turnConfig\\\":{\\\"url\\\":\\\"\\\"},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":12,\\\"marginLeft\\\":0},\\\"title\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#464646\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2024-09-11 19:29:35', NULL, NULL);\n\n-- ----------------------------\n-- Table structure for onl_drag_share\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_drag_share`;\nCREATE TABLE `onl_drag_share`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',\n  `drag_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '在线仪表盘设计器id',\n  `preview_url` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '预览地址',\n  `preview_lock` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码锁',\n  `last_update_time` datetime NULL DEFAULT NULL COMMENT '最后更新时间',\n  `term_of_validity` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '有效期(0:永久有效，1:1天，7:7天)',\n  `status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否过期(0未过期，1已过期)',\n  `preview_lock_status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否为密码锁(0 否,1是)',\n  `share_token` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分享token',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uniq_ods_drag_id`(`drag_id`) USING BTREE COMMENT '仪表盘id唯一索引'\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '仪表盘预览分享表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_drag_share\n-- ----------------------------\nINSERT INTO `onl_drag_share` VALUES ('1062674826894385152', '1060068114432577536', 'https://bootapi.jeecg.com/drag/share/view/1060068114432577536', '', '2025-03-20 20:17:27', '0', '0', '0', NULL);\nINSERT INTO `onl_drag_share` VALUES ('1062674928555925504', '1060099988005638144', 'https://bootapi.jeecg.com/drag/share/view/1060099988005638144', '', '2025-03-20 20:17:37', '0', '0', '0', NULL);\nINSERT INTO `onl_drag_share` VALUES ('1062674948000718848', '1060099975032655872', 'https://bootapi.jeecg.com/drag/share/view/1060099975032655872', '', '2025-03-20 20:17:41', '0', '0', '0', NULL);\nINSERT INTO `onl_drag_share` VALUES ('1062674963582558208', '1060099939494318080', 'https://bootapi.jeecg.com/drag/share/view/1060099939494318080', '', '2025-03-20 20:17:45', '0', '0', '0', NULL);\nINSERT INTO `onl_drag_share` VALUES ('1062674981450293248', '1060099927951593472', 'https://bootapi.jeecg.com/drag/share/view/1060099927951593472', '', '2025-03-20 20:17:49', '0', '0', '0', NULL);\nINSERT INTO `onl_drag_share` VALUES ('1062674998021988352', '1060068147949260800', 'https://bootapi.jeecg.com/drag/share/view/1060068147949260800', '', '2025-03-20 20:17:53', '0', '0', '0', NULL);\nINSERT INTO `onl_drag_share` VALUES ('1062675012123238400', '1060068100662677504', 'https://bootapi.jeecg.com/drag/share/view/1060068100662677504', '', '2025-03-20 20:17:57', '0', '0', '0', NULL);\nINSERT INTO `onl_drag_share` VALUES ('1062675025788280832', '1060099867109019648', 'https://bootapi.jeecg.com/drag/share/view/1060099867109019648', '', '2025-03-20 20:18:00', '0', '0', '0', NULL);\nINSERT INTO `onl_drag_share` VALUES ('1062675046642360320', '1060068138562408448', 'https://bootapi.jeecg.com/drag/share/view/1060068138562408448', '', '2025-03-20 20:18:05', '0', '0', '0', NULL);\nINSERT INTO `onl_drag_share` VALUES ('1062675062794625024', '1060068124528267264', 'https://bootapi.jeecg.com/drag/share/view/1060068124528267264', '', '2025-03-20 20:18:09', '0', '0', '0', NULL);\nINSERT INTO `onl_drag_share` VALUES ('1062677638072115200', '1060100026798755840', 'https://bootapi.jeecg.com/drag/share/view/1060100026798755840', '', '2025-03-20 20:28:23', '0', '0', '0', NULL);\nINSERT INTO `onl_drag_share` VALUES ('1062677655184875520', '1060100061204631552', 'https://bootapi.jeecg.com/drag/share/view/1060100061204631552', '', '2025-03-20 20:28:27', '0', '0', '0', NULL);\n\n-- ----------------------------\n-- Table structure for onl_drag_table_relation\n-- ----------------------------\nDROP TABLE IF EXISTS `onl_drag_table_relation`;\nCREATE TABLE `onl_drag_table_relation`  (\n  `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',\n  `aggregation_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '聚合表名称',\n  `aggregation_desc` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '聚合表描述',\n  `relation_forms` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '关联表单',\n  `filter_condition` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '过滤条件',\n  `header_fields` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '表头字段',\n  `calculate_fields` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '公式字段',\n  `validate_info` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '校验信息',\n  `del_flag` tinyint(1) NULL DEFAULT NULL COMMENT '删除状态(0-正常,1-已删除)',\n  `low_app_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '应用ID',\n  `tenant_id` int(11) NULL DEFAULT NULL COMMENT '租户ID',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_aggregation_name`(`aggregation_name`) USING BTREE,\n  INDEX `idx_del_flag`(`del_flag`) USING BTREE,\n  INDEX `idx_tenant_id`(`tenant_id`) USING BTREE,\n  INDEX `idx_create_by`(`create_by`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '仪表盘聚合表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of onl_drag_table_relation\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for open_api\n-- ----------------------------\nDROP TABLE IF EXISTS `open_api`;\nCREATE TABLE `open_api`  (\n  `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '接口名称',\n  `request_method` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '请求方法',\n  `request_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '接口地址',\n  `black_list` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'IP 黑名单',\n  `body` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '请求体内容',\n  `origin_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '原始地址',\n  `status` int(10) NULL DEFAULT NULL COMMENT '状态',\n  `del_flag` int(10) NULL DEFAULT NULL COMMENT '删除标识',\n  `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  `headers_json` json NULL COMMENT '请求头json',\n  `params_json` json NULL COMMENT '请求参数json',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '接口表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of open_api\n-- ----------------------------\nINSERT INTO `open_api` VALUES ('1922132683346649090', '根据部门查询用户', 'GET', 'TEwcXBlr', NULL, NULL, '/sys/user/queryUserByDepId', 1, 0, 'admin', '2025-05-13 11:31:58', 'admin', '2025-05-15 10:10:01', '[]', '[{\\\"id\\\": \\\"row_24\\\", \\\"note\\\": \\\"\\\", \\\"paramKey\\\": \\\"id\\\", \\\"required\\\": \\\"1\\\", \\\"defaultValue\\\": \\\"\\\"}]');\n\n-- ----------------------------\n-- Table structure for open_api_auth\n-- ----------------------------\nDROP TABLE IF EXISTS `open_api_auth`;\nCREATE TABLE `open_api_auth`  (\n  `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '授权名称',\n  `ak` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'AK',\n  `sk` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'SK',\n  `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  `system_user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '关联系统用户名',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '权限表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of open_api_auth\n-- ----------------------------\nINSERT INTO `open_api_auth` VALUES ('1922164194775056386', 'scott', 'ak-pFjyNHWRsJEFWlu6', '4hV5dBrZtmGAtPdbA5yseaeKRYNpzGsS', 'admin', '2025-05-13 13:37:11', NULL, NULL, 'e9ca23d68d884d4ebb19d07889727dae');\n\n-- ----------------------------\n-- Table structure for open_api_log\n-- ----------------------------\nDROP TABLE IF EXISTS `open_api_log`;\nCREATE TABLE `open_api_log`  (\n  `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n  `api_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '接口ID',\n  `call_auth_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '调用ID',\n  `call_time` datetime NULL DEFAULT NULL COMMENT '调用时间',\n  `used_time` bigint(20) NULL DEFAULT NULL COMMENT '耗时',\n  `response_time` datetime NULL DEFAULT NULL COMMENT '响应时间',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '调用记录表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of open_api_log\n-- ----------------------------\nINSERT INTO `open_api_log` VALUES ('1922175238557913090', '1922132683346649090', '1922164194775056386', '2025-05-13 14:21:04', 94, '2025-05-13 14:21:04');\nINSERT INTO `open_api_log` VALUES ('1922175436256432130', '1922132683346649090', '1922164194775056386', '2025-05-13 14:21:51', 38, '2025-05-13 14:21:51');\nINSERT INTO `open_api_log` VALUES ('1922175487921868802', '1922132683346649090', '1922164194775056386', '2025-05-13 14:22:03', 31, '2025-05-13 14:22:03');\nINSERT INTO `open_api_log` VALUES ('1922176033789562883', '1922132683346649090', '1922164194775056386', '2025-05-13 14:24:13', 27, '2025-05-13 14:24:13');\nINSERT INTO `open_api_log` VALUES ('1922176583943835650', '1922132683346649090', '1922164194775056386', '2025-05-13 14:26:25', 39, '2025-05-13 14:26:25');\nINSERT INTO `open_api_log` VALUES ('1922177249969934337', '1922132683346649090', '1922164194775056386', '2025-05-13 14:28:08', 55250, '2025-05-13 14:29:03');\nINSERT INTO `open_api_log` VALUES ('1922180212645941249', '1922132683346649090', '1922164194775056386', '2025-05-13 14:40:46', 4162, '2025-05-13 14:40:50');\nINSERT INTO `open_api_log` VALUES ('1922180441692688385', '1922132683346649090', '1922164194775056386', '2025-05-13 14:41:11', 33346, '2025-05-13 14:41:44');\nINSERT INTO `open_api_log` VALUES ('1922180521686454273', '1922132683346649090', '1922164194775056386', '2025-05-13 14:42:00', 3570, '2025-05-13 14:42:03');\nINSERT INTO `open_api_log` VALUES ('1922180965825499138', '1922132683346649090', '1922164194775056386', '2025-05-13 14:42:10', 99211, '2025-05-13 14:43:49');\nINSERT INTO `open_api_log` VALUES ('1922181034515615746', '1922132683346649090', '1922164194775056386', '2025-05-13 14:43:52', 14005, '2025-05-13 14:44:06');\nINSERT INTO `open_api_log` VALUES ('1922183171307982850', '1922132683346649090', '1922164194775056386', '2025-05-13 14:52:15', 19834, '2025-05-13 14:52:35');\nINSERT INTO `open_api_log` VALUES ('1922184177068523521', '1922132683346649090', '1922164194775056386', '2025-05-13 14:56:34', 748, '2025-05-13 14:56:35');\nINSERT INTO `open_api_log` VALUES ('1922184729043107841', '1922132683346649090', '1922164194775056386', '2025-05-13 14:58:46', 1031, '2025-05-13 14:58:47');\nINSERT INTO `open_api_log` VALUES ('1922184806453182465', '1922132683346649090', '1922164194775056386', '2025-05-13 14:59:05', 68, '2025-05-13 14:59:05');\nINSERT INTO `open_api_log` VALUES ('1922184918382379009', '1922132683346649090', '1922164194775056386', '2025-05-13 14:59:10', 22155, '2025-05-13 14:59:32');\nINSERT INTO `open_api_log` VALUES ('1922185292635844610', '1922132683346649090', '1922164194775056386', '2025-05-13 15:00:55', 6267, '2025-05-13 15:01:01');\nINSERT INTO `open_api_log` VALUES ('1922186002672791554', '1922132683346649090', '1922164194775056386', '2025-05-13 15:03:23', 27554, '2025-05-13 15:03:50');\nINSERT INTO `open_api_log` VALUES ('1922187506582425601', '1922132683346649090', '1922164194775056386', '2025-05-13 15:09:45', 3464, '2025-05-13 15:09:49');\nINSERT INTO `open_api_log` VALUES ('1922187586597163011', '1922132683346649090', '1922164194775056386', '2025-05-13 15:10:08', 82, '2025-05-13 15:10:08');\nINSERT INTO `open_api_log` VALUES ('1922187924741951490', '1922132683346649090', '1922164194775056386', '2025-05-13 15:10:49', 39590, '2025-05-13 15:11:28');\nINSERT INTO `open_api_log` VALUES ('1922188138710261761', '1922132683346649090', '1922164194775056386', '2025-05-13 15:12:19', 758, '2025-05-13 15:12:19');\nINSERT INTO `open_api_log` VALUES ('1922188290661507073', '1922132683346649090', '1922164194775056386', '2025-05-13 15:12:29', 26527, '2025-05-13 15:12:56');\nINSERT INTO `open_api_log` VALUES ('1922189701755424769', '1922132683346649090', '1922164194775056386', '2025-05-13 15:18:28', 3619, '2025-05-13 15:18:32');\nINSERT INTO `open_api_log` VALUES ('1922190076784803841', '1922132683346649090', '1922164194775056386', '2025-05-13 15:20:01', 741, '2025-05-13 15:20:02');\nINSERT INTO `open_api_log` VALUES ('1922836671113101313', '1922132683346649090', '1922164194775056386', '2025-05-15 10:09:21', 186, '2025-05-15 10:09:22');\nINSERT INTO `open_api_log` VALUES ('1922836856287428610', '1922132683346649090', '1922164194775056386', '2025-05-15 10:10:06', 145, '2025-05-15 10:10:06');\n\n-- ----------------------------\n-- Table structure for open_api_permission\n-- ----------------------------\nDROP TABLE IF EXISTS `open_api_permission`;\nCREATE TABLE `open_api_permission`  (\n  `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n  `api_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '接口ID',\n  `api_auth_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '认证ID',\n  `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'openapi授权' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of open_api_permission\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for oss_file\n-- ----------------------------\nDROP TABLE IF EXISTS `oss_file`;\nCREATE TABLE `oss_file`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id',\n  `file_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件名称',\n  `url` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件地址',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'Oss File' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of oss_file\n-- ----------------------------\nINSERT INTO `oss_file` VALUES ('1739471555639607297', 'LOGO-mini.png', 'http://minio.jeecg.com/jeecgtest/LOGO-mini_1703557309951.png', 'jeecg', '2023-12-26 10:21:51', NULL, NULL);\nINSERT INTO `oss_file` VALUES ('1739471895508254721', '儿童身高.png', 'http://minio.jeecg.com/jeecgtest/儿童身高_1703557391840.png', 'jeecg', '2023-12-26 10:23:12', NULL, NULL);\nINSERT INTO `oss_file` VALUES ('1739472521256468482', '大屏.png', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/upload/test/大屏_1703557541165.png', 'jeecg', '2023-12-26 10:25:42', NULL, NULL);\nINSERT INTO `oss_file` VALUES ('1739472619130552321', '大屏11.png', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/upload/test/大屏11_1703557564068.png', 'jeecg', '2023-12-26 10:26:05', NULL, NULL);\n\n-- ----------------------------\n-- Table structure for qrtz_blob_triggers\n-- ----------------------------\nDROP TABLE IF EXISTS `qrtz_blob_triggers`;\nCREATE TABLE `qrtz_blob_triggers`  (\n  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `TRIGGER_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `BLOB_DATA` blob NULL,\n  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,\n  CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of qrtz_blob_triggers\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for qrtz_calendars\n-- ----------------------------\nDROP TABLE IF EXISTS `qrtz_calendars`;\nCREATE TABLE `qrtz_calendars`  (\n  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `CALENDAR_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `CALENDAR` blob NOT NULL,\n  PRIMARY KEY (`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of qrtz_calendars\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for qrtz_cron_triggers\n-- ----------------------------\nDROP TABLE IF EXISTS `qrtz_cron_triggers`;\nCREATE TABLE `qrtz_cron_triggers`  (\n  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `TRIGGER_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `CRON_EXPRESSION` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `TIME_ZONE_ID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,\n  CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of qrtz_cron_triggers\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for qrtz_fired_triggers\n-- ----------------------------\nDROP TABLE IF EXISTS `qrtz_fired_triggers`;\nCREATE TABLE `qrtz_fired_triggers`  (\n  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `ENTRY_ID` varchar(95) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `TRIGGER_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `INSTANCE_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `FIRED_TIME` bigint(13) NOT NULL,\n  `SCHED_TIME` bigint(13) NOT NULL,\n  `PRIORITY` int(11) NOT NULL,\n  `STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `JOB_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n  `JOB_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n  `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n  `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n  PRIMARY KEY (`SCHED_NAME`, `ENTRY_ID`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of qrtz_fired_triggers\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for qrtz_job_details\n-- ----------------------------\nDROP TABLE IF EXISTS `qrtz_job_details`;\nCREATE TABLE `qrtz_job_details`  (\n  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `JOB_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `JOB_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n  `JOB_CLASS_NAME` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `IS_DURABLE` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `IS_UPDATE_DATA` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `JOB_DATA` blob NULL,\n  PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of qrtz_job_details\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for qrtz_locks\n-- ----------------------------\nDROP TABLE IF EXISTS `qrtz_locks`;\nCREATE TABLE `qrtz_locks`  (\n  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `LOCK_NAME` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  PRIMARY KEY (`SCHED_NAME`, `LOCK_NAME`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of qrtz_locks\n-- ----------------------------\nINSERT INTO `qrtz_locks` VALUES ('MyScheduler', 'STATE_ACCESS');\nINSERT INTO `qrtz_locks` VALUES ('MyScheduler', 'TRIGGER_ACCESS');\n\n-- ----------------------------\n-- Table structure for qrtz_paused_trigger_grps\n-- ----------------------------\nDROP TABLE IF EXISTS `qrtz_paused_trigger_grps`;\nCREATE TABLE `qrtz_paused_trigger_grps`  (\n  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of qrtz_paused_trigger_grps\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for qrtz_scheduler_state\n-- ----------------------------\nDROP TABLE IF EXISTS `qrtz_scheduler_state`;\nCREATE TABLE `qrtz_scheduler_state`  (\n  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `INSTANCE_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `LAST_CHECKIN_TIME` bigint(13) NOT NULL,\n  `CHECKIN_INTERVAL` bigint(13) NOT NULL,\n  PRIMARY KEY (`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of qrtz_scheduler_state\n-- ----------------------------\nINSERT INTO `qrtz_scheduler_state` VALUES ('MyScheduler', 'qin1769584805968', 1769584846824, 15000);\n\n-- ----------------------------\n-- Table structure for qrtz_simple_triggers\n-- ----------------------------\nDROP TABLE IF EXISTS `qrtz_simple_triggers`;\nCREATE TABLE `qrtz_simple_triggers`  (\n  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `TRIGGER_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `REPEAT_COUNT` bigint(7) NOT NULL,\n  `REPEAT_INTERVAL` bigint(12) NOT NULL,\n  `TIMES_TRIGGERED` bigint(10) NOT NULL,\n  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,\n  CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of qrtz_simple_triggers\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for qrtz_simprop_triggers\n-- ----------------------------\nDROP TABLE IF EXISTS `qrtz_simprop_triggers`;\nCREATE TABLE `qrtz_simprop_triggers`  (\n  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `TRIGGER_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `STR_PROP_1` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n  `STR_PROP_2` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n  `STR_PROP_3` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n  `INT_PROP_1` int(11) NULL DEFAULT NULL,\n  `INT_PROP_2` int(11) NULL DEFAULT NULL,\n  `LONG_PROP_1` bigint(20) NULL DEFAULT NULL,\n  `LONG_PROP_2` bigint(20) NULL DEFAULT NULL,\n  `DEC_PROP_1` decimal(13, 4) NULL DEFAULT NULL,\n  `DEC_PROP_2` decimal(13, 4) NULL DEFAULT NULL,\n  `BOOL_PROP_1` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n  `BOOL_PROP_2` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,\n  CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of qrtz_simprop_triggers\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for qrtz_triggers\n-- ----------------------------\nDROP TABLE IF EXISTS `qrtz_triggers`;\nCREATE TABLE `qrtz_triggers`  (\n  `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `TRIGGER_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `JOB_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `JOB_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n  `NEXT_FIRE_TIME` bigint(13) NULL DEFAULT NULL,\n  `PREV_FIRE_TIME` bigint(13) NULL DEFAULT NULL,\n  `PRIORITY` int(11) NULL DEFAULT NULL,\n  `TRIGGER_STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `TRIGGER_TYPE` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `START_TIME` bigint(13) NOT NULL,\n  `END_TIME` bigint(13) NULL DEFAULT NULL,\n  `CALENDAR_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n  `MISFIRE_INSTR` smallint(2) NULL DEFAULT NULL,\n  `JOB_DATA` blob NULL,\n  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,\n  INDEX `SCHED_NAME`(`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE,\n  CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of qrtz_triggers\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for rep_demo_dxtj\n-- ----------------------------\nDROP TABLE IF EXISTS `rep_demo_dxtj`;\nCREATE TABLE `rep_demo_dxtj`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',\n  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名',\n  `gtime` datetime NULL DEFAULT NULL COMMENT '雇佣日期',\n  `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '职务',\n  `jphone` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '家庭电话',\n  `birth` datetime NULL DEFAULT NULL COMMENT '出生日期',\n  `hukou` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '户口所在地',\n  `laddress` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系地址',\n  `jperson` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '紧急联系人',\n  `sex` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'xingbie',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of rep_demo_dxtj\n-- ----------------------------\nINSERT INTO `rep_demo_dxtj` VALUES ('1338808084247613441', '张三', '2019-11-06 00:00:00', '1', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\nINSERT INTO `rep_demo_dxtj` VALUES ('1338809169074982920', '张小哲', '2019-11-06 00:00:00', '2', '18034596971', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\nINSERT INTO `rep_demo_dxtj` VALUES ('1338809448658898952', '闫妮', '2019-11-06 00:00:00', '2', '18034596972', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\nINSERT INTO `rep_demo_dxtj` VALUES ('1338809620973490184', '陌生', '2019-11-06 00:00:00', '2', '18034596973', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\nINSERT INTO `rep_demo_dxtj` VALUES ('1338809652606930952', '贺江', '2019-11-06 00:00:00', '2', '18034596974', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '2');\nINSERT INTO `rep_demo_dxtj` VALUES ('1338809685200867336', '村子明', '2019-11-06 00:00:00', '3', '18034596975', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '2');\nINSERT INTO `rep_demo_dxtj` VALUES ('1338809710203113481', '尚德', '2019-11-06 00:00:00', '4', '18034596977', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\nINSERT INTO `rep_demo_dxtj` VALUES ('1338809749470187528', '郑恺', '2019-11-06 00:00:00', '4', '18034596978', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\nINSERT INTO `rep_demo_dxtj` VALUES ('1338809774971555849', '未名园', '2019-11-06 00:00:00', '4', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\nINSERT INTO `rep_demo_dxtj` VALUES ('1338809805199904777', '韩寒', '2019-11-06 00:00:00', '5', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\nINSERT INTO `rep_demo_dxtj` VALUES ('1338809830017601544', '迪丽热拉', '2019-11-06 00:00:00', '6', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\nINSERT INTO `rep_demo_dxtj` VALUES ('1338809864356368393', '张一山', '2019-11-06 00:00:00', '6', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\nINSERT INTO `rep_demo_dxtj` VALUES ('1339160157602480137', '张三', '2019-11-06 00:00:00', '1', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\nINSERT INTO `rep_demo_dxtj` VALUES ('1339160157602480146', '张大大', '2019-11-06 00:00:00', '2', '18034596971', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\nINSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674439', '郭美美', '2019-11-06 00:00:00', '2', '18034596972', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\nINSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674448', '莫愁', '2019-11-06 00:00:00', '2', '18034596973', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\nINSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674457', '鲁与', '2019-11-06 00:00:00', '2', '18034596974', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '2');\nINSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674466', '高尚', '2019-11-06 00:00:00', '3', '18034596975', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '2');\nINSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674475', '尚北京', '2019-11-06 00:00:00', '4', '18034596977', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\nINSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674484', '杨颖花', '2019-11-06 00:00:00', '4', '18034596978', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\nINSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674493', '李丽', '2019-11-06 00:00:00', '4', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\nINSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674502', '韩露露', '2019-11-06 00:00:00', '5', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\nINSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674511', '李凯泽', '2019-11-06 00:00:00', '6', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\nINSERT INTO `rep_demo_dxtj` VALUES ('1339160157606674520', '王明阳', '2019-11-06 00:00:00', '6', '18034596970', '1988-12-15 00:00:00', '北京市朝阳区奥运村街道亚运村小区', '18034596972', '王亮', '1');\n\n-- ----------------------------\n-- Table structure for rep_demo_employee\n-- ----------------------------\nDROP TABLE IF EXISTS `rep_demo_employee`;\nCREATE TABLE `rep_demo_employee`  (\n  `id` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',\n  `num` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '编号',\n  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',\n  `sex` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别',\n  `birthday` datetime NULL DEFAULT NULL COMMENT '出生日期',\n  `nation` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '民族',\n  `political` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '政治面貌',\n  `native_place` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '籍贯',\n  `height` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '身高',\n  `weight` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '体重',\n  `health` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '健康状况',\n  `id_card` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '身份证号',\n  `education` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '学历',\n  `school` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '毕业学校',\n  `major` varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '专业',\n  `address` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系地址',\n  `zip_code` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮编',\n  `email` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'Email',\n  `phone` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号',\n  `foreign_language` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '外语语种',\n  `foreign_language_level` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '外语水平',\n  `computer_level` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '计算机水平',\n  `graduation_time` datetime NULL DEFAULT NULL COMMENT '毕业时间',\n  `arrival_time` datetime NULL DEFAULT NULL COMMENT '到职时间',\n  `positional_titles` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '职称',\n  `education_experience` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '教育经历',\n  `work_experience` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '工作经历',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  `del_flag` tinyint(1) NULL DEFAULT NULL COMMENT '删除标识0-正常,1-已删除',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of rep_demo_employee\n-- ----------------------------\nINSERT INTO `rep_demo_employee` VALUES ('1', '001', '张三', '男', '2000-02-04 13:36:19', '汉族', '团员', '北京', '170', '65', '良好', '110101200002044853', '大专', '北京科技', '计算机', '北京朝阳区', '1001', 'zhang@163.com', '18011111111', '英语', '三级', '三级', '2019-02-04 13:41:17', '2020-02-04 13:41:31', '项目经理', '2018年9月—2019年7月：北京语言文化大学比较文学研究所攻读博士学位，获得比较文学博士学位', '2019年5月---至今 XX公司     网络系统工程师  \\n2019年5月---至今 XX公司     网络系统工程师', NULL, '2020-02-04 15:18:03', NULL, NULL, NULL);\nINSERT INTO `rep_demo_employee` VALUES ('2', '002', '王红', '女', '2000-02-04 13:36:19', '汉族', '团员', '北京', '170', '65', '良好', '110101200002044853', '大专', '北京科技', '计算机', '北京朝阳区', '1001', 'zhang@163.com', '18011111111', '英语', '三级', '三级', '2019-02-04 13:41:17', '2020-02-04 13:41:31', '项目经理', '2018年9月—2019年7月：北京语言文化大学比较文学研究所攻读博士学位，获得比较文学博士学位', '2019年5月---至今 XX公司     网络系统工程师  \\n2019年5月---至今 XX公司     网络系统工程师', NULL, '2020-02-04 18:39:27', NULL, NULL, NULL);\n\n-- ----------------------------\n-- Table structure for rep_demo_gongsi\n-- ----------------------------\nDROP TABLE IF EXISTS `rep_demo_gongsi`;\nCREATE TABLE `rep_demo_gongsi`  (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `gname` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '货品名称',\n  `gdata` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '返利',\n  `tdata` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '备注',\n  `didian` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `zhaiyao` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `num` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of rep_demo_gongsi\n-- ----------------------------\nINSERT INTO `rep_demo_gongsi` VALUES (1, '北京天山海世界', '2020-02-30 11:12:25', '2020-02-25', '天山大厦', '1', '2399845661');\nINSERT INTO `rep_demo_gongsi` VALUES (2, 'dd天山海世界', '2020-02-30 11:12:25', '2020-02-25', '天山大厦', '1', '2399845661');\n\n-- ----------------------------\n-- Table structure for rep_demo_jianpiao\n-- ----------------------------\nDROP TABLE IF EXISTS `rep_demo_jianpiao`;\nCREATE TABLE `rep_demo_jianpiao`  (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `bnum` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `ftime` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `sfkong` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `kaishi` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `jieshu` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `hezairen` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `jpnum` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `shihelv` varchar(125) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `s_id` int(11) NOT NULL,\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 87 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of rep_demo_jianpiao\n-- ----------------------------\nINSERT INTO `rep_demo_jianpiao` VALUES (1, 'K7725', '21:13', '否', '秦皇岛', '邯郸', '300', '258', '86', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (2, 'k99', '16:55', '否', '包头', '广州', '800', '700', '88', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (3, 'G6737', '05:34', '否', '北京西', '邯郸东', '500', '256', '51', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (4, 'K7705', '07:03', '否', '北京', '邯郸', '400', '200', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (5, 'G437', '06:27', '否', '北京西', '兰州西', '800', '586', '73', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (6, 'G673', '06:32', '否', '北京西', '邯郸东', '300', '289', '87', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (7, 'G507', '06:43', '否', '北京西', '邯郸东', '300', '200', '67', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (8, 'G89', '06:53', '否', '北京西', '成都东', '800', '500', '62', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (9, 'K7712', '09:43', '否', '北京西', '西安北', '400', '200', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (10, 'G405', '10:05', '否', '北京西', '昆明南', '300', '200', '67', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (11, 'G6701', '10:38', '否', '北京西', '石家庄', '300', '200', '67', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (12, 'G487', '10:52', '否', '北京西', '南昌西', '800', '700', '88', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (13, 'G607', '11:14', '否', '北京西', '太原南', '400', '200', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (14, 'G667', '11:19', '否', '北京西', '西安北', '400', '200', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (15, 'Z49', '11:28', '否', '北京西', '成都', '400', '200', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (16, 'Z49', '11:28', '否', '北京西', '上海', '300', '200', '80', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (17, 'Z49', '11:56', '否', '北京西', '上海', '200', '180', '95', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (18, 'Z49', '11:36', '否', '北京南', '大晒', '200', '180', '96', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (19, 'Z123', '12:00', '否', '北京南', '重庆', '1000', '1000', '100', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (20, 'G78', '13:56', '否', '北京东', '厦门北', '800', '700', '90', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (21, 'G56', '18:36', '否', '上海西', '深圳', '800', '700', '90', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (22, 'H78', '12:00', '否', '上海', '北京西', '800', '700', '90', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (23, 'H78', '12:00', '否', '上海', '北京西', '800', '700', '90', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (24, 'H78', '12:00', '否', '上海', '北京西', '800', '700', '90', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (25, 'H78', '12:00', '否', '北京西', '南昌', '800', '700', '90', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (26, 'G70', '7:23', '是', '北京西', '厦门', '500', '450', '95', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (27, 'G14', '9:50', '是', '北京西', '上海', '800', '700', '95', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (28, 'G90', '8:30', '是', '北京南', '武昌', '1000', '1000', '100', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (29, 'G25', '7:56', '是', '厦门北', '福州', '500', '100', '20', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (30, 'G50', '14:23', '否', '北京西', '深圳', '500', '100', '20', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (31, 'G10', '13:00', '否', '北京西', '深圳', '500', '100', '20', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (32, 'G10', '13:00', '否', '北京西', '深圳', '500', '100', '20', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (33, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (34, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (35, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (36, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (37, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (38, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (39, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (40, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (41, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (42, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (43, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (44, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (45, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (46, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (47, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (48, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (49, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (50, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (51, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (52, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (53, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (54, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (55, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (56, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (57, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (58, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (59, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (60, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (61, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (62, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (63, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (64, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (65, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (66, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (67, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (68, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (69, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (70, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (71, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (72, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (73, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (74, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (75, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (76, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (77, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (78, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (79, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (80, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (81, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (82, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (83, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (84, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (85, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\nINSERT INTO `rep_demo_jianpiao` VALUES (86, 'G10', '13:00', '否', '北京西', '深圳', '200', '100', '50', 1);\n\n-- ----------------------------\n-- Table structure for rep_demo_order_main\n-- ----------------------------\nDROP TABLE IF EXISTS `rep_demo_order_main`;\nCREATE TABLE `rep_demo_order_main`  (\n  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `order_code` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '订单编码',\n  `order_date` datetime NULL DEFAULT NULL COMMENT '下单时间',\n  `descc` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',\n  `xiala` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '下拉多选',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of rep_demo_order_main\n-- ----------------------------\nINSERT INTO `rep_demo_order_main` VALUES ('1256629667445714946', 'admin', '2020-05-03 01:00:34', 'admin', '2020-11-26 15:22:35', 'CN20221', '2020-05-03 00:00:00', '15', NULL);\nINSERT INTO `rep_demo_order_main` VALUES ('1551943088862896130', 'admin', '2022-07-26 22:50:40', 'admin', '2022-10-29 17:16:26', 'CN20222', '2020-05-03 00:00:00', '', '');\nINSERT INTO `rep_demo_order_main` VALUES ('1586557968995545089', 'admin', '2022-10-30 11:17:51', 'admin', '2022-11-07 15:07:24', 'CN20225', '2020-05-03 00:00:00', '111', '');\nINSERT INTO `rep_demo_order_main` VALUES ('1589514956490637313', 'admin', '2022-11-07 15:07:52', 'admin', '2022-11-07 15:14:50', 'CN20223', '2022-11-07 00:00:00', NULL, '1,2');\nINSERT INTO `rep_demo_order_main` VALUES ('1589516804530339842', 'admin', '2022-11-07 15:15:13', 'admin', '2022-11-23 17:20:56', 'CN20224', '2022-11-07 00:00:00', '222', '1,2');\nINSERT INTO `rep_demo_order_main` VALUES ('1683074969561157634', 'admin', '2023-07-23 19:21:57', 'admin', '2023-12-06 15:26:44', 'CN20231', '2020-05-03 00:00:00', '111', '1,2');\n\n-- ----------------------------\n-- Table structure for rep_demo_order_product\n-- ----------------------------\nDROP TABLE IF EXISTS `rep_demo_order_product`;\nCREATE TABLE `rep_demo_order_product`  (\n  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `product_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '产品名字',\n  `price` double(32, 0) NULL DEFAULT NULL COMMENT '价格',\n  `num` int(11) NULL DEFAULT NULL COMMENT '数量',\n  `descc` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',\n  `order_fk_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '订单外键ID',\n  `pro_type` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '产品类型',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of rep_demo_order_product\n-- ----------------------------\nINSERT INTO `rep_demo_order_product` VALUES ('1331860890813284353', 'admin', '2020-11-26 15:22:35', NULL, NULL, '水果手机', 44, 44, '', '1256629667445714946', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('1551943088930004994', 'admin', '2022-10-29 17:16:26', NULL, NULL, '水果手机1', 11, 11, '11', '1551943088862896130', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('1551943088930004995', 'admin', '2022-07-26 22:50:40', NULL, NULL, '水果手机2', 2, 2, '2', '1551943088862896130', '2');\nINSERT INTO `rep_demo_order_product` VALUES ('15665749948861', 'admin', '2020-02-24 02:05:38', NULL, NULL, '水果手机3', 33, NULL, '', '402831816a38e7fd016a38e825c90003', '');\nINSERT INTO `rep_demo_order_product` VALUES ('1586557969318506498', 'admin', '2022-10-30 11:20:31', NULL, NULL, '小米手机3', 20003, 33, '3', '1586557968995545089', '2');\nINSERT INTO `rep_demo_order_product` VALUES ('1586557969381421058', 'admin', '2022-10-30 11:17:51', NULL, NULL, '华为手机1', 80001, 31, '11', '1586557968995545089', '2');\nINSERT INTO `rep_demo_order_product` VALUES ('15884388229280883233', 'admin', '2020-11-26 15:22:35', NULL, NULL, '华为手机', 25, 35, '345', '1256629667445714946', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('15884388229280883234', 'admin', '2020-11-26 15:22:35', NULL, NULL, '华为手机2', 25, 35, '345', '1256629667445714946', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('15884388229280883235', 'admin', '2020-11-26 15:22:35', NULL, NULL, '华为手机3', 25, 35, '345', '1256629667445714946', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('15884388229280883236', 'admin', '2020-11-26 15:22:35', NULL, NULL, '华为手机4', 25, 35, '345', '1256629667445714946', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('15884388229280883237', 'admin', '2020-11-26 15:22:35', NULL, NULL, '华为手机5', 25, 35, '345', '1256629667445714946', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('15884388229280883238', 'admin', '2020-11-26 15:22:35', NULL, NULL, '华为手机6', 25, 35, '345', '1256629667445714946', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('15884388229280883239', 'admin', '2020-11-26 15:22:35', NULL, NULL, '华为手机7', 25, 35, '345', '1256629667445714946', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('15884388229280883240', 'admin', '2020-11-26 15:22:35', NULL, NULL, '华为手机8', 25, 35, '345', '1256629667445714946', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('15884388229280883241', 'admin', '2020-11-26 15:22:35', NULL, NULL, '华为手机9', 25, 35, '345', '1256629667445714946', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('15884388229280883242', 'admin', '2020-11-26 15:22:35', NULL, NULL, '华为手机10', 25, 35, '345', '1256629667445714946', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('15884388229280883243', 'admin', '2020-11-26 15:22:35', NULL, NULL, '华为手机11', 25, 35, '345', '1256629667445714946', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('15884388229280883244', 'admin', '2020-11-26 15:22:35', NULL, NULL, '华为手机12', 25, 35, '345', '1256629667445714946', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('15884388229280883245', 'admin', '2020-11-26 15:22:35', NULL, NULL, '华为手机13', 25, 35, '345', '1256629667445714946', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('15884388229280883246', 'admin', '2020-11-26 15:22:35', NULL, NULL, '华为手机14', 25, 35, '345', '1256629667445714946', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('15884388229280883247', 'admin', '2020-11-26 15:22:35', NULL, NULL, '华为手机15', 25, 35, '345', '1256629667445714946', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('15884388229280883248', 'admin', '2020-11-26 15:22:35', NULL, NULL, '华为手机1', 25, 35, '345', '1256629667445714946', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('15884388231401967996', 'admin', '2020-07-11 11:36:36', NULL, NULL, '小米手机', 25, 35, '445', '1256629667445714946', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('15884388463052345317', 'admin', '2020-07-11 11:36:36', NULL, NULL, '小米手机1', 55, 55, '55', '1256629667445714946', '2');\nINSERT INTO `rep_demo_order_product` VALUES ('1589514837779251202', 'admin', '2022-11-07 15:07:24', NULL, NULL, '小米手机2', 2323, 2323, '', '1586557968995545089', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('1589514956499025921', 'admin', '2022-11-07 15:07:52', NULL, NULL, '小米手机3', 222, 222, '222', '1589514956490637313', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('1589514956515803137', 'admin', '2022-11-07 15:07:52', NULL, NULL, '小米手机4', NULL, NULL, '', '1589514956490637313', '');\nINSERT INTO `rep_demo_order_product` VALUES ('1589516804542922753', 'admin', '2022-11-23 17:20:56', NULL, NULL, '小米手机5', NULL, NULL, NULL, '1589516804530339842', NULL);\nINSERT INTO `rep_demo_order_product` VALUES ('1589516804551311361', 'admin', '2022-11-07 15:15:13', NULL, NULL, '小米手机6', NULL, NULL, NULL, '1589516804530339842', NULL);\nINSERT INTO `rep_demo_order_product` VALUES ('1597149156278525953', 'admin', '2022-11-28 16:43:27', NULL, NULL, '水果手机4', 2, 2, '22', '1597149156089782273', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('1683074969716346881', 'admin', '2023-12-06 15:26:44', NULL, NULL, '水果手机5', 5000, 21, '121', '1683074969561157634', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('1714472725034704898', 'admin', '2023-12-06 15:26:44', NULL, NULL, '办公椅子', 50, 100, NULL, '1683074969561157634', '1');\nINSERT INTO `rep_demo_order_product` VALUES ('1732300515406647298', 'admin', '2023-12-06 15:26:44', NULL, NULL, '笔记本电脑', 3, 3, NULL, '1683074969561157634', NULL);\nINSERT INTO `rep_demo_order_product` VALUES ('1732300515406647299', 'admin', '2023-12-06 15:26:44', NULL, NULL, '鼠标', 3, 3, NULL, '1683074969561157634', NULL);\nINSERT INTO `rep_demo_order_product` VALUES ('402831816a38e7fd016a38e7fdeb0001', 'admin', '2019-04-20 12:01:29', NULL, NULL, '笔记本', 100, 10, NULL, '402831816a38e7fd016a38e7fddf0000', NULL);\nINSERT INTO `rep_demo_order_product` VALUES ('402831816a38e7fd016a38e7fdf10002', 'admin', '2019-04-20 12:01:29', NULL, NULL, '显示器', 300, 1, NULL, '402831816a38e7fd016a38e7fddf0000', NULL);\nINSERT INTO `rep_demo_order_product` VALUES ('4028810c6b40244b016b406884080005', 'admin', '2020-02-24 02:05:38', NULL, NULL, '键盘', NULL, 33, '', '402831816a38e7fd016a38e825c90003', '');\n\n-- ----------------------------\n-- Table structure for sys_announcement\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_announcement`;\nCREATE TABLE `sys_announcement`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `titile` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标题',\n  `msg_content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '内容',\n  `start_time` datetime NULL DEFAULT NULL COMMENT '开始时间',\n  `end_time` datetime NULL DEFAULT NULL COMMENT '结束时间',\n  `sender` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '发布人',\n  `priority` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '优先级（L低，M中，H高）',\n  `msg_category` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '2' COMMENT '消息类型1:通知公告2:系统消息',\n  `msg_type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '通告对象类型（USER:指定用户，ALL:全体用户）',\n  `send_status` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '发布状态（0未发布，1已发布，2已撤销）',\n  `send_time` datetime NULL DEFAULT NULL COMMENT '发布时间',\n  `cancel_time` datetime NULL DEFAULT NULL COMMENT '撤销时间',\n  `del_flag` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '删除状态（0，正常，1已删除）',\n  `bus_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '业务类型(email:邮件 bpm:流程 tenant_invite:租户邀请)',\n  `bus_id` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '业务id',\n  `open_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '打开方式(组件：component 路由：url)',\n  `open_page` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '组件/路由 地址',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  `user_ids` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '指定用户',\n  `msg_abstract` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '摘要/扩展业务参数',\n  `dt_task_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '钉钉task_id，用于撤回消息',\n  `tenant_id` int(10) NULL DEFAULT 0 COMMENT '租户ID',\n  `files` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '附件',\n  `visits_num` int(11) NULL DEFAULT NULL COMMENT '访问次数',\n  `iz_top` int(10) NULL DEFAULT 0 COMMENT '是否置顶（0:否;  1:是）',\n  `iz_approval` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否审批（0否 1是）',\n  `bpm_status` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程状态',\n  `msg_classify` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '消息归类',\n  `notice_type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '通知类型(system:系统消息、file:知识库、flow:流程、plan:日程计划、meeting:会议)',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_sanno_endtime`(`end_time`) USING BTREE,\n  INDEX `idx_sanno_start_time`(`start_time`) USING BTREE,\n  INDEX `idx_sanno_msg_type`(`msg_type`) USING BTREE,\n  INDEX `idx_sanno_send_status`(`send_status`) USING BTREE,\n  INDEX `idx_sanno_del_flag`(`del_flag`) USING BTREE,\n  INDEX `idx_sanno_tenant_id`(`tenant_id`) USING BTREE,\n  INDEX `idx_sanno_sender`(`sender`) USING BTREE,\n  INDEX `idx_sanno_create_time`(`create_time`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统通告表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_announcement\n-- ----------------------------\nINSERT INTO `sys_announcement` VALUES ('1950442031319511042', '要放假了', '<p>我们都知道, 只要有意义, 那么就必须慎重考虑.既然如何, 带着这些问题, 我们来审视一下随机一段废话. 从这个角度来看, 在这种不可避免的冲突下，我们必须解决这个问题. 本人也是经过了深思熟虑,在每个日日夜夜思考这个问题. 随机一段废话因何而发生?<br>我们都知道, 只要有意义, 那么就必须慎重考虑.从这个角度来看, 从这个角度来看,&nbsp;<br>现在, 解决随机一段废话的问题, 是非常非常重要的. 所以</p>', NULL, NULL, 'admin', 'H', '1', 'ALL', '1', '2025-07-30 14:23:14', NULL, '0', NULL, NULL, NULL, NULL, 'admin', '2025-07-30 14:23:12', 'admin', '2025-07-30 14:23:14', '', '我们都知道, 只要有意义, 那么就必须慎重考虑', NULL, 0, NULL, NULL, 0, '0', '1', NULL, 'system');\nINSERT INTO `sys_announcement` VALUES ('1950447687359426562', '又又更新！JeecgBootv3.8.2Online专项升级来袭，引领AI低代码平台新时代～', '<h2 style=\\\"box-sizing: inherit; font-family: \\'PingFang SC\\', \\'Helvetica Neue\\', \\'Microsoft YaHei UI\\', \\'Microsoft YaHei\\', \\'Noto Sans CJK SC\\', Sathu, EucrosiaUPC, Arial, Helvetica, sans-serif; line-height: 1.8; margin: 0px 0px 16px; font-weight: 600; padding: 0px; font-size: 24px; border: none; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">项目介绍</h2>\\n<blockquote style=\\\"box-sizing: inherit; position: relative; margin: 0px 0px 20px; padding: 20px; background-color: rgb(246, 246, 246); border-left: 6px solid rgb(230, 230, 230); font-style: normal; font-weight: 400; word-break: break-word; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, \\'Apple Color Emoji\\', \\'Segoe UI Emoji\\', \\'Segoe UI Symbol\\', \\'Segoe UI\\', \\'PingFang SC\\', \\'Hiragino Sans GB\\', \\'Microsoft YaHei\\', \\'Helvetica Neue\\', Helvetica, Arial, sans-serif; font-size: 16px; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">\\n<p style=\\\"box-sizing: inherit; margin: 0px; line-height: inherit;\\\">JeecgBoot 是一款集成 AI 应用的，基于 BPM 流程的低代码平台，旨在帮助开发者快速实现低代码开发和构建、部署个性化的 AI 应用。 前后端分离架构 Ant Design&amp;Vue3，SpringBoot，SpringCloud，Mybatis，Shiro，强大的代码生成器让前后端代码一键生成，无需写任何代码！ 成套 AI 大模型功能: AI 模型、AI 应用、知识库、AI 流程编排、AI 对话等； 引领 AI 低代码开发模式， 帮助 Java 项目解决 80% 的重复工作，让开发更多关注业务，提高效率，同时又不失灵活性！</p>\\n</blockquote>\\n<p style=\\\"box-sizing: inherit; margin: 0px 0px 20px; line-height: inherit; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, \\'Apple Color Emoji\\', \\'Segoe UI Emoji\\', \\'Segoe UI Symbol\\', \\'Segoe UI\\', \\'PingFang SC\\', \\'Hiragino Sans GB\\', \\'Microsoft YaHei\\', \\'Helvetica Neue\\', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\"><strong style=\\\"box-sizing: inherit; font-weight: bold;\\\">发版时间</strong>：v3.8.2 | 2025-08-04</p>\\n<h4 style=\\\"box-sizing: inherit; font-family: \\'PingFang SC\\', \\'Helvetica Neue\\', \\'Microsoft YaHei UI\\', \\'Microsoft YaHei\\', \\'Noto Sans CJK SC\\', Sathu, EucrosiaUPC, Arial, Helvetica, sans-serif; line-height: 1.8; margin: 22px 0px 16px; font-weight: 600; padding: 0px; font-size: 20px; border: none; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">源码下载</h4>\\n<ul style=\\\"box-sizing: inherit; padding-inline-start: 40px !important; margin: 0px 0px 20px; padding: 0px 0px 0px 20px; list-style-type: disc; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, \\'Apple Color Emoji\\', \\'Segoe UI Emoji\\', \\'Segoe UI Symbol\\', \\'Segoe UI\\', \\'PingFang SC\\', \\'Hiragino Sans GB\\', \\'Microsoft YaHei\\', \\'Helvetica Neue\\', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em; margin-top: 0px;\\\">Github 地址：<span>&nbsp;</span><a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">https://github.com/jeecgboot/JeecgBoot</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em; margin-bottom: 0px;\\\">Gitee 地址：<span>&nbsp;</span><a href=\\\"https://gitee.com/jeecg/JeecgBoot\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\">https://gitee.com/jeecg/JeecgBoot</a></li>\\n</ul>\\n<h4 style=\\\"box-sizing: inherit; font-family: \\'PingFang SC\\', \\'Helvetica Neue\\', \\'Microsoft YaHei UI\\', \\'Microsoft YaHei\\', \\'Noto Sans CJK SC\\', Sathu, EucrosiaUPC, Arial, Helvetica, sans-serif; line-height: 1.8; margin: 22px 0px 16px; font-weight: 600; padding: 0px; font-size: 20px; border: none; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">升级日志</h4>\\n<blockquote style=\\\"box-sizing: inherit; position: relative; margin: 0px 0px 20px; padding: 20px; background-color: rgb(246, 246, 246); border-left: 6px solid rgb(230, 230, 230); font-style: normal; font-weight: 400; word-break: break-word; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, \\'Apple Color Emoji\\', \\'Segoe UI Emoji\\', \\'Segoe UI Symbol\\', \\'Segoe UI\\', \\'PingFang SC\\', \\'Hiragino Sans GB\\', \\'Microsoft YaHei\\', \\'Helvetica Neue\\', Helvetica, Arial, sans-serif; font-size: 16px; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">\\n<p style=\\\"box-sizing: inherit; margin: 0px; line-height: inherit;\\\">重点升级 Online 在线开发功能，支持 AI 建表、AI 生成报表；代码生成支持自定义按钮和 js 增强的结构方法生成，便于用户填充逻辑；</p>\\n</blockquote>\\n<h5 style=\\\"box-sizing: inherit; font-family: \\'PingFang SC\\', \\'Helvetica Neue\\', \\'Microsoft YaHei UI\\', \\'Microsoft YaHei\\', \\'Noto Sans CJK SC\\', Sathu, EucrosiaUPC, Arial, Helvetica, sans-serif; line-height: 1.8; margin: 22px 0px 16px; font-weight: 600; padding: 0px; font-size: 18px; border: none; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">修复 issue</h5>\\n<ul style=\\\"box-sizing: inherit; padding-inline-start: 40px !important; margin: 0px 0px 20px; padding: 0px 0px 0px 20px; list-style-type: disc; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, \\'Apple Color Emoji\\', \\'Segoe UI Emoji\\', \\'Segoe UI Symbol\\', \\'Segoe UI\\', \\'PingFang SC\\', \\'Hiragino Sans GB\\', \\'Microsoft YaHei\\', \\'Helvetica Neue\\', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em; margin-top: 0px;\\\">【架构升级】升级 mybatis-plus 到 3.5.12、升级 jsqlparser 到 4.9</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">【架构升级】升级 jimureport 到 v2.1.1</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">【架构升级】升级 jimubi 到 v2.1.0</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">【架构升级】升级 online 到 3.8.2-beta</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">【新功能】APP 版本管理功能，支持 app 自动补丁升级</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">【新功能】独立门户设置菜单，支持角色和用户两个维度自定义首页</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">【新功能】online 报表支持 AI 生成报表</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">【新功能】online 功能测试支持 Mock 数据</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">【新功能】online 表单支持 AI 建表</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">【新功能】online 表单视图支持删除</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">【新功能】online 生成的菜单 sql 自动带上组件名称</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">【online 增强】支持页面 loading 调用</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">【issues/8548】代码生成的高级查询里日期 - 月控件不能正常展示</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">【issues/8163】关联记录新增丢失</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">【issues/8575】erp 默认选中第一个及没选中主表时子表不查询</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">【issues/8168】id 重复排序数据重了</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">【issues/888】online 树表子节点搜索不生效且有警告</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">【严重 bug】xxljob 和 jeecg-boot-starter 的 xxl-job 版本不一致，定时任务执行后任务不会结束</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">redis 缓存扩展用户可以自定义缓存</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">Customize redis listener handle 提醒日志，改成只提示一次</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">【issues/8265】默认模型支持超时时间设置</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">jeecg-boot-vue3 前端构建报错解决方案・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8497\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8497</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">Form 表单，点击 label 会 focus 到表格查询条件的 input 框上・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8484\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8484</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">Online 表单开发・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8286\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8286</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">online 表单生成问题・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8441\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8441</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">能不能继承 app 端版本管理・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8362\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8362</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">关于 AI 应用回复模型无法访问导致潜在问题・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8440\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8440</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">低代码开发 Online 表单开发主子表 ERP 显示问题・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8532\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8532</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">ApiSelect 分页加载重复请求问题・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8527\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8527</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">启动 democloud 服务时出现循环依赖报错・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8573\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8573</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">useScript.ts 的 isLoading 默认值应该是 true・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8552\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8552</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">BasicTable 不支持 TableLayout 设置 (默认写死 fixed)・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8564\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8564</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">严重：修改密码存在水平越权问题。・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8567\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8567</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">大模型设置 timeout，没有生效，并且总在报错超时之后，才返回相应结果・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8557\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8557</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">批量删除优化反馈・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8558\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8558</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">yml 文件中的 quart 配置 initialize-schema 属性层级错误・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8540\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8540</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">xxljob 和 jeecg-boot-starter 的 xxl-job 版本不一致，定时任务执行后任务不会结束・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8621\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8621</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">online 表单 一对多 erp 模式下子表刷新问题・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8575\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8575</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">springboot3 分支，knife4j 不能正确显示文档，但是 swagger-ui 和 v3/api-docs 正常・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8638\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8638</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">Swagger3 接口文档异常・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8631\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8631</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">springboot3 版本 3.8.1， knife4j-production 不生效・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8624\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8624</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">列权限控制问题・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8518\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8518</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em; margin-bottom: 0px;\\\">行尾合计汇总问题・<a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2F8502\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Issue #8502</a></li>\\n</ul>\\n<h4 style=\\\"box-sizing: inherit; font-family: \\'PingFang SC\\', \\'Helvetica Neue\\', \\'Microsoft YaHei UI\\', \\'Microsoft YaHei\\', \\'Noto Sans CJK SC\\', Sathu, EucrosiaUPC, Arial, Helvetica, sans-serif; line-height: 1.8; margin: 22px 0px 16px; font-weight: 600; padding: 0px; font-size: 20px; border: none; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">技术交流</h4>\\n<ul style=\\\"box-sizing: inherit; padding-inline-start: 40px !important; margin: 0px 0px 20px; padding: 0px 0px 0px 20px; list-style-type: disc; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, \\'Apple Color Emoji\\', \\'Segoe UI Emoji\\', \\'Segoe UI Symbol\\', \\'Segoe UI\\', \\'PingFang SC\\', \\'Hiragino Sans GB\\', \\'Microsoft YaHei\\', \\'Helvetica Neue\\', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em; margin-top: 0px;\\\">官方网站：<span>&nbsp;</span><a href=\\\"https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fwww.jeecg.com\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">http://www.jeecg.com</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">在线演示：<a href=\\\"https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fboot3.jeecg.com\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">http://boot3.jeecg.com</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">入门指南：<span>&nbsp;</span><a href=\\\"https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fwww.jeecg.com%2Fdoc%2Fquickstart\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">快速入门</a><span>&nbsp;</span>|<span>&nbsp;</span><a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fhelp.jeecg.com\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">开发文档</a><span>&nbsp;</span>|<span>&nbsp;</span><a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fhelp.jeecg.com%2Faigc\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">AI 应用使用手册</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em; margin-bottom: 0px;\\\">技术支持：<span>&nbsp;</span><a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fjeecgboot%2FJeecgBoot%2Fissues%2Fnew%3Ftemplate%3Dbug_report.md\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">反馈问题</a><span>&nbsp;</span>|<span>&nbsp;</span><a href=\\\"https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fjeecg.com%2Fdoc%2Fvideo\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">视频教程</a><span>&nbsp;</span>|<span>&nbsp;</span><a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fjeecg.blog.csdn.net%2Farticle%2Fdetails%2F106079007\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">低代码体验一分钟</a></li>\\n</ul>\\n<h4 style=\\\"box-sizing: inherit; font-family: \\'PingFang SC\\', \\'Helvetica Neue\\', \\'Microsoft YaHei UI\\', \\'Microsoft YaHei\\', \\'Noto Sans CJK SC\\', Sathu, EucrosiaUPC, Arial, Helvetica, sans-serif; line-height: 1.8; margin: 22px 0px 16px; font-weight: 600; padding: 0px; font-size: 20px; border: none; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">快速启动项目</h4>\\n<ul style=\\\"box-sizing: inherit; padding-inline-start: 40px !important; margin: 0px 0px 20px; padding: 0px 0px 0px 20px; list-style-type: disc; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, \\'Apple Color Emoji\\', \\'Segoe UI Emoji\\', \\'Segoe UI Symbol\\', \\'Segoe UI\\', \\'PingFang SC\\', \\'Hiragino Sans GB\\', \\'Microsoft YaHei\\', \\'Helvetica Neue\\', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em; margin-top: 0px;\\\"><a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fhelp.jeecg.com%2Fjava%2Fsetup%2Fidea%2Fstartup\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">IDEA 启动前后端项目</a></li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em; margin-bottom: 0px;\\\"><a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fhelp.jeecg.com%2Fjava%2Fdocker%2Fquick\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">Docker 一键启动前后端</a></li>\\n</ul>\\n<h4 style=\\\"box-sizing: inherit; font-family: \\'PingFang SC\\', \\'Helvetica Neue\\', \\'Microsoft YaHei UI\\', \\'Microsoft YaHei\\', \\'Noto Sans CJK SC\\', Sathu, EucrosiaUPC, Arial, Helvetica, sans-serif; line-height: 1.8; margin: 22px 0px 16px; font-weight: 600; padding: 0px; font-size: 20px; border: none; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">AI 应用平台介绍</h4>\\n<p style=\\\"box-sizing: inherit; margin: 0px 0px 20px; line-height: inherit; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, \\'Apple Color Emoji\\', \\'Segoe UI Emoji\\', \\'Segoe UI Symbol\\', \\'Segoe UI\\', \\'PingFang SC\\', \\'Hiragino Sans GB\\', \\'Microsoft YaHei\\', \\'Helvetica Neue\\', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">JeecgBoot 平台提供了一套完善的 AI 应用管理系统模块，是一套类似<span>&nbsp;</span><code style=\\\"box-sizing: inherit; font-family: Consolas, Monaco, \\'Andale Mono\\', \\'Ubuntu Mono\\', monospace; font-size: 13px; margin: 0px 3px; padding: 3px 4px; border: none; border-radius: 4px; background: rgb(246, 246, 246); color: rgb(51, 51, 51);\\\">Dify</code><span>&nbsp;</span>的<span>&nbsp;</span><code style=\\\"box-sizing: inherit; font-family: Consolas, Monaco, \\'Andale Mono\\', \\'Ubuntu Mono\\', monospace; font-size: 13px; margin: 0px 3px; padding: 3px 4px; border: none; border-radius: 4px; background: rgb(246, 246, 246); color: rgb(51, 51, 51);\\\">AIGC应用开发平台</code><span>&nbsp;</span>+<span>&nbsp;</span><code style=\\\"box-sizing: inherit; font-family: Consolas, Monaco, \\'Andale Mono\\', \\'Ubuntu Mono\\', monospace; font-size: 13px; margin: 0px 3px; padding: 3px 4px; border: none; border-radius: 4px; background: rgb(246, 246, 246); color: rgb(51, 51, 51);\\\">知识库问答</code>，是一款基于 LLM 大语言模型 AI 应用平台和 RAG 的知识库问答系统。 其直观的界面结合了 AI 流程编排、RAG 管道、知识库管理、模型管理、对接向量库、实时运行可观察等，让您可以快速从原型到生产，拥有 AI 服务能力。<span>&nbsp;</span><a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fhelp.jeecg.com%2Faigc\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">详细专题介绍，请点击查看</a></p>\\n<h4 style=\\\"box-sizing: inherit; font-family: \\'PingFang SC\\', \\'Helvetica Neue\\', \\'Microsoft YaHei UI\\', \\'Microsoft YaHei\\', \\'Noto Sans CJK SC\\', Sathu, EucrosiaUPC, Arial, Helvetica, sans-serif; line-height: 1.8; margin: 22px 0px 16px; font-weight: 600; padding: 0px; font-size: 20px; border: none; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">适用项目</h4>\\n<p style=\\\"box-sizing: inherit; margin: 0px 0px 20px; line-height: inherit; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, \\'Apple Color Emoji\\', \\'Segoe UI Emoji\\', \\'Segoe UI Symbol\\', \\'Segoe UI\\', \\'PingFang SC\\', \\'Hiragino Sans GB\\', \\'Microsoft YaHei\\', \\'Helvetica Neue\\', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">JeecgBoot 低代码平台，可以应用在任何 J2EE 项目的开发中，支持信创国产化。尤其适合 SAAS 项目、企业信息管理系统（MIS）、内部办公系统（OA）、企业资源计划系统（ERP）、客户关系管理系统（CRM）、AI 知识库等，其半智能手工 Merge 的开发方式，可以显著提高开发效率 70% 以上，极大降低开发成本。 又是一个全栈式 AI 开发平台，快速帮助企业构建和部署个性化的 AI 应用。</p>\\n<p style=\\\"box-sizing: inherit; margin: 0px 0px 20px; line-height: inherit; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, \\'Apple Color Emoji\\', \\'Segoe UI Emoji\\', \\'Segoe UI Symbol\\', \\'Segoe UI\\', \\'PingFang SC\\', \\'Hiragino Sans GB\\', \\'Microsoft YaHei\\', \\'Helvetica Neue\\', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\"><strong style=\\\"box-sizing: inherit; font-weight: bold;\\\">信创兼容说明</strong></p>\\n<ul style=\\\"box-sizing: inherit; padding-inline-start: 40px !important; margin: 0px 0px 20px; padding: 0px 0px 0px 20px; list-style-type: disc; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, \\'Apple Color Emoji\\', \\'Segoe UI Emoji\\', \\'Segoe UI Symbol\\', \\'Segoe UI\\', \\'PingFang SC\\', \\'Hiragino Sans GB\\', \\'Microsoft YaHei\\', \\'Helvetica Neue\\', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em; margin-top: 0px;\\\">操作系统：国产麒麟、银河麒麟等国产系统几乎都是基于 Linux 内核，因此它们具有良好的兼容性。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">数据库：达梦、人大金仓、TiDB</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em; margin-bottom: 0px;\\\">中间件：东方通 TongWeb、TongRDS，宝兰德 AppServer、CacheDB,<span>&nbsp;</span><a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fhelp.jeecg.com%2Fjava%2Ftongweb-deploy%2F\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">信创配置文档</a></li>\\n</ul>\\n<h4 style=\\\"box-sizing: inherit; font-family: \\'PingFang SC\\', \\'Helvetica Neue\\', \\'Microsoft YaHei UI\\', \\'Microsoft YaHei\\', \\'Noto Sans CJK SC\\', Sathu, EucrosiaUPC, Arial, Helvetica, sans-serif; line-height: 1.8; margin: 22px 0px 16px; font-weight: 600; padding: 0px; font-size: 20px; border: none; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">为什么选择 JeecgBoot?</h4>\\n<blockquote style=\\\"box-sizing: inherit; position: relative; margin: 0px 0px 20px; padding: 20px; background-color: rgb(246, 246, 246); border-left: 6px solid rgb(230, 230, 230); font-style: normal; font-weight: 400; word-break: break-word; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, \\'Apple Color Emoji\\', \\'Segoe UI Emoji\\', \\'Segoe UI Symbol\\', \\'Segoe UI\\', \\'PingFang SC\\', \\'Hiragino Sans GB\\', \\'Microsoft YaHei\\', \\'Helvetica Neue\\', Helvetica, Arial, sans-serif; font-size: 16px; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">\\n<p style=\\\"box-sizing: inherit; margin: 0px; line-height: inherit;\\\">开源界 \\\"小普元\\\" 超越传统商业平台。引领低代码开发模式 (OnlineCoding-&gt; 代码生成器 -&gt; 手工 MERGE)，低代码开发同时又支持灵活编码， 可以帮助解决 Java 项目 70% 的重复工作，让开发更多关注业务。既能快速提高开发效率，节省成本，同时又不失灵活性。</p>\\n</blockquote>\\n<ul style=\\\"box-sizing: inherit; padding-inline-start: 40px !important; margin: 0px 0px 20px; padding: 0px 0px 0px 20px; list-style-type: disc; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, \\'Apple Color Emoji\\', \\'Segoe UI Emoji\\', \\'Segoe UI Symbol\\', \\'Segoe UI\\', \\'PingFang SC\\', \\'Hiragino Sans GB\\', \\'Microsoft YaHei\\', \\'Helvetica Neue\\', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em; margin-top: 0px;\\\">1. 采用最新主流前后分离框架（Spring Boot + MyBatis + Ant Design4 + Vue3），容易上手；代码生成器依赖性低，灵活的扩展能力，可快速实现二次开发。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">2. 前端大版本换代，最新版采用 Vue3.0 + TypeScript + Vite6 + Ant Design Vue4 等新技术方案。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">3. 支持微服务 Spring Cloud Alibaba（Nacos、Gateway、Sentinel、Skywalking），提供简易机制，支持单体和微服务自由切换（这样可以满足各类项目需求）。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">4. 开发效率高，支持在线建表和 AI 建表，提供强大代码生成器，单表、树列表、一对多、一对一等数据模型，增删改查功能一键生成，菜单配置直接使用。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">5. 代码生成器提供强大模板机制，支持自定义模板，目前提供四套风格模板（单表两套、树模型一套、一对多三套）。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">6. 提供强大的报表和大屏可视化工具，支持丰富的数据源连接，能够通过拖拉拽方式快速制作报表、大屏和门户设计；支持多种图表类型：柱形图、折线图、散点图、饼图、环形图、面积图、漏斗图、进度图、仪表盘、雷达图、地图等。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">7. 低代码能力：在线表单（无需编码，通过在线配置表单，实现表单的增删改查，支持单表、树、一对多、一对一等模型，实现人人皆可编码），在线配置零代码开发、所见即所得支持 23 种类控件。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">8. 低代码能力：在线报表、在线图表（无需编码，通过在线配置方式，实现数据报表和图形报表，可以快速抽取数据，减轻开发压力，实现人人皆可编码）。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">9.Online 支持在线增强开发，提供在线代码编辑器，支持代码高亮、代码提示等功能，支持多种语言（Java、SQL、JavaScript 等）。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">10. 封装完善的用户、角色、菜单、组织机构、数据字典、在线定时任务等基础功能，支持访问授权、按钮权限、数据权限等功能。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">11. 前端 UI 提供丰富的组件库，支持各种常用组件，如表格、树形控件、下拉框、日期选择器等，满足各种复杂的业务需求<span>&nbsp;</span><a href=\\\"https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fhelp.jeecg.com%2Fcategory%2Fui%25E7%25BB%2584%25E4%25BB%25B6%25E5%25BA%2593\\\" target=\\\"_blank\\\" style=\\\"box-sizing: inherit; background-color: transparent; color: rgb(52, 111, 182); text-decoration: none;\\\" rel=\\\"noopener\\\">UI 组件库文档</a>。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">12. 提供 APP 配套框架，一份多代码多终端适配，一份代码多终端适配，小程序、H5、安卓、iOS、鸿蒙 Next。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">13. 新版 APP 框架采用 Uniapp、Vue3.0、Vite、Wot-design-uni、TypeScript 等最新技术栈，包括二次封装组件、路由拦截、请求拦截等功能。实现了与 JeecgBoot 完美对接：目前已经实现登录、用户信息、通讯录、公告、移动首页、九宫格、聊天、Online 表单、仪表盘等功能，提供了丰富的组件。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">14. 提供了一套成熟的 AI 应用平台功能，从 AI 模型、知识库到 AI 应用搭建，助力企业快速落地 AI 服务，加速智能化升级。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">15.AI 能力：目前 JeecgBoot 支持 AI 大模型 chatgpt 和 deepseek，现在最新版默认使用 deepseek，速度更快质量更高。目前提供了 AI 对话助手、AI 知识库、AI 应用、AI 建表、AI 报表等功能。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">16. 提供新行编辑表格 JVXETable，轻松满足各种复杂 ERP 布局，拥有更高的性能、更灵活的扩展、更强大的功能。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">17. 平台首页风格，提供多种组合模式，支持自定义风格；支持门户设计，支持自定义首页。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">18. 常用共通封装，各种工具类（定时任务、短信接口、邮件发送、Excel 导入导出等），基本满足 80% 项目需求。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">19. 简易 Excel 导入导出，支持单表导出和一对多表模式导出，生成的代码自带导入导出功能。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">20. 集成智能报表工具，报表打印、图像报表和数据导出非常方便，可极其方便地生成 PDF、Excel、Word 等报表。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">21. 采用前后分离技术，页面 UI 风格精美，针对常用组件做了封装：时间、行表格控件、截取显示控件、报表组件、编辑器等。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">22. 查询过滤器：查询功能自动生成，后台动态拼 SQL 追加查询条件；支持多种匹配方式（全匹配 / 模糊查询 / 包含查询 / 不匹配查询）。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">23. 数据权限（精细化数据权限控制，控制到行级、列表级、表单字段级，实现不同人看不同数据，不同人对同一个页面操作不同字段）。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">24. 接口安全机制，可细化控制接口授权，非常简便实现不同客户端只看自己数据等控制；也提供了基于 AK 和 SK 认证鉴权的 OpenAPI 功能。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">25. 活跃的社区支持；近年来，随着网络威胁的日益增加，团队在安全和漏洞管理方面积累了丰富的经验，能够为企业提供全面的安全解决方案。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">26. 权限控制采用 RBAC（Role-Based Access Control，基于角色的访问控制）。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">27. 页面校验自动生成（必须输入、数字校验、金额校验、时间空间等）。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">28. 支持 SaaS 服务模式，提供 SaaS 多租户架构方案。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">29. 分布式文件服务，集成 MinIO、阿里 OSS 等优秀的第三方，提供便捷的文件上传与管理，同时也支持本地存储。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">30. 主流数据库兼容，一套代码完全兼容 MySQL、PostgreSQL、Oracle、SQL Server、MariaDB、达梦、人大金仓等主流数据库。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">31. 集成工作流 Flowable，并实现了只需在页面配置流程转向，可极大简化 BPM 工作流的开发；用 BPM 的流程设计器画出了流程走向，一个工作流基本就完成了，只需写很少量的 Java 代码。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">32. 低代码能力：在线流程设计，采用开源 Flowable 流程引擎，实现在线画流程、自定义表单、表单挂靠、业务流转。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">33. 多数据源：极其简易的使用方式，在线配置数据源配置，便捷地从其他数据抓取数据。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">34. 提供单点登录 CAS 集成方案，项目中已经提供完善的对接代码。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">35. 低代码能力：表单设计器，支持用户自定义表单布局，支持单表、一对多表单，支持 select、radio、checkbox、textarea、date、popup、列表、宏等控件。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">36. 专业接口对接机制，统一采用 RESTful 接口方式，集成 Swagger-UI 在线接口文档，JWT token 安全验证，方便客户端对接。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">37. 高级组合查询功能，在线配置支持主子表关联查询，可保存查询历史。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">38. 提供各种系统监控，实时跟踪系统运行情况（监控 Redis、Tomcat、JVM、服务器信息、请求追踪、SQL 监控）。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">39. 消息中心（支持短信、邮件、微信推送等）；集成 WebSocket 消息通知机制。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">40. 支持多语言，提供国际化方案。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">41. 数据变更记录日志，可记录数据每次变更内容，通过版本对比功能查看历史变化。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">42. 提供简单易用的打印插件，支持谷歌、火狐、IE11 + 等各种浏览器。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">43. 后端采用 Maven 分模块开发方式；前端支持菜单动态路由。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em; margin-bottom: 0px;\\\">44. 提供丰富的示例代码，涵盖了常用的业务场景，便于学习和参考。</li>\\n</ul>\\n<h4 style=\\\"box-sizing: inherit; font-family: \\'PingFang SC\\', \\'Helvetica Neue\\', \\'Microsoft YaHei UI\\', \\'Microsoft YaHei\\', \\'Noto Sans CJK SC\\', Sathu, EucrosiaUPC, Arial, Helvetica, sans-serif; line-height: 1.8; margin: 22px 0px 16px; font-weight: 600; padding: 0px; font-size: 20px; border: none; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">技术架构：</h4>\\n<h6 style=\\\"box-sizing: inherit; font-weight: 600; line-height: 1.8; margin: 22px 0px 16px; padding: 0px; border: none; font-size: 16px; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, \\'Apple Color Emoji\\', \\'Segoe UI Emoji\\', \\'Segoe UI Symbol\\', \\'Segoe UI\\', \\'PingFang SC\\', \\'Hiragino Sans GB\\', \\'Microsoft YaHei\\', \\'Helvetica Neue\\', Helvetica, Arial, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">前端</h6>\\n<ul style=\\\"box-sizing: inherit; padding-inline-start: 40px !important; margin: 0px 0px 20px; padding: 0px 0px 0px 20px; list-style-type: disc; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, \\'Apple Color Emoji\\', \\'Segoe UI Emoji\\', \\'Segoe UI Symbol\\', \\'Segoe UI\\', \\'PingFang SC\\', \\'Hiragino Sans GB\\', \\'Microsoft YaHei\\', \\'Helvetica Neue\\', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em; margin-top: 0px;\\\">前端环境要求：Node.js 要求<span>&nbsp;</span><code style=\\\"box-sizing: inherit; font-family: Consolas, Monaco, \\'Andale Mono\\', \\'Ubuntu Mono\\', monospace; font-size: 13px; margin: 0px 3px; padding: 3px 4px; border: none; border-radius: 4px; background: rgb(246, 246, 246); color: rgb(51, 51, 51);\\\">Node 20+</code><span>&nbsp;</span>版本以上、pnpm 要求<span>&nbsp;</span><code style=\\\"box-sizing: inherit; font-family: Consolas, Monaco, \\'Andale Mono\\', \\'Ubuntu Mono\\', monospace; font-size: 13px; margin: 0px 3px; padding: 3px 4px; border: none; border-radius: 4px; background: rgb(246, 246, 246); color: rgb(51, 51, 51);\\\">9+</code><span>&nbsp;</span>版本以上</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">依赖管理：node、npm、pnpm</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">前端 IDE 建议：IDEA、WebStorm、Vscode</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">采用 Vue3.0+TypeScript+Vite6+Ant-Design-Vue4 等新技术方案，包括二次封装组件、utils、hooks、动态菜单、权限校验、按钮级别权限控制等功能</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em; margin-bottom: 0px;\\\">最新技术栈：Vue3.0 + TypeScript + Vite6 + ant-design-vue4 + pinia + echarts + unocss + vxe-table + qiankun + es6</li>\\n</ul>\\n<h6 style=\\\"box-sizing: inherit; font-weight: 600; line-height: 1.8; margin: 22px 0px 16px; padding: 0px; border: none; font-size: 16px; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, \\'Apple Color Emoji\\', \\'Segoe UI Emoji\\', \\'Segoe UI Symbol\\', \\'Segoe UI\\', \\'PingFang SC\\', \\'Hiragino Sans GB\\', \\'Microsoft YaHei\\', \\'Helvetica Neue\\', Helvetica, Arial, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">后端</h6>\\n<ul style=\\\"box-sizing: inherit; padding-inline-start: 40px !important; margin: 0px 0px 20px; padding: 0px 0px 0px 20px; list-style-type: disc; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, \\'Apple Color Emoji\\', \\'Segoe UI Emoji\\', \\'Segoe UI Symbol\\', \\'Segoe UI\\', \\'PingFang SC\\', \\'Hiragino Sans GB\\', \\'Microsoft YaHei\\', \\'Helvetica Neue\\', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em; margin-top: 0px;\\\">IDE 建议： IDEA (必须安装 lombok 插件)</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">语言：Java 默认 jdk17 (支持 jdk8、jdk21)</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">依赖管理：Maven</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">基础框架：Spring Boot 2.7.18</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">微服务框架： Spring Cloud Alibaba 2021.0.6.2</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">持久层框架：MybatisPlus 3.5.3.2</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">报表工具： JimuReport 1.9.5</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">安全框架：Apache Shiro 1.13.0，Jwt 4.5.0</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">微服务技术栈：Spring Cloud Alibaba、Nacos、Gateway、Sentinel、Skywalking</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">数据库连接池：阿里巴巴 Druid 1.1.24</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">AI 大模型：支持<span>&nbsp;</span><code style=\\\"box-sizing: inherit; font-family: Consolas, Monaco, \\'Andale Mono\\', \\'Ubuntu Mono\\', monospace; font-size: 13px; margin: 0px 3px; padding: 3px 4px; border: none; border-radius: 4px; background: rgb(246, 246, 246); color: rgb(51, 51, 51);\\\">ChatGPT</code><span>&nbsp;</span><code style=\\\"box-sizing: inherit; font-family: Consolas, Monaco, \\'Andale Mono\\', \\'Ubuntu Mono\\', monospace; font-size: 13px; margin: 0px 3px; padding: 3px 4px; border: none; border-radius: 4px; background: rgb(246, 246, 246); color: rgb(51, 51, 51);\\\">DeepSeek</code><span>&nbsp;</span>切换</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">日志打印：logback</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">缓存：Redis</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em;\\\">其他：autopoi, fastjson，poi，Swagger-ui，quartz, lombok（简化代码）等。</li>\\n<li style=\\\"box-sizing: inherit; line-height: 1.875em; margin-bottom: 0px;\\\">默认提供 MySQL5.7 + 数据库脚本</li>\\n</ul>\\n<h4 style=\\\"box-sizing: inherit; font-family: \\'PingFang SC\\', \\'Helvetica Neue\\', \\'Microsoft YaHei UI\\', \\'Microsoft YaHei\\', \\'Noto Sans CJK SC\\', Sathu, EucrosiaUPC, Arial, Helvetica, sans-serif; line-height: 1.8; margin: 22px 0px 16px; font-weight: 600; padding: 0px; font-size: 20px; border: none; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\">微服务架构图</h4>\\n<p style=\\\"box-sizing: inherit; margin: 0px 0px 20px; line-height: inherit; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, \\'Apple Color Emoji\\', \\'Segoe UI Emoji\\', \\'Segoe UI Symbol\\', \\'Segoe UI\\', \\'PingFang SC\\', \\'Hiragino Sans GB\\', \\'Microsoft YaHei\\', \\'Helvetica Neue\\', Helvetica, Arial, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;\\\"><img src=\\\"https://oscimg.oschina.net/oscnet/up-32fae06d9114ee4fcbf3d2931be2ff02b28.png\\\" alt=\\\"\\\" class=\\\"zoom-in-cursor\\\" style=\\\"box-sizing: border-box; border: 0px; margin: 0px auto; max-width: 80%; height: auto; vertical-align: middle; cursor: zoom-in;\\\"></p>', NULL, NULL, 'admin', 'H', '1', 'ALL', '1', '2025-07-30 14:45:43', NULL, '0', NULL, NULL, NULL, NULL, 'admin', '2025-07-30 14:45:41', 'admin', '2025-07-30 14:45:43', '', '重点升级 Online 在线开发功能，支持 AI 建表、AI 生成报表；代码生成支持自定义按钮和 js 增强的结构方法生成，便于用户填充逻辑；', NULL, 0, NULL, NULL, 0, '0', '1', NULL, 'system');\nINSERT INTO `sys_announcement` VALUES ('1957252479913807873', '要放假了', '<p>这样看来, 了解清楚随机一段废话到底是一种怎么样的存在, 是解决一切问题的关键.<br>而这些并不是完全重要, 更加重要的问题是, 所谓随机一段废话, 关键是随机一段废话需要如何写. 随机一段废话的发生, 到底需要如何做到, 不随机一段废话的发生, 又会如何产生. 生活中, 若随机一段废话出现了, 我们就不得不考虑它出现了的事实. 我们不妨可以这样来想:&nbsp;</p>\\n<p>这样看来, 要想清楚, 随机一段废话,</p>', NULL, NULL, 'admin', 'H', '1', 'ALL', '1', '2025-08-18 09:25:32', NULL, '0', NULL, NULL, NULL, NULL, 'admin', '2025-08-18 09:25:30', 'admin', '2025-08-18 09:25:32', '', '国庆放假安排', NULL, 0, NULL, NULL, 0, '0', '1', NULL, 'system');\nINSERT INTO `sys_announcement` VALUES ('1957253130366472194', '【重磅】JimuReport积木报表v2.0版本发布，免费可视化报表', '<p>【重磅】JimuReport 积木报表 v2.0 版本发布，免费可视化报表</p>', NULL, NULL, 'admin', 'H', '1', 'ALL', '1', '2025-08-18 09:28:20', NULL, '0', NULL, NULL, NULL, NULL, 'admin', '2025-08-18 09:28:05', 'admin', '2025-08-18 09:28:20', '', '【重磅】JimuReport 积木报表 v2.0 版本发布，免费可视化报表', NULL, 0, NULL, NULL, 0, '0', '1', NULL, 'system');\nINSERT INTO `sys_announcement` VALUES ('1966817120570503169', '您已被 管理员 从 北京国炬信息技术有限公司中移除。', '您已被 管理员 从 北京国炬信息技术有限公司中移除。', NULL, NULL, 'system', 'M', '2', 'USER', '1', '2025-09-13 18:51:58', NULL, '0', NULL, NULL, NULL, NULL, 'admin', '2025-09-13 18:51:58', NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, 0, NULL, NULL, NULL, 'system');\nINSERT INTO `sys_announcement` VALUES ('1993520100581388289', '还有两个月就过年了', '<p>本人也是经过了深思熟虑,在每个日日夜夜思考这个问题. 既然如何, 现在, 解决随机一段废话的问题, 是非常非常重要的. 所以, 我们不妨可以这样来想: 要想清楚, 随机一段废话, 到底是一种怎么样的存在. 要想清楚, 随机一段废话, 到底是一种怎么样的存在. 我们一般认为, 抓住了问题的关键, 其他一切则会迎刃而解.生活中, 若随机一段废话出现了, 我们就不得不考虑它出现了的事实. 我们都</p>', NULL, NULL, 'admin', 'H', '1', 'ALL', '1', '2025-11-26 11:20:08', NULL, '0', NULL, NULL, NULL, NULL, 'admin', '2025-11-26 11:20:04', 'admin', '2025-11-26 11:20:08', '', '还有两个月就过年了', NULL, 0, NULL, NULL, 0, '0', '1', NULL, 'system');\nINSERT INTO `sys_announcement` VALUES ('1993520281771126785', '111', '<p>1111</p>', NULL, NULL, 'admin', 'H', '1', 'ALL', '1', '2025-11-26 11:20:52', NULL, '0', NULL, NULL, NULL, NULL, 'admin', '2025-11-26 11:20:48', 'admin', '2025-11-26 11:20:52', '', '111', NULL, 0, NULL, NULL, 0, '0', '1', NULL, 'system');\n\n-- ----------------------------\n-- Table structure for sys_announcement_send\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_announcement_send`;\nCREATE TABLE `sys_announcement_send`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `annt_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '通告ID',\n  `user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户id',\n  `read_flag` int(10) NULL DEFAULT NULL COMMENT '阅读状态（0未读，1已读）',\n  `read_time` datetime NULL DEFAULT NULL COMMENT '阅读时间',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  `star_flag` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '标星状态( 1为标星 空/0没有标星)',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_sacm_annt_id`(`annt_id`) USING BTREE,\n  INDEX `idx_sacm_user_id`(`user_id`) USING BTREE,\n  INDEX `idx_sacm_read_flag`(`read_flag`) USING BTREE,\n  INDEX `idx_sacm_star_flag`(`star_flag`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户通告阅读标记表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_announcement_send\n-- ----------------------------\nINSERT INTO `sys_announcement_send` VALUES ('1950442039812976642', '1950442031319511042', '1714471285016895490', 0, NULL, 'admin', '2025-07-30 14:23:14', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1950442039812976643', '1950442031319511042', '3d464b4ea0d2491aab8a7bde74c57e95', 0, NULL, 'admin', '2025-07-30 14:23:14', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1950442039812976644', '1950442031319511042', 'a75d45a015c44384a04449ee80dc3503', 0, NULL, 'admin', '2025-07-30 14:23:14', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1950442039812976645', '1950442031319511042', 'e9ca23d68d884d4ebb19d07889727dae', 1, '2025-11-25 17:04:38', 'admin', '2025-07-30 14:23:14', 'admin', '2025-11-25 17:04:38', NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1950447696951799810', '1950447687359426562', '1714471285016895490', 0, NULL, 'admin', '2025-07-30 14:45:43', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1950447696968577026', '1950447687359426562', '3d464b4ea0d2491aab8a7bde74c57e95', 0, NULL, 'admin', '2025-07-30 14:45:43', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1950447696968577027', '1950447687359426562', 'a75d45a015c44384a04449ee80dc3503', 0, NULL, 'admin', '2025-07-30 14:45:43', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1950447696968577028', '1950447687359426562', 'e9ca23d68d884d4ebb19d07889727dae', 1, '2025-09-13 18:42:14', 'admin', '2025-07-30 14:45:43', 'admin', '2025-09-13 18:42:14', NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1957252487350308865', '1957252479913807873', '1714471285016895490', 0, NULL, 'admin', '2025-08-18 09:25:32', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1957252487358697473', '1957252479913807873', '1955218082645544962', 0, NULL, 'admin', '2025-08-18 09:25:32', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1957252487358697474', '1957252479913807873', '1955218454478983170', 0, NULL, 'admin', '2025-08-18 09:25:32', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1957252487358697475', '1957252479913807873', '3d464b4ea0d2491aab8a7bde74c57e95', 0, NULL, 'admin', '2025-08-18 09:25:32', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1957252487358697476', '1957252479913807873', 'a75d45a015c44384a04449ee80dc3503', 0, NULL, 'admin', '2025-08-18 09:25:32', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1957252487367086081', '1957252479913807873', 'e9ca23d68d884d4ebb19d07889727dae', 1, '2025-09-13 18:42:14', 'admin', '2025-08-18 09:25:32', 'admin', '2025-09-13 18:42:14', NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1957253194027618305', '1957253130366472194', '1714471285016895490', 0, NULL, 'admin', '2025-08-18 09:28:20', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1957253194031812610', '1957253130366472194', '1955218082645544962', 0, NULL, 'admin', '2025-08-18 09:28:20', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1957253194031812611', '1957253130366472194', '1955218454478983170', 0, NULL, 'admin', '2025-08-18 09:28:20', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1957253194031812612', '1957253130366472194', '3d464b4ea0d2491aab8a7bde74c57e95', 0, NULL, 'admin', '2025-08-18 09:28:20', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1957253194031812613', '1957253130366472194', 'a75d45a015c44384a04449ee80dc3503', 0, NULL, 'admin', '2025-08-18 09:28:20', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1957253194036006913', '1957253130366472194', 'e9ca23d68d884d4ebb19d07889727dae', 1, '2026-01-21 17:53:10', 'admin', '2025-08-18 09:28:20', 'admin', '2026-01-21 17:53:10', NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1966817120570503170', '1966817120570503169', '1714471285016895490', 0, NULL, 'admin', '2025-09-13 18:51:58', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1993520115190149121', '1993520100581388289', '1714471285016895490', 0, NULL, 'admin', '2025-11-26 11:20:08', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1993520115198537729', '1993520100581388289', '3d464b4ea0d2491aab8a7bde74c57e95', 0, NULL, 'admin', '2025-11-26 11:20:08', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1993520115198537730', '1993520100581388289', 'a75d45a015c44384a04449ee80dc3503', 0, NULL, 'admin', '2025-11-26 11:20:08', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1993520115198537731', '1993520100581388289', 'e9ca23d68d884d4ebb19d07889727dae', 1, '2026-01-21 17:53:01', 'admin', '2025-11-26 11:20:08', 'admin', '2026-01-21 17:53:01', NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1993520300238647297', '1993520281771126785', '1714471285016895490', 0, NULL, 'admin', '2025-11-26 11:20:52', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1993520300247035906', '1993520281771126785', '3d464b4ea0d2491aab8a7bde74c57e95', 0, NULL, 'admin', '2025-11-26 11:20:52', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1993520300247035907', '1993520281771126785', 'a75d45a015c44384a04449ee80dc3503', 0, NULL, 'admin', '2025-11-26 11:20:52', NULL, NULL, NULL);\nINSERT INTO `sys_announcement_send` VALUES ('1993520300255424513', '1993520281771126785', 'e9ca23d68d884d4ebb19d07889727dae', 1, '2025-11-26 11:24:42', 'admin', '2025-11-26 11:20:52', 'admin', '2025-11-26 11:24:42', NULL);\n\n-- ----------------------------\n-- Table structure for sys_category\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_category`;\nCREATE TABLE `sys_category`  (\n  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `pid` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父级节点',\n  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '类型名称',\n  `code` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '类型编码',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `sys_org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属部门',\n  `has_child` varchar(3) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否有子节点',\n  `tenant_id` int(10) NULL DEFAULT 0 COMMENT '租户ID',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `index_scg_code`(`code`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_category\n-- ----------------------------\nINSERT INTO `sys_category` VALUES ('1183693424827564034', '0', '物料树', 'B02', 'admin', '2019-10-14 18:37:59', 'admin', '2019-10-14 18:38:15', 'A01', '1', 0);\nINSERT INTO `sys_category` VALUES ('1183693491043041282', '1183693424827564034', '上衣', 'B02A01', 'admin', '2019-10-14 18:38:15', 'admin', '2019-10-14 18:38:43', 'A01', '1', 0);\nINSERT INTO `sys_category` VALUES ('1183693534173069314', '1183693424827564034', '裤子', 'B02A02', 'admin', '2019-10-14 18:38:25', NULL, NULL, 'A01', NULL, 0);\nINSERT INTO `sys_category` VALUES ('1183693610534567937', '1183693491043041282', '秋衣', 'B02A01A01', 'admin', '2019-10-14 18:38:43', NULL, NULL, 'A01', NULL, 0);\nINSERT INTO `sys_category` VALUES ('1183693700254924802', '1183693491043041282', '兵装', 'B02A01A02', 'admin', '2019-10-14 18:39:05', NULL, NULL, 'A01', NULL, 0);\nINSERT INTO `sys_category` VALUES ('1183693773974011906', '1183693491043041282', '女装', 'B02A01A03', 'admin', '2019-10-14 18:39:22', NULL, NULL, 'A01', NULL, 0);\nINSERT INTO `sys_category` VALUES ('1185039122143719425', '0', '电脑产品', 'A01', 'admin', '2019-10-18 11:45:18', 'admin', '2023-10-18 13:54:46', 'A01', '1', 0);\nINSERT INTO `sys_category` VALUES ('1185039176799694850', '1185039122143719425', 'thinkpad', 'A01A01', 'admin', '2019-10-18 11:45:31', NULL, NULL, 'A01', NULL, 0);\nINSERT INTO `sys_category` VALUES ('1185039255115739138', '1185039122143719425', 'mackbook', 'A01A02', 'admin', '2019-10-18 11:45:50', NULL, NULL, 'A01', NULL, 0);\nINSERT INTO `sys_category` VALUES ('1185039299051073537', '1185039122143719425', '华为电脑', 'A01A03', 'admin', '2019-10-18 11:46:01', NULL, NULL, 'A01', NULL, 0);\nINSERT INTO `sys_category` VALUES ('1230769196661510146', '0', '省', NULL, 'admin', '2020-02-21 16:20:16', 'admin', '2020-02-21 16:20:31', 'A01A03', '1', 0);\nINSERT INTO `sys_category` VALUES ('1230769253267836929', '1230769196661510146', '安徽省', NULL, 'admin', '2020-02-21 16:20:31', 'admin', '2020-02-21 16:20:53', 'A01A03', '1', 0);\nINSERT INTO `sys_category` VALUES ('1230769290609725441', '1230769196661510146', '山东省', NULL, 'admin', '2020-02-21 16:20:40', 'admin', '2020-02-21 16:21:23', 'A01A03', '1', 0);\nINSERT INTO `sys_category` VALUES ('1230769347157331969', '1230769253267836929', '合肥市', NULL, 'admin', '2020-02-21 16:20:53', 'admin', '2020-02-21 16:21:08', 'A01A03', '1', 0);\nINSERT INTO `sys_category` VALUES ('1230769407907631106', '1230769347157331969', '包河区', NULL, 'admin', '2020-02-21 16:21:08', NULL, NULL, 'A01A03', NULL, 0);\nINSERT INTO `sys_category` VALUES ('1230769470889299970', '1230769290609725441', '济南市', NULL, 'admin', '2020-02-21 16:21:23', 'admin', '2020-02-21 16:21:41', 'A01A03', '1', 0);\nINSERT INTO `sys_category` VALUES ('1230769547519234050', '1230769470889299970', 'A区', NULL, 'admin', '2020-02-21 16:21:41', NULL, NULL, 'A01A03', NULL, 0);\nINSERT INTO `sys_category` VALUES ('1230769620021972993', '1230769470889299970', 'B区', NULL, 'admin', '2020-02-21 16:21:58', NULL, NULL, 'A01A03', NULL, 0);\nINSERT INTO `sys_category` VALUES ('1230769769930592257', '1230769253267836929', '淮南市', NULL, 'admin', '2020-02-21 16:22:34', 'admin', '2020-02-21 16:22:54', 'A01A03', '1', 0);\nINSERT INTO `sys_category` VALUES ('1230769855347593217', '1230769769930592257', 'C区', NULL, 'admin', '2020-02-21 16:22:54', NULL, NULL, 'A01A03', NULL, 0);\nINSERT INTO `sys_category` VALUES ('1590548229606047745', '0', '物料树C', 'C02', 'admin', '2022-11-10 11:33:44', NULL, NULL, 'A01', '1', 0);\nINSERT INTO `sys_category` VALUES ('1590548229652185090', '1590548229606047745', '上衣C', 'C02A01', 'admin', '2022-11-10 11:33:44', NULL, NULL, 'A01', '1', 0);\nINSERT INTO `sys_category` VALUES ('1590548229668962305', '1590548229606047745', '裤子C', 'C02A02', 'admin', '2022-11-10 11:33:44', NULL, NULL, 'A01', NULL, 0);\nINSERT INTO `sys_category` VALUES ('1590548229685739522', '1590548229652185090', '秋衣C', 'C02A01A01', 'admin', '2022-11-10 11:33:44', NULL, NULL, 'A01', NULL, 0);\nINSERT INTO `sys_category` VALUES ('22a50b413c5e1ef661fb8aea9469cf52', 'e9ded10fd33e5753face506f4f1564b5', 'MacBook', 'B01-2-1', 'admin', '2019-06-10 15:43:13', NULL, NULL, 'A01', NULL, 0);\nINSERT INTO `sys_category` VALUES ('5c8f68845e57f68ab93a2c8d82d26ae1', '0', '笔记本', 'B01', 'admin', '2019-06-10 15:34:11', 'admin', '2019-06-10 15:34:24', 'A01', '1', 0);\nINSERT INTO `sys_category` VALUES ('937fd2e9aa13b8bab1da1ca36d3fd344', 'e9ded10fd33e5753face506f4f1564b5', '台式机', 'B01-2-2', 'admin', '2019-06-10 15:43:32', 'admin', '2019-08-21 12:01:59', 'A01', NULL, 0);\nINSERT INTO `sys_category` VALUES ('e9ded10fd33e5753face506f4f1564b5', '5c8f68845e57f68ab93a2c8d82d26ae1', '苹果电脑', 'B01-2', 'admin', '2019-06-10 15:41:14', 'admin', '2019-06-10 15:43:13', 'A01', '1', 0);\nINSERT INTO `sys_category` VALUES ('f39a06bf9f390ba4a53d11bc4e0018d7', '5c8f68845e57f68ab93a2c8d82d26ae1', '华为', 'B01-1', 'admin', '2019-06-10 15:34:24', 'admin', '2019-08-21 12:01:56', 'A01', NULL, 0);\n\n-- ----------------------------\n-- Table structure for sys_check_rule\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_check_rule`;\nCREATE TABLE `sys_check_rule`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id',\n  `rule_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则名称',\n  `rule_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则Code',\n  `rule_json` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则JSON',\n  `rule_description` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则描述',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uk_scr_rule_code`(`rule_code`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_check_rule\n-- ----------------------------\nINSERT INTO `sys_check_rule` VALUES ('1224980593992388610', '通用编码规则', 'common', '[{\\\"digits\\\":1,\\\"pattern\\\":\\\"^[a-z|A-Z]$\\\",\\\"message\\\":\\\"第一位只能是字母\\\"},{\\\"digits\\\":\\\"*\\\",\\\"pattern\\\":\\\"^[0-9|a-z|A-Z|_]{0,}$\\\",\\\"message\\\":\\\"只能填写数字、大小写字母、下划线\\\"},{\\\"digits\\\":\\\"*\\\",\\\"pattern\\\":\\\"^.{3,}$\\\",\\\"message\\\":\\\"最少输入3位数\\\"},{\\\"digits\\\":\\\"*\\\",\\\"pattern\\\":\\\"^.{3,12}$\\\",\\\"message\\\":\\\"最多输入12位数\\\"}]', '规则：1、首位只能是字母；2、只能填写数字、大小写字母、下划线；3、最少3位数，最多12位数。', 'admin', '2025-09-13 18:54:19', 'admin', '2020-02-05 16:58:27');\nINSERT INTO `sys_check_rule` VALUES ('1225001845524004866', '负责的功能测试', 'test', '[{\\\"digits\\\":\\\"*\\\",\\\"pattern\\\":\\\"^.{3,12}$\\\",\\\"message\\\":\\\"只能输入3-12位字符\\\"},{\\\"digits\\\":3,\\\"pattern\\\":\\\"^\\\\\\\\d{3}$\\\",\\\"message\\\":\\\"前3位必须是数字\\\"},{\\\"digits\\\":4,\\\"pattern\\\":\\\"^@{4}$\\\",\\\"message\\\":\\\"第4-7位必须都为 @\\\"},{\\\"digits\\\":2,\\\"pattern\\\":\\\"^#=$\\\",\\\"message\\\":\\\"第8-9位必须是 #=\\\"},{\\\"digits\\\":1,\\\"pattern\\\":\\\"^O$\\\",\\\"message\\\":\\\"第10位必须为大写的O\\\"},{\\\"digits\\\":\\\"*\\\",\\\"pattern\\\":\\\"^[^pP]*$\\\",\\\"message\\\":\\\"不能输入P\\\"},{\\\"digits\\\":\\\"*\\\",\\\"pattern\\\":\\\"^.*。$\\\",\\\"message\\\":\\\"必须以。结尾\\\"}]', '包含长度校验、特殊字符校验等', 'admin', '2026-01-21 09:55:31', 'admin', '2020-02-05 18:22:54');\n\n-- ----------------------------\n-- Table structure for sys_comment\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_comment`;\nCREATE TABLE `sys_comment`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `table_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '表名',\n  `table_data_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '数据id',\n  `from_user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '来源用户id',\n  `to_user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '发送给用户id(允许为空)',\n  `comment_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '评论id(允许为空，不为空时，则为回复)',\n  `comment_content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '回复内容',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_table_data_id`(`table_name`, `table_data_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统评论回复表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_comment\n-- ----------------------------\nINSERT INTO `sys_comment` VALUES ('1580814554312093698', 'v3_hello', '1580529718871674882', 'e9ca23d68d884d4ebb19d07889727dae', '', '', '1212\\n:open_mouth:', 'admin', '2022-10-14 14:55:35', NULL, NULL);\nINSERT INTO `sys_comment` VALUES ('1580814573433925634', 'v3_hello', '1580529718871674882', 'e9ca23d68d884d4ebb19d07889727dae', '', '', '上传了附件', 'admin', '2022-10-14 14:55:39', NULL, NULL);\nINSERT INTO `sys_comment` VALUES ('1580814621358043137', 'v3_hello', '1580529718871674882', 'e9ca23d68d884d4ebb19d07889727dae', '', '', '干啥啊', 'admin', '2022-10-14 14:55:51', NULL, NULL);\nINSERT INTO `sys_comment` VALUES ('1584490724803174402', 'v3_hello', '1580529718871674882', 'e9ca23d68d884d4ebb19d07889727dae', '', '', '1212:nerd_face:', 'admin', '2022-10-24 18:23:22', NULL, NULL);\nINSERT INTO `sys_comment` VALUES ('1584490998162743298', 'v3_hello', '1580510370266238978', 'e9ca23d68d884d4ebb19d07889727dae', '', '', '123123', 'admin', '2022-10-24 18:24:27', NULL, NULL);\nINSERT INTO `sys_comment` VALUES ('1584491122888761345', 'v3_hello', '1580510370266238978', 'e9ca23d68d884d4ebb19d07889727dae', '', '', '333', 'admin', '2022-10-24 18:24:57', NULL, NULL);\nINSERT INTO `sys_comment` VALUES ('1584493914588143617', 'v3_hello', '1580529718871674882', 'e9ca23d68d884d4ebb19d07889727dae', '', '', '2222', 'admin', '2022-10-24 18:36:02', NULL, NULL);\nINSERT INTO `sys_comment` VALUES ('1584493923496845313', 'v3_hello', '1580529718871674882', 'e9ca23d68d884d4ebb19d07889727dae', '', '', '333', 'admin', '2022-10-24 18:36:04', NULL, NULL);\nINSERT INTO `sys_comment` VALUES ('1584493984364584961', 'v3_hello', '1580510370266238978', 'e9ca23d68d884d4ebb19d07889727dae', '', '', '上传了附件', 'admin', '2022-10-24 18:36:19', NULL, NULL);\nINSERT INTO `sys_comment` VALUES ('1714455459606024193', 'ceshi_note', '1586278360710615042', 'e9ca23d68d884d4ebb19d07889727dae', '', '', '上传了附件', 'admin', '2023-10-18 09:36:49', NULL, NULL);\nINSERT INTO `sys_comment` VALUES ('1714455471815643138', 'ceshi_note', '1586278360710615042', 'e9ca23d68d884d4ebb19d07889727dae', '', '', '121', 'admin', '2023-10-18 09:36:52', NULL, NULL);\nINSERT INTO `sys_comment` VALUES ('1765261100976934914', 'ceshi_note', '1737728721647525890', 'e9ca23d68d884d4ebb19d07889727dae', '', '', '挺好的', 'admin', '2024-03-06 14:20:18', NULL, NULL);\nINSERT INTO `sys_comment` VALUES ('1765261127610765313', 'ceshi_note', '1737728721647525890', 'e9ca23d68d884d4ebb19d07889727dae', '', '', ':woozy_face:', 'admin', '2024-03-06 14:20:24', NULL, NULL);\nINSERT INTO `sys_comment` VALUES ('1800557341876895745', 'ceshi_aaa', '1782647168684478466', 'e9ca23d68d884d4ebb19d07889727dae', '', '', ':face_with_head_bandage::nauseated_face:', 'admin', '2024-06-11 23:54:58', NULL, NULL);\nINSERT INTO `sys_comment` VALUES ('1800557929826041858', 'ceshi_aaa', '1782647168684478466', 'e9ca23d68d884d4ebb19d07889727dae', '', '', ':cold_face:', 'admin', '2024-06-11 23:57:18', NULL, NULL);\nINSERT INTO `sys_comment` VALUES ('1800557935693873154', 'ceshi_aaa', '1782647168684478466', 'e9ca23d68d884d4ebb19d07889727dae', '', '', '1212', 'admin', '2024-06-11 23:57:19', NULL, NULL);\nINSERT INTO `sys_comment` VALUES ('1800557955415490562', 'ceshi_aaa', '1782647168684478466', 'e9ca23d68d884d4ebb19d07889727dae', '', '', '上传了附件', 'admin', '2024-06-11 23:57:24', NULL, NULL);\nINSERT INTO `sys_comment` VALUES ('1800558013942808578', 'ceshi_aaa', '1782647168684478466', 'e9ca23d68d884d4ebb19d07889727dae', '', '', '上传了附件', 'admin', '2024-06-11 23:57:38', NULL, NULL);\nINSERT INTO `sys_comment` VALUES ('1805421586141544450', 'aa_order', '1805421421888405506', 'e9ca23d68d884d4ebb19d07889727dae', '', '', '写的不错', 'admin', '2024-06-25 10:03:44', NULL, NULL);\nINSERT INTO `sys_comment` VALUES ('1805421721126830082', 'aa_order', '1805421421888405506', 'e9ca23d68d884d4ebb19d07889727dae', '', '', '上传了附件', 'admin', '2024-06-25 10:04:16', NULL, NULL);\n\n-- ----------------------------\n-- Table structure for sys_data_log\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_data_log`;\nCREATE TABLE `sys_data_log`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'id',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `create_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人真实名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `data_table` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '表名',\n  `data_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据ID',\n  `data_content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '数据内容',\n  `data_version` int(11) NULL DEFAULT NULL COMMENT '版本号',\n  `type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'json' COMMENT '类型',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_sdl_data_table_id`(`data_table`, `data_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_data_log\n-- ----------------------------\nINSERT INTO `sys_data_log` VALUES ('1942113821121011714', 'admin', '管理员', '2025-07-07 14:49:52', NULL, NULL, 'test_order_main', '1833472350097121281', '子表[订单产品明细]：修改了1条数据', 1, 'comment');\nINSERT INTO `sys_data_log` VALUES ('1943500714282205185', NULL, NULL, '2025-07-11 10:40:53', NULL, NULL, 'test_note', '1943500714139598850', ' 创建了记录', 1, 'comment');\nINSERT INTO `sys_data_log` VALUES ('1950132464605356035', 'admin', '管理员', '2025-07-29 17:53:06', NULL, NULL, 'test_note', '1943500714139598850', '  将名称为【地区】的字段内容 空 修改为 140311；    将名称为【用户名】的字段内容 ceshi 修改为 zhangsan；    将名称为【请假原因】的字段内容 空 修改为 <p>经过上述讨论, 我们不得不面对一个非常尴尬的事实, 那就是, 这样看来, 一般来讲, 我们都必须务必慎重的考虑考虑. 就我个人来说, 随机一段废话对我的意义, 不能不说非常重大.&nbsp;<br>每个人都不得不面对这些问题. 在面对这种问题时, 随机一段废话, 发生了会如何, 不发生又会如何. 总结的来说,&nbsp;<br>这种事实对本人来说意义重大, 相信对这个世界也是有一定意义的.所谓随机一段废话, 关键是x需要</p>；    将名称为【生日】的字段内容 空 修改为 2025-07-29；    将名称为【性别】的字段内容 空 修改为 空；    将名称为【年龄】的字段内容 11 修改为 0', 1, 'comment');\nINSERT INTO `sys_data_log` VALUES ('1950132495949389825', 'admin', '管理员', '2025-07-29 17:53:13', NULL, NULL, 'test_note', '1943500714139598850', '  将名称为【用户名】的字段内容 zhangsan 修改为 admin', 1, 'comment');\nINSERT INTO `sys_data_log` VALUES ('1950375804898873345', 'admin', '管理员', '2025-07-30 10:00:03', NULL, NULL, 'test_order_product', '1732300515406647298', '  将名称为【价格】的字段内容 3.0 修改为 3000.；    将名称为【产品类型】的字段内容 空 修改为 空；    将名称为【数量】的字段内容 3 修改为 10；    将名称为【产品名字】的字段内容 3 修改为 苹果手机', 1, 'comment');\nINSERT INTO `sys_data_log` VALUES ('1950801683948924929', NULL, NULL, '2025-07-31 14:12:20', NULL, NULL, 'test_note', '1943500714139598850', '  将名称为【年龄】的字段内容 0 修改为 1212', 1, 'comment');\nINSERT INTO `sys_data_log` VALUES ('1950801716647718913', NULL, NULL, '2025-07-31 14:12:28', NULL, NULL, 'test_note', '1923203898831777793', '  将名称为【用户名】的字段内容 admin 修改为 jeecg', 1, 'comment');\nINSERT INTO `sys_data_log` VALUES ('1966815580124278785', 'admin', '管理员', '2025-09-13 18:45:51', NULL, NULL, 'test_note', '1966815579977478145', ' 创建了记录', 1, 'comment');\nINSERT INTO `sys_data_log` VALUES ('1966815600902860801', 'admin', '管理员', '2025-09-13 18:45:56', NULL, NULL, 'test_note', '1966815579977478145', '  将名称为【年龄】的字段内容 0 修改为 11', 1, 'comment');\nINSERT INTO `sys_data_log` VALUES ('1993341836390940673', NULL, 'admin', '2025-11-25 23:31:43', NULL, NULL, 'aaa_01', '1993341836277694465', ' 创建了记录', 1, 'comment');\nINSERT INTO `sys_data_log` VALUES ('1993886566388453377', NULL, 'admin', '2025-11-27 11:36:17', NULL, NULL, 'test_note', '1993886566258429953', ' 创建了记录', 1, 'comment');\nINSERT INTO `sys_data_log` VALUES ('1993988133426835457', NULL, 'admin', '2025-11-27 18:19:52', NULL, NULL, 'test_order_main', '1833472350097121281', '子表[订单产品明细]：修改了1条数据', 1, 'comment');\nINSERT INTO `sys_data_log` VALUES ('2010992400041795585', NULL, 'admin', '2026-01-13 16:28:45', NULL, NULL, 'test_note', '2010992399911772161', ' 创建了记录', 1, 'comment');\nINSERT INTO `sys_data_log` VALUES ('2010992549400961026', NULL, 'admin', '2026-01-13 16:29:21', NULL, NULL, 'test_note', '2010992399911772161', '  将名称为【长类型】的字段内容 空 修改为 1', 1, 'comment');\nINSERT INTO `sys_data_log` VALUES ('2010992564651450369', NULL, 'admin', '2026-01-13 16:29:25', NULL, NULL, 'test_note', '2010992399911772161', '  将名称为【长类型】的字段内容 1 修改为 12', 1, 'comment');\nINSERT INTO `sys_data_log` VALUES ('2013993932534431746', NULL, 'admin', '2026-01-21 23:15:46', NULL, NULL, 'test_note', '1966815579977478145', '  将名称为【性别】的字段内容 男 修改为 男；    将名称为【年龄】的字段内容 11 修改为 0', 1, 'comment');\nINSERT INTO `sys_data_log` VALUES ('2013994123417206786', NULL, 'admin', '2026-01-21 23:16:32', NULL, NULL, 'test_note', '2010992399911772161', '  将名称为【长类型】的字段内容 12 修改为 空', 1, 'comment');\n\n-- ----------------------------\n-- Table structure for sys_data_source\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_data_source`;\nCREATE TABLE `sys_data_source`  (\n  `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据源编码',\n  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据源名称',\n  `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',\n  `db_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据库类型',\n  `db_driver` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '驱动类',\n  `db_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据源地址',\n  `db_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据库名称',\n  `db_username` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名',\n  `db_password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码',\n  `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属部门',\n  `tenant_id` int(10) NULL DEFAULT 0 COMMENT '租户ID',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uk_sdc_rule_code`(`code`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_data_source\n-- ----------------------------\nINSERT INTO `sys_data_source` VALUES ('1209779538310004737', 'local_mysql', '本地测试库', '本地数据库MySQL5.7', '4', 'com.mysql.cj.jdbc.Driver', 'jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai', 'jeecg-boot', 'root', 'f5b6775e8d1749483f2320627de0e706', 'admin', '2019-12-25 18:14:53', 'admin', '2025-09-13 18:46:43', 'A01', 0);\n\n-- ----------------------------\n-- Table structure for sys_depart\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_depart`;\nCREATE TABLE `sys_depart`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'ID',\n  `parent_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父机构ID',\n  `depart_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '机构/部门名称',\n  `depart_name_en` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '英文名',\n  `depart_name_abbr` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '缩写',\n  `depart_order` int(11) NULL DEFAULT 0 COMMENT '排序',\n  `description` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',\n  `org_category` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1' COMMENT '机构类别 1公司，2部门，3岗位，4子公司',\n  `org_type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '树深度层级level',\n  `org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '机构编码',\n  `mobile` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号',\n  `fax` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '传真',\n  `address` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址',\n  `memo` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',\n  `status` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '状态（1启用，0不启用）',\n  `del_flag` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '删除状态（0，正常，1已删除）',\n  `qywx_identifier` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '对接企业微信的ID',\n  `ding_identifier` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '对接钉钉部门的ID',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `tenant_id` int(10) NULL DEFAULT 0 COMMENT '租户ID',\n  `iz_leaf` tinyint(1) NULL DEFAULT 0 COMMENT '是否有叶子节点: 1是0否',\n  `position_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '职级id',\n  `dep_post_parent_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上级岗位id',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uniq_depart_org_code`(`org_code`) USING BTREE,\n  INDEX `idx_sd_parent_id`(`parent_id`) USING BTREE,\n  INDEX `idx_sd_depart_order`(`depart_order`) USING BTREE,\n  INDEX `idx_sd_position_id`(`position_id`) USING BTREE,\n  INDEX `idx_sd_dep_post_parent_id`(`dep_post_parent_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '组织机构表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_depart\n-- ----------------------------\nINSERT INTO `sys_depart` VALUES ('1582683631414632450', 'c6d7cb4deeac411cb3384b1b31278596', '销售公关岗位', NULL, NULL, 0, NULL, '3', '2', 'A01A06', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2022-10-19 18:42:37', NULL, NULL, 0, 1, NULL, NULL);\nINSERT INTO `sys_depart` VALUES ('1958496243038556161', '', '控股集团', NULL, NULL, 0, NULL, '2', '1', 'A05', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:47:48', NULL, NULL, 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` VALUES ('1958496444470005762', '1958496243038556161', '投资控股集团有限公司', NULL, NULL, 0, NULL, '4', '2', 'A05A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:48:34', 'admin', '2025-08-21 19:49:57', 0, 0, NULL, '');\nINSERT INTO `sys_depart` VALUES ('1958496759810363394', '1958496243038556161', '城市运营管理集团有限公司', NULL, NULL, 1, NULL, '4', '2', 'A05A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:49:49', 'admin', '2025-08-21 20:30:23', 0, 0, NULL, '');\nINSERT INTO `sys_depart` VALUES ('1958496836318662658', '1958496444470005762', '领导班子', NULL, NULL, 0, NULL, '2', '3', 'A05A01A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:50:08', NULL, NULL, 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` VALUES ('1958496891561840641', '1958496444470005762', '办公室', NULL, NULL, 2, NULL, '2', '3', 'A05A01A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:50:21', 'admin', '2025-08-21 19:50:36', 0, 0, NULL, '');\nINSERT INTO `sys_depart` VALUES ('1958496943017562114', '1958496444470005762', '财务管理中心', NULL, NULL, 3, NULL, '2', '3', 'A05A01A03', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:50:33', NULL, NULL, 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` VALUES ('1958497020528300033', '1958496444470005762', '投资发展部', NULL, NULL, 4, NULL, '2', '3', 'A05A01A04', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:50:51', NULL, NULL, 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` VALUES ('1958497164103520258', '1958496836318662658', '董事长', NULL, NULL, 0, NULL, '3', '4', 'A05A01A01A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:51:26', NULL, NULL, 0, 1, '1958471111989067778', '');\nINSERT INTO `sys_depart` VALUES ('1958497256772472834', '1958496836318662658', '党委书记', NULL, NULL, 1, NULL, '3', '4', 'A05A01A01A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:51:48', 'admin', '2025-08-21 19:54:53', 0, 1, '1958471030867034113', '1958497164103520258');\nINSERT INTO `sys_depart` VALUES ('1958497591230468098', '1958496836318662658', '控股总经理', NULL, NULL, 3, NULL, '3', '4', 'A05A01A01A03', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:53:08', 'admin', '2025-08-21 19:54:42', 0, 1, '1958471074953363458', '1958497164103520258');\nINSERT INTO `sys_depart` VALUES ('1958497769387724802', '1958496836318662658', '纪委书记', NULL, NULL, 4, NULL, '3', '4', 'A05A01A01A04', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:53:50', 'admin', '2025-08-21 19:54:06', 0, 1, '1958471030867034113', '1958497591230468098');\nINSERT INTO `sys_depart` VALUES ('1958498187287203841', '1958496891561840641', '控股办公室主任', NULL, NULL, 1, NULL, '3', '4', 'A05A01A02A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:55:30', 'admin', '2025-08-21 19:55:50', 0, 1, '1958470912214368258', '1958497164103520258');\nINSERT INTO `sys_depart` VALUES ('1958498716927135745', '1958496891561840641', '副主任', NULL, NULL, 2, NULL, '3', '4', 'A05A01A02A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:57:36', 'admin', '2025-08-21 19:57:50', 0, 1, '1958470865577902082', '1958498187287203841');\nINSERT INTO `sys_depart` VALUES ('1958502219078733826', '1958496891561840641', '职员', NULL, NULL, 3, NULL, '3', '4', 'A05A01A02A03', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:11:31', NULL, NULL, 0, 1, '1958470823064436737', '1958498187287203841');\nINSERT INTO `sys_depart` VALUES ('1958502381062754305', '1958496943017562114', '主任', NULL, NULL, 1, NULL, '3', '4', 'A05A01A03A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:12:10', 'admin', '2025-08-21 20:13:13', 0, 1, '1958470912214368258', '1958502611426512898');\nINSERT INTO `sys_depart` VALUES ('1958502611426512898', '1958496836318662658', '控股副总经理', NULL, NULL, 5, NULL, '3', '4', 'A05A01A01A05', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:13:04', 'admin', '2025-08-21 20:27:14', 0, 1, '1958471030867034113', '1958497591230468098');\nINSERT INTO `sys_depart` VALUES ('1958502810966331393', '1958496943017562114', '副主任', NULL, NULL, 2, NULL, '3', '4', 'A05A01A03A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:13:52', 'admin', '2025-08-21 20:14:40', 0, 1, '1958470865577902082', '1958502381062754305');\nINSERT INTO `sys_depart` VALUES ('1958502942289989634', '1958496943017562114', '职员', NULL, NULL, 2, NULL, '3', '4', 'A05A01A03A03', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:14:23', 'admin', '2025-08-21 20:14:28', 0, 1, '1958470823064436737', '1958502810966331393');\nINSERT INTO `sys_depart` VALUES ('1958503159999533057', '1958497020528300033', '部长', NULL, NULL, 1, NULL, '3', '4', 'A05A01A04A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:15:15', NULL, NULL, 0, 1, '1958470912214368258', '1958502611426512898');\nINSERT INTO `sys_depart` VALUES ('1958503409933914114', '1958497020528300033', '副部长', NULL, NULL, 2, NULL, '3', '4', 'A05A01A04A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:16:15', NULL, NULL, 0, 1, '1958470865577902082', '1958503159999533057');\nINSERT INTO `sys_depart` VALUES ('1958503468805165058', '1958497020528300033', '员工', NULL, NULL, 3, NULL, '3', '4', 'A05A01A04A03', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:16:29', NULL, NULL, 0, 1, '1958470823064436737', '1958503409933914114');\nINSERT INTO `sys_depart` VALUES ('1958507136782733313', '1958496759810363394', '领导班子', NULL, NULL, 1, NULL, '2', '3', 'A05A02A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:31:03', NULL, NULL, 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` VALUES ('1958507356253884418', '1958496759810363394', '信息技术发展有限公司', NULL, NULL, 4, NULL, '4', '3', 'A05A02A03', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:31:56', 'admin', '2025-08-21 21:12:57', 0, 0, NULL, '');\nINSERT INTO `sys_depart` VALUES ('1958507448138502146', '1958507136782733313', '董事长', NULL, NULL, 1, NULL, '3', '4', 'A05A02A01A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:32:18', 'admin', '2025-08-21 20:33:24', 0, 1, '1958471111989067778', '');\nINSERT INTO `sys_depart` VALUES ('1958507542866857985', '1958507136782733313', '副总经理', NULL, NULL, 3, NULL, '3', '4', 'A05A02A01A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:32:40', 'admin', '2025-08-21 20:33:26', 0, 1, '1958471030867034113', '');\nINSERT INTO `sys_depart` VALUES ('1958507650828242946', '1958507136782733313', '总经理', NULL, NULL, 2, NULL, '3', '4', 'A05A02A01A03', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:33:06', 'admin', '2025-08-21 20:33:20', 0, 1, '1958471074953363458', '');\nINSERT INTO `sys_depart` VALUES ('1958518943542972418', '1958507356253884418', '领导班子', NULL, NULL, 1, NULL, '2', '4', 'A05A02A03A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:17:58', NULL, NULL, 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` VALUES ('1958519010207240193', '1958507356253884418', '综合管理部', NULL, NULL, 2, NULL, '2', '4', 'A05A02A03A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:18:14', NULL, NULL, 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` VALUES ('1958519045623943169', '1958507356253884418', '财务部', NULL, NULL, 3, NULL, '2', '4', 'A05A02A03A03', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:18:23', NULL, NULL, 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` VALUES ('1958519097058693121', '1958507356253884418', '软件研发部', NULL, NULL, 4, NULL, '2', '4', 'A05A02A03A04', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:18:35', NULL, NULL, 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` VALUES ('1958520331257810945', '1958496891561840641', '总工程师', NULL, NULL, 2, NULL, '3', '4', 'A05A01A02A04', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:23:29', 'admin', '2025-08-21 21:23:52', 0, 1, '1958471030867034113', '1958497164103520258');\nINSERT INTO `sys_depart` VALUES ('1958520788395003906', '1958496759810363394', '办公室', NULL, NULL, 2, NULL, '2', '3', 'A05A02A04', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:25:18', 'admin', '2025-08-21 21:26:51', 0, 0, NULL, '');\nINSERT INTO `sys_depart` VALUES ('1958520876810932225', '1958520788395003906', '总工程师', NULL, NULL, 1, NULL, '3', '4', 'A05A02A04A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:25:39', 'admin', '2025-08-21 21:26:25', 0, 1, '1958471030867034113', '1958507650828242946');\nINSERT INTO `sys_depart` VALUES ('1958521034948775937', '1958518943542972418', '执行董事兼总经理', NULL, NULL, 1, NULL, '3', '5', 'A05A02A03A01A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:26:17', NULL, NULL, 0, 1, '1958471111989067778', '1958520876810932225');\nINSERT INTO `sys_depart` VALUES ('1958521513564999681', '1958518943542972418', '副总经理', NULL, NULL, 2, NULL, '3', '5', 'A05A02A03A01A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:28:11', NULL, NULL, 0, 1, '1958471030867034113', '1958521034948775937');\nINSERT INTO `sys_depart` VALUES ('1958521634549698561', '1958519010207240193', '副部长', NULL, NULL, 1, NULL, '3', '5', 'A05A02A03A02A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:28:40', 'admin', '2025-08-21 21:30:15', 0, 1, '1958470865577902082', '1958521034948775937');\nINSERT INTO `sys_depart` VALUES ('1958523766002716674', '1958519010207240193', '信息归档员', NULL, NULL, 2, NULL, '3', '5', 'A05A02A03A02A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:37:08', NULL, NULL, 0, 1, '1958470823064436737', '1958521634549698561');\nINSERT INTO `sys_depart` VALUES ('1958524282631917570', '1958519045623943169', '部长', NULL, NULL, 1, NULL, '3', '5', 'A05A02A03A03A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:39:11', NULL, NULL, 0, 1, '1958470912214368258', '1958521034948775937');\nINSERT INTO `sys_depart` VALUES ('1958524369311404033', '1958519045623943169', '出纳', NULL, NULL, 2, NULL, '3', '5', 'A05A02A03A03A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:39:32', NULL, NULL, 0, 1, '1958470823064436737', '1958524282631917570');\nINSERT INTO `sys_depart` VALUES ('1958524471841165313', '1958519097058693121', '项目经理', NULL, NULL, 1, NULL, '3', '5', 'A05A02A03A04A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:39:56', NULL, NULL, 0, 1, '1958470912214368258', '1958521513564999681');\nINSERT INTO `sys_depart` VALUES ('1958524565596442626', '1958519097058693121', '软件工程师', NULL, NULL, 2, NULL, '3', '5', 'A05A02A03A04A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:40:19', NULL, NULL, 0, 1, '1958470823064436737', '1958524471841165313');\nINSERT INTO `sys_depart` VALUES ('4f1765520d6346f9bd9c79e2479e5b12', 'c6d7cb4deeac411cb3384b1b31278596', '市场部', NULL, NULL, 0, NULL, '2', '2', 'A01A03', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2019-02-20 17:15:34', 'admin', '2019-02-26 16:36:18', 0, 1, NULL, NULL);\nINSERT INTO `sys_depart` VALUES ('5159cde220114246b045e574adceafe9', '6d35e179cd814e3299bd588ea7daed3f', '研发部', NULL, NULL, 0, NULL, '2', '2', 'A02A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2019-02-26 16:44:38', 'admin', '2019-03-07 09:36:53', 0, 1, NULL, NULL);\nINSERT INTO `sys_depart` VALUES ('57197590443c44f083d42ae24ef26a2c', 'c6d7cb4deeac411cb3384b1b31278596', '研发部', NULL, NULL, 0, NULL, '2', '2', 'A01A05', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2019-02-21 16:14:41', 'admin', '2019-03-27 19:05:49', 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` VALUES ('63775228b7b041a99825f79760590b7d', '57197590443c44f083d42ae24ef26a2c', '研发经理', NULL, NULL, 0, NULL, '3', '3', 'A01A05A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2020-05-02 15:29:09', NULL, NULL, 0, 1, NULL, NULL);\nINSERT INTO `sys_depart` VALUES ('67fc001af12a4f9b8458005d3f19934a', 'c6d7cb4deeac411cb3384b1b31278596', '财务部', NULL, NULL, 0, NULL, '2', '2', 'A01A04', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2019-02-21 16:14:35', 'admin', '2019-02-25 12:49:41', 0, 1, NULL, NULL);\nINSERT INTO `sys_depart` VALUES ('6d35e179cd814e3299bd588ea7daed3f', '', '北京卓尔互动', NULL, NULL, 0, NULL, '2', '1', 'A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2019-02-26 16:36:39', 'admin', '2020-05-02 18:21:22', 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` VALUES ('a7d7e77e06c84325a40932163adcdaa6', '6d35e179cd814e3299bd588ea7daed3f', '财务部', NULL, NULL, 0, NULL, '2', '2', 'A02A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2019-02-26 16:36:47', 'admin', '2022-10-14 18:57:56', 0, 1, NULL, NULL);\nINSERT INTO `sys_depart` VALUES ('c6d7cb4deeac411cb3384b1b31278596', '', '北京国炬软件', NULL, NULL, 0, NULL, '2', '1', 'A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2019-02-11 14:21:51', 'admin', '2020-05-02 18:21:27', 0, 0, NULL, NULL);\n\n-- ----------------------------\n-- Table structure for sys_depart_permission\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_depart_permission`;\nCREATE TABLE `sys_depart_permission`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `depart_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门id',\n  `permission_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '权限id',\n  `data_rule_ids` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据规则id',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '部门权限表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_depart_permission\n-- ----------------------------\nINSERT INTO `sys_depart_permission` VALUES ('1260925131934519297', '6d35e179cd814e3299bd588ea7daed3f', 'f0675b52d89100ee88472b6800754a08', NULL);\nINSERT INTO `sys_depart_permission` VALUES ('1260925131947102209', '6d35e179cd814e3299bd588ea7daed3f', '2aeddae571695cd6380f6d6d334d6e7d', NULL);\nINSERT INTO `sys_depart_permission` VALUES ('1260925131955490818', '6d35e179cd814e3299bd588ea7daed3f', '020b06793e4de2eee0007f603000c769', NULL);\nINSERT INTO `sys_depart_permission` VALUES ('1260925131959685121', '6d35e179cd814e3299bd588ea7daed3f', '1232123780958064642', NULL);\nINSERT INTO `sys_depart_permission` VALUES ('1694946354772217858', '1582683631414632450', '1588513553652436993', NULL);\nINSERT INTO `sys_depart_permission` VALUES ('1694946354784800769', '1582683631414632450', '1592114574275211265', NULL);\n\n-- ----------------------------\n-- Table structure for sys_depart_role\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_depart_role`;\nCREATE TABLE `sys_depart_role`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `depart_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门id',\n  `role_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门角色名称',\n  `role_code` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门角色编码',\n  `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '部门角色表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_depart_role\n-- ----------------------------\nINSERT INTO `sys_depart_role` VALUES ('1260925293226479618', '6d35e179cd814e3299bd588ea7daed3f', 'roless', 'ssss', NULL, 'admin', '2020-05-14 21:29:51', NULL, NULL);\n\n-- ----------------------------\n-- Table structure for sys_depart_role_permission\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_depart_role_permission`;\nCREATE TABLE `sys_depart_role_permission`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `depart_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门id',\n  `role_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色id',\n  `permission_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '权限id',\n  `data_rule_ids` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据权限ids',\n  `operate_date` datetime NULL DEFAULT NULL COMMENT '操作时间',\n  `operate_ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作ip',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_sdrp_role_per_id`(`role_id`, `permission_id`) USING BTREE,\n  INDEX `idx_sdrp_role_id`(`role_id`) USING BTREE,\n  INDEX `idx_sdrp_per_id`(`permission_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '部门角色权限表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_depart_role_permission\n-- ----------------------------\nINSERT INTO `sys_depart_role_permission` VALUES ('1260925328689319938', NULL, '1260925293226479618', '2aeddae571695cd6380f6d6d334d6e7d', NULL, NULL, NULL);\nINSERT INTO `sys_depart_role_permission` VALUES ('1260925328706097153', NULL, '1260925293226479618', '020b06793e4de2eee0007f603000c769', NULL, NULL, NULL);\n\n-- ----------------------------\n-- Table structure for sys_depart_role_user\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_depart_role_user`;\nCREATE TABLE `sys_depart_role_user`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id',\n  `user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户id',\n  `drole_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色id',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_sdr_user_id`(`user_id`) USING BTREE,\n  INDEX `idx_sdr_role_id`(`drole_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '部门角色用户表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_depart_role_user\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for sys_dict\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_dict`;\nCREATE TABLE `sys_dict`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `dict_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典名称',\n  `dict_code` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典编码',\n  `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',\n  `del_flag` int(1) NULL DEFAULT NULL COMMENT '删除状态',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  `type` int(1) UNSIGNED ZEROFILL NULL DEFAULT 0 COMMENT '字典类型0为string,1为number',\n  `tenant_id` int(10) NULL DEFAULT 0 COMMENT '租户ID',\n  `low_app_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '低代码应用ID',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uk_sd_dict_code`(`dict_code`) USING BTREE,\n  INDEX `uk_sd_tenant_id`(`tenant_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_dict\n-- ----------------------------\nINSERT INTO `sys_dict` VALUES ('0b5d19e1fce4b2e6647e6b4a17760c14', '通告类型', 'msg_category', '消息类型1:通知公告2:系统消息', 0, 'admin', '2019-04-22 18:01:35', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1174509082208395266', '职务职级', 'position_rank', '职务表职级字典', 0, 'admin', '2019-09-19 10:22:41', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1174511106530525185', '机构类型', 'org_category', '机构类型 1公司，2部门，3岗位，4子公司', 0, 'admin', '2019-09-19 10:30:43', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1178295274528845826', '表单权限策略', 'form_perms_type', '', 0, 'admin', '2019-09-29 21:07:39', 'admin', '2019-09-29 21:08:26', NULL, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1199517671259906049', '紧急程度', 'urgent_level', '日程计划紧急程度', 0, 'admin', '2019-11-27 10:37:53', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1199518099888414722', '日程计划类型', 'eoa_plan_type', '', 0, 'admin', '2019-11-27 10:39:36', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1199520177767587841', '分类栏目类型', 'eoa_cms_menu_type', '', 0, 'admin', '2019-11-27 10:47:51', 'admin', '2019-11-27 10:49:35', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1199525215290306561', '日程计划状态', 'eoa_plan_status', '', 0, 'admin', '2019-11-27 11:07:52', 'admin', '2019-11-27 11:10:11', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1209733563293962241', '数据库类型', 'database_type', '', 0, 'admin', '2019-12-25 15:12:12', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1232913193820581889', 'Online表单业务分类', 'ol_form_biz_type', '', 0, 'admin', '2020-02-27 14:19:46', 'admin', '2020-02-27 14:20:23', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1242298510024429569', '提醒方式', 'remindMode', '', 0, 'admin', '2020-03-24 11:53:40', 'admin', '2020-03-24 12:03:22', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1250687930947620866', '定时任务状态', 'quartz_status', '', 0, 'admin', '2020-04-16 15:30:14', '', NULL, NULL, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1280401766745718786', '租户状态', 'tenant_status', '租户状态', 0, 'admin', '2020-07-07 15:22:25', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1356445645198135298', '开关', 'is_open', '', 0, 'admin', '2021-02-02 11:33:38', 'admin', '2021-02-02 15:28:12', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1600042215909134338', '所属行业', 'trade', '行业', 0, 'admin', '2022-12-06 16:19:26', 'admin', '2022-12-06 16:20:50', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1600044537800331266', '公司规模', 'company_size', '公司规模', 0, 'admin', '2022-12-06 16:28:40', 'admin', '2022-12-06 16:30:23', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1606645341269299201', '职级', 'company_rank', '公司职级', 0, 'admin', '2022-12-24 21:37:54', 'admin', '2022-12-24 21:38:25', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1606646440684457986', '公司部门', 'company_department', '公司部门', 0, 'admin', '2022-12-24 21:42:16', 'admin', '2024-03-18 14:21:56', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1693196536609755137', 'ddd', 'ddd', NULL, 1, 'admin', '2023-08-20 17:41:27', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1784843187992084482', '客户终端类型', 'client_type', NULL, 0, 'jeecg', '2024-04-29 15:12:31', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1890229208685322242', '模型提供者', 'model_provider', NULL, 0, 'jeecg', '2025-02-14 10:38:57', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1891456510739890177', '模型类型', 'model_type', NULL, 0, 'jeecg', '2025-02-17 19:55:48', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1891671216561975297', '知识库类型', 'airag_know_type', NULL, 1, 'jeecg', '2025-02-18 10:08:58', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1891672414555860993', '知识库文档类型', 'know_doc_type', NULL, 0, 'jeecg', '2025-02-18 10:13:44', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1894701158027554818', 'AI应用类型', 'ai_app_type', NULL, 0, 'jeecg', '2025-02-26 18:48:53', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1934846825077878786', '公告分类', 'notice_type', NULL, 0, 'admin', '2025-06-17 13:33:25', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1937393911539384322', '模版分类', 'msgCategory', NULL, 0, 'admin', '2025-06-24 14:14:38', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1939572486447292418', '首页关联', 'relation_type', NULL, 0, 'admin', '2025-06-30 14:31:31', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('1964944899916697602', '用户职务', 'user_position', '用户职务', 0, 'admin', '2025-09-08 14:52:26', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('236e8a4baff0db8c62c00dd95632834f', '同步工作流引擎', 'activiti_sync', '同步工作流引擎', 0, 'admin', '2019-05-15 15:27:33', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('2e02df51611a4b9632828ab7e5338f00', '权限策略', 'perms_type', '权限策略', 0, 'admin', '2019-04-26 18:26:55', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('2f0320997ade5dd147c90130f7218c3e', '推送类别', 'msg_type', '', 0, 'admin', '2019-03-17 21:21:32', 'admin', '2019-03-26 19:57:45', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('3486f32803bb953e7155dab3513dc68b', '删除状态', 'del_flag', NULL, 0, 'admin', '2019-01-18 21:46:26', 'admin', '2019-03-30 11:17:11', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('3d9a351be3436fbefb1307d4cfb49bf2', '性别', 'sex', NULL, 0, NULL, '2019-01-04 14:56:32', 'admin', '2019-03-30 11:28:27', 1, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('4274efc2292239b6f000b153f50823ff', '全局权限策略', 'global_perms_type', '全局权限策略', 0, 'admin', '2019-05-10 17:54:05', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('4c03fca6bf1f0299c381213961566349', 'Online图表展示模板', 'online_graph_display_template', 'Online图表展示模板', 0, 'admin', '2019-04-12 17:28:50', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('4c753b5293304e7a445fd2741b46529d', '字典状态', 'dict_item_status', NULL, 0, 'admin', '2020-06-18 23:18:42', 'admin', '2019-03-30 19:33:52', 1, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('4d7fec1a7799a436d26d02325eff295e', '优先级', 'priority', '优先级', 0, 'admin', '2019-03-16 17:03:34', 'admin', '2019-04-16 17:39:23', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('4e4602b3e3686f0911384e188dc7efb4', '条件规则', 'rule_conditions', '', 0, 'admin', '2019-04-01 10:15:03', 'admin', '2019-04-01 10:30:47', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('4f69be5f507accea8d5df5f11346181a', '发送消息类型', 'msgType', NULL, 0, 'admin', '2019-04-11 14:27:09', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('68168534ff5065a152bfab275c2136f8', '有效无效状态', 'valid_status', '有效无效状态', 0, 'admin', '2020-09-26 19:21:14', 'admin', '2019-04-26 19:21:23', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('6b78e3f59faec1a4750acff08030a79b', '用户类型', 'user_type', NULL, 0, NULL, '2019-01-04 14:59:01', 'admin', '2019-03-18 23:28:18', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('72cce0989df68887546746d8f09811aa', 'Online表单类型', 'cgform_table_type', '', 0, 'admin', '2019-01-27 10:13:02', 'admin', '2019-03-30 11:37:36', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('78bda155fe380b1b3f175f1e88c284c6', '流程状态', 'bpm_status', '流程状态', 0, 'admin', '2019-05-09 16:31:52', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('83bfb33147013cc81640d5fd9eda030c', '日志类型', 'log_type', NULL, 0, 'admin', '2019-03-18 23:22:19', NULL, NULL, 1, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('845da5006c97754728bf48b6a10f79cc', '状态', 'status', NULL, 0, 'admin', '2019-03-18 21:45:25', 'admin', '2019-03-18 21:58:25', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('880a895c98afeca9d9ac39f29e67c13e', '操作类型', 'operate_type', '操作类型', 0, 'admin', '2019-07-22 10:54:29', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('8dfe32e2d29ea9430a988b3b558bf233', '发布状态', 'send_status', '发布状态', 0, 'admin', '2019-04-16 17:40:42', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('a7adbcd86c37f7dbc9b66945c82ef9e6', '1是0否', 'yn', '', 0, 'admin', '2019-05-22 19:29:29', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('a9d9942bd0eccb6e89de92d130ec4c4a', '消息发送状态', 'msgSendStatus', NULL, 0, 'admin', '2019-04-12 18:18:17', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('ac2f7c0c5c5775fcea7e2387bcb22f01', '菜单类型', 'menu_type', NULL, 0, 'admin', '2020-12-18 23:24:32', 'admin', '2019-04-01 15:27:06', 1, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('ad7c65ba97c20a6805d5dcdf13cdaf36', 'onlineT类型', 'ceshi_online', NULL, 0, 'admin', '2019-03-22 16:31:49', 'admin', '2019-03-22 16:34:16', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('bd1b8bc28e65d6feefefb6f3c79f42fd', 'Online图表数据类型', 'online_graph_data_type', 'Online图表数据类型', 0, 'admin', '2019-04-12 17:24:24', 'admin', '2019-04-12 17:24:57', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('c36169beb12de8a71c8683ee7c28a503', '部门状态', 'depart_status', NULL, 0, 'admin', '2019-03-18 21:59:51', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('c5a14c75172783d72cbee6ee7f5df5d1', 'Online图表类型', 'online_graph_type', 'Online图表类型', 0, 'admin', '2019-04-12 17:04:06', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('d6e1152968b02d69ff358c75b48a6ee1', '流程类型', 'bpm_process_type', NULL, 0, 'admin', '2021-02-22 19:26:54', 'admin', '2019-03-30 18:14:44', 0, 0, NULL);\nINSERT INTO `sys_dict` VALUES ('fc6cd58fde2e8481db10d3a1e68ce70c', '用户状态', 'user_status', NULL, 0, 'admin', '2019-03-18 21:57:25', 'admin', '2019-03-18 23:11:58', 1, 0, NULL);\n\n-- ----------------------------\n-- Table structure for sys_dict_item\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_dict_item`;\nCREATE TABLE `sys_dict_item`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `dict_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典id',\n  `item_text` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典项文本',\n  `item_value` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典项值',\n  `item_color` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典项颜色',\n  `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',\n  `sort_order` int(10) NULL DEFAULT NULL COMMENT '排序',\n  `status` int(11) NULL DEFAULT NULL COMMENT '状态（1启用 0不启用）',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n  `create_time` datetime NULL DEFAULT NULL,\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n  `update_time` datetime NULL DEFAULT NULL,\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_sditem_role_dict_id`(`dict_id`) USING BTREE,\n  INDEX `idx_sditem_role_sort_order`(`sort_order`) USING BTREE,\n  INDEX `idx_sditem_status`(`status`) USING BTREE,\n  INDEX `idx_sditem_dict_val`(`dict_id`, `item_value`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_dict_item\n-- ----------------------------\nINSERT INTO `sys_dict_item` VALUES ('0072d115e07c875d76c9b022e2179128', '4d7fec1a7799a436d26d02325eff295e', '低', 'L', NULL, '低', 3, 1, 'admin', '2019-04-16 17:04:59', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('05a2e732ce7b00aa52141ecc3e330b4e', '3486f32803bb953e7155dab3513dc68b', '已删除', '1', NULL, NULL, NULL, 1, 'admin', '2025-10-18 21:46:56', 'admin', '2019-03-28 22:23:20');\nINSERT INTO `sys_dict_item` VALUES ('096c2e758d823def3855f6376bc736fb', 'bd1b8bc28e65d6feefefb6f3c79f42fd', 'SQL', 'sql', NULL, NULL, 1, 1, 'admin', '2019-04-12 17:26:26', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('0c9532916f5cd722017b46bc4d953e41', '2f0320997ade5dd147c90130f7218c3e', '指定用户', 'USER', NULL, NULL, NULL, 1, 'admin', '2019-03-17 21:22:19', 'admin', '2019-03-17 21:22:28');\nINSERT INTO `sys_dict_item` VALUES ('0ca4beba9efc4f9dd54af0911a946d5c', '72cce0989df68887546746d8f09811aa', '附表', '3', NULL, NULL, 3, 1, 'admin', '2019-03-27 10:13:43', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1030a2652608f5eac3b49d70458b8532', '2e02df51611a4b9632828ab7e5338f00', '禁用', '2', NULL, '禁用', 2, 1, 'admin', '2021-03-26 18:27:28', 'admin', '2019-04-26 18:39:11');\nINSERT INTO `sys_dict_item` VALUES ('1174509082208395266', '1174511106530525185', '岗位', '3', NULL, '岗位', 1, 1, 'admin', '2019-09-19 10:31:16', '', NULL);\nINSERT INTO `sys_dict_item` VALUES ('1174509601047994369', '1174509082208395266', '员级', '1', NULL, '', 1, 1, 'admin', '2019-09-19 10:24:45', 'admin', '2019-09-23 11:46:39');\nINSERT INTO `sys_dict_item` VALUES ('1174509667297026049', '1174509082208395266', '助级', '2', NULL, '', 2, 1, 'admin', '2019-09-19 10:25:01', 'admin', '2019-09-23 11:46:47');\nINSERT INTO `sys_dict_item` VALUES ('1174509713568587777', '1174509082208395266', '中级', '3', NULL, '', 3, 1, 'admin', '2019-09-19 10:25:12', 'admin', '2019-09-23 11:46:56');\nINSERT INTO `sys_dict_item` VALUES ('1174509788361416705', '1174509082208395266', '副高级', '4', NULL, '', 4, 1, 'admin', '2019-09-19 10:25:30', 'admin', '2019-09-23 11:47:06');\nINSERT INTO `sys_dict_item` VALUES ('1174509835803189250', '1174509082208395266', '正高级', '5', NULL, '', 5, 1, 'admin', '2019-09-19 10:25:41', 'admin', '2019-09-23 11:47:12');\nINSERT INTO `sys_dict_item` VALUES ('1174511197735665665', '1174511106530525185', '公司', '1', NULL, '公司', 1, 1, 'admin', '2019-09-19 10:31:05', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1174511244036587521', '1174511106530525185', '部门', '2', NULL, '部门', 1, 1, 'admin', '2019-09-19 10:31:16', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1178295553450061826', '1178295274528845826', '可编辑(未授权禁用)', '2', NULL, '', 2, 1, 'admin', '2019-09-29 21:08:46', 'admin', '2019-09-29 21:09:18');\nINSERT INTO `sys_dict_item` VALUES ('1178295639554928641', '1178295274528845826', '可见(未授权不可见)', '1', NULL, '', 1, 1, 'admin', '2019-09-29 21:09:06', 'admin', '2019-09-29 21:09:24');\nINSERT INTO `sys_dict_item` VALUES ('1199517884758368257', '1199517671259906049', '一般', '1', NULL, '', 1, 1, 'admin', '2019-11-27 10:38:44', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1199517914017832962', '1199517671259906049', '重要', '2', NULL, '', 1, 1, 'admin', '2019-11-27 10:38:51', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1199517941339529217', '1199517671259906049', '紧急', '3', NULL, '', 1, 1, 'admin', '2019-11-27 10:38:58', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1199518186144276482', '1199518099888414722', '日常记录', '1', NULL, '', 1, 1, 'admin', '2019-11-27 10:39:56', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1199518214858481666', '1199518099888414722', '本周工作', '2', NULL, '', 1, 1, 'admin', '2019-11-27 10:40:03', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1199518235943247874', '1199518099888414722', '下周计划', '3', NULL, '', 1, 1, 'admin', '2019-11-27 10:40:08', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1199520817285701634', '1199520177767587841', '列表', '1', NULL, '', 1, 1, 'admin', '2019-11-27 10:50:24', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1199520835035996161', '1199520177767587841', '链接', '2', NULL, '', 1, 1, 'admin', '2019-11-27 10:50:28', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1199525468672405505', '1199525215290306561', '未开始', '0', NULL, '', 1, 1, 'admin', '2019-11-27 11:08:52', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1199525490575060993', '1199525215290306561', '进行中', '1', NULL, '', 1, 1, 'admin', '2019-11-27 11:08:58', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1199525506429530114', '1199525215290306561', '已完成', '2', NULL, '', 1, 1, 'admin', '2019-11-27 11:09:02', 'admin', '2019-11-27 11:10:02');\nINSERT INTO `sys_dict_item` VALUES ('1209733775114702850', '1209733563293962241', 'MySQL5.5', '1', NULL, '', 1, 1, 'admin', '2019-12-25 15:13:02', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1209733839933476865', '1209733563293962241', 'Oracle', '2', NULL, '', 3, 1, 'admin', '2019-12-25 15:13:18', 'admin', '2021-07-15 13:44:08');\nINSERT INTO `sys_dict_item` VALUES ('1209733903020003330', '1209733563293962241', 'SQLServer', '3', NULL, '', 4, 1, 'admin', '2019-12-25 15:13:33', 'admin', '2021-07-15 13:44:11');\nINSERT INTO `sys_dict_item` VALUES ('1232913424813486081', '1232913193820581889', '官方示例', 'demo', NULL, '', 1, 1, 'admin', '2020-02-27 14:20:42', 'admin', '2020-02-27 14:21:37');\nINSERT INTO `sys_dict_item` VALUES ('1232913493717512194', '1232913193820581889', '流程表单', 'bpm', NULL, '', 2, 1, 'admin', '2020-02-27 14:20:58', 'admin', '2020-02-27 14:22:20');\nINSERT INTO `sys_dict_item` VALUES ('1232913605382467585', '1232913193820581889', '测试表单', 'temp', NULL, '', 4, 1, 'admin', '2020-02-27 14:21:25', 'admin', '2020-02-27 14:22:16');\nINSERT INTO `sys_dict_item` VALUES ('1232914232372195330', '1232913193820581889', '导入表单', 'bdfl_include', NULL, '', 5, 1, 'admin', '2020-02-27 14:23:54', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1234371726545010689', '4e4602b3e3686f0911384e188dc7efb4', '左模糊', 'LEFT_LIKE', NULL, '左模糊', 7, 1, 'admin', '2020-03-02 14:55:27', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1234371809495760898', '4e4602b3e3686f0911384e188dc7efb4', '右模糊', 'RIGHT_LIKE', NULL, '右模糊', 7, 1, 'admin', '2020-03-02 14:55:47', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1242300779390357505', '1242298510024429569', '短信提醒', '2', NULL, '', 2, 1, 'admin', '2020-03-24 12:02:41', 'admin', '2020-03-30 18:21:33');\nINSERT INTO `sys_dict_item` VALUES ('1242300814383435777', '1242298510024429569', '邮件提醒', '1', NULL, '', 1, 1, 'admin', '2020-03-24 12:02:49', 'admin', '2020-03-30 18:21:26');\nINSERT INTO `sys_dict_item` VALUES ('1242300887343353857', '1242298510024429569', '系统消息', '4', NULL, '', 4, 1, 'admin', '2020-03-24 12:03:07', 'admin', '2020-03-30 18:21:43');\nINSERT INTO `sys_dict_item` VALUES ('1250688147579228161', '1250687930947620866', '正常', '0', NULL, '', 1, 1, 'admin', '2020-04-16 15:31:05', '', NULL);\nINSERT INTO `sys_dict_item` VALUES ('1250688201064992770', '1250687930947620866', '停止', '-1', NULL, '', 1, 1, 'admin', '2020-04-16 15:31:18', '', NULL);\nINSERT INTO `sys_dict_item` VALUES ('1280401815068295170', '1280401766745718786', '正常', '1', NULL, '', 1, 1, 'admin', '2020-07-07 15:22:36', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1280401847607705602', '1280401766745718786', '冻结', '0', NULL, '', 1, 1, 'admin', '2020-07-07 15:22:44', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1305827309355302914', 'bd1b8bc28e65d6feefefb6f3c79f42fd', 'API', 'api', NULL, '', 3, 1, 'admin', '2020-09-15 19:14:26', 'admin', '2020-09-15 19:14:41');\nINSERT INTO `sys_dict_item` VALUES ('1334440962954936321', '1209733563293962241', 'MYSQL5.7+', '4', NULL, '', 2, 1, 'admin', '2020-12-03 18:16:02', 'admin', '2021-07-15 13:44:29');\nINSERT INTO `sys_dict_item` VALUES ('1356445705549975553', '1356445645198135298', '是', 'Y', NULL, '', 1, 1, 'admin', '2021-02-02 11:33:52', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1356445754212290561', '1356445645198135298', '否', 'N', NULL, '', 1, 1, 'admin', '2021-02-02 11:34:04', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1414837074500976641', '1209733563293962241', 'postgresql', '6', NULL, '', 5, 1, 'admin', '2021-07-13 14:40:20', 'admin', '2021-07-15 13:44:15');\nINSERT INTO `sys_dict_item` VALUES ('1415547541091504129', '1209733563293962241', 'marialDB', '5', NULL, '', 6, 1, 'admin', '2021-07-15 13:43:28', 'admin', '2021-07-15 13:44:23');\nINSERT INTO `sys_dict_item` VALUES ('1418049969003089922', '1209733563293962241', '达梦', '7', NULL, '', 7, 1, 'admin', '2021-07-22 11:27:13', 'admin', '2021-07-22 11:27:30');\nINSERT INTO `sys_dict_item` VALUES ('1418050017053036545', '1209733563293962241', '人大金仓', '8', NULL, '', 8, 1, 'admin', '2021-07-22 11:27:25', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1418050075555188737', '1209733563293962241', '神通', '9', NULL, '', 9, 1, 'admin', '2021-07-22 11:27:39', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1418050110669901826', '1209733563293962241', 'SQLite', '10', NULL, '', 10, 1, 'admin', '2021-07-22 11:27:47', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1418050149475602434', '1209733563293962241', 'DB2', '11', NULL, '', 11, 1, 'admin', '2021-07-22 11:27:56', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1418050209823248385', '1209733563293962241', 'Hsqldb', '12', NULL, '', 12, 1, 'admin', '2021-07-22 11:28:11', 'admin', '2021-07-22 11:28:27');\nINSERT INTO `sys_dict_item` VALUES ('1418050323111399425', '1209733563293962241', 'Derby', '13', NULL, '', 13, 1, 'admin', '2021-07-22 11:28:38', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1418117316707590146', '1209733563293962241', 'H2', '14', NULL, '', 14, 1, 'admin', '2021-07-22 15:54:50', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1418491604048449537', '1209733563293962241', '其他数据库', '15', NULL, '', 15, 1, 'admin', '2021-07-23 16:42:07', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('147c48ff4b51545032a9119d13f3222a', 'd6e1152968b02d69ff358c75b48a6ee1', '测试流程', 'test', NULL, NULL, 1, 1, 'admin', '2019-03-22 19:27:05', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1543fe7e5e26fb97cdafe4981bedc0c8', '4c03fca6bf1f0299c381213961566349', '单排布局', 'single', NULL, NULL, 2, 1, 'admin', '2022-07-12 17:43:39', 'admin', '2019-04-12 17:43:57');\nINSERT INTO `sys_dict_item` VALUES ('1600042651777011713', '1600042215909134338', '信息传输、软件和信息技术服务业', '1', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:21:10', 'admin', '2022-12-06 16:21:27');\nINSERT INTO `sys_dict_item` VALUES ('1600042736254488578', '1600042215909134338', '制造业', '2', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:21:30', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600042785646612481', '1600042215909134338', '租赁和商务服务业', '3', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:21:42', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600042835433000961', '1600042215909134338', '教育', '4', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:21:54', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600042892072882177', '1600042215909134338', '金融业', '5', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:22:07', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600042975539531778', '1600042215909134338', '建筑业', '6', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:22:27', 'admin', '2022-12-06 16:22:32');\nINSERT INTO `sys_dict_item` VALUES ('1600043052177854466', '1600042215909134338', '科学研究和技术服务业', '7', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:22:46', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600043101976825857', '1600042215909134338', '批发和零售业', '8', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:22:58', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600043157069008898', '1600042215909134338', '住宿和餐饮业', '9', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:23:11', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600043203105689601', '1600042215909134338', '电子商务', '10', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:23:22', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600043277504253953', '1600042215909134338', '线下零售与服务业', '11', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:23:39', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600043334618091521', '1600042215909134338', '文化、体育和娱乐业', '12', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:23:53', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600043401030701058', '1600042215909134338', '房地产业', '13', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:24:09', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600043476440092673', '1600042215909134338', '交通运输、仓储和邮政业', '14', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:24:27', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600043553837584386', '1600042215909134338', '卫生和社会工作', '15', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:24:45', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600043628793991170', '1600042215909134338', '公共管理、社会保障和社会组织', '16', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:25:03', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600043675329794050', '1600042215909134338', '电力、热力、燃气及水生产和供应业', '18', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:25:14', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600043734607892482', '1600042215909134338', '水利、环境和公共设施管理业', '19', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:25:28', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600043783068880897', '1600042215909134338', '居民服务、修理和其他服务业', '20', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:25:40', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600043822679887874', '1600042215909134338', '政府机构', '21', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:25:49', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600043859539431426', '1600042215909134338', '农、林、牧、渔业', '22', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:25:58', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600043907551629313', '1600042215909134338', '采矿业', '23', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:26:10', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600043955731599362', '1600042215909134338', '国际组织', '24', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:26:21', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600043991685173249', '1600042215909134338', '其他', '25', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:26:30', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600044644096577538', '1600044537800331266', '20人以下', '1', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:29:05', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600044698618335233', '1600044537800331266', '21-99人', '2', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:29:18', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600044744172670978', '1600044537800331266', '100-499人', '3', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:29:29', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600044792306503681', '1600044537800331266', '500-999人', '4', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:29:41', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600044861302804481', '1600044537800331266', '1000-9999人', '5', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:29:57', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1600044924313833473', '1600044537800331266', '10000人以上', '6', NULL, NULL, 1, 1, 'admin', '2022-12-06 16:30:12', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1606645562573361153', '1606645341269299201', '总裁/总经理/CEO', '1', NULL, NULL, 1, 1, 'admin', '2022-12-24 21:38:47', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1606645619930468354', '1606645341269299201', '副总裁/副总经理/VP', '2', NULL, NULL, 2, 1, 'admin', '2022-12-24 21:39:00', 'admin', '2022-12-24 21:40:00');\nINSERT INTO `sys_dict_item` VALUES ('1606645660241924097', '1606645341269299201', '总监/主管/经理', '3', NULL, NULL, 3, 1, 'admin', '2022-12-24 21:39:10', 'admin', '2022-12-24 21:39:41');\nINSERT INTO `sys_dict_item` VALUES ('1606645696715591682', '1606645341269299201', '员工/专员/执行', '4', NULL, NULL, 4, 1, 'admin', '2022-12-24 21:39:19', 'admin', '2022-12-24 21:39:37');\nINSERT INTO `sys_dict_item` VALUES ('1606645744023146497', '1606645341269299201', '其他', '5', NULL, NULL, 5, 1, 'admin', '2022-12-24 21:39:30', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1606647668965412866', '1606646440684457986', '总经办', '1', NULL, NULL, 1, 1, 'admin', '2022-12-24 21:47:09', 'admin', '2023-10-18 13:54:03');\nINSERT INTO `sys_dict_item` VALUES ('1606647703098658817', '1606646440684457986', '技术/IT/研发', '2', NULL, NULL, 2, 1, 'admin', '2022-12-24 21:47:17', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1606647737919770625', '1606646440684457986', '产品/设计', '3', NULL, NULL, 3, 1, 'admin', '2022-12-24 21:47:25', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1606647789614567425', '1606646440684457986', '销售/市场/运营', '4', NULL, '', 4, 1, 'admin', '2022-12-24 21:47:38', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1606647827921145857', '1606646440684457986', '人事/财务/行政', '5', NULL, NULL, 5, 1, 'admin', '2022-12-24 21:47:47', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1606647860955484162', '1606646440684457986', '资源/仓储/采购', '6', NULL, NULL, 6, 1, 'admin', '2022-12-24 21:47:55', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1606647915473047553', '1606646440684457986', '其他', '7', NULL, NULL, 7, 1, 'admin', '2022-12-24 21:48:08', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1782325511230337025', '83bfb33147013cc81640d5fd9eda030c', '租户操作日志', '3', NULL, NULL, 1, 1, 'admin', '2024-04-22 16:28:11', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1783383857978970114', '83bfb33147013cc81640d5fd9eda030c', '异常日志', '4', NULL, NULL, 3, 1, 'jeecg', '2024-04-25 14:33:40', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1784843259509161986', '1784843187992084482', '电脑终端', 'pc', NULL, NULL, 1, 1, 'jeecg', '2024-04-29 15:12:49', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1784843314429378562', '1784843187992084482', '手机APP端', 'app', NULL, NULL, 1, 1, 'jeecg', '2024-04-29 15:13:02', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1784843380502249474', '1784843187992084482', '移动网页端', 'h5', NULL, NULL, 1, 1, 'jeecg', '2024-04-29 15:13:17', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1890229967585910786', '1890229208685322242', 'OpenAI', 'OPENAI', NULL, NULL, 1, 1, 'jeecg', '2025-02-14 10:41:58', 'jeecg', '2025-02-14 10:42:48');\nINSERT INTO `sys_dict_item` VALUES ('1890230018852888577', '1890229208685322242', '智谱AI', 'ZHIPU', NULL, NULL, 1, 1, 'jeecg', '2025-02-14 10:42:10', 'jeecg', '2025-02-14 10:42:42');\nINSERT INTO `sys_dict_item` VALUES ('1890230107835047937', '1890229208685322242', '千帆大模型', 'QIANFAN', NULL, NULL, 1, 1, 'jeecg', '2025-02-14 10:42:31', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1890230305948803073', '1890229208685322242', '通义千问', 'QWEN', NULL, NULL, 1, 1, 'jeecg', '2025-02-14 10:43:18', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1890230384159989762', '1890229208685322242', 'DeepSeek', 'DEEPSEEK', NULL, NULL, 1, 1, 'jeecg', '2025-02-14 10:43:37', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1890230437670920194', '1890229208685322242', 'Ollama', 'OLLAMA', NULL, NULL, 1, 1, 'jeecg', '2025-02-14 10:43:50', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1891456733029613569', '1891456510739890177', '语言模型', 'LLM', NULL, NULL, 1, 1, 'jeecg', '2025-02-17 19:56:41', 'jeecg', '2025-02-17 20:02:15');\nINSERT INTO `sys_dict_item` VALUES ('1891458099609354241', '1891456510739890177', '向量模型', 'EMBED', NULL, NULL, 1, 1, 'jeecg', '2025-02-17 20:02:07', 'jeecg', '2025-02-17 20:39:01');\nINSERT INTO `sys_dict_item` VALUES ('1891672501432479746', '1891672414555860993', '文本', 'text', NULL, NULL, 1, 1, 'jeecg', '2025-02-18 10:14:05', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1891672540963794946', '1891672414555860993', '文件', 'file', NULL, NULL, 1, 1, 'jeecg', '2025-02-18 10:14:14', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1891672567924781058', '1891672414555860993', '网页', 'web', NULL, NULL, 1, 1, 'jeecg', '2025-02-18 10:14:20', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1894701277019959298', '1894701158027554818', '智能体', 'chatSimple', NULL, NULL, 1, 1, 'jeecg', '2025-02-26 18:49:21', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1894701332930031618', '1894701158027554818', '高级编排', 'chatFLow', NULL, NULL, 2, 1, 'jeecg', '2025-02-26 18:49:34', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1934846897383485441', '1934846825077878786', '发布性通知', '1', NULL, NULL, 1, 1, 'admin', '2025-06-17 13:33:43', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1934846933030875138', '1934846825077878786', '转发性通知', '2', NULL, NULL, 1, 1, 'admin', '2025-06-17 13:33:51', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1934846963749957633', '1934846825077878786', '指示性通知', '3', NULL, NULL, 1, 1, 'admin', '2025-06-17 13:33:59', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1934846993449824257', '1934846825077878786', '任免性通知', '4', NULL, NULL, 1, 1, 'admin', '2025-06-17 13:34:06', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1934847047262744577', '1934846825077878786', '事务性（周知）通知', '5', NULL, NULL, 1, 1, 'admin', '2025-06-17 13:34:18', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1934847082905939969', '1934846825077878786', '会议通知', '6', NULL, NULL, 1, 1, 'admin', '2025-06-17 13:34:27', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1934847117039185921', '1934846825077878786', '其他通知', '7', NULL, NULL, 1, 1, 'admin', '2025-06-17 13:34:35', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1937394006326460418', '1937393911539384322', '通知公告', 'notice', NULL, NULL, 1, 1, 'admin', '2025-06-24 14:15:01', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1937394038412886018', '1937393911539384322', '其他', 'other', NULL, NULL, 1, 1, 'admin', '2025-06-24 14:15:08', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1939572554533429250', '1939572486447292418', '角色', 'ROLE', NULL, NULL, 1, 1, 'admin', '2025-06-30 14:31:47', 'admin', '2025-06-30 15:04:18');\nINSERT INTO `sys_dict_item` VALUES ('1939572602289774594', '1939572486447292418', '用户', 'USER', NULL, NULL, 2, 1, 'admin', '2025-06-30 14:31:59', 'admin', '2025-06-30 15:04:21');\nINSERT INTO `sys_dict_item` VALUES ('1955230463631126529', '1174511106530525185', '子公司', '4', NULL, NULL, 1, 1, 'admin', '2025-08-12 19:30:44', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1963079150651305985', '1939572486447292418', '全局默认', 'DEFAULT', NULL, NULL, 3, 1, 'admin', '2025-09-03 11:18:36', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1964944982842281986', '1964944899916697602', '董事长', '0', NULL, NULL, 0, 1, 'admin', '2025-09-08 14:52:45', 'admin', '2025-09-08 14:53:54');\nINSERT INTO `sys_dict_item` VALUES ('1964945020519714817', '1964944899916697602', '总经理', '1', NULL, NULL, 1, 1, 'admin', '2025-09-08 14:52:54', 'admin', '2025-09-13 18:50:37');\nINSERT INTO `sys_dict_item` VALUES ('1964945061850386434', '1964944899916697602', '副总经理', '2', NULL, NULL, 2, 1, 'admin', '2025-09-08 14:53:04', 'admin', '2025-09-08 14:53:46');\nINSERT INTO `sys_dict_item` VALUES ('1964945100802887681', '1964944899916697602', '部长', '3', NULL, NULL, 3, 1, 'admin', '2025-09-08 14:53:14', 'admin', '2025-09-08 14:53:43');\nINSERT INTO `sys_dict_item` VALUES ('1964945142854979586', '1964944899916697602', '副部长', '4', NULL, NULL, 4, 1, 'admin', '2025-09-08 14:53:24', 'admin', '2025-09-08 14:53:40');\nINSERT INTO `sys_dict_item` VALUES ('1964945196395270146', '1964944899916697602', '职员', '5', NULL, NULL, 5, 1, 'admin', '2025-09-08 14:53:36', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1ce390c52453891f93514c1bd2795d44', 'ad7c65ba97c20a6805d5dcdf13cdaf36', '000', '00', NULL, NULL, 1, 1, 'admin', '2019-03-22 16:34:34', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('1db531bcff19649fa82a644c8a939dc4', '4c03fca6bf1f0299c381213961566349', '组合布局', 'combination', NULL, '', 4, 1, 'admin', '2019-05-11 16:07:08', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('2008087927907045378', '1891456510739890177', '图像模型', 'IMAGE', NULL, NULL, 3, 1, 'admin', '2026-01-05 16:07:25', 'admin', '2026-01-05 16:07:31');\nINSERT INTO `sys_dict_item` VALUES ('222705e11ef0264d4214affff1fb4ff9', '4f69be5f507accea8d5df5f11346181a', '文本', '1', NULL, '', 1, 1, 'admin', '2023-02-28 10:50:36', 'admin', '2022-07-04 16:29:21');\nINSERT INTO `sys_dict_item` VALUES ('23a5bb76004ed0e39414e928c4cde155', '4e4602b3e3686f0911384e188dc7efb4', '不等于', '!=', NULL, '不等于', 3, 1, 'admin', '2019-04-01 16:46:15', 'admin', '2019-04-01 17:48:40');\nINSERT INTO `sys_dict_item` VALUES ('25847e9cb661a7c711f9998452dc09e6', '4e4602b3e3686f0911384e188dc7efb4', '小于等于', '<=', NULL, '小于等于', 6, 1, 'admin', '2019-04-01 16:44:34', 'admin', '2019-04-01 17:49:10');\nINSERT INTO `sys_dict_item` VALUES ('2d51376643f220afdeb6d216a8ac2c01', '68168534ff5065a152bfab275c2136f8', '有效', '1', NULL, '有效', 2, 1, 'admin', '2019-04-26 19:22:01', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('308c8aadf0c37ecdde188b97ca9833f5', '8dfe32e2d29ea9430a988b3b558bf233', '已发布', '1', NULL, '已发布', 2, 1, 'admin', '2019-04-16 17:41:24', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('333e6b2196e01ef9a5f76d74e86a6e33', '8dfe32e2d29ea9430a988b3b558bf233', '未发布', '0', NULL, '未发布', 1, 1, 'admin', '2019-04-16 17:41:12', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('337ea1e401bda7233f6258c284ce4f50', 'bd1b8bc28e65d6feefefb6f3c79f42fd', 'JSON', 'json', NULL, NULL, 1, 1, 'admin', '2019-04-12 17:26:33', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('33bc9d9f753cf7dc40e70461e50fdc54', 'a9d9942bd0eccb6e89de92d130ec4c4a', '发送失败', '2', NULL, NULL, 3, 1, 'admin', '2019-04-12 18:20:02', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('3fbc03d6c994ae06d083751248037c0e', '78bda155fe380b1b3f175f1e88c284c6', '已完成', '3', NULL, '已完成', 3, 1, 'admin', '2019-05-09 16:33:25', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('41d7aaa40c9b61756ffb1f28da5ead8e', '0b5d19e1fce4b2e6647e6b4a17760c14', '通知公告', '1', NULL, NULL, 1, 1, 'admin', '2019-04-22 18:01:57', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('41fa1e9571505d643aea87aeb83d4d76', '4e4602b3e3686f0911384e188dc7efb4', '等于', '=', NULL, '等于', 4, 1, 'admin', '2019-04-01 16:45:24', 'admin', '2019-04-01 17:49:00');\nINSERT INTO `sys_dict_item` VALUES ('43d2295b8610adce9510ff196a49c6e9', '845da5006c97754728bf48b6a10f79cc', '正常', '1', NULL, NULL, NULL, 1, 'admin', '2019-03-18 21:45:51', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('4f05fb5376f4c61502c5105f52e4dd2b', '83bfb33147013cc81640d5fd9eda030c', '操作日志', '2', NULL, NULL, NULL, 1, 'admin', '2019-03-18 23:22:49', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('50223341bfb5ba30bf6319789d8d17fe', 'd6e1152968b02d69ff358c75b48a6ee1', '业务办理', 'business', NULL, NULL, 3, 1, 'admin', '2023-04-22 19:28:05', 'admin', '2019-03-22 23:24:39');\nINSERT INTO `sys_dict_item` VALUES ('51222413e5906cdaf160bb5c86fb827c', 'a7adbcd86c37f7dbc9b66945c82ef9e6', '是', '1', NULL, '', 1, 1, 'admin', '2019-05-22 19:29:45', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('538fca35afe004972c5f3947c039e766', '2e02df51611a4b9632828ab7e5338f00', '显示', '1', NULL, '显示', 1, 1, 'admin', '2025-03-26 18:27:13', 'admin', '2019-04-26 18:39:07');\nINSERT INTO `sys_dict_item` VALUES ('5584c21993bde231bbde2b966f2633ac', '4e4602b3e3686f0911384e188dc7efb4', '自定义SQL表达式', 'USE_SQL_RULES', NULL, '自定义SQL表达式', 9, 1, 'admin', '2019-04-01 10:45:24', 'admin', '2019-04-01 17:49:27');\nINSERT INTO `sys_dict_item` VALUES ('58b73b344305c99b9d8db0fc056bbc0a', '72cce0989df68887546746d8f09811aa', '主表', '2', NULL, NULL, 2, 1, 'admin', '2019-03-27 10:13:36', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('5b65a88f076b32e8e69d19bbaadb52d5', '2f0320997ade5dd147c90130f7218c3e', '全体用户', 'ALL', NULL, NULL, NULL, 1, 'admin', '2020-10-17 21:22:43', 'admin', '2019-03-28 22:17:09');\nINSERT INTO `sys_dict_item` VALUES ('5d833f69296f691843ccdd0c91212b6b', '880a895c98afeca9d9ac39f29e67c13e', '修改', '3', NULL, '', 3, 1, 'admin', '2019-07-22 10:55:07', 'admin', '2019-07-22 10:55:41');\nINSERT INTO `sys_dict_item` VALUES ('5d84a8634c8fdfe96275385075b105c9', '3d9a351be3436fbefb1307d4cfb49bf2', '女', '2', '#08C9C9', NULL, 2, 1, NULL, '2019-01-04 14:56:56', 'admin', '2026-01-21 23:15:36');\nINSERT INTO `sys_dict_item` VALUES ('66c952ae2c3701a993e7db58f3baf55e', '4e4602b3e3686f0911384e188dc7efb4', '大于', '>', NULL, '大于', 1, 1, 'admin', '2019-04-01 10:45:46', 'admin', '2019-04-01 17:48:29');\nINSERT INTO `sys_dict_item` VALUES ('6937c5dde8f92e9a00d4e2ded9198694', 'ad7c65ba97c20a6805d5dcdf13cdaf36', 'easyui', '3', NULL, NULL, 1, 1, 'admin', '2019-03-22 16:32:15', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('69cacf64e244100289ddd4aa9fa3b915', 'a9d9942bd0eccb6e89de92d130ec4c4a', '未发送', '0', NULL, NULL, 1, 1, 'admin', '2019-04-12 18:19:23', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('6a7a9e1403a7943aba69e54ebeff9762', '4f69be5f507accea8d5df5f11346181a', '富文本', '2', NULL, '', 2, 1, 'admin', '2031-02-28 10:50:44', 'admin', '2022-07-04 16:29:30');\nINSERT INTO `sys_dict_item` VALUES ('6c682d78ddf1715baf79a1d52d2aa8c2', '72cce0989df68887546746d8f09811aa', '单表', '1', NULL, NULL, 1, 1, 'admin', '2019-03-27 10:13:29', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('6d404fd2d82311fbc87722cd302a28bc', '4e4602b3e3686f0911384e188dc7efb4', '模糊', 'LIKE', NULL, '模糊', 7, 1, 'admin', '2019-04-01 16:46:02', 'admin', '2019-04-01 17:49:20');\nINSERT INTO `sys_dict_item` VALUES ('6d4e26e78e1a09699182e08516c49fc4', '4d7fec1a7799a436d26d02325eff295e', '高', 'H', NULL, '高', 1, 1, 'admin', '2019-04-16 17:04:24', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('700e9f030654f3f90e9ba76ab0713551', '6b78e3f59faec1a4750acff08030a79b', '333', '333', NULL, NULL, NULL, 1, 'admin', '2019-02-21 19:59:47', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('7050c1522702bac3be40e3b7d2e1dfd8', 'c5a14c75172783d72cbee6ee7f5df5d1', '柱状图', 'bar', NULL, NULL, 1, 1, 'admin', '2019-04-12 17:05:17', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('71b924faa93805c5c1579f12e001c809', 'd6e1152968b02d69ff358c75b48a6ee1', 'OA办公', 'oa', NULL, NULL, 2, 1, 'admin', '2021-03-22 19:27:17', 'admin', '2023-10-18 13:54:29');\nINSERT INTO `sys_dict_item` VALUES ('75b260d7db45a39fc7f21badeabdb0ed', 'c36169beb12de8a71c8683ee7c28a503', '不启用', '0', NULL, NULL, NULL, 1, 'admin', '2019-03-18 23:29:41', 'admin', '2019-03-18 23:29:54');\nINSERT INTO `sys_dict_item` VALUES ('7688469db4a3eba61e6e35578dc7c2e5', 'c36169beb12de8a71c8683ee7c28a503', '启用', '1', NULL, NULL, NULL, 1, 'admin', '2019-03-18 23:29:28', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('78ea6cadac457967a4b1c4eb7aaa418c', 'fc6cd58fde2e8481db10d3a1e68ce70c', '正常', '1', NULL, NULL, NULL, 1, 'admin', '2019-03-18 23:30:28', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('7ccf7b80c70ee002eceb3116854b75cb', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '按钮权限', '2', NULL, NULL, NULL, 1, 'admin', '2019-03-18 23:25:40', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('81fb2bb0e838dc68b43f96cc309f8257', 'fc6cd58fde2e8481db10d3a1e68ce70c', '冻结', '2', NULL, NULL, NULL, 1, 'admin', '2019-03-18 23:30:37', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('83250269359855501ec4e9c0b7e21596', '4274efc2292239b6f000b153f50823ff', '可见/可访问(授权后可见/可访问)', '1', NULL, '', 1, 1, 'admin', '2019-05-10 17:54:51', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('84778d7e928bc843ad4756db1322301f', '4e4602b3e3686f0911384e188dc7efb4', '大于等于', '>=', NULL, '大于等于', 5, 1, 'admin', '2019-04-01 10:46:02', 'admin', '2019-04-01 17:49:05');\nINSERT INTO `sys_dict_item` VALUES ('848d4da35ebd93782029c57b103e5b36', 'c5a14c75172783d72cbee6ee7f5df5d1', '饼图', 'pie', NULL, NULL, 3, 1, 'admin', '2019-04-12 17:05:49', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('84dfc178dd61b95a72900fcdd624c471', '78bda155fe380b1b3f175f1e88c284c6', '处理中', '2', NULL, '处理中', 2, 1, 'admin', '2019-05-09 16:33:01', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('86f19c7e0a73a0bae451021ac05b99dd', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '子菜单', '1', NULL, NULL, NULL, 1, 'admin', '2019-03-18 23:25:27', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('8c618902365ca681ebbbe1e28f11a548', '4c753b5293304e7a445fd2741b46529d', '启用', '1', NULL, '', 0, 1, 'admin', '2020-07-18 23:19:27', 'admin', '2019-05-17 14:51:18');\nINSERT INTO `sys_dict_item` VALUES ('8cdf08045056671efd10677b8456c999', '4274efc2292239b6f000b153f50823ff', '可编辑(未授权时禁用)', '2', NULL, '', 2, 1, 'admin', '2019-05-10 17:55:38', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('8ff48e657a7c5090d4f2a59b37d1b878', '4d7fec1a7799a436d26d02325eff295e', '中', 'M', NULL, '中', 2, 1, 'admin', '2019-04-16 17:04:40', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('948923658baa330319e59b2213cda97c', '880a895c98afeca9d9ac39f29e67c13e', '添加', '2', NULL, '', 2, 1, 'admin', '2019-07-22 10:54:59', 'admin', '2019-07-22 10:55:36');\nINSERT INTO `sys_dict_item` VALUES ('9a96c4a4e4c5c9b4e4d0cbf6eb3243cc', '4c753b5293304e7a445fd2741b46529d', '不启用', '0', NULL, NULL, 1, 1, 'admin', '2019-03-18 23:19:53', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('a1e7d1ca507cff4a480c8caba7c1339e', '880a895c98afeca9d9ac39f29e67c13e', '导出', '6', NULL, '', 6, 1, 'admin', '2019-07-22 12:06:50', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('a2be752dd4ec980afaec1efd1fb589af', '8dfe32e2d29ea9430a988b3b558bf233', '已撤销', '2', NULL, '已撤销', 3, 1, 'admin', '2019-04-16 17:41:39', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('aa0d8a8042a18715a17f0a888d360aa4', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '一级菜单', '0', NULL, NULL, NULL, 1, 'admin', '2019-03-18 23:24:52', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('adcf2a1fe93bb99a84833043f475fe0b', '4e4602b3e3686f0911384e188dc7efb4', '包含', 'IN', NULL, '包含', 8, 1, 'admin', '2019-04-01 16:45:47', 'admin', '2019-04-01 17:49:24');\nINSERT INTO `sys_dict_item` VALUES ('b029a41a851465332ee4ee69dcf0a4c2', '0b5d19e1fce4b2e6647e6b4a17760c14', '系统消息', '2', NULL, NULL, 1, 1, 'admin', '2019-02-22 18:02:08', 'admin', '2019-04-22 18:02:13');\nINSERT INTO `sys_dict_item` VALUES ('b2a8b4bb2c8e66c2c4b1bb086337f393', '3486f32803bb953e7155dab3513dc68b', '正常', '0', NULL, NULL, NULL, 1, 'admin', '2022-10-18 21:46:48', 'admin', '2019-03-28 22:22:20');\nINSERT INTO `sys_dict_item` VALUES ('b57f98b88363188daf38d42f25991956', '6b78e3f59faec1a4750acff08030a79b', '22', '222', NULL, NULL, NULL, 0, 'admin', '2019-02-21 19:59:43', 'admin', '2019-03-11 21:23:27');\nINSERT INTO `sys_dict_item` VALUES ('b5f3bd5f66bb9a83fecd89228c0d93d1', '68168534ff5065a152bfab275c2136f8', '无效', '0', NULL, '无效', 1, 1, 'admin', '2019-04-26 19:21:49', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('b9fbe2a3602d4a27b45c100ac5328484', '78bda155fe380b1b3f175f1e88c284c6', '待提交', '1', NULL, '待提交', 1, 1, 'admin', '2019-05-09 16:32:35', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('ba27737829c6e0e582e334832703d75e', '236e8a4baff0db8c62c00dd95632834f', '同步', '1', NULL, '同步', 1, 1, 'admin', '2019-05-15 15:28:15', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('bcec04526b04307e24a005d6dcd27fd6', '880a895c98afeca9d9ac39f29e67c13e', '导入', '5', NULL, '', 5, 1, 'admin', '2019-07-22 12:06:41', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('c53da022b9912e0aed691bbec3c78473', '880a895c98afeca9d9ac39f29e67c13e', '查询', '1', NULL, '', 1, 1, 'admin', '2019-07-22 10:54:51', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('c5700a71ad08994d18ad1dacc37a71a9', 'a7adbcd86c37f7dbc9b66945c82ef9e6', '否', '0', NULL, '', 1, 1, 'admin', '2019-05-22 19:29:55', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('cbfcc5b88fc3a90975df23ffc8cbe29c', 'c5a14c75172783d72cbee6ee7f5df5d1', '曲线图', 'line', NULL, NULL, 2, 1, 'admin', '2019-05-12 17:05:30', 'admin', '2019-04-12 17:06:06');\nINSERT INTO `sys_dict_item` VALUES ('d217592908ea3e00ff986ce97f24fb98', 'c5a14c75172783d72cbee6ee7f5df5d1', '数据列表', 'table', NULL, NULL, 4, 1, 'admin', '2019-04-12 17:05:56', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('df168368dcef46cade2aadd80100d8aa', '3d9a351be3436fbefb1307d4cfb49bf2', '男', '1', '#FF9300', NULL, 1, 1, NULL, '2027-08-04 14:56:49', 'admin', '2026-01-21 23:15:33');\nINSERT INTO `sys_dict_item` VALUES ('e6329e3a66a003819e2eb830b0ca2ea0', '4e4602b3e3686f0911384e188dc7efb4', '小于', '<', NULL, '小于', 2, 1, 'admin', '2019-04-01 16:44:15', 'admin', '2019-04-01 17:48:34');\nINSERT INTO `sys_dict_item` VALUES ('e94eb7af89f1dbfa0d823580a7a6e66a', '236e8a4baff0db8c62c00dd95632834f', '不同步', '0', NULL, '不同步', 2, 1, 'admin', '2019-05-15 15:28:28', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('f0162f4cc572c9273f3e26b2b4d8c082', 'ad7c65ba97c20a6805d5dcdf13cdaf36', 'booostrap', '1', NULL, NULL, 1, 1, 'admin', '2021-08-22 16:32:04', 'admin', '2019-03-22 16:33:57');\nINSERT INTO `sys_dict_item` VALUES ('f16c5706f3ae05c57a53850c64ce7c45', 'a9d9942bd0eccb6e89de92d130ec4c4a', '发送成功', '1', NULL, NULL, 2, 1, 'admin', '2019-04-12 18:19:43', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('f2a7920421f3335afdf6ad2b342f6b5d', '845da5006c97754728bf48b6a10f79cc', '冻结', '2', NULL, NULL, NULL, 1, 'admin', '2019-03-18 21:46:02', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('f37f90c496ec9841c4c326b065e00bb2', '83bfb33147013cc81640d5fd9eda030c', '登录日志', '1', NULL, NULL, NULL, 1, 'admin', '2019-03-18 23:22:37', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('f753aff60ff3931c0ecb4812d8b5e643', '4c03fca6bf1f0299c381213961566349', '双排布局', 'double', NULL, NULL, 3, 1, 'admin', '2019-04-12 17:43:51', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('f80a8f6838215753b05e1a5ba3346d22', '880a895c98afeca9d9ac39f29e67c13e', '删除', '4', NULL, '', 4, 1, 'admin', '2019-07-22 10:55:14', 'admin', '2019-07-22 10:55:30');\nINSERT INTO `sys_dict_item` VALUES ('fcec03570f68a175e1964808dc3f1c91', '4c03fca6bf1f0299c381213961566349', 'Tab风格', 'tab', NULL, NULL, 1, 1, 'admin', '2019-04-12 17:43:31', NULL, NULL);\nINSERT INTO `sys_dict_item` VALUES ('fe50b23ae5e68434def76f67cef35d2d', '78bda155fe380b1b3f175f1e88c284c6', '已作废', '4', NULL, '已作废', 4, 1, 'admin', '2021-09-09 16:33:43', 'admin', '2019-05-09 16:34:40');\n\n-- ----------------------------\n-- Table structure for sys_files\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_files`;\nCREATE TABLE `sys_files`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id',\n  `file_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件名称',\n  `url` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件地址',\n  `file_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文档类型（folder:文件夹 excel:excel doc:word ppt:ppt image:图片  archive:其他文档 video:视频 pdf:pdf）',\n  `store_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件上传类型(temp/本地上传(临时文件) manage/知识库)',\n  `parent_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父级id',\n  `tenant_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户id',\n  `file_size` double(13, 2) NULL DEFAULT NULL COMMENT '文件大小（kb）',\n  `iz_folder` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否文件夹(1：是  0：否)',\n  `iz_root_folder` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否为1级文件夹，允许为空 (1：是 )',\n  `iz_star` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否标星(1：是  0：否)',\n  `down_count` int(11) NULL DEFAULT NULL COMMENT '下载次数',\n  `read_count` int(11) NULL DEFAULT NULL COMMENT '阅读次数',\n  `share_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '分享链接',\n  `share_perms` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '分享权限(1.关闭分享 2.允许所有联系人查看 3.允许任何人查看)',\n  `enable_down` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否允许下载(1：是  0：否)',\n  `enable_updat` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否允许修改(1：是  0：否)',\n  `del_flag` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '删除状态(0-正常,1-删除至回收站)',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `index_tenant_id`(`tenant_id`) USING BTREE,\n  INDEX `index_del_flag`(`del_flag`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '知识库-文档管理' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_files\n-- ----------------------------\nINSERT INTO `sys_files` VALUES ('1580814573568143361', '11.jpg', 'comment/11_1665730539114.jpg', 'image', 'temp', NULL, NULL, 10956.00, '0', '0', '0', NULL, NULL, NULL, NULL, NULL, NULL, '0', 'admin', '2022-10-14 14:55:39', NULL, NULL);\nINSERT INTO `sys_files` VALUES ('1584493984691740674', 'jeecg-boot漏洞.pdf', 'comment/jeecg-boot漏洞_1666607779077.pdf', 'pdf', 'temp', NULL, NULL, 842789.00, '0', '0', '0', NULL, NULL, NULL, NULL, NULL, NULL, '0', 'admin', '2022-10-24 18:36:19', NULL, NULL);\nINSERT INTO `sys_files` VALUES ('1714455459928985601', '低代码平台.png', 'comment/低代码平台_1697593009343.png', 'image', 'temp', NULL, '1000', 1249631.00, '0', '0', '0', NULL, NULL, NULL, NULL, NULL, NULL, '0', 'admin', '2023-10-18 09:36:49', NULL, NULL);\n\n-- ----------------------------\n-- Table structure for sys_fill_rule\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_fill_rule`;\nCREATE TABLE `sys_fill_rule`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键ID',\n  `rule_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则名称',\n  `rule_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则Code',\n  `rule_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则实现类',\n  `rule_params` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '规则参数',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uk_sfr_rule_code`(`rule_code`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_fill_rule\n-- ----------------------------\nINSERT INTO `sys_fill_rule` VALUES ('1202551334738382850', '机构编码生成', 'org_num_role', 'org.jeecg.modules.system.rule.OrgCodeRule', '{\\\"parentId\\\":\\\"c6d7cb4deeac411cb3384b1b31278596\\\"}', 'admin', '2019-12-09 10:37:06', 'admin', '2019-12-05 19:32:35');\nINSERT INTO `sys_fill_rule` VALUES ('1202787623203065858', '分类字典编码生成', 'category_code_rule', 'org.jeecg.modules.system.rule.CategoryCodeRule', '{\\\"pid\\\":\\\"\\\"}', 'admin', '2022-10-13 16:47:52', 'admin', '2019-12-06 11:11:31');\nINSERT INTO `sys_fill_rule` VALUES ('1260134137920090113', '订单流水号', 'shop_order_num', 'org.jeecg.modules.online.cgform.rule.OrderNumberRule', '{}', 'admin', '2020-12-07 18:29:50', 'admin', '2020-05-12 17:06:05');\n\n-- ----------------------------\n-- Table structure for sys_form_file\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_form_file`;\nCREATE TABLE `sys_form_file`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `table_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '表名',\n  `table_data_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '数据id',\n  `file_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '关联文件id',\n  `file_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件类型(text:文本, excel:excel doc:word ppt:ppt image:图片  archive:其他文档 video:视频 pdf:pdf）)',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_table_form`(`table_name`, `table_data_id`) USING BTREE,\n  INDEX `index_file_id`(`file_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_form_file\n-- ----------------------------\nINSERT INTO `sys_form_file` VALUES ('1580814573635252225', 'sys_comment', '1580814573433925634', '1580814573568143361', 'image', 'admin', '2022-10-14 14:55:39');\nINSERT INTO `sys_form_file` VALUES ('1584493984716906497', 'sys_comment', '1584493984364584961', '1584493984691740674', 'pdf', 'admin', '2022-10-24 18:36:19');\nINSERT INTO `sys_form_file` VALUES ('1714455459928985602', 'sys_comment', '1714455459606024193', '1714455459928985601', 'image', 'admin', '2023-10-18 09:36:49');\nINSERT INTO `sys_form_file` VALUES ('1800557956199825409', 'sys_comment', '1800557955415490562', '1800557956132716545', 'image', 'admin', '2024-06-11 23:57:24');\nINSERT INTO `sys_form_file` VALUES ('1800558014597120003', 'sys_comment', '1800558013942808578', '1800558014597120002', 'image', 'admin', '2024-06-11 23:57:38');\nINSERT INTO `sys_form_file` VALUES ('1805421721449791490', 'sys_comment', '1805421721126830082', '1805421721449791489', 'image', 'admin', '2024-06-25 10:04:16');\n\n-- ----------------------------\n-- Table structure for sys_gateway_route\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_gateway_route`;\nCREATE TABLE `sys_gateway_route`  (\n  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `router_id` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '路由ID',\n  `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '服务名',\n  `uri` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '服务地址',\n  `predicates` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '断言',\n  `filters` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '过滤器',\n  `retryable` int(3) NULL DEFAULT NULL COMMENT '是否重试:0-否 1-是',\n  `strip_prefix` int(3) NULL DEFAULT NULL COMMENT '是否忽略前缀0-否 1-是',\n  `persistable` int(3) NULL DEFAULT NULL COMMENT '是否为保留数据:0-否 1-是',\n  `show_api` int(3) NULL DEFAULT NULL COMMENT '是否在接口文档中展示:0-否 1-是',\n  `status` int(3) NULL DEFAULT NULL COMMENT '状态:0-无效 1-有效',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `sys_org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属部门',\n  `del_flag` int(11) NULL DEFAULT NULL COMMENT '删除状态',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_gateway_route\n-- ----------------------------\nINSERT INTO `sys_gateway_route` VALUES ('1331051599401857026', 'jeecg-demo-websocket', 'jeecg-demo-websocket', 'lb:ws://jeecg-demo', '[{\\\"args\\\":[\\\"/vxeSocket/**\\\"],\\\"name\\\":\\\"Path\\\"}]', '[{\\\"args\\\":[{\\\"value\\\":\\\"#{@ipKeyResolver}\\\",\\\"key\\\":\\\"key-resolver\\\"},{\\\"value\\\":20,\\\"key\\\":\\\"redis-rate-limiter.replenishRate\\\"},{\\\"value\\\":20,\\\"key\\\":\\\"redis-rate-limiter.burstCapacity\\\"}],\\\"name\\\":\\\"RequestRateLimiter\\\",\\\"title\\\":\\\"限流过滤器\\\"}]', NULL, NULL, NULL, NULL, 1, 'admin', '2020-11-24 09:46:46', NULL, NULL, NULL, 0);\nINSERT INTO `sys_gateway_route` VALUES ('1805444036892016641', 'jeecg-erp', 'jeecg-erp', 'lb://jeecg-erp', '[{\\\"args\\\":[\\\"/erp/**\\\"],\\\"name\\\":\\\"Path\\\"}]', '[]', NULL, NULL, NULL, NULL, 1, 'admin', '2024-06-25 11:32:57', NULL, NULL, NULL, 0);\nINSERT INTO `sys_gateway_route` VALUES ('jeecg-cloud-websocket', 'jeecg-system-websocket', 'jeecg-system-websocket', 'lb:ws://jeecg-system', '[{\\\"args\\\":[\\\"/websocket/**\\\",\\\"/eoaSocket/**\\\",\\\"/newsWebsocket/**\\\",\\\"/dragChannelSocket/**\\\"],\\\"name\\\":\\\"Path\\\"}]', '[]', NULL, NULL, NULL, NULL, 1, 'admin', '2020-11-16 19:41:51', NULL, NULL, NULL, 0);\nINSERT INTO `sys_gateway_route` VALUES ('jeecg-demo', 'jeecg-demo', 'jeecg-demo', 'lb://jeecg-demo', '[{\\\"args\\\":[\\\"/mock/**\\\",\\\"/bigscreen/template1/**\\\",\\\"/bigscreen/template2/**\\\",\\\"/test/**\\\",\\\"/hello/**\\\"],\\\"name\\\":\\\"Path\\\"}]', '[]', NULL, NULL, NULL, NULL, 1, 'admin', '2020-11-16 19:41:51', NULL, NULL, NULL, 0);\nINSERT INTO `sys_gateway_route` VALUES ('jeecg-system', 'jeecg-system', 'jeecg-system', 'lb://jeecg-system', '[{\\\"args\\\":[\\\"/sys/**\\\",\\\"/online/**\\\",\\\"/bigscreen/**\\\",\\\"/jmreport/**\\\",\\\"/druid/**\\\",\\\"/generic/**\\\",\\\"/actuator/**\\\",\\\"/drag/**\\\",\\\"/oauth2/**\\\",\\\"/defa/**\\\",\\\"/demo/**\\\",\\\"/jimubi/**\\\",\\\"/airag/**\\\",\\\"/openapi/**\\\"],\\\"name\\\":\\\"Path\\\"}]', '[]', NULL, NULL, NULL, NULL, 1, 'admin', '2020-11-16 19:41:51', NULL, NULL, NULL, 0);\n\n-- ----------------------------\n-- Table structure for sys_log\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_log`;\nCREATE TABLE `sys_log`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `log_type` int(3) NULL DEFAULT NULL COMMENT '日志类型（1登录日志，2操作日志, 3.租户操作日志）',\n  `log_content` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '日志内容',\n  `operate_type` int(2) NULL DEFAULT NULL COMMENT '操作类型',\n  `userid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作用户账号',\n  `username` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作用户名称',\n  `ip` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'IP',\n  `method` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求java方法',\n  `request_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求路径',\n  `request_param` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '请求参数',\n  `request_type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '请求类型',\n  `cost_time` bigint(20) NULL DEFAULT NULL COMMENT '耗时',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  `tenant_id` int(10) NULL DEFAULT NULL COMMENT '租户ID',\n  `client_type` varchar(5) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客户端类型 pc:电脑端 app:手机端 h5:移动网页端',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_sl_userid`(`userid`) USING BTREE,\n  INDEX `idx_sl_log_type`(`log_type`) USING BTREE,\n  INDEX `idx_sl_operate_type`(`operate_type`) USING BTREE,\n  INDEX `idx_sl_create_time`(`create_time`) USING BTREE\n) ENGINE = MyISAM CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统日志表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_log\n-- ----------------------------\nINSERT INTO `sys_log` VALUES ('1939497644808986625', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-06-30 09:34:07', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1939497738702675969', 2, 'online表单加载,表名:test_demo,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 76, NULL, '2025-06-30 09:34:30', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1939497738702675970', 2, 'online表单加载,表名:test_demo,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 79, NULL, '2025-06-30 09:34:30', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1939497738971111425', 2, 'online列表加载,表名:test_demo,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 172, NULL, '2025-06-30 09:34:30', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1939497753202384899', 2, 'online表单加载,表名:test_demo,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 9, NULL, '2025-06-30 09:34:33', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1939497753202384898', 2, 'online表单加载,表名:test_demo,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 13, NULL, '2025-06-30 09:34:33', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1939497753332408322', 2, 'online列表加载,表名:test_demo,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 46, NULL, '2025-06-30 09:34:33', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1939860490830999553', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.apache.shiro.web.servlet.ShiroHttpServletRequest@7e6d0283', NULL, 109, NULL, '2025-07-01 09:35:57', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1942113614006280194', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-07 14:49:03', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1942113794776588290', 2, 'online列表加载,表名:test_order_main,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.d()', NULL, '', NULL, 155, NULL, '2025-07-07 14:49:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1942113794776588291', 2, 'online表单加载,表名:test_order_main,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 145, NULL, '2025-07-07 14:49:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1942113794776588292', 2, 'online表单加载,表名:test_order_main,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 123, NULL, '2025-07-07 14:49:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1942113795296681986', 2, 'online表单加载,表名:test_order_customer,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 32, NULL, '2025-07-07 14:49:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1942113795296681985', 2, 'online表单加载,表名:test_order_product,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 32, NULL, '2025-07-07 14:49:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1942113795296681987', 2, 'online表单加载,表名:test_order_customer,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 13, NULL, '2025-07-07 14:49:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1942113795363790849', 2, 'online表单加载,表名:test_order_product,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 49, NULL, '2025-07-07 14:49:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1942113817589407746', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 53, NULL, '2025-07-07 14:49:52', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1942113821175537665', 2, 'online修改数据,表名:test_order_main,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"56870166aba54ebfacb20ba6c770bd73\\\",{\\\"order_code\\\":\\\"CN2024091019472568\\\",\\\"test_order_product\\\":[{\\\"descc\\\":\\\"\\\",\\\"jeecg_row_key\\\":\\\"1907442008848031746\\\",\\\"price\\\":1,\\\"order_fk_id\\\":\\\"1833472350097121281\\\",\\\"num\\\":22,\\\"pro_type\\\":\\\"1\\\",\\\"id\\\":\\\"1907442008848031746\\\",\\\"product_name\\\":\\\"1\\\"}],\\\"order_date\\\":\\\"\\\",\\\"descc\\\":\\\"\\\",\\\"update_time\\\":\\\"2025-07-07 14:49:52\\\",\\\"xiala\\\":\\\"\\\",\\\"id\\\":\\\"1833472350097121281\\\",\\\"update_by\\\":\\\"admin\\\",\\\"test_order_customer\\\":\\\"\\\"}]', NULL, 103, NULL, '2025-07-07 14:49:52', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1942113847054393346', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.apache.shiro.web.servlet.ShiroHttpServletRequest@3f839c28', NULL, 36, NULL, '2025-07-07 14:49:59', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1942114018223939585', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.apache.shiro.web.servlet.ShiroHttpServletRequest@1a21184f', NULL, 4, NULL, '2025-07-07 14:50:39', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1942501194501095426', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-08 16:29:09', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1942501288818409473', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@1f99f8d4', NULL, 26, NULL, '2025-07-08 16:29:32', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1942501301120303105', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@5cd81cd1', NULL, 31, NULL, '2025-07-08 16:29:35', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1943500597856714754', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-11 10:40:26', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1943500676093067265', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 134, NULL, '2025-07-11 10:40:44', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1943500676231479298', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 160, NULL, '2025-07-11 10:40:44', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1943500676294393858', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 184, NULL, '2025-07-11 10:40:44', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1943500683525373954', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 39, NULL, '2025-07-11 10:40:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1943500687656763394', 2, 'online修改数据,表名:test_note,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"2\\\",\\\"begin_time\\\":\\\"\\\",\\\"sheng\\\":\\\"\\\",\\\"update_time\\\":\\\"2025-07-11 10:40:47\\\",\\\"jeecg_row_key\\\":\\\"1923203898831777793\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"\\\",\\\"name\\\":\\\"admin\\\",\\\"id\\\":\\\"1923203898831777793\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":10}]', NULL, 95, NULL, '2025-07-11 10:40:47', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1943500714349314050', 2, 'online新增数据,表名:test_note,添加成功!', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"create_by\\\":\\\"admin\\\",\\\"sys_org_code\\\":\\\"A01\\\",\\\"create_time\\\":\\\"2025-07-11 10:40:53\\\",\\\"name\\\":\\\"ceshi\\\",\\\"id\\\":\\\"1943500714139598850\\\",\\\"age\\\":11},null]', NULL, 50, NULL, '2025-07-11 10:40:53', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1943500842774802434', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 265, NULL, '2025-07-11 10:41:24', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1943500846713253889', 2, 'online修改数据,表名:test_note,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"\\\",\\\"begin_time\\\":\\\"\\\",\\\"sheng\\\":\\\"\\\",\\\"update_time\\\":\\\"2025-07-11 10:41:24\\\",\\\"jeecg_row_key\\\":\\\"1943500714139598850\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"\\\",\\\"name\\\":\\\"ceshi\\\",\\\"id\\\":\\\"1943500714139598850\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":11}]', NULL, 129, NULL, '2025-07-11 10:41:25', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1948587896043438082', 4, 'org.springframework.web.HttpMediaTypeNotSupportedException:Content type \\'application/x-www-form-urlencoded;charset=UTF-8\\' not supported', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/sys/login', 'org.springframework.web.HttpMediaTypeNotSupportedException: Content type \\'application/x-www-form-urlencoded;charset=UTF-8\\' not supported\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:211)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:160)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:133)\\r\\n\tat org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:179)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:146)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:517)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-07-25 11:35:32', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1948591060104732674', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-25 11:48:06', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1948595457190780929', 4, 'org.springframework.http.converter.HttpMessageNotReadableException:JSON parse error: Unexpected character (\\'}\\' (code 125)): was expecting double-quote to start field name; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character (\\'}\\' (code 125)): was expecting double-quote to start field name\\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 5, column: 2]', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/sys/login', 'org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected character (\\'}\\' (code 125)): was expecting double-quote to start field name; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character (\\'}\\' (code 125)): was expecting double-quote to start field name\\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 5, column: 2]\\r\\n\tat org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:391)\\r\\n\tat org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:343)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:185)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:160)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:133)\\r\\n\tat org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:179)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:146)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:517)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character (\\'}\\' (code 125)): was expecting double-quote to start field name\\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 5, column: 2]\\r\\n\tat com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:2391)\\r\\n\tat com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:735)\\r\\n\tat com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:659)\\r\\n\tat com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleOddName(UTF8StreamJsonParser.java:2096)\\r\\n\tat com.fasterxml.jackson.core.json.UTF8StreamJsonParser._parseName(UTF8StreamJsonParser.java:1746)\\r\\n\tat com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextFieldName(UTF8StreamJsonParser.java:1075)\\r\\n\tat com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:321)\\r\\n\tat com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177)\\r\\n\tat com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)\\r\\n\tat com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4674)\\r\\n\tat com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3682)\\r\\n\tat org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:380)\\r\\n\t... 101 more\\r\\n', NULL, NULL, NULL, '2025-07-25 12:05:35', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1948595510504579074', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-25 12:05:48', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1948595519039987713', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-25 12:05:50', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1948611897717374977', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-25 13:10:55', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1948612021831024641', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-25 13:11:24', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1948612052399112193', 1, '用户登录失败，用户不存在！', NULL, NULL, NULL, '192.168.1.2', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-25 13:11:31', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1948612337884426242', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-25 13:12:39', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1948613127952883714', 1, '用户登录失败，用户不存在！', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-25 13:15:48', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1949745824040878081', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-28 16:16:44', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950043982499377153', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-29 12:01:30', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950044048144429057', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 76, NULL, '2025-07-29 12:01:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950044048203149314', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 84, NULL, '2025-07-29 12:01:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950044048203149315', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 54, NULL, '2025-07-29 12:01:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950044059880091649', 4, 'org.springframework.web.util.NestedServletException:Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: \\'net.sf.jsqlparser.statement.select.SelectBody net.sf.jsqlparser.statement.select.Select.getSelectBody()\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1753761708490&pageNo=1&pageSize=10&onlRepUrlParamStr=', '/jeecg-boot/online/cgreport/api/getColumnsAndData/1260179852088135681', 'org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: \\'net.sf.jsqlparser.statement.select.SelectBody net.sf.jsqlparser.statement.select.Select.getSelectBody()\\'\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1087)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.lang.NoSuchMethodError: \\'net.sf.jsqlparser.statement.select.SelectBody net.sf.jsqlparser.statement.select.Select.getSelectBody()\\'\\r\\n\tat org.jeecg.modules.online.config.b.a.getQueryTableInfo(OnlReportQueryBlackListHandler.java:84)\\r\\n\tat org.jeecg.common.util.security.AbstractQueryBlackListHandler.isPass(AbstractQueryBlackListHandler.java:58)\\r\\n\tat org.jeecg.modules.online.cgreport.service.a.b.executeSelectSqlRoute(OnlCgreportAPIService.java:90)\\r\\n\tat org.jeecg.modules.online.cgreport.service.a.b.getData(OnlCgreportAPIService.java:80)\\r\\n\tat org.jeecg.modules.online.cgreport.service.a.b.getDataById(OnlCgreportAPIService.java:54)\\r\\n\tat org.jeecg.modules.online.cgreport.a.a.b(OnlCgreportAPI.java:214)\\r\\n\tat org.jeecg.modules.online.cgreport.a.a.a(OnlCgreportAPI.java:95)\\r\\n\tat org.jeecg.modules.online.cgreport.a.a$$FastClassBySpringCGLIB$$a976ee88.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor216.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.online.cgreport.a.a$$EnhancerBySpringCGLIB$$7d02b6cb.a(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\t... 89 more\\r\\n', NULL, NULL, NULL, '2025-07-29 12:01:49', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950072851029708802', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 24, NULL, '2025-07-29 13:56:13', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950072851029708803', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 17, NULL, '2025-07-29 13:56:13', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950072851260395521', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 69, NULL, '2025-07-29 13:56:13', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950072854829748226', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 7, NULL, '2025-07-29 13:56:14', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950072854829748225', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 7, NULL, '2025-07-29 13:56:14', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950072854972354562', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 40, NULL, '2025-07-29 13:56:14', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950072861175730178', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 20, NULL, '2025-07-29 13:56:15', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950072866317946882', 2, 'online修改数据,表名:test_note,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"\\\",\\\"begin_time\\\":\\\"\\\",\\\"sheng\\\":\\\"\\\",\\\"update_time\\\":\\\"2025-07-29 13:56:16\\\",\\\"jeecg_row_key\\\":\\\"1943500714139598850\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"\\\",\\\"name\\\":\\\"ceshi\\\",\\\"id\\\":\\\"1943500714139598850\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":11}]', NULL, 44, NULL, '2025-07-29 13:56:17', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950072888837165058', 4, 'org.springframework.web.util.NestedServletException:Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: \\'net.sf.jsqlparser.statement.select.SelectBody net.sf.jsqlparser.statement.select.Select.getSelectBody()\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1753768581809&pageNo=1&pageSize=10&onlRepUrlParamStr=', '/jeecg-boot/online/cgreport/api/getColumnsAndData/1260179852088135681', 'org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: \\'net.sf.jsqlparser.statement.select.SelectBody net.sf.jsqlparser.statement.select.Select.getSelectBody()\\'\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1087)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.lang.NoSuchMethodError: \\'net.sf.jsqlparser.statement.select.SelectBody net.sf.jsqlparser.statement.select.Select.getSelectBody()\\'\\r\\n\tat org.jeecg.modules.online.config.b.a.getQueryTableInfo(OnlReportQueryBlackListHandler.java:84)\\r\\n\tat org.jeecg.common.util.security.AbstractQueryBlackListHandler.isPass(AbstractQueryBlackListHandler.java:58)\\r\\n\tat org.jeecg.modules.online.cgreport.service.a.b.executeSelectSqlRoute(OnlCgreportAPIService.java:90)\\r\\n\tat org.jeecg.modules.online.cgreport.service.a.b.getData(OnlCgreportAPIService.java:80)\\r\\n\tat org.jeecg.modules.online.cgreport.service.a.b.getDataById(OnlCgreportAPIService.java:54)\\r\\n\tat org.jeecg.modules.online.cgreport.a.a.b(OnlCgreportAPI.java:214)\\r\\n\tat org.jeecg.modules.online.cgreport.a.a.a(OnlCgreportAPI.java:95)\\r\\n\tat org.jeecg.modules.online.cgreport.a.a$$FastClassBySpringCGLIB$$a976ee88.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor261.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.online.cgreport.a.a$$EnhancerBySpringCGLIB$$68d8975c.a(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\t... 89 more\\r\\n', NULL, NULL, NULL, '2025-07-29 13:56:22', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950073235081146370', 4, 'org.springframework.web.util.NestedServletException:Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: \\'net.sf.jsqlparser.statement.select.SelectBody net.sf.jsqlparser.statement.select.Select.getSelectBody()\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1753768664439&pageNo=1&pageSize=10&onlRepUrlParamStr=', '/jeecg-boot/online/cgreport/api/getColumnsAndData/1260179852088135681', 'org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: \\'net.sf.jsqlparser.statement.select.SelectBody net.sf.jsqlparser.statement.select.Select.getSelectBody()\\'\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1087)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.lang.NoSuchMethodError: \\'net.sf.jsqlparser.statement.select.SelectBody net.sf.jsqlparser.statement.select.Select.getSelectBody()\\'\\r\\n\tat org.jeecg.modules.online.config.b.a.getQueryTableInfo(OnlReportQueryBlackListHandler.java:84)\\r\\n\tat org.jeecg.common.util.security.AbstractQueryBlackListHandler.isPass(AbstractQueryBlackListHandler.java:58)\\r\\n\tat org.jeecg.modules.online.cgreport.service.a.b.executeSelectSqlRoute(OnlCgreportAPIService.java:90)\\r\\n\tat org.jeecg.modules.online.cgreport.service.a.b.getData(OnlCgreportAPIService.java:80)\\r\\n\tat org.jeecg.modules.online.cgreport.service.a.b.getDataById(OnlCgreportAPIService.java:54)\\r\\n\tat org.jeecg.modules.online.cgreport.a.a.b(OnlCgreportAPI.java:214)\\r\\n\tat org.jeecg.modules.online.cgreport.a.a.a(OnlCgreportAPI.java:95)\\r\\n\tat org.jeecg.modules.online.cgreport.a.a$$FastClassBySpringCGLIB$$a976ee88.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.online.cgreport.a.a$$EnhancerBySpringCGLIB$$6229c29e.a(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\t... 89 more\\r\\n', NULL, NULL, NULL, '2025-07-29 13:57:45', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950132299840512001', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-29 17:52:27', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950132388835254275', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 23, NULL, '2025-07-29 17:52:48', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950132388835254274', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 23, NULL, '2025-07-29 17:52:48', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950132389162409986', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 94, NULL, '2025-07-29 17:52:48', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950132395164459009', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 22, NULL, '2025-07-29 17:52:49', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950132399341985794', 2, 'online修改数据,表名:test_note,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"\\\",\\\"begin_time\\\":\\\"\\\",\\\"sheng\\\":\\\"\\\",\\\"update_time\\\":\\\"2025-07-29 17:52:50\\\",\\\"jeecg_row_key\\\":\\\"1943500714139598850\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"\\\",\\\"name\\\":\\\"ceshi\\\",\\\"id\\\":\\\"1943500714139598850\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":11}]', NULL, 52, NULL, '2025-07-29 17:52:50', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950132405218205698', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 8, NULL, '2025-07-29 17:52:52', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950132464605356034', 2, 'online修改数据,表名:test_note,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"2025-07-29\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"1\\\",\\\"begin_time\\\":\\\"\\\",\\\"sheng\\\":\\\"140311\\\",\\\"update_time\\\":\\\"2025-07-29 17:53:05\\\",\\\"jeecg_row_key\\\":\\\"1943500714139598850\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"<p>经过上述讨论, 我们不得不面对一个非常尴尬的事实, 那就是, 这样看来, 一般来讲, 我们都必须务必慎重的考虑考虑. 就我个人来说, 随机一段废话对我的意义, 不能不说非常重大.&nbsp;<br>每个人都不得不面对这些问题. 在面对这种问题时, 随机一段废话, 发生了会如何, 不发生又会如何. 总结的来说,&nbsp;<br>这种事实对本人来说意义重大, 相信对这个世界也是有一定意义的.所谓随机一段废话, 关键是x需要</p>\\\",\\\"name\\\":\\\"zhangsan\\\",\\\"id\\\":\\\"1943500714139598850\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":0}]', NULL, 28, NULL, '2025-07-29 17:53:06', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950132474734600194', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 8, NULL, '2025-07-29 17:53:08', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950132496012304386', 2, 'online修改数据,表名:test_note,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"2025-07-29 00:00:00\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"1\\\",\\\"begin_time\\\":\\\"\\\",\\\"sheng\\\":\\\"140311\\\",\\\"update_time\\\":\\\"2025-07-29 17:53:13\\\",\\\"jeecg_row_key\\\":\\\"1943500714139598850\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"<p>经过上述讨论, 我们不得不面对一个非常尴尬的事实, 那就是, 这样看来, 一般来讲, 我们都必须务必慎重的考虑考虑. 就我个人来说, 随机一段废话对我的意义, 不能不说非常重大.&nbsp;<br>每个人都不得不面对这些问题. 在面对这种问题时, 随机一段废话, 发生了会如何, 不发生又会如何. 总结的来说,&nbsp;<br>这种事实对本人来说意义重大, 相信对这个世界也是有一定意义的.所谓随机一段废话, 关键是x需要</p>\\\",\\\"name\\\":\\\"admin\\\",\\\"id\\\":\\\"1943500714139598850\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":0}]', NULL, 42, NULL, '2025-07-29 17:53:13', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950132812996829186', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.d()', NULL, '', NULL, 21, NULL, '2025-07-29 17:54:29', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950141356026519553', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 38, NULL, '2025-07-29 18:28:26', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950141356026519554', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 47, NULL, '2025-07-29 18:28:26', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950141356026519555', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 47, NULL, '2025-07-29 18:28:26', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950141450008289282', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 5, NULL, '2025-07-29 18:28:48', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950141450008289283', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 4, NULL, '2025-07-29 18:28:48', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950141450071203842', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 20, NULL, '2025-07-29 18:28:48', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950141535152660481', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 4, NULL, '2025-07-29 18:29:09', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950141535152660482', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 4, NULL, '2025-07-29 18:29:09', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950141535219769346', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 16, NULL, '2025-07-29 18:29:09', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950369627464929281', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-30 09:35:30', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950375700016107521', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 84, NULL, '2025-07-30 09:59:38', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950375700016107522', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 99, NULL, '2025-07-30 09:59:38', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950375700016107523', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 102, NULL, '2025-07-30 09:59:38', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950375707335168001', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 16, NULL, '2025-07-30 09:59:40', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950375732366774273', 2, 'online列表加载,表名:test_order_main,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.d()', NULL, '', NULL, 72, NULL, '2025-07-30 09:59:45', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950375732500992001', 2, 'online表单加载,表名:test_order_main,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 84, NULL, '2025-07-30 09:59:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950375732500992002', 2, 'online表单加载,表名:test_order_main,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 79, NULL, '2025-07-30 09:59:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950375732886867970', 2, 'online表单加载,表名:test_order_customer,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 27, NULL, '2025-07-30 09:59:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950375732886867971', 2, 'online表单加载,表名:test_order_product,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 31, NULL, '2025-07-30 09:59:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950375732949782530', 2, 'online表单加载,表名:test_order_product,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 37, NULL, '2025-07-30 09:59:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950375732949782531', 2, 'online表单加载,表名:test_order_customer,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 33, NULL, '2025-07-30 09:59:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950375748888137729', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 9, NULL, '2025-07-30 09:59:49', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950375805024702466', 2, 'online修改数据,表名:test_order_product,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"deea5a8ec619460c9245ba85dbc59e80\\\",{\\\"descc\\\":\\\"\\\",\\\"update_time\\\":\\\"2025-07-30 10:00:02\\\",\\\"price\\\":3000,\\\"order_fk_id\\\":\\\"1683074969561157634\\\",\\\"num\\\":10,\\\"pro_type\\\":\\\"1\\\",\\\"id\\\":\\\"1732300515406647298\\\",\\\"update_by\\\":\\\"admin\\\",\\\"product_name\\\":\\\"苹果手机\\\"}]', NULL, 70, NULL, '2025-07-30 10:00:03', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950375840416239618', 2, 'online删除数据,表名:test_order_customer,删除成功!', 4, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.h()', NULL, '', NULL, 48, NULL, '2025-07-30 10:00:11', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950375846292459522', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 9, NULL, '2025-07-30 10:00:13', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950375846292459523', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 9, NULL, '2025-07-30 10:00:13', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950375846292459524', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 17, NULL, '2025-07-30 10:00:13', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950435316687654913', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-30 13:56:31', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950435317539098625', 4, 'org.springframework.jdbc.BadSqlGrammarException:\\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'relation_type\\' in \\'field list\\'\\r\\n### The error may exist in org/jeecg/modules/system/mapper/SysRoleIndexMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, role_code, url, component, is_route AS route, priority, status, create_by, create_time, update_by, update_time, sys_org_code, relation_type FROM sys_role_index WHERE (status = ? AND relation_type = ? AND role_code = ?) ORDER BY priority ASC\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'relation_type\\' in \\'field list\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'relation_type\\' in \\'field list\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1753854991522', '/jeecg-boot/sys/user/getUserInfo', 'org.springframework.jdbc.BadSqlGrammarException: \\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'relation_type\\' in \\'field list\\'\\r\\n### The error may exist in org/jeecg/modules/system/mapper/SysRoleIndexMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, role_code, url, component, is_route AS route, priority, status, create_by, create_time, update_by, update_time, sys_org_code, relation_type FROM sys_role_index WHERE (status = ? AND relation_type = ? AND role_code = ?) ORDER BY priority ASC\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'relation_type\\' in \\'field list\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'relation_type\\' in \\'field list\\'\\r\\n\tat org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:236)\\r\\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)\\r\\n\tat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy175.selectList(Unknown Source)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:166)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy220.selectList(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.service.IService.list(IService.java:406)\\r\\n\tat com.baomidou.mybatisplus.extension.service.IService$$FastClassBySpringCGLIB$$f8525d18.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)\\r\\n\tat org.jeecg.modules.system.service.impl.SysRoleIndexServiceImpl$$EnhancerBySpringCGLIB$$16d67d82.list(<generated>)\\r\\n\tat org.jeecg.modules.system.service.impl.SysUserServiceImpl.getDynamicIndexByUserRole(SysUserServiceImpl.java:370)\\r\\n\tat org.jeecg.modules.system.service.impl.SysUserServiceImpl$$FastClassBySpringCGLIB$$5195d464.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.system.service.impl.SysUserServiceImpl$$EnhancerBySpringCGLIB$$62f902c2.getDynamicIndexByUserRole(<generated>)\\r\\n\tat org.jeecg.modules.system.controller.LoginController.getUserInfo(LoginController.java:155)\\r\\n\tat org.jeecg.modules.system.controller.LoginController$$FastClassBySpringCGLIB$$b307ab61.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.system.controller.LoginController$$EnhancerBySpringCGLIB$$531403f8.getUserInfo(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.sql.SQLSyntaxErrorException: Unknown column \\'relation_type\\' in \\'field list\\'\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:371)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3462)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:688)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:158)\\r\\n\tat com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\\r\\n\tat org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\\r\\n\tat org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy464.query(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:333)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\\r\\n\tat org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy463.query(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy463.query(Unknown Source)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\\r\\n\t... 147 more\\r\\n', NULL, NULL, NULL, '2025-07-30 13:56:32', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950438485442326529', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-30 14:09:07', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950455763189788674', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@445d6e82', NULL, 31, NULL, '2025-07-30 15:17:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950455813743734786', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 99999  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@63c16987', NULL, 6, NULL, '2025-07-30 15:17:58', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950456958566428674', 2, '编辑用户，username： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-30 15:22:31', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950457002786975745', 2, '编辑用户，username： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-30 15:22:42', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950471941748137985', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-30 16:22:04', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950472019166601217', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 68, NULL, '2025-07-30 16:22:22', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950472019174989826', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 72, NULL, '2025-07-30 16:22:22', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950472019174989827', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 67, NULL, '2025-07-30 16:22:22', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950472237262020609', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.apache.shiro.web.servlet.ShiroHttpServletRequest@595412a3', NULL, 16, NULL, '2025-07-30 16:23:14', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950472266450182146', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.apache.shiro.web.servlet.ShiroHttpServletRequest@41a5af12', NULL, 4, NULL, '2025-07-30 16:23:21', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950480061362843650', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.apache.shiro.web.servlet.ShiroHttpServletRequest@69203563', NULL, 86, NULL, '2025-07-30 16:54:19', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950480166677622785', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@688cceb5', NULL, 31, NULL, '2025-07-30 16:54:45', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950480185115783169', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@b67d40', NULL, 4, NULL, '2025-07-30 16:54:49', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950480186747367425', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.apache.shiro.web.servlet.ShiroHttpServletRequest@64b3d4a6', NULL, 4, NULL, '2025-07-30 16:54:49', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950486712065175554', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-30 17:20:45', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950486775667601410', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 99999  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@80e8d78', NULL, 23, NULL, '2025-07-30 17:21:00', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950486792776167426', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@54aa479c', NULL, 13, NULL, '2025-07-30 17:21:04', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950486801349324801', 2, '角色首页配置-编辑', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.edit()', NULL, '[{\\\"component\\\":\\\"dashboard/Analysis\\\",\\\"id\\\":\\\"1803082647166652418\\\",\\\"priority\\\":0,\\\"relationType\\\":\\\"ROLE\\\",\\\"roleCode\\\":\\\"DEF_INDEX_ALL\\\",\\\"route\\\":true,\\\"status\\\":\\\"1\\\",\\\"updateBy\\\":\\\"admin\\\",\\\"updateTime\\\":\\\"2025-07-30 17:21:06\\\",\\\"url\\\":\\\"/dashboard/analysis\\\"},null]', NULL, 25, NULL, '2025-07-30 17:21:06', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950486801542262785', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@107602ea', NULL, 6, NULL, '2025-07-30 17:21:06', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950486833096011778', 2, '角色首页配置-添加', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.add()', NULL, '[{\\\"component\\\":\\\"5\\\",\\\"createBy\\\":\\\"admin\\\",\\\"createTime\\\":\\\"2025-07-30 17:21:13\\\",\\\"id\\\":\\\"1950486833033097217\\\",\\\"relationType\\\":\\\"ROLE\\\",\\\"roleCode\\\":\\\"dbadeveloper\\\",\\\"route\\\":true,\\\"status\\\":\\\"1\\\",\\\"sysOrgCode\\\":\\\"A01\\\",\\\"url\\\":\\\"5\\\"},null]', NULL, 27, NULL, '2025-07-30 17:21:14', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950486833360252930', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@35fba9d4', NULL, 5, NULL, '2025-07-30 17:21:14', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950487094870913026', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-30 17:22:16', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950487484072964097', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-30 17:23:49', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950487545708261378', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-30 17:24:04', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950487621990068226', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@7af385a5', NULL, 5, NULL, '2025-07-30 17:24:22', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950487632840732674', 2, '角色首页配置-通过id删除', 4, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.delete()', NULL, '  id: 1950486833033097217', NULL, 17, NULL, '2025-07-30 17:24:25', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950487633025282050', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@1aabb57f', NULL, 4, NULL, '2025-07-30 17:24:25', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950488771246141442', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@598a5004', NULL, 5, NULL, '2025-07-30 17:28:56', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950490103017353217', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 99999  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@61d6ca2d', NULL, 5, NULL, '2025-07-30 17:34:14', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950761025834029057', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-31 11:30:47', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950761127260688386', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-31 11:31:11', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950761152497815556', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-07-31 11:31:17', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1950801649433997315', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 61, NULL, '2025-07-31 14:12:12', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950801649433997314', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 53, NULL, '2025-07-31 14:12:12', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950801649433997313', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 56, NULL, '2025-07-31 14:12:12', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950801666513203202', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 17, NULL, '2025-07-31 14:12:16', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950801666647420929', 2, 'online修改数据,修改失败，待编辑数据不存在', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{}]', NULL, 26, NULL, '2025-07-31 14:12:16', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950801684016033793', 2, 'online修改数据,表名:test_note,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"2025-07-29 00:00:00\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"1\\\",\\\"begin_time\\\":\\\"\\\",\\\"sheng\\\":\\\"140311\\\",\\\"update_time\\\":\\\"2025-07-31 14:12:20\\\",\\\"jeecg_row_key\\\":\\\"1943500714139598850\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"<p>经过上述讨论, 我们不得不面对一个非常尴尬的事实, 那就是, 这样看来, 一般来讲, 我们都必须务必慎重的考虑考虑. 就我个人来说, 随机一段废话对我的意义, 不能不说非常重大.&nbsp;<br>每个人都不得不面对这些问题. 在面对这种问题时, 随机一段废话, 发生了会如何, 不发生又会如何. 总结的来说,&nbsp;<br>这种事实对本人来说意义重大, 相信对这个世界也是有一定意义的.所谓随机一段废话, 关键是x需要</p>\\\",\\\"name\\\":\\\"admin\\\",\\\"id\\\":\\\"1943500714139598850\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":1212}]', NULL, 61, NULL, '2025-07-31 14:12:20', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950801691972628482', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 6, NULL, '2025-07-31 14:12:22', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1950801716647718914', 2, 'online修改数据,表名:test_note,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"2\\\",\\\"begin_time\\\":\\\"\\\",\\\"sheng\\\":\\\"\\\",\\\"update_time\\\":\\\"2025-07-31 14:12:28\\\",\\\"jeecg_row_key\\\":\\\"1923203898831777793\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"\\\",\\\"name\\\":\\\"jeecg\\\",\\\"id\\\":\\\"1923203898831777793\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":10}]', NULL, 51, NULL, '2025-07-31 14:12:28', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1952300858440118273', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-04 17:29:31', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1952300961901015042', 2, '多数据源管理-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysDataSourceController.queryPageList()', NULL, '  sysDataSource: SysDataSource(id=null, code=null, name=null, remark=null, dbType=null, dbDriver=null, dbUrl=null, dbName=null, dbUsername=null, dbPassword=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@540e29e9', NULL, 72, NULL, '2025-08-04 17:29:56', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1952300969991827457', 2, '多数据源管理-通过id查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysDataSourceController.queryById()', NULL, '  id: 1209779538310004737', NULL, 644, NULL, '2025-08-04 17:29:58', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1952301100451459074', 2, '多数据源管理-编辑', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysDataSourceController.edit()', NULL, '[{\\\"code\\\":\\\"local_mysql\\\",\\\"dbDriver\\\":\\\"com.microsoft.sqlserver.jdbc.SQLServerDriver\\\",\\\"dbPassword\\\":\\\"ba0caf0dfaee709be85a8f2e37170eaf\\\",\\\"dbType\\\":\\\"3\\\",\\\"dbUrl\\\":\\\"jdbc:sqlserver://nj-mssql-73sa37qf.sql.tencentcdb.com:29345;SelectMethod=cursor;DatabaseName=jeecgboot\\\",\\\"dbUsername\\\":\\\"jeecg\\\",\\\"id\\\":\\\"1209779538310004737\\\",\\\"name\\\":\\\"本地测试库\\\",\\\"remark\\\":\\\"本地数据库MySQL5.7\\\",\\\"updateBy\\\":\\\"admin\\\",\\\"updateTime\\\":\\\"2025-08-04 17:30:28\\\"}]', NULL, 40, NULL, '2025-08-04 17:30:29', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1952301100707311618', 2, '多数据源管理-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysDataSourceController.queryPageList()', NULL, '  sysDataSource: SysDataSource(id=null, code=null, name=null, remark=null, dbType=null, dbDriver=null, dbUrl=null, dbName=null, dbUsername=null, dbPassword=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@7153c6ed', NULL, 11, NULL, '2025-08-04 17:30:29', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1953368285714288641', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-07 16:11:06', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1953383233613873153', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-07 17:10:30', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1953387465188458497', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '192.168.1.2', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-07 17:27:19', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1953387670868738050', 2, '职务表-分页列表查询', 1, 'admin', 'admin', '192.168.1.2', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@729dfea4', NULL, 79, NULL, '2025-08-07 17:28:08', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1953388627111399426', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-07 17:31:56', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1953389315807674369', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-07 17:34:40', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1953395964635238401', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '192.168.1.2', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-07 18:01:05', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1953758167871762434', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-08 18:00:21', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954808362441068545', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-11 15:33:27', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954808708567617538', 2, '角色首页配置-分页列表查询', 1, 'admin', 'admin', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@71b516b5', NULL, 159, NULL, '2025-08-11 15:34:49', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1954808726808645634', 2, '角色首页配置-通过id删除', 4, 'admin', 'admin', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.delete()', NULL, '  id: 1549658299929718786', NULL, 0, NULL, '2025-08-11 15:34:54', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1954808727039332353', 2, '角色首页配置-分页列表查询', 1, 'admin', 'admin', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@62c90e4c', NULL, 6, NULL, '2025-08-11 15:34:54', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1954808745389412353', 2, '角色首页配置-编辑', 3, 'admin', 'admin', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.edit()', NULL, '[{\\\"component\\\":\\\"dashboard/Analysis\\\",\\\"id\\\":\\\"1803082647166652418\\\",\\\"priority\\\":0,\\\"relationType\\\":\\\"ROLE\\\",\\\"roleCode\\\":\\\"DEF_INDEX_ALL\\\",\\\"route\\\":true,\\\"status\\\":\\\"0\\\",\\\"updateBy\\\":\\\"admin\\\",\\\"updateTime\\\":\\\"2025-08-11 15:34:58\\\",\\\"url\\\":\\\"/dashboard/analysis\\\"},null]', NULL, 25, NULL, '2025-08-11 15:34:58', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1954808745620099073', 2, '角色首页配置-分页列表查询', 1, 'admin', 'admin', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@790021cc', NULL, 5, NULL, '2025-08-11 15:34:58', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1954808757267681281', 2, '角色首页配置-分页列表查询', 1, 'admin', 'admin', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@6280154b', NULL, 8, NULL, '2025-08-11 15:35:01', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1954808873269547010', 2, '角色首页配置-分页列表查询', 1, 'admin', 'admin', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@7dc7f476', NULL, 5, NULL, '2025-08-11 15:35:29', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1954808905477607426', 1, '用户名: admin,退出成功！', NULL, 'admin', 'admin', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-11 15:35:36', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954808919985704962', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-11 15:35:40', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954808926189080577', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@5dac87a8', NULL, 11, NULL, '2025-08-11 15:35:41', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1954810564836474881', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@596db34c', NULL, 71, NULL, '2025-08-11 15:42:12', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1954814702085353473', 4, 'java.lang.NullPointerException:Cannot load from object array because the return value of \\\"java.util.Map.get(Object)\\\" is null', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1754899083107&pageNo=1&pageSize=10', '/jeecg-boot/test/jeecgDemo/list', 'java.lang.NullPointerException: Cannot load from object array because the return value of \\\"java.util.Map.get(Object)\\\" is null\\r\\n\tat org.jeecg.common.system.query.QueryGenerator.doMultiFieldsOrder(QueryGenerator.java:264)\\r\\n\tat org.jeecg.common.system.query.QueryGenerator.installMplus(QueryGenerator.java:216)\\r\\n\tat org.jeecg.common.system.query.QueryGenerator.initQueryWrapper(QueryGenerator.java:95)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController.list(JeecgDemoController.java:70)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$FastClassBySpringCGLIB$$e868411d.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$EnhancerBySpringCGLIB$$c1fa0b86.list(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1423)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-08-11 15:58:38', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954814814123589634', 4, 'java.lang.NullPointerException:Cannot load from object array because the return value of \\\"java.util.Map.get(Object)\\\" is null', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1754899144562&pageNo=1&pageSize=10', '/jeecg-boot/test/jeecgDemo/list', 'java.lang.NullPointerException: Cannot load from object array because the return value of \\\"java.util.Map.get(Object)\\\" is null\\r\\n\tat org.jeecg.common.system.query.QueryGenerator.doMultiFieldsOrder(QueryGenerator.java:264)\\r\\n\tat org.jeecg.common.system.query.QueryGenerator.installMplus(QueryGenerator.java:216)\\r\\n\tat org.jeecg.common.system.query.QueryGenerator.initQueryWrapper(QueryGenerator.java:95)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController.list(JeecgDemoController.java:70)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$FastClassBySpringCGLIB$$e868411d.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$EnhancerBySpringCGLIB$$231da2f4.list(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1423)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-08-11 15:59:05', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954816771479556097', 4, 'org.springframework.jdbc.BadSqlGrammarException:\\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name ASC, salaryMoney ASC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'sortInfoString=[{\\\"column\\\":\\\"name\\\",\\\"order\\\":\\\"asc\\\"},{\\\"column\\\":\\\"salaryMoney\\\",\\\"order\\\":\\\"asc\\\"}]&_t=1754899611506&pageNo=1&pageSize=10', '/jeecg-boot/test/jeecgDemo/list', 'org.springframework.jdbc.BadSqlGrammarException: \\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name ASC, salaryMoney ASC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:236)\\r\\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)\\r\\n\tat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy175.selectList(Unknown Source)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectList(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:458)\\r\\n\tat java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:182)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectPage(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository.page(IRepository.java:342)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository$$FastClassBySpringCGLIB$$badc8562.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)\\r\\n\tat org.jeecg.modules.demo.test.service.impl.JeecgDemoServiceImpl$$EnhancerBySpringCGLIB$$4079f23e.page(<generated>)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController.list(JeecgDemoController.java:74)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$FastClassBySpringCGLIB$$e868411d.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$EnhancerBySpringCGLIB$$d2a2d124.list(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:371)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3462)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:688)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:158)\\r\\n\tat com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)\\r\\n\tat jdk.proxy3/jdk.proxy3.$Proxy532.execute(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\\r\\n\tat org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy530.query(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\\r\\n\tat org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\\r\\n\t... 152 more\\r\\n', NULL, NULL, NULL, '2025-08-11 16:06:52', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954816996671737857', 4, 'org.springframework.jdbc.BadSqlGrammarException:\\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name ASC, salaryMoney DESC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'sortInfoString=[{\\\"column\\\":\\\"name\\\",\\\"order\\\":\\\"asc\\\"},{\\\"column\\\":\\\"salaryMoney\\\",\\\"order\\\":\\\"desc\\\"}]&_t=1754899665348&pageNo=1&pageSize=10', '/jeecg-boot/test/jeecgDemo/list', 'org.springframework.jdbc.BadSqlGrammarException: \\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name ASC, salaryMoney DESC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:236)\\r\\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)\\r\\n\tat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy175.selectList(Unknown Source)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectList(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:458)\\r\\n\tat java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:182)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectPage(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository.page(IRepository.java:342)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository$$FastClassBySpringCGLIB$$badc8562.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)\\r\\n\tat org.jeecg.modules.demo.test.service.impl.JeecgDemoServiceImpl$$EnhancerBySpringCGLIB$$4079f23e.page(<generated>)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController.list(JeecgDemoController.java:74)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$FastClassBySpringCGLIB$$e868411d.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$EnhancerBySpringCGLIB$$d2a2d124.list(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:371)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3462)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:688)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:158)\\r\\n\tat com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)\\r\\n\tat jdk.proxy3/jdk.proxy3.$Proxy532.execute(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\\r\\n\tat org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy530.query(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\\r\\n\tat org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\\r\\n\t... 152 more\\r\\n', NULL, NULL, NULL, '2025-08-11 16:07:45', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954818514497966082', 4, 'java.lang.NullPointerException:Cannot invoke \\\"java.lang.CharSequence.length()\\\" because \\\"this.text\\\" is null', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1754900026685&pageNo=1&pageSize=10', '/jeecg-boot/test/jeecgDemo/list', 'java.lang.NullPointerException: Cannot invoke \\\"java.lang.CharSequence.length()\\\" because \\\"this.text\\\" is null\\r\\n\tat java.base/java.util.regex.Matcher.getTextLength(Matcher.java:1769)\\r\\n\tat java.base/java.util.regex.Matcher.reset(Matcher.java:415)\\r\\n\tat java.base/java.util.regex.Matcher.<init>(Matcher.java:252)\\r\\n\tat java.base/java.util.regex.Pattern.matcher(Pattern.java:1134)\\r\\n\tat com.baomidou.mybatisplus.core.toolkit.StringUtils.replaceAllBlank(StringUtils.java:628)\\r\\n\tat com.baomidou.mybatisplus.core.metadata.OrderItem.setColumn(OrderItem.java:68)\\r\\n\tat com.baomidou.mybatisplus.core.metadata.OrderItem.build(OrderItem.java:64)\\r\\n\tat com.baomidou.mybatisplus.core.metadata.OrderItem.asc(OrderItem.java:48)\\r\\n\tat org.jeecg.common.system.util.SqlConcatUtil.getQueryConditionOrders(SqlConcatUtil.java:263)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController.list(JeecgDemoController.java:78)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$FastClassBySpringCGLIB$$e868411d.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$EnhancerBySpringCGLIB$$893f7ea4.list(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1423)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-08-11 16:13:47', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954819613460164609', 4, 'org.springframework.jdbc.BadSqlGrammarException:\\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name ASC, salaryMoney ASC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'sortInfoString=[{\\\"column\\\":\\\"name\\\",\\\"order\\\":\\\"asc\\\"},{\\\"column\\\":\\\"salaryMoney\\\",\\\"order\\\":\\\"asc\\\"}]&_t=1754900279715&pageNo=1&pageSize=10', '/jeecg-boot/test/jeecgDemo/list', 'org.springframework.jdbc.BadSqlGrammarException: \\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name ASC, salaryMoney ASC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:236)\\r\\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)\\r\\n\tat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy175.selectList(Unknown Source)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectList(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:458)\\r\\n\tat java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:182)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectPage(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository.page(IRepository.java:342)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository$$FastClassBySpringCGLIB$$badc8562.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)\\r\\n\tat org.jeecg.modules.demo.test.service.impl.JeecgDemoServiceImpl$$EnhancerBySpringCGLIB$$902f5379.page(<generated>)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController.list(JeecgDemoController.java:84)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$FastClassBySpringCGLIB$$e868411d.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$EnhancerBySpringCGLIB$$ea83b976.list(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:371)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3462)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:688)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:158)\\r\\n\tat com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)\\r\\n\tat jdk.proxy3/jdk.proxy3.$Proxy532.execute(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\\r\\n\tat org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy530.query(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\\r\\n\tat org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\\r\\n\t... 152 more\\r\\n', NULL, NULL, NULL, '2025-08-11 16:18:09', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954820839660716033', 4, 'org.springframework.jdbc.BadSqlGrammarException:\\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name ASC, salaryMoney ASC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'sortInfoString=[{\\\"column\\\":\\\"name\\\",\\\"order\\\":\\\"asc\\\"},{\\\"column\\\":\\\"salaryMoney\\\",\\\"order\\\":\\\"asc\\\"}]&_t=1754900581489&pageNo=1&pageSize=10', '/jeecg-boot/test/jeecgDemo/list', 'org.springframework.jdbc.BadSqlGrammarException: \\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name ASC, salaryMoney ASC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:236)\\r\\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)\\r\\n\tat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy175.selectList(Unknown Source)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectList(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:458)\\r\\n\tat java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:182)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectPage(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository.page(IRepository.java:342)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository$$FastClassBySpringCGLIB$$badc8562.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)\\r\\n\tat org.jeecg.modules.demo.test.service.impl.JeecgDemoServiceImpl$$EnhancerBySpringCGLIB$$71ddaea6.page(<generated>)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController.list(JeecgDemoController.java:76)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$FastClassBySpringCGLIB$$e868411d.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$EnhancerBySpringCGLIB$$66d9107a.list(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:371)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3462)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:688)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:158)\\r\\n\tat com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)\\r\\n\tat jdk.proxy3/jdk.proxy3.$Proxy530.execute(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\\r\\n\tat org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy528.query(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\\r\\n\tat org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy527.query(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy527.query(Unknown Source)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\\r\\n\t... 152 more\\r\\n', NULL, NULL, NULL, '2025-08-11 16:23:02', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954821123602513921', 4, 'org.springframework.jdbc.BadSqlGrammarException:\\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name ASC, salaryMoney DESC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'sortInfoString=[{\\\"column\\\":\\\"name\\\",\\\"order\\\":\\\"asc\\\"},{\\\"column\\\":\\\"salaryMoney\\\",\\\"order\\\":\\\"desc\\\"}]&_t=1754900596267&pageNo=1&pageSize=10', '/jeecg-boot/test/jeecgDemo/list', 'org.springframework.jdbc.BadSqlGrammarException: \\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name ASC, salaryMoney DESC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:236)\\r\\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)\\r\\n\tat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy175.selectList(Unknown Source)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectList(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:458)\\r\\n\tat java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:182)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectPage(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository.page(IRepository.java:342)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository$$FastClassBySpringCGLIB$$badc8562.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)\\r\\n\tat org.jeecg.modules.demo.test.service.impl.JeecgDemoServiceImpl$$EnhancerBySpringCGLIB$$71ddaea6.page(<generated>)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController.list(JeecgDemoController.java:76)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$FastClassBySpringCGLIB$$e868411d.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$EnhancerBySpringCGLIB$$66d9107a.list(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:371)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3462)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:688)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:158)\\r\\n\tat com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor119.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)\\r\\n\tat jdk.proxy3/jdk.proxy3.$Proxy530.execute(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\\r\\n\tat org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor118.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy528.query(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\\r\\n\tat org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor115.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy527.query(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy527.query(Unknown Source)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\\r\\n\t... 152 more\\r\\n', NULL, NULL, NULL, '2025-08-11 16:24:09', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954822132898856961', 4, 'org.springframework.jdbc.BadSqlGrammarException:\\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY salaryMoney DESC, name DESC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'sortInfoString=[{\\\"column\\\":\\\"salaryMoney\\\",\\\"order\\\":\\\"desc\\\"},{\\\"column\\\":\\\"name\\\",\\\"order\\\":\\\"desc\\\"}]&_t=1754900723521&pageNo=1&pageSize=10', '/jeecg-boot/test/jeecgDemo/list', 'org.springframework.jdbc.BadSqlGrammarException: \\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY salaryMoney DESC, name DESC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:236)\\r\\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)\\r\\n\tat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy175.selectList(Unknown Source)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectList(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:458)\\r\\n\tat java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:182)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectPage(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository.page(IRepository.java:342)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository$$FastClassBySpringCGLIB$$badc8562.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)\\r\\n\tat org.jeecg.modules.demo.test.service.impl.JeecgDemoServiceImpl$$EnhancerBySpringCGLIB$$71ddaea6.page(<generated>)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController.list(JeecgDemoController.java:76)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$FastClassBySpringCGLIB$$e868411d.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$EnhancerBySpringCGLIB$$66d9107a.list(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:371)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3462)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:688)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:158)\\r\\n\tat com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor119.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)\\r\\n\tat jdk.proxy3/jdk.proxy3.$Proxy530.execute(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\\r\\n\tat org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor118.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy528.query(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\\r\\n\tat org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor115.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy527.query(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy527.query(Unknown Source)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor129.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\\r\\n\t... 152 more\\r\\n', NULL, NULL, NULL, '2025-08-11 16:28:10', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954825932099502082', 4, 'org.springframework.jdbc.BadSqlGrammarException:\\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name DESC, salaryMoney ASC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'sortInfoString=[{\\\"column\\\":\\\"name\\\",\\\"order\\\":\\\"desc\\\"},{\\\"column\\\":\\\"salaryMoney\\\",\\\"order\\\":\\\"asc\\\"}]&_t=1754901795647&pageNo=1&pageSize=10', '/jeecg-boot/test/jeecgDemo/list', 'org.springframework.jdbc.BadSqlGrammarException: \\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name DESC, salaryMoney ASC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:236)\\r\\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)\\r\\n\tat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy175.selectList(Unknown Source)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectList(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:458)\\r\\n\tat java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:182)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectPage(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository.page(IRepository.java:342)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository$$FastClassBySpringCGLIB$$badc8562.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)\\r\\n\tat org.jeecg.modules.demo.test.service.impl.JeecgDemoServiceImpl$$EnhancerBySpringCGLIB$$d318c8c6.page(<generated>)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController.list(JeecgDemoController.java:89)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$FastClassBySpringCGLIB$$e868411d.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$EnhancerBySpringCGLIB$$6c08de85.list(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:371)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3462)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:688)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:158)\\r\\n\tat com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)\\r\\n\tat jdk.proxy3/jdk.proxy3.$Proxy532.execute(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\\r\\n\tat org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy530.query(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\\r\\n\tat org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\\r\\n\t... 152 more\\r\\n', NULL, NULL, NULL, '2025-08-11 16:43:16', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954825943818387457', 4, 'org.springframework.jdbc.BadSqlGrammarException:\\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name DESC, salaryMoney DESC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'sortInfoString=[{\\\"column\\\":\\\"name\\\",\\\"order\\\":\\\"desc\\\"},{\\\"column\\\":\\\"salaryMoney\\\",\\\"order\\\":\\\"desc\\\"}]&_t=1754901798512&pageNo=1&pageSize=10', '/jeecg-boot/test/jeecgDemo/list', 'org.springframework.jdbc.BadSqlGrammarException: \\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name DESC, salaryMoney DESC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:236)\\r\\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)\\r\\n\tat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy175.selectList(Unknown Source)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectList(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:458)\\r\\n\tat java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:182)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectPage(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository.page(IRepository.java:342)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository$$FastClassBySpringCGLIB$$badc8562.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)\\r\\n\tat org.jeecg.modules.demo.test.service.impl.JeecgDemoServiceImpl$$EnhancerBySpringCGLIB$$d318c8c6.page(<generated>)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController.list(JeecgDemoController.java:89)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$FastClassBySpringCGLIB$$e868411d.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$EnhancerBySpringCGLIB$$6c08de85.list(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:371)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3462)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:688)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:158)\\r\\n\tat com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)\\r\\n\tat jdk.proxy3/jdk.proxy3.$Proxy532.execute(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\\r\\n\tat org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy530.query(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\\r\\n\tat org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\\r\\n\t... 152 more\\r\\n', NULL, NULL, NULL, '2025-08-11 16:43:19', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954826303593201666', 4, 'org.springframework.jdbc.BadSqlGrammarException:\\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name DESC, salaryMoney ASC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'sortInfoString=[{\\\"column\\\":\\\"name\\\",\\\"order\\\":\\\"desc\\\"},{\\\"column\\\":\\\"salaryMoney\\\",\\\"order\\\":\\\"asc\\\"}]&_t=1754901884298&pageNo=1&pageSize=10', '/jeecg-boot/test/jeecgDemo/list', 'org.springframework.jdbc.BadSqlGrammarException: \\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name DESC, salaryMoney ASC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:236)\\r\\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)\\r\\n\tat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy175.selectList(Unknown Source)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectList(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:458)\\r\\n\tat java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:182)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectPage(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository.page(IRepository.java:342)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository$$FastClassBySpringCGLIB$$badc8562.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)\\r\\n\tat org.jeecg.modules.demo.test.service.impl.JeecgDemoServiceImpl$$EnhancerBySpringCGLIB$$d318c8c6.page(<generated>)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController.list(JeecgDemoController.java:89)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$FastClassBySpringCGLIB$$e868411d.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$EnhancerBySpringCGLIB$$6c08de85.list(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:371)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3462)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:688)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:158)\\r\\n\tat com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor94.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)\\r\\n\tat jdk.proxy3/jdk.proxy3.$Proxy532.execute(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\\r\\n\tat org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy530.query(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\\r\\n\tat org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\\r\\n\t... 152 more\\r\\n', NULL, NULL, NULL, '2025-08-11 16:44:44', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954826401253376001', 4, 'org.springframework.jdbc.BadSqlGrammarException:\\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY salaryMoney ASC, name ASC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'sortInfoString=[{\\\"column\\\":\\\"salaryMoney\\\",\\\"order\\\":\\\"asc\\\"},{\\\"column\\\":\\\"name\\\",\\\"order\\\":\\\"asc\\\"}]&_t=1754901907595&pageNo=1&pageSize=10', '/jeecg-boot/test/jeecgDemo/list', 'org.springframework.jdbc.BadSqlGrammarException: \\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY salaryMoney ASC, name ASC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:236)\\r\\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)\\r\\n\tat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy175.selectList(Unknown Source)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectList(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:458)\\r\\n\tat java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:182)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectPage(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository.page(IRepository.java:342)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository$$FastClassBySpringCGLIB$$badc8562.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)\\r\\n\tat org.jeecg.modules.demo.test.service.impl.JeecgDemoServiceImpl$$EnhancerBySpringCGLIB$$d318c8c6.page(<generated>)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController.list(JeecgDemoController.java:89)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$FastClassBySpringCGLIB$$e868411d.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$EnhancerBySpringCGLIB$$6c08de85.list(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:371)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3462)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:688)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:158)\\r\\n\tat com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor94.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)\\r\\n\tat jdk.proxy3/jdk.proxy3.$Proxy532.execute(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\\r\\n\tat org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor98.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy530.query(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\\r\\n\tat org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor97.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\\r\\n\t... 152 more\\r\\n', NULL, NULL, NULL, '2025-08-11 16:45:08', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954826667285495809', 4, 'org.springframework.jdbc.BadSqlGrammarException:\\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY salaryMoney ASC, name DESC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'sortInfoString=[{\\\"column\\\":\\\"salaryMoney\\\",\\\"order\\\":\\\"asc\\\"},{\\\"column\\\":\\\"name\\\",\\\"order\\\":\\\"desc\\\"}]&_t=1754901971019&pageNo=1&pageSize=10', '/jeecg-boot/test/jeecgDemo/list', 'org.springframework.jdbc.BadSqlGrammarException: \\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY salaryMoney ASC, name DESC, create_time DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:236)\\r\\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)\\r\\n\tat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy175.selectList(Unknown Source)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectList(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:458)\\r\\n\tat java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:182)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectPage(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository.page(IRepository.java:342)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository$$FastClassBySpringCGLIB$$badc8562.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)\\r\\n\tat org.jeecg.modules.demo.test.service.impl.JeecgDemoServiceImpl$$EnhancerBySpringCGLIB$$d318c8c6.page(<generated>)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController.list(JeecgDemoController.java:89)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$FastClassBySpringCGLIB$$e868411d.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$EnhancerBySpringCGLIB$$6c08de85.list(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:371)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3462)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:688)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:158)\\r\\n\tat com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor94.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)\\r\\n\tat jdk.proxy3/jdk.proxy3.$Proxy532.execute(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\\r\\n\tat org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor98.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy530.query(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\\r\\n\tat org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor97.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\\r\\n\t... 152 more\\r\\n', NULL, NULL, NULL, '2025-08-11 16:46:11', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954827856634961922', 4, 'org.springframework.jdbc.BadSqlGrammarException:\\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name ASC, salaryMoney ASC, name ASC, salaryMoney ASC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'sortInfoString=[{\\\"column\\\":\\\"name\\\",\\\"order\\\":\\\"asc\\\"},{\\\"column\\\":\\\"salaryMoney\\\",\\\"order\\\":\\\"asc\\\"}]&_t=1754902254490&pageNo=1&pageSize=10', '/jeecg-boot/test/jeecgDemo/list', 'org.springframework.jdbc.BadSqlGrammarException: \\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name ASC, salaryMoney ASC, name ASC, salaryMoney ASC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:236)\\r\\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)\\r\\n\tat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy175.selectList(Unknown Source)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectList(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:458)\\r\\n\tat java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:182)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectPage(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository.page(IRepository.java:342)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository$$FastClassBySpringCGLIB$$badc8562.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)\\r\\n\tat org.jeecg.modules.demo.test.service.impl.JeecgDemoServiceImpl$$EnhancerBySpringCGLIB$$d318c8c6.page(<generated>)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController.list(JeecgDemoController.java:89)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$FastClassBySpringCGLIB$$e868411d.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$EnhancerBySpringCGLIB$$1150d757.list(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:371)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3462)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:688)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:158)\\r\\n\tat com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)\\r\\n\tat jdk.proxy3/jdk.proxy3.$Proxy532.execute(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\\r\\n\tat org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy530.query(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\\r\\n\tat org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\\r\\n\t... 152 more\\r\\n', NULL, NULL, NULL, '2025-08-11 16:50:55', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954828242229911554', 4, 'org.springframework.jdbc.BadSqlGrammarException:\\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name ASC, salaryMoney DESC, name ASC, salaryMoney DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'sortInfoString=[{\\\"column\\\":\\\"name\\\",\\\"order\\\":\\\"asc\\\"},{\\\"column\\\":\\\"salaryMoney\\\",\\\"order\\\":\\\"desc\\\"}]&_t=1754902268763&pageNo=1&pageSize=10', '/jeecg-boot/test/jeecgDemo/list', 'org.springframework.jdbc.BadSqlGrammarException: \\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name ASC, salaryMoney DESC, name ASC, salaryMoney DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:236)\\r\\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)\\r\\n\tat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy175.selectList(Unknown Source)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectList(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:458)\\r\\n\tat java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:182)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectPage(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository.page(IRepository.java:342)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository$$FastClassBySpringCGLIB$$badc8562.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)\\r\\n\tat org.jeecg.modules.demo.test.service.impl.JeecgDemoServiceImpl$$EnhancerBySpringCGLIB$$d318c8c6.page(<generated>)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController.list(JeecgDemoController.java:89)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$FastClassBySpringCGLIB$$e868411d.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$EnhancerBySpringCGLIB$$1150d757.list(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:371)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3462)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:688)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:158)\\r\\n\tat com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)\\r\\n\tat jdk.proxy3/jdk.proxy3.$Proxy532.execute(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\\r\\n\tat org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy530.query(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\\r\\n\tat org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\\r\\n\t... 152 more\\r\\n', NULL, NULL, NULL, '2025-08-11 16:52:27', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954828358881878017', 4, 'org.springframework.jdbc.BadSqlGrammarException:\\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY salaryMoney DESC, name DESC, salary_money DESC, name DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'sortInfoString=[{\\\"column\\\":\\\"salaryMoney\\\",\\\"order\\\":\\\"desc\\\"},{\\\"column\\\":\\\"name\\\",\\\"order\\\":\\\"desc\\\"}]&_t=1754902373822&pageNo=1&pageSize=10', '/jeecg-boot/test/jeecgDemo/list', 'org.springframework.jdbc.BadSqlGrammarException: \\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY salaryMoney DESC, name DESC, salary_money DESC, name DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:236)\\r\\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)\\r\\n\tat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy175.selectList(Unknown Source)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectList(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:458)\\r\\n\tat java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:182)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectPage(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository.page(IRepository.java:342)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository$$FastClassBySpringCGLIB$$badc8562.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)\\r\\n\tat org.jeecg.modules.demo.test.service.impl.JeecgDemoServiceImpl$$EnhancerBySpringCGLIB$$e8dbc284.page(<generated>)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController.list(JeecgDemoController.java:89)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$FastClassBySpringCGLIB$$e868411d.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$EnhancerBySpringCGLIB$$472fe3aa.list(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1423)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:371)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3462)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:688)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:158)\\r\\n\tat com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)\\r\\n\tat jdk.proxy3/jdk.proxy3.$Proxy532.execute(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\\r\\n\tat org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy530.query(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\\r\\n\tat org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\\r\\n\t... 152 more\\r\\n', NULL, NULL, NULL, '2025-08-11 16:52:54', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954828542835662850', 4, 'org.springframework.jdbc.BadSqlGrammarException:\\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name DESC, salaryMoney ASC, name DESC, salary_money ASC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'sortInfoString=[{\\\"column\\\":\\\"name\\\",\\\"order\\\":\\\"desc\\\"},{\\\"column\\\":\\\"salaryMoney\\\",\\\"order\\\":\\\"asc\\\"}]&_t=1754902386716&pageNo=1&pageSize=10', '/jeecg-boot/test/jeecgDemo/list', 'org.springframework.jdbc.BadSqlGrammarException: \\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name DESC, salaryMoney ASC, name DESC, salary_money ASC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:236)\\r\\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)\\r\\n\tat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy175.selectList(Unknown Source)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectList(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:458)\\r\\n\tat java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:182)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectPage(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository.page(IRepository.java:342)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository$$FastClassBySpringCGLIB$$badc8562.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)\\r\\n\tat org.jeecg.modules.demo.test.service.impl.JeecgDemoServiceImpl$$EnhancerBySpringCGLIB$$e8dbc284.page(<generated>)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController.list(JeecgDemoController.java:89)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$FastClassBySpringCGLIB$$e868411d.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$EnhancerBySpringCGLIB$$472fe3aa.list(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:371)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3462)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:688)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:158)\\r\\n\tat com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)\\r\\n\tat jdk.proxy3/jdk.proxy3.$Proxy532.execute(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\\r\\n\tat org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy530.query(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\\r\\n\tat org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\\r\\n\t... 152 more\\r\\n', NULL, NULL, NULL, '2025-08-11 16:53:38', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1954828565661065217', 4, 'org.springframework.jdbc.BadSqlGrammarException:\\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name DESC, salaryMoney DESC, name DESC, salary_money DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'sortInfoString=[{\\\"column\\\":\\\"name\\\",\\\"order\\\":\\\"desc\\\"},{\\\"column\\\":\\\"salaryMoney\\\",\\\"order\\\":\\\"desc\\\"}]&_t=1754902423621&pageNo=1&pageSize=10', '/jeecg-boot/test/jeecgDemo/list', 'org.springframework.jdbc.BadSqlGrammarException: \\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n### The error may exist in org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, name, key_word, punch_time, salary_money, bonus_money, sex, age, birthday, email, content, sys_org_code, tenant_id, update_count, create_by, create_time, update_by, update_time FROM demo ORDER BY name DESC, salaryMoney DESC, name DESC, salary_money DESC LIMIT ?\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:236)\\r\\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)\\r\\n\tat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy175.selectList(Unknown Source)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectList(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:458)\\r\\n\tat java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:182)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy462.selectPage(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository.page(IRepository.java:342)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository$$FastClassBySpringCGLIB$$badc8562.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)\\r\\n\tat org.jeecg.modules.demo.test.service.impl.JeecgDemoServiceImpl$$EnhancerBySpringCGLIB$$e8dbc284.page(<generated>)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController.list(JeecgDemoController.java:89)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$FastClassBySpringCGLIB$$e868411d.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:82)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.demo.test.controller.JeecgDemoController$$EnhancerBySpringCGLIB$$472fe3aa.list(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.sql.SQLSyntaxErrorException: Unknown column \\'salaryMoney\\' in \\'order clause\\'\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:371)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3462)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:688)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:158)\\r\\n\tat com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)\\r\\n\tat jdk.proxy3/jdk.proxy3.$Proxy532.execute(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\\r\\n\tat org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy530.query(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\\r\\n\tat org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy529.query(Unknown Source)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)\\r\\n\t... 152 more\\r\\n', NULL, NULL, NULL, '2025-08-11 16:53:44', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955143247298990082', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 13:44:10', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955165648686583809', 4, 'org.springframework.web.util.NestedServletException:Handler dispatch failed; nested exception is java.lang.VirtualMachineError: Out of space in CodeCache for adapters', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1754982790281&pageSize=1&id=1185040064792571906&isMultiTranslate=true', '/jeecg-boot/sys/position/list', 'org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.VirtualMachineError: Out of space in CodeCache for adapters\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1087)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:497)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.lang.VirtualMachineError: Out of space in CodeCache for adapters\\r\\n\tat java.base/java.lang.ClassLoader.defineClass0(Native Method)\\r\\n\tat java.base/java.lang.System$2.defineClass(System.java:2307)\\r\\n\tat java.base/java.lang.invoke.MethodHandles$Lookup$ClassDefiner.defineClass(MethodHandles.java:2439)\\r\\n\tat java.base/java.lang.invoke.InvokerBytecodeGenerator.loadMethod(InvokerBytecodeGenerator.java:320)\\r\\n\tat java.base/java.lang.invoke.InvokerBytecodeGenerator.generateCustomizedCode(InvokerBytecodeGenerator.java:752)\\r\\n\tat java.base/java.lang.invoke.LambdaForm.compileToBytecode(LambdaForm.java:854)\\r\\n\tat java.base/java.lang.invoke.LambdaForm.prepare(LambdaForm.java:812)\\r\\n\tat java.base/java.lang.invoke.MethodHandle.<init>(MethodHandle.java:481)\\r\\n\tat java.base/java.lang.invoke.BoundMethodHandle.<init>(BoundMethodHandle.java:56)\\r\\n\tat java.base/java.lang.invoke.BoundMethodHandle$Species_L.<init>(BoundMethodHandle.java:222)\\r\\n\tat java.base/java.lang.invoke.BoundMethodHandle$Species_L.copyWith(BoundMethodHandle.java:242)\\r\\n\tat java.base/java.lang.invoke.MethodHandles.dropArguments0(MethodHandles.java:5269)\\r\\n\tat java.base/java.lang.invoke.MethodHandles.dropArguments(MethodHandles.java:5332)\\r\\n\tat java.base/java.lang.invoke.StringConcatFactory.generateMHInlineCopy(StringConcatFactory.java:514)\\r\\n\tat java.base/java.lang.invoke.StringConcatFactory.makeConcatWithConstants(StringConcatFactory.java:358)\\r\\n\tat java.base/java.lang.invoke.BootstrapMethodInvoker.invoke(BootstrapMethodInvoker.java:102)\\r\\n\tat java.base/java.lang.invoke.CallSite.makeSite(CallSite.java:315)\\r\\n\tat java.base/java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:281)\\r\\n\tat java.base/java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:271)\\r\\n\tat org.jeecg.modules.system.entity.SysPosition.toString(SysPosition.java:22)\\r\\n\tat java.base/java.lang.StringConcatHelper.stringOf(StringConcatHelper.java:453)\\r\\n\tat org.jeecg.common.aspect.AutoLogAspect.getReqestParams(AutoLogAspect.java:179)\\r\\n\tat org.jeecg.common.aspect.AutoLogAspect.saveSysLog(AutoLogAspect.java:99)\\r\\n\tat org.jeecg.common.aspect.AutoLogAspect.around(AutoLogAspect.java:63)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.system.controller.SysPositionController$$EnhancerBySpringCGLIB$$6f29f0d7.queryPageList(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\t... 89 more\\r\\n', NULL, NULL, NULL, '2025-08-12 15:13:11', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955165846536097793', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=1185040064792571906, code=null, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 1  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@105d81b4', NULL, 23, NULL, '2025-08-12 15:13:58', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1955176455570886658', 4, 'org.springframework.web.bind.MissingServletRequestParameterException:Required request parameter \\'phone\\' for method parameter type String is not present', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'userids=3d464b4ea0d2491aab8a7bde74c57e95&ids=1001', '/jeecg-boot/sys/tenant/invitationUserJoin', 'org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter \\'phone\\' for method parameter type String is not present\\r\\n\tat org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValueInternal(RequestParamMethodArgumentResolver.java:218)\\r\\n\tat org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:193)\\r\\n\tat org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:114)\\r\\n\tat org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:179)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:146)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:920)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:520)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-08-12 15:56:07', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955176766784049153', 4, 'org.springframework.web.bind.MissingServletRequestParameterException:Required request parameter \\'phone\\' for method parameter type String is not present', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'userSelectId=3d464b4ea0d2491aab8a7bde74c57e95&ids=1001', '/jeecg-boot/sys/tenant/invitationUserJoin', 'org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter \\'phone\\' for method parameter type String is not present\\r\\n\tat org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValueInternal(RequestParamMethodArgumentResolver.java:218)\\r\\n\tat org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:193)\\r\\n\tat org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:114)\\r\\n\tat org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:179)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:146)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:920)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:520)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-08-12 15:57:21', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955181101903421442', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 16:14:35', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955181963367366657', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 16:18:00', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955181983831375873', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 16:18:05', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955182032518856705', 2, '编辑用户，username： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 16:18:17', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955182100286226433', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 16:18:33', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955182117013110786', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 16:18:37', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955182669944012802', 4, 'org.jeecg.common.exception.JeecgBootException:手机号用户:18611111111 昵称：管理员，已在租户中，无需邀请！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'userSelectId=e9ca23d68d884d4ebb19d07889727dae&ids=1000', '/jeecg-boot/sys/tenant/invitationUserJoin', 'org.jeecg.common.exception.JeecgBootException: 手机号用户:18611111111 昵称：管理员，已在租户中，无需邀请！\\r\\n\tat org.jeecg.modules.system.service.impl.SysTenantServiceImpl.invitationUserJoin(SysTenantServiceImpl.java:145)\\r\\n\tat org.jeecg.modules.system.service.impl.SysTenantServiceImpl$$FastClassBySpringCGLIB$$c059fa5.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.cache.interceptor.CacheInterceptor.lambda$invoke$0(CacheInterceptor.java:54)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.invokeOperation(CacheAspectSupport.java:366)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:420)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:345)\\r\\n\tat org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:64)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.system.service.impl.SysTenantServiceImpl$$EnhancerBySpringCGLIB$$a3246c2d.invitationUserJoin(<generated>)\\r\\n\tat org.jeecg.modules.system.controller.SysTenantController.invitationUserJoin(SysTenantController.java:419)\\r\\n\tat org.jeecg.modules.system.controller.SysTenantController$$FastClassBySpringCGLIB$$4afb724f.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor176.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor$1.proceed(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:82)\\r\\n\tat org.apache.shiro.authz.aop.AuthorizingMethodInterceptor.invoke(AuthorizingMethodInterceptor.java:39)\\r\\n\tat org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor.invoke(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:115)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.system.controller.SysTenantController$$EnhancerBySpringCGLIB$$314d916.invitationUserJoin(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:920)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:520)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-08-12 16:20:49', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955182969970966529', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=1000)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@2ed2d00a', NULL, 38, NULL, '2025-08-12 16:22:00', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1955183035603435522', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=1000)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@6465db8d', NULL, 13, NULL, '2025-08-12 16:22:16', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1955183098127925250', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=1000)  pageNo: 1  pageSize: 99999  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@40f6ee9a', NULL, 14, NULL, '2025-08-12 16:22:31', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1955183164326625281', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@e5c9dc0', NULL, 33, NULL, '2025-08-12 16:22:47', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1955183215874621442', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@7108cf26', NULL, 11, NULL, '2025-08-12 16:22:59', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1955183658461773827', 2, '添加用户，username： ddddd', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 16:24:44', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955183709229629441', 2, '编辑用户，username： ddddd', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 16:24:57', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955184602037567489', 3, '将 ddddd 添加到角色 默认套餐', 2, 'admin', '管理员', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 16:28:29', NULL, NULL, 1000, NULL);\nINSERT INTO `sys_log` VALUES ('1955184747919654913', 1, '用户名: ddddd,登录成功！', NULL, 'ddddd', 'ddddd', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 16:29:04', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955186284532285442', 2, '修改角色ID: ee8626f80f7c2619917b6236f3a7f02b 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 16:35:10', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955187134109532161', 2, '修改角色ID: ee8626f80f7c2619917b6236f3a7f02b 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 16:38:33', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955187752354136066', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=1000)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@77a8ed7c', NULL, 10, NULL, '2025-08-12 16:41:00', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1955187799615553537', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@53a4be7d', NULL, 13, NULL, '2025-08-12 16:41:12', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1955187972626399234', 3, '将 ddddd 添加到角色 升级企业套餐', 2, 'admin', '管理员', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 16:41:53', NULL, NULL, 1000, NULL);\nINSERT INTO `sys_log` VALUES ('1955191953985585153', 1, '用户名: ddddd,退出成功！', NULL, 'ddddd', 'ddddd', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 16:57:42', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955192015872540673', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 16:57:57', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955194924311986178', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 17:09:30', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955194967047749633', 1, '用户登录失败，用户不存在！', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 17:09:41', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955195025189191681', 1, '用户名: ddddd,登录成功！', NULL, 'ddddd', 'ddddd', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 17:09:54', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955196186445168642', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@4ad1d11b', NULL, 18, NULL, '2025-08-12 17:14:31', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1955196207676735489', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@bb93c06', NULL, 15, NULL, '2025-08-12 17:14:36', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1955196218489651202', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=1000)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@7c8ca405', NULL, 19, NULL, '2025-08-12 17:14:39', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1955196239637331970', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@48937f7a', NULL, 16, NULL, '2025-08-12 17:14:44', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1955198568214249474', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 17:23:59', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955207737931677698', 2, '编辑用户，username： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 18:00:25', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955207748182556674', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 18:00:28', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955207763990888449', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 18:00:32', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955209528433917953', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postRank=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=1001)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@480e4c67', NULL, 14, NULL, '2025-08-12 18:07:32', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1955211270034690049', 4, 'org.jeecg.common.exception.JeecgBootException:当前用户不存在，请核对手机号', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'ids=1001&username=qinfeng', '/jeecg-boot/sys/tenant/invitationUserJoin', 'org.jeecg.common.exception.JeecgBootException: 当前用户不存在，请核对手机号\\r\\n\tat org.jeecg.modules.system.service.impl.SysTenantServiceImpl.invitationUserJoin(SysTenantServiceImpl.java:123)\\r\\n\tat org.jeecg.modules.system.service.impl.SysTenantServiceImpl$$FastClassBySpringCGLIB$$c059fa5.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.cache.interceptor.CacheInterceptor.lambda$invoke$0(CacheInterceptor.java:54)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.invokeOperation(CacheAspectSupport.java:366)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:420)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:345)\\r\\n\tat org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:64)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.system.service.impl.SysTenantServiceImpl$$EnhancerBySpringCGLIB$$7d6a8c93.invitationUserJoin(<generated>)\\r\\n\tat org.jeecg.modules.system.controller.SysTenantController.invitationUserJoin(SysTenantController.java:419)\\r\\n\tat org.jeecg.modules.system.controller.SysTenantController$$FastClassBySpringCGLIB$$4afb724f.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor$1.proceed(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:82)\\r\\n\tat org.apache.shiro.authz.aop.AuthorizingMethodInterceptor.invoke(AuthorizingMethodInterceptor.java:39)\\r\\n\tat org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor.invoke(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:115)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.system.controller.SysTenantController$$EnhancerBySpringCGLIB$$d5aa3d92.invitationUserJoin(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:920)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:520)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-08-12 18:14:28', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955211422069821442', 4, 'org.jeecg.common.exception.JeecgBootException:当前用户不存在，请核对手机号', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'ids=1001&username=qinfeng', '/jeecg-boot/sys/tenant/invitationUserJoin', 'org.jeecg.common.exception.JeecgBootException: 当前用户不存在，请核对手机号\\r\\n\tat org.jeecg.modules.system.service.impl.SysTenantServiceImpl.invitationUserJoin(SysTenantServiceImpl.java:123)\\r\\n\tat org.jeecg.modules.system.service.impl.SysTenantServiceImpl$$FastClassBySpringCGLIB$$c059fa5.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.cache.interceptor.CacheInterceptor.lambda$invoke$0(CacheInterceptor.java:54)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.invokeOperation(CacheAspectSupport.java:366)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:420)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:345)\\r\\n\tat org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:64)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.system.service.impl.SysTenantServiceImpl$$EnhancerBySpringCGLIB$$7d6a8c93.invitationUserJoin(<generated>)\\r\\n\tat org.jeecg.modules.system.controller.SysTenantController.invitationUserJoin(SysTenantController.java:419)\\r\\n\tat org.jeecg.modules.system.controller.SysTenantController$$FastClassBySpringCGLIB$$4afb724f.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor$1.proceed(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:82)\\r\\n\tat org.apache.shiro.authz.aop.AuthorizingMethodInterceptor.invoke(AuthorizingMethodInterceptor.java:39)\\r\\n\tat org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor.invoke(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:115)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.system.controller.SysTenantController$$EnhancerBySpringCGLIB$$d5aa3d92.invitationUserJoin(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:920)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:520)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-08-12 18:15:04', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955211678253715457', 4, 'org.jeecg.common.exception.JeecgBootException:手机号用户:15201111112 昵称：测试用户，已在租户中，无需邀请！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'ids=1001,1000&username=ceshi', '/jeecg-boot/sys/tenant/invitationUserJoin', 'org.jeecg.common.exception.JeecgBootException: 手机号用户:15201111112 昵称：测试用户，已在租户中，无需邀请！\\r\\n\tat org.jeecg.modules.system.service.impl.SysTenantServiceImpl.invitationUserJoin(SysTenantServiceImpl.java:145)\\r\\n\tat org.jeecg.modules.system.service.impl.SysTenantServiceImpl$$FastClassBySpringCGLIB$$c059fa5.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.cache.interceptor.CacheInterceptor.lambda$invoke$0(CacheInterceptor.java:54)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.invokeOperation(CacheAspectSupport.java:366)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:420)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:345)\\r\\n\tat org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:64)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.system.service.impl.SysTenantServiceImpl$$EnhancerBySpringCGLIB$$7d6a8c93.invitationUserJoin(<generated>)\\r\\n\tat org.jeecg.modules.system.controller.SysTenantController.invitationUserJoin(SysTenantController.java:419)\\r\\n\tat org.jeecg.modules.system.controller.SysTenantController$$FastClassBySpringCGLIB$$4afb724f.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor162.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor$1.proceed(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:82)\\r\\n\tat org.apache.shiro.authz.aop.AuthorizingMethodInterceptor.invoke(AuthorizingMethodInterceptor.java:39)\\r\\n\tat org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor.invoke(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:115)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.system.controller.SysTenantController$$EnhancerBySpringCGLIB$$d5aa3d92.invitationUserJoin(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:920)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:520)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-08-12 18:16:05', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955213356688347138', 2, '批量删除用户， ids： 1955183658394664962', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 18:22:45', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955213392465760258', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@2217a3a1', NULL, 19, NULL, '2025-08-12 18:22:54', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1955217131046047745', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@18789714', NULL, 18, NULL, '2025-08-12 18:37:45', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1955217414526472194', 2, '修改角色ID: 1955217389314510849 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 18:38:52', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955217583099744258', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@4ab82961', NULL, 13, NULL, '2025-08-12 18:39:33', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1955218082733625345', 2, '添加用户，username： ccc', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 18:41:32', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955218118573953026', 4, 'org.jeecg.common.exception.JeecgBootException:手机号用户:13426432921 昵称：ccc，已在租户中，无需邀请！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'ids=1001&username=ccc', '/jeecg-boot/sys/tenant/invitationUserJoin', 'org.jeecg.common.exception.JeecgBootException: 手机号用户:13426432921 昵称：ccc，已在租户中，无需邀请！\\r\\n\tat org.jeecg.modules.system.service.impl.SysTenantServiceImpl.invitationUserJoin(SysTenantServiceImpl.java:145)\\r\\n\tat org.jeecg.modules.system.service.impl.SysTenantServiceImpl$$FastClassBySpringCGLIB$$c059fa5.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.cache.interceptor.CacheInterceptor.lambda$invoke$0(CacheInterceptor.java:54)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.invokeOperation(CacheAspectSupport.java:366)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:420)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:345)\\r\\n\tat org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:64)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.system.service.impl.SysTenantServiceImpl$$EnhancerBySpringCGLIB$$7d6a8c93.invitationUserJoin(<generated>)\\r\\n\tat org.jeecg.modules.system.controller.SysTenantController.invitationUserJoin(SysTenantController.java:419)\\r\\n\tat org.jeecg.modules.system.controller.SysTenantController$$FastClassBySpringCGLIB$$4afb724f.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor162.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor$1.proceed(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:82)\\r\\n\tat org.apache.shiro.authz.aop.AuthorizingMethodInterceptor.invoke(AuthorizingMethodInterceptor.java:39)\\r\\n\tat org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor.invoke(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:115)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.system.controller.SysTenantController$$EnhancerBySpringCGLIB$$d5aa3d92.invitationUserJoin(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:920)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:520)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-08-12 18:41:40', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955218454541897731', 2, '添加用户，username： 18611788521', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 18:43:00', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955218760566706177', 1, '用户名: 18611788521,登录成功！', NULL, '18611788521', '222', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 18:44:13', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955220104149110786', 3, '将 ccc 添加到角色 默认套餐', 2, 'admin', '管理员', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 18:49:34', NULL, NULL, 1001, NULL);\nINSERT INTO `sys_log` VALUES ('1955220158536650753', 1, '用户名: 222,退出成功！', NULL, '18611788521', '222', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 18:49:47', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955220175846543362', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 18:49:51', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955220195803041793', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 18:49:56', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955220250366742530', 1, '用户名: ccc,登录成功！', NULL, 'ccc', 'ccc', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 18:50:09', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955221376789102594', 3, '将 ccc 添加到角色 默认套餐', 2, 'admin', '管理员', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 18:54:37', NULL, NULL, 1001, NULL);\nINSERT INTO `sys_log` VALUES ('1955221607463239681', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@4606e752', NULL, 10, NULL, '2025-08-12 18:55:32', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1955221611842093058', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@795ff718', NULL, 5, NULL, '2025-08-12 18:55:33', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1955221711351955458', 3, '将 ccc 添加到角色 默认套餐', 2, 'admin', '管理员', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 18:55:57', NULL, NULL, 1001, NULL);\nINSERT INTO `sys_log` VALUES ('1955221792377520129', 1, '用户名: ccc,退出成功！', NULL, 'ccc', 'ccc', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 18:56:16', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955221840666542081', 1, '用户登录失败，用户不存在！', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 18:56:28', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955221862351093761', 1, '用户名: ccc,登录成功！', NULL, 'ccc', 'ccc', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 18:56:33', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955221914528235522', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@c6660ce', NULL, 6, NULL, '2025-08-12 18:56:45', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1955222312760623106', 3, '将 ccc 添加到角色 默认套餐', 2, 'admin', '管理员', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 18:58:20', NULL, NULL, 1001, NULL);\nINSERT INTO `sys_log` VALUES ('1955223197540663298', 1, '用户名: ccc,退出成功！', NULL, 'ccc', 'ccc', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 19:01:51', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955223240091877378', 1, '用户名: ccc,登录成功！', NULL, 'ccc', 'ccc', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 19:02:01', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955224580436156417', 2, '修改角色ID: ee8626f80f7c2619917b6236f3a7f02b 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-12 19:07:21', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955545905210011650', 4, 'jakarta.servlet.ServletException:Handler dispatch failed: java.lang.NoSuchMethodError: \\'void org.springframework.web.method.ControllerAdviceBean.<init>(java.lang.Object)\\'', NULL, NULL, NULL, '192.168.1.2', NULL, '/jeecg-boot/v3/api-docs', 'jakarta.servlet.ServletException: Handler dispatch failed: java.lang.NoSuchMethodError: \\'void org.springframework.web.method.ControllerAdviceBean.<init>(java.lang.Object)\\'\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1104)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:527)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:172)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:114)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:276)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:132)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:256)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:176)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:395)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:861)\\r\\n\tat org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1512)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.lang.NoSuchMethodError: \\'void org.springframework.web.method.ControllerAdviceBean.<init>(java.lang.Object)\\'\\r\\n\tat org.springdoc.core.service.GenericResponseService.lambda$getGenericMapResponse$8(GenericResponseService.java:702)\\r\\n\tat java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)\\r\\n\tat java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:992)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:622)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.toList(ReferencePipeline.java:627)\\r\\n\tat org.springdoc.core.service.GenericResponseService.getGenericMapResponse(GenericResponseService.java:704)\\r\\n\tat org.springdoc.core.service.GenericResponseService.build(GenericResponseService.java:246)\\r\\n\tat org.springdoc.api.AbstractOpenApiResource.calculatePath(AbstractOpenApiResource.java:499)\\r\\n\tat org.springdoc.api.AbstractOpenApiResource.calculatePath(AbstractOpenApiResource.java:676)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.lambda$calculatePath$11(OpenApiResource.java:219)\\r\\n\tat java.base/java.util.Optional.ifPresent(Optional.java:178)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.calculatePath(OpenApiResource.java:200)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.lambda$getPaths$2(OpenApiResource.java:170)\\r\\n\tat java.base/java.util.Optional.ifPresent(Optional.java:178)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.getPaths(OpenApiResource.java:149)\\r\\n\tat org.springdoc.api.AbstractOpenApiResource.getOpenApi(AbstractOpenApiResource.java:353)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.openapiJson(OpenApiResource.java:124)\\r\\n\tat org.springdoc.webmvc.api.OpenApiWebMvcResource.openapiJson(OpenApiWebMvcResource.java:111)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:986)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:891)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\t... 87 more\\r\\n', NULL, NULL, NULL, '2025-08-13 16:24:11', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955545946297413633', 4, 'jakarta.servlet.ServletException:Handler dispatch failed: java.lang.NoSuchMethodError: \\'void org.springframework.web.method.ControllerAdviceBean.<init>(java.lang.Object)\\'', NULL, NULL, NULL, '192.168.1.2', NULL, '/jeecg-boot/v3/api-docs', 'jakarta.servlet.ServletException: Handler dispatch failed: java.lang.NoSuchMethodError: \\'void org.springframework.web.method.ControllerAdviceBean.<init>(java.lang.Object)\\'\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1104)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:527)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:172)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:114)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:276)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:132)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:256)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:176)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:395)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:861)\\r\\n\tat org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.lang.NoSuchMethodError: \\'void org.springframework.web.method.ControllerAdviceBean.<init>(java.lang.Object)\\'\\r\\n\tat org.springdoc.core.service.GenericResponseService.lambda$getGenericMapResponse$8(GenericResponseService.java:702)\\r\\n\tat java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)\\r\\n\tat java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:992)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:622)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.toList(ReferencePipeline.java:627)\\r\\n\tat org.springdoc.core.service.GenericResponseService.getGenericMapResponse(GenericResponseService.java:704)\\r\\n\tat org.springdoc.core.service.GenericResponseService.build(GenericResponseService.java:246)\\r\\n\tat org.springdoc.api.AbstractOpenApiResource.calculatePath(AbstractOpenApiResource.java:499)\\r\\n\tat org.springdoc.api.AbstractOpenApiResource.calculatePath(AbstractOpenApiResource.java:676)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.lambda$calculatePath$11(OpenApiResource.java:219)\\r\\n\tat java.base/java.util.Optional.ifPresent(Optional.java:178)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.calculatePath(OpenApiResource.java:200)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.lambda$getPaths$2(OpenApiResource.java:170)\\r\\n\tat java.base/java.util.Optional.ifPresent(Optional.java:178)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.getPaths(OpenApiResource.java:149)\\r\\n\tat org.springdoc.api.AbstractOpenApiResource.getOpenApi(AbstractOpenApiResource.java:353)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.openapiJson(OpenApiResource.java:124)\\r\\n\tat org.springdoc.webmvc.api.OpenApiWebMvcResource.openapiJson(OpenApiWebMvcResource.java:111)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:986)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:891)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\t... 87 more\\r\\n', NULL, NULL, NULL, '2025-08-13 16:24:21', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955546165227520001', 4, 'jakarta.servlet.ServletException:Handler dispatch failed: java.lang.NoSuchMethodError: \\'void org.springframework.web.method.ControllerAdviceBean.<init>(java.lang.Object)\\'', NULL, NULL, NULL, '192.168.1.2', NULL, '/jeecg-boot/v3/api-docs', 'jakarta.servlet.ServletException: Handler dispatch failed: java.lang.NoSuchMethodError: \\'void org.springframework.web.method.ControllerAdviceBean.<init>(java.lang.Object)\\'\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1104)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:527)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:172)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:114)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:276)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:132)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:256)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:176)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:395)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:861)\\r\\n\tat org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.lang.NoSuchMethodError: \\'void org.springframework.web.method.ControllerAdviceBean.<init>(java.lang.Object)\\'\\r\\n\tat org.springdoc.core.service.GenericResponseService.lambda$getGenericMapResponse$8(GenericResponseService.java:702)\\r\\n\tat java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)\\r\\n\tat java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:992)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:622)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.toList(ReferencePipeline.java:627)\\r\\n\tat org.springdoc.core.service.GenericResponseService.getGenericMapResponse(GenericResponseService.java:704)\\r\\n\tat org.springdoc.core.service.GenericResponseService.build(GenericResponseService.java:246)\\r\\n\tat org.springdoc.api.AbstractOpenApiResource.calculatePath(AbstractOpenApiResource.java:499)\\r\\n\tat org.springdoc.api.AbstractOpenApiResource.calculatePath(AbstractOpenApiResource.java:676)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.lambda$calculatePath$11(OpenApiResource.java:219)\\r\\n\tat java.base/java.util.Optional.ifPresent(Optional.java:178)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.calculatePath(OpenApiResource.java:200)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.lambda$getPaths$2(OpenApiResource.java:170)\\r\\n\tat java.base/java.util.Optional.ifPresent(Optional.java:178)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.getPaths(OpenApiResource.java:149)\\r\\n\tat org.springdoc.api.AbstractOpenApiResource.getOpenApi(AbstractOpenApiResource.java:353)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.openapiJson(OpenApiResource.java:124)\\r\\n\tat org.springdoc.webmvc.api.OpenApiWebMvcResource.openapiJson(OpenApiWebMvcResource.java:111)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:986)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:891)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\t... 87 more\\r\\n', NULL, NULL, NULL, '2025-08-13 16:25:13', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955546672503361537', 4, 'jakarta.servlet.ServletException:Handler dispatch failed: java.lang.NoSuchMethodError: \\'void org.springframework.web.method.ControllerAdviceBean.<init>(java.lang.Object)\\'', NULL, NULL, NULL, '192.168.1.2', NULL, '/jeecg-boot/v3/api-docs', 'jakarta.servlet.ServletException: Handler dispatch failed: java.lang.NoSuchMethodError: \\'void org.springframework.web.method.ControllerAdviceBean.<init>(java.lang.Object)\\'\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1104)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:527)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:172)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:114)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:276)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:132)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:256)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:176)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:395)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:861)\\r\\n\tat org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.lang.NoSuchMethodError: \\'void org.springframework.web.method.ControllerAdviceBean.<init>(java.lang.Object)\\'\\r\\n\tat org.springdoc.core.service.GenericResponseService.lambda$getGenericMapResponse$8(GenericResponseService.java:702)\\r\\n\tat java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)\\r\\n\tat java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:992)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:622)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.toList(ReferencePipeline.java:627)\\r\\n\tat org.springdoc.core.service.GenericResponseService.getGenericMapResponse(GenericResponseService.java:704)\\r\\n\tat org.springdoc.core.service.GenericResponseService.build(GenericResponseService.java:246)\\r\\n\tat org.springdoc.api.AbstractOpenApiResource.calculatePath(AbstractOpenApiResource.java:499)\\r\\n\tat org.springdoc.api.AbstractOpenApiResource.calculatePath(AbstractOpenApiResource.java:676)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.lambda$calculatePath$11(OpenApiResource.java:219)\\r\\n\tat java.base/java.util.Optional.ifPresent(Optional.java:178)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.calculatePath(OpenApiResource.java:200)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.lambda$getPaths$2(OpenApiResource.java:170)\\r\\n\tat java.base/java.util.Optional.ifPresent(Optional.java:178)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.getPaths(OpenApiResource.java:149)\\r\\n\tat org.springdoc.api.AbstractOpenApiResource.getOpenApi(AbstractOpenApiResource.java:353)\\r\\n\tat org.springdoc.webmvc.api.OpenApiResource.openapiJson(OpenApiResource.java:124)\\r\\n\tat org.springdoc.webmvc.api.OpenApiWebMvcResource.openapiJson(OpenApiWebMvcResource.java:111)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:986)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:891)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\t... 87 more\\r\\n', NULL, NULL, NULL, '2025-08-13 16:27:14', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955553167886401538', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '192.168.1.2', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-13 16:53:02', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1955557313372925954', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '192.168.1.2', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-13 17:09:31', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1957252155325009921', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-18 09:24:12', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1957252339203297282', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-18 09:24:56', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1957444530970271746', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-18 22:08:38', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1957454945175425026', 4, 'org.springframework.web.util.NestedServletException:Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/jeecgframework/codegenerate/generate/impl/CodeGenerateOne', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/online/cgform/api/codeGenerate', 'org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/jeecgframework/codegenerate/generate/impl/CodeGenerateOne\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1087)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:517)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\\r\\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:584)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:175)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:393)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\\r\\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1449)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.lang.NoClassDefFoundError: org/jeecgframework/codegenerate/generate/impl/CodeGenerateOne\\r\\n\tat org.jeecg.modules.online.cgform.service.impl.d.generateCode(OnlCgformHeadServiceImpl.java:1772)\\r\\n\tat org.jeecg.modules.online.cgform.service.impl.d$$FastClassBySpringCGLIB$$a1d6ff6b.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703)\\r\\n\tat org.jeecg.modules.online.cgform.service.impl.d$$EnhancerBySpringCGLIB$$c77f0ea4.generateCode(<generated>)\\r\\n\tat org.jeecg.modules.online.cgform.c.a.b(OnlCgformApiController.java:1321)\\r\\n\tat org.jeecg.modules.online.cgform.c.a$$FastClassBySpringCGLIB$$b70991a.invoke(<generated>)\\r\\n\tat org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor$1.proceed(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:82)\\r\\n\tat org.apache.shiro.authz.aop.AuthorizingMethodInterceptor.invoke(AuthorizingMethodInterceptor.java:39)\\r\\n\tat org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor.invoke(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:115)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)\\r\\n\tat org.jeecg.modules.online.cgform.c.a$$EnhancerBySpringCGLIB$$56ead18.b(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)\\r\\n\t... 89 more\\r\\nCaused by: java.lang.ClassNotFoundException: org.jeecgframework.codegenerate.generate.impl.CodeGenerateOne\\r\\n\tat java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)\\r\\n\tat java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)\\r\\n\tat java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)\\r\\n\t... 134 more\\r\\n', NULL, NULL, NULL, '2025-08-18 22:50:01', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1958770628924420097', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-22 13:58:05', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1959861392093892610', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-25 14:12:23', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1959861421588238337', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-25 14:12:30', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1959861444279422978', 1, '用户名: jeecg,登录成功！', NULL, 'jeecg', 'jeecg', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-25 14:12:35', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960942527066537986', 1, '用户名: admin,退出成功！', NULL, 'admin', 'admin', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 13:48:26', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960942557387161602', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 13:48:33', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960942631437598722', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 13:48:51', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960971114683543554', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 15:42:01', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960975890091585537', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 16:01:00', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960977325160116226', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 16:06:42', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960980273269288962', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 16:18:25', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960980402940391425', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 16:18:56', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960980430832513026', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 16:19:03', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960980449266479105', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 16:19:07', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960982616698236929', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '192.168.1.2', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 16:27:44', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960982979992072194', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 16:29:10', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960983006307135489', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 16:29:17', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960992335718494210', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 17:06:21', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960992411505373185', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 17:06:39', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960992450948608002', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 17:06:48', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960992562391265282', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 17:07:15', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960992626736082945', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 17:07:30', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960992647506276353', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 17:07:35', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1960992683321438210', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-08-28 17:07:44', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1962758162868215809', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-02 14:03:07', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1962768945958248450', 1, '用户名: admin,退出成功！', NULL, 'admin', 'admin', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-02 14:45:58', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1962769091890667522', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-02 14:46:33', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1962769487359008770', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-02 14:48:07', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1963157379927379970', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-03 16:29:28', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1963157574811521026', 4, 'org.springframework.web.servlet.resource.NoResourceFoundException:No static resource drag/lib/img/bg1.png.', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/drag/lib/img/bg1.png', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource drag/lib/img/bg1.png.\\r\\n\tat org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\\r\\n\tat org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:527)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:172)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:73)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:276)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:132)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:256)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:176)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:395)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:861)\\r\\n\tat org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-09-03 16:30:14', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1963157575386140673', 4, 'org.springframework.web.servlet.resource.NoResourceFoundException:No static resource drag/lib/img/border1.png.', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/drag/lib/img/border1.png', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource drag/lib/img/border1.png.\\r\\n\tat org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\\r\\n\tat org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:527)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:172)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:73)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:276)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:132)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:256)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:176)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:395)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:861)\\r\\n\tat org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-09-03 16:30:14', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1963157593056743426', 4, 'org.springframework.web.servlet.resource.NoResourceFoundException:No static resource drag/lib/img/bg1.png.', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/drag/lib/img/bg1.png', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource drag/lib/img/bg1.png.\\r\\n\tat org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\\r\\n\tat org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:527)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:172)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:73)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:276)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:132)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:256)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:176)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:395)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:861)\\r\\n\tat org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-09-03 16:30:19', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1963157593765580802', 4, 'org.springframework.web.servlet.resource.NoResourceFoundException:No static resource drag/lib/img/border1.png.', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/drag/lib/img/border1.png', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource drag/lib/img/border1.png.\\r\\n\tat org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\\r\\n\tat org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:527)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:172)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:73)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:276)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:132)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:256)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:176)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:395)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:861)\\r\\n\tat org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-09-03 16:30:19', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1963157608810549250', 4, 'org.springframework.web.servlet.resource.NoResourceFoundException:No static resource drag/lib/img/border1.png.', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/drag/lib/img/border1.png', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource drag/lib/img/border1.png.\\r\\n\tat org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\\r\\n\tat org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:527)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:172)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:73)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:276)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:132)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:256)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:176)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:395)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:861)\\r\\n\tat org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-09-03 16:30:22', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1963157630079864833', 4, 'org.springframework.web.servlet.resource.NoResourceFoundException:No static resource drag/lib/img/bg1.png.', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/drag/lib/img/bg1.png', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource drag/lib/img/bg1.png.\\r\\n\tat org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\\r\\n\tat org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:527)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:172)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:73)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:276)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:132)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:256)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:176)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:395)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:861)\\r\\n\tat org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-09-03 16:30:27', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1963157630599958529', 4, 'org.springframework.web.servlet.resource.NoResourceFoundException:No static resource drag/lib/img/border1.png.', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/drag/lib/img/border1.png', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource drag/lib/img/border1.png.\\r\\n\tat org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\\r\\n\tat org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:527)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:172)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:73)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:276)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:132)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:256)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:176)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:395)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:861)\\r\\n\tat org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-09-03 16:30:27', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1963157726548856833', 4, 'org.springframework.web.servlet.resource.NoResourceFoundException:No static resource drag/lib/img/bg1.png.', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/drag/lib/img/bg1.png', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource drag/lib/img/bg1.png.\\r\\n\tat org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\\r\\n\tat org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:527)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:172)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:73)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:276)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:132)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:256)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:176)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:395)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:861)\\r\\n\tat org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-09-03 16:30:50', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1963157727073144834', 4, 'org.springframework.web.servlet.resource.NoResourceFoundException:No static resource drag/lib/img/border1.png.', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/drag/lib/img/border1.png', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource drag/lib/img/border1.png.\\r\\n\tat org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\\r\\n\tat org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:527)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)\\r\\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)\\r\\n\tat io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:172)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:73)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\\r\\n\tat io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\\r\\n\tat io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\\r\\n\tat io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\\r\\n\tat io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\\r\\n\tat io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\\r\\n\tat io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)\\r\\n\tat io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\\r\\n\tat io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\\r\\n\tat io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\\r\\n\tat io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\\r\\n\tat io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)\\r\\n\tat io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:276)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:132)\\r\\n\tat io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\\r\\n\tat io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:256)\\r\\n\tat io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:176)\\r\\n\tat org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler.lambda$wrap$0(CustomUndertowMetricsHandler.java:87)\\r\\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:395)\\r\\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:861)\\r\\n\tat org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)\\r\\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)\\r\\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-09-03 16:30:50', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1966791462238711809', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 17:10:00', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966791567138254850', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 17:10:25', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1966791793244794882', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@3c449106', NULL, 20, NULL, '2025-09-13 17:11:19', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966791799527862274', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.apache.shiro.web.servlet.ShiroHttpServletRequest@3dc5266d', NULL, 28, NULL, '2025-09-13 17:11:21', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966792827455303682', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.apache.shiro.web.servlet.ShiroHttpServletRequest@78163177', NULL, 3, NULL, '2025-09-13 17:15:26', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966792831028850690', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@75821562', NULL, 11, NULL, '2025-09-13 17:15:27', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966792991297400833', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.apache.shiro.web.servlet.ShiroHttpServletRequest@52e5d2a0', NULL, 4, NULL, '2025-09-13 17:16:05', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966793098117935106', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 17:16:30', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1966793138093846529', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@3c390b5d', NULL, 15, NULL, '2025-09-13 17:16:40', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966793155189829633', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@2dc75bb9', NULL, 4, NULL, '2025-09-13 17:16:44', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966793262941499393', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@2ac00746', NULL, 7, NULL, '2025-09-13 17:17:10', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966793321141661697', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.apache.shiro.web.servlet.ShiroHttpServletRequest@5f612885', NULL, 4, NULL, '2025-09-13 17:17:24', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966793324811677697', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@2ec0583b', NULL, 5, NULL, '2025-09-13 17:17:25', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966793342633275393', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@63ed7c34', NULL, 3, NULL, '2025-09-13 17:17:29', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966809949812236290', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@27b90a42', NULL, 122, NULL, '2025-09-13 18:23:28', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966809961807945729', 2, '角色首页配置-编辑', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.edit()', NULL, '[{\\\"component\\\":\\\"dashboard/Analysis\\\",\\\"id\\\":\\\"1803082647166652418\\\",\\\"priority\\\":0,\\\"relationType\\\":\\\"DEFAULT\\\",\\\"roleCode\\\":\\\"DEF_INDEX_ALL\\\",\\\"route\\\":true,\\\"status\\\":\\\"0\\\",\\\"updateBy\\\":\\\"admin\\\",\\\"updateTime\\\":\\\"2025-09-13 18:23:31\\\",\\\"url\\\":\\\"/dashboard/analysis\\\"},null]', NULL, 22, NULL, '2025-09-13 18:23:31', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966809962000883714', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@2b7651c7', NULL, 6, NULL, '2025-09-13 18:23:31', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966809988659879938', 2, '删除用户，id： 1955218454478983170', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 18:23:38', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1966809999644762113', 2, '删除用户，id： 1955218082645544962', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 18:23:40', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1966810139340251138', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 18:24:13', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1966810195879469058', 2, '修改角色ID: ee8626f80f7c2619917b6236f3a7f02b 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 18:24:27', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1966810248954191873', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@3b58646d', NULL, 8, NULL, '2025-09-13 18:24:40', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966810256919175170', 2, '职务表-通过id查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryById()', NULL, '  id: 1958471074953363458', NULL, 3, NULL, '2025-09-13 18:24:41', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966810275571245057', 2, '职务表-编辑', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.edit()', NULL, '[{\\\"id\\\":\\\"1958471074953363458\\\",\\\"name\\\":\\\"总经理\\\",\\\"postLevel\\\":2,\\\"updateBy\\\":\\\"admin\\\",\\\"updateTime\\\":\\\"2025-09-13 18:24:45\\\"}]', NULL, 25, NULL, '2025-09-13 18:24:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966810275827097602', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@34e749c3', NULL, 3, NULL, '2025-09-13 18:24:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966810287126552579', 2, '职务表-添加', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.add()', NULL, '[{\\\"code\\\":\\\"K0v1Z6TkIi\\\",\\\"createBy\\\":\\\"admin\\\",\\\"createTime\\\":\\\"2025-09-13 18:24:48\\\",\\\"id\\\":\\\"1966810287126552578\\\",\\\"name\\\":\\\"2\\\",\\\"postLevel\\\":2,\\\"sysOrgCode\\\":\\\"A01\\\"}]', NULL, 12, NULL, '2025-09-13 18:24:49', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966810287319490562', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@6ba07fad', NULL, 3, NULL, '2025-09-13 18:24:49', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966810315605876738', 2, '职务表-通过id删除', 4, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.delete()', NULL, '  id: 1966810287126552578', NULL, 30, NULL, '2025-09-13 18:24:55', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966810315735900162', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@66596467', NULL, 6, NULL, '2025-09-13 18:24:56', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966810426704601089', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 99999  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@6e062137', NULL, 3, NULL, '2025-09-13 18:25:22', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966810595139461121', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.apache.shiro.web.servlet.ShiroHttpServletRequest@8f37310', NULL, 16, NULL, '2025-09-13 18:26:02', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966810597475688449', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@4a46cd9', NULL, 17, NULL, '2025-09-13 18:26:03', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966810613258854402', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@46d630a', NULL, 6, NULL, '2025-09-13 18:26:06', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966810619197988865', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@739396f5', NULL, 5, NULL, '2025-09-13 18:26:08', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966812023958478849', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 18:31:43', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966812045533978625', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 18:31:48', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1966812110398889986', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 18:32:03', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966812132041498626', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 18:32:09', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1966813436264464386', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 18:37:19', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1966814508924157954', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 18:41:35', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1966815526848229377', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 83, NULL, '2025-09-13 18:45:38', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966815526881783810', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 83, NULL, '2025-09-13 18:45:38', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966815526906949633', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 81, NULL, '2025-09-13 18:45:38', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966815580233330690', 2, 'online新增数据,表名:test_note,添加成功!', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"2025-09-19\\\",\\\"create_by\\\":\\\"admin\\\",\\\"sys_org_code\\\":\\\"A01\\\",\\\"create_time\\\":\\\"2025-09-13 18:45:50\\\",\\\"sex\\\":\\\"1\\\",\\\"name\\\":\\\"ceshi\\\",\\\"id\\\":\\\"1966815579977478145\\\",\\\"age\\\":0},null]', NULL, 45, NULL, '2025-09-13 18:45:51', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966815591394373633', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 12, NULL, '2025-09-13 18:45:53', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966815600974163969', 2, 'online修改数据,表名:test_note,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"2025-09-19 00:00:00\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"1\\\",\\\"begin_time\\\":\\\"\\\",\\\"sheng\\\":\\\"\\\",\\\"update_time\\\":\\\"2025-09-13 18:45:55\\\",\\\"jeecg_row_key\\\":\\\"1966815579977478145\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"\\\",\\\"name\\\":\\\"ceshi\\\",\\\"id\\\":\\\"1966815579977478145\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":11}]', NULL, 44, NULL, '2025-09-13 18:45:56', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966815706574155777', 2, '多数据源管理-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysDataSourceController.queryPageList()', NULL, '  sysDataSource: SysDataSource(id=null, code=null, name=null, remark=null, dbType=null, dbDriver=null, dbUrl=null, dbName=null, dbUsername=null, dbPassword=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@75454815', NULL, 11, NULL, '2025-09-13 18:46:21', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966815714262315009', 2, '多数据源管理-通过id查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysDataSourceController.queryById()', NULL, '  id: 1209779538310004737', NULL, 589, NULL, '2025-09-13 18:46:23', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966815800052609025', 2, '多数据源管理-编辑', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysDataSourceController.edit()', NULL, '[{\\\"code\\\":\\\"local_mysql\\\",\\\"dbDriver\\\":\\\"com.mysql.cj.jdbc.Driver\\\",\\\"dbPassword\\\":\\\"f5b6775e8d1749483f2320627de0e706\\\",\\\"dbType\\\":\\\"4\\\",\\\"dbUrl\\\":\\\"jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\\",\\\"dbUsername\\\":\\\"root\\\",\\\"id\\\":\\\"1209779538310004737\\\",\\\"name\\\":\\\"本地测试库\\\",\\\"remark\\\":\\\"本地数据库MySQL5.7\\\",\\\"updateBy\\\":\\\"admin\\\",\\\"updateTime\\\":\\\"2025-09-13 18:46:43\\\"}]', NULL, 29, NULL, '2025-09-13 18:46:43', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966815800279101441', 2, '多数据源管理-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysDataSourceController.queryPageList()', NULL, '  sysDataSource: SysDataSource(id=null, code=null, name=null, remark=null, dbType=null, dbDriver=null, dbUrl=null, dbName=null, dbUsername=null, dbPassword=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@29ce178a', NULL, 6, NULL, '2025-09-13 18:46:43', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966815844830998529', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 8, NULL, '2025-09-13 18:46:54', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966815844805832706', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 8, NULL, '2025-09-13 18:46:54', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966815844872941569', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 25, NULL, '2025-09-13 18:46:54', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966815862623236098', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.apache.shiro.web.servlet.ShiroHttpServletRequest@4aea985b', NULL, 16, NULL, '2025-09-13 18:46:58', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966815864732971010', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@2731f549', NULL, 16, NULL, '2025-09-13 18:46:58', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966815970395877378', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 99999  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@60532fdf', NULL, 14, NULL, '2025-09-13 18:47:24', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966815979518488578', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@b578393', NULL, 4, NULL, '2025-09-13 18:47:26', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966816006559166465', 2, 'online表单加载,表名:test_demo,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 24, NULL, '2025-09-13 18:47:32', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966816006559166466', 2, 'online表单加载,表名:test_demo,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 24, NULL, '2025-09-13 18:47:32', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966816006575943682', 2, 'online列表加载,表名:test_demo,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 32, NULL, '2025-09-13 18:47:32', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966816031813070849', 2, 'online表单加载,表名:test_demo,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 4, NULL, '2025-09-13 18:47:38', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966816031813070850', 2, 'online表单加载,表名:test_demo,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 4, NULL, '2025-09-13 18:47:38', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966816031863402497', 2, 'online列表加载,表名:test_demo,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 25, NULL, '2025-09-13 18:47:38', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966816384281407490', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@678f6c92', NULL, 20, NULL, '2025-09-13 18:49:02', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966816730378596354', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@40ffe9f0', NULL, 5, NULL, '2025-09-13 18:50:25', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966816793247019010', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@51c8acb9', NULL, 7, NULL, '2025-09-13 18:50:40', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966816868916457473', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 18:50:58', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1966817221883916290', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@264272be', NULL, 3, NULL, '2025-09-13 18:52:22', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966817229903425538', 2, '职务表-通过id查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryById()', NULL, '  id: 1958471074953363458', NULL, 2, NULL, '2025-09-13 18:52:24', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966817233854459905', 2, '职务表-编辑', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.edit()', NULL, '[{\\\"id\\\":\\\"1958471074953363458\\\",\\\"name\\\":\\\"总经理\\\",\\\"postLevel\\\":2,\\\"updateBy\\\":\\\"admin\\\",\\\"updateTime\\\":\\\"2025-09-13 18:52:24\\\"}]', NULL, 24, NULL, '2025-09-13 18:52:25', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966817234047397889', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@6e6bc1ac', NULL, 1, NULL, '2025-09-13 18:52:25', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966817280805498881', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@337472ba', NULL, 3, NULL, '2025-09-13 18:52:36', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966817447545860098', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@5f95bfa7', NULL, 4, NULL, '2025-09-13 18:53:16', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966817490931740673', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@678c6dc1', NULL, 5, NULL, '2025-09-13 18:53:26', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966817671769157634', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 6, NULL, '2025-09-13 18:54:09', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966817671769157635', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '', NULL, 6, NULL, '2025-09-13 18:54:09', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966817671865626625', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '', NULL, 28, NULL, '2025-09-13 18:54:09', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966817696045789185', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.apache.shiro.web.servlet.ShiroHttpServletRequest@97a7a3f', NULL, 5, NULL, '2025-09-13 18:54:15', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966817711564713986', 2, '编码校验规则-编辑', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.edit()', NULL, '[{\\\"id\\\":\\\"1224980593992388610\\\",\\\"ruleCode\\\":\\\"common\\\",\\\"ruleDescription\\\":\\\"规则：1、首位只能是字母；2、只能填写数字、大小写字母、下划线；3、最少3位数，最多12位数。\\\",\\\"ruleJson\\\":\\\"[{\\\\\\\"digits\\\\\\\":1,\\\\\\\"pattern\\\\\\\":\\\\\\\"^[a-z|A-Z]$\\\\\\\",\\\\\\\"message\\\\\\\":\\\\\\\"第一位只能是字母\\\\\\\"},{\\\\\\\"digits\\\\\\\":\\\\\\\"*\\\\\\\",\\\\\\\"pattern\\\\\\\":\\\\\\\"^[0-9|a-z|A-Z|_]{0,}$\\\\\\\",\\\\\\\"message\\\\\\\":\\\\\\\"只能填写数字、大小写字母、下划线\\\\\\\"},{\\\\\\\"digits\\\\\\\":\\\\\\\"*\\\\\\\",\\\\\\\"pattern\\\\\\\":\\\\\\\"^.{3,}$\\\\\\\",\\\\\\\"message\\\\\\\":\\\\\\\"最少输入3位数\\\\\\\"},{\\\\\\\"digits\\\\\\\":\\\\\\\"*\\\\\\\",\\\\\\\"pattern\\\\\\\":\\\\\\\"^.{3,12}$\\\\\\\",\\\\\\\"message\\\\\\\":\\\\\\\"最多输入12位数\\\\\\\"}]\\\",\\\"ruleName\\\":\\\"通用编码规则\\\",\\\"updateBy\\\":\\\"admin\\\",\\\"updateTime\\\":\\\"2025-09-13 18:54:18\\\"}]', NULL, 21, NULL, '2025-09-13 18:54:19', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966817711870898178', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.apache.shiro.web.servlet.ShiroHttpServletRequest@4887e9fd', NULL, 3, NULL, '2025-09-13 18:54:19', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966817734960541697', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@4598c2e', NULL, 2, NULL, '2025-09-13 18:54:24', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966819337125900290', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 99999  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@24a77d26', NULL, 72, NULL, '2025-09-13 19:00:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966819427794169857', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 99999  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@30abf942', NULL, 6, NULL, '2025-09-13 19:01:08', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966819533176057857', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 99999  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@9a0e0e8', NULL, 6, NULL, '2025-09-13 19:01:33', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966819581976784897', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 99999  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@36febdec', NULL, 3, NULL, '2025-09-13 19:01:45', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966823124980871170', 2, '多数据源管理-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysDataSourceController.queryPageList()', NULL, '  sysDataSource: SysDataSource(id=null, code=null, name=null, remark=null, dbType=null, dbDriver=null, dbUrl=null, dbName=null, dbUsername=null, dbPassword=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.apache.shiro.web.servlet.ShiroHttpServletRequest@114a3b4a', NULL, 31, NULL, '2025-09-13 19:15:49', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1966825271457886209', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 19:24:21', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1966825546339987458', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 19:25:27', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1966825746592837634', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 19:26:15', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1966827156667510786', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 19:31:51', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1966827247478386690', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 19:32:12', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1966827300037210114', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-09-13 19:32:25', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1991698611943043074', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '192.168.1.2', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-21 10:42:08', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1992541672457691137', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-23 18:32:09', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1992882788830838786', 4, 'jakarta.servlet.ServletException:Handler dispatch failed: java.lang.NoSuchMethodError: \\'void org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream.putArchiveEntry(org.apache.commons.compress.archivers.zip.ZipArchiveEntry)\\'', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/jmreport/export/word', 'jakarta.servlet.ServletException: Handler dispatch failed: java.lang.NoSuchMethodError: \\'void org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream.putArchiveEntry(org.apache.commons.compress.archivers.zip.ZipArchiveEntry)\\'\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1104)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.lang.NoSuchMethodError: \\'void org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream.putArchiveEntry(org.apache.commons.compress.archivers.zip.ZipArchiveEntry)\\'\\r\\n\tat org.apache.poi.openxml4j.opc.internal.ZipContentTypeManager.saveImpl(ZipContentTypeManager.java:67)\\r\\n\tat org.apache.poi.openxml4j.opc.internal.ContentTypeManager.save(ContentTypeManager.java:450)\\r\\n\tat org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:674)\\r\\n\tat org.apache.poi.openxml4j.opc.OPCPackage.save(OPCPackage.java:1700)\\r\\n\tat org.apache.poi.ooxml.POIXMLDocument.write(POIXMLDocument.java:227)\\r\\n\tat org.jeecg.modules.jmreport.b.a.b.a.a(PoiWordExportHandler.java:86)\\r\\n\tat org.jeecg.modules.jmreport.desreport.b.a.d(DesignReportController.java:2592)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\t... 75 more\\r\\n', NULL, NULL, NULL, '2025-11-24 17:07:37', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1992882788902141954', 4, 'org.springframework.http.converter.HttpMessageNotWritableException:No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'application/vnd.openxmlformats-officedocument.wordprocessingml.document\\'', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/error', 'org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'application/vnd.openxmlformats-officedocument.wordprocessingml.document\\'\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:365)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:263)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ResponseEntityReturnValueHandler.handleReturnValue(ResponseEntityReturnValueHandler.java:79)\\r\\n\tat org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:136)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:612)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:396)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:323)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:268)\\r\\n\tat org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:377)\\r\\n\tat org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:209)\\r\\n\tat org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:286)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:150)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-11-24 17:07:38', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993219894132453378', 4, 'org.springframework.jdbc.BadSqlGrammarException:\\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'last_pwd_update_time\\' in \\'field list\\'\\r\\n### The error may exist in org/jeecg/modules/system/mapper/SysUserMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, username, realname, password, salt, avatar, birthday, sex, email, phone, org_code, login_tenant_id, status, del_flag, work_no, telephone, create_by, create_time, update_by, update_time, activiti_sync, user_identity, depart_ids, client_id, bpm_status, sign, sign_enable, main_dep_post_id, position_type, last_pwd_update_time, sort, iz_hide_contact FROM sys_user WHERE del_flag = 0 AND (username = ?)\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'last_pwd_update_time\\' in \\'field list\\'\\n; bad SQL grammar []', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/sys/login', 'org.springframework.jdbc.BadSqlGrammarException: \\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'last_pwd_update_time\\' in \\'field list\\'\\r\\n### The error may exist in org/jeecg/modules/system/mapper/SysUserMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT id, username, realname, password, salt, avatar, birthday, sex, email, phone, org_code, login_tenant_id, status, del_flag, work_no, telephone, create_by, create_time, update_by, update_time, activiti_sync, user_identity, depart_ids, client_id, bpm_status, sign, sign_enable, main_dep_post_id, position_type, last_pwd_update_time, sort, iz_hide_contact FROM sys_user WHERE del_flag = 0 AND (username = ?)\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Unknown column \\'last_pwd_update_time\\' in \\'field list\\'\\n; bad SQL grammar []\\r\\n\tat org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:246)\\r\\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107)\\r\\n\tat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:93)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:347)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy179.selectList(Unknown Source)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:194)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy191.selectList(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.core.mapper.BaseMapper.selectOne(BaseMapper.java:332)\\r\\n\tat java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:182)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy191.selectOne(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.AbstractRepository.getOne(AbstractRepository.java:78)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository.getOne(IRepository.java:221)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)\\r\\n\tat org.jeecg.modules.system.service.impl.SysUserServiceImpl$$SpringCGLIB$$0.getOne(<generated>)\\r\\n\tat org.jeecg.modules.system.controller.LoginController.login(LoginController.java:105)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:649)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:631)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)\\r\\n\tat org.jeecg.modules.system.controller.LoginController$$SpringCGLIB$$0.login(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.sql.SQLSyntaxErrorException: Unknown column \\'last_pwd_update_time\\' in \\'field list\\'\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:371)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3462)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:158)\\r\\n\tat com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\\r\\n\tat org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\\r\\n\tat org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy383.query(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\\r\\n\tat org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy382.query(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy382.query(Unknown Source)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333)\\r\\n\t... 133 more\\r\\n', NULL, NULL, NULL, '2025-11-25 15:27:10', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993224498702254081', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-25 15:45:27', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993226530251145218', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@729d3424', NULL, 17, NULL, '2025-11-25 15:53:32', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993226548701888514', 2, '角色首页配置-编辑', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.edit()', NULL, '[{\\\"component\\\":\\\"dashboard/Analysis\\\",\\\"id\\\":\\\"1803082647166652418\\\",\\\"priority\\\":0,\\\"relationType\\\":\\\"DEFAULT\\\",\\\"roleCode\\\":\\\"DEF_INDEX_ALL\\\",\\\"route\\\":true,\\\"status\\\":\\\"0\\\",\\\"updateBy\\\":\\\"admin\\\",\\\"updateTime\\\":\\\"2025-11-25 15:53:36\\\",\\\"url\\\":\\\"/dashboard/analysis\\\"},null]', NULL, 8, NULL, '2025-11-25 15:53:36', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993226549062598657', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@63dd7a07', NULL, 10, NULL, '2025-11-25 15:53:36', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993226570550018049', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@3d09bf78', NULL, 6, NULL, '2025-11-25 15:53:41', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993226656659079170', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@3b3b818e', NULL, 7, NULL, '2025-11-25 15:54:02', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993227273502785538', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@41621957', NULL, 7, NULL, '2025-11-25 15:56:29', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993227734549069826', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@44ec695c', NULL, 6, NULL, '2025-11-25 15:58:19', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993227791801319426', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@61f14813', NULL, 4, NULL, '2025-11-25 15:58:33', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993228128264192001', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@6f7f4c27', NULL, 9, NULL, '2025-11-25 15:59:53', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993228363791138818', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-25 16:00:49', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993229494818766850', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@70082ab1', NULL, 21, NULL, '2025-11-25 16:05:19', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993231236457340929', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-25 16:12:14', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993231254622871553', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-25 16:12:18', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993231820627419138', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-25 16:14:33', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993231839149465602', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-25 16:14:38', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993231989422989313', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@1f8b47f4', NULL, 17, NULL, '2025-11-25 16:15:13', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993232055638466562', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@485a7ba2', NULL, 8, NULL, '2025-11-25 16:15:29', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993233071117205505', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-25 16:19:31', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993233122031861762', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@20163e17', NULL, 182, NULL, '2025-11-25 16:19:43', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993233443080667138', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-25 16:21:00', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993233719632101378', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@273f6abd', NULL, 47, NULL, '2025-11-25 16:22:06', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993239431284260865', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@4d6d4ca7', NULL, 87, NULL, '2025-11-25 16:44:48', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993240592603152386', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@550d0de5', NULL, 9, NULL, '2025-11-25 16:49:25', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993240596084424705', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@1abe4d0b', NULL, 15, NULL, '2025-11-25 16:49:25', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993240622298824705', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@c7fd7a0', NULL, 7, NULL, '2025-11-25 16:49:32', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993240984980291586', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 99999  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@2103d9d1', NULL, 14, NULL, '2025-11-25 16:50:58', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993244089369231361', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@5fe76eba', NULL, 15, NULL, '2025-11-25 17:03:18', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993244381510893569', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-25 17:04:28', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993277485441150978', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@788d1333', NULL, 14, NULL, '2025-11-25 19:16:00', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993277488586878978', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@1acedeaa', NULL, 12, NULL, '2025-11-25 19:16:01', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993277556819816449', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@1d0931ea', NULL, 9, NULL, '2025-11-25 19:16:18', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993277580098203649', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@693b4e2', NULL, 8, NULL, '2025-11-25 19:16:23', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993277601841475585', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 99999  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@7baa3644', NULL, 5, NULL, '2025-11-25 19:16:28', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993277697777790977', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@7d90d12f', NULL, 4, NULL, '2025-11-25 19:16:51', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993277712260722690', 2, '多数据源管理-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysDataSourceController.queryPageList()', NULL, '  sysDataSource: SysDataSource(id=null, code=null, name=null, remark=null, dbType=null, dbDriver=null, dbUrl=null, dbName=null, dbUsername=null, dbPassword=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@c43940a', NULL, 13, NULL, '2025-11-25 19:16:55', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993277942548983809', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@5426a513', NULL, 7, NULL, '2025-11-25 19:17:49', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993337055203147777', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-25 23:12:43', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993337992651063298', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-25 23:16:27', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993338064654680066', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-25 23:16:44', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993339076761206785', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-25 23:20:45', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993339858973736962', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-25 23:23:52', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993339890414239746', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-25 23:23:59', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993339930075578369', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@5cfb758f', NULL, 13, NULL, '2025-11-25 23:24:08', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993341817709510659', 2, 'online表单加载,表名:aaa_01,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: c836137ed6e94463b35b21db80f74ad4  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@15556d3a', NULL, 31, NULL, '2025-11-25 23:31:38', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993341817713704961', 2, 'online列表加载,表名:aaa_01,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: c836137ed6e94463b35b21db80f74ad4  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@479c0246', NULL, 37, NULL, '2025-11-25 23:31:39', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993341817709510658', 2, 'online表单加载,表名:aaa_01,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: c836137ed6e94463b35b21db80f74ad4  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@24c58924', NULL, 35, NULL, '2025-11-25 23:31:38', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993341836453855233', 2, 'online新增数据,表名:aaa_01,添加成功!', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"c836137ed6e94463b35b21db80f74ad4\\\",{\\\"aaa\\\":\\\"11\\\",\\\"create_by\\\":\\\"admin\\\",\\\"create_time\\\":\\\"2025-11-25 23:31:42\\\",\\\"ddd\\\":\\\"2025-10-30\\\",\\\"id\\\":\\\"1993341836277694465\\\"},null]', NULL, 37, NULL, '2025-11-25 23:31:43', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993341844930543617', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: c836137ed6e94463b35b21db80f74ad4  id: 1993341836277694465', NULL, 9, NULL, '2025-11-25 23:31:45', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993341858289401858', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.d()', NULL, '  code: c836137ed6e94463b35b21db80f74ad4  id: 1993341836277694465', NULL, 10, NULL, '2025-11-25 23:31:48', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993350355680870401', 4, 'org.springframework.web.bind.MissingServletRequestParameterException:Required request parameter \\'id\\' for method parameter type String is not present', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1764086734056', '/jeecg-boot/sys/tenant/queryById', 'org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter \\'id\\' for method parameter type String is not present\\r\\n\tat org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValueInternal(RequestParamMethodArgumentResolver.java:220)\\r\\n\tat org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:196)\\r\\n\tat org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:125)\\r\\n\tat org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:227)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:181)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-11-26 00:05:34', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993514250840174594', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@3eb4485e', NULL, 26, NULL, '2025-11-26 10:56:50', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993519814194311170', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-26 11:18:56', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993520115299201026', 4, 'java.lang.IllegalArgumentException:URI is not absolute', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'id=1993520100581388289&_t=1764127207899', '/jeecg-boot/sys/annountCement/doReleaseData', 'java.lang.IllegalArgumentException: URI is not absolute\\r\\n\tat java.base/java.net.URL.fromURI(URL.java:721)\\r\\n\tat java.base/java.net.URI.toURL(URI.java:1139)\\r\\n\tat org.springframework.http.client.SimpleClientHttpRequestFactory.createRequest(SimpleClientHttpRequestFactory.java:142)\\r\\n\tat org.springframework.http.client.support.HttpAccessor.createRequest(HttpAccessor.java:124)\\r\\n\tat org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:884)\\r\\n\tat org.springframework.web.client.RestTemplate.execute(RestTemplate.java:801)\\r\\n\tat org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:549)\\r\\n\tat org.jeecg.modules.system.service.impl.SysBaseApiImpl.uniPushMsgToUser(SysBaseApiImpl.java:2153)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:724)\\r\\n\tat org.jeecg.modules.system.service.impl.SysBaseApiImpl$$SpringCGLIB$$0.uniPushMsgToUser(<generated>)\\r\\n\tat org.jeecg.modules.system.controller.SysAnnouncementController.doReleaseData(SysAnnouncementController.java:310)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor111.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:649)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:631)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)\\r\\n\tat org.jeecg.modules.system.controller.SysAnnouncementController$$SpringCGLIB$$0.doReleaseData(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-11-26 11:20:08', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993520300268007425', 4, 'java.lang.IllegalArgumentException:URI is not absolute', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'id=1993520281771126785&_t=1764127252022', '/jeecg-boot/sys/annountCement/doReleaseData', 'java.lang.IllegalArgumentException: URI is not absolute\\r\\n\tat java.base/java.net.URL.fromURI(URL.java:721)\\r\\n\tat java.base/java.net.URI.toURL(URI.java:1139)\\r\\n\tat org.springframework.http.client.SimpleClientHttpRequestFactory.createRequest(SimpleClientHttpRequestFactory.java:142)\\r\\n\tat org.springframework.http.client.support.HttpAccessor.createRequest(HttpAccessor.java:124)\\r\\n\tat org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:884)\\r\\n\tat org.springframework.web.client.RestTemplate.execute(RestTemplate.java:801)\\r\\n\tat org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:549)\\r\\n\tat org.jeecg.modules.system.service.impl.SysBaseApiImpl.uniPushMsgToUser(SysBaseApiImpl.java:2153)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:724)\\r\\n\tat org.jeecg.modules.system.service.impl.SysBaseApiImpl$$SpringCGLIB$$0.uniPushMsgToUser(<generated>)\\r\\n\tat org.jeecg.modules.system.controller.SysAnnouncementController.doReleaseData(SysAnnouncementController.java:310)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor111.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:649)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:631)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)\\r\\n\tat org.jeecg.modules.system.controller.SysAnnouncementController$$SpringCGLIB$$0.doReleaseData(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-11-26 11:20:52', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993532089705697282', 2, '修改角色ID: f6817f48af4fb3af11b9e8bf182f618b 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-26 12:07:43', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993532116092063747', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-26 12:07:49', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993532192269012994', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-26 12:08:07', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993532373777518594', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-26 12:08:51', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993532400373600257', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-26 12:08:57', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993532463099416579', 2, '修改角色ID: f6817f48af4fb3af11b9e8bf182f618b 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-26 12:09:12', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993878908260438018', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-27 11:05:51', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993886527180099585', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@3230b93d', NULL, 44, NULL, '2025-11-27 11:36:07', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993886527180099586', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@20fbfbe6', NULL, 48, NULL, '2025-11-27 11:36:07', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993886527180099587', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@7b91edfa', NULL, 52, NULL, '2025-11-27 11:36:07', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993886566585585666', 2, 'online新增数据,表名:test_note,添加成功!', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"2025-11-27\\\",\\\"create_by\\\":\\\"admin\\\",\\\"create_time\\\":\\\"2025-11-27 11:36:16\\\",\\\"sex\\\":\\\"1\\\",\\\"long_ids\\\":\\\"222\\\",\\\"id\\\":\\\"1993886566258429953\\\",\\\"age\\\":0},null]', NULL, 69, NULL, '2025-11-27 11:36:17', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993886577314615297', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.d()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  id: 1993886566258429953', NULL, 27, NULL, '2025-11-27 11:36:19', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993886592850317313', 2, 'online删除数据,表名:test_note,删除成功!', 4, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.h()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  id: 1993886566258429953', NULL, 47, NULL, '2025-11-27 11:36:23', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993940662130585601', 2, '添加用户，username： zhagnsan', 2, NULL, NULL, '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-27 15:11:14', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993941658281979906', 2, '批量删除用户， ids： 1993940662113808386', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-27 15:15:12', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993942361465532417', 2, '添加用户，username： lisi', 2, NULL, NULL, '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-27 15:17:59', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993956624749932545', 4, 'org.jeecg.modules.airag.flow.d.a:节点[脚本执行]：请引入com.yomahub:liteflow-script-graaljs依赖包', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/airag/flow/run', 'org.jeecg.modules.airag.flow.d.a: 节点[脚本执行]：请引入com.yomahub:liteflow-script-graaljs依赖包\\r\\n\tat org.jeecg.modules.airag.flow.component.code.CodeNode.a(CodeNode.java:62)\\r\\n\tat org.jeecg.modules.airag.flow.service.a.c.a(AiragFlowServiceImpl.java:206)\\r\\n\tat java.base/java.lang.Iterable.forEach(Iterable.java:75)\\r\\n\tat org.jeecg.modules.airag.flow.service.a.c.a(AiragFlowServiceImpl.java:200)\\r\\n\tat org.jeecg.modules.airag.flow.service.a.c.runFlow(AiragFlowServiceImpl.java:144)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:724)\\r\\n\tat org.jeecg.modules.airag.flow.service.a.c$$SpringCGLIB$$0.runFlow(<generated>)\\r\\n\tat org.jeecg.modules.airag.flow.c.a.a(AiragFlowController.java:264)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)\\r\\n\tat org.jeecg.modules.airag.flow.c.a$$SpringCGLIB$$0.a(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362)\\r\\n\tat org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-11-27 16:14:40', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993957072395415553', 4, 'org.jeecg.modules.airag.flow.d.a:节点[脚本执行]：请引入com.yomahub:liteflow-script-graaljs依赖包', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/airag/flow/run', 'org.jeecg.modules.airag.flow.d.a: 节点[脚本执行]：请引入com.yomahub:liteflow-script-graaljs依赖包\\r\\n\tat org.jeecg.modules.airag.flow.component.code.CodeNode.a(CodeNode.java:62)\\r\\n\tat org.jeecg.modules.airag.flow.service.a.c.a(AiragFlowServiceImpl.java:206)\\r\\n\tat java.base/java.lang.Iterable.forEach(Iterable.java:75)\\r\\n\tat org.jeecg.modules.airag.flow.service.a.c.a(AiragFlowServiceImpl.java:200)\\r\\n\tat org.jeecg.modules.airag.flow.service.a.c.runFlow(AiragFlowServiceImpl.java:144)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:724)\\r\\n\tat org.jeecg.modules.airag.flow.service.a.c$$SpringCGLIB$$0.runFlow(<generated>)\\r\\n\tat org.jeecg.modules.airag.flow.c.a.a(AiragFlowController.java:264)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)\\r\\n\tat org.jeecg.modules.airag.flow.c.a$$SpringCGLIB$$0.a(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362)\\r\\n\tat org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-11-27 16:16:27', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993957229543419905', 4, 'org.jeecg.modules.airag.flow.d.a:节点[脚本执行]：请引入com.yomahub:liteflow-script-graaljs依赖包', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/airag/flow/run', 'org.jeecg.modules.airag.flow.d.a: 节点[脚本执行]：请引入com.yomahub:liteflow-script-graaljs依赖包\\r\\n\tat org.jeecg.modules.airag.flow.component.code.CodeNode.a(CodeNode.java:62)\\r\\n\tat org.jeecg.modules.airag.flow.service.a.c.a(AiragFlowServiceImpl.java:206)\\r\\n\tat java.base/java.lang.Iterable.forEach(Iterable.java:75)\\r\\n\tat org.jeecg.modules.airag.flow.service.a.c.a(AiragFlowServiceImpl.java:200)\\r\\n\tat org.jeecg.modules.airag.flow.service.a.c.runFlow(AiragFlowServiceImpl.java:144)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:724)\\r\\n\tat org.jeecg.modules.airag.flow.service.a.c$$SpringCGLIB$$0.runFlow(<generated>)\\r\\n\tat org.jeecg.modules.airag.flow.c.a.a(AiragFlowController.java:264)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)\\r\\n\tat org.jeecg.modules.airag.flow.c.a$$SpringCGLIB$$0.a(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362)\\r\\n\tat org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-11-27 16:17:04', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993963528284823553', 4, 'org.jeecg.modules.airag.flow.d.a:节点[脚本执行]：请引入com.yomahub:liteflow-script-graaljs依赖包', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/airag/flow/run', 'org.jeecg.modules.airag.flow.d.a: 节点[脚本执行]：请引入com.yomahub:liteflow-script-graaljs依赖包\\r\\n\tat org.jeecg.modules.airag.flow.component.code.CodeNode.a(CodeNode.java:62)\\r\\n\tat org.jeecg.modules.airag.flow.service.a.c.a(AiragFlowServiceImpl.java:206)\\r\\n\tat java.base/java.lang.Iterable.forEach(Iterable.java:75)\\r\\n\tat org.jeecg.modules.airag.flow.service.a.c.a(AiragFlowServiceImpl.java:200)\\r\\n\tat org.jeecg.modules.airag.flow.service.a.c.runFlow(AiragFlowServiceImpl.java:144)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:724)\\r\\n\tat org.jeecg.modules.airag.flow.service.a.c$$SpringCGLIB$$0.runFlow(<generated>)\\r\\n\tat org.jeecg.modules.airag.flow.c.a.a(AiragFlowController.java:264)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)\\r\\n\tat org.jeecg.modules.airag.flow.c.a$$SpringCGLIB$$0.a(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362)\\r\\n\tat org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2025-11-27 16:42:06', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993974290558586882', 4, 'java.lang.RuntimeException:java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence near index 4\\r\\n^D:\\\\opt\\\\upFiles\\r\\n    ^', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'knowId=1993971013594931202', '/jeecg-boot/airag/knowledge/doc/import/zip', 'java.lang.RuntimeException: java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence near index 4\\r\\n^D:\\\\opt\\\\upFiles\\r\\n    ^\\r\\n\tat org.jeecg.modules.airag.llm.service.impl.AiragKnowledgeDocServiceImpl.importDocumentFromZip(AiragKnowledgeDocServiceImpl.java:352)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380)\\r\\n\tat org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)\\r\\n\tat org.jeecg.modules.airag.llm.service.impl.AiragKnowledgeDocServiceImpl$$SpringCGLIB$$0.importDocumentFromZip(<generated>)\\r\\n\tat org.jeecg.modules.airag.llm.controller.AiragKnowledgeController.importDocumentFromZip(AiragKnowledgeController.java:223)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:649)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:631)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173)\\r\\n\tat org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor$1.proceed(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:89)\\r\\n\tat org.apache.shiro.authz.aop.AuthorizingMethodInterceptor.invoke(AuthorizingMethodInterceptor.java:39)\\r\\n\tat org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor.invoke(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:123)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)\\r\\n\tat org.jeecg.modules.airag.llm.controller.AiragKnowledgeController$$SpringCGLIB$$0.importDocumentFromZip(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence near index 4\\r\\n^D:\\\\opt\\\\upFiles\\r\\n    ^\\r\\n\tat java.base/java.util.regex.Pattern.error(Pattern.java:2028)\\r\\n\tat java.base/java.util.regex.Pattern.escape(Pattern.java:2608)\\r\\n\tat java.base/java.util.regex.Pattern.atom(Pattern.java:2286)\\r\\n\tat java.base/java.util.regex.Pattern.sequence(Pattern.java:2210)\\r\\n\tat java.base/java.util.regex.Pattern.expr(Pattern.java:2069)\\r\\n\tat java.base/java.util.regex.Pattern.compile(Pattern.java:1783)\\r\\n\tat java.base/java.util.regex.Pattern.<init>(Pattern.java:1430)\\r\\n\tat java.base/java.util.regex.Pattern.compile(Pattern.java:1069)\\r\\n\tat java.base/java.lang.String.replaceFirst(String.java:2902)\\r\\n\tat org.jeecg.modules.airag.llm.service.impl.AiragKnowledgeDocServiceImpl.lambda$importDocumentFromZip$7(AiragKnowledgeDocServiceImpl.java:333)\\r\\n\tat org.jeecg.modules.airag.llm.service.impl.AiragKnowledgeDocServiceImpl.unzipFile(AiragKnowledgeDocServiceImpl.java:420)\\r\\n\tat org.jeecg.modules.airag.llm.service.impl.AiragKnowledgeDocServiceImpl.unzipFile(AiragKnowledgeDocServiceImpl.java:369)\\r\\n\tat org.jeecg.modules.airag.llm.service.impl.AiragKnowledgeDocServiceImpl.importDocumentFromZip(AiragKnowledgeDocServiceImpl.java:315)\\r\\n\t... 124 more\\r\\n', NULL, NULL, NULL, '2025-11-27 17:24:52', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993986792180719617', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@61c2d303', NULL, 44, NULL, '2025-11-27 18:14:32', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993986793908772865', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@21f22436', NULL, 26, NULL, '2025-11-27 18:14:33', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993986795020263425', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@6ad167da', NULL, 2, NULL, '2025-11-27 18:14:33', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993988059665805315', 2, 'online表单加载,表名:test_order_main,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 56870166aba54ebfacb20ba6c770bd73  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@fea6b69', NULL, 99, NULL, '2025-11-27 18:19:35', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993988059665805313', 2, 'online表单加载,表名:test_order_main,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 56870166aba54ebfacb20ba6c770bd73  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@308a6dbe', NULL, 98, NULL, '2025-11-27 18:19:35', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993988059665805314', 2, 'online列表加载,表名:test_order_main,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.d()', NULL, '  code: 56870166aba54ebfacb20ba6c770bd73', NULL, 128, NULL, '2025-11-27 18:19:35', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993988060009738242', 2, 'online表单加载,表名:test_order_product,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: deea5a8ec619460c9245ba85dbc59e80  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@55f694ee', NULL, 20, NULL, '2025-11-27 18:19:35', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993988060009738241', 2, 'online表单加载,表名:test_order_product,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: deea5a8ec619460c9245ba85dbc59e80  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@2df566d9', NULL, 22, NULL, '2025-11-27 18:19:35', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993988060076847106', 2, 'online表单加载,表名:test_order_customer,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 41de7884bf9a42b7a2c5918f9f765dff  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@7cac872d', NULL, 24, NULL, '2025-11-27 18:19:35', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993988060076847107', 2, 'online表单加载,表名:test_order_customer,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 41de7884bf9a42b7a2c5918f9f765dff  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@21ae9256', NULL, 33, NULL, '2025-11-27 18:19:35', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993988117865967617', 2, 'online列表加载,表名:test_order_main,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 56870166aba54ebfacb20ba6c770bd73  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@666cfafa', NULL, 15, NULL, '2025-11-27 18:19:48', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993988118000185346', 2, 'online表单加载,表名:test_order_main,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 56870166aba54ebfacb20ba6c770bd73  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@cd058e0', NULL, 49, NULL, '2025-11-27 18:19:49', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993988118000185347', 2, 'online表单加载,表名:test_order_main,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 56870166aba54ebfacb20ba6c770bd73  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@61924611', NULL, 53, NULL, '2025-11-27 18:19:49', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993988124874649602', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 56870166aba54ebfacb20ba6c770bd73  id: 1833472350097121281', NULL, 61, NULL, '2025-11-27 18:19:50', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993988133556858881', 2, 'online修改数据,表名:test_order_main,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"56870166aba54ebfacb20ba6c770bd73\\\",{\\\"order_code\\\":\\\"CN2024091019472568\\\",\\\"test_order_product\\\":[{\\\"create_by\\\":\\\"admin\\\",\\\"update_time\\\":\\\"2025-04-02 22:36:32\\\",\\\"descc\\\":\\\"\\\",\\\"jeecg_row_key\\\":\\\"1907442008848031746\\\",\\\"create_time\\\":\\\"2025-11-27 18:19:52\\\",\\\"order_fk_id\\\":\\\"1833472350097121281\\\",\\\"price\\\":1,\\\"num\\\":22,\\\"pro_type\\\":\\\"1\\\",\\\"id\\\":\\\"1907442008848031746\\\",\\\"update_by\\\":\\\"admin\\\",\\\"product_name\\\":\\\"1\\\"}],\\\"order_date\\\":\\\"\\\",\\\"descc\\\":\\\"\\\",\\\"update_time\\\":\\\"2025-11-27 18:19:52\\\",\\\"xiala\\\":\\\"\\\",\\\"id\\\":\\\"1833472350097121281\\\",\\\"update_by\\\":\\\"admin\\\",\\\"test_order_customer\\\":\\\"\\\"}]', NULL, 78, NULL, '2025-11-27 18:19:52', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993989824599666690', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-27 18:26:35', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993989887270957057', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-27 18:26:50', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993989986621435905', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-27 18:27:14', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993990020519800833', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-27 18:27:22', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993990062647390210', 2, '删除用户，id： 1993942361364869121', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-27 18:27:32', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993990110202408961', 2, '编辑用户，username： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-27 18:27:43', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993990235020701698', 2, '编辑用户，username： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-27 18:28:13', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993990276921798658', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-27 18:28:23', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993990295481593857', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-27 18:28:28', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993990380227506178', 2, '编辑用户，username： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-27 18:28:48', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993990934110515202', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@104d375c', NULL, 99, NULL, '2025-11-27 18:31:00', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993993220350128129', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@46006b72', NULL, 20, NULL, '2025-11-27 18:40:05', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993993259118080001', 2, '编辑用户，username： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-27 18:40:14', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1993993270212014081', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-27 18:40:17', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1993993307381936129', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-27 18:40:26', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1994221554447179778', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-28 09:47:24', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1994221985936203777', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-28 09:49:07', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1994302211463241729', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '172.28.208.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-28 15:07:54', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995371606017015810', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-01 13:57:18', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995371961282953217', 2, '职务表-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysPositionController.queryPageList()', NULL, '  sysPosition: SysPosition(id=null, code=null, name=null, postLevel=null, companyId=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@13d8a219', NULL, 22, NULL, '2025-12-01 13:58:42', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995373087231307777', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-01 14:03:11', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995373105824657409', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-01 14:03:15', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995373168957321217', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-01 14:03:30', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995391198043041794', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-01 15:15:09', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995391279496425474', 2, '修改角色ID: f6817f48af4fb3af11b9e8bf182f618b 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-01 15:15:28', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995391337268768770', 2, '修改角色ID: f6817f48af4fb3af11b9e8bf182f618b 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-01 15:15:42', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995800594048118786', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 18:21:56', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995800621315289089', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 18:22:03', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995803509802459138', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 18:33:32', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995804077744742402', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 18:35:47', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995804650409861121', 1, '用户名: admin,退出成功！', NULL, 'admin', 'admin', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 18:38:04', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995804670479605761', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 18:38:08', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995808807191613442', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 18:54:35', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995808839328370690', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 18:54:42', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995811455454277634', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 19:05:06', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995812293329416194', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@765fcac7', NULL, 33, NULL, '2025-12-02 19:08:26', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995860659341914113', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:20:37', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995860790002872322', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@51080349', NULL, 14, NULL, '2025-12-02 22:21:08', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995863165124067329', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:30:35', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995863180710100993', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:30:38', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995863187727171585', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@2429c1e8', NULL, 96, NULL, '2025-12-02 22:30:40', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995863241565257729', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:30:53', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995863246258683905', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@4e22e6db', NULL, 8, NULL, '2025-12-02 22:30:54', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995863434465390593', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:31:39', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995863451171303425', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:31:43', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995863478497193986', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:31:49', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995863506716471298', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:31:56', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995863517491638273', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@271c052e', NULL, 66, NULL, '2025-12-02 22:31:59', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995863980412772354', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:33:49', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995864087409467394', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:34:14', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995864261611495426', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:34:56', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995864288593453057', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@259d84a6', NULL, 87, NULL, '2025-12-02 22:35:02', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995864369480605698', 1, '用户名: jeecg,登录成功！', NULL, 'jeecg', 'jeecg', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:35:22', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995864409666232322', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:35:31', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995864516205748226', 1, '用户名: jeecg,登录成功！', NULL, 'jeecg', 'jeecg', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:35:57', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995864579594264577', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:36:12', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995864614566371330', 1, '用户名: jeecg,退出成功！', NULL, 'jeecg', 'jeecg', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:36:20', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995864633780477953', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:36:25', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995864649194545154', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@7b447592', NULL, 18, NULL, '2025-12-02 22:36:28', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995865395541671938', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@60527a4a', NULL, 89, NULL, '2025-12-02 22:39:26', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995865406404919297', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:39:29', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995865424562061313', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:39:33', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995865429507145730', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@5433078f', NULL, 20, NULL, '2025-12-02 22:39:34', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995865451246223362', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:39:40', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995865477989105666', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:39:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995865503687606273', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:39:52', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1995865508230037506', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@917586d', NULL, 20, NULL, '2025-12-02 22:39:53', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1995865532271788034', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-02 22:39:59', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1996175644232376322', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-03 19:12:15', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1996175712033300481', 2, '编辑用户，username： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-03 19:12:32', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1996175762926985217', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-03 19:12:44', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1996175776608804866', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@42d5e121', NULL, 21, NULL, '2025-12-03 19:12:47', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1996176746671628290', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-03 19:16:38', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1996176959243149314', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-03 19:17:29', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1996177018986815490', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@4c817f7c', NULL, 6, NULL, '2025-12-03 19:17:43', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1996177711986499586', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-03 19:20:28', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1996178099229810689', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-03 19:22:01', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1996178139545460738', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-03 19:22:10', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1996178826002030594', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-03 19:24:54', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1996179141321416705', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-03 19:26:09', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1996179282229059585', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-03 19:26:43', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1996463287717433345', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-04 14:15:15', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1996463828690374658', 2, '修改角色ID: 1996463539853824001 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-04 14:17:24', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1996789427157913602', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-05 11:51:13', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1998219872567361537', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-09 10:35:17', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1998219899046002690', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@4280649', NULL, 12, NULL, '2025-12-09 10:35:24', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1998242544999321602', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-09 12:05:23', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('1998242571230498817', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-09 12:05:29', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1998243410003111938', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-09 12:08:49', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('1998660530545360897', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-10 15:46:18', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2000384098396278785', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-15 09:55:09', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010929136633143297', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-13 12:17:22', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010929177896706049', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@4a86a2ea', NULL, 17, NULL, '2026-01-13 12:17:32', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010966953996353538', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-13 14:47:38', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010966954499670018', 4, 'java.lang.ClassCastException:class java.util.ArrayList cannot be cast to class org.jeecg.modules.system.entity.SysRoleIndex (java.util.ArrayList is in module java.base of loader \\'bootstrap\\'; org.jeecg.modules.system.entity.SysRoleIndex is in unnamed module of loader \\'app\\')', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1768286858470', '/jeecg-boot/sys/user/getUserInfo', 'java.lang.ClassCastException: class java.util.ArrayList cannot be cast to class org.jeecg.modules.system.entity.SysRoleIndex (java.util.ArrayList is in module java.base of loader \\'bootstrap\\'; org.jeecg.modules.system.entity.SysRoleIndex is in unnamed module of loader \\'app\\')\\r\\n\tat org.jeecg.modules.system.service.impl.SysRoleIndexServiceImpl$$SpringCGLIB$$0.queryDefaultIndex(<generated>)\\r\\n\tat org.jeecg.modules.system.service.impl.SysUserServiceImpl.getDynamicIndexByUserRole(SysUserServiceImpl.java:423)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.system.service.impl.SysUserServiceImpl$$SpringCGLIB$$0.getDynamicIndexByUserRole(<generated>)\\r\\n\tat org.jeecg.modules.system.controller.LoginController.getUserInfo(LoginController.java:153)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.system.controller.LoginController$$SpringCGLIB$$0.getUserInfo(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:622)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.boot.servlet.actuate.web.exchanges.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-13 14:47:39', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010967181461848066', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-13 14:48:33', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010975424741400577', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-13 15:21:18', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010975462951510017', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@177f1c8c', NULL, 59, NULL, '2026-01-13 15:21:27', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010975462976675841', 4, 'java.lang.ClassCastException:class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1768288887025', '/jeecg-boot/online/cgform/api/getFormItem/05a3a30dada7411c9109306aa4117068', 'java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')\\r\\n\tat java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)\\r\\n\tat java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)\\r\\n\tat java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)\\r\\n\tat org.jeecg.modules.online.cgform.d.d.b(CgformUtil.java:2932)\\r\\n\tat org.jeecg.modules.online.cgform.c.a.c(OnlCgformApiController.java:392)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.AutoLogAspect.around(AutoLogAspect.java:58)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.online.cgform.c.a$$SpringCGLIB$$0.c(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:622)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.boot.servlet.actuate.web.exchanges.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-13 15:21:27', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010975462993453058', 4, 'java.lang.ClassCastException:class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1768288887023', '/jeecg-boot/online/cgform/api/getFormItem/05a3a30dada7411c9109306aa4117068', 'java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')\\r\\n\tat java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)\\r\\n\tat java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)\\r\\n\tat java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)\\r\\n\tat org.jeecg.modules.online.cgform.d.d.b(CgformUtil.java:2932)\\r\\n\tat org.jeecg.modules.online.cgform.c.a.c(OnlCgformApiController.java:392)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.AutoLogAspect.around(AutoLogAspect.java:58)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.online.cgform.c.a$$SpringCGLIB$$0.c(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:622)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.boot.servlet.actuate.web.exchanges.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-13 15:21:27', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010975641704357889', 4, 'java.lang.ClassCastException:class java.util.ArrayList cannot be cast to class com.alibaba.fastjson.JSONArray (java.util.ArrayList is in module java.base of loader \\'bootstrap\\'; com.alibaba.fastjson.JSONArray is in unnamed module of loader \\'app\\')', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'pageNo=1&pageSize=10&onlRepUrlParamStr=&_t=1768288929645', '/jeecg-boot/online/cgreport/api/getColumnsAndData/1705487386450534402', 'java.lang.ClassCastException: class java.util.ArrayList cannot be cast to class com.alibaba.fastjson.JSONArray (java.util.ArrayList is in module java.base of loader \\'bootstrap\\'; com.alibaba.fastjson.JSONArray is in unnamed module of loader \\'app\\')\\r\\n\tat org.jeecg.modules.online.cgreport.a.a.a(OnlCgreportAPI.java:109)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.PermissionDataAspect.arround(PermissionDataAspect.java:80)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor184.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.online.cgreport.a.a$$SpringCGLIB$$0.a(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:622)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.boot.servlet.actuate.web.exchanges.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-13 15:22:10', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010975954968535042', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-13 15:23:24', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010975960731508738', 4, 'java.lang.ClassCastException:class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1768289005744', '/jeecg-boot/online/cgform/api/getFormItem/05a3a30dada7411c9109306aa4117068', 'java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')\\r\\n\tat java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)\\r\\n\tat java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)\\r\\n\tat java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)\\r\\n\tat org.jeecg.modules.online.cgform.d.d.b(CgformUtil.java:2932)\\r\\n\tat org.jeecg.modules.online.cgform.c.a.c(OnlCgformApiController.java:392)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor184.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.AutoLogAspect.around(AutoLogAspect.java:58)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.online.cgform.c.a$$SpringCGLIB$$0.c(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:622)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.boot.servlet.actuate.web.exchanges.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-13 15:23:26', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010975960760868865', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@7a8377b2', NULL, 25, NULL, '2026-01-13 15:23:26', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010975960777646081', 4, 'java.lang.ClassCastException:class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1768289005743', '/jeecg-boot/online/cgform/api/getFormItem/05a3a30dada7411c9109306aa4117068', 'java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')\\r\\n\tat java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)\\r\\n\tat java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)\\r\\n\tat java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)\\r\\n\tat org.jeecg.modules.online.cgform.d.d.b(CgformUtil.java:2932)\\r\\n\tat org.jeecg.modules.online.cgform.c.a.c(OnlCgformApiController.java:392)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor184.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.AutoLogAspect.around(AutoLogAspect.java:58)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.online.cgform.c.a$$SpringCGLIB$$0.c(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:622)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.boot.servlet.actuate.web.exchanges.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-13 15:23:26', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010975986023161857', 4, 'java.lang.ClassCastException:class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1768289011803', '/jeecg-boot/online/cgform/api/getFormItem/05a3a30dada7411c9109306aa4117068', 'java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')\\r\\n\tat java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)\\r\\n\tat java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)\\r\\n\tat java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)\\r\\n\tat org.jeecg.modules.online.cgform.d.d.b(CgformUtil.java:2932)\\r\\n\tat org.jeecg.modules.online.cgform.c.a.c(OnlCgformApiController.java:392)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor184.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.AutoLogAspect.around(AutoLogAspect.java:58)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.online.cgform.c.a$$SpringCGLIB$$0.c(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:622)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.boot.servlet.actuate.web.exchanges.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-13 15:23:32', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010975986094465026', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@427930b9', NULL, 42, NULL, '2026-01-13 15:23:32', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010975986123825154', 4, 'java.lang.ClassCastException:class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1768289011802', '/jeecg-boot/online/cgform/api/getFormItem/05a3a30dada7411c9109306aa4117068', 'java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')\\r\\n\tat java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)\\r\\n\tat java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)\\r\\n\tat java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)\\r\\n\tat org.jeecg.modules.online.cgform.d.d.b(CgformUtil.java:2932)\\r\\n\tat org.jeecg.modules.online.cgform.c.a.c(OnlCgformApiController.java:392)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor184.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.AutoLogAspect.around(AutoLogAspect.java:58)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.online.cgform.c.a$$SpringCGLIB$$0.c(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:622)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.boot.servlet.actuate.web.exchanges.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-13 15:23:32', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010976017711128578', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@4bd3d943', NULL, 11, NULL, '2026-01-13 15:23:39', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010976017736294401', 4, 'java.lang.ClassCastException:class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1768289019371', '/jeecg-boot/online/cgform/api/getFormItem/05a3a30dada7411c9109306aa4117068', 'java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')\\r\\n\tat java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)\\r\\n\tat java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)\\r\\n\tat java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)\\r\\n\tat org.jeecg.modules.online.cgform.d.d.b(CgformUtil.java:2932)\\r\\n\tat org.jeecg.modules.online.cgform.c.a.c(OnlCgformApiController.java:392)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor184.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.AutoLogAspect.around(AutoLogAspect.java:58)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.online.cgform.c.a$$SpringCGLIB$$0.c(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:622)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.boot.servlet.actuate.web.exchanges.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-13 15:23:39', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010976017736294402', 4, 'java.lang.ClassCastException:class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1768289019370', '/jeecg-boot/online/cgform/api/getFormItem/05a3a30dada7411c9109306aa4117068', 'java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')\\r\\n\tat java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)\\r\\n\tat java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)\\r\\n\tat java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)\\r\\n\tat org.jeecg.modules.online.cgform.d.d.b(CgformUtil.java:2932)\\r\\n\tat org.jeecg.modules.online.cgform.c.a.c(OnlCgformApiController.java:392)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor184.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.AutoLogAspect.around(AutoLogAspect.java:58)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.online.cgform.c.a$$SpringCGLIB$$0.c(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:622)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.boot.servlet.actuate.web.exchanges.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-13 15:23:39', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010976377146220545', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@2e186846', NULL, 80, NULL, '2026-01-13 15:25:05', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010976377196552194', 4, 'java.lang.ClassCastException:class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1768289104930', '/jeecg-boot/online/cgform/api/getFormItem/05a3a30dada7411c9109306aa4117068', 'java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')\\r\\n\tat java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)\\r\\n\tat java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)\\r\\n\tat java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)\\r\\n\tat org.jeecg.modules.online.cgform.d.d.b(CgformUtil.java:2932)\\r\\n\tat org.jeecg.modules.online.cgform.c.a.c(OnlCgformApiController.java:392)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.AutoLogAspect.around(AutoLogAspect.java:58)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.online.cgform.c.a$$SpringCGLIB$$0.c(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:622)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.boot.servlet.actuate.web.exchanges.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-13 15:25:05', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010976377196552193', 4, 'java.lang.ClassCastException:class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1768289104932', '/jeecg-boot/online/cgform/api/getFormItem/05a3a30dada7411c9109306aa4117068', 'java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class org.jeecg.common.system.vo.DictModel (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.common.system.vo.DictModel is in unnamed module of loader \\'app\\')\\r\\n\tat java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)\\r\\n\tat java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)\\r\\n\tat java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)\\r\\n\tat java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)\\r\\n\tat java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)\\r\\n\tat org.jeecg.modules.online.cgform.d.d.b(CgformUtil.java:2932)\\r\\n\tat org.jeecg.modules.online.cgform.c.a.c(OnlCgformApiController.java:392)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.AutoLogAspect.around(AutoLogAspect.java:58)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.online.cgform.c.a$$SpringCGLIB$$0.c(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:622)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.boot.servlet.actuate.web.exchanges.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-13 15:25:05', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010982571415973890', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-13 15:49:42', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010982572309360642', 4, 'java.lang.ClassCastException:class java.util.LinkedHashMap cannot be cast to class org.jeecg.modules.system.entity.SysRoleIndex (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.modules.system.entity.SysRoleIndex is in unnamed module of loader \\'app\\')', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1768290581962', '/jeecg-boot/sys/user/getUserInfo', 'java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class org.jeecg.modules.system.entity.SysRoleIndex (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.modules.system.entity.SysRoleIndex is in unnamed module of loader \\'app\\')\\r\\n\tat org.jeecg.modules.system.service.impl.SysRoleIndexServiceImpl$$SpringCGLIB$$0.queryDefaultIndex(<generated>)\\r\\n\tat org.jeecg.modules.system.service.impl.SysUserServiceImpl.getDynamicIndexByUserRole(SysUserServiceImpl.java:423)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.system.service.impl.SysUserServiceImpl$$SpringCGLIB$$0.getDynamicIndexByUserRole(<generated>)\\r\\n\tat org.jeecg.modules.system.controller.LoginController.getUserInfo(LoginController.java:153)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.system.controller.LoginController$$SpringCGLIB$$0.getUserInfo(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:622)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.boot.servlet.actuate.web.exchanges.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-13 15:49:42', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010982680572735489', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-13 15:50:08', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010983369462009858', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-13 15:52:52', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010983370225373185', 4, 'java.lang.ClassCastException:class java.util.LinkedHashMap cannot be cast to class org.jeecg.modules.system.entity.SysRoleIndex (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.modules.system.entity.SysRoleIndex is in unnamed module of loader \\'app\\')', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1768290772224', '/jeecg-boot/sys/user/getUserInfo', 'java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class org.jeecg.modules.system.entity.SysRoleIndex (java.util.LinkedHashMap is in module java.base of loader \\'bootstrap\\'; org.jeecg.modules.system.entity.SysRoleIndex is in unnamed module of loader \\'app\\')\\r\\n\tat org.jeecg.modules.system.service.impl.SysRoleIndexServiceImpl$$SpringCGLIB$$0.queryDefaultIndex(<generated>)\\r\\n\tat org.jeecg.modules.system.service.impl.SysUserServiceImpl.getDynamicIndexByUserRole(SysUserServiceImpl.java:423)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.system.service.impl.SysUserServiceImpl$$SpringCGLIB$$0.getDynamicIndexByUserRole(<generated>)\\r\\n\tat org.jeecg.modules.system.controller.LoginController.getUserInfo(LoginController.java:153)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.system.controller.LoginController$$SpringCGLIB$$0.getUserInfo(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:622)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.boot.servlet.actuate.web.exchanges.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-13 15:52:52', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010987862526279681', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-13 16:10:43', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010987863176396801', 4, 'org.springframework.data.redis.serializer.SerializationException:Could not read JSON: Unexpected token (`JsonToken.START_OBJECT`), expected `JsonToken.START_ARRAY`: need Array value to contain `As.WRAPPER_ARRAY` type information for class java.lang.Object\\n at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); byte offset: #0]', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1768291843450', '/jeecg-boot/sys/user/getUserInfo', 'org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Unexpected token (`JsonToken.START_OBJECT`), expected `JsonToken.START_ARRAY`: need Array value to contain `As.WRAPPER_ARRAY` type information for class java.lang.Object\\n at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); byte offset: #0]\\r\\n\tat org.springframework.data.redis.serializer.JacksonJsonRedisSerializer.deserialize(JacksonJsonRedisSerializer.java:143)\\r\\n\tat org.springframework.data.redis.serializer.DefaultRedisElementReader.read(DefaultRedisElementReader.java:46)\\r\\n\tat org.springframework.data.redis.serializer.RedisSerializationContext$SerializationPair.read(RedisSerializationContext.java:276)\\r\\n\tat org.springframework.data.redis.cache.RedisCache.deserializeCacheValue(RedisCache.java:375)\\r\\n\tat org.springframework.data.redis.cache.RedisCache.lookup(RedisCache.java:188)\\r\\n\tat org.springframework.cache.support.AbstractValueAdaptingCache.get(AbstractValueAdaptingCache.java:58)\\r\\n\tat org.springframework.cache.transaction.TransactionAwareCacheDecorator.get(TransactionAwareCacheDecorator.java:82)\\r\\n\tat org.springframework.cache.interceptor.AbstractCacheInvoker.doGet(AbstractCacheInvoker.java:78)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.findInCaches(CacheAspectSupport.java:563)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.findCachedValue(CacheAspectSupport.java:513)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:438)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:404)\\r\\n\tat org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:64)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.system.service.impl.SysRoleIndexServiceImpl$$SpringCGLIB$$0.queryDefaultIndex(<generated>)\\r\\n\tat org.jeecg.modules.system.service.impl.SysUserServiceImpl.getDynamicIndexByUserRole(SysUserServiceImpl.java:423)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.system.service.impl.SysUserServiceImpl$$SpringCGLIB$$0.getDynamicIndexByUserRole(<generated>)\\r\\n\tat org.jeecg.modules.system.controller.LoginController.getUserInfo(LoginController.java:153)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.system.controller.LoginController$$SpringCGLIB$$0.getUserInfo(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:622)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.boot.servlet.actuate.web.exchanges.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: tools.jackson.databind.exc.MismatchedInputException: Unexpected token (`JsonToken.START_OBJECT`), expected `JsonToken.START_ARRAY`: need Array value to contain `As.WRAPPER_ARRAY` type information for class java.lang.Object\\n at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); byte offset: #0]\\r\\n\tat tools.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)\\r\\n\tat tools.jackson.databind.DeserializationContext.wrongTokenException(DeserializationContext.java:1982)\\r\\n\tat tools.jackson.databind.DeserializationContext.reportWrongTokenException(DeserializationContext.java:1766)\\r\\n\tat tools.jackson.databind.jsontype.impl.AsArrayTypeDeserializer._locateTypeId(AsArrayTypeDeserializer.java:142)\\r\\n\tat tools.jackson.databind.jsontype.impl.AsArrayTypeDeserializer._deserialize(AsArrayTypeDeserializer.java:91)\\r\\n\tat tools.jackson.databind.jsontype.impl.AsArrayTypeDeserializer.deserializeTypedFromAny(AsArrayTypeDeserializer.java:65)\\r\\n\tat tools.jackson.databind.deser.jdk.UntypedObjectDeserializerNR.deserializeWithType(UntypedObjectDeserializerNR.java:98)\\r\\n\tat tools.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:72)\\r\\n\tat tools.jackson.databind.deser.DeserializationContextExt.readRootValue(DeserializationContextExt.java:265)\\r\\n\tat tools.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2610)\\r\\n\tat tools.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1676)\\r\\n\tat org.springframework.data.redis.serializer.JacksonObjectReader.lambda$create$0(JacksonObjectReader.java:52)\\r\\n\tat org.springframework.data.redis.serializer.JacksonJsonRedisSerializer.deserialize(JacksonJsonRedisSerializer.java:141)\\r\\n\t... 124 more\\r\\n', NULL, NULL, NULL, '2026-01-13 16:10:44', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010989755801559042', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-13 16:18:15', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010989771576336386', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-13 16:18:19', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010989771911880706', 4, 'org.springframework.data.redis.serializer.SerializationException:Could not read JSON: Could not resolve subtype of [simple type, class java.lang.Object]: missing type id property \\'@class\\'\\n at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); byte offset: #251]', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', '_t=1768292298601', '/jeecg-boot/sys/user/getUserInfo', 'org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Could not resolve subtype of [simple type, class java.lang.Object]: missing type id property \\'@class\\'\\n at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); byte offset: #251]\\r\\n\tat org.springframework.data.redis.serializer.JacksonJsonRedisSerializer.deserialize(JacksonJsonRedisSerializer.java:143)\\r\\n\tat org.springframework.data.redis.serializer.DefaultRedisElementReader.read(DefaultRedisElementReader.java:46)\\r\\n\tat org.springframework.data.redis.serializer.RedisSerializationContext$SerializationPair.read(RedisSerializationContext.java:276)\\r\\n\tat org.springframework.data.redis.cache.RedisCache.deserializeCacheValue(RedisCache.java:375)\\r\\n\tat org.springframework.data.redis.cache.RedisCache.lookup(RedisCache.java:188)\\r\\n\tat org.springframework.cache.support.AbstractValueAdaptingCache.get(AbstractValueAdaptingCache.java:58)\\r\\n\tat org.springframework.cache.transaction.TransactionAwareCacheDecorator.get(TransactionAwareCacheDecorator.java:82)\\r\\n\tat org.springframework.cache.interceptor.AbstractCacheInvoker.doGet(AbstractCacheInvoker.java:78)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.findInCaches(CacheAspectSupport.java:563)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.findCachedValue(CacheAspectSupport.java:513)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:438)\\r\\n\tat org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:404)\\r\\n\tat org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:64)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.system.service.impl.SysRoleIndexServiceImpl$$SpringCGLIB$$0.queryDefaultIndex(<generated>)\\r\\n\tat org.jeecg.modules.system.service.impl.SysUserServiceImpl.getDynamicIndexByUserRole(SysUserServiceImpl.java:423)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.system.service.impl.SysUserServiceImpl$$SpringCGLIB$$0.getDynamicIndexByUserRole(<generated>)\\r\\n\tat org.jeecg.modules.system.controller.LoginController.getUserInfo(LoginController.java:153)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:648)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:630)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:96)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:719)\\r\\n\tat org.jeecg.modules.system.controller.LoginController$$SpringCGLIB$$0.getUserInfo(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:622)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.boot.servlet.actuate.web.exchanges.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:89)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: tools.jackson.databind.exc.InvalidTypeIdException: Could not resolve subtype of [simple type, class java.lang.Object]: missing type id property \\'@class\\'\\n at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); byte offset: #251]\\r\\n\tat tools.jackson.databind.exc.InvalidTypeIdException.from(InvalidTypeIdException.java:41)\\r\\n\tat tools.jackson.databind.DeserializationContext.missingTypeIdException(DeserializationContext.java:2113)\\r\\n\tat tools.jackson.databind.DeserializationContext.handleMissingTypeId(DeserializationContext.java:1698)\\r\\n\tat tools.jackson.databind.jsontype.impl.TypeDeserializerBase._handleMissingTypeId(TypeDeserializerBase.java:285)\\r\\n\tat tools.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedUsingDefaultImpl(AsPropertyTypeDeserializer.java:173)\\r\\n\tat tools.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:112)\\r\\n\tat tools.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromAny(AsPropertyTypeDeserializer.java:203)\\r\\n\tat tools.jackson.databind.deser.jdk.UntypedObjectDeserializerNR.deserializeWithType(UntypedObjectDeserializerNR.java:98)\\r\\n\tat tools.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:72)\\r\\n\tat tools.jackson.databind.deser.DeserializationContextExt.readRootValue(DeserializationContextExt.java:265)\\r\\n\tat tools.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2610)\\r\\n\tat tools.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1676)\\r\\n\tat org.springframework.data.redis.serializer.JacksonObjectReader.lambda$create$0(JacksonObjectReader.java:52)\\r\\n\tat org.springframework.data.redis.serializer.JacksonJsonRedisSerializer.deserialize(JacksonJsonRedisSerializer.java:141)\\r\\n\t... 124 more\\r\\n', NULL, NULL, NULL, '2026-01-13 16:18:19', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010990026099286018', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-13 16:19:19', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2010990034102018049', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@7044b33d', NULL, 42, NULL, '2026-01-13 16:19:21', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010990034143961089', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@22332d92', NULL, 44, NULL, '2026-01-13 16:19:21', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010990034135572482', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@6b0a9270', NULL, 48, NULL, '2026-01-13 16:19:21', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010990186145538050', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@250becb0', NULL, 22, NULL, '2026-01-13 16:19:57', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010990186162315265', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@60f04b6c', NULL, 26, NULL, '2026-01-13 16:19:57', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010990186187481089', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@59b03a45', NULL, 30, NULL, '2026-01-13 16:19:57', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010990191661047809', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  id: 1966815579977478145', NULL, 12, NULL, '2026-01-13 16:19:59', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010990197281415169', 2, 'online修改数据,修改失败，Incorrect integer value: \\'\\' for column \\'long_ids\\' at row 1', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"2025-09-19 00:00:00\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"1\\\",\\\"begin_time\\\":\\\"\\\",\\\"long_ids\\\":\\\"\\\",\\\"sheng\\\":\\\"\\\",\\\"update_time\\\":\\\"2026-01-13 16:19:59\\\",\\\"jeecg_row_key\\\":\\\"1966815579977478145\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"\\\",\\\"name\\\":\\\"ceshi\\\",\\\"id\\\":\\\"1966815579977478145\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":11}]', NULL, 189, NULL, '2026-01-13 16:20:00', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010990207913975810', 2, 'online修改数据,修改失败，Incorrect integer value: \\'\\' for column \\'long_ids\\' at row 1', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"2025-09-19 00:00:00\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"1\\\",\\\"begin_time\\\":\\\"\\\",\\\"long_ids\\\":\\\"\\\",\\\"sheng\\\":\\\"\\\",\\\"update_time\\\":\\\"2026-01-13 16:20:02\\\",\\\"jeecg_row_key\\\":\\\"1966815579977478145\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"\\\",\\\"name\\\":\\\"ceshi\\\",\\\"id\\\":\\\"1966815579977478145\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":11}]', NULL, 16, NULL, '2026-01-13 16:20:03', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010991617489506306', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@6a81e3c7', NULL, 201, NULL, '2026-01-13 16:25:39', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010991617850216450', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@66eafe8', NULL, 277, NULL, '2026-01-13 16:25:39', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010991617980239874', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@37426c4d', NULL, 322, NULL, '2026-01-13 16:25:39', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992311567147010', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@79e2d221', NULL, 69, NULL, '2026-01-13 16:28:24', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992333943758849', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@3be227b4', NULL, 121, NULL, '2026-01-13 16:28:30', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992334153474050', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@433e1fa4', NULL, 171, NULL, '2026-01-13 16:28:30', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992334182834177', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@73500a14', NULL, 178, NULL, '2026-01-13 16:28:30', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992339719315457', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  id: 1923203898831777793', NULL, 28, NULL, '2026-01-13 16:28:31', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992345083830273', 2, 'online修改数据,修改失败，Incorrect integer value: \\'\\' for column \\'long_ids\\' at row 1', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"2\\\",\\\"begin_time\\\":\\\"\\\",\\\"long_ids\\\":\\\"\\\",\\\"sheng\\\":\\\"\\\",\\\"update_time\\\":\\\"2026-01-13 16:28:32\\\",\\\"jeecg_row_key\\\":\\\"1923203898831777793\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"\\\",\\\"name\\\":\\\"jeecg\\\",\\\"id\\\":\\\"1923203898831777793\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":10}]', NULL, 196, NULL, '2026-01-13 16:28:32', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992363282915330', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  id: 1966815579977478145', NULL, 24, NULL, '2026-01-13 16:28:36', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992367317835777', 2, 'online修改数据,修改失败，Incorrect integer value: \\'\\' for column \\'long_ids\\' at row 1', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"2025-09-19 00:00:00\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"1\\\",\\\"begin_time\\\":\\\"\\\",\\\"long_ids\\\":\\\"\\\",\\\"sheng\\\":\\\"\\\",\\\"update_time\\\":\\\"2026-01-13 16:28:37\\\",\\\"jeecg_row_key\\\":\\\"1966815579977478145\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"\\\",\\\"name\\\":\\\"ceshi\\\",\\\"id\\\":\\\"1966815579977478145\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":11}]', NULL, 57, NULL, '2026-01-13 16:28:37', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992400201179137', 2, 'online新增数据,表名:test_note,添加成功!', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"\\\",\\\"create_by\\\":\\\"admin\\\",\\\"sys_org_code\\\":\\\"A01A03\\\",\\\"create_time\\\":\\\"2026-01-13 16:28:45\\\",\\\"id\\\":\\\"2010992399911772161\\\",\\\"age\\\":11},null]', NULL, 71, NULL, '2026-01-13 16:28:45', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992529775812609', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@5cc7abd4', NULL, 121, NULL, '2026-01-13 16:29:16', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992530065219586', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@413e4e3c', NULL, 190, NULL, '2026-01-13 16:29:16', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992530065219587', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@2ce51db', NULL, 190, NULL, '2026-01-13 16:29:16', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992537078095874', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  id: 2010992399911772161', NULL, 50, NULL, '2026-01-13 16:29:18', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992549535178753', 2, 'online修改数据,表名:test_note,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"\\\",\\\"begin_time\\\":\\\"\\\",\\\"long_ids\\\":\\\"1\\\",\\\"sheng\\\":\\\"\\\",\\\"update_time\\\":\\\"2026-01-13 16:29:20\\\",\\\"jeecg_row_key\\\":\\\"2010992399911772161\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"\\\",\\\"name\\\":\\\"\\\",\\\"id\\\":\\\"2010992399911772161\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":11}]', NULL, 106, NULL, '2026-01-13 16:29:21', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992555256209410', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  id: 2010992399911772161', NULL, 43, NULL, '2026-01-13 16:29:22', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992564722753538', 2, 'online修改数据,表名:test_note,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"\\\",\\\"begin_time\\\":\\\"\\\",\\\"long_ids\\\":\\\"12\\\",\\\"sheng\\\":\\\"\\\",\\\"update_time\\\":\\\"2026-01-13 16:29:24\\\",\\\"jeecg_row_key\\\":\\\"2010992399911772161\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"\\\",\\\"name\\\":\\\"\\\",\\\"id\\\":\\\"2010992399911772161\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":11}]', NULL, 100, NULL, '2026-01-13 16:29:25', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992570296983554', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  id: 1966815579977478145', NULL, 41, NULL, '2026-01-13 16:29:26', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992576462610433', 2, 'online修改数据,修改失败，Incorrect integer value: \\'\\' for column \\'long_ids\\' at row 1', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"2025-09-19 00:00:00\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"1\\\",\\\"begin_time\\\":\\\"\\\",\\\"long_ids\\\":\\\"\\\",\\\"sheng\\\":\\\"\\\",\\\"update_time\\\":\\\"2026-01-13 16:29:27\\\",\\\"jeecg_row_key\\\":\\\"1966815579977478145\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"\\\",\\\"name\\\":\\\"ceshi\\\",\\\"id\\\":\\\"1966815579977478145\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":11}]', NULL, 81, NULL, '2026-01-13 16:29:27', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992675821477890', 2, 'online修改数据,修改失败，Incorrect integer value: \\'\\' for column \\'long_ids\\' at row 1', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"2025-09-19 00:00:00\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"1\\\",\\\"begin_time\\\":\\\"\\\",\\\"long_ids\\\":\\\"\\\",\\\"sheng\\\":\\\"\\\",\\\"update_time\\\":\\\"2026-01-13 16:29:51\\\",\\\"jeecg_row_key\\\":\\\"1966815579977478145\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"\\\",\\\"name\\\":\\\"ceshi\\\",\\\"id\\\":\\\"1966815579977478145\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":11}]', NULL, 78, NULL, '2026-01-13 16:29:51', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010992791768817666', 2, 'online修改数据,修改失败，Incorrect integer value: \\'\\' for column \\'long_ids\\' at row 1', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"2025-09-19 00:00:00\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"1\\\",\\\"begin_time\\\":\\\"\\\",\\\"long_ids\\\":\\\"\\\",\\\"sheng\\\":\\\"\\\",\\\"update_time\\\":\\\"2026-01-13 16:30:18\\\",\\\"jeecg_row_key\\\":\\\"1966815579977478145\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"\\\",\\\"name\\\":\\\"ceshi\\\",\\\"id\\\":\\\"1966815579977478145\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":11}]', NULL, 52, NULL, '2026-01-13 16:30:19', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010993489944256514', 2, 'online列表加载,表名:test_shoptype_tree,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 997ee931515a4620bc30a9c1246429a9  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@ed8733f', NULL, 111, NULL, '2026-01-13 16:33:05', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010993490082668546', 2, 'online表单加载,表名:test_shoptype_tree,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 997ee931515a4620bc30a9c1246429a9  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@7a8d72b4', NULL, 146, NULL, '2026-01-13 16:33:05', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010993490191720449', 2, 'online表单加载,表名:test_shoptype_tree,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 997ee931515a4620bc30a9c1246429a9  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@6315e820', NULL, 172, NULL, '2026-01-13 16:33:05', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010993496344764417', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 997ee931515a4620bc30a9c1246429a9  id: 1923190583678107649', NULL, 54, NULL, '2026-01-13 16:33:07', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2010993500664897537', 2, 'online修改数据,表名:test_shoptype_tree,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"997ee931515a4620bc30a9c1246429a9\\\",{\\\"type_name\\\":\\\"水果\\\",\\\"update_time\\\":\\\"2026-01-13 16:33:07\\\",\\\"jeecg_row_key\\\":\\\"1923190583678107649\\\",\\\"children\\\":\\\"[object Object]\\\",\\\"pid\\\":\\\"0\\\",\\\"pic\\\":\\\"\\\",\\\"has_child\\\":\\\"1\\\",\\\"id\\\":\\\"1923190583678107649\\\",\\\"update_by\\\":\\\"admin\\\"}]', NULL, 168, NULL, '2026-01-13 16:33:08', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013518346812674050', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-20 15:45:58', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2013518434012254209', 1, '用户名: 管理员,退出成功！', NULL, 'admin', '管理员', '127.0.0.1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-20 15:46:19', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013518463078780930', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-20 15:46:26', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2013518923273621506', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-20 15:48:15', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2013562550297362434', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@1352513e', NULL, 30, NULL, '2026-01-20 18:41:37', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013562624029032449', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@5dae4544', NULL, 6, NULL, '2026-01-20 18:41:54', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013562891352997889', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@226eb573', NULL, 4, NULL, '2026-01-20 18:42:58', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013562899917766658', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@67caf0f9', NULL, 31, NULL, '2026-01-20 18:43:00', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013562995740835842', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-20 18:43:23', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2013563053244743681', 2, '修改角色ID: f6817f48af4fb3af11b9e8bf182f618b 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-20 18:43:37', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2013564035835953155', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-20 18:47:31', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2013564317399580678', 2, '修改角色ID: 1501570619841810433 的权限配置，操作人： admin', 2, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-20 18:48:38', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2013791979686658049', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-21 09:53:17', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2013792531006947330', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@307ade5c', NULL, 8, NULL, '2026-01-21 09:55:29', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013792542616780801', 2, '编码校验规则-编辑', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.edit()', NULL, '[{\\\"id\\\":\\\"1225001845524004866\\\",\\\"ruleCode\\\":\\\"test\\\",\\\"ruleDescription\\\":\\\"包含长度校验、特殊字符校验等\\\",\\\"ruleJson\\\":\\\"[{\\\\\\\"digits\\\\\\\":\\\\\\\"*\\\\\\\",\\\\\\\"pattern\\\\\\\":\\\\\\\"^.{3,12}$\\\\\\\",\\\\\\\"message\\\\\\\":\\\\\\\"只能输入3-12位字符\\\\\\\"},{\\\\\\\"digits\\\\\\\":3,\\\\\\\"pattern\\\\\\\":\\\\\\\"^\\\\\\\\\\\\\\\\d{3}$\\\\\\\",\\\\\\\"message\\\\\\\":\\\\\\\"前3位必须是数字\\\\\\\"},{\\\\\\\"digits\\\\\\\":4,\\\\\\\"pattern\\\\\\\":\\\\\\\"^@{4}$\\\\\\\",\\\\\\\"message\\\\\\\":\\\\\\\"第4-7位必须都为 @\\\\\\\"},{\\\\\\\"digits\\\\\\\":2,\\\\\\\"pattern\\\\\\\":\\\\\\\"^#=$\\\\\\\",\\\\\\\"message\\\\\\\":\\\\\\\"第8-9位必须是 #=\\\\\\\"},{\\\\\\\"digits\\\\\\\":1,\\\\\\\"pattern\\\\\\\":\\\\\\\"^O$\\\\\\\",\\\\\\\"message\\\\\\\":\\\\\\\"第10位必须为大写的O\\\\\\\"},{\\\\\\\"digits\\\\\\\":\\\\\\\"*\\\\\\\",\\\\\\\"pattern\\\\\\\":\\\\\\\"^[^pP]*$\\\\\\\",\\\\\\\"message\\\\\\\":\\\\\\\"不能输入P\\\\\\\"},{\\\\\\\"digits\\\\\\\":\\\\\\\"*\\\\\\\",\\\\\\\"pattern\\\\\\\":\\\\\\\"^.*。$\\\\\\\",\\\\\\\"message\\\\\\\":\\\\\\\"必须以。结尾\\\\\\\"}]\\\",\\\"ruleName\\\":\\\"负责的功能测试\\\",\\\"updateBy\\\":\\\"admin\\\",\\\"updateTime\\\":\\\"2026-01-21 09:55:31\\\"}]', NULL, 13, NULL, '2026-01-21 09:55:31', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013792542872633345', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@1b9f8863', NULL, 3, NULL, '2026-01-21 09:55:31', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013793200195567617', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-21 09:58:08', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2013857418638819330', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-21 14:13:19', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2013884181142077442', 4, 'org.springframework.web.servlet.resource.NoResourceFoundException:No static resource airag/word/list.', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'column=createTime&order=desc&pageNo=1&pageSize=10&_t=1768982379472', '/jeecg-boot/airag/word/list', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource airag/word/list.\\r\\n\tat org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\\r\\n\tat org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-21 15:59:40', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2013884210225381377', 4, 'org.springframework.web.servlet.resource.NoResourceFoundException:No static resource airag/word/list.', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'column=createTime&order=desc&pageNo=1&pageSize=10&_t=1768982386521', '/jeecg-boot/airag/word/list', 'org.springframework.web.servlet.resource.NoResourceFoundException: No static resource airag/word/list.\\r\\n\tat org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)\\r\\n\tat org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-21 15:59:47', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2013884622055763969', 4, 'org.springframework.jdbc.BadSqlGrammarException:\\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Table \\'jeecg-boot.eoa_word_template\\' doesn\\'t exist\\r\\n### The error may exist in org/jeecg/modules/airag/wordtpl/mapper/EoaWordTemplateMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT COUNT(*) AS total FROM eoa_word_template\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Table \\'jeecg-boot.eoa_word_template\\' doesn\\'t exist\\n; bad SQL grammar []', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'column=createTime&order=desc&pageNo=1&pageSize=10&_t=1768982484392', '/jeecg-boot/airag/word/list', 'org.springframework.jdbc.BadSqlGrammarException: \\r\\n### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Table \\'jeecg-boot.eoa_word_template\\' doesn\\'t exist\\r\\n### The error may exist in org/jeecg/modules/airag/wordtpl/mapper/EoaWordTemplateMapper.java (best guess)\\r\\n### The error may involve defaultParameterMap\\r\\n### The error occurred while setting parameters\\r\\n### SQL: SELECT COUNT(*) AS total FROM eoa_word_template\\r\\n### Cause: java.sql.SQLSyntaxErrorException: Table \\'jeecg-boot.eoa_word_template\\' doesn\\'t exist\\n; bad SQL grammar []\\r\\n\tat org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:246)\\r\\n\tat org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107)\\r\\n\tat org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:93)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:347)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy184.selectList(Unknown Source)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:194)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy264.selectList(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:458)\\r\\n\tat java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:182)\\r\\n\tat com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy264.selectPage(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.repository.IRepository.page(IRepository.java:342)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:724)\\r\\n\tat org.jeecg.modules.airag.wordtpl.service.impl.EoaWordTemplateServiceImpl$$SpringCGLIB$$0.page(<generated>)\\r\\n\tat org.jeecg.modules.airag.wordtpl.controller.EoaWordTemplateController.queryPageList(EoaWordTemplateController.java:67)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:649)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:631)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)\\r\\n\tat org.jeecg.modules.airag.wordtpl.controller.EoaWordTemplateController$$SpringCGLIB$$0.queryPageList(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\nCaused by: java.sql.SQLSyntaxErrorException: Table \\'jeecg-boot.eoa_word_template\\' doesn\\'t exist\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)\\r\\n\tat com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)\\r\\n\tat com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:371)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3462)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)\\r\\n\tat com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3460)\\r\\n\tat com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:158)\\r\\n\tat com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)\\r\\n\tat org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)\\r\\n\tat org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy392.query(Unknown Source)\\r\\n\tat org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)\\r\\n\tat org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)\\r\\n\tat org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy391.query(Unknown Source)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor.willDoQuery(PaginationInnerInterceptor.java:135)\\r\\n\tat com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:75)\\r\\n\tat org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)\\r\\n\tat jdk.proxy2/jdk.proxy2.$Proxy391.query(Unknown Source)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)\\r\\n\tat org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333)\\r\\n\t... 128 more\\r\\n', NULL, NULL, NULL, '2026-01-21 16:01:25', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2013886075214241793', 2, 'word模版管理-编辑', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.airag.wordtpl.controller.EoaWordTemplateController.edit()', NULL, '[{\\\"footer\\\":\\\"[]\\\",\\\"header\\\":\\\"[]\\\",\\\"height\\\":1124,\\\"id\\\":\\\"1957327567174488065\\\",\\\"margins\\\":\\\"[100,120,100,120]\\\",\\\"name\\\":\\\"红头文件\\\",\\\"paperDirection\\\":\\\"vertical\\\",\\\"updateBy\\\":\\\"admin\\\",\\\"updateTime\\\":\\\"2026-01-21 16:07:11\\\",\\\"watermark\\\":\\\"{\\\\\\\"data\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"color\\\\\\\":\\\\\\\"#AEB5C0\\\\\\\",\\\\\\\"opacity\\\\\\\":0.3,\\\\\\\"size\\\\\\\":200,\\\\\\\"font\\\\\\\":\\\\\\\"Microsoft YaHei\\\\\\\",\\\\\\\"repeat\\\\\\\":false,\\\\\\\"gap\\\\\\\":[10,10]}\\\",\\\"width\\\":795}]', NULL, 33, NULL, '2026-01-21 16:07:11', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013886467343917058', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-21 16:08:45', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2013919325844414465', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@19f27537', NULL, 29, NULL, '2026-01-21 18:19:19', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013919398716252161', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@253b3a92', NULL, 16, NULL, '2026-01-21 18:19:36', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013919402554040321', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@eccc38d', NULL, 44, NULL, '2026-01-21 18:19:37', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013927304283037698', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@327e0879', NULL, 9, NULL, '2026-01-21 18:51:01', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013927306971586561', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@42b9b551', NULL, 8, NULL, '2026-01-21 18:51:02', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013937058971774977', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@4176373b', NULL, 21, NULL, '2026-01-21 19:29:47', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013937062759231489', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@224c1b53', NULL, 20, NULL, '2026-01-21 19:29:48', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993461568618498', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-21 23:13:54', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2013993639017037825', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@58e1e4ca', NULL, 174, NULL, '2026-01-21 23:14:36', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993639121895426', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@ef0493', NULL, 195, NULL, '2026-01-21 23:14:36', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993639121895427', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@5d9ecd8', NULL, 198, NULL, '2026-01-21 23:14:36', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993662849073154', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@2e6ee306', NULL, 94, NULL, '2026-01-21 23:14:42', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993663096537091', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@4411704e', NULL, 153, NULL, '2026-01-21 23:14:42', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993663096537090', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@20aa6ca', NULL, 153, NULL, '2026-01-21 23:14:42', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993706666967041', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@262fe310', NULL, 90, NULL, '2026-01-21 23:14:53', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993706897653762', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@4d417598', NULL, 144, NULL, '2026-01-21 23:14:53', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993706897653763', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@3178707d', NULL, 144, NULL, '2026-01-21 23:14:53', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993731274948609', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@7972c86b', NULL, 100, NULL, '2026-01-21 23:14:58', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993731501441026', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@673ceda8', NULL, 154, NULL, '2026-01-21 23:14:58', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993731501441027', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@20146d69', NULL, 154, NULL, '2026-01-21 23:14:58', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993797607866370', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  id: 1966815579977478145', NULL, 32, NULL, '2026-01-21 23:15:14', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993817769885697', 2, 'online修改数据,表名:test_note,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"2025-09-19 00:00:00\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"1\\\",\\\"begin_time\\\":\\\"\\\",\\\"long_ids\\\":\\\"\\\",\\\"sheng\\\":\\\"\\\",\\\"update_time\\\":\\\"2026-01-21 23:15:18\\\",\\\"jeecg_row_key\\\":\\\"1966815579977478145\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"\\\",\\\"name\\\":\\\"ceshi\\\",\\\"id\\\":\\\"1966815579977478145\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":11}]', NULL, 99, NULL, '2026-01-21 23:15:19', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993903119777794', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@6cc48c42', NULL, 93, NULL, '2026-01-21 23:15:39', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993903279161346', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@59d0f19c', NULL, 131, NULL, '2026-01-21 23:15:39', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993903291744258', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@236940ac', NULL, 135, NULL, '2026-01-21 23:15:39', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993909541257218', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@dedfce6', NULL, 81, NULL, '2026-01-21 23:15:41', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993909776138241', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@2275976d', NULL, 135, NULL, '2026-01-21 23:15:41', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993909776138242', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@ccb7366', NULL, 138, NULL, '2026-01-21 23:15:41', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993917791453185', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  id: 1966815579977478145', NULL, 32, NULL, '2026-01-21 23:15:43', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013993932563791874', 2, 'online修改数据,表名:test_note,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"2025-09-19 00:00:00\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"2\\\",\\\"begin_time\\\":\\\"\\\",\\\"long_ids\\\":\\\"\\\",\\\"sheng\\\":\\\"\\\",\\\"update_time\\\":\\\"2026-01-21 23:15:46\\\",\\\"jeecg_row_key\\\":\\\"1966815579977478145\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"\\\",\\\"name\\\":\\\"ceshi\\\",\\\"id\\\":\\\"1966815579977478145\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":0}]', NULL, 79, NULL, '2026-01-21 23:15:46', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013994081780350977', 2, 'online列表加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@1054d48f', NULL, 76, NULL, '2026-01-21 23:16:22', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013994081985871874', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@68c6e072', NULL, 125, NULL, '2026-01-21 23:16:22', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013994081985871873', 2, 'online表单加载,表名:test_note,操作成功', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@75e85fcb', NULL, 125, NULL, '2026-01-21 23:16:22', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013994087081951234', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  id: 2010992399911772161', NULL, 35, NULL, '2026-01-21 23:16:23', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013994095206318081', 2, 'online修改数据,表名:test_note,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"\\\",\\\"begin_time\\\":\\\"\\\",\\\"long_ids\\\":12,\\\"sheng\\\":\\\"\\\",\\\"update_time\\\":\\\"2026-01-21 23:16:25\\\",\\\"jeecg_row_key\\\":\\\"2010992399911772161\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"\\\",\\\"name\\\":\\\"\\\",\\\"id\\\":\\\"2010992399911772161\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":11}]', NULL, 74, NULL, '2026-01-21 23:16:25', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013994099660668930', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  id: 1943500714139598850', NULL, 25, NULL, '2026-01-21 23:16:26', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013994104303763457', 2, 'online修改数据,表名:test_note,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"2025-07-29 00:00:00\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"1\\\",\\\"begin_time\\\":\\\"\\\",\\\"long_ids\\\":\\\"\\\",\\\"sheng\\\":\\\"140311\\\",\\\"update_time\\\":\\\"2026-01-21 23:16:27\\\",\\\"jeecg_row_key\\\":\\\"1943500714139598850\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"<p>经过上述讨论, 我们不得不面对一个非常尴尬的事实, 那就是, 这样看来, 一般来讲, 我们都必须务必慎重的考虑考虑. 就我个人来说, 随机一段废话对我的意义, 不能不说非常重大.&nbsp;<br>每个人都不得不面对这些问题. 在面对这种问题时, 随机一段废话, 发生了会如何, 不发生又会如何. 总结的来说,&nbsp;<br>这种事实对本人来说意义重大, 相信对这个世界也是有一定意义的.所谓随机一段废话, 关键是x需要</p>\\\",\\\"name\\\":\\\"admin\\\",\\\"id\\\":\\\"1943500714139598850\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":1212}]', NULL, 64, NULL, '2026-01-21 23:16:27', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013994111262113794', 2, 'online表单数据查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.c()', NULL, '  code: 05a3a30dada7411c9109306aa4117068  id: 2010992399911772161', NULL, 33, NULL, '2026-01-21 23:16:29', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2013994123513675777', 2, 'online修改数据,表名:test_note,修改成功！', 3, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.online.cgform.c.a.a()', NULL, '[\\\"05a3a30dada7411c9109306aa4117068\\\",{\\\"birthday\\\":\\\"\\\",\\\"year\\\":\\\"\\\",\\\"sex\\\":\\\"\\\",\\\"begin_time\\\":\\\"\\\",\\\"sheng\\\":\\\"\\\",\\\"update_time\\\":\\\"2026-01-21 23:16:31\\\",\\\"jeecg_row_key\\\":\\\"2010992399911772161\\\",\\\"month\\\":\\\"\\\",\\\"contents\\\":\\\"\\\",\\\"name\\\":\\\"\\\",\\\"id\\\":\\\"2010992399911772161\\\",\\\"update_by\\\":\\\"admin\\\",\\\"age\\\":11}]', NULL, 74, NULL, '2026-01-21 23:16:32', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2014154460842008577', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-22 09:53:39', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2014156825800232962', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-22 10:03:03', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2014620486993981442', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-23 16:45:29', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2014625393528549378', 4, 'org.jeecg.common.exception.JeecgBootException:调用绘画AI接口失败，详情请查看后台日志。', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/airag/chat/genAiPoster', 'org.jeecg.common.exception.JeecgBootException: 调用绘画AI接口失败，详情请查看后台日志。\\r\\n\tat org.jeecg.modules.airag.llm.handler.AIChatHandler.imageGenerate(AIChatHandler.java:462)\\r\\n\tat org.jeecg.modules.airag.llm.handler.AIChatHandler.imageGenerate(AIChatHandler.java:433)\\r\\n\tat org.jeecg.modules.airag.app.service.impl.AiragChatServiceImpl.genAiPoster(AiragChatServiceImpl.java:1701)\\r\\n\tat org.jeecg.modules.airag.app.controller.AiragChatController.genAiPoster(AiragChatController.java:270)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor197.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:649)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:631)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)\\r\\n\tat org.jeecg.modules.airag.app.controller.AiragChatController$$SpringCGLIB$$0.genAiPoster(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-23 17:04:58', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2014625729198698498', 4, 'org.jeecg.common.exception.JeecgBootException:调用绘画AI接口失败，详情请查看后台日志。', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/airag/chat/genAiPoster', 'org.jeecg.common.exception.JeecgBootException: 调用绘画AI接口失败，详情请查看后台日志。\\r\\n\tat org.jeecg.modules.airag.llm.handler.AIChatHandler.imageGenerate(AIChatHandler.java:462)\\r\\n\tat org.jeecg.modules.airag.llm.handler.AIChatHandler.imageGenerate(AIChatHandler.java:433)\\r\\n\tat org.jeecg.modules.airag.app.service.impl.AiragChatServiceImpl.genAiPoster(AiragChatServiceImpl.java:1701)\\r\\n\tat org.jeecg.modules.airag.app.controller.AiragChatController.genAiPoster(AiragChatController.java:270)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor197.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:649)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:631)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)\\r\\n\tat org.jeecg.modules.airag.app.controller.AiragChatController$$SpringCGLIB$$0.genAiPoster(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-23 17:06:18', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2014626119340273666', 4, 'org.jeecg.common.exception.JeecgBootException:调用绘画AI接口失败，详情请查看后台日志。', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/airag/chat/genAiPoster', 'org.jeecg.common.exception.JeecgBootException: 调用绘画AI接口失败，详情请查看后台日志。\\r\\n\tat org.jeecg.modules.airag.llm.handler.AIChatHandler.imageGenerate(AIChatHandler.java:462)\\r\\n\tat org.jeecg.modules.airag.llm.handler.AIChatHandler.imageGenerate(AIChatHandler.java:433)\\r\\n\tat org.jeecg.modules.airag.app.service.impl.AiragChatServiceImpl.genAiPoster(AiragChatServiceImpl.java:1701)\\r\\n\tat org.jeecg.modules.airag.app.controller.AiragChatController.genAiPoster(AiragChatController.java:270)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)\\r\\n\tat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)\\r\\n\tat org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:64)\\r\\n\tat jdk.internal.reflect.GeneratedMethodAccessor197.invoke(Unknown Source)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:649)\\r\\n\tat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:631)\\r\\n\tat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:173)\\r\\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\\r\\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)\\r\\n\tat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)\\r\\n\tat org.jeecg.modules.airag.app.controller.AiragChatController$$SpringCGLIB$$0.genAiPoster(<generated>)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\r\\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\\r\\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\r\\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258)\\r\\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:66)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat com.alibaba.druid.support.jakarta.WebStatFilter.doFilter(WebStatFilter.java:113)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.boot.actuate.web.exchanges.servlet.HttpExchangesFilter.doFilterInternal(HttpExchangesFilter.java:88)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)\\r\\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)\\r\\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:116)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)\\r\\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:398)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-23 17:07:51', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2014631987658104834', 2, 'word模版管理-通过id删除', 4, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.airag.wordtpl.controller.EoaWordTemplateController.delete()', NULL, '  id: 2014631939473940481', NULL, 12, NULL, '2026-01-23 17:31:11', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2014632079131680770', 4, 'org.springframework.http.converter.HttpMessageNotWritableException:No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'text/event-stream\\'', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/airag/chat/genAiWriter', 'org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'text/event-stream\\'\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:365)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:263)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ResponseEntityReturnValueHandler.handleReturnValue(ResponseEntityReturnValueHandler.java:79)\\r\\n\tat org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:136)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:612)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:491)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:439)\\r\\n\tat org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:358)\\r\\n\tat org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:209)\\r\\n\tat org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:286)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:150)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:239)\\r\\n\tat org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:243)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-23 17:31:32', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2014634234844553218', 2, '多数据源管理-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysDataSourceController.queryPageList()', NULL, '  sysDataSource: SysDataSource(id=null, code=null, name=null, remark=null, dbType=null, dbDriver=null, dbUrl=null, dbName=null, dbUsername=null, dbPassword=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, tenantId=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@5f1ae660', NULL, 94, NULL, '2026-01-23 17:40:06', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2014634244701167617', 2, '多数据源管理-通过id查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysDataSourceController.queryById()', NULL, '  id: 1209779538310004737', NULL, 579, NULL, '2026-01-23 17:40:09', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2014634442189971457', 2, '多数据源管理-通过id查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysDataSourceController.queryById()', NULL, '  id: 1209779538310004737', NULL, 6, NULL, '2026-01-23 17:40:56', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2014636193441914882', 4, 'org.springframework.http.converter.HttpMessageNotWritableException:No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'text/event-stream\\'', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', '_t=1769161538505', '/jeecg-boot/airag/chat/receive/402881829bea2598019bea3ea6c50017', 'org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'text/event-stream\\'\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:365)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:263)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ResponseEntityReturnValueHandler.handleReturnValue(ResponseEntityReturnValueHandler.java:79)\\r\\n\tat org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:136)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:612)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:491)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:439)\\r\\n\tat org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:358)\\r\\n\tat org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:209)\\r\\n\tat org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:286)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:150)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:239)\\r\\n\tat org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:243)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-23 17:47:53', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2014639365761802242', 4, 'org.springframework.http.converter.HttpMessageNotWritableException:No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'text/event-stream\\'', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/airag/chat/genAiWriter', 'org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'text/event-stream\\'\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:365)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:263)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ResponseEntityReturnValueHandler.handleReturnValue(ResponseEntityReturnValueHandler.java:79)\\r\\n\tat org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:136)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:612)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:491)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:439)\\r\\n\tat org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:358)\\r\\n\tat org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:209)\\r\\n\tat org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:286)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:150)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:239)\\r\\n\tat org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:243)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-23 18:00:30', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2014639467167490049', 4, 'org.springframework.http.converter.HttpMessageNotWritableException:No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'text/event-stream\\'', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/airag/chat/genAiWriter', 'org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'text/event-stream\\'\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:365)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:263)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ResponseEntityReturnValueHandler.handleReturnValue(ResponseEntityReturnValueHandler.java:79)\\r\\n\tat org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:136)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:612)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:491)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:439)\\r\\n\tat org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:358)\\r\\n\tat org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:209)\\r\\n\tat org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:286)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:150)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:239)\\r\\n\tat org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:243)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-23 18:00:54', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2014639834504634370', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@42729599', NULL, 40, NULL, '2026-01-23 18:02:21', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2014639909930803202', 4, 'org.springframework.http.converter.HttpMessageNotWritableException:No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'text/event-stream\\'', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/airag/chat/genAiWriter', 'org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'text/event-stream\\'\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:365)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:263)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ResponseEntityReturnValueHandler.handleReturnValue(ResponseEntityReturnValueHandler.java:79)\\r\\n\tat org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:136)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:612)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:491)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:439)\\r\\n\tat org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:358)\\r\\n\tat org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:209)\\r\\n\tat org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:286)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:150)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:239)\\r\\n\tat org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:243)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-23 18:02:39', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2014640365604184065', 2, '角色首页配置-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysRoleIndexController.queryPageList()', NULL, '  sysRoleIndex: SysRoleIndex(id=null, roleCode=null, url=null, component=null, route=null, priority=null, status=null, createBy=null, createTime=null, updateBy=null, updateTime=null, sysOrgCode=null, relationType=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@58ac3c3d', NULL, 35, NULL, '2026-01-23 18:04:28', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2014644846156849154', 2, '填值规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysFillRuleController.queryPageList()', NULL, '  sysFillRule: SysFillRule(id=null, ruleName=null, ruleCode=null, ruleClass=null, ruleParams=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  req: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@4807616d', NULL, 10, NULL, '2026-01-23 18:22:16', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2014644850082717697', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@65d06773', NULL, 38, NULL, '2026-01-23 18:22:17', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2014645507799916545', 2, '编码校验规则-分页列表查询', 1, 'admin', '管理员', '0:0:0:0:0:0:0:1', 'org.jeecg.modules.system.controller.SysCheckRuleController.queryPageList()', NULL, '  sysCheckRule: SysCheckRule(id=null, ruleName=null, ruleCode=null, ruleJson=null, ruleDescription=null, updateBy=null, updateTime=null, createBy=null, createTime=null)  pageNo: 1  pageSize: 10  request: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper@6d3dcc75', NULL, 9, NULL, '2026-01-23 18:24:54', NULL, NULL, NULL, NULL);\nINSERT INTO `sys_log` VALUES ('2015701636197933058', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-26 16:21:35', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2015702124893069313', 4, 'org.springframework.web.context.request.async.AsyncRequestNotUsableException:Response not usable after response errors.', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/airag/chat/send', 'org.springframework.web.context.request.async.AsyncRequestNotUsableException: Response not usable after response errors.\\r\\n\tat org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleHttpServletResponse.obtainLockOrRaiseException(StandardServletAsyncWebRequest.java:338)\\r\\n\tat org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleHttpServletResponse.flushBuffer(StandardServletAsyncWebRequest.java:320)\\r\\n\tat org.springframework.http.server.ServletServerHttpResponse.flush(ServletServerHttpResponse.java:105)\\r\\n\tat org.springframework.http.server.DelegatingServerHttpResponse.flush(DelegatingServerHttpResponse.java:61)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitterReturnValueHandler$DefaultSseEmitterHandler.complete(ResponseBodyEmitterReturnValueHandler.java:325)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter.complete(ResponseBodyEmitter.java:251)\\r\\n\tat org.jeecg.modules.airag.app.service.impl.AiragChatServiceImpl.lambda$createSSE$4(AiragChatServiceImpl.java:496)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter$ErrorCallback.accept(ResponseBodyEmitter.java:400)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter$ErrorCallback.accept(ResponseBodyEmitter.java:388)\\r\\n\tat org.springframework.web.context.request.async.DeferredResult$LifecycleInterceptor.handleError(DeferredResult.java:338)\\r\\n\tat org.springframework.web.context.request.async.DeferredResultInterceptorChain.triggerAfterError(DeferredResultInterceptorChain.java:99)\\r\\n\tat org.springframework.web.context.request.async.WebAsyncManager.lambda$startDeferredResultProcessing$6(WebAsyncManager.java:455)\\r\\n\tat org.springframework.web.context.request.async.StandardServletAsyncWebRequest.lambda$onError$0(StandardServletAsyncWebRequest.java:195)\\r\\n\tat java.base/java.util.ArrayList.forEach(ArrayList.java:1511)\\r\\n\tat org.springframework.web.context.request.async.StandardServletAsyncWebRequest.onError(StandardServletAsyncWebRequest.java:195)\\r\\n\tat org.apache.catalina.core.AsyncListenerWrapper.fireOnError(AsyncListenerWrapper.java:49)\\r\\n\tat org.apache.catalina.core.AsyncContextImpl.setErrorState(AsyncContextImpl.java:413)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:155)\\r\\n\tat org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:243)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-26 16:23:31', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2015703034134290434', 4, 'org.springframework.http.converter.HttpMessageNotWritableException:No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'text/event-stream\\'', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', '_t=1769415995325', '/jeecg-boot/airag/chat/receive/402881829bf96559019bf96559f40002', 'org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'text/event-stream\\'\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:365)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:263)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ResponseEntityReturnValueHandler.handleReturnValue(ResponseEntityReturnValueHandler.java:79)\\r\\n\tat org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:136)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:612)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:491)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:439)\\r\\n\tat org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:358)\\r\\n\tat org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:209)\\r\\n\tat org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:286)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:150)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:239)\\r\\n\tat org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:243)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-26 16:27:08', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2016403617082372097', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-28 14:51:00', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2016403790978215938', 1, '用户名: admin,登录成功！', NULL, 'admin', '管理员', '0:0:0:0:0:0:0:1', NULL, NULL, NULL, NULL, NULL, NULL, '2026-01-28 14:51:41', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2016404348782899202', 4, 'org.springframework.web.context.request.async.AsyncRequestNotUsableException:Response not usable after response errors.', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', NULL, '/jeecg-boot/airag/chat/send', 'org.springframework.web.context.request.async.AsyncRequestNotUsableException: Response not usable after response errors.\\r\\n\tat org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleHttpServletResponse.obtainLockOrRaiseException(StandardServletAsyncWebRequest.java:338)\\r\\n\tat org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleHttpServletResponse.flushBuffer(StandardServletAsyncWebRequest.java:320)\\r\\n\tat org.springframework.http.server.ServletServerHttpResponse.flush(ServletServerHttpResponse.java:105)\\r\\n\tat org.springframework.http.server.DelegatingServerHttpResponse.flush(DelegatingServerHttpResponse.java:61)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitterReturnValueHandler$DefaultSseEmitterHandler.complete(ResponseBodyEmitterReturnValueHandler.java:325)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter.complete(ResponseBodyEmitter.java:251)\\r\\n\tat org.jeecg.modules.airag.app.service.impl.AiragChatServiceImpl.lambda$createSSE$4(AiragChatServiceImpl.java:496)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter$ErrorCallback.accept(ResponseBodyEmitter.java:400)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter$ErrorCallback.accept(ResponseBodyEmitter.java:388)\\r\\n\tat org.springframework.web.context.request.async.DeferredResult$LifecycleInterceptor.handleError(DeferredResult.java:338)\\r\\n\tat org.springframework.web.context.request.async.DeferredResultInterceptorChain.triggerAfterError(DeferredResultInterceptorChain.java:99)\\r\\n\tat org.springframework.web.context.request.async.WebAsyncManager.lambda$startDeferredResultProcessing$6(WebAsyncManager.java:455)\\r\\n\tat org.springframework.web.context.request.async.StandardServletAsyncWebRequest.lambda$onError$0(StandardServletAsyncWebRequest.java:195)\\r\\n\tat java.base/java.util.ArrayList.forEach(ArrayList.java:1511)\\r\\n\tat org.springframework.web.context.request.async.StandardServletAsyncWebRequest.onError(StandardServletAsyncWebRequest.java:195)\\r\\n\tat org.apache.catalina.core.AsyncListenerWrapper.fireOnError(AsyncListenerWrapper.java:49)\\r\\n\tat org.apache.catalina.core.AsyncContextImpl.setErrorState(AsyncContextImpl.java:413)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:155)\\r\\n\tat org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:243)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-28 14:53:54', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2016404349659508738', 4, 'org.springframework.http.converter.HttpMessageNotWritableException:No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'text/event-stream\\'', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', '_t=1769583206767', '/jeecg-boot/airag/chat/receive/402881829c035f70019c0360ca7f000d', 'org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'text/event-stream\\'\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:365)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:263)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ResponseEntityReturnValueHandler.handleReturnValue(ResponseEntityReturnValueHandler.java:79)\\r\\n\tat org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:136)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:612)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:491)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:439)\\r\\n\tat org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:358)\\r\\n\tat org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:209)\\r\\n\tat org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:286)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:150)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:239)\\r\\n\tat org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:243)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-28 14:53:55', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2016409247742443522', 4, 'org.springframework.http.converter.HttpMessageNotWritableException:No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'text/event-stream\\'', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', '_t=1769584380278', '/jeecg-boot/airag/chat/receive/402881829c036e42019c0372ab65000d', 'org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'text/event-stream\\'\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:365)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:263)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ResponseEntityReturnValueHandler.handleReturnValue(ResponseEntityReturnValueHandler.java:79)\\r\\n\tat org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:136)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:612)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:491)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:439)\\r\\n\tat org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:358)\\r\\n\tat org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:209)\\r\\n\tat org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:286)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:150)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:239)\\r\\n\tat org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:243)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-28 15:13:22', NULL, NULL, NULL, 'pc');\nINSERT INTO `sys_log` VALUES ('2016409247822135298', 4, 'org.springframework.http.converter.HttpMessageNotWritableException:No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'text/event-stream\\'', NULL, NULL, NULL, '0:0:0:0:0:0:0:1', '_t=1769584380321', '/jeecg-boot/airag/chat/receive/402881829c036e42019c0372ab65000d', 'org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.util.LinkedHashMap] with preset Content-Type \\'text/event-stream\\'\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:365)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:263)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ResponseEntityReturnValueHandler.handleReturnValue(ResponseEntityReturnValueHandler.java:79)\\r\\n\tat org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:136)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)\\r\\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)\\r\\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\\r\\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)\\r\\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)\\r\\n\tat jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:65)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:109)\\r\\n\tat org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:138)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:70)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:463)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.lambda$doFilterInternal$0(AbstractShiroFilter.java:378)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:91)\\r\\n\tat org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:84)\\r\\n\tat org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:389)\\r\\n\tat org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:376)\\r\\n\tat org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:156)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)\\r\\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:612)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:491)\\r\\n\tat org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:439)\\r\\n\tat org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:358)\\r\\n\tat org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:209)\\r\\n\tat org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:286)\\r\\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:150)\\r\\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)\\r\\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\\r\\n\tat org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:239)\\r\\n\tat org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:243)\\r\\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57)\\r\\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)\\r\\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1769)\\r\\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1189)\\r\\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:658)\\r\\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)\\r\\n\tat java.base/java.lang.Thread.run(Thread.java:842)\\r\\n', NULL, NULL, NULL, '2026-01-28 15:13:22', NULL, NULL, NULL, 'pc');\n\n-- ----------------------------\n-- Table structure for sys_permission\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_permission`;\nCREATE TABLE `sys_permission`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id',\n  `parent_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父id',\n  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单标题',\n  `url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '路径',\n  `component` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '组件',\n  `is_route` tinyint(1) NULL DEFAULT 1 COMMENT '是否路由菜单: 0:不是  1:是（默认值1）',\n  `component_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '组件名字',\n  `redirect` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '一级菜单跳转地址',\n  `menu_type` int(11) NULL DEFAULT NULL COMMENT '菜单类型(0:一级菜单; 1:子菜单:2:按钮权限)',\n  `perms` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单权限编码',\n  `perms_type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '权限策略1显示2禁用',\n  `sort_no` double(8, 2) NULL DEFAULT NULL COMMENT '菜单排序',\n  `always_show` tinyint(1) NULL DEFAULT NULL COMMENT '聚合子路由: 1是0否',\n  `icon` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单图标',\n  `is_leaf` tinyint(1) NULL DEFAULT NULL COMMENT '是否叶子节点:    1是0否',\n  `keep_alive` tinyint(1) NULL DEFAULT NULL COMMENT '是否缓存该页面:    1:是   0:不是',\n  `hidden` tinyint(4) NULL DEFAULT 0 COMMENT '是否隐藏路由: 0否,1是',\n  `hide_tab` tinyint(4) NULL DEFAULT NULL COMMENT '是否隐藏tab: 0否,1是',\n  `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',\n  `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  `del_flag` int(11) NULL DEFAULT 0 COMMENT '删除状态 0正常 1已删除',\n  `rule_flag` int(3) NULL DEFAULT 0 COMMENT '是否添加数据权限1是0否',\n  `status` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '按钮权限状态(0无效1有效)',\n  `internal_or_external` tinyint(1) NULL DEFAULT NULL COMMENT '外链菜单打开方式 0/内部打开 1/外部打开',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `index_menu_type`(`menu_type`) USING BTREE,\n  INDEX `index_menu_hidden`(`hidden`) USING BTREE,\n  INDEX `index_menu_status`(`status`) USING BTREE,\n  INDEX `index_menu_del_flag`(`del_flag`) USING BTREE,\n  INDEX `index_menu_url`(`url`) USING BTREE,\n  INDEX `index_menu_sort_no`(`sort_no`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '菜单权限表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_permission\n-- ----------------------------\nINSERT INTO `sys_permission` VALUES ('1170592628746878978', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '菜单管理', '/system/menu', 'system/menu/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, 'ant-design:menu-fold-outlined', 0, 0, 0, 0, NULL, 'admin', '2019-09-08 15:00:05', 'ceshi', '2023-10-18 12:02:41', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('119213522910765570', '1674708136602542082', '租户用户', '/system/tenant/TenantUserList', 'system/tenant/TenantUserList', 1, 'tenant-system-user', NULL, 1, NULL, NULL, 2.00, 0, 'ant-design:user', 1, 0, 0, 0, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2025-08-12 18:23:19', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1211885237487923202', '1207203817658105858', 'btn:add', '', '', 1, NULL, NULL, 2, 'btn:add', '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2019-12-31 13:42:11', 'admin', '2020-01-07 20:07:53', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1214376304951664642', '3f915b2769fc80648e92d04e84ca059d', '用户编辑', '', '', 0, NULL, NULL, 2, 'system:user:edit', '1', 1.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2020-01-07 10:40:47', 'admin', '2022-11-17 16:24:33', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1214462306546319322', '119213522910765570', '新增用户', '', '', 1, NULL, NULL, 2, 'system:user:addTenantUser', '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2020-01-07 16:22:32', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1214462306546319362', '3f915b2769fc80648e92d04e84ca059d', '新增用户', '', '', 0, NULL, NULL, 2, 'system:user:add', '1', 1.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2020-01-07 16:22:32', 'admin', '2022-11-17 16:24:47', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1280350452934307841', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '多租户管理', '/system/tenant', 'system/tenant/index', 1, NULL, NULL, 1, NULL, '1', 6.00, 0, 'ant-design:appstore-twotone', 0, 0, 0, 0, NULL, 'admin', '2020-07-07 11:58:30', 'admin', '2025-06-25 14:16:36', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108176273760258', '', '主页', '/dashboard', 'layouts/default/index', 1, NULL, '/dashboard/analysis', 0, NULL, '1', 1.00, 0, 'ant-design:home-outlined', 0, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:23', 'admin', '2025-09-13 18:49:01', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108176814825473', '1438108176273760258', '工作台', '/dashboard/workbench', 'dashboard/workbench/index', 1, NULL, NULL, 1, NULL, '1', 2.00, 0, 'ant-design:appstore-twotone', 1, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:23', 'jeecg', '2024-06-13 11:37:46', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108176932265985', '1438108178010202113', '权限管理', '/permission', 'layouts/default/index', 1, NULL, '/permission/front/page', 0, NULL, '1', 2.00, 0, 'ion:key-outline', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108177074872321', '1438108176932265985', '基于前端权限', '/permission/front', NULL, 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108177188118529', '1438108176932265985', '基于后台权限', '/permission/back', NULL, 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108177351696386', '1438108177074872321', '页面权限', '/permission/front/page', 'demo/permission/front/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', 'admin', '2021-09-16 14:37:49', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108177565605889', '1438108177074872321', '按钮权限', '/permission/front/btn', 'demo/permission/front/Btn', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', 'admin', '2021-09-15 19:57:23', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108177720795137', '1438108177188118529', '页面权限', '/permission/back/page', 'demo/permission/back/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', 'admin', '2021-09-15 19:56:40', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108177880178689', '1438108177188118529', '按钮权限', '/permission/back/btn', 'demo/permission/back/Btn', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', 'admin', '2021-09-15 19:57:00', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108178010202113', '1438108196993622018', '功能示例', '/feat', 'layouts/default/index', 1, NULL, '/feat/icon', 0, NULL, '1', 20.00, 0, 'ion:git-compare-outline', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108178127642626', '1438108197958315557', '图标', '/comp/basic/icon', 'demo/feat/icon/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108178257666049', '1438108178010202113', 'websocket测试', '/feat/ws', 'demo/feat/ws/index', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108178421243905', '1438108178010202113', '登录过期', '/feat/session-timeout', 'demo/feat/session-timeout/index', 1, NULL, NULL, 1, NULL, '1', 2.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108178643542017', '1438108197958311677', '打印', '/comp/third/print', 'demo/feat/print/index', 1, NULL, NULL, 1, NULL, '1', 3.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108178781954049', '1438108197958315557', 'Tab操作', '/comp/basic/tabs', 'demo/feat/tabs/index', 1, NULL, NULL, 1, NULL, '1', 4.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108178781954050', '1438108197958315557', 'TabDetail', '/comp/basic/tabs/detail/:id', 'demo/feat/tabs/TabDetail', 1, NULL, '/comp/basic/tabs/detail', 1, NULL, '1', 4.00, 0, NULL, 1, 0, 1, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108178911977473', '1438108187455774722', '面包屑导航', '/feat/breadcrumb', 'layouts/default/index', 1, NULL, '/feat/breadcrumb/flat', 1, NULL, '1', 5.00, 0, 'ant-design:right-square-filled', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', 'admin', '2021-09-17 15:48:07', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108179226550273', '1438108197958311677', '右键菜单', '/comp/third/context-menu', 'demo/feat/context-menu/index', 1, NULL, NULL, 1, NULL, '1', 6.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108179381739521', '1438108197958311677', '文件下载', '/comp/third/download', 'demo/feat/download/index', 1, NULL, NULL, 1, NULL, '1', 7.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108179599843330', '1438108197958311677', 'ClickOutSide组件', '/comp/third/click-out-side', 'demo/feat/click-out-side/index', 1, NULL, NULL, 1, NULL, '1', 8.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:23', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108179910221825', '1438108197958311677', '图片预览', '/comp/third/img-preview', 'demo/feat/img-preview/index', 1, NULL, NULL, 1, NULL, '1', 9.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108180077993985', '1438108197958311677', '剪切板', '/comp/third/copy', 'demo/feat/copy/index', 1, NULL, NULL, 1, NULL, '1', 10.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108180258349057', '1438108197958315557', '消息提示', '/comp/basic/msg', 'demo/feat/msg/index', 1, NULL, NULL, 1, NULL, '1', 11.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108180434509826', '1438108197958311677', '水印', '/comp/third/watermark', 'demo/feat/watermark/index', 1, NULL, NULL, 1, NULL, '1', 12.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108180631642113', '1438108197958311677', '水波纹', '/comp/third/ripple', 'demo/feat/ripple/index', 1, NULL, NULL, 1, NULL, '1', 13.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108180770054145', '1438108178010202113', '全屏', '/feat/full-screen', 'demo/feat/full-screen/index', 1, NULL, NULL, 1, NULL, '1', 14.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108182116425729', '1438108197958311677', '日历(New)', '/comp/third/fullCalendar', 'demo/fullcalendar/index', 1, NULL, NULL, 1, NULL, '1', 16.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', NULL, NULL, 1, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108183085309954', '1438108178010202113', '错误日志', '/feat/error-log', 'sys/error-log/index', 1, NULL, NULL, 1, NULL, '1', 17.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108183219527682', '1438108196993622018', 'Excel', '/feat/excel', 'layouts/default/index', 1, NULL, '/feat/excel/customExport', 1, NULL, '1', 18.00, 0, 'ant-design:file-excel-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', 'admin', '2021-09-17 15:54:57', 1, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108183395688450', '1438108187455774722', 'Tab带参', '/feat/testTab/:id', 'demo/feat/tab-params/index', 1, NULL, NULL, 1, NULL, '1', 19.00, 0, 'ant-design:insert-row-above-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', 'admin', '2021-09-17 15:48:57', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108183492157442', '1438108187455774722', 'Menu带参', '/feat/testParam/:id', 'layouts/default/index', 1, NULL, NULL, 1, NULL, '1', 20.00, 0, 'ant-design:menu-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', 'admin', '2021-09-17 15:49:12', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108183630569474', '1438108178911977473', '平级模式', '/feat/breadcrumb/flat', 'demo/feat/breadcrumb/FlatList', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', 'admin', '2021-09-15 20:12:01', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108183630569477', '1438108178911977473', '平级详情', '/feat/breadcrumb/flatDetail', 'demo/feat/breadcrumb/FlatListDetail', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 1, 1, NULL, 'admin', '2021-09-15 19:51:24', 'admin', '2021-09-18 11:07:07', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108183777370114', '1438108183630569474', '平级详情', '/feat/breadcrumb/flatDetail', 'demo/feat/breadcrumb/FlatListDetail', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 1, NULL, NULL, 'admin', '2021-09-15 19:51:24', 'admin', '2021-09-15 20:13:41', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108183907393538', '1438108178911977473', '层级模式', '/feat/breadcrumb/children', 'demo/feat/breadcrumb/ChildrenList', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', 'admin', '2021-09-15 20:11:57', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108184049999873', '1438108183907393538', '层级详情', '/feat/breadcrumb/children/childrenDetail', 'demo/feat/breadcrumb/ChildrenListDetail', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:24', 'admin', '2021-09-15 20:11:49', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108185660612609', '1438108183219527682', '选择导出格式', '/feat/excel/customExport', 'demo/excel/CustomExport', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2021-09-15 20:15:59', 1, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108185815801858', '1438108183219527682', 'JSON数据导出', '/feat/excel/jsonExport', 'demo/excel/JsonExport', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2021-09-15 20:16:15', 1, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108185958408193', '1438108183219527682', 'Array数据导出', '/feat/excel/arrayExport', 'demo/excel/ArrayExport', 1, NULL, NULL, 1, NULL, '1', 2.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2021-09-15 20:16:32', 1, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108186289758209', '1438108183219527682', '导入', '/feat/excel/importExcel', 'demo/excel/ImportExcel', 1, NULL, NULL, 1, NULL, '1', 3.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2021-09-15 20:16:43', 1, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108186717577217', '1438108183492157442', 'Menu带参1', '/feat/testParam/:id/sub1', 'demo/feat/menu-params/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2021-09-15 20:17:23', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108187103453186', '1438108183492157442', 'Menu带参2', '/feat/testParam/:id/sub2', 'demo/feat/menu-params/index', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2021-09-15 20:17:36', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108187455774722', '', '导航示例', '/page-demo', 'layouts/default/index', 1, NULL, '/page-demo/form/basic', 0, NULL, '1', 12.00, 0, 'ion:aperture-outline', 0, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2025-06-25 14:22:40', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108187678072833', '1438108187455774722', '表单页', '/page-demo/form', 'layouts/default/index', 1, NULL, '/page-demo/form/basic', 1, NULL, '1', 0.00, 0, 'ant-design:form-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2021-09-17 15:45:30', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108187871010818', '1438108187455774722', '详情页', '/page-demo/desc', 'layouts/default/index', 1, NULL, '/page-demo/desc/basic', 1, NULL, '1', 1.00, 0, 'ant-design:border-right-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2021-09-17 15:46:10', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108188034588674', '1438108187455774722', '结果页', '/page-demo/result', 'layouts/default/index', 1, NULL, '/page-demo/result/success', 1, NULL, '1', 2.00, 0, 'ant-design:account-book-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:25', 'admin', '2021-09-17 15:47:04', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108188378521602', '1438108187455774722', '个人页', '/page-demo/account', 'layouts/default/index', 1, NULL, '/page-demo/account/setting', 1, NULL, '1', 3.00, 0, 'ant-design:user-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', 'admin', '2021-09-17 15:47:23', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108188542099458', '1438108187455774722', '异常页', '/page-demo/exception', 'layouts/default/index', 1, NULL, '/page-demo/exception/404', 1, NULL, '1', 4.00, 0, 'ant-design:bug-twotone', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', 'admin', '2021-09-17 15:47:41', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108188714065922', '1438108187455774722', '列表页', '/page-demo/list', 'layouts/default/index', 1, NULL, '/page-demo/list/card', 1, NULL, '1', 5.00, 0, 'ant-design:table-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', 'admin', '2021-09-17 15:48:19', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108189062193153', '1438108187678072833', '基础表单', '/page-demo/form/basic', 'demo/page/form/basic/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108189427097601', '1438108187678072833', '分步表单', '/page-demo/form/step', 'demo/page/form/step/index', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108189754253313', '1438108187678072833', '高级表单', '/page-demo/form/high', 'demo/page/form/high/index', 1, NULL, NULL, 1, NULL, '1', 2.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108190110769154', '1438108187871010818', '基础详情页', '/page-demo/desc/basic', 'demo/page/desc/basic/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108190404370433', '1438108187871010818', '高级详情页', '/page-demo/desc/high', 'demo/page/desc/high/index', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108190777663490', '1438108188034588674', '成功页', '/page-demo/result/success', 'demo/page/result/success/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108191356477442', '1438108188034588674', '失败页', '/page-demo/result/fail', 'demo/page/result/fail/index', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:26', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108192623157249', '1438108188378521602', '个人中心', '/page-demo/account/center', 'demo/page/account/center/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:27', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108193701093378', '1438108188378521602', '个人设置', '/page-demo/account/setting', 'demo/page/account/setting/index', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:27', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108194992939010', '1438108188542099458', '403', '/page-demo/exception/403', 'sys/exception/NotAccessException', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:27', 'admin', '2021-09-18 18:02:47', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108195307511809', '1438108188542099458', '404', '/page-demo/exception/404', 'sys/exception/Exception', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:27', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108195487866881', '1438108188542099458', '500', '/page-demo/exception/500', 'sys/exception/ServerErrorException', 1, NULL, NULL, 1, NULL, '1', 2.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:27', 'admin', '2021-09-18 18:04:34', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108195638861825', '1438108188542099458', '网络错误', '/page-demo/exception/net-work-error', 'sys/exception/NetworkErrorException', 1, NULL, NULL, 1, NULL, '1', 3.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:27', 'admin', '2021-09-18 18:05:05', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108195924074497', '1438108188542099458', '无数据', '/page-demo/exception/not-data', 'sys/exception/NotDataErrorException', 1, NULL, NULL, 1, NULL, '1', 4.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:27', 'admin', '2021-09-18 18:05:40', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108196263813121', '1438108188714065922', '标准列表', '/page-demo/list/basic', 'demo/page/list/basic/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:27', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108196528054273', '1438108188714065922', '卡片列表', '/page-demo/list/card', 'demo/page/list/card/index', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:27', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108196855209985', '1438108188714065922', '搜索列表', '/page-demo/list/search', 'demo/page/list/search/index', 1, NULL, NULL, 1, NULL, '1', 2.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108196993622018', '', '组件示例', '/comp', 'layouts/default/index', 1, NULL, '/comp/basic', 0, NULL, '1', 11.00, 0, 'ion:layers-outline', 0, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2025-06-25 14:22:30', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108197270446081', '1438108197958311537', '自定义组件示例', '/comp/jeecg/basic', 'demo/jeecg/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108197790539778', '1438108197958315557', 'Button组件', '/comp/basic/button', 'demo/comp/button/index', 1, NULL, NULL, 1, NULL, '1', 8.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 09:31:48', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108197958311537', '1438108196993622018', 'Jeecg组件示例', '/comp/jeecg', 'layouts/default/index', 1, NULL, '/comp/jeecg/basic', 1, NULL, '1', 1.00, 0, 'ant-design:sketch-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:49:57', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108197958311637', '1438108196993622018', '弹框抽屉', '/comp/modal', 'layouts/default/index', 1, NULL, '/comp/modal/basic', 1, NULL, '1', 6.00, 0, 'ant-design:laptop-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:53:10', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108197958311677', '1438108196993622018', '第三方组件', '/comp/third', 'layouts/default/index', 1, NULL, '/comp/third/basic', 1, NULL, '1', 7.00, 0, 'ant-design:slack-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:53:31', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108197958311937', '1438108196993622018', 'Form示例', '/comp/form', 'layouts/default/index', 1, NULL, '/comp/form/basic', 1, NULL, '1', 2.00, 0, 'ant-design:pic-left-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:50:39', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108197958315557', '1438108196993622018', '基础组件', '/comp/basic', 'layouts/default/index', 1, NULL, '/comp/basic', 1, NULL, '1', 1.00, 0, 'ant-design:insert-row-left-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:50:27', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108198113501186', '1438108196993622018', 'Table示例', '/comp/table', 'layouts/default/index', 1, NULL, '/comp/table/basic', 1, NULL, '1', 3.00, 0, 'ant-design:table-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:50:51', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108198339993602', '1438108197958311677', '动画组件', '/comp/third/transition', 'demo/comp/transition/index', 1, NULL, NULL, 1, NULL, '1', 9.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108198679732226', '1438108197958311537', '一对多示例', '/comp/jeecg/oneToMore', 'demo/vextable/index', 1, NULL, NULL, 1, NULL, '1', 6.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108198855892993', '1438108197958311677', '图片裁剪', '/comp/third/basic', 'demo/comp/cropper/index', 1, NULL, NULL, 1, NULL, '1', 7.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108199120134145', '1438108197958311677', '相对时间', '/comp/third/timestamp', 'demo/comp/time/index', 1, NULL, NULL, 1, NULL, '1', 8.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108199304683521', '1438108197958311677', '数字动画', '/comp/third/countTo', 'demo/comp/count-to/index', 1, NULL, NULL, 1, NULL, '1', 9.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108199413735425', '1438108196993622018', 'Tree示例', '/comp/tree', 'layouts/default/index', 1, NULL, '/comp/tree/basic', 1, NULL, '1', 4.00, 0, 'ant-design:partition-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:54:17', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108199539564546', '1438108196993622018', '编辑器', '/comp/editor', 'layouts/default/index', 1, NULL, '/comp/editor/markdown', 1, NULL, '1', 5.00, 0, 'ant-design:credit-card-twotone', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:52:47', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108199631839234', '1438108196993622018', '滚动组件', '/comp/scroll', 'layouts/default/index', 1, NULL, '/comp/scroll/basic', 1, NULL, '1', 11.00, 0, 'ant-design:column-height-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:53:43', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108200076435458', '1438108197958311637', '弹窗扩展', '/comp/modal/basic', 'demo/comp/modal/index', 1, NULL, NULL, 1, NULL, '1', 12.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108200391008257', '1438108197958311637', '抽屉扩展', '/comp/modal/drawer', 'demo/comp/drawer/index', 1, NULL, NULL, 1, NULL, '1', 13.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108200672026626', '1438108197958315557', '详情组件', '/comp/desc', 'demo/comp/desc/index', 1, NULL, NULL, 1, NULL, '1', 14.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108200802050050', '1438108196993622018', '懒加载组件', '/comp/lazy', 'layouts/default/index', 1, NULL, '/comp/lazy/basic', 1, NULL, '1', 15.00, 0, 'ant-design:small-dash-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:28', 'admin', '2021-09-17 15:53:59', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108200919490562', '1438108196993622018', '验证组件', '/comp/verify', 'layouts/default/index', 1, NULL, '/comp/verify/drag', 1, NULL, '1', 16.00, 0, 'ant-design:field-binary-outlined', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', 'admin', '2021-09-17 15:54:36', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108201150177281', '1438108197958311677', '二维码组件', '/comp/third/qrcode', 'demo/comp/qrcode/index', 1, NULL, NULL, 1, NULL, '1', 17.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108201502498817', '1438108197958311677', '密码强度组件', '/comp/third/strength-meter', 'demo/comp/strength-meter/index', 1, NULL, NULL, 1, NULL, '1', 18.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108202060341249', '1438108197958311677', 'Loading', '/comp/third/loading', 'demo/comp/loading/index', 1, NULL, NULL, 1, NULL, '1', 20.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108202366525441', '1438108197958311937', '基础表单', '/comp/form/basic', 'demo/form/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108203649982466', '1438108197958311937', 'useForm', '/comp/form/useForm', 'demo/form/UseForm', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108203817754625', '1438108197958311937', 'RefForm', '/comp/form/refForm', 'demo/form/RefForm', 1, NULL, NULL, 1, NULL, '1', 2.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108204023275521', '1438108197958311937', '可收缩表单', '/comp/form/advancedForm', 'demo/form/AdvancedForm', 1, NULL, NULL, 1, NULL, '1', 3.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108204232990721', '1438108197958311937', '表单验证', '/comp/form/ruleForm', 'demo/form/RuleForm', 1, NULL, NULL, 1, NULL, '1', 4.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108204400762881', '1438108197958311937', '动态表单', '/comp/form/dynamicForm', 'demo/form/DynamicForm', 1, NULL, NULL, 1, NULL, '1', 5.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108204576923649', '1438108197958311937', '自定义组件', '/comp/form/customerForm', 'demo/form/CustomerForm', 1, NULL, NULL, 1, NULL, '1', 6.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108204732112898', '1438108197958311937', '表单增删示例', '/comp/form/appendForm', 'demo/form/AppendForm', 1, NULL, NULL, 1, NULL, '1', 7.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108205004742657', '1438108198113501186', '基础表格', '/comp/table/basic', 'demo/table/Basic', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108205180903426', '1438108198113501186', '树形表格', '/comp/table/treeTable', 'demo/table/TreeTable', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108205357064193', '1438108198113501186', '远程加载示例', '/comp/table/fetchTable', 'demo/table/FetchTable', 1, NULL, NULL, 1, NULL, '1', 2.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108205587750914', '1438108198113501186', '固定列', '/comp/table/fixedColumn', 'demo/table/FixedColumn', 1, NULL, NULL, 1, NULL, '1', 3.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108205742940161', '1438108198113501186', '自定义列', '/comp/table/customerCell', 'demo/table/CustomerCell', 1, NULL, NULL, 1, NULL, '1', 4.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108205919100930', '1438108198113501186', '开启搜索区域', '/comp/table/formTable', 'demo/table/FormTable', 1, NULL, NULL, 1, NULL, '1', 5.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108206086873089', '1438108198113501186', 'UseTable', '/comp/table/useTable', 'demo/table/UseTable', 1, NULL, NULL, 1, NULL, '1', 6.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108206258839553', '1438108198113501186', 'RefTable', '/comp/table/refTable', 'demo/table/RefTable', 1, NULL, NULL, 1, NULL, '1', 7.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108206489526274', '1438108198113501186', '多级表头', '/comp/table/multipleHeader', 'demo/table/MultipleHeader', 1, NULL, NULL, 1, NULL, '1', 8.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108206661492738', '1438108198113501186', '合并单元格', '/comp/table/mergeHeader', 'demo/table/MergeHeader', 1, NULL, NULL, 1, NULL, '1', 9.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108206959288321', '1438108198113501186', '嵌套子表格', '/comp/table/nestedTable', 'demo/table/NestedTable', 1, NULL, NULL, 1, NULL, '1', 10.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108207160614913', '1438108198113501186', '可展开表格', '/comp/table/expandTable', 'demo/table/ExpandTable', 1, NULL, NULL, 1, NULL, '1', 11.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108207374524418', '1438108198113501186', '定高/头部自定义', '/comp/table/fixedHeight', 'demo/table/FixedHeight', 1, NULL, NULL, 1, NULL, '1', 12.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108207563268097', '1438108198113501186', '表尾行合计', '/comp/table/footerTable', 'demo/table/FooterTable', 1, NULL, NULL, 1, NULL, '1', 13.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108207793954818', '1438108198113501186', '可编辑单元格', '/comp/table/editCellTable', 'demo/table/EditCellTable', 1, NULL, NULL, 1, NULL, '1', 14.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108208024641538', '1438108198113501186', '可编辑行', '/comp/table/editRowTable', 'demo/table/EditRowTable', 1, NULL, NULL, 1, NULL, '1', 15.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108208297271297', '1438108198113501186', '权限列', '/comp/table/authColumn', 'demo/table/AuthColumn', 1, NULL, NULL, 1, NULL, '1', 16.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108208817364993', '1438108199413735425', '基础树', '/comp/tree/basic', 'demo/tree/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108208980942850', '1438108199413735425', '可搜索/工具栏', '/comp/tree/editTree', 'demo/tree/EditTree', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108209228406785', '1438108199413735425', '函数操作示例', '/comp/tree/actionTree', 'demo/tree/ActionTree', 1, NULL, NULL, 1, NULL, '1', 2.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108210117599234', '1438108199539564546', 'Json编辑器', '/comp/editor/json', 'demo/editor/json/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:31', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108210260205570', '1438108199539564546', 'markdown编辑器', '/comp/editor/markdown', NULL, 1, NULL, '/comp/editor/markdown/index', 1, NULL, '1', 1.00, 0, NULL, 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:31', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108211325558785', '1438108210260205570', '基础使用', '/comp/editor/markdown/index', 'demo/editor/markdown/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:31', 'admin', '2021-09-16 14:40:59', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108211661103106', '1438108210260205570', '嵌入form', '/comp/editor/markdown/editor', 'demo/editor/markdown/Editor', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:31', 'admin', '2021-09-16 14:41:04', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108211778543618', '1438108199539564546', '富文本', '/comp/editor/tinymce', NULL, 1, NULL, '/comp/editor/tinymce/index', 1, NULL, '1', 2.00, 0, NULL, 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:31', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108214882328577', '1438108211778543618', '基础使用', '/comp/editor/tinymce/index', 'demo/editor/tinymce/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108215335313409', '1438108211778543618', '嵌入form', '/comp/editor/tinymce/editor', 'demo/editor/tinymce/Editor', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108215511474177', '1438108199631839234', '基础滚动', '/comp/scroll/basic', 'demo/comp/scroll/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108215687634945', '1438108199631839234', '滚动函数', '/comp/scroll/action', 'demo/comp/scroll/Action', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108215989624834', '1438108199631839234', '虚拟滚动', '/comp/scroll/virtualScroll', 'demo/comp/scroll/VirtualScroll', 1, NULL, NULL, 1, NULL, '1', 2.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108216300003330', '1438108200802050050', '基础示例', '/comp/lazy/basic', 'demo/comp/lazy/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108216597798914', '1438108200802050050', '动画效果', '/comp/lazy/transition', 'demo/comp/lazy/Transition', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108216971091969', '1438108200919490562', '拖拽校验', '/comp/verify/drag', 'demo/comp/verify/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108217449242626', '1438108200919490562', '图片还原', '/comp/verify/rotate', 'demo/comp/verify/Rotate', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108217562488834', '1438108187455774722', '图表', '/charts', 'layouts/default/index', 1, NULL, '/charts/echarts/map', 0, NULL, '1', 7.00, 0, 'ion:bar-chart-outline', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:32', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108217860284417', '1438108217562488834', '百度地图', '/charts/baiduMap', 'demo/charts/map/Baidu', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108218049028097', '1438108217562488834', '高德地图', '/charts/aMap', 'demo/charts/map/Gaode', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108218409738242', '1438108217562488834', 'Echarts', '/charts/echarts', NULL, 1, NULL, '/charts/echarts/map', 1, NULL, '1', 3.00, 0, NULL, 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108218787225601', '1438108218409738242', '地图', '/charts/echarts/map', 'demo/charts/Map', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108219034689538', '1438108218409738242', '折线图', '/charts/echarts/line', 'demo/charts/Line', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108219240210434', '1438108218409738242', '饼图', '/charts/echarts/pie', 'demo/charts/Pie', 1, NULL, NULL, 1, NULL, '1', 2.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108219445731330', '1438108187455774722', '外部页面', '/frame', 'layouts/default/index', 1, NULL, '/frame/doc', 0, NULL, '1', 8.00, 0, 'ion:tv-outline', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108219592531970', '1438108219445731330', '项目文档(内嵌)', '/frame/doc', 'http://vue3.jeecg.com', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:33', 'admin', '2021-11-15 17:59:32', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108219793858561', '1438108219445731330', 'antVue文档(内嵌)', '/frame/antv', 'https://2x.antdv.com/docs/vue/introduce-cn', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:33', 'admin', '2021-11-11 17:11:10', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108220137791489', '1438108219445731330', '项目文档(外链)', '/', 'http://vue3.jeecg.com/', 1, NULL, NULL, 1, NULL, '1', 2.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:33', 'admin', '2021-10-25 13:46:59', 0, 0, '1', 1);\nINSERT INTO `sys_permission` VALUES ('1438108220418809857', '1438108187455774722', '多级菜单', '/level', 'layouts/default/index', 1, NULL, '/level/menu1/menu1-1/menu1-1-1', 0, NULL, '1', 9.00, 0, 'ion:menu-outline', 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108220523667458', '1438108220418809857', 'Menu1', '/level/menu1', NULL, 1, NULL, '/level/menu1/menu1-1/menu1-1-1', 1, NULL, '1', 0.00, 0, NULL, 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108220724994049', '1438108220418809857', 'Menu2', '/level/menu2', 'demo/level/Menu2', 1, 'Menu2Demo', NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-09-15 19:51:33', 'admin', '2022-09-20 15:24:13', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108220896960513', '1438108220523667458', 'Menu1-1', '/level/menu1/menu1-1', NULL, 1, NULL, '/level/menu1/menu1-1/menu1-1-1', 1, NULL, '1', 0.00, 0, NULL, 0, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:33', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108221127647234', '1438108220896960513', 'Menu1-1-1', '/level/menu1/menu1-1/menu1-1-1', 'demo/level/Menu111', 1, 'Menu111Demo', NULL, 1, NULL, '1', 0.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-09-15 19:51:33', 'admin', '2022-09-20 15:24:03', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108221270253570', '1438108220523667458', 'Menu1-2', '/level/menu1/menu1-2', 'demo/level/Menu12', 1, 'Menu12Demo', NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2021-09-15 19:51:33', 'admin', '2022-09-20 15:24:08', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108221551271937', '1438108196993622018', 'Mock示例', '/system', 'layouts/default/index', 1, NULL, '/system/account', 1, NULL, '1', 10.00, 0, 'ion:settings-outline', 0, 0, 0, 0, NULL, 'admin', '2021-09-15 19:51:33', 'admin', '2025-06-25 14:22:54', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108221849067522', '1438108221551271937', '测试功能', '/system/test', 'demo/system/test/index', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, 'ant-design:bulb-outlined', 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:34', 'admin', '2021-09-17 15:55:36', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108222218166273', '1438108221551271937', '账号管理', '/system/account', 'demo/system/account/index', 1, NULL, NULL, 1, NULL, '1', 1.00, 0, 'ant-design:user-outlined', 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:34', 'admin', '2021-09-17 15:55:46', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108222721482753', '1438108221551271937', '账号详情', '/system/account_detail/:id', 'demo/system/account/AccountDetail', 1, NULL, NULL, 1, NULL, '1', 2.00, 0, 'ant-design:idcard-twotone', 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:34', 'admin', '2021-09-17 15:56:12', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108223489040385', '1438108221551271937', '部门管理', '/system/dept', 'demo/system/dept/index', 1, NULL, NULL, 1, NULL, '1', 5.00, 0, 'ant-design:usergroup-add-outlined', 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:34', 'admin', '2021-09-17 15:56:34', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108223661006850', '1438108221551271937', '修改密码', '/system/changePassword', 'demo/system/password/index', 1, NULL, NULL, 1, NULL, '1', 6.00, 0, 'ant-design:field-number-outlined', 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:34', 'admin', '2021-09-17 15:56:46', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108225263230978', '1438108178010202113', '引导页', '/setup/index', 'demo/setup/index', 1, NULL, NULL, 1, NULL, '1', 12.00, 0, 'whh:paintroll', 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:34', 'admin', '2021-09-17 09:02:19', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438108225451974658', '', '关于', '/about/index', 'sys/about/index', 1, NULL, NULL, 0, NULL, '1', 13.00, 0, 'simple-icons:about-dot-me', 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 19:51:34', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438115924159881218', '1438108183395688450', 'Tab带参1', '/testTab/id1', 'demo/feat/tab-params/index', 1, NULL, NULL, 1, NULL, '0', 0.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2021-09-15 20:22:10', 'admin', '2021-09-16 14:38:32', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438116003012796418', '1438108183395688450', 'Tab带参2', '/feat/testTab/id2', 'demo/feat/tab-params/index', 1, NULL, NULL, 1, NULL, '0', 1.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-15 20:22:29', 'admin', '2023-08-25 13:32:42', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1438469604861403137', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '职务级别', '/system/position', 'system/position/index', 1, NULL, NULL, 1, NULL, '0', 5.00, 0, 'ant-design:database-filled', 1, 0, 0, NULL, NULL, 'admin', '2021-09-16 19:47:33', 'admin', '2021-09-17 15:58:22', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1438782530717495298', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '分类字典', '/system/category', 'system/category/index', 1, NULL, NULL, 1, NULL, '0', 9.00, 0, 'ant-design:group-outlined', 1, 0, 0, NULL, NULL, 'admin', '2021-09-17 16:31:01', NULL, NULL, 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1438782641187074050', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '数据字典', '/system/dict', 'system/dict/index', 1, NULL, NULL, 1, NULL, '0', 4.00, 0, 'ant-design:hdd-twotone', 0, 0, 0, 0, NULL, 'admin', '2021-09-17 16:31:27', 'admin', '2023-03-04 15:01:55', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1438782851980210178', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '通知公告', '/system/notice', 'system/notice/index', 1, NULL, NULL, 1, NULL, '0', 8.00, 0, 'ant-design:bell-outlined', 1, 0, 0, NULL, NULL, 'admin', '2021-09-17 16:32:17', 'admin', '2021-09-17 16:36:15', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1438783058792951810', '1438108197958311537', '单表示例', '/system/examples/demo', 'system/examples/demo/index', 1, NULL, NULL, 1, NULL, '0', 1.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-17 16:33:07', 'admin', '2021-12-08 14:10:47', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1439398677984878593', '', '系统监控', '/monitor', 'layouts/RouteView', 1, NULL, NULL, 0, NULL, '0', 5.00, 0, 'ant-design:video-camera-filled', 0, 0, 0, 0, NULL, 'admin', '2021-09-19 09:19:22', 'admin', '2022-10-14 16:21:08', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1439399179791409153', '1439398677984878593', '网关路由', '/monitor/route', 'monitor/route/index', 1, NULL, NULL, 1, NULL, '0', 0.00, 0, 'ant-design:branches-outlined', 0, 0, 0, 0, NULL, 'admin', '2021-09-19 09:21:21', 'admin', '2025-07-31 11:32:32', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1439488251473993730', '1439398677984878593', '定时任务', '/monitor/quartz', 'monitor/quartz/index', 1, NULL, NULL, 1, NULL, '0', 1.00, 0, 'ant-design:history-outlined', 0, 0, 0, 0, NULL, 'admin', '2021-09-19 15:15:18', NULL, NULL, 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1439511654494937090', '1439398677984878593', '数据源管理', '/monitor/datasource', 'monitor/datasource/index', 1, NULL, NULL, 1, NULL, '0', 3.00, 0, 'ant-design:hdd-filled', 0, 0, 0, 0, NULL, 'admin', '2021-09-19 16:48:17', NULL, NULL, 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1439531077792473089', '1439398677984878593', '数据日志', '/monitor/datalog', 'monitor/datalog/index', 1, NULL, NULL, 1, NULL, '0', 6.00, 0, 'ant-design:funnel-plot-twotone', 1, 0, 0, 0, NULL, 'admin', '2021-09-19 18:05:28', 'admin', '2025-06-25 16:45:47', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1439533711676973057', '1439398677984878593', '日志管理', '/monitor/log', 'monitor/log/index', 1, NULL, NULL, 1, NULL, '0', 5.00, 0, 'ant-design:interaction-outlined', 0, 0, 0, 0, NULL, 'admin', '2021-09-19 18:15:56', 'admin', '2021-09-19 18:16:56', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1439542701152575489', '1443390062919208961', '我的消息', '/monitor/mynews', 'monitor/mynews/index', 1, NULL, NULL, 1, NULL, '0', 6.00, 0, '', 1, 0, 0, 0, NULL, 'admin', '2021-09-19 18:51:40', 'admin', '2022-09-22 10:33:10', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1439784356766064642', '1439398677984878593', 'SQL监控', '/monitor/druid', '{{ window._CONFIG[\\'domianURL\\'] }}/druid', 1, NULL, NULL, 1, NULL, '0', 8.00, 0, 'ant-design:rocket-filled', 1, 0, 0, 0, NULL, 'admin', '2021-09-20 10:51:55', 'admin', '2021-11-15 18:21:20', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1439797053314342913', '1439398677984878593', '性能监控', '/monitor/server', 'monitor/server/index', 1, NULL, NULL, 1, NULL, '0', 9.00, 0, 'ant-design:thunderbolt-filled', 1, 0, 0, 0, NULL, 'admin', '2021-09-20 11:42:22', 'admin', '2021-09-20 14:13:14', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1439839507094740994', '1439398677984878593', 'Redis监控', '/monitor/redis', 'monitor/redis/index', 1, NULL, NULL, 1, NULL, '0', 10.00, 0, 'ant-design:trademark-outlined', 1, 0, 0, 0, NULL, 'admin', '2021-09-20 14:31:04', NULL, NULL, 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1439842640030113793', '1439398677984878593', '请求追踪', '/monitor/trace', 'monitor/trace/index', 1, NULL, NULL, 1, NULL, '0', 11.00, 0, 'ant-design:ie-circle-filled', 1, 0, 0, 0, NULL, 'admin', '2021-09-20 14:43:31', NULL, NULL, 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1441340399835742209', '1438108197958311537', '打印示例', '/jeecg/PrintDemo', 'demo/jeecg/PrintDemo', 1, NULL, NULL, 1, NULL, '0', 7.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-24 17:55:05', 'admin', '2021-09-24 17:55:20', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1441357157443371009', '1438108197958311537', '表格合计', '/jeecg/tableTotal', 'demo/jeecg/TableTotal', 1, NULL, NULL, 1, NULL, '0', 8.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-24 19:01:40', NULL, NULL, 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1441361249200832513', '1438108197958311537', '异步树表格', '/jeecg/AsyncTreeTable', 'demo/jeecg/AsyncTreeTable', 1, NULL, NULL, 1, NULL, '0', 9.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-24 19:17:56', 'admin', '2021-09-26 16:05:55', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1442055284830769154', '1438108197958311537', '对象存储', '/system/ossfile', 'system/ossfile/index', 1, NULL, NULL, 1, NULL, '0', 11.00, 0, 'ant-design:file-add-outlined', 0, 0, 0, 0, NULL, 'jeecg', '2021-09-26 17:15:47', 'admin', '2022-10-14 16:23:35', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1443390062919208961', '', '消息中心', '/message', 'layouts/default/index', 1, NULL, '/message/manage', 0, NULL, '0', 7.00, 0, 'ant-design:message-outlined', 0, 0, 0, 0, NULL, 'admin', '2021-09-30 09:39:43', 'admin', '2025-07-31 11:32:02', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1443391584864358402', '1443390062919208961', '消息模板', '/message/template', 'system/message/template/index', 1, NULL, NULL, 1, NULL, '0', 2.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-09-30 09:45:45', 'admin', '2022-09-22 10:32:42', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1446778415130722306', '1438108219445731330', 'JEECG官网', '/', 'http://www.jeecg.com', 0, NULL, NULL, 1, NULL, '0', 1.00, 0, NULL, 1, 0, 0, 0, NULL, 'jeecg', '2021-10-09 18:03:49', 'admin', '2021-11-15 18:01:26', 0, 0, NULL, 1);\nINSERT INTO `sys_permission` VALUES ('1447535997560909826', '1438108197270446081', '禁用', NULL, NULL, 0, NULL, NULL, 2, 'demo.dbarray', '2', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-10-11 20:14:10', 'admin', '2021-10-11 20:18:48', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1447763172274495489', '', '统计报表', '/report', 'layouts/RouteView', 1, NULL, NULL, 0, NULL, '0', 10.00, 0, 'ant-design:bar-chart-outlined', 0, 0, 0, 0, NULL, 'jeecg', '2021-10-12 11:16:53', 'admin', '2025-06-25 14:24:19', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1447763517847396354', '1447763172274495489', 'EChartDemo', '/report/chartDemo', 'report/chartdemo/index', 1, NULL, NULL, 1, NULL, '0', 1.00, 0, NULL, 1, 0, 0, 0, NULL, 'jeecg', '2021-10-12 11:18:15', 'jeecg', '2021-10-14 14:36:38', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1448252726202859522', '1447763172274495489', '布局统计报表', '/statisticst', 'report/statisticst/index', 1, NULL, NULL, 1, NULL, '0', 2.00, 0, NULL, 1, 0, 0, 0, NULL, 'jeecg', '2021-10-13 19:42:12', NULL, NULL, 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1450308897429536769', '1438108197958311537', 'JVxeTable示例', '/jeecg/j-vxe-table-demo', 'demo/jeecg/JVxeTableDemo/index', 1, NULL, NULL, 1, NULL, '0', 10.00, 0, NULL, 0, 0, 0, 0, NULL, 'admin', '2021-10-19 11:52:41', 'admin', '2021-10-19 11:54:46', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1452508868884353026', '1866001513609637890', '报表设计器', '/jmreport', '{{ window._CONFIG[\\'domianURL\\'] }}/jmreport/list?token=${token}', 1, NULL, NULL, 1, NULL, '0', 1.00, 0, '', 1, 0, 0, 0, NULL, 'admin', '2021-10-25 13:34:35', 'admin', '2025-05-22 10:53:59', 0, 0, '1', 1);\nINSERT INTO `sys_permission` VALUES ('1453250018282573826', '1438108197958311537', '一对多内嵌', '/innerTable', 'demo/jeecg/InnerExpandTable', 1, NULL, NULL, 1, NULL, '0', 12.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-10-27 14:39:39', 'admin', '2021-10-27 14:40:29', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1454031324835807233', '1450308897429536769', '综合示例', '/jeecg/j-vxe-table-demo/normal', 'demo/jeecg/JVxeTableDemo/index', 1, NULL, NULL, 1, NULL, '0', 1.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-10-29 18:24:17', 'admin', '2021-10-29 18:25:28', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1454031820661260289', '1450308897429536769', '即时保存', '/jeecg/j-vxe-table-demo/jsbc', 'demo/jeecg/JVxeTableDemo/func-demo/JSBCDemo', 1, NULL, NULL, 1, NULL, '0', 2.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-10-29 18:26:15', NULL, NULL, 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1454034512171302914', '1450308897429536769', '无痕刷新', '/jeecg/j-vxe-table-demo/whsx', 'demo/jeecg/JVxeTableDemo/func-demo/SocketReload', 1, NULL, NULL, 1, NULL, '0', 3.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-10-29 18:36:57', NULL, NULL, 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1455019819440021505', '1450308897429536769', '弹出子表', '/jeecg/j-vxe-table-demo/tczb', 'demo/jeecg/JVxeTableDemo/func-demo/PopupSubTable', 1, NULL, NULL, 1, NULL, '0', 4.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-11-01 11:52:13', 'admin', '2021-11-01 11:52:19', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1455067599277662209', '1450308897429536769', '布局模板', '/jeecg/j-vxe-table-demo/layout', 'demo/jeecg/JVxeTableDemo/layout-demo/index', 1, NULL, NULL, 1, NULL, '0', 5.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-11-01 15:02:04', NULL, NULL, 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1455100420297859074', '', '低代码开发', '/online', 'layouts/default/index', 1, NULL, '/online/cgform', 0, NULL, '0', 2.00, 0, 'ant-design:cloud-outlined', 0, 0, 0, 0, NULL, 'admin', '2021-11-01 17:12:29', 'admin', '2025-11-25 16:20:16', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1455101470794850305', '1455100420297859074', 'Online表单开发', '/online/cgform', 'super/online/cgform/index', 1, NULL, NULL, 1, NULL, '0', 1.00, 0, NULL, 0, 0, 0, 0, NULL, 'admin', '2021-11-01 17:16:40', 'admin', '2022-04-04 18:36:25', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1455735714507472898', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '通讯录', '/address', 'system/address/index', 1, NULL, NULL, 1, NULL, '0', 20.00, 0, 'ant-design:book-outlined', 1, 0, 0, 0, NULL, 'admin', '2021-11-03 11:16:55', 'admin', '2023-10-18 13:54:58', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1457678003102879745', '1455100420297859074', '系统编码规则', '/system/fillrule', 'system/fillRule/index', 1, NULL, NULL, 1, NULL, '0', 6.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-11-08 19:54:53', 'jeecg', '2024-06-13 11:36:43', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1458353686530232321', '1455100420297859074', '系统校验规则', '/system/checkrule', 'system/checkRule/index', 1, NULL, NULL, 1, NULL, '0', 5.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2021-11-10 16:39:48', 'jeecg', '2024-06-13 11:36:37', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1458389305235984385', '1438108197958311537', '一对多ERP', '/erplist', 'demo/jeecg/erplist/index', 1, NULL, NULL, 1, NULL, '0', 11.00, 0, '', 1, 0, 0, 0, NULL, 'admin', '2021-11-10 19:01:21', 'admin', '2021-11-30 14:06:53', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1460888189937176577', '1455100420297859074', 'Online报表配置', '/online/cgreport', 'super/online/cgreport/index', 1, NULL, NULL, 1, NULL, '0', 2.00, 0, NULL, 0, 0, 0, 0, NULL, 'admin', '2021-11-17 16:31:01', 'admin', '2021-12-08 10:55:32', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1461270075543347202', '1455100420297859074', 'Online表单视图', '/online/copyform/:code', 'super/online/cgform/CgformCopyList', 1, NULL, NULL, 1, NULL, '0', 99.00, 0, NULL, 1, 0, 1, 0, NULL, 'admin', '2021-11-18 17:48:30', NULL, NULL, 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1461291438825558017', '1455100420297859074', 'AUTO在线报表', '/online/cgreport/:id', 'super/online/cgreport/auto/OnlCgReportList', 1, NULL, NULL, 1, NULL, '0', 21.00, 0, NULL, 1, 0, 1, 0, NULL, 'admin', '2021-11-18 19:13:23', 'jeecg', '2024-06-13 11:36:13', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1465686870713782273', '1455100420297859074', 'AUTO在线表单', '/online/cgformList/:id', 'super/online/cgform/auto/default/OnlineAutoList', 1, NULL, NULL, 1, NULL, '0', 25.00, 0, NULL, 1, 0, 1, 0, NULL, 'admin', '2021-11-30 22:19:16', 'jeecg', '2024-06-13 11:37:14', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1473927410093187073', '1866001513609637890', '大屏和仪表盘', '/report/drag', '{{ window._CONFIG[\\'domianURL\\'] }}/drag/list?token=${token}&tenantId=${tenantId}', 0, NULL, NULL, 1, NULL, '0', 2.00, 0, '', 0, 0, 0, 0, NULL, 'admin', '2021-12-23 16:04:13', 'admin', '2025-05-22 10:53:53', 0, 0, NULL, 1);\nINSERT INTO `sys_permission` VALUES ('1509417558230999041', '1455100420297859074', 'AUTO树表单列表', '/online/cgformTreeList/:id', 'super/online/cgform/auto/tree/OnlineAutoTreeList', 1, NULL, NULL, 1, NULL, '0', 25.00, 0, NULL, 1, 0, 1, 0, NULL, 'admin', '2022-03-31 14:29:24', 'jeecg', '2024-06-13 11:37:18', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1534418199197323265', '1438108197958311537', '单表原生示例', '/one/OneNativeList', 'demo/jeecg/Native/one/OneNativeList', 1, NULL, NULL, 1, NULL, '0', 13.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-06-08 14:13:01', 'admin', '2022-06-08 14:13:12', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1534500282601893890', '1455101470794850305', '代码生成', NULL, NULL, 0, NULL, NULL, 2, 'online:form:generateCode', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-06-08 19:39:11', 'admin', '2022-06-30 13:39:19', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1535225446864011265', '1460888189937176577', '批量删除', NULL, NULL, 0, NULL, NULL, 2, 'online:report:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-06-10 19:40:44', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1535226870641475586', '1455101470794850305', '批量删除', NULL, NULL, 0, NULL, NULL, 2, 'online:form:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-06-10 19:46:23', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1535227149789184001', '1455101470794850305', '新建SQL增强', NULL, NULL, 0, NULL, NULL, 2, 'online:form:enhanceSql:save', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-06-10 19:47:30', 'admin', '2022-06-30 13:42:36', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1542383139476467713', '1455101470794850305', '编辑SQL增强', NULL, NULL, 0, NULL, NULL, 2, 'online:form:enhanceSql:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-06-30 13:42:51', 'admin', '2022-06-30 13:43:38', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1542383223979110402', '1455101470794850305', '删除SQL增强', NULL, NULL, 0, NULL, NULL, 2, 'online:form:enhanceSql:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-06-30 13:43:11', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1542383292690198530', '1455101470794850305', '批量删除SQL增强', NULL, NULL, 0, NULL, NULL, 2, 'online:form:enhanceSql:batchDelete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-06-30 13:43:28', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1542383437808922625', '1455101470794850305', '导入数据库表', NULL, NULL, 0, NULL, NULL, 2, 'online:form:importTable', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-06-30 13:44:02', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1542383507883159553', '1455101470794850305', '添加JAVA增强', NULL, NULL, 0, NULL, NULL, 2, 'online:form:enhanceJava:save', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-06-30 13:44:19', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1542383573423353858', '1455101470794850305', '修改JAVA增强', NULL, NULL, 0, NULL, NULL, 2, 'online:form:enhanceJava:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-06-30 13:44:35', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1542383826117586945', '1455101470794850305', '删除Online表单', NULL, NULL, 0, NULL, NULL, 2, 'online:form:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-06-30 13:45:35', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1542383907281563650', '1455101470794850305', '移除Online表单', NULL, NULL, 0, NULL, NULL, 2, 'online:form:remove', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-06-30 13:45:54', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1542385335362383873', '1473927410093187073', '删除仪表盘', NULL, NULL, 0, NULL, NULL, 2, 'onl:drag:page:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-06-30 13:51:35', 'admin', '2022-06-30 13:51:42', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1546736974756032513', '1455101470794850305', '选择代码生成路径', NULL, NULL, 0, NULL, NULL, 2, 'online:codeGenerate:projectPath', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-07-12 14:03:26', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1554384900763729922', '1473927410093187073', '模板设置', NULL, NULL, 0, NULL, NULL, 2, 'drag:template:edit', '2', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'jeecg', '2022-08-02 16:33:34', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1580833876002627585', '1447763172274495489', 'Online报表例子', '/online/cgreport/1256627801873821698', '1', 0, '', NULL, 1, NULL, '0', 3.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-10-14 16:12:21', 'admin', '2022-10-14 16:21:55', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1580834045490257922', '1447763172274495489', 'Online表单例子', '/online/cgformList/d35109c3632c4952a19ecc094943dd71', '1', 0, '', NULL, 1, NULL, '0', 4.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-10-14 16:13:02', 'jeecg', '2024-06-13 11:39:36', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1580835899477483522', '1447763172274495489', '积木报表例子', '/jmreport/view/961455b47c0b86dc961e90b5893bff05', '{{ window._CONFIG[\\'domianURL\\'] }}/jmreport/view/961455b47c0b86dc961e90b5893bff05?token=${token}', 1, '', NULL, 1, NULL, '0', 5.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-10-14 16:20:24', 'admin', '2022-10-14 16:20:51', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1580877743141933058', '1447763172274495489', '生产销售监控大屏', '/test/bigScreen/templat/index1', '{{ window._CONFIG[\\'domianURL\\'] }}/test/bigScreen/templat/index1', 1, '', NULL, 1, NULL, '0', 6.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-10-14 19:06:40', 'admin', '2023-09-20 21:15:55', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1580877931331964929', '1447763172274495489', '智慧物流监控大屏', '/test/bigScreen/templat/index2', '{{ window._CONFIG[\\'domianURL\\'] }}/test/bigScreen/templat/index2', 1, '', NULL, 1, NULL, '0', 7.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-10-14 19:07:25', 'admin', '2023-09-20 21:16:03', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1580878668472504321', '1447763172274495489', '积木大屏案例', '/test/jmbigscreen2', 'https://cloud.jimureport.com/bigscreen/#/view/bs_1394991793166094338', 1, '', NULL, 1, NULL, '0', 9.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-10-14 19:10:21', 'admin', '2022-10-28 10:18:19', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1588513553652436993', '3f915b2769fc80648e92d04e84ca059d', '修改密码', NULL, NULL, 0, NULL, NULL, 2, 'system:user:changepwd', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-04 20:48:39', 'admin', '2022-11-04 20:49:06', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1590154870697734146', '1447763172274495489', '带参数报表', '/online/cgreport/1590154651759259649?sex=1', 'layouts/RouteView', 0, '1', NULL, 1, NULL, '0', 11.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-09 09:30:39', 'jeecg', '2024-06-21 15:03:29', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1592102143467200514', '1597419994965786625', '给指定角色添加用户', NULL, NULL, 0, NULL, NULL, 2, 'system:user:addUserRole', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:18:49', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592112984361365505', '1170592628746878978', '添加菜单', NULL, NULL, 0, NULL, NULL, 2, 'system:permission:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:11:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592113148350263298', '190c2b43bec6a5f7a4194a85db67d96a', '保存角色授权', NULL, NULL, 0, NULL, NULL, 2, 'system:permission:saveRole', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:12:09', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592114574275211265', '3f915b2769fc80648e92d04e84ca059d', '删除用户', NULL, NULL, 0, NULL, NULL, 2, 'system:user:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:17:49', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592114574275211345', '119213522910765570', '删除用户', NULL, NULL, 0, NULL, NULL, 2, 'system:user:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:17:49', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592114652566089729', '3f915b2769fc80648e92d04e84ca059d', '批量删除用户', NULL, NULL, 0, NULL, NULL, 2, 'system:user:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:18:08', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592114721138765826', '3f915b2769fc80648e92d04e84ca059d', '冻结/解冻用户', NULL, NULL, 0, NULL, NULL, 2, 'system:user:frozenBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:18:24', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592114772665790465', '3f915b2769fc80648e92d04e84ca059d', '首页用户重置密码', NULL, NULL, 0, NULL, NULL, 2, 'system:user:updatepwd', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:18:37', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592114823467200514', '3f915b2769fc80648e92d04e84ca059d', '给指定角色添加用户', NULL, NULL, 0, NULL, NULL, 2, 'system:user:addUserRole', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:18:49', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592114893302362114', '3f915b2769fc80648e92d04e84ca059d', '删除指定角色的用户关系', NULL, NULL, 0, NULL, NULL, 2, 'system:user:deleteRole', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:19:05', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592114893302823614', '1597419994965786625', '删除指定角色的用户关系', NULL, NULL, 0, NULL, NULL, 2, 'system:user:deleteRole', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:19:05', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592114955650691074', '3f915b2769fc80648e92d04e84ca059d', '批量删除指定角色的用户关系', NULL, NULL, 0, NULL, NULL, 2, 'system:user:deleteRoleBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:19:20', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592114955650691174', '1597419994965786625', '批量删除指定角色的用户关系', NULL, NULL, 0, NULL, NULL, 2, 'system:user:deleteRoleBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:19:20', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592115070432014338', '3f915b2769fc80648e92d04e84ca059d', '给指定部门添加对应的用户', NULL, NULL, 0, NULL, NULL, 2, 'system:user:editDepartWithUser', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:19:48', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592115115361398786', '3f915b2769fc80648e92d04e84ca059d', '删除指定机构的用户关系', NULL, NULL, 0, NULL, NULL, 2, 'system:user:deleteUserInDepart', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:19:58', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592115162379546625', '3f915b2769fc80648e92d04e84ca059d', '批量删除指定机构的用户关系', NULL, NULL, 0, NULL, NULL, 2, 'system:user:deleteUserInDepartBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:20:09', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592115213910765570', '3f915b2769fc80648e92d04e84ca059d', '彻底删除用户', NULL, NULL, 0, NULL, NULL, 2, 'system:user:deleteRecycleBin', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:20:22', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592115610431877122', '1439511654494937090', '多数据源分页列表', NULL, NULL, 0, NULL, NULL, 2, 'system:datasource:list', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:21:56', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592115712422330529', '1961009998209257473', '部门添加', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:22:21', 'admin', '2022-11-14 19:30:49', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592115712466710529', '45c966826eeff4c99b8f8ebfe74511fc', '部门添加', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:22:21', 'admin', '2022-11-14 19:30:49', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592115914493751297', '1170592628746878978', '编辑菜单权限数据', NULL, NULL, 0, NULL, NULL, 2, 'system:permission:editRule', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:23:09', 'admin', '2022-11-14 19:39:25', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592116663936184322', '1170592628746878978', '编辑菜单', NULL, NULL, 0, NULL, NULL, 2, 'system:permission:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:26:07', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592117222764277032', '1961009998209257473', '部门编辑', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:28:21', 'admin', '2022-11-14 19:30:55', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592117222764277761', '45c966826eeff4c99b8f8ebfe74511fc', '部门编辑', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:28:21', 'admin', '2022-11-14 19:30:55', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592117276539449345', '45c966826eeff4c99b8f8ebfe74511fc', '部门删除', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:28:33', 'admin', '2022-11-14 19:31:06', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592117276539449346', '1961009998209257473', '部门删除', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:28:33', 'admin', '2022-11-14 19:31:06', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592117377299214337', '45c966826eeff4c99b8f8ebfe74511fc', '部门批量删除', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:28:58', 'admin', '2022-11-14 19:31:12', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592117377299214338', '1961009998209257473', '部门批量删除', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:28:58', 'admin', '2022-11-14 19:31:12', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592117422006300673', '45c966826eeff4c99b8f8ebfe74511fc', '部门导入', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:29:08', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592117625664925697', '5c2f42277948043026b7a14692456828', '部门角色添加', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:role:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:29:57', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592117748209905665', '5c2f42277948043026b7a14692456828', '部门角色编辑', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:role:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:30:26', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592117804359053314', '5c2f42277948043026b7a14692456828', '部门角色删除', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:role:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:30:39', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592117990305132545', '5c2f42277948043026b7a14692456828', '部门角色批量删除', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:role:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:31:24', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592118053634928641', '5c2f42277948043026b7a14692456828', '部门角色用户授权', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:role:userAdd', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:31:39', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592118192218927105', '1438782641187074050', '字典新增', NULL, NULL, 0, NULL, NULL, 2, 'system:dict:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:32:12', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592118254844080130', '1438782641187074050', '字典编辑', NULL, NULL, 0, NULL, NULL, 2, 'system:dict:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:32:27', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592118306983473154', '1438782641187074050', '字典删除', NULL, NULL, 0, NULL, NULL, 2, 'system:dict:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:32:39', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592118356778250241', '1438782641187074050', '字典批量删除', NULL, NULL, 0, NULL, NULL, 2, 'system:dict:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:32:51', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592118414990995457', '1438782641187074050', '字典导入', NULL, NULL, 0, NULL, NULL, 2, 'system:dict:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:33:05', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592118497606201346', '1439399179791409153', '路由网关删除', NULL, NULL, 0, NULL, NULL, 2, 'system:getway:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:33:25', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592118604640645122', '1170592628746878978', '删除菜单', NULL, NULL, 0, NULL, NULL, 2, 'system:permission:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:33:50', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592118648315932674', '1170592628746878978', '批量删除菜单', NULL, NULL, 0, NULL, NULL, 2, 'system:permission:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:34:01', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592119001883176961', '1170592628746878978', '添加菜单权限数据', NULL, NULL, 0, NULL, NULL, 2, 'system:permission:addRule', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:35:25', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592120052866707457', '1170592628746878978', '删除菜单权限数据', NULL, NULL, 0, NULL, NULL, 2, 'system:permission:deleteRule', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:39:35', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592120222727630849', '45c966826eeff4c99b8f8ebfe74511fc', '保存部门授权', NULL, NULL, 0, NULL, NULL, 2, 'system:permission:saveDepart', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:40:16', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592120224120850434', '190c2b43bec6a5f7a4194a85db67d96a', '查询全部角色不租户隔离', NULL, NULL, 0, NULL, NULL, 2, 'system:role:queryallNoByTenant', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-01-11 19:41:18', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592120323667750914', '190c2b43bec6a5f7a4194a85db67d96a', '角色添加', NULL, NULL, 0, NULL, NULL, 2, 'system:role:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:40:40', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592120323667750934', '1597419994965786625', '角色添加', NULL, NULL, 0, NULL, NULL, 2, 'system:role:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:40:40', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592120372296511490', '190c2b43bec6a5f7a4194a85db67d96a', '角色编辑', NULL, NULL, 0, NULL, NULL, 2, 'system:role:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:40:52', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592120372296522490', '1597419994965786625', '角色编辑', NULL, NULL, 0, NULL, NULL, 2, 'system:role:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:40:52', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592120427007012865', '190c2b43bec6a5f7a4194a85db67d96a', '角色删除', NULL, NULL, 0, NULL, NULL, 2, 'system:role:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:41:05', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592120427223412865', '1597419994965786625', '角色删除', NULL, NULL, 0, NULL, NULL, 2, 'system:role:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:41:05', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592120484120850434', '190c2b43bec6a5f7a4194a85db67d96a', '角色批量删除', NULL, NULL, 0, NULL, NULL, 2, 'system:role:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:41:18', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592120594695286785', '190c2b43bec6a5f7a4194a85db67d96a', '角色首页配置添加', NULL, NULL, 0, NULL, NULL, 2, 'system:roleindex:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:41:45', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592120649007329281', '190c2b43bec6a5f7a4194a85db67d96a', '角色首页配置编辑', NULL, NULL, 0, NULL, NULL, 2, 'system:roleindex:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:41:58', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1592135223910765570', '3f915b2769fc80648e92d04e84ca059d', '查询全部用户', NULL, NULL, 0, NULL, NULL, 2, 'system:user:listAll', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:20:22', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1593160905216663554', '1438782641187074050', '字典子项新增', NULL, NULL, 0, NULL, NULL, 2, 'system:dict:item:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-17 16:35:34', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1593160959633563650', '1438782641187074050', '字典子项编辑', NULL, NULL, 0, NULL, NULL, 2, 'system:dict:item:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-17 16:35:47', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1593161025790320641', '1438782641187074050', '字典子项删除', NULL, NULL, 0, NULL, NULL, 2, 'system:dict:item:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-17 16:36:03', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1593161089787011074', '1438782641187074050', '字典子项批量删除', NULL, NULL, 0, NULL, NULL, 2, 'system:dict:item:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-17 16:36:18', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1593161421350936578', '1439488251473993730', '添加定时任务', NULL, NULL, 0, NULL, NULL, 2, 'system:quartzJob:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-17 16:37:37', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1593161483627962370', '1439488251473993730', '更新定时任务', NULL, NULL, 0, NULL, NULL, 2, 'system:quartzJob:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-17 16:37:52', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1593161551202394114', '1439488251473993730', '删除定时任务', NULL, NULL, 0, NULL, NULL, 2, 'system:quartzJob:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-17 16:38:08', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1593161608362369026', '1439488251473993730', '批量删除定时任务', NULL, NULL, 0, NULL, NULL, 2, 'system:quartzJob:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-17 16:38:22', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1593161657385394177', '1439488251473993730', '停止定时任务', NULL, NULL, 0, NULL, NULL, 2, 'system:quartzJob:pause', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-17 16:38:33', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1593161697348722689', '1439488251473993730', '启动定时任务', NULL, NULL, 0, NULL, NULL, 2, 'system:quartzJob:resume', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-17 16:38:43', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1593161743607701505', '1439488251473993730', '立即执行定时任务', NULL, NULL, 0, NULL, NULL, 2, 'system:quartzJob:execute', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-17 16:38:54', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1593173018886709250', '1442055284830769154', '文件oos上传', NULL, NULL, 0, NULL, NULL, 2, 'system:ossFile:upload', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-17 17:23:42', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1593185714482880514', '3f915b2769fc80648e92d04e84ca059d', '用户导出', NULL, NULL, 0, NULL, NULL, 2, 'system:user:export', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-17 18:14:09', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1594930803956920321', '1439398677984878593', '在线用户', '/system/onlineuser', 'system/onlineuser/OnlineUserList', 1, '', NULL, 1, NULL, '0', 12.00, 0, 'ant-design:aliwangwang-outlined', 1, 0, 0, 0, NULL, 'admin', '2022-11-22 13:48:31', 'admin', '2023-03-04 15:15:36', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1596141938193747970', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '用户设置', '/system/usersetting', 'system/usersetting/UserSetting', 1, '', NULL, 1, NULL, '0', 12.00, 0, 'ant-design:setting-twotone', 0, 0, 1, 0, NULL, 'admin', '2022-11-25 22:01:08', 'admin', '2023-03-04 15:00:26', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1596335805278990338', '1596141938193747970', '账户设置用户编辑权限', NULL, NULL, 0, NULL, NULL, 2, 'system:user:setting:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-26 10:51:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1597419994965786625', '1674708136602542082', '租户角色', '/system/role/TenantRoleList', 'system/role/TenantRoleList', 1, 'tenant-role-list', NULL, 1, NULL, '0', 3.00, 0, 'ant-design:line-height-outlined', 0, 0, 0, 0, NULL, 'admin', '2022-11-29 10:39:40', 'admin', '2025-08-12 18:23:22', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('15c92115213910765570', '3f915b2769fc80648e92d04e84ca059d', '通过ID查询用户信息接口', NULL, NULL, 0, NULL, NULL, 2, 'system:user:queryById', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:20:22', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1600105607009162230', '1961253156897710081', '邀请用户', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:invitation:user', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-06 20:31:20', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1600105607009165314', '1280350452934307841', '邀请用户', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:invitation:user', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-06 20:31:20', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1600108123037913486', '1961253156897710081', '查询租户下用户', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:user:list', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-06 20:41:20', 'admin', '2023-01-11 12:10:48', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1600108123037917186', '1280350452934307841', '通过租户id获取用户', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:user:list', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-06 20:41:20', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1600129606082650113', '1280350452934307841', '租户请离', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:leave', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-06 22:06:42', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1600129606082650123', '119213522910765570', '租户请离', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:leave', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-06 22:06:42', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1609123240547344376', '1961253156897710081', '产品包分页列表查询', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:packList', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-31 17:44:11', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1609123240547344385', '1280350452934307841', '产品包分页列表查询', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:packList', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-31 17:44:11', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1609123437247619074', '1280350452934307841', '创建租户产品包', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:add:pack', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-31 17:44:58', 'admin', '2022-12-31 20:27:56', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1609164542165012482', '1280350452934307841', '编辑租户产品包', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:edit:pack', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-31 20:28:18', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1609164635442139138', '1280350452934307841', '批量删除租户产品包', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:delete:pack', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-31 20:28:41', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1611620416187969538', '1280350452934307841', '分页获取租户用户数据', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:tenantPageList', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-01-07 15:07:04', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1611620600003342337', '1280350452934307841', '通过用户id获取租户列表', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:getTenantListByUserId', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-01-07 15:07:48', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1611620654621569026', '1280350452934307841', '更新用户租户关系状态', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:updateUserTenantStatus', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-01-07 15:08:01', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1611620772498218641', '1280350452934307841', '查询租户列表', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:list', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-01-11 15:08:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1611620772498288641', '1280350452934307841', '注销租户', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:cancelTenant', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-01-07 15:08:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1611650772498288641', '1280350452934307841', '删除租户', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-01-11 15:08:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1612438989792034818', '1280350452934307841', '编辑租户', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-01-07 15:08:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1613620712498288641', '1280350452934307841', '批量删除租户', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-01-11 15:08:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1620261087828418562', '1280350452934307841', '获取租户删除的列表', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:recycleBinPageList', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-01-31 11:22:01', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1620305415648989186', '1280350452934307841', '彻底删除租户', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:deleteTenantLogic', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-01-31 14:18:10', 'admin', '2023-01-31 14:19:51', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1620327825894981634', '1280350452934307841', '租户还原', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:revertTenantLogic', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-01-31 15:47:13', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1620709334357532673', '1438108176273760258', '官网', 'https://jeecg.com', 'https://jeecg.com', 0, '', NULL, 1, NULL, '0', 5.00, 0, 'ant-design:layout-filled', 1, 0, 0, 0, NULL, 'jeecg', '2023-02-01 17:03:11', 'admin', '2025-09-13 18:54:44', 0, 0, NULL, 1);\nINSERT INTO `sys_permission` VALUES ('1621620772498288641', '1280350452934307841', '添加租户', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-01-11 15:08:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1629109281748291586', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '第三方配置', '/third/app', 'system/appconfig/ThirdAppConfigList', 1, '', NULL, 1, NULL, '0', 13.00, 0, 'ant-design:setting-outlined', 1, 0, 0, 0, NULL, 'admin', '2023-02-24 21:21:35', 'admin', '2023-02-24 21:51:05', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1660568280725127169', '1439533711676973057', '日志列表', NULL, NULL, 1, NULL, NULL, 2, 'system:log:list', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-05-22 16:48:25', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1660568368558047234', '1439533711676973057', '日志删除', NULL, NULL, 1, NULL, NULL, 2, 'system:log:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-05-22 16:48:46', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1660568426632380417', '1439533711676973057', '日志批量删除', NULL, NULL, 1, NULL, NULL, 2, 'system:log:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-05-22 16:48:59', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1668174661456171010', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '租户默认套餐', '/tenant/TenantDefaultPack', 'system/tenant/pack/TenantDefaultPackList', 1, '', NULL, 1, NULL, '0', 7.00, 0, 'ant-design:deployment-unit-outlined', 1, 0, 0, 0, NULL, 'admin', '2023-06-12 16:33:27', 'admin', '2025-07-30 17:34:03', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1674708136602542082', '', '我的租户', '/mytenant', 'layouts/RouteView', 1, '', NULL, 0, NULL, '0', 4.20, 0, 'ant-design:user-outlined', 0, 0, 0, 0, NULL, 'admin', '2023-06-30 17:15:09', 'admin', '2024-06-17 15:42:29', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1691031996d593131521', '1455100420297859074', 'AUTO在线ERP表单', '/online/cgformErpList/:id', 'super/online/cgform/auto/erp/OnlCgformErpList', 1, '', NULL, 1, NULL, '0', 21.00, 0, NULL, 1, 0, 1, 0, NULL, 'admin', '2023-08-14 18:20:20', 'jeecg', '2024-06-13 11:37:04', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1691031996d5931315212', '1455100420297859074', 'AUTO在线一对多内嵌', '/online/cgformInnerTableList/:id', 'super/online/cgform/auto/innerTable/OnlCgformInnerTableList', 1, '', NULL, 1, NULL, '0', 21.00, 0, NULL, 1, 0, 1, 0, NULL, 'admin', '2023-08-14 18:20:20', 'jeecg', '2024-06-13 11:37:07', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1691031996d5931315213', '1455100420297859074', 'AUTO在线Tab风格', '/online/cgformTabList/:id', 'super/online/cgform/auto/tab/OnlCgformTabList', 1, '', NULL, 1, NULL, '0', 21.00, 0, NULL, 1, 0, 1, 0, NULL, 'admin', '2023-08-14 18:20:20', 'jeecg', '2024-06-13 11:37:11', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1693195557097164801', '190c2b43bec6a5f7a4194a85db67d96a', '查询所有角色', NULL, NULL, 0, NULL, NULL, 2, 'system:role:list', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-08-20 17:37:34', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1697220712498288641', '1280350452934307841', '根据ids查询租户', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:queryList', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-01-11 15:08:29', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1698650926200352770', '1473927410093187073', '数据集解析SQL', NULL, NULL, 0, NULL, NULL, 2, 'drag:analysis:sql', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'jeecg', '2023-09-04 18:55:15', 'jeecg', '2023-09-05 20:36:51', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1699038961937113090', '1473927410093187073', '数据源添加', NULL, NULL, 0, NULL, NULL, 2, 'drag:datasource:saveOrUpate', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'jeecg', '2023-09-05 20:37:10', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1699039098474291201', '1473927410093187073', '数据源删除', NULL, NULL, 0, NULL, NULL, 2, 'drag:datasource:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'jeecg', '2023-09-05 20:37:42', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1699039192154071041', '1473927410093187073', '数据源批量删除', NULL, NULL, 0, NULL, NULL, 2, 'drag:datasource:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'jeecg', '2023-09-05 20:38:05', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1699374269152100354', '1455101470794850305', '同步数据库', NULL, NULL, 0, NULL, NULL, 2, 'online:form:syncDb', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-09-06 18:49:33', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1699374346553786370', '1455101470794850305', '添加Online表单', NULL, NULL, 0, NULL, NULL, 2, 'online:form:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-09-06 18:49:52', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1699374404015751169', '1455101470794850305', '修改Online表单', NULL, NULL, 0, NULL, NULL, 2, 'online:form:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-09-06 18:50:05', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1699374509749960705', '1455101470794850305', '查询数据库表名', NULL, NULL, 0, NULL, NULL, 2, 'online:form:queryTables', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-09-06 18:50:31', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1699374612388773890', '1460888189937176577', '获取字典列表', NULL, NULL, 0, NULL, NULL, 2, 'online:report:getDictList', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-09-06 18:50:55', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1699374704168534017', '1460888189937176577', 'SQL解析', NULL, NULL, 0, NULL, NULL, 2, 'online:report:parseSql', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-09-06 18:51:17', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1699374801816125442', '1460888189937176577', '添加Online报表', NULL, NULL, 0, NULL, NULL, 2, 'online:report:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-09-06 18:51:40', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1699375086147993601', '1460888189937176577', '修改Online报表', NULL, NULL, 0, NULL, NULL, 2, 'online:report:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-09-06 18:52:48', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1699375193576701953', '1460888189937176577', '删除Online报表', NULL, NULL, 0, NULL, NULL, 2, 'online:report:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-09-06 18:53:14', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1701475606988812289', '1473927410093187073', '数据源连接', NULL, NULL, 0, NULL, NULL, 2, 'drag:datasource:testConnection', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'jeecg', '2023-09-12 13:59:31', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1701575168519839746', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '白名单管理', '/system/tableWhiteList', 'system/tableWhiteList/SysTableWhiteListList', 1, '', NULL, 1, NULL, '0', 4.00, 0, 'ant-design:table-outlined', 0, 0, 0, 0, NULL, 'admin', '2023-09-12 20:35:09', 'jeecg', '2024-06-13 11:38:28', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1746709108126285826', '1455100420297859074', 'AUTO在线表单详情', '/online/cgformDetail/:id', 'super/online/cgform/auto/default/OnlineAutoDetail', 1, '', NULL, 1, NULL, '0', 21.00, 0, NULL, 1, 0, 1, 0, NULL, 'jeecg', '2024-01-15 09:41:18', 'jeecg', '2024-06-13 11:37:01', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1750128461040648193', '1170592628746878978', '设置默认首页', NULL, NULL, 0, NULL, NULL, 2, 'system:permission:setDefIndex', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2024-01-24 20:08:35', NULL, NULL, 0, NULL, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1783334031927627777', '1438108198113501186', '原生总结栏', '/comp/table/tableSummary', 'demo/table/AntdTableSummary', 1, '', NULL, 1, NULL, '0', 1.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2024-04-25 11:15:40', NULL, NULL, 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1800372628805861377', '1701575168519839746', '列表权限', NULL, NULL, 0, NULL, NULL, 2, 'system:tableWhite:list', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, '15931993294', '2024-06-11 11:40:59', NULL, NULL, 0, NULL, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1800372727493640194', '1701575168519839746', '添加权限', NULL, NULL, 0, NULL, NULL, 2, 'system:tableWhite:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, '15931993294', '2024-06-11 11:41:22', NULL, NULL, 0, NULL, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1800372811518132225', '1701575168519839746', '修改权限', NULL, NULL, 0, NULL, NULL, 2, 'system:tableWhite:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, '15931993294', '2024-06-11 11:41:42', NULL, NULL, 0, NULL, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1800372906330374146', '1701575168519839746', '删除权限', NULL, NULL, 0, NULL, NULL, 2, 'system:tableWhite:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, '15931993294', '2024-06-11 11:42:05', NULL, NULL, 0, NULL, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1800373633509441537', '1701575168519839746', '批量删除', NULL, NULL, 0, NULL, NULL, 2, 'system:tableWhite:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, '15931993294', '2024-06-11 11:44:58', NULL, NULL, 0, NULL, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1800373733220630530', '1701575168519839746', '通过id查询', NULL, NULL, 0, NULL, NULL, 2, 'system:tableWhite:queryById', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, '15931993294', '2024-06-11 11:45:22', NULL, NULL, 0, NULL, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1801954937339428865', '1460888189937176577', '测试数据源连接', NULL, NULL, 0, NULL, NULL, 2, 'online:report:testConnection', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2024-06-15 20:28:30', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1804046424930480129', '1447763172274495489', '仪表盘集成示例', '/drag/view/964024982110830592', '{{ window._CONFIG[\\'domianURL\\'] }}/drag/view?pageId=910475721247866880&token=${token}&tenantId=${tenantId}', 1, '', NULL, 1, NULL, '0', 3.00, 0, NULL, 1, 0, 0, 0, NULL, 'jeecg', '2024-06-21 14:59:20', 'admin', '2025-08-08 22:32:01', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1808098125316870145', '3f915b2769fc80648e92d04e84ca059d', 'app端编辑用户', NULL, NULL, 0, NULL, NULL, 2, 'system:user:app:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2024-07-02 19:19:21', NULL, NULL, 0, NULL, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1810652607946940417', '1438782641187074050', '批量彻底删除', NULL, NULL, 0, NULL, NULL, 2, 'system:dict:deleteRecycleBin', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, '15931993294', '2024-07-09 20:29:57', '15931993294', '2024-07-09 20:30:39', 0, NULL, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1810923799513612290', '1439399179791409153', '彻底删除', NULL, NULL, 0, NULL, NULL, 2, 'system:gateway:deleteRecycleBin', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, '15931993294', '2024-07-10 14:27:34', NULL, NULL, 0, NULL, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1811685368354754561', '1439399179791409153', '复制路由', NULL, NULL, 0, NULL, NULL, 2, 'system:gateway:copyRoute', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, '15931993294', '2024-07-12 16:53:46', NULL, NULL, 0, NULL, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1811685464467230721', '1439399179791409153', '还原逻辑删除', NULL, NULL, 0, NULL, NULL, 2, 'system:gateway:putRecycleBin', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, '15931993294', '2024-07-12 16:54:09', NULL, NULL, 0, NULL, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1866001513609637890', '', '数据可视化', '/dataVisual', 'layouts/default/index', 1, '', NULL, 0, NULL, '0', 3.00, 0, 'ant-design:sliders-outlined', 0, 0, 0, 0, NULL, 'admin', '2024-12-09 14:06:44', 'admin', '2025-04-02 20:18:40', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1876220177009315842', '1473927410093187073', '表单设计页面查询', NULL, NULL, 0, NULL, NULL, 2, 'drag:design:getTotalData', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-01-06 18:52:03', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1887447660072292354', '1280350452934307841', '初始化套餐包', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:syncDefaultPack', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'jeecg', '2025-02-06 18:26:04', 'jeecg', '2025-02-06 18:26:53', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1890213291321749505', '1892553163993931777', 'AI流程设计', '/process/list/airag', 'super/airag/aiflow/pages/ProcessList', 1, '', NULL, 1, NULL, '0', 2.00, 0, 'ant-design:box-plot-outlined', 0, 0, 0, 0, NULL, 'admin', '2025-02-14 09:35:41', 'admin', '2026-01-23 16:52:44', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1892553163993931777', '', 'AI应用平台', '/airag', 'layouts/default/index', 1, '', NULL, 0, NULL, '0', 2.20, 0, 'ant-design:box-plot-outlined', 0, 0, 0, 0, NULL, 'admin', '2025-02-20 20:33:31', 'admin', '2025-11-25 16:20:04', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1892553778493022209', '1892553163993931777', 'AI模型配置', '/super/airag/aimodel/AiModelList', 'super/airag/aimodel/AiModelList', 1, '', NULL, 1, NULL, '0', 4.00, 0, 'ant-design:setting-twotone', 0, 0, 0, 0, NULL, 'admin', '2025-02-20 20:35:57', 'admin', '2025-03-06 20:31:13', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1892557342028226561', '1892553163993931777', 'AI知识库', '/super/airag/aiknowledge/AiKnowledgeBaseList', 'super/airag/aiknowledge/AiKnowledgeBaseList', 1, '', NULL, 1, NULL, '0', 3.00, 0, 'ant-design:book-twotone', 0, 0, 0, 0, NULL, 'admin', '2025-02-20 20:50:07', 'admin', '2026-01-23 16:52:40', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1893865471550578689', '1892553163993931777', 'AI应用管理', '/super/airag/aiapp/AiAppList', 'super/airag/aiapp/AiAppList', 1, '', NULL, 1, NULL, '0', 1.00, 0, 'ant-design:appstore-twotone', 0, 0, 0, 0, NULL, 'admin', '2025-02-24 11:28:09', 'admin', '2025-03-06 20:30:58', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1895401981290643458', '1892553163993931777', 'AI聊天', '/super/airag/aiapp/chat/AiChat', 'super/airag/aiapp/chat/AiChat', 1, '', NULL, 1, NULL, '0', 5.00, 0, 'ant-design:aliwangwang-outlined', 1, 0, 1, 0, NULL, 'admin', '2025-02-28 17:13:42', 'admin', '2025-02-28 17:30:40', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1907441271556497409', '1473927410093187073', '清空回收站', NULL, NULL, 0, NULL, NULL, 2, 'onl:drag:clear:recovery', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-04-02 22:33:32', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('190c2b43bec6a5f7a4194a85db67d96a', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '角色管理', '/system/role', 'system/role/index', 1, NULL, NULL, 1, NULL, NULL, 2.00, 0, 'ant-design:solution', 0, 1, 0, NULL, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2021-09-17 15:58:00', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1912753560201089025', '2012375501376606210', 'OCR识别', '/ai/ocr', 'super/airag/ocr/AiOcrList', 1, '', NULL, 1, NULL, '0', 8.00, 0, 'ant-design:scan-outlined', 1, 0, 0, 0, NULL, 'admin', '2025-04-17 14:22:41', 'admin', '2026-01-17 12:05:13', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1917957565728198657', '1922109301837606914', '接口文档', '/openapi/SwaggerUI', 'openapi/SwaggerUI', 1, '', NULL, 1, NULL, '0', 1.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-05-01 23:01:32', 'admin', '2025-05-13 09:59:46', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1922109301837606914', '1439398677984878593', 'OpenAPI', '/openapi', 'layouts/RouteView', 1, '', NULL, 1, NULL, '0', 4.00, 0, 'ant-design:swap-outlined', 0, 0, 0, 0, NULL, 'admin', '2025-05-13 09:59:03', 'admin', '2025-09-13 19:31:31', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1930152938891608066', '1455100420297859074', 'APP版本管理', '/app/version', 'system/appVersion/SysAppVersion', 1, '', NULL, 1, NULL, '0', 11.00, 0, NULL, 0, 0, 0, 0, NULL, 'admin', '2025-06-04 14:41:36', 'admin', '2025-07-30 17:22:24', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1930221213607591937', '1893865471550578689', '新增或编辑AI应用', NULL, NULL, 0, NULL, NULL, 2, 'airag:app:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:12:54', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1930221335938662401', '1893865471550578689', '删除AI应用', NULL, NULL, 0, NULL, NULL, 2, 'airag:app:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:13:23', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1930221570324758530', '1892557342028226561', '添加AI知识库', NULL, NULL, 0, NULL, NULL, 2, 'airag:knowledge:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:14:19', 'admin', '2025-06-04 19:21:38', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1930221637551063042', '1892557342028226561', '编辑AI知识库', NULL, NULL, 0, NULL, NULL, 2, 'airag:knowledge:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:14:35', 'admin', '2025-06-04 19:21:42', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1930221702164316161', '1892557342028226561', '重建AI知识库', NULL, NULL, 0, NULL, NULL, 2, 'airag:knowledge:rebuild', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:14:50', 'admin', '2025-06-04 19:21:46', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1930221774230847490', '1892557342028226561', '删除AI知识库', NULL, NULL, 0, NULL, NULL, 2, 'airag:knowledge:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:15:07', 'admin', '2025-06-04 19:21:52', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1930221983555977217', '1892557342028226561', '新增编辑AI知识库文档', NULL, NULL, 0, NULL, NULL, 2, 'airag:knowledge:doc:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:15:57', 'admin', '2025-06-04 19:22:03', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1930222066120851457', '1892557342028226561', '导入AI知识库文档', NULL, NULL, 0, NULL, NULL, 2, 'airag:knowledge:doc:zip', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:16:17', 'admin', '2025-06-04 19:22:09', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1930222218734796802', '1892557342028226561', '向量化AI知识库文档', NULL, NULL, 0, NULL, NULL, 2, 'airag:knowledge:doc:rebuild', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:16:53', 'admin', '2025-06-04 19:22:16', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1930222295012409345', '1892557342028226561', '批量删除AI知识库文档', NULL, NULL, 0, NULL, NULL, 2, 'airag:knowledge:doc:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:17:12', 'admin', '2025-06-04 19:22:21', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1930222395180777474', '1892557342028226561', '清空AI知识库文档', NULL, NULL, 0, NULL, NULL, 2, 'airag:knowledge:doc:deleteAll', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:17:35', 'admin', '2025-06-04 19:22:25', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1930222558582472705', '1892553778493022209', '新增AI模型', NULL, NULL, 0, NULL, NULL, 2, 'airag:model:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:18:14', 'admin', '2025-06-04 19:21:16', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1930222617197871105', '1892553778493022209', '编辑AI模型', NULL, NULL, 0, NULL, NULL, 2, 'airag:model:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:18:28', 'admin', '2025-06-04 19:21:20', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1930222679269376001', '1892553778493022209', '删除AI模型', NULL, NULL, 0, NULL, NULL, 2, 'airag:model:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:18:43', 'admin', '2025-06-04 19:21:24', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1930222862556266498', '1890213291321749505', '新增AI流程', NULL, NULL, 0, NULL, NULL, 2, 'airag:flow:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:19:27', 'admin', '2025-06-04 19:21:08', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1930222953853681666', '1890213291321749505', '编辑AI流程', NULL, NULL, 0, NULL, NULL, 2, 'airag:flow:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:19:49', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1930223034757611522', '1890213291321749505', '保存AI流程设计', NULL, NULL, 0, NULL, NULL, 2, 'airag:flow:designSave', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:20:08', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1930223114757611522', '1890213291321749505', 'AI流程测试', NULL, NULL, 0, NULL, NULL, 2, 'airag:flow:debug', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-12-01 19:20:08', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1930223132619112449', '1890213291321749505', '删除AI流程', NULL, NULL, 0, NULL, NULL, 2, 'airag:flow:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:20:31', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1939572818833301506', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '首页配置', '/system/homeConfig', 'system/homeConfig/index', 1, '', NULL, 1, NULL, '0', 1.00, 0, 'ant-design:appstore-outlined', 0, 0, 0, 0, NULL, 'admin', '2025-06-30 14:32:50', 'admin', '2025-07-01 20:13:22', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1941349246536998913', '1939572818833301506', '首页配置-添加', NULL, NULL, 0, NULL, NULL, 2, 'system:roleindex:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-05 12:11:44', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1941349335431077889', '1939572818833301506', '首页配置-编辑', NULL, NULL, 0, NULL, NULL, 2, 'system:roleindex:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-05 12:12:05', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1941349462887587842', '1939572818833301506', '首页配置-删除', NULL, NULL, 0, NULL, NULL, 2, 'system:roleindex:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-05 12:12:35', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1941349550087168001', '1939572818833301506', '首页配置-批量删除', NULL, NULL, 0, NULL, NULL, 2, 'system:roleindex:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-05 12:12:56', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1942160438629109761', '1930152938891608066', 'APP版本编辑', NULL, NULL, 0, NULL, NULL, 2, 'app:edit:version', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-07 17:55:07', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1947833384695164929', '1629109281748291586', '第三方配置删除', NULL, NULL, 0, NULL, NULL, 2, 'system:third:config:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-23 09:37:23', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1960994076329316353', '119213522910765570', '添加一个用户和多个套餐关系', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:addPacksUser', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-08-28 17:13:16', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1961009998209257473', '1674708136602542082', '租户部门', '/depart/TenantDepartList', 'system/depart/TenantDepartList', 1, '', NULL, 1, NULL, '0', 3.30, 0, 'ant-design:apartment-outlined', 0, 0, 0, 0, NULL, 'admin', '2025-08-28 18:16:32', 'admin', '2025-08-29 10:20:25', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1961253156897710081', '1674708136602542082', '租户套餐', '/pack/TenantCurrentPackList', 'system/tenant/pack/TenantCurrentPackList', 1, '', NULL, 1, NULL, '0', 3.40, 0, 'ant-design:read-filled', 0, 0, 0, 0, NULL, 'admin', '2025-08-29 10:22:46', 'admin', '2025-08-29 10:24:46', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1963086454217281537', '1674708136602542082', '租户职务', '/position/TenantPositionList', 'system/position/TenantPositionList', 1, '', NULL, 1, NULL, '0', 3.50, 0, 'ant-design:user-outlined', 1, 0, 0, 0, NULL, 'admin', '2025-09-03 11:47:38', NULL, NULL, 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1963133393868722178', '1674708136602542082', '我的租户', '/my/MyTenantDetail', 'system/tenant/my/MyTenantDetail', 1, '', NULL, 1, NULL, '0', 0.00, 0, 'ant-design:user-outlined', 1, 0, 0, 0, NULL, 'admin', '2025-09-03 14:54:09', 'admin', '2025-09-13 17:16:57', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1972617196420993025', '45c966826eeff4c99b8f8ebfe74511fc', '部门管理拖拽修改上下级', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:updateChange', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-29 18:59:24', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1972645086223814657', '3f915b2769fc80648e92d04e84ca059d', '重置系统密码', NULL, NULL, 0, NULL, NULL, 2, 'system:user:resetPassword', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-29 20:50:13', 'admin', '2025-09-30 11:58:29', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1980223355087781889', '1892553163993931777', 'MCP配置', '/super/airag/aimcp/AiragMcpList', 'super/airag/aimcp/AiragMcpList', 1, '', NULL, 1, NULL, '0', 5.00, 0, 'ant-design:tool-twotone', 1, 0, 0, 0, NULL, 'admin', '2025-10-20 18:43:33', 'admin', '2025-10-21 19:00:31', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1996422809213341698', '1892553163993931777', '应用门户', '/app/portal', 'super/airag/aiapp/chat/portal/AppPortal', 1, '', NULL, 1, NULL, '0', 0.00, 0, 'ant-design:home-outlined', 1, 0, 0, 0, NULL, 'admin', '2025-12-04 11:34:24', 'admin', '2026-01-28 15:17:14', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1999306189754236930', '1737321792727388161', '数据集编辑保存', NULL, NULL, 0, NULL, NULL, 2, 'drag:dataset:save', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-12-12 10:31:56', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1999306301071065090', '1737321792727388161', '数据集删除', NULL, NULL, 0, NULL, NULL, 2, 'drag:dataset:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-12-12 10:32:22', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1999367175911657473', '2012376076054974466', 'AI提示词', '/super/airag/aiprompts', 'super/airag/aiprompts/AiragPromptsList', 1, '', NULL, 1, NULL, '0', 7.00, 0, 'ant-design:exclamation-circle-outlined', 1, 0, 0, 0, NULL, 'admin', '2025-12-12 14:34:16', 'admin', '2026-01-17 12:08:01', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('1999406402585542657', '1594930803956920321', '在线用户列表接口', NULL, NULL, 0, NULL, NULL, 2, 'system:online:list', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-12-12 17:10:08', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1999406500300242946', '1594930803956920321', '强制用户退出接口', NULL, NULL, 0, NULL, NULL, 2, 'system:online:forceLogout', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-12-12 17:10:32', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('1a0811914300741f4e11838ff37a1d3a', '3f915b2769fc80648e92d04e84ca059d', '手机号禁用', '', '', 0, NULL, NULL, 2, 'user:form:phone', '2', 1.00, 0, NULL, 1, NULL, 0, NULL, NULL, 'admin', '2019-05-11 17:19:30', 'admin', '2019-05-11 18:00:22', 0, 0, '1', NULL);\nINSERT INTO `sys_permission` VALUES ('1d592115213910765570', '3f915b2769fc80648e92d04e84ca059d', '通过ID查询用户拥有的角色', NULL, NULL, 0, NULL, NULL, 2, 'system:user:queryUserRole', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:20:22', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2000880658872508417', '2012376076054974466', 'AI评估器', '/super/airag/experiment', 'super/airag/aiprompts/AiragExtDataExperiment', 1, '', NULL, 1, NULL, '0', 7.10, 0, 'ant-design:sliders-outlined', 1, 0, 0, 0, NULL, 'admin', '2025-12-16 18:48:18', 'admin', '2026-01-17 12:08:14', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('2005541199412592642', '1890213291321749505', 'ai流程复制', NULL, NULL, 0, NULL, NULL, 2, 'airag:flow:copy', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-12-29 15:27:38', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2008516285254000642', '2012375501376606210', 'Ai海报', '/airag/aiposter/AiPoster', 'super/airag/aiposter/AiPoster', 1, '', NULL, 1, NULL, '0', 8.00, 0, 'ant-design:file-image-filled', 1, 0, 0, 0, NULL, 'admin', '2026-01-06 20:29:33', 'admin', '2026-01-17 12:05:05', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('2010623918706446338', '2012375501376606210', 'AI写作', '/airag/aiwriter/AiWriter', 'super/airag/aiwriter/AiWriter', 1, '', NULL, 1, NULL, '0', 9.00, 0, 'ant-design:edit-filled', 1, 0, 0, 0, NULL, 'admin', '2026-01-12 16:04:32', 'admin', '2026-01-17 12:04:57', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('2012375501376606210', '1892553163993931777', 'AI工具箱', '/ai/box', 'layouts/default/index', 1, '', NULL, 1, NULL, '0', 11.00, 0, 'ant-design:tool-outlined', 0, 0, 0, 0, NULL, 'admin', '2026-01-17 12:04:42', 'admin', '2026-01-17 12:09:42', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('2012376076054974466', '1892553163993931777', '提示词管理', '/ai/prompt', 'layouts/default/index', 1, '', NULL, 1, NULL, '0', 10.00, 0, 'ant-design:star-outlined', 0, 0, 0, 0, NULL, 'admin', '2026-01-17 12:06:59', 'admin', '2026-01-17 12:09:27', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('2025050104193340030', '1922109301837606914', '接口管理', '/openapi/openApiList', 'openapi/OpenApiList', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 0, 0, 0, 0, NULL, 'admin', '2025-05-01 16:19:03', 'admin', '2025-05-13 09:59:24', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2025050104193350031', '2025050104193340030', '添加接口管理', NULL, NULL, 0, NULL, NULL, 2, 'openapi:open_api:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-05-01 16:19:03', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2025050104193350032', '2025050104193340030', '编辑接口管理', NULL, NULL, 0, NULL, NULL, 2, 'openapi:open_api:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-05-01 16:19:03', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2025050104193350033', '2025050104193340030', '删除接口管理', NULL, NULL, 0, NULL, NULL, 2, 'openapi:open_api:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-05-01 16:19:03', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2025050104193350034', '2025050104193340030', '批量删除接口管理', NULL, NULL, 0, NULL, NULL, 2, 'openapi:open_api:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-05-01 16:19:03', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2025050104193350035', '2025050104193340030', '导出excel_接口管理', NULL, NULL, 0, NULL, NULL, 2, 'openapi:open_api:exportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-05-01 16:19:03', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2025050104193350036', '2025050104193340030', '导入excel_接口管理', NULL, NULL, 0, NULL, NULL, 2, 'openapi:open_api:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-05-01 16:19:03', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2025050105554940200', '1922109301837606914', '授权管理', '/openapi/openApiAuthList', 'openapi/OpenApiAuthList', 1, NULL, NULL, 1, NULL, '1', 0.00, 0, NULL, 0, 0, 0, 0, NULL, 'admin', '2025-05-01 17:55:20', 'admin', '2025-05-13 09:59:35', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2025050105554940201', '2025050105554940200', '添加授权管理', NULL, NULL, 0, NULL, NULL, 2, 'openapi:open_api_auth:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-05-01 17:55:20', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2025050105554940202', '2025050105554940200', '编辑授权管理', NULL, NULL, 0, NULL, NULL, 2, 'openapi:open_api_auth:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-05-01 17:55:20', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2025050105554940203', '2025050105554940200', '删除授权管理', NULL, NULL, 0, NULL, NULL, 2, 'openapi:open_api_auth:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-05-01 17:55:20', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2025050105554940204', '2025050105554940200', '批量删除授权管理', NULL, NULL, 0, NULL, NULL, 2, 'openapi:open_api_auth:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-05-01 17:55:20', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2025050105554940205', '2025050105554940200', '导出excel_授权管理', NULL, NULL, 0, NULL, NULL, 2, 'openapi:open_api_auth:exportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-05-01 17:55:20', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2025050105554940206', '2025050105554940200', '导入excel_授权管理', NULL, NULL, 0, NULL, NULL, 2, 'openapi:open_api_auth:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-05-01 17:55:20', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2025070908023480210', '2012375501376606210', 'AI简历', '/airag/word', 'super/airag/wordtpl/EoaWordTemplateList', 1, NULL, NULL, 1, NULL, '1', 15.00, 0, 'ant-design:file-word-outlined', 0, 0, 0, 0, NULL, 'admin', '2025-07-09 20:02:21', 'admin', '2026-01-17 12:05:20', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2025070908023490211', '2025070908023480210', '添加word模版管理', NULL, NULL, 0, NULL, NULL, 2, 'wordtpl:template:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-09 20:02:21', 'admin', '2025-07-09 20:11:09', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2025070908023490212', '2025070908023480210', '编辑word模版管理', NULL, NULL, 0, NULL, NULL, 2, 'wordtpl:template:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-09 20:02:21', 'admin', '2025-07-09 20:11:13', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2025070908023490213', '2025070908023480210', '删除word模版管理', NULL, NULL, 0, NULL, NULL, 2, 'wordtpl:template:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-09 20:02:21', 'admin', '2025-07-09 20:11:17', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2025070908023490214', '2025070908023480210', '批量删除word模版管理', NULL, NULL, 0, NULL, NULL, 2, 'wordtpl:template:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-09 20:02:21', 'admin', '2025-07-09 20:11:21', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('2025070908023490215', '2025070908023480210', '设计word模版', NULL, NULL, 0, NULL, NULL, 2, 'wordtpl:template:design', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-09 20:02:21', 'admin', '2025-07-09 20:19:04', 0, 0, '1', 0);\nINSERT INTO `sys_permission` VALUES ('3f915b2769fc80648e92d04e84ca059d', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '用户管理', '/system/user', 'system/user/index', 1, NULL, NULL, 1, NULL, NULL, 1.00, 0, 'ant-design:user', 0, 1, 0, NULL, NULL, NULL, '2018-12-25 20:34:38', 'sunjianlei', '2021-05-08 09:57:31', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('45c966826eeff4c99b8f8ebfe74511fc', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '部门管理', '/system/depart', 'system/depart/index', 1, NULL, NULL, 1, NULL, NULL, 3.00, 0, 'ant-design:team', 0, 0, 0, NULL, NULL, 'admin', '2019-01-29 18:47:40', 'admin', '2021-09-17 15:58:13', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('5c2f42277948043026b7a14692456828', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '我的部门', '/system/depart-user', 'system/departUser/index', 1, NULL, NULL, 1, NULL, NULL, 3.00, 0, 'ant-design:home-outlined', 0, 0, 0, 0, NULL, 'admin', '2019-04-17 15:12:24', 'admin', '2023-03-04 15:03:07', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('9502685863ab87f0ad1134142788a385', '1438108176273760258', '首页', '/dashboard/analysis', 'dashboard/Analysis', 1, NULL, NULL, 1, NULL, NULL, 1.00, 0, 'ant-design:qrcode-outlined', 1, 1, 0, 0, NULL, NULL, '2018-12-25 20:34:38', 'jeecg', '2024-06-18 23:09:37', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('d7d6e2e4e2934f2c9385a623fd98c6f3', '', '系统管理', '/isystem', 'layouts/RouteView', 1, NULL, NULL, 0, NULL, NULL, 4.00, 0, 'ant-design:setting', 0, 0, 0, 0, NULL, NULL, '2018-12-25 20:34:38', 'admin', '2025-06-25 14:24:07', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` VALUES ('f15543b0263cf6c5fac85afdd3eba3f2', '3f915b2769fc80648e92d04e84ca059d', '用户导入', '', NULL, 0, NULL, NULL, 2, 'system:user:import', '1', 1.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2019-05-13 19:15:27', 'admin', '2022-06-30 15:05:12', 0, 0, '1', 0);\n\n-- ----------------------------\n-- Table structure for sys_permission_data_rule\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_permission_data_rule`;\nCREATE TABLE `sys_permission_data_rule`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'ID',\n  `permission_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单ID',\n  `rule_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '规则名称',\n  `rule_column` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字段',\n  `rule_conditions` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '条件',\n  `rule_value` varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '规则值',\n  `status` varchar(3) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '权限有效状态1有0否',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_spdr_permission_id`(`permission_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_permission_data_rule\n-- ----------------------------\nINSERT INTO `sys_permission_data_rule` VALUES ('1260935285157511170', '4148ec82b6acd69f470bea75fe41c357', 'createBy', 'createBy', '=', '#{sys_user_code}', '0', '2020-05-14 22:09:34', 'jeecg', '2020-05-14 22:13:52', 'admin');\nINSERT INTO `sys_permission_data_rule` VALUES ('1260936345293012993', '4148ec82b6acd69f470bea75fe41c357', '年龄', 'age', '>', '20', '1', '2020-05-14 22:13:46', 'admin', NULL, NULL);\nINSERT INTO `sys_permission_data_rule` VALUES ('1260937192290762754', '4148ec82b6acd69f470bea75fe41c357', 'sysOrgCode', 'sysOrgCode', 'RIGHT_LIKE', '#{sys_org_code}', '1', '2020-05-14 22:17:08', 'admin', NULL, NULL);\nINSERT INTO `sys_permission_data_rule` VALUES ('32b62cb04d6c788d9d92e3ff5e66854e', '8d4683aacaa997ab86b966b464360338', '000', '00', '!=', '00', '1', '2019-04-02 18:36:08', 'admin', NULL, NULL);\nINSERT INTO `sys_permission_data_rule` VALUES ('40283181614231d401614234fe670003', '40283181614231d401614232cd1c0001', 'createBy', 'createBy', '=', '#{sys_user_code}', '1', '2018-01-29 21:57:04', 'admin', NULL, NULL);\nINSERT INTO `sys_permission_data_rule` VALUES ('4028318161424e730161424fca6f0004', '4028318161424e730161424f61510002', 'createBy', 'createBy', '=', '#{sys_user_code}', '1', '2018-01-29 22:26:20', 'admin', NULL, NULL);\nINSERT INTO `sys_permission_data_rule` VALUES ('402880e6487e661a01487e732c020005', '402889fb486e848101486e93a7c80014', 'SYS_ORG_CODE', 'SYS_ORG_CODE', 'LIKE', '010201%', '1', '2014-09-16 20:32:30', 'admin', NULL, NULL);\nINSERT INTO `sys_permission_data_rule` VALUES ('402880e6487e661a01487e8153ee0007', '402889fb486e848101486e93a7c80014', 'create_by', 'create_by', '', '#{SYS_USER_CODE}', '1', '2014-09-16 20:47:57', 'admin', NULL, NULL);\nINSERT INTO `sys_permission_data_rule` VALUES ('402880ec5ddec439015ddf9225060038', '40288088481d019401481d2fcebf000d', '复杂关系', '', 'USE_SQL_RULES', 'name like \\'%张%\\' or age > 10', '1', NULL, NULL, '2017-08-14 15:10:25', 'demo');\nINSERT INTO `sys_permission_data_rule` VALUES ('402880ec5ddfdd26015ddfe3e0570011', '4028ab775dca0d1b015dca3fccb60016', '复杂sql配置', '', 'USE_SQL_RULES', 'table_name like \\'%test%\\' or is_tree = \\'Y\\'', '1', NULL, NULL, '2017-08-14 16:38:55', 'demo');\nINSERT INTO `sys_permission_data_rule` VALUES ('402880f25b1e2ac7015b1e5fdebc0012', '402880f25b1e2ac7015b1e5cdc340010', '只能看自己数据', 'create_by', '=', '#{sys_user_code}', '1', '2017-03-30 16:40:51', 'admin', NULL, NULL);\nINSERT INTO `sys_permission_data_rule` VALUES ('402881875b19f141015b19f8125e0014', '40288088481d019401481d2fcebf000d', '可看下属业务数据', 'sys_org_code', 'LIKE', '#{sys_org_code}', '1', NULL, NULL, '2017-08-14 15:04:32', 'demo');\nINSERT INTO `sys_permission_data_rule` VALUES ('402881e45394d66901539500a4450001', '402881e54df73c73014df75ab670000f', 'sysCompanyCode', 'sysCompanyCode', '=', '#{SYS_COMPANY_CODE}', '1', '2016-03-21 01:09:21', 'admin', NULL, NULL);\nINSERT INTO `sys_permission_data_rule` VALUES ('402881e45394d6690153950177cb0003', '402881e54df73c73014df75ab670000f', 'sysOrgCode', 'sysOrgCode', '=', '#{SYS_ORG_CODE}', '1', '2016-03-21 01:10:15', 'admin', NULL, NULL);\nINSERT INTO `sys_permission_data_rule` VALUES ('402881e56266f43101626727aff60067', '402881e56266f43101626724eb730065', '销售自己看自己的数据', 'createBy', '=', '#{sys_user_code}', '1', '2018-03-27 19:11:16', 'admin', NULL, NULL);\nINSERT INTO `sys_permission_data_rule` VALUES ('402881e56266f4310162672fb1a70082', '402881e56266f43101626724eb730065', '销售经理看所有下级数据', 'sysOrgCode', 'LIKE', '#{sys_org_code}', '1', '2018-03-27 19:20:01', 'admin', NULL, NULL);\nINSERT INTO `sys_permission_data_rule` VALUES ('402881e56266f431016267387c9f0088', '402881e56266f43101626724eb730065', '只看金额大于1000的数据', 'money', '>=', '1000', '1', '2018-03-27 19:29:37', 'admin', NULL, NULL);\nINSERT INTO `sys_permission_data_rule` VALUES ('402881f3650de25101650dfb5a3a0010', '402881e56266f4310162671d62050044', '22', '', 'USE_SQL_RULES', '22', '1', '2018-08-06 14:45:01', 'admin', NULL, NULL);\nINSERT INTO `sys_permission_data_rule` VALUES ('402889fb486e848101486e913cd6000b', '402889fb486e848101486e8e2e8b0007', 'userName', 'userName', '=', 'admin', '1', '2014-09-13 18:31:25', 'admin', NULL, NULL);\nINSERT INTO `sys_permission_data_rule` VALUES ('402889fb486e848101486e98d20d0016', '402889fb486e848101486e93a7c80014', 'title', 'title', '=', '12', '1', NULL, NULL, '2014-09-13 22:18:22', 'scott');\nINSERT INTO `sys_permission_data_rule` VALUES ('402889fe47fcb29c0147fcb6b6220001', '8a8ab0b246dc81120146dc8180fe002b', '12', '12', '>', '12', '1', '2014-08-22 15:55:38', '8a8ab0b246dc81120146dc8181950052', NULL, NULL);\nINSERT INTO `sys_permission_data_rule` VALUES ('4028ab775dca0d1b015dca4183530018', '4028ab775dca0d1b015dca3fccb60016', '表名限制', 'isDbSynch', '=', 'Y', '1', NULL, NULL, '2017-08-14 16:43:45', 'demo');\nINSERT INTO `sys_permission_data_rule` VALUES ('4028ef815595a881015595b0ccb60001', '40288088481d019401481d2fcebf000d', '限只能看自己', 'create_by', '=', '#{sys_user_code}', '1', NULL, NULL, '2017-08-14 15:03:56', 'demo');\nINSERT INTO `sys_permission_data_rule` VALUES ('4028ef81574ae99701574aed26530005', '4028ef81574ae99701574aeb97bd0003', '用户名', 'userName', '!=', 'admin', '1', '2016-09-21 12:07:18', 'admin', NULL, NULL);\nINSERT INTO `sys_permission_data_rule` VALUES ('f852d85d47f224990147f2284c0c0005', NULL, '小于', 'test', '<=', '11', '1', '2014-08-20 14:43:52', '8a8ab0b246dc81120146dc8181950052', NULL, NULL);\n\n-- ----------------------------\n-- Table structure for sys_position\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_position`;\nCREATE TABLE `sys_position`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `code` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '职务编码',\n  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '职务级别名称',\n  `post_level` int(2) NULL DEFAULT NULL COMMENT '职务等级',\n  `company_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '公司id',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  `sys_org_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '组织机构编码',\n  `tenant_id` int(10) NULL DEFAULT 0 COMMENT '租户ID',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uniq_code`(`code`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '职务级别' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_position\n-- ----------------------------\nINSERT INTO `sys_position` VALUES ('1958470823064436737', '5za8WqucKR', '职员', 6, NULL, 'admin', '2025-08-21 18:06:46', NULL, NULL, 'A01A08', 0);\nINSERT INTO `sys_position` VALUES ('1958470865577902082', 'hGAuYslALj', '副部长', 5, NULL, 'admin', '2025-08-21 18:06:56', NULL, NULL, 'A01A08', 0);\nINSERT INTO `sys_position` VALUES ('1958470912214368258', 'M0xkqpPsg7', '部长', 4, NULL, 'admin', '2025-08-21 18:07:07', NULL, NULL, 'A01A08', 0);\nINSERT INTO `sys_position` VALUES ('1958471030867034113', 'npEbkFq6Uw', '副总经理', 3, NULL, 'admin', '2025-08-21 18:07:35', NULL, NULL, 'A01A08', 0);\nINSERT INTO `sys_position` VALUES ('1958471074953363458', 'DEPMkWRJEu', '总经理', 2, NULL, 'admin', '2025-08-21 18:07:46', 'admin', '2025-09-13 18:52:25', 'A01A08', 0);\nINSERT INTO `sys_position` VALUES ('1958471111989067778', 'gu7Rbffh0L', '董事长', 1, NULL, 'admin', '2025-08-21 18:07:54', NULL, NULL, 'A01A08', 0);\n\n-- ----------------------------\n-- Table structure for sys_quartz_job\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_quartz_job`;\nCREATE TABLE `sys_quartz_job`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `del_flag` int(1) NULL DEFAULT NULL COMMENT '删除状态',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  `job_class_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '任务类名',\n  `cron_expression` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'cron表达式',\n  `parameter` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '参数',\n  `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',\n  `status` int(1) NULL DEFAULT NULL COMMENT '状态 0正常 -1停止',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_quartz_job\n-- ----------------------------\nINSERT INTO `sys_quartz_job` VALUES ('1966781755167879169', 'admin', '2025-09-13 16:31:26', 0, NULL, NULL, 'org.jeecg.modules.system.job.UserUpadtePwdJob', '0 0 0 * * ? *', NULL, '5个月未修改密码提醒', 0);\nINSERT INTO `sys_quartz_job` VALUES ('5b3d2c087ad41aa755fc4f89697b01e7', 'admin', '2019-04-11 19:04:21', 0, 'admin', '2024-03-18 14:21:35', 'org.jeecg.modules.message.job.SendMsgJob', '0/50 * * * * ? *', NULL, NULL, -1);\nINSERT INTO `sys_quartz_job` VALUES ('a253cdfc811d69fa0efc70d052bc8128', 'admin', '2019-03-30 12:44:48', 0, 'admin', '2020-05-02 15:48:49', 'org.jeecg.modules.quartz.job.SampleJob', '0/1 * * * * ?', NULL, NULL, -1);\nINSERT INTO `sys_quartz_job` VALUES ('df26ecacf0f75d219d746750fe84bbee', NULL, '2021-06-30 16:03:09', 0, 'admin', '2020-05-02 15:40:35', 'org.jeecg.modules.quartz.job.SampleParamJob', '0/1 * * * * ?', 'scott', '带参测试 后台将每隔1秒执行输出日志', -1);\n\n-- ----------------------------\n-- Table structure for sys_role\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_role`;\nCREATE TABLE `sys_role`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id',\n  `role_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色名称',\n  `role_code` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色编码',\n  `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  `tenant_id` int(10) NULL DEFAULT 0 COMMENT '租户ID',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uniq_sys_role_role_code`(`role_code`) USING BTREE,\n  INDEX `idx_sysrole_tenant_id`(`tenant_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_role\n-- ----------------------------\nINSERT INTO `sys_role` VALUES ('1169504891467464706', '数据开发角色', 'dbadeveloper', '', NULL, '2019-03-12 19:01:35', 'admin', '2019-03-12 19:01:35', 0);\nINSERT INTO `sys_role` VALUES ('1169504891467464707', '低代码开发角色', 'lowdeveloper', '', NULL, '2019-03-12 19:01:35', 'admin', '2019-03-12 19:01:35', 0);\nINSERT INTO `sys_role` VALUES ('1501570619841810433', 'Vue3全角色', 'vue3', NULL, 'admin', '2022-03-09 22:48:28', 'admin', '2025-06-25 16:26:19', 0);\nINSERT INTO `sys_role` VALUES ('1962488045068464130', '租户管理员', 'zuhuadmin', NULL, 'admin', '2025-09-01 20:09:46', NULL, NULL, 0);\nINSERT INTO `sys_role` VALUES ('1996463539853824001', 'AI应用角色', 'aiadmin', NULL, 'admin', '2025-12-04 14:16:15', NULL, NULL, 0);\nINSERT INTO `sys_role` VALUES ('ee8626f80f7c2619917b6236f3a7f02b', '系统用户标配角色', 'test', '系统所有用户拥有的最小权限角色，默认都分配这个角色', NULL, '2018-12-20 10:59:04', 'admin', '2025-08-12 18:39:54', 0);\nINSERT INTO `sys_role` VALUES ('f6817f48af4fb3af11b9e8bf182f618b', '管理员', 'admin', '管理员', NULL, '2020-12-21 18:03:39', 'admin', '2025-07-30 15:17:55', 0);\n\n-- ----------------------------\n-- Table structure for sys_role_index\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_role_index`;\nCREATE TABLE `sys_role_index`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `role_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '角色编码',\n  `url` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路由地址',\n  `component` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '组件',\n  `is_route` tinyint(1) NULL DEFAULT 1 COMMENT '是否路由菜单: 0:不是  1:是（默认值1）',\n  `priority` int(11) NULL DEFAULT 0 COMMENT '优先级',\n  `status` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '状态0:无效 1:有效',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `sys_org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属部门',\n  `relation_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '关联关系(ROLE:角色 USER:用户)',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_sri_role_code`(`role_code`) USING BTREE,\n  INDEX `idx_sri_status`(`status`) USING BTREE,\n  INDEX `idx_sri_priority`(`priority`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色首页表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_role_index\n-- ----------------------------\nINSERT INTO `sys_role_index` VALUES ('1803082647166652418', 'DEF_INDEX_ALL', '/dashboard/analysis', 'dashboard/Analysis', 1, 0, '0', 'jeecg', '2024-06-18 23:09:37', 'admin', '2025-11-25 15:53:36', 'A02A01', 'DEFAULT');\n\n-- ----------------------------\n-- Table structure for sys_role_permission\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_role_permission`;\nCREATE TABLE `sys_role_permission`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `role_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色id',\n  `permission_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '权限id',\n  `data_rule_ids` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据权限ids',\n  `operate_date` datetime NULL DEFAULT NULL COMMENT '操作时间',\n  `operate_ip` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作ip',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_srp_role_per_id`(`role_id`, `permission_id`) USING BTREE,\n  INDEX `idx_srp_role_id`(`role_id`) USING BTREE,\n  INDEX `idx_srp_permission_id`(`permission_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色权限表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_role_permission\n-- ----------------------------\nINSERT INTO `sys_role_permission` VALUES ('00b0748f04d3ea52c8cfa179c1c9d384', '52b0cf022ac4187b2a70dfa4f8b2d940', 'd7d6e2e4e2934f2c9385a623fd98c6f3', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('0d9d14bc66e9d5e99b0280095fdc8587', 'ee8626f80f7c2619917b6236f3a7f02b', '277bfabef7d76e89b33062b16a9a5020', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('0dec36b68c234767cd35466efef3b941', 'ee8626f80f7c2619917b6236f3a7f02b', '54dd5457a3190740005c1bfec55b1c34', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('115a6673ae6c0816d3f60de221520274', '21c5a3187763729408b40afb0d0fdfa8', '63b551e81c5956d5c861593d366d8c57', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('1209423580355481602', 'f6817f48af4fb3af11b9e8bf182f618b', '190c2b43bec6a5f7a4194a85db67d96a', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('1232123957949304833', 'ee8626f80f7c2619917b6236f3a7f02b', 'f0675b52d89100ee88472b6800754a08', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('1232123957978664962', 'ee8626f80f7c2619917b6236f3a7f02b', '1232123780958064642', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('1232123957978664963', 'ee8626f80f7c2619917b6236f3a7f02b', '020b06793e4de2eee0007f603000c769', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('1232123957987053570', 'ee8626f80f7c2619917b6236f3a7f02b', '2aeddae571695cd6380f6d6d334d6e7d', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('1232125488694104066', 'ee8626f80f7c2619917b6236f3a7f02b', 'e41b69c57a941a3bbcce45032fe57605', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('1260929736852488194', 'ee8626f80f7c2619917b6236f3a7f02b', '1260929666434318338', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('1260931414095937537', 'ee8626f80f7c2619917b6236f3a7f02b', '1260931366557696001', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('1281494164924653569', 'f6817f48af4fb3af11b9e8bf182f618b', '1280350452934307841', NULL, '2020-07-10 15:43:13', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775947751425', 'ee8626f80f7c2619917b6236f3a7f02b', '1352200630711652354', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775956140034', 'ee8626f80f7c2619917b6236f3a7f02b', '1205097455226462210', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775956140035', 'ee8626f80f7c2619917b6236f3a7f02b', '1335960713267093506', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775964528642', 'ee8626f80f7c2619917b6236f3a7f02b', '1205098241075453953', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775964528643', 'ee8626f80f7c2619917b6236f3a7f02b', '1205306106780364802', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775972917250', 'ee8626f80f7c2619917b6236f3a7f02b', '109c78a583d4693ce2f16551b7786786', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775972917251', 'ee8626f80f7c2619917b6236f3a7f02b', '1192318987661234177', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775972917252', 'ee8626f80f7c2619917b6236f3a7f02b', '1224641973866467330', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775977111554', 'ee8626f80f7c2619917b6236f3a7f02b', '1229674163694841857', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775977111555', 'ee8626f80f7c2619917b6236f3a7f02b', '1209731624921534465', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775977111556', 'ee8626f80f7c2619917b6236f3a7f02b', '1304032910990495745', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775977111559', 'ee8626f80f7c2619917b6236f3a7f02b', '1174506953255182338', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775985500162', 'ee8626f80f7c2619917b6236f3a7f02b', '1174590283938041857', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775985500163', 'ee8626f80f7c2619917b6236f3a7f02b', 'ebb9d82ea16ad864071158e0c449d186', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775985500164', 'ee8626f80f7c2619917b6236f3a7f02b', '1404684556047024130', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775985500165', 'ee8626f80f7c2619917b6236f3a7f02b', '1265162119913824258', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775989694465', 'ee8626f80f7c2619917b6236f3a7f02b', '841057b8a1bef8f6b4b20f9a618a7fa6', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775989694466', 'ee8626f80f7c2619917b6236f3a7f02b', '700b7f95165c46cc7a78bf227aa8fed3', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775989694467', 'ee8626f80f7c2619917b6236f3a7f02b', '8d1ebd663688965f1fd86a2f0ead3416', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775989694468', 'ee8626f80f7c2619917b6236f3a7f02b', '024f1fd1283dc632458976463d8984e1', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775989694469', 'ee8626f80f7c2619917b6236f3a7f02b', '8b3bff2eee6f1939147f5c68292a1642', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775998083074', 'ee8626f80f7c2619917b6236f3a7f02b', 'd07a2c87a451434c99ab06296727ec4f', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775998083075', 'ee8626f80f7c2619917b6236f3a7f02b', 'fc810a2267dd183e4ef7c71cc60f4670', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775998083076', 'ee8626f80f7c2619917b6236f3a7f02b', '97c8629abc7848eccdb6d77c24bb3ebb', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775998083077', 'ee8626f80f7c2619917b6236f3a7f02b', '1287715272999944193', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184775998083078', 'ee8626f80f7c2619917b6236f3a7f02b', '1287715783966834689', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184776006471682', 'ee8626f80f7c2619917b6236f3a7f02b', '1287716451494510593', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184776006471683', 'ee8626f80f7c2619917b6236f3a7f02b', '1287718919049691137', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184776006471684', 'ee8626f80f7c2619917b6236f3a7f02b', '1287718938179911682', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184776006471685', 'ee8626f80f7c2619917b6236f3a7f02b', '1287718956957810689', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184776006471686', 'ee8626f80f7c2619917b6236f3a7f02b', '1166535831146504193', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184776006471687', 'ee8626f80f7c2619917b6236f3a7f02b', '9a90363f216a6a08f32eecb3f0bf12a3', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184776014860289', 'ee8626f80f7c2619917b6236f3a7f02b', '4356a1a67b564f0988a484f5531fd4d9', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184776014860290', 'ee8626f80f7c2619917b6236f3a7f02b', '655563cd64b75dcf52ef7bcdd4836953', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184776014860291', 'ee8626f80f7c2619917b6236f3a7f02b', '1365187528377102337', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184776014860292', 'ee8626f80f7c2619917b6236f3a7f02b', '6ad53fd1b220989a8b71ff482d683a5a', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184776014860293', 'ee8626f80f7c2619917b6236f3a7f02b', '7960961b0063228937da5fa8dd73d371', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184776014860294', 'ee8626f80f7c2619917b6236f3a7f02b', '1387612436586065922', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184776014860295', 'ee8626f80f7c2619917b6236f3a7f02b', '043780fa095ff1b2bec4dc406d76f023', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184776023248897', 'ee8626f80f7c2619917b6236f3a7f02b', '0620e402857b8c5b605e1ad9f4b89350', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184776023248898', 'ee8626f80f7c2619917b6236f3a7f02b', 'c431130c0bc0ec71b0a5be37747bb36a', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1427184776023248899', 'ee8626f80f7c2619917b6236f3a7f02b', 'e1979bb53e9ea51cecc74d86fd9d2f64', NULL, '2021-08-16 16:25:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988789567490', '1501570619841810433', '1438108176273760258', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988802150402', '1501570619841810433', '1438108176814825473', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988810539010', '1501570619841810433', '9502685863ab87f0ad1134142788a385', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988814733313', '1501570619841810433', 'd7d6e2e4e2934f2c9385a623fd98c6f3', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988814733314', '1501570619841810433', '3f915b2769fc80648e92d04e84ca059d', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988823121922', '1501570619841810433', '1214376304951664642', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988823121923', '1501570619841810433', '1214462306546319362', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988831510529', '1501570619841810433', '1a0811914300741f4e11838ff37a1d3a', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988831510530', '1501570619841810433', '190c2b43bec6a5f7a4194a85db67d96a', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988831510531', '1501570619841810433', '1170592628746878978', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988831510532', '1501570619841810433', '45c966826eeff4c99b8f8ebfe74511fc', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988831510534', '1501570619841810433', '1438782851980210178', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988839899138', '1501570619841810433', '1438782530717495298', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988839899139', '1501570619841810433', '1438782641187074050', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988844093442', '1501570619841810433', '1442055284830769154', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988844093443', '1501570619841810433', '1280350452934307841', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988844093444', '1501570619841810433', '1439398677984878593', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988844093445', '1501570619841810433', '1439399179791409153', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988844093446', '1501570619841810433', '1439488251473993730', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988844093447', '1501570619841810433', '1438469604861403137', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988852482050', '1501570619841810433', '1439511654494937090', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988856676354', '1501570619841810433', '1439531077792473089', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988856676355', '1501570619841810433', '1439533711676973057', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988860870657', '1501570619841810433', '1439784356766064642', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988860870658', '1501570619841810433', '1439797053314342913', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988860870659', '1501570619841810433', '1439839507094740994', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988869259265', '1501570619841810433', '1439842640030113793', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988873453570', '1501570619841810433', '1447763172274495489', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988873453571', '1501570619841810433', '1447763517847396354', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988873453573', '1501570619841810433', '1448252726202859522', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988873453574', '1501570619841810433', '1438108196993622018', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988873453575', '1501570619841810433', '1438108197958311537', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988873453576', '1501570619841810433', '1438108197270446081', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988873453577', '1501570619841810433', '1447535997560909826', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988873453578', '1501570619841810433', '1438783058792951810', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988881842177', '1501570619841810433', '1438108198679732226', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988881842178', '1501570619841810433', '1441340399835742209', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988881842179', '1501570619841810433', '1441357157443371009', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988881842180', '1501570619841810433', '1453250018282573826', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988881842181', '1501570619841810433', '1458389305235984385', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988881842182', '1501570619841810433', '1455067599277662209', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988890230785', '1501570619841810433', '1455019819440021505', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988890230786', '1501570619841810433', '1454034512171302914', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988890230787', '1501570619841810433', '1454031820661260289', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988898619394', '1501570619841810433', '1454031324835807233', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988898619395', '1501570619841810433', '1450308897429536769', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988898619396', '1501570619841810433', '1441361249200832513', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988907008001', '1501570619841810433', '1438108197958315557', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988907008002', '1501570619841810433', '1438108178127642626', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988907008003', '1501570619841810433', '1438108178781954049', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988907008004', '1501570619841810433', '1438108178781954050', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988907008005', '1501570619841810433', '1438108200672026626', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988911202306', '1501570619841810433', '1438108180258349057', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988911202307', '1501570619841810433', '1438108197790539778', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988911202308', '1501570619841810433', '1438108197958311937', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988911202309', '1501570619841810433', '1438108202366525441', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988911202310', '1501570619841810433', '1438108203649982466', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988911202311', '1501570619841810433', '1438108204400762881', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988911202312', '1501570619841810433', '1438108204576923649', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988911202313', '1501570619841810433', '1438108204732112898', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988911202314', '1501570619841810433', '1438108198113501186', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988919590914', '1501570619841810433', '1438108204232990721', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988919590915', '1501570619841810433', '1438108204023275521', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501570988919590916', '1501570619841810433', '1438108203817754625', NULL, '2022-03-09 22:49:56', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514077577222', '1501570619841810433', '1438108205004742657', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514077577223', '1501570619841810433', '1438108205180903426', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514077577224', '1501570619841810433', '1438108205357064193', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514077577225', '1501570619841810433', '1438108205587750914', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514077577226', '1501570619841810433', '1438108205742940161', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514077577227', '1501570619841810433', '1438108205919100930', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514077577228', '1501570619841810433', '1438108206086873089', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514085965825', '1501570619841810433', '1438108206258839553', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514085965826', '1501570619841810433', '1438108206489526274', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514085965827', '1501570619841810433', '1438108206661492738', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514085965828', '1501570619841810433', '1438108206959288321', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514085965829', '1501570619841810433', '1438108207160614913', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514085965830', '1501570619841810433', '1438108207374524418', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514085965831', '1501570619841810433', '1438108207563268097', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514085965832', '1501570619841810433', '1438108207793954818', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514085965833', '1501570619841810433', '1438108208024641538', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514085965834', '1501570619841810433', '1438108208297271297', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514094354434', '1501570619841810433', '1438108199413735425', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514094354435', '1501570619841810433', '1438108208817364993', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514094354436', '1501570619841810433', '1438108208980942850', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514094354437', '1501570619841810433', '1438108209228406785', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514094354438', '1501570619841810433', '1438108199539564546', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514098548738', '1501570619841810433', '1438108210117599234', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514098548739', '1501570619841810433', '1438108210260205570', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514098548740', '1501570619841810433', '1438108211325558785', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514098548741', '1501570619841810433', '1438108211661103106', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514098548742', '1501570619841810433', '1438108211778543618', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514098548743', '1501570619841810433', '1438108214882328577', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514098548744', '1501570619841810433', '1438108215335313409', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514098548745', '1501570619841810433', '1438108197958311637', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514098548746', '1501570619841810433', '1438108200076435458', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514098548747', '1501570619841810433', '1438108200391008257', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514098548748', '1501570619841810433', '1438108197958311677', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514098548749', '1501570619841810433', '1438108178643542017', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514098548750', '1501570619841810433', '1438108179226550273', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514098548751', '1501570619841810433', '1438108179381739521', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514106937345', '1501570619841810433', '1438108198855892993', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514106937346', '1501570619841810433', '1438108179599843330', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514106937347', '1501570619841810433', '1438108199120134145', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514106937348', '1501570619841810433', '1438108179910221825', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514106937349', '1501570619841810433', '1438108198339993602', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514106937350', '1501570619841810433', '1438108199304683521', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514106937351', '1501570619841810433', '1438108180077993985', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514106937352', '1501570619841810433', '1438108180434509826', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514106937353', '1501570619841810433', '1438108180631642113', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514106937354', '1501570619841810433', '1438108182116425729', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514106937355', '1501570619841810433', '1438108201150177281', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514106937356', '1501570619841810433', '1438108201502498817', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514106937358', '1501570619841810433', '1438108202060341249', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514115325954', '1501570619841810433', '1438108199631839234', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514115325955', '1501570619841810433', '1438108215511474177', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514115325956', '1501570619841810433', '1438108215687634945', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514115325957', '1501570619841810433', '1438108215989624834', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514115325958', '1501570619841810433', '1438108200802050050', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514115325959', '1501570619841810433', '1438108216300003330', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514115325960', '1501570619841810433', '1438108216597798914', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514115325961', '1501570619841810433', '1438108200919490562', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514115325962', '1501570619841810433', '1438108216971091969', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514115325963', '1501570619841810433', '1438108217449242626', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514115325964', '1501570619841810433', '1438108183219527682', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514115325965', '1501570619841810433', '1438108185660612609', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514123714561', '1501570619841810433', '1438108185815801858', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514123714562', '1501570619841810433', '1438108185958408193', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514123714563', '1501570619841810433', '1438108186289758209', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514123714564', '1501570619841810433', '1438108178010202113', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514123714565', '1501570619841810433', '1438108178257666049', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514123714566', '1501570619841810433', '1438108176932265985', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514123714567', '1501570619841810433', '1438108177074872321', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514123714568', '1501570619841810433', '1438108177351696386', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514123714569', '1501570619841810433', '1438108177565605889', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514123714570', '1501570619841810433', '1438108177188118529', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514123714571', '1501570619841810433', '1438108177720795137', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514123714572', '1501570619841810433', '1438108177880178689', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514123714573', '1501570619841810433', '1438108178421243905', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514123714574', '1501570619841810433', '1438108225263230978', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514123714575', '1501570619841810433', '1438108180770054145', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501572514132103169', '1501570619841810433', '1438108183085309954', NULL, '2022-03-09 22:56:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501576319410212868', '1501570619841810433', '1449995470942593026', NULL, '2022-03-09 23:11:07', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1501576328700596228', '1501570619841810433', '1449995470942593026', NULL, '2022-03-09 23:11:09', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1572775794269970434', '1501570619841810433', '1534418199197323265', NULL, '2022-09-22 10:32:25', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1580834175006171137', '1501570619841810433', '1580833876002627585', NULL, '2022-10-14 16:13:32', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1580834175006171138', '1501570619841810433', '1580834045490257922', NULL, '2022-10-14 16:13:32', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1580835941080784898', '1501570619841810433', '1580835899477483522', NULL, '2022-10-14 16:20:34', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1580861542625955842', 'f6817f48af4fb3af11b9e8bf182f618b', '1170592628746878978', NULL, '2022-10-14 18:02:17', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1580877977129570306', '1501570619841810433', '1580877931331964929', NULL, '2022-10-14 19:07:36', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1580877977129570307', '1501570619841810433', '1580877743141933058', NULL, '2022-10-14 19:07:36', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1580878701653643267', '1501570619841810433', '1580878668472504321', NULL, '2022-10-14 19:10:28', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1580878704866480129', '1501570619841810433', '1580878668472504321', NULL, '2022-10-14 19:10:29', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1587064040483061761', '1501570619841810433', '1455100420297859074', NULL, '2022-10-31 20:48:48', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1587064040495644673', '1501570619841810433', '1461270075543347202', NULL, '2022-10-31 20:48:48', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1587064040495644674', '1501570619841810433', '1458353686530232321', NULL, '2022-10-31 20:48:48', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1587064040495644675', '1501570619841810433', '1457678003102879745', NULL, '2022-10-31 20:48:48', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1587064040495644676', '1501570619841810433', '1509417558230999041', NULL, '2022-10-31 20:48:48', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1587064040495644677', '1501570619841810433', '1452508868884353026', NULL, '2022-10-31 20:48:48', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1587064040495644678', '1501570619841810433', '1461291438825558017', NULL, '2022-10-31 20:48:48', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1587064040495644679', '1501570619841810433', '1460888189937176577', NULL, '2022-10-31 20:48:48', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1587064040504033281', '1501570619841810433', '1455101470794850305', NULL, '2022-10-31 20:48:48', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1587064040504033282', '1501570619841810433', '1465686870713782273', NULL, '2022-10-31 20:48:48', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1590154918424719362', '1501570619841810433', '1590154870697734146', NULL, '2022-11-09 09:30:51', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1592114400605859842', 'f6817f48af4fb3af11b9e8bf182f618b', '1592113148350263298', NULL, '2022-11-14 19:17:08', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444602613761', '1501570619841810433', '1588513553652436993', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444602613762', '1501570619841810433', '1592114574275211265', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444602613763', '1501570619841810433', '1592114652566089729', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444602613765', '1501570619841810433', '1592114772665790465', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444602613766', '1501570619841810433', '1592114823467200514', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444602613767', '1501570619841810433', '1592114893302362114', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444602613768', '1501570619841810433', '1592114955650691074', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722625', '1501570619841810433', '1592115070432014338', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722626', '1501570619841810433', '1592115115361398786', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722627', '1501570619841810433', '1592115162379546625', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722628', '1501570619841810433', '1592115213910765570', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722631', '1501570619841810433', '1592120484120850434', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722632', '1501570619841810433', '1592120427007012865', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722633', '1501570619841810433', '1592120372296511490', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722634', '1501570619841810433', '1592120323667750914', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722635', '1501570619841810433', '1592113148350263298', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722636', '1501570619841810433', '1592112984361365505', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722637', '1501570619841810433', '1592115914493751297', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722638', '1501570619841810433', '1592116663936184322', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722639', '1501570619841810433', '1592118604640645122', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722640', '1501570619841810433', '1592118648315932674', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722641', '1501570619841810433', '1592119001883176961', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722642', '1501570619841810433', '1592120052866707457', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722643', '1501570619841810433', '1592120222727630849', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722644', '1501570619841810433', '1592117422006300673', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722645', '1501570619841810433', '1592117377299214337', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722646', '1501570619841810433', '1592117276539449345', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722647', '1501570619841810433', '1592117222764277761', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722648', '1501570619841810433', '1592115712466710529', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722649', '1501570619841810433', '1592118053634928641', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722650', '1501570619841810433', '1592117990305132545', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722651', '1501570619841810433', '1592117804359053314', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722652', '1501570619841810433', '1592117748209905665', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722653', '1501570619841810433', '1592117625664925697', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722654', '1501570619841810433', '1592118414990995457', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444669722655', '1501570619841810433', '1592118356778250241', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444732637186', '1501570619841810433', '1592118306983473154', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444732637187', '1501570619841810433', '1592118254844080130', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444732637188', '1501570619841810433', '1592118192218927105', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444732637189', '1501570619841810433', '1592118497606201346', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593150444732637190', '1501570619841810433', '1592115610431877122', NULL, '2022-11-17 15:54:00', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006353473537', 'f6817f48af4fb3af11b9e8bf182f618b', '1588513553652436993', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006353473538', 'f6817f48af4fb3af11b9e8bf182f618b', '1592114574275211265', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006353473539', 'f6817f48af4fb3af11b9e8bf182f618b', '1592114652566089729', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006353473540', 'f6817f48af4fb3af11b9e8bf182f618b', '1592115213910765570', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006353473541', 'f6817f48af4fb3af11b9e8bf182f618b', '1592115162379546625', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006353473542', 'f6817f48af4fb3af11b9e8bf182f618b', '1592115115361398786', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006353473543', 'f6817f48af4fb3af11b9e8bf182f618b', '1592115070432014338', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006353473544', 'f6817f48af4fb3af11b9e8bf182f618b', '1592114955650691074', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006353473545', 'f6817f48af4fb3af11b9e8bf182f618b', '1592114893302362114', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006353473546', 'f6817f48af4fb3af11b9e8bf182f618b', '1592114823467200514', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006353473547', 'f6817f48af4fb3af11b9e8bf182f618b', '1592114772665790465', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388100', 'f6817f48af4fb3af11b9e8bf182f618b', '1592120323667750914', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388101', 'f6817f48af4fb3af11b9e8bf182f618b', '1592120372296511490', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388102', 'f6817f48af4fb3af11b9e8bf182f618b', '1592120427007012865', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388103', 'f6817f48af4fb3af11b9e8bf182f618b', '1592120484120850434', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388104', 'f6817f48af4fb3af11b9e8bf182f618b', '1592120594695286785', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388105', 'f6817f48af4fb3af11b9e8bf182f618b', '1592120649007329281', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388106', 'f6817f48af4fb3af11b9e8bf182f618b', '1592112984361365505', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388107', 'f6817f48af4fb3af11b9e8bf182f618b', '1592115914493751297', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388108', 'f6817f48af4fb3af11b9e8bf182f618b', '1592116663936184322', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388109', 'f6817f48af4fb3af11b9e8bf182f618b', '1592118604640645122', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388110', 'f6817f48af4fb3af11b9e8bf182f618b', '1592118648315932674', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388111', 'f6817f48af4fb3af11b9e8bf182f618b', '1592119001883176961', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388112', 'f6817f48af4fb3af11b9e8bf182f618b', '1592120052866707457', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388113', 'f6817f48af4fb3af11b9e8bf182f618b', '1592115712466710529', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388114', 'f6817f48af4fb3af11b9e8bf182f618b', '1592117222764277761', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388115', 'f6817f48af4fb3af11b9e8bf182f618b', '1592117276539449345', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388116', 'f6817f48af4fb3af11b9e8bf182f618b', '1592117377299214337', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388117', 'f6817f48af4fb3af11b9e8bf182f618b', '1592117422006300673', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388118', 'f6817f48af4fb3af11b9e8bf182f618b', '1592120222727630849', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388119', 'f6817f48af4fb3af11b9e8bf182f618b', '1592118053634928641', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388120', 'f6817f48af4fb3af11b9e8bf182f618b', '1592117990305132545', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388121', 'f6817f48af4fb3af11b9e8bf182f618b', '1592117804359053314', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388122', 'f6817f48af4fb3af11b9e8bf182f618b', '1592117748209905665', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388123', 'f6817f48af4fb3af11b9e8bf182f618b', '1592117625664925697', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388124', 'f6817f48af4fb3af11b9e8bf182f618b', '1592118192218927105', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388125', 'f6817f48af4fb3af11b9e8bf182f618b', '1592118254844080130', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388126', 'f6817f48af4fb3af11b9e8bf182f618b', '1592118306983473154', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388127', 'f6817f48af4fb3af11b9e8bf182f618b', '1592118356778250241', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388128', 'f6817f48af4fb3af11b9e8bf182f618b', '1592118414990995457', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153006416388129', 'f6817f48af4fb3af11b9e8bf182f618b', '1592118497606201346', NULL, '2022-11-17 16:04:11', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1593153077300125697', 'f6817f48af4fb3af11b9e8bf182f618b', '1592115610431877122', NULL, '2022-11-17 16:04:28', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286053158913', '1501570619841810433', '1592135223910765570', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286069936130', '1501570619841810433', '1593185714482880514', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286069936131', '1501570619841810433', '15c92115213910765570', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286069936132', '1501570619841810433', '1d592115213910765570', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286069936133', '1501570619841810433', '1592120224120850434', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286078324740', '1501570619841810433', '1593160959633563650', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286086713346', '1501570619841810433', '1593160905216663554', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286086713347', '1501570619841810433', '1593161025790320641', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286086713348', '1501570619841810433', '1593161089787011074', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286090907650', '1501570619841810433', '1596335805278990338', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286090907651', '1501570619841810433', '1596141938193747970', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286090907652', '1501570619841810433', '1600105607009165314', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286090907653', '1501570619841810433', '1600108123037917186', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286090907654', '1501570619841810433', '1600129606082650113', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286095101953', '1501570619841810433', '1611620416187969538', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286095101954', '1501570619841810433', '1611620600003342337', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286095101955', '1501570619841810433', '1611620654621569026', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286095101956', '1501570619841810433', '1611620772498218641', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286095101957', '1501570619841810433', '1611620772498288641', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286095101958', '1501570619841810433', '1611650772498288641', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286099296258', '1501570619841810433', '1612438989792034818', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286099296259', '1501570619841810433', '1613620712498288641', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286099296260', '1501570619841810433', '1620261087828418562', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286099296261', '1501570619841810433', '1620305415648989186', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286099296262', '1501570619841810433', '1697220712498288641', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286099296263', '1501570619841810433', '1621620772498288641', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286099296264', '1501570619841810433', '1620327825894981634', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286099296265', '1501570619841810433', '1593161743607701505', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286099296266', '1501570619841810433', '1593161697348722689', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286099296267', '1501570619841810433', '1593161657385394177', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286099296268', '1501570619841810433', '1593161608362369026', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286099296269', '1501570619841810433', '1593161551202394114', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286099296270', '1501570619841810433', '1593161483627962370', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286107684866', '1501570619841810433', '1593161421350936578', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286107684867', '1501570619841810433', '1594930803956920321', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1631912286107684868', '1501570619841810433', '1593173018886709250', NULL, '2023-03-04 14:59:43', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1657938323991883777', '1501570619841810433', '1473927410093187073', NULL, '2023-05-15 10:37:54', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1657938324004466690', '1501570619841810433', '1542385335362383873', NULL, '2023-05-15 10:37:54', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1657938324004466691', '1501570619841810433', '1554384900763729922', NULL, '2023-05-15 10:37:54', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779465240578', 'f6817f48af4fb3af11b9e8bf182f618b', '1447535997560909826', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779486212097', 'f6817f48af4fb3af11b9e8bf182f618b', '1542385335362383873', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779486212098', 'f6817f48af4fb3af11b9e8bf182f618b', '1554384900763729922', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779486212099', 'f6817f48af4fb3af11b9e8bf182f618b', '1592120224120850434', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779490406401', 'f6817f48af4fb3af11b9e8bf182f618b', '1592135223910765570', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779490406402', 'f6817f48af4fb3af11b9e8bf182f618b', '1593160905216663554', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779490406403', 'f6817f48af4fb3af11b9e8bf182f618b', '1593160959633563650', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779490406404', 'f6817f48af4fb3af11b9e8bf182f618b', '1593161025790320641', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779498795010', 'f6817f48af4fb3af11b9e8bf182f618b', '1593161089787011074', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779498795011', 'f6817f48af4fb3af11b9e8bf182f618b', '1593161421350936578', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779498795012', 'f6817f48af4fb3af11b9e8bf182f618b', '1593161483627962370', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779502989314', 'f6817f48af4fb3af11b9e8bf182f618b', '1593161551202394114', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779502989315', 'f6817f48af4fb3af11b9e8bf182f618b', '1593161608362369026', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779502989316', 'f6817f48af4fb3af11b9e8bf182f618b', '1593161657385394177', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779502989317', 'f6817f48af4fb3af11b9e8bf182f618b', '1593161697348722689', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779502989318', 'f6817f48af4fb3af11b9e8bf182f618b', '1593161743607701505', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779502989319', 'f6817f48af4fb3af11b9e8bf182f618b', '1593173018886709250', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779502989320', 'f6817f48af4fb3af11b9e8bf182f618b', '1593185714482880514', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779502989321', 'f6817f48af4fb3af11b9e8bf182f618b', '1596335805278990338', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779511377921', 'f6817f48af4fb3af11b9e8bf182f618b', '1600105607009165314', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779511377922', 'f6817f48af4fb3af11b9e8bf182f618b', '1600108123037917186', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779511377923', 'f6817f48af4fb3af11b9e8bf182f618b', '1600129606082650113', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779511377924', 'f6817f48af4fb3af11b9e8bf182f618b', '1611620416187969538', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779511377925', 'f6817f48af4fb3af11b9e8bf182f618b', '1611620600003342337', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779511377926', 'f6817f48af4fb3af11b9e8bf182f618b', '1611620654621569026', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779511377927', 'f6817f48af4fb3af11b9e8bf182f618b', '1611620772498218641', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779511377928', 'f6817f48af4fb3af11b9e8bf182f618b', '1611620772498288641', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779511377929', 'f6817f48af4fb3af11b9e8bf182f618b', '1611650772498288641', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779511377930', 'f6817f48af4fb3af11b9e8bf182f618b', '1612438989792034818', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779511377931', 'f6817f48af4fb3af11b9e8bf182f618b', '1613620712498288641', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779519766529', 'f6817f48af4fb3af11b9e8bf182f618b', '1620261087828418562', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779519766530', 'f6817f48af4fb3af11b9e8bf182f618b', '1620305415648989186', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779519766531', 'f6817f48af4fb3af11b9e8bf182f618b', '1620327825894981634', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779519766532', 'f6817f48af4fb3af11b9e8bf182f618b', '1621620772498288641', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779519766533', 'f6817f48af4fb3af11b9e8bf182f618b', '1693195557097164801', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779519766534', 'f6817f48af4fb3af11b9e8bf182f618b', '1697220712498288641', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779519766535', 'f6817f48af4fb3af11b9e8bf182f618b', '15c92115213910765570', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779519766536', 'f6817f48af4fb3af11b9e8bf182f618b', '1d592115213910765570', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779519766537', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108177074872321', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779519766538', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108177351696386', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779528155138', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108177720795137', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779528155139', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108178127642626', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779528155140', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108183630569474', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779528155141', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108183630569477', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779528155142', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108183777370114', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779528155143', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108184049999873', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779528155144', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108186717577217', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779532349442', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108187678072833', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779532349443', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108189062193153', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779532349444', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108190110769154', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779536543746', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108190777663490', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779536543747', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108192623157249', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779536543748', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108194992939010', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779536543749', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108196263813121', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779536543750', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108197270446081', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779536543751', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108202366525441', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779536543752', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108205004742657', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779536543753', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108208817364993', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779536543754', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108210117599234', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779536543755', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108211325558785', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779536543756', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108214882328577', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779536543757', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108215511474177', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779544932354', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108216300003330', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779544932355', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108216971091969', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779544932356', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108217860284417', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779544932357', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108218787225601', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779544932358', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108219592531970', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779544932359', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108220523667458', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779544932360', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108220896960513', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779549126657', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108221127647234', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779549126659', 'f6817f48af4fb3af11b9e8bf182f618b', '1438115924159881218', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779549126660', 'f6817f48af4fb3af11b9e8bf182f618b', '1211885237487923202', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779549126661', 'f6817f48af4fb3af11b9e8bf182f618b', '1214376304951664642', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779549126662', 'f6817f48af4fb3af11b9e8bf182f618b', '1214462306546319362', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779549126663', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108176273760258', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779549126664', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108176814825473', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779553320962', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108177188118529', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779553320963', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108177565605889', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779553320964', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108177880178689', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779553320965', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108178257666049', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779553320966', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108183907393538', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779553320967', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108187103453186', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779553320968', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108187871010818', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779553320969', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108189427097601', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779553320970', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108190404370433', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779553320971', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108191356477442', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779553320972', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108193701093378', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779553320973', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108195307511809', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779553320974', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108196528054273', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779561709569', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108197958311537', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779561709570', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108197958315557', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779561709571', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108203649982466', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779561709572', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108205180903426', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779561709573', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108208980942850', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779561709574', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108210260205570', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779561709575', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108211661103106', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779565903874', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108215335313409', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779565903875', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108215687634945', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779565903876', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108216597798914', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779565903877', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108217449242626', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779565903878', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108218049028097', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779565903879', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108219034689538', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779565903880', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108219793858561', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779565903881', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108220724994049', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779565903882', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108221270253570', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779570098178', 'f6817f48af4fb3af11b9e8bf182f618b', '1438116003012796418', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779570098179', 'f6817f48af4fb3af11b9e8bf182f618b', '1438783058792951810', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779570098180', 'f6817f48af4fb3af11b9e8bf182f618b', '1439399179791409153', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779570098181', 'f6817f48af4fb3af11b9e8bf182f618b', '1439488251473993730', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779570098182', 'f6817f48af4fb3af11b9e8bf182f618b', '1446778415130722306', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779570098183', 'f6817f48af4fb3af11b9e8bf182f618b', '1447763517847396354', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779570098184', 'f6817f48af4fb3af11b9e8bf182f618b', '1454031324835807233', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779570098185', 'f6817f48af4fb3af11b9e8bf182f618b', '1455101470794850305', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779570098186', 'f6817f48af4fb3af11b9e8bf182f618b', '1590154870697734146', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779570098187', 'f6817f48af4fb3af11b9e8bf182f618b', '1a0811914300741f4e11838ff37a1d3a', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779570098188', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108176932265985', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779570098189', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108178421243905', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779570098190', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108188034588674', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779570098191', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108189754253313', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779578486786', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108195487866881', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779578486787', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108196855209985', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779578486788', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108197958311937', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779578486789', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108203817754625', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779578486790', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108205357064193', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779578486791', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108209228406785', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779578486792', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108211778543618', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779578486793', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108215989624834', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779578486794', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108219240210434', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779578486795', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108220137791489', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779578486797', 'f6817f48af4fb3af11b9e8bf182f618b', '1443391584864358402', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779578486798', 'f6817f48af4fb3af11b9e8bf182f618b', '1448252726202859522', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779578486799', 'f6817f48af4fb3af11b9e8bf182f618b', '1454031820661260289', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779578486800', 'f6817f48af4fb3af11b9e8bf182f618b', '1455100420297859074', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779578486801', 'f6817f48af4fb3af11b9e8bf182f618b', '1460888189937176577', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779578486802', 'f6817f48af4fb3af11b9e8bf182f618b', '1461291438825558017', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779578486803', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108178643542017', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779586875394', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108188378521602', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779586875395', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108195638861825', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779586875396', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108198113501186', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779586875397', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108204023275521', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779586875398', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108205587750914', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779586875399', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108218409738242', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779586875400', 'f6817f48af4fb3af11b9e8bf182f618b', '1439511654494937090', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779586875401', 'f6817f48af4fb3af11b9e8bf182f618b', '1452508868884353026', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779586875402', 'f6817f48af4fb3af11b9e8bf182f618b', '1454034512171302914', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779586875403', 'f6817f48af4fb3af11b9e8bf182f618b', '1473927410093187073', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779586875404', 'f6817f48af4fb3af11b9e8bf182f618b', '1580833876002627585', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779586875405', 'f6817f48af4fb3af11b9e8bf182f618b', '119213522910765570', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779591069698', 'f6817f48af4fb3af11b9e8bf182f618b', '1597419994965786625', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779591069699', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108178781954049', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779591069700', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108178781954050', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779591069701', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108188542099458', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779591069702', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108195924074497', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779591069703', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108199413735425', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779591069704', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108204232990721', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779591069705', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108205742940161', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779591069706', 'f6817f48af4fb3af11b9e8bf182f618b', '1438782641187074050', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779591069707', 'f6817f48af4fb3af11b9e8bf182f618b', '1439531077792473089', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779591069708', 'f6817f48af4fb3af11b9e8bf182f618b', '1455019819440021505', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779591069709', 'f6817f48af4fb3af11b9e8bf182f618b', '1580834045490257922', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779591069711', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108178911977473', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779591069712', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108188714065922', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779591069713', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108199539564546', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779595264002', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108204400762881', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779595264003', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108205919100930', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779595264005', 'f6817f48af4fb3af11b9e8bf182f618b', '1438469604861403137', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779595264006', 'f6817f48af4fb3af11b9e8bf182f618b', '1439398677984878593', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779595264007', 'f6817f48af4fb3af11b9e8bf182f618b', '1439533711676973057', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779595264009', 'f6817f48af4fb3af11b9e8bf182f618b', '1447763172274495489', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779595264010', 'f6817f48af4fb3af11b9e8bf182f618b', '1455067599277662209', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779595264011', 'f6817f48af4fb3af11b9e8bf182f618b', '1465686870713782273', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779595264012', 'f6817f48af4fb3af11b9e8bf182f618b', '1509417558230999041', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779595264013', 'f6817f48af4fb3af11b9e8bf182f618b', '1580835899477483522', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779595264014', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108179226550273', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779595264015', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108197958311637', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779595264016', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108198679732226', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779595264017', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108204576923649', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779595264018', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108206086873089', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779603652610', 'f6817f48af4fb3af11b9e8bf182f618b', '1439542701152575489', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779603652611', 'f6817f48af4fb3af11b9e8bf182f618b', '1580877743141933058', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779603652612', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108179381739521', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779603652613', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108197958311677', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779603652614', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108198855892993', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779607846913', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108204732112898', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779607846914', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108206258839553', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779607846915', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108217562488834', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779607846916', 'f6817f48af4fb3af11b9e8bf182f618b', '1441340399835742209', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779607846917', 'f6817f48af4fb3af11b9e8bf182f618b', '1580877931331964929', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779607846918', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108179599843330', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779607846919', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108197790539778', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779612041218', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108199120134145', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779612041219', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108206489526274', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779612041220', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108219445731330', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779612041221', 'f6817f48af4fb3af11b9e8bf182f618b', '1438782851980210178', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779612041222', 'f6817f48af4fb3af11b9e8bf182f618b', '1439784356766064642', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779612041223', 'f6817f48af4fb3af11b9e8bf182f618b', '1441357157443371009', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779612041224', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108179910221825', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779612041225', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108198339993602', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779612041226', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108199304683521', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779612041227', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108206661492738', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779612041228', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108220418809857', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779616235521', 'f6817f48af4fb3af11b9e8bf182f618b', '1438782530717495298', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779616235522', 'f6817f48af4fb3af11b9e8bf182f618b', '1439797053314342913', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779616235523', 'f6817f48af4fb3af11b9e8bf182f618b', '1441361249200832513', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779616235524', 'f6817f48af4fb3af11b9e8bf182f618b', '1457678003102879745', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779616235525', 'f6817f48af4fb3af11b9e8bf182f618b', '1580878668472504321', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779616235526', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108180077993985', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779616235527', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108206959288321', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779620429826', 'f6817f48af4fb3af11b9e8bf182f618b', '1439839507094740994', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779620429827', 'f6817f48af4fb3af11b9e8bf182f618b', '1450308897429536769', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779620429828', 'f6817f48af4fb3af11b9e8bf182f618b', '1455735714507472898', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779620429829', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108180258349057', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779620429831', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108199631839234', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779620429832', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108207160614913', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779620429833', 'f6817f48af4fb3af11b9e8bf182f618b', '1439842640030113793', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779620429834', 'f6817f48af4fb3af11b9e8bf182f618b', '1442055284830769154', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779620429835', 'f6817f48af4fb3af11b9e8bf182f618b', '1458389305235984385', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779620429836', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108180434509826', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779620429838', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108200076435458', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779620429839', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108207374524418', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779620429840', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108225263230978', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779620429841', 'f6817f48af4fb3af11b9e8bf182f618b', '1453250018282573826', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779620429842', 'f6817f48af4fb3af11b9e8bf182f618b', '1594930803956920321', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779624624130', 'f6817f48af4fb3af11b9e8bf182f618b', '1596141938193747970', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779624624131', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108180631642113', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779624624132', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108200391008257', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779624624133', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108207563268097', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779624624135', 'f6817f48af4fb3af11b9e8bf182f618b', '1534418199197323265', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779624624136', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108180770054145', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779624624137', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108200672026626', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779624624138', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108207793954818', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779624624139', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108200802050050', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779624624140', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108208024641538', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779624624141', 'f6817f48af4fb3af11b9e8bf182f618b', '1458353686530232321', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779624624142', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108200919490562', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779624624143', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108208297271297', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779624624144', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108183085309954', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779624624145', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108201150177281', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779624624146', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108201502498817', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779624624147', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108183395688450', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779624624148', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108178010202113', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779633012738', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108183492157442', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779633012739', 'f6817f48af4fb3af11b9e8bf182f618b', '1438108202060341249', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1693199779633012740', 'f6817f48af4fb3af11b9e8bf182f618b', '1461270075543347202', NULL, '2023-08-20 17:54:20', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('16ef8ed3865ccc6f6306200760896c50', 'ee8626f80f7c2619917b6236f3a7f02b', 'e8af452d8948ea49d37c934f5100ae6a', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('1703032629144289281', 'f6817f48af4fb3af11b9e8bf182f618b', '1609123240547344385', NULL, '2023-09-16 21:06:34', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1703032629144289282', 'f6817f48af4fb3af11b9e8bf182f618b', '1609123437247619074', NULL, '2023-09-16 21:06:34', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1703032629144289283', 'f6817f48af4fb3af11b9e8bf182f618b', '1609164542165012482', NULL, '2023-09-16 21:06:34', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1703032629211398145', 'f6817f48af4fb3af11b9e8bf182f618b', '1609164635442139138', NULL, '2023-09-16 21:06:34', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1704379601608437762', 'f6817f48af4fb3af11b9e8bf182f618b', '1691031996d593131521', NULL, '2023-09-20 14:18:58', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1704379601608437763', 'f6817f48af4fb3af11b9e8bf182f618b', '1660568426632380417', NULL, '2023-09-20 14:18:58', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1704379601608437764', 'f6817f48af4fb3af11b9e8bf182f618b', '1660568368558047234', NULL, '2023-09-20 14:18:58', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1704379601608437765', 'f6817f48af4fb3af11b9e8bf182f618b', '1660568280725127169', NULL, '2023-09-20 14:18:58', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1714210633924976642', '1501570619841810433', '1691031996d593131521', NULL, '2023-10-17 17:23:58', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1714210633966919681', '1501570619841810433', '1629109281748291586', NULL, '2023-10-17 17:23:58', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1714210633966919682', '1501570619841810433', '1701575168519839746', NULL, '2023-10-17 17:23:58', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1714210633966919684', '1501570619841810433', '1609123240547344385', NULL, '2023-10-17 17:23:58', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1714210633975308289', '1501570619841810433', '1609123437247619074', NULL, '2023-10-17 17:23:58', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1714210633975308290', '1501570619841810433', '1609164635442139138', NULL, '2023-10-17 17:23:58', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1714210633975308291', '1501570619841810433', '1609164542165012482', NULL, '2023-10-17 17:23:58', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1714210633979502594', '1501570619841810433', '1668174661456171010', NULL, '2023-10-17 17:23:58', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1714210633979502596', '1501570619841810433', '1663816667704500225', NULL, '2023-10-17 17:23:58', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1714210633979502597', '1501570619841810433', '1660568280725127169', NULL, '2023-10-17 17:23:58', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1714210633979502598', '1501570619841810433', '1660568368558047234', NULL, '2023-10-17 17:23:58', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1714210633979502599', '1501570619841810433', '1660568426632380417', NULL, '2023-10-17 17:23:58', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1714215494145949698', '1501570619841810433', '1693195557097164801', NULL, '2023-10-17 17:43:17', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1732331210279628801', 'f6817f48af4fb3af11b9e8bf182f618b', '1699374704168534017', NULL, '2023-12-06 17:28:40', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1732331210292211714', 'f6817f48af4fb3af11b9e8bf182f618b', '1699374509749960705', NULL, '2023-12-06 17:28:40', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1732331210292211715', 'f6817f48af4fb3af11b9e8bf182f618b', '1699374269152100354', NULL, '2023-12-06 17:28:40', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1741323995477389314', '1501570619841810433', '1699374269152100354', NULL, '2023-12-31 13:02:47', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1741323995489972226', '1501570619841810433', '1699374509749960705', NULL, '2023-12-31 13:02:47', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1741323995489972227', '1501570619841810433', '1691031996d5931315212', NULL, '2023-12-31 13:02:47', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1741323995489972228', '1501570619841810433', '1691031996d5931315213', NULL, '2023-12-31 13:02:47', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1741323995489972229', '1501570619841810433', '1699374704168534017', NULL, '2023-12-31 13:02:47', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1741323995489972230', '1501570619841810433', '1701475606988812289', NULL, '2023-12-31 13:02:47', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1741323995489972231', '1501570619841810433', '1699039192154071041', NULL, '2023-12-31 13:02:47', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1741323995489972232', '1501570619841810433', '1699039098474291201', NULL, '2023-12-31 13:02:47', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1741323995498360833', '1501570619841810433', '1699038961937113090', NULL, '2023-12-31 13:02:47', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1741323995498360834', '1501570619841810433', '1698650926200352770', NULL, '2023-12-31 13:02:47', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1741324948112879617', '1501570619841810433', '1737321792727388161', NULL, '2023-12-31 13:06:35', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1742379927128961025', '1501570619841810433', '1546736974756032513', NULL, '2024-01-03 10:58:41', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1765276463387095042', '1501570619841810433', '1750128461040648193', NULL, '2024-03-06 15:21:21', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1765276463395483650', '1501570619841810433', '1592114721138765826', NULL, '2024-03-06 15:21:21', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1765276566625693698', 'f6817f48af4fb3af11b9e8bf182f618b', '1750128461040648193', NULL, '2024-03-06 15:21:45', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1765276566634082305', 'f6817f48af4fb3af11b9e8bf182f618b', '1592114721138765826', NULL, '2024-03-06 15:21:45', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('17ead5b7d97ed365398ab20009a69ea3', '52b0cf022ac4187b2a70dfa4f8b2d940', 'e08cb190ef230d5d4f03824198773950', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('1800736354410942465', 'f6817f48af4fb3af11b9e8bf182f618b', '1546736974756032513', NULL, '2024-06-12 11:46:18', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1800736354410942466', 'f6817f48af4fb3af11b9e8bf182f618b', '1746709108126285826', NULL, '2024-06-12 11:46:18', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1800736354410942467', 'f6817f48af4fb3af11b9e8bf182f618b', '1691031996d5931315212', NULL, '2024-06-12 11:46:18', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1800736354410942468', 'f6817f48af4fb3af11b9e8bf182f618b', '1691031996d5931315213', NULL, '2024-06-12 11:46:18', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1800736354410942469', 'f6817f48af4fb3af11b9e8bf182f618b', '1701475606988812289', NULL, '2024-06-12 11:46:18', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1800736354410942470', 'f6817f48af4fb3af11b9e8bf182f618b', '1699039098474291201', NULL, '2024-06-12 11:46:18', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1800736354410942471', 'f6817f48af4fb3af11b9e8bf182f618b', '1699039192154071041', NULL, '2024-06-12 11:46:18', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1800736354410942472', 'f6817f48af4fb3af11b9e8bf182f618b', '1699038961937113090', NULL, '2024-06-12 11:46:18', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1800736354410942473', 'f6817f48af4fb3af11b9e8bf182f618b', '1698650926200352770', NULL, '2024-06-12 11:46:18', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1800736426536194049', '1501570619841810433', '1746709108126285826', NULL, '2024-06-12 11:46:35', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081349244334081', '1501570619841810433', '1534500282601893890', NULL, '2024-06-13 10:37:11', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081349252722690', '1501570619841810433', '1535226870641475586', NULL, '2024-06-13 10:37:11', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081349252722691', '1501570619841810433', '1535227149789184001', NULL, '2024-06-13 10:37:11', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081349252722692', '1501570619841810433', '1542383139476467713', NULL, '2024-06-13 10:37:11', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081349252722693', '1501570619841810433', '1542383223979110402', NULL, '2024-06-13 10:37:11', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081349252722694', '1501570619841810433', '1542383292690198530', NULL, '2024-06-13 10:37:11', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081349252722695', '1501570619841810433', '1542383437808922625', NULL, '2024-06-13 10:37:11', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081349252722696', '1501570619841810433', '1542383507883159553', NULL, '2024-06-13 10:37:11', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081349261111297', '1501570619841810433', '1542383573423353858', NULL, '2024-06-13 10:37:11', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081349261111298', '1501570619841810433', '1542383826117586945', NULL, '2024-06-13 10:37:11', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081349261111299', '1501570619841810433', '1542383907281563650', NULL, '2024-06-13 10:37:11', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081349261111300', '1501570619841810433', '1699374346553786370', NULL, '2024-06-13 10:37:11', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081349261111301', '1501570619841810433', '1699374404015751169', NULL, '2024-06-13 10:37:11', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081349261111302', '1501570619841810433', '1535225446864011265', NULL, '2024-06-13 10:37:11', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081349261111303', '1501570619841810433', '1699374612388773890', NULL, '2024-06-13 10:37:11', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081349261111304', '1501570619841810433', '1699374801816125442', NULL, '2024-06-13 10:37:11', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081349265305602', '1501570619841810433', '1699375086147993601', NULL, '2024-06-13 10:37:11', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081349265305603', '1501570619841810433', '1699375193576701953', NULL, '2024-06-13 10:37:11', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081424624365570', 'f6817f48af4fb3af11b9e8bf182f618b', '1534500282601893890', NULL, '2024-06-13 10:37:29', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081424624365571', 'f6817f48af4fb3af11b9e8bf182f618b', '1535226870641475586', NULL, '2024-06-13 10:37:29', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081424624365572', 'f6817f48af4fb3af11b9e8bf182f618b', '1535227149789184001', NULL, '2024-06-13 10:37:29', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081424624365573', 'f6817f48af4fb3af11b9e8bf182f618b', '1542383139476467713', NULL, '2024-06-13 10:37:29', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081424624365574', 'f6817f48af4fb3af11b9e8bf182f618b', '1542383223979110402', NULL, '2024-06-13 10:37:29', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081424624365575', 'f6817f48af4fb3af11b9e8bf182f618b', '1542383292690198530', NULL, '2024-06-13 10:37:29', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081424624365576', 'f6817f48af4fb3af11b9e8bf182f618b', '1542383437808922625', NULL, '2024-06-13 10:37:29', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081424624365577', 'f6817f48af4fb3af11b9e8bf182f618b', '1542383507883159553', NULL, '2024-06-13 10:37:29', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081424624365578', 'f6817f48af4fb3af11b9e8bf182f618b', '1542383573423353858', NULL, '2024-06-13 10:37:29', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081424624365579', 'f6817f48af4fb3af11b9e8bf182f618b', '1542383826117586945', NULL, '2024-06-13 10:37:29', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081424624365580', 'f6817f48af4fb3af11b9e8bf182f618b', '1542383907281563650', NULL, '2024-06-13 10:37:29', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081424624365581', 'f6817f48af4fb3af11b9e8bf182f618b', '1699374346553786370', NULL, '2024-06-13 10:37:29', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081424624365582', 'f6817f48af4fb3af11b9e8bf182f618b', '1699374404015751169', NULL, '2024-06-13 10:37:29', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081424624365583', 'f6817f48af4fb3af11b9e8bf182f618b', '1535225446864011265', NULL, '2024-06-13 10:37:29', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081424624365584', 'f6817f48af4fb3af11b9e8bf182f618b', '1699374612388773890', NULL, '2024-06-13 10:37:29', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081424624365585', 'f6817f48af4fb3af11b9e8bf182f618b', '1699374801816125442', NULL, '2024-06-13 10:37:29', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081424624365586', 'f6817f48af4fb3af11b9e8bf182f618b', '1699375086147993601', NULL, '2024-06-13 10:37:29', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1801081424624365587', 'f6817f48af4fb3af11b9e8bf182f618b', '1699375193576701953', NULL, '2024-06-13 10:37:29', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1802512146434314242', '1501570619841810433', '1801954937339428865', NULL, '2024-06-17 09:22:39', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1802512173219139585', 'f6817f48af4fb3af11b9e8bf182f618b', '1801954937339428865', NULL, '2024-06-17 09:22:46', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1802906584184770561', '1501570619841810433', 'f15543b0263cf6c5fac85afdd3eba3f2', NULL, '2024-06-18 11:30:01', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1803082137470636033', '1501570619841810433', '1620709334357532673', NULL, '2024-06-18 23:07:36', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1803082162472882177', 'f6817f48af4fb3af11b9e8bf182f618b', '1620709334357532673', NULL, '2024-06-18 23:07:42', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1804046501195509761', '1501570619841810433', '1804046424930480129', NULL, '2024-06-21 14:59:38', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1833351001521393666', '1501570619841810433', '1800372628805861377', NULL, '2024-09-10 11:45:15', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1833351001521393667', '1501570619841810433', '1800372727493640194', NULL, '2024-09-10 11:45:15', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1833351001521393668', '1501570619841810433', '1800372811518132225', NULL, '2024-09-10 11:45:15', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1833351001521393669', '1501570619841810433', '1800372906330374146', NULL, '2024-09-10 11:45:15', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1833351001521393670', '1501570619841810433', '1800373633509441537', NULL, '2024-09-10 11:45:15', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1833351001521393671', '1501570619841810433', '1800373733220630530', NULL, '2024-09-10 11:45:15', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1833408020878077953', '1501570619841810433', '1810923799513612290', NULL, '2024-09-10 15:31:50', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1833408020961964033', '1501570619841810433', '1811685368354754561', NULL, '2024-09-10 15:31:50', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1833408020961964034', '1501570619841810433', '1811685464467230721', NULL, '2024-09-10 15:31:50', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1833408100234309633', 'f6817f48af4fb3af11b9e8bf182f618b', '1810923799513612290', NULL, '2024-09-10 15:32:09', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1833408100242698241', 'f6817f48af4fb3af11b9e8bf182f618b', '1811685368354754561', NULL, '2024-09-10 15:32:09', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1833408100246892545', 'f6817f48af4fb3af11b9e8bf182f618b', '1811685464467230721', NULL, '2024-09-10 15:32:09', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1833408100246892546', 'f6817f48af4fb3af11b9e8bf182f618b', '1701575168519839746', NULL, '2024-09-10 15:32:09', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1833408100246892547', 'f6817f48af4fb3af11b9e8bf182f618b', '1800372628805861377', NULL, '2024-09-10 15:32:09', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1833408100255281153', 'f6817f48af4fb3af11b9e8bf182f618b', '1800372727493640194', NULL, '2024-09-10 15:32:09', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1833408100255281154', 'f6817f48af4fb3af11b9e8bf182f618b', '1800372811518132225', NULL, '2024-09-10 15:32:09', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1833408100255281155', 'f6817f48af4fb3af11b9e8bf182f618b', '1800372906330374146', NULL, '2024-09-10 15:32:09', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1833408100255281156', 'f6817f48af4fb3af11b9e8bf182f618b', '1800373633509441537', NULL, '2024-09-10 15:32:09', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1833408100255281157', 'f6817f48af4fb3af11b9e8bf182f618b', '1800373733220630530', NULL, '2024-09-10 15:32:09', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1866001696833613826', '1501570619841810433', '1866001513609637890', NULL, '2024-12-09 14:07:28', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1866001714697154561', 'f6817f48af4fb3af11b9e8bf182f618b', '1866001513609637890', NULL, '2024-12-09 14:07:32', '127.0.0.1');\nINSERT INTO `sys_role_permission` VALUES ('1887778978006814721', '1501570619841810433', '1887447660072292354', NULL, '2025-02-07 16:22:36', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1887788524574068737', '1501570619841810433', '1438108223489040385', NULL, '2025-02-07 17:00:32', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1887788524574068738', '1501570619841810433', '1438108222721482753', NULL, '2025-02-07 17:00:32', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1887788524574068739', '1501570619841810433', '1438108222218166273', NULL, '2025-02-07 17:00:32', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1887788524574068740', '1501570619841810433', '1438108221849067522', NULL, '2025-02-07 17:00:32', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1887788524574068741', '1501570619841810433', '1438108223661006850', NULL, '2025-02-07 17:00:32', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1892117657990971393', '1456165677820301314', '1876220177009315842', NULL, '2025-02-19 15:42:58', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1892117657990971394', '1456165677820301314', '1867047795019440130', NULL, '2025-02-19 15:42:58', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1892117657990971395', '1456165677820301314', '1867041505346019330', NULL, '2025-02-19 15:42:58', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1892509406223613954', '1501570619841810433', '1876220177009315842', NULL, '2025-02-20 17:39:38', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1907407238864781314', 'f6817f48af4fb3af11b9e8bf182f618b', '1892553163993931777', NULL, '2025-04-02 20:18:18', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1907407238864781315', 'f6817f48af4fb3af11b9e8bf182f618b', '1895401981290643458', NULL, '2025-04-02 20:18:18', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1907407238864781316', 'f6817f48af4fb3af11b9e8bf182f618b', '1892553778493022209', NULL, '2025-04-02 20:18:18', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1907407238864781317', 'f6817f48af4fb3af11b9e8bf182f618b', '1892557342028226561', NULL, '2025-04-02 20:18:18', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1907407238864781318', 'f6817f48af4fb3af11b9e8bf182f618b', '1893865471550578689', NULL, '2025-04-02 20:18:18', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1907441306927063042', 'f6817f48af4fb3af11b9e8bf182f618b', '1907441271556497409', NULL, '2025-04-02 22:33:41', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1917857071739539457', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050104193340030', NULL, '2025-05-01 16:22:13', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1917857071806648321', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050104193350031', NULL, '2025-05-01 16:22:13', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1917857071806648322', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050104193350032', NULL, '2025-05-01 16:22:13', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1917857071806648323', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050104193350033', NULL, '2025-05-01 16:22:13', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1917857071806648324', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050104193350034', NULL, '2025-05-01 16:22:13', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1917857071806648325', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050104193350035', NULL, '2025-05-01 16:22:13', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1917857071806648326', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050104193350036', NULL, '2025-05-01 16:22:13', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1917881149426864129', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050105554940200', NULL, '2025-05-01 17:57:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1917881149431058436', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050105554940203', NULL, '2025-05-01 17:57:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1917881149431058437', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050105554940204', NULL, '2025-05-01 17:57:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1917881149431058438', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050105554940205', NULL, '2025-05-01 17:57:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1917881149431058439', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050105554940206', NULL, '2025-05-01 17:57:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1917957659860963330', 'f6817f48af4fb3af11b9e8bf182f618b', '1917957565728198657', NULL, '2025-05-01 23:01:55', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1922109760551858178', 'f6817f48af4fb3af11b9e8bf182f618b', '1922109301837606914', NULL, '2025-05-13 10:00:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1922164055780016129', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050105554940201', NULL, '2025-05-13 13:36:38', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1922164055800987650', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050105554940202', NULL, '2025-05-13 13:36:38', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1923218122706386946', 'f6817f48af4fb3af11b9e8bf182f618b', '1890213291321749505', NULL, '2025-05-16 11:25:07', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1923218155547787265', '1501570619841810433', '1892553163993931777', NULL, '2025-05-16 11:25:15', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1923218155547787266', '1501570619841810433', '1895401981290643458', NULL, '2025-05-16 11:25:15', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1923218155547787267', '1501570619841810433', '1892553778493022209', NULL, '2025-05-16 11:25:15', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1923218155547787268', '1501570619841810433', '1890213291321749505', NULL, '2025-05-16 11:25:15', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1923218155547787269', '1501570619841810433', '1892557342028226561', NULL, '2025-05-16 11:25:15', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1923218155547787270', '1501570619841810433', '1893865471550578689', NULL, '2025-05-16 11:25:15', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937756570591584258', '1501570619841810433', '1438108221551271937', NULL, '2025-06-25 14:15:43', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937756570658693122', '1501570619841810433', '1922109301837606914', NULL, '2025-06-25 14:15:43', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937756570658693123', '1501570619841810433', '2025050104193340030', NULL, '2025-06-25 14:15:43', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937756570658693124', '1501570619841810433', '2025050104193350031', NULL, '2025-06-25 14:15:43', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937756570658693125', '1501570619841810433', '2025050104193350032', NULL, '2025-06-25 14:15:43', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937756570658693126', '1501570619841810433', '2025050104193350033', NULL, '2025-06-25 14:15:43', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937756570658693127', '1501570619841810433', '2025050104193350034', NULL, '2025-06-25 14:15:43', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937756570658693128', '1501570619841810433', '2025050104193350035', NULL, '2025-06-25 14:15:43', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937756570658693129', '1501570619841810433', '2025050104193350036', NULL, '2025-06-25 14:15:43', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937756570658693130', '1501570619841810433', '2025050105554940200', NULL, '2025-06-25 14:15:43', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937756570658693131', '1501570619841810433', '2025050105554940201', NULL, '2025-06-25 14:15:43', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937756570658693132', '1501570619841810433', '2025050105554940202', NULL, '2025-06-25 14:15:43', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937756570658693133', '1501570619841810433', '2025050105554940203', NULL, '2025-06-25 14:15:43', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937756570658693134', '1501570619841810433', '2025050105554940204', NULL, '2025-06-25 14:15:43', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937756570658693135', '1501570619841810433', '2025050105554940205', NULL, '2025-06-25 14:15:43', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937756570658693136', '1501570619841810433', '2025050105554940206', NULL, '2025-06-25 14:15:43', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937756570658693137', '1501570619841810433', '1917957565728198657', NULL, '2025-06-25 14:15:43', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937789330064568321', '1501570619841810433', '1930222558582472705', NULL, '2025-06-25 16:25:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937789330077151234', '1501570619841810433', '1930222617197871105', NULL, '2025-06-25 16:25:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937789330085539842', '1501570619841810433', '1930222679269376001', NULL, '2025-06-25 16:25:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937789330085539843', '1501570619841810433', '1930222862556266498', NULL, '2025-06-25 16:25:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937789330085539844', '1501570619841810433', '1930222953853681666', NULL, '2025-06-25 16:25:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937789330085539845', '1501570619841810433', '1930223034757611522', NULL, '2025-06-25 16:25:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937789330089734145', '1501570619841810433', '1930223132619112449', NULL, '2025-06-25 16:25:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937789330089734146', '1501570619841810433', '1930221570324758530', NULL, '2025-06-25 16:25:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937789330089734147', '1501570619841810433', '1930221637551063042', NULL, '2025-06-25 16:25:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937789330089734148', '1501570619841810433', '1930221702164316161', NULL, '2025-06-25 16:25:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937789330089734149', '1501570619841810433', '1930221774230847490', NULL, '2025-06-25 16:25:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937789330089734150', '1501570619841810433', '1930221983555977217', NULL, '2025-06-25 16:25:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937789330089734151', '1501570619841810433', '1930222066120851457', NULL, '2025-06-25 16:25:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937789330093928450', '1501570619841810433', '1930222218734796802', NULL, '2025-06-25 16:25:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937789330093928451', '1501570619841810433', '1930222295012409345', NULL, '2025-06-25 16:25:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937789330093928452', '1501570619841810433', '1930222395180777474', NULL, '2025-06-25 16:25:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937789330098122753', '1501570619841810433', '1930221213607591937', NULL, '2025-06-25 16:25:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1937789330098122754', '1501570619841810433', '1930221335938662401', NULL, '2025-06-25 16:25:53', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1938073430981754881', '1501570619841810433', '1912753560201089025', NULL, '2025-06-26 11:14:48', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1950486711935152129', '1501570619841810433', '1939572818833301506', NULL, '2025-07-30 17:20:45', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1950486711935152130', '1501570619841810433', '1455735714507472898', NULL, '2025-07-30 17:20:45', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1950487094736695297', '1501570619841810433', '1930152938891608066', NULL, '2025-07-30 17:22:16', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1950487094803804162', '1501570619841810433', '1942160438629109761', NULL, '2025-07-30 17:22:16', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1950487483951329281', '1501570619841810433', '1941349246536998913', NULL, '2025-07-30 17:23:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1950487483951329282', '1501570619841810433', '1941349335431077889', NULL, '2025-07-30 17:23:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1950487483959717889', '1501570619841810433', '1941349462887587842', NULL, '2025-07-30 17:23:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1950487483959717890', '1501570619841810433', '1941349550087168001', NULL, '2025-07-30 17:23:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1962489414454194178', '1962488045068464130', '1609123240547344385', NULL, '2025-09-01 20:15:12', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251539722241', '1962488045068464130', '1674708136602542082', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251548110850', '1962488045068464130', '1663816667704500225', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251552305154', '1962488045068464130', '119213522910765570', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251552305155', '1962488045068464130', '1592114574275211345', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251560693762', '1962488045068464130', '1960994076329316353', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251560693763', '1962488045068464130', '1214462306546319322', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251560693764', '1962488045068464130', '1597419994965786625', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251560693765', '1962488045068464130', '1592102143467200514', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251569082370', '1962488045068464130', '1592114893302823614', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251569082371', '1962488045068464130', '1592120323667750934', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251569082372', '1962488045068464130', '1592120372296522490', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251569082373', '1962488045068464130', '1592120427223412865', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251573276674', '1962488045068464130', '1961009998209257473', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251573276675', '1962488045068464130', '1592115712422330529', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251573276676', '1962488045068464130', '1592117222764277032', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251573276677', '1962488045068464130', '1592117276539449346', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251581665281', '1962488045068464130', '1592117377299214338', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251581665282', '1962488045068464130', '1961253156897710081', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251585859586', '1962488045068464130', '1600105607009162230', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251585859587', '1962488045068464130', '1600108123037913486', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962765251585859588', '1962488045068464130', '1609123240547344376', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1962766200899461121', '1962488045068464130', '1592114955650691174', NULL, '2025-09-02 14:35:03', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1963068885343252482', '1962488045068464130', '1600129606082650123', NULL, '2025-09-03 10:37:49', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1963086686351036418', '1962488045068464130', '1963086454217281537', NULL, '2025-09-03 11:48:33', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1963133491872829442', '1962488045068464130', '1963133393868722178', NULL, '2025-09-03 14:54:32', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1963153837854330881', 'ee8626f80f7c2619917b6236f3a7f02b', '1596141938193747970', NULL, '2025-09-03 16:15:23', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1963153837854330882', 'ee8626f80f7c2619917b6236f3a7f02b', '1596335805278990338', NULL, '2025-09-03 16:15:23', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1963153837854339901', 'ee8626f80f7c2619917b6236f3a7f02b', '1611620654621569026', NULL, '2025-09-03 16:15:23', '192.168.1.6');\nINSERT INTO `sys_role_permission` VALUES ('1966810195686531074', 'ee8626f80f7c2619917b6236f3a7f02b', '1438108225451974658', NULL, '2025-09-13 18:24:27', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299781357570', '1501570619841810433', '1438108187455774722', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299789746177', '1501570619841810433', '1438108187678072833', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299789746178', '1501570619841810433', '1438108189062193153', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299789746179', '1501570619841810433', '1438108189427097601', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299789746180', '1501570619841810433', '1438108189754253313', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299789746181', '1501570619841810433', '1438108187871010818', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299789746182', '1501570619841810433', '1438108190110769154', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299789746183', '1501570619841810433', '1438108190404370433', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299798134786', '1501570619841810433', '1438108188034588674', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299798134787', '1501570619841810433', '1438108190777663490', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299798134788', '1501570619841810433', '1438108191356477442', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299798134789', '1501570619841810433', '1438108188378521602', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299798134790', '1501570619841810433', '1438108192623157249', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299798134791', '1501570619841810433', '1438108193701093378', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299798134792', '1501570619841810433', '1438108188542099458', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299798134793', '1501570619841810433', '1438108194992939010', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299798134794', '1501570619841810433', '1438108195307511809', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299798134795', '1501570619841810433', '1438108195487866881', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299798134796', '1501570619841810433', '1438108195638861825', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299802329089', '1501570619841810433', '1438108195924074497', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299802329090', '1501570619841810433', '1438108178911977473', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299802329091', '1501570619841810433', '1438108183630569474', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299802329092', '1501570619841810433', '1438108183630569477', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299802329093', '1501570619841810433', '1438108183907393538', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299802329094', '1501570619841810433', '1438108184049999873', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299802329095', '1501570619841810433', '1438108188714065922', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299802329096', '1501570619841810433', '1438108196263813121', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299802329097', '1501570619841810433', '1438108196528054273', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299802329098', '1501570619841810433', '1438108196855209985', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299802329099', '1501570619841810433', '1438108217562488834', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299802329100', '1501570619841810433', '1438108217860284417', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299802329101', '1501570619841810433', '1438108218049028097', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299802329102', '1501570619841810433', '1438108218409738242', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299810717697', '1501570619841810433', '1438108218787225601', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299810717698', '1501570619841810433', '1438108219034689538', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299810717699', '1501570619841810433', '1438108219240210434', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299810717700', '1501570619841810433', '1438108219445731330', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299810717701', '1501570619841810433', '1438108219592531970', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299810717702', '1501570619841810433', '1438108219793858561', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299810717703', '1501570619841810433', '1446778415130722306', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299810717704', '1501570619841810433', '1438108220137791489', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299810717705', '1501570619841810433', '1438108220418809857', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299810717706', '1501570619841810433', '1438108220523667458', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299810717707', '1501570619841810433', '1438108220896960513', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299810717708', '1501570619841810433', '1438108221127647234', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299810717709', '1501570619841810433', '1438108221270253570', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299810717710', '1501570619841810433', '1438108220724994049', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299814912001', '1501570619841810433', '1438108183395688450', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299814912002', '1501570619841810433', '1438115924159881218', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299814912003', '1501570619841810433', '1438116003012796418', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299814912004', '1501570619841810433', '1438108183492157442', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299814912005', '1501570619841810433', '1438108186717577217', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1966827299814912006', '1501570619841810433', '1438108187103453186', NULL, '2025-09-13 19:32:25', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363665309697', '1501570619841810433', '1674708136602542082', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363677892609', '1501570619841810433', '1963133393868722178', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363677892610', '1501570619841810433', '119213522910765570', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363677892611', '1501570619841810433', '1597419994965786625', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363677892612', '1501570619841810433', '1592102143467200514', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363686281217', '1501570619841810433', '1592114893302823614', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363686281218', '1501570619841810433', '1592114955650691174', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363690475522', '1501570619841810433', '1592120323667750934', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363690475523', '1501570619841810433', '1592120372296522490', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363690475524', '1501570619841810433', '1592120427223412865', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363690475525', '1501570619841810433', '1961009998209257473', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363690475526', '1501570619841810433', '1592115712422330529', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363690475527', '1501570619841810433', '1592117222764277032', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363690475528', '1501570619841810433', '1592117276539449346', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363690475529', '1501570619841810433', '1592117377299214338', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363690475530', '1501570619841810433', '1961253156897710081', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363694669826', '1501570619841810433', '1600105607009162230', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363694669827', '1501570619841810433', '1600108123037913486', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363694669828', '1501570619841810433', '1609123240547344376', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993228363694669829', '1501570619841810433', '1963086454217281537', NULL, '2025-11-25 16:00:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993244381406035969', '1501570619841810433', '1443390062919208961', NULL, '2025-11-25 17:04:28', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993244381456367618', '1501570619841810433', '1443391584864358402', NULL, '2025-11-25 17:04:28', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993244381456367619', '1501570619841810433', '1439542701152575489', NULL, '2025-11-25 17:04:28', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993532089659559937', 'f6817f48af4fb3af11b9e8bf182f618b', '1980223355087781889', NULL, '2025-11-26 12:07:43', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993532089659559938', 'f6817f48af4fb3af11b9e8bf182f618b', '1912753560201089025', NULL, '2025-11-26 12:07:43', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993532116092063746', '1501570619841810433', '1980223355087781889', NULL, '2025-11-26 12:07:49', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993532192269012993', '1501570619841810433', '1972645086223814657', NULL, '2025-11-26 12:08:07', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993532373655883778', '1501570619841810433', '1972617196420993025', NULL, '2025-11-26 12:08:51', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993532463099416577', 'f6817f48af4fb3af11b9e8bf182f618b', '1972617196420993025', NULL, '2025-11-26 12:09:12', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1993532463099416578', 'f6817f48af4fb3af11b9e8bf182f618b', '1972645086223814657', NULL, '2025-11-26 12:09:12', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391197980127234', '1501570619841810433', '1930223114757611522', NULL, '2025-12-01 15:15:09', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391279299293186', 'f6817f48af4fb3af11b9e8bf182f618b', '1930222862556266498', NULL, '2025-12-01 15:15:28', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391279299293187', 'f6817f48af4fb3af11b9e8bf182f618b', '1930222953853681666', NULL, '2025-12-01 15:15:28', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391279299293188', 'f6817f48af4fb3af11b9e8bf182f618b', '1930223034757611522', NULL, '2025-12-01 15:15:28', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391279299293189', 'f6817f48af4fb3af11b9e8bf182f618b', '1930223114757611522', NULL, '2025-12-01 15:15:28', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391279299293190', 'f6817f48af4fb3af11b9e8bf182f618b', '1930223132619112449', NULL, '2025-12-01 15:15:28', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391279362207745', 'f6817f48af4fb3af11b9e8bf182f618b', '1930222295012409345', NULL, '2025-12-01 15:15:28', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391279362207746', 'f6817f48af4fb3af11b9e8bf182f618b', '1930222395180777474', NULL, '2025-12-01 15:15:28', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391279362207747', 'f6817f48af4fb3af11b9e8bf182f618b', '1930222218734796802', NULL, '2025-12-01 15:15:28', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391279362207748', 'f6817f48af4fb3af11b9e8bf182f618b', '1930222066120851457', NULL, '2025-12-01 15:15:28', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391279362207749', 'f6817f48af4fb3af11b9e8bf182f618b', '1930221983555977217', NULL, '2025-12-01 15:15:28', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391279362207750', 'f6817f48af4fb3af11b9e8bf182f618b', '1930221774230847490', NULL, '2025-12-01 15:15:28', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391279362207751', 'f6817f48af4fb3af11b9e8bf182f618b', '1930221702164316161', NULL, '2025-12-01 15:15:28', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391279362207752', 'f6817f48af4fb3af11b9e8bf182f618b', '1930221637551063042', NULL, '2025-12-01 15:15:28', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391279362207753', 'f6817f48af4fb3af11b9e8bf182f618b', '1930221570324758530', NULL, '2025-12-01 15:15:28', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391337201659906', 'f6817f48af4fb3af11b9e8bf182f618b', '1930221213607591937', NULL, '2025-12-01 15:15:42', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391337201659907', 'f6817f48af4fb3af11b9e8bf182f618b', '1930221335938662401', NULL, '2025-12-01 15:15:42', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391337201659908', 'f6817f48af4fb3af11b9e8bf182f618b', '1930222679269376001', NULL, '2025-12-01 15:15:42', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391337201659909', 'f6817f48af4fb3af11b9e8bf182f618b', '1930222617197871105', NULL, '2025-12-01 15:15:42', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1995391337201659910', 'f6817f48af4fb3af11b9e8bf182f618b', '1930222558582472705', NULL, '2025-12-01 15:15:42', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828182863873', '1996463539853824001', '1438108176273760258', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828191252482', '1996463539853824001', '9502685863ab87f0ad1134142788a385', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828191252483', '1996463539853824001', '1438108176814825473', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828191252484', '1996463539853824001', '1620709334357532673', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828191252485', '1996463539853824001', '1892553163993931777', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828191252486', '1996463539853824001', '1893865471550578689', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828191252487', '1996463539853824001', '1930221213607591937', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828199641089', '1996463539853824001', '1930221335938662401', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828199641090', '1996463539853824001', '1892557342028226561', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828199641091', '1996463539853824001', '1930221570324758530', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828199641092', '1996463539853824001', '1930221637551063042', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828199641093', '1996463539853824001', '1930221702164316161', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828199641094', '1996463539853824001', '1930221774230847490', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828199641095', '1996463539853824001', '1930221983555977217', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828199641096', '1996463539853824001', '1930222066120851457', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828203835393', '1996463539853824001', '1930222218734796802', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828203835394', '1996463539853824001', '1930222295012409345', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828203835395', '1996463539853824001', '1930222395180777474', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828203835396', '1996463539853824001', '1890213291321749505', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828203835397', '1996463539853824001', '1930222862556266498', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828203835398', '1996463539853824001', '1930222953853681666', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828203835399', '1996463539853824001', '1930223034757611522', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828203835400', '1996463539853824001', '1930223114757611522', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828203835401', '1996463539853824001', '1930223132619112449', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828212224001', '1996463539853824001', '1892553778493022209', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828212224002', '1996463539853824001', '1930222558582472705', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828212224003', '1996463539853824001', '1930222617197871105', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828212224004', '1996463539853824001', '1930222679269376001', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828212224005', '1996463539853824001', '1895401981290643458', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828212224006', '1996463539853824001', '1980223355087781889', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828212224007', '1996463539853824001', '1912753560201089025', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828212224008', '1996463539853824001', '1460888189937176577', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828212224009', '1996463539853824001', '1535225446864011265', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828212224010', '1996463539853824001', '1699374612388773890', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828212224011', '1996463539853824001', '1699374704168534017', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828212224012', '1996463539853824001', '1699374801816125442', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828212224013', '1996463539853824001', '1699375086147993601', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828212224014', '1996463539853824001', '1699375193576701953', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828212224015', '1996463539853824001', '1801954937339428865', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828212224016', '1996463539853824001', '1455101470794850305', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828212224017', '1996463539853824001', '1534500282601893890', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828220612609', '1996463539853824001', '1535226870641475586', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828220612610', '1996463539853824001', '1535227149789184001', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828220612611', '1996463539853824001', '1542383139476467713', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828220612612', '1996463539853824001', '1542383223979110402', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828220612613', '1996463539853824001', '1542383292690198530', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828220612614', '1996463539853824001', '1542383437808922625', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828220612615', '1996463539853824001', '1542383507883159553', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828220612616', '1996463539853824001', '1542383573423353858', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828220612617', '1996463539853824001', '1542383826117586945', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828220612618', '1996463539853824001', '1542383907281563650', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828224806914', '1996463539853824001', '1546736974756032513', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828224806915', '1996463539853824001', '1699374269152100354', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828224806916', '1996463539853824001', '1699374346553786370', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828224806917', '1996463539853824001', '1699374404015751169', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828224806918', '1996463539853824001', '1699374509749960705', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828224806919', '1996463539853824001', '1455100420297859074', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828224806920', '1996463539853824001', '1461291438825558017', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828224806921', '1996463539853824001', '1746709108126285826', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828224806922', '1996463539853824001', '1691031996d593131521', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828224806923', '1996463539853824001', '1691031996d5931315212', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828224806924', '1996463539853824001', '1691031996d5931315213', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828224806925', '1996463539853824001', '1465686870713782273', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828224806926', '1996463539853824001', '1509417558230999041', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828224806927', '1996463539853824001', '1461270075543347202', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828224806928', '1996463539853824001', '1866001513609637890', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828224806929', '1996463539853824001', '1452508868884353026', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828224806930', '1996463539853824001', '1473927410093187073', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828224806931', '1996463539853824001', '1542385335362383873', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828224806932', '1996463539853824001', '1554384900763729922', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828233195521', '1996463539853824001', '1698650926200352770', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828233195522', '1996463539853824001', '1699038961937113090', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828233195523', '1996463539853824001', '1699039098474291201', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828233195524', '1996463539853824001', '1699039192154071041', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828233195525', '1996463539853824001', '1701475606988812289', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828233195526', '1996463539853824001', '1876220177009315842', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828233195527', '1996463539853824001', '1907441271556497409', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828233195528', '1996463539853824001', 'd7d6e2e4e2934f2c9385a623fd98c6f3', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828233195529', '1996463539853824001', '1170592628746878978', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828233195530', '1996463539853824001', '1592112984361365505', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828233195531', '1996463539853824001', '1592115914493751297', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828233195532', '1996463539853824001', '1592116663936184322', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828237389826', '1996463539853824001', '1592118604640645122', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828237389827', '1996463539853824001', '1592118648315932674', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828237389828', '1996463539853824001', '1592119001883176961', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828237389829', '1996463539853824001', '1592120052866707457', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828237389830', '1996463539853824001', '1750128461040648193', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828237389831', '1996463539853824001', '3f915b2769fc80648e92d04e84ca059d', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828237389832', '1996463539853824001', '1588513553652436993', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828237389833', '1996463539853824001', '1592114574275211265', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828237389834', '1996463539853824001', '1592114652566089729', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828237389835', '1996463539853824001', '1592114721138765826', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828237389836', '1996463539853824001', '1592114772665790465', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828237389837', '1996463539853824001', '1592114823467200514', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828237389838', '1996463539853824001', '1592114893302362114', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828237389839', '1996463539853824001', '1592114955650691074', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828241584129', '1996463539853824001', '1592115070432014338', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828241584130', '1996463539853824001', '1592115115361398786', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828241584131', '1996463539853824001', '1592115162379546625', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828241584132', '1996463539853824001', '1592115213910765570', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828241584133', '1996463539853824001', '1592135223910765570', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828241584134', '1996463539853824001', '1593185714482880514', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828241584135', '1996463539853824001', '1808098125316870145', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828241584136', '1996463539853824001', '1972645086223814657', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828241584137', '1996463539853824001', '15c92115213910765570', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828241584138', '1996463539853824001', '1d592115213910765570', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828241584139', '1996463539853824001', '1214376304951664642', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828241584140', '1996463539853824001', '1214462306546319362', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828241584141', '1996463539853824001', '1a0811914300741f4e11838ff37a1d3a', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828245778434', '1996463539853824001', 'f15543b0263cf6c5fac85afdd3eba3f2', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828245778435', '1996463539853824001', '190c2b43bec6a5f7a4194a85db67d96a', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828245778436', '1996463539853824001', '1592113148350263298', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828245778437', '1996463539853824001', '1592120224120850434', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828245778438', '1996463539853824001', '1592120323667750914', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828245778439', '1996463539853824001', '1592120372296511490', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828245778440', '1996463539853824001', '1592120427007012865', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828245778441', '1996463539853824001', '1592120484120850434', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828245778442', '1996463539853824001', '1592120594695286785', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828245778443', '1996463539853824001', '1592120649007329281', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828245778444', '1996463539853824001', '1693195557097164801', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828245778445', '1996463539853824001', '45c966826eeff4c99b8f8ebfe74511fc', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828245778446', '1996463539853824001', '1592115712466710529', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828249972738', '1996463539853824001', '1592117222764277761', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828249972739', '1996463539853824001', '1592117276539449345', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828249972740', '1996463539853824001', '1592117377299214337', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828249972741', '1996463539853824001', '1592117422006300673', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828249972742', '1996463539853824001', '1592120222727630849', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828249972743', '1996463539853824001', '1972617196420993025', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828249972744', '1996463539853824001', '5c2f42277948043026b7a14692456828', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828258361346', '1996463539853824001', '1592117625664925697', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828258361347', '1996463539853824001', '1592117748209905665', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828258361348', '1996463539853824001', '1592117804359053314', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828258361349', '1996463539853824001', '1592117990305132545', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828258361350', '1996463539853824001', '1592118053634928641', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828258361351', '1996463539853824001', '1438782641187074050', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828258361352', '1996463539853824001', '1592118192218927105', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828258361353', '1996463539853824001', '1592118254844080130', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828258361354', '1996463539853824001', '1592118306983473154', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828258361355', '1996463539853824001', '1592118356778250241', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828258361356', '1996463539853824001', '1592118414990995457', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828258361357', '1996463539853824001', '1593160905216663554', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828258361358', '1996463539853824001', '1593160959633563650', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828258361359', '1996463539853824001', '1593161025790320641', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828258361360', '1996463539853824001', '1593161089787011074', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828258361361', '1996463539853824001', '1810652607946940417', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828258361362', '1996463539853824001', '1701575168519839746', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828262555650', '1996463539853824001', '1800372628805861377', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828262555651', '1996463539853824001', '1800372727493640194', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828262555652', '1996463539853824001', '1800372811518132225', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828262555653', '1996463539853824001', '1800372906330374146', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828262555654', '1996463539853824001', '1800373633509441537', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828262555655', '1996463539853824001', '1800373733220630530', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828262555656', '1996463539853824001', '1438782851980210178', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828262555657', '1996463539853824001', '1438782530717495298', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828262555658', '1996463539853824001', '1596141938193747970', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1996463828262555659', '1996463539853824001', '1596335805278990338', NULL, '2025-12-04 14:17:24', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('1ac1688ef8456f384091a03d88a89ab1', '52b0cf022ac4187b2a70dfa4f8b2d940', '693ce69af3432bd00be13c3971a57961', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('1af4babaa4227c3cbb830bc5eb513abb', 'ee8626f80f7c2619917b6236f3a7f02b', 'e08cb190ef230d5d4f03824198773950', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('1ba162bbc2076c25561f8622f610d5bf', 'ee8626f80f7c2619917b6236f3a7f02b', 'aedbf679b5773c1f25e9f7b10111da73', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('1fe4d408b85f19618c15bcb768f0ec22', '1750a8fb3e6d90cb7957c02de1dc8e59', '9502685863ab87f0ad1134142788a385', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('2013562995686309890', '1501570619841810433', '2012376076054974466', NULL, '2026-01-20 18:43:23', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013562995694698498', '1501570619841810433', '1999367175911657473', NULL, '2026-01-20 18:43:23', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013562995703087105', '1501570619841810433', '2000880658872508417', NULL, '2026-01-20 18:43:23', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013562995703087106', '1501570619841810433', '2012375501376606210', NULL, '2026-01-20 18:43:23', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013562995703087107', '1501570619841810433', '2008516285254000642', NULL, '2026-01-20 18:43:23', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013562995703087108', '1501570619841810433', '2010623918706446338', NULL, '2026-01-20 18:43:23', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013562995707281409', '1501570619841810433', '1996422809213341698', NULL, '2026-01-20 18:43:23', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013563053127303169', 'f6817f48af4fb3af11b9e8bf182f618b', '1930152938891608066', NULL, '2026-01-20 18:43:37', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013563053127303170', 'f6817f48af4fb3af11b9e8bf182f618b', '1942160438629109761', NULL, '2026-01-20 18:43:37', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013563053127303171', 'f6817f48af4fb3af11b9e8bf182f618b', '1996422809213341698', NULL, '2026-01-20 18:43:37', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013563053127303172', 'f6817f48af4fb3af11b9e8bf182f618b', '2012376076054974466', NULL, '2026-01-20 18:43:37', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013563053135691777', 'f6817f48af4fb3af11b9e8bf182f618b', '1999367175911657473', NULL, '2026-01-20 18:43:37', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013563053135691778', 'f6817f48af4fb3af11b9e8bf182f618b', '2000880658872508417', NULL, '2026-01-20 18:43:37', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013563053135691779', 'f6817f48af4fb3af11b9e8bf182f618b', '2012375501376606210', NULL, '2026-01-20 18:43:37', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013563053135691780', 'f6817f48af4fb3af11b9e8bf182f618b', '2008516285254000642', NULL, '2026-01-20 18:43:37', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013563053135691781', 'f6817f48af4fb3af11b9e8bf182f618b', '2010623918706446338', NULL, '2026-01-20 18:43:37', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013564035835953154', '1501570619841810433', '2025070908023480210', NULL, '2026-01-20 18:47:31', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013564317332471810', '1501570619841810433', '2025070908023490211', NULL, '2026-01-20 18:48:38', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013564317399580674', '1501570619841810433', '2025070908023490212', NULL, '2026-01-20 18:48:38', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013564317399580675', '1501570619841810433', '2025070908023490213', NULL, '2026-01-20 18:48:38', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013564317399580676', '1501570619841810433', '2025070908023490214', NULL, '2026-01-20 18:48:38', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('2013564317399580677', '1501570619841810433', '2025070908023490215', NULL, '2026-01-20 18:48:38', '0:0:0:0:0:0:0:1');\nINSERT INTO `sys_role_permission` VALUES ('248d288586c6ff3bd14381565df84163', '52b0cf022ac4187b2a70dfa4f8b2d940', '3f915b2769fc80648e92d04e84ca059d', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('25f5443f19c34d99718a016d5f54112e', 'ee8626f80f7c2619917b6236f3a7f02b', '6e73eb3c26099c191bf03852ee1310a1', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('27489816708b18859768dfed5945c405', 'a799c3b1b12dd3ed4bd046bfaef5fe6e', '9502685863ab87f0ad1134142788a385', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('296f9c75ca0e172ae5ce4c1022c996df', '646c628b2b8295fbdab2d34044de0354', '732d48f8e0abe99fe6a23d18a3171cd1', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('29fb4d37aa29b9fa400f389237cf9fe7', 'ee8626f80f7c2619917b6236f3a7f02b', '05b3c82ddb2536a4a5ee1a4c46b5abef', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('2c462293cbb0eab7e8ae0a3600361b5f', '52b0cf022ac4187b2a70dfa4f8b2d940', '9502685863ab87f0ad1134142788a385', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('2dc1a0eb5e39aaa131ddd0082a492d76', 'ee8626f80f7c2619917b6236f3a7f02b', '08e6b9dc3c04489c8e1ff2ce6f105aa4', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('2ea2382af618ba7d1e80491a0185fb8a', 'ee8626f80f7c2619917b6236f3a7f02b', 'f23d9bfff4d9aa6b68569ba2cff38415', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('2fcfa2ac3dcfadc7c67107dae9a0de6d', 'ee8626f80f7c2619917b6236f3a7f02b', '73678f9daa45ed17a3674131b03432fb', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('2fdaed22dfa4c8d4629e44ef81688c6a', '52b0cf022ac4187b2a70dfa4f8b2d940', 'aedbf679b5773c1f25e9f7b10111da73', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('300c462b7fec09e2ff32574ef8b3f0bd', '52b0cf022ac4187b2a70dfa4f8b2d940', '2a470fc0c3954d9dbb61de6d80846549', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('35ac7cae648de39eb56213ca1b649713', '52b0cf022ac4187b2a70dfa4f8b2d940', 'b1cb0a3fedf7ed0e4653cb5a229837ee', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('37112f4d372541e105473f18da3dc50d', 'ee8626f80f7c2619917b6236f3a7f02b', 'a400e4f4d54f79bf5ce160ae432231af', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('37789f70cd8bd802c4a69e9e1f633eaa', 'ee8626f80f7c2619917b6236f3a7f02b', 'ae4fed059f67086fd52a73d913cf473d', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('381504a717cb3ce77dcd4070c9689a7e', 'ee8626f80f7c2619917b6236f3a7f02b', '4f84f9400e5e92c95f05b554724c2b58', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('3e563751942b0879c88ca4de19757b50', '1750a8fb3e6d90cb7957c02de1dc8e59', '58857ff846e61794c69208e9d3a85466', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('412e2de37a35b3442d68db8dd2f3c190', '52b0cf022ac4187b2a70dfa4f8b2d940', 'f1cb187abf927c88b89470d08615f5ac', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('4204f91fb61911ba8ce40afa7c02369f', 'f6817f48af4fb3af11b9e8bf182f618b', '3f915b2769fc80648e92d04e84ca059d', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('44b5a73541bcb854dd5d38c6d1fb93a1', 'ee8626f80f7c2619917b6236f3a7f02b', '418964ba087b90a84897b62474496b93', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('4d56ce2f67c94b74a1d3abdbea340e42', 'ee8626f80f7c2619917b6236f3a7f02b', 'd86f58e7ab516d3bc6bfb1fe10585f97', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('4faad8ff93cb2b5607cd3d07c1b624ee', 'a799c3b1b12dd3ed4bd046bfaef5fe6e', '70b8f33da5f39de1981bf89cf6c99792', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('57c0b3a547b815ea3ec8e509b08948b3', '1750a8fb3e6d90cb7957c02de1dc8e59', '3f915b2769fc80648e92d04e84ca059d', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('593ee05c4fe4645c7826b7d5e14f23ec', '52b0cf022ac4187b2a70dfa4f8b2d940', '8fb8172747a78756c11916216b8b8066', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('5affc85021fcba07d81c09a6fdfa8dc6', 'ee8626f80f7c2619917b6236f3a7f02b', '078f9558cdeab239aecb2bda1a8ed0d1', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('5fc194b709336d354640fe29fefd65a3', 'a799c3b1b12dd3ed4bd046bfaef5fe6e', '9ba60e626bf2882c31c488aba62b89f0', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('6451dac67ba4acafb570fd6a03f47460', 'ee8626f80f7c2619917b6236f3a7f02b', 'e3c13679c73a4f829bcff2aba8fd68b1', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('6c43fd3f10fdaf2a0646434ae68709b5', 'ee8626f80f7c2619917b6236f3a7f02b', '540a2936940846cb98114ffb0d145cb8', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('71a5f54a90aa8c7a250a38b7dba39f6f', 'ee8626f80f7c2619917b6236f3a7f02b', '8fb8172747a78756c11916216b8b8066', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('75002588591820806', '16457350655250432', '5129710648430592', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('75002588604403712', '16457350655250432', '5129710648430593', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('75002588612792320', '16457350655250432', '40238597734928384', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('75002588625375232', '16457350655250432', '57009744761589760', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('75002588633763840', '16457350655250432', '16392452747300864', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('75002588637958144', '16457350655250432', '16392767785668608', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('75002588650541056', '16457350655250432', '16439068543946752', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277779875336192', '496138616573952', '5129710648430592', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780043108352', '496138616573952', '5129710648430593', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780055691264', '496138616573952', '15701400130424832', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780064079872', '496138616573952', '16678126574637056', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780072468480', '496138616573952', '15701915807518720', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780076662784', '496138616573952', '15708892205944832', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780085051392', '496138616573952', '16678447719911424', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780089245696', '496138616573952', '25014528525733888', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780097634304', '496138616573952', '56898976661639168', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780135383040', '496138616573952', '40238597734928384', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780139577344', '496138616573952', '45235621697949696', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780147965952', '496138616573952', '45235787867885568', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780156354560', '496138616573952', '45235939278065664', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780164743168', '496138616573952', '43117268627886080', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780168937472', '496138616573952', '45236734832676864', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780181520384', '496138616573952', '45237010692050944', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780189908992', '496138616573952', '45237170029465600', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780198297600', '496138616573952', '57009544286441472', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780206686208', '496138616573952', '57009744761589760', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780215074816', '496138616573952', '57009981228060672', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780219269120', '496138616573952', '56309618086776832', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780227657728', '496138616573952', '57212882168844288', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780236046336', '496138616573952', '61560041605435392', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780244434944', '496138616573952', '61560275261722624', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780257017856', '496138616573952', '61560480518377472', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780265406464', '496138616573952', '44986029924421632', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780324126720', '496138616573952', '45235228800716800', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780332515328', '496138616573952', '45069342940860416', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780340903937', '496138616573952', '5129710648430594', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780349292544', '496138616573952', '16687383932047360', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780357681152', '496138616573952', '16689632049631232', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780366069760', '496138616573952', '16689745006432256', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780370264064', '496138616573952', '16689883993083904', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780374458369', '496138616573952', '16690313745666048', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780387041280', '496138616573952', '5129710648430595', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780395429888', '496138616573952', '16694861252005888', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780403818496', '496138616573952', '16695107491205120', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780412207104', '496138616573952', '16695243126607872', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780420595712', '496138616573952', '75002207560273920', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780428984320', '496138616573952', '76215889006956544', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780433178624', '496138616573952', '76216071333351424', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780441567232', '496138616573952', '76216264070008832', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780449955840', '496138616573952', '76216459709124608', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780458344448', '496138616573952', '76216594207870976', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780466733056', '496138616573952', '76216702639017984', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780475121664', '496138616573952', '58480609315524608', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780483510272', '496138616573952', '61394706252173312', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780491898880', '496138616573952', '61417744146370560', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780496093184', '496138616573952', '76606430504816640', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780504481792', '496138616573952', '76914082455752704', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780508676097', '496138616573952', '76607201262702592', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780517064704', '496138616573952', '39915540965232640', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780525453312', '496138616573952', '41370251991977984', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780538036224', '496138616573952', '45264987354042368', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780546424832', '496138616573952', '45265487029866496', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780554813440', '496138616573952', '45265762415284224', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780559007744', '496138616573952', '45265886315024384', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780567396352', '496138616573952', '45266070000373760', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780571590656', '496138616573952', '41363147411427328', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780579979264', '496138616573952', '41363537456533504', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780588367872', '496138616573952', '41364927394353152', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780596756480', '496138616573952', '41371711400054784', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780605145088', '496138616573952', '41469219249852416', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780613533696', '496138616573952', '39916171171991552', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780621922304', '496138616573952', '39918482854252544', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780630310912', '496138616573952', '41373430515240960', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780718391296', '496138616573952', '41375330996326400', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780722585600', '496138616573952', '63741744973352960', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780730974208', '496138616573952', '42082442672082944', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780739362816', '496138616573952', '41376192166629376', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780747751424', '496138616573952', '41377034236071936', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780756140032', '496138616573952', '56911328312299520', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780764528640', '496138616573952', '41378916912336896', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780768722944', '496138616573952', '63482475359244288', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780772917249', '496138616573952', '64290663792906240', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780785500160', '496138616573952', '66790433014943744', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780789694464', '496138616573952', '42087054753927168', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780798083072', '496138616573952', '67027338952445952', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780806471680', '496138616573952', '67027909637836800', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780810665985', '496138616573952', '67042515441684480', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780823248896', '496138616573952', '67082402312228864', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780827443200', '496138616573952', '16392452747300864', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780835831808', '496138616573952', '16392767785668608', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780840026112', '496138616573952', '16438800255291392', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780844220417', '496138616573952', '16438962738434048', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277780852609024', '496138616573952', '16439068543946752', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860062040064', '496138616573953', '5129710648430592', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860070428672', '496138616573953', '5129710648430593', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860078817280', '496138616573953', '40238597734928384', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860091400192', '496138616573953', '43117268627886080', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860099788800', '496138616573953', '57009744761589760', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860112371712', '496138616573953', '56309618086776832', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860120760320', '496138616573953', '44986029924421632', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860129148928', '496138616573953', '5129710648430594', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860141731840', '496138616573953', '5129710648430595', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860150120448', '496138616573953', '75002207560273920', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860158509056', '496138616573953', '58480609315524608', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860162703360', '496138616573953', '76606430504816640', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860171091968', '496138616573953', '76914082455752704', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860179480576', '496138616573953', '76607201262702592', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860187869184', '496138616573953', '39915540965232640', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860196257792', '496138616573953', '41370251991977984', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860204646400', '496138616573953', '41363147411427328', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860208840704', '496138616573953', '41371711400054784', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860213035009', '496138616573953', '39916171171991552', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860221423616', '496138616573953', '39918482854252544', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860225617920', '496138616573953', '41373430515240960', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860234006528', '496138616573953', '41375330996326400', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860242395136', '496138616573953', '63741744973352960', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860250783744', '496138616573953', '42082442672082944', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860254978048', '496138616573953', '41376192166629376', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860263366656', '496138616573953', '41377034236071936', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860271755264', '496138616573953', '56911328312299520', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860313698304', '496138616573953', '41378916912336896', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860322086912', '496138616573953', '63482475359244288', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860326281216', '496138616573953', '64290663792906240', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860334669824', '496138616573953', '66790433014943744', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860343058432', '496138616573953', '42087054753927168', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860347252736', '496138616573953', '67027338952445952', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860351447041', '496138616573953', '67027909637836800', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860359835648', '496138616573953', '67042515441684480', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860364029952', '496138616573953', '67082402312228864', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860368224256', '496138616573953', '16392452747300864', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860372418560', '496138616573953', '16392767785668608', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860376612865', '496138616573953', '16438800255291392', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860385001472', '496138616573953', '16438962738434048', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('77277860389195776', '496138616573953', '16439068543946752', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('7750f9be48ee09cd561fce718219a3e2', 'ee8626f80f7c2619917b6236f3a7f02b', '882a73768cfd7f78f3a37584f7299656', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('7a5d31ba48fe3fb1266bf186dc5f7ba7', '52b0cf022ac4187b2a70dfa4f8b2d940', '58857ff846e61794c69208e9d3a85466', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('7d2ea745950be3357747ec7750c31c57', 'ee8626f80f7c2619917b6236f3a7f02b', '2a470fc0c3954d9dbb61de6d80846549', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('7de42bdc0b8c5446b7d428c66a7abc12', '52b0cf022ac4187b2a70dfa4f8b2d940', '54dd5457a3190740005c1bfec55b1c34', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('7e19d90cec0dd87aaef351b9ff8f4902', '646c628b2b8295fbdab2d34044de0354', 'f9d3f4f27653a71c52faa9fb8070fbe7', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('83f704524b21b6a3ae324b8736c65333', 'ee8626f80f7c2619917b6236f3a7f02b', '7ac9eb9ccbde2f7a033cd4944272bf1e', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('84d32474316a43b01256d6644e6e7751', 'ee8626f80f7c2619917b6236f3a7f02b', 'ec8d607d0156e198b11853760319c646', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('8703a2410cddb713c33232ce16ec04b9', 'ee8626f80f7c2619917b6236f3a7f02b', '1367a93f2c410b169faa7abcbad2f77c', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('885c1a827383e5b2c6c4f8ca72a7b493', 'ee8626f80f7c2619917b6236f3a7f02b', '4148ec82b6acd69f470bea75fe41c357', '', NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('8a60df8d8b4c9ee5fa63f48aeee3ec00', '1750a8fb3e6d90cb7957c02de1dc8e59', 'd7d6e2e4e2934f2c9385a623fd98c6f3', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('8b1e326791375f325d3e6b797753b65e', 'ee8626f80f7c2619917b6236f3a7f02b', '2dbbafa22cda07fa5d169d741b81fe12', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('8ce1022dac4e558ff9694600515cf510', '1750a8fb3e6d90cb7957c02de1dc8e59', '08e6b9dc3c04489c8e1ff2ce6f105aa4', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('8d848ca7feec5b7ebb3ecb32b2c8857a', '52b0cf022ac4187b2a70dfa4f8b2d940', '4148ec82b6acd69f470bea75fe41c357', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('8eec2c510f1ac9c5eee26c041b1f00ca', 'ee8626f80f7c2619917b6236f3a7f02b', '58857ff846e61794c69208e9d3a85466', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('903b790e6090414343502c6dc393b7c9', 'ee8626f80f7c2619917b6236f3a7f02b', 'de13e0f6328c069748de7399fcc1dbbd', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('90996d56357730e173e636b99fc48bea', 'ee8626f80f7c2619917b6236f3a7f02b', 'fb07ca05a3e13674dbf6d3245956da2e', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('90e1c607a0631364eec310f3cc4acebd', 'ee8626f80f7c2619917b6236f3a7f02b', '4f66409ef3bbd69c1d80469d6e2a885e', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('9264104cee9b10c96241d527b2d0346d', '1750a8fb3e6d90cb7957c02de1dc8e59', '54dd5457a3190740005c1bfec55b1c34', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('980171fda43adfe24840959b1d048d4d', 'f6817f48af4fb3af11b9e8bf182f618b', 'd7d6e2e4e2934f2c9385a623fd98c6f3', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('98f02353f91dd569e3c6b8fd6b4f4034', 'ee8626f80f7c2619917b6236f3a7f02b', '6531cf3421b1265aeeeabaab5e176e6d', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('9d8772c310b675ae43eacdbc6c7fa04a', 'a799c3b1b12dd3ed4bd046bfaef5fe6e', '1663f3faba244d16c94552f849627d84', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('9f8311ecccd44e079723098cf2ffe1cc', '1750a8fb3e6d90cb7957c02de1dc8e59', '693ce69af3432bd00be13c3971a57961', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('a098e2acc3f90316f161f6648d085640', 'ee8626f80f7c2619917b6236f3a7f02b', 'e6bfd1fcabfd7942fdd05f076d1dad38', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('a66feaaf128417ad762e946abccf27ec', 'ee8626f80f7c2619917b6236f3a7f02b', 'c6cf95444d80435eb37b2f9db3971ae6', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('a7ab87eac0f8fafa2efa4b1f9351923f', 'ee8626f80f7c2619917b6236f3a7f02b', 'fedfbf4420536cacc0218557d263dfea', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('abdc324a2df9f13ee6e73d44c6e62bc8', 'ee8626f80f7c2619917b6236f3a7f02b', 'f1cb187abf927c88b89470d08615f5ac', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('aefc8c22e061171806e59cd222f6b7e1', '52b0cf022ac4187b2a70dfa4f8b2d940', 'e8af452d8948ea49d37c934f5100ae6a', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('b131ebeafcfd059f3c7e542606ea9ff5', 'ee8626f80f7c2619917b6236f3a7f02b', 'e5973686ed495c379d829ea8b2881fc6', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('b2b2dcfff6986d3d7f890ea62d474651', 'ee8626f80f7c2619917b6236f3a7f02b', '200006f0edf145a2b50eacca07585451', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('b495a46fa0e0d4637abe0db7fd12fe1a', 'ee8626f80f7c2619917b6236f3a7f02b', '717f6bee46f44a3897eca9abd6e2ec44', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('d37ad568e26f46ed0feca227aa9c2ffa', 'f6817f48af4fb3af11b9e8bf182f618b', '9502685863ab87f0ad1134142788a385', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('d3fe195d59811531c05d31d8436f5c8b', '1750a8fb3e6d90cb7957c02de1dc8e59', 'e8af452d8948ea49d37c934f5100ae6a', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('e258ca8bf7ee168b93bfee739668eb15', 'ee8626f80f7c2619917b6236f3a7f02b', 'fb367426764077dcf94640c843733985', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('e339f7db7418a4fd2bd2c113f1182186', 'ee8626f80f7c2619917b6236f3a7f02b', 'b1cb0a3fedf7ed0e4653cb5a229837ee', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('e3e922673f4289b18366bb51b6200f17', '52b0cf022ac4187b2a70dfa4f8b2d940', '45c966826eeff4c99b8f8ebfe74511fc', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('eb19ea10f5d311f0abad00155d056b00', '1600076470335246337', '2012375501376606210', NULL, '2026-01-20 15:43:24', '127.0.0.16');\nINSERT INTO `sys_role_permission` VALUES ('eb1a1415f5d311f0abad00155d056b00', '1600076470335246337', '2012376076054974466', NULL, '2026-01-20 15:43:24', '127.0.0.17');\nINSERT INTO `sys_role_permission` VALUES ('eb1a381bf5d311f0abad00155d056b00', '1600076470335246337', '1996422809213341698', NULL, '2026-01-20 15:43:24', '127.0.0.17');\nINSERT INTO `sys_role_permission` VALUES ('ecdd72fe694e6bba9c1d9fc925ee79de', 'f6817f48af4fb3af11b9e8bf182f618b', '45c966826eeff4c99b8f8ebfe74511fc', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('f17ab8ad1e71341140857ef4914ef297', '21c5a3187763729408b40afb0d0fdfa8', '732d48f8e0abe99fe6a23d18a3171cd1', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('fd86f6b08eb683720ba499f9d9421726', 'ee8626f80f7c2619917b6236f3a7f02b', '693ce69af3432bd00be13c3971a57961', NULL, NULL, NULL);\nINSERT INTO `sys_role_permission` VALUES ('fed41a4671285efb266cd404f24dd378', '52b0cf022ac4187b2a70dfa4f8b2d940', '00a2a0ae65cdca5e93209cdbde97cbe6', NULL, NULL, NULL);\n\n-- ----------------------------\n-- Table structure for sys_sms\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_sms`;\nCREATE TABLE `sys_sms`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'ID',\n  `es_title` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '消息标题',\n  `es_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '发送方式：参考枚举MessageTypeEnum',\n  `es_receiver` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '接收人',\n  `es_param` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '发送所需参数Json格式',\n  `es_content` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '推送内容',\n  `es_send_time` datetime NULL DEFAULT NULL COMMENT '推送时间',\n  `es_send_status` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '推送状态 0未推送 1推送成功 2推送失败 -1失败不再发送',\n  `es_send_num` int(11) NULL DEFAULT NULL COMMENT '发送次数 超过5次不再发送',\n  `es_result` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '推送失败原因',\n  `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_ss_es_type`(`es_type`) USING BTREE,\n  INDEX `idx_ss_es_receiver`(`es_receiver`) USING BTREE,\n  INDEX `idx_ss_es_send_time`(`es_send_time`) USING BTREE,\n  INDEX `idx_ss_es_send_status`(`es_send_status`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_sms\n-- ----------------------------\nINSERT INTO `sys_sms` VALUES ('402880e74dc2f361014dc2f8411e0001', '消息推送测试333', '2', '411944058@qq.com', NULL, '张三你好，你的订单4028d881436d514601436d521ae80165已付款!', '2015-06-05 17:06:01', '3', NULL, NULL, '认证失败错误的用户名或者密码', 'admin', '2015-06-05 17:05:59', 'admin', '2015-11-19 22:30:39');\nINSERT INTO `sys_sms` VALUES ('402880ea533647b00153364e74770001', '发个问候', '3', 'admin', NULL, '你好', '2016-03-02 00:00:00', '2', NULL, NULL, NULL, 'admin', '2016-03-02 15:50:24', 'admin', '2018-07-05 19:53:01');\nINSERT INTO `sys_sms` VALUES ('402880ee5a17e711015a17f3188e013f', '消息推送测试333', '2', '411944058@qq.com', NULL, '张三你好，你的订单4028d881436d514601436d521ae80165已付款!', NULL, '2', NULL, NULL, NULL, 'admin', '2017-02-07 17:41:31', 'admin', '2017-03-10 11:37:05');\nINSERT INTO `sys_sms` VALUES ('402880f05ab649b4015ab64b9cd80012', '消息推送测试333', '2', '411944058@qq.com', NULL, '张三你好，你的订单4028d881436d514601436d521ae80165已付款!', '2017-11-16 15:58:15', '3', NULL, NULL, NULL, 'admin', '2017-03-10 11:38:13', 'admin', '2017-07-31 17:24:54');\nINSERT INTO `sys_sms` VALUES ('402880f05ab7b035015ab7c4462c0004', '消息推送测试333', '2', '411944058@qq.com', NULL, '张三你好，你的订单4028d881436d514601436d521ae80165已付款!', '2017-11-16 15:58:15', '3', NULL, NULL, NULL, 'admin', '2017-03-10 18:29:37', NULL, NULL);\nINSERT INTO `sys_sms` VALUES ('402881f3646a472b01646a4a5af00001', '催办：HR审批', '3', 'admin', NULL, 'admin，您好！\\r\\n请前待办任务办理事项！HR审批\\r\\n\\r\\n\\r\\n===========================\\r\\n此消息由系统发出', '2018-07-05 19:53:35', '2', NULL, NULL, NULL, 'admin', '2018-07-05 19:53:35', 'admin', '2018-07-07 13:45:24');\nINSERT INTO `sys_sms` VALUES ('402881f3647da06c01647da43a940014', '催办：HR审批', '3', 'admin', NULL, 'admin，您好！\\r\\n请前待办任务办理事项！HR审批\\r\\n\\r\\n\\r\\n===========================\\r\\n此消息由系统发出', '2018-07-09 14:04:32', '2', NULL, NULL, NULL, 'admin', '2018-07-09 14:04:32', 'admin', '2018-07-09 18:51:30');\n\n-- ----------------------------\n-- Table structure for sys_sms_template\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_sms_template`;\nCREATE TABLE `sys_sms_template`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',\n  `template_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '模板标题',\n  `template_code` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '模板CODE',\n  `template_type` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '模板类型：1短信 2邮件 3微信',\n  `template_category` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '模版分类：notice通知公告 other其他',\n  `template_content` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '模板内容',\n  `template_test_json` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '模板测试json',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称',\n  `use_status` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否使用中 1是0否',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uk_sst_template_code`(`template_code`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_sms_template\n-- ----------------------------\nINSERT INTO `sys_sms_template` VALUES ('1199606397416775681', '系统消息通知', 'sys_ts_note', '2', NULL, '<h1>&nbsp; &nbsp; 系统通知</h1>\\n<ul>\\n<li>通知时间：&nbsp; ${ts_date}</li>\\n<li>通知内容：&nbsp; ${ts_content}</li>\\n</ul>', NULL, '2019-11-27 16:30:27', 'admin', '2019-11-27 19:36:50', 'admin', NULL);\nINSERT INTO `sys_sms_template` VALUES ('1199615897335095298', '流程催办', 'bpm_cuiban', '2', NULL, '<h1>&nbsp; &nbsp;流程催办提醒</h1>\\n<ul>\\n<li>流程名称：&nbsp; ${bpm_name}</li>\\n<li>催办任务：&nbsp; ${bpm_task}</li>\\n<li>催办时间 :&nbsp; &nbsp; ${datetime}</li>\\n<li>催办内容 :&nbsp; &nbsp; ${remark}</li>\\n</ul>', NULL, '2019-11-27 17:08:12', 'admin', '2019-11-27 19:36:45', 'admin', NULL);\nINSERT INTO `sys_sms_template` VALUES ('1199648914107625473', '流程办理超时提醒', 'bpm_chaoshi_tip', '2', NULL, '<h1>&nbsp; &nbsp;流程办理超时提醒</h1>\\n<ul>\\n<li>&nbsp; &nbsp;超时提醒信息：&nbsp; &nbsp; 您有待处理的超时任务，请尽快处理！</li>\\n<li>&nbsp; &nbsp;超时任务标题：&nbsp; &nbsp; ${title}</li>\\n<li>&nbsp; &nbsp;超时任务节点：&nbsp; &nbsp; ${task}</li>\\n<li>&nbsp; &nbsp;任务处理人：&nbsp; &nbsp; &nbsp; &nbsp;${user}</li>\\n<li>&nbsp; &nbsp;任务开始时间：&nbsp; &nbsp; ${time}</li>\\n</ul>', NULL, '2019-11-27 19:19:24', 'admin', '2019-11-27 19:36:37', 'admin', NULL);\nINSERT INTO `sys_sms_template` VALUES ('4028608164691b000164693108140003', '催办：${taskName}', 'SYS001', '1', NULL, '${userName}，您好！\\r\\n请前待办任务办理事项！${taskName}\\r\\n\\r\\n\\r\\n===========================\\r\\n此消息由系统发出', '{\\r\\n\\\"taskName\\\":\\\"HR审批\\\",\\r\\n\\\"userName\\\":\\\"admin\\\"\\r\\n}', '2018-07-05 14:46:18', 'admin', '2018-07-05 18:31:34', 'admin', NULL);\n\n-- ----------------------------\n-- Table structure for sys_table_white_list\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_table_white_list`;\nCREATE TABLE `sys_table_white_list`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键id',\n  `table_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '允许的表名',\n  `field_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '允许的字段名，多个用逗号分割',\n  `status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '1' COMMENT '状态，1=启用，0=禁用',\n  `create_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uniq_sys_table_white_list_table_name`(`table_name`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统表白名单' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_table_white_list\n-- ----------------------------\nINSERT INTO `sys_table_white_list` VALUES ('1701578033271521282', 'sys_user', 'phone,work_no,id,email,realname,username', '1', 'admin', '2023-09-12 10:46:32', 'admin', '2023-12-31 16:55:30');\nINSERT INTO `sys_table_white_list` VALUES ('1701581935488385025', 'oa_officialdoc_organcode', 'id,organ_name', '1', 'admin', '2023-09-12 11:02:02', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1701581977733414913', 'demo', 'id,name', '1', 'admin', '2023-09-12 11:02:12', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1701582035472203777', 'sys_permission', 'id,name', '1', 'admin', '2023-09-12 11:02:26', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1701582087619985409', 'onl_drag_comp', 'id,comp_name', '1', 'admin', '2023-09-12 11:02:38', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1701582136420712450', 'sys_depart', 'id,org_code,depart_name', '1', 'admin', '2023-09-12 11:02:50', 'admin', '2023-10-18 09:36:40');\nINSERT INTO `sys_table_white_list` VALUES ('1701582163599802370', 'design_form', 'id,desform_name,desform_code', '1', 'admin', '2023-09-12 11:02:56', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1701582190187495426', 'onl_cgform_head', 'table_txt,table_name', '1', 'admin', '2023-09-12 11:03:03', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1701582254301626370', 'oa_wps_file', 'id,name', '1', 'admin', '2023-09-12 11:03:18', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1714453996678926338', 'onl_cgreport_head', 'code', '1', 'admin', '2023-10-18 09:31:00', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1714455418728337410', 'sys_category', 'id,name', '1', 'admin', '2023-10-18 09:36:40', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1714471625900564482', 'sys_position', 'name,id', '1', 'ceshi', '2023-10-18 10:41:04', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1769610154632491009', 'sys_dict', 'dict_code', '1', 'admin', '2024-03-18 14:21:53', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1778692300030484482', 'test_shoptype_tree', 'type_name,id', '1', 'admin', '2024-04-12 15:51:05', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1782650226206269441', 'sys_tenant', 'name,id', '1', 'admin', '2024-04-23 13:58:29', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1800712552062898178', 'tj_user_report', 'name,username', '1', 'admin', '2024-06-12 10:11:43', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1801076145102925826', 'sys_data_source', 'code,name', '1', 'admin', '2024-06-13 10:16:30', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1801097090085564420', 'sys_role', 'role_name,role_code', '1', 'jeecg', '2024-06-13 11:39:44', 'admin', '2024-09-10 11:47:35');\nINSERT INTO `sys_table_white_list` VALUES ('1805416360756006913', 'wu_liao', 'wul_name,id', '1', 'admin', '2024-06-25 09:42:58', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1897919397122269185', 'ces_shop_type', 'name,pid,id,has_child', '1', 'admin', '2025-03-07 15:57:01', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1907407400953659394', 'airag_flow', 'name,id', '1', 'admin', '2025-04-02 20:18:57', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1907407401083682817', 'airag_model', 'name,id', '1', 'admin', '2025-04-02 20:18:57', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1950438522834546690', 'sys_sms_template', 'template_code', '1', 'admin', '2025-07-30 14:09:16', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1966817706103730178', 'sys_check_rule', 'rule_code', '1', 'admin', '2025-09-13 18:54:17', NULL, NULL);\nINSERT INTO `sys_table_white_list` VALUES ('1993972426358153217', 'airag_knowledge', 'name,id', '1', 'admin', '2025-11-27 17:17:27', NULL, NULL);\n\n-- ----------------------------\n-- Table structure for sys_tenant\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_tenant`;\nCREATE TABLE `sys_tenant`  (\n  `id` int(10) NOT NULL COMMENT '租户编码',\n  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '租户名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `create_by` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `begin_date` datetime NULL DEFAULT NULL COMMENT '开始时间',\n  `end_date` datetime NULL DEFAULT NULL COMMENT '结束时间',\n  `status` int(1) NULL DEFAULT NULL COMMENT '状态 1正常 0冻结',\n  `trade` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属行业',\n  `company_size` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '公司规模',\n  `company_address` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '公司地址',\n  `company_logo` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '公司logo',\n  `house_number` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '门牌号',\n  `work_place` varchar(100) CHARACTER SET utf32 COLLATE utf32_general_ci NULL DEFAULT NULL COMMENT '工作地点',\n  `secondary_domain` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '二级域名',\n  `login_bkgd_img` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录背景图片',\n  `position` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '职级',\n  `department` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门',\n  `del_flag` tinyint(1) NULL DEFAULT 0 COMMENT '删除状态(0-正常,1-已删除)',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  `apply_status` int(3) NULL DEFAULT NULL COMMENT '允许申请管理员 1允许 0不允许',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '多租户信息表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_tenant\n-- ----------------------------\nINSERT INTO `sys_tenant` VALUES (1000, '北京国炬信息技术有限公司', '2023-03-09 19:55:11', 'jeecg', NULL, NULL, 1, NULL, NULL, NULL, 'temp/国炬软件logo_1764069407429.png', '2PI3U6', NULL, NULL, NULL, NULL, NULL, 0, 'admin', '2025-11-25 19:16:47', NULL);\nINSERT INTO `sys_tenant` VALUES (1001, '北京敲敲云科技有限公司', '2023-10-18 13:37:19', 'ceshi', NULL, NULL, 1, NULL, NULL, NULL, '', 'EX33W8', NULL, NULL, NULL, NULL, NULL, 0, 'admin', '2024-03-18 11:19:28', NULL);\n\n-- ----------------------------\n-- Table structure for sys_tenant_pack\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_tenant_pack`;\nCREATE TABLE `sys_tenant_pack`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键id',\n  `tenant_id` int(10) NULL DEFAULT NULL COMMENT '租户id',\n  `pack_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '产品包名',\n  `status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '开启状态(0 未开启 1开启)',\n  `remarks` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` date NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` date NULL DEFAULT NULL COMMENT '更新时间',\n  `pack_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码,默认添加的三个管理员需要设置编码',\n  `pack_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'custom' COMMENT '产品包类型(default 默认产品包 custom 自定义产品包)',\n  `iz_sysn` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '自动分配给用户(0否 1是)',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx__stp_tenant_id_pack_code`(`tenant_id`, `pack_code`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '租户产品包' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_tenant_pack\n-- ----------------------------\nINSERT INTO `sys_tenant_pack` VALUES ('1714517098074152962', 0, '默认套餐', '1', NULL, 'ceshi', '2023-10-18', 'admin', '2025-08-12', NULL, 'default', NULL);\nINSERT INTO `sys_tenant_pack` VALUES ('1955184115322142722', 1000, '默认套餐', '1', NULL, 'ceshi', '2023-10-18', 'admin', '2025-08-12', NULL, 'custom', NULL);\nINSERT INTO `sys_tenant_pack` VALUES ('1955187901394534401', 1000, '升级企业套餐', '1', NULL, 'admin', '2025-08-12', 'admin', '2025-08-12', NULL, 'custom', NULL);\nINSERT INTO `sys_tenant_pack` VALUES ('1955222289125720066', 1001, '默认套餐', '1', NULL, 'ceshi', '2023-10-18', 'admin', '2025-08-12', NULL, 'custom', NULL);\n\n-- ----------------------------\n-- Table structure for sys_tenant_pack_perms\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_tenant_pack_perms`;\nCREATE TABLE `sys_tenant_pack_perms`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键编号',\n  `pack_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '租户产品包名称',\n  `permission_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单id',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` date NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` date NULL DEFAULT NULL COMMENT '更新时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_stpp_pack_id`(`pack_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '租户产品包和菜单关系表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_tenant_pack_perms\n-- ----------------------------\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955183422662197249', '1714517098074152962', '1438108225451974658', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955184115389251585', '1955184115322142722', '1438108225451974658', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955187901482614785', '1955187901394534401', '1438108176273760258', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955187901503586305', '1955187901394534401', '1438108176814825473', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955187901516169218', '1955187901394534401', '1620709334357532673', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955187901528752129', '1955187901394534401', '9502685863ab87f0ad1134142788a385', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955195388533358593', '1955187901394534401', '1438108187455774722', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955195388600467458', '1955187901394534401', '1438108178911977473', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955195388659187713', '1955187901394534401', '1438108183395688450', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955195509216067585', '1955187901394534401', '1439398677984878593', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955195509216067586', '1955187901394534401', '1438108225451974658', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955195623284359170', '1955187901394534401', '1443390062919208961', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955195663855861761', '1955187901394534401', '1438108183492157442', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955195717383569409', '1955187901394534401', '119213522910765570', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955221560482840577', '1714517098074152962', '1438108176273760258', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955221560617058305', '1714517098074152962', '9502685863ab87f0ad1134142788a385', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955221560617058306', '1714517098074152962', '1620709334357532673', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955221560617058307', '1714517098074152962', '1438108176814825473', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955222179079766017', '1714517098074152962', '1438108187455774722', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955222179146874881', '1714517098074152962', '1438108178911977473', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955222289125720067', '1955222289125720066', '1438108225451974658', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955222289125720068', '1955222289125720066', '1438108176273760258', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955222289125720069', '1955222289125720066', '9502685863ab87f0ad1134142788a385', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955222289125720070', '1955222289125720066', '1620709334357532673', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955222289125720071', '1955222289125720066', '1438108176814825473', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955222289188634625', '1955222289125720066', '1438108187455774722', 'admin', '2025-08-12', NULL, NULL);\nINSERT INTO `sys_tenant_pack_perms` VALUES ('1955222289188634626', '1955222289125720066', '1438108178911977473', 'admin', '2025-08-12', NULL, NULL);\n\n-- ----------------------------\n-- Table structure for sys_tenant_pack_user\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_tenant_pack_user`;\nCREATE TABLE `sys_tenant_pack_user`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `pack_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '租户产品包ID',\n  `user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户ID',\n  `tenant_id` int(10) NULL DEFAULT NULL COMMENT '租户ID',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  `status` int(3) NULL DEFAULT NULL COMMENT '状态 正常状态1 申请状态0',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_tpu_pack_id`(`pack_id`) USING BTREE,\n  INDEX `idx_tpu_user_id`(`user_id`) USING BTREE,\n  INDEX `idx_tpu_tenant_id`(`tenant_id`) USING BTREE,\n  INDEX `idx_tpu_status`(`status`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '租户套餐人员表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_tenant_pack_user\n-- ----------------------------\nINSERT INTO `sys_tenant_pack_user` VALUES ('1633795234318729217', '1633795213938606082', 'a75d45a015c44384a04449ee80dc3503', 1, 'admin', '2023-03-09 19:41:53', NULL, NULL, 1);\nINSERT INTO `sys_tenant_pack_user` VALUES ('1955184602037567490', '1955184115322142722', '1955183658394664962', 1000, 'admin', '2025-08-12 16:28:29', NULL, NULL, 1);\nINSERT INTO `sys_tenant_pack_user` VALUES ('1955187972634787841', '1955187901394534401', '1955183658394664962', 1000, 'admin', '2025-08-12 16:41:53', NULL, NULL, 1);\nINSERT INTO `sys_tenant_pack_user` VALUES ('1955222312760623107', '1955222289125720066', '1955218082645544962', 1001, 'admin', '2025-08-12 18:58:20', NULL, NULL, 1);\n\n-- ----------------------------\n-- Table structure for sys_third_account\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_third_account`;\nCREATE TABLE `sys_third_account`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '编号',\n  `sys_user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方登录id',\n  `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '头像',\n  `status` tinyint(1) NULL DEFAULT NULL COMMENT '状态(1-正常,2-冻结)',\n  `del_flag` tinyint(1) NULL DEFAULT NULL COMMENT '删除状态(0-正常,1-已删除)',\n  `realname` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '真实姓名',\n  `tenant_id` int(10) NULL DEFAULT 0 COMMENT '租户id',\n  `third_user_uuid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方账号',\n  `third_user_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方app用户账号',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `third_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录来源',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uniq_stat_third_type_user_id`(`third_type`, `third_user_id`) USING BTREE,\n  UNIQUE INDEX `uniq_sta_third_user_id_third_type`(`third_user_id`, `third_type`, `tenant_id`) USING BTREE,\n  UNIQUE INDEX `uniq_sta_third_user_uuid_third_type`(`third_user_uuid`, `third_type`, `tenant_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_third_account\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for sys_third_app_config\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_third_app_config`;\nCREATE TABLE `sys_third_app_config`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `tenant_id` int(10) NOT NULL DEFAULT 0 COMMENT '租户id',\n  `agent_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '钉钉/企业微信应用id',\n  `client_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '钉钉/企业微信 应用id',\n  `client_secret` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '钉钉/企业微信应用id对应的秘钥',\n  `corp_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '钉钉企业id',\n  `third_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第三方类别(dingtalk 钉钉 wechat_enterprise 企业微信)',\n  `status` int(1) NULL DEFAULT 1 COMMENT '是否启用(0-否,1-是)',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_stac_tenant_id`(`tenant_id`) USING BTREE,\n  INDEX `idx_stac_third_type`(`third_type`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '租户第三方配置表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_third_app_config\n-- ----------------------------\nINSERT INTO `sys_third_app_config` VALUES ('1714477134884085762', 0, '1', '1', '1', NULL, 'dingtalk', 1, '2023-10-18 11:02:57', NULL);\n\n-- ----------------------------\n-- Table structure for sys_user\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_user`;\nCREATE TABLE `sys_user`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id',\n  `username` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录账号',\n  `realname` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '真实姓名',\n  `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',\n  `salt` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'md5密码盐',\n  `avatar` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '头像',\n  `birthday` date NULL DEFAULT NULL COMMENT '生日',\n  `sex` tinyint(1) NULL DEFAULT NULL COMMENT '性别(0-默认未知,1-男,2-女)',\n  `email` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '电子邮件',\n  `phone` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '电话',\n  `org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录会话的机构编码',\n  `status` tinyint(1) NULL DEFAULT NULL COMMENT '性别(1-正常,2-冻结)',\n  `del_flag` tinyint(1) NULL DEFAULT NULL COMMENT '删除状态(0-正常,1-已删除)',\n  `third_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '第三方登录的唯一标识',\n  `third_type` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '第三方类型',\n  `activiti_sync` tinyint(1) NULL DEFAULT NULL COMMENT '同步工作流引擎(1-同步,0-不同步)',\n  `work_no` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '工号，唯一键',\n  `telephone` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '座机号',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  `user_identity` tinyint(1) NULL DEFAULT NULL COMMENT '身份（1普通成员 2上级）',\n  `depart_ids` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '负责部门',\n  `client_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '设备ID',\n  `login_tenant_id` int(11) NULL DEFAULT NULL COMMENT '上次登录选择租户ID',\n  `bpm_status` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程入职离职状态',\n  `sign_enable` tinyint(1) NULL DEFAULT NULL COMMENT '是否启用个性签名（0 否 1是）',\n  `sign` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '个性签名',\n  `main_dep_post_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '主岗位（部门岗位id）',\n  `position_type` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '职务(字典)',\n  `last_pwd_update_time` datetime NULL DEFAULT NULL COMMENT '上一次修改密码的时间',\n  `sort` int(6) NULL DEFAULT NULL COMMENT '排序',\n  `iz_hide_contact` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否隐藏联系方式（0 否 1是）',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uniq_sys_user_work_no`(`work_no`) USING BTREE,\n  UNIQUE INDEX `uniq_sys_user_username`(`username`) USING BTREE,\n  UNIQUE INDEX `uniq_sys_user_phone`(`phone`) USING BTREE,\n  UNIQUE INDEX `uniq_sys_user_email`(`email`) USING BTREE,\n  INDEX `idx_su_status`(`status`) USING BTREE,\n  INDEX `idx_su_del_flag`(`del_flag`) USING BTREE,\n  INDEX `idx_su_del_username`(`username`, `del_flag`) USING BTREE,\n  INDEX `idx_su_main_dep_post_id`(`main_dep_post_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_user\n-- ----------------------------\nINSERT INTO `sys_user` VALUES ('1714471285016895490', 'ceshi', '测试用户', 'a9932bb12d2cbc5a', 'AF4vhXUz', NULL, '2024-04-11', NULL, 'winter@jeecg.org', '15201111112', NULL, 1, 0, NULL, NULL, 1, '123', NULL, 'admin', '2023-10-18 10:39:42', 'ceshi', '2025-05-08 16:11:05', 1, '', NULL, 0, NULL, NULL, NULL, NULL, NULL, '2025-11-25 15:42:34', 1000, NULL);\nINSERT INTO `sys_user` VALUES ('3d464b4ea0d2491aab8a7bde74c57e95', 'zhangsan', '张三', '02ea098224c7d0d2077c14b9a3a1ed16', 'x5xRdeKB', 'https://static.jeecg.com/temp/jmlogo_1606575041993.png', '2024-04-11', NULL, '111@1.com', '13426411111', '财务部', 1, 0, NULL, NULL, 1, '0005', NULL, 'admin', '2020-05-14 21:26:24', 'admin', '2024-04-26 13:25:37', 1, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2025-11-25 15:42:34', 1000, NULL);\nINSERT INTO `sys_user` VALUES ('a75d45a015c44384a04449ee80dc3503', 'jeecg', 'jeecg', 'eee378a1258530cb', 'mIgiYJow', 'https://static.jeecg.com/temp/国炬软件logo_1606575029126.png', NULL, 1, '418799587@qq.com', '18611788525', 'A02A01', 1, 0, NULL, NULL, 1, '00002', NULL, 'admin', '2019-02-13 16:02:36', 'admin', '2023-10-18 13:51:36', 1, '', NULL, 1001, NULL, NULL, NULL, NULL, NULL, '2025-11-25 15:42:34', 1000, NULL);\nINSERT INTO `sys_user` VALUES ('e9ca23d68d884d4ebb19d07889727dae', 'admin', '管理员', 'cb362cfeefbf3d8d', 'RCGTeGiH', 'https://static.jeecg.com/temp/国炬软件logo_1606575029126.png', '1986-02-01', 1, 'jeecg@163.com', '18611111111', 'A01A03', 1, 0, NULL, NULL, 1, '00001', NULL, NULL, '2019-06-21 17:54:10', 'admin', '2025-12-03 19:12:32', 2, '', NULL, 1000, NULL, 0, NULL, '', NULL, '2025-11-25 15:42:34', 1000, NULL);\n\n-- ----------------------------\n-- Table structure for sys_user_dep_post\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_user_dep_post`;\nCREATE TABLE `sys_user_dep_post`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',\n  `user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户id',\n  `dep_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门岗位id',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_sudp_user_id`(`user_id`) USING BTREE,\n  INDEX `idx_sudp_dep_id`(`dep_id`) USING BTREE,\n  INDEX `idx_sudp_user_dep_id`(`user_id`, `dep_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_user_dep_post\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for sys_user_depart\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_user_depart`;\nCREATE TABLE `sys_user_depart`  (\n  `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'id',\n  `user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户id',\n  `dep_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门id',\n  PRIMARY KEY (`ID`) USING BTREE,\n  UNIQUE INDEX `idx_sud_user_dep_id`(`user_id`, `dep_id`) USING BTREE,\n  INDEX `idx_sud_user_id`(`user_id`) USING BTREE,\n  INDEX `idx_sud_dep_id`(`dep_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_user_depart\n-- ----------------------------\nINSERT INTO `sys_user_depart` VALUES ('1783729121915510785', '3d464b4ea0d2491aab8a7bde74c57e95', 'a7d7e77e06c84325a40932163adcdaa6');\nINSERT INTO `sys_user_depart` VALUES ('1714519577067200514', 'a75d45a015c44384a04449ee80dc3503', 'a7d7e77e06c84325a40932163adcdaa6');\nINSERT INTO `sys_user_depart` VALUES ('1f3a0267811327b9eca86b0cc2b956f3', 'bcbe1290783a469a83ae3bd8effe15d4', '5159cde220114246b045e574adceafe9');\nINSERT INTO `sys_user_depart` VALUES ('1996175712356261891', 'e9ca23d68d884d4ebb19d07889727dae', '4f1765520d6346f9bd9c79e2479e5b12');\n\n-- ----------------------------\n-- Table structure for sys_user_position\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_user_position`;\nCREATE TABLE `sys_user_position`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',\n  `user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户id',\n  `position_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '职位id',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_sup_user_id`(`user_id`) USING BTREE,\n  INDEX `idx_sup_position_id`(`position_id`) USING BTREE,\n  INDEX `idx_sup_user_position_id`(`user_id`, `position_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_user_position\n-- ----------------------------\nINSERT INTO `sys_user_position` VALUES ('1920390985293144065', '1714471285016895490', '1185040064792571906', 'ceshi', '2025-05-08 16:11:05', NULL, NULL);\n\n-- ----------------------------\n-- Table structure for sys_user_role\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_user_role`;\nCREATE TABLE `sys_user_role`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id',\n  `user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户id',\n  `role_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色id',\n  `tenant_id` int(10) NULL DEFAULT 0 COMMENT '租户ID',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_sur_user_id`(`user_id`) USING BTREE,\n  INDEX `idx_sur_role_id`(`role_id`) USING BTREE,\n  INDEX `idx_sur_user_role_id`(`user_id`, `role_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户角色表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_user_role\n-- ----------------------------\nINSERT INTO `sys_user_role` VALUES ('0ede6d23d53bc7dc990346ff14faabee', '3db4cf42353f4e868b7ccfeef90505d2', 'ee8626f80f7c2619917b6236f3a7f02b', 0);\nINSERT INTO `sys_user_role` VALUES ('1714519577000091650', 'a75d45a015c44384a04449ee80dc3503', 'ee8626f80f7c2619917b6236f3a7f02b', 0);\nINSERT INTO `sys_user_role` VALUES ('1714519577000091651', 'a75d45a015c44384a04449ee80dc3503', '1501570619841810433', 0);\nINSERT INTO `sys_user_role` VALUES ('1783729121881956354', '3d464b4ea0d2491aab8a7bde74c57e95', 'ee8626f80f7c2619917b6236f3a7f02b', 0);\nINSERT INTO `sys_user_role` VALUES ('1794912584001581058', 'a75d45a015c44384a04449ee80dc3503', '1169504891467464706', 0);\nINSERT INTO `sys_user_role` VALUES ('1794912584001581059', 'a75d45a015c44384a04449ee80dc3503', '1169504891467464707', 0);\nINSERT INTO `sys_user_role` VALUES ('1920390985230229505', '1714471285016895490', 'ee8626f80f7c2619917b6236f3a7f02b', 0);\nINSERT INTO `sys_user_role` VALUES ('1996175712356261889', 'e9ca23d68d884d4ebb19d07889727dae', '1501570619841810433', 0);\nINSERT INTO `sys_user_role` VALUES ('1996175712356261890', 'e9ca23d68d884d4ebb19d07889727dae', 'f6817f48af4fb3af11b9e8bf182f618b', 0);\nINSERT INTO `sys_user_role` VALUES ('79d66ef7aa137cfa9957081a1483009d', '9a668858c4c74cf5a2b25ad9608ba095', 'ee8626f80f7c2619917b6236f3a7f02b', 0);\nINSERT INTO `sys_user_role` VALUES ('b3ffd9311a1ca296c44e2409b547384f', '01b802058ea94b978a2c96f4807f6b48', '1', 0);\nINSERT INTO `sys_user_role` VALUES ('be2639167ede09379937daca7fc3bb73', '526f300ab35e44faaed54a9fb0742845', 'ee8626f80f7c2619917b6236f3a7f02b', 0);\nINSERT INTO `sys_user_role` VALUES ('e78d210d24aaff48e0a736e2ddff4cdc', '3e177fede453430387a8279ced685679', 'ee8626f80f7c2619917b6236f3a7f02b', 0);\nINSERT INTO `sys_user_role` VALUES ('ee45d0343ecec894b6886effc92cb0b7', '4d8fef4667574b24a9ccfedaf257810c', 'f6817f48af4fb3af11b9e8bf182f618b', 0);\nINSERT INTO `sys_user_role` VALUES ('f2922a38ba24fb53749e45a0c459adb3', '439ae3e9bcf7418583fcd429cadb1d72', '1', 0);\nINSERT INTO `sys_user_role` VALUES ('f72c6190b0722e798147e73c776c6ac9', '439ae3e9bcf7418583fcd429cadb1d72', 'ee8626f80f7c2619917b6236f3a7f02b', 0);\n\n-- ----------------------------\n-- Table structure for sys_user_tenant\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_user_tenant`;\nCREATE TABLE `sys_user_tenant`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键id',\n  `user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户id',\n  `tenant_id` int(10) NULL DEFAULT NULL COMMENT '租户id',\n  `status` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '状态(1 正常 2 离职 3 待审核 4 拒绝 5 邀请加入)',\n  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_sut_user_id`(`user_id`) USING BTREE,\n  INDEX `idx_sut_tenant_id`(`tenant_id`) USING BTREE,\n  INDEX `idx_sut_user_rel_tenant`(`user_id`, `tenant_id`) USING BTREE,\n  INDEX `idx_sut_status`(`status`) USING BTREE,\n  INDEX `idx_sut_userid_status`(`user_id`, `status`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户租户关系表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of sys_user_tenant\n-- ----------------------------\nINSERT INTO `sys_user_tenant` VALUES ('1955179797651038210', 'a75d45a015c44384a04449ee80dc3503', 1001, '1', 'admin', '2025-08-12 16:09:24', NULL, NULL);\nINSERT INTO `sys_user_tenant` VALUES ('1955182032762126337', 'e9ca23d68d884d4ebb19d07889727dae', 1000, '1', 'admin', '2025-08-12 16:18:17', NULL, NULL);\nINSERT INTO `sys_user_tenant` VALUES ('1955211766602534913', '1714471285016895490', 1001, '1', 'admin', '2025-08-12 18:16:26', NULL, NULL);\n\n-- ----------------------------\n-- Table structure for test_demo\n-- ----------------------------\nDROP TABLE IF EXISTS `test_demo`;\nCREATE TABLE `test_demo`  (\n  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人登录名称',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人登录名称',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',\n  `sex` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别',\n  `age` int(32) NULL DEFAULT NULL COMMENT '年龄',\n  `descc` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',\n  `birthday` datetime NULL DEFAULT NULL COMMENT '生日',\n  `user_code` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户编码',\n  `file_kk` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '附件',\n  `top_pic` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '头像',\n  `chegnshi` varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '城市',\n  `ceck` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'checkbox',\n  `xiamuti` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '下拉多选',\n  `search_sel` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '搜索下拉',\n  `pop` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '弹窗',\n  `sel_table` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '下拉字典表',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of test_demo\n-- ----------------------------\nINSERT INTO `test_demo` VALUES ('11', 'admin', '2024-06-23 16:51:45', NULL, NULL, '111', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `test_demo` VALUES ('1331884149004910593', 'admin', '2020-11-26 16:55:01', NULL, NULL, '张三', '1', NULL, NULL, NULL, NULL, '', '', '130304', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `test_demo` VALUES ('1331901553776869377', 'admin', '2020-11-26 18:04:10', 'admin', '2020-11-26 18:04:24', '张三', '2', NULL, '', NULL, '', '', '', '', '1', '1,2', 'hr', '', NULL);\nINSERT INTO `test_demo` VALUES ('1533107308342210561', 'admin', '2022-06-04 23:24:00', NULL, NULL, '11', '1', 111, '<p>111</p>', '2022-06-24 00:00:00', NULL, 'temp/11_1654356225072.jpg', 'temp/11_1654356229294.jpg', '210603', '2', '2,1', 'hr', NULL, 'admin');\nINSERT INTO `test_demo` VALUES ('1899062356047814658', 'admin', '2025-03-10 19:38:43', NULL, NULL, '哈喽', '1', NULL, NULL, '2015-01-01 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `test_demo` VALUES ('4028810c6aed99e1016aed9b31b40002', NULL, NULL, 'admin', '2019-10-19 15:37:27', 'jeecg', '2', 55, '5', '2019-05-15 00:00:00', NULL, '', '', NULL, NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `test_demo` VALUES ('4028810c6b02cba2016b02cba21f0000', 'admin', '2019-05-29 16:53:48', 'admin', '2022-11-07 22:09:46', '张小红', '1', 8222, '8', '2019-04-01 00:00:00', '', '', '', '120101', '2', '', '', '', '');\n\n-- ----------------------------\n-- Table structure for test_enhance_select\n-- ----------------------------\nDROP TABLE IF EXISTS `test_enhance_select`;\nCREATE TABLE `test_enhance_select`  (\n  `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `province` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '省份',\n  `city` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '市',\n  `area` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '区',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of test_enhance_select\n-- ----------------------------\nINSERT INTO `test_enhance_select` VALUES ('1256614575282958338', '1230769290609725441', '1230769470889299970', '1230769620021972993', '2020-05-03 00:00:36', 'admin');\nINSERT INTO `test_enhance_select` VALUES ('1427183594647195649', '1230769253267836929', '1230769769930592257', '1230769855347593217', '2021-08-16 16:20:59', 'admin');\nINSERT INTO `test_enhance_select` VALUES ('1427184250225299457', '1230769290609725441', '1230769470889299970', '1230769620021972993', '2021-08-16 16:23:35', 'admin');\nINSERT INTO `test_enhance_select` VALUES ('1427900912506630146', '1230769253267836929', '1230769769930592257', '1230769855347593217', '2021-08-18 15:51:21', 'admin');\nINSERT INTO `test_enhance_select` VALUES ('402880e570801ffe01708053743c002e', '1230769253267836929', '1230769769930592257', '1230769855347593217', '2020-02-26 15:08:37', 'admin');\nINSERT INTO `test_enhance_select` VALUES ('402880e570801ffe017080538b24002f', '1230769253267836929', '1230769769930592257', '1230769855347593217', '2020-02-26 15:08:43', 'admin');\nINSERT INTO `test_enhance_select` VALUES ('402880e570801ffe01708053b2b10030', '1230769290609725441', '1230769470889299970', '1230769620021972993', '2020-02-26 15:08:53', 'admin');\n\n-- ----------------------------\n-- Table structure for test_note\n-- ----------------------------\nDROP TABLE IF EXISTS `test_note`;\nCREATE TABLE `test_note`  (\n  `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',\n  `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属部门',\n  `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名',\n  `age` int(11) NULL DEFAULT NULL COMMENT '年龄',\n  `sex` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '性别',\n  `birthday` datetime NULL DEFAULT NULL COMMENT '生日',\n  `contents` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请假原因',\n  `year` date NULL DEFAULT NULL COMMENT '年',\n  `sheng` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地区',\n  `month` date NULL DEFAULT NULL COMMENT '月',\n  `begin_time` date NULL DEFAULT NULL COMMENT '开始时间',\n  `long_ids` bigint(20) NULL DEFAULT NULL COMMENT '长类型',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of test_note\n-- ----------------------------\nINSERT INTO `test_note` VALUES ('1257876639515222017', 'admin', '2020-05-06 11:35:35', NULL, NULL, 'A01', '不同意', 20, '1', '2020-05-06 00:00:00', '999', NULL, NULL, NULL, NULL, NULL);\nINSERT INTO `test_note` VALUES ('1304309860578455553', 'admin', '2020-09-11 14:44:38', 'admin', '2025-06-25 17:51:19', 'A01', 'zhangsan', 18, '1', '2020-09-11 00:00:00', '<p>2223333</p>', NULL, '', NULL, NULL, NULL);\nINSERT INTO `test_note` VALUES ('1923203898831777793', 'admin', '2025-05-16 10:28:35', 'admin', '2025-07-31 14:12:28', 'A01', 'jeecg', 10, '2', NULL, '', NULL, '', NULL, NULL, NULL);\nINSERT INTO `test_note` VALUES ('1943500714139598850', 'admin', '2025-07-11 10:40:53', 'admin', '2026-01-21 23:16:27', 'A01', 'admin', 1212, '1', '2025-07-29 00:00:00', '<p>经过上述讨论, 我们不得不面对一个非常尴尬的事实, 那就是, 这样看来, 一般来讲, 我们都必须务必慎重的考虑考虑. 就我个人来说, 随机一段废话对我的意义, 不能不说非常重大.&nbsp;<br>每个人都不得不面对这些问题. 在面对这种问题时, 随机一段废话, 发生了会如何, 不发生又会如何. 总结的来说,&nbsp;<br>这种事实对本人来说意义重大, 相信对这个世界也是有一定意义的.所谓随机一段废话, 关键是x需要</p>', NULL, '140311', NULL, NULL, NULL);\nINSERT INTO `test_note` VALUES ('1966815579977478145', 'admin', '2025-09-13 18:45:50', 'admin', '2026-01-21 23:15:46', 'A01', 'ceshi', 0, '2', '2025-09-19 00:00:00', '', NULL, '', NULL, NULL, NULL);\nINSERT INTO `test_note` VALUES ('2010992399911772161', 'admin', '2026-01-13 16:28:45', 'admin', '2026-01-21 23:16:31', 'A01A03', '', 11, '', NULL, '', NULL, '', NULL, NULL, NULL);\n\n-- ----------------------------\n-- Table structure for test_online_link\n-- ----------------------------\nDROP TABLE IF EXISTS `test_online_link`;\nCREATE TABLE `test_online_link`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `pid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'pid',\n  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'name',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of test_online_link\n-- ----------------------------\nINSERT INTO `test_online_link` VALUES ('1', NULL, '中国');\nINSERT INTO `test_online_link` VALUES ('10', '8', '庐阳区');\nINSERT INTO `test_online_link` VALUES ('11', '7', '黄山市');\nINSERT INTO `test_online_link` VALUES ('2', '1', '山东省');\nINSERT INTO `test_online_link` VALUES ('3', '2', '济南市');\nINSERT INTO `test_online_link` VALUES ('4', '3', '历城区');\nINSERT INTO `test_online_link` VALUES ('5', '3', '长青区');\nINSERT INTO `test_online_link` VALUES ('6', '2', '青岛市');\nINSERT INTO `test_online_link` VALUES ('7', '1', '安徽省');\nINSERT INTO `test_online_link` VALUES ('8', '7', '合肥市');\nINSERT INTO `test_online_link` VALUES ('9', '8', '包河区');\n\n-- ----------------------------\n-- Table structure for test_order_customer\n-- ----------------------------\nDROP TABLE IF EXISTS `test_order_customer`;\nCREATE TABLE `test_order_customer`  (\n  `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属部门',\n  `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '客户名字',\n  `sex` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '性别',\n  `age` int(11) NULL DEFAULT NULL COMMENT '年龄',\n  `birthday` date NULL DEFAULT NULL COMMENT '生日',\n  `order_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '订单id',\n  `address` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地址',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of test_order_customer\n-- ----------------------------\nINSERT INTO `test_order_customer` VALUES ('1586285823409205250', 'admin', '2022-10-29 17:16:26', NULL, NULL, 'A01', '90', '1', 90, '2022-09-28', '1551943088862896130', NULL);\nINSERT INTO `test_order_customer` VALUES ('1586557969578553345', 'admin', '2022-10-30 11:20:31', NULL, NULL, 'A01', '小王', '1', 33, '2022-09-29', '1586557968995545089', NULL);\nINSERT INTO `test_order_customer` VALUES ('1586557969578553346', 'admin', '2022-10-30 11:17:51', NULL, NULL, 'A01', '效力', '2', 333, '2022-10-16', '1586557968995545089', NULL);\nINSERT INTO `test_order_customer` VALUES ('1589514956528386050', 'admin', '2022-11-07 15:07:52', NULL, NULL, 'A01', '1111', '1', 22, '2022-11-02', '1589514956490637313', NULL);\nINSERT INTO `test_order_customer` VALUES ('1589516804559699970', 'admin', '2022-11-07 15:15:13', NULL, NULL, 'A01', '33', NULL, NULL, NULL, '1589516804530339842', '120101');\nINSERT INTO `test_order_customer` VALUES ('1589516832699285506', 'admin', '2022-11-07 15:15:19', NULL, NULL, 'A01', '4434', NULL, NULL, NULL, '1589516804530339842', NULL);\nINSERT INTO `test_order_customer` VALUES ('1597149156416937985', 'admin', '2022-11-28 16:43:27', NULL, NULL, 'A01', '33', '1', 33, '2022-11-03', '1597149156089782273', NULL);\nINSERT INTO `test_order_customer` VALUES ('1683074969947033601', 'admin', '2024-09-10 19:47:29', NULL, NULL, 'A01', '于美欣', '1', 22, '2023-07-06', '1683074969561157634', NULL);\n\n-- ----------------------------\n-- Table structure for test_order_main\n-- ----------------------------\nDROP TABLE IF EXISTS `test_order_main`;\nCREATE TABLE `test_order_main`  (\n  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `order_code` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '订单编码',\n  `order_date` datetime NULL DEFAULT NULL COMMENT '下单时间',\n  `descc` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',\n  `xiala` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '下拉多选',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of test_order_main\n-- ----------------------------\nINSERT INTO `test_order_main` VALUES ('1256629667445714946', 'admin', '2020-05-03 01:00:34', 'admin', '2020-11-26 15:22:35', '鼠标', '2020-05-03 00:00:00', '15', NULL);\nINSERT INTO `test_order_main` VALUES ('1551943088862896130', 'admin', '2022-07-26 22:50:40', 'admin', '2022-10-29 17:16:26', 'CN2022', NULL, '', '');\nINSERT INTO `test_order_main` VALUES ('1586557968995545089', 'admin', '2022-10-30 11:17:51', 'admin', '2022-11-07 15:07:24', 'CN2022103011170844', NULL, '111', '');\nINSERT INTO `test_order_main` VALUES ('1589514956490637313', 'admin', '2022-11-07 15:07:52', 'admin', '2022-11-07 15:14:50', '顾平', '2022-11-07 00:00:00', NULL, '1,2');\nINSERT INTO `test_order_main` VALUES ('1589516804530339842', 'admin', '2022-11-07 15:15:13', 'admin', '2022-11-23 17:20:56', '顾平2', '2022-11-07 00:00:00', '222', '1,2');\nINSERT INTO `test_order_main` VALUES ('1597149156089782273', 'admin', '2022-11-28 16:43:27', NULL, NULL, 'CN2022112816431596', NULL, NULL, NULL);\nINSERT INTO `test_order_main` VALUES ('1683074969561157634', 'admin', '2023-07-23 19:21:57', 'admin', '2024-09-10 19:47:29', 'CN2023072319214115', NULL, '111', '1,2');\nINSERT INTO `test_order_main` VALUES ('1833472350097121281', 'admin', '2024-09-10 19:47:27', 'admin', '2025-11-27 18:19:52', 'CN2024091019472568', NULL, '', '');\nINSERT INTO `test_order_main` VALUES ('1907441973318082561', 'admin', '2025-04-02 22:36:19', NULL, NULL, 'CN2025040222361836', NULL, NULL, NULL);\n\n-- ----------------------------\n-- Table structure for test_order_product\n-- ----------------------------\nDROP TABLE IF EXISTS `test_order_product`;\nCREATE TABLE `test_order_product`  (\n  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `product_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '产品名字',\n  `price` double(32, 0) NULL DEFAULT NULL COMMENT '价格',\n  `num` int(32) NULL DEFAULT NULL COMMENT '数量',\n  `descc` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',\n  `order_fk_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '订单外键ID',\n  `pro_type` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '产品类型',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of test_order_product\n-- ----------------------------\nINSERT INTO `test_order_product` VALUES ('1331860890813284353', 'admin', '2020-11-26 15:22:35', NULL, NULL, '44', 44, 44, '', '1256629667445714946', '1');\nINSERT INTO `test_order_product` VALUES ('1551943088930004994', 'admin', '2022-10-29 17:16:26', NULL, NULL, '11', 11, 11, '11', '1551943088862896130', '1');\nINSERT INTO `test_order_product` VALUES ('1551943088930004995', 'admin', '2022-07-26 22:50:40', NULL, NULL, '2', 2, 2, '2', '1551943088862896130', '2');\nINSERT INTO `test_order_product` VALUES ('15665749948861', 'admin', '2020-02-24 02:05:38', NULL, NULL, '333', 33, NULL, '', '402831816a38e7fd016a38e825c90003', '');\nINSERT INTO `test_order_product` VALUES ('1586557969318506498', 'admin', '2022-10-30 11:20:31', NULL, NULL, '小米手机3', 20003, 33, '3', '1586557968995545089', '2');\nINSERT INTO `test_order_product` VALUES ('1586557969381421058', 'admin', '2022-10-30 11:17:51', NULL, NULL, '华为手机1', 80001, 31, '11', '1586557968995545089', '2');\nINSERT INTO `test_order_product` VALUES ('15884388229280883233', 'admin', '2020-11-26 15:22:35', NULL, NULL, '华为手机', 25, 35, '345', '1256629667445714946', '1');\nINSERT INTO `test_order_product` VALUES ('15884388231401967996', 'admin', '2020-07-11 11:36:36', NULL, NULL, '低代码平台', 25, 35, '445', '1256629667445714946', '1');\nINSERT INTO `test_order_product` VALUES ('15884388463052345317', 'admin', '2020-07-11 11:36:36', NULL, NULL, '表单设计器', 55, 55, '55', '1256629667445714946', '2');\nINSERT INTO `test_order_product` VALUES ('1589514837779251202', 'admin', '2022-11-07 15:07:24', NULL, NULL, '2323', 2323, 2323, '', '1586557968995545089', '1');\nINSERT INTO `test_order_product` VALUES ('1589514956499025921', 'admin', '2022-11-07 15:07:52', NULL, NULL, '111', 222, 222, '222', '1589514956490637313', '1');\nINSERT INTO `test_order_product` VALUES ('1589514956515803137', 'admin', '2022-11-07 15:07:52', NULL, NULL, '333', NULL, NULL, '', '1589514956490637313', '');\nINSERT INTO `test_order_product` VALUES ('1589516804542922753', 'admin', '2022-11-23 17:20:56', NULL, NULL, '1133', NULL, NULL, NULL, '1589516804530339842', NULL);\nINSERT INTO `test_order_product` VALUES ('1589516804551311361', 'admin', '2022-11-07 15:15:13', NULL, NULL, '222', NULL, NULL, NULL, '1589516804530339842', NULL);\nINSERT INTO `test_order_product` VALUES ('1597149156278525953', 'admin', '2022-11-28 16:43:27', NULL, NULL, '22', 2, 2, '22', '1597149156089782273', '1');\nINSERT INTO `test_order_product` VALUES ('1683074969716346881', 'admin', '2024-09-10 19:47:29', NULL, NULL, '电脑', 5000, 21, '121', '1683074969561157634', '1');\nINSERT INTO `test_order_product` VALUES ('1714472725034704898', 'admin', '2024-09-10 19:47:29', NULL, NULL, '办公椅子', 50, 100, NULL, '1683074969561157634', '1');\nINSERT INTO `test_order_product` VALUES ('1732300515406647298', 'admin', '2024-09-10 19:47:29', 'admin', '2025-07-30 10:00:02', '苹果手机', 3000, 10, '', '1683074969561157634', '1');\nINSERT INTO `test_order_product` VALUES ('1907442008848031746', 'admin', '2025-11-27 18:19:52', NULL, NULL, '1', 1, 22, NULL, '1833472350097121281', '1');\nINSERT INTO `test_order_product` VALUES ('402831816a38e7fd016a38e7fdeb0001', 'admin', '2019-04-20 12:01:29', NULL, NULL, '笔记本', 100, 10, NULL, '402831816a38e7fd016a38e7fddf0000', NULL);\nINSERT INTO `test_order_product` VALUES ('402831816a38e7fd016a38e7fdf10002', 'admin', '2019-04-20 12:01:29', NULL, NULL, '显示器', 300, 1, NULL, '402831816a38e7fd016a38e7fddf0000', NULL);\nINSERT INTO `test_order_product` VALUES ('4028810c6b40244b016b406884080005', 'admin', '2020-02-24 02:05:38', NULL, NULL, '333', NULL, 33, '', '402831816a38e7fd016a38e825c90003', '');\n\n-- ----------------------------\n-- Table structure for test_person\n-- ----------------------------\nDROP TABLE IF EXISTS `test_person`;\nCREATE TABLE `test_person`  (\n  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `sex` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别',\n  `name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',\n  `content` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '请假原因',\n  `be_date` datetime NULL DEFAULT NULL COMMENT '请假时间',\n  `qj_days` int(11) NULL DEFAULT NULL COMMENT '请假天数',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of test_person\n-- ----------------------------\nINSERT INTO `test_person` VALUES ('8ca668defdae47df8649a5477ae08b05', 'admin', '2019-04-12 09:51:37', NULL, NULL, '1', 'zhangdaiscott', 'dsdsd', '2019-04-12 00:00:00', 2);\n\n-- ----------------------------\n-- Table structure for test_shoptype_tree\n-- ----------------------------\nDROP TABLE IF EXISTS `test_shoptype_tree`;\nCREATE TABLE `test_shoptype_tree`  (\n  `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',\n  `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属部门',\n  `type_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '商品分类',\n  `pic` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分类图片',\n  `pid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '父级节点',\n  `has_child` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否有子节点',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of test_shoptype_tree\n-- ----------------------------\nINSERT INTO `test_shoptype_tree` VALUES ('1256629035921944577', 'admin', '2020-05-03 00:58:03', NULL, NULL, 'A01', '三星显示器', 'gh_f28e66390fc9_344 (shop)_1588438682583.jpg', '1256628864848867329', '0');\nINSERT INTO `test_shoptype_tree` VALUES ('1833472226709086209', 'admin', '2024-09-10 19:46:57', NULL, NULL, 'A01', '笔记本', NULL, '0', '0');\nINSERT INTO `test_shoptype_tree` VALUES ('1923190583678107649', 'admin', '2025-05-16 09:35:40', 'admin', '2026-01-13 16:33:07', 'A01', '水果', '', '0', '1');\nINSERT INTO `test_shoptype_tree` VALUES ('1923190611448594433', 'admin', '2025-05-16 09:35:47', NULL, NULL, 'A01', '苹果', NULL, '1923190583678107649', '0');\n\n-- ----------------------------\n-- Procedure structure for insert_200_records\n-- ----------------------------\nDROP PROCEDURE IF EXISTS `insert_200_records`;\ndelimiter ;;\nCREATE PROCEDURE `insert_200_records`()\nBEGIN\n    DECLARE i INT DEFAULT 1;\n    \n    WHILE i <= 200 DO\n        INSERT INTO jimu_report (id, code, name, del_flag) \n        VALUES (i, CONCAT('RPT', LPAD(i, 3, '0')), CONCAT('Report ', i), 0);\n        \n        SET i = i + 1;\n    END WHILE;\nEND\n;;\ndelimiter ;\n\nSET FOREIGN_KEY_CHECKS = 1;\n"
  },
  {
    "path": "jeecg-boot/db/tables_nacos.sql",
    "content": "CREATE database if NOT EXISTS `nacos` default character set utf8mb4 collate utf8mb4_general_ci;\nuse `nacos`;\n\n/*\n Navicat Premium Data Transfer\n\n Source Server         : mysql5.7\n Source Server Type    : MySQL\n Source Server Version : 50738 (5.7.38)\n Source Host           : 127.0.0.1:3306\n Source Schema         : nacos-os\n\n Target Server Type    : MySQL\n Target Server Version : 50738 (5.7.38)\n File Encoding         : 65001\n\n Date: 14/10/2025 16:27:11\n*/\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- Table structure for config_info\n-- ----------------------------\nDROP TABLE IF EXISTS `config_info`;\nCREATE TABLE `config_info`  (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n  `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id',\n  `group_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,\n  `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'content',\n  `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'md5',\n  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',\n  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',\n  `src_user` text CHARACTER SET utf8 COLLATE utf8_bin NULL COMMENT 'source user',\n  `src_ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip',\n  `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,\n  `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT '租户字段',\n  `c_desc` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,\n  `c_use` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,\n  `effect` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,\n  `type` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,\n  `c_schema` text CHARACTER SET utf8 COLLATE utf8_bin NULL,\n  `encrypted_data_key` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '加密key',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uk_configinfo_datagrouptenant`(`data_id`, `group_id`, `tenant_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 54 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = 'config_info' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of config_info\n-- ----------------------------\nINSERT INTO `config_info` VALUES (1, 'jeecg-dev.yaml', 'DEFAULT_GROUP', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,wall,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n  redis:\\n    database: 0\\n    host: jeecg-boot-redis\\n    password:\\n    port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    locations: classpath:flyway/sql/mysql\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys,/sys/sendChangePwdSms,/sys/user/sendChangePhoneSms,/sys/sms,/desform/api/sendVerifyCode\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??\\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: true\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\n  ai-rag:\\n    embed-store:\\n      host: 127.0.0.1\\n      port: 5432\\n      database: postgres\\n      user: postgres\\n      password: postgres\\n      table: embeddings\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', '90726230e649e6a178fbf6315c4cc754', '2021-03-03 13:01:11', '2025-09-25 02:11:30', NULL, '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', '');\nINSERT INTO `config_info` VALUES (2, 'jeecg.yaml', 'DEFAULT_GROUP', 'server:\\n  tomcat:\\n    max-swallow-size: -1\\n  error:\\n    include-exception: true\\n    include-stacktrace: ALWAYS\\n    include-message: ALWAYS\\n  compression:\\n    enabled: true\\n    min-response-size: 1024\\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\\nmanagement:\\n  health:\\n    mail:\\n      enabled: false\\n  endpoints:\\n    web:\\n      exposure:\\n        include: \\\"*\\\"\\n    health:\\n      sensitive: true\\n  endpoint:\\n    health:\\n      show-details: ALWAYS\\nspring:\\n  servlet:\\n    multipart:\\n      max-file-size: 10MB\\n      max-request-size: 10MB\\n  mail:\\n    host: smtp.163.com\\n    username: jeecgos@163.com\\n    password: ??\\n    properties:\\n      mail.smtp.timeout: 10000\\n      mail.smtp.connectiontimeout: 10000\\n      mail.smtp.writetimeout: 10000\\n      mail.smtp.auth: true\\n      smtp.ssl.enable: true\\n  quartz:\\n    job-store-type: jdbc\\n    jdbc:\\n      initialize-schema: embedded\\n    auto-startup: false\\n    startup-delay: 1s\\n    overwrite-existing-jobs: true\\n    properties:\\n      org:\\n        quartz:\\n          scheduler:\\n            instanceName: MyScheduler\\n            instanceId: AUTO\\n          jobStore:\\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\\n            tablePrefix: QRTZ_\\n            isClustered: true\\n            misfireThreshold: 12000\\n            clusterCheckinInterval: 15000\\n          threadPool:\\n            class: org.quartz.simpl.SimpleThreadPool\\n            threadCount: 10\\n            threadPriority: 5\\n            threadsInheritContextClassLoaderOfInitializingThread: true\\n  jackson:\\n    date-format: yyyy-MM-dd HH:mm:ss\\n    time-zone: GMT+8\\n  aop:\\n    proxy-target-class: true\\n  jpa:\\n    open-in-view: false\\n  freemarker:\\n    suffix: .ftl\\n    content-type: text/html\\n    charset: UTF-8\\n    cache: false\\n    prefer-file-system-access: false\\n    template-loader-path:\\n      - classpath:/templates\\n  mvc:\\n    static-path-pattern: /**\\n    pathmatch:\\n      matching-strategy: ant_path_matcher\\n  resource:\\n    static-locations: classpath:/static/,classpath:/public/\\n  autoconfigure:\\n    exclude:\\n      - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure\\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\\nmybatis-plus:\\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\\n  global-config:\\n    banner: false\\n    db-config:\\n      id-type: ASSIGN_ID\\n      table-underline: true\\n  configuration:\\n    call-setters-on-nulls: true\\nlogging:\\n  level:\\n    org.springframework.context.support.PostProcessorRegistrationDelegate: error\\n    org.flywaydb: debug\\n    org.jeecg.modules.system.mapper: info\\n    org.jeecg.modules.demo.test.mapper: info', '1c0c0a92a6dfa12b5e0706ab76a623ca', '2021-03-03 13:01:42', '2025-09-25 02:11:45', NULL, '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', '');\nINSERT INTO `config_info` VALUES (3, 'jeecg-gateway-router.json', 'DEFAULT_GROUP', '[{\\n  \\\"id\\\": \\\"jeecg-system\\\",\\n  \\\"order\\\": 0,\\n  \\\"predicates\\\": [{\\n    \\\"name\\\": \\\"Path\\\",\\n    \\\"args\\\": {\\n      \\\"_genkey_0\\\": \\\"/sys/**\\\",\\n      \\\"_genkey_1\\\": \\\"/jmreport/**\\\",\\n      \\\"_genkey_3\\\": \\\"/online/**\\\",\\n      \\\"_genkey_4\\\": \\\"/generic/**\\\",\\n      \\\"_genkey_5\\\": \\\"/drag/**\\\",\\n      \\\"_genkey_6\\\": \\\"/actuator/**\\\",\\n      \\\"_genkey_7\\\": \\\"/airag/**\\\",\\n      \\\"_genkey_8\\\": \\\"/jimubi/**\\\",\\n      \\\"_genkey_9\\\": \\\"/openapi/**\\\"\\n    }\\n  }],\\n  \\\"filters\\\": [],\\n  \\\"uri\\\": \\\"lb://jeecg-system\\\"\\n}, {\\n  \\\"id\\\": \\\"jeecg-demo\\\",\\n  \\\"order\\\": 1,\\n  \\\"predicates\\\": [{\\n    \\\"name\\\": \\\"Path\\\",\\n    \\\"args\\\": {\\n      \\\"_genkey_0\\\": \\\"/mock/**\\\",\\n      \\\"_genkey_1\\\": \\\"/test/**\\\",\\n      \\\"_genkey_2\\\": \\\"/bigscreen/template1/**\\\",\\n      \\\"_genkey_3\\\": \\\"/bigscreen/template2/**\\\"\\n    }\\n  }],\\n  \\\"filters\\\": [],\\n  \\\"uri\\\": \\\"lb://jeecg-demo\\\"\\n}, {\\n  \\\"id\\\": \\\"jeecg-system-websocket\\\",\\n  \\\"order\\\": 2,\\n  \\\"predicates\\\": [{\\n    \\\"name\\\": \\\"Path\\\",\\n    \\\"args\\\": {\\n      \\\"_genkey_0\\\": \\\"/websocket/**\\\",\\n      \\\"_genkey_1\\\": \\\"/newsWebsocket/**\\\"\\n    }\\n  }],\\n  \\\"filters\\\": [],\\n  \\\"uri\\\": \\\"lb:ws://jeecg-system\\\"\\n}, {\\n  \\\"id\\\": \\\"jeecg-demo-websocket\\\",\\n  \\\"order\\\": 3,\\n  \\\"predicates\\\": [{\\n    \\\"name\\\": \\\"Path\\\",\\n    \\\"args\\\": {\\n      \\\"_genkey_0\\\": \\\"/vxeSocket/**\\\"\\n    }\\n  }],\\n  \\\"filters\\\": [],\\n  \\\"uri\\\": \\\"lb:ws://jeecg-demo\\\"\\n}]', '856da7f7ff7931c6b1932e89d87b83ba', '2021-03-03 13:02:14', '2025-05-21 05:41:09', NULL, '0:0:0:0:0:0:0:1', '', '', '', '', '', 'json', '', '');\nINSERT INTO `config_info` VALUES (11, 'jeecg-sharding.yaml', 'DEFAULT_GROUP', 'spring:\\n  shardingsphere:\\n    datasource:\\n      names: ds0\\n      ds0:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        username: root\\n        password: root\\n        type: com.alibaba.druid.pool.DruidDataSource\\n    props:\\n      sql-show: true\\n    rules:\\n      sharding:\\n        binding-tables: sys_log\\n        key-generators:\\n          snowflake:\\n            type: SNOWFLAKE\\n            props:\\n              worker-id: 123\\n        sharding-algorithms:\\n          table-classbased:\\n            props:\\n              strategy: standard\\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n            type: CLASS_BASED\\n        tables:\\n          sys_log:\\n            actual-data-nodes: ds0.sys_log$->{0..1}\\n            table-strategy:\\n              standard:\\n                sharding-algorithm-name: table-classbased\\n                sharding-column: log_type', 'a93fa455c32cd37ca84631d2bbe13005', '2022-04-13 03:12:28', '2022-08-07 13:13:57', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', NULL);\nINSERT INTO `config_info` VALUES (20, 'jeecg-gateway-dev.yaml', 'DEFAULT_GROUP', 'jeecg:\\n  route:\\n    config:\\n      #type:database nacos yml\\n      data-type: database\\n      data-id: jeecg-gateway-router\\nspring:\\n  redis:\\n    database: 0\\n    host: jeecg-boot-redis\\n    port: 6379\\n    password:\\nknife4j:\\n  production: false', '98e211c54b43a73f7189d92f1c77f815', '2022-08-04 16:36:11', '2024-06-11 16:13:15', NULL, '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', '');\nINSERT INTO `config_info` VALUES (22, 'jeecg-sharding-multi.yaml', 'DEFAULT_GROUP', 'spring:\\n  shardingsphere:\\n    datasource:\\n      names: ds0,ds1\\n      ds0:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        type: com.alibaba.druid.pool.DruidDataSource\\n        username: root\\n        password: root\\n      ds1:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot2?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        type: com.alibaba.druid.pool.DruidDataSource\\n        username: root\\n        password: root\\n    props:\\n      sql-show: true\\n    rules:\\n      replica-query:\\n        load-balancers:\\n          round-robin:\\n            type: ROUND_ROBIN\\n            props:\\n              default: 0\\n        data-sources:\\n          prds:\\n            primary-data-source-name: ds0\\n            replica-data-source-names: ds1\\n            load-balancer-name: round_robin\\n      sharding:\\n        binding-tables:\\n          - sys_log\\n        key-generators:\\n          snowflake:\\n            type: SNOWFLAKE\\n            props:\\n              worker-id: 123\\n        sharding-algorithms:\\n          table-classbased:\\n            props:\\n              strategy: standard\\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n            type: CLASS_BASED\\n          database-inline:\\n            type: INLINE\\n            props:\\n              algorithm-expression: ds$->{operate_type % 2}\\n        tables:\\n          sys_log:\\n            actual-data-nodes: ds$->{0..1}.sys_log$->{0..1}\\n            database-strategy:\\n              standard:\\n                sharding-column: operate_type\\n                sharding-algorithm-name: database-inline\\n            table-strategy:\\n              standard:\\n                sharding-algorithm-name: table-classbased\\n                sharding-column: log_type', '0fc2b030ca8c0008f148c84ecbd2a8c7', '2022-08-07 06:09:01', '2025-10-13 10:54:36', NULL, '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', '');\nINSERT INTO `config_info` VALUES (29, 'jeecg-dev.yaml', 'JEECGDEV_GROUP', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,wall,slf4j\\n        connectionProperties: druid.stat.mergeSql\\\\=true;druid.stat.slowSqlMillis\\\\=5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n  redis:\\n    database: 0\\n    host: jeecg-boot-redis\\n    password:\\n    port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??\\n  elasticsearch:\\n    cluster-name: jeecg-ES\\n    cluster-nodes: jeecg-boot-es:9200\\n    check-enabled: false\\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    mode: dev\\n    is_verify_token: false\\n    verify_methods: remove,delete,save,add,update\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: true\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\nlogging:\\n  level:\\n    org.jeecg.modules.system.mapper : info\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', '6c0ec1ace75d0341a1f83978c864c0b3', '2023-07-17 10:05:06', '2023-07-17 11:49:49', NULL, '0:0:0:0:0:0:0:1', '', 'ac14ab82-51f8-4f0c-aa5b-25fb8384bfb6', '', '', '', 'yaml', '', '');\nINSERT INTO `config_info` VALUES (30, 'jeecg.yaml', 'JEECGDEV_GROUP', 'server:\\n  tomcat:\\n    max-swallow-size: -1\\n  error:\\n    include-exception: true\\n    include-stacktrace: ALWAYS\\n    include-message: ALWAYS\\n  compression:\\n    enabled: true\\n    min-response-size: 1024\\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\\nmanagement:\\n  health:\\n    mail:\\n      enabled: false\\n  endpoints:\\n    web:\\n      exposure:\\n        include: \\\"*\\\"\\n    health:\\n      sensitive: true\\n  endpoint:\\n    health:\\n      show-details: ALWAYS\\nspring:\\n  servlet:\\n    multipart:\\n      max-file-size: 10MB\\n      max-request-size: 10MB\\n  mail:\\n    host: smtp.163.com\\n    username: jeecgos@163.com\\n    password: ??\\n    properties:\\n      mail:\\n        smtp:\\n          auth: true\\n          starttls:\\n            enable: true\\n            required: true\\n  quartz:\\n    job-store-type: jdbc\\n    initialize-schema: embedded\\n    auto-startup: false\\n    startup-delay: 1s\\n    overwrite-existing-jobs: true\\n    properties:\\n      org:\\n        quartz:\\n          scheduler:\\n            instanceName: MyScheduler\\n            instanceId: AUTO\\n          jobStore:\\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\\n            tablePrefix: QRTZ_\\n            isClustered: true\\n            misfireThreshold: 12000\\n            clusterCheckinInterval: 15000\\n          threadPool:\\n            class: org.quartz.simpl.SimpleThreadPool\\n            threadCount: 10\\n            threadPriority: 5\\n            threadsInheritContextClassLoaderOfInitializingThread: true\\n  jackson:\\n    date-format:   yyyy-MM-dd HH:mm:ss\\n    time-zone:   GMT+8\\n  aop:\\n    proxy-target-class: true\\n  activiti:\\n    check-process-definitions: false\\n    async-executor-activate: false\\n    job-executor-activate: false\\n  jpa:\\n    open-in-view: false\\n  freemarker:\\n    suffix: .ftl\\n    content-type: text/html\\n    charset: UTF-8\\n    cache: false\\n    prefer-file-system-access: false\\n    template-loader-path:\\n      - classpath:/templates\\n  mvc:\\n    static-path-pattern: /**\\n    pathmatch:\\n      matching-strategy: ant_path_matcher\\n  resource:\\n    static-locations: classpath:/static/,classpath:/public/\\n  autoconfigure:\\n    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure\\nmybatis-plus:\\n  mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml\\n  global-config:\\n    banner: false\\n    db-config:\\n      id-type: ASSIGN_ID\\n      table-underline: true\\n  configuration:\\n    call-setters-on-nulls: true', '2117a96ba08e8fd0f66825e87416af27', '2023-07-17 10:05:06', '2023-07-17 10:05:06', NULL, '0:0:0:0:0:0:0:1', '', 'ac14ab82-51f8-4f0c-aa5b-25fb8384bfb6', '', NULL, NULL, 'yaml', NULL, '');\nINSERT INTO `config_info` VALUES (31, 'jeecg-gateway-router.json', 'JEECGDEV_GROUP', '[{\\n  \\\"id\\\": \\\"jeecg-system\\\",\\n  \\\"order\\\": 0,\\n  \\\"predicates\\\": [{\\n    \\\"name\\\": \\\"Path\\\",\\n    \\\"args\\\": {\\n      \\\"_genkey_0\\\": \\\"/sys/**\\\",\\n      \\\"_genkey_1\\\": \\\"/jmreport/**\\\",\\n      \\\"_genkey_3\\\": \\\"/online/**\\\",\\n      \\\"_genkey_4\\\": \\\"/generic/**\\\"\\n    }\\n  }],\\n  \\\"filters\\\": [],\\n  \\\"uri\\\": \\\"lb://jeecg-system\\\"\\n}, {\\n  \\\"id\\\": \\\"jeecg-demo\\\",\\n  \\\"order\\\": 1,\\n  \\\"predicates\\\": [{\\n    \\\"name\\\": \\\"Path\\\",\\n    \\\"args\\\": {\\n      \\\"_genkey_0\\\": \\\"/mock/**\\\",\\n      \\\"_genkey_1\\\": \\\"/test/**\\\",\\n      \\\"_genkey_2\\\": \\\"/bigscreen/template1/**\\\",\\n      \\\"_genkey_3\\\": \\\"/bigscreen/template2/**\\\"\\n    }\\n  }],\\n  \\\"filters\\\": [],\\n  \\\"uri\\\": \\\"lb://jeecg-demo\\\"\\n}, {\\n  \\\"id\\\": \\\"jeecg-system-websocket\\\",\\n  \\\"order\\\": 2,\\n  \\\"predicates\\\": [{\\n    \\\"name\\\": \\\"Path\\\",\\n    \\\"args\\\": {\\n      \\\"_genkey_0\\\": \\\"/websocket/**\\\",\\n      \\\"_genkey_1\\\": \\\"/newsWebsocket/**\\\"\\n    }\\n  }],\\n  \\\"filters\\\": [],\\n  \\\"uri\\\": \\\"lb:ws://jeecg-system\\\"\\n}, {\\n  \\\"id\\\": \\\"jeecg-demo-websocket\\\",\\n  \\\"order\\\": 3,\\n  \\\"predicates\\\": [{\\n    \\\"name\\\": \\\"Path\\\",\\n    \\\"args\\\": {\\n      \\\"_genkey_0\\\": \\\"/vxeSocket/**\\\"\\n    }\\n  }],\\n  \\\"filters\\\": [],\\n  \\\"uri\\\": \\\"lb:ws://jeecg-demo\\\"\\n}]', 'be6548051d99309d7fa5ac4398404201', '2023-07-17 10:05:06', '2023-07-17 10:05:06', NULL, '0:0:0:0:0:0:0:1', '', 'ac14ab82-51f8-4f0c-aa5b-25fb8384bfb6', '', NULL, NULL, 'json', NULL, '');\nINSERT INTO `config_info` VALUES (32, 'jeecg-sharding.yaml', 'JEECGDEV_GROUP', 'spring:\\n  shardingsphere:\\n    datasource:\\n      names: ds0\\n      ds0:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        username: root\\n        password: root\\n        type: com.alibaba.druid.pool.DruidDataSource\\n    props:\\n      sql-show: true\\n    rules:\\n      sharding:\\n        binding-tables: sys_log\\n        key-generators:\\n          snowflake:\\n            type: SNOWFLAKE\\n            props:\\n              worker-id: 123\\n        sharding-algorithms:\\n          table-classbased:\\n            props:\\n              strategy: standard\\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n            type: CLASS_BASED\\n        tables:\\n          sys_log:\\n            actual-data-nodes: ds0.sys_log$->{0..1}\\n            table-strategy:\\n              standard:\\n                sharding-algorithm-name: table-classbased\\n                sharding-column: log_type', 'a93fa455c32cd37ca84631d2bbe13005', '2023-07-17 10:05:06', '2023-07-17 10:05:06', NULL, '0:0:0:0:0:0:0:1', '', 'ac14ab82-51f8-4f0c-aa5b-25fb8384bfb6', '', NULL, NULL, 'yaml', NULL, '');\nINSERT INTO `config_info` VALUES (33, 'jeecg-gateway-dev.yaml', 'JEECGDEV_GROUP', 'jeecg:\\n  route:\\n    config:\\n      #type:database nacos yml\\n      data-type: nacos\\n      data-id: jeecg-gateway-router\\nspring:\\n  redis:\\n    database: 0\\n    host: jeecg-boot-redis\\n    port: 6379\\n    password:', 'eeb45ae799de89f4d789139de7a7d12d', '2023-07-17 10:05:06', '2023-07-17 11:49:21', NULL, '0:0:0:0:0:0:0:1', '', 'ac14ab82-51f8-4f0c-aa5b-25fb8384bfb6', '', '', '', 'yaml', '', '');\nINSERT INTO `config_info` VALUES (34, 'jeecg-sharding-multi.yaml', 'JEECGDEV_GROUP', 'spring:\\n  shardingsphere:\\n    datasource:\\n      names: ds0,ds1\\n      ds0:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        type: com.alibaba.druid.pool.DruidDataSource\\n        username: root\\n        password: root\\n      ds1:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot2?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        type: com.alibaba.druid.pool.DruidDataSource\\n        username: root\\n        password: root\\n    props:\\n      sql-show: true\\n    rules:\\n      replica-query:\\n        load-balancers:\\n          round-robin:\\n            type: ROUND_ROBIN\\n            props:\\n              default: 0\\n        data-sources:\\n          prds:\\n            primary-data-source-name: ds0\\n            replica-data-source-names: ds1\\n            load-balancer-name: round_robin\\n      sharding:\\n        binding-tables:\\n          - sys_log\\n        key-generators:\\n          snowflake:\\n            type: SNOWFLAKE\\n            props:\\n              worker-id: 123\\n        sharding-algorithms:\\n          table-classbased:\\n            props:\\n              strategy: standard\\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n            type: CLASS_BASED\\n          database-inline:\\n            type: INLINE\\n            props:\\n              algorithm-expression: ds$->{operate_type % 2}\\n        tables:\\n          sys_log:\\n            actual-data-nodes: ds$->{0..1}.sys_log$->{0..1}\\n            database-strategy:\\n              standard:\\n                sharding-column: operate_type\\n                sharding-algorithm-name: database-inline\\n            table-strategy:\\n              standard:\\n                sharding-algorithm-name: table-classbased\\n                sharding-column: log_type', '0fc2b030ca8c0008f148c84ecbd2a8c7', '2023-07-17 10:05:06', '2023-07-17 10:05:06', NULL, '0:0:0:0:0:0:0:1', '', 'ac14ab82-51f8-4f0c-aa5b-25fb8384bfb6', '', NULL, NULL, 'yaml', NULL, '');\nINSERT INTO `config_info` VALUES (37, 'jeecg-dev.yaml', 'DEFAULT_GROUP', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,wall,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      password:\\n      port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    encoding: UTF-8\\n    locations: classpath:flyway/sql/mysql\\n    sql-migration-prefix: V\\n    sql-migration-separator: __\\n    placeholder-prefix: \\'#(\\'\\n    placeholder-suffix: )\\n    sql-migration-suffixes: .sql\\n    validate-on-migrate: true\\n    baseline-on-migrate: true\\n    clean-disabled: true\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??\\n  elasticsearch:\\n    cluster-name: jeecg-ES\\n    cluster-nodes: jeecg-boot-es:9200\\n    check-enabled: false\\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: false\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\nlogging:\\n  level:\\n    org.jeecg.modules.system.mapper : info\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', '91c29720dfb424916a769201a25200cf', '2024-02-29 09:10:12', '2024-06-11 16:24:46', NULL, '0:0:0:0:0:0:0:1', '', 'efc4e412-b1a1-498f-ba01-b31807649a9a', '', '', '', 'yaml', '', '');\nINSERT INTO `config_info` VALUES (38, 'jeecg.yaml', 'DEFAULT_GROUP', 'server:\\n  undertow:\\n    # max-http-post-size: 10MB\\n    worker-threads: 16\\n    buffers:\\n      websocket: 8192\\n      io: 16384\\n  error:\\n    include-exception: true\\n    include-stacktrace: ALWAYS\\n    include-message: ALWAYS\\n  compression:\\n    enabled: true\\n    min-response-size: 1024\\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\\nmanagement:\\n  health:\\n    mail:\\n      enabled: false\\n  endpoints:\\n    web:\\n      exposure:\\n        include: \\\"*\\\"\\n    health:\\n      sensitive: true\\n  endpoint:\\n    health:\\n      show-details: ALWAYS\\nspring:\\n  servlet:\\n    multipart:\\n      max-file-size: 10MB\\n      max-request-size: 10MB\\n  mail:\\n    host: smtp.163.com\\n    username: jeecgos@163.com\\n    password: ??\\n    properties:\\n      mail:\\n        smtp:\\n          auth: true\\n          starttls:\\n            enable: true\\n            required: true\\n  quartz:\\n    job-store-type: jdbc\\n    initialize-schema: embedded\\n    auto-startup: false\\n    startup-delay: 1s\\n    overwrite-existing-jobs: true\\n    properties:\\n      org:\\n        quartz:\\n          scheduler:\\n            instanceName: MyScheduler\\n            instanceId: AUTO\\n          jobStore:\\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\\n            tablePrefix: QRTZ_\\n            isClustered: true\\n            misfireThreshold: 12000\\n            clusterCheckinInterval: 15000\\n          threadPool:\\n            class: org.quartz.simpl.SimpleThreadPool\\n            threadCount: 10\\n            threadPriority: 5\\n            threadsInheritContextClassLoaderOfInitializingThread: true\\n  jackson:\\n    date-format: yyyy-MM-dd HH:mm:ss\\n    time-zone: GMT+8\\n  aop:\\n    proxy-target-class: true\\n  activiti:\\n    check-process-definitions: false\\n    async-executor-activate: false\\n    job-executor-activate: false\\n  jpa:\\n    open-in-view: false\\n  freemarker:\\n    suffix: .ftl\\n    content-type: text/html\\n    charset: UTF-8\\n    cache: false\\n    prefer-file-system-access: false\\n    template-loader-path:\\n      - classpath:/templates\\n  mvc:\\n    static-path-pattern: /**\\n    pathmatch:\\n      matching-strategy: ant_path_matcher\\n  resource:\\n    static-locations: classpath:/static/,classpath:/public/\\n  autoconfigure:\\n    exclude:\\n      - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure\\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\\nmybatis-plus:\\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\\n  global-config:\\n    banner: false\\n    db-config:\\n      id-type: ASSIGN_ID\\n      table-underline: true\\n  configuration:\\n    call-setters-on-nulls: true', 'ce1ca3b6f8431e884aed94ab29be43a9', '2024-02-29 09:10:12', '2024-06-11 16:24:11', NULL, '0:0:0:0:0:0:0:1', '', 'efc4e412-b1a1-498f-ba01-b31807649a9a', '', '', '', 'yaml', '', '');\nINSERT INTO `config_info` VALUES (39, 'jeecg-gateway-router.json', 'DEFAULT_GROUP', '[{\\n  \\\"id\\\": \\\"jeecg-system\\\",\\n  \\\"order\\\": 0,\\n  \\\"predicates\\\": [{\\n    \\\"name\\\": \\\"Path\\\",\\n    \\\"args\\\": {\\n      \\\"_genkey_0\\\": \\\"/sys/**\\\",\\n      \\\"_genkey_1\\\": \\\"/jmreport/**\\\",\\n      \\\"_genkey_3\\\": \\\"/online/**\\\",\\n      \\\"_genkey_4\\\": \\\"/generic/**\\\",\\n      \\\"_genkey_5\\\": \\\"/oauth2/**\\\",\\n      \\\"_genkey_6\\\": \\\"/drag/**\\\",\\n      \\\"_genkey_7\\\": \\\"/actuator/**\\\"\\n    }\\n  }],\\n  \\\"filters\\\": [],\\n  \\\"uri\\\": \\\"lb://jeecg-system\\\"\\n}, {\\n  \\\"id\\\": \\\"jeecg-demo\\\",\\n  \\\"order\\\": 1,\\n  \\\"predicates\\\": [{\\n    \\\"name\\\": \\\"Path\\\",\\n    \\\"args\\\": {\\n      \\\"_genkey_0\\\": \\\"/mock/**\\\",\\n      \\\"_genkey_1\\\": \\\"/test/**\\\",\\n      \\\"_genkey_2\\\": \\\"/bigscreen/template1/**\\\",\\n      \\\"_genkey_3\\\": \\\"/bigscreen/template2/**\\\"\\n    }\\n  }],\\n  \\\"filters\\\": [],\\n  \\\"uri\\\": \\\"lb://jeecg-demo\\\"\\n}, {\\n  \\\"id\\\": \\\"jeecg-system-websocket\\\",\\n  \\\"order\\\": 2,\\n  \\\"predicates\\\": [{\\n    \\\"name\\\": \\\"Path\\\",\\n    \\\"args\\\": {\\n      \\\"_genkey_0\\\": \\\"/websocket/**\\\",\\n      \\\"_genkey_1\\\": \\\"/newsWebsocket/**\\\"\\n    }\\n  }],\\n  \\\"filters\\\": [],\\n  \\\"uri\\\": \\\"lb:ws://jeecg-system\\\"\\n}, {\\n  \\\"id\\\": \\\"jeecg-demo-websocket\\\",\\n  \\\"order\\\": 3,\\n  \\\"predicates\\\": [{\\n    \\\"name\\\": \\\"Path\\\",\\n    \\\"args\\\": {\\n      \\\"_genkey_0\\\": \\\"/vxeSocket/**\\\"\\n    }\\n  }],\\n  \\\"filters\\\": [],\\n  \\\"uri\\\": \\\"lb:ws://jeecg-demo\\\"\\n}]', '9794beb09d30bc6b835f2ee870781587', '2024-02-29 09:10:12', '2024-06-11 16:25:56', NULL, '0:0:0:0:0:0:0:1', '', 'efc4e412-b1a1-498f-ba01-b31807649a9a', '', '', '', 'json', '', '');\nINSERT INTO `config_info` VALUES (40, 'jeecg-sharding.yaml', 'DEFAULT_GROUP', 'spring:\\n  shardingsphere:\\n    datasource:\\n      names: ds0\\n      ds0:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        username: root\\n        password: root\\n        type: com.alibaba.druid.pool.DruidDataSource\\n    props:\\n      sql-show: true\\n    rules:\\n      sharding:\\n        binding-tables: sys_log\\n        key-generators:\\n          snowflake:\\n            type: SNOWFLAKE\\n            props:\\n              worker-id: 123\\n        sharding-algorithms:\\n          table-classbased:\\n            props:\\n              strategy: standard\\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n            type: CLASS_BASED\\n        tables:\\n          sys_log:\\n            actual-data-nodes: ds0.sys_log$->{0..1}\\n            table-strategy:\\n              standard:\\n                sharding-algorithm-name: table-classbased\\n                sharding-column: log_type', 'a93fa455c32cd37ca84631d2bbe13005', '2024-02-29 09:10:12', '2024-02-29 09:10:12', NULL, '0:0:0:0:0:0:0:1', '', 'efc4e412-b1a1-498f-ba01-b31807649a9a', '', NULL, NULL, 'yaml', NULL, '');\nINSERT INTO `config_info` VALUES (41, 'jeecg-gateway-dev.yaml', 'DEFAULT_GROUP', 'jeecg:\\n  route:\\n    config:\\n      #type:database nacos yml\\n      data-type: database\\n      data-id: jeecg-gateway-router\\nspring:\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      port: 6379\\n      password:\\nknife4j:\\n  production: false', '19d7cd93eeb85a582c8a6942d499c7f7', '2024-02-29 09:10:12', '2024-06-11 16:26:12', NULL, '0:0:0:0:0:0:0:1', '', 'efc4e412-b1a1-498f-ba01-b31807649a9a', '', '', '', 'yaml', '', '');\nINSERT INTO `config_info` VALUES (42, 'jeecg-sharding-multi.yaml', 'DEFAULT_GROUP', 'spring:\\n  shardingsphere:\\n    datasource:\\n      names: ds0,ds1\\n      ds0:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        type: com.alibaba.druid.pool.DruidDataSource\\n        username: root\\n        password: root\\n      ds1:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot2?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        type: com.alibaba.druid.pool.DruidDataSource\\n        username: root\\n        password: root\\n    props:\\n      sql-show: true\\n    rules:\\n      replica-query:\\n        load-balancers:\\n          round-robin:\\n            type: ROUND_ROBIN\\n            props:\\n              default: 0\\n        data-sources:\\n          prds:\\n            primary-data-source-name: ds0\\n            replica-data-source-names: ds1\\n            load-balancer-name: round_robin\\n      sharding:\\n        binding-tables:\\n          - sys_log\\n        key-generators:\\n          snowflake:\\n            type: SNOWFLAKE\\n            props:\\n              worker-id: 123\\n        sharding-algorithms:\\n          table-classbased:\\n            props:\\n              strategy: standard\\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n            type: CLASS_BASED\\n          database-inline:\\n            type: INLINE\\n            props:\\n              algorithm-expression: ds$->{operate_type % 2}\\n        tables:\\n          sys_log:\\n            actual-data-nodes: ds$->{0..1}.sys_log$->{0..1}\\n            database-strategy:\\n              standard:\\n                sharding-column: operate_type\\n                sharding-algorithm-name: database-inline\\n            table-strategy:\\n              standard:\\n                sharding-algorithm-name: table-classbased\\n                sharding-column: log_type', '0fc2b030ca8c0008f148c84ecbd2a8c7', '2024-02-29 09:10:12', '2024-02-29 09:10:12', NULL, '0:0:0:0:0:0:0:1', '', 'efc4e412-b1a1-498f-ba01-b31807649a9a', '', NULL, NULL, 'yaml', NULL, '');\nINSERT INTO `config_info` VALUES (43, 'jeecg-dev.yaml', 'DEFAULT_GROUP', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n        # sharding-db:\\n        #  driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver\\n        #  url: jdbc:shardingsphere:nacos:sharding.yaml?serverAddr=${spring.cloud.nacos.config.server-addr}&namespace=${spring.cloud.nacos.config.namespace}&group=${spring.cloud.nacos.config.group}\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      password:\\n      port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    locations: classpath:flyway/sql/mysql\\n    clean-disabled: true\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??  \\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: false\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\n  ai-rag:\\n    embed-store:\\n      host: 127.0.0.1\\n      port: 5432\\n      database: postgres\\n      user: postgres\\n      password: postgres\\n      table: embeddings\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', '6759f0f45d7d36981fe677e1d53f3a75', '2024-06-22 15:11:57', '2025-10-14 08:13:43', NULL, '0:0:0:0:0:0:0:1', '', 'springboot3', '', '', '', 'yaml', '', '');\nINSERT INTO `config_info` VALUES (44, 'jeecg.yaml', 'DEFAULT_GROUP', 'server:\\n  tomcat:\\n    max-swallow-size: -1\\n  error:\\n    include-exception: true\\n    include-stacktrace: ALWAYS\\n    include-message: ALWAYS\\n  compression:\\n    enabled: true\\n    min-response-size: 1024\\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\\nmanagement:\\n  health:\\n    mail:\\n      enabled: false\\n  endpoints:\\n    web:\\n      exposure:\\n        include: metrics,httpexchanges,jeecghttptrace\\n    health:\\n      sensitive: true\\n  endpoint:\\n    health:\\n      show-details: ALWAYS\\nspring:\\n  servlet:\\n    multipart:\\n      max-file-size: 10MB\\n      max-request-size: 10MB\\n  mail:\\n    host: smtp.163.com\\n    username: jeecgos@163.com\\n    password: ??\\n    properties:\\n      mail.smtp.timeout: 10000\\n      mail.smtp.connectiontimeout: 10000\\n      mail.smtp.writetimeout: 10000\\n      mail.smtp.auth: true\\n      smtp.ssl.enable: true\\n  quartz:\\n    job-store-type: jdbc\\n    jdbc:\\n      initialize-schema: embedded\\n    auto-startup: false\\n    startup-delay: 1s\\n    overwrite-existing-jobs: true\\n    properties:\\n      org:\\n        quartz:\\n          scheduler:\\n            instanceName: MyScheduler\\n            instanceId: AUTO\\n          jobStore:\\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\\n            tablePrefix: QRTZ_\\n            isClustered: true\\n            misfireThreshold: 12000\\n            clusterCheckinInterval: 15000\\n          threadPool:\\n            class: org.quartz.simpl.SimpleThreadPool\\n            threadCount: 10\\n            threadPriority: 5\\n            threadsInheritContextClassLoaderOfInitializingThread: true\\n  jackson:\\n    date-format: yyyy-MM-dd HH:mm:ss\\n    time-zone: GMT+8\\n  aop:\\n    proxy-target-class: true\\n  jpa:\\n    open-in-view: false\\n  freemarker:\\n    suffix: .ftl\\n    content-type: text/html\\n    charset: UTF-8\\n    cache: false\\n    prefer-file-system-access: false\\n    template-loader-path:\\n      - classpath:/templates\\n  mvc:\\n    static-path-pattern: /**\\n    pathmatch:\\n      matching-strategy: ant_path_matcher\\n  resource:\\n    static-locations: classpath:/static/,classpath:/public/\\n  autoconfigure:\\n    exclude:\\n      - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\\nmybatis-plus:\\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\\n  global-config:\\n    banner: false\\n    db-config:\\n      id-type: ASSIGN_ID\\n      table-underline: true\\n  configuration:\\n    call-setters-on-nulls: true\\nlogging:\\n  level:\\n    org.springframework.context.support.PostProcessorRegistrationDelegate: error\\n    org.flywaydb: debug\\n    org.jeecg.modules.system.mapper: info\\n    org.jeecg.modules.demo.test.mapper: info', '8616567e72566f431d16e122b58a595a', '2024-06-22 15:11:57', '2025-09-25 02:09:22', NULL, '0:0:0:0:0:0:0:1', '', 'springboot3', '', '', '', 'yaml', '', '');\nINSERT INTO `config_info` VALUES (45, 'jeecg-gateway-router.json', 'DEFAULT_GROUP', '[{\\n  \\\"id\\\": \\\"jeecg-system\\\",\\n  \\\"order\\\": 0,\\n  \\\"predicates\\\": [{\\n    \\\"name\\\": \\\"Path\\\",\\n    \\\"args\\\": {\\n      \\\"_genkey_0\\\": \\\"/sys/**\\\",\\n      \\\"_genkey_1\\\": \\\"/jmreport/**\\\",\\n      \\\"_genkey_3\\\": \\\"/online/**\\\",\\n      \\\"_genkey_4\\\": \\\"/generic/**\\\",\\n      \\\"_genkey_5\\\": \\\"/oauth2/**\\\",\\n      \\\"_genkey_6\\\": \\\"/drag/**\\\",\\n      \\\"_genkey_7\\\": \\\"/actuator/**\\\"\\n    }\\n  }],\\n  \\\"filters\\\": [],\\n  \\\"uri\\\": \\\"lb://jeecg-system\\\"\\n}, {\\n  \\\"id\\\": \\\"jeecg-demo\\\",\\n  \\\"order\\\": 1,\\n  \\\"predicates\\\": [{\\n    \\\"name\\\": \\\"Path\\\",\\n    \\\"args\\\": {\\n      \\\"_genkey_0\\\": \\\"/mock/**\\\",\\n      \\\"_genkey_1\\\": \\\"/test/**\\\",\\n      \\\"_genkey_2\\\": \\\"/bigscreen/template1/**\\\",\\n      \\\"_genkey_3\\\": \\\"/bigscreen/template2/**\\\"\\n    }\\n  }],\\n  \\\"filters\\\": [],\\n  \\\"uri\\\": \\\"lb://jeecg-demo\\\"\\n}, {\\n  \\\"id\\\": \\\"jeecg-system-websocket\\\",\\n  \\\"order\\\": 2,\\n  \\\"predicates\\\": [{\\n    \\\"name\\\": \\\"Path\\\",\\n    \\\"args\\\": {\\n      \\\"_genkey_0\\\": \\\"/websocket/**\\\",\\n      \\\"_genkey_1\\\": \\\"/newsWebsocket/**\\\"\\n    }\\n  }],\\n  \\\"filters\\\": [],\\n  \\\"uri\\\": \\\"lb:ws://jeecg-system\\\"\\n}, {\\n  \\\"id\\\": \\\"jeecg-demo-websocket\\\",\\n  \\\"order\\\": 3,\\n  \\\"predicates\\\": [{\\n    \\\"name\\\": \\\"Path\\\",\\n    \\\"args\\\": {\\n      \\\"_genkey_0\\\": \\\"/vxeSocket/**\\\"\\n    }\\n  }],\\n  \\\"filters\\\": [],\\n  \\\"uri\\\": \\\"lb:ws://jeecg-demo\\\"\\n}]', '9794beb09d30bc6b835f2ee870781587', '2024-06-22 15:11:57', '2024-06-22 15:11:57', NULL, '0:0:0:0:0:0:0:1', '', 'springboot3', '', NULL, NULL, 'json', NULL, '');\nINSERT INTO `config_info` VALUES (47, 'jeecg-gateway-dev.yaml', 'DEFAULT_GROUP', 'jeecg:\\n  route:\\n    config:\\n      #type:database nacos yml\\n      data-type: database\\n      data-id: jeecg-gateway-router\\nspring:\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      port: 6379\\n      password:\\nknife4j:\\n  production: false', '19d7cd93eeb85a582c8a6942d499c7f7', '2024-06-22 15:11:57', '2024-06-22 15:11:57', NULL, '0:0:0:0:0:0:0:1', '', 'springboot3', '', NULL, NULL, 'yaml', NULL, '');\nINSERT INTO `config_info` VALUES (52, 'sharding.yaml', 'DEFAULT_GROUP', 'databaseName: sharding-db\\n\\ndataSources:\\n  db_0:\\n    dataSourceClassName: com.zaxxer.hikari.HikariDataSource\\n    driverClassName: com.mysql.cj.jdbc.Driver\\n    jdbcUrl: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n    password: root\\n    username: root\\n\\nrules:\\n  - !SHARDING\\n    tables:\\n      sys_log:\\n        actualDataNodes: db_0.sys_log$->{0..1}\\n        databaseStrategy:\\n          none:\\n        tableStrategy:\\n          standard:\\n            shardingColumn: log_type\\n            shardingAlgorithmName: user_inline\\n        keyGenerateStrategy:\\n          column: id\\n          keyGeneratorName: snowflake\\n    keyGenerators:\\n      snowflake:\\n        type: SNOWFLAKE\\n        props:\\n          worker-id: 123\\n    shardingAlgorithms:\\n      user_inline:\\n        type: INLINE\\n        props:\\n          algorithm-expression: sys_log$->{log_type % 2}\\n\\nprops:\\n  sql-show: true', '8f7816bc3c819f43e52986095edb19eb', '2025-10-14 04:18:26', '2025-10-14 08:05:45', NULL, '0:0:0:0:0:0:0:1', '', 'springboot3', '', '', '', 'yaml', '', '');\n\n-- ----------------------------\n-- Table structure for config_info_aggr\n-- ----------------------------\nDROP TABLE IF EXISTS `config_info_aggr`;\nCREATE TABLE `config_info_aggr`  (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n  `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id',\n  `group_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id',\n  `datum_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'datum_id',\n  `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '内容',\n  `gmt_modified` datetime NOT NULL COMMENT '修改时间',\n  `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,\n  `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT '租户字段',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uk_configinfoaggr_datagrouptenantdatum`(`data_id`, `group_id`, `tenant_id`, `datum_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '增加租户字段' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of config_info_aggr\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for config_info_beta\n-- ----------------------------\nDROP TABLE IF EXISTS `config_info_beta`;\nCREATE TABLE `config_info_beta`  (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n  `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id',\n  `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id',\n  `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'app_name',\n  `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'content',\n  `beta_ips` varchar(1024) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'betaIps',\n  `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'md5',\n  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',\n  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',\n  `src_user` text CHARACTER SET utf8 COLLATE utf8_bin NULL COMMENT 'source user',\n  `src_ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip',\n  `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT '租户字段',\n  `encrypted_data_key` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '加密key',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uk_configinfobeta_datagrouptenant`(`data_id`, `group_id`, `tenant_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = 'config_info_beta' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of config_info_beta\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for config_info_tag\n-- ----------------------------\nDROP TABLE IF EXISTS `config_info_tag`;\nCREATE TABLE `config_info_tag`  (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n  `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id',\n  `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id',\n  `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT 'tenant_id',\n  `tag_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'tag_id',\n  `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'app_name',\n  `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'content',\n  `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'md5',\n  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',\n  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',\n  `src_user` text CHARACTER SET utf8 COLLATE utf8_bin NULL COMMENT 'source user',\n  `src_ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'source ip',\n  `encrypted_data_key` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '加密key',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uk_configinfotag_datagrouptenanttag`(`data_id`, `group_id`, `tenant_id`, `tag_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = 'config_info_tag' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of config_info_tag\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for config_tags_relation\n-- ----------------------------\nDROP TABLE IF EXISTS `config_tags_relation`;\nCREATE TABLE `config_tags_relation`  (\n  `id` bigint(20) NOT NULL COMMENT 'id',\n  `tag_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'tag_name',\n  `tag_type` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'tag_type',\n  `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'data_id',\n  `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'group_id',\n  `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT 'tenant_id',\n  `nid` bigint(20) NOT NULL AUTO_INCREMENT,\n  PRIMARY KEY (`nid`) USING BTREE,\n  UNIQUE INDEX `uk_configtagrelation_configidtag`(`id`, `tag_name`, `tag_type`) USING BTREE,\n  INDEX `idx_tenant_id`(`tenant_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = 'config_tag_relation' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of config_tags_relation\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for group_capacity\n-- ----------------------------\nDROP TABLE IF EXISTS `group_capacity`;\nCREATE TABLE `group_capacity`  (\n  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',\n  `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Group ID，空字符表示整个集群',\n  `quota` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '配额，0表示使用默认值',\n  `usage` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '使用量',\n  `max_size` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '单个配置大小上限，单位为字节，0表示使用默认值',\n  `max_aggr_count` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '聚合子配置最大个数，，0表示使用默认值',\n  `max_aggr_size` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '单个聚合数据的子配置大小上限，单位为字节，0表示使用默认值',\n  `max_history_count` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '最大变更历史数量',\n  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',\n  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uk_group_id`(`group_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '集群、各Group容量信息表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of group_capacity\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for his_config_info\n-- ----------------------------\nDROP TABLE IF EXISTS `his_config_info`;\nCREATE TABLE `his_config_info`  (\n  `id` bigint(20) UNSIGNED NOT NULL,\n  `nid` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,\n  `data_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,\n  `group_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,\n  `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'app_name',\n  `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,\n  `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,\n  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',\n  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',\n  `src_user` text CHARACTER SET utf8 COLLATE utf8_bin NULL,\n  `src_ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,\n  `op_type` char(10) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,\n  `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT '租户字段',\n  `encrypted_data_key` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '加密key',\n  PRIMARY KEY (`nid`) USING BTREE,\n  INDEX `idx_gmt_create`(`gmt_create`) USING BTREE,\n  INDEX `idx_gmt_modified`(`gmt_modified`) USING BTREE,\n  INDEX `idx_did`(`data_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 54 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '多租户改造' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of his_config_info\n-- ----------------------------\nINSERT INTO `his_config_info` VALUES (44, 11, 'jeecg.yaml', 'DEFAULT_GROUP', '', 'server:\\n  undertow:\\n    # max-http-post-size: 10MB\\n    decode-url: true\\n    worker-threads: 16\\n    buffers:\\n      websocket: 8192\\n      io: 16384\\n  error:\\n    include-exception: true\\n    include-stacktrace: ALWAYS\\n    include-message: ALWAYS\\n  compression:\\n    enabled: true\\n    min-response-size: 1024\\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\\nmanagement:\\n  health:\\n    mail:\\n      enabled: false\\n  endpoints:\\n    web:\\n      exposure:\\n        include: metrics,httpexchanges,jeecghttptrace\\n        # include: \\\"*\\\"\\n    health:\\n      sensitive: true\\n  endpoint:\\n    health:\\n      show-details: ALWAYS\\nspring:\\n  servlet:\\n    multipart:\\n      max-file-size: 10MB\\n      max-request-size: 10MB\\n  mail:\\n    host: smtp.163.com\\n    username: jeecgos@163.com\\n    password: ??\\n    properties:\\n      mail:\\n        smtp:\\n          auth: true\\n          starttls:\\n            enable: true\\n            required: true\\n  quartz:\\n    job-store-type: jdbc\\n    initialize-schema: embedded\\n    auto-startup: false\\n    startup-delay: 1s\\n    overwrite-existing-jobs: true\\n    properties:\\n      org:\\n        quartz:\\n          scheduler:\\n            instanceName: MyScheduler\\n            instanceId: AUTO\\n          jobStore:\\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\\n            tablePrefix: QRTZ_\\n            isClustered: true\\n            misfireThreshold: 12000\\n            clusterCheckinInterval: 15000\\n          threadPool:\\n            class: org.quartz.simpl.SimpleThreadPool\\n            threadCount: 10\\n            threadPriority: 5\\n            threadsInheritContextClassLoaderOfInitializingThread: true\\n  jackson:\\n    date-format: yyyy-MM-dd HH:mm:ss\\n    time-zone: GMT+8\\n  aop:\\n    proxy-target-class: true\\n  activiti:\\n    check-process-definitions: false\\n    async-executor-activate: false\\n    job-executor-activate: false\\n  jpa:\\n    open-in-view: false\\n  freemarker:\\n    suffix: .ftl\\n    content-type: text/html\\n    charset: UTF-8\\n    cache: false\\n    prefer-file-system-access: false\\n    template-loader-path:\\n      - classpath:/templates\\n  mvc:\\n    static-path-pattern: /**\\n    pathmatch:\\n      matching-strategy: ant_path_matcher\\n  resource:\\n    static-locations: classpath:/static/,classpath:/public/\\n  autoconfigure:\\n    exclude:\\n      - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\\nmybatis-plus:\\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\\n  global-config:\\n    banner: false\\n    db-config:\\n      id-type: ASSIGN_ID\\n      table-underline: true\\n  configuration:\\n    call-setters-on-nulls: true', 'ee6593a5dbd94d90e841a466e1eee018', '2010-05-05 00:00:00', '2025-09-25 02:09:22', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (43, 12, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,wall,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      password:\\n      port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    locations: classpath:flyway/sql/mysql\\n    clean-disabled: true\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??  \\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: false\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\n  ai-rag:\\n    embed-store:\\n      host: 127.0.0.1\\n      port: 5432\\n      database: postgres\\n      user: postgres\\n      password: postgres\\n      table: embeddings\\nlogging:\\n  level:\\n    org.jeecg.modules.system.mapper : info\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', 'dff588d1a47f42650e691b6621a401a8', '2010-05-05 00:00:00', '2025-09-25 02:09:43', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (2, 13, 'jeecg.yaml', 'DEFAULT_GROUP', '', 'server:\\n  undertow:\\n    decode-url: true\\n    worker-threads: 16\\n    buffers:\\n      websocket: 8192\\n      io: 16384\\n  error:\\n    include-exception: true\\n    include-stacktrace: ALWAYS\\n    include-message: ALWAYS\\n  compression:\\n    enabled: true\\n    min-response-size: 1024\\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\\nmanagement:\\n  health:\\n    mail:\\n      enabled: false\\n  endpoints:\\n    web:\\n      exposure:\\n        include: \\\"*\\\"\\n    health:\\n      sensitive: true\\n  endpoint:\\n    health:\\n      show-details: ALWAYS\\nspring:\\n  servlet:\\n    multipart:\\n      max-file-size: 10MB\\n      max-request-size: 10MB\\n  mail:\\n    host: smtp.163.com\\n    username: jeecgos@163.com\\n    password: ??\\n    properties:\\n      mail:\\n        smtp:\\n          auth: true\\n          starttls:\\n            enable: true\\n            required: true\\n  quartz:\\n    job-store-type: jdbc\\n    initialize-schema: embedded\\n    auto-startup: false\\n    startup-delay: 1s\\n    overwrite-existing-jobs: true\\n    properties:\\n      org:\\n        quartz:\\n          scheduler:\\n            instanceName: MyScheduler\\n            instanceId: AUTO\\n          jobStore:\\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\\n            tablePrefix: QRTZ_\\n            isClustered: true\\n            misfireThreshold: 12000\\n            clusterCheckinInterval: 15000\\n          threadPool:\\n            class: org.quartz.simpl.SimpleThreadPool\\n            threadCount: 10\\n            threadPriority: 5\\n            threadsInheritContextClassLoaderOfInitializingThread: true\\n  jackson:\\n    date-format: yyyy-MM-dd HH:mm:ss\\n    time-zone: GMT+8\\n  aop:\\n    proxy-target-class: true\\n  activiti:\\n    check-process-definitions: false\\n    async-executor-activate: false\\n    job-executor-activate: false\\n  jpa:\\n    open-in-view: false\\n  freemarker:\\n    suffix: .ftl\\n    content-type: text/html\\n    charset: UTF-8\\n    cache: false\\n    prefer-file-system-access: false\\n    template-loader-path:\\n      - classpath:/templates\\n  mvc:\\n    static-path-pattern: /**\\n    pathmatch:\\n      matching-strategy: ant_path_matcher\\n  resource:\\n    static-locations: classpath:/static/,classpath:/public/\\n  autoconfigure:\\n    exclude:\\n      - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure\\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\\nmybatis-plus:\\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\\n  global-config:\\n    banner: false\\n    db-config:\\n      id-type: ASSIGN_ID\\n      table-underline: true\\n  configuration:\\n    call-setters-on-nulls: true', '70bdbfdeb2651673aea0d06ed40b4ac1', '2010-05-05 00:00:00', '2025-09-25 02:11:11', NULL, '0:0:0:0:0:0:0:1', 'U', '', '');\nINSERT INTO `his_config_info` VALUES (1, 14, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,wall,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n  redis:\\n    database: 0\\n    host: jeecg-boot-redis\\n    password:\\n    port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    locations: classpath:flyway/sql/mysql\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys,/sys/sendChangePwdSms,/sys/user/sendChangePhoneSms,/sys/sms,/desform/api/sendVerifyCode\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??\\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: true\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\n  ai-rag:\\n    embed-store:\\n      host: 127.0.0.1\\n      port: 5432\\n      database: postgres\\n      user: postgres\\n      password: postgres\\n      table: embeddings\\nlogging:\\n  level:\\n    org.jeecg.modules.system.mapper : info\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', '68112d529219e88a44245402ccf54676', '2010-05-05 00:00:00', '2025-09-25 02:11:30', NULL, '0:0:0:0:0:0:0:1', 'U', '', '');\nINSERT INTO `his_config_info` VALUES (2, 15, 'jeecg.yaml', 'DEFAULT_GROUP', '', 'server:\\n  tomcat:\\n    max-swallow-size: -1\\n  error:\\n    include-exception: true\\n    include-stacktrace: ALWAYS\\n    include-message: ALWAYS\\n  compression:\\n    enabled: true\\n    min-response-size: 1024\\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\\nmanagement:\\n  health:\\n    mail:\\n      enabled: false\\n  endpoints:\\n    web:\\n      exposure:\\n        include: \\\"*\\\"\\n    health:\\n      sensitive: true\\n  endpoint:\\n    health:\\n      show-details: ALWAYS\\nspring:\\n  servlet:\\n    multipart:\\n      max-file-size: 10MB\\n      max-request-size: 10MB\\n  mail:\\n    host: smtp.163.com\\n    username: jeecgos@163.com\\n    password: ??\\n    properties:\\n      mail.smtp.timeout: 10000\\n      mail.smtp.connectiontimeout: 10000\\n      mail.smtp.writetimeout: 10000\\n      mail.smtp.auth: true\\n      smtp.ssl.enable: true\\n  quartz:\\n    job-store-type: jdbc\\n    jdbc:\\n      initialize-schema: embedded\\n    auto-startup: false\\n    startup-delay: 1s\\n    overwrite-existing-jobs: true\\n    properties:\\n      org:\\n        quartz:\\n          scheduler:\\n            instanceName: MyScheduler\\n            instanceId: AUTO\\n          jobStore:\\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\\n            tablePrefix: QRTZ_\\n            isClustered: true\\n            misfireThreshold: 12000\\n            clusterCheckinInterval: 15000\\n          threadPool:\\n            class: org.quartz.simpl.SimpleThreadPool\\n            threadCount: 10\\n            threadPriority: 5\\n            threadsInheritContextClassLoaderOfInitializingThread: true\\n  jackson:\\n    date-format: yyyy-MM-dd HH:mm:ss\\n    time-zone: GMT+8\\n  aop:\\n    proxy-target-class: true\\n  jpa:\\n    open-in-view: false\\n  freemarker:\\n    suffix: .ftl\\n    content-type: text/html\\n    charset: UTF-8\\n    cache: false\\n    prefer-file-system-access: false\\n    template-loader-path:\\n      - classpath:/templates\\n  mvc:\\n    static-path-pattern: /**\\n    pathmatch:\\n      matching-strategy: ant_path_matcher\\n  resource:\\n    static-locations: classpath:/static/,classpath:/public/\\n  autoconfigure:\\n    exclude:\\n      - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure\\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\\nmybatis-plus:\\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\\n  global-config:\\n    banner: false\\n    db-config:\\n      id-type: ASSIGN_ID\\n      table-underline: true\\n  configuration:\\n    call-setters-on-nulls: true', '286548b8ea234068440aec741ac70ab5', '2010-05-05 00:00:00', '2025-09-25 02:11:45', NULL, '0:0:0:0:0:0:0:1', 'U', '', '');\nINSERT INTO `his_config_info` VALUES (43, 16, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,wall,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      password:\\n      port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    locations: classpath:flyway/sql/mysql\\n    clean-disabled: true\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??  \\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: false\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\n  ai-rag:\\n    embed-store:\\n      host: 127.0.0.1\\n      port: 5432\\n      database: postgres\\n      user: postgres\\n      password: postgres\\n      table: embeddings\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', '4029974c2e8633c0ed5297f223e6a7d6', '2010-05-05 00:00:00', '2025-09-25 02:20:20', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (22, 17, 'jeecg-sharding-multi.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  shardingsphere:\\n    datasource:\\n      names: ds0,ds1\\n      ds0:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        type: com.alibaba.druid.pool.DruidDataSource\\n        username: root\\n        password: root\\n      ds1:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot2?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        type: com.alibaba.druid.pool.DruidDataSource\\n        username: root\\n        password: root\\n    props:\\n      sql-show: true\\n    rules:\\n      replica-query:\\n        load-balancers:\\n          round-robin:\\n            type: ROUND_ROBIN\\n            props:\\n              default: 0\\n        data-sources:\\n          prds:\\n            primary-data-source-name: ds0\\n            replica-data-source-names: ds1\\n            load-balancer-name: round_robin\\n      sharding:\\n        binding-tables:\\n          - sys_log\\n        key-generators:\\n          snowflake:\\n            type: SNOWFLAKE\\n            props:\\n              worker-id: 123\\n        sharding-algorithms:\\n          table-classbased:\\n            props:\\n              strategy: standard\\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n            type: CLASS_BASED\\n          database-inline:\\n            type: INLINE\\n            props:\\n              algorithm-expression: ds$->{operate_type % 2}\\n        tables:\\n          sys_log:\\n            actual-data-nodes: ds$->{0..1}.sys_log$->{0..1}\\n            database-strategy:\\n              standard:\\n                sharding-column: operate_type\\n                sharding-algorithm-name: database-inline\\n            table-strategy:\\n              standard:\\n                sharding-algorithm-name: table-classbased\\n                sharding-column: log_type', '0fc2b030ca8c0008f148c84ecbd2a8c7', '2010-05-05 00:00:00', '2025-10-13 10:24:19', NULL, '0:0:0:0:0:0:0:1', 'U', '', '');\nINSERT INTO `his_config_info` VALUES (48, 18, 'jeecg-sharding-multi.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  shardingsphere:\\n    datasource:\\n      names: ds0,ds1\\n      ds0:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        type: com.alibaba.druid.pool.DruidDataSource\\n        username: root\\n        password: root\\n      ds1:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot2?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        type: com.alibaba.druid.pool.DruidDataSource\\n        username: root\\n        password: root\\n    props:\\n      sql-show: true\\n    rules:\\n      replica-query:\\n        load-balancers:\\n          round-robin:\\n            type: ROUND_ROBIN\\n            props:\\n              default: 0\\n        data-sources:\\n          prds:\\n            primary-data-source-name: ds0\\n            replica-data-source-names: ds1\\n            load-balancer-name: round_robin\\n      sharding:\\n        binding-tables:\\n          - sys_log\\n        key-generators:\\n          snowflake:\\n            type: SNOWFLAKE\\n            props:\\n              worker-id: 123\\n        sharding-algorithms:\\n          table-classbased:\\n            props:\\n              strategy: standard\\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n            type: CLASS_BASED\\n          database-inline:\\n            type: INLINE\\n            props:\\n              algorithm-expression: ds$->{operate_type % 2}\\n        tables:\\n          sys_log:\\n            actual-data-nodes: ds$->{0..1}.sys_log$->{0..1}\\n            database-strategy:\\n              standard:\\n                sharding-column: operate_type\\n                sharding-algorithm-name: database-inline\\n            table-strategy:\\n              standard:\\n                sharding-algorithm-name: table-classbased\\n                sharding-column: log_type', '0fc2b030ca8c0008f148c84ecbd2a8c7', '2010-05-05 00:00:00', '2025-10-13 10:25:04', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (46, 19, 'jeecg-sharding.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  shardingsphere:\\n    datasource:\\n      names: ds0\\n      ds0:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        username: root\\n        password: root\\n        type: com.alibaba.druid.pool.DruidDataSource\\n    props:\\n      sql-show: true\\n    rules:\\n      sharding:\\n        binding-tables: sys_log\\n        key-generators:\\n          snowflake:\\n            type: SNOWFLAKE\\n            props:\\n              worker-id: 123\\n        sharding-algorithms:\\n          table-classbased:\\n            props:\\n              strategy: standard\\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n            type: CLASS_BASED\\n        tables:\\n          sys_log:\\n            actual-data-nodes: ds0.sys_log$->{0..1}\\n            table-strategy:\\n              standard:\\n                sharding-algorithm-name: table-classbased\\n                sharding-column: log_type', 'a93fa455c32cd37ca84631d2bbe13005', '2010-05-05 00:00:00', '2025-10-13 10:54:00', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (48, 20, 'jeecg-sharding-multi.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  shardingsphere:\\n    props:\\n      sql-show: true\\n    datasource:\\n      names: ds0,ds1\\n      ds0:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        type: com.alibaba.druid.pool.DruidDataSource\\n        username: root\\n        password: root\\n      ds1:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot2?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        type: com.alibaba.druid.pool.DruidDataSource\\n        username: root\\n        password: root\\n    props:\\n      sql-show: true\\n    rules:\\n      replica-query:\\n        load-balancers:\\n          round-robin:\\n            type: ROUND_ROBIN\\n            props:\\n              default: 0\\n        data-sources:\\n          prds:\\n            primary-data-source-name: ds0\\n            replica-data-source-names: ds1\\n            load-balancer-name: round_robin\\n      sharding:\\n        binding-tables:\\n          - sys_log\\n        key-generators:\\n          snowflake:\\n            type: SNOWFLAKE\\n            props:\\n              worker-id: 123\\n        sharding-algorithms:\\n          table-classbased:\\n            props:\\n              strategy: standard\\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n            type: CLASS_BASED\\n          database-inline:\\n            type: INLINE\\n            props:\\n              algorithm-expression: ds$->{operate_type % 2}\\n        tables:\\n          sys_log:\\n            actual-data-nodes: ds$->{0..1}.sys_log$->{0..1}\\n            database-strategy:\\n              standard:\\n                sharding-column: operate_type\\n                sharding-algorithm-name: database-inline\\n            table-strategy:\\n              standard:\\n                sharding-algorithm-name: table-classbased\\n                sharding-column: log_type', '9a7d638b28422118eaeaeaf272d72192', '2010-05-05 00:00:00', '2025-10-13 10:54:17', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (22, 21, 'jeecg-sharding-multi.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  shardingsphere:\\n    props:\\n      sql-show: true\\n    datasource:\\n      names: ds0,ds1\\n      ds0:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        type: com.alibaba.druid.pool.DruidDataSource\\n        username: root\\n        password: root\\n      ds1:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot2?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        type: com.alibaba.druid.pool.DruidDataSource\\n        username: root\\n        password: root\\n    props:\\n      sql-show: true\\n    rules:\\n      replica-query:\\n        load-balancers:\\n          round-robin:\\n            type: ROUND_ROBIN\\n            props:\\n              default: 0\\n        data-sources:\\n          prds:\\n            primary-data-source-name: ds0\\n            replica-data-source-names: ds1\\n            load-balancer-name: round_robin\\n      sharding:\\n        binding-tables:\\n          - sys_log\\n        key-generators:\\n          snowflake:\\n            type: SNOWFLAKE\\n            props:\\n              worker-id: 123\\n        sharding-algorithms:\\n          table-classbased:\\n            props:\\n              strategy: standard\\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n            type: CLASS_BASED\\n          database-inline:\\n            type: INLINE\\n            props:\\n              algorithm-expression: ds$->{operate_type % 2}\\n        tables:\\n          sys_log:\\n            actual-data-nodes: ds$->{0..1}.sys_log$->{0..1}\\n            database-strategy:\\n              standard:\\n                sharding-column: operate_type\\n                sharding-algorithm-name: database-inline\\n            table-strategy:\\n              standard:\\n                sharding-algorithm-name: table-classbased\\n                sharding-column: log_type', '9a7d638b28422118eaeaeaf272d72192', '2010-05-05 00:00:00', '2025-10-13 10:54:36', NULL, '0:0:0:0:0:0:0:1', 'U', '', '');\nINSERT INTO `his_config_info` VALUES (46, 22, 'jeecg-sharding.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  shardingsphere:\\n    datasource:\\n      names: ds0\\n      ds0:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        username: root\\n        password: root\\n        type: com.alibaba.druid.pool.DruidDataSource\\n    props:\\n      sql-show: true\\n    rules:\\n      sharding:\\n        binding-tables: sys_log\\n        key-generators:\\n          snowflake:\\n            type: SNOWFLAKE\\n            props:\\n              worker-id: 123\\n        sharding-algorithms:\\n          table-classbased:\\n            props:\\n              strategy: standard\\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n            type: CLASS_BASED\\n        tables:\\n          sys_log:\\n            actual-data-nodes: ds0.sys_log$->{0..1}\\n            table-strategy:\\n              standard:\\n                sharding-algorithm-name: table-classbased\\n                sharding-column: log_type', 'a93fa455c32cd37ca84631d2bbe13005', '2010-05-05 00:00:00', '2025-10-13 11:01:55', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (46, 23, 'jeecg-sharding.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  autoconfigure:\\n    exclude:\\n      - com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration\\n  shardingsphere:\\n    datasource:\\n      names: ds0\\n      ds0:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        username: root\\n        password: root\\n        type: com.alibaba.druid.pool.DruidDataSource\\n    props:\\n      sql-show: true\\n    rules:\\n      sharding:\\n        binding-tables: sys_log\\n        key-generators:\\n          snowflake:\\n            type: SNOWFLAKE\\n            props:\\n              worker-id: 123\\n        sharding-algorithms:\\n          table-classbased:\\n            props:\\n              strategy: standard\\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n            type: CLASS_BASED\\n        tables:\\n          sys_log:\\n            actual-data-nodes: ds0.sys_log$->{0..1}\\n            table-strategy:\\n              standard:\\n                sharding-algorithm-name: table-classbased\\n                sharding-column: log_type', 'cce840f55033903422900a8e3bc4de88', '2010-05-05 00:00:00', '2025-10-13 11:03:38', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (0, 24, 'jeecg-sharding3.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  shardingsphere:\\n    datasource:\\n      names: ds0\\n      ds0:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        username: root\\n        password: root\\n        type: com.alibaba.druid.pool.DruidDataSource\\n    props:\\n      sql-show: true\\n    rules:\\n      sharding:\\n        binding-tables: sys_log\\n        key-generators:\\n          snowflake:\\n            type: SNOWFLAKE\\n            props:\\n              worker-id: 123\\n        sharding-algorithms:\\n          table-classbased:\\n            props:\\n              strategy: standard\\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n            type: CLASS_BASED\\n        tables:\\n          sys_log:\\n            actual-data-nodes: ds0.sys_log$->{0..1}\\n            table-strategy:\\n              standard:\\n                sharding-algorithm-name: table-classbased\\n                sharding-column: log_type', 'a93fa455c32cd37ca84631d2bbe13005', '2010-05-05 00:00:00', '2025-10-13 11:12:06', NULL, '0:0:0:0:0:0:0:1', 'I', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (49, 25, 'jeecg-sharding3.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  shardingsphere:\\n    datasource:\\n      names: ds0\\n      ds0:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        username: root\\n        password: root\\n        type: com.alibaba.druid.pool.DruidDataSource\\n    props:\\n      sql-show: true\\n    rules:\\n      sharding:\\n        binding-tables: sys_log\\n        key-generators:\\n          snowflake:\\n            type: SNOWFLAKE\\n            props:\\n              worker-id: 123\\n        sharding-algorithms:\\n          table-classbased:\\n            props:\\n              strategy: standard\\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n            type: CLASS_BASED\\n        tables:\\n          sys_log:\\n            actual-data-nodes: ds0.sys_log$->{0..1}\\n            table-strategy:\\n              standard:\\n                sharding-algorithm-name: table-classbased\\n                sharding-column: log_type', 'a93fa455c32cd37ca84631d2bbe13005', '2010-05-05 00:00:00', '2025-10-13 11:15:11', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (0, 26, 'jeecg-sharding33.yaml', 'DEFAULT_GROUP', '', 'dataSources:\\n  ds0:\\n    driverClassName: com.mysql.cj.jdbc.Driver\\n    url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n    username: root\\n    password: root\\n    type: com.alibaba.druid.pool.DruidDataSource\\nprops:\\n  sql-show: true\\nrules:\\n  sharding:\\n    binding-tables: sys_log\\n    key-generators:\\n      snowflake:\\n        type: SNOWFLAKE\\n        props:\\n          worker-id: 123\\n    sharding-algorithms:\\n      table-classbased:\\n        props:\\n          strategy: standard\\n          algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n        type: CLASS_BASED\\n    tables:\\n      sys_log:\\n        actual-data-nodes: ds0.sys_log$->{0..1}\\n        table-strategy:\\n          standard:\\n            sharding-algorithm-name: table-classbased\\n            sharding-column: log_type', '8f3db7043f3d60747709b5286e23c62b', '2010-05-05 00:00:00', '2025-10-13 11:40:57', NULL, '0:0:0:0:0:0:0:1', 'I', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (50, 27, 'jeecg-sharding33.yaml', 'DEFAULT_GROUP', '', 'dataSources:\\n  ds0:\\n    driverClassName: com.mysql.cj.jdbc.Driver\\n    url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n    username: root\\n    password: root\\n    type: com.alibaba.druid.pool.DruidDataSource\\nprops:\\n  sql-show: true\\nrules:\\n  sharding:\\n    binding-tables: sys_log\\n    key-generators:\\n      snowflake:\\n        type: SNOWFLAKE\\n        props:\\n          worker-id: 123\\n    sharding-algorithms:\\n      table-classbased:\\n        props:\\n          strategy: standard\\n          algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n        type: CLASS_BASED\\n    tables:\\n      sys_log:\\n        actual-data-nodes: ds0.sys_log$->{0..1}\\n        table-strategy:\\n          standard:\\n            sharding-algorithm-name: table-classbased\\n            sharding-column: log_type', '8f3db7043f3d60747709b5286e23c62b', '2010-05-05 00:00:00', '2025-10-14 02:23:57', NULL, '0:0:0:0:0:0:0:1', 'D', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (49, 28, 'jeecg-sharding3.yaml', 'DEFAULT_GROUP', '', 'dataSources:\\n  ds0:\\n    driverClassName: com.mysql.cj.jdbc.Driver\\n    url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n    username: root\\n    password: root\\n    type: com.alibaba.druid.pool.DruidDataSource\\nprops:\\n  sql-show: true\\nrules:\\n  sharding:\\n    binding-tables: sys_log\\n    key-generators:\\n      snowflake:\\n        type: SNOWFLAKE\\n        props:\\n          worker-id: 123\\n    sharding-algorithms:\\n      table-classbased:\\n        props:\\n          strategy: standard\\n          algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n        type: CLASS_BASED\\n    tables:\\n      sys_log:\\n        actual-data-nodes: ds0.sys_log$->{0..1}\\n        table-strategy:\\n          standard:\\n            sharding-algorithm-name: table-classbased\\n            sharding-column: log_type', '8f3db7043f3d60747709b5286e23c62b', '2010-05-05 00:00:00', '2025-10-14 02:24:05', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (49, 29, 'jeecg-sharding3.yaml', 'DEFAULT_GROUP', '', '# !!!数据源名称要和动态数据源中配置的名称一致\\ndatabaseName: sharding\\n\\n# 具体参看官网文档说明\\ndataSources:\\n  db_0:\\n    dataSourceClassName: com.zaxxer.hikari.HikariDataSource\\n    driverClassName: com.mysql.cj.jdbc.Driver\\n    jdbcUrl: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n    password: root\\n    username: root\\n\\nrules:\\n  - !SHARDING\\n    tables: # 数据分片规则配置\\n      sys_log: # 逻辑表名称\\n        actualDataNodes: db_0.sys_log$->{0..1} # 由数据源名 + 表名组成（参考 Inline 语法规则）\\n        databaseStrategy: # 分库策略，缺省表示使用默认分库策略，以下的分片策略只能选其一\\n          none:\\n        tableStrategy: # 分表策略\\n          standard: # 用于单分片键的标准分片场景\\n            shardingColumn: log_type # 分片列名称\\n            shardingAlgorithmName: user_inline\\n        keyGenerateStrategy:\\n          column: id\\n          keyGeneratorName: snowflake\\n    keyGenerators:\\n      snowflake:\\n        type: SNOWFLAKE\\n        props:\\n          worker-id: 123\\n    # 分片算法配置\\n    shardingAlgorithms:\\n      user_inline:\\n        type: INLINE\\n        props:\\n          algorithm-expression: sys_log$->{log_type % 2}\\n\\nprops:\\n  sql-show: true', '1e0a2bf39629030672a6fe98f7bb4ca3', '2010-05-05 00:00:00', '2025-10-14 02:36:31', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (43, 30, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      password:\\n      port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    locations: classpath:flyway/sql/mysql\\n    clean-disabled: true\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??  \\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: false\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\n  ai-rag:\\n    embed-store:\\n      host: 127.0.0.1\\n      port: 5432\\n      database: postgres\\n      user: postgres\\n      password: postgres\\n      table: embeddings\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', 'db86a793f5e62eb0f1e3478bd0f3520b', '2010-05-05 00:00:00', '2025-10-14 02:48:13', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (43, 31, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n        sharding_db:\\n          driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver\\n          url: jdbc:shardingsphere:classpath:sharding.yaml\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      password:\\n      port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    locations: classpath:flyway/sql/mysql\\n    clean-disabled: true\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??  \\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: false\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\n  ai-rag:\\n    embed-store:\\n      host: 127.0.0.1\\n      port: 5432\\n      database: postgres\\n      user: postgres\\n      password: postgres\\n      table: embeddings\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', '7347845722e84c7009e753324dae8261', '2010-05-05 00:00:00', '2025-10-14 02:53:10', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (49, 32, 'jeecg-sharding3.yaml', 'DEFAULT_GROUP', '', '# !!!数据源名称要和动态数据源中配置的名称一致\\ndatabaseName: sharding\\n\\n# 具体参看官网文档说明\\ndataSources:\\n  db_0:\\n    dataSourceClassName: com.zaxxer.hikari.HikariDataSource\\n    driverClassName: com.mysql.cj.jdbc.Driver\\n    jdbcUrl: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n    password: root\\n    username: root\\n\\nrules:\\n    tables: # 数据分片规则配置\\n      sys_log: # 逻辑表名称\\n        actualDataNodes: db_0.sys_log$->{0..1} # 由数据源名 + 表名组成（参考 Inline 语法规则）\\n        databaseStrategy: # 分库策略，缺省表示使用默认分库策略，以下的分片策略只能选其一\\n          none:\\n        tableStrategy: # 分表策略\\n          standard: # 用于单分片键的标准分片场景\\n            shardingColumn: log_type # 分片列名称\\n            shardingAlgorithmName: user_inline\\n        keyGenerateStrategy:\\n          column: id\\n          keyGeneratorName: snowflake\\n    keyGenerators:\\n      snowflake:\\n        type: SNOWFLAKE\\n        props:\\n          worker-id: 123\\n    # 分片算法配置\\n    shardingAlgorithms:\\n      user_inline:\\n        type: INLINE\\n        props:\\n          algorithm-expression: sys_log$->{log_type % 2}\\n\\nprops:\\n  sql-show: true', 'c5e2972e7d10c10e2d975f51a1c40400', '2010-05-05 00:00:00', '2025-10-14 02:53:19', NULL, '0:0:0:0:0:0:0:1', 'D', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (0, 33, 'nacos-sharding.yaml', 'DEFAULT_GROUP', '', '# !!!数据源名称要和动态数据源中配置的名称一致\\r\\ndatabaseName: sharding_db\\r\\n\\r\\n# 具体参看官网文档说明\\r\\ndataSources:\\r\\n  db_0:\\r\\n    dataSourceClassName: com.zaxxer.hikari.HikariDataSource\\r\\n    driverClassName: com.mysql.cj.jdbc.Driver\\r\\n    jdbcUrl: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\r\\n    password: root\\r\\n    username: root\\r\\n\\r\\nrules:\\r\\n  - !SHARDING\\r\\n    tables: # 数据分片规则配置\\r\\n      sys_log: # 逻辑表名称\\r\\n        actualDataNodes: db_0.sys_log$->{0..1} # 由数据源名 + 表名组成（参考 Inline 语法规则）\\r\\n        databaseStrategy: # 分库策略，缺省表示使用默认分库策略，以下的分片策略只能选其一\\r\\n          none:\\r\\n        tableStrategy: # 分表策略\\r\\n          standard: # 用于单分片键的标准分片场景\\r\\n            shardingColumn: log_type # 分片列名称\\r\\n            shardingAlgorithmName: user_inline\\r\\n        keyGenerateStrategy:\\r\\n          column: id\\r\\n          keyGeneratorName: snowflake\\r\\n    keyGenerators:\\r\\n      snowflake:\\r\\n        type: SNOWFLAKE\\r\\n        props:\\r\\n          worker-id: 123\\r\\n    # 分片算法配置\\r\\n    shardingAlgorithms:\\r\\n      user_inline:\\r\\n        type: INLINE\\r\\n        props:\\r\\n          algorithm-expression: sys_log$->{log_type % 2}\\r\\n\\r\\nprops:\\r\\n  sql-show: true', '7781ded11994d9e1b2230bed606cd8b7', '2010-05-05 00:00:00', '2025-10-14 02:54:17', NULL, '0:0:0:0:0:0:0:1', 'I', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (43, 34, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n        sharding_db:\\n          driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver\\n          url: jdbc:shardingsphere:nacos:sharding.yaml\\n          # url: jdbc:shardingsphere:classpath:sharding.yaml\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      password:\\n      port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    locations: classpath:flyway/sql/mysql\\n    clean-disabled: true\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??  \\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: false\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\n  ai-rag:\\n    embed-store:\\n      host: 127.0.0.1\\n      port: 5432\\n      database: postgres\\n      user: postgres\\n      password: postgres\\n      table: embeddings\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', 'b0643d6374304bd8d1d69d21ed735a9e', '2010-05-05 00:00:00', '2025-10-14 02:54:54', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (43, 35, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n        sharding_db:\\n          driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver\\n          url: jdbc:shardingsphere:nacos:nacos-sharding.yaml\\n          # url: jdbc:shardingsphere:classpath:sharding.yaml\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      password:\\n      port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    locations: classpath:flyway/sql/mysql\\n    clean-disabled: true\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??  \\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: false\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\n  ai-rag:\\n    embed-store:\\n      host: 127.0.0.1\\n      port: 5432\\n      database: postgres\\n      user: postgres\\n      password: postgres\\n      table: embeddings\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', '1055e3565097922e40554ba05cf90a60', '2010-05-05 00:00:00', '2025-10-14 03:25:40', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (43, 36, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      password:\\n      port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    locations: classpath:flyway/sql/mysql\\n    clean-disabled: true\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??  \\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: false\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\n  ai-rag:\\n    embed-store:\\n      host: 127.0.0.1\\n      port: 5432\\n      database: postgres\\n      user: postgres\\n      password: postgres\\n      table: embeddings\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', 'db86a793f5e62eb0f1e3478bd0f3520b', '2010-05-05 00:00:00', '2025-10-14 04:17:26', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (51, 37, 'nacos-sharding.yaml', 'DEFAULT_GROUP', '', '# !!!数据源名称要和动态数据源中配置的名称一致\\r\\ndatabaseName: sharding_db\\r\\n\\r\\n# 具体参看官网文档说明\\r\\ndataSources:\\r\\n  db_0:\\r\\n    dataSourceClassName: com.zaxxer.hikari.HikariDataSource\\r\\n    driverClassName: com.mysql.cj.jdbc.Driver\\r\\n    jdbcUrl: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\r\\n    password: root\\r\\n    username: root\\r\\n\\r\\nrules:\\r\\n  - !SHARDING\\r\\n    tables: # 数据分片规则配置\\r\\n      sys_log: # 逻辑表名称\\r\\n        actualDataNodes: db_0.sys_log$->{0..1} # 由数据源名 + 表名组成（参考 Inline 语法规则）\\r\\n        databaseStrategy: # 分库策略，缺省表示使用默认分库策略，以下的分片策略只能选其一\\r\\n          none:\\r\\n        tableStrategy: # 分表策略\\r\\n          standard: # 用于单分片键的标准分片场景\\r\\n            shardingColumn: log_type # 分片列名称\\r\\n            shardingAlgorithmName: user_inline\\r\\n        keyGenerateStrategy:\\r\\n          column: id\\r\\n          keyGeneratorName: snowflake\\r\\n    keyGenerators:\\r\\n      snowflake:\\r\\n        type: SNOWFLAKE\\r\\n        props:\\r\\n          worker-id: 123\\r\\n    # 分片算法配置\\r\\n    shardingAlgorithms:\\r\\n      user_inline:\\r\\n        type: INLINE\\r\\n        props:\\r\\n          algorithm-expression: sys_log$->{log_type % 2}\\r\\n\\r\\nprops:\\r\\n  sql-show: true', '7781ded11994d9e1b2230bed606cd8b7', '2010-05-05 00:00:00', '2025-10-14 04:17:50', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (43, 38, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n        sharding-db:\\n         driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver\\n         url: jdbc:shardingsphere:nacos:sharding.yaml\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      password:\\n      port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    locations: classpath:flyway/sql/mysql\\n    clean-disabled: true\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??  \\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: false\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\n  ai-rag:\\n    embed-store:\\n      host: 127.0.0.1\\n      port: 5432\\n      database: postgres\\n      user: postgres\\n      password: postgres\\n      table: embeddings\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', '56ad0afc1ba7a9e08b37c58b2e561e67', '2010-05-05 00:00:00', '2025-10-14 04:18:08', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (0, 39, 'sharding.yaml', 'DEFAULT_GROUP', '', '# !!!数据源名称要和动态数据源中配置的名称一致\\ndatabaseName: sharding-db\\n\\n# 具体参看官网文档说明\\ndataSources:\\n  db_0:\\n    dataSourceClassName: com.zaxxer.hikari.HikariDataSource\\n    driverClassName: com.mysql.cj.jdbc.Driver\\n    jdbcUrl: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n    password: root\\n    username: root\\n\\nrules:\\n  - !SHARDING\\n    tables: # 数据分片规则配置\\n      sys_log: # 逻辑表名称\\n        actualDataNodes: db_0.sys_log$->{0..1} # 由数据源名 + 表名组成（参考 Inline 语法规则）\\n        databaseStrategy: # 分库策略，缺省表示使用默认分库策略，以下的分片策略只能选其一\\n          none:\\n        tableStrategy: # 分表策略\\n          standard: # 用于单分片键的标准分片场景\\n            shardingColumn: log_type # 分片列名称\\n            shardingAlgorithmName: user_inline\\n        keyGenerateStrategy:\\n          column: id\\n          keyGeneratorName: snowflake\\n    keyGenerators:\\n      snowflake:\\n        type: SNOWFLAKE\\n        props:\\n          worker-id: 123\\n    # 分片算法配置\\n    shardingAlgorithms:\\n      user_inline:\\n        type: INLINE\\n        props:\\n          algorithm-expression: sys_log$->{log_type % 2}\\n\\nprops:\\n  sql-show: true', '641b4fb3d23568319d543a974917a026', '2010-05-05 00:00:00', '2025-10-14 04:18:26', NULL, '0:0:0:0:0:0:0:1', 'I', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (51, 40, 'nacos-sharding.yaml', 'DEFAULT_GROUP', '', '# !!!数据源名称要和动态数据源中配置的名称一致\\ndatabaseName: sharding-db\\n\\n# 具体参看官网文档说明\\ndataSources:\\n  db_0:\\n    dataSourceClassName: com.zaxxer.hikari.HikariDataSource\\n    driverClassName: com.mysql.cj.jdbc.Driver\\n    jdbcUrl: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n    password: root\\n    username: root\\n\\nrules:\\n  - !SHARDING\\n    tables: # 数据分片规则配置\\n      sys_log: # 逻辑表名称\\n        actualDataNodes: db_0.sys_log$->{0..1} # 由数据源名 + 表名组成（参考 Inline 语法规则）\\n        databaseStrategy: # 分库策略，缺省表示使用默认分库策略，以下的分片策略只能选其一\\n          none:\\n        tableStrategy: # 分表策略\\n          standard: # 用于单分片键的标准分片场景\\n            shardingColumn: log_type # 分片列名称\\n            shardingAlgorithmName: user_inline\\n        keyGenerateStrategy:\\n          column: id\\n          keyGeneratorName: snowflake\\n    keyGenerators:\\n      snowflake:\\n        type: SNOWFLAKE\\n        props:\\n          worker-id: 123\\n    # 分片算法配置\\n    shardingAlgorithms:\\n      user_inline:\\n        type: INLINE\\n        props:\\n          algorithm-expression: sys_log$->{log_type % 2}\\n\\nprops:\\n  sql-show: true', '641b4fb3d23568319d543a974917a026', '2010-05-05 00:00:00', '2025-10-14 04:18:29', NULL, '0:0:0:0:0:0:0:1', 'D', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (43, 41, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n        sharding-db:\\n         driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver\\n         url: jdbc:shardingsphere:nacos:nacos-sharding.yaml\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      password:\\n      port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    locations: classpath:flyway/sql/mysql\\n    clean-disabled: true\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??  \\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: false\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\n  ai-rag:\\n    embed-store:\\n      host: 127.0.0.1\\n      port: 5432\\n      database: postgres\\n      user: postgres\\n      password: postgres\\n      table: embeddings\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', '53f6248077a054db55d2fc4b881c489f', '2010-05-05 00:00:00', '2025-10-14 04:18:41', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (0, 42, 'sharding.yaml', 'DEFAULT_GROUP', '', '# !!!数据源名称要和动态数据源中配置的名称一致\\ndatabaseName: sharding-db\\n\\n# 具体参看官网文档说明\\ndataSources:\\n  db_0:\\n    dataSourceClassName: com.zaxxer.hikari.HikariDataSource\\n    driverClassName: com.mysql.cj.jdbc.Driver\\n    jdbcUrl: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n    password: root\\n    username: root\\n\\nrules:\\n  - !SHARDING\\n    tables: # 数据分片规则配置\\n      sys_log: # 逻辑表名称\\n        actualDataNodes: db_0.sys_log$->{0..1} # 由数据源名 + 表名组成（参考 Inline 语法规则）\\n        databaseStrategy: # 分库策略，缺省表示使用默认分库策略，以下的分片策略只能选其一\\n          none:\\n        tableStrategy: # 分表策略\\n          standard: # 用于单分片键的标准分片场景\\n            shardingColumn: log_type # 分片列名称\\n            shardingAlgorithmName: user_inline\\n        keyGenerateStrategy:\\n          column: id\\n          keyGeneratorName: snowflake\\n    keyGenerators:\\n      snowflake:\\n        type: SNOWFLAKE\\n        props:\\n          worker-id: 123\\n    # 分片算法配置\\n    shardingAlgorithms:\\n      user_inline:\\n        type: INLINE\\n        props:\\n          algorithm-expression: sys_log$->{log_type % 2}\\n\\nprops:\\n  sql-show: true', '641b4fb3d23568319d543a974917a026', '2010-05-05 00:00:00', '2025-10-14 04:33:10', NULL, '0:0:0:0:0:0:0:1', 'I', '', '');\nINSERT INTO `his_config_info` VALUES (53, 43, 'sharding.yaml', 'DEFAULT_GROUP', '', '# !!!数据源名称要和动态数据源中配置的名称一致\\ndatabaseName: sharding-db\\n\\n# 具体参看官网文档说明\\ndataSources:\\n  db_0:\\n    dataSourceClassName: com.zaxxer.hikari.HikariDataSource\\n    driverClassName: com.mysql.cj.jdbc.Driver\\n    jdbcUrl: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n    password: root\\n    username: root\\n\\nrules:\\n  - !SHARDING\\n    tables: # 数据分片规则配置\\n      sys_log: # 逻辑表名称\\n        actualDataNodes: db_0.sys_log$->{0..1} # 由数据源名 + 表名组成（参考 Inline 语法规则）\\n        databaseStrategy: # 分库策略，缺省表示使用默认分库策略，以下的分片策略只能选其一\\n          none:\\n        tableStrategy: # 分表策略\\n          standard: # 用于单分片键的标准分片场景\\n            shardingColumn: log_type # 分片列名称\\n            shardingAlgorithmName: user_inline\\n        keyGenerateStrategy:\\n          column: id\\n          keyGeneratorName: snowflake\\n    keyGenerators:\\n      snowflake:\\n        type: SNOWFLAKE\\n        props:\\n          worker-id: 123\\n    # 分片算法配置\\n    shardingAlgorithms:\\n      user_inline:\\n        type: INLINE\\n        props:\\n          algorithm-expression: sys_log$->{log_type % 2}\\n\\nprops:\\n  sql-show: true', '641b4fb3d23568319d543a974917a026', '2010-05-05 00:00:00', '2025-10-14 05:44:50', NULL, '0:0:0:0:0:0:0:1', 'D', '', '');\nINSERT INTO `his_config_info` VALUES (43, 44, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n        sharding-db:\\n         driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver\\n         url: jdbc:shardingsphere:nacos:sharding.yaml\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      password:\\n      port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    locations: classpath:flyway/sql/mysql\\n    clean-disabled: true\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??  \\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: false\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\n  ai-rag:\\n    embed-store:\\n      host: 127.0.0.1\\n      port: 5432\\n      database: postgres\\n      user: postgres\\n      password: postgres\\n      table: embeddings\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', '56ad0afc1ba7a9e08b37c58b2e561e67', '2010-05-05 00:00:00', '2025-10-14 05:55:59', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (43, 45, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      password:\\n      port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    locations: classpath:flyway/sql/mysql\\n    clean-disabled: true\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??  \\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: false\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\n  ai-rag:\\n    embed-store:\\n      host: 127.0.0.1\\n      port: 5432\\n      database: postgres\\n      user: postgres\\n      password: postgres\\n      table: embeddings\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', 'db86a793f5e62eb0f1e3478bd0f3520b', '2010-05-05 00:00:00', '2025-10-14 06:04:56', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (43, 46, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n        sharding-db:\\n         driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver\\n         url: jdbc:shardingsphere:nacos:sharding.yaml?serverAddr=${sharding.nacos.server-addr}&namespace=${sharding.nacos.namespace}&group=${sharding.nacos.group}\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      password:\\n      port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    locations: classpath:flyway/sql/mysql\\n    clean-disabled: true\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??  \\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: false\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\n  ai-rag:\\n    embed-store:\\n      host: 127.0.0.1\\n      port: 5432\\n      database: postgres\\n      user: postgres\\n      password: postgres\\n      table: embeddings\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', 'c5a434d5258c7951dde9c3e7faba29b4', '2010-05-05 00:00:00', '2025-10-14 06:08:34', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (43, 47, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n        sharding-db:\\n         driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver\\n         url: jdbc:shardingsphere:nacos:sharding.yaml\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      password:\\n      port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    locations: classpath:flyway/sql/mysql\\n    clean-disabled: true\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??  \\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: false\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\n  ai-rag:\\n    embed-store:\\n      host: 127.0.0.1\\n      port: 5432\\n      database: postgres\\n      user: postgres\\n      password: postgres\\n      table: embeddings\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', '56ad0afc1ba7a9e08b37c58b2e561e67', '2010-05-05 00:00:00', '2025-10-14 06:13:21', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (46, 48, 'jeecg-sharding.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  shardingsphere:\\n    datasource:\\n      names: ds0\\n      ds0:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        username: root\\n        password: root\\n        type: com.alibaba.druid.pool.DruidDataSource\\n    props:\\n      sql-show: true\\n    rules:\\n      sharding:\\n        binding-tables: sys_log\\n        key-generators:\\n          snowflake:\\n            type: SNOWFLAKE\\n            props:\\n              worker-id: 123\\n        sharding-algorithms:\\n          table-classbased:\\n            props:\\n              strategy: standard\\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n            type: CLASS_BASED\\n        tables:\\n          sys_log:\\n            actual-data-nodes: ds0.sys_log$->{0..1}\\n            table-strategy:\\n              standard:\\n                sharding-algorithm-name: table-classbased\\n                sharding-column: log_type', 'a93fa455c32cd37ca84631d2bbe13005', '2010-05-05 00:00:00', '2025-10-14 06:15:51', NULL, '0:0:0:0:0:0:0:1', 'D', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (48, 49, 'jeecg-sharding-multi.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  shardingsphere:\\n    datasource:\\n      names: ds0,ds1\\n      ds0:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        type: com.alibaba.druid.pool.DruidDataSource\\n        username: root\\n        password: root\\n      ds1:\\n        driverClassName: com.mysql.cj.jdbc.Driver\\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot2?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n        type: com.alibaba.druid.pool.DruidDataSource\\n        username: root\\n        password: root\\n    props:\\n      sql-show: true\\n    rules:\\n      replica-query:\\n        load-balancers:\\n          round-robin:\\n            type: ROUND_ROBIN\\n            props:\\n              default: 0\\n        data-sources:\\n          prds:\\n            primary-data-source-name: ds0\\n            replica-data-source-names: ds1\\n            load-balancer-name: round_robin\\n      sharding:\\n        binding-tables:\\n          - sys_log\\n        key-generators:\\n          snowflake:\\n            type: SNOWFLAKE\\n            props:\\n              worker-id: 123\\n        sharding-algorithms:\\n          table-classbased:\\n            props:\\n              strategy: standard\\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\\n            type: CLASS_BASED\\n          database-inline:\\n            type: INLINE\\n            props:\\n              algorithm-expression: ds$->{operate_type % 2}\\n        tables:\\n          sys_log:\\n            actual-data-nodes: ds$->{0..1}.sys_log$->{0..1}\\n            database-strategy:\\n              standard:\\n                sharding-column: operate_type\\n                sharding-algorithm-name: database-inline\\n            table-strategy:\\n              standard:\\n                sharding-algorithm-name: table-classbased\\n                sharding-column: log_type', '0fc2b030ca8c0008f148c84ecbd2a8c7', '2010-05-05 00:00:00', '2025-10-14 06:15:54', NULL, '0:0:0:0:0:0:0:1', 'D', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (52, 50, 'sharding.yaml', 'DEFAULT_GROUP', '', '# !!!数据源名称要和动态数据源中配置的名称一致\\ndatabaseName: sharding-db\\n\\n# 具体参看官网文档说明\\ndataSources:\\n  db_0:\\n    dataSourceClassName: com.zaxxer.hikari.HikariDataSource\\n    driverClassName: com.mysql.cj.jdbc.Driver\\n    jdbcUrl: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\\n    password: root\\n    username: root\\n\\nrules:\\n  - !SHARDING\\n    tables: # 数据分片规则配置\\n      sys_log: # 逻辑表名称\\n        actualDataNodes: db_0.sys_log$->{0..1} # 由数据源名 + 表名组成（参考 Inline 语法规则）\\n        databaseStrategy: # 分库策略，缺省表示使用默认分库策略，以下的分片策略只能选其一\\n          none:\\n        tableStrategy: # 分表策略\\n          standard: # 用于单分片键的标准分片场景\\n            shardingColumn: log_type # 分片列名称\\n            shardingAlgorithmName: user_inline\\n        keyGenerateStrategy:\\n          column: id\\n          keyGeneratorName: snowflake\\n    keyGenerators:\\n      snowflake:\\n        type: SNOWFLAKE\\n        props:\\n          worker-id: 123\\n    # 分片算法配置\\n    shardingAlgorithms:\\n      user_inline:\\n        type: INLINE\\n        props:\\n          algorithm-expression: sys_log$->{log_type % 2}\\n\\nprops:\\n  sql-show: true', '641b4fb3d23568319d543a974917a026', '2010-05-05 00:00:00', '2025-10-14 08:05:45', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (43, 51, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n        sharding-db:\\n         driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver\\n         url: jdbc:shardingsphere:nacos:sharding.yaml?serverAddr=${spring.cloud.nacos.config.server-addr}&namespace=${spring.cloud.nacos.config.namespace}&group=${spring.cloud.nacos.config.group}\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      password:\\n      port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    locations: classpath:flyway/sql/mysql\\n    clean-disabled: true\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??  \\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: false\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\n  ai-rag:\\n    embed-store:\\n      host: 127.0.0.1\\n      port: 5432\\n      database: postgres\\n      user: postgres\\n      password: postgres\\n      table: embeddings\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', '4c2bf17d3793f9b950cafd4063b306d3', '2010-05-05 00:00:00', '2025-10-14 08:06:16', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (43, 52, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n        # sharding-db:\\n        #  driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver\\n        #  url: jdbc:shardingsphere:nacos:sharding.yaml?serverAddr=${spring.cloud.nacos.config.server-addr}&namespace=${spring.cloud.nacos.config.namespace}&group=${spring.cloud.nacos.config.group}\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      password:\\n      port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    locations: classpath:flyway/sql/mysql\\n    clean-disabled: true\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??  \\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: false\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\n  ai-rag:\\n    embed-store:\\n      host: 127.0.0.1\\n      port: 5432\\n      database: postgres\\n      user: postgres\\n      password: postgres\\n      table: embeddings\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', '6759f0f45d7d36981fe677e1d53f3a75', '2010-05-05 00:00:00', '2025-10-14 08:10:30', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\nINSERT INTO `his_config_info` VALUES (43, 53, 'jeecg-dev.yaml', 'DEFAULT_GROUP', '', 'spring:\\n  datasource:\\n    druid:\\n      stat-view-servlet:\\n        enabled: true\\n        loginUsername: admin\\n        loginPassword: 123456\\n        allow:\\n      web-stat-filter:\\n        enabled: true\\n    dynamic:\\n      druid:\\n        initial-size: 5\\n        min-idle: 5\\n        maxActive: 20\\n        maxWait: 60000\\n        timeBetweenEvictionRunsMillis: 60000\\n        minEvictableIdleTimeMillis: 300000\\n        validationQuery: SELECT 1 FROM DUAL\\n        testWhileIdle: true\\n        testOnBorrow: false\\n        testOnReturn: false\\n        poolPreparedStatements: true\\n        maxPoolPreparedStatementPerConnectionSize: 20\\n        filters: stat,slf4j\\n        wall:\\n          selectWhereAlwayTrueCheck: false\\n        stat:\\n          merge-sql: true\\n          slow-sql-millis: 5000\\n      datasource:\\n        master:\\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\\n          username: root\\n          password: root\\n          driver-class-name: com.mysql.cj.jdbc.Driver\\n        sharding-db:\\n         driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver\\n         url: jdbc:shardingsphere:nacos:sharding.yaml?serverAddr=${spring.cloud.nacos.config.server-addr}&namespace=${spring.cloud.nacos.config.namespace}&group=${spring.cloud.nacos.config.group}\\n  data:\\n    redis:\\n      database: 0\\n      host: jeecg-boot-redis\\n      password:\\n      port: 6379\\n  rabbitmq:\\n    host: jeecg-boot-rabbitmq\\n    username: guest\\n    password: guest\\n    port: 5672\\n    publisher-confirms: true\\n    publisher-returns: true\\n    virtual-host: /\\n    listener:\\n      simple:\\n        acknowledge-mode: manual\\n        concurrency: 1\\n        max-concurrency: 1\\n        retry:\\n          enabled: true\\n  flyway:\\n    enabled: false\\n    locations: classpath:flyway/sql/mysql\\n    clean-disabled: true\\nminidao:\\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\\njeecg:\\n  firewall:\\n    dataSourceSafe: false\\n    lowCodeMode: dev\\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\\n  uploadType: local\\n  domainUrl:\\n    pc: http://localhost:3100\\n    app: http://localhost:8051\\n  path:\\n    upload: /opt/upFiles\\n    webapp: /opt/webapp\\n  shiro:\\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\\n  oss:\\n    endpoint: oss-cn-beijing.aliyuncs.com\\n    accessKey: ??\\n    secretKey: ??\\n    bucketName: jeecgdev\\n    staticDomain: ??  \\n  file-view-domain: 127.0.0.1:8012\\n  minio:\\n    minio_url: http://minio.jeecg.com\\n    minio_name: ??\\n    minio_pass: ??\\n    bucketName: otatest\\n  jmreport:\\n    saasMode:\\n    firewall:\\n      dataSourceSafe: false\\n      lowCodeMode: dev\\n  wps:\\n    domain: https://wwo.wps.cn/office/\\n    appid: ??\\n    appsecret: ??\\n  xxljob:\\n    enabled: false\\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\\n    appname: ${spring.application.name}\\n    accessToken: \\'\\'\\n    logPath: logs/jeecg/job/jobhandler/\\n    logRetentionDays: 30\\n  redisson:\\n    address: jeecg-boot-redis:6379\\n    password:\\n    type: STANDALONE\\n    enabled: true\\n  ai-chat:\\n    enabled: false\\n    apiKey: \\\"？？？？\\\"\\n    apiHost: \\\"https://api.openai.com\\\"\\n    timeout: 60\\n  ai-rag:\\n    embed-store:\\n      host: 127.0.0.1\\n      port: 5432\\n      database: postgres\\n      user: postgres\\n      password: postgres\\n      table: embeddings\\ncas:\\n  prefixUrl: http://localhost:8888/cas\\nknife4j:\\n  production: false\\n  basic:\\n    enable: false\\n    username: jeecg\\n    password: jeecg1314\\njustauth:\\n  enabled: true\\n  type:\\n    GITHUB:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\\n    WECHAT_ENTERPRISE:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\\n      agent-id: ??\\n    DINGTALK:\\n      client-id: ??\\n      client-secret: ??\\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\\n  cache:\\n    type: default\\n    prefix: \\'demo::\\'\\n    timeout: 1h\\nthird-app:\\n  enabled: false\\n  type:\\n    WECHAT_ENTERPRISE:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??\\n    DINGTALK:\\n      enabled: false\\n      client-id: ??\\n      client-secret: ??\\n      agent-id: ??', '4c2bf17d3793f9b950cafd4063b306d3', '2010-05-05 00:00:00', '2025-10-14 08:13:43', NULL, '0:0:0:0:0:0:0:1', 'U', 'springboot3', '');\n\n-- ----------------------------\n-- Table structure for permissions\n-- ----------------------------\nDROP TABLE IF EXISTS `permissions`;\nCREATE TABLE `permissions`  (\n  `role` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `resource` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `action` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  UNIQUE INDEX `uk_role_permission`(`role`, `resource`, `action`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of permissions\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for roles\n-- ----------------------------\nDROP TABLE IF EXISTS `roles`;\nCREATE TABLE `roles`  (\n  `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `role` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  UNIQUE INDEX `uk_username_role`(`username`, `role`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of roles\n-- ----------------------------\nINSERT INTO `roles` VALUES ('nacos', 'ROLE_ADMIN');\n\n-- ----------------------------\n-- Table structure for tenant_capacity\n-- ----------------------------\nDROP TABLE IF EXISTS `tenant_capacity`;\nCREATE TABLE `tenant_capacity`  (\n  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',\n  `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Tenant ID',\n  `quota` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '配额，0表示使用默认值',\n  `usage` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '使用量',\n  `max_size` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '单个配置大小上限，单位为字节，0表示使用默认值',\n  `max_aggr_count` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '聚合子配置最大个数',\n  `max_aggr_size` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '单个聚合数据的子配置大小上限，单位为字节，0表示使用默认值',\n  `max_history_count` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '最大变更历史数量',\n  `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',\n  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uk_tenant_id`(`tenant_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '租户容量信息表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of tenant_capacity\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for tenant_info\n-- ----------------------------\nDROP TABLE IF EXISTS `tenant_info`;\nCREATE TABLE `tenant_info`  (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n  `kp` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'kp',\n  `tenant_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT 'tenant_id',\n  `tenant_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '' COMMENT 'tenant_name',\n  `tenant_desc` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'tenant_desc',\n  `create_source` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'create_source',\n  `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',\n  `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `uk_tenant_info_kptenantid`(`kp`, `tenant_id`) USING BTREE,\n  INDEX `idx_tenant_id`(`tenant_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = 'tenant_info' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of tenant_info\n-- ----------------------------\nINSERT INTO `tenant_info` VALUES (3, '1', 'springboot3', 'springboot3', 'springboot3版本配置文件，与springboot2有很大区别', 'nacos', 1719069088146, 1719069195885);\n\n-- ----------------------------\n-- Table structure for users\n-- ----------------------------\nDROP TABLE IF EXISTS `users`;\nCREATE TABLE `users`  (\n  `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `password` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `enabled` tinyint(1) NOT NULL,\n  PRIMARY KEY (`username`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of users\n-- ----------------------------\nINSERT INTO `users` VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', 1);\n\nSET FOREIGN_KEY_CHECKS = 1;"
  },
  {
    "path": "jeecg-boot/db/tables_xxl_job.sql",
    "content": "#\n# XXL-JOB v2.4.0\n# Copyright (c) 2015-present, xuxueli.\n\nCREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_general_ci;\nuse `xxl_job`;\n\n/*\n Navicat Premium Data Transfer\n\n Source Server         : mysql5.7\n Source Server Type    : MySQL\n Source Server Version : 50738 (5.7.38)\n Source Host           : 127.0.0.1:3306\n Source Schema         : xxl_job\n\n Target Server Type    : MySQL\n Target Server Version : 50738 (5.7.38)\n File Encoding         : 65001\n\n Date: 10/02/2025 13:49:31\n*/\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- Table structure for xxl_job_group\n-- ----------------------------\nDROP TABLE IF EXISTS `xxl_job_group`;\nCREATE TABLE `xxl_job_group`  (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `app_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '执行器AppName',\n  `title` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '执行器名称',\n  `address_type` tinyint(4) NOT NULL DEFAULT 0 COMMENT '执行器地址类型：0=自动注册、1=手动录入',\n  `address_list` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '执行器地址列表，多地址逗号分隔',\n  `update_time` datetime NULL DEFAULT NULL,\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of xxl_job_group\n-- ----------------------------\nINSERT INTO `xxl_job_group` VALUES (1, 'xxl-job-executor-sample', '示例执行器', 0, NULL, '2025-02-10 13:49:04');\nINSERT INTO `xxl_job_group` VALUES (2, 'jeecg-demo', '测试Demo模块', 0, NULL, '2025-02-10 13:49:04');\nINSERT INTO `xxl_job_group` VALUES (3, 'jeecg-system', '系统System模块', 0, NULL, '2025-02-10 13:49:04');\n\n-- ----------------------------\n-- Table structure for xxl_job_info\n-- ----------------------------\nDROP TABLE IF EXISTS `xxl_job_info`;\nCREATE TABLE `xxl_job_info`  (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `job_group` int(11) NOT NULL COMMENT '执行器主键ID',\n  `job_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `add_time` datetime NULL DEFAULT NULL,\n  `update_time` datetime NULL DEFAULT NULL,\n  `author` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '作者',\n  `alarm_email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '报警邮件',\n  `schedule_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'NONE' COMMENT '调度类型',\n  `schedule_conf` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '调度配置，值含义取决于调度类型',\n  `misfire_strategy` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'DO_NOTHING' COMMENT '调度过期策略',\n  `executor_route_strategy` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器路由策略',\n  `executor_handler` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器任务handler',\n  `executor_param` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器任务参数',\n  `executor_block_strategy` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '阻塞处理策略',\n  `executor_timeout` int(11) NOT NULL DEFAULT 0 COMMENT '任务执行超时时间，单位秒',\n  `executor_fail_retry_count` int(11) NOT NULL DEFAULT 0 COMMENT '失败重试次数',\n  `glue_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'GLUE类型',\n  `glue_source` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT 'GLUE源代码',\n  `glue_remark` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'GLUE备注',\n  `glue_updatetime` datetime NULL DEFAULT NULL COMMENT 'GLUE更新时间',\n  `child_jobid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '子任务ID，多个逗号分隔',\n  `trigger_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '调度状态：0-停止，1-运行',\n  `trigger_last_time` bigint(13) NOT NULL DEFAULT 0 COMMENT '上次调度时间',\n  `trigger_next_time` bigint(13) NOT NULL DEFAULT 0 COMMENT '下次调度时间',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of xxl_job_info\n-- ----------------------------\nINSERT INTO `xxl_job_info` VALUES (1, 1, '测试任务1', '2018-11-03 22:21:31', '2024-08-21 22:30:30', 'XXL', '', 'CRON', '0 0 0 * * ? *', 'DO_NOTHING', 'FIRST', 'demoJob', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', '', 1, 1729353600000, 1739203200000);\nINSERT INTO `xxl_job_info` VALUES (2, 3, '测试jeecg xxljob', '2024-08-21 22:41:10', '2024-08-21 22:41:30', 'JEECG', '', 'CRON', '* * * * * ?', 'DO_NOTHING', 'FIRST', 'demoJob', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2024-08-21 22:41:10', '', 1, 1739166572000, 1739166573000);\n\n-- ----------------------------\n-- Table structure for xxl_job_lock\n-- ----------------------------\nDROP TABLE IF EXISTS `xxl_job_lock`;\nCREATE TABLE `xxl_job_lock`  (\n  `lock_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '锁名称',\n  PRIMARY KEY (`lock_name`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of xxl_job_lock\n-- ----------------------------\nINSERT INTO `xxl_job_lock` VALUES ('schedule_lock');\n\n-- ----------------------------\n-- Table structure for xxl_job_log\n-- ----------------------------\nDROP TABLE IF EXISTS `xxl_job_log`;\nCREATE TABLE `xxl_job_log`  (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `job_group` int(11) NOT NULL COMMENT '执行器主键ID',\n  `job_id` int(11) NOT NULL COMMENT '任务，主键ID',\n  `executor_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器地址，本次执行的地址',\n  `executor_handler` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器任务handler',\n  `executor_param` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器任务参数',\n  `executor_sharding_param` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器任务分片参数，格式如 1/2',\n  `executor_fail_retry_count` int(11) NOT NULL DEFAULT 0 COMMENT '失败重试次数',\n  `trigger_time` datetime NULL DEFAULT NULL COMMENT '调度-时间',\n  `trigger_code` int(11) NOT NULL COMMENT '调度-结果',\n  `trigger_msg` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '调度-日志',\n  `handle_time` datetime NULL DEFAULT NULL COMMENT '执行-时间',\n  `handle_code` int(11) NOT NULL COMMENT '执行-状态',\n  `handle_msg` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '执行-日志',\n  `alarm_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '告警状态：0-默认、1-无需告警、2-告警成功、3-告警失败',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `I_trigger_time`(`trigger_time`) USING BTREE,\n  INDEX `I_handle_code`(`handle_code`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 6761 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of xxl_job_log\n-- ----------------------------\nINSERT INTO `xxl_job_log` VALUES (6618, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:09', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6619, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:10', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6620, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:11', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6621, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:12', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6622, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:13', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6623, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:14', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6624, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:15', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6625, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:16', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6626, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:17', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6627, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:18', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6628, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:19', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6629, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:20', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6630, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:21', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6631, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:22', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6632, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:23', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6633, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:24', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6634, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:25', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6635, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:26', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6636, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:27', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6637, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:28', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6638, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:29', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6639, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:30', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6640, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:31', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6641, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:32', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6642, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:33', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6643, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:34', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6644, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:35', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6645, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:36', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6646, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:37', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6647, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:38', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6648, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:39', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6649, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:40', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6650, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:41', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6651, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:42', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6652, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:43', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6653, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:44', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6654, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:45', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6655, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:46', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6656, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:47', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6657, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:48', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6658, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:49', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6659, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:50', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6660, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:51', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6661, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:52', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6662, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:53', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6663, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:54', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6664, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:55', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6665, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:56', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6666, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:57', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6667, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:58', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6668, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:59', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6669, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:00', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6670, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:01', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6671, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:02', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6672, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:03', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6673, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:04', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6674, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:05', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6675, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:06', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6676, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:07', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6677, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:08', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6678, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:09', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6679, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:10', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6680, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:11', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6681, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:12', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6682, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:13', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6683, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:14', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6684, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:15', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6685, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:16', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6686, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:17', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6687, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:18', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6688, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:19', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6689, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:20', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6690, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:21', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6691, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:22', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6692, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:23', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6693, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:24', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6694, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:25', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6695, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:26', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6696, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:27', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6697, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:28', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6698, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:29', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6699, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:30', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6700, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:31', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6701, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:32', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6702, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:33', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6703, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:34', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6704, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:35', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6705, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:36', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6706, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:37', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6707, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:38', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6708, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:39', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6709, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:40', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6710, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:41', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6711, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:42', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6712, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:43', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6713, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:44', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6714, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:45', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6715, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:46', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6716, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:47', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6717, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:48', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6718, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:49', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6719, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:50', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6720, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:51', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6721, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:52', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6722, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:53', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6723, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:54', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6724, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:55', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6725, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:56', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6726, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:57', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6727, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:58', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6728, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:59', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6729, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:00', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6730, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:01', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6731, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:02', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6732, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:03', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6733, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:04', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6734, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:05', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6735, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:06', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6736, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:07', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6737, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:08', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6738, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:09', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6739, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:10', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6740, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:11', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6741, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:12', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6742, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:13', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6743, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:14', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6744, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:15', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6745, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:16', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6746, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:17', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6747, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:18', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6748, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:19', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6749, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:20', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6750, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:21', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6751, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:22', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6752, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:23', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6753, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:24', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6754, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:25', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 0);\nINSERT INTO `xxl_job_log` VALUES (6755, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:26', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 0);\nINSERT INTO `xxl_job_log` VALUES (6756, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:27', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 0);\nINSERT INTO `xxl_job_log` VALUES (6757, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:28', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 0);\nINSERT INTO `xxl_job_log` VALUES (6758, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:29', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 0);\nINSERT INTO `xxl_job_log` VALUES (6759, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:30', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 0);\nINSERT INTO `xxl_job_log` VALUES (6760, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:31', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 0);\n\n-- ----------------------------\n-- Table structure for xxl_job_log_report\n-- ----------------------------\nDROP TABLE IF EXISTS `xxl_job_log_report`;\nCREATE TABLE `xxl_job_log_report`  (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `trigger_day` datetime NULL DEFAULT NULL COMMENT '调度-时间',\n  `running_count` int(11) NOT NULL DEFAULT 0 COMMENT '运行中-日志数量',\n  `suc_count` int(11) NOT NULL DEFAULT 0 COMMENT '执行成功-日志数量',\n  `fail_count` int(11) NOT NULL DEFAULT 0 COMMENT '执行失败-日志数量',\n  `update_time` datetime NULL DEFAULT NULL,\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `i_trigger_day`(`trigger_day`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of xxl_job_log_report\n-- ----------------------------\nINSERT INTO `xxl_job_log_report` VALUES (1, '2024-08-21 00:00:00', 70, 0, 5, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (2, '2024-08-20 00:00:00', 0, 0, 0, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (3, '2024-08-19 00:00:00', 0, 0, 0, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (4, '2024-09-10 00:00:00', 0, 0, 56, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (5, '2024-09-09 00:00:00', 0, 0, 0, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (6, '2024-09-08 00:00:00', 0, 0, 0, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (7, '2024-10-19 00:00:00', 0, 0, 6391, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (8, '2024-10-18 00:00:00', 0, 0, 0, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (9, '2024-10-17 00:00:00', 0, 0, 0, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (10, '2025-02-10 00:00:00', 0, 0, 116, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (11, '2025-02-09 00:00:00', 0, 0, 0, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (12, '2025-02-08 00:00:00', 0, 0, 0, NULL);\n\n-- ----------------------------\n-- Table structure for xxl_job_logglue\n-- ----------------------------\nDROP TABLE IF EXISTS `xxl_job_logglue`;\nCREATE TABLE `xxl_job_logglue`  (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `job_id` int(11) NOT NULL COMMENT '任务，主键ID',\n  `glue_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'GLUE类型',\n  `glue_source` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT 'GLUE源代码',\n  `glue_remark` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'GLUE备注',\n  `add_time` datetime NULL DEFAULT NULL,\n  `update_time` datetime NULL DEFAULT NULL,\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of xxl_job_logglue\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for xxl_job_registry\n-- ----------------------------\nDROP TABLE IF EXISTS `xxl_job_registry`;\nCREATE TABLE `xxl_job_registry`  (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `registry_group` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `registry_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `registry_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `update_time` datetime NULL DEFAULT NULL,\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `i_g_k_v`(`registry_group`, `registry_key`, `registry_value`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of xxl_job_registry\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for xxl_job_user\n-- ----------------------------\nDROP TABLE IF EXISTS `xxl_job_user`;\nCREATE TABLE `xxl_job_user`  (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '账号',\n  `password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码',\n  `role` tinyint(4) NOT NULL COMMENT '角色：0-普通用户、1-管理员',\n  `permission` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限：执行器ID列表，多个逗号分割',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `i_username`(`username`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of xxl_job_user\n-- ----------------------------\nINSERT INTO `xxl_job_user` VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL);\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n"
  },
  {
    "path": "jeecg-boot/db/其他数据库脚本/oracle11g dmp说明.txt",
    "content": "oracle导出编码：  export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK\n\n导出用户：  jeecgbootos\n\n导入命令：  imp scott/tiger@orcl file=jeecgboot-oracle11g.dmp"
  },
  {
    "path": "jeecg-boot/db/版本升级说明.md",
    "content": "# 版本升级方法\n\n> JeecgBoot属于平台级产品，每次升级改动较大，目前做不到平滑升级。\n\n### 增量升级方案\n\n#### 1.代码合并\n 本地通过svn或git做好主干，在分支上做业务开发，jeecg每次版本发布，可以手工覆盖主干的代码，对比合并代码；\n\n#### 2.数据库升级\n- 从3.6.2+版本增加flyway自动升级数据库机制，支持 mysql5.7、mysql8; \n- 其他库请手工执行SQL, 目录： `jeecg-module-system\\jeecg-system-start\\src\\main\\resources\\flyway\\sql\\mysql`\n> 注意： 升级sql只提供mysql版本；如果有权限升级, 还需要手工角色授权，退出重新登录才好使。\n\n#### 3.其他数据库脚本说明\n  原先官方默认提供oracle和SqlServer的脚本，但是维护成本太高，未提供脚本的数据库，可以参考下面的文档自己转\n   https://my.oschina.net/jeecg/blog/4905722\n   （注意：定时任务的表qrtz_*，需要删掉用原始的脚本重新执行一下）\n   quartz-2.2.3-distribution.tar.gz放到百度网盘中，大家自己下载，执行所需数据库脚本\n   https://pan.baidu.com/s/1WrmZdUuAPg3iBwJ-LoHWyg?pwd=8mdz \n\n#### 4.兼容问题\n 每次发版，会针对不兼容地方重点说明。"
  },
  {
    "path": "jeecg-boot/docker-compose.yml",
    "content": "version: '2'\nservices:\n  jeecg-boot-mysql:\n    build:\n      context: ./db\n    environment:\n      MYSQL_ROOT_PASSWORD: root\n      MYSQL_ROOT_HOST: '%'\n      TZ: Asia/Shanghai\n    restart: always\n    container_name: jeecg-boot-mysql\n    image: jeecg-boot-mysql\n    command:\n      --character-set-server=utf8mb4\n      --collation-server=utf8mb4_general_ci\n      --explicit_defaults_for_timestamp=true\n      --lower_case_table_names=1\n      --max_allowed_packet=128M\n      --default-authentication-plugin=caching_sha2_password\n    ports:\n      - 13306:3306\n    networks:\n      - jeecg-boot\n\n  jeecg-boot-redis:\n    image: registry.cn-hangzhou.aliyuncs.com/jeecgdocker/redis:5.0\n#    ports:\n#      - 6379:6379\n    restart: always\n    hostname: jeecg-boot-redis\n    container_name: jeecg-boot-redis\n    networks:\n      - jeecg-boot\n\n  jeecg-boot-pgvector:\n    image: registry.cn-hangzhou.aliyuncs.com/jeecgdocker/pgvector\n    container_name: jeecg-boot-pgvector\n    environment:\n      POSTGRES_USER: postgres\n      POSTGRES_PASSWORD: postgres\n      POSTGRES_DB: vector_db\n#    ports:\n#      - 5432:5432\n    restart: always\n    networks:\n      - jeecg-boot\n  \n#  jeecg-boot-rabbitmq:\n#    image: rabbitmq:3.7.7-management\n##    ports:\n##      - 5672:5672\n##      - 15672:15672\n#    restart: always\n#    container_name: jeecg-boot-rabbitmq\n#    hostname: jeecg-boot-rabbitmq\n#    environment:\n#      RABBITMQ_DEFAULT_USER: guest\n#      RABBITMQ_DEFAULT_PASS: guest\n#    networks:\n#      - jeecg-boot\n\n  jeecg-boot-system:\n    build:\n      context: ./jeecg-module-system/jeecg-system-start\n    restart: on-failure\n    mac_address: 02:42:ac:11:00:02\n    depends_on:\n      - jeecg-boot-mysql\n      - jeecg-boot-redis\n    container_name: jeecg-boot-system\n    image: jeecg-boot-system\n    hostname: jeecg-boot-system\n    ports:\n      - 8080:8080\n    networks:\n      - jeecg-boot\n    volumes:\n      - ./config:/jeecg-boot/config\n\nnetworks:\n  jeecg-boot:\n    name: jeecg_boot\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<parent>\n\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t<artifactId>jeecg-boot-parent</artifactId>\n\t\t<version>3.9.1</version>\n\t</parent>\n\t<modelVersion>4.0.0</modelVersion>\n\t<artifactId>jeecg-boot-base-core</artifactId>\n\n\t<repositories>\n\t\t<repository>\n\t\t\t<id>aliyun</id>\n\t\t\t<name>aliyun Repository</name>\n\t\t\t<url>https://maven.aliyun.com/repository/public</url>\n\t\t\t<snapshots>\n\t\t\t\t<enabled>false</enabled>\n\t\t\t</snapshots>\n\t\t</repository>\n\t\t<repository>\n\t\t\t<id>jeecg</id>\n\t\t\t<name>jeecg Repository</name>\n\t\t\t<url>https://maven.jeecg.org/nexus/content/repositories/jeecg</url>\n\t\t\t<snapshots>\n\t\t\t\t<enabled>false</enabled>\n\t\t\t</snapshots>\n\t\t</repository>\n\t\t<repository>\n\t\t\t<id>jeecg-snapshots</id>\n\t\t\t<name>jeecg-snapshots Repository</name>\n\t\t\t<url>https://oss.sonatype.org/content/repositories/snapshots</url>\n\t\t\t<releases>\n\t\t\t\t<enabled>false</enabled>\n\t\t\t</releases>\n\t\t\t<snapshots>\n\t\t\t\t<enabled>true</enabled>\n\t\t\t</snapshots>\n\t\t</repository>\n\t</repositories>\n\t\n\t<dependencies>\n\t\t<!--jeecg-tools-->\n\t\t<dependency>\n\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t<artifactId>jeecg-boot-common</artifactId>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>commons-logging</groupId>\n\t\t\t\t\t<artifactId>commons-logging</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t\t<!--集成springmvc框架并实现自动配置 -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<!-- websocket -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-websocket</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-mail</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-aop</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-actuator</artifactId>\n\t\t</dependency>\n\t\t<!--springboot2.3+ 需引入validation对应的包-->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-validation</artifactId>\n\t\t</dependency>\n\t\t<!--springboot2.6+解决metrics端点不显示jvm信息的问题-->\n\t\t<dependency>\n\t\t\t<groupId>io.micrometer</groupId>\n\t\t\t<artifactId>micrometer-registry-prometheus</artifactId>\n\t\t</dependency>\n\n\t\t<!-- commons -->\n\t\t<dependency>\n\t\t\t<groupId>commons-io</groupId>\n\t\t\t<artifactId>commons-io</artifactId>\n\t\t\t<version>${commons-io.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>commons-lang</groupId>\n\t\t\t<artifactId>commons-lang</artifactId>\n\t\t\t<version>${commons.version}</version>\n\t\t</dependency>\n\t\t<!-- freemarker -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-freemarker</artifactId>\n\t\t</dependency>\n\n\t\t<!-- mybatis-plus -->\n\t\t<dependency>\n\t\t\t<groupId>com.baomidou</groupId>\n\t\t\t<artifactId>mybatis-plus-spring-boot3-starter</artifactId>\n\t\t\t<version>${mybatis-plus.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.baomidou</groupId>\n\t\t\t<artifactId>mybatis-plus-jsqlparser-4.9</artifactId>\n\t\t\t<version>${mybatis-plus.version}</version>\n\t\t</dependency>\n\t\t<!-- minidao -->\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>minidao-spring-boot-starter-jsqlparser-4.9</artifactId>\n        </dependency>\n\n\t\t<!-- druid -->\n\t\t<dependency>\n\t\t\t<groupId>com.alibaba</groupId>\n\t\t\t<artifactId>druid-spring-boot-3-starter</artifactId>\n\t\t\t<version>${druid.version}</version>\n\t\t</dependency>\n\n\t\t<!-- 动态数据源 -->\n\t\t<dependency>\n\t\t\t<groupId>com.baomidou</groupId>\n\t\t\t<artifactId>dynamic-datasource-spring-boot3-starter</artifactId>\n\t\t\t<version>${dynamic-datasource-spring-boot-starter.version}</version>\n\t\t</dependency>\n\n\t\t<!-- 数据库驱动 -->\n\t\t<!--mysql-->\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t\t<version>${mysql-connector-java.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\t\t<!--  sqlserver-->\n\t\t<dependency>\n\t\t\t<groupId>com.microsoft.sqlserver</groupId>\n\t\t\t<artifactId>mssql-jdbc</artifactId>\n\t\t\t<version>${sqljdbc4.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\t\t<!-- oracle驱动 -->\n\t\t<dependency>\n\t\t\t<groupId>com.oracle</groupId>\n\t\t\t<artifactId>ojdbc6</artifactId>\n\t\t\t<version>${ojdbc6.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\t\t<!-- postgresql驱动 -->\n\t\t<dependency>\n\t\t\t<groupId>org.postgresql</groupId>\n\t\t\t<artifactId>postgresql</artifactId>\n\t\t\t<version>${postgresql.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\t\t<!--人大金仓驱动 版本号V008R006C005B0013 -->\n\t\t<dependency>\n\t\t\t<groupId>org.jeecgframework</groupId>\n\t\t\t<artifactId>kingbase8</artifactId>\n\t\t\t<version>${kingbase8.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\t\t<!--达梦数据库驱动 版本号1-3-26-2023.07.26-197096-20046-ENT -->\n\t\t<dependency>\n\t\t\t<groupId>com.dameng</groupId>\n\t\t\t<artifactId>DmJdbcDriver18</artifactId>\n\t\t\t<version>${dm8.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.dameng</groupId>\n\t\t\t<artifactId>DmDialect-for-hibernate5.0</artifactId>\n\t\t\t<version>${dm8.version}</version>\n\t\t</dependency>\n\t\t<!-- Quartz定时任务 -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-quartz</artifactId>\n\t\t</dependency>\n\n\t\t<!--JWT-->\n\t\t<dependency>\n\t\t\t<groupId>com.auth0</groupId>\n\t\t\t<artifactId>java-jwt</artifactId>\n\t\t\t<version>${java-jwt.version}</version>\n\t\t</dependency>\n\n\t\t<!--shiro-->\n\t\t<dependency>\n\t\t\t<groupId>org.apache.shiro</groupId>\n\t\t\t<artifactId>shiro-spring-boot-starter</artifactId>\n\t\t\t<classifier>jakarta</classifier>\n\t\t\t<version>${shiro.version}</version>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.apache.shiro</groupId>\n\t\t\t\t\t<artifactId>shiro-spring</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.shiro</groupId>\n\t\t\t<artifactId>shiro-spring</artifactId>\n\t\t\t<classifier>jakarta</classifier>\n\t\t\t<version>${shiro.version}</version>\n\t\t\t<!-- 排除仍使用了javax.servlet的依赖 -->\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.apache.shiro</groupId>\n\t\t\t\t\t<artifactId>shiro-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.apache.shiro</groupId>\n\t\t\t\t\t<artifactId>shiro-web</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t\t<!-- 引入适配jakarta的依赖包 -->\n\t\t<dependency>\n\t\t\t<groupId>org.apache.shiro</groupId>\n\t\t\t<artifactId>shiro-core</artifactId>\n\t\t\t<classifier>jakarta</classifier>\n\t\t\t<version>${shiro.version}</version>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>commons-beanutils</groupId>\n\t\t\t\t\t<artifactId>commons-beanutils</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.shiro</groupId>\n\t\t\t<artifactId>shiro-web</artifactId>\n\t\t\t<classifier>jakarta</classifier>\n\t\t\t<version>${shiro.version}</version>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.apache.shiro</groupId>\n\t\t\t\t\t<artifactId>shiro-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t\t<!-- shiro-redis -->\n\t\t<dependency>\n\t\t\t<groupId>org.crazycake</groupId>\n\t\t\t<artifactId>shiro-redis</artifactId>\n\t\t\t<version>${shiro-redis.version}</version>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.apache.shiro</groupId>\n\t\t\t\t\t<artifactId>shiro-core</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<artifactId>checkstyle</artifactId>\n\t\t\t\t\t<groupId>com.puppycrawl.tools</groupId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>com.github.xiaoymin</groupId>\n\t\t\t<artifactId>knife4j-openapi3-ui</artifactId>\n\t\t\t<version>${knife4j-spring-boot-starter.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>\n\t\t\t<version>2.7.0</version>\n\t\t</dependency>\n\n\t\t<!-- 代码生成器 -->\n\t\t<!-- 如下载失败，请参考此文档  https://help.jeecg.com/java/setup/maven.html -->\n\t\t<dependency>\n\t\t\t<groupId>org.jeecgframework.boot</groupId>\n\t\t\t<artifactId>codegenerate</artifactId>\n\t\t\t<version>${codegenerate.version}</version>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<artifactId>commons-io</artifactId>\n\t\t\t\t\t<groupId>commons-io</groupId>\n\t\t\t\t</exclusion>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t\t\t\t<groupId>mysql</groupId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\n\t\t<!-- AutoPoi Excel工具类-->\n\t\t<dependency>\n\t\t\t<groupId>org.jeecgframework</groupId>\n\t\t\t<artifactId>autopoi-spring-boot-3-starter</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>xerces</groupId>\n\t\t\t<artifactId>xercesImpl</artifactId>\n\t\t\t<version>2.12.2</version>\n\t\t\t<optional>true</optional>\n\t\t</dependency>\n\n\t\t<!-- minio文件存储服务 -->\n\t\t<dependency>\n\t\t\t<groupId>io.minio</groupId>\n\t\t\t<artifactId>minio</artifactId>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<artifactId>checker-qual</artifactId>\n\t\t\t\t\t<groupId>org.checkerframework</groupId>\n\t\t\t\t</exclusion>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>com.google.errorprone</groupId>\n\t\t\t\t\t<artifactId>error_prone_annotations</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.apache.commons</groupId>\n\t\t\t\t\t<artifactId>commons-compress</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\n\t\t<!-- 阿里云短信 -->\n\t\t<dependency>\n\t\t\t<groupId>com.aliyun</groupId>\n\t\t\t<artifactId>aliyun-java-sdk-dysmsapi</artifactId>\n\t\t\t<version>${aliyun-java-sdk-dysmsapi.version}</version>\n\t\t</dependency>\n\t\t<!-- aliyun oss -->\n\t\t<dependency>\n\t\t\t<groupId>com.aliyun.oss</groupId>\n\t\t\t<artifactId>aliyun-sdk-oss</artifactId>\n\t\t\t<version>${aliyun.oss.version}</version>\n\t\t</dependency>\n\t\t<!-- 第三方登录  -->\n\t\t<dependency>\n\t\t\t<groupId>com.xkcoding.justauth</groupId>\n\t\t\t<artifactId>justauth-spring-boot-starter</artifactId>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t\t<artifactId>spring-boot-autoconfigure</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t\t<artifactId>spring-boot-configuration-processor</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.squareup.okhttp3</groupId>\n\t\t\t<artifactId>okhttp</artifactId>\n\t\t</dependency>\n\t\t<!-- 解决okhttp引用了kotlin,应用启动有警告日志问题 -->\n\t\t<dependency>\n\t\t\t<groupId>com.fasterxml.jackson.module</groupId>\n\t\t\t<artifactId>jackson-module-kotlin</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>commons-fileupload</groupId>\n\t\t\t<artifactId>commons-fileupload</artifactId>\n\t\t</dependency>\n\t\t<!--加载hutool-->\n\t\t<dependency>\n\t\t\t<groupId>cn.hutool</groupId>\n\t\t\t<artifactId>hutool-core</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>cn.hutool</groupId>\n\t\t\t<artifactId>hutool-crypto</artifactId>\n\t\t</dependency>\n\t\t<!-- chatgpt -->\n\t\t<dependency>\n\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t<artifactId>jeecg-boot-starter-chatgpt</artifactId>\n\t\t</dependency>\n        <!-- 腾讯云 -->\n        <dependency>\n            <groupId>com.tencentcloudapi</groupId>\n            <artifactId>tencentcloud-sdk-java-sms</artifactId>\n            <version>${tencentcloud-sdk-java-sms.version}</version>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>javax.xml.bind</groupId>\n\t\t\t\t\t<artifactId>jaxb-api</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>com.squareup.okio</groupId>\n\t\t\t\t\t<artifactId>okio</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n        </dependency>\n\t</dependencies>\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/CommonAPI.java",
    "content": "package org.jeecg.common.api;\n\nimport org.jeecg.common.api.dto.AiragFlowDTO;\nimport org.jeecg.common.system.vo.*;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\n\n/**\n * 通用api\n * @author: jeecg-boot\n */\npublic interface CommonAPI {\n\n    /**\n     * 1查询用户角色信息\n     * @param username\n     * @return\n     */\n    Set<String> queryUserRoles(String username);\n    \n    /**\n     * 1查询用户角色信息\n     * @param userId\n     * @return\n     */\n    Set<String> queryUserRolesById(String userId);\n\n\n    /**\n     * 2查询用户权限信息\n     * @param userId\n     * @return\n     */\n    Set<String> queryUserAuths(String userId);\n\n    /**\n     * 3根据 id 查询数据库中存储的 DynamicDataSourceModel\n     *\n     * @param dbSourceId\n     * @return\n     */\n    DynamicDataSourceModel getDynamicDbSourceById(String dbSourceId);\n\n    /**\n     * 4根据 code 查询数据库中存储的 DynamicDataSourceModel\n     *\n     * @param dbSourceCode\n     * @return\n     */\n    DynamicDataSourceModel getDynamicDbSourceByCode(String dbSourceCode);\n\n    /**\n     * 5根据用户账号查询用户信息\n     * @param username\n     * @return\n     */\n    public LoginUser getUserByName(String username);\n    \n    /**\n     * 5根据用户账号查询用户Id\n     * @param username\n     * @return\n     */\n    public String getUserIdByName(String username);\n\n\n    /**\n     * 6字典表的 翻译\n     * @param table\n     * @param text\n     * @param code\n     * @param key\n     * @return\n     */\n    String translateDictFromTable(String table, String text, String code, String key);\n\n    /**\n     * 7普通字典的翻译\n     * @param code\n     * @param key\n     * @return\n     */\n    String translateDict(String code, String key);\n\n    /**\n     * 8查询数据权限\n     * @param component 组件\n     * @param username 用户名\n     * @param requestPath 前段请求地址\n     * @return\n     */\n    List<SysPermissionDataRuleModel> queryPermissionDataRule(String component, String requestPath, String username);\n\n\n    /**\n     * 9查询用户信息\n     * @param username\n     * @return\n     */\n    SysUserCacheInfo getCacheUser(String username);\n\n    /**\n     * 10获取数据字典\n     * @param code\n     * @return\n     */\n    public List<DictModel> queryDictItemsByCode(String code);\n\n    /**\n     * 获取有效的数据字典项\n     * @param code\n     * @return\n     */\n    public List<DictModel> queryEnableDictItemsByCode(String code);\n\n    /**\n     * 13获取表数据字典\n     * @param tableFilterSql\n     * @param text\n     * @param code\n     * @return\n     */\n    List<DictModel> queryTableDictItemsByCode(String tableFilterSql, String text, String code);\n\n    /**\n     * 14 普通字典的翻译，根据多个dictCode和多条数据，多个以逗号分割\n     * @param dictCodes 例如：user_status,sex\n     * @param keys 例如：1,2,0\n     * @return\n     */\n    Map<String, List<DictModel>> translateManyDict(String dictCodes, String keys);\n\n    /**\n     * 15 字典表的 翻译，可批量\n     * @param table\n     * @param text\n     * @param code\n     * @param keys 多个用逗号分割\n     * @param dataSource 数据源\n     * @return\n     */\n    List<DictModel> translateDictFromTableByKeys(String table, String text, String code, String keys, String dataSource);\n\n    /**\n     * 16 运行AIRag流程\n     * for  [QQYUN-13634]在baseapi里面封装方法，方便其他模块调用\n     *\n     * @param airagFlowDTO\n     * @return 流程执行结果,可能是String或者Map\n     * @author chenrui\n     * @date 2025/9/2 11:43\n     */\n    Object runAiragFlow(AiragFlowDTO airagFlowDTO);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/AiragFlowDTO.java",
    "content": "package org.jeecg.common.api.dto;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * 调用AI流程入参\n * for [QQYUN-13634]在baseapi里面封装方法，方便其他模块调用\n * @author chenrui\n * @date 2025/9/2 14:11\n */\n@Builder\n@AllArgsConstructor\n@NoArgsConstructor\n@Data\npublic class AiragFlowDTO implements Serializable {\n\n\n    private static final long serialVersionUID = 7431775881170684867L;\n\n    /**\n     * 流程id\n     */\n    private String flowId;\n\n\n    /**\n     * 输入参数\n     */\n    private Map<String, Object> inputParams;\n\n    /**\n     * 是否流式返回\n     */\n    private boolean isStream;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/ApprovalCommentDTO.java",
    "content": "package org.jeecg.common.api.dto;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * 流程审批意见DTO\n * @author scott\n * @date 2025-01-29\n */\n@Data\npublic class ApprovalCommentDTO implements Serializable {\n    \n    private static final long serialVersionUID = 1L;\n    \n    /**\n     * 任务ID\n     */\n    private String taskId;\n    \n    /**\n     * 任务名称\n     */\n    private String taskName;\n    \n    /**\n     * 审批人ID\n     */\n    private String approverId;\n    \n    /**\n     * 审批人姓名\n     */\n    private String approverName;\n    \n    /**\n     * 审批意见\n     */\n    private String approvalComment;\n    \n    /**\n     * 审批时间\n     */\n    private Date approvalTime;\n}\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/DataLogDTO.java",
    "content": "package org.jeecg.common.api.dto;\n\nimport lombok.Data;\n\n/**\n * @Author taoYan\n * @Date 2022/7/26 14:44\n **/\n@Data\npublic class DataLogDTO {\n\n    private String tableName;\n\n    private String dataId;\n\n    private String content;\n\n    private String type;\n\n    private String createName;\n\n    public DataLogDTO(){\n\n    }\n\n    public DataLogDTO(String tableName, String dataId, String content, String type) {\n        this.tableName = tableName;\n        this.dataId = dataId;\n        this.content = content;\n        this.type = type;\n    }\n\n    public DataLogDTO(String tableName, String dataId, String type) {\n        this.tableName = tableName;\n        this.dataId = dataId;\n        this.type = type;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/FileDownDTO.java",
    "content": "package org.jeecg.common.api.dto;\n\nimport lombok.Data;\n\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.Serializable;\n\n/**\n * 文件下载\n * cloud api 用到的接口传输对象\n * @author: jeecg-boot\n */\n@Data\npublic class FileDownDTO implements Serializable {\n\n    private static final long serialVersionUID = 6749126258686446019L;\n\n    private String filePath;\n    private String uploadpath;\n    private String uploadType;\n    private HttpServletResponse response;\n\n    public FileDownDTO(){}\n\n    public FileDownDTO(String filePath, String uploadpath, String uploadType,HttpServletResponse response){\n        this.filePath = filePath;\n        this.uploadpath = uploadpath;\n        this.uploadType = uploadType;\n        this.response = response;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/FileUploadDTO.java",
    "content": "package org.jeecg.common.api.dto;\n\nimport lombok.Data;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport java.io.Serializable;\n\n/**\n * 文件上传\n * cloud api 用到的接口传输对象\n * @author: jeecg-boot\n */\n@Data\npublic class FileUploadDTO implements Serializable {\n\n    private static final long serialVersionUID = -4111953058578954386L;\n\n    private MultipartFile file;\n\n    private String bizPath;\n\n    private String uploadType;\n\n    private String customBucket;\n\n    public FileUploadDTO(){\n\n    }\n\n    /**\n     * 简单上传 构造器1\n     * @param file\n     * @param bizPath\n     * @param uploadType\n     */\n    public FileUploadDTO(MultipartFile file,String bizPath,String uploadType){\n        this.file = file;\n        this.bizPath = bizPath;\n        this.uploadType = uploadType;\n    }\n\n    /**\n     * 申明桶 文件上传 构造器2\n     * @param file\n     * @param bizPath\n     * @param uploadType\n     * @param customBucket\n     */\n    public FileUploadDTO(MultipartFile file,String bizPath,String uploadType,String customBucket){\n        this.file = file;\n        this.bizPath = bizPath;\n        this.uploadType = uploadType;\n        this.customBucket = customBucket;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/LogDTO.java",
    "content": "package org.jeecg.common.api.dto;\nimport lombok.Data;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecg.common.system.vo.LoginUser;\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * 日志对象\n * cloud api 用到的接口传输对象\n * @author: jeecg-boot\n */\n@Data\npublic class LogDTO implements Serializable {\n\n    private static final long serialVersionUID = 8482720462943906924L;\n\n    /**内容*/\n    private String logContent;\n\n    /**日志类型(0:操作日志;1:登录日志;2:定时任务)  */\n    private Integer logType;\n\n    /**操作类型(1:添加;2:修改;3:删除;) */\n    private Integer operateType;\n\n    /**登录用户 */\n    private LoginUser loginUser;\n\n    private String id;\n    private String createBy;\n    private Date createTime;\n    private Long costTime;\n    private String ip;\n\n    /**请求参数 */\n    private String requestParam;\n\n    /**请求类型*/\n    private String requestType;\n\n    /**请求路径*/\n    private String requestUrl;\n\n    /**请求方法 */\n    private String method;\n\n    /**操作人用户名称*/\n    private String username;\n\n    /**操作人用户账户*/\n    private String userid;\n\n    /**\n     * 租户ID\n     */\n    private Integer tenantId;\n\n    /**\n     * 客户终端类型 pc:电脑端 app:手机端 h5:移动网页端\n     */\n    private String clientType;\n    \n    public LogDTO(){\n\n    }\n\n    public LogDTO(String logContent, Integer logType, Integer operatetype){\n        this.logContent = logContent;\n        this.logType = logType;\n        this.operateType = operatetype;\n    }\n\n    public LogDTO(String logContent, Integer logType, Integer operatetype, LoginUser loginUser){\n        this.logContent = logContent;\n        this.logType = logType;\n        this.operateType = operatetype;\n        this.loginUser = loginUser;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/OnlineAuthDTO.java",
    "content": "package org.jeecg.common.api.dto;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * online 拦截器权限判断\n * cloud api 用到的接口传输对象\n * @author: jeecg-boot\n */\n@Data\npublic class OnlineAuthDTO implements Serializable {\n    private static final long serialVersionUID = 1771827545416418203L;\n\n\n    /**\n     * 用户名\n     */\n    private String username;\n\n    /**\n     * 可能的请求地址\n     */\n    private List<String> possibleUrl;\n\n    /**\n     * online开发的菜单地址\n     */\n    private String onlineFormUrl;\n\n    /**\n     * online工单的地址\n     */\n    private String onlineWorkOrderUrl;\n\n    public OnlineAuthDTO(){\n\n    }\n\n    public OnlineAuthDTO(String username, List<String> possibleUrl, String onlineFormUrl){\n        this.username = username;\n        this.possibleUrl = possibleUrl;\n        this.onlineFormUrl = onlineFormUrl;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/PushMessageDTO.java",
    "content": "package org.jeecg.common.api.dto;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.io.Serializable;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * 移动端消息推送\n * @author liusq\n * @date 2025/11/12 14:11\n */\n@Builder\n@AllArgsConstructor\n@NoArgsConstructor\n@Data\npublic class PushMessageDTO implements Serializable {\n\n\n    private static final long serialVersionUID = 7431775881170684867L;\n\n    /**\n     * 消息标题\n     */\n    private String title;\n\n    /**\n     * 消息内容\n     */\n    private String content;\n\n    /**\n     * 推送形式：all：全推送 single：单用户推送\n     */\n    private String pushType;\n\n    /**\n     * 用户名usernameList\n     */\n    List<String> usernames;\n\n    /**\n     * 用户名idList\n     */\n    List<String> userIds;\n\n    /**\n     * 消息附加参数\n     */\n    Map<String,Object> payload;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/BusMessageDTO.java",
    "content": "package org.jeecg.common.api.dto.message;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * 带业务参数的消息\n* \n* @author: taoyan\n* @date: 2022/8/17\n*/\n@Data\npublic class BusMessageDTO extends MessageDTO implements Serializable {\n\n    private static final long serialVersionUID = 9104793287983367669L;\n    /**\n     * 业务类型\n     */\n    private String busType;\n\n    /**\n     * 业务id\n     */\n    private String busId;\n\n    public BusMessageDTO(){\n\n    }\n\n    /**\n     * 构造 带业务参数的消息\n     * @param fromUser\n     * @param toUser\n     * @param title\n     * @param msgContent\n     * @param msgCategory\n     * @param busType\n     * @param busId\n     */\n    public BusMessageDTO(String fromUser, String toUser, String title, String msgContent, String msgCategory, String busType, String busId){\n        super(fromUser, toUser, title, msgContent, msgCategory);\n        this.busId = busId;\n        this.busType = busType;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/BusTemplateMessageDTO.java",
    "content": "package org.jeecg.common.api.dto.message;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * 带业务参数的模板消息\n * @author: jeecg-boot\n */\n@Data\npublic class BusTemplateMessageDTO extends TemplateMessageDTO implements Serializable {\n\n    private static final long serialVersionUID = -4277810906346929459L;\n\n    /**\n     * 业务类型\n     */\n    private String busType;\n\n    /**\n     * 业务id\n     */\n    private String busId;\n\n    public BusTemplateMessageDTO(){\n\n    }\n\n    /**\n     * 构造 带业务参数的模板消息\n     * @param fromUser\n     * @param toUser\n     * @param title\n     * @param templateParam\n     * @param templateCode\n     * @param busType\n     * @param busId\n     */\n    public BusTemplateMessageDTO(String fromUser, String toUser, String title, Map<String, String> templateParam, String templateCode, String busType, String busId){\n        super(fromUser, toUser, title, templateParam, templateCode);\n        this.busId = busId;\n        this.busType = busType;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/MessageDTO.java",
    "content": "package org.jeecg.common.api.dto.message;\n\nimport lombok.Data;\nimport org.jeecg.common.constant.CommonConstant;\n\nimport java.io.Serializable;\nimport java.util.*;\n\n/**\n * 普通消息\n * @author: jeecg-boot\n */\n@Data\npublic class MessageDTO implements Serializable {\n    private static final long serialVersionUID = -5690444483968058442L;\n    \n    /**\n     * 发送人(用户登录账户)\n     */\n    protected String fromUser;\n\n    /**\n     * 发送给(用户登录账户)\n     */\n    protected String toUser;\n\n    /**\n     * 发送给所有人\n     */\n    protected Boolean toAll;\n\n    /**\n     * 消息主题\n     */\n    protected String title;\n\n    /**\n     * 消息内容\n     */\n    protected String content;\n\n    /**\n     * 消息类型 1:消息  2:系统消息\n     */\n    protected String category;\n    \n    /**\n     * 消息类型：org.jeecg.common.constant.enums.MessageTypeEnum\n     *  XT(\"system\",  \"系统消息\")\n     *  YJ(\"email\",  \"邮件消息\")\n     *  DD(\"dingtalk\", \"钉钉消息\")\n     *  QYWX(\"wechat_enterprise\", \"企业微信\")\n     */\n    protected String type;\n    \n\n    //---【推送模板相关参数】-------------------------------------------------------------\n    /**\n     * 是否发送Markdown格式的消息\n     */\n    protected boolean isMarkdown;\n    /**\n     * 模板消息对应的模板编码\n     */\n    protected String templateCode;\n    /**\n     * 解析模板内容 对应的数据\n     */\n    protected Map<String, Object> data;\n    //---【推送模板相关参数】-------------------------------------------------------------\n\n    //---【邮件相关参数】-------------------------------------------------------------\n    /**\n     * 邮件抄送人\n     */\n    private String copyToUser;\n\n    /**\n     * 邮件推送地址\n     */\n    protected Set<String> toEmailList;\n\n    /**\n     * 邮件抄送地址\n     */\n    protected Set<String> ccEmailList;\n\n    /**\n     * 是否为定时任务推送email\n     */\n    private Boolean isTimeJob = false;\n    \n    //---【邮件相关参数】-------------------------------------------------------------\n\n    /**\n     * 枚举：org.jeecg.common.constant.enums.NoticeTypeEnum\n     * 通知类型(system:系统消息、file:知识库、flow:流程、plan:日程计划、meeting:会议)\n     */\n    private String noticeType;\n    \n    public MessageDTO(){\n    }\n\n    /**\n     * 构造器1 系统消息\n     */\n    public MessageDTO(String fromUser,String toUser,String title, String content){\n        this.fromUser = fromUser;\n        this.toUser = toUser;\n        this.title = title;\n        this.content = content;\n        //默认 都是2系统消息\n        this.category = CommonConstant.MSG_CATEGORY_2;\n    }\n\n    /**\n     * 构造器2 支持设置category 1:消息  2:系统消息\n     */\n    public MessageDTO(String fromUser,String toUser,String title, String content, String category){\n        this.fromUser = fromUser;\n        this.toUser = toUser;\n        this.title = title;\n        this.content = content;\n        this.category = category;\n    }\n\n    public boolean isMarkdown() {\n        return this.isMarkdown;\n    }\n\n    public void setIsMarkdown(boolean isMarkdown) {\n        this.isMarkdown = isMarkdown;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/TemplateDTO.java",
    "content": "package org.jeecg.common.api.dto.message;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * 消息模板dto\n * @author: jeecg-boot\n */\n@Data\npublic class TemplateDTO implements Serializable {\n\n    private static final long serialVersionUID = 5848247133907528650L;\n\n    /**\n     * 模板编码\n     */\n    protected String templateCode;\n\n    /**\n     * 模板参数\n     */\n    protected Map<String, String> templateParam;\n\n    /**\n     * 构造器 通过设置模板参数和模板编码 作为参数获取消息内容\n     */\n    public TemplateDTO(String templateCode, Map<String, String> templateParam){\n        this.templateCode = templateCode;\n        this.templateParam = templateParam;\n    }\n\n    public TemplateDTO(){\n\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/TemplateMessageDTO.java",
    "content": "package org.jeecg.common.api.dto.message;\n\nimport lombok.Data;\nimport java.io.Serializable;\nimport java.util.Map;\n\n/**\n * 模板消息\n * @author: jeecg-boot\n */\n@Data\npublic class TemplateMessageDTO extends TemplateDTO implements Serializable {\n\n    private static final long serialVersionUID = 411137565170647585L;\n\n\n    /**\n     * 发送人(用户登录账户)\n     */\n    protected String fromUser;\n\n    /**\n     * 发送给(用户登录账户)\n     */\n    protected String toUser;\n\n    /**\n     * 消息主题\n     */\n    protected String title;\n\n\n    public TemplateMessageDTO(){\n\n    }\n\n    /**\n     * 构造器1 发模板消息用\n     */\n    public TemplateMessageDTO(String fromUser, String toUser,String title, Map<String, String> templateParam, String templateCode){\n        super(templateCode, templateParam);\n        this.fromUser = fromUser;\n        this.toUser = toUser;\n        this.title = title;\n    }\n\n\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/api/vo/Result.java",
    "content": "package org.jeecg.common.api.vo;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport org.jeecg.common.constant.CommonConstant;\n\nimport java.io.Serializable;\n\n/**\n *   接口返回数据格式\n * @author scott\n * @email jeecgos@163.com\n * @date  2019年1月19日\n */\n@Data\n@Schema(description=\"接口返回对象\")\npublic class Result<T> implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\n\t/**\n\t * 成功标志\n\t */\n\t@Schema(description = \"成功标志\")\n\tprivate boolean success = true;\n\n\t/**\n\t * 返回处理消息\n\t */\n\t@Schema(description = \"返回处理消息\")\n\tprivate String message = \"\";\n\n\t/**\n\t * 返回代码\n\t */\n\t@Schema(description = \"返回代码\")\n\tprivate Integer code = 0;\n\t\n\t/**\n\t * 返回数据对象 data\n\t */\n\t@Schema(description = \"返回数据对象\")\n\tprivate T result;\n\t\n\t/**\n\t * 时间戳\n\t */\n\t@Schema(description = \"时间戳\")\n\tprivate long timestamp = System.currentTimeMillis();\n\n\tpublic Result() {\n\t}\n\n    /**\n     * 兼容VUE3版token失效不跳转登录页面\n     * @param code\n     * @param message\n     */\n\tpublic Result(Integer code, String message) {\n\t\tthis.code = code;\n\t\tthis.message = message;\n\t}\n\t\n\tpublic Result<T> success(String message) {\n\t\tthis.message = message;\n\t\tthis.code = CommonConstant.SC_OK_200;\n\t\tthis.success = true;\n\t\treturn this;\n\t}\n\n\tpublic static<T> Result<T> ok() {\n\t\tResult<T> r = new Result<T>();\n\t\tr.setSuccess(true);\n\t\tr.setCode(CommonConstant.SC_OK_200);\n\t\treturn r;\n\t}\n\n\tpublic static<T> Result<T> ok(String msg) {\n\t\tResult<T> r = new Result<T>();\n\t\tr.setSuccess(true);\n\t\tr.setCode(CommonConstant.SC_OK_200);\n\t\t//Result OK(String msg)方法会造成兼容性问题 issues/I4IP3D\n\t\tr.setResult((T) msg);\n\t\tr.setMessage(msg);\n\t\treturn r;\n\t}\n\n\tpublic static<T> Result<T> ok(T data) {\n\t\tResult<T> r = new Result<T>();\n\t\tr.setSuccess(true);\n\t\tr.setCode(CommonConstant.SC_OK_200);\n\t\tr.setResult(data);\n\t\treturn r;\n\t}\n\n\tpublic static<T> Result<T> OK() {\n\t\tResult<T> r = new Result<T>();\n\t\tr.setSuccess(true);\n\t\tr.setCode(CommonConstant.SC_OK_200);\n\t\treturn r;\n\t}\n\n\t/**\n\t * 此方法是为了兼容升级所创建\n\t *\n\t * @param msg\n\t * @param <T>\n\t * @return\n\t */\n\tpublic static<T> Result<T> OK(String msg) {\n\t\tResult<T> r = new Result<T>();\n\t\tr.setSuccess(true);\n\t\tr.setCode(CommonConstant.SC_OK_200);\n\t\tr.setMessage(msg);\n\t\t//Result OK(String msg)方法会造成兼容性问题 issues/I4IP3D\n\t\tr.setResult((T) msg);\n\t\treturn r;\n\t}\n\n\tpublic static<T> Result<T> OK(T data) {\n\t\tResult<T> r = new Result<T>();\n\t\tr.setSuccess(true);\n\t\tr.setCode(CommonConstant.SC_OK_200);\n\t\tr.setResult(data);\n\t\treturn r;\n\t}\n\n\tpublic static<T> Result<T> OK(String msg, T data) {\n\t\tResult<T> r = new Result<T>();\n\t\tr.setSuccess(true);\n\t\tr.setCode(CommonConstant.SC_OK_200);\n\t\tr.setMessage(msg);\n\t\tr.setResult(data);\n\t\treturn r;\n\t}\n\n\tpublic static<T> Result<T> error(String msg, T data) {\n\t\tResult<T> r = new Result<T>();\n\t\tr.setSuccess(false);\n\t\tr.setCode(CommonConstant.SC_INTERNAL_SERVER_ERROR_500);\n\t\tr.setMessage(msg);\n\t\tr.setResult(data);\n\t\treturn r;\n\t}\n\n\tpublic static<T> Result<T> error(String msg) {\n\t\treturn error(CommonConstant.SC_INTERNAL_SERVER_ERROR_500, msg);\n\t}\n\t\n\tpublic static<T> Result<T> error(int code, String msg) {\n\t\tResult<T> r = new Result<T>();\n\t\tr.setCode(code);\n\t\tr.setMessage(msg);\n\t\tr.setSuccess(false);\n\t\treturn r;\n\t}\n\n\tpublic Result<T> error500(String message) {\n\t\tthis.message = message;\n\t\tthis.code = CommonConstant.SC_INTERNAL_SERVER_ERROR_500;\n\t\tthis.success = false;\n\t\treturn this;\n\t}\n\n\t/**\n\t * 无权限访问返回结果\n\t */\n\tpublic static<T> Result<T> noauth(String msg) {\n\t\treturn error(CommonConstant.SC_JEECG_NO_AUTHZ, msg);\n\t}\n\n\t@JsonIgnore\n\tprivate String onlTable;\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/AutoLogAspect.java",
    "content": "package org.jeecg.common.aspect;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.alibaba.fastjson.serializer.PropertyFilter;\nimport org.apache.shiro.SecurityUtils;\nimport org.aspectj.lang.JoinPoint;\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.annotation.Around;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.aspectj.lang.reflect.MethodSignature;\nimport org.jeecg.common.api.dto.LogDTO;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.enums.ModuleType;\nimport org.jeecg.common.constant.enums.OperateTypeEnum;\nimport org.jeecg.modules.base.service.BaseCommonService;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.IpUtils;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.springframework.core.StandardReflectionParameterNameDiscoverer;\nimport org.springframework.stereotype.Component;\nimport org.springframework.validation.BindingResult;\nimport org.springframework.web.multipart.MultipartFile;\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.lang.reflect.Method;\nimport java.util.Date;\n\n\n/**\n * 系统日志，切面处理类\n *\n * @Author scott\n * @email jeecgos@163.com\n * @Date 2018年1月14日\n */\n@Aspect\n@Component\npublic class AutoLogAspect {\n\n    @Resource\n    private BaseCommonService baseCommonService;\n\n    @Pointcut(\"@annotation(org.jeecg.common.aspect.annotation.AutoLog)\")\n    public void logPointCut() {\n\n    }\n\n    @Around(\"logPointCut()\")\n    public Object around(ProceedingJoinPoint point) throws Throwable {\n        long beginTime = System.currentTimeMillis();\n        //执行方法\n        Object result = point.proceed();\n        //执行时长(毫秒)\n        long time = System.currentTimeMillis() - beginTime;\n\n        //保存日志\n        saveSysLog(point, time, result);\n\n        return result;\n    }\n\n    private void saveSysLog(ProceedingJoinPoint joinPoint, long time, Object obj) {\n        MethodSignature signature = (MethodSignature) joinPoint.getSignature();\n        Method method = signature.getMethod();\n\n        LogDTO dto = new LogDTO();\n        AutoLog syslog = method.getAnnotation(AutoLog.class);\n        if(syslog != null){\n            //update-begin-author:taoyan date:\n            String content = syslog.value();\n            if(syslog.module()== ModuleType.ONLINE){\n                content = getOnlineLogContent(obj, content);\n            }\n            //注解上的描述,操作日志内容\n            dto.setLogType(syslog.logType());\n            dto.setLogContent(content);\n        }\n\n        //请求的方法名\n        String className = joinPoint.getTarget().getClass().getName();\n        String methodName = signature.getName();\n        dto.setMethod(className + \".\" + methodName + \"()\");\n\n\n        //设置操作类型\n        if (CommonConstant.LOG_TYPE_2 == dto.getLogType()) {\n            dto.setOperateType(getOperateType(methodName, syslog.operateType()));\n        }\n\n        //获取request\n        HttpServletRequest request = SpringContextUtils.getHttpServletRequest();\n        //请求的参数\n        dto.setRequestParam(getReqestParams(request,joinPoint));\n        //设置IP地址\n        dto.setIp(IpUtils.getIpAddr(request));\n        //获取登录用户信息\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        if(sysUser!=null){\n            dto.setUserid(sysUser.getUsername());\n            dto.setUsername(sysUser.getRealname());\n\n        }\n        //耗时\n        dto.setCostTime(time);\n        dto.setCreateTime(new Date());\n        //保存系统日志\n        baseCommonService.addLog(dto);\n    }\n\n\n    /**\n     * 获取操作类型\n     */\n    private int getOperateType(String methodName,int operateType) {\n        if (operateType > 0) {\n            return operateType;\n        }\n        // 代码逻辑说明: 阿里云代码扫描规范(不允许任何魔法值出现在代码中)------------\n        return OperateTypeEnum.getTypeByMethodName(methodName);\n    }\n\n    /**\n     * @Description: 获取请求参数\n     * @author: scott\n     * @date: 2020/4/16 0:10\n     * @param request:  request\n     * @param joinPoint:  joinPoint\n     * @Return: java.lang.String\n     */\n    private String getReqestParams(HttpServletRequest request, JoinPoint joinPoint) {\n        String httpMethod = request.getMethod();\n        String params = \"\";\n        if (CommonConstant.HTTP_POST.equals(httpMethod) || CommonConstant.HTTP_PUT.equals(httpMethod) || CommonConstant.HTTP_PATCH.equals(httpMethod)) {\n            Object[] paramsArray = joinPoint.getArgs();\n            // java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false)\n            //  https://my.oschina.net/mengzhang6/blog/2395893\n            Object[] arguments  = new Object[paramsArray.length];\n            for (int i = 0; i < paramsArray.length; i++) {\n                if (paramsArray[i] instanceof BindingResult || paramsArray[i] instanceof ServletRequest || paramsArray[i] instanceof ServletResponse || paramsArray[i] instanceof MultipartFile || paramsArray[i] instanceof MultipartFile[]) {\n                    //ServletRequest不能序列化，从入参里排除，否则报异常：java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false)\n                    //ServletResponse不能序列化 从入参里排除，否则报异常：java.lang.IllegalStateException: getOutputStream() has already been called for this response\n                    //MultipartFile和MultipartFile[]不能序列化，从入参里排除\n                    continue;\n                }\n                arguments[i] = paramsArray[i];\n            }\n            // 代码逻辑说明: 日志数据太长的直接过滤掉\n            PropertyFilter profilter = new PropertyFilter() {\n                @Override\n                public boolean apply(Object o, String name, Object value) {\n                    int length = 500;\n                    if(value!=null && value.toString().length()>length){\n                        return false;\n                    }\n                    if(value instanceof MultipartFile){\n                        return false;\n                    }\n                    return true;\n                }\n            };\n            params = JSONObject.toJSONString(arguments, profilter);\n        } else {\n            MethodSignature signature = (MethodSignature) joinPoint.getSignature();\n            Method method = signature.getMethod();\n            // 请求的方法参数值\n            Object[] args = joinPoint.getArgs();\n            // 请求的方法参数名称\n            StandardReflectionParameterNameDiscoverer u= new StandardReflectionParameterNameDiscoverer();\n            String[] paramNames = u.getParameterNames(method);\n            if (args != null && paramNames != null) {\n                for (int i = 0; i < args.length; i++) {\n                    params += \"  \" + paramNames[i] + \": \" + args[i];\n                }\n            }\n        }\n        return params;\n    }\n\n    /**\n     * online日志内容拼接\n     * @param obj\n     * @param content\n     * @return\n     */\n    private String getOnlineLogContent(Object obj, String content){\n        if (Result.class.isInstance(obj)){\n            Result res = (Result)obj;\n            String msg = res.getMessage();\n            String tableName = res.getOnlTable();\n            if(oConvertUtils.isNotEmpty(tableName)){\n                content+=\",表名:\"+tableName;\n            }\n            if(res.isSuccess()){\n                content+= \",\"+(oConvertUtils.isEmpty(msg)?\"操作成功\":msg);\n            }else{\n                content+= \",\"+(oConvertUtils.isEmpty(msg)?\"操作失败\":msg);\n            }\n        }\n        return content;\n    }\n\n\n    /*    private void saveSysLog(ProceedingJoinPoint joinPoint, long time, Object obj) {\n        MethodSignature signature = (MethodSignature) joinPoint.getSignature();\n        Method method = signature.getMethod();\n\n        SysLog sysLog = new SysLog();\n        AutoLog syslog = method.getAnnotation(AutoLog.class);\n        if(syslog != null){\n            //update-begin-author:taoyan date:\n            String content = syslog.value();\n            if(syslog.module()== ModuleType.ONLINE){\n                content = getOnlineLogContent(obj, content);\n            }\n            //注解上的描述,操作日志内容\n            sysLog.setLogContent(content);\n            sysLog.setLogType(syslog.logType());\n        }\n\n        //请求的方法名\n        String className = joinPoint.getTarget().getClass().getName();\n        String methodName = signature.getName();\n        sysLog.setMethod(className + \".\" + methodName + \"()\");\n\n\n        //设置操作类型\n        if (sysLog.getLogType() == CommonConstant.LOG_TYPE_2) {\n            sysLog.setOperateType(getOperateType(methodName, syslog.operateType()));\n        }\n\n        //获取request\n        HttpServletRequest request = SpringContextUtils.getHttpServletRequest();\n        //请求的参数\n        sysLog.setRequestParam(getReqestParams(request,joinPoint));\n\n        //设置IP地址\n        sysLog.setIp(IPUtils.getIpAddr(request));\n\n        //获取登录用户信息\n        LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();\n        if(sysUser!=null){\n            sysLog.setUserid(sysUser.getUsername());\n            sysLog.setUsername(sysUser.getRealname());\n\n        }\n        //耗时\n        sysLog.setCostTime(time);\n        sysLog.setCreateTime(new Date());\n        //保存系统日志\n        sysLogService.save(sysLog);\n    }*/\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/DictAspect.java",
    "content": "package org.jeecg.common.aspect;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONObject;\nimport com.alibaba.fastjson.parser.Feature;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.annotation.Around;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.jeecg.common.api.CommonAPI;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.system.vo.DictModel;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.stereotype.Component;\nimport org.springframework.util.StringUtils;\n\nimport java.lang.reflect.Field;\nimport java.util.*;\nimport java.util.concurrent.TimeUnit;\nimport java.util.stream.Collectors;\n\n/**\n * @Description: 字典aop类\n * @Author: dangzhenghui\n * @Date: 2019-3-17 21:50\n * @Version: 1.0\n */\n@Aspect\n@Component\n@Slf4j\npublic class DictAspect {\n    @Lazy\n    @Autowired\n    private CommonAPI commonApi;\n    @Autowired\n    public RedisTemplate redisTemplate;\n\n    @Autowired\n    private ObjectMapper objectMapper;\n\n    private static final String JAVA_UTIL_DATE = \"java.util.Date\";\n\n    /**\n     * 定义切点Pointcut\n     */\n    @Pointcut(\"(@within(org.springframework.web.bind.annotation.RestController) || \" +\n            \"@within(org.springframework.stereotype.Controller) || @annotation(org.jeecg.common.aspect.annotation.AutoDict)) \" +\n            \"&& execution(public org.jeecg.common.api.vo.Result org.jeecg..*.*(..))\")\n    public void excudeService() {\n    }\n\n    @Around(\"excudeService()\")\n    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {\n    \tlong time1=System.currentTimeMillis();\t\n        Object result = pjp.proceed();\n        long time2=System.currentTimeMillis();\n        log.debug(\"获取JSON数据 耗时：\"+(time2-time1)+\"ms\");\n        long start=System.currentTimeMillis();\n        result=this.parseDictText(result);\n        long end=System.currentTimeMillis();\n        log.debug(\"注入字典到JSON数据  耗时\"+(end-start)+\"ms\");\n        return result;\n    }\n\n    /**\n     * 本方法针对返回对象为Result 的IPage的分页列表数据进行动态字典注入\n     * 字典注入实现 通过对实体类添加注解@dict 来标识需要的字典内容,字典分为单字典code即可 ，table字典 code table text配合使用与原来jeecg的用法相同\n     * 示例为SysUser   字段为sex 添加了注解@Dict(dicCode = \"sex\") 会在字典服务立马查出来对应的text 然后在请求list的时候将这个字典text，已字段名称加_dictText形式返回到前端\n     * 例输入当前返回值的就会多出一个sex_dictText字段\n     * {\n     *      sex:1,\n     *      sex_dictText:\"男\"\n     * }\n     * 前端直接取值sext_dictText在table里面无需再进行前端的字典转换了\n     *  customRender:function (text) {\n     *               if(text==1){\n     *                 return \"男\";\n     *               }else if(text==2){\n     *                 return \"女\";\n     *               }else{\n     *                 return text;\n     *               }\n     *             }\n     *             目前vue是这么进行字典渲染到table上的多了就很麻烦了 这个直接在服务端渲染完成前端可以直接用\n     * @param result\n     */\n    private Object parseDictText(Object result) {\n        //if (result instanceof Result) {\n        if (true) {\n            if (((Result) result).getResult() instanceof IPage) {\n                List<JSONObject> items = new ArrayList<>();\n\n                //step.1 筛选出加了 Dict 注解的字段列表\n                List<Field> dictFieldList = new ArrayList<>();\n                // 字典数据列表， key = 字典code，value=数据列表\n                Map<String, List<String>> dataListMap = new HashMap<>(5);\n                //取出结果集\n                List<Object> records=((IPage) ((Result) result).getResult()).getRecords();\n                // 代码逻辑说明: 【VUEN-1230】 判断是否含有字典注解,没有注解返回-----\n                Boolean hasDict= checkHasDict(records);\n                if(!hasDict){\n                    return result;\n                }\n\n                log.debug(\" __ 进入字典翻译切面 DictAspect —— \" );\n                for (Object record : records) {\n                    String json=\"{}\";\n                    try {\n                        //解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormat\n                         json = objectMapper.writeValueAsString(record);\n                    } catch (JsonProcessingException e) {\n                        log.error(\"json解析失败\"+e.getMessage(),e);\n                    }\n                    // 代码逻辑说明: 【issues/3303】restcontroller返回json数据后key顺序错乱 -----\n                    JSONObject item = JSONObject.parseObject(json, Feature.OrderedField);\n\n                    //for (Field field : record.getClass().getDeclaredFields()) {\n                    // 遍历所有字段，把字典Code取出来，放到 map 里\n                    for (Field field : oConvertUtils.getAllFields(record)) {\n                        String value = item.getString(field.getName());\n                        if (oConvertUtils.isEmpty(value)) {\n                            continue;\n                        }\n                        if (field.getAnnotation(Dict.class) != null) {\n                            if (!dictFieldList.contains(field)) {\n                                dictFieldList.add(field);\n                            }\n                            String code = field.getAnnotation(Dict.class).dicCode();\n                            String text = field.getAnnotation(Dict.class).dicText();\n                            String table = field.getAnnotation(Dict.class).dictTable();\n                            // 代码逻辑说明: [issues/#5643]解决分布式下表字典跨库无法查询问题------------\n                            String dataSource = field.getAnnotation(Dict.class).ds();\n                            List<String> dataList;\n                            String dictCode = code;\n                            if (!StringUtils.isEmpty(table)) {\n                                // 代码逻辑说明: [issues/#5643]解决分布式下表字典跨库无法查询问题------------\n                                dictCode = String.format(\"%s,%s,%s,%s\", table, text, code, dataSource);\n                            }\n                            dataList = dataListMap.computeIfAbsent(dictCode, k -> new ArrayList<>());\n                            this.listAddAllDeduplicate(dataList, Arrays.asList(value.split(\",\")));\n                        }\n                        //date类型默认转换string格式化日期\n                        //if (JAVA_UTIL_DATE.equals(field.getType().getName())&&field.getAnnotation(JsonFormat.class)==null&&item.get(field.getName())!=null){\n                            //SimpleDateFormat aDate=new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");\n                            // item.put(field.getName(), aDate.format(new Date((Long) item.get(field.getName()))));\n                        //}\n                    }\n                    items.add(item);\n                }\n\n                //step.2 调用翻译方法，一次性翻译\n                Map<String, List<DictModel>> translText = this.translateAllDict(dataListMap);\n\n                //step.3 将翻译结果填充到返回结果里\n                for (JSONObject record : items) {\n                    for (Field field : dictFieldList) {\n                        String code = field.getAnnotation(Dict.class).dicCode();\n                        String text = field.getAnnotation(Dict.class).dicText();\n                        String table = field.getAnnotation(Dict.class).dictTable();\n                        // 自定义的字典表数据源\n                        String dataSource = field.getAnnotation(Dict.class).ds();\n                        String fieldDictCode = code;\n                        if (!StringUtils.isEmpty(table)) {\n                            // 代码逻辑说明: [issues/#5643]解决分布式下表字典跨库无法查询问题------------\n                            fieldDictCode = String.format(\"%s,%s,%s,%s\", table, text, code, dataSource);\n                        }\n\n                        String value = record.getString(field.getName());\n                        if (oConvertUtils.isNotEmpty(value)) {\n                            List<DictModel> dictModels = translText.get(fieldDictCode);\n                            if(dictModels==null || dictModels.size()==0){\n                                continue;\n                            }\n\n                            String textValue = this.translDictText(dictModels, value);\n                            log.debug(\" 字典Val : \" + textValue);\n                            log.debug(\" __翻译字典字段__ \" + field.getName() + CommonConstant.DICT_TEXT_SUFFIX + \"： \" + textValue);\n\n                            // TODO-sun 测试输出，待删\n                            log.debug(\" ---- dictCode: \" + fieldDictCode);\n                            log.debug(\" ---- value: \" + value);\n                            log.debug(\" ----- text: \" + textValue);\n                            log.debug(\" ---- dictModels: \" + JSON.toJSONString(dictModels));\n\n                            record.put(field.getName() + CommonConstant.DICT_TEXT_SUFFIX, textValue);\n                        }\n                    }\n                }\n\n                ((IPage) ((Result) result).getResult()).setRecords(items);\n            }\n\n        }\n        return result;\n    }\n\n    /**\n     * list 去重添加\n     */\n    private void listAddAllDeduplicate(List<String> dataList, List<String> addList) {\n        // 筛选出dataList中没有的数据\n        List<String> filterList = addList.stream().filter(i -> !dataList.contains(i)).collect(Collectors.toList());\n        dataList.addAll(filterList);\n    }\n\n    /**\n     * 一次性把所有的字典都翻译了\n     * 1.  所有的普通数据字典的所有数据只执行一次SQL\n     * 2.  表字典相同的所有数据只执行一次SQL\n     * @param dataListMap\n     * @return\n     */\n    private Map<String, List<DictModel>> translateAllDict(Map<String, List<String>> dataListMap) {\n        // 翻译后的字典文本，key=dictCode\n        Map<String, List<DictModel>> translText = new HashMap<>(5);\n        // 需要翻译的数据（有些可以从redis缓存中获取，就不走数据库查询）\n        List<String> needTranslData = new ArrayList<>();\n        //step.1 先通过redis中获取缓存字典数据\n        for (String dictCode : dataListMap.keySet()) {\n            List<String> dataList = dataListMap.get(dictCode);\n            if (dataList.size() == 0) {\n                continue;\n            }\n            // 表字典需要翻译的数据\n            List<String> needTranslDataTable = new ArrayList<>();\n            for (String s : dataList) {\n                String data = s.trim();\n                if (data.length() == 0) {\n                    continue; //跳过循环\n                }\n                if (dictCode.contains(\",\")) {\n                    String keyString = String.format(\"sys:cache:dictTable::SimpleKey [%s,%s]\", dictCode, data);\n                    if (redisTemplate.hasKey(keyString)) {\n                        try {\n                            String text = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString));\n                            List<DictModel> list = translText.computeIfAbsent(dictCode, k -> new ArrayList<>());\n                            list.add(new DictModel(data, text));\n                        } catch (Exception e) {\n                            log.warn(e.getMessage());\n                        }\n                    } else if (!needTranslDataTable.contains(data)) {\n                        // 去重添加\n                        needTranslDataTable.add(data);\n                    }\n                } else {\n                    String keyString = String.format(\"sys:cache:dict::%s:%s\", dictCode, data);\n                    if (redisTemplate.hasKey(keyString)) {\n                        try {\n                            String text = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString));\n                            List<DictModel> list = translText.computeIfAbsent(dictCode, k -> new ArrayList<>());\n                            list.add(new DictModel(data, text));\n                        } catch (Exception e) {\n                            log.warn(e.getMessage());\n                        }\n                    } else if (!needTranslData.contains(data)) {\n                        // 去重添加\n                        needTranslData.add(data);\n                    }\n                }\n\n            }\n            //step.2 调用数据库翻译表字典\n            if (needTranslDataTable.size() > 0) {\n                String[] arr = dictCode.split(\",\");\n                String table = arr[0], text = arr[1], code = arr[2];\n                String values = String.join(\",\", needTranslDataTable);\n                // 自定义的数据源\n                String dataSource = null;\n                if (arr.length > 3) {\n                    dataSource = arr[3];\n                }\n                log.debug(\"translateDictFromTableByKeys.dictCode:\" + dictCode);\n                log.debug(\"translateDictFromTableByKeys.values:\" + values);\n                \n                // 代码逻辑说明: 微服务下为空报错没有参数需要传递空字符串---\n                if(null == dataSource){\n                    dataSource = \"\";\n                }\n                \n                List<DictModel> texts = commonApi.translateDictFromTableByKeys(table, text, code, values, dataSource);\n                log.debug(\"translateDictFromTableByKeys.result:\" + texts);\n                List<DictModel> list = translText.computeIfAbsent(dictCode, k -> new ArrayList<>());\n                list.addAll(texts);\n\n                // 做 redis 缓存\n                for (DictModel dict : texts) {\n                    String redisKey = String.format(\"sys:cache:dictTable::SimpleKey [%s,%s]\", dictCode, dict.getValue());\n                    try {\n                        // 保留5分钟\n                        redisTemplate.opsForValue().set(redisKey, dict.getText(), 300, TimeUnit.SECONDS);\n                    } catch (Exception e) {\n                        log.warn(e.getMessage(), e);\n                    }\n                }\n            }\n        }\n\n        //step.3 调用数据库进行翻译普通字典\n        if (needTranslData.size() > 0) {\n            List<String> dictCodeList = Arrays.asList(dataListMap.keySet().toArray(new String[]{}));\n            // 将不包含逗号的字典code筛选出来，因为带逗号的是表字典，而不是普通的数据字典\n            List<String> filterDictCodes = dictCodeList.stream().filter(key -> !key.contains(\",\")).collect(Collectors.toList());\n            String dictCodes = String.join(\",\", filterDictCodes);\n            String values = String.join(\",\", needTranslData);\n            log.debug(\"translateManyDict.dictCodes:\" + dictCodes);\n            log.debug(\"translateManyDict.values:\" + values);\n            Map<String, List<DictModel>> manyDict = commonApi.translateManyDict(dictCodes, values);\n            log.debug(\"translateManyDict.result:\" + manyDict);\n            for (String dictCode : manyDict.keySet()) {\n                List<DictModel> list = translText.computeIfAbsent(dictCode, k -> new ArrayList<>());\n                List<DictModel> newList = manyDict.get(dictCode);\n                list.addAll(newList);\n\n                // 做 redis 缓存\n                for (DictModel dict : newList) {\n                    String redisKey = String.format(\"sys:cache:dict::%s:%s\", dictCode, dict.getValue());\n                    try {\n                        redisTemplate.opsForValue().set(redisKey, dict.getText());\n                    } catch (Exception e) {\n                        log.warn(e.getMessage(), e);\n                    }\n                }\n            }\n        }\n        return translText;\n    }\n\n    /**\n     * 字典值替换文本\n     *\n     * @param dictModels\n     * @param values\n     * @return\n     */\n    private String translDictText(List<DictModel> dictModels, String values) {\n        List<String> result = new ArrayList<>();\n\n        // 允许多个逗号分隔，允许传数组对象\n        String[] splitVal = values.split(\",\");\n        for (String val : splitVal) {\n            String dictText = val;\n            for (DictModel dict : dictModels) {\n                if (val.equals(dict.getValue())) {\n                    dictText = dict.getText();\n                    break;\n                }\n            }\n            result.add(dictText);\n        }\n        return String.join(\",\", result);\n    }\n\n    /**\n     *  翻译字典文本\n     * @param code\n     * @param text\n     * @param table\n     * @param key\n     * @return\n     */\n    @Deprecated\n    private String translateDictValue(String code, String text, String table, String key) {\n    \tif(oConvertUtils.isEmpty(key)) {\n    \t\treturn null;\n    \t}\n        StringBuffer textValue=new StringBuffer();\n        String[] keys = key.split(\",\");\n        for (String k : keys) {\n            String tmpValue = null;\n            log.debug(\" 字典 key : \"+ k);\n            if (k.trim().length() == 0) {\n                continue; //跳过循环\n            }\n            // 代码逻辑说明: !56 优化微服务应用下存在表字段需要字典翻译时加载缓慢问题-----\n            if (!StringUtils.isEmpty(table)){\n                log.debug(\"--DictAspect------dicTable=\"+ table+\" ,dicText= \"+text+\" ,dicCode=\"+code);\n                String keyString = String.format(\"sys:cache:dictTable::SimpleKey [%s,%s,%s,%s]\",table,text,code,k.trim());\n                    if (redisTemplate.hasKey(keyString)){\n                    try {\n                        tmpValue = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString));\n                    } catch (Exception e) {\n                        log.warn(e.getMessage());\n                    }\n                }else {\n                    tmpValue= commonApi.translateDictFromTable(table,text,code,k.trim());\n                }\n            }else {\n                String keyString = String.format(\"sys:cache:dict::%s:%s\",code,k.trim());\n                if (redisTemplate.hasKey(keyString)){\n                    try {\n                        tmpValue = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString));\n                    } catch (Exception e) {\n                       log.warn(e.getMessage());\n                    }\n                }else {\n                    tmpValue = commonApi.translateDict(code, k.trim());\n                }\n            }\n\n            if (tmpValue != null) {\n                if (!\"\".equals(textValue.toString())) {\n                    textValue.append(\",\");\n                }\n                textValue.append(tmpValue);\n            }\n\n        }\n        return textValue.toString();\n    }\n\n    /**\n     * 检测返回结果集中是否包含Dict注解\n     * @param records\n     * @return\n     */\n    private Boolean checkHasDict(List<Object> records){\n        if(oConvertUtils.isNotEmpty(records) && records.size()>0){\n            for (Field field : oConvertUtils.getAllFields(records.get(0))) {\n                if (oConvertUtils.isNotEmpty(field.getAnnotation(Dict.class))) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/PermissionDataAspect.java",
    "content": "package org.jeecg.common.aspect;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.annotation.Around;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.aspectj.lang.reflect.MethodSignature;\nimport org.jeecg.common.api.CommonAPI;\nimport org.jeecg.common.aspect.annotation.PermissionData;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.system.query.QueryRuleEnum;\nimport org.jeecg.common.system.util.JeecgDataAutorUtils;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.system.vo.SysPermissionDataRuleModel;\nimport org.jeecg.common.system.vo.SysUserCacheInfo;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.stereotype.Component;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.lang.reflect.Method;\nimport java.util.List;\n\n/**\n * 数据权限切面处理类\n *  当被请求的方法有注解PermissionData时,会在往当前request中写入数据权限信息\n * @Date 2019年4月10日\n * @Version: 1.0\n * @author: jeecg-boot\n */\n@Aspect\n@Component\n@Slf4j\npublic class PermissionDataAspect {\n    @Lazy\n    @Autowired\n    private CommonAPI commonApi;\n\n    private static final String SPOT_DO = \".do\";\n\n    @Pointcut(\"@annotation(org.jeecg.common.aspect.annotation.PermissionData)\")\n    public void pointCut() {\n\n    }\n\n    @Around(\"pointCut()\")\n    public Object arround(ProceedingJoinPoint point) throws  Throwable{\n        HttpServletRequest request = SpringContextUtils.getHttpServletRequest();\n        MethodSignature signature = (MethodSignature) point.getSignature();\n        Method method = signature.getMethod();\n        PermissionData pd = method.getAnnotation(PermissionData.class);\n        String component = pd.pageComponent();\n        String requestMethod = request.getMethod();\n        String requestPath = request.getRequestURI().substring(request.getContextPath().length());\n        requestPath = filterUrl(requestPath);\n        //先判断是否online报表请求\n        if(requestPath.indexOf(UrlMatchEnum.CGREPORT_DATA.getMatchUrl())>=0 || requestPath.indexOf(UrlMatchEnum.CGREPORT_ONLY_DATA.getMatchUrl())>=0){\n            // 获取地址栏参数\n            String urlParamString = request.getParameter(CommonConstant.ONL_REP_URL_PARAM_STR);\n            if(oConvertUtils.isNotEmpty(urlParamString)){\n                requestPath+=\"?\"+urlParamString;\n            }\n        }\n        log.debug(\"拦截请求 >> {} ; 请求类型 >> {} . \", requestPath, requestMethod);\n        String username = JwtUtil.getUserNameByToken(request);\n        //查询数据权限信息\n        //TODO 微服务情况下也得支持缓存机制\n        List<SysPermissionDataRuleModel> dataRules = commonApi.queryPermissionDataRule(component, requestPath, username);\n        if(dataRules!=null && dataRules.size()>0) {\n            //临时存储\n            JeecgDataAutorUtils.installDataSearchConditon(request, dataRules);\n            //TODO 微服务情况下也得支持缓存机制\n            SysUserCacheInfo userinfo = commonApi.getCacheUser(username);\n            JeecgDataAutorUtils.installUserInfo(request, userinfo);\n        }\n        return  point.proceed();\n    }\n\n    private String filterUrl(String requestPath){\n        String url = \"\";\n        if(oConvertUtils.isNotEmpty(requestPath)){\n            url = requestPath.replace(\"\\\\\", \"/\");\n            url = url.replace(\"//\", \"/\");\n            if(url.indexOf(SymbolConstant.DOUBLE_SLASH)>=0){\n                url = filterUrl(url);\n            }\n\t\t\t/*if(url.startsWith(\"/\")){\n\t\t\t\turl=url.substring(1);\n\t\t\t}*/\n        }\n        return url;\n    }\n\n    /**\n     * 获取请求地址\n     * @param request\n     * @return\n     */\n    @Deprecated\n    private String getJgAuthRequsetPath(HttpServletRequest request) {\n        String queryString = request.getQueryString();\n        String requestPath = request.getRequestURI();\n        if(oConvertUtils.isNotEmpty(queryString)){\n            requestPath += \"?\" + queryString;\n        }\n        // 去掉其他参数(保留一个参数) 例如：loginController.do?login\n        if (requestPath.indexOf(SymbolConstant.AND) > -1) {\n            requestPath = requestPath.substring(0, requestPath.indexOf(\"&\"));\n        }\n        if(requestPath.indexOf(QueryRuleEnum.EQ.getValue())!=-1){\n            if(requestPath.indexOf(SPOT_DO)!=-1){\n                requestPath = requestPath.substring(0,requestPath.indexOf(\".do\")+3);\n            }else{\n                requestPath = requestPath.substring(0,requestPath.indexOf(\"?\"));\n            }\n        }\n        // 去掉项目路径\n        requestPath = requestPath.substring(request.getContextPath().length() + 1);\n        return filterUrl(requestPath);\n    }\n\n    @Deprecated\n    private boolean moHuContain(List<String> list,String key){\n        for(String str : list){\n            if(key.contains(str)){\n                return true;\n            }\n        }\n        return false;\n    }\n\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/UrlMatchEnum.java",
    "content": "package org.jeecg.common.aspect;\n\n/**\n * @Author scott\n * @Date 2020/1/14 13:36\n * @Description: 请求URL与菜单路由URL转换规则（方便于采用菜单路由URL来配置数据权限规则）\n */\npublic enum UrlMatchEnum {\n    /**求URL与菜单路由URL转换规则 /online/cgform/api/getData/ */\n    CGFORM_DATA(\"/online/cgform/api/getData/\", \"/online/cgformList/\"),\n    /**求URL与菜单路由URL转换规则 /online/cgform/api/exportXls/ */\n    CGFORM_EXCEL_DATA(\"/online/cgform/api/exportXls/\", \"/online/cgformList/\"),\n    /**求URL与菜单路由URL转换规则 /online/cgform/api/getTreeData/ */\n    CGFORM_TREE_DATA(\"/online/cgform/api/getTreeData/\", \"/online/cgformList/\"),\n    /**求URL与菜单路由URL转换规则 /online/cgreport/api/getColumnsAndData/ */\n    CGREPORT_DATA(\"/online/cgreport/api/getColumnsAndData/\", \"/online/cgreport/\"),\n    /** 求URL与菜单路由URL转换规则/online/cgreport/api/getData/ 【vue3报表数据请求地址】 */\n    CGREPORT_ONLY_DATA(\"/online/cgreport/api/getData/\", \"/online/cgreport/\"),\n    /**求URL与菜单路由URL转换规则 /online/cgreport/api/exportXls/ */\n    CGREPORT_EXCEL_DATA(\"/online/cgreport/api/exportXls/\", \"/online/cgreport/\"),\n    /**求URL与菜单路由URL转换规则 /online/cgreport/api/exportManySheetXls/ */\n    CGREPORT_EXCEL_DATA2(\"/online/cgreport/api/exportManySheetXls/\", \"/online/cgreport/\");\n\n    UrlMatchEnum(String url, String matchUrl) {\n        this.url = url;\n        this.matchUrl = matchUrl;\n    }\n\n    /**\n     * Request 请求 URL前缀\n     */\n    private String url;\n    /**\n     * 菜单路由 URL前缀 (对应菜单路径)\n     */\n    private String matchUrl;\n\n    /**\n     * 根据req url 获取到菜单配置路径（前端页面路由URL）\n     *\n     * @param url\n     * @return\n     */\n    public static String getMatchResultByUrl(String url) {\n        //获取到枚举\n        UrlMatchEnum[] values = UrlMatchEnum.values();\n        //加强for循环进行遍历操作\n        for (UrlMatchEnum lr : values) {\n            //如果遍历获取的type和参数type一致\n            if (url.indexOf(lr.url) != -1) {\n                //返回type对象的desc\n                return url.replace(lr.url, lr.matchUrl);\n            }\n        }\n        return null;\n    }\n\n    public String getMatchUrl() {\n        return matchUrl;\n    }\n    //    public static void main(String[] args) {\n//        /**\n//         * 比如request真实请求URL: /online/cgform/api/getData/81fcf7d8922d45069b0d5ba983612d3a\n//         * 转换匹配路由URL后（对应配置的菜单路径）:/online/cgformList/81fcf7d8922d45069b0d5ba983612d3a\n//         */\n//        System.out.println(UrlMatchEnum.getMatchResultByUrl(\"/online/cgform/api/getData/81fcf7d8922d45069b0d5ba983612d3a\"));\n//    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/AutoDict.java",
    "content": "package org.jeecg.common.aspect.annotation;\n\nimport java.lang.annotation.*;\n\n/**\n * 通过此注解声明的接口，自动实现字典翻译\n * \n * @Author scott\n * @email jeecgos@163.com\n * @Date 2022年01月05日\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\npublic @interface AutoDict {\n\n\t/**\n\t * 暂时无用\n\t * @return\n\t */\n\tString value() default \"\";\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/AutoLog.java",
    "content": "package org.jeecg.common.aspect.annotation;\n\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.enums.ModuleType;\n\nimport java.lang.annotation.*;\n\n/**\n * 系统日志注解\n * \n * @Author scott\n * @email jeecgos@163.com\n * @Date 2019年1月14日\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\npublic @interface AutoLog {\n\n\t/**\n\t * 日志内容\n\t * \n\t * @return\n\t */\n\tString value() default \"\";\n\n\t/**\n\t * 日志类型\n\t * \n\t * @return 0:操作日志;1:登录日志;2:定时任务;\n\t */\n\tint logType() default CommonConstant.LOG_TYPE_2;\n\t\n\t/**\n\t * 操作日志类型\n\t * \n\t * @return （1查询，2添加，3修改，4删除）\n\t */\n\tint operateType() default 0;\n\n\t/**\n\t * 模块类型 默认为common\n\t * @return\n\t */\n\tModuleType module() default ModuleType.COMMON;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/Dict.java",
    "content": "package org.jeecg.common.aspect.annotation;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * 字典注解\n * @author: dangzhenghui\n * @date: 2019年03月17日-下午9:37:16\n */\n@Target(ElementType.FIELD)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface Dict {\n    /**\n     * 方法描述:  数据code\n     * 作    者： dangzhenghui\n     * 日    期： 2019年03月17日-下午9:37:16\n     *\n     * @return 返回类型： String\n     */\n    String dicCode();\n\n    /**\n     * 方法描述:  数据Text\n     * 作    者： dangzhenghui\n     * 日    期： 2019年03月17日-下午9:37:16\n     *\n     * @return 返回类型： String\n     */\n    String dicText() default \"\";\n\n    /**\n     * 方法描述: 数据字典表\n     * 作    者： dangzhenghui\n     * 日    期： 2019年03月17日-下午9:37:16\n     *\n     * @return 返回类型： String\n     */\n    String dictTable() default \"\";\n\n\n    /**\n     * 方法描述: 数据字典表所在数据源名称\n     * 作    者： chenrui\n     * 日    期： 2023年12月20日-下午4:58\n     *\n     * @return 返回类型： String\n     */\n    String ds() default \"\";\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/DynamicTable.java",
    "content": "package org.jeecg.common.aspect.annotation;\n\nimport java.lang.annotation.*;\n\n/**\n * 动态table切换\n *\n * @author :zyf\n * @date:2020-04-25\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\npublic @interface DynamicTable {\n    /**\n     * 需要动态解析的表名\n     * @return\n     */\n    String value();\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/OnlineAuth.java",
    "content": "package org.jeecg.common.aspect.annotation;\n\nimport java.lang.annotation.*;\n\n/**\n * online请求拦截专用注解\n * @author: jeecg-boot\n */\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.TYPE,ElementType.METHOD})\n@Documented\npublic @interface OnlineAuth {\n\n    /**\n     * 请求关键字，在xxx/code之前的字符串\n     * @return\n     */\n    String value();\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/PermissionData.java",
    "content": "package org.jeecg.common.aspect.annotation;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n  *  数据权限注解\n * @Author taoyan\n * @Date 2019年4月11日\n */\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.TYPE,ElementType.METHOD})\n@Documented\npublic @interface PermissionData {\n\t/**\n\t * 暂时没用\n\t * @return\n\t */\n\tString value() default \"\";\n\t\n\t\n\t/**\n\t * 配置菜单的组件路径,用于数据权限\n\t */\n\tString pageComponent() default \"\";\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java",
    "content": "package org.jeecg.common.constant;\n\n/**\n * @Description: 通用常量\n * @author: jeecg-boot\n */\npublic interface CommonConstant {\n\n\t/**\n\t * 正常状态\n\t */\n\tInteger STATUS_NORMAL = 0;\n\n\t/**\n\t * 禁用状态\n\t */\n\tInteger STATUS_DISABLE = -1;\n\n\t/**\n\t * 删除标志\n\t */\n\tInteger DEL_FLAG_1 = 1;\n\n\t/**\n\t * 未删除\n\t */\n\tInteger DEL_FLAG_0 = 0;\n\n\t/**\n\t * 系统日志类型： 登录\n\t */\n\tint LOG_TYPE_1 = 1;\n\t\n\t/**\n\t * 系统日志类型： 操作\n\t */\n\tint LOG_TYPE_2 = 2;\n\n    /**\n     * 系统日志类型： 租户操作日志\n     */\n    int LOG_TYPE_3 = 3;\n\n    /**\n     * 系统日志类型： 异常\n     */\n    int LOG_TYPE_4 = 4;\n\n\t/**\n\t * 操作日志类型： 查询\n\t */\n\tint OPERATE_TYPE_1 = 1;\n\t\n\t/**\n\t * 操作日志类型： 添加\n\t */\n\tint OPERATE_TYPE_2 = 2;\n\t\n\t/**\n\t * 操作日志类型： 更新\n\t */\n\tint OPERATE_TYPE_3 = 3;\n\t\n\t/**\n\t * 操作日志类型： 删除\n\t */\n\tint OPERATE_TYPE_4 = 4;\n\t\n\t/**\n\t * 操作日志类型： 倒入\n\t */\n\tint OPERATE_TYPE_5 = 5;\n\t\n\t/**\n\t * 操作日志类型： 导出\n\t */\n\tint OPERATE_TYPE_6 = 6;\n\t\n\t\n\t/** {@code 500 Server Error} (HTTP/1.0 - RFC 1945) */\n    Integer SC_INTERNAL_SERVER_ERROR_500 = 500;\n    /** {@code 404 Not Found} (HTTP/1.0 - RFC 1945) */\n    Integer SC_INTERNAL_NOT_FOUND_404 = 404;\n    /** {@code 200 OK} (HTTP/1.0 - RFC 1945) */\n    Integer SC_OK_200 = 200;\n    \n    /**访问权限认证未通过 510*/\n    Integer SC_JEECG_NO_AUTHZ=510;\n\n    /** 登录用户Shiro权限缓存KEY前缀 */\n    public static String PREFIX_USER_SHIRO_CACHE  = \"shiro:cache:org.jeecg.config.shiro.ShiroRealm.authorizationCache:\";\n    /** 登录用户Token令牌缓存KEY前缀 */\n    String PREFIX_USER_TOKEN  = \"prefix_user_token:\";\n    /** 登录用户Token令牌作废提示信息，比如 “不允许同一账号多地同时登录，会往这个变量存提示信息” */\n    String PREFIX_USER_TOKEN_ERROR_MSG  = \"prefix_user_token:error:msg_\";\n\n    /**============================== 【是否允许同一账号多地同时登录】登录客户端类型常量 ==============================*/\n    /** 客户端类型：PC端 */\n    String CLIENT_TYPE_PC = \"PC\";\n    /** 客户端类型：APP端 */\n    String CLIENT_TYPE_APP = \"APP\";\n    /** 客户端类型：手机号登录 */\n    String CLIENT_TYPE_PHONE = \"PHONE\";\n    String PREFIX_USER_TOKEN_PC = \"prefix_user_token:single_login:pc:\";\n    /** 单点登录：用户在APP端的Token缓存KEY前缀 (username -> token) */\n    String PREFIX_USER_TOKEN_APP = \"prefix_user_token:single_login:app:\";\n    /** 单点登录：用户在手机号登录的Token缓存KEY前缀 (username -> token) */\n    String PREFIX_USER_TOKEN_PHONE = \"prefix_user_token:single_login:phone:\";\n    /**============================== 【是否允许同一账号多地同时登录】登录客户端类型常量 ==============================*/\n    \n//    /** Token缓存时间：3600秒即一小时 */\n//    int  TOKEN_EXPIRE_TIME  = 3600;\n\n    /** 登录二维码 */\n    String  LOGIN_QRCODE_PRE  = \"QRCODELOGIN:\";\n    String  LOGIN_QRCODE  = \"LQ:\";\n    /** 登录二维码token */\n    String  LOGIN_QRCODE_TOKEN  = \"LQT:\";\n\n\n    /**\n     *  0：一级菜单\n     */\n    Integer MENU_TYPE_0  = 0;\n   /**\n    *  1：子菜单 \n    */\n    Integer MENU_TYPE_1  = 1;\n    /**\n     *  2：按钮权限\n     */\n    Integer MENU_TYPE_2  = 2;\n\n    /**通告对象类型（USER:指定用户，ALL:全体用户）*/\n    String MSG_TYPE_UESR  = \"USER\";\n    String MSG_TYPE_ALL  = \"ALL\";\n    \n    /**发布状态（0未发布，1已发布，2已撤销）*/\n    String NO_SEND  = \"0\";\n    String HAS_SEND  = \"1\";\n    String HAS_CANCLE  = \"2\";\n    \n    /**阅读状态（0未读，1已读）*/\n    Integer HAS_READ_FLAG  = 1;\n    Integer NO_READ_FLAG  = 0;\n    \n    /**优先级（L低，M中，H高）*/\n    String PRIORITY_L  = \"L\";\n    String PRIORITY_M  = \"M\";\n    String PRIORITY_H  = \"H\";\n    \n    /**\n     * 短信模板方式  0 .登录模板、1.注册模板、2.忘记密码模板\n     */\n    String SMS_TPL_TYPE_0  = \"0\";\n    String SMS_TPL_TYPE_1  = \"1\";\n    String SMS_TPL_TYPE_2  = \"2\";\n    \n    /**\n     * 状态(0无效1有效)\n     */\n    String STATUS_0 = \"0\";\n    String STATUS_1 = \"1\";\n    Integer STATUS_0_INT = 0;\n    Integer STATUS_1_INT = 1;\n\n    /**\n     * 同步工作流引擎1同步0不同步\n     */\n    Integer ACT_SYNC_1 = 1;\n    Integer ACT_SYNC_0 = 0;\n\n    /**\n     * 消息类型1:通知公告2:系统消息\n     */\n    String MSG_CATEGORY_1 = \"1\";\n    String MSG_CATEGORY_2 = \"2\";\n    \n    /**\n     * 是否配置菜单的数据权限 1是0否\n     */\n    Integer RULE_FLAG_0 = 0;\n    Integer RULE_FLAG_1 = 1;\n\n    /**\n     * 是否用户已被冻结 1正常(解冻) 2冻结 3离职\n     */\n    Integer USER_UNFREEZE = 1;\n    Integer USER_FREEZE = 2;\n    Integer USER_QUIT = 3;\n    \n    /**字典翻译文本后缀*/\n    String DICT_TEXT_SUFFIX = \"_dictText\";\n    /**字典翻译颜色后缀*/\n    String DICT_COLOR_SUFFIX = \"_dictColor\";\n\n    /**\n     * 表单设计器主表类型\n     */\n    Integer DESIGN_FORM_TYPE_MAIN = 1;\n\n    /**\n     * 表单设计器子表表类型\n     */\n    Integer DESIGN_FORM_TYPE_SUB = 2;\n\n    /**\n     * 表单设计器URL授权通过\n     */\n    Integer DESIGN_FORM_URL_STATUS_PASSED = 1;\n\n    /**\n     * 表单设计器URL授权未通过\n     */\n    Integer DESIGN_FORM_URL_STATUS_NOT_PASSED = 2;\n\n    /**\n     * 表单设计器新增 Flag\n     */\n    String DESIGN_FORM_URL_TYPE_ADD = \"add\";\n    /**\n     * 表单设计器修改 Flag\n     */\n    String DESIGN_FORM_URL_TYPE_EDIT = \"edit\";\n    /**\n     * 表单设计器详情 Flag\n     */\n    String DESIGN_FORM_URL_TYPE_DETAIL = \"detail\";\n    /**\n     * 表单设计器复用数据 Flag\n     */\n    String DESIGN_FORM_URL_TYPE_REUSE = \"reuse\";\n    /**\n     * 表单设计器编辑 Flag （已弃用）\n     */\n    String DESIGN_FORM_URL_TYPE_VIEW = \"view\";\n\n    /**\n     * online参数值设置（是：Y, 否：N）\n     */\n    String ONLINE_PARAM_VAL_IS_TURE = \"Y\";\n    String ONLINE_PARAM_VAL_IS_FALSE = \"N\";\n\n    /**\n     * 文件上传类型（本地：local，Minio：minio，阿里云：alioss）\n     */\n    String UPLOAD_TYPE_LOCAL = \"local\";\n    String UPLOAD_TYPE_MINIO = \"minio\";\n    String UPLOAD_TYPE_OSS = \"alioss\";\n\n    /**\n     * 文档上传自定义桶名称\n     */\n    String UPLOAD_CUSTOM_BUCKET = \"eoafile\";\n    /**\n     * 文档上传自定义路径\n     */\n    String UPLOAD_CUSTOM_PATH = \"eoafile\";\n    /**\n     * 文件外链接有效天数\n     */\n    Integer UPLOAD_EFFECTIVE_DAYS = 1;\n\n    /**\n     * 员工身份 （1:普通员工  2:上级）\n     */\n    Integer USER_IDENTITY_1 = 1;\n    Integer USER_IDENTITY_2 = 2;\n\n    /** sys_user 表 username 唯一键索引 */\n    String SQL_INDEX_UNIQ_SYS_USER_USERNAME = \"uniq_sys_user_username\";\n    /** sys_user 表 work_no 唯一键索引 */\n    String SQL_INDEX_UNIQ_SYS_USER_WORK_NO = \"uniq_sys_user_work_no\";\n    /** sys_user 表 phone 唯一键索引 */\n    String SQL_INDEX_UNIQ_SYS_USER_PHONE = \"uniq_sys_user_phone\";\n    /** 达梦数据库升提示。违反表[SYS_USER]唯一性约束 */\n    String SQL_INDEX_UNIQ_SYS_USER = \"唯一性约束\";\n\n    /** sys_user 表 email 唯一键索引 */\n    String SQL_INDEX_UNIQ_SYS_USER_EMAIL = \"uniq_sys_user_email\";\n    /** sys_quartz_job 表 job_class_name 唯一键索引 */\n    String SQL_INDEX_UNIQ_JOB_CLASS_NAME = \"uniq_job_class_name\";\n    /** sys_position 表 code 唯一键索引 */\n    String SQL_INDEX_UNIQ_CODE = \"uniq_code\";\n    /** sys_role 表 code 唯一键索引 */\n    String SQL_INDEX_UNIQ_SYS_ROLE_CODE = \"uniq_sys_role_role_code\";\n    /** sys_depart 表 code 唯一键索引 */\n    String SQL_INDEX_UNIQ_DEPART_ORG_CODE = \"uniq_depart_org_code\";\n    /** sys_category 表 code 唯一键索引 */\n    String SQL_INDEX_UNIQ_CATEGORY_CODE = \"idx_sc_code\";\n    /**\n     * 在线聊天 是否为默认分组\n     */\n    String IM_DEFAULT_GROUP = \"1\";\n    /**\n     * 在线聊天 图片文件保存路径\n     */\n    String IM_UPLOAD_CUSTOM_PATH = \"biz/user_imgs\";\n    /**\n     * 在线聊天 用户状态\n     */\n    String IM_STATUS_ONLINE = \"online\";\n\n    /**\n     * 在线聊天 SOCKET消息类型\n     */\n    String IM_SOCKET_TYPE = \"chatMessage\";\n\n    /**\n     * 在线聊天 是否开启默认添加好友 1是 0否\n     */\n    String IM_DEFAULT_ADD_FRIEND = \"1\";\n\n    /**\n     * 在线聊天 用户好友缓存前缀\n     */\n    String IM_PREFIX_USER_FRIEND_CACHE = \"sys:cache:im:im_prefix_user_friend_\";\n    /**\n     * 缓存用户id与用户名关系\n     */\n    String SYS_USER_ID_MAPPING_CACHE = \"sys:cache:user:id_mapping\";\n\n    /**\n     * 系统角色管理员编码\n     */\n    String SYS_ROLE_ADMIN = \"admin\";\n\n    /**\n     * 考勤补卡业务状态 （0：处理中）\n     */\n    String SIGN_PATCH_BIZ_STATUS_0 = \"0\";\n    /**\n     * 考勤补卡业务状态 （1：同意  2：不同意）\n     */\n    String SIGN_PATCH_BIZ_STATUS_1 = \"1\";\n    String SIGN_PATCH_BIZ_STATUS_2 = \"2\";\n\n    /**\n     * 公文文档上传自定义路径\n     */\n    String UPLOAD_CUSTOM_PATH_OFFICIAL = \"officialdoc\";\n     /**\n     * 公文文档下载自定义路径\n     */\n    String DOWNLOAD_CUSTOM_PATH_OFFICIAL = \"officaldown\";\n\n    /**\n     * WPS存储值类别(1 code文号 2 text（WPS模板还是公文发文模板）)\n     */\n    String WPS_TYPE_1=\"1\";\n    String WPS_TYPE_2=\"2\";\n\n\n    /**===============================================================================================*/\n    /**\n     * ::非常重要::\n     * 注意：这四个常量值如果修改，需要与 jeecg-boot-starter/jeecg-boot-common/org.jeecg.config.FeignConfig 类中的值保持一致。\n     */\n    String X_ACCESS_TOKEN = \"X-Access-Token\";\n    String X_SIGN = \"X-Sign\";\n    String X_TIMESTAMP = \"X-TIMESTAMP\";\n    /** 租户请求头 更名为：X-Tenant-Id */\n    String TENANT_ID = \"X-Tenant-Id\";\n    /** 简流接口请求头，用于排除不支持的控件字段  */\n    String X_MiniFlowExclusionFieldMode = \"X-Miniflowexclusionfieldmode\";\n    /**===============================================================================================*/\n\n    String TOKEN_IS_INVALID_MSG = \"Token失效，请重新登录!\";\n    String X_FORWARDED_SCHEME = \"X-Forwarded-Scheme\";\n\n\n    /**\n     * 微服务读取配置文件属性 服务地址\n     */\n    String CLOUD_SERVER_KEY = \"spring.cloud.nacos.discovery.server-addr\";\n\n    /**\n     * 第三方登录 验证密码/创建用户 都需要设置一个操作码 防止被恶意调用\n     */\n    String THIRD_LOGIN_CODE = \"third_login_code\";\n\n    /**\n     * 第三方APP同步方向：本地 --> 第三方APP\n     */\n    String THIRD_SYNC_TO_APP = \"SYNC_TO_APP\";\n    /**\n     * 第三方APP同步方向：第三方APP --> 本地\n     */\n    String THIRD_SYNC_TO_LOCAL = \"SYNC_TO_LOCAL\";\n\n    /** 系统通告消息状态：0=未发布 */\n    String ANNOUNCEMENT_SEND_STATUS_0 = \"0\";\n    /** 系统通告消息状态：1=已发布 */\n    String ANNOUNCEMENT_SEND_STATUS_1 = \"1\";\n    /** 系统通告消息状态：2=已撤销 */\n    String ANNOUNCEMENT_SEND_STATUS_2 = \"2\";\n\n    /**ONLINE 报表权限用 从request中获取地址栏后的参数*/\n    String ONL_REP_URL_PARAM_STR=\"onlRepUrlParamStr\";\n\n    /**POST请求*/\n    String HTTP_POST = \"POST\";\n\n    /**PUT请求*/\n    String HTTP_PUT = \"PUT\";\n\n    /**PATCH请求*/\n    String HTTP_PATCH = \"PATCH\";\n\n    /**未知的*/\n    String UNKNOWN = \"unknown\";\n\n    /**字符串http*/\n    String STR_HTTP = \"http\";\n\n    /**String 类型的空值*/\n    String STRING_NULL = \"null\";\n\n    /**前端vue3版本Header参数名*/\n    String VERSION=\"X-Version\";\n\n    String VERSION_V3 = \"v3\";\n\n    /**存储在线程变量里的动态表名*/\n    String DYNAMIC_TABLE_NAME=\"DYNAMIC_TABLE_NAME\";\n    /**\n     * http:// http协议\n     */\n    String HTTP_PROTOCOL = \"http://\";\n\n    /**\n     * https:// https协议\n     */\n    String HTTPS_PROTOCOL = \"https://\";\n    \n    /** 部门表唯一key，id */\n    String DEPART_KEY_ID = \"id\";\n    /** 部门表唯一key，orgCode */\n    String DEPART_KEY_ORG_CODE = \"orgCode\";\n\n    /**======【消息推送相关】==============================================================================*/\n    /**\n     * 发消息 会传递一些信息到map\n     */\n    String NOTICE_MSG_SUMMARY = \"NOTICE_MSG_SUMMARY\";\n\n    /**\n     * 发消息 会传递一个业务ID到map\n     */\n    String NOTICE_MSG_BUS_ID = \"NOTICE_MSG_BUS_ID\";\n\n   /**\n    * 发消息 消息业务类型\n    */\n   String NOTICE_MSG_BUS_TYPE = \"NOTICE_MSG_BUS_TYPE\";\n\n    /**\n     * 通知类型，用于区分来源 file 知识 flow 流程 plan 日程 system 系统消息 \n     */\n    String NOTICE_TYPE = \"noticeType\";\n\n    /**\n     * 邮箱消息中地址登录时地址后携带的token,需要替换成真实的token值\n     */\n    String LOGIN_TOKEN = \"{LOGIN_TOKEN}\";\n\n    /**\n     * 模板消息中 跳转地址的对应的key\n     */\n    String MSG_HREF_URL = \"url\";\n\n    /**\n     * sys_data_log表的类型 用于区别评论区域的日志数据\n     */\n    String DATA_LOG_TYPE_COMMENT = \"comment\";\n\n    /**\n     * sys_data_log表的类型 老的数据比较 类型都设置为json\n     */\n    String DATA_LOG_TYPE_JSON = \"json\";\n\n    /** 消息模板：markdown */\n    String MSG_TEMPLATE_TYPE_MD = \"5\";\n    /**========【消息推送相关】==========================================================================*/\n\n    /**\n     * 短信验证码redis-key的前缀\n     */\n    String PHONE_REDIS_KEY_PRE = \"phone_msg\";\n\n    /**\n     * 是文件夹\n     */\n    String IT_IS_FOLDER = \"1\";\n\n    /**\n     * 文件拥有者\n     */\n    String FILE_OWNER = \"owner\";\n\n    /**\n     * 文件管理员\n     */\n    String FILE_ADMIN = \"admin\";\n\n    /**\n     * 只允许编辑\n     */\n    String FILE_EDITABLE = \"editable\";\n\n    /**\n     * 文件 只读\n     */\n    String FILE_READONLY = \"readonly\";\n\n    /**\n     * 登录失败，用于记录失败次数的key\n     */\n    String LOGIN_FAIL = \"LOGIN_FAIL_\";\n\n    /**\n     * 入职事件\n     */\n    Integer BPM_USER_EVENT_ADD = 1;\n\n   /**\n    * 离职事件\n    */\n    Integer BPM_USER_EVENT_LEVEL = 2;\n\n   /**\n    * 用户租户状态(正常/已通过审核的)\n    */\n   String USER_TENANT_NORMAL = \"1\";\n\n   /**\n    * 用户租户状态(离职)\n    */\n   String USER_TENANT_QUIT = \"2\";\n\n   /**\n    * 用户租户状态(审核中)\n    */\n   String USER_TENANT_UNDER_REVIEW = \"3\";\n   \n   /**\n    * 用户租户状态(拒绝)\n    */\n   String USER_TENANT_REFUSE = \"4\";\n\n   /**\n    * 用户租户状态(邀请)\n    */\n   String USER_TENANT_INVITE = \"5\";\n   \n   /**\n    * 不是叶子节点\n    */\n   Integer NOT_LEAF = 0;\n\n   /**\n    * 是叶子节点\n    */\n   Integer IS_LEAF = 1;\n\n   /**\n    * 钉钉\n    */\n   String DINGTALK = \"DINGTALK\";\n\n   /**\n    * 企业微信\n    */\n   String WECHAT_ENTERPRISE = \"WECHAT_ENTERPRISE\";\n\n  /**\n   * 系统默认租户id 0\n   */\n  Integer TENANT_ID_DEFAULT_VALUE = 0;\n\n /**\n  * 【low-app用】 应用级别的复制\n  */\n String COPY_LEVEL_APP = \"app\";\n\n /**\n  * 【low-app用】 菜单级别的复制\n  */\n String COPY_LEVEL_MENU = \"menu\";\n\n\n /**\n  * 【low-app用】 应用备份\n  */\n String COPY_LEVEL_BAK = \"backup\";\n\n /**\n  * 【low-app用】 从备份还原\n  */\n String COPY_LEVEL_COVER = \"cover\";\n\n /** 【QQYUN-6034】关联字段变更历史值，缓存半个小时 */\n String CACHE_REL_FIELD_OLD_VAL = \"sys:cache:desform:relFieldOldVal:\";\n\n    /**\n     * 排序类型：升序\n     */\n    String ORDER_TYPE_ASC = \"ASC\";\n    /**\n     * 排序类型：降序\n     */\n    String ORDER_TYPE_DESC = \"DESC\";\n\n\n   /**\n    * 报表允许设计开发的角色\n    */\n   public static String[] allowDevRoles = new String[]{\"lowdeveloper\", \"admin\"};\n   /**\n    * 【对应积木报表的常量】\n    * 数据隔离模式： 按照创建人隔离\n    */\n   public static final String SAAS_MODE_CREATED = \"created\";\n   /**\n    * 【对应积木报表的常量】\n    * 数据隔离模式： 按照租户隔离\n    */\n   public static final String SAAS_MODE_TENANT = \"tenant\";\n \n   /**\n    * 修改手机号短信验证码redis-key的前缀\n    */\n   String CHANGE_PHONE_REDIS_KEY_PRE = \"sys:cache:phone:change_phone_msg:\";\n\n  /**\n   * 手机号短信验证码redis-key的前缀\n   */\n   String LOG_OFF_PHONE_REDIS_KEY_PRE = \"sys:cache:phone:qqy_log_off_user_msg:\";\n\n    /**\n     * 缓存用户最后一次收到消息通知的时间 KEY\n     */\n   String CACHE_KEY_USER_LAST_ANNOUNT_TIME_1HOUR = \"sys:cache:userinfo:user_last_annount_time::%s\";\n   \n   /**\n    * 验证原手机号\n    */\n   String VERIFY_ORIGINAL_PHONE = \"verifyOriginalPhone\";\n\n   /**\n    * 修改手机号\n    */\n   String UPDATE_PHONE = \"updatePhone\";\n    \n   /**\n    * 修改手机号验证码请求次数超出\n    */\n   Integer PHONE_SMS_FAIL_CODE = 40002;\n\n\n    /**\n     * 自定义首页关联关系(ROLE:表示角色 USER:表示用户 DEFAULT:默认首页)\n     *\n     */\n    String HOME_RELATION_ROLE = \"ROLE\";\n    String HOME_RELATION_USER = \"USER\";\n    String HOME_RELATION_DEFAULT = \"DEFAULT\";\n\n    /**\n     * 是否置顶(0否 1是)\n     */\n    Integer IZ_TOP_1 = 1;\n    Integer IZ_TOP_0 = 0;\n    \n    \n    //关注流程缓存前缀\n    String FLOW_FOCUS_NOTICE_PREFIX = \"flow:runtimeData:focus:notice:\";\n    //任务缓办时间缓存前缀\n    String FLOW_TASK_DELAY_PREFIX = \"flow:runtimeData:task:delay:\";\n    /**\n     * 用户代理类型：离职：quit 代理：agent\n     */\n    String USER_AGENT_TYPE_QUIT = \"quit\";\n    String USER_AGENT_TYPE_AGENT = \"agent\";\n    /**\n     * 督办流程首节点任务taskKey\n     */\n    String SUPERVISE_FIRST_TASK_KEY = \"Task_1bhxpt0\";\n\n    /**\n     * wps模板预览数据缓存前缀\n     */\n    String EOA_WPS_TEMPLATE_VIEW_DATA =\"eoa:wps:templateViewData:\";\n\n    /**\n     * wps模板预览版本号缓存前缀\n     */\n    String EOA_WPS_TEMPLATE_VIEW_VERSION =\"eoa:wps:templateViewVersion:\";\n    /**\n     * 表单设计器oa新增字段\n     * x_oa_timeout_date:逾期时间\n     * x_oa_archive_status:归档状态\n     */\n    String X_OA_TIMEOUT_DATE =\"x_oa_timeout_date\";\n    String X_OA_ARCHIVE_STATUS =\"x_oa_archive_status\";\n    /**\n     * 流程状态\n     * 待提交: 1\n     * 处理中: 2\n     * 已完成: 3\n     * 已作废: 4\n     * 已挂起: 5\n     */\n    String BPM_STATUS_1 =\"1\";\n    String BPM_STATUS_2 =\"2\";\n    String BPM_STATUS_3 =\"3\";\n    String BPM_STATUS_4 =\"4\";\n    String BPM_STATUS_5 =\"5\";\n\n    /**\n     * 默认租户产品包\n     */\n    String TENANT_PACK_DEFAULT = \"default\";\n\n    /**\n     * 部门名称redisKey(全路径)\n     */\n    String DEPART_NAME_REDIS_KEY_PRE = \"sys:cache:departPathName:\";\n\n    /**\n     * 默认用户排序值\n     */\n    Integer DEFAULT_USER_SORT = 1000;\n\n    /**\n     * 发送短信方式：腾讯\n     */\n    String SMS_SEND_TYPE_TENCENT = \"tencent\";\n\n    /**\n     * 发送短信方式：阿里云\n     */\n    String SMS_SEND_TYPE_ALI_YUN = \"aliyun\";\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonSendStatus.java",
    "content": "package org.jeecg.common.constant;\n\n/**\n * \t系统通告 - 发布状态\n * @Author LeeShaoQing\n *\n */\npublic interface CommonSendStatus {\n\n    /**\n     * 未发布\n     */\n    public static final String UNPUBLISHED_STATUS_0 = \"0\";\n\n    /**\n     * 已发布\n     */\n\tpublic static final String PUBLISHED_STATUS_1 = \"1\";\n\n    /**\n     * 撤销\n     */\n\tpublic static final String REVOKE_STATUS_2 = \"2\";\n\n    /**\n     * app端推送会话标识后缀\n     */\n\tpublic static final String  APP_SESSION_SUFFIX = \"_app\";\n\n\n\t/**-----【流程相关通知模板code】------------------------------------------------------------*/\n\t/**流程催办——系统通知消息模板*/\n\tpublic static final String TZMB_BPM_CUIBAN = \"bpm_cuiban\";\n\t/**流程抄送——系统通知消息模板*/\n\tpublic static final String TZMB_BPM_CC = \"bpm_cc\";\n\t/**流程催办——邮件通知消息模板*/\n\tpublic static final String TZMB_BPM_CUIBAN_EMAIL = \"bpm_cuiban_email\";\n\t/**标准模板—系统消息通知*/\n\tpublic static final String TZMB_SYS_TS_NOTE = \"sys_ts_note\";\n\t/**流程超时提醒——系统通知消息模板*/\n\tpublic static final String TZMB_BPM_CHAOSHI_TIP = \"bpm_chaoshi_tip\";\n\t/**-----【流程相关通知模板code】-----------------------------------------------------------*/\n\n\t/**\n\t * 系统通知拓展参数（比如：用于流程抄送和催办通知，这里额外传递流程跳转页面所需要的路由参数）\n\t */\n\tpublic static final String MSG_ABSTRACT_JSON = \"msg_abstract\";\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/DataBaseConstant.java",
    "content": "package org.jeecg.common.constant;\n/**\n * 数据库上下文常量\n * @author: jeecg-boot\n */\npublic interface DataBaseConstant {\n\n\t/**\n\t * 内置的系统变量键列表\n\t */\n\tpublic static final String[] SYSTEM_KEYS = {\n\t\t\tDataBaseConstant.SYS_ORG_CODE, DataBaseConstant.SYS_ORG_CODE_TABLE, DataBaseConstant.SYS_MULTI_ORG_CODE,\n\t\t\tDataBaseConstant.SYS_MULTI_ORG_CODE_TABLE, DataBaseConstant.SYS_ORG_ID, DataBaseConstant.SYS_ORG_ID_TABLE,\n\t\t\tDataBaseConstant.SYS_ROLE_CODE, DataBaseConstant.SYS_ROLE_CODE_TABLE, DataBaseConstant.SYS_USER_CODE,\n\t\t\tDataBaseConstant.SYS_USER_CODE_TABLE, DataBaseConstant.SYS_USER_ID, DataBaseConstant.SYS_USER_ID_TABLE,\n\t\t\tDataBaseConstant.SYS_USER_NAME, DataBaseConstant.SYS_USER_NAME_TABLE, DataBaseConstant.SYS_DATE,\n\t\t\tDataBaseConstant.SYS_DATE_TABLE, DataBaseConstant.SYS_TIME, DataBaseConstant.SYS_TIME_TABLE,\n\t\t\tDataBaseConstant.SYS_BASE_PATH\n\t};\n\t\n\t//*********数据库类型****************************************\n\n    /**MYSQL数据库*/\n\tpublic static final String DB_TYPE_MYSQL = \"MYSQL\";\n\n    /** ORACLE*/\n\tpublic static final String DB_TYPE_ORACLE = \"ORACLE\";\n\n    /**达梦数据库*/\n\tpublic static final String DB_TYPE_DM = \"DM\";\n\n    /**postgreSQL达梦数据库*/\n\tpublic static final String DB_TYPE_POSTGRESQL = \"POSTGRESQL\";\n\t\n    /**人大金仓数据库*/\n\tpublic static final String DB_TYPE_KINGBASEES = \"KINGBASEES\";\n\n    /**sqlserver数据库*/\n\tpublic static final String DB_TYPE_SQLSERVER = \"SQLSERVER\";\n\n    /**mariadb 数据库*/\n\tpublic static final String DB_TYPE_MARIADB = \"MARIADB\";\n\n    /**DB2 数据库*/\n\tpublic static final String DB_TYPE_DB2 = \"DB2\";\n\n    /**HSQL 数据库*/\n\tpublic static final String DB_TYPE_HSQL = \"HSQL\";\n\n//\t// 数据库类型，对应 database_type 字典\n//\tpublic static final String DB_TYPE_MYSQL_NUM = \"1\";\n//\tpublic static final String DB_TYPE_MYSQL7_NUM = \"6\";\n//\tpublic static final String DB_TYPE_ORACLE_NUM = \"2\";\n//\tpublic static final String DB_TYPE_SQLSERVER_NUM = \"3\";\n//\tpublic static final String DB_TYPE_POSTGRESQL_NUM = \"4\";\n//\tpublic static final String DB_TYPE_MARIADB_NUM = \"5\";\n\n\t//*********系统上下文变量****************************************\n\t/**\n\t * 数据-所属机构编码\n\t */\n\tpublic static final String SYS_ORG_CODE = \"sysOrgCode\";\n\t/**\n\t * 数据-所属机构编码\n\t */\n\tpublic static final String SYS_ORG_CODE_TABLE = \"sys_org_code\";\n\t/**\n\t * 数据-所属机构编码\n\t */\n\tpublic static final String SYS_MULTI_ORG_CODE = \"sysMultiOrgCode\";\n\t/**\n\t * 数据-所属机构编码\n\t */\n\tpublic static final String SYS_MULTI_ORG_CODE_TABLE = \"sys_multi_org_code\";\n\t/**\n\t * 数据-所属机构ID\n\t */\n\tpublic static final String SYS_ORG_ID = \"sysOrgId\";\n\t/**\n\t * 数据-所属机构ID\n\t */\n\tpublic static final String SYS_ORG_ID_TABLE = \"sys_org_id\";\n\t/**\n\t * 数据-所属角色code（多个逗号分割）\n\t */\n\tpublic static final String SYS_ROLE_CODE = \"sysRoleCode\";\n\t/**\n\t * 数据-所属角色code（多个逗号分割）\n\t */\n\tpublic static final String SYS_ROLE_CODE_TABLE = \"sys_role_code\";\n\t/**\n\t * 数据-系统用户编码（对应登录用户账号）\n\t */\n\tpublic static final String SYS_USER_CODE = \"sysUserCode\";\n\t/**\n\t * 数据-系统用户编码（对应登录用户账号）\n\t */\n\tpublic static final String SYS_USER_CODE_TABLE = \"sys_user_code\";\n\t/**\n\t * 登录用户ID\n\t */\n\tpublic static final String SYS_USER_ID = \"sysUserId\";\n\t/**\n\t * 登录用户ID\n\t */\n\tpublic static final String SYS_USER_ID_TABLE = \"sys_user_id\";\n\t/**\n\t * 登录用户真实姓名\n\t */\n\tpublic static final String SYS_USER_NAME = \"sysUserName\";\n\t/**\n\t * 登录用户真实姓名\n\t */\n\tpublic static final String SYS_USER_NAME_TABLE = \"sys_user_name\";\n\t/**\n\t * 系统日期\"yyyy-MM-dd\"\n\t */\n\tpublic static final String SYS_DATE = \"sysDate\";\n\t/**\n\t * 系统日期\"yyyy-MM-dd\"\n\t */\n\tpublic static final String SYS_DATE_TABLE = \"sys_date\";\n\t/**\n\t * 系统时间\"yyyy-MM-dd HH:mm\"\n\t */\n\tpublic static final String SYS_TIME = \"sysTime\";\n\t/**\n\t * 系统时间\"yyyy-MM-dd HH:mm\"\n\t */\n\tpublic static final String SYS_TIME_TABLE = \"sys_time\";\n\t/**\n\t * 数据-所属机构编码\n\t */\n\tpublic static final String SYS_BASE_PATH = \"sys_base_path\";\n\t//*********系统上下文变量****************************************\n\t\n\t\n\t//*********系统建表标准字段****************************************\n\t/**\n\t * 创建者登录名称\n\t */\n\tpublic static final String CREATE_BY_TABLE = \"create_by\";\n\t/**\n\t * 创建者登录名称\n\t */\n\tpublic static final String CREATE_BY = \"createBy\";\n\t/**\n\t * 创建日期时间\n\t */\n\tpublic static final String CREATE_TIME_TABLE = \"create_time\";\n\t/**\n\t * 创建日期时间\n\t */\n\tpublic static final String CREATE_TIME = \"createTime\";\n\t/**\n\t * 更新用户登录名称\n\t */\n\tpublic static final String UPDATE_BY_TABLE = \"update_by\";\n\t/**\n\t * 更新用户登录名称\n\t */\n\tpublic static final String UPDATE_BY = \"updateBy\";\n\t/**\n\t * 更新日期时间\n\t */\n\tpublic static final String UPDATE_TIME = \"updateTime\";\n\t/**\n\t * 更新日期时间\n\t */\n\tpublic static final String UPDATE_TIME_TABLE = \"update_time\";\n\t\n\t/**\n\t * 业务流程状态\n\t */\n\tpublic static final String BPM_STATUS = \"bpmStatus\";\n\t/**\n\t * 业务流程状态\n\t */\n\tpublic static final String BPM_STATUS_TABLE = \"bpm_status\";\n\t//*********系统建表标准字段****************************************\n\n    /**\n     * sql语句 where\n     */\n    String SQL_WHERE = \"where\";\n\n    /**\n     * sql语句 asc\n     */\n    String SQL_ASC = \"asc\";\n\n    /**\n     * sqlserver数据库,中间有空格\n     */\n    String DB_TYPE_SQL_SERVER_BLANK = \"sql server\";\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/DynamicTableConstant.java",
    "content": "package org.jeecg.common.constant;\n\n/**\n * 动态切换表配置常量\n *\n * @author: scott\n * @date: 2022年04月25日 22:30\n */\npublic class DynamicTableConstant {\n    /**\n     * 角色首页配置表\n     * vue2表名: sys_role_index\n     * vue3表名: sys_role_index_vue3\n     */\n    public static final String SYS_ROLE_INDEX = \"sys_role_index\";\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/FillRuleConstant.java",
    "content": "package org.jeecg.common.constant;\n\n/**\n * 规则值生成 编码常量类\n * @author: taoyan\n * @date: 2020年04月02日\n */\npublic class FillRuleConstant {\n\n    /**\n     * 公文发文编码\n     */\n    public static final String DOC_SEND = \"doc_send_code\";\n\n    /**\n     * 部门编码\n     */\n    public static final String DEPART = \"org_num_role\";\n\n    /**\n     * 分类字典编码\n     */\n    public static final String CATEGORY = \"category_code_rule\";\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/PasswordConstant.java",
    "content": "package org.jeecg.common.constant;\n\n/**\n* @Description: 密码常量类\n*\n* @author: wangshuai\n* @date: 2025/8/27 20:10\n*/\npublic interface PasswordConstant {\n\n    /**\n     * 导入用户默认密码\n     */\n    String DEFAULT_PASSWORD = \"123456\";\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/ProvinceCityArea.java",
    "content": "package org.jeecg.common.constant;\n\nimport com.alibaba.fastjson.JSONObject;\nimport org.apache.commons.lang3.StringUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.core.io.Resource;\nimport org.springframework.stereotype.Component;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.Scanner;\nimport java.util.Set;\nimport java.util.List;\n\n/**\n * @Description: 省市区\n * @author: jeecg-boot\n */\n@Component(\"pca\")\npublic class ProvinceCityArea {\n    List<Area> areaList;\n\n    public String getText(String code){\n        if(StringUtils.isNotBlank(code)){\n            this.initAreaList();\n            if(this.areaList!=null || this.areaList.size()>0){\n                List<String> ls = new ArrayList<String>();\n                getAreaByCode(code,ls);\n                return String.join(\"/\",ls);\n            }\n        }\n        return \"\";\n    }\n\n    public String getCode(String text){\n        if(StringUtils.isNotBlank(text)){\n            this.initAreaList();\n            if(areaList!=null && areaList.size()>0){\n                for(int i=areaList.size()-1;i>=0;i--){\n                    // 代码逻辑说明: VUEN-1088 online 导入 省市区导入后 导入数据错乱 北京市/市辖区/西城区-->山西省/晋城市/城区\n                    String areaText = areaList.get(i).getText();\n                    String cityText = areaList.get(i).getAheadText();\n                    if(text.indexOf(areaText)>=0 && (cityText!=null && text.indexOf(cityText)>=0)){\n                        return areaList.get(i).getId();\n                    }\n                }\n            }\n        }\n        return null;\n    }\n\n    /**\n     * 获取省市区code，精准匹配\n     * @param texts 文本数组，省，市，区\n     * @return 返回 省市区的code\n     */\n    public String[] getCode(String[] texts) {\n        if (texts == null || texts.length == 0) {\n            return null;\n        }\n        this.initAreaList();\n        if (areaList == null || areaList.size() == 0) {\n            return null;\n        }\n        String[] codes = new String[texts.length];\n        String code = null;\n        for (int i = 0; i < texts.length; i++) {\n            String text = texts[i];\n            Area area;\n            if (code == null) {\n                area = getAreaByText(text);\n            } else {\n                area = getAreaByPidAndText(code, text);\n            }\n            if (area != null) {\n                code = area.id;\n                codes[i] = code;\n            } else {\n                return null;\n            }\n        }\n        return codes;\n    }\n\n    /**\n     * 根据text获取area\n     * @param text\n     * @return\n     */\n    public Area getAreaByText(String text) {\n        for (Area area : areaList) {\n            if (text.equals(area.getText())) {\n                return area;\n            }\n        }\n        return null;\n    }\n\n    /**\n     * 通过pid获取 area 对象\n     * @param pCode 父级编码\n     * @param text\n     * @return\n     */\n    public Area getAreaByPidAndText(String pCode, String text) {\n        this.initAreaList();\n        if (this.areaList != null && this.areaList.size() > 0) {\n            for (Area area : this.areaList) {\n                if (area.getPid().equals(pCode) && area.getText().equals(text)) {\n                    return area;\n                }\n            }\n        }\n        return null;\n    }\n\n    public void getAreaByCode(String code,List<String> ls){\n        for(Area area: areaList){\n            if(null != area && area.getId().equals(code)){\n                String pid = area.getPid();\n                ls.add(0,area.getText());\n                getAreaByCode(pid,ls);\n            }\n        }\n    }\n\n    private void initAreaList(){\n        //System.out.println(\"=====================\");\n        if(this.areaList==null || this.areaList.size()==0){\n            this.areaList = new ArrayList<Area>();\n            try {\n                String jsonData = oConvertUtils.readStatic(\"classpath:static/pca.json\");\n                JSONObject baseJson = JSONObject.parseObject(jsonData);\n                //第一层 省\n                JSONObject provinceJson = baseJson.getJSONObject(\"86\");\n                for(String provinceKey: provinceJson.keySet()){\n                    //System.out.println(\"====\"+provinceKey);\n                    Area province = new Area(provinceKey,provinceJson.getString(provinceKey),\"86\");\n                    this.areaList.add(province);\n                    //第二层 市\n                    JSONObject cityJson = baseJson.getJSONObject(provinceKey);\n                    for(String cityKey:cityJson.keySet()){\n                        //System.out.println(\"-----\"+cityKey);\n                        Area city = new Area(cityKey,cityJson.getString(cityKey),provinceKey);\n                        this.areaList.add(city);\n                        //第三层 区\n                        JSONObject areaJson =  baseJson.getJSONObject(cityKey);\n                        if(areaJson!=null){\n                            for(String areaKey:areaJson.keySet()){\n                                //System.out.println(\"········\"+areaKey);\n                                Area area = new Area(areaKey,areaJson.getString(areaKey),cityKey);\n                                // 代码逻辑说明: VUEN-1088 online 导入 省市区导入后 导入数据错乱 北京市/市辖区/西城区-->山西省/晋城市/城区\n                                area.setAheadText(cityJson.getString(cityKey));\n                                this.areaList.add(area);\n                            }\n                        }\n                    }\n                }\n            } catch (Exception e) {\n                e.printStackTrace();\n            }\n        }\n\n    }\n\n\n    private String jsonRead(File file){\n        Scanner scanner = null;\n        StringBuilder buffer = new StringBuilder();\n        try {\n            scanner = new Scanner(file, \"utf-8\");\n            while (scanner.hasNextLine()) {\n                buffer.append(scanner.nextLine());\n            }\n        } catch (Exception e) {\n\n        } finally {\n            if (scanner != null) {\n                scanner.close();\n            }\n        }\n        return buffer.toString();\n    }\n\n    class Area{\n        String id;\n        String text;\n        String pid;\n        // 用于存储上级文本数据，区的上级文本 是市的数据\n        String aheadText;\n\n        public Area(String id,String text,String pid){\n            this.id = id;\n            this.text = text;\n            this.pid = pid;\n        }\n\n        public String getId() {\n            return id;\n        }\n\n        public String getText() {\n            return text;\n        }\n\n        public String getPid() {\n            return pid;\n        }\n\n        public String getAheadText() {\n            return aheadText;\n        }\n        public void setAheadText(String aheadText) {\n            this.aheadText = aheadText;\n        }\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/ServiceNameConstants.java",
    "content": "/*\n *\n *  *  Copyright (c) 2019-2020, 冷冷 (wangiegie@gmail.com).\n *  *  <p>\n *  *  Licensed under the GNU Lesser General Public License 3.0 (the \"License\");\n *  *  you may not use this file except in compliance with the License.\n *  *  You may obtain a copy of the License at\n *  *  <p>\n *  * https://www.gnu.org/licenses/lgpl.html\n *  *  <p>\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.jeecg.common.constant;\n\n/**\n * @author scott\n * @date 2019年05月18日\n * 服务名称\n */\npublic interface ServiceNameConstants {\n\n\t/**\n\t * 微服务名：系统管理模块\n\t */\n\tString SERVICE_SYSTEM = \"jeecg-system\";\n\t/**\n\t * 微服务名： demo模块\n\t */\n\tString SERVICE_DEMO = \"jeecg-demo\";\n\t/**\n\t * 微服务名：joa模块\n\t */\n\tString SERVICE_JOA = \"jeecg-joa\";\n\t\n//\t/**\n//\t * 微服务名：online在线模块\n//\t */\n//\tString SERVICE_ONLINE = \"jeecg-online\";\n//\t/**\n//\t * 微服务名：OA模块\n//\t */\n//\tString SERVICE_EOA = \"jeecg-eoa\";\n//\t/**\n//\t * 微服务名：表单设计模块\n//\t */\n//\tString SERVICE_FORM = \"jeecg-desform\";\n\n\t/**\n\t * gateway通过header传递根路径 basePath\n\t */\n\tString X_GATEWAY_BASE_PATH = \"X_GATEWAY_BASE_PATH\";\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/SymbolConstant.java",
    "content": "package org.jeecg.common.constant;\n\n/**\n * @Description: 符号和特殊符号常用类\n * @author: wangshuai\n * @date: 2022年03月30日 17:44\n */\npublic class SymbolConstant {\n\n    /**\n     * 符号：点\n     */\n    public static final String SPOT = \".\";\n\n    /**\n     * 符号：双斜杠\n     */\n    public static final String DOUBLE_BACKSLASH = \"\\\\\";\n\n    /**\n     * 符号：冒号\n     */\n    public static final String COLON = \":\";\n\n    /**\n     * 符号：逗号\n     */\n    public static final String COMMA = \",\";\n\n    /**\n     * 符号：左花括号 }\n     */\n    public static final String LEFT_CURLY_BRACKET = \"{\";\n\n    /**\n     * 符号：右花括号 }\n     */\n    public static final String RIGHT_CURLY_BRACKET = \"}\";\n\n    /**\n     * 符号：井号 #\n     */\n    public static final String WELL_NUMBER = \"#\";\n\n    /**\n     * 符号：单斜杠\n     */\n    public static final String SINGLE_SLASH = \"/\";\n\n    /**\n     * 符号：双斜杠\n     */\n    public static final String DOUBLE_SLASH = \"//\";\n\n    /**\n     * 符号：感叹号\n     */\n    public static final String EXCLAMATORY_MARK = \"!\";\n\n    /**\n     * 符号：下划线\n     */\n    public static final String UNDERLINE = \"_\";\n\n    /**\n     * 符号：单引号\n     */\n    public static final String SINGLE_QUOTATION_MARK = \"'\";\n\n    /**\n     * 符号：星号\n     */\n    public static final String ASTERISK = \"*\";\n\n    /**\n     * 符号：百分号\n     */\n    public static final String PERCENT_SIGN = \"%\";\n\n    /**\n     * 符号：美元 $\n     */\n    public static final String DOLLAR = \"$\";\n\n    /**\n     * 符号：和 &\n     */\n    public static final String AND = \"&\";\n\n    /**\n     * 符号：../\n     */\n    public static final String SPOT_SINGLE_SLASH = \"../\";\n\n    /**\n     * 符号：..\\\\\n     */\n    public static final String SPOT_DOUBLE_BACKSLASH = \"..\\\\\";\n\n    /**\n     * 系统变量前缀 #{\n     */\n    public static final String SYS_VAR_PREFIX = \"#{\";\n\n    /**\n     * 符号 {{\n     */\n    public static final String DOUBLE_LEFT_CURLY_BRACKET = \"{{\";\n\n    /**\n     * 符号：[\n     */\n    public static final String SQUARE_BRACKETS_LEFT = \"[\";\n    /**\n     * 符号：]\n     */\n    public static final String SQUARE_BRACKETS_RIGHT = \"]\";\n\n    /**\n     * 拼接字符串符号 分号 ;\n     */\n    public static final String SEMICOLON = \";\";\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/TenantConstant.java",
    "content": "package org.jeecg.common.constant;\n\n/**\n * @Description: TenantConstant\n * @author: scott\n * @date: 2022年08月29日 15:29\n */\npublic interface TenantConstant {\n    /*------【低代码应用参数】----------------------------------------------*/\n    /**\n     * header的lowAppId标识\n     */\n    String X_LOW_APP_ID = \"X-Low-App-ID\";\n    /**\n     * 应用ID——实体字段\n     */\n    String FIELD_LOW_APP_ID = \"lowAppId\";\n    /**\n     * 应用ID——表字段\n     */\n    String DB_FIELD_LOW_APP_ID = \"low_app_id\";\n    /*------【低代码应用参数】---------------------------------------------*/\n\n    /*--------【租户参数】-----------------------------------------------*/\n    /**\n     * 租户ID（实体字段名 和 url参数名）\n     */\n    String TENANT_ID = \"tenantId\";\n    /**\n     * 租户ID 数据库字段名\n     */\n    String TENANT_ID_TABLE = \"tenant_id\";\n    /*-------【租户参数】-----------------------------------------------*/\n\n    /**\n     * 超级管理员\n     */\n    String SUPER_ADMIN = \"superAdmin\";\n\n    /**\n     * 组织账户管理员\n     */\n    String ACCOUNT_ADMIN = \"accountAdmin\";\n\n    /**\n     * 组织应用管理员\n     */\n    String APP_ADMIN = \"appAdmin\";\n\n    /**\n     * 增加SignatureCheck注解POST请求的URL\n     */\n    String[] SIGNATURE_CHECK_POST_URL = { \"/sys/tenant/joinTenantByHouseNumber\", \"/sys/tenant/invitationUser\" };\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/VxeSocketConst.java",
    "content": "package org.jeecg.common.constant;\n\n/**\n * VXESocket 常量\n * @author: jeecg-boot\n */\npublic class VxeSocketConst {\n\n    /**\n     * 消息类型\n     */\n    public static final String TYPE = \"type\";\n    /**\n     * 消息数据\n     */\n    public static final String DATA = \"data\";\n\n    /**\n     * 消息类型：心跳检测\n     */\n    public static final String TYPE_HB = \"heart_beat\";\n    /**\n     * 消息类型：通用数据传递\n     */\n    public static final String TYPE_CSD = \"common_send_date\";\n    /**\n     * 消息类型：更新vxe table数据\n     */\n    public static final String TYPE_UVT = \"update_vxe_table\";\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/WebsocketConst.java",
    "content": "package org.jeecg.common.constant;\n\n/**\n * @Description: Websocket常量类\n * @author: taoyan\n * @date: 2020年03月23日\n */\npublic class WebsocketConst {\n\n\n    /**\n     * 消息json key:cmd\n     */\n    public static final String MSG_CMD = \"cmd\";\n\n    /**\n     * 消息json key:msgId\n     */\n    public static final String MSG_ID = \"msgId\";\n\n    /**\n     * 消息json key:msgTxt\n     */\n    public static final String MSG_TXT = \"msgTxt\";\n\n    /**\n     * 消息json key:userId\n     */\n    public static final String MSG_USER_ID = \"userId\";\n\n    /**\n     * 消息json key:chat\n     */\n    public static final String MSG_CHAT = \"chat\";\n\n    /**\n     * 消息类型 heartcheck\n     */\n    public static final String CMD_CHECK = \"heartcheck\";\n\n    /**\n     * 消息类型 user 用户消息\n     */\n    public static final String CMD_USER = \"user\";\n\n    /**\n     * 消息类型 topic 系统通知\n     */\n    public static final String CMD_TOPIC = \"topic\";\n\n    /**\n     * 消息类型 email\n     */\n    public static final String CMD_EMAIL = \"email\";\n\n    /**\n     * 消息类型 meetingsign 会议签到\n     */\n    public static final String CMD_SIGN = \"sign\";\n\n    /**\n     * 消息类型 新闻发布/取消\n     */\n    public static final String NEWS_PUBLISH = \"publish\";\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/CgformEnum.java",
    "content": "package org.jeecg.common.constant.enums;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * online表单枚举 代码生成器用到\n * @author: jeecg-boot\n */\npublic enum CgformEnum {\n\n    /**\n     * 单表\n     */\n    ONE(1, \"one\", \"/jeecg/code-template-online\", \"default.one\", \"经典风格\", new String[]{\"vue3\",\"vue\",\"vue3Native\"}),\n\n    /**\n     * 多表\n     */\n    MANY(2, \"many\", \"/jeecg/code-template-online\", \"default.onetomany\", \"经典风格\" ,new String[]{\"vue\"}),\n    /**\n     * 多表（jvxe风格）\n     *  */\n    JVXE_TABLE(2, \"jvxe\", \"/jeecg/code-template-online\", \"jvxe.onetomany\", \"默认风格\" ,new String[]{\"vue3\",\"vue\",\"vue3Native\"}),\n\n    /**\n     * 多表 (erp风格)\n     */\n    ERP(2, \"erp\", \"/jeecg/code-template-online\", \"erp.onetomany\", \"ERP风格\" ,new String[]{\"vue3\",\"vue\",\"vue3Native\"}),\n    /**\n     * 多表（内嵌子表风格）\n     */\n    INNER_TABLE(2, \"innerTable\", \"/jeecg/code-template-online\", \"inner-table.onetomany\", \"内嵌子表风格\" ,new String[]{\"vue3\",\"vue\"}),\n    /**\n     * 多表（tab风格）\n     *  */\n    TAB(2, \"tab\", \"/jeecg/code-template-online\", \"tab.onetomany\", \"Tab风格\" ,new String[]{\"vue3\",\"vue\"}),\n    /**\n     * 树形列表\n     */\n    TREE(3, \"tree\", \"/jeecg/code-template-online\", \"default.tree\", \"树形列表\" ,new String[]{\"vue3\",\"vue\",\"vue3Native\"});\n\n    /**\n     * 类型 1/单表 2/一对多 3/树\n     */\n    int type;\n    /**\n     * 编码标识\n     */\n    String code;\n    /**\n     * 代码生成器模板路径\n     */\n    String templatePath;\n    /**\n     * 代码生成器模板路径\n     */\n    String stylePath;\n    /**\n     * 模板风格名称\n     */\n    String note;\n    /**\n     * 支持代码风格 vue3:vue3包装代码 vue3Native:vue3原生代码 vue:vue2代码\n     */\n    String[] vueStyle;\n\n    /**\n     * 构造器\n     *\n     * @param type 类型 1/单表 2/一对多 3/树\n     * @param code 模板编码\n     * @param templatePath  模板路径\n     * @param stylePath  模板子路径\n     * @param note\n     * @param vueStyle 支持代码风格\n     */\n    CgformEnum(int type, String code, String templatePath, String stylePath, String note, String[] vueStyle) {\n        this.type = type;\n        this.code = code;\n        this.templatePath = templatePath;\n        this.stylePath = stylePath;\n        this.note = note;\n        this.vueStyle = vueStyle;\n    }\n\n    /**\n     * 根据code获取模板路径\n     *\n     * @param code\n     * @return\n     */\n    public static String getTemplatePathByConfig(String code) {\n        return getCgformEnumByConfig(code).templatePath;\n    }\n\n\n    public int getType() {\n        return type;\n    }\n\n    public void setType(int type) {\n        this.type = type;\n    }\n\n    public String getTemplatePath() {\n        return templatePath;\n    }\n\n    public void setTemplatePath(String templatePath) {\n        this.templatePath = templatePath;\n    }\n\n    public String getStylePath() {\n        return stylePath;\n    }\n\n    public void setStylePath(String stylePath) {\n        this.stylePath = stylePath;\n    }\n\n    public String[] getVueStyle() {\n        return vueStyle;\n    }\n\n    public void setVueStyle(String[] vueStyle) {\n        this.vueStyle = vueStyle;\n    }\n\n    /**\n     * 根据code找枚举\n     *\n     * @param code\n     * @return\n     */\n    public static CgformEnum getCgformEnumByConfig(String code) {\n        for (CgformEnum e : CgformEnum.values()) {\n            if (e.code.equals(code)) {\n                return e;\n            }\n        }\n        return null;\n    }\n\n    /**\n     * 根据类型找所有\n     *\n     * @param type\n     * @return\n     */\n    public static List<Map<String, Object>> getJspModelList(int type) {\n        List<Map<String, Object>> ls = new ArrayList<Map<String, Object>>();\n        for (CgformEnum e : CgformEnum.values()) {\n            if (e.type == type) {\n                Map<String, Object> map = new HashMap<String, Object>();\n                map.put(\"code\", e.code);\n                map.put(\"note\", e.note);\n                ls.add(map);\n            }\n        }\n        return ls;\n    }\n\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/ClientTerminalTypeEnum.java",
    "content": "package org.jeecg.common.constant.enums;\n\n/**\n * 客户终端类型\n */\npublic enum ClientTerminalTypeEnum {\n\n    PC(\"pc\", \"电脑终端\"),\n    H5(\"h5\", \"移动网页端\"),\n    APP(\"app\", \"手机app端\");\n\n    private String key;\n    private String text;\n\n    ClientTerminalTypeEnum(String value, String text) {\n        this.key = value;\n        this.text = text;\n    }\n\n    public String getKey() {\n        return this.key;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/DateRangeEnum.java",
    "content": "package org.jeecg.common.constant.enums;\n\n/**\n * 日期预设范围枚举\n */\npublic enum DateRangeEnum {\n    // 今天\n    TODAY,\n    // 昨天\n    YESTERDAY,\n    // 明天\n    TOMORROW,\n    // 本周\n    THIS_WEEK,\n    // 上周\n    LAST_WEEK,\n    // 下周\n    NEXT_WEEK,\n    // 过去七天\n    LAST_7_DAYS,\n    // 本月\n    THIS_MONTH,\n    // 上月\n    LAST_MONTH,\n    // 下月\n    NEXT_MONTH,\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/DepartCategoryEnum.java",
    "content": "package org.jeecg.common.constant.enums;\n\nimport org.jeecg.common.util.oConvertUtils;\n\n/**\n* @Description: 部门类型枚举类\n*\n* @author: wangshuai\n* @date: 2025/8/19 21:37\n*/\npublic enum DepartCategoryEnum {\n    \n    DEPART_CATEGORY_COMPANY(\"部门类型：公司\",\"公司\",\"1\"),\n    DEPART_CATEGORY_DEPART(\"部门类型：部门\",\"部门\",\"2\"),\n    DEPART_CATEGORY_POST(\"部门类型：岗位\",\"岗位\",\"3\"),\n    DEPART_CATEGORY_SUB_COMPANY(\"部门类型：子公司\",\"子公司\",\"4\");\n\n    DepartCategoryEnum(String described, String name, String value) {\n        this.value = value;\n        this.name = name;\n        this.described = described;\n    }\n\n    /**\n     * 描述\n     */\n    private String described;\n    /**\n     * 值\n     */\n    private String value;\n\n    /**\n     * 名称\n     */\n    private String name;\n\n    public String getDescribed() {\n        return described;\n    }\n\n    public void setDescribed(String described) {\n        this.described = described;\n    }\n\n    public String getValue() {\n        return value;\n    }\n\n    public void setValue(String value) {\n        this.value = value;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    /**\n     * 根据值获取名称\n     * \n     * @param value\n     * @return\n     */\n    public static String getNameByValue(String value){\n        if (oConvertUtils.isEmpty(value)) {\n            return null;\n        }\n        for (DepartCategoryEnum val : values()) {\n            if (val.getValue().equals(value)) {\n                return val.getName();\n            }\n        }\n        return value;\n    }\n    \n    /**\n     * 根据名称获取值\n     * \n     * @param name\n     * @return\n     */\n    public static String getValueByName(String name){\n        if (oConvertUtils.isEmpty(name)) {\n            return null;\n        }\n        for (DepartCategoryEnum val : values()) {\n            if (val.getName().equals(name)) {\n                return val.getValue();\n            }\n        }\n        return name;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/DySmsEnum.java",
    "content": "package org.jeecg.common.constant.enums;\n\nimport org.apache.commons.lang3.StringUtils;\n\n/**\n * @Description: 短信枚举类\n * @author: jeecg-boot\n */\npublic enum DySmsEnum {\n\n    /**登录短信模板编码*/\n    LOGIN_TEMPLATE_CODE(\"SMS_175435174\",\"敲敲云\",\"code\"),\n    /**忘记密码短信模板编码*/\n    FORGET_PASSWORD_TEMPLATE_CODE(\"SMS_175435174\",\"敲敲云\",\"code\"),\n    /**修改密码短信模板编码*/\n    CHANGE_PASSWORD_TEMPLATE_CODE(\"SMS_465391221\",\"敲敲云\",\"code\"),\n    /**注册账号短信模板编码*/\n    REGISTER_TEMPLATE_CODE(\"SMS_175430166\",\"敲敲云\",\"code\");\n\t\n\t/**\n\t * 短信模板编码\n\t */\n\tprivate String templateCode;\n\t/**\n\t * 签名\n\t */\n\tprivate String signName;\n\t/**\n\t * 短信模板必需的数据名称，多个key以逗号分隔，此处配置作为校验\n\t */\n\tprivate String keys;\n\t\n\tprivate DySmsEnum(String templateCode,String signName,String keys) {\n\t\tthis.templateCode = templateCode;\n\t\tthis.signName = signName;\n\t\tthis.keys = keys;\n\t}\n\t\n\tpublic String getTemplateCode() {\n\t\treturn templateCode;\n\t}\n\t\n\tpublic void setTemplateCode(String templateCode) {\n\t\tthis.templateCode = templateCode;\n\t}\n\t\n\tpublic String getSignName() {\n\t\treturn signName;\n\t}\n\t\n\tpublic void setSignName(String signName) {\n\t\tthis.signName = signName;\n\t}\n\t\n\tpublic String getKeys() {\n\t\treturn keys;\n\t}\n\n\tpublic void setKeys(String keys) {\n\t\tthis.keys = keys;\n\t}\n\n\tpublic static DySmsEnum toEnum(String templateCode) {\n\t\tif(StringUtils.isEmpty(templateCode)){\n\t\t\treturn null;\n\t\t}\n\t\tfor(DySmsEnum item : DySmsEnum.values()) {\n\t\t\tif(item.getTemplateCode().equals(templateCode)) {\n\t\t\t\treturn item;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n}\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/EmailTemplateEnum.java",
    "content": "package org.jeecg.common.constant.enums;\n\nimport org.jeecg.common.util.oConvertUtils;\n\n/**\n * 邮件html模板配置地址美剧\n *\n * @author: liusq\n * @Date: 2023-10-13\n */\npublic enum EmailTemplateEnum {\n    /**\n     * 流程催办\n     */\n    BPM_CUIBAN_EMAIL(\"bpm_cuiban_email\", \"/templates/email/bpm_cuiban_email.ftl\"),\n    /**\n     * 流程抄送\n     */\n    BPM_CC_EMAIL(\"bpm_cc_email\", \"/templates/email/bpm_cc_email.ftl\"),\n    /**\n     * 流程新任务\n     */\n    BPM_NEW_TASK_EMAIL(\"bpm_new_task_email\", \"/templates/email/bpm_new_task_email.ftl\"),\n    /**\n     * 表单新增记录\n     */\n    DESFORM_NEW_DATA_EMAIL(\"desform_new_data_email\", \"/templates/email/desform_new_data_email.ftl\");\n\n    /**\n     * 模板名称\n     */\n    private String name;\n    /**\n     * 模板地址\n     */\n    private String url;\n\n    EmailTemplateEnum(String name, String url) {\n        this.name = name;\n        this.url = url;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getUrl() {\n        return url;\n    }\n\n    public void setUrl(String url) {\n        this.url = url;\n    }\n\n    public static EmailTemplateEnum getByName(String name) {\n        if (oConvertUtils.isEmpty(name)) {\n            return null;\n        }\n        for (EmailTemplateEnum val : values()) {\n            if (val.getName().equals(name)) {\n                return val;\n            }\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/FileTypeEnum.java",
    "content": "package org.jeecg.common.constant.enums;\n\nimport org.jeecg.common.util.oConvertUtils;\n\n/**\n * 文件类型\n */\npublic enum FileTypeEnum {\n    //    文档类型（folder:文件夹 excel:excel doc:word pp:ppt image:图片  archive:其他文档 video:视频 voice:语音）\n//    FOLDER\n    xls(\".xls\",\"excel\",\"excel\"),\n    xlsx(\".xlsx\",\"excel\",\"excel\"),\n    doc(\".doc\",\"doc\",\"word\"),\n    docx(\".docx\",\"doc\",\"word\"),\n    ppt(\".ppt\",\"pp\",\"ppt\"),\n    pptx(\".pptx\",\"pp\",\"ppt\"),\n    gif(\".gif\",\"image\",\"图片\"),\n    jpg(\".jpg\",\"image\",\"图片\"),\n    jpeg(\".jpeg\",\"image\",\"图片\"),\n    png(\".png\",\"image\",\"图片\"),\n    txt(\".txt\",\"text\",\"文本\"),\n    avi(\".avi\",\"video\",\"视频\"),\n    mov(\".mov\",\"video\",\"视频\"),\n    rmvb(\".rmvb\",\"video\",\"视频\"),\n    rm(\".rm\",\"video\",\"视频\"),\n    flv(\".flv\",\"video\",\"视频\"),\n    mp4(\".mp4\",\"video\",\"视频\"),\n    zip(\".zip\",\"zip\",\"压缩包\"),\n    pdf(\".pdf\",\"pdf\",\"pdf\"),\n    mp3(\".mp3\",\"mp3\",\"语音\");\n\n    private String type;\n    private String value;\n    private String text;\n    private FileTypeEnum(String type,String value,String text){\n        this.type = type;\n        this.value = value;\n        this.text = text;\n    }\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n    public String getValue() {\n        return value;\n    }\n\n    public void setValue(String value) {\n        this.value = value;\n    }\n\n    public String getText() {\n        return text;\n    }\n\n    public void setText(String text) {\n        this.text = text;\n    }\n\n    public static FileTypeEnum getByType(String type){\n        if (oConvertUtils.isEmpty(type)) {\n            return null;\n        }\n        for (FileTypeEnum val : values()) {\n            if (val.getType().equals(type)) {\n                return val;\n            }\n        }\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/MessageTypeEnum.java",
    "content": "package org.jeecg.common.constant.enums;\n\nimport org.jeecg.common.system.annotation.EnumDict;\nimport org.jeecg.common.system.vo.DictModel;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * 消息类型\n *\n * @author: jeecg-boot\n */\n@EnumDict(\"messageType\")\npublic enum MessageTypeEnum {\n\n    /**\n     * 系统消息\n     */\n    XT(\"system\", \"系统消息\"),\n    /**\n     * 邮件消息\n     */\n    YJ(\"email\", \"邮件消息\"),\n    /**\n     * 钉钉消息\n     */\n    DD(\"dingtalk\", \"钉钉消息\"),\n    /**\n     * 企业微信\n     */\n    QYWX(\"wechat_enterprise\", \"企业微信\");\n\n    MessageTypeEnum(String type, String note) {\n        this.type = type;\n        this.note = note;\n    }\n\n    /**\n     * 消息类型\n     */\n    String type;\n\n    /**\n     * 类型说明\n     */\n    String note;\n\n    public String getNote() {\n        return note;\n    }\n\n    public void setNote(String note) {\n        this.note = note;\n    }\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n\n    /**\n     * 获取字典数据\n     *\n     * @return\n     */\n    public static List<DictModel> getDictList() {\n        List<DictModel> list = new ArrayList<>();\n        DictModel dictModel = null;\n        for (MessageTypeEnum e : MessageTypeEnum.values()) {\n            dictModel = new DictModel();\n            dictModel.setValue(e.getType());\n            dictModel.setText(e.getNote());\n            list.add(dictModel);\n        }\n        return list;\n    }\n\n    /**\n     * 根据type获取枚举\n     *\n     * @param type\n     * @return\n     */\n    public static MessageTypeEnum valueOfType(String type) {\n        for (MessageTypeEnum e : MessageTypeEnum.values()) {\n            if (e.getType().equals(type)) {\n                return e;\n            }\n        }\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/ModuleType.java",
    "content": "package org.jeecg.common.constant.enums;\n\n/**\n * 日志按模块分类\n * @author: jeecg-boot\n */\npublic enum ModuleType {\n\n    /**\n     * 普通\n     */\n    COMMON,\n\n    /**\n     * online\n     */\n    ONLINE;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/NoticeTypeEnum.java",
    "content": "package org.jeecg.common.constant.enums;\n\n/**\n* @Description: 文件类型枚举类\n*\n* @author: wangshuai\n* @date: 2025/6/26 17:29\n*/\npublic enum NoticeTypeEnum {\n    \n    //VUE3专用\n    NOTICE_TYPE_FILE(\"知识库消息\",\"file\"),\n    NOTICE_TYPE_FLOW(\"工作流消息\",\"flow\"),\n    NOTICE_TYPE_PLAN(\"日程消息\",\"plan\"),\n    //暂时没用到\n    NOTICE_TYPE_MEETING(\"会议消息\",\"meeting\"),\n    NOTICE_TYPE_SYSTEM(\"系统消息\",\"system\"),\n    /**\n     * 协同工作\n     * for [JHHB-136]【vue3】协同工作系统消息需要添加一个类型\n     */\n    NOTICE_TYPE_COLLABORATION(\"协同工作\", \"collab\"),\n    /**\n     * 督办\n     */\n    NOTICE_TYPE_SUPERVISE(\"督办管理\", \"supe\"),\n    /**\n     * 考勤\n     */\n    NOTICE_TYPE_ATTENDANCE(\"考勤消息\", \"attendance\");\n\n    /**\n     * 文件类型名称\n     */\n    private String name;\n\n    /**\n     * 文件类型值\n     */\n    private String value;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getValue() {\n        return value;\n    }\n\n    public void setValue(String value) {\n        this.value = value;\n    }\n\n    NoticeTypeEnum(String name, String value) {\n        this.name = name;\n        this.value = value;\n    }\n\n    /**\n     * 获取聊天通知类型\n     * \n     * @param value\n     * @return\n     */\n    public static String getChatNoticeType(String value){\n        return value + \"Notice\";\n    }\n\n    /**\n     * 获取通知名称\n     *\n     * @param value\n     * @return\n     */\n    public static String getNoticeNameByValue(String value){\n        value = value.replace(\"Notice\",\"\");\n        for (NoticeTypeEnum e : NoticeTypeEnum.values()) {\n            if (e.getValue().equals(value)) {\n                return e.getName();\n            }\n        }\n        return \"系统消息\";\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/OperateTypeEnum.java",
    "content": "package org.jeecg.common.constant.enums;\n\nimport org.jeecg.common.constant.CommonConstant;\n\n/**\n * @Description: 操作类型\n * @author: jeecg-boot\n * @date: 2022/3/31 10:05\n */\npublic enum OperateTypeEnum {\n\n    /**\n     * 列表\n     */\n    LIST(CommonConstant.OPERATE_TYPE_1, \"list\"),\n\n    /**\n     * 新增\n     */\n    ADD(CommonConstant.OPERATE_TYPE_2, \"add\"),\n\n    /**\n     * 编辑\n     */\n    EDIT(CommonConstant.OPERATE_TYPE_3, \"edit\"),\n\n    /**\n     * 删除\n     */\n    DELETE(CommonConstant.OPERATE_TYPE_4, \"delete\"),\n\n    /**\n     * 导入\n     */\n    IMPORT(CommonConstant.OPERATE_TYPE_5, \"import\"),\n\n    /**\n     * 导出\n     */\n    EXPORT(CommonConstant.OPERATE_TYPE_6, \"export\");\n\n    /**\n     * 类型 1列表,2新增,3编辑,4删除,5导入,6导出\n     */\n    int type;\n\n    /**\n     * 编码(请求方式)\n     */\n    String code;\n\n\n    public int getType() {\n        return type;\n    }\n\n    public void setType(int type) {\n        this.type = type;\n    }\n\n    public String getCode() {\n        return code;\n    }\n\n    public void setCode(String code) {\n        this.code = code;\n    }\n\n    /**\n     * 构造器\n     *\n     * @param type 类型\n     * @param code 编码(请求方式)\n     */\n    OperateTypeEnum(int type, String code) {\n        this.type = type;\n        this.code = code;\n    }\n\n\n    /**\n     * 根据请求名称匹配\n     *\n     * @param methodName 请求名称\n     * @return Integer 类型\n     */\n    public static Integer getTypeByMethodName(String methodName) {\n        for (OperateTypeEnum e : OperateTypeEnum.values()) {\n            if (methodName.startsWith(e.getCode())) {\n                return e.getType();\n            }\n        }\n        return CommonConstant.OPERATE_TYPE_1;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/PositionLevelEnum.java",
    "content": "package org.jeecg.common.constant.enums;\n\nimport java.util.Arrays;\nimport java.util.List;\n\n/**\n * 职级枚举类\n * \n * 注意：此枚举仅适用于天津临港控股OA项目,职级的名称和等级均为写死（需要与数据库配置一致）\n * @date 2025-08-26\n * @author scott\n */\npublic enum PositionLevelEnum {\n\n    // 领导层级（等级1-3）\n    CHAIRMAN(\"董事长\", 1, PositionType.LEADER),\n    GENERAL_MANAGER(\"总经理\", 2, PositionType.LEADER),\n    VICE_GENERAL_MANAGER(\"副总经理\", 3, PositionType.LEADER),\n\n    // 职员层级（等级4-6）\n    MINISTER(\"部长\", 4, PositionType.STAFF),\n    VICE_MINISTER(\"副部长\", 5, PositionType.STAFF),\n    STAFF(\"职员\", 6, PositionType.STAFF);\n\n    private final String name;\n    private final int level;\n    private final PositionType type;\n\n    PositionLevelEnum(String name, int level, PositionType type) {\n        this.name = name;\n        this.level = level;\n        this.type = type;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public int getLevel() {\n        return level;\n    }\n\n    public PositionType getType() {\n        return type;\n    }\n\n    /**\n     * 职级类型枚举\n     */\n    public enum PositionType {\n        STAFF(\"职员层级\"),\n        LEADER(\"领导层级\");\n\n        private final String desc;\n\n        PositionType(String desc) {\n            this.desc = desc;\n        }\n\n        public String getDesc() {\n            return desc;\n        }\n    }\n\n    /**\n     * 根据职级名称获取枚举\n     * @param name 职级名称\n     * @return 职级枚举\n     */\n    public static PositionLevelEnum getByName(String name) {\n        for (PositionLevelEnum position : values()) {\n            if (position.getName().equals(name)) {\n                return position;\n            }\n        }\n        return null;\n    }\n\n    /**\n     * 根据职级等级获取枚举\n     * @param level 职级等级\n     * @return 职级枚举\n     */\n    public static PositionLevelEnum getByLevel(int level) {\n        for (PositionLevelEnum position : values()) {\n            if (position.getLevel() == level) {\n                return position;\n            }\n        }\n        return null;\n    }\n\n    /**\n     * 根据职级名称判断是否为职员层级\n     * @param name 职级名称\n     * @return true-职员层级，false-非职员层级\n     */\n    public static boolean isStaffLevel(String name) {\n        PositionLevelEnum position = getByName(name);\n        return position != null && position.getType() == PositionType.STAFF;\n    }\n\n    /**\n     * 根据职级名称判断是否为领导层级\n     * @param name 职级名称\n     * @return true-领导层级，false-非领导层级\n     */\n    public static boolean isLeaderLevel(String name) {\n        PositionLevelEnum position = getByName(name);\n        return position != null && position.getType() == PositionType.LEADER;\n    }\n\n    /**\n     * 比较两个职级的等级高低\n     * @param name1 职级名称1\n     * @param name2 职级名称2\n     * @return 正数表示name1等级更高，负数表示name2等级更高，0表示等级相同\n     */\n    public static int compareLevel(String name1, String name2) {\n        PositionLevelEnum pos1 = getByName(name1);\n        PositionLevelEnum pos2 = getByName(name2);\n\n        if (pos1 == null || pos2 == null) {\n            return 0;\n        }\n\n        // 等级数字越小代表职级越高\n        return pos2.getLevel() - pos1.getLevel();\n    }\n\n    /**\n     * 判断是否为更高等级\n     * @param currentName 当前职级名称\n     * @param targetName 目标职级名称\n     * @return true-目标职级更高，false-目标职级不高于当前职级\n     */\n    public static boolean isHigherLevel(String currentName, String targetName) {\n        return compareLevel(targetName, currentName) > 0;\n    }\n\n    /**\n     * 获取所有职员层级名称\n     * @return 职员层级名称列表\n     */\n    public static List<String> getStaffLevelNames() {\n        return Arrays.asList(MINISTER.getName(), VICE_MINISTER.getName(), STAFF.getName());\n    }\n\n    /**\n     * 获取所有领导层级名称\n     * @return 领导层级名称列表\n     */\n    public static List<String> getLeaderLevelNames() {\n        return Arrays.asList(CHAIRMAN.getName(), GENERAL_MANAGER.getName(), VICE_GENERAL_MANAGER.getName());\n    }\n\n    /**\n     * 获取所有职级名称（按等级排序）\n     * @return 所有职级名称列表\n     */\n    public static List<String> getAllPositionNames() {\n        return Arrays.asList(\n                CHAIRMAN.getName(), GENERAL_MANAGER.getName(), VICE_GENERAL_MANAGER.getName(),\n                MINISTER.getName(), VICE_MINISTER.getName(), STAFF.getName()\n        );\n    }\n\n    /**\n     * 获取指定等级范围的职级\n     * @param minLevel 最小等级\n     * @param maxLevel 最大等级\n     * @return 职级名称列表\n     */\n    public static List<String> getPositionsByLevelRange(int minLevel, int maxLevel) {\n        return Arrays.stream(values())\n                .filter(p -> p.getLevel() >= minLevel && p.getLevel() <= maxLevel)\n                .map(PositionLevelEnum::getName)\n                .collect(java.util.stream.Collectors.toList());\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/RoleIndexConfigEnum.java",
    "content": "package org.jeecg.common.constant.enums;\n\nimport org.jeecg.common.util.oConvertUtils;\n\nimport java.util.List;\n\n/**\n * 首页自定义\n * 通过角色编码与首页组件路径配置\n * 枚举的顺序有权限高低权重作用（也就是配置多个角色，在前面的角色首页，会优先生效）\n * @author: jeecg-boot\n */\npublic enum RoleIndexConfigEnum {\n\n    /**首页自定义 admin*/\n//    ADMIN(\"admin\", \"dashboard/Analysis\"),\n    //TEST(\"test\",  \"dashboard/IndexChart\"),\n    /**首页自定义 hr*/\n//    HR(\"hr\", \"dashboard/IndexBdc\");\n  \n    //DM(\"dm\", \"dashboard/IndexTask\"),\n\n    // 注：此值仅为防止报错，无任何实际意义\n    ROLE_INDEX_CONFIG_ENUM(\"RoleIndexConfigEnumDefault\", \"dashboard/Analysis\");\n\n    /**\n     * 角色编码\n     */\n    String roleCode;\n    /**\n     * 路由index\n     */\n    String componentUrl;\n\n    /**\n     * 构造器\n     *\n     * @param roleCode 角色编码\n     * @param componentUrl 首页组件路径（规则跟菜单配置一样）\n     */\n    RoleIndexConfigEnum(String roleCode, String componentUrl) {\n        this.roleCode = roleCode;\n        this.componentUrl = componentUrl;\n    }\n    /**\n     * 根据code找枚举\n     * @param roleCode 角色编码\n     * @return\n     */\n    private static RoleIndexConfigEnum getEnumByCode(String roleCode) {\n        for (RoleIndexConfigEnum e : RoleIndexConfigEnum.values()) {\n            if (e.roleCode.equals(roleCode)) {\n                return e;\n            }\n        }\n        return null;\n    }\n    /**\n     * 根据code找index\n     * @param roleCode 角色编码\n     * @return\n     */\n    private static String getIndexByCode(String roleCode) {\n        for (RoleIndexConfigEnum e : RoleIndexConfigEnum.values()) {\n            if (e.roleCode.equals(roleCode)) {\n                return e.componentUrl;\n            }\n        }\n        return null;\n    }\n\n    public static String getIndexByRoles(List<String> roles) {\n        String[] rolesArray = roles.toArray(new String[roles.size()]);\n        for (RoleIndexConfigEnum e : RoleIndexConfigEnum.values()) {\n            if (oConvertUtils.isIn(e.roleCode,rolesArray)){\n                return e.componentUrl;\n            }\n        }\n        return null;\n    }\n\n    public String getRoleCode() {\n        return roleCode;\n    }\n\n    public void setRoleCode(String roleCode) {\n        this.roleCode = roleCode;\n    }\n\n    public String getComponentUrl() {\n        return componentUrl;\n    }\n\n    public void setComponentUrl(String componentUrl) {\n        this.componentUrl = componentUrl;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/SysAnnmentTypeEnum.java",
    "content": "package org.jeecg.common.constant.enums;\n\nimport org.jeecg.common.util.oConvertUtils;\n\n/**\n * 系统公告自定义跳转方式\n * @author: jeecg-boot\n */\npublic enum SysAnnmentTypeEnum {\n    /**\n     * 邮件跳转组件\n     */\n    EMAIL(\"email\", \"component\", \"modules/eoa/email/modals/EoaEmailInForm\"),\n    /**\n     * 流程跳转到我的任务\n     */\n    BPM(\"bpm\", \"url\", \"/bpm/task/MyTaskList\"),\n    \n    /**\n     * 流程抄送任务\n     */\n    BPM_VIEW(\"bpm_cc\", \"url\", \"/bpm/task/MyTaskList\"),\n    /**\n     * 邀请用户跳转到个人设置\n     */\n    TENANT_INVITE(\"tenant_invite\", \"url\", \"/system/usersetting\"),\n    /**\n     * 协同工作-待办通知\n     * for [JHHB-136]【vue3】协同工作系统消息需要添加一个类型\n     */\n    EOA_CO_NOTIFY(\"eoa_co_notify\", \"url\", \"/collaboration/pending\"),\n    /**\n     * 协同工作-催办通知\n     * for [JHHB-136]【vue3】协同工作系统消息需要添加一个类型\n     */\n    EOA_CO_REMIND(\"eoa_co_remind\", \"url\", \"/collaboration/pending\"),\n    /**\n     * 督办管理-催办\n     */\n    EOA_SUP_REMIND(\"eoa_sup_remind\", \"url\", \"/superivse/list\"),\n    /**\n     * 督办管理-通知\n     */\n    EOA_SUP_NOTIFY(\"eoa_sup_notify\", \"url\", \"/superivse/list\");\n\n    /**\n     * 业务类型(email:邮件 bpm:流程)\n     */\n    private String type;\n    /**\n     * 打开方式 组件：component 路由：url\n     */\n    private String openType;\n    /**\n     * 组件/路由 地址\n     */\n    private String openPage;\n\n    SysAnnmentTypeEnum(String type, String openType, String openPage) {\n        this.type = type;\n        this.openType = openType;\n        this.openPage = openPage;\n    }\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n    public String getOpenType() {\n        return openType;\n    }\n\n    public void setOpenType(String openType) {\n        this.openType = openType;\n    }\n\n    public String getOpenPage() {\n        return openPage;\n    }\n\n    public void setOpenPage(String openPage) {\n        this.openPage = openPage;\n    }\n\n    public static SysAnnmentTypeEnum getByType(String type) {\n        if (oConvertUtils.isEmpty(type)) {\n            return null;\n        }\n        for (SysAnnmentTypeEnum val : values()) {\n            if (val.getType().equals(type)) {\n                return val;\n            }\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/UniPushTypeEnum.java",
    "content": "package org.jeecg.common.constant.enums;\n\nimport org.jeecg.common.util.oConvertUtils;\n\n/**\n * UniPush 消息推送枚举\n * @author: jeecg-boot\n */\npublic enum UniPushTypeEnum {\n    /**\n     * 聊天\n     */\n    CHAT(\"chat\", \"聊天消息\", \"收到%s发来的聊天消息\"),\n    /**\n     * 流程跳转到我的任务\n     */\n    BPM(\"bpm_task\", \"待办任务\", \"收到%s待办任务\"),\n\n    /**\n     * 流程抄送任务\n     */\n    BPM_VIEW(\"bpm_cc\", \"知会任务\", \"收到%s知会任务\"),\n    /**\n     * 系统消息\n     */\n    SYS_MSG(\"system\", \"系统消息\", \"收到一条系统通告\");\n\n    /**\n     * 业务类型(chat:聊天 bpm_task:流程 bpm_cc:流程抄送)\n     */\n    private String type;\n    /**\n     * 消息标题\n     */\n    private String title;\n    /**\n     * 消息内容\n     */\n    private String content;\n\n    UniPushTypeEnum(String type, String title, String content) {\n        this.type = type;\n        this.title = title;\n        this.content = content;\n    }\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n    public String getTitle() {\n        return title ;\n    }\n\n    public void setTitle(String openType) {\n        this.title = openType;\n    }\n\n    public String getContent() {\n        return content;\n    }\n\n    public void setContent(String content) {\n        this.content = content;\n    }\n\n    public static UniPushTypeEnum getByType(String type) {\n        if (oConvertUtils.isEmpty(type)) {\n            return null;\n        }\n        for (UniPushTypeEnum val : values()) {\n            if (val.getType().equals(type)) {\n                return val;\n            }\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/Vue3MessageHrefEnum.java",
    "content": "package org.jeecg.common.constant.enums;\n\nimport org.jeecg.common.system.annotation.EnumDict;\nimport org.jeecg.common.system.vo.DictModel;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * 消息跳转【vue3】\n * @Author taoYan\n * @Date 2022/8/19 20:41\n **/\n@EnumDict(\"messageHref\")\npublic enum Vue3MessageHrefEnum {\n\n    /**\n     * 流程催办\n     */\n    BPM(\"bpm\", \"/task/myHandleTaskInfo\"),\n    \n    /**\n     * 系统消息通知\n     */\n    BPM_SYSTEM_MSG(\"bpm_msg_node\", \"\"),\n    \n    /**\n     * 流程抄送任务\n     */\n    BPM_VIEW(\"bpm_cc\", \"/task/myHandleTaskInfo\"),\n\n    /**\n     * 节点通知\n     */\n    BPM_TASK(\"bpm_task\", \"/task/myHandleTaskInfo\"),\n\n    /**\n     * 邮件消息\n     */\n    EMAIL(\"email\", \"/eoa/email\");\n    \n    String busType;\n    \n    String path;\n\n    Vue3MessageHrefEnum(String busType, String path) {\n        this.busType = busType;\n        this.path = path;\n    }\n\n    public String getBusType() {\n        return busType;\n    }\n\n    public String getPath() {\n        return path;\n    }\n\n    /**\n     * 获取字典数据\n     * @return\n     */\n    public static List<DictModel> getDictList(){\n        List<DictModel> list = new ArrayList<>();\n        DictModel dictModel = null;\n        for(Vue3MessageHrefEnum e: Vue3MessageHrefEnum.values()){\n            dictModel = new DictModel();\n            dictModel.setValue(e.getBusType());\n            dictModel.setText(e.getPath());\n            list.add(dictModel);\n        }\n        return list;\n    }\n    \n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/desensitization/SensitiveSerialize.java",
    "content": "package org.jeecg.common.desensitization;\n\nimport com.fasterxml.jackson.core.JsonGenerator;\nimport com.fasterxml.jackson.databind.BeanProperty;\nimport com.fasterxml.jackson.databind.JsonMappingException;\nimport com.fasterxml.jackson.databind.JsonSerializer;\nimport com.fasterxml.jackson.databind.SerializerProvider;\nimport com.fasterxml.jackson.databind.ser.ContextualSerializer;\nimport lombok.AllArgsConstructor;\nimport lombok.NoArgsConstructor;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.desensitization.annotation.Sensitive;\nimport org.jeecg.common.desensitization.enums.SensitiveEnum;\nimport org.jeecg.common.desensitization.util.SensitiveInfoUtil;\nimport org.jeecg.common.util.encryption.AesEncryptUtil;\n\nimport java.io.IOException;\nimport java.util.Objects;\n\n/**\n * @author eightmonth@qq.com\n * @date 2024/6/19 10:43\n */\n@NoArgsConstructor\n@AllArgsConstructor\n@Slf4j\npublic class SensitiveSerialize extends JsonSerializer<String> implements ContextualSerializer {\n\n    private SensitiveEnum type;\n\n    @Override\n    public void serialize(String data, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {\n        switch (type){\n            case ENCODE:\n                try {\n                    jsonGenerator.writeString(AesEncryptUtil.encrypt(data));\n                } catch (Exception exception) {\n                    log.error(\"数据加密错误\", exception.getMessage());\n                    jsonGenerator.writeString(data);\n                }\n                break;\n            case CHINESE_NAME:\n                jsonGenerator.writeString(SensitiveInfoUtil.chineseName(data));\n                break;\n            case ID_CARD:\n                jsonGenerator.writeString(SensitiveInfoUtil.idCardNum(data));\n                break;\n            case FIXED_PHONE:\n                jsonGenerator.writeString(SensitiveInfoUtil.fixedPhone(data));\n                break;\n            case MOBILE_PHONE:\n                jsonGenerator.writeString(SensitiveInfoUtil.mobilePhone(data));\n                break;\n            case ADDRESS:\n                jsonGenerator.writeString(SensitiveInfoUtil.address(data, 3));\n                break;\n            case EMAIL:\n                jsonGenerator.writeString(SensitiveInfoUtil.email(data));\n                break;\n            case BANK_CARD:\n                jsonGenerator.writeString(SensitiveInfoUtil.bankCard(data));\n                break;\n            case CNAPS_CODE:\n                jsonGenerator.writeString(SensitiveInfoUtil.cnapsCode(data));\n                break;\n            default:\n                jsonGenerator.writeString(data);\n        }\n    }\n\n    @Override\n    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {\n        if (beanProperty != null) {\n            if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) {\n                Sensitive sensitive = beanProperty.getAnnotation(Sensitive.class);\n                if (sensitive == null) {\n                    sensitive = beanProperty.getContextAnnotation(Sensitive.class);\n                }\n                if (sensitive != null) {\n                    return new SensitiveSerialize(sensitive.type());\n                }\n            }\n            return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty);\n        }\n        return serializerProvider.findNullValueSerializer(null);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/desensitization/annotation/Sensitive.java",
    "content": "package org.jeecg.common.desensitization.annotation;\n\n\nimport com.fasterxml.jackson.annotation.JacksonAnnotationsInside;\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport org.jeecg.common.desensitization.SensitiveSerialize;\nimport org.jeecg.common.desensitization.enums.SensitiveEnum;\n\nimport java.lang.annotation.*;\n\n/**\n * 在字段上定义 标识字段存储的信息是敏感的\n */\n@Documented\n@Retention(RetentionPolicy.RUNTIME)\n@Target(ElementType.FIELD)\n@JacksonAnnotationsInside\n@JsonSerialize(using = SensitiveSerialize.class)\npublic @interface Sensitive {\n\n    /**\n     * 不同类型处理不同\n     * @return\n     */\n    SensitiveEnum type() default SensitiveEnum.ENCODE;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/desensitization/annotation/SensitiveDecode.java",
    "content": "package org.jeecg.common.desensitization.annotation;\n\nimport java.lang.annotation.*;\n\n/**\n * 解密注解\n *\n * 在方法上定义 将方法返回对象中的敏感字段 解密，需要注意的是，如果没有加密过，解密会出问题，返回原字符串\n */\n@Documented\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.METHOD})\npublic @interface SensitiveDecode {\n\n    /**\n     * 指明需要脱敏的实体类class\n     * @return\n     */\n    Class entity() default Object.class;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/desensitization/annotation/SensitiveEncode.java",
    "content": "package org.jeecg.common.desensitization.annotation;\n\nimport java.lang.annotation.*;\n\n/**\n * 加密注解\n *\n * 在方法上声明 将方法返回对象中的敏感字段 加密/格式化\n */\n@Documented\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.METHOD})\npublic @interface SensitiveEncode {\n\n    /**\n     * 指明需要脱敏的实体类class\n     * @return\n     */\n    Class entity() default Object.class;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/desensitization/annotation/SensitiveField.java",
    "content": "package org.jeecg.common.desensitization.annotation;\n\n\nimport org.jeecg.common.desensitization.enums.SensitiveEnum;\n\nimport java.lang.annotation.*;\n\n/**\n * 在字段上定义 标识字段存储的信息是敏感的\n */\n@Documented\n@Retention(RetentionPolicy.RUNTIME)\n@Target(ElementType.FIELD)\npublic @interface SensitiveField {\n\n    /**\n     * 不同类型处理不同\n     * @return\n     */\n    SensitiveEnum type() default SensitiveEnum.ENCODE;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/desensitization/aspect/SensitiveDataAspect.java",
    "content": "package org.jeecg.common.desensitization.aspect;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.annotation.Around;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.aspectj.lang.reflect.MethodSignature;\nimport org.jeecg.common.desensitization.annotation.SensitiveDecode;\nimport org.jeecg.common.desensitization.annotation.SensitiveEncode;\nimport org.jeecg.common.desensitization.util.SensitiveInfoUtil;\nimport org.springframework.stereotype.Component;\n\nimport java.lang.reflect.Method;\nimport java.util.List;\n\n/**\n * 敏感数据切面处理类\n * @Author taoYan\n * @Date 2022/4/20 17:45\n **/\n@Slf4j\n@Aspect\n@Component\npublic class SensitiveDataAspect {\n\n    /**\n     * 定义切点Pointcut\n     */\n    @Pointcut(\"@annotation(org.jeecg.common.desensitization.annotation.SensitiveEncode) || @annotation(org.jeecg.common.desensitization.annotation.SensitiveDecode)\")\n    public void sensitivePointCut() {\n    }\n\n    @Around(\"sensitivePointCut()\")\n    public Object around(ProceedingJoinPoint point) throws Throwable {\n        // 处理结果\n        Object result = point.proceed();\n        if(result == null){\n            return result;\n        }\n        Class resultClass = result.getClass();\n        log.debug(\" resultClass  = {}\" , resultClass);\n\n        if(resultClass.isPrimitive()){\n            //是基本类型 直接返回 不需要处理\n            return result;\n        }\n        // 获取方法注解信息：是哪个实体、是加密还是解密\n        boolean isEncode = true;\n        Class entity = null;\n        MethodSignature methodSignature = (MethodSignature) point.getSignature();\n        Method method = methodSignature.getMethod();\n        SensitiveEncode encode = method.getAnnotation(SensitiveEncode.class);\n        if(encode==null){\n            SensitiveDecode decode = method.getAnnotation(SensitiveDecode.class);\n            if(decode!=null){\n                entity = decode.entity();\n                isEncode = false;\n            }\n        }else{\n            entity = encode.entity();\n        }\n\n        long startTime=System.currentTimeMillis();\n        if(resultClass.equals(entity) || entity.equals(Object.class)){\n            // 方法返回实体和注解的entity一样，如果注解没有申明entity属性则认为是(方法返回实体和注解的entity一样)\n            SensitiveInfoUtil.handlerObject(result, isEncode);\n        } else if(result instanceof List){\n            // 方法返回List<实体>\n            SensitiveInfoUtil.handleList(result, entity, isEncode);\n        }else{\n            // 方法返回一个对象\n            SensitiveInfoUtil.handleNestedObject(result, entity, isEncode);\n        }\n        long endTime=System.currentTimeMillis();\n        log.debug((isEncode ? \"加密操作，\" : \"解密操作，\") + \"Aspect程序耗时：\" + (endTime - startTime) + \"ms\");\n\n        return result;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/desensitization/enums/SensitiveEnum.java",
    "content": "package org.jeecg.common.desensitization.enums;\n\n/**\n * 敏感字段信息类型\n */\npublic enum SensitiveEnum {\n\n\n    /**\n     * 加密\n     */\n    ENCODE,\n\n    /**\n     * 中文名\n     */\n    CHINESE_NAME,\n\n    /**\n     * 身份证号\n     */\n    ID_CARD,\n\n    /**\n     * 座机号\n     */\n    FIXED_PHONE,\n\n    /**\n     * 手机号\n     */\n    MOBILE_PHONE,\n\n    /**\n     * 地址\n     */\n    ADDRESS,\n\n    /**\n     * 电子邮件\n     */\n    EMAIL,\n\n    /**\n     * 银行卡\n     */\n    BANK_CARD,\n\n    /**\n     * 公司开户银行联号\n     */\n    CNAPS_CODE;\n\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/desensitization/util/SensitiveInfoUtil.java",
    "content": "package org.jeecg.common.desensitization.util;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.desensitization.annotation.SensitiveField;\nimport org.jeecg.common.desensitization.enums.SensitiveEnum;\nimport org.jeecg.common.util.encryption.AesEncryptUtil;\nimport org.jeecg.common.util.oConvertUtils;\n\nimport java.lang.reflect.Field;\nimport java.lang.reflect.ParameterizedType;\nimport java.util.Collections;\nimport java.util.List;\n\n/**\n * 敏感信息处理工具类\n * @author taoYan\n * @date 2022/4/20 18:01\n **/\n@Slf4j\npublic class SensitiveInfoUtil {\n\n    /**\n     * 处理嵌套对象\n     * @param obj 方法返回值\n     * @param entity 实体class\n     * @param isEncode 是否加密（true: 加密操作 / false:解密操作）\n     * @throws IllegalAccessException\n     */\n    public static void handleNestedObject(Object obj, Class entity, boolean isEncode) throws IllegalAccessException {\n        Field[] fields = obj.getClass().getDeclaredFields();\n        for (Field field : fields) {\n            if(field.getType().isPrimitive()){\n                continue;\n            }\n            if(field.getType().equals(entity)){\n                // 对象里面是实体\n                field.setAccessible(true);\n                Object nestedObject = field.get(obj);\n                handlerObject(nestedObject, isEncode);\n                break;\n            }else{\n                // 对象里面是List<实体>\n                if(field.getGenericType() instanceof ParameterizedType){\n                    ParameterizedType pt = (ParameterizedType)field.getGenericType();\n                    if(pt.getRawType().equals(List.class)){\n                        if(pt.getActualTypeArguments()[0].equals(entity)){\n                            field.setAccessible(true);\n                            Object nestedObject = field.get(obj);\n                            handleList(nestedObject, entity, isEncode);\n                            break;\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * 处理Object\n     * @param obj 方法返回值\n     * @param isEncode 是否加密（true: 加密操作 / false:解密操作）\n     * @return\n     * @throws IllegalAccessException\n     */\n    public static Object handlerObject(Object obj, boolean isEncode) throws IllegalAccessException {\n        if (oConvertUtils.isEmpty(obj)) {\n            return obj;\n        }\n        long startTime=System.currentTimeMillis();\n        log.debug(\" obj --> \"+ obj.toString());\n        \n        // 判断是不是一个对象\n        Field[] fields = obj.getClass().getDeclaredFields();\n        for (Field field : fields) {\n            boolean isSensitiveField = field.isAnnotationPresent(SensitiveField.class);\n            if(isSensitiveField){\n                // 必须有SensitiveField注解 才作处理\n                if(field.getType().isAssignableFrom(String.class)){\n                    //必须是字符串类型 才作处理\n                    field.setAccessible(true);\n                    String realValue = (String) field.get(obj);\n                    if(realValue==null || \"\".equals(realValue)){\n                        continue;\n                    }\n                    SensitiveField sf = field.getAnnotation(SensitiveField.class);\n                    if(isEncode==true){\n                        //加密\n                        String value = SensitiveInfoUtil.getEncodeData(realValue,  sf.type());\n                        field.set(obj, value);\n                    }else{\n                        //解密只处理 encode类型的\n                        if(sf.type().equals(SensitiveEnum.ENCODE)){\n                            String value = SensitiveInfoUtil.getDecodeData(realValue);\n                            field.set(obj, value);\n                        }\n                    }\n                }\n            }\n        }\n        //long endTime=System.currentTimeMillis();\n        //log.info((isEncode ? \"加密操作，\" : \"解密操作，\") + \"当前程序耗时：\" + (endTime - startTime) + \"ms\");\n        return obj;\n    }\n\n    /**\n     * 处理 List<实体>\n     * @param obj\n     * @param entity\n     * @param isEncode（true: 加密操作 / false:解密操作）\n     */\n    public static void handleList(Object obj, Class entity, boolean isEncode){\n        List list = (List)obj;\n        if(list.size()>0){\n            Object first = list.get(0);\n            if(first.getClass().equals(entity)){\n                for(int i=0; i<list.size(); i++){\n                    Object temp = list.get(i);\n                    try {\n                        handlerObject(temp, isEncode);\n                    } catch (IllegalAccessException e) {\n                        e.printStackTrace();\n                    }\n                }\n            }\n        }\n    }\n\n\n    /**\n     * 处理数据 获取解密后的数据\n     * @param data\n     * @return\n     */\n    public static String getDecodeData(String data){\n        String result = null;\n        try {\n            result = AesEncryptUtil.desEncrypt(data);\n        } catch (Exception exception) {\n            log.debug(\"数据解密错误，原数据:\"+data);\n        }\n        //解决debug模式下，加解密失效导致中文被解密变成空的问题\n        if(oConvertUtils.isEmpty(result) && oConvertUtils.isNotEmpty(data)){\n            result = data;\n        }\n        return result;\n    }\n\n    /**\n     * 处理数据 获取加密后的数据 或是格式化后的数据\n     * @param data 字符串\n     * @param sensitiveEnum 类型\n     * @return 处理后的字符串\n     */\n    public static String getEncodeData(String data, SensitiveEnum sensitiveEnum){\n        String result;\n        switch (sensitiveEnum){\n            case ENCODE:\n                try {\n                    result = AesEncryptUtil.encrypt(data);\n                } catch (Exception exception) {\n                    log.error(\"数据加密错误\", exception.getMessage());\n                    result = data;\n                }\n                break;\n            case CHINESE_NAME:\n                result = chineseName(data);\n                break;\n            case ID_CARD:\n                result = idCardNum(data);\n                break;\n            case FIXED_PHONE:\n                result = fixedPhone(data);\n                break;\n            case MOBILE_PHONE:\n                result = mobilePhone(data);\n                break;\n            case ADDRESS:\n                result = address(data, 3);\n                break;\n            case EMAIL:\n                result = email(data);\n                break;\n            case BANK_CARD:\n                result = bankCard(data);\n                break;\n            case CNAPS_CODE:\n                result = cnapsCode(data);\n                break;\n            default:\n                result = data;\n        }\n        return result;\n    }\n\n\n    /**\n     * [中文姓名] 只显示第一个汉字，其他隐藏为2个星号\n     * @param fullName 全名\n     * @return <例子：李**>\n     */\n    public static String chineseName(String fullName) {\n        if (oConvertUtils.isEmpty(fullName)) {\n            return \"\";\n        }\n        return formatRight(fullName, 1);\n    }\n\n    /**\n     * [中文姓名] 只显示第一个汉字，其他隐藏为2个星号\n     * @param familyName 姓\n     * @param firstName 名\n     * @return <例子：李**>\n     */\n    public static String chineseName(String familyName, String firstName) {\n        if (oConvertUtils.isEmpty(familyName) || oConvertUtils.isEmpty(firstName)) {\n            return \"\";\n        }\n        return chineseName(familyName + firstName);\n    }\n\n    /**\n     * [身份证号] 显示最后四位，其他隐藏。共计18位或者15位。\n     * @param id 身份证号\n     * @return <例子：*************5762>\n     */\n    public static String idCardNum(String id) {\n        if (oConvertUtils.isEmpty(id)) {\n            return \"\";\n        }\n        return formatLeft(id, 4);\n\n    }\n\n    /**\n     * [固定电话] 后四位，其他隐藏\n     * @param num 固定电话\n     * @return <例子：****1234>\n     */\n    public static String fixedPhone(String num) {\n        if (oConvertUtils.isEmpty(num)) {\n            return \"\";\n        }\n        return formatLeft(num, 4);\n    }\n\n    /**\n     * [手机号码] 前三位，后四位，其他隐藏\n     * @param num 手机号码\n     * @return <例子:138******1234>\n     */\n    public static String mobilePhone(String num) {\n        if (oConvertUtils.isEmpty(num)) {\n            return \"\";\n        }\n        int len = num.length();\n        if(len<11){\n            return num;\n        }\n        return formatBetween(num, 3, 4);\n    }\n\n    /**\n     * [地址] 只显示到地区，不显示详细地址；我们要对个人信息增强保护\n     * @param address 地址\n     * @param sensitiveSize 敏感信息长度\n     * @return <例子：北京市海淀区****>\n     */\n    public static String address(String address, int sensitiveSize) {\n        if (oConvertUtils.isEmpty(address)) {\n            return \"\";\n        }\n        int len = address.length();\n        if(len<sensitiveSize){\n            return address;\n        }\n        return formatRight(address, sensitiveSize);\n    }\n\n    /**\n     * [电子邮箱] 邮箱前缀仅显示第一个字母，前缀其他隐藏，用星号代替，@及后面的地址显示\n     * @param email 电子邮箱\n     * @return <例子:g**@163.com>\n     */\n    public static String email(String email) {\n        if (oConvertUtils.isEmpty(email)) {\n            return \"\";\n        }\n        int index = email.indexOf(\"@\");\n        if (index <= 1){\n            return email;\n        }\n        String begin = email.substring(0, 1);\n        String end = email.substring(index);\n        String stars = \"**\";\n        return begin + stars + end;\n    }\n\n    /**\n     * [银行卡号] 前六位，后四位，其他用星号隐藏每位1个星号\n     * @param cardNum 银行卡号\n     * @return <例子:6222600**********1234>\n     */\n    public static String bankCard(String cardNum) {\n        if (oConvertUtils.isEmpty(cardNum)) {\n            return \"\";\n        }\n        return formatBetween(cardNum, 6, 4);\n    }\n\n    /**\n     * [公司开户银行联号] 公司开户银行联行号,显示前两位，其他用星号隐藏，每位1个星号\n     * @param code 公司开户银行联号\n     * @return <例子:12********>\n     */\n    public static String cnapsCode(String code) {\n        if (oConvertUtils.isEmpty(code)) {\n            return \"\";\n        }\n        return formatRight(code, 2);\n    }\n\n\n    /**\n     * 将右边的格式化成*\n     * @param str 字符串\n     * @param reservedLength 保留长度\n     * @return 格式化后的字符串\n     */\n    public static String formatRight(String str, int reservedLength){\n        String name = str.substring(0, reservedLength);\n        String stars = String.join(\"\", Collections.nCopies(str.length()-reservedLength, \"*\"));\n        return name + stars;\n    }\n\n    /**\n     * 将左边的格式化成*\n     * @param str 字符串\n     * @param reservedLength 保留长度\n     * @return 格式化后的字符串\n     */\n    public static String formatLeft(String str, int reservedLength){\n        int len = str.length();\n        String show = str.substring(len-reservedLength);\n        String stars = String.join(\"\", Collections.nCopies(len-reservedLength, \"*\"));\n        return stars + show;\n    }\n\n    /**\n     * 将中间的格式化成*\n     * @param str 字符串\n     * @param beginLen 开始保留长度\n     * @param endLen 结尾保留长度\n     * @return 格式化后的字符串\n     */\n    public static String formatBetween(String str, int beginLen, int endLen){\n        int len = str.length();\n        String begin = str.substring(0, beginLen);\n        String end = str.substring(len-endLen);\n        String stars = String.join(\"\", Collections.nCopies(len-beginLen-endLen, \"*\"));\n        return begin + stars + end;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/es/JeecgElasticsearchTemplate.java",
    "content": "package org.jeecg.common.es;\n\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.jeecg.common.util.RestUtil;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.http.HttpMethod;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.stereotype.Component;\n\nimport java.util.*;\n\n/**\n * 关于 ElasticSearch 的一些方法（创建索引、添加数据、查询等）\n *\n * @author sunjianlei\n */\n@Slf4j\n@Component\n@ConditionalOnProperty(prefix = \"jeecg.elasticsearch\", name = \"cluster-nodes\")\npublic class JeecgElasticsearchTemplate {\n    /** es服务地址 */\n    private String baseUrl;\n    private final String FORMAT_JSON = \"format=json\";\n    /** Elasticsearch 的版本号 */\n    private String version = null;\n\n    /**ElasticSearch 最大可返回条目数*/\n    public static final int ES_MAX_SIZE = 10000;\n\n    /**es7*/\n    public static final String IE_SEVEN = \"7\";\n\n    /**url not found 404*/\n    public static final String URL_NOT_FOUND = \"404 Not Found\";\n\n    public JeecgElasticsearchTemplate(@Value(\"${jeecg.elasticsearch.cluster-nodes}\") String baseUrl, @Value(\"${jeecg.elasticsearch.check-enabled}\") boolean checkEnabled) {\n        log.debug(\"JeecgElasticsearchTemplate BaseURL：\" + baseUrl);\n        if (StringUtils.isNotEmpty(baseUrl)) {\n            this.baseUrl = baseUrl;\n            // 验证配置的ES地址是否有效\n            if (checkEnabled) {\n                try {\n                    this.getElasticsearchVersion();\n                    log.info(\"ElasticSearch 服务连接成功\");\n                    log.info(\"ElasticSearch version: \" + this.version);\n                } catch (Exception e) {\n                    this.version = \"\";\n                    log.warn(\"ElasticSearch 服务连接失败，原因：配置未通过。可能是BaseURL未配置或配置有误，也可能是Elasticsearch服务未启动。接下来将会拒绝执行任何方法！\");\n                }\n            }\n        }\n    }\n\n    /**\n     * 获取 Elasticsearch 的版本号信息，失败返回null\n     */\n    private void getElasticsearchVersion() {\n        if (this.version == null) {\n            String url = this.getBaseUrl().toString();\n            JSONObject result = RestUtil.get(url);\n            if (result != null) {\n                JSONObject v = result.getJSONObject(\"version\");\n                this.version = v.getString(\"number\");\n            }\n        }\n    }\n\n    public StringBuilder getBaseUrl(String indexName, String typeName) {\n        typeName = typeName.trim().toLowerCase();\n        return this.getBaseUrl(indexName).append(\"/\").append(typeName);\n    }\n\n    public StringBuilder getBaseUrl(String indexName) {\n        indexName = indexName.trim().toLowerCase();\n        return this.getBaseUrl().append(\"/\").append(indexName);\n    }\n\n    public StringBuilder getBaseUrl() {\n        return new StringBuilder(\"http://\").append(this.baseUrl);\n    }\n\n    /**\n     * cat 查询ElasticSearch系统数据，返回json\n     */\n    private <T> ResponseEntity<T> cat(String urlAfter, Class<T> responseType) {\n        String url = this.getBaseUrl().append(\"/_cat\").append(urlAfter).append(\"?\").append(FORMAT_JSON).toString();\n        return RestUtil.request(url, HttpMethod.GET, null, null, null, responseType);\n    }\n\n    /**\n     * 查询所有索引\n     * <p>\n     * 查询地址：GET http://{baseUrl}/_cat/indices\n     */\n    public JSONArray getIndices() {\n        return getIndices(null);\n    }\n\n\n    /**\n     * 查询单个索引\n     * <p>\n     * 查询地址：GET http://{baseUrl}/_cat/indices/{indexName}\n     */\n    public JSONArray getIndices(String indexName) {\n        StringBuilder urlAfter = new StringBuilder(\"/indices\");\n        if (!StringUtils.isEmpty(indexName)) {\n            urlAfter.append(\"/\").append(indexName.trim().toLowerCase());\n        }\n        return cat(urlAfter.toString(), JSONArray.class).getBody();\n    }\n\n    /**\n     * 索引是否存在\n     */\n    public boolean indexExists(String indexName) {\n        try {\n            JSONArray array = getIndices(indexName);\n            return array != null;\n        } catch (org.springframework.web.client.HttpClientErrorException ex) {\n            if (HttpStatus.NOT_FOUND == ex.getStatusCode()) {\n                return false;\n            } else {\n                throw ex;\n            }\n        }\n    }\n\n    /**\n     * 根据ID获取索引数据，未查询到返回null\n     * <p>\n     * 查询地址：GET http://{baseUrl}/{indexName}/{typeName}/{dataId}\n     *\n     * @param indexName 索引名称\n     * @param typeName  type，一个任意字符串，用于分类\n     * @param dataId    数据id\n     * @return\n     */\n    public JSONObject getDataById(String indexName, String typeName, String dataId) {\n        String url = this.getBaseUrl(indexName, typeName).append(\"/\").append(dataId).toString();\n        log.info(\"url:\" + url);\n        JSONObject result = RestUtil.get(url);\n        boolean found = result.getBoolean(\"found\");\n        if (found) {\n            return result.getJSONObject(\"_source\");\n        } else {\n            return null;\n        }\n    }\n\n    /**\n     * 创建索引\n     * <p>\n     * 查询地址：PUT http://{baseUrl}/{indexName}\n     */\n    public boolean createIndex(String indexName) {\n        String url = this.getBaseUrl(indexName).toString();\n\n        /* 返回结果 （仅供参考）\n        \"createIndex\": {\n            \"shards_acknowledged\": true,\n            \"acknowledged\": true,\n            \"index\": \"hello_world\"\n        }\n        */\n        try {\n            return RestUtil.put(url).getBoolean(\"acknowledged\");\n        } catch (org.springframework.web.client.HttpClientErrorException ex) {\n            if (HttpStatus.BAD_REQUEST == ex.getStatusCode()) {\n                log.warn(\"索引创建失败：\" + indexName + \" 已存在，无需再创建\");\n            } else {\n                ex.printStackTrace();\n            }\n        }\n        return false;\n    }\n\n    /**\n     * 删除索引\n     * <p>\n     * 查询地址：DELETE http://{baseUrl}/{indexName}\n     */\n    public boolean removeIndex(String indexName) {\n        String url = this.getBaseUrl(indexName).toString();\n        try {\n            return RestUtil.delete(url).getBoolean(\"acknowledged\");\n        } catch (org.springframework.web.client.HttpClientErrorException ex) {\n            if (HttpStatus.NOT_FOUND == ex.getStatusCode()) {\n                log.warn(\"索引删除失败：\" + indexName + \" 不存在，无需删除\");\n            } else {\n                ex.printStackTrace();\n            }\n        }\n        return false;\n    }\n\n    /**\n     * 获取索引字段映射（可获取字段类型）\n     * <p>\n     *\n     * @param indexName 索引名称\n     * @param typeName  分类名称\n     * @return\n     */\n    public JSONObject getIndexMapping(String indexName, String typeName) {\n        String url = this.getBaseUrl(indexName, typeName).append(\"/_mapping?\").append(FORMAT_JSON).toString();\n        // 针对 es 7.x 版本做兼容\n        this.getElasticsearchVersion();\n        if (oConvertUtils.isNotEmpty(this.version) && this.version.startsWith(IE_SEVEN)) {\n            url += \"&include_type_name=true\";\n        }\n        log.info(\"getIndexMapping-url:\" + url);\n        /*\n         * 参考返回JSON结构：\n         *\n         *{\n         *    // 索引名称\n         *    \"[indexName]\": {\n         *        \"mappings\": {\n         *            // 分类名称\n         *            \"[typeName]\": {\n         *                \"properties\": {\n         *                    // 字段名\n         *                    \"input_number\": {\n         *                        // 字段类型\n         *                        \"type\": \"long\"\n         *                    },\n         *                    \"input_string\": {\n         *                        \"type\": \"text\",\n         *                        \"fields\": {\n         *                            \"keyword\": {\n         *                                \"type\": \"keyword\",\n         *                                \"ignore_above\": 256\n         *                            }\n         *                        }\n         *                    }\n         *                 }\n         *            }\n         *        }\n         *    }\n         * }\n         */\n        try {\n            return RestUtil.get(url);\n        } catch (org.springframework.web.client.HttpClientErrorException e) {\n            String message = e.getMessage();\n            if (message != null && message.contains(URL_NOT_FOUND)) {\n                return null;\n            }\n            throw e;\n        }\n    }\n\n    /**\n     * 获取索引字段映射，返回Java实体类\n     *\n     * @param indexName\n     * @param typeName\n     * @return\n     */\n    public <T> Map<String, T> getIndexMappingFormat(String indexName, String typeName, Class<T> clazz) {\n        JSONObject mapping = this.getIndexMapping(indexName, typeName);\n        Map<String, T> map = new HashMap<>(5);\n        if (mapping == null) {\n            return map;\n        }\n        // 获取字段属性\n        JSONObject properties = mapping.getJSONObject(indexName)\n                .getJSONObject(\"mappings\")\n                .getJSONObject(typeName)\n                .getJSONObject(\"properties\");\n        // 封装成 java类型\n        for (String key : properties.keySet()) {\n            T entity = properties.getJSONObject(key).toJavaObject(clazz);\n            map.put(key, entity);\n        }\n        return map;\n    }\n\n    /**\n     * 保存数据，详见：saveOrUpdate\n     */\n    public boolean save(String indexName, String typeName, String dataId, JSONObject data) {\n        return this.saveOrUpdate(indexName, typeName, dataId, data);\n    }\n\n    /**\n     * 更新数据，详见：saveOrUpdate\n     */\n    public boolean update(String indexName, String typeName, String dataId, JSONObject data) {\n        return this.saveOrUpdate(indexName, typeName, dataId, data);\n    }\n\n    /**\n     * 保存或修改索引数据\n     * <p>\n     * 查询地址：PUT http://{baseUrl}/{indexName}/{typeName}/{dataId}\n     *\n     * @param indexName 索引名称\n     * @param typeName  type，一个任意字符串，用于分类\n     * @param dataId    数据id\n     * @param data      要存储的数据\n     * @return\n     */\n    public boolean saveOrUpdate(String indexName, String typeName, String dataId, JSONObject data) {\n        String url = this.getBaseUrl(indexName, typeName).append(\"/\").append(dataId).append(\"?refresh=wait_for\").toString();\n        /* 返回结果（仅供参考）\n       \"createIndexA2\": {\n            \"result\": \"created\",\n            \"_shards\": {\n                \"total\": 2,\n                \"successful\": 1,\n                \"failed\": 0\n            },\n            \"_seq_no\": 0,\n            \"_index\": \"test_index_1\",\n            \"_type\": \"test_type_1\",\n            \"_id\": \"a2\",\n            \"_version\": 1,\n            \"_primary_term\": 1\n        }\n         */\n\n        try {\n            // 去掉 data 中为空的值\n            Set<String> keys = data.keySet();\n            List<String> emptyKeys = new ArrayList<>(keys.size());\n            for (String key : keys) {\n                String value = data.getString(key);\n                //1、剔除空值\n                if (oConvertUtils.isEmpty(value) || \"[]\".equals(value)) {\n                    emptyKeys.add(key);\n                }\n                //2、剔除上传控件值(会导致ES同步失败，报异常failed to parse field [ge_pic] of type [text] )\n                if (oConvertUtils.isNotEmpty(value) && value.indexOf(\"[{\")!=-1) {\n                    emptyKeys.add(key);\n                    log.info(\"-------剔除上传控件字段------------key: \"+ key);\n                }\n            }\n            for (String key : emptyKeys) {\n                data.remove(key);\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        try {\n            String result = RestUtil.put(url, data).getString(\"result\");\n            return \"created\".equals(result) || \"updated\".equals(result);\n        } catch (Exception e) {\n            log.error(e.getMessage() + \"\\n-- url: \" + url + \"\\n-- data: \" + data.toJSONString());\n            //TODO 打印接口返回异常json\n            return false;\n        }\n    }\n\n    /**\n     * 批量保存数据\n     *\n     * @param indexName 索引名称\n     * @param typeName  type，一个任意字符串，用于分类\n     * @param dataList  要存储的数据数组，每行数据必须包含id\n     * @return\n     */\n    public boolean saveBatch(String indexName, String typeName, JSONArray dataList) {\n        String url = this.getBaseUrl().append(\"/_bulk\").append(\"?refresh=wait_for\").toString();\n        StringBuilder bodySb = new StringBuilder();\n        for (int i = 0; i < dataList.size(); i++) {\n            JSONObject data = dataList.getJSONObject(i);\n            String id = data.getString(\"id\");\n            // 该行的操作\n            // {\"create\": {\"_id\":\"${id}\", \"_index\": \"${indexName}\", \"_type\": \"${typeName}\"}}\n            JSONObject action = new JSONObject();\n            JSONObject actionInfo = new JSONObject();\n            actionInfo.put(\"_id\", id);\n            actionInfo.put(\"_index\", indexName);\n            actionInfo.put(\"_type\", typeName);\n            action.put(\"create\", actionInfo);\n            bodySb.append(action.toJSONString()).append(\"\\n\");\n            // 该行的数据\n            data.remove(\"id\");\n            bodySb.append(data.toJSONString()).append(\"\\n\");\n        }\n        //System.out.println(\"+-+-+-: bodySb.toString(): \" + bodySb.toString());\n        HttpHeaders headers = RestUtil.getHeaderApplicationJson();\n        RestUtil.request(url, HttpMethod.PUT, headers, null, bodySb, JSONObject.class);\n        return true;\n    }\n\n    /**\n     * 删除索引数据\n     * <p>\n     * 请求地址：DELETE http://{baseUrl}/{indexName}/{typeName}/{dataId}\n     */\n    public boolean delete(String indexName, String typeName, String dataId) {\n        String url = this.getBaseUrl(indexName, typeName).append(\"/\").append(dataId).toString();\n        /* 返回结果（仅供参考）\n        {\n            \"_index\": \"es_demo\",\n            \"_type\": \"docs\",\n            \"_id\": \"001\",\n            \"_version\": 3,\n            \"result\": \"deleted\",\n            \"_shards\": {\n                \"total\": 1,\n                \"successful\": 1,\n                \"failed\": 0\n            },\n            \"_seq_no\": 28,\n            \"_primary_term\": 18\n        }\n        */\n        try {\n            return \"deleted\".equals(RestUtil.delete(url).getString(\"result\"));\n        } catch (org.springframework.web.client.HttpClientErrorException ex) {\n            if (HttpStatus.NOT_FOUND == ex.getStatusCode()) {\n                return false;\n            } else {\n                throw ex;\n            }\n        }\n    }\n\n\n    /* = = = 以下关于查询和查询条件的方法 = = =*/\n\n    /**\n     * 查询数据\n     * <p>\n     * 请求地址：POST http://{baseUrl}/{indexName}/{typeName}/_search\n     */\n    public JSONObject search(String indexName, String typeName, JSONObject queryObject) {\n        String url = this.getBaseUrl(indexName, typeName).append(\"/_search\").toString();\n\n        log.info(\"url:\" + url + \" ,search: \" + queryObject.toJSONString());\n        JSONObject res = RestUtil.post(url, queryObject);\n        log.info(\"url:\" + url + \" ,return res: \\n\" + res.toJSONString());\n        return res;\n    }\n\n    /**\n     * @param source （源滤波器）指定返回的字段，传null返回所有字段\n     * @param query\n     * @param from    从第几条数据开始\n     * @param size    返回条目数\n     * @return { \"query\": query }\n     */\n    public JSONObject buildQuery(List<String> source, JSONObject query, int from, int size) {\n        JSONObject json = new JSONObject();\n        if (source != null) {\n            json.put(\"_source\", source);\n        }\n        json.put(\"query\", query);\n        json.put(\"from\", from);\n        json.put(\"size\", size);\n        return json;\n    }\n\n    /**\n     * @return { \"bool\" : { \"must\": must, \"must_not\": mustNot, \"should\": should } }\n     */\n    public JSONObject buildBoolQuery(JSONArray must, JSONArray mustNot, JSONArray should) {\n        JSONObject bool = new JSONObject();\n        if (must != null) {\n            bool.put(\"must\", must);\n        }\n        if (mustNot != null) {\n            bool.put(\"must_not\", mustNot);\n        }\n        if (should != null) {\n            bool.put(\"should\", should);\n        }\n        JSONObject json = new JSONObject();\n        json.put(\"bool\", bool);\n        return json;\n    }\n\n    /**\n     * @param field 要查询的字段\n     * @param args  查询参数，参考： *哈哈* OR *哒* NOT *呵* OR *啊*\n     * @return\n     */\n    public JSONObject buildQueryString(String field, String... args) {\n        if (field == null) {\n            return null;\n        }\n        StringBuilder sb = new StringBuilder(field).append(\":(\");\n        if (args != null) {\n            for (String arg : args) {\n                sb.append(arg).append(\" \");\n            }\n        }\n        sb.append(\")\");\n        return this.buildQueryString(sb.toString());\n    }\n\n    /**\n     * @return { \"query_string\": { \"query\": query }  }\n     */\n    public JSONObject buildQueryString(String query) {\n        JSONObject queryString = new JSONObject();\n        queryString.put(\"query\", query);\n        JSONObject json = new JSONObject();\n        json.put(\"query_string\", queryString);\n        return json;\n    }\n\n    /**\n     * @param field      查询字段\n     * @param min        最小值\n     * @param max        最大值\n     * @param containMin 范围内是否包含最小值\n     * @param containMax 范围内是否包含最大值\n     * @return { \"range\" : { field : { 『 \"gt『e』?containMin\" : min 』?min!=null , 『 \"lt『e』?containMax\" : max 』}} }\n     */\n    public JSONObject buildRangeQuery(String field, Object min, Object max, boolean containMin, boolean containMax) {\n        JSONObject inner = new JSONObject();\n        if (min != null) {\n            if (containMin) {\n                inner.put(\"gte\", min);\n            } else {\n                inner.put(\"gt\", min);\n            }\n        }\n        if (max != null) {\n            if (containMax) {\n                inner.put(\"lte\", max);\n            } else {\n                inner.put(\"lt\", max);\n            }\n        }\n        JSONObject range = new JSONObject();\n        range.put(field, inner);\n        JSONObject json = new JSONObject();\n        json.put(\"range\", range);\n        return json;\n    }\n\n}\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/es/QueryStringBuilder.java",
    "content": "package org.jeecg.common.es;\n\n/**\n * 用于创建 ElasticSearch 的 queryString\n *\n * @author sunjianlei\n */\npublic class QueryStringBuilder {\n\n    StringBuilder builder;\n\n    public QueryStringBuilder(String field, String str, boolean not, boolean addQuot) {\n        builder = this.createBuilder(field, str, not, addQuot);\n    }\n\n    public QueryStringBuilder(String field, String str, boolean not) {\n        builder = this.createBuilder(field, str, not, true);\n    }\n\n    /**\n     * 创建 StringBuilder\n     *\n     * @param field\n     * @param str\n     * @param not     是否是不匹配\n     * @param addQuot 是否添加双引号\n     * @return\n     */\n    public StringBuilder createBuilder(String field, String str, boolean not, boolean addQuot) {\n        StringBuilder sb = new StringBuilder(field).append(\":(\");\n        if (not) {\n            sb.append(\" NOT \");\n        }\n        this.addQuotEffect(sb, str, addQuot);\n        return sb;\n    }\n\n    public QueryStringBuilder and(String str) {\n        return this.and(str, true);\n    }\n\n    public QueryStringBuilder and(String str, boolean addQuot) {\n        builder.append(\" AND \");\n        this.addQuot(str, addQuot);\n        return this;\n    }\n\n    public QueryStringBuilder or(String str) {\n        return this.or(str, true);\n    }\n\n    public QueryStringBuilder or(String str, boolean addQuot) {\n        builder.append(\" OR \");\n        this.addQuot(str, addQuot);\n        return this;\n    }\n\n    public QueryStringBuilder not(String str) {\n        return this.not(str, true);\n    }\n\n    public QueryStringBuilder not(String str, boolean addQuot) {\n        builder.append(\" NOT \");\n        this.addQuot(str, addQuot);\n        return this;\n    }\n\n    /**\n    * 添加双引号（模糊查询，不能加双引号）\n    */\n    private QueryStringBuilder addQuot(String str, boolean addQuot) {\n        return this.addQuotEffect(this.builder, str, addQuot);\n    }\n\n    /**\n     * 是否在两边加上双引号\n     * @param builder\n     * @param str\n     * @param addQuot\n     * @return\n     */\n    private QueryStringBuilder addQuotEffect(StringBuilder builder, String str, boolean addQuot) {\n        if (addQuot) {\n            builder.append('\"');\n        }\n        builder.append(str);\n        if (addQuot) {\n            builder.append('\"');\n        }\n        return this;\n    }\n\n    @Override\n    public String toString() {\n        return builder.append(\")\").toString();\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBoot401Exception.java",
    "content": "package org.jeecg.common.exception;\n\n/**\n * @Description: jeecg-boot自定义401异常\n * @author: jeecg-boot\n */\npublic class JeecgBoot401Exception extends RuntimeException {\n\tprivate static final long serialVersionUID = 1L;\n\n\tpublic JeecgBoot401Exception(String message){\n\t\tsuper(message);\n\t}\n\n\tpublic JeecgBoot401Exception(Throwable cause)\n\t{\n\t\tsuper(cause);\n\t}\n\n\tpublic JeecgBoot401Exception(String message, Throwable cause)\n\t{\n\t\tsuper(message,cause);\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootAssertException.java",
    "content": "package org.jeecg.common.exception;\n\n/**\n * jeecgboot断言异常\n * for [QQYUN-10990]AIRAG\n * @author chenrui\n * @date 2025/2/14 14:31\n */\npublic class JeecgBootAssertException extends JeecgBootException {\n\tprivate static final long serialVersionUID = 1L;\n\n\n\tpublic JeecgBootAssertException(String message) {\n\t\tsuper(message);\n\t}\n\n\tpublic JeecgBootAssertException(String message, int errCode) {\n\t\tsuper(message, errCode);\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootBizTipException.java",
    "content": "package org.jeecg.common.exception;\n\nimport org.jeecg.common.constant.CommonConstant;\n\n/**\n * @Description: 业务提醒异常(用于操作业务提醒)\n * @date: 2024-04-26\n * @author: scott\n */\npublic class JeecgBootBizTipException extends RuntimeException {\n\tprivate static final long serialVersionUID = 1L;\n\n\t/**\n\t * 返回给前端的错误code\n\t */\n\tprivate int errCode = CommonConstant.SC_INTERNAL_SERVER_ERROR_500;\n\n\tpublic JeecgBootBizTipException(String message){\n\t\tsuper(message);\n\t}\n\n\tpublic JeecgBootBizTipException(String message, int errCode){\n\t\tsuper(message);\n\t\tthis.errCode = errCode;\n\t}\n\n\tpublic int getErrCode() {\n\t\treturn errCode;\n\t}\n\n\tpublic JeecgBootBizTipException(Throwable cause)\n\t{\n\t\tsuper(cause);\n\t}\n\t\n\tpublic JeecgBootBizTipException(String message, Throwable cause)\n\t{\n\t\tsuper(message,cause);\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootException.java",
    "content": "package org.jeecg.common.exception;\n\nimport org.jeecg.common.constant.CommonConstant;\n\n/**\n * @Description: jeecg-boot自定义异常\n * @author: jeecg-boot\n */\npublic class JeecgBootException extends RuntimeException {\n\tprivate static final long serialVersionUID = 1L;\n\n\t/**\n\t * 返回给前端的错误code\n\t */\n\tprivate int errCode = CommonConstant.SC_INTERNAL_SERVER_ERROR_500;\n\n\tpublic JeecgBootException(String message){\n\t\tsuper(message);\n\t}\n\n\tpublic JeecgBootException(String message, int errCode){\n\t\tsuper(message);\n\t\tthis.errCode = errCode;\n\t}\n\n\tpublic int getErrCode() {\n\t\treturn errCode;\n\t}\n\n\tpublic JeecgBootException(Throwable cause)\n\t{\n\t\tsuper(cause);\n\t}\n\t\n\tpublic JeecgBootException(String message,Throwable cause)\n\t{\n\t\tsuper(message,cause);\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java",
    "content": "package org.jeecg.common.exception;\n\nimport cn.hutool.core.util.ObjectUtil;\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.http.HttpServletRequest;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.exception.ExceptionUtils;\nimport org.apache.shiro.SecurityUtils;\nimport org.apache.shiro.authz.AuthorizationException;\nimport org.apache.shiro.authz.UnauthorizedException;\nimport org.jeecg.common.api.dto.LogDTO;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.enums.ClientTerminalTypeEnum;\nimport org.jeecg.common.enums.SentinelErrorInfoEnum;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.BrowserUtils;\nimport org.jeecg.common.util.IpUtils;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.base.service.BaseCommonService;\nimport org.springframework.beans.BeansException;\nimport org.springframework.dao.DataIntegrityViolationException;\nimport org.springframework.dao.DuplicateKeyException;\nimport org.springframework.data.redis.connection.PoolException;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.util.CollectionUtils;\nimport org.springframework.validation.ObjectError;\nimport org.springframework.web.HttpRequestMethodNotSupportedException;\nimport org.springframework.web.bind.MethodArgumentNotValidException;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.bind.annotation.RestControllerAdvice;\nimport org.springframework.web.multipart.MaxUploadSizeExceededException;\nimport org.springframework.web.multipart.MultipartException;\nimport org.springframework.web.servlet.NoHandlerFoundException;\n\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\n/**\n * 异常处理器\n * \n * @Author scott\n * @Date 2019\n */\n@RestControllerAdvice\n@Slf4j\npublic class JeecgBootExceptionHandler {\n\n\t@Resource\n\tBaseCommonService baseCommonService;\n\n\t@ExceptionHandler(MethodArgumentNotValidException.class)\n\tpublic Result<?> handleValidationExceptions(MethodArgumentNotValidException e) {\n\t\tlog.error(e.getMessage(), e);\n\t\taddSysLog(e);\n\t\treturn Result.error(\"校验失败！\" + e.getBindingResult().getAllErrors().stream().map(ObjectError::getDefaultMessage).collect(Collectors.joining(\",\")));\n\t}\n\t\n\t/**\n\t * 处理自定义异常\n\t */\n\t@ExceptionHandler(JeecgBootException.class)\n\tpublic Result<?> handleJeecgBootException(JeecgBootException e){\n\t\tlog.error(e.getMessage(), e);\n\t\taddSysLog(e);\n\t\treturn Result.error(e.getErrCode(), e.getMessage());\n\t}\n\t\n\t/**\n\t * 处理自定义异常\n\t */\n\t@ExceptionHandler(JeecgBootBizTipException.class)\n\tpublic Result<?> handleJeecgBootBizTipException(JeecgBootBizTipException e){\n\t\tlog.error(e.getMessage());\n\t\treturn Result.error(e.getErrCode(), e.getMessage());\n\t}\n\n\t/**\n\t * 处理自定义微服务异常\n\t */\n\t@ExceptionHandler(JeecgCloudException.class)\n\tpublic Result<?> handleJeecgCloudException(JeecgCloudException e){\n\t\tlog.error(e.getMessage(), e);\n\t\taddSysLog(e);\n\t\treturn Result.error(e.getMessage());\n\t}\n\n\t/**\n\t * 处理自定义异常\n\t */\n\t@ExceptionHandler(JeecgBoot401Exception.class)\n\t@ResponseStatus(HttpStatus.UNAUTHORIZED)\n\tpublic Result<?> handleJeecgBoot401Exception(JeecgBoot401Exception e){\n\t\tlog.error(e.getMessage(), e);\n\t\taddSysLog(e);\n\t\treturn new Result(401,e.getMessage());\n\t}\n\n\t@ExceptionHandler(NoHandlerFoundException.class)\n\tpublic Result<?> handlerNoFoundException(Exception e) {\n\t\tlog.error(e.getMessage(), e);\n\t\taddSysLog(e);\n\t\treturn Result.error(404, \"路径不存在，请检查路径是否正确\");\n\t}\n\n\t@ExceptionHandler(DuplicateKeyException.class)\n\tpublic Result<?> handleDuplicateKeyException(DuplicateKeyException e){\n\t\tlog.error(e.getMessage(), e);\n\t\taddSysLog(e);\n\t\treturn Result.error(\"数据库中已存在该记录\");\n\t}\n\n\t@ExceptionHandler({UnauthorizedException.class, AuthorizationException.class})\n\tpublic Result<?> handleAuthorizationException(AuthorizationException e){\n\t\tlog.error(e.getMessage(), e);\n\t\treturn Result.noauth(\"没有权限，请联系管理员分配权限！\");\n\t}\n\n\t@ExceptionHandler(Exception.class)\n\tpublic Result<?> handleException(Exception e){\n\t\tlog.error(e.getMessage(), e);\n\t\t// 代码逻辑说明: 处理Sentinel限流自定义异常\n\t\tThrowable throwable = e.getCause();\n\t\tSentinelErrorInfoEnum errorInfoEnum = SentinelErrorInfoEnum.getErrorByException(throwable);\n\t\tif (ObjectUtil.isNotEmpty(errorInfoEnum)) {\n\t\t\treturn Result.error(errorInfoEnum.getError());\n\t\t}\n\t\taddSysLog(e);\n\t\treturn Result.error(\"操作失败，\"+e.getMessage());\n\t}\n\t\n\t/**\n\t * @Author 政辉\n\t * @param e\n\t * @return\n\t */\n\t@ExceptionHandler(HttpRequestMethodNotSupportedException.class)\n\tpublic Result<?> httpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e){\n\t\tStringBuffer sb = new StringBuffer();\n\t\tsb.append(\"不支持\");\n\t\tsb.append(e.getMethod());\n\t\tsb.append(\"请求方法，\");\n\t\tsb.append(\"支持以下\");\n\t\tString [] methods = e.getSupportedMethods();\n\t\tif(methods!=null){\n\t\t\tfor(String str:methods){\n\t\t\t\tsb.append(str);\n\t\t\t\tsb.append(\"、\");\n\t\t\t}\n\t\t}\n\t\tlog.error(sb.toString(), e);\n\t\t//return Result.error(\"没有权限，请联系管理员授权\");\n\t\taddSysLog(e);\n\t\treturn Result.error(405,sb.toString());\n\t}\n\t\n\t /** \n\t  * spring默认上传大小100MB 超出大小捕获异常MaxUploadSizeExceededException \n\t  */\n    @ExceptionHandler(MaxUploadSizeExceededException.class)\n    public Result<?> handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) {\n    \tlog.error(e.getMessage(), e);\n\t\taddSysLog(e);\n        return Result.error(\"文件大小超出10MB限制, 请压缩或降低文件质量! \");\n    }\n\n\t/**\n\t * 处理文件过大异常.\n\t * jdk17中的MultipartException异常类已经被拆分成了MultipartException和MaxUploadSizeExceededException\n\t * for [QQYUN-11716]上传大图片失败没有精确提示\n\t * @param e\n\t * @return\n\t * @author chenrui\n\t * @date 2025/4/8 16:13\n\t */\n\t@ExceptionHandler(MultipartException.class)\n\tpublic Result<?> handleMaxUploadSizeExceededException(MultipartException e) {\n\t\tThrowable cause = e.getCause();\n\t\tif (cause instanceof IllegalStateException) {\n\t\t\tlog.error(\"文件大小超出限制: {}\", cause.getMessage(), e);\n\t\t\taddSysLog(e);\n\t\t\treturn Result.error(\"文件大小超出限制, 请压缩或降低文件质量!\");\n\t\t} else {\n\t\t\treturn handleException(e);\n\t\t}\n\t}\n\n    @ExceptionHandler(DataIntegrityViolationException.class)\n    public Result<?> handleDataIntegrityViolationException(DataIntegrityViolationException e) {\n    \tlog.error(e.getMessage(), e);\n\t\taddSysLog(e);\n    \t//【issues/3624】数据库执行异常handleDataIntegrityViolationException提示有误 #3624\n        return Result.error(\"执行数据库异常,违反了完整性例如：违反惟一约束、违反非空限制、字段内容超出长度等\");\n    }\n\n    @ExceptionHandler(PoolException.class)\n    public Result<?> handlePoolException(PoolException e) {\n    \tlog.error(e.getMessage(), e);\n\t\taddSysLog(e);\n        return Result.error(\"Redis 连接异常!\");\n    }\n\n\n\t/**\n\t * SQL注入风险，全局异常处理\n\t *\n\t * @param exception\n\t * @return\n\t */\n\t@ExceptionHandler(JeecgSqlInjectionException.class)\n\tpublic Result<?> handleSQLException(Exception exception) {\n\t\tString msg = exception.getMessage().toLowerCase();\n\t\tfinal String extractvalue = \"extractvalue\";\n\t\tfinal String updatexml = \"updatexml\";\n\t\tboolean hasSensitiveInformation = msg.indexOf(extractvalue) >= 0 || msg.indexOf(updatexml) >= 0;\n\t\tif (msg != null && hasSensitiveInformation) {\n\t\t\tlog.error(\"校验失败，存在SQL注入风险！{}\", msg);\n\t\t\treturn Result.error(\"校验失败，存在SQL注入风险！\");\n\t\t}\n\t\taddSysLog(exception);\n\t\treturn Result.error(\"校验失败，存在SQL注入风险！\" + msg);\n\t}\n\n\t/**\n\t * 添加异常新系统日志\n\t * @param e 异常\n\t * @author chenrui\n\t * @date 2024/4/22 17:16\n\t */\n    private void addSysLog(Throwable e) {\n        LogDTO log = new LogDTO();\n        log.setLogType(CommonConstant.LOG_TYPE_4);\n        log.setLogContent(e.getClass().getName()+\":\"+e.getMessage());\n\t\tlog.setRequestParam(ExceptionUtils.getStackTrace(e));\n        //获取request\n        HttpServletRequest request = null;\n        try {\n            request = SpringContextUtils.getHttpServletRequest();\n        } catch (NullPointerException | BeansException ignored) {\n        }\n        if (null != request) {\n\t\t\t//请求的参数\n\t\t\tif (!isTooBigException(e)) {\n\t\t\t\t// 文件上传过大异常时不能获取参数,否则会报错\n\t\t\t\tMap<String, String[]> parameterMap = request.getParameterMap();\n\t\t\t\tif(!CollectionUtils.isEmpty(parameterMap)) {\n\t\t\t\t\tlog.setMethod(oConvertUtils.mapToString(request.getParameterMap()));\n\t\t\t\t}\n\t\t\t}\n            // 请求地址\n            log.setRequestUrl(request.getRequestURI());\n            //设置IP地址\n            log.setIp(IpUtils.getIpAddr(request));\n            //设置客户端\n\t\t\tif(BrowserUtils.isDesktop(request)){\n\t\t\t\tlog.setClientType(ClientTerminalTypeEnum.PC.getKey());\n\t\t\t}else{\n\t\t\t\tlog.setClientType(ClientTerminalTypeEnum.APP.getKey());\n\t\t\t}\n        }\n\n       \n\t\t//获取登录用户信息\n\t\tLoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\tif(sysUser!=null){\n\t\t\tlog.setUserid(sysUser.getUsername());\n\t\t\tlog.setUsername(sysUser.getRealname());\n\n\t\t}\n\n        baseCommonService.addLog(log);\n    }\n\n\t/**\n\t * 是否文件过大异常\n\t * for [QQYUN-11716]上传大图片失败没有精确提示\n\t * @param e\n\t * @return\n\t * @author chenrui\n\t * @date 2025/4/8 20:21\n\t */\n\tprivate static boolean isTooBigException(Throwable e) {\n\t\tboolean isTooBigException = false;\n\t\tif(e instanceof MultipartException){\n\t\t\tThrowable cause = e.getCause();\n\t\t\tif (cause instanceof IllegalStateException){\n\t\t\t\tisTooBigException = true;\n\t\t\t}\n\t\t}\n\t\tif(e instanceof MaxUploadSizeExceededException){\n\t\t\tisTooBigException = true;\n\t\t}\n\t\treturn isTooBigException;\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgSqlInjectionException.java",
    "content": "package org.jeecg.common.exception;\n\n/**\n * @Description: jeecg-boot自定义SQL注入异常\n * @author: jeecg-boot\n */\npublic class JeecgSqlInjectionException extends RuntimeException {\n\tprivate static final long serialVersionUID = 1L;\n\n\tpublic JeecgSqlInjectionException(String message){\n\t\tsuper(message);\n\t}\n\t\n\tpublic JeecgSqlInjectionException(Throwable cause)\n\t{\n\t\tsuper(cause);\n\t}\n\t\n\tpublic JeecgSqlInjectionException(String message, Throwable cause)\n\t{\n\t\tsuper(message,cause);\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/handler/IFillRuleHandler.java",
    "content": "package org.jeecg.common.handler;\n\nimport com.alibaba.fastjson.JSONObject;\n\n/**\n * 填值规则接口\n *\n * @author Yan_东\n * 如需使用填值规则功能，规则实现类必须实现此接口\n */\npublic interface IFillRuleHandler {\n\n    /**\n     * 填值规则\n     * @param params 页面配置固定参数\n     * @param formData  动态表单参数\n     * @return\n     */\n    public Object execute(JSONObject params, JSONObject formData);\n\n}\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/annotation/EnumDict.java",
    "content": "package org.jeecg.common.system.annotation;\n\nimport java.lang.annotation.*;\n\n/**\n * 将枚举类转化成字典数据\n * \n * <<使用说明>>\n * 1. 枚举类需以 `Enum` 结尾，并且在类上添加 `@EnumDict` 注解。\n * 2. 需要手动将枚举类所在包路径** 添加到 `org.jeecg.common.system.util.ResourceUtil.BASE_SCAN_PACKAGES` 配置数组中。\n * \n * @Author taoYan\n * @Date 2022/7/8 10:34\n **/\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\npublic @interface EnumDict {\n\n    /**\n     * 作为字典数据的唯一编码\n     */\n    String value() default \"\";\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/controller/JeecgController.java",
    "content": "package org.jeecg.common.system.base.controller;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.beanutils.PropertyUtils;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.entity.enmus.ExcelType;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.jeecgframework.poi.handler.inter.IExcelExportServer;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.util.*;\n\n/**\n * @Description: Controller基类\n * @Author: dangzhenghui@163.com\n * @Date: 2019-4-21 8:13\n * @Version: 1.0\n */\n@Slf4j\npublic class JeecgController<T, S extends IService<T>> {\n    /**issues/2933 JeecgController注入service时改用protected修饰，能避免重复引用service*/\n    @Autowired\n    protected S service;\n    @Resource\n    private JeecgBaseConfig jeecgBaseConfig;\n    \n    /**\n     * 导出excel\n     *\n     * @param request\n     */\n    protected ModelAndView exportXls(HttpServletRequest request, T object, Class<T> clazz, String title) {\n        // Step.1 组装查询条件\n        QueryWrapper<T> queryWrapper = QueryGenerator.initQueryWrapper(object, request.getParameterMap());\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\n        // 过滤选中数据\n        String selections = request.getParameter(\"selections\");\n        if (oConvertUtils.isNotEmpty(selections)) {\n            List<String> selectionList = Arrays.asList(selections.split(\",\"));\n            queryWrapper.in(\"id\",selectionList);\n        }\n        // Step.2 获取导出数据\n        List<T> exportList = service.list(queryWrapper);\n\n        // Step.3 AutoPoi 导出Excel\n        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n        //此处设置的filename无效 ,前端会重更新设置一下\n        mv.addObject(NormalExcelConstants.FILE_NAME, title);\n        mv.addObject(NormalExcelConstants.CLASS, clazz);\n        // 代码逻辑说明: 【QQYUN-13930】统一改成导出xlsx格式---\n        ExportParams exportParams=new ExportParams(title + \"报表\", \"导出人:\" + sysUser.getRealname(), title, ExcelType.XSSF);\n        exportParams.setImageBasePath(jeecgBaseConfig.getPath().getUpload());\n        mv.addObject(NormalExcelConstants.PARAMS,exportParams);\n        mv.addObject(NormalExcelConstants.DATA_LIST, exportList);\n        // 代码逻辑说明: 【issues/9052】BasicTable列表页导出excel可以指定列---\n        String exportFields = request.getParameter(NormalExcelConstants.EXPORT_FIELDS);\n        if(oConvertUtils.isNotEmpty(exportFields)){\n            mv.addObject(NormalExcelConstants.EXPORT_FIELDS, exportFields);\n        }\n        return mv;\n    }\n    /**\n     * 根据每页sheet数量导出多sheet\n     *\n     * @param request\n     * @param object 实体类\n     * @param clazz 实体类class\n     * @param title 标题\n     * @param exportFields 导出字段自定义\n     * @param pageNum 每个sheet的数据条数\n     * @param request\n     */\n    protected ModelAndView exportXlsSheet(HttpServletRequest request, T object, Class<T> clazz, String title,String exportFields,Integer pageNum) {\n        // Step.1 组装查询条件\n        QueryWrapper<T> queryWrapper = QueryGenerator.initQueryWrapper(object, request.getParameterMap());\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        // Step.2 计算分页sheet数据\n        double total = service.count();\n        int count = (int)Math.ceil(total/pageNum);\n        // Step.3  过滤选中数据\n        String selections = request.getParameter(\"selections\");\n        if (oConvertUtils.isNotEmpty(selections)) {\n            List<String> selectionList = Arrays.asList(selections.split(\",\"));\n            queryWrapper.in(\"id\",selectionList);\n        }\n        // Step.4 多sheet处理\n        List<Map<String, Object>> listMap = new ArrayList<Map<String, Object>>();\n        for (int i = 1; i <=count ; i++) {\n            Page<T> page = new Page<T>(i, pageNum);\n            IPage<T> pageList = service.page(page, queryWrapper);\n            List<T> exportList = pageList.getRecords();\n            Map<String, Object> map = new HashMap<>(5);\n            ExportParams exportParams=new ExportParams(title + \"报表\", \"导出人:\" + sysUser.getRealname(), title+i,jeecgBaseConfig.getPath().getUpload());\n            exportParams.setType(ExcelType.XSSF);\n            //map.put(\"title\",exportParams);\n            //表格Title\n            map.put(NormalExcelConstants.PARAMS,exportParams);\n            //表格对应实体\n            map.put(NormalExcelConstants.CLASS,clazz);\n            //数据集合\n            map.put(NormalExcelConstants.DATA_LIST, exportList);\n            listMap.add(map);\n        }\n        // Step.4 AutoPoi 导出Excel\n        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n        //此处设置的filename无效 ,前端会重更新设置一下\n        mv.addObject(NormalExcelConstants.FILE_NAME, title);\n        mv.addObject(NormalExcelConstants.MAP_LIST, listMap);\n        return mv;\n    }\n\n    /**\n     * 大数据导出\n     * @param request\n     * @param object\n     * @param clazz\n     * @param title\n     * @param pageSize 每次查询的数据量\n     * @return\n     * @author chenrui\n     * @date 2025/8/11 16:11\n     */\n    protected ModelAndView exportXlsForBigData(HttpServletRequest request, T object, Class<T> clazz, String title,Integer pageSize) {\n        // 组装查询条件\n        QueryWrapper<T> queryWrapper = QueryGenerator.initQueryWrapper(object, request.getParameterMap());\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        // 计算分页数\n        double total = service.count();\n        int count = (int) Math.ceil(total / pageSize);\n        // 过滤选中数据\n        String selections = request.getParameter(\"selections\");\n        if (oConvertUtils.isNotEmpty(selections)) {\n            List<String> selectionList = Arrays.asList(selections.split(\",\"));\n            queryWrapper.in(\"id\", selectionList);\n        }\n\n        // 定义IExcelExportServer\n        IExcelExportServer excelExportServer = (queryParams, pageNum) -> {\n            if (pageNum > count) {\n                return null;\n            }\n            Page<T> page = new Page<T>(pageNum, pageSize);\n            IPage<T> pageList = service.page(page, (QueryWrapper<T>) queryParams);\n            return new ArrayList<>(pageList.getRecords());\n        };\n\n        // AutoPoi 导出Excel\n        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n        //此处设置的filename无效 ,前端会重更新设置一下\n        mv.addObject(NormalExcelConstants.FILE_NAME, title);\n        mv.addObject(NormalExcelConstants.CLASS, clazz);\n        ExportParams exportParams = new ExportParams(title + \"报表\", \"导出人:\" + sysUser.getRealname(), title, jeecgBaseConfig.getPath().getUpload());\n        mv.addObject(NormalExcelConstants.PARAMS, exportParams);\n        mv.addObject(NormalExcelConstants.EXPORT_SERVER, excelExportServer);\n        mv.addObject(NormalExcelConstants.QUERY_PARAMS, queryWrapper);\n        return mv;\n    }\n\n\n    /**\n     * 根据权限导出excel，传入导出字段参数\n     *\n     * @param request\n     */\n    protected ModelAndView exportXls(HttpServletRequest request, T object, Class<T> clazz, String title,String exportFields) {\n        ModelAndView mv = this.exportXls(request,object,clazz,title);\n        mv.addObject(NormalExcelConstants.EXPORT_FIELDS,exportFields);\n        return mv;\n    }\n\n    /**\n     * 获取对象ID\n     *\n     * @return\n     */\n    private String getId(T item) {\n        try {\n            return PropertyUtils.getProperty(item, \"id\").toString();\n        } catch (Exception e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n\n    /**\n     * 通过excel导入数据\n     *\n     * @param request\n     * @param response\n     * @return\n     */\n    protected Result<?> importExcel(HttpServletRequest request, HttpServletResponse response, Class<T> clazz) {\n        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n            // 获取上传文件对象\n            MultipartFile file = entity.getValue();\n            ImportParams params = new ImportParams();\n            params.setTitleRows(2);\n            params.setHeadRows(1);\n            params.setNeedSave(true);\n            try {\n                List<T> list = ExcelImportUtil.importExcel(file.getInputStream(), clazz, params);\n                // 代码逻辑说明: 批量插入数据\n                long start = System.currentTimeMillis();\n                service.saveBatch(list);\n                //400条 saveBatch消耗时间1592毫秒  循环插入消耗时间1947毫秒\n                //1200条  saveBatch消耗时间3687毫秒 循环插入消耗时间5212毫秒\n                log.info(\"消耗时间\" + (System.currentTimeMillis() - start) + \"毫秒\");\n                return Result.ok(\"文件导入成功！数据行数：\" + list.size());\n            } catch (Exception e) {\n                // 代码逻辑说明: 导入数据重复增加提示\n                String msg = e.getMessage();\n                log.error(msg, e);\n                if(msg!=null && msg.indexOf(\"Duplicate entry\")>=0){\n                    return Result.error(\"文件导入失败:有重复数据！\");\n                }else{\n                    return Result.error(\"文件导入失败:\" + e.getMessage());\n                }\n            } finally {\n                try {\n                    file.getInputStream().close();\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n            }\n        }\n        return Result.error(\"文件导入失败！\");\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/entity/JeecgEntity.java",
    "content": "package org.jeecg.common.system.base.entity;\n\nimport java.io.Serializable;\n\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\n/**\n * @Description: Entity基类\n * @Author: dangzhenghui@163.com\n * @Date: 2019-4-28\n * @Version: 1.1\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class JeecgEntity implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * ID\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"ID\")\n    private java.lang.String id;\n\n    /**\n     * 创建人\n     */\n    @Schema(description = \"创建人\")\n    @Excel(name = \"创建人\", width = 15)\n    private java.lang.String createBy;\n\n    /**\n     * 创建时间\n     */\n    @Schema(description = \"创建时间\")\n    @Excel(name = \"创建时间\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    private java.util.Date createTime;\n\n    /**\n     * 更新人\n     */\n    @Schema(description = \"更新人\")\n    @Excel(name = \"更新人\", width = 15)\n    private java.lang.String updateBy;\n\n    /**\n     * 更新时间\n     */\n    @Schema(description = \"更新时间\")\n    @Excel(name = \"更新时间\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    private java.util.Date updateTime;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/service/JeecgService.java",
    "content": "package org.jeecg.common.system.base.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * @Description: Service基类\n * @Author: dangzhenghui@163.com\n * @Date: 2019-4-21 8:13\n * @Version: 1.0\n */\npublic interface JeecgService<T> extends IService<T> {\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/service/impl/JeecgServiceImpl.java",
    "content": "package org.jeecg.common.system.base.service.impl;\n\nimport org.jeecg.common.system.base.entity.JeecgEntity;\nimport org.jeecg.common.system.base.service.JeecgService;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * @Description: ServiceImpl基类\n * @Author: dangzhenghui@163.com\n * @Date: 2019-4-21 8:13\n * @Version: 1.0\n */\n@Slf4j\npublic class JeecgServiceImpl<M extends BaseMapper<T>, T extends JeecgEntity> extends ServiceImpl<M, T> implements JeecgService<T> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/enhance/UserFilterEnhance.java",
    "content": "package org.jeecg.common.system.enhance;\n\nimport java.util.List;\n\n/**\n * 用户增强\n */\npublic interface UserFilterEnhance {\n    \n    /**\n     * 获取用户id\n     * @param loginUserId 当前登录的用户id\n     * \n     * @return List<String> 返回多个用户id\n     */\n    default List<String> getUserIds(String loginUserId) {\n        return null;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/MatchTypeEnum.java",
    "content": "package org.jeecg.common.system.query;\n\nimport org.jeecg.common.util.oConvertUtils;\n\n/**\n * 查询链接规则\n *\n * @Author Sunjianlei\n */\npublic enum MatchTypeEnum {\n\n    /**查询链接规则 AND*/\n    AND(\"AND\"),\n    /**查询链接规则 OR*/\n    OR(\"OR\");\n\n    private String value;\n\n    MatchTypeEnum(String value) {\n        this.value = value;\n    }\n\n    public String getValue() {\n        return value;\n    }\n\n    public static MatchTypeEnum getByValue(Object value) {\n        if (oConvertUtils.isEmpty(value)) {\n            return null;\n        }\n        return getByValue(value.toString());\n    }\n\n    public static MatchTypeEnum getByValue(String value) {\n        if (oConvertUtils.isEmpty(value)) {\n            return null;\n        }\n        for (MatchTypeEnum val : values()) {\n            if (val.getValue().toLowerCase().equals(value.toLowerCase())) {\n                return val;\n            }\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryCondition.java",
    "content": "package org.jeecg.common.system.query;\n\nimport java.io.Serializable;\n\n/**\n * @Description: QueryCondition\n * @author: jeecg-boot\n */\npublic class QueryCondition implements Serializable {\n\n\tprivate static final long serialVersionUID = 4740166316629191651L;\n\t\n\tprivate String field;\n\t/** 组件的类型（例如：input、select、radio） */\n\tprivate String type;\n\t/**\n\t * 对应的数据库字段的类型\n\t * 支持：int、bigDecimal、short、long、float、double、boolean\n\t */\n\tprivate String dbType;\n\tprivate String rule;\n\tprivate String val;\n\n\tpublic QueryCondition(String field, String type, String dbType, String rule, String val) {\n\t\tthis.field = field;\n\t\tthis.type = type;\n\t\tthis.dbType = dbType;\n\t\tthis.rule = rule;\n\t\tthis.val = val;\n\t}\n\t\n\tpublic String getField() {\n\t\treturn field;\n\t}\n\n\tpublic void setField(String field) {\n\t\tthis.field = field;\n\t}\n\n\tpublic String getType() {\n\t\treturn type;\n\t}\n\n\tpublic void setType(String type) {\n\t\tthis.type = type;\n\t}\n\n\tpublic String getDbType() {\n\t\treturn dbType;\n\t}\n\n\tpublic void setDbType(String dbType) {\n\t\tthis.dbType = dbType;\n\t}\n\n\tpublic String getRule() {\n\t\treturn rule;\n\t}\n\n\tpublic void setRule(String rule) {\n\t\tthis.rule = rule;\n\t}\n\n\tpublic String getVal() {\n\t\treturn val;\n\t}\n\n\tpublic void setVal(String val) {\n\t\tthis.val = val;\n\t}\n\n\t@Override\n\tpublic String toString(){\n\t\tStringBuffer sb =new StringBuffer();\n\t\tif(field == null || \"\".equals(field)){\n\t\t\treturn \"\";\n\t\t}\n\t\tsb.append(this.field).append(\" \").append(this.rule).append(\" \").append(this.type).append(\" \").append(this.dbType).append(\" \").append(this.val);\n\t\treturn sb.toString();\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryGenerator.java",
    "content": "package org.jeecg.common.system.query;\n\nimport java.beans.PropertyDescriptor;\nimport java.io.UnsupportedEncodingException;\nimport java.math.BigDecimal;\nimport java.net.URLDecoder;\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.util.*;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\n\nimport com.baomidou.mybatisplus.core.metadata.OrderItem;\nimport org.apache.commons.beanutils.PropertyUtils;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.DataBaseConstant;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.util.JeecgDataAutorUtils;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.system.util.SqlConcatUtil;\nimport org.jeecg.common.system.vo.SysPermissionDataRuleModel;\nimport org.jeecg.common.util.*;\nimport org.springframework.util.NumberUtils;\n\nimport com.alibaba.fastjson.JSON;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * @Description: 查询生成器\n * @author: jeecg-boot\n */\n@Slf4j\npublic class QueryGenerator {\n\tpublic static final String SQL_RULES_COLUMN = \"SQL_RULES_COLUMN\";\n\n\tprivate static final String BEGIN = \"_begin\";\n\tprivate static final String END = \"_end\";\n\t/**\n\t * 数字类型字段，拼接此后缀 接受多值参数\n\t */\n\tprivate static final String MULTI = \"_MultiString\";\n\tprivate static final String STAR = \"*\";\n\tprivate static final String COMMA = \",\";\n\t/**\n\t * 查询 逗号转义符 相当于一个逗号【作废】\n\t */\n\tpublic static final String QUERY_COMMA_ESCAPE = \"++\";\n\tprivate static final String NOT_EQUAL = \"!\";\n\t/**页面带有规则值查询，空格作为分隔符*/\n\tprivate static final String QUERY_SEPARATE_KEYWORD = \" \";\n\t/**高级查询前端传来的参数名*/\n\tprivate static final String SUPER_QUERY_PARAMS = \"superQueryParams\";\n\t/** 高级查询前端传来的拼接方式参数名 */\n\tprivate static final String SUPER_QUERY_MATCH_TYPE = \"superQueryMatchType\";\n\t/** 单引号 */\n\tpublic static final String SQL_SQ = \"'\";\n\t/**排序列*/\n\tprivate static final String ORDER_COLUMN = \"column\";\n\t/**排序方式*/\n\tprivate static final String ORDER_TYPE = \"order\";\n\tprivate static final String ORDER_TYPE_ASC = \"ASC\";\n\n\t/**mysql 模糊查询之特殊字符下划线 （_、\\）*/\n\tpublic static final String LIKE_MYSQL_SPECIAL_STRS = \"_,%\";\n\n\t/**日期格式化yyyy-MM-dd*/\n\tpublic static final String YYYY_MM_DD = \"yyyy-MM-dd\";\n\n\t/**to_date*/\n\tpublic static final String TO_DATE = \"to_date\";\n\n\t/**时间格式化 */\n\tprivate static final ThreadLocal<SimpleDateFormat> LOCAL = new ThreadLocal<SimpleDateFormat>();\n\tprivate static SimpleDateFormat getTime(){\n\t\tSimpleDateFormat time = LOCAL.get();\n\t\tif(time == null){\n\t\t\ttime = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");\n            LOCAL.set(time);\n\t\t}\n\t\treturn time;\n\t}\n\t\n\t/**\n\t * 获取查询条件构造器QueryWrapper实例 通用查询条件已被封装完成\n\t * @param searchObj 查询实体\n\t * @param parameterMap request.getParameterMap()\n\t * @return QueryWrapper实例\n\t */\n\tpublic static <T> QueryWrapper<T> initQueryWrapper(T searchObj,Map<String, String[]> parameterMap){\n\t\tlong start = System.currentTimeMillis();\n\t\tQueryWrapper<T> queryWrapper = new QueryWrapper<T>();\n\t\tinstallMplus(queryWrapper, searchObj, parameterMap, null);\n\t\tlog.debug(\"---查询条件构造器初始化完成,耗时:\"+(System.currentTimeMillis()-start)+\"毫秒----\");\n\t\treturn queryWrapper;\n\t}\n\t\n\t/**\n\t * 获取查询条件构造器QueryWrapper实例 通用查询条件已被封装完成\n\t * @param searchObj 查询实体\n\t * @param parameterMap request.getParameterMap()\n\t * @param customRuleMap 自定义字段查询规则 {field:QueryRuleEnum}\n\t * @return QueryWrapper实例\n\t */\n\tpublic static <T> QueryWrapper<T> initQueryWrapper(T searchObj,Map<String, String[]> parameterMap, Map<String, QueryRuleEnum> customRuleMap){\n\t\tlong start = System.currentTimeMillis();\n\t\tQueryWrapper<T> queryWrapper = new QueryWrapper<T>();\n\t\tinstallMplus(queryWrapper, searchObj, parameterMap, customRuleMap);\n\t\tlog.debug(\"---查询条件构造器初始化完成,耗时:\"+(System.currentTimeMillis()-start)+\"毫秒----\");\n\t\treturn queryWrapper;\n\t}\n\n\t/**\n\t * 组装Mybatis Plus 查询条件\n\t * <p>使用此方法 需要有如下几点注意:   \n\t * <br>1.使用QueryWrapper 而非LambdaQueryWrapper;\n\t * <br>2.实例化QueryWrapper时不可将实体传入参数   \n\t * <br>错误示例:如QueryWrapper<JeecgDemo> queryWrapper = new QueryWrapper<JeecgDemo>(jeecgDemo);\n\t * <br>正确示例:QueryWrapper<JeecgDemo> queryWrapper = new QueryWrapper<JeecgDemo>();\n\t * <br>3.也可以不使用这个方法直接调用 {@link #initQueryWrapper}直接获取实例\n\t */\n\tprivate static void installMplus(QueryWrapper<?> queryWrapper, Object searchObj, Map<String, String[]> parameterMap, Map<String, QueryRuleEnum> customRuleMap) {\n\t\t/*\n\t\t * 注意:权限查询由前端配置数据规则 当一个人有多个所属部门时候 可以在规则配置包含条件 orgCode 包含 #{sys_org_code}\n\t\t但是不支持在自定义SQL中写orgCode in #{sys_org_code} \n\t\t当一个人只有一个部门 就直接配置等于条件: orgCode 等于 #{sys_org_code} 或者配置自定义SQL: orgCode = '#{sys_org_code}'\n\t\t*/\n\t\t\n\t\t//区间条件组装 模糊查询 高级查询组装 简单排序 权限查询\n\t\tPropertyDescriptor[] origDescriptors = PropertyUtils.getPropertyDescriptors(searchObj);\n\t\tMap<String,SysPermissionDataRuleModel> ruleMap = getRuleMap();\n\t\t\n\t\t//权限规则自定义SQL表达式\n\t\tfor (String c : ruleMap.keySet()) {\n\t\t\tif(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){\n\t\t\t\tqueryWrapper.and(i ->i.apply(getSqlRuleValue(ruleMap.get(c).getRuleValue())));\n\t\t\t}\n\t\t}\n\t\t\n\t\tString name, type, column;\n\t\t//定义实体字段和数据库字段名称的映射 高级查询中 只能获取实体字段 如果设置TableField注解 那么查询条件会出问题\n\t\tMap<String,String> fieldColumnMap = new HashMap<>(5);\n\t\tfor (int i = 0; i < origDescriptors.length; i++) {\n\t\t\t//aliasName = origDescriptors[i].getName();  mybatis  不存在实体属性 不用处理别名的情况\n\t\t\tname = origDescriptors[i].getName();\n\t\t\ttype = origDescriptors[i].getPropertyType().toString();\n\t\t\ttry {\n\t\t\t\tif (judgedIsUselessField(name)|| !PropertyUtils.isReadable(searchObj, name)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tObject value = PropertyUtils.getSimpleProperty(searchObj, name);\n\t\t\t\tcolumn = ReflectHelper.getTableFieldName(searchObj.getClass(), name);\n\t\t\t\tif(column==null){\n\t\t\t\t\t//column为null只有一种情况 那就是 添加了注解@TableField(exist = false) 后续都不用处理了\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tfieldColumnMap.put(name,column);\n\t\t\t\t//数据权限查询\n\t\t\t\tif(ruleMap.containsKey(name)) {\n\t\t\t\t\taddRuleToQueryWrapper(ruleMap.get(name), column, origDescriptors[i].getPropertyType(), queryWrapper);\n\t\t\t\t}\n\t\t\t\t//区间查询\n\t\t\t\tdoIntervalQuery(queryWrapper, parameterMap, type, name, column);\n\t\t\t\t//判断单值  参数带不同标识字符串 走不同的查询\n\t\t\t\t//TODO 这种前后带逗号的支持分割后模糊查询(多选字段查询生效) 示例：,1,3,\n\t\t\t\tif (null != value && value.toString().startsWith(COMMA) && value.toString().endsWith(COMMA)) {\n\t\t\t\t\tString multiLikeval = value.toString().replace(\",,\", COMMA);\n\t\t\t\t\tString[] vals = multiLikeval.substring(1, multiLikeval.length()).split(COMMA);\n\t\t\t\t\tfinal String field = oConvertUtils.camelToUnderline(column);\n\t\t\t\t\tif(vals.length>1) {\n\t\t\t\t\t\tqueryWrapper.and(j -> {\n                            log.info(\"---查询过滤器，Query规则---field:{}, rule:{}, value:{}\", field, \"like\", vals[0]);\n\t\t\t\t\t\t\tj = j.like(field,vals[0]);\n\t\t\t\t\t\t\tfor (int k=1;k<vals.length;k++) {\n\t\t\t\t\t\t\t\tj = j.or().like(field,vals[k]);\n\t\t\t\t\t\t\t\tlog.info(\"---查询过滤器，Query规则 .or()---field:{}, rule:{}, value:{}\", field, \"like\", vals[k]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t//return j;\n\t\t\t\t\t\t});\n\t\t\t\t\t}else {\n\t\t\t\t\t\tlog.info(\"---查询过滤器，Query规则---field:{}, rule:{}, value:{}\", field, \"like\", vals[0]);\n\t\t\t\t\t\tqueryWrapper.and(j -> j.like(field,vals[0]));\n\t\t\t\t\t}\n\t\t\t\t}else {\n\t\t\t\t\t// 代码逻辑说明: [TV360X-378]增加自定义字段查询规则功能------------\n\t\t\t\t\tQueryRuleEnum rule;\n\t\t\t\t\tif(null != customRuleMap && customRuleMap.containsKey(name)) {\n\t\t\t\t\t\t// 有自定义规则,使用自定义规则.\n\t\t\t\t\t\trule = customRuleMap.get(name);\n\t\t\t\t\t}else {\n\t\t\t\t\t\t//根据参数值带什么关键字符串判断走什么类型的查询\n\t\t\t\t\t\t rule = convert2Rule(value);\n\t\t\t\t\t}\n\t\t\t\t\tvalue = replaceValue(rule,value);\n\t\t\t\t\t// add -begin 添加判断为字符串时设为全模糊查询\n\t\t\t\t\t//if( (rule==null || QueryRuleEnum.EQ.equals(rule)) && \"class java.lang.String\".equals(type)) {\n\t\t\t\t\t\t// 可以设置左右模糊或全模糊，因人而异\n\t\t\t\t\t\t//rule = QueryRuleEnum.LIKE;\n\t\t\t\t\t//}\n\t\t\t\t\t// add -end 添加判断为字符串时设为全模糊查询\n\t\t\t\t\taddEasyQuery(queryWrapper, column, rule, value);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t} catch (Exception e) {\n\t\t\t\tlog.error(e.getMessage(), e);\n\t\t\t}\n\t\t}\n\t\t// 排序逻辑 处理\n\t\tdoMultiFieldsOrder(queryWrapper, parameterMap, fieldColumnMap);\n\t\t\t\t\n\t\t//高级查询\n\t\tdoSuperQuery(queryWrapper, parameterMap, fieldColumnMap);\n\t\t\n\t}\n\n\n\t/**\n\t * 区间查询\n\t * @param queryWrapper query对象\n\t * @param parameterMap 参数map\n\t * @param type         字段类型\n\t * @param filedName    字段名称\n\t * @param columnName   列名称\n\t */\n\tprivate static void doIntervalQuery(QueryWrapper<?> queryWrapper, Map<String, String[]> parameterMap, String type, String filedName, String columnName) throws ParseException {\n\t\t// 添加 判断是否有区间值\n\t\tString endValue = null,beginValue = null;\n\t\tif (parameterMap != null && parameterMap.containsKey(filedName + BEGIN)) {\n\t\t\tbeginValue = parameterMap.get(filedName + BEGIN)[0].trim();\n\t\t\taddQueryByRule(queryWrapper, columnName, type, beginValue, QueryRuleEnum.GE);\n\n\t\t}\n\t\tif (parameterMap != null && parameterMap.containsKey(filedName + END)) {\n\t\t\tendValue = parameterMap.get(filedName + END)[0].trim();\n\t\t\taddQueryByRule(queryWrapper, columnName, type, endValue, QueryRuleEnum.LE);\n\t\t}\n\t\t//多值查询\n\t\tif (parameterMap != null && parameterMap.containsKey(filedName + MULTI)) {\n\t\t\tendValue = parameterMap.get(filedName + MULTI)[0].trim();\n\t\t\taddQueryByRule(queryWrapper, columnName.replace(MULTI,\"\"), type, endValue, QueryRuleEnum.IN);\n\t\t}\n\t}\n\t\n\tprivate static void doMultiFieldsOrder(QueryWrapper<?> queryWrapper,Map<String, String[]> parameterMap, Map<String,String> fieldColumnMap) {\n\t\tSet<String> allFields = fieldColumnMap.keySet();\n\t\tString column=null,order=null;\n\t\tif(parameterMap!=null&& parameterMap.containsKey(ORDER_COLUMN)) {\n\t\t\tcolumn = parameterMap.get(ORDER_COLUMN)[0];\n\t\t}\n\t\tif(parameterMap!=null&& parameterMap.containsKey(ORDER_TYPE)) {\n\t\t\torder = parameterMap.get(ORDER_TYPE)[0];\n\t\t}\n\t\t\n\t\tif(oConvertUtils.isNotEmpty(column)){\n\t\t\tlog.debug(\"单字段排序规则>> column:\" + column + \",排序方式:\" + order);\n\t\t}\n\n\t\t// 1. 列表多字段排序优先\n\t\tif(parameterMap!=null&& parameterMap.containsKey(\"sortInfoString\")) {\n\t\t\t// 多字段排序\n\t\t\tString sortInfoString = parameterMap.get(\"sortInfoString\")[0];\n\t\t\tlog.debug(\"多字段排序规则>> sortInfoString:\" + sortInfoString);\n\t\t\tList<OrderItem> orderItemList = SqlConcatUtil.getQueryConditionOrders(column, order, sortInfoString);\n\t\t\tlog.debug(orderItemList.toString());\n\t\t\tif (orderItemList != null && !orderItemList.isEmpty()) {\n\t\t\t\tfor (OrderItem item : orderItemList) {\n\t\t\t\t\t// 一、获取排序数据库字段\n\t\t\t\t\tString columnName = item.getColumn();\n\t\t\t\t\t// 1.字典字段，去掉字典翻译文本后缀\n\t\t\t\t\tif(columnName.endsWith(CommonConstant.DICT_TEXT_SUFFIX)) {\n\t\t\t\t\t\tcolumnName = columnName.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX));\n\t\t\t\t\t}\n\t\t\t\t\t// 2.实体驼峰字段转为数据库字段\n\t\t\t\t\tcolumnName = SqlInjectionUtil.getSqlInjectSortField(columnName);\n\n\t\t\t\t\t// 二、设置字段排序规则\n\t\t\t\t\tif (item.isAsc()) {\n\t\t\t\t\t\tqueryWrapper.orderByAsc(columnName);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tqueryWrapper.orderByDesc(columnName);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// 2. 列表单字段默认排序\n\t\tif(oConvertUtils.isEmpty(column) && parameterMap!=null&& parameterMap.containsKey(\"defSortString\")) {\n\t\t\t// 多字段排序\n\t\t\tString sortInfoString = parameterMap.get(\"defSortString\")[0];\n\t\t\tlog.info(\"默认多字段排序规则>> defSortString:\" + sortInfoString);\n\t\t\tList<OrderItem> orderItemList = SqlConcatUtil.getQueryConditionOrders(column, order, sortInfoString);\n\t\t\tlog.info(orderItemList.toString());\n\t\t\tif (orderItemList != null && !orderItemList.isEmpty()) {\n\t\t\t\tfor (OrderItem item : orderItemList) {\n\t\t\t\t\t// 一、获取排序数据库字段\n\t\t\t\t\tString columnName = item.getColumn();\n\t\t\t\t\t// 1.字典字段，去掉字典翻译文本后缀\n\t\t\t\t\tif(columnName.endsWith(CommonConstant.DICT_TEXT_SUFFIX)) {\n\t\t\t\t\t\tcolumnName = columnName.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX));\n\t\t\t\t\t}\n\t\t\t\t\t// 2.实体驼峰字段转为数据库字段\n\t\t\t\t\tcolumnName = SqlInjectionUtil.getSqlInjectSortField(columnName);\n\t\t\t\t\t\n\t\t\t\t\t// 二、设置字段排序规则\n\t\t\t\t\tif (item.isAsc()) {\n\t\t\t\t\t\tqueryWrapper.orderByAsc(columnName);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tqueryWrapper.orderByDesc(columnName);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t//TODO 避免用户自定义表无默认字段创建时间，导致排序报错\n\t\tif(DataBaseConstant.CREATE_TIME.equals(column) && !fieldColumnMap.containsKey(DataBaseConstant.CREATE_TIME)){\n\t\t\tcolumn = \"id\";\n\t\t\tlog.warn(\"检测到实体里没有字段createTime，改成采用ID排序！\");\n\t\t}\n\t\t\n\t\tif (oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) {\n\t\t\t//字典字段，去掉字典翻译文本后缀\n\t\t\tif(column.endsWith(CommonConstant.DICT_TEXT_SUFFIX)) {\n\t\t\t\tcolumn = column.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX));\n\t\t\t}\n\n\t\t\t//判断column是不是当前实体的\n\t\t\tlog.debug(\"当前字段有：\"+ allFields);\n\t\t\tif (!allColumnExist(column, allFields)) {\n\t\t\t\tthrow new JeecgBootException(\"请注意，将要排序的列字段不存在：\" + column);\n\t\t\t}\n\n\t\t\t//多字段排序方法没有读取 MybatisPlus 注解 @TableField 里 value 的值\n\t\t\tif (column.contains(\",\")) {\n\t\t\t\tList<String> columnList = Arrays.asList(column.split(\",\"));\n\t\t\t\tString columnStrNew = columnList.stream().map(c -> fieldColumnMap.get(c)).collect(Collectors.joining(\",\"));\n\t\t\t\tif (oConvertUtils.isNotEmpty(columnStrNew)) {\n\t\t\t\t\tcolumn = columnStrNew;\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tcolumn = fieldColumnMap.get(column);\n\t\t\t}\n\n\t\t\t//SQL注入check\n\t\t\tSqlInjectionUtil.filterContentMulti(column);\n\n\t\t\t// 排序规则修改\n\t\t\t// 将现有排序 _ 前端传递排序条件{....,column: 'column1,column2',order: 'desc'} 翻译成sql \"column1,column2 desc\"\n\t\t\t// 修改为 _ 前端传递排序条件{....,column: 'column1,column2',order: 'desc'} 翻译成sql \"column1 desc,column2 desc\"\n\t\t\tif (order.toUpperCase().indexOf(ORDER_TYPE_ASC)>=0) {\n\t\t\t\tqueryWrapper.orderByAsc(SqlInjectionUtil.getSqlInjectSortFields(column.split(\",\")));\n\t\t\t} else {\n\t\t\t\tqueryWrapper.orderByDesc(SqlInjectionUtil.getSqlInjectSortFields(column.split(\",\")));\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * 多字段排序 判断所传字段是否存在\n\t * @return\n\t */\n\tprivate static boolean allColumnExist(String columnStr, Set<String> allFields){\n\t\tboolean exist = true;\n\t\tif(columnStr.indexOf(COMMA)>=0){\n\t\t\tString[] arr = columnStr.split(COMMA);\n\t\t\tfor(String column: arr){\n\t\t\t\tif(!allFields.contains(column)){\n\t\t\t\t\texist = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}else{\n\t\t\texist = allFields.contains(columnStr);\n\t\t}\n\t\treturn exist;\n\t}\n\t\n\t/**\n\t * 高级查询\n\t * @param queryWrapper 查询对象\n\t * @param parameterMap 参数对象\n\t * @param fieldColumnMap 实体字段和数据库列对应的map\n\t */\n\tprivate static void doSuperQuery(QueryWrapper<?> queryWrapper,Map<String, String[]> parameterMap, Map<String,String> fieldColumnMap) {\n\t\tif(parameterMap!=null&& parameterMap.containsKey(SUPER_QUERY_PARAMS)){\n\t\t\tString superQueryParams = parameterMap.get(SUPER_QUERY_PARAMS)[0];\n\t\t\tString superQueryMatchType = parameterMap.get(SUPER_QUERY_MATCH_TYPE) != null ? parameterMap.get(SUPER_QUERY_MATCH_TYPE)[0] : MatchTypeEnum.AND.getValue();\n            MatchTypeEnum matchType = MatchTypeEnum.getByValue(superQueryMatchType);\n            // 代码逻辑说明: 高级查询的条件要用括号括起来，防止和用户的其他条件冲突 -------\n            try {\n                superQueryParams = URLDecoder.decode(superQueryParams, \"UTF-8\");\n                List<QueryCondition> conditions = JSON.parseArray(superQueryParams, QueryCondition.class);\n                if (conditions == null || conditions.size() == 0) {\n                    return;\n                }\n\t\t\t\t// 代码逻辑说明: 【JTC-573】 过滤空条件查询，防止 sql 拼接多余的 and\n\t\t\t\tList<QueryCondition> filterConditions = conditions.stream().filter(\n\t\t\t\t\t\trule -> (oConvertUtils.isNotEmpty(rule.getField())\n\t\t\t\t\t\t\t\t\t\t\t\t\t&& oConvertUtils.isNotEmpty(rule.getRule())\n\t\t\t\t\t\t\t\t\t\t\t\t\t&& oConvertUtils.isNotEmpty(rule.getVal())\n\t\t\t\t\t\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t\t\t\t\t\t|| \"empty\".equals(rule.getRule())\n\t\t\t\t).collect(Collectors.toList());\n\t\t\t\tif (filterConditions.size() == 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n                log.debug(\"---高级查询参数-->\" + filterConditions);\n\n                queryWrapper.and(andWrapper -> {\n                    for (int i = 0; i < filterConditions.size(); i++) {\n                        QueryCondition rule = filterConditions.get(i);\n                        if (\n\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t    oConvertUtils.isNotEmpty(rule.getField()) && oConvertUtils.isNotEmpty(rule.getRule()) && oConvertUtils.isNotEmpty(rule.getVal())\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t    || \"empty\".equals(rule.getRule())\n\t\t\t\t\t\t) {\n\n                            log.debug(\"SuperQuery ==> \" + rule.toString());\n\n                            // 代码逻辑说明: 【高级查询】 oracle 日期等于查询报错\n\t\t\t\t\t\t\tObject queryValue = rule.getVal();\n                            if(\"date\".equals(rule.getType())){\n\t\t\t\t\t\t\t\tqueryValue = DateUtils.str2Date(rule.getVal(),DateUtils.date_sdf.get());\n\t\t\t\t\t\t\t}else if(\"datetime\".equals(rule.getType())){\n\t\t\t\t\t\t\t\tqueryValue = DateUtils.str2Date(rule.getVal(), DateUtils.datetimeFormat.get());\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// 代码逻辑说明: 【/issues/I3VR8E】高级查询没有类型转换，查询参数都是字符串类型 ----\n\t\t\t\t\t\t\tString dbType = rule.getDbType();\n\t\t\t\t\t\t\tif (oConvertUtils.isNotEmpty(dbType)) {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tString valueStr = String.valueOf(queryValue);\n\t\t\t\t\t\t\t\t\tswitch (dbType.toLowerCase().trim()) {\n\t\t\t\t\t\t\t\t\t\tcase \"int\":\n\t\t\t\t\t\t\t\t\t\t\tqueryValue = Integer.parseInt(valueStr);\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase \"bigdecimal\":\n\t\t\t\t\t\t\t\t\t\t\tqueryValue = new BigDecimal(valueStr);\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase \"short\":\n\t\t\t\t\t\t\t\t\t\t\tqueryValue = Short.parseShort(valueStr);\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase \"long\":\n\t\t\t\t\t\t\t\t\t\t\tqueryValue = Long.parseLong(valueStr);\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase \"float\":\n\t\t\t\t\t\t\t\t\t\t\tqueryValue = Float.parseFloat(valueStr);\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase \"double\":\n\t\t\t\t\t\t\t\t\t\t\tqueryValue = Double.parseDouble(valueStr);\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tcase \"boolean\":\n\t\t\t\t\t\t\t\t\t\t\tqueryValue = Boolean.parseBoolean(valueStr);\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n                                        default:\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\t\t\t\tlog.error(\"高级查询值转换失败：\", e);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// 代码逻辑说明: 【/issues/I3VR8E】高级查询没有类型转换，查询参数都是字符串类型 ----\n                            addEasyQuery(andWrapper, fieldColumnMap.get(rule.getField()), QueryRuleEnum.getByValue(rule.getRule()), queryValue);\n\n                            // 如果拼接方式是OR，就拼接OR\n                            if (MatchTypeEnum.OR == matchType && i < (filterConditions.size() - 1)) {\n                                andWrapper.or();\n                            }\n                        }\n                    }\n                    //return andWrapper;\n                });\n            } catch (UnsupportedEncodingException e) {\n                log.error(\"--高级查询参数转码失败：\" + superQueryParams, e);\n            } catch (Exception e) {\n                log.error(\"--高级查询拼接失败：\" + e.getMessage());\n                e.printStackTrace();\n            }\n\t\t}\n\t\t//log.info(\" superQuery getCustomSqlSegment: \"+ queryWrapper.getCustomSqlSegment());\n\t}\n\t/**\n\t * 根据所传的值 转化成对应的比较方式\n\t * 支持><= like in !\n\t * @param value\n\t * @return\n\t */\n\tpublic static QueryRuleEnum convert2Rule(Object value) {\n\t\t// 避免空数据\n\t\t// 代码逻辑说明: 查询条件输入空格导致return null后续判断导致抛出null异常\n\t\tif (value == null) {\n\t\t\treturn QueryRuleEnum.EQ;\n\t\t}\n\t\tString val = (value + \"\").toString().trim();\n\t\tif (val.length() == 0) {\n\t\t\treturn QueryRuleEnum.EQ;\n\t\t}\n\t\tQueryRuleEnum rule =null;\n\n\t\t//TODO 此处规则，只适用于 le lt ge gt\n\t\t// step 2 .>= =<\n        int length2 = 2;\n        int length3 = 3;\n\t\tif (rule == null && val.length() >= length3) {\n\t\t\tif(QUERY_SEPARATE_KEYWORD.equals(val.substring(length2, length3))){\n\t\t\t\trule = QueryRuleEnum.getByValue(val.substring(0, 2));\n\t\t\t}\n\t\t}\n\t\t// step 1 .> <\n\t\tif (rule == null && val.length() >= length2) {\n\t\t\tif(QUERY_SEPARATE_KEYWORD.equals(val.substring(1, length2))){\n\t\t\t\trule = QueryRuleEnum.getByValue(val.substring(0, 1));\n\t\t\t}\n\t\t}\n\n\t\t// step 3 like\n\t\t// 代码逻辑说明: /issues/3382 默认带*就走模糊，但是如果只有一个*，那么走等于查询\n\t\tif(rule == null && val.equals(STAR)){\n\t\t\trule = QueryRuleEnum.EQ;\n\t\t}\n\t\tif (rule == null && val.contains(STAR)) {\n\t\t\tif (val.startsWith(STAR) && val.endsWith(STAR)) {\n\t\t\t\trule = QueryRuleEnum.LIKE;\n\t\t\t} else if (val.startsWith(STAR)) {\n\t\t\t\trule = QueryRuleEnum.LEFT_LIKE;\n\t\t\t} else if(val.endsWith(STAR)){\n\t\t\t\trule = QueryRuleEnum.RIGHT_LIKE;\n\t\t\t}\n\t\t}\n\n\t\t// step 4 in\n\t\tif (rule == null && val.contains(COMMA)) {\n\t\t\t//TODO in 查询这里应该有个bug  如果一字段本身就是多选 此时用in查询 未必能查询出来\n\t\t\trule = QueryRuleEnum.IN;\n\t\t}\n\t\t// step 5 != \n\t\tif(rule == null && val.startsWith(NOT_EQUAL)){\n\t\t\trule = QueryRuleEnum.NE;\n\t\t}\n\t\t// step 6 xx+xx+xx 这种情况适用于如果想要用逗号作精确查询 但是系统默认逗号走in 所以可以用++替换【此逻辑作废】\n\t\tif(rule == null && val.indexOf(QUERY_COMMA_ESCAPE)>0){\n\t\t\trule = QueryRuleEnum.EQ_WITH_ADD;\n\t\t}\n\n\t\t//特殊处理：Oracle的表达式to_date('xxx','yyyy-MM-dd')含有逗号，会被识别为in查询，转为等于查询\n\t\tif(rule == QueryRuleEnum.IN && val.indexOf(YYYY_MM_DD)>=0 && val.indexOf(TO_DATE)>=0){\n\t\t\trule = QueryRuleEnum.EQ;\n\t\t}\n\n\t\treturn rule != null ? rule : QueryRuleEnum.EQ;\n\t}\n\t\n\t/**\n\t * 替换掉关键字字符\n\t * \n\t * @param rule\n\t * @param value\n\t * @return\n\t */\n\tprivate static Object replaceValue(QueryRuleEnum rule, Object value) {\n\t\tif (rule == null) {\n\t\t\treturn null;\n\t\t}\n\t\tif (! (value instanceof String)){\n\t\t\treturn value;\n\t\t}\n\t\tString val = (value + \"\").toString().trim();\n\t\t// 代码逻辑说明: 查询条件的值为等号（=）bug #3443\n\t\tif(QueryRuleEnum.EQ.getValue().equals(val)){\n\t\t\treturn val;\n\t\t}\n\t\tif (rule == QueryRuleEnum.LIKE) {\n\t\t\tvalue = val.substring(1, val.length() - 1);\n\t\t\t//mysql 模糊查询之特殊字符下划线 （_、\\）\n\t\t\tvalue = specialStrConvert(value.toString());\n\t\t} else if (rule == QueryRuleEnum.LEFT_LIKE || rule == QueryRuleEnum.NE) {\n\t\t\tvalue = val.substring(1);\n\t\t\t//mysql 模糊查询之特殊字符下划线 （_、\\）\n\t\t\tvalue = specialStrConvert(value.toString());\n\t\t} else if (rule == QueryRuleEnum.RIGHT_LIKE) {\n\t\t\tvalue = val.substring(0, val.length() - 1);\n\t\t\t//mysql 模糊查询之特殊字符下划线 （_、\\）\n\t\t\tvalue = specialStrConvert(value.toString());\n\t\t} else if (rule == QueryRuleEnum.IN) {\n\t\t\tvalue = val.split(\",\");\n\t\t} else if (rule == QueryRuleEnum.EQ_WITH_ADD) {\n\t\t\tvalue = val.replaceAll(\"\\\\+\\\\+\", COMMA);\n\t\t}else {\n\t\t\t// 代码逻辑说明: initQueryWrapper组装sql查询条件错误 #284-------------------\n\t\t\tif(val.startsWith(rule.getValue())){\n\t\t\t\t//TODO 此处逻辑应该注释掉-> 如果查询内容中带有查询匹配规则符号，就会被截取的（比如：>=您好）\n\t\t\t\tvalue = val.replaceFirst(rule.getValue(),\"\");\n\t\t\t}else if(val.startsWith(rule.getCondition()+QUERY_SEPARATE_KEYWORD)){\n\t\t\t\tvalue = val.replaceFirst(rule.getCondition()+QUERY_SEPARATE_KEYWORD,\"\").trim();\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t}\n\t\n\tprivate static void addQueryByRule(QueryWrapper<?> queryWrapper,String name,String type,String value,QueryRuleEnum rule) throws ParseException {\n\t\tif(oConvertUtils.isNotEmpty(value)) {\n\t\t\t// 针对数字类型字段，多值查询\n\t\t\tif(value.contains(COMMA)){\n\t\t\t\tObject[] temp = Arrays.stream(value.split(COMMA)).map(v -> {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn QueryGenerator.parseByType(v, type, rule);\n\t\t\t\t\t} catch (ParseException e) {\n\t\t\t\t\t\te.printStackTrace();\n\t\t\t\t\t\treturn v;\n\t\t\t\t\t}\n\t\t\t\t}).toArray();\n\t\t\t\taddEasyQuery(queryWrapper, name, rule, temp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tObject temp = QueryGenerator.parseByType(value, type, rule);\n\t\t\taddEasyQuery(queryWrapper, name, rule, temp);\n\t\t}\n\t}\n\n\t/**\n\t * 根据类型转换给定的值\n\t * @param value\n\t * @param type\n\t * @param rule\n\t * @return\n\t * @throws ParseException\n\t */\n\tprivate static Object parseByType(String value, String type, QueryRuleEnum rule) throws ParseException {\n\t\tObject temp;\n\t\tswitch (type) {\n\t\t\tcase \"class java.lang.Integer\":\n\t\t\t\ttemp =  Integer.parseInt(value);\n\t\t\t\tbreak;\n\t\t\tcase \"class java.math.BigDecimal\":\n\t\t\t\ttemp =  new BigDecimal(value);\n\t\t\t\tbreak;\n\t\t\tcase \"class java.lang.Short\":\n\t\t\t\ttemp =  Short.parseShort(value);\n\t\t\t\tbreak;\n\t\t\tcase \"class java.lang.Long\":\n\t\t\t\ttemp =  Long.parseLong(value);\n\t\t\t\tbreak;\n\t\t\tcase \"class java.lang.Float\":\n\t\t\t\ttemp =   Float.parseFloat(value);\n\t\t\t\tbreak;\n\t\t\tcase \"class java.lang.Double\":\n\t\t\t\ttemp =  Double.parseDouble(value);\n\t\t\t\tbreak;\n\t\t\tcase \"class java.util.Date\":\n\t\t\t\ttemp = getDateQueryByRule(value, rule);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\ttemp = value;\n\t\t\t\tbreak;\n\t\t}\n\t\treturn temp;\n\t}\n\t\n\t/**\n\t * 获取日期类型的值\n\t * @param value\n\t * @param rule\n\t * @return\n\t * @throws ParseException\n\t */\n\tprivate static Date getDateQueryByRule(String value,QueryRuleEnum rule) throws ParseException {\n\t\tDate date = null;\n\t\tint length = 10;\n\t\tif(value.length()==length) {\n\t\t\tif(rule==QueryRuleEnum.GE) {\n\t\t\t\t//比较大于\n\t\t\t\tdate = getTime().parse(value + \" 00:00:00\");\n\t\t\t}else if(rule==QueryRuleEnum.LE) {\n\t\t\t\t//比较小于\n\t\t\t\tdate = getTime().parse(value + \" 23:59:59\");\n\t\t\t}\n\t\t\t//TODO 日期类型比较特殊 可能oracle下不一定好使\n\t\t}\n\t\tif(date==null) {\n\t\t\tdate = getTime().parse(value);\n\t\t}\n\t\treturn date;\n\t}\n\t\n\t/**\n\t  * 根据规则走不同的查询\n\t * @param queryWrapper QueryWrapper\n\t * @param name         字段名字\n\t * @param rule         查询规则\n\t * @param value        查询条件值\n\t */\n\tpublic static void addEasyQuery(QueryWrapper<?> queryWrapper, String name, QueryRuleEnum rule, Object value) {\n\t\tif (\n\t\t\t\t(\n\t\t\t\t   name==null || value == null || rule == null || oConvertUtils.isEmpty(value)\n\t\t\t\t) \n\t\t\t\t  && !QueryRuleEnum.EMPTY.equals(rule)) {\n\t\t\treturn;\n\t\t}\n\t\tname = oConvertUtils.camelToUnderline(name);\n\t\tlog.debug(\"---高级查询 Query规则---field:{} , rule:{} , value:{}\",name,rule.getValue(),value);\n\t\tswitch (rule) {\n\t\tcase GT:\n\t\t\tqueryWrapper.gt(name, value);\n\t\t\tbreak;\n\t\tcase GE:\n\t\t\tqueryWrapper.ge(name, value);\n\t\t\tbreak;\n\t\tcase EMPTY:\n\t\t\tqueryWrapper.isNull(name);\n\t\t\tbreak;\n\t\tcase LT:\n\t\t\tqueryWrapper.lt(name, value);\n\t\t\tbreak;\n\t\tcase LE:\n\t\t\tqueryWrapper.le(name, value);\n\t\t\tbreak;\n\t\tcase EQ:\n\t\tcase EQ_WITH_ADD:\n\t\t\tqueryWrapper.eq(name, value);\n\t\t\tbreak;\n\t\tcase NE:\n\t\t\tqueryWrapper.ne(name, value);\n\t\t\tbreak;\n\t\tcase IN:\n\t\t\tif(value instanceof String) {\n\t\t\t\tqueryWrapper.in(name, (Object[])value.toString().split(COMMA));\n\t\t\t}else if(value instanceof String[]) {\n\t\t\t\tqueryWrapper.in(name, (Object[]) value);\n\t\t\t}\n\t\t\t// 代码逻辑说明: 【bug】in 类型多值查询 不适配postgresql #1671\n\t\t\telse if(value.getClass().isArray()) {\n\t\t\t\tqueryWrapper.in(name, (Object[])value);\n\t\t\t}else {\n\t\t\t\tqueryWrapper.in(name, value);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase LIKE:\n\t\t\tqueryWrapper.like(name, value);\n\t\t\tbreak;\n\t\tcase LEFT_LIKE:\n\t\t\tqueryWrapper.likeLeft(name, value);\n\t\t\tbreak;\n\t\tcase NOT_LEFT_LIKE:\n\t\t\tqueryWrapper.notLikeLeft(name, value);\n\t\t\tbreak;\n\t\tcase RIGHT_LIKE:\n\t\t\tqueryWrapper.likeRight(name, value);\n\t\t\tbreak;\n\t\tcase NOT_RIGHT_LIKE:\n\t\t\tqueryWrapper.notLikeRight(name, value);\n\t\t\tbreak;\n\t\t// 代码逻辑说明: [TV360X-378]下拉多框根据条件查询不出来:增加自定义字段查询规则功能------------\n\t\tcase LIKE_WITH_OR:\n\t\t\tfinal String nameFinal = name;\n\t\t\tObject[] vals;\n\t\t\tif (value instanceof String) {\n\t\t\t\tvals = value.toString().split(COMMA);\n\t\t\t} else if (value instanceof String[]) {\n\t\t\t\tvals = (Object[]) value;\n\t\t\t}\n\t\t\t// 代码逻辑说明: 【bug】in 类型多值查询 不适配postgresql #1671\n\t\t\telse if (value.getClass().isArray()) {\n\t\t\t\tvals = (Object[]) value;\n\t\t\t} else {\n\t\t\t\tvals = new Object[]{value};\n\t\t\t}\n\t\t\tqueryWrapper.and(j -> {\n\t\t\t\tlog.info(\"---查询过滤器，Query规则---field:{}, rule:{}, value:{}\", nameFinal, \"like\", vals[0]);\n\t\t\t\tj = j.like(nameFinal, vals[0]);\n\t\t\t\tfor (int k = 1; k < vals.length; k++) {\n\t\t\t\t\tj = j.or().like(nameFinal, vals[k]);\n\t\t\t\t\tlog.info(\"---查询过滤器，Query规则 .or()---field:{}, rule:{}, value:{}\", nameFinal, \"like\", vals[k]);\n\t\t\t\t}\n\t\t\t});\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tlog.info(\"--查询规则未匹配到---\");\n\t\t\tbreak;\n\t\t}\n\t}\n\t/**\n\t * \n\t * @param name\n\t * @return\n\t */\n\tprivate static boolean judgedIsUselessField(String name) {\n\t\treturn \"class\".equals(name) || \"ids\".equals(name)\n\t\t\t\t|| \"page\".equals(name) || \"rows\".equals(name)\n//// https://github.com/jeecgboot/JeecgBoot/issues/6937\n//\t\t\t\t|| \"sort\".equals(name) || \"order\".equals(name)\n\t\t\t\t;\n\t}\n\n\t\n\n\t/**\n\t * 获取请求对应的数据权限规则 TODO 相同列权限多个 有问题\n\t * @return\n\t */\n\tpublic static Map<String, SysPermissionDataRuleModel> getRuleMap() {\n\t\tMap<String, SysPermissionDataRuleModel> ruleMap = new HashMap<>(5);\n\t\tList<SysPermissionDataRuleModel> list = null;\n\t\t// 代码逻辑说明: QQYUN-5441 【简流】获取多个用户/部门/角色 设置部门查询 报错\n\t\ttry {\n\t\t\tlist = JeecgDataAutorUtils.loadDataSearchConditon();\n\t\t}catch (Exception e){\n\t\t\tlog.error(\"根据request对象获取权限数据失败，可能是定时任务中执行的。\", e);\n\t\t}\n\t\tif(list != null&&list.size()>0){\n\t\t\tif(list.get(0)==null){\n\t\t\t\treturn ruleMap;\n\t\t\t}\n\t\t\tfor (SysPermissionDataRuleModel rule : list) {\n\t\t\t\tString column = rule.getRuleColumn();\n\t\t\t\tif(QueryRuleEnum.SQL_RULES.getValue().equals(rule.getRuleConditions())) {\n\t\t\t\t\tcolumn = SQL_RULES_COLUMN+rule.getId();\n\t\t\t\t}\n\t\t\t\truleMap.put(column, rule);\n\t\t\t}\n\t\t}\n\t\treturn ruleMap;\n\t}\n\t\n\tprivate static void addRuleToQueryWrapper(SysPermissionDataRuleModel dataRule, String name, Class propertyType, QueryWrapper<?> queryWrapper) {\n\t\tQueryRuleEnum rule = QueryRuleEnum.getByValue(dataRule.getRuleConditions());\n\t\tif(rule.equals(QueryRuleEnum.IN) && ! propertyType.equals(String.class)) {\n\t\t\tString[] values = dataRule.getRuleValue().split(\",\");\n\t\t\tObject[] objs = new Object[values.length];\n\t\t\tfor (int i = 0; i < values.length; i++) {\n\t\t\t\tobjs[i] = NumberUtils.parseNumber(values[i], propertyType);\n\t\t\t}\n\t\t\taddEasyQuery(queryWrapper, name, rule, objs);\n\t\t}else {\n\t\t\tif (propertyType.equals(String.class)) {\n\t\t\t\taddEasyQuery(queryWrapper, name, rule, converRuleValue(dataRule.getRuleValue()));\n\t\t\t}else if (propertyType.equals(Date.class)) {\n\t\t\t\tString dateStr =converRuleValue(dataRule.getRuleValue());\n                int length = 10;\n\t\t\t\tif(dateStr.length()==length){\n\t\t\t\t\taddEasyQuery(queryWrapper, name, rule, DateUtils.str2Date(dateStr,DateUtils.date_sdf.get()));\n\t\t\t\t}else{\n\t\t\t\t\taddEasyQuery(queryWrapper, name, rule, DateUtils.str2Date(dateStr,DateUtils.datetimeFormat.get()));\n\t\t\t\t}\n\t\t\t}else {\n\t\t\t\t// 代码逻辑说明: [issues/7481]多租户模式下 数据权限使用变量：#{tenant_id} 报错------------\n\t\t\t\taddEasyQuery(queryWrapper, name, rule, NumberUtils.parseNumber(converRuleValue(dataRule.getRuleValue()), propertyType));\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static String converRuleValue(String ruleValue) {\n\t\tString value = JwtUtil.getUserSystemData(ruleValue,null);\n\t\treturn value!= null ? value : ruleValue;\n\t}\n\n\t/**\n\t* @author: scott\n\t* @Description: 去掉值前后单引号\n\t* @date: 2020/3/19 21:26\n\t* @param ruleValue: \n\t* @Return: java.lang.String\n\t*/\n\tpublic static String trimSingleQuote(String ruleValue) {\n\t\tif (oConvertUtils.isEmpty(ruleValue)) {\n\t\t\treturn \"\";\n\t\t}\n\t\tif (ruleValue.startsWith(QueryGenerator.SQL_SQ)) {\n\t\t\truleValue = ruleValue.substring(1);\n\t\t}\n\t\tif (ruleValue.endsWith(QueryGenerator.SQL_SQ)) {\n\t\t\truleValue = ruleValue.substring(0, ruleValue.length() - 1);\n\t\t}\n\t\treturn ruleValue;\n\t}\n\t\n\tpublic static String getSqlRuleValue(String sqlRule){\n\t\ttry {\n\t\t\tSet<String> varParams = getSqlRuleParams(sqlRule);\n\t\t\tif (varParams == null || varParams.isEmpty()) {\n\t\t\t\treturn sqlRule;\n\t\t\t}\n\t\t\tfor(String var:varParams){\n\t\t\t\tString tempValue = converRuleValue(var);\n\t\t\t\tsqlRule = sqlRule.replace(\"#{\"+var+\"}\",tempValue);\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t}\n\t\treturn sqlRule;\n\t}\n\t\n\t/**\n\t * 获取sql中的#{key} 这个key组成的set\n\t */\n\tpublic static Set<String> getSqlRuleParams(String sql) {\n\t\tif(oConvertUtils.isEmpty(sql)){\n\t\t\treturn null;\n\t\t}\n\t\tSet<String> varParams = new HashSet<String>();\n\t\t// 代码逻辑说明: [QQYUN-10785]数据权限，查看自己拥有部门的权限中存在问题 #7288------------\n\t\tString regex = \"#\\\\{\\\\[*\\\\w+]*}\";\n\t\t\n\t\tPattern p = Pattern.compile(regex);\n\t\tMatcher m = p.matcher(sql);\n\t\twhile(m.find()){\n\t\t\tString var = m.group();\n\t\t\tvarParams.add(var.substring(var.indexOf(\"{\")+1,var.indexOf(\"}\")));\n\t\t}\n\t\treturn varParams;\n\t}\n\t\n\t/**\n\t * 获取查询条件 \n\t * @param field\n\t * @param alias\n\t * @param value\n\t * @param isString\n\t * @return\n\t */\n\tpublic static String getSingleQueryConditionSql(String field,String alias,Object value,boolean isString) {\n\t\treturn SqlConcatUtil.getSingleQueryConditionSql(field, alias, value, isString,null);\n\t}\n\t\n\t/**\n\t *   根据权限相关配置生成相关的SQL 语句\n\t * @param clazz\n\t * @return\n\t */\n\t@SuppressWarnings({ \"unchecked\", \"rawtypes\" })\n\tpublic static String installAuthJdbc(Class<?> clazz) {\n\t\tStringBuffer sb = new StringBuffer();\n\t\t//权限查询\n\t\tMap<String,SysPermissionDataRuleModel> ruleMap = getRuleMap();\n\t\tPropertyDescriptor[] origDescriptors = PropertyUtils.getPropertyDescriptors(clazz);\n\t\tString sqlAnd = \" and \";\n\t\tfor (String c : ruleMap.keySet()) {\n\t\t\tif(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){\n\t\t\t\tsb.append(sqlAnd+getSqlRuleValue(ruleMap.get(c).getRuleValue()));\n\t\t\t}\n\t\t}\n\t\tString name, column;\n\t\tfor (int i = 0; i < origDescriptors.length; i++) {\n\t\t\tname = origDescriptors[i].getName();\n\t\t\tif (judgedIsUselessField(name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif(ruleMap.containsKey(name)) {\n\t\t\t\tcolumn = ReflectHelper.getTableFieldName(clazz, name);\n\t\t\t\tif(column==null){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tSysPermissionDataRuleModel dataRule = ruleMap.get(name);\n\t\t\t\tQueryRuleEnum rule = QueryRuleEnum.getByValue(dataRule.getRuleConditions());\n\t\t\t\tClass propType = origDescriptors[i].getPropertyType();\n\t\t\t\tboolean isString = propType.equals(String.class);\n\t\t\t\tObject value;\n\t\t\t\t// 代码逻辑说明: [TV360X-539]数据权限，配置日期等于条件时后端报转换错误------------\n\t\t\t\tif(isString || Date.class.equals(propType)) {\n\t\t\t\t\tvalue = converRuleValue(dataRule.getRuleValue());\n\t\t\t\t}else {\n\t\t\t\t\tvalue = NumberUtils.parseNumber(dataRule.getRuleValue(),propType);\n\t\t\t\t}\n\t\t\t\tString filedSql = SqlConcatUtil.getSingleSqlByRule(rule, oConvertUtils.camelToUnderline(column), value,isString);\n\t\t\t\tsb.append(sqlAnd+filedSql);\n\t\t\t}\n\t\t}\n\t\tlog.info(\"query auth sql is:\"+sb.toString());\n\t\treturn sb.toString();\n\t}\n\t\n\t/**\n\t  * 根据权限相关配置 组装mp需要的权限\n\t * @param queryWrapper\n\t * @param clazz\n\t * @return\n\t */\n\tpublic static void installAuthMplus(QueryWrapper<?> queryWrapper,Class<?> clazz) {\n\t\t//权限查询\n\t\tMap<String,SysPermissionDataRuleModel> ruleMap = getRuleMap();\n\t\tPropertyDescriptor[] origDescriptors = PropertyUtils.getPropertyDescriptors(clazz);\n\t\tfor (String c : ruleMap.keySet()) {\n\t\t\tif(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){\n\t\t\t\tqueryWrapper.and(i ->i.apply(getSqlRuleValue(ruleMap.get(c).getRuleValue())));\n\t\t\t}\n\t\t}\n\t\tString name, column;\n\t\tfor (int i = 0; i < origDescriptors.length; i++) {\n\t\t\tname = origDescriptors[i].getName();\n\t\t\tif (judgedIsUselessField(name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcolumn = ReflectHelper.getTableFieldName(clazz, name);\n\t\t\tif(column==null){\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif(ruleMap.containsKey(name)) {\n\t\t\t\taddRuleToQueryWrapper(ruleMap.get(name), column, origDescriptors[i].getPropertyType(), queryWrapper);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * 转换sql中的系统变量\n\t * @param sql\n\t * @return\n\t */\n\tpublic static String convertSystemVariables(String sql){\n\t\treturn getSqlRuleValue(sql);\n\t}\n\n\t/**\n\t * 获取系统数据库类型\n\t */\n\tprivate static String getDbType(){\n\t\treturn CommonUtils.getDatabaseType();\n\t}\n\n\t/**\n\t * mysql 模糊查询之特殊字符下划线 （_、\\）\n\t *\n\t * @param value:\n\t * @Return: java.lang.String\n\t */\n\tprivate static String specialStrConvert(String value) {\n\t\tif (DataBaseConstant.DB_TYPE_MYSQL.equals(getDbType()) || DataBaseConstant.DB_TYPE_MARIADB.equals(getDbType())) {\n\t\t\tString[] specialStr = QueryGenerator.LIKE_MYSQL_SPECIAL_STRS.split(\",\");\n\t\t\tfor (String str : specialStr) {\n\t\t\t\tif (value.indexOf(str) !=-1) {\n\t\t\t\t\tvalue = value.replace(str, \"\\\\\" + str);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/query/QueryRuleEnum.java",
    "content": "package org.jeecg.common.system.query;\n\nimport org.jeecg.common.util.oConvertUtils;\n\n/**\n * Query 规则 常量\n * @Author Scott\n * @Date 2019年02月14日\n */\npublic enum QueryRuleEnum {\n\n    /**查询规则 大于*/\n    GT(\">\",\"gt\",\"大于\"),\n    /**查询规则 大于等于*/\n    GE(\">=\",\"ge\",\"大于等于\"),\n    /**查询规则 小于*/\n    LT(\"<\",\"lt\",\"小于\"),\n    /**查询规则 小于等于*/\n    LE(\"<=\",\"le\",\"小于等于\"),\n    /**查询规则 等于*/\n    EQ(\"=\",\"eq\",\"等于\"),\n    /**查询规则 不等于*/\n    NE(\"!=\",\"ne\",\"不等于\"),\n    /**查询规则 包含*/\n    IN(\"IN\",\"in\",\"包含\"),\n    /**查询规则 全模糊*/\n    LIKE(\"LIKE\",\"like\",\"全模糊\"),\n    /**查询规则 不模糊包含*/\n    NOT_LIKE(\"NOT_LIKE\",\"not_like\",\"不模糊包含\"),\n    /**查询规则 左模糊*/\n    LEFT_LIKE(\"LEFT_LIKE\",\"left_like\",\"左模糊\"),\n    /**查询规则 右模糊*/\n    RIGHT_LIKE(\"RIGHT_LIKE\",\"right_like\",\"右模糊\"),\n    /**查询规则 带加号等于*/\n    EQ_WITH_ADD(\"EQWITHADD\",\"eq_with_add\",\"带加号等于\"),\n    /**查询规则 多词模糊匹配(and)*/\n    LIKE_WITH_AND(\"LIKEWITHAND\",\"like_with_and\",\"多词模糊匹配————暂时未用上\"),\n    /**查询规则 多词模糊匹配(or)*/\n    LIKE_WITH_OR(\"LIKEWITHOR\",\"like_with_or\",\"多词模糊匹配(or)\"),\n    /**查询规则 自定义SQL片段*/\n    SQL_RULES(\"USE_SQL_RULES\",\"ext\",\"自定义SQL片段\"),\n\n    /** 查询工作表 */\n    LINKAGE(\"LINKAGE\",\"linkage\",\"查询工作表\"),\n\n    // ------- 当前表单设计器内专用 -------\n    /**查询规则 不以…结尾*/\n    NOT_LEFT_LIKE(\"NOT_LEFT_LIKE\",\"not_left_like\",\"不以…结尾\"),\n    /**查询规则 不以…开头*/\n    NOT_RIGHT_LIKE(\"NOT_RIGHT_LIKE\",\"not_right_like\",\"不以…开头\"),\n    /** 值为空 */\n    EMPTY(\"EMPTY\",\"empty\",\"值为空\"),\n    /** 值不为空 */\n    NOT_EMPTY(\"NOT_EMPTY\",\"not_empty\",\"值不为空\"),\n    /**查询规则 不包含*/\n    NOT_IN(\"NOT_IN\",\"not_in\",\"不包含\"),\n    /**查询规则 多词精确匹配*/\n    ELE_MATCH(\"ELE_MATCH\",\"elemMatch\",\"多词匹配\"),\n    /**查询规则 多词精确不匹配*/\n    ELE_NOT_MATCH(\"ELE_NOT_MATCH\",\"elemNotMatch\",\"多词精确不匹配\"),\n    /**查询规则 范围查询*/\n    RANGE(\"RANGE\",\"range\",\"范围查询\"),\n    /**查询规则 不在范围内查询*/\n    NOT_RANGE(\"NOT_RANGE\",\"not_range\",\"不在范围查询\"),\n    /** 自定义mongodb查询语句 */\n    CUSTOM_MONGODB(\"CUSTOM_MONGODB\",\"custom_mongodb\",\"自定义mongodb查询语句\");\n    // ------- 当前表单设计器内专用 -------\n\n    private String value;\n    \n    private String condition; \n\n    private String msg;\n\n    QueryRuleEnum(String value, String condition, String msg){\n        this.value = value;\n        this.condition = condition;\n        this.msg = msg;\n    }\n\n    public String getValue() {\n        return value;\n    }\n\n    public void setValue(String value) {\n        this.value = value;\n    }\n\n    public String getMsg() {\n        return msg;\n    }\n\n    public void setMsg(String msg) {\n        this.msg = msg;\n    }\n\n    public String getCondition() {\n\t\treturn condition;\n\t}\n\n\tpublic void setCondition(String condition) {\n\t\tthis.condition = condition;\n\t}\n\n\tpublic static QueryRuleEnum getByValue(String value){\n    \tif(oConvertUtils.isEmpty(value)) {\n    \t\treturn null;\n    \t}\n        for(QueryRuleEnum val :values()){\n            if (val.getValue().equals(value) || val.getCondition().equalsIgnoreCase(value)){\n                return val;\n            }\n        }\n        return  null;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JeecgDataAutorUtils.java",
    "content": "package org.jeecg.common.system.util;\n\nimport org.jeecg.common.system.vo.SysPermissionDataRuleModel;\nimport org.jeecg.common.system.vo.SysUserCacheInfo;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.springframework.util.StringUtils;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * @ClassName: JeecgDataAutorUtils\n * @Description: 数据权限查询规则容器工具类\n * @Author: 张代浩\n * @Date: 2012-12-15 下午11:27:39\n * \n */\npublic class JeecgDataAutorUtils {\n\t\n\tpublic static final String MENU_DATA_AUTHOR_RULES = \"MENU_DATA_AUTHOR_RULES\";\n\t\n\tpublic static final String MENU_DATA_AUTHOR_RULE_SQL = \"MENU_DATA_AUTHOR_RULE_SQL\";\n\t\n\tpublic static final String SYS_USER_INFO = \"SYS_USER_INFO\";\n\n\t/**\n\t * 往链接请求里面，传入数据查询条件\n\t * \n\t * @param request\n\t * @param dataRules\n\t */\n\tpublic static synchronized void installDataSearchConditon(HttpServletRequest request, List<SysPermissionDataRuleModel> dataRules) {\n\t\t@SuppressWarnings(\"unchecked\")\n        // 1.先从request获取MENU_DATA_AUTHOR_RULES，如果存则获取到LIST\n\t\tList<SysPermissionDataRuleModel> list = (List<SysPermissionDataRuleModel>)loadDataSearchConditon();\n\t\tif (list==null) {\n\t\t\t// 2.如果不存在，则new一个list\n\t\t\tlist = new ArrayList<SysPermissionDataRuleModel>();\n\t\t}\n\t\tfor (SysPermissionDataRuleModel tsDataRule : dataRules) {\n\t\t\tlist.add(tsDataRule);\n\t\t}\n        // 3.往list里面增量存指\n\t\trequest.setAttribute(MENU_DATA_AUTHOR_RULES, list);\n\t}\n\n\t/**\n\t * 获取请求对应的数据权限规则\n\t * \n\t * @return\n\t */\n\t@SuppressWarnings(\"unchecked\")\n\tpublic static synchronized List<SysPermissionDataRuleModel> loadDataSearchConditon() {\n\t\treturn (List<SysPermissionDataRuleModel>) SpringContextUtils.getHttpServletRequest().getAttribute(MENU_DATA_AUTHOR_RULES);\n\t\t\t\t\n\t}\n\n\t/**\n\t * 获取请求对应的数据权限SQL\n\t * \n\t * @return\n\t */\n\tpublic static synchronized String loadDataSearchConditonSqlString() {\n\t\treturn (String) SpringContextUtils.getHttpServletRequest().getAttribute(MENU_DATA_AUTHOR_RULE_SQL);\n\t}\n\n\t/**\n\t * 往链接请求里面，传入数据查询条件\n\t * \n\t * @param request\n\t * @param sql\n\t */\n\tpublic static synchronized void installDataSearchConditon(HttpServletRequest request, String sql) {\n\t\tString ruleSql = (String) loadDataSearchConditonSqlString();\n\t\tif (!StringUtils.hasText(ruleSql)) {\n\t\t\trequest.setAttribute(MENU_DATA_AUTHOR_RULE_SQL,sql);\n\t\t}\n\t}\n\n\t/**\n\t * 将用户信息存到request\n\t * @param request\n\t * @param userinfo\n\t */\n\tpublic static synchronized void installUserInfo(HttpServletRequest request, SysUserCacheInfo userinfo) {\n\t\trequest.setAttribute(SYS_USER_INFO, userinfo);\n\t}\n\n\t/**\n\t * 将用户信息存到request\n\t * @param userinfo\n\t */\n\tpublic static synchronized void installUserInfo(SysUserCacheInfo userinfo) {\n\t\tSpringContextUtils.getHttpServletRequest().setAttribute(SYS_USER_INFO, userinfo);\n\t}\n\n\t/**\n\t * 从request获取用户信息\n\t * @return\n\t */\n\tpublic static synchronized SysUserCacheInfo loadUserInfo() {\n\t\treturn (SysUserCacheInfo) SpringContextUtils.getHttpServletRequest().getAttribute(SYS_USER_INFO);\n\t\t\t\t\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JwtUtil.java",
    "content": "package org.jeecg.common.system.util;\n\nimport com.auth0.jwt.JWT;\nimport com.auth0.jwt.JWTVerifier;\nimport com.auth0.jwt.algorithms.Algorithm;\nimport com.auth0.jwt.exceptions.JWTDecodeException;\nimport com.auth0.jwt.interfaces.DecodedJWT;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.google.common.base.Joiner;\n\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.util.Date;\nimport java.util.Objects;\nimport java.util.stream.Collectors;\n\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport jakarta.servlet.http.HttpSession;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.DataBaseConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.constant.TenantConstant;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.system.vo.SysUserCacheInfo;\nimport org.jeecg.common.util.DateUtils;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.oConvertUtils;\n\n/**\n * @Author Scott\n * @Date 2018-07-12 14:23\n * @Desc JWT工具类\n **/\n@Slf4j\npublic class JwtUtil {\n\n\t/**PC端，Token有效期为7天（Token在reids中缓存时间为两倍）*/\n\tpublic static final long EXPIRE_TIME = (7 * 12) * 60 * 60 * 1000L;\n\t/**APP端，Token有效期为30天（Token在reids中缓存时间为两倍）*/\n\tpublic static final long APP_EXPIRE_TIME = (30 * 12) * 60 * 60 * 1000L;\n\tstatic final String WELL_NUMBER = SymbolConstant.WELL_NUMBER + SymbolConstant.LEFT_CURLY_BRACKET;\n\n    /**\n     *\n     * @param response\n     * @param code\n     * @param errorMsg\n     */\n\tpublic static void responseError(HttpServletResponse response, Integer code, String errorMsg) {\n\t\ttry {\n\t\t\tResult jsonResult = new Result(code, errorMsg);\n\t\t\tjsonResult.setSuccess(false);\n\t\t\t\n\t\t\t// 设置响应头和内容类型\n\t\t\tresponse.setStatus(code);\n\t\t\tresponse.setHeader(\"Content-type\", \"text/html;charset=UTF-8\");\n\t\t\tresponse.setContentType(\"application/json;charset=UTF-8\");\n\t\t\t// 使用 ObjectMapper 序列化为 JSON 字符串\n\t\t\tObjectMapper objectMapper = new ObjectMapper();\n\t\t\tString json = objectMapper.writeValueAsString(jsonResult);\n\t\t\tresponse.getWriter().write(json);\n\t\t\tresponse.getWriter().flush();\n\t\t} catch (IOException e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t}\n\t}\n\n\t/**\n\t * 校验token是否正确\n\t *\n\t * @param token  密钥\n\t * @param secret 用户的密码\n\t * @return 是否正确\n\t */\n\tpublic static boolean verify(String token, String username, String secret) {\n\t\ttry {\n\t\t\t// 根据密码生成JWT效验器\n\t\t\tAlgorithm algorithm = Algorithm.HMAC256(secret);\n\t\t\tJWTVerifier verifier = JWT.require(algorithm).withClaim(\"username\", username).build();\n\t\t\t// 效验TOKEN\n\t\t\tDecodedJWT jwt = verifier.verify(token);\n\t\t\treturn true;\n\t\t} catch (Exception e) {\n\t\t\tlog.warn(\"Token验证失败：\" + e.getMessage(),e);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * 获得token中的信息无需secret解密也能获得\n\t *\n\t * @return token中包含的用户名\n\t */\n\tpublic static String getUsername(String token) {\n\t\ttry {\n\t\t\tDecodedJWT jwt = JWT.decode(token);\n\t\t\treturn jwt.getClaim(\"username\").asString();\n\t\t} catch (JWTDecodeException e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * 生成签名,5min后过期\n\t *\n\t * @param username 用户名\n\t * @param secret   用户的密码\n\t * @return 加密的token\n\t * @deprecated 请使用sign(String username, String secret, String clientType)方法代替\n\t */\n\t@Deprecated\n\tpublic static String sign(String username, String secret) {\n\t\tDate date = new Date(System.currentTimeMillis() + EXPIRE_TIME);\n\t\tAlgorithm algorithm = Algorithm.HMAC256(secret);\n\t\t// 附带username信息\n\t\treturn JWT.create().withClaim(\"username\", username).withExpiresAt(date).sign(algorithm);\n\n\t}\n\n\n\t/**\n\t * 生成签名,5min后过期\n\t *\n\t * @param username 用户名\n\t * @param secret   用户的密码\n\t * @param expireTime 过期时间\n\t * @return 加密的token\n\t * @deprecated 请使用sign(String username, String secret, String clientType)方法代替\n\t */\n\t@Deprecated\n\tpublic static String sign(String username, String secret, Long expireTime) {\n\t\tDate date = new Date(System.currentTimeMillis() + expireTime);\n\t\tAlgorithm algorithm = Algorithm.HMAC256(secret);\n\t\t// 附带username信息\n\t\treturn JWT.create().withClaim(\"username\", username).withExpiresAt(date).sign(algorithm);\n\n\t}\n\n\t/**\n\t * 生成签名，根据客户端类型自动选择过期时间\n\t * for [JHHB-1030]【鉴权】移动端用户token到期后续期时间变成pc端时长\n\t *\n\t * @param username 用户名\n\t * @param secret   用户的密码\n\t * @param clientType 客户端类型（PC或APP）\n\t * @return 加密的token\n\t */\n\tpublic static String sign(String username, String secret, String clientType) {\n\t\t// 根据客户端类型选择对应的过期时间\n\t\tlong expireTime = CommonConstant.CLIENT_TYPE_APP.equalsIgnoreCase(clientType) \n\t\t\t? APP_EXPIRE_TIME \n\t\t\t: EXPIRE_TIME;\n\t\tDate date = new Date(System.currentTimeMillis() + expireTime);\n\t\tAlgorithm algorithm = Algorithm.HMAC256(secret);\n\t\t// 附带username和clientType信息\n\t\treturn JWT.create()\n\t\t\t.withClaim(\"username\", username)\n\t\t\t.withClaim(\"clientType\", clientType)\n\t\t\t.withExpiresAt(date)\n\t\t\t.sign(algorithm);\n\t}\n\n\t/**\n\t * 从token中获取客户端类型\n\t * for [JHHB-1030]【鉴权】移动端用户token到期后续期时间变成pc端时长\n\t *\n\t * @param token JWT token\n\t * @return 客户端类型，如果不存在则返回PC（兼容旧token）\n\t */\n\tpublic static String getClientType(String token) {\n\t\ttry {\n\t\t\tDecodedJWT jwt = JWT.decode(token);\n\t\t\tString clientType = jwt.getClaim(\"clientType\").asString();\n\t\t\t// 如果clientType为空，返回默认值PC（兼容旧token）\n\t\t\treturn oConvertUtils.isNotEmpty(clientType) ? clientType : CommonConstant.CLIENT_TYPE_PC;\n\t\t} catch (JWTDecodeException e) {\n\t\t\tlog.warn(\"解析token中的clientType失败，使用默认值PC：\" + e.getMessage());\n\t\t\treturn CommonConstant.CLIENT_TYPE_PC;\n\t\t}\n\t}\n\n\t/**\n\t * 根据request中的token获取用户账号\n\t * \n\t * @param request\n\t * @return\n\t * @throws JeecgBootException\n\t */\n\tpublic static String getUserNameByToken(HttpServletRequest request) throws JeecgBootException {\n\t\tString accessToken = request.getHeader(\"X-Access-Token\");\n\t\tString username = getUsername(accessToken);\n\t\tif (oConvertUtils.isEmpty(username)) {\n\t\t\tthrow new JeecgBootException(\"未获取到用户\");\n\t\t}\n\t\treturn username;\n\t}\n\t\n\t/**\n\t  *  从session中获取变量\n\t * @param key\n\t * @return\n\t */\n\tpublic static String getSessionData(String key) {\n\t\t//${myVar}%\n\t\t//得到${} 后面的值\n\t\tString moshi = \"\";\n\t\tString wellNumber = WELL_NUMBER;\n\n\t\tif(key.indexOf(SymbolConstant.RIGHT_CURLY_BRACKET)!=-1){\n\t\t\t moshi = key.substring(key.indexOf(\"}\")+1);\n\t\t}\n\t\tString returnValue = null;\n\t\tif (key.contains(wellNumber)) {\n\t\t\tkey = key.substring(2,key.indexOf(\"}\"));\n\t\t}\n\t\tif (oConvertUtils.isNotEmpty(key)) {\n\t\t\tHttpSession session = SpringContextUtils.getHttpServletRequest().getSession();\n\t\t\treturnValue = (String) session.getAttribute(key);\n\t\t}\n\t\t//结果加上${} 后面的值\n\t\tif(returnValue!=null){returnValue = returnValue + moshi;}\n\t\treturn returnValue;\n\t}\n\t\n\t/**\n\t  * 从当前用户中获取变量\n\t * @param key\n\t * @param user\n\t * @return\n\t */\n\tpublic static String getUserSystemData(String key, SysUserCacheInfo user) {\n\t\t//1.优先获取 SysUserCacheInfo\n\t\tif(user==null) {\n\t\t\ttry {\n\t\t\t\tuser = JeecgDataAutorUtils.loadUserInfo();\n\t\t\t} catch (Exception e) {\n\t\t\t\tlog.warn(\"获取用户信息异常：\" + e.getMessage());\n\t\t\t}\n\t\t}\n\t\t//2.通过shiro获取登录用户信息\n\t\tLoginUser sysUser = null;\n\t\ttry {\n\t\t\tsysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\t} catch (Exception e) {\n\t\t\tlog.warn(\"SecurityUtils.getSubject() 获取用户信息异常：\" + e.getMessage());\n\t\t}\n\n\t\t//#{sys_user_code}%\n\t\tString moshi = \"\";\n        String wellNumber = WELL_NUMBER;\n\t\tif(key.indexOf(SymbolConstant.RIGHT_CURLY_BRACKET)!=-1){\n\t\t\t moshi = key.substring(key.indexOf(\"}\")+1);\n\t\t}\n\t\tString returnValue = null;\n\t\t//针对特殊标示处理#{sysOrgCode}，判断替换\n\t\tif (key.contains(wellNumber)) {\n\t\t\tkey = key.substring(2,key.indexOf(\"}\"));\n\t\t} else {\n\t\t\tkey = key;\n\t\t}\n\t\t// 是否存在字符串标志\n\t\tboolean multiStr;\n\t\tif(oConvertUtils.isNotEmpty(key) && key.trim().matches(\"^\\\\[\\\\w+]$\")){\n\t\t\tkey = key.substring(1,key.length()-1);\n\t\t\tmultiStr = true;\n\t\t} else {\n            multiStr = false;\n        }\n\t\t//替换为当前系统时间(年月日)\n\t\tif (key.equals(DataBaseConstant.SYS_DATE)|| key.toLowerCase().equals(DataBaseConstant.SYS_DATE_TABLE)) {\n\t\t\treturnValue = DateUtils.formatDate();\n\t\t}\n\t\t//替换为当前系统时间（年月日时分秒）\n\t\telse if (key.equals(DataBaseConstant.SYS_TIME)|| key.toLowerCase().equals(DataBaseConstant.SYS_TIME_TABLE)) {\n\t\t\treturnValue = DateUtils.now();\n\t\t}\n\t\t//流程状态默认值（默认未发起）\n\t\telse if (key.equals(DataBaseConstant.BPM_STATUS)|| key.toLowerCase().equals(DataBaseConstant.BPM_STATUS_TABLE)) {\n\t\t\treturnValue = \"1\";\n\t\t}\n\n\t\t//后台任务获取用户信息异常，导致程序中断\n\t\tif(sysUser==null && user==null){\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\t//替换为系统登录用户帐号\n\t\tif (key.equals(DataBaseConstant.SYS_USER_CODE)|| key.toLowerCase().equals(DataBaseConstant.SYS_USER_CODE_TABLE)) {\n\t\t\tif(user==null) {\n\t\t\t\treturnValue = sysUser.getUsername();\n\t\t\t}else {\n\t\t\t\treturnValue = user.getSysUserCode();\n\t\t\t}\n\t\t}\n\n\t\t// 替换为系统登录用户ID\n\t\telse if (key.equals(DataBaseConstant.SYS_USER_ID) || key.equalsIgnoreCase(DataBaseConstant.SYS_USER_ID_TABLE)) {\n\t\t\tif(user==null) {\n\t\t\t\treturnValue = sysUser.getId();\n\t\t\t}else {\n\t\t\t\treturnValue = user.getSysUserId();\n\t\t\t}\n\t\t}\n\n\t\t//替换为系统登录用户真实名字\n\t\telse if (key.equals(DataBaseConstant.SYS_USER_NAME)|| key.toLowerCase().equals(DataBaseConstant.SYS_USER_NAME_TABLE)) {\n\t\t\tif(user==null) {\n\t\t\t\treturnValue = sysUser.getRealname();\n\t\t\t}else {\n\t\t\t\treturnValue = user.getSysUserName();\n\t\t\t}\n\t\t}\n\t\t\n\t\t//替换为系统用户登录所使用的机构编码\n\t\telse if (key.equals(DataBaseConstant.SYS_ORG_CODE)|| key.toLowerCase().equals(DataBaseConstant.SYS_ORG_CODE_TABLE)) {\n\t\t\tif(user==null) {\n\t\t\t\treturnValue = sysUser.getOrgCode();\n\t\t\t}else {\n\t\t\t\treturnValue = user.getSysOrgCode();\n\t\t\t}\n\t\t}\n\n\t\t// 替换为系统用户登录所使用的机构ID\n\t\telse if (key.equals(DataBaseConstant.SYS_ORG_ID) || key.equalsIgnoreCase(DataBaseConstant.SYS_ORG_ID_TABLE)) {\n\t\t\tif (user == null) {\n\t\t\t\treturnValue = sysUser.getOrgId();\n\t\t\t} else {\n\t\t\t\treturnValue = user.getSysOrgId();\n\t\t\t}\n\t\t}\n\n\t\t//替换为系统用户所拥有的所有机构编码\n\t\telse if (key.equals(DataBaseConstant.SYS_MULTI_ORG_CODE)|| key.toLowerCase().equals(DataBaseConstant.SYS_MULTI_ORG_CODE_TABLE)) {\n\t\t\tif(user==null){\n\t\t\t\t//TODO 暂时使用用户登录部门，存在逻辑缺陷，不是用户所拥有的部门\n\t\t\t\treturnValue = sysUser.getOrgCode();\n\t\t\t\t// 代码逻辑说明: [QQYUN-10785]数据权限，查看自己拥有部门的权限中存在问题 #7288------------\n\t\t\t\treturnValue = multiStr ? \"'\" + returnValue + \"'\" : returnValue;\n\t\t\t}else{\n\t\t\t\tif(user.isOneDepart()) {\n\t\t\t\t\treturnValue = user.getSysMultiOrgCode().get(0);\n\t\t\t\t\t// 代码逻辑说明: [QQYUN-10785]数据权限，查看自己拥有部门的权限中存在问题 #7288------------\n\t\t\t\t\treturnValue = multiStr ? \"'\" + returnValue + \"'\" : returnValue;\n\t\t\t\t}else {\n\t\t\t\t\t// 代码逻辑说明: [QQYUN-10785]数据权限，查看自己拥有部门的权限中存在问题 #7288------------\n\t\t\t\t\treturnValue = user.getSysMultiOrgCode().stream()\n\t\t\t\t\t\t\t.filter(Objects::nonNull)\n\t\t\t\t\t\t\t.map(orgCode -> {\n\t\t\t\t\t\t\t\tif (multiStr) {\n\t\t\t\t\t\t\t\t\treturn \"'\" + orgCode + \"'\";\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\treturn orgCode;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.collect(Collectors.joining(\", \"));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// 替换为当前登录用户的角色code（多个逗号分割）\n\t\telse if (key.equals(DataBaseConstant.SYS_ROLE_CODE) || key.equalsIgnoreCase(DataBaseConstant.SYS_ROLE_CODE_TABLE)) {\n\t\t\tif (user == null) {\n\t\t\t\treturnValue = sysUser.getRoleCode();\n\t\t\t} else {\n\t\t\t\treturnValue = user.getSysRoleCode();\n\t\t\t}\n\t\t}\n\n\t\t// 代码逻辑说明: 多租户ID作为系统变量\n\t\telse if (key.equals(TenantConstant.TENANT_ID) || key.toLowerCase().equals(TenantConstant.TENANT_ID_TABLE)){\n\t\t\ttry {\n\t\t\t\treturnValue = SpringContextUtils.getHttpServletRequest().getHeader(CommonConstant.TENANT_ID);\n\t\t\t} catch (Exception e) {\n\t\t\t\tlog.warn(\"获取系统租户异常：\" + e.getMessage());\n\t\t\t}\n\t\t}\n\t\tif(returnValue!=null){returnValue = returnValue + moshi;}\n\t\treturn returnValue;\n\t}\n\t\n//\tpublic static void main(String[] args) {\n//\t\t String token = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NjUzMzY1MTMsInVzZXJuYW1lIjoiYWRtaW4ifQ.xjhud_tWCNYBOg_aRlMgOdlZoWFFKB_givNElHNw3X0\";\n//\t\t System.out.println(JwtUtil.getUsername(token));\n//\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/ResourceUtil.java",
    "content": "package org.jeecg.common.system.util;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.system.annotation.EnumDict;\nimport org.jeecg.common.system.vo.DictModel;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.springframework.core.io.Resource;\nimport org.springframework.core.io.support.PathMatchingResourcePatternResolver;\nimport org.springframework.core.io.support.ResourcePatternResolver;\nimport org.springframework.core.type.classreading.CachingMetadataReaderFactory;\nimport org.springframework.core.type.classreading.MetadataReader;\nimport org.springframework.core.type.classreading.MetadataReaderFactory;\nimport org.springframework.util.ClassUtils;\n\nimport java.lang.reflect.Method;\nimport java.util.*;\n\n/**\n * 枚举字典数据 资源加载工具类\n *\n * @Author taoYan\n * @Date 2022/7/8 10:40\n **/\n@Slf4j\npublic class ResourceUtil {\n\n    /**\n     * 多个包扫描根路径\n     *\n     * 之所以让用户手工配置扫描路径，是为了避免不必要的类加载开销，提升启动性能。\n     * 请务必将所有枚举类所在包路径添加到此配置中。\n     */\n    private final static String[] BASE_SCAN_PACKAGES = {\n            \"org.jeecg.common.constant.enums\",\n            \"org.jeecg.modules.message.enums\"\n    };\n    \n    /**\n     * 枚举字典数据\n     */\n    private final static Map<String, List<DictModel>> enumDictData = new HashMap<>(5);\n    /**\n     * 所有枚举java类\n     */\n\n    private final static String CLASS_ENUM_PATTERN=\"/**/*Enum.class\";\n\n    /**\n     * 初始化状态标识\n     */\n    private static volatile boolean initialized = false;\n\n    /**\n     * 枚举类中获取字典数据的方法名\n     */\n    private final static String METHOD_NAME = \"getDictList\";\n\n    /**\n     * 获取枚举字典数据\n     * 获取枚举类对应的字典数据 SysDictServiceImpl#queryAllDictItems()\n     *\n     * @return 枚举字典数据\n     */\n    public static Map<String, List<DictModel>> getEnumDictData() {\n        if (!initialized) {\n            synchronized (ResourceUtil.class) {\n                if (!initialized) {\n                    long startTime = System.currentTimeMillis();\n                    log.debug(\"【枚举字典加载】开始初始化枚举字典数据...\");\n\n                    initEnumDictData();\n                    initialized = true;\n\n                    long endTime = System.currentTimeMillis();\n                    log.debug(\"【枚举字典加载】枚举字典数据初始化完成，共加载 {} 个字典，总耗时: {}ms\", enumDictData.size(), endTime - startTime);\n                }\n            }\n        }\n        return enumDictData;\n    }\n\n    /**\n     * 使用多包路径扫描方式初始化枚举字典数据\n     */\n    private static void initEnumDictData() {\n        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();\n\n        long scanStartTime = System.currentTimeMillis();\n        List<Resource> allResources = new ArrayList<>();\n\n        // 扫描多个包路径\n        for (String basePackage : BASE_SCAN_PACKAGES) {\n            String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(basePackage) + CLASS_ENUM_PATTERN;\n\n            try {\n                Resource[] resources = resourcePatternResolver.getResources(pattern);\n                allResources.addAll(Arrays.asList(resources));\n                log.debug(\"【枚举字典加载】扫描包 {} 找到 {} 个枚举类文件\", basePackage, resources.length);\n            } catch (Exception e) {\n                log.warn(\"【枚举字典加载】扫描包 {} 时出现异常: {}\", basePackage, e.getMessage());\n            }\n        }\n\n        long scanEndTime = System.currentTimeMillis();\n        log.debug(\"【枚举字典加载】文件扫描完成，总共找到 {} 个枚举类文件，扫描耗时: {}ms\", allResources.size(), scanEndTime - scanStartTime);\n\n        MetadataReaderFactory readerFactory = new CachingMetadataReaderFactory(resourcePatternResolver);\n\n        long processStartTime = System.currentTimeMillis();\n        int processedCount = 0;\n\n        for (Resource resource : allResources) {\n            try {\n                MetadataReader reader = readerFactory.getMetadataReader(resource);\n                String classname = reader.getClassMetadata().getClassName();\n\n                // 提前检查是否有@EnumDict注解，避免不必要的Class.forName\n                if (hasEnumDictAnnotation(reader)) {\n                    processEnumClass(classname);\n                    processedCount++;\n                }\n            } catch (Exception e) {\n                log.debug(\"处理资源异常: {} - {}\", resource.getFilename(), e.getMessage());\n            }\n        }\n\n        long processEndTime = System.currentTimeMillis();\n        log.debug(\"【枚举字典加载】处理完成，实际处理 {} 个带注解的枚举类，处理耗时: {}ms\", processedCount, processEndTime - processStartTime);\n    }\n\n    /**\n     * 检查类是否有EnumDict注解（通过元数据，避免类加载）\n     */\n    private static boolean hasEnumDictAnnotation(MetadataReader reader) {\n        try {\n            return reader.getAnnotationMetadata().hasAnnotation(EnumDict.class.getName());\n        } catch (Exception e) {\n            return false;\n        }\n    }\n\n    /**\n     * 处理单个枚举类\n     */\n    private static void processEnumClass(String classname) {\n        try {\n            Class<?> clazz = Class.forName(classname);\n            EnumDict enumDict = clazz.getAnnotation(EnumDict.class);\n\n            if (enumDict != null) {\n                String key = enumDict.value();\n                if (oConvertUtils.isNotEmpty(key)) {\n                    Method method = clazz.getDeclaredMethod(METHOD_NAME);\n                    List<DictModel> list = (List<DictModel>) method.invoke(null);\n                    enumDictData.put(key, list);\n                    log.debug(\"成功加载枚举字典: {} -> {}\", key, classname);\n                }\n            }\n        } catch (Exception e) {\n            log.debug(\"处理枚举类异常: {} - {}\", classname, e.getMessage());\n        }\n    }\n\n    /**\n     * 用于后端字典翻译 SysDictServiceImpl#queryManyDictByKeys(java.util.List, java.util.List)\n     *\n     * @param dictCodeList 字典编码列表\n     * @param keys         键值列表\n     * @return 字典数据映射\n     */\n    public static Map<String, List<DictModel>> queryManyDictByKeys(List<String> dictCodeList, List<String> keys) {\n        Map<String, List<DictModel>> enumDict = getEnumDictData();\n        Map<String, List<DictModel>> map = new HashMap<>();\n\n        // 使用更高效的查找方式\n        Set<String> dictCodeSet = new HashSet<>(dictCodeList);\n        Set<String> keySet = new HashSet<>(keys);\n\n        for (String code : enumDict.keySet()) {\n            if (dictCodeSet.contains(code)) {\n                List<DictModel> dictItemList = enumDict.get(code);\n                for (DictModel dm : dictItemList) {\n                    String value = dm.getValue();\n                    if (keySet.contains(value)) {\n                        // 修复bug：获取或创建该dictCode对应的list，而不是每次都创建新的list\n                        List<DictModel> list = map.computeIfAbsent(code, k -> new ArrayList<>());\n                        list.add(new DictModel(value, dm.getText()));\n                        //break;\n                    }\n                }\n            }\n        }\n        return map;\n    }\n    \n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/SqlConcatUtil.java",
    "content": "package org.jeecg.common.system.util;\n\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.metadata.OrderItem;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.DataBaseConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.query.QueryRuleEnum;\nimport org.jeecg.common.util.CommonUtils;\nimport org.jeecg.common.util.oConvertUtils;\n\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLDecoder;\nimport java.util.ArrayList;\nimport java.util.Iterator;\nimport java.util.List;\n\n/**\n * @Description: 查询过滤器，SQL拼接写法拆成独立工具类\n * @author:qinfeng\n * @date 20230904\n */\n@Slf4j\npublic class SqlConcatUtil {\n\n    /**\n     * 获取单个查询条件的值\n     * @param rule\n     * @param field\n     * @param value\n     * @param isString\n     * @return\n     */\n    public static String getSingleSqlByRule(QueryRuleEnum rule,String field,Object value,boolean isString) {\n        return getSingleSqlByRule(rule, field, value, isString, null);\n    }\n    \n    /**\n     * 报表获取查询条件 支持多数据源\n     * @param field\n     * @param alias\n     * @param value\n     * @param isString\n     * @param dataBaseType\n     * @return\n     */\n    public static String getSingleQueryConditionSql(String field,String alias,Object value,boolean isString, String dataBaseType) {\n        if (value == null) {\n            return \"\";\n        }\n        field =  alias+oConvertUtils.camelToUnderline(field);\n        QueryRuleEnum rule = QueryGenerator.convert2Rule(value);\n        return getSingleSqlByRule(rule, field, value, isString, dataBaseType);\n    }\n\n    /**\n     * 获取单个查询条件的值\n     * @param rule\n     * @param field\n     * @param value\n     * @param isString\n     * @param dataBaseType\n     * @return\n     */\n    private static String getSingleSqlByRule(QueryRuleEnum rule,String field,Object value,boolean isString, String dataBaseType) {\n        String res = \"\";\n        switch (rule) {\n            case GT:\n                res =field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType);\n                break;\n            case GE:\n                res = field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType);\n                break;\n            case LT:\n                res = field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType);\n                break;\n            case LE:\n                res = field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType);\n                break;\n            case EQ:\n                res = field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType);\n                break;\n            case EQ_WITH_ADD:\n                res = field+\" = \"+getFieldConditionValue(value, isString, dataBaseType);\n                break;\n            case NE:\n                res = field+\" <> \"+getFieldConditionValue(value, isString, dataBaseType);\n                break;\n            case IN:\n                res = field + \" in \"+getInConditionValue(value, isString);\n                break;\n            case LIKE:\n                res = field + \" like \"+getLikeConditionValue(value, QueryRuleEnum.LIKE);\n                break;\n            case LEFT_LIKE:\n                res = field + \" like \"+getLikeConditionValue(value, QueryRuleEnum.LEFT_LIKE);\n                break;\n            case RIGHT_LIKE:\n                res = field + \" like \"+getLikeConditionValue(value, QueryRuleEnum.RIGHT_LIKE);\n                break;\n            default:\n                res = field+\" = \"+getFieldConditionValue(value, isString, dataBaseType);\n                break;\n        }\n        return res;\n    }\n\n    /**\n     * 获取查询条件的值\n     * @param value\n     * @param isString\n     * @param dataBaseType\n     * @return\n     */\n    private static String getFieldConditionValue(Object value,boolean isString, String dataBaseType) {\n        String str = value.toString().trim();\n        if(str.startsWith(SymbolConstant.EXCLAMATORY_MARK)) {\n            str = str.substring(1);\n        }else if(str.startsWith(QueryRuleEnum.GE.getValue())) {\n            str = str.substring(2);\n        }else if(str.startsWith(QueryRuleEnum.LE.getValue())) {\n            str = str.substring(2);\n        }else if(str.startsWith(QueryRuleEnum.GT.getValue())) {\n            str = str.substring(1);\n        }else if(str.startsWith(QueryRuleEnum.LT.getValue())) {\n            str = str.substring(1);\n        }else if(str.indexOf(QueryGenerator.QUERY_COMMA_ESCAPE)>0) {\n            str = str.replaceAll(\"\\\\+\\\\+\", SymbolConstant.COMMA);\n        }\n        if(dataBaseType==null){\n            dataBaseType = getDbType();\n        }\n        if(isString) {\n            if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(dataBaseType)){\n                return \" N'\"+str+\"' \";\n            }else{\n                return \" '\"+str+\"' \";\n            }\n        }else {\n            // 如果不是字符串 有一种特殊情况 popup调用都走这个逻辑 参数传递的可能是“‘admin’”这种格式的\n            if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(dataBaseType) && str.endsWith(SymbolConstant.SINGLE_QUOTATION_MARK) && str.startsWith(SymbolConstant.SINGLE_QUOTATION_MARK)){\n                return \" N\"+str;\n            }\n            return value.toString();\n        }\n    }\n\n    private static String getInConditionValue(Object value,boolean isString) {\n        // 代码逻辑说明: 查询条件如果输入,导致sql报错\n        String[] temp = value.toString().split(\",\");\n        if(temp.length==0){\n            return \"('')\";\n        }\n        if(isString) {\n            List<String> res = new ArrayList<>();\n            for (String string : temp) {\n                if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){\n                    res.add(\"N'\"+string+\"'\");\n                }else{\n                    res.add(\"'\"+string+\"'\");\n                }\n            }\n            return \"(\"+String.join(\",\" ,res)+\")\";\n        }else {\n            return \"(\"+value.toString()+\")\";\n        }\n    }\n\n    /**\n     * 先根据值判断 走左模糊还是右模糊\n     * 最后如果值不带任何标识(*或者%)，则再根据ruleEnum判断\n     * @param value\n     * @param ruleEnum\n     * @return\n     */\n    private static String getLikeConditionValue(Object value, QueryRuleEnum ruleEnum) {\n        String str = value.toString().trim();\n        if(str.startsWith(SymbolConstant.ASTERISK) && str.endsWith(SymbolConstant.ASTERISK)) {\n            if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){\n                return \"N'%\"+str.substring(1,str.length()-1)+\"%'\";\n            }else{\n                return \"'%\"+str.substring(1,str.length()-1)+\"%'\";\n            }\n        }else if(str.startsWith(SymbolConstant.ASTERISK)) {\n            if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){\n                return \"N'%\"+str.substring(1)+\"'\";\n            }else{\n                return \"'%\"+str.substring(1)+\"'\";\n            }\n        }else if(str.endsWith(SymbolConstant.ASTERISK)) {\n            if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){\n                return \"N'\"+str.substring(0,str.length()-1)+\"%'\";\n            }else{\n                return \"'\"+str.substring(0,str.length()-1)+\"%'\";\n            }\n        }else {\n            if(str.indexOf(SymbolConstant.PERCENT_SIGN)>=0) {\n                if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){\n                    if(str.startsWith(SymbolConstant.SINGLE_QUOTATION_MARK) && str.endsWith(SymbolConstant.SINGLE_QUOTATION_MARK)){\n                        return \"N\"+str;\n                    }else{\n                        return \"N\"+\"'\"+str+\"'\";\n                    }\n                }else{\n                    if(str.startsWith(SymbolConstant.SINGLE_QUOTATION_MARK) && str.endsWith(SymbolConstant.SINGLE_QUOTATION_MARK)){\n                        return str;\n                    }else{\n                        return \"'\"+str+\"'\";\n                    }\n                }\n            }else {\n\n                // 走到这里说明 value不带有任何模糊查询的标识(*或者%)\n                if (ruleEnum == QueryRuleEnum.LEFT_LIKE) {\n                    if (DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())) {\n                        return \"N'%\" + str + \"'\";\n                    } else {\n                        return \"'%\" + str + \"'\";\n                    }\n                } else if (ruleEnum == QueryRuleEnum.RIGHT_LIKE) {\n                    if (DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())) {\n                        return \"N'\" + str + \"%'\";\n                    } else {\n                        return \"'\" + str + \"%'\";\n                    }\n                } else {\n                    if (DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())) {\n                        return \"N'%\" + str + \"%'\";\n                    } else {\n                        return \"'%\" + str + \"%'\";\n                    }\n                }\n\n            }\n        }\n    }\n\n    /**\n     * 获取系统数据库类型\n     */\n    private static String getDbType() {\n        return CommonUtils.getDatabaseType();\n    }\n\n    /**\n     * 获取前端传过来的 \"多字段排序信息: sortInfoString\"\n     * @return\n     */\n    public static List<OrderItem> getQueryConditionOrders(String column, String order, String queryInfoString){\n        List<OrderItem> list = new ArrayList<>();\n        if(oConvertUtils.isEmpty(queryInfoString)){\n            //默认以创建时间倒序查询\n            if(CommonConstant.ORDER_TYPE_DESC.equalsIgnoreCase(order)){\n                list.add(OrderItem.desc(column));\n            }else{\n                list.add(OrderItem.asc(column));\n            }\n        }else{\n            // 【TV360X-967】URL解码（微服务下需要）\n            if (queryInfoString.contains(\"%22column%22\")) {\n                log.info(\"queryInfoString 原生 = {}\", queryInfoString);\n                try {\n                    queryInfoString = URLDecoder.decode(queryInfoString, \"UTF-8\");\n                } catch (UnsupportedEncodingException e) {\n                    throw new JeecgBootException(e);\n                }\n                log.info(\"queryInfoString 解码 = {}\", queryInfoString);\n            }\n            JSONArray array = JSONArray.parseArray(queryInfoString);\n            Iterator it = array.iterator();\n            while(it.hasNext()){\n                JSONObject json = (JSONObject)it.next();\n                String tempColumn = json.getString(\"column\");\n                if(oConvertUtils.isNotEmpty(tempColumn)){\n                    String tempOrder = json.getString(\"order\");\n                    if(CommonConstant.ORDER_TYPE_DESC.equalsIgnoreCase(tempOrder)){\n                        list.add(OrderItem.desc(tempColumn));\n                    }else{\n                        list.add(OrderItem.asc(tempColumn));\n                    }\n                }\n            }\n        }\n        return list;\n    }\n    \n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/ComboModel.java",
    "content": "package org.jeecg.common.system.vo;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\nimport java.io.Serializable;\n\n/**\n * @Description: 文档管理\n * @author: jeecg-boot\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class ComboModel implements Serializable {\n    private String id;\n    private String title;\n    /**文档管理 表单table默认选中*/\n    private boolean checked;\n    /**文档管理 表单table 用户账号*/\n    private String username;\n    /**文档管理 表单table 用户邮箱*/\n    private String email;\n    /**文档管理 表单table 角色编码*/\n    private String roleCode;\n\n    public ComboModel(){\n\n    };\n\n    public ComboModel(String id,String title,boolean checked,String username){\n        this.id = id;\n        this.title = title;\n        this.checked = false;\n        this.username = username;\n    };\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DictModel.java",
    "content": "package org.jeecg.common.system.vo;\n\nimport java.io.Serializable;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\n\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\n/**\n * @Description: 字典类\n * @author: jeecg-boot\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class DictModel implements Serializable{\n\tprivate static final long serialVersionUID = 1L;\n\n\tpublic DictModel() {\n\t}\n\t\n\tpublic DictModel(String value, String text) {\n\t\tthis.value = value;\n\t\tthis.text = text;\n\t}\n\n\tpublic DictModel(String value, String text, String color) {\n\t\tthis.value = value;\n\t\tthis.text = text;\n\t\tthis.color = color;\n\t}\n\n\t/**\n\t * 字典value\n\t */\n\tprivate String value;\n\t/**\n\t * 字典文本\n\t */\n\tprivate String text;\n\t/**\n\t * 字典颜色\n\t */\n\tprivate String color;\n\n\t/**\n\t * 特殊用途： JgEditableTable\n\t * @return\n\t */\n\tpublic String getTitle() {\n\t\treturn this.text;\n\t}\n\t/**\n\t * 特殊用途： vue3 Select组件\n\t */\n\tpublic String getLabel() {\n\t\treturn this.text;\n\t}\n\n\n\t/**\n\t * 用于表单设计器 关联记录表数据存储\n\t * QQYUN-5595【表单设计器】他表字段 导入没有翻译\n\t */\n\tprivate JSONObject jsonObject;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DictModelMany.java",
    "content": "package org.jeecg.common.system.vo;\n\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\n\n/**\n * 查询多个字典时用到\n * @author: jeecg-boot\n */\n@Data\n@EqualsAndHashCode(callSuper = true)\npublic class DictModelMany extends DictModel {\n\n    /**\n     * 字典code，根据多个字段code查询时才用到，用于区分不同的字典选项\n     */\n    private String dictCode;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DictQuery.java",
    "content": "package org.jeecg.common.system.vo;\n\nimport lombok.Data;\n\n/**\n * 字典查询参数实体\n * @author: jeecg-boot\n */\n@Data\npublic class DictQuery {\n    /**\n     * 表名\n     */\n    private String table;\n    /**\n     * 存储列\n     */\n    private String code;\n\n    /**\n     * 显示列\n     */\n    private String text;\n\n    /**\n     * 关键字查询\n     */\n    private String keyword;\n\n    /**\n     * 存储列的值 用于回显查询\n     */\n    private String codeValue;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/DynamicDataSourceModel.java",
    "content": "package org.jeecg.common.system.vo;\n\nimport lombok.Data;\nimport org.springframework.beans.BeanUtils;\n\n/**\n * @Description: 数据源\n * @author: jeecg-boot\n */\n@Data\npublic class DynamicDataSourceModel {\n\n    public DynamicDataSourceModel() {\n\n    }\n\n    public DynamicDataSourceModel(Object dbSource) {\n        if (dbSource != null) {\n            BeanUtils.copyProperties(dbSource, this);\n        }\n    }\n\n    /**\n     * id\n     */\n    private java.lang.String id;\n    /**\n     * 数据源编码\n     */\n    private java.lang.String code;\n    /**\n     * 数据库类型\n     */\n    private java.lang.String dbType;\n    /**\n     * 驱动类\n     */\n    private java.lang.String dbDriver;\n    /**\n     * 数据源地址\n     */\n    private java.lang.String dbUrl;\n\n//    /**\n//     * 数据库名称\n//     */\n//    private java.lang.String dbName;\n\n    /**\n     * 用户名\n     */\n    private java.lang.String dbUsername;\n    /**\n     * 密码\n     */\n    private java.lang.String dbPassword;\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java",
    "content": "package org.jeecg.common.system.vo;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecg.common.desensitization.annotation.SensitiveField;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.util.Date;\n\n/**\n * <p>\n * 在线用户信息\n * </p>\n *\n * @Author scott\n * @since 2018-12-20\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class LoginUser {\n\n\t/**\n\t * 登录人id\n\t */\n\t@SensitiveField\n\tprivate String id;\n\n\t/**\n\t * 登录人账号\n\t */\n\t@SensitiveField\n\tprivate String username;\n\n\t/**\n\t * 登录人名字\n\t */\n\t@SensitiveField\n\tprivate String realname;\n\n\t/**\n\t * 登录人密码\n\t */\n\t@SensitiveField\n\tprivate String password;\n\n     /**\n      * 当前登录部门code\n      */\n\t@SensitiveField\n    private String orgCode;\n\t/**\n\t * 当前登录部门id\n\t */\n\t@SensitiveField\n\tprivate String orgId;\n\t/**\n\t * 当前登录角色code（多个逗号分割）\n\t */\n\t@SensitiveField\n\tprivate String roleCode;\n\n\t/**\n\t * 头像\n\t */\n\t@SensitiveField\n\tprivate String avatar;\n\n\t/**\n\t * 工号\n\t */\n\t@SensitiveField\n\tprivate String workNo;\n\n\t/**\n\t * 生日\n\t */\n\t@JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd\")\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd\")\n\tprivate Date birthday;\n\n\t/**\n\t * 性别（1：男 2：女）\n\t */\n\tprivate Integer sex;\n\n\t/**\n\t * 电子邮件\n\t */\n\t@SensitiveField\n\tprivate String email;\n\n\t/**\n\t * 电话\n\t */\n\t@SensitiveField\n\tprivate String phone;\n\n\t/**\n\t * 状态(1：正常 2：冻结 ）\n\t */\n\tprivate Integer status;\n\t\n\tprivate Integer delFlag;\n\t/**\n     * 同步工作流引擎1同步0不同步\n     */\n    private Integer activitiSync;\n\n\t/**\n\t * 创建时间\n\t */\n\tprivate Date createTime;\n\n\t/**\n\t *  身份（1 普通员工 2 上级）\n\t */\n\tprivate Integer userIdentity;\n\n\t/**\n\t * 管理部门ids\n\t */\n\t@SensitiveField\n\tprivate String departIds;\n\n\t/**\n\t * 职务，关联职务表\n\t */\n\t@SensitiveField\n\tprivate String post;\n\n\t/**\n\t * 座机号\n\t */\n\t@SensitiveField\n\tprivate String telephone;\n\n\t/** 多租户ids临时用，不持久化数据库(数据库字段不存在) */\n\t@SensitiveField\n\tprivate String relTenantIds;\n\n\t/**设备id uniapp推送用*/\n\tprivate String clientId;\n\n\t/**\n\t * 主岗位\n\t */\n\tprivate String mainDepPostId;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/SelectTreeModel.java",
    "content": "package org.jeecg.common.system.vo;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * 下拉树 model\n *\n * @author jeecg-boot\n */\n@Data\npublic class SelectTreeModel implements Serializable {\n\n    private String key;\n    private String title;\n    private String value;\n    /**\n     * 父Id\n     */\n    private String parentId;\n    /**\n     * 是否是叶节点\n     */\n    private boolean isLeaf;\n    /**\n     * 子节点\n     */\n    private List<SelectTreeModel> children;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/SysCategoryModel.java",
    "content": "package org.jeecg.common.system.vo;\n\nimport org.jeecgframework.poi.excel.annotation.Excel;\n\n/**\n * @Author qinfeng\n * @Date 2020/2/19 12:01\n * @Description:\n * @Version 1.0\n */\npublic class SysCategoryModel {\n    /**主键*/\n    private java.lang.String id;\n    /**父级节点*/\n    private java.lang.String pid;\n    /**类型名称*/\n    private java.lang.String name;\n    /**类型编码*/\n    private java.lang.String code;\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public String getPid() {\n        return pid;\n    }\n\n    public void setPid(String pid) {\n        this.pid = pid;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getCode() {\n        return code;\n    }\n\n    public void setCode(String code) {\n        this.code = code;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/SysDepartModel.java",
    "content": "package org.jeecg.common.system.vo;\n\n/**\n * 部门机构model\n * @author: lvdandan\n */\npublic class SysDepartModel {\n    /**ID*/\n    private String id;\n    /**父机构ID*/\n    private String parentId;\n    /**机构/部门名称*/\n    private String departName;\n    /**英文名*/\n    private String departNameEn;\n    /**缩写*/\n    private String departNameAbbr;\n    /**排序*/\n    private Integer departOrder;\n    /**描述*/\n    private String description;\n    /**机构类别 1组织机构，2岗位*/\n    private String orgCategory;\n    /**机构类型*/\n    private String orgType;\n    /**机构编码*/\n    private String orgCode;\n    /**手机号*/\n    private String mobile;\n    /**传真*/\n    private String fax;\n    /**地址*/\n    private String address;\n    /**备注*/\n    private String memo;\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public String getParentId() {\n        return parentId;\n    }\n\n    public void setParentId(String parentId) {\n        this.parentId = parentId;\n    }\n\n    public String getDepartName() {\n        return departName;\n    }\n\n    public void setDepartName(String departName) {\n        this.departName = departName;\n    }\n\n    public String getDepartNameEn() {\n        return departNameEn;\n    }\n\n    public void setDepartNameEn(String departNameEn) {\n        this.departNameEn = departNameEn;\n    }\n\n    public String getDepartNameAbbr() {\n        return departNameAbbr;\n    }\n\n    public void setDepartNameAbbr(String departNameAbbr) {\n        this.departNameAbbr = departNameAbbr;\n    }\n\n    public Integer getDepartOrder() {\n        return departOrder;\n    }\n\n    public void setDepartOrder(Integer departOrder) {\n        this.departOrder = departOrder;\n    }\n\n    public String getDescription() {\n        return description;\n    }\n\n    public void setDescription(String description) {\n        this.description = description;\n    }\n\n    public String getOrgCategory() {\n        return orgCategory;\n    }\n\n    public void setOrgCategory(String orgCategory) {\n        this.orgCategory = orgCategory;\n    }\n\n    public String getOrgType() {\n        return orgType;\n    }\n\n    public void setOrgType(String orgType) {\n        this.orgType = orgType;\n    }\n\n    public String getOrgCode() {\n        return orgCode;\n    }\n\n    public void setOrgCode(String orgCode) {\n        this.orgCode = orgCode;\n    }\n\n    public String getMobile() {\n        return mobile;\n    }\n\n    public void setMobile(String mobile) {\n        this.mobile = mobile;\n    }\n\n    public String getFax() {\n        return fax;\n    }\n\n    public void setFax(String fax) {\n        this.fax = fax;\n    }\n\n    public String getAddress() {\n        return address;\n    }\n\n    public void setAddress(String address) {\n        this.address = address;\n    }\n\n    public String getMemo() {\n        return memo;\n    }\n\n    public void setMemo(String memo) {\n        this.memo = memo;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/SysFilesModel.java",
    "content": "package org.jeecg.common.system.vo;\n\n\n/**\n * @Description: 系统文件实体类\n * @author: wangshuai\n * @date: 2022年08月11日 9:48\n */\npublic class SysFilesModel {\n    /**主键id*/\n    private String id;\n    /**文件名称*/\n    private String fileName;\n    /**文件地址*/\n    private String url;\n    /**文档类型（folder:文件夹 excel:excel doc:word pp:ppt image:图片  archive:其他文档 video:视频）*/\n    private String fileType;\n    /**文件上传类型(temp/本地上传(临时文件) manage/知识库)*/\n    private String storeType;\n    /**文件大小（kb）*/\n    private Double fileSize;\n    /**租户id*/\n    private String tenantId;\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public String getFileName() {\n        return fileName;\n    }\n\n    public void setFileName(String fileName) {\n        this.fileName = fileName;\n    }\n\n    public String getUrl() {\n        return url;\n    }\n\n    public void setUrl(String url) {\n        this.url = url;\n    }\n\n    public String getFileType() {\n        return fileType;\n    }\n\n    public void setFileType(String fileType) {\n        this.fileType = fileType;\n    }\n\n    public String getStoreType() {\n        return storeType;\n    }\n\n    public void setStoreType(String storeType) {\n        this.storeType = storeType;\n    }\n\n    public Double getFileSize() {\n        return fileSize;\n    }\n\n    public void setFileSize(Double fileSize) {\n        this.fileSize = fileSize;\n    }\n\n    public String getTenantId() {\n        return tenantId;\n    }\n\n    public void setTenantId(String tenantId) {\n        this.tenantId = tenantId;\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/SysPermissionDataRuleModel.java",
    "content": "package org.jeecg.common.system.vo;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * <p>\n * 菜单权限规则表\n * </p>\n *\n * @Author huangzhilin\n * @since 2019-03-29\n */\npublic class SysPermissionDataRuleModel {\n\n    /**\n     * id\n     */\n    private String id;\n\n    /**\n     * 对应的菜单id\n     */\n    private String permissionId;\n\n    /**\n     * 规则名称\n     */\n    private String ruleName;\n\n    /**\n     * 字段\n     */\n    private String ruleColumn;\n\n    /**\n     * 条件\n     */\n    private String ruleConditions;\n\n    /**\n     * 规则值\n     */\n    private String ruleValue;\n\n    /**\n     * 创建时间\n     */\n    private Date createTime;\n\n    /**\n     * 创建人\n     */\n    private String createBy;\n\n    /**\n     * 修改时间\n     */\n    private Date updateTime;\n\n    /**\n     * 修改人\n     */\n    private String updateBy;\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public String getPermissionId() {\n        return permissionId;\n    }\n\n    public void setPermissionId(String permissionId) {\n        this.permissionId = permissionId;\n    }\n\n    public String getRuleName() {\n        return ruleName;\n    }\n\n    public void setRuleName(String ruleName) {\n        this.ruleName = ruleName;\n    }\n\n    public String getRuleColumn() {\n        return ruleColumn;\n    }\n\n    public void setRuleColumn(String ruleColumn) {\n        this.ruleColumn = ruleColumn;\n    }\n\n    public String getRuleConditions() {\n        return ruleConditions;\n    }\n\n    public void setRuleConditions(String ruleConditions) {\n        this.ruleConditions = ruleConditions;\n    }\n\n    public String getRuleValue() {\n        return ruleValue;\n    }\n\n    public void setRuleValue(String ruleValue) {\n        this.ruleValue = ruleValue;\n    }\n\n    public Date getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(Date createTime) {\n        this.createTime = createTime;\n    }\n\n    public String getCreateBy() {\n        return createBy;\n    }\n\n    public void setCreateBy(String createBy) {\n        this.createBy = createBy;\n    }\n\n    public Date getUpdateTime() {\n        return updateTime;\n    }\n\n    public void setUpdateTime(Date updateTime) {\n        this.updateTime = updateTime;\n    }\n\n    public String getUpdateBy() {\n        return updateBy;\n    }\n\n    public void setUpdateBy(String updateBy) {\n        this.updateBy = updateBy;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/SysUserCacheInfo.java",
    "content": "package org.jeecg.common.system.vo;\n\nimport java.util.List;\n\nimport org.jeecg.common.util.DateUtils;\n\n/**\n * @Description: 用户缓存信息\n * @author: jeecg-boot\n */\npublic class SysUserCacheInfo {\n\n\tprivate String sysUserId;\n\n\tprivate String sysUserCode;\n\t\n\tprivate String sysUserName;\n\t\n\tprivate String sysOrgCode;\n\n\t/**\n\t * 当前用户部门ID\n\t */\n\tprivate String sysOrgId;\n\n\tprivate List<String> sysMultiOrgCode;\n\t\n\tprivate boolean oneDepart;\n\n\t/**\n\t * 当前用户角色code（多个逗号分割）\n\t */\n\tprivate String sysRoleCode;\n\n\tpublic boolean isOneDepart() {\n\t\treturn oneDepart;\n\t}\n\n\tpublic void setOneDepart(boolean oneDepart) {\n\t\tthis.oneDepart = oneDepart;\n\t}\n\n\tpublic String getSysDate() {\n\t\treturn DateUtils.formatDate();\n\t}\n\n\tpublic String getSysTime() {\n\t\treturn DateUtils.now();\n\t}\n\n\tpublic String getSysUserCode() {\n\t\treturn sysUserCode;\n\t}\n\n\tpublic void setSysUserCode(String sysUserCode) {\n\t\tthis.sysUserCode = sysUserCode;\n\t}\n\n\tpublic String getSysUserName() {\n\t\treturn sysUserName;\n\t}\n\n\tpublic void setSysUserName(String sysUserName) {\n\t\tthis.sysUserName = sysUserName;\n\t}\n\n\tpublic String getSysOrgCode() {\n\t\treturn sysOrgCode;\n\t}\n\n\tpublic void setSysOrgCode(String sysOrgCode) {\n\t\tthis.sysOrgCode = sysOrgCode;\n\t}\n\n\tpublic List<String> getSysMultiOrgCode() {\n\t\treturn sysMultiOrgCode;\n\t}\n\n\tpublic void setSysMultiOrgCode(List<String> sysMultiOrgCode) {\n\t\tthis.sysMultiOrgCode = sysMultiOrgCode;\n\t}\n\n\tpublic String getSysUserId() {\n\t\treturn sysUserId;\n\t}\n\n\tpublic void setSysUserId(String sysUserId) {\n\t\tthis.sysUserId = sysUserId;\n\t}\n\n\tpublic String getSysOrgId() {\n\t\treturn sysOrgId;\n\t}\n\n\tpublic void setSysOrgId(String sysOrgId) {\n\t\tthis.sysOrgId = sysOrgId;\n\t}\n\n\tpublic String getSysRoleCode() {\n\t\treturn sysRoleCode;\n\t}\n\n\tpublic void setSysRoleCode(String sysRoleCode) {\n\t\tthis.sysRoleCode = sysRoleCode;\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/UserAccountInfo.java",
    "content": "package org.jeecg.common.system.vo;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecg.common.desensitization.annotation.SensitiveField;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.util.Date;\n\n/**\n * <p>\n * 在线用户信息\n * </p>\n *\n * @Author scott\n * @since 2023-08-16\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class UserAccountInfo {\n\n    /**\n     * 登录人id\n     */\n    private String id;\n\n    /**\n     * 登录人账号\n     */\n    private String username;\n\n    /**\n     * 登录人名字\n     */\n    private String realname;\n\n    /**\n     * 电子邮件\n     */\n    private String email;\n\n    /**\n     * 头像\n     */\n    @SensitiveField\n    private String avatar;\n\n    /**\n     * 同步工作流引擎1同步0不同步\n     */\n    private Integer activitiSync;\n\n    /**\n     * 电话\n     */\n    @SensitiveField\n    private String phone;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/AssertUtils.java",
    "content": "package org.jeecg.common.util;\n\n\nimport org.jeecg.common.exception.JeecgBootAssertException;\n\n/**\n * 断言检查工具\n * for for [QQYUN-10990]AIRAG\n * @author chenrui\n * @date 2017-06-22 10:05:56\n */\npublic class AssertUtils {\n\n    /**\n     * 确保对象为空,如果不为空抛出异常\n     *\n     * @param msg\n     * @param obj\n     * @throws JeecgBootAssertException\n     * @author chenrui\n     * @date 2017-06-22 10:05:56\n     */\n    public static void assertEmpty(String msg, Object obj) {\n        if (oConvertUtils.isObjectNotEmpty(obj)) {\n            throw new JeecgBootAssertException(msg);\n        }\n    }\n\n\n    /**\n     * 确保对象不为空,如果为空抛出异常\n     *\n     * @param msg\n     * @param obj\n     * @throws JeecgBootAssertException\n     * @author chenrui\n     * @date 2017-06-22 10:05:56\n     */\n    public static void assertNotEmpty(String msg, Object obj) {\n        if (oConvertUtils.isObjectEmpty(obj)) {\n            throw new JeecgBootAssertException(msg);\n        }\n    }\n\n\n    /**\n     * 验证对象是否相同\n     *\n     * @param message\n     * @param expected\n     * @param actual\n     * @author chenrui\n     * @date 2018/9/12 15:45\n     */\n    public static void assertEquals(String message, Object expected,\n                                    Object actual) {\n        if (oConvertUtils.isEqual(expected, actual)) {\n            return;\n        }\n        throw new JeecgBootAssertException(message);\n    }\n\n    /**\n     * 验证不相同\n     *\n     * @param message\n     * @param expected\n     * @param actual\n     * @author chenrui\n     * @date 2018/9/12 15:45\n     */\n    public static void assertNotEquals(String message, Object expected,\n                                       Object actual) {\n        if (oConvertUtils.isEqual(expected, actual)) {\n            throw new JeecgBootAssertException(message);\n        }\n\n    }\n\n    /**\n     * 验证是否相等\n     *\n     * @param message\n     * @param expected\n     * @param actual\n     * @author chenrui\n     * @date 2018/9/12 15:45\n     */\n    public static void assertSame(String message, Object expected,\n                                  Object actual) {\n        if (expected == actual) {\n            return;\n        }\n        throw new JeecgBootAssertException(message);\n    }\n\n    /**\n     * 验证不相等\n     *\n     * @param message\n     * @param unexpected\n     * @param actual\n     * @author chenrui\n     * @date 2018/9/12 15:45\n     */\n    public static void assertNotSame(String message, Object unexpected,\n                                     Object actual) {\n        if (unexpected == actual) {\n            throw new JeecgBootAssertException(message);\n        }\n    }\n\n    /**\n     * 验证是否为真\n     *\n     * @param message\n     * @param condition\n     */\n    public static void assertTrue(String message, boolean condition) {\n        if (!condition) {\n            throw new JeecgBootAssertException(message);\n        }\n    }\n\n    /**\n     * 验证 condition是否为false\n     *\n     * @param message\n     * @param condition\n     */\n    public static void assertFalse(String message, boolean condition) {\n        assertTrue(message, !condition);\n    }\n\n\n    /**\n     * 验证是否存在\n     *\n     * @param message\n     * @param obj\n     * @param objs\n     * @param <T>\n     * @throws JeecgBootAssertException\n     * @author chenrui\n     * @date 2018/1/31 22:14\n     */\n    public static <T> void assertIn(String message, T obj, T... objs) {\n        assertNotEmpty(message, obj);\n        assertNotEmpty(message, objs);\n        if (!oConvertUtils.isIn(obj, objs)) {\n            throw new JeecgBootAssertException(message);\n        }\n    }\n\n    /**\n     * 验证是否不存在\n     *\n     * @param message\n     * @param obj\n     * @param objs\n     * @param <T>\n     * @throws JeecgBootAssertException\n     * @author chenrui\n     * @date 2018/1/31 22:14\n     */\n\n    public static <T> void assertNotIn(String message, T obj, T... objs) {\n        assertNotEmpty(message, obj);\n        assertNotEmpty(message, objs);\n        if (oConvertUtils.isIn(obj, objs)) {\n            throw new JeecgBootAssertException(message);\n        }\n    }\n\n\n    /**\n     * 确保src大于des\n     *\n     * @param message\n     * @param src\n     * @param des\n     * @author chenrui\n     * @date 2018/9/19 15:30\n     */\n    public static void assertGt(String message, Number src, Number des) {\n        if (oConvertUtils.isGt(src, des)) {\n            return;\n        }\n        throw new JeecgBootAssertException(message);\n    }\n\n    /**\n     * 确保src大于等于des\n     *\n     * @param message\n     * @param src\n     * @param des\n     * @author chenrui\n     * @date 2018/9/19 15:30\n     */\n    public static void assertGe(String message, Number src, Number des) {\n        if (oConvertUtils.isGe(src, des)) {\n            return;\n        }\n        throw new JeecgBootAssertException(message);\n    }\n\n\n    /**\n     * 确保src小于des\n     *\n     * @param message\n     * @param src\n     * @param des\n     * @author chenrui\n     * @date 2018/9/19 15:30\n     */\n    public static void assertLt(String message, Number src, Number des) {\n        if (oConvertUtils.isGe(src, des)) {\n            throw new JeecgBootAssertException(message);\n        }\n    }\n\n    /**\n     * 确保src小于等于des\n     *\n     * @param message\n     * @param src\n     * @param des\n     * @author chenrui\n     * @date 2018/9/19 15:30\n     */\n    public static void assertLe(String message, Number src, Number des) {\n        if (oConvertUtils.isGt(src, des)) {\n            throw new JeecgBootAssertException(message);\n        }\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/BrowserType.java",
    "content": "package org.jeecg.common.util;\n\n/**\n * \n * @Author  张代浩\n *\n */\npublic enum BrowserType {\n    /**\n     * 浏览类型 IE11,IE10,IE9,IE8,IE7,IE6,Firefox,Safari,Chrome,Opera,Camino,Gecko\n     */\n\tIE11,IE10,IE9,IE8,IE7,IE6,Firefox,Safari,Chrome,Opera,Camino,Gecko\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/BrowserUtils.java",
    "content": "package org.jeecg.common.util;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\nimport jakarta.servlet.http.HttpServletRequest;\n\n/**\n * \n * @Author 张代浩\n * \n */\npublic class BrowserUtils {\n\n    /**\n     * 判断是否是IE\n     * @param request\n     * @return\n     */\n\tpublic static boolean isIe(HttpServletRequest request) {\n\t\treturn (request.getHeader(\"USER-AGENT\").toLowerCase().indexOf(\"msie\") > 0 || request\n\t\t\t\t.getHeader(\"USER-AGENT\").toLowerCase().indexOf(\"rv:11.0\") > 0) ? true\n\t\t\t\t: false;\n\t}\n\n\t/**\n\t * 获取IE版本\n\t * \n\t * @param request\n\t * @return\n\t */\n\tpublic static Double getIeVersion(HttpServletRequest request) {\n\t\tDouble version = 0.0;\n\t\tif (getBrowserType(request, IE11)) {\n\t\t\tversion = 11.0;\n\t\t} else if (getBrowserType(request, IE10)) {\n\t\t\tversion = 10.0;\n\t\t} else if (getBrowserType(request, IE9)) {\n\t\t\tversion = 9.0;\n\t\t} else if (getBrowserType(request, IE8)) {\n\t\t\tversion = 8.0;\n\t\t} else if (getBrowserType(request, IE7)) {\n\t\t\tversion = 7.0;\n\t\t} else if (getBrowserType(request, IE6)) {\n\t\t\tversion = 6.0;\n\t\t}\n\t\treturn version;\n\t}\n\n\t/**\n\t * 获取浏览器类型\n\t * \n\t * @param request\n\t * @return\n\t */\n\tpublic static BrowserType getBrowserType(HttpServletRequest request) {\n\t\tBrowserType browserType = null;\n\t\tif (getBrowserType(request, IE11)) {\n\t\t\tbrowserType = BrowserType.IE11;\n\t\t}\n\t\tif (getBrowserType(request, IE10)) {\n\t\t\tbrowserType = BrowserType.IE10;\n\t\t}\n\t\tif (getBrowserType(request, IE9)) {\n\t\t\tbrowserType = BrowserType.IE9;\n\t\t}\n\t\tif (getBrowserType(request, IE8)) {\n\t\t\tbrowserType = BrowserType.IE8;\n\t\t}\n\t\tif (getBrowserType(request, IE7)) {\n\t\t\tbrowserType = BrowserType.IE7;\n\t\t}\n\t\tif (getBrowserType(request, IE6)) {\n\t\t\tbrowserType = BrowserType.IE6;\n\t\t}\n\t\tif (getBrowserType(request, FIREFOX)) {\n\t\t\tbrowserType = BrowserType.Firefox;\n\t\t}\n\t\tif (getBrowserType(request, SAFARI)) {\n\t\t\tbrowserType = BrowserType.Safari;\n\t\t}\n\t\tif (getBrowserType(request, CHROME)) {\n\t\t\tbrowserType = BrowserType.Chrome;\n\t\t}\n\t\tif (getBrowserType(request, OPERA)) {\n\t\t\tbrowserType = BrowserType.Opera;\n\t\t}\n\t\tif (getBrowserType(request, CAMINO)) {\n\t\t\tbrowserType = BrowserType.Camino;\n\t\t}\n\t\treturn browserType;\n\t}\n\n\tprivate static boolean getBrowserType(HttpServletRequest request,\n\t\t\tString brosertype) {\n\t\treturn request.getHeader(\"USER-AGENT\").toLowerCase()\n\t\t\t\t.indexOf(brosertype) > 0 ? true : false;\n\t}\n\n\tprivate final static String IE11 = \"rv:11.0\";\n\tprivate final static String IE10 = \"MSIE 10.0\";\n\tprivate final static String IE9 = \"MSIE 9.0\";\n\tprivate final static String IE8 = \"MSIE 8.0\";\n\tprivate final static String IE7 = \"MSIE 7.0\";\n\tprivate final static String IE6 = \"MSIE 6.0\";\n\tprivate final static String MAXTHON = \"Maxthon\";\n\tprivate final static String QQ = \"QQBrowser\";\n\tprivate final static String GREEN = \"GreenBrowser\";\n\tprivate final static String SE360 = \"360SE\";\n\tprivate final static String FIREFOX = \"Firefox\";\n\tprivate final static String OPERA = \"Opera\";\n\tprivate final static String CHROME = \"Chrome\";\n\tprivate final static String SAFARI = \"Safari\";\n\tprivate final static String OTHER = \"其它\";\n\tprivate final static String CAMINO = \"Camino\";\n\n\tpublic static String checkBrowse(HttpServletRequest request) {\n\t\tString userAgent = request.getHeader(\"USER-AGENT\");\n\t\tif (regex(OPERA, userAgent)) {\n\t\t\treturn OPERA;\n\t\t}\n\t\tif (regex(CHROME, userAgent)) {\n\t\t\treturn CHROME;\n\t\t}\n\t\tif (regex(FIREFOX, userAgent)) {\n\t\t\treturn FIREFOX;\n\t\t}\n\t\tif (regex(SAFARI, userAgent)) {\n\t\t\treturn SAFARI;\n\t\t}\n\t\tif (regex(SE360, userAgent)) {\n\t\t\treturn SE360;\n\t\t}\n\t\tif (regex(GREEN, userAgent)) {\n\t\t\treturn GREEN;\n\t\t}\n\t\tif (regex(QQ, userAgent)) {\n\t\t\treturn QQ;\n\t\t}\n\t\tif (regex(MAXTHON, userAgent)) {\n\t\t\treturn MAXTHON;\n\t\t}\n\t\tif (regex(IE11, userAgent)) {\n\t\t\treturn IE11;\n\t\t}\n\t\tif (regex(IE10, userAgent)) {\n\t\t\treturn IE10;\n\t\t}\n\t\tif (regex(IE9, userAgent)) {\n\t\t\treturn IE9;\n\t\t}\n\t\tif (regex(IE8, userAgent)) {\n\t\t\treturn IE8;\n\t\t}\n\t\tif (regex(IE7, userAgent)) {\n\t\t\treturn IE7;\n\t\t}\n\t\tif (regex(IE6, userAgent)) {\n\t\t\treturn IE6;\n\t\t}\n\t\treturn OTHER;\n\t}\n\n\tpublic static boolean regex(String regex, String str) {\n\t\tPattern p = Pattern.compile(regex, Pattern.MULTILINE);\n\t\tMatcher m = p.matcher(str);\n\t\treturn m.find();\n\t}\n\n\t\n\tprivate static Map<String, String> langMap = new HashMap<String, String>();\n\tprivate final static String ZH = \"zh\";\n\tprivate final static String ZH_CN = \"zh-cn\";\n\t\n\tprivate final static String EN = \"en\";\n\tprivate final static String EN_US = \"en\";\n\t\n\t\n\tstatic \n\t{\n\t\tlangMap.put(ZH, ZH_CN);\n\t\tlangMap.put(EN, EN_US);\n\t}\n\t\n\tpublic static String getBrowserLanguage(HttpServletRequest request) {\n\t\t\n\t\tString browserLang = request.getLocale().getLanguage();\n\t\tString browserLangCode = (String)langMap.get(browserLang);\n\t\t\n\t\tif(browserLangCode == null)\n\t\t{\n\t\t\tbrowserLangCode = EN_US;\n\t\t}\n\t\treturn browserLangCode;\n\t}\n\n    /** 判断请求是否来自电脑端 */\n    public static boolean isDesktop(HttpServletRequest request) {\n        return !isMobile(request);\n    }\n\n    /** 判断请求是否来自移动端 */\n    public static boolean isMobile(HttpServletRequest request) {\n        String ua = request.getHeader(\"User-Agent\").toLowerCase();\n        String type = \"(phone|pad|pod|iphone|ipod|ios|ipad|android|mobile|blackberry|iemobile|mqqbrowser|juc|fennec|wosbrowser|browserng|webos|symbian|windows phone)\";\n        Pattern pattern = Pattern.compile(type);\n        return pattern.matcher(ua).find();\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CommonUtils.java",
    "content": "package org.jeecg.common.util;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.dynamic.datasource.creator.DataSourceProperty;\nimport com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;\nimport com.baomidou.mybatisplus.annotation.DbType;\nimport com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.DataBaseConstant;\nimport org.jeecg.common.constant.ServiceNameConstants;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.util.filter.SsrfFileTypeFilter;\nimport org.jeecg.common.util.oss.OssBootUtil;\nimport org.jeecgframework.poi.util.PoiPublicUtil;\nimport org.springframework.jdbc.datasource.DriverManagerDataSource;\nimport org.springframework.util.FileCopyUtils;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport javax.sql.DataSource;\nimport java.io.ByteArrayInputStream;\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.nio.charset.StandardCharsets;\nimport java.sql.Connection;\nimport java.sql.DatabaseMetaData;\nimport java.sql.SQLException;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\n/**\n * @Description: 通用工具\n * @author: jeecg-boot\n */\n@Slf4j\npublic class CommonUtils {\n\n    /**\n     * 中文正则\n     */\n    private static Pattern ZHONGWEN_PATTERN = Pattern.compile(\"[\\u4e00-\\u9fa5]\");\n\n    /**\n     * 文件名 正则字符串\n     * 文件名支持的字符串：字母数字中文.-_()（） 除此之外的字符将被删除\n     */\n    private static String FILE_NAME_REGEX = \"[^A-Za-z\\\\.\\\\(\\\\)\\\\-（）\\\\_0-9\\\\u4e00-\\\\u9fa5]\";\n\n    public static String uploadOnlineImage(byte[] data,String basePath,String bizPath,String uploadType){\n        String dbPath = null;\n        String fileName = \"image\" + Math.round(Math.random() * 100000000000L);\n        //update-begin---author:wangshuai---date:2026-01-08---for:【QQYUN-14535】ai生成图片的后缀不一致的，导致不展示---\n        fileName += \".\" + PoiPublicUtil.getFileExtendName(data).toLowerCase();\n        //update-end---author:wangshuai---date:2026-01-08---for:【QQYUN-14535】ai生成图片的后缀不一致的，导致不展示---\n        try {\n            if(CommonConstant.UPLOAD_TYPE_LOCAL.equals(uploadType)){\n                File file = new File(basePath + File.separator + bizPath + File.separator );\n                if (!file.exists()) {\n                    file.mkdirs();// 创建文件根目录\n                }\n                String savePath = file.getPath() + File.separator + fileName;\n                File savefile = new File(savePath);\n                FileCopyUtils.copy(data, savefile);\n                dbPath = bizPath + File.separator + fileName;\n            }else {\n                InputStream in = new ByteArrayInputStream(data);\n                String relativePath = bizPath+\"/\"+fileName;\n                if(CommonConstant.UPLOAD_TYPE_MINIO.equals(uploadType)){\n                    dbPath = MinioUtil.upload(in,relativePath);\n                }else if(CommonConstant.UPLOAD_TYPE_OSS.equals(uploadType)){\n                    dbPath = OssBootUtil.upload(in,relativePath);\n                }\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return dbPath;\n    }\n\n    /**\n     * 判断文件名是否带盘符，重新处理\n     * @param fileName\n     * @return\n     */\n    public static String getFileName(String fileName){\n        //判断是否带有盘符信息\n        // Check for Unix-style path\n        int unixSep = fileName.lastIndexOf('/');\n        // Check for Windows-style path\n        int winSep = fileName.lastIndexOf('\\\\');\n        // Cut off at latest possible point\n        int pos = (winSep > unixSep ? winSep : unixSep);\n        if (pos != -1)  {\n            // Any sort of path separator found...\n            fileName = fileName.substring(pos + 1);\n        }\n        //替换上传文件名字的特殊字符\n        fileName = fileName.replace(\"=\",\"\").replace(\",\",\"\").replace(\"&\",\"\")\n                .replace(\"#\", \"\").replace(\"“\", \"\").replace(\"”\", \"\");\n        //替换上传文件名字中的空格\n        fileName=fileName.replaceAll(\"\\\\s\",\"\");\n        //update-beign-author:taoyan date:20220302 for: /issues/3381 online 在线表单 使用文件组件时，上传文件名中含%，下载异常\n        fileName = fileName.replaceAll(FILE_NAME_REGEX, \"\");\n        //update-end-author:taoyan date:20220302 for: /issues/3381 online 在线表单 使用文件组件时，上传文件名中含%，下载异常\n        return fileName;\n    }\n\n    /**\n     * java 判断字符串里是否包含中文字符\n     * @param str\n     * @return\n     */\n    public static boolean ifContainChinese(String str) {\n        if(str.getBytes().length == str.length()){\n            return false;\n        }else{\n            Matcher m = ZHONGWEN_PATTERN.matcher(str);\n            if (m.find()) {\n                return true;\n            }\n            return false;\n        }\n    }\n\n    /**\n     * 统一全局上传\n     * @Return: java.lang.String\n     */\n    public static String upload(MultipartFile file, String bizPath, String uploadType) {\n        String url = \"\";\n        try {\n            if (CommonConstant.UPLOAD_TYPE_MINIO.equals(uploadType)) {\n                url = MinioUtil.upload(file, bizPath);\n            } else {\n                url = OssBootUtil.upload(file, bizPath);\n            }\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            throw new JeecgBootException(e.getMessage());\n        }\n        return url;\n    }\n    /**\n     * 本地文件上传\n     * @param mf 文件\n     * @param bizPath  自定义路径\n     * @return\n     */\n    public static String uploadLocal(MultipartFile mf,String bizPath,String uploadpath){\n        try {\n            // 文件安全校验，防止上传漏洞文件\n            SsrfFileTypeFilter.checkUploadFileType(mf, bizPath);\n            \n            String fileName = null;\n            File file = new File(uploadpath + File.separator + bizPath + File.separator );\n            if (!file.exists()) {\n                // 创建文件根目录\n                file.mkdirs();\n            }\n            // 获取文件名\n            String orgName = mf.getOriginalFilename();\n            // 无中文情况下进行转码\n            if (orgName != null && !CommonUtils.ifContainChinese(orgName)) {\n                orgName = new String(orgName.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);\n            }\n            orgName = CommonUtils.getFileName(orgName);\n            if(orgName.indexOf(SymbolConstant.SPOT)!=-1){\n                fileName = orgName.substring(0, orgName.lastIndexOf(\".\")) + \"_\" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf(\".\"));\n            }else{\n                fileName = orgName+ \"_\" + System.currentTimeMillis();\n            }\n            String savePath = file.getPath() + File.separator + fileName;\n            File savefile = new File(savePath);\n            FileCopyUtils.copy(mf.getBytes(), savefile);\n            String dbpath = null;\n            if(oConvertUtils.isNotEmpty(bizPath)){\n                dbpath = bizPath + File.separator + fileName;\n            }else{\n                dbpath = fileName;\n            }\n            if (dbpath.contains(SymbolConstant.DOUBLE_BACKSLASH)) {\n                dbpath = dbpath.replace(\"\\\\\", \"/\");\n            }\n            return dbpath;\n        } catch (IOException e) {\n            log.error(e.getMessage(), e);\n        }catch (Exception e) {\n            log.error(e.getMessage(), e);\n        }\n        return \"\";\n    }\n\n    /**\n     * 统一全局上传 带桶\n     * @Return: java.lang.String\n     */\n    public static String upload(MultipartFile file, String bizPath, String uploadType, String customBucket) {\n        String url = \"\";\n        try {\n            if (CommonConstant.UPLOAD_TYPE_MINIO.equals(uploadType)) {\n                url = MinioUtil.upload(file, bizPath, customBucket);\n            } else {\n                url = OssBootUtil.upload(file, bizPath, customBucket);\n            }\n        } catch (Exception e) {\n            log.error(e.getMessage(),e);\n        }\n        return url;\n    }\n\n    /** 当前系统数据库类型 */\n    private static String DB_TYPE = \"\";\n    private static DbType dbTypeEnum = null;\n\n    /**\n     * 全局获取平台数据库类型（作废了）\n     * @return\n     */\n    @Deprecated\n    public static String getDatabaseType() {\n        if(oConvertUtils.isNotEmpty(DB_TYPE)){\n            return DB_TYPE;\n        }\n        DataSource dataSource = SpringContextUtils.getApplicationContext().getBean(DataSource.class);\n        try {\n            return getDatabaseTypeByDataSource(dataSource);\n        } catch (SQLException e) {\n            //e.printStackTrace();\n            log.warn(e.getMessage(),e);\n            return \"\";\n        }\n    }\n\n    /**\n     * 全局获取平台数据库类型（对应mybaisPlus枚举）\n     * @return\n     */\n    public static DbType getDatabaseTypeEnum() {\n        if (oConvertUtils.isNotEmpty(dbTypeEnum)) {\n            return dbTypeEnum;\n        }\n        try {\n            DataSource dataSource = SpringContextUtils.getApplicationContext().getBean(DataSource.class);\n            dbTypeEnum = JdbcUtils.getDbType(dataSource.getConnection().getMetaData().getURL());\n            //【采用SQL_SERVER2005引擎】QQYUN-13298 解决升级mybatisPlus后SqlServer分页使用OFFSET，无排序字段报错问题\n            if (dbTypeEnum == DbType.SQL_SERVER) {\n                dbTypeEnum = DbType.SQL_SERVER2005;\n            }\n            return dbTypeEnum;\n        } catch (SQLException e) {\n            log.warn(e.getMessage(), e);\n            return null;\n        }\n    }\n\n    /**\n     * 根据数据源key获取DataSourceProperty\n     * @param sourceKey\n     * @return\n     */\n    public static DataSourceProperty getDataSourceProperty(String sourceKey){\n        DynamicDataSourceProperties prop = SpringContextUtils.getApplicationContext().getBean(DynamicDataSourceProperties.class);\n        Map<String, DataSourceProperty> map = prop.getDatasource();\n        DataSourceProperty db = (DataSourceProperty)map.get(sourceKey);\n        return db;\n    }\n\n    /**\n     * 根据sourceKey 获取数据源连接\n     * @param sourceKey\n     * @return\n     * @throws SQLException\n     */\n    public static Connection getDataSourceConnect(String sourceKey) throws SQLException {\n        if (oConvertUtils.isEmpty(sourceKey)) {\n            sourceKey = \"master\";\n        }\n        DynamicDataSourceProperties prop = SpringContextUtils.getApplicationContext().getBean(DynamicDataSourceProperties.class);\n        Map<String, DataSourceProperty> map = prop.getDatasource();\n        DataSourceProperty db = (DataSourceProperty)map.get(sourceKey);\n        if(db==null){\n            return null;\n        }\n        DriverManagerDataSource ds = new DriverManagerDataSource ();\n        ds.setDriverClassName(db.getDriverClassName());\n        ds.setUrl(db.getUrl());\n        ds.setUsername(db.getUsername());\n        ds.setPassword(db.getPassword());\n        return ds.getConnection();\n    }\n\n    /**\n     * 获取数据库类型\n     * @param dataSource\n     * @return\n     * @throws SQLException\n     */\n    private static String getDatabaseTypeByDataSource(DataSource dataSource) throws SQLException{\n        if(\"\".equals(DB_TYPE)) {\n            Connection connection = dataSource.getConnection();\n            try {\n                DatabaseMetaData md = connection.getMetaData();\n                String dbType = md.getDatabaseProductName().toUpperCase();\n                String sqlserver= \"SQL SERVER\";\n                if(dbType.indexOf(DataBaseConstant.DB_TYPE_MYSQL)>=0) {\n                    DB_TYPE = DataBaseConstant.DB_TYPE_MYSQL;\n                }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_ORACLE)>=0 ||dbType.indexOf(DataBaseConstant.DB_TYPE_DM)>=0) {\n                    DB_TYPE = DataBaseConstant.DB_TYPE_ORACLE;\n                }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_SQLSERVER)>=0||dbType.indexOf(sqlserver)>=0) {\n                    DB_TYPE = DataBaseConstant.DB_TYPE_SQLSERVER;\n                }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_POSTGRESQL)>=0 || dbType.indexOf(DataBaseConstant.DB_TYPE_KINGBASEES)>=0) {\n                    DB_TYPE = DataBaseConstant.DB_TYPE_POSTGRESQL;\n                }else if(dbType.indexOf(DataBaseConstant.DB_TYPE_MARIADB)>=0) {\n                    DB_TYPE = DataBaseConstant.DB_TYPE_MARIADB;\n                }else {\n                    log.error(\"数据库类型:[\" + dbType + \"]不识别!\");\n                    //throw new JeecgBootException(\"数据库类型:[\"+dbType+\"]不识别!\");\n                }\n            } catch (Exception e) {\n                log.error(e.getMessage(), e);\n            }finally {\n                connection.close();\n            }\n        }\n        return DB_TYPE;\n\n    }\n    /**\n     * 获取服务器地址\n     *\n     * @param request\n     * @return\n     */\n    public static String getBaseUrl(HttpServletRequest request) {\n        //1.【兼容】兼容微服务下的 base path-------\n        String xGatewayBasePath = request.getHeader(ServiceNameConstants.X_GATEWAY_BASE_PATH);\n        if(oConvertUtils.isNotEmpty(xGatewayBasePath)){\n            log.info(\"x_gateway_base_path = \"+ xGatewayBasePath);\n            return  xGatewayBasePath;\n        }\n        //2.【兼容】SSL认证之后，request.getScheme()获取不到https的问题\n        // https://blog.csdn.net/weixin_34376986/article/details/89767950\n        String scheme = request.getHeader(CommonConstant.X_FORWARDED_SCHEME);\n        if(oConvertUtils.isEmpty(scheme)){\n            scheme = request.getScheme();\n        }\n\n        //3.常规操作\n        String serverName = request.getServerName();\n        int serverPort = request.getServerPort();\n        String contextPath = request.getContextPath();\n\n        //返回 host domain\n        String baseDomainPath = null;\n        //update-begin---author:wangshuai---date:2024-03-15---for:【QQYUN-8561】企业微信登陆请求接口设置上下文不一致，导致接口404---\n        int httpPort = 80;\n        int httpsPort = 443;\n        if(httpPort == serverPort || httpsPort == serverPort){\n        //update-end---author:wangshuai---date:2024-03-15---for:【QQYUN-8561】企业微信登陆请求接口设置上下文不一致，导致接口404---~\n            baseDomainPath = scheme + \"://\" + serverName  + contextPath ;\n        }else{\n            baseDomainPath = scheme + \"://\" + serverName + \":\" + serverPort + contextPath ;\n        }\n        log.info(\"-----Common getBaseUrl----- : \" + baseDomainPath);\n        return baseDomainPath;\n    }\n\n    /**\n     * 递归合并 fastJSON 对象\n     *\n     * @param target  目标对象\n     * @param sources 来源对象，允许多个，优先级从左到右，最右侧的优先级最高\n     */\n    public static JSONObject mergeJSON(JSONObject target, JSONObject... sources) {\n        for (JSONObject source : sources) {\n            CommonUtils.mergeJSON(target, source);\n        }\n        return target;\n    }\n\n    /**\n     * 递归合并 fastJSON 对象\n     *\n     * @param target 目标对象\n     * @param source 来源对象\n     */\n    public static JSONObject mergeJSON(JSONObject target, JSONObject source) {\n        for (String key : source.keySet()) {\n            Object sourceItem = source.get(key);\n            // 是否是 JSONObject\n            if (sourceItem instanceof Map) {\n                // target中存在此key\n                if (target.containsKey(key)) {\n                    // 两个都是 JSONObject，继续合并\n                    if (target.get(key) instanceof Map) {\n                        CommonUtils.mergeJSON(target.getJSONObject(key), source.getJSONObject(key));\n                        continue;\n                    }\n                }\n            }\n            // target不存在此key，或不是 JSONObject，则覆盖\n            target.put(key, sourceItem);\n        }\n        return target;\n    }\n\n    /**\n     * 将list集合以分割符的方式进行分割\n     * @param list      String类型的集合文本\n     * @param separator 分隔符\n     * @return\n     */\n    public static String getSplitText(List<String> list, String separator) {\n        if (null != list && list.size() > 0) {\n            return StringUtils.join(list, separator);\n        }\n        return \"\";\n    }\n \n    /**\n     * 通过table的条件SQL\n     *\n     * @param tableSql sys_user where name = '1212'\n     * @return name = '1212'\n     */\n    public static String getFilterSqlByTableSql(String tableSql) {\n        if(oConvertUtils.isEmpty(tableSql)){\n            return null;\n        }\n        \n        if (tableSql.toLowerCase().indexOf(DataBaseConstant.SQL_WHERE) > 0) {\n            String[] arr = tableSql.split(\" (?i)where \");\n            if (arr != null && oConvertUtils.isNotEmpty(arr[1])) {\n                return arr[1];\n            }\n        }\n        return \"\";\n    }\n\n    /**\n     * 通过table获取表名\n     *\n     * @param tableSql sys_user where name = '1212'\n     * @return sys_user\n     */\n    public static String getTableNameByTableSql(String tableSql) {\n        if(oConvertUtils.isEmpty(tableSql)){\n            return null;\n        }\n        \n        if (tableSql.toLowerCase().indexOf(DataBaseConstant.SQL_WHERE) > 0) {\n            String[] arr = tableSql.split(\" (?i)where \");\n            return arr[0].trim();\n        } else {\n            return tableSql;\n        }\n    }\n\n    /**\n     * 判断两个数组是否存在交集\n     * @param set1\n     * @param arr2\n     * @return\n     */\n    public static boolean hasIntersection(Set<String> set1, String[] arr2) {\n        if (set1 == null) {\n            return false;\n        }\n        \n        if(set1.size()>0){\n            for (String str : arr2) {\n                if (set1.contains(str)) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n\n    /**\n     * 输出info日志，会捕获异常，防止因为日志问题导致程序异常\n     *\n     * @param msg\n     * @param objects\n     */\n    public static void logInfo(String msg, Object... objects) {\n        try {\n            log.info(msg, objects);\n        } catch (Exception e) {\n            log.warn(\"{} —— {}\", msg, e.getMessage());\n        }\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateRangeUtils.java",
    "content": "package org.jeecg.common.util;\n\nimport cn.hutool.core.date.DateUtil;\nimport org.jeecg.common.constant.enums.DateRangeEnum;\n\nimport java.util.Calendar;\nimport java.util.Date;\n\n/**\n * 日期范围工具类\n *\n * @author scott\n * @date 20230801\n */\npublic class DateRangeUtils {\n\n    /**\n     * 根据日期范围枚举获取日期范围\n     *\n     * @param rangeEnum\n     * @return Date[]\n     */\n    public static Date[] getDateRangeByEnum(DateRangeEnum rangeEnum) {\n        if (rangeEnum == null) {\n            return null;\n        }\n        Date[] ranges = new Date[2];\n        switch (rangeEnum) {\n            case TODAY:\n                ranges[0] = getTodayStartTime();\n                ranges[1] = getTodayEndTime();\n                break;\n            case YESTERDAY:\n                ranges[0] = getYesterdayStartTime();\n                ranges[1] = getYesterdayEndTime();\n                break;\n            case TOMORROW:\n                ranges[0] = getTomorrowStartTime();\n                ranges[1] = getTomorrowEndTime();\n                break;\n            case THIS_WEEK:\n                ranges[0] = getThisWeekStartDay();\n                ranges[1] = getThisWeekEndDay();\n                break;\n            case LAST_WEEK:\n                ranges[0] = getLastWeekStartDay();\n                ranges[1] = getLastWeekEndDay();\n                break;\n            case NEXT_WEEK:\n                ranges[0] = getNextWeekStartDay();\n                ranges[1] = getNextWeekEndDay();\n                break;\n            case LAST_7_DAYS:\n                ranges[0] = getLast7DaysStartTime();\n                ranges[1] = getLast7DaysEndTime();\n                break;\n            case THIS_MONTH:\n                ranges[0] = getThisMonthStartDay();\n                ranges[1] = getThisMonthEndDay();\n                break;\n            case LAST_MONTH:\n                ranges[0] = getLastMonthStartDay();\n                ranges[1] = getLastMonthEndDay();\n                break;\n            case NEXT_MONTH:\n                ranges[0] = getNextMonthStartDay();\n                ranges[1] = getNextMonthEndDay();\n                break;\n            default:\n                return null;\n        }\n        return ranges;\n    }\n\n    /**\n     * 获得下月第一天 周日 00:00:00\n     */\n    public static Date getNextMonthStartDay() {\n        return DateUtil.beginOfMonth(DateUtil.nextMonth());\n    }\n\n    /**\n     * 获得下月最后一天 23:59:59\n     */\n    public static Date getNextMonthEndDay() {\n        return DateUtil.endOfMonth(DateUtil.nextMonth());\n    }\n\n    /**\n     * 获得本月第一天 周日 00:00:00\n     */\n    public static Date getThisMonthStartDay() {\n        return DateUtil.beginOfMonth(DateUtil.date());\n    }\n\n    /**\n     * 获得本月最后一天 23:59:59\n     */\n    public static Date getThisMonthEndDay() {\n        return DateUtil.endOfMonth(DateUtil.date());\n    }\n\n    /**\n     * 获得上月第一天 周日 00:00:00\n     */\n    public static Date getLastMonthStartDay() {\n        return DateUtil.beginOfMonth(DateUtil.lastMonth());\n    }\n\n    /**\n     * 获得上月最后一天 23:59:59\n     */\n    public static Date getLastMonthEndDay() {\n        return DateUtil.endOfMonth(DateUtil.lastMonth());\n    }\n\n    /**\n     * 获得上周第一天 周一 00:00:00\n     */\n    public static Date getLastWeekStartDay() {\n        return DateUtil.beginOfWeek(DateUtil.lastWeek());\n    }\n\n    /**\n     * 获得上周最后一天 周日 23:59:59\n     */\n    public static Date getLastWeekEndDay() {\n        return DateUtil.endOfWeek(DateUtil.lastWeek());\n    }\n\n    /**\n     * 获得本周第一天 周一 00:00:00\n     */\n    public static Date getThisWeekStartDay() {\n        Date today = new Date();\n        return DateUtil.beginOfWeek(today);\n    }\n\n    /**\n     * 获得本周最后一天 周日 23:59:59\n     */\n    public static Date getThisWeekEndDay() {\n        Date today = new Date();\n        return DateUtil.endOfWeek(today);\n    }\n\n    /**\n     * 获得下周第一天 周一 00:00:00\n     */\n    public static Date getNextWeekStartDay() {\n        return DateUtil.beginOfWeek(DateUtil.nextWeek());\n    }\n\n    /**\n     * 获得下周最后一天 周日 23:59:59\n     */\n    public static Date getNextWeekEndDay() {\n        return DateUtil.endOfWeek(DateUtil.nextWeek());\n    }\n\n    /**\n     * 过去七天开始时间（不含今天）\n     *\n     * @return\n     */\n    public static Date getLast7DaysStartTime() {\n        Calendar calendar = Calendar.getInstance();\n        calendar.setTime(new Date());\n        calendar.add(Calendar.DATE, -7);\n        return DateUtil.beginOfDay(calendar.getTime());\n    }\n\n    /**\n     * 过去七天结束时间（不含今天）\n     *\n     * @return\n     */\n    public static Date getLast7DaysEndTime() {\n        Calendar calendar = Calendar.getInstance();\n        calendar.setTime(getLast7DaysStartTime());\n        calendar.add(Calendar.DATE, 6);\n        return DateUtil.endOfDay(calendar.getTime());\n    }\n\n    /**\n     * 昨天开始时间\n     *\n     * @return\n     */\n    public static Date getYesterdayStartTime() {\n        Calendar calendar = Calendar.getInstance();\n        calendar.setTime(new Date());\n        calendar.add(Calendar.DATE, -1);\n        return DateUtil.beginOfDay(calendar.getTime());\n    }\n\n    /**\n     * 昨天结束时间\n     *\n     * @return\n     */\n    public static Date getYesterdayEndTime() {\n        return DateUtil.endOfDay(getYesterdayStartTime());\n    }\n\n    /**\n     * 明天开始时间\n     *\n     * @return\n     */\n    public static Date getTomorrowStartTime() {\n        return DateUtil.beginOfDay(DateUtil.tomorrow());\n    }\n\n    /**\n     * 明天结束时间\n     *\n     * @return\n     */\n    public static Date getTomorrowEndTime() {\n        return DateUtil.endOfDay(DateUtil.tomorrow());\n    }\n\n    /**\n     * 今天开始时间\n     *\n     * @return\n     */\n    public static Date getTodayStartTime() {\n        return DateUtil.beginOfDay(new Date());\n    }\n\n    /**\n     * 今天结束时间\n     *\n     * @return\n     */\n    public static Date getTodayEndTime() {\n        return DateUtil.endOfDay(new Date());\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java",
    "content": "package org.jeecg.common.util;\n\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.springframework.util.StringUtils;\n\nimport java.beans.PropertyEditorSupport;\nimport java.sql.Timestamp;\nimport java.text.DateFormat;\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.time.Duration;\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.time.ZoneId;\nimport java.time.temporal.ChronoUnit;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Calendar;\nimport java.util.Date;\nimport java.util.GregorianCalendar;\n\n/**\n * 类描述：时间操作定义类\n *\n * @Author: 张代浩\n * @Date:2012-12-8 12:15:03\n * @Version 1.0\n */\npublic class DateUtils extends PropertyEditorSupport {\n\n    public static ThreadLocal<SimpleDateFormat> date_sdf = new ThreadLocal<SimpleDateFormat>() {\n        @Override\n        protected SimpleDateFormat initialValue() {\n            return new SimpleDateFormat(\"yyyy-MM-dd\");\n        }\n    };\n    public static ThreadLocal<SimpleDateFormat> yyyyMMdd = new ThreadLocal<SimpleDateFormat>() {\n        @Override\n        protected SimpleDateFormat initialValue() {\n            return new SimpleDateFormat(\"yyyyMMdd\");\n        }\n    };\n    public static ThreadLocal<SimpleDateFormat> date_sdf_wz = new ThreadLocal<SimpleDateFormat>() {\n        @Override\n        protected SimpleDateFormat initialValue() {\n            return new SimpleDateFormat(\"yyyy年MM月dd日\");\n        }\n    };\n    public static ThreadLocal<SimpleDateFormat> time_sdf = new ThreadLocal<SimpleDateFormat>() {\n        @Override\n        protected SimpleDateFormat initialValue() {\n            return new SimpleDateFormat(\"yyyy-MM-dd HH:mm\");\n        }\n    };\n    public static ThreadLocal<SimpleDateFormat> yyyymmddhhmmss = new ThreadLocal<SimpleDateFormat>() {\n        @Override\n        protected SimpleDateFormat initialValue() {\n            return new SimpleDateFormat(\"yyyyMMddHHmmss\");\n        }\n    };\n    public static ThreadLocal<SimpleDateFormat> short_time_sdf = new ThreadLocal<SimpleDateFormat>() {\n        @Override\n        protected SimpleDateFormat initialValue() {\n            return new SimpleDateFormat(\"HH:mm\");\n        }\n    };\n    public static ThreadLocal<SimpleDateFormat> datetimeFormat = new ThreadLocal<SimpleDateFormat>() {\n        @Override\n        protected SimpleDateFormat initialValue() {\n            return new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");\n        }\n    };\n\n    /**\n     * 以毫秒表示的时间\n     */\n    private static final long DAY_IN_MILLIS = 24 * 3600 * 1000;\n    private static final long HOUR_IN_MILLIS = 3600 * 1000;\n    private static final long MINUTE_IN_MILLIS = 60 * 1000;\n    private static final long SECOND_IN_MILLIS = 1000;\n\n    /**\n     * 指定模式的时间格式\n     * @param pattern\n     * @return\n     */\n    private static SimpleDateFormat getSdFormat(String pattern) {\n        return new SimpleDateFormat(pattern);\n    }\n\n    /**\n     * 当前日历，这里用中国时间表示\n     *\n     * @return 以当地时区表示的系统当前日历\n     */\n    public static Calendar getCalendar() {\n        return Calendar.getInstance();\n    }\n\n    /**\n     * 指定毫秒数表示的日历\n     *\n     * @param millis 毫秒数\n     * @return 指定毫秒数表示的日历\n     */\n    public static Calendar getCalendar(long millis) {\n        Calendar cal = Calendar.getInstance();\n        // --------------------cal.setTimeInMillis(millis);\n        cal.setTime(new Date(millis));\n        return cal;\n    }\n\n    // ////////////////////////////////////////////////////////////////////////////\n    // getDate\n    // 各种方式获取的Date\n    // ////////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 当前日期\n     *\n     * @return 系统当前时间\n     */\n    public static Date getDate() {\n        return new Date();\n    }\n    \n    \n    /**\n     * 当前日期\n     *\n     * @return 系统当前日期（不带时分秒）\n     */\n    public static LocalDate getLocalDate() {\n        LocalDate today = LocalDate.now();\n        return today;\n    }\n\n    /**\n     * 指定毫秒数表示的日期\n     *\n     * @param millis 毫秒数\n     * @return 指定毫秒数表示的日期\n     */\n    public static Date getDate(long millis) {\n        return new Date(millis);\n    }\n\n    /**\n     * 时间戳转换为字符串\n     *\n     * @param time\n     * @return\n     */\n    public static String timestamptoStr(Timestamp time) {\n        Date date = null;\n        if (null != time) {\n            date = new Date(time.getTime());\n        }\n        return date2Str(date_sdf.get());\n    }\n\n    /**\n     * 字符串转换时间戳\n     *\n     * @param str\n     * @return\n     */\n    public static Timestamp str2Timestamp(String str) {\n        Date date = str2Date(str, date_sdf.get());\n        return new Timestamp(date.getTime());\n    }\n\n    /**\n     * 字符串转换成日期\n     *\n     * @param str\n     * @param sdf\n     * @return\n     */\n    public static Date str2Date(String str, SimpleDateFormat sdf) {\n        if (null == str || \"\".equals(str)) {\n            return null;\n        }\n        Date date = null;\n        try {\n            date = sdf.parse(str);\n            return date;\n        } catch (ParseException e) {\n            e.printStackTrace();\n        }\n        return null;\n    }\n\n    /**\n     * 日期转换为字符串\n     *\n     * @param dateSdf 日期格式\n     * @return 字符串\n     */\n    public static String date2Str(SimpleDateFormat dateSdf) {\n        synchronized (dateSdf) {\n            Date date = getDate();\n            if (null == date) {\n                return null;\n            }\n            return dateSdf.format(date);\n        }\n    }\n\n    /**\n     * 格式化时间\n     *\n     * @param date\n     * @param format\n     * @return\n     */\n    public static String dateformat(String date, String format) {\n        SimpleDateFormat sformat = new SimpleDateFormat(format);\n        Date nowDate = null;\n        try {\n            nowDate = sformat.parse(date);\n        } catch (ParseException e) {\n            // TODO Auto-generated catch block\n            e.printStackTrace();\n        }\n        return sformat.format(nowDate);\n    }\n\n    /**\n     * 日期转换为字符串\n     *\n     * @param date     日期\n     * @param dateSdf 日期格式\n     * @return 字符串\n     */\n    public static String date2Str(Date date, SimpleDateFormat dateSdf) {\n        synchronized (dateSdf) {\n            if (null == date) {\n                return null;\n            }\n            return dateSdf.format(date);\n        }\n    }\n\n    /**\n     * 日期转换为字符串\n     *\n     * @param format 日期格式\n     * @return 字符串\n     */\n    public static String getDate(String format) {\n        Date date = new Date();\n        if (null == date) {\n            return null;\n        }\n        SimpleDateFormat sdf = new SimpleDateFormat(format);\n        return sdf.format(date);\n    }\n\n    /**\n     * 指定毫秒数的时间戳\n     *\n     * @param millis 毫秒数\n     * @return 指定毫秒数的时间戳\n     */\n    public static Timestamp getTimestamp(long millis) {\n        return new Timestamp(millis);\n    }\n\n    /**\n     * 以字符形式表示的时间戳\n     *\n     * @param time 毫秒数\n     * @return 以字符形式表示的时间戳\n     */\n    public static Timestamp getTimestamp(String time) {\n        return new Timestamp(Long.parseLong(time));\n    }\n\n    /**\n     * 系统当前的时间戳\n     *\n     * @return 系统当前的时间戳\n     */\n    public static Timestamp getTimestamp() {\n        return new Timestamp(System.currentTimeMillis());\n    }\n\n    /**\n     * 当前时间，格式 yyyy-MM-dd HH:mm:ss\n     *\n     * @return 当前时间的标准形式字符串\n     */\n    public static String now() {\n        return datetimeFormat.get().format(getCalendar().getTime());\n    }\n\n    /**\n     * 指定日期的时间戳\n     *\n     * @param date 指定日期\n     * @return 指定日期的时间戳\n     */\n    public static Timestamp getTimestamp(Date date) {\n        return new Timestamp(date.getTime());\n    }\n\n    /**\n     * 指定日历的时间戳\n     *\n     * @param cal 指定日历\n     * @return 指定日历的时间戳\n     */\n    public static Timestamp getCalendarTimestamp(Calendar cal) {\n        // ---------------------return new Timestamp(cal.getTimeInMillis());\n        return new Timestamp(cal.getTime().getTime());\n    }\n\n    public static Timestamp gettimestamp() {\n        Date dt = new Date();\n        DateFormat df = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");\n        String nowTime = df.format(dt);\n        java.sql.Timestamp buydate = java.sql.Timestamp.valueOf(nowTime);\n        return buydate;\n    }\n\n    // ////////////////////////////////////////////////////////////////////////////\n    // getMillis\n    // 各种方式获取的Millis\n    // ////////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 系统时间的毫秒数\n     *\n     * @return 系统时间的毫秒数\n     */\n    public static long getMillis() {\n        return System.currentTimeMillis();\n    }\n\n    /**\n     * 指定日历的毫秒数\n     *\n     * @param cal 指定日历\n     * @return 指定日历的毫秒数\n     */\n    public static long getMillis(Calendar cal) {\n        // --------------------return cal.getTimeInMillis();\n        return cal.getTime().getTime();\n    }\n\n    /**\n     * 指定日期的毫秒数\n     *\n     * @param date 指定日期\n     * @return 指定日期的毫秒数\n     */\n    public static long getMillis(Date date) {\n        return date.getTime();\n    }\n\n    /**\n     * 指定时间戳的毫秒数\n     *\n     * @param ts 指定时间戳\n     * @return 指定时间戳的毫秒数\n     */\n    public static long getMillis(Timestamp ts) {\n        return ts.getTime();\n    }\n\n    // ////////////////////////////////////////////////////////////////////////////\n    // formatDate\n    // 将日期按照一定的格式转化为字符串\n    // ////////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 默认方式表示的系统当前日期，具体格式：年-月-日\n     *\n     * @return 默认日期按“年-月-日“格式显示\n     */\n    public static String formatDate() {\n        return date_sdf.get().format(getCalendar().getTime());\n    }\n\n    /**\n     * 默认方式表示的系统当前日期，具体格式：yyyy-MM-dd HH:mm:ss\n     *\n     * @return 默认日期按“yyyy-MM-dd HH:mm:ss“格式显示\n     */\n    public static String formatDateTime() {\n        return datetimeFormat.get().format(getCalendar().getTime());\n    }\n\n    /**\n     * 获取时间字符串\n     */\n    public static String getDataString(SimpleDateFormat formatstr) {\n        synchronized (formatstr) {\n            return formatstr.format(getCalendar().getTime());\n        }\n    }\n\n    /**\n     * 指定日期的默认显示，具体格式：年-月-日\n     *\n     * @param cal 指定的日期\n     * @return 指定日期按“年-月-日“格式显示\n     */\n    public static String formatDate(Calendar cal) {\n        return date_sdf.get().format(cal.getTime());\n    }\n\n    /**\n     * 指定日期的默认显示，具体格式：年-月-日\n     *\n     * @param date 指定的日期\n     * @return 指定日期按“年-月-日“格式显示\n     */\n    public static String formatDate(Date date) {\n        return date_sdf.get().format(date);\n    }\n\n    /**\n     * 指定毫秒数表示日期的默认显示，具体格式：年-月-日\n     *\n     * @param millis 指定的毫秒数\n     * @return 指定毫秒数表示日期按“年-月-日“格式显示\n     */\n    public static String formatDate(long millis) {\n        return date_sdf.get().format(new Date(millis));\n    }\n\n    /**\n     * 默认日期按指定格式显示\n     *\n     * @param pattern 指定的格式\n     * @return 默认日期按指定格式显示\n     */\n    public static String formatDate(String pattern) {\n        return getSdFormat(pattern).format(getCalendar().getTime());\n    }\n\n    /**\n     * 指定日期按指定格式显示\n     *\n     * @param cal     指定的日期\n     * @param pattern 指定的格式\n     * @return 指定日期按指定格式显示\n     */\n    public static String formatDate(Calendar cal, String pattern) {\n        return getSdFormat(pattern).format(cal.getTime());\n    }\n\n    /**\n     * 指定日期按指定格式显示\n     *\n     * @param date    指定的日期\n     * @param pattern 指定的格式\n     * @return 指定日期按指定格式显示\n     */\n    public static String formatDate(Date date, String pattern) {\n        return getSdFormat(pattern).format(date);\n    }\n\n    // ////////////////////////////////////////////////////////////////////////////\n    // formatTime\n    // 将日期按照一定的格式转化为字符串\n    // ////////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 默认方式表示的系统当前日期，具体格式：年-月-日 时：分\n     *\n     * @return 默认日期按“年-月-日 时：分“格式显示\n     */\n    public static String formatTime() {\n        return time_sdf.get().format(getCalendar().getTime());\n    }\n\n    /**\n     * 指定毫秒数表示日期的默认显示，具体格式：年-月-日 时：分\n     *\n     * @param millis 指定的毫秒数\n     * @return 指定毫秒数表示日期按“年-月-日 时：分“格式显示\n     */\n    public static String formatTime(long millis) {\n        return time_sdf.get().format(new Date(millis));\n    }\n\n    /**\n     * 指定日期的默认显示，具体格式：年-月-日 时：分\n     *\n     * @param cal 指定的日期\n     * @return 指定日期按“年-月-日 时：分“格式显示\n     */\n    public static String formatTime(Calendar cal) {\n        return time_sdf.get().format(cal.getTime());\n    }\n\n    /**\n     * 指定日期的默认显示，具体格式：年-月-日 时：分\n     *\n     * @param date 指定的日期\n     * @return 指定日期按“年-月-日 时：分“格式显示\n     */\n    public static String formatTime(Date date) {\n        return time_sdf.get().format(date);\n    }\n\n    // ////////////////////////////////////////////////////////////////////////////\n    // formatShortTime\n    // 将日期按照一定的格式转化为字符串\n    // ////////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 默认方式表示的系统当前日期，具体格式：时：分\n     *\n     * @return 默认日期按“时：分“格式显示\n     */\n    public static String formatShortTime() {\n        return short_time_sdf.get().format(getCalendar().getTime());\n    }\n\n    /**\n     * 指定毫秒数表示日期的默认显示，具体格式：时：分\n     *\n     * @param millis 指定的毫秒数\n     * @return 指定毫秒数表示日期按“时：分“格式显示\n     */\n    public static String formatShortTime(long millis) {\n        return short_time_sdf.get().format(new Date(millis));\n    }\n\n    /**\n     * 指定日期的默认显示，具体格式：时：分\n     *\n     * @param cal 指定的日期\n     * @return 指定日期按“时：分“格式显示\n     */\n    public static String formatShortTime(Calendar cal) {\n        return short_time_sdf.get().format(cal.getTime());\n    }\n\n    /**\n     * 指定日期的默认显示，具体格式：时：分\n     *\n     * @param date 指定的日期\n     * @return 指定日期按“时：分“格式显示\n     */\n    public static String formatShortTime(Date date) {\n        return short_time_sdf.get().format(date);\n    }\n\n    // ////////////////////////////////////////////////////////////////////////////\n    // parseDate\n    // parseCalendar\n    // parseTimestamp\n    // 将字符串按照一定的格式转化为日期或时间\n    // ////////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 根据指定的格式将字符串转换成Date 如输入：2003-11-19 11:20:20将按照这个转成时间\n     *\n     * @param src     将要转换的原始字符窜\n     * @param pattern 转换的匹配格式\n     * @return 如果转换成功则返回转换后的日期\n     * @throws ParseException\n     */\n    public static Date parseDate(String src, String pattern) throws ParseException {\n        return getSdFormat(pattern).parse(src);\n\n    }\n\n    /**\n     * 根据指定的格式将字符串转换成Date 如输入：2003-11-19 11:20:20将按照这个转成时间\n     *\n     * @param src     将要转换的原始字符窜\n     * @param pattern 转换的匹配格式\n     * @return 如果转换成功则返回转换后的日期\n     * @throws ParseException\n     */\n    public static Calendar parseCalendar(String src, String pattern) throws ParseException {\n\n        Date date = parseDate(src, pattern);\n        Calendar cal = Calendar.getInstance();\n        cal.setTime(date);\n        return cal;\n    }\n\n    public static String formatAddDate(String src, String pattern, int amount) throws ParseException {\n        Calendar cal;\n        cal = parseCalendar(src, pattern);\n        cal.add(Calendar.DATE, amount);\n        return formatDate(cal);\n    }\n\n    /**\n     * 根据指定的格式将字符串转换成Date 如输入：2003-11-19 11:20:20将按照这个转成时间\n     *\n     * @param src     将要转换的原始字符窜\n     * @param pattern 转换的匹配格式\n     * @return 如果转换成功则返回转换后的时间戳\n     * @throws ParseException\n     */\n    public static Timestamp parseTimestamp(String src, String pattern) throws ParseException {\n        Date date = parseDate(src, pattern);\n        return new Timestamp(date.getTime());\n    }\n\n    // ////////////////////////////////////////////////////////////////////////////\n    // dateDiff\n    // 计算两个日期之间的差值\n    // ////////////////////////////////////////////////////////////////////////////\n\n    /**\n     * 计算两个时间之间的差值，根据标志的不同而不同\n     *\n     * @param flag   计算标志，表示按照年/月/日/时/分/秒等计算\n     * @param calSrc 减数\n     * @param calDes 被减数\n     * @return 两个日期之间的差值\n     */\n    public static int dateDiff(char flag, Calendar calSrc, Calendar calDes) {\n\n        long millisDiff = getMillis(calSrc) - getMillis(calDes);\n        char year = 'y';\n        char day = 'd';\n        char hour = 'h';\n        char minute = 'm';\n        char second = 's';\n\n        if (flag == year) {\n            return (calSrc.get(Calendar.YEAR) - calDes.get(Calendar.YEAR));\n        }\n\n        if (flag == day) {\n            return (int) (millisDiff / DAY_IN_MILLIS);\n        }\n\n        if (flag == hour) {\n            return (int) (millisDiff / HOUR_IN_MILLIS);\n        }\n\n        if (flag == minute) {\n            return (int) (millisDiff / MINUTE_IN_MILLIS);\n        }\n\n        if (flag == second) {\n            return (int) (millisDiff / SECOND_IN_MILLIS);\n        }\n\n        return 0;\n    }\n\n    public static Long getCurrentTimestamp() {\n        return Long.valueOf(DateUtils.yyyymmddhhmmss.get().format(new Date()));\n    }\n\n    /**\n     * String类型 转换为Date, 如果参数长度为10 转换格式”yyyy-MM-dd“ 如果参数长度为19 转换格式”yyyy-MM-dd\n     * HH:mm:ss“ * @param text String类型的时间值\n     */\n    @Override\n    public void setAsText(String text) throws IllegalArgumentException {\n        if (StringUtils.hasText(text)) {\n            try {\n                int length10 = 10;\n                int length19 = 19;\n                if (text.indexOf(SymbolConstant.COLON) == -1 && text.length() == length10) {\n                    setValue(DateUtils.date_sdf.get().parse(text));\n                } else if (text.indexOf(SymbolConstant.COLON) > 0 && text.length() == length19) {\n                    setValue(DateUtils.datetimeFormat.get().parse(text));\n                } else {\n                    throw new IllegalArgumentException(\"Could not parse date, date format is error \");\n                }\n            } catch (ParseException ex) {\n                IllegalArgumentException iae = new IllegalArgumentException(\"Could not parse date: \" + ex.getMessage());\n                iae.initCause(ex);\n                throw iae;\n            }\n        } else {\n            setValue(null);\n        }\n    }\n\n    public static int getYear() {\n        GregorianCalendar calendar = new GregorianCalendar();\n        calendar.setTime(getDate());\n        return calendar.get(Calendar.YEAR);\n    }\n\n    /**\n     * 将字符串转成时间\n     * @param str\n     * @return\n     */\n    public static Date parseDatetime(String str){\n        try {\n            return datetimeFormat.get().parse(str);\n        }catch (Exception e){\n        }\n        return null;\n    }\n\n    /**\n     * 判断两个时间是否是同一天\n     *\n     * @param date1\n     * @param date2\n     * @return\n     */\n    public static boolean isSameDay(Date date1, Date date2) {\n        if (date1 == null || date2 == null) {\n            return false;\n        }\n        Calendar calendar1 = Calendar.getInstance();\n        calendar1.setTime(date1);\n        Calendar calendar2 = Calendar.getInstance();\n        calendar2.setTime(date2);\n        boolean isSameYear = calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR);\n        boolean isSameMonth = isSameYear && calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH);\n        return isSameMonth && calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH);\n    }\n\n    /**\n     * 计算与当前日期的时间差\n     *\n     * @param targetDate\n     * @return\n     */\n    public static long calculateTimeDifference(Date targetDate) {\n        // 获取当前时间\n        LocalDateTime currentTime = LocalDateTime.now();\n\n        // 将java.util.Date转换为java.time.LocalDateTime\n        LocalDateTime convertedTargetDate = targetDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();\n\n        // 计算时间差\n        Duration duration = Duration.between(currentTime, convertedTargetDate);\n\n        // 获取时间差的毫秒数\n        long timeDifferenceInMillis = duration.toMillis();\n\n        return timeDifferenceInMillis;\n    }\n\n    /**\n     * 计算与当前日期的日期天数差\n     *\n     * @param targetDate\n     * @return\n     */\n    public static long calculateDaysDifference(Date targetDate) {\n        // 获取当前日期\n        LocalDate currentDate = LocalDate.now();\n        // 将java.util.Date转换为java.time.LocalDate\n        LocalDate convertedTargetDate = targetDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();\n        // 计算日期差\n        long daysDifference = ChronoUnit.DAYS.between(currentDate, convertedTargetDate);\n        return daysDifference;\n    }\n\n    /**\n     * 判断两个时间是否是同一周\n     *\n     * @param date1\n     * @param date2\n     * @return\n     */\n    public static boolean isSameWeek(Date date1, Date date2) {\n        if (date1 == null || date2 == null) {\n            return false;\n        }\n        Calendar calendar1 = Calendar.getInstance();\n        calendar1.setTime(date1);\n        Calendar calendar2 = Calendar.getInstance();\n        calendar2.setTime(date2);\n        boolean isSameYear = calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR);\n        return isSameYear && calendar1.get(Calendar.WEEK_OF_YEAR) == calendar2.get(Calendar.WEEK_OF_YEAR);\n    }\n\n    /**\n     * 判断两个时间是否是同一月\n     *\n     * @param date1\n     * @param date2\n     * @return\n     */\n    public static boolean isSameMonth(Date date1, Date date2) {\n        if (date1 == null || date2 == null) {\n            return false;\n        }\n        Calendar calendar1 = Calendar.getInstance();\n        calendar1.setTime(date1);\n        Calendar calendar2 = Calendar.getInstance();\n        calendar2.setTime(date2);\n        boolean isSameYear = calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR);\n        return isSameYear && calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH);\n    }\n\n    /**\n     * 判断两个时间是否是同一年\n     *\n     * @param date1\n     * @param date2\n     * @return\n     */\n    public static boolean isSameYear(Date date1, Date date2) {\n        if (date1 == null || date2 == null) {\n            return false;\n        }\n        Calendar calendar1 = Calendar.getInstance();\n        calendar1.setTime(date1);\n        Calendar calendar2 = Calendar.getInstance();\n        calendar2.setTime(date2);\n        return calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR);\n    }\n\n    /**\n     * 获取两个日期之间的所有日期列表，包含开始和结束日期\n     *\n     * @param begin\n     * @param end\n     * @return\n     */\n    public static List<Date> getDateRangeList(Date begin, Date end) {\n        List<Date> dateList = new ArrayList<>();\n        if (begin == null || end == null) {\n            return dateList;\n        }\n\n        // 清除时间部分，只比较日期\n        Calendar beginCal = Calendar.getInstance();\n        beginCal.setTime(begin);\n        beginCal.set(Calendar.HOUR_OF_DAY, 0);\n        beginCal.set(Calendar.MINUTE, 0);\n        beginCal.set(Calendar.SECOND, 0);\n        beginCal.set(Calendar.MILLISECOND, 0);\n\n        Calendar endCal = Calendar.getInstance();\n        endCal.setTime(end);\n        endCal.set(Calendar.HOUR_OF_DAY, 0);\n        endCal.set(Calendar.MINUTE, 0);\n        endCal.set(Calendar.SECOND, 0);\n        endCal.set(Calendar.MILLISECOND, 0);\n\n        if (endCal.before(beginCal)) {\n            return dateList;\n        }\n\n        dateList.add(beginCal.getTime());\n        while (beginCal.before(endCal)) {\n            beginCal.add(Calendar.DAY_OF_YEAR, 1);\n            dateList.add(beginCal.getTime());\n        }\n        return dateList;\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DySmsHelper.java",
    "content": "package org.jeecg.common.util;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.alibaba.fastjson.JSONObject;\nimport com.aliyuncs.DefaultAcsClient;\nimport com.aliyuncs.IAcsClient;\nimport com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;\nimport com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;\nimport com.aliyuncs.exceptions.ClientException;\nimport com.aliyuncs.profile.DefaultProfile;\nimport com.aliyuncs.profile.IClientProfile;\nimport org.apache.commons.lang3.StringUtils;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.enums.DySmsEnum;\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.jeecg.config.JeecgSmsTemplateConfig;\nimport org.jeecg.config.StaticConfig;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport java.util.Map;\n\n/**\n * Created on 17/6/7.\n * 短信API产品的DEMO程序,工程中包含了一个SmsDemo类，直接通过\n * 执行main函数即可体验短信产品API功能(只需要将AK替换成开通了云通信-短信产品功能的AK即可)\n * 工程依赖了2个jar包(存放在工程的libs目录下)\n * 1:aliyun-java-sdk-core.jar\n * 2:aliyun-java-sdk-dysmsapi.jar\n *\n * 备注:Demo工程编码采用UTF-8\n * 国际短信发送请勿参照此DEMO\n * @author: jeecg-boot\n */\npublic class DySmsHelper {\n\t\n\tprivate final static Logger logger=LoggerFactory.getLogger(DySmsHelper.class);\n\n    /**产品名称:云通信短信API产品,开发者无需替换*/\n    static final String PRODUCT = \"Dysmsapi\";\n    /**产品域名,开发者无需替换*/\n    static final String DOMAIN = \"dysmsapi.aliyuncs.com\";\n\n    /**TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)*/\n    static  String accessKeyId;\n    static  String accessKeySecret;\n\n    public static void setAccessKeyId(String accessKeyId) {\n        DySmsHelper.accessKeyId = accessKeyId;\n    }\n\n    public static void setAccessKeySecret(String accessKeySecret) {\n        DySmsHelper.accessKeySecret = accessKeySecret;\n    }\n\n    public static String getAccessKeyId() {\n        return accessKeyId;\n    }\n\n    public static String getAccessKeySecret() {\n        return accessKeySecret;\n    }\n    \n    \n    public static boolean sendSms(String phone, JSONObject templateParamJson, DySmsEnum dySmsEnum) throws ClientException {\n        JeecgBaseConfig config = SpringContextUtils.getBean(JeecgBaseConfig.class);\n        String smsSendType = config.getSmsSendType();\n        if(oConvertUtils.isNotEmpty(smsSendType) && CommonConstant.SMS_SEND_TYPE_TENCENT.equals(smsSendType)){\n            return TencentSms.sendTencentSms(phone, templateParamJson, config.getTencent(), dySmsEnum);\n        }\n        //可自助调整超时时间\n        System.setProperty(\"sun.net.client.defaultConnectTimeout\", \"10000\");\n        System.setProperty(\"sun.net.client.defaultReadTimeout\", \"10000\");\n\n        // 代码逻辑说明: 配置类数据获取\n        StaticConfig staticConfig = SpringContextUtils.getBean(StaticConfig.class);\n        //logger.info(\"阿里大鱼短信秘钥 accessKeyId：\" + staticConfig.getAccessKeyId());\n        //logger.info(\"阿里大鱼短信秘钥 accessKeySecret：\"+ staticConfig.getAccessKeySecret());\n        setAccessKeyId(staticConfig.getAccessKeyId());\n        setAccessKeySecret(staticConfig.getAccessKeySecret());\n        \n        //初始化acsClient,暂不支持region化\n        IClientProfile profile = DefaultProfile.getProfile(\"cn-hangzhou\", accessKeyId, accessKeySecret);\n        DefaultProfile.addEndpoint(\"cn-hangzhou\", \"cn-hangzhou\", PRODUCT, DOMAIN);\n        IAcsClient acsClient = new DefaultAcsClient(profile);\n        \n        //验证json参数\n        validateParam(templateParamJson,dySmsEnum);\n\n        // 代码逻辑说明: 【QQYUN-9422】短信模板管理，阿里云---\n        String templateCode = dySmsEnum.getTemplateCode();\n        JeecgSmsTemplateConfig baseConfig = SpringContextUtils.getBean(JeecgSmsTemplateConfig.class);\n        if(baseConfig != null && CollectionUtil.isNotEmpty(baseConfig.getTemplateCode())){\n            Map<String, String> smsTemplate = baseConfig.getTemplateCode();\n            if(smsTemplate.containsKey(templateCode) && StringUtils.isNotEmpty(smsTemplate.get(templateCode))){\n                templateCode = smsTemplate.get(templateCode);   \n                logger.info(\"yml中读取短信code{}\",templateCode);\n            }\n        }\n        //签名名称\n        String signName = dySmsEnum.getSignName();\n        if(baseConfig != null && StringUtils.isNotEmpty(baseConfig.getSignature())){\n            logger.info(\"yml中读取签名名称{}\",baseConfig.getSignature());\n            signName = baseConfig.getSignature();\n        }\n        \n        //组装请求对象-具体描述见控制台-文档部分内容\n        SendSmsRequest request = new SendSmsRequest();\n        //必填:待发送手机号\n        request.setPhoneNumbers(phone);\n        //必填:短信签名-可在短信控制台中找到\n        request.setSignName(signName);\n        //必填:短信模板-可在短信控制台中找到\n        request.setTemplateCode(templateCode);\n        //可选:模板中的变量替换JSON串,如模板内容为\"亲爱的${name},您的验证码为${code}\"时,此处的值为\n        request.setTemplateParam(templateParamJson.toJSONString());\n        \n        //选填-上行短信扩展码(无特殊需求用户请忽略此字段)\n        //request.setSmsUpExtendCode(\"90997\");\n\n        //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者\n        //request.setOutId(\"yourOutId\");\n\n        boolean result = false;\n\n        //hint 此处可能会抛出异常，注意catch\n        SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);\n        logger.info(\"短信接口返回的数据----------------\");\n        logger.info(\"{Code:\" + sendSmsResponse.getCode()+\",Message:\" + sendSmsResponse.getMessage()+\",RequestId:\"+ sendSmsResponse.getRequestId()+\",BizId:\"+sendSmsResponse.getBizId()+\"}\");\n        String ok = \"OK\";\n        if (ok.equals(sendSmsResponse.getCode())) {\n            result = true;\n        }\n        return result;\n        \n    }\n    \n    private static void validateParam(JSONObject templateParamJson,DySmsEnum dySmsEnum) {\n    \tString keys = dySmsEnum.getKeys();\n    \tString [] keyArr = keys.split(\",\");\n    \tfor(String item :keyArr) {\n    \t\tif(!templateParamJson.containsKey(item)) {\n    \t\t\tthrow new RuntimeException(\"模板缺少参数：\"+item);\n    \t\t}\n    \t}\n    }\n    \n\n//    public static void main(String[] args) throws ClientException, InterruptedException {\n//    \tJSONObject obj = new JSONObject();\n//    \tobj.put(\"code\", \"1234\");\n//    \tsendSms(\"13800138000\", obj, DySmsEnum.FORGET_PASSWORD_TEMPLATE_CODE);\n//    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DySmsLimit.java",
    "content": "package org.jeecg.common.util;\n\nimport lombok.extern.slf4j.Slf4j;\n\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * 防止刷短信接口（只针对绑定手机号模板：SMS_175430166）\n * \n * 1、同一IP，1分钟内发短信不允许超过5次（每一分钟重置每个IP请求次数）\n * 2、同一IP，1分钟内发短信超过20次，进入黑名单，不让使用短信接口\n * \n * 3、短信接口加签和时间戳\n *  涉及接口：\n *  /sys/sms\n *  /desform/api/sendVerifyCode\n *  /sys/sendChangePwdSms\n */\n@Slf4j\npublic class DySmsLimit {\n\n    // 1分钟内最大发短信数量（单一IP）\n    private static final int MAX_MESSAGE_PER_MINUTE = 5;\n    // 1分钟\n    private static final int MILLIS_PER_MINUTE = 60000;\n    // 一分钟内报警线最大短信数量，超了进黑名单（单一IP）\n    private static final int MAX_TOTAL_MESSAGE_PER_MINUTE = 20;\n\n    private static ConcurrentHashMap<String, Long> ipLastRequestTime = new ConcurrentHashMap<>();\n    private static ConcurrentHashMap<String, Integer> ipRequestCount = new ConcurrentHashMap<>();\n    private static ConcurrentHashMap<String, Boolean> ipBlacklist = new ConcurrentHashMap<>();\n\n    /**\n     * @param ip 请求发短信的IP地址\n     * @return\n     */\n    public static boolean canSendSms(String ip) {\n        long currentTime = System.currentTimeMillis();\n        long lastRequestTime = ipLastRequestTime.getOrDefault(ip, 0L);\n        int requestCount = ipRequestCount.getOrDefault(ip, 0);\n        log.info(\"IP：{}, Msg requestCount：{} \", ip, requestCount);\n\n        if (ipBlacklist.getOrDefault(ip, false)) {\n            // 如果IP在黑名单中，则禁止发送短信\n            log.error(\"IP：{}, 进入黑名单，禁止发送请求短信！\", ip);\n            return false;\n        }\n\n        if (currentTime - lastRequestTime >= MILLIS_PER_MINUTE) {\n            // 如果距离上次请求已经超过一分钟，则重置计数\n            ipRequestCount.put(ip, 1);\n            ipLastRequestTime.put(ip, currentTime);\n            return true;\n        } else {\n            // 如果距离上次请求不到一分钟\n            ipRequestCount.put(ip, requestCount + 1);\n            if (requestCount < MAX_MESSAGE_PER_MINUTE) {\n                // 如果请求次数小于5次，允许发送短信\n                return true;\n            } else if (requestCount >= MAX_TOTAL_MESSAGE_PER_MINUTE) {\n                // 如果请求次数超过报警线短信数量，将IP加入黑名单\n                ipBlacklist.put(ip, true);\n                return false;\n            } else {\n                log.error(\"IP：{}, 1分钟内请求短信超过5次，请稍后重试！\", ip);\n                return false;\n            }\n        }\n    }\n\n    /**\n     * 图片二维码验证成功之后清空数量\n     * \n     * @param ip IP地址\n     */\n    public static void clearSendSmsCount(String ip) {\n        long currentTime = System.currentTimeMillis();\n        ipRequestCount.put(ip, 0);\n        ipLastRequestTime.put(ip, currentTime);\n    }\n    \n//    public static void main(String[] args) {\n//        String ip = \"192.168.1.1\";\n//        for (int i = 1; i < 50; i++) {\n//            if (canSendSms(ip)) {\n//                System.out.println(\"Send SMS successfully\");\n//            } else {\n//                //System.out.println(\"Exceed SMS limit for IP \" + ip);\n//            }\n//        }\n//\n//        System.out.println(ipLastRequestTime);\n//        System.out.println(ipRequestCount);\n//        System.out.println(ipBlacklist);\n//    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/FileDownloadUtils.java",
    "content": "package org.jeecg.common.util;\n\nimport cn.hutool.core.io.IoUtil;\nimport jakarta.servlet.http.HttpServletResponse;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.compress.archivers.zip.ZipArchiveEntry;\nimport org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;\nimport org.apache.commons.io.FilenameUtils;\nimport org.apache.commons.io.IOUtils;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.util.filter.SsrfFileTypeFilter;\n\nimport java.io.*;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\nimport java.net.URLConnection;\nimport java.net.URLEncoder;\nimport java.nio.charset.StandardCharsets;\nimport java.nio.file.Files;\nimport java.util.List;\nimport java.util.zip.ZipEntry;\nimport java.util.zip.ZipOutputStream;\n\n/**\n * @program: file\n * @description: 文件下载\n * @author: chenrui\n * @date: 2019-05-24 16:34\n **/\n@Slf4j\npublic class FileDownloadUtils {\n\n    /**\n     * 单文件下载\n     *\n     * @param response\n     * @param storePath 下载文件储存地址\n     * @param fileName  文件名称\n     * @author: chenrui\n     * @date: 2019/5/24 17:10\n     */\n    public static void downloadFile(HttpServletResponse response, String storePath, String fileName) {\n        response.setCharacterEncoding(\"UTF-8\");\n        File file = new File(storePath);\n        if (!file.exists()) {\n            throw new NullPointerException(\"Specified file not found\");\n        }\n        if (fileName == null || fileName.isEmpty()) {\n            throw new NullPointerException(\"The file name can not null\");\n        }\n        // 配置文件下载\n        response.setHeader(\"content-type\", \"application/octet-stream\");\n        response.setContentType(\"application/octet-stream\");\n        // 下载文件能正常显示中文\n        try {\n            response.setHeader(\"Content-Disposition\", \"attachment;filename=\" + URLEncoder.encode(fileName, \"UTF-8\"));\n            response.setHeader(\"Access-Control-Expose-Headers\", \"Content-Disposition\");\n        } catch (UnsupportedEncodingException e) {\n            log.error(e.getMessage(), e);\n        }\n        // 实现文件下载\n        byte[] buffer = new byte[1024];\n        try (FileInputStream fis = new FileInputStream(file);\n             BufferedInputStream bis = new BufferedInputStream(fis);) {\n            OutputStream os = response.getOutputStream();\n            int i = bis.read(buffer);\n            while (i != -1) {\n                os.write(buffer, 0, i);\n                i = bis.read(buffer);\n            }\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n        }\n    }\n\n    /**\n     * 多文件下载\n     *\n     * @param filesPath   下载文件集合\n     * @param zipFileName 多文件合称名\n     * @author: chenrui\n     * @date: 2019/5/24 17:48\n     */\n    public static void downloadFileMulti(HttpServletResponse response, List<String> filesPath, String zipFileName) throws IOException {\n        //设置压缩包的名字\n        String downloadName = zipFileName + \".zip\";\n        response.setCharacterEncoding(\"UTF-8\");\n        response.setHeader(\"content-type\", \"application/octet-stream\");\n        response.setContentType(\"application/octet-stream\");\n        response.setHeader(\"Content-Disposition\", \"attachment;filename=\" + URLEncoder.encode(downloadName, \"UTF-8\"));\n        response.setHeader(\"Access-Control-Expose-Headers\", \"Content-Disposition\");\n\n        log.info(\"开始压缩文件:\" + filesPath);\n        //设置压缩流：直接写入response，实现边压缩边下载\n        try (ZipOutputStream zipOut = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));\n             DataOutputStream os = new DataOutputStream(zipOut);) {\n            //设置压缩方法\n            zipOut.setMethod(ZipOutputStream.DEFLATED);\n            for (String filePath : filesPath) {\n                //循环将文件写入压缩流\n                File file = new File(filePath);\n                if (file.exists()) {\n                    //添加ZipEntry，并ZipEntry中写入文件流也就是将文件压入zip文件的目录下\n                    String fileName = file.getName();\n                    zipOut.putNextEntry(new ZipEntry(fileName));\n                    //格式输出流文件\n\n                    InputStream is = Files.newInputStream(file.toPath());\n                    byte[] b = new byte[1024];\n                    int length;\n                    while ((length = is.read(b)) != -1) {\n                        os.write(b, 0, length);\n                    }\n                    is.close();\n                    zipOut.closeEntry();\n                }\n            }\n        } catch (IOException e) {\n            log.error(e.getMessage(), e);\n            throw new JeecgBootException(e);\n        }\n    }\n\n    /**\n     * 下载网络资源到磁盘\n     *\n     * @param fileUrl\n     * @param storePath\n     * @author chenrui\n     * @date 2024/1/19 10:09\n     */\n    public static String download2DiskFromNet(String fileUrl, String storePath) {\n        try {\n            URL url = new URL(fileUrl);\n            URLConnection conn = url.openConnection();\n            // 设置超时间为3秒\n            conn.setConnectTimeout(3 * 1000);\n            // 防止屏蔽程序\n            conn.setRequestProperty(\"User-Agent\", \"Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)\");\n            // 确保目录存在\n            File file = ensureDestFileDir(storePath);\n            try (InputStream inStream = conn.getInputStream();\n                 FileOutputStream fs = new FileOutputStream(file);) {\n                int byteread;\n                byte[] buffer = new byte[1204];\n                while ((byteread = inStream.read(buffer)) != -1) {\n                    fs.write(buffer, 0, byteread);\n                }\n                return storePath;\n            } catch (IOException e) {\n                log.error(e.getMessage(), e);\n                throw new JeecgBootException(e);\n            }\n        } catch (IOException e) {\n            log.error(e.getMessage(), e);\n            throw new JeecgBootException(e);\n        }\n    }\n\n\n    /**\n     * 获取不重名的文件\n     *\n     * @param file\n     * @return\n     * @author chenrui\n     * @date 2017年5月24日下午6:29:13\n     * @version v0.0.1\n     */\n    public static File getUniqueFile(final File file) {\n        if (!file.exists()) {\n            return file;\n        }\n\n        File tmpFile = new File(file.getAbsolutePath());\n        File parentDir = tmpFile.getParentFile();\n        int count = 1;\n        String extension = FilenameUtils.getExtension(tmpFile.getName());\n        String baseName = FilenameUtils.getBaseName(tmpFile.getName());\n        do {\n            tmpFile = new File(parentDir, baseName + \"(\" + count++ + \").\" + extension);\n        } while (tmpFile.exists());\n        return tmpFile;\n    }\n\n    /**\n     * 确保输出文件目录\n     *\n     * @param destFilePath\n     * @return\n     * @author: chenrui\n     * @date: 2019-05-21 16:49\n     */\n    private static File ensureDestFileDir(String destFilePath) {\n        File destFile = new File(destFilePath);\n        FileDownloadUtils.checkDirAndCreate(destFile.getParentFile());\n        return destFile;\n    }\n\n    /**\n     * 验证文件夹存在且创建目录\n     *\n     * @param dir\n     * @author chenrui\n     * @date 2017年5月24日下午6:29:24\n     * @version v0.0.1\n     */\n    public static void checkDirAndCreate(File dir) {\n        if (!dir.exists()) {\n            dir.mkdirs();\n        }\n    }\n\n\n    /**\n     * 下载单个文件到ZIP流\n     * 核心功能：获取文件流，写入ZIP条目\n     * @param fileUrl 文件URL（可以是HTTP URL或本地路径）\n     * @param fileName ZIP内的文件名\n     * @param zous ZIP输出流\n     */\n    public static void downLoadSingleFile(String fileUrl, String fileName, String uploadUrl,ZipArchiveOutputStream zous) {\n        InputStream inputStream = null;\n        try {\n            // 创建ZIP条目：每个文件在ZIP中都是一个独立条目\n            ZipArchiveEntry entry = new ZipArchiveEntry(fileName);\n            zous.putArchiveEntry(entry);\n\n            // 获取文件输入流：区分普通文件和快捷方式\n            if (fileUrl.endsWith(\".url\")) {\n                // 处理快捷方式：生成.url文件内容\n                inputStream = FileDownloadUtils.createInternetShortcut(fileName, fileUrl, \"\");\n            } else {\n                // 普通文件下载：从URL或本地路径获取流\n                inputStream = getDownInputStream(fileUrl,uploadUrl);\n            }\n\n            if (inputStream != null) {\n                // 将文件流写入ZIP\n                IOUtils.copy(inputStream, zous);\n            }\n            // 关闭当前ZIP条目\n            zous.closeArchiveEntry();\n        } catch (IOException e) {\n            log.error(\"文件下载失败: {}\",  e);\n        } finally {\n            // 确保输入流关闭\n            IoUtil.close(inputStream);\n        }\n    }\n\n    /**\n     * 获取下载文件输入流\n     * 功能：根据URL类型（HTTP或本地）获取文件流\n     * @param fileUrl 文件URL（支持HTTP和本地路径）\n     * @return 文件输入流，失败返回null\n     */\n    public static InputStream getDownInputStream(String fileUrl, String uploadUrl) {\n        try {\n            // 处理HTTP URL：通过网络下载\n            if (oConvertUtils.isNotEmpty(fileUrl) && fileUrl.startsWith(CommonConstant.STR_HTTP)) {\n                URL url = new URL(fileUrl);\n                HttpURLConnection connection = (HttpURLConnection) url.openConnection();\n                connection.setConnectTimeout(5000); // 连接超时5秒\n                connection.setReadTimeout(30000);  // 读取超时30秒\n                return connection.getInputStream();\n            } else {\n                // 处理本地文件：直接读取文件系统\n                String downloadFilePath = uploadUrl + File.separator + fileUrl;\n                // 安全检查：防止下载危险文件类型\n                SsrfFileTypeFilter.checkDownloadFileType(downloadFilePath);\n                return new BufferedInputStream(new FileInputStream(downloadFilePath));\n            }\n        } catch (IOException e) {\n            // 异常时返回null，上层会处理空流情况\n            return null;\n        }\n    }\n\n    /**\n     * 获取文件扩展名\n     * 功能：从文件名中提取扩展名\n     * @param fileName 文件名\n     * @return 文件扩展名（不含点），如\"txt\"、\"png\"\n     */\n    public static String getFileExtension(String fileName) {\n        int dotIndex = fileName.lastIndexOf('.');\n        return (dotIndex == -1) ? \"\" : fileName.substring(dotIndex + 1);\n    }\n\n    /**\n     * 创建快捷方式（.url文件内容）\n     * 功能：生成Internet快捷方式文件内容\n     * @param name 快捷方式名称\n     * @param url 目标URL地址\n     * @param icon 图标路径（可选）\n     * @return 包含.url文件内容的输入流\n     */\n    public static InputStream createInternetShortcut(String name, String url, String icon) {\n        StringWriter sw = new StringWriter();\n        try {\n            // 按照Windows快捷方式格式写入内容\n            sw.write(\"[InternetShortcut]\\n\");\n            sw.write(\"URL=\" + url + \"\\n\");\n            if (oConvertUtils.isNotEmpty(icon)) {\n                sw.write(\"IconFile=\" + icon + \"\\n\");\n            }\n            // 将字符串内容转换为输入流\n            return new ByteArrayInputStream(sw.toString().getBytes(StandardCharsets.UTF_8));\n        } finally {\n            IoUtil.close(sw);\n        }\n    }\n    /**\n     * 从URL中提取文件名\n     * 功能：从HTTP URL或本地路径中提取纯文件名\n     * @param fileUrl 文件URL\n     * @return 文件名（不含路径）\n     */\n    public static String getFileNameFromUrl(String fileUrl) {\n        try {\n            // 处理HTTP URL：从路径部分提取文件名\n            if (fileUrl.startsWith(CommonConstant.STR_HTTP)) {\n                URL url = new URL(fileUrl);\n                String path = url.getPath();\n                return path.substring(path.lastIndexOf('/') + 1);\n            }\n\n            // 处理本地文件路径：从文件路径提取文件名\n            return fileUrl.substring(fileUrl.lastIndexOf(File.separator) + 1);\n        } catch (Exception e) {\n            // 如果解析失败，使用时间戳作为文件名\n            return \"file_\" + System.currentTimeMillis();\n        }\n    }\n    /**\n     * 生成ZIP中的文件名\n     * 功能：避免文件名冲突，为多个文件添加序号\n     * @param fileUrl 文件URL（用于提取原始文件名）\n     * @param index 文件序号（从0开始）\n     * @param total 文件总数\n     * @return 处理后的文件名（带序号）\n     */\n    public static String generateFileName(String fileUrl, int index, int total) {\n        // 从URL中提取原始文件名\n        String originalFileName = getFileNameFromUrl(fileUrl);\n\n        // 如果只有一个文件，直接使用原始文件名\n        if (total == 1) {\n            return originalFileName;\n        }\n\n        // 多个文件时，使用序号+原始文件名\n        String extension = getFileExtension(originalFileName);\n        String nameWithoutExtension = originalFileName.replace(\".\" + extension, \"\");\n\n        return String.format(\"%s_%d.%s\", nameWithoutExtension, index + 1, extension);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/FillRuleUtil.java",
    "content": "package org.jeecg.common.util;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport jakarta.servlet.http.HttpServletRequest;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.handler.IFillRuleHandler;\nimport org.jeecg.common.system.query.QueryGenerator;\n\n\n\n/**\n * 规则值自动生成工具类\n *\n * @author qinfeng\n * @举例： 自动生成订单号；自动生成当前日期\n */\n@Slf4j\npublic class FillRuleUtil {\n\n    /**\n     * @param ruleCode ruleCode\n     * @return\n     */\n    @SuppressWarnings(\"unchecked\")\n    public static Object executeRule(String ruleCode, JSONObject formData) {\n        if (!StringUtils.isEmpty(ruleCode)) {\n            try {\n                // 获取 Service\n                ServiceImpl impl = (ServiceImpl) SpringContextUtils.getBean(\"sysFillRuleServiceImpl\");\n                // 根据 ruleCode 查询出实体\n                QueryWrapper queryWrapper = new QueryWrapper();\n                queryWrapper.eq(\"rule_code\", ruleCode);\n                JSONObject entity = JSON.parseObject(JSON.toJSONString(impl.getOne(queryWrapper)));\n                if (entity == null) {\n                    log.warn(\"填值规则：\" + ruleCode + \" 不存在\");\n                    return null;\n                }\n                // 获取必要的参数\n                String ruleClass = entity.getString(\"ruleClass\");\n                JSONObject params = entity.getJSONObject(\"ruleParams\");\n                if (params == null) {\n                    params = new JSONObject();\n                }\n\n                HttpServletRequest request = SpringContextUtils.getHttpServletRequest();\n\n                // 解析 params 中的变量\n                // 优先级：queryString > 系统变量 > 默认值\n                for (String key : params.keySet()) {\n                    // 1. 判断 queryString 中是否有该参数，如果有就优先取值\n                    //noinspection ConstantValue\n                    if (request != null) {\n                        String parameter = request.getParameter(key);\n                        if (oConvertUtils.isNotEmpty(parameter)) {\n                            params.put(key, parameter);\n                            continue;\n                        }\n                    }\n\n                    String value = params.getString(key);\n                    // 2. 用于替换 系统变量的值 #{sys_user_code}\n                    if (value != null && value.contains(SymbolConstant.SYS_VAR_PREFIX)) {\n                        value = QueryGenerator.getSqlRuleValue(value);\n                        params.put(key, value);\n                    }\n                }\n\n                if (formData == null) {\n                    formData = new JSONObject();\n                }\n                // 通过反射执行配置的类里的方法\n                IFillRuleHandler ruleHandler = (IFillRuleHandler) Class.forName(ruleClass).newInstance();\n                return ruleHandler.execute(params, formData);\n            } catch (Exception e) {\n                e.printStackTrace();\n            }\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/HTMLUtils.java",
    "content": "package org.jeecg.common.util;\n\nimport org.apache.commons.lang3.StringUtils;\nimport org.commonmark.node.Node;\nimport org.commonmark.parser.Parser;\nimport org.commonmark.renderer.html.HtmlRenderer;\nimport org.springframework.web.util.HtmlUtils;\n\n/**\n * HTML 工具类\n * @author: jeecg-boot\n * @date: 2022/3/30 14:43\n */\n@SuppressWarnings(\"AlibabaClassNamingShouldBeCamel\")\npublic class HTMLUtils {\n\n    /**\n     * 获取HTML内的文本，不包含标签\n     *\n     * @param html HTML 代码\n     */\n    public static String getInnerText(String html) {\n        if (StringUtils.isNotBlank(html)) {\n            //去掉 html 的标签\n            String content = html.replaceAll(\"</?[^>]+>\", \"\");\n            // 将多个空格合并成一个空格\n            content = content.replaceAll(\"(&nbsp;)+\", \"&nbsp;\");\n            // 反向转义字符\n            content = HtmlUtils.htmlUnescape(content);\n            return content.trim();\n        }\n        return \"\";\n    }\n\n    /**\n     * 将Markdown解析成Html\n     * @param markdownContent\n     * @return\n     */\n    public static String parseMarkdown(String markdownContent) {\n        /*PegDownProcessor pdp = new PegDownProcessor();\n        return pdp.markdownToHtml(markdownContent);*/\n        Parser parser = Parser.builder().build();\n        Node document = parser.parse(markdownContent);\n        HtmlRenderer renderer = HtmlRenderer.builder().build();\n        return renderer.render(document);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/ImportExcelUtil.java",
    "content": "package org.jeecg.common.util;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.List;\n\n/**\n * 导出返回信息\n * @author: jeecg-boot\n */\n@Slf4j\npublic class ImportExcelUtil {\n\n    public static Result<?> imporReturnRes(int errorLines,int successLines,List<String> errorMessage) throws IOException {\n        if (errorLines == 0) {\n            return Result.ok(\"共\" + successLines + \"行数据全部导入成功！\");\n        } else {\n            JSONObject result = new JSONObject(5);\n            int totalCount = successLines + errorLines;\n            result.put(\"totalCount\", totalCount);\n            result.put(\"errorCount\", errorLines);\n            result.put(\"successCount\", successLines);\n            result.put(\"msg\", \"总上传行数：\" + totalCount + \"，已导入行数：\" + successLines + \"，错误行数：\" + errorLines);\n            String fileUrl = PmsUtil.saveErrorTxtByList(errorMessage, \"userImportExcelErrorLog\");\n            int lastIndex = fileUrl.lastIndexOf(File.separator);\n            String fileName = fileUrl.substring(lastIndex + 1);\n            result.put(\"fileUrl\", \"/sys/common/static/\" + fileUrl);\n            result.put(\"fileName\", fileName);\n            Result res = Result.ok(result);\n            res.setCode(201);\n            res.setMessage(\"文件导入成功，但有错误。\");\n            return res;\n        }\n    }\n\n    public static List<String> importDateSave(List<?> list, Class serviceClass, List<String> errorMessage, String errorFlag)  {\n        IService bean =(IService) SpringContextUtils.getBean(serviceClass);\n        for (int i = 0; i < list.size(); i++) {\n            try {\n                boolean save = bean.save(list.get(i));\n                if(!save){\n                    throw new Exception(errorFlag);\n                }\n            } catch (Exception e) {\n                String message = e.getMessage().toLowerCase();\n                int lineNumber = i + 1;\n                // 通过索引名判断出错信息\n                if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_ROLE_CODE)) {\n                    errorMessage.add(\"第 \" + lineNumber + \" 行：角色编码已经存在，忽略导入。\");\n                } else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_JOB_CLASS_NAME)) {\n                    errorMessage.add(\"第 \" + lineNumber + \" 行：任务类名已经存在，忽略导入。\");\n                }else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_CODE)) {\n                    errorMessage.add(\"第 \" + lineNumber + \" 行：职务编码已经存在，忽略导入。\");\n                }else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_DEPART_ORG_CODE)) {\n                    errorMessage.add(\"第 \" + lineNumber + \" 行：部门编码已经存在，忽略导入。\");\n                }else {\n                    errorMessage.add(\"第 \" + lineNumber + \" 行：未知错误，忽略导入\");\n                    log.error(e.getMessage(), e);\n                }\n            }\n        }\n        return errorMessage;\n    }\n\n    public static List<String> importDateSaveOne(Object obj, Class serviceClass,List<String> errorMessage,int i,String errorFlag)  {\n        IService bean =(IService) SpringContextUtils.getBean(serviceClass);\n        try {\n            boolean save = bean.save(obj);\n            if(!save){\n                throw new Exception(errorFlag);\n            }\n        } catch (Exception e) {\n            String message = e.getMessage().toLowerCase();\n            int lineNumber = i + 1;\n            // 通过索引名判断出错信息\n            if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_ROLE_CODE)) {\n                errorMessage.add(\"第 \" + lineNumber + \" 行：角色编码已经存在，忽略导入。\");\n            } else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_JOB_CLASS_NAME)) {\n                errorMessage.add(\"第 \" + lineNumber + \" 行：任务类名已经存在，忽略导入。\");\n            }else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_CODE)) {\n                errorMessage.add(\"第 \" + lineNumber + \" 行：职务编码已经存在，忽略导入。\");\n            }else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_DEPART_ORG_CODE)) {\n                errorMessage.add(\"第 \" + lineNumber + \" 行：部门编码已经存在，忽略导入。\");\n            }else {\n                errorMessage.add(\"第 \" + lineNumber + \" 行：未知错误，忽略导入\");\n                log.error(e.getMessage(), e);\n            }\n        }\n        return errorMessage;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/IpUtils.java",
    "content": "package org.jeecg.common.util;\n\nimport jakarta.servlet.http.HttpServletRequest;\n\nimport org.apache.commons.lang3.StringUtils;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport java.net.InetAddress;\nimport java.net.UnknownHostException;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\n/**\n * IP地址\n * \n * @Author scott\n * @email jeecgos@163.com\n * @Date 2019年01月14日\n */\npublic class IpUtils {\n\tprivate static Logger logger = LoggerFactory.getLogger(IpUtils.class);\n\n\t/**\n\t * 获取IP地址\n\t * \n\t * 使用Nginx等反向代理软件， 则不能通过request.getRemoteAddr()获取IP地址\n\t * 如果使用了多级反向代理的话，X-Forwarded-For的值并不止一个，而是一串IP地址，X-Forwarded-For中第一个非unknown的有效IP字符串，则为真实IP地址\n\t */\n\tpublic static String getIpAddr(HttpServletRequest request) {\n    \tString ip = null;\n        try {\n            ip = request.getHeader(\"x-forwarded-for\");\n            if (StringUtils.isEmpty(ip) || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) {\n                ip = request.getHeader(\"Proxy-Client-IP\");\n            }\n            if (StringUtils.isEmpty(ip) || ip.length() == 0 ||CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) {\n                ip = request.getHeader(\"WL-Proxy-Client-IP\");\n            }\n            if (StringUtils.isEmpty(ip) || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) {\n                ip = request.getHeader(\"HTTP_CLIENT_IP\");\n            }\n            if (StringUtils.isEmpty(ip) || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) {\n                ip = request.getHeader(\"HTTP_X_FORWARDED_FOR\");\n            }\n            if (StringUtils.isEmpty(ip) || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) {\n                ip = request.getRemoteAddr();\n            }\n        } catch (Exception e) {\n        \tlogger.error(\"IPUtils ERROR \", e);\n        }\n\n        //logger.info(\"获取客户端 ip：{} \", ip);\n        // 使用代理，则获取第一个IP地址\n        if (StringUtils.isNotEmpty(ip) && ip.length() > 15) {\n            if (ip.indexOf(\",\") > 0) {\n                //ip = ip.substring(0, ip.indexOf(\",\"));\n                String[] ipAddresses = ip.split(\",\");\n                for (String ipAddress : ipAddresses) {\n                    ipAddress = ipAddress.trim();\n                    if (isValidIpAddress(ipAddress)) {\n                        return ipAddress;\n                    }\n                }\n            }\n        }\n        \n        return ip;\n    }\n\n\n    /**\n     * 判断是否是IP格式\n     * @param ipAddress\n     * @return\n     */\n    public static boolean isValidIpAddress(String ipAddress) {\n        String ipPattern = \"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$\";\n        Pattern pattern = Pattern.compile(ipPattern);\n        Matcher matcher = pattern.matcher(ipAddress);\n        return matcher.matches();\n    }\n    \n    /**\n     * 获取服务器上的ip\n     * @return\n     */\n    public static String getServerIp(){\n        InetAddress inetAddress = null;\n        try {\n            inetAddress = InetAddress.getLocalHost();\n            String ipAddress = inetAddress.getHostAddress();\n            //System.out.println(\"IP地址: \" + ipAddress);\n            return ipAddress;\n        } catch (UnknownHostException e) {\n            logger.error(\"获取ip地址失败\", e);\n        }\n        return \"\";\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/Md5Util.java",
    "content": "package org.jeecg.common.util;\n\nimport java.security.MessageDigest;\n\n/**\n * @Description: 加密工具\n * @author: jeecg-boot\n */\npublic class Md5Util {\n\n    private static final String[] HEXDIGITS = { \"0\", \"1\", \"2\", \"3\", \"4\", \"5\",\n            \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\" };\n\n\tpublic static String byteArrayToHexString(byte[] b) {\n\t\tStringBuffer resultSb = new StringBuffer();\n\t\tfor (int i = 0; i < b.length; i++){\n\t\t\tresultSb.append(byteToHexString(b[i]));\n\t\t}\n\t\treturn resultSb.toString();\n\t}\n\n\tprivate static String byteToHexString(byte b) {\n\t\tint n = b;\n\t\tif (n < 0) {\n\t\t\tn += 256;\n\t\t}\n\t\tint d1 = n / 16;\n\t\tint d2 = n % 16;\n\t\treturn HEXDIGITS[d1] + HEXDIGITS[d2];\n\t}\n\n\tpublic static String md5Encode(String origin, String charsetname) {\n\t\tString resultString = null;\n\t\ttry {\n\t\t\tresultString = new String(origin);\n\t\t\tMessageDigest md = MessageDigest.getInstance(\"MD5\");\n\t\t\tif (charsetname == null || \"\".equals(charsetname)) {\n\t\t\t\tresultString = byteArrayToHexString(md.digest(resultString.getBytes()));\n\t\t\t} else {\n\t\t\t\tresultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));\n\t\t\t}\n\t\t} catch (Exception exception) {\n\t\t}\n\t\treturn resultString;\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MinioUtil.java",
    "content": "package org.jeecg.common.util;\n\nimport io.minio.*;\nimport io.minio.http.Method;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.util.filter.SsrfFileTypeFilter;\nimport org.jeecg.common.util.filter.StrAttackFilter;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport java.io.InputStream;\nimport java.net.URLDecoder;\n\n/**\n * minio文件上传工具类\n * @author: jeecg-boot\n */\n@Slf4j\npublic class MinioUtil {\n    private static String minioUrl;\n    private static String minioName;\n    private static String minioPass;\n    private static String bucketName;\n\n    public static void setMinioUrl(String minioUrl) {\n        MinioUtil.minioUrl = minioUrl;\n    }\n\n    public static void setMinioName(String minioName) {\n        MinioUtil.minioName = minioName;\n    }\n\n    public static void setMinioPass(String minioPass) {\n        MinioUtil.minioPass = minioPass;\n    }\n\n    public static void setBucketName(String bucketName) {\n        MinioUtil.bucketName = bucketName;\n    }\n\n    public static String getMinioUrl() {\n        return minioUrl;\n    }\n\n    public static String getBucketName() {\n        return bucketName;\n    }\n\n    private static MinioClient minioClient = null;\n\n    /**\n     * 上传文件\n     * @param file\n     * @return\n     */\n    public static String upload(MultipartFile file, String bizPath, String customBucket) throws Exception {\n        String fileUrl = \"\";\n        // 业务路径过滤，防止攻击\n        bizPath = StrAttackFilter.filter(bizPath);\n\n        // 文件安全校验，防止上传漏洞文件\n        SsrfFileTypeFilter.checkUploadFileType(file, bizPath);\n\n        String newBucket = bucketName;\n        if(oConvertUtils.isNotEmpty(customBucket)){\n            newBucket = customBucket;\n        }\n        try {\n            initMinio(minioUrl, minioName,minioPass);\n            // 检查存储桶是否已经存在\n            if(minioClient.bucketExists(BucketExistsArgs.builder().bucket(newBucket).build())) {\n                log.info(\"Bucket already exists.\");\n            } else {\n                // 创建一个名为ota的存储桶\n                minioClient.makeBucket(MakeBucketArgs.builder().bucket(newBucket).build());\n                log.info(\"create a new bucket.\");\n            }\n            InputStream stream = file.getInputStream();\n            // 获取文件名\n            String orgName = file.getOriginalFilename();\n            if(\"\".equals(orgName)){\n                orgName=file.getName();\n            }\n            orgName = CommonUtils.getFileName(orgName);\n            String objectName = bizPath+\"/\"\n                                +( orgName.indexOf(\".\")==-1\n                                   ?orgName + \"_\" + System.currentTimeMillis()\n                                   :orgName.substring(0, orgName.lastIndexOf(\".\")) + \"_\" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf(\".\"))\n                                 );\n\n            // 使用putObject上传一个本地文件到存储桶中。\n            if(objectName.startsWith(SymbolConstant.SINGLE_SLASH)){\n                objectName = objectName.substring(1);\n            }\n            PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName)\n                    .bucket(newBucket)\n                    .contentType(\"application/octet-stream\")\n                    .stream(stream,stream.available(),-1).build();\n            minioClient.putObject(objectArgs);\n            stream.close();\n            fileUrl = minioUrl+newBucket+\"/\"+objectName;\n        }catch (Exception e){\n            log.error(e.getMessage(), e);\n        }\n        return fileUrl;\n    }\n\n    /**\n     * 文件上传\n     * @param file\n     * @param bizPath\n     * @return\n     */\n    public static String upload(MultipartFile file, String bizPath) throws Exception {\n        return upload(file,bizPath,null);\n    }\n\n    /**\n     * 获取文件流\n     * @param bucketName\n     * @param objectName\n     * @return\n     */\n    public static InputStream getMinioFile(String bucketName,String objectName){\n        InputStream inputStream = null;\n        try {\n            initMinio(minioUrl, minioName, minioPass);\n            GetObjectArgs objectArgs = GetObjectArgs.builder().object(objectName)\n                    .bucket(bucketName).build();\n            inputStream = minioClient.getObject(objectArgs);\n        } catch (Exception e) {\n            log.info(\"文件获取失败\" + e.getMessage());\n        }\n        return inputStream;\n    }\n\n    /**\n     * 删除文件\n     * @param bucketName\n     * @param objectName\n     * @throws Exception\n     */\n    public static void removeObject(String bucketName, String objectName) {\n        try {\n            initMinio(minioUrl, minioName,minioPass);\n            RemoveObjectArgs objectArgs = RemoveObjectArgs.builder().object(objectName)\n                    .bucket(bucketName).build();\n            minioClient.removeObject(objectArgs);\n        }catch (Exception e){\n            log.info(\"文件删除失败\" + e.getMessage());\n        }\n    }\n\n    /**\n     * 获取文件外链\n     * @param bucketName\n     * @param objectName\n     * @param expires\n     * @return\n     */\n    public static String getObjectUrl(String bucketName, String objectName, Integer expires) {\n        initMinio(minioUrl, minioName,minioPass);\n        try{\n            // 代码逻辑说明: 获取文件外链报错提示method不能为空，导致文件下载和预览失败----\n            GetPresignedObjectUrlArgs objectArgs = GetPresignedObjectUrlArgs.builder().object(objectName)\n                    .bucket(bucketName)\n                    .expiry(expires).method(Method.GET).build();\n            String url = minioClient.getPresignedObjectUrl(objectArgs);\n            return URLDecoder.decode(url,\"UTF-8\");\n        }catch (Exception e){\n            log.info(\"文件路径获取失败\" + e.getMessage());\n        }\n        return null;\n    }\n\n    /**\n     * 初始化客户端\n     * @param minioUrl\n     * @param minioName\n     * @param minioPass\n     * @return\n     */\n    private static MinioClient initMinio(String minioUrl, String minioName,String minioPass) {\n        if (minioClient == null) {\n            try {\n                minioClient = MinioClient.builder()\n                        .endpoint(minioUrl)\n                        .credentials(minioName, minioPass)\n                        .build();\n            } catch (Exception e) {\n                e.printStackTrace();\n            }\n        }\n        return minioClient;\n    }\n\n    /**\n     * 上传文件到minio\n     * @param stream\n     * @param relativePath\n     * @return\n     */\n    public static String upload(InputStream stream,String relativePath) throws Exception {\n        initMinio(minioUrl, minioName,minioPass);\n        if(minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {\n            log.info(\"Bucket already exists.\");\n        } else {\n            // 创建一个名为ota的存储桶\n            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());\n            log.info(\"create a new bucket.\");\n        }\n        PutObjectArgs objectArgs = PutObjectArgs.builder().object(relativePath)\n                .bucket(bucketName)\n                .contentType(\"application/octet-stream\")\n                .stream(stream,stream.available(),-1).build();\n        minioClient.putObject(objectArgs);\n        stream.close();\n        return minioUrl+bucketName+\"/\"+relativePath;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MyClassLoader.java",
    "content": "package org.jeecg.common.util;\n\nimport org.jeecg.common.constant.SymbolConstant;\n\n/**\n * @Author  张代浩\n */\npublic class MyClassLoader extends ClassLoader {\n\tpublic static Class getClassByScn(String className) {\n\t\tClass myclass = null;\n\t\ttry {\n\t\t\tmyclass = Class.forName(className);\n\t\t} catch (ClassNotFoundException e) {\n\t\t\te.printStackTrace();\n\t\t\tthrow new RuntimeException(className+\" not found!\");\n\t\t}\n\t\treturn myclass;\n\t}\n\n    /**\n     * 获得类的全名，包括包名\n     * @param object\n     * @return\n     */\n\tpublic static String getPackPath(Object object) {\n\t\t// 检查用户传入的参数是否为空\n\t\tif (object == null) {\n\t\t\tthrow new java.lang.IllegalArgumentException(\"参数不能为空！\");\n\t\t}\n\t\t// 获得类的全名，包括包名\n\t\tString clsName = object.getClass().getName();\n\t\treturn clsName;\n\t}\n\n\tpublic static String getAppPath(Class cls) {\n\t\t// 检查用户传入的参数是否为空\n\t\tif (cls == null) {\n\t\t\tthrow new java.lang.IllegalArgumentException(\"参数不能为空！\");\n\t\t}\n\t\tClassLoader loader = cls.getClassLoader();\n\t\t// 获得类的全名，包括包名\n\t\tString clsName = cls.getName() + \".class\";\n\t\t// 获得传入参数所在的包\n\t\tPackage pack = cls.getPackage();\n\t\tString path = \"\";\n\t\t// 如果不是匿名包，将包名转化为路径\n\t\tif (pack != null) {\n\t\t\tString packName = pack.getName();\n\t\t\tString javaSpot=\"java.\";\n\t\t\tString javaxSpot=\"javax.\";\n\t\t\t// 此处简单判定是否是Java基础类库，防止用户传入JDK内置的类库\n\t\t\tif (packName.startsWith(javaSpot) || packName.startsWith(javaxSpot)) {\n\t\t\t\tthrow new java.lang.IllegalArgumentException(\"不要传送系统类！\");\n\t\t\t}\n\t\t\t// 在类的名称中，去掉包名的部分，获得类的文件名\n\t\t\tclsName = clsName.substring(packName.length() + 1);\n\t\t\t// 判定包名是否是简单包名，如果是，则直接将包名转换为路径，\n\t\t\tif (packName.indexOf(SymbolConstant.SPOT) < 0) {\n\t\t\t\tpath = packName + \"/\";\n\t\t\t} else {\n                // 否则按照包名的组成部分，将包名转换为路径\n\t\t\t\tint start = 0, end = 0;\n\t\t\t\tend = packName.indexOf(\".\");\n\t\t\t\tStringBuilder pathBuilder = new StringBuilder();\n\t\t\t\twhile (end != -1) {\n                    pathBuilder.append(packName, start, end).append(\"/\");\n\t\t\t\t\tstart = end + 1;\n\t\t\t\t\tend = packName.indexOf(\".\", start);\n\t\t\t\t}\n\t\t\t\tif(oConvertUtils.isNotEmpty(pathBuilder.toString())){\n                    path = pathBuilder.toString();\n                }\n\t\t\t\tpath = path + packName.substring(start) + \"/\";\n\t\t\t}\n\t\t}\n\t\t// 调用ClassLoader的getResource方法，传入包含路径信息的类文件名\n\t\tjava.net.URL url = loader.getResource(path + clsName);\n\t\t// 从URL对象中获取路径信息\n\t\tString realPath = url.getPath();\n\t\t// 去掉路径信息中的协议名\"file:\"\n\t\tint pos = realPath.indexOf(\"file:\");\n\t\tif (pos > -1) {\n\t\t\trealPath = realPath.substring(pos + 5);\n\t\t}\n\t\t// 去掉路径信息最后包含类文件信息的部分，得到类所在的路径\n\t\tpos = realPath.indexOf(path + clsName);\n\t\trealPath = realPath.substring(0, pos - 1);\n\t\t// 如果类文件被打包到JAR等文件中时，去掉对应的JAR等打包文件名\n\t\tif (realPath.endsWith(SymbolConstant.EXCLAMATORY_MARK)) {\n\t\t\trealPath = realPath.substring(0, realPath.lastIndexOf(\"/\"));\n\t\t}\n\t\t/*------------------------------------------------------------  \n\t\t ClassLoader的getResource方法使用了utf-8对路径信息进行了编码，当路径  \n\t\t  中存在中文和空格时，他会对这些字符进行转换，这样，得到的往往不是我们想要  \n\t\t  的真实路径，在此，调用了URLDecoder的decode方法进行解码，以便得到原始的  \n\t\t  中文及空格路径  \n\t\t-------------------------------------------------------------*/\n\t\ttry {\n\t\t\trealPath = java.net.URLDecoder.decode(realPath, \"utf-8\");\n\t\t} catch (Exception e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t\treturn realPath;\n\t}// getAppPath定义结束\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MyCommonsMultipartFile.java",
    "content": "package org.jeecg.common.util;\n\nimport org.apache.commons.fileupload.FileItem;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport java.io.*;\n\n/**\n * @date 2025-09-04\n * @author scott\n * \n * 升级springboot3 无法使用 CommonsMultipartFile\n * 自定义 MultipartFile 实现类，支持从 FileItem 构造\n */\npublic class MyCommonsMultipartFile implements MultipartFile {\n\n    private final byte[] fileContent;\n    private final String fileName;\n    private final String contentType;\n\n    // 新增构造方法，支持 FileItem 参数\n    public MyCommonsMultipartFile(FileItem fileItem) throws IOException {\n        this.fileName = fileItem.getName();\n        this.contentType = fileItem.getContentType();\n        try (InputStream inputStream = fileItem.getInputStream()) {\n            this.fileContent = inputStream.readAllBytes();\n        }\n    }\n    \n    // 现有构造方法\n    public MyCommonsMultipartFile(InputStream inputStream, String fileName, String contentType) throws IOException {\n        this.fileName = fileName;\n        this.contentType = contentType;\n        this.fileContent = inputStream.readAllBytes();\n    }\n\n    @Override\n    public String getName() {\n        return fileName;\n    }\n\n    @Override\n    public String getOriginalFilename() {\n        return fileName;\n    }\n\n    @Override\n    public String getContentType() {\n        return contentType;\n    }\n\n    @Override\n    public boolean isEmpty() {\n        return fileContent.length == 0;\n    }\n\n    @Override\n    public long getSize() {\n        return fileContent.length;\n    }\n\n    @Override\n    public byte[] getBytes() {\n        return fileContent;\n    }\n\n    @Override\n    public InputStream getInputStream() {\n        return new ByteArrayInputStream(fileContent);\n    }\n\n    @Override\n    public void transferTo(File dest) throws IOException {\n        try (OutputStream os = new FileOutputStream(dest)) {\n            os.write(fileContent);\n        }\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/PasswordUtil.java",
    "content": "package org.jeecg.common.util;\n\nimport java.security.Key;\nimport java.security.SecureRandom;\nimport javax.crypto.Cipher;\nimport javax.crypto.SecretKey;\nimport javax.crypto.SecretKeyFactory;\nimport javax.crypto.spec.PBEKeySpec;\nimport javax.crypto.spec.PBEParameterSpec;\n\n/**\n * @Description: 密码工具类\n * @author: jeecg-boot\n */\npublic class PasswordUtil {\n\n\t/**\n\t * JAVA6支持以下任意一种算法 PBEWITHMD5ANDDES PBEWITHMD5ANDTRIPLEDES\n\t * PBEWITHSHAANDDESEDE PBEWITHSHA1ANDRC2_40 PBKDF2WITHHMACSHA1\n\t * */\n\n    /**\n     * 定义使用的算法为:PBEWITHMD5andDES算法\n     * 加密算法\n     */\n\tpublic static final String ALGORITHM = \"PBEWithMD5AndDES\";\n\n    /**\n     * 定义使用的算法为:PBEWITHMD5andDES算法\n     * 密钥\n     */\n\tpublic static final String SALT = \"63293188\";\n\n\t/**\n\t * 定义迭代次数为1000次\n\t */\n\tprivate static final int ITERATIONCOUNT = 1000;\n\n\t/**\n\t * 获取加密算法中使用的盐值,解密中使用的盐值必须与加密中使用的相同才能完成操作. 盐长度必须为8字节\n\t * \n\t * @return byte[] 盐值\n\t * */\n\tpublic static byte[] getSalt() throws Exception {\n\t\t// 实例化安全随机数\n\t\tSecureRandom random = new SecureRandom();\n\t\t// 产出盐\n\t\treturn random.generateSeed(8);\n\t}\n\n\tpublic static byte[] getStaticSalt() {\n\t\t// 产出盐\n\t\treturn SALT.getBytes();\n\t}\n\n\t/**\n\t * 根据PBE密码生成一把密钥\n\t * \n\t * @param password\n\t *            生成密钥时所使用的密码\n\t * @return Key PBE算法密钥\n\t * */\n\tprivate static Key getPbeKey(String password) {\n\t\t// 实例化使用的算法\n\t\tSecretKeyFactory keyFactory;\n\t\tSecretKey secretKey = null;\n\t\ttry {\n\t\t\tkeyFactory = SecretKeyFactory.getInstance(ALGORITHM);\n\t\t\t// 设置PBE密钥参数\n\t\t\tPBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());\n\t\t\t// 生成密钥\n\t\t\tsecretKey = keyFactory.generateSecret(keySpec);\n\t\t} catch (Exception e) {\n\t\t\t// TODO Auto-generated catch block\n\t\t\te.printStackTrace();\n\t\t}\n\n\t\treturn secretKey;\n\t}\n\n\t/**\n\t * 加密明文字符串\n\t * \n\t * @param plaintext\n\t *            待加密的明文字符串\n\t * @param password\n\t *            生成密钥时所使用的密码\n\t * @param salt\n\t *            盐值\n\t * @return 加密后的密文字符串\n\t * @throws Exception\n\t */\n\tpublic static String encrypt(String plaintext, String password, String salt) {\n\n\t\tKey key = getPbeKey(password);\n\t\tbyte[] encipheredData = null;\n\t\tPBEParameterSpec parameterSpec = new PBEParameterSpec(salt.getBytes(), ITERATIONCOUNT);\n\t\ttry {\n\t\t\tCipher cipher = Cipher.getInstance(ALGORITHM);\n\n\t\t\tcipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec);\n\t\t\t// 代码逻辑说明: 中文作为用户名时，加密的密码windows和linux会得到不同的结果 gitee/issues/IZUD7\n\t\t\tencipheredData = cipher.doFinal(plaintext.getBytes(\"utf-8\"));\n\t\t} catch (Exception e) {\n\t\t}\n\t\treturn bytesToHexString(encipheredData);\n\t}\n\n\t/**\n\t * 解密密文字符串\n\t * \n\t * @param ciphertext\n\t *            待解密的密文字符串\n\t * @param password\n\t *            生成密钥时所使用的密码(如需解密,该参数需要与加密时使用的一致)\n\t * @param salt\n\t *            盐值(如需解密,该参数需要与加密时使用的一致)\n\t * @return 解密后的明文字符串\n\t * @throws Exception\n\t */\n\tpublic static String decrypt(String ciphertext, String password, String salt) {\n\n\t\tKey key = getPbeKey(password);\n\t\tbyte[] passDec = null;\n\t\tPBEParameterSpec parameterSpec = new PBEParameterSpec(salt.getBytes(), ITERATIONCOUNT);\n\t\ttry {\n\t\t\tCipher cipher = Cipher.getInstance(ALGORITHM);\n\n\t\t\tcipher.init(Cipher.DECRYPT_MODE, key, parameterSpec);\n\n\t\t\tpassDec = cipher.doFinal(hexStringToBytes(ciphertext));\n\t\t}\n\n\t\tcatch (Exception e) {\n\t\t\t// TODO: handle exception\n\t\t}\n\t\treturn new String(passDec);\n\t}\n\n\t/**\n\t * 将字节数组转换为十六进制字符串\n\t * \n\t * @param src\n\t *            字节数组\n\t * @return\n\t */\n\tpublic static String bytesToHexString(byte[] src) {\n\t\tStringBuilder stringBuilder = new StringBuilder(\"\");\n\t\tif (src == null || src.length <= 0) {\n\t\t\treturn null;\n\t\t}\n\t\tfor (int i = 0; i < src.length; i++) {\n\t\t\tint v = src[i] & 0xFF;\n\t\t\tString hv = Integer.toHexString(v);\n\t\t\tif (hv.length() < 2) {\n\t\t\t\tstringBuilder.append(0);\n\t\t\t}\n\t\t\tstringBuilder.append(hv);\n\t\t}\n\t\treturn stringBuilder.toString();\n\t}\n\n\t/**\n\t * 将十六进制字符串转换为字节数组\n\t * \n\t * @param hexString\n\t *            十六进制字符串\n\t * @return\n\t */\n\tpublic static byte[] hexStringToBytes(String hexString) {\n\t\tif (hexString == null || \"\".equals(hexString)) {\n\t\t\treturn null;\n\t\t}\n\t\thexString = hexString.toUpperCase();\n\t\tint length = hexString.length() / 2;\n\t\tchar[] hexChars = hexString.toCharArray();\n\t\tbyte[] d = new byte[length];\n\t\tfor (int i = 0; i < length; i++) {\n\t\t\tint pos = i * 2;\n\t\t\td[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));\n\t\t}\n\t\treturn d;\n\t}\n\n\tprivate static byte charToByte(char c) {\n\t\treturn (byte) \"0123456789ABCDEF\".indexOf(c);\n\t}\n\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/PmsUtil.java",
    "content": "package org.jeecg.common.util;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.stereotype.Component;\n\nimport java.io.BufferedWriter;\nimport java.io.File;\nimport java.io.FileWriter;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * @Description: PmsUtil\n * @author: jeecg-boot\n */\n@Slf4j\n@Component\n@Lazy(false)\npublic class PmsUtil {\n\n\n    private static String uploadPath;\n\n    @Value(\"${jeecg.path.upload:}\")\n    public void setUploadPath(String uploadPath) {\n        PmsUtil.uploadPath = uploadPath;\n    }\n\n    public static String saveErrorTxtByList(List<String> msg, String name) {\n        Date d = new Date();\n        String saveDir = \"logs\" + File.separator + DateUtils.yyyyMMdd.get().format(d) + File.separator;\n        String saveFullDir = uploadPath + File.separator + saveDir;\n\n        File saveFile = new File(saveFullDir);\n        if (!saveFile.exists()) {\n            saveFile.mkdirs();\n        }\n        name += DateUtils.yyyymmddhhmmss.get().format(d) + Math.round(Math.random() * 10000);\n        String saveFilePath = saveFullDir + name + \".txt\";\n\n        try {\n            //封装目的地\n            BufferedWriter bw = new BufferedWriter(new FileWriter(saveFilePath));\n            //遍历集合\n            for (String s : msg) {\n                //写数据\n                if (s.indexOf(\"_\") > 0) {\n                    String[] arr = s.split(\"_\");\n                    bw.write(\"第\" + arr[0] + \"行:\" + arr[1]);\n                } else {\n                    bw.write(s);\n                }\n                //bw.newLine();\n                bw.write(\"\\r\\n\");\n            }\n            //释放资源\n            bw.flush();\n            bw.close();\n        } catch (Exception e) {\n            log.info(\"excel导入生成错误日志文件异常:\" + e.getMessage());\n        }\n        return saveDir + name + \".txt\";\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/ReflectHelper.java",
    "content": "package org.jeecg.common.util;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport lombok.extern.slf4j.Slf4j;\n\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Method;\nimport java.util.*;\nimport java.util.Map.Entry;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\n\n/**\n * @author 张代浩\n * @desc 通过反射来动态调用get 和 set 方法\n */\n@Slf4j\npublic class ReflectHelper {\n\n    private Class cls;\n\n    /**\n     * 传过来的对象\n     */\n    private Object obj;\n\n    /**\n     * 存放get方法\n     */\n    private Hashtable<String, Method> getMethods = null;\n    /**\n     * 存放set方法\n     */\n    private Hashtable<String, Method> setMethods = null;\n\n    /**\n     * 定义构造方法 -- 一般来说是个pojo\n     *\n     * @param o 目标对象\n     */\n    public ReflectHelper(Object o) {\n        obj = o;\n        initMethods();\n    }\n\n    /**\n     * @desc 初始化\n     */\n    public void initMethods() {\n        getMethods = new Hashtable<String, Method>();\n        setMethods = new Hashtable<String, Method>();\n        cls = obj.getClass();\n        Method[] methods = cls.getMethods();\n        // 定义正则表达式，从方法中过滤出getter / setter 函数.\n        String gs = \"get(\\\\w+)\";\n        Pattern getM = Pattern.compile(gs);\n        String ss = \"set(\\\\w+)\";\n        Pattern setM = Pattern.compile(ss);\n        // 把方法中的\"set\" 或者 \"get\" 去掉\n        String rapl = \"$1\";\n        String param;\n        for (int i = 0; i < methods.length; ++i) {\n            Method m = methods[i];\n            String methodName = m.getName();\n            if (Pattern.matches(gs, methodName)) {\n                param = getM.matcher(methodName).replaceAll(rapl).toLowerCase();\n                getMethods.put(param, m);\n            } else if (Pattern.matches(ss, methodName)) {\n                param = setM.matcher(methodName).replaceAll(rapl).toLowerCase();\n                setMethods.put(param, m);\n            } else {\n                // logger.info(methodName + \" 不是getter,setter方法！\");\n            }\n        }\n    }\n\n    /**\n     * @desc 调用set方法\n     */\n    public boolean setMethodValue(String property, Object object) {\n        Method m = setMethods.get(property.toLowerCase());\n        if (m != null) {\n            try {\n                // 调用目标类的setter函数\n                m.invoke(obj, object);\n                return true;\n            } catch (Exception ex) {\n                log.info(\"invoke getter on \" + property + \" error: \" + ex.toString());\n                return false;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * @desc 调用set方法\n     */\n    public Object getMethodValue(String property) {\n        Object value = null;\n        Method m = getMethods.get(property.toLowerCase());\n        if (m != null) {\n            try {\n                /*\n                 * 调用obj类的setter函数\n                 */\n                value = m.invoke(obj, new Object[]{});\n\n            } catch (Exception ex) {\n                log.info(\"invoke getter on \" + property + \" error: \" + ex.toString());\n            }\n        }\n        return value;\n    }\n\n    /**\n     * 把map中的内容全部注入到obj中\n     *\n     * @param data\n     * @return\n     */\n    public Object setAll(Map<String, Object> data) {\n        if (data == null || data.keySet().size() <= 0) {\n            return null;\n        }\n        for (Entry<String, Object> entry : data.entrySet()) {\n            this.setMethodValue(entry.getKey(), entry.getValue());\n        }\n        return obj;\n    }\n\n    /**\n     * 把map中的内容全部注入到obj中\n     *\n     * @param o\n     * @param data\n     * @return\n     */\n    public static Object setAll(Object o, Map<String, Object> data) {\n        ReflectHelper reflectHelper = new ReflectHelper(o);\n        reflectHelper.setAll(data);\n        return o;\n    }\n\n    /**\n     * 把map中的内容全部注入到新实例中\n     *\n     * @param clazz\n     * @param data\n     * @return\n     */\n    @SuppressWarnings(\"unchecked\")\n    public static <T> T setAll(Class<T> clazz, Map<String, Object> data) {\n        T o = null;\n        try {\n            o = clazz.newInstance();\n        } catch (Exception e) {\n            e.printStackTrace();\n            o = null;\n            return o;\n        }\n        return (T) setAll(o, data);\n    }\n\n    /**\n     * 根据传入的class将mapList转换为实体类list\n     *\n     * @param mapist\n     * @param clazz\n     * @return\n     */\n    public static <T> List<T> transList2Entrys(List<Map<String, Object>> mapist, Class<T> clazz) {\n        List<T> list = new ArrayList<T>();\n        if (mapist != null && mapist.size() > 0) {\n            for (Map<String, Object> data : mapist) {\n                list.add(ReflectHelper.setAll(clazz, data));\n            }\n        }\n        return list;\n    }\n\n    /**\n     * 根据属性名获取属性值\n     */\n    public static Object getFieldValueByName(String fieldName, Object o) {\n        try {\n            String firstLetter = fieldName.substring(0, 1).toUpperCase();\n            String getter = \"get\" + firstLetter + fieldName.substring(1);\n            Method method = o.getClass().getMethod(getter, new Class[]{});\n            Object value = method.invoke(o, new Object[]{});\n            return value;\n        } catch (Exception e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n\n    /**\n     * 获取属性值\n     */\n    public static Object getFieldVal(String fieldName, Object o) {\n        try {\n            // 暴力反射获取属性\n            Field filed = o.getClass().getDeclaredField(fieldName);\n            // 设置反射时取消Java的访问检查，暴力访问\n            filed.setAccessible(true);\n            Object val = filed.get(o);\n            return val;\n        } catch (Exception e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n\n    /**\n     * 获取属性名数组\n     */\n    public static String[] getFiledName(Object o) {\n        Field[] fields = o.getClass().getDeclaredFields();\n        String[] fieldNames = new String[fields.length];\n        for (int i = 0; i < fields.length; i++) {\n            //log.info(fields[i].getType());\n            fieldNames[i] = fields[i].getName();\n        }\n        return fieldNames;\n    }\n\n    /**\n     * 获取属性类型(type)，属性名(name)，属性值(value)的map组成的list\n     */\n    public static List<Map> getFiledsInfo(Object o) {\n        Field[] fields = o.getClass().getDeclaredFields();\n        String[] fieldNames = new String[fields.length];\n        List<Map> list = new ArrayList<Map>();\n        Map<String, Object> infoMap = null;\n        for (int i = 0; i < fields.length; i++) {\n            infoMap = new HashMap<>(5);\n            infoMap.put(\"type\", fields[i].getType().toString());\n            infoMap.put(\"name\", fields[i].getName());\n            infoMap.put(\"value\", getFieldValueByName(fields[i].getName(), o));\n            list.add(infoMap);\n        }\n        return list;\n    }\n\n    /**\n     * 获取对象的所有属性值，返回一个对象数组\n     */\n    public static Object[] getFiledValues(Object o) {\n        String[] fieldNames = getFiledName(o);\n        Object[] value = new Object[fieldNames.length];\n        for (int i = 0; i < fieldNames.length; i++) {\n            value[i] = getFieldValueByName(fieldNames[i], o);\n        }\n        return value;\n    }\n\n    /**\n     * 判断给定的字段是不是类中的属性\n     * @param field 字段名\n     * @param clazz 类对象\n     * @return\n     */\n    public static boolean isClassField(String field, Class clazz){\n        Field[] fields = clazz.getDeclaredFields();\n        for(int i=0;i<fields.length;i++){\n            String fieldName = fields[i].getName();\n            String tableColumnName = oConvertUtils.camelToUnderline(fieldName);\n            if(fieldName.equalsIgnoreCase(field) || tableColumnName.equalsIgnoreCase(field)){\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * 获取class的 包括父类的\n     * @param clazz\n     * @return\n     */\n    public static List<Field> getClassFields(Class<?> clazz) {\n        List<Field> list = new ArrayList<Field>();\n        Field[] fields;\n        do{\n            fields = clazz.getDeclaredFields();\n            for(int i = 0;i<fields.length;i++){\n                list.add(fields[i]);\n            }\n            clazz = clazz.getSuperclass();\n        }while(clazz!= Object.class&&clazz!=null);\n        return list;\n    }\n\n    /**\n     * 获取表字段名\n     * @param clazz\n     * @param name\n     * @return\n     */\n    public static String getTableFieldName(Class<?> clazz, String name) {\n        try {\n            //如果字段加注解了@TableField(exist = false),不走DB查询\n            Field field = null;\n            try {\n                field = clazz.getDeclaredField(name);\n            } catch (NoSuchFieldException e) {\n                //e.printStackTrace();\n            }\n\n            //如果为空，则去父类查找字段\n            if (field == null) {\n                List<Field> allFields = getClassFields(clazz);\n                List<Field> searchFields = allFields.stream().filter(a -> a.getName().equals(name)).collect(Collectors.toList());\n                if(searchFields!=null && searchFields.size()>0){\n                    field = searchFields.get(0);\n                }\n            }\n\n            if (field != null) {\n                TableField tableField = field.getAnnotation(TableField.class);\n                if (tableField != null){\n                    if(tableField.exist() == false){\n                        //如果设置了TableField false 这个字段不需要处理\n                        return null;\n                    }else{\n                        String column = tableField.value();\n                        //如果设置了TableField value 这个字段是实体字段\n                        if(!\"\".equals(column)){\n                            return column;\n                        }\n                    }\n                }\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return name;\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/RestDesformUtil.java",
    "content": "package org.jeecg.common.util;\n\nimport com.alibaba.fastjson.JSONObject;\nimport org.jeecg.common.api.vo.Result;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.http.HttpMethod;\nimport org.springframework.http.MediaType;\nimport org.springframework.http.ResponseEntity;\n\n/**\n * 通过 RESTful 风格的接口操纵 desform 里的数据\n *\n * @author sunjianlei\n */\npublic class RestDesformUtil {\n\n    private static String domain = null;\n    private static String path = null;\n\n    static {\n        domain = SpringContextUtils.getDomain();\n        path = oConvertUtils.getString(SpringContextUtils.getApplicationContext().getEnvironment().getProperty(\"server.servlet.context-path\"));\n    }\n\n    /**\n     * 查询数据\n     *\n     * @param desformCode\n     * @param dataId\n     * @param token\n     * @return\n     */\n    public static Result queryOne(String desformCode, String dataId, String token) {\n        String url = getBaseUrl(desformCode, dataId).toString();\n        HttpHeaders headers = getHeaders(token);\n        ResponseEntity<JSONObject> result = RestUtil.request(url, HttpMethod.GET, headers, null, null, JSONObject.class);\n        return packageReturn(result);\n    }\n\n    /**\n     * 新增数据\n     *\n     * @param desformCode\n     * @param formData\n     * @param token\n     * @return\n     */\n    public static Result addOne(String desformCode, JSONObject formData, String token) {\n        return addOrEditOne(desformCode, formData, token, HttpMethod.POST);\n    }\n\n    /**\n     * 修改数据\n     *\n     * @param desformCode\n     * @param formData\n     * @param token\n     * @return\n     */\n    public static Result editOne(String desformCode, JSONObject formData, String token) {\n        return addOrEditOne(desformCode, formData, token, HttpMethod.PUT);\n    }\n\n    private static Result addOrEditOne(String desformCode, JSONObject formData, String token, HttpMethod method) {\n        String url = getBaseUrl(desformCode).toString();\n        HttpHeaders headers = getHeaders(token);\n        ResponseEntity<JSONObject> result = RestUtil.request(url, method, headers, null, formData, JSONObject.class);\n        return packageReturn(result);\n    }\n\n    /**\n     * 删除数据\n     *\n     * @param desformCode\n     * @param dataId\n     * @param token\n     * @return\n     */\n    public static Result removeOne(String desformCode, String dataId, String token) {\n        String url = getBaseUrl(desformCode, dataId).toString();\n        HttpHeaders headers = getHeaders(token);\n        ResponseEntity<JSONObject> result = RestUtil.request(url, HttpMethod.DELETE, headers, null, null, JSONObject.class);\n        return packageReturn(result);\n    }\n\n    private static Result packageReturn(ResponseEntity<JSONObject> result) {\n        if (result.getBody() != null) {\n            return result.getBody().toJavaObject(Result.class);\n        }\n        return Result.error(\"操作失败\");\n    }\n\n    private static StringBuilder getBaseUrl() {\n        StringBuilder builder = new StringBuilder(domain).append(path);\n        builder.append(\"/desform/api\");\n        return builder;\n    }\n\n    private static StringBuilder getBaseUrl(String desformCode, String dataId) {\n        StringBuilder builder = getBaseUrl();\n        builder.append(\"/\").append(desformCode);\n        if (dataId != null) {\n            builder.append(\"/\").append(dataId);\n        }\n        return builder;\n    }\n\n    private static StringBuilder getBaseUrl(String desformCode) {\n        return getBaseUrl(desformCode, null);\n    }\n\n    private static HttpHeaders getHeaders(String token) {\n        HttpHeaders headers = new HttpHeaders();\n        String mediaType = MediaType.APPLICATION_JSON_UTF8_VALUE;\n        headers.setContentType(MediaType.parseMediaType(mediaType));\n        headers.set(\"Accept\", mediaType);\n        headers.set(\"X-Access-Token\", token);\n        return headers;\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/RestUtil.java",
    "content": "package org.jeecg.common.util;\n\nimport com.alibaba.fastjson.JSONObject;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.http.*;\nimport org.springframework.http.client.HttpComponentsClientHttpRequestFactory;\nimport org.springframework.http.converter.StringHttpMessageConverter;\nimport org.springframework.web.client.RestTemplate;\n\nimport java.nio.charset.StandardCharsets;\nimport java.util.Iterator;\nimport java.util.Map;\n\n/**\n * 调用 Restful 接口 Util\n *\n * @author sunjianlei\n */\n@Slf4j\npublic class RestUtil {\n\n    private static String domain = null;\n    private static String path = null;\n    \n    private static String getDomain() {\n        if (domain == null) {\n            domain = SpringContextUtils.getDomain();\n            // issues/2959\n            // 微服务版集成企业微信单点登录\n            // 因为微服务版没有端口号，导致 SpringContextUtils.getDomain() 方法获取的域名的端口号变成了:-1所以出问题了，只需要把这个-1给去掉就可以了。\n            String port=\":-1\";\n            if (domain.endsWith(port)) {\n                domain = domain.substring(0, domain.length() - 3);\n            }\n        }\n        return domain;\n    }\n\n    private static String getPath() {\n        if (path == null) {\n            path = SpringContextUtils.getApplicationContext().getEnvironment().getProperty(\"server.servlet.context-path\");\n        }\n        return oConvertUtils.getString(path);\n    }\n\n    public static String getBaseUrl() {\n        String basepath = getDomain() + getPath();\n        log.debug(\" RestUtil.getBaseUrl: \" + basepath);\n        return basepath;\n    }\n\n    /**\n     * RestAPI 调用器\n     */\n    private final static RestTemplate RT;\n\n    static {\n        // 解决[issues/8859]online表单java增强失效------------\n        // 使用 Apache HttpClient 避免 JDK HttpURLConnection 的 too many bytes written 问题\n        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();\n        requestFactory.setConnectTimeout(30000);\n        requestFactory.setReadTimeout(30000);\n        RT = new RestTemplate(requestFactory);\n        // 解决乱码问题（替换 StringHttpMessageConverter 为 UTF-8）\n        for (int i = 0; i < RT.getMessageConverters().size(); i++) {\n            if (RT.getMessageConverters().get(i) instanceof StringHttpMessageConverter) {\n                RT.getMessageConverters().set(i, new StringHttpMessageConverter(StandardCharsets.UTF_8));\n                break;\n            }\n        }\n    }\n\n    public static RestTemplate getRestTemplate() {\n        return RT;\n    }\n\n    /**\n     * 发送 get 请求\n     */\n    public static JSONObject get(String url) {\n        return getNative(url, null, null).getBody();\n    }\n\n    /**\n     * 发送 get 请求\n     */\n    public static JSONObject get(String url, JSONObject variables) {\n        return getNative(url, variables, null).getBody();\n    }\n\n    /**\n     * 发送 get 请求\n     */\n    public static JSONObject get(String url, JSONObject variables, JSONObject params) {\n        return getNative(url, variables, params).getBody();\n    }\n\n    /**\n     * 发送 get 请求，返回原生 ResponseEntity 对象\n     */\n    public static ResponseEntity<JSONObject> getNative(String url, JSONObject variables, JSONObject params) {\n        return request(url, HttpMethod.GET, variables, params);\n    }\n\n    /**\n     * 发送 Post 请求\n     */\n    public static JSONObject post(String url) {\n        return postNative(url, null, null).getBody();\n    }\n\n    /**\n     * 发送 Post 请求\n     */\n    public static JSONObject post(String url, JSONObject params) {\n        return postNative(url, null, params).getBody();\n    }\n\n    /**\n     * 发送 Post 请求\n     */\n    public static JSONObject post(String url, JSONObject variables, JSONObject params) {\n        return postNative(url, variables, params).getBody();\n    }\n\n    /**\n     * 发送 POST 请求，返回原生 ResponseEntity 对象\n     */\n    public static ResponseEntity<JSONObject> postNative(String url, JSONObject variables, JSONObject params) {\n        return request(url, HttpMethod.POST, variables, params);\n    }\n\n    /**\n     * 发送 put 请求\n     */\n    public static JSONObject put(String url) {\n        return putNative(url, null, null).getBody();\n    }\n\n    /**\n     * 发送 put 请求\n     */\n    public static JSONObject put(String url, JSONObject params) {\n        return putNative(url, null, params).getBody();\n    }\n\n    /**\n     * 发送 put 请求\n     */\n    public static JSONObject put(String url, JSONObject variables, JSONObject params) {\n        return putNative(url, variables, params).getBody();\n    }\n\n    /**\n     * 发送 put 请求，返回原生 ResponseEntity 对象\n     */\n    public static ResponseEntity<JSONObject> putNative(String url, JSONObject variables, JSONObject params) {\n        return request(url, HttpMethod.PUT, variables, params);\n    }\n\n    /**\n     * 发送 delete 请求\n     */\n    public static JSONObject delete(String url) {\n        return deleteNative(url, null, null).getBody();\n    }\n\n    /**\n     * 发送 delete 请求\n     */\n    public static JSONObject delete(String url, JSONObject variables, JSONObject params) {\n        return deleteNative(url, variables, params).getBody();\n    }\n\n    /**\n     * 发送 delete 请求，返回原生 ResponseEntity 对象\n     */\n    public static ResponseEntity<JSONObject> deleteNative(String url, JSONObject variables, JSONObject params) {\n        return request(url, HttpMethod.DELETE, null, variables, params, JSONObject.class);\n    }\n\n    /**\n     * 发送请求\n     */\n    public static ResponseEntity<JSONObject> request(String url, HttpMethod method, JSONObject variables, JSONObject params) {\n        return request(url, method, getHeaderApplicationJson(), variables, params, JSONObject.class);\n    }\n\n    /**\n     * 发送请求\n     *\n     * @param url          请求地址\n     * @param method       请求方式\n     * @param headers      请求头  可空\n     * @param variables    请求url参数 可空\n     * @param params       请求body参数 可空\n     * @param responseType 返回类型\n     * @return ResponseEntity<responseType>\n     */\n    public static <T> ResponseEntity<T> request(String url, HttpMethod method, HttpHeaders headers, JSONObject variables, Object params, Class<T> responseType) {\n        log.debug(\" RestUtil  --- request ---  url = \"+ url);\n        if (StringUtils.isEmpty(url)) {\n            throw new RuntimeException(\"url 不能为空\");\n        }\n        if (method == null) {\n            throw new RuntimeException(\"method 不能为空\");\n        }\n        if (headers == null) {\n            headers = new HttpHeaders();\n        }\n        // 请求体\n        String body = \"\";\n        if (params != null) {\n            if (params instanceof JSONObject) {\n                body = ((JSONObject) params).toJSONString();\n\n            } else {\n                body = params.toString();\n            }\n        }\n        // 拼接 url 参数\n        if (variables != null && !variables.isEmpty()) {\n            url += (\"?\" + asUrlVariables(variables));\n        }\n        // 解决[issues/8951]从jeecgboot 3.8.2 升级到 3.8.3 在线表单java增强功能报错------------\n        // Content-Length 强制设置（解决可能出现的截断问题）\n        if (StringUtils.isNotEmpty(body)) {\n            int contentLength = body.getBytes(StandardCharsets.UTF_8).length;\n            String current = headers.getFirst(HttpHeaders.CONTENT_LENGTH);\n            if (current == null || !current.equals(String.valueOf(contentLength))) {\n                headers.setContentLength(contentLength);\n                log.debug(\" RestUtil  --- request --- 修正/设置 Content-Length = \" + contentLength + (current!=null?\" (原值=\"+current+\")\":\"\"));\n            }\n        }\n        // 发送请求\n        HttpEntity<String> request = new HttpEntity<>(body, headers);\n        return RT.exchange(url, method, request, responseType);\n    }\n\n    /**\n     * 发送请求（支持自定义超时时间）\n     *\n     * @param url          请求地址\n     * @param method       请求方式\n     * @param headers      请求头  可空\n     * @param variables    请求url参数 可空\n     * @param params       请求body参数 可空\n     * @param responseType 返回类型\n     * @param timeout      超时时间（毫秒），如果为0或负数则使用默认超时\n     * @return ResponseEntity<responseType>\n     */\n    public static <T> ResponseEntity<T> request(String url, HttpMethod method, HttpHeaders headers,\n                                                JSONObject variables, Object params, Class<T> responseType, int timeout) {\n        log.debug(\" RestUtil  --- request ---  url = \"+ url + \", timeout = \" + timeout);\n\n        if (StringUtils.isEmpty(url)) {\n            throw new RuntimeException(\"url 不能为空\");\n        }\n        if (method == null) {\n            throw new RuntimeException(\"method 不能为空\");\n        }\n        if (headers == null) {\n            headers = new HttpHeaders();\n        }\n\n        // 创建自定义RestTemplate（如果需要设置超时）\n        RestTemplate restTemplate = RT;\n        if (timeout > 0) {\n            // 代码逻辑说明: [issues/8859]online表单java增强失效------------\n            HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();\n            requestFactory.setConnectTimeout(timeout);\n            requestFactory.setReadTimeout(timeout);\n            restTemplate = new RestTemplate(requestFactory);\n            // 解决乱码问题（替换 StringHttpMessageConverter 为 UTF-8）\n            for (int i = 0; i < restTemplate.getMessageConverters().size(); i++) {\n                if (restTemplate.getMessageConverters().get(i) instanceof StringHttpMessageConverter) {\n                    restTemplate.getMessageConverters().set(i, new StringHttpMessageConverter(StandardCharsets.UTF_8));\n                    break;\n                }\n            }\n        }\n\n        // 请求体\n        String body = \"\";\n        if (params != null) {\n            if (params instanceof JSONObject) {\n                body = ((JSONObject) params).toJSONString();\n            } else {\n                body = params.toString();\n            }\n        }\n\n        // 拼接 url 参数\n        if (variables != null && !variables.isEmpty()) {\n            url += (\"?\" + asUrlVariables(variables));\n        }\n\n        // Content-Length 强制设置（解决可能出现的截断问题）\n        if (StringUtils.isNotEmpty(body) && !headers.containsKey(HttpHeaders.CONTENT_LENGTH)) {\n            int contentLength = body.getBytes(StandardCharsets.UTF_8).length;\n            String current = headers.getFirst(HttpHeaders.CONTENT_LENGTH);\n            if (current == null || !current.equals(String.valueOf(contentLength))) {\n                headers.setContentLength(contentLength);\n                log.debug(\" RestUtil  --- request(timeout) --- 修正/设置 Content-Length = \" + contentLength + (current!=null?\" (原值=\"+current+\")\":\"\"));\n            }\n        }\n\n        // 发送请求\n        HttpEntity<String> request = new HttpEntity<>(body, headers);\n        return restTemplate.exchange(url, method, request, responseType);\n    }\n\n    /**\n     * 获取JSON请求头\n     */\n    public static HttpHeaders getHeaderApplicationJson() {\n        return getHeader(MediaType.APPLICATION_JSON_UTF8_VALUE);\n    }\n\n    /**\n     * 获取请求头\n     */\n    public static HttpHeaders getHeader(String mediaType) {\n        HttpHeaders headers = new HttpHeaders();\n        headers.setContentType(MediaType.parseMediaType(mediaType));\n        headers.add(\"Accept\", mediaType);\n        return headers;\n    }\n\n    /**\n     * 将 JSONObject 转为 a=1&b=2&c=3...&n=n 的形式\n     */\n    public static String asUrlVariables(JSONObject variables) {\n        Map<String, Object> source = variables.getInnerMap();\n        Iterator<String> it = source.keySet().iterator();\n        StringBuilder urlVariables = new StringBuilder();\n        while (it.hasNext()) {\n            String key = it.next();\n            String value = \"\";\n            Object object = source.get(key);\n            if (object != null) {\n                if (!StringUtils.isEmpty(object.toString())) {\n                    value = object.toString();\n                }\n            }\n            urlVariables.append(\"&\").append(key).append(\"=\").append(value);\n        }\n        // 去掉第一个&\n        return urlVariables.substring(1);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/ShiroThreadPoolExecutor.java",
    "content": "package org.jeecg.common.util;\n\nimport org.apache.shiro.SecurityUtils;\nimport org.apache.shiro.mgt.SecurityManager;\nimport org.apache.shiro.subject.Subject;\nimport org.apache.shiro.util.ThreadContext;\n\nimport java.util.concurrent.*;\n\n/**\n * @date 2025-09-04\n * @author scott\n * \n * @Description: 支持shiro的API，获取当前登录人方法的线程池\n */\npublic class ShiroThreadPoolExecutor extends ThreadPoolExecutor {\n\n    public ShiroThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {\n        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);\n    }\n\n    @Override\n    public void execute(Runnable command) {\n        Subject subject = SecurityUtils.getSubject();\n        SecurityManager securityManager = SecurityUtils.getSecurityManager();\n        super.execute(() -> {\n            try {\n                ThreadContext.bind(securityManager);\n                ThreadContext.bind(subject);\n                command.run();\n            } finally {\n                ThreadContext.unbindSubject();\n                ThreadContext.unbindSecurityManager();\n            }\n        });\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SpringContextUtils.java",
    "content": "package org.jeecg.common.util;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\n\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.ServiceNameConstants;\nimport org.springframework.beans.BeansException;\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.context.ApplicationContextAware;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.context.request.RequestContextHolder;\nimport org.springframework.web.context.request.ServletRequestAttributes;\n\n/**\n * @Description: spring上下文工具类\n * @author: jeecg-boot\n */\n@Lazy(false)\n@Component\npublic class SpringContextUtils implements ApplicationContextAware {\n\n\t/**\n\t * 上下文对象实例\n\t */\n\tprivate static ApplicationContext applicationContext;\n\n\t@Override\n\tpublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {\n\t\tSpringContextUtils.applicationContext = applicationContext;\n\t}\n\n\t/**\n\t * 获取applicationContext\n\t *\n\t * @return\n\t */\n\tpublic static ApplicationContext getApplicationContext() {\n\t\treturn applicationContext;\n\t}\n\n\t/**\n\t  * 获取HttpServletRequest\n\t */\n\tpublic static HttpServletRequest getHttpServletRequest() {\n\t\treturn ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();\n\t}\n\t/**\n\t * 获取HttpServletResponse\n\t */\n\tpublic static HttpServletResponse getHttpServletResponse() {\n\t\treturn ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();\n\t}\n\n\t/**\n\t*  获取项目根路径 basePath\n\t*/\n\tpublic static String getDomain(){\n\t\tHttpServletRequest request = getHttpServletRequest();\n\t\tStringBuffer url = request.getRequestURL();\n\t\t//1.微服务情况下，获取gateway的basePath\n\t\tString basePath = request.getHeader(ServiceNameConstants.X_GATEWAY_BASE_PATH);\n\t\tif(oConvertUtils.isNotEmpty(basePath)){\n\t\t\treturn basePath;\n\t\t}else{\n\t\t\tString domain = url.delete(url.length() - request.getRequestURI().length(), url.length()).toString();\n\t\t\t//2.【兼容】SSL认证之后，request.getScheme()获取不到https的问题\n\t\t\t// https://blog.csdn.net/weixin_34376986/article/details/89767950\n\t\t\tString scheme = request.getHeader(CommonConstant.X_FORWARDED_SCHEME);\n\t\t\tif(scheme!=null && !request.getScheme().equals(scheme)){\n\t\t\t\tdomain = domain.replace(request.getScheme(),scheme);\n\t\t\t}\n\t\t\treturn domain;\n\t\t}\n\t}\n\n\tpublic static String getOrigin(){\n\t\tHttpServletRequest request = getHttpServletRequest();\n\t\treturn request.getHeader(\"Origin\");\n\t}\n\t\n\t/**\n\t * 通过name获取 Bean.\n\t *\n\t * @param name\n\t * @return\n\t */\n\tpublic static Object getBean(String name) {\n\t\treturn getApplicationContext().getBean(name);\n\t}\n\n\t/**\n\t * 通过class获取Bean.\n\t *\n\t * @param clazz\n\t * @param       <T>\n\t * @return\n\t */\n\tpublic static <T> T getBean(Class<T> clazz) {\n\t\treturn getApplicationContext().getBean(clazz);\n\t}\n\n\t/**\n\t * 通过name,以及Clazz返回指定的Bean\n\t *\n\t * @param name\n\t * @param clazz\n\t * @param       <T>\n\t * @return\n\t */\n\tpublic static <T> T getBean(String name, Class<T> clazz) {\n\t\treturn getApplicationContext().getBean(name, clazz);\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SqlInjectionUtil.java",
    "content": "package org.jeecg.common.util;\n\nimport cn.hutool.core.util.ReUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.exception.JeecgSqlInjectionException;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\n/**\n * sql注入处理工具类\n * \n * @author zhoujf\n */\n@Slf4j\npublic class SqlInjectionUtil {\n\n\t/**\n\t * sql注入黑名单数据库名\n\t */\n\tpublic final static String XSS_STR_TABLE = \"peformance_schema|information_schema\";\n\n\t/**\n\t * 默认—sql注入关键词\n\t */\n\tprivate final static String XSS_STR = \"and |exec |peformance_schema|information_schema|extractvalue|updatexml|geohash|gtid_subset|gtid_subtract|insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |;|or |+|--\";\n\t/**\n\t * online报表专用—sql注入关键词\n\t */\n\tprivate static String specialReportXssStr = \"exec |peformance_schema|information_schema|extractvalue|updatexml|geohash|gtid_subset|gtid_subtract|insert |alter |delete |grant |update |drop |master |truncate |declare |--\";\n\t/**\n\t * 字典专用—sql注入关键词\n\t */\n\tprivate static String specialDictSqlXssStr = \"exec |peformance_schema|information_schema|extractvalue|updatexml|geohash|gtid_subset|gtid_subtract|insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |;|+|--\";\n\t/**\n\t * 完整匹配的key，不需要考虑前空格\n\t */\n\tprivate static List<String> FULL_MATCHING_KEYWRODS = new ArrayList<>();\n\tstatic {\n\t\tFULL_MATCHING_KEYWRODS.add(\";\");\n\t\tFULL_MATCHING_KEYWRODS.add(\"+\");\n\t\tFULL_MATCHING_KEYWRODS.add(\"--\");\n\t}\n\t\n\t\n\t/**\n\t * sql注入风险的 正则关键字\n\t *\n\t * 函数匹配，需要用正则模式\n\t */\n\tprivate final static String[] XSS_REGULAR_STR_ARRAY = new String[]{\n\t\t\t\"chr\\\\s*\\\\(\",\n\t\t\t\"mid\\\\s*\\\\(\",\n\t\t\t\" char\\\\s*\\\\(\",\n\t\t\t\"sleep\\\\s*\\\\(\",\n\t\t\t\"user\\\\s*\\\\(\",\n\t\t\t\"show\\\\s+tables\",\n\t\t\t\"user[\\\\s]*\\\\([\\\\s]*\\\\)\",\n\t\t\t\"show\\\\s+databases\",\n\t\t\t\"sleep\\\\(\\\\d*\\\\)\",\n\t\t\t\"sleep\\\\(.*\\\\)\",\n\t};\n\t/**\n\t * sql注释的正则\n\t */\n\tprivate final static Pattern SQL_ANNOTATION = Pattern.compile(\"/\\\\*[\\\\s\\\\S]*\\\\*/\");\n\tprivate final static  String SQL_ANNOTATION2 = \"--\";\n\t\n\t/**\n\t * sql注入提示语\n\t */\n\tprivate final static String SQL_INJECTION_KEYWORD_TIP = \"请注意，存在SQL注入关键词---> {}\";\n\tprivate final static String SQL_INJECTION_TIP = \"请注意，值可能存在SQL注入风险!--->\";\n\tprivate final static String SQL_INJECTION_TIP_VARIABLE = \"请注意，值可能存在SQL注入风险!---> {}\";\n\t\n\n\t/**\n\t * sql注入过滤处理，遇到注入关键字抛异常\n\t * @param values\n\t */\n\tpublic static void filterContentMulti(String... values) {\n\t\tfilterContent(values, null);\n\t}\n\n\t/**\n\t * 校验比较严格\n\t * \n\t * sql注入过滤处理，遇到注入关键字抛异常\n\t *\n\t * @param value\n\t * @return\n\t */\n\tpublic static void filterContent(String value, String customXssString) {\n\t\tif (value == null || \"\".equals(value)) {\n\t\t\treturn;\n\t\t}\n\t\t// 一、校验sql注释 不允许有sql注释\n\t\tcheckSqlAnnotation(value);\n\t\t// 转为小写进行后续比较\n\t\tvalue = value.toLowerCase().trim();\n\t\t\n\t\t// 二、SQL注入检测存在绕过风险 (普通文本校验)\n\t\t//https://gitee.com/jeecg/jeecg-boot/issues/I4NZGE\n\t\tString[] xssArr = XSS_STR.split(\"\\\\|\");\n\t\tfor (int i = 0; i < xssArr.length; i++) {\n\t\t\tif (value.indexOf(xssArr[i]) > -1) {\n\t\t\t\tlog.error(SqlInjectionUtil.SQL_INJECTION_KEYWORD_TIP, xssArr[i]);\n\t\t\t\tlog.error(SqlInjectionUtil.SQL_INJECTION_TIP_VARIABLE, value);\n\t\t\t\tthrow new JeecgSqlInjectionException(SqlInjectionUtil.SQL_INJECTION_TIP + value);\n\t\t\t}\n\t\t}\n\t\t// 三、SQL注入检测存在绕过风险 (自定义传入普通文本校验)\n\t\tif (customXssString != null) {\n\t\t\tString[] xssArr2 = customXssString.split(\"\\\\|\");\n\t\t\tfor (int i = 0; i < xssArr2.length; i++) {\n\t\t\t\tif (value.indexOf(xssArr2[i]) > -1) {\n\t\t\t\t\tlog.error(SqlInjectionUtil.SQL_INJECTION_KEYWORD_TIP, xssArr2[i]);\n\t\t\t\t\tlog.error(SqlInjectionUtil.SQL_INJECTION_TIP_VARIABLE, value);\n\t\t\t\t\tthrow new JeecgSqlInjectionException(SqlInjectionUtil.SQL_INJECTION_TIP + value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// 四、SQL注入检测存在绕过风险 (正则校验)\n\t\tfor (String regularOriginal : XSS_REGULAR_STR_ARRAY) {\n\t\t\tString regular = \".*\" + regularOriginal + \".*\";\n\t\t\tif (Pattern.matches(regular, value)) {\n\t\t\t\tlog.error(SqlInjectionUtil.SQL_INJECTION_KEYWORD_TIP, regularOriginal);\n\t\t\t\tlog.error(SqlInjectionUtil.SQL_INJECTION_TIP_VARIABLE, value);\n\t\t\t\tthrow new JeecgSqlInjectionException(SqlInjectionUtil.SQL_INJECTION_TIP + value);\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\n\t/**\n\t * 判断是否存在SQL注入关键词字符串\n\t *\n\t * @param keyword\n\t * @return\n\t */\n\t@SuppressWarnings(\"AlibabaUndefineMagicConstant\")\n\tprivate static boolean isExistSqlInjectKeyword(String sql, String keyword) {\n\t\tif (sql.startsWith(keyword.trim())) {\n\t\t\treturn true;\n\t\t} else if (sql.contains(keyword)) {\n\t\t\t// 需要匹配的，sql注入关键词\n\t\t\tString matchingText = \" \" + keyword;\n\t\t\tif(FULL_MATCHING_KEYWRODS.contains(keyword)){\n\t\t\t\tmatchingText = keyword;\n\t\t\t}\n\t\t\t\n\t\t\tif (sql.contains(matchingText)) {\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\tString regularStr = \"\\\\s+\\\\S+\" + keyword;\n\t\t\t\tList<String> resultFindAll = ReUtil.findAll(regularStr, sql, 0, new ArrayList<String>());\n\t\t\t\tfor (String res : resultFindAll) {\n\t\t\t\t\tlog.info(\"isExistSqlInjectKeyword —- 匹配到的SQL注入关键词：{}\", res);\n\t\t\t\t\t/**\n\t\t\t\t\t * SQL注入中可以替换空格的字符(%09  %0A  %0D  +都可以替代空格)\n\t\t\t\t\t * http://blog.chinaunix.net/uid-12501104-id-2932639.html\n\t\t\t\t\t * https://www.cnblogs.com/Vinson404/p/7253255.html\n\t\t\t\t\t * */\n\t\t\t\t\tif (res.contains(\"%\") || res.contains(\"+\") || res.contains(\"#\") || res.contains(\"/\") || res.contains(\")\")) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * 判断是否存在SQL注入关键词字符串\n\t *\n\t * @param keyword\n\t * @return\n\t */\n\t@SuppressWarnings(\"AlibabaUndefineMagicConstant\")\n\tprivate static boolean isExistSqlInjectTableKeyword(String sql, String keyword) {\n\t\t// 需要匹配的，sql注入关键词\n\t\tString[] matchingTexts = new String[]{\"`\" + keyword, \"(\" + keyword, \"(`\" + keyword};\n\t\tfor (String matchingText : matchingTexts) {\n\t\t\tString[] checkTexts = new String[]{\" \" + matchingText, \"from\" + matchingText};\n\t\t\tfor (String checkText : checkTexts) {\n\t\t\t\tif (sql.contains(checkText)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * sql注入过滤处理，遇到注入关键字抛异常\n\t * \n\t * @param values\n\t * @return\n\t */\n\tpublic static void filterContent(String[] values, String customXssString) {\n\t\tfor (String val : values) {\n\t\t\tif (oConvertUtils.isEmpty(val)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfilterContent(val, customXssString);\n\t\t}\n\t\treturn;\n\t}\n\n\t/**\n\t * 【提醒：不通用】\n\t * 仅用于字典条件SQL参数，注入过滤\n\t *\n\t * @param value\n\t * @return\n\t */\n\tpublic static void specialFilterContentForDictSql(String value) {\n\t\tString[] xssArr = specialDictSqlXssStr.split(\"\\\\|\");\n\t\tif (value == null || \"\".equals(value)) {\n\t\t\treturn;\n\t\t}\n\t\t// 一、校验sql注释 不允许有sql注释\n\t\tcheckSqlAnnotation(value);\n\t\tvalue = value.toLowerCase().trim();\n\t\t\n\t\t// 二、SQL注入检测存在绕过风险 (普通文本校验)\n\t\tfor (int i = 0; i < xssArr.length; i++) {\n\t\t\tif (isExistSqlInjectKeyword(value, xssArr[i])) {\n\t\t\t\tlog.error(SqlInjectionUtil.SQL_INJECTION_KEYWORD_TIP, xssArr[i]);\n\t\t\t\tlog.error(SqlInjectionUtil.SQL_INJECTION_TIP_VARIABLE, value);\n\t\t\t\tthrow new JeecgSqlInjectionException(SqlInjectionUtil.SQL_INJECTION_TIP + value);\n\t\t\t}\n\t\t}\n\t\tString[] xssTableArr = XSS_STR_TABLE.split(\"\\\\|\");\n\t\tfor (String xssTableStr : xssTableArr) {\n            if (isExistSqlInjectTableKeyword(value, xssTableStr)) {\n                log.error(SqlInjectionUtil.SQL_INJECTION_KEYWORD_TIP, xssTableStr);\n                log.error(SqlInjectionUtil.SQL_INJECTION_TIP_VARIABLE, value);\n                throw new JeecgSqlInjectionException(SqlInjectionUtil.SQL_INJECTION_TIP + value);\n            }\n        }\n\n\t\t// 三、SQL注入检测存在绕过风险 (正则校验)\n\t\tfor (String regularOriginal : XSS_REGULAR_STR_ARRAY) {\n\t\t\tString regular = \".*\" + regularOriginal + \".*\";\n\t\t\tif (Pattern.matches(regular, value)) {\n\t\t\t\tlog.error(SqlInjectionUtil.SQL_INJECTION_KEYWORD_TIP, regularOriginal);\n\t\t\t\tlog.error(SqlInjectionUtil.SQL_INJECTION_TIP_VARIABLE, value);\n\t\t\t\tthrow new JeecgSqlInjectionException(SqlInjectionUtil.SQL_INJECTION_TIP + value);\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\n    /**\n\t * 【提醒：不通用】\n     *  仅用于Online报表SQL解析，注入过滤\n     * @param value\n     * @return\n     */\n\tpublic static void specialFilterContentForOnlineReport(String value) {\n\t\tString[] xssArr = specialReportXssStr.split(\"\\\\|\");\n\t\tif (value == null || \"\".equals(value)) {\n\t\t\treturn;\n\t\t}\n\t\t// 一、校验sql注释 不允许有sql注释\n\t\tcheckSqlAnnotation(value);\n\t\tvalue = value.toLowerCase().trim();\n\t\t\n\t\t// 二、SQL注入检测存在绕过风险 (普通文本校验)\n\t\tfor (int i = 0; i < xssArr.length; i++) {\n\t\t\tif (isExistSqlInjectKeyword(value, xssArr[i])) {\n\t\t\t\tlog.error(SqlInjectionUtil.SQL_INJECTION_KEYWORD_TIP, xssArr[i]);\n\t\t\t\tlog.error(SqlInjectionUtil.SQL_INJECTION_TIP_VARIABLE, value);\n\t\t\t\tthrow new JeecgSqlInjectionException(SqlInjectionUtil.SQL_INJECTION_TIP + value);\n\t\t\t}\n\t\t}\n\t\tString[] xssTableArr = XSS_STR_TABLE.split(\"\\\\|\");\n\t\tfor (String xssTableStr : xssTableArr) {\n\t\t\tif (isExistSqlInjectTableKeyword(value, xssTableStr)) {\n\t\t\t\tlog.error(SqlInjectionUtil.SQL_INJECTION_KEYWORD_TIP, xssTableStr);\n\t\t\t\tlog.error(SqlInjectionUtil.SQL_INJECTION_TIP_VARIABLE, value);\n\t\t\t\tthrow new JeecgSqlInjectionException(SqlInjectionUtil.SQL_INJECTION_TIP + value);\n\t\t\t}\n\t\t}\n\n\t\t// 三、SQL注入检测存在绕过风险 (正则校验)\n\t\tfor (String regularOriginal : XSS_REGULAR_STR_ARRAY) {\n\t\t\tString regular = \".*\" + regularOriginal + \".*\";\n\t\t\tif (Pattern.matches(regular, value)) {\n\t\t\t\tlog.error(SqlInjectionUtil.SQL_INJECTION_KEYWORD_TIP, regularOriginal);\n\t\t\t\tlog.error(SqlInjectionUtil.SQL_INJECTION_TIP_VARIABLE, value);\n\t\t\t\tthrow new JeecgSqlInjectionException(SqlInjectionUtil.SQL_INJECTION_TIP + value);\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\n\n\t/**\n\t * 校验是否有sql注释 \n\t * @return\n\t */\n\tpublic static void checkSqlAnnotation(String str){\n\t\tif(str.contains(SQL_ANNOTATION2)){\n\t\t\tString error = \"请注意，SQL中不允许含注释，有安全风险！\";\n\t\t\tlog.error(error);\n\t\t\tthrow new RuntimeException(error);\n\t\t}\n\n\t\t\n\t\tMatcher matcher = SQL_ANNOTATION.matcher(str);\n\t\tif(matcher.find()){\n\t\t\tString error = \"请注意，值可能存在SQL注入风险---> \\\\*.*\\\\\";\n\t\t\tlog.error(error);\n\t\t\tthrow new JeecgSqlInjectionException(error);\n\t\t}\n\t}\n\n\n\t/**\n\t * 返回查询表名\n\t * <p>\n\t * sql注入过滤处理，遇到注入关键字抛异常\n\t *\n\t * @param table\n\t */\n\tprivate static Pattern tableNamePattern = Pattern.compile(\"^[a-zA-Z][a-zA-Z0-9_\\\\$]{0,63}$\");\n\tpublic static String getSqlInjectTableName(String table) {\n\t\tif(oConvertUtils.isEmpty(table)){\n\t\t\treturn table;\n\t\t}\n\n\t\t// 代码逻辑说明: 表单设计器列表翻译存在表名带条件，导致翻译出问题----\n\t\tint index = table.toLowerCase().indexOf(\" where \");\n\t\tif (index != -1) {\n\t\t\ttable = table.substring(0, index);\n\t\t\tlog.info(\"截掉where之后的新表名：\" + table);\n\t\t}\n\n\t\ttable = table.trim();\n\t\t/**\n\t\t * 检验表名是否合法\n\t\t *\n\t\t * 表名只能由字母、数字和下划线组成。\n\t\t * 表名必须以字母开头。\n\t\t * 表名长度通常有限制，例如最多为 64 个字符。\n\t\t */\n\t\tboolean isValidTableName = tableNamePattern.matcher(table).matches();\n\t\tif (!isValidTableName) {\n\t\t\tString errorMsg = \"表名不合法，存在SQL注入风险!--->\" + table;\n\t\t\tlog.error(errorMsg);\n\t\t\tthrow new JeecgSqlInjectionException(errorMsg);\n\t\t}\n\n\t\t//进一步验证是否存在SQL注入风险\n\t\tfilterContentMulti(table);\n\t\treturn table;\n\t}\n\n\n\t/**\n\t * 返回查询字段\n\t * <p>\n\t * sql注入过滤处理，遇到注入关键字抛异常\n\t *\n\t * @param field\n\t */\n\tstatic final Pattern fieldPattern = Pattern.compile(\"^[a-zA-Z0-9_]+$\");\n\tpublic static String getSqlInjectField(String field) {\n\t\tif(oConvertUtils.isEmpty(field)){\n\t\t\treturn field;\n\t\t}\n\t\t\n\t\tfield = field.trim();\n\n\t\tif (field.contains(SymbolConstant.COMMA)) {\n\t\t\treturn getSqlInjectField(field.split(SymbolConstant.COMMA));\n\t\t}\n\n\t\t/**\n\t\t * 校验表字段是否有效\n\t\t *\n\t\t * 字段定义只能是是字母 数字 下划线的组合（不允许有空格、转义字符串等）\n\t\t */\n\t\tboolean isValidField = fieldPattern.matcher(field).matches();\n\t\tif (!isValidField) {\n\t\t\tString errorMsg = \"字段不合法，存在SQL注入风险!--->\" + field;\n\t\t\tlog.error(errorMsg);\n\t\t\tthrow new JeecgSqlInjectionException(errorMsg);\n\t\t}\n\n\t\t//进一步验证是否存在SQL注入风险\n\t\tfilterContentMulti(field);\n\t\treturn field;\n\t}\n\n\t/**\n\t * 获取多个字段\n\t * 返回: 逗号拼接\n\t *\n\t * @param fields\n\t * @return\n\t */\n\tpublic static String getSqlInjectField(String... fields) {\n\t\tfor (String s : fields) {\n\t\t\tgetSqlInjectField(s);\n\t\t}\n\t\treturn String.join(SymbolConstant.COMMA, fields);\n\t}\n\n\n\t/**\n\t * 获取排序字段\n\t * 返回：字符串\n\t *\n\t * 1.将驼峰命名转化成下划线 \n\t * 2.限制sql注入\n\t * @param sortField  排序字段\n\t * @return\n\t */\n\tpublic static String getSqlInjectSortField(String sortField) {\n\t\tString field = SqlInjectionUtil.getSqlInjectField(oConvertUtils.camelToUnderline(sortField));\n\t\treturn field;\n\t}\n\n\t/**\n\t * 获取多个排序字段\n\t * 返回：数组\n\t *\n\t * 1.将驼峰命名转化成下划线 \n\t * 2.限制sql注入\n\t * @param sortFields 多个排序字段\n\t * @return\n\t */\n\tpublic static List getSqlInjectSortFields(String... sortFields) {\n\t\tList list = new ArrayList<String>();\n\t\tfor (String sortField : sortFields) {\n\t\t\tlist.add(getSqlInjectSortField(sortField));\n\t\t}\n\t\treturn list;\n\t}\n\n\t/**\n\t * 获取 orderBy type\n\t * 返回：字符串\n\t * <p>\n\t * 1.检测是否为 asc 或 desc 其中的一个\n\t * 2.限制sql注入\n\t *\n\t * @param orderType\n\t * @return\n\t */\n\tpublic static String getSqlInjectOrderType(String orderType) {\n\t\tif (orderType == null) {\n\t\t\treturn null;\n\t\t}\n\t\torderType = orderType.trim();\n\t\tif (CommonConstant.ORDER_TYPE_ASC.equalsIgnoreCase(orderType)) {\n\t\t\treturn CommonConstant.ORDER_TYPE_ASC;\n\t\t} else {\n\t\t\treturn CommonConstant.ORDER_TYPE_DESC;\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/TencentSms.java",
    "content": "package org.jeecg.common.util;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.tencentcloudapi.common.Credential;\nimport com.tencentcloudapi.common.exception.TencentCloudSDKException;\nimport com.tencentcloudapi.common.profile.ClientProfile;\nimport com.tencentcloudapi.common.profile.HttpProfile;\nimport com.tencentcloudapi.sms.v20210111.SmsClient;\nimport com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;\nimport com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;\nimport com.tencentcloudapi.sms.v20210111.models.SendStatus;\nimport org.apache.commons.lang3.StringUtils;\nimport org.jeecg.common.constant.enums.DySmsEnum;\nimport org.jeecg.config.JeecgSmsTemplateConfig;\nimport org.jeecg.config.tencent.JeecgTencent;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @Description: 腾讯发送短信\n * @author: wangshuai\n * @date: 2025/11/4 19:27\n */\npublic class TencentSms {\n\n    private final static Logger logger = LoggerFactory.getLogger(TencentSms.class);\n\n    /**\n     * 发送腾讯短信\n     *\n     * @param phone\n     * @param templateParamJson\n     * @param tencent\n     * @param dySmsEnum\n     * @return\n     */\n    public static boolean sendTencentSms(String phone, JSONObject templateParamJson, JeecgTencent tencent, DySmsEnum dySmsEnum) {\n        //获取客户端链接\n        SmsClient client = getSmsClient(tencent);\n        //构建腾讯云短信发送请求\n        SendSmsRequest req = buildSendSmsRequest(phone, templateParamJson, dySmsEnum, tencent);\n        try {\n            //发送短信\n            SendSmsResponse resp = client.SendSms(req);\n            // 处理响应\n            SendStatus[] statusSet = resp.getSendStatusSet();\n            if (statusSet != null && statusSet.length > 0) {\n                SendStatus status = statusSet[0];\n                if (\"Ok\".equals(status.getCode())) {\n                    logger.info(\"短信发送成功，手机号：{}\", phone);\n                    return true;\n                } else {\n                    logger.error(\"短信发送失败，手机号：{}，错误码：{}，错误信息：{}\",\n                            phone, status.getCode(), status.getMessage());\n                }\n            }\n        } catch (TencentCloudSDKException e) {\n            logger.error(\"短信发送失败{}\", e.getMessage());\n        }\n        return false;\n    }\n\n    /**\n     * 获取sms客户端\n     *\n     * @param tencent 腾讯云配置\n     * @return SmsClient对象\n     */\n    private static SmsClient getSmsClient(JeecgTencent tencent) {\n        Credential cred = new Credential(tencent.getSecretId(), tencent.getSecretKey());\n        // 实例化一个http选项，可选的，没有特殊需求可以跳过\n        HttpProfile httpProfile = new HttpProfile();\n        //指定接入地域域名*/\n        httpProfile.setEndpoint(tencent.getEndpoint());\n        //实例化一个客户端配置对象\n        ClientProfile clientProfile = new ClientProfile();\n        clientProfile.setHttpProfile(httpProfile);\n        //实例化要请求产品的client对象，第二个参数是地域信息\n        return new SmsClient(cred, tencent.getRegion(), clientProfile);\n    }\n\n    /**\n     * 构建腾讯云短信发送请求\n     *\n     * @param phone             手机号码\n     * @param templateParamJson 模板参数JSON对象\n     * @param dySmsEnum         短信枚举配置\n     * @param tencent           腾讯云配置\n     * @return 构建好的SendSmsRequest对象\n     */\n    private static SendSmsRequest buildSendSmsRequest(\n            String phone,\n            JSONObject templateParamJson,\n            DySmsEnum dySmsEnum,\n            JeecgTencent tencent) {\n\n        SendSmsRequest req = new SendSmsRequest();\n\n        // 1. 设置短信应用ID\n        String sdkAppId = tencent.getSdkAppId();\n        req.setSmsSdkAppId(sdkAppId);\n        // 2. 设置短信签名\n        String signName = getSmsSignName(dySmsEnum);\n        req.setSignName(signName);\n        // 3. 设置模板ID\n        String templateId = getSmsTemplateId(dySmsEnum);\n        req.setTemplateId(templateId);\n        // 4. 设置模板参数\n        String[] templateParams = extractTemplateParams(templateParamJson);\n        req.setTemplateParamSet(templateParams);\n        // 5. 设置手机号码\n        String[] phoneNumberSet = { phone };\n        req.setPhoneNumberSet(phoneNumberSet);\n\n        logger.debug(\"构建短信请求完成 - 应用ID: {}, 签名: {}, 模板ID: {}, 手机号: {}\",\n                sdkAppId, signName, templateId, phone);\n\n        return req;\n    }\n\n    /**\n     * 获取短信签名名称\n     *\n     * @param dySmsEnum 腾讯云对象\n     */\n    private static String getSmsSignName(DySmsEnum dySmsEnum) {\n        JeecgSmsTemplateConfig baseConfig = SpringContextUtils.getBean(JeecgSmsTemplateConfig.class);\n        String signName = dySmsEnum.getSignName();\n\n        if (StringUtils.isNotEmpty(baseConfig.getSignature())) {\n            logger.debug(\"yml中读取签名名称: {}\", baseConfig.getSignature());\n            signName = baseConfig.getSignature();\n        }\n\n        return signName;\n    }\n\n    /**\n     * 获取短信模板ID\n     *\n     * @param dySmsEnum 腾讯云对象\n     */\n    private static String getSmsTemplateId(DySmsEnum dySmsEnum) {\n        JeecgSmsTemplateConfig baseConfig = SpringContextUtils.getBean(JeecgSmsTemplateConfig.class);\n        String templateCode = dySmsEnum.getTemplateCode();\n\n        if (StringUtils.isNotEmpty(baseConfig.getSignature())) {\n            Map<String, String> smsTemplate = baseConfig.getTemplateCode();\n            if (smsTemplate.containsKey(templateCode) &&\n                    StringUtils.isNotEmpty(smsTemplate.get(templateCode))) {\n                templateCode = smsTemplate.get(templateCode);\n                logger.debug(\"yml中读取短信模板ID: {}\", templateCode);\n            }\n        }\n        return templateCode;\n    }\n\n    /**\n     * 从JSONObject中提取模板参数（按原始顺序）\n     *\n     * @param templateParamJson 模板参数\n     */\n    private static String[] extractTemplateParams(JSONObject templateParamJson) {\n        if (templateParamJson == null || templateParamJson.isEmpty()) {\n            return new String[0];\n        }\n        List<String> params = new ArrayList<>();\n        for (String key : templateParamJson.keySet()) {\n            Object value = templateParamJson.get(key);\n            if (value != null) {\n                params.add(value.toString());\n            } else {\n                // 处理null值\n                params.add(\"\");\n            }\n        }\n        logger.debug(\"提取模板参数: {}\", params);\n        return params.toArray(new String[0]);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/TokenUtils.java",
    "content": "package org.jeecg.common.util;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.jeecg.common.api.CommonAPI;\nimport org.jeecg.common.constant.CacheConstant;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.TenantConstant;\nimport org.jeecg.common.desensitization.util.SensitiveInfoUtil;\nimport org.jeecg.common.exception.JeecgBoot401Exception;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.system.vo.LoginUser;\n\nimport jakarta.servlet.http.HttpServletRequest;\n\n/**\n * @Author scott\n * @Date 2019/9/23 14:12\n * @Description: 编程校验token有效性\n */\n@Slf4j\npublic class TokenUtils {\n\n    /**\n     * 获取 request 里传递的 token\n     *\n     * @param request\n     * @return\n     */\n    public static String getTokenByRequest(HttpServletRequest request) {\n        if (request == null) {\n            return null;\n        }\n        \n        String token = request.getParameter(\"token\");\n        if (token == null) {\n            token = request.getHeader(\"X-Access-Token\");\n        }\n        return token;\n    }\n    \n    /**\n     * 获取 request 里传递的 token\n     * @return\n     */\n    public static String getTokenByRequest() {\n        String token = null;\n        try {\n            HttpServletRequest request = SpringContextUtils.getHttpServletRequest();\n            token = TokenUtils.getTokenByRequest(request);\n        } catch (Exception e) {\n            //e.printStackTrace();\n        }\n        return token;\n    }\n\n    /**\n     * 获取 request 里传递的 tenantId (租户ID)\n     *\n     * @param request\n     * @return\n     */\n    public static String getTenantIdByRequest(HttpServletRequest request) {\n        String tenantId = request.getParameter(TenantConstant.TENANT_ID);\n        if (tenantId == null) {\n            tenantId = oConvertUtils.getString(request.getHeader(CommonConstant.TENANT_ID));\n        }\n\n        if (oConvertUtils.isNotEmpty(tenantId) && \"undefined\".equals(tenantId)) {\n            return null;\n        }\n        return tenantId;\n    }\n\n    /**\n     * 获取 request 里传递的 lowAppId (低代码应用ID)\n     *\n     * @param request\n     * @return\n     */\n    public static String getLowAppIdByRequest(HttpServletRequest request) {\n        String lowAppId = request.getParameter(TenantConstant.FIELD_LOW_APP_ID);\n        if (lowAppId == null) {\n            lowAppId = oConvertUtils.getString(request.getHeader(TenantConstant.X_LOW_APP_ID));\n        }\n        return lowAppId;\n    }\n\n    /**\n     * 验证Token\n     */\n    public static boolean verifyToken(HttpServletRequest request, CommonAPI commonApi, RedisUtil redisUtil) {\n        log.debug(\" -- url --\" + request.getRequestURL());\n        String token = getTokenByRequest(request);\n        return TokenUtils.verifyToken(token, commonApi, redisUtil);\n    }\n\n    /**\n     * 验证Token\n     */\n    public static boolean verifyToken(String token, CommonAPI commonApi, RedisUtil redisUtil) {\n        if (StringUtils.isBlank(token)) {\n            throw new JeecgBoot401Exception(\"token不能为空!\");\n        }\n\n        // 解密获得username，用于和数据库进行对比\n        String username = JwtUtil.getUsername(token);\n        if (username == null) {\n            throw new JeecgBoot401Exception(\"token非法无效!\");\n        }\n\n        // 查询用户信息\n        LoginUser user = TokenUtils.getLoginUser(username, commonApi, redisUtil);\n        //LoginUser user = commonApi.getUserByName(username);\n        if (user == null) {\n            throw new JeecgBoot401Exception(\"用户不存在!\");\n        }\n        // 判断用户状态\n        if (user.getStatus() != 1) {\n            throw new JeecgBoot401Exception(\"账号已被锁定,请联系管理员!\");\n        }\n        // 校验token是否超时失效 & 或者账号密码是否错误\n        if (!jwtTokenRefresh(token, username, user.getPassword(), redisUtil)) {\n            // 用户登录Token过期提示信息\n            String userLoginTokenErrorMsg = oConvertUtils.getString(redisUtil.get(CommonConstant.PREFIX_USER_TOKEN_ERROR_MSG + token));\n            throw new JeecgBoot401Exception(oConvertUtils.isEmpty(userLoginTokenErrorMsg)? CommonConstant.TOKEN_IS_INVALID_MSG: userLoginTokenErrorMsg);\n        }\n        return true;\n    }\n\n    /**\n     * 刷新token（保证用户在线操作不掉线）\n     * @param token\n     * @param userName\n     * @param passWord\n     * @param redisUtil\n     * @return\n     */\n    private static boolean jwtTokenRefresh(String token, String userName, String passWord, RedisUtil redisUtil) {\n        String cacheToken = oConvertUtils.getString(redisUtil.get(CommonConstant.PREFIX_USER_TOKEN + token));\n        if (oConvertUtils.isNotEmpty(cacheToken)) {\n            // 校验token有效性\n            if (!JwtUtil.verify(cacheToken, userName, passWord)) {\n                // 从token中解析客户端类型，保持续期时使用相同的客户端类型\n                String clientType = JwtUtil.getClientType(token);\n                String newAuthorization = JwtUtil.sign(userName, passWord, clientType);\n                // 根据客户端类型设置对应的缓存有效时间\n                long expireTime = CommonConstant.CLIENT_TYPE_APP.equalsIgnoreCase(clientType) \n                    ? JwtUtil.APP_EXPIRE_TIME * 2 / 1000 \n                    : JwtUtil.EXPIRE_TIME * 2 / 1000;\n                redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, newAuthorization);\n                redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, expireTime);\n            }\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * 获取登录用户\n     *\n     * @param commonApi\n     * @param username\n     * @return\n     */\n    public static LoginUser getLoginUser(String username, CommonAPI commonApi, RedisUtil redisUtil) {\n        LoginUser loginUser = null;\n        String loginUserKey = CacheConstant.SYS_USERS_CACHE + \"::\" + username;\n        //【重要】此处通过redis原生获取缓存用户，是为了解决微服务下system服务挂了，其他服务互调不通问题---\n        if (redisUtil.hasKey(loginUserKey)) {\n            try {\n                loginUser = (LoginUser) redisUtil.get(loginUserKey);\n                //解密用户\n                SensitiveInfoUtil.handlerObject(loginUser, false);\n            } catch (IllegalAccessException e) {\n                e.printStackTrace();\n            }\n        } else {\n            // 查询用户信息\n            loginUser = commonApi.getUserByName(username);\n        }\n        return loginUser;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/UUIDGenerator.java",
    "content": "package org.jeecg.common.util;\n\n\nimport java.net.InetAddress;\n\n/**\n * \n * @Author  张代浩\n *\n */\npublic class UUIDGenerator {\n\n\t\n\t/**\n\t * 产生一个32位的UUID\n\t * \n\t * @return\n\t */\n\n\tpublic static String generate() {\n\t\treturn new StringBuilder(32).append(format(getIp())).append(\n\t\t\t\tformat(getJvm())).append(format(getHiTime())).append(\n\t\t\t\tformat(getLoTime())).append(format(getCount())).toString();\n\t\t\n\t}\n\n\tprivate static final int IP;\n\tstatic {\n\t\tint ipadd;\n\t\ttry {\n\t\t\tipadd = toInt(InetAddress.getLocalHost().getAddress());\n\t\t} catch (Exception e) {\n\t\t\tipadd = 0;\n\t\t}\n\t\tIP = ipadd;\n\t}\n\n\tprivate static short counter = (short) 0;\n\n\tprivate static final int JVM = (int) (System.currentTimeMillis() >>> 8);\n\n\tprivate final static String format(int intval) {\n\t\tString formatted = Integer.toHexString(intval);\n\t\tStringBuilder buf = new StringBuilder(\"00000000\");\n\t\tbuf.replace(8 - formatted.length(), 8, formatted);\n\t\treturn buf.toString();\n\t}\n\n\tprivate final static String format(short shortval) {\n\t\tString formatted = Integer.toHexString(shortval);\n\t\tStringBuilder buf = new StringBuilder(\"0000\");\n\t\tbuf.replace(4 - formatted.length(), 4, formatted);\n\t\treturn buf.toString();\n\t}\n\n\tprivate final static int getJvm() {\n\t\treturn JVM;\n\t}\n\n\tprivate final static short getCount() {\n\t\tsynchronized (UUIDGenerator.class) {\n\t\t\tif (counter < 0) {\n\t\t\t\tcounter = 0;\n\t\t\t}\n\t\t\treturn counter++;\n\t\t}\n\t}\n\n\t/**\n\t * Unique in a local network\n\t */\n\tprivate final static int getIp() {\n\t\treturn IP;\n\t}\n\n\t/**\n\t * Unique down to millisecond\n\t */\n\tprivate final static short getHiTime() {\n\t\treturn (short) (System.currentTimeMillis() >>> 32);\n\t}\n\n\tprivate final static int getLoTime() {\n\t\treturn (int) System.currentTimeMillis();\n\t}\n\n\tprivate final static int toInt(byte[] bytes) {\n\t\tint result = 0;\n\t\tint length = 4;\n\t\tfor (int i = 0; i < length; i++) {\n\t\t\tresult = (result << 8) - Byte.MIN_VALUE + (int) bytes[i];\n\t\t}\n\t\treturn result;\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/YouBianCodeUtil.java",
    "content": "package org.jeecg.common.util;\n\nimport io.netty.util.internal.StringUtil;\n\n/**\n * 流水号生成规则(按默认规则递增，数字从1-99开始递增，数字到99，递增字母;位数不够增加位数)\n * A001\n * A001A002\n * @Author zhangdaihao\n *\n */\npublic class YouBianCodeUtil {\n\n\t// 数字位数(默认生成3位的数字)\n\n    /**代表数字位数*/\n\tprivate static final int NUM_LENGTH = 2;\n\n\tpublic static final int ZHANWEI_LENGTH = 1+ NUM_LENGTH;\n\n\tpublic static final char LETTER= 'Z';\n\n\t/**\n\t * 根据前一个code，获取同级下一个code\n\t * 例如:当前最大code为D01A04，下一个code为：D01A05\n\t * \n\t * @param code\n\t * @return\n\t */\n\tpublic static synchronized String getNextYouBianCode(String code) {\n\t\tString newcode = \"\";\n\t\tif (oConvertUtils.isEmpty(code)) {\n\t\t\tString zimu = \"A\";\n\t\t\tString num = getStrNum(1);\n\t\t\tnewcode = zimu + num;\n\t\t} else {\n\t\t\tString beforeCode = code.substring(0, code.length() - 1- NUM_LENGTH);\n\t\t\tString afterCode = code.substring(code.length() - 1 - NUM_LENGTH,code.length());\n\t\t\tchar afterCodeZimu = afterCode.substring(0, 1).charAt(0);\n\t\t\tInteger afterCodeNum = Integer.parseInt(afterCode.substring(1));\n//\t\t\torg.jeecgframework.core.util.LogUtil.info(after_code);\n//\t\t\torg.jeecgframework.core.util.LogUtil.info(after_code_zimu);\n//\t\t\torg.jeecgframework.core.util.LogUtil.info(after_code_num);\n\n\t\t\tString nextNum = \"\";\n\t\t\tchar nextZimu = 'A';\n\t\t\t// 先判断数字等于999*，则计数从1重新开始，递增\n\t\t\tif (afterCodeNum == getMaxNumByLength(NUM_LENGTH)) {\n\t\t\t\tnextNum = getNextStrNum(0);\n\t\t\t} else {\n\t\t\t\tnextNum = getNextStrNum(afterCodeNum);\n\t\t\t}\n\t\t\t// 先判断数字等于999*，则字母从A重新开始,递增\n\t\t\tif(afterCodeNum == getMaxNumByLength(NUM_LENGTH)) {\n\t\t\t\tnextZimu = getNextZiMu(afterCodeZimu);\n\t\t\t}else{\n\t\t\t\tnextZimu = afterCodeZimu;\n\t\t\t}\n\n\t\t\t// 例如Z99，下一个code就是Z99A01\n\t\t\tif (LETTER == afterCodeZimu && getMaxNumByLength(NUM_LENGTH) == afterCodeNum) {\n\t\t\t\tnewcode = code + (nextZimu + nextNum);\n\t\t\t} else {\n\t\t\t\tnewcode = beforeCode + (nextZimu + nextNum);\n\t\t\t}\n\t\t}\n\t\treturn newcode;\n\n\t}\n\n\t/**\n\t * 根据父亲code,获取下级的下一个code\n\t * \n\t * 例如：父亲CODE:A01\n\t *       当前CODE:A01B03\n\t *       获取的code:A01B04\n\t *       \n\t * @param parentCode   上级code\n\t * @param localCode    同级code\n\t * @return\n\t */\n\tpublic static synchronized String getSubYouBianCode(String parentCode,String localCode) {\n\t\tif(localCode!=null && localCode!=\"\"){\n\n//\t\t\treturn parentCode + getNextYouBianCode(localCode);\n\t\t\treturn getNextYouBianCode(localCode);\n\n\t\t}else{\n\t\t\tparentCode = parentCode + \"A\"+ getNextStrNum(0);\n\t\t}\n\t\treturn parentCode;\n\t}\n\n\t\n\n\t/**\n\t * 将数字前面位数补零\n\t * \n\t * @param num\n\t * @return\n\t */\n\tprivate static String getNextStrNum(int num) {\n\t\treturn getStrNum(getNextNum(num));\n\t}\n\n\t/**\n\t * 将数字前面位数补零\n\t * \n\t * @param num\n\t * @return\n\t */\n\tprivate static String getStrNum(int num) {\n\t\tString s = String.format(\"%0\" + NUM_LENGTH + \"d\", num);\n\t\treturn s;\n\t}\n\n\t/**\n\t * 递增获取下个数字\n\t * \n\t * @param num\n\t * @return\n\t */\n\tprivate static int getNextNum(int num) {\n\t\tnum++;\n\t\treturn num;\n\t}\n\n\t/**\n\t * 递增获取下个字母\n\t * \n\t * @param num\n\t * @return\n\t */\n\tprivate static char getNextZiMu(char zimu) {\n\t\tif (zimu == LETTER) {\n\t\t\treturn 'A';\n\t\t}\n\t\tzimu++;\n\t\treturn zimu;\n\t}\n\t\n\t/**\n\t * 根据数字位数获取最大值\n\t * @param length\n\t * @return\n\t */\n\tprivate static int getMaxNumByLength(int length){\n\t\tif(length==0){\n\t\t\treturn 0;\n\t\t}\n        StringBuilder maxNum = new StringBuilder();\n\t\tfor (int i=0;i<length;i++){\n            maxNum.append(\"9\");\n\t\t}\n\t\treturn Integer.parseInt(maxNum.toString());\n\t}\n\tpublic static String[] cutYouBianCode(String code){\n\t\tif(code==null || StringUtil.isNullOrEmpty(code)){\n\t\t\treturn null;\n\t\t}else{\n\t\t\t//获取标准长度为numLength+1,截取的数量为code.length/numLength+1\n\t\t\tint c = code.length()/(NUM_LENGTH +1);\n\t\t\tString[] cutcode = new String[c];\n\t\t\tfor(int i =0 ; i <c;i++){\n\t\t\t\tcutcode[i] = code.substring(0,(i+1)*(NUM_LENGTH +1));\n\t\t\t}\n\t\t\treturn cutcode;\n\t\t}\n\t\t\n\t}\n//\tpublic static void main(String[] args) {\n//\t\t// org.jeecgframework.core.util.LogUtil.info(getNextZiMu('C'));\n//\t\t// org.jeecgframework.core.util.LogUtil.info(getNextNum(8));\n//\t    // org.jeecgframework.core.util.LogUtil.info(cutYouBianCode(\"C99A01B01\")[2]);\n//\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/dynamic/db/DataSourceCachePool.java",
    "content": "package org.jeecg.common.util.dynamic.db;\n\nimport com.alibaba.druid.pool.DruidDataSource;\nimport org.jeecg.common.api.CommonAPI;\nimport org.jeecg.common.constant.CacheConstant;\nimport org.jeecg.common.system.vo.DynamicDataSourceModel;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport java.util.HashMap;\nimport java.util.Map;\n\n\n/**\n * 数据源缓存池\n * @author: jeecg-boot\n */\npublic class DataSourceCachePool {\n    /** 数据源连接池缓存【本地 class缓存 - 不支持分布式】 */\n    private static Map<String, DruidDataSource> dbSources = new HashMap<>();\n    private static RedisTemplate<String, Object> redisTemplate;\n\n    private static RedisTemplate<String, Object> getRedisTemplate() {\n        if (redisTemplate == null) {\n            redisTemplate = (RedisTemplate<String, Object>) SpringContextUtils.getBean(\"redisTemplate\");\n        }\n        return redisTemplate;\n    }\n\n    /**\n     * 获取多数据源缓存\n     *\n     * @param dbKey\n     * @return\n     */\n    public static DynamicDataSourceModel getCacheDynamicDataSourceModel(String dbKey) {\n        String redisCacheKey = CacheConstant.SYS_DYNAMICDB_CACHE + dbKey;\n        if (getRedisTemplate().hasKey(redisCacheKey)) {\n            return (DynamicDataSourceModel) getRedisTemplate().opsForValue().get(redisCacheKey);\n        }\n        CommonAPI commonApi = SpringContextUtils.getBean(CommonAPI.class);\n        DynamicDataSourceModel dbSource = commonApi.getDynamicDbSourceByCode(dbKey);\n        if (dbSource != null) {\n            getRedisTemplate().opsForValue().set(redisCacheKey, dbSource);\n        }\n        return dbSource;\n    }\n\n    public static DruidDataSource getCacheBasicDataSource(String dbKey) {\n        return dbSources.get(dbKey);\n    }\n\n    /**\n     * put 数据源缓存\n     *\n     * @param dbKey\n     * @param db\n     */\n    public static void putCacheBasicDataSource(String dbKey, DruidDataSource db) {\n        dbSources.put(dbKey, db);\n    }\n\n    /**\n     * 清空数据源缓存\n     */\n    public static void cleanAllCache() {\n        //关闭数据源连接\n        for(Map.Entry<String, DruidDataSource> entry : dbSources.entrySet()){\n            String dbkey = entry.getKey();\n            DruidDataSource druidDataSource = entry.getValue();\n            if(druidDataSource!=null && druidDataSource.isEnable()){\n                druidDataSource.close();\n            }\n            //清空redis缓存\n            getRedisTemplate().delete(CacheConstant.SYS_DYNAMICDB_CACHE + dbkey);\n        }\n        //清空缓存\n        dbSources.clear();\n    }\n\n    public static void removeCache(String dbKey) {\n        //关闭数据源连接\n        DruidDataSource druidDataSource = dbSources.get(dbKey);\n        if(druidDataSource!=null && druidDataSource.isEnable()){\n            druidDataSource.close();\n        }\n        //清空redis缓存\n        getRedisTemplate().delete(CacheConstant.SYS_DYNAMICDB_CACHE + dbKey);\n        //清空缓存\n        dbSources.remove(dbKey);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/dynamic/db/DbTypeUtils.java",
    "content": "package org.jeecg.common.util.dynamic.db;\n\nimport com.baomidou.mybatisplus.annotation.DbType;\nimport org.jeecg.common.constant.DataBaseConstant;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * 数据库类型判断\n * 【有些数据库引擎是一样的，以达到复用目的】\n * @author: jeecg-boot\n */\npublic class DbTypeUtils {\n\n    public static Map<String, String> dialectMap = new HashMap<String, String>();\n    static{\n        dialectMap.put(\"mysql\", \"org.hibernate.dialect.MySQL5InnoDBDialect\");\n        // mariadb数据库 1  --\n        dialectMap.put(\"mariadb\", \"org.hibernate.dialect.MariaDBDialect\");\n        //oracle数据库 1\n        dialectMap.put(\"oracle\", \"org.hibernate.dialect.OracleDialect\");\n        // TODO 没找到不确定\n        dialectMap.put(\"oracle12c\", \"org.hibernate.dialect.OracleDialect\");\n        // db2数据库 1xx\n        dialectMap.put(\"db2\", \"org.hibernate.dialect.DB2390Dialect\");\n        // H2数据库\n        dialectMap.put(\"h2\", \"org.hibernate.dialect.HSQLDialect\");\n        // HSQL数据库  1\n        dialectMap.put(\"hsql\", \"org.hibernate.dialect.HSQLDialect\");\n        //SQLite数据库 应用平台mobile\n        dialectMap.put(\"sqlite\", \"org.jeecg.modules.online.config.dialect.SQLiteDialect\");\n        //PostgreSQL数据库1  --\n        dialectMap.put(\"postgresql\", \"org.hibernate.dialect.PostgreSQLDialect\");\n        dialectMap.put(\"sqlserver2005\", \"org.hibernate.dialect.SQLServer2005Dialect\");\n        //sqlserver数据库1\n        dialectMap.put(\"sqlserver\", \"org.hibernate.dialect.SQLServerDialect\");\n        //达梦数据库 [国产] 1--\n        dialectMap.put(\"dm\", \"org.hibernate.dialect.DmDialect\");\n        //虚谷数据库\n        dialectMap.put(\"xugu\", \"org.hibernate.dialect.HSQLDialect\");\n        //人大金仓 [国产] 1\n        dialectMap.put(\"kingbasees\", \"org.hibernate.dialect.PostgreSQLDialect\");\n        // Phoenix HBase数据库\n        dialectMap.put(\"phoenix\", \"org.hibernate.dialect.HSQLDialect\");\n        // Gauss 数据库\n        dialectMap.put(\"zenith\", \"org.hibernate.dialect.PostgreSQLDialect\");\n        //阿里云PolarDB\n        dialectMap.put(\"clickhouse\", \"org.hibernate.dialect.MySQLDialect\");\n        // 南大通用数据库 TODO 没找到不确定\n        dialectMap.put(\"gbase\", \"org.hibernate.dialect.PostgreSQLDialect\");\n        //神通数据库 [国产] TODO 没找到不确定\n        dialectMap.put(\"oscar\", \"org.hibernate.dialect.PostgreSQLDialect\");\n        //Sybase ASE 数据库\n        dialectMap.put(\"sybase\", \"org.hibernate.dialect.SybaseDialect\");\n        dialectMap.put(\"oceanbase\", \"org.hibernate.dialect.PostgreSQLDialect\");\n        dialectMap.put(\"Firebird\", \"org.hibernate.dialect.FirebirdDialect\");\n        //瀚高数据库\n        dialectMap.put(\"highgo\", \"org.hibernate.dialect.HSQLDialect\");\n        dialectMap.put(\"other\", \"org.hibernate.dialect.PostgreSQLDialect\");\n    }\n\n    public static boolean dbTypeIsMySql(DbType dbType) {\n        return dbTypeIf(dbType, DbType.MYSQL, DbType.MARIADB, DbType.CLICK_HOUSE, DbType.SQLITE);\n    }\n\n    public static boolean dbTypeIsOracle(DbType dbType) {\n        return dbTypeIf(dbType, DbType.ORACLE, DbType.ORACLE_12C, DbType.DM);\n    }\n\n    /**\n     * 是否是达梦\n     */\n    public static boolean dbTypeIsDm(DbType dbType) {\n        return dbTypeIf(dbType, DbType.DM);\n    }\n\n    public static boolean dbTypeIsSqlServer(DbType dbType) {\n        return dbTypeIf(dbType, DbType.SQL_SERVER, DbType.SQL_SERVER2005);\n    }\n\n    public static boolean dbTypeIsPostgre(DbType dbType) {\n        return dbTypeIf(dbType, DbType.POSTGRE_SQL, DbType.KINGBASE_ES, DbType.GAUSS);\n    }\n\n\n\n    /**\n     *  根据枚举类 获取数据库类型的字符串\n     * @param dbType\n     * @return\n     */\n    public static String getDbTypeString(DbType dbType){\n        if(DbType.DB2.equals(dbType)){\n            return DataBaseConstant.DB_TYPE_DB2;\n        }else if(DbType.HSQL.equals(dbType)){\n            return DataBaseConstant.DB_TYPE_HSQL;\n        }else if(dbTypeIsOracle(dbType)){\n            return DataBaseConstant.DB_TYPE_ORACLE;\n        }else if(dbTypeIsSqlServer(dbType)){\n            return DataBaseConstant.DB_TYPE_SQLSERVER;\n        }else if(dbTypeIsPostgre(dbType)){\n            return DataBaseConstant.DB_TYPE_POSTGRESQL;\n        }\n        return DataBaseConstant.DB_TYPE_MYSQL;\n    }\n\n    /**\n     *  根据枚举类 获取数据库方言字符串\n     * @param dbType\n     * @return\n     */\n    public static String getDbDialect(DbType dbType){\n        return dialectMap.get(dbType.getDb());\n    }\n\n    /**\n     * 判断数据库类型\n     */\n    public static boolean dbTypeIf(DbType dbType, DbType... correctTypes) {\n        for (DbType type : correctTypes) {\n            if (type.equals(dbType)) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/dynamic/db/DynamicDBUtil.java",
    "content": "package org.jeecg.common.util.dynamic.db;\n\nimport com.alibaba.druid.pool.DruidDataSource;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.ArrayUtils;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.vo.DynamicDataSourceModel;\nimport org.jeecg.common.util.ReflectHelper;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.springframework.jdbc.core.JdbcTemplate;\nimport org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;\n\nimport javax.sql.DataSource;\nimport java.sql.SQLException;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * Spring JDBC 实时数据库访问\n *\n * @author chenguobin\n * @version 1.0\n * @date 2014-09-05\n */\n@Slf4j\npublic class DynamicDBUtil {\n\n    /**\n     * 获取数据源【最底层方法，不要随便调用】\n     *\n     * @param dbSource\n     * @return\n     */\n    private static DruidDataSource getJdbcDataSource(final DynamicDataSourceModel dbSource) {\n        DruidDataSource dataSource = new DruidDataSource();\n\n        String driverClassName = dbSource.getDbDriver();\n        String url = dbSource.getDbUrl();\n        // url配置成 “123” 会触发Druid死循环，一直去重复尝试连接\n        if (oConvertUtils.isEmpty(url) || !url.toLowerCase().startsWith(\"jdbc:\")) {\n            throw new JeecgBootException(\"数据源URL配置格式不正确！\");\n        }\n        \n        String dbUser = dbSource.getDbUsername();\n        String dbPassword = dbSource.getDbPassword();\n        dataSource.setDriverClassName(driverClassName);\n        dataSource.setUrl(url);\n        //dataSource.setValidationQuery(\"SELECT 1 FROM DUAL\");\n        dataSource.setTestWhileIdle(true);\n        dataSource.setTestOnBorrow(false);\n        dataSource.setTestOnReturn(false);\n        dataSource.setBreakAfterAcquireFailure(true);\n        //设置超时时间60秒\n        dataSource.setLoginTimeout(60);\n        dataSource.setConnectionErrorRetryAttempts(0);\n        dataSource.setUsername(dbUser);\n        dataSource.setMaxWait(30000);\n        dataSource.setPassword(dbPassword);\n\n        log.info(\"******************************************\");\n        log.info(\"*                                        *\");\n        log.info(\"*====【\"+dbSource.getCode()+\"】=====Druid连接池已启用 ====*\");\n        log.info(\"*                                        *\");\n        log.info(\"******************************************\");\n        return dataSource;\n    }\n\n    /**\n     * 通过 dbKey ,获取数据源\n     *\n     * @param dbKey\n     * @return\n     */\n    public static DruidDataSource getDbSourceByDbKey(final String dbKey) {\n        //获取多数据源配置\n        DynamicDataSourceModel dbSource = DataSourceCachePool.getCacheDynamicDataSourceModel(dbKey);\n        //先判断缓存中是否存在数据库链接\n        DruidDataSource cacheDbSource = DataSourceCachePool.getCacheBasicDataSource(dbKey);\n        if (cacheDbSource != null && !cacheDbSource.isClosed()) {\n            log.debug(\"--------getDbSourceBydbKey------------------从缓存中获取DB连接-------------------\");\n            return cacheDbSource;\n        } else {\n            DruidDataSource dataSource = getJdbcDataSource(dbSource);\n            if(dataSource!=null && dataSource.isEnable()){\n\n                // 【TV360X-2060】设置超时时间 6秒\n                dataSource.setMaxWait(6000);\n\n                DataSourceCachePool.putCacheBasicDataSource(dbKey, dataSource);\n            }else{\n                throw new JeecgBootException(\"动态数据源连接失败，dbKey：\"+dbKey);\n            }\n            log.info(\"--------getDbSourceBydbKey------------------创建DB数据库连接-------------------\");\n            return dataSource;\n        }\n    }\n\n    /**\n     * 关闭数据库连接池\n     *\n     * @param dbKey\n     * @return\n     */\n    public static void closeDbKey(final String dbKey) {\n        DruidDataSource dataSource = getDbSourceByDbKey(dbKey);\n        try {\n            if (dataSource != null && !dataSource.isClosed()) {\n                dataSource.getConnection().commit();\n                dataSource.getConnection().close();\n                dataSource.close();\n                DataSourceCachePool.removeCache(dbKey);\n            }\n        } catch (SQLException e) {\n            log.warn(e.getMessage(), e);\n        }\n    }\n\n\n    private static JdbcTemplate getJdbcTemplate(String dbKey) {\n        DruidDataSource dataSource = getDbSourceByDbKey(dbKey);\n        return new JdbcTemplate(dataSource);\n    }\n\n    /**\n     * 根据数据源获取NamedParameterJdbcTemplate\n     * @param dbKey\n     * @return\n     */\n    private static NamedParameterJdbcTemplate getNamedParameterJdbcTemplate(String dbKey) {\n        DruidDataSource dataSource = getDbSourceByDbKey(dbKey);\n        return new NamedParameterJdbcTemplate(dataSource);\n    }\n\n    /**\n     * Executes the SQL statement in this <code>PreparedStatement</code> object,\n     * which must be an SQL Data Manipulation Language (DML) statement, such as <code>INSERT</code>, <code>UPDATE</code> or\n     * <code>DELETE</code>; or an SQL statement that returns nothing,\n     * such as a DDL statement.\n     */\n    public static int update(final String dbKey, String sql, Object... param) {\n        int effectCount;\n        JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey);\n        if (ArrayUtils.isEmpty(param)) {\n            effectCount = jdbcTemplate.update(sql);\n        } else {\n            effectCount = jdbcTemplate.update(sql, param);\n        }\n        return effectCount;\n    }\n\n    /**\n     * 支持miniDao语法操作的Update\n     *\n     * @param dbKey 数据源标识\n     * @param sql   执行sql语句，sql支持minidao语法逻辑\n     * @param data  sql语法中需要判断的数据及sql拼接注入中需要的数据\n     * @return\n     */\n    public static int updateByHash(final String dbKey, String sql, HashMap<String, Object> data) {\n        int effectCount;\n        JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey);\n        //根据模板获取sql\n        sql = FreemarkerParseFactory.parseTemplateContent(sql, data);\n        NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource());\n        effectCount = namedParameterJdbcTemplate.update(sql, data);\n        return effectCount;\n    }\n\n    public static Object findOne(final String dbKey, String sql, Object... param) {\n        List<Map<String, Object>> list;\n        list = findList(dbKey, sql, param);\n        if (oConvertUtils.listIsEmpty(list)) {\n            log.error(\"Except one, but not find actually\");\n            return null;\n        }\n        if (list.size() > 1) {\n            log.error(\"Except one, but more than one actually\");\n        }\n        return list.get(0);\n    }\n\n    /**\n     * 支持miniDao语法操作的查询 返回HashMap\n     *\n     * @param dbKey 数据源标识\n     * @param sql   执行sql语句，sql支持minidao语法逻辑\n     * @param data  sql语法中需要判断的数据及sql拼接注入中需要的数据\n     * @return\n     */\n    public static Object findOneByHash(final String dbKey, String sql, HashMap<String, Object> data) {\n        List<Map<String, Object>> list;\n        list = findListByHash(dbKey, sql, data);\n        if (oConvertUtils.listIsEmpty(list)) {\n            log.error(\"Except one, but not find actually\");\n        }\n        if (list.size() > 1) {\n            log.error(\"Except one, but more than one actually\");\n        }\n        return list.get(0);\n    }\n\n    /**\n     * 直接sql查询 根据clazz返回单个实例\n     *\n     * @param dbKey 数据源标识\n     * @param sql   执行sql语句\n     * @param clazz 返回实例的Class\n     * @param param\n     * @return\n     */\n    @SuppressWarnings(\"unchecked\")\n    public static <T> Object findOne(final String dbKey, String sql, Class<T> clazz, Object... param) {\n        Map<String, Object> map = (Map<String, Object>) findOne(dbKey, sql, param);\n        return ReflectHelper.setAll(clazz, map);\n    }\n\n    /**\n     * 支持miniDao语法操作的查询 返回单个实例\n     *\n     * @param dbKey 数据源标识\n     * @param sql   执行sql语句，sql支持minidao语法逻辑\n     * @param clazz 返回实例的Class\n     * @param data  sql语法中需要判断的数据及sql拼接注入中需要的数据\n     * @return\n     */\n    @SuppressWarnings(\"unchecked\")\n    public static <T> Object findOneByHash(final String dbKey, String sql, Class<T> clazz, HashMap<String, Object> data) {\n        Map<String, Object> map = (Map<String, Object>) findOneByHash(dbKey, sql, data);\n        return ReflectHelper.setAll(clazz, map);\n    }\n\n    public static List<Map<String, Object>> findList(final String dbKey, String sql, Object... param) {\n        List<Map<String, Object>> list;\n        JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey);\n\n        if (ArrayUtils.isEmpty(param)) {\n            list = jdbcTemplate.queryForList(sql);\n        } else {\n            list = jdbcTemplate.queryForList(sql, param);\n        }\n        return list;\n    }\n\n    /**\n     * 查询数量\n     * @param dbKey\n     * @param sql\n     * @param param\n     * @return\n     */\n    public static Map<String, Object> queryCount(String dbKey, String sql, Map<String, Object> param){\n        NamedParameterJdbcTemplate npJdbcTemplate = getNamedParameterJdbcTemplate(dbKey);\n        return npJdbcTemplate.queryForMap(sql, param);\n    }\n\n    /**\n     * 查询列表数据\n     * @param dbKey\n     * @param sql\n     * @param param\n     * @return\n     */\n    public static List<Map<String, Object>> findListByNamedParam(final String dbKey, String sql, Map<String, Object> param) {\n        NamedParameterJdbcTemplate npJdbcTemplate = getNamedParameterJdbcTemplate(dbKey);\n        List<Map<String, Object>> list = npJdbcTemplate.queryForList(sql, param);\n        return list;\n    }\n\n    /**\n     * 支持miniDao语法操作的查询\n     *\n     * @param dbKey 数据源标识\n     * @param sql   执行sql语句，sql支持minidao语法逻辑\n     * @param data  sql语法中需要判断的数据及sql拼接注入中需要的数据\n     * @return\n     */\n    public static List<Map<String, Object>> findListByHash(final String dbKey, String sql, HashMap<String, Object> data) {\n        List<Map<String, Object>> list;\n        JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey);\n        //根据模板获取sql\n        sql = FreemarkerParseFactory.parseTemplateContent(sql, data);\n        NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource());\n        list = namedParameterJdbcTemplate.queryForList(sql, data);\n        return list;\n    }\n\n    /**\n     * 此方法只能返回单列，不能返回实体类\n     * @param dbKey 数据源的key\n     * @param sql sal\n     * @param clazz 类\n     * @param param 参数\n     * @param <T>\n     * @return\n     */\n    public static <T> List<T> findList(final String dbKey, String sql, Class<T> clazz, Object... param) {\n        List<T> list;\n        JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey);\n\n        if (ArrayUtils.isEmpty(param)) {\n            list = jdbcTemplate.queryForList(sql, clazz);\n        } else {\n            list = jdbcTemplate.queryForList(sql, clazz, param);\n        }\n        return list;\n    }\n\n    /**\n     * 支持miniDao语法操作的查询 返回单列数据list\n     *\n     * @param dbKey 数据源标识\n     * @param sql   执行sql语句，sql支持minidao语法逻辑\n     * @param clazz 类型Long、String等\n     * @param data  sql语法中需要判断的数据及sql拼接注入中需要的数据\n     * @return\n     */\n    public static <T> List<T> findListByHash(final String dbKey, String sql, Class<T> clazz, HashMap<String, Object> data) {\n        List<T> list;\n        JdbcTemplate jdbcTemplate = getJdbcTemplate(dbKey);\n        //根据模板获取sql\n        sql = FreemarkerParseFactory.parseTemplateContent(sql, data);\n        NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource());\n        list = namedParameterJdbcTemplate.queryForList(sql, data, clazz);\n        return list;\n    }\n\n    /**\n     * 直接sql查询 返回实体类列表\n     *\n     * @param dbKey 数据源标识\n     * @param sql   执行sql语句，sql支持 minidao 语法逻辑\n     * @param clazz 返回实体类列表的class\n     * @param param sql拼接注入中需要的数据\n     * @return\n     */\n    public static <T> List<T> findListEntities(final String dbKey, String sql, Class<T> clazz, Object... param) {\n        List<Map<String, Object>> queryList = findList(dbKey, sql, param);\n        return ReflectHelper.transList2Entrys(queryList, clazz);\n    }\n\n    /**\n     * 支持miniDao语法操作的查询 返回实体类列表\n     *\n     * @param dbKey 数据源标识\n     * @param sql   执行sql语句，sql支持minidao语法逻辑\n     * @param clazz 返回实体类列表的class\n     * @param data  sql语法中需要判断的数据及sql拼接注入中需要的数据\n     * @return\n     */\n    public static <T> List<T> findListEntitiesByHash(final String dbKey, String sql, Class<T> clazz, HashMap<String, Object> data) {\n        List<Map<String, Object>> queryList = findListByHash(dbKey, sql, data);\n        return ReflectHelper.transList2Entrys(queryList, clazz);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/dynamic/db/FreemarkerParseFactory.java",
    "content": "package org.jeecg.common.util.dynamic.db;\n\nimport freemarker.cache.StringTemplateLoader;\nimport freemarker.core.ParseException;\nimport freemarker.core.TemplateClassResolver;\nimport freemarker.template.Configuration;\nimport freemarker.template.Template;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.jeecg.common.constant.DataBaseConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecgframework.codegenerate.generate.util.SimpleFormat;\n\nimport java.io.StringWriter;\nimport java.util.Map;\nimport java.util.regex.Pattern;\n\n/**\n * @author 赵俊夫\n * @version V1.0\n * @Title:FreemarkerHelper\n * @description:Freemarker引擎协助类\n * @date Jul 5, 2013 2:58:29 PM\n */\n@Slf4j\npublic class FreemarkerParseFactory {\n\n    private static final String ENCODE = \"utf-8\";\n    /**\n     * 参数格式化工具类\n     */\n    private static final String MINI_DAO_FORMAT = \"DaoFormat\";\n\n    /**\n     * 文件缓存\n     */\n    private static final Configuration TPL_CONFIG = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);\n    /**\n     * SQL 缓存\n     */\n    private static final Configuration SQL_CONFIG = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);\n\n    private static StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();\n\n    /**使用内嵌的(?ms)打开单行和多行模式*/\n    private final static Pattern NOTES_PATTERN = Pattern\n            .compile(\"(?ms)/\\\\*.*?\\\\*/|^\\\\s*//.*?$\");\n\n    static {\n        TPL_CONFIG.setClassForTemplateLoading(new FreemarkerParseFactory().getClass(), \"/\");\n        TPL_CONFIG.setNumberFormat(\"0.#####################\");\n        SQL_CONFIG.setTemplateLoader(stringTemplateLoader);\n        SQL_CONFIG.setNumberFormat(\"0.#####################\");\n        //classic_compatible设置，解决报空指针错误\n        SQL_CONFIG.setClassicCompatible(true);\n\n        // 解决freemarker模板注入问题 禁止解析ObjectConstructor，Execute和freemarker.template.utility.JythonRuntime。\n        //https://ackcent.com/in-depth-freemarker-template-injection/\n        TPL_CONFIG.setNewBuiltinClassResolver(TemplateClassResolver.SAFER_RESOLVER);\n        SQL_CONFIG.setNewBuiltinClassResolver(TemplateClassResolver.SAFER_RESOLVER);\n    }\n\n    /**\n     * 判断模板是否存在\n     *\n     * @throws Exception\n     */\n    public static boolean isExistTemplate(String tplName) throws Exception {\n        try {\n            Template mytpl = TPL_CONFIG.getTemplate(tplName, \"UTF-8\");\n            if (mytpl == null) {\n                return false;\n            }\n        } catch (Exception e) {\n            // 代码逻辑说明: 解决问题 - 错误提示sql文件不存在，实际问题是sql freemarker用法错误-----\n            if (e instanceof ParseException) {\n                log.error(e.getMessage(), e.fillInStackTrace());\n                throw new Exception(e);\n            }\n            log.debug(\"----isExistTemplate----\" + e.toString());\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * 解析ftl模板\n     *\n     * @param tplName 模板名\n     * @param paras   参数\n     * @return\n     */\n    public static String parseTemplate(String tplName, Map<String, Object> paras) {\n        try {\n            log.debug(\" minidao sql templdate : \" + tplName);\n            StringWriter swriter = new StringWriter();\n            Template mytpl = TPL_CONFIG.getTemplate(tplName, ENCODE);\n            if (paras.containsKey(MINI_DAO_FORMAT)) {\n                throw new RuntimeException(\"DaoFormat 是 minidao 保留关键字，不允许使用 ，请更改参数定义！\");\n            }\n            paras.put(MINI_DAO_FORMAT, new SimpleFormat());\n            mytpl.process(paras, swriter);\n            String sql = getSqlText(swriter.toString());\n            paras.remove(MINI_DAO_FORMAT);\n            return sql;\n        } catch (Exception e) {\n            log.error(e.getMessage(), e.fillInStackTrace());\n            log.error(\"发送一次的模板key:{ \" + tplName + \" }\");\n            //System.err.println(e.getMessage());\n            //System.err.println(\"模板名:{ \"+ tplName +\" }\");\n            throw new RuntimeException(\"解析SQL模板异常\");\n        }\n    }\n\n    /**\n     * 解析ftl\n     *\n     * @param tplContent 模板内容\n     * @param paras      参数\n     * @return String 模板解析后内容\n     */\n    public static String parseTemplateContent(String tplContent,Map<String, Object> paras) {\n        return parseTemplateContent(tplContent, paras, false);\n    }\n    public static String parseTemplateContent(String tplContent, Map<String, Object> paras, boolean keepSpace) {\n        try {\n            String sqlUnderline=\"sql_\";\n            StringWriter swriter = new StringWriter();\n            if (stringTemplateLoader.findTemplateSource(sqlUnderline + tplContent.hashCode()) == null) {\n                stringTemplateLoader.putTemplate(sqlUnderline + tplContent.hashCode(), tplContent);\n            }\n            Template mytpl = SQL_CONFIG.getTemplate(sqlUnderline + tplContent.hashCode(), ENCODE);\n            if (paras.containsKey(MINI_DAO_FORMAT)) {\n                throw new RuntimeException(\"DaoFormat 是 minidao 保留关键字，不允许使用 ，请更改参数定义！\");\n            }\n            paras.put(MINI_DAO_FORMAT, new SimpleFormat());\n            mytpl.process(paras, swriter);\n            String sql = getSqlText(swriter.toString(), keepSpace);\n            paras.remove(MINI_DAO_FORMAT);\n            return sql;\n        } catch (Exception e) {\n            log.error(e.getMessage(), e.fillInStackTrace());\n            log.error(\"发送一次的模板key:{ \" + tplContent + \" }\");\n            //System.err.println(e.getMessage());\n            //System.err.println(\"模板内容:{ \"+ tplContent +\" }\");\n            throw new RuntimeException(\"解析SQL模板异常\");\n        }\n    }\n\n    /**\n     * 除去无效字段，去掉注释 不然批量处理可能报错 去除无效的等于\n     */\n    private static String getSqlText(String sql) {\n        return getSqlText(sql, false);\n    }\n\n    private static String getSqlText(String sql, boolean keepSpace) {\n        // 将注释替换成\"\"\n        sql = NOTES_PATTERN.matcher(sql).replaceAll(\"\");\n        if (!keepSpace) {\n            sql = sql.replaceAll(\"\\\\n\", \" \").replaceAll(\"\\\\t\", \" \")\n                    .replaceAll(\"\\\\s{1,}\", \" \").trim();\n        }\n        // 去掉 最后是 where这样的问题\n        //where空格 \"where \"\n        String whereSpace = DataBaseConstant.SQL_WHERE+\" \";\n        //\"where and\"\n        String whereAnd = DataBaseConstant.SQL_WHERE+\" and\";\n        //\", where\"\n        String commaWhere = SymbolConstant.COMMA+\" \"+DataBaseConstant.SQL_WHERE;\n        //\", \"\n        String commaSpace = SymbolConstant.COMMA + \" \";\n        if (sql.endsWith(DataBaseConstant.SQL_WHERE) || sql.endsWith(whereSpace)) {\n            sql = sql.substring(0, sql.lastIndexOf(\"where\"));\n        }\n        // 去掉where and 这样的问题\n        int index = 0;\n        while ((index = StringUtils.indexOfIgnoreCase(sql, whereAnd, index)) != -1) {\n            sql = sql.substring(0, index + 5)\n                    + sql.substring(index + 9, sql.length());\n        }\n        // 去掉 , where 这样的问题\n        index = 0;\n        while ((index = StringUtils.indexOfIgnoreCase(sql, commaWhere, index)) != -1) {\n            sql = sql.substring(0, index)\n                    + sql.substring(index + 1, sql.length());\n        }\n        // 去掉 最后是 ,这样的问题\n        if (sql.endsWith(SymbolConstant.COMMA) || sql.endsWith(commaSpace)) {\n            sql = sql.substring(0, sql.lastIndexOf(\",\"));\n        }\n        return sql;\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/encryption/AesEncryptUtil.java",
    "content": "package org.jeecg.common.util.encryption;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.lang.codec.Base64;\nimport org.jeecg.common.util.oConvertUtils;\nimport javax.crypto.Cipher;\nimport javax.crypto.spec.IvParameterSpec;\nimport javax.crypto.spec.SecretKeySpec;\nimport java.nio.charset.StandardCharsets;\n\n/**\n * AES 工具 (兼容历史 NoPadding + 新 PKCS5Padding)\n */\n@Slf4j\npublic class AesEncryptUtil {\n\n    private static final String KEY = EncryptedString.key;\n    private static final String IV  = EncryptedString.iv;\n\n    /* -------- 新版：CBC + PKCS5Padding (与前端 CryptoJS Pkcs7 兼容) -------- */\n    private static String decryptPkcs5(String cipherBase64) throws Exception {\n        Cipher cipher = Cipher.getInstance(\"AES/CBC/PKCS5Padding\");\n        SecretKeySpec ks = new SecretKeySpec(KEY.getBytes(StandardCharsets.UTF_8), \"AES\");\n        IvParameterSpec ivSpec = new IvParameterSpec(IV.getBytes(StandardCharsets.UTF_8));\n        cipher.init(Cipher.DECRYPT_MODE, ks, ivSpec);\n        byte[] plain = cipher.doFinal(Base64.decode(cipherBase64));\n        return new String(plain, StandardCharsets.UTF_8);\n    }\n\n    /* -------- 旧版：CBC + NoPadding (手工补 0) -------- */\n    private static String decryptLegacyNoPadding(String cipherBase64) throws Exception {\n        Cipher cipher = Cipher.getInstance(\"AES/CBC/NoPadding\");\n        SecretKeySpec ks = new SecretKeySpec(KEY.getBytes(StandardCharsets.UTF_8), \"AES\");\n        IvParameterSpec ivSpec = new IvParameterSpec(IV.getBytes(StandardCharsets.UTF_8));\n        cipher.init(Cipher.DECRYPT_MODE, ks, ivSpec);\n        byte[] data = cipher.doFinal(Base64.decode(cipherBase64));\n        return new String(data, StandardCharsets.UTF_8)\n                .replace(\"\\u0000\",\"\"); // 旧填充 0\n    }\n\n    /* -------- 兼容入口：登录使用 -------- */\n    public static String resolvePassword(String input){\n        if(oConvertUtils.isEmpty(input)){\n            return input;\n        }\n        // 1. 先尝试新版\n        try{\n            String p = decryptPkcs5(input);\n            return clean(p);\n        }catch(Exception ignore){\n            //log.debug(\"【AES解密】Password not AES PKCS5 cipher, try legacy.\");\n        }\n\n        // 2. 回退旧版\n        try{\n            String legacy = decryptLegacyNoPadding(input);\n            return clean(legacy);\n        }catch(Exception e){\n            log.debug(\"【AES解密】Password not AES cipher, raw used.\");\n        }\n\n        // 3. 视为明文\n        return input;\n    }\n\n    /* -------- 可选：统一清理尾部不可见控制字符 -------- */\n    private static String clean(String s){\n        if(s==null) return null;\n        // 去除结尾控制符/空白（不影响中间合法空格）\n        return s.replaceAll(\"[\\\\p{Cntrl}]+\",\"\").trim();\n    }\n\n    /* -------- 若仍需要旧接口，可保留 (不建议再用于新前端) -------- */\n    @Deprecated\n    public static String desEncrypt(String data) throws Exception {\n        return decryptLegacyNoPadding(data);\n    }\n\n    /* 加密（若前端不再使用，可忽略；保留旧实现避免影响历史） */\n    @Deprecated\n    public static String encrypt(String data) throws Exception {\n        try{\n            Cipher cipher = Cipher.getInstance(\"AES/CBC/NoPadding\");\n            int blockSize = cipher.getBlockSize();\n            byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8);\n            int plaintextLength = dataBytes.length;\n            if (plaintextLength % blockSize != 0) {\n                plaintextLength += (blockSize - (plaintextLength % blockSize));\n            }\n            byte[] plaintext = new byte[plaintextLength];\n            System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);\n            SecretKeySpec keyspec = new SecretKeySpec(KEY.getBytes(StandardCharsets.UTF_8), \"AES\");\n            IvParameterSpec ivspec = new IvParameterSpec(IV.getBytes(StandardCharsets.UTF_8));\n            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);\n            byte[] encrypted = cipher.doFinal(plaintext);\n            return Base64.encodeToString(encrypted);\n        }catch(Exception e){\n            throw new IllegalStateException(\"legacy encrypt error\", e);\n        }\n    }\n\n//    public static void main(String[] args) throws Exception {\n//        // 前端 CBC/Pkcs7 密文测试\n//        String frontCipher = encrypt(\"sa\"); // 仅验证管道是否可用（旧方式）\n//        System.out.println(resolvePassword(frontCipher));\n//    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/encryption/EncryptedString.java",
    "content": "package org.jeecg.common.util.encryption;\n\n\nimport lombok.Data;\n\n/**\n * @Description: EncryptedString\n * @author: jeecg-boot\n */\n@Data\npublic class  EncryptedString {\n\n    /**\n     * 长度为16个字符\n     */\n    public static  String key = \"1234567890adbcde\";\n\n    /**\n     * 长度为16个字符\n     */\n    public static  String iv  = \"1234567890hjlkew\";\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/filter/SsrfFileTypeFilter.java",
    "content": "package org.jeecg.common.util.filter;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.List;\n\n/**\n * @Description: 校验文件敏感后缀\n * @author: lsq\n * @date: 2023年09月12日 15:29\n */\n@Slf4j\npublic class SsrfFileTypeFilter {\n\n    /**\n     * 允许操作文件类型白名单\n     */\n    private final static List<String> FILE_TYPE_WHITE_LIST = new ArrayList<>();\n    /**初始化文件头类型，不够的自行补充*/\n    final static HashMap<String, String> FILE_TYPE_MAP = new HashMap<>();\n    static {\n        //图片文件\n        FILE_TYPE_WHITE_LIST.add(\"jpg\");\n        FILE_TYPE_WHITE_LIST.add(\"jpeg\");\n        FILE_TYPE_WHITE_LIST.add(\"png\");\n        FILE_TYPE_WHITE_LIST.add(\"gif\");\n        FILE_TYPE_WHITE_LIST.add(\"bmp\");\n        FILE_TYPE_WHITE_LIST.add(\"svg\");\n        FILE_TYPE_WHITE_LIST.add(\"ico\");\n        FILE_TYPE_WHITE_LIST.add(\"heic\");\n\n        //文本文件\n        FILE_TYPE_WHITE_LIST.add(\"txt\");\n        FILE_TYPE_WHITE_LIST.add(\"doc\");\n        FILE_TYPE_WHITE_LIST.add(\"docx\");\n        FILE_TYPE_WHITE_LIST.add(\"pdf\");\n        FILE_TYPE_WHITE_LIST.add(\"csv\");\n//        FILE_TYPE_WHITE_LIST.add(\"xml\");\n        FILE_TYPE_WHITE_LIST.add(\"md\");\n\n        //音视频文件\n        FILE_TYPE_WHITE_LIST.add(\"mp4\");\n        FILE_TYPE_WHITE_LIST.add(\"avi\");\n        FILE_TYPE_WHITE_LIST.add(\"mov\");\n        FILE_TYPE_WHITE_LIST.add(\"wmv\");\n        FILE_TYPE_WHITE_LIST.add(\"mp3\");\n        FILE_TYPE_WHITE_LIST.add(\"wav\");\n\n        //表格文件\n        FILE_TYPE_WHITE_LIST.add(\"xls\");\n        FILE_TYPE_WHITE_LIST.add(\"xlsx\");\n\n        //压缩文件\n        FILE_TYPE_WHITE_LIST.add(\"zip\");\n        FILE_TYPE_WHITE_LIST.add(\"rar\");\n        FILE_TYPE_WHITE_LIST.add(\"7z\");\n        FILE_TYPE_WHITE_LIST.add(\"tar\");\n\n        //app文件后缀\n        FILE_TYPE_WHITE_LIST.add(\"apk\");\n        FILE_TYPE_WHITE_LIST.add(\"wgt\");\n\n        //幻灯片文件后缀\n        FILE_TYPE_WHITE_LIST.add(\"ppt\");\n        FILE_TYPE_WHITE_LIST.add(\"pptx\");\n\n        //设置禁止文件的头部标记\n        FILE_TYPE_MAP.put(\"3c25402070616765206c\", \"jsp\");\n        FILE_TYPE_MAP.put(\"3c3f7068700a0a2f2a2a0a202a205048\", \"php\");\n        FILE_TYPE_MAP.put(\"cafebabe0000002e0041\", \"class\");\n        FILE_TYPE_MAP.put(\"494e5345525420494e54\", \"sql\");\n       /* fileTypeMap.put(\"ffd8ffe000104a464946\", \"jpg\");\n        fileTypeMap.put(\"89504e470d0a1a0a0000\", \"png\");\n        fileTypeMap.put(\"47494638396126026f01\", \"gif\");\n        fileTypeMap.put(\"49492a00227105008037\", \"tif\");\n        fileTypeMap.put(\"424d228c010000000000\", \"bmp\");\n        fileTypeMap.put(\"424d8240090000000000\", \"bmp\");\n        fileTypeMap.put(\"424d8e1b030000000000\", \"bmp\");\n        fileTypeMap.put(\"41433130313500000000\", \"dwg\");\n        fileTypeMap.put(\"3c21444f435459504520\", \"html\");\n        fileTypeMap.put(\"3c21646f637479706520\", \"htm\");\n        fileTypeMap.put(\"48544d4c207b0d0a0942\", \"css\");\n        fileTypeMap.put(\"696b2e71623d696b2e71\", \"js\");\n        fileTypeMap.put(\"7b5c727466315c616e73\", \"rtf\");\n        fileTypeMap.put(\"38425053000100000000\", \"psd\");\n        fileTypeMap.put(\"46726f6d3a203d3f6762\", \"eml\");\n        fileTypeMap.put(\"d0cf11e0a1b11ae10000\", \"doc\");\n        fileTypeMap.put(\"5374616E64617264204A\", \"mdb\");\n        fileTypeMap.put(\"252150532D41646F6265\", \"ps\");\n        fileTypeMap.put(\"255044462d312e350d0a\", \"pdf\");\n        fileTypeMap.put(\"2e524d46000000120001\", \"rmvb\");\n        fileTypeMap.put(\"464c5601050000000900\", \"flv\");\n        fileTypeMap.put(\"00000020667479706d70\", \"mp4\");\n        fileTypeMap.put(\"49443303000000002176\", \"mp3\");\n        fileTypeMap.put(\"000001ba210001000180\", \"mpg\");\n        fileTypeMap.put(\"3026b2758e66cf11a6d9\", \"wmv\");\n        fileTypeMap.put(\"52494646e27807005741\", \"wav\");\n        fileTypeMap.put(\"52494646d07d60074156\", \"avi\");\n        fileTypeMap.put(\"4d546864000000060001\", \"mid\");\n        fileTypeMap.put(\"504b0304140000000800\", \"zip\");\n        fileTypeMap.put(\"526172211a0700cf9073\", \"rar\");\n        fileTypeMap.put(\"235468697320636f6e66\", \"ini\");\n        fileTypeMap.put(\"504b03040a0000000000\", \"jar\");\n        fileTypeMap.put(\"4d5a9000030000000400\", \"exe\");\n        fileTypeMap.put(\"3c25402070616765206c\", \"jsp\");\n        fileTypeMap.put(\"4d616e69666573742d56\", \"mf\");\n        fileTypeMap.put(\"3c3f786d6c2076657273\", \"xml\");\n        fileTypeMap.put(\"494e5345525420494e54\", \"sql\");\n        fileTypeMap.put(\"7061636b616765207765\", \"java\");\n        fileTypeMap.put(\"406563686f206f66660d\", \"bat\");\n        fileTypeMap.put(\"1f8b0800000000000000\", \"gz\");\n        fileTypeMap.put(\"6c6f67346a2e726f6f74\", \"properties\");\n        fileTypeMap.put(\"cafebabe0000002e0041\", \"class\");\n        fileTypeMap.put(\"49545346030000006000\", \"chm\");\n        fileTypeMap.put(\"04000000010000001300\", \"mxp\");\n        fileTypeMap.put(\"504b0304140006000800\", \"docx\");\n        fileTypeMap.put(\"6431303a637265617465\", \"torrent\");\n        fileTypeMap.put(\"6D6F6F76\", \"mov\");\n        fileTypeMap.put(\"FF575043\", \"wpd\");\n        fileTypeMap.put(\"CFAD12FEC5FD746F\", \"dbx\");\n        fileTypeMap.put(\"2142444E\", \"pst\");\n        fileTypeMap.put(\"AC9EBD8F\", \"qdf\");\n        fileTypeMap.put(\"E3828596\", \"pwl\");\n        fileTypeMap.put(\"2E7261FD\", \"ram\");*/\n    }\n\n    /**\n     * @param fileName\n     * @return String\n     * @description 通过文件后缀名获取文件类型\n     */\n    private static String getFileTypeBySuffix(String fileName) {\n        return fileName.substring(fileName.lastIndexOf(\".\") + 1, fileName.length());\n    }\n\n\n    /**\n     * 下载文件类型过滤\n     *\n     * @param filePath\n     */\n    public static void checkDownloadFileType(String filePath) throws IOException {\n        //文件后缀\n        String suffix = getFileTypeBySuffix(filePath);\n        log.debug(\" 【文件下载校验】文件后缀 suffix: {}\", suffix);\n        boolean isAllowExtension = FILE_TYPE_WHITE_LIST.contains(suffix.toLowerCase());\n        //是否允许下载的文件\n        if (!isAllowExtension) {\n            throw new JeecgBootException(\"下载失败，存在非法文件类型：\" + suffix);\n        }\n    }\n\n    /**\n     * 上传文件类型过滤\n     *\n     * @param file\n     */\n    public static void checkUploadFileType(MultipartFile file) throws Exception {\n        checkUploadFileType(file, null);\n    }\n    \n    /**\n     * 上传文件类型过滤\n     *\n     * @param file\n     */\n    public static void checkUploadFileType(MultipartFile file, String customPath) throws Exception {\n        //1. 路径安全校验\n        validatePathSecurity(customPath);\n        //2. 校验文件后缀和头\n        String suffix = getFileType(file, customPath);\n        log.info(\"【文件上传校验】文件后缀 suffix: {}，customPath：{}\", suffix, customPath);\n        boolean isAllowExtension = FILE_TYPE_WHITE_LIST.contains(suffix.toLowerCase());\n        //是否允许下载的文件\n        if (!isAllowExtension) {\n            throw new JeecgBootException(\"上传失败，存在非法文件类型：\" + suffix);\n        }\n    }\n\n    /**\n     * 通过读取文件头部获得文件类型\n     *\n     * @param file\n     * @return 文件类型\n     * @throws Exception\n     */\n\n    private static String getFileType(MultipartFile file, String customPath) throws Exception {\n        // 代码逻辑说明: [issue/4672]方法造成的文件被占用，注释掉此方法tomcat就能自动清理掉临时文件\n        String fileExtendName = null;\n        InputStream is = null;\n        try {\n            //is = new FileInputStream(file);\n            is = file.getInputStream();\n            byte[] b = new byte[10];\n            is.read(b, 0, b.length);\n            String fileTypeHex = String.valueOf(bytesToHexString(b));\n            Iterator<String> keyIter = FILE_TYPE_MAP.keySet().iterator();\n            while (keyIter.hasNext()) {\n                String key = keyIter.next();\n                // 验证前5个字符比较\n                if (key.toLowerCase().startsWith(fileTypeHex.toLowerCase().substring(0, 5))\n                        || fileTypeHex.toLowerCase().substring(0, 5).startsWith(key.toLowerCase())) {\n                    fileExtendName = FILE_TYPE_MAP.get(key);\n                    break;\n                }\n            }\n            log.debug(\"-----获取到的指定文件类型------\"+fileExtendName);\n            // 如果不是上述类型，则判断扩展名\n            if (StringUtils.isBlank(fileExtendName)) {\n                String fileName = file.getOriginalFilename();\n                // 如果无扩展名，则直接返回空串\n                if (-1 == fileName.indexOf(\".\")) {\n                    return \"\";\n                }\n                // 如果有扩展名，则返回扩展名\n                return getFileTypeBySuffix(fileName);\n            }\n            is.close();\n            return fileExtendName;\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return \"\";\n        }finally {\n            if (is != null) {\n                is.close();\n            }\n        }\n    }\n\n    /**\n     * 获得文件头部字符串\n     *\n     * @param src\n     * @return\n     */\n    private static String bytesToHexString(byte[] src) {\n        StringBuilder stringBuilder = new StringBuilder();\n        if (src == null || src.length <= 0) {\n            return null;\n        }\n        for (int i = 0; i < src.length; i++) {\n            int v = src[i] & 0xFF;\n            String hv = Integer.toHexString(v);\n            if (hv.length() < 2) {\n                stringBuilder.append(0);\n            }\n            stringBuilder.append(hv);\n        }\n        return stringBuilder.toString();\n    }\n\n    /**\n     * 路径安全校验\n     */\n    private static void validatePathSecurity(String customPath) throws JeecgBootException {\n        if (customPath == null || customPath.trim().isEmpty()) {\n            return;\n        }\n\n        // 统一分隔符为 /\n        String normalized = customPath.replace(\"\\\\\", \"/\");\n\n        // 1. 防止路径遍历攻击\n        if (normalized.contains(\"..\") || normalized.contains(\"~\")) {\n            throw new JeecgBootException(\"上传业务路径包含非法字符！\");\n        }\n\n        // 2. 限制路径深度\n        int depth = normalized.split(\"/\").length;\n        if (depth > 5) {\n            throw new JeecgBootException(\"上传业务路径深度超出限制！\");\n        }\n\n        // 3. 限制字符集（只允许字母、数字、下划线、横线、斜杠）\n        if (!normalized.matches(\"^[a-zA-Z0-9/_-]+$\")) {\n            throw new JeecgBootException(\"上传业务路径包含非法字符！\");\n        }\n    }\n\n    /**\n     * 校验文件路径安全性，防止路径遍历攻击\n     * @param filePath 文件路径\n     */\n    public static void checkPathTraversal(String filePath) {\n        if (StringUtils.isBlank(filePath)) {\n            return;\n        }\n        // 1. 防止路径遍历：不允许 ..\n        if (filePath.contains(\"..\")) {\n            throw new JeecgBootException(\"文件路径包含非法字符\");\n        }\n        // 2. 防止URL编码绕过：%2e = .\n        String fileLower = filePath.toLowerCase();\n        if (fileLower.contains(\"%2e\")) {\n            throw new JeecgBootException(\"文件路径包含非法字符\");\n        }\n    }\n\n    /**\n     * 批量校验文件路径安全性（逗号分隔的多个文件路径）\n     * @param files 逗号分隔的文件路径\n     */\n    public static void checkPathTraversalBatch(String files) {\n        if (StringUtils.isBlank(files)) {\n            return;\n        }\n        for (String file : files.split(\",\")) {\n            if (StringUtils.isNotBlank(file)) {\n                checkPathTraversal(file.trim());\n            }\n        }\n    }\n    \n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/filter/StrAttackFilter.java",
    "content": "package org.jeecg.common.util.filter;\n\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport java.util.regex.PatternSyntaxException;\n\n/**\n * 文件上传字符串过滤特殊字符\n * @author: jeecg-boot\n */\npublic class StrAttackFilter {\n\n    public static String filter(String str) throws PatternSyntaxException {\n        // 清除掉所有特殊字符\n        String regEx = \"[`_《》~!@#$%^&*()+=|{}':;',\\\\[\\\\].<>?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？]\";\n        Pattern p = Pattern.compile(regEx);\n        Matcher m = p.matcher(str);\n        return m.replaceAll(\"\").trim();\n    }\n\n//    public static void main(String[] args) {\n//        String filter = filter(\"@#jeecg/《》【bo】￥%……&*（o）)))！@t<>,.,/?'\\'~~`\");\n//        System.out.println(filter);\n//    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/oConvertUtils.java",
    "content": "package org.jeecg.common.util;\n\nimport com.alibaba.fastjson.JSONArray;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.codec.binary.Base64;\nimport org.apache.commons.io.IOUtils;\nimport org.apache.commons.lang3.StringUtils;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.springframework.beans.BeanUtils;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport org.springframework.beans.BeanWrapper;\nimport org.springframework.beans.BeanWrapperImpl;\n\nimport java.beans.PropertyDescriptor;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.UnsupportedEncodingException;\nimport java.lang.reflect.Array;\nimport java.lang.reflect.Field;\nimport java.math.BigDecimal;\nimport java.math.BigInteger;\nimport java.net.*;\nimport java.sql.Date;\nimport java.util.*;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport java.util.stream.Stream;\n\n/**\n * \n * @Author  张代浩\n *\n */\n@Slf4j\npublic class oConvertUtils {\n\tpublic static boolean isEmpty(Object object) {\n\t\tif (object == null) {\n\t\t\treturn (true);\n\t\t}\n\t\tif (\"\".equals(object)) {\n\t\t\treturn (true);\n\t\t}\n\t\tif (CommonConstant.STRING_NULL.equals(object)) {\n\t\t\treturn (true);\n\t\t}\n\t\treturn (false);\n\t}\n\t\n\tpublic static boolean isNotEmpty(Object object) {\n\t\tif (object != null && !\"\".equals(object) && !object.equals(CommonConstant.STRING_NULL)) {\n\t\t\treturn (true);\n\t\t}\n\t\treturn (false);\n\t}\n\n\t\n\t/**\n\t * 返回decode解密字符串\n\t * \n\t * @param inStr\n\t * @return\n\t */\n\tpublic static String decodeString(String inStr) {\n\t\tif (oConvertUtils.isEmpty(inStr)) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tinStr = URLDecoder.decode(inStr, \"UTF-8\");\n\t\t} catch (Exception e) {\n\t\t\t// 解决：URLDecoder: Illegal hex characters in escape (%) pattern - For input string: \"自动\"\n\t\t\t//e.printStackTrace();\n\t\t}\n\t\treturn inStr;\n\t}\n\n\tpublic static String decode(String strIn, String sourceCode, String targetCode) {\n\t\tString temp = code2code(strIn, sourceCode, targetCode);\n\t\treturn temp;\n\t}\n\n\t@SuppressWarnings(\"AlibabaLowerCamelCaseVariableNaming\")\n    public static String StrToUTF(String strIn, String sourceCode, String targetCode) {\n\t\tstrIn = \"\";\n\t\ttry {\n\t\t\tstrIn = new String(strIn.getBytes(\"ISO-8859-1\"), \"GBK\");\n\t\t} catch (UnsupportedEncodingException e) {\n\t\t\t// TODO Auto-generated catch block\n\t\t\te.printStackTrace();\n\t\t}\n\t\treturn strIn;\n\n\t}\n\n\tprivate static String code2code(String strIn, String sourceCode, String targetCode) {\n\t\tString strOut = null;\n\t\tif (strIn == null || \"\".equals(strIn.trim())) {\n\t\t\treturn strIn;\n\t\t}\n\t\ttry {\n\t\t\tbyte[] b = strIn.getBytes(sourceCode);\n\t\t\tfor (int i = 0; i < b.length; i++) {\n\t\t\t\tSystem.out.print(b[i] + \"  \");\n\t\t\t}\n\t\t\tstrOut = new String(b, targetCode);\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\treturn null;\n\t\t}\n\t\treturn strOut;\n\t}\n\n\tpublic static int getInt(String s, int defval) {\n\t\tif (s == null || \"\".equals(s)) {\n\t\t\treturn (defval);\n\t\t}\n\t\ttry {\n\t\t\treturn (Integer.parseInt(s));\n\t\t} catch (NumberFormatException e) {\n\t\t\treturn (defval);\n\t\t}\n\t}\n\n\tpublic static int getInt(String s) {\n\t\tif (s == null || \"\".equals(s)) {\n\t\t\treturn 0;\n\t\t}\n\t\ttry {\n\t\t\treturn (Integer.parseInt(s));\n\t\t} catch (NumberFormatException e) {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tpublic static int getInt(String s, Integer df) {\n\t\tif (s == null || \"\".equals(s)) {\n\t\t\treturn df;\n\t\t}\n\t\ttry {\n\t\t\treturn (Integer.parseInt(s));\n\t\t} catch (NumberFormatException e) {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tpublic static Integer[] getInts(String[] s) {\n\t\tif (s == null) {\n\t\t\treturn null;\n\t\t}\n\t\tInteger[] integer = new Integer[s.length];\n\t\tfor (int i = 0; i < s.length; i++) {\n\t\t\tinteger[i] = Integer.parseInt(s[i]);\n\t\t}\n\t\treturn integer;\n\n\t}\n\n\tpublic static double getDouble(String s, double defval) {\n\t\tif (s == null || \"\".equals(s)) {\n\t\t\treturn (defval);\n\t\t}\n\t\ttry {\n\t\t\treturn (Double.parseDouble(s));\n\t\t} catch (NumberFormatException e) {\n\t\t\treturn (defval);\n\t\t}\n\t}\n\n\tpublic static double getDou(Double s, double defval) {\n\t\tif (s == null) {\n\t\t\treturn (defval);\n\t\t}\n\t\treturn s;\n\t}\n\n\t/*public static Short getShort(String s) {\n\t\tif (StringUtil.isNotEmpty(s)) {\n\t\t\treturn (Short.parseShort(s));\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}*/\n\n\tpublic static int getInt(Object object, int defval) {\n\t\tif (isEmpty(object)) {\n\t\t\treturn (defval);\n\t\t}\n\t\ttry {\n\t\t\treturn (Integer.parseInt(object.toString()));\n\t\t} catch (NumberFormatException e) {\n\t\t\treturn (defval);\n\t\t}\n\t}\n\t\n\tpublic static Integer getInteger(Object object, Integer defval) {\n\t\tif (isEmpty(object)) {\n\t\t\treturn (defval);\n\t\t}\n\t\ttry {\n\t\t\treturn (Integer.parseInt(object.toString()));\n\t\t} catch (NumberFormatException e) {\n\t\t\treturn (defval);\n\t\t}\n\t}\n\t\n\tpublic static Integer getInt(Object object) {\n\t\tif (isEmpty(object)) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\treturn (Integer.parseInt(object.toString()));\n\t\t} catch (NumberFormatException e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic static int getInt(BigDecimal s, int defval) {\n\t\tif (s == null) {\n\t\t\treturn (defval);\n\t\t}\n\t\treturn s.intValue();\n\t}\n\n\tpublic static Integer[] getIntegerArry(String[] object) {\n\t\tint len = object.length;\n\t\tInteger[] result = new Integer[len];\n\t\ttry {\n\t\t\tfor (int i = 0; i < len; i++) {\n\t\t\t\tresult[i] = new Integer(object[i].trim());\n\t\t\t}\n\t\t\treturn result;\n\t\t} catch (NumberFormatException e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic static String getString(String s) {\n\t\treturn (getString(s, \"\"));\n\t}\n\n\t/**\n\t * 转义成Unicode编码\n\t * @param s\n\t * @return\n\t */\n\t/*public static String escapeJava(Object s) {\n\t\treturn StringEscapeUtils.escapeJava(getString(s));\n\t}*/\n\t\n\tpublic static String getString(Object object) {\n\t\tif (isEmpty(object)) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn (object.toString().trim());\n\t}\n\n\tpublic static String getString(int i) {\n\t\treturn (String.valueOf(i));\n\t}\n\n\tpublic static String getString(float i) {\n\t\treturn (String.valueOf(i));\n\t}\n\n\t/**\n\t * 返回常规字符串（只保留字符串中的数字、字母、中文）\n\t *\n\t * @param input\n\t * @return\n\t */\n\tpublic static String getNormalString(String input) {\n\t\tif (oConvertUtils.isEmpty(input)) {\n\t\t\treturn null;\n\t\t}\n\t\tString result = input.replaceAll(\"[^0-9a-zA-Z\\\\u4e00-\\\\u9fa5]\", \"\");\n\t\treturn result;\n\t}\n\n\tpublic static String getString(String s, String defval) {\n\t\tif (isEmpty(s)) {\n\t\t\treturn (defval);\n\t\t}\n\t\treturn (s.trim());\n\t}\n\n\tpublic static String getString(Object s, String defval) {\n\t\tif (isEmpty(s)) {\n\t\t\treturn (defval);\n\t\t}\n\t\treturn (s.toString().trim());\n\t}\n\n\tpublic static long stringToLong(String str) {\n\t\tLong test = new Long(0);\n\t\ttry {\n\t\t\ttest = Long.valueOf(str);\n\t\t} catch (Exception e) {\n\t\t}\n\t\treturn test.longValue();\n\t}\n\n\t/**\n\t * 获取本机IP\n\t */\n\tpublic static String getIp() {\n\t\tString ip = null;\n\t\ttry {\n\t\t\tInetAddress address = InetAddress.getLocalHost();\n\t\t\tip = address.getHostAddress();\n\n\t\t} catch (UnknownHostException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t\treturn ip;\n\t}\n\n\t/**\n\t * 判断一个类是否为基本数据类型。\n\t * \n\t * @param clazz\n\t *            要判断的类。\n\t * @return true 表示为基本数据类型。\n\t */\n\tprivate static boolean isBaseDataType(Class clazz) throws Exception {\n\t\treturn (clazz.equals(String.class) || clazz.equals(Integer.class) || clazz.equals(Byte.class) || clazz.equals(Long.class) || clazz.equals(Double.class) || clazz.equals(Float.class) || clazz.equals(Character.class) || clazz.equals(Short.class) || clazz.equals(BigDecimal.class) || clazz.equals(BigInteger.class) || clazz.equals(Boolean.class) || clazz.equals(Date.class) || clazz.isPrimitive());\n\t}\n\n\t/**\n\t * 解码base64\n\t *\n\t * @param base64Str base64字符串\n\t * @return 被加密后的字符串\n\t */\n\tpublic static String decodeBase64Str(String base64Str) {\n\t\tbyte[] byteContent = Base64.decodeBase64(base64Str);\n\t\tif (byteContent == null) {\n\t\t\treturn null;\n\t\t}\n\t\tString decodedString = new String(byteContent);\n\t\treturn decodedString;\n\t}\n\t\n\t\n\t/**\n\t * @param request\n\t *            IP\n\t * @return IP Address\n\t */\n\tpublic static String getIpAddrByRequest(HttpServletRequest request) {\n\t\tString ip = request.getHeader(\"x-forwarded-for\");\n\t\tif (ip == null || ip.length() == 0 || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) {\n\t\t\tip = request.getHeader(\"Proxy-Client-IP\");\n\t\t}\n\t\tif (ip == null || ip.length() == 0 || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) {\n\t\t\tip = request.getHeader(\"WL-Proxy-Client-IP\");\n\t\t}\n\t\tif (ip == null || ip.length() == 0 || CommonConstant.UNKNOWN.equalsIgnoreCase(ip)) {\n\t\t\tip = request.getRemoteAddr();\n\t\t}\n\t\treturn ip;\n\t}\n\n\t/**\n\t * @return 本机IP\n\t * @throws SocketException\n\t */\n\tpublic static String getRealIp() throws SocketException {\n        // 本地IP，如果没有配置外网IP则返回它\n\t\tString localip = null;\n        // 外网IP\n\t\tString netip = null;\n\n\t\tEnumeration<NetworkInterface> netInterfaces = NetworkInterface.getNetworkInterfaces();\n\t\tInetAddress ip = null;\n        // 是否找到外网IP\n\t\tboolean finded = false;\n\t\twhile (netInterfaces.hasMoreElements() && !finded) {\n\t\t\tNetworkInterface ni = netInterfaces.nextElement();\n\t\t\tEnumeration<InetAddress> address = ni.getInetAddresses();\n\t\t\twhile (address.hasMoreElements()) {\n\t\t\t\tip = address.nextElement();\n                // 外网IP\n\t\t\t\tif (!ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(\":\") == -1) {\n\t\t\t\t\tnetip = ip.getHostAddress();\n\t\t\t\t\tfinded = true;\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(\":\") == -1) {\n                    // 内网IP\n\t\t\t\t    localip = ip.getHostAddress();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (netip != null && !\"\".equals(netip)) {\n\t\t\treturn netip;\n\t\t} else {\n\t\t\treturn localip;\n\t\t}\n\t}\n\n\t/**\n\t * java去除字符串中的空格、回车、换行符、制表符\n\t * \n\t * @param str\n\t * @return\n\t */\n\tpublic static String replaceBlank(String str) {\n\t\tString dest = \"\";\n\t\tif (str != null) {\n\t\t    String reg = \"\\\\s*|\\t|\\r|\\n\";\n\t\t\tPattern p = Pattern.compile(reg);\n\t\t\tMatcher m = p.matcher(str);\n\t\t\tdest = m.replaceAll(\"\");\n\t\t}\n\t\treturn dest;\n\n\t}\n\n\t/**\n\t * 判断元素是否在数组内\n\t * \n\t * @param child\n\t * @param all\n\t * @return\n\t */\n\tpublic static boolean isIn(String child, String[] all) {\n\t\tif (all == null || all.length == 0) {\n\t\t\treturn false;\n\t\t}\n\t\tfor (int i = 0; i < all.length; i++) {\n\t\t\tString aSource = all[i];\n\t\t\tif (aSource.equals(child)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * 判断元素是否在数组内\n\t *\n\t * @param childArray\n\t * @param all\n\t * @return\n\t */\n\tpublic static boolean isArrayIn(String[] childArray, String[] all) {\n\t\tif (all == null || all.length == 0) {\n\t\t\treturn false;\n\t\t}\n\t\tfor (String v : childArray) {\n\t\t\tif (!isIn(v, all)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * 判断元素是否在数组内\n\t *\n\t * @param childArray\n\t * @param all\n\t * @return\n\t */\n\tpublic static boolean isJsonArrayIn(JSONArray childArray, String[] all) {\n\t\tif (all == null || all.length == 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\tList<String> childs = childArray.toJavaList(String.class);\n\t\tfor (String v : childs) {\n\t\t\tif (!isIn(v, all)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * 判断字符串是否为JSON格式\n\t * @param str\n\t * @return\n\t */\n\tpublic static boolean isJson(String str) {\n\t\tif (str == null || str.trim().isEmpty()) {\n\t\t\treturn false;\n\t\t}\n\t\ttry {\n\t\t\tcom.alibaba.fastjson.JSON.parse(str);\n\t\t\treturn true;\n\t\t} catch (Exception e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\t/**\n\t * 获取Map对象\n\t */\n\tpublic static Map<Object, Object> getHashMap() {\n\t\treturn new HashMap<>(5);\n\t}\n\n\t/**\n\t * SET转换MAP\n\t * \n\t * @param str\n\t * @return\n\t */\n\tpublic static Map<Object, Object> setToMap(Set<Object> setobj) {\n\t\tMap<Object, Object> map = getHashMap();\n\t\tfor (Iterator iterator = setobj.iterator(); iterator.hasNext();) {\n\t\t\tMap.Entry<Object, Object> entry = (Map.Entry<Object, Object>) iterator.next();\n\t\t\tmap.put(entry.getKey().toString(), entry.getValue() == null ? \"\" : entry.getValue().toString().trim());\n\t\t}\n\t\treturn map;\n\n\t}\n\n\tpublic static boolean isInnerIp(String ipAddress) {\n\t\tboolean isInnerIp = false;\n\t\tlong ipNum = getIpNum(ipAddress);\n\t\t/**\n\t\t * 私有IP：A类 10.0.0.0-10.255.255.255 B类 172.16.0.0-172.31.255.255 C类 192.168.0.0-192.168.255.255 当然，还有127这个网段是环回地址\n\t\t **/\n\t\tlong aBegin = getIpNum(\"10.0.0.0\");\n\t\tlong aEnd = getIpNum(\"10.255.255.255\");\n\t\tlong bBegin = getIpNum(\"172.16.0.0\");\n\t\tlong bEnd = getIpNum(\"172.31.255.255\");\n\t\tlong cBegin = getIpNum(\"192.168.0.0\");\n\t\tlong cEnd = getIpNum(\"192.168.255.255\");\n\t\tString localIp = \"127.0.0.1\";\n\t\tisInnerIp = isInner(ipNum, aBegin, aEnd) || isInner(ipNum, bBegin, bEnd) || isInner(ipNum, cBegin, cEnd) || localIp.equals(ipAddress);\n\t\treturn isInnerIp;\n\t}\n\n\tprivate static long getIpNum(String ipAddress) {\n\t\tString[] ip = ipAddress.split(\"\\\\.\");\n\t\tlong a = Integer.parseInt(ip[0]);\n\t\tlong b = Integer.parseInt(ip[1]);\n\t\tlong c = Integer.parseInt(ip[2]);\n\t\tlong d = Integer.parseInt(ip[3]);\n\n\t\tlong ipNum = a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d;\n\t\treturn ipNum;\n\t}\n\n\tprivate static boolean isInner(long userIp, long begin, long end) {\n\t\treturn (userIp >= begin) && (userIp <= end);\n\t}\n\t\n\t/**\n\t * 将下划线大写方式命名的字符串转换为驼峰式。\n\t * 如果转换前的下划线大写方式命名的字符串为空，则返回空字符串。</br>\n\t * 例如：hello_world->helloWorld\n\t * \n\t * @param name\n\t *            转换前的下划线大写方式命名的字符串\n\t * @return 转换后的驼峰式命名的字符串\n\t */\n\tpublic static String camelName(String name) {\n\t\tStringBuilder result = new StringBuilder();\n\t\t// 快速检查\n\t\tif (name == null || name.isEmpty()) {\n\t\t\t// 没必要转换\n\t\t\treturn \"\";\n\t\t} else if (!name.contains(SymbolConstant.UNDERLINE)) {\n\t\t\t// 不含下划线，仅将首字母小写\n\t\t\t// 代码逻辑说明: TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能\n\t\t\treturn name.substring(0, 1).toLowerCase() + name.substring(1).toLowerCase();\n\t\t}\n\t\t// 用下划线将原始字符串分割\n\t\tString[] camels = name.split(\"_\");\n\t\tfor (String camel : camels) {\n\t\t\t// 跳过原始字符串中开头、结尾的下换线或双重下划线\n\t\t\tif (camel.isEmpty()) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// 处理真正的驼峰片段\n\t\t\tif (result.length() == 0) {\n\t\t\t\t// 第一个驼峰片段，全部字母都小写\n\t\t\t\tresult.append(camel.toLowerCase());\n\t\t\t} else {\n\t\t\t\t// 其他的驼峰片段，首字母大写\n\t\t\t\tresult.append(camel.substring(0, 1).toUpperCase());\n\t\t\t\tresult.append(camel.substring(1).toLowerCase());\n\t\t\t}\n\t\t}\n\t\treturn result.toString();\n\t}\n\t\n\t/**\n\t * 将下划线大写方式命名的字符串转换为驼峰式。\n\t * 如果转换前的下划线大写方式命名的字符串为空，则返回空字符串。</br>\n\t * 例如：hello_world,test_id->helloWorld,testId\n\t * \n\t * @param name\n\t *            转换前的下划线大写方式命名的字符串\n\t * @return 转换后的驼峰式命名的字符串\n\t */\n\tpublic static String camelNames(String names) {\n\t\tif(names==null||\"\".equals(names)){\n\t\t\treturn null;\n\t\t}\n\t\tStringBuffer sf = new StringBuffer();\n\t\tString[] fs = names.split(\",\");\n\t\tfor (String field : fs) {\n\t\t\tfield = camelName(field);\n\t\t\tsf.append(field + \",\");\n\t\t}\n\t\tString result = sf.toString();\n\t\treturn result.substring(0, result.length() - 1);\n\t}\n\t\n\t/**\n\t * 将下划线大写方式命名的字符串转换为驼峰式。(首字母写)\n\t * 如果转换前的下划线大写方式命名的字符串为空，则返回空字符串。</br>\n\t * 例如：hello_world->HelloWorld\n\t * \n\t * @param name\n\t *            转换前的下划线大写方式命名的字符串\n\t * @return 转换后的驼峰式命名的字符串\n\t */\n\tpublic static String camelNameCapFirst(String name) {\n\t\tStringBuilder result = new StringBuilder();\n\t\t// 快速检查\n\t\tif (name == null || name.isEmpty()) {\n\t\t\t// 没必要转换\n\t\t\treturn \"\";\n\t\t} else if (!name.contains(SymbolConstant.UNDERLINE)) {\n\t\t\t// 不含下划线，仅将首字母小写\n\t\t\treturn name.substring(0, 1).toUpperCase() + name.substring(1).toLowerCase();\n\t\t}\n\t\t// 用下划线将原始字符串分割\n\t\tString[] camels = name.split(\"_\");\n\t\tfor (String camel : camels) {\n\t\t\t// 跳过原始字符串中开头、结尾的下换线或双重下划线\n\t\t\tif (camel.isEmpty()) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// 其他的驼峰片段，首字母大写\n\t\t\tresult.append(camel.substring(0, 1).toUpperCase());\n\t\t\tresult.append(camel.substring(1).toLowerCase());\n\t\t}\n\t\treturn result.toString();\n\t}\n\t\n\t/**\n\t * 将驼峰命名转化成下划线\n\t * @param para\n\t * @return\n\t */\n\tpublic static String camelToUnderline(String para){\n\t    int length = 3;\n        if(para.length()<length){\n        \treturn para.toLowerCase(); \n        }\n        StringBuilder sb=new StringBuilder(para);\n        //定位\n        int temp=0;\n        //从第三个字符开始 避免命名不规范 \n        for(int i=2;i<para.length();i++){\n            if(Character.isUpperCase(para.charAt(i))){\n                sb.insert(i+temp, \"_\");\n                temp+=1;\n            }\n        }\n        return sb.toString().toLowerCase(); \n\t}\n\n\t/**\n\t * 随机数\n\t * @param place 定义随机数的位数\n\t */\n\tpublic static String randomGen(int place) {\n\t\tString base = \"qwertyuioplkjhgfdsazxcvbnmQAZWSXEDCRFVTGBYHNUJMIKLOP0123456789\";\n\t\tStringBuffer sb = new StringBuffer();\n\t\tRandom rd = new Random();\n\t\tfor(int i=0;i<place;i++) {\n\t\t\tsb.append(base.charAt(rd.nextInt(base.length())));\n\t\t}\n\t\treturn sb.toString();\n\t}\n\t\n\t/**\n\t * 获取类的所有属性，包括父类\n\t * \n\t * @param object\n\t * @return\n\t */\n\tpublic static Field[] getAllFields(Object object) {\n\t\tClass<?> clazz = object.getClass();\n\t\tList<Field> fieldList = new ArrayList<>();\n\t\twhile (clazz != null) {\n\t\t\tfieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));\n\t\t\tclazz = clazz.getSuperclass();\n\t\t}\n\t\tField[] fields = new Field[fieldList.size()];\n\t\tfieldList.toArray(fields);\n\t\treturn fields;\n\t}\n\t\n\t/**\n\t  * 将map的key全部转成小写\n\t * @param list\n\t * @return\n\t */\n\tpublic static List<Map<String, Object>> toLowerCasePageList(List<Map<String, Object>> list){\n\t\tList<Map<String, Object>> select = new ArrayList<>();\n\t\tfor (Map<String, Object> row : list) {\n\t\t\t Map<String, Object> resultMap = new HashMap<>(5);\n\t\t\t Set<String> keySet = row.keySet(); \n\t\t\t for (String key : keySet) { \n\t\t\t\t String newKey = key.toLowerCase(); \n\t\t\t\t resultMap.put(newKey, row.get(key)); \n\t\t\t }\n\t\t\t select.add(resultMap);\n\t\t}\n\t\treturn select;\n\t}\n\n\t/**\n\t * 将entityList转换成modelList\n\t * @param fromList\n\t * @param tClass\n\t * @param <F>\n\t * @param <T>\n\t * @return\n\t */\n\tpublic static<F,T> List<T> entityListToModelList(List<F> fromList, Class<T> tClass){\n\t\tif(fromList == null || fromList.isEmpty()){\n\t\t\treturn null;\n\t\t}\n\t\tList<T> tList = new ArrayList<>();\n\t\tfor(F f : fromList){\n\t\t\tT t = entityToModel(f, tClass);\n\t\t\ttList.add(t);\n\t\t}\n\t\treturn tList;\n\t}\n\n\tpublic static<F,T> T entityToModel(F entity, Class<T> modelClass) {\n\t\tlog.debug(\"entityToModel : Entity属性的值赋值到Model\");\n\t\tObject model = null;\n\t\tif (entity == null || modelClass ==null) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tmodel = modelClass.newInstance();\n\t\t} catch (InstantiationException e) {\n\t\t\tlog.error(\"entityToModel : 实例化异常\", e);\n\t\t} catch (IllegalAccessException e) {\n\t\t\tlog.error(\"entityToModel : 安全权限异常\", e);\n\t\t}\n\t\tBeanUtils.copyProperties(entity, model);\n\t\treturn (T)model;\n\t}\n\n\t/**\n\t * 判断 list 是否为空\n\t *\n\t * @param list\n\t * @return true or false\n\t * list == null\t\t: true\n\t * list.size() == 0\t: true\n\t */\n\tpublic static boolean listIsEmpty(Collection list) {\n\t\treturn (list == null || list.size() == 0);\n\t}\n\n\t/**\n\t * 判断旧值与新值 是否相等\n\t *\n\t * @param oldVal\n\t * @param newVal\n\t * @return\n\t */\n\tpublic static boolean isEqual(Object oldVal, Object newVal) {\n\t\tif (oldVal != null && newVal != null) {\n\t\t\tif (isArray(oldVal)) {\n\t\t\t\treturn equalityOfArrays((Object[]) oldVal, (Object[]) newVal);\n\t\t\t}else if(oldVal instanceof JSONArray){\n\t\t\t\tif(newVal instanceof JSONArray){\n\t\t\t\t\treturn equalityOfJSONArray((JSONArray) oldVal, (JSONArray) newVal);\n\t\t\t\t}else{\n\t\t\t\t\tif (isEmpty(newVal) && (oldVal == null || ((JSONArray) oldVal).size() == 0)) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tList<Object> arrayStr = Arrays.asList(newVal.toString().split(\",\"));\n\t\t\t\t\tJSONArray newValArray = new JSONArray(arrayStr);\n\t\t\t\t\treturn equalityOfJSONArray((JSONArray) oldVal, newValArray);\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\treturn oldVal.equals(newVal);\n\t\t\t}\n\t\t\t\n\t\t} else {\n\t\t\tif (oldVal == null && newVal == null) {\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * 方法描述 判断一个对象是否是一个数组\n\t *\n\t * @param obj\n\t * @return\n\t * @author yaomy\n\t * @date 2018年2月5日 下午5:03:00\n\t */\n\tpublic static boolean isArray(Object obj) {\n\t\tif (obj == null) {\n\t\t\treturn false;\n\t\t}\n\t\treturn obj.getClass().isArray();\n\t}\n\n\t/**\n\t * 获取集合的大小\n\t * \n\t * @param collection\n\t * @return\n\t */\n\tpublic static int getCollectionSize(Collection<?> collection) {\n\t\treturn collection != null ? collection.size() : 0;\n\t}\n\t\n\t/**\n\t * 判断两个数组是否相等（数组元素不分顺序）\n\t *\n\t * @param oldVal\n\t * @param newVal\n\t * @return\n\t */\n\tpublic static boolean equalityOfJSONArray(JSONArray oldVal, JSONArray newVal) {\n\t\tif (oldVal != null && newVal != null) {\n\t\t\tObject[] oldValArray = oldVal.toArray();\n\t\t\tObject[] newValArray = newVal.toArray();\n\t\t\treturn equalityOfArrays(oldValArray,newValArray);\n\t\t} else {\n\t\t\tif ((oldVal == null || oldVal.size() == 0) && (newVal == null || newVal.size() == 0)) {\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * 比较带逗号的字符串\n\t * QQYUN-5212【简流】按日期触发 多选 人员组件 选择顺序不一致时 不触发，应该是统一问题 包括多选部门组件\n\t * @param oldVal\n\t * @param newVal\n\t * @return\n\t */\n\tpublic static boolean equalityOfStringArrays(String oldVal, String newVal) {\n\t\tif(oldVal.equals(newVal)){\n\t\t\treturn true;\n\t\t}\n\t\tif(oldVal.indexOf(\",\")>=0 && newVal.indexOf(\",\")>=0){\n\t\t\tString[] arr1 = oldVal.split(\",\");\n\t\t\tString[] arr2 = newVal.split(\",\");\n\t\t\tif(arr1.length == arr2.length){\n\t\t\t\tboolean flag = true;\n\t\t\t\tMap<String, Integer> map = new HashMap<>();\n\t\t\t\tfor(String s1: arr1){\n\t\t\t\t\tmap.put(s1, 1);\n\t\t\t\t}\n\t\t\t\tfor(String s2: arr2){\n\t\t\t\t\tif(map.get(s2) == null){\n\t\t\t\t\t\tflag = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn flag;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * 判断两个数组是否相等（数组元素不分顺序）\n\t *\n\t * @param oldVal\n\t * @param newVal\n\t * @return\n\t */\n\tpublic static boolean equalityOfArrays(Object[] oldVal, Object newVal[]) {\n\t\tif (oldVal != null && newVal != null) {\n\t\t\tArrays.sort(oldVal);\n\t\t\tArrays.sort(newVal);\n\t\t\treturn Arrays.equals(oldVal, newVal);\n\t\t} else {\n\t\t\tif ((oldVal == null || oldVal.length == 0) && (newVal == null || newVal.length == 0)) {\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n//\tpublic static void main(String[] args) {\n////\t\tString[] a = new String[]{\"1\", \"2\"};\n////\t\tString[] b = new String[]{\"2\", \"1\"};\n//\t\tInteger a = null;\n//\t\tInteger b = 1;\n//\t\tSystem.out.println(oConvertUtils.isEqual(a, b));\n//\t}\n\t\n\t/**\n\t * 判断 list 是否不为空\n\t *\n\t * @param list\n\t * @return true or false\n\t * list == null\t\t: false\n\t * list.size() == 0\t: false\n\t */\n\tpublic static boolean listIsNotEmpty(Collection list) {\n\t\treturn !listIsEmpty(list);\n\t}\n\n\t/**\n\t * 读取静态文本内容\n\t * @param url\n\t * @return\n\t */\n\tpublic static String readStatic(String url) {\n\t\tString json = \"\";\n\t\ttry {\n\t\t\t//换个写法，解决springboot读取jar包中文件的问题\n\t\t\tInputStream stream = oConvertUtils.class.getClassLoader().getResourceAsStream(url.replace(\"classpath:\", \"\"));\n\t\t\tjson = IOUtils.toString(stream,\"UTF-8\");\n\t\t} catch (IOException e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t}\n\t\treturn json;\n\t}\n\n\t/**\n\t * 将List 转成 JSONArray\n\t * @return\n\t */\n\tpublic static JSONArray list2JSONArray(List<String> list){\n\t\tif(list==null || list.size()==0){\n\t\t\treturn null;\n\t\t}\n\t\tJSONArray array = new JSONArray();\n\t\tfor(String str: list){\n\t\t\tarray.add(str);\n\t\t}\n\t\treturn array;\n\t}\n\n\t/**\n\t * 判断两个list中的元素是否完全一致\n\t * QQYUN-5326【简流】获取组织人员 单/多 筛选条件 没有部门筛选\n\t * @return\n\t */\n\tpublic static boolean isEqList(List<String> list1, List<String> list2){\n\t\tif(list1.size() != list2.size()){\n\t\t\treturn false;\n\t\t}\n\t\tfor(String str1: list1){\n\t\t\tboolean flag = false;\n\t\t\tfor(String str2: list2){\n\t\t\t\tif(str1.equals(str2)){\n\t\t\t\t\tflag = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!flag){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\n\t/**\n\t * 判断 sourceList中的元素是否在targetList中出现\n\t * \n\t * QQYUN-5326【简流】获取组织人员 单/多 筛选条件 没有部门筛选\n\t * @param sourceList 源列表，要检查的元素列表\n\t * @param targetList 目标列表，用于匹配的列表\n\t * @return 如果sourceList中有任何元素在targetList中存在则返回true，否则返回false\n\t */\n\tpublic static boolean isInList(List<String> sourceList, List<String> targetList){\n\t\tfor(String sourceItem: sourceList){\n\t\t\tboolean flag = false;\n\t\t\tfor(String targetItem: targetList){\n\t\t\t\tif(sourceItem.equals(targetItem)){\n\t\t\t\t\tflag = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(flag){\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * 判断 sourceList中的所有元素是否都在targetList中存在\n\t * @param sourceList 源列表，要检查的元素列表\n\t * @param targetList 目标列表，用于匹配的列表\n\t * @return 如果sourceList中的所有元素都在targetList中存在则返回true，否则返回false\n\t */\n\tpublic static boolean isAllInList(List<String> sourceList, List<String> targetList){\n\t\tif(sourceList == null || sourceList.isEmpty()){\n\t\t\treturn true; // 空列表视为所有元素都存在\n\t\t}\n\t\tif(targetList == null || targetList.isEmpty()){\n\t\t\treturn false; // 目标列表为空，源列表非空时返回false\n\t\t}\n\n\t\tfor(String sourceItem: sourceList){\n\t\t\tboolean found = false;\n\t\t\tfor(String targetItem: targetList){\n\t\t\t\tif(sourceItem.equals(targetItem)){\n\t\t\t\t\tfound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!found){\n\t\t\t\treturn false; // 有任何一个元素不在目标列表中，返回false\n\t\t\t}\n\t\t}\n\t\treturn true; // 所有元素都找到了\n\t}\n\t\n\t/**\n\t * 计算文件大小转成MB\n\t * @param uploadCount\n\t * @return\n\t */\n\tpublic static Double calculateFileSizeToMb(Long uploadCount){\n\t\tdouble count = 0.0;\n\t\tif(uploadCount>0) {\n\t\t\tBigDecimal bigDecimal = new BigDecimal(uploadCount);\n\t\t\t//换算成MB\n\t\t\tBigDecimal divide = bigDecimal.divide(new BigDecimal(1048576));\n\t\t\tcount = divide.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();\n\t\t\treturn count;\n\t\t}\n\t\treturn count;\n\t}\n\n\t/**\n\t * map转str\n\t *\n\t * @param map\n\t * @return\n\t */\n\tpublic static String mapToString(Map<String, String[]> map) {\n\t\tif (map == null || map.size() == 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tStringBuilder sb = new StringBuilder();\n\t\tfor (Map.Entry<String, String[]> entry : map.entrySet()) {\n\t\t\tString key = entry.getKey();\n\t\t\tString[] values = entry.getValue();\n\t\t\tsb.append(key).append(\"=\");\n\t\t\tsb.append(values != null ? StringUtils.join(values, \",\") : \"\");\n\t\t\tsb.append(\"&\");\n\t\t}\n\n\t\tString result = sb.toString();\n\t\tif (result.endsWith(\"&\")) {\n\t\t\tresult = result.substring(0, sb.length() - 1);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 判断对象是否为空 <br/>\n\t * 支持各种类型的对象\n\t * for for [QQYUN-10990]AIRAG\n\t * @param obj\n\t * @return\n\t * @author chenrui\n\t * @date 2025/2/13 18:34\n\t */\n\tpublic static boolean isObjectEmpty(Object obj) {\n\t\tif (null == obj) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (obj instanceof CharSequence) {\n\t\t\treturn isEmpty(obj);\n\t\t} else if (obj instanceof Map) {\n\t\t\treturn ((Map<?, ?>) obj).isEmpty();\n\t\t} else if (obj instanceof Iterable) {\n\t\t\treturn isObjectEmpty(((Iterable<?>) obj).iterator());\n\t\t} else if (obj instanceof Iterator) {\n\t\t\treturn !((Iterator<?>) obj).hasNext();\n\t\t} else if (isArray(obj)) {\n\t\t\treturn 0 == Array.getLength(obj);\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * iterator 是否为空\n\t * for for [QQYUN-10990]AIRAG\n\t * @param iterator Iterator对象\n\t * @return 是否为空\n\t */\n\tpublic static boolean isEmptyIterator(Iterator<?> iterator) {\n\t\treturn null == iterator || false == iterator.hasNext();\n\t}\n\n\n\t/**\n\t * 判断对象是否不为空\n\t * for for [QQYUN-10990]AIRAG\n\t * @param object\n\t * @return\n\t * @author chenrui\n\t * @date 2025/2/13 18:35\n\t */\n\tpublic static boolean isObjectNotEmpty(Object object) {\n\t\treturn !isObjectEmpty(object);\n\t}\n\n\t/**\n\t * 如果src大于des返回true\n\t * for [QQYUN-10990]AIRAG\n\t * @param src\n\t * @param des\n\t * @return\n\t * @author: chenrui\n\t * @date: 2018/9/19 15:30\n\t */\n\tpublic static boolean isGt(Number src, Number des) {\n\t\tif (null == src || null == des) {\n\t\t\tthrow new IllegalArgumentException(\"参数不能为空\");\n\t\t}\n\t\tif (src.doubleValue() > des.doubleValue()) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * 如果src大于等于des返回true\n\t * for [QQYUN-10990]AIRAG\n\t * @param src\n\t * @param des\n\t * @return\n\t * @author: chenrui\n\t * @date: 2018/9/19 15:30\n\t */\n\tpublic static boolean isGe(Number src, Number des) {\n\t\tif (null == src || null == des) {\n\t\t\tthrow new IllegalArgumentException(\"参数不能为空\");\n\t\t}\n\t\tif (src.doubleValue() < des.doubleValue()) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\n\t/**\n\t * 判断是否存在\n\t * for [QQYUN-10990]AIRAG\n\t * @param obj\n\t * @param objs\n\t * @param <T>\n\t * @return\n\t * @author chenrui\n\t * @date 2020/9/12 15:50\n\t */\n\tpublic static <T> boolean isIn(T obj, T... objs) {\n\t\tif (isEmpty(objs)) {\n\t\t\treturn false;\n\t\t}\n\t\tfor (T obj1 : objs) {\n\t\t\tif (isEqual(obj, obj1)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * 判断租户ID是否有效\n\t * @param tenantId\n\t * @return\n\t */\n\tpublic static boolean isEffectiveTenant(String tenantId) {\n\t\treturn MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL && isNotEmpty(tenantId) && !(\"0\").equals(tenantId);\n\t}\n\n    /**\n     * 复制源对象的非空属性到目标对象（同名属性）\n     * \n     * @param source 源对象（页面）\n     * @param target 目标对象（数据库实体）\n     */\n    public static void copyNonNullFields(Object source, Object target) {\n        if (source == null || target == null) {\n            return;\n        }\n        // 获取源对象的非空属性名数组\n        String[] nullPropertyNames = getNullPropertyNames(source);\n        // 复制：忽略源对象的空属性，仅覆盖目标对象的对应非空属性\n        BeanUtils.copyProperties(source, target, nullPropertyNames);\n    }\n\n    /**\n     * 获取源对象中值为 null 的属性名数组\n     * \n     * @param source \n     */\n    private static String[] getNullPropertyNames(Object source) {\n        BeanWrapper beanWrapper = new BeanWrapperImpl(source);\n        //获取类的属性\n        PropertyDescriptor[] propertyDescriptors = beanWrapper.getPropertyDescriptors();\n        // 过滤出值为 null 的属性名\n        return Stream.of(propertyDescriptors)\n                .map(PropertyDescriptor::getName)\n                .filter(name -> beanWrapper.getPropertyValue(name) == null)\n                .toArray(String[]::new);\n    }\n\n    /**\n     * String转换long类型\n     *\n     * @param v\n     * @param def\n     * @return\n     */\n    public static long getLong(Object v, long def) {\n        if (v == null) {\n            return def;\n        };\n        if (v instanceof Number) {\n            return ((Number) v).longValue();\n        }\n        try {\n            return Long.parseLong(v.toString());\n        } catch (Exception e) {\n            return def;\n        }\n    }\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/oss/OssBootUtil.java",
    "content": "package org.jeecg.common.util.oss;\n\nimport com.aliyun.oss.ClientConfiguration;\nimport com.aliyun.oss.OSSClient;\nimport com.aliyun.oss.common.auth.DefaultCredentialProvider;\nimport com.aliyun.oss.model.CannedAccessControlList;\nimport com.aliyun.oss.model.OSSObject;\nimport com.aliyun.oss.model.PutObjectResult;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.fileupload.FileItemStream;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.util.CommonUtils;\nimport org.jeecg.common.util.filter.SsrfFileTypeFilter;\nimport org.jeecg.common.util.filter.StrAttackFilter;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport java.io.BufferedInputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.URL;\nimport java.net.URLDecoder;\nimport java.util.Date;\nimport java.util.UUID;\n\n/**\n * @Description: 阿里云 oss 上传工具类(高依赖版)\n * @Date: 2019/5/10\n * @author: jeecg-boot\n */\n@Slf4j\npublic class OssBootUtil {\n\n    private static String endPoint;\n    private static String accessKeyId;\n    private static String accessKeySecret;\n    private static String bucketName;\n    private static String staticDomain;\n\n    public static void setEndPoint(String endPoint) {\n        OssBootUtil.endPoint = endPoint;\n    }\n\n    public static void setAccessKeyId(String accessKeyId) {\n        OssBootUtil.accessKeyId = accessKeyId;\n    }\n\n    public static void setAccessKeySecret(String accessKeySecret) {\n        OssBootUtil.accessKeySecret = accessKeySecret;\n    }\n\n    public static void setBucketName(String bucketName) {\n        OssBootUtil.bucketName = bucketName;\n    }\n\n    public static void setStaticDomain(String staticDomain) {\n        OssBootUtil.staticDomain = staticDomain;\n    }\n\n    public static String getStaticDomain() {\n        return staticDomain;\n    }\n\n    public static String getEndPoint() {\n        return endPoint;\n    }\n\n    public static String getAccessKeyId() {\n        return accessKeyId;\n    }\n\n    public static String getAccessKeySecret() {\n        return accessKeySecret;\n    }\n\n    public static String getBucketName() {\n        return bucketName;\n    }\n\n    public static OSSClient getOssClient() {\n        return ossClient;\n    }\n\n    /**\n     * oss 工具客户端\n     */\n    private static OSSClient ossClient = null;\n\n    /**\n     * 上传文件至阿里云 OSS\n     * 文件上传成功,返回文件完整访问路径\n     * 文件上传失败,返回 null\n     *\n     * @param file    待上传文件\n     * @param fileDir 文件保存目录\n     * @return oss 中的相对文件路径\n     */\n    public static String upload(MultipartFile file, String fileDir,String customBucket) throws Exception {\n        // 文件安全校验，防止上传漏洞文件\n        SsrfFileTypeFilter.checkUploadFileType(file);\n\n        String filePath = null;\n        initOss(endPoint, accessKeyId, accessKeySecret);\n        StringBuilder fileUrl = new StringBuilder();\n        String newBucket = bucketName;\n        if(oConvertUtils.isNotEmpty(customBucket)){\n            newBucket = customBucket;\n        }\n        try {\n            //判断桶是否存在,不存在则创建桶\n            if(!ossClient.doesBucketExist(newBucket)){\n                ossClient.createBucket(newBucket);\n            }\n            // 获取文件名\n            String orgName = file.getOriginalFilename();\n            if(\"\" == orgName){\n              orgName=file.getName();\n            }\n            orgName = CommonUtils.getFileName(orgName);\n            String fileName = orgName.indexOf(\".\")==-1\n                              ?orgName + \"_\" + System.currentTimeMillis()\n                              :orgName.substring(0, orgName.lastIndexOf(\".\")) + \"_\" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf(\".\"));\n            if (!fileDir.endsWith(SymbolConstant.SINGLE_SLASH)) {\n                fileDir = fileDir.concat(SymbolConstant.SINGLE_SLASH);\n            }\n            // 代码逻辑说明: 过滤上传文件夹名特殊字符，防止攻击\n            fileDir=StrAttackFilter.filter(fileDir);\n            fileUrl = fileUrl.append(fileDir + fileName);\n\n            if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith(CommonConstant.STR_HTTP)) {\n                filePath = staticDomain + SymbolConstant.SINGLE_SLASH + fileUrl;\n            } else {\n                filePath = \"https://\" + newBucket + \".\" + endPoint + SymbolConstant.SINGLE_SLASH + fileUrl;\n            }\n            PutObjectResult result = ossClient.putObject(newBucket, fileUrl.toString(), file.getInputStream());\n            // 设置权限(公开读)\n//            ossClient.setBucketAcl(newBucket, CannedAccessControlList.PublicRead);\n            if (result != null) {\n                log.info(\"------OSS文件上传成功------\" + fileUrl);\n            }\n        } catch (IOException e) {\n            log.error(e.getMessage(),e);\n            return null;\n        }catch (Exception e) {\n            log.error(e.getMessage(),e);\n            return null;\n        }\n        return filePath;\n    }\n\n    /**\n     * 获取原始URL\n    * @param url: 原始URL\n    * @Return: java.lang.String\n    */\n    public static String getOriginalUrl(String url) {\n        String originalDomain = \"https://\" + bucketName + \".\" + endPoint;\n        if(oConvertUtils.isNotEmpty(staticDomain) && url.indexOf(staticDomain)!=-1){\n            url = url.replace(staticDomain,originalDomain);\n        }\n        return url;\n    }\n\n    /**\n     * 文件上传\n     * @param file\n     * @param fileDir\n     * @return\n     */\n    public static String upload(MultipartFile file, String fileDir) throws Exception {\n        return upload(file, fileDir,null);\n    }\n\n    /**\n     * 上传文件至阿里云 OSS\n     * 文件上传成功,返回文件完整访问路径\n     * 文件上传失败,返回 null\n     *\n     * @param file    待上传文件\n     * @param fileDir 文件保存目录\n     * @return oss 中的相对文件路径\n     */\n    public static String upload(FileItemStream file, String fileDir) {\n        String filePath = null;\n        initOss(endPoint, accessKeyId, accessKeySecret);\n        StringBuilder fileUrl = new StringBuilder();\n        try {\n            String suffix = file.getName().substring(file.getName().lastIndexOf('.'));\n            String fileName = UUID.randomUUID().toString().replace(\"-\", \"\") + suffix;\n            if (!fileDir.endsWith(SymbolConstant.SINGLE_SLASH)) {\n                fileDir = fileDir.concat(SymbolConstant.SINGLE_SLASH);\n            }\n            fileDir = StrAttackFilter.filter(fileDir);\n            fileUrl = fileUrl.append(fileDir + fileName);\n            if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith(CommonConstant.STR_HTTP)) {\n                filePath = staticDomain + SymbolConstant.SINGLE_SLASH + fileUrl;\n            } else {\n                filePath = \"https://\" + bucketName + \".\" + endPoint + SymbolConstant.SINGLE_SLASH + fileUrl;\n            }\n            PutObjectResult result = ossClient.putObject(bucketName, fileUrl.toString(), file.openStream());\n            // 设置权限(公开读)\n            ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);\n            if (result != null) {\n                log.info(\"------OSS文件上传成功------\" + fileUrl);\n            }\n        } catch (IOException e) {\n            e.printStackTrace();\n            return null;\n        }\n        return filePath;\n    }\n\n    /**\n     * 删除文件\n     * @param url\n     */\n    public static void deleteUrl(String url) {\n        deleteUrl(url,null);\n    }\n\n    /**\n     * 删除文件\n     * @param url\n     */\n    public static void deleteUrl(String url,String bucket) {\n        String newBucket = bucketName;\n        if(oConvertUtils.isNotEmpty(bucket)){\n            newBucket = bucket;\n        }\n        String bucketUrl = \"\";\n        if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith(CommonConstant.STR_HTTP)) {\n            bucketUrl = staticDomain + SymbolConstant.SINGLE_SLASH ;\n        } else {\n            bucketUrl = \"https://\" + newBucket + \".\" + endPoint + SymbolConstant.SINGLE_SLASH;\n        }\n        //TODO 暂时不允许删除云存储的文件\n        //initOss(endPoint, accessKeyId, accessKeySecret);\n        url = url.replace(bucketUrl,\"\");\n        ossClient.deleteObject(newBucket, url);\n    }\n\n    /**\n     * 删除文件\n     * @param fileName\n     */\n    public static void delete(String fileName) {\n        ossClient.deleteObject(bucketName, fileName);\n    }\n\n    /**\n     * 获取文件流\n     * @param objectName\n     * @param bucket\n     * @return\n     */\n    public static InputStream getOssFile(String objectName,String bucket){\n        InputStream inputStream = null;\n        try{\n            String newBucket = bucketName;\n            if(oConvertUtils.isNotEmpty(bucket)){\n                newBucket = bucket;\n            }\n            initOss(endPoint, accessKeyId, accessKeySecret);\n            // 代码逻辑说明: 替换objectName前缀，防止key不一致导致获取不到文件----\n            objectName = OssBootUtil.replacePrefix(objectName,bucket);\n            OSSObject ossObject = ossClient.getObject(newBucket,objectName);\n            inputStream = new BufferedInputStream(ossObject.getObjectContent());\n        }catch (Exception e){\n            log.info(\"文件获取失败\" + e.getMessage());\n        }\n        return inputStream;\n    }\n\n    ///**\n    // * 获取文件流\n    // * @param objectName\n    // * @return\n    // */\n    //public static InputStream getOssFile(String objectName){\n    //    return getOssFile(objectName,null);\n    //}\n\n    /**\n     * 获取文件外链\n     * @param bucketName\n     * @param objectName\n     * @param expires\n     * @return\n     */\n    public static String getObjectUrl(String bucketName, String objectName, Date expires) {\n        initOss(endPoint, accessKeyId, accessKeySecret);\n        try{\n            // 代码逻辑说明: 替换objectName前缀，防止key不一致导致获取不到文件----\n            objectName = OssBootUtil.replacePrefix(objectName,bucketName);\n            if(ossClient.doesObjectExist(bucketName,objectName)){\n                URL url = ossClient.generatePresignedUrl(bucketName,objectName,expires);\n                //log.info(\"原始url : {}\", url.toString());\n                //log.info(\"decode url : {}\", URLDecoder.decode(url.toString(), \"UTF-8\"));\n                //【issues/4023】问题 oss外链经过转编码后，部分无效，大概在三分一；无需转编码直接返回即可 #4023\n                return url.toString();\n            }\n        }catch (Exception e){\n            log.info(\"文件路径获取失败\" + e.getMessage()); \n        }\n        return null;\n    }\n\n    /**\n     * 初始化 oss 客户端\n     *\n     * @return\n     */\n    private static OSSClient initOss(String endpoint, String accessKeyId, String accessKeySecret) {\n        if (ossClient == null) {\n            ossClient = new OSSClient(endpoint,\n                    new DefaultCredentialProvider(accessKeyId, accessKeySecret),\n                    new ClientConfiguration());\n        }\n        return ossClient;\n    }\n\n\n    /**\n     * 上传文件到oss\n     * @param stream\n     * @param relativePath\n     * @return\n     */\n    public static String upload(InputStream stream, String relativePath) {\n        String filePath = null;\n        String fileUrl = relativePath;\n        initOss(endPoint, accessKeyId, accessKeySecret);\n        if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith(CommonConstant.STR_HTTP)) {\n            filePath = staticDomain + SymbolConstant.SINGLE_SLASH + relativePath;\n        } else {\n            filePath = \"https://\" + bucketName + \".\" + endPoint + SymbolConstant.SINGLE_SLASH + fileUrl;\n        }\n        PutObjectResult result = ossClient.putObject(bucketName, fileUrl.toString(),stream);\n        // 设置权限(公开读)\n        ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);\n        if (result != null) {\n            log.info(\"------OSS文件上传成功------\" + fileUrl);\n        }\n        return filePath;\n    }\n\n    /**\n     * 替换前缀，防止key不一致导致获取不到文件\n     * @param objectName 文件上传路径 key\n     * @param customBucket 自定义桶\n     * @date 2022-01-20\n     * @author lsq\n     * @return\n     */\n    private static String replacePrefix(String objectName,String customBucket){\n        log.info(\"------replacePrefix---替换前---objectName:{}\",objectName);\n        if(oConvertUtils.isNotEmpty(staticDomain)){\n            objectName= objectName.replace(staticDomain+SymbolConstant.SINGLE_SLASH,\"\");\n        }else{\n            String newBucket = bucketName;\n            if(oConvertUtils.isNotEmpty(customBucket)){\n                newBucket = customBucket;\n            }\n            String path =\"https://\" + newBucket + \".\" + endPoint + SymbolConstant.SINGLE_SLASH;\n            objectName = objectName.replace(path,\"\");\n        }\n        log.info(\"------replacePrefix---替换后---objectName:{}\",objectName);\n        return objectName;\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/AbstractQueryBlackListHandler.java",
    "content": "package org.jeecg.common.util.security;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.jeecg.common.exception.JeecgSqlInjectionException;\nimport org.jeecg.common.util.SqlInjectionUtil;\nimport org.jeecg.common.util.oConvertUtils;\n\nimport java.util.*;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\n/**\n * 查询表/字段 黑名单处理\n * @Author taoYan\n * @Date 2022/3/17 11:21\n **/\n@Slf4j\npublic abstract class AbstractQueryBlackListHandler {\n\n    /**\n     * key-表名\n     * value-字段名，多个逗号隔开\n     * 两种配置方式-- 全部配置成小写\n     * ruleMap.put(\"sys_user\", \"*\")sys_user所有的字段不支持查询\n     * ruleMap.put(\"sys_user\", \"username,password\")sys_user中的username和password不支持查询\n     */\n    public static Map<String, String> ruleMap = new HashMap<>();\n\n    /**\n     * 以下字符不能出现在表名中或是字段名中\n     */\n    public static final Pattern ILLEGAL_NAME_REG = Pattern.compile(\"[-]{2,}\");\n\n    static {\n        ruleMap.put(\"sys_user\", \"password,salt\");\n    }\n\n\n    /**\n     * 根据 sql语句 获取表和字段信息，需要到具体的实现类重写此方法-\n     * 不同的场景 处理可能不太一样 需要自定义，但是返回值确定\n     * @param sql\n     * @return\n     */\n    protected abstract List<QueryTable> getQueryTableInfo(String sql);\n\n\n    /**\n     * 校验sql语句 成功返回true\n     * @param sql\n     * @return\n     */\n    public boolean isPass(String sql) {\n        List<QueryTable> list = null;\n        //【jeecg-boot/issues/4040】在线报表不支持子查询，解析报错 #4040\n        try {\n            list = this.getQueryTableInfo(sql.toLowerCase());\n        } catch (Exception e) {\n            log.warn(\"校验sql语句，解析报错：{}\",e.getMessage());\n        }\n        \n        if(list==null){\n            return true;\n        }\n        log.debug(\"  获取sql信息 ：{} \", list.toString());\n        boolean flag = checkTableAndFieldsName(list);\n        if(flag == false){\n            return false;\n        }\n        Set<String> xssTableSet = new HashSet<>(Arrays.asList(SqlInjectionUtil.XSS_STR_TABLE.split(\"\\\\|\")));\n\n        for (QueryTable table : list) {\n            String name = table.getName();\n            String fieldRule = ruleMap.get(name);\n            // 有没有配置这张表\n            if (fieldRule != null) {\n                if (\"*\".equals(fieldRule) || table.isAll()) {\n                    flag = false;\n                    log.warn(\"sql黑名单校验，表【\"+name+\"】禁止查询\");\n                    break;\n                } else if (table.existSameField(fieldRule)) {\n                    flag = false;\n                    break;\n                }\n\n            }\n            // 判断是否调用了黑名单数据库\n            String dbName = table.getDbName();\n            if (oConvertUtils.isNotEmpty(dbName)) {\n                dbName = dbName.toLowerCase().trim();\n                if (xssTableSet.contains(dbName)) {\n                    flag = false;\n                    log.warn(\"sql黑名单校验，数据库【\" + dbName + \"】禁止查询\");\n                    break;\n                }\n            }\n        }\n\n        // 返回黑名单校验结果（不合法直接抛出异常）\n        if(!flag){\n            log.error(this.getError());\n            throw new JeecgSqlInjectionException(this.getError());\n        }\n        return flag;\n    }\n\n    /**\n     * 校验表名和字段名是否有效，或是是否会带些特殊的字符串进行sql注入\n     * issues/4983 SQL Injection in 3.5.1 #4983\n     * @return\n     */\n    private boolean checkTableAndFieldsName(List<QueryTable> list){\n        boolean flag = true;\n        for(QueryTable queryTable: list){\n            String tableName = queryTable.getName();\n            if(hasSpecialString(tableName)){\n                flag = false;\n                log.warn(\"sql黑名单校验，表名【\"+tableName+\"】包含特殊字符\");\n                break;\n            }\n            Set<String> fields = queryTable.getFields();\n            for(String name: fields){\n                if(hasSpecialString(name)){\n                    flag = false;\n                    log.warn(\"sql黑名单校验，字段名【\"+name+\"】包含特殊字符\");\n                    break;\n                } \n            }\n        }\n        return flag;\n    }\n\n    /**\n     * 是否包含特殊的字符串\n     * @param name\n     * @return\n     */\n    private boolean hasSpecialString(String name){\n        Matcher m = ILLEGAL_NAME_REG.matcher(name);\n        if (m.find()) {\n            return true;\n        }\n        return false;\n    }\n    \n\n    /**\n     * 查询的表的信息\n     */\n    protected class QueryTable {\n        //数据库名\n        private String dbName;\n        //表名\n        private String name;\n        //表的别名\n        private String alias;\n        // 字段名集合\n        private Set<String> fields;\n        // 是否查询所有字段\n        private boolean all;\n\n        public QueryTable() {\n        }\n\n        public QueryTable(String name, String alias) {\n            this.name = name;\n            this.alias = alias;\n            this.all = false;\n            this.fields = new HashSet<>();\n        }\n\n        public void addField(String field) {\n            this.fields.add(field);\n        }\n\n        public String getDbName() {\n            return dbName;\n        }\n\n        public void setDbName(String dbName) {\n            this.dbName = dbName;\n        }\n\n        public String getName() {\n            return name;\n        }\n\n        public Set<String> getFields() {\n            return new HashSet<>(fields);\n        }\n\n        public void setName(String name) {\n            this.name = name;\n        }\n\n        public void setFields(Set<String> fields) {\n            this.fields = fields;\n        }\n\n        public String getAlias() {\n            return alias;\n        }\n\n        public void setAlias(String alias) {\n            this.alias = alias;\n        }\n\n        public boolean isAll() {\n            return all;\n        }\n\n        public void setAll(boolean all) {\n            this.all = all;\n        }\n\n        /**\n         * 判断是否有相同字段\n         *\n         * @param fieldString\n         * @return\n         */\n        public boolean existSameField(String fieldString) {\n            String[] controlFields = fieldString.split(\",\");\n            for (String sqlField : fields) {\n                for (String controlField : controlFields) {\n                    if (sqlField.equals(controlField)) {\n                        // 非常明确的列直接比较\n                        log.warn(\"sql黑名单校验，表【\"+name+\"】中字段【\"+controlField+\"】禁止查询\");\n                        return true;\n                    } else {\n                        // 使用表达式的列 只能判读字符串包含了\n                        String aliasColumn = controlField;\n                        if (StringUtils.isNotBlank(alias)) {\n                            aliasColumn = alias + \".\" + controlField;\n                        }\n                        if (sqlField.indexOf(aliasColumn) != -1) {\n                            log.warn(\"sql黑名单校验，表【\"+name+\"】中字段【\"+controlField+\"】禁止查询\");\n                            return true;\n                        }\n                    }\n                }\n            }\n            return false;\n        }\n\n        @Override\n        public String toString() {\n            return \"QueryTable{\" +\n                    \"name='\" + name + '\\'' +\n                    \", alias='\" + alias + '\\'' +\n                    \", fields=\" + fields +\n                    \", all=\" + all +\n                    '}';\n        }\n    }\n\n    public String getError(){\n        // TODO\n        return \"系统设置了安全规则，敏感表和敏感字段禁止查询，联系管理员授权!\";\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/JdbcSecurityUtil.java",
    "content": "package org.jeecg.common.util.security;\n\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.util.oConvertUtils;\n\n/**\n * jdbc连接校验\n * @Author taoYan\n * @Date 2022/8/10 18:15\n **/\npublic class JdbcSecurityUtil {\n\n    /**\n     * 连接驱动漏洞 最新版本修复后，可删除相应的key\n     * postgre：authenticationPluginClassName, sslhostnameverifier, socketFactory, sslfactory, sslpasswordcallback\n     * https://github.com/pgjdbc/pgjdbc/security/advisories/GHSA-v7wg-cpwc-24m4\n     * \n     */\n    public static final String[] notAllowedProps = new String[]{\"authenticationPluginClassName\", \"sslhostnameverifier\", \"socketFactory\", \"sslfactory\", \"sslpasswordcallback\"};\n\n    /**\n     * 校验sql是否有特定的key\n     * @param jdbcUrl\n     * @return\n     */\n    public static void validate(String jdbcUrl){\n        if(oConvertUtils.isEmpty(jdbcUrl)){\n            return;\n        }\n        String urlConcatChar = \"?\";\n        if(jdbcUrl.indexOf(urlConcatChar)<0){\n            return;\n        }\n        String argString = jdbcUrl.substring(jdbcUrl.indexOf(urlConcatChar)+1);\n        String[] keyAndValues = argString.split(\"&\");\n        for(String temp: keyAndValues){\n            String key = temp.split(\"=\")[0];\n            for(String prop: notAllowedProps){\n                if(prop.equalsIgnoreCase(key)){\n                    throw new JeecgBootException(\"连接地址有安全风险，【\"+key+\"】\");\n                }\n            }\n        }\n    }\n    \n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/SecurityTools.java",
    "content": "package org.jeecg.common.util.security;\n\nimport cn.hutool.core.codec.Base64Decoder;\nimport cn.hutool.core.codec.Base64Encoder;\nimport cn.hutool.crypto.SecureUtil;\nimport cn.hutool.crypto.asymmetric.KeyType;\nimport cn.hutool.crypto.asymmetric.RSA;\nimport cn.hutool.crypto.asymmetric.Sign;\nimport cn.hutool.crypto.asymmetric.SignAlgorithm;\nimport cn.hutool.crypto.symmetric.AES;\nimport org.jeecg.common.util.security.entity.*;\nimport com.alibaba.fastjson.JSONObject;\nimport javax.crypto.SecretKey;\nimport java.security.KeyPair;\n\n/**\n * @Description: SecurityTools\n * @author: jeecg-boot\n */\npublic class SecurityTools {\n    public static final String ALGORITHM = \"AES/ECB/PKCS5Padding\";\n\n    public static SecurityResp valid(SecurityReq req) {\n        SecurityResp resp=new SecurityResp();\n        String pubKey=req.getPubKey();\n        String aesKey=req.getAesKey();\n        String data=req.getData();\n        String signData=req.getSignData();\n        RSA rsa=new RSA(null, Base64Decoder.decode(pubKey));\n        Sign sign= new Sign(SignAlgorithm.SHA1withRSA,null,pubKey);\n\n\n\n        byte[] decryptAes = rsa.decrypt(aesKey, KeyType.PublicKey);\n        //log.info(\"rsa解密后的秘钥\"+ Base64Encoder.encode(decryptAes));\n        AES aes = SecureUtil.aes(decryptAes);\n\n        String dencrptValue =aes.decryptStr(data);\n        //log.info(\"解密后报文\"+dencrptValue);\n        resp.setData(JSONObject.parseObject(dencrptValue));\n\n        boolean verify = sign.verify(dencrptValue.getBytes(), Base64Decoder.decode(signData));\n        resp.setSuccess(verify);\n        return resp;\n    }\n\n    public static SecuritySignResp sign(SecuritySignReq req) {\n        SecretKey secretKey = SecureUtil.generateKey(ALGORITHM);\n        byte[] key= secretKey.getEncoded();\n        String prikey=req.getPrikey();\n        String data=req.getData();\n\n        AES aes = SecureUtil.aes(key);\n        aes.getSecretKey().getEncoded();\n        String encrptData =aes.encryptBase64(data);\n        RSA rsa=new RSA(prikey,null);\n        byte[] encryptAesKey = rsa.encrypt(secretKey.getEncoded(), KeyType.PrivateKey);\n        //log.info((\"rsa加密过的秘钥==\"+Base64Encoder.encode(encryptAesKey));\n\n        Sign sign= new Sign(SignAlgorithm.SHA1withRSA,prikey,null);\n        byte[] signed = sign.sign(data.getBytes());\n\n        //log.info((\"签名数据===》》\"+Base64Encoder.encode(signed));\n\n        SecuritySignResp resp=new SecuritySignResp();\n        resp.setAesKey(Base64Encoder.encode(encryptAesKey));\n        resp.setData(encrptData);\n        resp.setSignData(Base64Encoder.encode(signed));\n        return resp;\n    }\n    public static MyKeyPair generateKeyPair(){\n        KeyPair keyPair= SecureUtil.generateKeyPair(SignAlgorithm.SHA1withRSA.getValue(),2048);\n        String priKey= Base64Encoder.encode(keyPair.getPrivate().getEncoded());\n        String pubkey= Base64Encoder.encode(keyPair.getPublic().getEncoded());\n        MyKeyPair resp=new MyKeyPair();\n        resp.setPriKey(priKey);\n        resp.setPubKey(pubkey);\n        return resp;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/MyKeyPair.java",
    "content": "package org.jeecg.common.util.security.entity;\n\nimport lombok.Data;\n\n/**\n * @Description: MyKeyPair\n * @author: jeecg-boot\n */\n@Data\npublic class MyKeyPair {\n    private String priKey;\n    private String pubKey;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecurityReq.java",
    "content": "package org.jeecg.common.util.security.entity;\n\nimport lombok.Data;\n\n/**\n * @Description: SecurityReq\n * @author: jeecg-boot\n */\n@Data\npublic class SecurityReq {\n    private String data;\n    private String pubKey;\n    private String signData;\n    private String aesKey;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecurityResp.java",
    "content": "package org.jeecg.common.util.security.entity;\n\nimport com.alibaba.fastjson.JSONObject;\nimport lombok.Data;\n\n/**\n * @Description: SecurityResp\n * @author: jeecg-boot\n */\n@Data\npublic class SecurityResp {\n    private Boolean success;\n    private JSONObject data;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecuritySignReq.java",
    "content": "package org.jeecg.common.util.security.entity;\n\nimport lombok.Data;\n\n/**\n * @Description: SecuritySignReq\n * @author: jeecg-boot\n */\n@Data\npublic class SecuritySignReq {\n    private String data;\n    private String prikey;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/security/entity/SecuritySignResp.java",
    "content": "package org.jeecg.common.util.security.entity;\n\nimport lombok.Data;\n\n/**\n * @Description: SecuritySignResp\n * @author: jeecg-boot\n */\n@Data\npublic class SecuritySignResp {\n    private String data;\n    private String signData;\n    private String aesKey;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/sqlparse/JSqlParserAllTableManager.java",
    "content": "//package org.jeecg.common.util.sqlparse;\n//\n//import lombok.extern.slf4j.Slf4j;\n//import net.sf.jsqlparser.JSQLParserException;\n//import net.sf.jsqlparser.expression.*;\n//import net.sf.jsqlparser.parser.CCJSqlParserManager;\n//import net.sf.jsqlparser.schema.Column;\n//import net.sf.jsqlparser.schema.Table;\n//import net.sf.jsqlparser.statement.Statement;\n//import net.sf.jsqlparser.statement.select.*;\n//import org.jeecg.common.exception.JeecgBootException;\n//import org.jeecg.common.util.sqlparse.vo.SelectSqlInfo;\n//\n//import java.io.StringReader;\n//import java.util.ArrayList;\n//import java.util.HashMap;\n//import java.util.List;\n//import java.util.Map;\n//\n///**\n// * 解析所有表名和字段的类\n// */\n//@Slf4j\n//public class JSqlParserAllTableManager {\n//\n//    private final String sql;\n//    private final Map<String, SelectSqlInfo> allTableMap = new HashMap<>();\n//    /**\n//     * 别名对应实际表名\n//     */\n//    private final Map<String, String> tableAliasMap = new HashMap<>();\n//\n//    /**\n//     * 解析后的sql\n//     */\n//    private String parsedSql = null;\n//\n//    JSqlParserAllTableManager(String selectSql) {\n//        this.sql = selectSql;\n//    }\n//\n//    /**\n//     * 开始解析\n//     *\n//     * @return\n//     * @throws JSQLParserException\n//     */\n//    public Map<String, SelectSqlInfo> parse() throws JSQLParserException {\n//        // 1. 创建解析器\n//        CCJSqlParserManager mgr = new CCJSqlParserManager();\n//        // 2. 使用解析器解析sql生成具有层次结构的java类\n//        Statement stmt = mgr.parse(new StringReader(this.sql));\n//        if (stmt instanceof Select) {\n//            Select selectStatement = (Select) stmt;\n//            SelectBody selectBody = selectStatement.getSelectBody();\n//            this.parsedSql = selectBody.toString();\n//            // 3. 解析select查询sql的信息\n//            if (selectBody instanceof PlainSelect) {\n//                PlainSelect plainSelect = (PlainSelect) selectBody;\n//                // 4. 合并 fromItems\n//                List<FromItem> fromItems = new ArrayList<>();\n//                fromItems.add(plainSelect.getFromItem());\n//                // 4.1 处理join的表\n//                List<Join> joins = plainSelect.getJoins();\n//                if (joins != null) {\n//                    joins.forEach(join -> fromItems.add(join.getRightItem()));\n//                }\n//                // 5. 处理 fromItems\n//                for (FromItem fromItem : fromItems) {\n//                    // 5.1 通过表名的方式from\n//                    if (fromItem instanceof Table) {\n//                        this.addSqlInfoByTable((Table) fromItem);\n//                    }\n//                    // 5.2 通过子查询的方式from\n//                    else if (fromItem instanceof SubSelect) {\n//                        this.handleSubSelect((SubSelect) fromItem);\n//                    }\n//                }\n//                // 6. 解析 selectFields\n//                List<SelectItem> selectItems = plainSelect.getSelectItems();\n//                for (SelectItem selectItem : selectItems) {\n//                    // 6.1 查询的是全部字段\n//                    if (selectItem instanceof AllColumns) {\n//                        // 当 selectItem 为 AllColumns 时，fromItem 必定为 Table\n//                        String tableName = plainSelect.getFromItem(Table.class).getName();\n//                        // 此处必定不为空，因为在解析 fromItem 时，已经将表名添加到 allTableMap 中\n//                        SelectSqlInfo sqlInfo = this.allTableMap.get(tableName);\n//                        assert sqlInfo != null;\n//                        // 设置为查询全部字段\n//                        sqlInfo.setSelectAll(true);\n//                        sqlInfo.setSelectFields(null);\n//                        sqlInfo.setRealSelectFields(null);\n//                    }\n//                    // 6.2 查询的是带表别名（ u.* )的全部字段\n//                    else if (selectItem instanceof AllTableColumns) {\n//                        AllTableColumns allTableColumns = (AllTableColumns) selectItem;\n//                        String aliasName = allTableColumns.getTable().getName();\n//                        // 通过别名获取表名\n//                        String tableName = this.tableAliasMap.get(aliasName);\n//                        if (tableName == null) {\n//                            tableName = aliasName;\n//                        }\n//                        SelectSqlInfo sqlInfo = this.allTableMap.get(tableName);\n//                        // 如果此处为空，则说明该字段是通过子查询获取的，所以可以不处理，只有实际表才需要处理\n//                        if (sqlInfo != null) {\n//                            // 设置为查询全部字段\n//                            sqlInfo.setSelectAll(true);\n//                            sqlInfo.setSelectFields(null);\n//                            sqlInfo.setRealSelectFields(null);\n//                        }\n//                    }\n//                    // 6.3 各种字段表达式处理\n//                    else if (selectItem instanceof SelectExpressionItem) {\n//                        SelectExpressionItem selectExpressionItem = (SelectExpressionItem) selectItem;\n//                        Expression expression = selectExpressionItem.getExpression();\n//                        Alias alias = selectExpressionItem.getAlias();\n//                        this.handleExpression(expression, alias, plainSelect.getFromItem());\n//                    }\n//                }\n//            } else {\n//                log.warn(\"暂时尚未处理该类型的 SelectBody: {}\", selectBody.getClass().getName());\n//                throw new JeecgBootException(\"暂时尚未处理该类型的 SelectBody\");\n//            }\n//        } else {\n//            // 非 select 查询sql，不做处理\n//            throw new JeecgBootException(\"非 select 查询sql，不做处理\");\n//        }\n//        return this.allTableMap;\n//    }\n//\n//    /**\n//     * 处理子查询\n//     *\n//     * @param subSelect\n//     */\n//    private void handleSubSelect(SubSelect subSelect) {\n//        try {\n//            String subSelectSql = subSelect.getSelectBody().toString();\n//            // 递归调用解析\n//            Map<String, SelectSqlInfo> map = JSqlParserUtils.parseAllSelectTable(subSelectSql);\n//            if (map != null) {\n//                this.assignMap(map);\n//            }\n//        } catch (Exception e) {\n//            log.error(\"解析子查询出错\", e);\n//        }\n//    }\n//\n//    /**\n//     * 处理查询字段表达式\n//     *\n//     * @param expression\n//     */\n//    private void handleExpression(Expression expression, Alias alias, FromItem fromItem) {\n//        // 处理函数式字段  CONCAT(name,'(',age,')')\n//        if (expression instanceof Function) {\n//            Function functionExp = (Function) expression;\n//            List<Expression> expressions = functionExp.getParameters().getExpressions();\n//            for (Expression expItem : expressions) {\n//                this.handleExpression(expItem, null, fromItem);\n//            }\n//            return;\n//        }\n//        // 处理字段上的子查询\n//        if (expression instanceof SubSelect) {\n//            this.handleSubSelect((SubSelect) expression);\n//            return;\n//        }\n//        // 不处理字面量\n//        if (expression instanceof StringValue ||\n//                expression instanceof NullValue ||\n//                expression instanceof LongValue ||\n//                expression instanceof DoubleValue ||\n//                expression instanceof HexValue ||\n//                expression instanceof DateValue ||\n//                expression instanceof TimestampValue ||\n//                expression instanceof TimeValue\n//        ) {\n//            return;\n//        }\n//\n//        // 处理字段\n//        if (expression instanceof Column) {\n//            Column column = (Column) expression;\n//            // 查询字段名\n//            String fieldName = column.getColumnName();\n//            String aliasName = fieldName;\n//            if (alias != null) {\n//                aliasName = alias.getName();\n//            }\n//            String tableName;\n//            if (column.getTable() != null) {\n//                // 通过列的表名获取 sqlInfo\n//                // 例如 user.name，这里的 tableName 就是 user\n//                tableName = column.getTable().getName();\n//                // 有可能是别名，需要转换为真实表名\n//                if (this.tableAliasMap.get(tableName) != null) {\n//                    tableName = this.tableAliasMap.get(tableName);\n//                }\n//            } else {\n//                // 当column的table为空时，说明是 fromItem 中的字段\n//                tableName = ((Table) fromItem).getName();\n//            }\n//            SelectSqlInfo $sqlInfo = this.allTableMap.get(tableName);\n//            if ($sqlInfo != null) {\n//                $sqlInfo.addSelectField(aliasName, fieldName);\n//            } else {\n//                log.warn(\"发生意外情况，未找到表名为 {} 的 SelectSqlInfo\", tableName);\n//            }\n//        }\n//    }\n//\n//    /**\n//     * 根据表名添加sqlInfo\n//     *\n//     * @param table\n//     */\n//    private void addSqlInfoByTable(Table table) {\n//        String tableName = table.getName();\n//        // 解析 aliasName\n//        if (table.getAlias() != null) {\n//            this.tableAliasMap.put(table.getAlias().getName(), tableName);\n//        }\n//        SelectSqlInfo sqlInfo = new SelectSqlInfo(this.parsedSql);\n//        sqlInfo.setFromTableName(table.getName());\n//        this.allTableMap.put(sqlInfo.getFromTableName(), sqlInfo);\n//    }\n//\n//    /**\n//     * 合并map\n//     *\n//     * @param source\n//     */\n//    private void assignMap(Map<String, SelectSqlInfo> source) {\n//        for (Map.Entry<String, SelectSqlInfo> entry : source.entrySet()) {\n//            SelectSqlInfo sqlInfo = this.allTableMap.get(entry.getKey());\n//            if (sqlInfo == null) {\n//                this.allTableMap.put(entry.getKey(), entry.getValue());\n//            } else {\n//                // 合并\n//                if (sqlInfo.getSelectFields() == null) {\n//                    sqlInfo.setSelectFields(entry.getValue().getSelectFields());\n//                } else {\n//                    sqlInfo.getSelectFields().addAll(entry.getValue().getSelectFields());\n//                }\n//                if (sqlInfo.getRealSelectFields() == null) {\n//                    sqlInfo.setRealSelectFields(entry.getValue().getRealSelectFields());\n//                } else {\n//                    sqlInfo.getRealSelectFields().addAll(entry.getValue().getRealSelectFields());\n//                }\n//            }\n//        }\n//    }\n//\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/sqlparse/JSqlParserUtils.java",
    "content": "//package org.jeecg.common.util.sqlparse;\n//\n//import lombok.extern.slf4j.Slf4j;\n//import net.sf.jsqlparser.JSQLParserException;\n//import net.sf.jsqlparser.expression.*;\n//import net.sf.jsqlparser.parser.CCJSqlParserManager;\n//import net.sf.jsqlparser.schema.Column;\n//import net.sf.jsqlparser.schema.Table;\n//import net.sf.jsqlparser.statement.Statement;\n//import net.sf.jsqlparser.statement.select.*;\n//import org.jeecg.common.exception.JeecgBootException;\n//import org.jeecg.common.util.oConvertUtils;\n//import org.jeecg.common.util.sqlparse.vo.SelectSqlInfo;\n//\n//import java.io.StringReader;\n//import java.util.List;\n//import java.util.Map;\n//\n//@Slf4j\n//public class JSqlParserUtils {\n//\n//    /**\n//     * 解析 查询（select）sql的信息，\n//     * 此方法会展开所有子查询到一个map里，\n//     * key只存真实的表名，如果查询的没有真实的表名，则会被忽略。\n//     * value只存真实的字段名，如果查询的没有真实的字段名，则会被忽略。\n//     * <p>\n//     * 例如：SELECT a.*,d.age,(SELECT count(1) FROM sys_depart) AS count FROM (SELECT username AS foo, realname FROM sys_user) a, demo d\n//     * 解析后的结果为：{sys_user=[username, realname], demo=[age], sys_depart=[]}\n//     *\n//     * @param selectSql\n//     * @return\n//     */\n//    public static Map<String, SelectSqlInfo> parseAllSelectTable(String selectSql) throws JSQLParserException {\n//        if (oConvertUtils.isEmpty(selectSql)) {\n//            return null;\n//        }\n//        // log.info(\"解析查询Sql：{}\", selectSql);\n//        JSqlParserAllTableManager allTableManager = new JSqlParserAllTableManager(selectSql);\n//        return allTableManager.parse();\n//    }\n//\n//    /**\n//     * 解析 查询（select）sql的信息，子查询嵌套\n//     *\n//     * @param selectSql\n//     * @return\n//     */\n//    public static SelectSqlInfo parseSelectSqlInfo(String selectSql) throws JSQLParserException {\n//        if (oConvertUtils.isEmpty(selectSql)) {\n//            return null;\n//        }\n//        // log.info(\"解析查询Sql：{}\", selectSql);\n//        // 使用 JSqlParer 解析sql\n//        // 1、创建解析器\n//        CCJSqlParserManager mgr = new CCJSqlParserManager();\n//        // 2、使用解析器解析sql生成具有层次结构的java类\n//        Statement stmt = mgr.parse(new StringReader(selectSql));\n//        if (stmt instanceof Select) {\n//            Select selectStatement = (Select) stmt;\n//            // 3、解析select查询sql的信息\n//            return JSqlParserUtils.parseBySelectBody(selectStatement.getSelectBody());\n//        } else {\n//            // 非 select 查询sql，不做处理\n//            throw new JeecgBootException(\"非 select 查询sql，不做处理\");\n//        }\n//    }\n//\n//    /**\n//     * 解析 select 查询sql的信息\n//     *\n//     * @param selectBody\n//     * @return\n//     */\n//    private static SelectSqlInfo parseBySelectBody(SelectBody selectBody) {\n//        // 判断是否使用了union等操作\n//        if (selectBody instanceof SetOperationList) {\n//            // 如果使用了union等操作，则只解析第一个查询\n//            List<SelectBody> selectBodyList = ((SetOperationList) selectBody).getSelects();\n//            return JSqlParserUtils.parseBySelectBody(selectBodyList.get(0));\n//        }\n//        // 简单的select查询\n//        if (selectBody instanceof PlainSelect) {\n//            SelectSqlInfo sqlInfo = new SelectSqlInfo(selectBody);\n//            PlainSelect plainSelect = (PlainSelect) selectBody;\n//            FromItem fromItem = plainSelect.getFromItem();\n//            // 解析 aliasName\n//            if (fromItem.getAlias() != null) {\n//                sqlInfo.setFromTableAliasName(fromItem.getAlias().getName());\n//            }\n//            // 解析 表名\n//            if (fromItem instanceof Table) {\n//                // 通过表名的方式from\n//                Table fromTable = (Table) fromItem;\n//                sqlInfo.setFromTableName(fromTable.getName());\n//            } else if (fromItem instanceof SubSelect) {\n//                // 通过子查询的方式from\n//                SubSelect fromSubSelect = (SubSelect) fromItem;\n//                SelectSqlInfo subSqlInfo = JSqlParserUtils.parseBySelectBody(fromSubSelect.getSelectBody());\n//                sqlInfo.setFromSubSelect(subSqlInfo);\n//            }\n//            // 解析 selectFields\n//            List<SelectItem> selectItems = plainSelect.getSelectItems();\n//            for (SelectItem selectItem : selectItems) {\n//                if (selectItem instanceof AllColumns || selectItem instanceof AllTableColumns) {\n//                    // 全部字段\n//                    sqlInfo.setSelectAll(true);\n//                    sqlInfo.setSelectFields(null);\n//                    sqlInfo.setRealSelectFields(null);\n//                    break;\n//                } else if (selectItem instanceof SelectExpressionItem) {\n//                    // 获取单个查询字段名\n//                    SelectExpressionItem selectExpressionItem = (SelectExpressionItem) selectItem;\n//                    Expression expression = selectExpressionItem.getExpression();\n//                    Alias alias = selectExpressionItem.getAlias();\n//                    JSqlParserUtils.handleExpression(sqlInfo, expression, alias);\n//                }\n//            }\n//            return sqlInfo;\n//        } else {\n//            log.warn(\"暂时尚未处理该类型的 SelectBody: {}\", selectBody.getClass().getName());\n//            throw new JeecgBootException(\"暂时尚未处理该类型的 SelectBody\");\n//        }\n//    }\n//\n//    /**\n//     * 处理查询字段表达式\n//     *\n//     * @param sqlInfo\n//     * @param expression\n//     * @param alias      是否有别名，无传null\n//     */\n//    private static void handleExpression(SelectSqlInfo sqlInfo, Expression expression, Alias alias) {\n//        // 处理函数式字段  CONCAT(name,'(',age,')')\n//        if (expression instanceof Function) {\n//            JSqlParserUtils.handleFunctionExpression((Function) expression, sqlInfo);\n//            return;\n//        }\n//        // 处理字段上的子查询\n//        if (expression instanceof SubSelect) {\n//            SubSelect subSelect = (SubSelect) expression;\n//            SelectSqlInfo subSqlInfo = JSqlParserUtils.parseBySelectBody(subSelect.getSelectBody());\n//            // 注：字段上的子查询，必须只查询一个字段，否则会报错，所以可以放心合并\n//            sqlInfo.getSelectFields().addAll(subSqlInfo.getSelectFields());\n//            sqlInfo.getRealSelectFields().addAll(subSqlInfo.getAllRealSelectFields());\n//            return;\n//        }\n//        // 不处理字面量\n//        if (expression instanceof StringValue ||\n//                expression instanceof NullValue ||\n//                expression instanceof LongValue ||\n//                expression instanceof DoubleValue ||\n//                expression instanceof HexValue ||\n//                expression instanceof DateValue ||\n//                expression instanceof TimestampValue ||\n//                expression instanceof TimeValue\n//        ) {\n//            return;\n//        }\n//\n//        // 查询字段名\n//        String selectField = expression.toString();\n//        // 实际查询字段名\n//        String realSelectField = selectField;\n//        // 判断是否有别名\n//        if (alias != null) {\n//            selectField = alias.getName();\n//        }\n//        // 获取真实字段名\n//        if (expression instanceof Column) {\n//            Column column = (Column) expression;\n//            realSelectField = column.getColumnName();\n//        }\n//        sqlInfo.addSelectField(selectField, realSelectField);\n//    }\n//\n//    /**\n//     * 处理函数式字段\n//     *\n//     * @param functionExp\n//     * @param sqlInfo\n//     */\n//    private static void handleFunctionExpression(Function functionExp, SelectSqlInfo sqlInfo) {\n//        List<Expression> expressions = functionExp.getParameters().getExpressions();\n//        for (Expression expression : expressions) {\n//            JSqlParserUtils.handleExpression(sqlInfo, expression, null);\n//        }\n//    }\n//\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/sqlparse/vo/SelectSqlInfo.java",
    "content": "//package org.jeecg.common.util.sqlparse.vo;\n//\n//import lombok.Data;\n//import net.sf.jsqlparser.statement.select.SelectBody;\n//\n//import java.util.HashSet;\n//import java.util.Set;\n//\n///**\n// * select 查询 sql 的信息\n// */\n//@Data\n//public class SelectSqlInfo {\n//\n//    /**\n//     * 查询的表名，如果是子查询，则此处为null\n//     */\n//    private String fromTableName;\n//    /**\n//     * 表别名\n//     */\n//    private String fromTableAliasName;\n//    /**\n//     * 通过子查询获取的表信息，例如：select name from (select * from user) u\n//     * 如果不是子查询，则为null\n//     */\n//    private SelectSqlInfo fromSubSelect;\n//    /**\n//     * 查询的字段集合，如果是 * 则为null，如果设了别名则为别名\n//     */\n//    private Set<String> selectFields;\n//    /**\n//     * 真实的查询字段集合，如果是 * 则为null，如果设了别名则为原始字段名\n//     */\n//    private Set<String> realSelectFields;\n//    /**\n//     * 是否是查询所有字段\n//     */\n//    private boolean selectAll;\n//\n//    /**\n//     * 解析之后的 SQL （关键字都是大写）\n//     */\n//    private final String parsedSql;\n//\n//    public SelectSqlInfo(String parsedSql) {\n//        this.parsedSql = parsedSql;\n//    }\n//\n//    public SelectSqlInfo(SelectBody selectBody) {\n//        this.parsedSql = selectBody.toString();\n//    }\n//\n//    public void addSelectField(String selectField, String realSelectField) {\n//        if (this.selectFields == null) {\n//            this.selectFields = new HashSet<>();\n//        }\n//        if (this.realSelectFields == null) {\n//            this.realSelectFields = new HashSet<>();\n//        }\n//        this.selectFields.add(selectField);\n//        this.realSelectFields.add(realSelectField);\n//    }\n//\n//    /**\n//     * 获取所有字段，包括子查询里的。\n//     *\n//     * @return\n//     */\n//    public Set<String> getAllRealSelectFields() {\n//        Set<String> fields = new HashSet<>();\n//        // 递归获取所有字段，起个直观的方法名为：\n//        this.recursiveGetAllFields(this, fields);\n//        return fields;\n//    }\n//\n//    /**\n//     * 递归获取所有字段\n//     */\n//    private void recursiveGetAllFields(SelectSqlInfo sqlInfo, Set<String> fields) {\n//        if (!sqlInfo.isSelectAll() && sqlInfo.getRealSelectFields() != null) {\n//            fields.addAll(sqlInfo.getRealSelectFields());\n//        }\n//        if (sqlInfo.getFromSubSelect() != null) {\n//            recursiveGetAllFields(sqlInfo.getFromSubSelect(), fields);\n//        }\n//    }\n//\n//    @Override\n//    public String toString() {\n//        return \"SelectSqlInfo{\" +\n//                \"fromTableName='\" + fromTableName + '\\'' +\n//                \", fromSubSelect=\" + fromSubSelect +\n//                \", aliasName='\" + fromTableAliasName + '\\'' +\n//                \", selectFields=\" + selectFields +\n//                \", realSelectFields=\" + realSelectFields +\n//                \", selectAll=\" + selectAll +\n//                \"}\";\n//    }\n//\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/superSearch/ObjectParseUtil.java",
    "content": "//package org.jeecg.common.util.superSearch;\n//\n//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\n//\n///**\n// *   判断类型，追加查询规则\n// *\n// * @Author Scott\n// * @Date 2019年02月14日\n// */\n//public class ObjectParseUtil {\n//\n//\t/**\n//\t *\n//\t * @param queryWrapper QueryWrapper\n//\t * @param name         字段名字\n//\t * @param rule         查询规则\n//\t * @param value        查询条件值\n//\t */\n//\tpublic static void addCriteria(QueryWrapper<?> queryWrapper, String name, QueryRuleEnum rule, Object value) {\n//\t\tif (value == null || rule == null) {\n//\t\t\treturn;\n//\t\t}\n//\t\tswitch (rule) {\n//\t\tcase GT:\n//\t\t\tqueryWrapper.gt(name, value);\n//\t\t\tbreak;\n//\t\tcase GE:\n//\t\t\tqueryWrapper.ge(name, value);\n//\t\t\tbreak;\n//\t\tcase LT:\n//\t\t\tqueryWrapper.lt(name, value);\n//\t\t\tbreak;\n//\t\tcase LE:\n//\t\t\tqueryWrapper.le(name, value);\n//\t\t\tbreak;\n//\t\tcase EQ:\n//\t\t\tqueryWrapper.eq(name, value);\n//\t\t\tbreak;\n//\t\tcase NE:\n//\t\t\tqueryWrapper.ne(name, value);\n//\t\t\tbreak;\n//\t\tcase IN:\n//\t\t\tqueryWrapper.in(name, (Object[]) value);\n//\t\t\tbreak;\n//\t\tcase LIKE:\n//\t\t\tqueryWrapper.like(name, value);\n//\t\t\tbreak;\n//\t\tcase LEFT_LIKE:\n//\t\t\tqueryWrapper.likeLeft(name, value);\n//\t\t\tbreak;\n//\t\tcase RIGHT_LIKE:\n//\t\t\tqueryWrapper.likeRight(name, value);\n//\t\t\tbreak;\n//\t\tdefault:\n//\t\t\tbreak;\n//\t\t}\n//\t}\n//\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/superSearch/QueryRuleEnum.java",
    "content": "//package org.jeecg.common.util.superSearch;\n//\n//import org.jeecg.common.util.oConvertUtils;\n//\n///**\n// * Query 规则 常量\n// * @Author Scott\n// * @Date 2019年02月14日\n// */\n//public enum QueryRuleEnum {\n//\n//    /**查询规则 大于*/\n//    GT(\">\",\"大于\"),\n//    /**查询规则 大于等于*/\n//    GE(\">=\",\"大于等于\"),\n//    /**查询规则 小于*/\n//    LT(\"<\",\"小于\"),\n//    /**查询规则 小于等于*/\n//    LE(\"<=\",\"小于等于\"),\n//    /**查询规则 等于*/\n//    EQ(\"=\",\"等于\"),\n//    /**查询规则 不等于*/\n//    NE(\"!=\",\"不等于\"),\n//    /**查询规则 包含*/\n//    IN(\"IN\",\"包含\"),\n//    /**查询规则 全模糊*/\n//    LIKE(\"LIKE\",\"全模糊\"),\n//    /**查询规则 左模糊*/\n//    LEFT_LIKE(\"LEFT_LIKE\",\"左模糊\"),\n//    /**查询规则 右模糊*/\n//    RIGHT_LIKE(\"RIGHT_LIKE\",\"右模糊\"),\n//    /**查询规则 自定义SQL片段*/\n//    SQL_RULES(\"EXTEND_SQL\",\"自定义SQL片段\");\n//\n//    private String value;\n//\n//    private String msg;\n//\n//    QueryRuleEnum(String value, String msg){\n//        this.value = value;\n//        this.msg = msg;\n//    }\n//\n//    public String getValue() {\n//        return value;\n//    }\n//\n//    public void setValue(String value) {\n//        this.value = value;\n//    }\n//\n//    public String getMsg() {\n//        return msg;\n//    }\n//\n//    public void setMsg(String msg) {\n//        this.msg = msg;\n//    }\n//\n//    public static QueryRuleEnum getByValue(String value){\n//    \tif(oConvertUtils.isEmpty(value)) {\n//    \t\treturn null;\n//    \t}\n//        for(QueryRuleEnum val :values()){\n//            if (val.getValue().equals(value)){\n//                return val;\n//            }\n//        }\n//        return  null;\n//    }\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/superSearch/QueryRuleVo.java",
    "content": "//package org.jeecg.common.util.superSearch;\n//\n//import lombok.Data;\n//\n///**\n// * @Description: QueryRuleVo\n// * @author: jeecg-boot\n// */\n//@Data\n//public class QueryRuleVo {\n//\n//\tprivate String field;\n//\tprivate String rule;\n//\tprivate String val;\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/AiRagConfigBean.java",
    "content": "package org.jeecg.config;\n\nimport lombok.Data;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.stereotype.Component;\n\n/**\n * ai配置类，通用的配置可以放到这里面\n *\n * @Author: wangshuai\n * @Date: 2025/12/17 14:00\n */\n@Data\n@Component\n@ConfigurationProperties(prefix = AiRagConfigBean.PREFIX)\npublic class AiRagConfigBean {\n    public static final String PREFIX = \"jeecg.airag\";\n    \n    /**\n     * 敏感节点\n     * stdio mpc命令行功能开启，sql：AI流程SQL节点开启\n     */\n    private String allowSensitiveNodes = \"\";\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/AutoPoiConfig.java",
    "content": "package org.jeecg.config;\n\nimport org.jeecgframework.core.util.ApplicationContextUtil;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Lazy;\n\n/**\n * @Author: Scott\n * @Date: 2018/2/7\n * @description: autopoi 配置类\n */\n@Lazy(false)\n@Configuration\npublic class AutoPoiConfig {\n\n    /**\n     * excel注解字典参数支持(导入导出字典值，自动翻译)\n     * 举例： @Excel(name = \"性别\", width = 15, dicCode = \"sex\")\n     * 1、导出的时候会根据字典配置，把值1,2翻译成：男、女;\n     * 2、导入的时候，会把男、女翻译成1,2存进数据库;\n     * @return\n     */\n    @Bean\n    public ApplicationContextUtil applicationContextUtil() {\n        return new org.jeecgframework.core.util.ApplicationContextUtil();\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/AutoPoiDictConfig.java",
    "content": "package org.jeecg.config;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport jakarta.annotation.Resource;\n\nimport org.jeecg.common.api.CommonAPI;\nimport org.jeecg.common.system.vo.DictModel;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecgframework.dict.service.AutoPoiDictServiceI;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.stereotype.Service;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * 描述：AutoPoi Excel注解支持字典参数设置\n *  举例： @Excel(name = \"性别\", width = 15, dicCode = \"sex\")\n * 1、导出的时候会根据字典配置，把值1,2翻译成：男、女;\n * 2、导入的时候，会把男、女翻译成1,2存进数据库;\n * \n * @Author:scott \n * @since：2019-04-09 \n * @Version:1.0\n */\n@Slf4j\n@Lazy(false)\n@Service\npublic class AutoPoiDictConfig implements AutoPoiDictServiceI {\n\tfinal static String EXCEL_SPLIT_TAG = \"_\";\n\tfinal static String TEMP_EXCEL_SPLIT_TAG = \"---\";\n\n\t@Lazy\n\t@Resource\n\tprivate CommonAPI commonApi;\n\n\t/**\n\t * 通过字典查询easypoi，所需字典文本\n\t * \n\t * @Author:scott \n\t * @since：2019-04-09\n\t * @return\n\t */\n\t@Override\n\tpublic String[] queryDict(String dicTable, String dicCode, String dicText) {\n\t\tList<String> dictReplaces = new ArrayList<String>();\n\t\tList<DictModel> dictList = null;\n\t\t// step.1 如果没有字典表则使用系统字典表\n\t\tif (oConvertUtils.isEmpty(dicTable)) {\n\t\t\tdictList = commonApi.queryDictItemsByCode(dicCode);\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tdicText = oConvertUtils.getString(dicText, dicCode);\n\t\t\t\tdictList = commonApi.queryTableDictItemsByCode(dicTable, dicText, dicCode);\n\t\t\t} catch (Exception e) {\n\t\t\t\tlog.error(e.getMessage(),e);\n\t\t\t}\n\t\t}\n\n\n\t\tfor (DictModel t : dictList) {\n\t\t\t// 代码逻辑说明: [issues/4917]excel 导出异常---\n\t\t\tif(t!=null && t.getText()!=null && t.getValue()!=null){\n\t\t\t\t// 代码逻辑说明: [issues/I4MBB3]@Excel dicText字段的值有下划线时，导入功能不能正确解析---\n\t\t\t\tif(t.getValue().contains(EXCEL_SPLIT_TAG)){\n\t\t\t\t\tString val = t.getValue().replace(EXCEL_SPLIT_TAG,TEMP_EXCEL_SPLIT_TAG);\n\t\t\t\t\tdictReplaces.add(t.getText() + EXCEL_SPLIT_TAG + val);\n\t\t\t\t}else{\n\t\t\t\t\tdictReplaces.add(t.getText() + EXCEL_SPLIT_TAG + t.getValue());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (dictReplaces != null && dictReplaces.size() != 0) {\n\t\t\tlog.info(\"---AutoPoi--Get_DB_Dict------\"+ dictReplaces.toString());\n\t\t\treturn dictReplaces.toArray(new String[dictReplaces.size()]);\n\t\t}\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/CorsFilterCondition.java",
    "content": "package org.jeecg.config;\n\nimport org.jeecg.common.constant.CommonConstant;\nimport org.springframework.context.annotation.Condition;\nimport org.springframework.context.annotation.ConditionContext;\nimport org.springframework.core.type.AnnotatedTypeMetadata;\n\n/**\n * 跨域配置加载条件\n * @author: jeecg-boot\n */\npublic class CorsFilterCondition implements Condition {\n\n    @Override\n    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {\n        Object object = context.getEnvironment().getProperty(CommonConstant.CLOUD_SERVER_KEY);\n        //如果没有服务注册发现的配置 说明是单体应用 则加载跨域配置 返回true\n        if(object==null){\n            return true;\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidConfig.java",
    "content": "package org.jeecg.config;\n\nimport java.io.IOException;\n\nimport com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure;\nimport com.alibaba.druid.spring.boot3.autoconfigure.properties.DruidStatProperties;\nimport jakarta.servlet.*;\n\nimport org.springframework.boot.autoconfigure.AutoConfigureAfter;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;\nimport org.springframework.boot.web.servlet.FilterRegistrationBean;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport com.alibaba.druid.util.Utils;\n\n/**\n * @Description: DruidConfig配置类\n * @author: jeecg-boot\n */\n@Configuration\n@AutoConfigureAfter(DruidDataSourceAutoConfigure.class)\npublic class DruidConfig {\n\n    /**\n     * 带有广告的common.js全路径，druid-1.1.14\n     */\n    private static final String FILE_PATH = \"support/http/resources/js/common.js\";\n    /**\n     * 原始脚本，触发构建广告的语句\n     */\n    private static final String ORIGIN_JS = \"this.buildFooter();\";\n    /**\n     * 替换后的脚本\n     */\n    private static final String NEW_JS = \"//this.buildFooter();\";\n\n    /**\n     * 去除Druid监控页面的广告\n     *\n     * @param properties DruidStatProperties属性集合\n     * @return {@link FilterRegistrationBean}\n     */\n    @Bean\n    @ConditionalOnWebApplication\n    @ConditionalOnProperty(name = \"spring.datasource.druid.stat-view-servlet.enabled\", havingValue = \"true\")\n    public FilterRegistrationBean<RemoveAdFilter> removeDruidAdFilter(\n            DruidStatProperties properties) throws IOException {\n        // 获取web监控页面的参数\n        DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();\n        // 提取common.js的配置路径\n        String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : \"/druid/*\";\n        String commonJsPattern = pattern.replaceAll(\"\\\\*\", \"js/common.js\");\n        // 获取common.js\n        String text = Utils.readFromResource(FILE_PATH);\n        // 屏蔽 this.buildFooter(); 不构建广告\n        final String newJs = text.replace(ORIGIN_JS, NEW_JS);\n        FilterRegistrationBean<RemoveAdFilter> registration = new FilterRegistrationBean<>();\n        registration.setFilter(new RemoveAdFilter(newJs));\n        registration.addUrlPatterns(commonJsPattern);\n        return registration;\n    }\n\n    /**\n     * 删除druid的广告过滤器\n     *\n     * @author BBF\n     */\n    private class RemoveAdFilter implements Filter {\n\n        private final String newJs;\n\n        public RemoveAdFilter(String newJs) {\n            this.newJs = newJs;\n        }\n\n        @Override\n        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)\n                throws IOException, ServletException {\n            chain.doFilter(request, response);\n            // 重置缓冲区，响应头不会被重置\n            response.resetBuffer();\n            response.getWriter().write(newJs);\n        }\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/DruidWallConfigRegister.java",
    "content": "package org.jeecg.config;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.SpringApplicationRunListener;\nimport org.springframework.context.ConfigurableApplicationContext;\nimport org.springframework.core.env.ConfigurableEnvironment;\nimport org.springframework.core.env.MapPropertySource;\nimport org.springframework.core.env.MutablePropertySources;\nimport org.springframework.core.env.PropertySource;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * 启动程序修改DruidWallConfig配置\n * 允许SELECT语句的WHERE子句是一个永真条件\n * @author eightmonth\n * @date 2024/4/8 11:37\n */\npublic class DruidWallConfigRegister implements SpringApplicationRunListener {\n\n    public SpringApplication application;\n\n    private String[] args;\n\n\n    /**\n     * 必备，否则启动报错\n     * @param application\n     * @param args\n     */\n    public DruidWallConfigRegister(SpringApplication application, String[] args) {\n        this.application = application;\n        this.args = args;\n    }\n\n    @Override\n    public void contextLoaded(ConfigurableApplicationContext context) {\n        ConfigurableEnvironment env = context.getEnvironment();\n        Map<String, Object> props = new HashMap<>();\n        props.put(\"spring.datasource.dynamic.druid.wall.selectWhereAlwayTrueCheck\", false);\n\n        MutablePropertySources propertySources = env.getPropertySources();\n\n        PropertySource<Map<String, Object>> propertySource = new MapPropertySource(\"jeecg-datasource-config\", props);\n\n        propertySources.addLast(propertySource);\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/JeecgBaseConfig.java",
    "content": "package org.jeecg.config;\n\nimport lombok.Getter;\nimport lombok.Setter;\nimport org.jeecg.config.tencent.JeecgTencent;\nimport org.jeecg.config.vo.*;\nimport org.springframework.beans.factory.config.BeanDefinition;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.context.annotation.Role;\nimport org.springframework.stereotype.Component;\n\n\n/**\n * 加载项目配置\n * @author: jeecg-boot\n */\n@Component(\"jeecgBaseConfig\")\n@ConfigurationProperties(prefix = \"jeecg\")\n@Role(BeanDefinition.ROLE_INFRASTRUCTURE)\npublic class JeecgBaseConfig {\n    /**\n     * 签名密钥串(字典等敏感接口)\n     * @TODO 降低使用成本加的默认值,实际以 yml配置 为准\n     */\n    private String signatureSecret = \"dd05f1c54d63749eda95f9fa6d49v442a\";\n    /**\n     * 自定义后台资源前缀，解决表单设计器无法通过前端nginx转发访问\n     */\n    private String customResourcePrefixPath;\n    /**\n     * 需要加强校验的接口清单\n     */\n    private String signUrls;\n    /**\n     * 上传模式  \n     * 本地：local\\Minio：minio\\阿里云：alioss\n     */\n    private String uploadType;\n    \n    /**\n     * 平台安全模式配置\n     */\n    private Firewall firewall;\n    \n    /**\n     * shiro拦截排除\n     */\n    private Shiro shiro;\n    /**\n     * 上传文件配置\n     */\n    private Path path;\n\n    /**\n     * 前端页面访问地址\n     * pc: http://localhost:3100\n     * app: http://localhost:8051\n     */\n    private DomainUrl domainUrl;\n\n    /**\n     * 文件预览\n     */\n    private String fileViewDomain;\n     /**\n     * ES配置\n     */\n    private Elasticsearch elasticsearch;\n\n    /**\n     * 微信支付\n     * @return\n     */\n    private WeiXinPay weiXinPay;\n\n    /**\n     * 百度开放API配置\n     */\n    private BaiduApi baiduApi;\n\n    /**\n     * minio配置\n     */\n    @Getter\n    @Setter\n    private JeecgMinio minio;\n\n    /**\n     * oss配置\n     */\n    @Getter\n    @Setter\n    private JeecgOSS oss;\n\n    /**\n     * 短信发送方式 aliyun阿里云短信 tencent腾讯云短信\n     */\n    @Getter\n    @Setter\n    private String smsSendType = \"aliyun\";\n    \n    /**\n     * 腾讯配置\n     */\n    @Getter\n    @Setter\n    private JeecgTencent tencent;\n\n    public String getCustomResourcePrefixPath() {\n        return customResourcePrefixPath;\n    }\n\n    public void setCustomResourcePrefixPath(String customResourcePrefixPath) {\n        this.customResourcePrefixPath = customResourcePrefixPath;\n    }\n\n    public Elasticsearch getElasticsearch() {\n        return elasticsearch;\n    }\n\n    public void setElasticsearch(Elasticsearch elasticsearch) {\n        this.elasticsearch = elasticsearch;\n    }\n\n    public Firewall getFirewall() {\n        return firewall;\n    }\n\n    public void setFirewall(Firewall firewall) {\n        this.firewall = firewall;\n    }\n\n    public String getSignatureSecret() {\n        return signatureSecret;\n    }\n\n    public void setSignatureSecret(String signatureSecret) {\n        this.signatureSecret = signatureSecret;\n    }\n\n    public Shiro getShiro() {\n        return shiro;\n    }\n\n    public void setShiro(Shiro shiro) {\n        this.shiro = shiro;\n    }\n\n    public Path getPath() {\n        return path;\n    }\n\n    public void setPath(Path path) {\n        this.path = path;\n    }\n\n    public DomainUrl getDomainUrl() {\n        return domainUrl;\n    }\n\n    public void setDomainUrl(DomainUrl domainUrl) {\n        this.domainUrl = domainUrl;\n    }\n    public String getSignUrls() {\n        return signUrls;\n    }\n\n    public void setSignUrls(String signUrls) {\n        this.signUrls = signUrls;\n    }\n\n\n    public String getFileViewDomain() {\n        return fileViewDomain;\n    }\n\n    public void setFileViewDomain(String fileViewDomain) {\n        this.fileViewDomain = fileViewDomain;\n    }\n\n    public String getUploadType() {\n        return uploadType;\n    }\n\n    public void setUploadType(String uploadType) {\n        this.uploadType = uploadType;\n    }\n\n    public WeiXinPay getWeiXinPay() {\n        return weiXinPay;\n    }\n\n    public void setWeiXinPay(WeiXinPay weiXinPay) {\n        this.weiXinPay = weiXinPay;\n    }\n\n    public BaiduApi getBaiduApi() {\n        return baiduApi;\n    }\n\n    public void setBaiduApi(BaiduApi baiduApi) {\n        this.baiduApi = baiduApi;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/JeecgCloudCondition.java",
    "content": "package org.jeecg.config;\n\nimport org.jeecg.common.constant.CommonConstant;\nimport org.springframework.context.annotation.Condition;\nimport org.springframework.context.annotation.ConditionContext;\nimport org.springframework.core.type.AnnotatedTypeMetadata;\n\n/**\n * 微服务环境加载条件\n * @author: jeecg-boot\n */\npublic class JeecgCloudCondition implements Condition {\n\n    @Override\n    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {\n        Object object = context.getEnvironment().getProperty(CommonConstant.CLOUD_SERVER_KEY);\n        //如果没有服务注册发现的配置 说明是单体应用\n        if(object==null){\n            return false;\n        }\n        return true;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/JeecgGaodeBaseConfig.java",
    "content": "package org.jeecg.config;\n\nimport org.jeecg.config.vo.GaoDeApi;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Lazy;\n\n/**\n * 高德账号配置\n */\n@Lazy(false)\n@Configuration(\"jeecgGaodeBaseConfig\")\n@ConfigurationProperties(prefix = \"jeecg.jmreport\")\npublic class JeecgGaodeBaseConfig {\n\n    /**\n     * 高德开放API配置\n     */\n    private GaoDeApi gaoDeApi;\n\n    public GaoDeApi getGaoDeApi() {\n        return gaoDeApi;\n    }\n\n    public void setGaoDeApi(GaoDeApi gaoDeApi) {\n        this.gaoDeApi = gaoDeApi;\n    }\n    \n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/JeecgSmsTemplateConfig.java",
    "content": "package org.jeecg.config;\n\nimport lombok.Data;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Map;\n\n/**\n* @Description: 短信模板\n*\n* @author: wangshuai\n* @date: 2024/11/5 下午3:44\n*/\n@Data\n@Component(\"jeecgSmsTemplateConfig\")\n@ConfigurationProperties(prefix = \"jeecg.oss.sms-template\")\npublic class JeecgSmsTemplateConfig {\n\n    /**\n     * 短信签名\n     */\n    private String signature;\n\n\n    /**\n     * 短信模板code\n     *\n     * @return\n     */\n    private Map<String,String> templateCode;\n    \n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/RestTemplateConfig.java",
    "content": "package org.jeecg.config;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.http.client.ClientHttpRequestFactory;\nimport org.springframework.http.client.SimpleClientHttpRequestFactory;\nimport org.springframework.web.client.RestTemplate;\n\n/**\n* 优雅的http请求方式RestTemplate\n* @author: jeecg-boot\n* @Return:\n*/\n@Configuration\npublic class RestTemplateConfig {\n\n    @Bean\n    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {\n        return new RestTemplate(factory);\n    }\n\n    @Bean\n    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {\n        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();\n        //ms毫秒\n        factory.setReadTimeout(5000);\n        //ms毫秒\n        factory.setConnectTimeout(15000);\n        return factory;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/StaticConfig.java",
    "content": "package org.jeecg.config;\n\nimport lombok.Data;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.stereotype.Component;\n\n/**\n * 设置静态参数初始化\n * @author: jeecg-boot\n */\n@Lazy(false)\n@Component\n@Data\npublic class StaticConfig {\n\n    @Value(\"${jeecg.oss.accessKey:}\")\n    private String accessKeyId;\n\n    @Value(\"${jeecg.oss.secretKey:}\")\n    private String accessKeySecret;\n\n    @Value(value = \"${spring.mail.username:}\")\n    private String emailFrom;\n\n    /**\n     * 是否开启定时发送\n     */\n    @Value(value = \"${spring.mail.timeJobSend:false}\")\n    private Boolean timeJobSend;\n\n//    /**\n//     * 签名密钥串\n//     */\n//    @Value(value = \"${jeecg.signatureSecret}\")\n//    private String signatureSecret;\n\n\n    /*@Bean\n    public void initStatic() {\n       DySmsHelper.setAccessKeyId(accessKeyId);\n       DySmsHelper.setAccessKeySecret(accessKeySecret);\n       EmailSendMsgHandle.setEmailFrom(emailFrom);\n    }*/\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger2Config.java",
    "content": "//package org.jeecg.config;\n//\n//\n//import io.swagger.v3.oas.annotations.Operation;\n//import org.jeecg.common.constant.CommonConstant;\n//import org.jeecg.config.mybatis.MybatisPlusSaasConfig;\n//import org.springframework.beans.BeansException;\n//import org.springframework.beans.factory.config.BeanPostProcessor;\n//import org.springframework.context.annotation.Bean;\n//import org.springframework.context.annotation.Configuration;\n//import org.springframework.context.annotation.Import;\n//import org.springframework.util.ReflectionUtils;\n//import org.springframework.web.bind.annotation.RestController;\n//import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;\n//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\n//import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;\n//import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;\n//import springfox.documentation.builders.ApiInfoBuilder;\n//import springfox.documentation.builders.ParameterBuilder;\n//import springfox.documentation.builders.PathSelectors;\n//import springfox.documentation.builders.RequestHandlerSelectors;\n//import springfox.documentation.schema.ModelRef;\n//import springfox.documentation.service.*;\n//import springfox.documentation.spi.DocumentationType;\n//import springfox.documentation.spi.service.contexts.SecurityContext;\n//import springfox.documentation.spring.web.plugins.Docket;\n//import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;\n//import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;\n//\n//import java.lang.reflect.Field;\n//import java.util.ArrayList;\n//import java.util.Collections;\n//import java.util.List;\n//import java.util.stream.Collectors;\n//\n///**\n// * @Author scott\n// */\n//@Configuration\n//@EnableSwagger2WebMvc\n//@Import(BeanValidatorPluginsConfiguration.class)\n//public class Swagger2Config implements WebMvcConfigurer {\n//\n//    /**\n//     *\n//     * 显示swagger-ui.html文档展示页，还必须注入swagger资源：\n//     *\n//     * @param registry\n//     */\n//    @Override\n//    public void addResourceHandlers(ResourceHandlerRegistry registry) {\n//        registry.addResourceHandler(\"swagger-ui.html\").addResourceLocations(\"classpath:/META-INF/resources/\");\n//        registry.addResourceHandler(\"doc.html\").addResourceLocations(\"classpath:/META-INF/resources/\");\n//        registry.addResourceHandler(\"/webjars/**\").addResourceLocations(\"classpath:/META-INF/resources/webjars/\");\n//    }\n//\n//    /**\n//     * swagger2的配置文件，这里可以配置swagger2的一些基本的内容，比如扫描的包等等\n//     *\n//     * @return Docket\n//     */\n//    @Bean(value = \"defaultApi2\")\n//    public Docket defaultApi2() {\n//        return new Docket(DocumentationType.SWAGGER_2)\n//                .apiInfo(apiInfo())\n//                .select()\n//                //此包路径下的类，才生成接口文档\n//                .apis(RequestHandlerSelectors.basePackage(\"org.jeecg\"))\n//                //加了ApiOperation注解的类，才生成接口文档\n//                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))\n//                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))\n//                .paths(PathSelectors.any())\n//                .build()\n//                .securitySchemes(Collections.singletonList(securityScheme()))\n//                .securityContexts(securityContexts())\n//                .globalOperationParameters(setHeaderToken());\n//    }\n//\n//    /***\n//     * oauth2配置\n//     * 需要增加swagger授权回调地址\n//     * http://localhost:8888/webjars/springfox-swagger-ui/o2c.html\n//     * @return\n//     */\n//    @Bean\n//    SecurityScheme securityScheme() {\n//        return new ApiKey(CommonConstant.X_ACCESS_TOKEN, CommonConstant.X_ACCESS_TOKEN, \"header\");\n//    }\n//    /**\n//     * JWT token\n//     * @return\n//     */\n//    private List<Parameter> setHeaderToken() {\n//        ParameterBuilder tokenPar = new ParameterBuilder();\n//        List<Parameter> pars = new ArrayList<>();\n//        tokenPar.name(CommonConstant.X_ACCESS_TOKEN).description(\"token\").modelRef(new ModelRef(\"string\")).parameterType(\"header\").required(false).build();\n//        pars.add(tokenPar.build());\n//        if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n//            ParameterBuilder tenantPar = new ParameterBuilder();\n//            tenantPar.name(CommonConstant.TENANT_ID).description(\"租户ID\").modelRef(new ModelRef(\"string\")).parameterType(\"header\").required(false).build();\n//            pars.add(tenantPar.build());\n//        }\n//\n//        return pars;\n//    }\n//\n//    /**\n//     * api文档的详细信息函数,注意这里的注解引用的是哪个\n//     *\n//     * @return\n//     */\n//    private ApiInfo apiInfo() {\n//        return new ApiInfoBuilder()\n//                // //大标题\n//                .title(\"JeecgBoot 后台服务API接口文档\")\n//                // 版本号\n//                .version(\"1.0\")\n////\t\t\t\t.termsOfServiceUrl(\"NO terms of service\")\n//                // 描述\n//                .description(\"后台API接口\")\n//                // 作者\n//                .contact(new Contact(\"北京国炬信息技术有限公司\",\"www.jeccg.com\",\"jeecgos@163.com\"))\n//                .license(\"The Apache License, Version 2.0\")\n//                .licenseUrl(\"http://www.apache.org/licenses/LICENSE-2.0.html\")\n//                .build();\n//    }\n//\n//    /**\n//     * 新增 securityContexts 保持登录状态\n//     */\n//    private List<SecurityContext> securityContexts() {\n//        return new ArrayList(\n//                Collections.singleton(SecurityContext.builder()\n//                        .securityReferences(defaultAuth())\n//                        .forPaths(PathSelectors.regex(\"^(?!auth).*$\"))\n//                        .build())\n//        );\n//    }\n//\n//    private List<SecurityReference> defaultAuth() {\n//        AuthorizationScope authorizationScope = new AuthorizationScope(\"global\", \"accessEverything\");\n//        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];\n//        authorizationScopes[0] = authorizationScope;\n//        return new ArrayList(\n//                Collections.singleton(new SecurityReference(CommonConstant.X_ACCESS_TOKEN, authorizationScopes)));\n//    }\n//\n//    /**\n//     * 解决springboot2.6 和springfox不兼容问题\n//     * @return\n//     */\n//    @Bean\n//    public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {\n//        return new BeanPostProcessor() {\n//\n//            @Override\n//            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {\n//                if (bean instanceof WebMvcRequestHandlerProvider) {\n//                    customizeSpringfoxHandlerMappings(getHandlerMappings(bean));\n//                }\n//                return bean;\n//            }\n//\n//            private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {\n//                List<T> copy = mappings.stream()\n//                        .filter(mapping -> mapping.getPatternParser() == null)\n//                        .collect(Collectors.toList());\n//                mappings.clear();\n//                mappings.addAll(copy);\n//            }\n//\n//            @SuppressWarnings(\"unchecked\")\n//            private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {\n//                try {\n//                    Field field = ReflectionUtils.findField(bean.getClass(), \"handlerMappings\");\n//                    field.setAccessible(true);\n//                    return (List<RequestMappingInfoHandlerMapping>) field.get(bean);\n//                } catch (IllegalArgumentException | IllegalAccessException e) {\n//                    throw new IllegalStateException(e);\n//                }\n//            }\n//        };\n//    }\n//\n//\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/Swagger3Config.java",
    "content": "package org.jeecg.config;\n\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.models.Components;\nimport io.swagger.v3.oas.models.OpenAPI;\nimport io.swagger.v3.oas.models.info.Contact;\nimport io.swagger.v3.oas.models.info.Info;\nimport io.swagger.v3.oas.models.info.License;\nimport io.swagger.v3.oas.models.security.SecurityRequirement;\nimport io.swagger.v3.oas.models.security.SecurityScheme;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.springdoc.core.customizers.OperationCustomizer;\nimport org.springdoc.core.filters.GlobalOpenApiMethodFilter;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.PropertySource;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.method.HandlerMethod;\nimport org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\n\nimport java.util.Arrays;\nimport java.util.HashSet;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * @author eightmonth\n */\n@Slf4j\n@Configuration\n@ConditionalOnProperty(prefix = \"knife4j\", name = \"production\", havingValue = \"false\", matchIfMissing = true)\n@PropertySource(\"classpath:config/default-spring-doc.properties\")\npublic class Swagger3Config implements WebMvcConfigurer {\n\n    // 路径匹配结果缓存，避免重复计算\n    private static final Map<String, Boolean> EXCLUDED_PATHS_CACHE = new ConcurrentHashMap<>();\n    // 定义不需要注入安全要求的路径集合\n    private static final Set<String> excludedPaths = new HashSet<>(Arrays.asList(\n            \"/sys/randomImage/**\",\n            \"/sys/login\",\n            \"/sys/phoneLogin\",\n            \"/sys/mLogin\",\n            \"/sys/sms\",\n            \"/sys/cas/client/validateLogin\",\n            \"/test/jeecgDemo/demo3\",\n            \"/sys/thirdLogin/**\",\n            \"/sys/user/register\"\n    ));\n    // 预处理通配符模式，提高匹配效率\n    private static final Set<String> wildcardPatterns = new HashSet<>();\n    private static final Set<String> exactPatterns = new HashSet<>();\n    static {\n        // 初始化时分离精确匹配和通配符匹配\n        for (String pattern : excludedPaths) {\n            if (pattern.endsWith(\"/**\")) {\n                wildcardPatterns.add(pattern.substring(0, pattern.length() - 3));\n            } else {\n                exactPatterns.add(pattern);\n            }\n        }\n    }\n    \n    /**\n     *\n     * 显示swagger-ui.html文档展示页，还必须注入swagger资源：\n     *\n     * @param registry\n     */\n    @Override\n    public void addResourceHandlers(ResourceHandlerRegistry registry) {\n        registry.addResourceHandler(\"swagger-ui.html\").addResourceLocations(\"classpath:/META-INF/resources/\");\n        registry.addResourceHandler(\"doc.html\").addResourceLocations(\"classpath:/META-INF/resources/\");\n        registry.addResourceHandler(\"/webjars/**\").addResourceLocations(\"classpath:/META-INF/resources/webjars/\");\n    }\n\n    @Bean\n    public GlobalOpenApiMethodFilter globalOpenApiMethodFilter() {\n        return method -> method.isAnnotationPresent(Operation.class);\n    }\n\n    @Bean\n    public OperationCustomizer operationCustomizer() {\n        return (operation, handlerMethod) -> {\n            String path = getFullPath(handlerMethod);\n            if (!isExcludedPath(path)) {\n                operation.addSecurityItem(new SecurityRequirement().addList(CommonConstant.X_ACCESS_TOKEN));\n            }else{\n                log.info(\"忽略加入 X_ACCESS_TOKEN 的 PATH:\" + path);\n            }\n            return operation;\n        };\n    }\n\n    private String getFullPath(HandlerMethod handlerMethod) {\n        StringBuilder fullPath = new StringBuilder();\n\n        // 获取类级别的路径\n        RequestMapping classMapping = handlerMethod.getBeanType().getAnnotation(RequestMapping.class);\n        if (classMapping != null && classMapping.value().length > 0) {\n            fullPath.append(classMapping.value()[0]);\n        }\n\n        // 获取方法级别的路径\n        RequestMapping methodMapping = handlerMethod.getMethodAnnotation(RequestMapping.class);\n        if (methodMapping != null && methodMapping.value().length > 0) {\n            String methodPath = methodMapping.value()[0];\n            // 确保路径正确拼接，处理斜杠\n            if (!fullPath.toString().endsWith(\"/\") && !methodPath.startsWith(\"/\")) {\n                fullPath.append(\"/\");\n            }\n            fullPath.append(methodPath);\n        }\n\n        return fullPath.toString();\n    }\n\n\n    private boolean isExcludedPath(String path) {\n        // 使用缓存避免重复计算\n        return EXCLUDED_PATHS_CACHE.computeIfAbsent(path, p -> {\n            // 精确匹配\n            if (exactPatterns.contains(p)) {\n                return true;\n            }\n            // 通配符匹配\n            return wildcardPatterns.stream().anyMatch(p::startsWith);\n        });\n    }\n    \n    @Bean\n    public OpenAPI customOpenAPI() {\n        return new OpenAPI()\n                .info(new Info()\n                        .title(\"JeecgBoot 后台服务API接口文档\")\n                        .version(\"3.9.1\")\n                        .contact(new Contact().name(\"北京国炬信息技术有限公司\").url(\"www.jeccg.com\").email(\"jeecgos@163.com\"))\n                        .description(\"后台API接口\")\n                        .termsOfService(\"NO terms of service\")\n                        .license(new License().name(\"Apache 2.0\").url(\"http://www.apache.org/licenses/LICENSE-2.0.html\")))\n                .addSecurityItem(new SecurityRequirement().addList(CommonConstant.X_ACCESS_TOKEN))\n                .components(new Components().addSecuritySchemes(CommonConstant.X_ACCESS_TOKEN,\n                        new SecurityScheme()\n                                .name(CommonConstant.X_ACCESS_TOKEN)\n                                .type(SecurityScheme.Type.APIKEY)\n                                .in(SecurityScheme.In.HEADER) // 关键：指定为 header\n                ));\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/TaskSchedulerConfig.java",
    "content": "package org.jeecg.config;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;\n\n/**\n * 任务调度器配置\n * 提供 ThreadPoolTaskScheduler Bean 用于 AI RAG 流程调度等功能\n * 仅当容器中不存在 ThreadPoolTaskScheduler 时才创建\n *\n * @author jeecg\n */\n@Slf4j\n@Configuration\npublic class TaskSchedulerConfig {\n\n    @Bean\n    @ConditionalOnMissingBean(ThreadPoolTaskScheduler.class)\n    public ThreadPoolTaskScheduler taskScheduler() {\n        log.info(\"初始化定时任务调度器 ThreadPoolTaskScheduler\");\n\n        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();\n        scheduler.setPoolSize(10);\n        scheduler.setThreadNamePrefix(\"airag-scheduler-\");\n        scheduler.setWaitForTasksToCompleteOnShutdown(true);\n        scheduler.setAwaitTerminationSeconds(60);\n        return scheduler;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebMvcConfiguration.java",
    "content": "package org.jeecg.config;\n\nimport com.fasterxml.jackson.core.JsonGenerator;\nimport com.fasterxml.jackson.databind.DeserializationFeature;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;\nimport com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;\nimport com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;\nimport com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;\nimport com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;\nimport com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;\nimport com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;\nimport io.micrometer.prometheusmetrics.PrometheusMeterRegistry;\nimport jakarta.annotation.PostConstruct;\nimport jakarta.annotation.Resource;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.beans.factory.config.BeanPostProcessor;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Conditional;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.http.CacheControl;\nimport org.springframework.http.converter.HttpMessageConverter;\nimport org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;\nimport org.springframework.web.cors.CorsConfiguration;\nimport org.springframework.web.cors.UrlBasedCorsConfigurationSource;\nimport org.springframework.web.filter.CorsFilter;\nimport org.springframework.web.servlet.config.annotation.ResourceHandlerRegistration;\nimport org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;\nimport org.springframework.web.servlet.config.annotation.ViewControllerRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\n\nimport java.text.SimpleDateFormat;\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.time.LocalTime;\nimport java.time.format.DateTimeFormatter;\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Spring Boot 2.0 解决跨域问题\n *\n * @Author qinfeng\n *\n */\n@Slf4j\n@Configuration\npublic class WebMvcConfiguration implements WebMvcConfigurer {\n\n    @Resource\n    JeecgBaseConfig jeecgBaseConfig;\n    @Value(\"${spring.resource.static-locations:}\")\n    private String staticLocations;\n\n    @Autowired(required = false)\n    private PrometheusMeterRegistry prometheusMeterRegistry;\n\n    /**\n     * meterRegistryPostProcessor\n     * for [QQYUN-12558]【监控】系统监控的头两个tab不好使，接口404\n     */\n    @Autowired(required = false)\n    @Qualifier(\"meterRegistryPostProcessor\")\n    private BeanPostProcessor meterRegistryPostProcessor;\n\n    /**\n     * 静态资源的配置 - 使得可以从磁盘中读取 Html、图片、视频、音频等\n     */\n    @Override\n    public void addResourceHandlers(ResourceHandlerRegistry registry) {\n        ResourceHandlerRegistration resourceHandlerRegistration = registry.addResourceHandler(\"/**\");\n        if (jeecgBaseConfig.getPath() != null && jeecgBaseConfig.getPath().getUpload() != null) {\n            resourceHandlerRegistration\n                    .addResourceLocations(\"file:\" + jeecgBaseConfig.getPath().getUpload() + \"//\")\n                    .addResourceLocations(\"file:\" + jeecgBaseConfig.getPath().getWebapp() + \"//\");\n        }\n        resourceHandlerRegistration.addResourceLocations(staticLocations.split(\",\"));\n        // 设置缓存控制标头 Cache-Control有效期为30天\n        resourceHandlerRegistration.setCacheControl(CacheControl.maxAge(30, TimeUnit.DAYS));\n    }\n\n    /**\n     * 方案一： 默认访问根路径跳转 doc.html页面 （swagger文档页面）\n     * 方案二： 访问根路径改成跳转 index.html页面 （简化部署方案： 可以把前端打包直接放到项目的 webapp，上面的配置）\n     */\n    @Override\n    public void addViewControllers(ViewControllerRegistry registry) {\n        registry.addViewController(\"/\").setViewName(\"redirect:/doc.html\");\n    }\n\n    @Bean\n    @Conditional(CorsFilterCondition.class)\n    public CorsFilter corsFilter() {\n        final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();\n        final CorsConfiguration corsConfiguration = new CorsConfiguration();\n        //是否允许请求带有验证信息\n        corsConfiguration.setAllowCredentials(true);\n        // 允许访问的客户端域名\n        corsConfiguration.addAllowedOriginPattern(\"*\");\n        // 允许服务端访问的客户端请求头\n        corsConfiguration.addAllowedHeader(\"*\");\n        // 允许访问的方法名,GET POST等\n        corsConfiguration.addAllowedMethod(\"*\");\n        urlBasedCorsConfigurationSource.registerCorsConfiguration(\"/**\", corsConfiguration);\n        return new CorsFilter(urlBasedCorsConfigurationSource);\n    }\n    @Override\n    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {\n        MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(objectMapper());\n        converters.add(jackson2HttpMessageConverter);\n    }\n\n    /**\n     * 自定义ObjectMapper\n     */\n    @Bean\n    @Primary\n    public ObjectMapper objectMapper() {\n        ObjectMapper objectMapper = new ObjectMapper();\n        //处理bigDecimal\n        objectMapper.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);\n        objectMapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);\n        //处理失败\n        objectMapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);\n        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);\n        objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);\n        objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_CREATOR_PROPERTIES, false);\n        //默认的处理日期时间格式\n        objectMapper.setDateFormat(new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\"));\n        JavaTimeModule javaTimeModule = new JavaTimeModule();\n        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\")));\n        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(\"yyyy-MM-dd\")));\n        javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(\"HH:mm:ss\")));\n        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\")));\n        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(\"yyyy-MM-dd\")));\n        javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(\"HH:mm:ss\")));\n        objectMapper.registerModule(javaTimeModule);\n        return objectMapper;\n    }\n\n//    /**\n//     * SpringBootAdmin的Httptrace不见了\n//     * https://blog.csdn.net/u013810234/article/details/110097201\n//     */\n//    @Bean\n//    public InMemoryHttpTraceRepository getInMemoryHttpTrace(){\n//        return new InMemoryHttpTraceRepository();\n//    }\n\n\n    /**\n     * 在Bean初始化完成后立即配置PrometheusMeterRegistry，避免在Meter注册后才配置MeterFilter\n     * for [QQYUN-12558]【监控】系统监控的头两个tab不好使，接口404\n     * @author chenrui\n     * @date 2025/5/26 16:46\n     */\n    @PostConstruct\n    public void initPrometheusMeterRegistry() {\n        // 确保在应用启动早期就配置MeterFilter，避免警告\n        if (null != meterRegistryPostProcessor && null != prometheusMeterRegistry) {\n            meterRegistryPostProcessor.postProcessAfterInitialization(prometheusMeterRegistry, \"prometheusMeterRegistry\");\n            log.info(\"PrometheusMeterRegistry 配置完成\");\n        }\n    }\n\n//    /**\n//     * 注册拦截器【拦截器拦截参数，自动切换数据源——后期实现多租户切换数据源功能】\n//     * @param registry\n//     */\n//    @Override\n//    public void addInterceptors(InterceptorRegistry registry) {\n//        registry.addInterceptor(new DynamicDatasourceInterceptor()).addPathPatterns(\"/test/dynamic/**\");\n//    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java",
    "content": "package org.jeecg.config;\n\nimport org.jeecg.config.filter.WebsocketFilter;\nimport org.springframework.boot.web.servlet.FilterRegistrationBean;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.web.socket.server.standard.ServerEndpointExporter;\n\n/**\n * @Description: WebSocketConfig\n * @author: jeecg-boot\n */\n@Configuration\npublic class WebSocketConfig {\n    /**\n     * \t注入ServerEndpointExporter，\n     * \t这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint\n     */\n    @Bean\n    public ServerEndpointExporter serverEndpointExporter() {\n        return new ServerEndpointExporter();\n    }\n\n    @Bean\n    public WebsocketFilter websocketFilter(){\n        return new WebsocketFilter();\n    }\n\n    @Bean\n    public FilterRegistrationBean getFilterRegistrationBean(){\n        FilterRegistrationBean bean = new FilterRegistrationBean();\n        bean.setFilter(websocketFilter());\n        //TODO 临时注释掉，测试下线上socket总断的问题\n        bean.addUrlPatterns(\"/taskCountSocket/*\", \"/websocket/*\",\"/eoaSocket/*\",\"/eoaNewChatSocket/*\", \"/newsWebsocket/*\", \"/dragChannelSocket/*\", \"/vxeSocket/*\");\n        return bean;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/filter/RequestBodyReserveFilter.java",
    "content": "package org.jeecg.config.filter;\n\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.config.sign.util.BodyReaderHttpServletRequestWrapper;\n\nimport jakarta.servlet.*;\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.io.IOException;\n\n/**\n * 针对post请求，将HttpServletRequest包一层 保留body里的参数\n * @Author taoYan\n * @Date 2022/4/25 19:19\n **/\npublic class RequestBodyReserveFilter implements Filter {\n\n    @Override\n    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {\n        ServletRequest requestWrapper = null;\n\n        if(servletRequest instanceof HttpServletRequest) {\n            HttpServletRequest req = (HttpServletRequest) servletRequest;\n            // POST请求类型，才获取POST请求体\n            if(CommonConstant.HTTP_POST.equals(req.getMethod())){\n                requestWrapper = new BodyReaderHttpServletRequestWrapper(req);\n            }\n        }\n\n        if(requestWrapper == null) {\n            filterChain.doFilter(servletRequest, servletResponse);\n        } else {\n            filterChain.doFilter(requestWrapper, servletResponse);\n        }\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/filter/WebsocketFilter.java",
    "content": "package org.jeecg.config.filter;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.CommonAPI;\nimport org.jeecg.common.util.RedisUtil;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.TokenUtils;\nimport org.jeecg.common.util.oConvertUtils;\n\nimport jakarta.servlet.*;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\n\n/**\n * websocket 前端将token放到子协议里传入 与后端建立连接时需要用到http协议，此处用于校验token的有效性\n * @Author taoYan\n * @Date 2022/4/21 17:01\n **/\n@Slf4j\npublic class WebsocketFilter implements Filter {\n\n    private static final String TOKEN_KEY = \"Sec-WebSocket-Protocol\";\n\n    private static CommonAPI commonApi;\n\n    private static RedisUtil redisUtil;\n\n    @Override\n    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {\n        if (commonApi == null) {\n            commonApi = SpringContextUtils.getBean(CommonAPI.class);\n        }\n        if (redisUtil == null) {\n            redisUtil = SpringContextUtils.getBean(RedisUtil.class);\n        }\n        HttpServletRequest request = (HttpServletRequest)servletRequest;\n        String token = request.getHeader(TOKEN_KEY);\n\n        log.debug(\"Websocket连接 Token安全校验，Path = {}，token:{}\", request.getRequestURI(), token);\n\n        try {\n            TokenUtils.verifyToken(token, commonApi, redisUtil);\n        } catch (Exception exception) {\n            //log.error(\"Websocket连接 Token安全校验失败，IP:{}, Token:{}, Path = {}，异常：{}\", oConvertUtils.getIpAddrByRequest(request), token, request.getRequestURI(), exception.getMessage());\n            log.debug(\"Websocket连接 Token安全校验失败，IP:{}, Token:{}, Path = {}，异常：{}\", oConvertUtils.getIpAddrByRequest(request), token, request.getRequestURI(), exception.getMessage());\n            return;\n        }\n        HttpServletResponse response = (HttpServletResponse)servletResponse;\n        response.setHeader(TOKEN_KEY, token);\n        filterChain.doFilter(servletRequest, servletResponse);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/firewall/SqlInjection/IDictTableWhiteListHandler.java",
    "content": "package org.jeecg.config.firewall.SqlInjection;\n\n/**\n * 字典表查询 :: 白名单配置\n *\n * @Author taoYan\n * @Date 2022/3/17 11:21\n **/\npublic interface IDictTableWhiteListHandler {\n\n    /**\n     * 校验【表名】【字段】是否合法允许查询，允许则返回 true\n     *\n     * @param sql\n     * @return\n     */\n    boolean isPassBySql(String sql);\n\n    /**\n     * 校验字典是否通过\n     *\n     * @param dictCodeString 字典表配置\n     * @return\n     */\n    boolean isPassByDict(String dictCodeString);\n\n    boolean isPassByDict(String tableName, String... fields);\n\n    /**\n     * 清空缓存，使更改生效\n     *\n     * @return\n     */\n    boolean clear();\n\n    String getErrorMsg();\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/firewall/SqlInjection/SysDictTableWhite.java",
    "content": "package org.jeecg.config.firewall.SqlInjection;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.util.oConvertUtils;\nimport java.util.HashSet;\nimport java.util.Set;\n\n/**\n * 查询的表的信息\n */\n@Slf4j\npublic class SysDictTableWhite {\n    //表名\n    private String name;\n    //表的别名\n    private String alias;\n    // 字段名集合\n    private Set<String> fields;\n    // 是否查询所有字段\n    private boolean all;\n\n    public SysDictTableWhite() {\n        \n    }\n\n    public SysDictTableWhite(String name, String alias) {\n        this.name = name;\n        this.alias = alias;\n        this.all = false;\n        this.fields = new HashSet<>();\n    }\n\n    public void addField(String field) {\n        this.fields.add(field);\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public Set<String> getFields() {\n        return new HashSet<>(fields);\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public void setFields(Set<String> fields) {\n        this.fields = fields;\n    }\n\n    public String getAlias() {\n        return alias;\n    }\n\n    public void setAlias(String alias) {\n        this.alias = alias;\n    }\n\n    public boolean isAll() {\n        return all;\n    }\n\n    public void setAll(boolean all) {\n        this.all = all;\n    }\n\n    /**\n     * 判断是否有相同字段\n     *\n     * @param fieldControlString\n     * @return\n     */\n    public boolean isAllFieldsValid(String fieldControlString) {\n        //如果白名单中没有配置字段，则返回false\n        String[] controlFields = fieldControlString.split(\",\");\n        if (oConvertUtils.isEmpty(fieldControlString)) {\n            return false;\n        }\n\n        for (String queryField : fields) {\n            if (oConvertUtils.isIn(queryField, controlFields)) {\n                log.warn(\"字典表白名单校验，表【\" + name + \"】中字段【\" + queryField + \"】无权限查询\");\n                return false;\n            }\n        }\n\n        return true;\n    }\n    \n\n    @Override\n    public String toString() {\n        return \"QueryTable{\" +\n                \"name='\" + name + '\\'' +\n                \", alias='\" + alias + '\\'' +\n                \", fields=\" + fields +\n                \", all=\" + all +\n                '}';\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/firewall/interceptor/LowCodeModeConfiguration.java",
    "content": "package org.jeecg.config.firewall.interceptor;\n\nimport org.jeecg.config.firewall.interceptor.enums.LowCodeUrlsEnum;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.web.servlet.config.annotation.InterceptorRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\n\n@Configuration\npublic class LowCodeModeConfiguration implements WebMvcConfigurer {\n\n    private final LowCodeModeInterceptor lowCodeModeInterceptor;\n\n    public LowCodeModeConfiguration(LowCodeModeInterceptor lowCodeModeInterceptor) {\n        this.lowCodeModeInterceptor = lowCodeModeInterceptor;\n    }\n\n    @Override\n    public void addInterceptors(InterceptorRegistry registry) {\n        registry.addInterceptor(lowCodeModeInterceptor).addPathPatterns(LowCodeUrlsEnum.getLowCodeInterceptUrls());\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/firewall/interceptor/LowCodeModeInterceptor.java",
    "content": "package org.jeecg.config.firewall.interceptor;\n\nimport com.alibaba.fastjson.JSON;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.api.CommonAPI;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.CommonUtils;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.servlet.HandlerInterceptor;\n\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.io.PrintWriter;\nimport java.util.Set;\n\n/**\n * 低代码模式（dev:开发模式，prod:发布模式——关闭所有在线开发配置能力）\n * <p>\n * prod开启后会关闭以下功能，只保留功能测试（拥有admin角色账号，可以使用配置能力）\n * 1.online表单的所有配置功能，代码生成和导入表功能\n * 2.online报表的所有配置功能，和sql解析\n * 3.online图表的所有配置功能，和sql解析\n * 4.仪表盘的在线配置功能，和sql解析\n * 5.大屏的在线配置功能，和sql解析\n * \n * 积木的逻辑单独处理\n * 1.积木报表的在线配置功能，和sql解析\n *\n * @author qinfeng\n * @date 20230904\n */\n@Slf4j\n@Component\npublic class LowCodeModeInterceptor implements HandlerInterceptor {\n    /**\n     * 低代码开发模式\n     */\n    public static final String LOW_CODE_MODE_DEV = \"dev\";\n    public static final String LOW_CODE_MODE_PROD = \"prod\";\n\n    @Resource\n    private JeecgBaseConfig jeecgBaseConfig;\n    \n    /**\n     * 在请求处理之前进行调用\n     */\n    @Override\n    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {\n        CommonAPI commonAPI = null;\n        log.info(\"低代码模式，拦截请求路径：\" + request.getRequestURI());\n        \n        //1、验证是否开启低代码开发模式控制\n        if (jeecgBaseConfig == null) {\n            jeecgBaseConfig = SpringContextUtils.getBean(JeecgBaseConfig.class);\n        }\n        if (commonAPI == null) {\n            commonAPI = SpringContextUtils.getBean(CommonAPI.class);\n        }\n\n        if (jeecgBaseConfig.getFirewall()!=null && LowCodeModeInterceptor.LOW_CODE_MODE_PROD.equals(jeecgBaseConfig.getFirewall().getLowCodeMode())) {\n            String requestURI = request.getRequestURI().substring(request.getContextPath().length());\n            log.info(\"低代码模式，拦截请求路径：\" + requestURI);\n            LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n            Set<String> hasRoles = null;\n            if (loginUser == null) {\n                loginUser = commonAPI.getUserByName(JwtUtil.getUserNameByToken(SpringContextUtils.getHttpServletRequest()));\n            }\n\n            if (loginUser != null) {\n                //当前登录人拥有的角色\n                hasRoles = commonAPI.queryUserRolesById(loginUser.getId());\n            }\n            \n            log.info(\"get loginUser info: {}\", loginUser);\n            log.info(\"get loginRoles info: {}\", hasRoles != null ? hasRoles.toArray() : \"空\");\n            \n            //拥有的角色 和 允许开发角色存在交集\n            boolean hasIntersection = CommonUtils.hasIntersection(hasRoles, CommonConstant.allowDevRoles);\n            //如果是超级管理员 或者 允许开发的角色，则不做限制\n            if (loginUser!=null && (\"admin\".equals(loginUser.getUsername()) || hasIntersection)) {\n                return true;\n            }\n            \n            this.returnErrorMessage(response);\n            return false;\n        }\n        return true;\n    }\n\n\n    /**\n     * 返回结果\n     *\n     * @param response\n     */\n    private void returnErrorMessage(HttpServletResponse response) {\n        //校验失败返回前端\n        response.setCharacterEncoding(\"UTF-8\");\n        response.setContentType(\"application/json; charset=utf-8\");\n        PrintWriter out = null;\n        try {\n            out = response.getWriter();\n            Result<?> result = Result.error(\"低代码开发模式为发布模式，不允许使用在线配置！！\");\n            out.print(JSON.toJSON(result));\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n    }\n}\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/firewall/interceptor/enums/LowCodeUrlsEnum.java",
    "content": "package org.jeecg.config.firewall.interceptor.enums;\n\n\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n/**\n * \n * @author: qinfeng\n * @date: 2023/09/04 11:44\n */\npublic enum LowCodeUrlsEnum {\n    /**\n     * online表单配置请求 TODO 增改删\n     */\n    NEW_LOW_APP_ADD_URL(\"/online/cgform/api/addAll\", \"添加online表单\"),\n    NEW_LOW_APP_EDIT_URL(\"/online/cgform/api/editAll\", \"编辑online表单\"),\n    ONLINE_DB_SYNC(\"/online/cgform/api/doDbSynch/**/**\", \"online表单同步数据库\"),\n    ONLINE_DEL_BATCH(\"/online/cgform/head/deleteBatch\", \"online表单批量删除\"),\n    ONLINE_DELETE(\"/online/cgform/head/delete\", \"online表单删除\"),\n    ONLINE_REMOVE(\"/online/cgform/head/removeRecord\", \"online表单移除\"),\n    ONLINE_COPY(\"/online/cgform/head/copyOnline\", \"online表单生成视图\"),\n    ONLINE_TABLE(\"/online/cgform/head/copyOnlineTable\", \"online表单复制表\"),\n    ONLINE_BUTTON_AI_TEST(\"/online/cgform/button/aitest\", \"online表单自定义按钮生成数据\"),\n    ONLINE_BUTTON_ADD(\"/online/cgform/button/add\", \"online表单自定义按钮新增\"),\n    ONLINE_BUTTON_EDIT(\"/online/cgform/button/edit\", \"online表单自定义按钮编辑\"),\n    ONLINE_BUTTON_DEL(\"/online/cgform/button/deleteBatch\", \"online表单自定义按钮删除\"),\n    ONLINE_ENHANCE_JS(\"/online/cgform/head/enhanceJs/**\", \"online表单JS增强\"),\n    ONLINE_ENHANCE_JAVA(\"/online/cgform/head/enhanceJava/**\", \"online表单JAVA增强\"),\n    /**\n     * online报表配置请求\n     */\n    ONLINE_CG_REPORT_ADD(\"/online/cgreport/head/add\", \"online报表新增\"),\n    ONLINE_CG_REPORT_EDIT(\"/online/cgreport/head/editAll\", \"online报表编辑\"),\n    ONLINE_CG_REPORT_DEL(\"/online/cgreport/head/delete\", \"online报表删除\"),\n    ONLINE_CG_REPORT_PARSE_SQL(\"/online/cgreport/head/parseSql\", \"online报表SQL解析\"),\n    /**\n     * online图表配置请求\n     */\n    ONLINE_GRAPH_REPORT_ADD(\"/online/graphreport/head/add\", \"online图表新增\"),\n    ONLINE_GRAPH_REPORT_EDIT(\"/online/graphreport/head/edit\", \"online图表编辑\"),\n    ONLINE_GRAPH_REPORT_DEL(\"/online/graphreport/head/deleteBatch\", \"online图表删除\"),\n    ONLINE_GRAPH_REPORT_PARSE_SQL(\"/online/cgreport/head/parseSql\", \"online图表解析SQL\"),\n\n    /**\n     * 大屏配置请求\n     */\n    BIG_SCREEN_DB_ADD(\"/bigscreen/bigScreenDb/add\", \"大屏数据源新增\"),\n    BIG_SCREEN_DB_EDIT(\"/bigscreen/bigScreenDb/edit\", \"大屏数据源编辑\"),\n    BIG_SCREEN_DB_DEL(\"/bigscreen/bigScreenDb/delete\", \"大屏数据源删除\"),\n    BIG_SCREEN_DB_TEST_CONNECTION(\"/bigscreen/bigScreenDb/testConnection\", \"大屏数据源连接测试\"),\n//    BIG_SCREEN_SAVE(\"/bigscreen/visual/save\", \"大屏新增\"),\n//    BIG_SCREEN_EDIT(\"/bigscreen/visual/update\", \"大屏编辑\"),\n//    BIG_SCREEN_COPY(\"/bigscreen/visual/copy\", \"大屏复制\"),\n//    BIG_SCREEN_REMOVE(\"/bigscreen/visual/remove\", \"大屏移除\"),\n//    BIG_SCREEN_DEL(\"/bigscreen/visual/deleteById\", \"大屏删除\"),\n\n    /**\n     * 仪表盘配置请求\n     */\n    DRAG_DB_ADD(\"/drag/onlDragDataSource/add\", \"仪表盘数据源新增\"),\n    DRAG_DB_TEST_CONNECTION(\"/drag/onlDragDataSource/testConnection\", \"仪表盘数据源连接测试\"),\n    DRAG_PARSE_SQL(\"/drag/onlDragDatasetHead/queryFieldBySql\", \"仪表盘数据集SQL解析\"),\n    DRAG_DATASET_ADD(\"/drag/onlDragDatasetHead/add\", \"仪表盘数据集新增\");\n\n    /**\n     * 其他配置请求\n     */\n\n    private String url;\n    private String title;\n\n    public String getUrl() {\n        return url;\n    }\n\n    public void setUrl(String url) {\n        this.url = url;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\n    }\n\n    LowCodeUrlsEnum(String url, String title) {\n        this.url = url;\n        this.title = title;\n    }\n\n    /**\n     * 根据code获取可用的数量\n     *\n     * @return\n     */\n    public static List<String> getLowCodeInterceptUrls() {\n        return Arrays.stream(LowCodeUrlsEnum.values()).map(LowCodeUrlsEnum::getUrl).collect(Collectors.toList());\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/JeecgTenantParser.java",
    "content": "//package org.jeecg.config.mybatis;\n//\n//import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser;\n//import net.sf.jsqlparser.expression.BinaryExpression;\n//import net.sf.jsqlparser.expression.Expression;\n//import net.sf.jsqlparser.expression.Parenthesis;\n//import net.sf.jsqlparser.expression.operators.conditional.AndExpression;\n//import net.sf.jsqlparser.expression.operators.conditional.OrExpression;\n//import net.sf.jsqlparser.expression.operators.relational.*;\n//import net.sf.jsqlparser.schema.Column;\n//import net.sf.jsqlparser.schema.Table;\n//import net.sf.jsqlparser.statement.select.*;\n//\n//import java.util.List;\n//\n///**\n// * 复写租户条件\n// */\n//public class JeecgTenantParser extends TenantSqlParser {\n//\n//    /**\n//     * @param expression\n//     * @param table\n//     * @return\n//     */\n//    protected Expression processTableAlias(Expression expression, Table table) {\n//        String tableAliasName;\n//        if (table.getAlias() == null) {\n//            tableAliasName = table.getName();\n//        } else {\n//            tableAliasName = table.getAlias().getName();\n//        }\n//\n//        // in\n//        if (expression instanceof InExpression) {\n//            InExpression in = (InExpression) expression;\n//            if (in.getLeftExpression() instanceof Column) {\n//                setTableAliasNameForColumn((Column) in.getLeftExpression(), tableAliasName);\n//            }\n//\n//            // 比较操作\n//        } else if (expression instanceof BinaryExpression) {\n//            BinaryExpression compare = (BinaryExpression) expression;\n//            if (compare.getLeftExpression() instanceof Column) {\n//                setTableAliasNameForColumn((Column) compare.getLeftExpression(), tableAliasName);\n//            } else if (compare.getRightExpression() instanceof Column) {\n//                setTableAliasNameForColumn((Column) compare.getRightExpression(), tableAliasName);\n//            }\n//\n//            // between\n//        } else if (expression instanceof Between) {\n//            Between between = (Between) expression;\n//            if (between.getLeftExpression() instanceof Column) {\n//                setTableAliasNameForColumn((Column) between.getLeftExpression(), tableAliasName);\n//            }\n//        }\n//        return expression;\n//    }\n//\n//    private void setTableAliasNameForColumn(Column column, String tableAliasName) {\n//        column.setColumnName(tableAliasName + \".\" + column.getColumnName());\n//    }\n//\n//    /**\n//     * 默认是按 tenant_id=1 按等于条件追加\n//     *\n//     * @param currentExpression 现有的条件：比如你原来的sql查询条件\n//     * @param table\n//     * @return\n//     */\n//    @Override\n//    protected Expression builderExpression(Expression currentExpression, Table table) {\n//        final Expression tenantExpression = this.getTenantHandler().getTenantId(true);\n//        Expression appendExpression;\n//        if (!(tenantExpression instanceof SupportsOldOracleJoinSyntax)) {\n//            appendExpression = new EqualsTo();\n//            ((EqualsTo) appendExpression).setLeftExpression(this.getAliasColumn(table));\n//            ((EqualsTo) appendExpression).setRightExpression(tenantExpression);\n//        } else {\n//            appendExpression = processTableAlias(tenantExpression, table);\n//        }\n//        if (currentExpression == null) {\n//            return appendExpression;\n//        }\n//        if (currentExpression instanceof BinaryExpression) {\n//            BinaryExpression binaryExpression = (BinaryExpression) currentExpression;\n//            if (binaryExpression.getLeftExpression() instanceof FromItem) {\n//                processFromItem((FromItem) binaryExpression.getLeftExpression());\n//            }\n//            if (binaryExpression.getRightExpression() instanceof FromItem) {\n//                processFromItem((FromItem) binaryExpression.getRightExpression());\n//            }\n//        } else if (currentExpression instanceof InExpression) {\n//            InExpression inExp = (InExpression) currentExpression;\n//            ItemsList rightItems = inExp.getRightItemsList();\n//            if (rightItems instanceof SubSelect) {\n//                processSelectBody(((SubSelect) rightItems).getSelectBody());\n//            }\n//        }\n//        if (currentExpression instanceof OrExpression) {\n//            return new AndExpression(new Parenthesis(currentExpression), appendExpression);\n//        } else {\n//            return new AndExpression(currentExpression, appendExpression);\n//        }\n//    }\n//\n//    @Override\n//    protected void processPlainSelect(PlainSelect plainSelect, boolean addColumn) {\n//        FromItem fromItem = plainSelect.getFromItem();\n//        if (fromItem instanceof Table) {\n//            Table fromTable = (Table) fromItem;\n//            if (!this.getTenantHandler().doTableFilter(fromTable.getName())) {\n//                plainSelect.setWhere(builderExpression(plainSelect.getWhere(), fromTable));\n//                if (addColumn) {\n//                    plainSelect.getSelectItems().add(new SelectExpressionItem(new Column(this.getTenantHandler().getTenantIdColumn())));\n//                }\n//            }\n//        } else {\n//            processFromItem(fromItem);\n//        }\n//        List<Join> joins = plainSelect.getJoins();\n//        if (joins != null && joins.size() > 0) {\n//            joins.forEach(j -> {\n//                processJoin(j);\n//                processFromItem(j.getRightItem());\n//            });\n//        }\n//    }\n//\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java",
    "content": "package org.jeecg.config.mybatis;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.ibatis.binding.MapperMethod.ParamMap;\nimport org.apache.ibatis.executor.Executor;\nimport org.apache.ibatis.mapping.MappedStatement;\nimport org.apache.ibatis.mapping.SqlCommandType;\nimport org.apache.ibatis.plugin.*;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.TenantConstant;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.TokenUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.springframework.stereotype.Component;\n\nimport java.lang.reflect.Field;\nimport java.util.Date;\nimport java.util.Properties;\n\n/**\n * mybatis拦截器，自动注入创建人、创建时间、修改人、修改时间\n * @Author scott\n * @Date  2019-01-19\n *\n */\n@Slf4j\n@Component\n@Intercepts({ @Signature(type = Executor.class, method = \"update\", args = { MappedStatement.class, Object.class }) })\npublic class MybatisInterceptor implements Interceptor {\n\n\t@Override\n\tpublic Object intercept(Invocation invocation) throws Throwable {\n\t\tMappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];\n\t\tString sqlId = mappedStatement.getId();\n\t\tlog.debug(\"------sqlId------\" + sqlId);\n\t\tSqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();\n\t\tObject parameter = invocation.getArgs()[1];\n\t\tlog.debug(\"------sqlCommandType------\" + sqlCommandType);\n\n\t\tif (parameter == null) {\n\t\t\treturn invocation.proceed();\n\t\t}\n\t\tif (SqlCommandType.INSERT == sqlCommandType) {\n\t\t\tLoginUser sysUser = this.getLoginUser();\n\t\t\tField[] fields = oConvertUtils.getAllFields(parameter);\n\t\t\tfor (Field field : fields) {\n\t\t\t\tlog.debug(\"------field.name------\" + field.getName());\n\t\t\t\ttry {\n\t\t\t\t\tif (\"createBy\".equals(field.getName())) {\n\t\t\t\t\t\tfield.setAccessible(true);\n\t\t\t\t\t\tObject localCreateBy = field.get(parameter);\n\t\t\t\t\t\tfield.setAccessible(false);\n\t\t\t\t\t\tif (localCreateBy == null || \"\".equals(localCreateBy)) {\n\t\t\t\t\t\t\tif (sysUser != null) {\n\t\t\t\t\t\t\t\t// 登录人账号\n\t\t\t\t\t\t\t\tfield.setAccessible(true);\n\t\t\t\t\t\t\t\tfield.set(parameter, sysUser.getUsername());\n\t\t\t\t\t\t\t\tfield.setAccessible(false);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// 注入创建时间\n\t\t\t\t\tif (\"createTime\".equals(field.getName())) {\n\t\t\t\t\t\tfield.setAccessible(true);\n\t\t\t\t\t\tObject localCreateDate = field.get(parameter);\n\t\t\t\t\t\tfield.setAccessible(false);\n\t\t\t\t\t\tif (localCreateDate == null || \"\".equals(localCreateDate)) {\n\t\t\t\t\t\t\tfield.setAccessible(true);\n\t\t\t\t\t\t\tfield.set(parameter, new Date());\n\t\t\t\t\t\t\tfield.setAccessible(false);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t//注入部门编码\n\t\t\t\t\tif (\"sysOrgCode\".equals(field.getName())) {\n\t\t\t\t\t\tfield.setAccessible(true);\n\t\t\t\t\t\tObject localSysOrgCode = field.get(parameter);\n\t\t\t\t\t\tfield.setAccessible(false);\n\t\t\t\t\t\tif (localSysOrgCode == null || \"\".equals(localSysOrgCode)) {\n\t\t\t\t\t\t\t// 获取登录用户信息\n\t\t\t\t\t\t\tif (sysUser != null) {\n\t\t\t\t\t\t\t\tfield.setAccessible(true);\n\t\t\t\t\t\t\t\tfield.set(parameter, sysUser.getOrgCode());\n\t\t\t\t\t\t\t\tfield.setAccessible(false);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t//------------------------------------------------------------------------------------------------\n\t\t\t\t\t//注入租户ID（是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】）\n\t\t\t\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n\t\t\t\t\t\tif (TenantConstant.TENANT_ID.equals(field.getName())) {\n\t\t\t\t\t\t\tfield.setAccessible(true);\n\t\t\t\t\t\t\tObject localTenantId = field.get(parameter);\n\t\t\t\t\t\t\tfield.setAccessible(false);\n\t\t\t\t\t\t\tif (localTenantId == null) {\n\t\t\t\t\t\t\t\tfield.setAccessible(true);\n\n\t\t\t\t\t\t\t\tString tenantId = TenantContext.getTenant();\n\t\t\t\t\t\t\t\t//如果通过线程获取租户ID为空，则通过当前请求的request获取租户（shiro排除拦截器的请求会获取不到租户ID）\n\t\t\t\t\t\t\t\tif(oConvertUtils.isEmpty(tenantId) && MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\ttenantId = TokenUtils.getTenantIdByRequest(SpringContextUtils.getHttpServletRequest());\n\t\t\t\t\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\t\t\t\t\t//e.printStackTrace();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (field.getType().equals(String.class)) {\n\t\t\t\t\t\t\t\t\t// 字段类型为String\n\t\t\t\t\t\t\t\t\tfield.set(parameter, tenantId);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// 字段类型不是String\n\t\t\t\t\t\t\t\t\tfield.set(parameter, oConvertUtils.getInt(tenantId, 0));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tfield.setAccessible(false);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t//------------------------------------------------------------------------------------------------\n\t\t\t\t\t\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (SqlCommandType.UPDATE == sqlCommandType) {\n\t\t\tLoginUser sysUser = this.getLoginUser();\n\t\t\tField[] fields = null;\n\t\t\tif (parameter instanceof ParamMap) {\n\t\t\t\tParamMap<?> p = (ParamMap<?>) parameter;\n\t\t\t\t// 代码逻辑说明: 批量更新报错issues/IZA3Q--\n                String et = \"et\";\n\t\t\t\tif (p.containsKey(et)) {\n\t\t\t\t\tparameter = p.get(et);\n\t\t\t\t} else {\n\t\t\t\t\tparameter = p.get(\"param1\");\n\t\t\t\t}\n\n\t\t\t\t// 代码逻辑说明: 更新指定字段时报错 issues/#516-\n\t\t\t\tif (parameter == null) {\n\t\t\t\t\treturn invocation.proceed();\n\t\t\t\t}\n\n\t\t\t\tfields = oConvertUtils.getAllFields(parameter);\n\t\t\t} else {\n\t\t\t\tfields = oConvertUtils.getAllFields(parameter);\n\t\t\t}\n\n\t\t\tfor (Field field : fields) {\n\t\t\t\tlog.debug(\"------field.name------\" + field.getName());\n\t\t\t\ttry {\n\t\t\t\t\tif (\"updateBy\".equals(field.getName())) {\n\t\t\t\t\t\t//获取登录用户信息\n\t\t\t\t\t\tif (sysUser != null) {\n\t\t\t\t\t\t\t// 登录账号\n\t\t\t\t\t\t\tfield.setAccessible(true);\n\t\t\t\t\t\t\tfield.set(parameter, sysUser.getUsername());\n\t\t\t\t\t\t\tfield.setAccessible(false);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (\"updateTime\".equals(field.getName())) {\n\t\t\t\t\t\tfield.setAccessible(true);\n\t\t\t\t\t\tfield.set(parameter, new Date());\n\t\t\t\t\t\tfield.setAccessible(false);\n\t\t\t\t\t}\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn invocation.proceed();\n\t}\n\n\t@Override\n\tpublic Object plugin(Object target) {\n\t\treturn Plugin.wrap(target, this);\n\t}\n\n\t@Override\n\tpublic void setProperties(Properties properties) {\n\t\t// TODO Auto-generated method stub\n\t}\n\n    /**\n     * 获取登录用户\n     * @return\n     */\n\tprivate LoginUser getLoginUser() {\n\t\tLoginUser sysUser = null;\n\t\ttry {\n\t\t\tsysUser = SecurityUtils.getSubject().getPrincipal() != null ? (LoginUser) SecurityUtils.getSubject().getPrincipal() : null;\n\t\t} catch (Exception e) {\n\t\t\t//e.printStackTrace();\n\t\t\tsysUser = null;\n\t\t}\n\t\treturn sysUser;\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java",
    "content": "package org.jeecg.config.mybatis;\n\nimport cn.hutool.core.util.ObjectUtil;\nimport com.baomidou.mybatisplus.annotation.DbType;\nimport com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;\nimport com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;\nimport com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;\nimport com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;\nimport com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;\nimport com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;\nimport com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;\nimport lombok.extern.slf4j.Slf4j;\nimport me.zhyd.oauth.log.Log;\nimport net.sf.jsqlparser.expression.Expression;\nimport net.sf.jsqlparser.expression.LongValue;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.TenantConstant;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.TokenUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport javax.sql.DataSource;\nimport java.sql.SQLException;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * 单数据源配置（jeecg.datasource.open = false时生效）\n * @Author zhoujf\n *\n */\n@Slf4j\n@Configuration\n@MapperScan(value={\"org.jeecg.**.mapper*\"})\npublic class MybatisPlusSaasConfig {\n    @Autowired\n    private DataSource dataSource;\n    \n    /**\n     * 是否开启系统模块的租户隔离\n     *  控制范围：用户、角色、部门、我的部门、字典、分类字典、多数据源、职务、通知公告\n     *  \n     *  实现功能\n     *  1.用户表通过硬编码实现租户ID隔离\n     *  2.角色、部门、我的部门、字典、分类字典、多数据源、职务、通知公告除了硬编码还加入的 TENANT_TABLE 配置中，实现租户隔离更安全\n     *  3.菜单表、租户表不做租户隔离\n     *  4.通过拦截器MybatisInterceptor实现，增删改查数据 自动注入租户ID\n     */\n    public static final Boolean OPEN_SYSTEM_TENANT_CONTROL = false;\n    \n    /**\n     * 哪些表需要做多租户 表需要添加一个字段 tenant_id\n     */\n    public static final List<String> TENANT_TABLE = new ArrayList<String>();\n\n    static {\n        //1.需要租户隔离的表请在此配置\n        if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n            //a.系统管理表\n            //TENANT_TABLE.add(\"sys_role\");\n            //TENANT_TABLE.add(\"sys_user_role\");\n            TENANT_TABLE.add(\"sys_depart\");\n            TENANT_TABLE.add(\"sys_category\");\n            TENANT_TABLE.add(\"sys_data_source\");\n            TENANT_TABLE.add(\"sys_position\");\n            //b-2.仪表盘\n            TENANT_TABLE.add(\"onl_drag_page\");\n            TENANT_TABLE.add(\"onl_drag_dataset_head\");\n            TENANT_TABLE.add(\"jimu_report_data_source\");\n            TENANT_TABLE.add(\"jimu_report\");\n            TENANT_TABLE.add(\"jimu_dict\");\n            //b-4.AIRAG\n            TENANT_TABLE.add(\"airag_app\");\n            TENANT_TABLE.add(\"airag_flow\");\n            TENANT_TABLE.add(\"airag_knowledge\");\n            TENANT_TABLE.add(\"airag_knowledge_doc\");\n            TENANT_TABLE.add(\"airag_model\");\n        }\n\n        //2.示例测试\n        //TENANT_TABLE.add(\"demo\");\n        //3.online租户隔离测试\n        //TENANT_TABLE.add(\"ceapp_issue\");\n    }\n\n\n    @Bean\n    public MybatisPlusInterceptor mybatisPlusInterceptor() {\n        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();\n        // 先 add TenantLineInnerInterceptor 再 add PaginationInnerInterceptor\n        // 条件注册租户拦截器：当需要租户隔离时才添加\n        if (OPEN_SYSTEM_TENANT_CONTROL) {\n            interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {\n                @Override\n                public Expression getTenantId() {\n                    String tenantId = TenantContext.getTenant();\n                    //如果通过线程获取租户ID为空，则通过当前请求的request获取租户（shiro排除拦截器的请求会获取不到租户ID）\n                    if (oConvertUtils.isEmpty(tenantId)) {\n                        try {\n                            tenantId = TokenUtils.getTenantIdByRequest(SpringContextUtils.getHttpServletRequest());\n                        } catch (Exception e) {\n                            //e.printStackTrace();\n                        }\n                    }\n                    if (oConvertUtils.isEmpty(tenantId)) {\n                        tenantId = \"0\";\n                    }\n                    return new LongValue(tenantId);\n                }\n\n                @Override\n                public String getTenantIdColumn() {\n                    return TenantConstant.TENANT_ID_TABLE;\n                }\n\n                // 返回 true 表示不走租户逻辑\n                @Override\n                public boolean ignoreTable(String tableName) {\n                    for (String temp : TENANT_TABLE) {\n                        if (temp.equalsIgnoreCase(tableName)) {\n                            return false;\n                        }\n                    }\n                    return true;\n                }\n            }));\n        }\n        //update-begin-author:zyf date:20220425 for:【VUEN-606】注入动态表名适配拦截器解决多表名问题\n        interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor());\n        //update-end-author:zyf date:20220425 for:【VUEN-606】注入动态表名适配拦截器解决多表名问题\n        \n        //update-begin---author:scott ---date:2025-08-02  for：【issues/8666】升级mybatisPlus后SqlServer分页使用OFFSET ？ ROWS FETCH NEXT ？ ROWS ONLY，导致online报表报错---\n        DbType dbType = null;\n        try {\n             dbType = JdbcUtils.getDbType(dataSource.getConnection().getMetaData().getURL());\n             log.info(\"当前数据库类型: {}\", dbType);\n        } catch (SQLException e) {\n            Log.error(e.getMessage(), e);\n        }\n        if (dbType!=null && (dbType == DbType.SQL_SERVER || dbType == DbType.SQL_SERVER2005)) {\n            // 如果是SQL Server则覆盖为2005分页方式\n            interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.SQL_SERVER2005));\n        } else {\n            interceptor.addInnerInterceptor(new PaginationInnerInterceptor());\n        }\n        //update-end---author:scott ---date::2025-08-02  for：【issues/8666】升级mybatisPlus后SqlServer分页使用OFFSET ？ ROWS FETCH NEXT ？ ROWS ONLY，导致online报表报错---\n        \n        //【jeecg-boot/issues/3847】增加@Version乐观锁支持 \n        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());\n        return interceptor;\n    }\n\n    /**\n     * 动态表名切换拦截器,用于适配vue2和vue3同一个表有多个的情况,如sys_role_index在vue3情况下表名为sys_role_index_v3\n     * @return\n     */\n    private DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor() {\n        DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();\n        dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> {\n            //获取需要动态解析的表名\n            String dynamicTableName = ThreadLocalDataHelper.get(CommonConstant.DYNAMIC_TABLE_NAME);\n            //当dynamicTableName不为空时才走动态表名处理逻辑,否则返回原始表名\n            if (ObjectUtil.isNotEmpty(dynamicTableName) && dynamicTableName.equals(tableName)) {\n                // 获取前端传递的版本号标识\n                Object version = ThreadLocalDataHelper.get(CommonConstant.VERSION);\n                if (ObjectUtil.isNotEmpty(version)) {\n                    //拼接表名规则(原始表名+下划线+前端传递的版本号)\n                    return tableName + \"_\" + version;\n                }\n            }\n            return tableName;\n        });\n        return dynamicTableNameInnerInterceptor;\n    }\n\n//    /**\n//     * 下个版本会删除，现在为了避免缓存出现问题不得不配置\n//     * @return\n//     */\n//    @Bean\n//    public ConfigurationCustomizer configurationCustomizer() {\n//        return configuration -> configuration.setUseDeprecatedExecutor(false);\n//    }\n//    /**\n//     * mybatis-plus SQL执行效率插件【生产环境可以关闭】\n//     */\n//    @Bean\n//    public PerformanceInterceptor performanceInterceptor() {\n//        return new PerformanceInterceptor();\n//    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/TenantContext.java",
    "content": "//package org.jeecg.config.mybatis;\n//\n//import lombok.extern.slf4j.Slf4j;\n//\n///**\n// * 多租户 tenant_id存储器\n// * @author: jeecg-boot\n// */\n//@Slf4j\n//public class TenantContext {\n//    private static ThreadLocal<String> currentTenant = new ThreadLocal<>();\n//\n//    public static void setTenant(String tenant) {\n//        log.debug(\" setting tenant to \" + tenant);\n//        currentTenant.set(tenant);\n//    }\n//\n//    public static String getTenant() {\n//        return currentTenant.get();\n//    }\n//\n//    public static void clear(){\n//        currentTenant.remove();\n//    }\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/ThreadLocalDataHelper.java",
    "content": "package org.jeecg.config.mybatis;\n\nimport cn.hutool.core.util.ObjectUtil;\nimport com.baomidou.mybatisplus.core.toolkit.CollectionUtils;\nimport java.util.concurrent.ConcurrentHashMap;\n\n\n/**\n * @Description: 本地线程变量存储工具类\n * @author: lsq\n * @date: 2022年03月25日 11:42\n */\npublic class ThreadLocalDataHelper {\n    /**\n     * 线程的本地变量\n     */\n    private static final ThreadLocal<ConcurrentHashMap> REQUEST_DATA = new ThreadLocal<>();\n\n    /**\n     * 存储本地参数\n     */\n    private static final ConcurrentHashMap DATA_MAP = new ConcurrentHashMap<>();\n\n    /**\n     * 设置请求参数\n     *\n     * @param key  参数key\n     * @param value 参数值\n     */\n    public static void put(String key, Object value) {\n        if(ObjectUtil.isNotEmpty(value)) {\n            DATA_MAP.put(key, value);\n            REQUEST_DATA.set(DATA_MAP);\n        }\n    }\n\n    /**\n     * 获取请求参数值\n     *\n     * @param key 请求参数\n     * @return\n     */\n    public static <T> T get(String key) {\n        ConcurrentHashMap dataMap = REQUEST_DATA.get();\n        if (CollectionUtils.isNotEmpty(dataMap)) {\n            return (T) dataMap.get(key);\n        }\n        return null;\n    }\n\n    /**\n     * 获取请求参数\n     *\n     * @return 请求参数 MAP 对象\n     */\n    public static void clear() {\n        DATA_MAP.clear();\n        REQUEST_DATA.remove();\n    }\n\n}\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/aspect/DynamicTableAspect.java",
    "content": "package org.jeecg.config.mybatis.aspect;\n\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.annotation.Around;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.aspectj.lang.reflect.MethodSignature;\nimport org.jeecg.common.aspect.annotation.DynamicTable;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.config.mybatis.ThreadLocalDataHelper;\nimport org.springframework.stereotype.Component;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.lang.reflect.Method;\n\n/**\n * 动态table切换 切面处理\n *\n * @author :zyf\n * @date:2020-04-25\n */\n@Aspect\n@Component\npublic class DynamicTableAspect {\n\n\n    /**\n     * 定义切面拦截切入点\n     */\n    @Pointcut(\"@annotation(org.jeecg.common.aspect.annotation.DynamicTable)\")\n    public void dynamicTable() {\n    }\n\n\n    @Around(\"dynamicTable()\")\n    public Object around(ProceedingJoinPoint point) throws Throwable {\n        MethodSignature signature = (MethodSignature) point.getSignature();\n        Method method = signature.getMethod();\n        DynamicTable dynamicTable = method.getAnnotation(DynamicTable.class);\n        HttpServletRequest request = SpringContextUtils.getHttpServletRequest();\n        //获取前端传递的版本标记\n        String version = request.getHeader(CommonConstant.VERSION);\n        //存储版本号到本地线程变量\n        ThreadLocalDataHelper.put(CommonConstant.VERSION, version);\n        //存储表名到本地线程变量\n        ThreadLocalDataHelper.put(CommonConstant.DYNAMIC_TABLE_NAME, dynamicTable.value());\n        //执行方法\n        Object result = point.proceed();\n        //清空本地变量\n        ThreadLocalDataHelper.clear();\n        return result;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/interceptor/DynamicDatasourceInterceptor.java",
    "content": "package org.jeecg.config.mybatis.interceptor;\n\nimport com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.springframework.web.servlet.HandlerInterceptor;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\n\n/**\n * 动态数据源切换拦截器\n *\n * 测试：拦截参数，自动切换数据源\n * 未来规划：后面通过此机制，实现多租户切换数据源功能\n * @author zyf\n */\n@Slf4j\npublic class DynamicDatasourceInterceptor implements HandlerInterceptor {\n\n    /**\n     * 在请求处理之前进行调用（Controller方法调用之前）\n     */\n    @Override\n    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {\n        String requestURI = request.getRequestURI();\n        log.info(\"经过多数据源Interceptor,当前路径是{}\", requestURI);\n        //获取动态数据源名称\n        String dsName = request.getParameter(\"dsName\");\n        String dsKey = \"master\";\n        if (StringUtils.isNotEmpty(dsName)) {\n            dsKey = dsName;\n        }\n        DynamicDataSourceContextHolder.push(dsKey);\n        return true;\n    }\n\n    /**\n     * 请求处理之后进行调用，但是在视图被渲染之前（Controller方法调用之后）\n     */\n    @Override\n    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {\n\n    }\n\n    /**\n     * 在整个请求结束之后被调用，也就是在DispatcherServlet 渲染了对应的视图之后执行（主要是用于进行资源清理工作）\n     */\n    @Override\n    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {\n        DynamicDataSourceContextHolder.clear();\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/oss/MinioConfig.java",
    "content": "package org.jeecg.config.oss;\n\nimport jakarta.annotation.PostConstruct;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.util.MinioUtil;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Lazy;\n\n/**\n * Minio文件上传配置文件\n * @author: jeecg-boot\n */\n@Lazy(false)\n@Slf4j\n@Configuration\n@ConditionalOnProperty(prefix = \"jeecg.minio\", name = \"minio_url\")\npublic class MinioConfig {\n    @Value(value = \"${jeecg.minio.minio_url}\")\n    private String minioUrl;\n    @Value(value = \"${jeecg.minio.minio_name}\")\n    private String minioName;\n    @Value(value = \"${jeecg.minio.minio_pass}\")\n    private String minioPass;\n    @Value(value = \"${jeecg.minio.bucketName}\")\n    private String bucketName;\n\n    @PostConstruct\n    public void initMinio(){\n        if(!minioUrl.startsWith(CommonConstant.STR_HTTP)){\n            minioUrl = \"http://\" + minioUrl;\n        }\n        if(!minioUrl.endsWith(SymbolConstant.SINGLE_SLASH)){\n            minioUrl = minioUrl.concat(SymbolConstant.SINGLE_SLASH);\n        }\n        MinioUtil.setMinioUrl(minioUrl);\n        MinioUtil.setMinioName(minioName);\n        MinioUtil.setMinioPass(minioPass);\n        MinioUtil.setBucketName(bucketName);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/oss/OssConfiguration.java",
    "content": "package org.jeecg.config.oss;\n\nimport jakarta.annotation.PostConstruct;\nimport org.jeecg.common.util.oss.OssBootUtil;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Lazy;\n\n/**\n * 云存储 配置\n * @author: jeecg-boot\n */\n@Lazy(false)\n@Configuration\n@ConditionalOnProperty(prefix = \"jeecg.oss\", name = \"endpoint\")\npublic class OssConfiguration {\n\n    @Value(\"${jeecg.oss.endpoint}\")\n    private String endpoint;\n    @Value(\"${jeecg.oss.accessKey}\")\n    private String accessKeyId;\n    @Value(\"${jeecg.oss.secretKey}\")\n    private String accessKeySecret;\n    @Value(\"${jeecg.oss.bucketName}\")\n    private String bucketName;\n    @Value(\"${jeecg.oss.staticDomain:}\")\n    private String staticDomain;\n\n\n    @PostConstruct\n    public void initOssBootConfiguration() {\n        OssBootUtil.setEndPoint(endpoint);\n        OssBootUtil.setAccessKeyId(accessKeyId);\n        OssBootUtil.setAccessKeySecret(accessKeySecret);\n        OssBootUtil.setBucketName(bucketName);\n        OssBootUtil.setStaticDomain(staticDomain);\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/IgnoreAuth.java",
    "content": "package org.jeecg.config.shiro;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * 免Token认证注解\n * \n * 认证系统结合spring MVC的@RequestMapping获取请求路径进行免登录配置\n * @author eightmonth\n * @date 2024/2/28 9:58\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface IgnoreAuth {\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/JwtToken.java",
    "content": "package org.jeecg.config.shiro;\n \nimport org.apache.shiro.authc.AuthenticationToken;\n\n/**\n * @Author Scott\n * @create 2018-07-12 15:19\n * @desc\n **/\npublic class JwtToken implements AuthenticationToken {\n\t\n\tprivate static final long serialVersionUID = 1L;\n\tprivate String token;\n \n    public JwtToken(String token) {\n        this.token = token;\n    }\n \n    @Override\n    public Object getPrincipal() {\n        return token;\n    }\n \n    @Override\n    public Object getCredentials() {\n        return token;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java",
    "content": "package org.jeecg.config.shiro;\n\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.DispatcherType;\nimport jakarta.servlet.Filter;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.pool2.impl.GenericObjectPoolConfig;\nimport org.apache.shiro.mgt.DefaultSessionStorageEvaluator;\nimport org.apache.shiro.mgt.DefaultSubjectDAO;\nimport org.apache.shiro.mgt.SecurityManager;\nimport org.apache.shiro.spring.LifecycleBeanPostProcessor;\nimport org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;\nimport org.apache.shiro.spring.web.ShiroFilterFactoryBean;\nimport org.apache.shiro.spring.web.ShiroUrlPathHelper;\nimport org.apache.shiro.web.mgt.DefaultWebSecurityManager;\nimport org.crazycake.shiro.*;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.jeecg.config.shiro.filters.CustomShiroFilterFactoryBean;\nimport org.jeecg.config.shiro.filters.JwtFilter;\nimport org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.config.BeanDefinition;\nimport org.springframework.boot.web.servlet.FilterRegistrationBean;\nimport org.springframework.context.annotation.*;\nimport org.springframework.core.annotation.AnnotationUtils;\nimport org.springframework.core.env.Environment;\nimport org.springframework.core.type.filter.AnnotationTypeFilter;\nimport org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;\nimport org.springframework.boot.autoconfigure.data.redis.RedisProperties;\nimport org.springframework.util.CollectionUtils;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.filter.DelegatingFilterProxy;\nimport org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;\nimport redis.clients.jedis.HostAndPort;\nimport redis.clients.jedis.JedisCluster;\n\nimport java.lang.reflect.Method;\nimport java.util.*;\n\n/**\n * @author: Scott\n * @date: 2018/2/7\n * @description: shiro 配置类\n */\n\n@Slf4j\n@Configuration\npublic class ShiroConfig {\n\n    @Resource\n    private LettuceConnectionFactory lettuceConnectionFactory;\n    @Autowired\n    private Environment env;\n    @Resource\n    private JeecgBaseConfig jeecgBaseConfig;\n    @Autowired(required = false)\n    private RedisProperties redisProperties;\n    \n    /**\n     * Filter Chain定义说明\n     *\n     * 1、一个URL可以配置多个Filter，使用逗号分隔\n     * 2、当设置多个过滤器时，全部验证通过，才视为通过\n     * 3、部分过滤器可指定参数，如perms，roles\n     */\n    @Bean(\"shiroFilterFactoryBean\")\n    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {\n        CustomShiroFilterFactoryBean shiroFilterFactoryBean = new CustomShiroFilterFactoryBean();\n        shiroFilterFactoryBean.setSecurityManager(securityManager);\n        // 拦截器\n        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();\n\n        //支持yml方式，配置拦截排除\n        if(jeecgBaseConfig!=null && jeecgBaseConfig.getShiro()!=null){\n            String shiroExcludeUrls = jeecgBaseConfig.getShiro().getExcludeUrls();\n            if(oConvertUtils.isNotEmpty(shiroExcludeUrls)){\n                String[] permissionUrl = shiroExcludeUrls.split(\",\");\n                for(String url : permissionUrl){\n                    filterChainDefinitionMap.put(url,\"anon\");\n                }\n            }\n        }\n\n        // 配置不会被拦截的链接 顺序判断\n        filterChainDefinitionMap.put(\"/sys/cas/client/validateLogin\", \"anon\"); //cas验证登录\n        filterChainDefinitionMap.put(\"/sys/randomImage/**\", \"anon\"); //登录验证码接口排除\n        filterChainDefinitionMap.put(\"/sys/checkCaptcha\", \"anon\"); //登录验证码接口排除\n        filterChainDefinitionMap.put(\"/sys/smsCheckCaptcha\", \"anon\"); //短信次数发送太多验证码排除\n        filterChainDefinitionMap.put(\"/sys/login\", \"anon\"); //登录接口排除\n        filterChainDefinitionMap.put(\"/sys/mLogin\", \"anon\"); //登录接口排除\n        filterChainDefinitionMap.put(\"/sys/logout\", \"anon\"); //登出接口排除\n        filterChainDefinitionMap.put(\"/sys/thirdLogin/**\", \"anon\"); //第三方登录\n        filterChainDefinitionMap.put(\"/sys/getEncryptedString\", \"anon\"); //获取加密串\n        filterChainDefinitionMap.put(\"/sys/sms\", \"anon\");//短信验证码\n        filterChainDefinitionMap.put(\"/sys/phoneLogin\", \"anon\");//手机登录\n        filterChainDefinitionMap.put(\"/sys/user/checkOnlyUser\", \"anon\");//校验用户是否存在\n        filterChainDefinitionMap.put(\"/sys/user/register\", \"anon\");//用户注册\n        filterChainDefinitionMap.put(\"/sys/user/phoneVerification\", \"anon\");//用户忘记密码验证手机号\n        filterChainDefinitionMap.put(\"/sys/user/passwordChange\", \"anon\");//用户更改密码\n        filterChainDefinitionMap.put(\"/auth/2step-code\", \"anon\");//登录验证码\n        filterChainDefinitionMap.put(\"/sys/common/static/**\", \"anon\");//图片预览 &下载文件不限制token\n        filterChainDefinitionMap.put(\"/sys/common/pdf/**\", \"anon\");//pdf预览\n\n        //filterChainDefinitionMap.put(\"/sys/common/view/**\", \"anon\");//图片预览不限制token\n        //filterChainDefinitionMap.put(\"/sys/common/download/**\", \"anon\");//文件下载不限制token\n        filterChainDefinitionMap.put(\"/generic/**\", \"anon\");//pdf预览需要文件\n\n        filterChainDefinitionMap.put(\"/sys/getLoginQrcode/**\", \"anon\"); //登录二维码\n        filterChainDefinitionMap.put(\"/sys/getQrcodeToken/**\", \"anon\"); //监听扫码\n        filterChainDefinitionMap.put(\"/sys/checkAuth\", \"anon\"); //授权接口排除\n        filterChainDefinitionMap.put(\"/openapi/call/**\", \"anon\"); // 开放平台接口排除\n\n        // 代码逻辑说明: 排除静态资源后缀\n        filterChainDefinitionMap.put(\"/\", \"anon\");\n        filterChainDefinitionMap.put(\"/doc.html\", \"anon\");\n        filterChainDefinitionMap.put(\"/**/*.js\", \"anon\");\n        filterChainDefinitionMap.put(\"/**/*.css\", \"anon\");\n        filterChainDefinitionMap.put(\"/**/*.html\", \"anon\");\n        filterChainDefinitionMap.put(\"/**/*.svg\", \"anon\");\n        filterChainDefinitionMap.put(\"/**/*.pdf\", \"anon\");\n        filterChainDefinitionMap.put(\"/**/*.jpg\", \"anon\");\n        filterChainDefinitionMap.put(\"/**/*.png\", \"anon\");\n        filterChainDefinitionMap.put(\"/**/*.gif\", \"anon\");\n        filterChainDefinitionMap.put(\"/**/*.ico\", \"anon\");\n        filterChainDefinitionMap.put(\"/**/*.ttf\", \"anon\");\n        filterChainDefinitionMap.put(\"/**/*.woff\", \"anon\");\n        filterChainDefinitionMap.put(\"/**/*.woff2\", \"anon\");\n\n        filterChainDefinitionMap.put(\"/**/*.glb\", \"anon\");\n        filterChainDefinitionMap.put(\"/**/*.wasm\", \"anon\");\n\n        filterChainDefinitionMap.put(\"/druid/**\", \"anon\");\n        filterChainDefinitionMap.put(\"/swagger-ui.html\", \"anon\");\n        filterChainDefinitionMap.put(\"/swagger**/**\", \"anon\");\n        filterChainDefinitionMap.put(\"/webjars/**\", \"anon\");\n        filterChainDefinitionMap.put(\"/v3/**\", \"anon\");\n\n        filterChainDefinitionMap.put(\"/sys/annountCement/show/**\", \"anon\");\n\n        //积木报表排除\n        filterChainDefinitionMap.put(\"/jmreport/**\", \"anon\");\n        filterChainDefinitionMap.put(\"/**/*.js.map\", \"anon\");\n        filterChainDefinitionMap.put(\"/**/*.css.map\", \"anon\");\n        \n        //积木BI大屏和仪表盘排除\n        filterChainDefinitionMap.put(\"/drag/view\", \"anon\");\n        filterChainDefinitionMap.put(\"/drag/page/queryById\", \"anon\");\n        filterChainDefinitionMap.put(\"/drag/page/addVisitsNumber\", \"anon\");\n        filterChainDefinitionMap.put(\"/drag/page/queryTemplateList\", \"anon\");\n        filterChainDefinitionMap.put(\"/drag/share/view/**\", \"anon\");\n        filterChainDefinitionMap.put(\"/drag/onlDragDatasetHead/getAllChartData\", \"anon\");\n        filterChainDefinitionMap.put(\"/drag/onlDragDatasetHead/getTotalData\", \"anon\");\n        filterChainDefinitionMap.put(\"/drag/onlDragDatasetHead/getMapDataByCode\", \"anon\");\n        filterChainDefinitionMap.put(\"/drag/onlDragDatasetHead/getTotalDataByCompId\", \"anon\");\n        filterChainDefinitionMap.put(\"/drag/mock/json/**\", \"anon\");\n        filterChainDefinitionMap.put(\"/drag/onlDragDatasetHead/getDictByCodes\", \"anon\");\n        filterChainDefinitionMap.put(\"/drag/onlDragDatasetHead/queryAllById\", \"anon\");\n        filterChainDefinitionMap.put(\"/jimubi/view\", \"anon\");\n        filterChainDefinitionMap.put(\"/jimubi/share/view/**\", \"anon\");\n\n        //大屏模板例子\n        filterChainDefinitionMap.put(\"/test/bigScreen/**\", \"anon\");\n        filterChainDefinitionMap.put(\"/bigscreen/template1/**\", \"anon\");\n        filterChainDefinitionMap.put(\"/bigscreen/template2/**\", \"anon\");\n        //filterChainDefinitionMap.put(\"/test/jeecgDemo/rabbitMqClientTest/**\", \"anon\"); //MQ测试\n        //filterChainDefinitionMap.put(\"/test/jeecgDemo/html\", \"anon\"); //模板页面\n        //filterChainDefinitionMap.put(\"/test/jeecgDemo/redis/**\", \"anon\"); //redis测试\n\n        //websocket排除\n        filterChainDefinitionMap.put(\"/websocket/**\", \"anon\");//系统通知和公告\n        filterChainDefinitionMap.put(\"/newsWebsocket/**\", \"anon\");//CMS模块\n        filterChainDefinitionMap.put(\"/vxeSocket/**\", \"anon\");//JVxeTable无痕刷新示例\n        //App vue3版本查询版本接口\n        filterChainDefinitionMap.put(\"/sys/version/app3version\", \"anon\");\n        //仪表盘（按钮通信）\n        filterChainDefinitionMap.put(\"/dragChannelSocket/**\",\"anon\");\n        //App vue3版本查询版本接口\n        filterChainDefinitionMap.put(\"/sys/version/app3version\", \"anon\");\n\n        //性能监控——安全隐患泄露TOEKN（durid连接池也有）\n        //filterChainDefinitionMap.put(\"/actuator/**\", \"anon\");\n        //测试模块排除\n        filterChainDefinitionMap.put(\"/test/seata/**\", \"anon\");\n\n        //错误路径排除\n        filterChainDefinitionMap.put(\"/error\", \"anon\");\n        // 企业微信证书排除\n        filterChainDefinitionMap.put(\"/WW_verify*\", \"anon\");\n\n        filterChainDefinitionMap.put(\"/openapi/call/**\", \"anon\");\n\n        // 添加自己的过滤器并且取名为jwt\n        Map<String, Filter> filterMap = new HashMap<String, Filter>(1);\n        //如果cloudServer为空 则说明是单体 需要加载跨域配置【微服务跨域切换】\n        Object cloudServer = env.getProperty(CommonConstant.CLOUD_SERVER_KEY);\n        filterMap.put(\"jwt\", new JwtFilter(cloudServer==null));\n        shiroFilterFactoryBean.setFilters(filterMap);\n        // <!-- 过滤链定义，从上向下顺序执行，一般将/**放在最为下边\n        filterChainDefinitionMap.put(\"/**\", \"jwt\");\n\n        // 未授权界面返回JSON\n        shiroFilterFactoryBean.setUnauthorizedUrl(\"/sys/common/403\");\n        shiroFilterFactoryBean.setLoginUrl(\"/sys/common/403\");\n        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);\n        return shiroFilterFactoryBean;\n    }\n\n\n    /**\n     * spring过滤装饰器 <br/>\n     * 因为shiro的filter不支持异步请求,导致所有的异步请求都会报错. <br/>\n     * 所以需要用spring的FilterRegistrationBean再代理一下shiro的filter.为他扩展异步支持. <br/>\n     * 后续所有异步的接口都需要再这里增加registration.addUrlPatterns(\"/xxx/xxx\");\n     * @return\n     * @author chenrui\n     * @date 2024/12/3 19:49\n     */\n    @Bean\n    public FilterRegistrationBean shiroFilterRegistration() {\n        FilterRegistrationBean registration = new FilterRegistrationBean();\n        registration.setFilter(new DelegatingFilterProxy(\"shiroFilterFactoryBean\"));\n        registration.setEnabled(true);\n        // 代码逻辑说明: [issues/7491]运行耗时长，效率慢 \n        registration.addUrlPatterns(\"/test/ai/chat/send\");\n        registration.addUrlPatterns(\"/airag/flow/run\");\n        registration.addUrlPatterns(\"/airag/flow/debug\");\n        registration.addUrlPatterns(\"/airag/chat/send\");\n        registration.addUrlPatterns(\"/airag/app/debug\");\n        registration.addUrlPatterns(\"/airag/app/prompt/generate\");\n        registration.addUrlPatterns(\"/airag/chat/receive/**\");\n        // 添加SSE接口的异步支持\n        registration.addUrlPatterns(\"/airag/extData/evaluator/debug\");\n        registration.addUrlPatterns(\"/drag/onlDragDatasetHead/generateChartSse\");\n        registration.addUrlPatterns(\"/drag/onlDragDatasetHead/updateChartOptSse\");\n        registration.addUrlPatterns(\"/drag/onlDragDatasetHead/generateSqlSse\");\n        //支持异步\n        registration.setAsyncSupported(true);\n        registration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ASYNC);\n        return registration;\n    }\n\n    @Bean(\"securityManager\")\n    public DefaultWebSecurityManager securityManager(ShiroRealm myRealm) {\n        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();\n        securityManager.setRealm(myRealm);\n\n        /*\n         * 关闭shiro自带的session，详情见文档\n         * http://shiro.apache.org/session-management.html#SessionManagement-\n         * StatelessApplications%28Sessionless%29\n         */\n        DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();\n        DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator();\n        defaultSessionStorageEvaluator.setSessionStorageEnabled(false);\n        subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator);\n        securityManager.setSubjectDAO(subjectDAO);\n        //自定义缓存实现,使用redis\n        securityManager.setCacheManager(redisCacheManager());\n        return securityManager;\n    }\n\n    /**\n     * 下面的代码是添加注解支持\n     * @return\n     */\n    @Bean\n    @DependsOn(\"lifecycleBeanPostProcessor\")\n    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {\n        DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();\n        defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);\n        /**\n         * 解决重复代理问题 github#994\n         * 添加前缀判断 不匹配 任何Advisor\n         */\n        defaultAdvisorAutoProxyCreator.setUsePrefix(true);\n        defaultAdvisorAutoProxyCreator.setAdvisorBeanNamePrefix(\"_no_advisor\");\n        return defaultAdvisorAutoProxyCreator;\n    }\n\n    @Bean\n    public static LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {\n        return new LifecycleBeanPostProcessor();\n    }\n\n    @Bean\n    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {\n        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();\n        advisor.setSecurityManager(securityManager);\n        return advisor;\n    }\n\n    /**\n     * cacheManager 缓存 redis实现\n     * 使用的是shiro-redis开源插件\n     *\n     * @return\n     */\n    public RedisCacheManager redisCacheManager() {\n        log.info(\"===============(1)创建缓存管理器RedisCacheManager\");\n        RedisCacheManager redisCacheManager = new RedisCacheManager();\n        redisCacheManager.setRedisManager(redisManager());\n        //redis中针对不同用户缓存(此处的id需要对应user实体中的id字段,用于唯一标识)\n        redisCacheManager.setPrincipalIdFieldName(\"id\");\n        //用户权限信息缓存时间\n        redisCacheManager.setExpire(200000);\n        return redisCacheManager;\n    }\n\n    /**\n     * RedisConfig在项目starter项目中\n     * jeecg-boot-starter-github\\jeecg-boot-common\\src\\main\\java\\org\\jeecg\\common\\modules\\redis\\config\\RedisConfig.java\n     * \n     * 配置shiro redisManager\n     * 使用的是shiro-redis开源插件\n     *\n     * @return\n     */\n    @Bean\n    public IRedisManager redisManager() {\n        log.info(\"===============(2)创建RedisManager,连接Redis..\");\n        IRedisManager manager;\n        // sentinel cluster redis（【issues/5569】shiro集成 redis 不支持 sentinel 方式部署的redis集群 #5569）\n        if (Objects.nonNull(redisProperties)\n                && Objects.nonNull(redisProperties.getSentinel())\n                && !CollectionUtils.isEmpty(redisProperties.getSentinel().getNodes())) {\n            RedisSentinelManager sentinelManager = new RedisSentinelManager();\n            sentinelManager.setMasterName(redisProperties.getSentinel().getMaster());\n            sentinelManager.setHost(String.join(\",\", redisProperties.getSentinel().getNodes()));\n            sentinelManager.setPassword(redisProperties.getPassword());\n            sentinelManager.setDatabase(redisProperties.getDatabase());\n\n            return sentinelManager;\n        }\n        \n        // redis 单机支持，在集群为空，或者集群无机器时候使用 add by jzyadmin@163.com\n        if (lettuceConnectionFactory.getClusterConfiguration() == null || lettuceConnectionFactory.getClusterConfiguration().getClusterNodes().isEmpty()) {\n            RedisManager redisManager = new RedisManager();\n            redisManager.setHost(lettuceConnectionFactory.getHostName() + \":\" + lettuceConnectionFactory.getPort());\n            //(lettuceConnectionFactory.getPort());\n            redisManager.setDatabase(lettuceConnectionFactory.getDatabase());\n            redisManager.setTimeout(0);\n            if (!StringUtils.isEmpty(lettuceConnectionFactory.getPassword())) {\n                redisManager.setPassword(lettuceConnectionFactory.getPassword());\n            }\n            manager = redisManager;\n        }else{\n            // redis集群支持，优先使用集群配置\n            RedisClusterManager redisManager = new RedisClusterManager();\n            Set<HostAndPort> portSet = new HashSet<>();\n            lettuceConnectionFactory.getClusterConfiguration().getClusterNodes().forEach(node -> portSet.add(new HostAndPort(node.getHost() , node.getPort())));\n            //update-begin--Author:scott Date:20210531 for：修改集群模式下未设置redis密码的bug issues/I3QNIC\n            if (oConvertUtils.isNotEmpty(lettuceConnectionFactory.getPassword())) {\n                JedisCluster jedisCluster = new JedisCluster(portSet, 2000, 2000, 5,\n                    lettuceConnectionFactory.getPassword(), new GenericObjectPoolConfig());\n                redisManager.setPassword(lettuceConnectionFactory.getPassword());\n                redisManager.setJedisCluster(jedisCluster);\n            } else {\n                JedisCluster jedisCluster = new JedisCluster(portSet);\n                redisManager.setJedisCluster(jedisCluster);\n            }\n            manager = redisManager;\n        }\n        return manager;\n    }\n\n    /**\n     * 解决 ShiroRequestMappingConfig 获取 requestMappingHandlerMapping Bean 冲突\n     * spring-boot-autoconfigure:3.4.5 和 spring-boot-actuator-autoconfigure:3.4.5\n     */\n    @Primary\n    @Bean\n    public RequestMappingHandlerMapping overridedRequestMappingHandlerMapping() {\n        RequestMappingHandlerMapping mapping = new RequestMappingHandlerMapping();\n        mapping.setUrlPathHelper(new ShiroUrlPathHelper());\n        return mapping;\n    }\n    \n    private List<String> rebuildUrl(String[] bases, String[] uris) {\n        List<String> urls = new ArrayList<>();\n        for (String base : bases) {\n            for (String uri : uris) {\n                urls.add(prefix(base)+prefix(uri));\n            }\n        }\n        return urls;\n    }\n\n    private String prefix(String seg) {\n        return seg.startsWith(\"/\") ? seg : \"/\"+seg;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroRealm.java",
    "content": "package org.jeecg.config.shiro;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.authc.AuthenticationException;\nimport org.apache.shiro.authc.AuthenticationInfo;\nimport org.apache.shiro.authc.AuthenticationToken;\nimport org.apache.shiro.authc.SimpleAuthenticationInfo;\nimport org.apache.shiro.authz.AuthorizationInfo;\nimport org.apache.shiro.authz.SimpleAuthorizationInfo;\nimport org.apache.shiro.realm.AuthorizingRealm;\nimport org.apache.shiro.subject.PrincipalCollection;\nimport org.jeecg.common.api.CommonAPI;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CacheConstant;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.RedisUtil;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.TokenUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.springframework.beans.factory.config.BeanDefinition;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.context.annotation.Role;\nimport org.springframework.stereotype.Component;\n\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.util.Set;\n\n/**\n * @Description: 用户登录鉴权和获取用户授权\n * @Author: Scott\n * @Date: 2019-4-23 8:13\n * @Version: 1.1\n */\n@Component\n@Slf4j\n@Role(BeanDefinition.ROLE_INFRASTRUCTURE)\npublic class ShiroRealm extends AuthorizingRealm {\n\t@Lazy\n    @Resource\n    private CommonAPI commonApi;\n\n    @Lazy\n    @Resource\n    private RedisUtil redisUtil;\n\n    /**\n     * 必须重写此方法，不然Shiro会报错\n     */\n    @Override\n    public boolean supports(AuthenticationToken token) {\n        return token instanceof JwtToken;\n    }\n\n    /**\n     * 权限信息认证(包括角色以及权限)是用户访问controller的时候才进行验证(redis存储的此处权限信息)\n     * 触发检测用户权限时才会调用此方法，例如checkRole,checkPermission\n     *\n     * @param principals 身份信息\n     * @return AuthorizationInfo 权限信息\n     */\n    @Override\n    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {\n        log.debug(\"===============Shiro权限认证开始============ [ roles、permissions]==========\");\n        String username = null;\n        String userId = null;\n        if (principals != null) {\n            LoginUser sysUser = (LoginUser) principals.getPrimaryPrincipal();\n            username = sysUser.getUsername();\n            userId = sysUser.getId();\n        }\n        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();\n\n        // 设置用户拥有的角色集合，比如“admin,test”\n        Set<String> roleSet = commonApi.queryUserRolesById(userId);\n        //System.out.println(roleSet.toString());\n        info.setRoles(roleSet);\n\n        // 设置用户拥有的权限集合，比如“sys:role:add,sys:user:add”\n        Set<String> permissionSet = commonApi.queryUserAuths(userId);\n        info.addStringPermissions(permissionSet);\n        //System.out.println(permissionSet);\n        log.debug(\"===============Shiro权限认证成功==============\");\n        return info;\n    }\n\n    /**\n     * 用户信息认证是在用户进行登录的时候进行验证(不存redis)\n     * 也就是说验证用户输入的账号和密码是否正确，错误抛出异常\n     *\n     * @param auth 用户登录的账号密码信息\n     * @return 返回封装了用户信息的 AuthenticationInfo 实例\n     * @throws AuthenticationException\n     */\n    @Override\n    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) throws AuthenticationException {\n        log.debug(\"===============Shiro身份认证开始============doGetAuthenticationInfo==========\");\n        String token = (String) auth.getCredentials();\n        if (token == null) {\n            HttpServletRequest req = SpringContextUtils.getHttpServletRequest();\n            log.info(\"————————身份认证失败——————————IP地址:  \"+ oConvertUtils.getIpAddrByRequest(req) +\"，URL:\"+req.getRequestURI());\n            throw new AuthenticationException(\"token为空!\");\n        }\n        // 校验token有效性\n        LoginUser loginUser = null;\n        try {\n            loginUser = this.checkUserTokenIsEffect(token);\n        } catch (AuthenticationException e) {\n            log.error(\"—————校验 check token 失败——————————\"+ e.getMessage(), e);\n            // 重新抛出异常，让JwtFilter统一处理，避免返回两次错误响应\n            throw e;\n        }\n        return new SimpleAuthenticationInfo(loginUser, token, getName());\n    }\n\n    /**\n     * 校验token的有效性\n     *\n     * @param token\n     */\n    public LoginUser checkUserTokenIsEffect(String token) throws AuthenticationException {\n        // 解密获得username，用于和数据库进行对比\n        String username = JwtUtil.getUsername(token);\n        if (username == null) {\n            throw new AuthenticationException(\"Token非法无效!\");\n        }\n\n        // 查询用户信息\n        log.debug(\"———校验token是否有效————checkUserTokenIsEffect——————— \"+ token);\n        LoginUser loginUser = TokenUtils.getLoginUser(username, commonApi, redisUtil);\n        //LoginUser loginUser = commonApi.getUserByName(username);\n        if (loginUser == null) {\n            throw new AuthenticationException(\"用户不存在!\");\n        }\n        // 判断用户状态\n        if (loginUser.getStatus() != 1) {\n            throw new AuthenticationException(\"账号已被锁定,请联系管理员!\");\n        }\n        // 校验token是否超时失效 & 或者账号密码是否错误\n        if (!jwtTokenRefresh(token, username, loginUser.getPassword())) {\n            // 用户登录Token过期提示信息\n            String userLoginTokenErrorMsg = oConvertUtils.getString(redisUtil.get(CommonConstant.PREFIX_USER_TOKEN_ERROR_MSG + token));\n            throw new AuthenticationException(oConvertUtils.isEmpty(userLoginTokenErrorMsg)? CommonConstant.TOKEN_IS_INVALID_MSG: userLoginTokenErrorMsg);\n        }\n        // 代码逻辑说明: 校验用户的tenant_id和前端传过来的是否一致\n        String userTenantIds = loginUser.getRelTenantIds();\n        if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL && oConvertUtils.isNotEmpty(userTenantIds)){\n            String contextTenantId = TenantContext.getTenant();\n            log.debug(\"登录租户：\" + contextTenantId);\n            log.debug(\"用户拥有那些租户：\" + userTenantIds);\n             //登录用户无租户，前端header中租户ID值为 0\n            String str =\"0\";\n            if(oConvertUtils.isNotEmpty(contextTenantId) && !str.equals(contextTenantId)){\n                // 代码逻辑说明: /issues/I4O14W 用户租户信息变更判断漏洞\n                String[] arr = userTenantIds.split(\",\");\n                if(!oConvertUtils.isIn(contextTenantId, arr)){\n                    boolean isAuthorization = false;\n                    //========================================================================\n                    // 查询用户信息（如果租户不匹配从数据库中重新查询一次用户信息）\n                    String loginUserKey = CacheConstant.SYS_USERS_CACHE + \"::\" + username;\n                    redisUtil.del(loginUserKey);\n                    LoginUser loginUserFromDb = commonApi.getUserByName(username);\n                    if (oConvertUtils.isNotEmpty(loginUserFromDb.getRelTenantIds())) {\n                        String[] newArray = loginUserFromDb.getRelTenantIds().split(\",\");\n                        if (oConvertUtils.isIn(contextTenantId, newArray)) { \n                            isAuthorization = true;\n                        }\n                    }\n                    //========================================================================\n\n                    //*********************************************\n                    if(!isAuthorization){\n                        log.info(\"租户异常——登录租户：\" + contextTenantId);\n                        log.info(\"租户异常——用户拥有租户组：\" + userTenantIds);\n                        throw new AuthenticationException(\"登录租户授权变更，请重新登陆!\");\n                    }\n                    //*********************************************\n                }\n            }\n        }\n        return loginUser;\n    }\n\n    /**\n     * JWTToken刷新生命周期 （实现： 用户在线操作不掉线功能）\n     * 1、登录成功后将用户的JWT生成的Token作为k、v存储到cache缓存里面(这时候k、v值一样)，缓存有效期设置为Jwt有效时间的2倍\n     * 2、当该用户再次请求时，通过JWTFilter层层校验之后会进入到doGetAuthenticationInfo进行身份验证\n     * 3、当该用户这次请求jwt生成的token值已经超时，但该token对应cache中的k还是存在，则表示该用户一直在操作只是JWT的token失效了，程序会给token对应的k映射的v值重新生成JWTToken并覆盖v值，该缓存生命周期重新计算\n     * 4、当该用户这次请求jwt在生成的token值已经超时，并在cache中不存在对应的k，则表示该用户账户空闲超时，返回用户信息已失效，请重新登录。\n     * 注意： 前端请求Header中设置Authorization保持不变，校验有效性以缓存中的token为准。\n     *       用户过期时间 = Jwt有效时间 * 2。\n     *\n     * @param userName\n     * @param passWord\n     * @return\n     */\n    public boolean jwtTokenRefresh(String token, String userName, String passWord) {\n        String cacheToken = String.valueOf(redisUtil.get(CommonConstant.PREFIX_USER_TOKEN + token));\n        if (oConvertUtils.isNotEmpty(cacheToken)) {\n            // 校验token有效性\n            if (!JwtUtil.verify(cacheToken, userName, passWord)) {\n                // 从token中解析客户端类型，保持续期时使用相同的客户端类型\n                String clientType = JwtUtil.getClientType(token);\n                String newAuthorization = JwtUtil.sign(userName, passWord, clientType);\n                // 根据客户端类型设置对应的缓存有效时间\n                long expireTime = CommonConstant.CLIENT_TYPE_APP.equalsIgnoreCase(clientType) \n                    ? JwtUtil.APP_EXPIRE_TIME * 2 / 1000 \n                    : JwtUtil.EXPIRE_TIME * 2 / 1000;\n                redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, newAuthorization);\n                redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, expireTime);\n                log.debug(\"——————————用户在线操作，更新token保证不掉线—————————jwtTokenRefresh——————— \"+ token);\n            }\n//\t\t\telse {\n//\t\t\t\t// 设置超时时间\n//\t\t\t\tredisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, cacheToken);\n//\t\t\t\tredisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME / 1000);\n//\t\t\t}\n            return true;\n        }\n\n        //redis中不存在此TOEKN，说明token非法返回false\n        return false;\n    }\n\n    /**\n     * 清除当前用户的权限认证缓存\n     *\n     * @param principals 权限信息\n     */\n    @Override\n    public void clearCache(PrincipalCollection principals) {\n        super.clearCache(principals);\n        // 代码逻辑说明: 【TV360X-1320】分配权限必须退出重新登录才生效，造成很多用户困扰---\n        super.clearCachedAuthorizationInfo(principals);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/CustomShiroFilterFactoryBean.java",
    "content": "package org.jeecg.config.shiro.filters;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.spring.web.ShiroFilterFactoryBean;\nimport org.apache.shiro.web.filter.InvalidRequestFilter;\nimport org.apache.shiro.web.filter.mgt.DefaultFilter;\nimport org.apache.shiro.web.filter.mgt.FilterChainManager;\nimport org.apache.shiro.web.filter.mgt.FilterChainResolver;\nimport org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver;\nimport org.apache.shiro.web.mgt.WebSecurityManager;\nimport org.apache.shiro.web.servlet.AbstractShiroFilter;\nimport org.apache.shiro.mgt.SecurityManager;\nimport org.springframework.beans.factory.BeanInitializationException;\n\nimport jakarta.servlet.Filter;\nimport java.util.Map;\n\n/**\n * 自定义ShiroFilterFactoryBean解决资源中文路径问题\n * @author: jeecg-boot\n */\n@Slf4j\npublic class CustomShiroFilterFactoryBean extends ShiroFilterFactoryBean {\n    @Override\n    public Class getObjectType() {\n        return MySpringShiroFilter.class;\n    }\n\n    @Override\n    protected AbstractShiroFilter createInstance() throws Exception {\n\n        SecurityManager securityManager = getSecurityManager();\n        if (securityManager == null) {\n            String msg = \"SecurityManager property must be set.\";\n            throw new BeanInitializationException(msg);\n        }\n\n        if (!(securityManager instanceof WebSecurityManager)) {\n            String msg = \"The security manager does not implement the WebSecurityManager interface.\";\n            throw new BeanInitializationException(msg);\n        }\n\n        FilterChainManager manager = createFilterChainManager();\n        //Expose the constructed FilterChainManager by first wrapping it in a\n        // FilterChainResolver implementation. The AbstractShiroFilter implementations\n        // do not know about FilterChainManagers - only resolvers:\n        PathMatchingFilterChainResolver chainResolver = new PathMatchingFilterChainResolver();\n        chainResolver.setFilterChainManager(manager);\n\n        Map<String, Filter> filterMap = manager.getFilters();\n        Filter invalidRequestFilter = filterMap.get(DefaultFilter.invalidRequest.name());\n        if (invalidRequestFilter instanceof InvalidRequestFilter) {\n            //此处是关键,设置false跳过URL携带中文400，servletPath中文校验bug\n            ((InvalidRequestFilter) invalidRequestFilter).setBlockNonAscii(false);\n        }\n        //Now create a concrete ShiroFilter instance and apply the acquired SecurityManager and built\n        //FilterChainResolver.  It doesn't matter that the instance is an anonymous inner class\n        //here - we're just using it because it is a concrete AbstractShiroFilter instance that accepts\n        //injection of the SecurityManager and FilterChainResolver:\n        return new MySpringShiroFilter((WebSecurityManager) securityManager, chainResolver);\n    }\n\n    private static final class MySpringShiroFilter extends AbstractShiroFilter {\n        protected MySpringShiroFilter(WebSecurityManager webSecurityManager, FilterChainResolver resolver) {\n            if (webSecurityManager == null) {\n                throw new IllegalArgumentException(\"WebSecurityManager property cannot be null.\");\n            } else {\n                this.setSecurityManager(webSecurityManager);\n                if (resolver != null) {\n                    this.setFilterChainResolver(resolver);\n                }\n\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/JwtFilter.java",
    "content": "package org.jeecg.config.shiro.filters;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.shiro.JwtToken;\nimport org.jeecg.config.shiro.ignore.InMemoryIgnoreAuth;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.web.bind.annotation.RequestMethod;\n\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\n\n/**\n * @Description: 鉴权登录拦截器\n * @Author: Scott\n * @Date: 2018/10/7\n **/\n@Slf4j\npublic class JwtFilter extends BasicHttpAuthenticationFilter {\n\n    /**\n     * 默认开启跨域设置（使用单体）\n     * 微服务情况下，此属性设置为false\n     */\n    private boolean allowOrigin = true;\n\n    public JwtFilter(){}\n    public JwtFilter(boolean allowOrigin){\n        this.allowOrigin = allowOrigin;\n    }\n\n    /**\n     * 执行登录认证\n     *\n     * @param request\n     * @param response\n     * @param mappedValue\n     * @return\n     */\n    @Override\n    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {\n        try {\n            // 判断当前路径是不是注解了@IngoreAuth路径，如果是，则放开验证\n            if (InMemoryIgnoreAuth.contains(((HttpServletRequest) request).getServletPath())) {\n                return true;\n            }\n            \n            executeLogin(request, response);\n            return true;\n        } catch (Exception e) {\n            // 使用异常中的具体错误信息，保留\"不允许同一账号多地同时登录\"等具体提示\n            String errorMsg = e.getMessage();\n            if (oConvertUtils.isEmpty(errorMsg)) {\n                errorMsg = CommonConstant.TOKEN_IS_INVALID_MSG;\n            }\n            JwtUtil.responseError((HttpServletResponse)response, 401, errorMsg);\n            return false;\n        }\n    }\n\n    /**\n     *\n     */\n    @Override\n    protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception {\n        HttpServletRequest httpServletRequest = (HttpServletRequest) request;\n        String token = httpServletRequest.getHeader(CommonConstant.X_ACCESS_TOKEN);\n        // 代码逻辑说明: JT-355 OA聊天添加token验证，获取token参数\n        if (oConvertUtils.isEmpty(token)) {\n            token = httpServletRequest.getParameter(\"token\");\n        }\n\n        JwtToken jwtToken = new JwtToken(token);\n        // 提交给realm进行登入，如果错误他会抛出异常并被捕获\n        getSubject(request, response).login(jwtToken);\n        // 如果没有抛出异常则代表登入成功，返回true\n        return true;\n    }\n\n    /**\n     * 对跨域提供支持\n     */\n    @Override\n    protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {\n        HttpServletRequest httpServletRequest = (HttpServletRequest) request;\n        HttpServletResponse httpServletResponse = (HttpServletResponse) response;\n        if(allowOrigin){\n            httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, httpServletRequest.getHeader(HttpHeaders.ORIGIN));\n            // 允许客户端请求方法\n            httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, \"GET,POST,OPTIONS,PUT,DELETE\");\n            // 允许客户端提交的Header\n            String requestHeaders = httpServletRequest.getHeader(HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS);\n            if (StringUtils.isNotEmpty(requestHeaders)) {\n                httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, requestHeaders);\n            }\n            // 允许客户端携带凭证信息(是否允许发送Cookie)\n            httpServletResponse.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, \"true\");\n        }\n        // 跨域时会首先发送一个option请求，这里我们给option请求直接返回正常状态\n        if (RequestMethod.OPTIONS.name().equalsIgnoreCase(httpServletRequest.getMethod())) {\n            httpServletResponse.setStatus(HttpStatus.OK.value());\n            return false;\n        }\n        // 代码逻辑说明: 多租户用到\n        String tenantId = httpServletRequest.getHeader(CommonConstant.TENANT_ID);\n        TenantContext.setTenant(tenantId);\n\n        return super.preHandle(request, response);\n    }\n\n    /**\n     * JwtFilter中ThreadLocal需要及时清除 #3634\n     *\n     * @param request\n     * @param response\n     * @param exception\n     * @throws Exception\n     */\n    @Override\n    public void afterCompletion(ServletRequest request, ServletResponse response, Exception exception) throws Exception {\n        //log.info(\"------清空线程中多租户的ID={}------\",TenantContext.getTenant());\n        TenantContext.clear();\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/ResourceCheckFilter.java",
    "content": "package org.jeecg.config.shiro.filters;\n\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport org.apache.shiro.subject.Subject;\nimport org.apache.shiro.web.filter.AccessControlFilter;\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * @Author Scott\n * @create 2019-02-01 15:56\n * @desc 鉴权请求URL访问权限拦截器\n */\n@Slf4j\npublic class ResourceCheckFilter extends AccessControlFilter {\n\n    private String errorUrl;\n\n    public String getErrorUrl() {\n        return errorUrl;\n    }\n\n    public void setErrorUrl(String errorUrl) {\n        this.errorUrl = errorUrl;\n    }\n\n    /**\n     * 表示是否允许访问 ，如果允许访问返回true，否则false；\n     *\n     * @param servletRequest\n     * @param servletResponse\n     * @param o               表示写在拦截器中括号里面的字符串 mappedValue 就是 [urls] 配置中拦截器参数部分\n     * @return\n     * @throws Exception\n     */\n    @Override\n    protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {\n        Subject subject = getSubject(servletRequest, servletResponse);\n        String url = getPathWithinApplication(servletRequest);\n        log.info(\"当前用户正在访问的 url => \" + url);\n        return subject.isPermitted(url);\n    }\n\n    /**\n     * onAccessDenied：表示当访问拒绝时是否已经处理了； 如果返回 true 表示需要继续处理； 如果返回 false\n     * 表示该拦截器实例已经处理了，将直接返回即可。\n     *\n     * @param servletRequest\n     * @param servletResponse\n     * @return\n     * @throws Exception\n     */\n    @Override\n    protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {\n        log.info(\"当 isAccessAllowed 返回 false 的时候，才会执行 method onAccessDenied \");\n\n        HttpServletRequest request = (HttpServletRequest) servletRequest;\n        HttpServletResponse response = (HttpServletResponse) servletResponse;\n        response.sendRedirect(request.getContextPath() + this.errorUrl);\n\n        // 返回 false 表示已经处理，例如页面跳转啥的，表示不在走以下的拦截器了（如果还有配置的话）\n        return false;\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ignore/IgnoreAuthPostProcessor.java",
    "content": "package org.jeecg.config.shiro.ignore;\n\nimport lombok.AllArgsConstructor;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.config.shiro.IgnoreAuth;\nimport org.springframework.beans.factory.InitializingBean;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.stereotype.Component;\nimport org.springframework.util.CollectionUtils;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.method.HandlerMethod;\nimport org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;\n\nimport java.lang.reflect.Method;\nimport java.util.*;\nimport java.util.stream.Collectors;\n\n/**\n * 在spring boot初始化时，根据@RestController注解获取当前spring容器中的bean\n * @author eightmonth\n * @date 2024/4/18 11:35\n */\n@Slf4j\n@Lazy(false)\n@Component\n@AllArgsConstructor\npublic class IgnoreAuthPostProcessor implements InitializingBean {\n\n    private RequestMappingHandlerMapping requestMappingHandlerMapping;\n\n\n    @Override\n    public void afterPropertiesSet() throws Exception {\n\n        long startTime = System.currentTimeMillis();\n        \n        List<String> ignoreAuthUrls = new ArrayList<>();\n        \n        // 优化：直接从HandlerMethod过滤，避免重复扫描\n        requestMappingHandlerMapping.getHandlerMethods().values().stream()\n            .filter(handlerMethod -> handlerMethod.getMethod().isAnnotationPresent(IgnoreAuth.class))\n            .forEach(handlerMethod -> {\n                Class<?> clazz = handlerMethod.getBeanType();\n                Method method = handlerMethod.getMethod();\n                ignoreAuthUrls.addAll(processIgnoreAuthMethod(clazz, method));\n            });\n\n        log.info(\"Init Token ignoreAuthUrls Config [ 集合 ]  ：{}\", ignoreAuthUrls);\n        if (!CollectionUtils.isEmpty(ignoreAuthUrls)) {\n            InMemoryIgnoreAuth.set(ignoreAuthUrls);\n        }\n\n        // 计算方法的耗时\n        long endTime = System.currentTimeMillis();\n        long elapsedTime = endTime - startTime;\n        log.info(\"Init Token ignoreAuthUrls Config [ 耗时 ] ：\" + elapsedTime + \"ms\");\n    }\n\n    // 优化：新方法处理单个@IgnoreAuth方法，减少重复注解检查\n    private List<String> processIgnoreAuthMethod(Class<?> clazz, Method method) {\n        RequestMapping base = clazz.getAnnotation(RequestMapping.class);\n        String[] baseUrl = Objects.nonNull(base) ? base.value() : new String[]{};\n        \n        String[] uri = null;\n        if (method.isAnnotationPresent(RequestMapping.class)) {\n            uri = method.getAnnotation(RequestMapping.class).value();\n        } else if (method.isAnnotationPresent(GetMapping.class)) {\n            uri = method.getAnnotation(GetMapping.class).value();\n        } else if (method.isAnnotationPresent(PostMapping.class)) {\n            uri = method.getAnnotation(PostMapping.class).value();\n        } else if (method.isAnnotationPresent(PutMapping.class)) {\n            uri = method.getAnnotation(PutMapping.class).value();\n        } else if (method.isAnnotationPresent(DeleteMapping.class)) {\n            uri = method.getAnnotation(DeleteMapping.class).value();\n        } else if (method.isAnnotationPresent(PatchMapping.class)) {\n            uri = method.getAnnotation(PatchMapping.class).value();\n        }\n        \n        return uri != null ? rebuildUrl(baseUrl, uri) : Collections.emptyList();\n    }\n\n    private List<String> rebuildUrl(String[] bases, String[] uris) {\n        List<String> urls = new ArrayList<>();\n        if (bases.length > 0) {\n            for (String base : bases) {\n                for (String uri : uris) {\n                    // 如果uri包含路径占位符, 则需要将其替换为*\n                    if (uri.matches(\".*\\\\{.*}.*\")) {\n                        uri = uri.replaceAll(\"\\\\{.*?}\", \"*\");\n                    }\n                    urls.add(prefix(base) + prefix(uri));\n                }\n            }\n        } else {\n            Arrays.stream(uris).forEach(uri -> {\n                urls.add(prefix(uri));\n            });\n        }\n        return urls;\n    }\n\n    private String prefix(String seg) {\n        return seg.startsWith(\"/\") ? seg : \"/\"+seg;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ignore/InMemoryIgnoreAuth.java",
    "content": "package org.jeecg.config.shiro.ignore;\n\nimport org.springframework.util.AntPathMatcher;\nimport org.springframework.util.PathMatcher;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * 使用内存存储通过@IgnoreAuth注解的url，配合JwtFilter进行免登录校验\n * PS：无法使用ThreadLocal进行存储，因为ThreadLocal装载时，JwtFilter已经初始化完毕，导致该类获取ThreadLocal为空\n * @author eightmonth\n * @date 2024/4/18 15:02\n */\npublic class InMemoryIgnoreAuth {\n    private static final List<String> IGNORE_AUTH_LIST = new ArrayList<>();\n\n    private static PathMatcher MATCHER = new AntPathMatcher();\n    public InMemoryIgnoreAuth() {}\n\n    public static void set(List<String> list) {\n        IGNORE_AUTH_LIST.addAll(list);\n    }\n\n    public static List<String> get() {\n        return IGNORE_AUTH_LIST;\n    }\n\n    public static void clear() {\n        IGNORE_AUTH_LIST.clear();\n    }\n\n    public static boolean contains(String url) {\n        for (String ignoreAuth : IGNORE_AUTH_LIST) {\n            if(MATCHER.match(ignoreAuth,url)){\n                return true;\n            }\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/annotation/SignatureCheck.java",
    "content": "package org.jeecg.config.sign.annotation;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * 签名校验注解\n * 用于方法级别的签名验证，功能等同于yml中的jeecg.signUrls配置\n * 参考DragSignatureAspect的设计思路，使用AOP切面实现\n * \n * @author GitHub Copilot\n * @since 2025-12-15\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface SignatureCheck {\n    \n    /**\n     * 是否启用签名校验\n     * @return true-启用(默认), false-禁用\n     */\n    boolean enabled() default true;\n    \n    /**\n     * 签名校验失败时的错误消息\n     * @return 错误消息\n     */\n    String errorMessage() default \"Sign签名校验失败！\";\n    \n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/aspect/SignatureCheckAspect.java",
    "content": "package org.jeecg.config.sign.aspect;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.aspectj.lang.JoinPoint;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Before;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.aspectj.lang.reflect.MethodSignature;\nimport org.jeecg.config.sign.annotation.SignatureCheck;\nimport org.jeecg.config.sign.interceptor.SignAuthInterceptor;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.context.request.RequestContextHolder;\nimport org.springframework.web.context.request.ServletRequestAttributes;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport org.springframework.web.bind.annotation.RequestBody;\n\nimport java.lang.annotation.Annotation;\nimport java.lang.reflect.Method;\nimport java.util.Arrays;\n\n/**\n * 基于AOP的签名验证切面\n * 复用SignAuthInterceptor的成熟签名验证逻辑\n * \n * @author GitHub Copilot\n * @since 2025-12-15\n */\n@Aspect\n@Slf4j\n@Component(\"signatureCheckAspect\")\npublic class SignatureCheckAspect {\n    \n    /**\n     * 复用SignAuthInterceptor的签名验证逻辑\n     */\n    private final SignAuthInterceptor signAuthInterceptor = new SignAuthInterceptor();\n\n    /**\n     * 验签切点：拦截所有标记了@SignatureCheck注解的方法\n     */\n    @Pointcut(\"@annotation(org.jeecg.config.sign.annotation.SignatureCheck)\")\n    private void signatureCheckPointCut() {\n    }\n\n    /**\n     * 开始验签\n     */\n    @Before(\"signatureCheckPointCut()\")\n    public void doSignatureValidation(JoinPoint point) throws Exception {\n        // 获取方法上的注解\n        MethodSignature signature = (MethodSignature) point.getSignature();\n        Method method = signature.getMethod();\n        SignatureCheck signatureCheck = method.getAnnotation(SignatureCheck.class);\n        \n        log.info(\"AOP签名验证: {}.{}\", method.getDeclaringClass().getSimpleName(), method.getName());\n        \n        // 如果注解被禁用，直接返回\n        if (!signatureCheck.enabled()) {\n            log.info(\"签名验证已禁用，跳过\");\n            return;\n        }\n\n        // update-begin---author:sjlei---date:20260115 for: 查找带有@RequestBody注解的参数，解决签名校验时读取请求体为空的问题\n        Object bodyParam = null;\n        Object[] args = point.getArgs();\n        Annotation[][] parameterAnnotations = method.getParameterAnnotations();\n        for (int i = 0; i < args.length; i++) {\n            Object arg = args[i];\n            Annotation[] annotations = parameterAnnotations[i];\n            boolean hasRequestBodyAnnotation = Arrays.stream(annotations).anyMatch(annotation -> annotation.annotationType().equals(RequestBody.class));\n            if (hasRequestBodyAnnotation) {\n                // 捕获携带@RequestBody注解的参数，供签名校验使用\n                bodyParam = arg;\n            }\n        }\n        // update-end-----author:sjlei---date:20260115 for: 查找带有@RequestBody注解的参数，解决签名校验时读取请求体为空的问题\n\n        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();\n        if (attributes == null) {\n            log.error(\"无法获取请求上下文\");\n            throw new IllegalArgumentException(\"无法获取请求上下文\");\n        }\n        \n        HttpServletRequest request = attributes.getRequest();\n        log.info(\"X-SIGN: {}, X-TIMESTAMP: {}\", request.getHeader(\"X-SIGN\"), request.getHeader(\"X-TIMESTAMP\"));\n        \n        try {\n            // 直接调用SignAuthInterceptor的验证逻辑\n            signAuthInterceptor.validateSignature(request, bodyParam);\n            log.info(\"AOP签名验证通过\");\n            \n        } catch (IllegalArgumentException e) {\n            // 使用注解中配置的错误消息，或者保留原始错误消息\n            String errorMessage = signatureCheck.errorMessage();\n            log.error(\"AOP签名验证失败: {}\", e.getMessage());\n            \n            if (\"Sign签名校验失败！\".equals(errorMessage)) {\n                // 如果是默认错误消息，使用原始的详细错误信息\n                throw e;\n            } else {\n                // 如果是自定义错误消息，使用自定义消息\n                throw new IllegalArgumentException(errorMessage, e);\n            }\n        } catch (Exception e) {\n            // 包装其他异常\n            String errorMessage = signatureCheck.errorMessage();\n            log.error(\"AOP签名验证异常: {}\", e.getMessage());\n            throw new IllegalArgumentException(errorMessage, e);\n        }\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/interceptor/SignAuthConfiguration.java",
    "content": "package org.jeecg.config.sign.interceptor;\n\nimport org.apache.commons.lang3.StringUtils;\nimport org.jeecg.common.constant.TenantConstant;\nimport org.jeecg.common.util.PathMatcherUtil;\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.jeecg.config.filter.RequestBodyReserveFilter;\nimport org.springframework.boot.web.servlet.FilterRegistrationBean;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.web.servlet.config.annotation.InterceptorRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\n\nimport jakarta.annotation.Resource;\n\n/**\n * 签名 拦截器配置\n * @author: jeecg-boot\n */\n@Configuration\npublic class SignAuthConfiguration implements WebMvcConfigurer {\n    @Resource\n    JeecgBaseConfig jeecgBaseConfig;\n\n    @Bean\n    public SignAuthInterceptor signAuthInterceptor() {\n        return new SignAuthInterceptor();\n    }\n\n    @Override\n    public void addInterceptors(InterceptorRegistry registry) {\n        //------------------------------------------------------------\n        //查询需要进行签名拦截的接口 signUrls\n        String signUrls = jeecgBaseConfig.getSignUrls();\n        String[] signUrlsArray = null;\n        if (StringUtils.isNotBlank(signUrls)) {\n            signUrlsArray = signUrls.split(\",\");\n        } else {\n            signUrlsArray = PathMatcherUtil.SIGN_URL_LIST;\n        }\n        //------------------------------------------------------------\n        registry.addInterceptor(signAuthInterceptor()).addPathPatterns(signUrlsArray);\n    }\n\n    // 代码逻辑说明: issues/I53J5E post请求X_SIGN签名拦截校验后报错, request body 为空\n    @Bean\n    public RequestBodyReserveFilter requestBodyReserveFilter(){\n        return new RequestBodyReserveFilter();\n    }\n\n    @Bean\n    public FilterRegistrationBean reqBodyFilterRegistrationBean(){\n        FilterRegistrationBean registration = new FilterRegistrationBean();\n        registration.setFilter(requestBodyReserveFilter());\n        registration.setName(\"requestBodyReserveFilter\");\n        //------------------------------------------------------------\n        //查询需要进行签名拦截的接口 signUrls\n        String signUrls = jeecgBaseConfig.getSignUrls();\n        String[] signUrlsArray = null;\n        if (StringUtils.isNotBlank(signUrls)) {\n            signUrlsArray = signUrls.split(\",\");\n        } else {\n            signUrlsArray = PathMatcherUtil.SIGN_URL_LIST;\n        }\n        //------------------------------------------------------------\n        // 建议此处只添加post请求地址而不是所有的都需要走过滤器\n        registration.addUrlPatterns(signUrlsArray);\n        // 增加注解签名请求\n        registration.addUrlPatterns(TenantConstant.SIGNATURE_CHECK_POST_URL);\n        return registration;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/interceptor/SignAuthInterceptor.java",
    "content": "package org.jeecg.config.sign.interceptor;\n\n\nimport java.io.PrintWriter;\nimport java.util.SortedMap;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\n\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.util.DateUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.sign.util.BodyReaderHttpServletRequestWrapper;\nimport org.jeecg.config.sign.util.HttpUtils;\nimport org.jeecg.config.sign.util.SignUtil;\nimport org.springframework.web.servlet.HandlerInterceptor;\n\nimport com.alibaba.fastjson.JSON;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * 签名拦截器\n * @author qinfeng\n */\n@Slf4j\npublic class SignAuthInterceptor implements HandlerInterceptor {\n    /**\n     * 5分钟有效期\n     */\n    private final static long MAX_EXPIRE = 5 * 60;\n\n    @Override\n    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {\n        log.info(\"签名拦截器 Interceptor request URI = \" + request.getRequestURI());\n        \n        try {\n            // 调用验证逻辑\n            validateSignature(request);\n            return true;\n        } catch (IllegalArgumentException e) {\n            // 验证失败，返回错误响应\n            log.error(\"Sign 签名校验失败！{}\", e.getMessage());\n            response.setCharacterEncoding(\"UTF-8\");\n            response.setContentType(\"application/json; charset=utf-8\");\n            PrintWriter out = response.getWriter();\n            Result<?> result = Result.error(e.getMessage());\n            out.print(JSON.toJSON(result));\n            return false;\n        }\n    }\n\n    /**\n     * 签名验证核心逻辑\n     * 提取出来供AOP切面复用\n     * @param request HTTP请求\n     * @throws IllegalArgumentException 验证失败时抛出异常\n     */\n    public void validateSignature(HttpServletRequest request) throws IllegalArgumentException {\n        validateSignature(request, null);\n    }\n\n    /**\n     * 签名验证核心逻辑\n     * 提取出来供AOP切面复用\n     * @param request HTTP请求\n     * @throws IllegalArgumentException 验证失败时抛出异常\n     */\n    public void validateSignature(HttpServletRequest request, Object bodyParam) throws IllegalArgumentException {\n        try {\n            log.debug(\"开始签名验证: {} {}\", request.getMethod(), request.getRequestURI());\n            \n            HttpServletRequest requestWrapper = new BodyReaderHttpServletRequestWrapper(request);\n            //获取全部参数(包括URL和body上的)\n            SortedMap<String, String> allParams = HttpUtils.getAllParams(requestWrapper, bodyParam);\n            log.debug(\"提取参数: {}\", allParams);\n            \n            //对参数进行签名验证\n            String headerSign = request.getHeader(CommonConstant.X_SIGN);\n            String xTimestamp = request.getHeader(CommonConstant.X_TIMESTAMP);\n            \n            if(oConvertUtils.isEmpty(xTimestamp)){\n                log.error(\"Sign签名校验失败，时间戳为空！\");\n                throw new IllegalArgumentException(\"Sign签名校验失败，请求参数不完整！\");\n            }\n\n            //客户端时间\n            Long clientTimestamp = Long.parseLong(xTimestamp);\n\n            int length = 14;\n            int length1000 = 1000;\n            //1.校验签名时间（兼容X_TIMESTAMP的新老格式）\n            if (xTimestamp.length() == length) {\n                //a. X_TIMESTAMP格式是 yyyyMMddHHmmss (例子：20220308152143)\n                long currentTimestamp = DateUtils.getCurrentTimestamp();\n                long timeDiff = currentTimestamp - clientTimestamp;\n                log.debug(\"时间戳验证(yyyyMMddHHmmss): 时间差{}秒\", timeDiff);\n                \n                if (timeDiff > MAX_EXPIRE) {\n                    log.error(\"时间戳已过期: {}秒 > {}秒\", timeDiff, MAX_EXPIRE);\n                    throw new IllegalArgumentException(\"签名验证失败，请求时效性验证失败！\");\n                }\n            } else {\n                //b. X_TIMESTAMP格式是 时间戳 (例子：1646552406000)\n                long currentTime = System.currentTimeMillis();\n                long timeDiff = currentTime - clientTimestamp;\n                long maxExpireMs = MAX_EXPIRE * length1000;\n                log.debug(\"时间戳验证(Unix): 时间差{}ms\", timeDiff);\n                \n                if (timeDiff > maxExpireMs) {\n                    log.error(\"时间戳已过期: {}ms > {}ms\", timeDiff, maxExpireMs);\n                    throw new IllegalArgumentException(\"签名验证失败，请求时效性验证失败！\");\n                }\n            }\n\n            //2.校验签名\n            boolean isSigned = SignUtil.verifySign(allParams,headerSign);\n\n            if (isSigned) {\n                log.debug(\"签名验证通过\");\n            } else {\n                log.error(\"签名验证失败, 参数: {}\", allParams);\n                throw new IllegalArgumentException(\"Sign签名校验失败！\");\n            }\n        } catch (IllegalArgumentException e) {\n            // 重新抛出签名验证异常\n            throw e;\n        } catch (Exception e) {\n            // 包装其他异常（如IOException）\n            log.error(\"签名验证异常: {}\", e.getMessage());\n            throw new IllegalArgumentException(\"Sign签名校验失败：\" + e.getMessage());\n        }\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/util/BodyReaderHttpServletRequestWrapper.java",
    "content": "package org.jeecg.config.sign.util;\n\nimport jakarta.servlet.ReadListener;\nimport jakarta.servlet.ServletInputStream;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletRequestWrapper;\nimport java.io.*;\nimport java.nio.charset.Charset;\n\n/**\n * 保存过滤器里面的流\n * \n * @author jeecg\n * @date 20210621\n */\npublic class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {\n\n    private final byte[] body;\n\n    public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) {\n\n        super(request);\n        String sessionStream = getBodyString(request);\n        body = sessionStream.getBytes(Charset.forName(\"UTF-8\"));\n    }\n\n    /**\n     * 获取请求Body\n     *\n     * @param request\n     * @return\n     */\n    public String getBodyString(final ServletRequest request) {\n\n        StringBuilder sb = new StringBuilder();\n        try (InputStream inputStream = cloneInputStream(request.getInputStream());\n            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName(\"UTF-8\")))) {\n            String line;\n            while ((line = reader.readLine()) != null) {\n                sb.append(line);\n            }\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n        return sb.toString();\n    }\n\n    /**\n     * Description: 复制输入流</br>\n     *\n     * @param inputStream\n     * @return</br>\n     */\n    public InputStream cloneInputStream(ServletInputStream inputStream) {\n\n        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();\n        byte[] buffer = new byte[1024];\n        int len;\n        try {\n            while ((len = inputStream.read(buffer)) > -1) {\n                byteArrayOutputStream.write(buffer, 0, len);\n            }\n            byteArrayOutputStream.flush();\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n        return new ByteArrayInputStream(byteArrayOutputStream.toByteArray());\n    }\n\n    @Override\n    public BufferedReader getReader() {\n\n        return new BufferedReader(new InputStreamReader(getInputStream()));\n    }\n\n    @Override\n    public ServletInputStream getInputStream() {\n\n        final ByteArrayInputStream bais = new ByteArrayInputStream(body);\n        return new ServletInputStream() {\n\n            @Override\n            public int read() {\n\n                return bais.read();\n            }\n\n            @Override\n            public boolean isFinished() {\n\n                return false;\n            }\n\n            @Override\n            public boolean isReady() {\n\n                return false;\n            }\n\n            @Override\n            public void setReadListener(ReadListener readListener) {\n\n            }\n        };\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/util/HttpUtils.java",
    "content": "package org.jeecg.config.sign.util;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.InputStreamReader;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLDecoder;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.SortedMap;\nimport java.util.TreeMap;\n\nimport jakarta.servlet.http.HttpServletRequest;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.springframework.http.HttpMethod;\n\nimport com.alibaba.fastjson.JSONObject;\n\n/**\n * http 工具类 获取请求中的参数\n *\n * @author jeecg\n * @date 20210621\n */\n@Slf4j\npublic class HttpUtils {\n\n    /**\n     * 将URL的参数和body参数合并\n     *\n     * @author jeecg\n     * @date 20210621\n     * @param request\n     */\n    public static SortedMap<String, String> getAllParams(HttpServletRequest request, Object bodyParam) throws IOException {\n\n        SortedMap<String, String> result = new TreeMap<>();\n        // 获取URL上最后带逗号的参数变量 sys/dict/getDictItems/sys_user,realname,username\n        String pathVariable = request.getRequestURI().substring(request.getRequestURI().lastIndexOf(\"/\") + 1);\n        if (pathVariable.contains(SymbolConstant.COMMA)) {\n            log.debug(\" pathVariable: {}\",pathVariable);\n            String deString = URLDecoder.decode(pathVariable, \"UTF-8\");\n          \n            //https://www.52dianzi.com/category/article/37/565371.html\n            if(deString.contains(\"%\")){\n                try {\n                    deString = URLDecoder.decode(deString, \"UTF-8\");\n                    log.debug(\"存在%情况下，执行两次解码 — pathVariable decode: {}\",deString);\n                } catch (Exception e) {\n                    //e.printStackTrace();\n                }\n            }\n            log.debug(\" pathVariable decode: {}\",deString);\n            result.put(SignUtil.X_PATH_VARIABLE, deString);\n        }\n        // 获取URL上的参数\n        Map<String, String> urlParams = getUrlParams(request);\n        for (Map.Entry entry : urlParams.entrySet()) {\n            //不能直接转成String,否则会有类型转换错误\n            result.put((String)entry.getKey(), String.valueOf(entry.getValue()));\n        }\n        Map<String, String> allRequestParam = new HashMap<>(16);\n        // get请求不需要拿body参数\n        if (!HttpMethod.GET.name().equals(request.getMethod())) {\n            if (bodyParam != null) {\n                // update-begin---author:sjlei---date:20260115 for: 解决签名校验时读取请求体为空的问题\n                allRequestParam = JSONObject.parseObject(JSONObject.toJSONString(bodyParam), Map.class);\n                // update-end-----author:sjlei---date:20260115 for: 解决签名校验时读取请求体为空的问题\n            } else {\n                allRequestParam = getAllRequestParam(request);\n            }\n        }\n        // 将URL的参数和body参数进行合并\n        if (allRequestParam != null) {\n            for (Map.Entry entry : allRequestParam.entrySet()) {\n                //不能直接转成String,否则会有类型转换错误\n                result.put((String)entry.getKey(), String.valueOf(entry.getValue()));\n            }\n        }\n        return result;\n    }\n\n    /**\n     * 将URL的参数和body参数合并\n     *\n     * @author jeecg\n     * @date 20210621\n     * @param queryString\n     */\n    public static SortedMap<String, String> getAllParams(String url, String queryString, byte[] body, String method)\n        throws IOException {\n\n        SortedMap<String, String> result = new TreeMap<>();\n        // 获取URL上最后带逗号的参数变量 sys/dict/getDictItems/sys_user,realname,username\n        String pathVariable = url.substring(url.lastIndexOf(\"/\") + 1);\n        if (pathVariable.contains(SymbolConstant.COMMA)) {\n            log.debug(\" pathVariable: {}\",pathVariable);\n            String deString = URLDecoder.decode(pathVariable, \"UTF-8\");\n           \n            //https://www.52dianzi.com/category/article/37/565371.html\n            if(deString.contains(\"%\")){\n                deString = URLDecoder.decode(deString, \"UTF-8\");\n                log.debug(\"存在%情况下，执行两次解码 — pathVariable decode: {}\",deString);\n            }\n            log.debug(\" pathVariable decode: {}\",deString);\n            result.put(SignUtil.X_PATH_VARIABLE, deString);\n        }\n        // 获取URL上的参数\n        Map<String, String> urlParams = getUrlParams(queryString);\n        for (Map.Entry entry : urlParams.entrySet()) {\n            result.put((String)entry.getKey(), (String)entry.getValue());\n        }\n        Map<String, String> allRequestParam = new HashMap<>(16);\n        // get请求不需要拿body参数\n        if (!HttpMethod.GET.name().equals(method)) {\n            allRequestParam = getAllRequestParam(body);\n        }\n        // 将URL的参数和body参数进行合并\n        if (allRequestParam != null) {\n            for (Map.Entry entry : allRequestParam.entrySet()) {\n                result.put((String)entry.getKey(), (String)entry.getValue());\n            }\n        }\n        return result;\n    }\n\n    /**\n     * 获取 Body 参数\n     *\n     * @date 15:04 20210621\n     * @param request\n     */\n    public static Map<String, String> getAllRequestParam(final HttpServletRequest request) throws IOException {\n\n        BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));\n        String str = \"\";\n        StringBuilder wholeStr = new StringBuilder();\n        // 一行一行的读取body体里面的内容；\n        while ((str = reader.readLine()) != null) {\n            wholeStr.append(str);\n        }\n        // 转化成json对象\n        return JSONObject.parseObject(wholeStr.toString(), Map.class);\n    }\n\n    /**\n     * 获取 Body 参数\n     *\n     * @date 15:04 20210621\n     * @param body\n     */\n    public static Map<String, String> getAllRequestParam(final byte[] body) throws IOException {\n        if(body==null){\n            return null;\n        }\n        String wholeStr = new String(body);\n        // 转化成json对象\n        return JSONObject.parseObject(wholeStr.toString(), Map.class);\n    }\n\n    /**\n     * 将URL请求参数转换成Map\n     *\n     * @param request\n     */\n    public static Map<String, String> getUrlParams(HttpServletRequest request) {\n        Map<String, String> result = new HashMap<>(16);\n        if (oConvertUtils.isEmpty(request.getQueryString())) {\n            return result;\n        }\n        String param = \"\";\n        try {\n            param = URLDecoder.decode(request.getQueryString(), \"utf-8\");\n        } catch (UnsupportedEncodingException e) {\n            e.printStackTrace();\n        }\n        String[] params = param.split(\"&\");\n        for (String s : params) {\n            int index = s.indexOf(\"=\");\n            // 代码逻辑说明: [issues/5879]数据查询传ds=“”造成的异常------------\n            if (index != -1) {\n                result.put(s.substring(0, index), s.substring(index + 1));\n            }\n        }\n        return result;\n    }\n\n    /**\n     * 将URL请求参数转换成Map\n     * \n     * @param queryString\n     */\n    public static Map<String, String> getUrlParams(String queryString) {\n        Map<String, String> result = new HashMap<>(16);\n        if (oConvertUtils.isEmpty(queryString)) {\n            return result;\n        }\n        String param = \"\";\n        try {\n            param = URLDecoder.decode(queryString, \"utf-8\");\n        } catch (UnsupportedEncodingException e) {\n            e.printStackTrace();\n        }\n        String[] params = param.split(\"&\");\n        for (String s : params) {\n            int index = s.indexOf(\"=\");\n            // 代码逻辑说明: [issues/5879]数据查询传ds=“”造成的异常------------\n            if (index != -1) {\n                result.put(s.substring(0, index), s.substring(index + 1));\n            }\n        }\n        return result;\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/sign/util/SignUtil.java",
    "content": "package org.jeecg.config.sign.util;\n\nimport com.alibaba.fastjson.JSONObject;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.springframework.util.DigestUtils;\nimport org.springframework.util.StringUtils;\n\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLDecoder;\nimport java.nio.charset.StandardCharsets;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.SortedMap;\nimport java.util.TreeMap;\n\n/**\n * 签名工具类\n * \n * @author jeecg\n * @date 20210621\n */\n@Slf4j\npublic class SignUtil {\n    public static final String X_PATH_VARIABLE = \"x-path-variable\";\n\n    /**\n     * @param params\n     *            所有的请求参数都会在这里进行排序加密\n     * @return 验证签名结果\n     */\n    public static boolean verifySign(SortedMap<String, String> params,String headerSign) {\n        if (params == null || StringUtils.isEmpty(headerSign)) {\n            return false;\n        }\n        // 把参数加密\n        String paramsSign = getParamsSign(params);\n        log.debug(\"Param Sign : {}\", paramsSign);\n        return !StringUtils.isEmpty(paramsSign) && headerSign.equals(paramsSign);\n    }\n\n    /**\n     * @param params\n     *            所有的请求参数都会在这里进行排序加密\n     * @return 得到签名\n     */\n    public static String getParamsSign(SortedMap<String, String> params) {\n        //去掉 Url 里的时间戳\n        params.remove(\"_t\");\n        String paramsJsonStr = JSONObject.toJSONString(params);\n        log.debug(\"Param paramsJsonStr : {}\", paramsJsonStr);\n        //设置签名秘钥\n        String signatureSecret = SignUtil.getSignatureSecret();\n        try {\n            //【issues/I484RW】2.4.6部署后，下拉搜索框提示“sign签名检验失败”\n            return DigestUtils.md5DigestAsHex((paramsJsonStr + signatureSecret).getBytes(\"UTF-8\")).toUpperCase();\n        } catch (UnsupportedEncodingException e) {\n            log.error(e.getMessage(),e);\n            return null;\n        }\n    }\n\n    /**\n     * 通过前端签名算法生成签名\n     *\n     * @param url               请求的完整URL（包含查询参数）\n     * @param requestParams     使用 @RequestParam 获取的参数集合\n     * @param requestBodyParams 使用 @RequestBody 获取的参数集合\n     * @return 计算得到的签名（大写MD5），若参数不足返回 null\n     */\n    public static String generateRequestSign(String url, Map<String, Object> requestParams, Map<String, Object> requestBodyParams) {\n        if (oConvertUtils.isEmpty(url)) {\n            return null;\n        }\n        // 解析URL上的查询参数与路径变量\n        Map<String, String> urlParams = parseQueryString(url);\n        // 合并URL参数与@RequestParam参数，确保数值和布尔类型转换为字符串\n        Map<String, String> mergedParams = mergeObject(urlParams, requestParams);\n        // 按需合并@RequestBody参数\n        if (requestBodyParams != null && !requestBodyParams.isEmpty()) {\n            mergedParams = mergeObject(mergedParams, requestBodyParams);\n        }\n        // 按键名升序排序，保持与前端一致的签名顺序\n        SortedMap<String, String> sortedParams = new TreeMap<>(mergedParams);\n        // 去除时间戳字段，避免参与签名\n        sortedParams.remove(\"_t\");\n        // 序列化为JSON字符串\n        String paramsJsonStr = JSONObject.toJSONString(sortedParams);\n        // 读取签名秘钥\n        String signatureSecret = getSignatureSecret();\n        // 计算MD5摘要并转大写\n        return DigestUtils.md5DigestAsHex((paramsJsonStr + signatureSecret).getBytes(StandardCharsets.UTF_8)).toUpperCase();\n    }\n\n    /**\n     * 解析URL中的查询参数，并处理末尾逗号分隔的路径变量片段。\n     *\n     * @param url 请求的完整URL\n     * @return 解析后的参数映射，数值与布尔类型均转换为字符串\n     */\n    private static Map<String, String> parseQueryString(String url) {\n        Map<String, String> result = new HashMap<>(16);\n        int fragmentIndex = url.indexOf('#');\n        if (fragmentIndex >= 0) {\n            url = url.substring(0, fragmentIndex);\n        }\n        int questionIndex = url.indexOf('?');\n        String paramString = null;\n        if (questionIndex >= 0 && questionIndex < url.length() - 1) {\n            paramString = url.substring(questionIndex + 1);\n        }\n        // 处理路径变量末尾以逗号分隔的段，例如 /sys/dict/getDictItems/sys_user,realname,username\n        int lastSlashIndex = url.lastIndexOf(SymbolConstant.SINGLE_SLASH);\n        if (lastSlashIndex >= 0 && lastSlashIndex < url.length() - 1) {\n            String lastPathVariable = url.substring(lastSlashIndex + 1);\n            int qIndexInPath = lastPathVariable.indexOf('?');\n            if (qIndexInPath >= 0) {\n                lastPathVariable = lastPathVariable.substring(0, qIndexInPath);\n            }\n            if (lastPathVariable.contains(SymbolConstant.COMMA)) {\n                String decodedPathVariable = URLDecoder.decode(lastPathVariable, StandardCharsets.UTF_8);\n                result.put(X_PATH_VARIABLE, decodedPathVariable);\n            }\n        }\n        if (oConvertUtils.isNotEmpty(paramString)) {\n            String[] pairs = paramString.split(SymbolConstant.AND);\n            for (String pair : pairs) {\n                int equalIndex = pair.indexOf('=');\n                if (equalIndex > 0 && equalIndex < pair.length() - 1) {\n                    String key = pair.substring(0, equalIndex);\n                    String value = pair.substring(equalIndex + 1);\n                    // 解码并统一类型为字符串\n                    String decodedKey = URLDecoder.decode(key, StandardCharsets.UTF_8);\n                    String decodedValue = URLDecoder.decode(value, StandardCharsets.UTF_8);\n                    result.put(decodedKey, decodedValue);\n                }\n            }\n        }\n        return result;\n    }\n\n    /**\n     * 合并两个参数映射，并保证数值与布尔类型统一转为字符串。\n     *\n     * @param target 初始参数映射\n     * @param source 待合并的参数映射\n     * @return 合并后的新映射\n     */\n    private static Map<String, String> mergeObject(Map<String, String> target, Map<String, Object> source) {\n        Map<String, String> merged = new HashMap<>(16);\n        if (target != null && !target.isEmpty()) {\n            merged.putAll(target);\n        }\n        if (source != null && !source.isEmpty()) {\n            for (Map.Entry<String, Object> entry : source.entrySet()) {\n                String key = entry.getKey();\n                Object value = entry.getValue();\n                if (value instanceof Number) {\n                    // 数值类型转字符串，保持前后端一致\n                    merged.put(key, String.valueOf(value));\n                } else if (value instanceof Boolean) {\n                    // 布尔类型转字符串，保持前后端一致\n                    merged.put(key, String.valueOf(value));\n                } else if (value != null) {\n                    merged.put(key, String.valueOf(value));\n                }\n            }\n        }\n        return merged;\n    }\n\n    /**\n     * 读取并校验签名秘钥配置。\n     *\n     * @return 有效的签名秘钥\n     */\n    private static String getSignatureSecret() {\n        JeecgBaseConfig jeecgBaseConfig = SpringContextUtils.getBean(JeecgBaseConfig.class);\n        String signatureSecret = jeecgBaseConfig.getSignatureSecret();\n        String curlyBracket = SymbolConstant.DOLLAR + SymbolConstant.LEFT_CURLY_BRACKET;\n        if (oConvertUtils.isEmpty(signatureSecret) || signatureSecret.contains(curlyBracket)) {\n            throw new JeecgBootException(\"签名密钥 ${jeecg.signatureSecret} 缺少配置 ！！\");\n        }\n        return signatureSecret;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/tencent/JeecgTencent.java",
    "content": "package org.jeecg.config.tencent;\n\nimport lombok.Data;\n\n/**\n* @Description: 腾讯短信配置\n*\n* @author: wangshuai\n* @date: 2025/10/30 18:22\n*/\n@Data\npublic class JeecgTencent {\n\n    /**\n     * 接入域名\n     */\n    private String endpoint;\n    \n    /**\n     * api秘钥id\n     */\n    private String secretId;\n    \n    /**\n     * api秘钥key\n     */\n    private String secretKey;\n    \n    /**\n     * 应用id\n     */\n    private String sdkAppId;\n\n    /**\n     * 地域信息\n     */\n    private String region;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/vo/BaiduApi.java",
    "content": "package org.jeecg.config.vo;\n\nimport lombok.Data;\n\n/**\n * 百度开放api配置\n */\n@Data\npublic class BaiduApi {\n\n    private String appId;\n    private String apiKey;\n    private String secretKey;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/vo/DomainUrl.java",
    "content": "package org.jeecg.config.vo;\n\nimport lombok.Data;\n\n/**\n * @Author taoYan\n * @Date 2022/7/5 21:16\n **/\n@Data\npublic class DomainUrl {\n\n    private String pc;\n\n    private String app;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/vo/Elasticsearch.java",
    "content": "package org.jeecg.config.vo;\n\n/**\n * @author: scott\n * @date: 2023年05月10日 16:06\n */\npublic class Elasticsearch {\n    private String clusterNodes;\n    private boolean checkEnabled;\n\n    public String getClusterNodes() {\n        return clusterNodes;\n    }\n\n    public void setClusterNodes(String clusterNodes) {\n        this.clusterNodes = clusterNodes;\n    }\n\n    public boolean isCheckEnabled() {\n        return checkEnabled;\n    }\n\n    public void setCheckEnabled(boolean checkEnabled) {\n        this.checkEnabled = checkEnabled;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/vo/Firewall.java",
    "content": "package org.jeecg.config.vo;\n\n/**\n * 平台安全配置\n *\n * @author: scott\n * @date: 2023年09月05日 9:25\n */\npublic class Firewall {\n    /**\n     * 数据源安全 (开启后，Online报表和图表的数据源为必填)\n     */\n    private Boolean dataSourceSafe = false;\n    /**\n     * 是否禁止使用 * 查询所有字段\n     */\n    private Boolean disableSelectAll = false;\n    /**\n     * 低代码模式（dev:开发模式，prod:发布模式——关闭所有在线开发配置能力）\n     */\n    private String lowCodeMode;\n    /**\n     * 是否允许同一账号多地同时登录 （为 true 时允许一起登录, 为 false 时新登录挤掉旧登录）\n     */\n    private Boolean isConcurrent = true;\n    /**\n     * 是否开启默认密码登录提醒（true 登录后提示必须修改默认密码）\n     */\n    private Boolean enableDefaultPwdCheck = false;\n\n    /**\n     * 是否开启登录验证码校验（true 开启；false 关闭并跳过验证码逻辑）\n     */\n    private Boolean enableLoginCaptcha = true;\n\n//    /**\n//     * 表字典安全模式（white:白名单——配置了白名单的表才能通过表字典方式访问，black:黑名单——配置了黑名单的表不允许表字典方式访问）\n//     */\n//    private String tableDictMode;\n\n\n    public Boolean getEnableLoginCaptcha() {\n        return enableLoginCaptcha;\n    }\n\n    public void setEnableLoginCaptcha(Boolean enableLoginCaptcha) {\n        this.enableLoginCaptcha = enableLoginCaptcha;\n    }\n\n    public Boolean getEnableDefaultPwdCheck() {\n        return enableDefaultPwdCheck;\n    }\n\n    public void setEnableDefaultPwdCheck(Boolean enableDefaultPwdCheck) {\n        this.enableDefaultPwdCheck = enableDefaultPwdCheck;\n    }\n\n    public Boolean getDataSourceSafe() {\n        return dataSourceSafe;\n    }\n\n    public void setDataSourceSafe(Boolean dataSourceSafe) {\n        this.dataSourceSafe = dataSourceSafe;\n    }\n\n    public String getLowCodeMode() {\n        return lowCodeMode;\n    }\n\n    public void setLowCodeMode(String lowCodeMode) {\n        this.lowCodeMode = lowCodeMode;\n    }\n\n    public Boolean getDisableSelectAll() {\n        return disableSelectAll;\n    }\n\n    public void setDisableSelectAll(Boolean disableSelectAll) {\n        this.disableSelectAll = disableSelectAll;\n    }\n\n    public Boolean getIsConcurrent() {\n        return isConcurrent;\n    }\n\n    public void setIsConcurrent(Boolean isConcurrent) {\n        this.isConcurrent = isConcurrent;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/vo/GaoDeApi.java",
    "content": "package org.jeecg.config.vo;\n\nimport lombok.Data;\n\n/**\n* @Description: 高德开放api配置\n*\n* @author: wangshuai\n* @date: 2025/7/17 20:32\n*/\n@Data\npublic class GaoDeApi {\n    /**应用key*/\n    private String apiKey;\n    /**应用秘钥*/\n    private String secretKey;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/vo/JeecgMinio.java",
    "content": "package org.jeecg.config.vo;\n\nimport lombok.Data;\n\n@Data\npublic class JeecgMinio {\n\n    private String minio_url;\n    private String bucketName;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/vo/JeecgOSS.java",
    "content": "package org.jeecg.config.vo;\n\nimport lombok.Data;\n\n@Data\npublic class JeecgOSS {\n\n    private String endpoint;\n    private String bucketName;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/vo/Path.java",
    "content": "package org.jeecg.config.vo;\n\nimport javax.print.DocFlavor;\n\n/**\n *\n * @author: scott\n * @date: 2022年04月18日 20:35\n */\npublic class Path {\n    private String upload;\n    private String webapp;\n\n    public String getUpload() {\n        return upload;\n    }\n\n    public void setUpload(String upload) {\n        this.upload = upload;\n    }\n\n    public String getWebapp() {\n        return webapp;\n    }\n\n    public void setWebapp(String webapp) {\n        this.webapp = webapp;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/vo/Shiro.java",
    "content": "package org.jeecg.config.vo;\n\n/**\n * @Description: TODO\n * @author: scott\n * @date: 2022年01月21日 14:23\n */\npublic class Shiro {\n    private String excludeUrls = \"\";\n\n    public String getExcludeUrls() {\n        return excludeUrls;\n    }\n\n    public void setExcludeUrls(String excludeUrls) {\n        this.excludeUrls = excludeUrls;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/vo/WeiXinPay.java",
    "content": "package org.jeecg.config.vo;\n\nimport lombok.Data;\n\n@Data\npublic class WeiXinPay {\n    /**\n     * 微信公众号id\n     */\n    private String appId;\n    /**\n     * 商户号id\n     */\n    private String mchId;\n    /**\n     * 商户号秘钥\n     */\n    private String apiKey;\n    /**\n     * 回调地址\n     */\n    private String notifyUrl;\n    /**\n     * 是否开启会员认证\n     */\n    private Boolean openVipLimit;\n    /**\n     * 证书路径\n     */\n    private String certPath;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/BaseCommonMapper.java",
    "content": "package org.jeecg.modules.base.mapper;\n\nimport com.baomidou.mybatisplus.annotation.InterceptorIgnore;\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.common.api.dto.LogDTO;\n\n/**\n * @Description: BaseCommonMapper\n * @author: jeecg-boot\n */\npublic interface BaseCommonMapper {\n\n    /**\n     * 保存日志\n     * @param dto\n     */\n    @InterceptorIgnore(illegalSql = \"true\", tenantLine = \"true\")\n    void saveLog(@Param(\"dto\")LogDTO dto);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/BaseCommonMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.base.mapper.BaseCommonMapper\">\n\n    <!-- 保存日志11 -->\n    <insert id=\"saveLog\" parameterType=\"Object\">\n        insert into sys_log (id, log_type, log_content, method, operate_type, request_url, request_type, request_param, ip, userid, username, cost_time, create_time,create_by, tenant_id, client_type)\n        values(\n            #{dto.id,jdbcType=VARCHAR},\n            #{dto.logType,jdbcType=INTEGER},\n            #{dto.logContent,jdbcType=VARCHAR},\n            #{dto.method,jdbcType=VARCHAR},\n            #{dto.operateType,jdbcType=INTEGER},\n            #{dto.requestUrl,jdbcType=VARCHAR},\n            #{dto.requestType,jdbcType=VARCHAR},\n            #{dto.requestParam,jdbcType=VARCHAR},\n            #{dto.ip,jdbcType=VARCHAR},\n            #{dto.userid,jdbcType=VARCHAR},\n            #{dto.username,jdbcType=VARCHAR},\n            #{dto.costTime,jdbcType=BIGINT},\n            #{dto.createTime,jdbcType=TIMESTAMP},\n            #{dto.createBy,jdbcType=VARCHAR},\n            #{dto.tenantId,jdbcType=INTEGER},\n            #{dto.clientType,jdbcType=VARCHAR}\n        )\n    </insert>\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/service/BaseCommonService.java",
    "content": "package org.jeecg.modules.base.service;\n\nimport org.jeecg.common.api.dto.LogDTO;\nimport org.jeecg.common.system.vo.LoginUser;\n\n/**\n * common接口\n * @author: jeecg-boot\n */\npublic interface BaseCommonService {\n\n    /**\n     * 保存日志\n     * @param logDTO\n     */\n    void addLog(LogDTO logDTO);\n\n    /**\n     * 保存日志\n     * @param logContent\n     * @param logType\n     * @param operateType\n     * @param user\n     */\n    void addLog(String logContent, Integer logType, Integer operateType, LoginUser user);\n\n    /**\n     * 保存日志\n     * @param logContent\n     * @param logType\n     * @param operateType\n     */\n    void addLog(String logContent, Integer logType, Integer operateType);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/service/impl/BaseCommonServiceImpl.java",
    "content": "package org.jeecg.modules.base.service.impl;\n\nimport com.baomidou.mybatisplus.core.toolkit.IdWorker;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.api.dto.LogDTO;\nimport org.jeecg.common.constant.enums.ClientTerminalTypeEnum;\nimport org.jeecg.common.util.BrowserUtils;\nimport org.jeecg.modules.base.mapper.BaseCommonMapper;\nimport org.jeecg.modules.base.service.BaseCommonService;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.IpUtils;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.springframework.stereotype.Service;\n\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.util.*;\n\n/**\n * @Description: common实现类\n * @author: jeecg-boot\n */\n@Service\n@Slf4j\npublic class BaseCommonServiceImpl implements BaseCommonService {\n\n    @Resource\n    private BaseCommonMapper baseCommonMapper;\n\n    @Override\n    public void addLog(LogDTO logDTO) {\n        if(oConvertUtils.isEmpty(logDTO.getId())){\n            logDTO.setId(String.valueOf(IdWorker.getId()));\n        }\n        //保存日志（异常捕获处理，防止数据太大存储失败，导致业务失败）JT-238\n        try {   \n            logDTO.setCreateTime(new Date());\n            baseCommonMapper.saveLog(logDTO);\n        } catch (Exception e) {\n            log.warn(\" LogContent length : \"+logDTO.getLogContent().length());\n            log.warn(e.getMessage());\n        }\n    }\n\n    @Override\n    public void addLog(String logContent, Integer logType, Integer operatetype, LoginUser user) {\n        LogDTO sysLog = new LogDTO();\n        sysLog.setId(String.valueOf(IdWorker.getId()));\n        //注解上的描述,操作日志内容\n        sysLog.setLogContent(logContent);\n        sysLog.setLogType(logType);\n        sysLog.setOperateType(operatetype);\n        try {\n            //获取request\n            HttpServletRequest request = SpringContextUtils.getHttpServletRequest();\n            //设置IP地址\n            sysLog.setIp(IpUtils.getIpAddr(request));\n\n            try {\n                //设置客户端\n                if(BrowserUtils.isDesktop(request)){\n                    sysLog.setClientType(ClientTerminalTypeEnum.PC.getKey());\n                }else{\n                    sysLog.setClientType(ClientTerminalTypeEnum.APP.getKey());\n                }\n            } catch (Exception e) {\n                //e.printStackTrace();\n            }\n        } catch (Exception e) {\n            sysLog.setIp(\"127.0.0.1\");\n        }\n        //获取登录用户信息\n        if(user==null){\n            try {\n                user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n            } catch (Exception e) {\n                //e.printStackTrace();\n            }\n        }\n        if(user!=null){\n            sysLog.setUserid(user.getUsername());\n            sysLog.setUsername(user.getRealname());\n        }\n        sysLog.setCreateTime(new Date());\n        //保存日志（异常捕获处理，防止数据太大存储失败，导致业务失败）JT-238\n        try {\n            baseCommonMapper.saveLog(sysLog);\n        } catch (Exception e) {\n            log.warn(\" LogContent length : \"+sysLog.getLogContent().length());\n            log.warn(e.getMessage());\n        }\n    }\n\n    @Override\n    public void addLog(String logContent, Integer logType, Integer operateType) {\n        addLog(logContent, logType, operateType, null);\n    }\n\n\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/resources/META-INF/spring/org.springframework.boot.SpringApplicationRunListeners",
    "content": "org.jeecg.config.DruidWallConfigRegister"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/resources/META-INF/spring.factories",
    "content": "org.springframework.boot.SpringApplicationRunListener=\\\norg.jeecg.config.DruidWallConfigRegister"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/resources/config/default-spring-doc.properties",
    "content": "springdoc.auto-tag-classes: false\nspringdoc.packages-to-scan: org.jeecg"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/resources/static/pca.json",
    "content": "{\"86\":{\"110000\":\"北京市\",\"120000\":\"天津市\",\"130000\":\"河北省\",\"140000\":\"山西省\",\"150000\":\"内蒙古自治区\",\"210000\":\"辽宁省\",\"220000\":\"吉林省\",\"230000\":\"黑龙江省\",\"310000\":\"上海市\",\"320000\":\"江苏省\",\"330000\":\"浙江省\",\"340000\":\"安徽省\",\"350000\":\"福建省\",\"360000\":\"江西省\",\"370000\":\"山东省\",\"410000\":\"河南省\",\"420000\":\"湖北省\",\"430000\":\"湖南省\",\"440000\":\"广东省\",\"450000\":\"广西壮族自治区\",\"460000\":\"海南省\",\"500000\":\"重庆市\",\"510000\":\"四川省\",\"520000\":\"贵州省\",\"530000\":\"云南省\",\"540000\":\"西藏自治区\",\"610000\":\"陕西省\",\"620000\":\"甘肃省\",\"630000\":\"青海省\",\"640000\":\"宁夏回族自治区\",\"650000\":\"新疆维吾尔自治区\",\"710000\":\"台湾省\",\"810000\":\"香港特别行政区\",\"820000\":\"澳门特别行政区\"},\"110000\":{\"110100\":\"北京市\"},\"110100\":{\"110101\":\"东城区\",\"110102\":\"西城区\",\"110105\":\"朝阳区\",\"110106\":\"丰台区\",\"110107\":\"石景山区\",\"110108\":\"海淀区\",\"110109\":\"门头沟区\",\"110111\":\"房山区\",\"110112\":\"通州区\",\"110113\":\"顺义区\",\"110114\":\"昌平区\",\"110115\":\"大兴区\",\"110116\":\"怀柔区\",\"110117\":\"平谷区\",\"110118\":\"密云区\",\"110119\":\"延庆区\"},\"120000\":{\"120100\":\"天津市\"},\"120100\":{\"120101\":\"和平区\",\"120102\":\"河东区\",\"120103\":\"河西区\",\"120104\":\"南开区\",\"120105\":\"河北区\",\"120106\":\"红桥区\",\"120110\":\"东丽区\",\"120111\":\"西青区\",\"120112\":\"津南区\",\"120113\":\"北辰区\",\"120114\":\"武清区\",\"120115\":\"宝坻区\",\"120116\":\"滨海新区\",\"120117\":\"宁河区\",\"120118\":\"静海区\",\"120119\":\"蓟州区\"},\"130000\":{\"130100\":\"石家庄市\",\"130200\":\"唐山市\",\"130300\":\"秦皇岛市\",\"130400\":\"邯郸市\",\"130500\":\"邢台市\",\"130600\":\"保定市\",\"130700\":\"张家口市\",\"130800\":\"承德市\",\"130900\":\"沧州市\",\"131000\":\"廊坊市\",\"131100\":\"衡水市\"},\"130100\":{\"130102\":\"长安区\",\"130104\":\"桥西区\",\"130105\":\"新华区\",\"130107\":\"井陉矿区\",\"130108\":\"裕华区\",\"130109\":\"藁城区\",\"130110\":\"鹿泉区\",\"130111\":\"栾城区\",\"130121\":\"井陉县\",\"130123\":\"正定县\",\"130125\":\"行唐县\",\"130126\":\"灵寿县\",\"130127\":\"高邑县\",\"130128\":\"深泽县\",\"130129\":\"赞皇县\",\"130130\":\"无极县\",\"130131\":\"平山县\",\"130132\":\"元氏县\",\"130133\":\"赵县\",\"130171\":\"石家庄高新技术产业开发区\",\"130172\":\"石家庄循环化工园区\",\"130181\":\"辛集市\",\"130183\":\"晋州市\",\"130184\":\"新乐市\"},\"130200\":{\"130202\":\"路南区\",\"130203\":\"路北区\",\"130204\":\"古冶区\",\"130205\":\"开平区\",\"130207\":\"丰南区\",\"130208\":\"丰润区\",\"130209\":\"曹妃甸区\",\"130224\":\"滦南县\",\"130225\":\"乐亭县\",\"130227\":\"迁西县\",\"130229\":\"玉田县\",\"130273\":\"唐山高新技术产业开发区\",\"130274\":\"河北唐山海港经济开发区\",\"130281\":\"遵化市\",\"130283\":\"迁安市\",\"130284\":\"滦州市\"},\"130300\":{\"130302\":\"海港区\",\"130303\":\"山海关区\",\"130304\":\"北戴河区\",\"130306\":\"抚宁区\",\"130321\":\"青龙满族自治县\",\"130322\":\"昌黎县\",\"130324\":\"卢龙县\",\"130371\":\"秦皇岛市经济技术开发区\",\"130372\":\"北戴河新区\",\"130390\":\"经济技术开发区\"},\"130400\":{\"130402\":\"邯山区\",\"130403\":\"丛台区\",\"130404\":\"复兴区\",\"130406\":\"峰峰矿区\",\"130407\":\"肥乡区\",\"130408\":\"永年区\",\"130423\":\"临漳县\",\"130424\":\"成安县\",\"130425\":\"大名县\",\"130426\":\"涉县\",\"130427\":\"磁县\",\"130430\":\"邱县\",\"130431\":\"鸡泽县\",\"130432\":\"广平县\",\"130433\":\"馆陶县\",\"130434\":\"魏县\",\"130435\":\"曲周县\",\"130471\":\"邯郸经济技术开发区\",\"130473\":\"邯郸冀南新区\",\"130481\":\"武安市\"},\"130500\":{\"130502\":\"襄都区\",\"130503\":\"信都区\",\"130505\":\"任泽区\",\"130506\":\"南和区\",\"130522\":\"临城县\",\"130523\":\"内丘县\",\"130524\":\"柏乡县\",\"130525\":\"隆尧县\",\"130528\":\"宁晋县\",\"130529\":\"巨鹿县\",\"130530\":\"新河县\",\"130531\":\"广宗县\",\"130532\":\"平乡县\",\"130533\":\"威县\",\"130534\":\"清河县\",\"130535\":\"临西县\",\"130571\":\"河北邢台经济开发区\",\"130581\":\"南宫市\",\"130582\":\"沙河市\"},\"130600\":{\"130602\":\"竞秀区\",\"130606\":\"莲池区\",\"130607\":\"满城区\",\"130608\":\"清苑区\",\"130609\":\"徐水区\",\"130623\":\"涞水县\",\"130624\":\"阜平县\",\"130626\":\"定兴县\",\"130627\":\"唐县\",\"130628\":\"高阳县\",\"130629\":\"容城县\",\"130630\":\"涞源县\",\"130631\":\"望都县\",\"130632\":\"安新县\",\"130633\":\"易县\",\"130634\":\"曲阳县\",\"130635\":\"蠡县\",\"130636\":\"顺平县\",\"130637\":\"博野县\",\"130638\":\"雄县\",\"130671\":\"保定高新技术产业开发区\",\"130672\":\"保定白沟新城\",\"130681\":\"涿州市\",\"130682\":\"定州市\",\"130683\":\"安国市\",\"130684\":\"高碑店市\"},\"130700\":{\"130702\":\"桥东区\",\"130703\":\"桥西区\",\"130705\":\"宣化区\",\"130706\":\"下花园区\",\"130708\":\"万全区\",\"130709\":\"崇礼区\",\"130722\":\"张北县\",\"130723\":\"康保县\",\"130724\":\"沽源县\",\"130725\":\"尚义县\",\"130726\":\"蔚县\",\"130727\":\"阳原县\",\"130728\":\"怀安县\",\"130730\":\"怀来县\",\"130731\":\"涿鹿县\",\"130732\":\"赤城县\",\"130772\":\"张家口市察北管理区\"},\"130800\":{\"130802\":\"双桥区\",\"130803\":\"双滦区\",\"130804\":\"鹰手营子矿区\",\"130821\":\"承德县\",\"130822\":\"兴隆县\",\"130824\":\"滦平县\",\"130825\":\"隆化县\",\"130826\":\"丰宁满族自治县\",\"130827\":\"宽城满族自治县\",\"130828\":\"围场满族蒙古族自治县\",\"130871\":\"承德高新技术产业开发区\",\"130881\":\"平泉市\"},\"130900\":{\"130902\":\"新华区\",\"130903\":\"运河区\",\"130921\":\"沧县\",\"130922\":\"青县\",\"130923\":\"东光县\",\"130924\":\"海兴县\",\"130925\":\"盐山县\",\"130926\":\"肃宁县\",\"130927\":\"南皮县\",\"130928\":\"吴桥县\",\"130929\":\"献县\",\"130930\":\"孟村回族自治县\",\"130971\":\"河北沧州经济开发区\",\"130972\":\"沧州高新技术产业开发区\",\"130973\":\"沧州渤海新区\",\"130981\":\"泊头市\",\"130982\":\"任丘市\",\"130983\":\"黄骅市\",\"130984\":\"河间市\"},\"131000\":{\"131002\":\"安次区\",\"131003\":\"广阳区\",\"131022\":\"固安县\",\"131023\":\"永清县\",\"131024\":\"香河县\",\"131025\":\"大城县\",\"131026\":\"文安县\",\"131028\":\"大厂回族自治县\",\"131071\":\"廊坊经济技术开发区\",\"131081\":\"霸州市\",\"131082\":\"三河市\",\"131090\":\"开发区\"},\"131100\":{\"131102\":\"桃城区\",\"131103\":\"冀州区\",\"131121\":\"枣强县\",\"131122\":\"武邑县\",\"131123\":\"武强县\",\"131124\":\"饶阳县\",\"131125\":\"安平县\",\"131126\":\"故城县\",\"131127\":\"景县\",\"131128\":\"阜城县\",\"131171\":\"河北衡水经济开发区\",\"131172\":\"衡水滨湖新区\",\"131182\":\"深州市\"},\"140000\":{\"140100\":\"太原市\",\"140200\":\"大同市\",\"140300\":\"阳泉市\",\"140400\":\"长治市\",\"140500\":\"晋城市\",\"140600\":\"朔州市\",\"140700\":\"晋中市\",\"140800\":\"运城市\",\"140900\":\"忻州市\",\"141000\":\"临汾市\",\"141100\":\"吕梁市\"},\"140100\":{\"140105\":\"小店区\",\"140106\":\"迎泽区\",\"140107\":\"杏花岭区\",\"140108\":\"尖草坪区\",\"140109\":\"万柏林区\",\"140110\":\"晋源区\",\"140121\":\"清徐县\",\"140122\":\"阳曲县\",\"140123\":\"娄烦县\",\"140181\":\"古交市\"},\"140200\":{\"140212\":\"新荣区\",\"140213\":\"平城区\",\"140214\":\"云冈区\",\"140215\":\"云州区\",\"140221\":\"阳高县\",\"140222\":\"天镇县\",\"140223\":\"广灵县\",\"140224\":\"灵丘县\",\"140225\":\"浑源县\",\"140226\":\"左云县\",\"140271\":\"山西大同经济开发区\"},\"140300\":{\"140302\":\"城区\",\"140303\":\"矿区\",\"140311\":\"郊区\",\"140321\":\"平定县\",\"140322\":\"盂县\"},\"140400\":{\"140403\":\"潞州区\",\"140404\":\"上党区\",\"140405\":\"屯留区\",\"140406\":\"潞城区\",\"140423\":\"襄垣县\",\"140425\":\"平顺县\",\"140426\":\"黎城县\",\"140427\":\"壶关县\",\"140428\":\"长子县\",\"140429\":\"武乡县\",\"140430\":\"沁县\",\"140431\":\"沁源县\",\"140471\":\"山西长治高新技术产业园区\"},\"140500\":{\"140502\":\"城区\",\"140521\":\"沁水县\",\"140522\":\"阳城县\",\"140524\":\"陵川县\",\"140525\":\"泽州县\",\"140581\":\"高平市\"},\"140600\":{\"140602\":\"朔城区\",\"140603\":\"平鲁区\",\"140621\":\"山阴县\",\"140622\":\"应县\",\"140623\":\"右玉县\",\"140671\":\"山西朔州经济开发区\",\"140681\":\"怀仁市\"},\"140700\":{\"140702\":\"榆次区\",\"140703\":\"太谷区\",\"140721\":\"榆社县\",\"140722\":\"左权县\",\"140723\":\"和顺县\",\"140724\":\"昔阳县\",\"140725\":\"寿阳县\",\"140727\":\"祁县\",\"140728\":\"平遥县\",\"140729\":\"灵石县\",\"140781\":\"介休市\"},\"140800\":{\"140802\":\"盐湖区\",\"140821\":\"临猗县\",\"140822\":\"万荣县\",\"140823\":\"闻喜县\",\"140824\":\"稷山县\",\"140825\":\"新绛县\",\"140826\":\"绛县\",\"140827\":\"垣曲县\",\"140828\":\"夏县\",\"140829\":\"平陆县\",\"140830\":\"芮城县\",\"140881\":\"永济市\",\"140882\":\"河津市\"},\"140900\":{\"140902\":\"忻府区\",\"140921\":\"定襄县\",\"140922\":\"五台县\",\"140923\":\"代县\",\"140924\":\"繁峙县\",\"140925\":\"宁武县\",\"140926\":\"静乐县\",\"140927\":\"神池县\",\"140928\":\"五寨县\",\"140929\":\"岢岚县\",\"140930\":\"河曲县\",\"140931\":\"保德县\",\"140932\":\"偏关县\",\"140971\":\"五台山风景名胜区\",\"140981\":\"原平市\"},\"141000\":{\"141002\":\"尧都区\",\"141021\":\"曲沃县\",\"141022\":\"翼城县\",\"141023\":\"襄汾县\",\"141024\":\"洪洞县\",\"141025\":\"古县\",\"141026\":\"安泽县\",\"141027\":\"浮山县\",\"141028\":\"吉县\",\"141029\":\"乡宁县\",\"141030\":\"大宁县\",\"141031\":\"隰县\",\"141032\":\"永和县\",\"141033\":\"蒲县\",\"141034\":\"汾西县\",\"141081\":\"侯马市\",\"141082\":\"霍州市\"},\"141100\":{\"141102\":\"离石区\",\"141121\":\"文水县\",\"141122\":\"交城县\",\"141123\":\"兴县\",\"141124\":\"临县\",\"141125\":\"柳林县\",\"141126\":\"石楼县\",\"141127\":\"岚县\",\"141128\":\"方山县\",\"141129\":\"中阳县\",\"141130\":\"交口县\",\"141181\":\"孝义市\",\"141182\":\"汾阳市\"},\"150000\":{\"150100\":\"呼和浩特市\",\"150200\":\"包头市\",\"150300\":\"乌海市\",\"150400\":\"赤峰市\",\"150500\":\"通辽市\",\"150600\":\"鄂尔多斯市\",\"150700\":\"呼伦贝尔市\",\"150800\":\"巴彦淖尔市\",\"150900\":\"乌兰察布市\",\"152200\":\"兴安盟\",\"152500\":\"锡林郭勒盟\",\"152900\":\"阿拉善盟\"},\"150100\":{\"150102\":\"新城区\",\"150103\":\"回民区\",\"150104\":\"玉泉区\",\"150105\":\"赛罕区\",\"150121\":\"土默特左旗\",\"150122\":\"托克托县\",\"150123\":\"和林格尔县\",\"150124\":\"清水河县\",\"150125\":\"武川县\",\"150172\":\"呼和浩特经济技术开发区\"},\"150200\":{\"150202\":\"东河区\",\"150203\":\"昆都仑区\",\"150204\":\"青山区\",\"150205\":\"石拐区\",\"150206\":\"白云鄂博矿区\",\"150207\":\"九原区\",\"150221\":\"土默特右旗\",\"150222\":\"固阳县\",\"150223\":\"达尔罕茂明安联合旗\",\"150271\":\"包头稀土高新技术产业开发区\"},\"150300\":{\"150302\":\"海勃湾区\",\"150303\":\"海南区\",\"150304\":\"乌达区\"},\"150400\":{\"150402\":\"红山区\",\"150403\":\"元宝山区\",\"150404\":\"松山区\",\"150421\":\"阿鲁科尔沁旗\",\"150422\":\"巴林左旗\",\"150423\":\"巴林右旗\",\"150424\":\"林西县\",\"150425\":\"克什克腾旗\",\"150426\":\"翁牛特旗\",\"150428\":\"喀喇沁旗\",\"150429\":\"宁城县\",\"150430\":\"敖汉旗\"},\"150500\":{\"150502\":\"科尔沁区\",\"150521\":\"科尔沁左翼中旗\",\"150522\":\"科尔沁左翼后旗\",\"150523\":\"开鲁县\",\"150524\":\"库伦旗\",\"150525\":\"奈曼旗\",\"150526\":\"扎鲁特旗\",\"150571\":\"通辽经济技术开发区\",\"150581\":\"霍林郭勒市\"},\"150600\":{\"150602\":\"东胜区\",\"150603\":\"康巴什区\",\"150621\":\"达拉特旗\",\"150622\":\"准格尔旗\",\"150623\":\"鄂托克前旗\",\"150624\":\"鄂托克旗\",\"150625\":\"杭锦旗\",\"150626\":\"乌审旗\",\"150627\":\"伊金霍洛旗\"},\"150700\":{\"150702\":\"海拉尔区\",\"150703\":\"扎赉诺尔区\",\"150721\":\"阿荣旗\",\"150722\":\"莫力达瓦达斡尔族自治旗\",\"150723\":\"鄂伦春自治旗\",\"150724\":\"鄂温克族自治旗\",\"150725\":\"陈巴尔虎旗\",\"150726\":\"新巴尔虎左旗\",\"150727\":\"新巴尔虎右旗\",\"150781\":\"满洲里市\",\"150782\":\"牙克石市\",\"150783\":\"扎兰屯市\",\"150784\":\"额尔古纳市\",\"150785\":\"根河市\"},\"150800\":{\"150802\":\"临河区\",\"150821\":\"五原县\",\"150822\":\"磴口县\",\"150823\":\"乌拉特前旗\",\"150824\":\"乌拉特中旗\",\"150825\":\"乌拉特后旗\",\"150826\":\"杭锦后旗\"},\"150900\":{\"150902\":\"集宁区\",\"150921\":\"卓资县\",\"150922\":\"化德县\",\"150923\":\"商都县\",\"150924\":\"兴和县\",\"150925\":\"凉城县\",\"150926\":\"察哈尔右翼前旗\",\"150927\":\"察哈尔右翼中旗\",\"150928\":\"察哈尔右翼后旗\",\"150929\":\"四子王旗\",\"150981\":\"丰镇市\"},\"152200\":{\"152201\":\"乌兰浩特市\",\"152202\":\"阿尔山市\",\"152221\":\"科尔沁右翼前旗\",\"152222\":\"科尔沁右翼中旗\",\"152223\":\"扎赉特旗\",\"152224\":\"突泉县\"},\"152500\":{\"152501\":\"二连浩特市\",\"152502\":\"锡林浩特市\",\"152522\":\"阿巴嘎旗\",\"152523\":\"苏尼特左旗\",\"152524\":\"苏尼特右旗\",\"152525\":\"东乌珠穆沁旗\",\"152526\":\"西乌珠穆沁旗\",\"152527\":\"太仆寺旗\",\"152528\":\"镶黄旗\",\"152529\":\"正镶白旗\",\"152530\":\"正蓝旗\",\"152531\":\"多伦县\",\"152571\":\"乌拉盖管委会\"},\"152900\":{\"152921\":\"阿拉善左旗\",\"152922\":\"阿拉善右旗\",\"152923\":\"额济纳旗\",\"152971\":\"内蒙古阿拉善经济开发区\"},\"210000\":{\"210100\":\"沈阳市\",\"210200\":\"大连市\",\"210300\":\"鞍山市\",\"210400\":\"抚顺市\",\"210500\":\"本溪市\",\"210600\":\"丹东市\",\"210700\":\"锦州市\",\"210800\":\"营口市\",\"210900\":\"阜新市\",\"211000\":\"辽阳市\",\"211100\":\"盘锦市\",\"211200\":\"铁岭市\",\"211300\":\"朝阳市\",\"211400\":\"葫芦岛市\"},\"210100\":{\"210102\":\"和平区\",\"210103\":\"沈河区\",\"210104\":\"大东区\",\"210105\":\"皇姑区\",\"210106\":\"铁西区\",\"210111\":\"苏家屯区\",\"210112\":\"浑南区\",\"210113\":\"沈北新区\",\"210114\":\"于洪区\",\"210115\":\"辽中区\",\"210123\":\"康平县\",\"210124\":\"法库县\",\"210181\":\"新民市\",\"210190\":\"经济技术开发区\"},\"210200\":{\"210202\":\"中山区\",\"210203\":\"西岗区\",\"210204\":\"沙河口区\",\"210211\":\"甘井子区\",\"210212\":\"旅顺口区\",\"210213\":\"金州区\",\"210214\":\"普兰店区\",\"210224\":\"长海县\",\"210281\":\"瓦房店市\",\"210283\":\"庄河市\"},\"210300\":{\"210302\":\"铁东区\",\"210303\":\"铁西区\",\"210304\":\"立山区\",\"210311\":\"千山区\",\"210321\":\"台安县\",\"210323\":\"岫岩满族自治县\",\"210381\":\"海城市\",\"210390\":\"高新区\"},\"210400\":{\"210402\":\"新抚区\",\"210403\":\"东洲区\",\"210404\":\"望花区\",\"210411\":\"顺城区\",\"210421\":\"抚顺县\",\"210422\":\"新宾满族自治县\",\"210423\":\"清原满族自治县\"},\"210500\":{\"210502\":\"平山区\",\"210503\":\"溪湖区\",\"210504\":\"明山区\",\"210505\":\"南芬区\",\"210521\":\"本溪满族自治县\",\"210522\":\"桓仁满族自治县\"},\"210600\":{\"210602\":\"元宝区\",\"210603\":\"振兴区\",\"210604\":\"振安区\",\"210624\":\"宽甸满族自治县\",\"210681\":\"东港市\",\"210682\":\"凤城市\"},\"210700\":{\"210702\":\"古塔区\",\"210703\":\"凌河区\",\"210711\":\"太和区\",\"210726\":\"黑山县\",\"210727\":\"义县\",\"210781\":\"凌海市\",\"210782\":\"北镇市\",\"210793\":\"经济技术开发区\"},\"210800\":{\"210802\":\"站前区\",\"210803\":\"西市区\",\"210804\":\"鲅鱼圈区\",\"210811\":\"老边区\",\"210881\":\"盖州市\",\"210882\":\"大石桥市\"},\"210900\":{\"210902\":\"海州区\",\"210903\":\"新邱区\",\"210904\":\"太平区\",\"210905\":\"清河门区\",\"210911\":\"细河区\",\"210921\":\"阜新蒙古族自治县\",\"210922\":\"彰武县\"},\"211000\":{\"211002\":\"白塔区\",\"211003\":\"文圣区\",\"211004\":\"宏伟区\",\"211005\":\"弓长岭区\",\"211011\":\"太子河区\",\"211021\":\"辽阳县\",\"211081\":\"灯塔市\"},\"211100\":{\"211102\":\"双台子区\",\"211103\":\"兴隆台区\",\"211104\":\"大洼区\",\"211122\":\"盘山县\"},\"211200\":{\"211202\":\"银州区\",\"211204\":\"清河区\",\"211221\":\"铁岭县\",\"211223\":\"西丰县\",\"211224\":\"昌图县\",\"211281\":\"调兵山市\",\"211282\":\"开原市\"},\"211300\":{\"211302\":\"双塔区\",\"211303\":\"龙城区\",\"211321\":\"朝阳县\",\"211322\":\"建平县\",\"211324\":\"喀喇沁左翼蒙古族自治县\",\"211381\":\"北票市\",\"211382\":\"凌源市\"},\"211400\":{\"211402\":\"连山区\",\"211403\":\"龙港区\",\"211404\":\"南票区\",\"211421\":\"绥中县\",\"211422\":\"建昌县\",\"211481\":\"兴城市\"},\"220000\":{\"220100\":\"长春市\",\"220200\":\"吉林市\",\"220300\":\"四平市\",\"220400\":\"辽源市\",\"220500\":\"通化市\",\"220600\":\"白山市\",\"220700\":\"松原市\",\"220800\":\"白城市\",\"222400\":\"延边朝鲜族自治州\"},\"220100\":{\"220102\":\"南关区\",\"220103\":\"宽城区\",\"220104\":\"朝阳区\",\"220105\":\"二道区\",\"220106\":\"绿园区\",\"220112\":\"双阳区\",\"220113\":\"九台区\",\"220122\":\"农安县\",\"220171\":\"长春经济技术开发区\",\"220172\":\"长春净月高新技术产业开发区\",\"220173\":\"长春高新技术产业开发区\",\"220174\":\"长春汽车经济技术开发区\",\"220182\":\"榆树市\",\"220183\":\"德惠市\",\"220192\":\"经济技术开发区\"},\"220200\":{\"220202\":\"昌邑区\",\"220203\":\"龙潭区\",\"220204\":\"船营区\",\"220211\":\"丰满区\",\"220221\":\"永吉县\",\"220271\":\"吉林经济开发区\",\"220272\":\"吉林高新技术产业开发区\",\"220281\":\"蛟河市\",\"220282\":\"桦甸市\",\"220283\":\"舒兰市\",\"220284\":\"磐石市\"},\"220300\":{\"220302\":\"铁西区\",\"220303\":\"铁东区\",\"220322\":\"梨树县\",\"220323\":\"伊通满族自治县\",\"220381\":\"公主岭市\",\"220382\":\"双辽市\"},\"220400\":{\"220402\":\"龙山区\",\"220403\":\"西安区\",\"220421\":\"东丰县\",\"220422\":\"东辽县\"},\"220500\":{\"220502\":\"东昌区\",\"220503\":\"二道江区\",\"220521\":\"通化县\",\"220523\":\"辉南县\",\"220524\":\"柳河县\",\"220581\":\"梅河口市\",\"220582\":\"集安市\"},\"220600\":{\"220602\":\"浑江区\",\"220605\":\"江源区\",\"220621\":\"抚松县\",\"220622\":\"靖宇县\",\"220623\":\"长白朝鲜族自治县\",\"220681\":\"临江市\"},\"220700\":{\"220702\":\"宁江区\",\"220721\":\"前郭尔罗斯蒙古族自治县\",\"220722\":\"长岭县\",\"220723\":\"乾安县\",\"220771\":\"吉林松原经济开发区\",\"220781\":\"扶余市\"},\"220800\":{\"220802\":\"洮北区\",\"220821\":\"镇赉县\",\"220822\":\"通榆县\",\"220871\":\"吉林白城经济开发区\",\"220881\":\"洮南市\",\"220882\":\"大安市\"},\"222400\":{\"222401\":\"延吉市\",\"222402\":\"图们市\",\"222403\":\"敦化市\",\"222404\":\"珲春市\",\"222405\":\"龙井市\",\"222406\":\"和龙市\",\"222424\":\"汪清县\",\"222426\":\"安图县\"},\"230000\":{\"230100\":\"哈尔滨市\",\"230200\":\"齐齐哈尔市\",\"230300\":\"鸡西市\",\"230400\":\"鹤岗市\",\"230500\":\"双鸭山市\",\"230600\":\"大庆市\",\"230700\":\"伊春市\",\"230800\":\"佳木斯市\",\"230900\":\"七台河市\",\"231000\":\"牡丹江市\",\"231100\":\"黑河市\",\"231200\":\"绥化市\",\"232700\":\"大兴安岭地区\"},\"230100\":{\"230102\":\"道里区\",\"230103\":\"南岗区\",\"230104\":\"道外区\",\"230108\":\"平房区\",\"230109\":\"松北区\",\"230110\":\"香坊区\",\"230111\":\"呼兰区\",\"230112\":\"阿城区\",\"230113\":\"双城区\",\"230123\":\"依兰县\",\"230124\":\"方正县\",\"230125\":\"宾县\",\"230126\":\"巴彦县\",\"230127\":\"木兰县\",\"230128\":\"通河县\",\"230129\":\"延寿县\",\"230183\":\"尚志市\",\"230184\":\"五常市\"},\"230200\":{\"230202\":\"龙沙区\",\"230203\":\"建华区\",\"230204\":\"铁锋区\",\"230205\":\"昂昂溪区\",\"230206\":\"富拉尔基区\",\"230207\":\"碾子山区\",\"230208\":\"梅里斯达斡尔族区\",\"230221\":\"龙江县\",\"230223\":\"依安县\",\"230224\":\"泰来县\",\"230225\":\"甘南县\",\"230227\":\"富裕县\",\"230229\":\"克山县\",\"230230\":\"克东县\",\"230231\":\"拜泉县\",\"230281\":\"讷河市\"},\"230300\":{\"230302\":\"鸡冠区\",\"230303\":\"恒山区\",\"230304\":\"滴道区\",\"230305\":\"梨树区\",\"230306\":\"城子河区\",\"230307\":\"麻山区\",\"230321\":\"鸡东县\",\"230381\":\"虎林市\",\"230382\":\"密山市\"},\"230400\":{\"230402\":\"向阳区\",\"230403\":\"工农区\",\"230404\":\"南山区\",\"230405\":\"兴安区\",\"230406\":\"东山区\",\"230407\":\"兴山区\",\"230421\":\"萝北县\",\"230422\":\"绥滨县\"},\"230500\":{\"230502\":\"尖山区\",\"230503\":\"岭东区\",\"230505\":\"四方台区\",\"230506\":\"宝山区\",\"230521\":\"集贤县\",\"230522\":\"友谊县\",\"230523\":\"宝清县\",\"230524\":\"饶河县\"},\"230600\":{\"230602\":\"萨尔图区\",\"230603\":\"龙凤区\",\"230604\":\"让胡路区\",\"230605\":\"红岗区\",\"230606\":\"大同区\",\"230621\":\"肇州县\",\"230622\":\"肇源县\",\"230623\":\"林甸县\",\"230624\":\"杜尔伯特蒙古族自治县\",\"230671\":\"大庆高新技术产业开发区\"},\"230700\":{\"230717\":\"伊美区\",\"230718\":\"乌翠区\",\"230719\":\"友好区\",\"230722\":\"嘉荫县\",\"230723\":\"汤旺县\",\"230724\":\"丰林县\",\"230725\":\"大箐山县\",\"230726\":\"南岔县\",\"230751\":\"金林区\",\"230781\":\"铁力市\"},\"230800\":{\"230803\":\"向阳区\",\"230804\":\"前进区\",\"230805\":\"东风区\",\"230811\":\"郊区\",\"230822\":\"桦南县\",\"230826\":\"桦川县\",\"230828\":\"汤原县\",\"230881\":\"同江市\",\"230882\":\"富锦市\",\"230883\":\"抚远市\"},\"230900\":{\"230902\":\"新兴区\",\"230903\":\"桃山区\",\"230904\":\"茄子河区\",\"230921\":\"勃利县\"},\"231000\":{\"231002\":\"东安区\",\"231003\":\"阳明区\",\"231004\":\"爱民区\",\"231005\":\"西安区\",\"231025\":\"林口县\",\"231081\":\"绥芬河市\",\"231083\":\"海林市\",\"231084\":\"宁安市\",\"231085\":\"穆棱市\",\"231086\":\"东宁市\"},\"231100\":{\"231102\":\"爱辉区\",\"231123\":\"逊克县\",\"231124\":\"孙吴县\",\"231181\":\"北安市\",\"231182\":\"五大连池市\",\"231183\":\"嫩江市\"},\"231200\":{\"231202\":\"北林区\",\"231221\":\"望奎县\",\"231222\":\"兰西县\",\"231223\":\"青冈县\",\"231224\":\"庆安县\",\"231225\":\"明水县\",\"231226\":\"绥棱县\",\"231281\":\"安达市\",\"231282\":\"肇东市\",\"231283\":\"海伦市\"},\"232700\":{\"232701\":\"漠河市\",\"232721\":\"呼玛县\",\"232722\":\"塔河县\",\"232761\":\"加格达奇区\",\"232762\":\"松岭区\",\"232763\":\"新林区\",\"232764\":\"呼中区\"},\"310000\":{\"310100\":\"上海市\"},\"310100\":{\"310101\":\"黄浦区\",\"310104\":\"徐汇区\",\"310105\":\"长宁区\",\"310106\":\"静安区\",\"310107\":\"普陀区\",\"310109\":\"虹口区\",\"310110\":\"杨浦区\",\"310112\":\"闵行区\",\"310113\":\"宝山区\",\"310114\":\"嘉定区\",\"310115\":\"浦东新区\",\"310116\":\"金山区\",\"310117\":\"松江区\",\"310118\":\"青浦区\",\"310120\":\"奉贤区\",\"310151\":\"崇明区\"},\"320000\":{\"320100\":\"南京市\",\"320200\":\"无锡市\",\"320300\":\"徐州市\",\"320400\":\"常州市\",\"320500\":\"苏州市\",\"320600\":\"南通市\",\"320700\":\"连云港市\",\"320800\":\"淮安市\",\"320900\":\"盐城市\",\"321000\":\"扬州市\",\"321100\":\"镇江市\",\"321200\":\"泰州市\",\"321300\":\"宿迁市\"},\"320100\":{\"320102\":\"玄武区\",\"320104\":\"秦淮区\",\"320105\":\"建邺区\",\"320106\":\"鼓楼区\",\"320111\":\"浦口区\",\"320112\":\"江北新区\",\"320113\":\"栖霞区\",\"320114\":\"雨花台区\",\"320115\":\"江宁区\",\"320116\":\"六合区\",\"320117\":\"溧水区\",\"320118\":\"高淳区\"},\"320200\":{\"320205\":\"锡山区\",\"320206\":\"惠山区\",\"320211\":\"滨湖区\",\"320213\":\"梁溪区\",\"320214\":\"新吴区\",\"320281\":\"江阴市\",\"320282\":\"宜兴市\"},\"320300\":{\"320302\":\"鼓楼区\",\"320303\":\"云龙区\",\"320305\":\"贾汪区\",\"320311\":\"泉山区\",\"320312\":\"铜山区\",\"320321\":\"丰县\",\"320322\":\"沛县\",\"320324\":\"睢宁县\",\"320371\":\"徐州经济技术开发区\",\"320381\":\"新沂市\",\"320382\":\"邳州市\",\"320391\":\"工业园区\"},\"320400\":{\"320402\":\"天宁区\",\"320404\":\"钟楼区\",\"320411\":\"新北区\",\"320412\":\"武进区\",\"320413\":\"金坛区\",\"320481\":\"溧阳市\"},\"320500\":{\"320505\":\"虎丘区\",\"320506\":\"吴中区\",\"320507\":\"相城区\",\"320508\":\"姑苏区\",\"320509\":\"吴江区\",\"320571\":\"苏州工业园区\",\"320581\":\"常熟市\",\"320582\":\"张家港市\",\"320583\":\"昆山市\",\"320585\":\"太仓市\",\"320590\":\"工业园区\",\"320591\":\"高新区\"},\"320600\":{\"320602\":\"崇川区\",\"320611\":\"港闸区\",\"320612\":\"通州区\",\"320623\":\"如东县\",\"320681\":\"启东市\",\"320682\":\"如皋市\",\"320684\":\"海门市\",\"320685\":\"海安市\",\"320691\":\"高新区\"},\"320700\":{\"320703\":\"连云区\",\"320706\":\"海州区\",\"320707\":\"赣榆区\",\"320722\":\"东海县\",\"320723\":\"灌云县\",\"320724\":\"灌南县\",\"320771\":\"连云港经济技术开发区\"},\"320800\":{\"320803\":\"淮安区\",\"320804\":\"淮阴区\",\"320812\":\"清江浦区\",\"320813\":\"洪泽区\",\"320826\":\"涟水县\",\"320830\":\"盱眙县\",\"320831\":\"金湖县\",\"320871\":\"淮安经济技术开发区\",\"320890\":\"经济开发区\"},\"320900\":{\"320902\":\"亭湖区\",\"320903\":\"盐都区\",\"320904\":\"大丰区\",\"320921\":\"响水县\",\"320922\":\"滨海县\",\"320923\":\"阜宁县\",\"320924\":\"射阳县\",\"320925\":\"建湖县\",\"320971\":\"盐城经济技术开发区\",\"320981\":\"东台市\"},\"321000\":{\"321002\":\"广陵区\",\"321003\":\"邗江区\",\"321012\":\"江都区\",\"321023\":\"宝应县\",\"321071\":\"扬州经济技术开发区\",\"321081\":\"仪征市\",\"321084\":\"高邮市\",\"321090\":\"经济开发区\"},\"321100\":{\"321102\":\"京口区\",\"321111\":\"润州区\",\"321112\":\"丹徒区\",\"321150\":\"镇江新区\",\"321181\":\"丹阳市\",\"321182\":\"扬中市\",\"321183\":\"句容市\"},\"321200\":{\"321202\":\"海陵区\",\"321203\":\"高港区\",\"321204\":\"姜堰区\",\"321271\":\"泰州医药高新技术产业开发区\",\"321281\":\"兴化市\",\"321282\":\"靖江市\",\"321283\":\"泰兴市\"},\"321300\":{\"321302\":\"宿城区\",\"321311\":\"宿豫区\",\"321322\":\"沭阳县\",\"321323\":\"泗阳县\",\"321324\":\"泗洪县\",\"321371\":\"宿迁经济技术开发区\"},\"330000\":{\"330100\":\"杭州市\",\"330200\":\"宁波市\",\"330300\":\"温州市\",\"330400\":\"嘉兴市\",\"330500\":\"湖州市\",\"330600\":\"绍兴市\",\"330700\":\"金华市\",\"330800\":\"衢州市\",\"330900\":\"舟山市\",\"331000\":\"台州市\",\"331100\":\"丽水市\"},\"330100\":{\"330102\":\"上城区\",\"330105\":\"拱墅区\",\"330106\":\"西湖区\",\"330108\":\"滨江区\",\"330109\":\"萧山区\",\"330110\":\"余杭区\",\"330111\":\"富阳区\",\"330112\":\"临安区\",\"330113\":\"临平区\",\"330114\":\"钱塘区\",\"330122\":\"桐庐县\",\"330127\":\"淳安县\",\"330182\":\"建德市\"},\"330200\":{\"330203\":\"海曙区\",\"330205\":\"江北区\",\"330206\":\"北仑区\",\"330211\":\"镇海区\",\"330212\":\"鄞州区\",\"330213\":\"奉化区\",\"330225\":\"象山县\",\"330226\":\"宁海县\",\"330281\":\"余姚市\",\"330282\":\"慈溪市\"},\"330300\":{\"330302\":\"鹿城区\",\"330303\":\"龙湾区\",\"330304\":\"瓯海区\",\"330305\":\"洞头区\",\"330324\":\"永嘉县\",\"330326\":\"平阳县\",\"330327\":\"苍南县\",\"330328\":\"文成县\",\"330329\":\"泰顺县\",\"330381\":\"瑞安市\",\"330382\":\"乐清市\",\"330383\":\"龙港市\"},\"330400\":{\"330402\":\"南湖区\",\"330411\":\"秀洲区\",\"330421\":\"嘉善县\",\"330424\":\"海盐县\",\"330481\":\"海宁市\",\"330482\":\"平湖市\",\"330483\":\"桐乡市\"},\"330500\":{\"330502\":\"吴兴区\",\"330503\":\"南浔区\",\"330521\":\"德清县\",\"330522\":\"长兴县\",\"330523\":\"安吉县\"},\"330600\":{\"330602\":\"越城区\",\"330603\":\"柯桥区\",\"330604\":\"上虞区\",\"330624\":\"新昌县\",\"330681\":\"诸暨市\",\"330683\":\"嵊州市\"},\"330700\":{\"330702\":\"婺城区\",\"330703\":\"金东区\",\"330723\":\"武义县\",\"330726\":\"浦江县\",\"330727\":\"磐安县\",\"330781\":\"兰溪市\",\"330782\":\"义乌市\",\"330783\":\"东阳市\",\"330784\":\"永康市\"},\"330800\":{\"330802\":\"柯城区\",\"330803\":\"衢江区\",\"330822\":\"常山县\",\"330824\":\"开化县\",\"330825\":\"龙游县\",\"330881\":\"江山市\"},\"330900\":{\"330902\":\"定海区\",\"330903\":\"普陀区\",\"330921\":\"岱山县\",\"330922\":\"嵊泗县\"},\"331000\":{\"331002\":\"椒江区\",\"331003\":\"黄岩区\",\"331004\":\"路桥区\",\"331022\":\"三门县\",\"331023\":\"天台县\",\"331024\":\"仙居县\",\"331081\":\"温岭市\",\"331082\":\"临海市\",\"331083\":\"玉环市\"},\"331100\":{\"331102\":\"莲都区\",\"331121\":\"青田县\",\"331122\":\"缙云县\",\"331123\":\"遂昌县\",\"331124\":\"松阳县\",\"331125\":\"云和县\",\"331126\":\"庆元县\",\"331127\":\"景宁畲族自治县\",\"331181\":\"龙泉市\"},\"340000\":{\"340100\":\"合肥市\",\"340200\":\"芜湖市\",\"340300\":\"蚌埠市\",\"340400\":\"淮南市\",\"340500\":\"马鞍山市\",\"340600\":\"淮北市\",\"340700\":\"铜陵市\",\"340800\":\"安庆市\",\"341000\":\"黄山市\",\"341100\":\"滁州市\",\"341200\":\"阜阳市\",\"341300\":\"宿州市\",\"341500\":\"六安市\",\"341600\":\"亳州市\",\"341700\":\"池州市\",\"341800\":\"宣城市\"},\"340100\":{\"340102\":\"瑶海区\",\"340103\":\"庐阳区\",\"340104\":\"蜀山区\",\"340111\":\"包河区\",\"340121\":\"长丰县\",\"340122\":\"肥东县\",\"340123\":\"肥西县\",\"340124\":\"庐江县\",\"340171\":\"合肥高新技术产业开发区\",\"340172\":\"合肥经济技术开发区\",\"340173\":\"合肥新站高新技术产业开发区\",\"340181\":\"巢湖市\",\"340190\":\"高新技术开发区\",\"340191\":\"经济技术开发区\"},\"340200\":{\"340202\":\"镜湖区\",\"340207\":\"鸠江区\",\"340209\":\"弋江区\",\"340210\":\"湾沚区\",\"340212\":\"繁昌区\",\"340223\":\"南陵县\",\"340281\":\"无为市\"},\"340300\":{\"340302\":\"龙子湖区\",\"340303\":\"蚌山区\",\"340304\":\"禹会区\",\"340311\":\"淮上区\",\"340321\":\"怀远县\",\"340322\":\"五河县\",\"340323\":\"固镇县\",\"340371\":\"蚌埠市高新技术开发区\",\"340372\":\"蚌埠市经济开发区\"},\"340400\":{\"340402\":\"大通区\",\"340403\":\"田家庵区\",\"340404\":\"谢家集区\",\"340405\":\"八公山区\",\"340406\":\"潘集区\",\"340421\":\"凤台县\",\"340422\":\"寿县\"},\"340500\":{\"340503\":\"花山区\",\"340504\":\"雨山区\",\"340506\":\"博望区\",\"340521\":\"当涂县\",\"340522\":\"含山县\",\"340523\":\"和县\"},\"340600\":{\"340602\":\"杜集区\",\"340603\":\"相山区\",\"340604\":\"烈山区\",\"340621\":\"濉溪县\"},\"340700\":{\"340705\":\"铜官区\",\"340706\":\"义安区\",\"340711\":\"郊区\",\"340722\":\"枞阳县\"},\"340800\":{\"340802\":\"迎江区\",\"340803\":\"大观区\",\"340811\":\"宜秀区\",\"340822\":\"怀宁县\",\"340825\":\"太湖县\",\"340826\":\"宿松县\",\"340827\":\"望江县\",\"340828\":\"岳西县\",\"340881\":\"桐城市\",\"340882\":\"潜山市\"},\"341000\":{\"341002\":\"屯溪区\",\"341003\":\"黄山区\",\"341004\":\"徽州区\",\"341021\":\"歙县\",\"341022\":\"休宁县\",\"341023\":\"黟县\",\"341024\":\"祁门县\"},\"341100\":{\"341102\":\"琅琊区\",\"341103\":\"南谯区\",\"341122\":\"来安县\",\"341124\":\"全椒县\",\"341125\":\"定远县\",\"341126\":\"凤阳县\",\"341181\":\"天长市\",\"341182\":\"明光市\"},\"341200\":{\"341202\":\"颍州区\",\"341203\":\"颍东区\",\"341204\":\"颍泉区\",\"341221\":\"临泉县\",\"341222\":\"太和县\",\"341225\":\"阜南县\",\"341226\":\"颍上县\",\"341271\":\"阜阳合肥现代产业园区\",\"341282\":\"界首市\"},\"341300\":{\"341302\":\"埇桥区\",\"341321\":\"砀山县\",\"341322\":\"萧县\",\"341323\":\"灵璧县\",\"341324\":\"泗县\",\"341371\":\"宿州马鞍山现代产业园区\",\"341372\":\"宿州经济技术开发区\",\"341390\":\"经济开发区\"},\"341500\":{\"341502\":\"金安区\",\"341503\":\"裕安区\",\"341504\":\"叶集区\",\"341522\":\"霍邱县\",\"341523\":\"舒城县\",\"341524\":\"金寨县\",\"341525\":\"霍山县\"},\"341600\":{\"341602\":\"谯城区\",\"341621\":\"涡阳县\",\"341622\":\"蒙城县\",\"341623\":\"利辛县\"},\"341700\":{\"341702\":\"贵池区\",\"341721\":\"东至县\",\"341722\":\"石台县\",\"341723\":\"青阳县\"},\"341800\":{\"341802\":\"宣州区\",\"341821\":\"郎溪县\",\"341823\":\"泾县\",\"341824\":\"绩溪县\",\"341825\":\"旌德县\",\"341871\":\"宣城市经济开发区\",\"341881\":\"宁国市\",\"341882\":\"广德市\"},\"350000\":{\"350100\":\"福州市\",\"350200\":\"厦门市\",\"350300\":\"莆田市\",\"350400\":\"三明市\",\"350500\":\"泉州市\",\"350600\":\"漳州市\",\"350700\":\"南平市\",\"350800\":\"龙岩市\",\"350900\":\"宁德市\"},\"350100\":{\"350102\":\"鼓楼区\",\"350103\":\"台江区\",\"350104\":\"仓山区\",\"350105\":\"马尾区\",\"350111\":\"晋安区\",\"350112\":\"长乐区\",\"350121\":\"闽侯县\",\"350122\":\"连江县\",\"350123\":\"罗源县\",\"350124\":\"闽清县\",\"350125\":\"永泰县\",\"350128\":\"平潭县\",\"350181\":\"福清市\"},\"350200\":{\"350203\":\"思明区\",\"350205\":\"海沧区\",\"350206\":\"湖里区\",\"350211\":\"集美区\",\"350212\":\"同安区\",\"350213\":\"翔安区\"},\"350300\":{\"350302\":\"城厢区\",\"350303\":\"涵江区\",\"350304\":\"荔城区\",\"350305\":\"秀屿区\",\"350322\":\"仙游县\"},\"350400\":{\"350402\":\"梅列区\",\"350403\":\"三元区\",\"350421\":\"明溪县\",\"350423\":\"清流县\",\"350424\":\"宁化县\",\"350425\":\"大田县\",\"350426\":\"尤溪县\",\"350427\":\"沙县\",\"350428\":\"将乐县\",\"350429\":\"泰宁县\",\"350430\":\"建宁县\",\"350481\":\"永安市\"},\"350500\":{\"350502\":\"鲤城区\",\"350503\":\"丰泽区\",\"350504\":\"洛江区\",\"350505\":\"泉港区\",\"350521\":\"惠安县\",\"350524\":\"安溪县\",\"350525\":\"永春县\",\"350526\":\"德化县\",\"350527\":\"金门县\",\"350581\":\"石狮市\",\"350582\":\"晋江市\",\"350583\":\"南安市\"},\"350600\":{\"350602\":\"芗城区\",\"350603\":\"龙文区\",\"350622\":\"云霄县\",\"350623\":\"漳浦县\",\"350624\":\"诏安县\",\"350625\":\"长泰县\",\"350626\":\"东山县\",\"350627\":\"南靖县\",\"350628\":\"平和县\",\"350629\":\"华安县\",\"350681\":\"龙海市\"},\"350700\":{\"350702\":\"延平区\",\"350703\":\"建阳区\",\"350721\":\"顺昌县\",\"350722\":\"浦城县\",\"350723\":\"光泽县\",\"350724\":\"松溪县\",\"350725\":\"政和县\",\"350781\":\"邵武市\",\"350782\":\"武夷山市\",\"350783\":\"建瓯市\"},\"350800\":{\"350802\":\"新罗区\",\"350803\":\"永定区\",\"350821\":\"长汀县\",\"350823\":\"上杭县\",\"350824\":\"武平县\",\"350825\":\"连城县\",\"350881\":\"漳平市\"},\"350900\":{\"350902\":\"蕉城区\",\"350921\":\"霞浦县\",\"350922\":\"古田县\",\"350923\":\"屏南县\",\"350924\":\"寿宁县\",\"350925\":\"周宁县\",\"350926\":\"柘荣县\",\"350981\":\"福安市\",\"350982\":\"福鼎市\"},\"360000\":{\"360100\":\"南昌市\",\"360200\":\"景德镇市\",\"360300\":\"萍乡市\",\"360400\":\"九江市\",\"360500\":\"新余市\",\"360600\":\"鹰潭市\",\"360700\":\"赣州市\",\"360800\":\"吉安市\",\"360900\":\"宜春市\",\"361000\":\"抚州市\",\"361100\":\"上饶市\"},\"360100\":{\"360102\":\"东湖区\",\"360103\":\"西湖区\",\"360104\":\"青云谱区\",\"360111\":\"青山湖区\",\"360112\":\"新建区\",\"360113\":\"红谷滩区\",\"360121\":\"南昌县\",\"360123\":\"安义县\",\"360124\":\"进贤县\",\"360190\":\"经济技术开发区\",\"360192\":\"高新区\"},\"360200\":{\"360202\":\"昌江区\",\"360203\":\"珠山区\",\"360222\":\"浮梁县\",\"360281\":\"乐平市\"},\"360300\":{\"360302\":\"安源区\",\"360313\":\"湘东区\",\"360321\":\"莲花县\",\"360322\":\"上栗县\",\"360323\":\"芦溪县\"},\"360400\":{\"360402\":\"濂溪区\",\"360403\":\"浔阳区\",\"360404\":\"柴桑区\",\"360423\":\"武宁县\",\"360424\":\"修水县\",\"360425\":\"永修县\",\"360426\":\"德安县\",\"360428\":\"都昌县\",\"360429\":\"湖口县\",\"360430\":\"彭泽县\",\"360481\":\"瑞昌市\",\"360482\":\"共青城市\",\"360483\":\"庐山市\",\"360490\":\"经济技术开发区\"},\"360500\":{\"360502\":\"渝水区\",\"360521\":\"分宜县\"},\"360600\":{\"360602\":\"月湖区\",\"360603\":\"余江区\",\"360681\":\"贵溪市\"},\"360700\":{\"360702\":\"章贡区\",\"360703\":\"南康区\",\"360704\":\"赣县区\",\"360722\":\"信丰县\",\"360723\":\"大余县\",\"360724\":\"上犹县\",\"360725\":\"崇义县\",\"360726\":\"安远县\",\"360728\":\"定南县\",\"360729\":\"全南县\",\"360730\":\"宁都县\",\"360731\":\"于都县\",\"360732\":\"兴国县\",\"360733\":\"会昌县\",\"360734\":\"寻乌县\",\"360735\":\"石城县\",\"360781\":\"瑞金市\",\"360783\":\"龙南市\"},\"360800\":{\"360802\":\"吉州区\",\"360803\":\"青原区\",\"360821\":\"吉安县\",\"360822\":\"吉水县\",\"360823\":\"峡江县\",\"360824\":\"新干县\",\"360825\":\"永丰县\",\"360826\":\"泰和县\",\"360827\":\"遂川县\",\"360828\":\"万安县\",\"360829\":\"安福县\",\"360830\":\"永新县\",\"360881\":\"井冈山市\"},\"360900\":{\"360902\":\"袁州区\",\"360921\":\"奉新县\",\"360922\":\"万载县\",\"360923\":\"上高县\",\"360924\":\"宜丰县\",\"360925\":\"靖安县\",\"360926\":\"铜鼓县\",\"360981\":\"丰城市\",\"360982\":\"樟树市\",\"360983\":\"高安市\"},\"361000\":{\"361002\":\"临川区\",\"361003\":\"东乡区\",\"361021\":\"南城县\",\"361022\":\"黎川县\",\"361023\":\"南丰县\",\"361024\":\"崇仁县\",\"361025\":\"乐安县\",\"361026\":\"宜黄县\",\"361027\":\"金溪县\",\"361028\":\"资溪县\",\"361030\":\"广昌县\"},\"361100\":{\"361102\":\"信州区\",\"361103\":\"广丰区\",\"361104\":\"广信区\",\"361123\":\"玉山县\",\"361124\":\"铅山县\",\"361125\":\"横峰县\",\"361126\":\"弋阳县\",\"361127\":\"余干县\",\"361128\":\"鄱阳县\",\"361129\":\"万年县\",\"361130\":\"婺源县\",\"361181\":\"德兴市\"},\"370000\":{\"370100\":\"济南市\",\"370200\":\"青岛市\",\"370300\":\"淄博市\",\"370400\":\"枣庄市\",\"370500\":\"东营市\",\"370600\":\"烟台市\",\"370700\":\"潍坊市\",\"370800\":\"济宁市\",\"370900\":\"泰安市\",\"371000\":\"威海市\",\"371100\":\"日照市\",\"371300\":\"临沂市\",\"371400\":\"德州市\",\"371500\":\"聊城市\",\"371600\":\"滨州市\",\"371700\":\"菏泽市\"},\"370100\":{\"370102\":\"历下区\",\"370103\":\"市中区\",\"370104\":\"槐荫区\",\"370105\":\"天桥区\",\"370112\":\"历城区\",\"370113\":\"长清区\",\"370114\":\"章丘区\",\"370115\":\"济阳区\",\"370116\":\"莱芜区\",\"370117\":\"钢城区\",\"370124\":\"平阴县\",\"370126\":\"商河县\",\"370171\":\"济南高新技术产业开发区\",\"370190\":\"高新区\"},\"370200\":{\"370202\":\"市南区\",\"370203\":\"市北区\",\"370211\":\"黄岛区\",\"370212\":\"崂山区\",\"370213\":\"李沧区\",\"370214\":\"城阳区\",\"370215\":\"即墨区\",\"370271\":\"青岛高新技术产业开发区\",\"370281\":\"胶州市\",\"370283\":\"平度市\",\"370285\":\"莱西市\",\"370290\":\"开发区\"},\"370300\":{\"370302\":\"淄川区\",\"370303\":\"张店区\",\"370304\":\"博山区\",\"370305\":\"临淄区\",\"370306\":\"周村区\",\"370321\":\"桓台县\",\"370322\":\"高青县\",\"370323\":\"沂源县\"},\"370400\":{\"370402\":\"市中区\",\"370403\":\"薛城区\",\"370404\":\"峄城区\",\"370405\":\"台儿庄区\",\"370406\":\"山亭区\",\"370481\":\"滕州市\"},\"370500\":{\"370502\":\"东营区\",\"370503\":\"河口区\",\"370505\":\"垦利区\",\"370522\":\"利津县\",\"370523\":\"广饶县\",\"370571\":\"东营经济技术开发区\",\"370572\":\"东营港经济开发区\"},\"370600\":{\"370602\":\"芝罘区\",\"370611\":\"福山区\",\"370612\":\"牟平区\",\"370613\":\"莱山区\",\"370634\":\"长岛县\",\"370671\":\"烟台高新技术产业开发区\",\"370672\":\"烟台经济技术开发区\",\"370681\":\"龙口市\",\"370682\":\"莱阳市\",\"370683\":\"莱州市\",\"370684\":\"蓬莱市\",\"370685\":\"招远市\",\"370686\":\"栖霞市\",\"370687\":\"海阳市\",\"370690\":\"开发区\"},\"370700\":{\"370702\":\"潍城区\",\"370703\":\"寒亭区\",\"370704\":\"坊子区\",\"370705\":\"奎文区\",\"370724\":\"临朐县\",\"370725\":\"昌乐县\",\"370772\":\"潍坊滨海经济技术开发区\",\"370781\":\"青州市\",\"370782\":\"诸城市\",\"370783\":\"寿光市\",\"370784\":\"安丘市\",\"370785\":\"高密市\",\"370786\":\"昌邑市\",\"370790\":\"开发区\",\"370791\":\"高新区\"},\"370800\":{\"370811\":\"任城区\",\"370812\":\"兖州区\",\"370826\":\"微山县\",\"370827\":\"鱼台县\",\"370828\":\"金乡县\",\"370829\":\"嘉祥县\",\"370830\":\"汶上县\",\"370831\":\"泗水县\",\"370832\":\"梁山县\",\"370871\":\"济宁高新技术产业开发区\",\"370881\":\"曲阜市\",\"370883\":\"邹城市\",\"370890\":\"高新区\"},\"370900\":{\"370902\":\"泰山区\",\"370911\":\"岱岳区\",\"370921\":\"宁阳县\",\"370923\":\"东平县\",\"370982\":\"新泰市\",\"370983\":\"肥城市\"},\"371000\":{\"371002\":\"环翠区\",\"371003\":\"文登区\",\"371071\":\"威海火炬高技术产业开发区\",\"371072\":\"威海经济技术开发区\",\"371082\":\"荣成市\",\"371083\":\"乳山市\",\"371091\":\"经济技术开发区\"},\"371100\":{\"371102\":\"东港区\",\"371103\":\"岚山区\",\"371121\":\"五莲县\",\"371122\":\"莒县\",\"371171\":\"日照经济技术开发区\"},\"371300\":{\"371302\":\"兰山区\",\"371311\":\"罗庄区\",\"371312\":\"河东区\",\"371321\":\"沂南县\",\"371322\":\"郯城县\",\"371323\":\"沂水县\",\"371324\":\"兰陵县\",\"371325\":\"费县\",\"371326\":\"平邑县\",\"371327\":\"莒南县\",\"371328\":\"蒙阴县\",\"371329\":\"临沭县\",\"371371\":\"临沂高新技术产业开发区\"},\"371400\":{\"371402\":\"德城区\",\"371403\":\"陵城区\",\"371422\":\"宁津县\",\"371423\":\"庆云县\",\"371424\":\"临邑县\",\"371425\":\"齐河县\",\"371426\":\"平原县\",\"371427\":\"夏津县\",\"371428\":\"武城县\",\"371472\":\"德州运河经济开发区\",\"371481\":\"乐陵市\",\"371482\":\"禹城市\"},\"371500\":{\"371502\":\"东昌府区\",\"371503\":\"茌平区\",\"371521\":\"阳谷县\",\"371522\":\"莘县\",\"371524\":\"东阿县\",\"371525\":\"冠县\",\"371526\":\"高唐县\",\"371581\":\"临清市\"},\"371600\":{\"371602\":\"滨城区\",\"371603\":\"沾化区\",\"371621\":\"惠民县\",\"371622\":\"阳信县\",\"371623\":\"无棣县\",\"371625\":\"博兴县\",\"371681\":\"邹平市\"},\"371700\":{\"371702\":\"牡丹区\",\"371703\":\"定陶区\",\"371721\":\"曹县\",\"371722\":\"单县\",\"371723\":\"成武县\",\"371724\":\"巨野县\",\"371725\":\"郓城县\",\"371726\":\"鄄城县\",\"371728\":\"东明县\",\"371771\":\"菏泽经济技术开发区\",\"371772\":\"菏泽高新技术开发区\"},\"410000\":{\"410100\":\"郑州市\",\"410200\":\"开封市\",\"410300\":\"洛阳市\",\"410400\":\"平顶山市\",\"410500\":\"安阳市\",\"410600\":\"鹤壁市\",\"410700\":\"新乡市\",\"410800\":\"焦作市\",\"410900\":\"濮阳市\",\"411000\":\"许昌市\",\"411100\":\"漯河市\",\"411200\":\"三门峡市\",\"411300\":\"南阳市\",\"411400\":\"商丘市\",\"411500\":\"信阳市\",\"411600\":\"周口市\",\"411700\":\"驻马店市\",\"419000\":\"省直辖县\"},\"410100\":{\"410102\":\"中原区\",\"410103\":\"二七区\",\"410104\":\"管城回族区\",\"410105\":\"金水区\",\"410106\":\"上街区\",\"410108\":\"惠济区\",\"410122\":\"中牟县\",\"410171\":\"郑州经济技术开发区\",\"410172\":\"郑州高新技术产业开发区\",\"410173\":\"郑州航空港经济综合实验区\",\"410181\":\"巩义市\",\"410182\":\"荥阳市\",\"410183\":\"新密市\",\"410184\":\"新郑市\",\"410185\":\"登封市\",\"410190\":\"高新技术开发区\",\"410191\":\"经济技术开发区\"},\"410200\":{\"410202\":\"龙亭区\",\"410203\":\"顺河回族区\",\"410204\":\"鼓楼区\",\"410205\":\"禹王台区\",\"410212\":\"祥符区\",\"410221\":\"杞县\",\"410222\":\"通许县\",\"410223\":\"尉氏县\",\"410225\":\"兰考县\"},\"410300\":{\"410302\":\"老城区\",\"410303\":\"西工区\",\"410304\":\"瀍河回族区\",\"410305\":\"涧西区\",\"410306\":\"吉利区\",\"410311\":\"洛龙区\",\"410322\":\"孟津县\",\"410323\":\"新安县\",\"410324\":\"栾川县\",\"410325\":\"嵩县\",\"410326\":\"汝阳县\",\"410327\":\"宜阳县\",\"410328\":\"洛宁县\",\"410329\":\"伊川县\",\"410381\":\"偃师市\"},\"410400\":{\"410402\":\"新华区\",\"410403\":\"卫东区\",\"410404\":\"石龙区\",\"410411\":\"湛河区\",\"410421\":\"宝丰县\",\"410422\":\"叶县\",\"410423\":\"鲁山县\",\"410425\":\"郏县\",\"410471\":\"平顶山高新技术产业开发区\",\"410481\":\"舞钢市\",\"410482\":\"汝州市\"},\"410500\":{\"410502\":\"文峰区\",\"410503\":\"北关区\",\"410505\":\"殷都区\",\"410506\":\"龙安区\",\"410522\":\"安阳县\",\"410523\":\"汤阴县\",\"410526\":\"滑县\",\"410527\":\"内黄县\",\"410581\":\"林州市\",\"410590\":\"开发区\"},\"410600\":{\"410602\":\"鹤山区\",\"410603\":\"山城区\",\"410611\":\"淇滨区\",\"410621\":\"浚县\",\"410622\":\"淇县\"},\"410700\":{\"410702\":\"红旗区\",\"410703\":\"卫滨区\",\"410704\":\"凤泉区\",\"410711\":\"牧野区\",\"410721\":\"新乡县\",\"410724\":\"获嘉县\",\"410725\":\"原阳县\",\"410726\":\"延津县\",\"410727\":\"封丘县\",\"410771\":\"新乡高新技术产业开发区\",\"410772\":\"新乡经济技术开发区\",\"410781\":\"卫辉市\",\"410782\":\"辉县市\",\"410783\":\"长垣市\"},\"410800\":{\"410802\":\"解放区\",\"410803\":\"中站区\",\"410804\":\"马村区\",\"410811\":\"山阳区\",\"410821\":\"修武县\",\"410822\":\"博爱县\",\"410823\":\"武陟县\",\"410825\":\"温县\",\"410871\":\"焦作城乡一体化示范区\",\"410882\":\"沁阳市\",\"410883\":\"孟州市\"},\"410900\":{\"410902\":\"华龙区\",\"410922\":\"清丰县\",\"410923\":\"南乐县\",\"410926\":\"范县\",\"410927\":\"台前县\",\"410928\":\"濮阳县\",\"410971\":\"河南濮阳工业园区\"},\"411000\":{\"411002\":\"魏都区\",\"411003\":\"建安区\",\"411024\":\"鄢陵县\",\"411025\":\"襄城县\",\"411071\":\"许昌经济技术开发区\",\"411081\":\"禹州市\",\"411082\":\"长葛市\"},\"411100\":{\"411102\":\"源汇区\",\"411103\":\"郾城区\",\"411104\":\"召陵区\",\"411121\":\"舞阳县\",\"411122\":\"临颍县\",\"411171\":\"漯河经济技术开发区\"},\"411200\":{\"411202\":\"湖滨区\",\"411203\":\"陕州区\",\"411221\":\"渑池县\",\"411224\":\"卢氏县\",\"411271\":\"河南三门峡经济开发区\",\"411281\":\"义马市\",\"411282\":\"灵宝市\"},\"411300\":{\"411302\":\"宛城区\",\"411303\":\"卧龙区\",\"411321\":\"南召县\",\"411322\":\"方城县\",\"411323\":\"西峡县\",\"411324\":\"镇平县\",\"411325\":\"内乡县\",\"411326\":\"淅川县\",\"411327\":\"社旗县\",\"411328\":\"唐河县\",\"411329\":\"新野县\",\"411330\":\"桐柏县\",\"411372\":\"南阳市城乡一体化示范区\",\"411381\":\"邓州市\"},\"411400\":{\"411402\":\"梁园区\",\"411403\":\"睢阳区\",\"411421\":\"民权县\",\"411422\":\"睢县\",\"411423\":\"宁陵县\",\"411424\":\"柘城县\",\"411425\":\"虞城县\",\"411426\":\"夏邑县\",\"411481\":\"永城市\"},\"411500\":{\"411502\":\"浉河区\",\"411503\":\"平桥区\",\"411521\":\"罗山县\",\"411522\":\"光山县\",\"411523\":\"新县\",\"411524\":\"商城县\",\"411525\":\"固始县\",\"411526\":\"潢川县\",\"411527\":\"淮滨县\",\"411528\":\"息县\"},\"411600\":{\"411602\":\"川汇区\",\"411603\":\"淮阳区\",\"411621\":\"扶沟县\",\"411622\":\"西华县\",\"411623\":\"商水县\",\"411624\":\"沈丘县\",\"411625\":\"郸城县\",\"411627\":\"太康县\",\"411628\":\"鹿邑县\",\"411671\":\"河南周口经济开发区\",\"411681\":\"项城市\",\"411690\":\"经济开发区\"},\"411700\":{\"411702\":\"驿城区\",\"411721\":\"西平县\",\"411722\":\"上蔡县\",\"411723\":\"平舆县\",\"411724\":\"正阳县\",\"411725\":\"确山县\",\"411726\":\"泌阳县\",\"411727\":\"汝南县\",\"411728\":\"遂平县\",\"411729\":\"新蔡县\"},\"419000\":{\"419001\":\"济源市\"},\"420000\":{\"420100\":\"武汉市\",\"420200\":\"黄石市\",\"420300\":\"十堰市\",\"420500\":\"宜昌市\",\"420600\":\"襄阳市\",\"420700\":\"鄂州市\",\"420800\":\"荆门市\",\"420900\":\"孝感市\",\"421000\":\"荆州市\",\"421100\":\"黄冈市\",\"421200\":\"咸宁市\",\"421300\":\"随州市\",\"422800\":\"恩施土家族苗族自治州\",\"429000\":\"省直辖县\"},\"420100\":{\"420102\":\"江岸区\",\"420103\":\"江汉区\",\"420104\":\"硚口区\",\"420105\":\"汉阳区\",\"420106\":\"武昌区\",\"420107\":\"青山区\",\"420111\":\"洪山区\",\"420112\":\"东西湖区\",\"420113\":\"汉南区\",\"420114\":\"蔡甸区\",\"420115\":\"江夏区\",\"420116\":\"黄陂区\",\"420117\":\"新洲区\"},\"420200\":{\"420202\":\"黄石港区\",\"420203\":\"西塞山区\",\"420204\":\"下陆区\",\"420205\":\"铁山区\",\"420222\":\"阳新县\",\"420281\":\"大冶市\"},\"420300\":{\"420302\":\"茅箭区\",\"420303\":\"张湾区\",\"420304\":\"郧阳区\",\"420322\":\"郧西县\",\"420323\":\"竹山县\",\"420324\":\"竹溪县\",\"420325\":\"房县\",\"420381\":\"丹江口市\"},\"420500\":{\"420502\":\"西陵区\",\"420503\":\"伍家岗区\",\"420504\":\"点军区\",\"420505\":\"猇亭区\",\"420506\":\"夷陵区\",\"420525\":\"远安县\",\"420526\":\"兴山县\",\"420527\":\"秭归县\",\"420528\":\"长阳土家族自治县\",\"420529\":\"五峰土家族自治县\",\"420581\":\"宜都市\",\"420582\":\"当阳市\",\"420583\":\"枝江市\",\"420590\":\"经济开发区\"},\"420600\":{\"420602\":\"襄城区\",\"420606\":\"樊城区\",\"420607\":\"襄州区\",\"420624\":\"南漳县\",\"420625\":\"谷城县\",\"420626\":\"保康县\",\"420682\":\"老河口市\",\"420683\":\"枣阳市\",\"420684\":\"宜城市\"},\"420700\":{\"420702\":\"梁子湖区\",\"420703\":\"华容区\",\"420704\":\"鄂城区\"},\"420800\":{\"420802\":\"东宝区\",\"420804\":\"掇刀区\",\"420822\":\"沙洋县\",\"420881\":\"钟祥市\",\"420882\":\"京山市\"},\"420900\":{\"420902\":\"孝南区\",\"420921\":\"孝昌县\",\"420922\":\"大悟县\",\"420923\":\"云梦县\",\"420981\":\"应城市\",\"420982\":\"安陆市\",\"420984\":\"汉川市\"},\"421000\":{\"421002\":\"沙市区\",\"421003\":\"荆州区\",\"421022\":\"公安县\",\"421023\":\"监利县\",\"421024\":\"江陵县\",\"421081\":\"石首市\",\"421083\":\"洪湖市\",\"421087\":\"松滋市\"},\"421100\":{\"421102\":\"黄州区\",\"421121\":\"团风县\",\"421122\":\"红安县\",\"421123\":\"罗田县\",\"421124\":\"英山县\",\"421125\":\"浠水县\",\"421126\":\"蕲春县\",\"421127\":\"黄梅县\",\"421171\":\"龙感湖管理区\",\"421181\":\"麻城市\",\"421182\":\"武穴市\"},\"421200\":{\"421202\":\"咸安区\",\"421221\":\"嘉鱼县\",\"421222\":\"通城县\",\"421223\":\"崇阳县\",\"421224\":\"通山县\",\"421281\":\"赤壁市\"},\"421300\":{\"421303\":\"曾都区\",\"421321\":\"随县\",\"421381\":\"广水市\"},\"422800\":{\"422801\":\"恩施市\",\"422802\":\"利川市\",\"422822\":\"建始县\",\"422823\":\"巴东县\",\"422825\":\"宣恩县\",\"422826\":\"咸丰县\",\"422827\":\"来凤县\",\"422828\":\"鹤峰县\"},\"429000\":{\"429004\":\"仙桃市\",\"429005\":\"潜江市\",\"429006\":\"天门市\",\"429021\":\"神农架林区\"},\"430000\":{\"430100\":\"长沙市\",\"430200\":\"株洲市\",\"430300\":\"湘潭市\",\"430400\":\"衡阳市\",\"430500\":\"邵阳市\",\"430600\":\"岳阳市\",\"430700\":\"常德市\",\"430800\":\"张家界市\",\"430900\":\"益阳市\",\"431000\":\"郴州市\",\"431100\":\"永州市\",\"431200\":\"怀化市\",\"431300\":\"娄底市\",\"433100\":\"湘西土家族苗族自治州\"},\"430100\":{\"430102\":\"芙蓉区\",\"430103\":\"天心区\",\"430104\":\"岳麓区\",\"430105\":\"开福区\",\"430111\":\"雨花区\",\"430112\":\"望城区\",\"430121\":\"长沙县\",\"430181\":\"浏阳市\",\"430182\":\"宁乡市\"},\"430200\":{\"430202\":\"荷塘区\",\"430203\":\"芦淞区\",\"430204\":\"石峰区\",\"430211\":\"天元区\",\"430212\":\"渌口区\",\"430223\":\"攸县\",\"430224\":\"茶陵县\",\"430225\":\"炎陵县\",\"430271\":\"云龙示范区\",\"430281\":\"醴陵市\"},\"430300\":{\"430302\":\"雨湖区\",\"430304\":\"岳塘区\",\"430321\":\"湘潭县\",\"430373\":\"湘潭九华示范区\",\"430381\":\"湘乡市\",\"430382\":\"韶山市\"},\"430400\":{\"430405\":\"珠晖区\",\"430406\":\"雁峰区\",\"430407\":\"石鼓区\",\"430408\":\"蒸湘区\",\"430412\":\"南岳区\",\"430421\":\"衡阳县\",\"430422\":\"衡南县\",\"430423\":\"衡山县\",\"430424\":\"衡东县\",\"430426\":\"祁东县\",\"430481\":\"耒阳市\",\"430482\":\"常宁市\"},\"430500\":{\"430502\":\"双清区\",\"430503\":\"大祥区\",\"430511\":\"北塔区\",\"430522\":\"新邵县\",\"430523\":\"邵阳县\",\"430524\":\"隆回县\",\"430525\":\"洞口县\",\"430527\":\"绥宁县\",\"430528\":\"新宁县\",\"430529\":\"城步苗族自治县\",\"430581\":\"武冈市\",\"430582\":\"邵东市\"},\"430600\":{\"430602\":\"岳阳楼区\",\"430603\":\"云溪区\",\"430611\":\"君山区\",\"430621\":\"岳阳县\",\"430623\":\"华容县\",\"430624\":\"湘阴县\",\"430626\":\"平江县\",\"430681\":\"汨罗市\",\"430682\":\"临湘市\"},\"430700\":{\"430702\":\"武陵区\",\"430703\":\"鼎城区\",\"430721\":\"安乡县\",\"430722\":\"汉寿县\",\"430723\":\"澧县\",\"430724\":\"临澧县\",\"430725\":\"桃源县\",\"430726\":\"石门县\",\"430781\":\"津市市\"},\"430800\":{\"430802\":\"永定区\",\"430811\":\"武陵源区\",\"430821\":\"慈利县\",\"430822\":\"桑植县\"},\"430900\":{\"430902\":\"资阳区\",\"430903\":\"赫山区\",\"430921\":\"南县\",\"430922\":\"桃江县\",\"430923\":\"安化县\",\"430971\":\"益阳市大通湖管理区\",\"430981\":\"沅江市\"},\"431000\":{\"431002\":\"北湖区\",\"431003\":\"苏仙区\",\"431021\":\"桂阳县\",\"431022\":\"宜章县\",\"431023\":\"永兴县\",\"431024\":\"嘉禾县\",\"431025\":\"临武县\",\"431026\":\"汝城县\",\"431027\":\"桂东县\",\"431028\":\"安仁县\",\"431081\":\"资兴市\"},\"431100\":{\"431102\":\"零陵区\",\"431103\":\"冷水滩区\",\"431121\":\"祁阳县\",\"431122\":\"东安县\",\"431123\":\"双牌县\",\"431124\":\"道县\",\"431125\":\"江永县\",\"431126\":\"宁远县\",\"431127\":\"蓝山县\",\"431128\":\"新田县\",\"431129\":\"江华瑶族自治县\"},\"431200\":{\"431202\":\"鹤城区\",\"431221\":\"中方县\",\"431222\":\"沅陵县\",\"431223\":\"辰溪县\",\"431224\":\"溆浦县\",\"431225\":\"会同县\",\"431226\":\"麻阳苗族自治县\",\"431227\":\"新晃侗族自治县\",\"431228\":\"芷江侗族自治县\",\"431229\":\"靖州苗族侗族自治县\",\"431230\":\"通道侗族自治县\",\"431271\":\"怀化市洪江管理区\",\"431281\":\"洪江市\"},\"431300\":{\"431302\":\"娄星区\",\"431321\":\"双峰县\",\"431322\":\"新化县\",\"431381\":\"冷水江市\",\"431382\":\"涟源市\"},\"433100\":{\"433101\":\"吉首市\",\"433122\":\"泸溪县\",\"433123\":\"凤凰县\",\"433124\":\"花垣县\",\"433125\":\"保靖县\",\"433126\":\"古丈县\",\"433127\":\"永顺县\",\"433130\":\"龙山县\"},\"440000\":{\"440100\":\"广州市\",\"440200\":\"韶关市\",\"440300\":\"深圳市\",\"440400\":\"珠海市\",\"440500\":\"汕头市\",\"440600\":\"佛山市\",\"440700\":\"江门市\",\"440800\":\"湛江市\",\"440900\":\"茂名市\",\"441200\":\"肇庆市\",\"441300\":\"惠州市\",\"441400\":\"梅州市\",\"441500\":\"汕尾市\",\"441600\":\"河源市\",\"441700\":\"阳江市\",\"441800\":\"清远市\",\"441900\":\"东莞市\",\"442000\":\"中山市\",\"445100\":\"潮州市\",\"445200\":\"揭阳市\",\"445300\":\"云浮市\"},\"440100\":{\"440103\":\"荔湾区\",\"440104\":\"越秀区\",\"440105\":\"海珠区\",\"440106\":\"天河区\",\"440111\":\"白云区\",\"440112\":\"黄埔区\",\"440113\":\"番禺区\",\"440114\":\"花都区\",\"440115\":\"南沙区\",\"440117\":\"从化区\",\"440118\":\"增城区\"},\"440200\":{\"440203\":\"武江区\",\"440204\":\"浈江区\",\"440205\":\"曲江区\",\"440222\":\"始兴县\",\"440224\":\"仁化县\",\"440229\":\"翁源县\",\"440232\":\"乳源瑶族自治县\",\"440233\":\"新丰县\",\"440281\":\"乐昌市\",\"440282\":\"南雄市\"},\"440300\":{\"440303\":\"罗湖区\",\"440304\":\"福田区\",\"440305\":\"南山区\",\"440306\":\"宝安区\",\"440307\":\"龙岗区\",\"440308\":\"盐田区\",\"440309\":\"龙华区\",\"440310\":\"坪山区\",\"440311\":\"光明区\"},\"440400\":{\"440402\":\"香洲区\",\"440403\":\"斗门区\",\"440404\":\"金湾区\"},\"440500\":{\"440507\":\"龙湖区\",\"440511\":\"金平区\",\"440512\":\"濠江区\",\"440513\":\"潮阳区\",\"440514\":\"潮南区\",\"440515\":\"澄海区\",\"440523\":\"南澳县\"},\"440600\":{\"440604\":\"禅城区\",\"440605\":\"南海区\",\"440606\":\"顺德区\",\"440607\":\"三水区\",\"440608\":\"高明区\"},\"440700\":{\"440703\":\"蓬江区\",\"440704\":\"江海区\",\"440705\":\"新会区\",\"440781\":\"台山市\",\"440783\":\"开平市\",\"440784\":\"鹤山市\",\"440785\":\"恩平市\"},\"440800\":{\"440802\":\"赤坎区\",\"440803\":\"霞山区\",\"440804\":\"坡头区\",\"440811\":\"麻章区\",\"440823\":\"遂溪县\",\"440825\":\"徐闻县\",\"440881\":\"廉江市\",\"440882\":\"雷州市\",\"440883\":\"吴川市\",\"440890\":\"经济技术开发区\"},\"440900\":{\"440902\":\"茂南区\",\"440904\":\"电白区\",\"440981\":\"高州市\",\"440982\":\"化州市\",\"440983\":\"信宜市\"},\"441200\":{\"441202\":\"端州区\",\"441203\":\"鼎湖区\",\"441204\":\"高要区\",\"441223\":\"广宁县\",\"441224\":\"怀集县\",\"441225\":\"封开县\",\"441226\":\"德庆县\",\"441284\":\"四会市\"},\"441300\":{\"441302\":\"惠城区\",\"441303\":\"惠阳区\",\"441322\":\"博罗县\",\"441323\":\"惠东县\",\"441324\":\"龙门县\"},\"441400\":{\"441402\":\"梅江区\",\"441403\":\"梅县区\",\"441422\":\"大埔县\",\"441423\":\"丰顺县\",\"441424\":\"五华县\",\"441426\":\"平远县\",\"441427\":\"蕉岭县\",\"441481\":\"兴宁市\"},\"441500\":{\"441502\":\"城区\",\"441521\":\"海丰县\",\"441523\":\"陆河县\",\"441581\":\"陆丰市\"},\"441600\":{\"441602\":\"源城区\",\"441621\":\"紫金县\",\"441622\":\"龙川县\",\"441623\":\"连平县\",\"441624\":\"和平县\",\"441625\":\"东源县\"},\"441700\":{\"441702\":\"江城区\",\"441704\":\"阳东区\",\"441721\":\"阳西县\",\"441781\":\"阳春市\"},\"441800\":{\"441802\":\"清城区\",\"441803\":\"清新区\",\"441821\":\"佛冈县\",\"441823\":\"阳山县\",\"441825\":\"连山壮族瑶族自治县\",\"441826\":\"连南瑶族自治县\",\"441881\":\"英德市\",\"441882\":\"连州市\"},\"441900\":{\"441901\":\"中堂镇\",\"441903\":\"南城街道\",\"441904\":\"长安镇\",\"441905\":\"东坑镇\",\"441906\":\"樟木头镇\",\"441907\":\"莞城街道\",\"441908\":\"石龙镇\",\"441909\":\"桥头镇\",\"441910\":\"万江街道\",\"441911\":\"麻涌镇\",\"441912\":\"虎门镇\",\"441913\":\"谢岗镇\",\"441914\":\"石碣镇\",\"441915\":\"茶山镇\",\"441916\":\"东城街道\",\"441917\":\"洪梅镇\",\"441918\":\"道滘镇\",\"441919\":\"高埗镇\",\"441920\":\"企石镇\",\"441921\":\"凤岗镇\",\"441922\":\"大岭山镇\",\"441923\":\"松山湖\",\"441924\":\"清溪镇\",\"441925\":\"望牛墩镇\",\"441926\":\"厚街镇\",\"441927\":\"常平镇\",\"441928\":\"寮步镇\",\"441929\":\"石排镇\",\"441930\":\"横沥镇\",\"441931\":\"塘厦镇\",\"441932\":\"黄江镇\",\"441933\":\"大朗镇\",\"441934\":\"东莞港\",\"441935\":\"东莞生态园\",\"441990\":\"沙田镇\"},\"442000\":{\"442001\":\"南头镇\",\"442002\":\"神湾镇\",\"442003\":\"东凤镇\",\"442004\":\"五桂山街道\",\"442005\":\"黄圃镇\",\"442006\":\"小榄镇\",\"442007\":\"石岐街道\",\"442008\":\"横栏镇\",\"442009\":\"三角镇\",\"442010\":\"三乡镇\",\"442011\":\"港口镇\",\"442012\":\"沙溪镇\",\"442013\":\"板芙镇\",\"442015\":\"东升镇\",\"442016\":\"阜沙镇\",\"442017\":\"民众镇\",\"442018\":\"东区街道\",\"442019\":\"火炬开发区街道办事处\",\"442020\":\"西区街道\",\"442021\":\"南区街道\",\"442022\":\"古镇镇\",\"442023\":\"坦洲镇\",\"442024\":\"大涌镇\",\"442025\":\"南朗镇\"},\"445100\":{\"445102\":\"湘桥区\",\"445103\":\"潮安区\",\"445122\":\"饶平县\"},\"445200\":{\"445202\":\"榕城区\",\"445203\":\"揭东区\",\"445222\":\"揭西县\",\"445224\":\"惠来县\",\"445281\":\"普宁市\"},\"445300\":{\"445302\":\"云城区\",\"445303\":\"云安区\",\"445321\":\"新兴县\",\"445322\":\"郁南县\",\"445381\":\"罗定市\"},\"450000\":{\"450100\":\"南宁市\",\"450200\":\"柳州市\",\"450300\":\"桂林市\",\"450400\":\"梧州市\",\"450500\":\"北海市\",\"450600\":\"防城港市\",\"450700\":\"钦州市\",\"450800\":\"贵港市\",\"450900\":\"玉林市\",\"451000\":\"百色市\",\"451100\":\"贺州市\",\"451200\":\"河池市\",\"451300\":\"来宾市\",\"451400\":\"崇左市\"},\"450100\":{\"450102\":\"兴宁区\",\"450103\":\"青秀区\",\"450105\":\"江南区\",\"450107\":\"西乡塘区\",\"450108\":\"良庆区\",\"450109\":\"邕宁区\",\"450110\":\"武鸣区\",\"450123\":\"隆安县\",\"450124\":\"马山县\",\"450125\":\"上林县\",\"450126\":\"宾阳县\",\"450127\":\"横县\"},\"450200\":{\"450202\":\"城中区\",\"450203\":\"鱼峰区\",\"450204\":\"柳南区\",\"450205\":\"柳北区\",\"450206\":\"柳江区\",\"450222\":\"柳城县\",\"450223\":\"鹿寨县\",\"450224\":\"融安县\",\"450225\":\"融水苗族自治县\",\"450226\":\"三江侗族自治县\"},\"450300\":{\"450302\":\"秀峰区\",\"450303\":\"叠彩区\",\"450304\":\"象山区\",\"450305\":\"七星区\",\"450311\":\"雁山区\",\"450312\":\"临桂区\",\"450321\":\"阳朔县\",\"450323\":\"灵川县\",\"450324\":\"全州县\",\"450325\":\"兴安县\",\"450326\":\"永福县\",\"450327\":\"灌阳县\",\"450328\":\"龙胜各族自治县\",\"450329\":\"资源县\",\"450330\":\"平乐县\",\"450332\":\"恭城瑶族自治县\",\"450381\":\"荔浦市\"},\"450400\":{\"450403\":\"万秀区\",\"450405\":\"长洲区\",\"450406\":\"龙圩区\",\"450421\":\"苍梧县\",\"450422\":\"藤县\",\"450423\":\"蒙山县\",\"450481\":\"岑溪市\"},\"450500\":{\"450502\":\"海城区\",\"450503\":\"银海区\",\"450512\":\"铁山港区\",\"450521\":\"合浦县\"},\"450600\":{\"450602\":\"港口区\",\"450603\":\"防城区\",\"450621\":\"上思县\",\"450681\":\"东兴市\"},\"450700\":{\"450702\":\"钦南区\",\"450703\":\"钦北区\",\"450721\":\"灵山县\",\"450722\":\"浦北县\"},\"450800\":{\"450802\":\"港北区\",\"450803\":\"港南区\",\"450804\":\"覃塘区\",\"450821\":\"平南县\",\"450881\":\"桂平市\"},\"450900\":{\"450902\":\"玉州区\",\"450903\":\"福绵区\",\"450921\":\"容县\",\"450922\":\"陆川县\",\"450923\":\"博白县\",\"450924\":\"兴业县\",\"450981\":\"北流市\"},\"451000\":{\"451002\":\"右江区\",\"451003\":\"田阳区\",\"451022\":\"田东县\",\"451024\":\"德保县\",\"451026\":\"那坡县\",\"451027\":\"凌云县\",\"451028\":\"乐业县\",\"451029\":\"田林县\",\"451030\":\"西林县\",\"451031\":\"隆林各族自治县\",\"451081\":\"靖西市\",\"451082\":\"平果市\"},\"451100\":{\"451102\":\"八步区\",\"451103\":\"平桂区\",\"451121\":\"昭平县\",\"451122\":\"钟山县\",\"451123\":\"富川瑶族自治县\"},\"451200\":{\"451202\":\"金城江区\",\"451203\":\"宜州区\",\"451221\":\"南丹县\",\"451222\":\"天峨县\",\"451223\":\"凤山县\",\"451224\":\"东兰县\",\"451225\":\"罗城仫佬族自治县\",\"451226\":\"环江毛南族自治县\",\"451227\":\"巴马瑶族自治县\",\"451228\":\"都安瑶族自治县\",\"451229\":\"大化瑶族自治县\"},\"451300\":{\"451302\":\"兴宾区\",\"451321\":\"忻城县\",\"451322\":\"象州县\",\"451323\":\"武宣县\",\"451324\":\"金秀瑶族自治县\",\"451381\":\"合山市\"},\"451400\":{\"451402\":\"江州区\",\"451421\":\"扶绥县\",\"451422\":\"宁明县\",\"451423\":\"龙州县\",\"451424\":\"大新县\",\"451425\":\"天等县\",\"451481\":\"凭祥市\"},\"460000\":{\"460100\":\"海口市\",\"460200\":\"三亚市\",\"460300\":\"三沙市\",\"460400\":\"儋州市\",\"469000\":\"省直辖县\"},\"460100\":{\"460105\":\"秀英区\",\"460106\":\"龙华区\",\"460107\":\"琼山区\",\"460108\":\"美兰区\"},\"460200\":{\"460202\":\"海棠区\",\"460203\":\"吉阳区\",\"460204\":\"天涯区\",\"460205\":\"崖州区\"},\"460300\":{\"460321\":\"西沙区\",\"460322\":\"南沙区\"},\"460400\":{\"460401\":\"那大镇\",\"460402\":\"和庆镇\",\"460403\":\"南丰镇\",\"460404\":\"大成镇\",\"460405\":\"雅星镇\",\"460406\":\"兰洋镇\",\"460407\":\"光村镇\",\"460408\":\"木棠镇\",\"460409\":\"海头镇\",\"460410\":\"峨蔓镇\",\"460411\":\"王五镇\",\"460412\":\"白马井镇\",\"460413\":\"中和镇\",\"460414\":\"排浦镇\",\"460415\":\"东成镇\",\"460416\":\"新州镇\",\"460417\":\"洋浦经济开发区\",\"460418\":\"华南热作学院\"},\"469000\":{\"469001\":\"五指山市\",\"469002\":\"琼海市\",\"469005\":\"文昌市\",\"469006\":\"万宁市\",\"469007\":\"东方市\",\"469021\":\"定安县\",\"469022\":\"屯昌县\",\"469023\":\"澄迈县\",\"469024\":\"临高县\",\"469025\":\"白沙黎族自治县\",\"469026\":\"昌江黎族自治县\",\"469027\":\"乐东黎族自治县\",\"469028\":\"陵水黎族自治县\",\"469029\":\"保亭黎族苗族自治县\",\"469030\":\"琼中黎族苗族自治县\"},\"500000\":{\"500100\":\"重庆市\",\"500200\":\"县\"},\"500100\":{\"500101\":\"万州区\",\"500102\":\"涪陵区\",\"500103\":\"渝中区\",\"500104\":\"大渡口区\",\"500105\":\"江北区\",\"500106\":\"沙坪坝区\",\"500107\":\"九龙坡区\",\"500108\":\"南岸区\",\"500109\":\"北碚区\",\"500110\":\"綦江区\",\"500111\":\"大足区\",\"500112\":\"渝北区\",\"500113\":\"巴南区\",\"500114\":\"黔江区\",\"500115\":\"长寿区\",\"500116\":\"江津区\",\"500117\":\"合川区\",\"500118\":\"永川区\",\"500119\":\"南川区\",\"500120\":\"璧山区\",\"500151\":\"铜梁区\",\"500152\":\"潼南区\",\"500153\":\"荣昌区\",\"500154\":\"开州区\",\"500155\":\"梁平区\",\"500156\":\"武隆区\"},\"500200\":{\"500229\":\"城口县\",\"500230\":\"丰都县\",\"500231\":\"垫江县\",\"500233\":\"忠县\",\"500235\":\"云阳县\",\"500236\":\"奉节县\",\"500237\":\"巫山县\",\"500238\":\"巫溪县\",\"500240\":\"石柱土家族自治县\",\"500241\":\"秀山土家族苗族自治县\",\"500242\":\"酉阳土家族苗族自治县\",\"500243\":\"彭水苗族土家族自治县\"},\"510000\":{\"510100\":\"成都市\",\"510300\":\"自贡市\",\"510400\":\"攀枝花市\",\"510500\":\"泸州市\",\"510600\":\"德阳市\",\"510700\":\"绵阳市\",\"510800\":\"广元市\",\"510900\":\"遂宁市\",\"511000\":\"内江市\",\"511100\":\"乐山市\",\"511300\":\"南充市\",\"511400\":\"眉山市\",\"511500\":\"宜宾市\",\"511600\":\"广安市\",\"511700\":\"达州市\",\"511800\":\"雅安市\",\"511900\":\"巴中市\",\"512000\":\"资阳市\",\"513200\":\"阿坝藏族羌族自治州\",\"513300\":\"甘孜藏族自治州\",\"513400\":\"凉山彝族自治州\"},\"510100\":{\"510104\":\"锦江区\",\"510105\":\"青羊区\",\"510106\":\"金牛区\",\"510107\":\"武侯区\",\"510108\":\"成华区\",\"510112\":\"龙泉驿区\",\"510113\":\"青白江区\",\"510114\":\"新都区\",\"510115\":\"温江区\",\"510116\":\"双流区\",\"510117\":\"郫都区\",\"510121\":\"金堂县\",\"510129\":\"大邑县\",\"510131\":\"蒲江县\",\"510132\":\"新津县\",\"510181\":\"都江堰市\",\"510182\":\"彭州市\",\"510183\":\"邛崃市\",\"510184\":\"崇州市\",\"510185\":\"简阳市\",\"510191\":\"高新区\"},\"510300\":{\"510302\":\"自流井区\",\"510303\":\"贡井区\",\"510304\":\"大安区\",\"510311\":\"沿滩区\",\"510321\":\"荣县\",\"510322\":\"富顺县\"},\"510400\":{\"510402\":\"东区\",\"510403\":\"西区\",\"510411\":\"仁和区\",\"510421\":\"米易县\",\"510422\":\"盐边县\"},\"510500\":{\"510502\":\"江阳区\",\"510503\":\"纳溪区\",\"510504\":\"龙马潭区\",\"510521\":\"泸县\",\"510522\":\"合江县\",\"510524\":\"叙永县\",\"510525\":\"古蔺县\"},\"510600\":{\"510603\":\"旌阳区\",\"510604\":\"罗江区\",\"510623\":\"中江县\",\"510681\":\"广汉市\",\"510682\":\"什邡市\",\"510683\":\"绵竹市\"},\"510700\":{\"510703\":\"涪城区\",\"510704\":\"游仙区\",\"510705\":\"安州区\",\"510722\":\"三台县\",\"510723\":\"盐亭县\",\"510725\":\"梓潼县\",\"510726\":\"北川羌族自治县\",\"510727\":\"平武县\",\"510781\":\"江油市\",\"510791\":\"高新区\"},\"510800\":{\"510802\":\"利州区\",\"510811\":\"昭化区\",\"510812\":\"朝天区\",\"510821\":\"旺苍县\",\"510822\":\"青川县\",\"510823\":\"剑阁县\",\"510824\":\"苍溪县\"},\"510900\":{\"510903\":\"船山区\",\"510904\":\"安居区\",\"510921\":\"蓬溪县\",\"510923\":\"大英县\",\"510981\":\"射洪市\"},\"511000\":{\"511002\":\"市中区\",\"511011\":\"东兴区\",\"511024\":\"威远县\",\"511025\":\"资中县\",\"511083\":\"隆昌市\"},\"511100\":{\"511102\":\"市中区\",\"511111\":\"沙湾区\",\"511112\":\"五通桥区\",\"511113\":\"金口河区\",\"511123\":\"犍为县\",\"511124\":\"井研县\",\"511126\":\"夹江县\",\"511129\":\"沐川县\",\"511132\":\"峨边彝族自治县\",\"511133\":\"马边彝族自治县\",\"511181\":\"峨眉山市\"},\"511300\":{\"511302\":\"顺庆区\",\"511303\":\"高坪区\",\"511304\":\"嘉陵区\",\"511321\":\"南部县\",\"511322\":\"营山县\",\"511323\":\"蓬安县\",\"511324\":\"仪陇县\",\"511325\":\"西充县\",\"511381\":\"阆中市\"},\"511400\":{\"511402\":\"东坡区\",\"511403\":\"彭山区\",\"511421\":\"仁寿县\",\"511423\":\"洪雅县\",\"511424\":\"丹棱县\",\"511425\":\"青神县\"},\"511500\":{\"511502\":\"翠屏区\",\"511503\":\"南溪区\",\"511504\":\"叙州区\",\"511523\":\"江安县\",\"511524\":\"长宁县\",\"511525\":\"高县\",\"511526\":\"珙县\",\"511527\":\"筠连县\",\"511528\":\"兴文县\",\"511529\":\"屏山县\"},\"511600\":{\"511602\":\"广安区\",\"511603\":\"前锋区\",\"511621\":\"岳池县\",\"511622\":\"武胜县\",\"511623\":\"邻水县\",\"511681\":\"华蓥市\"},\"511700\":{\"511702\":\"通川区\",\"511703\":\"达川区\",\"511722\":\"宣汉县\",\"511723\":\"开江县\",\"511724\":\"大竹县\",\"511725\":\"渠县\",\"511781\":\"万源市\"},\"511800\":{\"511802\":\"雨城区\",\"511803\":\"名山区\",\"511822\":\"荥经县\",\"511823\":\"汉源县\",\"511824\":\"石棉县\",\"511825\":\"天全县\",\"511826\":\"芦山县\",\"511827\":\"宝兴县\"},\"511900\":{\"511902\":\"巴州区\",\"511903\":\"恩阳区\",\"511921\":\"通江县\",\"511922\":\"南江县\",\"511923\":\"平昌县\",\"511971\":\"巴中经济开发区\"},\"512000\":{\"512002\":\"雁江区\",\"512021\":\"安岳县\",\"512022\":\"乐至县\"},\"513200\":{\"513201\":\"马尔康市\",\"513221\":\"汶川县\",\"513222\":\"理县\",\"513223\":\"茂县\",\"513224\":\"松潘县\",\"513225\":\"九寨沟县\",\"513226\":\"金川县\",\"513227\":\"小金县\",\"513228\":\"黑水县\",\"513230\":\"壤塘县\",\"513231\":\"阿坝县\",\"513232\":\"若尔盖县\",\"513233\":\"红原县\"},\"513300\":{\"513301\":\"康定市\",\"513322\":\"泸定县\",\"513323\":\"丹巴县\",\"513324\":\"九龙县\",\"513325\":\"雅江县\",\"513326\":\"道孚县\",\"513327\":\"炉霍县\",\"513328\":\"甘孜县\",\"513329\":\"新龙县\",\"513330\":\"德格县\",\"513331\":\"白玉县\",\"513332\":\"石渠县\",\"513333\":\"色达县\",\"513334\":\"理塘县\",\"513335\":\"巴塘县\",\"513336\":\"乡城县\",\"513337\":\"稻城县\",\"513338\":\"得荣县\"},\"513400\":{\"513401\":\"西昌市\",\"513422\":\"木里藏族自治县\",\"513423\":\"盐源县\",\"513424\":\"德昌县\",\"513425\":\"会理县\",\"513426\":\"会东县\",\"513427\":\"宁南县\",\"513428\":\"普格县\",\"513429\":\"布拖县\",\"513430\":\"金阳县\",\"513431\":\"昭觉县\",\"513432\":\"喜德县\",\"513433\":\"冕宁县\",\"513434\":\"越西县\",\"513435\":\"甘洛县\",\"513436\":\"美姑县\",\"513437\":\"雷波县\"},\"520000\":{\"520100\":\"贵阳市\",\"520200\":\"六盘水市\",\"520300\":\"遵义市\",\"520400\":\"安顺市\",\"520500\":\"毕节市\",\"520600\":\"铜仁市\",\"522300\":\"黔西南布依族苗族自治州\",\"522600\":\"黔东南苗族侗族自治州\",\"522700\":\"黔南布依族苗族自治州\"},\"520100\":{\"520102\":\"南明区\",\"520103\":\"云岩区\",\"520111\":\"花溪区\",\"520112\":\"乌当区\",\"520113\":\"白云区\",\"520115\":\"观山湖区\",\"520121\":\"开阳县\",\"520122\":\"息烽县\",\"520123\":\"修文县\",\"520181\":\"清镇市\"},\"520200\":{\"520201\":\"钟山区\",\"520203\":\"六枝特区\",\"520221\":\"水城县\",\"520281\":\"盘州市\"},\"520300\":{\"520302\":\"红花岗区\",\"520303\":\"汇川区\",\"520304\":\"播州区\",\"520322\":\"桐梓县\",\"520323\":\"绥阳县\",\"520324\":\"正安县\",\"520325\":\"道真仡佬族苗族自治县\",\"520326\":\"务川仡佬族苗族自治县\",\"520327\":\"凤冈县\",\"520328\":\"湄潭县\",\"520329\":\"余庆县\",\"520330\":\"习水县\",\"520381\":\"赤水市\",\"520382\":\"仁怀市\"},\"520400\":{\"520402\":\"西秀区\",\"520403\":\"平坝区\",\"520422\":\"普定县\",\"520423\":\"镇宁布依族苗族自治县\",\"520424\":\"关岭布依族苗族自治县\",\"520425\":\"紫云苗族布依族自治县\"},\"520500\":{\"520502\":\"七星关区\",\"520521\":\"大方县\",\"520522\":\"黔西县\",\"520523\":\"金沙县\",\"520524\":\"织金县\",\"520525\":\"纳雍县\",\"520526\":\"威宁彝族回族苗族自治县\",\"520527\":\"赫章县\"},\"520600\":{\"520602\":\"碧江区\",\"520603\":\"万山区\",\"520621\":\"江口县\",\"520622\":\"玉屏侗族自治县\",\"520623\":\"石阡县\",\"520624\":\"思南县\",\"520625\":\"印江土家族苗族自治县\",\"520626\":\"德江县\",\"520627\":\"沿河土家族自治县\",\"520628\":\"松桃苗族自治县\"},\"522300\":{\"522301\":\"兴义市\",\"522302\":\"兴仁市\",\"522323\":\"普安县\",\"522324\":\"晴隆县\",\"522325\":\"贞丰县\",\"522326\":\"望谟县\",\"522327\":\"册亨县\",\"522328\":\"安龙县\"},\"522600\":{\"522601\":\"凯里市\",\"522622\":\"黄平县\",\"522623\":\"施秉县\",\"522624\":\"三穗县\",\"522625\":\"镇远县\",\"522626\":\"岑巩县\",\"522627\":\"天柱县\",\"522628\":\"锦屏县\",\"522629\":\"剑河县\",\"522630\":\"台江县\",\"522631\":\"黎平县\",\"522632\":\"榕江县\",\"522633\":\"从江县\",\"522634\":\"雷山县\",\"522635\":\"麻江县\",\"522636\":\"丹寨县\"},\"522700\":{\"522701\":\"都匀市\",\"522702\":\"福泉市\",\"522722\":\"荔波县\",\"522723\":\"贵定县\",\"522725\":\"瓮安县\",\"522726\":\"独山县\",\"522727\":\"平塘县\",\"522728\":\"罗甸县\",\"522729\":\"长顺县\",\"522730\":\"龙里县\",\"522731\":\"惠水县\",\"522732\":\"三都水族自治县\"},\"530000\":{\"530100\":\"昆明市\",\"530300\":\"曲靖市\",\"530400\":\"玉溪市\",\"530500\":\"保山市\",\"530600\":\"昭通市\",\"530700\":\"丽江市\",\"530800\":\"普洱市\",\"530900\":\"临沧市\",\"532300\":\"楚雄彝族自治州\",\"532500\":\"红河哈尼族彝族自治州\",\"532600\":\"文山壮族苗族自治州\",\"532800\":\"西双版纳傣族自治州\",\"532900\":\"大理白族自治州\",\"533100\":\"德宏傣族景颇族自治州\",\"533300\":\"怒江傈僳族自治州\",\"533400\":\"迪庆藏族自治州\"},\"530100\":{\"530102\":\"五华区\",\"530103\":\"盘龙区\",\"530111\":\"官渡区\",\"530112\":\"西山区\",\"530113\":\"东川区\",\"530114\":\"呈贡区\",\"530115\":\"晋宁区\",\"530124\":\"富民县\",\"530125\":\"宜良县\",\"530126\":\"石林彝族自治县\",\"530127\":\"嵩明县\",\"530128\":\"禄劝彝族苗族自治县\",\"530129\":\"寻甸回族彝族自治县\",\"530181\":\"安宁市\"},\"530300\":{\"530302\":\"麒麟区\",\"530303\":\"沾益区\",\"530304\":\"马龙区\",\"530322\":\"陆良县\",\"530323\":\"师宗县\",\"530324\":\"罗平县\",\"530325\":\"富源县\",\"530326\":\"会泽县\",\"530381\":\"宣威市\"},\"530400\":{\"530402\":\"红塔区\",\"530403\":\"江川区\",\"530423\":\"通海县\",\"530424\":\"华宁县\",\"530425\":\"易门县\",\"530426\":\"峨山彝族自治县\",\"530427\":\"新平彝族傣族自治县\",\"530428\":\"元江哈尼族彝族傣族自治县\",\"530481\":\"澄江市\"},\"530500\":{\"530502\":\"隆阳区\",\"530521\":\"施甸县\",\"530523\":\"龙陵县\",\"530524\":\"昌宁县\",\"530581\":\"腾冲市\"},\"530600\":{\"530602\":\"昭阳区\",\"530621\":\"鲁甸县\",\"530622\":\"巧家县\",\"530623\":\"盐津县\",\"530624\":\"大关县\",\"530625\":\"永善县\",\"530626\":\"绥江县\",\"530627\":\"镇雄县\",\"530628\":\"彝良县\",\"530629\":\"威信县\",\"530681\":\"水富市\"},\"530700\":{\"530702\":\"古城区\",\"530721\":\"玉龙纳西族自治县\",\"530722\":\"永胜县\",\"530723\":\"华坪县\",\"530724\":\"宁蒗彝族自治县\"},\"530800\":{\"530802\":\"思茅区\",\"530821\":\"宁洱哈尼族彝族自治县\",\"530822\":\"墨江哈尼族自治县\",\"530823\":\"景东彝族自治县\",\"530824\":\"景谷傣族彝族自治县\",\"530825\":\"镇沅彝族哈尼族拉祜族自治县\",\"530826\":\"江城哈尼族彝族自治县\",\"530827\":\"孟连傣族拉祜族佤族自治县\",\"530828\":\"澜沧拉祜族自治县\",\"530829\":\"西盟佤族自治县\"},\"530900\":{\"530902\":\"临翔区\",\"530921\":\"凤庆县\",\"530922\":\"云县\",\"530923\":\"永德县\",\"530924\":\"镇康县\",\"530925\":\"双江拉祜族佤族布朗族傣族自治县\",\"530926\":\"耿马傣族佤族自治县\",\"530927\":\"沧源佤族自治县\"},\"532300\":{\"532301\":\"楚雄市\",\"532322\":\"双柏县\",\"532323\":\"牟定县\",\"532324\":\"南华县\",\"532325\":\"姚安县\",\"532326\":\"大姚县\",\"532327\":\"永仁县\",\"532328\":\"元谋县\",\"532329\":\"武定县\",\"532331\":\"禄丰县\"},\"532500\":{\"532501\":\"个旧市\",\"532502\":\"开远市\",\"532503\":\"蒙自市\",\"532504\":\"弥勒市\",\"532523\":\"屏边苗族自治县\",\"532524\":\"建水县\",\"532525\":\"石屏县\",\"532527\":\"泸西县\",\"532528\":\"元阳县\",\"532529\":\"红河县\",\"532530\":\"金平苗族瑶族傣族自治县\",\"532531\":\"绿春县\",\"532532\":\"河口瑶族自治县\"},\"532600\":{\"532601\":\"文山市\",\"532622\":\"砚山县\",\"532623\":\"西畴县\",\"532624\":\"麻栗坡县\",\"532625\":\"马关县\",\"532626\":\"丘北县\",\"532627\":\"广南县\",\"532628\":\"富宁县\"},\"532800\":{\"532801\":\"景洪市\",\"532822\":\"勐海县\",\"532823\":\"勐腊县\"},\"532900\":{\"532901\":\"大理市\",\"532922\":\"漾濞彝族自治县\",\"532923\":\"祥云县\",\"532924\":\"宾川县\",\"532925\":\"弥渡县\",\"532926\":\"南涧彝族自治县\",\"532927\":\"巍山彝族回族自治县\",\"532928\":\"永平县\",\"532929\":\"云龙县\",\"532930\":\"洱源县\",\"532931\":\"剑川县\",\"532932\":\"鹤庆县\"},\"533100\":{\"533102\":\"瑞丽市\",\"533103\":\"芒市\",\"533122\":\"梁河县\",\"533123\":\"盈江县\",\"533124\":\"陇川县\"},\"533300\":{\"533301\":\"泸水市\",\"533323\":\"福贡县\",\"533324\":\"贡山独龙族怒族自治县\",\"533325\":\"兰坪白族普米族自治县\"},\"533400\":{\"533401\":\"香格里拉市\",\"533422\":\"德钦县\",\"533423\":\"维西傈僳族自治县\"},\"540000\":{\"540100\":\"拉萨市\",\"540200\":\"日喀则市\",\"540300\":\"昌都市\",\"540400\":\"林芝市\",\"540500\":\"山南市\",\"540600\":\"那曲市\",\"542500\":\"阿里地区\"},\"540100\":{\"540102\":\"城关区\",\"540103\":\"堆龙德庆区\",\"540104\":\"达孜区\",\"540121\":\"林周县\",\"540122\":\"当雄县\",\"540123\":\"尼木县\",\"540124\":\"曲水县\",\"540127\":\"墨竹工卡县\"},\"540200\":{\"540202\":\"桑珠孜区\",\"540221\":\"南木林县\",\"540222\":\"江孜县\",\"540223\":\"定日县\",\"540224\":\"萨迦县\",\"540225\":\"拉孜县\",\"540226\":\"昂仁县\",\"540227\":\"谢通门县\",\"540228\":\"白朗县\",\"540229\":\"仁布县\",\"540230\":\"康马县\",\"540231\":\"定结县\",\"540232\":\"仲巴县\",\"540233\":\"亚东县\",\"540234\":\"吉隆县\",\"540235\":\"聂拉木县\",\"540236\":\"萨嘎县\",\"540237\":\"岗巴县\"},\"540300\":{\"540302\":\"卡若区\",\"540321\":\"江达县\",\"540322\":\"贡觉县\",\"540323\":\"类乌齐县\",\"540324\":\"丁青县\",\"540325\":\"察雅县\",\"540326\":\"八宿县\",\"540327\":\"左贡县\",\"540328\":\"芒康县\",\"540329\":\"洛隆县\",\"540330\":\"边坝县\"},\"540400\":{\"540402\":\"巴宜区\",\"540421\":\"工布江达县\",\"540422\":\"米林县\",\"540423\":\"墨脱县\",\"540424\":\"波密县\",\"540425\":\"察隅县\",\"540426\":\"朗县\"},\"540500\":{\"540502\":\"乃东区\",\"540521\":\"扎囊县\",\"540522\":\"贡嘎县\",\"540523\":\"桑日县\",\"540524\":\"琼结县\",\"540525\":\"曲松县\",\"540526\":\"措美县\",\"540527\":\"洛扎县\",\"540528\":\"加查县\",\"540529\":\"隆子县\",\"540530\":\"错那县\",\"540531\":\"浪卡子县\"},\"540600\":{\"540602\":\"色尼区\",\"540621\":\"嘉黎县\",\"540622\":\"比如县\",\"540623\":\"聂荣县\",\"540624\":\"安多县\",\"540625\":\"申扎县\",\"540626\":\"索县\",\"540627\":\"班戈县\",\"540628\":\"巴青县\",\"540629\":\"尼玛县\",\"540630\":\"双湖县\"},\"542500\":{\"542521\":\"普兰县\",\"542522\":\"札达县\",\"542523\":\"噶尔县\",\"542524\":\"日土县\",\"542525\":\"革吉县\",\"542526\":\"改则县\",\"542527\":\"措勤县\"},\"610000\":{\"610100\":\"西安市\",\"610200\":\"铜川市\",\"610300\":\"宝鸡市\",\"610400\":\"咸阳市\",\"610500\":\"渭南市\",\"610600\":\"延安市\",\"610700\":\"汉中市\",\"610800\":\"榆林市\",\"610900\":\"安康市\",\"611000\":\"商洛市\"},\"610100\":{\"610102\":\"新城区\",\"610103\":\"碑林区\",\"610104\":\"莲湖区\",\"610111\":\"灞桥区\",\"610112\":\"未央区\",\"610113\":\"雁塔区\",\"610114\":\"阎良区\",\"610115\":\"临潼区\",\"610116\":\"长安区\",\"610117\":\"高陵区\",\"610118\":\"鄠邑区\",\"610122\":\"蓝田县\",\"610124\":\"周至县\"},\"610200\":{\"610202\":\"王益区\",\"610203\":\"印台区\",\"610204\":\"耀州区\",\"610222\":\"宜君县\"},\"610300\":{\"610302\":\"渭滨区\",\"610303\":\"金台区\",\"610304\":\"陈仓区\",\"610322\":\"凤翔县\",\"610323\":\"岐山县\",\"610324\":\"扶风县\",\"610326\":\"眉县\",\"610327\":\"陇县\",\"610328\":\"千阳县\",\"610329\":\"麟游县\",\"610330\":\"凤县\",\"610331\":\"太白县\"},\"610400\":{\"610402\":\"秦都区\",\"610403\":\"杨陵区\",\"610404\":\"渭城区\",\"610422\":\"三原县\",\"610423\":\"泾阳县\",\"610424\":\"乾县\",\"610425\":\"礼泉县\",\"610426\":\"永寿县\",\"610428\":\"长武县\",\"610429\":\"旬邑县\",\"610430\":\"淳化县\",\"610431\":\"武功县\",\"610481\":\"兴平市\",\"610482\":\"彬州市\"},\"610500\":{\"610502\":\"临渭区\",\"610503\":\"华州区\",\"610522\":\"潼关县\",\"610523\":\"大荔县\",\"610524\":\"合阳县\",\"610525\":\"澄城县\",\"610526\":\"蒲城县\",\"610527\":\"白水县\",\"610528\":\"富平县\",\"610581\":\"韩城市\",\"610582\":\"华阴市\"},\"610600\":{\"610602\":\"宝塔区\",\"610603\":\"安塞区\",\"610621\":\"延长县\",\"610622\":\"延川县\",\"610625\":\"志丹县\",\"610626\":\"吴起县\",\"610627\":\"甘泉县\",\"610628\":\"富县\",\"610629\":\"洛川县\",\"610630\":\"宜川县\",\"610631\":\"黄龙县\",\"610632\":\"黄陵县\",\"610681\":\"子长市\"},\"610700\":{\"610702\":\"汉台区\",\"610703\":\"南郑区\",\"610722\":\"城固县\",\"610723\":\"洋县\",\"610724\":\"西乡县\",\"610725\":\"勉县\",\"610726\":\"宁强县\",\"610727\":\"略阳县\",\"610728\":\"镇巴县\",\"610729\":\"留坝县\",\"610730\":\"佛坪县\"},\"610800\":{\"610802\":\"榆阳区\",\"610803\":\"横山区\",\"610822\":\"府谷县\",\"610824\":\"靖边县\",\"610825\":\"定边县\",\"610826\":\"绥德县\",\"610827\":\"米脂县\",\"610828\":\"佳县\",\"610829\":\"吴堡县\",\"610830\":\"清涧县\",\"610831\":\"子洲县\",\"610881\":\"神木市\"},\"610900\":{\"610902\":\"汉滨区\",\"610921\":\"汉阴县\",\"610922\":\"石泉县\",\"610923\":\"宁陕县\",\"610924\":\"紫阳县\",\"610925\":\"岚皋县\",\"610926\":\"平利县\",\"610927\":\"镇坪县\",\"610928\":\"旬阳县\",\"610929\":\"白河县\"},\"611000\":{\"611002\":\"商州区\",\"611021\":\"洛南县\",\"611022\":\"丹凤县\",\"611023\":\"商南县\",\"611024\":\"山阳县\",\"611025\":\"镇安县\",\"611026\":\"柞水县\"},\"620000\":{\"620100\":\"兰州市\",\"620200\":\"嘉峪关市\",\"620300\":\"金昌市\",\"620400\":\"白银市\",\"620500\":\"天水市\",\"620600\":\"武威市\",\"620700\":\"张掖市\",\"620800\":\"平凉市\",\"620900\":\"酒泉市\",\"621000\":\"庆阳市\",\"621100\":\"定西市\",\"621200\":\"陇南市\",\"622900\":\"临夏回族自治州\",\"623000\":\"甘南藏族自治州\"},\"620100\":{\"620102\":\"城关区\",\"620103\":\"七里河区\",\"620104\":\"西固区\",\"620105\":\"安宁区\",\"620111\":\"红古区\",\"620121\":\"永登县\",\"620122\":\"皋兰县\",\"620123\":\"榆中县\",\"620171\":\"兰州新区\"},\"620200\":{\"620201\":\"市辖区\",\"620290\":\"雄关区\",\"620291\":\"长城区\",\"620292\":\"镜铁区\",\"620293\":\"新城镇\",\"620294\":\"峪泉镇\",\"620295\":\"文殊镇\"},\"620300\":{\"620302\":\"金川区\",\"620321\":\"永昌县\"},\"620400\":{\"620402\":\"白银区\",\"620403\":\"平川区\",\"620421\":\"靖远县\",\"620422\":\"会宁县\",\"620423\":\"景泰县\"},\"620500\":{\"620502\":\"秦州区\",\"620503\":\"麦积区\",\"620521\":\"清水县\",\"620522\":\"秦安县\",\"620523\":\"甘谷县\",\"620524\":\"武山县\",\"620525\":\"张家川回族自治县\"},\"620600\":{\"620602\":\"凉州区\",\"620621\":\"民勤县\",\"620622\":\"古浪县\",\"620623\":\"天祝藏族自治县\"},\"620700\":{\"620702\":\"甘州区\",\"620721\":\"肃南裕固族自治县\",\"620722\":\"民乐县\",\"620723\":\"临泽县\",\"620724\":\"高台县\",\"620725\":\"山丹县\"},\"620800\":{\"620802\":\"崆峒区\",\"620821\":\"泾川县\",\"620822\":\"灵台县\",\"620823\":\"崇信县\",\"620825\":\"庄浪县\",\"620826\":\"静宁县\",\"620881\":\"华亭市\"},\"620900\":{\"620902\":\"肃州区\",\"620921\":\"金塔县\",\"620922\":\"瓜州县\",\"620923\":\"肃北蒙古族自治县\",\"620924\":\"阿克塞哈萨克族自治县\",\"620981\":\"玉门市\",\"620982\":\"敦煌市\"},\"621000\":{\"621002\":\"西峰区\",\"621021\":\"庆城县\",\"621022\":\"环县\",\"621023\":\"华池县\",\"621024\":\"合水县\",\"621025\":\"正宁县\",\"621026\":\"宁县\",\"621027\":\"镇原县\"},\"621100\":{\"621102\":\"安定区\",\"621121\":\"通渭县\",\"621122\":\"陇西县\",\"621123\":\"渭源县\",\"621124\":\"临洮县\",\"621125\":\"漳县\",\"621126\":\"岷县\"},\"621200\":{\"621202\":\"武都区\",\"621221\":\"成县\",\"621222\":\"文县\",\"621223\":\"宕昌县\",\"621224\":\"康县\",\"621225\":\"西和县\",\"621226\":\"礼县\",\"621227\":\"徽县\",\"621228\":\"两当县\"},\"622900\":{\"622901\":\"临夏市\",\"622921\":\"临夏县\",\"622922\":\"康乐县\",\"622923\":\"永靖县\",\"622924\":\"广河县\",\"622925\":\"和政县\",\"622926\":\"东乡族自治县\",\"622927\":\"积石山保安族东乡族撒拉族自治县\"},\"623000\":{\"623001\":\"合作市\",\"623021\":\"临潭县\",\"623022\":\"卓尼县\",\"623023\":\"舟曲县\",\"623024\":\"迭部县\",\"623025\":\"玛曲县\",\"623026\":\"碌曲县\",\"623027\":\"夏河县\"},\"630000\":{\"630100\":\"西宁市\",\"630200\":\"海东市\",\"632200\":\"海北藏族自治州\",\"632300\":\"黄南藏族自治州\",\"632500\":\"海南藏族自治州\",\"632600\":\"果洛藏族自治州\",\"632700\":\"玉树藏族自治州\",\"632800\":\"海西蒙古族藏族自治州\"},\"630100\":{\"630102\":\"城东区\",\"630103\":\"城中区\",\"630104\":\"城西区\",\"630105\":\"城北区\",\"630106\":\"湟中区\",\"630121\":\"大通回族土族自治县\",\"630123\":\"湟源县\"},\"630200\":{\"630202\":\"乐都区\",\"630203\":\"平安区\",\"630222\":\"民和回族土族自治县\",\"630223\":\"互助土族自治县\",\"630224\":\"化隆回族自治县\",\"630225\":\"循化撒拉族自治县\"},\"632200\":{\"632221\":\"门源回族自治县\",\"632222\":\"祁连县\",\"632223\":\"海晏县\",\"632224\":\"刚察县\"},\"632300\":{\"632321\":\"同仁县\",\"632322\":\"尖扎县\",\"632323\":\"泽库县\",\"632324\":\"河南蒙古族自治县\"},\"632500\":{\"632521\":\"共和县\",\"632522\":\"同德县\",\"632523\":\"贵德县\",\"632524\":\"兴海县\",\"632525\":\"贵南县\"},\"632600\":{\"632621\":\"玛沁县\",\"632622\":\"班玛县\",\"632623\":\"甘德县\",\"632624\":\"达日县\",\"632625\":\"久治县\",\"632626\":\"玛多县\"},\"632700\":{\"632701\":\"玉树市\",\"632722\":\"杂多县\",\"632723\":\"称多县\",\"632724\":\"治多县\",\"632725\":\"囊谦县\",\"632726\":\"曲麻莱县\"},\"632800\":{\"632801\":\"格尔木市\",\"632802\":\"德令哈市\",\"632803\":\"茫崖市\",\"632821\":\"乌兰县\",\"632822\":\"都兰县\",\"632823\":\"天峻县\",\"632857\":\"大柴旦行政委员会\"},\"640000\":{\"640100\":\"银川市\",\"640200\":\"石嘴山市\",\"640300\":\"吴忠市\",\"640400\":\"固原市\",\"640500\":\"中卫市\"},\"640100\":{\"640104\":\"兴庆区\",\"640105\":\"西夏区\",\"640106\":\"金凤区\",\"640121\":\"永宁县\",\"640122\":\"贺兰县\",\"640181\":\"灵武市\"},\"640200\":{\"640202\":\"大武口区\",\"640205\":\"惠农区\",\"640221\":\"平罗县\"},\"640300\":{\"640302\":\"利通区\",\"640303\":\"红寺堡区\",\"640323\":\"盐池县\",\"640324\":\"同心县\",\"640381\":\"青铜峡市\"},\"640400\":{\"640402\":\"原州区\",\"640422\":\"西吉县\",\"640423\":\"隆德县\",\"640424\":\"泾源县\",\"640425\":\"彭阳县\"},\"640500\":{\"640502\":\"沙坡头区\",\"640521\":\"中宁县\",\"640522\":\"海原县\"},\"650000\":{\"650100\":\"乌鲁木齐市\",\"650200\":\"克拉玛依市\",\"650400\":\"吐鲁番市\",\"650500\":\"哈密市\",\"652300\":\"昌吉回族自治州\",\"652700\":\"博尔塔拉蒙古自治州\",\"652800\":\"巴音郭楞蒙古自治州\",\"652900\":\"阿克苏地区\",\"653000\":\"克孜勒苏柯尔克孜自治州\",\"653100\":\"喀什地区\",\"653200\":\"和田地区\",\"654000\":\"伊犁哈萨克自治州\",\"654200\":\"塔城地区\",\"654300\":\"阿勒泰地区\",\"659000\":\"自治区直辖县级行政区划\"},\"650100\":{\"650102\":\"天山区\",\"650103\":\"沙依巴克区\",\"650104\":\"新市区\",\"650105\":\"水磨沟区\",\"650106\":\"头屯河区\",\"650107\":\"达坂城区\",\"650109\":\"米东区\",\"650121\":\"乌鲁木齐县\"},\"650200\":{\"650202\":\"独山子区\",\"650203\":\"克拉玛依区\",\"650204\":\"白碱滩区\",\"650205\":\"乌尔禾区\"},\"650400\":{\"650402\":\"高昌区\",\"650421\":\"鄯善县\",\"650422\":\"托克逊县\"},\"650500\":{\"650502\":\"伊州区\",\"650521\":\"巴里坤哈萨克自治县\",\"650522\":\"伊吾县\"},\"652300\":{\"652301\":\"昌吉市\",\"652302\":\"阜康市\",\"652323\":\"呼图壁县\",\"652324\":\"玛纳斯县\",\"652325\":\"奇台县\",\"652327\":\"吉木萨尔县\",\"652328\":\"木垒哈萨克自治县\"},\"652700\":{\"652701\":\"博乐市\",\"652702\":\"阿拉山口市\",\"652722\":\"精河县\",\"652723\":\"温泉县\"},\"652800\":{\"652801\":\"库尔勒市\",\"652822\":\"轮台县\",\"652823\":\"尉犁县\",\"652824\":\"若羌县\",\"652825\":\"且末县\",\"652826\":\"焉耆回族自治县\",\"652827\":\"和静县\",\"652828\":\"和硕县\",\"652829\":\"博湖县\"},\"652900\":{\"652901\":\"阿克苏市\",\"652902\":\"库车市\",\"652922\":\"温宿县\",\"652924\":\"沙雅县\",\"652925\":\"新和县\",\"652926\":\"拜城县\",\"652927\":\"乌什县\",\"652928\":\"阿瓦提县\",\"652929\":\"柯坪县\"},\"653000\":{\"653001\":\"阿图什市\",\"653022\":\"阿克陶县\",\"653023\":\"阿合奇县\",\"653024\":\"乌恰县\"},\"653100\":{\"653101\":\"喀什市\",\"653121\":\"疏附县\",\"653122\":\"疏勒县\",\"653123\":\"英吉沙县\",\"653124\":\"泽普县\",\"653125\":\"莎车县\",\"653126\":\"叶城县\",\"653127\":\"麦盖提县\",\"653128\":\"岳普湖县\",\"653129\":\"伽师县\",\"653130\":\"巴楚县\",\"653131\":\"塔什库尔干塔吉克自治县\"},\"653200\":{\"653201\":\"和田市\",\"653221\":\"和田县\",\"653222\":\"墨玉县\",\"653223\":\"皮山县\",\"653224\":\"洛浦县\",\"653225\":\"策勒县\",\"653226\":\"于田县\",\"653227\":\"民丰县\"},\"654000\":{\"654002\":\"伊宁市\",\"654003\":\"奎屯市\",\"654004\":\"霍尔果斯市\",\"654021\":\"伊宁县\",\"654022\":\"察布查尔锡伯自治县\",\"654023\":\"霍城县\",\"654024\":\"巩留县\",\"654025\":\"新源县\",\"654026\":\"昭苏县\",\"654027\":\"特克斯县\",\"654028\":\"尼勒克县\"},\"654200\":{\"654201\":\"塔城市\",\"654202\":\"乌苏市\",\"654221\":\"额敏县\",\"654223\":\"沙湾县\",\"654224\":\"托里县\",\"654225\":\"裕民县\",\"654226\":\"和布克赛尔蒙古自治县\"},\"654300\":{\"654301\":\"阿勒泰市\",\"654321\":\"布尔津县\",\"654322\":\"富蕴县\",\"654323\":\"福海县\",\"654324\":\"哈巴河县\",\"654325\":\"青河县\",\"654326\":\"吉木乃县\"},\"659000\":{\"659001\":\"石河子市\",\"659002\":\"阿拉尔市\",\"659003\":\"图木舒克市\",\"659004\":\"五家渠市\",\"659005\":\"北屯市\",\"659006\":\"铁门关市\",\"659007\":\"双河市\",\"659008\":\"可克达拉市\",\"659009\":\"昆玉市\",\"659010\":\"胡杨河市\"},\"710000\":{\"710100\":\"台北市\",\"710200\":\"高雄市\",\"710300\":\"台南市\",\"710400\":\"台中市\",\"710500\":\"金门县\",\"710600\":\"南投县\",\"710700\":\"基隆市\",\"710800\":\"新竹市\",\"710900\":\"嘉义市\",\"711100\":\"新北市\",\"711200\":\"宜兰县\",\"711300\":\"新竹县\",\"711400\":\"桃园市\",\"711500\":\"苗栗县\",\"711700\":\"彰化县\",\"711900\":\"嘉义县\",\"712100\":\"云林县\",\"712400\":\"屏东县\",\"712500\":\"台东县\",\"712600\":\"花莲县\",\"712700\":\"澎湖县\",\"712800\":\"连江县\"},\"710100\":{\"710101\":\"中正区\",\"710102\":\"大同区\",\"710103\":\"中山区\",\"710104\":\"松山区\",\"710105\":\"大安区\",\"710106\":\"万华区\",\"710107\":\"信义区\",\"710108\":\"士林区\",\"710109\":\"北投区\",\"710110\":\"内湖区\",\"710111\":\"南港区\",\"710112\":\"文山区\",\"710199\":\"其它区\"},\"710200\":{\"710201\":\"新兴区\",\"710202\":\"前金区\",\"710203\":\"芩雅区\",\"710204\":\"盐埕区\",\"710205\":\"鼓山区\",\"710206\":\"旗津区\",\"710207\":\"前镇区\",\"710208\":\"三民区\",\"710209\":\"左营区\",\"710210\":\"楠梓区\",\"710211\":\"小港区\",\"710241\":\"苓雅区\",\"710242\":\"仁武区\",\"710243\":\"大社区\",\"710244\":\"冈山区\",\"710245\":\"路竹区\",\"710246\":\"阿莲区\",\"710247\":\"田寮区\",\"710248\":\"燕巢区\",\"710249\":\"桥头区\",\"710250\":\"梓官区\",\"710251\":\"弥陀区\",\"710252\":\"永安区\",\"710253\":\"湖内区\",\"710254\":\"凤山区\",\"710255\":\"大寮区\",\"710256\":\"林园区\",\"710257\":\"鸟松区\",\"710258\":\"大树区\",\"710259\":\"旗山区\",\"710260\":\"美浓区\",\"710261\":\"六龟区\",\"710262\":\"内门区\",\"710263\":\"杉林区\",\"710264\":\"甲仙区\",\"710265\":\"桃源区\",\"710266\":\"那玛夏区\",\"710267\":\"茂林区\",\"710268\":\"茄萣区\",\"710299\":\"其它区\"},\"710300\":{\"710301\":\"中西区\",\"710302\":\"东区\",\"710303\":\"南区\",\"710304\":\"北区\",\"710305\":\"安平区\",\"710306\":\"安南区\",\"710339\":\"永康区\",\"710340\":\"归仁区\",\"710341\":\"新化区\",\"710342\":\"左镇区\",\"710343\":\"玉井区\",\"710344\":\"楠西区\",\"710345\":\"南化区\",\"710346\":\"仁德区\",\"710347\":\"关庙区\",\"710348\":\"龙崎区\",\"710349\":\"官田区\",\"710350\":\"麻豆区\",\"710351\":\"佳里区\",\"710352\":\"西港区\",\"710353\":\"七股区\",\"710354\":\"将军区\",\"710355\":\"学甲区\",\"710356\":\"北门区\",\"710357\":\"新营区\",\"710358\":\"后壁区\",\"710359\":\"白河区\",\"710360\":\"东山区\",\"710361\":\"六甲区\",\"710362\":\"下营区\",\"710363\":\"柳营区\",\"710364\":\"盐水区\",\"710365\":\"善化区\",\"710366\":\"大内区\",\"710367\":\"山上区\",\"710368\":\"新市区\",\"710369\":\"安定区\",\"710399\":\"其它区\"},\"710400\":{\"710401\":\"中区\",\"710402\":\"东区\",\"710403\":\"南区\",\"710404\":\"西区\",\"710405\":\"北区\",\"710406\":\"北屯区\",\"710407\":\"西屯区\",\"710408\":\"南屯区\",\"710431\":\"太平区\",\"710432\":\"大里区\",\"710433\":\"雾峰区\",\"710434\":\"乌日区\",\"710435\":\"丰原区\",\"710436\":\"后里区\",\"710437\":\"石冈区\",\"710438\":\"东势区\",\"710439\":\"和平区\",\"710440\":\"新社区\",\"710441\":\"潭子区\",\"710442\":\"大雅区\",\"710443\":\"神冈区\",\"710444\":\"大肚区\",\"710445\":\"沙鹿区\",\"710446\":\"龙井区\",\"710447\":\"梧栖区\",\"710448\":\"清水区\",\"710449\":\"大甲区\",\"710450\":\"外埔区\",\"710451\":\"大安区\",\"710499\":\"其它区\"},\"710500\":{\"710507\":\"金沙镇\",\"710508\":\"金湖镇\",\"710509\":\"金宁乡\",\"710510\":\"金城镇\",\"710511\":\"烈屿乡\",\"710512\":\"乌坵乡\"},\"710600\":{\"710614\":\"南投市\",\"710615\":\"中寮乡\",\"710616\":\"草屯镇\",\"710617\":\"国姓乡\",\"710618\":\"埔里镇\",\"710619\":\"仁爱乡\",\"710620\":\"名间乡\",\"710621\":\"集集镇\",\"710622\":\"水里乡\",\"710623\":\"鱼池乡\",\"710624\":\"信义乡\",\"710625\":\"竹山镇\",\"710626\":\"鹿谷乡\"},\"710700\":{\"710701\":\"仁爱区\",\"710702\":\"信义区\",\"710703\":\"中正区\",\"710704\":\"中山区\",\"710705\":\"安乐区\",\"710706\":\"暖暖区\",\"710707\":\"七堵区\",\"710799\":\"其它区\"},\"710800\":{\"710801\":\"东区\",\"710802\":\"北区\",\"710803\":\"香山区\",\"710899\":\"其它区\"},\"710900\":{\"710901\":\"东区\",\"710902\":\"西区\",\"710999\":\"其它区\"},\"711100\":{\"711130\":\"万里区\",\"711132\":\"板桥区\",\"711133\":\"汐止区\",\"711134\":\"深坑区\",\"711135\":\"石碇区\",\"711136\":\"瑞芳区\",\"711137\":\"平溪区\",\"711138\":\"双溪区\",\"711139\":\"贡寮区\",\"711140\":\"新店区\",\"711141\":\"坪林区\",\"711142\":\"乌来区\",\"711143\":\"永和区\",\"711144\":\"中和区\",\"711145\":\"土城区\",\"711146\":\"三峡区\",\"711147\":\"树林区\",\"711148\":\"莺歌区\",\"711149\":\"三重区\",\"711150\":\"新庄区\",\"711151\":\"泰山区\",\"711152\":\"林口区\",\"711153\":\"芦洲区\",\"711154\":\"五股区\",\"711155\":\"八里区\",\"711156\":\"淡水区\",\"711157\":\"三芝区\",\"711158\":\"石门区\"},\"711200\":{\"711287\":\"宜兰市\",\"711288\":\"头城镇\",\"711289\":\"礁溪乡\",\"711290\":\"壮围乡\",\"711291\":\"员山乡\",\"711292\":\"罗东镇\",\"711293\":\"三星乡\",\"711294\":\"大同乡\",\"711295\":\"五结乡\",\"711296\":\"冬山乡\",\"711297\":\"苏澳镇\",\"711298\":\"南澳乡\",\"711299\":\"钓鱼台\"},\"711300\":{\"711387\":\"竹北市\",\"711388\":\"湖口乡\",\"711389\":\"新丰乡\",\"711390\":\"新埔镇\",\"711391\":\"关西镇\",\"711392\":\"芎林乡\",\"711393\":\"宝山乡\",\"711394\":\"竹东镇\",\"711395\":\"五峰乡\",\"711396\":\"横山乡\",\"711397\":\"尖石乡\",\"711398\":\"北埔乡\",\"711399\":\"峨眉乡\"},\"711400\":{\"711414\":\"中坜区\",\"711415\":\"平镇区\",\"711417\":\"杨梅区\",\"711418\":\"新屋区\",\"711419\":\"观音区\",\"711420\":\"桃园区\",\"711421\":\"龟山区\",\"711422\":\"八德区\",\"711423\":\"大溪区\",\"711425\":\"大园区\",\"711426\":\"芦竹区\",\"711487\":\"中坜市\",\"711488\":\"平镇市\",\"711489\":\"龙潭乡\",\"711490\":\"杨梅市\",\"711491\":\"新屋乡\",\"711492\":\"观音乡\",\"711493\":\"桃园市\",\"711494\":\"龟山乡\",\"711495\":\"八德市\",\"711496\":\"大溪镇\",\"711497\":\"复兴乡\",\"711498\":\"大园乡\",\"711499\":\"芦竹乡\"},\"711500\":{\"711520\":\"头份市\",\"711582\":\"竹南镇\",\"711583\":\"头份镇\",\"711584\":\"三湾乡\",\"711585\":\"南庄乡\",\"711586\":\"狮潭乡\",\"711587\":\"后龙镇\",\"711588\":\"通霄镇\",\"711589\":\"苑里镇\",\"711590\":\"苗栗市\",\"711591\":\"造桥乡\",\"711592\":\"头屋乡\",\"711593\":\"公馆乡\",\"711594\":\"大湖乡\",\"711595\":\"泰安乡\",\"711596\":\"铜锣乡\",\"711597\":\"三义乡\",\"711598\":\"西湖乡\",\"711599\":\"卓兰镇\"},\"711700\":{\"711736\":\"员林市\",\"711774\":\"彰化市\",\"711775\":\"芬园乡\",\"711776\":\"花坛乡\",\"711777\":\"秀水乡\",\"711778\":\"鹿港镇\",\"711779\":\"福兴乡\",\"711780\":\"线西乡\",\"711781\":\"和美镇\",\"711782\":\"伸港乡\",\"711783\":\"员林镇\",\"711784\":\"社头乡\",\"711785\":\"永靖乡\",\"711786\":\"埔心乡\",\"711787\":\"溪湖镇\",\"711788\":\"大村乡\",\"711789\":\"埔盐乡\",\"711790\":\"田中镇\",\"711791\":\"北斗镇\",\"711792\":\"田尾乡\",\"711793\":\"埤头乡\",\"711794\":\"溪州乡\",\"711795\":\"竹塘乡\",\"711796\":\"二林镇\",\"711797\":\"大城乡\",\"711798\":\"芳苑乡\",\"711799\":\"二水乡\"},\"711900\":{\"711982\":\"番路乡\",\"711983\":\"梅山乡\",\"711984\":\"竹崎乡\",\"711985\":\"阿里山乡\",\"711986\":\"中埔乡\",\"711987\":\"大埔乡\",\"711988\":\"水上乡\",\"711989\":\"鹿草乡\",\"711990\":\"太保市\",\"711991\":\"朴子市\",\"711992\":\"东石乡\",\"711993\":\"六脚乡\",\"711994\":\"新港乡\",\"711995\":\"民雄乡\",\"711996\":\"大林镇\",\"711997\":\"溪口乡\",\"711998\":\"义竹乡\",\"711999\":\"布袋镇\"},\"712100\":{\"712180\":\"斗南镇\",\"712181\":\"大埤乡\",\"712182\":\"虎尾镇\",\"712183\":\"土库镇\",\"712184\":\"褒忠乡\",\"712185\":\"东势乡\",\"712186\":\"台西乡\",\"712187\":\"仑背乡\",\"712188\":\"麦寮乡\",\"712189\":\"斗六市\",\"712190\":\"林内乡\",\"712191\":\"古坑乡\",\"712192\":\"莿桐乡\",\"712193\":\"西螺镇\",\"712194\":\"二仑乡\",\"712195\":\"北港镇\",\"712196\":\"水林乡\",\"712197\":\"口湖乡\",\"712198\":\"四湖乡\",\"712199\":\"元长乡\"},\"712400\":{\"712451\":\"崁顶乡\",\"712467\":\"屏东市\",\"712468\":\"三地门乡\",\"712469\":\"雾台乡\",\"712470\":\"玛家乡\",\"712471\":\"九如乡\",\"712472\":\"里港乡\",\"712473\":\"高树乡\",\"712474\":\"盐埔乡\",\"712475\":\"长治乡\",\"712476\":\"麟洛乡\",\"712477\":\"竹田乡\",\"712478\":\"内埔乡\",\"712479\":\"万丹乡\",\"712480\":\"潮州镇\",\"712481\":\"泰武乡\",\"712482\":\"来义乡\",\"712483\":\"万峦乡\",\"712484\":\"莰顶乡\",\"712485\":\"新埤乡\",\"712486\":\"南州乡\",\"712487\":\"林边乡\",\"712488\":\"东港镇\",\"712489\":\"琉球乡\",\"712490\":\"佳冬乡\",\"712491\":\"新园乡\",\"712492\":\"枋寮乡\",\"712493\":\"枋山乡\",\"712494\":\"春日乡\",\"712495\":\"狮子乡\",\"712496\":\"车城乡\",\"712497\":\"牡丹乡\",\"712498\":\"恒春镇\",\"712499\":\"满州乡\"},\"712500\":{\"712584\":\"台东市\",\"712585\":\"绿岛乡\",\"712586\":\"兰屿乡\",\"712587\":\"延平乡\",\"712588\":\"卑南乡\",\"712589\":\"鹿野乡\",\"712590\":\"关山镇\",\"712591\":\"海端乡\",\"712592\":\"池上乡\",\"712593\":\"东河乡\",\"712594\":\"成功镇\",\"712595\":\"长滨乡\",\"712596\":\"金峰乡\",\"712597\":\"大武乡\",\"712598\":\"达仁乡\",\"712599\":\"太麻里乡\"},\"712600\":{\"712686\":\"花莲市\",\"712687\":\"新城乡\",\"712688\":\"太鲁阁\",\"712689\":\"秀林乡\",\"712690\":\"吉安乡\",\"712691\":\"寿丰乡\",\"712692\":\"凤林镇\",\"712693\":\"光复乡\",\"712694\":\"丰滨乡\",\"712695\":\"瑞穗乡\",\"712696\":\"万荣乡\",\"712697\":\"玉里镇\",\"712698\":\"卓溪乡\",\"712699\":\"富里乡\"},\"712700\":{\"712794\":\"马公市\",\"712795\":\"西屿乡\",\"712796\":\"望安乡\",\"712797\":\"七美乡\",\"712798\":\"白沙乡\",\"712799\":\"湖西乡\"},\"712800\":{\"712896\":\"南竿乡\",\"712897\":\"北竿乡\",\"712898\":\"东引乡\",\"712899\":\"莒光乡\"},\"810000\":{\"810100\":\"香港岛\",\"810200\":\"九龙\",\"810300\":\"新界\"},\"810100\":{\"810101\":\"中西区\",\"810102\":\"湾仔区\",\"810103\":\"东区\",\"810104\":\"南区\"},\"810200\":{\"810201\":\"九龙城区\",\"810202\":\"油尖旺区\",\"810203\":\"深水埗区\",\"810204\":\"黄大仙区\",\"810205\":\"观塘区\"},\"810300\":{\"810301\":\"北区\",\"810302\":\"大埔区\",\"810303\":\"沙田区\",\"810304\":\"西贡区\",\"810305\":\"元朗区\",\"810306\":\"屯门区\",\"810307\":\"荃湾区\",\"810308\":\"葵青区\",\"810309\":\"离岛区\"},\"820000\":{\"820100\":\"澳门半岛\",\"820200\":\"离岛\"},\"820100\":{\"820102\":\"花地玛堂区\",\"820103\":\"花王堂区\",\"820104\":\"望德堂区\",\"820105\":\"大堂区\",\"820106\":\"风顺堂区\"},\"820200\":{\"820202\":\"嘉模堂区\",\"820203\":\"路氹填海区\",\"820204\":\"圣方济各堂区\"}}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/resources/templates/email/bpm_cc_email.ftl",
    "content": "<html>\n<head>\n    <meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n</head>\n\n<body>\n<div  class=\"box-content\">\n    <div  class=\"info-top\">\n        <img src=\"https://www.jeecg.com/images/logo.png\" style=\"float: left; margin: 0 10px 0 0; width: 32px;height:32px\" /><div style=\"color:#fff\"><strong>【重要】流程抄送的通知</strong></div>\n    </div>\n    <div class=\"info-wrap\">\n        <div class=\"tips\" style=\"padding:15px;\">\n            <p style=\"margin: 10px 0;\">\n               您好，您有一个新的流程抄送任务亟待查看，任务内容如下：：\n            </p>\n            <table style=\"width: 400px; border-spacing: 0px; border-collapse: collapse; border: none; margin-top: 20px;\"><tbody>\n                <tr style=\"height: 45px;\">\n                    <td style=\"width: 150px; height: 40px; background: #F6F6F6;border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                        流程名称\n                    </td>\n                    <td style=\"width: 250px;height: 40px; border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                        ${bpm_name}<a style=\"color: #006eff;\" href=\"${url}\" target=\"_blank\" rel=\"noopener\">[立刻查看]</a>\n                    </td>\n                </tr>\n                <tr style=\"height: 45px;\">\n                    <td style=\"width: 150px;height: 40px; background: #F6F6F6;border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                        抄送任务\n                    </td>\n                    <td style=\"width: 250px;height: 40px; border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                        ${bpm_task}\n                    </td>\n                </tr>\n                <tr style=\"height: 45px;\">\n                    <td style=\"width: 150px; height: 40px; background: #F6F6F6;border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                        抄送时间\n                    </td>\n                    <td style=\"width: 250px;height: 40px; border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                        ${datetime}\n                    </td>\n                </tr>\n                <tr style=\"height: 45px;\">\n                    <td style=\"width: 150px; height: 40px; background: #F6F6F6;border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                        抄送内容\n                    </td>\n                    <td style=\"width: 250px;height: 40px; border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                        ${remark}\n                    </td>\n                </tr>\n                </tbody>\n            </table>\n        </div>\n        <div class=\"footer\">北京国炬平台</div>\n    </div>\n    <div style=\"margin-top: 60px;margin-bottom: 10px;\">\n        <span style=\"font-size: 13px; font-weight: bold; color: #666;\">温馨提醒</span>\n        <div style=\"line-height: 24px; margin-top: 10px;\">\n            <div style=\"font-size: 13px; color: #666;\">使用过程中如有任何问题，请联系系统管理员。</div>\n        </div>\n    </div>\n    <div style=\"width: 600px; margin: 0 auto;  margin-top: 50px; font-size: 12px; -webkit-font-smoothing: subpixel-antialiased; text-size-adjust: 100%;\">\n        <p style=\"text-align: center; line-height: 20.4px; text-size-adjust: 100%; font-family: 'Microsoft YaHei'!important; padding: 0px !important; margin: 0px !important; color: #7e8890 !important;\">\n            <span class=\"appleLinks\">Copyright © 2023-2024 北京国炬信息技术有限公司. 保留所有权利。</span>\n        </p>\n        <p style=\"text-align: center;line-height: 20.4px; text-size-adjust: 100%; font-family: 'Microsoft YaHei'!important; padding: 0px !important; margin: 0px; color: #7e8890 !important; margin-top: 10px;\">\n            <span class=\"appleLinks\">邮件由系统自动发送，请勿直接回复本邮件！</span>\n        </p>\n    </div>\n</div>\n</body>\n\n<style>\n    .box-content{\n        width: 80%;\n        margin: 20px auto;\n        max-width: 800px;\n        min-width: 600px;\n    }\n\n    .info-top{\n        padding: 15px 25px;\n        border-top-left-radius: 10px;\n        border-top-right-radius: 10px;\n        background: #4ea3f2;\n        color: #fff;\n        overflow: hidden;\n        line-height: 32px;\n    }\n\n    .info-wrap{\n        border-bottom-left-radius: 10px;\n        border-bottom-right-radius: 10px;\n        border:1px solid #ddd;\n        overflow: hidden;\n        padding: 15px 15px 20px;\n    }\n\n    .footer{\n        text-align: right;\n        color: #999;\n        padding: 0 15px 15px;\n    }\n</style>\n\n</html>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/resources/templates/email/bpm_cuiban_email.ftl",
    "content": "<html>\n<head>\n    <meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n</head>\n\n<body>\n<div  class=\"box-content\">\n    <div  class=\"info-top\">\n        <img src=\"https://www.jeecg.com/images/logo.png\" style=\"float: left; margin: 0 10px 0 0; width: 32px;height:32px\" /><div style=\"color:#fff\"><strong>【重要】流程办理的通知</strong></div>\n    </div>\n    <div class=\"info-wrap\">\n        <div class=\"tips\" style=\"padding:15px;\">\n            <p style=\"margin: 10px 0;\">\n               您好，您有一个新的流程任务亟待处理，任务内容如下：：\n            </p>\n            <table style=\"width: 400px; border-spacing: 0px; border-collapse: collapse; border: none; margin-top: 20px;\"><tbody>\n                <tr style=\"height: 45px;\">\n                    <td style=\"width: 150px; height: 40px; background: #F6F6F6;border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                        流程名称\n                    </td>\n                    <td style=\"width: 250px;height: 40px; border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                        ${bpm_name}<a style=\"color: #006eff;\" href=\"${url}\" target=\"_blank\" rel=\"noopener\">[立刻办理]</a>\n                    </td>\n                </tr>\n                <tr style=\"height: 45px;\">\n                    <td style=\"width: 150px;height: 40px; background: #F6F6F6;border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                        催办任务\n                    </td>\n                    <td style=\"width: 250px;height: 40px; border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                        ${bpm_task}\n                    </td>\n                </tr>\n                <tr style=\"height: 45px;\">\n                    <td style=\"width: 150px; height: 40px; background: #F6F6F6;border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                        催办时间\n                    </td>\n                    <td style=\"width: 250px;height: 40px; border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                        ${datetime}\n                    </td>\n                </tr>\n                <tr style=\"height: 45px;\">\n                    <td style=\"width: 150px; height: 40px; background: #F6F6F6;border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                        催办内容\n                    </td>\n                    <td style=\"width: 250px;height: 40px; border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                        ${remark}\n                    </td>\n                </tr>\n                </tbody>\n            </table>\n        </div>\n        <div class=\"footer\">北京国炬平台</div>\n    </div>\n    <div style=\"margin-top: 60px;margin-bottom: 10px;\">\n        <span style=\"font-size: 13px; font-weight: bold; color: #666;\">温馨提醒</span>\n        <div style=\"line-height: 24px; margin-top: 10px;\">\n            <div style=\"font-size: 13px; color: #666;\">使用过程中如有任何问题，请联系系统管理员。</div>\n        </div>\n    </div>\n    <div style=\"width: 600px; margin: 0 auto;  margin-top: 50px; font-size: 12px; -webkit-font-smoothing: subpixel-antialiased; text-size-adjust: 100%;\">\n        <p style=\"text-align: center; line-height: 20.4px; text-size-adjust: 100%; font-family: 'Microsoft YaHei'!important; padding: 0px !important; margin: 0px !important; color: #7e8890 !important;\">\n            <span class=\"appleLinks\">Copyright © 2023-2024 北京国炬信息技术有限公司. 保留所有权利。</span>\n        </p>\n        <p style=\"text-align: center;line-height: 20.4px; text-size-adjust: 100%; font-family: 'Microsoft YaHei'!important; padding: 0px !important; margin: 0px; color: #7e8890 !important; margin-top: 10px;\">\n            <span class=\"appleLinks\">邮件由系统自动发送，请勿直接回复本邮件！</span>\n        </p>\n    </div>\n</div>\n</body>\n\n<style>\n    .box-content{\n        width: 80%;\n        margin: 20px auto;\n        max-width: 800px;\n        min-width: 600px;\n    }\n\n    .info-top{\n        padding: 15px 25px;\n        border-top-left-radius: 10px;\n        border-top-right-radius: 10px;\n        background: #4ea3f2;\n        color: #fff;\n        overflow: hidden;\n        line-height: 32px;\n    }\n\n    .info-wrap{\n        border-bottom-left-radius: 10px;\n        border-bottom-right-radius: 10px;\n        border:1px solid #ddd;\n        overflow: hidden;\n        padding: 15px 15px 20px;\n    }\n\n    .footer{\n        text-align: right;\n        color: #999;\n        padding: 0 15px 15px;\n    }\n</style>\n\n</html>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/resources/templates/email/bpm_new_task_email.ftl",
    "content": "<html>\n<head>\n    <meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n</head>\n\n<body>\n<div class=\"box-content\">\n    <div class=\"info-top\">\n        <img src=\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/logo(1)_1697180761742.png\"\n             style=\"float: left; margin: 0 10px 0 0; width: 32px;height:32px\"/>\n        <div style=\"color:#fff\"><strong>【重要】流程办理的通知</strong></div>\n    </div>\n    <div class=\"info-wrap\">\n        <div class=\"tips\" style=\"padding:15px;\">\n            <p style=\"margin: 10px 0;\">\n                您好， ${REALNAME}，<br>您有一个新的流程任务需要处理，任务内容如下：\n            </p>\n            <table style=\"width: 400px; border-spacing: 0px; border-collapse: collapse; border: none; margin-top: 20px;\">\n                <tbody>\n                    <tr style=\"height: 45px;\">\n                        <td style=\"width: 150px;height: 40px; background: #F6F6F6;border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                            业务标题\n                        </td>\n                        <td style=\"width: 250px;height: 40px; border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                            ${title}\n                        </td>\n                    </tr>\n                    <tr style=\"height: 45px;\">\n                        <td style=\"width: 150px; height: 40px; background: #F6F6F6;border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                            流程名称\n                        </td>\n                        <td style=\"width: 250px;height: 40px; border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                            ${name}\n                            <a style=\"color: #006eff;\" href=\"${url}\" target=\"_blank\" rel=\"noopener\">[立刻办理]</a>\n                        </td>\n                    </tr>\n\n                    <tr style=\"height: 45px;\">\n                        <td style=\"width: 150px; height: 40px; background: #F6F6F6;border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                            任务节点\n                        </td>\n                        <td style=\"width: 250px;height: 40px; border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;\">\n                            ${task}\n                        </td>\n                    </tr>\n                </tbody>\n            </table>\n        </div>\n        <div class=\"footer\">北京国炬平台</div>\n    </div>\n    <div style=\"margin-top: 60px;margin-bottom: 10px;\">\n        <span style=\"font-size: 13px; font-weight: bold; color: #666;\">温馨提醒</span>\n        <div style=\"line-height: 24px; margin-top: 10px;\">\n            <div style=\"font-size: 13px; color: #666;\">使用过程中如有任何问题，请联系系统管理员。</div>\n        </div>\n    </div>\n    <div style=\"width: 600px; margin: 0 auto;  margin-top: 50px; font-size: 12px; -webkit-font-smoothing: subpixel-antialiased; text-size-adjust: 100%;\">\n        <p style=\"text-align: center; line-height: 20.4px; text-size-adjust: 100%; font-family: 'Microsoft YaHei'!important; padding: 0px !important; margin: 0px !important; color: #7e8890 !important;\">\n            <span class=\"appleLinks\">Copyright © 2023-2024 北京国炬信息技术有限公司. 保留所有权利。</span>\n        </p>\n        <p style=\"text-align: center;line-height: 20.4px; text-size-adjust: 100%; font-family: 'Microsoft YaHei'!important; padding: 0px !important; margin: 0px; color: #7e8890 !important; margin-top: 10px;\">\n            <span class=\"appleLinks\">邮件由系统自动发送，请勿直接回复本邮件！</span>\n        </p>\n    </div>\n</div>\n</body>\n\n<style>\n    .box-content {\n        width: 80%;\n        margin: 20px auto;\n        max-width: 800px;\n        min-width: 600px;\n    }\n\n    .info-top {\n        padding: 15px 25px;\n        border-top-left-radius: 10px;\n        border-top-right-radius: 10px;\n        background: #4ea3f2;\n        color: #fff;\n        overflow: hidden;\n        line-height: 32px;\n    }\n\n    .info-wrap {\n        border-bottom-left-radius: 10px;\n        border-bottom-right-radius: 10px;\n        border: 1px solid #ddd;\n        overflow: hidden;\n        padding: 15px 15px 20px;\n    }\n\n    .footer {\n        text-align: right;\n        color: #999;\n        padding: 0 15px 15px;\n    }\n</style>\n\n</html>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/main/resources/templates/email/desform_new_data_email.ftl",
    "content": "<html>\n<head>\n    <meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n</head>\n\n<body>\n<div  class=\"box-content\">\n    <div  class=\"info-top\">\n        <img src=\"https://qiaoqiaoyun.oss-cn-beijing.aliyuncs.com/site/qqyunemaillogo.png\" style=\"width: 35px;height:35px; background: #5e8ee5; border-radius: 5px;\" />\n        <div style=\"color:#fff;\">\n            <strong>【重要】新数据提醒</strong>\n        </div>\n    </div>\n    <div class=\"info-wrap\">\n        <div class=\"tips\" style=\"padding:15px;\">\n            <p style=\"margin: 10px 0;\">\n                尊敬的 ${userName} 用户,您好：\n            </p>\n            你的表单  <a style=\"color: #006eff;\" href=\"${formLink}\" target=\"_blank\" rel=\"noopener\">【${formName}】</a>\n            在 ${createTime} 新增了1条数据。\n\n            ${dataMarkdown}\n\n            <p>\n                如需查看更多请点击\n                <a style=\"color: #006eff;\" href=\"${moreLink}\" target=\"_blank\" rel=\"noopener\">[查看所有数据]</a>\n            </p>\n        </div>\n        <div class=\"footer\">敲敲云平台</div>\n        <div class=\"footer\" id=\"currentTime\"></div>\n    </div>\n    <div style=\"width: 600px; margin: 0 auto;  margin-top: 50px; font-size: 12px; -webkit-font-smoothing: subpixel-antialiased; text-size-adjust: 100%;\">\n        <p style=\"text-align: center; line-height: 20.4px; text-size-adjust: 100%; font-family: 'Microsoft YaHei'!important; padding: 0px !important; margin: 0px !important; color: #7e8890 !important;\">\n            <span class=\"appleLinks\">Copyright © 2023-2024 北京敲敲云科技有限公司. 保留所有权利。</span>\n        </p>\n        <p style=\"text-align: center;line-height: 20.4px; text-size-adjust: 100%; font-family: 'Microsoft YaHei'!important; padding: 0px !important; margin: 0px; color: #7e8890 !important; margin-top: 10px;\">\n            <span class=\"appleLinks\">邮件由系统自动发送，请勿直接回复本邮件！</span>\n        </p>\n    </div>\n</div>\n</body>\n\n<style>\n    .box-content{\n        width: 80%;\n        margin: 20px auto;\n        max-width: 800px;\n        min-width: 600px;\n    }\n\n    .info-top{\n        display: flex;\n        align-items: center;\n        padding: 15px 25px;\n        border-top-left-radius: 10px;\n        border-top-right-radius: 10px;\n        background: #4ea3f2;\n        color: #fff;\n        overflow: hidden;\n        line-height: 32px;\n    }\n\n    .info-wrap{\n        border-bottom-left-radius: 10px;\n        border-bottom-right-radius: 10px;\n        border:1px solid #ddd;\n        overflow: hidden;\n        padding: 15px 15px 20px;\n    }\n\n    .footer{\n        text-align: right;\n        color: #999;\n        padding: 0 15px 15px;\n    }\n</style>\n\n</html>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-base-core/src/test/java/org/jeecg/test/sqlparse/TestIpUtil.java",
    "content": "package org.jeecg.test.sqlparse;\n\nimport org.jeecg.common.util.IpUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.junit.jupiter.api.Test;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * @author: scott\n * @date: 2024年04月29日 16:48\n */\npublic class TestIpUtil {\n    public static void main(String[] args) {\n        Map<String, String[]> map = new HashMap<>();\n        map.put(\"key1\", new String[]{\"value1\", \"value2\", \"value3\"});\n        map.put(\"key4\", null);\n        map.put(\"key2\", new String[]{\"value4\", \"value5\"});\n        map.put(\"key3\", new String[]{\"value6\"});\n        System.out.println(oConvertUtils.mapToString(map));\n    }\n\n    @Test\n    public void test() {\n        String ip = \"2408:8207:1851:10e0:50bd:1a50:60c8:b030, 115.231.101.180\";\n        String[] ipAddresses = ip.split(\",\");\n        for (String ipAddress : ipAddresses) {\n            System.out.println(ipAddress);\n            ipAddress = ipAddress.trim();\n            if (IpUtils.isValidIpAddress(ipAddress)) {\n                System.out.println(\"ipAddress= \" + ipAddress);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/doc/RAG/main.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"\nMCP Stdio 工具 - 修复编码问题\n确保所有输出都使用UTF-8编码\n\"\"\"\n\nimport json\nimport sys\nimport os\nfrom typing import Dict, Any\nimport logging\n\n# 强制使用UTF-8编码\nif sys.platform == \"win32\":\n    # Windows需要特殊处理\n    import io\n\n    sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8')\n    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')\n    sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')\nelse:\n    # Unix-like系统\n    sys.stdin.reconfigure(encoding='utf-8')\n    sys.stdout.reconfigure(encoding='utf-8')\n    sys.stderr.reconfigure(encoding='utf-8')\n\n# 设置环境变量\nos.environ['PYTHONIOENCODING'] = 'utf-8'\nos.environ['PYTHONUTF8'] = '1'\n\n# 配置日志\nlogging.basicConfig(\n    level=logging.INFO,\n    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',\n    encoding='utf-8'\n)\nlogger = logging.getLogger(\"mcp-tool\")\n\n\nclass FixedMCPServer:\n    \"\"\"修复编码问题的MCP服务器\"\"\"\n\n    def __init__(self):\n        self.tools = {}\n        self.initialize_tools()\n\n    def initialize_tools(self):\n        \"\"\"初始化工具集\"\"\"\n\n        # 获取时间\n        self.tools[\"get_time\"] = {\n            \"name\": \"get_time\",\n            \"description\": \"获取当前时间\",\n            \"inputSchema\": {\n                \"type\": \"object\",\n                \"properties\": {\n                    \"format\": {\n                        \"type\": \"string\",\n                        \"description\": \"时间格式\",\n                        \"enum\": [\"iso\", \"timestamp\", \"human\", \"chinese\"],\n                        \"default\": \"iso\"\n                    }\n                }\n            }\n        }\n\n        # 文本处理工具\n        self.tools[\"text_process\"] = {\n            \"name\": \"text_process\",\n            \"description\": \"文本处理工具\",\n            \"inputSchema\": {\n                \"type\": \"object\",\n                \"properties\": {\n                    \"text\": {\n                        \"type\": \"string\",\n                        \"description\": \"输入文本\"\n                    },\n                    \"operation\": {\n                        \"type\": \"string\",\n                        \"description\": \"操作类型\",\n                        \"enum\": [\"length\", \"upper\", \"lower\", \"reverse\", \"count_words\"],\n                        \"default\": \"length\"\n                    }\n                },\n                \"required\": [\"text\"]\n            }\n        }\n\n        # 数据格式工具\n        self.tools[\"format_data\"] = {\n            \"name\": \"format_data\",\n            \"description\": \"格式化数据\",\n            \"inputSchema\": {\n                \"type\": \"object\",\n                \"properties\": {\n                    \"data\": {\n                        \"type\": \"string\",\n                        \"description\": \"原始数据\"\n                    },\n                    \"format\": {\n                        \"type\": \"string\",\n                        \"description\": \"格式类型\",\n                        \"enum\": [\"json\", \"yaml\", \"xml\"],\n                        \"default\": \"json\"\n                    }\n                },\n                \"required\": [\"data\"]\n            }\n        }\n\n    def handle_request(self, request: Dict[str, Any]) -> Dict[str, Any]:\n        \"\"\"处理请求\"\"\"\n        try:\n            method = request.get(\"method\")\n            params = request.get(\"params\", {})\n\n            if method == \"tools/list\":\n                return self.handle_tools_list()\n            elif method == \"tools/call\":\n                return self.handle_tool_call(params)\n            elif method == \"ping\":\n                return {\"result\": \"pong\"}\n            else:\n                return self.create_error_response(\n                    code=-32601,\n                    message=\"Method not found\"\n                )\n\n        except Exception as e:\n            logger.error(f\"Error handling request: {e}\")\n            return self.create_error_response(\n                code=-32603,\n                message=f\"Internal error: {str(e)}\"\n            )\n\n    def handle_tools_list(self) -> Dict[str, Any]:\n        \"\"\"列出所有工具 - 确保返回标准JSON\"\"\"\n        return {\n            \"result\": {\n                \"tools\": list(self.tools.values())\n            }\n        }\n\n    def handle_tool_call(self, params: Dict[str, Any]) -> Dict[str, Any]:\n        \"\"\"调用工具 - 修复响应格式\"\"\"\n        name = params.get(\"name\")\n        arguments = params.get(\"arguments\", {})\n\n        if name not in self.tools:\n            return self.create_error_response(\n                code=-32602,\n                message=f\"Tool '{name}' not found\"\n            )\n\n        try:\n            if  name == \"get_time\":\n                result = self.execute_get_time(arguments)\n            elif name == \"text_process\":\n                result = self.execute_text_process(arguments)\n            elif name == \"format_data\":\n                result = self.execute_format_data(arguments)\n            else:\n                return self.create_error_response(\n                    code=-32602,\n                    message=\"Tool not implemented\"\n                )\n\n            # 确保返回正确的MCP响应格式\n            return self.create_success_response(result)\n\n        except Exception as e:\n            logger.error(f\"Tool execution error: {e}\")\n            return self.create_error_response(\n                code=-32603,\n                message=f\"Tool execution failed: {str(e)}\"\n            )\n\n    def execute_get_time(self, args: Dict[str, Any]) -> Dict[str, Any]:\n        \"\"\"获取时间 - 支持中文\"\"\"\n        from datetime import datetime\n\n        try:\n            format_type = args.get(\"format\", \"iso\")\n            now = datetime.now()\n\n            if format_type == \"iso\":\n                result = now.isoformat()\n            elif format_type == \"timestamp\":\n                result = now.timestamp()\n            elif format_type == \"human\":\n                result = now.strftime(\"%Y-%m-%d %H:%M:%S\")\n            elif format_type == \"chinese\":\n                result = now.strftime(\"%Y年%m月%d日 %H时%M分%S秒\")\n            else:\n                result = now.isoformat()\n            logger.info(f\"当前系统时间：{result}\")\n            return {\n                \"status\": \"success\",\n                \"format\": format_type,\n                \"time\": result,\n                \"timestamp\": now.timestamp(),\n                \"date\": now.strftime(\"%Y-%m-%d\"),\n                \"time_12h\": now.strftime(\"%I:%M:%S %p\")\n            }\n\n        except Exception as e:\n            return {\n                \"status\": \"error\",\n                \"error\": str(e)\n            }\n\n    def execute_text_process(self, args: Dict[str, Any]) -> Dict[str, Any]:\n        \"\"\"文本处理\"\"\"\n        try:\n            text = args.get(\"text\", \"\")\n            operation = args.get(\"operation\", \"length\")\n\n            if operation == \"length\":\n                result = len(text)\n                result_str = f\"文本长度: {result} 个字符\"\n            elif operation == \"upper\":\n                result = text.upper()\n                result_str = f\"大写: {result}\"\n            elif operation == \"lower\":\n                result = text.lower()\n                result_str = f\"小写: {result}\"\n            elif operation == \"reverse\":\n                result = text[::-1]\n                result_str = f\"反转: {result}\"\n            elif operation == \"count_words\":\n                words = len(text.split())\n                result = words\n                result_str = f\"单词数: {words}\"\n            else:\n                raise ValueError(f\"未知操作: {operation}\")\n\n            return {\n                \"status\": \"success\",\n                \"operation\": operation,\n                \"original_text\": text,\n                \"result\": result,\n                \"result_str\": result_str,\n                \"text_length\": len(text)\n            }\n\n        except Exception as e:\n            return {\n                \"status\": \"error\",\n                \"error\": str(e),\n                \"operation\": args.get(\"operation\", \"\")\n            }\n\n    def execute_format_data(self, args: Dict[str, Any]) -> Dict[str, Any]:\n        \"\"\"格式化数据\"\"\"\n        try:\n            data_str = args.get(\"data\", \"\")\n            format_type = args.get(\"format\", \"json\")\n\n            # 尝试解析为JSON\n            try:\n                data = json.loads(data_str)\n                is_json = True\n            except:\n                data = data_str\n                is_json = False\n\n            if format_type == \"json\":\n                if is_json:\n                    result = json.dumps(data, ensure_ascii=False, indent=2)\n                else:\n                    # 如果不是JSON，包装成JSON\n                    result = json.dumps({\"text\": data}, ensure_ascii=False, indent=2)\n            elif format_type == \"yaml\":\n                import yaml\n                result = yaml.dump(data, allow_unicode=True, default_flow_style=False)\n            elif format_type == \"xml\":\n                # 简单的XML格式化\n                if isinstance(data, dict):\n                    result = \"<data>\"\n                    for k, v in data.items():\n                        result += f\"\\n  <{k}>{v}</{k}>\"\n                    result += \"\\n</data>\"\n                else:\n                    result = f\"<text>{data}</text>\"\n            else:\n                result = str(data)\n\n            return {\n                \"status\": \"success\",\n                \"format\": format_type,\n                \"original\": data_str,\n                \"formatted\": result,\n                \"length\": len(result)\n            }\n\n        except Exception as e:\n            return {\n                \"status\": \"error\",\n                \"error\": str(e),\n                \"format\": args.get(\"format\", \"\")\n            }\n\n    def create_success_response(self, data: Dict[str, Any]) -> Dict[str, Any]:\n        \"\"\"创建成功响应 - 确保符合MCP规范\"\"\"\n        # 将数据转换为JSON字符串作为文本内容\n        content_text = json.dumps(data, ensure_ascii=False, indent=2)\n\n        return {\n            \"result\": {\n                \"content\": [\n                    {\n                        \"type\": \"text\",\n                        \"text\": content_text\n                    }\n                ],\n                \"isError\": False\n            }\n        }\n\n    def create_error_response(self, code: int, message: str) -> Dict[str, Any]:\n        \"\"\"创建错误响应\"\"\"\n        return {\n            \"error\": {\n                \"code\": code,\n                \"message\": message\n            }\n        }\n\n\ndef safe_json_dump(data: Dict[str, Any]) -> str:\n    \"\"\"安全的JSON序列化，确保UTF-8编码\"\"\"\n    try:\n        return json.dumps(data, ensure_ascii=False, separators=(',', ':'))\n    except:\n        # 如果失败，使用ASCII转义\n        return json.dumps(data, ensure_ascii=True, separators=(',', ':'))\n\n\ndef main():\n    \"\"\"主函数 - 修复Stdio通信\"\"\"\n    logger.info(\"启动MCP Stdio服务器 (修复编码版)...\")\n\n    server = FixedMCPServer()\n\n    # 初始握手消息\n    init_message = {\n        \"jsonrpc\": \"2.0\",\n        \"id\": 1,\n        \"result\": {\n            \"protocolVersion\": \"2024-11-05\",\n            \"capabilities\": {\n                \"tools\": {}\n            },\n            \"serverInfo\": {\n                \"name\": \"fixed-mcp-server\",\n                \"version\": \"1.0.0\"\n            }\n        }\n    }\n\n    # 发送初始化响应\n    try:\n        sys.stdout.write(safe_json_dump(init_message) + \"\\n\")\n        sys.stdout.flush()\n    except Exception as e:\n        logger.error(f\"发送初始化消息失败: {e}\")\n        return\n\n    logger.info(\"MCP服务器已初始化\")\n\n    # 主循环\n    line_num = 0\n    while True:\n        try:\n            line = sys.stdin.readline()\n            if not line:\n                logger.info(\"输入流结束\")\n                break\n\n            line = line.strip()\n            line_num += 1\n\n            if not line:\n                continue\n\n            logger.info(f\"收到第 {line_num} 行: {line[:100]}...\")\n\n            try:\n                request = json.loads(line)\n                logger.info(f\"解析请求: {request.get('method', 'unknown')}\")\n\n                # 处理请求\n                response = server.handle_request(request)\n                response[\"jsonrpc\"] = \"2.0\"\n                response[\"id\"] = request.get(\"id\")\n\n                # 发送响应\n                response_json = safe_json_dump(response)\n                sys.stdout.write(response_json + \"\\n\")\n                sys.stdout.flush()\n\n                logger.info(f\"发送响应: {response.get('result', response.get('error', {}))}\")\n\n            except json.JSONDecodeError as e:\n                logger.error(f\"JSON解析错误: {e}\")\n                error_response = {\n                    \"jsonrpc\": \"2.0\",\n                    \"error\": {\n                        \"code\": -32700,\n                        \"message\": f\"Parse error at line {line_num}\"\n                    },\n                    \"id\": None\n                }\n                sys.stdout.write(safe_json_dump(error_response) + \"\\n\")\n                sys.stdout.flush()\n\n        except KeyboardInterrupt:\n            logger.info(\"接收到中断信号\")\n            break\n        except Exception as e:\n            logger.error(f\"未处理的错误: {e}\")\n            break\n\n    logger.info(\"MCP服务器已停止\")\n\n\nif __name__ == \"__main__\":\n    main()"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <artifactId>jeecg-boot-module</artifactId>\n        <version>3.9.1</version>\n    </parent>\n\n    <artifactId>jeecg-boot-module-airag</artifactId>\n\n    <repositories>\n        <repository>\n            <id>aliyun</id>\n            <name>aliyun Repository</name>\n            <url>https://maven.aliyun.com/repository/public</url>\n            <snapshots>\n                <enabled>false</enabled>\n            </snapshots>\n        </repository>\n        <repository>\n            <id>jeecg</id>\n            <name>jeecg Repository</name>\n            <url>https://maven.jeecg.org/nexus/content/repositories/jeecg</url>\n            <snapshots>\n                <enabled>false</enabled>\n            </snapshots>\n        </repository>\n    </repositories>\n\n    <properties>\n        <kotlin.version>2.2.0</kotlin.version>\n        <liteflow.version>2.15.0</liteflow.version>\n        <apache-tika.version>3.2.3</apache-tika.version>\n    </properties>\n\n    <dependencyManagement>\n        <dependencies>\n            <dependency>\n                <groupId>dev.langchain4j</groupId>\n                <artifactId>langchain4j-bom</artifactId>\n                <version>1.9.1</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n            <dependency>\n                <groupId>dev.langchain4j</groupId>\n                <artifactId>langchain4j-community-bom</artifactId>\n                <version>1.9.1-beta17</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n        </dependencies>\n    </dependencyManagement>\n\n    <dependencies>\n        <!-- system单体 api-->\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-system-local-api</artifactId>\n        </dependency>\n        <!-- 微服务starter和system微服务 api\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-boot-starter-cloud</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-system-cloud-api</artifactId>\n        </dependency>-->\n\n        <!-- aiflow依赖 -->\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-aiflow</artifactId>\n            <version>3.9.1-beta1</version>\n            <exclusions>\n                <exclusion>\n                    <groupId>commons-io</groupId>\n                    <artifactId>commons-io</artifactId>\n                </exclusion>\n                <exclusion>\n                    <groupId>commons-beanutils</groupId>\n                    <artifactId>commons-beanutils</artifactId>\n                </exclusion>\n                <exclusion>\n                    <groupId>com.yomahub</groupId>\n                    <artifactId>liteflow-script-python</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n\n        <!-- begin 注意：这几个依赖体积较大，每个约50MB。若发布时需要使用，请将 <scope>provided</scope> 删除 -->\n        <dependency>\n            <groupId>org.jetbrains.kotlin</groupId>\n            <artifactId>kotlin-scripting-jsr223</artifactId>\n            <version>${kotlin.version}</version>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.yomahub</groupId>\n            <artifactId>liteflow-script-graaljs</artifactId>\n            <version>${liteflow.version}</version>\n            <scope>provided</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.yomahub</groupId>\n            <artifactId>liteflow-script-groovy</artifactId>\n            <version>${liteflow.version}</version>\n            <scope>runtime</scope>\n        </dependency>\n        <!-- end 注意：这几个依赖体积较大，每个约50MB。若发布时需要使用，请将 <scope>provided</scope> 删除 -->\n\n        <!-- aiflow 脚本依赖 -->\n        <dependency>\n            <groupId>com.yomahub</groupId>\n            <artifactId>liteflow-script-python</artifactId>\n            <version>${liteflow.version}</version>\n            <scope>runtime</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.yomahub</groupId>\n            <artifactId>liteflow-script-kotlin</artifactId>\n            <version>${liteflow.version}</version>\n            <exclusions>\n                <exclusion>\n                    <groupId>org.jetbrains.kotlin</groupId>\n                    <artifactId>kotlin-scripting-jsr223</artifactId>\n                </exclusion>\n            </exclusions>\n            <scope>runtime</scope>\n        </dependency>\n        <dependency>\n            <groupId>com.yomahub</groupId>\n            <artifactId>liteflow-script-aviator</artifactId>\n            <version>${liteflow.version}</version>\n            <scope>runtime</scope>\n            <exclusions>\n                <exclusion>\n                    <artifactId>aviator</artifactId>\n                    <groupId>com.googlecode.aviator</groupId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <!-- aiflow 脚本依赖 -->\n\n        <!-- langChain4j model support -->\n        <dependency>\n            <groupId>dev.langchain4j</groupId>\n            <artifactId>langchain4j-open-ai</artifactId>\n        </dependency>\n        <!-- langChain4j mcp support -->\n        <dependency>\n            <groupId>dev.langchain4j</groupId>\n            <artifactId>langchain4j-mcp</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>dev.langchain4j</groupId>\n            <artifactId>langchain4j-ollama</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>dev.langchain4j</groupId>\n            <artifactId>langchain4j-community-zhipu-ai</artifactId>\n            <exclusions>\n                <exclusion>\n                    <artifactId>checker-qual</artifactId>\n                    <groupId>org.checkerframework</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>guava</artifactId>\n                    <groupId>com.google.guava</groupId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>dev.langchain4j</groupId>\n            <artifactId>langchain4j-community-qianfan</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>dev.langchain4j</groupId>\n            <artifactId>langchain4j-community-dashscope</artifactId>\n            <exclusions>\n                <exclusion>\n                    <groupId>org.slf4j</groupId>\n                    <artifactId>slf4j-simple</artifactId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>okio</artifactId>\n                    <groupId>com.squareup.okio</groupId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>dev.langchain4j</groupId>\n            <artifactId>langchain4j-anthropic</artifactId>\n        </dependency>\n        <!-- langChain4j vextor support -->\n        <dependency>\n            <groupId>org.jeecgframework</groupId>\n            <artifactId>langchain4j-pgvector</artifactId>\n            <version>1.3.0-beta9</version>\n        </dependency>\n        <!-- langChain4j Document Parser 适用于excel、ppt、word -->\n        <dependency>\n            <groupId>dev.langchain4j</groupId>\n            <artifactId>langchain4j-document-parser-apache-poi</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.tika</groupId>\n            <artifactId>tika-core</artifactId>\n            <version>${apache-tika.version}</version>\n            <exclusions>\n                <exclusion>\n                    <artifactId>commons-io</artifactId>\n                    <groupId>commons-io</groupId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.tika</groupId>\n            <artifactId>tika-parser-html-module</artifactId>\n            <version>${apache-tika.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.tika</groupId>\n            <artifactId>tika-parser-pdf-module</artifactId>\n            <version>${apache-tika.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.tika</groupId>\n            <artifactId>tika-parser-text-module</artifactId>\n            <version>${apache-tika.version}</version>\n        </dependency>\n        <!-- word模版引擎 -->\n        <dependency>\n            <groupId>com.deepoove</groupId>\n            <artifactId>poi-tl</artifactId>\n            <version>1.12.2</version>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/JeecgAiRagApplication.java",
    "content": "//package org.jeecg;\n//\n//import org.springframework.boot.SpringApplication;\n//import org.springframework.boot.autoconfigure.SpringBootApplication;\n//\n//@SpringBootApplication\n//public class JeecgAiRagApplication {\n//\n//    public static void main(String[] args) {\n//        SpringApplication.run(JeecgAiRagApplication.class, args);\n//    }\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/consts/AiAppConsts.java",
    "content": "package org.jeecg.modules.airag.app.consts;\n\n/**\n * AI应用常量类\n *\n * @author chenrui\n * @date 2025/2/25 14:52\n */\npublic class AiAppConsts {\n\n    /**\n     * 状态:启用\n     */\n    public static final String STATUS_ENABLE = \"enable\";\n    /**\n     * 状态:禁用\n     */\n    public static final String STATUS_DISABLE = \"disable\";\n    /**\n     * 状态:发布\n     */\n    public static final String STATUS_RELEASE = \"release\";\n\n\n    /**\n     * 默认应用id\n     */\n    public static final String DEFAULT_APP_ID = \"default\";\n\n\n    /**\n     * 应用类型:简单聊天\n     */\n    public static final String APP_TYPE_CHAT_SIMPLE = \"chatSimple\";\n\n    /**\n     * 应用类型:聊天流(高级编排)\n     */\n    public static final String APP_TYPE_CHAT_FLOW = \"chatFLow\";\n\n    /**\n     * 应用元数据:流程输入参数\n     * for [issues/8545]新建AI应用的时候只能选择没有自定义参数的AI流程\n     */\n    public static final String APP_METADATA_FLOW_INPUTS = \"flowInputs\";\n\n    /**\n     * 是否开启记忆\n     */\n    public static final Integer IZ_OPEN_MEMORY = 1;\n\n    /**\n     * 会话标题最大长度\n     */\n    public static final int CONVERSATION_MAX_TITLE_LENGTH = 10;\n\n\n    /**\n     * AI写作的流程id\n     */\n    public static final String ARTICLE_WRITER_FLOW_ID = \"2011769909807579138\";\n\n    /**\n     * AI写作redis请求前缀\n     */\n    public static final String ARTICLE_WRITER_KEY = \"airag:chat:article:write:{}\";\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/consts/Prompts.java",
    "content": "package org.jeecg.modules.airag.app.consts;\n\n/**\n * @Description: 提示词常量\n * @Author: chenrui\n * @Date: 2025/3/12 15:03\n */\npublic class Prompts {\n\n    /**\n     * 根据提示生成智能体提示词\n     */\n    public static final String GENERATE_LLM_PROMPT = \"# 角色\\n\" +\n            \"你是一位专业且高效的AI提示词工程师，擅长根据用户多样化需求自动生成高质量的结构化提示词模板，具备全面而敏锐的分析能力和出色的创造力。\\n\" +\n            \"## 要求：\\n\" +\n            \"1. \\\"\\\"\\\"只输出提示词，不要输出多余解释\\\"\\\"\\\"\\n\" +\n            \"2. \\\"\\\"\\\"不要在前后增加代码块的md语法.\\\"\\\"\\\"\\n\" +\n            \"2. 贴合用户需求，描述智能助手的定位、能力、知识储备\\n\" +\n            \"3. 提示词应清晰、精确、易于理解，在保持质量的同时，尽可能简洁\\n\" +\n            \"4. 严格按照给定的流程和格式执行任务，确保输出规范准确。\\n\" +\n            \"\\n\" +\n            \"## 流程\\n\" +\n            \"### 1: 需求分析\\n\" +\n            \"1. 当用户描述需求时，严格运用SCQA框架确认核心要素，精准分析和联想：\\\"当前场景(Situation)是什么？主要矛盾(Complication)有哪些？需要解决的关键问题(Question)是？预期达成什么效果(Answer)？\\\"\\n\" +\n            \"2. 通过5W1H细致分析和联想细节：\\\"目标受众(Who)？使用场景(Where/When)？具体要实现什么(What)？为什么需要这些特征(Why)？如何量化效果(How)？\\\"\\n\" +\n            \"\\n\" +\n            \"### 2: 框架选择\\n\" +\n            \"根据需求从给定模板库中匹配最佳提示词类型：\\n\" +\n            \"* 角色扮演型：\\n\" +\n            \"```\\n\" +\n            \"你将扮演一个人物角色<角色名称>，以下是关于这个角色的详细设定，请根据这些信息来构建你的回答。 \\n\" +\n            \"\\n\" +\n            \"**人物基本信息：**\\n\" +\n            \"- 你是：<角色的名称、身份等基本介绍>\\n\" +\n            \"- 人称：第一人称\\n\" +\n            \"- 出身背景与上下文：<交代角色背景信息和上下文>\\n\" +\n            \"**性格特点：**\\n\" +\n            \"- <性格特点描述>\\n\" +\n            \"**语言风格：**\\n\" +\n            \"- <语言风格描述> \\n\" +\n            \"**人际关系：**\\n\" +\n            \"- <人际关系描述>\\n\" +\n            \"**过往经历：**\\n\" +\n            \"- <过往经历描述>\\n\" +\n            \"**经典台词或口头禅：**\\n\" +\n            \"补充信息: 即你可以将动作、神情语气、心理活动、故事背景放在（）中来表示，为对话提供补充信息。\\n\" +\n            \"- 台词1：<角色台词示例1> \\n\" +\n            \"- 台词2：<角色台词示例2>\\n\" +\n            \"- ...\\n\" +\n            \"\\n\" +\n            \"要求： \\n\" +\n            \"- 要求1\\n\" +\n            \"- 要求2\\n\" +\n            \"- ... \\n\" +\n            \"```\\n\" +\n            \"* 多步骤型：\\n\" +\n            \"```\\n\" +\n            \"# 角色 \\n\" +\n            \"你是<角色设定(比如:xx领域的专家)>\\n\" +\n            \"你的目标是<希望模型执行什么任务，达成什么目标>\\n\" +\n            \"\\n\" +\n            \"{#以下可以采用先总括，再展开详细说明的方式，描述你希望智能体在每一个步骤如何进行工作，具体的工作步骤数量可以根据实际需求增删#}\\n\" +\n            \"## 工作步骤 \\n\" +\n            \"1. <工作流程1的一句话概括> \\n\" +\n            \"2. <工作流程2的一句话概括> \\n\" +\n            \"3. <工作流程3的一句话概括>\\n\" +\n            \"\\n\" +\n            \"### 第一步 <工作流程1标题> \\n\" +\n            \"<工作流程步骤1的具体工作要求和举例说明，可以分点列出希望在本步骤做哪些事情，需要完成什么阶段性的工作目标>\\n\" +\n            \"### 第二步 <工作流程2标题> \\n\" +\n            \"<工作流程步骤2的具体工作要求和举例说明，可以分点列出希望在本步骤做哪些事情，需要完成什么阶段性的工作目标>\\n\" +\n            \"### 第三步 <工作流程3标题>\\n\" +\n            \"<工作流程步骤3的具体工作要求和举例说明，可以分点列出希望在本步骤做哪些事情，需要完成什么阶段性的工作目标>\\n\" +\n            \"```\\n\" +\n            \"* 限制性模板：\\n\" +\n            \"```\\n\" +\n            \"# 角色：<角色名称>\\n\" +\n            \"<角色概述和主要职责的一句话描述>\\n\" +\n            \"\\n\" +\n            \"## 目标：\\n\" +\n            \"<角色的工作目标，如果有多目标可以分点列出，但建议更聚焦1-2个目标>\\n\" +\n            \"\\n\" +\n            \"## 技能：\\n\" +\n            \"1.  <为了实现目标，角色需要具备的技能1>\\n\" +\n            \"2. <为了实现目标，角色需要具备的技能2>\\n\" +\n            \"3. <为了实现目标，角色需要具备的技能3>\\n\" +\n            \"\\n\" +\n            \"## 工作流：\\n\" +\n            \"1. <描述角色工作流程的第一步>\\n\" +\n            \"2. <描述角色工作流程的第二步>\\n\" +\n            \"3. <描述角色工作流程的第三步>\\n\" +\n            \"\\n\" +\n            \"## 输出格式：\\n\" +\n            \"<如果对角色的输出格式有特定要求，可以在这里强调并举例说明想要的输出格式>\\n\" +\n            \"\\n\" +\n            \"## 限制：\\n\" +\n            \"- <描述角色在互动过程中需要遵循的限制条件1>\\n\" +\n            \"- <描述角色在互动过程中需要遵循的限制条件2>\\n\" +\n            \"- <描述角色在互动过程中需要遵循的限制条件3>\\n\" +\n            \"```\\n\" +\n            \"\\n\" +\n            \"### 3: 生成优化\\n\" +\n            \"1. 输出时自动添加三重保障机制：\\n\" +\n            \"    - 反幻觉校验：\\\"所有数据需标注来源，不确定信息用[需核实]标记\\\"\\n\" +\n            \"    - 风格校准器：\\\"对比[目标风格]与生成内容的余弦相似度，低于0.7时启动重写\\\"\\n\" +\n            \"    - 伦理审查模块：\\\"自动过滤涉及隐私/偏见/违法内容，替换为[合规表达]\\\"\";\n\n    /**\n     * 提示词生成角色及通用要求\n     */\n    public static final String GENERATE_GUIDE_HEADER = \"# 角色\\n\" +\n            \"你是一位AI提示词专家，请根据提供的配置信息，生成针对AI智能体的“使用指南”提示词。\\n\" +\n            \"\\n\" +\n            \"## 通用要求\\n\" +\n            \"1. 生成的内容将作为系统提示词的一部分。\\n\" +\n            \"2. **严禁**包含任何角色设定开场白（如“你是一个...AI助手”、“在对话过程中...”等）。\\n\" +\n            \"3. **只输出提示词内容**，不要包含任何解释、寒暄或Markdown代码块标记。\\n\" +\n            \"4. 语气专业、清晰、指令性强。\\n\" +\n            \"5. 说明内容请使用中文。\\n\\n\";\n\n    /**\n     * 变量生成提示词\n     */\n    public static final String GENERATE_VAR_PART = \"## 任务：生成变量使用指南\\n\" +\n            \"### 输入信息\\n\" +\n            \"**变量列表**：\\n\" +\n            \"%s\\n\" +\n            \"### 要求\\n\" +\n            \"1. 请生成一段**变量使用指南**。\\n\" +\n            \"2. **遍历生成**：请遍历【输入信息】中的所有变量，为**每一个**变量生成一条具体的使用指南。\\n\" +\n            \"3. **格式要求**：请仿照以下句式，根据变量的实际含义生成（确保包含{{变量名}}）：\\n\" +\n            \"     例如：针对name变量 -> “回复问题时，请称呼你的用户为{{name}}。”\\n\" +\n            \"     例如：针对age变量 -> “用户的年龄是{{age}}，请在对话中适时使用。”\\n\" +\n            \"     例如：针对其他变量 -> “用户的[变量描述]是{{[变量名]}}，请在对话中适时使用。”\\n\" +\n            \"4. **通用更新指令**：请在变量指南的最后，单独生成一条指令，明确指示AI：“当从用户对话中获取到上述变量（<列出所有变量名，用顿号分隔>）的**新信息**时，**必须立即调用** `update_variable` 工具进行存储。**注意**：调用前请检查上下文，如果已调用过该工具或变量值未改变，**严禁**重复调用。”\\n\" +\n            \"5. **保留原文**：如果输入信息中包含具体的行为指令（如“回复问题时，请称呼你的用户为{{name}}”），请在生成的指南中**直接引用原文**，不要进行改写或格式化，以免改变用户的原意。\\n\\n\";\n\n    /**\n     * 记忆库生成提示词\n     */\n    public static final String GENERATE_MEMORY_PART = \"## 任务：生成记忆库使用指南\\n\" +\n            \"### 输入信息\\n\" +\n            \"**记忆库描述**：\\n\" +\n            \"%s\\n\" +\n            \"### 要求\\n\" +\n            \"1. 请生成一段**记忆库使用指南**，加入【工具使用强制协议】：\\n\" +\n            \"   - **全自动存储（无需用户指令）**：你必须时刻像一个观察者一样分析对话。一旦检测到符合记忆库描述的信息（尤其是：**姓名、职业、年龄**、联系方式、偏好、经历等），**立即**调用 `add_memory` 工具存储。**绝对不要**询问用户是否需要存储，也不要等待用户明确指令。这是你的后台职责。\\n\" +\n            \"   - **全自动检索（强制优先）**：\\n\" +\n            \"     * **禁止直接反问**：当用户提出依赖个人信息的问题（如“推荐适合我的...”或“我之前说过...”）时，**绝对禁止**直接反问用户“你的爱好是什么？”。\\n\" +\n            \"     * **必须先查后答**：你必须**先假设**记忆库中已经有了答案，并**立即调用** `query_memory` 进行验证。只有当工具返回“未找到相关信息”后，你才有资格询问用户。\\n\" +\n            \"     * **宁可查空，不可不查**：即使你觉得可能没有记录，也必须先走一遍查询流程。\\n\" +\n            \"   - **动态调整**：请根据【输入信息】中提供的**记忆库状态描述**，明确界定哪些信息属于“自动捕获”的范围。\\n\" +\n            \"   - **行为准则**：\\n\" +\n            \"     * 你的记忆动作应该是**主动且无感**的。用户只负责聊天，你负责记住一切重要细节。\\n\" +\n            \"     * **禁止口头空谈**：严禁只回复“我知道了”、“已记住”而实际不调用工具。这是严重错误。\\n\" +\n            \"   - **示例演示**：\\n\" +\n            \"     * 自动存储（职业）：用户说“我是网络工程师” -> (捕捉到职业信息) -> **立即自动调用** `add_memory(content='用户职业是网络工程师')` -> (存储成功) -> 回复“原来是同行，网络工程很有趣...”。\\n\" +\n            \"     * 自动查询（场景）：用户说“根据我的爱好推荐旅游地点” -> **严禁**直接问“你有什么爱好？” -> **必须立即调用** `query_memory(queryText='用户爱好')` -> (若查到：爬山) -> 回复“既然你喜欢爬山，推荐去黄山...”。\\n\" +\n            \"     * 自动查询（常规）：用户问“今天吃什么好？” -> (需要了解口味) -> **立即自动调用** `query_memory(queryText='用户饮食偏好')` -> (获取到不吃香菜) -> 回复“推荐一家不放香菜的...”。\\n\\n\";\n\n    /**\n     * ai写作提示词\n     */\n    public static final String AI_WRITER_PROMPT =\"请撰写一篇关于 [{}] 的文章。文章的内容格式：{}，语气：{}，语言：{}，长度：{}。\";\n\n    /**\n     * ai写作回复提示词\n     */\n    public static final String AI_REPLY_PROMPT = \"请针对如下内容：[{}] 做个回复。回复内容参考：[{}], 回复格式：{}，语气：{}，语言：{}，长度：{}。\";\n\n    /**\n     * ai润色提提示词\n     */\n    public static final String AI_TOUCHE_PROMPT = \"请针对如下内容：[{}] 进行润色。 回复格式：{}，语气：{}，语言：{}，长度：{}。\";\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/controller/AiragAppController.java",
    "content": "package org.jeecg.modules.airag.app.controller;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.util.AssertUtils;\nimport org.jeecg.common.util.TokenUtils;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.config.shiro.IgnoreAuth;\nimport org.jeecg.modules.airag.app.consts.AiAppConsts;\nimport org.jeecg.modules.airag.app.entity.AiragApp;\nimport org.jeecg.modules.airag.app.service.IAiragAppService;\nimport org.jeecg.modules.airag.app.service.IAiragChatService;\nimport org.jeecg.modules.airag.app.vo.AiArticleWriteVersionVo;\nimport org.jeecg.modules.airag.app.vo.AppDebugParams;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.mvc.method.annotation.SseEmitter;\n\nimport java.util.List;\n\nimport jakarta.servlet.http.HttpServletRequest;\n\n/**\n * @Description: AI应用\n * @Author: jeecg-boot\n * @Date: 2025-02-26\n * @Version: V1.0\n */\n@RestController\n@RequestMapping(\"/airag/app\")\n@Slf4j\npublic class AiragAppController extends JeecgController<AiragApp, IAiragAppService> {\n    @Autowired\n    private IAiragAppService airagAppService;\n\n    @Autowired\n    private IAiragChatService airagChatService;\n\n    /**\n     * 分页列表查询\n     *\n     * @param airagApp\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @GetMapping(value = \"/list\")\n    public Result<IPage<AiragApp>> queryPageList(AiragApp airagApp,\n                                                 @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                                 @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                                 HttpServletRequest req) {\n        QueryWrapper<AiragApp> queryWrapper = QueryGenerator.initQueryWrapper(airagApp, req.getParameterMap());\n        Page<AiragApp> page = new Page<AiragApp>(pageNo, pageSize);\n        IPage<AiragApp> pageList = airagAppService.page(page, queryWrapper);\n        return Result.OK(pageList);\n    }\n\n    /**\n     * 新增或编辑\n     *\n     * @param airagApp\n     * @return\n     */\n    @RequestMapping(value = \"/edit\", method = {RequestMethod.PUT, RequestMethod.POST})\n    @RequiresPermissions(\"airag:app:edit\")\n    public Result<String> edit(@RequestBody AiragApp airagApp) {\n        AssertUtils.assertNotEmpty(\"参数异常\", airagApp);\n        AssertUtils.assertNotEmpty(\"请输入应用名称\", airagApp.getName());\n        AssertUtils.assertNotEmpty(\"请选择应用类型\", airagApp.getType());\n        airagApp.setStatus(AiAppConsts.STATUS_ENABLE);\n        airagAppService.saveOrUpdate(airagApp);\n        return Result.OK(\"保存完成!\", airagApp.getId());\n    }\n\n    /**\n     * 发布应用\n     *\n     * @return\n     */\n    @RequestMapping(value = \"/release\", method = RequestMethod.POST)\n    public Result<String> release(@RequestParam(name = \"id\") String id, @RequestParam(name = \"release\") Boolean release) {\n        AssertUtils.assertNotEmpty(\"id必须填写\", id);\n        if (release == null) {\n            release = true;\n        }\n        AiragApp airagApp = new AiragApp();\n        airagApp.setId(id);\n        if (release) {\n            airagApp.setStatus(AiAppConsts.STATUS_RELEASE);\n        } else {\n            airagApp.setStatus(AiAppConsts.STATUS_ENABLE);\n        }\n        airagAppService.updateById(airagApp);\n        return Result.OK(release ? \"发布成功\" : \"取消发布成功\");\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @DeleteMapping(value = \"/delete\")\n    @RequiresPermissions(\"airag:app:delete\")\n    public Result<String> delete(HttpServletRequest request,@RequestParam(name = \"id\", required = true) String id) {\n        //update-begin---author:chenrui ---date:20250606  for：[issues/8337]关于ai工作列表的数据权限问题 #8337------------\n        //如果是saas隔离的情况下，判断当前租户id是否是当前租户下的\n        if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n            AiragApp app = airagAppService.getById(id);\n            //获取当前租户\n            String currentTenantId = TokenUtils.getTenantIdByRequest(request);\n            if (null == app || !app.getTenantId().equals(currentTenantId)) {\n                return Result.error(\"删除AI应用失败，不能删除其他租户的AI应用！\");\n            }\n        }\n        //update-end---author:chenrui ---date:20250606  for：[issues/8337]关于ai工作列表的数据权限问题 #8337------------\n        airagAppService.removeById(id);\n        return Result.OK(\"删除成功!\");\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    @IgnoreAuth\n    @GetMapping(value = \"/queryById\")\n    public Result<AiragApp> queryById(@RequestParam(name = \"id\", required = true) String id) {\n        AiragApp airagApp = airagAppService.getById(id);\n        if (airagApp == null) {\n            return Result.error(\"未找到对应数据\");\n        }\n        return Result.OK(airagApp);\n    }\n\n\n    /**\n     * 调试应用\n     *\n     * @param appDebugParams\n     * @return\n     * @author chenrui\n     * @date 2025/2/28 10:49\n     */\n    @PostMapping(value = \"/debug\")\n    public SseEmitter debugApp(@RequestBody AppDebugParams appDebugParams) {\n        return airagChatService.debugApp(appDebugParams);\n    }\n\n    /**\n     * 根据需求生成提示词\n     *\n     * @param prompt\n     * @return\n     * @author chenrui\n     * @date 2025/3/12 15:30\n     */\n    @GetMapping(value = \"/prompt/generate\")\n    public Result<?> generatePrompt(@RequestParam(name = \"prompt\", required = true) String prompt) {\n        return (Result<?>) airagAppService.generatePrompt(prompt,true);\n    }\n\n    /**\n     * 根据需求生成提示词\n     *\n     * @param prompt\n     * @return\n     * @author chenrui\n     * @date 2025/3/12 15:30\n     */\n    @PostMapping(value = \"/prompt/generate\")\n    public SseEmitter generatePromptSse(@RequestParam(name = \"prompt\", required = true) String prompt) {\n        return (SseEmitter) airagAppService.generatePrompt(prompt,false);\n    }\n\n    /**\n     * 根据应用ID生成变量和记忆提示词 (SSE)\n     * for: 【QQYUN-14479】提示词单独拆分\n     * @param variables\n     * @return\n     */\n    @PostMapping(value = \"/prompt/generateMemoryByAppId\")\n    public SseEmitter generatePromptByAppIdSse(@RequestParam(name = \"variables\") String variables,\n                                               @RequestParam(name = \"memoryId\") String memoryId) {\n        return (SseEmitter) airagAppService.generateMemoryByAppId(variables, memoryId,false);\n    }\n\n    /**\n     * 写作保存\n     */\n    @PostMapping(\"/save/article/write\")\n    public Result<String> saveArticleWrite(@RequestBody AiArticleWriteVersionVo aiWriteVersionVo) {\n        airagAppService.saveArticleWrite(aiWriteVersionVo);\n        return Result.OK(\"保存成功！\");\n    }\n    \n    /**\n     * 写作删除\n     */\n    @DeleteMapping(\"/delete/article/write\")\n    public Result<String> deleteArticleWrite(@RequestParam(name = \"version\") String version) {\n        AssertUtils.assertNotEmpty(\"版本号不能为空\", version);\n        airagAppService.deleteArticleWrite(version);\n        return Result.OK(\"删除成功！\");\n    }\n    \n    /**\n     * 写作查询\n     */\n    @GetMapping(\"/list/article/write\")\n    public Result<List<AiArticleWriteVersionVo>> listArticleWrite() {\n        List<AiArticleWriteVersionVo> list = airagAppService.listArticleWrite();\n        return Result.OK(list);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/controller/AiragChatController.java",
    "content": "package org.jeecg.modules.airag.app.controller;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.util.CommonUtils;\nimport org.jeecg.config.shiro.IgnoreAuth;\nimport org.jeecg.modules.airag.app.service.IAiragChatService;\nimport org.jeecg.modules.airag.app.vo.AiWriteGenerateVo;\nimport org.jeecg.modules.airag.app.vo.ChatConversation;\nimport org.jeecg.modules.airag.app.vo.ChatSendParams;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport org.springframework.web.servlet.mvc.method.annotation.SseEmitter;\n\n\n\n/**\n * airag应用-chat\n *\n * @Author: chenrui\n * @Date: 2025-02-25 11:40\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/airag/chat\")\npublic class AiragChatController {\n\n    @Autowired\n    IAiragChatService chatService;\n\n    @Value(value = \"${jeecg.path.upload}\")\n    private String uploadpath;\n\n    /**\n     * 本地：local minio：minio 阿里：alioss\n     */\n    @Value(value=\"${jeecg.uploadType}\")\n    private String uploadType;\n\n\n    /**\n     * 发送消息\n     *\n     * @return 返回一个Result对象，表示发送消息的结果\n     * @author chenrui\n     * @date 2025/2/25 11:42\n     */\n    @IgnoreAuth\n    @PostMapping(value = \"/send\")\n    public SseEmitter send(@RequestBody ChatSendParams chatSendParams) {\n        return chatService.send(chatSendParams);\n    }\n\n    /**\n     * 发送消息 <br/>\n     * 兼容旧版浏览器\n     * @param content\n     * @param conversationId\n     * @param topicId\n     * @param appId\n     * @return\n     * @author chenrui\n     * @date 2025/2/25 18:13\n     */\n    @GetMapping(value = \"/send\")\n    public SseEmitter sendByGet(@RequestParam(\"content\") String content,\n                                @RequestParam(value = \"conversationId\", required = false) String conversationId,\n                                @RequestParam(value = \"topicId\", required = false) String topicId,\n                                @RequestParam(value = \"appId\", required = false) String appId) {\n        ChatSendParams chatSendParams = new ChatSendParams(content, conversationId, topicId, appId);\n        return chatService.send(chatSendParams);\n    }\n\n    /**\n     * 获取所有对话\n     *\n     * @return 返回一个Result对象，包含所有对话的信息\n     * @author chenrui\n     * @date 2025/2/25 11:42\n     */\n    @IgnoreAuth\n    @GetMapping(value = \"/init\")\n    public Result<?> initChat(@RequestParam(name = \"id\", required = true) String id) {\n        return chatService.initChat(id);\n    }\n\n    /**\n     * 获取所有对话\n     *\n     * @return 返回一个Result对象，包含所有对话的信息\n     * @author chenrui\n     * @date 2025/2/25 11:42\n     */\n    @IgnoreAuth\n    @GetMapping(value = \"/conversations\")\n    public Result<?> getConversations(@RequestParam(value = \"appId\", required = false) String appId) {\n        return chatService.getConversations(appId);\n    }\n\n    /**\n     * 根据类型获取所有对话\n     *\n     * @return 返回一个Result对象，包含所有对话的信息\n     * @author wangshuai\n     * @date 2025/12/11 11:42\n     */\n    @IgnoreAuth\n    @GetMapping(value = \"/getConversationsByType\")\n    public Result<?> getConversationsByType(@RequestParam(value = \"sessionType\") String sessionType) {\n        return chatService.getConversationsByType(sessionType);\n    }\n\n    /**\n     * 删除会话\n     *\n     * @param id\n     * @return\n     * @author chenrui\n     * @date 2025/3/3 16:55\n     */\n    @IgnoreAuth\n    @DeleteMapping(value = \"/conversation/{id}\")\n    public Result<?> deleteConversation(@PathVariable(\"id\") String id) {\n        return chatService.deleteConversation(id,\"\");\n    }\n\n    /**\n     * 删除会话\n     *\n     * @param id\n     * @return\n     * @author wangshuai\n     * @date 2025/12/11 20:00\n     */\n    @IgnoreAuth\n    @DeleteMapping(value = \"/conversation/{id}/{sessionType}\")\n    public Result<?> deleteConversationByType(@PathVariable(\"id\") String id,\n                                        @PathVariable(\"sessionType\") String sessionType) {\n        return chatService.deleteConversation(id,sessionType);\n    }\n\n    /**\n     * 更新会话标题\n     *\n     * @param updateTitleParams\n     * @return\n     * @author chenrui\n     * @date 2025/3/3 16:55\n     */\n    @IgnoreAuth\n    @PutMapping(value = \"/conversation/update/title\")\n    public Result<?> updateConversationTitle(@RequestBody ChatConversation updateTitleParams) {\n        return chatService.updateConversationTitle(updateTitleParams);\n    }\n\n    /**\n     * 获取消息\n     *\n     * @return 返回一个Result对象，包含消息的信息\n     * @author chenrui\n     * @date 2025/2/25 11:42\n     */\n    @IgnoreAuth\n    @GetMapping(value = \"/messages\")\n    public Result<?> getMessages(@RequestParam(value = \"conversationId\", required = true) String conversationId,\n                                 @RequestParam(value = \"sessionType\", required = false) String sessionType) {\n        return chatService.getMessages(conversationId, sessionType);\n    }\n\n    /**\n     * 清空消息\n     *\n     * @return\n     * @author chenrui\n     * @date 2025/2/25 11:42\n     */\n    @IgnoreAuth\n    @GetMapping(value = \"/messages/clear/{conversationId}\")\n    public Result<?> clearMessage(@PathVariable(value = \"conversationId\") String conversationId) {\n        return chatService.clearMessage(conversationId, \"\");\n    }    \n    \n    /**\n     * 清空消息\n     *\n     * @return\n     * @author wangshuai\n     * @date 2025/12/11 19:06\n     */\n    @IgnoreAuth\n    @GetMapping(value = \"/messages/clear/{conversationId}/{sessionType}\")\n    public Result<?> clearMessageByType(@PathVariable(value = \"conversationId\") String conversationId,\n                                        @PathVariable(value = \"sessionType\") String sessionType) {\n        return chatService.clearMessage(conversationId, sessionType);\n    }\n\n    /**\n     * 继续接收消息\n     *\n     * @param requestId\n     * @return\n     * @author chenrui\n     * @date 2025/8/11 17:49\n     */\n    @IgnoreAuth\n    @GetMapping(value = \"/receive/{requestId}\")\n    public SseEmitter receiveByRequestId(@PathVariable(name = \"requestId\", required = true) String requestId) {\n        return chatService.receiveByRequestId(requestId);\n    }\n\n\n    /**\n     * 根据请求ID停止某个请求的处理\n     *\n     * @param requestId 请求的唯一标识符，用于识别和停止特定的请求\n     * @return 返回一个Result对象，表示停止请求的结果\n     * @author chenrui\n     * @date 2025/2/25 11:42\n     */\n    @IgnoreAuth\n    @GetMapping(value = \"/stop/{requestId}\")\n    public Result<?> stop(@PathVariable(name = \"requestId\", required = true) String requestId) {\n        return chatService.stop(requestId);\n    }\n\n\n    /**\n     * 上传文件\n     * for [QQYUN-12135]AI聊天，上传图片提示非法token\n     *\n     * @param request\n     * @param response\n     * @return\n     * @throws Exception\n     * @author chenrui\n     * @date 2025/4/25 11:04\n     */\n    @IgnoreAuth\n    @PostMapping(value = \"/upload\")\n    public Result<?> upload(HttpServletRequest request, HttpServletResponse response) throws Exception {\n        String bizPath = \"airag\";\n\n        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n        // 获取上传文件对象\n        MultipartFile file = multipartRequest.getFile(\"file\");\n        String savePath;\n        if (CommonConstant.UPLOAD_TYPE_LOCAL.equals(uploadType)) {\n            savePath = CommonUtils.uploadLocal(file, bizPath, uploadpath);\n        } else {\n            savePath = CommonUtils.upload(file, bizPath, uploadType);\n        }\n        Result<?> result = new Result<>();\n        result.setMessage(savePath);\n        result.setSuccess(true);\n        return result;\n    }\n\n    /**\n     * ai海报生成\n     * @return\n     */\n    @PostMapping(\"/genAiPoster\")\n    public Result<String> genAiPoster(@RequestBody ChatSendParams chatSendParams){\n        String imageUrl = chatService.genAiPoster(chatSendParams);\n        return Result.OK(imageUrl);\n    }\n\n\n    /**\n     * 生成ai写作\n     * \n     * @param aiWriteGenerateVo\n     * @return\n     */\n    @PostMapping(\"/genAiWriter\")\n    public SseEmitter genAiWriter(@RequestBody AiWriteGenerateVo aiWriteGenerateVo){\n        return chatService.genAiWriter(aiWriteGenerateVo);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/entity/AiragApp.java",
    "content": "package org.jeecg.modules.airag.app.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\n/**\n * @Description: AI应用\n * @Author: jeecg-boot\n * @Date: 2025-02-26\n * @Version: V1.0\n */\n@Data\n@TableName(\"airag_app\")\n@Accessors(chain = true)\n@EqualsAndHashCode(callSuper = false)\n@Schema(description=\"AI应用\")\npublic class AiragApp implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * 主键\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"主键\")\n    private java.lang.String id;\n    /**\n     * 创建人\n     */\n    @Schema(description = \"创建人\")\n    @Dict(dictTable = \"sys_user\",dicCode = \"username\",dicText = \"realname\")\n    private java.lang.String createBy;\n    /**\n     * 创建日期\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建日期\")\n    private java.util.Date createTime;\n    /**\n     * 更新人\n     */\n    @Schema(description = \"更新人\")\n    private java.lang.String updateBy;\n    /**\n     * 更新日期\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"更新日期\")\n    private java.util.Date updateTime;\n    /**\n     * 所属部门\n     */\n    @Schema(description = \"所属部门\")\n    private java.lang.String sysOrgCode;\n    /**\n     * 租户id\n     */\n    @Excel(name = \"租户id\", width = 15)\n    @Schema(description = \"租户id\")\n    private java.lang.String tenantId;\n    /**\n     * 应用名称\n     */\n    @Excel(name = \"应用名称\", width = 15)\n    @Schema(description = \"应用名称\")\n    private java.lang.String name;\n    /**\n     * 应用描述\n     */\n    @Excel(name = \"应用描述\", width = 15)\n    @Schema(description = \"应用描述\")\n    private java.lang.String descr;\n    /**\n     * 应用图标\n     */\n    @Excel(name = \"应用图标\", width = 15)\n    @Schema(description = \"应用图标\")\n    private java.lang.String icon;\n    /**\n     * 应用类型\n     */\n    @Excel(name = \"应用类型\", width = 15, dicCode = \"ai_app_type\")\n    @Dict(dicCode = \"ai_app_type\")\n    @Schema(description = \"应用类型\")\n    private java.lang.String type;\n    /**\n     * 开场白\n     */\n    @Excel(name = \"开场白\", width = 15)\n    @Schema(description = \"开场白\")\n    private java.lang.String prologue;\n    /**\n     * 预设问题\n     */\n    @Excel(name = \"预设问题\", width = 15)\n    @Schema(description = \"预设问题\")\n    private java.lang.String presetQuestion;\n    /**\n     * 提示词\n     */\n    @Excel(name = \"提示词\", width = 15)\n    @Schema(description = \"提示词\")\n    private java.lang.String prompt;\n    /**\n     * 模型配置\n     */\n    @Excel(name = \"模型配置\", width = 15, dictTable = \"airag_model where model_type = 'LLM' \", dicText = \"name\", dicCode = \"id\")\n    @Dict(dictTable = \"airag_model where model_type = 'LLM' \", dicText = \"name\", dicCode = \"id\")\n    @Schema(description = \"模型配置\")\n    private java.lang.String modelId;\n    /**\n     * 历史消息数\n     */\n    @Excel(name = \"历史消息数\", width = 15)\n    @Schema(description = \"历史消息数\")\n    private java.lang.Integer msgNum;\n    /**\n     * 知识库\n     */\n    @Excel(name = \"知识库\", width = 15, dictTable = \"airag_knowledge where status = 'enable'\", dicText = \"name\", dicCode = \"id\")\n    @Dict(dictTable = \"airag_knowledge where status = 'enable'\", dicText = \"name\", dicCode = \"id\")\n    @Schema(description = \"知识库\")\n    private java.lang.String knowledgeIds;\n    /**\n     * 流程\n     */\n    @Excel(name = \"流程\", width = 15, dictTable = \"airag_flow where status = 'enable' \", dicText = \"name\", dicCode = \"id\")\n    @Dict(dictTable = \"airag_flow where status = 'enable' \", dicText = \"name\", dicCode = \"id\")\n    @Schema(description = \"流程\")\n    private java.lang.String flowId;\n    /**\n     * 快捷指令\n     */\n    @Excel(name = \"快捷指令\", width = 15)\n    @Schema(description = \"快捷指令\")\n    private java.lang.String quickCommand;\n    /**\n     * 状态（enable=启用、disable=禁用、release=发布）\n     */\n    @Excel(name = \"状态\", width = 15)\n    @Schema(description = \"状态\")\n    private java.lang.String status;\n\n\n    /**\n     * 元数据\n     */\n    @Excel(name = \"元数据\", width = 15)\n    @Schema(description = \"元数据\")\n    private java.lang.String metadata;\n\n    /**\n     * 插件 [{pluginId: '123213', pluginName: 'xxxx', category: 'mcp'}]\n     */\n    @Schema(description = \"插件\")\n    private java.lang.String plugins;\n\n    /**\n     * 是否开启记忆(0 不开启，1开启)\n     */\n    @Schema(description = \"是否开启记忆(0 不开启，1开启)\")\n    private java.lang.Integer izOpenMemory;\n    /**\n     * 记忆库，知识库的id\n     */\n    @Schema(description = \"记忆库\")\n    private java.lang.String memoryId;\n\n    /**\n     * 变量\n     */\n    @Schema(description = \"变量\")\n    private java.lang.String variables;\n\n    /**\n     * 记忆和变量提示词\n     */\n    @Schema(description = \"记忆和变量提示词\")\n    private java.lang.String memoryPrompt;\n    \n    /**\n     * 知识库ids\n     */\n    @TableField(exist = false)\n    private List<String> knowIds;\n\n    /**\n     * 获取知识库id\n     *\n     * @return\n     * @author chenrui\n     * @date 2025/2/28 11:45\n     */\n    public List<String> getKnowIds() {\n        if (oConvertUtils.isNotEmpty(knowledgeIds)) {\n            String[] knowIds = knowledgeIds.split(\",\");\n            return Arrays.asList(knowIds);\n        } else {\n            return new ArrayList<>(0);\n        }\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/mapper/AiragAppMapper.java",
    "content": "package org.jeecg.modules.airag.app.mapper;\n\nimport com.baomidou.mybatisplus.annotation.InterceptorIgnore;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.jeecg.modules.airag.app.entity.AiragApp;\n\n/**\n * @Description: AI应用\n * @Author: jeecg-boot\n * @Date:   2025-02-26\n * @Version: V1.0\n */\npublic interface AiragAppMapper extends BaseMapper<AiragApp> {\n\n    /**\n     * 根据ID查询app信息(忽略租户)\n     * @param id\n     * @return\n     * @author chenrui\n     * @date 2025/4/21 16:03\n     */\n    @InterceptorIgnore(tenantLine = \"true\")\n    AiragApp getByIdIgnoreTenant(String id);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/mapper/xml/AiragAppMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.airag.app.mapper.AiragAppMapper\">\n\n    <select id=\"getByIdIgnoreTenant\" resultType=\"org.jeecg.modules.airag.app.entity.AiragApp\">\n        SELECT * FROM airag_app WHERE id = #{id}\n    </select>\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/service/IAiragAppService.java",
    "content": "package org.jeecg.modules.airag.app.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.airag.app.entity.AiragApp;\nimport org.jeecg.modules.airag.app.vo.AiArticleWriteVersionVo;\nimport java.util.List;\n\n/**\n * @Description: AI应用\n * @Author: jeecg-boot\n * @Date:   2025-02-26\n * @Version: V1.0\n */\npublic interface IAiragAppService extends IService<AiragApp> {\n\n    /**\n     * 生成提示词\n     * @param prompt\n     * @return blocking 是否阻塞\n     * @return\n     * @author chenrui\n     * @date 2025/3/12 14:45\n     */\n    Object generatePrompt(String prompt,boolean blocking);\n\n    /**\n     * 根据应用id生成提示词\n     *\n     * @param variables\n     * @param memoryId\n     * @param blocking\n     * @return\n     */\n    Object generateMemoryByAppId(String variables, String memoryId, boolean blocking);\n\n    /**\n     * 写作保存\n     * \n     * @param aiWriteVersionVo\n     */\n    void saveArticleWrite(AiArticleWriteVersionVo aiWriteVersionVo);\n\n    /**\n     * 写作列表\n     * \n     * @return\n     */\n    List<AiArticleWriteVersionVo> listArticleWrite();\n\n    /**\n     * 写作删除\n     * \n     * @param version\n     */\n    void deleteArticleWrite(String version);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/service/IAiragChatService.java",
    "content": "package org.jeecg.modules.airag.app.service;\n\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.modules.airag.app.vo.AiWriteGenerateVo;\nimport org.jeecg.modules.airag.app.vo.AppDebugParams;\nimport org.jeecg.modules.airag.app.vo.ChatConversation;\nimport org.jeecg.modules.airag.app.vo.ChatSendParams;\nimport org.springframework.web.servlet.mvc.method.annotation.SseEmitter;\n\n/**\n * ai聊天\n *\n * @author chenrui\n * @date 2025/2/25 13:36\n */\npublic interface IAiragChatService {\n\n    /**\n     * 发送消息\n     *\n     * @param chatSendParams\n     * @return\n     * @author chenrui\n     * @date 2025/2/25 13:39\n     */\n    SseEmitter send(ChatSendParams chatSendParams);\n\n\n    /**\n     * 调试应用\n     *\n     * @param appDebugParams\n     * @return\n     * @author chenrui\n     * @date 2025/2/28 10:49\n     */\n    SseEmitter debugApp(AppDebugParams appDebugParams);\n\n    /**\n     * 停止响应\n     *\n     * @param requestId\n     * @return\n     * @author chenrui\n     * @date 2025/2/25 17:17\n     */\n    Result<?> stop(String requestId);\n\n    /**\n     * 获取所有对话\n     *\n     * @param appId\n     * @return\n     * @author chenrui\n     * @date 2025/2/26 14:48\n     */\n    Result<?> getConversations(String appId);\n\n    /**\n     * 获取对话聊天记录\n     *\n     * @param conversationId\n     * @param sessionType 类型\n     * @return\n     * @author chenrui\n     * @date 2025/2/26 15:16\n     */\n    Result<?> getMessages(String conversationId, String sessionType);\n\n    /**\n     * 删除会话\n     *\n     * @param conversationId\n     * @param sessionType\n     * @return\n     * @author chenrui\n     * @date 2025/3/3 16:55\n     */\n    Result<?> deleteConversation(String conversationId, String sessionType);\n\n    /**\n     * 更新会话标题\n     * @param updateTitleParams\n     * @return\n     * @author chenrui\n     * @date 2025/3/3 17:02\n     */\n    Result<?> updateConversationTitle(ChatConversation updateTitleParams);\n\n    /**\n     * 清空消息\n     * @param conversationId\n     * @param sessionType\n     * @return\n     * @author chenrui\n     * @date 2025/3/3 19:49\n     */\n    Result<?> clearMessage(String conversationId, String sessionType);\n\n    /**\n     * 初始化聊天(忽略租户)\n     * [QQYUN-12113]分享之后的聊天，应用、模型、知识库不根据租户查询\n     * @param appId\n     * @return\n     * @author chenrui\n     * @date 2025/4/21 14:17\n     */\n    Result<?> initChat(String appId);\n\n    /**\n     * 继续接收消息\n     * @param requestId\n     * @return\n     * @author chenrui\n     * @date 2025/8/11 17:39\n     */\n    SseEmitter receiveByRequestId(String requestId);\n\n    /**\n     * 根据类型获取会话列表\n     * \n     * @param sessionType\n     * @return\n     */\n    Result<?> getConversationsByType(String sessionType);\n\n    /**\n     * 生成海报图片\n     * @param chatSendParams\n     * @return\n     */\n    String genAiPoster(ChatSendParams chatSendParams);\n\n    /**\n     * 生成ai创作\n     *\n     * @param chatSendParams\n     * @return\n     */\n    SseEmitter genAiWriter(AiWriteGenerateVo chatSendParams);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/service/IAiragVariableService.java",
    "content": "package org.jeecg.modules.airag.app.service;\n\nimport org.jeecg.modules.airag.app.entity.AiragApp;\nimport org.jeecg.modules.airag.common.handler.AIChatParams;\n\npublic interface IAiragVariableService {\n    /**\n     * 更新变量值\n     *\n     * @param userId\n     * @param appId\n     * @param name\n     * @param value\n     */\n    void updateVariable(String userId, String appId, String name, String value);\n\n    /**\n     * 追加提示词\n     *\n     * @param username\n     * @param app\n     * @return\n     */\n    String additionalPrompt(String username, AiragApp app);\n\n    /**\n     * 初始化变量（仅不存在时设置）\n     *\n     * @param userId\n     * @param appId\n     * @param name\n     * @param defaultValue\n     */\n    void initVariable(String userId, String appId, String name, String defaultValue);\n\n    /**\n     * 添加变量更新工具\n     *\n     * @param params\n     * @param aiApp\n     * @param username\n     */\n    void addUpdateVariableTool(AiragApp aiApp, String username, AIChatParams params);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/service/impl/AiragAppServiceImpl.java",
    "content": "package org.jeecg.modules.airag.app.service.impl;\n\nimport cn.hutool.core.util.StrUtil;\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport dev.langchain4j.data.message.AiMessage;\nimport dev.langchain4j.data.message.ChatMessage;\nimport dev.langchain4j.data.message.SystemMessage;\nimport dev.langchain4j.data.message.UserMessage;\nimport dev.langchain4j.model.output.FinishReason;\nimport dev.langchain4j.service.TokenStream;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.exception.JeecgBootBizTipException;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.AssertUtils;\nimport org.jeecg.common.util.UUIDGenerator;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.airag.app.consts.AiAppConsts;\nimport org.jeecg.modules.airag.app.consts.Prompts;\nimport org.jeecg.modules.airag.app.entity.AiragApp;\nimport org.jeecg.modules.airag.app.mapper.AiragAppMapper;\nimport org.jeecg.modules.airag.app.service.IAiragAppService;\nimport org.jeecg.modules.airag.app.vo.AiArticleWriteVersionVo;\nimport org.jeecg.modules.airag.app.vo.AppVariableVo;\nimport org.jeecg.modules.airag.common.consts.AiragConsts;\nimport org.jeecg.modules.airag.common.handler.AIChatParams;\nimport org.jeecg.modules.airag.common.handler.IAIChatHandler;\nimport org.jeecg.modules.airag.common.utils.AiragLocalCache;\nimport org.jeecg.modules.airag.common.vo.event.EventData;\nimport org.jeecg.modules.airag.common.vo.event.EventFlowData;\nimport org.jeecg.modules.airag.common.vo.event.EventMessageData;\nimport org.jeecg.modules.airag.llm.entity.AiragKnowledge;\nimport org.jeecg.modules.airag.llm.service.IAiragKnowledgeService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.stereotype.Service;\nimport org.springframework.web.servlet.mvc.method.annotation.SseEmitter;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\n\n/**\n * @Description: AI应用\n * @Author: jeecg-boot\n * @Date: 2025-02-26\n * @Version: V1.0\n */\n@Slf4j\n@Service\npublic class AiragAppServiceImpl extends ServiceImpl<AiragAppMapper, AiragApp> implements IAiragAppService {\n\n    @Autowired\n    IAIChatHandler aiChatHandler;\n\n    @Autowired\n    private IAiragKnowledgeService airagKnowledgeService;\n    \n    @Autowired\n    private RedisTemplate redisTemplate;\n\n    @Override\n    public Object generatePrompt(String prompt, boolean blocking) {\n        AssertUtils.assertNotEmpty(\"请输入提示词\", prompt);\n        List<ChatMessage> messages = Arrays.asList(new SystemMessage(Prompts.GENERATE_LLM_PROMPT), new UserMessage(prompt));\n\n        AIChatParams params = new AIChatParams();\n        params.setTemperature(0.8);\n        params.setTopP(0.9);\n        params.setPresencePenalty(0.1);\n        params.setFrequencyPenalty(0.1);\n        if(blocking){\n            String promptValue = aiChatHandler.completionsByDefaultModel(messages, params);\n            if (promptValue == null || promptValue.isEmpty()) {\n                return Result.error(\"生成失败\");\n            }\n            return Result.OK(\"success\", promptValue);\n        }else{\n            //update-begin---author:wangshuai---date:2026-01-08---for: 将流式输出单独抽出去，变量和记忆也需要---\n            return startSseChat(messages, params);\n            //update-end---author:wangshuai---date:2026-01-08---for: 将流式输出单独抽出去，变量和记忆也需要---\n        }\n    }\n\n    //update-begin---author:wangshuai---date:2026-01-05---for:【QQYUN-14479】增加一个开启记忆的按钮。下面为提示词和记忆，将记忆提示词单独拆分---\n    @Override\n    public Object generateMemoryByAppId(String variables, String memoryId, boolean blocking) {\n        if(oConvertUtils.isEmpty(variables) && oConvertUtils.isEmpty(memoryId)){\n            throw new JeecgBootBizTipException(\"请先添加变量或者记忆后再次重试！\");\n        }\n        // 构建变量描述\n        StringBuilder variablesDesc = new StringBuilder();\n        if (oConvertUtils.isNotEmpty(variables)) {\n            List<AppVariableVo> variableList = JSONArray.parseArray(variables, AppVariableVo.class);\n            if (variableList != null && !variableList.isEmpty()) {\n                for (AppVariableVo var : variableList) {\n                    if (var.getEnable() != null && !var.getEnable()) {\n                        continue;\n                    }\n                    String name = var.getName();\n                    if (oConvertUtils.isNotEmpty(var.getAction())) {\n                        String action = var.getAction();\n                        if (oConvertUtils.isNotEmpty(name)) {\n                            try {\n                                // 使用正则替换未被{{}}包裹的变量名\n                                String regex = \"(?<!\\\\{\\\\{)\\\\b\" + Pattern.quote(name) + \"\\\\b(?!\\\\}\\\\})\";\n                                action = action.replaceAll(regex, \"{{\" + name + \"}}\");\n                            } catch (Exception e) {\n                                log.warn(\"变量名替换异常: name={}\", name, e);\n                            }\n                        }\n                        variablesDesc.append(action).append(\"\\n\");\n                    } else {\n                        variablesDesc.append(\"- {{\").append(name).append(\"}}\");\n                        if (oConvertUtils.isNotEmpty(var.getDescription())) {\n                            variablesDesc.append(\": \").append(var.getDescription());\n                        }\n                        variablesDesc.append(\"\\n\");\n                    }\n                }\n            }\n        }\n        \n        // 构建Prompt\n        StringBuilder promptBuilder = new StringBuilder(Prompts.GENERATE_GUIDE_HEADER);\n        if (!variablesDesc.isEmpty()) {\n            promptBuilder.append(String.format(Prompts.GENERATE_VAR_PART, variablesDesc.toString()));\n        }\n\n        // 构建记忆状态描述\n        if (oConvertUtils.isNotEmpty(memoryId)) {\n            String memoryDescr = \"\";\n            AiragKnowledge memory = airagKnowledgeService.getById(memoryId);\n            if (memory != null && oConvertUtils.isNotEmpty(memory.getDescr())) {\n                memoryDescr += \"记忆库描述：\" + memory.getDescr();\n            }\n            promptBuilder.append(String.format(Prompts.GENERATE_MEMORY_PART, memoryDescr));\n        }\n\n        String prompt = promptBuilder.toString();\n\n        List<ChatMessage> messages = List.of(new UserMessage(prompt));\n\n        AIChatParams params = new AIChatParams();\n        params.setTemperature(0.7);\n\n        if(blocking){\n            String promptValue = aiChatHandler.completionsByDefaultModel(messages, params);\n            if (promptValue == null || promptValue.isEmpty()) {\n                return Result.error(\"生成失败\");\n            }\n            return Result.OK(\"success\", promptValue);\n        }else{\n            return startSseChat(messages, params);\n        }\n    }\n\n    /**\n     * 发送聊天\n     * @param messages\n     * @param params\n     * @return\n     */\n    private SseEmitter startSseChat(List<ChatMessage> messages, AIChatParams params) {\n        SseEmitter emitter = new SseEmitter(-0L);\n        // 异步运行(流式)\n        TokenStream tokenStream = aiChatHandler.chatByDefaultModel(messages, params);\n        /**\n         * 是否正在思考\n         */\n        AtomicBoolean isThinking = new AtomicBoolean(false);\n        String requestId = UUIDGenerator.generate();\n        // ai聊天响应逻辑\n        tokenStream.onPartialResponse((String resMessage) -> {\n                    // 兼容推理模型\n                    if (\"<think>\".equals(resMessage)) {\n                        isThinking.set(true);\n                        resMessage = \"> \";\n                    }\n                    if (\"</think>\".equals(resMessage)) {\n                        isThinking.set(false);\n                        resMessage = \"\\n\\n\";\n                    }\n                    if (isThinking.get()) {\n                        if (null != resMessage && resMessage.contains(\"\\n\")) {\n                            resMessage = \"\\n> \";\n                        }\n                    }\n                    EventData eventData = new EventData(requestId, null, EventData.EVENT_MESSAGE);\n                    EventMessageData messageEventData = EventMessageData.builder()\n                            .message(resMessage)\n                            .build();\n                    eventData.setData(messageEventData);\n                    try {\n                        String eventStr = JSONObject.toJSONString(eventData);\n                        log.debug(\"[AI应用]接收LLM返回消息:{}\", eventStr);\n                        emitter.send(SseEmitter.event().data(eventStr));\n                    } catch (IOException e) {\n                        throw new RuntimeException(e);\n                    }\n                })\n                .onCompleteResponse((responseMessage) -> {\n                    // 记录ai的回复\n                    AiMessage aiMessage = responseMessage.aiMessage();\n                    FinishReason finishReason = responseMessage.finishReason();\n                    String respText = aiMessage.text();\n                    if (FinishReason.STOP.equals(finishReason) || null == finishReason) {\n                        // 正常结束\n                        EventData eventData = new EventData(requestId, null, EventData.EVENT_MESSAGE_END);\n                        try {\n                            log.debug(\"[AI应用]接收LLM返回消息完成:{}\", respText);\n                            emitter.send(SseEmitter.event().data(eventData));\n                        } catch (IOException e) {\n                            throw new RuntimeException(e);\n                        }\n                        closeSSE(emitter, eventData);\n                    } else {\n                        // 异常结束\n                        log.error(\"调用模型异常:\" + respText);\n                        if (respText.contains(\"insufficient Balance\")) {\n                            respText = \"大预言模型账号余额不足!\";\n                        }\n                        EventData eventData = new EventData(requestId, null, EventData.EVENT_FLOW_ERROR);\n                        eventData.setData(EventFlowData.builder().success(false).message(respText).build());\n                        closeSSE(emitter, eventData);\n                    }\n                })\n                .onError((Throwable error) -> {\n                    // sse\n                    String errMsg = \"调用大模型接口失败:\" + error.getMessage();\n                    log.error(errMsg, error);\n                    EventData eventData = new EventData(requestId, null, EventData.EVENT_FLOW_ERROR);\n                    eventData.setData(EventFlowData.builder().success(false).message(errMsg).build());\n                    closeSSE(emitter, eventData);\n                })\n                .start();\n        return emitter;\n    }\n    //update-end---author:wangshuai---date:2026-01-05---for:【QQYUN-14479】增加一个开启记忆的按钮。下面为提示词和记忆，将记忆提示词单独拆分---\n\n    private static void closeSSE(SseEmitter emitter, EventData eventData) {\n        try {\n            // 发送完成事件\n            emitter.send(SseEmitter.event().data(eventData));\n        } catch (IOException e) {\n            log.error(\"终止会话时发生错误\", e);\n        } finally {\n            // 从缓存中移除emitter\n            AiragLocalCache.remove(AiragConsts.CACHE_TYPE_SSE, eventData.getRequestId());\n            // 关闭emitter\n            emitter.complete();\n        }\n    }\n\n\n    /**\n     * 写作列表\n     */\n    @Override\n    public List<AiArticleWriteVersionVo> listArticleWrite() {\n        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        String redisKey = StrUtil.format(AiAppConsts.ARTICLE_WRITER_KEY, loginUser.getUsername());\n        Object data = redisTemplate.opsForValue().get(redisKey);\n        if (data == null) {\n            return new ArrayList<>();\n        }\n        List<AiArticleWriteVersionVo> aiWriteViewVoList = (List<AiArticleWriteVersionVo>) data;\n        Collections.reverse(aiWriteViewVoList);\n        return aiWriteViewVoList;\n    }\n\n    /**\n     * 写作报错\n     */\n    @Override\n    public void saveArticleWrite(AiArticleWriteVersionVo aiWriteVersionVo) {\n        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        String redisKey = StrUtil.format(AiAppConsts.ARTICLE_WRITER_KEY, loginUser.getUsername());\n        //先查看redis中是否存在\n        Object data = redisTemplate.opsForValue().get(redisKey);\n        if(null != data){\n            List<AiArticleWriteVersionVo> aiWriteVersionVos = (List<AiArticleWriteVersionVo>) data;\n            aiWriteVersionVo.setVersion(\"V\"+(aiWriteVersionVos.size() + 1));\n            aiWriteVersionVos.add(aiWriteVersionVo);\n            redisTemplate.opsForValue().set(redisKey, aiWriteVersionVos);\n        }else{\n            List<AiArticleWriteVersionVo> aiWriteVersionVos = new ArrayList<>();\n            aiWriteVersionVo.setVersion(\"V1\");\n            aiWriteVersionVos.add(aiWriteVersionVo);\n            redisTemplate.opsForValue().set(redisKey, aiWriteVersionVos);\n        }\n    }\n\n    /**\n     * 写作删除\n     */\n    @Override\n    public void deleteArticleWrite(String version) {\n        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        String redisKey = StrUtil.format(AiAppConsts.ARTICLE_WRITER_KEY, loginUser.getUsername());\n        Object data = redisTemplate.opsForValue().get(redisKey);\n        if (data == null) {\n            return;\n        }\n        List<AiArticleWriteVersionVo> aiWriteVersionVos = (List<AiArticleWriteVersionVo>) data;\n        if (aiWriteVersionVos.isEmpty()) {\n            return;\n        }\n        List<AiArticleWriteVersionVo> newList = aiWriteVersionVos.stream()\n                .filter(vo -> !version.equals(vo.getVersion()))\n                .collect(Collectors.toList());\n        if (newList.isEmpty()) {\n            redisTemplate.delete(redisKey);\n        } else {\n            redisTemplate.opsForValue().set(redisKey, newList);\n        }\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/service/impl/AiragChatServiceImpl.java",
    "content": "package org.jeecg.modules.airag.app.service.impl;\n\nimport cn.hutool.core.util.StrUtil;\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport dev.langchain4j.agent.tool.ToolExecutionRequest;\nimport dev.langchain4j.agent.tool.ToolSpecification;\nimport dev.langchain4j.data.document.Document;\nimport dev.langchain4j.data.image.Image;\nimport dev.langchain4j.data.message.*;\nimport dev.langchain4j.model.output.FinishReason;\nimport dev.langchain4j.service.TokenStream;\nimport dev.langchain4j.service.tool.ToolExecutor;\nimport jakarta.servlet.http.HttpServletRequest;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.io.FilenameUtils;\nimport org.apache.tika.parser.AutoDetectParser;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.exception.JeecgBootBizTipException;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.api.ISysBaseAPI;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.util.*;\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.jeecg.config.vo.Path;\nimport org.jeecg.modules.airag.app.consts.AiAppConsts;\nimport org.jeecg.modules.airag.app.consts.Prompts;\nimport org.jeecg.modules.airag.app.entity.AiragApp;\nimport org.jeecg.modules.airag.app.mapper.AiragAppMapper;\nimport org.jeecg.modules.airag.app.service.IAiragChatService;\nimport org.jeecg.modules.airag.app.service.IAiragVariableService;\nimport org.jeecg.modules.airag.app.vo.AiWriteGenerateVo;\nimport org.jeecg.modules.airag.app.vo.AppDebugParams;\nimport org.jeecg.modules.airag.app.vo.ChatConversation;\nimport org.jeecg.modules.airag.app.vo.ChatSendParams;\nimport org.jeecg.modules.airag.common.consts.AiragConsts;\nimport org.jeecg.modules.airag.common.handler.AIChatParams;\nimport org.jeecg.modules.airag.common.handler.IAIChatHandler;\nimport org.jeecg.modules.airag.common.utils.AiragLocalCache;\nimport org.jeecg.modules.airag.common.vo.LlmPlugin;\nimport org.jeecg.modules.airag.common.vo.MessageHistory;\nimport org.jeecg.modules.airag.common.vo.event.EventData;\nimport org.jeecg.modules.airag.common.vo.event.EventFlowData;\nimport org.jeecg.modules.airag.common.vo.event.EventMessageData;\nimport org.jeecg.modules.airag.flow.consts.FlowConsts;\nimport org.jeecg.modules.airag.flow.entity.AiragFlow;\nimport org.jeecg.modules.airag.flow.service.IAiragFlowService;\nimport org.jeecg.modules.airag.flow.vo.api.FlowRunParams;\nimport org.jeecg.modules.airag.llm.consts.LLMConsts;\nimport org.jeecg.modules.airag.llm.document.TikaDocumentParser;\nimport org.jeecg.modules.airag.llm.entity.AiragModel;\nimport org.jeecg.modules.airag.llm.handler.AIChatHandler;\nimport org.jeecg.modules.airag.llm.handler.JeecgToolsProvider;\nimport org.jeecg.modules.airag.llm.mapper.AiragModelMapper;\nimport org.jeecg.modules.airag.llm.service.IAiragFlowPluginService;\nimport org.jeecg.modules.airag.llm.service.IAiragKnowledgeService;\nimport org.jetbrains.annotations.NotNull;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.redis.core.BoundValueOperations;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.CollectionUtils;\nimport org.springframework.web.servlet.mvc.method.annotation.SseEmitter;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.*;\nimport java.util.concurrent.*;\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport java.util.stream.Collectors;\n\n\n/**\n * AI助手聊天Service\n *\n * @author chenrui\n * @date 2024/1/26 20:07\n */\n@Service\n@Slf4j\npublic class AiragChatServiceImpl implements IAiragChatService {\n\n    @Autowired\n    IAIChatHandler aiChatHandler;\n\n    @Autowired\n    RedisTemplate redisTemplate;\n\n    @Autowired\n    AiragAppMapper airagAppMapper;\n\n    @Autowired\n    IAiragFlowService airagFlowService;\n\n    @Autowired\n    private ISysBaseAPI sysBaseApi;\n    @Autowired\n    private RedisUtil redisUtil;\n\n    @Autowired\n    JeecgToolsProvider jeecgToolsProvider;\n\n    @Autowired\n    AiragModelMapper airagModelMapper;\n    \n    @Autowired\n    IAiragFlowPluginService airagFlowPluginService;\n    \n    @Autowired\n    IAiragKnowledgeService airagKnowledgeService;\n    \n    @Autowired\n    IAiragVariableService airagVariableService;\n    \n    @Autowired\n    JeecgBaseConfig jeecgBaseConfig;\n\n    /**\n     * 重新接收消息\n     */\n    private static final ExecutorService SSE_THREAD_POOL = Executors.newFixedThreadPool(10); // 最大10个线程\n\n    @Override\n    public SseEmitter send(ChatSendParams chatSendParams) {\n        AssertUtils.assertNotEmpty(\"参数异常\", chatSendParams);\n        String userMessage = chatSendParams.getContent();\n        AssertUtils.assertNotEmpty(\"至少发送一条消息\", userMessage);\n\n        // 获取会话信息\n        String conversationId = chatSendParams.getConversationId();\n        String topicId = oConvertUtils.getString(chatSendParams.getTopicId(), UUIDGenerator.generate());\n        // 获取app信息\n        AiragApp app = null;\n        if (oConvertUtils.isNotEmpty(chatSendParams.getAppId())) {\n            app = airagAppMapper.getByIdIgnoreTenant(chatSendParams.getAppId());\n        }\n        //update-begin---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        ChatConversation chatConversation = getOrCreateChatConversation(app, conversationId, chatSendParams.getSessionType());\n        //update-end---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        // 更新标题\n        if (oConvertUtils.isEmpty(chatConversation.getTitle())) {\n            int maxLength = AiAppConsts.CONVERSATION_MAX_TITLE_LENGTH;\n            chatConversation.setTitle(userMessage.length() > maxLength ? userMessage.substring(0, maxLength) : userMessage);\n        }\n        //update-begin---author:chenrui ---date:20251106  for：[issues/8545]新建AI应用的时候只能选择没有自定义参数的AI流程------------\n        // 保存工作流入参配置（如果有）\n        if (oConvertUtils.isObjectNotEmpty(chatSendParams.getFlowInputs())) {\n            chatConversation.setFlowInputs(chatSendParams.getFlowInputs());\n        }\n        //update-end---author:chenrui ---date:20251106  for：[issues/8545]新建AI应用的时候只能选择没有自定义参数的AI流程------------\n        //是否保存会话\n        if(null != chatSendParams.getIzSaveSession()){\n            chatConversation.setIzSaveSession(chatSendParams.getIzSaveSession());\n        }\n        // 保存变量\n        saveVariables(app);\n        // 发送消息\n        return doChat(chatConversation, topicId, chatSendParams);\n    }\n\n    @Override\n    public SseEmitter debugApp(AppDebugParams appDebugParams) {\n        AssertUtils.assertNotEmpty(\"参数异常\", appDebugParams);\n        String userMessage = appDebugParams.getContent();\n        AssertUtils.assertNotEmpty(\"至少发送一条消息\", userMessage);\n        AssertUtils.assertNotEmpty(\"应用信息不能为空\", appDebugParams.getApp());\n        // 获取会话信息\n        String topicId = oConvertUtils.getString(appDebugParams.getTopicId(), UUIDGenerator.generate());\n        AiragApp app = appDebugParams.getApp();\n        app.setId(\"__DEBUG_APP\");\n        //update-begin---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        ChatConversation chatConversation = getOrCreateChatConversation(app, topicId, \"\");\n        //update-end---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        //update-begin---author:chenrui ---date:20251106  for：[issues/8545]新建AI应用的时候只能选择没有自定义参数的AI流程------------\n        // 保存工作流入参配置（如果有）\n        if (oConvertUtils.isObjectNotEmpty(appDebugParams.getFlowInputs())) {\n            chatConversation.setFlowInputs(appDebugParams.getFlowInputs());\n        }\n        //update-end---author:chenrui ---date:20251106  for：[issues/8545]新建AI应用的时候只能选择没有自定义参数的AI流程------------\n        // 发送消息\n        SseEmitter emitter = doChat(chatConversation, topicId, appDebugParams);\n        //保存会话\n        //update-begin---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        saveChatConversation(chatConversation, true, null, \"\");\n        //update-end---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        return emitter;\n    }\n\n\n    @Override\n    public Result<?> stop(String requestId) {\n        AssertUtils.assertNotEmpty(\"requestId不能为空\", requestId);\n        // 从缓存中获取对应的SseEmitter\n        SseEmitter emitter = AiragLocalCache.get(AiragConsts.CACHE_TYPE_SSE, requestId);\n        if (emitter != null) {\n            closeSSE(emitter, new EventData(requestId, null, EventData.EVENT_MESSAGE_END));\n            return Result.ok(\"会话已成功终止\");\n        } else {\n            return Result.error(\"未找到对应的会话\");\n        }\n    }\n\n    /**\n     * 关闭sse\n     *\n     * @param emitter\n     * @param eventData\n     * @throws IOException\n     * @author chenrui\n     * @date 2025/2/27 15:56\n     */\n    private static void closeSSE(SseEmitter emitter, EventData eventData) {\n        AssertUtils.assertNotEmpty(\"请求id不能为空\", eventData);\n        if (null == emitter) {\n            log.warn(\"会话已关闭\");\n            return;\n        }\n        try {\n            // 发送完成事件\n            emitter.send(SseEmitter.event().data(eventData));\n        } catch (Exception e) {\n            if(!e.getMessage().contains(\"ResponseBodyEmitter has already completed\")){\n                log.error(\"终止会话时发生错误\", e);\n            }\n            try {\n                // 防止异常冒泡\n                emitter.completeWithError(e);\n            } catch (Exception ignore) {}\n        } finally {\n            // 从缓存中移除emitter\n            AiragLocalCache.remove(AiragConsts.CACHE_TYPE_SSE, eventData.getRequestId());\n            // 关闭emitter\n            try {\n                emitter.complete();\n            } catch (Exception ignore) {}\n        }\n    }\n\n    @Override\n    public Result<?> getConversations(String appId) {\n        if (oConvertUtils.isEmpty(appId)) {\n            appId = AiAppConsts.DEFAULT_APP_ID;\n        }\n        String key = getConversationDirCacheKey(null);\n        key = key + \":*\";\n        List<String> keys = redisUtil.scan(key);\n        // 如果键集合为空，返回空列表\n        if (keys.isEmpty()) {\n            return Result.ok(Collections.emptyList());\n        }\n\n        // 遍历键集合，获取对应的 ChatConversation 对象\n        List<ChatConversation> conversations = new ArrayList<>();\n        for (Object k : keys) {\n            ChatConversation conversation = (ChatConversation) redisTemplate.boundValueOps(k).get();\n\n            if (conversation != null) {\n                AiragApp app = conversation.getApp();\n                if (null == app) {\n                    continue;\n                }\n                String conversationAppId = app.getId();\n                if (appId.equals(conversationAppId)) {\n                    conversation.setApp(null);\n                    conversation.setMessages(null);\n                    conversations.add(conversation);\n                }\n            }\n        }\n\n        // 对会话列表按创建时间降序排序\n        conversations.sort((o1, o2) -> {\n            Date date1 = o1.getCreateTime();\n            Date date2 = o2.getCreateTime();\n            if (date1 == null && date2 == null) {\n                return 0;\n            }\n            if (date1 == null) {\n                return 1;\n            }\n            if (date2 == null) {\n                return -1;\n            }\n            return date2.compareTo(date1);\n        });\n\n        // 返回结果\n        return Result.ok(conversations);\n    }\n\n    @Override\n    public Result<?> getMessages(String conversationId, String sessionType) {\n        AssertUtils.assertNotEmpty(\"请先选择会话\", conversationId);\n        //update-begin---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        String key = getConversationCacheKey(conversationId, null, sessionType);\n        //update-end---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        if (oConvertUtils.isEmpty(key)) {\n            return Result.ok(Collections.emptyList());\n        }\n        ChatConversation chatConversation = (ChatConversation) redisTemplate.boundValueOps(key).get();\n        if (oConvertUtils.isObjectEmpty(chatConversation)) {\n            return Result.ok(Collections.emptyList());\n        }\n        //update-begin---author:chenrui ---date:20251106  for：[issues/8545]新建AI应用的时候只能选择没有自定义参数的AI流程------------\n        // 返回消息列表和会话设置信息\n        Map<String, Object> result = new HashMap<>();\n        // 过滤掉工具调用相关的消息（前端不需要展示）\n        List<MessageHistory> messages = chatConversation.getMessages();\n        if (oConvertUtils.isObjectNotEmpty(messages)) {\n            messages = messages.stream()\n                    .filter(msg -> !AiragConsts.MESSAGE_ROLE_TOOL.equals(msg.getRole()))\n                    .map(msg -> {\n                        // 克隆消息对象，移除工具执行请求信息（前端不需要）\n                        MessageHistory displayMsg = MessageHistory.builder()\n                                .conversationId(msg.getConversationId())\n                                .topicId(msg.getTopicId())\n                                .role(msg.getRole())\n                                .content(msg.getContent())\n                                .images(msg.getImages())\n                                .files(msg.getFiles())\n                                .datetime(msg.getDatetime())\n                                .build();\n                        // 不设置toolExecutionRequests和toolExecutionResult\n                        return displayMsg;\n                    })\n                    .collect(Collectors.toList());\n        }\n        result.put(\"messages\", messages);\n        result.put(\"flowInputs\", chatConversation.getFlowInputs());\n        //update-begin---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        if(oConvertUtils.isNotEmpty(sessionType)){\n            result.put(\"appData\", chatConversation.getApp());\n        }\n        //update-end---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        return Result.ok(result);\n        //update-end---author:chenrui ---date:20251106  for：[issues/8545]新建AI应用的时候只能选择没有自定义参数的AI流程------------\n    }\n\n    @Override\n    public Result<?> clearMessage(String conversationId, String sessionType) {\n        AssertUtils.assertNotEmpty(\"请先选择会话\", conversationId);\n        //update-begin---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        String key = getConversationCacheKey(conversationId, null,sessionType);\n        //update-end---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        if (oConvertUtils.isEmpty(key)) {\n            return Result.ok(Collections.emptyList());\n        }\n        ChatConversation chatConversation = (ChatConversation) redisTemplate.boundValueOps(key).get();\n        if (null != chatConversation && oConvertUtils.isObjectNotEmpty(chatConversation.getMessages())) {\n            chatConversation.getMessages().clear();\n            //update-begin---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n            saveChatConversation(chatConversation,sessionType);\n            //update-end---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        }\n        return Result.ok();\n    }\n\n    @Override\n    public Result<?> initChat(String appId) {\n        AiragApp app = airagAppMapper.getByIdIgnoreTenant(appId);\n        //update-begin---author:chenrui ---date:20251106  for：[issues/8545]新建AI应用的时候只能选择没有自定义参数的AI流程------------\n        if(AiAppConsts.APP_TYPE_CHAT_FLOW.equalsIgnoreCase(app.getType())) {\n            AiragFlow flow = airagFlowService.getById(app.getFlowId());\n            String flowMetadata = flow.getMetadata();\n            if(oConvertUtils.isNotEmpty(flowMetadata)) {\n                JSONObject flowMetadataJson = JSONObject.parseObject(flowMetadata);\n                JSONArray flowMetadataInputs = flowMetadataJson.getJSONArray(FlowConsts.FLOW_METADATA_INPUTS);\n                if(oConvertUtils.isObjectNotEmpty(flowMetadataInputs)) {\n                    String appMetadataStr = app.getMetadata();\n                    JSONObject appMetadataJson;\n                    if(oConvertUtils.isEmpty(appMetadataStr)){\n                        appMetadataJson = new JSONObject();\n                    } else {\n                        appMetadataJson = JSONObject.parseObject(appMetadataStr);\n                    }\n                    appMetadataJson.put(AiAppConsts.APP_METADATA_FLOW_INPUTS, flowMetadataInputs);\n                    app.setMetadata(appMetadataJson.toJSONString());\n                }\n            }\n        }\n        //update-end---author:chenrui ---date:20251106  for：[issues/8545]新建AI应用的时候只能选择没有自定义参数的AI流程------------\n        \n        //update-begin---author:chenrui ---date:202501XX  for：在initChat接口中返回模型供应商信息，避免前端多次调用模型查询接口------------\n        // 如果应用有模型ID，查询模型信息并将供应商、类型、名称等信息添加到metadata中\n        if (oConvertUtils.isNotEmpty(app.getModelId())) {\n            AiragModel model = airagModelMapper.getByIdIgnoreTenant(app.getModelId());\n            if (model != null) {\n                String appMetadataStr = app.getMetadata();\n                JSONObject appMetadataJson;\n                if(oConvertUtils.isEmpty(appMetadataStr)){\n                    appMetadataJson = new JSONObject();\n                } else {\n                    appMetadataJson = JSONObject.parseObject(appMetadataStr);\n                }\n                // 将模型信息添加到metadata中\n                JSONObject modelInfo = new JSONObject();\n                modelInfo.put(\"provider\", model.getProvider());\n                modelInfo.put(\"modelType\", model.getModelType());\n                modelInfo.put(\"modelName\", model.getModelName());\n                appMetadataJson.put(\"modelInfo\", modelInfo);\n                app.setMetadata(appMetadataJson.toJSONString());\n            }\n        }\n        //update-end---author:chenrui ---date:202501XX  for：在initChat接口中返回模型供应商信息，避免前端多次调用模型查询接口------------\n        \n        return Result.ok(app);\n    }\n\n    @Override\n    public SseEmitter receiveByRequestId(String requestId) {\n        AssertUtils.assertNotEmpty(\"请选择会话\",requestId);\n        if(AiragLocalCache.get(AiragConsts.CACHE_TYPE_SSE, requestId) == null){\n            return null;\n        }\n        List<EventData> datas = AiragLocalCache.get(AiragConsts.CACHE_TYPE_SSE_HISTORY_MSG, requestId);\n        if(null == datas){\n            return null;\n        }\n        SseEmitter emitter = createSSE(requestId);\n        // 120秒\n        final long timeoutMillis = 120_000L;\n        // 使用线程池提交任务\n        SSE_THREAD_POOL.submit(() -> {\n            int lastIndex = 0;\n            long lastActiveTime = System.currentTimeMillis();\n            try {\n                while (true) {\n                    if(lastIndex < datas.size()) {\n                        try {\n                            EventData eventData = datas.get(lastIndex++);\n                            String eventStr = JSONObject.toJSONString(eventData);\n                            log.debug(\"[AI应用]继续接收-接收LLM返回消息:{}\", eventStr);\n                            emitter.send(SseEmitter.event().data(eventStr));\n                            // 有新消息，重置计时\n                            lastActiveTime = System.currentTimeMillis();\n                        } catch (IOException e) {\n                            log.error(\"[AI应用]继续接收-发送消息失败\");\n                        }\n                    } else {\n                        // 没有新消息了\n                        if (AiragLocalCache.get(AiragConsts.CACHE_TYPE_SSE, requestId) == null) {\n                            // 主线程sse已经被移除,退出线程.\n                            log.info(\"[AI应用]继续接收-SSE消息推送完成: {}\", requestId);\n                            break;\n                        } else if (System.currentTimeMillis() - lastActiveTime > timeoutMillis) {\n                            // 主线程未结束,等待超时,\n                            log.warn(\"[AI应用]继续接收-等待消息更新超时，释放线程: {}\", requestId);\n                            break;\n                        } else {\n                            // 主线程未结束, 未超时, 休眠一会再查\n                            log.warn(\"[AI应用]继续接收-等待消息更新: {}\", requestId);\n                            Thread.sleep(500);\n                        }\n                    }\n                }\n            } catch (Exception e) {\n                log.error(\"SSE消息推送异常\", e);\n            } finally {\n                try {\n                    // 发送完成事件\n                    emitter.send(SseEmitter.event().data(new EventData(requestId, null, EventData.EVENT_MESSAGE_END)));\n                } catch (Exception e) {\n                    log.error(\"终止会话时发生错误\", e);\n                    try {\n                        // 防止异常冒泡\n                        emitter.completeWithError(e);\n                    } catch (Exception ignore) {}\n                } finally {\n                    // 关闭emitter\n                    try {\n                        emitter.complete();\n                    } catch (Exception ignore) {}\n                }\n            }\n        });\n        return emitter;\n    }\n\n    /**\n     * 创建SSE\n     * @param requestId\n     * @return\n     * @author chenrui\n     * @date 2025/8/12 15:30\n     */\n    private static SseEmitter createSSE(String requestId) {\n        SseEmitter emitter = new SseEmitter(-0L);\n        emitter.onError(throwable -> {\n            log.warn(\"SEE向客户端发送消息失败: {}\", throwable.getMessage());\n            AiragLocalCache.remove(AiragConsts.CACHE_TYPE_SSE, requestId);\n            AiragLocalCache.remove(AiragConsts.CACHE_TYPE_SSE_SEND_TIME, requestId);\n            try {\n                emitter.complete();\n            } catch (Exception ignore) {}\n        });\n        return emitter;\n    }\n\n    @Override\n    public Result<?> deleteConversation(String conversationId, String sessionType) {\n        AssertUtils.assertNotEmpty(\"请选择要删除的会话\", conversationId);\n        //update-begin---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        String key = getConversationCacheKey(conversationId, null, sessionType);\n        //update-end---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        if (oConvertUtils.isNotEmpty(key)) {\n            Boolean delete = redisTemplate.delete(key);\n            if (delete) {\n                return Result.ok();\n            } else {\n                return Result.error(\"删除会话失败\");\n            }\n        }\n        log.warn(\"[ai-chat]删除会话:未找到会话:{}\", conversationId);\n        return Result.ok();\n    }\n\n    @Override\n    public Result<?> updateConversationTitle(ChatConversation updateTitleParams) {\n        AssertUtils.assertNotEmpty(\"请先选择会话\", updateTitleParams);\n        AssertUtils.assertNotEmpty(\"请先选择会话\", updateTitleParams.getId());\n        AssertUtils.assertNotEmpty(\"请输入会话标题\", updateTitleParams.getTitle());\n        String key = getConversationCacheKey(updateTitleParams.getId(), null, updateTitleParams.getSessionType());\n        if (oConvertUtils.isEmpty(key)) {\n            log.warn(\"[ai-chat]删除会话:未找到会话:{}\", updateTitleParams.getId());\n            return Result.ok();\n        }\n        ChatConversation chatConversation = (ChatConversation) redisTemplate.boundValueOps(key).get();\n        //update-begin---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        if (chatConversation != null) {\n            chatConversation.setTitle(updateTitleParams.getTitle());\n        }\n        saveChatConversation(chatConversation,updateTitleParams.getSessionType());\n        //update-end---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        return Result.ok();\n    }\n\n    /**\n     * 获取会话缓存key\n     *\n     * @param conversationId\n     * @param httpRequest\n     * @param sessionType 会话类型\n     * @return\n     * @author chenrui\n     * @date 2025/2/25 19:27\n     */\n    private String getConversationCacheKey(String conversationId, HttpServletRequest httpRequest, String sessionType) {\n        if (oConvertUtils.isEmpty(conversationId)) {\n            return null;\n        }\n        String key = getConversationDirCacheKey(httpRequest);\n        //update-begin---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        if(oConvertUtils.isNotEmpty(sessionType)){\n            key = key + \":\" + sessionType;\n        }\n        //update-end---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        key = key + \":\" + conversationId;\n        return key;\n    }\n\n    /**\n     * 获取当前用户会话的缓存目录\n     *\n     * @param httpRequest\n     * @return\n     * @author chenrui\n     * @date 2025/2/26 15:09\n     */\n    private String getConversationDirCacheKey(HttpServletRequest httpRequest) {\n        String username = getUsername(httpRequest);\n        // 如果用户不存在,获取当前请求的sessionid\n        if (oConvertUtils.isEmpty(username)) {\n            try {\n                if (null == httpRequest) {\n                    httpRequest = SpringContextUtils.getHttpServletRequest();\n                }\n                username = httpRequest.getSession().getId();\n            } catch (Exception e) {\n                log.error(\"获取当前请求的sessionid失败\", e);\n            }\n        }\n        AssertUtils.assertNotEmpty(\"请先登录\", username);\n        return \"airag:chat:\" + username;\n    }\n\n    /**\n     * 获取会话\n     *\n     * @param app\n     * @param conversationId\n     * @param sessionType\n     * @return\n     * @author chenrui\n     * @date 2025/2/25 19:19\n     */\n    @NotNull\n    private ChatConversation getOrCreateChatConversation(AiragApp app, String conversationId, String sessionType) {\n        if (oConvertUtils.isObjectEmpty(app)) {\n            app = new AiragApp();\n            app.setId(AiAppConsts.DEFAULT_APP_ID);\n        }\n        ChatConversation chatConversation = null;\n        //update-begin---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        String key = getConversationCacheKey(conversationId, null,sessionType);\n        //update-end---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        if (oConvertUtils.isNotEmpty(key)) {\n            chatConversation = (ChatConversation) redisTemplate.boundValueOps(key).get();\n        }\n        if (null == chatConversation) {\n            chatConversation = createConversation(conversationId);\n        }\n        chatConversation.setApp(app);\n        return chatConversation;\n    }\n\n    /**\n     * 创建新的会话\n     *\n     * @param conversationId\n     * @return\n     * @author chenrui\n     * @date 2025/2/26 15:53\n     */\n    @NotNull\n    private ChatConversation createConversation(String conversationId) {\n        // 新会话\n        conversationId = oConvertUtils.getString(conversationId, UUIDGenerator.generate());\n        ChatConversation chatConversation = new ChatConversation();\n        chatConversation.setId(conversationId);\n        chatConversation.setCreateTime(new Date());\n        return chatConversation;\n    }\n\n    /**\n     * 保存会话\n     *\n     * @param chatConversation\n     * @author chenrui\n     * @date 2025/2/25 19:27\n     */\n    private void saveChatConversation(ChatConversation chatConversation, String sessionType) {\n        saveChatConversation(chatConversation, false, null, sessionType);\n    }\n\n    /**\n     * 保存会话\n     *\n     * @param chatConversation\n     * @param temp             是否临时会话\n     * @author chenrui\n     * @date 2025/2/25 19:27\n     */\n    private void saveChatConversation(ChatConversation chatConversation, boolean temp, HttpServletRequest httpRequest, String sessionType) {\n        if (null == chatConversation) {\n            return;\n        }\n        \n        //如果是不保存会话直接返回\n        if(null != chatConversation.getIzSaveSession() && !chatConversation.getIzSaveSession()){\n            return;\n        }\n\n        //update-begin---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        String key = getConversationCacheKey(chatConversation.getId(), httpRequest, sessionType);\n        //update-end---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        if (oConvertUtils.isEmpty(key)) {\n            return;\n        }\n        BoundValueOperations chatRedisCacheOp = redisTemplate.boundValueOps(key);\n        chatRedisCacheOp.set(chatConversation);\n        if (temp) {\n            chatRedisCacheOp.expire(3, TimeUnit.HOURS);\n        }\n    }\n\n    /**\n     * 构造消息\n     *\n     * @param conversation\n     * @param topicId\n     * @return\n     * @author chenrui\n     * @date 2025/2/25 15:26\n     */\n    private List<ChatMessage> collateMessage(ChatConversation conversation, String topicId) {\n        List<MessageHistory> messagesHistory = conversation.getMessages();\n        if (oConvertUtils.isObjectEmpty(messagesHistory)) {\n            return new LinkedList<>();\n        }\n        LinkedList<ChatMessage> chatMessages = new LinkedList<>();\n        for (int i = messagesHistory.size() - 1; i >= 0; i--) {\n            MessageHistory history = messagesHistory.get(i);\n            if (topicId.equals(history.getTopicId())) {\n                ChatMessage chatMessage = null;\n                switch (history.getRole()) {\n                    case AiragConsts.MESSAGE_ROLE_USER:\n                        List<Content> contents = new ArrayList<>();\n                        List<MessageHistory.ImageHistory> images = history.getImages();\n                        if (oConvertUtils.isObjectNotEmpty(images) && !images.isEmpty()) {\n                            contents.addAll(images.stream().map(imageHistory -> {\n                                if (oConvertUtils.isNotEmpty(imageHistory.getUrl())) {\n                                    return ImageContent.from(imageHistory.getUrl());\n                                } else {\n                                    return ImageContent.from(imageHistory.getBase64Data(), imageHistory.getMimeType());\n                                }\n                            }).collect(Collectors.toList()));\n                        }\n                        contents.add(TextContent.from(history.getContent()));\n                        chatMessage = UserMessage.from(contents);\n                        break;\n                    case AiragConsts.MESSAGE_ROLE_AI:\n                        // 重建AI消息，包括工具执行请求\n                        if (oConvertUtils.isObjectNotEmpty(history.getToolExecutionRequests())) {\n                            // 有工具执行请求，重建带工具调用的AiMessage\n                            List<ToolExecutionRequest> toolRequests = history.getToolExecutionRequests().stream()\n                                    .map(toolReq -> ToolExecutionRequest.builder()\n                                            .id(toolReq.getId())\n                                            .name(toolReq.getName())\n                                            .arguments(toolReq.getArguments())\n                                            .build())\n                                    .collect(Collectors.toList());\n                            chatMessage = AiMessage.from(history.getContent(), toolRequests);\n                        } else {\n                            chatMessage = new AiMessage(history.getContent());\n                        }\n                        break;\n                    case AiragConsts.MESSAGE_ROLE_TOOL:\n                        // 重建工具执行结果消息\n                        // 需要重建ToolExecutionRequest，第一个参数是request对象，第二个参数是result字符串\n                        ToolExecutionRequest recreatedRequest = ToolExecutionRequest.builder()\n                                .id(history.getContent()) // content字段存储的是工具执行的id\n                                .name(\"unknown\") // 工具名称在重建时不重要，因为主要用于AI理解结果\n                                .arguments(\"{}\")\n                                .build();\n                        chatMessage = ToolExecutionResultMessage.from(recreatedRequest, history.getToolExecutionResult());\n                        break;\n                }\n                if (null == chatMessage) {\n                    continue;\n                }\n                chatMessages.addFirst(chatMessage);\n            }\n        }\n        return chatMessages;\n    }\n\n\n    /**\n     * 追加消息\n     *\n     * @param messages\n     * @param message\n     * @param chatConversation\n     * @param topicId\n     * @return\n     * @author chenrui\n     * @date 2025/2/25 19:05\n     */\n    private void appendMessage(List<ChatMessage> messages, ChatMessage message, ChatConversation chatConversation, String topicId) {\n        appendMessage(messages, message, chatConversation, topicId, null, null);\n    }\n\n    private void appendMessage(List<ChatMessage> messages, ChatMessage message, ChatConversation chatConversation, String topicId, List<String> files, String saveContent) {\n\n        if (message.type().equals(ChatMessageType.SYSTEM)) {\n            // 系统消息,放到消息列表最前面,并且不记录历史\n            messages.add(0, message);\n            return;\n        } else {\n            messages.add(message);\n        }\n        List<MessageHistory> histories = chatConversation.getMessages();\n        if (oConvertUtils.isObjectEmpty(histories)) {\n            histories = new ArrayList<>();\n        }\n        // 消息记录\n        MessageHistory historyMessage = MessageHistory.builder().conversationId(chatConversation.getId()).topicId(topicId).datetime(DateUtils.now()).build();\n        if (message.type().equals(ChatMessageType.USER)) {\n            historyMessage.setRole(AiragConsts.MESSAGE_ROLE_USER);\n            StringBuilder textContent = new StringBuilder();\n            List<MessageHistory.ImageHistory> images = new ArrayList<>();\n            List<Content> contents = ((UserMessage) message).contents();\n            contents.forEach(content -> {\n                if (content.type().equals(ContentType.IMAGE)) {\n                    ImageContent imageContent = (ImageContent) content;\n                    Image image = imageContent.image();\n                    MessageHistory.ImageHistory imageMessage = MessageHistory.ImageHistory.from(image.url(), image.base64Data(), image.mimeType());\n                    images.add(imageMessage);\n                } else if (content.type().equals(ContentType.TEXT)) {\n                    textContent.append(((TextContent) content).text()).append(\"\\n\");\n                }\n            });\n            //update-begin---author:wangshuai---date:2026-01-12---for:【QQYUN-14261】【AI】AI助手，支持多模态能力- 文档---\n            if (oConvertUtils.isNotEmpty(saveContent)) {\n                historyMessage.setContent(saveContent);\n            } else {\n                historyMessage.setContent(textContent.toString());\n            }\n            historyMessage.setImages(images);\n            // 保存文件信息\n            if (oConvertUtils.isNotEmpty(files)) {\n                List<MessageHistory.FileHistory> fileHistories = new ArrayList<>();\n                for (String file : files) {\n                    fileHistories.add(new MessageHistory.FileHistory(file));\n                }\n                historyMessage.setFiles(fileHistories);\n            }\n            //update-end---author:wangshuai---date:2026-01-12---for:【QQYUN-14261】【AI】AI助手，支持多模态能力- 文档---\n        } else if (message.type().equals(ChatMessageType.AI)) {\n            historyMessage.setRole(AiragConsts.MESSAGE_ROLE_AI);\n            AiMessage aiMessage = (AiMessage) message;\n            historyMessage.setContent(aiMessage.text());\n            // 处理工具执行请求\n            if (oConvertUtils.isObjectNotEmpty(aiMessage.toolExecutionRequests())) {\n                List<MessageHistory.ToolExecutionRequestHistory> toolRequests = new ArrayList<>();\n                for (ToolExecutionRequest request : aiMessage.toolExecutionRequests()) {\n                    toolRequests.add(MessageHistory.ToolExecutionRequestHistory.from(\n                            request.id(),\n                            request.name(),\n                            request.arguments()\n                    ));\n                }\n                historyMessage.setToolExecutionRequests(toolRequests);\n            }\n        } else if (message.type().equals(ChatMessageType.TOOL_EXECUTION_RESULT)) {\n            // 工具执行结果消息\n            historyMessage.setRole(AiragConsts.MESSAGE_ROLE_TOOL);\n            ToolExecutionResultMessage toolMessage = (ToolExecutionResultMessage) message;\n            historyMessage.setContent(toolMessage.id());\n            historyMessage.setToolExecutionResult(toolMessage.text());\n        }\n        histories.add(historyMessage);\n        chatConversation.setMessages(histories);\n    }\n\n    /**\n     * 发送聊天消息\n     *\n     * @param chatConversation\n     * @param topicId\n     * @param sendParams\n     * @return\n     * @author chenrui\n     * @date 2025/2/28 11:04\n     */\n    @NotNull\n    private SseEmitter doChat(ChatConversation chatConversation, String topicId, ChatSendParams sendParams) {\n        // 从历史消息中组装本次的消息列表\n        List<ChatMessage> messages = collateMessage(chatConversation, topicId);\n\n        AiragApp aiApp = chatConversation.getApp();\n        // 每次会话都生成一个新的,用来缓存emitter\n        String requestId = UUIDGenerator.generate();\n        SseEmitter emitter = createSSE(requestId);\n        // 缓存emitter\n        AiragLocalCache.put(AiragConsts.CACHE_TYPE_SSE, requestId, emitter);\n        // 缓存开始发送时间\n        log.info(\"[AI-CHAT]开始发送消息,requestId:{}\", requestId);\n        AiragLocalCache.put(AiragConsts.CACHE_TYPE_SSE_SEND_TIME, requestId, System.currentTimeMillis());\n        // 初始化历史消息缓存\n        AiragLocalCache.put(AiragConsts.CACHE_TYPE_SSE_HISTORY_MSG, requestId, new CopyOnWriteArrayList<>());\n        try {\n            // 组装用户消息\n            String content = sendParams.getContent();\n            //将文件内容给提示词\n            if(!CollectionUtils.isEmpty(sendParams.getFiles())){\n                content = buildContentWithFiles(content, sendParams.getFiles());\n            }\n            UserMessage userMessage = aiChatHandler.buildUserMessage(content, sendParams.getImages());\n            // 追加消息\n            //update-begin---author:wangshuai---date:2026-01-09---for:【QQYUN-14261】【AI】AI助手，支持多模态能力- 文档---\n            appendMessage(messages, userMessage, chatConversation, topicId, sendParams.getFiles(), sendParams.getContent());\n            //update-end---author:wangshuai---date:2026-01-09---for:【QQYUN-14261】【AI】AI助手，支持多模态能力- 文档---\n            // 绘画AI逻辑：当开启生成绘画时调用\n            if (oConvertUtils.isObjectNotEmpty(sendParams.getEnableDraw()) && sendParams.getEnableDraw()) {\n                return genImageChat(emitter,sendParams,requestId,messages,chatConversation,topicId);\n            }\n            /* 这里应该是有几种情况:\n             * 1. 非ai应用:获取默认模型->开始聊天\n             * 2. AI应用-聊天助手(ChatAssistant):从应用信息组装模型和提示词->开始聊天\n             * 3. AI应用-聊天流程(ChatFlow):从应用信息获取模型,流程,组装入参->调用工作流\n             */\n            if (null != aiApp && !AiAppConsts.DEFAULT_APP_ID.equals(aiApp.getId())) {\n                // ai应用:查询应用信息(ChatAssistant,chatflow),模型信息,组装模型-提示词,知识库等\n                if (AiAppConsts.APP_TYPE_CHAT_FLOW.equals(aiApp.getType())) {\n                    // ai应用:聊天流程(ChatFlow)\n                    sendWithFlow(requestId, aiApp.getFlowId(), chatConversation, topicId, messages, sendParams);\n                } else {\n                    // AI应用-聊天助手(ChatAssistant):从应用信息组装模型和提示词\n                    sendWithAppChat(requestId, messages, chatConversation, topicId, sendParams, aiApp.getFlowId(), aiApp.getMemoryId());\n                }\n            } else {\n                // 发消息\n                AIChatParams aiChatParams = new AIChatParams();\n                if (oConvertUtils.isObjectNotEmpty(sendParams.getEnableSearch())) {\n                    aiChatParams.setEnableSearch(sendParams.getEnableSearch());\n                }\n                // 设置深度思考搜索参数\n                if (oConvertUtils.isObjectNotEmpty(sendParams.getEnableThink())) {\n                    aiChatParams.setReturnThinking(sendParams.getEnableThink());\n                }\n                //update-begin---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n                sendWithDefault(requestId, chatConversation, topicId, null, messages, aiChatParams, sendParams.getSessionType());\n                //update-end---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n            }\n            // 发送就绪消息\n            EventData eventRequestId = new EventData(requestId, null, EventData.EVENT_INIT_REQUEST_ID, chatConversation.getId(), topicId);\n            eventRequestId.setData(EventMessageData.builder().message(\"\").build());\n            sendMessage2Client(emitter, eventRequestId);\n        } catch (Throwable e) {\n            log.error(e.getMessage(), e);\n            EventData eventData = new EventData(requestId, null, EventData.EVENT_FLOW_ERROR, chatConversation.getId(), topicId);\n            eventData.setData(EventFlowData.builder().success(false).message(e.getMessage()).build());\n            closeSSE(emitter, eventData);\n        }\n        return emitter;\n    }\n\n    /**\n     * 生成图片\n     * \n     * @param emitter\n     * @param sendParams\n     * @param requestId\n     * @param messages\n     * @param chatConversation\n     * @param topicId\n     * @return\n     */\n    private SseEmitter genImageChat(SseEmitter emitter, ChatSendParams sendParams, String requestId, List<ChatMessage> messages, ChatConversation chatConversation, String topicId) {\n        AIChatParams aiChatParams = new AIChatParams();\n        //update-begin---author:wangshuai---date:2026-01-26---for: 【QQYUN-14615】应用门户加入新工具：取绘画id---\n        String drawModelId = sendParams.getDrawModelId();\n        if(oConvertUtils.isEmpty(sendParams.getDrawModelId())){\n            AiragApp app = chatConversation.getApp();\n            String metadata = app.getMetadata();\n            if(oConvertUtils.isNotEmpty(metadata) && metadata.contains(\"drawModelId\")){\n                drawModelId = JSONObject.parseObject(metadata).getString(\"drawModelId\");\n            }\n        }\n        AssertUtils.assertNotEmpty(\"请选择绘画模型\", drawModelId);\n        try {\n            List<String> images = sendParams.getImages();\n            List<Map<String, Object>> imageList;\n            if(CollectionUtils.isEmpty(images)) {\n                //生成图片\n                imageList = aiChatHandler.imageGenerate(drawModelId, sendParams.getContent(), aiChatParams);\n            } else {\n                //图生图\n                imageList = aiChatHandler.imageEdit(drawModelId, sendParams.getContent(), images, aiChatParams);\n            }\n            // 记录历史消息\n            String imageMarkdown = imageList.stream().map(map -> {\n                String newUrl = this.uploadImage(map);\n                return \"![](\" + newUrl + \")\";\n            }).collect(Collectors.joining(\"\\n\"));\n            //update-end---author:wangshuai---date:2026-01-26---for:【QQYUN-14615】应用门户加入新工具：取绘画id---\n            AiMessage aiMessage = new AiMessage(imageMarkdown);\n            appendMessage(messages, aiMessage, chatConversation, topicId);\n            // 处理绘画结果并通过SSE返回给客户端\n            EventData eventData = new EventData(requestId, null, EventData.EVENT_MESSAGE, chatConversation.getId(), topicId);\n            EventMessageData messageEventData = EventMessageData.builder().message(imageMarkdown).build();\n            eventData.setData(messageEventData);\n            eventData.setRequestId(requestId);\n            sendMessage2Client(emitter, eventData);\n            // 保存会话\n            saveChatConversation(chatConversation, false, SpringContextUtils.getHttpServletRequest(), sendParams.getSessionType());\n            eventData = new EventData(requestId, null, EventData.EVENT_MESSAGE_END, chatConversation.getId(), topicId);\n            eventData.setRequestId(requestId);\n            sendMessage2Client(emitter, eventData);\n        } catch (Exception e) {\n            log.error(\"绘画AI调用异常\", e);\n            EventData errorEventData = new EventData(requestId, null, EventData.EVENT_FLOW_ERROR, chatConversation.getId(), topicId);\n            EventMessageData messageEventData = EventMessageData.builder().message(\"绘画AI调用失败：\" + e.getMessage()).build();\n            errorEventData.setData(messageEventData);\n            errorEventData.setRequestId(requestId);\n            closeSSE(emitter, errorEventData);\n        }\n        return emitter;\n    }\n\n    /**\n     * 运行流程\n     *\n     * @param requestId\n     * @param flowId\n     * @param chatConversation\n     * @param topicId\n     * @param messages\n     * @param sendParams\n     * @author chenrui\n     * @date 2025/2/27 14:55\n     */\n    private void sendWithFlow(String requestId, String flowId, ChatConversation chatConversation, String topicId, List<ChatMessage> messages, ChatSendParams sendParams) {\n        FlowRunParams flowRunParams = new FlowRunParams();\n        flowRunParams.setRequestId(requestId);\n        flowRunParams.setFlowId(flowId);\n        flowRunParams.setConversationId(chatConversation.getId());\n        flowRunParams.setTopicId(topicId);\n        // 支持流式\n        flowRunParams.setResponseMode(FlowConsts.FLOW_RESPONSE_MODE_STREAMING);\n        Map<String, Object> flowInputParams = new HashMap<>();\n        List<MessageHistory> histories = new ArrayList<>();\n        if (oConvertUtils.isObjectNotEmpty(chatConversation.getMessages())) {\n            // 创建历史消息的副本(不直接操作原来的list)\n            histories.addAll(chatConversation.getMessages());\n            // 移除最后一条历史消息(最后一条是当前发出去的这一条消息)\n            histories.remove(histories.size() - 1);\n        }\n        flowInputParams.put(FlowConsts.FLOW_INPUT_PARAM_HISTORY, histories);\n        flowInputParams.put(FlowConsts.FLOW_INPUT_PARAM_QUESTION, sendParams.getContent());\n        flowInputParams.put(FlowConsts.FLOW_INPUT_PARAM_IMAGES, sendParams.getImages());\n        \n        //update-begin---author:chenrui ---date:20251106  for：[issues/8545]新建AI应用的时候只能选择没有自定义参数的AI流程------------\n        // 添加工作流的额外参数（从conversation的flowInputs中读取）\n        if (oConvertUtils.isObjectNotEmpty(chatConversation.getFlowInputs())) {\n            flowInputParams.putAll(chatConversation.getFlowInputs());\n        }\n        //update-end---author:chenrui ---date:20251106  for：[issues/8545]新建AI应用的时候只能选择没有自定义参数的AI流程------------\n        \n        flowRunParams.setInputParams(flowInputParams);\n        HttpServletRequest httpRequest = SpringContextUtils.getHttpServletRequest();\n        flowRunParams.setHttpRequest(httpRequest);\n        // 流程结束后,记录ai返回并保存会话\n        // sse\n        SseEmitter emitter = AiragLocalCache.get(AiragConsts.CACHE_TYPE_SSE, requestId);\n        flowRunParams.setEventCallback(eventData -> {\n            if (EventData.EVENT_FLOW_FINISHED.equals(eventData.getEvent())) {\n                // 打印耗时日志\n                printChatDuration(requestId, \"流程执行完毕\");\n                // 已经执行完了,删除时间缓存\n                AiragLocalCache.remove(AiragConsts.CACHE_TYPE_SSE_SEND_TIME, requestId);\n                EventFlowData data = (EventFlowData) eventData.getData();\n                if(data.isSuccess()) {\n                    Object outputs = data.getOutputs();\n                    if (oConvertUtils.isObjectNotEmpty(outputs)) {\n                        AiMessage aiMessage;\n                        if (outputs instanceof String) {\n                            // 兼容推理模型\n                            String messageText = String.valueOf(outputs);\n                            messageText = messageText.replaceAll(\"<think>([\\\\s\\\\S]*?)</think>\", \"> $1\");\n                            aiMessage = new AiMessage(messageText);\n                        } else {\n                            aiMessage = new AiMessage(JSONObject.toJSONString(outputs));\n                        }\n                        EventData msgEventData = new EventData(requestId, null, EventData.EVENT_MESSAGE, chatConversation.getId(), topicId);\n                        EventMessageData messageEventData = EventMessageData.builder().message(aiMessage.text()).build();\n                        msgEventData.setData(messageEventData);\n                        msgEventData.setRequestId(requestId);\n                        sendMessage2Client(emitter, msgEventData);\n                        appendMessage(messages, aiMessage, chatConversation, topicId);\n                        // 保存会话\n                        //update-begin---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n                        saveChatConversation(chatConversation, false, httpRequest, sendParams.getSessionType());\n                        //update-end---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n                    }\n                }else{\n                    //update-begin---author:chenrui ---date:20250425  for：[QQYUN-12203]AI 聊天，超时或者服务器报错，给个友好提示------------\n                    // 失败\n                    String message = data.getMessage();\n                    if (message != null && message.contains(FlowConsts.FLOW_ERROR_MSG_LLM_TIMEOUT)) {\n                        message = \"当前用户较多，排队中，请稍后再试！\";\n                        EventData errEventData = new EventData(requestId, null, EventData.EVENT_MESSAGE, chatConversation.getId(), topicId);\n                        errEventData.setData(EventMessageData.builder().message(\"\\n\" + message).build());\n                        sendMessage2Client(emitter, errEventData);\n                        errEventData = new EventData(requestId, null, EventData.EVENT_MESSAGE_END, chatConversation.getId(), topicId);\n                        // 如果是超时,主动关闭SSE,防止流程切面中返回异常消息导致前端不能正常展示上面的{普通消息}.\n                        closeSSE(emitter, errEventData);\n                    }\n                    //update-end---author:chenrui ---date:20250425  for：[QQYUN-12203]AI 聊天，超时或者服务器报错，给个友好提示------------\n                }\n            }\n        });\n        // 打印流程耗时日志\n        printChatDuration(requestId, \"开始执行流程\");\n        airagFlowService.runFlow(flowRunParams);\n    }\n\n\n    /**\n     * 发送app聊天\n     *\n     * @param requestId\n     * @param messages\n     * @param chatConversation\n     * @param topicId\n     * @param sendParams\n     * @param flowId\n     * @param memoryId\n     * @return\n     * @author chenrui\n     * @date 2025/2/28 10:41\n     */\n    private void sendWithAppChat(String requestId, List<ChatMessage> messages, ChatConversation chatConversation, String topicId, ChatSendParams sendParams, String flowId, String memoryId) {\n        AiragApp aiApp = chatConversation.getApp();\n        String modelId = aiApp.getModelId();\n        AssertUtils.assertNotEmpty(\"请先选择模型\", modelId);\n        // AI应用提示词\n        String prompt = aiApp.getPrompt();\n        \n        String username = \"jeecg\";\n        try {\n            HttpServletRequest req = SpringContextUtils.getHttpServletRequest();\n            username = JwtUtil.getUserNameByToken(req);\n        } catch (Exception e) {\n            log.error(e.getMessage());\n        }\n        //将变量中的题试题替换并追加\n        if(oConvertUtils.isObjectNotEmpty(aiApp.getVariables())) {\n            prompt = airagVariableService.additionalPrompt(username, aiApp);\n        }\n        \n        if (oConvertUtils.isNotEmpty(prompt)) {\n            appendMessage(messages, new SystemMessage(prompt), chatConversation, topicId);\n        }\n\n        AIChatParams aiChatParams = new AIChatParams();\n        // AI应用自定义的模型参数\n        String metadataStr = aiApp.getMetadata();\n        if (oConvertUtils.isNotEmpty(metadataStr)) {\n            JSONObject metadata = JSONObject.parseObject(metadataStr);\n            if (oConvertUtils.isNotEmpty(metadata)) {\n                if (metadata.containsKey(\"temperature\")) {\n                    aiChatParams.setTemperature(metadata.getDouble(\"temperature\"));\n                }\n                if (metadata.containsKey(\"topP\")) {\n                    aiChatParams.setTopP(metadata.getDouble(\"topP\"));\n                }\n                if (metadata.containsKey(\"presencePenalty\")) {\n                    aiChatParams.setPresencePenalty(metadata.getDouble(\"presencePenalty\"));\n                }\n                if (metadata.containsKey(\"frequencyPenalty\")) {\n                    aiChatParams.setFrequencyPenalty(metadata.getDouble(\"frequencyPenalty\"));\n                }\n                if (metadata.containsKey(\"maxTokens\")) {\n                    aiChatParams.setMaxTokens(metadata.getInteger(\"maxTokens\"));\n                }\n                if (metadata.containsKey(FlowConsts.FLOW_NODE_OPTION_TIME_OUT)) {\n                    aiChatParams.setTimeout(oConvertUtils.getInt(metadata.getInteger(FlowConsts.FLOW_NODE_OPTION_TIME_OUT), 300));\n                }\n            }\n        }\n\n        // AI应用插件（支持MCP和自定义插件）\n        String plugins = aiApp.getPlugins();\n        if (oConvertUtils.isNotEmpty(plugins)) {\n            List<String> pluginIds = new ArrayList<>();\n            JSONArray pluginArray = JSONArray.parseArray(plugins);\n            pluginArray.stream().filter(Objects::nonNull)\n                    .map(o -> JSONObject.parseObject(o.toString(), LlmPlugin.class))\n                    .forEach(plugin -> {\n                        // 支持MCP和插件类型\n                        if (plugin.getCategory().equals(AiragConsts.PLUGIN_CATEGORY_MCP) \n                                || plugin.getCategory().equals(AiragConsts.PLUGIN_CATEGORY_PLUGIN)) {\n                            pluginIds.add(plugin.getPluginId());\n                        }\n                    });\n            if (oConvertUtils.isNotEmpty(pluginIds)) {\n                aiChatParams.setPluginIds(pluginIds);\n            }\n        }\n        \n        //流程不为空，构建插件\n        if(oConvertUtils.isNotEmpty(flowId)){\n            Map<String, Object> result = airagFlowPluginService.getFlowsToPlugin(flowId);\n            this.addPluginToParams(aiChatParams, result);\n        }\n\n        // 设置网络搜索参数（如果前端传递了）\n        if (sendParams != null && oConvertUtils.isObjectNotEmpty(sendParams.getEnableSearch())) {\n            aiChatParams.setEnableSearch(sendParams.getEnableSearch());\n        }\n\n        // 设置深度思考参数（如果前端传递了）\n        if (sendParams != null && oConvertUtils.isObjectNotEmpty(sendParams.getEnableThink())) {\n            aiChatParams.setReturnThinking(sendParams.getEnableThink());\n        }\n        \n        // 设置记忆库的插件\n        if(sendParams != null && oConvertUtils.isNotEmpty(memoryId)){\n            //开启记忆\n            if(null == aiApp.getIzOpenMemory() || AiAppConsts.IZ_OPEN_MEMORY.equals(aiApp.getIzOpenMemory())){\n                Map<String, Object> pluginMemory = airagKnowledgeService.getPluginMemory(memoryId);\n                this.addPluginToParams(aiChatParams, pluginMemory);\n            }\n        }\n        \n        //设置变量的插件\n        // 添加系统级工具：变量更新\n        if (oConvertUtils.isNotEmpty(aiApp.getId())) {\n            airagVariableService.addUpdateVariableTool(aiApp,username,aiChatParams);\n        }\n\n        // 打印流程耗时日志\n        printChatDuration(requestId, \"构造应用自定义参数完成\");\n        // 发消息\n        //update-begin---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        sendWithDefault(requestId, chatConversation, topicId, modelId, messages, aiChatParams, sendParams.getSessionType());\n        //update-end---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n    }\n\n    /**\n     * 添加插件到参数中\n     *\n     * @param aiChatParams\n     * @param result\n     */\n    private void addPluginToParams(AIChatParams aiChatParams, Map<String, Object> result) {\n        if (result == null) {\n            return;\n        }\n        Map<ToolSpecification, ToolExecutor> flowsToPlugin = (Map<ToolSpecification, ToolExecutor>) result.get(\"pluginTool\");\n        String pluginId = (String) result.get(\"pluginId\");\n        if (aiChatParams.getTools() == null) {\n            aiChatParams.setTools(new HashMap<>());\n        }\n        if (flowsToPlugin != null) {\n            aiChatParams.getTools().putAll(flowsToPlugin);\n        }\n        if (aiChatParams.getPluginIds() == null) {\n            aiChatParams.setPluginIds(new ArrayList<>());\n        }\n        if (oConvertUtils.isNotEmpty(pluginId)) {\n            aiChatParams.getPluginIds().add(pluginId);\n        }\n    }\n\n    /**\n     * 处理聊天\n     * 向大模型发送消息并接受响应\n     *\n     * @param chatConversation\n     * @param topicId\n     * @param modelId\n     * @param messages\n     * @param sessionType\n     * @return\n     * @author chenrui\n     * @date 2025/2/25 19:24\n     */\n    private void sendWithDefault(String requestId, ChatConversation chatConversation, String topicId, String modelId, List<ChatMessage> messages, AIChatParams aiChatParams, String sessionType) {\n        // 调用ai聊天\n        if (null == aiChatParams) {\n            aiChatParams = new AIChatParams();\n        }\n        // 如果是默认app,加载系统默认工具\n        if(chatConversation.getApp().getId().equals(AiAppConsts.DEFAULT_APP_ID)){\n            aiChatParams.setTools(jeecgToolsProvider.getDefaultTools());\n        }\n        if(CollectionUtils.isEmpty(aiChatParams.getKnowIds())){\n            aiChatParams.setKnowIds(chatConversation.getApp().getKnowIds());\n        } else {\n            aiChatParams.getKnowIds().addAll(chatConversation.getApp().getKnowIds());\n        }\n        aiChatParams.setMaxMsgNumber(oConvertUtils.getInt(chatConversation.getApp().getMsgNum(), 5));\n        aiChatParams.setCurrentHttpRequest(SpringContextUtils.getHttpServletRequest());\n        HttpServletRequest httpRequest = SpringContextUtils.getHttpServletRequest();\n        // for [QQYUN-9234] MCP服务连接关闭 - 保存参数引用用于在回调中关闭MCP连接\n        final AIChatParams finalAiChatParams = aiChatParams;\n        TokenStream chatStream;\n        try {\n            // 打印流程耗时日志\n            printChatDuration(requestId, \"开始向LLM发送消息\");\n            if (oConvertUtils.isNotEmpty(modelId)) {\n                chatStream = aiChatHandler.chat(modelId, messages, aiChatParams);\n            } else {\n                chatStream = aiChatHandler.chatByDefaultModel(messages, aiChatParams);\n            }\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            // for [QQYUN-9234] MCP服务连接关闭 - 异常时关闭MCP连接\n            finalAiChatParams.closeMcpConnections();\n            // sse\n            SseEmitter emitter = AiragLocalCache.get(AiragConsts.CACHE_TYPE_SSE, requestId);\n            if (null == emitter) {\n                log.warn(\"[AI应用]接收LLM返回会话已关闭{}\", requestId);\n                return;\n            }\n            String errMsg = \"调用大模型接口失败，详情请查看后台日志。\";\n            if(e instanceof JeecgBootException){\n                errMsg = e.getMessage();\n            }\n            EventData eventData = new EventData(requestId, null, EventData.EVENT_FLOW_ERROR, chatConversation.getId(), topicId);\n            eventData.setData(EventFlowData.builder().success(false).message(errMsg).build());\n            closeSSE(emitter, eventData);\n            throw new JeecgBootBizTipException(\"调用大模型接口失败:\" + e.getMessage());\n        }\n        /**\n         * 是否正在思考\n         */\n        AtomicBoolean isThinking = new AtomicBoolean(false);\n        // ai聊天响应逻辑\n        chatStream.onPartialResponse((String resMessage) -> {\n            //update-begin---author:wangshuai---date:2025-11-07---for:[issues/8506]/[issues/8260]/[issues/8166]新增推理模型的支持---\n            if(isThinking.get()){\n                //思考过程结束\n                this.sendThinkEnd(requestId, chatConversation, topicId);\n                isThinking.set(false);\n            }\n            //update-end---author:wangshuai---date:2025-11-07---for:[issues/8506]/[issues/8260]/[issues/8166]新增推理模型的支持---\n            EventData eventData = new EventData(requestId, null, EventData.EVENT_MESSAGE, chatConversation.getId(), topicId);\n            EventMessageData messageEventData = EventMessageData.builder().message(resMessage).build();\n            eventData.setData(messageEventData);\n            eventData.setRequestId(requestId);\n            // sse\n            SseEmitter emitter = AiragLocalCache.get(AiragConsts.CACHE_TYPE_SSE, requestId);\n            if (null == emitter) {\n                log.warn(\"[AI应用]接收LLM返回会话已关闭\");\n                return;\n            }\n            sendMessage2Client(emitter, eventData);\n        }).onToolExecuted((toolExecution) -> {\n            // 打印工具执行结果\n            log.debug(\"[AI应用]工具执行结果: toolName={}, toolId={}, result={}\",\n                    toolExecution.request().name(), \n                    toolExecution.request().id(), \n                    toolExecution.result());\n            // 将工具执行结果存储到消息历史中\n            ToolExecutionResultMessage toolResultMessage = ToolExecutionResultMessage.from(\n                    toolExecution.request(),\n                    toolExecution.result()\n            );\n            appendMessage(messages, toolResultMessage, chatConversation, topicId);\n        }).onIntermediateResponse((chatResponse) -> {\n            // 中间响应：包含tool_calls的AI消息\n            AiMessage aiMessage = chatResponse.aiMessage();\n            if (aiMessage != null && oConvertUtils.isObjectNotEmpty(aiMessage.toolExecutionRequests())) {\n                // 保存包含工具调用请求的AI消息\n                log.debug(\"[AI应用]保存包含工具调用的AI消息: toolCallsCount={}\", aiMessage.toolExecutionRequests().size());\n                appendMessage(messages, aiMessage, chatConversation, topicId);\n            }\n        }).onPartialThinking((partialThinking) -> {\n            try {\n                if (oConvertUtils.isEmpty(partialThinking)) {\n                    return;\n                }\n                isThinking.set(true);\n                String text = partialThinking.text();\n                // 构造事件数据（EVENT_THINKING 以便前端统一处理）\n                EventData thinkingEvent = new EventData(requestId, null, EventData.EVENT_THINKING, chatConversation.getId(), topicId);\n                thinkingEvent.setData(EventMessageData.builder().message(text).build());\n                thinkingEvent.setRequestId(requestId);\n                // 获取当前缓存的 emitter\n                SseEmitter emitter = AiragLocalCache.get(AiragConsts.CACHE_TYPE_SSE, requestId);\n                if (null == emitter) {\n                    log.warn(\"[AI应用]思考过程发送失败，SSE 已关闭: {}\", requestId);\n                    return;\n                }\n                // 发送给客户端并缓存历史\n                sendMessage2Client(emitter, thinkingEvent);\n            } catch (Exception e) {\n                log.error(\"发送思考过程异常\", e);\n            }\n        }).onCompleteResponse((responseMessage) -> {\n            // 打印流程耗时日志\n            printChatDuration(requestId, \"LLM输出消息完成\");\n            AiragLocalCache.remove(AiragConsts.CACHE_TYPE_SSE_SEND_TIME, requestId);\n            // for [QQYUN-9234] MCP服务连接关闭 - 聊天完成时关闭MCP连接\n            finalAiChatParams.closeMcpConnections();\n            // 记录ai的回复\n            AiMessage aiMessage = responseMessage.aiMessage();\n            FinishReason finishReason = responseMessage.finishReason();\n            String respText = aiMessage.text();\n            // sse\n            SseEmitter emitter = AiragLocalCache.get(AiragConsts.CACHE_TYPE_SSE, requestId);\n            if (null == emitter) {\n                log.warn(\"[AI应用]接收LLM返回会话已关闭\");\n                return;\n            }\n            if (FinishReason.STOP.equals(finishReason) || null == finishReason) {\n                // 正常结束\n                EventData eventData = new EventData(requestId, null, EventData.EVENT_MESSAGE_END, chatConversation.getId(), topicId);\n                appendMessage(messages, aiMessage, chatConversation, topicId);\n                // 保存会话\n                //update-begin---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n                saveChatConversation(chatConversation, false, httpRequest, sessionType);\n                //update-end---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n                closeSSE(emitter, eventData);\n            } else if (FinishReason.LENGTH.equals(finishReason)) {\n                // 上下文长度超过限制\n                log.error(\"调用模型异常:上下文长度超过限制:{}\", responseMessage.tokenUsage());\n                EventData eventData = new EventData(requestId, null, EventData.EVENT_MESSAGE, chatConversation.getId(), topicId);\n                eventData.setData(EventMessageData.builder().message(\"\\n上下文长度超过限制，请调整模型最大Tokens\").build());\n                sendMessage2Client(emitter, eventData);\n                eventData = new EventData(requestId, null, EventData.EVENT_MESSAGE_END, chatConversation.getId(), topicId);\n                closeSSE(emitter, eventData);\n            } else {\n                // 异常结束\n                log.error(\"调用模型异常:\" + respText);\n                if (respText.contains(\"insufficient Balance\")) {\n                    respText = \"大语言模型账号余额不足!\";\n                }\n                EventData eventData = new EventData(requestId, null, EventData.EVENT_FLOW_ERROR, chatConversation.getId(), topicId);\n                eventData.setData(EventFlowData.builder().success(false).message(respText).build());\n                closeSSE(emitter, eventData);\n            }\n        }).onError((Throwable error) -> {\n            // 打印流程耗时日志\n            printChatDuration(requestId, \"LLM输出消息异常\");\n            AiragLocalCache.remove(AiragConsts.CACHE_TYPE_SSE_SEND_TIME, requestId);\n            // for [QQYUN-9234] MCP服务连接关闭 - 聊天异常时关闭MCP连接\n            finalAiChatParams.closeMcpConnections();\n            // sse\n            SseEmitter emitter = AiragLocalCache.get(AiragConsts.CACHE_TYPE_SSE, requestId);\n            if (null == emitter) {\n                log.warn(\"[AI应用]接收LLM返回会话已关闭{}\", requestId);\n                return;\n            }\n            log.error(error.getMessage(), error);\n            String errMsg = error.getMessage();\n            if (errMsg != null && errMsg.contains(\"timeout\")) {\n                //update-begin---author:chenrui ---date:20250425  for：[QQYUN-12203]AI 聊天，超时或者服务器报错，给个友好提示------------\n                errMsg = \"当前用户较多，排队中，请稍后再试！\";\n                EventData eventData = new EventData(requestId, null, EventData.EVENT_MESSAGE, chatConversation.getId(), topicId);\n                eventData.setData(EventMessageData.builder().message(\"\\n\" + errMsg).build());\n                sendMessage2Client(emitter, eventData);\n                eventData = new EventData(requestId, null, EventData.EVENT_MESSAGE_END, chatConversation.getId(), topicId);\n                closeSSE(emitter, eventData);\n                //update-end---author:chenrui ---date:20250425  for：[QQYUN-12203]AI 聊天，超时或者服务器报错，给个友好提示------------\n            } else {\n                errMsg = \"调用大模型接口失败，详情请查看后台日志。\";\n                // 根据常见异常关键字做细致翻译\n                for (Map.Entry<String, String> entry : AIChatHandler.MODEL_ERROR_MAP.entrySet()) {\n                    String key = entry.getKey();\n                    String value = entry.getValue();\n                    if (error.getMessage().contains(key)) {\n                        errMsg = value;\n                    }\n                }\n                EventData eventData = new EventData(requestId, null, EventData.EVENT_FLOW_ERROR, chatConversation.getId(), topicId);\n                eventData.setData(EventFlowData.builder().success(false).message(errMsg).build());\n                closeSSE(emitter, eventData);\n            }\n        }).start();\n    }\n\n    /**\n     * 发送思考过程结束\n     * \n     * @param requestId\n     * @param chatConversation\n     * @param topicId\n     */\n    private void sendThinkEnd(String requestId, ChatConversation chatConversation, String topicId) {\n        EventData eventData = new EventData(requestId, null, EventData.EVENT_THINKING_END, chatConversation.getId(), topicId);\n        EventMessageData messageEventData = EventMessageData.builder().message(\"\").build();\n        eventData.setData(messageEventData);\n        eventData.setRequestId(requestId);\n        SseEmitter emitter = AiragLocalCache.get(AiragConsts.CACHE_TYPE_SSE, requestId);\n        if (null == emitter) {\n            log.warn(\"[AI应用]接收LLM返回会话已关闭\");\n            return;\n        }\n        sendMessage2Client(emitter, eventData);\n    }\n\n    /**\n     * 发送消息到客户端\n     *\n     * @param emitter\n     * @param eventData\n     * @author chenrui\n     * @date 2025/4/22 19:58\n     */\n    private static void sendMessage2Client(SseEmitter emitter, EventData eventData) {\n        try {\n            log.debug(\"发送消息:{}\", eventData.getRequestId());\n            String eventStr = JSONObject.toJSONString(eventData);\n            log.debug(\"[AI应用]接收LLM返回消息:{}\", eventStr);\n            emitter.send(SseEmitter.event().data(eventStr));\n            List<EventData> historyMsg = AiragLocalCache.get(AiragConsts.CACHE_TYPE_SSE_HISTORY_MSG, eventData.getRequestId());\n            if (null == historyMsg) {\n                historyMsg = new CopyOnWriteArrayList<>();\n                AiragLocalCache.put(AiragConsts.CACHE_TYPE_SSE_HISTORY_MSG, eventData.getRequestId(), historyMsg);\n            }\n            historyMsg.add(eventData);\n        } catch (IOException e) {\n            log.error(\"发送消息失败\", e);\n        }\n    }\n\n    /**\n     * 发送聊天返回结果\n     *\n     * @author chenrui\n     * @date 2025/2/28 11:05\n     */\n    private static class ChatResult {\n        public final SseEmitter emitter;\n        public final AiragModel chatModel;\n\n        public ChatResult(SseEmitter emitter, AiragModel chatModel) {\n            this.emitter = emitter;\n            this.chatModel = chatModel;\n        }\n    }\n\n\n    /**\n     * 总结会话标题\n     * 几个问题: <br/>\n     * 1. 如果在发消息时同步总结会话标题,会导致接口很慢甚至超时.\n     * 2. 但如果异步更新会话标题会导致消息记录丢失(不全)或者标题丢失,需要写很多逻辑去保证最终一致\n     * so 暂时先不用AI更新会话标题. 后期如果需要单独再增加一个接口,由前端调用或者在第一次消息接收完成后再异步更新\n     *\n     * @param chatConversation\n     * @param question\n     * @param modelId\n     * @return\n     * @author chenrui\n     * @date 2025/2/25 17:12\n     */\n    protected void summaryConversationTitle(ChatConversation chatConversation, String question, String modelId) {\n        if (oConvertUtils.isEmpty(chatConversation.getId())) {\n            return;\n        }\n        //update-begin---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        String key = getConversationCacheKey(chatConversation.getId(), null,\"\");\n        //update-end---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n        if (oConvertUtils.isEmpty(key)) {\n            return;\n        }\n        CompletableFuture.runAsync(() -> {\n            List<ChatMessage> messages = new LinkedList<>();\n            String systemMsgStr = \"根据用户的问题,总结会话标题.\\n\" + \"要求如下:\\n\" + \"1. 使用中文回答.\\n\" + \"2. 标题长度控制在5个汉字10个英文字符以内\\n\" + \"3. 直接回复会话标题,不要有其他任何无关描述\\n\" + \"4. 如果无法总结,回复不知道\\n\";\n            messages.add(new SystemMessage(systemMsgStr));\n            messages.add(new UserMessage(question));\n            String summaryTitle;\n            try {\n                summaryTitle = aiChatHandler.completions(modelId, messages, null);\n                log.info(\"总结会话完成{}\", summaryTitle);\n                if (summaryTitle.equalsIgnoreCase(\"不知道\")) {\n                    summaryTitle = \"\";\n                }\n            } catch (Exception e) {\n                log.warn(\"AI总结会话失败\" + e.getMessage(), e);\n                summaryTitle = \"\";\n            }\n            // 更新会话标题\n            ChatConversation cachedConversation = (ChatConversation) redisTemplate.boundValueOps(key).get();\n            if (null == cachedConversation) {\n                cachedConversation = chatConversation;\n            }\n            if (oConvertUtils.isEmpty(chatConversation.getTitle())) {\n                // 再次判断标题是否为空,只有标题为空才更新\n                if (oConvertUtils.isNotEmpty(summaryTitle)) {\n                    cachedConversation.setTitle(summaryTitle);\n                } else {\n                    int maxLength = AiAppConsts.CONVERSATION_MAX_TITLE_LENGTH;\n                    cachedConversation.setTitle(question.length() > maxLength ? question.substring(0, maxLength) : question);\n                }\n                //保存会话\n                //update-begin---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n                saveChatConversation(cachedConversation,\"\");\n                //update-end---author:wangshuai---date:2025-12-10---for:【QQYUN-14127】【AI】AI应用门户---\n            }\n        });\n    }\n\n    /**\n     * 获取用户名\n     *\n     * @param httpRequest\n     * @return\n     * @author chenrui\n     * @date 2025/3/27 15:05\n     */\n    private String getUsername(HttpServletRequest httpRequest) {\n        try {\n            TokenUtils.getTokenByRequest();\n            String token;\n            if (null != httpRequest) {\n                token = TokenUtils.getTokenByRequest(httpRequest);\n            } else {\n                token = TokenUtils.getTokenByRequest();\n            }\n            if (TokenUtils.verifyToken(token, sysBaseApi, redisUtil)) {\n                return JwtUtil.getUsername(token);\n            }\n        } catch (Exception e) {\n            return null;\n        }\n        return null;\n    }\n\n\n    /**\n     * 打印耗时\n     * @param requestId\n     * @param message\n     * @author chenrui\n     * @date 2025/4/28 15:15\n     */\n    private static void printChatDuration(String requestId,String message) {\n        Long beginTime = AiragLocalCache.get(AiragConsts.CACHE_TYPE_SSE_SEND_TIME, requestId);\n        if (null != beginTime) {\n            log.info(\"[AI-CHAT]{},requestId:{},耗时:{}s\", message, requestId, (System.currentTimeMillis() - beginTime) / 1000);\n        }\n    }\n\n\n    /**\n     * 根据会话类型获取会话信息\n     * \n     * @param sessionType\n     * @return\n     */\n    @Override\n    public Result<?> getConversationsByType(String sessionType) {\n        String key = getConversationDirCacheKey(null);\n        key = key + \":\" + sessionType + \":*\";\n        List<String> keys = redisUtil.scan(key);\n        // 如果键集合为空，返回空列表\n        if (keys.isEmpty()) {\n            return Result.ok(Collections.emptyList());\n        }\n\n        // 遍历键集合，获取对应的 ChatConversation 对象\n        List<ChatConversation> conversations = new ArrayList<>();\n        for (Object k : keys) {\n            ChatConversation conversation = (ChatConversation) redisTemplate.boundValueOps(k).get();\n\n            if (conversation != null) {\n                AiragApp app = conversation.getApp();\n                if (null == app) {\n                    continue;\n                }\n                conversation.setApp(null);\n                conversation.setMessages(null);\n                conversations.add(conversation);\n            }\n        }\n\n        // 对会话列表按创建时间降序排序\n        conversations.sort((o1, o2) -> {\n            Date date1 = o1.getCreateTime();\n            Date date2 = o2.getCreateTime();\n            if (date1 == null && date2 == null) {\n                return 0;\n            }\n            if (date1 == null) {\n                return 1;\n            }\n            if (date2 == null) {\n                return -1;\n            }\n            return date2.compareTo(date1);\n        });\n\n        // 返回结果\n        return Result.ok(conversations);\n    }\n\n    //================================================= begin 【QQYUN-14269】【AI】支持变量 ========================================\n    /**\n     *  初始化变量（仅不存在时设置）\n     */\n    private void saveVariables(AiragApp app) {\n        if(null == app){\n            return;\n        }\n        if(!AiAppConsts.IZ_OPEN_MEMORY.equals(app.getIzOpenMemory())){\n            return;\n        }\n        if (oConvertUtils.isObjectNotEmpty(app.getVariables())) {\n            // 变量替换\n            String username = \"jeecg\";\n            try {\n                HttpServletRequest req = SpringContextUtils.getHttpServletRequest();\n                username = JwtUtil.getUserNameByToken(req);\n            } catch (Exception e) {\n                log.error(e.getMessage());\n            }\n            if (oConvertUtils.isNotEmpty(username) && oConvertUtils.isNotEmpty(app.getId())) {\n                String variables = app.getVariables();\n                JSONArray objects = JSONArray.parseArray(variables);\n                for (int i = 0; i < objects.size(); i++) {\n                    JSONObject jsonObject = objects.getJSONObject(i);\n                    String name = jsonObject.getString(\"name\");\n                    String defaultValue = jsonObject.getString(\"defaultValue\");\n                    if (oConvertUtils.isNotEmpty(name)) {\n                        airagVariableService.initVariable(username, app.getId(), name, defaultValue);\n                    }\n                }\n            }\n        }\n    }\n    //================================================= end 【QQYUN-14269】【AI】支持变量 ========================================\n\n    /**\n     * ai海报生成\n     * \n     * @param chatSendParams\n     * @return\n     */\n    @Override\n    public String genAiPoster(ChatSendParams chatSendParams) {\n        AssertUtils.assertNotEmpty(\"请选择绘画模型\", chatSendParams.getDrawModelId());\n        AssertUtils.assertNotEmpty(\"请填写提示词\", chatSendParams.getContent());\n        AIChatParams aiChatParams = new AIChatParams();\n        if(oConvertUtils.isNotEmpty(chatSendParams.getImageSize())){\n            aiChatParams.setImageSize(chatSendParams.getImageSize());\n        }\n        String image= chatSendParams.getImageUrl();\n        List<Map<String, Object>> imageList = new ArrayList<>();\n        if(oConvertUtils.isEmpty(image)) {\n            //生成图片\n            imageList = aiChatHandler.imageGenerate(chatSendParams.getDrawModelId(), chatSendParams.getContent(), aiChatParams);\n        } else {\n            //图生图\n            imageList = aiChatHandler.imageEdit(chatSendParams.getDrawModelId(), chatSendParams.getContent(), Arrays.asList(image.split(SymbolConstant.COMMA)), aiChatParams);\n        }\n        return imageList.stream().map(this::uploadImage).collect(Collectors.joining(\"\\n\"));\n    }\n\n    /**\n     * 上传图片\n     *\n     * @param map\n     * @return\n     */\n    private String uploadImage(Map<String, Object> map) {\n        if (null == map || map.isEmpty()) {\n            return \"\";\n        }\n        try {\n            String type = String.valueOf(map.get(\"type\"));\n            String value = String.valueOf(map.get(\"value\"));\n            byte[] data = new byte[1024];\n            // 判断是否是base64\n            if (\"base64\".equals(type)) {\n                if(value.startsWith(\"data:image\")){\n                    value = value.substring(value.indexOf(\",\") + 1);\n                }\n                data = Base64.getDecoder().decode(value);\n            } else {\n                //下载网络图片\n                InputStream inputStream = FileDownloadUtils.getDownInputStream(value, \"\");\n                if (inputStream != null) {\n                    ByteArrayOutputStream buffer = new ByteArrayOutputStream();\n                    byte[] inpByte = new byte[1024]; // 1KB缓冲区\n                    int nRead;\n                    while ((nRead = inputStream.read(inpByte, 0, data.length)) != -1) {\n                        buffer.write(inpByte, 0, nRead);\n                    }\n                    data = buffer.toByteArray();\n                }\n            }\n            if (data != null) {\n                Path path = jeecgBaseConfig.getPath();\n                String bizPath = \"chat\";\n                String url = CommonUtils.uploadOnlineImage(data, path.getUpload(), bizPath, jeecgBaseConfig.getUploadType());\n                if(\"local\".equals(jeecgBaseConfig.getUploadType())){\n                    url = \"#{domainURL}/\" + url;\n                }\n                return url;\n            }\n        } catch (Exception e) {\n            log.error(\"上传图片失败\", e);\n        }\n        return \"\";\n    }\n\n    //================================================= begin【QQYUN-14261】【AI】AI助手，支持多模态能力- 文档========================================\n    /**\n     * 构建文件内容\n     *\n     * @param content\n     * @param files\n     * @return\n     */\n    private String buildContentWithFiles(String content, List<String> files) {\n        String filesText = parseFilesToText(files);\n        if (oConvertUtils.isEmpty(content)) {\n            content = \"请基于我提供的附件内容回答问题。\";\n        }else{\n            content = content + \"\\n\\n请基于我提供的附件内容回答问题。\";\n        }\n        if (oConvertUtils.isNotEmpty(filesText)) {\n            if (oConvertUtils.isNotEmpty(content)) {\n                content = content + \"\\n\\n\" + filesText;\n            } else {\n                content = filesText;\n            }\n        }\n        return content;\n    }\n\n    /**\n     * 将文件转换成text\n     *\n     * @param files\n     * @return\n     */\n    private String parseFilesToText(List<String> files) {\n        if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(files)) {\n            return \"\";\n        }\n        StringBuilder sb = new StringBuilder();\n        TikaDocumentParser parser = new TikaDocumentParser(AutoDetectParser::new, null, null, null);\n        int parsedCount = 0;\n        for (String fileRef : files) {\n            if (parsedCount >= LLMConsts.CHAT_FILE_MAX_COUNT) {\n                break;\n            }\n            if (oConvertUtils.isEmpty(fileRef)) {\n                continue;\n            }\n\n            String fileRefWithoutQuery = fileRef;\n            if (fileRefWithoutQuery.contains(\"?\")) {\n                fileRefWithoutQuery = fileRefWithoutQuery.substring(0, fileRefWithoutQuery.indexOf(\"?\"));\n            }\n            String fileName = FilenameUtils.getName(fileRefWithoutQuery);\n            String ext = FilenameUtils.getExtension(fileName);\n            if (oConvertUtils.isEmpty(ext) || !LLMConsts.CHAT_FILE_EXT_WHITELIST.contains(ext.toLowerCase())) {\n                continue;\n            }\n            try {\n                File file = ensureLocalFile(fileRef, fileName);\n                if (file == null || !file.exists() || !file.isFile()) {\n                    continue;\n                }\n                Document document = parser.parse(file);\n                if (document == null || oConvertUtils.isEmpty(document.text())) {\n                    continue;\n                }\n                String text = document.text().trim();\n                if (text.length() > LLMConsts.CHAT_FILE_TEXT_MAX_LENGTH) {\n                    text = text.substring(0, LLMConsts.CHAT_FILE_TEXT_MAX_LENGTH);\n                }\n                sb.append(\"附件[\").append(fileName).append(\"]内容:\\n\").append(text).append(\"\\n\\n\");\n                parsedCount++;\n                if (sb.length() > LLMConsts.CHAT_FILE_TEXT_MAX_LENGTH) {\n                    break;\n                }\n            } catch (Exception e) {\n                log.warn(\"附件解析失败: {}, {}\", fileRef, e.getMessage());\n            }\n        }\n        return sb.toString().trim();\n    }\n\n    /**\n     * 获取本地文件\n     *\n     * @param fileRef\n     * @param fileName\n     * @return\n     * @throws IOException\n     */\n    private File ensureLocalFile(String fileRef, String fileName) {\n        String uploadpath = jeecgBaseConfig.getPath().getUpload();\n        if (LLMConsts.WEB_PATTERN.matcher(fileRef).matches()) {\n            String tempDir = uploadpath + File.separator + \"chat\" + File.separator + UUID.randomUUID() + File.separator;\n            File dir = new File(tempDir);\n            if (!dir.exists() && !dir.mkdirs()) {\n                return null;\n            }\n            String tempFilePath = tempDir + fileName;\n            FileDownloadUtils.download2DiskFromNet(fileRef, tempFilePath);\n            return new File(tempFilePath);\n        }\n        return new File(uploadpath + File.separator + fileRef);\n    }\n    //================================================= end【QQYUN-14261】【AI】AI助手，支持多模态能力- 文档========================================\n\n\n    /**\n     * ai创作\n     *\n     * @param aiWriteGenerateVo\n     * @return\n     */\n    @Override\n    public SseEmitter genAiWriter(AiWriteGenerateVo aiWriteGenerateVo) {\n        String activeMode = \"compose\";\n        String reply = \"reply\";\n        ChatSendParams sendParams = new ChatSendParams();\n        sendParams.setAppId(AiAppConsts.ARTICLE_WRITER_FLOW_ID);\n        String content = \"\";\n        //写作\n        if (activeMode.equals(aiWriteGenerateVo.getActiveMode())) {\n            content = StrUtil.format(Prompts.AI_WRITER_PROMPT, aiWriteGenerateVo.getPrompt(), aiWriteGenerateVo.getFormat(), aiWriteGenerateVo.getTone(), aiWriteGenerateVo.getLanguage(), aiWriteGenerateVo.getLength());\n        } else if(reply.equals(aiWriteGenerateVo.getActiveMode())){\n            //回复\n            content = StrUtil.format(Prompts.AI_REPLY_PROMPT, aiWriteGenerateVo.getPrompt(), aiWriteGenerateVo.getOriginalContent(), aiWriteGenerateVo.getFormat(), aiWriteGenerateVo.getTone(), aiWriteGenerateVo.getLanguage(), aiWriteGenerateVo.getLength());\n        } else {\n            content = StrUtil.format(Prompts.AI_TOUCHE_PROMPT, aiWriteGenerateVo.getPrompt(), aiWriteGenerateVo.getFormat(), aiWriteGenerateVo.getTone(), aiWriteGenerateVo.getLanguage(), aiWriteGenerateVo.getLength());\n        }\n        sendParams.setContent(content);\n        //组装会话\n        String requestId = UUIDGenerator.generate();\n        String topicId = UUIDGenerator.generate();\n        String conversationId = UUIDGenerator.generate();\n        ChatConversation chatConversation = new ChatConversation();\n        chatConversation.setId(conversationId);\n        chatConversation.setMessages(new ArrayList<>());\n        Map<String,Object> flowInputs = new HashMap<>();\n        flowInputs.put(\"type\", aiWriteGenerateVo.getActiveMode());\n        flowInputs.put(\"version\", \"V1\");\n        chatConversation.setFlowInputs(flowInputs);\n        SseEmitter emitter = createSSE(requestId);\n        // 缓存emitter\n        AiragLocalCache.put(AiragConsts.CACHE_TYPE_SSE, requestId, emitter);\n        // 缓存开始发送时间\n        log.info(\"[AI-CHAT]开始发送消息,requestId:{}\", requestId);\n        AiragLocalCache.put(AiragConsts.CACHE_TYPE_SSE_SEND_TIME, requestId, System.currentTimeMillis());\n        // 初始化历史消息缓存\n        AiragLocalCache.put(AiragConsts.CACHE_TYPE_SSE_HISTORY_MSG, requestId, new CopyOnWriteArrayList<>());\n        \n        // 发送就绪消息\n        EventData eventRequestId = new EventData(requestId, null, EventData.EVENT_INIT_REQUEST_ID, chatConversation.getId(), topicId);\n        eventRequestId.setData(EventMessageData.builder().message(\"\").build());\n        sendMessage2Client(emitter, eventRequestId);\n        \n        sendWithFlow(requestId, AiAppConsts.ARTICLE_WRITER_FLOW_ID, chatConversation, topicId, new ArrayList<>(), sendParams);\n        return emitter;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/service/impl/AiragVariableServiceImpl.java",
    "content": "package org.jeecg.modules.airag.app.service.impl;\n\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport dev.langchain4j.agent.tool.ToolSpecification;\nimport dev.langchain4j.model.chat.request.json.JsonObjectSchema;\nimport dev.langchain4j.service.tool.ToolExecutor;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.airag.app.consts.AiAppConsts;\nimport org.jeecg.modules.airag.app.entity.AiragApp;\nimport org.jeecg.modules.airag.app.service.IAiragVariableService;\nimport org.jeecg.modules.airag.app.vo.AppVariableVo;\nimport org.jeecg.modules.airag.common.handler.AIChatParams;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.stereotype.Service;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @Description: AI应用变量服务实现\n * @Author: jeecg-boot\n * @Date: 2025-02-26\n * @Version: V1.0\n */\n@Service\n@Slf4j\npublic class AiragVariableServiceImpl implements IAiragVariableService {\n\n    @Autowired\n    private RedisTemplate redisTemplate;\n\n    private static final String CACHE_PREFIX = \"airag:app:var:\";\n\n    /**\n     * 初始化变量（仅不存在时设置）\n     *\n     * @param username\n     * @param appId\n     * @param name\n     * @param defaultValue\n     */\n    @Override\n    public void initVariable(String username, String appId, String name, String defaultValue) {\n        if (oConvertUtils.isEmpty(username) || oConvertUtils.isEmpty(appId) || oConvertUtils.isEmpty(name)) {\n            return;\n        }\n        String key = CACHE_PREFIX + appId + \":\" + username;\n        redisTemplate.opsForHash().putIfAbsent(key, name, defaultValue != null ? defaultValue : \"\");\n    }\n\n    /**\n     * 追加提示词\n     * \n     * @param username\n     * @param app\n     * @return\n     */\n    @Override\n    public String additionalPrompt(String username, AiragApp app) {\n        String memoryPrompt = app.getMemoryPrompt();\n        String prompt = app.getPrompt();\n        \n        if (oConvertUtils.isEmpty(memoryPrompt)) {\n            return prompt;\n        }\n        String variablesStr = app.getVariables();\n        if (oConvertUtils.isEmpty(variablesStr)) {\n            return prompt;\n        }\n\n        List<AppVariableVo> variableList = JSONArray.parseArray(variablesStr, AppVariableVo.class);\n        if (variableList == null || variableList.isEmpty()) {\n            return prompt;\n        }\n\n        String key = CACHE_PREFIX + app.getId() + \":\" + username;\n        Map<Object, Object> savedValues = redisTemplate.opsForHash().entries(key);\n\n        for (AppVariableVo variable : variableList) {\n            if (variable.getEnable() != null && !variable.getEnable()) {\n                continue;\n            }\n            String name = variable.getName();\n            String value = variable.getDefaultValue();\n\n            // 优先使用Redis中的值\n            if (savedValues.containsKey(name)) {\n                Object savedVal = savedValues.get(name);\n                if (savedVal != null) {\n                    value = String.valueOf(savedVal);\n                }\n            }\n\n            if (value == null) {\n                value = \"\";\n            }\n\n            // 替换 {{name}}\n            memoryPrompt = memoryPrompt.replace(\"{{\" + name + \"}}\", value);\n        }\n        return prompt + \"\\n\" + memoryPrompt;\n    }\n\n    /**\n     * 更新变量值\n     * \n     * @param userId\n     * @param appId\n     * @param name\n     * @param value\n     */\n    @Override\n    public void updateVariable(String userId, String appId, String name, String value) {\n        if (oConvertUtils.isEmpty(userId) || oConvertUtils.isEmpty(appId) || oConvertUtils.isEmpty(name)) {\n            return;\n        }\n        String key = CACHE_PREFIX + appId + \":\" + userId;\n        redisTemplate.opsForHash().put(key, name, value);\n    }\n\n\n    /**\n     * 添加变量更新工具\n     *\n     * @param params\n     * @param aiApp\n     * @param username\n     */\n    @Override\n    public void addUpdateVariableTool(AiragApp aiApp, String username, AIChatParams params) {\n        if (params.getTools() == null) {\n            params.setTools(new HashMap<>());\n        }\n        if (!AiAppConsts.IZ_OPEN_MEMORY.equals(aiApp.getIzOpenMemory())) {\n            return;\n        }\n        // 构建变量描述信息\n        String variablesStr = aiApp.getVariables();\n        List<AppVariableVo> variableList = null;\n        if (oConvertUtils.isNotEmpty(variablesStr)) {\n            variableList = JSONArray.parseArray(variablesStr, AppVariableVo.class);\n        }\n\n        //工具描述\n        StringBuilder descriptionBuilder = new StringBuilder(\"更新应用变量的值。仅当检测到变量的新值与当前值不一致时调用。如果已调用过或值未变，请勿重复调用。\");\n        if (variableList != null && !variableList.isEmpty()) {\n            descriptionBuilder.append(\"\\n\\n可用变量列表：\");\n            for (AppVariableVo var : variableList) {\n                if (var.getEnable() != null && !var.getEnable()) {\n                    continue;\n                }\n                descriptionBuilder.append(\"\\n- \").append(var.getName());\n                if (oConvertUtils.isNotEmpty(var.getDescription())) {\n                    descriptionBuilder.append(\": \").append(var.getDescription());\n                }\n            }\n            descriptionBuilder.append(\"\\n\\n注意：variableName必须是上述列表中的名称之一。\");\n        }\n\n        //构建更新变量的工具\n        ToolSpecification spec = ToolSpecification.builder()\n                .name(\"update_variable\")\n                .description(descriptionBuilder.toString())\n                .parameters(JsonObjectSchema.builder()\n                        .addStringProperty(\"variableName\", \"变量名称\")\n                        .addStringProperty(\"value\", \"变量值\")\n                        .required(\"variableName\", \"value\")\n                        .build())\n                .build();\n\n        //监听工具的调用\n        ToolExecutor executor = (toolExecutionRequest, memoryId) -> {\n            try {\n                JSONObject args = JSONObject.parseObject(toolExecutionRequest.arguments());\n                String name = args.getString(\"variableName\");\n                String value = args.getString(\"value\");\n                IAiragVariableService variableService = SpringContextUtils.getBean(IAiragVariableService.class);\n                //更新变量值\n                variableService.updateVariable(username, aiApp.getId(), name, value);\n                return \"变量 \" + name + \" 已更新为: \" + value;\n            } catch (Exception e) {\n                log.error(\"更新变量失败\", e);\n                return \"更新变量失败: \" + e.getMessage();\n            }\n        };\n\n        params.getTools().put(spec, executor);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/vo/AiArticleWriteVersionVo.java",
    "content": "package org.jeecg.modules.airag.app.vo;\n\nimport lombok.Data;\n\n/**\n* @Description: AI写作版本号\n*\n* @author: wangshuai\n* @date: 2026/1/16 11:57\n*/\n@Data\npublic class AiArticleWriteVersionVo {\n\n    /**\n     * 当前版本号\n     */\n    private String version;\n\n    /**\n     * 写作内容\n     */\n    private String content;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/vo/AiWriteGenerateVo.java",
    "content": "package org.jeecg.modules.airag.app.vo;\n\nimport lombok.Data;\n\n/**\n* @Description: ai写作生成实体类\n*\n* @author: wangshuai\n* @date: 2026/1/12 15:59\n*/\n@Data\npublic class AiWriteGenerateVo {\n\n    /**\n     * 写作类型\n     */\n    private String activeMode;\n\n    /**\n     * 写作内容提示\n     */\n    private String prompt;\n\n    /**\n     * 原文\n     */\n    private String originalContent;\n\n    /**\n     * 长度\n     */\n    private String length;\n\n    /**\n     * 格式\n     */\n    private String format;\n\n    /**\n     * 语气\n     */\n    private String tone;\n\n    /**\n     * 语言\n     */\n    private String language;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/vo/AppDebugParams.java",
    "content": "package org.jeecg.modules.airag.app.vo;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.jeecg.modules.airag.app.entity.AiragApp;\n\n/**\n * @Description: 应用调试入参\n * @Author: chenrui\n * @Date: 2025/2/25 11:47\n */\n@Data\npublic class AppDebugParams extends ChatSendParams {\n\n    /**\n     * 应用信息\n     */\n    AiragApp app;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/vo/AppVariableVo.java",
    "content": "package org.jeecg.modules.airag.app.vo;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * @Description: 应用变量配置\n * @Author: jeecg-boot\n * @Date: 2025-02-26\n * @Version: V1.0\n */\n@Data\npublic class AppVariableVo implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * 变量名\n     */\n    private String name;\n\n    /**\n     * 描述\n     */\n    private String description;\n\n    /**\n     * 默认值\n     */\n    private String defaultValue;\n\n    /**\n     * 是否启用\n     */\n    private Boolean enable;\n\n    /**\n     * 动作\n     */\n    private String action;\n\n    /**\n     * 排序\n     */\n    private Integer orderNum;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/vo/ChatConversation.java",
    "content": "package org.jeecg.modules.airag.app.vo;\n\nimport lombok.Data;\nimport org.jeecg.modules.airag.app.entity.AiragApp;\nimport org.jeecg.modules.airag.common.vo.MessageHistory;\n\nimport java.util.Date;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @Description: 聊天会话\n * @Author: chenrui\n * @Date: 2025/2/25 14:56\n */\n@Data\npublic class ChatConversation {\n\n    /**\n     * 会话id\n     */\n    private String id;\n\n    /**\n     * 会话标题\n     */\n    private String title;\n\n    /**\n     * 消息记录\n     */\n    private List<MessageHistory> messages;\n\n    /**\n     * app\n     */\n    private AiragApp app;\n\n    /**\n     * 创建时间\n     */\n    private Date createTime;\n\n    /**\n     * 流程入参配置（工作流的额外参数设置）\n     * key: 参数field, value: 参数值\n     * for [issues/8545]新建AI应用的时候只能选择没有自定义参数的AI流程\n     */\n    private Map<String, Object> flowInputs;\n\n    /**\n     * portal 应用门户\n     */\n    private String sessionType;\n\n    /**\n     * 是否保存会话\n     */\n    private Boolean izSaveSession;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/vo/ChatSendParams.java",
    "content": "package org.jeecg.modules.airag.app.vo;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @Description: 发送消息的入参\n * @Author: chenrui\n * @Date: 2025/2/25 11:47\n */\n@NoArgsConstructor\n@Data\npublic class ChatSendParams {\n\n    public ChatSendParams(String content, String conversationId, String topicId, String appId) {\n        this.content = content;\n        this.conversationId = conversationId;\n        this.topicId = topicId;\n        this.appId = appId;\n    }\n\n    /**\n     * 用户输入的聊天内容\n     */\n    private String content;\n\n    /**\n     * 对话会话ID\n     */\n    private String conversationId;\n\n    /**\n     * 对话主题ID（用于关联历史记录）\n     */\n    private String topicId;\n\n    /**\n     * 应用id\n     */\n    private String appId;\n\n    /**\n     * 图片列表\n     */\n    private List<String> images;\n\n    /**\n     * 文件列表\n     */\n    private List<String> files;\n\n    /**\n     * 工作流额外入参配置\n     * key: 参数field, value: 参数值\n     * for [issues/8545]新建AI应用的时候只能选择没有自定义参数的AI流程\n     */\n    private Map<String, Object> flowInputs;\n\n    /**\n     * 是否开启网络搜索（仅千问模型支持）\n     */\n    private Boolean enableSearch;\n\n    /**\n     * 是否开启深度思考\n     */\n    private Boolean enableThink;\n\n    /**\n     * 会话类型: portal 应用门户\n     */\n    private String sessionType;\n\n    /**\n     * 是否开启生成绘画\n     */\n    private Boolean enableDraw;\n\n    /**\n     * 绘画模型的id\n     */\n    private String drawModelId;\n\n    /**\n     * 图片尺寸\n     */\n    private String imageSize;\n\n    /**\n     * 一张图片\n     */\n    private String imageUrl;\n\n    /**\n     * 是否保存会话\n     */\n    private Boolean izSaveSession;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/demo/JimuDataReader.java",
    "content": "package org.jeecg.modules.airag.demo;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.exception.JeecgBootBizTipException;\nimport org.jeecg.modules.airag.flow.component.enhance.IAiRagEnhanceJava;\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.springframework.stereotype.Component;\n\nimport java.io.File;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * Java增强Demo: Excel数据读取器\n * for [QQYUN-11718]【AI】积木报表对接AI流程编排接口展示报表\n * @Author: chenrui\n * @Date: 2025/4/29 16:51\n */\n@Component(\"jimuDataReader\")\n@Slf4j\npublic class JimuDataReader implements IAiRagEnhanceJava {\n\n\n    @Override\n    public Map<String, Object> process(Map<String, Object> inputParams) {\n        // inputParams: {\"bizData\":\"/xxxx/xxxx/xxxx/xxxx.xls\"}\n        try {\n            String filePath = (String) inputParams.get(\"bizData\");\n            if (filePath == null || filePath.isEmpty()) {\n                throw new IllegalArgumentException(\"File path is empty\");\n            }\n\n            File excelFile = new File(filePath);\n            if (!excelFile.exists() || !excelFile.isFile()) {\n                throw new IllegalArgumentException(\"File not found: \" + filePath);\n            }\n\n            // Since we don't know the target entity class, we'll read the Excel generically\n            return readExcelData(excelFile);\n        } catch (Exception e) {\n            log.error(\"Error processing Excel file\", e);\n            throw new JeecgBootBizTipException(\"调用java增强失败\", e);\n        }\n    }\n\n    /**\n     * Excel导入工具方法，基于ExcelImportUtil\n     *\n     * @param file Excel文件\n     * @return Excel读取结果，包含字段和数据\n     * @throws Exception 导入过程中的异常\n     */\n    public static Map<String, Object> readExcelData(File file) throws Exception {\n        Map<String, Object> result = new HashMap<>();\n\n        // 设置导入参数\n        ImportParams params = new ImportParams();\n        params.setTitleRows(0); // 没有标题\n        params.setHeadRows(1);  // 第一行是表头\n\n        // 读取Excel数据\n        List<Map<String, Object>> dataList = ExcelImportUtil.importExcel(file, Map.class, params);\n\n        // 如果没有数据，返回空结果\n        if (dataList == null || dataList.isEmpty()) {\n            result.put(\"fields\", new ArrayList<>());\n            result.put(\"datas\", new ArrayList<>());\n            return result;\n        }\n\n        // 从第一行数据中获取字段名\n        List<String> fieldNames = new ArrayList<>(dataList.get(0).keySet());\n\n        result.put(\"fields\", fieldNames);\n        result.put(\"datas\", dataList);\n\n        return result;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/demo/TestAiragEnhance.java",
    "content": "package org.jeecg.modules.airag.demo;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.modules.airag.flow.component.enhance.IAiRagEnhanceJava;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Collections;\nimport java.util.Map;\n\n/**\n * @Description: Java增强节点示例类\n * @Author: chenrui\n * @Date: 2025/3/6 11:42\n */\n@Slf4j\n@Component(\"testAiragEnhance\")\npublic class TestAiragEnhance implements IAiRagEnhanceJava {\n    @Override\n    public Map<String, Object> process(Map<String, Object> inputParams) {\n        Object arg1 = inputParams.get(\"arg1\");\n        Object arg2 = inputParams.get(\"arg2\");\n        Object index = inputParams.get(\"index\");\n        log.info(\"arg1={}, arg2={}, index={}\", arg1, arg2, index);\n        return Collections.singletonMap(\"result\",arg1.toString()+\"java拼接\"+arg2.toString());\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/config/EmbedStoreConfigBean.java",
    "content": "package org.jeecg.modules.airag.llm.config;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.stereotype.Component;\n\n/**\n * 向量存储库配置\n *\n * @Author: chenrui\n * @Date: 2025/2/18 14:24\n */\n@NoArgsConstructor\n@Data\n@Component\n@ConfigurationProperties(prefix = EmbedStoreConfigBean.PREFIX)\npublic class EmbedStoreConfigBean {\n    public static final String PREFIX = \"jeecg.airag.embed-store\";\n\n    /**\n     * host\n     */\n    private String host = \"127.0.0.1\";\n    /**\n     * 端口\n     */\n    private int port = 5432;\n    /**\n     * 数据库\n     */\n    private String database = \"postgres\";\n    /**\n     * 用户名\n     */\n    private String user = \"postgres\";\n    /**\n     * 密码\n     */\n    private String password = \"postgres\";\n\n    /**\n     * 存储向量的表\n     */\n    private String table = \"embeddings\";\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/config/KnowConfigBean.java",
    "content": "package org.jeecg.modules.airag.llm.config;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.stereotype.Component;\n\n/**\n * 知识库配置\n *\n * @Author: chenrui\n * @Date: 2025-04-01 14:19\n */\n@NoArgsConstructor\n@Data\n@Component\n@ConfigurationProperties(prefix = KnowConfigBean.PREFIX)\npublic class KnowConfigBean {\n    public static final String PREFIX = \"jeecg.airag.know\";\n\n    /**\n     * 开启MinerU解析\n     */\n    private boolean enableMinerU = false;\n\n    /**\n     * conda的环境(默认不使用conda)\n     */\n    private String condaEnv = null;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/consts/FlowPluginContent.java",
    "content": "package org.jeecg.modules.airag.llm.consts;\n\n/**\n* @Description: 流程插件常量\n*\n* @author: wangshuai\n* @date: 2025/12/23 19:37\n*/\npublic interface FlowPluginContent {\n    /**\n     * 名称\n     */\n    String NAME = \"name\";\n\n    /**\n     * 描述\n     */\n    String DESCRIPTION = \"description\";\n\n    /**\n     * 响应\n     */\n    String RESPONSES = \"responses\";\n\n    /**\n     * 类型\n     */\n    String TYPE = \"type\";\n\n    /**\n     * 参数\n     */\n    String PARAMETERS = \"parameters\";\n\n    /**\n     * 是否必须\n     */\n    String REQUIRED = \"required\";\n\n    /**\n     * 默认值\n     */\n    String DEFAULT_VALUE = \"defaultValue\";\n\n    /**\n     * 路径\n     */\n    String PATH = \"path\";\n\n    /**\n     * 方法\n     */\n    String METHOD = \"method\";\n\n    /**\n     * 位置\n     */\n    String LOCATION = \"location\";\n\n    /**\n     * 认证类型\n     */\n    String AUTH_TYPE = \"authType\";\n\n    /**\n     * token参数名称\n     */\n    String TOKEN_PARAM_NAME = \"tokenParamName\";\n\n    /**\n     * token参数值\n     */\n    String TOKEN_PARAM_VALUE = \"tokenParamValue\";\n\n    /**\n     * token\n     */\n    String TOKEN = \"token\";\n\n    /**\n     * Path位置\n     */\n    String LOCATION_PATH = \"Path\";\n\n    /**\n     * Header位置\n     */\n    String LOCATION_HEADER = \"Header\";\n\n    /**\n     * Query位置\n     */\n    String LOCATION_QUERY = \"Query\";\n\n    /**\n     * Body位置\n     */\n    String LOCATION_BODY = \"Body\";\n\n    /**\n     * Form-Data位置\n     */\n    String LOCATION_FORM_DATA = \"Form-Data\";\n\n    /**\n     * String类型\n     */\n    String TYPE_STRING = \"String\";\n\n    /**\n     * string类型\n     */\n    String TYPE_STRING_LOWER = \"string\";\n\n    /**\n     * Number类型\n     */\n    String TYPE_NUMBER = \"Number\";\n\n    /**\n     * number类型\n     */\n    String TYPE_NUMBER_LOWER = \"number\";\n\n    /**\n     * Integer类型\n     */\n    String TYPE_INTEGER = \"Integer\";\n\n    /**\n     * integer类型\n     */\n    String TYPE_INTEGER_LOWER = \"integer\";\n\n    /**\n     * Boolean类型\n     */\n    String TYPE_BOOLEAN = \"Boolean\";\n\n    /**\n     * boolean类型\n     */\n    String TYPE_BOOLEAN_LOWER = \"boolean\";\n\n    /**\n     * 工具数量\n     */\n    String TOOL_COUNT = \"tool_count\";\n\n    /**\n     * 是否启用\n     */\n    String ENABLED = \"enabled\";\n\n    /**\n     * 输入\n     */\n    String INPUTS = \"inputs\";\n\n    /**\n     * 输出\n     */\n    String OUTPUTS = \"outputs\";\n\n    /**\n     * POST请求\n     */\n    String POST = \"POST\";\n\n    /**\n     * token名称\n     */\n    String X_ACCESS_TOKEN = \"X-Access-Token\";\n\n    /**\n     * 插件名称\n     */\n    String PLUGIN_NAME = \"流程调用\";\n\n    /**\n     * 插件描述\n     */\n    String PLUGIN_DESC = \"调用工作流\";\n\n    /**\n     * 插件请求地址\n     */\n    String PLUGIN_REQUEST_URL = \"/airag/flow/plugin/run/\";\n\n    /**\n     * 记忆库插件名称\n     */\n    String PLUGIN_MEMORY_NAME = \"记忆库\";\n\n    /**\n     * 记忆库插件描述\n     */\n    String PLUGIN_MEMORY_DESC = \"用于记录长期记忆\";\n    \n    /**\n     * 添加记忆路径\n     */\n    String PLUGIN_MEMORY_ADD_PATH = \"/airag/knowledge/plugin/add\";\n\n    /**\n     * 查询记忆路径\n     */\n    String PLUGIN_MEMORY_QUERY_PATH = \"/airag/knowledge/plugin/query\";\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/consts/LLMConsts.java",
    "content": "package org.jeecg.modules.airag.llm.consts;\n\nimport java.util.Arrays;\nimport java.util.HashSet;\nimport java.util.Set;\nimport java.util.regex.Pattern;\n\n/**\n * @Description: airag模型常量类\n * @Author: chenrui\n * @Date: 2025/2/12 17:35\n */\npublic class LLMConsts {\n\n\n    /**\n     * 正则表达式:是否是网页\n     */\n    public static final Pattern WEB_PATTERN = Pattern.compile(\"^(http|https)://.*\");\n\n    /**\n     * 状态:启用\n     */\n    public static final String STATUS_ENABLE = \"enable\";\n    /**\n     * 状态:禁用\n     */\n    public static final String STATUS_DISABLE = \"disable\";\n\n\n    /**\n     * 模型类型:向量\n     */\n    public static final String MODEL_TYPE_EMBED = \"EMBED\";\n\n    /**\n     * 模型类型:聊天\n     */\n    public static final String MODEL_TYPE_LLM = \"LLM\";\n\n    /**\n     * 模型类型: 图像生成\n     */\n    public static final String MODEL_TYPE_IMAGE = \"IMAGE\";\n\n    /**\n     * 向量模型：默认维度\n     */\n    public static final Integer EMBED_MODEL_DEFAULT_DIMENSION = 1536;\n\n    /**\n     * 知识库:文档状态:草稿\n     */\n    public static final String KNOWLEDGE_DOC_STATUS_DRAFT = \"draft\";\n    /**\n     * 知识库:文档状态:构建中\n     */\n    public static final String KNOWLEDGE_DOC_STATUS_BUILDING = \"building\";\n    /**\n     * 知识库:文档状态:构建完成\n     */\n    public static final String KNOWLEDGE_DOC_STATUS_COMPLETE = \"complete\";\n    /**\n     * 知识库:文档状态:构建失败\n     */\n    public static final String KNOWLEDGE_DOC_STATUS_FAILED = \"failed\";\n\n    /**\n     * 知识库:文档类型:文本\n     */\n    public static final String KNOWLEDGE_DOC_TYPE_TEXT = \"text\";\n    /**\n     * 知识库:文档类型:文件\n     */\n    public static final String KNOWLEDGE_DOC_TYPE_FILE = \"file\";\n    /**\n     * 知识库:文档类型:网页\n     */\n    public static final String KNOWLEDGE_DOC_TYPE_WEB = \"web\";\n\n    /**\n     * 知识库:文档元数据:文件路径\n     */\n    public static final String KNOWLEDGE_DOC_METADATA_FILEPATH = \"filePath\";\n\n    /**\n     * 知识库:文档元数据:资源路径\n     */\n    public static final String KNOWLEDGE_DOC_METADATA_SOURCES_PATH = \"sourcesPath\";\n\n    /**\n     * DEEPSEEK推理模型\n     */\n    public static final String DEEPSEEK_REASONER = \"deepseek-reasoner\";\n\n    /**\n     * 知识库类型：知识库\n     */\n    public static final String KNOWLEDGE_TYPE_KNOWLEDGE = \"knowledge\";\n    \n    /**\n     * 知识库类型：记忆库\n     */\n    public static final String KNOWLEDGE_TYPE_MEMORY = \"memory\";\n\n    /**\n     * 支持文件的后缀\n     */\n    public static final Set<String> CHAT_FILE_EXT_WHITELIST = new HashSet<>(Arrays.asList(\"txt\", \"pdf\", \"docx\", \"doc\", \"pptx\", \"ppt\", \"xlsx\", \"xls\", \"md\"));\n\n    /**\n     * 文件内容最大长度\n     */\n    public static final int CHAT_FILE_TEXT_MAX_LENGTH = 20000;\n\n    /**\n     * 上传文件对打数量\n     */\n    public static final int CHAT_FILE_MAX_COUNT = 3;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/controller/AiragBaseApiController.java",
    "content": "package org.jeecg.modules.airag.llm.controller;\n\nimport org.jeecg.common.airag.api.IAiragBaseApi;\nimport org.jeecg.modules.airag.llm.service.impl.AiragBaseApiImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * airag baseAPI Controller\n *\n * @author sjlei\n * @date 2025-12-30\n */\n@RestController(\"airagBaseApiController\")\npublic class AiragBaseApiController implements IAiragBaseApi {\n\n    @Autowired\n    AiragBaseApiImpl airagBaseApi;\n\n    @PostMapping(\"/airag/api/knowledgeWriteTextDocument\")\n    public String knowledgeWriteTextDocument(\n            @RequestParam(\"knowledgeId\") String knowledgeId,\n            @RequestParam(\"title\") String title,\n            @RequestParam(\"content\") String content\n    ) {\n        return airagBaseApi.knowledgeWriteTextDocument(knowledgeId, title, content);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/controller/AiragKnowledgeController.java",
    "content": "package org.jeecg.modules.airag.llm.controller;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport io.swagger.v3.oas.annotations.Operation;\nimport jakarta.servlet.http.HttpServletRequest;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.util.AssertUtils;\nimport org.jeecg.common.util.TokenUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.modules.airag.common.vo.knowledge.KnowledgeSearchResult;\nimport org.jeecg.modules.airag.llm.consts.LLMConsts;\nimport org.jeecg.modules.airag.llm.entity.AiragKnowledge;\nimport org.jeecg.modules.airag.llm.entity.AiragKnowledgeDoc;\nimport org.jeecg.modules.airag.llm.handler.EmbeddingHandler;\nimport org.jeecg.modules.airag.llm.service.IAiragKnowledgeDocService;\nimport org.jeecg.modules.airag.llm.service.IAiragKnowledgeService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.transaction.annotation.Transactional;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\n\n\n/**\n * @Description: AIRag知识库\n * @Author: jeecg-boot\n * @Date: 2025-02-18\n * @Version: V1.0\n */\n@RestController\n@RequestMapping(\"/airag/knowledge\")\n@Slf4j\npublic class AiragKnowledgeController {\n    @Autowired\n    private IAiragKnowledgeService airagKnowledgeService;\n\n    @Autowired\n    private IAiragKnowledgeDocService airagKnowledgeDocService;\n\n    @Autowired\n    EmbeddingHandler embeddingHandler;\n\n    /**\n     * 分页列表查询知识库\n     *\n     * @param airagKnowledge\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @GetMapping(value = \"/list\")\n    public Result<IPage<AiragKnowledge>> queryPageList(AiragKnowledge airagKnowledge,\n                                                       @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                                       @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                                       HttpServletRequest req) {\n        QueryWrapper<AiragKnowledge> queryWrapper = QueryGenerator.initQueryWrapper(airagKnowledge, req.getParameterMap());\n        Page<AiragKnowledge> page = new Page<AiragKnowledge>(pageNo, pageSize);\n        IPage<AiragKnowledge> pageList = airagKnowledgeService.page(page, queryWrapper);\n        return Result.OK(pageList);\n    }\n\n    /**\n     * 添加知识库\n     *\n     * @param airagKnowledge 知识库\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 17:09\n     */\n    @PostMapping(value = \"/add\")\n    @RequiresPermissions(\"airag:knowledge:add\")\n    public Result<String> add(@RequestBody AiragKnowledge airagKnowledge) {\n        airagKnowledge.setStatus(LLMConsts.STATUS_ENABLE);\n        if(oConvertUtils.isEmpty(airagKnowledge.getType())) {\n            airagKnowledge.setType(LLMConsts.KNOWLEDGE_TYPE_KNOWLEDGE);\n        }\n        airagKnowledgeService.save(airagKnowledge);\n        return Result.OK(\"添加成功！\");\n    }\n\n    /**\n     * 编辑知识库\n     *\n     * @param airagKnowledge 知识库\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 17:09\n     */\n    @Transactional(rollbackFor = Exception.class)\n    @RequestMapping(value = \"/edit\", method = {RequestMethod.PUT, RequestMethod.POST})\n    @RequiresPermissions(\"airag:knowledge:edit\")\n    public Result<String> edit(@RequestBody AiragKnowledge airagKnowledge) {\n        AiragKnowledge airagKnowledgeEntity = airagKnowledgeService.getById(airagKnowledge.getId());\n        if (airagKnowledgeEntity == null) {\n            return Result.error(\"未找到对应数据\");\n        }\n        String oldEmbedId = airagKnowledgeEntity.getEmbedId();\n        if(oConvertUtils.isEmpty(airagKnowledgeEntity.getType())) {\n            airagKnowledge.setType(LLMConsts.KNOWLEDGE_TYPE_KNOWLEDGE);\n        }\n        airagKnowledgeService.updateById(airagKnowledge);\n        if (!oldEmbedId.equalsIgnoreCase(airagKnowledge.getEmbedId())) {\n            // 更新了模型,重建文档\n            airagKnowledgeDocService.rebuildDocumentByKnowId(airagKnowledge.getId());\n        }\n        return Result.OK(\"编辑成功!\");\n    }\n\n    /**\n     * 重建知识库\n     *\n     * @param knowIds\n     * @return\n     * @author chenrui\n     * @date 2025/3/12 17:05\n     */\n    @PutMapping(value = \"/rebuild\")\n    @RequiresPermissions(\"airag:knowledge:rebuild\")\n    public Result<?> rebuild(@RequestParam(\"knowIds\") String knowIds) {\n        String[] knowIdArr = knowIds.split(\",\");\n        for (String knowId : knowIdArr) {\n            airagKnowledgeDocService.rebuildDocumentByKnowId(knowId);\n        }\n        return Result.OK(\"\");\n    }\n\n    /**\n     * 通过id删除知识库\n     *\n     * @param id\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 17:09\n     */\n    @Transactional(rollbackFor = Exception.class)\n    @DeleteMapping(value = \"/delete\")\n    @RequiresPermissions(\"airag:knowledge:delete\")\n    public Result<String> delete(HttpServletRequest request, @RequestParam(name = \"id\", required = true) String id) {\n        //update-begin---author:chenrui ---date:20250606  for：[issues/8337]关于ai工作列表的数据权限问题 #8337------------\n        //如果是saas隔离的情况下，判断当前租户id是否是当前租户下的\n        if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n            AiragKnowledge know = airagKnowledgeService.getById(id);\n            //获取当前租户\n            String currentTenantId = TokenUtils.getTenantIdByRequest(request);\n            if (null == know || !know.getTenantId().equals(currentTenantId)) {\n                return Result.error(\"删除AI知识库失败，不能删除其他租户的AI知识库！\");\n            }\n        }\n        //update-end---author:chenrui ---date:20250606  for：[issues/8337]关于ai工作列表的数据权限问题 #8337------------\n        airagKnowledgeDocService.removeByKnowIds(Collections.singletonList(id));\n        airagKnowledgeService.removeById(id);\n        return Result.OK(\"删除成功!\");\n    }\n\n    /**\n     * 通过id查询知识库\n     *\n     * @param id\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 17:09\n     */\n    @GetMapping(value = \"/queryById\")\n    public Result<AiragKnowledge> queryById(@RequestParam(name = \"id\", required = true) String id) {\n        AiragKnowledge airagKnowledge = airagKnowledgeService.getById(id);\n        if (airagKnowledge == null) {\n            return Result.error(\"未找到对应数据\");\n        }\n        return Result.OK(airagKnowledge);\n    }\n\n    /**\n     * 文档分页查询\n     *\n     * @param airagKnowledgeDoc\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 18:37\n     */\n    @GetMapping(value = \"/doc/list\")\n    public Result<IPage<AiragKnowledgeDoc>> queryDocumentPageList(AiragKnowledgeDoc airagKnowledgeDoc,\n                                                                  @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                                                  @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                                                  HttpServletRequest req) {\n        AssertUtils.assertNotEmpty(\"请先选择知识库\", airagKnowledgeDoc.getKnowledgeId());\n        QueryWrapper<AiragKnowledgeDoc> queryWrapper = QueryGenerator.initQueryWrapper(airagKnowledgeDoc, req.getParameterMap());\n        Page<AiragKnowledgeDoc> page = new Page<>(pageNo, pageSize);\n        IPage<AiragKnowledgeDoc> pageList = airagKnowledgeDocService.page(page, queryWrapper);\n        return Result.OK(pageList);\n    }\n\n    /**\n     * 新增或编辑文档\n     *\n     * @param airagKnowledgeDoc 知识库文档\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 15:47\n     */\n    @PostMapping(value = \"/doc/edit\")\n    @RequiresPermissions(\"airag:knowledge:doc:edit\")\n    public Result<?> addDocument(@RequestBody AiragKnowledgeDoc airagKnowledgeDoc) {\n        return airagKnowledgeDocService.editDocument(airagKnowledgeDoc);\n    }\n\n\n    /**\n     * 从压缩包导入文档\n     * @return\n     * @author chenrui\n     * @date 2025/3/20 11:29\n     */\n    @PostMapping(value = \"/doc/import/zip\")\n    @RequiresPermissions(\"airag:knowledge:doc:zip\")\n    public Result<?> importDocumentFromZip(@RequestParam(name = \"knowId\", required = true) String knowId,\n                                           @RequestParam(name = \"file\", required = true) MultipartFile file) {\n        return airagKnowledgeDocService.importDocumentFromZip(knowId,file);\n    }\n\n    /**\n     * 通过文档库查询导入任务列表\n     * @param knowId\n     * @return\n     * @author chenrui\n     * @date 2025/3/20 11:37\n     */\n    @GetMapping(value = \"/doc/import/task/list\")\n    public Result<?> importDocumentTaskList(@RequestParam(name = \"knowId\", required = true) String knowId) {\n        return Result.OK(Collections.emptyList());\n    }\n\n    /**\n     * 重新向量化文档\n     *\n     * @param docIds 文档id集合\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 15:47\n     */\n    @PutMapping(value = \"/doc/rebuild\")\n    @RequiresPermissions(\"airag:knowledge:doc:rebuild\")\n    public Result<?> rebuildDocument(@RequestParam(\"docIds\") String docIds) {\n        return airagKnowledgeDocService.rebuildDocument(docIds);\n    }\n\n    /**\n     * 批量删除文档\n     *\n     * @param ids\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 17:09\n     */\n    @Transactional(rollbackFor = Exception.class)\n    @DeleteMapping(value = \"/doc/deleteBatch\")\n    @RequiresPermissions(\"airag:knowledge:doc:deleteBatch\")\n    public Result<String> deleteDocumentBatch(HttpServletRequest request, @RequestParam(name = \"ids\", required = true) String ids) {\n        List<String> idsList = Arrays.asList(ids.split(\",\"));\n        //update-begin---author:chenrui ---date:20250606  for：[issues/8337]关于ai工作列表的数据权限问题 #8337------------\n        //如果是saas隔离的情况下，判断当前租户id是否是当前租户下的\n        if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n            List<AiragKnowledgeDoc> docList = airagKnowledgeDocService.listByIds(idsList);\n            //获取当前租户\n            String currentTenantId = TokenUtils.getTenantIdByRequest(request);\n            docList.forEach(airagKnowledgeDoc -> {\n                if (null == airagKnowledgeDoc || !airagKnowledgeDoc.getTenantId().equals(currentTenantId)) {\n                    throw new IllegalArgumentException(\"删除AI知识库文档失败，不能删除其他租户的AI知识库文档！\");\n                }\n            });\n        }\n        //update-end---author:chenrui ---date:20250606  for：[issues/8337]关于ai工作列表的数据权限问题 #8337------------\n        airagKnowledgeDocService.removeDocByIds(idsList);\n        return Result.OK(\"批量删除成功！\");\n    }\n\n    /**\n     * 清空知识库文档\n     *\n     * @param\n     * @return\n     */\n    @Transactional(rollbackFor = Exception.class)\n    @DeleteMapping(value = \"/doc/deleteAll\")\n    @RequiresPermissions(\"airag:knowledge:doc:deleteAll\")\n    public Result<?> deleteDocumentAll(HttpServletRequest request, @RequestParam(name = \"knowId\") String knowId) {\n        //update-begin---author:chenrui ---date:20250606  for：[issues/8337]关于ai工作列表的数据权限问题 #8337------------\n        //如果是saas隔离的情况下，判断当前租户id是否是当前租户下的\n        if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n            AiragKnowledge know = airagKnowledgeService.getById(knowId);\n            //获取当前租户\n            String currentTenantId = TokenUtils.getTenantIdByRequest(request);\n            if (null == know || !know.getTenantId().equals(currentTenantId)) {\n                return Result.error(\"删除AI知识库失败，不能删除其他租户的AI知识库！\");\n            }\n        }\n        //update-end---author:chenrui ---date:20250606  for：[issues/8337]关于ai工作列表的数据权限问题 #8337------------\n        return airagKnowledgeDocService.deleteAllByKnowId(knowId);\n    }\n\n    /**\n     * 命中测试\n     *\n     * @param knowId     知识库id\n     * @param queryText  查询内容\n     * @param topNumber  最多返回条数\n     * @param similarity 最小分数\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 17:09\n     */\n    @GetMapping(value = \"/embedding/hitTest/{knowId}\")\n    public Result<?> hitTest(@PathVariable(\"knowId\") String knowId,\n                             @RequestParam(name = \"queryText\") String queryText,\n                             @RequestParam(name = \"topNumber\") Integer topNumber,\n                             @RequestParam(name = \"similarity\") Double similarity) {\n        List<Map<String, Object>> searchResp = embeddingHandler.searchEmbedding(knowId, queryText, topNumber, similarity);\n        return Result.ok(searchResp);\n    }\n\n    /**\n     * 向量查询\n     *\n     * @param knowIds    知识库ids\n     * @param queryText  查询内容\n     * @param topNumber  最多返回条数\n     * @param similarity 最小分数\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 17:09\n     */\n    @GetMapping(value = \"/embedding/search\")\n    public Result<?> embeddingSearch(@RequestParam(\"knowIds\") List<String> knowIds,\n                                     @RequestParam(name = \"queryText\") String queryText,\n                                     @RequestParam(name = \"topNumber\", required = false) Integer topNumber,\n                                     @RequestParam(name = \"similarity\", required = false) Double similarity) {\n        KnowledgeSearchResult searchResp = embeddingHandler.embeddingSearch(knowIds, queryText, topNumber, similarity);\n        return Result.ok(searchResp);\n    }\n\n    /**\n     * 通过ids批量查询知识库\n     *\n     * @param ids\n     * @return\n     * @author chenrui\n     * @date 2025/2/27 16:44\n     */\n    @GetMapping(value = \"/query/batch/byId\")\n    public Result<?> queryBatchByIds(@RequestParam(name = \"ids\", required = true) String ids) {\n        List<String> idList = Arrays.asList(ids.split(\",\"));\n        List<AiragKnowledge> airagKnowledges = airagKnowledgeService.listByIds(idList);\n        return Result.OK(airagKnowledges);\n    }\n    \n    /**\n     * 添加记忆\n     *\n     * @param airagKnowledgeDoc\n     * @return\n     */\n    @Operation(summary = \"添加记忆\")\n    @PostMapping(value = \"/plugin/add\")\n    public Result<?> add(@RequestBody AiragKnowledgeDoc airagKnowledgeDoc, HttpServletRequest request) {\n        if (oConvertUtils.isEmpty(airagKnowledgeDoc.getKnowledgeId())) {\n            return Result.error(\"知识库ID不能为空\");\n        }\n        if (oConvertUtils.isEmpty(airagKnowledgeDoc.getContent())) {\n            return Result.error(\"内容不能为空\");\n        }\n\n        // 设置默认值\n        if (oConvertUtils.isEmpty(airagKnowledgeDoc.getTitle())) {\n            // 取内容前20个字作为标题\n            String content = airagKnowledgeDoc.getContent();\n            String title = content.length() > 20 ? content.substring(0, 20) : content;\n            airagKnowledgeDoc.setTitle(title);\n        }\n\n        airagKnowledgeDoc.setType(LLMConsts.KNOWLEDGE_DOC_TYPE_TEXT);\n        // 保存并构建向量\n        return airagKnowledgeDocService.editDocument(airagKnowledgeDoc);\n    }\n\n    /**\n     * 查询记忆\n     *\n     * @param params\n     * @return\n     */\n    @Operation(summary = \"查询记忆\")\n    @PostMapping(value = \"/plugin/query\")\n    public Result<?> pluginQuery(@RequestBody Map<String, Object> params, HttpServletRequest request) {\n        String knowId = (String) params.get(\"knowledgeId\");\n        String queryText = (String) params.get(\"queryText\");\n        if (oConvertUtils.isEmpty(knowId)) {\n            return Result.error(\"知识库ID不能为空\");\n        }\n        if (oConvertUtils.isEmpty(queryText)) {\n            return Result.error(\"查询内容不能为空\");\n        }\n        LambdaQueryWrapper<AiragKnowledgeDoc> queryWrapper = new LambdaQueryWrapper<AiragKnowledgeDoc>();\n        queryWrapper.eq(AiragKnowledgeDoc::getKnowledgeId, knowId);\n        long count = airagKnowledgeDocService.count(queryWrapper);\n        if(count == 0){\n            return Result.ok(\"\");\n        }\n        // 默认查询前5条\n        KnowledgeSearchResult searchResp = embeddingHandler.embeddingSearch(Collections.singletonList(knowId), queryText, (int) count, null);\n        return Result.ok(searchResp);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/controller/AiragMcpController.java",
    "content": "package org.jeecg.modules.airag.llm.controller;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.modules.airag.llm.entity.AiragMcp;\nimport org.jeecg.modules.airag.llm.service.IAiragMcpService;\nimport org.jeecg.modules.airag.llm.dto.SaveToolsDTO;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\n\n/**\n * @Description: MCP\n * @Author: jeecg-boot\n * @Date: 2025-10-20\n * @Version: V1.0\n */\n@Tag(name = \"MCP\")\n@RestController(\"airagMcpController\")\n@RequestMapping(\"/airag/airagMcp\")\n@Slf4j\npublic class AiragMcpController extends JeecgController<AiragMcp, IAiragMcpService> {\n    @Autowired\n    private IAiragMcpService airagMcpService;\n\n    /**\n     * 分页列表查询\n     *\n     * @param airagMcp\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @Operation(summary = \"MCP-分页列表查询\")\n    @GetMapping(value = \"/list\")\n    public Result<IPage<AiragMcp>> queryPageList(AiragMcp airagMcp,\n                                                 @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                                 @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                                 HttpServletRequest req) {\n\n        QueryWrapper<AiragMcp> queryWrapper = QueryGenerator.initQueryWrapper(airagMcp, req.getParameterMap());\n        Page<AiragMcp> page = new Page<AiragMcp>(pageNo, pageSize);\n        IPage<AiragMcp> pageList = airagMcpService.page(page, queryWrapper);\n        return Result.OK(pageList);\n    }\n\n    /**\n     * 保存\n     *\n     * @param airagMcp\n     * @return\n     */\n    @Operation(summary = \"MCP-保存\")\n    @PostMapping(value = \"/save\")\n    public Result<String> save(@RequestBody AiragMcp airagMcp) {\n        return airagMcpService.edit(airagMcp);\n    }\n\n\n\n    /**\n     * 保存并同步\n     *\n     * @param airagMcp\n     * @return\n     * @author chenrui\n     * @date 2025/10/21 10:54\n     */\n    @Operation(summary = \"MCP-保存并同步\")\n    @PostMapping(value = \"/saveAndSync\")\n    public Result<?> saveAndSync(@RequestBody AiragMcp airagMcp) {\n        Result<String> saveResult = airagMcpService.edit(airagMcp);\n        if (!saveResult.isSuccess()) {\n            return saveResult;\n        }\n        String id = airagMcp.getId();\n        if (id == null || id.trim().isEmpty()) {\n            return Result.error(\"保存失败\");\n        }\n        return airagMcpService.sync(id);\n    }\n\n    /**\n     * 同步MCP信息\n     *\n     * @param id\n     * @return\n     * @author chenrui\n     * @date 2025/10/20 20:09\n     */\n    @Operation(summary = \"MCP-同步MCP信息\")\n    @PostMapping(value = \"/sync/{id}\")\n    public Result<?> sync(@PathVariable(name = \"id\", required = true) String id) {\n        return airagMcpService.sync(id);\n    }\n\n\n    /**\n     * 启用/禁用MCP信息\n     *\n     * @param action 启用：enable，禁用：disable\n     * @return\n     * @author chenrui\n     * @date 2025/10/20 20:13\n     */\n    @Operation(summary = \"MCP-启用/禁用MCP信息\")\n    @PostMapping(value = \"/status/{id}/{action}\")\n    public Result<?> toggleStatus(@PathVariable(name = \"id\",required = true) String id,\n                                  @PathVariable(name = \"action\", required = true) String action) {\n        return airagMcpService.toggleStatus(id,action);\n    }\n\n    /**\n     * 保存插件工具\n     * for [QQYUN-12453]【AI】支持插件\n     * @param dto 包含插件ID和工具列表JSON字符串的DTO\n     * @return\n     * @author chenrui\n     * @date 2025/10/30\n     */\n    @Operation(summary = \"MCP-保存插件工具\")\n    @PostMapping(value = \"/saveTools\")\n    public Result<String> saveTools(@RequestBody SaveToolsDTO dto) {\n        return airagMcpService.saveTools(dto.getId(), dto.getTools());\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @Operation(summary = \"MCP-通过id删除\")\n    @DeleteMapping(value = \"/delete\")\n    public Result<String> delete(@RequestParam(name = \"id\", required = true) String id) {\n        airagMcpService.removeById(id);\n        return Result.OK(\"删除成功!\");\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    @Operation(summary = \"MCP-通过id查询\")\n    @GetMapping(value = \"/queryById\")\n    public Result<AiragMcp> queryById(@RequestParam(name = \"id\", required = true) String id) {\n        AiragMcp airagMcp = airagMcpService.getById(id);\n        if (airagMcp == null) {\n            return Result.error(\"未找到对应数据\");\n        }\n        return Result.OK(airagMcp);\n    }\n\n    /**\n     * 导出excel\n     *\n     * @param request\n     * @param airagMcp\n     */\n//    @RequiresPermissions(\"llm:airag_mcp:exportXls\")\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, AiragMcp airagMcp) {\n        return super.exportXls(request, airagMcp, AiragMcp.class, \"MCP\");\n    }\n\n    /**\n     * 通过excel导入数据\n     *\n     * @param request\n     * @param response\n     * @return\n     */\n//    @RequiresPermissions(\"llm:airag_mcp:importExcel\")\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n        return super.importExcel(request, response, AiragMcp.class);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/controller/AiragModelController.java",
    "content": "package org.jeecg.modules.airag.llm.controller;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport dev.langchain4j.data.message.UserMessage;\nimport dev.langchain4j.model.embedding.EmbeddingModel;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.jeecg.ai.factory.AiModelFactory;\nimport org.jeecg.ai.factory.AiModelOptions;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.util.AssertUtils;\nimport org.jeecg.common.util.TokenUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.modules.airag.common.handler.AIChatParams;\nimport org.jeecg.modules.airag.llm.consts.LLMConsts;\nimport org.jeecg.modules.airag.llm.entity.AiragModel;\nimport org.jeecg.modules.airag.llm.handler.AIChatHandler;\nimport org.jeecg.modules.airag.llm.handler.EmbeddingHandler;\nimport org.jeecg.modules.airag.llm.service.IAiragModelService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.util.Arrays;\nimport java.util.Collections;\n\n/**\n * @Description: AiRag模型配置\n * @Author: jeecg-boot\n * @Date: 2025-02-14\n * @Version: V1.0\n */\n@Tag(name = \"AiRag模型配置\")\n@RestController\n@RequestMapping(\"/airag/airagModel\")\n@Slf4j\npublic class AiragModelController extends JeecgController<AiragModel, IAiragModelService> {\n    @Autowired\n    private IAiragModelService airagModelService;\n\n    @Autowired\n    AIChatHandler aiChatHandler;\n\n    /**\n     * 分页列表查询\n     *\n     * @param airagModel\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @GetMapping(value = \"/list\")\n    public Result<IPage<AiragModel>> queryPageList(AiragModel airagModel, @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo, @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize, HttpServletRequest req) {\n        QueryWrapper<AiragModel> queryWrapper = QueryGenerator.initQueryWrapper(airagModel, req.getParameterMap());\n        Page<AiragModel> page = new Page<AiragModel>(pageNo, pageSize);\n        IPage<AiragModel> pageList = airagModelService.page(page, queryWrapper);\n        return Result.OK(pageList);\n    }\n\n    /**\n     * 添加\n     *\n     * @param airagModel\n     * @return\n     */\n    @PostMapping(value = \"/add\")\n    @RequiresPermissions(\"airag:model:add\")\n    public Result<String> add(@RequestBody AiragModel airagModel) {\n        // 验证 模型名称/模型类型/基础模型\n        AssertUtils.assertNotEmpty(\"模型名称不能为空\", airagModel.getName());\n        AssertUtils.assertNotEmpty(\"模型类型不能为空\", airagModel.getModelType());\n        AssertUtils.assertNotEmpty(\"基础模型不能为空\", airagModel.getModelName());\n        // 默认未激活\n        if(oConvertUtils.isObjectEmpty(airagModel.getActivateFlag())){\n            airagModel.setActivateFlag(0);\n        } else {\n            airagModel.setActivateFlag(1);\n        }\n        airagModelService.save(airagModel);\n        return Result.OK(\"添加成功！\");\n    }\n\n    /**\n     * 编辑\n     *\n     * @param airagModel\n     * @return\n     */\n    @RequestMapping(value = \"/edit\", method = {RequestMethod.PUT, RequestMethod.POST})\n    @RequiresPermissions(\"airag:model:edit\")\n    public Result<String> edit(@RequestBody AiragModel airagModel) {\n        airagModelService.updateById(airagModel);\n        return Result.OK(\"编辑成功!\");\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @DeleteMapping(value = \"/delete\")\n    @RequiresPermissions(\"airag:model:delete\")\n    public Result<String> delete(HttpServletRequest request, @RequestParam(name = \"id\", required = true) String id) {\n        //update-begin---author:chenrui ---date:20250606  for：[issues/8337]关于ai工作列表的数据权限问题 #8337------------\n        //如果是saas隔离的情况下，判断当前租户id是否是当前租户下的\n        if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n            AiragModel model = airagModelService.getById(id);\n            //获取当前租户\n            String currentTenantId = TokenUtils.getTenantIdByRequest(request);\n            if (null == model || !model.getTenantId().equals(currentTenantId)) {\n                return Result.error(\"删除AI模型失败，不能删除其他租户的AI模型！\");\n            }\n        }\n        //update-end---author:chenrui ---date:20250606  for：[issues/8337]关于ai工作列表的数据权限问题 #8337------------\n        airagModelService.removeById(id);\n        return Result.OK(\"删除成功!\");\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    @GetMapping(value = \"/queryById\")\n    public Result<AiragModel> queryById(@RequestParam(name = \"id\", required = true) String id) {\n        AiragModel airagModel = airagModelService.getById(id);\n        if (airagModel == null) {\n            return Result.error(\"未找到对应数据\");\n        }\n        return Result.OK(airagModel);\n    }\n\n    /**\n     * 导出excel\n     *\n     * @param request\n     * @param airagModel\n     */\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, AiragModel airagModel) {\n        return super.exportXls(request, airagModel, AiragModel.class, \"AiRag模型配置\");\n    }\n\n    /**\n     * 通过excel导入数据\n     *\n     * @param request\n     * @param response\n     * @return\n     */\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n        return super.importExcel(request, response, AiragModel.class);\n    }\n\n    @PostMapping(value = \"/test\")\n    public Result<?> test(@RequestBody AiragModel airagModel) {\n        // 验证 模型名称/模型类型/基础模型\n        AssertUtils.assertNotEmpty(\"模型名称不能为空\", airagModel.getName());\n        AssertUtils.assertNotEmpty(\"模型类型不能为空\", airagModel.getModelType());\n        AssertUtils.assertNotEmpty(\"基础模型不能为空\", airagModel.getModelName());\n        try {\n            if(LLMConsts.MODEL_TYPE_LLM.equals(airagModel.getModelType())){\n                aiChatHandler.completions(airagModel, Collections.singletonList(UserMessage.from(\"To test whether it can be successfully called, simply return success\")), null);\n            }else if(LLMConsts.MODEL_TYPE_EMBED.equals(airagModel.getModelType())){\n                AiModelOptions aiModelOptions = EmbeddingHandler.buildModelOptions(airagModel);\n                EmbeddingModel embeddingModel = AiModelFactory.createEmbeddingModel(aiModelOptions);\n                embeddingModel.embed(\"test text\");\n            //update-begin---author:wangshuai---date:2026-01-07---for:【QQYUN-12145】【AI】AI 绘画创作---=\n            }else if(LLMConsts.MODEL_TYPE_IMAGE.equals(airagModel.getModelType())){\n                AIChatParams aiChatParams = new AIChatParams();\n                aiChatHandler.imageGenerate(airagModel, \"To test whether it can be successfully called, simply return success\", aiChatParams);\n            }\n            //update-end---author:wangshuai---date:2026-01-07---for:【QQYUN-12145】【AI】AI 绘画创作---\n        }catch (Exception e){\n            log.error(\"测试模型连接失败\", e);\n            return Result.error(e.getMessage());\n        }\n        // 测试成功激活数据\n        airagModel.setActivateFlag(1);\n        airagModelService.updateById(airagModel);\n        return Result.OK(\"\");\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/document/TikaDocumentParser.java",
    "content": "//\n// Source code recreated from a .class file by IntelliJ IDEA\n// (powered by FernFlower decompiler)\n//\n\npackage org.jeecg.modules.airag.llm.document;\n\nimport dev.langchain4j.data.document.BlankDocumentException;\nimport dev.langchain4j.data.document.Document;\nimport dev.langchain4j.data.document.parser.apache.poi.ApachePoiDocumentParser;\nimport dev.langchain4j.internal.Utils;\nimport org.apache.commons.io.FilenameUtils;\nimport org.apache.poi.hslf.usermodel.HSLFTextParagraph;\nimport org.apache.poi.hwpf.HWPFDocument;\nimport org.apache.poi.hwpf.extractor.WordExtractor;\nimport org.apache.poi.ss.usermodel.*;\nimport org.apache.poi.xslf.usermodel.XMLSlideShow;\nimport org.apache.poi.xslf.usermodel.XSLFSlide;\nimport org.apache.poi.xslf.usermodel.XSLFTextShape;\nimport org.apache.poi.xwpf.usermodel.XWPFDocument;\nimport org.apache.poi.xwpf.usermodel.XWPFParagraph;\nimport org.apache.tika.Tika;\nimport org.apache.tika.exception.ZeroByteFileException;\nimport org.apache.tika.metadata.Metadata;\nimport org.apache.tika.parser.AutoDetectParser;\nimport org.apache.tika.parser.ParseContext;\nimport org.apache.tika.parser.Parser;\nimport org.apache.tika.sax.BodyContentHandler;\nimport org.jeecg.common.util.AssertUtils;\nimport org.xml.sax.ContentHandler;\n\nimport java.io.*;\nimport java.util.Arrays;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.function.Supplier;\nimport java.util.stream.Collectors;\n\n/**\n * tika文档解析器,重写langchain4j的TikaDocumentParser <br/>\n * jeecgboot目前不支持poi5.x,所以langchain4j同的方法不能用,自己实现\n * @author chenrui\n * @date 2025/3/5 16:19\n */\npublic class TikaDocumentParser {\n    private static final Tika tika = new Tika();\n    private static final int NO_WRITE_LIMIT = -1;\n    public static final Supplier<Parser> DEFAULT_PARSER_SUPPLIER = AutoDetectParser::new;\n    public static final Supplier<Metadata> DEFAULT_METADATA_SUPPLIER = Metadata::new;\n    public static final Supplier<ParseContext> DEFAULT_PARSE_CONTEXT_SUPPLIER = ParseContext::new;\n    public static final Supplier<ContentHandler> DEFAULT_CONTENT_HANDLER_SUPPLIER = () -> new BodyContentHandler(-1);\n    private final Supplier<Parser> parserSupplier;\n    private final Supplier<ContentHandler> contentHandlerSupplier;\n    private final Supplier<Metadata> metadataSupplier;\n    private final Supplier<ParseContext> parseContextSupplier;\n    //文件前缀\n    private static final Set<String> FILE_SUFFIX = new HashSet<>(Arrays.asList(\"docx\", \"doc\", \"pptx\", \"ppt\", \"xlsx\", \"xls\"));\n\n    public TikaDocumentParser() {\n        this((Supplier) ((Supplier) null), (Supplier) null, (Supplier) null, (Supplier) null);\n    }\n\n\n    public TikaDocumentParser(Supplier<Parser> parserSupplier, Supplier<ContentHandler> contentHandlerSupplier, Supplier<Metadata> metadataSupplier, Supplier<ParseContext> parseContextSupplier) {\n        this.parserSupplier = (Supplier) Utils.getOrDefault(parserSupplier, () -> DEFAULT_PARSER_SUPPLIER);\n        this.contentHandlerSupplier = (Supplier) Utils.getOrDefault(contentHandlerSupplier, () -> DEFAULT_CONTENT_HANDLER_SUPPLIER);\n        this.metadataSupplier = (Supplier) Utils.getOrDefault(metadataSupplier, () -> DEFAULT_METADATA_SUPPLIER);\n        this.parseContextSupplier = (Supplier) Utils.getOrDefault(parseContextSupplier, () -> DEFAULT_PARSE_CONTEXT_SUPPLIER);\n    }\n\n    public Document parse(File file) {\n        AssertUtils.assertNotEmpty(\"请选择文件\", file);\n        try {\n            // 用于解析(使用FileInputStream避免file.toPath()在Linux非UTF-8环境下中文文件名报错)\n            InputStream isForParsing = new FileInputStream(file);\n            // 使用 Tika 自动检测 MIME 类型\n            String fileName = file.getName().toLowerCase();\n            //后缀\n            String ext = FilenameUtils.getExtension(fileName);\n            if (fileName.endsWith(\".txt\")\n                    || fileName.endsWith(\".md\")\n                    || fileName.endsWith(\".pdf\")) {\n                return extractByTika(isForParsing);\n            //update-begin---author:wangshuai---date:2026-01-09---for:【QQYUN-14261】【AI】AI助手，支持多模态能力- 文档---\n            } else if (FILE_SUFFIX.contains(ext.toLowerCase())) {\n                return parseDocExcelPdfUsingApachePoi(file);\n            //update-end---author:wangshuai---date:2026-01-09---for:【QQYUN-14261】【AI】AI助手，支持多模态能力- 文档---\n            } else {\n                throw new IllegalArgumentException(\"不支持的文件格式: \" + FilenameUtils.getExtension(fileName));\n            }\n        } catch (IOException e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    /**\n     * langchain4j 内部解析器\n     * @param file\n     * @return\n     */\n    public Document parseDocExcelPdfUsingApachePoi(File file) {\n        AssertUtils.assertNotEmpty(\"请选择文件\", file);\n        try (InputStream inputStream = new FileInputStream(file)) {\n            ApachePoiDocumentParser parser = new ApachePoiDocumentParser();\n            Document document = parser.parse(inputStream);\n            if (document == null || Utils.isNullOrBlank(document.text())) {\n                return null;\n            }\n            return document;\n        } catch (BlankDocumentException e) {\n            return null;\n        } catch (IOException e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    private static Document tryExtractDocOrDocx(InputStream inputStream) throws IOException {\n        try {\n            // 先尝试 DOCX（基于 OPC XML 格式）\n            return extractTextFromDocx(inputStream);\n        } catch (Exception e1) {\n            try {\n                // 如果 DOCX 解析失败，则尝试 DOC（基于二进制格式）\n                return extractTextFromDoc(inputStream);\n            } catch (Exception e2) {\n                throw new IOException(\"无法解析 DOC 或 DOCX 文件\", e2);\n            }\n        }\n    }\n\n    /**\n     * 使用tika提取文件内容 <br/>\n     * pdf/text/md等文件使用tika提取\n     *\n     * @param inputStream\n     * @return\n     * @author chenrui\n     * @date 2025/3/5 14:41\n     */\n    private Document extractByTika(InputStream inputStream) {\n        try {\n            Parser parser = (Parser) this.parserSupplier.get();\n            ContentHandler contentHandler = (ContentHandler) this.contentHandlerSupplier.get();\n            Metadata metadata = (Metadata) this.metadataSupplier.get();\n            ParseContext parseContext = (ParseContext) this.parseContextSupplier.get();\n            parser.parse(inputStream, contentHandler, metadata, parseContext);\n            String text = contentHandler.toString();\n            if (Utils.isNullOrBlank(text)) {\n                throw new BlankDocumentException();\n            } else {\n                return Document.from(text);\n            }\n        } catch (BlankDocumentException e) {\n            throw e;\n        } catch (ZeroByteFileException var8) {\n            throw new BlankDocumentException();\n        } catch (Exception e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    /**\n     * 提取docx文件内容\n     *\n     * @param inputStream\n     * @return\n     * @throws IOException\n     * @author chenrui\n     * @date 2025/3/5 14:42\n     * @deprecated 因为jeecg主项目目前不支持poi5.x, 自己实现提取功能.\n     */\n    @Deprecated\n    private static Document extractTextFromDocx(InputStream inputStream) throws IOException {\n        try (XWPFDocument document = new XWPFDocument(inputStream)) {\n            StringBuilder text = new StringBuilder();\n            for (XWPFParagraph para : document.getParagraphs()) {\n                text.append(para.getText()).append(\"\\n\");\n            }\n            return Document.from(text.toString());\n        }\n    }\n\n    /**\n     * 提取doc文件内容\n     *\n     * @param inputStream\n     * @return\n     * @throws IOException\n     * @author chenrui\n     * @date 2025/3/5 14:42\n     * @deprecated 因为jeecg主项目目前不支持poi5.x, 自己实现提取功能.\n     */\n    @Deprecated\n    private static Document extractTextFromDoc(InputStream inputStream) throws IOException {\n        try (HWPFDocument document = new HWPFDocument(inputStream);\n             WordExtractor extractor = new WordExtractor(document)) {\n            return Document.from(extractor.getText());\n        }\n    }\n\n    /**\n     * 提取excel文件内容\n     *\n     * @param inputStream\n     * @return\n     * @throws IOException\n     * @author chenrui\n     * @date 2025/3/5 14:43\n     * @deprecated 因为jeecg主项目目前不支持poi5.x, 自己实现提取功能.\n     */\n    @Deprecated\n    private static Document extractTextFromExcel(InputStream inputStream) throws IOException {\n        try (Workbook workbook = WorkbookFactory.create(inputStream)) {\n            StringBuilder text = new StringBuilder();\n            for (Sheet sheet : workbook) {\n                text.append(\"Sheet: \").append(sheet.getSheetName()).append(\"\\n\");\n                for (Row row : sheet) {\n                    for (Cell cell : row) {\n                        text.append(cell.toString()).append(\"\\t\");\n                    }\n                    text.append(\"\\n\");\n                }\n                text.append(\"\\n\");\n            }\n            return Document.from(text.toString());\n        }\n    }\n\n    /**\n     * 提取pptx文件内容\n     *\n     * @param inputStream\n     * @return\n     * @throws IOException\n     * @author chenrui\n     * @date 2025/3/5 14:43\n     * @deprecated 因为jeecg主项目目前不支持poi5.x, 自己实现提取功能.\n     */\n    @Deprecated\n    private static Document extractTextFromPptx(InputStream inputStream) throws IOException {\n        try (XMLSlideShow ppt = new XMLSlideShow(inputStream)) {\n            StringBuilder text = new StringBuilder();\n            for (XSLFSlide slide : ppt.getSlides()) {\n                text.append(\"Slide \").append(slide.getSlideNumber()).append(\":\\n\");\n                List<XSLFTextShape> shapes = slide.getShapes().stream()\n                        .filter(s -> s instanceof XSLFTextShape)\n                        .map(s -> (XSLFTextShape) s)\n                        .collect(Collectors.toList());\n                for (XSLFTextShape shape : shapes) {\n                    text.append(shape.getText()).append(\"\\n\");\n                }\n                text.append(\"\\n\");\n            }\n            return Document.from(text.toString());\n        }\n    }\n\n    /**\n     * 提取ppt文件内容\n     *\n     * @param inputStream\n     * @return\n     * @throws IOException\n     * @author chenrui\n     * @date 2025/3/5 14:43\n     * @deprecated 因为jeecg主项目目前不支持poi5.x, 自己实现提取功能.\n     */\n    @Deprecated\n    private static Document extractTextFromPpt(InputStream inputStream) throws IOException {\n        try (org.apache.poi.hslf.usermodel.HSLFSlideShow ppt = new org.apache.poi.hslf.usermodel.HSLFSlideShow(inputStream)) {\n            StringBuilder text = new StringBuilder();\n            for (org.apache.poi.hslf.usermodel.HSLFSlide slide : ppt.getSlides()) {\n                text.append(\"Slide \").append(slide.getSlideNumber()).append(\":\\n\");\n                for (List<HSLFTextParagraph> shapes : slide.getTextParagraphs()) {\n                    text.append(HSLFTextParagraph.getText(shapes)).append(\"\\n\");\n                }\n                text.append(\"\\n\");\n            }\n            return Document.from(text.toString());\n        }\n    }\n\n    private static byte[] toByteArray(InputStream inputStream) throws IOException {\n        ByteArrayOutputStream buffer = new ByteArrayOutputStream();\n        byte[] data = new byte[1024];\n        int nRead;\n        while ((nRead = inputStream.read(data, 0, data.length)) != -1) {\n            buffer.write(data, 0, nRead);\n        }\n        return buffer.toByteArray();\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/dto/SaveToolsDTO.java",
    "content": "package org.jeecg.modules.airag.llm.dto;\n\nimport lombok.Data;\n\n/**\n * 保存插件工具DTO\n * fro [QQYUN-12453]【AI】支持插件\n * @author chenrui\n * @date 2025/10/30\n */\n@Data\npublic class SaveToolsDTO {\n    /**\n     * 插件ID\n     */\n    private String id;\n\n    /**\n     * 工具列表JSON字符串\n     */\n    private String tools;\n}\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/entity/AiragKnowledge.java",
    "content": "package org.jeecg.modules.airag.llm.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\n\n/**\n * @Description: AIRag知识库\n * @Author: jeecg-boot\n * @Date: 2025-02-18\n * @Version: V1.0\n */\n@Schema(description=\"AIRag知识库\")\n@Data\n@TableName(\"airag_knowledge\")\npublic class AiragKnowledge implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * 主键\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"主键\")\n    private java.lang.String id;\n\n    /**\n     * 创建人\n     */\n    @Schema(description = \"创建人\")\n    @Dict(dictTable = \"sys_user\",dicCode = \"username\",dicText = \"realname\")\n    private java.lang.String createBy;\n\n    /**\n     * 创建日期\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建日期\")\n    private java.util.Date createTime;\n\n    /**\n     * 更新人\n     */\n    @Schema(description = \"更新人\")\n    private java.lang.String updateBy;\n\n    /**\n     * 更新日期\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"更新日期\")\n    private java.util.Date updateTime;\n\n    /**\n     * 所属部门\n     */\n    @Schema(description = \"所属部门\")\n    private java.lang.String sysOrgCode;\n\n    /**\n     * 租户id\n     */\n    @Excel(name = \"租户id\", width = 15)\n    @Schema(description = \"租户id\")\n    private java.lang.String tenantId;\n\n    /**\n     * 知识库名称\n     */\n    @Excel(name = \"知识库名称\", width = 15)\n    @Schema(description = \"知识库名称\")\n    private java.lang.String name;\n\n    /**\n     * 向量模型id\n     */\n    @Excel(name = \"向量模型id\", width = 15, dictTable = \"airag_model where model_type = 'EMBED'\", dicText = \"name\", dicCode = \"id\")\n    @Dict(dictTable = \"airag_model where model_type = 'EMBED'\", dicText = \"name\", dicCode = \"id\")\n    @Schema(description = \"向量模型id\")\n    private java.lang.String embedId;\n\n    /**\n     * 描述\n     */\n    @Excel(name = \"描述\", width = 15)\n    @Schema(description = \"描述\")\n    private java.lang.String descr;\n\n    /**\n     * 状态\n     */\n    @Excel(name = \"状态\", width = 15)\n    @Schema(description = \"状态\")\n    private java.lang.String status;\n\n    /**\n     * 类型(knowledge知识 memory 记忆)\n     */\n    @Excel(name=\"类型(knowledge知识 memory 记忆)\", width = 15)\n    @Schema(description = \"类型(knowledge知识 memory 记忆)\")\n    private java.lang.String type;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/entity/AiragKnowledgeDoc.java",
    "content": "package org.jeecg.modules.airag.llm.entity;\n\nimport java.io.Serializable;\n\nimport com.baomidou.mybatisplus.annotation.*;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecg.common.constant.ProvinceCityArea;\nimport org.jeecg.common.util.SpringContextUtils;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\n\nimport java.util.Date;\n\n\nimport io.swagger.v3.oas.annotations.media.Schema;\n\nimport java.io.UnsupportedEncodingException;\n\n/**\n * @Description: airag知识库文档\n * @Author: jeecg-boot\n * @Date: 2025-02-18\n * @Version: V1.0\n */\n@Schema(description=\"airag知识库文档\")\n@Data\n@TableName(\"airag_knowledge_doc\")\npublic class AiragKnowledgeDoc implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * 主键\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"主键\")\n    private String id;\n\n    /**\n     * 创建人\n     */\n    @Schema(description = \"创建人\")\n    @Dict(dictTable = \"sys_user\",dicCode = \"username\",dicText = \"realname\")\n    private String createBy;\n\n    /**\n     * 创建日期\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建日期\")\n    private Date createTime;\n\n    /**\n     * 更新人\n     */\n    @Schema(description = \"更新人\")\n    private String updateBy;\n\n    /**\n     * 更新日期\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"更新日期\")\n    private Date updateTime;\n\n    /**\n     * 所属部门\n     */\n    @Schema(description = \"所属部门\")\n    private String sysOrgCode;\n\n    /**\n     * 租户id\n     */\n    @Excel(name = \"租户id\", width = 15)\n    @Schema(description = \"租户id\")\n    private String tenantId;\n\n    /**\n     * 知识库id\n     */\n    @Schema(description = \"知识库id\")\n    private String knowledgeId;\n\n    /**\n     * 标题\n     */\n    @Excel(name = \"标题\", width = 15)\n    @Schema(description = \"标题\")\n    private String title;\n\n    /**\n     * 类型\n     */\n    @Excel(name = \"类型\", width = 15, dicCode = \"know_doc_type\")\n    @Schema(description = \"类型\")\n    private String type;\n\n    /**\n     * 内容\n     */\n    @Excel(name = \"内容\", width = 15)\n    @Schema(description = \"内容\")\n    private String content;\n\n    /**\n     * 元数据,存储上传文件的存储目录以及网站站点 <br/>\n     * eg. {\"filePath\":\"https://xxxxxx\",\"website\":\"http://hellp.jeecg.com\"}\n     */\n    @Excel(name = \"元数据\", width = 15)\n    @Schema(description = \"元数据\")\n    private String metadata;\n\n    /**\n     * 状态\n     */\n    @Excel(name = \"状态\", width = 15)\n    @Schema(description = \"状态\")\n    private String status;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/entity/AiragMcp.java",
    "content": "package org.jeecg.modules.airag.llm.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\n\n/**\n * @Description: MCP\n * @Author: jeecg-boot\n * @Date: 2025-10-20\n * @Version: V1.0\n */\n@Data\n@TableName(\"airag_mcp\")\n@Accessors(chain = true)\n@EqualsAndHashCode(callSuper = false)\n@Schema(description = \"MCP\")\npublic class AiragMcp implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * id\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"id\")\n    private java.lang.String id;\n    /**\n     * 应用图标\n     */\n    @Excel(name = \"应用图标\", width = 15)\n    @Schema(description = \"应用图标\")\n    private java.lang.String icon;\n    /**\n     * 名称\n     */\n    @Excel(name = \"名称\", width = 15)\n    @Schema(description = \"名称\")\n    private java.lang.String name;\n    /**\n     * 描述\n     */\n    @Excel(name = \"描述\", width = 15)\n    @Schema(description = \"描述\")\n    private java.lang.String descr;\n    /**\n     * 类型（plugin=插件，mcp=MCP）\n     * for [QQYUN-12453]【AI】支持插件\n     */\n    @Excel(name = \"类型（plugin=插件，mcp=MCP）\", width = 15)\n    @Schema(description = \"类型（plugin=插件，mcp=MCP）\")\n    private java.lang.String category;\n    /**\n     * mcp类型（sse：sse类型；stdio：标准类型）\n     */\n    @Excel(name = \"mcp类型（sse：sse类型；stdio：标准类型）\", width = 15)\n    @Schema(description = \"mcp类型（sse：sse类型；stdio：标准类型）\")\n    private java.lang.String type;\n    /**\n     * 服务端点（SSE类型为URL，stdio类型为命令）\n     */\n    @Excel(name = \"服务端点（SSE类型为URL，stdio类型为命令）\", width = 15)\n    @Schema(description = \"服务端点（SSE类型为URL，stdio类型为命令）\")\n    private java.lang.String endpoint;\n    /**\n     * 请求头（sse类型）、环境变量（stdio类型）\n     */\n    @Excel(name = \"请求头（sse类型）、环境变量（stdio类型）\", width = 15)\n    @Schema(description = \"请求头（sse类型）、环境变量（stdio类型）\")\n    private java.lang.String headers;\n    /**\n     * 工具列表\n     */\n    @Excel(name = \"工具列表\", width = 15)\n    @Schema(description = \"工具列表\")\n    private java.lang.String tools;\n    /**\n     * 状态（enable=启用、disable=禁用）\n     */\n    @Excel(name = \"状态（enable=启用、disable=禁用）\", width = 15)\n    @Schema(description = \"状态（enable=启用、disable=禁用）\")\n    private java.lang.String status;\n    /**\n     * 是否同步\n     */\n    @Excel(name = \"是否同步\", width = 15)\n    @Schema(description = \"是否同步\")\n    private java.lang.Integer synced;\n    /**\n     * 元数据\n     */\n    @Excel(name = \"元数据\", width = 15)\n    @Schema(description = \"元数据\")\n    private java.lang.String metadata;\n    /**\n     * 创建人\n     */\n    @Schema(description = \"创建人\")\n    private java.lang.String createBy;\n    /**\n     * 创建日期\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建日期\")\n    private java.util.Date createTime;\n    /**\n     * 更新人\n     */\n    @Schema(description = \"更新人\")\n    private java.lang.String updateBy;\n    /**\n     * 更新日期\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"更新日期\")\n    private java.util.Date updateTime;\n    /**\n     * 所属部门\n     */\n    @Schema(description = \"所属部门\")\n    private java.lang.String sysOrgCode;\n    /**\n     * 租户id\n     */\n    @Excel(name = \"租户id\", width = 15)\n    @Schema(description = \"租户id\")\n    private java.lang.String tenantId;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/entity/AiragModel.java",
    "content": "package org.jeecg.modules.airag.llm.entity;\n\nimport java.io.Serializable;\nimport java.io.UnsupportedEncodingException;\nimport java.util.Date;\nimport java.math.BigDecimal;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport org.jeecg.common.constant.ProvinceCityArea;\nimport org.jeecg.common.util.SpringContextUtils;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.jeecg.common.aspect.annotation.Dict;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\n/**\n * @Description: AiRag模型配置\n * @Author: jeecg-boot\n * @Date: 2025-02-17\n * @Version: V1.0\n */\n@Data\n@TableName(\"airag_model\")\n@Accessors(chain = true)\n@EqualsAndHashCode(callSuper = false)\n@Schema(description=\"AiRag模型配置\")\npublic class AiragModel implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * 主键\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"主键\")\n    private String id;\n    /**\n     * 创建人\n     */\n    @Schema(description = \"创建人\")\n    @Dict(dictTable = \"sys_user\",dicCode = \"username\",dicText = \"realname\")\n    private String createBy;\n    /**\n     * 创建日期\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建日期\")\n    private Date createTime;\n    /**\n     * 更新人\n     */\n    @Schema(description = \"更新人\")\n    private String updateBy;\n    /**\n     * 更新日期\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"更新日期\")\n    private Date updateTime;\n    /**\n     * 所属部门\n     */\n    @Schema(description = \"所属部门\")\n    private String sysOrgCode;\n    /**\n     * 租户id\n     */\n    @Excel(name = \"租户id\", width = 15)\n    @Schema(description = \"租户id\")\n    private String tenantId;\n    /**\n     * 名称\n     */\n    @Excel(name = \"名称\", width = 15)\n    @Schema(description = \"名称\")\n    private String name;\n    /**\n     * 供应者\n     */\n    @Excel(name = \"供应者\", width = 15, dicCode = \"model_provider\")\n    @Dict(dicCode = \"model_provider\")\n    @Schema(description = \"供应者\")\n    private String provider;\n    /**\n     * 模型类型\n     */\n    @Excel(name = \"模型类型\", width = 15, dicCode = \"model_type\")\n    @Dict(dicCode = \"model_type\")\n    @Schema(description = \"模型类型\")\n    private String modelType;\n    /**\n     * 模型名称\n     */\n    @Excel(name = \"模型名称\", width = 15)\n    @Schema(description = \"模型名称\")\n    private String modelName;\n    /**\n     * API域名\n     */\n    @Excel(name = \"API域名\", width = 15)\n    @Schema(description = \"API域名\")\n    private String baseUrl;\n    /**\n     * 凭证信息\n     */\n    @Excel(name = \"凭证信息\", width = 15)\n    @Schema(description = \"凭证信息\")\n    private String credential;\n    /**\n     * 模型参数\n     */\n    @Excel(name = \"模型参数\", width = 15)\n    @Schema(description = \"模型参数\")\n    private String modelParams;\n\n    /**\n     * 是否激活(0=未激活,1=已激活)\n     */\n    @Excel(name = \"是否激活\", width = 15)\n    @Schema(description = \"是否激活\")\n    private Integer activateFlag;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/AIChatHandler.java",
    "content": "package org.jeecg.modules.airag.llm.handler;\n\nimport com.alibaba.fastjson.JSONObject;\nimport dev.langchain4j.agent.tool.ToolSpecification;\nimport dev.langchain4j.data.message.*;\nimport dev.langchain4j.exception.InvalidRequestException;\nimport dev.langchain4j.exception.ToolExecutionException;\nimport dev.langchain4j.mcp.McpToolProvider;\nimport dev.langchain4j.rag.query.router.QueryRouter;\nimport dev.langchain4j.service.TokenStream;\nimport dev.langchain4j.service.tool.ToolExecutor;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.ai.handler.LLMHandler;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.util.AssertUtils;\nimport org.jeecg.common.util.filter.SsrfFileTypeFilter;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.airag.common.consts.AiragConsts;\nimport org.jeecg.modules.airag.common.handler.AIChatParams;\nimport org.jeecg.modules.airag.common.handler.IAIChatHandler;\nimport org.jeecg.modules.airag.common.handler.McpToolProviderWrapper;\nimport org.jeecg.modules.airag.llm.consts.LLMConsts;\nimport org.jeecg.modules.airag.llm.entity.AiragMcp;\nimport org.jeecg.modules.airag.llm.entity.AiragModel;\nimport org.jeecg.modules.airag.llm.mapper.AiragMcpMapper;\nimport org.jeecg.modules.airag.llm.mapper.AiragModelMapper;\nimport org.jeecg.config.AiRagConfigBean;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Component;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\nimport java.util.*;\nimport java.util.regex.Matcher;\nimport java.util.stream.Collectors;\n\n/**\n * 大模型聊天工具类\n *\n * @Author: chenrui\n * @Date: 2025/2/18 14:31\n */\n@Slf4j\n@Component\npublic class AIChatHandler implements IAIChatHandler {\n\n    @Autowired\n    AiragModelMapper airagModelMapper;\n\n    @Autowired\n    AiragMcpMapper airagMcpMapper;\n\n    @Autowired\n    EmbeddingHandler embeddingHandler;\n\n    @Autowired\n    LLMHandler llmHandler;\n\n    @Autowired\n    AiRagConfigBean aiRagConfigBean;\n\n    @Value(value = \"${jeecg.path.upload:}\")\n    private String uploadpath;\n\n    /**\n     * 问答\n     *\n     * @param modelId\n     * @param messages\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 21:03\n     */\n    @Override\n    public String completions(String modelId, List<ChatMessage> messages) {\n        AssertUtils.assertNotEmpty(\"至少发送一条消息\", messages);\n        AssertUtils.assertNotEmpty(\"请选择模型\", modelId);\n        // 整理消息\n        return completions(modelId, messages, null);\n    }\n\n    /**\n     * 问答\n     *\n     * @param modelId\n     * @param messages\n     * @param params\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 21:03\n     */\n    @Override\n    public String completions(String modelId, List<ChatMessage> messages, AIChatParams params) {\n        AssertUtils.assertNotEmpty(\"至少发送一条消息\", messages);\n        AssertUtils.assertNotEmpty(\"请选择模型\", modelId);\n\n        AiragModel airagModel = airagModelMapper.getByIdIgnoreTenant(modelId);\n        AssertUtils.assertSame(\"模型未激活,请先在[AI模型配置]中[测试激活]模型\", airagModel.getActivateFlag(), 1);\n        return completions(airagModel, messages, params);\n    }\n\n    /**\n     * 问答\n     *\n     * @param airagModel\n     * @param messages\n     * @param params\n     * @return\n     * @author chenrui\n     * @date 2025/2/24 17:30\n     */\n    public String completions(AiragModel airagModel, List<ChatMessage> messages, AIChatParams params) {\n        params = mergeParams(airagModel, params);\n        String resp;\n        try {\n            resp = llmHandler.completions(messages, params);\n        } catch (ToolExecutionException | InvalidRequestException e) {\n            log.error(e.getMessage(), e);\n            return \"\";\n        } catch (Exception e) {\n            // langchain4j 异常友好提示\n            String errMsg = \"调用大模型接口失败，详情请查看后台日志。\";\n            if (oConvertUtils.isNotEmpty(e.getMessage())) {\n                String exceptionMsg = e.getMessage();\n                \n                // 检查是否是工具调用消息序列不完整的异常\n                if (exceptionMsg.contains(\"messages with role 'tool' must be a response to a preceeding message with 'tool_calls'\")) {\n                    errMsg = \"消息序列不完整，可能是因为历史消息数量设置过小导致工具调用上下文丢失。建议增加历史消息数量后重试。\";\n                    log.error(\"AI模型调用异常: 工具调用消息序列不完整，建议增加历史消息数量。异常详情: {}\", exceptionMsg, e);\n                    throw new JeecgBootException(errMsg);\n                }\n                \n                // 根据常见异常关键字做细致翻译\n                for (Map.Entry<String, String> entry : MODEL_ERROR_MAP.entrySet()) {\n                    String key = entry.getKey();\n                    String value = entry.getValue();\n                    if (exceptionMsg.contains(key)) {\n                        errMsg = value;\n                        break;\n                    }\n                }\n            }\n            log.error(\"AI模型调用异常: {}\", errMsg, e);\n            throw new JeecgBootException(errMsg);\n        }\n        if (resp.contains(\"</think>\")\n                && (null == params.getNoThinking() || params.getNoThinking())) {\n            String[] thinkSplit = resp.split(\"</think>\");\n            resp = thinkSplit[thinkSplit.length - 1];\n        }\n        return resp;\n    }\n\n    /**\n     * 使用默认模型问答\n     *\n     * @param messages\n     * @param params\n     * @return\n     * @author chenrui\n     * @date 2025/3/12 15:13\n     */\n    @Override\n    public String completionsByDefaultModel(List<ChatMessage> messages, AIChatParams params) {\n        return completions(new AiragModel(), messages, params);\n    }\n\n    /**\n     * 聊天(流式)\n     *\n     * @param modelId\n     * @param messages\n     * @return\n     * @author chenrui\n     * @date 2025/2/20 21:06\n     */\n    @Override\n    public TokenStream chat(String modelId, List<ChatMessage> messages) {\n        return chat(modelId, messages, null);\n    }\n\n    /**\n     * 聊天(流式)\n     *\n     * @param modelId\n     * @param messages\n     * @param params\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 21:03\n     */\n    @Override\n    public TokenStream chat(String modelId, List<ChatMessage> messages, AIChatParams params) {\n        AssertUtils.assertNotEmpty(\"至少发送一条消息\", messages);\n        AssertUtils.assertNotEmpty(\"请选择模型\", modelId);\n\n        AiragModel airagModel = airagModelMapper.getByIdIgnoreTenant(modelId);\n        AssertUtils.assertSame(\"模型未激活,请先在[AI模型配置]中[测试激活]模型\", airagModel.getActivateFlag(), 1);\n        return chat(airagModel, messages, params);\n    }\n\n    /**\n     * 聊天(流式)\n     *\n     * @param airagModel\n     * @param messages\n     * @param params\n     * @return\n     * @author chenrui\n     * @date 2025/2/24 17:29\n     */\n    private TokenStream chat(AiragModel airagModel, List<ChatMessage> messages, AIChatParams params) {\n        params = mergeParams(airagModel, params);\n        return llmHandler.chat(messages, params);\n    }\n\n    /**\n     * 使用默认模型聊天\n     *\n     * @param messages\n     * @param params\n     * @return\n     * @author chenrui\n     * @date 2025/3/12 15:13\n     */\n    @Override\n    public TokenStream chatByDefaultModel(List<ChatMessage> messages, AIChatParams params) {\n        return chat(new AiragModel(), messages, params);\n    }\n\n    /**\n     * 合并 airagmodel和params,params为准\n     *\n     * @param airagModel\n     * @param params\n     * @return\n     * @author chenrui\n     * @date 2025/3/11 17:45\n     */\n    private AIChatParams mergeParams(AiragModel airagModel, AIChatParams params) {\n        if (null == airagModel) {\n            return params;\n        }\n        if (params == null) {\n            params = new AIChatParams();\n        }\n\n        params.setProvider(airagModel.getProvider());\n        params.setModelName(airagModel.getModelName());\n        params.setBaseUrl(airagModel.getBaseUrl());\n        if (oConvertUtils.isObjectNotEmpty(airagModel.getCredential())) {\n            JSONObject modelCredential = JSONObject.parseObject(airagModel.getCredential());\n            params.setApiKey(oConvertUtils.getString(modelCredential.getString(\"apiKey\"), null));\n            params.setSecretKey(oConvertUtils.getString(modelCredential.getString(\"secretKey\"), null));\n        }\n        if (oConvertUtils.isObjectNotEmpty(airagModel.getModelParams())) {\n            JSONObject modelParams = JSONObject.parseObject(airagModel.getModelParams());\n            if (oConvertUtils.isObjectEmpty(params.getTemperature())) {\n                params.setTemperature(modelParams.getDouble(\"temperature\"));\n            }\n            if (oConvertUtils.isObjectEmpty(params.getTopP())) {\n                params.setTopP(modelParams.getDouble(\"topP\"));\n            }\n            if (oConvertUtils.isObjectEmpty(params.getPresencePenalty())) {\n                params.setPresencePenalty(modelParams.getDouble(\"presencePenalty\"));\n            }\n            if (oConvertUtils.isObjectEmpty(params.getFrequencyPenalty())) {\n                params.setFrequencyPenalty(modelParams.getDouble(\"frequencyPenalty\"));\n            }\n            if (oConvertUtils.isObjectEmpty(params.getMaxTokens())) {\n                params.setMaxTokens(modelParams.getInteger(\"maxTokens\"));\n            }\n            if (oConvertUtils.isObjectEmpty(params.getTimeout())) {\n                params.setTimeout(modelParams.getInteger(\"timeout\"));\n            }\n            if (oConvertUtils.isObjectEmpty(params.getEnableSearch())) {\n                params.setEnableSearch(modelParams.getBoolean(\"enableSearch\"));\n            }\n        }\n\n        // RAG\n        List<String> knowIds = params.getKnowIds();\n        if (oConvertUtils.isObjectNotEmpty(knowIds)) {\n            QueryRouter queryRouter = embeddingHandler.getQueryRouter(knowIds, params.getTopNumber(), params.getSimilarity());\n            params.setQueryRouter(queryRouter);\n        }\n\n        // 设置确保maxTokens值正确\n        if (oConvertUtils.isObjectNotEmpty(params.getMaxTokens()) && params.getMaxTokens() <= 0) {\n            params.setMaxTokens(null);\n        }\n\n        // 默认超时时间\n        if(oConvertUtils.isObjectEmpty(params.getTimeout())){\n            params.setTimeout(AiragConsts.DEFAULT_TIMEOUT);\n        }\n\n        //deepseek-reasoner 推理模型不支持插件tool\n        String modelName = airagModel.getModelName();\n        if(!LLMConsts.DEEPSEEK_REASONER.equals(modelName)){\n            // 插件/MCP处理\n            buildPlugins(params);\n        }\n\n        return params;\n    }\n\n    /**\n     * 构造插件和MCP工具\n     * for [QQYUN-12453]【AI】支持插件\n     * for [QQYUN-9234] MCP服务连接关闭 - 使用包装器保存连接引用\n     * @param params\n     * @author chenrui\n     * @date 2025/10/31 14:04\n     */\n    private void buildPlugins(AIChatParams params) {\n        List<String> pluginIds = params.getPluginIds();\n\n        if(oConvertUtils.isObjectNotEmpty(pluginIds)){\n            List<McpToolProvider> mcpToolProviders = new ArrayList<>();\n            List<McpToolProviderWrapper> mcpToolProviderWrappers = new ArrayList<>();\n            Map<ToolSpecification, ToolExecutor> pluginTools = new HashMap<>();\n\n            for (String pluginId : pluginIds.stream().distinct().collect(Collectors.toList())) {\n                AiragMcp airagMcp = airagMcpMapper.selectById(pluginId);\n                if (airagMcp == null) {\n                    continue;\n                }\n\n                String category = airagMcp.getCategory();\n                if (oConvertUtils.isEmpty(category)) {\n                    // 兼容旧数据：如果没有category字段，默认为mcp\n                    category = \"mcp\";\n                }\n\n                if (\"mcp\".equalsIgnoreCase(category)) {\n                    // MCP类型：构建McpToolProviderWrapper（包含连接引用用于后续关闭）\n                    // for [QQYUN-9234] MCP服务连接关闭\n                    McpToolProviderWrapper wrapper = buildMcpToolProviderWrapper(\n                            airagMcp.getName(),\n                            airagMcp.getType(),\n                            airagMcp.getEndpoint(),\n                            airagMcp.getHeaders(),\n                            aiRagConfigBean.getAllowSensitiveNodes()\n                    );\n                    if (wrapper != null) {\n                        mcpToolProviders.add(wrapper.getMcpToolProvider());\n                        mcpToolProviderWrappers.add(wrapper);\n                    }\n                } else if (\"plugin\".equalsIgnoreCase(category)) {\n                    // 插件类型：构建ToolSpecification和ToolExecutor\n                    Map<ToolSpecification, ToolExecutor> tools = PluginToolBuilder.buildTools(airagMcp, params.getCurrentHttpRequest());\n                    if (tools != null && !tools.isEmpty()) {\n                        pluginTools.putAll(tools);\n                    }\n                }\n            }\n\n            // 设置MCP工具提供者\n            if (!mcpToolProviders.isEmpty()) {\n                params.setMcpToolProviders(mcpToolProviders);\n            }\n            \n            // 保存MCP连接包装器，用于后续关闭\n            // for [QQYUN-9234] MCP服务连接关闭\n            if (!mcpToolProviderWrappers.isEmpty()) {\n                params.setMcpToolProviderWrappers(mcpToolProviderWrappers);\n            }\n\n            // 设置插件工具\n            if (!pluginTools.isEmpty()) {\n                if (params.getTools() == null) {\n                    params.setTools(new HashMap<>());\n                }\n                params.getTools().putAll(pluginTools);\n            }\n        }\n    }\n\n    @Override\n    public UserMessage buildUserMessage(String content, List<String> images) {\n        AssertUtils.assertNotEmpty(\"请输入消息内容\", content);\n        List<Content> contents = new ArrayList<>();\n        contents.add(TextContent.from(content));\n        if (oConvertUtils.isObjectNotEmpty(images)) {\n            // 获取所有图片,将他们转换为ImageContent\n            List<ImageContent> imageContents = buildImageContents(images);\n            contents.addAll(imageContents);\n        }\n        return UserMessage.from(contents);\n    }\n\n    @Override\n    public List<ImageContent> buildImageContents(List<String> images) {\n        List<ImageContent> imageContents = new ArrayList<>();\n        for (String imageUrl : images) {\n            Matcher matcher = LLMConsts.WEB_PATTERN.matcher(imageUrl);\n            if (matcher.matches()) {\n                // 来源于网络\n                imageContents.add(ImageContent.from(imageUrl));\n            } else {\n                // 本地文件\n                String filePath = uploadpath + File.separator + imageUrl;\n                // 读取文件并转换为 base64 编码字符串\n                try {\n                    SsrfFileTypeFilter.checkPathTraversal(filePath);\n                    Path path = Paths.get(filePath);\n                    byte[] fileContent = Files.readAllBytes(path);\n                    String base64Data = Base64.getEncoder().encodeToString(fileContent);\n                    // 获取文件的 MIME 类型\n                    String mimeType = Files.probeContentType(path);\n                    // 构建 ImageContent 对象\n                    imageContents.add(ImageContent.from(base64Data, mimeType));\n                } catch (IOException e) {\n                    log.error(\"读取文件失败: {}\", imageUrl, e);\n                    throw new RuntimeException(\"发送消息失败,读取文件异常:\" + e.getMessage(), e);\n                }\n            }\n        }\n        return imageContents;\n    }\n\n    //================================================= begin【QQYUN-12145】【AI】AI 绘画创作 ========================================\n    /**\n     * 文本生成图片\n     * @param modelId\n     * @param messages\n     * @param params\n     * @return\n     */\n    @Override\n    public List<Map<String, Object>> imageGenerate(String modelId, String messages, AIChatParams params) {\n        AssertUtils.assertNotEmpty(\"至少发送一条消息\", messages);\n        AssertUtils.assertNotEmpty(\"请选择图片大模型\", modelId);\n        AiragModel airagModel = airagModelMapper.getByIdIgnoreTenant(modelId);\n        return this.imageGenerate(airagModel, messages, params);\n    }\n\n    /**\n     * 文本生成图片\n     *\n     * @param airagModel\n     * @param messages\n     * @param params\n     * @return\n     */\n    public List<Map<String, Object>> imageGenerate(AiragModel airagModel, String messages, AIChatParams params) {\n        params = mergeParams(airagModel, params);\n        try {\n            return llmHandler.imageGenerate(messages, params);\n        } catch (Exception e) {\n            String errMsg = \"调用绘画AI接口失败，详情请查看后台日志。\";\n            if (oConvertUtils.isNotEmpty(e.getMessage())) {\n                // 根据常见异常关键字做细致翻译\n                for (Map.Entry<String, String> entry : MODEL_ERROR_MAP.entrySet()) {\n                    String key = entry.getKey();\n                    String value = entry.getValue();\n                    if (e.getMessage().contains(key)) {\n                        errMsg = value;\n                        break;\n                    }\n                }\n            }\n            log.error(\"AI模型调用异常: {}\", errMsg, e);\n            throw new JeecgBootException(errMsg);\n        }\n    }\n\n\n    /**\n     * 图生图\n     * \n     * @param modelId\n     * @param messages\n     * @param images\n     * @param params\n     * @return\n     */\n    @Override\n    public List<Map<String, Object>> imageEdit(String modelId, String messages, List<String> images, AIChatParams params) {\n        AiragModel airagModel = airagModelMapper.getByIdIgnoreTenant(modelId);\n        params = mergeParams(airagModel, params);\n        List<String> originalImageBase64List = getFirstImageBase64(images);\n        try {\n            return llmHandler.imageEdit(messages, originalImageBase64List, params);\n        } catch (Exception e) {\n            String errMsg = \"调用绘画AI接口失败，详情请查看后台日志。\";\n            if (oConvertUtils.isNotEmpty(e.getMessage())) {\n                // 根据常见异常关键字做细致翻译\n                for (Map.Entry<String, String> entry : MODEL_ERROR_MAP.entrySet()) {\n                    String key = entry.getKey();\n                    String value = entry.getValue();\n                    if (errMsg.contains(key)) {\n                        errMsg = value;\n                        break;\n                    }\n                }\n            }\n            log.error(\"AI模型调用异常: {}\", errMsg, e);\n            throw new JeecgBootException(errMsg);\n        }\n    }\n\n    /**\n     * 需要将图片转换成Base64编码\n     * @param images 图片路径列表\n     * @return Base64编码字符串\n     */\n    private List<String> getFirstImageBase64(List<String> images) {\n        List<String> originalImageBase64List = new ArrayList<>();\n        if (images != null && !images.isEmpty()) {\n            for (String imageUrl : images) {\n                Matcher matcher = LLMConsts.WEB_PATTERN.matcher(imageUrl);\n                try {\n                    byte[] fileContent;\n                    if (matcher.matches()) {\n                        // 来源于网络\n                        java.net.URL url = new java.net.URL(imageUrl);\n                        java.net.URLConnection conn = url.openConnection();\n                        conn.setConnectTimeout(5000);\n                        conn.setReadTimeout(10000);\n                        try (java.io.InputStream in = conn.getInputStream()) {\n                            java.io.ByteArrayOutputStream buffer = new java.io.ByteArrayOutputStream();\n                            int nRead;\n                            byte[] data = new byte[1024];\n                            while ((nRead = in.read(data, 0, data.length)) != -1) {\n                                buffer.write(data, 0, nRead);\n                            }\n                            buffer.flush();\n                            fileContent = buffer.toByteArray();\n                        }\n                    } else {\n                        // 本地文件\n                        String filePath = uploadpath + File.separator + imageUrl;\n                        SsrfFileTypeFilter.checkPathTraversal(filePath);\n                        Path path = Paths.get(filePath);\n                        fileContent = Files.readAllBytes(path);\n                    }\n                    originalImageBase64List.add(Base64.getEncoder().encodeToString(fileContent));\n                } catch (Exception e) {\n                    log.error(\"图片读取失败: {}\", imageUrl, e);\n                    throw new JeecgBootException(\"图片读取失败: \" + imageUrl);\n                }\n            }\n        }\n        return originalImageBase64List;\n    }\n    //================================================= end 【QQYUN-12145】【AI】AI 绘画创作 ========================================\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/CommandExecUtil.java",
    "content": "package org.jeecg.modules.airag.llm.handler;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.ArrayUtils;\n\nimport java.io.*;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\n/**\n * @Description: 命令行执行工具类\n * @Author: chenrui\n * @Date: 2024/4/8 10:11\n */\n@Slf4j\npublic class CommandExecUtil {\n\n\n    /**\n     * 执行命令行\n     *\n     * @param command\n     * @param args\n     * @return\n     * @throws IOException\n     * @author chenrui\n     * @date 2024/4/9 10:59\n     */\n    public static String execCommand(String command, String[] args) throws IOException {\n        if (null == command || command.isEmpty()) {\n            throw new IllegalArgumentException(\"命令不能为空\");\n        }\n        return execCommand(command.split(\" \"), args);\n    }\n\n    /**\n     * 执行命令行\n     *\n     * @param command 脚本目录\n     * @param args    参数\n     * @author chenrui\n     * @date 2024/4/09 10:30\n     */\n    public static String execCommand(String[] command, String[] args) throws IOException {\n\n        if (null == command || command.length == 0) {\n            throw new IllegalArgumentException(\"命令不能为空\");\n        }\n\n        if (null != args && args.length > 0) {\n            command = (String[]) ArrayUtils.addAll(command, args);\n        }\n\n        // windows系统处理文件夹空格问题\n        if (System.getProperty(\"os.name\").toLowerCase().startsWith(\"windows\")) {\n            List<String> commandNew = new ArrayList<>(command.length + 2);\n            commandNew.addAll(Arrays.asList(\"cmd.exe\", \"/c\"));\n            for (String tempCommand : command) {\n                if (tempCommand.contains(\" \")) {\n                    tempCommand = \"\\\"\" + tempCommand.replaceAll(\"\\\"\", \"'\") + \"\\\"\";\n                }\n                commandNew.add(tempCommand);\n            }\n            command = commandNew.toArray(new String[0]);\n        }\n\n\n        Process process = null;\n        try {\n            log.debug(\" =============================== Runtime command Script ===============================\" );\n            log.debug(String.join(\" \", command));\n            log.debug(\" =============================== Runtime command Script =============================== \" );\n            process = Runtime.getRuntime().exec(command);\n            try (ByteArrayOutputStream resultOutStream = new ByteArrayOutputStream();\n                 InputStream processInStream = new BufferedInputStream(process.getInputStream())) {\n                new Thread(new InputStreamRunnable(process.getErrorStream(), \"ErrorStream\")).start();\n                int num;\n                byte[] bs = new byte[1024];\n                while ((num = processInStream.read(bs)) != -1) {\n                    resultOutStream.write(bs, 0, num);\n                    String stepMsg = new String(bs);\n//                    log.debug(\"命令行日志:\" + stepMsg);\n                    if (stepMsg.contains(\"input any key to continue...\")) {\n                        process.destroy();\n                    }\n                }\n                String result = resultOutStream.toString();\n                log.debug(\"执行命令完成:\" + result);\n                return result;\n            } catch (IOException ex) {\n                throw new RuntimeException(ex);\n            }\n        } catch (IOException e) {\n            log.error(e.getMessage(), e);\n            throw e;\n        } finally {\n            if (process != null) {\n                process.destroy();\n            }\n        }\n    }\n\n    /**\n     * exec 控制台输出获取线程类\n     * 使用单独的线程获取控制台输出,防止输入流阻塞\n     *\n     * @author chenrui\n     * @date 2024/4/09 10:30\n     */\n    static class InputStreamRunnable implements Runnable {\n        BufferedReader bReader = null;\n        String type = null;\n\n        public InputStreamRunnable(InputStream is, String _type) {\n            try {\n                bReader = new BufferedReader(new InputStreamReader(new BufferedInputStream(is), StandardCharsets.UTF_8));\n                type = _type;\n            } catch (Exception ex) {\n            }\n        }\n\n        @SuppressWarnings(\"unused\")\n        public void run() {\n            String line;\n            int lineNum = 0;\n\n            try {\n                while ((line = bReader.readLine()) != null) {\n                    lineNum++;\n                    // Thread.sleep(200);\n                }\n                bReader.close();\n            } catch (Exception ignored) {\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/EmbeddingHandler.java",
    "content": "package org.jeecg.modules.airag.llm.handler;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.google.common.collect.Lists;\nimport dev.langchain4j.data.document.Document;\nimport dev.langchain4j.data.document.DocumentSplitter;\nimport dev.langchain4j.data.document.Metadata;\nimport dev.langchain4j.data.document.splitter.DocumentSplitters;\nimport dev.langchain4j.data.embedding.Embedding;\nimport dev.langchain4j.data.segment.TextSegment;\nimport dev.langchain4j.model.embedding.EmbeddingModel;\nimport dev.langchain4j.rag.content.retriever.ContentRetriever;\nimport dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;\nimport dev.langchain4j.rag.query.router.DefaultQueryRouter;\nimport dev.langchain4j.rag.query.router.QueryRouter;\nimport dev.langchain4j.store.embedding.EmbeddingMatch;\nimport dev.langchain4j.store.embedding.EmbeddingSearchRequest;\nimport dev.langchain4j.store.embedding.EmbeddingStore;\nimport dev.langchain4j.store.embedding.EmbeddingStoreIngestor;\nimport dev.langchain4j.store.embedding.filter.Filter;\nimport dev.langchain4j.store.embedding.filter.logical.And;\nimport dev.langchain4j.store.embedding.pgvector.PgVectorEmbeddingStore;\nimport jakarta.servlet.http.HttpServletRequest;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.io.FilenameUtils;\nimport org.apache.tika.parser.AutoDetectParser;\nimport org.jeecg.ai.factory.AiModelFactory;\nimport org.jeecg.ai.factory.AiModelOptions;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.util.*;\nimport org.jeecg.modules.airag.common.handler.IEmbeddingHandler;\nimport org.jeecg.modules.airag.common.vo.knowledge.KnowledgeSearchResult;\nimport org.jeecg.modules.airag.llm.config.EmbedStoreConfigBean;\nimport org.jeecg.modules.airag.llm.config.KnowConfigBean;\nimport org.jeecg.modules.airag.llm.consts.LLMConsts;\nimport org.jeecg.modules.airag.llm.document.TikaDocumentParser;\nimport org.jeecg.modules.airag.llm.entity.AiragKnowledge;\nimport org.jeecg.modules.airag.llm.entity.AiragKnowledgeDoc;\nimport org.jeecg.modules.airag.llm.entity.AiragModel;\nimport org.jeecg.modules.airag.llm.mapper.AiragKnowledgeMapper;\nimport org.jeecg.modules.airag.llm.mapper.AiragModelMapper;\nimport org.jeecg.modules.airag.llm.service.IAiragKnowledgeService;\nimport org.jetbrains.annotations.NotNull;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.stereotype.Component;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.*;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\n\nimport static dev.langchain4j.store.embedding.filter.MetadataFilterBuilder.metadataKey;\nimport static org.jeecg.modules.airag.llm.consts.LLMConsts.KNOWLEDGE_DOC_TYPE_FILE;\nimport static org.jeecg.modules.airag.llm.consts.LLMConsts.KNOWLEDGE_DOC_TYPE_WEB;\n\n/**\n * 向量工具类\n *\n * @Author: chenrui\n * @Date: 2025/2/18 14:31\n */\n@Slf4j\n@Component\npublic class EmbeddingHandler implements IEmbeddingHandler {\n\n    @Autowired\n    EmbedStoreConfigBean embedStoreConfigBean;\n\n    @Autowired\n    private AiragModelMapper airagModelMapper;\n\n    @Autowired\n    @Lazy\n    private IAiragKnowledgeService airagKnowledgeService;\n\n    @Autowired\n    private AiragKnowledgeMapper airagKnowledgeMapper;\n\n    @Value(value = \"${jeecg.path.upload:}\")\n    private String uploadpath;\n\n    @Autowired\n    KnowConfigBean knowConfigBean;\n\n    /**\n     * 默认分段长度\n     */\n    private static final int DEFAULT_SEGMENT_SIZE = 1000;\n\n    /**\n     * 默认分段重叠长度\n     */\n    private static final int DEFAULT_OVERLAP_SIZE = 50;\n\n    /**\n     * 最大输出长度\n     */\n    private static final int DEFAULT_MAX_OUTPUT_CHARS = 4000;\n\n    /**\n     * 向量存储元数据:knowledgeId\n     */\n    public static final String EMBED_STORE_METADATA_KNOWLEDGEID = \"knowledgeId\";\n\n    /**\n     * 向量存储元数据: 用户账号\n     */\n    public static final String EMBED_STORE_METADATA_USER_NAME = \"username\";\n\n    /**\n     * 向量存储元数据:docId\n     */\n    public static final String EMBED_STORE_METADATA_DOCID = \"docId\";\n\n    /**\n     * 向量存储元数据:docName\n     */\n    public static final String EMBED_STORE_METADATA_DOCNAME = \"docName\";\n\n    /**\n     * 向量存储元数据：创建时间\n     */\n    public static final String EMBED_STORE_CREATE_TIME = \"createTime\";\n\n    /**\n     * 向量存储缓存\n     */\n    private static final ConcurrentHashMap<String, EmbeddingStore<TextSegment>> EMBED_STORE_CACHE = new ConcurrentHashMap<>();\n\n\n    /**\n     * 正则匹配: md图片\n     * \"!\\\\[(.*?)]\\\\((.*?)(\\\\s*=\\\\d+)?\\\\)\"\n     */\n    private static final Pattern PATTERN_MD_IMAGE = Pattern.compile(\"!\\\\[(.*?)]\\\\((.*?)\\\\)\");\n\n    /**\n     * 向量化文档\n     *\n     * @param knowId\n     * @param doc\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 11:52\n     */\n    public Map<String, Object> embeddingDocument(String knowId, AiragKnowledgeDoc doc) {\n        AiragKnowledge airagKnowledge = airagKnowledgeService.getById(knowId);\n        AssertUtils.assertNotEmpty(\"知识库不存在\", airagKnowledge);\n        AssertUtils.assertNotEmpty(\"请先为知识库配置向量模型库\", airagKnowledge.getEmbedId());\n        AssertUtils.assertNotEmpty(\"文档不能为空\", doc);\n        // 读取文档\n        String content = doc.getContent();\n        // 向量化并存储\n        if (oConvertUtils.isEmpty(content)) {\n            switch (doc.getType()) {\n                case KNOWLEDGE_DOC_TYPE_FILE:\n                    //解析文件\n                    if (knowConfigBean.isEnableMinerU()) {\n                        parseFileByMinerU(doc);\n                    }\n                    content = parseFile(doc);\n                    break;\n                case KNOWLEDGE_DOC_TYPE_WEB:\n                    // TODO author: chenrui for:读取网站内容 date:2025/2/18\n                    break;\n            }\n        }\n        //update-begin---author:chenrui ---date:20250307  for：[QQYUN-11443]【AI】是不是应该把标题也生成到向量库里，标题一般是有意义的------------\n        if (oConvertUtils.isNotEmpty(doc.getTitle())) {\n            content = doc.getTitle() + \"\\n\\n\" + content;\n        }\n        //update-end---author:chenrui ---date:20250307  for：[QQYUN-11443]【AI】是不是应该把标题也生成到向量库里，标题一般是有意义的------------\n\n        // 向量化 date:2025/2/18\n        AiragModel model = getEmbedModelData(airagKnowledge.getEmbedId());\n        AiModelOptions modelOp = buildModelOptions(model);\n        EmbeddingModel embeddingModel = AiModelFactory.createEmbeddingModel(modelOp);\n        EmbeddingStore<TextSegment> embeddingStore = getEmbedStore(model);\n        // 删除旧数据\n        embeddingStore.removeAll(metadataKey(EMBED_STORE_METADATA_DOCID).isEqualTo(doc.getId()));\n        // 分段器\n        DocumentSplitter splitter = DocumentSplitters.recursive(DEFAULT_SEGMENT_SIZE, DEFAULT_OVERLAP_SIZE);\n        // 分段并存储\n        EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder()\n                .documentSplitter(splitter)\n                .embeddingModel(embeddingModel)\n                .embeddingStore(embeddingStore)\n                .build();\n        Metadata metadata = Metadata.metadata(EMBED_STORE_METADATA_DOCID, doc.getId())\n                .put(EMBED_STORE_METADATA_KNOWLEDGEID, doc.getKnowledgeId())\n                .put(EMBED_STORE_METADATA_DOCNAME, FilenameUtils.getName(doc.getTitle()))\n                 //初始化记忆库的时候添加创建时间选项\n                .put(EMBED_STORE_CREATE_TIME, String.valueOf(doc.getCreateTime() != null ? doc.getCreateTime().getTime() : System.currentTimeMillis()));\n        //update-begin---author:wangshuai---date:2025-12-26---for:【QQYUN-14265】【AI】支持记忆---\n        //添加用户名字到元数据里面，用于记忆库中数据隔离\n        String username = doc.getCreateBy();\n        if (oConvertUtils.isEmpty(username)) {\n            try {\n                HttpServletRequest request = SpringContextUtils.getHttpServletRequest();\n                String token = TokenUtils.getTokenByRequest(request);\n                username = JwtUtil.getUsername(token);\n            } catch (Exception e) {\n                // ignore：token获取不到默认为admin\n                username = \"admin\";\n            }\n        }\n        if (oConvertUtils.isNotEmpty(username)) {\n            metadata.put(EMBED_STORE_METADATA_USER_NAME, username);\n        }\n        //update-end---author:wangshuai---date:2025-12-26---for:【QQYUN-14265】【AI】支持记忆---\n        Document from = Document.from(content, metadata);\n        //update-begin---author:jeecg---date:2026-02-26---for:[#9374]【AI知识库】千帆向量报错，添加异常处理防止空指针\n        try {\n            ingestor.ingest(from);\n        } catch (Exception e) {\n            log.error(\"向量存储失败，请检查向量模型配置是否正确\", e);\n            throw new JeecgBootException(\"向量存储失败：\" + e.getMessage());\n        }\n        //update-end---author:jeecg---date:2026-02-26---for:[#9374]【AI知识库】千帆向量报错，添加异常处理防止空指针\n        return metadata.toMap();\n    }\n\n    /**\n     * 向量查询(多知识库)\n     *\n     * @param knowIds\n     * @param queryText\n     * @param topNumber\n     * @param similarity\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 16:52\n     */\n    @Override\n    public KnowledgeSearchResult embeddingSearch(List<String> knowIds, String queryText, Integer topNumber, Double similarity) {\n        AssertUtils.assertNotEmpty(\"请选择知识库\", knowIds);\n        AssertUtils.assertNotEmpty(\"请填写查询内容\", queryText);\n\n        topNumber = oConvertUtils.getInteger(topNumber, 5);\n\n        //命中的文档列表\n        List<Map<String, Object>> documents = new ArrayList<>(16);\n        for (String knowId : knowIds) {\n            List<Map<String, Object>> searchResp = searchEmbedding(knowId, queryText, topNumber, similarity);\n            if (oConvertUtils.isObjectNotEmpty(searchResp)) {\n                documents.addAll(searchResp);\n            }\n        }\n\n        StringBuilder data = new StringBuilder();\n        //update-begin---author:wangshuai---date:2026-01-04---for:【QQYUN-14479】给ai的时候需要限制几个字---\n        //是否为记忆库\n        boolean memoryMode = false;\n        //记忆库只有一个\n        if (knowIds.size() == 1) {\n            String firstId = knowIds.get(0);\n            if (oConvertUtils.isNotEmpty(firstId)) {\n                AiragKnowledge k = airagKnowledgeMapper.getByIdIgnoreTenant(firstId);\n                memoryMode = (k != null && LLMConsts.KNOWLEDGE_TYPE_MEMORY.equalsIgnoreCase(k.getType()));\n            }\n        }\n        //如果是记忆库按照创建时间排序，如果不是按照score分值进行排序\n        List<Map<String, Object>> prepared = documents.stream()\n                .sorted(memoryMode\n                        ? Comparator.comparingLong((Map<String, Object> doc) -> oConvertUtils.getLong(doc.get(EMBED_STORE_CREATE_TIME), 0L)).reversed()\n                        : Comparator.comparingDouble((Map<String, Object> doc) -> (Double) doc.get(\"score\")).reversed())\n                .collect(Collectors.toList());\n        List<Map<String, Object>> limited = new ArrayList<>();\n        //将返回的结果按照最大的token进行长度限制\n        for (Map<String, Object> doc : prepared) {\n            if (limited.size() >= topNumber) {\n                break;\n            }\n            String content = oConvertUtils.getString(doc.get(\"content\"), \"\");\n            int remain = DEFAULT_MAX_OUTPUT_CHARS - data.length();\n            if (remain <= 0) {\n                break;\n            }\n            //数据库中文本的长度和已经拼接的长度\n            if (content.length() <= remain) {\n                data.append(content).append(\"\\n\");\n                limited.add(doc);\n            } else {\n                data.append(content, 0, remain);\n                limited.add(doc);\n                break;\n            }\n        }\n        return new KnowledgeSearchResult(data.toString(), limited);\n        //update-end---author:wangshuai---date:2026-01-04---for:【QQYUN-14479】给ai的时候需要限制几个字---\n    }\n\n    /**\n     * 向量查询\n     *\n     * @param knowId\n     * @param queryText\n     * @param topNumber\n     * @param similarity\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 16:52\n     */\n    public List<Map<String, Object>> searchEmbedding(String knowId, String queryText, Integer topNumber, Double similarity) {\n        AssertUtils.assertNotEmpty(\"请选择知识库\", knowId);\n        AiragKnowledge knowledge = airagKnowledgeMapper.getByIdIgnoreTenant(knowId);\n        AssertUtils.assertNotEmpty(\"知识库不存在\", knowledge);\n        AssertUtils.assertNotEmpty(\"请填写查询内容\", queryText);\n        AiragModel model = getEmbedModelData(knowledge.getEmbedId());\n\n        AiModelOptions modelOp = buildModelOptions(model);\n        EmbeddingModel embeddingModel = AiModelFactory.createEmbeddingModel(modelOp);\n        Embedding queryEmbedding = embeddingModel.embed(queryText).content();\n\n        topNumber = oConvertUtils.getInteger(topNumber, modelOp.getTopNumber());\n        similarity = oConvertUtils.getDou(similarity, modelOp.getSimilarity());\n        \n        //update-begin---author:wangshuai---date:2025-12-26---for:【QQYUN-14265】【AI】支持记忆---\n        Filter filter = metadataKey(EMBED_STORE_METADATA_KNOWLEDGEID).isEqualTo(knowId);\n\n        // 记忆库的时候需要根据用户隔离\n        if (LLMConsts.KNOWLEDGE_TYPE_MEMORY.equalsIgnoreCase(knowledge.getType())) {\n            try {\n                HttpServletRequest request = SpringContextUtils.getHttpServletRequest();\n                String token = TokenUtils.getTokenByRequest(request);\n                String username = JwtUtil.getUsername(token);\n                if (oConvertUtils.isNotEmpty(username)) {\n                    filter = new And(filter, metadataKey(EMBED_STORE_METADATA_USER_NAME).isEqualTo(username));\n                }\n            } catch (Exception e) {\n                // ignore\n                log.info(\"构建过滤器异常,{}\",e.getMessage());\n            }\n        }\n        //update-end---author:wangshuai---date:2025-12-26---for:【QQYUN-14265】【AI】支持记忆---\n        \n        EmbeddingSearchRequest embeddingSearchRequest = EmbeddingSearchRequest.builder()\n                .queryEmbedding(queryEmbedding)\n                .maxResults(topNumber)\n                .minScore(similarity)\n                .filter(filter)\n                .build();\n\n        EmbeddingStore<TextSegment> embeddingStore = getEmbedStore(model);\n        List<EmbeddingMatch<TextSegment>> relevant = embeddingStore.search(embeddingSearchRequest).matches();\n        List<Map<String, Object>> result = new ArrayList<>();\n        if (oConvertUtils.isObjectNotEmpty(relevant)) {\n            result = relevant.stream().map(matchRes -> {\n                Map<String, Object> data = new HashMap<>();\n                data.put(\"score\", matchRes.score());\n                data.put(\"content\", matchRes.embedded().text());\n                Metadata metadata = matchRes.embedded().metadata();\n                data.put(\"chunk\", metadata.getInteger(\"index\"));\n                data.put(EMBED_STORE_METADATA_DOCNAME, metadata.getString(EMBED_STORE_METADATA_DOCNAME));\n                //查询返回的时候增加创建时间，用于排序\n                String ct = metadata.getString(EMBED_STORE_CREATE_TIME);\n                data.put(EMBED_STORE_CREATE_TIME, ct);\n                return data;\n            }).collect(Collectors.toList());\n        }\n        return result;\n    }\n\n    /**\n     * 获取向量查询路由\n     *\n     * @param knowIds\n     * @param topNumber\n     * @param similarity\n     * @return\n     * @author chenrui\n     * @date 2025/2/20 21:03\n     */\n    @Override\n    public QueryRouter getQueryRouter(List<String> knowIds, Integer topNumber, Double similarity) {\n        AssertUtils.assertNotEmpty(\"请选择知识库\", knowIds);\n        List<ContentRetriever> retrievers = Lists.newArrayList();\n        for (String knowId : knowIds) {\n            if (oConvertUtils.isEmpty(knowId)) {\n                continue;\n            }\n            AiragKnowledge knowledge = airagKnowledgeMapper.getByIdIgnoreTenant(knowId);\n            AssertUtils.assertNotEmpty(\"知识库不存在\", knowledge);\n            AiragModel model = getEmbedModelData(knowledge.getEmbedId());\n            AiModelOptions modelOptions = buildModelOptions(model);\n            EmbeddingModel embeddingModel = AiModelFactory.createEmbeddingModel(modelOptions);\n\n            EmbeddingStore<TextSegment> embeddingStore = getEmbedStore(model);\n            topNumber = oConvertUtils.getInteger(topNumber, 5);\n            similarity = oConvertUtils.getDou(similarity, 0.75);\n\n            //update-begin---author:wangshuai---date:2025-12-26---for:【QQYUN-14265】【AI】支持记忆---\n            Filter filter = metadataKey(EMBED_STORE_METADATA_KNOWLEDGEID).isEqualTo(knowId);\n            // 记忆库的时候需要根据用户隔离\n            if (LLMConsts.KNOWLEDGE_TYPE_MEMORY.equalsIgnoreCase(knowledge.getType())) {\n                try {\n                    HttpServletRequest request = SpringContextUtils.getHttpServletRequest();\n                    String token = TokenUtils.getTokenByRequest(request);\n                    String username = JwtUtil.getUsername(token);\n                    if (oConvertUtils.isNotEmpty(username)) {\n                        filter = new And(filter, metadataKey(EMBED_STORE_METADATA_USER_NAME).isEqualTo(username));\n                    }\n                } catch (Exception e) {\n                    // ignore\n                    log.info(\"构建过滤器异常,{}\",e.getMessage());\n                }\n            }\n            //update-end---author:wangshuai---date:2025-12-26---for:【QQYUN-14265】【AI】支持记忆---\n            \n            // 构建一个嵌入存储内容检索器，用于从嵌入存储中检索内容\n            EmbeddingStoreContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder()\n                    .embeddingStore(embeddingStore)\n                    .embeddingModel(embeddingModel)\n                    .maxResults(topNumber)\n                    .minScore(similarity)\n                    .filter(filter)\n                    .build();\n            retrievers.add(contentRetriever);\n        }\n        if (retrievers.isEmpty()) {\n            return null;\n        } else {\n            return new DefaultQueryRouter(retrievers);\n        }\n    }\n\n    /**\n     * 删除向量化文档\n     *\n     * @param knowId\n     * @param modelId\n     * @author chenrui\n     * @date 2025/2/18 19:07\n     */\n    public void deleteEmbedDocsByKnowId(String knowId, String modelId) {\n        AssertUtils.assertNotEmpty(\"选择知识库\", knowId);\n        AiragModel model = getEmbedModelData(modelId);\n\n        EmbeddingStore<TextSegment> embeddingStore = getEmbedStore(model);\n        // 删除数据\n        embeddingStore.removeAll(metadataKey(EMBED_STORE_METADATA_KNOWLEDGEID).isEqualTo(knowId));\n    }\n\n    /**\n     * 删除向量化文档\n     *\n     * @param docIds\n     * @param modelId\n     * @author chenrui\n     * @date 2025/2/18 19:07\n     */\n    public void deleteEmbedDocsByDocIds(List<String> docIds, String modelId) {\n        AssertUtils.assertNotEmpty(\"选择文档\", docIds);\n        AiragModel model = getEmbedModelData(modelId);\n\n        EmbeddingStore<TextSegment> embeddingStore = getEmbedStore(model);\n        // 删除数据\n        embeddingStore.removeAll(metadataKey(EMBED_STORE_METADATA_DOCID).isIn(docIds));\n    }\n\n    /**\n     * 查询向量模型数据\n     *\n     * @param modelId\n     * @return\n     * @author chenrui\n     * @date 2025/2/20 20:08\n     */\n    private AiragModel getEmbedModelData(String modelId) {\n        AssertUtils.assertNotEmpty(\"向量模型不能为空\", modelId);\n        AiragModel model = airagModelMapper.getByIdIgnoreTenant(modelId);\n        AssertUtils.assertNotEmpty(\"向量模型不存在\", model);\n        AssertUtils.assertEquals(\"仅支持向量模型\", LLMConsts.MODEL_TYPE_EMBED, model.getModelType());\n        return model;\n    }\n\n    /**\n     * 获取向量存储\n     *\n     * @param model\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 14:56\n     */\n    private EmbeddingStore<TextSegment> getEmbedStore(AiragModel model) {\n        AssertUtils.assertNotEmpty(\"未配置模型\", model);\n        String modelId = model.getId();\n        String connectionInfo = embedStoreConfigBean.getHost() + embedStoreConfigBean.getPort() + embedStoreConfigBean.getDatabase();\n        String key = modelId + connectionInfo;\n        if (EMBED_STORE_CACHE.containsKey(key)) {\n            return EMBED_STORE_CACHE.get(key);\n        }\n\n\n        AiModelOptions modelOp = buildModelOptions(model);\n        EmbeddingModel embeddingModel = AiModelFactory.createEmbeddingModel(modelOp);\n\n        String tableName = embedStoreConfigBean.getTable();\n\n        // update-begin---author:sunjianlei ---date:20250509  for：【QQYUN-12345】向量模型维度不一致问题\n        // 如果该模型不是默认的向量维度\n        int dimension = embeddingModel.dimension();\n        if (!LLMConsts.EMBED_MODEL_DEFAULT_DIMENSION.equals(dimension)) {\n            // 就加上维度后缀，防止因维度不一致导致保存失败\n            tableName += (\"_\" + dimension);\n        }\n        // update-end-----author:sunjianlei ---date:20250509  for：【QQYUN-12345】向量模型维度不一致问题\n\n        EmbeddingStore<TextSegment> embeddingStore = PgVectorEmbeddingStore.builder()\n                // Connection and table parameters\n                .host(embedStoreConfigBean.getHost())\n                .port(embedStoreConfigBean.getPort())\n                .database(embedStoreConfigBean.getDatabase())\n                .user(embedStoreConfigBean.getUser())\n                .password(embedStoreConfigBean.getPassword())\n                .table(tableName)\n                // Embedding dimension\n                // Required: Must match the embedding model’s output dimension\n                .dimension(embeddingModel.dimension())\n                // Indexing and performance options\n                // Enable IVFFlat index\n                .useIndex(true)\n                // Number of lists\n                // for IVFFlat index\n                .indexListSize(100)\n                // Table creation options\n                // Automatically create the table if it doesn’t exist\n                .createTable(true)\n                //Don’t drop the table first (set to true if you want a fresh start)\n                .dropTableFirst(false)\n                .build();\n        EMBED_STORE_CACHE.put(key, embeddingStore);\n        return embeddingStore;\n    }\n\n    /**\n     * 构造ModelOptions\n     *\n     * @param model\n     * @return\n     * @author chenrui\n     * @date 2025/3/11 17:45\n     */\n    public static AiModelOptions buildModelOptions(AiragModel model) {\n        AiModelOptions.AiModelOptionsBuilder modelOpBuilder = AiModelOptions.builder()\n                .provider(model.getProvider())\n                .modelName(model.getModelName())\n                .baseUrl(model.getBaseUrl());\n        if (oConvertUtils.isObjectNotEmpty(model.getCredential())) {\n            JSONObject modelCredential = JSONObject.parseObject(model.getCredential());\n            modelOpBuilder.apiKey(oConvertUtils.getString(modelCredential.getString(\"apiKey\"), null));\n            modelOpBuilder.secretKey(oConvertUtils.getString(modelCredential.getString(\"secretKey\"), null));\n        }\n        modelOpBuilder.topNumber(5);\n        modelOpBuilder.similarity(0.75);\n        return modelOpBuilder.build();\n    }\n\n    /**\n     * 解析文件\n     *\n     * @param doc\n     * @author chenrui\n     * @date 2025/3/5 11:31\n     */\n    private String parseFile(AiragKnowledgeDoc doc) {\n        String metadata = doc.getMetadata();\n        AssertUtils.assertNotEmpty(\"请先上传文件\", metadata);\n        JSONObject metadataJson = JSONObject.parseObject(metadata);\n        if (!metadataJson.containsKey(LLMConsts.KNOWLEDGE_DOC_METADATA_FILEPATH)) {\n            throw new JeecgBootException(\"请先上传文件\");\n        }\n        String filePath = metadataJson.getString(LLMConsts.KNOWLEDGE_DOC_METADATA_FILEPATH);\n        AssertUtils.assertNotEmpty(\"请先上传文件\", filePath);\n        // 网络资源,先下载到临时目录\n        filePath = ensureFile(filePath);\n        // 提取文档内容\n        File docFile = new File(filePath);\n        if (docFile.exists()) {\n            Document document = new TikaDocumentParser(AutoDetectParser::new, null, null, null).parse(docFile);\n            if (null != document) {\n                String content = document.text();\n                // 判断是否md文档\n                String fileType = FilenameUtils.getExtension(docFile.getName());\n                if (\"md\".contains(fileType)) {\n                    // 如果是md文件，查找所有图片语法，如果是本地图片，替换成网络图片\n                    String baseUrl = \"#{domainURL}/sys/common/static/\";\n                    String sourcePath = metadataJson.getString(LLMConsts.KNOWLEDGE_DOC_METADATA_SOURCES_PATH);\n                    if(oConvertUtils.isNotEmpty(sourcePath)) {\n                        String escapedPath = uploadpath;\n                        //update-begin---author:wangshuai---date:2025-06-03---for:【QQYUN-12636】【AI知识库】文档库上传 本地local 文档中的图片不展示---\n                        /*if (File.separator.equals(\"\\\\\")){\n                            escapedPath = uploadpath.replace(\"//\", \"\\\\\\\\\");\n                        }*/\n                        //update-end---author:wangshuai---date:2025-06-03---for:【QQYUN-12636】【AI知识库】文档库上传 本地local 文档中的图片不展示---\n                        sourcePath = sourcePath.replaceFirst(\"^\" + escapedPath, \"\").replace(\"\\\\\", \"/\");\n                        String docFilePath = metadataJson.getString(LLMConsts.KNOWLEDGE_DOC_METADATA_FILEPATH);\n                        docFilePath = FilenameUtils.getPath(docFilePath);\n                        docFilePath = docFilePath.replace(\"\\\\\", \"/\");\n                        StringBuffer sb = replaceImageUrl(content, baseUrl + sourcePath + \"/\", baseUrl + docFilePath);\n                        content = sb.toString();\n                    }\n                }\n                return content;\n            }\n        }\n        return null;\n    }\n\n    @NotNull\n    private static StringBuffer replaceImageUrl(String content, String abstractBaseUrl, String relativeBaseUrl) {\n        // 正则表达式匹配md文件中的图片语法 ![alt text](image url)\n        Matcher matcher = PATTERN_MD_IMAGE.matcher(content);\n\n        StringBuffer sb = new StringBuffer();\n        while (matcher.find()) {\n            String imageUrl = matcher.group(2);\n            // 检查是否是本地图片路径\n            if (!imageUrl.startsWith(\"http\")) {\n                // 替换成网络图片路径\n                String networkImageUrl = abstractBaseUrl + imageUrl;\n                if(imageUrl.startsWith(\"/\")) {\n                    // 绝对路径\n                    networkImageUrl = abstractBaseUrl + imageUrl;\n                }else{\n                    // 相对路径\n                    networkImageUrl = relativeBaseUrl + imageUrl;\n                }\n                // 修改图片路径中//->/，但保留http://和https://\n                networkImageUrl = networkImageUrl.replaceAll(\"(?<!http:)(?<!https:)//\", \"/\");\n                matcher.appendReplacement(sb, \"![\" + matcher.group(1) + \"](\" + networkImageUrl + \")\");\n            } else {\n                matcher.appendReplacement(sb, \"![\" + matcher.group(1) + \"](\" + imageUrl + \")\");\n            }\n        }\n        matcher.appendTail(sb);\n        return sb;\n    }\n\n    /**\n     * 通过MinerU解析文件\n     *\n     * @param doc\n     * @author chenrui\n     * @date 2025/4/1 17:37\n     */\n    private void parseFileByMinerU(AiragKnowledgeDoc doc) {\n        String metadata = doc.getMetadata();\n        AssertUtils.assertNotEmpty(\"请先上传文件\", metadata);\n        JSONObject metadataJson = JSONObject.parseObject(metadata);\n        if (!metadataJson.containsKey(LLMConsts.KNOWLEDGE_DOC_METADATA_FILEPATH)) {\n            throw new JeecgBootException(\"请先上传文件\");\n        }\n        String filePath = metadataJson.getString(LLMConsts.KNOWLEDGE_DOC_METADATA_FILEPATH);\n        AssertUtils.assertNotEmpty(\"请先上传文件\", filePath);\n        filePath = ensureFile(filePath);\n\n        File docFile = new File(filePath);\n        String fileType = FilenameUtils.getExtension(filePath);\n        if (!docFile.exists()\n                || \"txt\".equalsIgnoreCase(fileType)\n                || \"md\".equalsIgnoreCase(fileType)) {\n            return ;\n        }\n\n        String command = \"magic-pdf\";\n        if (oConvertUtils.isNotEmpty(knowConfigBean.getCondaEnv())) {\n            command = \"conda run -n \" + knowConfigBean.getCondaEnv() + \" \" + command;\n        }\n\n        String outputPath = docFile.getParentFile().getAbsolutePath();\n        String[] args = {\n                \"-p\", docFile.getAbsolutePath(),\n                \"-o\", outputPath,\n        };\n\n        try {\n            String execLog = CommandExecUtil.execCommand(command, args);\n            log.info(\"执行命令行:\" + command + \" args:\" + Arrays.toString(args) + \"\\n log::\" + execLog);\n            // 如果成功,替换文件路径和静态资源路径\n            String fileBaseName = FilenameUtils.getBaseName(docFile.getName());\n            String newFileDir = outputPath + File.separator + fileBaseName + File.separator + \"auto\" + File.separator ;\n            // 先检查文件是否存在,存在才替换\n            File convertedFile = new File(newFileDir + fileBaseName + \".md\");\n            if (convertedFile.exists()) {\n                log.info(\"文件转换成md成功,替换文件路径和静态资源路径\");\n                newFileDir = newFileDir.replaceFirst(\"^\" + uploadpath, \"\");\n                metadataJson.put(LLMConsts.KNOWLEDGE_DOC_METADATA_FILEPATH, newFileDir + fileBaseName + \".md\");\n                metadataJson.put(LLMConsts.KNOWLEDGE_DOC_METADATA_SOURCES_PATH, newFileDir);\n                doc.setMetadata(metadataJson.toJSONString());\n            }\n        } catch (IOException e) {\n            log.error(\"文件转换md失败,使用传统提取方案{}\", e.getMessage(), e);\n        }\n    }\n\n    /**\n     * 确保文件存在\n     * @param filePath\n     * @return\n     * @author chenrui\n     * @date 2025/4/1 17:36\n     */\n    @NotNull\n    private String ensureFile(String filePath) {\n        // 网络资源,先下载到临时目录\n        Matcher matcher = LLMConsts.WEB_PATTERN.matcher(filePath);\n        if (matcher.matches()) {\n            log.info(\"网络资源,下载到临时目录:\" + filePath);\n            // 准备文件\n            String tempFilePath = uploadpath + File.separator + \"tmp\" + File.separator + UUIDGenerator.generate() + File.separator;\n            String fileName = filePath;\n            if (fileName.contains(\"?\")) {\n                fileName = fileName.substring(0, fileName.indexOf(\"?\"));\n            }\n            fileName = FilenameUtils.getName(fileName);\n            tempFilePath = tempFilePath + fileName;\n            FileDownloadUtils.download2DiskFromNet(filePath, tempFilePath);\n            filePath = tempFilePath;\n        } else {\n            //本地文件\n            filePath = uploadpath + File.separator + filePath;\n        }\n        return filePath;\n    }\n\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/JeecgToolsProvider.java",
    "content": "package org.jeecg.modules.airag.llm.handler;\n\nimport dev.langchain4j.agent.tool.ToolSpecification;\nimport dev.langchain4j.service.tool.ToolExecutor;\nimport lombok.Getter;\n\nimport java.util.Map;\n\n/**\n * for [QQYUN-13565]【AI助手】新增创建用户和查询用户的工具扩展\n * @Description: jeecg llm工具提供者\n * @Author: chenrui\n * @Date: 2025/8/26 18:06\n */\npublic interface JeecgToolsProvider {\n\n    /**\n     * 获取默认的工具列表\n     * @return\n     * @author chenrui\n     * @date 2025/8/27 09:49\n     */\n    public Map<ToolSpecification, ToolExecutor> getDefaultTools();\n\n    /**\n     * jeecgLlm工具类\n     * @author chenrui\n     * @date 2025/8/27 09:49\n     */\n    @Getter\n    class JeecgLlmTools{\n        ToolSpecification toolSpecification;\n        ToolExecutor toolExecutor;\n\n        public JeecgLlmTools(ToolSpecification toolSpecification, ToolExecutor toolExecutor) {\n            this.toolSpecification = toolSpecification;\n            this.toolExecutor = toolExecutor;\n        }\n\n\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/PluginToolBuilder.java",
    "content": "package org.jeecg.modules.airag.llm.handler;\n\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport dev.langchain4j.agent.tool.ToolSpecification;\nimport dev.langchain4j.model.chat.request.json.JsonObjectSchema;\nimport dev.langchain4j.service.tool.ToolExecutor;\nimport jakarta.servlet.http.HttpServletRequest;\nimport lombok.extern.slf4j.Slf4j;\n\nimport org.jeecg.common.util.CommonUtils;\nimport org.jeecg.common.util.RestUtil;\nimport org.jeecg.common.util.TokenUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.airag.common.consts.AiragConsts;\nimport org.jeecg.modules.airag.flow.component.ToolsNode;\nimport org.jeecg.modules.airag.llm.entity.AiragMcp;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.http.HttpMethod;\nimport org.springframework.http.MediaType;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.client.HttpClientErrorException;\n\nimport java.util.*;\n\n/**\n * 插件工具构建器\n * 根据插件配置构建ToolSpecification和ToolExecutor\n * for [QQYUN-12453]【AI】支持插件\n *\n * @author chenrui\n * @date 2025/10/30\n */\n@Slf4j\npublic class PluginToolBuilder {\n\n    /**\n     * 从插件配置构建工具Map\n     *\n     * @param airagMcp 插件配置\n     * @return Map<ToolSpecification, ToolExecutor>\n     */\n    public static Map<ToolSpecification, ToolExecutor> buildTools(AiragMcp airagMcp, HttpServletRequest currentHttpRequest) {\n        Map<ToolSpecification, ToolExecutor> tools = new HashMap<>();\n        if (airagMcp == null || oConvertUtils.isEmpty(airagMcp.getTools())) {\n            return tools;\n        }\n\n        try {\n            JSONArray toolsArray = JSONArray.parseArray(airagMcp.getTools());\n            if (toolsArray == null || toolsArray.isEmpty()) {\n                return tools;\n            }\n\n            String baseUrl = airagMcp.getEndpoint();\n            boolean isEmptyBaseUrl = oConvertUtils.isEmpty(baseUrl);\n            // 如果baseUrl为空，使用当前系统地址\n            if (isEmptyBaseUrl) {\n                if (currentHttpRequest != null) {\n                    baseUrl = CommonUtils.getBaseUrl(currentHttpRequest);\n                    log.info(\"插件[{}]的BaseURL为空，使用系统地址: {}\", airagMcp.getName(), baseUrl);\n                } else {\n                    log.warn(\"插件[{}]的BaseURL为空且无法获取系统地址，跳过工具构建\", airagMcp.getName());\n                    return tools;\n                }\n            }\n\n            // 解析headers\n            Map<String, String> headersMap = parseHeaders(airagMcp.getHeaders());\n\n            // 判断是否需要加签\n            boolean isNeedSign = isEmptyBaseUrl && ToolsNode.Helper.checkNeedSign(headersMap);\n\n            // 解析并应用授权配置（从metadata中读取）\n            applyAuthConfig(headersMap, airagMcp.getMetadata(), currentHttpRequest);\n\n            for (int i = 0; i < toolsArray.size(); i++) {\n                JSONObject toolConfig = toolsArray.getJSONObject(i);\n                if (toolConfig == null) {\n                    continue;\n                }\n\n                try {\n                    ToolSpecification spec = buildToolSpecification(toolConfig);\n                    ToolExecutor executor = buildToolExecutor(toolConfig, baseUrl, headersMap, isNeedSign);\n                    if (spec != null && executor != null) {\n                        tools.put(spec, executor);\n                    }\n                } catch (Exception e) {\n                    log.error(\"构建插件工具失败，工具配置: {}\", toolConfig.toJSONString(), e);\n                }\n            }\n        } catch (Exception e) {\n            log.error(\"解析插件工具配置失败，插件: {}\", airagMcp.getName(), e);\n        }\n\n        return tools;\n    }\n\n    /**\n     * 构建ToolSpecification\n     */\n    private static ToolSpecification buildToolSpecification(JSONObject toolConfig) {\n        String name = toolConfig.getString(\"name\");\n        String description = toolConfig.getString(\"description\");\n\n        if (oConvertUtils.isEmpty(name) || oConvertUtils.isEmpty(description)) {\n            log.warn(\"工具配置缺少name或description字段\");\n            return null;\n        }\n\n        // 构建完整的描述信息（包含响应参数配置）\n        StringBuilder fullDescription = new StringBuilder(description);\n        \n        // 解析响应参数并拼接到描述中\n        JSONArray responses = toolConfig.getJSONArray(\"responses\");\n        if (responses != null && !responses.isEmpty()) {\n            fullDescription.append(\"\\n\\n返回值说明：\");\n            for (int i = 0; i < responses.size(); i++) {\n                JSONObject responseParam = responses.getJSONObject(i);\n                if (responseParam == null) {\n                    continue;\n                }\n                String paramName = responseParam.getString(\"name\");\n                String paramDesc = responseParam.getString(\"description\");\n                String paramType = responseParam.getString(\"type\");\n\n                if (oConvertUtils.isEmpty(paramName)) {\n                    continue;\n                }\n\n                fullDescription.append(\"\\n- \").append(paramName);\n                if (oConvertUtils.isNotEmpty(paramType)) {\n                    fullDescription.append(\" (\").append(paramType).append(\")\");\n                }\n                if (oConvertUtils.isNotEmpty(paramDesc)) {\n                    fullDescription.append(\": \").append(paramDesc);\n                }\n            }\n        }\n\n        JsonObjectSchema.Builder schemaBuilder = JsonObjectSchema.builder();\n\n        // 解析请求参数\n        JSONArray parameters = toolConfig.getJSONArray(\"parameters\");\n        if (parameters != null && !parameters.isEmpty()) {\n            List<String> requiredParams = new ArrayList<>();\n            for (int i = 0; i < parameters.size(); i++) {\n                JSONObject param = parameters.getJSONObject(i);\n                if (param == null) {\n                    continue;\n                }\n                String paramName = param.getString(\"name\");\n                String paramDesc = param.getString(\"description\");\n                String paramType = param.getString(\"type\");\n\n                if (oConvertUtils.isEmpty(paramName)) {\n                    continue;\n                }\n\n                // 根据参数类型添加属性\n                if (\"String\".equalsIgnoreCase(paramType) || \"string\".equalsIgnoreCase(paramType)) {\n                    schemaBuilder.addStringProperty(paramName, paramDesc != null ? paramDesc : \"\");\n                } else if (\"Number\".equalsIgnoreCase(paramType) || \"number\".equalsIgnoreCase(paramType)\n                        || \"Integer\".equalsIgnoreCase(paramType) || \"integer\".equalsIgnoreCase(paramType)) {\n                    schemaBuilder.addNumberProperty(paramName, paramDesc != null ? paramDesc : \"\");\n                } else if (\"Boolean\".equalsIgnoreCase(paramType) || \"boolean\".equalsIgnoreCase(paramType)) {\n                    schemaBuilder.addBooleanProperty(paramName, paramDesc != null ? paramDesc : \"\");\n                } else {\n                    // 默认作为String处理\n                    schemaBuilder.addStringProperty(paramName, paramDesc != null ? paramDesc : \"\");\n                }\n\n                // 检查是否必须\n                Boolean required = param.getBooleanValue(\"required\");\n                if (required != null && required) {\n                    requiredParams.add(paramName);\n                }\n            }\n\n            if (!requiredParams.isEmpty()) {\n                schemaBuilder.required(requiredParams.toArray(new String[0]));\n            }\n        }\n\n        return ToolSpecification.builder()\n                .name(name)\n                .description(fullDescription.toString())\n                .parameters(schemaBuilder.build())\n                .build();\n    }\n\n    /**\n     * 构建ToolExecutor\n     */\n    private static ToolExecutor buildToolExecutor(JSONObject toolConfig, String baseUrl, Map<String, String> defaultHeaders, boolean isNeedSign) {\n        String path = toolConfig.getString(\"path\");\n        String method = toolConfig.getString(\"method\");\n        JSONArray parameters = toolConfig.getJSONArray(\"parameters\");\n\n        if (oConvertUtils.isEmpty(path) || oConvertUtils.isEmpty(method)) {\n            log.warn(\"工具配置缺少path或method字段\");\n            return null;\n        }\n\n        return (toolExecutionRequest, memoryId) -> {\n            try {\n                // 解析AI传入的参数\n                JSONObject args = JSONObject.parseObject(toolExecutionRequest.arguments());\n\n                // 构建完整URL\n                String url = buildUrl(baseUrl, path, parameters, args);\n\n                // 构建请求方法\n                HttpMethod httpMethod = parseHttpMethod(method);\n\n                // 构建请求头\n                HttpHeaders httpHeaders = buildHttpHeaders(parameters, args, defaultHeaders);\n\n                // 构建请求参数\n                JSONObject urlVariables = buildUrlVariables(parameters, args);\n                Object body = buildRequestBody(parameters, args, httpHeaders);\n\n                if (isNeedSign) {\n                    // 发送请求前加签\n                    ToolsNode.Helper.applySignature(url, httpHeaders, urlVariables, body);\n                }\n\n                // 发送HTTP请求,增加超时时间\n                ResponseEntity<String> response = RestUtil.request(url, httpMethod, httpHeaders, urlVariables, body, String.class, AiragConsts.DEFAULT_TIMEOUT * 1000);\n\n                // 直接返回原始响应字符串，不进行解析\n                return response.getBody() != null ? response.getBody() : \"\";\n            } catch (HttpClientErrorException e) {\n                log.error(\"插件工具HTTP请求失败: {}\", e.getMessage(), e);\n                //update-begin---author:wangshuai---date:2026-01-16---for:【QQYUN-14577】图片搜索失败会导致进行不下去---\n                return \"插件调用失败（HTTP \" + e.getStatusCode() + \"）：\" + e.getResponseBodyAsString()\n                        + \"。请继续完成剩余任务。\";\n                //update-end---author:wangshuai---date:2026-01-16---for:【QQYUN-14577】图片搜索失败会导致进行不下去---\n            } catch (Exception e) {\n                log.error(\"插件工具执行失败: {}\", e.getMessage(), e);\n                //update-begin---author:wangshuai---date:2026-01-16---for:【QQYUN-14577】图片搜索失败会导致进行不下去---\n                return \"插件工具执行失败：\" + e.getMessage()\n                        + \"。请继续完成剩余任务。\";\n                //update-end---author:wangshuai---date:2026-01-16---for:【QQYUN-14577】图片搜索失败会导致进行不下去---\n            }\n        };\n    }\n\n    /**\n     * 构建完整URL（处理Path参数）\n     */\n    private static String buildUrl(String baseUrl, String path, JSONArray parameters, JSONObject args) {\n        String fullPath = path;\n        if (!path.startsWith(\"/\")) {\n            fullPath = \"/\" + path;\n        }\n        // 拼接URL时防止出现双斜杠\n        if (baseUrl.endsWith(\"/\") && fullPath.startsWith(\"/\")) {\n            fullPath = fullPath.substring(1);\n        }\n        String url = baseUrl + fullPath;\n\n        // 替换Path参数\n        if (parameters != null && args != null) {\n            for (int i = 0; i < parameters.size(); i++) {\n                JSONObject param = parameters.getJSONObject(i);\n                if (param == null) {\n                    continue;\n                }\n                String paramName = param.getString(\"name\");\n                String paramLocation = param.getString(\"location\");\n\n                if (!\"Path\".equalsIgnoreCase(paramLocation)) {\n                    continue;\n                }\n\n                Object value = args.get(paramName);\n                if (value != null) {\n                    url = url.replace(\"{\" + paramName + \"}\", value.toString());\n                }\n            }\n        }\n\n        return url;\n    }\n\n    /**\n     * 构建请求头\n     */\n    private static HttpHeaders buildHttpHeaders(JSONArray parameters, JSONObject args, Map<String, String> defaultHeaders) {\n        HttpHeaders httpHeaders = new HttpHeaders();\n\n        // 添加默认请求头\n        if (defaultHeaders != null) {\n            defaultHeaders.forEach(httpHeaders::set);\n        }\n\n        // 添加Header类型的参数\n        if (parameters != null && args != null) {\n            for (int i = 0; i < parameters.size(); i++) {\n                JSONObject param = parameters.getJSONObject(i);\n                if (param == null) {\n                    continue;\n                }\n                String paramName = param.getString(\"name\");\n                String paramLocation = param.getString(\"location\");\n\n                if (!\"Header\".equalsIgnoreCase(paramLocation)) {\n                    continue;\n                }\n\n                Object value = args.get(paramName);\n                if (value != null) {\n                    httpHeaders.set(paramName, value.toString());\n                }\n            }\n        }\n\n        // 如果请求体不为空且没有设置Content-Type，默认设置为application/json\n        if (!httpHeaders.containsKey(HttpHeaders.CONTENT_TYPE)) {\n            httpHeaders.setContentType(MediaType.APPLICATION_JSON);\n        }\n\n        return httpHeaders;\n    }\n\n    /**\n     * 构建URL查询参数\n     */\n    private static JSONObject buildUrlVariables(JSONArray parameters, JSONObject args) {\n        JSONObject urlVariables = new JSONObject();\n\n        if (parameters == null || args == null) {\n            return urlVariables;\n        }\n\n        for (int i = 0; i < parameters.size(); i++) {\n            JSONObject param = parameters.getJSONObject(i);\n            if (param == null) {\n                continue;\n            }\n            String paramName = param.getString(\"name\");\n            String paramLocation = param.getString(\"location\");\n\n            String location = paramLocation != null ? paramLocation : \"\";\n            // 显式指定Query类型，或者未指定类型（默认作为Query）\n            boolean isQueryParam = \"Query\".equalsIgnoreCase(location);\n            boolean isOtherType = \"Body\".equalsIgnoreCase(location) || \"Form-Data\".equalsIgnoreCase(location)\n                    || \"Header\".equalsIgnoreCase(location) || \"Path\".equalsIgnoreCase(location);\n            \n            if (isQueryParam || !isOtherType) {\n                Object value = args.get(paramName);\n                if (value != null) {\n                    //如果是知识库的id赋值默认值\n                    if (\"knowledgeId\".equalsIgnoreCase(paramName)) {\n                        String defaultValue = param.getString(\"defaultValue\");\n                        urlVariables.put(paramName, defaultValue);\n                    } else {\n                        urlVariables.put(paramName, value);\n                    }\n                }\n            }\n        }\n\n        return urlVariables.isEmpty() ? null : urlVariables;\n    }\n\n    /**\n     * 构建请求体\n     */\n    private static Object buildRequestBody(JSONArray parameters, JSONObject args, HttpHeaders httpHeaders) {\n        if (parameters == null || args == null) {\n            return null;\n        }\n\n        boolean hasBody = false;\n        boolean hasFormData = false;\n\n        // 检查是否有Body或Form-Data类型的参数\n        for (int i = 0; i < parameters.size(); i++) {\n            JSONObject param = parameters.getJSONObject(i);\n            if (param == null) {\n                continue;\n            }\n            String paramLocation = param.getString(\"location\");\n\n            if (\"Body\".equalsIgnoreCase(paramLocation)) {\n                hasBody = true;\n            } else if (\"Form-Data\".equalsIgnoreCase(paramLocation)) {\n                hasFormData = true;\n            }\n        }\n\n        // Body和Form-Data互斥\n        if (hasBody && hasFormData) {\n            log.warn(\"工具配置同时包含Body和Form-Data类型参数，优先使用Body\");\n            hasFormData = false;\n        }\n\n        if (hasBody) {\n            // Body类型：构建JSON对象\n            JSONObject body = new JSONObject();\n            for (int i = 0; i < parameters.size(); i++) {\n                JSONObject param = parameters.getJSONObject(i);\n                if (param == null) {\n                    continue;\n                }\n                String paramName = param.getString(\"name\");\n                String paramLocation = param.getString(\"location\");\n\n                if (!\"Body\".equalsIgnoreCase(paramLocation) ) {\n                    continue;\n                }\n\n                Object value = args.get(paramName);\n                if (value != null) {\n                    //如果是知识库的id赋值默认值\n                    if (\"knowledgeId\".equalsIgnoreCase(paramName)) {\n                        String defaultValue = param.getString(\"defaultValue\");\n                        body.put(paramName, defaultValue);\n                    } else {\n                        body.put(paramName, value);\n                    }\n                } else {\n                    // 检查是否有默认值\n                    String defaultValue = param.getString(\"defaultValue\");\n                    if (oConvertUtils.isNotEmpty(defaultValue)) {\n                        body.put(paramName, defaultValue);\n                    }\n                }\n            }\n            httpHeaders.setContentType(MediaType.APPLICATION_JSON);\n            return body.isEmpty() ? null : body;\n        } else if (hasFormData) {\n            // Form-Data类型：构建JSON对象（RestUtil会处理）\n            JSONObject formData = new JSONObject();\n            for (int i = 0; i < parameters.size(); i++) {\n                JSONObject param = parameters.getJSONObject(i);\n                if (param == null) {\n                    continue;\n                }\n                String paramName = param.getString(\"name\");\n                String paramLocation = param.getString(\"location\");\n\n                if (!\"Form-Data\".equalsIgnoreCase(paramLocation)) {\n                    continue;\n                }\n\n                Object value = args.get(paramName);\n                if (value != null) {\n                    formData.put(paramName, value);\n                } else {\n                    String defaultValue = param.getString(\"defaultValue\");\n                    if (oConvertUtils.isNotEmpty(defaultValue)) {\n                        formData.put(paramName, defaultValue);\n                    }\n                }\n            }\n            httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);\n            return formData.isEmpty() ? null : formData;\n        }\n\n        return null;\n    }\n\n    /**\n     * 解析HTTP方法\n     */\n    private static HttpMethod parseHttpMethod(String method) {\n        try {\n            return HttpMethod.valueOf(method.toUpperCase());\n        } catch (IllegalArgumentException e) {\n            log.warn(\"无效的HTTP方法: {}，使用默认GET\", method);\n            return HttpMethod.GET;\n        }\n    }\n\n\n    /**\n     * 解析headers JSON字符串为Map\n     */\n    private static Map<String, String> parseHeaders(String headersStr) {\n        Map<String, String> headersMap = new HashMap<>();\n        if (oConvertUtils.isEmpty(headersStr)) {\n            return headersMap;\n        }\n\n        try {\n            JSONObject headersJson = JSONObject.parseObject(headersStr);\n            if (headersJson != null) {\n                headersJson.forEach((key, value) -> {\n                    if (value != null) {\n                        headersMap.put(key, value.toString());\n                    }\n                });\n            }\n        } catch (Exception e) {\n            log.warn(\"解析headers失败: {}\", headersStr);\n        }\n\n        return headersMap;\n    }\n\n    /**\n     * 应用授权配置到headers\n     * 从metadata中读取授权配置，如果是Token授权，添加到headers中\n     * 如果授权类型为token但没有设置token值，则从TokenUtils获取当前请求的token\n     *\n     * @param headersMap 请求头Map\n     * @param metadataStr 元数据JSON字符串\n     */\n    private static void applyAuthConfig(Map<String, String> headersMap, String metadataStr, HttpServletRequest currentHttpRequest) {\n        if (oConvertUtils.isEmpty(metadataStr)) {\n            return;\n        }\n\n        try {\n            JSONObject metadata = JSONObject.parseObject(metadataStr);\n            if (metadata == null) {\n                return;\n            }\n\n            String authType = metadata.getString(\"authType\");\n            if (oConvertUtils.isEmpty(authType) || !\"token\".equalsIgnoreCase(authType)) {\n                return;\n            }\n\n            // Token授权方式：从metadata中获取token配置并添加到headers\n            String tokenParamName = metadata.getString(\"tokenParamName\");\n            String tokenParamValue = metadata.getString(\"tokenParamValue\");\n\n            // 如果token参数名存在，但token值未设置，尝试从TokenUtils获取当前请求的token\n            if (oConvertUtils.isNotEmpty(tokenParamName) && oConvertUtils.isEmpty(tokenParamValue)) {\n                try {\n                    // 注意：TokenUtils需要获取当前线程的request，所以必须在同步调用中使用\n                    String currentToken = TokenUtils.getTokenByRequest();\n                    if(oConvertUtils.isEmpty(currentToken) && currentHttpRequest != null) {\n                        currentToken = TokenUtils.getTokenByRequest(currentHttpRequest);\n                    }\n                    if (oConvertUtils.isNotEmpty(currentToken)) {\n                        tokenParamValue = currentToken;\n                        log.debug(\"从TokenUtils获取Token并添加到请求头: {} = {}\", tokenParamName, \n                            currentToken.length() > 10 ? currentToken.substring(0, 10) + \"...\" : currentToken);\n                    } else {\n                        log.warn(\"Token授权配置中tokenParamValue为空，且无法从TokenUtils获取当前请求的token\");\n                    }\n                } catch (Exception e) {\n                    log.warn(\"从TokenUtils获取token失败: {}\", e.getMessage());\n                }\n            }\n\n            if (oConvertUtils.isNotEmpty(tokenParamName) && oConvertUtils.isNotEmpty(tokenParamValue)) {\n                // 如果headers中已存在同名header，优先使用metadata中的配置（覆盖）\n                headersMap.put(tokenParamName, tokenParamValue);\n                // 日志中只显示token的前几个字符，避免泄露完整token\n                String tokenPreview = tokenParamValue.length() > 10 \n                    ? tokenParamValue.substring(0, 10) + \"...\" \n                    : tokenParamValue;\n                log.debug(\"添加Token授权到请求头: {} = {}\", tokenParamName, tokenPreview);\n            } else {\n                log.warn(\"Token授权配置不完整: tokenParamName={}, tokenParamValue={}\", tokenParamName, tokenParamValue != null ? \"***\" : null);\n            }\n        } catch (Exception e) {\n            log.warn(\"解析授权配置失败: {}\", metadataStr, e);\n        }\n    }\n}\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/mapper/AiragKnowledgeDocMapper.java",
    "content": "package org.jeecg.modules.airag.llm.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.airag.llm.entity.AiragKnowledgeDoc;\n\n/**\n * @Description: airag知识库文档\n * @Author: jeecg-boot\n * @Date:   2025-02-18\n * @Version: V1.0\n */\npublic interface AiragKnowledgeDocMapper extends BaseMapper<AiragKnowledgeDoc> {\n\n\t/**\n\t * 通过主表id删除子表数据\n\t *\n\t * @param mainId 主表id\n\t * @return boolean\n\t */\n\tpublic boolean deleteByMainId(@Param(\"mainId\") String mainId);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/mapper/AiragKnowledgeMapper.java",
    "content": "package org.jeecg.modules.airag.llm.mapper;\n\nimport com.baomidou.mybatisplus.annotation.InterceptorIgnore;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.jeecg.modules.airag.llm.entity.AiragKnowledge;\n\n/**\n * @Description: AIRag知识库\n * @Author: jeecg-boot\n * @Date:   2025-02-18\n * @Version: V1.0\n */\npublic interface AiragKnowledgeMapper extends BaseMapper<AiragKnowledge> {\n\n    /**\n     * 根据ID查询知识库信息(忽略租户)\n     * for [QQYUN-12113]分享之后的聊天，应用、模型、知识库不根据租户查询\n     * @param id\n     * @return\n     * @author chenrui\n     * @date 2025/4/21 15:24\n     */\n    @InterceptorIgnore(tenantLine = \"true\")\n    AiragKnowledge getByIdIgnoreTenant(String id);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/mapper/AiragMcpMapper.java",
    "content": "package org.jeecg.modules.airag.llm.mapper;\n\nimport org.jeecg.modules.airag.llm.entity.AiragMcp;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: MCP\n * @Author: jeecg-boot\n * @Date:   2025-10-20\n * @Version: V1.0\n */\npublic interface AiragMcpMapper extends BaseMapper<AiragMcp> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/mapper/AiragModelMapper.java",
    "content": "package org.jeecg.modules.airag.llm.mapper;\n\nimport com.baomidou.mybatisplus.annotation.InterceptorIgnore;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.jeecg.modules.airag.llm.entity.AiragModel;\n\n/**\n * @Description: AiRag模型配置\n * @Author: jeecg-boot\n * @Date:   2025-02-14\n * @Version: V1.0\n */\npublic interface AiragModelMapper extends BaseMapper<AiragModel> {\n\n    /**\n     * 根据ID查询模型信息(忽略租户)\n     * for [QQYUN-12113]分享之后的聊天，应用、模型、知识库不根据租户查询\n     * @param id\n     * @return\n     * @author chenrui\n     * @date 2025/4/21 15:24\n     */\n    @InterceptorIgnore(tenantLine = \"true\")\n    AiragModel getByIdIgnoreTenant(String id);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/mapper/xml/AiragKnowledgeDocMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.airag.llm.mapper.AiragKnowledgeDocMapper\">\n\n    <delete id=\"deleteByMainId\" parameterType=\"java.lang.String\">\n        DELETE\n        FROM airag_knowledge_doc\n        WHERE knowledge_id = #{mainId}\n    </delete>\n\n</mapper>\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/mapper/xml/AiragKnowledgeMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.airag.llm.mapper.AiragKnowledgeMapper\">\n\n    <select id=\"getByIdIgnoreTenant\" resultType=\"org.jeecg.modules.airag.llm.entity.AiragKnowledge\">\n        SELECT * FROM airag_knowledge WHERE id = #{id}\n    </select>\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/mapper/xml/AiragMcpMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.airag.llm.mapper.AiragMcpMapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/mapper/xml/AiragModelMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.airag.llm.mapper.AiragModelMapper\">\n\n    <select id=\"getByIdIgnoreTenant\" resultType=\"org.jeecg.modules.airag.llm.entity.AiragModel\">\n        SELECT * FROM airag_model WHERE id = #{id}\n    </select>\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/service/IAiragFlowPluginService.java",
    "content": "package org.jeecg.modules.airag.llm.service;\n\nimport java.util.Map;\n\n/**\n * @Description: 获取流程mcp服务\n * @Author: wangshuai\n * @Date: 2025-12-22 15:34:20\n * @Version: V1.0\n */\npublic interface IAiragFlowPluginService {\n\n    /**\n     * 同步所有启用的流程到MCP插件配置\n     *\n     * @param flowIds 多个流程id\n     */\n    Map<String, Object> getFlowsToPlugin(String flowIds);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/service/IAiragKnowledgeDocService.java",
    "content": "package org.jeecg.modules.airag.llm.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.modules.airag.llm.entity.AiragKnowledgeDoc;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport java.util.List;\n\n/**\n * airag知识库文档\n * @Author: jeecg-boot\n * @Date: 2025-02-18\n * @Version: V1.0\n */\npublic interface IAiragKnowledgeDocService extends IService<AiragKnowledgeDoc> {\n\n    /**\n     * 重建文档\n     *\n     * @param docIds\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 11:14\n     */\n    Result<?> rebuildDocument(String docIds);\n\n    /**\n     * 添加文档\n     *\n     * @param airagKnowledgeDoc\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 15:30\n     */\n    Result<?> editDocument(AiragKnowledgeDoc airagKnowledgeDoc);\n\n\n    /**\n     * 通过知识库id重建文档\n     *\n     * @param knowId\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 18:54\n     */\n    Result<?> rebuildDocumentByKnowId(String knowId);\n\n\n    /**\n     * 通过知识库id删除文档\n     *\n     * @param knowIds\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 18:59\n     */\n    Result<?> removeByKnowIds(List<String> knowIds);\n\n    /**\n     * 通过文档id批量删除文档\n     *\n     * @param docIds\n     * @return\n     * @author chenrui\n     * @date 2025/2/18 19:16\n     */\n    Result<?> removeDocByIds(List<String> docIds);\n\n    /**\n     * 通过知识库id删除所以文档\n     *\n     * @param knowId\n     * @return\n     */\n    Result<?> deleteAllByKnowId(String knowId);\n\n    /**\n     * 从zip包导入文档\n     * @param knowId\n     * @param file\n     * @return\n     * @author chenrui\n     * @date 2025/3/20 13:50\n     */\n    Result<?> importDocumentFromZip(String knowId, MultipartFile file);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/service/IAiragKnowledgeService.java",
    "content": "package org.jeecg.modules.airag.llm.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.airag.llm.entity.AiragKnowledge;\n\nimport java.util.Map;\n\n/**\n * AIRag知识库\n *\n * @Author: jeecg-boot\n * @Date: 2025-02-18\n * @Version: V1.0\n */\npublic interface IAiragKnowledgeService extends IService<AiragKnowledge> {\n    \n    /**\n     * 构建知识库的工具\n     * \n     * @param memoryId\n     * @return Map<String, Object>\n     */\n    Map<String, Object> getPluginMemory(String memoryId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/service/IAiragMcpService.java",
    "content": "package org.jeecg.modules.airag.llm.service;\n\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.modules.airag.llm.entity.AiragMcp;\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * @Description: MCP\n * @Author: jeecg-boot\n * @Date:   2025-10-20\n * @Version: V1.0\n */\npublic interface IAiragMcpService extends IService<AiragMcp> {\n\n    Result<String> edit(AiragMcp airagMcp);\n\n    Result<?> sync(String id);\n\n\n    Result<?> toggleStatus(String id, String action);\n\n    /**\n     * 保存插件工具（仅更新tools字段）\n     * for [QQYUN-12453]【AI】支持插件\n     * @param id 插件ID\n     * @param tools 工具列表JSON字符串\n     * @return 操作结果\n     * @author chenrui\n     * @date 2025/10/30\n     */\n    Result<String> saveTools(String id, String tools);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/service/IAiragModelService.java",
    "content": "package org.jeecg.modules.airag.llm.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport dev.langchain4j.data.message.ChatMessage;\nimport org.jeecg.modules.airag.llm.entity.AiragModel;\n\nimport java.util.List;\n\n/**\n * @Description: AiRag模型配置\n * @Author: jeecg-boot\n * @Date:   2025-02-14\n * @Version: V1.0\n */\npublic interface IAiragModelService extends IService<AiragModel> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/service/impl/AiragBaseApiImpl.java",
    "content": "package org.jeecg.modules.airag.llm.service.impl;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.airag.api.IAiragBaseApi;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.exception.JeecgBootBizTipException;\nimport org.jeecg.common.util.AssertUtils;\nimport org.jeecg.modules.airag.llm.consts.LLMConsts;\nimport org.jeecg.modules.airag.llm.entity.AiragKnowledgeDoc;\nimport org.jeecg.modules.airag.llm.service.IAiragKnowledgeDocService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.stereotype.Service;\n\n/**\n * airag baseAPI 实现类\n */\n@Slf4j\n@Primary\n@Service(\"airagBaseApiImpl\")\npublic class AiragBaseApiImpl implements IAiragBaseApi {\n\n    @Autowired\n    private IAiragKnowledgeDocService airagKnowledgeDocService;\n\n    @Override\n    public String knowledgeWriteTextDocument(String knowledgeId, String title, String content) {\n        AssertUtils.assertNotEmpty(\"知识库ID不能为空\", knowledgeId);\n        AssertUtils.assertNotEmpty(\"写入内容不能为空\", content);\n        AiragKnowledgeDoc knowledgeDoc = new AiragKnowledgeDoc();\n        knowledgeDoc.setKnowledgeId(knowledgeId);\n        knowledgeDoc.setTitle(title);\n        knowledgeDoc.setType(LLMConsts.KNOWLEDGE_DOC_TYPE_TEXT);\n        knowledgeDoc.setContent(content);\n        Result<?> result = airagKnowledgeDocService.editDocument(knowledgeDoc);\n        if (!result.isSuccess()) {\n            throw new JeecgBootBizTipException(result.getMessage());\n        }\n        if (knowledgeDoc.getId() == null) {\n            throw new JeecgBootBizTipException(\"知识库文档ID为空\");\n        }\n        log.info(\"[AI-KNOWLEDGE] 文档写入完成，知识库:{}, 文档ID:{}\", knowledgeId, knowledgeDoc.getId());\n        return knowledgeDoc.getId();\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/service/impl/AiragFlowPluginServiceImpl.java",
    "content": "package org.jeecg.modules.airag.llm.service.impl;\n\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport dev.langchain4j.agent.tool.ToolSpecification;\nimport dev.langchain4j.service.tool.ToolExecutor;\nimport jakarta.servlet.http.HttpServletRequest;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.TokenUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.airag.flow.consts.FlowConsts;\nimport org.jeecg.modules.airag.flow.entity.AiragFlow;\nimport org.jeecg.modules.airag.flow.service.IAiragFlowService;\nimport org.jeecg.modules.airag.flow.vo.api.SubFlowResult;\nimport org.jeecg.modules.airag.flow.vo.flow.config.FlowNodeConfig;\nimport org.jeecg.modules.airag.llm.consts.FlowPluginContent;\nimport org.jeecg.modules.airag.llm.entity.AiragMcp;\nimport org.jeecg.modules.airag.llm.handler.PluginToolBuilder;\nimport org.jeecg.modules.airag.llm.service.IAiragFlowPluginService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.*;\n\n/**\n * @Description: 流程同步到MCP服务实现类\n * @Author: wangshuai\n * @Date: 2025-12-22\n * @Version: V1.0\n */\n@Service\n@Slf4j\npublic class AiragFlowPluginServiceImpl implements IAiragFlowPluginService {\n\n    @Autowired\n    private IAiragFlowService airagFlowService;\n\n    @Override\n    public Map<String, Object> getFlowsToPlugin(String flowIds) {\n        log.info(\"开始构建流程插件\");\n        // 1. 查询所有启用的流程\n        LambdaQueryWrapper<AiragFlow> queryWrapper = new LambdaQueryWrapper<>();\n        queryWrapper.eq(AiragFlow::getStatus, FlowConsts.FLOW_STATUS_ENABLE);\n        queryWrapper.in(AiragFlow::getId, Arrays.asList(flowIds.split(SymbolConstant.COMMA)));\n        List<AiragFlow> flows = airagFlowService.list(queryWrapper);\n        HttpServletRequest httpServletRequest = SpringContextUtils.getHttpServletRequest();\n        if (flows.isEmpty()) {\n            log.info(\"当前应用所选流程没有启用的流程\");\n            return null;\n        }\n        //返回数据\n        Map<String, Object> result = new HashMap<>();\n        //插件\n        //插件id\n        AiragMcp tool = new AiragMcp();\n        // 2. 构建插件\n        String id = UUID.randomUUID().toString().replace(\"-\", \"\");\n        tool.setId(id);\n        // 插件名称\n        tool.setName(FlowPluginContent.PLUGIN_NAME);\n        // 描述\n        tool.setDescr(FlowPluginContent.PLUGIN_DESC);\n        tool.setStatus(FlowConsts.FLOW_STATUS_ENABLE);\n        tool.setSynced(CommonConstant.STATUS_1_INT);\n        tool.setCategory(\"plugin\");\n        tool.setEndpoint(\"\");\n        int toolCount = 0;\n        //构建拆件工具\n        for (AiragFlow flow : flows) {\n            try {\n\n                SubFlowResult subFlow = new SubFlowResult(flow);\n                // 获取入参参数\n                JSONArray parameter = getInputParameter(flow, subFlow);\n                // 获取出参参数\n                JSONArray outParams = getOutputParameter(flow, subFlow);\n                // name必须符合 ^[a-zA-Z0-9_-]+$\n                String validToolName = \"flow_\" + flow.getId();\n                // 将原始名称拼接到描述中\n                String description = flow.getName();\n                if (oConvertUtils.isNotEmpty(flow.getDescr())) {\n                    description += \" : \" + flow.getDescr();\n                }\n                //构造工具参数\n                String flowTool = buildParameter(parameter, outParams, flow.getId(), tool.getTools(), validToolName, description);\n                tool.setTools(flowTool);\n                toolCount++;\n            } catch (Exception e) {\n                log.error(\"处理流程[{}]转换插件失败: {}\", flow.getName(), e.getMessage());\n            }\n        }\n        String tenantId = TokenUtils.getTenantIdByRequest(httpServletRequest);\n        //构建元数据（请求头）\n        String meataData = buildMetadata(toolCount, tenantId);\n        tool.setMetadata(meataData);\n        Map<ToolSpecification, ToolExecutor> tools = PluginToolBuilder.buildTools(tool, httpServletRequest);\n        result.put(\"pluginTool\", tools);\n        result.put(\"pluginId\", id);\n        log.info(\"构建流程插件结束\");\n        return result;\n    }\n\n    /**\n     * 构建元数据\n     *\n     * @param toolCount\n     * @param tenantId\n     */\n    private String buildMetadata(int toolCount, String tenantId) {\n        JSONObject jsonObject = new JSONObject();\n        jsonObject.put(FlowPluginContent.TOKEN_PARAM_NAME, FlowPluginContent.X_ACCESS_TOKEN);\n        jsonObject.put(FlowPluginContent.TOOL_COUNT, toolCount);\n        jsonObject.put(FlowPluginContent.AUTH_TYPE, FlowPluginContent.TOKEN);\n        jsonObject.put(FlowPluginContent.TOKEN_PARAM_VALUE, \"\");\n        jsonObject.put(CommonConstant.TENANT_ID, oConvertUtils.getInt(tenantId, 0));\n        return jsonObject.toJSONString();\n    }\n\n    /**\n     * 构建参数\n     *\n     * @param parameter\n     * @param outParams\n     * @param flowId\n     * @param tools\n     * @param description\n     * @param name\n     */\n    private String buildParameter(JSONArray parameter, JSONArray outParams, String flowId, String tools, String name, String description) {\n        JSONArray paramArray = new JSONArray();\n        JSONObject parameterObject = new JSONObject();\n        parameterObject.put(FlowPluginContent.NAME, name);\n        parameterObject.put(FlowPluginContent.DESCRIPTION, description);\n        parameterObject.put(FlowPluginContent.PATH, FlowPluginContent.PLUGIN_REQUEST_URL + flowId);\n        parameterObject.put(FlowPluginContent.METHOD, FlowPluginContent.POST);\n        parameterObject.put(FlowPluginContent.ENABLED, true);\n        parameterObject.put(FlowPluginContent.PARAMETERS, parameter);\n        parameterObject.put(FlowPluginContent.RESPONSES, outParams);\n        if (oConvertUtils.isNotEmpty(tools)) {\n            paramArray = JSONArray.parseArray(tools);\n            paramArray.add(parameterObject);\n        } else {\n            paramArray.add(parameterObject);\n        }\n        return paramArray.toJSONString();\n    }\n\n    /**\n     * 获取参数\n     *\n     * @param flow\n     * @param subFlow\n     */\n    private JSONArray getInputParameter(AiragFlow flow, SubFlowResult subFlow) {\n        JSONArray parameters = new JSONArray();\n        String metadata = flow.getMetadata();\n        if (oConvertUtils.isNotEmpty(metadata)) {\n            JSONObject jsonObject = JSONObject.parseObject(metadata);\n            if (jsonObject.containsKey(FlowPluginContent.INPUTS)) {\n                JSONArray jsonArray = jsonObject.getJSONArray(FlowPluginContent.INPUTS);\n                jsonArray.forEach(item -> {\n                    if (oConvertUtils.isNotEmpty(item.toString())) {\n                        JSONObject json = JSONObject.parseObject(item.toString());\n                        json.put(FlowPluginContent.LOCATION, FlowPluginContent.LOCATION_BODY);\n                    }\n                });\n                parameters.addAll(jsonArray);\n            }\n        }\n        //需要获取子流程的参数，子流程的参数是单独封装的，否则在流程执行的时候会报错缺少参数\n        List<FlowNodeConfig.NodeParam> inputParams = subFlow.getInputParams();\n        if (inputParams != null) {\n            for (FlowNodeConfig.NodeParam param : inputParams) {\n                JSONObject p = new JSONObject();\n                // 参数名\n                p.put(FlowPluginContent.NAME, param.getField());\n                String paramDesc = param.getName();\n                if (oConvertUtils.isEmpty(paramDesc)) {\n                    paramDesc = param.getField();\n                }\n                // 参数描述\n                p.put(FlowPluginContent.DESCRIPTION, paramDesc);\n                // 类型\n                p.put(FlowPluginContent.TYPE, oConvertUtils.getString(param.getType(), FlowPluginContent.TYPE_STRING));\n                // 所有参数都在Body中\n                p.put(FlowPluginContent.LOCATION, FlowPluginContent.LOCATION_BODY);\n                boolean required = param.getRequired() != null && param.getRequired();\n                p.put(FlowPluginContent.REQUIRED, required);\n                parameters.add(p);\n            }\n        }\n        return parameters;\n    }\n\n    /**\n     * 构建返回值\n     */\n    private JSONArray getOutputParameter(AiragFlow flow, SubFlowResult subFlow) {\n        JSONArray parameters = new JSONArray();\n        String metadata = flow.getMetadata();\n        if (oConvertUtils.isNotEmpty(metadata)) {\n            JSONObject jsonObject = JSONObject.parseObject(metadata);\n            if (jsonObject.containsKey(FlowPluginContent.OUTPUTS)) {\n                JSONArray jsonArray = jsonObject.getJSONArray(FlowPluginContent.OUTPUTS);\n                parameters.addAll(jsonArray);\n            }\n        }\n//        List<FlowNodeConfig.NodeParam> outputParams = subFlow.getOutputParams();\n//        if (outputParams != null) {\n//            for (FlowNodeConfig.NodeParam param : outputParams) {\n//                JSONObject p = new JSONObject();\n//                // 参数名\n//                p.put(\"name\", param.getField());\n//                String paramDesc = param.getName();\n//                if (oConvertUtils.isEmpty(paramDesc)) {\n//                    paramDesc = param.getField();\n//                }\n//                // 参数描述\n//                p.put(\"description\", paramDesc);\n//                // 类型\n//                p.put(\"type\", oConvertUtils.getString(param.getType(), \"String\"));\n//                parameters.add(p);\n//            }\n//        }\n        return parameters;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/service/impl/AiragKnowledgeDocServiceImpl.java",
    "content": "package org.jeecg.modules.airag.llm.service.impl;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.compress.archivers.zip.ZipArchiveEntry;\nimport org.apache.commons.compress.archivers.zip.ZipFile;\nimport org.apache.commons.io.FilenameUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.config.mqtoken.UserTokenContext;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.util.*;\nimport org.jeecg.common.util.filter.SsrfFileTypeFilter;\nimport org.jeecg.modules.airag.llm.consts.LLMConsts;\nimport org.jeecg.modules.airag.llm.entity.AiragKnowledge;\nimport org.jeecg.modules.airag.llm.entity.AiragKnowledgeDoc;\nimport org.jeecg.modules.airag.llm.handler.EmbeddingHandler;\nimport org.jeecg.modules.airag.llm.mapper.AiragKnowledgeDocMapper;\nimport org.jeecg.modules.airag.llm.mapper.AiragKnowledgeMapper;\nimport org.jeecg.modules.airag.llm.service.IAiragKnowledgeDocService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\nimport java.util.*;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.atomic.AtomicInteger;\nimport java.util.function.Consumer;\nimport java.util.stream.Collectors;\n\nimport static org.jeecg.modules.airag.llm.consts.LLMConsts.*;\n\n/**\n * @Description: airag知识库文档\n * @Author: jeecg-boot\n * @Date: 2025-02-18\n * @Version: V1.0\n */\n@Slf4j\n@Service\npublic class AiragKnowledgeDocServiceImpl extends ServiceImpl<AiragKnowledgeDocMapper, AiragKnowledgeDoc> implements IAiragKnowledgeDocService {\n\n    @Autowired\n    private AiragKnowledgeDocMapper airagKnowledgeDocMapper;\n\n    @Autowired\n    private AiragKnowledgeMapper airagKnowledgeMapper;\n\n    @Autowired\n    EmbeddingHandler embeddingHandler;\n\n\n    @Value(value = \"${jeecg.path.upload:}\")\n    private String uploadpath;\n\n    /**\n     * 支持的文档类型\n     */\n    private static final List<String> SUPPORT_DOC_TYPE = Arrays.asList(\"txt\", \"pdf\", \"docx\", \"doc\", \"pptx\", \"ppt\", \"xlsx\", \"xls\", \"md\");\n\n    /**\n     * 向量化线程池大小\n     */\n    private static final int THREAD_POOL_SIZE = 10;\n\n    /**\n     * 向量化文档线程池\n     */\n    private static final ExecutorService buildDocExecutorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);\n\n    // 解压文件:单个文件最大150MB\n    private static final long MAX_FILE_SIZE = 150 * 1024 * 1024;\n    // 解压文件:总解压大小1024MB\n    private static final long MAX_TOTAL_SIZE = 1024 * 1024 * 1024;\n    // 解压文件:最多解压10000个Entry\n    private static final int MAX_ENTRY_COUNT = 10000;\n\n    @Transactional(rollbackFor = {Exception.class})\n    @Override\n    public Result<?> editDocument(AiragKnowledgeDoc airagKnowledgeDoc) {\n        AssertUtils.assertNotEmpty(\"文档不能未空\", airagKnowledgeDoc);\n        AssertUtils.assertNotEmpty(\"知识库不能未空\", airagKnowledgeDoc.getKnowledgeId());\n        AssertUtils.assertNotEmpty(\"文档标题不能未空\", airagKnowledgeDoc.getTitle());\n        AssertUtils.assertNotEmpty(\"文档类型不能未空\", airagKnowledgeDoc.getType());\n        if (KNOWLEDGE_DOC_TYPE_TEXT.equals(airagKnowledgeDoc.getType())) {\n            AssertUtils.assertNotEmpty(\"文档内容不能为空\", airagKnowledgeDoc.getContent());\n        }\n\n        airagKnowledgeDoc.setStatus(KNOWLEDGE_DOC_STATUS_DRAFT);\n        // 保存到数据库\n        if (this.saveOrUpdate(airagKnowledgeDoc)) {\n            // 重建向量\n            return this.rebuildDocument(airagKnowledgeDoc.getId());\n        } else {\n            return Result.error(\"保存失败\");\n        }\n    }\n\n    @Override\n    public Result<?> rebuildDocumentByKnowId(String knowId) {\n        AssertUtils.assertNotEmpty(\"知识库id不能为空\", knowId);\n        List<AiragKnowledgeDoc> docList = airagKnowledgeDocMapper.selectList(Wrappers.lambdaQuery(AiragKnowledgeDoc.class).eq(AiragKnowledgeDoc::getKnowledgeId, knowId));\n        if (oConvertUtils.isObjectEmpty(docList)) {\n            return Result.OK();\n        }\n        String docIds = docList.stream().map(AiragKnowledgeDoc::getId).collect(Collectors.joining(\",\"));\n        return rebuildDocument(docIds);\n    }\n\n    @Transactional(rollbackFor = {java.lang.Exception.class})\n    @Override\n    public Result<?> rebuildDocument(String docIds) {\n        AssertUtils.assertNotEmpty(\"请选择要重建的文档\", docIds);\n        List<String> docIdList = Arrays.asList(docIds.split(\",\"));\n        // 查询数据\n        List<AiragKnowledgeDoc> docList = airagKnowledgeDocMapper.selectBatchIds(docIdList);\n        AssertUtils.assertNotEmpty(\"文档不存在\", docList);\n\n        // 检查状态\n        List<AiragKnowledgeDoc> knowledgeDocs = docList.stream()\n                .filter(doc -> {\n                    //update-begin---author:chenrui ---date:20250410  for：[QQYUN-11943]【ai】ai知识库 上传完文档 一直显示构建中？------------\n                    if(KNOWLEDGE_DOC_STATUS_BUILDING.equalsIgnoreCase(doc.getStatus())){\n                        Date updateTime = doc.getUpdateTime();\n                        if (updateTime != null) {\n                            // 向量化超过了5分钟,重新向量化\n                            long timeDifference = System.currentTimeMillis() - updateTime.getTime();\n                            return timeDifference > 5 * 60 * 1000;\n                        }else{\n                            return true;\n                        }\n                    } else {\n                        return true;\n                    }\n                    //update-end---author:chenrui ---date:20250410  for：[QQYUN-11943]【ai】ai知识库 上传完文档 一直显示构建中？------------\n                })\n                .peek(doc -> {\n                    doc.setStatus(KNOWLEDGE_DOC_STATUS_BUILDING);\n                })\n                .collect(Collectors.toList());\n        if (oConvertUtils.isObjectEmpty(knowledgeDocs)) {\n            return Result.ok(\"操作成功\");\n        }\n        if (oConvertUtils.isObjectEmpty(knowledgeDocs)) {\n            return Result.ok(\"操作成功\");\n        }\n        // 更新状态\n        this.updateBatchById(knowledgeDocs);\n        // 异步重建文档\n        String tenantId = TenantContext.getTenant();\n        String token = TokenUtils.getTokenByRequest();\n        knowledgeDocs.forEach((doc) -> {\n            CompletableFuture.runAsync(() -> {\n                UserTokenContext.setToken(token);\n                TenantContext.setTenant(tenantId);\n                String knowId = doc.getKnowledgeId();\n                log.info(\"开始重建文档, 知识库id: {}, 文档id: {}\", knowId, doc.getId());\n                doc.setStatus(KNOWLEDGE_DOC_STATUS_BUILDING);\n                this.updateById(doc);\n                //update-begin---author:chenrui ---date:20250410  for：[QQYUN-11943]【ai】ai知识库 上传完文档 一直显示构建中？------------\n                try {\n                    Map<String, Object> metadata = embeddingHandler.embeddingDocument(knowId, doc);\n                    // 更新数据 date:2025/2/18\n                    if (null != metadata) {\n                        doc.setStatus(KNOWLEDGE_DOC_STATUS_COMPLETE);\n                        this.updateById(doc);\n                        log.info(\"重建文档成功, 知识库id: {}, 文档id: {}\", knowId, doc.getId());\n                    } else {\n                        this.handleDocBuildFailed(doc, \"向量化失败\");\n                        log.info(\"重建文档失败, 知识库id: {}, 文档id: {}\", knowId, doc.getId());\n                    }\n                }catch (Throwable t){\n                    this.handleDocBuildFailed(doc, t.getMessage());\n                    log.error(\"重建文档失败:\" + t.getMessage() + \", 知识库id: \" + knowId + \", 文档id: \" + doc.getId(), t);\n                }\n                //update-end---author:chenrui ---date:20250410  for：[QQYUN-11943]【ai】ai知识库 上传完文档 一直显示构建中？------------\n            }, buildDocExecutorService);\n        });\n        log.info(\"返回操作成功\");\n        return Result.ok(\"操作成功\");\n    }\n\n    /**\n     * 处理文档构建失败\n     */\n    private void handleDocBuildFailed(AiragKnowledgeDoc doc, String failedReason) {\n        doc.setStatus(KNOWLEDGE_DOC_STATUS_FAILED);\n\n        String metadataStr = doc.getMetadata();\n        JSONObject metadata;\n        if (oConvertUtils.isEmpty(metadataStr)) {\n            metadata = new JSONObject();\n        } else {\n            metadata = JSONObject.parseObject(metadataStr);\n        }\n        metadata.put(\"failedReason\", failedReason);\n        doc.setMetadata(metadata.toJSONString());\n\n        this.updateById(doc);\n    }\n\n    @Override\n    public Result<?> removeByKnowIds(List<String> knowIds) {\n        AssertUtils.assertNotEmpty(\"选择知识库\", knowIds);\n        for (String knowId : knowIds) {\n            AiragKnowledge airagKnowledge = airagKnowledgeMapper.selectById(knowId);\n            AssertUtils.assertNotEmpty(\"知识库不存在\", airagKnowledge);\n            AssertUtils.assertNotEmpty(\"请先为知识库配置向量模型库\", airagKnowledge.getEmbedId());\n            // 异步删除向量数据\n            final String embedId = airagKnowledge.getEmbedId();\n            final String finalKnowId = knowId;\n            CompletableFuture.runAsync(() -> {\n                try {\n                    embeddingHandler.deleteEmbedDocsByKnowId(finalKnowId, embedId);\n                } catch (Throwable ignore) {\n                }\n            });\n            // 删除数据\n            airagKnowledgeDocMapper.deleteByMainId(knowId);\n        }\n        return Result.OK();\n    }\n\n    @Override\n    public Result<?> removeDocByIds(List<String> docIds) {\n        AssertUtils.assertNotEmpty(\"请选择要删除的文档\", docIds);\n        // 查询数据\n        List<AiragKnowledgeDoc> docList = airagKnowledgeDocMapper.selectBatchIds(docIds);\n        AssertUtils.assertNotEmpty(\"文档不存在\", docList);\n        // 整理数据\n        Map<String, List<String>> knowledgeDocs = docList.stream().collect(Collectors.groupingBy(\n                AiragKnowledgeDoc::getKnowledgeId,\n                Collectors.mapping(AiragKnowledgeDoc::getId, Collectors.toList())\n        ));\n        if (oConvertUtils.isObjectEmpty(knowledgeDocs)) {\n            return Result.ok(\"success\");\n        }\n        knowledgeDocs.forEach((knowId, groupedDocIds) -> {\n            AiragKnowledge airagKnowledge = airagKnowledgeMapper.selectById(knowId);\n            AssertUtils.assertNotEmpty(\"知识库不存在\", airagKnowledge);\n            AssertUtils.assertNotEmpty(\"请先为知识库配置向量模型库\", airagKnowledge.getEmbedId());\n            // 异步删除向量数据\n            final String embedId = airagKnowledge.getEmbedId();\n            final List<String> docIdsToDelete = new ArrayList<>(groupedDocIds);\n            CompletableFuture.runAsync(() -> {\n                try {\n                    embeddingHandler.deleteEmbedDocsByDocIds(docIdsToDelete, embedId);\n                } catch (Throwable ignore) {\n                }\n            });\n            // 删除数据\n            airagKnowledgeDocMapper.deleteBatchIds(groupedDocIds);\n        });\n        return Result.ok(\"success\");\n    }\n\n    @Override\n    public Result<?> deleteAllByKnowId(String knowId) {\n        if (oConvertUtils.isEmpty(knowId)) {\n            return Result.error(\"知识库id不能为空\");\n        }\n        LambdaQueryWrapper<AiragKnowledgeDoc> wrapper = new LambdaQueryWrapper<>();\n        wrapper.eq(AiragKnowledgeDoc::getKnowledgeId, knowId);\n        //noinspection unchecked\n        wrapper.select(AiragKnowledgeDoc::getId);\n        List<AiragKnowledgeDoc> docList = airagKnowledgeDocMapper.selectList(wrapper);\n        if (docList.isEmpty()) {\n            return Result.ok(\"暂无文档\");\n        }\n        List<String> docIds = docList.stream().map(AiragKnowledgeDoc::getId).collect(Collectors.toList());\n        this.removeDocByIds(docIds);\n        return Result.ok(\"清空完成\");\n    }\n\n    @Transactional(rollbackFor = {java.lang.Exception.class})\n    @Override\n    public Result<?> importDocumentFromZip(String knowId, MultipartFile zipFile) {\n        AssertUtils.assertNotEmpty(\"请先选择知识库\", knowId);\n        AssertUtils.assertNotEmpty(\"请上传文件\", zipFile);\n        long startTime = System.currentTimeMillis();\n        log.info(\"开始上传知识库文档(zip), 知识库id: {}, 文件名: {}\", knowId, zipFile.getOriginalFilename());\n\n        try {\n            String bizPath = knowId + File.separator + UUIDGenerator.generate();\n            String workDir = uploadpath + File.separator + bizPath + File.separator;\n            String sourcesPath = workDir + \"files\";\n\n            SsrfFileTypeFilter.checkUploadFileType(zipFile);\n            // 通过filePath 检查文件是不是压缩包(zip)\n            String zipFileName = FilenameUtils.getBaseName(zipFile.getOriginalFilename());\n            String fileExt = FilenameUtils.getExtension(zipFile.getOriginalFilename());\n            if (null == fileExt || !fileExt.equalsIgnoreCase(\"zip\")) {\n                throw new JeecgBootException(\"请上传zip压缩包\");\n            }\n            String uploadedZipPath = CommonUtils.uploadLocal(zipFile, bizPath, uploadpath);\n            // 解压缩文件\n            List<AiragKnowledgeDoc> docList = new ArrayList<>();\n            AtomicInteger fileCount = new AtomicInteger(0);\n            unzipFile(uploadpath + File.separator + uploadedZipPath, sourcesPath, uploadedFile -> {\n                // 仅支持txt、pdf、docx、pptx、html、md文件\n                String fileName = uploadedFile.getName();\n                if (!SUPPORT_DOC_TYPE.contains(FilenameUtils.getExtension(fileName).toLowerCase())) {\n                    log.warn(\"不支持的文件类型: {}\", fileName);\n                    return;\n                }\n                String baseName = FilenameUtils.getBaseName(fileName);\n                AiragKnowledgeDoc doc = new AiragKnowledgeDoc();\n                doc.setKnowledgeId(knowId);\n                doc.setTitle(baseName);\n                doc.setType(LLMConsts.KNOWLEDGE_DOC_TYPE_FILE);\n                doc.setStatus(LLMConsts.KNOWLEDGE_DOC_STATUS_DRAFT);\n\n                String relativePath;\n                if (File.separator.equals(\"\\\\\")) {\n                    // Windows path handling\n                    String escapedPath = uploadpath.replace(\"//\", \"\\\\\\\\\");\n                    escapedPath = escapedPath.replace(\"/\", \"\\\\\\\\\");\n                    relativePath = uploadedFile.getPath().replaceFirst(\"^\" + escapedPath, \"\");\n                } else {\n                    // Unix path handling\n                    relativePath = uploadedFile.getPath().replaceFirst(\"^\" + uploadpath, \"\");\n                }\n                JSONObject metadata = new JSONObject();\n                metadata.put(LLMConsts.KNOWLEDGE_DOC_METADATA_FILEPATH, relativePath);\n                metadata.put(LLMConsts.KNOWLEDGE_DOC_METADATA_SOURCES_PATH, sourcesPath);\n                doc.setMetadata(metadata.toJSONString());\n                docList.add(doc);\n            });\n            AssertUtils.assertNotEmpty(\"压缩包中没有符合要求的文档\", docList);\n            // 保存数据\n            this.saveBatch(docList);\n            // 重建文档\n            String docIds = docList.stream().map(AiragKnowledgeDoc::getId).filter(oConvertUtils::isObjectNotEmpty).collect(Collectors.joining(\",\"));\n            rebuildDocument(docIds);\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            throw new RuntimeException(e);\n        }\n        log.info(\"上传知识库文档(zip)成功, 知识库id: {}, 文件名: {}, 耗时: {}ms\", knowId, zipFile.getOriginalFilename(), (System.currentTimeMillis() - startTime));\n        return Result.ok(\"上传成功\");\n    }\n\n    /**\n     * 解压缩文件\n     *\n     * @param zipFilePath 压缩文件路径\n     * @param destDir    目标文件夹\n     * @param afterExtract 解压完成后回调\n     * @throws IOException\n     * @author chenrui\n     * @date 2025/3/20 14:37\n     */\n    public static void unzipFile(String zipFilePath, String destDir, Consumer<File> afterExtract) throws IOException {\n        unzipFile(Paths.get(zipFilePath), Paths.get(destDir), afterExtract);\n    }\n\n\n    /**\n     * 解压缩文件\n     *\n     * @param zipFilePath  压缩文件路径\n     * @param targetDir    目标文件夹\n     * @param afterExtract 解压完成后回调\n     * @throws IOException\n     * @author chenrui\n     * @date 2025/4/28 17:02\n     */\n    private static void unzipFile(Path zipFilePath, Path targetDir, Consumer<File> afterExtract) throws IOException {\n        long totalUnzippedSize = 0;\n        int entryCount = 0;\n\n        if (!Files.exists(targetDir)) {\n            Files.createDirectories(targetDir);\n        }\n\n        try (ZipFile zipFile = new ZipFile(zipFilePath.toFile())) {\n            Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();\n\n            while (entries.hasMoreElements()) {\n                ZipArchiveEntry entry = entries.nextElement();\n                entryCount++;\n                if (entryCount > MAX_ENTRY_COUNT) {\n                    throw new IOException(\"解压文件数量超限，可能是zip bomb攻击\");\n                }\n\n                Path newPath = safeResolve(targetDir, entry.getName());\n\n                if (entry.isDirectory()) {\n                    Files.createDirectories(newPath);\n                } else {\n                    Files.createDirectories(newPath.getParent());\n                    try (InputStream is = zipFile.getInputStream(entry);\n                         OutputStream os = Files.newOutputStream(newPath)) {\n\n                        long bytesCopied = copyLimited(is, os, MAX_FILE_SIZE);\n                        totalUnzippedSize += bytesCopied;\n\n                        if (totalUnzippedSize > MAX_TOTAL_SIZE) {\n                            throw new IOException(\"解压总大小超限，可能是zip bomb攻击\");\n                        }\n                    }\n\n                    // 解压完成后回调\n                    if (afterExtract != null) {\n                        afterExtract.accept(newPath.toFile());\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * 安全解析路径，防止Zip Slip攻击\n     *\n     * @param targetDir\n     * @param entryName\n     * @return\n     * @throws IOException\n     * @author chenrui\n     * @date 2025/4/28 16:46\n     */\n    private static Path safeResolve(Path targetDir, String entryName) throws IOException {\n        Path resolvedPath = targetDir.resolve(entryName).normalize();\n        if (!resolvedPath.startsWith(targetDir)) {\n            throw new IOException(\"ZIP 路径穿越攻击被阻止:\" + entryName);\n        }\n        return resolvedPath;\n    }\n\n    /**\n     * 复制输入流到输出流，并限制最大字节数\n     *\n     * @param in\n     * @param out\n     * @param maxBytes\n     * @return\n     * @throws IOException\n     * @author chenrui\n     * @date 2025/4/28 17:03\n     */\n    private static long copyLimited(InputStream in, OutputStream out, long maxBytes) throws IOException {\n        byte[] buffer = new byte[8192];\n        long totalCopied = 0;\n        int bytesRead;\n        while ((bytesRead = in.read(buffer)) != -1) {\n            totalCopied += bytesRead;\n            if (totalCopied > maxBytes) {\n                throw new IOException(\"单个文件解压超限，可能是zip bomb攻击\");\n            }\n            out.write(buffer, 0, bytesRead);\n        }\n        return totalCopied;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/service/impl/AiragKnowledgeServiceImpl.java",
    "content": "package org.jeecg.modules.airag.llm.service.impl;\n\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport dev.langchain4j.agent.tool.ToolSpecification;\nimport dev.langchain4j.service.tool.ToolExecutor;\nimport jakarta.servlet.http.HttpServletRequest;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.util.DateUtils;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.TokenUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.airag.flow.consts.FlowConsts;\nimport org.jeecg.modules.airag.llm.consts.FlowPluginContent;\nimport org.jeecg.modules.airag.llm.entity.AiragKnowledge;\nimport org.jeecg.modules.airag.llm.entity.AiragMcp;\nimport org.jeecg.modules.airag.llm.handler.PluginToolBuilder;\nimport org.jeecg.modules.airag.llm.mapper.AiragKnowledgeMapper;\nimport org.jeecg.modules.airag.llm.service.IAiragKnowledgeService;\nimport org.springframework.stereotype.Service;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * @Description: AIRag知识库\n * @Author: jeecg-boot\n * @Date: 2025-02-18\n * @Version: V1.0\n */\n@Slf4j\n@Service\npublic class AiragKnowledgeServiceImpl extends ServiceImpl<AiragKnowledgeMapper, AiragKnowledge> implements IAiragKnowledgeService {\n    \n    @Override\n    public Map<String, Object> getPluginMemory(String memoryId) {\n        //step 1获取知识库\n        AiragKnowledge airagKnowledge = this.baseMapper.selectById(memoryId);\n        if(airagKnowledge == null){\n            return null;\n        }\n        return this.getKnowledgeToPlugin(memoryId,airagKnowledge.getDescr());\n    }\n\n    /**\n     * 获取插件信息\n     *\n     * @param knowledgeId\n     * @param descr\n     * @return\n     */\n    public Map<String, Object> getKnowledgeToPlugin(String knowledgeId, String descr) {\n        //step1 构建插件\n        log.info(\"开始构建记忆库插件\");\n        if (oConvertUtils.isEmpty(knowledgeId)) {\n            return null;\n        }\n\n        HttpServletRequest httpServletRequest = SpringContextUtils.getHttpServletRequest();\n\n        //返回数据\n        Map<String, Object> result = new HashMap<>();\n        //插件\n        //插件id\n        AiragMcp tool = new AiragMcp();\n        // 2. 构建插件\n        tool.setId(knowledgeId);\n        // 插件名称\n        tool.setName(FlowPluginContent.PLUGIN_MEMORY_NAME);\n        // 描述\n        tool.setDescr(FlowPluginContent.PLUGIN_MEMORY_DESC);\n        tool.setStatus(FlowConsts.FLOW_STATUS_ENABLE);\n        tool.setSynced(CommonConstant.STATUS_1_INT);\n        tool.setCategory(\"plugin\");\n        tool.setEndpoint(\"\");\n\n        JSONArray toolsArray = new JSONArray();\n        // 添加记忆\n        toolsArray.add(buildAddMemoryTool(knowledgeId,descr));\n        // 查询记忆\n        toolsArray.add(buildQueryMemoryTool(knowledgeId,descr));\n        tool.setTools(toolsArray.toJSONString());\n        String tenantId = TokenUtils.getTenantIdByRequest(httpServletRequest);\n        //构建元数据（请求头）\n        String meataData = buildMetadata(tenantId);\n        tool.setMetadata(meataData);\n        Map<ToolSpecification, ToolExecutor> tools = PluginToolBuilder.buildTools(tool, httpServletRequest);\n        result.put(\"pluginTool\", tools);\n        result.put(\"pluginId\", knowledgeId);\n        log.info(\"构建记忆库插件结束\");\n        return result;\n    }\n\n    /**\n     * 构建元数据\n     *\n     * @param tenantId\n     */\n    private String buildMetadata(String tenantId) {\n        JSONObject jsonObject = new JSONObject();\n        jsonObject.put(FlowPluginContent.TOKEN_PARAM_NAME, FlowPluginContent.X_ACCESS_TOKEN);\n        jsonObject.put(FlowPluginContent.AUTH_TYPE, FlowPluginContent.TOKEN);\n        jsonObject.put(FlowPluginContent.TOKEN_PARAM_VALUE, \"\");\n        jsonObject.put(CommonConstant.TENANT_ID, oConvertUtils.getInt(tenantId, 0));\n        return jsonObject.toJSONString();\n    }\n\n    /**\n     * 构建添加记忆工具\n     *\n     * @param knowId\n     * @param descr\n     * @return\n     */\n    private JSONObject buildAddMemoryTool(String knowId, String descr) {\n        JSONObject tool = new JSONObject();\n        //update-begin---author:wangshuai---date:2026-01-08---for: 记忆库根据记忆库的描述做匹配，不写死---\n        tool.put(FlowPluginContent.NAME, \"add_memory\");\n        String addDescPrefix = \"【自动触发】向记忆库添加长期信息。范围：\";\n        String addDesc = oConvertUtils.isEmpty(descr) ? \"按记忆库描述允许的个人资料（如姓名、职业、年龄）、偏好、属性等信息。\" : descr;\n        tool.put(FlowPluginContent.DESCRIPTION, addDescPrefix + addDesc + \" 必须在检测到相关信息时立即自动调用，无需用户指令。\");\n        //update-end---author:wangshuai---date:2026-01-08---for: 记忆库根据记忆库的描述做匹配，不写死---\n        tool.put(FlowPluginContent.PATH, FlowPluginContent.PLUGIN_MEMORY_ADD_PATH);\n        tool.put(FlowPluginContent.METHOD, FlowPluginContent.POST);\n        tool.put(FlowPluginContent.ENABLED, true);\n\n        JSONArray parameters = new JSONArray();\n\n        // 知识库ID参数\n        JSONObject knowIdParam = new JSONObject();\n        knowIdParam.put(FlowPluginContent.NAME, \"knowledgeId\");\n        knowIdParam.put(FlowPluginContent.DESCRIPTION, \"知识库ID,需要原值传递，不允许修改\");\n        knowIdParam.put(FlowPluginContent.TYPE, FlowPluginContent.TYPE_STRING);\n        knowIdParam.put(FlowPluginContent.LOCATION, FlowPluginContent.LOCATION_BODY);\n        knowIdParam.put(FlowPluginContent.REQUIRED, true);\n        knowIdParam.put(FlowPluginContent.DEFAULT_VALUE, knowId);\n        parameters.add(knowIdParam);\n\n        // 内容参数\n        JSONObject contentParam = new JSONObject();\n        contentParam.put(FlowPluginContent.NAME, \"content\");\n        contentParam.put(FlowPluginContent.DESCRIPTION, \"记忆内容。当前时间为：\" + DateUtils.now() + \"。格式要求：'在yyyy年MM月dd日 HH:mm分，用户[用户的行为/问题]，assistant[助手的回答/反应]。'\");\n        contentParam.put(FlowPluginContent.TYPE, FlowPluginContent.TYPE_STRING);\n        contentParam.put(FlowPluginContent.LOCATION, FlowPluginContent.LOCATION_BODY);\n        contentParam.put(FlowPluginContent.REQUIRED, true);\n        parameters.add(contentParam);\n\n        // 标题参数\n        JSONObject titleParam = new JSONObject();\n        titleParam.put(FlowPluginContent.NAME, \"title\");\n        titleParam.put(FlowPluginContent.DESCRIPTION, \"记忆标题\");\n        titleParam.put(FlowPluginContent.TYPE, FlowPluginContent.TYPE_STRING);\n        titleParam.put(FlowPluginContent.LOCATION, FlowPluginContent.LOCATION_BODY);\n        titleParam.put(FlowPluginContent.REQUIRED, false);\n        parameters.add(titleParam);\n        tool.put(FlowPluginContent.PARAMETERS, parameters);\n\n        // 响应\n        JSONArray responses = new JSONArray();\n        tool.put(FlowPluginContent.RESPONSES, responses);\n\n        return tool;\n    }\n\n    /**\n     * 构建查询记忆工具\n     *\n     * @param knowId\n     * @param descr\n     * @return\n     */\n    private JSONObject buildQueryMemoryTool(String knowId, String descr) {\n        JSONObject tool = new JSONObject();\n        //update-begin---author:wangshuai---date:2026-01-08---for: 记忆库根据记忆库的描述做匹配，不写死---\n        String addDescPrefix = \"【自动触发】向记忆库检索信息。范围：\";\n        String addDesc = oConvertUtils.isEmpty(descr) ? \"按记忆库描述允许的个人资料（如姓名、职业、年龄）、偏好、属性等信息。\" : descr;\n        tool.put(FlowPluginContent.NAME, \"query_memory\");\n        tool.put(FlowPluginContent.DESCRIPTION, addDescPrefix + addDesc + \" 必须在检测到相关信息时立即自动调用，无需用户指令。\");\n        //update-end---author:wangshuai---date:2026-01-08---for: 记忆库根据记忆库的描述做匹配，不写死---\n        tool.put(FlowPluginContent.PATH, FlowPluginContent.PLUGIN_MEMORY_QUERY_PATH);\n        tool.put(FlowPluginContent.METHOD, FlowPluginContent.POST);\n        tool.put(FlowPluginContent.ENABLED, true);\n\n        JSONArray parameters = new JSONArray();\n\n        // 知识库ID参数\n        JSONObject knowIdParam = new JSONObject();\n        knowIdParam.put(FlowPluginContent.NAME, \"knowledgeId\");\n        knowIdParam.put(FlowPluginContent.DESCRIPTION, \"知识库ID,需要原值传递，不允许修改\");\n        knowIdParam.put(FlowPluginContent.TYPE, FlowPluginContent.TYPE_STRING);\n        knowIdParam.put(FlowPluginContent.LOCATION, FlowPluginContent.LOCATION_BODY);\n        knowIdParam.put(FlowPluginContent.REQUIRED, true);\n        knowIdParam.put(FlowPluginContent.DEFAULT_VALUE, knowId);\n        parameters.add(knowIdParam);\n\n        // 查询内容参数\n        JSONObject queryTextParam = new JSONObject();\n        queryTextParam.put(FlowPluginContent.NAME, \"queryText\");\n        queryTextParam.put(FlowPluginContent.DESCRIPTION, \"查询内容\");\n        queryTextParam.put(FlowPluginContent.TYPE, FlowPluginContent.TYPE_STRING);\n        queryTextParam.put(FlowPluginContent.LOCATION, FlowPluginContent.LOCATION_BODY);\n        queryTextParam.put(FlowPluginContent.REQUIRED, true);\n        parameters.add(queryTextParam);\n        \n        tool.put(FlowPluginContent.PARAMETERS, parameters);\n        // 响应\n        JSONArray responses = new JSONArray();\n        tool.put(FlowPluginContent.RESPONSES, responses);\n\n        return tool;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/service/impl/AiragMcpServiceImpl.java",
    "content": "package org.jeecg.modules.airag.llm.service.impl;\n\nimport com.alibaba.fastjson.JSONException;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.core.type.TypeReference;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport dev.langchain4j.agent.tool.ToolSpecification;\nimport dev.langchain4j.mcp.client.DefaultMcpClient;\nimport dev.langchain4j.mcp.client.McpClient;\nimport dev.langchain4j.mcp.client.transport.http.HttpMcpTransport;\nimport dev.langchain4j.mcp.client.transport.http.StreamableHttpMcpTransport;\nimport dev.langchain4j.mcp.client.transport.stdio.StdioMcpTransport;\nimport dev.langchain4j.model.chat.request.json.*;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.AiRagConfigBean;\nimport org.jeecg.modules.airag.llm.entity.AiragMcp;\nimport org.jeecg.modules.airag.llm.mapper.AiragMcpMapper;\nimport org.jeecg.modules.airag.llm.service.IAiragMcpService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.lang.reflect.Method;\nimport java.time.Duration;\nimport java.util.*;\nimport java.util.stream.Collectors;\n\n/**\n * @Description: MCP\n * @Author: jeecg-boot\n * @Date: 2025-10-20\n * @Version: V1.0\n */\n@Slf4j\n@SuppressWarnings(\"removal\")\n@Service(\"airagMcpServiceImpl\")\npublic class AiragMcpServiceImpl extends ServiceImpl<AiragMcpMapper, AiragMcp> implements IAiragMcpService {\n\n    @Autowired\n    private ObjectMapper objectMapper; // 使用全局配置的 Jackson ObjectMapper\n    @Autowired\n    private AiRagConfigBean aiRagConfigBean;\n\n    /**\n     * 新增或编辑Mcpserver\n     *\n     * @param airagMcp MCP对象\n     * @return 返回保存后的MCP对象\n     * @author chenrui\n     * @date 2025/10/21\n     */\n    @Override\n    public Result<String> edit(AiragMcp airagMcp) {\n        // 校验必填项\n        if (airagMcp.getName() == null || airagMcp.getName().trim().isEmpty()) {\n            return Result.error(\"名称不能为空\");\n        }\n        //update-begin---author:chenrui ---date:20251031  for：[QQYUN-12453]【AI】支持插件------------\n        // 设置默认category\n        if (oConvertUtils.isEmpty(airagMcp.getCategory())) {\n            airagMcp.setCategory(\"mcp\");\n        }\n        // 对于MCP类型，需要校验type和endpoint\n        if (\"mcp\".equalsIgnoreCase(airagMcp.getCategory())) {\n            if (airagMcp.getType() == null || airagMcp.getType().trim().isEmpty()) {\n                return Result.error(\"MCP类型不能为空\");\n            }\n            if (airagMcp.getEndpoint() == null || airagMcp.getEndpoint().trim().isEmpty()) {\n                return Result.error(\"服务端点不能为空\");\n            }\n        } else if (\"plugin\".equalsIgnoreCase(airagMcp.getCategory())) {\n            // 对于插件类型，BaseURL可选，不填时使用当前系统地址\n            // 不再校验endpoint是否为空\n        } else {\n            // 未知类型，默认为MCP并校验\n            if (airagMcp.getEndpoint() == null || airagMcp.getEndpoint().trim().isEmpty()) {\n                return Result.error(\"服务端点不能为空\");\n            }\n        }\n        //update-end---author:chenrui ---date:20251031  for：[QQYUN-12453]【AI】支持插件------------\n\n        if (airagMcp.getId() == null || airagMcp.getId().trim().isEmpty()) {\n            // 设置默认值\n            airagMcp.setStatus(\"enable\");\n            //update-begin---author:chenrui ---date:20251031  for：[QQYUN-12453]【AI】支持插件------------\n            // 只有MCP类型才设置synced字段，插件类型不需要同步默认为已同步\n            if (\"mcp\".equalsIgnoreCase(airagMcp.getCategory())) {\n                airagMcp.setSynced(CommonConstant.STATUS_0_INT);\n            } else {\n                airagMcp.setSynced(CommonConstant.STATUS_1_INT);\n            }\n            //update-end---author:chenrui ---date:20251031  for：[QQYUN-12453]【AI】支持插件------------\n            // 新增\n            this.save(airagMcp);\n        } else {\n            // 编辑\n            this.updateById(airagMcp);\n        }\n        return Result.OK(\"保存成功\");\n    }\n\n    /**\n     * 同步mcp的工具列表\n     *\n     * @param id mcp主键\n     * @return 工具列表\n     * @author chenrui\n     * @date 2025/10/21\n     */\n    @Override\n    public Result<?> sync(String id) {\n        AiragMcp mcp = this.getById(id);\n        if (mcp == null) {\n            return Result.error(\"未找到对应的MCP对象\");\n        }\n        //update-begin---author:chenrui ---date:20251031  for：[QQYUN-12453]【AI】支持插件------------\n        // 只有MCP类型才支持同步，插件类型不支持\n        String category = mcp.getCategory();\n        if (oConvertUtils.isEmpty(category)) {\n            category = \"mcp\"; // 兼容旧数据\n        }\n        if (!\"mcp\".equalsIgnoreCase(category)) {\n            return Result.error(\"只有MCP类型才支持同步操作\");\n        }\n        //update-end---author:chenrui ---date:20251031  for：[QQYUN-12453]【AI】支持插件------------\n        String type = mcp.getType();\n        String endpoint = mcp.getEndpoint();\n        Map<String, String> headers = null;\n        if (oConvertUtils.isNotEmpty(mcp.getHeaders())) {\n            try {\n                headers = JSONObject.parseObject(mcp.getHeaders(), new com.alibaba.fastjson.TypeReference<Map<String, String>>() {});\n            } catch (JSONException e) {\n                headers = null;\n            }\n        }\n        if (type == null || endpoint == null) {\n            return Result.error(\"MCP类型或端点为空\");\n        }\n        McpClient mcpClient = null;\n        try {\n            if (\"sse\".equalsIgnoreCase(type)) {\n                //TODO 1.4.0-beta10被弃用,推荐使用http\n                log.info(\"[MCP]使用SSE协议(HttpMcpTransport), endpoint:{}\", endpoint);\n                HttpMcpTransport.Builder builder = HttpMcpTransport.builder()\n                        .sseUrl(endpoint)\n                        .logRequests(true)\n                        .logResponses(true);\n                if (headers != null && !headers.isEmpty()) {\n                    builder.customHeaders(headers);\n                }\n                mcpClient = new DefaultMcpClient.Builder().transport(builder.build()).build();\n            } else if (\"stdio\".equalsIgnoreCase(type)) {\n                //update-begin---author:wangshuai---date:2025-12-18---for:【QQYUN-14242】【AI】添加参数控制 是否开启 默认禁用 stdio 调用执行命令---\n                String openSafe = aiRagConfigBean.getAllowSensitiveNodes();\n                if(oConvertUtils.isNotEmpty(openSafe) && openSafe.toLowerCase().contains(\"stdio\")) {\n                    log.info(\"[MCP]使用STDIO协议(StdioMcpTransport), endpoint:{}\", endpoint);\n                    // stdio 类型：endpoint 可能是一个命令行\n                    // Windows 下需要通过 cmd.exe /c 来执行命令，否则找不到 npx 等程序\n                    List<String> cmdParts;\n                    String os = System.getProperty(\"os.name\").toLowerCase();\n                    if (os.contains(\"win\")) {\n                        // Windows: 使用 cmd.exe /c 执行\n                        cmdParts = new ArrayList<>();\n                        cmdParts.add(\"cmd.exe\");\n                        cmdParts.add(\"/c\");\n                        cmdParts.add(endpoint.trim());\n                    } else {\n                        // Linux/Mac: 使用 sh -c 执行\n                        cmdParts = new ArrayList<>();\n                        cmdParts.add(\"sh\");\n                        cmdParts.add(\"-c\");\n                        cmdParts.add(endpoint.trim());\n                    }\n                    log.info(\"[MCP]执行stdio命令: {}\", cmdParts);\n                    StdioMcpTransport.Builder builder = new StdioMcpTransport.Builder()\n                            .command(cmdParts)\n                            .environment(headers);\n                    mcpClient = new DefaultMcpClient.Builder().transport(builder.build()).build();\n                } else {\n                    String disabledMsg = \"stdio 功能已禁用。若需启用，请在 yml 的 jeecg.airag.allow-sensitive-nodes 中加入 stdio。\";\n                    log.warn(\"[MCP]{}\", disabledMsg);\n                    return Result.error(disabledMsg);\n                }\n                //update-end---author:wangshuai---date:2025-12-19---for:【QQYUN-14242】【AI】添加参数控制 是否开启 默认禁用 stdio 调用执行命令---\n            }else if(\"http\".equalsIgnoreCase(type)){\n                log.info(\"[MCP]使用HTTP协议(StreamableHttpMcpTransport), endpoint:{}\", endpoint);\n                //增加http选项\n                mcpClient = mcpHttpCreate(endpoint,headers);\n            } else {\n                return Result.error(\"不支持的MCP类型:\" + type);\n            }\n            List<ToolSpecification> toolSpecifications = mcpClient.listTools();\n            // 先尝试直接使用 ObjectMapper 序列化，若结果为 {} 则回退到反射 Map\n            List<Map<String, Object>> specMaps = toolSpecifications.stream()\n                    .map(spec -> {\n                        try {\n                            String raw = objectMapper.writeValueAsString(spec);\n                            if (raw != null && raw.length() > 2) {\n                                // 直接反序列化成 Map，保留 Jackson 认出的字段\n                                return objectMapper.readValue(raw, new TypeReference<Map<String, Object>>() {\n                                });\n                            }\n                        } catch (Exception ignore) {\n                        }\n                        return convertToolSpec(spec);\n                    })\n                    .collect(Collectors.toList());\n            String jsonList;\n            try {\n                jsonList = objectMapper.writeValueAsString(specMaps);\n            } catch (JsonProcessingException e) {\n                jsonList = JSONObject.toJSONString(specMaps);\n            }\n            String firstJson = specMaps.isEmpty() ? \"null\" : safeWriteJson(specMaps.get(0));\n            log.info(\"MCP工具列表 id={}, size={}, first={}\", id, toolSpecifications.size(), firstJson);\n            mcp.setTools(jsonList);\n            mcp.setSynced(1);\n\n            Map<String,Object> metadata = new HashMap<>();\n            metadata.put(\"tool_count\", toolSpecifications.size());\n            mcp.setMetadata(objectMapper.writeValueAsString(metadata));\n            this.updateById(mcp);\n            return Result.OK(specMaps);\n        } catch (Exception e) {\n            String message = e.getMessage();\n            if (e instanceof IllegalArgumentException) {\n                message = \"，MCP客户端参数错误\";\n            }\n            log.error(\"同步MCP工具失败 id={}, error={}\", id, message, e);\n            return Result.error(\"同步失败\" + message);\n        } finally {\n            if (mcpClient != null) {\n                try {\n                    Method closeMethod = mcpClient.getClass().getMethod(\"close\");\n                    closeMethod.invoke(mcpClient);\n                } catch (NoSuchMethodException ignore) {\n                } catch (Exception ex) {\n                    log.warn(\"关闭MCP客户端失败 id={}, error={}\", id, ex.getMessage());\n                }\n            }\n        }\n    }\n\n    /**\n     * mcp插件http创建\n     * \n     * @param endpoint\n     * @param headers\n     * @return\n     */\n    private McpClient mcpHttpCreate(String endpoint, Map<String, String> headers) {\n        StreamableHttpMcpTransport.Builder builder = new StreamableHttpMcpTransport.Builder()\n                .url(endpoint)\n                .timeout(Duration.ofMinutes(60))\n                .logRequests(true)\n                .logResponses(true);\n\n        if (headers != null && !headers.isEmpty()) {\n            builder.customHeaders(headers);\n        }\n\n        return new DefaultMcpClient.Builder()\n                .transport(builder.build())\n                .build();\n    }\n\n    // 安全序列化单个对象为 JSON 字符串\n    private String safeWriteJson(Object obj) {\n        try {\n            return objectMapper.writeValueAsString(obj);\n        } catch (Exception e) {\n            return String.valueOf(obj);\n        }\n    }\n\n    // 反射将 ToolSpecification 转成 Map，兼容 record/私有字段/仅 Jackson 注解场景 -> 改为直接调用访问器\n    private Map<String, Object> convertToolSpec(ToolSpecification spec) {\n        Map<String, Object> map = new LinkedHashMap<>();\n        if (spec == null) {\n            return map;\n        }\n        map.put(\"name\", spec.name());\n        map.put(\"description\", spec.description());\n        try {\n            Object params = spec.parameters();\n            if (params != null) {\n                JsonObjectSchema obj = (JsonObjectSchema) params;\n                List<Map<String, Object>> fields = new ArrayList<>();\n                if (obj.properties() != null) {\n                    obj.properties().forEach((fieldName, fieldSchema) -> {\n                        Map<String, Object> fieldMap = new LinkedHashMap<>();\n                        fieldMap.put(\"name\", fieldName);\n                        fieldMap.put(\"description\", extractDescription(fieldSchema));\n                        // 若需要标记必填\n                        if (obj.required() != null && obj.required().contains(fieldName)) {\n                            fieldMap.put(\"required\", true);\n                        }\n                        fields.add(fieldMap);\n                    });\n                }\n                map.put(\"parameters\", fields);\n            }\n        } catch (Exception ignored) {\n        }\n        return map;\n    }\n\n    // 提取各类型 schema 的描述\n    private String extractDescription(Object schema) {\n        if (schema == null) return null;\n        try {\n            if (schema instanceof JsonStringSchema) return ((JsonStringSchema) schema).description();\n            if (schema instanceof JsonNumberSchema) return ((JsonNumberSchema) schema).description();\n            if (schema instanceof JsonBooleanSchema) return ((JsonBooleanSchema) schema).description();\n            if (schema instanceof JsonArraySchema) return ((JsonArraySchema) schema).description();\n            if (schema instanceof JsonEnumSchema) return ((JsonEnumSchema) schema).description();\n            if (schema instanceof JsonObjectSchema) return ((JsonObjectSchema) schema).description();\n        } catch (Exception ignored) {\n        }\n        return schema.toString();\n    }\n\n    /**\n     * 修改状态\n     *\n     * @param id     MCP主键\n     * @param action 操作（enable/disable）\n     * @return 操作结果\n     * @author chenrui\n     * @date 2025/10/21 11:00\n     */\n    @Override\n    public Result<?> toggleStatus(String id, String action) {\n        if (oConvertUtils.isEmpty(id)) {\n            return Result.error(\"id不能为空\");\n        }\n        if (oConvertUtils.isEmpty(action)) {\n            return Result.error(\"action不能为空\");\n        }\n        String normalized = action.toLowerCase();\n        if (!\"enable\".equals(normalized) && !\"disable\".equals(normalized)) {\n            return Result.error(\"action只能为enable或disable\");\n        }\n        AiragMcp mcp = this.getById(id);\n        if (mcp == null) {\n            return Result.error(\"未找到对应的MCP服务\");\n        }\n        if (normalized.equalsIgnoreCase(mcp.getStatus())) {\n            return Result.OK(\"操作成功\");\n        }\n        mcp.setStatus(normalized);\n        this.updateById(mcp);\n        return Result.OK(\"操作成功\");\n    }\n\n    /**\n     * 保存插件工具（仅更新tools字段）\n     * for [QQYUN-12453]【AI】支持插件\n     * @param id 插件ID\n     * @param tools 工具列表JSON字符串\n     * @return 操作结果\n     * @author chenrui\n     * @date 2025/10/30\n     */\n    @Override\n    public Result<String> saveTools(String id, String tools) {\n        if (oConvertUtils.isEmpty(id)) {\n            return Result.error(\"插件ID不能为空\");\n        }\n        AiragMcp mcp = this.getById(id);\n        if (mcp == null) {\n            return Result.error(\"未找到对应的插件\");\n        }\n        // 验证是否为插件类型\n        String category = mcp.getCategory();\n        if (oConvertUtils.isEmpty(category)) {\n            category = \"mcp\"; // 兼容旧数据\n        }\n        if (!\"plugin\".equalsIgnoreCase(category)) {\n            return Result.error(\"只有插件类型才能保存工具\");\n        }\n        // 更新tools字段\n        mcp.setTools(tools);\n        \n        // 更新metadata中的tool_count\n        try {\n            com.alibaba.fastjson.JSONArray toolsArray = com.alibaba.fastjson.JSONArray.parseArray(tools);\n            int toolCount = toolsArray != null ? toolsArray.size() : 0;\n            \n            // 解析现有metadata\n            JSONObject metadata = new JSONObject();\n            if (oConvertUtils.isNotEmpty(mcp.getMetadata())) {\n                try {\n                    JSONObject metadataJson = JSONObject.parseObject(mcp.getMetadata());\n                    if (metadataJson != null) {\n                        metadata.putAll(metadataJson);\n                    }\n                } catch (Exception e) {\n                    log.warn(\"解析metadata失败，将重新创建: {}\", mcp.getMetadata());\n                }\n            }\n            \n            // 更新tool_count\n            metadata.put(\"tool_count\", toolCount);\n            \n            // 保存metadata\n            mcp.setMetadata(metadata.toJSONString());\n        } catch (Exception e) {\n            log.warn(\"更新工具数量失败: {}\", e.getMessage());\n            // 即使更新tool_count失败，也不影响保存tools\n        }\n        \n        this.updateById(mcp);\n        return Result.OK(\"保存成功\");\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/service/impl/AiragModelServiceImpl.java",
    "content": "package org.jeecg.modules.airag.llm.service.impl;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.jeecg.modules.airag.llm.entity.AiragModel;\nimport org.jeecg.modules.airag.llm.mapper.AiragModelMapper;\nimport org.jeecg.modules.airag.llm.service.IAiragModelService;\nimport org.springframework.stereotype.Service;\n\n/**\n * @Description: AiRag模型配置\n * @Author: jeecg-boot\n * @Date: 2025-02-14\n * @Version: V1.0\n */\n@Service\npublic class AiragModelServiceImpl extends ServiceImpl<AiragModelMapper, AiragModel> implements IAiragModelService {\n\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/ocr/controller/AiOcrController.java",
    "content": "package org.jeecg.modules.airag.ocr.controller;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport org.apache.commons.collections.CollectionUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.util.RedisUtil;\nimport org.jeecg.modules.airag.ocr.entity.AiOcr;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.UUID;\n\n@RestController\n@RequestMapping(\"/airag/ocr\")\npublic class AiOcrController  {\n\n    @Autowired\n    private RedisUtil redisUtil;\n    \n    private static final String AI_OCR_REDIS_KEY = \"airag:ocr\"; \n    \n    @GetMapping(\"/list\")\n    public Result<?> list(){\n        Object aiOcr = redisUtil.get(AI_OCR_REDIS_KEY);\n        IPage<AiOcr> page = new Page<>(1,10);\n        if(null != aiOcr){\n            List<AiOcr> aiOcrList = JSONObject.parseArray(aiOcr.toString(), AiOcr.class);\n            page.setRecords(aiOcrList);\n            page.setTotal(aiOcrList.size());\n            page.setPages(aiOcrList.size());\n        }\n        return Result.OK(page);\n    }\n    \n    @PostMapping(\"/add\")\n    public Result<String> add(@RequestBody AiOcr aiOcr){\n        Object aiOcrList = redisUtil.get(AI_OCR_REDIS_KEY);\n        aiOcr.setId(UUID.randomUUID().toString().replace(\"-\",\"\"));\n        if(null == aiOcrList){\n            List<AiOcr> list = new ArrayList<>();\n            list.add(aiOcr);\n            redisUtil.set(AI_OCR_REDIS_KEY, JSONObject.toJSONString(list));\n        }else{\n            List<AiOcr> aiOcrs = JSONObject.parseArray(aiOcrList.toString(), AiOcr.class);\n            aiOcrs.add(aiOcr);\n            redisUtil.set(AI_OCR_REDIS_KEY,JSONObject.toJSONString(aiOcrs));\n        }\n        return Result.OK(\"添加成功\");\n    }\n\n    @PutMapping(\"/edit\")\n    public Result<String> updateById(@RequestBody AiOcr aiOcr){\n        Object aiOcrList = redisUtil.get(AI_OCR_REDIS_KEY);\n        if(null != aiOcrList){\n            List<AiOcr> aiOcrs = JSONObject.parseArray(aiOcrList.toString(), AiOcr.class);\n            aiOcrs.forEach(item->{\n                if(item.getId().equals(aiOcr.getId())){\n                    BeanUtils.copyProperties(aiOcr,item);\n                }\n            });\n            redisUtil.set(AI_OCR_REDIS_KEY,JSONObject.toJSONString(aiOcrs));\n        }else{\n            return Result.OK(\"编辑失败，未找到该数据\");\n        }\n        return Result.OK(\"编辑成功\");\n    }\n\n    @DeleteMapping(\"/deleteById\")\n    public Result<String> deleteById(@RequestBody AiOcr aiOcr){\n        Object aiOcrObj = redisUtil.get(AI_OCR_REDIS_KEY);\n        if(null != aiOcrObj){\n            List<AiOcr> aiOcrs = JSONObject.parseArray(aiOcrObj.toString(), AiOcr.class);\n            List<AiOcr> aiOcrList = new ArrayList<>();\n            for(AiOcr ocr: aiOcrs){\n                if(!ocr.getId().equals(aiOcr.getId())){\n                    aiOcrList.add(ocr);\n                }\n            }\n            if(CollectionUtils.isNotEmpty(aiOcrList)){\n                redisUtil.set(AI_OCR_REDIS_KEY,JSONObject.toJSONString(aiOcrList));\n            }else{\n                redisUtil.removeAll(AI_OCR_REDIS_KEY);\n            }\n        }else{\n            return Result.OK(\"删除失败，未找到该数据\");\n        }\n        return Result.OK(\"删除成功\");\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/ocr/entity/AiOcr.java",
    "content": "package org.jeecg.modules.airag.ocr.entity;\n\nimport lombok.Data;\n\n/**\n* @Description: OCR识别实体类\n*\n* @author: wangshuai\n* @date: 2025/4/16 17:01\n*/\n@Data\npublic class AiOcr {\n\n    /**\n     * 编号\n     */\n    private String id;\n    \n    /**\n     * 标题\n     */\n    private String title;\n    \n    /**\n     * 提示词\n     */\n    private String prompt;\n    \n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/prompts/consts/AiPromptsConsts.java",
    "content": "package org.jeecg.modules.airag.prompts.consts;\n\n/**\n * AI提示词常量类\n *\n */\npublic class AiPromptsConsts {\n\n    /**\n     * 状态:进行中\n     */\n    public static final String STATUS_RUNNING = \"run\";\n    /**\n     * 状态:完成\n     */\n    public static final String STATUS_COMPLETED = \"completed\";\n    /**\n     * 状态:失败\n     */\n    public static final String STATUS_FAILED = \"failed\";\n    /**\n     * 业务类型:评估器\n     */\n    public static final String BIZ_TYPE_EVALUATOR = \"evaluator\";\n    /**\n     * 业务类型:轨迹\n     */\n    public static final String BIZ_TYPE_TRACK = \"track\";\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/prompts/controller/AiragExtDataController.java",
    "content": "package org.jeecg.modules.airag.prompts.controller;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.airag.prompts.consts.AiPromptsConsts;\nimport org.jeecg.modules.airag.prompts.entity.AiragExtData;\nimport org.jeecg.modules.airag.prompts.service.IAiragExtDataService;\nimport org.jeecg.modules.airag.prompts.vo.AiragDebugVo;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport java.util.Arrays;\nimport java.util.List;\n\n/**\n * @Description: airag_ext_data\n * @Author: jeecg-boot\n * @Date:   2025-12-24\n * @Version: V1.0\n */\n@Tag(name=\"airag_ext_data\")\n@RestController\n@RequestMapping(\"/airag/extData\")\n@Slf4j\npublic class AiragExtDataController extends JeecgController<AiragExtData, IAiragExtDataService> {\n\t@Autowired\n\tprivate IAiragExtDataService airagExtDataService;\n\t\n\t/**\n\t * 分页列表查询\n\t *\n\t * @param airagExtData\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t//@AutoLog(value = \"airag_ext_data-分页列表查询\")\n\t@Operation(summary=\"airag_ext_data-分页列表查询\")\n\t@GetMapping(value = \"/list\")\n\tpublic Result<IPage<AiragExtData>> queryPageList(AiragExtData airagExtData,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t   HttpServletRequest req) {\n        QueryWrapper<AiragExtData> queryWrapper = QueryGenerator.initQueryWrapper(airagExtData, req.getParameterMap());\n\t\tPage<AiragExtData> page = new Page<AiragExtData>(pageNo, pageSize);\n\t\tqueryWrapper.eq(\"biz_type\", AiPromptsConsts.BIZ_TYPE_EVALUATOR);\n\t\tIPage<AiragExtData> pageList = airagExtDataService.page(page, queryWrapper);\n\t\treturn Result.OK(pageList);\n\t}\n\t/**\n\t * 调用轨迹列表查询\n\t *\n\t * @param airagExtData\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t@Operation(summary=\"airag_ext_data-分页列表查询\")\n\t@GetMapping(value = \"/getTrackList\")\n\tpublic Result<IPage<AiragExtData>> getTrackList(AiragExtData airagExtData,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t   HttpServletRequest req) {\n        QueryWrapper<AiragExtData> queryWrapper = QueryGenerator.initQueryWrapper(airagExtData, req.getParameterMap());\n\t\tPage<AiragExtData> page = new Page<AiragExtData>(pageNo, pageSize);\n\t\tqueryWrapper.eq(\"biz_type\", AiPromptsConsts.BIZ_TYPE_TRACK);\n\t\tString metadata = airagExtData.getMetadata();\n\t\tif(oConvertUtils.isEmpty(metadata)){\n\t\t\treturn Result.OK();\n\t\t}\n\t\tIPage<AiragExtData> pageList = airagExtDataService.page(page, queryWrapper);\n\t\treturn Result.OK(pageList);\n\t}\n\n\t/**\n\t *   添加\n\t *\n\t * @param airagExtData\n\t * @return\n\t */\n\t@AutoLog(value = \"airag_ext_data-添加\")\n\t@Operation(summary=\"airag_ext_data-添加\")\n\t@PostMapping(value = \"/add\")\n\tpublic Result<String> add(@RequestBody AiragExtData airagExtData) {\n\t\tairagExtData.setBizType(AiPromptsConsts.BIZ_TYPE_EVALUATOR);\n\t\tairagExtDataService.save(airagExtData);\n\t\treturn Result.OK(\"添加成功！\");\n\t}\n\t\n\t/**\n\t *  编辑\n\t *\n\t * @param airagExtData\n\t * @return\n\t */\n\t@AutoLog(value = \"airag_ext_data-编辑\")\n\t@Operation(summary=\"airag_ext_data-编辑\")\n\t@RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n\tpublic Result<String> edit(@RequestBody AiragExtData airagExtData) {\n\t\tairagExtDataService.updateById(airagExtData);\n\t\treturn Result.OK(\"编辑成功!\");\n\t}\n\t\n\t/**\n\t *   通过id删除\n\t *\n\t * @param id\n\t * @return\n\t */\n\t@AutoLog(value = \"airag_ext_data-通过id删除\")\n\t@Operation(summary=\"airag_ext_data-通过id删除\")\n\t@DeleteMapping(value = \"/delete\")\n\tpublic Result<String> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\tairagExtDataService.removeById(id);\n\t\treturn Result.OK(\"删除成功!\");\n\t}\n\t\n\t/**\n\t *  批量删除\n\t *\n\t * @param ids\n\t * @return\n\t */\n\t@AutoLog(value = \"airag_ext_data-批量删除\")\n\t@Operation(summary=\"airag_ext_data-批量删除\")\n\t@DeleteMapping(value = \"/deleteBatch\")\n\tpublic Result<String> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tthis.airagExtDataService.removeByIds(Arrays.asList(ids.split(\",\")));\n\t\treturn Result.OK(\"批量删除成功!\");\n\t}\n\t\n\t/**\n\t * 通过id查询\n\t *\n\t * @param id\n\t * @return\n\t */\n\t//@AutoLog(value = \"airag_ext_data-通过id查询\")\n\t@Operation(summary=\"airag_ext_data-通过id查询\")\n\t@GetMapping(value = \"/queryById\")\n\tpublic Result<AiragExtData> queryById(@RequestParam(name=\"id\",required=true) String id) {\n\t\tAiragExtData airagExtData = airagExtDataService.getById(id);\n\t\tif(airagExtData==null) {\n\t\t\treturn Result.error(\"未找到对应数据\");\n\t\t}\n\t\treturn Result.OK(airagExtData);\n\t}\n\t/**\n\t * 通过id查询\n\t *\n\t * @param id\n\t * @return\n\t */\n\t//@AutoLog(value = \"airag_ext_data-通过id查询\")\n\t@Operation(summary=\"airag_ext_data-通过id查询\")\n\t@GetMapping(value = \"/queryTrackById\")\n\tpublic Result<List<AiragExtData>> queryTrackById(@RequestParam(name=\"id\",required=true) String id) {\n\t\tAiragExtData airagExtData = airagExtDataService.getById(id);\n\t\tString status = airagExtData.getStatus();\n\t\tif(AiPromptsConsts.STATUS_RUNNING.equals(status)) {\n\t\t\treturn Result.error(\"处理中，请稍后刷新\");\n\t\t}\n\t\tList<AiragExtData> trackList = airagExtDataService.queryTrackById(id);\n\t\treturn Result.OK(trackList);\n\t}\n\t /**\n\t  * 构造器调试\n\t  *\n\t  * @param debugVo\n\t  * @return\n\t  */\n\t @PostMapping(value = \"/evaluator/debug\")\n\t public Result<?> debugEvaluator(@RequestBody AiragDebugVo debugVo) {\n\t\t return airagExtDataService.debugEvaluator(debugVo);\n\t }\n    /**\n    * 导出excel\n    *\n    * @param request\n    * @param airagExtData\n    */\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, AiragExtData airagExtData) {\n        return super.exportXls(request, airagExtData, AiragExtData.class, \"airag_ext_data\");\n    }\n\n    /**\n      * 通过excel导入数据\n    *\n    * @param request\n    * @param response\n    * @return\n    */\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n        return super.importExcel(request, response, AiragExtData.class);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/prompts/controller/AiragPromptsController.java",
    "content": "package org.jeecg.modules.airag.prompts.controller;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.modules.airag.prompts.entity.AiragPrompts;\nimport org.jeecg.modules.airag.prompts.service.IAiragPromptsService;\nimport org.jeecg.modules.airag.prompts.vo.AiragExperimentVo;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport java.util.Arrays;\n /**\n * @Description: airag_prompts\n * @Author: jeecg-boot\n * @Date:   2025-12-24\n * @Version: V1.0\n */\n@Tag(name=\"airag_prompts\")\n@RestController\n@RequestMapping(\"/airag/prompts\")\n@Slf4j\npublic class AiragPromptsController extends JeecgController<AiragPrompts, IAiragPromptsService> {\n\t@Autowired\n\tprivate IAiragPromptsService airagPromptsService;\n\t\n\t/**\n\t * 分页列表查询\n\t *\n\t * @param airagPrompts\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t//@AutoLog(value = \"airag_prompts-分页列表查询\")\n\t@Operation(summary=\"airag_prompts-分页列表查询\")\n\t@GetMapping(value = \"/list\")\n\tpublic Result<IPage<AiragPrompts>> queryPageList(AiragPrompts airagPrompts,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t   HttpServletRequest req) {\n        QueryWrapper<AiragPrompts> queryWrapper = QueryGenerator.initQueryWrapper(airagPrompts, req.getParameterMap());\n\t\tPage<AiragPrompts> page = new Page<AiragPrompts>(pageNo, pageSize);\n\t\tIPage<AiragPrompts> pageList = airagPromptsService.page(page, queryWrapper);\n\t\treturn Result.OK(pageList);\n\t}\n\t\n\t/**\n\t *   添加\n\t *\n\t * @param airagPrompts\n\t * @return\n\t */\n\t@AutoLog(value = \"airag_prompts-添加\")\n\t@Operation(summary=\"airag_prompts-添加\")\n\t@PostMapping(value = \"/add\")\n\tpublic Result<String> add(@RequestBody AiragPrompts airagPrompts) {\n\t\tairagPrompts.setDelFlag(CommonConstant.DEL_FLAG_0);\n\t\tairagPrompts.setStatus(\"0\");\n\t\tairagPromptsService.save(airagPrompts);\n\t\treturn Result.OK(\"添加成功！\");\n\t}\n\t\n\t/**\n\t *  编辑\n\t *\n\t * @param airagPrompts\n\t * @return\n\t */\n\t@AutoLog(value = \"airag_prompts-编辑\")\n\t@Operation(summary=\"airag_prompts-编辑\")\n\t@RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n\tpublic Result<String> edit(@RequestBody AiragPrompts airagPrompts) {\n\t\tairagPromptsService.updateById(airagPrompts);\n\t\treturn Result.OK(\"编辑成功!\");\n\t}\n\t\n\t/**\n\t *   通过id删除\n\t *\n\t * @param id\n\t * @return\n\t */\n\t@AutoLog(value = \"airag_prompts-通过id删除\")\n\t@Operation(summary=\"airag_prompts-通过id删除\")\n\t@DeleteMapping(value = \"/delete\")\n\tpublic Result<String> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\tairagPromptsService.removeById(id);\n\t\treturn Result.OK(\"删除成功!\");\n\t}\n\t\n\t/**\n\t *  批量删除\n\t *\n\t * @param ids\n\t * @return\n\t */\n\t@AutoLog(value = \"airag_prompts-批量删除\")\n\t@Operation(summary=\"airag_prompts-批量删除\")\n\t@DeleteMapping(value = \"/deleteBatch\")\n\tpublic Result<String> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tthis.airagPromptsService.removeByIds(Arrays.asList(ids.split(\",\")));\n\t\treturn Result.OK(\"批量删除成功!\");\n\t}\n\t\n\t/**\n\t * 通过id查询\n\t *\n\t * @param id\n\t * @return\n\t */\n\t//@AutoLog(value = \"airag_prompts-通过id查询\")\n\t@Operation(summary=\"airag_prompts-通过id查询\")\n\t@GetMapping(value = \"/queryById\")\n\tpublic Result<AiragPrompts> queryById(@RequestParam(name=\"id\",required=true) String id) {\n\t\tAiragPrompts airagPrompts = airagPromptsService.getById(id);\n\t\tif(airagPrompts==null) {\n\t\t\treturn Result.error(\"未找到对应数据\");\n\t\t}\n\t\treturn Result.OK(airagPrompts);\n\t}\n\t /**\n\t  * 构造器调试\n\t  *\n\t  * @param experimentVo\n\t  * @return\n\t  */\n\t @PostMapping(value = \"/experiment\")\n\t public Result<?> promptExperiment(@RequestBody AiragExperimentVo experimentVo, HttpServletRequest request) {\n\t\t return airagPromptsService.promptExperiment(experimentVo,request);\n\t }\n    /**\n    * 导出excel\n    *\n    * @param request\n    * @param airagPrompts\n    */\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, AiragPrompts airagPrompts) {\n        return super.exportXls(request, airagPrompts, AiragPrompts.class, \"airag_prompts\");\n    }\n\n    /**\n      * 通过excel导入数据\n    *\n    * @param request\n    * @param response\n    * @return\n    */\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n        return super.importExcel(request, response, AiragPrompts.class);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/prompts/entity/AiragExtData.java",
    "content": "package org.jeecg.modules.airag.prompts.entity;\n\nimport java.io.Serializable;\nimport java.io.UnsupportedEncodingException;\nimport java.util.Date;\nimport java.math.BigDecimal;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport org.jeecg.common.constant.ProvinceCityArea;\nimport org.jeecg.common.util.SpringContextUtils;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\n/**\n * @Description: airag_ext_data\n * @Author: jeecg-boot\n * @Date:   2025-12-12\n * @Version: V1.0\n */\n@Data\n@TableName(\"airag_ext_data\")\n@Accessors(chain = true)\n@EqualsAndHashCode(callSuper = false)\n@Schema(description=\"airag_ext_data\")\npublic class AiragExtData implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n\t/**主键ID*/\n\t@TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"主键ID\")\n    private java.lang.String id;\n\t/**业务类型标识(evaluator:评估器；track:测试追踪)*/\n\t@Excel(name = \"业务类型标识(evaluator:评估器；track:测试追踪)\", width = 15)\n    @Schema(description = \"业务类型标识(evaluator:评估器；track:测试追踪)\")\n    private java.lang.String bizType;\n\t/**名称*/\n\t@Excel(name = \"名称\", width = 15)\n    @Schema(description = \"名称\")\n    private java.lang.String name;\n\t/**描述信息*/\n\t@Excel(name = \"描述信息\", width = 15)\n    @Schema(description = \"描述信息\")\n    private java.lang.String descr;\n\t/**标签，多个用逗号分隔*/\n\t@Excel(name = \"标签，多个用逗号分隔\", width = 15)\n    @Schema(description = \"标签，多个用逗号分隔\")\n    private java.lang.String tags;\n\t/**实际存储内容，json*/\n\t@Excel(name = \"实际存储内容，json\", width = 15)\n    @Schema(description = \"实际存储内容，json\")\n    private java.lang.String dataValue;\n\t/**元数据，用于存储补充业务数据信息*/\n\t@Excel(name = \"元数据，用于存储补充业务数据信息\", width = 15)\n    @Schema(description = \"元数据，用于存储补充业务数据信息\")\n    private java.lang.String metadata;\n\t/**评测集数据*/\n\t@Excel(name = \"评测集数据\", width = 15)\n    @Schema(description = \"评测集数据\")\n    private java.lang.String datasetValue;\n\t/**创建人*/\n    @Schema(description = \"创建人\")\n    private java.lang.String createBy;\n\t/**创建时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建时间\")\n    private java.util.Date createTime;\n\t/**修改人*/\n    @Schema(description = \"修改人\")\n    private java.lang.String updateBy;\n\t/**修改时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"修改时间\")\n    private java.util.Date updateTime;\n\t/**所属部门*/\n    @Schema(description = \"所属部门\")\n    private java.lang.String sysOrgCode;\n\t/**租户id*/\n\t@Excel(name = \"租户id\", width = 15)\n    @Schema(description = \"租户id\")\n    private java.lang.String tenantId;\n\t/**状态*/\n\t@Excel(name = \"状态（run:进行中 completed：已完成）\", width = 15)\n    @Schema(description = \"状态（run:进行中 completed：已完成）\")\n    private java.lang.String status;\n\t/**版本*/\n\t@Excel(name = \"版本\", width = 15)\n    @Schema(description = \"版本\")\n    private java.lang.Integer version;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/prompts/entity/AiragPrompts.java",
    "content": "package org.jeecg.modules.airag.prompts.entity;\n\nimport java.io.Serializable;\nimport java.io.UnsupportedEncodingException;\nimport java.util.Date;\nimport java.math.BigDecimal;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport org.jeecg.common.constant.ProvinceCityArea;\nimport org.jeecg.common.util.SpringContextUtils;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\n/**\n * @Description: airag_prompts\n * @Author: jeecg-boot\n * @Date:   2025-12-12\n * @Version: V1.0\n */\n@Data\n@TableName(\"airag_prompts\")\n@Accessors(chain = true)\n@EqualsAndHashCode(callSuper = false)\n@Schema(description=\"airag_prompts\")\npublic class AiragPrompts implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n\t/**主键ID*/\n\t@TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"主键ID\")\n    private java.lang.String id;\n\t/**提示词名称*/\n\t@Excel(name = \"提示词名称\", width = 15)\n    @Schema(description = \"提示词名称\")\n    private java.lang.String name;\n\t/**提示词名称*/\n\t@Excel(name = \"提示key\", width = 15)\n    @Schema(description = \"提示key\")\n    private java.lang.String promptKey;\n\t/**提示词功能描述*/\n\t@Excel(name = \"提示词功能描述\", width = 15)\n    @Schema(description = \"提示词功能描述\")\n    private java.lang.String description;\n\t/**提示词模板内容，支持变量占位符如 {{variable}}*/\n\t@Excel(name = \"提示词模板内容，支持变量占位符如 {{variable}}\", width = 15)\n    @Schema(description = \"提示词模板内容，支持变量占位符如 {{variable}}\")\n    private java.lang.String content;\n\t/**提示词分类*/\n\t@Excel(name = \"提示词分类\", width = 15)\n    @Schema(description = \"提示词分类\")\n    private java.lang.String category;\n\t/**标签，多个逗号分割*/\n\t@Excel(name = \"标签，多个逗号分割\", width = 15)\n    @Schema(description = \"标签，多个逗号分割\")\n    private java.lang.String tags;\n\t/**适配的大模型ID*/\n\t@Excel(name = \"适配的大模型ID\", width = 15)\n    @Schema(description = \"适配的大模型ID\")\n    private java.lang.String modelId;\n\t/**大模型的参数配置*/\n\t@Excel(name = \"大模型的参数配置\", width = 15)\n    @Schema(description = \"大模型的参数配置\")\n    private java.lang.String modelParam;\n\t/**状态（0:未发布 1:已发布）*/\n\t@Excel(name = \"状态（0:未发布 1:已发布）\", width = 15)\n    @Schema(description = \"状态（0:未发布 1:已发布）\")\n    private java.lang.String status;\n\t/**版本号(格式 0.0.1)*/\n\t@Excel(name = \"版本号(格式 0.0.1)\", width = 15)\n    @Schema(description = \"版本号(格式 0.0.1)\")\n    private java.lang.String version;\n\t/**删除状态（0未删除 1已删除）*/\n\t@Excel(name = \"删除状态（0未删除 1已删除）\", width = 15)\n    @Schema(description = \"删除状态（0未删除 1已删除）\")\n    @TableLogic\n    private java.lang.Integer delFlag;\n\t/**创建人*/\n    @Schema(description = \"创建人\")\n    private java.lang.String createBy;\n\t/**创建日期*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建日期\")\n    private java.util.Date createTime;\n\t/**更新人*/\n    @Schema(description = \"更新人\")\n    private java.lang.String updateBy;\n\t/**更新日期*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"更新日期\")\n    private java.util.Date updateTime;\n\t/**所属部门*/\n    @Schema(description = \"所属部门\")\n    private java.lang.String sysOrgCode;\n\t/**租户id*/\n\t@Excel(name = \"租户id\", width = 15)\n    @Schema(description = \"租户id\")\n    private java.lang.String tenantId;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/prompts/mapper/AiragExtDataMapper.java",
    "content": "package org.jeecg.modules.airag.prompts.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.airag.prompts.entity.AiragExtData;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: airag_ext_data\n * @Author: jeecg-boot\n * @Date:   2025-12-12\n * @Version: V1.0\n */\npublic interface AiragExtDataMapper extends BaseMapper<AiragExtData> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/prompts/mapper/AiragPromptsMapper.java",
    "content": "package org.jeecg.modules.airag.prompts.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.airag.prompts.entity.AiragPrompts;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: airag_prompts\n * @Author: jeecg-boot\n * @Date:   2025-12-12\n * @Version: V1.0\n */\npublic interface AiragPromptsMapper extends BaseMapper<AiragPrompts> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/prompts/mapper/xml/AiragExtDataMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.airag.prompts.mapper.AiragExtDataMapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/prompts/mapper/xml/AiragPromptsMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.airag.prompts.mapper.AiragPromptsMapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/prompts/service/IAiragExtDataService.java",
    "content": "package org.jeecg.modules.airag.prompts.service;\n\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.modules.airag.prompts.entity.AiragExtData;\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.airag.prompts.vo.AiragDebugVo;\n\nimport java.util.List;\n\n/**\n * @Description: airag_ext_data\n * @Author: jeecg-boot\n * @Date:   2025-12-12\n * @Version: V1.0\n */\npublic interface IAiragExtDataService extends IService<AiragExtData> {\n\n    Result debugEvaluator(AiragDebugVo debugVo);\n\n    List<AiragExtData> queryTrackById(String id);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/prompts/service/IAiragPromptsService.java",
    "content": "package org.jeecg.modules.airag.prompts.service;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.modules.airag.prompts.entity.AiragPrompts;\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.airag.prompts.vo.AiragExperimentVo;\n\n/**\n * @Description: airag_prompts\n * @Author: jeecg-boot\n * @Date:   2025-12-12\n * @Version: V1.0\n */\npublic interface IAiragPromptsService extends IService<AiragPrompts> {\n\n    Result<?> promptExperiment(AiragExperimentVo experimentVo, HttpServletRequest request);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/prompts/service/impl/AiragExtDataServiceImpl.java",
    "content": "package org.jeecg.modules.airag.prompts.service.impl;\n\nimport com.alibaba.fastjson2.JSON;\nimport com.alibaba.fastjson2.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport dev.langchain4j.data.message.ChatMessage;\nimport dev.langchain4j.data.message.SystemMessage;\nimport dev.langchain4j.data.message.UserMessage;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.util.AssertUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.airag.common.handler.AIChatParams;\nimport org.jeecg.modules.airag.common.handler.IAIChatHandler;\nimport org.jeecg.modules.airag.prompts.entity.AiragExtData;\nimport org.jeecg.modules.airag.prompts.mapper.AiragExtDataMapper;\nimport org.jeecg.modules.airag.prompts.service.IAiragExtDataService;\nimport org.jeecg.modules.airag.prompts.vo.AiragDebugVo;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.Arrays;\nimport java.util.List;\n\n/**\n * @Description: airag_ext_data\n * @Author: jeecg-boot\n * @Date:   2025-12-12\n * @Version: V1.0\n */\n@Service(\"airagExtDataServiceImpl\")\npublic class AiragExtDataServiceImpl extends ServiceImpl<AiragExtDataMapper, AiragExtData> implements IAiragExtDataService {\n\n    @Autowired\n    IAIChatHandler aiChatHandler;\n\n    @Override\n    public Result debugEvaluator(AiragDebugVo debugVo) {\n        //1.提示词\n        String prompt = debugVo.getPrompts();\n        AssertUtils.assertNotEmpty(\"请输入提示词\", prompt);\n\n        //2.测试内容\n        String content = debugVo.getContent();\n        AssertUtils.assertNotEmpty(\"请输入测试内容\", content);\n        List<ChatMessage> messages = Arrays.asList(new SystemMessage(prompt), new UserMessage(content));\n\n        //3.模型数据\n        String modelId = debugVo.getModelId();\n        AssertUtils.assertNotEmpty(\"请选择模型\", modelId);\n\n        //4.模型参数\n        String modelParam = debugVo.getModelParam();\n        // 默认大模型参数\n        AIChatParams params = new AIChatParams();\n        params.setTemperature(0.8);\n        params.setTopP(0.9);\n        params.setPresencePenalty(0.1);\n        params.setFrequencyPenalty(0.1);\n\n        if(oConvertUtils.isNotEmpty(modelParam)){\n            JSONObject param = JSON.parseObject(modelParam);\n            if(param.containsKey(\"temperature\")){\n                params.setTemperature(param.getDoubleValue(\"temperature\"));\n            }\n            if(param.containsKey(\"topP\")){\n                params.setTemperature(param.getDoubleValue(\"topP\"));\n            }\n            if(param.containsKey(\"presencePenalty\")){\n                params.setTemperature(param.getDoubleValue(\"presencePenalty\"));\n            }\n            if(param.containsKey(\"frequencyPenalty\")){\n                params.setTemperature(param.getDoubleValue(\"frequencyPenalty\"));\n            }\n        }\n        //5.AI问答\n        String promptValue = aiChatHandler.completions(modelId,messages, params);\n        if (promptValue == null || promptValue.isEmpty()) {\n            return Result.error(\"生成失败\");\n        }\n        return Result.OK(\"success\", promptValue);\n    }\n\n    /**\n     * 查询AI问答记录\n     * @param id\n     * @return\n     */\n    @Override\n    public List<AiragExtData> queryTrackById(String id) {\n        LambdaQueryWrapper<AiragExtData> lqw = new LambdaQueryWrapper<AiragExtData>()\n                .eq(AiragExtData::getMetadata, id)\n                .orderByDesc(AiragExtData::getVersion)\n                .orderByDesc(AiragExtData::getCreateTime);\n        List<AiragExtData> list = this.baseMapper.selectList(lqw);\n        return list;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/prompts/service/impl/AiragPromptsServiceImpl.java",
    "content": "package org.jeecg.modules.airag.prompts.service.impl;\n\nimport com.alibaba.fastjson2.JSON;\nimport com.alibaba.fastjson2.JSONArray;\nimport com.alibaba.fastjson2.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport dev.langchain4j.data.message.ChatMessage;\nimport dev.langchain4j.data.message.SystemMessage;\nimport dev.langchain4j.data.message.UserMessage;\nimport jakarta.servlet.http.HttpServletRequest;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.util.AssertUtils;\nimport org.jeecg.common.util.CommonUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.jeecg.modules.airag.common.handler.AIChatParams;\nimport org.jeecg.modules.airag.common.handler.IAIChatHandler;\nimport org.jeecg.modules.airag.prompts.consts.AiPromptsConsts;\nimport org.jeecg.modules.airag.prompts.entity.AiragExtData;\nimport org.jeecg.modules.airag.prompts.entity.AiragPrompts;\nimport org.jeecg.modules.airag.prompts.mapper.AiragPromptsMapper;\nimport org.jeecg.modules.airag.prompts.service.IAiragExtDataService;\nimport org.jeecg.modules.airag.prompts.service.IAiragPromptsService;\nimport org.jeecg.modules.airag.prompts.vo.AiragExperimentVo;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.util.CollectionUtils;\n\nimport java.util.*;\nimport java.util.concurrent.*;\nimport java.util.stream.Collectors;\nimport java.util.stream.IntStream;\n\n/**\n * @Description: airag_prompts\n * @Author: jeecg-boot\n * @Date:   2025-12-12\n * @Version: V1.0\n */\n@Slf4j\n@Service(\"airagPromptsServiceImpl\")\npublic class AiragPromptsServiceImpl extends ServiceImpl<AiragPromptsMapper, AiragPrompts> implements IAiragPromptsService {\n    @Autowired\n    IAIChatHandler aiChatHandler;\n\n    @Autowired\n    IAiragExtDataService airagExtDataService;\n\n    @Autowired\n    private JeecgBaseConfig jeecgBaseConfig;\n    // 创建静态线程池，确保整个应用生命周期中只有一个实例\n    private static final ExecutorService executor = new ThreadPoolExecutor(\n            4, // 核心线程数\n            8, // 最大线程数\n            60L, TimeUnit.SECONDS,\n            new ArrayBlockingQueue<>(100), // 防止内存溢出\n            new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略\n    );\n\n    /**\n     * 提示词实验\n     * @param experimentVo\n     * @return\n     */\n    @Override\n    public Result<?> promptExperiment(AiragExperimentVo experimentVo, HttpServletRequest request) {\n        log.info(\"开始执行提示词实验，参数：{}\", JSON.toJSONString(experimentVo));\n\n        // 参数验证\n        String promptKey = experimentVo.getPromptKey();\n        AssertUtils.assertNotEmpty(\"请选择提示词\", promptKey);\n        String dataId = experimentVo.getExtDataId();\n        AssertUtils.assertNotEmpty(\"请选择数据集\", dataId);\n\n        Map<String, String> fieldMappings = experimentVo.getMappings();\n        AssertUtils.assertNotEmpty(\"请配置字段映射\", fieldMappings);\n\n        try {\n            //1.查询提示词\n            AiragPrompts airagPrompts = this.baseMapper.selectOne(new LambdaQueryWrapper<AiragPrompts>().eq(AiragPrompts::getPromptKey, promptKey));\n            AssertUtils.assertNotEmpty(\"未找到指定的提示词\", airagPrompts);\n            String modelParam = airagPrompts.getModelParam();\n             // 过滤提示词变量\n            JSONArray promptVariables;\n            if(oConvertUtils.isNotEmpty(modelParam)){\n                JSONObject airagPromptsParams = JSON.parseObject(modelParam);\n                if(airagPromptsParams.containsKey(\"promptVariables\")){\n                    promptVariables = airagPromptsParams.getJSONArray(\"promptVariables\");\n                } else {\n                    promptVariables = null;\n                }\n            } else {\n                promptVariables = null;\n            }\n            //2.查询数据集\n            AiragExtData airagExtData = airagExtDataService.getById(dataId);\n            AssertUtils.assertNotEmpty(\"未找到指定的数据集\", airagExtData);\n            String datasetValue = airagExtData.getDatasetValue();\n            if(oConvertUtils.isEmpty(datasetValue)){\n                return Result.error(\"评测集不能为空！\");\n            }\n\n            //3.异步调用 根据映射字段，调用评估器测评\n            JSONObject datasetObj = JSONObject.parseObject(datasetValue);\n            //评测列配置\n            JSONArray columns = datasetObj.getJSONArray(\"columns\");\n            //评测题库\n            JSONArray datasetArray = datasetObj.getJSONArray(\"dataSource\");\n            AssertUtils.assertNotEmpty(\"数据集中没有找到数据源\", datasetArray);\n            AssertUtils.assertTrue(\"数据源为空\", datasetArray.size() > 0);\n\n            //测评结果集 - 使用线程安全的CopyOnWriteArrayList\n            List<JSONObject> scoreResult = new CopyOnWriteArrayList<>();\n\n            // 批量提交任务\n            List<CompletableFuture<Void>> futures = IntStream.range(0, datasetArray.size())\n                .mapToObj(i -> CompletableFuture.runAsync(() -> {\n                    try {\n                        log.info(\"开始处理第{}条数据\", i + 1);\n                        //定义返回结果\n                        JSONObject result = new JSONObject();\n                        //评测数据\n                        JSONObject dataset = datasetArray.getJSONObject(i);\n                        result.putAll(dataset);\n                        //用户问题\n                        String userQuery = dataset.getString(fieldMappings.get(\"user_query\"));\n                        result.put(\"userQuery\", userQuery);\n                        //变量处理\n                       if(!CollectionUtils.isEmpty(promptVariables)){\n                           String content = airagPrompts.getContent();\n                           for (Object var : promptVariables){\n                              JSONObject variable = JSONObject.parseObject(var.toString());\n                              String name = dataset.getString(fieldMappings.get(variable.getString(\"name\")));\n                              //提示词默认变量值\n                              String defaultValue = variable.getString(\"value\");\n                              // 获取目标类型\n                              String dataType = findDataType(columns, variable);\n                               if(\"FILE\".equals(dataType)){\n                                  defaultValue = getFileAccessHttpUrl(request, defaultValue);\n                                  name = getFileAccessHttpUrl(request, name);\n                              }\n                              if(oConvertUtils.isNotEmpty(name)){\n                                  //提示词 评估集变量值替换\n                                  content = content.replaceAll(variable.getString(\"name\"), name);\n                              }else if(oConvertUtils.isNotEmpty(defaultValue)){\n                                  content = content.replaceAll(variable.getString(\"name\"), defaultValue);\n                              }\n                          }\n                           airagPrompts.setContent(content);\n                       }\n\n                        //提示词答案\n                        String promptAnswer = getPromptAnswer(airagPrompts, dataset, fieldMappings);\n                        result.put(\"promptAnswer\", promptAnswer);\n\n                        //评估器答案\n                        String answerScore = getAnswerScore(promptAnswer, dataset, fieldMappings, airagExtData);\n                        result.put(\"answerScore\", answerScore);\n\n                        scoreResult.add(result);\n                        log.info(\"第{}条数据处理完成\", i + 1);\n                    } catch (Exception e) {\n                        log.error(\"处理第{}条数据时发生异常\", i + 1, e);\n                        // 重新抛出异常，让CompletableFuture捕获\n                        throw new CompletionException(e);\n                    }\n                }, executor))\n                .collect(Collectors.toList());\n\n            // 非阻塞方式处理完成\n            CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))\n                .whenComplete((result, ex) -> {\n                    if (ex != null) {\n                        log.error(\"批量处理失败\", ex);\n                        // 更新状态为失败\n                        airagExtData.setStatus(AiPromptsConsts.STATUS_FAILED);\n                    } else {\n                        log.info(\"所有数据处理完成，共处理{}条数据\", scoreResult.size());\n                        // 查询已存在的评测记录\n                        List<AiragExtData> existingTracks = airagExtDataService.queryTrackById(dataId);\n                        Integer version = 1;\n                        if(!CollectionUtils.isEmpty(existingTracks)) {\n                            version = existingTracks.stream()\n                                    .map(AiragExtData::getVersion)\n                                    .max(Integer::compareTo)\n                                    .orElse(0) + 1;\n                        }\n                        for (JSONObject item : scoreResult) {\n                            // 保存结果\n                            AiragExtData track = new AiragExtData();\n                            //关联评估器ID\n                            track.setMetadata(dataId);\n                            //定义类型\n                            track.setBizType(AiPromptsConsts.BIZ_TYPE_TRACK);\n                            //定义版本\n                            track.setVersion(version);\n                            //定义状态\n                            track.setStatus(AiPromptsConsts.STATUS_COMPLETED);\n                            //定义评测结果\n                            track.setDataValue(item.toJSONString());\n                            airagExtDataService.save(track);\n                        }\n                        // 更新状态为完成\n                        airagExtData.setStatus(AiPromptsConsts.STATUS_COMPLETED);\n                    }\n                    airagExtDataService.updateById(airagExtData);\n                });\n\n            //4.修改状态进行中\n            airagExtData.setStatus(AiPromptsConsts.STATUS_RUNNING);\n            airagExtDataService.updateById(airagExtData);\n\n            log.info(\"提示词实验已提交，共{}条数据待处理\", datasetArray.size());\n            return Result.OK(\"实验已开始，正在处理数据\");\n        } catch (Exception e) {\n            log.error(\"提示词实验执行失败\", e);\n            return Result.error(\"实验执行失败：\" + e.getMessage());\n        }\n    }\n\n\n    /**\n     * 提示词回答的结果\n     * @param airagPrompts\n     * @param questions\n     * @param fieldMappings\n     * @return\n     */\n    public String getPromptAnswer(AiragPrompts airagPrompts, JSONObject questions, Map<String, String> fieldMappings) {\n        try {\n            //0.判断是否配置了判断fieldMappings的value值 是否包含actual_output\n            if (!fieldMappings.containsValue(\"actual_output\")) {\n                log.warn(\"字段映射中没有配置actual_output\");\n                return null;\n            }\n\n            //1.提示词\n            String prompt = airagPrompts.getContent();\n            AssertUtils.assertNotEmpty(\"请输入提示词\", prompt);\n\n            String userQuery = questions.getString(fieldMappings.get(\"user_query\"));\n            AssertUtils.assertNotEmpty(\"请输入测试内容\", userQuery);\n\n            //2.ai问题组装\n            List<ChatMessage> messages = Arrays.asList(new SystemMessage(prompt), new UserMessage(userQuery));\n\n            //3.模型数据\n            String modelId = airagPrompts.getModelId();\n            AssertUtils.assertNotEmpty(\"请选择模型\", modelId);\n\n            //4.模型参数\n            String modelParam = airagPrompts.getModelParam();\n            // 默认大模型参数\n            AIChatParams params = new AIChatParams();\n            params.setTemperature(0.8);\n            params.setTopP(0.9);\n            params.setPresencePenalty(0.1);\n            params.setFrequencyPenalty(0.1);\n\n            if(oConvertUtils.isNotEmpty(modelParam)){\n                JSONObject param = JSON.parseObject(modelParam);\n                if(param.containsKey(\"temperature\")){\n                    params.setTemperature(param.getDoubleValue(\"temperature\"));\n                }\n                if(param.containsKey(\"topP\")){\n                    params.setTopP(param.getDoubleValue(\"topP\")); // 修复：设置到正确的字段\n                }\n                if(param.containsKey(\"presencePenalty\")){\n                    params.setPresencePenalty(param.getDoubleValue(\"presencePenalty\")); // 修复：设置到正确的字段\n                }\n                if(param.containsKey(\"frequencyPenalty\")){\n                    params.setFrequencyPenalty(param.getDoubleValue(\"frequencyPenalty\")); // 修复：设置到正确的字段\n                }\n            }\n\n            log.debug(\"调用AI模型，模型ID：{}，参数：{}\", modelId, JSON.toJSONString(params));\n            //5.AI问答\n            String promptAnswer = aiChatHandler.completions(modelId, messages, params);\n            log.debug(\"AI模型返回结果：{}\", promptAnswer);\n\n            return promptAnswer;\n        } catch (Exception e) {\n            log.error(\"获取提示词回答失败\", e);\n            return null;\n        }\n    }\n\n    /**\n     * 评测答案分数\n     * @return\n     */\n    public String getAnswerScore(String promptAnswer, JSONObject questions, Map<String, String> fieldMappings, AiragExtData airagExtData) {\n        try {\n            //1.提示词\n            String prompt = airagExtData.getDataValue();\n            AssertUtils.assertNotEmpty(\"请输入提示词\", prompt);\n            prompt += \"定义返回格式： 得分：最终的得分，必须输出一个数字，表示满足Prompt中评分标准的程度。得分范围从 0.0 到 1.0，1.0 表示完全满足评分标准，0.0 表示完全不满足评分标准。\\n\" +\n                    \"原因：{对得分的可读性的解释，说明打分原因}。最后，必须用一句话结束理由，该句话为：因此，应该给出的分数是<你评测的的得分>。请勿返回提问的问题、添加分析过程、解释说明等内容，只返回要求的格式内容\";\n\n            String userQuery = \"输入的内容：\";\n            //2.拼接测试内容\n            for (Map.Entry<String, String> entry : fieldMappings.entrySet()) {\n                // 评估器中的key\n                String key = entry.getKey();\n                // 评估器中的映射的key\n                String value = entry.getValue();\n                String valueData;\n                if(\"actual_output\".equalsIgnoreCase(value)){\n                    valueData = promptAnswer;\n                }else{\n                    valueData = questions.getString(value);\n                }\n                userQuery += (key + \":\" + valueData + \" \");\n            }\n            List<ChatMessage> messages = Arrays.asList(new SystemMessage(prompt), new UserMessage(userQuery));\n\n            //3.模型数据\n            String metadata = airagExtData.getMetadata();\n            if(oConvertUtils.isNotEmpty(metadata)){\n                JSONObject modelParam = JSONObject.parseObject(metadata);\n                String modelId = modelParam.getString(\"modelId\");\n                AssertUtils.assertNotEmpty(\"评估器模型ID不能为空\", modelId);\n\n                // 默认大模型参数\n                AIChatParams params = new AIChatParams();\n                params.setTemperature(0.8);\n                params.setTopP(0.9);\n                params.setPresencePenalty(0.1);\n                params.setFrequencyPenalty(0.1);\n\n                if(oConvertUtils.isNotEmpty(modelParam)){\n                    if(modelParam.containsKey(\"temperature\")){\n                        params.setTemperature(modelParam.getDoubleValue(\"temperature\"));\n                    }\n                    if(modelParam.containsKey(\"topP\")){\n                        params.setTopP(modelParam.getDoubleValue(\"topP\")); // 修复：设置到正确的字段\n                    }\n                    if(modelParam.containsKey(\"presencePenalty\")){\n                        params.setPresencePenalty(modelParam.getDoubleValue(\"presencePenalty\")); // 修复：设置到正确的字段\n                    }\n                    if(modelParam.containsKey(\"frequencyPenalty\")){\n                        params.setFrequencyPenalty(modelParam.getDoubleValue(\"frequencyPenalty\")); // 修复：设置到正确的字段\n                    }\n                }\n\n                log.debug(\"调用评估器模型，模型ID：{}，参数：{}\", modelId, JSON.toJSONString(params));\n                //5.AI问答\n                String answerScore = aiChatHandler.completions(modelId, messages, params);\n                log.debug(\"评估器模型返回结果：{}\", answerScore);\n\n                return answerScore;\n            }\n            return null;\n        } catch (Exception e) {\n            log.error(\"获取答案评分失败\", e);\n            return null;\n        }\n    }\n\n    /**\n     *\n     * @param columns\n     * @param variable\n     * @return\n     */\n    public static String findDataType(JSONArray columns, JSONObject variable) {\n        // 获取目标字段值\n        String targetName = variable.getString(\"name\");\n\n        // 使用 Stream API 查找并获取 dataType\n        return columns.stream()\n                .map(obj -> JSONObject.parseObject(obj.toString()))\n                .filter(column -> targetName.equals(column.getString(\"name\")))\n                .findFirst()\n                .map(column -> column.getString(\"dataType\"))\n                .orElse(null); // 如果没有找到，返回 null\n    }\n    /**\n     * 获取图片地址\n     * @param request\n     * @param url\n     * @return\n     */\n    private String getFileAccessHttpUrl(HttpServletRequest request,String url){\n        if(oConvertUtils.isNotEmpty(url) && url.startsWith(\"http\")){\n            return url;\n        }else{\n            return CommonUtils.getBaseUrl(request) + \"/sys/common/static/\" + url;\n        }\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/prompts/vo/AiragDebugVo.java",
    "content": "package org.jeecg.modules.airag.prompts.vo;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @Description: AiragDebugVo\n * @Author: jeecg-boot\n * @Date:   2025-12-12\n * @Version: V1.0\n */\n@Data\npublic class AiragDebugVo implements Serializable {\n    private static final long serialVersionUID = 1L;\n    /**\n     * 提示词\n     */\n    private String prompts;\n    /**\n     * 输入内容\n     */\n    private String content;\n\t/**适配的大模型ID*/\n    private String modelId;\n\t/**大模型的参数配置*/\n    private String modelParam;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/prompts/vo/AiragExperimentVo.java",
    "content": "package org.jeecg.modules.airag.prompts.vo;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @Description: AiragExperimentVo\n * @Author: jeecg-boot\n * @Date:   2025-12-12\n * @Version: V1.0\n */\n@Data\npublic class AiragExperimentVo implements Serializable {\n    private static final long serialVersionUID = 1L;\n    /**\n     * 提示词\n     */\n    private String promptKey;\n    /**\n     * 输入内容\n     */\n    private String extDataId;\n    /**\n     * 映射关系\n     */\n    private Map<String,String> mappings;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/wordtpl/consts/WordTitleEnum.java",
    "content": "package org.jeecg.modules.airag.wordtpl.consts;\n\nimport lombok.Getter;\n\n/**\n * @author chenrui\n * @ClassName: TitleLevelEnum\n * @Description: 标题级别\n * @date 2024年5月4日07:38:30\n */\n@Getter\npublic enum WordTitleEnum {\n\n    FIRST(\"first\", \"标题1\"),\n    SECOND(\"second\", \"标题2\"),\n    THIRD(\"third\", \"标题3\"),\n    FOURTH(\"fourth\", \"标题4\"),\n    FIFTH(\"fifth\", \"标题5\"),\n    SIXTH(\"sixth\", \"标题6\");\n\n    WordTitleEnum(String code, String name) {\n        this.code = code;\n        this.name = name;\n    }\n\n    final String code;\n\n    final String name;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/wordtpl/controller/EoaWordTemplateController.java",
    "content": "package org.jeecg.modules.airag.wordtpl.controller;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.util.AssertUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.airag.wordtpl.dto.WordTplGenDTO;\nimport org.jeecg.modules.airag.wordtpl.entity.EoaWordTemplate;\nimport org.jeecg.modules.airag.wordtpl.service.IEoaWordTemplateService;\nimport org.jeecg.modules.airag.wordtpl.utils.WordTplUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.BufferedOutputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.InputStream;\nimport java.net.URLEncoder;\nimport java.util.Arrays;\n\n/**\n * @Description: word模版管理\n * @Author: jeecg-boot\n * @Date: 2025-07-04\n * @Version: V1.0\n */\n@Tag(name = \"word模版管理\")\n@RestController(\"eoaWordTemplateController\")\n@RequestMapping(\"/airag/word\")\n@Slf4j\npublic class EoaWordTemplateController extends JeecgController<EoaWordTemplate, IEoaWordTemplateService> {\n    @Autowired\n    private IEoaWordTemplateService eoaWordTemplateService;\n\n    @Autowired\n    WordTplUtils wordTplUtils;\n\n    /**\n     * 分页列表查询\n     *\n     * @param eoaWordTemplate\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @Operation(summary = \"word模版管理-分页列表查询\")\n    @GetMapping(value = \"/list\")\n    public Result<IPage<EoaWordTemplate>> queryPageList(EoaWordTemplate eoaWordTemplate,\n                                                        @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                                        @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                                        HttpServletRequest req) {\n        QueryWrapper<EoaWordTemplate> queryWrapper = QueryGenerator.initQueryWrapper(eoaWordTemplate, req.getParameterMap());\n        Page<EoaWordTemplate> page = new Page<EoaWordTemplate>(pageNo, pageSize);\n        IPage<EoaWordTemplate> pageList = eoaWordTemplateService.page(page, queryWrapper);\n        return Result.OK(pageList);\n    }\n\n    /**\n     * 添加\n     *\n     * @param eoaWordTemplate\n     * @return\n     */\n    @AutoLog(value = \"word模版管理-添加\")\n    @Operation(summary = \"word模版管理-添加\")\n//\t@RequiresPermissions(\"wordtpl:template:add\")\n    @PostMapping(value = \"/add\")\n    public Result<String> add(@RequestBody EoaWordTemplate eoaWordTemplate) {\n        AssertUtils.assertNotEmpty(\"参数异常\", eoaWordTemplate);\n        AssertUtils.assertNotEmpty(\"模版名称不能为空\", eoaWordTemplate.getName());\n        boolean isCodeExists = eoaWordTemplateService.exists(Wrappers.lambdaQuery(EoaWordTemplate.class).eq(EoaWordTemplate::getCode, eoaWordTemplate.getCode()));\n        AssertUtils.assertFalse(\"模版编码已存在\", isCodeExists);\n        eoaWordTemplateService.save(eoaWordTemplate);\n        return Result.OK(\"添加成功！\");\n    }\n\n    /**\n     * 编辑\n     *\n     * @param eoaWordTemplate\n     * @return\n     */\n    @AutoLog(value = \"word模版管理-编辑\")\n    @Operation(summary = \"word模版管理-编辑\")\n//\t@RequiresPermissions(\"wordtpl:template:edit\")\n    @RequestMapping(value = \"/edit\", method = {RequestMethod.PUT, RequestMethod.POST})\n    public Result<String> edit(@RequestBody EoaWordTemplate eoaWordTemplate) {\n        AssertUtils.assertNotEmpty(\"参数异常\", eoaWordTemplate);\n        AssertUtils.assertNotEmpty(\"模版名称不能为空\", eoaWordTemplate.getName());\n        // 避免编辑时修改编码\n        eoaWordTemplate.setCode(null);\n        eoaWordTemplateService.updateById(eoaWordTemplate);\n        return Result.OK(\"编辑成功!\");\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @AutoLog(value = \"word模版管理-通过id删除\")\n    @Operation(summary = \"word模版管理-通过id删除\")\n//\t@RequiresPermissions(\"wordtpl:template:delete\")\n    @DeleteMapping(value = \"/delete\")\n    public Result<String> delete(@RequestParam(name = \"id\", required = true) String id) {\n        eoaWordTemplateService.removeById(id);\n        return Result.OK(\"删除成功!\");\n    }\n\n    /**\n     * 批量删除\n     *\n     * @param ids\n     * @return\n     */\n    @AutoLog(value = \"word模版管理-批量删除\")\n    @Operation(summary = \"word模版管理-批量删除\")\n//\t@RequiresPermissions(\"wordtpl:template:deleteBatch\")\n    @DeleteMapping(value = \"/deleteBatch\")\n    public Result<String> deleteBatch(@RequestParam(name = \"ids\", required = true) String ids) {\n        this.eoaWordTemplateService.removeByIds(Arrays.asList(ids.split(\",\")));\n        return Result.OK(\"批量删除成功!\");\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    //@AutoLog(value = \"word模版管理-通过id查询\")\n    @Operation(summary = \"word模版管理-通过id查询\")\n    @GetMapping(value = \"/queryById\")\n    public Result<EoaWordTemplate> queryById(@RequestParam(name = \"id\", required = true) String id) {\n        EoaWordTemplate eoaWordTemplate = eoaWordTemplateService.getById(id);\n        if (eoaWordTemplate == null) {\n            return Result.error(\"未找到对应数据\");\n        }\n        return Result.OK(eoaWordTemplate);\n    }\n\n    /**\n     * 下载word模版\n     * @param id\n     * @param response\n     * @return\n     * @author chenrui\n     * @date 2025/7/9 14:38\n     */\n    @GetMapping(value = \"/download\")\n    public void downloadTemplate(@RequestParam(name = \"id\", required = true) String id, HttpServletResponse response) {\n        AssertUtils.assertNotEmpty(\"请先选择模版\", id);\n        EoaWordTemplate template = eoaWordTemplateService.getById(id);\n        try (ByteArrayOutputStream wordTemplateOut = new ByteArrayOutputStream();\n             BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());) {\n            wordTplUtils.generateWordTemplate(template, wordTemplateOut);\n            String fileName = template.getName();\n            String encodedFileName = URLEncoder.encode(fileName, \"UTF-8\");\n            response.setContentType(\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\");\n            response.addHeader(\"Content-Disposition\", \"attachment;filename=\" + encodedFileName + \".docx\");\n            response.addHeader(\"filename\", encodedFileName + \".docx\");\n            byte[] bytes = wordTemplateOut.toByteArray();\n            response.setHeader(\"Content-Length\", String.valueOf(bytes.length));\n            bos.write(bytes);\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            throw new JeecgBootException(\"下载word模版失败: \" + e.getMessage(), e);\n        }\n    }\n\n\n    /**\n     * 解析word模版文件\n     * @param file\n     * @param id\n     * @return\n     * @author chenrui\n     * @date 2025/7/9 14:38\n     */\n    @PostMapping(value = \"/parse/file\")\n    public Result<?> parseWOrdFile(@RequestParam(\"file\") MultipartFile file) {\n        try {\n            InputStream inputStream = file.getInputStream();\n            EoaWordTemplate eoaWordTemplate = wordTplUtils.parseWordFile(inputStream);\n            log.info(\"解析的模版信息: {}\", eoaWordTemplate);\n            return Result.OK(\"解析成功\", eoaWordTemplate);\n        } catch (Exception e) {\n            throw new RuntimeException(\"解析word模版失败: \" + e.getMessage(), e);\n        }\n    }\n\n    /**\n     * 生成word文档\n     *\n     * @param wordTplGenDTO\n     * @param response\n     * @author chenrui\n     * @date 2025/7/10 15:39\n     */\n    @PostMapping(value = \"/generate/word\")\n    public void generateWord(@RequestBody WordTplGenDTO wordTplGenDTO, HttpServletResponse response) {\n        AssertUtils.assertNotEmpty(\"参数异常\", wordTplGenDTO);\n        EoaWordTemplate template ;\n        if (oConvertUtils.isNotEmpty(wordTplGenDTO.getTemplateId())) {\n            template = eoaWordTemplateService.getById(wordTplGenDTO.getTemplateId());\n        }else{\n            AssertUtils.assertNotEmpty(\"请先选择模版\", wordTplGenDTO.getTemplateCode());\n            template = eoaWordTemplateService.getOne(Wrappers.lambdaQuery(EoaWordTemplate.class)\n                    .eq(EoaWordTemplate::getCode, wordTplGenDTO.getTemplateCode()));\n        }\n        AssertUtils.assertNotEmpty(\"未找到对应的模版\", template);\n\n        try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();\n             BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());) {\n            eoaWordTemplateService.generateWordFromTpl(wordTplGenDTO, outputStream);\n            String fileName = template.getName();\n            String encodedFileName = URLEncoder.encode(fileName, \"UTF-8\");\n            response.setContentType(\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\");\n            response.addHeader(\"Content-Disposition\", \"attachment;filename=\" + encodedFileName + \".docx\");\n            response.addHeader(\"filename\", encodedFileName + \".docx\");\n            byte[] bytes = outputStream.toByteArray();\n            response.setHeader(\"Content-Length\", String.valueOf(bytes.length));\n            bos.write(bytes);\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            throw new JeecgBootException(\"生成word文档失败: \" + e.getMessage(), e);\n        }\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/wordtpl/dto/MergeColDTO.java",
    "content": "package org.jeecg.modules.airag.wordtpl.dto;\n\nimport lombok.Data;\n\n/**\n * 合并列DTO\n * @author chenrui\n * @date 2025/7/4 18:36\n */\n@Data\npublic class MergeColDTO {\n\n\t/**\n\t * 合并列的行号\n\t */\n\tprivate int row;\n\n\t/**\n\t * 合并列的起始列号\n\t */\n\tprivate int from;\n\n\t/**\n\t * 合并列的结束列号\n\t */\n\tprivate int to;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/wordtpl/dto/WordImageDTO.java",
    "content": "package org.jeecg.modules.airag.wordtpl.dto;\n\nimport lombok.Data;\n\n/**  \n * @ClassName: DocImageDto\n * @Description: word文档图片用实体类\n * @author chenrui\n * @date 2024-10-02 09:17:59 \n*/ \n@Data\npublic class WordImageDTO {\n\n\t/**  \n\t * @Fields type : 类型\n\t * @author chenrui\n\t * @date 2024-09-29 08:53:27 \n\t */  \n\tprivate String type = \"image\";\n\t/**  \n\t * @Fields value : 内容\n\t * @author chenrui\n\t * @date 2024-09-24 10:20:12 \n\t */  \n\tprivate String value = \"\";\n\t\n\t/**  \n\t * @Fields width : 图片宽度\n\t * @author chenrui\n\t * @date 2024-10-02 09:22:33 \n\t */  \n\tprivate double width;\n\t\n\t/**  \n\t * @Fields height : 图片高度\n\t * @author chenrui\n\t * @date 2024-10-02 09:22:40 \n\t */  \n\tprivate double height;\n\t\n\t/**  \n\t * @Fields rowFlex : 水平对齐方式，默认left\n\t * @author chenrui\n\t * @date 2024-09-27 09:12:18 \n\t */  \n\tprivate String rowFlex = \"left\";\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/wordtpl/dto/WordTableCellDTO.java",
    "content": "package org.jeecg.modules.airag.wordtpl.dto;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport lombok.Data;\n\n@Data\npublic class WordTableCellDTO {\n\n\t/**  \n\t * @Fields colspan : 合并列数\n\t * @author chenrui\n\t * @date 2024-09-26 09:37:27 \n\t */  \n\tprivate int colspan;\n\t\n\t/**  \n\t * @Fields rowspan : 合并行数\n\t * @author chenrui\n\t * @date 2024-09-26 09:38:22 \n\t */  \n\tprivate int rowspan;\n\t\n\t/**  \n\t * @Fields value : 单元格数据\n\t * @author chenrui\n\t * @date 2024-09-26 09:42:14 \n\t */  \n\tprivate List<Object> value = new ArrayList<>();\n\t\n\t/**  \n\t * @Fields verticalAlign : 垂直对齐方式，默认top\n\t * @author chenrui\n\t * @date 2024-09-27 09:16:56 \n\t */  \n\tprivate String verticalAlign = \"top\";\n\t\n\t/**  \n\t * @Fields backgroundColor : 背景颜色\n\t * @author chenrui\n\t * @date 2024-11-18 09:56:28 \n\t */  \n\tprivate String backgroundColor;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/wordtpl/dto/WordTableDTO.java",
    "content": "package org.jeecg.modules.airag.wordtpl.dto;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport com.alibaba.fastjson.JSONObject;\n\nimport lombok.Data;\n\n@Data\npublic class WordTableDTO {\n\n    private String value = \"\";\n\n    private String type = \"table\";\n\n    private List<WordTableRowDTO> trList;\n\n    private int width;\n\n    private int height;\n\n    private List<JSONObject> colgroup = new ArrayList<>();\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/wordtpl/dto/WordTableRowDTO.java",
    "content": "package org.jeecg.modules.airag.wordtpl.dto;\n\nimport java.util.List;\n\nimport lombok.Data;\n\n@Data\npublic class WordTableRowDTO {\n\n\t/**  \n\t * @Fields height : 行高\n\t * @author chenrui\n\t * @date 2024-09-26 09:45:30 \n\t */  \n\tprivate Integer height;\n\t\n\t/**  \n\t * @Fields minHeight : 行最小高度\n\t * @author chenrui\n\t * @date 2024-09-26 09:47:28 \n\t */  \n\tprivate int minHeight = 42;\n\t\n\t/**  \n\t * @Fields tdList : 行数据\n\t * @author chenrui\n\t * @date 2024-09-26 09:46:02 \n\t */  \n\tprivate List<WordTableCellDTO> tdList;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/wordtpl/dto/WordTextDTO.java",
    "content": "package org.jeecg.modules.airag.wordtpl.dto;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport lombok.Data;\n\n/**\n * @author chenrui\n * @ClassName: DocTextDto\n * @Description: word文本实体类\n * @date 2024-09-24 10:19:57\n */\n@Data\npublic class WordTextDTO {\n\n    /**\n     * @Fields type : 类型\n     * @author chenrui\n     * @date 2024-09-29 08:53:27\n     */\n    private String type;\n    /**\n     * @Fields value : 内容\n     * @author chenrui\n     * @date 2024-09-24 10:20:12\n     */\n    private String value = \"\";\n\n    /**\n     * @Fields bold : 是否加粗 默认false\n     * @author chenrui\n     * @date 2024-09-24 10:20:33\n     */\n    private boolean bold = false;\n\n    /**\n     * @Fields color : 字体颜色\n     * @author chenrui\n     * @date 2024-09-24 10:21:08\n     */\n    private String color;\n\n    /**\n     * @Fields italic : 是否斜体 默认false\n     * @author chenrui\n     * @date 2024-09-24 10:21:25\n     */\n    private boolean italic = false;\n\n    /**\n     * @Fields underline : 是否下划线 默认false\n     * @author chenrui\n     * @date 2024-09-24 10:21:47\n     */\n    private boolean underline = false;\n\n    /**\n     * @Fields strikeout : 删除线 默认false\n     * @author chenrui\n     * @date 2024-09-24 10:22:06\n     */\n    private boolean strikeout = false;\n\n    /**\n     * @Fields size : 字号大小\n     * @author chenrui\n     * @date 2024-09-24 10:44:42\n     */\n    private int size;\n\n    /**\n     * @Fields font : 字体，默认微软雅黑\n     * @author chenrui\n     * @date 2024-09-24 10:45:31\n     */\n    private String font = \"微软雅黑\";\n\n    /**\n     * @Fields highlight : 高亮颜色\n     * @author chenrui\n     * @date 2024-09-25 11:20:23\n     */\n    private String highlight;\n\n    /**\n     * @Fields rowFlex : 水平对齐方式，默认left\n     * @author chenrui\n     * @date 2024-09-27 09:12:18\n     */\n    private String rowFlex = \"left\";\n\n    private List<Object> dashArray = new ArrayList<>();\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/wordtpl/dto/WordTplGenDTO.java",
    "content": "package org.jeecg.modules.airag.wordtpl.dto;\n\nimport lombok.Data;\n\nimport java.util.Map;\n\n/**\n * word模版生成入参\n * @author chenrui\n * @date 2025/7/10 14:38\n */\n@Data\npublic class WordTplGenDTO {\n\n    /**\n     * 模版id\n     */\n    String templateId;\n\n\n    /**\n     * 模版code\n     */\n    String templateCode;\n\n    /**\n     * 数据\n     */\n    Map<String,Object> data;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/wordtpl/entity/EoaWordTemplate.java",
    "content": "package org.jeecg.modules.airag.wordtpl.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @Description: word模版管理\n * @Author: jeecg-boot\n * @Date: 2025-07-04\n * @Version: V1.0\n */\n@Data\n@TableName(\"aigc_word_template\")\n@Accessors(chain = true)\n@EqualsAndHashCode(callSuper = false)\n@Schema(description = \"word模版管理\")\npublic class EoaWordTemplate implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * 主键\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"主键\")\n    private String id;\n    /**\n     * 创建人\n     */\n    @Schema(description = \"创建人\")\n    private String createBy;\n    /**\n     * 创建日期\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建日期\")\n    private Date createTime;\n    /**\n     * 更新人\n     */\n    @Schema(description = \"更新人\")\n    private String updateBy;\n    /**\n     * 更新日期\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"更新日期\")\n    private Date updateTime;\n    /**\n     * 所属部门\n     */\n    @Schema(description = \"所属部门\")\n    private String sysOrgCode;\n    /**\n     * 模版名称\n     */\n    @Excel(name = \"模版名称\", width = 15)\n    @Schema(description = \"模版名称\")\n    private String name;\n    /**\n     * 模版编码\n     */\n    @Excel(name = \"模版编码\", width = 15)\n    @Schema(description = \"模版编码\")\n    private String code;\n    /**\n     * 页眉\n     */\n    @Excel(name = \"页眉\", width = 15)\n    @Schema(description = \"页眉\")\n    private String header;\n    /**\n     * 页脚\n     */\n    @Excel(name = \"页脚\", width = 15)\n    @Schema(description = \"页脚\")\n    private String footer;\n    /**\n     * 主体内容\n     */\n    @Excel(name = \"主体内容\", width = 15)\n    @Schema(description = \"主体内容\")\n    private String main;\n    /**\n     * 页边距\n     */\n    @Excel(name = \"页边距\", width = 15)\n    @Schema(description = \"页边距\")\n    private String margins;\n    /**\n     * 宽度\n     */\n    @Excel(name = \"宽度\", width = 15)\n    @Schema(description = \"宽度\")\n    private Integer width;\n    /**\n     * 高度\n     */\n    @Excel(name = \"高度\", width = 15)\n    @Schema(description = \"高度\")\n    private Integer height;\n    /**\n     * 纸张方向 vertical纵向 horizontal横向\n     */\n    @Excel(name = \"纸张方向 vertical纵向 horizontal横向\", width = 15)\n    @Schema(description = \"纸张方向 vertical纵向 horizontal横向\")\n    private String paperDirection;\n    /**\n     * 水印\n     */\n    @Excel(name = \"水印\", width = 15)\n    @Schema(description = \"水印\")\n    private String watermark;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/wordtpl/mapper/EoaWordTemplateMapper.java",
    "content": "package org.jeecg.modules.airag.wordtpl.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.jeecg.modules.airag.wordtpl.entity.EoaWordTemplate;\n\n/**\n * @Description: word模版管理\n * @Author: jeecg-boot\n * @Date:   2025-07-04\n * @Version: V1.0\n */\npublic interface EoaWordTemplateMapper extends BaseMapper<EoaWordTemplate> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/wordtpl/mapper/xml/EoaWordTemplateMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.airag.wordtpl.mapper.EoaWordTemplateMapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/wordtpl/service/IEoaWordTemplateService.java",
    "content": "package org.jeecg.modules.airag.wordtpl.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.airag.wordtpl.dto.WordTplGenDTO;\nimport org.jeecg.modules.airag.wordtpl.entity.EoaWordTemplate;\n\nimport java.io.ByteArrayOutputStream;\n\n/**\n * @Description: word模版管理\n * @Author: jeecg-boot\n * @Date:   2025-07-04\n * @Version: V1.0\n */\npublic interface IEoaWordTemplateService extends IService<EoaWordTemplate> {\n\n    /**\n     * 通过模版生成word文档\n     *\n     * @param wordTplGenDTO\n     * @return\n     * @author chenrui\n     * @date 2025/7/10 14:40\n     */\n    void generateWordFromTpl(WordTplGenDTO wordTplGenDTO, ByteArrayOutputStream wordOutputStream);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/wordtpl/service/impl/EoaWordTemplateServiceImpl.java",
    "content": "package org.jeecg.modules.airag.wordtpl.service.impl;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport com.deepoove.poi.XWPFTemplate;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.constant.DataBaseConstant;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.util.AssertUtils;\nimport org.jeecg.modules.airag.wordtpl.dto.WordTplGenDTO;\nimport org.jeecg.modules.airag.wordtpl.entity.EoaWordTemplate;\nimport org.jeecg.modules.airag.wordtpl.mapper.EoaWordTemplateMapper;\nimport org.jeecg.modules.airag.wordtpl.service.IEoaWordTemplateService;\nimport org.jeecg.modules.airag.wordtpl.utils.WordTplUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.io.*;\nimport java.util.Map;\n\n/**\n * @Description: word模版管理\n * @Author: jeecg-boot\n * @Date:   2025-07-04\n * @Version: V1.0\n */\n@Slf4j\n@Service(\"eoaWordTemplateService\")\npublic class EoaWordTemplateServiceImpl extends ServiceImpl<EoaWordTemplateMapper, EoaWordTemplate> implements IEoaWordTemplateService {\n\n    /**\n     * 内置的系统变量键列表\n     */\n    private static final String[] SYSTEM_KEYS = {\n            DataBaseConstant.SYS_ORG_CODE, DataBaseConstant.SYS_ORG_CODE_TABLE, DataBaseConstant.SYS_MULTI_ORG_CODE,\n            DataBaseConstant.SYS_MULTI_ORG_CODE_TABLE, DataBaseConstant.SYS_ORG_ID, DataBaseConstant.SYS_ORG_ID_TABLE,\n            DataBaseConstant.SYS_ROLE_CODE, DataBaseConstant.SYS_ROLE_CODE_TABLE, DataBaseConstant.SYS_USER_CODE,\n            DataBaseConstant.SYS_USER_CODE_TABLE, DataBaseConstant.SYS_USER_ID, DataBaseConstant.SYS_USER_ID_TABLE,\n            DataBaseConstant.SYS_USER_NAME, DataBaseConstant.SYS_USER_NAME_TABLE, DataBaseConstant.SYS_DATE,\n            DataBaseConstant.SYS_DATE_TABLE, DataBaseConstant.SYS_TIME, DataBaseConstant.SYS_TIME_TABLE,\n            DataBaseConstant.SYS_BASE_PATH\n    };\n\n    @Autowired\n    WordTplUtils wordTplUtils;\n\n    @Override\n    public void generateWordFromTpl(WordTplGenDTO wordTplGenDTO, ByteArrayOutputStream wordOutputStream) {\n        AssertUtils.assertNotEmpty(\"参数异常\", wordTplGenDTO);\n        AssertUtils.assertNotEmpty(\"模版ID不能为空\", wordTplGenDTO.getTemplateId());\n        String templateId = wordTplGenDTO.getTemplateId();\n        // 生成word模版 date:2025/7/10\n        EoaWordTemplate template = getById(templateId);\n        ByteArrayOutputStream wordTemplateOut = new ByteArrayOutputStream();\n        wordTplUtils.generateWordTemplate(template, wordTemplateOut);\n        //根据word模版和数据生成word文件\n        Map<String, Object> data = wordTplGenDTO.getData();\n        mergeSystemVarsToData(data);\n        try {\n            XWPFTemplate.compile(new ByteArrayInputStream(wordTemplateOut.toByteArray())).render(data).write(wordOutputStream);\n        }catch (Exception e){\n            log.error(e.getMessage(), e);\n            throw new JeecgBootException(\"生成word文档失败，请检查模版和数据是否正确\");\n        }\n\n    }\n\n    /**\n     * 将系统变量合并到数据中\n     *\n     * @param data\n     * @author chenrui\n     * @date 2025/7/3 17:43\n     */\n    private static void mergeSystemVarsToData(Map<String, Object> data) {\n        for (String key : SYSTEM_KEYS) {\n            if (!data.containsKey(key)) {\n                String value = JwtUtil.getUserSystemData(key, null);\n                if (value != null) {\n                    data.put(key, value);\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/wordtpl/utils/WordTplUtils.java",
    "content": "package org.jeecg.modules.airag.wordtpl.utils;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.poi.wp.usermodel.HeaderFooterType;\nimport org.apache.poi.xwpf.usermodel.*;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.util.AssertUtils;\nimport org.jeecg.common.util.CommonUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.airag.wordtpl.consts.WordTitleEnum;\nimport org.jeecg.modules.airag.wordtpl.dto.*;\nimport org.jeecg.modules.airag.wordtpl.entity.EoaWordTemplate;\nimport org.openxmlformats.schemas.wordprocessingml.x2006.main.*;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport javax.imageio.ImageIO;\nimport java.awt.image.BufferedImage;\nimport java.io.*;\nimport java.math.BigInteger;\nimport java.nio.file.Files;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @Description: Word模版工具类\n * @Author: chenrui\n * @Date: 2025/7/4 10:54\n */\n@Component(\"jeecgWordTplUtils\")\n@Slf4j\npublic class WordTplUtils {\n\n\n    @Value(value = \"${jeecg.path.upload}\")\n    private String uploadpath;\n\n    /**\n     * 本地：local minio：minio 阿里：alioss\n     */\n    @Value(value = \"${jeecg.uploadType}\")\n    private String uploadType;\n\n\n    /**\n     * 根据设计数据生成word模版\n     *\n     * @param template\n     * @param outputStream\n     * @return\n     * @author chenrui\n     * @date 2025/7/9 11:14\n     */\n    public void generateWordTemplate(EoaWordTemplate template, ByteArrayOutputStream outputStream) {\n        AssertUtils.assertNotEmpty(\"模版数据不能为空\", template);\n        XWPFDocument doc = new XWPFDocument();\n\n        //添加自定义标题\n        for (int i = 1; i <= 6; i++) {\n            WordUtil.addCustomHeadingStyle(doc, \"标题\" + i, i);\n        }\n\n        // 设置纸张大小\n        WordUtil.setPaperSize(doc, template.getHeight(), template.getWidth(), template.getPaperDirection());\n        // 设置边距\n        JSONArray margins = JSONArray.parseArray(template.getMargins());\n        WordUtil.setPaperMargins(doc, margins);\n\n        // TODO author: chenrui for:水印设置 date:2025/7/4\n\n        // 渲染页眉和页脚\n        renderHeaderAndFooter(template, doc);\n\n        // 文档主体渲染 date:2025/7/4\n        renderDocumentBody(doc, template);\n\n        // 页码\n//        addPageNumbers(doc, 0);\n\n        try {\n            doc.write(outputStream);\n            outputStream.flush();\n            doc.close();\n        } catch (Exception e) {\n            throw new RuntimeException(\"生成Word模版失败: \" + e.getMessage(), e);\n        }\n    }\n\n    /**\n     * 渲染页眉和页脚\n     *\n     * @param template\n     * @param doc\n     * @author chenrui\n     * @date 2025/7/10 17:52\n     */\n    private static void renderHeaderAndFooter(EoaWordTemplate template, XWPFDocument doc) {\n        //页眉\n        JSONArray header = JSON.parseArray(template.getHeader());\n        if (oConvertUtils.isObjectNotEmpty(header)) {\n            XWPFHeader docHeader = doc.createHeader(HeaderFooterType.DEFAULT);\n            XWPFParagraph paragraph = null;\n            for (int i = 0; i < header.size(); i++) {\n                String type = header.getJSONObject(i).getString(\"type\") == null ? \"\" : header.getJSONObject(i).getString(\"type\");\n                switch (type) {\n                    case \"separator\":\n                        if (i == 0 || paragraph == null) {\n                            paragraph = docHeader.createParagraph();\n                        }\n                        WordUtil.addSeparator(paragraph, header.getJSONObject(i));\n                        if (i == 0) {\n                            paragraph = null;\n                        }\n                        break;\n                    default:\n                        if (paragraph == null) {\n                            paragraph = docHeader.createParagraph();\n                        }\n                        WordUtil.addParagraph(paragraph, header.getJSONObject(i), null, true);\n                        break;\n                }\n            }\n        }\n        //页脚\n        JSONArray footer = JSON.parseArray(template.getFooter());\n        if (oConvertUtils.isObjectNotEmpty(footer)) {\n            XWPFFooter docFooter = doc.createFooter(HeaderFooterType.DEFAULT);\n            XWPFParagraph paragraph = null;\n            for (int i = 0; i < footer.size(); i++) {\n                String type = footer.getJSONObject(i).getString(\"type\") == null ? \"\" : footer.getJSONObject(i).getString(\"type\");\n                switch (type) {\n                    case \"separator\":\n                        if (i == 0 || paragraph == null) {\n                            paragraph = docFooter.createParagraph();\n                        }\n                        WordUtil.addSeparator(paragraph, footer.getJSONObject(i));\n                        if (i == 0) {\n                            paragraph = null;\n                        }\n                        break;\n                    default:\n                        if (paragraph == null) {\n                            paragraph = docFooter.createParagraph();\n                        }\n                        WordUtil.addParagraph(paragraph, footer.getJSONObject(i), null, true);\n                        break;\n                }\n            }\n        }\n    }\n\n//    [poi5.x]\n//    private static void addPageNumbers(XWPFDocument doc, int startingNum) {\n//        CTSectPr sectPr = doc.getDocument().getBody().isSetSectPr() ? doc.getDocument().getBody().getSectPr()\n//                : doc.getDocument().getBody().addNewSectPr();\n//        CTPageNumber pgNum = sectPr.isSetPgNumType() ? sectPr.getPgNumType() : sectPr.addNewPgNumType();\n//        pgNum.setStart(BigInteger.valueOf(startingNum));\n//        pgNum.setFmt(STNumberFormat.DECIMAL);\n//    }\n\n    /**\n     * 渲染文档主体内容\n     *\n     * @param doc\n     * @param template\n     * @author chenrui\n     * @date 2025/7/4 14:00\n     */\n    private void renderDocumentBody(XWPFDocument doc, EoaWordTemplate template) {\n\n        // TODO author: chenrui for:整理图表???? date:2025/7/4\n\n        // TODO author: chenrui for:整理条码 date:2025/7/4\n\n        //文档主体内容\n        JSONArray main = JSON.parseArray(template.getMain());\n        int abstractNumID = 1;\n        if (oConvertUtils.isObjectNotEmpty(main)) {\n            XWPFParagraph paragraph = null;\n            String lastType = \"\";\n            for (int i = 0; i < main.size(); i++) {\n                JSONObject content = main.getJSONObject(i);\n                String type = content.getString(\"type\") == null ? \"\" : content.getString(\"type\");\n                switch (type) {\n                    case \"\":\n                        if (content.getString(\"value\").startsWith(\"\\n\") ||\n                                (!type.equals(lastType) && !\"tab\".equals(lastType)\n                                        && !\"superscript\".equals(lastType)\n                                        && !\"subscript\".equals(lastType)\n                                        && !\"separator\".equals(lastType)\n                                        && !\"hyperlink\".equals(lastType))) {\n                            content.put(\"value\", content.getString(\"value\").replaceFirst(\"\\n\", \"\"));\n                            paragraph = doc.createParagraph();\n                        }\n                        if (\"separator\".equals(lastType)) {\n                            String value = content.getString(\"value\");\n                            if (oConvertUtils.isObjectNotEmpty(value) && value.startsWith(\"\\n\")) {\n                                content.put(\"value\", value.replaceFirst(\"\\n\", \"\"));\n                            }\n                        }\n                        if (paragraph == null) {\n                            paragraph = doc.createParagraph();\n                        }\n                        WordUtil.addParagraph(paragraph, content, null, false);\n                        break;\n                    case \"title\":\n                        if (paragraph == null) {\n                            paragraph = doc.createParagraph();\n                        }\n                        WordUtil.addTitleParagraph(paragraph, content);\n                        break;\n                    case \"tab\":\n                        if (paragraph == null) {\n                            paragraph = doc.createParagraph();\n                        }\n                        WordUtil.addTab(paragraph, null);\n                        break;\n                    case \"table\":\n                        abstractNumID = WordUtil.addTable(doc, content, abstractNumID);\n                        break;\n                    case \"superscript\":\n                        if (paragraph == null) {\n                            paragraph = doc.createParagraph();\n                        }\n                        WordUtil.addSubSupScript(paragraph, content, \"sup\");\n                        break;\n                    case \"subscript\":\n                        if (paragraph == null) {\n                            paragraph = doc.createParagraph();\n                        }\n                        WordUtil.addSubSupScript(paragraph, content, \"sub\");\n                        break;\n                    case \"separator\":\n                        if (paragraph == null) {\n                            paragraph = doc.createParagraph();\n                        }\n                        WordUtil.addSeparator(paragraph, content);\n                        break;\n                    case \"list\":\n                        abstractNumID = WordUtil.addList(doc, content, abstractNumID);\n                        break;\n                    case \"hyperlink\":\n                        if (paragraph == null) {\n                            paragraph = doc.createParagraph();\n                        }\n                        WordUtil.addHyperlink(paragraph, content);\n                        break;\n                    case \"pageBreak\":\n                        if (paragraph == null) {\n                            paragraph = doc.createParagraph();\n                        }\n                        WordUtil.addPageBreak(paragraph);\n                        break;\n                    case \"image\":\n//                        String chartUrlPrefix = MessageUtil.getValue(\"chart.url.prefix\");\n                        String url = content.getString(\"value\");\n                        if (paragraph == null) {\n                            paragraph = doc.createParagraph();\n                        }\n                        // TODO author: chenrui for:图表和条码 date:2025/7/4\n//                        if (url.contains(chartUrlPrefix)) {\n//                            //图表\n//                            if (!StringUtil.isEmptyMap(docTplChartsMap)) {\n//                                if (docTplChartsMap.containsKey(url)) {\n//                                    DocTplCharts tplCharts = docTplChartsMap.get(url).get(0);\n//                                    DocChartSettingDto docChartSettingDto = new DocChartSettingDto();\n//                                    BeanUtils.copyProperties(tplCharts, docChartSettingDto);\n//                                    WordUtil.addChart(doc, paragraph, content, dynamicData, isTemplate, docChartSettingDto);\n//                                } else {\n//                                    WordUtil.addImage(paragraph, content);\n//                                }\n//                            } else if (!StringUtil.isEmptyMap(docTplCodesMap)) {\n//                                if (docTplCodesMap.containsKey(url) && !isTemplate) {\n//                                    DocTplCodes tplCodes = docTplCodesMap.get(url).get(0);\n//                                    Map<String, Object> data = null;\n//                                    if (dynamicData.get(tplCodes.getDatasetName()) != null) {\n//                                        Object obj = dynamicData.get(tplCodes.getDatasetName());\n//                                        if (obj instanceof List) {\n//                                            List<Map<String, Object>> datas = (List<Map<String, Object>>) obj;\n//                                            data = datas.get(0);\n//                                        } else {\n//                                            data = (Map<String, Object>) dynamicData.get(tplCodes.getDatasetName());\n//                                        }\n//\n//                                    }\n//                                    int width = content.getIntValue(\"width\");\n//                                    int height = content.getIntValue(\"height\");\n//                                    if (data != null) {\n//                                        Object value = data.get(tplCodes.getValueField());\n//                                        if (value != null) {\n//                                            byte[] codeByte = null;\n//                                            if (tplCodes.getCodeType().intValue() == 1) {\n//                                                codeByte = BarCodeUtil.generateBarcodeImage(String.valueOf(value), width, height);\n//                                            } else {\n//                                                codeByte = QRCodeUtil.generateQRCodeImage(String.valueOf(value), width, height);\n//                                            }\n//                                            WordUtil.addImage(paragraph, content, codeByte);\n//                                        }\n//                                    }\n//                                } else {\n//                                    WordUtil.addImage(paragraph, content);\n//                                }\n//                            } else {\n//                                WordUtil.addImage(paragraph, content);\n//                            }\n//                        } else {\n                        //图片\n                        WordUtil.addImage(paragraph, content);\n//                        }\n                        break;\n                    default:\n                        if (content.getString(\"value\").startsWith(\"\\n\") ||\n                                (!type.equals(lastType) && !\"tab\".equals(lastType)\n                                        && !\"superscript\".equals(lastType)\n                                        && !\"subscript\".equals(lastType)\n                                        && !\"separator\".equals(lastType))) {\n                            content.put(\"value\", content.getString(\"value\").replaceFirst(\"\\n\", \"\"));\n                            paragraph = doc.createParagraph();\n                        }\n                        if (\"separator\".equals(lastType)) {\n                            String value = content.getString(\"value\");\n                            if (oConvertUtils.isObjectNotEmpty(value) && value.startsWith(\"\\n\")) {\n                                content.put(\"value\", value.replaceFirst(\"\\n\", \"\"));\n                            }\n                        }\n                        WordUtil.addParagraph(paragraph, content, null, false);\n                        break;\n                }\n                lastType = type;\n            }\n        }\n    }\n\n    public EoaWordTemplate parseWordFile(InputStream wordFileIs) throws Exception {\n        AssertUtils.assertNotEmpty(\"请上传word文档\", wordFileIs);\n        EoaWordTemplate template = new EoaWordTemplate();\n        XWPFDocument xwpfDocument = new XWPFDocument(wordFileIs);\n        CTSectPr sectPr = xwpfDocument.getDocument().getBody().getSectPr();\n        if (sectPr != null) {\n            if (sectPr.getPgSz().getOrient() != null) {\n                if (\"landscape\".equals(String.valueOf(sectPr.getPgSz().getOrient()))) {\n                    template.setPaperDirection(\"horizontal\");\n                }\n            }\n            // [poi 5.x版本] getW() 和 getH() 返回 Object，需要强转为 BigInteger\n            BigInteger w = (BigInteger) sectPr.getPgSz().getW();\n            double width = Math.ceil((double) w.intValue() / 20 * 1.33445);\n            BigInteger h = (BigInteger) sectPr.getPgSz().getH();\n            double height = Math.ceil((double) h.intValue() / 20 * 1.33445);\n            if (\"horizontal\".equals(template.getPaperDirection())) {\n                template.setHeight((int) width);\n                template.setWidth((int) height);\n            } else {\n                template.setHeight((int) height);\n                template.setWidth((int) width);\n            }\n        }\n        List<Object> headerElements = new ArrayList<>();\n        List<XWPFHeader> headers = xwpfDocument.getHeaderList();\n        if (oConvertUtils.isObjectNotEmpty(headers)) {\n            for (int i = 0; i < headers.size(); i++) {\n                XWPFHeader header = headers.get(i);\n                List<XWPFParagraph> paragraphs = header.getParagraphs();\n                if (oConvertUtils.isObjectNotEmpty(paragraphs)) {\n                    for (int j = 0; j < paragraphs.size(); j++) {\n                        parseTextParagraph(paragraphs.get(j), headerElements, j == 0);\n                    }\n                }\n            }\n        }\n        List<Object> footerElements = new ArrayList<>();\n        List<XWPFFooter> footers = xwpfDocument.getFooterList();\n        if (oConvertUtils.isObjectNotEmpty(footers)) {\n            for (int i = 0; i < footers.size(); i++) {\n                XWPFFooter footer = footers.get(i);\n                List<XWPFParagraph> paragraphs = footer.getParagraphs();\n                if (oConvertUtils.isObjectNotEmpty(paragraphs)) {\n                    for (int j = 0; j < paragraphs.size(); j++) {\n                        parseTextParagraph(paragraphs.get(j), footerElements, j == 0);\n                    }\n                }\n            }\n        }\n\n        List<Object> documentElements = new ArrayList<>();\n\n        List<IBodyElement> bodyElements = xwpfDocument.getBodyElements();\n        if (oConvertUtils.isObjectNotEmpty(bodyElements)) {\n            Map<BigInteger, JSONObject> listMap = new HashMap<>();\n            for (int i = 0; i < bodyElements.size(); i++) {\n                IBodyElement iBodyElement = bodyElements.get(i);\n                if (iBodyElement instanceof XWPFParagraph) {\n                    XWPFParagraph paragraph = (XWPFParagraph) iBodyElement;\n                    parseParagraph(paragraph, documentElements, listMap, i == 0);\n                } else if (iBodyElement instanceof XWPFTable) {\n                    parseTable((XWPFTable) iBodyElement, documentElements);\n                }\n\n            }\n        }\n        xwpfDocument.close();\n        template.setMain(JSON.toJSONString(documentElements));\n        template.setHeader(JSON.toJSONString(headerElements));\n        template.setFooter(JSON.toJSONString(footerElements));\n        return template;\n    }\n\n    private void parseParagraph(XWPFParagraph paragraph, List<Object> documentElements, Map<BigInteger, JSONObject> listMap, boolean isFirst) throws Exception {\n        if (paragraph.getNumID() != null) {\n            JSONObject listObj = null;\n            if (listMap.containsKey(paragraph.getNumID())) {\n                listObj = listMap.get(paragraph.getNumID());\n            } else {\n                String listStyle = \"decimal\";\n                String listType = \"ol\";\n                try {\n                    if (\"bullet\".equals(paragraph.getNumFmt())) {\n                        listStyle = \"disc\";\n                        listType = \"ul\";\n                    }\n                } catch (Exception ignored) {\n                }\n                listObj = new JSONObject();\n                listObj.put(\"value\", \"\");\n                listObj.put(\"type\", \"list\");\n                listObj.put(\"listType\", listType);\n                listObj.put(\"listStyle\", listStyle);\n                List<Object> valueList = new ArrayList<>();\n                listObj.put(\"valueList\", valueList);\n                listMap.put(paragraph.getNumID(), listObj);\n                documentElements.add(listObj);\n            }\n            parseListParagraph(paragraph, listObj);\n        } else if (paragraph.getStyle() != null) {\n            parseTitleParagraph(paragraph, documentElements);\n        } else {\n            parseTextParagraph(paragraph, documentElements, isFirst);\n        }\n    }\n\n    private void parseTable(XWPFTable table, List<Object> documentElements) throws Exception {\n        List<JSONObject> colgroup = new ArrayList<>();\n        WordTableDTO wordTableDto = new WordTableDTO();\n        int height = 0;\n        List<XWPFTableRow> rows = table.getRows();\n        Map<String, Object> mergeCells = new HashMap<>();\n        List<WordTableRowDTO> wordTableRowDTOS = new ArrayList<>();\n        for (int i = 0; i < rows.size(); i++) {\n            List<XWPFTableCell> cells = rows.get(i).getTableCells();\n            for (int j = 0; j < cells.size(); j++) {\n                XWPFTableCell cell = cells.get(j);\n                if (cell == null) {\n                    continue;\n                }\n                if (cell.getCTTc().getTcPr().getGridSpan() != null) {\n                    int colspan = cell.getCTTc().getTcPr().getGridSpan().getVal().intValue();\n                    for (int k = 1; k < colspan; k++) {\n                        rows.get(i).getTableCells().add(j + k, null);\n                    }\n                }\n            }\n        }\n        for (int i = 0; i < rows.size(); i++) {\n            WordTableRowDTO wordTableRowDto = new WordTableRowDTO();\n            height = height + rows.get(i).getHeight();\n            wordTableRowDto.setHeight(rows.get(i).getHeight());\n            List<WordTableCellDTO> wordTableCellDtos = new ArrayList<>();\n            List<XWPFTableCell> cells = rows.get(i).getTableCells();\n            for (int j = 0; j < cells.size(); j++) {\n                XWPFTableCell cell = cells.get(j);\n                if (cell == null || mergeCells.containsKey(i + \"_\" + j)) {\n                    continue;\n                }\n                WordTableCellDTO wordTableCellDto = new WordTableCellDTO();\n                int colspan = 1;\n                int rowspan = 1;\n                wordTableCellDto.setColspan(colspan);\n                wordTableCellDto.setRowspan(rowspan);\n                if (oConvertUtils.isObjectNotEmpty(cell.getColor())) {\n                    wordTableCellDto.setBackgroundColor(\"#\" + cell.getColor());\n                }\n                if (cell.getCTTc().getTcPr().getGridSpan() != null) {\n                    wordTableCellDto.setColspan(cell.getCTTc().getTcPr().getGridSpan().getVal().intValue());\n                }\n                if (i == 0) {\n                    int width = 25;\n                    try {\n                        width = cell.getWidth() / 16;\n                    } catch (Exception e) {\n                        log.warn(\"WordTplUtils parseTable getWidth error: {}\", e.getMessage());\n                    }\n                    width = width / wordTableCellDto.getColspan();\n                    for (int k = 0; k < wordTableCellDto.getColspan(); k++) {\n                        JSONObject col = new JSONObject();\n                        col.put(\"width\", width);\n                        colgroup.add(col);\n                    }\n                }\n                if (cell.getCTTc().getTcPr().getVMerge() != null && cell.getCTTc().getTcPr().getVMerge().getVal() != null && \"restart\".equals(cell.getCTTc().getTcPr().getVMerge().getVal().toString())) {\n                    getRowSpan(i, j, wordTableCellDto, mergeCells, rows);\n                }\n                List<XWPFParagraph> cellParagraph = cell.getParagraphs();\n                if (oConvertUtils.isObjectNotEmpty(cellParagraph)) {\n                    List<Object> docTextDtos = new ArrayList<>();\n                    for (int k = 0; k < cellParagraph.size(); k++) {\n                        parseParagraph(cellParagraph.get(k), docTextDtos, new HashMap<>(), k == 0);\n                    }\n                    wordTableCellDto.setValue(docTextDtos);\n                }\n                if (cell.getVerticalAlignment() != null) {\n                    if (cell.getVerticalAlignment() == XWPFTableCell.XWPFVertAlign.TOP) {\n                        wordTableCellDto.setVerticalAlign(\"top\");\n                    } else if (cell.getVerticalAlignment() == XWPFTableCell.XWPFVertAlign.BOTTOM) {\n                        wordTableCellDto.setVerticalAlign(\"bottom\");\n                    } else if (cell.getVerticalAlignment() == XWPFTableCell.XWPFVertAlign.CENTER) {\n                        wordTableCellDto.setVerticalAlign(\"bottom\");\n                    }\n                }\n                wordTableCellDtos.add(wordTableCellDto);\n            }\n            wordTableRowDto.setTdList(wordTableCellDtos);\n            wordTableRowDTOS.add(wordTableRowDto);\n        }\n        wordTableDto.setWidth(table.getWidth());\n        wordTableDto.setHeight(height);\n        wordTableDto.setTrList(wordTableRowDTOS);\n        wordTableDto.setColgroup(colgroup);\n        documentElements.add(wordTableDto);\n    }\n\n    private void parseListParagraph(XWPFParagraph paragraph, JSONObject listObj) {\n        List<Object> valueList = (List<Object>) listObj.get(\"valueList\");\n        List<XWPFRun> runs = paragraph.getRuns();\n        if (oConvertUtils.isObjectNotEmpty(runs)) {\n            for (int i = 0; i < runs.size(); i++) {\n                WordTextDTO wordTextDTO = new WordTextDTO();\n                XWPFRun xwpfRun = runs.get(i);\n                String text = String.valueOf(xwpfRun);\n                if (text.equals(\"\\t\")) {\n                    wordTextDTO.setType(\"tab\");\n                    if (i == 0) {\n                        text = \"\\n\" + text;\n                    }\n                    wordTextDTO.setValue(text);\n                    valueList.add(wordTextDTO);\n                    continue;\n                }\n                if (i == 0 && !text.startsWith(\"\\n\")) {\n                    text = \"\\n\" + text;\n                }\n                wordTextDTO.setValue(text);\n                if (oConvertUtils.isObjectNotEmpty(xwpfRun.getColor())) {\n                    wordTextDTO.setColor(\"#\" + xwpfRun.getColor());\n                }\n                if (xwpfRun.isBold()) {\n                    wordTextDTO.setBold(true);\n                }\n                if (xwpfRun.isItalic()) {\n                    wordTextDTO.setItalic(true);\n                }\n                if (xwpfRun.isStrikeThrough()) {\n                    wordTextDTO.setStrikeout(true);\n                }\n                if (xwpfRun.getUnderline().getValue() != UnderlinePatterns.NONE.getValue()) {\n                    wordTextDTO.setUnderline(true);\n                }\n                wordTextDTO.setSize((int) (xwpfRun.getFontSize() == -1 ? 14 : xwpfRun.getFontSize() * 1.33445));\n                if (oConvertUtils.isObjectNotEmpty(xwpfRun.getFontFamily())) {\n                    wordTextDTO.setFont(xwpfRun.getFontFamily());\n                }\n                // [poi 5.x版本] 获取高亮颜色\n                if (xwpfRun.isHighlighted()) {\n                    String color = WordUtil.getHighlightByName(xwpfRun.getTextHighlightColor().toString());\n                    if (oConvertUtils.isObjectNotEmpty(color)) {\n                        wordTextDTO.setHighlight(color);\n                    }\n                }\n                // [poi 4.x版本] 获取高亮颜色\n//                if (xwpfRun.getCTR() != null && xwpfRun.getCTR().getRPr() != null && xwpfRun.getCTR().getRPr().isSetHighlight()) {\n//                    String highlightVal = xwpfRun.getCTR().getRPr().getHighlight().getVal().toString();\n//                    String color = WordUtil.getHighlightByName(highlightVal);\n//                    if (oConvertUtils.isObjectNotEmpty(color)) {\n//                        wordTextDTO.setHighlight(color);\n//                    }\n//                }\n                valueList.add(wordTextDTO);\n            }\n        }\n    }\n\n    private void parseTitleParagraph(XWPFParagraph paragraph, List<Object> documentElements) {\n        boolean isSeperator = isSeperator(paragraph);\n        JSONObject titleParagraph = new JSONObject();\n        titleParagraph.put(\"value\", \"\");\n        titleParagraph.put(\"type\", \"title\");\n        List<Object> valueList = new ArrayList<>();\n        titleParagraph.put(\"valueList\", valueList);\n        int titleFontSize = 26;\n        String level = WordTitleEnum.FIRST.getCode();\n        if (\"1\".equals(paragraph.getStyle())) {\n            level = WordTitleEnum.FIRST.getCode();\n        } else if (\"2\".equals(paragraph.getStyle())) {\n            titleFontSize = 24;\n            level = WordTitleEnum.SECOND.getCode();\n        } else if (\"3\".equals(paragraph.getStyle())) {\n            titleFontSize = 22;\n            level = WordTitleEnum.THIRD.getCode();\n        } else if (\"4\".equals(paragraph.getStyle())) {\n            titleFontSize = 20;\n            level = WordTitleEnum.FOURTH.getCode();\n        } else if (\"5\".equals(paragraph.getStyle())) {\n            titleFontSize = 18;\n            level = WordTitleEnum.FIFTH.getCode();\n        } else if (\"6\".equals(paragraph.getStyle())) {\n            titleFontSize = 16;\n            level = WordTitleEnum.SIXTH.getCode();\n        }\n        titleParagraph.put(\"level\", level);\n        List<XWPFRun> runs = paragraph.getRuns();\n        if (oConvertUtils.isObjectNotEmpty(runs)) {\n            for (int i = 0; i < runs.size(); i++) {\n                WordTextDTO wordTextDTO = new WordTextDTO();\n                XWPFRun xwpfRun = runs.get(i);\n                String text = String.valueOf(xwpfRun);\n                wordTextDTO.setValue(text == null ? \"\" : text);\n                wordTextDTO.setBold(true);\n                wordTextDTO.setSize(titleFontSize);\n                if (paragraph.getAlignment() != null) {\n                    if (paragraph.getAlignment().getValue() == ParagraphAlignment.LEFT.getValue()) {\n                        wordTextDTO.setRowFlex(\"left\");\n                    } else if (paragraph.getAlignment().getValue() == ParagraphAlignment.RIGHT.getValue()) {\n                        wordTextDTO.setRowFlex(\"right\");\n                    } else if (paragraph.getAlignment().getValue() == ParagraphAlignment.CENTER.getValue()) {\n                        wordTextDTO.setRowFlex(\"center\");\n                    } else if (paragraph.getAlignment().getValue() == ParagraphAlignment.BOTH.getValue()) {\n                        wordTextDTO.setRowFlex(\"alignment\");\n                    }\n                }\n                valueList.add(wordTextDTO);\n            }\n        }\n        documentElements.add(titleParagraph);\n        if (isSeperator) {\n            WordTextDTO wordTextDTO = new WordTextDTO();\n            wordTextDTO.setType(\"separator\");\n            wordTextDTO.setRowFlex(\"left\");\n            wordTextDTO.setValue(\"\\n\");\n            CTP ctp = paragraph.getCTP();\n            CTPPr pr = ctp.isSetPPr() ? ctp.getPPr() : ctp.addNewPPr();\n            CTPBdr border = pr.isSetPBdr() ? pr.getPBdr() : pr.addNewPBdr();\n            CTBorder ct = border.isSetBottom() ? border.getBottom() : border.addNewBottom();\n            int seperatorType = ct.getVal().intValue();\n            List<Object> dashArray = new ArrayList<>();\n            switch (seperatorType) {\n                case 3:\n                    break;\n                case 6:\n                    dashArray.add(1);\n                    dashArray.add(1);\n                    wordTextDTO.setDashArray(dashArray);\n                    break;\n                case 7:\n                    dashArray.add(4);\n                    dashArray.add(4);\n                    wordTextDTO.setDashArray(dashArray);\n                    break;\n                case 8:\n                    dashArray.add(7);\n                    dashArray.add(3);\n                    dashArray.add(3);\n                    dashArray.add(3);\n                    wordTextDTO.setDashArray(dashArray);\n                    break;\n                case 9:\n                    dashArray.add(6);\n                    dashArray.add(2);\n                    dashArray.add(2);\n                    dashArray.add(2);\n                    dashArray.add(2);\n                    dashArray.add(2);\n                    wordTextDTO.setDashArray(dashArray);\n                    break;\n                case 22:\n                    dashArray.add(3);\n                    dashArray.add(1);\n                    wordTextDTO.setDashArray(dashArray);\n                    break;\n                default:\n                    break;\n            }\n            documentElements.add(wordTextDTO);\n        }\n    }\n\n    private void parseTextParagraph(XWPFParagraph paragraph, List<Object> documentElements, boolean isFirst) throws Exception {\n        List<XWPFRun> runs = paragraph.getRuns();\n        boolean isSeperator = isSeperator(paragraph);\n        if (oConvertUtils.isObjectNotEmpty(runs)) {\n            for (int i = 0; i < runs.size(); i++) {\n                WordTextDTO wordTextDto = new WordTextDTO();\n                XWPFRun xwpfRun = runs.get(i);\n                List<CTBr> brList = xwpfRun.getCTR().getBrList();\n                if (oConvertUtils.isObjectNotEmpty(brList)) {\n                    for (CTBr br : brList) {\n                        if (br.getType() == STBrType.PAGE) {\n                            WordTextDTO pageBreak = new WordTextDTO();\n                            pageBreak.setType(\"pageBreak\");\n                            pageBreak.setValue(\"\\n\");\n                            documentElements.add(pageBreak);\n                        }\n                    }\n                }\n                List<XWPFPicture> pictures = xwpfRun.getEmbeddedPictures();\n                if (oConvertUtils.isObjectNotEmpty(pictures)) {\n                    if (i == runs.size() - 1) {\n                        WordTextDTO breakWordTextDto = new WordTextDTO();\n                        breakWordTextDto.setValue(\"\\n\");\n                        documentElements.add(breakWordTextDto);\n                    }\n                    for (int j = 0; j < pictures.size(); j++) {\n                        WordImageDTO wordImageDto = new WordImageDTO();\n                        XWPFPicture picture = pictures.get(j);\n                        byte[] bytes = picture.getPictureData().getData();\n                        BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes));\n                        MultipartFile file = new CustomMultipartFile(\"file\", picture.getPictureData().getFileName(), \"application/octet-stream\", bytes);\n                        String url = this.uploadFile(file, \"wordTplAssets\");\n                        wordImageDto.setValue(url);\n                        wordImageDto.setWidth(image.getWidth());\n                        wordImageDto.setHeight(image.getHeight());\n                        if (paragraph.getAlignment() != null) {\n                            if (paragraph.getAlignment().getValue() == ParagraphAlignment.LEFT.getValue()) {\n                                wordImageDto.setRowFlex(\"left\");\n                            } else if (paragraph.getAlignment().getValue() == ParagraphAlignment.RIGHT.getValue()) {\n                                wordImageDto.setRowFlex(\"right\");\n                            } else if (paragraph.getAlignment().getValue() == ParagraphAlignment.CENTER.getValue()) {\n                                wordImageDto.setRowFlex(\"center\");\n                            } else if (paragraph.getAlignment().getValue() == ParagraphAlignment.BOTH.getValue()) {\n                                wordImageDto.setRowFlex(\"alignment\");\n                            }\n                        }\n                        documentElements.add(wordImageDto);\n                    }\n                    continue;\n                }\n                String text = String.valueOf(xwpfRun);\n                if (text.equals(\"\\t\")) {\n                    if (paragraph.getAlignment() != null) {\n                        if (paragraph.getAlignment().getValue() == ParagraphAlignment.LEFT.getValue()) {\n                            wordTextDto.setRowFlex(\"left\");\n                        } else if (paragraph.getAlignment().getValue() == ParagraphAlignment.RIGHT.getValue()) {\n                            wordTextDto.setRowFlex(\"right\");\n                        } else if (paragraph.getAlignment().getValue() == ParagraphAlignment.CENTER.getValue()) {\n                            wordTextDto.setRowFlex(\"center\");\n                        } else if (paragraph.getAlignment().getValue() == ParagraphAlignment.BOTH.getValue()) {\n                            wordTextDto.setRowFlex(\"alignment\");\n                        }\n                    }\n                    wordTextDto.setType(\"tab\");\n                    if (i == 0 && !isFirst) {\n                        text = \"\\n\" + text;\n                    }\n                    wordTextDto.setValue(text);\n                    documentElements.add(wordTextDto);\n                    continue;\n                }\n                if (i == 0 && !isFirst) {\n                    text = \"\\n\" + text;\n                }\n                String scriptType = getSupSubScriptType(xwpfRun);\n                if (oConvertUtils.isObjectNotEmpty(scriptType)) {\n                    wordTextDto.setType(scriptType);\n                }\n                wordTextDto.setValue(text);\n                if (oConvertUtils.isObjectNotEmpty(xwpfRun.getColor())) {\n                    wordTextDto.setColor(\"#\" + xwpfRun.getColor());\n                }\n                if (xwpfRun.isBold()) {\n                    wordTextDto.setBold(true);\n                }\n                if (xwpfRun.isItalic()) {\n                    wordTextDto.setItalic(true);\n                }\n                if (xwpfRun.isStrikeThrough()) {\n                    wordTextDto.setStrikeout(true);\n                }\n                if (xwpfRun.getUnderline().getValue() != UnderlinePatterns.NONE.getValue()) {\n                    wordTextDto.setUnderline(true);\n                }\n                wordTextDto.setSize((int) (xwpfRun.getFontSize() == -1 ? 14 : xwpfRun.getFontSize() * 1.33445));\n                if (oConvertUtils.isObjectNotEmpty(xwpfRun.getFontFamily())) {\n                    wordTextDto.setFont(xwpfRun.getFontFamily());\n                }\n                // [poi 5.x版本] 获取高亮颜色\n                if (xwpfRun.isHighlighted()) {\n                    String color = WordUtil.getHighlightByName(xwpfRun.getTextHighlightColor().toString());\n                    if (oConvertUtils.isObjectNotEmpty(color)) {\n                        wordTextDto.setHighlight(color);\n                    }\n                }\n                // [poi 4.x版本] 获取高亮颜色\n//                if (xwpfRun.getCTR() != null && xwpfRun.getCTR().getRPr() != null && xwpfRun.getCTR().getRPr().isSetHighlight()) {\n//                    String highlightVal = xwpfRun.getCTR().getRPr().getHighlight().getVal().toString();\n//                    String color = WordUtil.getHighlightByName(highlightVal);\n//                    if (oConvertUtils.isObjectNotEmpty(color)) {\n//                        wordTextDto.setHighlight(color);\n//                    }\n//                }\n                if (paragraph.getAlignment() != null) {\n                    if (paragraph.getAlignment().getValue() == ParagraphAlignment.LEFT.getValue()) {\n                        wordTextDto.setRowFlex(\"left\");\n                    } else if (paragraph.getAlignment().getValue() == ParagraphAlignment.RIGHT.getValue()) {\n                        wordTextDto.setRowFlex(\"right\");\n                    } else if (paragraph.getAlignment().getValue() == ParagraphAlignment.CENTER.getValue()) {\n                        wordTextDto.setRowFlex(\"center\");\n                    } else if (paragraph.getAlignment().getValue() == ParagraphAlignment.BOTH.getValue()) {\n                        wordTextDto.setRowFlex(\"alignment\");\n                    }\n                }\n                documentElements.add(wordTextDto);\n            }\n        }\n        if (isSeperator) {\n            WordTextDTO wordTextDto = new WordTextDTO();\n            wordTextDto.setType(\"separator\");\n            wordTextDto.setRowFlex(\"left\");\n            wordTextDto.setValue(\"\\n\");\n            CTP ctp = paragraph.getCTP();\n            CTPPr pr = ctp.isSetPPr() ? ctp.getPPr() : ctp.addNewPPr();\n            CTPBdr border = pr.isSetPBdr() ? pr.getPBdr() : pr.addNewPBdr();\n            CTBorder ct = border.isSetBottom() ? border.getBottom() : border.addNewBottom();\n            int seperatorType = ct.getVal().intValue();\n            List<Object> dashArray = new ArrayList<>();\n            switch (seperatorType) {\n                case 3:\n                    break;\n                case 6:\n                    dashArray.add(1);\n                    dashArray.add(1);\n                    wordTextDto.setDashArray(dashArray);\n                    break;\n                case 7:\n                    dashArray.add(4);\n                    dashArray.add(4);\n                    wordTextDto.setDashArray(dashArray);\n                    break;\n                case 8:\n                    dashArray.add(7);\n                    dashArray.add(3);\n                    dashArray.add(3);\n                    dashArray.add(3);\n                    wordTextDto.setDashArray(dashArray);\n                    break;\n                case 9:\n                    dashArray.add(6);\n                    dashArray.add(2);\n                    dashArray.add(2);\n                    dashArray.add(2);\n                    dashArray.add(2);\n                    dashArray.add(2);\n                    wordTextDto.setDashArray(dashArray);\n                    break;\n                case 22:\n                    dashArray.add(3);\n                    dashArray.add(1);\n                    wordTextDto.setDashArray(dashArray);\n                    break;\n                default:\n                    break;\n            }\n            documentElements.add(wordTextDto);\n        }\n    }\n\n    private void getRowSpan(int r, int c, WordTableCellDTO wordTableCellDto, Map<String, Object> mergeCells, List<XWPFTableRow> rows) {\n        for (int i = (r + 1); i < rows.size(); i++) {\n            List<XWPFTableCell> cells = rows.get(i).getTableCells();\n            if (c <= (cells.size() - 1)) {\n                XWPFTableCell cell = cells.get(c);\n                if (cell != null && cell.getCTTc().getTcPr().getVMerge() != null && cell.getCTTc().getTcPr().getVMerge().getVal() == null) {\n                    wordTableCellDto.setRowspan(wordTableCellDto.getRowspan() + 1);\n                    mergeCells.put(i + \"_\" + c, \"1\");\n                } else {\n                    break;\n                }\n            }\n        }\n    }\n\n    /**\n     * 是否分隔符\n     *\n     * @param paragraph\n     * @return\n     * @author chenrui\n     * @date 2025/7/9 11:40\n     */\n    private boolean isSeperator(XWPFParagraph paragraph) {\n        boolean result = true;\n        CTP ctp = paragraph.getCTP();\n        if (ctp == null) {\n            return false;\n        }\n        CTPPr pr = ctp.getPPr();\n        if (pr == null) {\n            return false;\n        }\n        CTPBdr border = pr.getPBdr();\n        if (border == null) {\n            return false;\n        }\n        CTBorder ct = border.getBottom();\n        if (ct == null) {\n            return false;\n        }\n        return result;\n    }\n\n    /**\n     * 获取上下标\n     *\n     * @param run\n     * @return\n     * @author chenrui\n     * @date 2025/7/9 12:07\n     */\n    private String getSupSubScriptType(XWPFRun run) {\n        String result = \"\";\n        // [poi 5.x版本] 获取上下标\n       if (run.getCTR().getRPr() != null && run.getCTR().getRPr().getVertAlignArray() != null && run.getCTR().getRPr().getVertAlignArray().length > 0) {\n            CTVerticalAlignRun CTVerticalAlignRun = run.getCTR().getRPr().getVertAlignArray()[0];\n            result = String.valueOf(CTVerticalAlignRun.getVal());\n       }\n        \n        // [poi 4.x版本] 获取上下标\n//        if (run.getCTR() != null) {\n//            if (run.getCTR().getRPr() != null) {\n//                if (run.getCTR().getRPr() != null && run.getCTR().getRPr().isSetVertAlign()) {\n//                    CTVerticalAlignRun ctVerticalAlignRun = run.getCTR().getRPr().getVertAlign();\n//                    result = String.valueOf(ctVerticalAlignRun.getVal());\n//                }\n//            }\n//        }\n        return result;\n    }\n\n    /**\n     * 上传文件\n     *\n     * @param file\n     * @return\n     * @author chenrui\n     * @date 2025/7/7 18:40\n     */\n    private String uploadFile(MultipartFile file, String bizPath) {\n        String savePath;\n        if (CommonConstant.UPLOAD_TYPE_LOCAL.equals(uploadType)) {\n            savePath = CommonUtils.uploadLocal(file, bizPath, uploadpath);\n        } else {\n            savePath = CommonUtils.upload(file, bizPath, uploadType);\n        }\n        return savePath;\n    }\n\n\n    public static void main(String[] args) {\n        EoaWordTemplate template = new EoaWordTemplate();\n        template.setHeight(1123);\n        template.setWidth(794);\n        template.setPaperDirection(\"vertical\");\n        template.setMargins(\"[25.4,31.8,25.4,31.8]\");\n//        template.setMain(\"[{\\\"value\\\":\\\"\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":false,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"\\\",\\\"type\\\":\\\"title\\\",\\\"valueList\\\":[{\\\"value\\\":\\\"会\\\",\\\"font\\\":\\\"微软雅黑\\\",\\\"size\\\":26,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"议\\\",\\\"font\\\":\\\"微软雅黑\\\",\\\"size\\\":26,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"纪\\\",\\\"font\\\":\\\"微软雅黑\\\",\\\"size\\\":26,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"要\\\",\\\"font\\\":\\\"微软雅黑\\\",\\\"size\\\":26,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]}],\\\"level\\\":\\\"first\\\"},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"一\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"、\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"会\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"议\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"时\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"间\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"：\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"{\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":false,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"{\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":false,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"ml.meeting_time\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":false,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\"},{\\\"value\\\":\\\"}\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":false,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"}\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":false,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"二\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"、\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"会\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"议\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"地\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"点\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"：\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"{{ml.location}}\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":false,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\"},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"三\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"、\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"会\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"议\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"议\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"题\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"：\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"{\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":false,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"{ml.agenda}}\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":false,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\"},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"四\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"、\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"会\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"议\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"主\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"持\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"人\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"：\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"{{ml.moderator}}\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":false,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\"},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"五\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"、\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"参\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"会\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"人\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"员\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"：\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":true,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"{{ml.attendees}}\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":false,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\"},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":false,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"{{ml.content}}\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":false,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\"},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":false,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"{{ml.formatted_date}}\\\\n\\\",\\\"font\\\":\\\"宋体\\\",\\\"size\\\":16,\\\"bold\\\":false,\\\"color\\\":\\\"#auto\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\"},{\\\"value\\\":\\\"http://localhost:9099/images/2025-07-03/1940720058774863873.png?t=1751538693508\\\",\\\"type\\\":\\\"image\\\",\\\"rowFlex\\\":\\\"right\\\",\\\"width\\\":137.64250695113952,\\\"height\\\":125.02599781096147,\\\"imgDisplay\\\":\\\"float-top\\\",\\\"imgFloatPosition\\\":{\\\"x\\\":551.6720123291016,\\\"y\\\":358.7252540588379,\\\"pageNo\\\":0}},{\\\"value\\\":\\\"     \\\",\\\"rowFlex\\\":\\\"right\\\"}]\");\n        template.setMain(\"[{\\\"value\\\":\\\"  \\\\n\\\\n222222222222\\\\n2222222222\\\"},{\\\"value\\\":\\\"http://localhost:9099/images/2025-07-08/1942502516700803074.png?t=1751963664591\\\",\\\"type\\\":\\\"image\\\",\\\"width\\\":200,\\\"height\\\":200,\\\"imgDisplay\\\":\\\"float-top\\\",\\\"imgFloatPosition\\\":{\\\"x\\\":232.421875,\\\"y\\\":111,\\\"pageNo\\\":0}},{\\\"value\\\":\\\"22222212312312312333333333333333333333333333333333\\\"}]\");\n\n        WordTplUtils utils = new WordTplUtils();\n        ByteArrayOutputStream wordTemplateOut = new ByteArrayOutputStream();\n        utils.generateWordTemplate(template, wordTemplateOut);\n        try (FileOutputStream fos = new FileOutputStream(\"/Users/chenrui/work/temp/testWordTpl/test.docx\")) {\n            wordTemplateOut.writeTo(fos);\n            fos.flush();\n            //System.out.println(\"Word模版已保存到本地文件。\");\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n\n    }\n\n    /**\n     * 自定义的MultipartFile\n     */\n    private static class CustomMultipartFile implements MultipartFile {\n        private final File file;\n        private final byte[] content;\n        private final String name;\n        private final String originalFilename;\n        private final String contentType;\n\n        // 通过 File 构造\n        public CustomMultipartFile(File file, String name, String contentType) {\n            this.file = file;\n            this.content = null;\n            this.name = name;\n            this.originalFilename = file.getName();\n            this.contentType = contentType;\n        }\n\n        // 通过字节数组构造\n        public CustomMultipartFile(String name, String originalFilename, String contentType, byte[] content) {\n            this.file = null;\n            this.content = content;\n            this.name = name;\n            this.originalFilename = originalFilename;\n            this.contentType = contentType;\n        }\n\n        @Override\n        public String getName() {\n            return name;\n        }\n\n        @Override\n        public String getOriginalFilename() {\n            return originalFilename;\n        }\n\n        @Override\n        public String getContentType() {\n            return contentType;\n        }\n\n        @Override\n        public boolean isEmpty() {\n            if (file != null) {\n                return file.length() == 0;\n            }\n            return content == null || content.length == 0;\n        }\n\n        @Override\n        public long getSize() {\n            if (file != null) {\n                return file.length();\n            }\n            return content == null ? 0 : content.length;\n        }\n\n        @Override\n        public byte[] getBytes() throws IOException {\n            if (file != null) {\n                try (FileInputStream fis = new FileInputStream(file);\n                     ByteArrayOutputStream baos = new ByteArrayOutputStream()) {\n                    byte[] buffer = new byte[4096];\n                    int len;\n                    while ((len = fis.read(buffer)) != -1) {\n                        baos.write(buffer, 0, len);\n                    }\n                    return baos.toByteArray();\n                }\n            }\n            return content;\n        }\n\n        @Override\n        public InputStream getInputStream() throws IOException {\n            if (file != null) {\n                return Files.newInputStream(file.toPath());\n            }\n            return new ByteArrayInputStream(content);\n        }\n\n        @Override\n        public void transferTo(File dest) throws IOException {\n            if (file != null) {\n                try (InputStream in = getInputStream(); OutputStream out = Files.newOutputStream(dest.toPath())) {\n                    byte[] buffer = new byte[1024];\n                    int bytesRead;\n                    while ((bytesRead = in.read(buffer)) != -1) {\n                        out.write(buffer, 0, bytesRead);\n                    }\n                }\n            } else if (content != null) {\n                try (OutputStream out = Files.newOutputStream(dest.toPath())) {\n                    out.write(content);\n                }\n            }\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/wordtpl/utils/WordUtil.java",
    "content": "package org.jeecg.modules.airag.wordtpl.utils;\n\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.deepoove.poi.util.TableTools;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.poi.openxml4j.exceptions.InvalidFormatException;\nimport org.apache.poi.util.Units;\nimport org.apache.poi.xwpf.usermodel.*;\nimport org.apache.xmlbeans.XmlException;\nimport org.apache.xmlbeans.XmlToken;\nimport org.apache.xmlbeans.impl.xb.xmlschema.SpaceAttribute;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.airag.wordtpl.consts.WordTitleEnum;\nimport org.jeecg.modules.airag.wordtpl.dto.MergeColDTO;\nimport org.openxmlformats.schemas.wordprocessingml.x2006.main.*;\n\nimport java.io.*;\nimport java.math.BigInteger;\nimport java.net.URL;\nimport java.net.URLConnection;\nimport java.net.URLEncoder;\nimport java.util.*;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport java.util.stream.Collectors;\n\n/**\n * word工具类\n *\n * @author chenrui\n * @date 2025/7/8 17:22\n */\n@Slf4j\npublic class WordUtil {\n\n\n    /**\n     * 正则表达式:是否是网页\n     */\n    public static final Pattern WEB_PATTERN = Pattern.compile(\"^(http|https)://.*\");\n\n    /**\n     * 添加自定义标题样式\n     *\n     * @param doc\n     * @param strStyleId\n     * @param headingLevel\n     * @author chenrui\n     * @date 2025/7/4 11:08\n     */\n    public static void addCustomHeadingStyle(XWPFDocument doc, String strStyleId, int headingLevel) {\n        // 创建一个新的样式对象，并设置样式ID\n        CTStyle ctStyle = CTStyle.Factory.newInstance();\n        ctStyle.setStyleId(strStyleId);\n\n        // 设置样式名称\n        CTString styleName = CTString.Factory.newInstance();\n        styleName.setVal(strStyleId);\n        ctStyle.setName(styleName);\n\n        // 设置样式优先级，数字越小越突出\n        CTDecimalNumber indentNumber = CTDecimalNumber.Factory.newInstance();\n        indentNumber.setVal(BigInteger.valueOf(headingLevel));\n        ctStyle.setUiPriority(indentNumber);\n\n        // 设置样式在样式栏中可见\n        CTOnOff onoffnull = CTOnOff.Factory.newInstance();\n        ctStyle.setUnhideWhenUsed(onoffnull);\n\n        // [poi5.x]设置段落属性，指定大纲级别（即标题级别）\n        CTPPrGeneral ctpPrGeneral = CTPPrGeneral.Factory.newInstance();\n        ctpPrGeneral.setOutlineLvl(indentNumber);\n        ctStyle.setPPr(ctpPrGeneral);\n\n//        // [poi4.x]设置段落属性，指定大纲级别（即标题级别）\n//        CTPPr ctpPr = CTPPr.Factory.newInstance();\n//        ctpPr.setOutlineLvl(indentNumber);\n//        ctStyle.setPPr(ctpPr);\n\n        // 创建 XWPFStyle 并添加到文档样式集合中\n        XWPFStyle style = new XWPFStyle(ctStyle);\n        XWPFStyles styles = doc.createStyles();\n        style.setType(STStyleType.PARAGRAPH);\n        styles.addStyle(style);\n    }\n\n    /**\n     * 设置纸张大小\n     *\n     * @param document\n     * @param height\n     * @param width\n     * @param pagerDirection\n     * @author chenrui\n     * @date 2025/7/4 11:29\n     */\n    public static void setPaperSize(XWPFDocument document, int height, int width, String pagerDirection) {\n        // 计算纸张实际宽高\n        int pagerWidth = (int) (width * 20 / 1.33445);\n        int pagerHeight = (int) (height * 20 / 1.33445);\n        // 根据纸张方向设置纸张宽高\n        CTBody body = document.getDocument().getBody();\n        CTSectPr sectPr = body.isSetSectPr() ? body.getSectPr() : body.addNewSectPr();\n        CTPageSz pageSize = sectPr.addNewPgSz();\n        if (\"horizontal\".equals(pagerDirection)) {\n            //横版\n            pageSize.setW(BigInteger.valueOf(pagerHeight));\n            pageSize.setH(BigInteger.valueOf(pagerWidth));\n            pageSize.setOrient(STPageOrientation.LANDSCAPE);\n        } else {\n            pageSize.setW(BigInteger.valueOf(pagerWidth));\n            pageSize.setH(BigInteger.valueOf(pagerHeight));\n            pageSize.setOrient(STPageOrientation.PORTRAIT);\n        }\n    }\n\n    /**\n     * 设置页面边距\n     *\n     * @param document\n     * @param margins  单位 mm\n     * @author chenrui\n     * @date 2025/7/4 11:32\n     */\n    public static void setPaperMargins(XWPFDocument document, JSONArray margins) {\n        if (oConvertUtils.isNotEmpty(margins)) {\n            // 获取CTSectPr，如果没有则创建\n            CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();\n            CTPageMar pageMar = sectPr.addNewPgMar();\n\n            // 设置上页边距\n            pageMar.setTop(BigInteger.valueOf((long) (margins.getLongValue(0)*14.4)));\n            // 设置下页边距\n            pageMar.setBottom(BigInteger.valueOf((long) (margins.getLongValue(2)*14.4)));\n            // 设置左页边距\n            pageMar.setLeft(BigInteger.valueOf((long) (margins.getLongValue(3)*14.4)));\n            // 设置右页边距\n            pageMar.setRight(BigInteger.valueOf((long) (margins.getLongValue(1)*14.4)));\n        }\n    }\n\n    public static void addSeparator(XWPFParagraph paragraph, JSONObject content) {\n        JSONArray dashArray = content.getJSONArray(\"dashArray\");\n        CTP ctp = paragraph.getCTP();\n        CTPPr pr = ctp.isSetPPr() ? ctp.getPPr() : ctp.addNewPPr();\n        CTPBdr border = pr.isSetPBdr() ? pr.getPBdr() : pr.addNewPBdr();\n        CTBorder ct = border.isSetBottom() ? border.getBottom() : border.addNewBottom();\n        if (oConvertUtils.isEmpty(dashArray) || dashArray.isEmpty()) {\n            ct.setVal(STBorder.Enum.forInt(3));\n        } else {\n            int value = dashArray.getIntValue(0);\n            switch (value) {\n                case 1:\n                    ct.setVal(STBorder.Enum.forInt(6));\n                    break;\n                case 3:\n                    ct.setVal(STBorder.Enum.forInt(22));\n                    break;\n                case 4:\n                    ct.setVal(STBorder.Enum.forInt(7));\n                    break;\n                case 7:\n                    ct.setVal(STBorder.Enum.forInt(8));\n                    break;\n                case 6:\n                    ct.setVal(STBorder.Enum.forInt(9));\n                    break;\n                default:\n                    ct.setVal(STBorder.Enum.forInt(3));\n                    break;\n            }\n        }\n        ct.setSz(BigInteger.valueOf(4));\n        ct.setSpace(BigInteger.ZERO);\n        ct.setColor(\"auto\");\n    }\n\n    /**\n     * 添加分页符\n     *\n     * @param paragraph\n     * @author chenrui\n     * @date 2025/7/4 15:03\n     */\n    public static void addPageBreak(XWPFParagraph paragraph) {\n        paragraph.createRun().addBreak(BreakType.PAGE);\n    }\n\n//    /**\n//     * 添加页码\n//     * only poi 5.x\n//     * @param doc\n//     * @param startingNum\n//     * @author chenrui\n//     * @date 2025/7/4 15:18\n//     */\n//    private static void addPageNumbers(XWPFDocument doc, int startingNum) {\n//        CTSectPr sectPr = doc.getDocument().getBody().isSetSectPr() ? doc.getDocument().getBody().getSectPr()\n//                : doc.getDocument().getBody().addNewSectPr();\n//        CTPageNumber pgNum = sectPr.isSetPgNumType() ? sectPr.getPgNumType() : sectPr.addNewPgNumType();\n//        pgNum.setStart(BigInteger.valueOf(startingNum));\n//        pgNum.setFmt(STNumberFormat.DECIMAL);\n//    }\n\n    /**\n     * 添加段落\n     *\n     * @param paragraph\n     * @param content\n     * @param titleStyle\n     * @param ignoreStartn\n     * @author chenrui\n     * @date 2025/7/4 14:04\n     */\n    public static void addParagraph(XWPFParagraph paragraph, JSONObject content, String titleStyle, boolean ignoreStartn) {\n        XWPFRun run = paragraph.createRun();\n        setRunText(run, content, \"text\", ignoreStartn);\n        // 对齐方式\n        String rowFlex = content.getString(\"rowFlex\");\n        // 行间距\n        Float rowMargin = content.getFloat(\"rowMargin\");\n        if (oConvertUtils.isNotEmpty(rowFlex)) {\n            switch (rowFlex) {\n                case \"left\":\n                    paragraph.setAlignment(ParagraphAlignment.LEFT);\n                    break;\n                case \"center\":\n                    paragraph.setAlignment(ParagraphAlignment.CENTER);\n                    break;\n                case \"right\":\n                    paragraph.setAlignment(ParagraphAlignment.RIGHT);\n                    break;\n                case \"alignment\":\n                    paragraph.setAlignment(ParagraphAlignment.BOTH);\n                    break;\n                default:\n                    paragraph.setAlignment(ParagraphAlignment.LEFT);\n                    break;\n            }\n        } else {\n            paragraph.setAlignment(ParagraphAlignment.LEFT);\n        }\n        if (rowMargin != null) {\n            setSingleLineSpacing(paragraph, rowMargin);\n        }\n        if (oConvertUtils.isNotEmpty(titleStyle)) {\n            paragraph.setStyle(titleStyle);\n        }\n\n    }\n\n\n    /**\n     * 添加标题段落\n     *\n     * @param paragraph\n     * @param content\n     * @author chenrui\n     * @date 2025/7/4 14:42\n     */\n    public static void addTitleParagraph(XWPFParagraph paragraph, JSONObject content) {\n        String level = content.getString(\"level\");\n        String headStyle = \"\";\n        if (WordTitleEnum.FIRST.getCode().equals(level)) {\n            headStyle = WordTitleEnum.FIRST.getName();\n        } else if (WordTitleEnum.SECOND.getCode().equals(level)) {\n            headStyle = WordTitleEnum.SECOND.getName();\n        } else if (WordTitleEnum.THIRD.getCode().equals(level)) {\n            headStyle = WordTitleEnum.THIRD.getName();\n        } else if (WordTitleEnum.FOURTH.getCode().equals(level)) {\n            headStyle = WordTitleEnum.FOURTH.getName();\n        } else if (WordTitleEnum.FIFTH.getCode().equals(level)) {\n            headStyle = WordTitleEnum.FIFTH.getName();\n        } else if (WordTitleEnum.SIXTH.getCode().equals(level)) {\n            headStyle = WordTitleEnum.SIXTH.getName();\n        }\n        JSONArray valueList = content.getJSONArray(\"valueList\");\n        if (oConvertUtils.isNotEmpty(valueList)) {\n            for (int i = 0; i < valueList.size(); i++) {\n                addParagraph(paragraph, valueList.getJSONObject(i), headStyle, false);\n            }\n        }\n    }\n\n    /**\n     * 添加制表符\n     *\n     * @param paragraph\n     * @param run\n     * @author chenrui\n     * @date 2025/7/4 14:44\n     */\n    public static void addTab(XWPFParagraph paragraph, XWPFRun run) {\n        if (run == null) {\n            run = paragraph.createRun();\n        }\n        run.setText(\"       \");\n        CTText ctText = run.getCTR().getTArray(0);\n        ctText.setSpace(SpaceAttribute.Space.PRESERVE);\n    }\n\n    /**\n     * 添加单独的行间距\n     *\n     * @param paragraph\n     * @param rowMargin\n     * @author chenrui\n     * @date 2025/7/4 14:32\n     */\n    public static void setSingleLineSpacing(XWPFParagraph paragraph, Float rowMargin) {\n        CTP ctp = paragraph.getCTP();\n        CTPPr ppr = ctp.isSetPPr() ? ctp.getPPr() : ctp.addNewPPr();\n        CTSpacing spacing = ppr.isSetSpacing() ? ppr.getSpacing() : ppr.addNewSpacing();\n        spacing.setAfter(BigInteger.valueOf(0));\n        spacing.setBefore(BigInteger.valueOf(0));\n        //注意设置行距类型为 EXACT\n        spacing.setLineRule(STLineSpacingRule.EXACT);\n        //1磅数是20\n        spacing.setLine(BigInteger.valueOf((long) (rowMargin * 350)));\n    }\n\n    /**\n     * 设置Run文本内容\n     *\n     * @param run\n     * @param content\n     * @param type\n     * @param ignoreStartEnter\n     * @author chenrui\n     * @date 2025/7/4 14:33\n     */\n    private static void setRunText(XWPFRun run, JSONObject content, String type, boolean ignoreStartEnter) {\n        //内容\n        String value = content.getString(\"value\");\n        //字体\n        String font = content.getString(\"font\");\n        //字体大小\n        Float fontSize = content.getFloat(\"size\");\n        //是否加粗\n        Boolean bold = content.getBoolean(\"bold\");\n        //字体颜色\n        String color = content.getString(\"color\");\n        //是否斜体\n        Boolean italic = content.getBoolean(\"italic\");\n        //高亮\n        String highlight = content.getString(\"highlight\");\n        //是否下划线\n        Boolean underline = content.getBoolean(\"underline\");\n        //是否删除线\n        Boolean strikeout = content.getBoolean(\"strikeout\");\n        // 忽视第一个换行\n        if (ignoreStartEnter) {\n            if (oConvertUtils.isNotEmpty(value) && value.startsWith(\"\\n\")) {\n                value = value.replaceFirst(\"\\n\", \"\");\n            }\n        }\n        if (value.contains(\"\\n\")) {\n            if (\"\\n\".equals(value)) {\n                //update-begin---author:chenrui ---date:20250714  for：[QQYUN-13104]【word模版】设计器中有空格，导出到word空格没了------------\n                run.addBreak();\n                //update-end---author:chenrui ---date:20250714  for：[QQYUN-13104]【word模版】设计器中有空格，导出到word空格没了------------\n            } else {\n                String[] textes = (value + \" \").split(\"\\n\");\n                for (int i = 0; i < textes.length; i++) {\n                    if (i == textes.length - 1) {\n                        int lastIndex = textes[i].lastIndexOf(\" \");\n                        if (lastIndex != -1) {\n                            textes[i] = textes[i].substring(0, lastIndex);\n                        }\n                    }\n                    run.setText(textes[i]);\n                    if (i != textes.length - 1) {\n                        run.addBreak();\n                    }\n                }\n            }\n\n        } else {\n            run.setText(value);\n        }\n        switch (type) {\n            case \"sup\":\n                run.setSubscript(VerticalAlign.SUPERSCRIPT);\n                break;\n            case \"sub\":\n                run.setSubscript(VerticalAlign.SUBSCRIPT);\n            default:\n                break;\n        }\n\n        if (oConvertUtils.isNotEmpty(font)) {\n            run.setFontFamily(font);\n        } else {\n            run.setFontFamily(\"微软雅黑\");\n        }\n        // 字体大小\n        if (null != fontSize) {\n            // 字体大小转换为twips，1pt = 20 twips, 1px = 1/1.33445 pt\n            run.setFontSize(Math.round(fontSize / 1.33445F));\n        } else {\n            // 默认字体大小\n            run.setFontSize(Math.round(16F / 1.33445F));\n        }\n        if (bold != null) {\n            run.setBold(bold);\n        }\n        if (oConvertUtils.isNotEmpty(color)) {\n            if (color.startsWith(\"#\")) {\n                run.setColor(color.replaceAll(\"#\", \"\"));\n            } else if (color.startsWith(\"rgb\")) {\n                int[] rgbArray = rgbStringToRgb(color);\n                color = rgb2Hex(rgbArray[0], rgbArray[1], rgbArray[2]);\n                run.setColor(color);\n            }\n        }\n        // 斜体\n        if (italic != null) {\n            run.setItalic(italic);\n        }\n        // 高亮\n        if (oConvertUtils.isNotEmpty(highlight)) {\n            run.setTextHighlightColor(getHighlightName(highlight));\n        }\n        // 下划线\n        if (underline != null && underline) {\n            JSONObject textDecoration = content.getJSONObject(\"textDecoration\");\n            if (textDecoration == null || textDecoration.isEmpty()) {\n                run.setUnderline(UnderlinePatterns.SINGLE);\n            } else {\n                String style = textDecoration.getString(\"style\");\n                switch (style) {\n                    case \"solid\":\n                        run.setUnderline(UnderlinePatterns.SINGLE);\n                        break;\n                    case \"double\":\n                        run.setUnderline(UnderlinePatterns.DOUBLE);\n                        break;\n                    case \"dashed\":\n                        run.setUnderline(UnderlinePatterns.DASH);\n                        break;\n                    case \"dotted\":\n                        run.setUnderline(UnderlinePatterns.DOT_DASH);\n                        break;\n                    case \"wavy\":\n                        run.setUnderline(UnderlinePatterns.WAVE);\n                        break;\n                    default:\n                        run.setUnderline(UnderlinePatterns.SINGLE);\n                        break;\n                }\n            }\n        } else {\n            run.setUnderline(UnderlinePatterns.NONE);\n        }\n        if (strikeout != null) {\n            run.setStrikeThrough(strikeout);\n        }\n    }\n\n    /**\n     * 添加上下标\n     *\n     * @param paragraph\n     * @param content\n     * @param type\n     * @author chenrui\n     * @date 2025/7/4 14:49\n     */\n    public static void addSubSupScript(XWPFParagraph paragraph, JSONObject content, String type) {\n        XWPFRun run = paragraph.createRun();\n        setRunText(run, content, type, false);\n    }\n\n    /**\n     * 添加超链接\n     *\n     * @param paragraph\n     * @param content\n     * @author chenrui\n     * @date 2025/7/4 14:50\n     */\n    public static void addHyperlink(XWPFParagraph paragraph, JSONObject content) {\n        JSONArray valueList = content.getJSONArray(\"valueList\");\n        String url = content.getString(\"url\");\n        if (oConvertUtils.isNotEmpty(valueList)) {\n            XWPFRun run = null;\n            for (int i = 0; i < valueList.size(); i++) {\n                JSONObject valueObj = valueList.getJSONObject(i);\n                String value = valueObj.getString(\"value\");\n                url = url.replace(\"\\b\",\"\");\n                run = paragraph.createHyperlinkRun(url);\n                valueObj.put(\"value\", value);\n                setRunText(run, valueObj, \"text\", false);\n            }\n        }\n    }\n\n    /**\n     * 添加列表\n     *\n     * @param document\n     * @param content\n     * @param abstractNumID\n     * @return\n     * @author chenrui\n     * @date 2025/7/4 15:03\n     */\n    public static int addList(XWPFDocument document, JSONObject content, int abstractNumID) {\n        String listStyle = content.getString(\"listStyle\");\n        JSONArray valueList = content.getJSONArray(\"valueList\");\n        if (oConvertUtils.isNotEmpty(valueList)) {\n            BigInteger numID = getNewDecimalNumberingId(document, BigInteger.valueOf(abstractNumID), listStyle);\n            abstractNumID = abstractNumID + 1;\n            XWPFParagraph paragraph = null;\n            XWPFRun run;\n            for (int i = 0; i < valueList.size(); i++) {\n                JSONObject valueObj = valueList.getJSONObject(i);\n                String value = valueObj.getString(\"value\");\n                String type = valueObj.getString(\"type\") == null ? \"\" : valueObj.getString(\"type\");\n                if (\"superscript\".equals(type)) {\n                    type = \"sup\";\n                } else if (\"subscript\".equals(type)) {\n                    type = \"sub\";\n                } else {\n                    type = \"text\";\n                }\n                if (\"\\n\".equals(value)) {\n                    paragraph = document.createParagraph();\n                    paragraph.setNumID(numID);\n                    paragraph.setNumILvl(BigInteger.valueOf(0));\n                    run = paragraph.createRun();\n                    valueObj.put(\"value\", value);\n                    setRunText(run, valueObj, type, false);\n                } else {\n                    String[] values = value.split(\"\\n\");\n                    for (int j = 0; j < values.length; j++) {\n                        if (oConvertUtils.isNotEmpty(values[j])) {\n                            if (paragraph == null) {\n                                paragraph = document.createParagraph();\n                                paragraph.setNumID(numID);\n                                paragraph.setNumILvl(BigInteger.valueOf(0));\n                            } else if (j != 0) {\n                                paragraph = document.createParagraph();\n                                paragraph.setNumID(numID);\n                                paragraph.setNumILvl(BigInteger.valueOf(0));\n                            }\n                            run = paragraph.createRun();\n                            valueObj.put(\"value\", values[j]);\n                            setRunText(run, valueObj, type, false);\n                        }\n                    }\n                }\n\n            }\n        }\n        return abstractNumID;\n    }\n\n    /**\n     * 添加表格列表\n     *\n     * @param document\n     * @param content\n     * @param abstractNumID\n     * @param cell\n     * @return\n     * @author chenrui\n     * @date 2025/7/4 14:52\n     */\n    public static int addCellList(XWPFDocument document, JSONObject content, int abstractNumID, XWPFTableCell cell) {\n        String listStyle = content.getString(\"listStyle\");\n        JSONArray valueList = content.getJSONArray(\"valueList\");\n        if (oConvertUtils.isNotEmpty(valueList)) {\n            BigInteger numID = getNewDecimalNumberingId(document, BigInteger.valueOf(abstractNumID), listStyle);\n            abstractNumID = abstractNumID + 1;\n            XWPFParagraph paragraph;\n            XWPFRun run = null;\n            for (int i = 0; i < valueList.size(); i++) {\n                JSONObject valueObj = valueList.getJSONObject(i);\n                String value = valueObj.getString(\"value\");\n                String type = valueObj.getString(\"type\") == null ? \"\" : valueObj.getString(\"type\");\n                switch (type) {\n                    case \"superscript\":\n                        type = \"sup\";\n                        break;\n                    case \"subscript\":\n                        type = \"sub\";\n                        break;\n                    default:\n                        type = \"text\";\n                        break;\n                }\n                if (\"\\n\".equals(value)) {\n                    if (oConvertUtils.isEmpty(cell.getParagraphs().get(0).getRuns())) {\n                        paragraph = cell.getParagraphs().get(0);\n                    } else {\n                        paragraph = cell.addParagraph();\n                    }\n                    paragraph.setNumID(numID);\n                    paragraph.setNumILvl(BigInteger.valueOf(0));\n                    run = paragraph.createRun();\n                    valueObj.put(\"value\", value);\n                    setRunText(run, valueObj, type, false);\n                } else {\n                    String[] values = value.split(\"\\n\");\n                    for (int j = 0; j < values.length; j++) {\n                        if (oConvertUtils.isNotEmpty(values[j])) {\n                            if (oConvertUtils.isEmpty(cell.getParagraphs().get(0).getRuns())) {\n                                paragraph = cell.getParagraphs().get(0);\n                            } else {\n                                paragraph = cell.addParagraph();\n                            }\n                            paragraph.setNumID(numID);\n                            paragraph.setNumILvl(BigInteger.valueOf(0));\n                            run = paragraph.createRun();\n                            valueObj.put(\"value\", values[j]);\n                            setRunText(run, valueObj, type, false);\n                        }\n                    }\n                }\n\n            }\n        }\n        return abstractNumID;\n    }\n\n    /**\n     * 获取新的编号ID\n     *\n     * @param document\n     * @param abstractNumID\n     * @param listStyle\n     * @return\n     * @author chenrui\n     * @date 2025/7/4 14:51\n     */\n    private static BigInteger getNewDecimalNumberingId(XWPFDocument document, BigInteger abstractNumID, String listStyle) {\n        CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();\n        cTAbstractNum.setAbstractNumId(abstractNumID);\n\n        CTLvl cTLvl = cTAbstractNum.addNewLvl();\n        cTLvl.setIlvl(BigInteger.valueOf(0)); // set indent level 0\n        switch (listStyle) {\n            case \"decimal\":\n                cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL);\n                cTLvl.addNewLvlText().setVal(\"%1.\");\n                break;\n            case \"checkbox\":\n                cTLvl.addNewNumFmt().setVal(STNumberFormat.BULLET);\n                cTLvl.addNewLvlText().setVal(\"■\");\n                break;\n            case \"disc\":\n                cTLvl.addNewNumFmt().setVal(STNumberFormat.BULLET);\n                cTLvl.addNewLvlText().setVal(\"●\");\n                break;\n            case \"circle\":\n                cTLvl.addNewNumFmt().setVal(STNumberFormat.BULLET);\n                cTLvl.addNewLvlText().setVal(\"○\");\n                break;\n            case \"square\":\n                cTLvl.addNewNumFmt().setVal(STNumberFormat.BULLET);\n                cTLvl.addNewLvlText().setVal(\"□\");\n                break;\n            default:\n                break;\n        }\n        cTLvl.addNewStart().setVal(BigInteger.valueOf(1));\n\n        XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);\n\n        XWPFNumbering numbering = document.createNumbering();\n\n        abstractNumID = numbering.addAbstractNum(abstractNum);\n\n        return numbering.addNum(abstractNumID);\n    }\n\n    /**\n     * 添加图片\n     *\n     * @param paragraph\n     * @param content\n     * @author chenrui\n     * @date 2025/7/4 14:53\n     */\n    public static void addImage(XWPFParagraph paragraph, JSONObject content) {\n        InputStream in = null;\n        try {\n            String imageUrl = content.getString(\"value\");\n            Matcher matcher = WEB_PATTERN.matcher(imageUrl);\n            if (matcher.matches()) {\n                // 网络资源,先下载到临时目录\n                log.info(\"[批量下载文件]网络资源,下载到临时目录:\" + imageUrl);\n                try {\n                    String fileName = imageUrl.substring(imageUrl.lastIndexOf(\"/\") + 1);\n                    imageUrl = imageUrl.replace(fileName, URLEncoder.encode(fileName, \"UTF-8\"));\n                    URL url = new URL(imageUrl);\n                    URLConnection conn = url.openConnection();\n                    // 设置超时间为3秒\n                    conn.setConnectTimeout(3 * 1000);\n                    // 防止屏蔽程序\n                    conn.setRequestProperty(\"User-Agent\", \"Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)\");\n                    in = conn.getInputStream();\n                } catch (IOException e) {\n                    log.error(e.getMessage(), e);\n                    throw new JeecgBootException(e);\n                }\n            } else {\n                String uploadPath = SpringContextUtils.getApplicationContext()\n                        .getEnvironment()\n                        .getProperty(\"jeecg.path.upload\", \"\");\n                // 将本地图片读取到 InputStream\n                String filePath = uploadPath + File.separator + imageUrl;\n                in = new FileInputStream(filePath);\n            }\n            XWPFRun run = paragraph.createRun();\n\n            String display = content.getString(\"imgDisplay\");\n\n            if(oConvertUtils.isNotEmpty(display) && display.toLowerCase().startsWith(\"float-\")){\n                // 浮动图片\n                String behindDoc = \"0\";\n                if(!display.equalsIgnoreCase(\"float-bottom\")){\n                    behindDoc = \"1\";\n                }\n\n                int width = content.getIntValue(\"width\");\n                int height = content.getIntValue(\"height\");\n\n                int left =0;\n                int top = 0;\n                if(content.containsKey(\"imgFloatPosition\")){\n                    JSONObject imgFloatPosition = content.getJSONObject(\"imgFloatPosition\");\n                    if(imgFloatPosition.containsKey(\"x\")){\n                        left = imgFloatPosition.getIntValue(\"x\");\n                    }\n                    if(imgFloatPosition.containsKey(\"y\")){\n                        top = imgFloatPosition.getIntValue(\"y\");\n                    }\n                }\n                byte[] imageBytes;\n                try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {\n                    byte[] buffer = new byte[4096];\n                    int len;\n                    while ((len = in.read(buffer)) != -1) {\n                        baos.write(buffer, 0, len);\n                    }\n                    imageBytes = baos.toByteArray();\n                }\n                addFloatingPicture(imageBytes, paragraph.getDocument(), run, width, height, left, top, behindDoc);\n                return;\n            }else{\n                // 内嵌图片\n                run.addPicture(in, Document.PICTURE_TYPE_PNG, \"\",\n                        Units.pixelToEMU(content.getIntValue(\"width\")), Units.pixelToEMU(content.getIntValue(\"height\")));\n            }\n            String rowFlex = content.getString(\"rowFlex\");//对齐方式\n            if (oConvertUtils.isNotEmpty(rowFlex)) {\n                switch (rowFlex) {\n                    case \"left\":\n                        paragraph.setAlignment(ParagraphAlignment.LEFT);\n                        break;\n                    case \"center\":\n                        paragraph.setAlignment(ParagraphAlignment.CENTER);\n                        break;\n                    case \"right\":\n                        paragraph.setAlignment(ParagraphAlignment.RIGHT);\n                        break;\n                    case \"alignment\":\n                        paragraph.setAlignment(ParagraphAlignment.BOTH);\n                        break;\n                    default:\n                        paragraph.setAlignment(ParagraphAlignment.LEFT);\n                        break;\n                }\n            } else {\n                paragraph.setAlignment(ParagraphAlignment.LEFT);\n            }\n        } catch (Exception e) {\n            log.error(\"添加图片异常\", e);\n            throw new RuntimeException(\"添加图片异常: \" + e.getMessage(), e);\n        } finally {\n            if (null != in) {\n                try {\n                    in.close();\n                } catch (Exception e) {\n                    // ignore\n                    log.error(\"关闭图片流异常\", e);\n                }\n            }\n        }\n    }\n\n    /**\n     * 添加图片\n     *\n     * @param imageData 图片流\n     * @param doc   文档对象\n     * @param run   文档运行对象\n     * @param width     宽度 px\n     * @param height    高度 px\n     * @param left      左边距 px\n     * @param top       上边距 px\n     * @param behindDoc 环绕方式 0 处于文字上方 1 处于文字下方\n     * @author chenrui\n     * @date 2025-07-14 15:18\n     */\n    private static void addFloatingPicture(byte[] imageData, XWPFDocument doc, XWPFRun run, int width, int height, int left, int top, String behindDoc) {\n        if(null == imageData){\n            return;\n        }\n        // 生成 anchor XML\n        int widthNum = Units.pixelToEMU(width);\n        int heightNum = Units.pixelToEMU(height);\n        int leftNum = Units.pixelToEMU(left);\n        int topNum = Units.pixelToEMU(top);\n        // 环绕方式 0 处于文字上方 1 处于文字下方\n        behindDoc = oConvertUtils.getString(behindDoc, \"0\");\n        try {\n            // 添加图片数据\n            String blipId = doc.addPictureData(imageData, Document.PICTURE_TYPE_JPEG);\n                /*\n                behindDoc：图片是否在文字之后。1 表示图片在文字后面，0 表示浮在文字上方。\n                locked：是否锁定对象（防止移动/编辑）。0 表示未锁定。\n                layoutInCell：如果插入在表格中，是否允许在单元格内部布局。1 表示允许。\n                allowOverlap：是否允许重叠。1 表示允许。\n                relativeHeight：相对层级高度，影响图像的叠放顺序。越大越靠前。\n                 */\n            String anchorXml =\n                    \"<wp:anchor xmlns:wp=\\\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\\\" \" +\n                            \"behindDoc=\\\"\" + behindDoc + \"\\\" locked=\\\"0\\\" layoutInCell=\\\"1\\\" allowOverlap=\\\"1\\\" relativeHeight=\\\"0\\\">\" +\n                            \"<wp:simplePos x=\\\"0\\\" y=\\\"0\\\"/>\" +\n                            \"<wp:positionH relativeFrom=\\\"page\\\">\" +\n                            \"<wp:posOffset>\" + leftNum + \"</wp:posOffset>\" +\n                            \"</wp:positionH>\" +\n                            \"<wp:positionV relativeFrom=\\\"page\\\">\" +\n                            \"<wp:posOffset>\" + topNum + \"</wp:posOffset>\" +\n                            \"</wp:positionV>\" +\n                            \"<wp:extent cx=\\\"\" + widthNum + \"\\\" cy=\\\"\" + heightNum + \"\\\"/>\" +\n                            \"<wp:effectExtent l=\\\"0\\\" t=\\\"0\\\" r=\\\"9525\\\" b=\\\"9525\\\"/>\" +\n                            \"<wp:wrapNone/>\" +\n                            \"<wp:docPr id=\\\"1\\\" name=\\\"FloatingImage\\\"/>\" +\n                            \"<wp:cNvGraphicFramePr/>\" +\n                            \"<a:graphic xmlns:a=\\\"http://schemas.openxmlformats.org/drawingml/2006/main\\\">\" +\n                            \"<a:graphicData uri=\\\"http://schemas.openxmlformats.org/drawingml/2006/picture\\\">\" +\n                            \"<pic:pic xmlns:pic=\\\"http://schemas.openxmlformats.org/drawingml/2006/picture\\\">\" +\n                            \"<pic:nvPicPr>\" +\n                            \"<pic:cNvPr id=\\\"0\\\" name=\\\"FloatingImage\\\"/>\" +\n                            \"<pic:cNvPicPr/>\" +\n                            \"</pic:nvPicPr>\" +\n                            \"<pic:blipFill>\" +\n                            \"<a:blip r:embed=\\\"\" + blipId + \"\\\" xmlns:r=\\\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\\\"/>\" +\n                            \"<a:stretch><a:fillRect/></a:stretch>\" +\n                            \"</pic:blipFill>\" +\n                            \"<pic:spPr>\" +\n                            \"<a:xfrm>\" +\n                            \"<a:off x=\\\"0\\\" y=\\\"0\\\"/>\" +\n                            \"<a:ext cx=\\\"\" + widthNum + \"\\\" cy=\\\"\" + heightNum + \"\\\"/>\" +\n                            \"</a:xfrm>\" +\n                            \"<a:prstGeom prst=\\\"rect\\\"><a:avLst/></a:prstGeom>\" +\n                            \"</pic:spPr>\" +\n                            \"</pic:pic>\" +\n                            \"</a:graphicData>\" +\n                            \"</a:graphic>\" +\n                            \"</wp:anchor>\";\n            // 注入 anchor 到 drawing\n            XmlToken token = XmlToken.Factory.parse(anchorXml);\n            CTDrawing drawing = run.getCTR().addNewDrawing();\n            drawing.set(token);\n        } catch (InvalidFormatException | XmlException e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n\n    /**\n     * 添加表格\n     *\n     * @param doc\n     * @param tableData\n     * @param abstractNumID\n     * @return\n     * @throws Exception\n     * @author chenrui\n     * @date 2025/7/4 14:49\n     */\n    public static int addTable(XWPFDocument doc, JSONObject tableData, int abstractNumID) {\n        //行数\n        int rows = 1;\n        //列数\n        int cols = 1;\n        JSONArray trList = tableData.getJSONArray(\"trList\");\n        rows = trList.size();\n        JSONArray colgroup = tableData.getJSONArray(\"colgroup\");\n        cols = colgroup.size();\n        String rowFlex = tableData.getString(\"rowFlex\");\n        XWPFTable xwpfTable = doc.createTable(rows, cols);\n        String borderType = tableData.getString(\"borderType\");\n        if (\"empty\".equals(borderType)) {\n            //无边框设置\n            CTTblPr tblPr = xwpfTable.getCTTbl().getTblPr();\n            if (tblPr == null) tblPr = xwpfTable.getCTTbl().addNewTblPr();\n            CTTblBorders tblBorders = tblPr.addNewTblBorders();\n            tblBorders.addNewTop().setVal(STBorder.NONE);\n            tblBorders.addNewLeft().setVal(STBorder.NONE);\n            tblBorders.addNewBottom().setVal(STBorder.NONE);\n            tblBorders.addNewRight().setVal(STBorder.NONE);\n            tblBorders.addNewInsideH().setVal(STBorder.NONE);\n            tblBorders.addNewInsideV().setVal(STBorder.NONE);\n        }\n        if (oConvertUtils.isNotEmpty(rowFlex)) {\n            switch (rowFlex) {\n                case \"left\":\n                    xwpfTable.setTableAlignment(TableRowAlign.LEFT);\n                    break;\n                case \"center\":\n                    xwpfTable.setTableAlignment(TableRowAlign.CENTER);\n                    break;\n                case \"right\":\n                    xwpfTable.setTableAlignment(TableRowAlign.RIGHT);\n                    break;\n                default:\n                    xwpfTable.setTableAlignment(TableRowAlign.LEFT);\n                    break;\n            }\n        }\n        CTTbl ttbl = xwpfTable.getCTTbl();\n        CTTblGrid tblGrid = ttbl.addNewTblGrid();\n\n        setTableWidthFixed(xwpfTable, true);\n        JSONObject mergeObj = new JSONObject();\n        mergeObj.put(\"isMerge\", true);\n        for (int i = 0; i < rows; i++) {\n            JSONArray tdList = trList.getJSONObject(i).getJSONArray(\"tdList\");\n            for (int j = 0; j < tdList.size(); j++) {\n                JSONObject cellInfo = tdList.getJSONObject(j);\n                boolean isMerge = cellInfo.getBooleanValue(\"isMerge\");\n                if (isMerge) {\n                    continue;\n                } else {\n                    int rowspan = cellInfo.getIntValue(\"rowspan\");\n                    int colspan = cellInfo.getIntValue(\"colspan\");\n                    if (rowspan > 1 || colspan > 1) {\n                        for (int k = 0; k < rowspan; k++) {\n                            for (int k2 = 0; k2 < colspan; k2++) {\n                                int r = i + k;\n                                int c = j + k2;\n                                if (r == i) {\n                                    if (k2 != 0) {\n                                        if (c >= tdList.size()) {\n                                            tdList.add(mergeObj);\n                                        } else {\n                                            tdList.add(c, mergeObj);\n                                        }\n                                    }\n                                } else {\n                                    if (c >= trList.getJSONObject(r).getJSONArray(\"tdList\").size()) {\n                                        trList.getJSONObject(r).getJSONArray(\"tdList\").add(mergeObj);\n                                    } else {\n                                        trList.getJSONObject(r).getJSONArray(\"tdList\").add(c, mergeObj);\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        Map<Integer, Boolean> isDynamicRow = new HashMap<>();\n        for (int i = 0; i < trList.size(); i++) {\n            JSONArray tdList = trList.getJSONObject(i).getJSONArray(\"tdList\");\n            for (int j = 0; j < tdList.size(); j++) {\n                JSONObject cellInfo = tdList.getJSONObject(j);\n                boolean isMerge = cellInfo.getBooleanValue(\"isMerge\");\n                if (isMerge) {\n                    continue;\n                } else {\n                    abstractNumID = setCellValue(xwpfTable.getRow(i).getCell(j), cellInfo, doc, abstractNumID);\n                }\n                if (!isDynamicRow.containsKey(i)) {\n                    String plainText = getCellPlainText(cellInfo);\n                    if (oConvertUtils.isNotEmpty(plainText)) {\n                        if ((plainText.contains(\"{{\") && plainText.contains(\"}}\")) || (plainText.contains(\"[\") && plainText.contains(\"]\"))) {\n                            isDynamicRow.put(i, true);\n                        }\n                    }\n                }\n            }\n        }\n        for (int i = 0; i < cols; i++) {\n            CTTblGridCol gridCol = tblGrid.addNewGridCol();\n            gridCol.setW(new BigInteger(String.valueOf(colgroup.getJSONObject(i).getBigDecimal(\"width\").intValue() * 16)));\n            for (int j = 0; j < rows; j++) {\n                xwpfTable.getRow(j).getCell(i).setWidth(String.valueOf(colgroup.getJSONObject(i).getBigDecimal(\"width\").intValue() * 16));\n            }\n        }\n        for (int i = 0; i < rows; i++) {\n            int height = trList.getJSONObject(i).getIntValue(\"height\");\n            if (isDynamicRow.containsKey(i)) {\n                xwpfTable.getRow(i).setHeight(42 * 15);\n                xwpfTable.getRow(i).setHeight(42 * 15);\n            } else {\n                xwpfTable.getRow(i).setHeight(height * 15);\n            }\n        }\n        for (int i = 0; i < trList.size(); i++) {\n            JSONArray tdList = trList.getJSONObject(i).getJSONArray(\"tdList\");\n            for (int j = 0; j < tdList.size(); j++) {\n                JSONObject cellInfo = tdList.getJSONObject(j);\n                boolean isMerge = cellInfo.getBooleanValue(\"isMerge\");\n                if (isMerge) {\n                    continue;\n                }\n                int rowspan = cellInfo.getIntValue(\"rowspan\");\n                int colspan = cellInfo.getIntValue(\"colspan\");\n                if (rowspan > 1) {\n                    for (int k = 0; k < colspan; k++) {\n                        TableTools.mergeCellsVertically(xwpfTable, j + k, i, i + rowspan - 1);\n                    }\n                }\n\n            }\n        }\n        List<MergeColDTO> mergeCellsHorizonal = new ArrayList<MergeColDTO>();\n        for (int i = trList.size() - 1; i >= 0; i--) {\n            JSONArray tdList = trList.getJSONObject(i).getJSONArray(\"tdList\");\n            for (int j = tdList.size() - 1; j >= 0; j--) {\n                JSONObject cellInfo = tdList.getJSONObject(j);\n                boolean isMerge = cellInfo.getBooleanValue(\"isMerge\");\n                if (isMerge) {\n                    continue;\n                }\n                int rowspan = cellInfo.getIntValue(\"rowspan\");\n                int colspan = cellInfo.getIntValue(\"colspan\");\n                if (colspan > 1) {\n                    for (int k = 0; k < rowspan; k++) {\n                        MergeColDTO mergeColDto = new MergeColDTO();\n                        mergeColDto.setRow(i + k);\n                        mergeColDto.setFrom(j);\n                        mergeColDto.setTo(j + colspan - 1);\n                        mergeCellsHorizonal.add(mergeColDto);\n                    }\n                }\n            }\n        }\n        if (oConvertUtils.isNotEmpty(mergeCellsHorizonal)) {\n            Map<Integer, List<MergeColDTO>> groupBy = mergeCellsHorizonal.stream().collect(Collectors.groupingBy(MergeColDTO::getRow));\n            for (List<MergeColDTO> value : groupBy.values()) {\n                value.sort(Comparator.comparing(MergeColDTO::getFrom).reversed());\n                for (MergeColDTO mergeColDTO : value) {\n                    TableTools.mergeCellsHorizonal(xwpfTable, mergeColDTO.getRow(), mergeColDTO.getFrom(), mergeColDTO.getTo());\n                }\n            }\n        }\n        return abstractNumID;\n    }\n\n    /**\n     * 是否允许表格自动重调单元格宽度 对应【表格属性-表格-选项-自动重调尺寸以适应内容】\n     *\n     * @param table\n     * @param isFixed\n     * @author chenrui\n     * @date 2025/7/4 14:48\n     */\n    public static void setTableWidthFixed(XWPFTable table, boolean isFixed) {\n        CTTblPr tblPr = table.getCTTbl().getTblPr();\n        CTTblLayoutType tblLayout = tblPr.isSetTblLayout() ? tblPr.getTblLayout() : tblPr.addNewTblLayout();\n        if (isFixed) {\n            tblLayout.setType(STTblLayoutType.AUTOFIT);\n        }\n    }\n\n    /**\n     * 设置单元格的值\n     *\n     * @param cell\n     * @param cellInfo\n     * @param doc\n     * @param abstractNumID\n     * @return\n     * @author chenrui\n     * @date 2025/7/4 14:49\n     */\n    private static int setCellValue(XWPFTableCell cell, JSONObject cellInfo, XWPFDocument doc, int abstractNumID) {\n        if (cell == null) {\n            return abstractNumID;\n        }\n        String backgroundColor = cellInfo.getString(\"backgroundColor\");\n        if (oConvertUtils.isNotEmpty(backgroundColor)) {\n            cell.setColor(backgroundColor.replaceFirst(\"#\", \"\"));\n        }\n        JSONArray values = cellInfo.getJSONArray(\"value\");\n        String verticalAlign = cellInfo.getString(\"verticalAlign\");\n        if (oConvertUtils.isNotEmpty(values)) {\n            XWPFParagraph paragraph = null;\n            float pRowMargin = 1f;\n            String lastType = \"\";\n            for (int i = 0; i < values.size(); i++) {\n                JSONObject content = values.getJSONObject(i);\n                String type = content.getString(\"type\") == null ? \"\" : content.getString(\"type\");\n                switch (type) {\n                    case \"\":\n                        if (content.getString(\"value\").startsWith(\"\\n\") ||\n                                (!type.equals(lastType) && !\"tab\".equals(lastType)\n                                        && !\"superscript\".equals(lastType)\n                                        && !\"subscript\".equals(lastType)\n                                        && !\"separator\".equals(lastType)\n                                        && !\"hyperlink\".equals(lastType))) {\n                            content.put(\"value\", content.getString(\"value\").replaceFirst(\"\\n\", \"\"));\n                            if (i == 0) {\n                                paragraph = cell.getParagraphs().get(0);\n                            } else {\n                                paragraph = cell.addParagraph();\n                            }\n                        }\n                        if (\"separator\".equals(lastType)) {\n                            String value = content.getString(\"value\");\n                            if (oConvertUtils.isNotEmpty(value) && value.startsWith(\"\\n\")) {\n                                content.put(\"value\", value.replaceFirst(\"\\n\", \"\"));\n                            }\n                        }\n                        if (paragraph == null) {\n                            if (i == 0) {\n                                paragraph = cell.getParagraphs().get(0);\n                            } else {\n                                paragraph = cell.addParagraph();\n                            }\n                        }\n                        WordUtil.addParagraph(paragraph, content, null, false);\n                        break;\n                    case \"superscript\":\n                        if (paragraph == null) {\n                            if (i == 0) {\n                                paragraph = cell.getParagraphs().get(0);\n                            } else {\n                                paragraph = cell.addParagraph();\n                            }\n                        }\n                        WordUtil.addSubSupScript(paragraph, content, \"sup\");\n                        break;\n                    case \"subscript\":\n                        if (paragraph == null) {\n                            if (i == 0) {\n                                paragraph = cell.getParagraphs().get(0);\n                            } else {\n                                paragraph = cell.addParagraph();\n                            }\n                        }\n                        WordUtil.addSubSupScript(paragraph, content, \"sub\");\n                        break;\n                    case \"hyperlink\":\n                        if (paragraph == null) {\n                            if (i == 0) {\n                                paragraph = cell.getParagraphs().get(0);\n                            } else {\n                                paragraph = cell.addParagraph();\n                            }\n                        }\n                        WordUtil.addHyperlink(paragraph, content);\n                        break;\n                    case \"list\":\n                        abstractNumID = WordUtil.addCellList(doc, content, abstractNumID, cell);\n                        break;\n                    case \"image\":\n                        if (paragraph == null) {\n                            if (i == 0) {\n                                paragraph = cell.getParagraphs().get(0);\n                            } else {\n                                paragraph = cell.addParagraph();\n                            }\n                        }\n                        WordUtil.addImage(paragraph, content);\n                        break;\n                    default:\n                        break;\n                }\n                lastType = type;\n            }\n            if (paragraph != null) {\n                paragraph.setSpacingBetween(pRowMargin, LineSpacingRule.AUTO);\n            }\n            if (oConvertUtils.isNotEmpty(verticalAlign)) {\n                switch (verticalAlign) {\n                    case \"top\":\n                        cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.TOP);\n                        break;\n                    case \"middle\":\n                        cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);\n                        break;\n                    case \"bottom\":\n                        cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.BOTTOM);\n                        break;\n                    default:\n                        break;\n                }\n            }\n        }\n        return abstractNumID;\n    }\n\n    /**\n     * 获取单元格的纯文本内容\n     *\n     * @param cellInfo\n     * @return\n     * @author chenrui\n     * @date 2025/7/4 14:55\n     */\n    public static String getCellPlainText(JSONObject cellInfo) {\n        StringBuilder sb = new StringBuilder();\n        JSONArray values = cellInfo.getJSONArray(\"value\");\n        if (oConvertUtils.isNotEmpty(values)) {\n            for (int i = 0; i < values.size(); i++) {\n                JSONObject content = values.getJSONObject(i);\n                String value = content.getString(\"value\");//内容\n                sb.append(value);\n            }\n        }\n        return sb.toString();\n    }\n\n    /**\n     * 将rgb字符串转换成rgb数组\n     *\n     * @param rgb\n     * @return\n     * @author chenrui\n     * @date 2025/7/4 14:28\n     */\n    public static int[] rgbStringToRgb(String rgb) {\n        int[] color = new int[3];\n        rgb = rgb.replace(\"rgb\", \"\");\n        rgb = rgb.replace(\"(\", \"\").replace(\")\", \"\").replaceAll(\" \", \"\");\n        String[] colors = rgb.split(\",\");\n        //update-begin---author:chenrui ---date:20250813  for：[QQYUN-13384]word设计器，导出word失败------------\n        // 只取前三个分量，忽略 alpha\n        for (int i = 0; i < 3 && i < colors.length; i++) {\n            color[i] = Integer.parseInt(colors[i].replaceAll(\"[^0-9]\", \"\"));\n        }\n        //update-end---author:chenrui ---date:20250813  for：[QQYUN-13384]word设计器，导出word失败------------\n        return color;\n    }\n\n    /**\n     * 将RGB颜色值转换为十六进制字符串\n     *\n     * @param r\n     * @param g\n     * @param b\n     * @return\n     * @author chenrui\n     * @date 2025/7/4 14:29\n     */\n    public static String rgb2Hex(int r, int g, int b) {\n        return String.format(\"%02x%02x%02x\", r, g, b);\n    }\n\n    /**\n     * @param color\n     * @return\n     * @date 2020年4月7日 下午7:16:39\n     */\n    private static String getHighlightName(String color) {\n        color = color.replaceAll(\"\\\\s+\", \"\");\n        if (\"#FFFF00\".equals(color)) {\n            return \"yellow\";//1-黄色\n        } else if (\"#00FF00\".equals(color)) {\n            return \"green\";//2-绿色\n        } else if (\"#00FFFF\".equals(color)) {\n            return \"cyan\";//3-青色\n        } else if (\"#FF00FF\".equals(color)) {\n            return \"magenta\";//4-粉红色\n        } else if (\"#0000FF\".equals(color)) {\n            return \"blue\";//5-蓝色\n        } else if (\"#FF0000\".equals(color)) {\n            return \"red\";//6-红色\n        } else if (\"#000080\".equals(color)) {\n            return \"darkBlue\";//7-深蓝色\n        } else if (\"#008080\".equals(color)) {\n            return \"darkCyan\";//8-深青色\n        } else if (\"#008000\".equals(color)) {\n            return \"darkGreen\";//9-深绿色\n        } else if (\"#800080\".equals(color)) {\n            return \"darkMagenta\";//10-深粉红色，紫色\n        } else if (\"#800000\".equals(color)) {\n            return \"darkRed\";//11-深红色\n        } else if (\"#808000\".equals(color)) {\n            return \"darkYellow\";//12-深黄色\n        } else if (\"#808080\".equals(color)) {\n            return \"darkGray\";//13-深灰色\n        } else if (\"#C0C0C0\".equals(color)) {\n            return \"lightGray\";//14-浅灰色\n        } else if (\"#000000\".equals(color)) {\n            return \"black\";//15-黑色\n        } else {\n            return \"none\";//无色\n        }\n    }\n\n    public static String getHighlightByName(String name) {\n        if (\"yellow\".equals(name)) {\n            return \"#FFFF00\";//1-黄色\n        } else if (\"green\".equals(name)) {\n            return \"#00FF00\";//2-绿色\n        } else if (\"cyan\".equals(name)) {\n            return \"#00FFFF\";//3-青色\n        } else if (\"magenta\".equals(name)) {\n            return \"#FF00FF\";//4-粉红色\n        } else if (\"blue\".equals(name)) {\n            return \"#0000FF\";//5-蓝色\n        } else if (\"red\".equals(name)) {\n            return \"#FF0000\";//6-红色\n        } else if (\"darkBlue\".equals(name)) {\n            return \"#000080\";//7-深蓝色\n        } else if (\"darkCyan\".equals(name)) {\n            return \"#008080\";//8-深青色\n        } else if (\"darkGreen\".equals(name)) {\n            return \"#008000\";//9-深绿色\n        } else if (\"darkMagenta\".equals(name)) {\n            return \"#800080\";//10-深粉红色，紫色\n        } else if (\"#800000\".equals(name)) {\n            return \"darkRed\";//11-深红色\n        } else if (\"darkYellow\".equals(name)) {\n            return \"#808000\";//12-深黄色\n        } else if (\"darkGray\".equals(name)) {\n            return \"#808080\";//13-深灰色\n        } else if (\"lightGray\".equals(name)) {\n            return \"#C0C0C0\";//14-浅灰色\n        } else if (\"black\".equals(name)) {\n            return \"#000000\";//15-黑色\n        } else {\n            return \"\";//无色\n        }\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/resources/application.yml",
    "content": "server:\n  port: 7008\nspring:\n  jackson:\n    date-format: yyyy-MM-dd HH:mm:ss\n    time-zone: GMT+8\n  autoconfigure:\n    exclude:\n      - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\n  datasource:\n    druid:\n      stat-view-servlet:\n        enabled: true\n        loginUsername: admin\n        loginPassword: 123456\n        allow:\n      web-stat-filter:\n        enabled: true\n    dynamic:\n      druid: # 全局druid参数，绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n        # 连接池的配置信息\n        # 初始化大小，最小，最大\n        initial-size: 5\n        min-idle: 5\n        maxActive: 1000\n        # 配置获取连接等待超时的时间\n        maxWait: 60000\n        # 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒\n        timeBetweenEvictionRunsMillis: 60000\n        # 配置一个连接在池中最小生存的时间，单位是毫秒\n        minEvictableIdleTimeMillis: 300000\n        #        validationQuery: SELECT 1\n        testWhileIdle: true\n        testOnBorrow: false\n        testOnReturn: false\n        # 打开PSCache，并且指定每个连接上PSCache的大小\n        poolPreparedStatements: true\n        maxPoolPreparedStatementPerConnectionSize: 20\n        # 配置监控统计拦截的filters，去掉后监控界面sql无法统计，'wall'用于防火墙\n        # !!!!!mysql\n        #        filters: stat,slf4j,wall\n        # !!!!!DM\n        filters: stat,slf4j\n        # 允许SELECT语句的WHERE子句是一个永真条件\n        #        wall:\n        #          selectWhereAlwayTrueCheck: false\n        # 打开mergeSql功能；慢SQL记录\n        stat:\n          merge-sql: true\n          slow-sql-millis: 5000\n      datasource:\n        master:\n          ## !!!!!MYSQL\n          url: jdbc:mysql://localhost:3306/jeecg-boot-dev?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n          username: root\n          password: 123456\n          driver-class-name: com.mysql.cj.jdbc.Driver\n  redis:\n    database: 0\n    host: 192.168.1.188\n    port: 6379\n    password: 'res983'\njeecg:\n  ai-rag:\n    embed-store:\n      host: \"localhost\"\n      port: 15432\n      database: \"postgres\"\n      user: \"postgres\"\n      password: \"123456\"\n      table: \"embeddings\"\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/test/java/org/jeecg/modules/airag/test/TestFileParse.java",
    "content": "//package org.jeecg.modules.airag.test;\n//\n//import dev.langchain4j.data.document.Document;\n//import lombok.extern.slf4j.Slf4j;\n//import org.apache.tika.parser.AutoDetectParser;\n//import org.jeecg.common.util.oConvertUtils;\n//import org.jeecg.modules.airag.llm.document.TikaDocumentParser;\n//import org.junit.jupiter.api.Test;\n//import org.springframework.core.io.ClassPathResource;\n//import org.wildfly.common.Assert;\n//\n//import java.io.File;\n//import java.io.IOException;\n//\n///**\n// * @Description: 文件解析测试\n// * @Author: chenrui\n// * @Date: 2025/2/11 16:11\n// */\n//@Slf4j\n//public class TestFileParse {\n//\n//    @Test\n//    public void testParseTxt() {\n//        readFile(\"test.txt\");\n//    }\n//\n//    @Test\n//    public void testParsePdf() {\n//        readFile(\"test.pdf\");\n//    }\n//\n//    @Test\n//    public void testParseMd() {\n//        readFile(\"test.md\");\n//    }\n//\n//    @Test\n//    public void testParseDoc() {\n//        readFile(\"test.docx\");\n//    }\n//\n//    @Test\n//    public void testParseDoc2003() {\n//        readFile(\"test.doc\");\n//    }\n//\n//    @Test\n//    public void testParseExcel() {\n//        readFile(\"test.xlsx\");\n//    }\n//\n//    @Test\n//    public void testParseExcel2003() {\n//        readFile(\"test.xls\");\n//    }\n//\n//    @Test\n//    public void testParsePPT() {\n//        readFile(\"test.pptx\");\n//    }\n//    @Test\n//    public void testParsePPT2003() {\n//        readFile(\"test.ppt\");\n//    }\n//\n//    private static void readFile(String filePath) {\n//        try {\n//            ClassPathResource resource = new ClassPathResource(filePath);\n//            File file = resource.getFile();\n//            TikaDocumentParser parser = new TikaDocumentParser(AutoDetectParser::new, null, null, null);\n//            Document document = parser.parse(file);\n//            Assert.assertNotNull(document);\n//            System.out.println(filePath + \"----\" + document.text());\n//            Assert.assertTrue(oConvertUtils.isNotEmpty(document));\n//        } catch (IOException e) {\n//            throw new RuntimeException(e);\n//        }\n//    }\n//\n//\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/test/java/org/jeecg/modules/airag/test/TestFlows.java",
    "content": "//package org.jeecg.modules.airag.test;\n//\n//import lombok.extern.slf4j.Slf4j;\n//import okhttp3.OkHttpClient;\n//import okhttp3.Request;\n//import okhttp3.Response;\n//import org.junit.jupiter.api.Test;\n//\n//import java.io.IOException;\n//\n///**\n// * @Description: 流程测试\n// * @Author: chenrui\n// * @Date: 2025/2/11 16:11\n// */\n//@Slf4j\n//public class TestFlows {\n//\n//    @Test\n//    public void testRunFlow(){\n//        String id = \"1889499701976358913\";\n////        String id = \"1889571074002247682\"; //switch\n////        String id = \"1889608218175463425\"; //脚本\n//        String token = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3Mzk1NDY0NDIsInVzZXJuYW1lIjoiamVlY2cifQ.CFIV79PUYmOAiqBKT3yjwihHWwf954DvS-4oKERmJVU\";\n//        String request = request(id,token);\n//        System.out.println(request);\n//    }\n//\n//    private String request(String id,String token) {\n//\n//        OkHttpClient client = new OkHttpClient();\n//\n//        Request request = new Request.Builder()\n//                .url(\"http://localhost:7008/airag/airagFlow/flow/run/\" + id + \"?field1=%25E5%2593%2588%25E5%2593%2588&field2=%25E4%25B8%25AD%25E5%259B%25BD\")\n//                .get()\n//                .addHeader(\"X-Access-Token\", token)\n//                .addHeader(\"Accept\", \"*/*\")\n//                .addHeader(\"Accept-Encoding\", \"gzip, deflate, br\")\n//                .addHeader(\"User-Agent\", \"PostmanRuntime-ApipostRuntime/1.1.0\")\n//                .addHeader(\"Connection\", \"keep-alive\")\n//                .addHeader(\"Cookie\", \"JSESSIONID=442C48D3D1D0B2878A597AB6EBF2A07E\")\n//                .build();\n//\n//        try {\n//            Response response = client.newCall(request).execute();\n//            return response.body().string();\n//        } catch (IOException e) {\n//            throw new RuntimeException(e);\n//        }\n//    }\n//\n//    // TODO author: chenrui for:完善用例,使用java方式调用 date:2025/2/14\n//\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/test/java/org/jeecg/modules/airag/test/TestLLM.java",
    "content": "//package org.jeecg.modules.airag.test;\n//\n//import dev.langchain4j.agent.tool.ToolParameters;\n//import dev.langchain4j.agent.tool.ToolSpecification;\n//import dev.langchain4j.data.message.*;\n//import dev.langchain4j.model.chat.ChatLanguageModel;\n//import dev.langchain4j.model.chat.request.json.JsonObjectSchema;\n//import dev.langchain4j.model.openai.OpenAiChatModel;\n//import dev.langchain4j.model.output.Response;\n//import dev.langchain4j.service.AiServices;\n//import dev.langchain4j.service.TokenStream;\n//import lombok.extern.slf4j.Slf4j;\n//import org.jeecg.ai.assistant.AiChatAssistant;\n//import org.jeecg.ai.factory.AiModelFactory;\n//import org.jeecg.ai.factory.AiModelOptions;\n//import org.jeecg.ai.handler.AIParams;\n//import org.jeecg.ai.handler.LLMHandler;\n//import org.junit.jupiter.api.Test;\n//\n//import java.io.IOException;\n//import java.io.Serial;\n//import java.nio.file.Files;\n//import java.nio.file.Paths;\n//import java.util.*;\n//import java.util.concurrent.ConcurrentHashMap;\n//import java.util.concurrent.CountDownLatch;\n//\n///**\n// * @Description: 流程测试\n// * @Author: chenrui\n// * @Date: 2025/2/11 16:11\n// */\n//@Slf4j\n//public class TestLLM {\n//\n//    @Test\n//    public void sendByModel() {\n//        String apiKey = \"sk-xxx\";\n//        String baseUrl = \"https://api.v3.cm/v1\";\n//        String modelName = \"gpt-3.5-turbo\";\n//        double temperature = 0.7;\n//        ChatLanguageModel llmModel = OpenAiChatModel.builder()\n//                .apiKey(apiKey)\n//                .baseUrl(baseUrl)\n//                .modelName(modelName)\n//                .temperature(temperature)\n//                .build();\n//        String hello = llmModel.generate(\"hello\");\n//        System.out.println(hello);\n//    }\n//\n//    @Test\n//    public void testChat() {\n//        AiModelOptions options = AiModelOptions.builder()\n//                .provider(AiModelFactory.AIMODEL_TYPE_OPENAI)\n//                .apiKey(\"sk-xxx\")\n//                .baseUrl(\"https://api.v3.cm/v1\")\n//                .build();\n//        ChatLanguageModel chatModel = AiModelFactory.createChatModel(options);\n//        AiServices<AiChatAssistant> chatAssistantBuilder = AiServices.builder(AiChatAssistant.class);\n//        chatAssistantBuilder.chatLanguageModel(chatModel);\n//        AiChatAssistant chatAssistant = chatAssistantBuilder.build();\n//        String str = chatAssistant.chat(\"hello\");\n//        System.out.println(str);\n//    }\n//\n//    @Test\n//    public void sendImg() throws IOException {\n//        AiModelOptions options = AiModelOptions.builder()\n//                .provider(AiModelFactory.AIMODEL_TYPE_OPENAI)\n//                .modelName(\"gpt-4o-mini\")\n//                .apiKey(\"sk-xxx\")\n//                .baseUrl(\"https://api.v3.cm/v1\")\n//                .build();\n//        ChatLanguageModel chatModel = AiModelFactory.createChatModel(options);\n//\n//        // 读取文件并转换为 base64 编码字符串\n//        byte[] fileContent = Files.readAllBytes(Paths.get(\"src/test/resources/test.jpg\"));\n//        String base64Data = Base64.getEncoder().encodeToString(fileContent);\n//\n//        // 获取文件的 MIME 类型\n//        String mimeType = Files.probeContentType(Paths.get(\"src/test/resources/test.jpg\"));\n//\n//        // 构建 ImageContent 对象\n//        ImageContent imageContent = new ImageContent(base64Data, mimeType);\n//\n//        UserMessage userMessage = UserMessage.from(\n//                TextContent.from(\"你看到了什么\"),\n//                // 构建 ImageContent 对象\n//                new ImageContent(base64Data, mimeType)\n//        );\n//        Response<AiMessage> generate = chatModel.generate(userMessage);\n//        System.out.println(generate.content());\n//    }\n//\n//    @Test\n//    public void testSendImsWithLLMHandler() throws IOException {\n//        AiModelOptions options = AiModelOptions.builder()\n//                .provider(AiModelFactory.AIMODEL_TYPE_OPENAI)\n//                .modelName(\"gpt-4o-mini\")\n//                .apiKey(\"sk-xxx\")\n//                .baseUrl(\"https://api.v3.cm/v1\")\n//                .build();\n//        ChatLanguageModel chatModel = AiModelFactory.createChatModel(options);\n//\n//        // 读取文件并转换为 base64 编码字符串\n//        byte[] fileContent = Files.readAllBytes(Paths.get(\"src/test/resources/test.jpg\"));\n//        String base64Data = Base64.getEncoder().encodeToString(fileContent);\n//\n//        // 获取文件的 MIME 类型\n//        String mimeType = Files.probeContentType(Paths.get(\"src/test/resources/test.jpg\"));\n//\n//        // 构建 ImageContent 对象\n//        ImageContent imageContent = new ImageContent(base64Data, mimeType);\n//\n//        UserMessage userMessage = UserMessage.from(\n//                TextContent.from(\"你看到了什么\"),\n//                // 构建 ImageContent 对象\n//                new ImageContent(base64Data, mimeType)\n//        );\n//        LLMHandler llmHandler = new LLMHandler();\n//        AIParams aiParams = new AIParams();\n//        aiParams.setProvider(AiModelFactory.AIMODEL_TYPE_OPENAI);\n//        aiParams.setModelName(\"gpt-4o-mini\");\n//        aiParams.setApiKey(\"sk-xxx\");\n//        aiParams.setBaseUrl(\"https://api.v3.cm/v1\");\n//        String completions = llmHandler.completions(Collections.singletonList(userMessage), aiParams);\n//        System.out.println(completions);\n//    }\n//\n//    @Test\n//    public void testChatImsWithLLMHandler() throws IOException, InterruptedException {\n//        AiModelOptions options = AiModelOptions.builder()\n//                .provider(AiModelFactory.AIMODEL_TYPE_OPENAI)\n//                .modelName(\"gpt-4o-mini\")\n//                .apiKey(\"sk-xxx\")\n//                .baseUrl(\"https://api.v3.cm/v1\")\n//                .build();\n//        ChatLanguageModel chatModel = AiModelFactory.createChatModel(options);\n//\n//        // 读取文件并转换为 base64 编码字符串\n//        byte[] fileContent = Files.readAllBytes(Paths.get(\"src/test/resources/test.jpg\"));\n//        String base64Data = Base64.getEncoder().encodeToString(fileContent);\n//\n//        // 获取文件的 MIME 类型\n//        String mimeType = Files.probeContentType(Paths.get(\"src/test/resources/test.jpg\"));\n//\n//        // 构建 ImageContent 对象\n//        ImageContent imageContent = new ImageContent(base64Data, mimeType);\n//        UserMessage userMessage = UserMessage.from(\n//                TextContent.from(\"你看到了什么\"),\n//                // 构建 ImageContent 对象\n//                imageContent,\n//                ImageContent.from(\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/logo-qqy_1741658353407.png\")\n//        );\n//        LLMHandler llmHandler = new LLMHandler();\n//        AIParams aiParams = new AIParams();\n//        aiParams.setProvider(AiModelFactory.AIMODEL_TYPE_OPENAI);\n//        aiParams.setModelName(\"gpt-4o-mini\");\n//        aiParams.setApiKey(\"sk-xxx\");\n//        aiParams.setBaseUrl(\"https://api.v3.cm/v1\");\n//        TokenStream chat = llmHandler.chat(Collections.singletonList(userMessage), aiParams);\n//        CountDownLatch countDownLatch = new CountDownLatch(1);\n//        chat.onNext(s -> System.out.println(s))\n//                .onComplete(s -> {\n//                    System.out.println(s);\n//                    countDownLatch.countDown();\n//                })\n//                .onError(e -> {\n//                    System.out.println(e.getMessage());\n//                    countDownLatch.countDown();\n//                }).start();\n//        countDownLatch.await();\n//\n//    }\n//\n//\n//    @Test\n//    public void testFuncCalling() {\n//        String apiKey = \"sk-\";\n//        String baseUrl = \"https://api.v3.cm/v1\";\n//        String modelName = \"gpt-4o-mini\";\n//        double temperature = 0.7;\n//        ChatLanguageModel llmModel = OpenAiChatModel.builder()\n//                .apiKey(apiKey)\n//                .baseUrl(baseUrl)\n//                .modelName(modelName)\n//                .temperature(temperature)\n//                .build();\n//\n//        List<ToolSpecification> toolSpecifications = new ArrayList<>();\n//        Map<String, Map<String, Object>> properties = new ConcurrentHashMap<>();\n//\n//        properties.put(\"location\", new HashMap<>() {\n//            @Serial\n//            private static final long serialVersionUID = -8440944665582258534L;\n//            {\n//                put(\"type\", \"string\");\n//                put(\"description\", \"The city and state, e.g. San Francisco, CA\");\n//            }\n//        });\n//        ToolSpecification toolSpecification = ToolSpecification.builder()\n//                .name(\"get_current_weather\")\n//                .description(\"Get the current weather in a given location\")\n//                .parameters(ToolParameters.builder()\n//                        .properties(properties)\n//                        .required(List.of(\"location\"))\n//                        .type(\"string\")\n//                        .build())\n//                .build();\n//        toolSpecifications.add(toolSpecification);\n//\n//        List<ChatMessage> messages = new  ArrayList<>();\n//        messages.add(UserMessage.from(\"How is the weather in Beijing today?\"));\n//\n//        Response<AiMessage> resp = llmModel.generate(messages, toolSpecifications);\n//        System.out.println(resp);\n//\n//        /*Response { content = AiMessage { text = null\n//        toolExecutionRequests = [ToolExecutionRequest { id = \"call_hjPaRh9WAHv6Ib7KpgHpp8Tl\", name = \"get_current_weather\", arguments = \"{\"location\":\"Beijing, China\"}\" }] },\n//        tokenUsage = TokenUsage { inputTokenCount = 69, outputTokenCount = 19, totalTokenCount = 88 }, finishReason = TOOL_EXECUTION, metadata = {} }*/\n//    }\n//\n//\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/test/java/org/jeecg/modules/airag/test/TestVector.java",
    "content": "//package org.jeecg.modules.airag.test;\n//\n//import dev.langchain4j.data.document.Document;\n//import dev.langchain4j.data.document.DocumentSplitter;\n//import dev.langchain4j.data.document.Metadata;\n//import dev.langchain4j.data.document.splitter.DocumentSplitters;\n//import dev.langchain4j.data.embedding.Embedding;\n//import dev.langchain4j.data.segment.TextSegment;\n//import dev.langchain4j.memory.ChatMemory;\n//import dev.langchain4j.memory.chat.MessageWindowChatMemory;\n//import dev.langchain4j.model.chat.ChatLanguageModel;\n//import dev.langchain4j.model.embedding.EmbeddingModel;\n//import dev.langchain4j.model.input.PromptTemplate;\n//import dev.langchain4j.model.openai.OpenAiTokenizer;\n//import dev.langchain4j.rag.DefaultRetrievalAugmentor;\n//import dev.langchain4j.rag.RetrievalAugmentor;\n//import dev.langchain4j.rag.content.injector.DefaultContentInjector;\n//import dev.langchain4j.rag.content.retriever.ContentRetriever;\n//import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;\n//import dev.langchain4j.rag.query.router.DefaultQueryRouter;\n//import dev.langchain4j.rag.query.router.QueryRouter;\n//import dev.langchain4j.service.AiServices;\n//import dev.langchain4j.store.embedding.EmbeddingMatch;\n//import dev.langchain4j.store.embedding.EmbeddingSearchRequest;\n//import dev.langchain4j.store.embedding.EmbeddingStore;\n//import dev.langchain4j.store.embedding.EmbeddingStoreIngestor;\n//import dev.langchain4j.store.embedding.pgvector.PgVectorEmbeddingStore;\n//import lombok.extern.slf4j.Slf4j;\n//import org.jeecg.ai.assistant.AiChatAssistant;\n//import org.jeecg.ai.factory.AiModelFactory;\n//import org.jeecg.ai.factory.AiModelOptions;\n//import org.junit.Before;\n//import org.junit.Test;\n//\n//import java.util.List;\n//\n//import static dev.langchain4j.store.embedding.filter.MetadataFilterBuilder.metadataKey;\n//\n///**\n// * @Description: 流程测试\n// * @Author: chenrui\n// * @Date: 2025/2/11 16:11\n// */\n//@Slf4j\n//public class TestVector {\n//\n//    String openAIBaseUrl = \"https://api.v3.cm/v1\";\n//    String openAIApiKey = \"sk-xxx\";\n//\n//    EmbeddingModel embeddingModel;\n//    EmbeddingStore<TextSegment> embeddingStore;\n//\n//    @Before\n//    public void before() {\n//        AiModelOptions.AiModelOptionsBuilder modelOpBuilder = AiModelOptions.builder().provider(AiModelFactory.AIMODEL_TYPE_OPENAI)\n//                .baseUrl(openAIBaseUrl).apiKey(openAIApiKey);\n//        embeddingModel = AiModelFactory.createEmbeddingModel(modelOpBuilder.build());\n//        embeddingStore = PgVectorEmbeddingStore.builder()\n//                // Connection and table parameters\n//                .host(\"localhost\")\n//                .port(15432)\n//                .database(\"postgres\")\n//                .user(\"postgres\")\n//                .password(\"123456\")\n//                .table(\"test_embeddings\")\n//                // Embedding dimension\n//                .dimension(embeddingModel.dimension())      // Required: Must match the embedding model’s output dimension\n//                // Indexing and performance options\n//                .useIndex(true)                             // Enable IVFFlat index\n//                .indexListSize(100)                         // Number of lists for IVFFlat index\n//                // Table creation options\n//                .createTable(true)                          // Automatically create the table if it doesn’t exist\n//                .dropTableFirst(false)                      // Don’t drop the table first (set to true if you want a fresh start)\n//                .build();\n//    }\n//\n//    @Test\n//    public void testSave2Vector() {\n//        embeddingStore.removeAll(metadataKey(\"id\").isEqualTo(\"sdfsdf\"));\n//        DocumentSplitter splitter = DocumentSplitters.recursive(200,\n//                50,\n//                new OpenAiTokenizer());\n//        EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder()\n//                .documentSplitter(splitter)\n//                .embeddingModel(embeddingModel)\n//                .embeddingStore(embeddingStore)\n//                .build();\n//        Document from = Document.from(doc, Metadata.metadata(\"id\", \"sdfsdf\"));\n//        ingestor.ingest(from);\n//    }\n//\n//    @Test\n//    public void testQueryByVector() {\n//        Embedding queryEmbedding = embeddingModel.embed(\"全日制工作与非全日制工作有什么区别?\").content();\n//        EmbeddingSearchRequest embeddingSearchRequest = EmbeddingSearchRequest.builder()\n//                .queryEmbedding(queryEmbedding)\n//                .maxResults(5)\n//                .filter(metadataKey(\"id\").isEqualTo(\"sdfsdf\"))\n//                .build();\n//\n//        List<EmbeddingMatch<TextSegment>> relevant = embeddingStore.search(embeddingSearchRequest).matches();\n//        for (int i = 0; i < relevant.size(); i++) {\n//            EmbeddingMatch<TextSegment> embeddingMatch = relevant.get(i);\n//            System.out.println(\"结果:\" + i + \"=================================================\");\n//            System.out.println(\"分数:\" + embeddingMatch.score()); // 0.8144288608390052\n//            System.out.println(\"内容:\" + embeddingMatch.embedded().text()); // I like football.\n//        }\n//    }\n//\n//\n//    @Test\n//    public void testQueryByRAG() {\n//        ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder()\n//                .embeddingStore(embeddingStore)\n//                .embeddingModel(embeddingModel)\n//                .maxResults(5)\n//                // maxResults can also be specified dynamically depending on the query\n////                .dynamicMaxResults(query -> 3)\n//                .minScore(0.75)\n//                // minScore can also be specified dynamically depending on the query\n////                .dynamicMinScore(query -> 0.75)\n//                .filter(metadataKey(\"id\").isEqualTo(\"sdfsdf\"))\n//                // filter can also be specified dynamically depending on the query\n////                .dynamicFilter(query -> {\n////                    String userId = getUserId(query.metadata().chatMemoryId());\n////                    return metadataKey(\"userId\").isEqualTo(userId);\n////                })\n//                .build();\n//\n//        ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);\n//        ChatLanguageModel chatModel = AiModelFactory.createChatModel(AiModelOptions.builder()\n//                .baseUrl(openAIBaseUrl).apiKey(openAIApiKey).provider(AiModelFactory.AIMODEL_TYPE_OPENAI).build());\n//\n//        QueryRouter queryRouter = new DefaultQueryRouter(contentRetriever);\n//        RetrievalAugmentor retrievalAugmentor = DefaultRetrievalAugmentor.builder().queryRouter(queryRouter)\n//                .contentInjector(DefaultContentInjector.builder()\n//                        .promptTemplate(PromptTemplate.from(\"{{userMessage}}\\n\\n用以下信息回答问题:\\n{{contents}}\\n\\n\"))\n//                        .build()).build();\n//        AiChatAssistant assistant = AiServices.builder(AiChatAssistant.class)\n//                .chatLanguageModel(chatModel)\n//                .chatMemory(chatMemory)\n//                .retrievalAugmentor(retrievalAugmentor)\n//                .build();\n//        String chat = assistant.chat(\"未签订劳动合同?\");\n//        System.out.println(chat);\n//\n//    }\n//\n//\n//    String doc = \"中华人民共和国劳动合同法\\n\" +\n//            \"已根据2013.07.01实施的修正案修改\\n\" +\n//            \"目录\\n\" +\n//            \"第一章　总则\\n\" +\n//            \"第二章　劳动合同的订立\\n\" +\n//            \"第三章　劳动合同的履行和变更\\n\" +\n//            \"第四章　劳动合同的解除和终止\\n\" +\n//            \"第五章　特别规定\\n\" +\n//            \"第六章　监督检查\\n\" +\n//            \"第七章　法律责任\\n\" +\n//            \"第八章　附则\\n\" +\n//            \"第一章　总则\\n\" +\n//            \"第一条　为了完善劳动合同制度，明确劳动合同双方当事人的权利和义务，保护劳动者的合法权益，构建和发展和谐稳定的劳动关系，制定本法。\\n\" +\n//            \"第二条　中华人民共和国境内的企业、个体经济组织、民办非企业单位等组织(以下称用人单位)与劳动者建立劳动关系，订立、履行、变更、解除或者终止劳动合同，适用本法。\\n\" +\n//            \"国家机关、事业单位、社会团体和与其建立劳动关系的劳动者，订立、履行、变更、解除或者终止劳动合同，依照本法执行。\\n\" +\n//            \"第三条　订立劳动合同，应当遵循合法、公平、平等自愿、协商一致、诚实信用的原则。\\n\" +\n//            \"依法订立的劳动合同具有约束力，用人单位与劳动者应当履行劳动合同约定的义务。\\n\" +\n//            \"第四条　用人单位应当依法建立和完善劳动规章制度，保障劳动者享有劳动权利、履行劳动义务。\\n\" +\n//            \"用人单位在制定、修改或者决定有关劳动报酬、工作时间、休息休假、劳动安全卫生、保险福利、职工培训、劳动纪律以及劳动定额管理等直接涉及劳动者切身利益的规章制度或者重大事项时，应当经职工代表大会或者全体职工讨论，提出方案和意见，与工会或者职工代表平等协商确定。\\n\" +\n//            \"在规章制度和重大事项决定实施过程中，工会或者职工认为不适当的，有权向用人单位提出，通过协商予以修改完善。\\n\" +\n//            \"用人单位应当将直接涉及劳动者切身利益的规章制度和重大事项决定公示，或者告知劳动者。\\n\" +\n//            \"第五条　县级以上人民政府劳动行政部门会同工会和企业方面代表，建立健全协调劳动关系三方机制，共同研究解决有关劳动关系的重大问题。\\n\" +\n//            \"第六条　工会应当帮助、指导劳动者与用人单位依法订立和履行劳动合同，并与用人单位建立集体协商机制，维护劳动者的合法权益。\\n\" +\n//            \"第二章　劳动合同的订立\\n\" +\n//            \"第七条　用人单位自用工之日起即与劳动者建立劳动关系。用人单位应当建立职工名册备查。\\n\" +\n//            \"第八条　用人单位招用劳动者时，应当如实告知劳动者工作内容、工作条件、工作地点、职业危害、安全生产状况、劳动报酬，以及劳动者要求了解的其他情况;用人单位有权了解劳动者与劳动合同直接相关的基本情况，劳动者应当如实说明。\\n\" +\n//            \"第九条　用人单位招用劳动者，不得扣押劳动者的居民身份证和其他证件，不得要求劳动者提供担保或者以其他名义向劳动者收取财物。\\n\" +\n//            \"第十条　建立劳动关系，应当订立书面劳动合同。\\n\" +\n//            \"已建立劳动关系，未同时订立书面劳动合同的，应当自用工之日起一个月内订立书面劳动合同。\\n\" +\n//            \"用人单位与劳动者在用工前订立劳动合同的，劳动关系自用工之日起建立。\\n\" +\n//            \"第十一条　用人单位未在用工的同时订立书面劳动合同，与劳动者约定的劳动报酬不明确的，新招用的劳动者的劳动报酬按照集体合同规定的标准执行;没有集体合同或者集体合同未规定的，实行同工同酬。\\n\" +\n//            \"第十二条　劳动合同分为固定期限劳动合同、无固定期限劳动合同和以完成一定工作任务为期限的劳动合同。\\n\" +\n//            \"第十三条　固定期限劳动合同，是指用人单位与劳动者约定合同终止时间的劳动合同。\\n\" +\n//            \"用人单位与劳动者协商一致，可以订立固定期限劳动合同。\\n\" +\n//            \"第十四条　无固定期限劳动合同，是指用人单位与劳动者约定无确定终止时间的劳动合同。\\n\" +\n//            \"用人单位与劳动者协商一致，可以订立无固定期限劳动合同。有下列情形之一，劳动者提出或者同意续订、订立劳动合同的，除劳动者提出订立固定期限劳动合同外，应当订立无固定期限劳动合同：\\n\" +\n//            \"(一)劳动者在该用人单位连续工作满十年的;\\n\" +\n//            \"(二)用人单位初次实行劳动合同制度或者国有企业改制重新订立劳动合同时，劳动者在该用人单位连续工作满十年且距法定退休年龄不足十年的;\\n\" +\n//            \"(三)连续订立二次固定期限劳动合同，且劳动者没有本法第三十九条和第四十条第一项、第二项规定的情形，续订劳动合同的。\\n\" +\n//            \"用人单位自用工之日起满一年不与劳动者订立书面劳动合同的，视为用人单位与劳动者已订立无固定期限劳动合同。\\n\" +\n//            \"第十五条　以完成一定工作任务为期限的劳动合同，是指用人单位与劳动者约定以某项工作的完成为合同期限的劳动合同。\\n\" +\n//            \"用人单位与劳动者协商一致，可以订立以完成一定工作任务为期限的劳动合同。\\n\" +\n//            \"第十六条　劳动合同由用人单位与劳动者协商一致，并经用人单位与劳动者在劳动合同文本上签字或者盖章生效。\\n\" +\n//            \"劳动合同文本由用人单位和劳动者各执一份。\\n\" +\n//            \"第十七条　劳动合同应当具备以下条款：\\n\" +\n//            \"(一)用人单位的名称、住所和法定代表人或者主要负责人;\\n\" +\n//            \"(二)劳动者的姓名、住址和居民身份证或者其他有效身份证件号码;\\n\" +\n//            \"(三)劳动合同期限;\\n\" +\n//            \"(四)工作内容和工作地点;\\n\" +\n//            \"(五)工作时间和休息休假;\\n\" +\n//            \"(六)劳动报酬;\\n\" +\n//            \"(七)社会保险;\\n\" +\n//            \"(八)劳动保护、劳动条件和职业危害防护;\\n\" +\n//            \"(九)法律、法规规定应当纳入劳动合同的其他事项。\\n\" +\n//            \"劳动合同除前款规定的必备条款外，用人单位与劳动者可以约定试用期、培训、保守秘密、补充保险和福利待遇等其他事项。\\n\" +\n//            \"第十八条　劳动合同对劳动报酬和劳动条件等标准约定不明确，引发争议的，用人单位与劳动者可以重新协商;协商不成的，适用集体合同规定;没有集体合同或者集体合同未规定劳动报酬的，实行同工同酬;没有集体合同或者集体合同未规定劳动条件等标准的，适用国家有关规定。\\n\" +\n//            \"第十九条　劳动合同期限三个月以上不满一年的，试用期不得超过一个月;劳动合同期限一年以上不满三年的，试用期不得超过二个月;三年以上固定期限和无固定期限的劳动合同，试用期不得超过六个月。\\n\" +\n//            \"同一用人单位与同一劳动者只能约定一次试用期。\\n\" +\n//            \"以完成一定工作任务为期限的劳动合同或者劳动合同期限不满三个月的，不得约定试用期。\\n\" +\n//            \"试用期包含在劳动合同期限内。劳动合同仅约定试用期的，试用期不成立，该期限为劳动合同期限。\\n\" +\n//            \"第二十条　劳动者在试用期的工资不得低于本单位相同岗位最低档工资或者劳动合同约定工资的百分之八十，并不得低于用人单位所在地的最低工资标准。\\n\" +\n//            \"第二十一条　在试用期中，除劳动者有本法第三十九条和第四十条第一项、第二项规定的情形外，用人单位不得解除劳动合同。用人单位在试用期解除劳动合同的，应当向劳动者说明理由。\\n\" +\n//            \"第二十二条　用人单位为劳动者提供专项培训费用，对其进行专业技术培训的，可以与该劳动者订立协议，约定服务期。\\n\" +\n//            \"劳动者违反服务期约定的，应当按照约定向用人单位支付违约金。违约金的数额不得超过用人单位提供的培训费用。用人单位要求劳动者支付的违约金不得超过服务期尚未履行部分所应分摊的培训费用。\\n\" +\n//            \"用人单位与劳动者约定服务期的，不影响按照正常的工资调整机制提高劳动者在服务期期间的劳动报酬。\\n\" +\n//            \"第二十三条　用人单位与劳动者可以在劳动合同中约定保守用人单位的商业秘密和与知识产权相关的保密事项。\\n\" +\n//            \"对负有保密义务的劳动者，用人单位可以在劳动合同或者保密协议中与劳动者约定竞业限制条款，并约定在解除或者终止劳动合同后，在竞业限制期限内按月给予劳动者经济补偿。劳动者违反竞业限制约定的，应当按照约定向用人单位支付违约金。\\n\" +\n//            \"第二十四条　竞业限制的人员限于用人单位的高级管理人员、高级技术人员和其他负有保密义务的人员。竞业限制的范围、地域、期限由用人单位与劳动者约定，竞业限制的约定不得违反法律、法规的规定。\\n\" +\n//            \"在解除或者终止劳动合同后，前款规定的人员到与本单位生产或者经营同类产品、从事同类业务的有竞争关系的其他用人单位，或者自己开业生产或者经营同类产品、从事同类业务的竞业限制期限，不得超过二年。\\n\" +\n//            \"第二十五条　除本法第二十二条和第二十三条规定的情形外，用人单位不得与劳动者约定由劳动者承担违约金。\\n\" +\n//            \"第二十六条　下列劳动合同无效或者部分无效：\\n\" +\n//            \"(一)以欺诈、胁迫的手段或者乘人之危，使对方在违背真实意思的情况下订立或者变更劳动合同的;\\n\" +\n//            \"(二)用人单位免除自己的法定责任、排除劳动者权利的;\\n\" +\n//            \"(三)违反法律、行政法规强制性规定的。\\n\" +\n//            \"对劳动合同的无效或者部分无效有争议的，由劳动争议仲裁机构或者人民法院确认。\\n\" +\n//            \"第二十七条　劳动合同部分无效，不影响其他部分效力的，其他部分仍然有效。\\n\" +\n//            \"第二十八条　劳动合同被确认无效，劳动者已付出劳动的，用人单位应当向劳动者支付劳动报酬。劳动报酬的数额，参照本单位相同或者相近岗位劳动者的劳动报酬确定。\\n\" +\n//            \"第三章　劳动合同的履行和变更\\n\" +\n//            \"第二十九条　用人单位与劳动者应当按照劳动合同的约定，全面履行各自的义务。\\n\" +\n//            \"第三十条　用人单位应当按照劳动合同约定和国家规定，向劳动者及时足额支付劳动报酬。\\n\" +\n//            \"用人单位拖欠或者未足额支付劳动报酬的，劳动者可以依法向当地人民法院申请支付令，人民法院应当依法发出支付令。\\n\" +\n//            \"第三十一条　用人单位应当严格执行劳动定额标准，不得强迫或者变相强迫劳动者加班。用人单位安排加班的，应当按照国家有关规定向劳动者支付加班费。\\n\" +\n//            \"第三十二条　劳动者拒绝用人单位管理人员违章指挥、强令冒险作业的，不视为违反劳动合同。\\n\" +\n//            \"劳动者对危害生命安全和身体健康的劳动条件，有权对用人单位提出批评、检举和控告。\\n\" +\n//            \"第三十三条　用人单位变更名称、法定代表人、主要负责人或者投资人等事项，不影响劳动合同的履行。\\n\" +\n//            \"第三十四条　用人单位发生合并或者分立等情况，原劳动合同继续有效，劳动合同由承继其权利和义务的用人单位继续履行。\\n\" +\n//            \"第三十五条　用人单位与劳动者协商一致，可以变更劳动合同约定的内容。变更劳动合同，应当采用书面形式。\\n\" +\n//            \"变更后的劳动合同文本由用人单位和劳动者各执一份。\\n\" +\n//            \"第四章　劳动合同的解除和终止\\n\" +\n//            \"第三十六条　用人单位与劳动者协商一致，可以解除劳动合同。\\n\" +\n//            \"第三十七条　劳动者提前三十日以书面形式通知用人单位，可以解除劳动合同。劳动者在试用期内提前三日通知用人单位，可以解除劳动合同。\\n\" +\n//            \"第三十八条　用人单位有下列情形之一的，劳动者可以解除劳动合同：\\n\" +\n//            \"(一)未按照劳动合同约定提供劳动保护或者劳动条件的;\\n\" +\n//            \"(二)未及时足额支付劳动报酬的;\\n\" +\n//            \"(三)未依法为劳动者缴纳社会保险费的;\\n\" +\n//            \"(四)用人单位的规章制度违反法律、法规的规定，损害劳动者权益的;\\n\" +\n//            \"(五)因本法第二十六条第一款规定的情形致使劳动合同无效的;\\n\" +\n//            \"(六)法律、行政法规规定劳动者可以解除劳动合同的其他情形。\\n\" +\n//            \"用人单位以暴力、威胁或者非法限制人身自由的手段强迫劳动者劳动的，或者用人单位违章指挥、强令冒险作业危及劳动者人身安全的，劳动者可以立即解除劳动合同，不需事先告知用人单位。\\n\" +\n//            \"第三十九条　劳动者有下列情形之一的，用人单位可以解除劳动合同：\\n\" +\n//            \"(一)在试用期间被证明不符合录用条件的;\\n\" +\n//            \"(二)严重违反用人单位的规章制度的;\\n\" +\n//            \"(三)严重失职，营私舞弊，给用人单位造成重大损害的;\\n\" +\n//            \"(四)劳动者同时与其他用人单位建立劳动关系，对完成本单位的工作任务造成严重影响，或者经用人单位提出，拒不改正的;\\n\" +\n//            \"(五)因本法第二十六条第一款第一项规定的情形致使劳动合同无效的;\\n\" +\n//            \"(六)被依法追究刑事责任的。\\n\" +\n//            \"第四十条　有下列情形之一的，用人单位提前三十日以书面形式通知劳动者本人或者额外支付劳动者一个月工资后，可以解除劳动合同：\\n\" +\n//            \"(一)劳动者患病或者非因工负伤，在规定的医疗期满后不能从事原工作，也不能从事由用人单位另行安排的工作的;\\n\" +\n//            \"(二)劳动者不能胜任工作，经过培训或者调整工作岗位，仍不能胜任工作的;\\n\" +\n//            \"(三)劳动合同订立时所依据的客观情况发生重大变化，致使劳动合同无法履行，经用人单位与劳动者协商，未能就变更劳动合同内容达成协议的。\\n\" +\n//            \"第四十一条　有下列情形之一，需要裁减人员二十人以上或者裁减不足二十人但占企业职工总数百分之十以上的，用人单位提前三十日向工会或者全体职工说明情况，听取工会或者职工的意见后，裁减人员方案经向劳动行政部门报告，可以裁减人员：\\n\" +\n//            \"(一)依照企业破产法规定进行重整的;\\n\" +\n//            \"(二)生产经营发生严重困难的;\\n\" +\n//            \"(三)企业转产、重大技术革新或者经营方式调整，经变更劳动合同后，仍需裁减人员的;\\n\" +\n//            \"(四)其他因劳动合同订立时所依据的客观经济情况发生重大变化，致使劳动合同无法履行的。\\n\" +\n//            \"裁减人员时，应当优先留用下列人员：\\n\" +\n//            \"(一)与本单位订立较长期限的固定期限劳动合同的;\\n\" +\n//            \"(二)与本单位订立无固定期限劳动合同的;\\n\" +\n//            \"(三)家庭无其他就业人员，有需要扶养的老人或者未成年人的。\\n\" +\n//            \"用人单位依照本条第一款规定裁减人员，在六个月内重新招用人员的，应当通知被裁减的人员，并在同等条件下优先招用被裁减的人员。\\n\" +\n//            \"第四十二条　劳动者有下列情形之一的，用人单位不得依照本法第四十条、第四十一条的规定解除劳动合同：\\n\" +\n//            \"(一)从事接触职业病危害作业的劳动者未进行离岗前职业健康检查，或者疑似职业病病人在诊断或者医学观察期间的;\\n\" +\n//            \"(二)在本单位患职业病或者因工负伤并被确认丧失或者部分丧失劳动能力的;\\n\" +\n//            \"(三)患病或者非因工负伤，在规定的医疗期内的;\\n\" +\n//            \"(四)女职工在孕期、产期、哺乳期的;\\n\" +\n//            \"(五)在本单位连续工作满十五年，且距法定退休年龄不足五年的;\\n\" +\n//            \"(六)法律、行政法规规定的其他情形。\\n\" +\n//            \"第四十三条　用人单位单方解除劳动合同，应当事先将理由通知工会。用人单位违反法律、行政法规规定或者劳动合同约定的，工会有权要求用人单位纠正。用人单位应当研究工会的意见，并将处理结果书面通知工会。\\n\" +\n//            \"第四十四条　有下列情形之一的，劳动合同终止：\\n\" +\n//            \"(一)劳动合同期满的;\\n\" +\n//            \"(二)劳动者开始依法享受基本养老保险待遇的;\\n\" +\n//            \"(三)劳动者死亡，或者被人民法院宣告死亡或者宣告失踪的;\\n\" +\n//            \"(四)用人单位被依法宣告破产的;\\n\" +\n//            \"(五)用人单位被吊销营业执照、责令关闭、撤销或者用人单位决定提前解散的;\\n\" +\n//            \"(六)法律、行政法规规定的其他情形。\\n\" +\n//            \"第四十五条　劳动合同期满，有本法第四十二条规定情形之一的，劳动合同应当续延至相应的情形消失时终止。但是，本法第四十二条第二项规定丧失或者部分丧失劳动能力劳动者的劳动合同的终止，按照国家有关工伤保险的规定执行。\\n\" +\n//            \"第四十六条　有下列情形之一的，用人单位应当向劳动者支付经济补偿：\\n\" +\n//            \"(一)劳动者依照本法第三十八条规定解除劳动合同的;\\n\" +\n//            \"(二)用人单位依照本法第三十六条规定向劳动者提出解除劳动合同并与劳动者协商一致解除劳动合同的;\\n\" +\n//            \"(三)用人单位依照本法第四十条规定解除劳动合同的;\\n\" +\n//            \"(四)用人单位依照本法第四十一条第一款规定解除劳动合同的;\\n\" +\n//            \"(五)除用人单位维持或者提高劳动合同约定条件续订劳动合同，劳动者不同意续订的情形外，依照本法第四十四条第一项规定终止固定期限劳动合同的;\\n\" +\n//            \"(六)依照本法第四十四条第四项、第五项规定终止劳动合同的;\\n\" +\n//            \"(七)法律、行政法规规定的其他情形。\\n\" +\n//            \"第四十七条　经济补偿按劳动者在本单位工作的年限，每满一年支付一个月工资的标准向劳动者支付。六个月以上不满一年的，按一年计算;不满六个月的，向劳动者支付半个月工资的经济补偿。\\n\" +\n//            \"劳动者月工资高于用人单位所在直辖市、设区的市级人民政府公布的本地区上年度职工月平均工资三倍的，向其支付经济补偿的标准按职工月平均工资三倍的数额支付，向其支付经济补偿的年限最高不超过十二年。\\n\" +\n//            \"本条所称月工资是指劳动者在劳动合同解除或者终止前十二个月的平均工资。\\n\" +\n//            \"第四十八条　用人单位违反本法规定解除或者终止劳动合同，劳动者要求继续履行劳动合同的，用人单位应当继续履行;劳动者不要求继续履行劳动合同或者劳动合同已经不能继续履行的，用人单位应当依照本法第八十七条规定支付赔偿金。\\n\" +\n//            \"第四十九条　国家采取措施，建立健全劳动者社会保险关系跨地区转移接续制度。\\n\" +\n//            \"第五十条　用人单位应当在解除或者终止劳动合同时出具解除或者终止劳动合同的证明，并在十五日内为劳动者办理档案和社会保险关系转移手续。\\n\" +\n//            \"劳动者应当按照双方约定，办理工作交接。用人单位依照本法有关规定应当向劳动者支付经济补偿的，在办结工作交接时支付。\\n\" +\n//            \"用人单位对已经解除或者终止的劳动合同的文本，至少保存二年备查。\\n\" +\n//            \"第五章　特别规定\\n\" +\n//            \"第一节　集体合同\\n\" +\n//            \"第五十一条　企业职工一方与用人单位通过平等协商，可以就劳动报酬、工作时间、休息休假、劳动安全卫生、保险福利等事项订立集体合同。集体合同草案应当提交职工代表大会或者全体职工讨论通过。\\n\" +\n//            \"集体合同由工会代表企业职工一方与用人单位订立;尚未建立工会的用人单位，由上级工会指导劳动者推举的代表与用人单位订立。\\n\" +\n//            \"第五十二条　企业职工一方与用人单位可以订立劳动安全卫生、女职工权益保护、工资调整机制等专项集体合同。\\n\" +\n//            \"第五十三条　在县级以下区域内，建筑业、采矿业、餐饮服务业等行业可以由工会与企业方面代表订立行业性集体合同，或者订立区域性集体合同。\\n\" +\n//            \"第五十四条　集体合同订立后，应当报送劳动行政部门;劳动行政部门自收到集体合同文本之日起十五日内未提出异议的，集体合同即行生效。\\n\" +\n//            \"依法订立的集体合同对用人单位和劳动者具有约束力。行业性、区域性集体合同对当地本行业、本区域的用人单位和劳动者具有约束力。\\n\" +\n//            \"第五十五条　集体合同中劳动报酬和劳动条件等标准不得低于当地人民政府规定的最低标准;用人单位与劳动者订立的劳动合同中劳动报酬和劳动条件等标准不得低于集体合同规定的标准。\\n\" +\n//            \"第五十六条　用人单位违反集体合同，侵犯职工劳动权益的，工会可以依法要求用人单位承担责任;因履行集体合同发生争议，经协商解决不成的，工会可以依法申请仲裁、提起诉讼。\\n\" +\n//            \"第二节　劳务派遣\\n\" +\n//            \"第五十七条　经营劳务派遣业务应当具备下列条件：\\n\" +\n//            \"    （一）注册资本不得少于人民币二百万元；\\n\" +\n//            \"    （二）有与开展业务相适应的固定的经营场所和设施；\\n\" +\n//            \"    （三）有符合法律、行政法规规定的劳务派遣管理制度；\\n\" +\n//            \"    （四）法律、行政法规规定的其他条件。\\n\" +\n//            \"    经营劳务派遣业务，应当向劳动行政部门依法申请行政许可；经许可的，依法办理相应的公司登记。未经许可，任何单位和个人不得经营劳务派遣业务。\\n\" +\n//            \"第五十八条　劳务派遣单位是本法所称用人单位，应当履行用人单位对劳动者的义务。劳务派遣单位与被派遣劳动者订立的劳动合同，除应当载明本法第十七条规定的事项外，还应当载明被派遣劳动者的用工单位以及派遣期限、工作岗位等情况。\\n\" +\n//            \"劳务派遣单位应当与被派遣劳动者订立二年以上的固定期限劳动合同，按月支付劳动报酬;被派遣劳动者在无工作期间，劳务派遣单位应当按照所在地人民政府规定的最低工资标准，向其按月支付报酬。\\n\" +\n//            \"第五十九条　劳务派遣单位派遣劳动者应当与接受以劳务派遣形式用工的单位(以下称用工单位)订立劳务派遣协议。劳务派遣协议应当约定派遣岗位和人员数量、派遣期限、劳动报酬和社会保险费的数额与支付方式以及违反协议的责任。\\n\" +\n//            \"用工单位应当根据工作岗位的实际需要与劳务派遣单位确定派遣期限，不得将连续用工期限分割订立数个短期劳务派遣协议。\\n\" +\n//            \"第六十条　劳务派遣单位应当将劳务派遣协议的内容告知被派遣劳动者。\\n\" +\n//            \"劳务派遣单位不得克扣用工单位按照劳务派遣协议支付给被派遣劳动者的劳动报酬。\\n\" +\n//            \"劳务派遣单位和用工单位不得向被派遣劳动者收取费用。\\n\" +\n//            \"第六十一条　劳务派遣单位跨地区派遣劳动者的，被派遣劳动者享有的劳动报酬和劳动条件，按照用工单位所在地的标准执行。\\n\" +\n//            \"第六十二条　用工单位应当履行下列义务：\\n\" +\n//            \"(一)执行国家劳动标准，提供相应的劳动条件和劳动保护;\\n\" +\n//            \"(二)告知被派遣劳动者的工作要求和劳动报酬;\\n\" +\n//            \"(三)支付加班费、绩效奖金，提供与工作岗位相关的福利待遇;\\n\" +\n//            \"(四)对在岗被派遣劳动者进行工作岗位所必需的培训;\\n\" +\n//            \"(五)连续用工的，实行正常的工资调整机制。\\n\" +\n//            \"用工单位不得将被派遣劳动者再派遣到其他用人单位。\\n\" +\n//            \"第六十三条　被派遣劳动者享有与用工单位的劳动者同工同酬的权利。用工单位应当按照同工同酬原则，对被派遣劳动者与本单位同类岗位的劳动者实行相同的劳动报酬分配办法。用工单位无同类岗位劳动者的，参照用工单位所在地相同或者相近岗位劳动者的劳动报酬确定。\\n\" +\n//            \"劳务派遣单位与被派遣劳动者订立的劳动合同和与用工单位订立的劳务派遣协议，载明或者约定的向被派遣劳动者支付的劳动报酬应当符合前款规定。\\n\" +\n//            \"第六十四条　被派遣劳动者有权在劳务派遣单位或者用工单位依法参加或者组织工会，维护自身的合法权益。\\n\" +\n//            \"第六十五条　被派遣劳动者可以依照本法第三十六条、第三十八条的规定与劳务派遣单位解除劳动合同。\\n\" +\n//            \"被派遣劳动者有本法第三十九条和第四十条第一项、第二项规定情形的，用工单位可以将劳动者退回劳务派遣单位，劳务派遣单位依照本法有关规定，可以与劳动者解除劳动合同。\\n\" +\n//            \"第六十六条　劳动合同用工是我国的企业基本用工形式。劳务派遣用工是补充形式，只能在临时性、辅助性或者替代性的工作岗位上实施。\\n\" +\n//            \"    前款规定的临时性工作岗位是指存续时间不超过六个月的岗位；辅助性工作岗位是指为主营业务岗位提供服务的非主营业务岗位；替代性工作岗位是指用工单位的劳动者因脱产学习、休假等原因无法工作的一定期间内，可以由其他劳动者替代工作的岗位。\\n\" +\n//            \"    用工单位应当严格控制劳务派遣用工数量，不得超过其用工总量的一定比例，具体比例由国务院劳动行政部门规定。\\n\" +\n//            \"第六十七条　用人单位不得设立劳务派遣单位向本单位或者所属单位派遣劳动者。\\n\" +\n//            \"第三节　非全日制用工\\n\" +\n//            \"第六十八条　非全日制用工，是指以小时计酬为主，劳动者在同一用人单位一般平均每日工作时间不超过四小时，每周工作时间累计不超过二十四小时的用工形式。\\n\" +\n//            \"第六十九条　非全日制用工双方当事人可以订立口头协议。\\n\" +\n//            \"从事非全日制用工的劳动者可以与一个或者一个以上用人单位订立劳动合同;但是，后订立的劳动合同不得影响先订立的劳动合同的履行。\\n\" +\n//            \"第七十条　非全日制用工双方当事人不得约定试用期。\\n\" +\n//            \"第七十一条　非全日制用工双方当事人任何一方都可以随时通知对方终止用工。终止用工，用人单位不向劳动者支付经济补偿。\\n\" +\n//            \"第七十二条　非全日制用工小时计酬标准不得低于用人单位所在地人民政府规定的最低小时工资标准。\\n\" +\n//            \"非全日制用工劳动报酬结算支付周期最长不得超过十五日。\\n\" +\n//            \"第六章　监督检查\\n\" +\n//            \"第七十三条　国务院劳动行政部门负责全国劳动合同制度实施的监督管理。\\n\" +\n//            \"县级以上地方人民政府劳动行政部门负责本行政区域内劳动合同制度实施的监督管理。\\n\" +\n//            \"县级以上各级人民政府劳动行政部门在劳动合同制度实施的监督管理工作中，应当听取工会、企业方面代表以及有关行业主管部门的意见。\\n\" +\n//            \"第七十四条　县级以上地方人民政府劳动行政部门依法对下列实施劳动合同制度的情况进行监督检查：\\n\" +\n//            \"(一)用人单位制定直接涉及劳动者切身利益的规章制度及其执行的情况;\\n\" +\n//            \"(二)用人单位与劳动者订立和解除劳动合同的情况;\\n\" +\n//            \"(三)劳务派遣单位和用工单位遵守劳务派遣有关规定的情况;\\n\" +\n//            \"(四)用人单位遵守国家关于劳动者工作时间和休息休假规定的情况;\\n\" +\n//            \"(五)用人单位支付劳动合同约定的劳动报酬和执行最低工资标准的情况;\\n\" +\n//            \"(六)用人单位参加各项社会保险和缴纳社会保险费的情况;\\n\" +\n//            \"(七)法律、法规规定的其他劳动监察事项。\\n\" +\n//            \"第七十五条　县级以上地方人民政府劳动行政部门实施监督检查时，有权查阅与劳动合同、集体合同有关的材料，有权对劳动场所进行实地检查，用人单位和劳动者都应当如实提供有关情况和材料。\\n\" +\n//            \"劳动行政部门的工作人员进行监督检查，应当出示证件，依法行使职权，文明执法。\\n\" +\n//            \"第七十六条　县级以上人民政府建设、卫生、安全生产监督管理等有关主管部门在各自职责范围内，对用人单位执行劳动合同制度的情况进行监督管理。\\n\" +\n//            \"第七十七条　劳动者合法权益受到侵害的，有权要求有关部门依法处理，或者依法申请仲裁、提起诉讼。\\n\" +\n//            \"第七十八条　工会依法维护劳动者的合法权益，对用人单位履行劳动合同、集体合同的情况进行监督。用人单位违反劳动法律、法规和劳动合同、集体合同的，工会有权提出意见或者要求纠正;劳动者申请仲裁、提起诉讼的，工会依法给予支持和帮助。\\n\" +\n//            \"第七十九条　任何组织或者个人对违反本法的行为都有权举报，县级以上人民政府劳动行政部门应当及时核实、处理，并对举报有功人员给予奖励。\\n\" +\n//            \"第七章　法律责任\\n\" +\n//            \"第八十条　用人单位直接涉及劳动者切身利益的规章制度违反法律、法规规定的，由劳动行政部门责令改正，给予警告;给劳动者造成损害的，应当承担赔偿责任。\\n\" +\n//            \"第八十一条　用人单位提供的劳动合同文本未载明本法规定的劳动合同必备条款或者用人单位未将劳动合同文本交付劳动者的，由劳动行政部门责令改正;给劳动者造成损害的，应当承担赔偿责任。\\n\" +\n//            \"第八十二条　用人单位自用工之日起超过一个月不满一年未与劳动者订立书面劳动合同的，应当向劳动者每月支付二倍的工资。\\n\" +\n//            \"用人单位违反本法规定不与劳动者订立无固定期限劳动合同的，自应当订立无固定期限劳动合同之日起向劳动者每月支付二倍的工资。\\n\" +\n//            \"第八十三条　用人单位违反本法规定与劳动者约定试用期的，由劳动行政部门责令改正;违法约定的试用期已经履行的，由用人单位以劳动者试用期满月工资为标准，按已经履行的超过法定试用期的期间向劳动者支付赔偿金。\\n\" +\n//            \"第八十四条　用人单位违反本法规定，扣押劳动者居民身份证等证件的，由劳动行政部门责令限期退还劳动者本人，并依照有关法律规定给予处罚。\\n\" +\n//            \"用人单位违反本法规定，以担保或者其他名义向劳动者收取财物的，由劳动行政部门责令限期退还劳动者本人，并以每人五百元以上二千元以下的标准处以罚款;给劳动者造成损害的，应当承担赔偿责任。\\n\" +\n//            \"劳动者依法解除或者终止劳动合同，用人单位扣押劳动者档案或者其他物品的，依照前款规定处罚。\\n\" +\n//            \"第八十五条　用人单位有下列情形之一的，由劳动行政部门责令限期支付劳动报酬、加班费或者经济补偿;劳动报酬低于当地最低工资标准的，应当支付其差额部分;逾期不支付的，责令用人单位按应付金额百分之五十以上百分之一百以下的标准向劳动者加付赔偿金：\\n\" +\n//            \"(一)未按照劳动合同的约定或者国家规定及时足额支付劳动者劳动报酬的;\\n\" +\n//            \"(二)低于当地最低工资标准支付劳动者工资的;\\n\" +\n//            \"(三)安排加班不支付加班费的;\\n\" +\n//            \"(四)解除或者终止劳动合同，未依照本法规定向劳动者支付经济补偿的。\\n\" +\n//            \"第八十六条　劳动合同依照本法第二十六条规定被确认无效，给对方造成损害的，有过错的一方应当承担赔偿责任。\\n\" +\n//            \"第八十七条　用人单位违反本法规定解除或者终止劳动合同的，应当依照本法第四十七条规定的经济补偿标准的二倍向劳动者支付赔偿金。\\n\" +\n//            \"第八十八条　用人单位有下列情形之一的，依法给予行政处罚;构成犯罪的，依法追究刑事责任;给劳动者造成损害的，应当承担赔偿责任：\\n\" +\n//            \"(一)以暴力、威胁或者非法限制人身自由的手段强迫劳动的;\\n\" +\n//            \"(二)违章指挥或者强令冒险作业危及劳动者人身安全的;\\n\" +\n//            \"(三)侮辱、体罚、殴打、非法搜查或者拘禁劳动者的;\\n\" +\n//            \"(四)劳动条件恶劣、环境污染严重，给劳动者身心健康造成严重损害的。\\n\" +\n//            \"第八十九条　用人单位违反本法规定未向劳动者出具解除或者终止劳动合同的书面证明，由劳动行政部门责令改正;给劳动者造成损害的，应当承担赔偿责任。\\n\" +\n//            \"第九十条　劳动者违反本法规定解除劳动合同，或者违反劳动合同中约定的保密义务或者竞业限制，给用人单位造成损失的，应当承担赔偿责任。\\n\" +\n//            \"第九十一条　用人单位招用与其他用人单位尚未解除或者终止劳动合同的劳动者，给其他用人单位造成损失的，应当承担连带赔偿责任。\\n\" +\n//            \"第九十二条　违反本法规定，未经许可，擅自经营劳务派遣业务的，由劳动行政部门责令停止违法行为，没收违法所得，并处违法所得一倍以上五倍以下的罚款；没有违法所得的，可以处五万元以下的罚款。\\n\" +\n//            \"    劳务派遣单位、用工单位违反本法有关劳务派遣规定的，由劳动行政部门责令限期改正；逾期不改正的，以每人五千元以上一万元以下的标准处以罚款，对劳务派遣单位，吊销其劳务派遣业务经营许可证。用工单位给被派遣劳动者造成损害的，劳务派遣单位与用工单位承担连带赔偿责任。\\n\" +\n//            \"第九十三条　对不具备合法经营资格的用人单位的违法犯罪行为，依法追究法律责任;劳动者已经付出劳动的，该单位或者其出资人应当依照本法有关规定向劳动者支付劳动报酬、经济补偿、赔偿金;给劳动者造成损害的，应当承担赔偿责任。\\n\" +\n//            \"第九十四条　个人承包经营违反本法规定招用劳动者，给劳动者造成损害的，发包的组织与个人承包经营者承担连带赔偿责任。\\n\" +\n//            \"第九十五条　劳动行政部门和其他有关主管部门及其工作人员玩忽职守、不履行法定职责，或者违法行使职权，给劳动者或者用人单位造成损害的，应当承担赔偿责任;对直接负责的主管人员和其他直接责任人员，依法给予行政处分;构成犯罪的，依法追究刑事责任。\\n\" +\n//            \"第八章　附则\\n\" +\n//            \"第九十六条　事业单位与实行聘用制的工作人员订立、履行、变更、解除或者终止劳动合同，法律、行政法规或者国务院另有规定的，依照其规定;未作规定的，依照本法有关规定执行。\\n\" +\n//            \"第九十七条　本法施行前已依法订立且在本法施行之日存续的劳动合同，继续履行;本法第十四条第二款第三项规定连续订立固定期限劳动合同的次数，自本法施行后续订固定期限劳动合同时开始计算。\\n\" +\n//            \"本法施行前已建立劳动关系，尚未订立书面劳动合同的，应当自本法施行之日起一个月内订立。\\n\" +\n//            \"本法施行之日存续的劳动合同在本法施行后解除或者终止，依照本法第四十六条规定应当支付经济补偿的，经济补偿年限自本法施行之日起计算;本法施行前按照当时有关规定，用人单位应当向劳动者支付经济补偿的，按照当时有关规定执行。\\n\" +\n//            \"第九十八条　本法自2008年1月1日起施行。\\n\" +\n//            \"\\n\";\n//\n//\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-boot-module</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>jeecg-module-demo</artifactId>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-boot-base-core</artifactId>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/cloud/controller/JcloudDemoFeignController.java",
    "content": "//package org.jeecg.modules.demo.cloud.controller;\n//\n//import com.alibaba.csp.sentinel.annotation.SentinelResource;\n//import io.swagger.v3.oas.annotations.tags.Tag;\n//import io.swagger.v3.oas.annotations.Operation;\n//import lombok.extern.slf4j.Slf4j;\n//import org.jeecg.common.api.vo.Result;\n//import org.jeecg.common.system.api.ISysBaseAPI;\n//import org.jeecg.common.system.vo.DictModel;\n//import org.springframework.beans.factory.annotation.Autowired;\n//import org.springframework.web.bind.annotation.GetMapping;\n//import org.springframework.web.bind.annotation.RequestMapping;\n//import org.springframework.web.bind.annotation.RestController;\n//import jakarta.annotation.Resource;\n//import java.util.List;\n//\n///**\n// *\n// */\n//@Slf4j\n//@Tag(name = \"【微服务】单元测试\")\n//@RestController\n//@RequestMapping(\"/test\")\n//public class JcloudDemoFeignController {\n//    @Resource\n//    private ISysBaseAPI sysBaseApi;\n////    @Autowired\n////    private ErpHelloApi erpHelloApi;\n//\n//    /**\n//     * 测试\n//     *\n//     * @return\n//     */\n//    @GetMapping(\"/callSystem\")\n//    //@SentinelResource(value = \"remoteDict\",fallback = \"getDefaultHandler\")\n//    @Operation(summary = \"通过feign调用system服务\")\n//    public Result getRemoteDict() {\n//        List<DictModel> list = sysBaseApi.queryAllDict();\n//        return Result.OK(list);\n//    }\n//\n//\n////    /**\n////     * 测试调用 erp 微服务接口\n////     * 【如何测试：通过archetype生成微服务模块，快速集成测试】\n////     *  https://help.jeecg.com/java/springcloud/archetype.html\n////     * @return\n////     */\n////    @GetMapping(\"/callErp\")\n////    @Operation(summary = \"测试feign erp\")\n////    public Result callErp() {\n////        log.info(\"call erp 服务\");\n////        String res = erpHelloApi.callHello();\n////        return Result.OK(res);\n////    }\n//\n//    /**\n//     * 熔断，默认回调函数\n//     *\n//     * @return\n//     */\n//    public Result<Object> getDefaultHandler() {\n//        log.info(\"测试JcloudDemoController-remoteDict 熔断降级\");\n//        return Result.error(\"测试JcloudDemoController-remoteDict 熔断降级\");\n//    }\n//\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/cloud/controller/JcloudDemoProviderController.java",
    "content": "package org.jeecg.modules.demo.cloud.controller;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.modules.demo.cloud.service.JcloudDemoService;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport jakarta.annotation.Resource;\n\n/**\n * 服务端提供方——feign接口\n * 【提供给system-start调用测试，看feign是否畅通】\n * @author: jeecg-boot\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/test\")\npublic class JcloudDemoProviderController {\n\n    @Resource\n    private JcloudDemoService jcloudDemoService;\n\n    @GetMapping(\"/getMessage\")\n    public String getMessage(@RequestParam(name = \"name\") String name) {\n        String msg = jcloudDemoService.getMessage(name);\n        log.info(\" 微服务被调用：{} \",msg);\n        return msg;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/cloud/service/JcloudDemoService.java",
    "content": "package org.jeecg.modules.demo.cloud.service;\n\nimport org.jeecg.common.api.vo.Result;\n\n/**\n * @Description: JcloudDemoService接口\n * @author: jeecg-boot\n */\npublic interface JcloudDemoService {\n\n    /**\n     * 获取信息（测试）\n     * @param name 姓名\n     * @return \"Hello，\" + name\n     */\n    String getMessage(String name);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/cloud/service/impl/JcloudDemoServiceImpl.java",
    "content": "package org.jeecg.modules.demo.cloud.service.impl;\n\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.modules.demo.cloud.service.JcloudDemoService;\nimport org.springframework.stereotype.Service;\n\n/**\n * @Description: JcloudDemoServiceImpl实现类\n * @author: jeecg-boot\n */\n@Service\npublic class JcloudDemoServiceImpl implements JcloudDemoService {\n    @Override\n    public String getMessage(String name) {\n        String resMsg = \"Hello，我是jeecg-demo服务节点，收到你的消息：【 \"+ name +\" 】\";\n        return resMsg;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/cloud/xxljob/TestJobHandler.java",
    "content": "//\n//package org.jeecg.modules.demo.cloud.xxljob;\n//\n//import com.xxl.job.core.biz.model.ReturnT;\n//import com.xxl.job.core.handler.annotation.XxlJob;\n//import lombok.extern.slf4j.Slf4j;\n//import org.jeecg.common.config.mqtoken.UserTokenContext;\n//import org.jeecg.common.constant.CommonConstant;\n//import org.jeecg.common.system.api.ISysBaseAPI;\n//import org.jeecg.common.system.util.JwtUtil;\n//import org.jeecg.common.util.RedisUtil;\n//import org.jeecg.common.util.SpringContextUtils;\n//import org.springframework.beans.factory.annotation.Autowired;\n//import org.springframework.stereotype.Component;\n//\n//\n///**\n// * xxl-job定时任务测试\n// */\n//@Slf4j\n//@Component\n//public class TestJobHandler {\n//    @Autowired\n//    ISysBaseAPI sysBaseApi;\n//\n//    /**\n//     * 简单任务\n//     *\n//     * 测试：无token调用feign接口\n//     *\n//     * @param params\n//     * @return\n//     */\n//\n//    @XxlJob(value = \"testJob\")\n//    public ReturnT<String> demoJobHandler(String params) {\n//        //1.生成临时令牌Token到线程中\n//        UserTokenContext.setToken(getTemporaryToken());\n//\n//        log.info(\"我是 jeecg-demo 服务里的定时任务 testJob , 我执行了...............................\");\n//        log.info(\"我调用 jeecg-system 服务的字典接口：{}\",sysBaseApi.queryAllDict());\n//        //。。。此处可以写多个feign接口调用\n//\n//        //2.使用完，删除临时令牌Token\n//        UserTokenContext.remove();\n//        return ReturnT.SUCCESS;\n//    }\n//\n//    public void init() {\n//        log.info(\"init\");\n//    }\n//\n//    public void destroy() {\n//        log.info(\"destory\");\n//    }\n//\n//    /**\n//     * 获取临时令牌\n//     *\n//     * 模拟登陆接口，获取模拟 Token\n//     * @return\n//     */\n//    public static String getTemporaryToken() {\n//        RedisUtil redisUtil = SpringContextUtils.getBean(RedisUtil.class);\n//        // 模拟登录生成Token\n//        String token = JwtUtil.sign(\"??\", \"??\");\n//        // 设置Token缓存有效时间为 5 分钟\n//        redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);\n//        redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, 5 * 60 * 1000);\n//        return token;\n//    }\n//\n//}\n//\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mcp/McpDemoController.java",
    "content": "package org.jeecg.modules.demo.mcp;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONObject;\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.config.shiro.IgnoreAuth;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.mvc.method.annotation.SseEmitter;\nimport java.io.IOException;\nimport java.io.PrintWriter;\nimport java.time.LocalDateTime;\nimport java.time.format.DateTimeFormatter;\nimport java.util.*;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * MCP Server 示例 (Model Context Protocol)\n * \n * 这是一个符合 MCP 协议的服务端实现，支持 SSE 传输。\n * \n * 连接地址: http://你的服务器:8080/jeecg-boot/demo/mcp/sse\n * \n * 提供的工具:\n * - hello: 打招呼工具\n * - get_time: 获取当前时间\n * - calculate: 简单计算器\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/demo/mcp\")\n@Tag(name = \"MCP Server 示例\")\npublic class McpDemoController {\n\n    // 存储 SSE 连接\n    private final Map<String, SseEmitter> sseEmitters = new ConcurrentHashMap<>();\n    \n    // 定义工具列表\n    private final List<Map<String, Object>> TOOLS = List.of(\n            Map.of(\n                    \"name\", \"hello\",\n                    \"description\", \"打招呼工具，返回问候语\",\n                    \"inputSchema\", Map.of(\n                            \"type\", \"object\",\n                            \"properties\", Map.of(\n                                    \"name\", Map.of(\"type\", \"string\", \"description\", \"你的名字\")\n                            ),\n                            \"required\", List.of(\"name\")\n                    )\n            ),\n            Map.of(\n                    \"name\", \"get_time\",\n                    \"description\", \"获取当前服务器时间\",\n                    \"inputSchema\", Map.of(\n                            \"type\", \"object\",\n                            \"properties\", Map.of()\n                    )\n            ),\n            Map.of(\n                    \"name\", \"calculate\",\n                    \"description\", \"简单计算器，支持加减乘除\",\n                    \"inputSchema\", Map.of(\n                            \"type\", \"object\",\n                            \"properties\", Map.of(\n                                    \"a\", Map.of(\"type\", \"number\", \"description\", \"第一个数\"),\n                                    \"b\", Map.of(\"type\", \"number\", \"description\", \"第二个数\"),\n                                    \"operator\", Map.of(\"type\", \"string\", \"description\", \"运算符: +, -, *, /\")\n                            ),\n                            \"required\", List.of(\"a\", \"b\", \"operator\")\n                    )\n            )\n    );\n\n    /**\n     * MCP SSE 端点 - 客户端通过此接口建立 SSE 连接\n     */\n    @IgnoreAuth\n    @GetMapping(value = \"/sse\", produces = MediaType.TEXT_EVENT_STREAM_VALUE)\n    @Operation(summary = \"MCP SSE 连接端点\")\n    public SseEmitter sse(HttpServletRequest request) {\n        String clientId = UUID.randomUUID().toString();\n        log.info(\"[MCP Server] 新客户端 SSE 连接: {}\", clientId);\n        \n        SseEmitter emitter = new SseEmitter(0L); // 不超时\n        sseEmitters.put(clientId, emitter);\n        \n        emitter.onCompletion(() -> {\n            log.info(\"[MCP Server] 客户端断开: {}\", clientId);\n            sseEmitters.remove(clientId);\n        });\n        emitter.onTimeout(() -> {\n            log.info(\"[MCP Server] 客户端超时: {}\", clientId);\n            sseEmitters.remove(clientId);\n        });\n        emitter.onError(e -> {\n            log.error(\"[MCP Server] SSE 错误: {}\", e.getMessage());\n            sseEmitters.remove(clientId);\n        });\n        \n        // 发送 endpoint 事件，告诉客户端消息端点地址\n        try {\n            String baseUrl = request.getScheme() + \"://\" + request.getServerName() + \":\" + request.getServerPort();\n            String messageEndpoint = baseUrl + request.getContextPath() + \"/demo/mcp/message?sessionId=\" + clientId;\n            emitter.send(SseEmitter.event()\n                    .name(\"endpoint\")\n                    .data(messageEndpoint));\n            log.info(\"[MCP Server] 发送 endpoint 事件: {}\", messageEndpoint);\n        } catch (IOException e) {\n            log.error(\"[MCP Server] 发送 endpoint 事件失败\", e);\n        }\n        \n        return emitter;\n    }\n\n    /**\n     * Streamable HTTP 端点 - 同时支持 POST 到 /sse 的 JSON-RPC 请求\n     * Cursor 客户端会先尝试这种方式\n     */\n    @IgnoreAuth\n    @PostMapping(value = \"/sse\")\n    @Operation(summary = \"MCP Streamable HTTP 端点\")\n    public void ssePost(@RequestBody String body, HttpServletResponse response) throws IOException {\n        log.info(\"[MCP Server] Streamable HTTP 请求: {}\", body);\n        handleJsonRpcRequest(body, response);\n    }\n\n    /**\n     * MCP 消息处理端点 - 处理 JSON-RPC 请求\n     * 直接写入原始 JSON-RPC 响应，避免框架包装\n     */\n    @IgnoreAuth\n    @PostMapping(value = \"/message\")\n    @Operation(summary = \"MCP 消息处理\")\n    public void handleMessage(@RequestParam(required = false) String sessionId,\n                              @RequestBody String body,\n                              HttpServletResponse response) throws IOException {\n        log.info(\"[MCP Server] 收到消息, sessionId: {}, body: {}\", sessionId, body);\n        handleJsonRpcRequest(body, response);\n    }\n\n    /**\n     * 处理 JSON-RPC 请求的公共方法\n     */\n    private void handleJsonRpcRequest(String body, HttpServletResponse response) throws IOException {\n        response.setContentType(\"application/json;charset=UTF-8\");\n        PrintWriter writer = response.getWriter();\n        \n        try {\n            JSONObject request = JSON.parseObject(body);\n            String method = request.getString(\"method\");\n            Object id = request.get(\"id\");\n            JSONObject params = request.getJSONObject(\"params\");\n            \n            // 通知类消息（没有id）不需要响应\n            if (id == null) {\n                log.info(\"[MCP Server] 收到通知: {}\", method);\n                writer.write(\"{}\");\n                writer.flush();\n                return;\n            }\n            \n            // 构建 JSON-RPC 2.0 响应\n            Map<String, Object> jsonRpcResponse = new LinkedHashMap<>();\n            jsonRpcResponse.put(\"jsonrpc\", \"2.0\");\n            jsonRpcResponse.put(\"id\", id);\n            \n            try {\n                Object result = switch (method) {\n                    case \"initialize\" -> handleInitialize(params);\n                    case \"initialized\", \"notifications/initialized\" -> handleInitialized();\n                    case \"tools/list\" -> handleToolsList();\n                    case \"tools/call\" -> handleToolsCall(params);\n                    case \"ping\" -> handlePing();\n                    case \"notifications/cancelled\" -> handleCancelled(params);\n                    default -> {\n                        if (method != null && method.startsWith(\"notifications/\")) {\n                            log.info(\"[MCP Server] 忽略未知通知: {}\", method);\n                            yield Map.of();\n                        }\n                        throw new RuntimeException(\"未知方法: \" + method);\n                    }\n                };\n                jsonRpcResponse.put(\"result\", result);\n            } catch (Exception e) {\n                log.error(\"[MCP Server] 处理请求失败\", e);\n                jsonRpcResponse.put(\"error\", Map.of(\n                        \"code\", -32603,\n                        \"message\", e.getMessage()\n                ));\n            }\n            \n            String responseJson = JSON.toJSONString(jsonRpcResponse);\n            log.info(\"[MCP Server] 返回: {}\", responseJson);\n            writer.write(responseJson);\n            \n        } catch (Exception e) {\n            log.error(\"[MCP Server] 解析请求失败\", e);\n            writer.write(\"{\\\"jsonrpc\\\":\\\"2.0\\\",\\\"id\\\":null,\\\"error\\\":{\\\"code\\\":-32700,\\\"message\\\":\\\"Parse error\\\"}}\");\n        }\n        \n        writer.flush();\n    }\n\n    /**\n     * 处理 initialize 请求\n     */\n    private Map<String, Object> handleInitialize(JSONObject params) {\n        log.info(\"[MCP Server] 初始化请求: {}\", params);\n        return Map.of(\n                \"protocolVersion\", \"2024-11-05\",\n                \"capabilities\", Map.of(\n                        \"tools\", Map.of()\n                ),\n                \"serverInfo\", Map.of(\n                        \"name\", \"jeecg-mcp-demo\",\n                        \"version\", \"1.0.0\"\n                )\n        );\n    }\n    \n    /**\n     * 处理 initialized 通知\n     */\n    private Map<String, Object> handleInitialized() {\n        log.info(\"[MCP Server] 客户端已初始化完成\");\n        return Map.of();\n    }\n    \n    /**\n     * 处理 ping 请求\n     */\n    private Map<String, Object> handlePing() {\n        log.info(\"[MCP Server] Ping\");\n        return Map.of();\n    }\n    \n    /**\n     * 处理 notifications/cancelled 通知\n     */\n    private Map<String, Object> handleCancelled(JSONObject params) {\n        log.info(\"[MCP Server] 请求被取消: {}\", params);\n        return Map.of();\n    }\n\n    /**\n     * 处理 tools/list 请求\n     */\n    private Map<String, Object> handleToolsList() {\n        log.info(\"[MCP Server] 获取工具列表\");\n        return Map.of(\"tools\", TOOLS);\n    }\n\n    /**\n     * 处理 tools/call 请求\n     */\n    private Map<String, Object> handleToolsCall(JSONObject params) {\n        String toolName = params.getString(\"name\");\n        JSONObject arguments = params.getJSONObject(\"arguments\");\n        if (arguments == null) {\n            arguments = new JSONObject();\n        }\n        log.info(\"[MCP Server] 调用工具: {}, 参数: {}\", toolName, arguments);\n        \n        String result = switch (toolName) {\n            case \"hello\" -> {\n                String name = arguments.getString(\"name\");\n                if (name == null || name.isEmpty()) {\n                    name = \"World\";\n                }\n                yield \"你好, \" + name + \"! 欢迎使用 JeecgBoot MCP 服务!\";\n            }\n            case \"get_time\" -> {\n                yield \"当前时间: \" + LocalDateTime.now().format(DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\"));\n            }\n            case \"calculate\" -> {\n                double a = arguments.getDoubleValue(\"a\");\n                double b = arguments.getDoubleValue(\"b\");\n                String op = arguments.getString(\"operator\");\n                if (op == null) op = \"+\";\n                double res = switch (op) {\n                    case \"+\" -> a + b;\n                    case \"-\" -> a - b;\n                    case \"*\" -> a * b;\n                    case \"/\" -> b != 0 ? a / b : Double.NaN;\n                    default -> throw new RuntimeException(\"不支持的运算符: \" + op);\n                };\n                yield String.format(\"%.2f %s %.2f = %.2f\", a, op, b, res);\n            }\n            default -> throw new RuntimeException(\"未知工具: \" + toolName);\n        };\n        \n        return Map.of(\n                \"content\", List.of(Map.of(\n                        \"type\", \"text\",\n                        \"text\", result\n                ))\n        );\n    }\n\n    /**\n     * 使用说明页面\n     */\n    @IgnoreAuth\n    @GetMapping(\"/info\")\n    @Operation(summary = \"MCP Server 使用说明\")\n    public Map<String, Object> info(HttpServletRequest request) {\n        log.info(\"[MCP Server] Hello 接口被访问\");\n        String baseUrl = request.getScheme() + \"://\" + request.getServerName() + \":\" + request.getServerPort() + request.getContextPath();\n        return Map.of(\n                \"success\", true,\n                \"message\", \"JeecgBoot MCP Server 示例\",\n                \"sseUrl\", baseUrl + \"/demo/mcp/sse\",\n                \"tools\", List.of(\n                        Map.of(\"name\", \"hello\", \"description\", \"打招呼工具\", \"params\", \"name: 你的名字\"),\n                        Map.of(\"name\", \"get_time\", \"description\", \"获取当前时间\", \"params\", \"无\"),\n                        Map.of(\"name\", \"calculate\", \"description\", \"简单计算器\", \"params\", \"a, b, operator(+,-,*,/)\")\n                ),\n                \"usage\", \"在 Cursor/Claude 等 MCP 客户端中配置 SSE URL: \" + baseUrl + \"/demo/mcp/sse\",\n                \"example\", \"请调用 hello 工具，参数 name 填 \\\"测试用户\\\"\"\n        );\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/MockController.java",
    "content": "package org.jeecg.modules.demo.mock;\n\nimport com.alibaba.fastjson.JSON;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.io.IOUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.springframework.web.bind.annotation.*;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport javax.swing.filechooser.FileSystemView;\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @Description: MockController\n * @author: jeecg-boot\n */\n@RestController\n@RequestMapping(\"/mock/api\")\n@Slf4j\npublic class MockController {\n\n\tprivate final String JSON_PATH = \"classpath:org/jeecg/modules/demo/mock/json\";\n\n\t/**\n\t * 通用json访问接口\n\t * 格式： http://localhost:8080/jeecg-boot/api/json/{filename}\n\t * @param filename\n\t * @return\n\t */\n\t@RequestMapping(value = \"/json/{filename}\", method = RequestMethod.GET)\n\tpublic String getJsonData(@PathVariable(\"filename\") String filename) {\n\t\tString jsonpath = \"classpath:org/jeecg/modules/demo/mock/json/\"+filename+\".json\";\n\t\treturn readJson(jsonpath);\n\t}\n\n\t@GetMapping(value = \"/asynTreeList\")\n\tpublic Result asynTreeList(String id) {\n\t\tString json = readJson(JSON_PATH + \"/asyn_tree_list_\" + id + \".json\");\n\t\treturn Result.OK(JSON.parseArray(json));\n\t}\n\n\t@GetMapping(value = \"/user\")\n\tpublic String user() {\n\t\treturn readJson(\"classpath:org/jeecg/modules/demo/mock/json/user.json\");\n\t}\n\n\t/**\n\t * 老的登录获取用户信息接口\n\t * @return\n\t */\n\t@GetMapping(value = \"/user/info\")\n\tpublic String userInfo() {\n\t\treturn readJson(\"classpath:org/jeecg/modules/demo/mock/json/user_info.json\");\n\t}\n\n\t@GetMapping(value = \"/role\")\n\tpublic String role() {\n\t\treturn readJson(\"classpath:org/jeecg/modules/demo/mock/json/role.json\");\n\t}\n\n\t@GetMapping(value = \"/service\")\n\tpublic String service() {\n\t\treturn readJson(\"classpath:org/jeecg/modules/demo/mock/json/service.json\");\n\t}\n\n\t@GetMapping(value = \"/permission\")\n\tpublic String permission() {\n\t\treturn readJson(\"classpath:org/jeecg/modules/demo/mock/json/permission.json\");\n\t}\n\n\t@GetMapping(value = \"/permission/no-pager\")\n\tpublic String permissionNoPage() {\n\t\treturn readJson(\"classpath:org/jeecg/modules/demo/mock/json/permission_no_page.json\");\n\t}\n\n\t/**\n\t * 省市县\n\t */\n\t@GetMapping(value = \"/area\")\n\tpublic String area() {\n\t\treturn readJson(\"classpath:org/jeecg/modules/demo/mock/json/area.json\");\n\t}\n\n\t/**\n\t  * 测试报表数据\n\t */\n\t@GetMapping(value = \"/report/getYearCountInfo\")\n\tpublic String getYearCountInfo() {\n\t\treturn readJson(\"classpath:org/jeecg/modules/demo/mock/json/getCntrNoCountInfo.json\");\n\t}\n\t@GetMapping(value = \"/report/getMonthCountInfo\")\n\tpublic String getMonthCountInfo() {\n\t\treturn readJson(\"classpath:org/jeecg/modules/demo/mock/json/getCntrNoCountInfo.json\");\n\t}\n\t@GetMapping(value = \"/report/getCntrNoCountInfo\")\n\tpublic String getCntrNoCountInfo() {\n\t\treturn readJson(\"classpath:org/jeecg/modules/demo/mock/json/getCntrNoCountInfo.json\");\n\t}\n\t@GetMapping(value = \"/report/getCabinetCountInfo\")\n\tpublic String getCabinetCountInfo() {\n\t\treturn readJson(\"classpath:org/jeecg/modules/demo/mock/json/getCntrNoCountInfo.json\");\n\t}\n\t@GetMapping(value = \"/report/getTubiao\")\n\tpublic String getTubiao() {\n\t\treturn readJson(\"classpath:org/jeecg/modules/demo/mock/json/getTubiao.json\");\n\t}\n\n\t/**\n\t   * 实时磁盘监控\n\t * @param request\n\t * @param response\n\t * @return\n\t */\n\t@GetMapping(\"/queryDiskInfo\")\n\tpublic Result<List<Map<String,Object>>> queryDiskInfo(HttpServletRequest request, HttpServletResponse response){\n\t\tResult<List<Map<String,Object>>> res = new Result<>();\n\t\ttry {\n\t\t\t// 当前文件系统类\n\t        FileSystemView fsv = FileSystemView.getFileSystemView();\n\t        // 列出所有windows 磁盘\n\t        File[] fs = File.listRoots();\n\t        log.info(\"查询磁盘信息:\"+fs.length+\"个\");\n\t        List<Map<String,Object>> list = new ArrayList<>();\n\n\t        for (int i = 0; i < fs.length; i++) {\n\t        \tif(fs[i].getTotalSpace()==0) {\n\t        \t\tcontinue;\n\t        \t}\n\t        \tMap<String,Object> map = new HashMap<>(5);\n\t        \tmap.put(\"name\", fsv.getSystemDisplayName(fs[i]));\n\t        \tmap.put(\"max\", fs[i].getTotalSpace());\n\t        \tmap.put(\"rest\", fs[i].getFreeSpace());\n\t        \tmap.put(\"restPPT\", fs[i].getFreeSpace()*100/fs[i].getTotalSpace());\n\t        \tlist.add(map);\n\t        \tlog.info(map.toString());\n\t        }\n\t        res.setResult(list);\n\t        res.success(\"查询成功\");\n\t\t} catch (Exception e) {\n\t\t\tres.error500(\"查询失败\"+e.getMessage());\n\t\t}\n\t\treturn res;\n\t}\n\n\t//-------------------------------------------------------------------------------------------\n\t/**\n\t * 工作台首页的数据\n\t * @return\n\t */\n\t@GetMapping(value = \"/list/search/projects\")\n\tpublic String projects() {\n\t\treturn readJson(\"classpath:org/jeecg/modules/demo/mock/json/workplace_projects.json\");\n\t}\n\n\t@GetMapping(value = \"/workplace/activity\")\n\tpublic String activity() {\n\t\treturn readJson(\"classpath:org/jeecg/modules/demo/mock/json/workplace_activity.json\");\n\t}\n\n\t@GetMapping(value = \"/workplace/teams\")\n\tpublic String teams() {\n\t\treturn readJson(\"classpath:org/jeecg/modules/demo/mock/json/workplace_teams.json\");\n\t}\n\n\t@GetMapping(value = \"/workplace/radar\")\n\tpublic String radar() {\n\t\treturn readJson(\"classpath:org/jeecg/modules/demo/mock/json/workplace_radar.json\");\n\t}\n\n\t@GetMapping(value = \"/task/process\")\n\tpublic String taskProcess() {\n\t\treturn readJson(\"classpath:org/jeecg/modules/demo/mock/json/task_process.json\");\n\t}\n\t//-------------------------------------------------------------------------------------------\n\n\t//author:lvdandan-----date：20190315---for:添加数据日志json----\n    /**\n     * 数据日志\n     */\n\tpublic String sysDataLogJson() {\n\t\treturn readJson(\"classpath:org/jeecg/modules/demo/mock/json/sysdatalog.json\");\n\t}\n\t//author:lvdandan-----date：20190315---for:添加数据日志json----\n\n\t//--update-begin--author:wangshuai-----date：20201023---for:返回用户信息json数据----\n    /**\n     * 用户信息\n     */\n    @GetMapping(value = \"/getUserInfo\")\n\tpublic String getUserInfo(){\n\t\treturn readJson(\"classpath:org/jeecg/modules/demo/mock/json/userinfo.json\");\n\t}\n\t//--update-end--author:wangshuai-----date：20201023---for:返回用户信息json数据----\n\t/**\n\t * 读取json格式文件\n\t * @param jsonSrc\n\t * @return\n\t */\n\tprivate String readJson(String jsonSrc) {\n\t\tString json = \"\";\n\t\ttry {\n\t\t\t//File jsonFile = ResourceUtils.getFile(jsonSrc);\n\t\t\t//json = FileUtils.re.readFileToString(jsonFile);\n\t\t\t//换个写法，解决springboot读取jar包中文件的问题\n\t\t\tInputStream stream = getClass().getClassLoader().getResourceAsStream(jsonSrc.replace(\"classpath:\", \"\"));\n\t\t\tjson = IOUtils.toString(stream,\"UTF-8\");\n\t\t} catch (IOException e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t}\n\t\treturn json;\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/area.json",
    "content": "[\n  {\n    \"value\": \"110000\",\n    \"label\": \"北京市\",\n    \"children\": [\n      {\n        \"value\": \"110000\",\n        \"label\": \"北京市\",\n        \"children\": [\n          {\n            \"value\": \"110101\",\n            \"label\": \"东城区\"\n          },\n          {\n            \"value\": \"110102\",\n            \"label\": \"西城区\"\n          },\n          {\n            \"value\": \"110105\",\n            \"label\": \"朝阳区\"\n          },\n          {\n            \"value\": \"110106\",\n            \"label\": \"丰台区\"\n          },\n          {\n            \"value\": \"110107\",\n            \"label\": \"石景山区\"\n          },\n          {\n            \"value\": \"110108\",\n            \"label\": \"海淀区\"\n          },\n          {\n            \"value\": \"110109\",\n            \"label\": \"门头沟区\"\n          },\n          {\n            \"value\": \"110111\",\n            \"label\": \"房山区\"\n          },\n          {\n            \"value\": \"110112\",\n            \"label\": \"通州区\"\n          },\n          {\n            \"value\": \"110113\",\n            \"label\": \"顺义区\"\n          },\n          {\n            \"value\": \"110114\",\n            \"label\": \"昌平区\"\n          },\n          {\n            \"value\": \"110115\",\n            \"label\": \"大兴区\"\n          },\n          {\n            \"value\": \"110116\",\n            \"label\": \"怀柔区\"\n          },\n          {\n            \"value\": \"110117\",\n            \"label\": \"平谷区\"\n          },\n          {\n            \"value\": \"110118\",\n            \"label\": \"密云区\"\n          },\n          {\n            \"value\": \"110119\",\n            \"label\": \"延庆区\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"120000\",\n    \"label\": \"天津市\",\n    \"children\": [\n      {\n        \"value\": \"120000\",\n        \"label\": \"天津市\",\n        \"children\": [\n          {\n            \"value\": \"120101\",\n            \"label\": \"和平区\"\n          },\n          {\n            \"value\": \"120102\",\n            \"label\": \"河东区\"\n          },\n          {\n            \"value\": \"120103\",\n            \"label\": \"河西区\"\n          },\n          {\n            \"value\": \"120104\",\n            \"label\": \"南开区\"\n          },\n          {\n            \"value\": \"120105\",\n            \"label\": \"河北区\"\n          },\n          {\n            \"value\": \"120106\",\n            \"label\": \"红桥区\"\n          },\n          {\n            \"value\": \"120110\",\n            \"label\": \"东丽区\"\n          },\n          {\n            \"value\": \"120111\",\n            \"label\": \"西青区\"\n          },\n          {\n            \"value\": \"120112\",\n            \"label\": \"津南区\"\n          },\n          {\n            \"value\": \"120113\",\n            \"label\": \"北辰区\"\n          },\n          {\n            \"value\": \"120114\",\n            \"label\": \"武清区\"\n          },\n          {\n            \"value\": \"120115\",\n            \"label\": \"宝坻区\"\n          },\n          {\n            \"value\": \"120116\",\n            \"label\": \"滨海新区\"\n          },\n          {\n            \"value\": \"120117\",\n            \"label\": \"宁河区\"\n          },\n          {\n            \"value\": \"120118\",\n            \"label\": \"静海区\"\n          },\n          {\n            \"value\": \"120119\",\n            \"label\": \"蓟州区\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"130000\",\n    \"label\": \"河北省\",\n    \"children\": [\n      {\n        \"value\": \"130100\",\n        \"label\": \"石家庄市\",\n        \"children\": [\n          {\n            \"value\": \"130102\",\n            \"label\": \"长安区\"\n          },\n          {\n            \"value\": \"130104\",\n            \"label\": \"桥西区\"\n          },\n          {\n            \"value\": \"130105\",\n            \"label\": \"新华区\"\n          },\n          {\n            \"value\": \"130107\",\n            \"label\": \"井陉矿区\"\n          },\n          {\n            \"value\": \"130108\",\n            \"label\": \"裕华区\"\n          },\n          {\n            \"value\": \"130109\",\n            \"label\": \"藁城区\"\n          },\n          {\n            \"value\": \"130110\",\n            \"label\": \"鹿泉区\"\n          },\n          {\n            \"value\": \"130111\",\n            \"label\": \"栾城区\"\n          },\n          {\n            \"value\": \"130121\",\n            \"label\": \"井陉县\"\n          },\n          {\n            \"value\": \"130123\",\n            \"label\": \"正定县\"\n          },\n          {\n            \"value\": \"130125\",\n            \"label\": \"行唐县\"\n          },\n          {\n            \"value\": \"130126\",\n            \"label\": \"灵寿县\"\n          },\n          {\n            \"value\": \"130127\",\n            \"label\": \"高邑县\"\n          },\n          {\n            \"value\": \"130128\",\n            \"label\": \"深泽县\"\n          },\n          {\n            \"value\": \"130129\",\n            \"label\": \"赞皇县\"\n          },\n          {\n            \"value\": \"130130\",\n            \"label\": \"无极县\"\n          },\n          {\n            \"value\": \"130131\",\n            \"label\": \"平山县\"\n          },\n          {\n            \"value\": \"130132\",\n            \"label\": \"元氏县\"\n          },\n          {\n            \"value\": \"130133\",\n            \"label\": \"赵县\"\n          },\n          {\n            \"value\": \"130181\",\n            \"label\": \"辛集市\"\n          },\n          {\n            \"value\": \"130183\",\n            \"label\": \"晋州市\"\n          },\n          {\n            \"value\": \"130184\",\n            \"label\": \"新乐市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"130200\",\n        \"label\": \"唐山市\",\n        \"children\": [\n          {\n            \"value\": \"130202\",\n            \"label\": \"路南区\"\n          },\n          {\n            \"value\": \"130203\",\n            \"label\": \"路北区\"\n          },\n          {\n            \"value\": \"130204\",\n            \"label\": \"古冶区\"\n          },\n          {\n            \"value\": \"130205\",\n            \"label\": \"开平区\"\n          },\n          {\n            \"value\": \"130207\",\n            \"label\": \"丰南区\"\n          },\n          {\n            \"value\": \"130208\",\n            \"label\": \"丰润区\"\n          },\n          {\n            \"value\": \"130209\",\n            \"label\": \"曹妃甸区\"\n          },\n          {\n            \"value\": \"130223\",\n            \"label\": \"滦县\"\n          },\n          {\n            \"value\": \"130224\",\n            \"label\": \"滦南县\"\n          },\n          {\n            \"value\": \"130225\",\n            \"label\": \"乐亭县\"\n          },\n          {\n            \"value\": \"130227\",\n            \"label\": \"迁西县\"\n          },\n          {\n            \"value\": \"130229\",\n            \"label\": \"玉田县\"\n          },\n          {\n            \"value\": \"130281\",\n            \"label\": \"遵化市\"\n          },\n          {\n            \"value\": \"130283\",\n            \"label\": \"迁安市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"130300\",\n        \"label\": \"秦皇岛市\",\n        \"children\": [\n          {\n            \"value\": \"130302\",\n            \"label\": \"海港区\"\n          },\n          {\n            \"value\": \"130303\",\n            \"label\": \"山海关区\"\n          },\n          {\n            \"value\": \"130304\",\n            \"label\": \"北戴河区\"\n          },\n          {\n            \"value\": \"130306\",\n            \"label\": \"抚宁区\"\n          },\n          {\n            \"value\": \"130321\",\n            \"label\": \"青龙满族自治县\"\n          },\n          {\n            \"value\": \"130322\",\n            \"label\": \"昌黎县\"\n          },\n          {\n            \"value\": \"130324\",\n            \"label\": \"卢龙县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"130400\",\n        \"label\": \"邯郸市\",\n        \"children\": [\n          {\n            \"value\": \"130402\",\n            \"label\": \"邯山区\"\n          },\n          {\n            \"value\": \"130403\",\n            \"label\": \"丛台区\"\n          },\n          {\n            \"value\": \"130404\",\n            \"label\": \"复兴区\"\n          },\n          {\n            \"value\": \"130406\",\n            \"label\": \"峰峰矿区\"\n          },\n          {\n            \"value\": \"130407\",\n            \"label\": \"肥乡区\"\n          },\n          {\n            \"value\": \"130408\",\n            \"label\": \"永年区\"\n          },\n          {\n            \"value\": \"130423\",\n            \"label\": \"临漳县\"\n          },\n          {\n            \"value\": \"130424\",\n            \"label\": \"成安县\"\n          },\n          {\n            \"value\": \"130425\",\n            \"label\": \"大名县\"\n          },\n          {\n            \"value\": \"130426\",\n            \"label\": \"涉县\"\n          },\n          {\n            \"value\": \"130427\",\n            \"label\": \"磁县\"\n          },\n          {\n            \"value\": \"130430\",\n            \"label\": \"邱县\"\n          },\n          {\n            \"value\": \"130431\",\n            \"label\": \"鸡泽县\"\n          },\n          {\n            \"value\": \"130432\",\n            \"label\": \"广平县\"\n          },\n          {\n            \"value\": \"130433\",\n            \"label\": \"馆陶县\"\n          },\n          {\n            \"value\": \"130434\",\n            \"label\": \"魏县\"\n          },\n          {\n            \"value\": \"130435\",\n            \"label\": \"曲周县\"\n          },\n          {\n            \"value\": \"130481\",\n            \"label\": \"武安市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"130500\",\n        \"label\": \"邢台市\",\n        \"children\": [\n          {\n            \"value\": \"130502\",\n            \"label\": \"桥东区\"\n          },\n          {\n            \"value\": \"130503\",\n            \"label\": \"桥西区\"\n          },\n          {\n            \"value\": \"130521\",\n            \"label\": \"邢台县\"\n          },\n          {\n            \"value\": \"130522\",\n            \"label\": \"临城县\"\n          },\n          {\n            \"value\": \"130523\",\n            \"label\": \"内丘县\"\n          },\n          {\n            \"value\": \"130524\",\n            \"label\": \"柏乡县\"\n          },\n          {\n            \"value\": \"130525\",\n            \"label\": \"隆尧县\"\n          },\n          {\n            \"value\": \"130526\",\n            \"label\": \"任县\"\n          },\n          {\n            \"value\": \"130527\",\n            \"label\": \"南和县\"\n          },\n          {\n            \"value\": \"130528\",\n            \"label\": \"宁晋县\"\n          },\n          {\n            \"value\": \"130529\",\n            \"label\": \"巨鹿县\"\n          },\n          {\n            \"value\": \"130530\",\n            \"label\": \"新河县\"\n          },\n          {\n            \"value\": \"130531\",\n            \"label\": \"广宗县\"\n          },\n          {\n            \"value\": \"130532\",\n            \"label\": \"平乡县\"\n          },\n          {\n            \"value\": \"130533\",\n            \"label\": \"威县\"\n          },\n          {\n            \"value\": \"130534\",\n            \"label\": \"清河县\"\n          },\n          {\n            \"value\": \"130535\",\n            \"label\": \"临西县\"\n          },\n          {\n            \"value\": \"130581\",\n            \"label\": \"南宫市\"\n          },\n          {\n            \"value\": \"130582\",\n            \"label\": \"沙河市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"130600\",\n        \"label\": \"保定市\",\n        \"children\": [\n          {\n            \"value\": \"130602\",\n            \"label\": \"竞秀区\"\n          },\n          {\n            \"value\": \"130606\",\n            \"label\": \"莲池区\"\n          },\n          {\n            \"value\": \"130607\",\n            \"label\": \"满城区\"\n          },\n          {\n            \"value\": \"130608\",\n            \"label\": \"清苑区\"\n          },\n          {\n            \"value\": \"130609\",\n            \"label\": \"徐水区\"\n          },\n          {\n            \"value\": \"130623\",\n            \"label\": \"涞水县\"\n          },\n          {\n            \"value\": \"130624\",\n            \"label\": \"阜平县\"\n          },\n          {\n            \"value\": \"130626\",\n            \"label\": \"定兴县\"\n          },\n          {\n            \"value\": \"130627\",\n            \"label\": \"唐县\"\n          },\n          {\n            \"value\": \"130628\",\n            \"label\": \"高阳县\"\n          },\n          {\n            \"value\": \"130629\",\n            \"label\": \"容城县\"\n          },\n          {\n            \"value\": \"130630\",\n            \"label\": \"涞源县\"\n          },\n          {\n            \"value\": \"130631\",\n            \"label\": \"望都县\"\n          },\n          {\n            \"value\": \"130632\",\n            \"label\": \"安新县\"\n          },\n          {\n            \"value\": \"130633\",\n            \"label\": \"易县\"\n          },\n          {\n            \"value\": \"130634\",\n            \"label\": \"曲阳县\"\n          },\n          {\n            \"value\": \"130635\",\n            \"label\": \"蠡县\"\n          },\n          {\n            \"value\": \"130636\",\n            \"label\": \"顺平县\"\n          },\n          {\n            \"value\": \"130637\",\n            \"label\": \"博野县\"\n          },\n          {\n            \"value\": \"130638\",\n            \"label\": \"雄县\"\n          },\n          {\n            \"value\": \"130681\",\n            \"label\": \"涿州市\"\n          },\n          {\n            \"value\": \"130682\",\n            \"label\": \"定州市\"\n          },\n          {\n            \"value\": \"130683\",\n            \"label\": \"安国市\"\n          },\n          {\n            \"value\": \"130684\",\n            \"label\": \"高碑店市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"130700\",\n        \"label\": \"张家口市\",\n        \"children\": [\n          {\n            \"value\": \"130702\",\n            \"label\": \"桥东区\"\n          },\n          {\n            \"value\": \"130703\",\n            \"label\": \"桥西区\"\n          },\n          {\n            \"value\": \"130705\",\n            \"label\": \"宣化区\"\n          },\n          {\n            \"value\": \"130706\",\n            \"label\": \"下花园区\"\n          },\n          {\n            \"value\": \"130708\",\n            \"label\": \"万全区\"\n          },\n          {\n            \"value\": \"130709\",\n            \"label\": \"崇礼区\"\n          },\n          {\n            \"value\": \"130722\",\n            \"label\": \"张北县\"\n          },\n          {\n            \"value\": \"130723\",\n            \"label\": \"康保县\"\n          },\n          {\n            \"value\": \"130724\",\n            \"label\": \"沽源县\"\n          },\n          {\n            \"value\": \"130725\",\n            \"label\": \"尚义县\"\n          },\n          {\n            \"value\": \"130726\",\n            \"label\": \"蔚县\"\n          },\n          {\n            \"value\": \"130727\",\n            \"label\": \"阳原县\"\n          },\n          {\n            \"value\": \"130728\",\n            \"label\": \"怀安县\"\n          },\n          {\n            \"value\": \"130730\",\n            \"label\": \"怀来县\"\n          },\n          {\n            \"value\": \"130731\",\n            \"label\": \"涿鹿县\"\n          },\n          {\n            \"value\": \"130732\",\n            \"label\": \"赤城县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"130800\",\n        \"label\": \"承德市\",\n        \"children\": [\n          {\n            \"value\": \"130802\",\n            \"label\": \"双桥区\"\n          },\n          {\n            \"value\": \"130803\",\n            \"label\": \"双滦区\"\n          },\n          {\n            \"value\": \"130804\",\n            \"label\": \"鹰手营子矿区\"\n          },\n          {\n            \"value\": \"130821\",\n            \"label\": \"承德县\"\n          },\n          {\n            \"value\": \"130822\",\n            \"label\": \"兴隆县\"\n          },\n          {\n            \"value\": \"130824\",\n            \"label\": \"滦平县\"\n          },\n          {\n            \"value\": \"130825\",\n            \"label\": \"隆化县\"\n          },\n          {\n            \"value\": \"130826\",\n            \"label\": \"丰宁满族自治县\"\n          },\n          {\n            \"value\": \"130827\",\n            \"label\": \"宽城满族自治县\"\n          },\n          {\n            \"value\": \"130828\",\n            \"label\": \"围场满族蒙古族自治县\"\n          },\n          {\n            \"value\": \"130881\",\n            \"label\": \"平泉市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"130900\",\n        \"label\": \"沧州市\",\n        \"children\": [\n          {\n            \"value\": \"130902\",\n            \"label\": \"新华区\"\n          },\n          {\n            \"value\": \"130903\",\n            \"label\": \"运河区\"\n          },\n          {\n            \"value\": \"130921\",\n            \"label\": \"沧县\"\n          },\n          {\n            \"value\": \"130922\",\n            \"label\": \"青县\"\n          },\n          {\n            \"value\": \"130923\",\n            \"label\": \"东光县\"\n          },\n          {\n            \"value\": \"130924\",\n            \"label\": \"海兴县\"\n          },\n          {\n            \"value\": \"130925\",\n            \"label\": \"盐山县\"\n          },\n          {\n            \"value\": \"130926\",\n            \"label\": \"肃宁县\"\n          },\n          {\n            \"value\": \"130927\",\n            \"label\": \"南皮县\"\n          },\n          {\n            \"value\": \"130928\",\n            \"label\": \"吴桥县\"\n          },\n          {\n            \"value\": \"130929\",\n            \"label\": \"献县\"\n          },\n          {\n            \"value\": \"130930\",\n            \"label\": \"孟村回族自治县\"\n          },\n          {\n            \"value\": \"130981\",\n            \"label\": \"泊头市\"\n          },\n          {\n            \"value\": \"130982\",\n            \"label\": \"任丘市\"\n          },\n          {\n            \"value\": \"130983\",\n            \"label\": \"黄骅市\"\n          },\n          {\n            \"value\": \"130984\",\n            \"label\": \"河间市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"131000\",\n        \"label\": \"廊坊市\",\n        \"children\": [\n          {\n            \"value\": \"131002\",\n            \"label\": \"安次区\"\n          },\n          {\n            \"value\": \"131003\",\n            \"label\": \"广阳区\"\n          },\n          {\n            \"value\": \"131022\",\n            \"label\": \"固安县\"\n          },\n          {\n            \"value\": \"131023\",\n            \"label\": \"永清县\"\n          },\n          {\n            \"value\": \"131024\",\n            \"label\": \"香河县\"\n          },\n          {\n            \"value\": \"131025\",\n            \"label\": \"大城县\"\n          },\n          {\n            \"value\": \"131026\",\n            \"label\": \"文安县\"\n          },\n          {\n            \"value\": \"131028\",\n            \"label\": \"大厂回族自治县\"\n          },\n          {\n            \"value\": \"131081\",\n            \"label\": \"霸州市\"\n          },\n          {\n            \"value\": \"131082\",\n            \"label\": \"三河市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"131100\",\n        \"label\": \"衡水市\",\n        \"children\": [\n          {\n            \"value\": \"131102\",\n            \"label\": \"桃城区\"\n          },\n          {\n            \"value\": \"131103\",\n            \"label\": \"冀州区\"\n          },\n          {\n            \"value\": \"131121\",\n            \"label\": \"枣强县\"\n          },\n          {\n            \"value\": \"131122\",\n            \"label\": \"武邑县\"\n          },\n          {\n            \"value\": \"131123\",\n            \"label\": \"武强县\"\n          },\n          {\n            \"value\": \"131124\",\n            \"label\": \"饶阳县\"\n          },\n          {\n            \"value\": \"131125\",\n            \"label\": \"安平县\"\n          },\n          {\n            \"value\": \"131126\",\n            \"label\": \"故城县\"\n          },\n          {\n            \"value\": \"131127\",\n            \"label\": \"景县\"\n          },\n          {\n            \"value\": \"131128\",\n            \"label\": \"阜城县\"\n          },\n          {\n            \"value\": \"131182\",\n            \"label\": \"深州市\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"140000\",\n    \"label\": \"山西省\",\n    \"children\": [\n      {\n        \"value\": \"140100\",\n        \"label\": \"太原市\",\n        \"children\": [\n          {\n            \"value\": \"140105\",\n            \"label\": \"小店区\"\n          },\n          {\n            \"value\": \"140106\",\n            \"label\": \"迎泽区\"\n          },\n          {\n            \"value\": \"140107\",\n            \"label\": \"杏花岭区\"\n          },\n          {\n            \"value\": \"140108\",\n            \"label\": \"尖草坪区\"\n          },\n          {\n            \"value\": \"140109\",\n            \"label\": \"万柏林区\"\n          },\n          {\n            \"value\": \"140110\",\n            \"label\": \"晋源区\"\n          },\n          {\n            \"value\": \"140121\",\n            \"label\": \"清徐县\"\n          },\n          {\n            \"value\": \"140122\",\n            \"label\": \"阳曲县\"\n          },\n          {\n            \"value\": \"140123\",\n            \"label\": \"娄烦县\"\n          },\n          {\n            \"value\": \"140181\",\n            \"label\": \"古交市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"140200\",\n        \"label\": \"大同市\",\n        \"children\": [\n          {\n            \"value\": \"140212\",\n            \"label\": \"新荣区\"\n          },\n          {\n            \"value\": \"140213\",\n            \"label\": \"平城区\"\n          },\n          {\n            \"value\": \"140214\",\n            \"label\": \"云冈区\"\n          },\n          {\n            \"value\": \"140215\",\n            \"label\": \"云州区\"\n          },\n          {\n            \"value\": \"140221\",\n            \"label\": \"阳高县\"\n          },\n          {\n            \"value\": \"140222\",\n            \"label\": \"天镇县\"\n          },\n          {\n            \"value\": \"140223\",\n            \"label\": \"广灵县\"\n          },\n          {\n            \"value\": \"140224\",\n            \"label\": \"灵丘县\"\n          },\n          {\n            \"value\": \"140225\",\n            \"label\": \"浑源县\"\n          },\n          {\n            \"value\": \"140226\",\n            \"label\": \"左云县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"140300\",\n        \"label\": \"阳泉市\",\n        \"children\": [\n          {\n            \"value\": \"140302\",\n            \"label\": \"城区\"\n          },\n          {\n            \"value\": \"140303\",\n            \"label\": \"矿区\"\n          },\n          {\n            \"value\": \"140311\",\n            \"label\": \"郊区\"\n          },\n          {\n            \"value\": \"140321\",\n            \"label\": \"平定县\"\n          },\n          {\n            \"value\": \"140322\",\n            \"label\": \"盂县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"140400\",\n        \"label\": \"长治市\",\n        \"children\": [\n          {\n            \"value\": \"140402\",\n            \"label\": \"城区\"\n          },\n          {\n            \"value\": \"140411\",\n            \"label\": \"郊区\"\n          },\n          {\n            \"value\": \"140421\",\n            \"label\": \"长治县\"\n          },\n          {\n            \"value\": \"140423\",\n            \"label\": \"襄垣县\"\n          },\n          {\n            \"value\": \"140424\",\n            \"label\": \"屯留县\"\n          },\n          {\n            \"value\": \"140425\",\n            \"label\": \"平顺县\"\n          },\n          {\n            \"value\": \"140426\",\n            \"label\": \"黎城县\"\n          },\n          {\n            \"value\": \"140427\",\n            \"label\": \"壶关县\"\n          },\n          {\n            \"value\": \"140428\",\n            \"label\": \"长子县\"\n          },\n          {\n            \"value\": \"140429\",\n            \"label\": \"武乡县\"\n          },\n          {\n            \"value\": \"140430\",\n            \"label\": \"沁县\"\n          },\n          {\n            \"value\": \"140431\",\n            \"label\": \"沁源县\"\n          },\n          {\n            \"value\": \"140481\",\n            \"label\": \"潞城市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"140500\",\n        \"label\": \"晋城市\",\n        \"children\": [\n          {\n            \"value\": \"140502\",\n            \"label\": \"城区\"\n          },\n          {\n            \"value\": \"140521\",\n            \"label\": \"沁水县\"\n          },\n          {\n            \"value\": \"140522\",\n            \"label\": \"阳城县\"\n          },\n          {\n            \"value\": \"140524\",\n            \"label\": \"陵川县\"\n          },\n          {\n            \"value\": \"140525\",\n            \"label\": \"泽州县\"\n          },\n          {\n            \"value\": \"140581\",\n            \"label\": \"高平市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"140600\",\n        \"label\": \"朔州市\",\n        \"children\": [\n          {\n            \"value\": \"140602\",\n            \"label\": \"朔城区\"\n          },\n          {\n            \"value\": \"140603\",\n            \"label\": \"平鲁区\"\n          },\n          {\n            \"value\": \"140621\",\n            \"label\": \"山阴县\"\n          },\n          {\n            \"value\": \"140622\",\n            \"label\": \"应县\"\n          },\n          {\n            \"value\": \"140623\",\n            \"label\": \"右玉县\"\n          },\n          {\n            \"value\": \"140681\",\n            \"label\": \"怀仁市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"140700\",\n        \"label\": \"晋中市\",\n        \"children\": [\n          {\n            \"value\": \"140702\",\n            \"label\": \"榆次区\"\n          },\n          {\n            \"value\": \"140721\",\n            \"label\": \"榆社县\"\n          },\n          {\n            \"value\": \"140722\",\n            \"label\": \"左权县\"\n          },\n          {\n            \"value\": \"140723\",\n            \"label\": \"和顺县\"\n          },\n          {\n            \"value\": \"140724\",\n            \"label\": \"昔阳县\"\n          },\n          {\n            \"value\": \"140725\",\n            \"label\": \"寿阳县\"\n          },\n          {\n            \"value\": \"140726\",\n            \"label\": \"太谷县\"\n          },\n          {\n            \"value\": \"140727\",\n            \"label\": \"祁县\"\n          },\n          {\n            \"value\": \"140728\",\n            \"label\": \"平遥县\"\n          },\n          {\n            \"value\": \"140729\",\n            \"label\": \"灵石县\"\n          },\n          {\n            \"value\": \"140781\",\n            \"label\": \"介休市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"140800\",\n        \"label\": \"运城市\",\n        \"children\": [\n          {\n            \"value\": \"140802\",\n            \"label\": \"盐湖区\"\n          },\n          {\n            \"value\": \"140821\",\n            \"label\": \"临猗县\"\n          },\n          {\n            \"value\": \"140822\",\n            \"label\": \"万荣县\"\n          },\n          {\n            \"value\": \"140823\",\n            \"label\": \"闻喜县\"\n          },\n          {\n            \"value\": \"140824\",\n            \"label\": \"稷山县\"\n          },\n          {\n            \"value\": \"140825\",\n            \"label\": \"新绛县\"\n          },\n          {\n            \"value\": \"140826\",\n            \"label\": \"绛县\"\n          },\n          {\n            \"value\": \"140827\",\n            \"label\": \"垣曲县\"\n          },\n          {\n            \"value\": \"140828\",\n            \"label\": \"夏县\"\n          },\n          {\n            \"value\": \"140829\",\n            \"label\": \"平陆县\"\n          },\n          {\n            \"value\": \"140830\",\n            \"label\": \"芮城县\"\n          },\n          {\n            \"value\": \"140881\",\n            \"label\": \"永济市\"\n          },\n          {\n            \"value\": \"140882\",\n            \"label\": \"河津市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"140900\",\n        \"label\": \"忻州市\",\n        \"children\": [\n          {\n            \"value\": \"140902\",\n            \"label\": \"忻府区\"\n          },\n          {\n            \"value\": \"140921\",\n            \"label\": \"定襄县\"\n          },\n          {\n            \"value\": \"140922\",\n            \"label\": \"五台县\"\n          },\n          {\n            \"value\": \"140923\",\n            \"label\": \"代县\"\n          },\n          {\n            \"value\": \"140924\",\n            \"label\": \"繁峙县\"\n          },\n          {\n            \"value\": \"140925\",\n            \"label\": \"宁武县\"\n          },\n          {\n            \"value\": \"140926\",\n            \"label\": \"静乐县\"\n          },\n          {\n            \"value\": \"140927\",\n            \"label\": \"神池县\"\n          },\n          {\n            \"value\": \"140928\",\n            \"label\": \"五寨县\"\n          },\n          {\n            \"value\": \"140929\",\n            \"label\": \"岢岚县\"\n          },\n          {\n            \"value\": \"140930\",\n            \"label\": \"河曲县\"\n          },\n          {\n            \"value\": \"140931\",\n            \"label\": \"保德县\"\n          },\n          {\n            \"value\": \"140932\",\n            \"label\": \"偏关县\"\n          },\n          {\n            \"value\": \"140981\",\n            \"label\": \"原平市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"141000\",\n        \"label\": \"临汾市\",\n        \"children\": [\n          {\n            \"value\": \"141002\",\n            \"label\": \"尧都区\"\n          },\n          {\n            \"value\": \"141021\",\n            \"label\": \"曲沃县\"\n          },\n          {\n            \"value\": \"141022\",\n            \"label\": \"翼城县\"\n          },\n          {\n            \"value\": \"141023\",\n            \"label\": \"襄汾县\"\n          },\n          {\n            \"value\": \"141024\",\n            \"label\": \"洪洞县\"\n          },\n          {\n            \"value\": \"141025\",\n            \"label\": \"古县\"\n          },\n          {\n            \"value\": \"141026\",\n            \"label\": \"安泽县\"\n          },\n          {\n            \"value\": \"141027\",\n            \"label\": \"浮山县\"\n          },\n          {\n            \"value\": \"141028\",\n            \"label\": \"吉县\"\n          },\n          {\n            \"value\": \"141029\",\n            \"label\": \"乡宁县\"\n          },\n          {\n            \"value\": \"141030\",\n            \"label\": \"大宁县\"\n          },\n          {\n            \"value\": \"141031\",\n            \"label\": \"隰县\"\n          },\n          {\n            \"value\": \"141032\",\n            \"label\": \"永和县\"\n          },\n          {\n            \"value\": \"141033\",\n            \"label\": \"蒲县\"\n          },\n          {\n            \"value\": \"141034\",\n            \"label\": \"汾西县\"\n          },\n          {\n            \"value\": \"141081\",\n            \"label\": \"侯马市\"\n          },\n          {\n            \"value\": \"141082\",\n            \"label\": \"霍州市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"141100\",\n        \"label\": \"吕梁市\",\n        \"children\": [\n          {\n            \"value\": \"141102\",\n            \"label\": \"离石区\"\n          },\n          {\n            \"value\": \"141121\",\n            \"label\": \"文水县\"\n          },\n          {\n            \"value\": \"141122\",\n            \"label\": \"交城县\"\n          },\n          {\n            \"value\": \"141123\",\n            \"label\": \"兴县\"\n          },\n          {\n            \"value\": \"141124\",\n            \"label\": \"临县\"\n          },\n          {\n            \"value\": \"141125\",\n            \"label\": \"柳林县\"\n          },\n          {\n            \"value\": \"141126\",\n            \"label\": \"石楼县\"\n          },\n          {\n            \"value\": \"141127\",\n            \"label\": \"岚县\"\n          },\n          {\n            \"value\": \"141128\",\n            \"label\": \"方山县\"\n          },\n          {\n            \"value\": \"141129\",\n            \"label\": \"中阳县\"\n          },\n          {\n            \"value\": \"141130\",\n            \"label\": \"交口县\"\n          },\n          {\n            \"value\": \"141181\",\n            \"label\": \"孝义市\"\n          },\n          {\n            \"value\": \"141182\",\n            \"label\": \"汾阳市\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"150000\",\n    \"label\": \"内蒙古自治区\",\n    \"children\": [\n      {\n        \"value\": \"150100\",\n        \"label\": \"呼和浩特市\",\n        \"children\": [\n          {\n            \"value\": \"150102\",\n            \"label\": \"新城区\"\n          },\n          {\n            \"value\": \"150103\",\n            \"label\": \"回民区\"\n          },\n          {\n            \"value\": \"150104\",\n            \"label\": \"玉泉区\"\n          },\n          {\n            \"value\": \"150105\",\n            \"label\": \"赛罕区\"\n          },\n          {\n            \"value\": \"150121\",\n            \"label\": \"土默特左旗\"\n          },\n          {\n            \"value\": \"150122\",\n            \"label\": \"托克托县\"\n          },\n          {\n            \"value\": \"150123\",\n            \"label\": \"和林格尔县\"\n          },\n          {\n            \"value\": \"150124\",\n            \"label\": \"清水河县\"\n          },\n          {\n            \"value\": \"150125\",\n            \"label\": \"武川县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"150200\",\n        \"label\": \"包头市\",\n        \"children\": [\n          {\n            \"value\": \"150202\",\n            \"label\": \"东河区\"\n          },\n          {\n            \"value\": \"150203\",\n            \"label\": \"昆都仑区\"\n          },\n          {\n            \"value\": \"150204\",\n            \"label\": \"青山区\"\n          },\n          {\n            \"value\": \"150205\",\n            \"label\": \"石拐区\"\n          },\n          {\n            \"value\": \"150206\",\n            \"label\": \"白云鄂博矿区\"\n          },\n          {\n            \"value\": \"150207\",\n            \"label\": \"九原区\"\n          },\n          {\n            \"value\": \"150221\",\n            \"label\": \"土默特右旗\"\n          },\n          {\n            \"value\": \"150222\",\n            \"label\": \"固阳县\"\n          },\n          {\n            \"value\": \"150223\",\n            \"label\": \"达尔罕茂明安联合旗\"\n          }\n        ]\n      },\n      {\n        \"value\": \"150300\",\n        \"label\": \"乌海市\",\n        \"children\": [\n          {\n            \"value\": \"150302\",\n            \"label\": \"海勃湾区\"\n          },\n          {\n            \"value\": \"150303\",\n            \"label\": \"海南区\"\n          },\n          {\n            \"value\": \"150304\",\n            \"label\": \"乌达区\"\n          }\n        ]\n      },\n      {\n        \"value\": \"150400\",\n        \"label\": \"赤峰市\",\n        \"children\": [\n          {\n            \"value\": \"150402\",\n            \"label\": \"红山区\"\n          },\n          {\n            \"value\": \"150403\",\n            \"label\": \"元宝山区\"\n          },\n          {\n            \"value\": \"150404\",\n            \"label\": \"松山区\"\n          },\n          {\n            \"value\": \"150421\",\n            \"label\": \"阿鲁科尔沁旗\"\n          },\n          {\n            \"value\": \"150422\",\n            \"label\": \"巴林左旗\"\n          },\n          {\n            \"value\": \"150423\",\n            \"label\": \"巴林右旗\"\n          },\n          {\n            \"value\": \"150424\",\n            \"label\": \"林西县\"\n          },\n          {\n            \"value\": \"150425\",\n            \"label\": \"克什克腾旗\"\n          },\n          {\n            \"value\": \"150426\",\n            \"label\": \"翁牛特旗\"\n          },\n          {\n            \"value\": \"150428\",\n            \"label\": \"喀喇沁旗\"\n          },\n          {\n            \"value\": \"150429\",\n            \"label\": \"宁城县\"\n          },\n          {\n            \"value\": \"150430\",\n            \"label\": \"敖汉旗\"\n          }\n        ]\n      },\n      {\n        \"value\": \"150500\",\n        \"label\": \"通辽市\",\n        \"children\": [\n          {\n            \"value\": \"150502\",\n            \"label\": \"科尔沁区\"\n          },\n          {\n            \"value\": \"150521\",\n            \"label\": \"科尔沁左翼中旗\"\n          },\n          {\n            \"value\": \"150522\",\n            \"label\": \"科尔沁左翼后旗\"\n          },\n          {\n            \"value\": \"150523\",\n            \"label\": \"开鲁县\"\n          },\n          {\n            \"value\": \"150524\",\n            \"label\": \"库伦旗\"\n          },\n          {\n            \"value\": \"150525\",\n            \"label\": \"奈曼旗\"\n          },\n          {\n            \"value\": \"150526\",\n            \"label\": \"扎鲁特旗\"\n          },\n          {\n            \"value\": \"150581\",\n            \"label\": \"霍林郭勒市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"150600\",\n        \"label\": \"鄂尔多斯市\",\n        \"children\": [\n          {\n            \"value\": \"150602\",\n            \"label\": \"东胜区\"\n          },\n          {\n            \"value\": \"150603\",\n            \"label\": \"康巴什区\"\n          },\n          {\n            \"value\": \"150621\",\n            \"label\": \"达拉特旗\"\n          },\n          {\n            \"value\": \"150622\",\n            \"label\": \"准格尔旗\"\n          },\n          {\n            \"value\": \"150623\",\n            \"label\": \"鄂托克前旗\"\n          },\n          {\n            \"value\": \"150624\",\n            \"label\": \"鄂托克旗\"\n          },\n          {\n            \"value\": \"150625\",\n            \"label\": \"杭锦旗\"\n          },\n          {\n            \"value\": \"150626\",\n            \"label\": \"乌审旗\"\n          },\n          {\n            \"value\": \"150627\",\n            \"label\": \"伊金霍洛旗\"\n          }\n        ]\n      },\n      {\n        \"value\": \"150700\",\n        \"label\": \"呼伦贝尔市\",\n        \"children\": [\n          {\n            \"value\": \"150702\",\n            \"label\": \"海拉尔区\"\n          },\n          {\n            \"value\": \"150703\",\n            \"label\": \"扎赉诺尔区\"\n          },\n          {\n            \"value\": \"150721\",\n            \"label\": \"阿荣旗\"\n          },\n          {\n            \"value\": \"150722\",\n            \"label\": \"莫力达瓦达斡尔族自治旗\"\n          },\n          {\n            \"value\": \"150723\",\n            \"label\": \"鄂伦春自治旗\"\n          },\n          {\n            \"value\": \"150724\",\n            \"label\": \"鄂温克族自治旗\"\n          },\n          {\n            \"value\": \"150725\",\n            \"label\": \"陈巴尔虎旗\"\n          },\n          {\n            \"value\": \"150726\",\n            \"label\": \"新巴尔虎左旗\"\n          },\n          {\n            \"value\": \"150727\",\n            \"label\": \"新巴尔虎右旗\"\n          },\n          {\n            \"value\": \"150781\",\n            \"label\": \"满洲里市\"\n          },\n          {\n            \"value\": \"150782\",\n            \"label\": \"牙克石市\"\n          },\n          {\n            \"value\": \"150783\",\n            \"label\": \"扎兰屯市\"\n          },\n          {\n            \"value\": \"150784\",\n            \"label\": \"额尔古纳市\"\n          },\n          {\n            \"value\": \"150785\",\n            \"label\": \"根河市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"150800\",\n        \"label\": \"巴彦淖尔市\",\n        \"children\": [\n          {\n            \"value\": \"150802\",\n            \"label\": \"临河区\"\n          },\n          {\n            \"value\": \"150821\",\n            \"label\": \"五原县\"\n          },\n          {\n            \"value\": \"150822\",\n            \"label\": \"磴口县\"\n          },\n          {\n            \"value\": \"150823\",\n            \"label\": \"乌拉特前旗\"\n          },\n          {\n            \"value\": \"150824\",\n            \"label\": \"乌拉特中旗\"\n          },\n          {\n            \"value\": \"150825\",\n            \"label\": \"乌拉特后旗\"\n          },\n          {\n            \"value\": \"150826\",\n            \"label\": \"杭锦后旗\"\n          }\n        ]\n      },\n      {\n        \"value\": \"150900\",\n        \"label\": \"乌兰察布市\",\n        \"children\": [\n          {\n            \"value\": \"150902\",\n            \"label\": \"集宁区\"\n          },\n          {\n            \"value\": \"150921\",\n            \"label\": \"卓资县\"\n          },\n          {\n            \"value\": \"150922\",\n            \"label\": \"化德县\"\n          },\n          {\n            \"value\": \"150923\",\n            \"label\": \"商都县\"\n          },\n          {\n            \"value\": \"150924\",\n            \"label\": \"兴和县\"\n          },\n          {\n            \"value\": \"150925\",\n            \"label\": \"凉城县\"\n          },\n          {\n            \"value\": \"150926\",\n            \"label\": \"察哈尔右翼前旗\"\n          },\n          {\n            \"value\": \"150927\",\n            \"label\": \"察哈尔右翼中旗\"\n          },\n          {\n            \"value\": \"150928\",\n            \"label\": \"察哈尔右翼后旗\"\n          },\n          {\n            \"value\": \"150929\",\n            \"label\": \"四子王旗\"\n          },\n          {\n            \"value\": \"150981\",\n            \"label\": \"丰镇市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"152200\",\n        \"label\": \"兴安盟\",\n        \"children\": [\n          {\n            \"value\": \"152201\",\n            \"label\": \"乌兰浩特市\"\n          },\n          {\n            \"value\": \"152202\",\n            \"label\": \"阿尔山市\"\n          },\n          {\n            \"value\": \"152221\",\n            \"label\": \"科尔沁右翼前旗\"\n          },\n          {\n            \"value\": \"152222\",\n            \"label\": \"科尔沁右翼中旗\"\n          },\n          {\n            \"value\": \"152223\",\n            \"label\": \"扎赉特旗\"\n          },\n          {\n            \"value\": \"152224\",\n            \"label\": \"突泉县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"152500\",\n        \"label\": \"锡林郭勒盟\",\n        \"children\": [\n          {\n            \"value\": \"152501\",\n            \"label\": \"二连浩特市\"\n          },\n          {\n            \"value\": \"152502\",\n            \"label\": \"锡林浩特市\"\n          },\n          {\n            \"value\": \"152522\",\n            \"label\": \"阿巴嘎旗\"\n          },\n          {\n            \"value\": \"152523\",\n            \"label\": \"苏尼特左旗\"\n          },\n          {\n            \"value\": \"152524\",\n            \"label\": \"苏尼特右旗\"\n          },\n          {\n            \"value\": \"152525\",\n            \"label\": \"东乌珠穆沁旗\"\n          },\n          {\n            \"value\": \"152526\",\n            \"label\": \"西乌珠穆沁旗\"\n          },\n          {\n            \"value\": \"152527\",\n            \"label\": \"太仆寺旗\"\n          },\n          {\n            \"value\": \"152528\",\n            \"label\": \"镶黄旗\"\n          },\n          {\n            \"value\": \"152529\",\n            \"label\": \"正镶白旗\"\n          },\n          {\n            \"value\": \"152530\",\n            \"label\": \"正蓝旗\"\n          },\n          {\n            \"value\": \"152531\",\n            \"label\": \"多伦县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"152900\",\n        \"label\": \"阿拉善盟\",\n        \"children\": [\n          {\n            \"value\": \"152921\",\n            \"label\": \"阿拉善左旗\"\n          },\n          {\n            \"value\": \"152922\",\n            \"label\": \"阿拉善右旗\"\n          },\n          {\n            \"value\": \"152923\",\n            \"label\": \"额济纳旗\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"210000\",\n    \"label\": \"辽宁省\",\n    \"children\": [\n      {\n        \"value\": \"210100\",\n        \"label\": \"沈阳市\",\n        \"children\": [\n          {\n            \"value\": \"210102\",\n            \"label\": \"和平区\"\n          },\n          {\n            \"value\": \"210103\",\n            \"label\": \"沈河区\"\n          },\n          {\n            \"value\": \"210104\",\n            \"label\": \"大东区\"\n          },\n          {\n            \"value\": \"210105\",\n            \"label\": \"皇姑区\"\n          },\n          {\n            \"value\": \"210106\",\n            \"label\": \"铁西区\"\n          },\n          {\n            \"value\": \"210111\",\n            \"label\": \"苏家屯区\"\n          },\n          {\n            \"value\": \"210112\",\n            \"label\": \"浑南区\"\n          },\n          {\n            \"value\": \"210113\",\n            \"label\": \"沈北新区\"\n          },\n          {\n            \"value\": \"210114\",\n            \"label\": \"于洪区\"\n          },\n          {\n            \"value\": \"210115\",\n            \"label\": \"辽中区\"\n          },\n          {\n            \"value\": \"210123\",\n            \"label\": \"康平县\"\n          },\n          {\n            \"value\": \"210124\",\n            \"label\": \"法库县\"\n          },\n          {\n            \"value\": \"210181\",\n            \"label\": \"新民市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"210200\",\n        \"label\": \"大连市\",\n        \"children\": [\n          {\n            \"value\": \"210202\",\n            \"label\": \"中山区\"\n          },\n          {\n            \"value\": \"210203\",\n            \"label\": \"西岗区\"\n          },\n          {\n            \"value\": \"210204\",\n            \"label\": \"沙河口区\"\n          },\n          {\n            \"value\": \"210211\",\n            \"label\": \"甘井子区\"\n          },\n          {\n            \"value\": \"210212\",\n            \"label\": \"旅顺口区\"\n          },\n          {\n            \"value\": \"210213\",\n            \"label\": \"金州区\"\n          },\n          {\n            \"value\": \"210214\",\n            \"label\": \"普兰店区\"\n          },\n          {\n            \"value\": \"210224\",\n            \"label\": \"长海县\"\n          },\n          {\n            \"value\": \"210281\",\n            \"label\": \"瓦房店市\"\n          },\n          {\n            \"value\": \"210283\",\n            \"label\": \"庄河市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"210300\",\n        \"label\": \"鞍山市\",\n        \"children\": [\n          {\n            \"value\": \"210302\",\n            \"label\": \"铁东区\"\n          },\n          {\n            \"value\": \"210303\",\n            \"label\": \"铁西区\"\n          },\n          {\n            \"value\": \"210304\",\n            \"label\": \"立山区\"\n          },\n          {\n            \"value\": \"210311\",\n            \"label\": \"千山区\"\n          },\n          {\n            \"value\": \"210321\",\n            \"label\": \"台安县\"\n          },\n          {\n            \"value\": \"210323\",\n            \"label\": \"岫岩满族自治县\"\n          },\n          {\n            \"value\": \"210381\",\n            \"label\": \"海城市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"210400\",\n        \"label\": \"抚顺市\",\n        \"children\": [\n          {\n            \"value\": \"210402\",\n            \"label\": \"新抚区\"\n          },\n          {\n            \"value\": \"210403\",\n            \"label\": \"东洲区\"\n          },\n          {\n            \"value\": \"210404\",\n            \"label\": \"望花区\"\n          },\n          {\n            \"value\": \"210411\",\n            \"label\": \"顺城区\"\n          },\n          {\n            \"value\": \"210421\",\n            \"label\": \"抚顺县\"\n          },\n          {\n            \"value\": \"210422\",\n            \"label\": \"新宾满族自治县\"\n          },\n          {\n            \"value\": \"210423\",\n            \"label\": \"清原满族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"210500\",\n        \"label\": \"本溪市\",\n        \"children\": [\n          {\n            \"value\": \"210502\",\n            \"label\": \"平山区\"\n          },\n          {\n            \"value\": \"210503\",\n            \"label\": \"溪湖区\"\n          },\n          {\n            \"value\": \"210504\",\n            \"label\": \"明山区\"\n          },\n          {\n            \"value\": \"210505\",\n            \"label\": \"南芬区\"\n          },\n          {\n            \"value\": \"210521\",\n            \"label\": \"本溪满族自治县\"\n          },\n          {\n            \"value\": \"210522\",\n            \"label\": \"桓仁满族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"210600\",\n        \"label\": \"丹东市\",\n        \"children\": [\n          {\n            \"value\": \"210602\",\n            \"label\": \"元宝区\"\n          },\n          {\n            \"value\": \"210603\",\n            \"label\": \"振兴区\"\n          },\n          {\n            \"value\": \"210604\",\n            \"label\": \"振安区\"\n          },\n          {\n            \"value\": \"210624\",\n            \"label\": \"宽甸满族自治县\"\n          },\n          {\n            \"value\": \"210681\",\n            \"label\": \"东港市\"\n          },\n          {\n            \"value\": \"210682\",\n            \"label\": \"凤城市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"210700\",\n        \"label\": \"锦州市\",\n        \"children\": [\n          {\n            \"value\": \"210702\",\n            \"label\": \"古塔区\"\n          },\n          {\n            \"value\": \"210703\",\n            \"label\": \"凌河区\"\n          },\n          {\n            \"value\": \"210711\",\n            \"label\": \"太和区\"\n          },\n          {\n            \"value\": \"210726\",\n            \"label\": \"黑山县\"\n          },\n          {\n            \"value\": \"210727\",\n            \"label\": \"义县\"\n          },\n          {\n            \"value\": \"210781\",\n            \"label\": \"凌海市\"\n          },\n          {\n            \"value\": \"210782\",\n            \"label\": \"北镇市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"210800\",\n        \"label\": \"营口市\",\n        \"children\": [\n          {\n            \"value\": \"210802\",\n            \"label\": \"站前区\"\n          },\n          {\n            \"value\": \"210803\",\n            \"label\": \"西市区\"\n          },\n          {\n            \"value\": \"210804\",\n            \"label\": \"鲅鱼圈区\"\n          },\n          {\n            \"value\": \"210811\",\n            \"label\": \"老边区\"\n          },\n          {\n            \"value\": \"210881\",\n            \"label\": \"盖州市\"\n          },\n          {\n            \"value\": \"210882\",\n            \"label\": \"大石桥市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"210900\",\n        \"label\": \"阜新市\",\n        \"children\": [\n          {\n            \"value\": \"210902\",\n            \"label\": \"海州区\"\n          },\n          {\n            \"value\": \"210903\",\n            \"label\": \"新邱区\"\n          },\n          {\n            \"value\": \"210904\",\n            \"label\": \"太平区\"\n          },\n          {\n            \"value\": \"210905\",\n            \"label\": \"清河门区\"\n          },\n          {\n            \"value\": \"210911\",\n            \"label\": \"细河区\"\n          },\n          {\n            \"value\": \"210921\",\n            \"label\": \"阜新蒙古族自治县\"\n          },\n          {\n            \"value\": \"210922\",\n            \"label\": \"彰武县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"211000\",\n        \"label\": \"辽阳市\",\n        \"children\": [\n          {\n            \"value\": \"211002\",\n            \"label\": \"白塔区\"\n          },\n          {\n            \"value\": \"211003\",\n            \"label\": \"文圣区\"\n          },\n          {\n            \"value\": \"211004\",\n            \"label\": \"宏伟区\"\n          },\n          {\n            \"value\": \"211005\",\n            \"label\": \"弓长岭区\"\n          },\n          {\n            \"value\": \"211011\",\n            \"label\": \"太子河区\"\n          },\n          {\n            \"value\": \"211021\",\n            \"label\": \"辽阳县\"\n          },\n          {\n            \"value\": \"211081\",\n            \"label\": \"灯塔市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"211100\",\n        \"label\": \"盘锦市\",\n        \"children\": [\n          {\n            \"value\": \"211102\",\n            \"label\": \"双台子区\"\n          },\n          {\n            \"value\": \"211103\",\n            \"label\": \"兴隆台区\"\n          },\n          {\n            \"value\": \"211104\",\n            \"label\": \"大洼区\"\n          },\n          {\n            \"value\": \"211122\",\n            \"label\": \"盘山县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"211200\",\n        \"label\": \"铁岭市\",\n        \"children\": [\n          {\n            \"value\": \"211202\",\n            \"label\": \"银州区\"\n          },\n          {\n            \"value\": \"211204\",\n            \"label\": \"清河区\"\n          },\n          {\n            \"value\": \"211221\",\n            \"label\": \"铁岭县\"\n          },\n          {\n            \"value\": \"211223\",\n            \"label\": \"西丰县\"\n          },\n          {\n            \"value\": \"211224\",\n            \"label\": \"昌图县\"\n          },\n          {\n            \"value\": \"211281\",\n            \"label\": \"调兵山市\"\n          },\n          {\n            \"value\": \"211282\",\n            \"label\": \"开原市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"211300\",\n        \"label\": \"朝阳市\",\n        \"children\": [\n          {\n            \"value\": \"211302\",\n            \"label\": \"双塔区\"\n          },\n          {\n            \"value\": \"211303\",\n            \"label\": \"龙城区\"\n          },\n          {\n            \"value\": \"211321\",\n            \"label\": \"朝阳县\"\n          },\n          {\n            \"value\": \"211322\",\n            \"label\": \"建平县\"\n          },\n          {\n            \"value\": \"211324\",\n            \"label\": \"喀喇沁左翼蒙古族自治县\"\n          },\n          {\n            \"value\": \"211381\",\n            \"label\": \"北票市\"\n          },\n          {\n            \"value\": \"211382\",\n            \"label\": \"凌源市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"211400\",\n        \"label\": \"葫芦岛市\",\n        \"children\": [\n          {\n            \"value\": \"211402\",\n            \"label\": \"连山区\"\n          },\n          {\n            \"value\": \"211403\",\n            \"label\": \"龙港区\"\n          },\n          {\n            \"value\": \"211404\",\n            \"label\": \"南票区\"\n          },\n          {\n            \"value\": \"211421\",\n            \"label\": \"绥中县\"\n          },\n          {\n            \"value\": \"211422\",\n            \"label\": \"建昌县\"\n          },\n          {\n            \"value\": \"211481\",\n            \"label\": \"兴城市\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"220000\",\n    \"label\": \"吉林省\",\n    \"children\": [\n      {\n        \"value\": \"220100\",\n        \"label\": \"长春市\",\n        \"children\": [\n          {\n            \"value\": \"220102\",\n            \"label\": \"南关区\"\n          },\n          {\n            \"value\": \"220103\",\n            \"label\": \"宽城区\"\n          },\n          {\n            \"value\": \"220104\",\n            \"label\": \"朝阳区\"\n          },\n          {\n            \"value\": \"220105\",\n            \"label\": \"二道区\"\n          },\n          {\n            \"value\": \"220106\",\n            \"label\": \"绿园区\"\n          },\n          {\n            \"value\": \"220112\",\n            \"label\": \"双阳区\"\n          },\n          {\n            \"value\": \"220113\",\n            \"label\": \"九台区\"\n          },\n          {\n            \"value\": \"220122\",\n            \"label\": \"农安县\"\n          },\n          {\n            \"value\": \"220182\",\n            \"label\": \"榆树市\"\n          },\n          {\n            \"value\": \"220183\",\n            \"label\": \"德惠市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"220200\",\n        \"label\": \"吉林市\",\n        \"children\": [\n          {\n            \"value\": \"220202\",\n            \"label\": \"昌邑区\"\n          },\n          {\n            \"value\": \"220203\",\n            \"label\": \"龙潭区\"\n          },\n          {\n            \"value\": \"220204\",\n            \"label\": \"船营区\"\n          },\n          {\n            \"value\": \"220211\",\n            \"label\": \"丰满区\"\n          },\n          {\n            \"value\": \"220221\",\n            \"label\": \"永吉县\"\n          },\n          {\n            \"value\": \"220281\",\n            \"label\": \"蛟河市\"\n          },\n          {\n            \"value\": \"220282\",\n            \"label\": \"桦甸市\"\n          },\n          {\n            \"value\": \"220283\",\n            \"label\": \"舒兰市\"\n          },\n          {\n            \"value\": \"220284\",\n            \"label\": \"磐石市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"220300\",\n        \"label\": \"四平市\",\n        \"children\": [\n          {\n            \"value\": \"220302\",\n            \"label\": \"铁西区\"\n          },\n          {\n            \"value\": \"220303\",\n            \"label\": \"铁东区\"\n          },\n          {\n            \"value\": \"220322\",\n            \"label\": \"梨树县\"\n          },\n          {\n            \"value\": \"220323\",\n            \"label\": \"伊通满族自治县\"\n          },\n          {\n            \"value\": \"220381\",\n            \"label\": \"公主岭市\"\n          },\n          {\n            \"value\": \"220382\",\n            \"label\": \"双辽市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"220400\",\n        \"label\": \"辽源市\",\n        \"children\": [\n          {\n            \"value\": \"220402\",\n            \"label\": \"龙山区\"\n          },\n          {\n            \"value\": \"220403\",\n            \"label\": \"西安区\"\n          },\n          {\n            \"value\": \"220421\",\n            \"label\": \"东丰县\"\n          },\n          {\n            \"value\": \"220422\",\n            \"label\": \"东辽县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"220500\",\n        \"label\": \"通化市\",\n        \"children\": [\n          {\n            \"value\": \"220502\",\n            \"label\": \"东昌区\"\n          },\n          {\n            \"value\": \"220503\",\n            \"label\": \"二道江区\"\n          },\n          {\n            \"value\": \"220521\",\n            \"label\": \"通化县\"\n          },\n          {\n            \"value\": \"220523\",\n            \"label\": \"辉南县\"\n          },\n          {\n            \"value\": \"220524\",\n            \"label\": \"柳河县\"\n          },\n          {\n            \"value\": \"220581\",\n            \"label\": \"梅河口市\"\n          },\n          {\n            \"value\": \"220582\",\n            \"label\": \"集安市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"220600\",\n        \"label\": \"白山市\",\n        \"children\": [\n          {\n            \"value\": \"220602\",\n            \"label\": \"浑江区\"\n          },\n          {\n            \"value\": \"220605\",\n            \"label\": \"江源区\"\n          },\n          {\n            \"value\": \"220621\",\n            \"label\": \"抚松县\"\n          },\n          {\n            \"value\": \"220622\",\n            \"label\": \"靖宇县\"\n          },\n          {\n            \"value\": \"220623\",\n            \"label\": \"长白朝鲜族自治县\"\n          },\n          {\n            \"value\": \"220681\",\n            \"label\": \"临江市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"220700\",\n        \"label\": \"松原市\",\n        \"children\": [\n          {\n            \"value\": \"220702\",\n            \"label\": \"宁江区\"\n          },\n          {\n            \"value\": \"220721\",\n            \"label\": \"前郭尔罗斯蒙古族自治县\"\n          },\n          {\n            \"value\": \"220722\",\n            \"label\": \"长岭县\"\n          },\n          {\n            \"value\": \"220723\",\n            \"label\": \"乾安县\"\n          },\n          {\n            \"value\": \"220781\",\n            \"label\": \"扶余市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"220800\",\n        \"label\": \"白城市\",\n        \"children\": [\n          {\n            \"value\": \"220802\",\n            \"label\": \"洮北区\"\n          },\n          {\n            \"value\": \"220821\",\n            \"label\": \"镇赉县\"\n          },\n          {\n            \"value\": \"220822\",\n            \"label\": \"通榆县\"\n          },\n          {\n            \"value\": \"220881\",\n            \"label\": \"洮南市\"\n          },\n          {\n            \"value\": \"220882\",\n            \"label\": \"大安市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"222400\",\n        \"label\": \"延边朝鲜族自治州\",\n        \"children\": [\n          {\n            \"value\": \"222401\",\n            \"label\": \"延吉市\"\n          },\n          {\n            \"value\": \"222402\",\n            \"label\": \"图们市\"\n          },\n          {\n            \"value\": \"222403\",\n            \"label\": \"敦化市\"\n          },\n          {\n            \"value\": \"222404\",\n            \"label\": \"珲春市\"\n          },\n          {\n            \"value\": \"222405\",\n            \"label\": \"龙井市\"\n          },\n          {\n            \"value\": \"222406\",\n            \"label\": \"和龙市\"\n          },\n          {\n            \"value\": \"222424\",\n            \"label\": \"汪清县\"\n          },\n          {\n            \"value\": \"222426\",\n            \"label\": \"安图县\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"230000\",\n    \"label\": \"黑龙江省\",\n    \"children\": [\n      {\n        \"value\": \"230100\",\n        \"label\": \"哈尔滨市\",\n        \"children\": [\n          {\n            \"value\": \"230102\",\n            \"label\": \"道里区\"\n          },\n          {\n            \"value\": \"230103\",\n            \"label\": \"南岗区\"\n          },\n          {\n            \"value\": \"230104\",\n            \"label\": \"道外区\"\n          },\n          {\n            \"value\": \"230108\",\n            \"label\": \"平房区\"\n          },\n          {\n            \"value\": \"230109\",\n            \"label\": \"松北区\"\n          },\n          {\n            \"value\": \"230110\",\n            \"label\": \"香坊区\"\n          },\n          {\n            \"value\": \"230111\",\n            \"label\": \"呼兰区\"\n          },\n          {\n            \"value\": \"230112\",\n            \"label\": \"阿城区\"\n          },\n          {\n            \"value\": \"230113\",\n            \"label\": \"双城区\"\n          },\n          {\n            \"value\": \"230123\",\n            \"label\": \"依兰县\"\n          },\n          {\n            \"value\": \"230124\",\n            \"label\": \"方正县\"\n          },\n          {\n            \"value\": \"230125\",\n            \"label\": \"宾县\"\n          },\n          {\n            \"value\": \"230126\",\n            \"label\": \"巴彦县\"\n          },\n          {\n            \"value\": \"230127\",\n            \"label\": \"木兰县\"\n          },\n          {\n            \"value\": \"230128\",\n            \"label\": \"通河县\"\n          },\n          {\n            \"value\": \"230129\",\n            \"label\": \"延寿县\"\n          },\n          {\n            \"value\": \"230183\",\n            \"label\": \"尚志市\"\n          },\n          {\n            \"value\": \"230184\",\n            \"label\": \"五常市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"230200\",\n        \"label\": \"齐齐哈尔市\",\n        \"children\": [\n          {\n            \"value\": \"230202\",\n            \"label\": \"龙沙区\"\n          },\n          {\n            \"value\": \"230203\",\n            \"label\": \"建华区\"\n          },\n          {\n            \"value\": \"230204\",\n            \"label\": \"铁锋区\"\n          },\n          {\n            \"value\": \"230205\",\n            \"label\": \"昂昂溪区\"\n          },\n          {\n            \"value\": \"230206\",\n            \"label\": \"富拉尔基区\"\n          },\n          {\n            \"value\": \"230207\",\n            \"label\": \"碾子山区\"\n          },\n          {\n            \"value\": \"230208\",\n            \"label\": \"梅里斯达斡尔族区\"\n          },\n          {\n            \"value\": \"230221\",\n            \"label\": \"龙江县\"\n          },\n          {\n            \"value\": \"230223\",\n            \"label\": \"依安县\"\n          },\n          {\n            \"value\": \"230224\",\n            \"label\": \"泰来县\"\n          },\n          {\n            \"value\": \"230225\",\n            \"label\": \"甘南县\"\n          },\n          {\n            \"value\": \"230227\",\n            \"label\": \"富裕县\"\n          },\n          {\n            \"value\": \"230229\",\n            \"label\": \"克山县\"\n          },\n          {\n            \"value\": \"230230\",\n            \"label\": \"克东县\"\n          },\n          {\n            \"value\": \"230231\",\n            \"label\": \"拜泉县\"\n          },\n          {\n            \"value\": \"230281\",\n            \"label\": \"讷河市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"230300\",\n        \"label\": \"鸡西市\",\n        \"children\": [\n          {\n            \"value\": \"230302\",\n            \"label\": \"鸡冠区\"\n          },\n          {\n            \"value\": \"230303\",\n            \"label\": \"恒山区\"\n          },\n          {\n            \"value\": \"230304\",\n            \"label\": \"滴道区\"\n          },\n          {\n            \"value\": \"230305\",\n            \"label\": \"梨树区\"\n          },\n          {\n            \"value\": \"230306\",\n            \"label\": \"城子河区\"\n          },\n          {\n            \"value\": \"230307\",\n            \"label\": \"麻山区\"\n          },\n          {\n            \"value\": \"230321\",\n            \"label\": \"鸡东县\"\n          },\n          {\n            \"value\": \"230381\",\n            \"label\": \"虎林市\"\n          },\n          {\n            \"value\": \"230382\",\n            \"label\": \"密山市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"230400\",\n        \"label\": \"鹤岗市\",\n        \"children\": [\n          {\n            \"value\": \"230402\",\n            \"label\": \"向阳区\"\n          },\n          {\n            \"value\": \"230403\",\n            \"label\": \"工农区\"\n          },\n          {\n            \"value\": \"230404\",\n            \"label\": \"南山区\"\n          },\n          {\n            \"value\": \"230405\",\n            \"label\": \"兴安区\"\n          },\n          {\n            \"value\": \"230406\",\n            \"label\": \"东山区\"\n          },\n          {\n            \"value\": \"230407\",\n            \"label\": \"兴山区\"\n          },\n          {\n            \"value\": \"230421\",\n            \"label\": \"萝北县\"\n          },\n          {\n            \"value\": \"230422\",\n            \"label\": \"绥滨县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"230500\",\n        \"label\": \"双鸭山市\",\n        \"children\": [\n          {\n            \"value\": \"230502\",\n            \"label\": \"尖山区\"\n          },\n          {\n            \"value\": \"230503\",\n            \"label\": \"岭东区\"\n          },\n          {\n            \"value\": \"230505\",\n            \"label\": \"四方台区\"\n          },\n          {\n            \"value\": \"230506\",\n            \"label\": \"宝山区\"\n          },\n          {\n            \"value\": \"230521\",\n            \"label\": \"集贤县\"\n          },\n          {\n            \"value\": \"230522\",\n            \"label\": \"友谊县\"\n          },\n          {\n            \"value\": \"230523\",\n            \"label\": \"宝清县\"\n          },\n          {\n            \"value\": \"230524\",\n            \"label\": \"饶河县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"230600\",\n        \"label\": \"大庆市\",\n        \"children\": [\n          {\n            \"value\": \"230602\",\n            \"label\": \"萨尔图区\"\n          },\n          {\n            \"value\": \"230603\",\n            \"label\": \"龙凤区\"\n          },\n          {\n            \"value\": \"230604\",\n            \"label\": \"让胡路区\"\n          },\n          {\n            \"value\": \"230605\",\n            \"label\": \"红岗区\"\n          },\n          {\n            \"value\": \"230606\",\n            \"label\": \"大同区\"\n          },\n          {\n            \"value\": \"230621\",\n            \"label\": \"肇州县\"\n          },\n          {\n            \"value\": \"230622\",\n            \"label\": \"肇源县\"\n          },\n          {\n            \"value\": \"230623\",\n            \"label\": \"林甸县\"\n          },\n          {\n            \"value\": \"230624\",\n            \"label\": \"杜尔伯特蒙古族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"230700\",\n        \"label\": \"伊春市\",\n        \"children\": [\n          {\n            \"value\": \"230702\",\n            \"label\": \"伊春区\"\n          },\n          {\n            \"value\": \"230703\",\n            \"label\": \"南岔区\"\n          },\n          {\n            \"value\": \"230704\",\n            \"label\": \"友好区\"\n          },\n          {\n            \"value\": \"230705\",\n            \"label\": \"西林区\"\n          },\n          {\n            \"value\": \"230706\",\n            \"label\": \"翠峦区\"\n          },\n          {\n            \"value\": \"230707\",\n            \"label\": \"新青区\"\n          },\n          {\n            \"value\": \"230708\",\n            \"label\": \"美溪区\"\n          },\n          {\n            \"value\": \"230709\",\n            \"label\": \"金山屯区\"\n          },\n          {\n            \"value\": \"230710\",\n            \"label\": \"五营区\"\n          },\n          {\n            \"value\": \"230711\",\n            \"label\": \"乌马河区\"\n          },\n          {\n            \"value\": \"230712\",\n            \"label\": \"汤旺河区\"\n          },\n          {\n            \"value\": \"230713\",\n            \"label\": \"带岭区\"\n          },\n          {\n            \"value\": \"230714\",\n            \"label\": \"乌伊岭区\"\n          },\n          {\n            \"value\": \"230715\",\n            \"label\": \"红星区\"\n          },\n          {\n            \"value\": \"230716\",\n            \"label\": \"上甘岭区\"\n          },\n          {\n            \"value\": \"230722\",\n            \"label\": \"嘉荫县\"\n          },\n          {\n            \"value\": \"230781\",\n            \"label\": \"铁力市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"230800\",\n        \"label\": \"佳木斯市\",\n        \"children\": [\n          {\n            \"value\": \"230803\",\n            \"label\": \"向阳区\"\n          },\n          {\n            \"value\": \"230804\",\n            \"label\": \"前进区\"\n          },\n          {\n            \"value\": \"230805\",\n            \"label\": \"东风区\"\n          },\n          {\n            \"value\": \"230811\",\n            \"label\": \"郊区\"\n          },\n          {\n            \"value\": \"230822\",\n            \"label\": \"桦南县\"\n          },\n          {\n            \"value\": \"230826\",\n            \"label\": \"桦川县\"\n          },\n          {\n            \"value\": \"230828\",\n            \"label\": \"汤原县\"\n          },\n          {\n            \"value\": \"230881\",\n            \"label\": \"同江市\"\n          },\n          {\n            \"value\": \"230882\",\n            \"label\": \"富锦市\"\n          },\n          {\n            \"value\": \"230883\",\n            \"label\": \"抚远市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"230900\",\n        \"label\": \"七台河市\",\n        \"children\": [\n          {\n            \"value\": \"230902\",\n            \"label\": \"新兴区\"\n          },\n          {\n            \"value\": \"230903\",\n            \"label\": \"桃山区\"\n          },\n          {\n            \"value\": \"230904\",\n            \"label\": \"茄子河区\"\n          },\n          {\n            \"value\": \"230921\",\n            \"label\": \"勃利县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"231000\",\n        \"label\": \"牡丹江市\",\n        \"children\": [\n          {\n            \"value\": \"231002\",\n            \"label\": \"东安区\"\n          },\n          {\n            \"value\": \"231003\",\n            \"label\": \"阳明区\"\n          },\n          {\n            \"value\": \"231004\",\n            \"label\": \"爱民区\"\n          },\n          {\n            \"value\": \"231005\",\n            \"label\": \"西安区\"\n          },\n          {\n            \"value\": \"231025\",\n            \"label\": \"林口县\"\n          },\n          {\n            \"value\": \"231081\",\n            \"label\": \"绥芬河市\"\n          },\n          {\n            \"value\": \"231083\",\n            \"label\": \"海林市\"\n          },\n          {\n            \"value\": \"231084\",\n            \"label\": \"宁安市\"\n          },\n          {\n            \"value\": \"231085\",\n            \"label\": \"穆棱市\"\n          },\n          {\n            \"value\": \"231086\",\n            \"label\": \"东宁市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"231100\",\n        \"label\": \"黑河市\",\n        \"children\": [\n          {\n            \"value\": \"231102\",\n            \"label\": \"爱辉区\"\n          },\n          {\n            \"value\": \"231121\",\n            \"label\": \"嫩江县\"\n          },\n          {\n            \"value\": \"231123\",\n            \"label\": \"逊克县\"\n          },\n          {\n            \"value\": \"231124\",\n            \"label\": \"孙吴县\"\n          },\n          {\n            \"value\": \"231181\",\n            \"label\": \"北安市\"\n          },\n          {\n            \"value\": \"231182\",\n            \"label\": \"五大连池市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"231200\",\n        \"label\": \"绥化市\",\n        \"children\": [\n          {\n            \"value\": \"231202\",\n            \"label\": \"北林区\"\n          },\n          {\n            \"value\": \"231221\",\n            \"label\": \"望奎县\"\n          },\n          {\n            \"value\": \"231222\",\n            \"label\": \"兰西县\"\n          },\n          {\n            \"value\": \"231223\",\n            \"label\": \"青冈县\"\n          },\n          {\n            \"value\": \"231224\",\n            \"label\": \"庆安县\"\n          },\n          {\n            \"value\": \"231225\",\n            \"label\": \"明水县\"\n          },\n          {\n            \"value\": \"231226\",\n            \"label\": \"绥棱县\"\n          },\n          {\n            \"value\": \"231281\",\n            \"label\": \"安达市\"\n          },\n          {\n            \"value\": \"231282\",\n            \"label\": \"肇东市\"\n          },\n          {\n            \"value\": \"231283\",\n            \"label\": \"海伦市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"232700\",\n        \"label\": \"大兴安岭地区\",\n        \"children\": [\n          {\n            \"value\": \"232701\",\n            \"label\": \"漠河市\"\n          },\n          {\n            \"value\": \"232721\",\n            \"label\": \"呼玛县\"\n          },\n          {\n            \"value\": \"232722\",\n            \"label\": \"塔河县\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"310000\",\n    \"label\": \"上海市\",\n    \"children\": [\n      {\n        \"value\": \"310000\",\n        \"label\": \"上海市\",\n        \"children\": [\n          {\n            \"value\": \"310101\",\n            \"label\": \"黄浦区\"\n          },\n          {\n            \"value\": \"310104\",\n            \"label\": \"徐汇区\"\n          },\n          {\n            \"value\": \"310105\",\n            \"label\": \"长宁区\"\n          },\n          {\n            \"value\": \"310106\",\n            \"label\": \"静安区\"\n          },\n          {\n            \"value\": \"310107\",\n            \"label\": \"普陀区\"\n          },\n          {\n            \"value\": \"310109\",\n            \"label\": \"虹口区\"\n          },\n          {\n            \"value\": \"310110\",\n            \"label\": \"杨浦区\"\n          },\n          {\n            \"value\": \"310112\",\n            \"label\": \"闵行区\"\n          },\n          {\n            \"value\": \"310113\",\n            \"label\": \"宝山区\"\n          },\n          {\n            \"value\": \"310114\",\n            \"label\": \"嘉定区\"\n          },\n          {\n            \"value\": \"310115\",\n            \"label\": \"浦东新区\"\n          },\n          {\n            \"value\": \"310116\",\n            \"label\": \"金山区\"\n          },\n          {\n            \"value\": \"310117\",\n            \"label\": \"松江区\"\n          },\n          {\n            \"value\": \"310118\",\n            \"label\": \"青浦区\"\n          },\n          {\n            \"value\": \"310120\",\n            \"label\": \"奉贤区\"\n          },\n          {\n            \"value\": \"310151\",\n            \"label\": \"崇明区\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"320000\",\n    \"label\": \"江苏省\",\n    \"children\": [\n      {\n        \"value\": \"320100\",\n        \"label\": \"南京市\",\n        \"children\": [\n          {\n            \"value\": \"320102\",\n            \"label\": \"玄武区\"\n          },\n          {\n            \"value\": \"320104\",\n            \"label\": \"秦淮区\"\n          },\n          {\n            \"value\": \"320105\",\n            \"label\": \"建邺区\"\n          },\n          {\n            \"value\": \"320106\",\n            \"label\": \"鼓楼区\"\n          },\n          {\n            \"value\": \"320111\",\n            \"label\": \"浦口区\"\n          },\n          {\n            \"value\": \"320113\",\n            \"label\": \"栖霞区\"\n          },\n          {\n            \"value\": \"320114\",\n            \"label\": \"雨花台区\"\n          },\n          {\n            \"value\": \"320115\",\n            \"label\": \"江宁区\"\n          },\n          {\n            \"value\": \"320116\",\n            \"label\": \"六合区\"\n          },\n          {\n            \"value\": \"320117\",\n            \"label\": \"溧水区\"\n          },\n          {\n            \"value\": \"320118\",\n            \"label\": \"高淳区\"\n          }\n        ]\n      },\n      {\n        \"value\": \"320200\",\n        \"label\": \"无锡市\",\n        \"children\": [\n          {\n            \"value\": \"320205\",\n            \"label\": \"锡山区\"\n          },\n          {\n            \"value\": \"320206\",\n            \"label\": \"惠山区\"\n          },\n          {\n            \"value\": \"320211\",\n            \"label\": \"滨湖区\"\n          },\n          {\n            \"value\": \"320213\",\n            \"label\": \"梁溪区\"\n          },\n          {\n            \"value\": \"320214\",\n            \"label\": \"新吴区\"\n          },\n          {\n            \"value\": \"320281\",\n            \"label\": \"江阴市\"\n          },\n          {\n            \"value\": \"320282\",\n            \"label\": \"宜兴市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"320300\",\n        \"label\": \"徐州市\",\n        \"children\": [\n          {\n            \"value\": \"320302\",\n            \"label\": \"鼓楼区\"\n          },\n          {\n            \"value\": \"320303\",\n            \"label\": \"云龙区\"\n          },\n          {\n            \"value\": \"320305\",\n            \"label\": \"贾汪区\"\n          },\n          {\n            \"value\": \"320311\",\n            \"label\": \"泉山区\"\n          },\n          {\n            \"value\": \"320312\",\n            \"label\": \"铜山区\"\n          },\n          {\n            \"value\": \"320321\",\n            \"label\": \"丰县\"\n          },\n          {\n            \"value\": \"320322\",\n            \"label\": \"沛县\"\n          },\n          {\n            \"value\": \"320324\",\n            \"label\": \"睢宁县\"\n          },\n          {\n            \"value\": \"320381\",\n            \"label\": \"新沂市\"\n          },\n          {\n            \"value\": \"320382\",\n            \"label\": \"邳州市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"320400\",\n        \"label\": \"常州市\",\n        \"children\": [\n          {\n            \"value\": \"320402\",\n            \"label\": \"天宁区\"\n          },\n          {\n            \"value\": \"320404\",\n            \"label\": \"钟楼区\"\n          },\n          {\n            \"value\": \"320411\",\n            \"label\": \"新北区\"\n          },\n          {\n            \"value\": \"320412\",\n            \"label\": \"武进区\"\n          },\n          {\n            \"value\": \"320413\",\n            \"label\": \"金坛区\"\n          },\n          {\n            \"value\": \"320481\",\n            \"label\": \"溧阳市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"320500\",\n        \"label\": \"苏州市\",\n        \"children\": [\n          {\n            \"value\": \"320505\",\n            \"label\": \"虎丘区\"\n          },\n          {\n            \"value\": \"320506\",\n            \"label\": \"吴中区\"\n          },\n          {\n            \"value\": \"320507\",\n            \"label\": \"相城区\"\n          },\n          {\n            \"value\": \"320508\",\n            \"label\": \"姑苏区\"\n          },\n          {\n            \"value\": \"320509\",\n            \"label\": \"吴江区\"\n          },\n          {\n            \"value\": \"320581\",\n            \"label\": \"常熟市\"\n          },\n          {\n            \"value\": \"320582\",\n            \"label\": \"张家港市\"\n          },\n          {\n            \"value\": \"320583\",\n            \"label\": \"昆山市\"\n          },\n          {\n            \"value\": \"320585\",\n            \"label\": \"太仓市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"320600\",\n        \"label\": \"南通市\",\n        \"children\": [\n          {\n            \"value\": \"320602\",\n            \"label\": \"崇川区\"\n          },\n          {\n            \"value\": \"320611\",\n            \"label\": \"港闸区\"\n          },\n          {\n            \"value\": \"320612\",\n            \"label\": \"通州区\"\n          },\n          {\n            \"value\": \"320623\",\n            \"label\": \"如东县\"\n          },\n          {\n            \"value\": \"320681\",\n            \"label\": \"启东市\"\n          },\n          {\n            \"value\": \"320682\",\n            \"label\": \"如皋市\"\n          },\n          {\n            \"value\": \"320684\",\n            \"label\": \"海门市\"\n          },\n          {\n            \"value\": \"320685\",\n            \"label\": \"海安市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"320700\",\n        \"label\": \"连云港市\",\n        \"children\": [\n          {\n            \"value\": \"320703\",\n            \"label\": \"连云区\"\n          },\n          {\n            \"value\": \"320706\",\n            \"label\": \"海州区\"\n          },\n          {\n            \"value\": \"320707\",\n            \"label\": \"赣榆区\"\n          },\n          {\n            \"value\": \"320722\",\n            \"label\": \"东海县\"\n          },\n          {\n            \"value\": \"320723\",\n            \"label\": \"灌云县\"\n          },\n          {\n            \"value\": \"320724\",\n            \"label\": \"灌南县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"320800\",\n        \"label\": \"淮安市\",\n        \"children\": [\n          {\n            \"value\": \"320803\",\n            \"label\": \"淮安区\"\n          },\n          {\n            \"value\": \"320804\",\n            \"label\": \"淮阴区\"\n          },\n          {\n            \"value\": \"320812\",\n            \"label\": \"清江浦区\"\n          },\n          {\n            \"value\": \"320813\",\n            \"label\": \"洪泽区\"\n          },\n          {\n            \"value\": \"320826\",\n            \"label\": \"涟水县\"\n          },\n          {\n            \"value\": \"320830\",\n            \"label\": \"盱眙县\"\n          },\n          {\n            \"value\": \"320831\",\n            \"label\": \"金湖县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"320900\",\n        \"label\": \"盐城市\",\n        \"children\": [\n          {\n            \"value\": \"320902\",\n            \"label\": \"亭湖区\"\n          },\n          {\n            \"value\": \"320903\",\n            \"label\": \"盐都区\"\n          },\n          {\n            \"value\": \"320904\",\n            \"label\": \"大丰区\"\n          },\n          {\n            \"value\": \"320921\",\n            \"label\": \"响水县\"\n          },\n          {\n            \"value\": \"320922\",\n            \"label\": \"滨海县\"\n          },\n          {\n            \"value\": \"320923\",\n            \"label\": \"阜宁县\"\n          },\n          {\n            \"value\": \"320924\",\n            \"label\": \"射阳县\"\n          },\n          {\n            \"value\": \"320925\",\n            \"label\": \"建湖县\"\n          },\n          {\n            \"value\": \"320981\",\n            \"label\": \"东台市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"321000\",\n        \"label\": \"扬州市\",\n        \"children\": [\n          {\n            \"value\": \"321002\",\n            \"label\": \"广陵区\"\n          },\n          {\n            \"value\": \"321003\",\n            \"label\": \"邗江区\"\n          },\n          {\n            \"value\": \"321012\",\n            \"label\": \"江都区\"\n          },\n          {\n            \"value\": \"321023\",\n            \"label\": \"宝应县\"\n          },\n          {\n            \"value\": \"321081\",\n            \"label\": \"仪征市\"\n          },\n          {\n            \"value\": \"321084\",\n            \"label\": \"高邮市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"321100\",\n        \"label\": \"镇江市\",\n        \"children\": [\n          {\n            \"value\": \"321102\",\n            \"label\": \"京口区\"\n          },\n          {\n            \"value\": \"321111\",\n            \"label\": \"润州区\"\n          },\n          {\n            \"value\": \"321112\",\n            \"label\": \"丹徒区\"\n          },\n          {\n            \"value\": \"321181\",\n            \"label\": \"丹阳市\"\n          },\n          {\n            \"value\": \"321182\",\n            \"label\": \"扬中市\"\n          },\n          {\n            \"value\": \"321183\",\n            \"label\": \"句容市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"321200\",\n        \"label\": \"泰州市\",\n        \"children\": [\n          {\n            \"value\": \"321202\",\n            \"label\": \"海陵区\"\n          },\n          {\n            \"value\": \"321203\",\n            \"label\": \"高港区\"\n          },\n          {\n            \"value\": \"321204\",\n            \"label\": \"姜堰区\"\n          },\n          {\n            \"value\": \"321281\",\n            \"label\": \"兴化市\"\n          },\n          {\n            \"value\": \"321282\",\n            \"label\": \"靖江市\"\n          },\n          {\n            \"value\": \"321283\",\n            \"label\": \"泰兴市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"321300\",\n        \"label\": \"宿迁市\",\n        \"children\": [\n          {\n            \"value\": \"321302\",\n            \"label\": \"宿城区\"\n          },\n          {\n            \"value\": \"321311\",\n            \"label\": \"宿豫区\"\n          },\n          {\n            \"value\": \"321322\",\n            \"label\": \"沭阳县\"\n          },\n          {\n            \"value\": \"321323\",\n            \"label\": \"泗阳县\"\n          },\n          {\n            \"value\": \"321324\",\n            \"label\": \"泗洪县\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"330000\",\n    \"label\": \"浙江省\",\n    \"children\": [\n      {\n        \"value\": \"330100\",\n        \"label\": \"杭州市\",\n        \"children\": [\n          {\n            \"value\": \"330102\",\n            \"label\": \"上城区\"\n          },\n          {\n            \"value\": \"330103\",\n            \"label\": \"下城区\"\n          },\n          {\n            \"value\": \"330104\",\n            \"label\": \"江干区\"\n          },\n          {\n            \"value\": \"330105\",\n            \"label\": \"拱墅区\"\n          },\n          {\n            \"value\": \"330106\",\n            \"label\": \"西湖区\"\n          },\n          {\n            \"value\": \"330108\",\n            \"label\": \"滨江区\"\n          },\n          {\n            \"value\": \"330109\",\n            \"label\": \"萧山区\"\n          },\n          {\n            \"value\": \"330110\",\n            \"label\": \"余杭区\"\n          },\n          {\n            \"value\": \"330111\",\n            \"label\": \"富阳区\"\n          },\n          {\n            \"value\": \"330112\",\n            \"label\": \"临安区\"\n          },\n          {\n            \"value\": \"330122\",\n            \"label\": \"桐庐县\"\n          },\n          {\n            \"value\": \"330127\",\n            \"label\": \"淳安县\"\n          },\n          {\n            \"value\": \"330182\",\n            \"label\": \"建德市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"330200\",\n        \"label\": \"宁波市\",\n        \"children\": [\n          {\n            \"value\": \"330203\",\n            \"label\": \"海曙区\"\n          },\n          {\n            \"value\": \"330205\",\n            \"label\": \"江北区\"\n          },\n          {\n            \"value\": \"330206\",\n            \"label\": \"北仑区\"\n          },\n          {\n            \"value\": \"330211\",\n            \"label\": \"镇海区\"\n          },\n          {\n            \"value\": \"330212\",\n            \"label\": \"鄞州区\"\n          },\n          {\n            \"value\": \"330213\",\n            \"label\": \"奉化区\"\n          },\n          {\n            \"value\": \"330225\",\n            \"label\": \"象山县\"\n          },\n          {\n            \"value\": \"330226\",\n            \"label\": \"宁海县\"\n          },\n          {\n            \"value\": \"330281\",\n            \"label\": \"余姚市\"\n          },\n          {\n            \"value\": \"330282\",\n            \"label\": \"慈溪市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"330300\",\n        \"label\": \"温州市\",\n        \"children\": [\n          {\n            \"value\": \"330302\",\n            \"label\": \"鹿城区\"\n          },\n          {\n            \"value\": \"330303\",\n            \"label\": \"龙湾区\"\n          },\n          {\n            \"value\": \"330304\",\n            \"label\": \"瓯海区\"\n          },\n          {\n            \"value\": \"330305\",\n            \"label\": \"洞头区\"\n          },\n          {\n            \"value\": \"330324\",\n            \"label\": \"永嘉县\"\n          },\n          {\n            \"value\": \"330326\",\n            \"label\": \"平阳县\"\n          },\n          {\n            \"value\": \"330327\",\n            \"label\": \"苍南县\"\n          },\n          {\n            \"value\": \"330328\",\n            \"label\": \"文成县\"\n          },\n          {\n            \"value\": \"330329\",\n            \"label\": \"泰顺县\"\n          },\n          {\n            \"value\": \"330381\",\n            \"label\": \"瑞安市\"\n          },\n          {\n            \"value\": \"330382\",\n            \"label\": \"乐清市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"330400\",\n        \"label\": \"嘉兴市\",\n        \"children\": [\n          {\n            \"value\": \"330402\",\n            \"label\": \"南湖区\"\n          },\n          {\n            \"value\": \"330411\",\n            \"label\": \"秀洲区\"\n          },\n          {\n            \"value\": \"330421\",\n            \"label\": \"嘉善县\"\n          },\n          {\n            \"value\": \"330424\",\n            \"label\": \"海盐县\"\n          },\n          {\n            \"value\": \"330481\",\n            \"label\": \"海宁市\"\n          },\n          {\n            \"value\": \"330482\",\n            \"label\": \"平湖市\"\n          },\n          {\n            \"value\": \"330483\",\n            \"label\": \"桐乡市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"330500\",\n        \"label\": \"湖州市\",\n        \"children\": [\n          {\n            \"value\": \"330502\",\n            \"label\": \"吴兴区\"\n          },\n          {\n            \"value\": \"330503\",\n            \"label\": \"南浔区\"\n          },\n          {\n            \"value\": \"330521\",\n            \"label\": \"德清县\"\n          },\n          {\n            \"value\": \"330522\",\n            \"label\": \"长兴县\"\n          },\n          {\n            \"value\": \"330523\",\n            \"label\": \"安吉县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"330600\",\n        \"label\": \"绍兴市\",\n        \"children\": [\n          {\n            \"value\": \"330602\",\n            \"label\": \"越城区\"\n          },\n          {\n            \"value\": \"330603\",\n            \"label\": \"柯桥区\"\n          },\n          {\n            \"value\": \"330604\",\n            \"label\": \"上虞区\"\n          },\n          {\n            \"value\": \"330624\",\n            \"label\": \"新昌县\"\n          },\n          {\n            \"value\": \"330681\",\n            \"label\": \"诸暨市\"\n          },\n          {\n            \"value\": \"330683\",\n            \"label\": \"嵊州市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"330700\",\n        \"label\": \"金华市\",\n        \"children\": [\n          {\n            \"value\": \"330702\",\n            \"label\": \"婺城区\"\n          },\n          {\n            \"value\": \"330703\",\n            \"label\": \"金东区\"\n          },\n          {\n            \"value\": \"330723\",\n            \"label\": \"武义县\"\n          },\n          {\n            \"value\": \"330726\",\n            \"label\": \"浦江县\"\n          },\n          {\n            \"value\": \"330727\",\n            \"label\": \"磐安县\"\n          },\n          {\n            \"value\": \"330781\",\n            \"label\": \"兰溪市\"\n          },\n          {\n            \"value\": \"330782\",\n            \"label\": \"义乌市\"\n          },\n          {\n            \"value\": \"330783\",\n            \"label\": \"东阳市\"\n          },\n          {\n            \"value\": \"330784\",\n            \"label\": \"永康市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"330800\",\n        \"label\": \"衢州市\",\n        \"children\": [\n          {\n            \"value\": \"330802\",\n            \"label\": \"柯城区\"\n          },\n          {\n            \"value\": \"330803\",\n            \"label\": \"衢江区\"\n          },\n          {\n            \"value\": \"330822\",\n            \"label\": \"常山县\"\n          },\n          {\n            \"value\": \"330824\",\n            \"label\": \"开化县\"\n          },\n          {\n            \"value\": \"330825\",\n            \"label\": \"龙游县\"\n          },\n          {\n            \"value\": \"330881\",\n            \"label\": \"江山市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"330900\",\n        \"label\": \"舟山市\",\n        \"children\": [\n          {\n            \"value\": \"330902\",\n            \"label\": \"定海区\"\n          },\n          {\n            \"value\": \"330903\",\n            \"label\": \"普陀区\"\n          },\n          {\n            \"value\": \"330921\",\n            \"label\": \"岱山县\"\n          },\n          {\n            \"value\": \"330922\",\n            \"label\": \"嵊泗县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"331000\",\n        \"label\": \"台州市\",\n        \"children\": [\n          {\n            \"value\": \"331002\",\n            \"label\": \"椒江区\"\n          },\n          {\n            \"value\": \"331003\",\n            \"label\": \"黄岩区\"\n          },\n          {\n            \"value\": \"331004\",\n            \"label\": \"路桥区\"\n          },\n          {\n            \"value\": \"331022\",\n            \"label\": \"三门县\"\n          },\n          {\n            \"value\": \"331023\",\n            \"label\": \"天台县\"\n          },\n          {\n            \"value\": \"331024\",\n            \"label\": \"仙居县\"\n          },\n          {\n            \"value\": \"331081\",\n            \"label\": \"温岭市\"\n          },\n          {\n            \"value\": \"331082\",\n            \"label\": \"临海市\"\n          },\n          {\n            \"value\": \"331083\",\n            \"label\": \"玉环市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"331100\",\n        \"label\": \"丽水市\",\n        \"children\": [\n          {\n            \"value\": \"331102\",\n            \"label\": \"莲都区\"\n          },\n          {\n            \"value\": \"331121\",\n            \"label\": \"青田县\"\n          },\n          {\n            \"value\": \"331122\",\n            \"label\": \"缙云县\"\n          },\n          {\n            \"value\": \"331123\",\n            \"label\": \"遂昌县\"\n          },\n          {\n            \"value\": \"331124\",\n            \"label\": \"松阳县\"\n          },\n          {\n            \"value\": \"331125\",\n            \"label\": \"云和县\"\n          },\n          {\n            \"value\": \"331126\",\n            \"label\": \"庆元县\"\n          },\n          {\n            \"value\": \"331127\",\n            \"label\": \"景宁畲族自治县\"\n          },\n          {\n            \"value\": \"331181\",\n            \"label\": \"龙泉市\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"340000\",\n    \"label\": \"安徽省\",\n    \"children\": [\n      {\n        \"value\": \"340100\",\n        \"label\": \"合肥市\",\n        \"children\": [\n          {\n            \"value\": \"340102\",\n            \"label\": \"瑶海区\"\n          },\n          {\n            \"value\": \"340103\",\n            \"label\": \"庐阳区\"\n          },\n          {\n            \"value\": \"340104\",\n            \"label\": \"蜀山区\"\n          },\n          {\n            \"value\": \"340111\",\n            \"label\": \"包河区\"\n          },\n          {\n            \"value\": \"340121\",\n            \"label\": \"长丰县\"\n          },\n          {\n            \"value\": \"340122\",\n            \"label\": \"肥东县\"\n          },\n          {\n            \"value\": \"340123\",\n            \"label\": \"肥西县\"\n          },\n          {\n            \"value\": \"340124\",\n            \"label\": \"庐江县\"\n          },\n          {\n            \"value\": \"340181\",\n            \"label\": \"巢湖市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"340200\",\n        \"label\": \"芜湖市\",\n        \"children\": [\n          {\n            \"value\": \"340202\",\n            \"label\": \"镜湖区\"\n          },\n          {\n            \"value\": \"340203\",\n            \"label\": \"弋江区\"\n          },\n          {\n            \"value\": \"340207\",\n            \"label\": \"鸠江区\"\n          },\n          {\n            \"value\": \"340208\",\n            \"label\": \"三山区\"\n          },\n          {\n            \"value\": \"340221\",\n            \"label\": \"芜湖县\"\n          },\n          {\n            \"value\": \"340222\",\n            \"label\": \"繁昌县\"\n          },\n          {\n            \"value\": \"340223\",\n            \"label\": \"南陵县\"\n          },\n          {\n            \"value\": \"340225\",\n            \"label\": \"无为县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"340300\",\n        \"label\": \"蚌埠市\",\n        \"children\": [\n          {\n            \"value\": \"340302\",\n            \"label\": \"龙子湖区\"\n          },\n          {\n            \"value\": \"340303\",\n            \"label\": \"蚌山区\"\n          },\n          {\n            \"value\": \"340304\",\n            \"label\": \"禹会区\"\n          },\n          {\n            \"value\": \"340311\",\n            \"label\": \"淮上区\"\n          },\n          {\n            \"value\": \"340321\",\n            \"label\": \"怀远县\"\n          },\n          {\n            \"value\": \"340322\",\n            \"label\": \"五河县\"\n          },\n          {\n            \"value\": \"340323\",\n            \"label\": \"固镇县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"340400\",\n        \"label\": \"淮南市\",\n        \"children\": [\n          {\n            \"value\": \"340402\",\n            \"label\": \"大通区\"\n          },\n          {\n            \"value\": \"340403\",\n            \"label\": \"田家庵区\"\n          },\n          {\n            \"value\": \"340404\",\n            \"label\": \"谢家集区\"\n          },\n          {\n            \"value\": \"340405\",\n            \"label\": \"八公山区\"\n          },\n          {\n            \"value\": \"340406\",\n            \"label\": \"潘集区\"\n          },\n          {\n            \"value\": \"340421\",\n            \"label\": \"凤台县\"\n          },\n          {\n            \"value\": \"340422\",\n            \"label\": \"寿县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"340500\",\n        \"label\": \"马鞍山市\",\n        \"children\": [\n          {\n            \"value\": \"340503\",\n            \"label\": \"花山区\"\n          },\n          {\n            \"value\": \"340504\",\n            \"label\": \"雨山区\"\n          },\n          {\n            \"value\": \"340506\",\n            \"label\": \"博望区\"\n          },\n          {\n            \"value\": \"340521\",\n            \"label\": \"当涂县\"\n          },\n          {\n            \"value\": \"340522\",\n            \"label\": \"含山县\"\n          },\n          {\n            \"value\": \"340523\",\n            \"label\": \"和县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"340600\",\n        \"label\": \"淮北市\",\n        \"children\": [\n          {\n            \"value\": \"340602\",\n            \"label\": \"杜集区\"\n          },\n          {\n            \"value\": \"340603\",\n            \"label\": \"相山区\"\n          },\n          {\n            \"value\": \"340604\",\n            \"label\": \"烈山区\"\n          },\n          {\n            \"value\": \"340621\",\n            \"label\": \"濉溪县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"340700\",\n        \"label\": \"铜陵市\",\n        \"children\": [\n          {\n            \"value\": \"340705\",\n            \"label\": \"铜官区\"\n          },\n          {\n            \"value\": \"340706\",\n            \"label\": \"义安区\"\n          },\n          {\n            \"value\": \"340711\",\n            \"label\": \"郊区\"\n          },\n          {\n            \"value\": \"340722\",\n            \"label\": \"枞阳县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"340800\",\n        \"label\": \"安庆市\",\n        \"children\": [\n          {\n            \"value\": \"340802\",\n            \"label\": \"迎江区\"\n          },\n          {\n            \"value\": \"340803\",\n            \"label\": \"大观区\"\n          },\n          {\n            \"value\": \"340811\",\n            \"label\": \"宜秀区\"\n          },\n          {\n            \"value\": \"340822\",\n            \"label\": \"怀宁县\"\n          },\n          {\n            \"value\": \"340824\",\n            \"label\": \"潜山县\"\n          },\n          {\n            \"value\": \"340825\",\n            \"label\": \"太湖县\"\n          },\n          {\n            \"value\": \"340826\",\n            \"label\": \"宿松县\"\n          },\n          {\n            \"value\": \"340827\",\n            \"label\": \"望江县\"\n          },\n          {\n            \"value\": \"340828\",\n            \"label\": \"岳西县\"\n          },\n          {\n            \"value\": \"340881\",\n            \"label\": \"桐城市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"341000\",\n        \"label\": \"黄山市\",\n        \"children\": [\n          {\n            \"value\": \"341002\",\n            \"label\": \"屯溪区\"\n          },\n          {\n            \"value\": \"341003\",\n            \"label\": \"黄山区\"\n          },\n          {\n            \"value\": \"341004\",\n            \"label\": \"徽州区\"\n          },\n          {\n            \"value\": \"341021\",\n            \"label\": \"歙县\"\n          },\n          {\n            \"value\": \"341022\",\n            \"label\": \"休宁县\"\n          },\n          {\n            \"value\": \"341023\",\n            \"label\": \"黟县\"\n          },\n          {\n            \"value\": \"341024\",\n            \"label\": \"祁门县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"341100\",\n        \"label\": \"滁州市\",\n        \"children\": [\n          {\n            \"value\": \"341102\",\n            \"label\": \"琅琊区\"\n          },\n          {\n            \"value\": \"341103\",\n            \"label\": \"南谯区\"\n          },\n          {\n            \"value\": \"341122\",\n            \"label\": \"来安县\"\n          },\n          {\n            \"value\": \"341124\",\n            \"label\": \"全椒县\"\n          },\n          {\n            \"value\": \"341125\",\n            \"label\": \"定远县\"\n          },\n          {\n            \"value\": \"341126\",\n            \"label\": \"凤阳县\"\n          },\n          {\n            \"value\": \"341181\",\n            \"label\": \"天长市\"\n          },\n          {\n            \"value\": \"341182\",\n            \"label\": \"明光市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"341200\",\n        \"label\": \"阜阳市\",\n        \"children\": [\n          {\n            \"value\": \"341202\",\n            \"label\": \"颍州区\"\n          },\n          {\n            \"value\": \"341203\",\n            \"label\": \"颍东区\"\n          },\n          {\n            \"value\": \"341204\",\n            \"label\": \"颍泉区\"\n          },\n          {\n            \"value\": \"341221\",\n            \"label\": \"临泉县\"\n          },\n          {\n            \"value\": \"341222\",\n            \"label\": \"太和县\"\n          },\n          {\n            \"value\": \"341225\",\n            \"label\": \"阜南县\"\n          },\n          {\n            \"value\": \"341226\",\n            \"label\": \"颍上县\"\n          },\n          {\n            \"value\": \"341282\",\n            \"label\": \"界首市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"341300\",\n        \"label\": \"宿州市\",\n        \"children\": [\n          {\n            \"value\": \"341302\",\n            \"label\": \"埇桥区\"\n          },\n          {\n            \"value\": \"341321\",\n            \"label\": \"砀山县\"\n          },\n          {\n            \"value\": \"341322\",\n            \"label\": \"萧县\"\n          },\n          {\n            \"value\": \"341323\",\n            \"label\": \"灵璧县\"\n          },\n          {\n            \"value\": \"341324\",\n            \"label\": \"泗县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"341500\",\n        \"label\": \"六安市\",\n        \"children\": [\n          {\n            \"value\": \"341502\",\n            \"label\": \"金安区\"\n          },\n          {\n            \"value\": \"341503\",\n            \"label\": \"裕安区\"\n          },\n          {\n            \"value\": \"341504\",\n            \"label\": \"叶集区\"\n          },\n          {\n            \"value\": \"341522\",\n            \"label\": \"霍邱县\"\n          },\n          {\n            \"value\": \"341523\",\n            \"label\": \"舒城县\"\n          },\n          {\n            \"value\": \"341524\",\n            \"label\": \"金寨县\"\n          },\n          {\n            \"value\": \"341525\",\n            \"label\": \"霍山县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"341600\",\n        \"label\": \"亳州市\",\n        \"children\": [\n          {\n            \"value\": \"341602\",\n            \"label\": \"谯城区\"\n          },\n          {\n            \"value\": \"341621\",\n            \"label\": \"涡阳县\"\n          },\n          {\n            \"value\": \"341622\",\n            \"label\": \"蒙城县\"\n          },\n          {\n            \"value\": \"341623\",\n            \"label\": \"利辛县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"341700\",\n        \"label\": \"池州市\",\n        \"children\": [\n          {\n            \"value\": \"341702\",\n            \"label\": \"贵池区\"\n          },\n          {\n            \"value\": \"341721\",\n            \"label\": \"东至县\"\n          },\n          {\n            \"value\": \"341722\",\n            \"label\": \"石台县\"\n          },\n          {\n            \"value\": \"341723\",\n            \"label\": \"青阳县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"341800\",\n        \"label\": \"宣城市\",\n        \"children\": [\n          {\n            \"value\": \"341802\",\n            \"label\": \"宣州区\"\n          },\n          {\n            \"value\": \"341821\",\n            \"label\": \"郎溪县\"\n          },\n          {\n            \"value\": \"341822\",\n            \"label\": \"广德县\"\n          },\n          {\n            \"value\": \"341823\",\n            \"label\": \"泾县\"\n          },\n          {\n            \"value\": \"341824\",\n            \"label\": \"绩溪县\"\n          },\n          {\n            \"value\": \"341825\",\n            \"label\": \"旌德县\"\n          },\n          {\n            \"value\": \"341881\",\n            \"label\": \"宁国市\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"350000\",\n    \"label\": \"福建省\",\n    \"children\": [\n      {\n        \"value\": \"350100\",\n        \"label\": \"福州市\",\n        \"children\": [\n          {\n            \"value\": \"350102\",\n            \"label\": \"鼓楼区\"\n          },\n          {\n            \"value\": \"350103\",\n            \"label\": \"台江区\"\n          },\n          {\n            \"value\": \"350104\",\n            \"label\": \"仓山区\"\n          },\n          {\n            \"value\": \"350105\",\n            \"label\": \"马尾区\"\n          },\n          {\n            \"value\": \"350111\",\n            \"label\": \"晋安区\"\n          },\n          {\n            \"value\": \"350112\",\n            \"label\": \"长乐区\"\n          },\n          {\n            \"value\": \"350121\",\n            \"label\": \"闽侯县\"\n          },\n          {\n            \"value\": \"350122\",\n            \"label\": \"连江县\"\n          },\n          {\n            \"value\": \"350123\",\n            \"label\": \"罗源县\"\n          },\n          {\n            \"value\": \"350124\",\n            \"label\": \"闽清县\"\n          },\n          {\n            \"value\": \"350125\",\n            \"label\": \"永泰县\"\n          },\n          {\n            \"value\": \"350128\",\n            \"label\": \"平潭县\"\n          },\n          {\n            \"value\": \"350181\",\n            \"label\": \"福清市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"350200\",\n        \"label\": \"厦门市\",\n        \"children\": [\n          {\n            \"value\": \"350203\",\n            \"label\": \"思明区\"\n          },\n          {\n            \"value\": \"350205\",\n            \"label\": \"海沧区\"\n          },\n          {\n            \"value\": \"350206\",\n            \"label\": \"湖里区\"\n          },\n          {\n            \"value\": \"350211\",\n            \"label\": \"集美区\"\n          },\n          {\n            \"value\": \"350212\",\n            \"label\": \"同安区\"\n          },\n          {\n            \"value\": \"350213\",\n            \"label\": \"翔安区\"\n          }\n        ]\n      },\n      {\n        \"value\": \"350300\",\n        \"label\": \"莆田市\",\n        \"children\": [\n          {\n            \"value\": \"350302\",\n            \"label\": \"城厢区\"\n          },\n          {\n            \"value\": \"350303\",\n            \"label\": \"涵江区\"\n          },\n          {\n            \"value\": \"350304\",\n            \"label\": \"荔城区\"\n          },\n          {\n            \"value\": \"350305\",\n            \"label\": \"秀屿区\"\n          },\n          {\n            \"value\": \"350322\",\n            \"label\": \"仙游县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"350400\",\n        \"label\": \"三明市\",\n        \"children\": [\n          {\n            \"value\": \"350402\",\n            \"label\": \"梅列区\"\n          },\n          {\n            \"value\": \"350403\",\n            \"label\": \"三元区\"\n          },\n          {\n            \"value\": \"350421\",\n            \"label\": \"明溪县\"\n          },\n          {\n            \"value\": \"350423\",\n            \"label\": \"清流县\"\n          },\n          {\n            \"value\": \"350424\",\n            \"label\": \"宁化县\"\n          },\n          {\n            \"value\": \"350425\",\n            \"label\": \"大田县\"\n          },\n          {\n            \"value\": \"350426\",\n            \"label\": \"尤溪县\"\n          },\n          {\n            \"value\": \"350427\",\n            \"label\": \"沙县\"\n          },\n          {\n            \"value\": \"350428\",\n            \"label\": \"将乐县\"\n          },\n          {\n            \"value\": \"350429\",\n            \"label\": \"泰宁县\"\n          },\n          {\n            \"value\": \"350430\",\n            \"label\": \"建宁县\"\n          },\n          {\n            \"value\": \"350481\",\n            \"label\": \"永安市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"350500\",\n        \"label\": \"泉州市\",\n        \"children\": [\n          {\n            \"value\": \"350502\",\n            \"label\": \"鲤城区\"\n          },\n          {\n            \"value\": \"350503\",\n            \"label\": \"丰泽区\"\n          },\n          {\n            \"value\": \"350504\",\n            \"label\": \"洛江区\"\n          },\n          {\n            \"value\": \"350505\",\n            \"label\": \"泉港区\"\n          },\n          {\n            \"value\": \"350521\",\n            \"label\": \"惠安县\"\n          },\n          {\n            \"value\": \"350524\",\n            \"label\": \"安溪县\"\n          },\n          {\n            \"value\": \"350525\",\n            \"label\": \"永春县\"\n          },\n          {\n            \"value\": \"350526\",\n            \"label\": \"德化县\"\n          },\n          {\n            \"value\": \"350527\",\n            \"label\": \"金门县\"\n          },\n          {\n            \"value\": \"350581\",\n            \"label\": \"石狮市\"\n          },\n          {\n            \"value\": \"350582\",\n            \"label\": \"晋江市\"\n          },\n          {\n            \"value\": \"350583\",\n            \"label\": \"南安市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"350600\",\n        \"label\": \"漳州市\",\n        \"children\": [\n          {\n            \"value\": \"350602\",\n            \"label\": \"芗城区\"\n          },\n          {\n            \"value\": \"350603\",\n            \"label\": \"龙文区\"\n          },\n          {\n            \"value\": \"350622\",\n            \"label\": \"云霄县\"\n          },\n          {\n            \"value\": \"350623\",\n            \"label\": \"漳浦县\"\n          },\n          {\n            \"value\": \"350624\",\n            \"label\": \"诏安县\"\n          },\n          {\n            \"value\": \"350625\",\n            \"label\": \"长泰县\"\n          },\n          {\n            \"value\": \"350626\",\n            \"label\": \"东山县\"\n          },\n          {\n            \"value\": \"350627\",\n            \"label\": \"南靖县\"\n          },\n          {\n            \"value\": \"350628\",\n            \"label\": \"平和县\"\n          },\n          {\n            \"value\": \"350629\",\n            \"label\": \"华安县\"\n          },\n          {\n            \"value\": \"350681\",\n            \"label\": \"龙海市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"350700\",\n        \"label\": \"南平市\",\n        \"children\": [\n          {\n            \"value\": \"350702\",\n            \"label\": \"延平区\"\n          },\n          {\n            \"value\": \"350703\",\n            \"label\": \"建阳区\"\n          },\n          {\n            \"value\": \"350721\",\n            \"label\": \"顺昌县\"\n          },\n          {\n            \"value\": \"350722\",\n            \"label\": \"浦城县\"\n          },\n          {\n            \"value\": \"350723\",\n            \"label\": \"光泽县\"\n          },\n          {\n            \"value\": \"350724\",\n            \"label\": \"松溪县\"\n          },\n          {\n            \"value\": \"350725\",\n            \"label\": \"政和县\"\n          },\n          {\n            \"value\": \"350781\",\n            \"label\": \"邵武市\"\n          },\n          {\n            \"value\": \"350782\",\n            \"label\": \"武夷山市\"\n          },\n          {\n            \"value\": \"350783\",\n            \"label\": \"建瓯市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"350800\",\n        \"label\": \"龙岩市\",\n        \"children\": [\n          {\n            \"value\": \"350802\",\n            \"label\": \"新罗区\"\n          },\n          {\n            \"value\": \"350803\",\n            \"label\": \"永定区\"\n          },\n          {\n            \"value\": \"350821\",\n            \"label\": \"长汀县\"\n          },\n          {\n            \"value\": \"350823\",\n            \"label\": \"上杭县\"\n          },\n          {\n            \"value\": \"350824\",\n            \"label\": \"武平县\"\n          },\n          {\n            \"value\": \"350825\",\n            \"label\": \"连城县\"\n          },\n          {\n            \"value\": \"350881\",\n            \"label\": \"漳平市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"350900\",\n        \"label\": \"宁德市\",\n        \"children\": [\n          {\n            \"value\": \"350902\",\n            \"label\": \"蕉城区\"\n          },\n          {\n            \"value\": \"350921\",\n            \"label\": \"霞浦县\"\n          },\n          {\n            \"value\": \"350922\",\n            \"label\": \"古田县\"\n          },\n          {\n            \"value\": \"350923\",\n            \"label\": \"屏南县\"\n          },\n          {\n            \"value\": \"350924\",\n            \"label\": \"寿宁县\"\n          },\n          {\n            \"value\": \"350925\",\n            \"label\": \"周宁县\"\n          },\n          {\n            \"value\": \"350926\",\n            \"label\": \"柘荣县\"\n          },\n          {\n            \"value\": \"350981\",\n            \"label\": \"福安市\"\n          },\n          {\n            \"value\": \"350982\",\n            \"label\": \"福鼎市\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"360000\",\n    \"label\": \"江西省\",\n    \"children\": [\n      {\n        \"value\": \"360100\",\n        \"label\": \"南昌市\",\n        \"children\": [\n          {\n            \"value\": \"360102\",\n            \"label\": \"东湖区\"\n          },\n          {\n            \"value\": \"360103\",\n            \"label\": \"西湖区\"\n          },\n          {\n            \"value\": \"360104\",\n            \"label\": \"青云谱区\"\n          },\n          {\n            \"value\": \"360105\",\n            \"label\": \"湾里区\"\n          },\n          {\n            \"value\": \"360111\",\n            \"label\": \"青山湖区\"\n          },\n          {\n            \"value\": \"360112\",\n            \"label\": \"新建区\"\n          },\n          {\n            \"value\": \"360121\",\n            \"label\": \"南昌县\"\n          },\n          {\n            \"value\": \"360123\",\n            \"label\": \"安义县\"\n          },\n          {\n            \"value\": \"360124\",\n            \"label\": \"进贤县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"360200\",\n        \"label\": \"景德镇市\",\n        \"children\": [\n          {\n            \"value\": \"360202\",\n            \"label\": \"昌江区\"\n          },\n          {\n            \"value\": \"360203\",\n            \"label\": \"珠山区\"\n          },\n          {\n            \"value\": \"360222\",\n            \"label\": \"浮梁县\"\n          },\n          {\n            \"value\": \"360281\",\n            \"label\": \"乐平市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"360300\",\n        \"label\": \"萍乡市\",\n        \"children\": [\n          {\n            \"value\": \"360302\",\n            \"label\": \"安源区\"\n          },\n          {\n            \"value\": \"360313\",\n            \"label\": \"湘东区\"\n          },\n          {\n            \"value\": \"360321\",\n            \"label\": \"莲花县\"\n          },\n          {\n            \"value\": \"360322\",\n            \"label\": \"上栗县\"\n          },\n          {\n            \"value\": \"360323\",\n            \"label\": \"芦溪县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"360400\",\n        \"label\": \"九江市\",\n        \"children\": [\n          {\n            \"value\": \"360402\",\n            \"label\": \"濂溪区\"\n          },\n          {\n            \"value\": \"360403\",\n            \"label\": \"浔阳区\"\n          },\n          {\n            \"value\": \"360404\",\n            \"label\": \"柴桑区\"\n          },\n          {\n            \"value\": \"360423\",\n            \"label\": \"武宁县\"\n          },\n          {\n            \"value\": \"360424\",\n            \"label\": \"修水县\"\n          },\n          {\n            \"value\": \"360425\",\n            \"label\": \"永修县\"\n          },\n          {\n            \"value\": \"360426\",\n            \"label\": \"德安县\"\n          },\n          {\n            \"value\": \"360428\",\n            \"label\": \"都昌县\"\n          },\n          {\n            \"value\": \"360429\",\n            \"label\": \"湖口县\"\n          },\n          {\n            \"value\": \"360430\",\n            \"label\": \"彭泽县\"\n          },\n          {\n            \"value\": \"360481\",\n            \"label\": \"瑞昌市\"\n          },\n          {\n            \"value\": \"360482\",\n            \"label\": \"共青城市\"\n          },\n          {\n            \"value\": \"360483\",\n            \"label\": \"庐山市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"360500\",\n        \"label\": \"新余市\",\n        \"children\": [\n          {\n            \"value\": \"360502\",\n            \"label\": \"渝水区\"\n          },\n          {\n            \"value\": \"360521\",\n            \"label\": \"分宜县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"360600\",\n        \"label\": \"鹰潭市\",\n        \"children\": [\n          {\n            \"value\": \"360602\",\n            \"label\": \"月湖区\"\n          },\n          {\n            \"value\": \"360603\",\n            \"label\": \"余江区\"\n          },\n          {\n            \"value\": \"360681\",\n            \"label\": \"贵溪市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"360700\",\n        \"label\": \"赣州市\",\n        \"children\": [\n          {\n            \"value\": \"360702\",\n            \"label\": \"章贡区\"\n          },\n          {\n            \"value\": \"360703\",\n            \"label\": \"南康区\"\n          },\n          {\n            \"value\": \"360704\",\n            \"label\": \"赣县区\"\n          },\n          {\n            \"value\": \"360722\",\n            \"label\": \"信丰县\"\n          },\n          {\n            \"value\": \"360723\",\n            \"label\": \"大余县\"\n          },\n          {\n            \"value\": \"360724\",\n            \"label\": \"上犹县\"\n          },\n          {\n            \"value\": \"360725\",\n            \"label\": \"崇义县\"\n          },\n          {\n            \"value\": \"360726\",\n            \"label\": \"安远县\"\n          },\n          {\n            \"value\": \"360727\",\n            \"label\": \"龙南县\"\n          },\n          {\n            \"value\": \"360728\",\n            \"label\": \"定南县\"\n          },\n          {\n            \"value\": \"360729\",\n            \"label\": \"全南县\"\n          },\n          {\n            \"value\": \"360730\",\n            \"label\": \"宁都县\"\n          },\n          {\n            \"value\": \"360731\",\n            \"label\": \"于都县\"\n          },\n          {\n            \"value\": \"360732\",\n            \"label\": \"兴国县\"\n          },\n          {\n            \"value\": \"360733\",\n            \"label\": \"会昌县\"\n          },\n          {\n            \"value\": \"360734\",\n            \"label\": \"寻乌县\"\n          },\n          {\n            \"value\": \"360735\",\n            \"label\": \"石城县\"\n          },\n          {\n            \"value\": \"360781\",\n            \"label\": \"瑞金市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"360800\",\n        \"label\": \"吉安市\",\n        \"children\": [\n          {\n            \"value\": \"360802\",\n            \"label\": \"吉州区\"\n          },\n          {\n            \"value\": \"360803\",\n            \"label\": \"青原区\"\n          },\n          {\n            \"value\": \"360821\",\n            \"label\": \"吉安县\"\n          },\n          {\n            \"value\": \"360822\",\n            \"label\": \"吉水县\"\n          },\n          {\n            \"value\": \"360823\",\n            \"label\": \"峡江县\"\n          },\n          {\n            \"value\": \"360824\",\n            \"label\": \"新干县\"\n          },\n          {\n            \"value\": \"360825\",\n            \"label\": \"永丰县\"\n          },\n          {\n            \"value\": \"360826\",\n            \"label\": \"泰和县\"\n          },\n          {\n            \"value\": \"360827\",\n            \"label\": \"遂川县\"\n          },\n          {\n            \"value\": \"360828\",\n            \"label\": \"万安县\"\n          },\n          {\n            \"value\": \"360829\",\n            \"label\": \"安福县\"\n          },\n          {\n            \"value\": \"360830\",\n            \"label\": \"永新县\"\n          },\n          {\n            \"value\": \"360881\",\n            \"label\": \"井冈山市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"360900\",\n        \"label\": \"宜春市\",\n        \"children\": [\n          {\n            \"value\": \"360902\",\n            \"label\": \"袁州区\"\n          },\n          {\n            \"value\": \"360921\",\n            \"label\": \"奉新县\"\n          },\n          {\n            \"value\": \"360922\",\n            \"label\": \"万载县\"\n          },\n          {\n            \"value\": \"360923\",\n            \"label\": \"上高县\"\n          },\n          {\n            \"value\": \"360924\",\n            \"label\": \"宜丰县\"\n          },\n          {\n            \"value\": \"360925\",\n            \"label\": \"靖安县\"\n          },\n          {\n            \"value\": \"360926\",\n            \"label\": \"铜鼓县\"\n          },\n          {\n            \"value\": \"360981\",\n            \"label\": \"丰城市\"\n          },\n          {\n            \"value\": \"360982\",\n            \"label\": \"樟树市\"\n          },\n          {\n            \"value\": \"360983\",\n            \"label\": \"高安市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"361000\",\n        \"label\": \"抚州市\",\n        \"children\": [\n          {\n            \"value\": \"361002\",\n            \"label\": \"临川区\"\n          },\n          {\n            \"value\": \"361003\",\n            \"label\": \"东乡区\"\n          },\n          {\n            \"value\": \"361021\",\n            \"label\": \"南城县\"\n          },\n          {\n            \"value\": \"361022\",\n            \"label\": \"黎川县\"\n          },\n          {\n            \"value\": \"361023\",\n            \"label\": \"南丰县\"\n          },\n          {\n            \"value\": \"361024\",\n            \"label\": \"崇仁县\"\n          },\n          {\n            \"value\": \"361025\",\n            \"label\": \"乐安县\"\n          },\n          {\n            \"value\": \"361026\",\n            \"label\": \"宜黄县\"\n          },\n          {\n            \"value\": \"361027\",\n            \"label\": \"金溪县\"\n          },\n          {\n            \"value\": \"361028\",\n            \"label\": \"资溪县\"\n          },\n          {\n            \"value\": \"361030\",\n            \"label\": \"广昌县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"361100\",\n        \"label\": \"上饶市\",\n        \"children\": [\n          {\n            \"value\": \"361102\",\n            \"label\": \"信州区\"\n          },\n          {\n            \"value\": \"361103\",\n            \"label\": \"广丰区\"\n          },\n          {\n            \"value\": \"361121\",\n            \"label\": \"上饶县\"\n          },\n          {\n            \"value\": \"361123\",\n            \"label\": \"玉山县\"\n          },\n          {\n            \"value\": \"361124\",\n            \"label\": \"铅山县\"\n          },\n          {\n            \"value\": \"361125\",\n            \"label\": \"横峰县\"\n          },\n          {\n            \"value\": \"361126\",\n            \"label\": \"弋阳县\"\n          },\n          {\n            \"value\": \"361127\",\n            \"label\": \"余干县\"\n          },\n          {\n            \"value\": \"361128\",\n            \"label\": \"鄱阳县\"\n          },\n          {\n            \"value\": \"361129\",\n            \"label\": \"万年县\"\n          },\n          {\n            \"value\": \"361130\",\n            \"label\": \"婺源县\"\n          },\n          {\n            \"value\": \"361181\",\n            \"label\": \"德兴市\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"370000\",\n    \"label\": \"山东省\",\n    \"children\": [\n      {\n        \"value\": \"370100\",\n        \"label\": \"济南市\",\n        \"children\": [\n          {\n            \"value\": \"370102\",\n            \"label\": \"历下区\"\n          },\n          {\n            \"value\": \"370103\",\n            \"label\": \"市中区\"\n          },\n          {\n            \"value\": \"370104\",\n            \"label\": \"槐荫区\"\n          },\n          {\n            \"value\": \"370105\",\n            \"label\": \"天桥区\"\n          },\n          {\n            \"value\": \"370112\",\n            \"label\": \"历城区\"\n          },\n          {\n            \"value\": \"370113\",\n            \"label\": \"长清区\"\n          },\n          {\n            \"value\": \"370114\",\n            \"label\": \"章丘区\"\n          },\n          {\n            \"value\": \"370124\",\n            \"label\": \"平阴县\"\n          },\n          {\n            \"value\": \"370125\",\n            \"label\": \"济阳县\"\n          },\n          {\n            \"value\": \"370126\",\n            \"label\": \"商河县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"370200\",\n        \"label\": \"青岛市\",\n        \"children\": [\n          {\n            \"value\": \"370202\",\n            \"label\": \"市南区\"\n          },\n          {\n            \"value\": \"370203\",\n            \"label\": \"市北区\"\n          },\n          {\n            \"value\": \"370211\",\n            \"label\": \"黄岛区\"\n          },\n          {\n            \"value\": \"370212\",\n            \"label\": \"崂山区\"\n          },\n          {\n            \"value\": \"370213\",\n            \"label\": \"李沧区\"\n          },\n          {\n            \"value\": \"370214\",\n            \"label\": \"城阳区\"\n          },\n          {\n            \"value\": \"370215\",\n            \"label\": \"即墨区\"\n          },\n          {\n            \"value\": \"370281\",\n            \"label\": \"胶州市\"\n          },\n          {\n            \"value\": \"370283\",\n            \"label\": \"平度市\"\n          },\n          {\n            \"value\": \"370285\",\n            \"label\": \"莱西市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"370300\",\n        \"label\": \"淄博市\",\n        \"children\": [\n          {\n            \"value\": \"370302\",\n            \"label\": \"淄川区\"\n          },\n          {\n            \"value\": \"370303\",\n            \"label\": \"张店区\"\n          },\n          {\n            \"value\": \"370304\",\n            \"label\": \"博山区\"\n          },\n          {\n            \"value\": \"370305\",\n            \"label\": \"临淄区\"\n          },\n          {\n            \"value\": \"370306\",\n            \"label\": \"周村区\"\n          },\n          {\n            \"value\": \"370321\",\n            \"label\": \"桓台县\"\n          },\n          {\n            \"value\": \"370322\",\n            \"label\": \"高青县\"\n          },\n          {\n            \"value\": \"370323\",\n            \"label\": \"沂源县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"370400\",\n        \"label\": \"枣庄市\",\n        \"children\": [\n          {\n            \"value\": \"370402\",\n            \"label\": \"市中区\"\n          },\n          {\n            \"value\": \"370403\",\n            \"label\": \"薛城区\"\n          },\n          {\n            \"value\": \"370404\",\n            \"label\": \"峄城区\"\n          },\n          {\n            \"value\": \"370405\",\n            \"label\": \"台儿庄区\"\n          },\n          {\n            \"value\": \"370406\",\n            \"label\": \"山亭区\"\n          },\n          {\n            \"value\": \"370481\",\n            \"label\": \"滕州市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"370500\",\n        \"label\": \"东营市\",\n        \"children\": [\n          {\n            \"value\": \"370502\",\n            \"label\": \"东营区\"\n          },\n          {\n            \"value\": \"370503\",\n            \"label\": \"河口区\"\n          },\n          {\n            \"value\": \"370505\",\n            \"label\": \"垦利区\"\n          },\n          {\n            \"value\": \"370522\",\n            \"label\": \"利津县\"\n          },\n          {\n            \"value\": \"370523\",\n            \"label\": \"广饶县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"370600\",\n        \"label\": \"烟台市\",\n        \"children\": [\n          {\n            \"value\": \"370602\",\n            \"label\": \"芝罘区\"\n          },\n          {\n            \"value\": \"370611\",\n            \"label\": \"福山区\"\n          },\n          {\n            \"value\": \"370612\",\n            \"label\": \"牟平区\"\n          },\n          {\n            \"value\": \"370613\",\n            \"label\": \"莱山区\"\n          },\n          {\n            \"value\": \"370634\",\n            \"label\": \"长岛县\"\n          },\n          {\n            \"value\": \"370681\",\n            \"label\": \"龙口市\"\n          },\n          {\n            \"value\": \"370682\",\n            \"label\": \"莱阳市\"\n          },\n          {\n            \"value\": \"370683\",\n            \"label\": \"莱州市\"\n          },\n          {\n            \"value\": \"370684\",\n            \"label\": \"蓬莱市\"\n          },\n          {\n            \"value\": \"370685\",\n            \"label\": \"招远市\"\n          },\n          {\n            \"value\": \"370686\",\n            \"label\": \"栖霞市\"\n          },\n          {\n            \"value\": \"370687\",\n            \"label\": \"海阳市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"370700\",\n        \"label\": \"潍坊市\",\n        \"children\": [\n          {\n            \"value\": \"370702\",\n            \"label\": \"潍城区\"\n          },\n          {\n            \"value\": \"370703\",\n            \"label\": \"寒亭区\"\n          },\n          {\n            \"value\": \"370704\",\n            \"label\": \"坊子区\"\n          },\n          {\n            \"value\": \"370705\",\n            \"label\": \"奎文区\"\n          },\n          {\n            \"value\": \"370724\",\n            \"label\": \"临朐县\"\n          },\n          {\n            \"value\": \"370725\",\n            \"label\": \"昌乐县\"\n          },\n          {\n            \"value\": \"370781\",\n            \"label\": \"青州市\"\n          },\n          {\n            \"value\": \"370782\",\n            \"label\": \"诸城市\"\n          },\n          {\n            \"value\": \"370783\",\n            \"label\": \"寿光市\"\n          },\n          {\n            \"value\": \"370784\",\n            \"label\": \"安丘市\"\n          },\n          {\n            \"value\": \"370785\",\n            \"label\": \"高密市\"\n          },\n          {\n            \"value\": \"370786\",\n            \"label\": \"昌邑市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"370800\",\n        \"label\": \"济宁市\",\n        \"children\": [\n          {\n            \"value\": \"370811\",\n            \"label\": \"任城区\"\n          },\n          {\n            \"value\": \"370812\",\n            \"label\": \"兖州区\"\n          },\n          {\n            \"value\": \"370826\",\n            \"label\": \"微山县\"\n          },\n          {\n            \"value\": \"370827\",\n            \"label\": \"鱼台县\"\n          },\n          {\n            \"value\": \"370828\",\n            \"label\": \"金乡县\"\n          },\n          {\n            \"value\": \"370829\",\n            \"label\": \"嘉祥县\"\n          },\n          {\n            \"value\": \"370830\",\n            \"label\": \"汶上县\"\n          },\n          {\n            \"value\": \"370831\",\n            \"label\": \"泗水县\"\n          },\n          {\n            \"value\": \"370832\",\n            \"label\": \"梁山县\"\n          },\n          {\n            \"value\": \"370881\",\n            \"label\": \"曲阜市\"\n          },\n          {\n            \"value\": \"370883\",\n            \"label\": \"邹城市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"370900\",\n        \"label\": \"泰安市\",\n        \"children\": [\n          {\n            \"value\": \"370902\",\n            \"label\": \"泰山区\"\n          },\n          {\n            \"value\": \"370911\",\n            \"label\": \"岱岳区\"\n          },\n          {\n            \"value\": \"370921\",\n            \"label\": \"宁阳县\"\n          },\n          {\n            \"value\": \"370923\",\n            \"label\": \"东平县\"\n          },\n          {\n            \"value\": \"370982\",\n            \"label\": \"新泰市\"\n          },\n          {\n            \"value\": \"370983\",\n            \"label\": \"肥城市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"371000\",\n        \"label\": \"威海市\",\n        \"children\": [\n          {\n            \"value\": \"371002\",\n            \"label\": \"环翠区\"\n          },\n          {\n            \"value\": \"371003\",\n            \"label\": \"文登区\"\n          },\n          {\n            \"value\": \"371082\",\n            \"label\": \"荣成市\"\n          },\n          {\n            \"value\": \"371083\",\n            \"label\": \"乳山市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"371100\",\n        \"label\": \"日照市\",\n        \"children\": [\n          {\n            \"value\": \"371102\",\n            \"label\": \"东港区\"\n          },\n          {\n            \"value\": \"371103\",\n            \"label\": \"岚山区\"\n          },\n          {\n            \"value\": \"371121\",\n            \"label\": \"五莲县\"\n          },\n          {\n            \"value\": \"371122\",\n            \"label\": \"莒县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"371200\",\n        \"label\": \"莱芜市\",\n        \"children\": [\n          {\n            \"value\": \"371202\",\n            \"label\": \"莱城区\"\n          },\n          {\n            \"value\": \"371203\",\n            \"label\": \"钢城区\"\n          }\n        ]\n      },\n      {\n        \"value\": \"371300\",\n        \"label\": \"临沂市\",\n        \"children\": [\n          {\n            \"value\": \"371302\",\n            \"label\": \"兰山区\"\n          },\n          {\n            \"value\": \"371311\",\n            \"label\": \"罗庄区\"\n          },\n          {\n            \"value\": \"371312\",\n            \"label\": \"河东区\"\n          },\n          {\n            \"value\": \"371321\",\n            \"label\": \"沂南县\"\n          },\n          {\n            \"value\": \"371322\",\n            \"label\": \"郯城县\"\n          },\n          {\n            \"value\": \"371323\",\n            \"label\": \"沂水县\"\n          },\n          {\n            \"value\": \"371324\",\n            \"label\": \"兰陵县\"\n          },\n          {\n            \"value\": \"371325\",\n            \"label\": \"费县\"\n          },\n          {\n            \"value\": \"371326\",\n            \"label\": \"平邑县\"\n          },\n          {\n            \"value\": \"371327\",\n            \"label\": \"莒南县\"\n          },\n          {\n            \"value\": \"371328\",\n            \"label\": \"蒙阴县\"\n          },\n          {\n            \"value\": \"371329\",\n            \"label\": \"临沭县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"371400\",\n        \"label\": \"德州市\",\n        \"children\": [\n          {\n            \"value\": \"371402\",\n            \"label\": \"德城区\"\n          },\n          {\n            \"value\": \"371403\",\n            \"label\": \"陵城区\"\n          },\n          {\n            \"value\": \"371422\",\n            \"label\": \"宁津县\"\n          },\n          {\n            \"value\": \"371423\",\n            \"label\": \"庆云县\"\n          },\n          {\n            \"value\": \"371424\",\n            \"label\": \"临邑县\"\n          },\n          {\n            \"value\": \"371425\",\n            \"label\": \"齐河县\"\n          },\n          {\n            \"value\": \"371426\",\n            \"label\": \"平原县\"\n          },\n          {\n            \"value\": \"371427\",\n            \"label\": \"夏津县\"\n          },\n          {\n            \"value\": \"371428\",\n            \"label\": \"武城县\"\n          },\n          {\n            \"value\": \"371481\",\n            \"label\": \"乐陵市\"\n          },\n          {\n            \"value\": \"371482\",\n            \"label\": \"禹城市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"371500\",\n        \"label\": \"聊城市\",\n        \"children\": [\n          {\n            \"value\": \"371502\",\n            \"label\": \"东昌府区\"\n          },\n          {\n            \"value\": \"371521\",\n            \"label\": \"阳谷县\"\n          },\n          {\n            \"value\": \"371522\",\n            \"label\": \"莘县\"\n          },\n          {\n            \"value\": \"371523\",\n            \"label\": \"茌平县\"\n          },\n          {\n            \"value\": \"371524\",\n            \"label\": \"东阿县\"\n          },\n          {\n            \"value\": \"371525\",\n            \"label\": \"冠县\"\n          },\n          {\n            \"value\": \"371526\",\n            \"label\": \"高唐县\"\n          },\n          {\n            \"value\": \"371581\",\n            \"label\": \"临清市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"371600\",\n        \"label\": \"滨州市\",\n        \"children\": [\n          {\n            \"value\": \"371602\",\n            \"label\": \"滨城区\"\n          },\n          {\n            \"value\": \"371603\",\n            \"label\": \"沾化区\"\n          },\n          {\n            \"value\": \"371621\",\n            \"label\": \"惠民县\"\n          },\n          {\n            \"value\": \"371622\",\n            \"label\": \"阳信县\"\n          },\n          {\n            \"value\": \"371623\",\n            \"label\": \"无棣县\"\n          },\n          {\n            \"value\": \"371625\",\n            \"label\": \"博兴县\"\n          },\n          {\n            \"value\": \"371626\",\n            \"label\": \"邹平县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"371700\",\n        \"label\": \"菏泽市\",\n        \"children\": [\n          {\n            \"value\": \"371702\",\n            \"label\": \"牡丹区\"\n          },\n          {\n            \"value\": \"371703\",\n            \"label\": \"定陶区\"\n          },\n          {\n            \"value\": \"371721\",\n            \"label\": \"曹县\"\n          },\n          {\n            \"value\": \"371722\",\n            \"label\": \"单县\"\n          },\n          {\n            \"value\": \"371723\",\n            \"label\": \"成武县\"\n          },\n          {\n            \"value\": \"371724\",\n            \"label\": \"巨野县\"\n          },\n          {\n            \"value\": \"371725\",\n            \"label\": \"郓城县\"\n          },\n          {\n            \"value\": \"371726\",\n            \"label\": \"鄄城县\"\n          },\n          {\n            \"value\": \"371728\",\n            \"label\": \"东明县\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"410000\",\n    \"label\": \"河南省\",\n    \"children\": [\n      {\n        \"value\": \"410100\",\n        \"label\": \"郑州市\",\n        \"children\": [\n          {\n            \"value\": \"410102\",\n            \"label\": \"中原区\"\n          },\n          {\n            \"value\": \"410103\",\n            \"label\": \"二七区\"\n          },\n          {\n            \"value\": \"410104\",\n            \"label\": \"管城回族区\"\n          },\n          {\n            \"value\": \"410105\",\n            \"label\": \"金水区\"\n          },\n          {\n            \"value\": \"410106\",\n            \"label\": \"上街区\"\n          },\n          {\n            \"value\": \"410108\",\n            \"label\": \"惠济区\"\n          },\n          {\n            \"value\": \"410122\",\n            \"label\": \"中牟县\"\n          },\n          {\n            \"value\": \"410181\",\n            \"label\": \"巩义市\"\n          },\n          {\n            \"value\": \"410182\",\n            \"label\": \"荥阳市\"\n          },\n          {\n            \"value\": \"410183\",\n            \"label\": \"新密市\"\n          },\n          {\n            \"value\": \"410184\",\n            \"label\": \"新郑市\"\n          },\n          {\n            \"value\": \"410185\",\n            \"label\": \"登封市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"410200\",\n        \"label\": \"开封市\",\n        \"children\": [\n          {\n            \"value\": \"410202\",\n            \"label\": \"龙亭区\"\n          },\n          {\n            \"value\": \"410203\",\n            \"label\": \"顺河回族区\"\n          },\n          {\n            \"value\": \"410204\",\n            \"label\": \"鼓楼区\"\n          },\n          {\n            \"value\": \"410205\",\n            \"label\": \"禹王台区\"\n          },\n          {\n            \"value\": \"410212\",\n            \"label\": \"祥符区\"\n          },\n          {\n            \"value\": \"410221\",\n            \"label\": \"杞县\"\n          },\n          {\n            \"value\": \"410222\",\n            \"label\": \"通许县\"\n          },\n          {\n            \"value\": \"410223\",\n            \"label\": \"尉氏县\"\n          },\n          {\n            \"value\": \"410225\",\n            \"label\": \"兰考县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"410300\",\n        \"label\": \"洛阳市\",\n        \"children\": [\n          {\n            \"value\": \"410302\",\n            \"label\": \"老城区\"\n          },\n          {\n            \"value\": \"410303\",\n            \"label\": \"西工区\"\n          },\n          {\n            \"value\": \"410304\",\n            \"label\": \"瀍河回族区\"\n          },\n          {\n            \"value\": \"410305\",\n            \"label\": \"涧西区\"\n          },\n          {\n            \"value\": \"410306\",\n            \"label\": \"吉利区\"\n          },\n          {\n            \"value\": \"410311\",\n            \"label\": \"洛龙区\"\n          },\n          {\n            \"value\": \"410322\",\n            \"label\": \"孟津县\"\n          },\n          {\n            \"value\": \"410323\",\n            \"label\": \"新安县\"\n          },\n          {\n            \"value\": \"410324\",\n            \"label\": \"栾川县\"\n          },\n          {\n            \"value\": \"410325\",\n            \"label\": \"嵩县\"\n          },\n          {\n            \"value\": \"410326\",\n            \"label\": \"汝阳县\"\n          },\n          {\n            \"value\": \"410327\",\n            \"label\": \"宜阳县\"\n          },\n          {\n            \"value\": \"410328\",\n            \"label\": \"洛宁县\"\n          },\n          {\n            \"value\": \"410329\",\n            \"label\": \"伊川县\"\n          },\n          {\n            \"value\": \"410381\",\n            \"label\": \"偃师市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"410400\",\n        \"label\": \"平顶山市\",\n        \"children\": [\n          {\n            \"value\": \"410402\",\n            \"label\": \"新华区\"\n          },\n          {\n            \"value\": \"410403\",\n            \"label\": \"卫东区\"\n          },\n          {\n            \"value\": \"410404\",\n            \"label\": \"石龙区\"\n          },\n          {\n            \"value\": \"410411\",\n            \"label\": \"湛河区\"\n          },\n          {\n            \"value\": \"410421\",\n            \"label\": \"宝丰县\"\n          },\n          {\n            \"value\": \"410422\",\n            \"label\": \"叶县\"\n          },\n          {\n            \"value\": \"410423\",\n            \"label\": \"鲁山县\"\n          },\n          {\n            \"value\": \"410425\",\n            \"label\": \"郏县\"\n          },\n          {\n            \"value\": \"410481\",\n            \"label\": \"舞钢市\"\n          },\n          {\n            \"value\": \"410482\",\n            \"label\": \"汝州市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"410500\",\n        \"label\": \"安阳市\",\n        \"children\": [\n          {\n            \"value\": \"410502\",\n            \"label\": \"文峰区\"\n          },\n          {\n            \"value\": \"410503\",\n            \"label\": \"北关区\"\n          },\n          {\n            \"value\": \"410505\",\n            \"label\": \"殷都区\"\n          },\n          {\n            \"value\": \"410506\",\n            \"label\": \"龙安区\"\n          },\n          {\n            \"value\": \"410522\",\n            \"label\": \"安阳县\"\n          },\n          {\n            \"value\": \"410523\",\n            \"label\": \"汤阴县\"\n          },\n          {\n            \"value\": \"410526\",\n            \"label\": \"滑县\"\n          },\n          {\n            \"value\": \"410527\",\n            \"label\": \"内黄县\"\n          },\n          {\n            \"value\": \"410581\",\n            \"label\": \"林州市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"410600\",\n        \"label\": \"鹤壁市\",\n        \"children\": [\n          {\n            \"value\": \"410602\",\n            \"label\": \"鹤山区\"\n          },\n          {\n            \"value\": \"410603\",\n            \"label\": \"山城区\"\n          },\n          {\n            \"value\": \"410611\",\n            \"label\": \"淇滨区\"\n          },\n          {\n            \"value\": \"410621\",\n            \"label\": \"浚县\"\n          },\n          {\n            \"value\": \"410622\",\n            \"label\": \"淇县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"410700\",\n        \"label\": \"新乡市\",\n        \"children\": [\n          {\n            \"value\": \"410702\",\n            \"label\": \"红旗区\"\n          },\n          {\n            \"value\": \"410703\",\n            \"label\": \"卫滨区\"\n          },\n          {\n            \"value\": \"410704\",\n            \"label\": \"凤泉区\"\n          },\n          {\n            \"value\": \"410711\",\n            \"label\": \"牧野区\"\n          },\n          {\n            \"value\": \"410721\",\n            \"label\": \"新乡县\"\n          },\n          {\n            \"value\": \"410724\",\n            \"label\": \"获嘉县\"\n          },\n          {\n            \"value\": \"410725\",\n            \"label\": \"原阳县\"\n          },\n          {\n            \"value\": \"410726\",\n            \"label\": \"延津县\"\n          },\n          {\n            \"value\": \"410727\",\n            \"label\": \"封丘县\"\n          },\n          {\n            \"value\": \"410728\",\n            \"label\": \"长垣县\"\n          },\n          {\n            \"value\": \"410781\",\n            \"label\": \"卫辉市\"\n          },\n          {\n            \"value\": \"410782\",\n            \"label\": \"辉县市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"410800\",\n        \"label\": \"焦作市\",\n        \"children\": [\n          {\n            \"value\": \"410802\",\n            \"label\": \"解放区\"\n          },\n          {\n            \"value\": \"410803\",\n            \"label\": \"中站区\"\n          },\n          {\n            \"value\": \"410804\",\n            \"label\": \"马村区\"\n          },\n          {\n            \"value\": \"410811\",\n            \"label\": \"山阳区\"\n          },\n          {\n            \"value\": \"410821\",\n            \"label\": \"修武县\"\n          },\n          {\n            \"value\": \"410822\",\n            \"label\": \"博爱县\"\n          },\n          {\n            \"value\": \"410823\",\n            \"label\": \"武陟县\"\n          },\n          {\n            \"value\": \"410825\",\n            \"label\": \"温县\"\n          },\n          {\n            \"value\": \"410882\",\n            \"label\": \"沁阳市\"\n          },\n          {\n            \"value\": \"410883\",\n            \"label\": \"孟州市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"410900\",\n        \"label\": \"濮阳市\",\n        \"children\": [\n          {\n            \"value\": \"410902\",\n            \"label\": \"华龙区\"\n          },\n          {\n            \"value\": \"410922\",\n            \"label\": \"清丰县\"\n          },\n          {\n            \"value\": \"410923\",\n            \"label\": \"南乐县\"\n          },\n          {\n            \"value\": \"410926\",\n            \"label\": \"范县\"\n          },\n          {\n            \"value\": \"410927\",\n            \"label\": \"台前县\"\n          },\n          {\n            \"value\": \"410928\",\n            \"label\": \"濮阳县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"411000\",\n        \"label\": \"许昌市\",\n        \"children\": [\n          {\n            \"value\": \"411002\",\n            \"label\": \"魏都区\"\n          },\n          {\n            \"value\": \"411003\",\n            \"label\": \"建安区\"\n          },\n          {\n            \"value\": \"411024\",\n            \"label\": \"鄢陵县\"\n          },\n          {\n            \"value\": \"411025\",\n            \"label\": \"襄城县\"\n          },\n          {\n            \"value\": \"411081\",\n            \"label\": \"禹州市\"\n          },\n          {\n            \"value\": \"411082\",\n            \"label\": \"长葛市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"411100\",\n        \"label\": \"漯河市\",\n        \"children\": [\n          {\n            \"value\": \"411102\",\n            \"label\": \"源汇区\"\n          },\n          {\n            \"value\": \"411103\",\n            \"label\": \"郾城区\"\n          },\n          {\n            \"value\": \"411104\",\n            \"label\": \"召陵区\"\n          },\n          {\n            \"value\": \"411121\",\n            \"label\": \"舞阳县\"\n          },\n          {\n            \"value\": \"411122\",\n            \"label\": \"临颍县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"411200\",\n        \"label\": \"三门峡市\",\n        \"children\": [\n          {\n            \"value\": \"411202\",\n            \"label\": \"湖滨区\"\n          },\n          {\n            \"value\": \"411203\",\n            \"label\": \"陕州区\"\n          },\n          {\n            \"value\": \"411221\",\n            \"label\": \"渑池县\"\n          },\n          {\n            \"value\": \"411224\",\n            \"label\": \"卢氏县\"\n          },\n          {\n            \"value\": \"411281\",\n            \"label\": \"义马市\"\n          },\n          {\n            \"value\": \"411282\",\n            \"label\": \"灵宝市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"411300\",\n        \"label\": \"南阳市\",\n        \"children\": [\n          {\n            \"value\": \"411302\",\n            \"label\": \"宛城区\"\n          },\n          {\n            \"value\": \"411303\",\n            \"label\": \"卧龙区\"\n          },\n          {\n            \"value\": \"411321\",\n            \"label\": \"南召县\"\n          },\n          {\n            \"value\": \"411322\",\n            \"label\": \"方城县\"\n          },\n          {\n            \"value\": \"411323\",\n            \"label\": \"西峡县\"\n          },\n          {\n            \"value\": \"411324\",\n            \"label\": \"镇平县\"\n          },\n          {\n            \"value\": \"411325\",\n            \"label\": \"内乡县\"\n          },\n          {\n            \"value\": \"411326\",\n            \"label\": \"淅川县\"\n          },\n          {\n            \"value\": \"411327\",\n            \"label\": \"社旗县\"\n          },\n          {\n            \"value\": \"411328\",\n            \"label\": \"唐河县\"\n          },\n          {\n            \"value\": \"411329\",\n            \"label\": \"新野县\"\n          },\n          {\n            \"value\": \"411330\",\n            \"label\": \"桐柏县\"\n          },\n          {\n            \"value\": \"411381\",\n            \"label\": \"邓州市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"411400\",\n        \"label\": \"商丘市\",\n        \"children\": [\n          {\n            \"value\": \"411402\",\n            \"label\": \"梁园区\"\n          },\n          {\n            \"value\": \"411403\",\n            \"label\": \"睢阳区\"\n          },\n          {\n            \"value\": \"411421\",\n            \"label\": \"民权县\"\n          },\n          {\n            \"value\": \"411422\",\n            \"label\": \"睢县\"\n          },\n          {\n            \"value\": \"411423\",\n            \"label\": \"宁陵县\"\n          },\n          {\n            \"value\": \"411424\",\n            \"label\": \"柘城县\"\n          },\n          {\n            \"value\": \"411425\",\n            \"label\": \"虞城县\"\n          },\n          {\n            \"value\": \"411426\",\n            \"label\": \"夏邑县\"\n          },\n          {\n            \"value\": \"411481\",\n            \"label\": \"永城市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"411500\",\n        \"label\": \"信阳市\",\n        \"children\": [\n          {\n            \"value\": \"411502\",\n            \"label\": \"浉河区\"\n          },\n          {\n            \"value\": \"411503\",\n            \"label\": \"平桥区\"\n          },\n          {\n            \"value\": \"411521\",\n            \"label\": \"罗山县\"\n          },\n          {\n            \"value\": \"411522\",\n            \"label\": \"光山县\"\n          },\n          {\n            \"value\": \"411523\",\n            \"label\": \"新县\"\n          },\n          {\n            \"value\": \"411524\",\n            \"label\": \"商城县\"\n          },\n          {\n            \"value\": \"411525\",\n            \"label\": \"固始县\"\n          },\n          {\n            \"value\": \"411526\",\n            \"label\": \"潢川县\"\n          },\n          {\n            \"value\": \"411527\",\n            \"label\": \"淮滨县\"\n          },\n          {\n            \"value\": \"411528\",\n            \"label\": \"息县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"411600\",\n        \"label\": \"周口市\",\n        \"children\": [\n          {\n            \"value\": \"411602\",\n            \"label\": \"川汇区\"\n          },\n          {\n            \"value\": \"411621\",\n            \"label\": \"扶沟县\"\n          },\n          {\n            \"value\": \"411622\",\n            \"label\": \"西华县\"\n          },\n          {\n            \"value\": \"411623\",\n            \"label\": \"商水县\"\n          },\n          {\n            \"value\": \"411624\",\n            \"label\": \"沈丘县\"\n          },\n          {\n            \"value\": \"411625\",\n            \"label\": \"郸城县\"\n          },\n          {\n            \"value\": \"411626\",\n            \"label\": \"淮阳县\"\n          },\n          {\n            \"value\": \"411627\",\n            \"label\": \"太康县\"\n          },\n          {\n            \"value\": \"411628\",\n            \"label\": \"鹿邑县\"\n          },\n          {\n            \"value\": \"411681\",\n            \"label\": \"项城市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"411700\",\n        \"label\": \"驻马店市\",\n        \"children\": [\n          {\n            \"value\": \"411702\",\n            \"label\": \"驿城区\"\n          },\n          {\n            \"value\": \"411721\",\n            \"label\": \"西平县\"\n          },\n          {\n            \"value\": \"411722\",\n            \"label\": \"上蔡县\"\n          },\n          {\n            \"value\": \"411723\",\n            \"label\": \"平舆县\"\n          },\n          {\n            \"value\": \"411724\",\n            \"label\": \"正阳县\"\n          },\n          {\n            \"value\": \"411725\",\n            \"label\": \"确山县\"\n          },\n          {\n            \"value\": \"411726\",\n            \"label\": \"泌阳县\"\n          },\n          {\n            \"value\": \"411727\",\n            \"label\": \"汝南县\"\n          },\n          {\n            \"value\": \"411728\",\n            \"label\": \"遂平县\"\n          },\n          {\n            \"value\": \"411729\",\n            \"label\": \"新蔡县\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"420000\",\n    \"label\": \"湖北省\",\n    \"children\": [\n      {\n        \"value\": \"420100\",\n        \"label\": \"武汉市\",\n        \"children\": [\n          {\n            \"value\": \"420102\",\n            \"label\": \"江岸区\"\n          },\n          {\n            \"value\": \"420103\",\n            \"label\": \"江汉区\"\n          },\n          {\n            \"value\": \"420104\",\n            \"label\": \"硚口区\"\n          },\n          {\n            \"value\": \"420105\",\n            \"label\": \"汉阳区\"\n          },\n          {\n            \"value\": \"420106\",\n            \"label\": \"武昌区\"\n          },\n          {\n            \"value\": \"420107\",\n            \"label\": \"青山区\"\n          },\n          {\n            \"value\": \"420111\",\n            \"label\": \"洪山区\"\n          },\n          {\n            \"value\": \"420112\",\n            \"label\": \"东西湖区\"\n          },\n          {\n            \"value\": \"420113\",\n            \"label\": \"汉南区\"\n          },\n          {\n            \"value\": \"420114\",\n            \"label\": \"蔡甸区\"\n          },\n          {\n            \"value\": \"420115\",\n            \"label\": \"江夏区\"\n          },\n          {\n            \"value\": \"420116\",\n            \"label\": \"黄陂区\"\n          },\n          {\n            \"value\": \"420117\",\n            \"label\": \"新洲区\"\n          }\n        ]\n      },\n      {\n        \"value\": \"420200\",\n        \"label\": \"黄石市\",\n        \"children\": [\n          {\n            \"value\": \"420202\",\n            \"label\": \"黄石港区\"\n          },\n          {\n            \"value\": \"420203\",\n            \"label\": \"西塞山区\"\n          },\n          {\n            \"value\": \"420204\",\n            \"label\": \"下陆区\"\n          },\n          {\n            \"value\": \"420205\",\n            \"label\": \"铁山区\"\n          },\n          {\n            \"value\": \"420222\",\n            \"label\": \"阳新县\"\n          },\n          {\n            \"value\": \"420281\",\n            \"label\": \"大冶市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"420300\",\n        \"label\": \"十堰市\",\n        \"children\": [\n          {\n            \"value\": \"420302\",\n            \"label\": \"茅箭区\"\n          },\n          {\n            \"value\": \"420303\",\n            \"label\": \"张湾区\"\n          },\n          {\n            \"value\": \"420304\",\n            \"label\": \"郧阳区\"\n          },\n          {\n            \"value\": \"420322\",\n            \"label\": \"郧西县\"\n          },\n          {\n            \"value\": \"420323\",\n            \"label\": \"竹山县\"\n          },\n          {\n            \"value\": \"420324\",\n            \"label\": \"竹溪县\"\n          },\n          {\n            \"value\": \"420325\",\n            \"label\": \"房县\"\n          },\n          {\n            \"value\": \"420381\",\n            \"label\": \"丹江口市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"420500\",\n        \"label\": \"宜昌市\",\n        \"children\": [\n          {\n            \"value\": \"420502\",\n            \"label\": \"西陵区\"\n          },\n          {\n            \"value\": \"420503\",\n            \"label\": \"伍家岗区\"\n          },\n          {\n            \"value\": \"420504\",\n            \"label\": \"点军区\"\n          },\n          {\n            \"value\": \"420505\",\n            \"label\": \"猇亭区\"\n          },\n          {\n            \"value\": \"420506\",\n            \"label\": \"夷陵区\"\n          },\n          {\n            \"value\": \"420525\",\n            \"label\": \"远安县\"\n          },\n          {\n            \"value\": \"420526\",\n            \"label\": \"兴山县\"\n          },\n          {\n            \"value\": \"420527\",\n            \"label\": \"秭归县\"\n          },\n          {\n            \"value\": \"420528\",\n            \"label\": \"长阳土家族自治县\"\n          },\n          {\n            \"value\": \"420529\",\n            \"label\": \"五峰土家族自治县\"\n          },\n          {\n            \"value\": \"420581\",\n            \"label\": \"宜都市\"\n          },\n          {\n            \"value\": \"420582\",\n            \"label\": \"当阳市\"\n          },\n          {\n            \"value\": \"420583\",\n            \"label\": \"枝江市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"420600\",\n        \"label\": \"襄阳市\",\n        \"children\": [\n          {\n            \"value\": \"420602\",\n            \"label\": \"襄城区\"\n          },\n          {\n            \"value\": \"420606\",\n            \"label\": \"樊城区\"\n          },\n          {\n            \"value\": \"420607\",\n            \"label\": \"襄州区\"\n          },\n          {\n            \"value\": \"420624\",\n            \"label\": \"南漳县\"\n          },\n          {\n            \"value\": \"420625\",\n            \"label\": \"谷城县\"\n          },\n          {\n            \"value\": \"420626\",\n            \"label\": \"保康县\"\n          },\n          {\n            \"value\": \"420682\",\n            \"label\": \"老河口市\"\n          },\n          {\n            \"value\": \"420683\",\n            \"label\": \"枣阳市\"\n          },\n          {\n            \"value\": \"420684\",\n            \"label\": \"宜城市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"420700\",\n        \"label\": \"鄂州市\",\n        \"children\": [\n          {\n            \"value\": \"420702\",\n            \"label\": \"梁子湖区\"\n          },\n          {\n            \"value\": \"420703\",\n            \"label\": \"华容区\"\n          },\n          {\n            \"value\": \"420704\",\n            \"label\": \"鄂城区\"\n          }\n        ]\n      },\n      {\n        \"value\": \"420800\",\n        \"label\": \"荆门市\",\n        \"children\": [\n          {\n            \"value\": \"420802\",\n            \"label\": \"东宝区\"\n          },\n          {\n            \"value\": \"420804\",\n            \"label\": \"掇刀区\"\n          },\n          {\n            \"value\": \"420822\",\n            \"label\": \"沙洋县\"\n          },\n          {\n            \"value\": \"420881\",\n            \"label\": \"钟祥市\"\n          },\n          {\n            \"value\": \"420882\",\n            \"label\": \"京山市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"420900\",\n        \"label\": \"孝感市\",\n        \"children\": [\n          {\n            \"value\": \"420902\",\n            \"label\": \"孝南区\"\n          },\n          {\n            \"value\": \"420921\",\n            \"label\": \"孝昌县\"\n          },\n          {\n            \"value\": \"420922\",\n            \"label\": \"大悟县\"\n          },\n          {\n            \"value\": \"420923\",\n            \"label\": \"云梦县\"\n          },\n          {\n            \"value\": \"420981\",\n            \"label\": \"应城市\"\n          },\n          {\n            \"value\": \"420982\",\n            \"label\": \"安陆市\"\n          },\n          {\n            \"value\": \"420984\",\n            \"label\": \"汉川市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"421000\",\n        \"label\": \"荆州市\",\n        \"children\": [\n          {\n            \"value\": \"421002\",\n            \"label\": \"沙市区\"\n          },\n          {\n            \"value\": \"421003\",\n            \"label\": \"荆州区\"\n          },\n          {\n            \"value\": \"421022\",\n            \"label\": \"公安县\"\n          },\n          {\n            \"value\": \"421023\",\n            \"label\": \"监利县\"\n          },\n          {\n            \"value\": \"421024\",\n            \"label\": \"江陵县\"\n          },\n          {\n            \"value\": \"421081\",\n            \"label\": \"石首市\"\n          },\n          {\n            \"value\": \"421083\",\n            \"label\": \"洪湖市\"\n          },\n          {\n            \"value\": \"421087\",\n            \"label\": \"松滋市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"421100\",\n        \"label\": \"黄冈市\",\n        \"children\": [\n          {\n            \"value\": \"421102\",\n            \"label\": \"黄州区\"\n          },\n          {\n            \"value\": \"421121\",\n            \"label\": \"团风县\"\n          },\n          {\n            \"value\": \"421122\",\n            \"label\": \"红安县\"\n          },\n          {\n            \"value\": \"421123\",\n            \"label\": \"罗田县\"\n          },\n          {\n            \"value\": \"421124\",\n            \"label\": \"英山县\"\n          },\n          {\n            \"value\": \"421125\",\n            \"label\": \"浠水县\"\n          },\n          {\n            \"value\": \"421126\",\n            \"label\": \"蕲春县\"\n          },\n          {\n            \"value\": \"421127\",\n            \"label\": \"黄梅县\"\n          },\n          {\n            \"value\": \"421181\",\n            \"label\": \"麻城市\"\n          },\n          {\n            \"value\": \"421182\",\n            \"label\": \"武穴市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"421200\",\n        \"label\": \"咸宁市\",\n        \"children\": [\n          {\n            \"value\": \"421202\",\n            \"label\": \"咸安区\"\n          },\n          {\n            \"value\": \"421221\",\n            \"label\": \"嘉鱼县\"\n          },\n          {\n            \"value\": \"421222\",\n            \"label\": \"通城县\"\n          },\n          {\n            \"value\": \"421223\",\n            \"label\": \"崇阳县\"\n          },\n          {\n            \"value\": \"421224\",\n            \"label\": \"通山县\"\n          },\n          {\n            \"value\": \"421281\",\n            \"label\": \"赤壁市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"421300\",\n        \"label\": \"随州市\",\n        \"children\": [\n          {\n            \"value\": \"421303\",\n            \"label\": \"曾都区\"\n          },\n          {\n            \"value\": \"421321\",\n            \"label\": \"随县\"\n          },\n          {\n            \"value\": \"421381\",\n            \"label\": \"广水市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"422800\",\n        \"label\": \"恩施土家族苗族自治州\",\n        \"children\": [\n          {\n            \"value\": \"422801\",\n            \"label\": \"恩施市\"\n          },\n          {\n            \"value\": \"422802\",\n            \"label\": \"利川市\"\n          },\n          {\n            \"value\": \"422822\",\n            \"label\": \"建始县\"\n          },\n          {\n            \"value\": \"422823\",\n            \"label\": \"巴东县\"\n          },\n          {\n            \"value\": \"422825\",\n            \"label\": \"宣恩县\"\n          },\n          {\n            \"value\": \"422826\",\n            \"label\": \"咸丰县\"\n          },\n          {\n            \"value\": \"422827\",\n            \"label\": \"来凤县\"\n          },\n          {\n            \"value\": \"422828\",\n            \"label\": \"鹤峰县\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"430000\",\n    \"label\": \"湖南省\",\n    \"children\": [\n      {\n        \"value\": \"430100\",\n        \"label\": \"长沙市\",\n        \"children\": [\n          {\n            \"value\": \"430102\",\n            \"label\": \"芙蓉区\"\n          },\n          {\n            \"value\": \"430103\",\n            \"label\": \"天心区\"\n          },\n          {\n            \"value\": \"430104\",\n            \"label\": \"岳麓区\"\n          },\n          {\n            \"value\": \"430105\",\n            \"label\": \"开福区\"\n          },\n          {\n            \"value\": \"430111\",\n            \"label\": \"雨花区\"\n          },\n          {\n            \"value\": \"430112\",\n            \"label\": \"望城区\"\n          },\n          {\n            \"value\": \"430121\",\n            \"label\": \"长沙县\"\n          },\n          {\n            \"value\": \"430181\",\n            \"label\": \"浏阳市\"\n          },\n          {\n            \"value\": \"430182\",\n            \"label\": \"宁乡市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"430200\",\n        \"label\": \"株洲市\",\n        \"children\": [\n          {\n            \"value\": \"430202\",\n            \"label\": \"荷塘区\"\n          },\n          {\n            \"value\": \"430203\",\n            \"label\": \"芦淞区\"\n          },\n          {\n            \"value\": \"430204\",\n            \"label\": \"石峰区\"\n          },\n          {\n            \"value\": \"430211\",\n            \"label\": \"天元区\"\n          },\n          {\n            \"value\": \"430212\",\n            \"label\": \"渌口区\"\n          },\n          {\n            \"value\": \"430223\",\n            \"label\": \"攸县\"\n          },\n          {\n            \"value\": \"430224\",\n            \"label\": \"茶陵县\"\n          },\n          {\n            \"value\": \"430225\",\n            \"label\": \"炎陵县\"\n          },\n          {\n            \"value\": \"430281\",\n            \"label\": \"醴陵市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"430300\",\n        \"label\": \"湘潭市\",\n        \"children\": [\n          {\n            \"value\": \"430302\",\n            \"label\": \"雨湖区\"\n          },\n          {\n            \"value\": \"430304\",\n            \"label\": \"岳塘区\"\n          },\n          {\n            \"value\": \"430321\",\n            \"label\": \"湘潭县\"\n          },\n          {\n            \"value\": \"430381\",\n            \"label\": \"湘乡市\"\n          },\n          {\n            \"value\": \"430382\",\n            \"label\": \"韶山市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"430400\",\n        \"label\": \"衡阳市\",\n        \"children\": [\n          {\n            \"value\": \"430405\",\n            \"label\": \"珠晖区\"\n          },\n          {\n            \"value\": \"430406\",\n            \"label\": \"雁峰区\"\n          },\n          {\n            \"value\": \"430407\",\n            \"label\": \"石鼓区\"\n          },\n          {\n            \"value\": \"430408\",\n            \"label\": \"蒸湘区\"\n          },\n          {\n            \"value\": \"430412\",\n            \"label\": \"南岳区\"\n          },\n          {\n            \"value\": \"430421\",\n            \"label\": \"衡阳县\"\n          },\n          {\n            \"value\": \"430422\",\n            \"label\": \"衡南县\"\n          },\n          {\n            \"value\": \"430423\",\n            \"label\": \"衡山县\"\n          },\n          {\n            \"value\": \"430424\",\n            \"label\": \"衡东县\"\n          },\n          {\n            \"value\": \"430426\",\n            \"label\": \"祁东县\"\n          },\n          {\n            \"value\": \"430481\",\n            \"label\": \"耒阳市\"\n          },\n          {\n            \"value\": \"430482\",\n            \"label\": \"常宁市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"430500\",\n        \"label\": \"邵阳市\",\n        \"children\": [\n          {\n            \"value\": \"430502\",\n            \"label\": \"双清区\"\n          },\n          {\n            \"value\": \"430503\",\n            \"label\": \"大祥区\"\n          },\n          {\n            \"value\": \"430511\",\n            \"label\": \"北塔区\"\n          },\n          {\n            \"value\": \"430521\",\n            \"label\": \"邵东县\"\n          },\n          {\n            \"value\": \"430522\",\n            \"label\": \"新邵县\"\n          },\n          {\n            \"value\": \"430523\",\n            \"label\": \"邵阳县\"\n          },\n          {\n            \"value\": \"430524\",\n            \"label\": \"隆回县\"\n          },\n          {\n            \"value\": \"430525\",\n            \"label\": \"洞口县\"\n          },\n          {\n            \"value\": \"430527\",\n            \"label\": \"绥宁县\"\n          },\n          {\n            \"value\": \"430528\",\n            \"label\": \"新宁县\"\n          },\n          {\n            \"value\": \"430529\",\n            \"label\": \"城步苗族自治县\"\n          },\n          {\n            \"value\": \"430581\",\n            \"label\": \"武冈市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"430600\",\n        \"label\": \"岳阳市\",\n        \"children\": [\n          {\n            \"value\": \"430602\",\n            \"label\": \"岳阳楼区\"\n          },\n          {\n            \"value\": \"430603\",\n            \"label\": \"云溪区\"\n          },\n          {\n            \"value\": \"430611\",\n            \"label\": \"君山区\"\n          },\n          {\n            \"value\": \"430621\",\n            \"label\": \"岳阳县\"\n          },\n          {\n            \"value\": \"430623\",\n            \"label\": \"华容县\"\n          },\n          {\n            \"value\": \"430624\",\n            \"label\": \"湘阴县\"\n          },\n          {\n            \"value\": \"430626\",\n            \"label\": \"平江县\"\n          },\n          {\n            \"value\": \"430681\",\n            \"label\": \"汨罗市\"\n          },\n          {\n            \"value\": \"430682\",\n            \"label\": \"临湘市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"430700\",\n        \"label\": \"常德市\",\n        \"children\": [\n          {\n            \"value\": \"430702\",\n            \"label\": \"武陵区\"\n          },\n          {\n            \"value\": \"430703\",\n            \"label\": \"鼎城区\"\n          },\n          {\n            \"value\": \"430721\",\n            \"label\": \"安乡县\"\n          },\n          {\n            \"value\": \"430722\",\n            \"label\": \"汉寿县\"\n          },\n          {\n            \"value\": \"430723\",\n            \"label\": \"澧县\"\n          },\n          {\n            \"value\": \"430724\",\n            \"label\": \"临澧县\"\n          },\n          {\n            \"value\": \"430725\",\n            \"label\": \"桃源县\"\n          },\n          {\n            \"value\": \"430726\",\n            \"label\": \"石门县\"\n          },\n          {\n            \"value\": \"430781\",\n            \"label\": \"津市市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"430800\",\n        \"label\": \"张家界市\",\n        \"children\": [\n          {\n            \"value\": \"430802\",\n            \"label\": \"永定区\"\n          },\n          {\n            \"value\": \"430811\",\n            \"label\": \"武陵源区\"\n          },\n          {\n            \"value\": \"430821\",\n            \"label\": \"慈利县\"\n          },\n          {\n            \"value\": \"430822\",\n            \"label\": \"桑植县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"430900\",\n        \"label\": \"益阳市\",\n        \"children\": [\n          {\n            \"value\": \"430902\",\n            \"label\": \"资阳区\"\n          },\n          {\n            \"value\": \"430903\",\n            \"label\": \"赫山区\"\n          },\n          {\n            \"value\": \"430921\",\n            \"label\": \"南县\"\n          },\n          {\n            \"value\": \"430922\",\n            \"label\": \"桃江县\"\n          },\n          {\n            \"value\": \"430923\",\n            \"label\": \"安化县\"\n          },\n          {\n            \"value\": \"430981\",\n            \"label\": \"沅江市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"431000\",\n        \"label\": \"郴州市\",\n        \"children\": [\n          {\n            \"value\": \"431002\",\n            \"label\": \"北湖区\"\n          },\n          {\n            \"value\": \"431003\",\n            \"label\": \"苏仙区\"\n          },\n          {\n            \"value\": \"431021\",\n            \"label\": \"桂阳县\"\n          },\n          {\n            \"value\": \"431022\",\n            \"label\": \"宜章县\"\n          },\n          {\n            \"value\": \"431023\",\n            \"label\": \"永兴县\"\n          },\n          {\n            \"value\": \"431024\",\n            \"label\": \"嘉禾县\"\n          },\n          {\n            \"value\": \"431025\",\n            \"label\": \"临武县\"\n          },\n          {\n            \"value\": \"431026\",\n            \"label\": \"汝城县\"\n          },\n          {\n            \"value\": \"431027\",\n            \"label\": \"桂东县\"\n          },\n          {\n            \"value\": \"431028\",\n            \"label\": \"安仁县\"\n          },\n          {\n            \"value\": \"431081\",\n            \"label\": \"资兴市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"431100\",\n        \"label\": \"永州市\",\n        \"children\": [\n          {\n            \"value\": \"431102\",\n            \"label\": \"零陵区\"\n          },\n          {\n            \"value\": \"431103\",\n            \"label\": \"冷水滩区\"\n          },\n          {\n            \"value\": \"431121\",\n            \"label\": \"祁阳县\"\n          },\n          {\n            \"value\": \"431122\",\n            \"label\": \"东安县\"\n          },\n          {\n            \"value\": \"431123\",\n            \"label\": \"双牌县\"\n          },\n          {\n            \"value\": \"431124\",\n            \"label\": \"道县\"\n          },\n          {\n            \"value\": \"431125\",\n            \"label\": \"江永县\"\n          },\n          {\n            \"value\": \"431126\",\n            \"label\": \"宁远县\"\n          },\n          {\n            \"value\": \"431127\",\n            \"label\": \"蓝山县\"\n          },\n          {\n            \"value\": \"431128\",\n            \"label\": \"新田县\"\n          },\n          {\n            \"value\": \"431129\",\n            \"label\": \"江华瑶族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"431200\",\n        \"label\": \"怀化市\",\n        \"children\": [\n          {\n            \"value\": \"431202\",\n            \"label\": \"鹤城区\"\n          },\n          {\n            \"value\": \"431221\",\n            \"label\": \"中方县\"\n          },\n          {\n            \"value\": \"431222\",\n            \"label\": \"沅陵县\"\n          },\n          {\n            \"value\": \"431223\",\n            \"label\": \"辰溪县\"\n          },\n          {\n            \"value\": \"431224\",\n            \"label\": \"溆浦县\"\n          },\n          {\n            \"value\": \"431225\",\n            \"label\": \"会同县\"\n          },\n          {\n            \"value\": \"431226\",\n            \"label\": \"麻阳苗族自治县\"\n          },\n          {\n            \"value\": \"431227\",\n            \"label\": \"新晃侗族自治县\"\n          },\n          {\n            \"value\": \"431228\",\n            \"label\": \"芷江侗族自治县\"\n          },\n          {\n            \"value\": \"431229\",\n            \"label\": \"靖州苗族侗族自治县\"\n          },\n          {\n            \"value\": \"431230\",\n            \"label\": \"通道侗族自治县\"\n          },\n          {\n            \"value\": \"431281\",\n            \"label\": \"洪江市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"431300\",\n        \"label\": \"娄底市\",\n        \"children\": [\n          {\n            \"value\": \"431302\",\n            \"label\": \"娄星区\"\n          },\n          {\n            \"value\": \"431321\",\n            \"label\": \"双峰县\"\n          },\n          {\n            \"value\": \"431322\",\n            \"label\": \"新化县\"\n          },\n          {\n            \"value\": \"431381\",\n            \"label\": \"冷水江市\"\n          },\n          {\n            \"value\": \"431382\",\n            \"label\": \"涟源市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"433100\",\n        \"label\": \"湘西土家族苗族自治州\",\n        \"children\": [\n          {\n            \"value\": \"433101\",\n            \"label\": \"吉首市\"\n          },\n          {\n            \"value\": \"433122\",\n            \"label\": \"泸溪县\"\n          },\n          {\n            \"value\": \"433123\",\n            \"label\": \"凤凰县\"\n          },\n          {\n            \"value\": \"433124\",\n            \"label\": \"花垣县\"\n          },\n          {\n            \"value\": \"433125\",\n            \"label\": \"保靖县\"\n          },\n          {\n            \"value\": \"433126\",\n            \"label\": \"古丈县\"\n          },\n          {\n            \"value\": \"433127\",\n            \"label\": \"永顺县\"\n          },\n          {\n            \"value\": \"433130\",\n            \"label\": \"龙山县\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"440000\",\n    \"label\": \"广东省\",\n    \"children\": [\n      {\n        \"value\": \"440100\",\n        \"label\": \"广州市\",\n        \"children\": [\n          {\n            \"value\": \"440103\",\n            \"label\": \"荔湾区\"\n          },\n          {\n            \"value\": \"440104\",\n            \"label\": \"越秀区\"\n          },\n          {\n            \"value\": \"440105\",\n            \"label\": \"海珠区\"\n          },\n          {\n            \"value\": \"440106\",\n            \"label\": \"天河区\"\n          },\n          {\n            \"value\": \"440111\",\n            \"label\": \"白云区\"\n          },\n          {\n            \"value\": \"440112\",\n            \"label\": \"黄埔区\"\n          },\n          {\n            \"value\": \"440113\",\n            \"label\": \"番禺区\"\n          },\n          {\n            \"value\": \"440114\",\n            \"label\": \"花都区\"\n          },\n          {\n            \"value\": \"440115\",\n            \"label\": \"南沙区\"\n          },\n          {\n            \"value\": \"440117\",\n            \"label\": \"从化区\"\n          },\n          {\n            \"value\": \"440118\",\n            \"label\": \"增城区\"\n          }\n        ]\n      },\n      {\n        \"value\": \"440200\",\n        \"label\": \"韶关市\",\n        \"children\": [\n          {\n            \"value\": \"440203\",\n            \"label\": \"武江区\"\n          },\n          {\n            \"value\": \"440204\",\n            \"label\": \"浈江区\"\n          },\n          {\n            \"value\": \"440205\",\n            \"label\": \"曲江区\"\n          },\n          {\n            \"value\": \"440222\",\n            \"label\": \"始兴县\"\n          },\n          {\n            \"value\": \"440224\",\n            \"label\": \"仁化县\"\n          },\n          {\n            \"value\": \"440229\",\n            \"label\": \"翁源县\"\n          },\n          {\n            \"value\": \"440232\",\n            \"label\": \"乳源瑶族自治县\"\n          },\n          {\n            \"value\": \"440233\",\n            \"label\": \"新丰县\"\n          },\n          {\n            \"value\": \"440281\",\n            \"label\": \"乐昌市\"\n          },\n          {\n            \"value\": \"440282\",\n            \"label\": \"南雄市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"440300\",\n        \"label\": \"深圳市\",\n        \"children\": [\n          {\n            \"value\": \"440303\",\n            \"label\": \"罗湖区\"\n          },\n          {\n            \"value\": \"440304\",\n            \"label\": \"福田区\"\n          },\n          {\n            \"value\": \"440305\",\n            \"label\": \"南山区\"\n          },\n          {\n            \"value\": \"440306\",\n            \"label\": \"宝安区\"\n          },\n          {\n            \"value\": \"440307\",\n            \"label\": \"龙岗区\"\n          },\n          {\n            \"value\": \"440308\",\n            \"label\": \"盐田区\"\n          },\n          {\n            \"value\": \"440309\",\n            \"label\": \"龙华区\"\n          },\n          {\n            \"value\": \"440310\",\n            \"label\": \"坪山区\"\n          },\n          {\n            \"value\": \"440311\",\n            \"label\": \"光明区\"\n          }\n        ]\n      },\n      {\n        \"value\": \"440400\",\n        \"label\": \"珠海市\",\n        \"children\": [\n          {\n            \"value\": \"440402\",\n            \"label\": \"香洲区\"\n          },\n          {\n            \"value\": \"440403\",\n            \"label\": \"斗门区\"\n          },\n          {\n            \"value\": \"440404\",\n            \"label\": \"金湾区\"\n          }\n        ]\n      },\n      {\n        \"value\": \"440500\",\n        \"label\": \"汕头市\",\n        \"children\": [\n          {\n            \"value\": \"440507\",\n            \"label\": \"龙湖区\"\n          },\n          {\n            \"value\": \"440511\",\n            \"label\": \"金平区\"\n          },\n          {\n            \"value\": \"440512\",\n            \"label\": \"濠江区\"\n          },\n          {\n            \"value\": \"440513\",\n            \"label\": \"潮阳区\"\n          },\n          {\n            \"value\": \"440514\",\n            \"label\": \"潮南区\"\n          },\n          {\n            \"value\": \"440515\",\n            \"label\": \"澄海区\"\n          },\n          {\n            \"value\": \"440523\",\n            \"label\": \"南澳县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"440600\",\n        \"label\": \"佛山市\",\n        \"children\": [\n          {\n            \"value\": \"440604\",\n            \"label\": \"禅城区\"\n          },\n          {\n            \"value\": \"440605\",\n            \"label\": \"南海区\"\n          },\n          {\n            \"value\": \"440606\",\n            \"label\": \"顺德区\"\n          },\n          {\n            \"value\": \"440607\",\n            \"label\": \"三水区\"\n          },\n          {\n            \"value\": \"440608\",\n            \"label\": \"高明区\"\n          }\n        ]\n      },\n      {\n        \"value\": \"440700\",\n        \"label\": \"江门市\",\n        \"children\": [\n          {\n            \"value\": \"440703\",\n            \"label\": \"蓬江区\"\n          },\n          {\n            \"value\": \"440704\",\n            \"label\": \"江海区\"\n          },\n          {\n            \"value\": \"440705\",\n            \"label\": \"新会区\"\n          },\n          {\n            \"value\": \"440781\",\n            \"label\": \"台山市\"\n          },\n          {\n            \"value\": \"440783\",\n            \"label\": \"开平市\"\n          },\n          {\n            \"value\": \"440784\",\n            \"label\": \"鹤山市\"\n          },\n          {\n            \"value\": \"440785\",\n            \"label\": \"恩平市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"440800\",\n        \"label\": \"湛江市\",\n        \"children\": [\n          {\n            \"value\": \"440802\",\n            \"label\": \"赤坎区\"\n          },\n          {\n            \"value\": \"440803\",\n            \"label\": \"霞山区\"\n          },\n          {\n            \"value\": \"440804\",\n            \"label\": \"坡头区\"\n          },\n          {\n            \"value\": \"440811\",\n            \"label\": \"麻章区\"\n          },\n          {\n            \"value\": \"440823\",\n            \"label\": \"遂溪县\"\n          },\n          {\n            \"value\": \"440825\",\n            \"label\": \"徐闻县\"\n          },\n          {\n            \"value\": \"440881\",\n            \"label\": \"廉江市\"\n          },\n          {\n            \"value\": \"440882\",\n            \"label\": \"雷州市\"\n          },\n          {\n            \"value\": \"440883\",\n            \"label\": \"吴川市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"440900\",\n        \"label\": \"茂名市\",\n        \"children\": [\n          {\n            \"value\": \"440902\",\n            \"label\": \"茂南区\"\n          },\n          {\n            \"value\": \"440904\",\n            \"label\": \"电白区\"\n          },\n          {\n            \"value\": \"440981\",\n            \"label\": \"高州市\"\n          },\n          {\n            \"value\": \"440982\",\n            \"label\": \"化州市\"\n          },\n          {\n            \"value\": \"440983\",\n            \"label\": \"信宜市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"441200\",\n        \"label\": \"肇庆市\",\n        \"children\": [\n          {\n            \"value\": \"441202\",\n            \"label\": \"端州区\"\n          },\n          {\n            \"value\": \"441203\",\n            \"label\": \"鼎湖区\"\n          },\n          {\n            \"value\": \"441204\",\n            \"label\": \"高要区\"\n          },\n          {\n            \"value\": \"441223\",\n            \"label\": \"广宁县\"\n          },\n          {\n            \"value\": \"441224\",\n            \"label\": \"怀集县\"\n          },\n          {\n            \"value\": \"441225\",\n            \"label\": \"封开县\"\n          },\n          {\n            \"value\": \"441226\",\n            \"label\": \"德庆县\"\n          },\n          {\n            \"value\": \"441284\",\n            \"label\": \"四会市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"441300\",\n        \"label\": \"惠州市\",\n        \"children\": [\n          {\n            \"value\": \"441302\",\n            \"label\": \"惠城区\"\n          },\n          {\n            \"value\": \"441303\",\n            \"label\": \"惠阳区\"\n          },\n          {\n            \"value\": \"441322\",\n            \"label\": \"博罗县\"\n          },\n          {\n            \"value\": \"441323\",\n            \"label\": \"惠东县\"\n          },\n          {\n            \"value\": \"441324\",\n            \"label\": \"龙门县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"441400\",\n        \"label\": \"梅州市\",\n        \"children\": [\n          {\n            \"value\": \"441402\",\n            \"label\": \"梅江区\"\n          },\n          {\n            \"value\": \"441403\",\n            \"label\": \"梅县区\"\n          },\n          {\n            \"value\": \"441422\",\n            \"label\": \"大埔县\"\n          },\n          {\n            \"value\": \"441423\",\n            \"label\": \"丰顺县\"\n          },\n          {\n            \"value\": \"441424\",\n            \"label\": \"五华县\"\n          },\n          {\n            \"value\": \"441426\",\n            \"label\": \"平远县\"\n          },\n          {\n            \"value\": \"441427\",\n            \"label\": \"蕉岭县\"\n          },\n          {\n            \"value\": \"441481\",\n            \"label\": \"兴宁市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"441500\",\n        \"label\": \"汕尾市\",\n        \"children\": [\n          {\n            \"value\": \"441502\",\n            \"label\": \"城区\"\n          },\n          {\n            \"value\": \"441521\",\n            \"label\": \"海丰县\"\n          },\n          {\n            \"value\": \"441523\",\n            \"label\": \"陆河县\"\n          },\n          {\n            \"value\": \"441581\",\n            \"label\": \"陆丰市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"441600\",\n        \"label\": \"河源市\",\n        \"children\": [\n          {\n            \"value\": \"441602\",\n            \"label\": \"源城区\"\n          },\n          {\n            \"value\": \"441621\",\n            \"label\": \"紫金县\"\n          },\n          {\n            \"value\": \"441622\",\n            \"label\": \"龙川县\"\n          },\n          {\n            \"value\": \"441623\",\n            \"label\": \"连平县\"\n          },\n          {\n            \"value\": \"441624\",\n            \"label\": \"和平县\"\n          },\n          {\n            \"value\": \"441625\",\n            \"label\": \"东源县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"441700\",\n        \"label\": \"阳江市\",\n        \"children\": [\n          {\n            \"value\": \"441702\",\n            \"label\": \"江城区\"\n          },\n          {\n            \"value\": \"441704\",\n            \"label\": \"阳东区\"\n          },\n          {\n            \"value\": \"441721\",\n            \"label\": \"阳西县\"\n          },\n          {\n            \"value\": \"441781\",\n            \"label\": \"阳春市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"441800\",\n        \"label\": \"清远市\",\n        \"children\": [\n          {\n            \"value\": \"441802\",\n            \"label\": \"清城区\"\n          },\n          {\n            \"value\": \"441803\",\n            \"label\": \"清新区\"\n          },\n          {\n            \"value\": \"441821\",\n            \"label\": \"佛冈县\"\n          },\n          {\n            \"value\": \"441823\",\n            \"label\": \"阳山县\"\n          },\n          {\n            \"value\": \"441825\",\n            \"label\": \"连山壮族瑶族自治县\"\n          },\n          {\n            \"value\": \"441826\",\n            \"label\": \"连南瑶族自治县\"\n          },\n          {\n            \"value\": \"441881\",\n            \"label\": \"英德市\"\n          },\n          {\n            \"value\": \"441882\",\n            \"label\": \"连州市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"441900\",\n        \"label\": \"东莞市\",\n        \"children\": []\n      },\n      {\n        \"value\": \"442000\",\n        \"label\": \"中山市\",\n        \"children\": []\n      },\n      {\n        \"value\": \"445100\",\n        \"label\": \"潮州市\",\n        \"children\": [\n          {\n            \"value\": \"445102\",\n            \"label\": \"湘桥区\"\n          },\n          {\n            \"value\": \"445103\",\n            \"label\": \"潮安区\"\n          },\n          {\n            \"value\": \"445122\",\n            \"label\": \"饶平县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"445200\",\n        \"label\": \"揭阳市\",\n        \"children\": [\n          {\n            \"value\": \"445202\",\n            \"label\": \"榕城区\"\n          },\n          {\n            \"value\": \"445203\",\n            \"label\": \"揭东区\"\n          },\n          {\n            \"value\": \"445222\",\n            \"label\": \"揭西县\"\n          },\n          {\n            \"value\": \"445224\",\n            \"label\": \"惠来县\"\n          },\n          {\n            \"value\": \"445281\",\n            \"label\": \"普宁市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"445300\",\n        \"label\": \"云浮市\",\n        \"children\": [\n          {\n            \"value\": \"445302\",\n            \"label\": \"云城区\"\n          },\n          {\n            \"value\": \"445303\",\n            \"label\": \"云安区\"\n          },\n          {\n            \"value\": \"445321\",\n            \"label\": \"新兴县\"\n          },\n          {\n            \"value\": \"445322\",\n            \"label\": \"郁南县\"\n          },\n          {\n            \"value\": \"445381\",\n            \"label\": \"罗定市\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"450000\",\n    \"label\": \"广西壮族自治区\",\n    \"children\": [\n      {\n        \"value\": \"450100\",\n        \"label\": \"南宁市\",\n        \"children\": [\n          {\n            \"value\": \"450102\",\n            \"label\": \"兴宁区\"\n          },\n          {\n            \"value\": \"450103\",\n            \"label\": \"青秀区\"\n          },\n          {\n            \"value\": \"450105\",\n            \"label\": \"江南区\"\n          },\n          {\n            \"value\": \"450107\",\n            \"label\": \"西乡塘区\"\n          },\n          {\n            \"value\": \"450108\",\n            \"label\": \"良庆区\"\n          },\n          {\n            \"value\": \"450109\",\n            \"label\": \"邕宁区\"\n          },\n          {\n            \"value\": \"450110\",\n            \"label\": \"武鸣区\"\n          },\n          {\n            \"value\": \"450123\",\n            \"label\": \"隆安县\"\n          },\n          {\n            \"value\": \"450124\",\n            \"label\": \"马山县\"\n          },\n          {\n            \"value\": \"450125\",\n            \"label\": \"上林县\"\n          },\n          {\n            \"value\": \"450126\",\n            \"label\": \"宾阳县\"\n          },\n          {\n            \"value\": \"450127\",\n            \"label\": \"横县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"450200\",\n        \"label\": \"柳州市\",\n        \"children\": [\n          {\n            \"value\": \"450202\",\n            \"label\": \"城中区\"\n          },\n          {\n            \"value\": \"450203\",\n            \"label\": \"鱼峰区\"\n          },\n          {\n            \"value\": \"450204\",\n            \"label\": \"柳南区\"\n          },\n          {\n            \"value\": \"450205\",\n            \"label\": \"柳北区\"\n          },\n          {\n            \"value\": \"450206\",\n            \"label\": \"柳江区\"\n          },\n          {\n            \"value\": \"450222\",\n            \"label\": \"柳城县\"\n          },\n          {\n            \"value\": \"450223\",\n            \"label\": \"鹿寨县\"\n          },\n          {\n            \"value\": \"450224\",\n            \"label\": \"融安县\"\n          },\n          {\n            \"value\": \"450225\",\n            \"label\": \"融水苗族自治县\"\n          },\n          {\n            \"value\": \"450226\",\n            \"label\": \"三江侗族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"450300\",\n        \"label\": \"桂林市\",\n        \"children\": [\n          {\n            \"value\": \"450302\",\n            \"label\": \"秀峰区\"\n          },\n          {\n            \"value\": \"450303\",\n            \"label\": \"叠彩区\"\n          },\n          {\n            \"value\": \"450304\",\n            \"label\": \"象山区\"\n          },\n          {\n            \"value\": \"450305\",\n            \"label\": \"七星区\"\n          },\n          {\n            \"value\": \"450311\",\n            \"label\": \"雁山区\"\n          },\n          {\n            \"value\": \"450312\",\n            \"label\": \"临桂区\"\n          },\n          {\n            \"value\": \"450321\",\n            \"label\": \"阳朔县\"\n          },\n          {\n            \"value\": \"450323\",\n            \"label\": \"灵川县\"\n          },\n          {\n            \"value\": \"450324\",\n            \"label\": \"全州县\"\n          },\n          {\n            \"value\": \"450325\",\n            \"label\": \"兴安县\"\n          },\n          {\n            \"value\": \"450326\",\n            \"label\": \"永福县\"\n          },\n          {\n            \"value\": \"450327\",\n            \"label\": \"灌阳县\"\n          },\n          {\n            \"value\": \"450328\",\n            \"label\": \"龙胜各族自治县\"\n          },\n          {\n            \"value\": \"450329\",\n            \"label\": \"资源县\"\n          },\n          {\n            \"value\": \"450330\",\n            \"label\": \"平乐县\"\n          },\n          {\n            \"value\": \"450381\",\n            \"label\": \"荔浦市\"\n          },\n          {\n            \"value\": \"450332\",\n            \"label\": \"恭城瑶族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"450400\",\n        \"label\": \"梧州市\",\n        \"children\": [\n          {\n            \"value\": \"450403\",\n            \"label\": \"万秀区\"\n          },\n          {\n            \"value\": \"450405\",\n            \"label\": \"长洲区\"\n          },\n          {\n            \"value\": \"450406\",\n            \"label\": \"龙圩区\"\n          },\n          {\n            \"value\": \"450421\",\n            \"label\": \"苍梧县\"\n          },\n          {\n            \"value\": \"450422\",\n            \"label\": \"藤县\"\n          },\n          {\n            \"value\": \"450423\",\n            \"label\": \"蒙山县\"\n          },\n          {\n            \"value\": \"450481\",\n            \"label\": \"岑溪市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"450500\",\n        \"label\": \"北海市\",\n        \"children\": [\n          {\n            \"value\": \"450502\",\n            \"label\": \"海城区\"\n          },\n          {\n            \"value\": \"450503\",\n            \"label\": \"银海区\"\n          },\n          {\n            \"value\": \"450512\",\n            \"label\": \"铁山港区\"\n          },\n          {\n            \"value\": \"450521\",\n            \"label\": \"合浦县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"450600\",\n        \"label\": \"防城港市\",\n        \"children\": [\n          {\n            \"value\": \"450602\",\n            \"label\": \"港口区\"\n          },\n          {\n            \"value\": \"450603\",\n            \"label\": \"防城区\"\n          },\n          {\n            \"value\": \"450621\",\n            \"label\": \"上思县\"\n          },\n          {\n            \"value\": \"450681\",\n            \"label\": \"东兴市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"450700\",\n        \"label\": \"钦州市\",\n        \"children\": [\n          {\n            \"value\": \"450702\",\n            \"label\": \"钦南区\"\n          },\n          {\n            \"value\": \"450703\",\n            \"label\": \"钦北区\"\n          },\n          {\n            \"value\": \"450721\",\n            \"label\": \"灵山县\"\n          },\n          {\n            \"value\": \"450722\",\n            \"label\": \"浦北县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"450800\",\n        \"label\": \"贵港市\",\n        \"children\": [\n          {\n            \"value\": \"450802\",\n            \"label\": \"港北区\"\n          },\n          {\n            \"value\": \"450803\",\n            \"label\": \"港南区\"\n          },\n          {\n            \"value\": \"450804\",\n            \"label\": \"覃塘区\"\n          },\n          {\n            \"value\": \"450821\",\n            \"label\": \"平南县\"\n          },\n          {\n            \"value\": \"450881\",\n            \"label\": \"桂平市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"450900\",\n        \"label\": \"玉林市\",\n        \"children\": [\n          {\n            \"value\": \"450902\",\n            \"label\": \"玉州区\"\n          },\n          {\n            \"value\": \"450903\",\n            \"label\": \"福绵区\"\n          },\n          {\n            \"value\": \"450921\",\n            \"label\": \"容县\"\n          },\n          {\n            \"value\": \"450922\",\n            \"label\": \"陆川县\"\n          },\n          {\n            \"value\": \"450923\",\n            \"label\": \"博白县\"\n          },\n          {\n            \"value\": \"450924\",\n            \"label\": \"兴业县\"\n          },\n          {\n            \"value\": \"450981\",\n            \"label\": \"北流市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"451000\",\n        \"label\": \"百色市\",\n        \"children\": [\n          {\n            \"value\": \"451002\",\n            \"label\": \"右江区\"\n          },\n          {\n            \"value\": \"451021\",\n            \"label\": \"田阳县\"\n          },\n          {\n            \"value\": \"451022\",\n            \"label\": \"田东县\"\n          },\n          {\n            \"value\": \"451023\",\n            \"label\": \"平果县\"\n          },\n          {\n            \"value\": \"451024\",\n            \"label\": \"德保县\"\n          },\n          {\n            \"value\": \"451026\",\n            \"label\": \"那坡县\"\n          },\n          {\n            \"value\": \"451027\",\n            \"label\": \"凌云县\"\n          },\n          {\n            \"value\": \"451028\",\n            \"label\": \"乐业县\"\n          },\n          {\n            \"value\": \"451029\",\n            \"label\": \"田林县\"\n          },\n          {\n            \"value\": \"451030\",\n            \"label\": \"西林县\"\n          },\n          {\n            \"value\": \"451031\",\n            \"label\": \"隆林各族自治县\"\n          },\n          {\n            \"value\": \"451081\",\n            \"label\": \"靖西市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"451100\",\n        \"label\": \"贺州市\",\n        \"children\": [\n          {\n            \"value\": \"451102\",\n            \"label\": \"八步区\"\n          },\n          {\n            \"value\": \"451103\",\n            \"label\": \"平桂区\"\n          },\n          {\n            \"value\": \"451121\",\n            \"label\": \"昭平县\"\n          },\n          {\n            \"value\": \"451122\",\n            \"label\": \"钟山县\"\n          },\n          {\n            \"value\": \"451123\",\n            \"label\": \"富川瑶族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"451200\",\n        \"label\": \"河池市\",\n        \"children\": [\n          {\n            \"value\": \"451202\",\n            \"label\": \"金城江区\"\n          },\n          {\n            \"value\": \"451203\",\n            \"label\": \"宜州区\"\n          },\n          {\n            \"value\": \"451221\",\n            \"label\": \"南丹县\"\n          },\n          {\n            \"value\": \"451222\",\n            \"label\": \"天峨县\"\n          },\n          {\n            \"value\": \"451223\",\n            \"label\": \"凤山县\"\n          },\n          {\n            \"value\": \"451224\",\n            \"label\": \"东兰县\"\n          },\n          {\n            \"value\": \"451225\",\n            \"label\": \"罗城仫佬族自治县\"\n          },\n          {\n            \"value\": \"451226\",\n            \"label\": \"环江毛南族自治县\"\n          },\n          {\n            \"value\": \"451227\",\n            \"label\": \"巴马瑶族自治县\"\n          },\n          {\n            \"value\": \"451228\",\n            \"label\": \"都安瑶族自治县\"\n          },\n          {\n            \"value\": \"451229\",\n            \"label\": \"大化瑶族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"451300\",\n        \"label\": \"来宾市\",\n        \"children\": [\n          {\n            \"value\": \"451302\",\n            \"label\": \"兴宾区\"\n          },\n          {\n            \"value\": \"451321\",\n            \"label\": \"忻城县\"\n          },\n          {\n            \"value\": \"451322\",\n            \"label\": \"象州县\"\n          },\n          {\n            \"value\": \"451323\",\n            \"label\": \"武宣县\"\n          },\n          {\n            \"value\": \"451324\",\n            \"label\": \"金秀瑶族自治县\"\n          },\n          {\n            \"value\": \"451381\",\n            \"label\": \"合山市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"451400\",\n        \"label\": \"崇左市\",\n        \"children\": [\n          {\n            \"value\": \"451402\",\n            \"label\": \"江州区\"\n          },\n          {\n            \"value\": \"451421\",\n            \"label\": \"扶绥县\"\n          },\n          {\n            \"value\": \"451422\",\n            \"label\": \"宁明县\"\n          },\n          {\n            \"value\": \"451423\",\n            \"label\": \"龙州县\"\n          },\n          {\n            \"value\": \"451424\",\n            \"label\": \"大新县\"\n          },\n          {\n            \"value\": \"451425\",\n            \"label\": \"天等县\"\n          },\n          {\n            \"value\": \"451481\",\n            \"label\": \"凭祥市\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"460000\",\n    \"label\": \"海南省\",\n    \"children\": [\n      {\n        \"value\": \"460100\",\n        \"label\": \"海口市\",\n        \"children\": [\n          {\n            \"value\": \"460105\",\n            \"label\": \"秀英区\"\n          },\n          {\n            \"value\": \"460106\",\n            \"label\": \"龙华区\"\n          },\n          {\n            \"value\": \"460107\",\n            \"label\": \"琼山区\"\n          },\n          {\n            \"value\": \"460108\",\n            \"label\": \"美兰区\"\n          }\n        ]\n      },\n      {\n        \"value\": \"460200\",\n        \"label\": \"三亚市\",\n        \"children\": [\n          {\n            \"value\": \"460202\",\n            \"label\": \"海棠区\"\n          },\n          {\n            \"value\": \"460203\",\n            \"label\": \"吉阳区\"\n          },\n          {\n            \"value\": \"460204\",\n            \"label\": \"天涯区\"\n          },\n          {\n            \"value\": \"460205\",\n            \"label\": \"崖州区\"\n          }\n        ]\n      },\n      {\n        \"value\": \"460300\",\n        \"label\": \"三沙市\",\n        \"children\": []\n      },\n      {\n        \"value\": \"460400\",\n        \"label\": \"儋州市\",\n        \"children\": []\n      }\n    ]\n  },\n  {\n    \"value\": \"500000\",\n    \"label\": \"重庆市\",\n    \"children\": [\n      {\n        \"value\": \"500000\",\n        \"label\": \"重庆市\",\n        \"children\": [\n          {\n            \"value\": \"500101\",\n            \"label\": \"万州区\"\n          },\n          {\n            \"value\": \"500102\",\n            \"label\": \"涪陵区\"\n          },\n          {\n            \"value\": \"500103\",\n            \"label\": \"渝中区\"\n          },\n          {\n            \"value\": \"500104\",\n            \"label\": \"大渡口区\"\n          },\n          {\n            \"value\": \"500105\",\n            \"label\": \"江北区\"\n          },\n          {\n            \"value\": \"500106\",\n            \"label\": \"沙坪坝区\"\n          },\n          {\n            \"value\": \"500107\",\n            \"label\": \"九龙坡区\"\n          },\n          {\n            \"value\": \"500108\",\n            \"label\": \"南岸区\"\n          },\n          {\n            \"value\": \"500109\",\n            \"label\": \"北碚区\"\n          },\n          {\n            \"value\": \"500110\",\n            \"label\": \"綦江区\"\n          },\n          {\n            \"value\": \"500111\",\n            \"label\": \"大足区\"\n          },\n          {\n            \"value\": \"500112\",\n            \"label\": \"渝北区\"\n          },\n          {\n            \"value\": \"500113\",\n            \"label\": \"巴南区\"\n          },\n          {\n            \"value\": \"500114\",\n            \"label\": \"黔江区\"\n          },\n          {\n            \"value\": \"500115\",\n            \"label\": \"长寿区\"\n          },\n          {\n            \"value\": \"500116\",\n            \"label\": \"江津区\"\n          },\n          {\n            \"value\": \"500117\",\n            \"label\": \"合川区\"\n          },\n          {\n            \"value\": \"500118\",\n            \"label\": \"永川区\"\n          },\n          {\n            \"value\": \"500119\",\n            \"label\": \"南川区\"\n          },\n          {\n            \"value\": \"500120\",\n            \"label\": \"璧山区\"\n          },\n          {\n            \"value\": \"500151\",\n            \"label\": \"铜梁区\"\n          },\n          {\n            \"value\": \"500152\",\n            \"label\": \"潼南区\"\n          },\n          {\n            \"value\": \"500153\",\n            \"label\": \"荣昌区\"\n          },\n          {\n            \"value\": \"500154\",\n            \"label\": \"开州区\"\n          },\n          {\n            \"value\": \"500155\",\n            \"label\": \"梁平区\"\n          },\n          {\n            \"value\": \"500156\",\n            \"label\": \"武隆区\"\n          },\n          {\n            \"value\": \"500229\",\n            \"label\": \"城口县\"\n          },\n          {\n            \"value\": \"500230\",\n            \"label\": \"丰都县\"\n          },\n          {\n            \"value\": \"500231\",\n            \"label\": \"垫江县\"\n          },\n          {\n            \"value\": \"500233\",\n            \"label\": \"忠县\"\n          },\n          {\n            \"value\": \"500235\",\n            \"label\": \"云阳县\"\n          },\n          {\n            \"value\": \"500236\",\n            \"label\": \"奉节县\"\n          },\n          {\n            \"value\": \"500237\",\n            \"label\": \"巫山县\"\n          },\n          {\n            \"value\": \"500238\",\n            \"label\": \"巫溪县\"\n          },\n          {\n            \"value\": \"500240\",\n            \"label\": \"石柱土家族自治县\"\n          },\n          {\n            \"value\": \"500241\",\n            \"label\": \"秀山土家族苗族自治县\"\n          },\n          {\n            \"value\": \"500242\",\n            \"label\": \"酉阳土家族苗族自治县\"\n          },\n          {\n            \"value\": \"500243\",\n            \"label\": \"彭水苗族土家族自治县\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"510000\",\n    \"label\": \"四川省\",\n    \"children\": [\n      {\n        \"value\": \"510100\",\n        \"label\": \"成都市\",\n        \"children\": [\n          {\n            \"value\": \"510104\",\n            \"label\": \"锦江区\"\n          },\n          {\n            \"value\": \"510105\",\n            \"label\": \"青羊区\"\n          },\n          {\n            \"value\": \"510106\",\n            \"label\": \"金牛区\"\n          },\n          {\n            \"value\": \"510107\",\n            \"label\": \"武侯区\"\n          },\n          {\n            \"value\": \"510108\",\n            \"label\": \"成华区\"\n          },\n          {\n            \"value\": \"510112\",\n            \"label\": \"龙泉驿区\"\n          },\n          {\n            \"value\": \"510113\",\n            \"label\": \"青白江区\"\n          },\n          {\n            \"value\": \"510114\",\n            \"label\": \"新都区\"\n          },\n          {\n            \"value\": \"510115\",\n            \"label\": \"温江区\"\n          },\n          {\n            \"value\": \"510116\",\n            \"label\": \"双流区\"\n          },\n          {\n            \"value\": \"510117\",\n            \"label\": \"郫都区\"\n          },\n          {\n            \"value\": \"510121\",\n            \"label\": \"金堂县\"\n          },\n          {\n            \"value\": \"510129\",\n            \"label\": \"大邑县\"\n          },\n          {\n            \"value\": \"510131\",\n            \"label\": \"蒲江县\"\n          },\n          {\n            \"value\": \"510132\",\n            \"label\": \"新津县\"\n          },\n          {\n            \"value\": \"510181\",\n            \"label\": \"都江堰市\"\n          },\n          {\n            \"value\": \"510182\",\n            \"label\": \"彭州市\"\n          },\n          {\n            \"value\": \"510183\",\n            \"label\": \"邛崃市\"\n          },\n          {\n            \"value\": \"510184\",\n            \"label\": \"崇州市\"\n          },\n          {\n            \"value\": \"510185\",\n            \"label\": \"简阳市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"510300\",\n        \"label\": \"自贡市\",\n        \"children\": [\n          {\n            \"value\": \"510302\",\n            \"label\": \"自流井区\"\n          },\n          {\n            \"value\": \"510303\",\n            \"label\": \"贡井区\"\n          },\n          {\n            \"value\": \"510304\",\n            \"label\": \"大安区\"\n          },\n          {\n            \"value\": \"510311\",\n            \"label\": \"沿滩区\"\n          },\n          {\n            \"value\": \"510321\",\n            \"label\": \"荣县\"\n          },\n          {\n            \"value\": \"510322\",\n            \"label\": \"富顺县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"510400\",\n        \"label\": \"攀枝花市\",\n        \"children\": [\n          {\n            \"value\": \"510402\",\n            \"label\": \"东区\"\n          },\n          {\n            \"value\": \"510403\",\n            \"label\": \"西区\"\n          },\n          {\n            \"value\": \"510411\",\n            \"label\": \"仁和区\"\n          },\n          {\n            \"value\": \"510421\",\n            \"label\": \"米易县\"\n          },\n          {\n            \"value\": \"510422\",\n            \"label\": \"盐边县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"510500\",\n        \"label\": \"泸州市\",\n        \"children\": [\n          {\n            \"value\": \"510502\",\n            \"label\": \"江阳区\"\n          },\n          {\n            \"value\": \"510503\",\n            \"label\": \"纳溪区\"\n          },\n          {\n            \"value\": \"510504\",\n            \"label\": \"龙马潭区\"\n          },\n          {\n            \"value\": \"510521\",\n            \"label\": \"泸县\"\n          },\n          {\n            \"value\": \"510522\",\n            \"label\": \"合江县\"\n          },\n          {\n            \"value\": \"510524\",\n            \"label\": \"叙永县\"\n          },\n          {\n            \"value\": \"510525\",\n            \"label\": \"古蔺县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"510600\",\n        \"label\": \"德阳市\",\n        \"children\": [\n          {\n            \"value\": \"510603\",\n            \"label\": \"旌阳区\"\n          },\n          {\n            \"value\": \"510604\",\n            \"label\": \"罗江区\"\n          },\n          {\n            \"value\": \"510623\",\n            \"label\": \"中江县\"\n          },\n          {\n            \"value\": \"510681\",\n            \"label\": \"广汉市\"\n          },\n          {\n            \"value\": \"510682\",\n            \"label\": \"什邡市\"\n          },\n          {\n            \"value\": \"510683\",\n            \"label\": \"绵竹市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"510700\",\n        \"label\": \"绵阳市\",\n        \"children\": [\n          {\n            \"value\": \"510703\",\n            \"label\": \"涪城区\"\n          },\n          {\n            \"value\": \"510704\",\n            \"label\": \"游仙区\"\n          },\n          {\n            \"value\": \"510705\",\n            \"label\": \"安州区\"\n          },\n          {\n            \"value\": \"510722\",\n            \"label\": \"三台县\"\n          },\n          {\n            \"value\": \"510723\",\n            \"label\": \"盐亭县\"\n          },\n          {\n            \"value\": \"510725\",\n            \"label\": \"梓潼县\"\n          },\n          {\n            \"value\": \"510726\",\n            \"label\": \"北川羌族自治县\"\n          },\n          {\n            \"value\": \"510727\",\n            \"label\": \"平武县\"\n          },\n          {\n            \"value\": \"510781\",\n            \"label\": \"江油市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"510800\",\n        \"label\": \"广元市\",\n        \"children\": [\n          {\n            \"value\": \"510802\",\n            \"label\": \"利州区\"\n          },\n          {\n            \"value\": \"510811\",\n            \"label\": \"昭化区\"\n          },\n          {\n            \"value\": \"510812\",\n            \"label\": \"朝天区\"\n          },\n          {\n            \"value\": \"510821\",\n            \"label\": \"旺苍县\"\n          },\n          {\n            \"value\": \"510822\",\n            \"label\": \"青川县\"\n          },\n          {\n            \"value\": \"510823\",\n            \"label\": \"剑阁县\"\n          },\n          {\n            \"value\": \"510824\",\n            \"label\": \"苍溪县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"510900\",\n        \"label\": \"遂宁市\",\n        \"children\": [\n          {\n            \"value\": \"510903\",\n            \"label\": \"船山区\"\n          },\n          {\n            \"value\": \"510904\",\n            \"label\": \"安居区\"\n          },\n          {\n            \"value\": \"510921\",\n            \"label\": \"蓬溪县\"\n          },\n          {\n            \"value\": \"510922\",\n            \"label\": \"射洪县\"\n          },\n          {\n            \"value\": \"510923\",\n            \"label\": \"大英县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"511000\",\n        \"label\": \"内江市\",\n        \"children\": [\n          {\n            \"value\": \"511002\",\n            \"label\": \"市中区\"\n          },\n          {\n            \"value\": \"511011\",\n            \"label\": \"东兴区\"\n          },\n          {\n            \"value\": \"511024\",\n            \"label\": \"威远县\"\n          },\n          {\n            \"value\": \"511025\",\n            \"label\": \"资中县\"\n          },\n          {\n            \"value\": \"511083\",\n            \"label\": \"隆昌市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"511100\",\n        \"label\": \"乐山市\",\n        \"children\": [\n          {\n            \"value\": \"511102\",\n            \"label\": \"市中区\"\n          },\n          {\n            \"value\": \"511111\",\n            \"label\": \"沙湾区\"\n          },\n          {\n            \"value\": \"511112\",\n            \"label\": \"五通桥区\"\n          },\n          {\n            \"value\": \"511113\",\n            \"label\": \"金口河区\"\n          },\n          {\n            \"value\": \"511123\",\n            \"label\": \"犍为县\"\n          },\n          {\n            \"value\": \"511124\",\n            \"label\": \"井研县\"\n          },\n          {\n            \"value\": \"511126\",\n            \"label\": \"夹江县\"\n          },\n          {\n            \"value\": \"511129\",\n            \"label\": \"沐川县\"\n          },\n          {\n            \"value\": \"511132\",\n            \"label\": \"峨边彝族自治县\"\n          },\n          {\n            \"value\": \"511133\",\n            \"label\": \"马边彝族自治县\"\n          },\n          {\n            \"value\": \"511181\",\n            \"label\": \"峨眉山市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"511300\",\n        \"label\": \"南充市\",\n        \"children\": [\n          {\n            \"value\": \"511302\",\n            \"label\": \"顺庆区\"\n          },\n          {\n            \"value\": \"511303\",\n            \"label\": \"高坪区\"\n          },\n          {\n            \"value\": \"511304\",\n            \"label\": \"嘉陵区\"\n          },\n          {\n            \"value\": \"511321\",\n            \"label\": \"南部县\"\n          },\n          {\n            \"value\": \"511322\",\n            \"label\": \"营山县\"\n          },\n          {\n            \"value\": \"511323\",\n            \"label\": \"蓬安县\"\n          },\n          {\n            \"value\": \"511324\",\n            \"label\": \"仪陇县\"\n          },\n          {\n            \"value\": \"511325\",\n            \"label\": \"西充县\"\n          },\n          {\n            \"value\": \"511381\",\n            \"label\": \"阆中市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"511400\",\n        \"label\": \"眉山市\",\n        \"children\": [\n          {\n            \"value\": \"511402\",\n            \"label\": \"东坡区\"\n          },\n          {\n            \"value\": \"511403\",\n            \"label\": \"彭山区\"\n          },\n          {\n            \"value\": \"511421\",\n            \"label\": \"仁寿县\"\n          },\n          {\n            \"value\": \"511423\",\n            \"label\": \"洪雅县\"\n          },\n          {\n            \"value\": \"511424\",\n            \"label\": \"丹棱县\"\n          },\n          {\n            \"value\": \"511425\",\n            \"label\": \"青神县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"511500\",\n        \"label\": \"宜宾市\",\n        \"children\": [\n          {\n            \"value\": \"511502\",\n            \"label\": \"翠屏区\"\n          },\n          {\n            \"value\": \"511503\",\n            \"label\": \"南溪区\"\n          },\n          {\n            \"value\": \"511521\",\n            \"label\": \"宜宾县\"\n          },\n          {\n            \"value\": \"511523\",\n            \"label\": \"江安县\"\n          },\n          {\n            \"value\": \"511524\",\n            \"label\": \"长宁县\"\n          },\n          {\n            \"value\": \"511525\",\n            \"label\": \"高县\"\n          },\n          {\n            \"value\": \"511526\",\n            \"label\": \"珙县\"\n          },\n          {\n            \"value\": \"511527\",\n            \"label\": \"筠连县\"\n          },\n          {\n            \"value\": \"511528\",\n            \"label\": \"兴文县\"\n          },\n          {\n            \"value\": \"511529\",\n            \"label\": \"屏山县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"511600\",\n        \"label\": \"广安市\",\n        \"children\": [\n          {\n            \"value\": \"511602\",\n            \"label\": \"广安区\"\n          },\n          {\n            \"value\": \"511603\",\n            \"label\": \"前锋区\"\n          },\n          {\n            \"value\": \"511621\",\n            \"label\": \"岳池县\"\n          },\n          {\n            \"value\": \"511622\",\n            \"label\": \"武胜县\"\n          },\n          {\n            \"value\": \"511623\",\n            \"label\": \"邻水县\"\n          },\n          {\n            \"value\": \"511681\",\n            \"label\": \"华蓥市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"511700\",\n        \"label\": \"达州市\",\n        \"children\": [\n          {\n            \"value\": \"511702\",\n            \"label\": \"通川区\"\n          },\n          {\n            \"value\": \"511703\",\n            \"label\": \"达川区\"\n          },\n          {\n            \"value\": \"511722\",\n            \"label\": \"宣汉县\"\n          },\n          {\n            \"value\": \"511723\",\n            \"label\": \"开江县\"\n          },\n          {\n            \"value\": \"511724\",\n            \"label\": \"大竹县\"\n          },\n          {\n            \"value\": \"511725\",\n            \"label\": \"渠县\"\n          },\n          {\n            \"value\": \"511781\",\n            \"label\": \"万源市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"511800\",\n        \"label\": \"雅安市\",\n        \"children\": [\n          {\n            \"value\": \"511802\",\n            \"label\": \"雨城区\"\n          },\n          {\n            \"value\": \"511803\",\n            \"label\": \"名山区\"\n          },\n          {\n            \"value\": \"511822\",\n            \"label\": \"荥经县\"\n          },\n          {\n            \"value\": \"511823\",\n            \"label\": \"汉源县\"\n          },\n          {\n            \"value\": \"511824\",\n            \"label\": \"石棉县\"\n          },\n          {\n            \"value\": \"511825\",\n            \"label\": \"天全县\"\n          },\n          {\n            \"value\": \"511826\",\n            \"label\": \"芦山县\"\n          },\n          {\n            \"value\": \"511827\",\n            \"label\": \"宝兴县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"511900\",\n        \"label\": \"巴中市\",\n        \"children\": [\n          {\n            \"value\": \"511902\",\n            \"label\": \"巴州区\"\n          },\n          {\n            \"value\": \"511903\",\n            \"label\": \"恩阳区\"\n          },\n          {\n            \"value\": \"511921\",\n            \"label\": \"通江县\"\n          },\n          {\n            \"value\": \"511922\",\n            \"label\": \"南江县\"\n          },\n          {\n            \"value\": \"511923\",\n            \"label\": \"平昌县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"512000\",\n        \"label\": \"资阳市\",\n        \"children\": [\n          {\n            \"value\": \"512002\",\n            \"label\": \"雁江区\"\n          },\n          {\n            \"value\": \"512021\",\n            \"label\": \"安岳县\"\n          },\n          {\n            \"value\": \"512022\",\n            \"label\": \"乐至县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"513200\",\n        \"label\": \"阿坝藏族羌族自治州\",\n        \"children\": [\n          {\n            \"value\": \"513201\",\n            \"label\": \"马尔康市\"\n          },\n          {\n            \"value\": \"513221\",\n            \"label\": \"汶川县\"\n          },\n          {\n            \"value\": \"513222\",\n            \"label\": \"理县\"\n          },\n          {\n            \"value\": \"513223\",\n            \"label\": \"茂县\"\n          },\n          {\n            \"value\": \"513224\",\n            \"label\": \"松潘县\"\n          },\n          {\n            \"value\": \"513225\",\n            \"label\": \"九寨沟县\"\n          },\n          {\n            \"value\": \"513226\",\n            \"label\": \"金川县\"\n          },\n          {\n            \"value\": \"513227\",\n            \"label\": \"小金县\"\n          },\n          {\n            \"value\": \"513228\",\n            \"label\": \"黑水县\"\n          },\n          {\n            \"value\": \"513230\",\n            \"label\": \"壤塘县\"\n          },\n          {\n            \"value\": \"513231\",\n            \"label\": \"阿坝县\"\n          },\n          {\n            \"value\": \"513232\",\n            \"label\": \"若尔盖县\"\n          },\n          {\n            \"value\": \"513233\",\n            \"label\": \"红原县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"513300\",\n        \"label\": \"甘孜藏族自治州\",\n        \"children\": [\n          {\n            \"value\": \"513301\",\n            \"label\": \"康定市\"\n          },\n          {\n            \"value\": \"513322\",\n            \"label\": \"泸定县\"\n          },\n          {\n            \"value\": \"513323\",\n            \"label\": \"丹巴县\"\n          },\n          {\n            \"value\": \"513324\",\n            \"label\": \"九龙县\"\n          },\n          {\n            \"value\": \"513325\",\n            \"label\": \"雅江县\"\n          },\n          {\n            \"value\": \"513326\",\n            \"label\": \"道孚县\"\n          },\n          {\n            \"value\": \"513327\",\n            \"label\": \"炉霍县\"\n          },\n          {\n            \"value\": \"513328\",\n            \"label\": \"甘孜县\"\n          },\n          {\n            \"value\": \"513329\",\n            \"label\": \"新龙县\"\n          },\n          {\n            \"value\": \"513330\",\n            \"label\": \"德格县\"\n          },\n          {\n            \"value\": \"513331\",\n            \"label\": \"白玉县\"\n          },\n          {\n            \"value\": \"513332\",\n            \"label\": \"石渠县\"\n          },\n          {\n            \"value\": \"513333\",\n            \"label\": \"色达县\"\n          },\n          {\n            \"value\": \"513334\",\n            \"label\": \"理塘县\"\n          },\n          {\n            \"value\": \"513335\",\n            \"label\": \"巴塘县\"\n          },\n          {\n            \"value\": \"513336\",\n            \"label\": \"乡城县\"\n          },\n          {\n            \"value\": \"513337\",\n            \"label\": \"稻城县\"\n          },\n          {\n            \"value\": \"513338\",\n            \"label\": \"得荣县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"513400\",\n        \"label\": \"凉山彝族自治州\",\n        \"children\": [\n          {\n            \"value\": \"513401\",\n            \"label\": \"西昌市\"\n          },\n          {\n            \"value\": \"513422\",\n            \"label\": \"木里藏族自治县\"\n          },\n          {\n            \"value\": \"513423\",\n            \"label\": \"盐源县\"\n          },\n          {\n            \"value\": \"513424\",\n            \"label\": \"德昌县\"\n          },\n          {\n            \"value\": \"513425\",\n            \"label\": \"会理县\"\n          },\n          {\n            \"value\": \"513426\",\n            \"label\": \"会东县\"\n          },\n          {\n            \"value\": \"513427\",\n            \"label\": \"宁南县\"\n          },\n          {\n            \"value\": \"513428\",\n            \"label\": \"普格县\"\n          },\n          {\n            \"value\": \"513429\",\n            \"label\": \"布拖县\"\n          },\n          {\n            \"value\": \"513430\",\n            \"label\": \"金阳县\"\n          },\n          {\n            \"value\": \"513431\",\n            \"label\": \"昭觉县\"\n          },\n          {\n            \"value\": \"513432\",\n            \"label\": \"喜德县\"\n          },\n          {\n            \"value\": \"513433\",\n            \"label\": \"冕宁县\"\n          },\n          {\n            \"value\": \"513434\",\n            \"label\": \"越西县\"\n          },\n          {\n            \"value\": \"513435\",\n            \"label\": \"甘洛县\"\n          },\n          {\n            \"value\": \"513436\",\n            \"label\": \"美姑县\"\n          },\n          {\n            \"value\": \"513437\",\n            \"label\": \"雷波县\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"520000\",\n    \"label\": \"贵州省\",\n    \"children\": [\n      {\n        \"value\": \"520100\",\n        \"label\": \"贵阳市\",\n        \"children\": [\n          {\n            \"value\": \"520102\",\n            \"label\": \"南明区\"\n          },\n          {\n            \"value\": \"520103\",\n            \"label\": \"云岩区\"\n          },\n          {\n            \"value\": \"520111\",\n            \"label\": \"花溪区\"\n          },\n          {\n            \"value\": \"520112\",\n            \"label\": \"乌当区\"\n          },\n          {\n            \"value\": \"520113\",\n            \"label\": \"白云区\"\n          },\n          {\n            \"value\": \"520115\",\n            \"label\": \"观山湖区\"\n          },\n          {\n            \"value\": \"520121\",\n            \"label\": \"开阳县\"\n          },\n          {\n            \"value\": \"520122\",\n            \"label\": \"息烽县\"\n          },\n          {\n            \"value\": \"520123\",\n            \"label\": \"修文县\"\n          },\n          {\n            \"value\": \"520181\",\n            \"label\": \"清镇市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"520200\",\n        \"label\": \"六盘水市\",\n        \"children\": [\n          {\n            \"value\": \"520201\",\n            \"label\": \"钟山区\"\n          },\n          {\n            \"value\": \"520203\",\n            \"label\": \"六枝特区\"\n          },\n          {\n            \"value\": \"520221\",\n            \"label\": \"水城县\"\n          },\n          {\n            \"value\": \"520281\",\n            \"label\": \"盘州市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"520300\",\n        \"label\": \"遵义市\",\n        \"children\": [\n          {\n            \"value\": \"520302\",\n            \"label\": \"红花岗区\"\n          },\n          {\n            \"value\": \"520303\",\n            \"label\": \"汇川区\"\n          },\n          {\n            \"value\": \"520304\",\n            \"label\": \"播州区\"\n          },\n          {\n            \"value\": \"520322\",\n            \"label\": \"桐梓县\"\n          },\n          {\n            \"value\": \"520323\",\n            \"label\": \"绥阳县\"\n          },\n          {\n            \"value\": \"520324\",\n            \"label\": \"正安县\"\n          },\n          {\n            \"value\": \"520325\",\n            \"label\": \"道真仡佬族苗族自治县\"\n          },\n          {\n            \"value\": \"520326\",\n            \"label\": \"务川仡佬族苗族自治县\"\n          },\n          {\n            \"value\": \"520327\",\n            \"label\": \"凤冈县\"\n          },\n          {\n            \"value\": \"520328\",\n            \"label\": \"湄潭县\"\n          },\n          {\n            \"value\": \"520329\",\n            \"label\": \"余庆县\"\n          },\n          {\n            \"value\": \"520330\",\n            \"label\": \"习水县\"\n          },\n          {\n            \"value\": \"520381\",\n            \"label\": \"赤水市\"\n          },\n          {\n            \"value\": \"520382\",\n            \"label\": \"仁怀市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"520400\",\n        \"label\": \"安顺市\",\n        \"children\": [\n          {\n            \"value\": \"520402\",\n            \"label\": \"西秀区\"\n          },\n          {\n            \"value\": \"520403\",\n            \"label\": \"平坝区\"\n          },\n          {\n            \"value\": \"520422\",\n            \"label\": \"普定县\"\n          },\n          {\n            \"value\": \"520423\",\n            \"label\": \"镇宁布依族苗族自治县\"\n          },\n          {\n            \"value\": \"520424\",\n            \"label\": \"关岭布依族苗族自治县\"\n          },\n          {\n            \"value\": \"520425\",\n            \"label\": \"紫云苗族布依族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"520500\",\n        \"label\": \"毕节市\",\n        \"children\": [\n          {\n            \"value\": \"520502\",\n            \"label\": \"七星关区\"\n          },\n          {\n            \"value\": \"520521\",\n            \"label\": \"大方县\"\n          },\n          {\n            \"value\": \"520522\",\n            \"label\": \"黔西县\"\n          },\n          {\n            \"value\": \"520523\",\n            \"label\": \"金沙县\"\n          },\n          {\n            \"value\": \"520524\",\n            \"label\": \"织金县\"\n          },\n          {\n            \"value\": \"520525\",\n            \"label\": \"纳雍县\"\n          },\n          {\n            \"value\": \"520526\",\n            \"label\": \"威宁彝族回族苗族自治县\"\n          },\n          {\n            \"value\": \"520527\",\n            \"label\": \"赫章县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"520600\",\n        \"label\": \"铜仁市\",\n        \"children\": [\n          {\n            \"value\": \"520602\",\n            \"label\": \"碧江区\"\n          },\n          {\n            \"value\": \"520603\",\n            \"label\": \"万山区\"\n          },\n          {\n            \"value\": \"520621\",\n            \"label\": \"江口县\"\n          },\n          {\n            \"value\": \"520622\",\n            \"label\": \"玉屏侗族自治县\"\n          },\n          {\n            \"value\": \"520623\",\n            \"label\": \"石阡县\"\n          },\n          {\n            \"value\": \"520624\",\n            \"label\": \"思南县\"\n          },\n          {\n            \"value\": \"520625\",\n            \"label\": \"印江土家族苗族自治县\"\n          },\n          {\n            \"value\": \"520626\",\n            \"label\": \"德江县\"\n          },\n          {\n            \"value\": \"520627\",\n            \"label\": \"沿河土家族自治县\"\n          },\n          {\n            \"value\": \"520628\",\n            \"label\": \"松桃苗族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"522300\",\n        \"label\": \"黔西南布依族苗族自治州\",\n        \"children\": [\n          {\n            \"value\": \"522301\",\n            \"label\": \"兴义市\"\n          },\n          {\n            \"value\": \"522322\",\n            \"label\": \"兴仁县\"\n          },\n          {\n            \"value\": \"522323\",\n            \"label\": \"普安县\"\n          },\n          {\n            \"value\": \"522324\",\n            \"label\": \"晴隆县\"\n          },\n          {\n            \"value\": \"522325\",\n            \"label\": \"贞丰县\"\n          },\n          {\n            \"value\": \"522326\",\n            \"label\": \"望谟县\"\n          },\n          {\n            \"value\": \"522327\",\n            \"label\": \"册亨县\"\n          },\n          {\n            \"value\": \"522328\",\n            \"label\": \"安龙县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"522600\",\n        \"label\": \"黔东南苗族侗族自治州\",\n        \"children\": [\n          {\n            \"value\": \"522601\",\n            \"label\": \"凯里市\"\n          },\n          {\n            \"value\": \"522622\",\n            \"label\": \"黄平县\"\n          },\n          {\n            \"value\": \"522623\",\n            \"label\": \"施秉县\"\n          },\n          {\n            \"value\": \"522624\",\n            \"label\": \"三穗县\"\n          },\n          {\n            \"value\": \"522625\",\n            \"label\": \"镇远县\"\n          },\n          {\n            \"value\": \"522626\",\n            \"label\": \"岑巩县\"\n          },\n          {\n            \"value\": \"522627\",\n            \"label\": \"天柱县\"\n          },\n          {\n            \"value\": \"522628\",\n            \"label\": \"锦屏县\"\n          },\n          {\n            \"value\": \"522629\",\n            \"label\": \"剑河县\"\n          },\n          {\n            \"value\": \"522630\",\n            \"label\": \"台江县\"\n          },\n          {\n            \"value\": \"522631\",\n            \"label\": \"黎平县\"\n          },\n          {\n            \"value\": \"522632\",\n            \"label\": \"榕江县\"\n          },\n          {\n            \"value\": \"522633\",\n            \"label\": \"从江县\"\n          },\n          {\n            \"value\": \"522634\",\n            \"label\": \"雷山县\"\n          },\n          {\n            \"value\": \"522635\",\n            \"label\": \"麻江县\"\n          },\n          {\n            \"value\": \"522636\",\n            \"label\": \"丹寨县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"522700\",\n        \"label\": \"黔南布依族苗族自治州\",\n        \"children\": [\n          {\n            \"value\": \"522701\",\n            \"label\": \"都匀市\"\n          },\n          {\n            \"value\": \"522702\",\n            \"label\": \"福泉市\"\n          },\n          {\n            \"value\": \"522722\",\n            \"label\": \"荔波县\"\n          },\n          {\n            \"value\": \"522723\",\n            \"label\": \"贵定县\"\n          },\n          {\n            \"value\": \"522725\",\n            \"label\": \"瓮安县\"\n          },\n          {\n            \"value\": \"522726\",\n            \"label\": \"独山县\"\n          },\n          {\n            \"value\": \"522727\",\n            \"label\": \"平塘县\"\n          },\n          {\n            \"value\": \"522728\",\n            \"label\": \"罗甸县\"\n          },\n          {\n            \"value\": \"522729\",\n            \"label\": \"长顺县\"\n          },\n          {\n            \"value\": \"522730\",\n            \"label\": \"龙里县\"\n          },\n          {\n            \"value\": \"522731\",\n            \"label\": \"惠水县\"\n          },\n          {\n            \"value\": \"522732\",\n            \"label\": \"三都水族自治县\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"530000\",\n    \"label\": \"云南省\",\n    \"children\": [\n      {\n        \"value\": \"530100\",\n        \"label\": \"昆明市\",\n        \"children\": [\n          {\n            \"value\": \"530102\",\n            \"label\": \"五华区\"\n          },\n          {\n            \"value\": \"530103\",\n            \"label\": \"盘龙区\"\n          },\n          {\n            \"value\": \"530111\",\n            \"label\": \"官渡区\"\n          },\n          {\n            \"value\": \"530112\",\n            \"label\": \"西山区\"\n          },\n          {\n            \"value\": \"530113\",\n            \"label\": \"东川区\"\n          },\n          {\n            \"value\": \"530114\",\n            \"label\": \"呈贡区\"\n          },\n          {\n            \"value\": \"530115\",\n            \"label\": \"晋宁区\"\n          },\n          {\n            \"value\": \"530124\",\n            \"label\": \"富民县\"\n          },\n          {\n            \"value\": \"530125\",\n            \"label\": \"宜良县\"\n          },\n          {\n            \"value\": \"530126\",\n            \"label\": \"石林彝族自治县\"\n          },\n          {\n            \"value\": \"530127\",\n            \"label\": \"嵩明县\"\n          },\n          {\n            \"value\": \"530128\",\n            \"label\": \"禄劝彝族苗族自治县\"\n          },\n          {\n            \"value\": \"530129\",\n            \"label\": \"寻甸回族彝族自治县\"\n          },\n          {\n            \"value\": \"530181\",\n            \"label\": \"安宁市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"530300\",\n        \"label\": \"曲靖市\",\n        \"children\": [\n          {\n            \"value\": \"530302\",\n            \"label\": \"麒麟区\"\n          },\n          {\n            \"value\": \"530303\",\n            \"label\": \"沾益区\"\n          },\n          {\n            \"value\": \"530304\",\n            \"label\": \"马龙区\"\n          },\n          {\n            \"value\": \"530322\",\n            \"label\": \"陆良县\"\n          },\n          {\n            \"value\": \"530323\",\n            \"label\": \"师宗县\"\n          },\n          {\n            \"value\": \"530324\",\n            \"label\": \"罗平县\"\n          },\n          {\n            \"value\": \"530325\",\n            \"label\": \"富源县\"\n          },\n          {\n            \"value\": \"530326\",\n            \"label\": \"会泽县\"\n          },\n          {\n            \"value\": \"530381\",\n            \"label\": \"宣威市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"530400\",\n        \"label\": \"玉溪市\",\n        \"children\": [\n          {\n            \"value\": \"530402\",\n            \"label\": \"红塔区\"\n          },\n          {\n            \"value\": \"530403\",\n            \"label\": \"江川区\"\n          },\n          {\n            \"value\": \"530422\",\n            \"label\": \"澄江县\"\n          },\n          {\n            \"value\": \"530423\",\n            \"label\": \"通海县\"\n          },\n          {\n            \"value\": \"530424\",\n            \"label\": \"华宁县\"\n          },\n          {\n            \"value\": \"530425\",\n            \"label\": \"易门县\"\n          },\n          {\n            \"value\": \"530426\",\n            \"label\": \"峨山彝族自治县\"\n          },\n          {\n            \"value\": \"530427\",\n            \"label\": \"新平彝族傣族自治县\"\n          },\n          {\n            \"value\": \"530428\",\n            \"label\": \"元江哈尼族彝族傣族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"530500\",\n        \"label\": \"保山市\",\n        \"children\": [\n          {\n            \"value\": \"530502\",\n            \"label\": \"隆阳区\"\n          },\n          {\n            \"value\": \"530521\",\n            \"label\": \"施甸县\"\n          },\n          {\n            \"value\": \"530523\",\n            \"label\": \"龙陵县\"\n          },\n          {\n            \"value\": \"530524\",\n            \"label\": \"昌宁县\"\n          },\n          {\n            \"value\": \"530581\",\n            \"label\": \"腾冲市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"530600\",\n        \"label\": \"昭通市\",\n        \"children\": [\n          {\n            \"value\": \"530602\",\n            \"label\": \"昭阳区\"\n          },\n          {\n            \"value\": \"530621\",\n            \"label\": \"鲁甸县\"\n          },\n          {\n            \"value\": \"530622\",\n            \"label\": \"巧家县\"\n          },\n          {\n            \"value\": \"530623\",\n            \"label\": \"盐津县\"\n          },\n          {\n            \"value\": \"530624\",\n            \"label\": \"大关县\"\n          },\n          {\n            \"value\": \"530625\",\n            \"label\": \"永善县\"\n          },\n          {\n            \"value\": \"530626\",\n            \"label\": \"绥江县\"\n          },\n          {\n            \"value\": \"530627\",\n            \"label\": \"镇雄县\"\n          },\n          {\n            \"value\": \"530628\",\n            \"label\": \"彝良县\"\n          },\n          {\n            \"value\": \"530629\",\n            \"label\": \"威信县\"\n          },\n          {\n            \"value\": \"530681\",\n            \"label\": \"水富市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"530700\",\n        \"label\": \"丽江市\",\n        \"children\": [\n          {\n            \"value\": \"530702\",\n            \"label\": \"古城区\"\n          },\n          {\n            \"value\": \"530721\",\n            \"label\": \"玉龙纳西族自治县\"\n          },\n          {\n            \"value\": \"530722\",\n            \"label\": \"永胜县\"\n          },\n          {\n            \"value\": \"530723\",\n            \"label\": \"华坪县\"\n          },\n          {\n            \"value\": \"530724\",\n            \"label\": \"宁蒗彝族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"530800\",\n        \"label\": \"普洱市\",\n        \"children\": [\n          {\n            \"value\": \"530802\",\n            \"label\": \"思茅区\"\n          },\n          {\n            \"value\": \"530821\",\n            \"label\": \"宁洱哈尼族彝族自治县\"\n          },\n          {\n            \"value\": \"530822\",\n            \"label\": \"墨江哈尼族自治县\"\n          },\n          {\n            \"value\": \"530823\",\n            \"label\": \"景东彝族自治县\"\n          },\n          {\n            \"value\": \"530824\",\n            \"label\": \"景谷傣族彝族自治县\"\n          },\n          {\n            \"value\": \"530825\",\n            \"label\": \"镇沅彝族哈尼族拉祜族自治县\"\n          },\n          {\n            \"value\": \"530826\",\n            \"label\": \"江城哈尼族彝族自治县\"\n          },\n          {\n            \"value\": \"530827\",\n            \"label\": \"孟连傣族拉祜族佤族自治县\"\n          },\n          {\n            \"value\": \"530828\",\n            \"label\": \"澜沧拉祜族自治县\"\n          },\n          {\n            \"value\": \"530829\",\n            \"label\": \"西盟佤族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"530900\",\n        \"label\": \"临沧市\",\n        \"children\": [\n          {\n            \"value\": \"530902\",\n            \"label\": \"临翔区\"\n          },\n          {\n            \"value\": \"530921\",\n            \"label\": \"凤庆县\"\n          },\n          {\n            \"value\": \"530922\",\n            \"label\": \"云县\"\n          },\n          {\n            \"value\": \"530923\",\n            \"label\": \"永德县\"\n          },\n          {\n            \"value\": \"530924\",\n            \"label\": \"镇康县\"\n          },\n          {\n            \"value\": \"530925\",\n            \"label\": \"双江拉祜族佤族布朗族傣族自治县\"\n          },\n          {\n            \"value\": \"530926\",\n            \"label\": \"耿马傣族佤族自治县\"\n          },\n          {\n            \"value\": \"530927\",\n            \"label\": \"沧源佤族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"532300\",\n        \"label\": \"楚雄彝族自治州\",\n        \"children\": [\n          {\n            \"value\": \"532301\",\n            \"label\": \"楚雄市\"\n          },\n          {\n            \"value\": \"532322\",\n            \"label\": \"双柏县\"\n          },\n          {\n            \"value\": \"532323\",\n            \"label\": \"牟定县\"\n          },\n          {\n            \"value\": \"532324\",\n            \"label\": \"南华县\"\n          },\n          {\n            \"value\": \"532325\",\n            \"label\": \"姚安县\"\n          },\n          {\n            \"value\": \"532326\",\n            \"label\": \"大姚县\"\n          },\n          {\n            \"value\": \"532327\",\n            \"label\": \"永仁县\"\n          },\n          {\n            \"value\": \"532328\",\n            \"label\": \"元谋县\"\n          },\n          {\n            \"value\": \"532329\",\n            \"label\": \"武定县\"\n          },\n          {\n            \"value\": \"532331\",\n            \"label\": \"禄丰县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"532500\",\n        \"label\": \"红河哈尼族彝族自治州\",\n        \"children\": [\n          {\n            \"value\": \"532501\",\n            \"label\": \"个旧市\"\n          },\n          {\n            \"value\": \"532502\",\n            \"label\": \"开远市\"\n          },\n          {\n            \"value\": \"532503\",\n            \"label\": \"蒙自市\"\n          },\n          {\n            \"value\": \"532504\",\n            \"label\": \"弥勒市\"\n          },\n          {\n            \"value\": \"532523\",\n            \"label\": \"屏边苗族自治县\"\n          },\n          {\n            \"value\": \"532524\",\n            \"label\": \"建水县\"\n          },\n          {\n            \"value\": \"532525\",\n            \"label\": \"石屏县\"\n          },\n          {\n            \"value\": \"532527\",\n            \"label\": \"泸西县\"\n          },\n          {\n            \"value\": \"532528\",\n            \"label\": \"元阳县\"\n          },\n          {\n            \"value\": \"532529\",\n            \"label\": \"红河县\"\n          },\n          {\n            \"value\": \"532530\",\n            \"label\": \"金平苗族瑶族傣族自治县\"\n          },\n          {\n            \"value\": \"532531\",\n            \"label\": \"绿春县\"\n          },\n          {\n            \"value\": \"532532\",\n            \"label\": \"河口瑶族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"532600\",\n        \"label\": \"文山壮族苗族自治州\",\n        \"children\": [\n          {\n            \"value\": \"532601\",\n            \"label\": \"文山市\"\n          },\n          {\n            \"value\": \"532622\",\n            \"label\": \"砚山县\"\n          },\n          {\n            \"value\": \"532623\",\n            \"label\": \"西畴县\"\n          },\n          {\n            \"value\": \"532624\",\n            \"label\": \"麻栗坡县\"\n          },\n          {\n            \"value\": \"532625\",\n            \"label\": \"马关县\"\n          },\n          {\n            \"value\": \"532626\",\n            \"label\": \"丘北县\"\n          },\n          {\n            \"value\": \"532627\",\n            \"label\": \"广南县\"\n          },\n          {\n            \"value\": \"532628\",\n            \"label\": \"富宁县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"532800\",\n        \"label\": \"西双版纳傣族自治州\",\n        \"children\": [\n          {\n            \"value\": \"532801\",\n            \"label\": \"景洪市\"\n          },\n          {\n            \"value\": \"532822\",\n            \"label\": \"勐海县\"\n          },\n          {\n            \"value\": \"532823\",\n            \"label\": \"勐腊县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"532900\",\n        \"label\": \"大理白族自治州\",\n        \"children\": [\n          {\n            \"value\": \"532901\",\n            \"label\": \"大理市\"\n          },\n          {\n            \"value\": \"532922\",\n            \"label\": \"漾濞彝族自治县\"\n          },\n          {\n            \"value\": \"532923\",\n            \"label\": \"祥云县\"\n          },\n          {\n            \"value\": \"532924\",\n            \"label\": \"宾川县\"\n          },\n          {\n            \"value\": \"532925\",\n            \"label\": \"弥渡县\"\n          },\n          {\n            \"value\": \"532926\",\n            \"label\": \"南涧彝族自治县\"\n          },\n          {\n            \"value\": \"532927\",\n            \"label\": \"巍山彝族回族自治县\"\n          },\n          {\n            \"value\": \"532928\",\n            \"label\": \"永平县\"\n          },\n          {\n            \"value\": \"532929\",\n            \"label\": \"云龙县\"\n          },\n          {\n            \"value\": \"532930\",\n            \"label\": \"洱源县\"\n          },\n          {\n            \"value\": \"532931\",\n            \"label\": \"剑川县\"\n          },\n          {\n            \"value\": \"532932\",\n            \"label\": \"鹤庆县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"533100\",\n        \"label\": \"德宏傣族景颇族自治州\",\n        \"children\": [\n          {\n            \"value\": \"533102\",\n            \"label\": \"瑞丽市\"\n          },\n          {\n            \"value\": \"533103\",\n            \"label\": \"芒市\"\n          },\n          {\n            \"value\": \"533122\",\n            \"label\": \"梁河县\"\n          },\n          {\n            \"value\": \"533123\",\n            \"label\": \"盈江县\"\n          },\n          {\n            \"value\": \"533124\",\n            \"label\": \"陇川县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"533300\",\n        \"label\": \"怒江傈僳族自治州\",\n        \"children\": [\n          {\n            \"value\": \"533301\",\n            \"label\": \"泸水市\"\n          },\n          {\n            \"value\": \"533323\",\n            \"label\": \"福贡县\"\n          },\n          {\n            \"value\": \"533324\",\n            \"label\": \"贡山独龙族怒族自治县\"\n          },\n          {\n            \"value\": \"533325\",\n            \"label\": \"兰坪白族普米族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"533400\",\n        \"label\": \"迪庆藏族自治州\",\n        \"children\": [\n          {\n            \"value\": \"533401\",\n            \"label\": \"香格里拉市\"\n          },\n          {\n            \"value\": \"533422\",\n            \"label\": \"德钦县\"\n          },\n          {\n            \"value\": \"533423\",\n            \"label\": \"维西傈僳族自治县\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"540000\",\n    \"label\": \"西藏自治区\",\n    \"children\": [\n      {\n        \"value\": \"540100\",\n        \"label\": \"拉萨市\",\n        \"children\": [\n          {\n            \"value\": \"540102\",\n            \"label\": \"城关区\"\n          },\n          {\n            \"value\": \"540103\",\n            \"label\": \"堆龙德庆区\"\n          },\n          {\n            \"value\": \"540104\",\n            \"label\": \"达孜区\"\n          },\n          {\n            \"value\": \"540121\",\n            \"label\": \"林周县\"\n          },\n          {\n            \"value\": \"540122\",\n            \"label\": \"当雄县\"\n          },\n          {\n            \"value\": \"540123\",\n            \"label\": \"尼木县\"\n          },\n          {\n            \"value\": \"540124\",\n            \"label\": \"曲水县\"\n          },\n          {\n            \"value\": \"540127\",\n            \"label\": \"墨竹工卡县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"540200\",\n        \"label\": \"日喀则市\",\n        \"children\": [\n          {\n            \"value\": \"540202\",\n            \"label\": \"桑珠孜区\"\n          },\n          {\n            \"value\": \"540221\",\n            \"label\": \"南木林县\"\n          },\n          {\n            \"value\": \"540222\",\n            \"label\": \"江孜县\"\n          },\n          {\n            \"value\": \"540223\",\n            \"label\": \"定日县\"\n          },\n          {\n            \"value\": \"540224\",\n            \"label\": \"萨迦县\"\n          },\n          {\n            \"value\": \"540225\",\n            \"label\": \"拉孜县\"\n          },\n          {\n            \"value\": \"540226\",\n            \"label\": \"昂仁县\"\n          },\n          {\n            \"value\": \"540227\",\n            \"label\": \"谢通门县\"\n          },\n          {\n            \"value\": \"540228\",\n            \"label\": \"白朗县\"\n          },\n          {\n            \"value\": \"540229\",\n            \"label\": \"仁布县\"\n          },\n          {\n            \"value\": \"540230\",\n            \"label\": \"康马县\"\n          },\n          {\n            \"value\": \"540231\",\n            \"label\": \"定结县\"\n          },\n          {\n            \"value\": \"540232\",\n            \"label\": \"仲巴县\"\n          },\n          {\n            \"value\": \"540233\",\n            \"label\": \"亚东县\"\n          },\n          {\n            \"value\": \"540234\",\n            \"label\": \"吉隆县\"\n          },\n          {\n            \"value\": \"540235\",\n            \"label\": \"聂拉木县\"\n          },\n          {\n            \"value\": \"540236\",\n            \"label\": \"萨嘎县\"\n          },\n          {\n            \"value\": \"540237\",\n            \"label\": \"岗巴县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"540300\",\n        \"label\": \"昌都市\",\n        \"children\": [\n          {\n            \"value\": \"540302\",\n            \"label\": \"卡若区\"\n          },\n          {\n            \"value\": \"540321\",\n            \"label\": \"江达县\"\n          },\n          {\n            \"value\": \"540322\",\n            \"label\": \"贡觉县\"\n          },\n          {\n            \"value\": \"540323\",\n            \"label\": \"类乌齐县\"\n          },\n          {\n            \"value\": \"540324\",\n            \"label\": \"丁青县\"\n          },\n          {\n            \"value\": \"540325\",\n            \"label\": \"察雅县\"\n          },\n          {\n            \"value\": \"540326\",\n            \"label\": \"八宿县\"\n          },\n          {\n            \"value\": \"540327\",\n            \"label\": \"左贡县\"\n          },\n          {\n            \"value\": \"540328\",\n            \"label\": \"芒康县\"\n          },\n          {\n            \"value\": \"540329\",\n            \"label\": \"洛隆县\"\n          },\n          {\n            \"value\": \"540330\",\n            \"label\": \"边坝县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"540400\",\n        \"label\": \"林芝市\",\n        \"children\": [\n          {\n            \"value\": \"540402\",\n            \"label\": \"巴宜区\"\n          },\n          {\n            \"value\": \"540421\",\n            \"label\": \"工布江达县\"\n          },\n          {\n            \"value\": \"540422\",\n            \"label\": \"米林县\"\n          },\n          {\n            \"value\": \"540423\",\n            \"label\": \"墨脱县\"\n          },\n          {\n            \"value\": \"540424\",\n            \"label\": \"波密县\"\n          },\n          {\n            \"value\": \"540425\",\n            \"label\": \"察隅县\"\n          },\n          {\n            \"value\": \"540426\",\n            \"label\": \"朗县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"540500\",\n        \"label\": \"山南市\",\n        \"children\": [\n          {\n            \"value\": \"540502\",\n            \"label\": \"乃东区\"\n          },\n          {\n            \"value\": \"540521\",\n            \"label\": \"扎囊县\"\n          },\n          {\n            \"value\": \"540522\",\n            \"label\": \"贡嘎县\"\n          },\n          {\n            \"value\": \"540523\",\n            \"label\": \"桑日县\"\n          },\n          {\n            \"value\": \"540524\",\n            \"label\": \"琼结县\"\n          },\n          {\n            \"value\": \"540525\",\n            \"label\": \"曲松县\"\n          },\n          {\n            \"value\": \"540526\",\n            \"label\": \"措美县\"\n          },\n          {\n            \"value\": \"540527\",\n            \"label\": \"洛扎县\"\n          },\n          {\n            \"value\": \"540528\",\n            \"label\": \"加查县\"\n          },\n          {\n            \"value\": \"540529\",\n            \"label\": \"隆子县\"\n          },\n          {\n            \"value\": \"540530\",\n            \"label\": \"错那县\"\n          },\n          {\n            \"value\": \"540531\",\n            \"label\": \"浪卡子县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"540600\",\n        \"label\": \"那曲市\",\n        \"children\": [\n          {\n            \"value\": \"540602\",\n            \"label\": \"色尼区\"\n          },\n          {\n            \"value\": \"540621\",\n            \"label\": \"嘉黎县\"\n          },\n          {\n            \"value\": \"540622\",\n            \"label\": \"比如县\"\n          },\n          {\n            \"value\": \"540623\",\n            \"label\": \"聂荣县\"\n          },\n          {\n            \"value\": \"540624\",\n            \"label\": \"安多县\"\n          },\n          {\n            \"value\": \"540625\",\n            \"label\": \"申扎县\"\n          },\n          {\n            \"value\": \"540626\",\n            \"label\": \"索县\"\n          },\n          {\n            \"value\": \"540627\",\n            \"label\": \"班戈县\"\n          },\n          {\n            \"value\": \"540628\",\n            \"label\": \"巴青县\"\n          },\n          {\n            \"value\": \"540629\",\n            \"label\": \"尼玛县\"\n          },\n          {\n            \"value\": \"540630\",\n            \"label\": \"双湖县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"542500\",\n        \"label\": \"阿里地区\",\n        \"children\": [\n          {\n            \"value\": \"542521\",\n            \"label\": \"普兰县\"\n          },\n          {\n            \"value\": \"542522\",\n            \"label\": \"札达县\"\n          },\n          {\n            \"value\": \"542523\",\n            \"label\": \"噶尔县\"\n          },\n          {\n            \"value\": \"542524\",\n            \"label\": \"日土县\"\n          },\n          {\n            \"value\": \"542525\",\n            \"label\": \"革吉县\"\n          },\n          {\n            \"value\": \"542526\",\n            \"label\": \"改则县\"\n          },\n          {\n            \"value\": \"542527\",\n            \"label\": \"措勤县\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"610000\",\n    \"label\": \"陕西省\",\n    \"children\": [\n      {\n        \"value\": \"610100\",\n        \"label\": \"西安市\",\n        \"children\": [\n          {\n            \"value\": \"610102\",\n            \"label\": \"新城区\"\n          },\n          {\n            \"value\": \"610103\",\n            \"label\": \"碑林区\"\n          },\n          {\n            \"value\": \"610104\",\n            \"label\": \"莲湖区\"\n          },\n          {\n            \"value\": \"610111\",\n            \"label\": \"灞桥区\"\n          },\n          {\n            \"value\": \"610112\",\n            \"label\": \"未央区\"\n          },\n          {\n            \"value\": \"610113\",\n            \"label\": \"雁塔区\"\n          },\n          {\n            \"value\": \"610114\",\n            \"label\": \"阎良区\"\n          },\n          {\n            \"value\": \"610115\",\n            \"label\": \"临潼区\"\n          },\n          {\n            \"value\": \"610116\",\n            \"label\": \"长安区\"\n          },\n          {\n            \"value\": \"610117\",\n            \"label\": \"高陵区\"\n          },\n          {\n            \"value\": \"610118\",\n            \"label\": \"鄠邑区\"\n          },\n          {\n            \"value\": \"610122\",\n            \"label\": \"蓝田县\"\n          },\n          {\n            \"value\": \"610124\",\n            \"label\": \"周至县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"610200\",\n        \"label\": \"铜川市\",\n        \"children\": [\n          {\n            \"value\": \"610202\",\n            \"label\": \"王益区\"\n          },\n          {\n            \"value\": \"610203\",\n            \"label\": \"印台区\"\n          },\n          {\n            \"value\": \"610204\",\n            \"label\": \"耀州区\"\n          },\n          {\n            \"value\": \"610222\",\n            \"label\": \"宜君县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"610300\",\n        \"label\": \"宝鸡市\",\n        \"children\": [\n          {\n            \"value\": \"610302\",\n            \"label\": \"渭滨区\"\n          },\n          {\n            \"value\": \"610303\",\n            \"label\": \"金台区\"\n          },\n          {\n            \"value\": \"610304\",\n            \"label\": \"陈仓区\"\n          },\n          {\n            \"value\": \"610322\",\n            \"label\": \"凤翔县\"\n          },\n          {\n            \"value\": \"610323\",\n            \"label\": \"岐山县\"\n          },\n          {\n            \"value\": \"610324\",\n            \"label\": \"扶风县\"\n          },\n          {\n            \"value\": \"610326\",\n            \"label\": \"眉县\"\n          },\n          {\n            \"value\": \"610327\",\n            \"label\": \"陇县\"\n          },\n          {\n            \"value\": \"610328\",\n            \"label\": \"千阳县\"\n          },\n          {\n            \"value\": \"610329\",\n            \"label\": \"麟游县\"\n          },\n          {\n            \"value\": \"610330\",\n            \"label\": \"凤县\"\n          },\n          {\n            \"value\": \"610331\",\n            \"label\": \"太白县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"610400\",\n        \"label\": \"咸阳市\",\n        \"children\": [\n          {\n            \"value\": \"610402\",\n            \"label\": \"秦都区\"\n          },\n          {\n            \"value\": \"610403\",\n            \"label\": \"杨陵区\"\n          },\n          {\n            \"value\": \"610404\",\n            \"label\": \"渭城区\"\n          },\n          {\n            \"value\": \"610422\",\n            \"label\": \"三原县\"\n          },\n          {\n            \"value\": \"610423\",\n            \"label\": \"泾阳县\"\n          },\n          {\n            \"value\": \"610424\",\n            \"label\": \"乾县\"\n          },\n          {\n            \"value\": \"610425\",\n            \"label\": \"礼泉县\"\n          },\n          {\n            \"value\": \"610426\",\n            \"label\": \"永寿县\"\n          },\n          {\n            \"value\": \"610428\",\n            \"label\": \"长武县\"\n          },\n          {\n            \"value\": \"610429\",\n            \"label\": \"旬邑县\"\n          },\n          {\n            \"value\": \"610430\",\n            \"label\": \"淳化县\"\n          },\n          {\n            \"value\": \"610431\",\n            \"label\": \"武功县\"\n          },\n          {\n            \"value\": \"610481\",\n            \"label\": \"兴平市\"\n          },\n          {\n            \"value\": \"610482\",\n            \"label\": \"彬州市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"610500\",\n        \"label\": \"渭南市\",\n        \"children\": [\n          {\n            \"value\": \"610502\",\n            \"label\": \"临渭区\"\n          },\n          {\n            \"value\": \"610503\",\n            \"label\": \"华州区\"\n          },\n          {\n            \"value\": \"610522\",\n            \"label\": \"潼关县\"\n          },\n          {\n            \"value\": \"610523\",\n            \"label\": \"大荔县\"\n          },\n          {\n            \"value\": \"610524\",\n            \"label\": \"合阳县\"\n          },\n          {\n            \"value\": \"610525\",\n            \"label\": \"澄城县\"\n          },\n          {\n            \"value\": \"610526\",\n            \"label\": \"蒲城县\"\n          },\n          {\n            \"value\": \"610527\",\n            \"label\": \"白水县\"\n          },\n          {\n            \"value\": \"610528\",\n            \"label\": \"富平县\"\n          },\n          {\n            \"value\": \"610581\",\n            \"label\": \"韩城市\"\n          },\n          {\n            \"value\": \"610582\",\n            \"label\": \"华阴市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"610600\",\n        \"label\": \"延安市\",\n        \"children\": [\n          {\n            \"value\": \"610602\",\n            \"label\": \"宝塔区\"\n          },\n          {\n            \"value\": \"610603\",\n            \"label\": \"安塞区\"\n          },\n          {\n            \"value\": \"610621\",\n            \"label\": \"延长县\"\n          },\n          {\n            \"value\": \"610622\",\n            \"label\": \"延川县\"\n          },\n          {\n            \"value\": \"610623\",\n            \"label\": \"子长县\"\n          },\n          {\n            \"value\": \"610625\",\n            \"label\": \"志丹县\"\n          },\n          {\n            \"value\": \"610626\",\n            \"label\": \"吴起县\"\n          },\n          {\n            \"value\": \"610627\",\n            \"label\": \"甘泉县\"\n          },\n          {\n            \"value\": \"610628\",\n            \"label\": \"富县\"\n          },\n          {\n            \"value\": \"610629\",\n            \"label\": \"洛川县\"\n          },\n          {\n            \"value\": \"610630\",\n            \"label\": \"宜川县\"\n          },\n          {\n            \"value\": \"610631\",\n            \"label\": \"黄龙县\"\n          },\n          {\n            \"value\": \"610632\",\n            \"label\": \"黄陵县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"610700\",\n        \"label\": \"汉中市\",\n        \"children\": [\n          {\n            \"value\": \"610702\",\n            \"label\": \"汉台区\"\n          },\n          {\n            \"value\": \"610703\",\n            \"label\": \"南郑区\"\n          },\n          {\n            \"value\": \"610722\",\n            \"label\": \"城固县\"\n          },\n          {\n            \"value\": \"610723\",\n            \"label\": \"洋县\"\n          },\n          {\n            \"value\": \"610724\",\n            \"label\": \"西乡县\"\n          },\n          {\n            \"value\": \"610725\",\n            \"label\": \"勉县\"\n          },\n          {\n            \"value\": \"610726\",\n            \"label\": \"宁强县\"\n          },\n          {\n            \"value\": \"610727\",\n            \"label\": \"略阳县\"\n          },\n          {\n            \"value\": \"610728\",\n            \"label\": \"镇巴县\"\n          },\n          {\n            \"value\": \"610729\",\n            \"label\": \"留坝县\"\n          },\n          {\n            \"value\": \"610730\",\n            \"label\": \"佛坪县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"610800\",\n        \"label\": \"榆林市\",\n        \"children\": [\n          {\n            \"value\": \"610802\",\n            \"label\": \"榆阳区\"\n          },\n          {\n            \"value\": \"610803\",\n            \"label\": \"横山区\"\n          },\n          {\n            \"value\": \"610822\",\n            \"label\": \"府谷县\"\n          },\n          {\n            \"value\": \"610824\",\n            \"label\": \"靖边县\"\n          },\n          {\n            \"value\": \"610825\",\n            \"label\": \"定边县\"\n          },\n          {\n            \"value\": \"610826\",\n            \"label\": \"绥德县\"\n          },\n          {\n            \"value\": \"610827\",\n            \"label\": \"米脂县\"\n          },\n          {\n            \"value\": \"610828\",\n            \"label\": \"佳县\"\n          },\n          {\n            \"value\": \"610829\",\n            \"label\": \"吴堡县\"\n          },\n          {\n            \"value\": \"610830\",\n            \"label\": \"清涧县\"\n          },\n          {\n            \"value\": \"610831\",\n            \"label\": \"子洲县\"\n          },\n          {\n            \"value\": \"610881\",\n            \"label\": \"神木市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"610900\",\n        \"label\": \"安康市\",\n        \"children\": [\n          {\n            \"value\": \"610902\",\n            \"label\": \"汉滨区\"\n          },\n          {\n            \"value\": \"610921\",\n            \"label\": \"汉阴县\"\n          },\n          {\n            \"value\": \"610922\",\n            \"label\": \"石泉县\"\n          },\n          {\n            \"value\": \"610923\",\n            \"label\": \"宁陕县\"\n          },\n          {\n            \"value\": \"610924\",\n            \"label\": \"紫阳县\"\n          },\n          {\n            \"value\": \"610925\",\n            \"label\": \"岚皋县\"\n          },\n          {\n            \"value\": \"610926\",\n            \"label\": \"平利县\"\n          },\n          {\n            \"value\": \"610927\",\n            \"label\": \"镇坪县\"\n          },\n          {\n            \"value\": \"610928\",\n            \"label\": \"旬阳县\"\n          },\n          {\n            \"value\": \"610929\",\n            \"label\": \"白河县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"611000\",\n        \"label\": \"商洛市\",\n        \"children\": [\n          {\n            \"value\": \"611002\",\n            \"label\": \"商州区\"\n          },\n          {\n            \"value\": \"611021\",\n            \"label\": \"洛南县\"\n          },\n          {\n            \"value\": \"611022\",\n            \"label\": \"丹凤县\"\n          },\n          {\n            \"value\": \"611023\",\n            \"label\": \"商南县\"\n          },\n          {\n            \"value\": \"611024\",\n            \"label\": \"山阳县\"\n          },\n          {\n            \"value\": \"611025\",\n            \"label\": \"镇安县\"\n          },\n          {\n            \"value\": \"611026\",\n            \"label\": \"柞水县\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"620000\",\n    \"label\": \"甘肃省\",\n    \"children\": [\n      {\n        \"value\": \"620100\",\n        \"label\": \"兰州市\",\n        \"children\": [\n          {\n            \"value\": \"620102\",\n            \"label\": \"城关区\"\n          },\n          {\n            \"value\": \"620103\",\n            \"label\": \"七里河区\"\n          },\n          {\n            \"value\": \"620104\",\n            \"label\": \"西固区\"\n          },\n          {\n            \"value\": \"620105\",\n            \"label\": \"安宁区\"\n          },\n          {\n            \"value\": \"620111\",\n            \"label\": \"红古区\"\n          },\n          {\n            \"value\": \"620121\",\n            \"label\": \"永登县\"\n          },\n          {\n            \"value\": \"620122\",\n            \"label\": \"皋兰县\"\n          },\n          {\n            \"value\": \"620123\",\n            \"label\": \"榆中县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"620200\",\n        \"label\": \"嘉峪关市\",\n        \"children\": []\n      },\n      {\n        \"value\": \"620300\",\n        \"label\": \"金昌市\",\n        \"children\": [\n          {\n            \"value\": \"620302\",\n            \"label\": \"金川区\"\n          },\n          {\n            \"value\": \"620321\",\n            \"label\": \"永昌县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"620400\",\n        \"label\": \"白银市\",\n        \"children\": [\n          {\n            \"value\": \"620402\",\n            \"label\": \"白银区\"\n          },\n          {\n            \"value\": \"620403\",\n            \"label\": \"平川区\"\n          },\n          {\n            \"value\": \"620421\",\n            \"label\": \"靖远县\"\n          },\n          {\n            \"value\": \"620422\",\n            \"label\": \"会宁县\"\n          },\n          {\n            \"value\": \"620423\",\n            \"label\": \"景泰县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"620500\",\n        \"label\": \"天水市\",\n        \"children\": [\n          {\n            \"value\": \"620502\",\n            \"label\": \"秦州区\"\n          },\n          {\n            \"value\": \"620503\",\n            \"label\": \"麦积区\"\n          },\n          {\n            \"value\": \"620521\",\n            \"label\": \"清水县\"\n          },\n          {\n            \"value\": \"620522\",\n            \"label\": \"秦安县\"\n          },\n          {\n            \"value\": \"620523\",\n            \"label\": \"甘谷县\"\n          },\n          {\n            \"value\": \"620524\",\n            \"label\": \"武山县\"\n          },\n          {\n            \"value\": \"620525\",\n            \"label\": \"张家川回族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"620600\",\n        \"label\": \"武威市\",\n        \"children\": [\n          {\n            \"value\": \"620602\",\n            \"label\": \"凉州区\"\n          },\n          {\n            \"value\": \"620621\",\n            \"label\": \"民勤县\"\n          },\n          {\n            \"value\": \"620622\",\n            \"label\": \"古浪县\"\n          },\n          {\n            \"value\": \"620623\",\n            \"label\": \"天祝藏族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"620700\",\n        \"label\": \"张掖市\",\n        \"children\": [\n          {\n            \"value\": \"620702\",\n            \"label\": \"甘州区\"\n          },\n          {\n            \"value\": \"620721\",\n            \"label\": \"肃南裕固族自治县\"\n          },\n          {\n            \"value\": \"620722\",\n            \"label\": \"民乐县\"\n          },\n          {\n            \"value\": \"620723\",\n            \"label\": \"临泽县\"\n          },\n          {\n            \"value\": \"620724\",\n            \"label\": \"高台县\"\n          },\n          {\n            \"value\": \"620725\",\n            \"label\": \"山丹县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"620800\",\n        \"label\": \"平凉市\",\n        \"children\": [\n          {\n            \"value\": \"620802\",\n            \"label\": \"崆峒区\"\n          },\n          {\n            \"value\": \"620821\",\n            \"label\": \"泾川县\"\n          },\n          {\n            \"value\": \"620822\",\n            \"label\": \"灵台县\"\n          },\n          {\n            \"value\": \"620823\",\n            \"label\": \"崇信县\"\n          },\n          {\n            \"value\": \"620825\",\n            \"label\": \"庄浪县\"\n          },\n          {\n            \"value\": \"620826\",\n            \"label\": \"静宁县\"\n          },\n          {\n            \"value\": \"620881\",\n            \"label\": \"华亭市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"620900\",\n        \"label\": \"酒泉市\",\n        \"children\": [\n          {\n            \"value\": \"620902\",\n            \"label\": \"肃州区\"\n          },\n          {\n            \"value\": \"620921\",\n            \"label\": \"金塔县\"\n          },\n          {\n            \"value\": \"620922\",\n            \"label\": \"瓜州县\"\n          },\n          {\n            \"value\": \"620923\",\n            \"label\": \"肃北蒙古族自治县\"\n          },\n          {\n            \"value\": \"620924\",\n            \"label\": \"阿克塞哈萨克族自治县\"\n          },\n          {\n            \"value\": \"620981\",\n            \"label\": \"玉门市\"\n          },\n          {\n            \"value\": \"620982\",\n            \"label\": \"敦煌市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"621000\",\n        \"label\": \"庆阳市\",\n        \"children\": [\n          {\n            \"value\": \"621002\",\n            \"label\": \"西峰区\"\n          },\n          {\n            \"value\": \"621021\",\n            \"label\": \"庆城县\"\n          },\n          {\n            \"value\": \"621022\",\n            \"label\": \"环县\"\n          },\n          {\n            \"value\": \"621023\",\n            \"label\": \"华池县\"\n          },\n          {\n            \"value\": \"621024\",\n            \"label\": \"合水县\"\n          },\n          {\n            \"value\": \"621025\",\n            \"label\": \"正宁县\"\n          },\n          {\n            \"value\": \"621026\",\n            \"label\": \"宁县\"\n          },\n          {\n            \"value\": \"621027\",\n            \"label\": \"镇原县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"621100\",\n        \"label\": \"定西市\",\n        \"children\": [\n          {\n            \"value\": \"621102\",\n            \"label\": \"安定区\"\n          },\n          {\n            \"value\": \"621121\",\n            \"label\": \"通渭县\"\n          },\n          {\n            \"value\": \"621122\",\n            \"label\": \"陇西县\"\n          },\n          {\n            \"value\": \"621123\",\n            \"label\": \"渭源县\"\n          },\n          {\n            \"value\": \"621124\",\n            \"label\": \"临洮县\"\n          },\n          {\n            \"value\": \"621125\",\n            \"label\": \"漳县\"\n          },\n          {\n            \"value\": \"621126\",\n            \"label\": \"岷县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"621200\",\n        \"label\": \"陇南市\",\n        \"children\": [\n          {\n            \"value\": \"621202\",\n            \"label\": \"武都区\"\n          },\n          {\n            \"value\": \"621221\",\n            \"label\": \"成县\"\n          },\n          {\n            \"value\": \"621222\",\n            \"label\": \"文县\"\n          },\n          {\n            \"value\": \"621223\",\n            \"label\": \"宕昌县\"\n          },\n          {\n            \"value\": \"621224\",\n            \"label\": \"康县\"\n          },\n          {\n            \"value\": \"621225\",\n            \"label\": \"西和县\"\n          },\n          {\n            \"value\": \"621226\",\n            \"label\": \"礼县\"\n          },\n          {\n            \"value\": \"621227\",\n            \"label\": \"徽县\"\n          },\n          {\n            \"value\": \"621228\",\n            \"label\": \"两当县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"622900\",\n        \"label\": \"临夏回族自治州\",\n        \"children\": [\n          {\n            \"value\": \"622901\",\n            \"label\": \"临夏市\"\n          },\n          {\n            \"value\": \"622921\",\n            \"label\": \"临夏县\"\n          },\n          {\n            \"value\": \"622922\",\n            \"label\": \"康乐县\"\n          },\n          {\n            \"value\": \"622923\",\n            \"label\": \"永靖县\"\n          },\n          {\n            \"value\": \"622924\",\n            \"label\": \"广河县\"\n          },\n          {\n            \"value\": \"622925\",\n            \"label\": \"和政县\"\n          },\n          {\n            \"value\": \"622926\",\n            \"label\": \"东乡族自治县\"\n          },\n          {\n            \"value\": \"622927\",\n            \"label\": \"积石山保安族东乡族撒拉族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"623000\",\n        \"label\": \"甘南藏族自治州\",\n        \"children\": [\n          {\n            \"value\": \"623001\",\n            \"label\": \"合作市\"\n          },\n          {\n            \"value\": \"623021\",\n            \"label\": \"临潭县\"\n          },\n          {\n            \"value\": \"623022\",\n            \"label\": \"卓尼县\"\n          },\n          {\n            \"value\": \"623023\",\n            \"label\": \"舟曲县\"\n          },\n          {\n            \"value\": \"623024\",\n            \"label\": \"迭部县\"\n          },\n          {\n            \"value\": \"623025\",\n            \"label\": \"玛曲县\"\n          },\n          {\n            \"value\": \"623026\",\n            \"label\": \"碌曲县\"\n          },\n          {\n            \"value\": \"623027\",\n            \"label\": \"夏河县\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"630000\",\n    \"label\": \"青海省\",\n    \"children\": [\n      {\n        \"value\": \"630100\",\n        \"label\": \"西宁市\",\n        \"children\": [\n          {\n            \"value\": \"630102\",\n            \"label\": \"城东区\"\n          },\n          {\n            \"value\": \"630103\",\n            \"label\": \"城中区\"\n          },\n          {\n            \"value\": \"630104\",\n            \"label\": \"城西区\"\n          },\n          {\n            \"value\": \"630105\",\n            \"label\": \"城北区\"\n          },\n          {\n            \"value\": \"630121\",\n            \"label\": \"大通回族土族自治县\"\n          },\n          {\n            \"value\": \"630122\",\n            \"label\": \"湟中县\"\n          },\n          {\n            \"value\": \"630123\",\n            \"label\": \"湟源县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"630200\",\n        \"label\": \"海东市\",\n        \"children\": [\n          {\n            \"value\": \"630202\",\n            \"label\": \"乐都区\"\n          },\n          {\n            \"value\": \"630203\",\n            \"label\": \"平安区\"\n          },\n          {\n            \"value\": \"630222\",\n            \"label\": \"民和回族土族自治县\"\n          },\n          {\n            \"value\": \"630223\",\n            \"label\": \"互助土族自治县\"\n          },\n          {\n            \"value\": \"630224\",\n            \"label\": \"化隆回族自治县\"\n          },\n          {\n            \"value\": \"630225\",\n            \"label\": \"循化撒拉族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"632200\",\n        \"label\": \"海北藏族自治州\",\n        \"children\": [\n          {\n            \"value\": \"632221\",\n            \"label\": \"门源回族自治县\"\n          },\n          {\n            \"value\": \"632222\",\n            \"label\": \"祁连县\"\n          },\n          {\n            \"value\": \"632223\",\n            \"label\": \"海晏县\"\n          },\n          {\n            \"value\": \"632224\",\n            \"label\": \"刚察县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"632300\",\n        \"label\": \"黄南藏族自治州\",\n        \"children\": [\n          {\n            \"value\": \"632321\",\n            \"label\": \"同仁县\"\n          },\n          {\n            \"value\": \"632322\",\n            \"label\": \"尖扎县\"\n          },\n          {\n            \"value\": \"632323\",\n            \"label\": \"泽库县\"\n          },\n          {\n            \"value\": \"632324\",\n            \"label\": \"河南蒙古族自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"632500\",\n        \"label\": \"海南藏族自治州\",\n        \"children\": [\n          {\n            \"value\": \"632521\",\n            \"label\": \"共和县\"\n          },\n          {\n            \"value\": \"632522\",\n            \"label\": \"同德县\"\n          },\n          {\n            \"value\": \"632523\",\n            \"label\": \"贵德县\"\n          },\n          {\n            \"value\": \"632524\",\n            \"label\": \"兴海县\"\n          },\n          {\n            \"value\": \"632525\",\n            \"label\": \"贵南县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"632600\",\n        \"label\": \"果洛藏族自治州\",\n        \"children\": [\n          {\n            \"value\": \"632621\",\n            \"label\": \"玛沁县\"\n          },\n          {\n            \"value\": \"632622\",\n            \"label\": \"班玛县\"\n          },\n          {\n            \"value\": \"632623\",\n            \"label\": \"甘德县\"\n          },\n          {\n            \"value\": \"632624\",\n            \"label\": \"达日县\"\n          },\n          {\n            \"value\": \"632625\",\n            \"label\": \"久治县\"\n          },\n          {\n            \"value\": \"632626\",\n            \"label\": \"玛多县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"632700\",\n        \"label\": \"玉树藏族自治州\",\n        \"children\": [\n          {\n            \"value\": \"632701\",\n            \"label\": \"玉树市\"\n          },\n          {\n            \"value\": \"632722\",\n            \"label\": \"杂多县\"\n          },\n          {\n            \"value\": \"632723\",\n            \"label\": \"称多县\"\n          },\n          {\n            \"value\": \"632724\",\n            \"label\": \"治多县\"\n          },\n          {\n            \"value\": \"632725\",\n            \"label\": \"囊谦县\"\n          },\n          {\n            \"value\": \"632726\",\n            \"label\": \"曲麻莱县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"632800\",\n        \"label\": \"海西蒙古族藏族自治州\",\n        \"children\": [\n          {\n            \"value\": \"632801\",\n            \"label\": \"格尔木市\"\n          },\n          {\n            \"value\": \"632802\",\n            \"label\": \"德令哈市\"\n          },\n          {\n            \"value\": \"632803\",\n            \"label\": \"茫崖市\"\n          },\n          {\n            \"value\": \"632821\",\n            \"label\": \"乌兰县\"\n          },\n          {\n            \"value\": \"632822\",\n            \"label\": \"都兰县\"\n          },\n          {\n            \"value\": \"632823\",\n            \"label\": \"天峻县\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"640000\",\n    \"label\": \"宁夏回族自治区\",\n    \"children\": [\n      {\n        \"value\": \"640100\",\n        \"label\": \"银川市\",\n        \"children\": [\n          {\n            \"value\": \"640104\",\n            \"label\": \"兴庆区\"\n          },\n          {\n            \"value\": \"640105\",\n            \"label\": \"西夏区\"\n          },\n          {\n            \"value\": \"640106\",\n            \"label\": \"金凤区\"\n          },\n          {\n            \"value\": \"640121\",\n            \"label\": \"永宁县\"\n          },\n          {\n            \"value\": \"640122\",\n            \"label\": \"贺兰县\"\n          },\n          {\n            \"value\": \"640181\",\n            \"label\": \"灵武市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"640200\",\n        \"label\": \"石嘴山市\",\n        \"children\": [\n          {\n            \"value\": \"640202\",\n            \"label\": \"大武口区\"\n          },\n          {\n            \"value\": \"640205\",\n            \"label\": \"惠农区\"\n          },\n          {\n            \"value\": \"640221\",\n            \"label\": \"平罗县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"640300\",\n        \"label\": \"吴忠市\",\n        \"children\": [\n          {\n            \"value\": \"640302\",\n            \"label\": \"利通区\"\n          },\n          {\n            \"value\": \"640303\",\n            \"label\": \"红寺堡区\"\n          },\n          {\n            \"value\": \"640323\",\n            \"label\": \"盐池县\"\n          },\n          {\n            \"value\": \"640324\",\n            \"label\": \"同心县\"\n          },\n          {\n            \"value\": \"640381\",\n            \"label\": \"青铜峡市\"\n          }\n        ]\n      },\n      {\n        \"value\": \"640400\",\n        \"label\": \"固原市\",\n        \"children\": [\n          {\n            \"value\": \"640402\",\n            \"label\": \"原州区\"\n          },\n          {\n            \"value\": \"640422\",\n            \"label\": \"西吉县\"\n          },\n          {\n            \"value\": \"640423\",\n            \"label\": \"隆德县\"\n          },\n          {\n            \"value\": \"640424\",\n            \"label\": \"泾源县\"\n          },\n          {\n            \"value\": \"640425\",\n            \"label\": \"彭阳县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"640500\",\n        \"label\": \"中卫市\",\n        \"children\": [\n          {\n            \"value\": \"640502\",\n            \"label\": \"沙坡头区\"\n          },\n          {\n            \"value\": \"640521\",\n            \"label\": \"中宁县\"\n          },\n          {\n            \"value\": \"640522\",\n            \"label\": \"海原县\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"650000\",\n    \"label\": \"新疆维吾尔自治区\",\n    \"children\": [\n      {\n        \"value\": \"650100\",\n        \"label\": \"乌鲁木齐市\",\n        \"children\": [\n          {\n            \"value\": \"650102\",\n            \"label\": \"天山区\"\n          },\n          {\n            \"value\": \"650103\",\n            \"label\": \"沙依巴克区\"\n          },\n          {\n            \"value\": \"650104\",\n            \"label\": \"新市区\"\n          },\n          {\n            \"value\": \"650105\",\n            \"label\": \"水磨沟区\"\n          },\n          {\n            \"value\": \"650106\",\n            \"label\": \"头屯河区\"\n          },\n          {\n            \"value\": \"650107\",\n            \"label\": \"达坂城区\"\n          },\n          {\n            \"value\": \"650109\",\n            \"label\": \"米东区\"\n          },\n          {\n            \"value\": \"650121\",\n            \"label\": \"乌鲁木齐县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"650200\",\n        \"label\": \"克拉玛依市\",\n        \"children\": [\n          {\n            \"value\": \"650202\",\n            \"label\": \"独山子区\"\n          },\n          {\n            \"value\": \"650203\",\n            \"label\": \"克拉玛依区\"\n          },\n          {\n            \"value\": \"650204\",\n            \"label\": \"白碱滩区\"\n          },\n          {\n            \"value\": \"650205\",\n            \"label\": \"乌尔禾区\"\n          }\n        ]\n      },\n      {\n        \"value\": \"650400\",\n        \"label\": \"吐鲁番市\",\n        \"children\": [\n          {\n            \"value\": \"650402\",\n            \"label\": \"高昌区\"\n          },\n          {\n            \"value\": \"650421\",\n            \"label\": \"鄯善县\"\n          },\n          {\n            \"value\": \"650422\",\n            \"label\": \"托克逊县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"650500\",\n        \"label\": \"哈密市\",\n        \"children\": [\n          {\n            \"value\": \"650502\",\n            \"label\": \"伊州区\"\n          },\n          {\n            \"value\": \"650521\",\n            \"label\": \"巴里坤哈萨克自治县\"\n          },\n          {\n            \"value\": \"650522\",\n            \"label\": \"伊吾县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"652300\",\n        \"label\": \"昌吉回族自治州\",\n        \"children\": [\n          {\n            \"value\": \"652301\",\n            \"label\": \"昌吉市\"\n          },\n          {\n            \"value\": \"652302\",\n            \"label\": \"阜康市\"\n          },\n          {\n            \"value\": \"652323\",\n            \"label\": \"呼图壁县\"\n          },\n          {\n            \"value\": \"652324\",\n            \"label\": \"玛纳斯县\"\n          },\n          {\n            \"value\": \"652325\",\n            \"label\": \"奇台县\"\n          },\n          {\n            \"value\": \"652327\",\n            \"label\": \"吉木萨尔县\"\n          },\n          {\n            \"value\": \"652328\",\n            \"label\": \"木垒哈萨克自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"652700\",\n        \"label\": \"博尔塔拉蒙古自治州\",\n        \"children\": [\n          {\n            \"value\": \"652701\",\n            \"label\": \"博乐市\"\n          },\n          {\n            \"value\": \"652702\",\n            \"label\": \"阿拉山口市\"\n          },\n          {\n            \"value\": \"652722\",\n            \"label\": \"精河县\"\n          },\n          {\n            \"value\": \"652723\",\n            \"label\": \"温泉县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"652800\",\n        \"label\": \"巴音郭楞蒙古自治州\",\n        \"children\": [\n          {\n            \"value\": \"652801\",\n            \"label\": \"库尔勒市\"\n          },\n          {\n            \"value\": \"652822\",\n            \"label\": \"轮台县\"\n          },\n          {\n            \"value\": \"652823\",\n            \"label\": \"尉犁县\"\n          },\n          {\n            \"value\": \"652824\",\n            \"label\": \"若羌县\"\n          },\n          {\n            \"value\": \"652825\",\n            \"label\": \"且末县\"\n          },\n          {\n            \"value\": \"652826\",\n            \"label\": \"焉耆回族自治县\"\n          },\n          {\n            \"value\": \"652827\",\n            \"label\": \"和静县\"\n          },\n          {\n            \"value\": \"652828\",\n            \"label\": \"和硕县\"\n          },\n          {\n            \"value\": \"652829\",\n            \"label\": \"博湖县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"652900\",\n        \"label\": \"阿克苏地区\",\n        \"children\": [\n          {\n            \"value\": \"652901\",\n            \"label\": \"阿克苏市\"\n          },\n          {\n            \"value\": \"652922\",\n            \"label\": \"温宿县\"\n          },\n          {\n            \"value\": \"652923\",\n            \"label\": \"库车县\"\n          },\n          {\n            \"value\": \"652924\",\n            \"label\": \"沙雅县\"\n          },\n          {\n            \"value\": \"652925\",\n            \"label\": \"新和县\"\n          },\n          {\n            \"value\": \"652926\",\n            \"label\": \"拜城县\"\n          },\n          {\n            \"value\": \"652927\",\n            \"label\": \"乌什县\"\n          },\n          {\n            \"value\": \"652928\",\n            \"label\": \"阿瓦提县\"\n          },\n          {\n            \"value\": \"652929\",\n            \"label\": \"柯坪县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"653000\",\n        \"label\": \"克孜勒苏柯尔克孜自治州\",\n        \"children\": [\n          {\n            \"value\": \"653001\",\n            \"label\": \"阿图什市\"\n          },\n          {\n            \"value\": \"653022\",\n            \"label\": \"阿克陶县\"\n          },\n          {\n            \"value\": \"653023\",\n            \"label\": \"阿合奇县\"\n          },\n          {\n            \"value\": \"653024\",\n            \"label\": \"乌恰县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"653100\",\n        \"label\": \"喀什地区\",\n        \"children\": [\n          {\n            \"value\": \"653101\",\n            \"label\": \"喀什市\"\n          },\n          {\n            \"value\": \"653121\",\n            \"label\": \"疏附县\"\n          },\n          {\n            \"value\": \"653122\",\n            \"label\": \"疏勒县\"\n          },\n          {\n            \"value\": \"653123\",\n            \"label\": \"英吉沙县\"\n          },\n          {\n            \"value\": \"653124\",\n            \"label\": \"泽普县\"\n          },\n          {\n            \"value\": \"653125\",\n            \"label\": \"莎车县\"\n          },\n          {\n            \"value\": \"653126\",\n            \"label\": \"叶城县\"\n          },\n          {\n            \"value\": \"653127\",\n            \"label\": \"麦盖提县\"\n          },\n          {\n            \"value\": \"653128\",\n            \"label\": \"岳普湖县\"\n          },\n          {\n            \"value\": \"653129\",\n            \"label\": \"伽师县\"\n          },\n          {\n            \"value\": \"653130\",\n            \"label\": \"巴楚县\"\n          },\n          {\n            \"value\": \"653131\",\n            \"label\": \"塔什库尔干塔吉克自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"653200\",\n        \"label\": \"和田地区\",\n        \"children\": [\n          {\n            \"value\": \"653201\",\n            \"label\": \"和田市\"\n          },\n          {\n            \"value\": \"653221\",\n            \"label\": \"和田县\"\n          },\n          {\n            \"value\": \"653222\",\n            \"label\": \"墨玉县\"\n          },\n          {\n            \"value\": \"653223\",\n            \"label\": \"皮山县\"\n          },\n          {\n            \"value\": \"653224\",\n            \"label\": \"洛浦县\"\n          },\n          {\n            \"value\": \"653225\",\n            \"label\": \"策勒县\"\n          },\n          {\n            \"value\": \"653226\",\n            \"label\": \"于田县\"\n          },\n          {\n            \"value\": \"653227\",\n            \"label\": \"民丰县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"654000\",\n        \"label\": \"伊犁哈萨克自治州\",\n        \"children\": [\n          {\n            \"value\": \"654002\",\n            \"label\": \"伊宁市\"\n          },\n          {\n            \"value\": \"654003\",\n            \"label\": \"奎屯市\"\n          },\n          {\n            \"value\": \"654004\",\n            \"label\": \"霍尔果斯市\"\n          },\n          {\n            \"value\": \"654021\",\n            \"label\": \"伊宁县\"\n          },\n          {\n            \"value\": \"654022\",\n            \"label\": \"察布查尔锡伯自治县\"\n          },\n          {\n            \"value\": \"654023\",\n            \"label\": \"霍城县\"\n          },\n          {\n            \"value\": \"654024\",\n            \"label\": \"巩留县\"\n          },\n          {\n            \"value\": \"654025\",\n            \"label\": \"新源县\"\n          },\n          {\n            \"value\": \"654026\",\n            \"label\": \"昭苏县\"\n          },\n          {\n            \"value\": \"654027\",\n            \"label\": \"特克斯县\"\n          },\n          {\n            \"value\": \"654028\",\n            \"label\": \"尼勒克县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"654200\",\n        \"label\": \"塔城地区\",\n        \"children\": [\n          {\n            \"value\": \"654201\",\n            \"label\": \"塔城市\"\n          },\n          {\n            \"value\": \"654202\",\n            \"label\": \"乌苏市\"\n          },\n          {\n            \"value\": \"654221\",\n            \"label\": \"额敏县\"\n          },\n          {\n            \"value\": \"654223\",\n            \"label\": \"沙湾县\"\n          },\n          {\n            \"value\": \"654224\",\n            \"label\": \"托里县\"\n          },\n          {\n            \"value\": \"654225\",\n            \"label\": \"裕民县\"\n          },\n          {\n            \"value\": \"654226\",\n            \"label\": \"和布克赛尔蒙古自治县\"\n          }\n        ]\n      },\n      {\n        \"value\": \"654300\",\n        \"label\": \"阿勒泰地区\",\n        \"children\": [\n          {\n            \"value\": \"654301\",\n            \"label\": \"阿勒泰市\"\n          },\n          {\n            \"value\": \"654321\",\n            \"label\": \"布尔津县\"\n          },\n          {\n            \"value\": \"654322\",\n            \"label\": \"富蕴县\"\n          },\n          {\n            \"value\": \"654323\",\n            \"label\": \"福海县\"\n          },\n          {\n            \"value\": \"654324\",\n            \"label\": \"哈巴河县\"\n          },\n          {\n            \"value\": \"654325\",\n            \"label\": \"青河县\"\n          },\n          {\n            \"value\": \"654326\",\n            \"label\": \"吉木乃县\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"710000\",\n    \"label\": \"台湾省\",\n    \"children\": [\n      {\n        \"value\": \"710000\",\n        \"label\": \"台湾省\",\n        \"children\": [\n          {\n            \"value\": \"710000\",\n            \"label\": \"台湾省\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"810000\",\n    \"label\": \"香港特别行政区\",\n    \"children\": [\n      {\n        \"value\": \"810000\",\n        \"label\": \"香港特别行政区\",\n        \"children\": [\n          {\n            \"value\": \"810000\",\n            \"label\": \"香港特别行政区\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"value\": \"820000\",\n    \"label\": \"澳门特别行政区\",\n    \"children\": [\n      {\n        \"value\": \"820000\",\n        \"label\": \"澳门特别行政区\",\n        \"children\": [\n          {\n            \"value\": \"820000\",\n            \"label\": \"澳门特别行政区\"\n          }\n        ]\n      }\n    ]\n  }\n]"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/area_mini.json",
    "content": "[{\"value\":\"110000\",\"label\":\"北京市\",\"children\":[{\"value\":\"110100\",\"label\":\"北京市\",\"children\":[{\"value\":\"110101\",\"label\":\"东城区\"},{\"value\":\"110102\",\"label\":\"西城区\"},{\"value\":\"110105\",\"label\":\"朝阳区\"},{\"value\":\"110106\",\"label\":\"丰台区\"},{\"value\":\"110107\",\"label\":\"石景山区\"},{\"value\":\"110108\",\"label\":\"海淀区\"},{\"value\":\"110109\",\"label\":\"门头沟区\"},{\"value\":\"110111\",\"label\":\"房山区\"},{\"value\":\"110112\",\"label\":\"通州区\"},{\"value\":\"110113\",\"label\":\"顺义区\"},{\"value\":\"110114\",\"label\":\"昌平区\"},{\"value\":\"110115\",\"label\":\"大兴区\"},{\"value\":\"110116\",\"label\":\"怀柔区\"},{\"value\":\"110117\",\"label\":\"平谷区\"},{\"value\":\"110118\",\"label\":\"密云区\"},{\"value\":\"110119\",\"label\":\"延庆区\"}]}]},{\"value\":\"120000\",\"label\":\"天津市\",\"children\":[{\"value\":\"120100\",\"label\":\"天津市\",\"children\":[{\"value\":\"120101\",\"label\":\"和平区\"},{\"value\":\"120102\",\"label\":\"河东区\"},{\"value\":\"120103\",\"label\":\"河西区\"},{\"value\":\"120104\",\"label\":\"南开区\"},{\"value\":\"120105\",\"label\":\"河北区\"},{\"value\":\"120106\",\"label\":\"红桥区\"},{\"value\":\"120110\",\"label\":\"东丽区\"},{\"value\":\"120111\",\"label\":\"西青区\"},{\"value\":\"120112\",\"label\":\"津南区\"},{\"value\":\"120113\",\"label\":\"北辰区\"},{\"value\":\"120114\",\"label\":\"武清区\"},{\"value\":\"120115\",\"label\":\"宝坻区\"},{\"value\":\"120116\",\"label\":\"滨海新区\"},{\"value\":\"120117\",\"label\":\"宁河区\"},{\"value\":\"120118\",\"label\":\"静海区\"},{\"value\":\"120119\",\"label\":\"蓟州区\"}]}]},{\"value\":\"130000\",\"label\":\"河北省\",\"children\":[{\"value\":\"130100\",\"label\":\"石家庄市\",\"children\":[{\"value\":\"130102\",\"label\":\"长安区\"},{\"value\":\"130104\",\"label\":\"桥西区\"},{\"value\":\"130105\",\"label\":\"新华区\"},{\"value\":\"130107\",\"label\":\"井陉矿区\"},{\"value\":\"130108\",\"label\":\"裕华区\"},{\"value\":\"130109\",\"label\":\"藁城区\"},{\"value\":\"130110\",\"label\":\"鹿泉区\"},{\"value\":\"130111\",\"label\":\"栾城区\"},{\"value\":\"130121\",\"label\":\"井陉县\"},{\"value\":\"130123\",\"label\":\"正定县\"},{\"value\":\"130125\",\"label\":\"行唐县\"},{\"value\":\"130126\",\"label\":\"灵寿县\"},{\"value\":\"130127\",\"label\":\"高邑县\"},{\"value\":\"130128\",\"label\":\"深泽县\"},{\"value\":\"130129\",\"label\":\"赞皇县\"},{\"value\":\"130130\",\"label\":\"无极县\"},{\"value\":\"130131\",\"label\":\"平山县\"},{\"value\":\"130132\",\"label\":\"元氏县\"},{\"value\":\"130133\",\"label\":\"赵县\"},{\"value\":\"130181\",\"label\":\"辛集市\"},{\"value\":\"130183\",\"label\":\"晋州市\"},{\"value\":\"130184\",\"label\":\"新乐市\"}]},{\"value\":\"130200\",\"label\":\"唐山市\",\"children\":[{\"value\":\"130202\",\"label\":\"路南区\"},{\"value\":\"130203\",\"label\":\"路北区\"},{\"value\":\"130204\",\"label\":\"古冶区\"},{\"value\":\"130205\",\"label\":\"开平区\"},{\"value\":\"130207\",\"label\":\"丰南区\"},{\"value\":\"130208\",\"label\":\"丰润区\"},{\"value\":\"130209\",\"label\":\"曹妃甸区\"},{\"value\":\"130223\",\"label\":\"滦县\"},{\"value\":\"130224\",\"label\":\"滦南县\"},{\"value\":\"130225\",\"label\":\"乐亭县\"},{\"value\":\"130227\",\"label\":\"迁西县\"},{\"value\":\"130229\",\"label\":\"玉田县\"},{\"value\":\"130281\",\"label\":\"遵化市\"},{\"value\":\"130283\",\"label\":\"迁安市\"}]},{\"value\":\"130300\",\"label\":\"秦皇岛市\",\"children\":[{\"value\":\"130302\",\"label\":\"海港区\"},{\"value\":\"130303\",\"label\":\"山海关区\"},{\"value\":\"130304\",\"label\":\"北戴河区\"},{\"value\":\"130306\",\"label\":\"抚宁区\"},{\"value\":\"130321\",\"label\":\"青龙满族自治县\"},{\"value\":\"130322\",\"label\":\"昌黎县\"},{\"value\":\"130324\",\"label\":\"卢龙县\"}]},{\"value\":\"130400\",\"label\":\"邯郸市\",\"children\":[{\"value\":\"130402\",\"label\":\"邯山区\"},{\"value\":\"130403\",\"label\":\"丛台区\"},{\"value\":\"130404\",\"label\":\"复兴区\"},{\"value\":\"130406\",\"label\":\"峰峰矿区\"},{\"value\":\"130407\",\"label\":\"肥乡区\"},{\"value\":\"130408\",\"label\":\"永年区\"},{\"value\":\"130423\",\"label\":\"临漳县\"},{\"value\":\"130424\",\"label\":\"成安县\"},{\"value\":\"130425\",\"label\":\"大名县\"},{\"value\":\"130426\",\"label\":\"涉县\"},{\"value\":\"130427\",\"label\":\"磁县\"},{\"value\":\"130430\",\"label\":\"邱县\"},{\"value\":\"130431\",\"label\":\"鸡泽县\"},{\"value\":\"130432\",\"label\":\"广平县\"},{\"value\":\"130433\",\"label\":\"馆陶县\"},{\"value\":\"130434\",\"label\":\"魏县\"},{\"value\":\"130435\",\"label\":\"曲周县\"},{\"value\":\"130481\",\"label\":\"武安市\"}]},{\"value\":\"130500\",\"label\":\"邢台市\",\"children\":[{\"value\":\"130502\",\"label\":\"桥东区\"},{\"value\":\"130503\",\"label\":\"桥西区\"},{\"value\":\"130521\",\"label\":\"邢台县\"},{\"value\":\"130522\",\"label\":\"临城县\"},{\"value\":\"130523\",\"label\":\"内丘县\"},{\"value\":\"130524\",\"label\":\"柏乡县\"},{\"value\":\"130525\",\"label\":\"隆尧县\"},{\"value\":\"130526\",\"label\":\"任县\"},{\"value\":\"130527\",\"label\":\"南和县\"},{\"value\":\"130528\",\"label\":\"宁晋县\"},{\"value\":\"130529\",\"label\":\"巨鹿县\"},{\"value\":\"130530\",\"label\":\"新河县\"},{\"value\":\"130531\",\"label\":\"广宗县\"},{\"value\":\"130532\",\"label\":\"平乡县\"},{\"value\":\"130533\",\"label\":\"威县\"},{\"value\":\"130534\",\"label\":\"清河县\"},{\"value\":\"130535\",\"label\":\"临西县\"},{\"value\":\"130581\",\"label\":\"南宫市\"},{\"value\":\"130582\",\"label\":\"沙河市\"}]},{\"value\":\"130600\",\"label\":\"保定市\",\"children\":[{\"value\":\"130602\",\"label\":\"竞秀区\"},{\"value\":\"130606\",\"label\":\"莲池区\"},{\"value\":\"130607\",\"label\":\"满城区\"},{\"value\":\"130608\",\"label\":\"清苑区\"},{\"value\":\"130609\",\"label\":\"徐水区\"},{\"value\":\"130623\",\"label\":\"涞水县\"},{\"value\":\"130624\",\"label\":\"阜平县\"},{\"value\":\"130626\",\"label\":\"定兴县\"},{\"value\":\"130627\",\"label\":\"唐县\"},{\"value\":\"130628\",\"label\":\"高阳县\"},{\"value\":\"130629\",\"label\":\"容城县\"},{\"value\":\"130630\",\"label\":\"涞源县\"},{\"value\":\"130631\",\"label\":\"望都县\"},{\"value\":\"130632\",\"label\":\"安新县\"},{\"value\":\"130633\",\"label\":\"易县\"},{\"value\":\"130634\",\"label\":\"曲阳县\"},{\"value\":\"130635\",\"label\":\"蠡县\"},{\"value\":\"130636\",\"label\":\"顺平县\"},{\"value\":\"130637\",\"label\":\"博野县\"},{\"value\":\"130638\",\"label\":\"雄县\"},{\"value\":\"130681\",\"label\":\"涿州市\"},{\"value\":\"130682\",\"label\":\"定州市\"},{\"value\":\"130683\",\"label\":\"安国市\"},{\"value\":\"130684\",\"label\":\"高碑店市\"}]},{\"value\":\"130700\",\"label\":\"张家口市\",\"children\":[{\"value\":\"130702\",\"label\":\"桥东区\"},{\"value\":\"130703\",\"label\":\"桥西区\"},{\"value\":\"130705\",\"label\":\"宣化区\"},{\"value\":\"130706\",\"label\":\"下花园区\"},{\"value\":\"130708\",\"label\":\"万全区\"},{\"value\":\"130709\",\"label\":\"崇礼区\"},{\"value\":\"130722\",\"label\":\"张北县\"},{\"value\":\"130723\",\"label\":\"康保县\"},{\"value\":\"130724\",\"label\":\"沽源县\"},{\"value\":\"130725\",\"label\":\"尚义县\"},{\"value\":\"130726\",\"label\":\"蔚县\"},{\"value\":\"130727\",\"label\":\"阳原县\"},{\"value\":\"130728\",\"label\":\"怀安县\"},{\"value\":\"130730\",\"label\":\"怀来县\"},{\"value\":\"130731\",\"label\":\"涿鹿县\"},{\"value\":\"130732\",\"label\":\"赤城县\"}]},{\"value\":\"130800\",\"label\":\"承德市\",\"children\":[{\"value\":\"130802\",\"label\":\"双桥区\"},{\"value\":\"130803\",\"label\":\"双滦区\"},{\"value\":\"130804\",\"label\":\"鹰手营子矿区\"},{\"value\":\"130821\",\"label\":\"承德县\"},{\"value\":\"130822\",\"label\":\"兴隆县\"},{\"value\":\"130824\",\"label\":\"滦平县\"},{\"value\":\"130825\",\"label\":\"隆化县\"},{\"value\":\"130826\",\"label\":\"丰宁满族自治县\"},{\"value\":\"130827\",\"label\":\"宽城满族自治县\"},{\"value\":\"130828\",\"label\":\"围场满族蒙古族自治县\"},{\"value\":\"130881\",\"label\":\"平泉市\"}]},{\"value\":\"130900\",\"label\":\"沧州市\",\"children\":[{\"value\":\"130902\",\"label\":\"新华区\"},{\"value\":\"130903\",\"label\":\"运河区\"},{\"value\":\"130921\",\"label\":\"沧县\"},{\"value\":\"130922\",\"label\":\"青县\"},{\"value\":\"130923\",\"label\":\"东光县\"},{\"value\":\"130924\",\"label\":\"海兴县\"},{\"value\":\"130925\",\"label\":\"盐山县\"},{\"value\":\"130926\",\"label\":\"肃宁县\"},{\"value\":\"130927\",\"label\":\"南皮县\"},{\"value\":\"130928\",\"label\":\"吴桥县\"},{\"value\":\"130929\",\"label\":\"献县\"},{\"value\":\"130930\",\"label\":\"孟村回族自治县\"},{\"value\":\"130981\",\"label\":\"泊头市\"},{\"value\":\"130982\",\"label\":\"任丘市\"},{\"value\":\"130983\",\"label\":\"黄骅市\"},{\"value\":\"130984\",\"label\":\"河间市\"}]},{\"value\":\"131000\",\"label\":\"廊坊市\",\"children\":[{\"value\":\"131002\",\"label\":\"安次区\"},{\"value\":\"131003\",\"label\":\"广阳区\"},{\"value\":\"131022\",\"label\":\"固安县\"},{\"value\":\"131023\",\"label\":\"永清县\"},{\"value\":\"131024\",\"label\":\"香河县\"},{\"value\":\"131025\",\"label\":\"大城县\"},{\"value\":\"131026\",\"label\":\"文安县\"},{\"value\":\"131028\",\"label\":\"大厂回族自治县\"},{\"value\":\"131081\",\"label\":\"霸州市\"},{\"value\":\"131082\",\"label\":\"三河市\"}]},{\"value\":\"131100\",\"label\":\"衡水市\",\"children\":[{\"value\":\"131102\",\"label\":\"桃城区\"},{\"value\":\"131103\",\"label\":\"冀州区\"},{\"value\":\"131121\",\"label\":\"枣强县\"},{\"value\":\"131122\",\"label\":\"武邑县\"},{\"value\":\"131123\",\"label\":\"武强县\"},{\"value\":\"131124\",\"label\":\"饶阳县\"},{\"value\":\"131125\",\"label\":\"安平县\"},{\"value\":\"131126\",\"label\":\"故城县\"},{\"value\":\"131127\",\"label\":\"景县\"},{\"value\":\"131128\",\"label\":\"阜城县\"},{\"value\":\"131182\",\"label\":\"深州市\"}]}]},{\"value\":\"140000\",\"label\":\"山西省\",\"children\":[{\"value\":\"140100\",\"label\":\"太原市\",\"children\":[{\"value\":\"140105\",\"label\":\"小店区\"},{\"value\":\"140106\",\"label\":\"迎泽区\"},{\"value\":\"140107\",\"label\":\"杏花岭区\"},{\"value\":\"140108\",\"label\":\"尖草坪区\"},{\"value\":\"140109\",\"label\":\"万柏林区\"},{\"value\":\"140110\",\"label\":\"晋源区\"},{\"value\":\"140121\",\"label\":\"清徐县\"},{\"value\":\"140122\",\"label\":\"阳曲县\"},{\"value\":\"140123\",\"label\":\"娄烦县\"},{\"value\":\"140181\",\"label\":\"古交市\"}]},{\"value\":\"140200\",\"label\":\"大同市\",\"children\":[{\"value\":\"140212\",\"label\":\"新荣区\"},{\"value\":\"140213\",\"label\":\"平城区\"},{\"value\":\"140214\",\"label\":\"云冈区\"},{\"value\":\"140215\",\"label\":\"云州区\"},{\"value\":\"140221\",\"label\":\"阳高县\"},{\"value\":\"140222\",\"label\":\"天镇县\"},{\"value\":\"140223\",\"label\":\"广灵县\"},{\"value\":\"140224\",\"label\":\"灵丘县\"},{\"value\":\"140225\",\"label\":\"浑源县\"},{\"value\":\"140226\",\"label\":\"左云县\"}]},{\"value\":\"140300\",\"label\":\"阳泉市\",\"children\":[{\"value\":\"140302\",\"label\":\"城区\"},{\"value\":\"140303\",\"label\":\"矿区\"},{\"value\":\"140311\",\"label\":\"郊区\"},{\"value\":\"140321\",\"label\":\"平定县\"},{\"value\":\"140322\",\"label\":\"盂县\"}]},{\"value\":\"140400\",\"label\":\"长治市\",\"children\":[{\"value\":\"140402\",\"label\":\"城区\"},{\"value\":\"140411\",\"label\":\"郊区\"},{\"value\":\"140421\",\"label\":\"长治县\"},{\"value\":\"140423\",\"label\":\"襄垣县\"},{\"value\":\"140424\",\"label\":\"屯留县\"},{\"value\":\"140425\",\"label\":\"平顺县\"},{\"value\":\"140426\",\"label\":\"黎城县\"},{\"value\":\"140427\",\"label\":\"壶关县\"},{\"value\":\"140428\",\"label\":\"长子县\"},{\"value\":\"140429\",\"label\":\"武乡县\"},{\"value\":\"140430\",\"label\":\"沁县\"},{\"value\":\"140431\",\"label\":\"沁源县\"},{\"value\":\"140481\",\"label\":\"潞城市\"}]},{\"value\":\"140500\",\"label\":\"晋城市\",\"children\":[{\"value\":\"140502\",\"label\":\"城区\"},{\"value\":\"140521\",\"label\":\"沁水县\"},{\"value\":\"140522\",\"label\":\"阳城县\"},{\"value\":\"140524\",\"label\":\"陵川县\"},{\"value\":\"140525\",\"label\":\"泽州县\"},{\"value\":\"140581\",\"label\":\"高平市\"}]},{\"value\":\"140600\",\"label\":\"朔州市\",\"children\":[{\"value\":\"140602\",\"label\":\"朔城区\"},{\"value\":\"140603\",\"label\":\"平鲁区\"},{\"value\":\"140621\",\"label\":\"山阴县\"},{\"value\":\"140622\",\"label\":\"应县\"},{\"value\":\"140623\",\"label\":\"右玉县\"},{\"value\":\"140681\",\"label\":\"怀仁市\"}]},{\"value\":\"140700\",\"label\":\"晋中市\",\"children\":[{\"value\":\"140702\",\"label\":\"榆次区\"},{\"value\":\"140721\",\"label\":\"榆社县\"},{\"value\":\"140722\",\"label\":\"左权县\"},{\"value\":\"140723\",\"label\":\"和顺县\"},{\"value\":\"140724\",\"label\":\"昔阳县\"},{\"value\":\"140725\",\"label\":\"寿阳县\"},{\"value\":\"140726\",\"label\":\"太谷县\"},{\"value\":\"140727\",\"label\":\"祁县\"},{\"value\":\"140728\",\"label\":\"平遥县\"},{\"value\":\"140729\",\"label\":\"灵石县\"},{\"value\":\"140781\",\"label\":\"介休市\"}]},{\"value\":\"140800\",\"label\":\"运城市\",\"children\":[{\"value\":\"140802\",\"label\":\"盐湖区\"},{\"value\":\"140821\",\"label\":\"临猗县\"},{\"value\":\"140822\",\"label\":\"万荣县\"},{\"value\":\"140823\",\"label\":\"闻喜县\"},{\"value\":\"140824\",\"label\":\"稷山县\"},{\"value\":\"140825\",\"label\":\"新绛县\"},{\"value\":\"140826\",\"label\":\"绛县\"},{\"value\":\"140827\",\"label\":\"垣曲县\"},{\"value\":\"140828\",\"label\":\"夏县\"},{\"value\":\"140829\",\"label\":\"平陆县\"},{\"value\":\"140830\",\"label\":\"芮城县\"},{\"value\":\"140881\",\"label\":\"永济市\"},{\"value\":\"140882\",\"label\":\"河津市\"}]},{\"value\":\"140900\",\"label\":\"忻州市\",\"children\":[{\"value\":\"140902\",\"label\":\"忻府区\"},{\"value\":\"140921\",\"label\":\"定襄县\"},{\"value\":\"140922\",\"label\":\"五台县\"},{\"value\":\"140923\",\"label\":\"代县\"},{\"value\":\"140924\",\"label\":\"繁峙县\"},{\"value\":\"140925\",\"label\":\"宁武县\"},{\"value\":\"140926\",\"label\":\"静乐县\"},{\"value\":\"140927\",\"label\":\"神池县\"},{\"value\":\"140928\",\"label\":\"五寨县\"},{\"value\":\"140929\",\"label\":\"岢岚县\"},{\"value\":\"140930\",\"label\":\"河曲县\"},{\"value\":\"140931\",\"label\":\"保德县\"},{\"value\":\"140932\",\"label\":\"偏关县\"},{\"value\":\"140981\",\"label\":\"原平市\"}]},{\"value\":\"141000\",\"label\":\"临汾市\",\"children\":[{\"value\":\"141002\",\"label\":\"尧都区\"},{\"value\":\"141021\",\"label\":\"曲沃县\"},{\"value\":\"141022\",\"label\":\"翼城县\"},{\"value\":\"141023\",\"label\":\"襄汾县\"},{\"value\":\"141024\",\"label\":\"洪洞县\"},{\"value\":\"141025\",\"label\":\"古县\"},{\"value\":\"141026\",\"label\":\"安泽县\"},{\"value\":\"141027\",\"label\":\"浮山县\"},{\"value\":\"141028\",\"label\":\"吉县\"},{\"value\":\"141029\",\"label\":\"乡宁县\"},{\"value\":\"141030\",\"label\":\"大宁县\"},{\"value\":\"141031\",\"label\":\"隰县\"},{\"value\":\"141032\",\"label\":\"永和县\"},{\"value\":\"141033\",\"label\":\"蒲县\"},{\"value\":\"141034\",\"label\":\"汾西县\"},{\"value\":\"141081\",\"label\":\"侯马市\"},{\"value\":\"141082\",\"label\":\"霍州市\"}]},{\"value\":\"141100\",\"label\":\"吕梁市\",\"children\":[{\"value\":\"141102\",\"label\":\"离石区\"},{\"value\":\"141121\",\"label\":\"文水县\"},{\"value\":\"141122\",\"label\":\"交城县\"},{\"value\":\"141123\",\"label\":\"兴县\"},{\"value\":\"141124\",\"label\":\"临县\"},{\"value\":\"141125\",\"label\":\"柳林县\"},{\"value\":\"141126\",\"label\":\"石楼县\"},{\"value\":\"141127\",\"label\":\"岚县\"},{\"value\":\"141128\",\"label\":\"方山县\"},{\"value\":\"141129\",\"label\":\"中阳县\"},{\"value\":\"141130\",\"label\":\"交口县\"},{\"value\":\"141181\",\"label\":\"孝义市\"},{\"value\":\"141182\",\"label\":\"汾阳市\"}]}]},{\"value\":\"150000\",\"label\":\"内蒙古自治区\",\"children\":[{\"value\":\"150100\",\"label\":\"呼和浩特市\",\"children\":[{\"value\":\"150102\",\"label\":\"新城区\"},{\"value\":\"150103\",\"label\":\"回民区\"},{\"value\":\"150104\",\"label\":\"玉泉区\"},{\"value\":\"150105\",\"label\":\"赛罕区\"},{\"value\":\"150121\",\"label\":\"土默特左旗\"},{\"value\":\"150122\",\"label\":\"托克托县\"},{\"value\":\"150123\",\"label\":\"和林格尔县\"},{\"value\":\"150124\",\"label\":\"清水河县\"},{\"value\":\"150125\",\"label\":\"武川县\"}]},{\"value\":\"150200\",\"label\":\"包头市\",\"children\":[{\"value\":\"150202\",\"label\":\"东河区\"},{\"value\":\"150203\",\"label\":\"昆都仑区\"},{\"value\":\"150204\",\"label\":\"青山区\"},{\"value\":\"150205\",\"label\":\"石拐区\"},{\"value\":\"150206\",\"label\":\"白云鄂博矿区\"},{\"value\":\"150207\",\"label\":\"九原区\"},{\"value\":\"150221\",\"label\":\"土默特右旗\"},{\"value\":\"150222\",\"label\":\"固阳县\"},{\"value\":\"150223\",\"label\":\"达尔罕茂明安联合旗\"}]},{\"value\":\"150300\",\"label\":\"乌海市\",\"children\":[{\"value\":\"150302\",\"label\":\"海勃湾区\"},{\"value\":\"150303\",\"label\":\"海南区\"},{\"value\":\"150304\",\"label\":\"乌达区\"}]},{\"value\":\"150400\",\"label\":\"赤峰市\",\"children\":[{\"value\":\"150402\",\"label\":\"红山区\"},{\"value\":\"150403\",\"label\":\"元宝山区\"},{\"value\":\"150404\",\"label\":\"松山区\"},{\"value\":\"150421\",\"label\":\"阿鲁科尔沁旗\"},{\"value\":\"150422\",\"label\":\"巴林左旗\"},{\"value\":\"150423\",\"label\":\"巴林右旗\"},{\"value\":\"150424\",\"label\":\"林西县\"},{\"value\":\"150425\",\"label\":\"克什克腾旗\"},{\"value\":\"150426\",\"label\":\"翁牛特旗\"},{\"value\":\"150428\",\"label\":\"喀喇沁旗\"},{\"value\":\"150429\",\"label\":\"宁城县\"},{\"value\":\"150430\",\"label\":\"敖汉旗\"}]},{\"value\":\"150500\",\"label\":\"通辽市\",\"children\":[{\"value\":\"150502\",\"label\":\"科尔沁区\"},{\"value\":\"150521\",\"label\":\"科尔沁左翼中旗\"},{\"value\":\"150522\",\"label\":\"科尔沁左翼后旗\"},{\"value\":\"150523\",\"label\":\"开鲁县\"},{\"value\":\"150524\",\"label\":\"库伦旗\"},{\"value\":\"150525\",\"label\":\"奈曼旗\"},{\"value\":\"150526\",\"label\":\"扎鲁特旗\"},{\"value\":\"150581\",\"label\":\"霍林郭勒市\"}]},{\"value\":\"150600\",\"label\":\"鄂尔多斯市\",\"children\":[{\"value\":\"150602\",\"label\":\"东胜区\"},{\"value\":\"150603\",\"label\":\"康巴什区\"},{\"value\":\"150621\",\"label\":\"达拉特旗\"},{\"value\":\"150622\",\"label\":\"准格尔旗\"},{\"value\":\"150623\",\"label\":\"鄂托克前旗\"},{\"value\":\"150624\",\"label\":\"鄂托克旗\"},{\"value\":\"150625\",\"label\":\"杭锦旗\"},{\"value\":\"150626\",\"label\":\"乌审旗\"},{\"value\":\"150627\",\"label\":\"伊金霍洛旗\"}]},{\"value\":\"150700\",\"label\":\"呼伦贝尔市\",\"children\":[{\"value\":\"150702\",\"label\":\"海拉尔区\"},{\"value\":\"150703\",\"label\":\"扎赉诺尔区\"},{\"value\":\"150721\",\"label\":\"阿荣旗\"},{\"value\":\"150722\",\"label\":\"莫力达瓦达斡尔族自治旗\"},{\"value\":\"150723\",\"label\":\"鄂伦春自治旗\"},{\"value\":\"150724\",\"label\":\"鄂温克族自治旗\"},{\"value\":\"150725\",\"label\":\"陈巴尔虎旗\"},{\"value\":\"150726\",\"label\":\"新巴尔虎左旗\"},{\"value\":\"150727\",\"label\":\"新巴尔虎右旗\"},{\"value\":\"150781\",\"label\":\"满洲里市\"},{\"value\":\"150782\",\"label\":\"牙克石市\"},{\"value\":\"150783\",\"label\":\"扎兰屯市\"},{\"value\":\"150784\",\"label\":\"额尔古纳市\"},{\"value\":\"150785\",\"label\":\"根河市\"}]},{\"value\":\"150800\",\"label\":\"巴彦淖尔市\",\"children\":[{\"value\":\"150802\",\"label\":\"临河区\"},{\"value\":\"150821\",\"label\":\"五原县\"},{\"value\":\"150822\",\"label\":\"磴口县\"},{\"value\":\"150823\",\"label\":\"乌拉特前旗\"},{\"value\":\"150824\",\"label\":\"乌拉特中旗\"},{\"value\":\"150825\",\"label\":\"乌拉特后旗\"},{\"value\":\"150826\",\"label\":\"杭锦后旗\"}]},{\"value\":\"150900\",\"label\":\"乌兰察布市\",\"children\":[{\"value\":\"150902\",\"label\":\"集宁区\"},{\"value\":\"150921\",\"label\":\"卓资县\"},{\"value\":\"150922\",\"label\":\"化德县\"},{\"value\":\"150923\",\"label\":\"商都县\"},{\"value\":\"150924\",\"label\":\"兴和县\"},{\"value\":\"150925\",\"label\":\"凉城县\"},{\"value\":\"150926\",\"label\":\"察哈尔右翼前旗\"},{\"value\":\"150927\",\"label\":\"察哈尔右翼中旗\"},{\"value\":\"150928\",\"label\":\"察哈尔右翼后旗\"},{\"value\":\"150929\",\"label\":\"四子王旗\"},{\"value\":\"150981\",\"label\":\"丰镇市\"}]},{\"value\":\"152200\",\"label\":\"兴安盟\",\"children\":[{\"value\":\"152201\",\"label\":\"乌兰浩特市\"},{\"value\":\"152202\",\"label\":\"阿尔山市\"},{\"value\":\"152221\",\"label\":\"科尔沁右翼前旗\"},{\"value\":\"152222\",\"label\":\"科尔沁右翼中旗\"},{\"value\":\"152223\",\"label\":\"扎赉特旗\"},{\"value\":\"152224\",\"label\":\"突泉县\"}]},{\"value\":\"152500\",\"label\":\"锡林郭勒盟\",\"children\":[{\"value\":\"152501\",\"label\":\"二连浩特市\"},{\"value\":\"152502\",\"label\":\"锡林浩特市\"},{\"value\":\"152522\",\"label\":\"阿巴嘎旗\"},{\"value\":\"152523\",\"label\":\"苏尼特左旗\"},{\"value\":\"152524\",\"label\":\"苏尼特右旗\"},{\"value\":\"152525\",\"label\":\"东乌珠穆沁旗\"},{\"value\":\"152526\",\"label\":\"西乌珠穆沁旗\"},{\"value\":\"152527\",\"label\":\"太仆寺旗\"},{\"value\":\"152528\",\"label\":\"镶黄旗\"},{\"value\":\"152529\",\"label\":\"正镶白旗\"},{\"value\":\"152530\",\"label\":\"正蓝旗\"},{\"value\":\"152531\",\"label\":\"多伦县\"}]},{\"value\":\"152900\",\"label\":\"阿拉善盟\",\"children\":[{\"value\":\"152921\",\"label\":\"阿拉善左旗\"},{\"value\":\"152922\",\"label\":\"阿拉善右旗\"},{\"value\":\"152923\",\"label\":\"额济纳旗\"}]}]},{\"value\":\"210000\",\"label\":\"辽宁省\",\"children\":[{\"value\":\"210100\",\"label\":\"沈阳市\",\"children\":[{\"value\":\"210102\",\"label\":\"和平区\"},{\"value\":\"210103\",\"label\":\"沈河区\"},{\"value\":\"210104\",\"label\":\"大东区\"},{\"value\":\"210105\",\"label\":\"皇姑区\"},{\"value\":\"210106\",\"label\":\"铁西区\"},{\"value\":\"210111\",\"label\":\"苏家屯区\"},{\"value\":\"210112\",\"label\":\"浑南区\"},{\"value\":\"210113\",\"label\":\"沈北新区\"},{\"value\":\"210114\",\"label\":\"于洪区\"},{\"value\":\"210115\",\"label\":\"辽中区\"},{\"value\":\"210123\",\"label\":\"康平县\"},{\"value\":\"210124\",\"label\":\"法库县\"},{\"value\":\"210181\",\"label\":\"新民市\"}]},{\"value\":\"210200\",\"label\":\"大连市\",\"children\":[{\"value\":\"210202\",\"label\":\"中山区\"},{\"value\":\"210203\",\"label\":\"西岗区\"},{\"value\":\"210204\",\"label\":\"沙河口区\"},{\"value\":\"210211\",\"label\":\"甘井子区\"},{\"value\":\"210212\",\"label\":\"旅顺口区\"},{\"value\":\"210213\",\"label\":\"金州区\"},{\"value\":\"210214\",\"label\":\"普兰店区\"},{\"value\":\"210224\",\"label\":\"长海县\"},{\"value\":\"210281\",\"label\":\"瓦房店市\"},{\"value\":\"210283\",\"label\":\"庄河市\"}]},{\"value\":\"210300\",\"label\":\"鞍山市\",\"children\":[{\"value\":\"210302\",\"label\":\"铁东区\"},{\"value\":\"210303\",\"label\":\"铁西区\"},{\"value\":\"210304\",\"label\":\"立山区\"},{\"value\":\"210311\",\"label\":\"千山区\"},{\"value\":\"210321\",\"label\":\"台安县\"},{\"value\":\"210323\",\"label\":\"岫岩满族自治县\"},{\"value\":\"210381\",\"label\":\"海城市\"}]},{\"value\":\"210400\",\"label\":\"抚顺市\",\"children\":[{\"value\":\"210402\",\"label\":\"新抚区\"},{\"value\":\"210403\",\"label\":\"东洲区\"},{\"value\":\"210404\",\"label\":\"望花区\"},{\"value\":\"210411\",\"label\":\"顺城区\"},{\"value\":\"210421\",\"label\":\"抚顺县\"},{\"value\":\"210422\",\"label\":\"新宾满族自治县\"},{\"value\":\"210423\",\"label\":\"清原满族自治县\"}]},{\"value\":\"210500\",\"label\":\"本溪市\",\"children\":[{\"value\":\"210502\",\"label\":\"平山区\"},{\"value\":\"210503\",\"label\":\"溪湖区\"},{\"value\":\"210504\",\"label\":\"明山区\"},{\"value\":\"210505\",\"label\":\"南芬区\"},{\"value\":\"210521\",\"label\":\"本溪满族自治县\"},{\"value\":\"210522\",\"label\":\"桓仁满族自治县\"}]},{\"value\":\"210600\",\"label\":\"丹东市\",\"children\":[{\"value\":\"210602\",\"label\":\"元宝区\"},{\"value\":\"210603\",\"label\":\"振兴区\"},{\"value\":\"210604\",\"label\":\"振安区\"},{\"value\":\"210624\",\"label\":\"宽甸满族自治县\"},{\"value\":\"210681\",\"label\":\"东港市\"},{\"value\":\"210682\",\"label\":\"凤城市\"}]},{\"value\":\"210700\",\"label\":\"锦州市\",\"children\":[{\"value\":\"210702\",\"label\":\"古塔区\"},{\"value\":\"210703\",\"label\":\"凌河区\"},{\"value\":\"210711\",\"label\":\"太和区\"},{\"value\":\"210726\",\"label\":\"黑山县\"},{\"value\":\"210727\",\"label\":\"义县\"},{\"value\":\"210781\",\"label\":\"凌海市\"},{\"value\":\"210782\",\"label\":\"北镇市\"}]},{\"value\":\"210800\",\"label\":\"营口市\",\"children\":[{\"value\":\"210802\",\"label\":\"站前区\"},{\"value\":\"210803\",\"label\":\"西市区\"},{\"value\":\"210804\",\"label\":\"鲅鱼圈区\"},{\"value\":\"210811\",\"label\":\"老边区\"},{\"value\":\"210881\",\"label\":\"盖州市\"},{\"value\":\"210882\",\"label\":\"大石桥市\"}]},{\"value\":\"210900\",\"label\":\"阜新市\",\"children\":[{\"value\":\"210902\",\"label\":\"海州区\"},{\"value\":\"210903\",\"label\":\"新邱区\"},{\"value\":\"210904\",\"label\":\"太平区\"},{\"value\":\"210905\",\"label\":\"清河门区\"},{\"value\":\"210911\",\"label\":\"细河区\"},{\"value\":\"210921\",\"label\":\"阜新蒙古族自治县\"},{\"value\":\"210922\",\"label\":\"彰武县\"}]},{\"value\":\"211000\",\"label\":\"辽阳市\",\"children\":[{\"value\":\"211002\",\"label\":\"白塔区\"},{\"value\":\"211003\",\"label\":\"文圣区\"},{\"value\":\"211004\",\"label\":\"宏伟区\"},{\"value\":\"211005\",\"label\":\"弓长岭区\"},{\"value\":\"211011\",\"label\":\"太子河区\"},{\"value\":\"211021\",\"label\":\"辽阳县\"},{\"value\":\"211081\",\"label\":\"灯塔市\"}]},{\"value\":\"211100\",\"label\":\"盘锦市\",\"children\":[{\"value\":\"211102\",\"label\":\"双台子区\"},{\"value\":\"211103\",\"label\":\"兴隆台区\"},{\"value\":\"211104\",\"label\":\"大洼区\"},{\"value\":\"211122\",\"label\":\"盘山县\"}]},{\"value\":\"211200\",\"label\":\"铁岭市\",\"children\":[{\"value\":\"211202\",\"label\":\"银州区\"},{\"value\":\"211204\",\"label\":\"清河区\"},{\"value\":\"211221\",\"label\":\"铁岭县\"},{\"value\":\"211223\",\"label\":\"西丰县\"},{\"value\":\"211224\",\"label\":\"昌图县\"},{\"value\":\"211281\",\"label\":\"调兵山市\"},{\"value\":\"211282\",\"label\":\"开原市\"}]},{\"value\":\"211300\",\"label\":\"朝阳市\",\"children\":[{\"value\":\"211302\",\"label\":\"双塔区\"},{\"value\":\"211303\",\"label\":\"龙城区\"},{\"value\":\"211321\",\"label\":\"朝阳县\"},{\"value\":\"211322\",\"label\":\"建平县\"},{\"value\":\"211324\",\"label\":\"喀喇沁左翼蒙古族自治县\"},{\"value\":\"211381\",\"label\":\"北票市\"},{\"value\":\"211382\",\"label\":\"凌源市\"}]},{\"value\":\"211400\",\"label\":\"葫芦岛市\",\"children\":[{\"value\":\"211402\",\"label\":\"连山区\"},{\"value\":\"211403\",\"label\":\"龙港区\"},{\"value\":\"211404\",\"label\":\"南票区\"},{\"value\":\"211421\",\"label\":\"绥中县\"},{\"value\":\"211422\",\"label\":\"建昌县\"},{\"value\":\"211481\",\"label\":\"兴城市\"}]}]},{\"value\":\"220000\",\"label\":\"吉林省\",\"children\":[{\"value\":\"220100\",\"label\":\"长春市\",\"children\":[{\"value\":\"220102\",\"label\":\"南关区\"},{\"value\":\"220103\",\"label\":\"宽城区\"},{\"value\":\"220104\",\"label\":\"朝阳区\"},{\"value\":\"220105\",\"label\":\"二道区\"},{\"value\":\"220106\",\"label\":\"绿园区\"},{\"value\":\"220112\",\"label\":\"双阳区\"},{\"value\":\"220113\",\"label\":\"九台区\"},{\"value\":\"220122\",\"label\":\"农安县\"},{\"value\":\"220182\",\"label\":\"榆树市\"},{\"value\":\"220183\",\"label\":\"德惠市\"}]},{\"value\":\"220200\",\"label\":\"吉林市\",\"children\":[{\"value\":\"220202\",\"label\":\"昌邑区\"},{\"value\":\"220203\",\"label\":\"龙潭区\"},{\"value\":\"220204\",\"label\":\"船营区\"},{\"value\":\"220211\",\"label\":\"丰满区\"},{\"value\":\"220221\",\"label\":\"永吉县\"},{\"value\":\"220281\",\"label\":\"蛟河市\"},{\"value\":\"220282\",\"label\":\"桦甸市\"},{\"value\":\"220283\",\"label\":\"舒兰市\"},{\"value\":\"220284\",\"label\":\"磐石市\"}]},{\"value\":\"220300\",\"label\":\"四平市\",\"children\":[{\"value\":\"220302\",\"label\":\"铁西区\"},{\"value\":\"220303\",\"label\":\"铁东区\"},{\"value\":\"220322\",\"label\":\"梨树县\"},{\"value\":\"220323\",\"label\":\"伊通满族自治县\"},{\"value\":\"220381\",\"label\":\"公主岭市\"},{\"value\":\"220382\",\"label\":\"双辽市\"}]},{\"value\":\"220400\",\"label\":\"辽源市\",\"children\":[{\"value\":\"220402\",\"label\":\"龙山区\"},{\"value\":\"220403\",\"label\":\"西安区\"},{\"value\":\"220421\",\"label\":\"东丰县\"},{\"value\":\"220422\",\"label\":\"东辽县\"}]},{\"value\":\"220500\",\"label\":\"通化市\",\"children\":[{\"value\":\"220502\",\"label\":\"东昌区\"},{\"value\":\"220503\",\"label\":\"二道江区\"},{\"value\":\"220521\",\"label\":\"通化县\"},{\"value\":\"220523\",\"label\":\"辉南县\"},{\"value\":\"220524\",\"label\":\"柳河县\"},{\"value\":\"220581\",\"label\":\"梅河口市\"},{\"value\":\"220582\",\"label\":\"集安市\"}]},{\"value\":\"220600\",\"label\":\"白山市\",\"children\":[{\"value\":\"220602\",\"label\":\"浑江区\"},{\"value\":\"220605\",\"label\":\"江源区\"},{\"value\":\"220621\",\"label\":\"抚松县\"},{\"value\":\"220622\",\"label\":\"靖宇县\"},{\"value\":\"220623\",\"label\":\"长白朝鲜族自治县\"},{\"value\":\"220681\",\"label\":\"临江市\"}]},{\"value\":\"220700\",\"label\":\"松原市\",\"children\":[{\"value\":\"220702\",\"label\":\"宁江区\"},{\"value\":\"220721\",\"label\":\"前郭尔罗斯蒙古族自治县\"},{\"value\":\"220722\",\"label\":\"长岭县\"},{\"value\":\"220723\",\"label\":\"乾安县\"},{\"value\":\"220781\",\"label\":\"扶余市\"}]},{\"value\":\"220800\",\"label\":\"白城市\",\"children\":[{\"value\":\"220802\",\"label\":\"洮北区\"},{\"value\":\"220821\",\"label\":\"镇赉县\"},{\"value\":\"220822\",\"label\":\"通榆县\"},{\"value\":\"220881\",\"label\":\"洮南市\"},{\"value\":\"220882\",\"label\":\"大安市\"}]},{\"value\":\"222400\",\"label\":\"延边朝鲜族自治州\",\"children\":[{\"value\":\"222401\",\"label\":\"延吉市\"},{\"value\":\"222402\",\"label\":\"图们市\"},{\"value\":\"222403\",\"label\":\"敦化市\"},{\"value\":\"222404\",\"label\":\"珲春市\"},{\"value\":\"222405\",\"label\":\"龙井市\"},{\"value\":\"222406\",\"label\":\"和龙市\"},{\"value\":\"222424\",\"label\":\"汪清县\"},{\"value\":\"222426\",\"label\":\"安图县\"}]}]},{\"value\":\"230000\",\"label\":\"黑龙江省\",\"children\":[{\"value\":\"230100\",\"label\":\"哈尔滨市\",\"children\":[{\"value\":\"230102\",\"label\":\"道里区\"},{\"value\":\"230103\",\"label\":\"南岗区\"},{\"value\":\"230104\",\"label\":\"道外区\"},{\"value\":\"230108\",\"label\":\"平房区\"},{\"value\":\"230109\",\"label\":\"松北区\"},{\"value\":\"230110\",\"label\":\"香坊区\"},{\"value\":\"230111\",\"label\":\"呼兰区\"},{\"value\":\"230112\",\"label\":\"阿城区\"},{\"value\":\"230113\",\"label\":\"双城区\"},{\"value\":\"230123\",\"label\":\"依兰县\"},{\"value\":\"230124\",\"label\":\"方正县\"},{\"value\":\"230125\",\"label\":\"宾县\"},{\"value\":\"230126\",\"label\":\"巴彦县\"},{\"value\":\"230127\",\"label\":\"木兰县\"},{\"value\":\"230128\",\"label\":\"通河县\"},{\"value\":\"230129\",\"label\":\"延寿县\"},{\"value\":\"230183\",\"label\":\"尚志市\"},{\"value\":\"230184\",\"label\":\"五常市\"}]},{\"value\":\"230200\",\"label\":\"齐齐哈尔市\",\"children\":[{\"value\":\"230202\",\"label\":\"龙沙区\"},{\"value\":\"230203\",\"label\":\"建华区\"},{\"value\":\"230204\",\"label\":\"铁锋区\"},{\"value\":\"230205\",\"label\":\"昂昂溪区\"},{\"value\":\"230206\",\"label\":\"富拉尔基区\"},{\"value\":\"230207\",\"label\":\"碾子山区\"},{\"value\":\"230208\",\"label\":\"梅里斯达斡尔族区\"},{\"value\":\"230221\",\"label\":\"龙江县\"},{\"value\":\"230223\",\"label\":\"依安县\"},{\"value\":\"230224\",\"label\":\"泰来县\"},{\"value\":\"230225\",\"label\":\"甘南县\"},{\"value\":\"230227\",\"label\":\"富裕县\"},{\"value\":\"230229\",\"label\":\"克山县\"},{\"value\":\"230230\",\"label\":\"克东县\"},{\"value\":\"230231\",\"label\":\"拜泉县\"},{\"value\":\"230281\",\"label\":\"讷河市\"}]},{\"value\":\"230300\",\"label\":\"鸡西市\",\"children\":[{\"value\":\"230302\",\"label\":\"鸡冠区\"},{\"value\":\"230303\",\"label\":\"恒山区\"},{\"value\":\"230304\",\"label\":\"滴道区\"},{\"value\":\"230305\",\"label\":\"梨树区\"},{\"value\":\"230306\",\"label\":\"城子河区\"},{\"value\":\"230307\",\"label\":\"麻山区\"},{\"value\":\"230321\",\"label\":\"鸡东县\"},{\"value\":\"230381\",\"label\":\"虎林市\"},{\"value\":\"230382\",\"label\":\"密山市\"}]},{\"value\":\"230400\",\"label\":\"鹤岗市\",\"children\":[{\"value\":\"230402\",\"label\":\"向阳区\"},{\"value\":\"230403\",\"label\":\"工农区\"},{\"value\":\"230404\",\"label\":\"南山区\"},{\"value\":\"230405\",\"label\":\"兴安区\"},{\"value\":\"230406\",\"label\":\"东山区\"},{\"value\":\"230407\",\"label\":\"兴山区\"},{\"value\":\"230421\",\"label\":\"萝北县\"},{\"value\":\"230422\",\"label\":\"绥滨县\"}]},{\"value\":\"230500\",\"label\":\"双鸭山市\",\"children\":[{\"value\":\"230502\",\"label\":\"尖山区\"},{\"value\":\"230503\",\"label\":\"岭东区\"},{\"value\":\"230505\",\"label\":\"四方台区\"},{\"value\":\"230506\",\"label\":\"宝山区\"},{\"value\":\"230521\",\"label\":\"集贤县\"},{\"value\":\"230522\",\"label\":\"友谊县\"},{\"value\":\"230523\",\"label\":\"宝清县\"},{\"value\":\"230524\",\"label\":\"饶河县\"}]},{\"value\":\"230600\",\"label\":\"大庆市\",\"children\":[{\"value\":\"230602\",\"label\":\"萨尔图区\"},{\"value\":\"230603\",\"label\":\"龙凤区\"},{\"value\":\"230604\",\"label\":\"让胡路区\"},{\"value\":\"230605\",\"label\":\"红岗区\"},{\"value\":\"230606\",\"label\":\"大同区\"},{\"value\":\"230621\",\"label\":\"肇州县\"},{\"value\":\"230622\",\"label\":\"肇源县\"},{\"value\":\"230623\",\"label\":\"林甸县\"},{\"value\":\"230624\",\"label\":\"杜尔伯特蒙古族自治县\"}]},{\"value\":\"230700\",\"label\":\"伊春市\",\"children\":[{\"value\":\"230702\",\"label\":\"伊春区\"},{\"value\":\"230703\",\"label\":\"南岔区\"},{\"value\":\"230704\",\"label\":\"友好区\"},{\"value\":\"230705\",\"label\":\"西林区\"},{\"value\":\"230706\",\"label\":\"翠峦区\"},{\"value\":\"230707\",\"label\":\"新青区\"},{\"value\":\"230708\",\"label\":\"美溪区\"},{\"value\":\"230709\",\"label\":\"金山屯区\"},{\"value\":\"230710\",\"label\":\"五营区\"},{\"value\":\"230711\",\"label\":\"乌马河区\"},{\"value\":\"230712\",\"label\":\"汤旺河区\"},{\"value\":\"230713\",\"label\":\"带岭区\"},{\"value\":\"230714\",\"label\":\"乌伊岭区\"},{\"value\":\"230715\",\"label\":\"红星区\"},{\"value\":\"230716\",\"label\":\"上甘岭区\"},{\"value\":\"230722\",\"label\":\"嘉荫县\"},{\"value\":\"230781\",\"label\":\"铁力市\"}]},{\"value\":\"230800\",\"label\":\"佳木斯市\",\"children\":[{\"value\":\"230803\",\"label\":\"向阳区\"},{\"value\":\"230804\",\"label\":\"前进区\"},{\"value\":\"230805\",\"label\":\"东风区\"},{\"value\":\"230811\",\"label\":\"郊区\"},{\"value\":\"230822\",\"label\":\"桦南县\"},{\"value\":\"230826\",\"label\":\"桦川县\"},{\"value\":\"230828\",\"label\":\"汤原县\"},{\"value\":\"230881\",\"label\":\"同江市\"},{\"value\":\"230882\",\"label\":\"富锦市\"},{\"value\":\"230883\",\"label\":\"抚远市\"}]},{\"value\":\"230900\",\"label\":\"七台河市\",\"children\":[{\"value\":\"230902\",\"label\":\"新兴区\"},{\"value\":\"230903\",\"label\":\"桃山区\"},{\"value\":\"230904\",\"label\":\"茄子河区\"},{\"value\":\"230921\",\"label\":\"勃利县\"}]},{\"value\":\"231000\",\"label\":\"牡丹江市\",\"children\":[{\"value\":\"231002\",\"label\":\"东安区\"},{\"value\":\"231003\",\"label\":\"阳明区\"},{\"value\":\"231004\",\"label\":\"爱民区\"},{\"value\":\"231005\",\"label\":\"西安区\"},{\"value\":\"231025\",\"label\":\"林口县\"},{\"value\":\"231081\",\"label\":\"绥芬河市\"},{\"value\":\"231083\",\"label\":\"海林市\"},{\"value\":\"231084\",\"label\":\"宁安市\"},{\"value\":\"231085\",\"label\":\"穆棱市\"},{\"value\":\"231086\",\"label\":\"东宁市\"}]},{\"value\":\"231100\",\"label\":\"黑河市\",\"children\":[{\"value\":\"231102\",\"label\":\"爱辉区\"},{\"value\":\"231121\",\"label\":\"嫩江县\"},{\"value\":\"231123\",\"label\":\"逊克县\"},{\"value\":\"231124\",\"label\":\"孙吴县\"},{\"value\":\"231181\",\"label\":\"北安市\"},{\"value\":\"231182\",\"label\":\"五大连池市\"}]},{\"value\":\"231200\",\"label\":\"绥化市\",\"children\":[{\"value\":\"231202\",\"label\":\"北林区\"},{\"value\":\"231221\",\"label\":\"望奎县\"},{\"value\":\"231222\",\"label\":\"兰西县\"},{\"value\":\"231223\",\"label\":\"青冈县\"},{\"value\":\"231224\",\"label\":\"庆安县\"},{\"value\":\"231225\",\"label\":\"明水县\"},{\"value\":\"231226\",\"label\":\"绥棱县\"},{\"value\":\"231281\",\"label\":\"安达市\"},{\"value\":\"231282\",\"label\":\"肇东市\"},{\"value\":\"231283\",\"label\":\"海伦市\"}]},{\"value\":\"232700\",\"label\":\"大兴安岭地区\",\"children\":[{\"value\":\"232701\",\"label\":\"漠河市\"},{\"value\":\"232721\",\"label\":\"呼玛县\"},{\"value\":\"232722\",\"label\":\"塔河县\"}]}]},{\"value\":\"310000\",\"label\":\"上海市\",\"children\":[{\"value\":\"310000\",\"label\":\"上海市\",\"children\":[{\"value\":\"310101\",\"label\":\"黄浦区\"},{\"value\":\"310104\",\"label\":\"徐汇区\"},{\"value\":\"310105\",\"label\":\"长宁区\"},{\"value\":\"310106\",\"label\":\"静安区\"},{\"value\":\"310107\",\"label\":\"普陀区\"},{\"value\":\"310109\",\"label\":\"虹口区\"},{\"value\":\"310110\",\"label\":\"杨浦区\"},{\"value\":\"310112\",\"label\":\"闵行区\"},{\"value\":\"310113\",\"label\":\"宝山区\"},{\"value\":\"310114\",\"label\":\"嘉定区\"},{\"value\":\"310115\",\"label\":\"浦东新区\"},{\"value\":\"310116\",\"label\":\"金山区\"},{\"value\":\"310117\",\"label\":\"松江区\"},{\"value\":\"310118\",\"label\":\"青浦区\"},{\"value\":\"310120\",\"label\":\"奉贤区\"},{\"value\":\"310151\",\"label\":\"崇明区\"}]}]},{\"value\":\"320000\",\"label\":\"江苏省\",\"children\":[{\"value\":\"320100\",\"label\":\"南京市\",\"children\":[{\"value\":\"320102\",\"label\":\"玄武区\"},{\"value\":\"320104\",\"label\":\"秦淮区\"},{\"value\":\"320105\",\"label\":\"建邺区\"},{\"value\":\"320106\",\"label\":\"鼓楼区\"},{\"value\":\"320111\",\"label\":\"浦口区\"},{\"value\":\"320113\",\"label\":\"栖霞区\"},{\"value\":\"320114\",\"label\":\"雨花台区\"},{\"value\":\"320115\",\"label\":\"江宁区\"},{\"value\":\"320116\",\"label\":\"六合区\"},{\"value\":\"320117\",\"label\":\"溧水区\"},{\"value\":\"320118\",\"label\":\"高淳区\"}]},{\"value\":\"320200\",\"label\":\"无锡市\",\"children\":[{\"value\":\"320205\",\"label\":\"锡山区\"},{\"value\":\"320206\",\"label\":\"惠山区\"},{\"value\":\"320211\",\"label\":\"滨湖区\"},{\"value\":\"320213\",\"label\":\"梁溪区\"},{\"value\":\"320214\",\"label\":\"新吴区\"},{\"value\":\"320281\",\"label\":\"江阴市\"},{\"value\":\"320282\",\"label\":\"宜兴市\"}]},{\"value\":\"320300\",\"label\":\"徐州市\",\"children\":[{\"value\":\"320302\",\"label\":\"鼓楼区\"},{\"value\":\"320303\",\"label\":\"云龙区\"},{\"value\":\"320305\",\"label\":\"贾汪区\"},{\"value\":\"320311\",\"label\":\"泉山区\"},{\"value\":\"320312\",\"label\":\"铜山区\"},{\"value\":\"320321\",\"label\":\"丰县\"},{\"value\":\"320322\",\"label\":\"沛县\"},{\"value\":\"320324\",\"label\":\"睢宁县\"},{\"value\":\"320381\",\"label\":\"新沂市\"},{\"value\":\"320382\",\"label\":\"邳州市\"}]},{\"value\":\"320400\",\"label\":\"常州市\",\"children\":[{\"value\":\"320402\",\"label\":\"天宁区\"},{\"value\":\"320404\",\"label\":\"钟楼区\"},{\"value\":\"320411\",\"label\":\"新北区\"},{\"value\":\"320412\",\"label\":\"武进区\"},{\"value\":\"320413\",\"label\":\"金坛区\"},{\"value\":\"320481\",\"label\":\"溧阳市\"}]},{\"value\":\"320500\",\"label\":\"苏州市\",\"children\":[{\"value\":\"320505\",\"label\":\"虎丘区\"},{\"value\":\"320506\",\"label\":\"吴中区\"},{\"value\":\"320507\",\"label\":\"相城区\"},{\"value\":\"320508\",\"label\":\"姑苏区\"},{\"value\":\"320509\",\"label\":\"吴江区\"},{\"value\":\"320581\",\"label\":\"常熟市\"},{\"value\":\"320582\",\"label\":\"张家港市\"},{\"value\":\"320583\",\"label\":\"昆山市\"},{\"value\":\"320585\",\"label\":\"太仓市\"}]},{\"value\":\"320600\",\"label\":\"南通市\",\"children\":[{\"value\":\"320602\",\"label\":\"崇川区\"},{\"value\":\"320611\",\"label\":\"港闸区\"},{\"value\":\"320612\",\"label\":\"通州区\"},{\"value\":\"320623\",\"label\":\"如东县\"},{\"value\":\"320681\",\"label\":\"启东市\"},{\"value\":\"320682\",\"label\":\"如皋市\"},{\"value\":\"320684\",\"label\":\"海门市\"},{\"value\":\"320685\",\"label\":\"海安市\"}]},{\"value\":\"320700\",\"label\":\"连云港市\",\"children\":[{\"value\":\"320703\",\"label\":\"连云区\"},{\"value\":\"320706\",\"label\":\"海州区\"},{\"value\":\"320707\",\"label\":\"赣榆区\"},{\"value\":\"320722\",\"label\":\"东海县\"},{\"value\":\"320723\",\"label\":\"灌云县\"},{\"value\":\"320724\",\"label\":\"灌南县\"}]},{\"value\":\"320800\",\"label\":\"淮安市\",\"children\":[{\"value\":\"320803\",\"label\":\"淮安区\"},{\"value\":\"320804\",\"label\":\"淮阴区\"},{\"value\":\"320812\",\"label\":\"清江浦区\"},{\"value\":\"320813\",\"label\":\"洪泽区\"},{\"value\":\"320826\",\"label\":\"涟水县\"},{\"value\":\"320830\",\"label\":\"盱眙县\"},{\"value\":\"320831\",\"label\":\"金湖县\"}]},{\"value\":\"320900\",\"label\":\"盐城市\",\"children\":[{\"value\":\"320902\",\"label\":\"亭湖区\"},{\"value\":\"320903\",\"label\":\"盐都区\"},{\"value\":\"320904\",\"label\":\"大丰区\"},{\"value\":\"320921\",\"label\":\"响水县\"},{\"value\":\"320922\",\"label\":\"滨海县\"},{\"value\":\"320923\",\"label\":\"阜宁县\"},{\"value\":\"320924\",\"label\":\"射阳县\"},{\"value\":\"320925\",\"label\":\"建湖县\"},{\"value\":\"320981\",\"label\":\"东台市\"}]},{\"value\":\"321000\",\"label\":\"扬州市\",\"children\":[{\"value\":\"321002\",\"label\":\"广陵区\"},{\"value\":\"321003\",\"label\":\"邗江区\"},{\"value\":\"321012\",\"label\":\"江都区\"},{\"value\":\"321023\",\"label\":\"宝应县\"},{\"value\":\"321081\",\"label\":\"仪征市\"},{\"value\":\"321084\",\"label\":\"高邮市\"}]},{\"value\":\"321100\",\"label\":\"镇江市\",\"children\":[{\"value\":\"321102\",\"label\":\"京口区\"},{\"value\":\"321111\",\"label\":\"润州区\"},{\"value\":\"321112\",\"label\":\"丹徒区\"},{\"value\":\"321181\",\"label\":\"丹阳市\"},{\"value\":\"321182\",\"label\":\"扬中市\"},{\"value\":\"321183\",\"label\":\"句容市\"}]},{\"value\":\"321200\",\"label\":\"泰州市\",\"children\":[{\"value\":\"321202\",\"label\":\"海陵区\"},{\"value\":\"321203\",\"label\":\"高港区\"},{\"value\":\"321204\",\"label\":\"姜堰区\"},{\"value\":\"321281\",\"label\":\"兴化市\"},{\"value\":\"321282\",\"label\":\"靖江市\"},{\"value\":\"321283\",\"label\":\"泰兴市\"}]},{\"value\":\"321300\",\"label\":\"宿迁市\",\"children\":[{\"value\":\"321302\",\"label\":\"宿城区\"},{\"value\":\"321311\",\"label\":\"宿豫区\"},{\"value\":\"321322\",\"label\":\"沭阳县\"},{\"value\":\"321323\",\"label\":\"泗阳县\"},{\"value\":\"321324\",\"label\":\"泗洪县\"}]}]},{\"value\":\"330000\",\"label\":\"浙江省\",\"children\":[{\"value\":\"330100\",\"label\":\"杭州市\",\"children\":[{\"value\":\"330102\",\"label\":\"上城区\"},{\"value\":\"330103\",\"label\":\"下城区\"},{\"value\":\"330104\",\"label\":\"江干区\"},{\"value\":\"330105\",\"label\":\"拱墅区\"},{\"value\":\"330106\",\"label\":\"西湖区\"},{\"value\":\"330108\",\"label\":\"滨江区\"},{\"value\":\"330109\",\"label\":\"萧山区\"},{\"value\":\"330110\",\"label\":\"余杭区\"},{\"value\":\"330111\",\"label\":\"富阳区\"},{\"value\":\"330112\",\"label\":\"临安区\"},{\"value\":\"330122\",\"label\":\"桐庐县\"},{\"value\":\"330127\",\"label\":\"淳安县\"},{\"value\":\"330182\",\"label\":\"建德市\"}]},{\"value\":\"330200\",\"label\":\"宁波市\",\"children\":[{\"value\":\"330203\",\"label\":\"海曙区\"},{\"value\":\"330205\",\"label\":\"江北区\"},{\"value\":\"330206\",\"label\":\"北仑区\"},{\"value\":\"330211\",\"label\":\"镇海区\"},{\"value\":\"330212\",\"label\":\"鄞州区\"},{\"value\":\"330213\",\"label\":\"奉化区\"},{\"value\":\"330225\",\"label\":\"象山县\"},{\"value\":\"330226\",\"label\":\"宁海县\"},{\"value\":\"330281\",\"label\":\"余姚市\"},{\"value\":\"330282\",\"label\":\"慈溪市\"}]},{\"value\":\"330300\",\"label\":\"温州市\",\"children\":[{\"value\":\"330302\",\"label\":\"鹿城区\"},{\"value\":\"330303\",\"label\":\"龙湾区\"},{\"value\":\"330304\",\"label\":\"瓯海区\"},{\"value\":\"330305\",\"label\":\"洞头区\"},{\"value\":\"330324\",\"label\":\"永嘉县\"},{\"value\":\"330326\",\"label\":\"平阳县\"},{\"value\":\"330327\",\"label\":\"苍南县\"},{\"value\":\"330328\",\"label\":\"文成县\"},{\"value\":\"330329\",\"label\":\"泰顺县\"},{\"value\":\"330381\",\"label\":\"瑞安市\"},{\"value\":\"330382\",\"label\":\"乐清市\"}]},{\"value\":\"330400\",\"label\":\"嘉兴市\",\"children\":[{\"value\":\"330402\",\"label\":\"南湖区\"},{\"value\":\"330411\",\"label\":\"秀洲区\"},{\"value\":\"330421\",\"label\":\"嘉善县\"},{\"value\":\"330424\",\"label\":\"海盐县\"},{\"value\":\"330481\",\"label\":\"海宁市\"},{\"value\":\"330482\",\"label\":\"平湖市\"},{\"value\":\"330483\",\"label\":\"桐乡市\"}]},{\"value\":\"330500\",\"label\":\"湖州市\",\"children\":[{\"value\":\"330502\",\"label\":\"吴兴区\"},{\"value\":\"330503\",\"label\":\"南浔区\"},{\"value\":\"330521\",\"label\":\"德清县\"},{\"value\":\"330522\",\"label\":\"长兴县\"},{\"value\":\"330523\",\"label\":\"安吉县\"}]},{\"value\":\"330600\",\"label\":\"绍兴市\",\"children\":[{\"value\":\"330602\",\"label\":\"越城区\"},{\"value\":\"330603\",\"label\":\"柯桥区\"},{\"value\":\"330604\",\"label\":\"上虞区\"},{\"value\":\"330624\",\"label\":\"新昌县\"},{\"value\":\"330681\",\"label\":\"诸暨市\"},{\"value\":\"330683\",\"label\":\"嵊州市\"}]},{\"value\":\"330700\",\"label\":\"金华市\",\"children\":[{\"value\":\"330702\",\"label\":\"婺城区\"},{\"value\":\"330703\",\"label\":\"金东区\"},{\"value\":\"330723\",\"label\":\"武义县\"},{\"value\":\"330726\",\"label\":\"浦江县\"},{\"value\":\"330727\",\"label\":\"磐安县\"},{\"value\":\"330781\",\"label\":\"兰溪市\"},{\"value\":\"330782\",\"label\":\"义乌市\"},{\"value\":\"330783\",\"label\":\"东阳市\"},{\"value\":\"330784\",\"label\":\"永康市\"}]},{\"value\":\"330800\",\"label\":\"衢州市\",\"children\":[{\"value\":\"330802\",\"label\":\"柯城区\"},{\"value\":\"330803\",\"label\":\"衢江区\"},{\"value\":\"330822\",\"label\":\"常山县\"},{\"value\":\"330824\",\"label\":\"开化县\"},{\"value\":\"330825\",\"label\":\"龙游县\"},{\"value\":\"330881\",\"label\":\"江山市\"}]},{\"value\":\"330900\",\"label\":\"舟山市\",\"children\":[{\"value\":\"330902\",\"label\":\"定海区\"},{\"value\":\"330903\",\"label\":\"普陀区\"},{\"value\":\"330921\",\"label\":\"岱山县\"},{\"value\":\"330922\",\"label\":\"嵊泗县\"}]},{\"value\":\"331000\",\"label\":\"台州市\",\"children\":[{\"value\":\"331002\",\"label\":\"椒江区\"},{\"value\":\"331003\",\"label\":\"黄岩区\"},{\"value\":\"331004\",\"label\":\"路桥区\"},{\"value\":\"331022\",\"label\":\"三门县\"},{\"value\":\"331023\",\"label\":\"天台县\"},{\"value\":\"331024\",\"label\":\"仙居县\"},{\"value\":\"331081\",\"label\":\"温岭市\"},{\"value\":\"331082\",\"label\":\"临海市\"},{\"value\":\"331083\",\"label\":\"玉环市\"}]},{\"value\":\"331100\",\"label\":\"丽水市\",\"children\":[{\"value\":\"331102\",\"label\":\"莲都区\"},{\"value\":\"331121\",\"label\":\"青田县\"},{\"value\":\"331122\",\"label\":\"缙云县\"},{\"value\":\"331123\",\"label\":\"遂昌县\"},{\"value\":\"331124\",\"label\":\"松阳县\"},{\"value\":\"331125\",\"label\":\"云和县\"},{\"value\":\"331126\",\"label\":\"庆元县\"},{\"value\":\"331127\",\"label\":\"景宁畲族自治县\"},{\"value\":\"331181\",\"label\":\"龙泉市\"}]}]},{\"value\":\"340000\",\"label\":\"安徽省\",\"children\":[{\"value\":\"340100\",\"label\":\"合肥市\",\"children\":[{\"value\":\"340102\",\"label\":\"瑶海区\"},{\"value\":\"340103\",\"label\":\"庐阳区\"},{\"value\":\"340104\",\"label\":\"蜀山区\"},{\"value\":\"340111\",\"label\":\"包河区\"},{\"value\":\"340121\",\"label\":\"长丰县\"},{\"value\":\"340122\",\"label\":\"肥东县\"},{\"value\":\"340123\",\"label\":\"肥西县\"},{\"value\":\"340124\",\"label\":\"庐江县\"},{\"value\":\"340181\",\"label\":\"巢湖市\"}]},{\"value\":\"340200\",\"label\":\"芜湖市\",\"children\":[{\"value\":\"340202\",\"label\":\"镜湖区\"},{\"value\":\"340203\",\"label\":\"弋江区\"},{\"value\":\"340207\",\"label\":\"鸠江区\"},{\"value\":\"340208\",\"label\":\"三山区\"},{\"value\":\"340221\",\"label\":\"芜湖县\"},{\"value\":\"340222\",\"label\":\"繁昌县\"},{\"value\":\"340223\",\"label\":\"南陵县\"},{\"value\":\"340225\",\"label\":\"无为县\"}]},{\"value\":\"340300\",\"label\":\"蚌埠市\",\"children\":[{\"value\":\"340302\",\"label\":\"龙子湖区\"},{\"value\":\"340303\",\"label\":\"蚌山区\"},{\"value\":\"340304\",\"label\":\"禹会区\"},{\"value\":\"340311\",\"label\":\"淮上区\"},{\"value\":\"340321\",\"label\":\"怀远县\"},{\"value\":\"340322\",\"label\":\"五河县\"},{\"value\":\"340323\",\"label\":\"固镇县\"}]},{\"value\":\"340400\",\"label\":\"淮南市\",\"children\":[{\"value\":\"340402\",\"label\":\"大通区\"},{\"value\":\"340403\",\"label\":\"田家庵区\"},{\"value\":\"340404\",\"label\":\"谢家集区\"},{\"value\":\"340405\",\"label\":\"八公山区\"},{\"value\":\"340406\",\"label\":\"潘集区\"},{\"value\":\"340421\",\"label\":\"凤台县\"},{\"value\":\"340422\",\"label\":\"寿县\"}]},{\"value\":\"340500\",\"label\":\"马鞍山市\",\"children\":[{\"value\":\"340503\",\"label\":\"花山区\"},{\"value\":\"340504\",\"label\":\"雨山区\"},{\"value\":\"340506\",\"label\":\"博望区\"},{\"value\":\"340521\",\"label\":\"当涂县\"},{\"value\":\"340522\",\"label\":\"含山县\"},{\"value\":\"340523\",\"label\":\"和县\"}]},{\"value\":\"340600\",\"label\":\"淮北市\",\"children\":[{\"value\":\"340602\",\"label\":\"杜集区\"},{\"value\":\"340603\",\"label\":\"相山区\"},{\"value\":\"340604\",\"label\":\"烈山区\"},{\"value\":\"340621\",\"label\":\"濉溪县\"}]},{\"value\":\"340700\",\"label\":\"铜陵市\",\"children\":[{\"value\":\"340705\",\"label\":\"铜官区\"},{\"value\":\"340706\",\"label\":\"义安区\"},{\"value\":\"340711\",\"label\":\"郊区\"},{\"value\":\"340722\",\"label\":\"枞阳县\"}]},{\"value\":\"340800\",\"label\":\"安庆市\",\"children\":[{\"value\":\"340802\",\"label\":\"迎江区\"},{\"value\":\"340803\",\"label\":\"大观区\"},{\"value\":\"340811\",\"label\":\"宜秀区\"},{\"value\":\"340822\",\"label\":\"怀宁县\"},{\"value\":\"340824\",\"label\":\"潜山县\"},{\"value\":\"340825\",\"label\":\"太湖县\"},{\"value\":\"340826\",\"label\":\"宿松县\"},{\"value\":\"340827\",\"label\":\"望江县\"},{\"value\":\"340828\",\"label\":\"岳西县\"},{\"value\":\"340881\",\"label\":\"桐城市\"}]},{\"value\":\"341000\",\"label\":\"黄山市\",\"children\":[{\"value\":\"341002\",\"label\":\"屯溪区\"},{\"value\":\"341003\",\"label\":\"黄山区\"},{\"value\":\"341004\",\"label\":\"徽州区\"},{\"value\":\"341021\",\"label\":\"歙县\"},{\"value\":\"341022\",\"label\":\"休宁县\"},{\"value\":\"341023\",\"label\":\"黟县\"},{\"value\":\"341024\",\"label\":\"祁门县\"}]},{\"value\":\"341100\",\"label\":\"滁州市\",\"children\":[{\"value\":\"341102\",\"label\":\"琅琊区\"},{\"value\":\"341103\",\"label\":\"南谯区\"},{\"value\":\"341122\",\"label\":\"来安县\"},{\"value\":\"341124\",\"label\":\"全椒县\"},{\"value\":\"341125\",\"label\":\"定远县\"},{\"value\":\"341126\",\"label\":\"凤阳县\"},{\"value\":\"341181\",\"label\":\"天长市\"},{\"value\":\"341182\",\"label\":\"明光市\"}]},{\"value\":\"341200\",\"label\":\"阜阳市\",\"children\":[{\"value\":\"341202\",\"label\":\"颍州区\"},{\"value\":\"341203\",\"label\":\"颍东区\"},{\"value\":\"341204\",\"label\":\"颍泉区\"},{\"value\":\"341221\",\"label\":\"临泉县\"},{\"value\":\"341222\",\"label\":\"太和县\"},{\"value\":\"341225\",\"label\":\"阜南县\"},{\"value\":\"341226\",\"label\":\"颍上县\"},{\"value\":\"341282\",\"label\":\"界首市\"}]},{\"value\":\"341300\",\"label\":\"宿州市\",\"children\":[{\"value\":\"341302\",\"label\":\"埇桥区\"},{\"value\":\"341321\",\"label\":\"砀山县\"},{\"value\":\"341322\",\"label\":\"萧县\"},{\"value\":\"341323\",\"label\":\"灵璧县\"},{\"value\":\"341324\",\"label\":\"泗县\"}]},{\"value\":\"341500\",\"label\":\"六安市\",\"children\":[{\"value\":\"341502\",\"label\":\"金安区\"},{\"value\":\"341503\",\"label\":\"裕安区\"},{\"value\":\"341504\",\"label\":\"叶集区\"},{\"value\":\"341522\",\"label\":\"霍邱县\"},{\"value\":\"341523\",\"label\":\"舒城县\"},{\"value\":\"341524\",\"label\":\"金寨县\"},{\"value\":\"341525\",\"label\":\"霍山县\"}]},{\"value\":\"341600\",\"label\":\"亳州市\",\"children\":[{\"value\":\"341602\",\"label\":\"谯城区\"},{\"value\":\"341621\",\"label\":\"涡阳县\"},{\"value\":\"341622\",\"label\":\"蒙城县\"},{\"value\":\"341623\",\"label\":\"利辛县\"}]},{\"value\":\"341700\",\"label\":\"池州市\",\"children\":[{\"value\":\"341702\",\"label\":\"贵池区\"},{\"value\":\"341721\",\"label\":\"东至县\"},{\"value\":\"341722\",\"label\":\"石台县\"},{\"value\":\"341723\",\"label\":\"青阳县\"}]},{\"value\":\"341800\",\"label\":\"宣城市\",\"children\":[{\"value\":\"341802\",\"label\":\"宣州区\"},{\"value\":\"341821\",\"label\":\"郎溪县\"},{\"value\":\"341822\",\"label\":\"广德县\"},{\"value\":\"341823\",\"label\":\"泾县\"},{\"value\":\"341824\",\"label\":\"绩溪县\"},{\"value\":\"341825\",\"label\":\"旌德县\"},{\"value\":\"341881\",\"label\":\"宁国市\"}]}]},{\"value\":\"350000\",\"label\":\"福建省\",\"children\":[{\"value\":\"350100\",\"label\":\"福州市\",\"children\":[{\"value\":\"350102\",\"label\":\"鼓楼区\"},{\"value\":\"350103\",\"label\":\"台江区\"},{\"value\":\"350104\",\"label\":\"仓山区\"},{\"value\":\"350105\",\"label\":\"马尾区\"},{\"value\":\"350111\",\"label\":\"晋安区\"},{\"value\":\"350112\",\"label\":\"长乐区\"},{\"value\":\"350121\",\"label\":\"闽侯县\"},{\"value\":\"350122\",\"label\":\"连江县\"},{\"value\":\"350123\",\"label\":\"罗源县\"},{\"value\":\"350124\",\"label\":\"闽清县\"},{\"value\":\"350125\",\"label\":\"永泰县\"},{\"value\":\"350128\",\"label\":\"平潭县\"},{\"value\":\"350181\",\"label\":\"福清市\"}]},{\"value\":\"350200\",\"label\":\"厦门市\",\"children\":[{\"value\":\"350203\",\"label\":\"思明区\"},{\"value\":\"350205\",\"label\":\"海沧区\"},{\"value\":\"350206\",\"label\":\"湖里区\"},{\"value\":\"350211\",\"label\":\"集美区\"},{\"value\":\"350212\",\"label\":\"同安区\"},{\"value\":\"350213\",\"label\":\"翔安区\"}]},{\"value\":\"350300\",\"label\":\"莆田市\",\"children\":[{\"value\":\"350302\",\"label\":\"城厢区\"},{\"value\":\"350303\",\"label\":\"涵江区\"},{\"value\":\"350304\",\"label\":\"荔城区\"},{\"value\":\"350305\",\"label\":\"秀屿区\"},{\"value\":\"350322\",\"label\":\"仙游县\"}]},{\"value\":\"350400\",\"label\":\"三明市\",\"children\":[{\"value\":\"350402\",\"label\":\"梅列区\"},{\"value\":\"350403\",\"label\":\"三元区\"},{\"value\":\"350421\",\"label\":\"明溪县\"},{\"value\":\"350423\",\"label\":\"清流县\"},{\"value\":\"350424\",\"label\":\"宁化县\"},{\"value\":\"350425\",\"label\":\"大田县\"},{\"value\":\"350426\",\"label\":\"尤溪县\"},{\"value\":\"350427\",\"label\":\"沙县\"},{\"value\":\"350428\",\"label\":\"将乐县\"},{\"value\":\"350429\",\"label\":\"泰宁县\"},{\"value\":\"350430\",\"label\":\"建宁县\"},{\"value\":\"350481\",\"label\":\"永安市\"}]},{\"value\":\"350500\",\"label\":\"泉州市\",\"children\":[{\"value\":\"350502\",\"label\":\"鲤城区\"},{\"value\":\"350503\",\"label\":\"丰泽区\"},{\"value\":\"350504\",\"label\":\"洛江区\"},{\"value\":\"350505\",\"label\":\"泉港区\"},{\"value\":\"350521\",\"label\":\"惠安县\"},{\"value\":\"350524\",\"label\":\"安溪县\"},{\"value\":\"350525\",\"label\":\"永春县\"},{\"value\":\"350526\",\"label\":\"德化县\"},{\"value\":\"350527\",\"label\":\"金门县\"},{\"value\":\"350581\",\"label\":\"石狮市\"},{\"value\":\"350582\",\"label\":\"晋江市\"},{\"value\":\"350583\",\"label\":\"南安市\"}]},{\"value\":\"350600\",\"label\":\"漳州市\",\"children\":[{\"value\":\"350602\",\"label\":\"芗城区\"},{\"value\":\"350603\",\"label\":\"龙文区\"},{\"value\":\"350622\",\"label\":\"云霄县\"},{\"value\":\"350623\",\"label\":\"漳浦县\"},{\"value\":\"350624\",\"label\":\"诏安县\"},{\"value\":\"350625\",\"label\":\"长泰县\"},{\"value\":\"350626\",\"label\":\"东山县\"},{\"value\":\"350627\",\"label\":\"南靖县\"},{\"value\":\"350628\",\"label\":\"平和县\"},{\"value\":\"350629\",\"label\":\"华安县\"},{\"value\":\"350681\",\"label\":\"龙海市\"}]},{\"value\":\"350700\",\"label\":\"南平市\",\"children\":[{\"value\":\"350702\",\"label\":\"延平区\"},{\"value\":\"350703\",\"label\":\"建阳区\"},{\"value\":\"350721\",\"label\":\"顺昌县\"},{\"value\":\"350722\",\"label\":\"浦城县\"},{\"value\":\"350723\",\"label\":\"光泽县\"},{\"value\":\"350724\",\"label\":\"松溪县\"},{\"value\":\"350725\",\"label\":\"政和县\"},{\"value\":\"350781\",\"label\":\"邵武市\"},{\"value\":\"350782\",\"label\":\"武夷山市\"},{\"value\":\"350783\",\"label\":\"建瓯市\"}]},{\"value\":\"350800\",\"label\":\"龙岩市\",\"children\":[{\"value\":\"350802\",\"label\":\"新罗区\"},{\"value\":\"350803\",\"label\":\"永定区\"},{\"value\":\"350821\",\"label\":\"长汀县\"},{\"value\":\"350823\",\"label\":\"上杭县\"},{\"value\":\"350824\",\"label\":\"武平县\"},{\"value\":\"350825\",\"label\":\"连城县\"},{\"value\":\"350881\",\"label\":\"漳平市\"}]},{\"value\":\"350900\",\"label\":\"宁德市\",\"children\":[{\"value\":\"350902\",\"label\":\"蕉城区\"},{\"value\":\"350921\",\"label\":\"霞浦县\"},{\"value\":\"350922\",\"label\":\"古田县\"},{\"value\":\"350923\",\"label\":\"屏南县\"},{\"value\":\"350924\",\"label\":\"寿宁县\"},{\"value\":\"350925\",\"label\":\"周宁县\"},{\"value\":\"350926\",\"label\":\"柘荣县\"},{\"value\":\"350981\",\"label\":\"福安市\"},{\"value\":\"350982\",\"label\":\"福鼎市\"}]}]},{\"value\":\"360000\",\"label\":\"江西省\",\"children\":[{\"value\":\"360100\",\"label\":\"南昌市\",\"children\":[{\"value\":\"360102\",\"label\":\"东湖区\"},{\"value\":\"360103\",\"label\":\"西湖区\"},{\"value\":\"360104\",\"label\":\"青云谱区\"},{\"value\":\"360105\",\"label\":\"湾里区\"},{\"value\":\"360111\",\"label\":\"青山湖区\"},{\"value\":\"360112\",\"label\":\"新建区\"},{\"value\":\"360121\",\"label\":\"南昌县\"},{\"value\":\"360123\",\"label\":\"安义县\"},{\"value\":\"360124\",\"label\":\"进贤县\"}]},{\"value\":\"360200\",\"label\":\"景德镇市\",\"children\":[{\"value\":\"360202\",\"label\":\"昌江区\"},{\"value\":\"360203\",\"label\":\"珠山区\"},{\"value\":\"360222\",\"label\":\"浮梁县\"},{\"value\":\"360281\",\"label\":\"乐平市\"}]},{\"value\":\"360300\",\"label\":\"萍乡市\",\"children\":[{\"value\":\"360302\",\"label\":\"安源区\"},{\"value\":\"360313\",\"label\":\"湘东区\"},{\"value\":\"360321\",\"label\":\"莲花县\"},{\"value\":\"360322\",\"label\":\"上栗县\"},{\"value\":\"360323\",\"label\":\"芦溪县\"}]},{\"value\":\"360400\",\"label\":\"九江市\",\"children\":[{\"value\":\"360402\",\"label\":\"濂溪区\"},{\"value\":\"360403\",\"label\":\"浔阳区\"},{\"value\":\"360404\",\"label\":\"柴桑区\"},{\"value\":\"360423\",\"label\":\"武宁县\"},{\"value\":\"360424\",\"label\":\"修水县\"},{\"value\":\"360425\",\"label\":\"永修县\"},{\"value\":\"360426\",\"label\":\"德安县\"},{\"value\":\"360428\",\"label\":\"都昌县\"},{\"value\":\"360429\",\"label\":\"湖口县\"},{\"value\":\"360430\",\"label\":\"彭泽县\"},{\"value\":\"360481\",\"label\":\"瑞昌市\"},{\"value\":\"360482\",\"label\":\"共青城市\"},{\"value\":\"360483\",\"label\":\"庐山市\"}]},{\"value\":\"360500\",\"label\":\"新余市\",\"children\":[{\"value\":\"360502\",\"label\":\"渝水区\"},{\"value\":\"360521\",\"label\":\"分宜县\"}]},{\"value\":\"360600\",\"label\":\"鹰潭市\",\"children\":[{\"value\":\"360602\",\"label\":\"月湖区\"},{\"value\":\"360603\",\"label\":\"余江区\"},{\"value\":\"360681\",\"label\":\"贵溪市\"}]},{\"value\":\"360700\",\"label\":\"赣州市\",\"children\":[{\"value\":\"360702\",\"label\":\"章贡区\"},{\"value\":\"360703\",\"label\":\"南康区\"},{\"value\":\"360704\",\"label\":\"赣县区\"},{\"value\":\"360722\",\"label\":\"信丰县\"},{\"value\":\"360723\",\"label\":\"大余县\"},{\"value\":\"360724\",\"label\":\"上犹县\"},{\"value\":\"360725\",\"label\":\"崇义县\"},{\"value\":\"360726\",\"label\":\"安远县\"},{\"value\":\"360727\",\"label\":\"龙南县\"},{\"value\":\"360728\",\"label\":\"定南县\"},{\"value\":\"360729\",\"label\":\"全南县\"},{\"value\":\"360730\",\"label\":\"宁都县\"},{\"value\":\"360731\",\"label\":\"于都县\"},{\"value\":\"360732\",\"label\":\"兴国县\"},{\"value\":\"360733\",\"label\":\"会昌县\"},{\"value\":\"360734\",\"label\":\"寻乌县\"},{\"value\":\"360735\",\"label\":\"石城县\"},{\"value\":\"360781\",\"label\":\"瑞金市\"}]},{\"value\":\"360800\",\"label\":\"吉安市\",\"children\":[{\"value\":\"360802\",\"label\":\"吉州区\"},{\"value\":\"360803\",\"label\":\"青原区\"},{\"value\":\"360821\",\"label\":\"吉安县\"},{\"value\":\"360822\",\"label\":\"吉水县\"},{\"value\":\"360823\",\"label\":\"峡江县\"},{\"value\":\"360824\",\"label\":\"新干县\"},{\"value\":\"360825\",\"label\":\"永丰县\"},{\"value\":\"360826\",\"label\":\"泰和县\"},{\"value\":\"360827\",\"label\":\"遂川县\"},{\"value\":\"360828\",\"label\":\"万安县\"},{\"value\":\"360829\",\"label\":\"安福县\"},{\"value\":\"360830\",\"label\":\"永新县\"},{\"value\":\"360881\",\"label\":\"井冈山市\"}]},{\"value\":\"360900\",\"label\":\"宜春市\",\"children\":[{\"value\":\"360902\",\"label\":\"袁州区\"},{\"value\":\"360921\",\"label\":\"奉新县\"},{\"value\":\"360922\",\"label\":\"万载县\"},{\"value\":\"360923\",\"label\":\"上高县\"},{\"value\":\"360924\",\"label\":\"宜丰县\"},{\"value\":\"360925\",\"label\":\"靖安县\"},{\"value\":\"360926\",\"label\":\"铜鼓县\"},{\"value\":\"360981\",\"label\":\"丰城市\"},{\"value\":\"360982\",\"label\":\"樟树市\"},{\"value\":\"360983\",\"label\":\"高安市\"}]},{\"value\":\"361000\",\"label\":\"抚州市\",\"children\":[{\"value\":\"361002\",\"label\":\"临川区\"},{\"value\":\"361003\",\"label\":\"东乡区\"},{\"value\":\"361021\",\"label\":\"南城县\"},{\"value\":\"361022\",\"label\":\"黎川县\"},{\"value\":\"361023\",\"label\":\"南丰县\"},{\"value\":\"361024\",\"label\":\"崇仁县\"},{\"value\":\"361025\",\"label\":\"乐安县\"},{\"value\":\"361026\",\"label\":\"宜黄县\"},{\"value\":\"361027\",\"label\":\"金溪县\"},{\"value\":\"361028\",\"label\":\"资溪县\"},{\"value\":\"361030\",\"label\":\"广昌县\"}]},{\"value\":\"361100\",\"label\":\"上饶市\",\"children\":[{\"value\":\"361102\",\"label\":\"信州区\"},{\"value\":\"361103\",\"label\":\"广丰区\"},{\"value\":\"361121\",\"label\":\"上饶县\"},{\"value\":\"361123\",\"label\":\"玉山县\"},{\"value\":\"361124\",\"label\":\"铅山县\"},{\"value\":\"361125\",\"label\":\"横峰县\"},{\"value\":\"361126\",\"label\":\"弋阳县\"},{\"value\":\"361127\",\"label\":\"余干县\"},{\"value\":\"361128\",\"label\":\"鄱阳县\"},{\"value\":\"361129\",\"label\":\"万年县\"},{\"value\":\"361130\",\"label\":\"婺源县\"},{\"value\":\"361181\",\"label\":\"德兴市\"}]}]},{\"value\":\"370000\",\"label\":\"山东省\",\"children\":[{\"value\":\"370100\",\"label\":\"济南市\",\"children\":[{\"value\":\"370102\",\"label\":\"历下区\"},{\"value\":\"370103\",\"label\":\"市中区\"},{\"value\":\"370104\",\"label\":\"槐荫区\"},{\"value\":\"370105\",\"label\":\"天桥区\"},{\"value\":\"370112\",\"label\":\"历城区\"},{\"value\":\"370113\",\"label\":\"长清区\"},{\"value\":\"370114\",\"label\":\"章丘区\"},{\"value\":\"370124\",\"label\":\"平阴县\"},{\"value\":\"370125\",\"label\":\"济阳县\"},{\"value\":\"370126\",\"label\":\"商河县\"}]},{\"value\":\"370200\",\"label\":\"青岛市\",\"children\":[{\"value\":\"370202\",\"label\":\"市南区\"},{\"value\":\"370203\",\"label\":\"市北区\"},{\"value\":\"370211\",\"label\":\"黄岛区\"},{\"value\":\"370212\",\"label\":\"崂山区\"},{\"value\":\"370213\",\"label\":\"李沧区\"},{\"value\":\"370214\",\"label\":\"城阳区\"},{\"value\":\"370215\",\"label\":\"即墨区\"},{\"value\":\"370281\",\"label\":\"胶州市\"},{\"value\":\"370283\",\"label\":\"平度市\"},{\"value\":\"370285\",\"label\":\"莱西市\"}]},{\"value\":\"370300\",\"label\":\"淄博市\",\"children\":[{\"value\":\"370302\",\"label\":\"淄川区\"},{\"value\":\"370303\",\"label\":\"张店区\"},{\"value\":\"370304\",\"label\":\"博山区\"},{\"value\":\"370305\",\"label\":\"临淄区\"},{\"value\":\"370306\",\"label\":\"周村区\"},{\"value\":\"370321\",\"label\":\"桓台县\"},{\"value\":\"370322\",\"label\":\"高青县\"},{\"value\":\"370323\",\"label\":\"沂源县\"}]},{\"value\":\"370400\",\"label\":\"枣庄市\",\"children\":[{\"value\":\"370402\",\"label\":\"市中区\"},{\"value\":\"370403\",\"label\":\"薛城区\"},{\"value\":\"370404\",\"label\":\"峄城区\"},{\"value\":\"370405\",\"label\":\"台儿庄区\"},{\"value\":\"370406\",\"label\":\"山亭区\"},{\"value\":\"370481\",\"label\":\"滕州市\"}]},{\"value\":\"370500\",\"label\":\"东营市\",\"children\":[{\"value\":\"370502\",\"label\":\"东营区\"},{\"value\":\"370503\",\"label\":\"河口区\"},{\"value\":\"370505\",\"label\":\"垦利区\"},{\"value\":\"370522\",\"label\":\"利津县\"},{\"value\":\"370523\",\"label\":\"广饶县\"}]},{\"value\":\"370600\",\"label\":\"烟台市\",\"children\":[{\"value\":\"370602\",\"label\":\"芝罘区\"},{\"value\":\"370611\",\"label\":\"福山区\"},{\"value\":\"370612\",\"label\":\"牟平区\"},{\"value\":\"370613\",\"label\":\"莱山区\"},{\"value\":\"370634\",\"label\":\"长岛县\"},{\"value\":\"370681\",\"label\":\"龙口市\"},{\"value\":\"370682\",\"label\":\"莱阳市\"},{\"value\":\"370683\",\"label\":\"莱州市\"},{\"value\":\"370684\",\"label\":\"蓬莱市\"},{\"value\":\"370685\",\"label\":\"招远市\"},{\"value\":\"370686\",\"label\":\"栖霞市\"},{\"value\":\"370687\",\"label\":\"海阳市\"}]},{\"value\":\"370700\",\"label\":\"潍坊市\",\"children\":[{\"value\":\"370702\",\"label\":\"潍城区\"},{\"value\":\"370703\",\"label\":\"寒亭区\"},{\"value\":\"370704\",\"label\":\"坊子区\"},{\"value\":\"370705\",\"label\":\"奎文区\"},{\"value\":\"370724\",\"label\":\"临朐县\"},{\"value\":\"370725\",\"label\":\"昌乐县\"},{\"value\":\"370781\",\"label\":\"青州市\"},{\"value\":\"370782\",\"label\":\"诸城市\"},{\"value\":\"370783\",\"label\":\"寿光市\"},{\"value\":\"370784\",\"label\":\"安丘市\"},{\"value\":\"370785\",\"label\":\"高密市\"},{\"value\":\"370786\",\"label\":\"昌邑市\"}]},{\"value\":\"370800\",\"label\":\"济宁市\",\"children\":[{\"value\":\"370811\",\"label\":\"任城区\"},{\"value\":\"370812\",\"label\":\"兖州区\"},{\"value\":\"370826\",\"label\":\"微山县\"},{\"value\":\"370827\",\"label\":\"鱼台县\"},{\"value\":\"370828\",\"label\":\"金乡县\"},{\"value\":\"370829\",\"label\":\"嘉祥县\"},{\"value\":\"370830\",\"label\":\"汶上县\"},{\"value\":\"370831\",\"label\":\"泗水县\"},{\"value\":\"370832\",\"label\":\"梁山县\"},{\"value\":\"370881\",\"label\":\"曲阜市\"},{\"value\":\"370883\",\"label\":\"邹城市\"}]},{\"value\":\"370900\",\"label\":\"泰安市\",\"children\":[{\"value\":\"370902\",\"label\":\"泰山区\"},{\"value\":\"370911\",\"label\":\"岱岳区\"},{\"value\":\"370921\",\"label\":\"宁阳县\"},{\"value\":\"370923\",\"label\":\"东平县\"},{\"value\":\"370982\",\"label\":\"新泰市\"},{\"value\":\"370983\",\"label\":\"肥城市\"}]},{\"value\":\"371000\",\"label\":\"威海市\",\"children\":[{\"value\":\"371002\",\"label\":\"环翠区\"},{\"value\":\"371003\",\"label\":\"文登区\"},{\"value\":\"371082\",\"label\":\"荣成市\"},{\"value\":\"371083\",\"label\":\"乳山市\"}]},{\"value\":\"371100\",\"label\":\"日照市\",\"children\":[{\"value\":\"371102\",\"label\":\"东港区\"},{\"value\":\"371103\",\"label\":\"岚山区\"},{\"value\":\"371121\",\"label\":\"五莲县\"},{\"value\":\"371122\",\"label\":\"莒县\"}]},{\"value\":\"371200\",\"label\":\"莱芜市\",\"children\":[{\"value\":\"371202\",\"label\":\"莱城区\"},{\"value\":\"371203\",\"label\":\"钢城区\"}]},{\"value\":\"371300\",\"label\":\"临沂市\",\"children\":[{\"value\":\"371302\",\"label\":\"兰山区\"},{\"value\":\"371311\",\"label\":\"罗庄区\"},{\"value\":\"371312\",\"label\":\"河东区\"},{\"value\":\"371321\",\"label\":\"沂南县\"},{\"value\":\"371322\",\"label\":\"郯城县\"},{\"value\":\"371323\",\"label\":\"沂水县\"},{\"value\":\"371324\",\"label\":\"兰陵县\"},{\"value\":\"371325\",\"label\":\"费县\"},{\"value\":\"371326\",\"label\":\"平邑县\"},{\"value\":\"371327\",\"label\":\"莒南县\"},{\"value\":\"371328\",\"label\":\"蒙阴县\"},{\"value\":\"371329\",\"label\":\"临沭县\"}]},{\"value\":\"371400\",\"label\":\"德州市\",\"children\":[{\"value\":\"371402\",\"label\":\"德城区\"},{\"value\":\"371403\",\"label\":\"陵城区\"},{\"value\":\"371422\",\"label\":\"宁津县\"},{\"value\":\"371423\",\"label\":\"庆云县\"},{\"value\":\"371424\",\"label\":\"临邑县\"},{\"value\":\"371425\",\"label\":\"齐河县\"},{\"value\":\"371426\",\"label\":\"平原县\"},{\"value\":\"371427\",\"label\":\"夏津县\"},{\"value\":\"371428\",\"label\":\"武城县\"},{\"value\":\"371481\",\"label\":\"乐陵市\"},{\"value\":\"371482\",\"label\":\"禹城市\"}]},{\"value\":\"371500\",\"label\":\"聊城市\",\"children\":[{\"value\":\"371502\",\"label\":\"东昌府区\"},{\"value\":\"371521\",\"label\":\"阳谷县\"},{\"value\":\"371522\",\"label\":\"莘县\"},{\"value\":\"371523\",\"label\":\"茌平县\"},{\"value\":\"371524\",\"label\":\"东阿县\"},{\"value\":\"371525\",\"label\":\"冠县\"},{\"value\":\"371526\",\"label\":\"高唐县\"},{\"value\":\"371581\",\"label\":\"临清市\"}]},{\"value\":\"371600\",\"label\":\"滨州市\",\"children\":[{\"value\":\"371602\",\"label\":\"滨城区\"},{\"value\":\"371603\",\"label\":\"沾化区\"},{\"value\":\"371621\",\"label\":\"惠民县\"},{\"value\":\"371622\",\"label\":\"阳信县\"},{\"value\":\"371623\",\"label\":\"无棣县\"},{\"value\":\"371625\",\"label\":\"博兴县\"},{\"value\":\"371626\",\"label\":\"邹平县\"}]},{\"value\":\"371700\",\"label\":\"菏泽市\",\"children\":[{\"value\":\"371702\",\"label\":\"牡丹区\"},{\"value\":\"371703\",\"label\":\"定陶区\"},{\"value\":\"371721\",\"label\":\"曹县\"},{\"value\":\"371722\",\"label\":\"单县\"},{\"value\":\"371723\",\"label\":\"成武县\"},{\"value\":\"371724\",\"label\":\"巨野县\"},{\"value\":\"371725\",\"label\":\"郓城县\"},{\"value\":\"371726\",\"label\":\"鄄城县\"},{\"value\":\"371728\",\"label\":\"东明县\"}]}]},{\"value\":\"410000\",\"label\":\"河南省\",\"children\":[{\"value\":\"410100\",\"label\":\"郑州市\",\"children\":[{\"value\":\"410102\",\"label\":\"中原区\"},{\"value\":\"410103\",\"label\":\"二七区\"},{\"value\":\"410104\",\"label\":\"管城回族区\"},{\"value\":\"410105\",\"label\":\"金水区\"},{\"value\":\"410106\",\"label\":\"上街区\"},{\"value\":\"410108\",\"label\":\"惠济区\"},{\"value\":\"410122\",\"label\":\"中牟县\"},{\"value\":\"410181\",\"label\":\"巩义市\"},{\"value\":\"410182\",\"label\":\"荥阳市\"},{\"value\":\"410183\",\"label\":\"新密市\"},{\"value\":\"410184\",\"label\":\"新郑市\"},{\"value\":\"410185\",\"label\":\"登封市\"}]},{\"value\":\"410200\",\"label\":\"开封市\",\"children\":[{\"value\":\"410202\",\"label\":\"龙亭区\"},{\"value\":\"410203\",\"label\":\"顺河回族区\"},{\"value\":\"410204\",\"label\":\"鼓楼区\"},{\"value\":\"410205\",\"label\":\"禹王台区\"},{\"value\":\"410212\",\"label\":\"祥符区\"},{\"value\":\"410221\",\"label\":\"杞县\"},{\"value\":\"410222\",\"label\":\"通许县\"},{\"value\":\"410223\",\"label\":\"尉氏县\"},{\"value\":\"410225\",\"label\":\"兰考县\"}]},{\"value\":\"410300\",\"label\":\"洛阳市\",\"children\":[{\"value\":\"410302\",\"label\":\"老城区\"},{\"value\":\"410303\",\"label\":\"西工区\"},{\"value\":\"410304\",\"label\":\"瀍河回族区\"},{\"value\":\"410305\",\"label\":\"涧西区\"},{\"value\":\"410306\",\"label\":\"吉利区\"},{\"value\":\"410311\",\"label\":\"洛龙区\"},{\"value\":\"410322\",\"label\":\"孟津县\"},{\"value\":\"410323\",\"label\":\"新安县\"},{\"value\":\"410324\",\"label\":\"栾川县\"},{\"value\":\"410325\",\"label\":\"嵩县\"},{\"value\":\"410326\",\"label\":\"汝阳县\"},{\"value\":\"410327\",\"label\":\"宜阳县\"},{\"value\":\"410328\",\"label\":\"洛宁县\"},{\"value\":\"410329\",\"label\":\"伊川县\"},{\"value\":\"410381\",\"label\":\"偃师市\"}]},{\"value\":\"410400\",\"label\":\"平顶山市\",\"children\":[{\"value\":\"410402\",\"label\":\"新华区\"},{\"value\":\"410403\",\"label\":\"卫东区\"},{\"value\":\"410404\",\"label\":\"石龙区\"},{\"value\":\"410411\",\"label\":\"湛河区\"},{\"value\":\"410421\",\"label\":\"宝丰县\"},{\"value\":\"410422\",\"label\":\"叶县\"},{\"value\":\"410423\",\"label\":\"鲁山县\"},{\"value\":\"410425\",\"label\":\"郏县\"},{\"value\":\"410481\",\"label\":\"舞钢市\"},{\"value\":\"410482\",\"label\":\"汝州市\"}]},{\"value\":\"410500\",\"label\":\"安阳市\",\"children\":[{\"value\":\"410502\",\"label\":\"文峰区\"},{\"value\":\"410503\",\"label\":\"北关区\"},{\"value\":\"410505\",\"label\":\"殷都区\"},{\"value\":\"410506\",\"label\":\"龙安区\"},{\"value\":\"410522\",\"label\":\"安阳县\"},{\"value\":\"410523\",\"label\":\"汤阴县\"},{\"value\":\"410526\",\"label\":\"滑县\"},{\"value\":\"410527\",\"label\":\"内黄县\"},{\"value\":\"410581\",\"label\":\"林州市\"}]},{\"value\":\"410600\",\"label\":\"鹤壁市\",\"children\":[{\"value\":\"410602\",\"label\":\"鹤山区\"},{\"value\":\"410603\",\"label\":\"山城区\"},{\"value\":\"410611\",\"label\":\"淇滨区\"},{\"value\":\"410621\",\"label\":\"浚县\"},{\"value\":\"410622\",\"label\":\"淇县\"}]},{\"value\":\"410700\",\"label\":\"新乡市\",\"children\":[{\"value\":\"410702\",\"label\":\"红旗区\"},{\"value\":\"410703\",\"label\":\"卫滨区\"},{\"value\":\"410704\",\"label\":\"凤泉区\"},{\"value\":\"410711\",\"label\":\"牧野区\"},{\"value\":\"410721\",\"label\":\"新乡县\"},{\"value\":\"410724\",\"label\":\"获嘉县\"},{\"value\":\"410725\",\"label\":\"原阳县\"},{\"value\":\"410726\",\"label\":\"延津县\"},{\"value\":\"410727\",\"label\":\"封丘县\"},{\"value\":\"410728\",\"label\":\"长垣县\"},{\"value\":\"410781\",\"label\":\"卫辉市\"},{\"value\":\"410782\",\"label\":\"辉县市\"}]},{\"value\":\"410800\",\"label\":\"焦作市\",\"children\":[{\"value\":\"410802\",\"label\":\"解放区\"},{\"value\":\"410803\",\"label\":\"中站区\"},{\"value\":\"410804\",\"label\":\"马村区\"},{\"value\":\"410811\",\"label\":\"山阳区\"},{\"value\":\"410821\",\"label\":\"修武县\"},{\"value\":\"410822\",\"label\":\"博爱县\"},{\"value\":\"410823\",\"label\":\"武陟县\"},{\"value\":\"410825\",\"label\":\"温县\"},{\"value\":\"410882\",\"label\":\"沁阳市\"},{\"value\":\"410883\",\"label\":\"孟州市\"}]},{\"value\":\"410900\",\"label\":\"濮阳市\",\"children\":[{\"value\":\"410902\",\"label\":\"华龙区\"},{\"value\":\"410922\",\"label\":\"清丰县\"},{\"value\":\"410923\",\"label\":\"南乐县\"},{\"value\":\"410926\",\"label\":\"范县\"},{\"value\":\"410927\",\"label\":\"台前县\"},{\"value\":\"410928\",\"label\":\"濮阳县\"}]},{\"value\":\"411000\",\"label\":\"许昌市\",\"children\":[{\"value\":\"411002\",\"label\":\"魏都区\"},{\"value\":\"411003\",\"label\":\"建安区\"},{\"value\":\"411024\",\"label\":\"鄢陵县\"},{\"value\":\"411025\",\"label\":\"襄城县\"},{\"value\":\"411081\",\"label\":\"禹州市\"},{\"value\":\"411082\",\"label\":\"长葛市\"}]},{\"value\":\"411100\",\"label\":\"漯河市\",\"children\":[{\"value\":\"411102\",\"label\":\"源汇区\"},{\"value\":\"411103\",\"label\":\"郾城区\"},{\"value\":\"411104\",\"label\":\"召陵区\"},{\"value\":\"411121\",\"label\":\"舞阳县\"},{\"value\":\"411122\",\"label\":\"临颍县\"}]},{\"value\":\"411200\",\"label\":\"三门峡市\",\"children\":[{\"value\":\"411202\",\"label\":\"湖滨区\"},{\"value\":\"411203\",\"label\":\"陕州区\"},{\"value\":\"411221\",\"label\":\"渑池县\"},{\"value\":\"411224\",\"label\":\"卢氏县\"},{\"value\":\"411281\",\"label\":\"义马市\"},{\"value\":\"411282\",\"label\":\"灵宝市\"}]},{\"value\":\"411300\",\"label\":\"南阳市\",\"children\":[{\"value\":\"411302\",\"label\":\"宛城区\"},{\"value\":\"411303\",\"label\":\"卧龙区\"},{\"value\":\"411321\",\"label\":\"南召县\"},{\"value\":\"411322\",\"label\":\"方城县\"},{\"value\":\"411323\",\"label\":\"西峡县\"},{\"value\":\"411324\",\"label\":\"镇平县\"},{\"value\":\"411325\",\"label\":\"内乡县\"},{\"value\":\"411326\",\"label\":\"淅川县\"},{\"value\":\"411327\",\"label\":\"社旗县\"},{\"value\":\"411328\",\"label\":\"唐河县\"},{\"value\":\"411329\",\"label\":\"新野县\"},{\"value\":\"411330\",\"label\":\"桐柏县\"},{\"value\":\"411381\",\"label\":\"邓州市\"}]},{\"value\":\"411400\",\"label\":\"商丘市\",\"children\":[{\"value\":\"411402\",\"label\":\"梁园区\"},{\"value\":\"411403\",\"label\":\"睢阳区\"},{\"value\":\"411421\",\"label\":\"民权县\"},{\"value\":\"411422\",\"label\":\"睢县\"},{\"value\":\"411423\",\"label\":\"宁陵县\"},{\"value\":\"411424\",\"label\":\"柘城县\"},{\"value\":\"411425\",\"label\":\"虞城县\"},{\"value\":\"411426\",\"label\":\"夏邑县\"},{\"value\":\"411481\",\"label\":\"永城市\"}]},{\"value\":\"411500\",\"label\":\"信阳市\",\"children\":[{\"value\":\"411502\",\"label\":\"浉河区\"},{\"value\":\"411503\",\"label\":\"平桥区\"},{\"value\":\"411521\",\"label\":\"罗山县\"},{\"value\":\"411522\",\"label\":\"光山县\"},{\"value\":\"411523\",\"label\":\"新县\"},{\"value\":\"411524\",\"label\":\"商城县\"},{\"value\":\"411525\",\"label\":\"固始县\"},{\"value\":\"411526\",\"label\":\"潢川县\"},{\"value\":\"411527\",\"label\":\"淮滨县\"},{\"value\":\"411528\",\"label\":\"息县\"}]},{\"value\":\"411600\",\"label\":\"周口市\",\"children\":[{\"value\":\"411602\",\"label\":\"川汇区\"},{\"value\":\"411621\",\"label\":\"扶沟县\"},{\"value\":\"411622\",\"label\":\"西华县\"},{\"value\":\"411623\",\"label\":\"商水县\"},{\"value\":\"411624\",\"label\":\"沈丘县\"},{\"value\":\"411625\",\"label\":\"郸城县\"},{\"value\":\"411626\",\"label\":\"淮阳县\"},{\"value\":\"411627\",\"label\":\"太康县\"},{\"value\":\"411628\",\"label\":\"鹿邑县\"},{\"value\":\"411681\",\"label\":\"项城市\"}]},{\"value\":\"411700\",\"label\":\"驻马店市\",\"children\":[{\"value\":\"411702\",\"label\":\"驿城区\"},{\"value\":\"411721\",\"label\":\"西平县\"},{\"value\":\"411722\",\"label\":\"上蔡县\"},{\"value\":\"411723\",\"label\":\"平舆县\"},{\"value\":\"411724\",\"label\":\"正阳县\"},{\"value\":\"411725\",\"label\":\"确山县\"},{\"value\":\"411726\",\"label\":\"泌阳县\"},{\"value\":\"411727\",\"label\":\"汝南县\"},{\"value\":\"411728\",\"label\":\"遂平县\"},{\"value\":\"411729\",\"label\":\"新蔡县\"}]}]},{\"value\":\"420000\",\"label\":\"湖北省\",\"children\":[{\"value\":\"420100\",\"label\":\"武汉市\",\"children\":[{\"value\":\"420102\",\"label\":\"江岸区\"},{\"value\":\"420103\",\"label\":\"江汉区\"},{\"value\":\"420104\",\"label\":\"硚口区\"},{\"value\":\"420105\",\"label\":\"汉阳区\"},{\"value\":\"420106\",\"label\":\"武昌区\"},{\"value\":\"420107\",\"label\":\"青山区\"},{\"value\":\"420111\",\"label\":\"洪山区\"},{\"value\":\"420112\",\"label\":\"东西湖区\"},{\"value\":\"420113\",\"label\":\"汉南区\"},{\"value\":\"420114\",\"label\":\"蔡甸区\"},{\"value\":\"420115\",\"label\":\"江夏区\"},{\"value\":\"420116\",\"label\":\"黄陂区\"},{\"value\":\"420117\",\"label\":\"新洲区\"}]},{\"value\":\"420200\",\"label\":\"黄石市\",\"children\":[{\"value\":\"420202\",\"label\":\"黄石港区\"},{\"value\":\"420203\",\"label\":\"西塞山区\"},{\"value\":\"420204\",\"label\":\"下陆区\"},{\"value\":\"420205\",\"label\":\"铁山区\"},{\"value\":\"420222\",\"label\":\"阳新县\"},{\"value\":\"420281\",\"label\":\"大冶市\"}]},{\"value\":\"420300\",\"label\":\"十堰市\",\"children\":[{\"value\":\"420302\",\"label\":\"茅箭区\"},{\"value\":\"420303\",\"label\":\"张湾区\"},{\"value\":\"420304\",\"label\":\"郧阳区\"},{\"value\":\"420322\",\"label\":\"郧西县\"},{\"value\":\"420323\",\"label\":\"竹山县\"},{\"value\":\"420324\",\"label\":\"竹溪县\"},{\"value\":\"420325\",\"label\":\"房县\"},{\"value\":\"420381\",\"label\":\"丹江口市\"}]},{\"value\":\"420500\",\"label\":\"宜昌市\",\"children\":[{\"value\":\"420502\",\"label\":\"西陵区\"},{\"value\":\"420503\",\"label\":\"伍家岗区\"},{\"value\":\"420504\",\"label\":\"点军区\"},{\"value\":\"420505\",\"label\":\"猇亭区\"},{\"value\":\"420506\",\"label\":\"夷陵区\"},{\"value\":\"420525\",\"label\":\"远安县\"},{\"value\":\"420526\",\"label\":\"兴山县\"},{\"value\":\"420527\",\"label\":\"秭归县\"},{\"value\":\"420528\",\"label\":\"长阳土家族自治县\"},{\"value\":\"420529\",\"label\":\"五峰土家族自治县\"},{\"value\":\"420581\",\"label\":\"宜都市\"},{\"value\":\"420582\",\"label\":\"当阳市\"},{\"value\":\"420583\",\"label\":\"枝江市\"}]},{\"value\":\"420600\",\"label\":\"襄阳市\",\"children\":[{\"value\":\"420602\",\"label\":\"襄城区\"},{\"value\":\"420606\",\"label\":\"樊城区\"},{\"value\":\"420607\",\"label\":\"襄州区\"},{\"value\":\"420624\",\"label\":\"南漳县\"},{\"value\":\"420625\",\"label\":\"谷城县\"},{\"value\":\"420626\",\"label\":\"保康县\"},{\"value\":\"420682\",\"label\":\"老河口市\"},{\"value\":\"420683\",\"label\":\"枣阳市\"},{\"value\":\"420684\",\"label\":\"宜城市\"}]},{\"value\":\"420700\",\"label\":\"鄂州市\",\"children\":[{\"value\":\"420702\",\"label\":\"梁子湖区\"},{\"value\":\"420703\",\"label\":\"华容区\"},{\"value\":\"420704\",\"label\":\"鄂城区\"}]},{\"value\":\"420800\",\"label\":\"荆门市\",\"children\":[{\"value\":\"420802\",\"label\":\"东宝区\"},{\"value\":\"420804\",\"label\":\"掇刀区\"},{\"value\":\"420822\",\"label\":\"沙洋县\"},{\"value\":\"420881\",\"label\":\"钟祥市\"},{\"value\":\"420882\",\"label\":\"京山市\"}]},{\"value\":\"420900\",\"label\":\"孝感市\",\"children\":[{\"value\":\"420902\",\"label\":\"孝南区\"},{\"value\":\"420921\",\"label\":\"孝昌县\"},{\"value\":\"420922\",\"label\":\"大悟县\"},{\"value\":\"420923\",\"label\":\"云梦县\"},{\"value\":\"420981\",\"label\":\"应城市\"},{\"value\":\"420982\",\"label\":\"安陆市\"},{\"value\":\"420984\",\"label\":\"汉川市\"}]},{\"value\":\"421000\",\"label\":\"荆州市\",\"children\":[{\"value\":\"421002\",\"label\":\"沙市区\"},{\"value\":\"421003\",\"label\":\"荆州区\"},{\"value\":\"421022\",\"label\":\"公安县\"},{\"value\":\"421023\",\"label\":\"监利县\"},{\"value\":\"421024\",\"label\":\"江陵县\"},{\"value\":\"421081\",\"label\":\"石首市\"},{\"value\":\"421083\",\"label\":\"洪湖市\"},{\"value\":\"421087\",\"label\":\"松滋市\"}]},{\"value\":\"421100\",\"label\":\"黄冈市\",\"children\":[{\"value\":\"421102\",\"label\":\"黄州区\"},{\"value\":\"421121\",\"label\":\"团风县\"},{\"value\":\"421122\",\"label\":\"红安县\"},{\"value\":\"421123\",\"label\":\"罗田县\"},{\"value\":\"421124\",\"label\":\"英山县\"},{\"value\":\"421125\",\"label\":\"浠水县\"},{\"value\":\"421126\",\"label\":\"蕲春县\"},{\"value\":\"421127\",\"label\":\"黄梅县\"},{\"value\":\"421181\",\"label\":\"麻城市\"},{\"value\":\"421182\",\"label\":\"武穴市\"}]},{\"value\":\"421200\",\"label\":\"咸宁市\",\"children\":[{\"value\":\"421202\",\"label\":\"咸安区\"},{\"value\":\"421221\",\"label\":\"嘉鱼县\"},{\"value\":\"421222\",\"label\":\"通城县\"},{\"value\":\"421223\",\"label\":\"崇阳县\"},{\"value\":\"421224\",\"label\":\"通山县\"},{\"value\":\"421281\",\"label\":\"赤壁市\"}]},{\"value\":\"421300\",\"label\":\"随州市\",\"children\":[{\"value\":\"421303\",\"label\":\"曾都区\"},{\"value\":\"421321\",\"label\":\"随县\"},{\"value\":\"421381\",\"label\":\"广水市\"}]},{\"value\":\"422800\",\"label\":\"恩施土家族苗族自治州\",\"children\":[{\"value\":\"422801\",\"label\":\"恩施市\"},{\"value\":\"422802\",\"label\":\"利川市\"},{\"value\":\"422822\",\"label\":\"建始县\"},{\"value\":\"422823\",\"label\":\"巴东县\"},{\"value\":\"422825\",\"label\":\"宣恩县\"},{\"value\":\"422826\",\"label\":\"咸丰县\"},{\"value\":\"422827\",\"label\":\"来凤县\"},{\"value\":\"422828\",\"label\":\"鹤峰县\"}]}]},{\"value\":\"430000\",\"label\":\"湖南省\",\"children\":[{\"value\":\"430100\",\"label\":\"长沙市\",\"children\":[{\"value\":\"430102\",\"label\":\"芙蓉区\"},{\"value\":\"430103\",\"label\":\"天心区\"},{\"value\":\"430104\",\"label\":\"岳麓区\"},{\"value\":\"430105\",\"label\":\"开福区\"},{\"value\":\"430111\",\"label\":\"雨花区\"},{\"value\":\"430112\",\"label\":\"望城区\"},{\"value\":\"430121\",\"label\":\"长沙县\"},{\"value\":\"430181\",\"label\":\"浏阳市\"},{\"value\":\"430182\",\"label\":\"宁乡市\"}]},{\"value\":\"430200\",\"label\":\"株洲市\",\"children\":[{\"value\":\"430202\",\"label\":\"荷塘区\"},{\"value\":\"430203\",\"label\":\"芦淞区\"},{\"value\":\"430204\",\"label\":\"石峰区\"},{\"value\":\"430211\",\"label\":\"天元区\"},{\"value\":\"430212\",\"label\":\"渌口区\"},{\"value\":\"430223\",\"label\":\"攸县\"},{\"value\":\"430224\",\"label\":\"茶陵县\"},{\"value\":\"430225\",\"label\":\"炎陵县\"},{\"value\":\"430281\",\"label\":\"醴陵市\"}]},{\"value\":\"430300\",\"label\":\"湘潭市\",\"children\":[{\"value\":\"430302\",\"label\":\"雨湖区\"},{\"value\":\"430304\",\"label\":\"岳塘区\"},{\"value\":\"430321\",\"label\":\"湘潭县\"},{\"value\":\"430381\",\"label\":\"湘乡市\"},{\"value\":\"430382\",\"label\":\"韶山市\"}]},{\"value\":\"430400\",\"label\":\"衡阳市\",\"children\":[{\"value\":\"430405\",\"label\":\"珠晖区\"},{\"value\":\"430406\",\"label\":\"雁峰区\"},{\"value\":\"430407\",\"label\":\"石鼓区\"},{\"value\":\"430408\",\"label\":\"蒸湘区\"},{\"value\":\"430412\",\"label\":\"南岳区\"},{\"value\":\"430421\",\"label\":\"衡阳县\"},{\"value\":\"430422\",\"label\":\"衡南县\"},{\"value\":\"430423\",\"label\":\"衡山县\"},{\"value\":\"430424\",\"label\":\"衡东县\"},{\"value\":\"430426\",\"label\":\"祁东县\"},{\"value\":\"430481\",\"label\":\"耒阳市\"},{\"value\":\"430482\",\"label\":\"常宁市\"}]},{\"value\":\"430500\",\"label\":\"邵阳市\",\"children\":[{\"value\":\"430502\",\"label\":\"双清区\"},{\"value\":\"430503\",\"label\":\"大祥区\"},{\"value\":\"430511\",\"label\":\"北塔区\"},{\"value\":\"430521\",\"label\":\"邵东县\"},{\"value\":\"430522\",\"label\":\"新邵县\"},{\"value\":\"430523\",\"label\":\"邵阳县\"},{\"value\":\"430524\",\"label\":\"隆回县\"},{\"value\":\"430525\",\"label\":\"洞口县\"},{\"value\":\"430527\",\"label\":\"绥宁县\"},{\"value\":\"430528\",\"label\":\"新宁县\"},{\"value\":\"430529\",\"label\":\"城步苗族自治县\"},{\"value\":\"430581\",\"label\":\"武冈市\"}]},{\"value\":\"430600\",\"label\":\"岳阳市\",\"children\":[{\"value\":\"430602\",\"label\":\"岳阳楼区\"},{\"value\":\"430603\",\"label\":\"云溪区\"},{\"value\":\"430611\",\"label\":\"君山区\"},{\"value\":\"430621\",\"label\":\"岳阳县\"},{\"value\":\"430623\",\"label\":\"华容县\"},{\"value\":\"430624\",\"label\":\"湘阴县\"},{\"value\":\"430626\",\"label\":\"平江县\"},{\"value\":\"430681\",\"label\":\"汨罗市\"},{\"value\":\"430682\",\"label\":\"临湘市\"}]},{\"value\":\"430700\",\"label\":\"常德市\",\"children\":[{\"value\":\"430702\",\"label\":\"武陵区\"},{\"value\":\"430703\",\"label\":\"鼎城区\"},{\"value\":\"430721\",\"label\":\"安乡县\"},{\"value\":\"430722\",\"label\":\"汉寿县\"},{\"value\":\"430723\",\"label\":\"澧县\"},{\"value\":\"430724\",\"label\":\"临澧县\"},{\"value\":\"430725\",\"label\":\"桃源县\"},{\"value\":\"430726\",\"label\":\"石门县\"},{\"value\":\"430781\",\"label\":\"津市市\"}]},{\"value\":\"430800\",\"label\":\"张家界市\",\"children\":[{\"value\":\"430802\",\"label\":\"永定区\"},{\"value\":\"430811\",\"label\":\"武陵源区\"},{\"value\":\"430821\",\"label\":\"慈利县\"},{\"value\":\"430822\",\"label\":\"桑植县\"}]},{\"value\":\"430900\",\"label\":\"益阳市\",\"children\":[{\"value\":\"430902\",\"label\":\"资阳区\"},{\"value\":\"430903\",\"label\":\"赫山区\"},{\"value\":\"430921\",\"label\":\"南县\"},{\"value\":\"430922\",\"label\":\"桃江县\"},{\"value\":\"430923\",\"label\":\"安化县\"},{\"value\":\"430981\",\"label\":\"沅江市\"}]},{\"value\":\"431000\",\"label\":\"郴州市\",\"children\":[{\"value\":\"431002\",\"label\":\"北湖区\"},{\"value\":\"431003\",\"label\":\"苏仙区\"},{\"value\":\"431021\",\"label\":\"桂阳县\"},{\"value\":\"431022\",\"label\":\"宜章县\"},{\"value\":\"431023\",\"label\":\"永兴县\"},{\"value\":\"431024\",\"label\":\"嘉禾县\"},{\"value\":\"431025\",\"label\":\"临武县\"},{\"value\":\"431026\",\"label\":\"汝城县\"},{\"value\":\"431027\",\"label\":\"桂东县\"},{\"value\":\"431028\",\"label\":\"安仁县\"},{\"value\":\"431081\",\"label\":\"资兴市\"}]},{\"value\":\"431100\",\"label\":\"永州市\",\"children\":[{\"value\":\"431102\",\"label\":\"零陵区\"},{\"value\":\"431103\",\"label\":\"冷水滩区\"},{\"value\":\"431121\",\"label\":\"祁阳县\"},{\"value\":\"431122\",\"label\":\"东安县\"},{\"value\":\"431123\",\"label\":\"双牌县\"},{\"value\":\"431124\",\"label\":\"道县\"},{\"value\":\"431125\",\"label\":\"江永县\"},{\"value\":\"431126\",\"label\":\"宁远县\"},{\"value\":\"431127\",\"label\":\"蓝山县\"},{\"value\":\"431128\",\"label\":\"新田县\"},{\"value\":\"431129\",\"label\":\"江华瑶族自治县\"}]},{\"value\":\"431200\",\"label\":\"怀化市\",\"children\":[{\"value\":\"431202\",\"label\":\"鹤城区\"},{\"value\":\"431221\",\"label\":\"中方县\"},{\"value\":\"431222\",\"label\":\"沅陵县\"},{\"value\":\"431223\",\"label\":\"辰溪县\"},{\"value\":\"431224\",\"label\":\"溆浦县\"},{\"value\":\"431225\",\"label\":\"会同县\"},{\"value\":\"431226\",\"label\":\"麻阳苗族自治县\"},{\"value\":\"431227\",\"label\":\"新晃侗族自治县\"},{\"value\":\"431228\",\"label\":\"芷江侗族自治县\"},{\"value\":\"431229\",\"label\":\"靖州苗族侗族自治县\"},{\"value\":\"431230\",\"label\":\"通道侗族自治县\"},{\"value\":\"431281\",\"label\":\"洪江市\"}]},{\"value\":\"431300\",\"label\":\"娄底市\",\"children\":[{\"value\":\"431302\",\"label\":\"娄星区\"},{\"value\":\"431321\",\"label\":\"双峰县\"},{\"value\":\"431322\",\"label\":\"新化县\"},{\"value\":\"431381\",\"label\":\"冷水江市\"},{\"value\":\"431382\",\"label\":\"涟源市\"}]},{\"value\":\"433100\",\"label\":\"湘西土家族苗族自治州\",\"children\":[{\"value\":\"433101\",\"label\":\"吉首市\"},{\"value\":\"433122\",\"label\":\"泸溪县\"},{\"value\":\"433123\",\"label\":\"凤凰县\"},{\"value\":\"433124\",\"label\":\"花垣县\"},{\"value\":\"433125\",\"label\":\"保靖县\"},{\"value\":\"433126\",\"label\":\"古丈县\"},{\"value\":\"433127\",\"label\":\"永顺县\"},{\"value\":\"433130\",\"label\":\"龙山县\"}]}]},{\"value\":\"440000\",\"label\":\"广东省\",\"children\":[{\"value\":\"440100\",\"label\":\"广州市\",\"children\":[{\"value\":\"440103\",\"label\":\"荔湾区\"},{\"value\":\"440104\",\"label\":\"越秀区\"},{\"value\":\"440105\",\"label\":\"海珠区\"},{\"value\":\"440106\",\"label\":\"天河区\"},{\"value\":\"440111\",\"label\":\"白云区\"},{\"value\":\"440112\",\"label\":\"黄埔区\"},{\"value\":\"440113\",\"label\":\"番禺区\"},{\"value\":\"440114\",\"label\":\"花都区\"},{\"value\":\"440115\",\"label\":\"南沙区\"},{\"value\":\"440117\",\"label\":\"从化区\"},{\"value\":\"440118\",\"label\":\"增城区\"}]},{\"value\":\"440200\",\"label\":\"韶关市\",\"children\":[{\"value\":\"440203\",\"label\":\"武江区\"},{\"value\":\"440204\",\"label\":\"浈江区\"},{\"value\":\"440205\",\"label\":\"曲江区\"},{\"value\":\"440222\",\"label\":\"始兴县\"},{\"value\":\"440224\",\"label\":\"仁化县\"},{\"value\":\"440229\",\"label\":\"翁源县\"},{\"value\":\"440232\",\"label\":\"乳源瑶族自治县\"},{\"value\":\"440233\",\"label\":\"新丰县\"},{\"value\":\"440281\",\"label\":\"乐昌市\"},{\"value\":\"440282\",\"label\":\"南雄市\"}]},{\"value\":\"440300\",\"label\":\"深圳市\",\"children\":[{\"value\":\"440303\",\"label\":\"罗湖区\"},{\"value\":\"440304\",\"label\":\"福田区\"},{\"value\":\"440305\",\"label\":\"南山区\"},{\"value\":\"440306\",\"label\":\"宝安区\"},{\"value\":\"440307\",\"label\":\"龙岗区\"},{\"value\":\"440308\",\"label\":\"盐田区\"},{\"value\":\"440309\",\"label\":\"龙华区\"},{\"value\":\"440310\",\"label\":\"坪山区\"},{\"value\":\"440311\",\"label\":\"光明区\"}]},{\"value\":\"440400\",\"label\":\"珠海市\",\"children\":[{\"value\":\"440402\",\"label\":\"香洲区\"},{\"value\":\"440403\",\"label\":\"斗门区\"},{\"value\":\"440404\",\"label\":\"金湾区\"}]},{\"value\":\"440500\",\"label\":\"汕头市\",\"children\":[{\"value\":\"440507\",\"label\":\"龙湖区\"},{\"value\":\"440511\",\"label\":\"金平区\"},{\"value\":\"440512\",\"label\":\"濠江区\"},{\"value\":\"440513\",\"label\":\"潮阳区\"},{\"value\":\"440514\",\"label\":\"潮南区\"},{\"value\":\"440515\",\"label\":\"澄海区\"},{\"value\":\"440523\",\"label\":\"南澳县\"}]},{\"value\":\"440600\",\"label\":\"佛山市\",\"children\":[{\"value\":\"440604\",\"label\":\"禅城区\"},{\"value\":\"440605\",\"label\":\"南海区\"},{\"value\":\"440606\",\"label\":\"顺德区\"},{\"value\":\"440607\",\"label\":\"三水区\"},{\"value\":\"440608\",\"label\":\"高明区\"}]},{\"value\":\"440700\",\"label\":\"江门市\",\"children\":[{\"value\":\"440703\",\"label\":\"蓬江区\"},{\"value\":\"440704\",\"label\":\"江海区\"},{\"value\":\"440705\",\"label\":\"新会区\"},{\"value\":\"440781\",\"label\":\"台山市\"},{\"value\":\"440783\",\"label\":\"开平市\"},{\"value\":\"440784\",\"label\":\"鹤山市\"},{\"value\":\"440785\",\"label\":\"恩平市\"}]},{\"value\":\"440800\",\"label\":\"湛江市\",\"children\":[{\"value\":\"440802\",\"label\":\"赤坎区\"},{\"value\":\"440803\",\"label\":\"霞山区\"},{\"value\":\"440804\",\"label\":\"坡头区\"},{\"value\":\"440811\",\"label\":\"麻章区\"},{\"value\":\"440823\",\"label\":\"遂溪县\"},{\"value\":\"440825\",\"label\":\"徐闻县\"},{\"value\":\"440881\",\"label\":\"廉江市\"},{\"value\":\"440882\",\"label\":\"雷州市\"},{\"value\":\"440883\",\"label\":\"吴川市\"}]},{\"value\":\"440900\",\"label\":\"茂名市\",\"children\":[{\"value\":\"440902\",\"label\":\"茂南区\"},{\"value\":\"440904\",\"label\":\"电白区\"},{\"value\":\"440981\",\"label\":\"高州市\"},{\"value\":\"440982\",\"label\":\"化州市\"},{\"value\":\"440983\",\"label\":\"信宜市\"}]},{\"value\":\"441200\",\"label\":\"肇庆市\",\"children\":[{\"value\":\"441202\",\"label\":\"端州区\"},{\"value\":\"441203\",\"label\":\"鼎湖区\"},{\"value\":\"441204\",\"label\":\"高要区\"},{\"value\":\"441223\",\"label\":\"广宁县\"},{\"value\":\"441224\",\"label\":\"怀集县\"},{\"value\":\"441225\",\"label\":\"封开县\"},{\"value\":\"441226\",\"label\":\"德庆县\"},{\"value\":\"441284\",\"label\":\"四会市\"}]},{\"value\":\"441300\",\"label\":\"惠州市\",\"children\":[{\"value\":\"441302\",\"label\":\"惠城区\"},{\"value\":\"441303\",\"label\":\"惠阳区\"},{\"value\":\"441322\",\"label\":\"博罗县\"},{\"value\":\"441323\",\"label\":\"惠东县\"},{\"value\":\"441324\",\"label\":\"龙门县\"}]},{\"value\":\"441400\",\"label\":\"梅州市\",\"children\":[{\"value\":\"441402\",\"label\":\"梅江区\"},{\"value\":\"441403\",\"label\":\"梅县区\"},{\"value\":\"441422\",\"label\":\"大埔县\"},{\"value\":\"441423\",\"label\":\"丰顺县\"},{\"value\":\"441424\",\"label\":\"五华县\"},{\"value\":\"441426\",\"label\":\"平远县\"},{\"value\":\"441427\",\"label\":\"蕉岭县\"},{\"value\":\"441481\",\"label\":\"兴宁市\"}]},{\"value\":\"441500\",\"label\":\"汕尾市\",\"children\":[{\"value\":\"441502\",\"label\":\"城区\"},{\"value\":\"441521\",\"label\":\"海丰县\"},{\"value\":\"441523\",\"label\":\"陆河县\"},{\"value\":\"441581\",\"label\":\"陆丰市\"}]},{\"value\":\"441600\",\"label\":\"河源市\",\"children\":[{\"value\":\"441602\",\"label\":\"源城区\"},{\"value\":\"441621\",\"label\":\"紫金县\"},{\"value\":\"441622\",\"label\":\"龙川县\"},{\"value\":\"441623\",\"label\":\"连平县\"},{\"value\":\"441624\",\"label\":\"和平县\"},{\"value\":\"441625\",\"label\":\"东源县\"}]},{\"value\":\"441700\",\"label\":\"阳江市\",\"children\":[{\"value\":\"441702\",\"label\":\"江城区\"},{\"value\":\"441704\",\"label\":\"阳东区\"},{\"value\":\"441721\",\"label\":\"阳西县\"},{\"value\":\"441781\",\"label\":\"阳春市\"}]},{\"value\":\"441800\",\"label\":\"清远市\",\"children\":[{\"value\":\"441802\",\"label\":\"清城区\"},{\"value\":\"441803\",\"label\":\"清新区\"},{\"value\":\"441821\",\"label\":\"佛冈县\"},{\"value\":\"441823\",\"label\":\"阳山县\"},{\"value\":\"441825\",\"label\":\"连山壮族瑶族自治县\"},{\"value\":\"441826\",\"label\":\"连南瑶族自治县\"},{\"value\":\"441881\",\"label\":\"英德市\"},{\"value\":\"441882\",\"label\":\"连州市\"}]},{\"value\":\"441900\",\"label\":\"东莞市\",\"children\":[]},{\"value\":\"442000\",\"label\":\"中山市\",\"children\":[]},{\"value\":\"445100\",\"label\":\"潮州市\",\"children\":[{\"value\":\"445102\",\"label\":\"湘桥区\"},{\"value\":\"445103\",\"label\":\"潮安区\"},{\"value\":\"445122\",\"label\":\"饶平县\"}]},{\"value\":\"445200\",\"label\":\"揭阳市\",\"children\":[{\"value\":\"445202\",\"label\":\"榕城区\"},{\"value\":\"445203\",\"label\":\"揭东区\"},{\"value\":\"445222\",\"label\":\"揭西县\"},{\"value\":\"445224\",\"label\":\"惠来县\"},{\"value\":\"445281\",\"label\":\"普宁市\"}]},{\"value\":\"445300\",\"label\":\"云浮市\",\"children\":[{\"value\":\"445302\",\"label\":\"云城区\"},{\"value\":\"445303\",\"label\":\"云安区\"},{\"value\":\"445321\",\"label\":\"新兴县\"},{\"value\":\"445322\",\"label\":\"郁南县\"},{\"value\":\"445381\",\"label\":\"罗定市\"}]}]},{\"value\":\"450000\",\"label\":\"广西壮族自治区\",\"children\":[{\"value\":\"450100\",\"label\":\"南宁市\",\"children\":[{\"value\":\"450102\",\"label\":\"兴宁区\"},{\"value\":\"450103\",\"label\":\"青秀区\"},{\"value\":\"450105\",\"label\":\"江南区\"},{\"value\":\"450107\",\"label\":\"西乡塘区\"},{\"value\":\"450108\",\"label\":\"良庆区\"},{\"value\":\"450109\",\"label\":\"邕宁区\"},{\"value\":\"450110\",\"label\":\"武鸣区\"},{\"value\":\"450123\",\"label\":\"隆安县\"},{\"value\":\"450124\",\"label\":\"马山县\"},{\"value\":\"450125\",\"label\":\"上林县\"},{\"value\":\"450126\",\"label\":\"宾阳县\"},{\"value\":\"450127\",\"label\":\"横县\"}]},{\"value\":\"450200\",\"label\":\"柳州市\",\"children\":[{\"value\":\"450202\",\"label\":\"城中区\"},{\"value\":\"450203\",\"label\":\"鱼峰区\"},{\"value\":\"450204\",\"label\":\"柳南区\"},{\"value\":\"450205\",\"label\":\"柳北区\"},{\"value\":\"450206\",\"label\":\"柳江区\"},{\"value\":\"450222\",\"label\":\"柳城县\"},{\"value\":\"450223\",\"label\":\"鹿寨县\"},{\"value\":\"450224\",\"label\":\"融安县\"},{\"value\":\"450225\",\"label\":\"融水苗族自治县\"},{\"value\":\"450226\",\"label\":\"三江侗族自治县\"}]},{\"value\":\"450300\",\"label\":\"桂林市\",\"children\":[{\"value\":\"450302\",\"label\":\"秀峰区\"},{\"value\":\"450303\",\"label\":\"叠彩区\"},{\"value\":\"450304\",\"label\":\"象山区\"},{\"value\":\"450305\",\"label\":\"七星区\"},{\"value\":\"450311\",\"label\":\"雁山区\"},{\"value\":\"450312\",\"label\":\"临桂区\"},{\"value\":\"450321\",\"label\":\"阳朔县\"},{\"value\":\"450323\",\"label\":\"灵川县\"},{\"value\":\"450324\",\"label\":\"全州县\"},{\"value\":\"450325\",\"label\":\"兴安县\"},{\"value\":\"450326\",\"label\":\"永福县\"},{\"value\":\"450327\",\"label\":\"灌阳县\"},{\"value\":\"450328\",\"label\":\"龙胜各族自治县\"},{\"value\":\"450329\",\"label\":\"资源县\"},{\"value\":\"450330\",\"label\":\"平乐县\"},{\"value\":\"450381\",\"label\":\"荔浦市\"},{\"value\":\"450332\",\"label\":\"恭城瑶族自治县\"}]},{\"value\":\"450400\",\"label\":\"梧州市\",\"children\":[{\"value\":\"450403\",\"label\":\"万秀区\"},{\"value\":\"450405\",\"label\":\"长洲区\"},{\"value\":\"450406\",\"label\":\"龙圩区\"},{\"value\":\"450421\",\"label\":\"苍梧县\"},{\"value\":\"450422\",\"label\":\"藤县\"},{\"value\":\"450423\",\"label\":\"蒙山县\"},{\"value\":\"450481\",\"label\":\"岑溪市\"}]},{\"value\":\"450500\",\"label\":\"北海市\",\"children\":[{\"value\":\"450502\",\"label\":\"海城区\"},{\"value\":\"450503\",\"label\":\"银海区\"},{\"value\":\"450512\",\"label\":\"铁山港区\"},{\"value\":\"450521\",\"label\":\"合浦县\"}]},{\"value\":\"450600\",\"label\":\"防城港市\",\"children\":[{\"value\":\"450602\",\"label\":\"港口区\"},{\"value\":\"450603\",\"label\":\"防城区\"},{\"value\":\"450621\",\"label\":\"上思县\"},{\"value\":\"450681\",\"label\":\"东兴市\"}]},{\"value\":\"450700\",\"label\":\"钦州市\",\"children\":[{\"value\":\"450702\",\"label\":\"钦南区\"},{\"value\":\"450703\",\"label\":\"钦北区\"},{\"value\":\"450721\",\"label\":\"灵山县\"},{\"value\":\"450722\",\"label\":\"浦北县\"}]},{\"value\":\"450800\",\"label\":\"贵港市\",\"children\":[{\"value\":\"450802\",\"label\":\"港北区\"},{\"value\":\"450803\",\"label\":\"港南区\"},{\"value\":\"450804\",\"label\":\"覃塘区\"},{\"value\":\"450821\",\"label\":\"平南县\"},{\"value\":\"450881\",\"label\":\"桂平市\"}]},{\"value\":\"450900\",\"label\":\"玉林市\",\"children\":[{\"value\":\"450902\",\"label\":\"玉州区\"},{\"value\":\"450903\",\"label\":\"福绵区\"},{\"value\":\"450921\",\"label\":\"容县\"},{\"value\":\"450922\",\"label\":\"陆川县\"},{\"value\":\"450923\",\"label\":\"博白县\"},{\"value\":\"450924\",\"label\":\"兴业县\"},{\"value\":\"450981\",\"label\":\"北流市\"}]},{\"value\":\"451000\",\"label\":\"百色市\",\"children\":[{\"value\":\"451002\",\"label\":\"右江区\"},{\"value\":\"451021\",\"label\":\"田阳县\"},{\"value\":\"451022\",\"label\":\"田东县\"},{\"value\":\"451023\",\"label\":\"平果县\"},{\"value\":\"451024\",\"label\":\"德保县\"},{\"value\":\"451026\",\"label\":\"那坡县\"},{\"value\":\"451027\",\"label\":\"凌云县\"},{\"value\":\"451028\",\"label\":\"乐业县\"},{\"value\":\"451029\",\"label\":\"田林县\"},{\"value\":\"451030\",\"label\":\"西林县\"},{\"value\":\"451031\",\"label\":\"隆林各族自治县\"},{\"value\":\"451081\",\"label\":\"靖西市\"}]},{\"value\":\"451100\",\"label\":\"贺州市\",\"children\":[{\"value\":\"451102\",\"label\":\"八步区\"},{\"value\":\"451103\",\"label\":\"平桂区\"},{\"value\":\"451121\",\"label\":\"昭平县\"},{\"value\":\"451122\",\"label\":\"钟山县\"},{\"value\":\"451123\",\"label\":\"富川瑶族自治县\"}]},{\"value\":\"451200\",\"label\":\"河池市\",\"children\":[{\"value\":\"451202\",\"label\":\"金城江区\"},{\"value\":\"451203\",\"label\":\"宜州区\"},{\"value\":\"451221\",\"label\":\"南丹县\"},{\"value\":\"451222\",\"label\":\"天峨县\"},{\"value\":\"451223\",\"label\":\"凤山县\"},{\"value\":\"451224\",\"label\":\"东兰县\"},{\"value\":\"451225\",\"label\":\"罗城仫佬族自治县\"},{\"value\":\"451226\",\"label\":\"环江毛南族自治县\"},{\"value\":\"451227\",\"label\":\"巴马瑶族自治县\"},{\"value\":\"451228\",\"label\":\"都安瑶族自治县\"},{\"value\":\"451229\",\"label\":\"大化瑶族自治县\"}]},{\"value\":\"451300\",\"label\":\"来宾市\",\"children\":[{\"value\":\"451302\",\"label\":\"兴宾区\"},{\"value\":\"451321\",\"label\":\"忻城县\"},{\"value\":\"451322\",\"label\":\"象州县\"},{\"value\":\"451323\",\"label\":\"武宣县\"},{\"value\":\"451324\",\"label\":\"金秀瑶族自治县\"},{\"value\":\"451381\",\"label\":\"合山市\"}]},{\"value\":\"451400\",\"label\":\"崇左市\",\"children\":[{\"value\":\"451402\",\"label\":\"江州区\"},{\"value\":\"451421\",\"label\":\"扶绥县\"},{\"value\":\"451422\",\"label\":\"宁明县\"},{\"value\":\"451423\",\"label\":\"龙州县\"},{\"value\":\"451424\",\"label\":\"大新县\"},{\"value\":\"451425\",\"label\":\"天等县\"},{\"value\":\"451481\",\"label\":\"凭祥市\"}]}]},{\"value\":\"460000\",\"label\":\"海南省\",\"children\":[{\"value\":\"460100\",\"label\":\"海口市\",\"children\":[{\"value\":\"460105\",\"label\":\"秀英区\"},{\"value\":\"460106\",\"label\":\"龙华区\"},{\"value\":\"460107\",\"label\":\"琼山区\"},{\"value\":\"460108\",\"label\":\"美兰区\"}]},{\"value\":\"460200\",\"label\":\"三亚市\",\"children\":[{\"value\":\"460202\",\"label\":\"海棠区\"},{\"value\":\"460203\",\"label\":\"吉阳区\"},{\"value\":\"460204\",\"label\":\"天涯区\"},{\"value\":\"460205\",\"label\":\"崖州区\"}]},{\"value\":\"460300\",\"label\":\"三沙市\",\"children\":[]},{\"value\":\"460400\",\"label\":\"儋州市\",\"children\":[]}]},{\"value\":\"500000\",\"label\":\"重庆市\",\"children\":[{\"value\":\"500000\",\"label\":\"重庆市\",\"children\":[{\"value\":\"500101\",\"label\":\"万州区\"},{\"value\":\"500102\",\"label\":\"涪陵区\"},{\"value\":\"500103\",\"label\":\"渝中区\"},{\"value\":\"500104\",\"label\":\"大渡口区\"},{\"value\":\"500105\",\"label\":\"江北区\"},{\"value\":\"500106\",\"label\":\"沙坪坝区\"},{\"value\":\"500107\",\"label\":\"九龙坡区\"},{\"value\":\"500108\",\"label\":\"南岸区\"},{\"value\":\"500109\",\"label\":\"北碚区\"},{\"value\":\"500110\",\"label\":\"綦江区\"},{\"value\":\"500111\",\"label\":\"大足区\"},{\"value\":\"500112\",\"label\":\"渝北区\"},{\"value\":\"500113\",\"label\":\"巴南区\"},{\"value\":\"500114\",\"label\":\"黔江区\"},{\"value\":\"500115\",\"label\":\"长寿区\"},{\"value\":\"500116\",\"label\":\"江津区\"},{\"value\":\"500117\",\"label\":\"合川区\"},{\"value\":\"500118\",\"label\":\"永川区\"},{\"value\":\"500119\",\"label\":\"南川区\"},{\"value\":\"500120\",\"label\":\"璧山区\"},{\"value\":\"500151\",\"label\":\"铜梁区\"},{\"value\":\"500152\",\"label\":\"潼南区\"},{\"value\":\"500153\",\"label\":\"荣昌区\"},{\"value\":\"500154\",\"label\":\"开州区\"},{\"value\":\"500155\",\"label\":\"梁平区\"},{\"value\":\"500156\",\"label\":\"武隆区\"},{\"value\":\"500229\",\"label\":\"城口县\"},{\"value\":\"500230\",\"label\":\"丰都县\"},{\"value\":\"500231\",\"label\":\"垫江县\"},{\"value\":\"500233\",\"label\":\"忠县\"},{\"value\":\"500235\",\"label\":\"云阳县\"},{\"value\":\"500236\",\"label\":\"奉节县\"},{\"value\":\"500237\",\"label\":\"巫山县\"},{\"value\":\"500238\",\"label\":\"巫溪县\"},{\"value\":\"500240\",\"label\":\"石柱土家族自治县\"},{\"value\":\"500241\",\"label\":\"秀山土家族苗族自治县\"},{\"value\":\"500242\",\"label\":\"酉阳土家族苗族自治县\"},{\"value\":\"500243\",\"label\":\"彭水苗族土家族自治县\"}]}]},{\"value\":\"510000\",\"label\":\"四川省\",\"children\":[{\"value\":\"510100\",\"label\":\"成都市\",\"children\":[{\"value\":\"510104\",\"label\":\"锦江区\"},{\"value\":\"510105\",\"label\":\"青羊区\"},{\"value\":\"510106\",\"label\":\"金牛区\"},{\"value\":\"510107\",\"label\":\"武侯区\"},{\"value\":\"510108\",\"label\":\"成华区\"},{\"value\":\"510112\",\"label\":\"龙泉驿区\"},{\"value\":\"510113\",\"label\":\"青白江区\"},{\"value\":\"510114\",\"label\":\"新都区\"},{\"value\":\"510115\",\"label\":\"温江区\"},{\"value\":\"510116\",\"label\":\"双流区\"},{\"value\":\"510117\",\"label\":\"郫都区\"},{\"value\":\"510121\",\"label\":\"金堂县\"},{\"value\":\"510129\",\"label\":\"大邑县\"},{\"value\":\"510131\",\"label\":\"蒲江县\"},{\"value\":\"510132\",\"label\":\"新津县\"},{\"value\":\"510181\",\"label\":\"都江堰市\"},{\"value\":\"510182\",\"label\":\"彭州市\"},{\"value\":\"510183\",\"label\":\"邛崃市\"},{\"value\":\"510184\",\"label\":\"崇州市\"},{\"value\":\"510185\",\"label\":\"简阳市\"}]},{\"value\":\"510300\",\"label\":\"自贡市\",\"children\":[{\"value\":\"510302\",\"label\":\"自流井区\"},{\"value\":\"510303\",\"label\":\"贡井区\"},{\"value\":\"510304\",\"label\":\"大安区\"},{\"value\":\"510311\",\"label\":\"沿滩区\"},{\"value\":\"510321\",\"label\":\"荣县\"},{\"value\":\"510322\",\"label\":\"富顺县\"}]},{\"value\":\"510400\",\"label\":\"攀枝花市\",\"children\":[{\"value\":\"510402\",\"label\":\"东区\"},{\"value\":\"510403\",\"label\":\"西区\"},{\"value\":\"510411\",\"label\":\"仁和区\"},{\"value\":\"510421\",\"label\":\"米易县\"},{\"value\":\"510422\",\"label\":\"盐边县\"}]},{\"value\":\"510500\",\"label\":\"泸州市\",\"children\":[{\"value\":\"510502\",\"label\":\"江阳区\"},{\"value\":\"510503\",\"label\":\"纳溪区\"},{\"value\":\"510504\",\"label\":\"龙马潭区\"},{\"value\":\"510521\",\"label\":\"泸县\"},{\"value\":\"510522\",\"label\":\"合江县\"},{\"value\":\"510524\",\"label\":\"叙永县\"},{\"value\":\"510525\",\"label\":\"古蔺县\"}]},{\"value\":\"510600\",\"label\":\"德阳市\",\"children\":[{\"value\":\"510603\",\"label\":\"旌阳区\"},{\"value\":\"510604\",\"label\":\"罗江区\"},{\"value\":\"510623\",\"label\":\"中江县\"},{\"value\":\"510681\",\"label\":\"广汉市\"},{\"value\":\"510682\",\"label\":\"什邡市\"},{\"value\":\"510683\",\"label\":\"绵竹市\"}]},{\"value\":\"510700\",\"label\":\"绵阳市\",\"children\":[{\"value\":\"510703\",\"label\":\"涪城区\"},{\"value\":\"510704\",\"label\":\"游仙区\"},{\"value\":\"510705\",\"label\":\"安州区\"},{\"value\":\"510722\",\"label\":\"三台县\"},{\"value\":\"510723\",\"label\":\"盐亭县\"},{\"value\":\"510725\",\"label\":\"梓潼县\"},{\"value\":\"510726\",\"label\":\"北川羌族自治县\"},{\"value\":\"510727\",\"label\":\"平武县\"},{\"value\":\"510781\",\"label\":\"江油市\"}]},{\"value\":\"510800\",\"label\":\"广元市\",\"children\":[{\"value\":\"510802\",\"label\":\"利州区\"},{\"value\":\"510811\",\"label\":\"昭化区\"},{\"value\":\"510812\",\"label\":\"朝天区\"},{\"value\":\"510821\",\"label\":\"旺苍县\"},{\"value\":\"510822\",\"label\":\"青川县\"},{\"value\":\"510823\",\"label\":\"剑阁县\"},{\"value\":\"510824\",\"label\":\"苍溪县\"}]},{\"value\":\"510900\",\"label\":\"遂宁市\",\"children\":[{\"value\":\"510903\",\"label\":\"船山区\"},{\"value\":\"510904\",\"label\":\"安居区\"},{\"value\":\"510921\",\"label\":\"蓬溪县\"},{\"value\":\"510922\",\"label\":\"射洪县\"},{\"value\":\"510923\",\"label\":\"大英县\"}]},{\"value\":\"511000\",\"label\":\"内江市\",\"children\":[{\"value\":\"511002\",\"label\":\"市中区\"},{\"value\":\"511011\",\"label\":\"东兴区\"},{\"value\":\"511024\",\"label\":\"威远县\"},{\"value\":\"511025\",\"label\":\"资中县\"},{\"value\":\"511083\",\"label\":\"隆昌市\"}]},{\"value\":\"511100\",\"label\":\"乐山市\",\"children\":[{\"value\":\"511102\",\"label\":\"市中区\"},{\"value\":\"511111\",\"label\":\"沙湾区\"},{\"value\":\"511112\",\"label\":\"五通桥区\"},{\"value\":\"511113\",\"label\":\"金口河区\"},{\"value\":\"511123\",\"label\":\"犍为县\"},{\"value\":\"511124\",\"label\":\"井研县\"},{\"value\":\"511126\",\"label\":\"夹江县\"},{\"value\":\"511129\",\"label\":\"沐川县\"},{\"value\":\"511132\",\"label\":\"峨边彝族自治县\"},{\"value\":\"511133\",\"label\":\"马边彝族自治县\"},{\"value\":\"511181\",\"label\":\"峨眉山市\"}]},{\"value\":\"511300\",\"label\":\"南充市\",\"children\":[{\"value\":\"511302\",\"label\":\"顺庆区\"},{\"value\":\"511303\",\"label\":\"高坪区\"},{\"value\":\"511304\",\"label\":\"嘉陵区\"},{\"value\":\"511321\",\"label\":\"南部县\"},{\"value\":\"511322\",\"label\":\"营山县\"},{\"value\":\"511323\",\"label\":\"蓬安县\"},{\"value\":\"511324\",\"label\":\"仪陇县\"},{\"value\":\"511325\",\"label\":\"西充县\"},{\"value\":\"511381\",\"label\":\"阆中市\"}]},{\"value\":\"511400\",\"label\":\"眉山市\",\"children\":[{\"value\":\"511402\",\"label\":\"东坡区\"},{\"value\":\"511403\",\"label\":\"彭山区\"},{\"value\":\"511421\",\"label\":\"仁寿县\"},{\"value\":\"511423\",\"label\":\"洪雅县\"},{\"value\":\"511424\",\"label\":\"丹棱县\"},{\"value\":\"511425\",\"label\":\"青神县\"}]},{\"value\":\"511500\",\"label\":\"宜宾市\",\"children\":[{\"value\":\"511502\",\"label\":\"翠屏区\"},{\"value\":\"511503\",\"label\":\"南溪区\"},{\"value\":\"511521\",\"label\":\"宜宾县\"},{\"value\":\"511523\",\"label\":\"江安县\"},{\"value\":\"511524\",\"label\":\"长宁县\"},{\"value\":\"511525\",\"label\":\"高县\"},{\"value\":\"511526\",\"label\":\"珙县\"},{\"value\":\"511527\",\"label\":\"筠连县\"},{\"value\":\"511528\",\"label\":\"兴文县\"},{\"value\":\"511529\",\"label\":\"屏山县\"}]},{\"value\":\"511600\",\"label\":\"广安市\",\"children\":[{\"value\":\"511602\",\"label\":\"广安区\"},{\"value\":\"511603\",\"label\":\"前锋区\"},{\"value\":\"511621\",\"label\":\"岳池县\"},{\"value\":\"511622\",\"label\":\"武胜县\"},{\"value\":\"511623\",\"label\":\"邻水县\"},{\"value\":\"511681\",\"label\":\"华蓥市\"}]},{\"value\":\"511700\",\"label\":\"达州市\",\"children\":[{\"value\":\"511702\",\"label\":\"通川区\"},{\"value\":\"511703\",\"label\":\"达川区\"},{\"value\":\"511722\",\"label\":\"宣汉县\"},{\"value\":\"511723\",\"label\":\"开江县\"},{\"value\":\"511724\",\"label\":\"大竹县\"},{\"value\":\"511725\",\"label\":\"渠县\"},{\"value\":\"511781\",\"label\":\"万源市\"}]},{\"value\":\"511800\",\"label\":\"雅安市\",\"children\":[{\"value\":\"511802\",\"label\":\"雨城区\"},{\"value\":\"511803\",\"label\":\"名山区\"},{\"value\":\"511822\",\"label\":\"荥经县\"},{\"value\":\"511823\",\"label\":\"汉源县\"},{\"value\":\"511824\",\"label\":\"石棉县\"},{\"value\":\"511825\",\"label\":\"天全县\"},{\"value\":\"511826\",\"label\":\"芦山县\"},{\"value\":\"511827\",\"label\":\"宝兴县\"}]},{\"value\":\"511900\",\"label\":\"巴中市\",\"children\":[{\"value\":\"511902\",\"label\":\"巴州区\"},{\"value\":\"511903\",\"label\":\"恩阳区\"},{\"value\":\"511921\",\"label\":\"通江县\"},{\"value\":\"511922\",\"label\":\"南江县\"},{\"value\":\"511923\",\"label\":\"平昌县\"}]},{\"value\":\"512000\",\"label\":\"资阳市\",\"children\":[{\"value\":\"512002\",\"label\":\"雁江区\"},{\"value\":\"512021\",\"label\":\"安岳县\"},{\"value\":\"512022\",\"label\":\"乐至县\"}]},{\"value\":\"513200\",\"label\":\"阿坝藏族羌族自治州\",\"children\":[{\"value\":\"513201\",\"label\":\"马尔康市\"},{\"value\":\"513221\",\"label\":\"汶川县\"},{\"value\":\"513222\",\"label\":\"理县\"},{\"value\":\"513223\",\"label\":\"茂县\"},{\"value\":\"513224\",\"label\":\"松潘县\"},{\"value\":\"513225\",\"label\":\"九寨沟县\"},{\"value\":\"513226\",\"label\":\"金川县\"},{\"value\":\"513227\",\"label\":\"小金县\"},{\"value\":\"513228\",\"label\":\"黑水县\"},{\"value\":\"513230\",\"label\":\"壤塘县\"},{\"value\":\"513231\",\"label\":\"阿坝县\"},{\"value\":\"513232\",\"label\":\"若尔盖县\"},{\"value\":\"513233\",\"label\":\"红原县\"}]},{\"value\":\"513300\",\"label\":\"甘孜藏族自治州\",\"children\":[{\"value\":\"513301\",\"label\":\"康定市\"},{\"value\":\"513322\",\"label\":\"泸定县\"},{\"value\":\"513323\",\"label\":\"丹巴县\"},{\"value\":\"513324\",\"label\":\"九龙县\"},{\"value\":\"513325\",\"label\":\"雅江县\"},{\"value\":\"513326\",\"label\":\"道孚县\"},{\"value\":\"513327\",\"label\":\"炉霍县\"},{\"value\":\"513328\",\"label\":\"甘孜县\"},{\"value\":\"513329\",\"label\":\"新龙县\"},{\"value\":\"513330\",\"label\":\"德格县\"},{\"value\":\"513331\",\"label\":\"白玉县\"},{\"value\":\"513332\",\"label\":\"石渠县\"},{\"value\":\"513333\",\"label\":\"色达县\"},{\"value\":\"513334\",\"label\":\"理塘县\"},{\"value\":\"513335\",\"label\":\"巴塘县\"},{\"value\":\"513336\",\"label\":\"乡城县\"},{\"value\":\"513337\",\"label\":\"稻城县\"},{\"value\":\"513338\",\"label\":\"得荣县\"}]},{\"value\":\"513400\",\"label\":\"凉山彝族自治州\",\"children\":[{\"value\":\"513401\",\"label\":\"西昌市\"},{\"value\":\"513422\",\"label\":\"木里藏族自治县\"},{\"value\":\"513423\",\"label\":\"盐源县\"},{\"value\":\"513424\",\"label\":\"德昌县\"},{\"value\":\"513425\",\"label\":\"会理县\"},{\"value\":\"513426\",\"label\":\"会东县\"},{\"value\":\"513427\",\"label\":\"宁南县\"},{\"value\":\"513428\",\"label\":\"普格县\"},{\"value\":\"513429\",\"label\":\"布拖县\"},{\"value\":\"513430\",\"label\":\"金阳县\"},{\"value\":\"513431\",\"label\":\"昭觉县\"},{\"value\":\"513432\",\"label\":\"喜德县\"},{\"value\":\"513433\",\"label\":\"冕宁县\"},{\"value\":\"513434\",\"label\":\"越西县\"},{\"value\":\"513435\",\"label\":\"甘洛县\"},{\"value\":\"513436\",\"label\":\"美姑县\"},{\"value\":\"513437\",\"label\":\"雷波县\"}]}]},{\"value\":\"520000\",\"label\":\"贵州省\",\"children\":[{\"value\":\"520100\",\"label\":\"贵阳市\",\"children\":[{\"value\":\"520102\",\"label\":\"南明区\"},{\"value\":\"520103\",\"label\":\"云岩区\"},{\"value\":\"520111\",\"label\":\"花溪区\"},{\"value\":\"520112\",\"label\":\"乌当区\"},{\"value\":\"520113\",\"label\":\"白云区\"},{\"value\":\"520115\",\"label\":\"观山湖区\"},{\"value\":\"520121\",\"label\":\"开阳县\"},{\"value\":\"520122\",\"label\":\"息烽县\"},{\"value\":\"520123\",\"label\":\"修文县\"},{\"value\":\"520181\",\"label\":\"清镇市\"}]},{\"value\":\"520200\",\"label\":\"六盘水市\",\"children\":[{\"value\":\"520201\",\"label\":\"钟山区\"},{\"value\":\"520203\",\"label\":\"六枝特区\"},{\"value\":\"520221\",\"label\":\"水城县\"},{\"value\":\"520281\",\"label\":\"盘州市\"}]},{\"value\":\"520300\",\"label\":\"遵义市\",\"children\":[{\"value\":\"520302\",\"label\":\"红花岗区\"},{\"value\":\"520303\",\"label\":\"汇川区\"},{\"value\":\"520304\",\"label\":\"播州区\"},{\"value\":\"520322\",\"label\":\"桐梓县\"},{\"value\":\"520323\",\"label\":\"绥阳县\"},{\"value\":\"520324\",\"label\":\"正安县\"},{\"value\":\"520325\",\"label\":\"道真仡佬族苗族自治县\"},{\"value\":\"520326\",\"label\":\"务川仡佬族苗族自治县\"},{\"value\":\"520327\",\"label\":\"凤冈县\"},{\"value\":\"520328\",\"label\":\"湄潭县\"},{\"value\":\"520329\",\"label\":\"余庆县\"},{\"value\":\"520330\",\"label\":\"习水县\"},{\"value\":\"520381\",\"label\":\"赤水市\"},{\"value\":\"520382\",\"label\":\"仁怀市\"}]},{\"value\":\"520400\",\"label\":\"安顺市\",\"children\":[{\"value\":\"520402\",\"label\":\"西秀区\"},{\"value\":\"520403\",\"label\":\"平坝区\"},{\"value\":\"520422\",\"label\":\"普定县\"},{\"value\":\"520423\",\"label\":\"镇宁布依族苗族自治县\"},{\"value\":\"520424\",\"label\":\"关岭布依族苗族自治县\"},{\"value\":\"520425\",\"label\":\"紫云苗族布依族自治县\"}]},{\"value\":\"520500\",\"label\":\"毕节市\",\"children\":[{\"value\":\"520502\",\"label\":\"七星关区\"},{\"value\":\"520521\",\"label\":\"大方县\"},{\"value\":\"520522\",\"label\":\"黔西县\"},{\"value\":\"520523\",\"label\":\"金沙县\"},{\"value\":\"520524\",\"label\":\"织金县\"},{\"value\":\"520525\",\"label\":\"纳雍县\"},{\"value\":\"520526\",\"label\":\"威宁彝族回族苗族自治县\"},{\"value\":\"520527\",\"label\":\"赫章县\"}]},{\"value\":\"520600\",\"label\":\"铜仁市\",\"children\":[{\"value\":\"520602\",\"label\":\"碧江区\"},{\"value\":\"520603\",\"label\":\"万山区\"},{\"value\":\"520621\",\"label\":\"江口县\"},{\"value\":\"520622\",\"label\":\"玉屏侗族自治县\"},{\"value\":\"520623\",\"label\":\"石阡县\"},{\"value\":\"520624\",\"label\":\"思南县\"},{\"value\":\"520625\",\"label\":\"印江土家族苗族自治县\"},{\"value\":\"520626\",\"label\":\"德江县\"},{\"value\":\"520627\",\"label\":\"沿河土家族自治县\"},{\"value\":\"520628\",\"label\":\"松桃苗族自治县\"}]},{\"value\":\"522300\",\"label\":\"黔西南布依族苗族自治州\",\"children\":[{\"value\":\"522301\",\"label\":\"兴义市\"},{\"value\":\"522322\",\"label\":\"兴仁县\"},{\"value\":\"522323\",\"label\":\"普安县\"},{\"value\":\"522324\",\"label\":\"晴隆县\"},{\"value\":\"522325\",\"label\":\"贞丰县\"},{\"value\":\"522326\",\"label\":\"望谟县\"},{\"value\":\"522327\",\"label\":\"册亨县\"},{\"value\":\"522328\",\"label\":\"安龙县\"}]},{\"value\":\"522600\",\"label\":\"黔东南苗族侗族自治州\",\"children\":[{\"value\":\"522601\",\"label\":\"凯里市\"},{\"value\":\"522622\",\"label\":\"黄平县\"},{\"value\":\"522623\",\"label\":\"施秉县\"},{\"value\":\"522624\",\"label\":\"三穗县\"},{\"value\":\"522625\",\"label\":\"镇远县\"},{\"value\":\"522626\",\"label\":\"岑巩县\"},{\"value\":\"522627\",\"label\":\"天柱县\"},{\"value\":\"522628\",\"label\":\"锦屏县\"},{\"value\":\"522629\",\"label\":\"剑河县\"},{\"value\":\"522630\",\"label\":\"台江县\"},{\"value\":\"522631\",\"label\":\"黎平县\"},{\"value\":\"522632\",\"label\":\"榕江县\"},{\"value\":\"522633\",\"label\":\"从江县\"},{\"value\":\"522634\",\"label\":\"雷山县\"},{\"value\":\"522635\",\"label\":\"麻江县\"},{\"value\":\"522636\",\"label\":\"丹寨县\"}]},{\"value\":\"522700\",\"label\":\"黔南布依族苗族自治州\",\"children\":[{\"value\":\"522701\",\"label\":\"都匀市\"},{\"value\":\"522702\",\"label\":\"福泉市\"},{\"value\":\"522722\",\"label\":\"荔波县\"},{\"value\":\"522723\",\"label\":\"贵定县\"},{\"value\":\"522725\",\"label\":\"瓮安县\"},{\"value\":\"522726\",\"label\":\"独山县\"},{\"value\":\"522727\",\"label\":\"平塘县\"},{\"value\":\"522728\",\"label\":\"罗甸县\"},{\"value\":\"522729\",\"label\":\"长顺县\"},{\"value\":\"522730\",\"label\":\"龙里县\"},{\"value\":\"522731\",\"label\":\"惠水县\"},{\"value\":\"522732\",\"label\":\"三都水族自治县\"}]}]},{\"value\":\"530000\",\"label\":\"云南省\",\"children\":[{\"value\":\"530100\",\"label\":\"昆明市\",\"children\":[{\"value\":\"530102\",\"label\":\"五华区\"},{\"value\":\"530103\",\"label\":\"盘龙区\"},{\"value\":\"530111\",\"label\":\"官渡区\"},{\"value\":\"530112\",\"label\":\"西山区\"},{\"value\":\"530113\",\"label\":\"东川区\"},{\"value\":\"530114\",\"label\":\"呈贡区\"},{\"value\":\"530115\",\"label\":\"晋宁区\"},{\"value\":\"530124\",\"label\":\"富民县\"},{\"value\":\"530125\",\"label\":\"宜良县\"},{\"value\":\"530126\",\"label\":\"石林彝族自治县\"},{\"value\":\"530127\",\"label\":\"嵩明县\"},{\"value\":\"530128\",\"label\":\"禄劝彝族苗族自治县\"},{\"value\":\"530129\",\"label\":\"寻甸回族彝族自治县\"},{\"value\":\"530181\",\"label\":\"安宁市\"}]},{\"value\":\"530300\",\"label\":\"曲靖市\",\"children\":[{\"value\":\"530302\",\"label\":\"麒麟区\"},{\"value\":\"530303\",\"label\":\"沾益区\"},{\"value\":\"530304\",\"label\":\"马龙区\"},{\"value\":\"530322\",\"label\":\"陆良县\"},{\"value\":\"530323\",\"label\":\"师宗县\"},{\"value\":\"530324\",\"label\":\"罗平县\"},{\"value\":\"530325\",\"label\":\"富源县\"},{\"value\":\"530326\",\"label\":\"会泽县\"},{\"value\":\"530381\",\"label\":\"宣威市\"}]},{\"value\":\"530400\",\"label\":\"玉溪市\",\"children\":[{\"value\":\"530402\",\"label\":\"红塔区\"},{\"value\":\"530403\",\"label\":\"江川区\"},{\"value\":\"530422\",\"label\":\"澄江县\"},{\"value\":\"530423\",\"label\":\"通海县\"},{\"value\":\"530424\",\"label\":\"华宁县\"},{\"value\":\"530425\",\"label\":\"易门县\"},{\"value\":\"530426\",\"label\":\"峨山彝族自治县\"},{\"value\":\"530427\",\"label\":\"新平彝族傣族自治县\"},{\"value\":\"530428\",\"label\":\"元江哈尼族彝族傣族自治县\"}]},{\"value\":\"530500\",\"label\":\"保山市\",\"children\":[{\"value\":\"530502\",\"label\":\"隆阳区\"},{\"value\":\"530521\",\"label\":\"施甸县\"},{\"value\":\"530523\",\"label\":\"龙陵县\"},{\"value\":\"530524\",\"label\":\"昌宁县\"},{\"value\":\"530581\",\"label\":\"腾冲市\"}]},{\"value\":\"530600\",\"label\":\"昭通市\",\"children\":[{\"value\":\"530602\",\"label\":\"昭阳区\"},{\"value\":\"530621\",\"label\":\"鲁甸县\"},{\"value\":\"530622\",\"label\":\"巧家县\"},{\"value\":\"530623\",\"label\":\"盐津县\"},{\"value\":\"530624\",\"label\":\"大关县\"},{\"value\":\"530625\",\"label\":\"永善县\"},{\"value\":\"530626\",\"label\":\"绥江县\"},{\"value\":\"530627\",\"label\":\"镇雄县\"},{\"value\":\"530628\",\"label\":\"彝良县\"},{\"value\":\"530629\",\"label\":\"威信县\"},{\"value\":\"530681\",\"label\":\"水富市\"}]},{\"value\":\"530700\",\"label\":\"丽江市\",\"children\":[{\"value\":\"530702\",\"label\":\"古城区\"},{\"value\":\"530721\",\"label\":\"玉龙纳西族自治县\"},{\"value\":\"530722\",\"label\":\"永胜县\"},{\"value\":\"530723\",\"label\":\"华坪县\"},{\"value\":\"530724\",\"label\":\"宁蒗彝族自治县\"}]},{\"value\":\"530800\",\"label\":\"普洱市\",\"children\":[{\"value\":\"530802\",\"label\":\"思茅区\"},{\"value\":\"530821\",\"label\":\"宁洱哈尼族彝族自治县\"},{\"value\":\"530822\",\"label\":\"墨江哈尼族自治县\"},{\"value\":\"530823\",\"label\":\"景东彝族自治县\"},{\"value\":\"530824\",\"label\":\"景谷傣族彝族自治县\"},{\"value\":\"530825\",\"label\":\"镇沅彝族哈尼族拉祜族自治县\"},{\"value\":\"530826\",\"label\":\"江城哈尼族彝族自治县\"},{\"value\":\"530827\",\"label\":\"孟连傣族拉祜族佤族自治县\"},{\"value\":\"530828\",\"label\":\"澜沧拉祜族自治县\"},{\"value\":\"530829\",\"label\":\"西盟佤族自治县\"}]},{\"value\":\"530900\",\"label\":\"临沧市\",\"children\":[{\"value\":\"530902\",\"label\":\"临翔区\"},{\"value\":\"530921\",\"label\":\"凤庆县\"},{\"value\":\"530922\",\"label\":\"云县\"},{\"value\":\"530923\",\"label\":\"永德县\"},{\"value\":\"530924\",\"label\":\"镇康县\"},{\"value\":\"530925\",\"label\":\"双江拉祜族佤族布朗族傣族自治县\"},{\"value\":\"530926\",\"label\":\"耿马傣族佤族自治县\"},{\"value\":\"530927\",\"label\":\"沧源佤族自治县\"}]},{\"value\":\"532300\",\"label\":\"楚雄彝族自治州\",\"children\":[{\"value\":\"532301\",\"label\":\"楚雄市\"},{\"value\":\"532322\",\"label\":\"双柏县\"},{\"value\":\"532323\",\"label\":\"牟定县\"},{\"value\":\"532324\",\"label\":\"南华县\"},{\"value\":\"532325\",\"label\":\"姚安县\"},{\"value\":\"532326\",\"label\":\"大姚县\"},{\"value\":\"532327\",\"label\":\"永仁县\"},{\"value\":\"532328\",\"label\":\"元谋县\"},{\"value\":\"532329\",\"label\":\"武定县\"},{\"value\":\"532331\",\"label\":\"禄丰县\"}]},{\"value\":\"532500\",\"label\":\"红河哈尼族彝族自治州\",\"children\":[{\"value\":\"532501\",\"label\":\"个旧市\"},{\"value\":\"532502\",\"label\":\"开远市\"},{\"value\":\"532503\",\"label\":\"蒙自市\"},{\"value\":\"532504\",\"label\":\"弥勒市\"},{\"value\":\"532523\",\"label\":\"屏边苗族自治县\"},{\"value\":\"532524\",\"label\":\"建水县\"},{\"value\":\"532525\",\"label\":\"石屏县\"},{\"value\":\"532527\",\"label\":\"泸西县\"},{\"value\":\"532528\",\"label\":\"元阳县\"},{\"value\":\"532529\",\"label\":\"红河县\"},{\"value\":\"532530\",\"label\":\"金平苗族瑶族傣族自治县\"},{\"value\":\"532531\",\"label\":\"绿春县\"},{\"value\":\"532532\",\"label\":\"河口瑶族自治县\"}]},{\"value\":\"532600\",\"label\":\"文山壮族苗族自治州\",\"children\":[{\"value\":\"532601\",\"label\":\"文山市\"},{\"value\":\"532622\",\"label\":\"砚山县\"},{\"value\":\"532623\",\"label\":\"西畴县\"},{\"value\":\"532624\",\"label\":\"麻栗坡县\"},{\"value\":\"532625\",\"label\":\"马关县\"},{\"value\":\"532626\",\"label\":\"丘北县\"},{\"value\":\"532627\",\"label\":\"广南县\"},{\"value\":\"532628\",\"label\":\"富宁县\"}]},{\"value\":\"532800\",\"label\":\"西双版纳傣族自治州\",\"children\":[{\"value\":\"532801\",\"label\":\"景洪市\"},{\"value\":\"532822\",\"label\":\"勐海县\"},{\"value\":\"532823\",\"label\":\"勐腊县\"}]},{\"value\":\"532900\",\"label\":\"大理白族自治州\",\"children\":[{\"value\":\"532901\",\"label\":\"大理市\"},{\"value\":\"532922\",\"label\":\"漾濞彝族自治县\"},{\"value\":\"532923\",\"label\":\"祥云县\"},{\"value\":\"532924\",\"label\":\"宾川县\"},{\"value\":\"532925\",\"label\":\"弥渡县\"},{\"value\":\"532926\",\"label\":\"南涧彝族自治县\"},{\"value\":\"532927\",\"label\":\"巍山彝族回族自治县\"},{\"value\":\"532928\",\"label\":\"永平县\"},{\"value\":\"532929\",\"label\":\"云龙县\"},{\"value\":\"532930\",\"label\":\"洱源县\"},{\"value\":\"532931\",\"label\":\"剑川县\"},{\"value\":\"532932\",\"label\":\"鹤庆县\"}]},{\"value\":\"533100\",\"label\":\"德宏傣族景颇族自治州\",\"children\":[{\"value\":\"533102\",\"label\":\"瑞丽市\"},{\"value\":\"533103\",\"label\":\"芒市\"},{\"value\":\"533122\",\"label\":\"梁河县\"},{\"value\":\"533123\",\"label\":\"盈江县\"},{\"value\":\"533124\",\"label\":\"陇川县\"}]},{\"value\":\"533300\",\"label\":\"怒江傈僳族自治州\",\"children\":[{\"value\":\"533301\",\"label\":\"泸水市\"},{\"value\":\"533323\",\"label\":\"福贡县\"},{\"value\":\"533324\",\"label\":\"贡山独龙族怒族自治县\"},{\"value\":\"533325\",\"label\":\"兰坪白族普米族自治县\"}]},{\"value\":\"533400\",\"label\":\"迪庆藏族自治州\",\"children\":[{\"value\":\"533401\",\"label\":\"香格里拉市\"},{\"value\":\"533422\",\"label\":\"德钦县\"},{\"value\":\"533423\",\"label\":\"维西傈僳族自治县\"}]}]},{\"value\":\"540000\",\"label\":\"西藏自治区\",\"children\":[{\"value\":\"540100\",\"label\":\"拉萨市\",\"children\":[{\"value\":\"540102\",\"label\":\"城关区\"},{\"value\":\"540103\",\"label\":\"堆龙德庆区\"},{\"value\":\"540104\",\"label\":\"达孜区\"},{\"value\":\"540121\",\"label\":\"林周县\"},{\"value\":\"540122\",\"label\":\"当雄县\"},{\"value\":\"540123\",\"label\":\"尼木县\"},{\"value\":\"540124\",\"label\":\"曲水县\"},{\"value\":\"540127\",\"label\":\"墨竹工卡县\"}]},{\"value\":\"540200\",\"label\":\"日喀则市\",\"children\":[{\"value\":\"540202\",\"label\":\"桑珠孜区\"},{\"value\":\"540221\",\"label\":\"南木林县\"},{\"value\":\"540222\",\"label\":\"江孜县\"},{\"value\":\"540223\",\"label\":\"定日县\"},{\"value\":\"540224\",\"label\":\"萨迦县\"},{\"value\":\"540225\",\"label\":\"拉孜县\"},{\"value\":\"540226\",\"label\":\"昂仁县\"},{\"value\":\"540227\",\"label\":\"谢通门县\"},{\"value\":\"540228\",\"label\":\"白朗县\"},{\"value\":\"540229\",\"label\":\"仁布县\"},{\"value\":\"540230\",\"label\":\"康马县\"},{\"value\":\"540231\",\"label\":\"定结县\"},{\"value\":\"540232\",\"label\":\"仲巴县\"},{\"value\":\"540233\",\"label\":\"亚东县\"},{\"value\":\"540234\",\"label\":\"吉隆县\"},{\"value\":\"540235\",\"label\":\"聂拉木县\"},{\"value\":\"540236\",\"label\":\"萨嘎县\"},{\"value\":\"540237\",\"label\":\"岗巴县\"}]},{\"value\":\"540300\",\"label\":\"昌都市\",\"children\":[{\"value\":\"540302\",\"label\":\"卡若区\"},{\"value\":\"540321\",\"label\":\"江达县\"},{\"value\":\"540322\",\"label\":\"贡觉县\"},{\"value\":\"540323\",\"label\":\"类乌齐县\"},{\"value\":\"540324\",\"label\":\"丁青县\"},{\"value\":\"540325\",\"label\":\"察雅县\"},{\"value\":\"540326\",\"label\":\"八宿县\"},{\"value\":\"540327\",\"label\":\"左贡县\"},{\"value\":\"540328\",\"label\":\"芒康县\"},{\"value\":\"540329\",\"label\":\"洛隆县\"},{\"value\":\"540330\",\"label\":\"边坝县\"}]},{\"value\":\"540400\",\"label\":\"林芝市\",\"children\":[{\"value\":\"540402\",\"label\":\"巴宜区\"},{\"value\":\"540421\",\"label\":\"工布江达县\"},{\"value\":\"540422\",\"label\":\"米林县\"},{\"value\":\"540423\",\"label\":\"墨脱县\"},{\"value\":\"540424\",\"label\":\"波密县\"},{\"value\":\"540425\",\"label\":\"察隅县\"},{\"value\":\"540426\",\"label\":\"朗县\"}]},{\"value\":\"540500\",\"label\":\"山南市\",\"children\":[{\"value\":\"540502\",\"label\":\"乃东区\"},{\"value\":\"540521\",\"label\":\"扎囊县\"},{\"value\":\"540522\",\"label\":\"贡嘎县\"},{\"value\":\"540523\",\"label\":\"桑日县\"},{\"value\":\"540524\",\"label\":\"琼结县\"},{\"value\":\"540525\",\"label\":\"曲松县\"},{\"value\":\"540526\",\"label\":\"措美县\"},{\"value\":\"540527\",\"label\":\"洛扎县\"},{\"value\":\"540528\",\"label\":\"加查县\"},{\"value\":\"540529\",\"label\":\"隆子县\"},{\"value\":\"540530\",\"label\":\"错那县\"},{\"value\":\"540531\",\"label\":\"浪卡子县\"}]},{\"value\":\"540600\",\"label\":\"那曲市\",\"children\":[{\"value\":\"540602\",\"label\":\"色尼区\"},{\"value\":\"540621\",\"label\":\"嘉黎县\"},{\"value\":\"540622\",\"label\":\"比如县\"},{\"value\":\"540623\",\"label\":\"聂荣县\"},{\"value\":\"540624\",\"label\":\"安多县\"},{\"value\":\"540625\",\"label\":\"申扎县\"},{\"value\":\"540626\",\"label\":\"索县\"},{\"value\":\"540627\",\"label\":\"班戈县\"},{\"value\":\"540628\",\"label\":\"巴青县\"},{\"value\":\"540629\",\"label\":\"尼玛县\"},{\"value\":\"540630\",\"label\":\"双湖县\"}]},{\"value\":\"542500\",\"label\":\"阿里地区\",\"children\":[{\"value\":\"542521\",\"label\":\"普兰县\"},{\"value\":\"542522\",\"label\":\"札达县\"},{\"value\":\"542523\",\"label\":\"噶尔县\"},{\"value\":\"542524\",\"label\":\"日土县\"},{\"value\":\"542525\",\"label\":\"革吉县\"},{\"value\":\"542526\",\"label\":\"改则县\"},{\"value\":\"542527\",\"label\":\"措勤县\"}]}]},{\"value\":\"610000\",\"label\":\"陕西省\",\"children\":[{\"value\":\"610100\",\"label\":\"西安市\",\"children\":[{\"value\":\"610102\",\"label\":\"新城区\"},{\"value\":\"610103\",\"label\":\"碑林区\"},{\"value\":\"610104\",\"label\":\"莲湖区\"},{\"value\":\"610111\",\"label\":\"灞桥区\"},{\"value\":\"610112\",\"label\":\"未央区\"},{\"value\":\"610113\",\"label\":\"雁塔区\"},{\"value\":\"610114\",\"label\":\"阎良区\"},{\"value\":\"610115\",\"label\":\"临潼区\"},{\"value\":\"610116\",\"label\":\"长安区\"},{\"value\":\"610117\",\"label\":\"高陵区\"},{\"value\":\"610118\",\"label\":\"鄠邑区\"},{\"value\":\"610122\",\"label\":\"蓝田县\"},{\"value\":\"610124\",\"label\":\"周至县\"}]},{\"value\":\"610200\",\"label\":\"铜川市\",\"children\":[{\"value\":\"610202\",\"label\":\"王益区\"},{\"value\":\"610203\",\"label\":\"印台区\"},{\"value\":\"610204\",\"label\":\"耀州区\"},{\"value\":\"610222\",\"label\":\"宜君县\"}]},{\"value\":\"610300\",\"label\":\"宝鸡市\",\"children\":[{\"value\":\"610302\",\"label\":\"渭滨区\"},{\"value\":\"610303\",\"label\":\"金台区\"},{\"value\":\"610304\",\"label\":\"陈仓区\"},{\"value\":\"610322\",\"label\":\"凤翔县\"},{\"value\":\"610323\",\"label\":\"岐山县\"},{\"value\":\"610324\",\"label\":\"扶风县\"},{\"value\":\"610326\",\"label\":\"眉县\"},{\"value\":\"610327\",\"label\":\"陇县\"},{\"value\":\"610328\",\"label\":\"千阳县\"},{\"value\":\"610329\",\"label\":\"麟游县\"},{\"value\":\"610330\",\"label\":\"凤县\"},{\"value\":\"610331\",\"label\":\"太白县\"}]},{\"value\":\"610400\",\"label\":\"咸阳市\",\"children\":[{\"value\":\"610402\",\"label\":\"秦都区\"},{\"value\":\"610403\",\"label\":\"杨陵区\"},{\"value\":\"610404\",\"label\":\"渭城区\"},{\"value\":\"610422\",\"label\":\"三原县\"},{\"value\":\"610423\",\"label\":\"泾阳县\"},{\"value\":\"610424\",\"label\":\"乾县\"},{\"value\":\"610425\",\"label\":\"礼泉县\"},{\"value\":\"610426\",\"label\":\"永寿县\"},{\"value\":\"610428\",\"label\":\"长武县\"},{\"value\":\"610429\",\"label\":\"旬邑县\"},{\"value\":\"610430\",\"label\":\"淳化县\"},{\"value\":\"610431\",\"label\":\"武功县\"},{\"value\":\"610481\",\"label\":\"兴平市\"},{\"value\":\"610482\",\"label\":\"彬州市\"}]},{\"value\":\"610500\",\"label\":\"渭南市\",\"children\":[{\"value\":\"610502\",\"label\":\"临渭区\"},{\"value\":\"610503\",\"label\":\"华州区\"},{\"value\":\"610522\",\"label\":\"潼关县\"},{\"value\":\"610523\",\"label\":\"大荔县\"},{\"value\":\"610524\",\"label\":\"合阳县\"},{\"value\":\"610525\",\"label\":\"澄城县\"},{\"value\":\"610526\",\"label\":\"蒲城县\"},{\"value\":\"610527\",\"label\":\"白水县\"},{\"value\":\"610528\",\"label\":\"富平县\"},{\"value\":\"610581\",\"label\":\"韩城市\"},{\"value\":\"610582\",\"label\":\"华阴市\"}]},{\"value\":\"610600\",\"label\":\"延安市\",\"children\":[{\"value\":\"610602\",\"label\":\"宝塔区\"},{\"value\":\"610603\",\"label\":\"安塞区\"},{\"value\":\"610621\",\"label\":\"延长县\"},{\"value\":\"610622\",\"label\":\"延川县\"},{\"value\":\"610623\",\"label\":\"子长县\"},{\"value\":\"610625\",\"label\":\"志丹县\"},{\"value\":\"610626\",\"label\":\"吴起县\"},{\"value\":\"610627\",\"label\":\"甘泉县\"},{\"value\":\"610628\",\"label\":\"富县\"},{\"value\":\"610629\",\"label\":\"洛川县\"},{\"value\":\"610630\",\"label\":\"宜川县\"},{\"value\":\"610631\",\"label\":\"黄龙县\"},{\"value\":\"610632\",\"label\":\"黄陵县\"}]},{\"value\":\"610700\",\"label\":\"汉中市\",\"children\":[{\"value\":\"610702\",\"label\":\"汉台区\"},{\"value\":\"610703\",\"label\":\"南郑区\"},{\"value\":\"610722\",\"label\":\"城固县\"},{\"value\":\"610723\",\"label\":\"洋县\"},{\"value\":\"610724\",\"label\":\"西乡县\"},{\"value\":\"610725\",\"label\":\"勉县\"},{\"value\":\"610726\",\"label\":\"宁强县\"},{\"value\":\"610727\",\"label\":\"略阳县\"},{\"value\":\"610728\",\"label\":\"镇巴县\"},{\"value\":\"610729\",\"label\":\"留坝县\"},{\"value\":\"610730\",\"label\":\"佛坪县\"}]},{\"value\":\"610800\",\"label\":\"榆林市\",\"children\":[{\"value\":\"610802\",\"label\":\"榆阳区\"},{\"value\":\"610803\",\"label\":\"横山区\"},{\"value\":\"610822\",\"label\":\"府谷县\"},{\"value\":\"610824\",\"label\":\"靖边县\"},{\"value\":\"610825\",\"label\":\"定边县\"},{\"value\":\"610826\",\"label\":\"绥德县\"},{\"value\":\"610827\",\"label\":\"米脂县\"},{\"value\":\"610828\",\"label\":\"佳县\"},{\"value\":\"610829\",\"label\":\"吴堡县\"},{\"value\":\"610830\",\"label\":\"清涧县\"},{\"value\":\"610831\",\"label\":\"子洲县\"},{\"value\":\"610881\",\"label\":\"神木市\"}]},{\"value\":\"610900\",\"label\":\"安康市\",\"children\":[{\"value\":\"610902\",\"label\":\"汉滨区\"},{\"value\":\"610921\",\"label\":\"汉阴县\"},{\"value\":\"610922\",\"label\":\"石泉县\"},{\"value\":\"610923\",\"label\":\"宁陕县\"},{\"value\":\"610924\",\"label\":\"紫阳县\"},{\"value\":\"610925\",\"label\":\"岚皋县\"},{\"value\":\"610926\",\"label\":\"平利县\"},{\"value\":\"610927\",\"label\":\"镇坪县\"},{\"value\":\"610928\",\"label\":\"旬阳县\"},{\"value\":\"610929\",\"label\":\"白河县\"}]},{\"value\":\"611000\",\"label\":\"商洛市\",\"children\":[{\"value\":\"611002\",\"label\":\"商州区\"},{\"value\":\"611021\",\"label\":\"洛南县\"},{\"value\":\"611022\",\"label\":\"丹凤县\"},{\"value\":\"611023\",\"label\":\"商南县\"},{\"value\":\"611024\",\"label\":\"山阳县\"},{\"value\":\"611025\",\"label\":\"镇安县\"},{\"value\":\"611026\",\"label\":\"柞水县\"}]}]},{\"value\":\"620000\",\"label\":\"甘肃省\",\"children\":[{\"value\":\"620100\",\"label\":\"兰州市\",\"children\":[{\"value\":\"620102\",\"label\":\"城关区\"},{\"value\":\"620103\",\"label\":\"七里河区\"},{\"value\":\"620104\",\"label\":\"西固区\"},{\"value\":\"620105\",\"label\":\"安宁区\"},{\"value\":\"620111\",\"label\":\"红古区\"},{\"value\":\"620121\",\"label\":\"永登县\"},{\"value\":\"620122\",\"label\":\"皋兰县\"},{\"value\":\"620123\",\"label\":\"榆中县\"}]},{\"value\":\"620200\",\"label\":\"嘉峪关市\",\"children\":[]},{\"value\":\"620300\",\"label\":\"金昌市\",\"children\":[{\"value\":\"620302\",\"label\":\"金川区\"},{\"value\":\"620321\",\"label\":\"永昌县\"}]},{\"value\":\"620400\",\"label\":\"白银市\",\"children\":[{\"value\":\"620402\",\"label\":\"白银区\"},{\"value\":\"620403\",\"label\":\"平川区\"},{\"value\":\"620421\",\"label\":\"靖远县\"},{\"value\":\"620422\",\"label\":\"会宁县\"},{\"value\":\"620423\",\"label\":\"景泰县\"}]},{\"value\":\"620500\",\"label\":\"天水市\",\"children\":[{\"value\":\"620502\",\"label\":\"秦州区\"},{\"value\":\"620503\",\"label\":\"麦积区\"},{\"value\":\"620521\",\"label\":\"清水县\"},{\"value\":\"620522\",\"label\":\"秦安县\"},{\"value\":\"620523\",\"label\":\"甘谷县\"},{\"value\":\"620524\",\"label\":\"武山县\"},{\"value\":\"620525\",\"label\":\"张家川回族自治县\"}]},{\"value\":\"620600\",\"label\":\"武威市\",\"children\":[{\"value\":\"620602\",\"label\":\"凉州区\"},{\"value\":\"620621\",\"label\":\"民勤县\"},{\"value\":\"620622\",\"label\":\"古浪县\"},{\"value\":\"620623\",\"label\":\"天祝藏族自治县\"}]},{\"value\":\"620700\",\"label\":\"张掖市\",\"children\":[{\"value\":\"620702\",\"label\":\"甘州区\"},{\"value\":\"620721\",\"label\":\"肃南裕固族自治县\"},{\"value\":\"620722\",\"label\":\"民乐县\"},{\"value\":\"620723\",\"label\":\"临泽县\"},{\"value\":\"620724\",\"label\":\"高台县\"},{\"value\":\"620725\",\"label\":\"山丹县\"}]},{\"value\":\"620800\",\"label\":\"平凉市\",\"children\":[{\"value\":\"620802\",\"label\":\"崆峒区\"},{\"value\":\"620821\",\"label\":\"泾川县\"},{\"value\":\"620822\",\"label\":\"灵台县\"},{\"value\":\"620823\",\"label\":\"崇信县\"},{\"value\":\"620825\",\"label\":\"庄浪县\"},{\"value\":\"620826\",\"label\":\"静宁县\"},{\"value\":\"620881\",\"label\":\"华亭市\"}]},{\"value\":\"620900\",\"label\":\"酒泉市\",\"children\":[{\"value\":\"620902\",\"label\":\"肃州区\"},{\"value\":\"620921\",\"label\":\"金塔县\"},{\"value\":\"620922\",\"label\":\"瓜州县\"},{\"value\":\"620923\",\"label\":\"肃北蒙古族自治县\"},{\"value\":\"620924\",\"label\":\"阿克塞哈萨克族自治县\"},{\"value\":\"620981\",\"label\":\"玉门市\"},{\"value\":\"620982\",\"label\":\"敦煌市\"}]},{\"value\":\"621000\",\"label\":\"庆阳市\",\"children\":[{\"value\":\"621002\",\"label\":\"西峰区\"},{\"value\":\"621021\",\"label\":\"庆城县\"},{\"value\":\"621022\",\"label\":\"环县\"},{\"value\":\"621023\",\"label\":\"华池县\"},{\"value\":\"621024\",\"label\":\"合水县\"},{\"value\":\"621025\",\"label\":\"正宁县\"},{\"value\":\"621026\",\"label\":\"宁县\"},{\"value\":\"621027\",\"label\":\"镇原县\"}]},{\"value\":\"621100\",\"label\":\"定西市\",\"children\":[{\"value\":\"621102\",\"label\":\"安定区\"},{\"value\":\"621121\",\"label\":\"通渭县\"},{\"value\":\"621122\",\"label\":\"陇西县\"},{\"value\":\"621123\",\"label\":\"渭源县\"},{\"value\":\"621124\",\"label\":\"临洮县\"},{\"value\":\"621125\",\"label\":\"漳县\"},{\"value\":\"621126\",\"label\":\"岷县\"}]},{\"value\":\"621200\",\"label\":\"陇南市\",\"children\":[{\"value\":\"621202\",\"label\":\"武都区\"},{\"value\":\"621221\",\"label\":\"成县\"},{\"value\":\"621222\",\"label\":\"文县\"},{\"value\":\"621223\",\"label\":\"宕昌县\"},{\"value\":\"621224\",\"label\":\"康县\"},{\"value\":\"621225\",\"label\":\"西和县\"},{\"value\":\"621226\",\"label\":\"礼县\"},{\"value\":\"621227\",\"label\":\"徽县\"},{\"value\":\"621228\",\"label\":\"两当县\"}]},{\"value\":\"622900\",\"label\":\"临夏回族自治州\",\"children\":[{\"value\":\"622901\",\"label\":\"临夏市\"},{\"value\":\"622921\",\"label\":\"临夏县\"},{\"value\":\"622922\",\"label\":\"康乐县\"},{\"value\":\"622923\",\"label\":\"永靖县\"},{\"value\":\"622924\",\"label\":\"广河县\"},{\"value\":\"622925\",\"label\":\"和政县\"},{\"value\":\"622926\",\"label\":\"东乡族自治县\"},{\"value\":\"622927\",\"label\":\"积石山保安族东乡族撒拉族自治县\"}]},{\"value\":\"623000\",\"label\":\"甘南藏族自治州\",\"children\":[{\"value\":\"623001\",\"label\":\"合作市\"},{\"value\":\"623021\",\"label\":\"临潭县\"},{\"value\":\"623022\",\"label\":\"卓尼县\"},{\"value\":\"623023\",\"label\":\"舟曲县\"},{\"value\":\"623024\",\"label\":\"迭部县\"},{\"value\":\"623025\",\"label\":\"玛曲县\"},{\"value\":\"623026\",\"label\":\"碌曲县\"},{\"value\":\"623027\",\"label\":\"夏河县\"}]}]},{\"value\":\"630000\",\"label\":\"青海省\",\"children\":[{\"value\":\"630100\",\"label\":\"西宁市\",\"children\":[{\"value\":\"630102\",\"label\":\"城东区\"},{\"value\":\"630103\",\"label\":\"城中区\"},{\"value\":\"630104\",\"label\":\"城西区\"},{\"value\":\"630105\",\"label\":\"城北区\"},{\"value\":\"630121\",\"label\":\"大通回族土族自治县\"},{\"value\":\"630122\",\"label\":\"湟中县\"},{\"value\":\"630123\",\"label\":\"湟源县\"}]},{\"value\":\"630200\",\"label\":\"海东市\",\"children\":[{\"value\":\"630202\",\"label\":\"乐都区\"},{\"value\":\"630203\",\"label\":\"平安区\"},{\"value\":\"630222\",\"label\":\"民和回族土族自治县\"},{\"value\":\"630223\",\"label\":\"互助土族自治县\"},{\"value\":\"630224\",\"label\":\"化隆回族自治县\"},{\"value\":\"630225\",\"label\":\"循化撒拉族自治县\"}]},{\"value\":\"632200\",\"label\":\"海北藏族自治州\",\"children\":[{\"value\":\"632221\",\"label\":\"门源回族自治县\"},{\"value\":\"632222\",\"label\":\"祁连县\"},{\"value\":\"632223\",\"label\":\"海晏县\"},{\"value\":\"632224\",\"label\":\"刚察县\"}]},{\"value\":\"632300\",\"label\":\"黄南藏族自治州\",\"children\":[{\"value\":\"632321\",\"label\":\"同仁县\"},{\"value\":\"632322\",\"label\":\"尖扎县\"},{\"value\":\"632323\",\"label\":\"泽库县\"},{\"value\":\"632324\",\"label\":\"河南蒙古族自治县\"}]},{\"value\":\"632500\",\"label\":\"海南藏族自治州\",\"children\":[{\"value\":\"632521\",\"label\":\"共和县\"},{\"value\":\"632522\",\"label\":\"同德县\"},{\"value\":\"632523\",\"label\":\"贵德县\"},{\"value\":\"632524\",\"label\":\"兴海县\"},{\"value\":\"632525\",\"label\":\"贵南县\"}]},{\"value\":\"632600\",\"label\":\"果洛藏族自治州\",\"children\":[{\"value\":\"632621\",\"label\":\"玛沁县\"},{\"value\":\"632622\",\"label\":\"班玛县\"},{\"value\":\"632623\",\"label\":\"甘德县\"},{\"value\":\"632624\",\"label\":\"达日县\"},{\"value\":\"632625\",\"label\":\"久治县\"},{\"value\":\"632626\",\"label\":\"玛多县\"}]},{\"value\":\"632700\",\"label\":\"玉树藏族自治州\",\"children\":[{\"value\":\"632701\",\"label\":\"玉树市\"},{\"value\":\"632722\",\"label\":\"杂多县\"},{\"value\":\"632723\",\"label\":\"称多县\"},{\"value\":\"632724\",\"label\":\"治多县\"},{\"value\":\"632725\",\"label\":\"囊谦县\"},{\"value\":\"632726\",\"label\":\"曲麻莱县\"}]},{\"value\":\"632800\",\"label\":\"海西蒙古族藏族自治州\",\"children\":[{\"value\":\"632801\",\"label\":\"格尔木市\"},{\"value\":\"632802\",\"label\":\"德令哈市\"},{\"value\":\"632803\",\"label\":\"茫崖市\"},{\"value\":\"632821\",\"label\":\"乌兰县\"},{\"value\":\"632822\",\"label\":\"都兰县\"},{\"value\":\"632823\",\"label\":\"天峻县\"}]}]},{\"value\":\"640000\",\"label\":\"宁夏回族自治区\",\"children\":[{\"value\":\"640100\",\"label\":\"银川市\",\"children\":[{\"value\":\"640104\",\"label\":\"兴庆区\"},{\"value\":\"640105\",\"label\":\"西夏区\"},{\"value\":\"640106\",\"label\":\"金凤区\"},{\"value\":\"640121\",\"label\":\"永宁县\"},{\"value\":\"640122\",\"label\":\"贺兰县\"},{\"value\":\"640181\",\"label\":\"灵武市\"}]},{\"value\":\"640200\",\"label\":\"石嘴山市\",\"children\":[{\"value\":\"640202\",\"label\":\"大武口区\"},{\"value\":\"640205\",\"label\":\"惠农区\"},{\"value\":\"640221\",\"label\":\"平罗县\"}]},{\"value\":\"640300\",\"label\":\"吴忠市\",\"children\":[{\"value\":\"640302\",\"label\":\"利通区\"},{\"value\":\"640303\",\"label\":\"红寺堡区\"},{\"value\":\"640323\",\"label\":\"盐池县\"},{\"value\":\"640324\",\"label\":\"同心县\"},{\"value\":\"640381\",\"label\":\"青铜峡市\"}]},{\"value\":\"640400\",\"label\":\"固原市\",\"children\":[{\"value\":\"640402\",\"label\":\"原州区\"},{\"value\":\"640422\",\"label\":\"西吉县\"},{\"value\":\"640423\",\"label\":\"隆德县\"},{\"value\":\"640424\",\"label\":\"泾源县\"},{\"value\":\"640425\",\"label\":\"彭阳县\"}]},{\"value\":\"640500\",\"label\":\"中卫市\",\"children\":[{\"value\":\"640502\",\"label\":\"沙坡头区\"},{\"value\":\"640521\",\"label\":\"中宁县\"},{\"value\":\"640522\",\"label\":\"海原县\"}]}]},{\"value\":\"650000\",\"label\":\"新疆维吾尔自治区\",\"children\":[{\"value\":\"650100\",\"label\":\"乌鲁木齐市\",\"children\":[{\"value\":\"650102\",\"label\":\"天山区\"},{\"value\":\"650103\",\"label\":\"沙依巴克区\"},{\"value\":\"650104\",\"label\":\"新市区\"},{\"value\":\"650105\",\"label\":\"水磨沟区\"},{\"value\":\"650106\",\"label\":\"头屯河区\"},{\"value\":\"650107\",\"label\":\"达坂城区\"},{\"value\":\"650109\",\"label\":\"米东区\"},{\"value\":\"650121\",\"label\":\"乌鲁木齐县\"}]},{\"value\":\"650200\",\"label\":\"克拉玛依市\",\"children\":[{\"value\":\"650202\",\"label\":\"独山子区\"},{\"value\":\"650203\",\"label\":\"克拉玛依区\"},{\"value\":\"650204\",\"label\":\"白碱滩区\"},{\"value\":\"650205\",\"label\":\"乌尔禾区\"}]},{\"value\":\"650400\",\"label\":\"吐鲁番市\",\"children\":[{\"value\":\"650402\",\"label\":\"高昌区\"},{\"value\":\"650421\",\"label\":\"鄯善县\"},{\"value\":\"650422\",\"label\":\"托克逊县\"}]},{\"value\":\"650500\",\"label\":\"哈密市\",\"children\":[{\"value\":\"650502\",\"label\":\"伊州区\"},{\"value\":\"650521\",\"label\":\"巴里坤哈萨克自治县\"},{\"value\":\"650522\",\"label\":\"伊吾县\"}]},{\"value\":\"652300\",\"label\":\"昌吉回族自治州\",\"children\":[{\"value\":\"652301\",\"label\":\"昌吉市\"},{\"value\":\"652302\",\"label\":\"阜康市\"},{\"value\":\"652323\",\"label\":\"呼图壁县\"},{\"value\":\"652324\",\"label\":\"玛纳斯县\"},{\"value\":\"652325\",\"label\":\"奇台县\"},{\"value\":\"652327\",\"label\":\"吉木萨尔县\"},{\"value\":\"652328\",\"label\":\"木垒哈萨克自治县\"}]},{\"value\":\"652700\",\"label\":\"博尔塔拉蒙古自治州\",\"children\":[{\"value\":\"652701\",\"label\":\"博乐市\"},{\"value\":\"652702\",\"label\":\"阿拉山口市\"},{\"value\":\"652722\",\"label\":\"精河县\"},{\"value\":\"652723\",\"label\":\"温泉县\"}]},{\"value\":\"652800\",\"label\":\"巴音郭楞蒙古自治州\",\"children\":[{\"value\":\"652801\",\"label\":\"库尔勒市\"},{\"value\":\"652822\",\"label\":\"轮台县\"},{\"value\":\"652823\",\"label\":\"尉犁县\"},{\"value\":\"652824\",\"label\":\"若羌县\"},{\"value\":\"652825\",\"label\":\"且末县\"},{\"value\":\"652826\",\"label\":\"焉耆回族自治县\"},{\"value\":\"652827\",\"label\":\"和静县\"},{\"value\":\"652828\",\"label\":\"和硕县\"},{\"value\":\"652829\",\"label\":\"博湖县\"}]},{\"value\":\"652900\",\"label\":\"阿克苏地区\",\"children\":[{\"value\":\"652901\",\"label\":\"阿克苏市\"},{\"value\":\"652922\",\"label\":\"温宿县\"},{\"value\":\"652923\",\"label\":\"库车县\"},{\"value\":\"652924\",\"label\":\"沙雅县\"},{\"value\":\"652925\",\"label\":\"新和县\"},{\"value\":\"652926\",\"label\":\"拜城县\"},{\"value\":\"652927\",\"label\":\"乌什县\"},{\"value\":\"652928\",\"label\":\"阿瓦提县\"},{\"value\":\"652929\",\"label\":\"柯坪县\"}]},{\"value\":\"653000\",\"label\":\"克孜勒苏柯尔克孜自治州\",\"children\":[{\"value\":\"653001\",\"label\":\"阿图什市\"},{\"value\":\"653022\",\"label\":\"阿克陶县\"},{\"value\":\"653023\",\"label\":\"阿合奇县\"},{\"value\":\"653024\",\"label\":\"乌恰县\"}]},{\"value\":\"653100\",\"label\":\"喀什地区\",\"children\":[{\"value\":\"653101\",\"label\":\"喀什市\"},{\"value\":\"653121\",\"label\":\"疏附县\"},{\"value\":\"653122\",\"label\":\"疏勒县\"},{\"value\":\"653123\",\"label\":\"英吉沙县\"},{\"value\":\"653124\",\"label\":\"泽普县\"},{\"value\":\"653125\",\"label\":\"莎车县\"},{\"value\":\"653126\",\"label\":\"叶城县\"},{\"value\":\"653127\",\"label\":\"麦盖提县\"},{\"value\":\"653128\",\"label\":\"岳普湖县\"},{\"value\":\"653129\",\"label\":\"伽师县\"},{\"value\":\"653130\",\"label\":\"巴楚县\"},{\"value\":\"653131\",\"label\":\"塔什库尔干塔吉克自治县\"}]},{\"value\":\"653200\",\"label\":\"和田地区\",\"children\":[{\"value\":\"653201\",\"label\":\"和田市\"},{\"value\":\"653221\",\"label\":\"和田县\"},{\"value\":\"653222\",\"label\":\"墨玉县\"},{\"value\":\"653223\",\"label\":\"皮山县\"},{\"value\":\"653224\",\"label\":\"洛浦县\"},{\"value\":\"653225\",\"label\":\"策勒县\"},{\"value\":\"653226\",\"label\":\"于田县\"},{\"value\":\"653227\",\"label\":\"民丰县\"}]},{\"value\":\"654000\",\"label\":\"伊犁哈萨克自治州\",\"children\":[{\"value\":\"654002\",\"label\":\"伊宁市\"},{\"value\":\"654003\",\"label\":\"奎屯市\"},{\"value\":\"654004\",\"label\":\"霍尔果斯市\"},{\"value\":\"654021\",\"label\":\"伊宁县\"},{\"value\":\"654022\",\"label\":\"察布查尔锡伯自治县\"},{\"value\":\"654023\",\"label\":\"霍城县\"},{\"value\":\"654024\",\"label\":\"巩留县\"},{\"value\":\"654025\",\"label\":\"新源县\"},{\"value\":\"654026\",\"label\":\"昭苏县\"},{\"value\":\"654027\",\"label\":\"特克斯县\"},{\"value\":\"654028\",\"label\":\"尼勒克县\"}]},{\"value\":\"654200\",\"label\":\"塔城地区\",\"children\":[{\"value\":\"654201\",\"label\":\"塔城市\"},{\"value\":\"654202\",\"label\":\"乌苏市\"},{\"value\":\"654221\",\"label\":\"额敏县\"},{\"value\":\"654223\",\"label\":\"沙湾县\"},{\"value\":\"654224\",\"label\":\"托里县\"},{\"value\":\"654225\",\"label\":\"裕民县\"},{\"value\":\"654226\",\"label\":\"和布克赛尔蒙古自治县\"}]},{\"value\":\"654300\",\"label\":\"阿勒泰地区\",\"children\":[{\"value\":\"654301\",\"label\":\"阿勒泰市\"},{\"value\":\"654321\",\"label\":\"布尔津县\"},{\"value\":\"654322\",\"label\":\"富蕴县\"},{\"value\":\"654323\",\"label\":\"福海县\"},{\"value\":\"654324\",\"label\":\"哈巴河县\"},{\"value\":\"654325\",\"label\":\"青河县\"},{\"value\":\"654326\",\"label\":\"吉木乃县\"}]}]},{\"value\":\"710000\",\"label\":\"台湾省\",\"children\":[{\"value\":\"710000\",\"label\":\"台湾省\",\"children\":[{\"value\":\"710000\",\"label\":\"台湾省\"}]}]},{\"value\":\"810000\",\"label\":\"香港特别行政区\",\"children\":[{\"value\":\"810000\",\"label\":\"香港特别行政区\",\"children\":[{\"value\":\"810000\",\"label\":\"香港特别行政区\"}]}]},{\"value\":\"820000\",\"label\":\"澳门特别行政区\",\"children\":[{\"value\":\"820000\",\"label\":\"澳门特别行政区\",\"children\":[{\"value\":\"820000\",\"label\":\"澳门特别行政区\"}]}]}]"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/area_options.json",
    "content": "[\n  {\"value\": \"110000\", \"label\": \"北京市\"},\n  {\"value\": \"120000\", \"label\": \"天津市\"},\n  {\"value\": \"130000\", \"label\": \"河北省\"},\n  {\"value\": \"140000\", \"label\": \"山西省\"},\n  {\"value\": \"150000\", \"label\": \"内蒙古自治区\"},\n  {\"value\": \"210000\", \"label\": \"辽宁省\"},\n  {\"value\": \"220000\", \"label\": \"吉林省\"},\n  {\"value\": \"230000\", \"label\": \"黑龙江省\"},\n  {\"value\": \"310000\", \"label\": \"上海市\"},\n  {\"value\": \"320000\", \"label\": \"江苏省\"},\n  {\"value\": \"330000\", \"label\": \"浙江省\"},\n  {\"value\": \"340000\", \"label\": \"安徽省\"},\n  {\"value\": \"350000\", \"label\": \"福建省\"},\n  {\"value\": \"360000\", \"label\": \"江西省\"},\n  {\"value\": \"370000\", \"label\": \"山东省\"},\n  {\"value\": \"410000\", \"label\": \"河南省\"},\n  {\"value\": \"420000\", \"label\": \"湖北省\"},\n  {\"value\": \"430000\", \"label\": \"湖南省\"},\n  {\"value\": \"440000\", \"label\": \"广东省\"},\n  {\"value\": \"450000\", \"label\": \"广西壮族自治区\"},\n  {\"value\": \"460000\", \"label\": \"海南省\"},\n  {\"value\": \"500000\", \"label\": \"重庆市\"},\n  {\"value\": \"510000\", \"label\": \"四川省\"},\n  {\"value\": \"520000\", \"label\": \"贵州省\"},\n  {\"value\": \"530000\", \"label\": \"云南省\"},\n  {\"value\": \"540000\", \"label\": \"西藏自治区\"},\n  {\"value\": \"610000\", \"label\": \"陕西省\"},\n  {\"value\": \"620000\", \"label\": \"甘肃省\"},\n  {\"value\": \"630000\", \"label\": \"青海省\"},\n  {\"value\": \"640000\", \"label\": \"宁夏回族自治区\"},\n  {\"value\": \"650000\", \"label\": \"新疆维吾尔自治区\"},\n  {\"value\": \"710000\", \"label\": \"台湾省\"},\n  {\"value\": \"810000\", \"label\": \"香港特别行政区\"},\n  {\"value\": \"820000\", \"label\": \"澳门特别行政区\"}\n]"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/asyn_tree_list_0.json",
    "content": "[\n  {\n    \"id\": 1,\n    \"name\": \"首页\",\n    \"component\": \"dashboard/Analysis\",\n    \"orderNum\": 1,\n    \"hasChildren\": false\n  },\n  {\n    \"id\": 2,\n    \"name\": \"常见案例\",\n    \"component\": \"layouts/RouteView\",\n    \"orderNum\": 2,\n    \"hasChildren\": true\n  },\n  {\n    \"id\": 3,\n    \"name\": \"系统监控\",\n    \"component\": \"layouts/RouteView\",\n    \"orderNum\": 3,\n    \"hasChildren\": true\n  }\n]"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/asyn_tree_list_1.json",
    "content": "[\n  {\n    \"id\": 11,\n    \"name\": \"首页\",\n    \"component\": \"dashboard/Analysis\",\n    \"orderNum\": 1,\n    \"hasChildren\": false\n  },\n  {\n    \"id\": 12,\n    \"name\": \"系统管理\",\n    \"component\": \"layouts/RouteView\",\n    \"orderNum\": 2,\n    \"hasChildren\": true\n  },\n  {\n    \"id\": 13,\n    \"name\": \"常见案例\",\n    \"component\": \"layouts/RouteView\",\n    \"orderNum\": 3,\n    \"hasChildren\": true\n  }\n]"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/asyn_tree_list_2.json",
    "content": "[\n  {\n    \"id\": 21,\n    \"name\": \"弹框选择Demo\",\n    \"component\": \"jeecg/SelectDemo\",\n    \"orderNum\": 1,\n    \"hasChildren\": false\n  },\n  {\n    \"id\": 22,\n    \"name\": \"单表模型示例\",\n    \"component\": \"jeecg/JeecgDemoList\",\n    \"orderNum\": 2,\n    \"hasChildren\": false\n  },\n  {\n    \"id\": 23,\n    \"name\": \"一对多Tab示例\",\n    \"component\": \"jeecg/tablist/JeecgOrderDMainList\",\n    \"orderNum\": 3,\n    \"hasChildren\": false\n  }\n]"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/asyn_tree_list_3.json",
    "content": "[\n  {\n    \"id\": 31,\n    \"name\": \"性能监控\",\n    \"component\": \"layouts/RouteView\",\n    \"orderNum\": 1,\n    \"hasChildren\": true\n  },\n  {\n    \"id\": 32,\n    \"name\": \"在线文档\",\n    \"component\": \"layouts/IframePageView\",\n    \"orderNum\": 2,\n    \"hasChildren\": false\n  },\n  {\n    \"id\": 33,\n    \"name\": \"工作台\",\n    \"component\": \"dashboard/Workplace\",\n    \"orderNum\": 3,\n    \"hasChildren\": false\n  }\n]"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/asyn_tree_list_31.json",
    "content": "[\n  {\n    \"id\": 311,\n    \"name\": \"Redis监控\",\n    \"component\": \"modules/monitor/RedisInfo\",\n    \"orderNum\": 1,\n    \"hasChildren\": false\n  },\n  {\n    \"id\": 312,\n    \"name\": \"JVM信息\",\n    \"component\": \"modules/monitor/JvmInfo\",\n    \"orderNum\": 2,\n    \"hasChildren\": false\n  },\n  {\n    \"id\": 313,\n    \"name\": \"Tomcat信息\",\n    \"component\": \"modules/monitor/TomcatInfo\",\n    \"orderNum\": 3,\n    \"hasChildren\": false\n  }\n]"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/getCntrNoCountInfo.json",
    "content": "{\n\t\"success\": true,\n\t\"message\": \"查询成功\",\n\t\"code\": null,\n\t\"result\": [\n\t\t{\n\t\t\t\"resultIndex\": 0,\n\t\t\t\"yearcount\": 623,\n\t\t\t\"year\": 2016,\n\t\t\t\"month\": \"四月\",\n\t\t\t\"monthcount\": 3255,\n\t\t\t\"classifyname\": \"证明类\",\n\t\t\t\"cntrnocount\": 24,\n\t\t\t\"cabinetname\": \"一号柜\",\n\t\t\t\"cabinetcocunt\": 12\n\t\t},\n\t\t{\n\t\t\t\"resultIndex\": 1,\n\t\t\t\"yearcount\": 243,\n\t\t\t\"year\": 2017,\n\t\t\t\"month\": \"五月\",\n\t\t\t\"monthcount\": 5673,\n\t\t\t\"classifyname\": \"产权类\",\n\t\t\t\"cntrnocount\": 52,\n\t\t\t\"cabinetname\": \"二号柜\",\n\t\t\t\"cabinetcocunt\": 52\n\t\t},\n\t\t{\n\t\t\t\"resultIndex\": 2,\n\t\t\t\"yearcount\": 345,\n\t\t\t\"year\": 2018,\n\t\t\t\"month\": \"六月\",\n\t\t\t\"monthcount\": 2673,\n\t\t\t\"classifyname\": \"知识类\",\n\t\t\t\"cntrnocount\": 85,\n\t\t\t\"cabinetname\": \"三号柜\",\n\t\t\t\"cabinetcocunt\": 24\n\t\t},\n\t\t{\n\t\t\t\"resultIndex\": 3,\n\t\t\t\"yearcount\": 452,\n\t\t\t\"year\": 2019,\n\t\t\t\"month\": \"七月\",\n\t\t\t\"monthcount\": 2341,\n\t\t\t\"classifyname\": \"技术类\",\n\t\t\t\"cntrnocount\": 67,\n\t\t\t\"cabinetname\": \"四号柜\",\n\t\t\t\"cabinetcocunt\": 45\n\t\t},\n\t\t{\n\t\t\t\"resultIndex\": 4,\n\t\t\t\"yearcount\": 645,\n\t\t\t\"year\": 2020,\n\t\t\t\"month\": \"八月\",\n\t\t\t\"monthcount\": 7473,\n\t\t\t\"classifyname\": \"工具类\",\n\t\t\t\"cntrnocount\": 93,\n\t\t\t\"cabinetname\": \"五号柜\",\n\t\t\t\"cabinetcocunt\": 94\n\t\t}\n\t],\n\t\"timestamp\": 1554285003594\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/getTubiao.json",
    "content": "{\"data\":\n  [\n    {\"day\": \"星期一\", \"step\": 1234, \"assess\": \"良\"},\n    {\"day\": \"星期二\", \"step\": 1884, \"assess\": \"优\"},\n    {\"day\": \"星期三\", \"step\": 1671, \"assess\": \"良+\"},\n    {\"day\": \"星期四\", \"step\": 2197, \"assess\": \"优+\"},\n    {\"day\": \"星期五\", \"step\": 1342, \"assess\": \"中\"},\n    {\"day\": \"星期六\", \"step\": 545, \"assess\": \"差\"},\n    {\"day\": \"星期日\", \"step\": 244, \"assess\": \"极差\"}\n  ]}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/graphreport_chart.json",
    "content": "{\n\t\"status\": 200,\n\t\"success\": true,\n\t\"message\": \"ok\",\n\t\"result\": {\n\t\t\"data\": [\n\t\t\t{\n\t\t\t\t\"id\": 0,\n\t\t\t\t\"x\": \"1\",\n\t\t\t\t\"y\": 889\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"id\": 1,\n\t\t\t\t\"x\": \"2\",\n\t\t\t\t\"y\": 341\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"id\": 2,\n\t\t\t\t\"x\": \"3\",\n\t\t\t\t\"y\": 1028\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"id\": 3,\n\t\t\t\t\"x\": \"4\",\n\t\t\t\t\"y\": 1168\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"id\": 4,\n\t\t\t\t\"x\": \"5\",\n\t\t\t\t\"y\": 653\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"id\": 5,\n\t\t\t\t\"x\": \"6\",\n\t\t\t\t\"y\": 863\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"id\": 6,\n\t\t\t\t\"x\": \"7\",\n\t\t\t\t\"y\": 421\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"id\": 7,\n\t\t\t\t\"x\": \"8\",\n\t\t\t\t\"y\": 1320\n\t\t\t}\n\t\t]\n\t},\n\t\"timestamp\": 1554950583837\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/permission.json",
    "content": "{\n  \"message\": \"\",\n  \"result\": {\n    \"data\": [\n      {\n        \"id\": \"marketing\",\n        \"name\": \"营销管理\",\n        \"describe\": null,\n        \"status\": 1,\n        \"actionData\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n        \"sptDaTypes\": null,\n        \"optionalFields\": null,\n        \"parents\": null,\n        \"type\": null,\n        \"deleted\": 0,\n        \"actions\": [\n          \"add\",\n          \"query\",\n          \"get\",\n          \"update\",\n          \"delete\"\n        ]\n      },\n      {\n        \"id\": \"member\",\n        \"name\": \"会员管理\",\n        \"describe\": null,\n        \"status\": 1,\n        \"actionData\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n        \"sptDaTypes\": null,\n        \"optionalFields\": \"[]\",\n        \"parents\": null,\n        \"type\": \"default\",\n        \"deleted\": 0,\n        \"actions\": [\n          \"add\",\n          \"query\",\n          \"get\",\n          \"update\",\n          \"delete\"\n        ]\n      },\n      {\n        \"id\": \"menu\",\n        \"name\": \"菜单管理\",\n        \"describe\": null,\n        \"status\": 1,\n        \"actionData\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"import\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导入\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"}]\",\n        \"sptDaTypes\": null,\n        \"optionalFields\": \"[]\",\n        \"parents\": null,\n        \"type\": \"default\",\n        \"deleted\": 0,\n        \"actions\": [\n          \"add\",\n          \"import\",\n          \"get\",\n          \"update\"\n        ]\n      },\n      {\n        \"id\": \"order\",\n        \"name\": \"订单管理\",\n        \"describe\": null,\n        \"status\": 1,\n        \"actionData\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n        \"sptDaTypes\": null,\n        \"optionalFields\": \"[]\",\n        \"parents\": null,\n        \"type\": \"default\",\n        \"deleted\": 0,\n        \"actions\": [\n          \"add\",\n          \"query\",\n          \"get\",\n          \"update\",\n          \"delete\"\n        ]\n      },\n      {\n        \"id\": \"permission\",\n        \"name\": \"权限管理\",\n        \"describe\": null,\n        \"status\": 1,\n        \"actionData\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n        \"sptDaTypes\": null,\n        \"optionalFields\": \"[]\",\n        \"parents\": null,\n        \"type\": \"default\",\n        \"deleted\": 0,\n        \"actions\": [\n          \"add\",\n          \"get\",\n          \"update\",\n          \"delete\"\n        ]\n      },\n      {\n        \"id\": \"role\",\n        \"name\": \"角色管理\",\n        \"describe\": null,\n        \"status\": 1,\n        \"actionData\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n        \"sptDaTypes\": null,\n        \"optionalFields\": \"[]\",\n        \"parents\": null,\n        \"type\": \"default\",\n        \"deleted\": 0,\n        \"actions\": [\n          \"add\",\n          \"get\",\n          \"update\",\n          \"delete\"\n        ]\n      },\n      {\n        \"id\": \"test\",\n        \"name\": \"测试权限\",\n        \"describe\": null,\n        \"status\": 1,\n        \"actionData\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"}]\",\n        \"sptDaTypes\": null,\n        \"optionalFields\": \"[]\",\n        \"parents\": null,\n        \"type\": \"default\",\n        \"deleted\": 0,\n        \"actions\": [\n          \"add\",\n          \"get\"\n        ]\n      },\n      {\n        \"id\": \"user\",\n        \"name\": \"用户管理\",\n        \"describe\": null,\n        \"status\": 1,\n        \"actionData\": \"[{\\\"action\\\":\\\"add\\\",\\\"describe\\\":\\\"新增\\\",\\\"defaultCheck\\\":false},{\\\"action\\\":\\\"get\\\",\\\"describe\\\":\\\"查询\\\",\\\"defaultCheck\\\":false}]\",\n        \"sptDaTypes\": null,\n        \"optionalFields\": \"[]\",\n        \"parents\": null,\n        \"type\": \"default\",\n        \"deleted\": 0,\n        \"actions\": [\n          \"add\",\n          \"get\"\n        ]\n      }\n    ],\n    \"pageSize\": 10,\n    \"pageNo\": 0,\n    \"totalPage\": 1,\n    \"totalCount\": 5\n  },\n  \"status\": 200,\n  \"timestamp\": 1537082021471\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/permission_no_page.json",
    "content": "{\n  \"message\": \"\",\n  \"result\": [\n    {\n      \"id\": \"marketing\",\n      \"name\": \"营销管理\",\n      \"describe\": null,\n      \"status\": 1,\n      \"actionData\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n      \"sptDaTypes\": null,\n      \"optionalFields\": null,\n      \"parents\": null,\n      \"type\": null,\n      \"deleted\": 0,\n      \"actions\": [\n        \"add\",\n        \"query\",\n        \"get\",\n        \"update\",\n        \"delete\"\n      ]\n    },\n    {\n      \"id\": \"member\",\n      \"name\": \"会员管理\",\n      \"describe\": null,\n      \"status\": 1,\n      \"actionData\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n      \"sptDaTypes\": null,\n      \"optionalFields\": \"[]\",\n      \"parents\": null,\n      \"type\": \"default\",\n      \"deleted\": 0,\n      \"actions\": [\n        \"add\",\n        \"query\",\n        \"get\",\n        \"update\",\n        \"delete\"\n      ]\n    },\n    {\n      \"id\": \"menu\",\n      \"name\": \"菜单管理\",\n      \"describe\": null,\n      \"status\": 1,\n      \"actionData\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"import\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导入\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"}]\",\n      \"sptDaTypes\": null,\n      \"optionalFields\": \"[]\",\n      \"parents\": null,\n      \"type\": \"default\",\n      \"deleted\": 0,\n      \"actions\": [\n        \"add\",\n        \"import\",\n        \"get\",\n        \"update\"\n      ]\n    },\n    {\n      \"id\": \"order\",\n      \"name\": \"订单管理\",\n      \"describe\": null,\n      \"status\": 1,\n      \"actionData\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n      \"sptDaTypes\": null,\n      \"optionalFields\": \"[]\",\n      \"parents\": null,\n      \"type\": \"default\",\n      \"deleted\": 0,\n      \"actions\": [\n        \"add\",\n        \"query\",\n        \"get\",\n        \"update\",\n        \"delete\"\n      ]\n    },\n    {\n      \"id\": \"permission\",\n      \"name\": \"权限管理\",\n      \"describe\": null,\n      \"status\": 1,\n      \"actionData\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n      \"sptDaTypes\": null,\n      \"optionalFields\": \"[]\",\n      \"parents\": null,\n      \"type\": \"default\",\n      \"deleted\": 0,\n      \"actions\": [\n        \"add\",\n        \"get\",\n        \"update\",\n        \"delete\"\n      ]\n    },\n    {\n      \"id\": \"role\",\n      \"name\": \"角色管理\",\n      \"describe\": null,\n      \"status\": 1,\n      \"actionData\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n      \"sptDaTypes\": null,\n      \"optionalFields\": \"[]\",\n      \"parents\": null,\n      \"type\": \"default\",\n      \"deleted\": 0,\n      \"actions\": [\n        \"add\",\n        \"get\",\n        \"update\",\n        \"delete\"\n      ]\n    },\n    {\n      \"id\": \"test\",\n      \"name\": \"测试权限\",\n      \"describe\": null,\n      \"status\": 1,\n      \"actionData\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"}]\",\n      \"sptDaTypes\": null,\n      \"optionalFields\": \"[]\",\n      \"parents\": null,\n      \"type\": \"default\",\n      \"deleted\": 0,\n      \"actions\": [\n        \"add\",\n        \"get\"\n      ]\n    },\n    {\n      \"id\": \"user\",\n      \"name\": \"用户管理\",\n      \"describe\": null,\n      \"status\": 1,\n      \"actionData\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"},{\\\"action\\\":\\\"import\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导入\\\"},{\\\"action\\\":\\\"export\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导出\\\"}]\",\n      \"sptDaTypes\": null,\n      \"optionalFields\": \"[]\",\n      \"parents\": null,\n      \"type\": \"default\",\n      \"deleted\": 0,\n      \"actions\": [\n        \"add\",\n        \"get\"\n      ]\n    }\n  ],\n  \"status\": 200,\n  \"timestamp\": 1537082021471\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/role.json",
    "content": "{\n  \"message\": \"\",\n  \"result\": {\n    \"data\": [\n      {\n        \"id\": \"admin\",\n        \"name\": \"管理员\",\n        \"describe\": \"拥有所有权限\",\n        \"status\": 1,\n        \"creatorId\": \"system\",\n        \"createTime\": 1497160610259,\n        \"deleted\": 0,\n        \"permissions\": [\n          {\n            \"roleId\": \"admin\",\n            \"permissionId\": \"comment\",\n            \"permissionName\": \"评论管理\",\n            \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n            \"actionEntitySet\": [\n              {\n                \"action\": \"add\",\n                \"describe\": \"新增\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"query\",\n                \"describe\": \"查询\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"get\",\n                \"describe\": \"详情\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"update\",\n                \"describe\": \"修改\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"delete\",\n                \"describe\": \"删除\",\n                \"defaultCheck\": false\n              }\n            ],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"admin\",\n            \"permissionId\": \"member\",\n            \"permissionName\": \"会员管理\",\n            \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n            \"actionEntitySet\": [\n              {\n                \"action\": \"add\",\n                \"describe\": \"新增\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"query\",\n                \"describe\": \"查询\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"get\",\n                \"describe\": \"详情\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"update\",\n                \"describe\": \"修改\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"delete\",\n                \"describe\": \"删除\",\n                \"defaultCheck\": false\n              }\n            ],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"admin\",\n            \"permissionId\": \"menu\",\n            \"permissionName\": \"菜单管理\",\n            \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"import\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导入\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"}]\",\n            \"actionEntitySet\": [\n              {\n                \"action\": \"add\",\n                \"describe\": \"新增\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"import\",\n                \"describe\": \"导入\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"get\",\n                \"describe\": \"详情\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"update\",\n                \"describe\": \"修改\",\n                \"defaultCheck\": false\n              }\n            ],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"admin\",\n            \"permissionId\": \"order\",\n            \"permissionName\": \"订单管理\",\n            \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n            \"actionEntitySet\": [\n              {\n                \"action\": \"add\",\n                \"describe\": \"新增\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"query\",\n                \"describe\": \"查询\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"get\",\n                \"describe\": \"详情\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"update\",\n                \"describe\": \"修改\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"delete\",\n                \"describe\": \"删除\",\n                \"defaultCheck\": false\n              }\n            ],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"admin\",\n            \"permissionId\": \"permission\",\n            \"permissionName\": \"权限管理\",\n            \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n            \"actionEntitySet\": [\n              {\n                \"action\": \"add\",\n                \"describe\": \"新增\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"get\",\n                \"describe\": \"详情\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"update\",\n                \"describe\": \"修改\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"delete\",\n                \"describe\": \"删除\",\n                \"defaultCheck\": false\n              }\n            ],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"admin\",\n            \"permissionId\": \"role\",\n            \"permissionName\": \"角色管理\",\n            \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n            \"actionEntitySet\": [\n              {\n                \"action\": \"add\",\n                \"describe\": \"新增\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"get\",\n                \"describe\": \"详情\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"update\",\n                \"describe\": \"修改\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"delete\",\n                \"describe\": \"删除\",\n                \"defaultCheck\": false\n              }\n            ],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"admin\",\n            \"permissionId\": \"test\",\n            \"permissionName\": \"测试权限\",\n            \"actions\": \"[]\",\n            \"actionEntitySet\": [],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"admin\",\n            \"permissionId\": \"user\",\n            \"permissionName\": \"用户管理\",\n            \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"import\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导入\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"},{\\\"action\\\":\\\"export\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导出\\\"}]\",\n            \"actionEntitySet\": [\n              {\n                \"action\": \"add\",\n                \"describe\": \"新增\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"import\",\n                \"describe\": \"导入\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"get\",\n                \"describe\": \"详情\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"update\",\n                \"describe\": \"修改\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"delete\",\n                \"describe\": \"删除\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"export\",\n                \"describe\": \"导出\",\n                \"defaultCheck\": false\n              }\n            ],\n            \"actionList\": null,\n            \"dataAccess\": null\n          }\n        ]\n      },\n      {\n        \"id\": \"svip\",\n        \"name\": \"SVIP\",\n        \"describe\": \"超级会员\",\n        \"status\": 1,\n        \"creatorId\": \"system\",\n        \"createTime\": 1532417744846,\n        \"deleted\": 0,\n        \"permissions\": [\n          {\n            \"roleId\": \"admin\",\n            \"permissionId\": \"comment\",\n            \"permissionName\": \"评论管理\",\n            \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n            \"actionEntitySet\": [\n              {\n                \"action\": \"add\",\n                \"describe\": \"新增\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"query\",\n                \"describe\": \"查询\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"get\",\n                \"describe\": \"详情\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"update\",\n                \"describe\": \"修改\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"delete\",\n                \"describe\": \"删除\",\n                \"defaultCheck\": false\n              }\n            ],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"admin\",\n            \"permissionId\": \"member\",\n            \"permissionName\": \"会员管理\",\n            \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n            \"actionEntitySet\": [\n              {\n                \"action\": \"add\",\n                \"describe\": \"新增\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"query\",\n                \"describe\": \"查询\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"get\",\n                \"describe\": \"详情\",\n                \"defaultCheck\": false\n              }\n            ],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"admin\",\n            \"permissionId\": \"menu\",\n            \"permissionName\": \"菜单管理\",\n            \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"import\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导入\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"}]\",\n            \"actionEntitySet\": [\n              {\n                \"action\": \"add\",\n                \"describe\": \"新增\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"import\",\n                \"describe\": \"导入\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"get\",\n                \"describe\": \"详情\",\n                \"defaultCheck\": false\n              }\n            ],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"admin\",\n            \"permissionId\": \"order\",\n            \"permissionName\": \"订单管理\",\n            \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n            \"actionEntitySet\": [\n              {\n                \"action\": \"add\",\n                \"describe\": \"新增\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"query\",\n                \"describe\": \"查询\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"get\",\n                \"describe\": \"详情\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"update\",\n                \"describe\": \"修改\",\n                \"defaultCheck\": false\n              }\n            ],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"admin\",\n            \"permissionId\": \"permission\",\n            \"permissionName\": \"权限管理\",\n            \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n            \"actionEntitySet\": [\n              {\n                \"action\": \"add\",\n                \"describe\": \"新增\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"get\",\n                \"describe\": \"详情\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"update\",\n                \"describe\": \"修改\",\n                \"defaultCheck\": false\n              }\n            ],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"admin\",\n            \"permissionId\": \"role\",\n            \"permissionName\": \"角色管理\",\n            \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n            \"actionEntitySet\": [\n              {\n                \"action\": \"add\",\n                \"describe\": \"新增\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"update\",\n                \"describe\": \"修改\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"delete\",\n                \"describe\": \"删除\",\n                \"defaultCheck\": false\n              }\n            ],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"admin\",\n            \"permissionId\": \"test\",\n            \"permissionName\": \"测试权限\",\n            \"actions\": \"[]\",\n            \"actionEntitySet\": [],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"admin\",\n            \"permissionId\": \"user\",\n            \"permissionName\": \"用户管理\",\n            \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"import\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导入\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"},{\\\"action\\\":\\\"export\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导出\\\"}]\",\n            \"actionEntitySet\": [\n              {\n                \"action\": \"add\",\n                \"describe\": \"新增\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"import\",\n                \"describe\": \"导入\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"get\",\n                \"describe\": \"详情\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"update\",\n                \"describe\": \"修改\",\n                \"defaultCheck\": false\n              }\n            ],\n            \"actionList\": null,\n            \"dataAccess\": null\n          }\n        ]\n      },\n      {\n        \"id\": \"user\",\n        \"name\": \"普通会员\",\n        \"describe\": \"普通用户，只能查询\",\n        \"status\": 1,\n        \"creatorId\": \"system\",\n        \"createTime\": 1497160610259,\n        \"deleted\": 0,\n        \"permissions\": [\n          {\n            \"roleId\": \"user\",\n            \"permissionId\": \"comment\",\n            \"permissionName\": \"评论管理\",\n            \"actions\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"}]\",\n            \"actionEntitySet\": [\n              {\n                \"action\": \"query\",\n                \"describe\": \"查询\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"get\",\n                \"describe\": \"详情\",\n                \"defaultCheck\": false\n              }\n            ],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"user\",\n            \"permissionId\": \"marketing\",\n            \"permissionName\": \"营销管理\",\n            \"actions\": \"[]\",\n            \"actionEntitySet\": [],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"user\",\n            \"permissionId\": \"member\",\n            \"permissionName\": \"会员管理\",\n            \"actions\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"}]\",\n            \"actionEntitySet\": [\n              {\n                \"action\": \"query\",\n                \"describe\": \"查询\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"get\",\n                \"describe\": \"详情\",\n                \"defaultCheck\": false\n              }\n            ],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"user\",\n            \"permissionId\": \"menu\",\n            \"permissionName\": \"菜单管理\",\n            \"actions\": \"[]\",\n            \"actionEntitySet\": [],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"user\",\n            \"permissionId\": \"order\",\n            \"permissionName\": \"订单管理\",\n            \"actions\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"}]\",\n            \"actionEntitySet\": [\n              {\n                \"action\": \"query\",\n                \"describe\": \"查询\",\n                \"defaultCheck\": false\n              },\n              {\n                \"action\": \"get\",\n                \"describe\": \"详情\",\n                \"defaultCheck\": false\n              }\n            ],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"user\",\n            \"permissionId\": \"permission\",\n            \"permissionName\": \"权限管理\",\n            \"actions\": \"[]\",\n            \"actionEntitySet\": [],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"user\",\n            \"permissionId\": \"role\",\n            \"permissionName\": \"角色管理\",\n            \"actions\": \"[]\",\n            \"actionEntitySet\": [],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"user\",\n            \"permissionId\": \"test\",\n            \"permissionName\": \"测试权限\",\n            \"actions\": \"[]\",\n            \"actionEntitySet\": [],\n            \"actionList\": null,\n            \"dataAccess\": null\n          },\n          {\n            \"roleId\": \"user\",\n            \"permissionId\": \"user\",\n            \"permissionName\": \"用户管理\",\n            \"actions\": \"[]\",\n            \"actionEntitySet\": [],\n            \"actionList\": null,\n            \"dataAccess\": null\n          }\n        ]\n      }\n    ],\n    \"pageSize\": 10,\n    \"pageNo\": 0,\n    \"totalPage\": 1,\n    \"totalCount\": 5\n  },\n  \"status\": 200,\n  \"timestamp\": 1537079497645\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/service.json",
    "content": "{\n  \"message\": \"\",\n  \"result\": {\n    \"pageSize\": 10,\n    \"pageNo\": 0,\n    \"totalCount\": 57,\n    \"totalPage\": 6,\n    \"data\": [\n      {\n        \"key\": 1,\n        \"no\": \"No 1\",\n        \"description\": \"这是一段描述\",\n        \"callNo\": 127,\n        \"status\": 2,\n        \"updatedAt\": \"1970-06-24 11:51:20\",\n        \"editable\": false\n      },\n      {\n        \"key\": 2,\n        \"no\": \"No 2\",\n        \"description\": \"这是一段描述\",\n        \"callNo\": 573,\n        \"status\": 2,\n        \"updatedAt\": \"1994-12-11 00:37:35\",\n        \"editable\": false\n      },\n      {\n        \"key\": 3,\n        \"no\": \"No 3\",\n        \"description\": \"这是一段描述\",\n        \"callNo\": 869,\n        \"status\": 2,\n        \"updatedAt\": \"2013-11-11 08:04:03\",\n        \"editable\": false\n      },\n      {\n        \"key\": 4,\n        \"no\": \"No 4\",\n        \"description\": \"这是一段描述\",\n        \"callNo\": 26,\n        \"status\": 2,\n        \"updatedAt\": \"1990-11-04 15:41:42\",\n        \"editable\": false\n      },\n      {\n        \"key\": 5,\n        \"no\": \"No 5\",\n        \"description\": \"这是一段描述\",\n        \"callNo\": 20,\n        \"status\": 2,\n        \"updatedAt\": \"1970-01-05 11:04:56\",\n        \"editable\": false\n      },\n      {\n        \"key\": 6,\n        \"no\": \"No 6\",\n        \"description\": \"这是一段描述\",\n        \"callNo\": 675,\n        \"status\": 2,\n        \"updatedAt\": \"1983-06-06 04:09:04\",\n        \"editable\": false\n      },\n      {\n        \"key\": 7,\n        \"no\": \"No 7\",\n        \"description\": \"这是一段描述\",\n        \"callNo\": 512,\n        \"status\": 3,\n        \"updatedAt\": \"1996-08-26 21:47:44\",\n        \"editable\": false\n      },\n      {\n        \"key\": 8,\n        \"no\": \"No 8\",\n        \"description\": \"这是一段描述\",\n        \"callNo\": 962,\n        \"status\": 2,\n        \"updatedAt\": \"2004-08-15 23:15:22\",\n        \"editable\": false\n      },\n      {\n        \"key\": 9,\n        \"no\": \"No 9\",\n        \"description\": \"这是一段描述\",\n        \"callNo\": 318,\n        \"status\": 3,\n        \"updatedAt\": \"1988-08-10 14:36:35\",\n        \"editable\": false\n      },\n      {\n        \"key\": 10,\n        \"no\": \"No 10\",\n        \"description\": \"这是一段描述\",\n        \"callNo\": 789,\n        \"status\": 0,\n        \"updatedAt\": \"1988-12-27 23:39:41\",\n        \"editable\": false\n      }\n    ]\n  },\n  \"status\": 200,\n  \"timestamp\": 1534955098193\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/sysdatalog.json",
    "content": "{\n\t\"mobilePhone\":\"1872222222\",\n\t\"officePhone\":\"1222222\",\n\t\"email\":\"\",\n\t\"createDate\":\"Jun 23, 2016 12:00:00 PM\",\n\t\"sex\":\"1\",\n\t\"depId\":\"402880e447e99cf10147e9a03b320003\",\n\t\"userName\":\"9001\",\n\t\"status\":\"1\",\n\t\"content\":\"111\",\n\t\"id\":\"4028ef81550c1a7901550c1cd6e70001\"\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/task_process.json",
    "content": "{\n\t\"success\": true,\n\t\"message\": \"操作成功！\",\n\t\"code\": 0,\n\t\"result\": {\n\t\t\"records\": [\n\t\t\t{\n\t\t\t\t\"taskId\": \"48701\",\n\t\t\t\t\"name\": \"start\",\n\t\t\t\t\"taskBeginTime\": \"2019-03-07 09:33:04\",\n\t\t\t\t\"taskEndTime\": \"2019-03-08 04:03:01\",\n\t\t\t\t\"principal\": \"测试体验账号\",\n\t\t\t\t\"result\": \"已完成\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"taskId\": \"48702\",\n\t\t\t\t\"name\": \"部门领导审批\",\n\t\t\t\t\"taskBeginTime\": \"2019-03-07 09:33:04\",\n\t\t\t\t\"taskEndTime\": \"2019-03-08 04:03:01\",\n\t\t\t\t\"principal\": \"测试体验账号\",\n\t\t\t\t\"result\": \"已完成\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"taskId\": \"48703\",\n\t\t\t\t\"name\": \"调整申请\",\n\t\t\t\t\"taskBeginTime\": \"2019-03-07 09:33:04\",\n\t\t\t\t\"taskEndTime\": \"2019-03-08 04:03:01\",\n\t\t\t\t\"principal\": \"测试体验账号\",\n\t\t\t\t\"result\": \"已完成\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"taskId\": \"48704\",\n\t\t\t\t\"name\": \"人事审批\",\n\t\t\t\t\"taskBeginTime\": \"2019-03-07 09:33:04\",\n\t\t\t\t\"taskEndTime\": \"2019-03-08 04:03:01\",\n\t\t\t\t\"principal\": \"测试体验账号\",\n\t\t\t\t\"result\": \"已完成\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"taskId\": \"48705\",\n\t\t\t\t\"name\": \"end\",\n\t\t\t\t\"taskBeginTime\": \"2019-03-07 09:33:04\",\n\t\t\t\t\"taskEndTime\": \"2019-03-08 04:03:01\",\n\t\t\t\t\"principal\": \"测试体验账号\",\n\t\t\t\t\"result\": \"已完成\"\n\t\t\t}\n\t\t],\n\t\t\"total\": 0,\n\t\t\"size\": 10,\n\t\t\"current\": 1,\n\t\t\"searchCount\": true,\n\t\t\"pages\": 0\n\t},\n\t\"timestamp\": 1551922394641\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/user.json",
    "content": "{\n  \"message\": \"\",\n  \"result\": {\n    \"data\": [\n      {\n        \"id\": \"3e1f9d2373b740b09eff34adca649458\",\n        \"name\": \"zzc\",\n        \"username\": \"zzc\",\n        \"password\": \"default\",\n        \"status\": 1,\n        \"telephone\": \"\",\n        \"lastLoginIp\": \"127.0.0.1\",\n        \"lastLoginTime\": 1534917683651,\n        \"creatorId\": null,\n        \"createTime\": 1533290866069,\n        \"merchantCode\": \"TLif2btpzg079h15bk\",\n        \"deleted\": 0,\n        \"roleId\": \"admin\",\n        \"role\": {\n          \"id\": \"admin\",\n          \"name\": \"管理员\",\n          \"describe\": \"拥有所有权限\",\n          \"status\": 1,\n          \"creatorId\": \"system\",\n          \"createTime\": 1497160610259,\n          \"deleted\": 0,\n          \"permissions\": [\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"comment\",\n              \"permissionName\": \"评论管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"feedback\",\n              \"permissionName\": \"反馈管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"goods\",\n              \"permissionName\": \"商品管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"member\",\n              \"permissionName\": \"会员管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"menu\",\n              \"permissionName\": \"菜单管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"import\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导入\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"import\",\n                  \"describe\": \"导入\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"merchant\",\n              \"permissionName\": \"商家管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"order\",\n              \"permissionName\": \"订单管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"permission\",\n              \"permissionName\": \"权限管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"role\",\n              \"permissionName\": \"角色管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"table\",\n              \"permissionName\": \"桌子管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"user\",\n              \"permissionName\": \"用户管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"import\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导入\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"},{\\\"action\\\":\\\"export\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导出\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"import\",\n                  \"describe\": \"导入\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"export\",\n                  \"describe\": \"导出\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            }\n          ]\n        },\n        \"permissions\": null\n      },\n      {\n        \"id\": \"4291d7da9005377ec9aec4a71ea837f\",\n        \"name\": \"管理员\",\n        \"username\": \"admin\",\n        \"password\": \"default\",\n        \"status\": 1,\n        \"telephone\": \"\",\n        \"lastLoginIp\": \"120.41.221.157\",\n        \"lastLoginTime\": 1534955070227,\n        \"creatorId\": \"admin\",\n        \"createTime\": 1497160610259,\n        \"merchantCode\": \"TLif2btpzg079h15bk\",\n        \"deleted\": 0,\n        \"roleId\": \"admin\",\n        \"role\": {\n          \"id\": \"admin\",\n          \"name\": \"管理员\",\n          \"describe\": \"拥有所有权限\",\n          \"status\": 1,\n          \"creatorId\": \"system\",\n          \"createTime\": 1497160610259,\n          \"deleted\": 0,\n          \"permissions\": [\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"comment\",\n              \"permissionName\": \"评论管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"feedback\",\n              \"permissionName\": \"反馈管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"goods\",\n              \"permissionName\": \"商品管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"member\",\n              \"permissionName\": \"会员管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"menu\",\n              \"permissionName\": \"菜单管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"import\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导入\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"import\",\n                  \"describe\": \"导入\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"merchant\",\n              \"permissionName\": \"商家管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"order\",\n              \"permissionName\": \"订单管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"permission\",\n              \"permissionName\": \"权限管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"role\",\n              \"permissionName\": \"角色管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"table\",\n              \"permissionName\": \"桌子管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"user\",\n              \"permissionName\": \"用户管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"import\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导入\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"},{\\\"action\\\":\\\"export\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导出\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"import\",\n                  \"describe\": \"导入\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"export\",\n                  \"describe\": \"导出\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            }\n          ]\n        },\n        \"permissions\": null\n      },\n      {\n        \"id\": \"4415f49c05f843579de26f79d62ed2d4\",\n        \"name\": \"每日咖啡 测试店\",\n        \"username\": \"zengyp\",\n        \"password\": \"default\",\n        \"status\": 1,\n        \"telephone\": null,\n        \"lastLoginIp\": \"27.154.27.120\",\n        \"lastLoginTime\": 1533715238621,\n        \"creatorId\": null,\n        \"createTime\": 1533708419903,\n        \"merchantCode\": \"TLif2btpzg079h15bk\",\n        \"deleted\": 0,\n        \"roleId\": \"user\",\n        \"role\": {\n          \"id\": \"user\",\n          \"name\": \"普通会员\",\n          \"describe\": \"普通用户，只能查询\",\n          \"status\": 1,\n          \"creatorId\": \"system\",\n          \"createTime\": 1497160610259,\n          \"deleted\": 0,\n          \"permissions\": [\n            {\n              \"roleId\": \"user\",\n              \"permissionId\": \"comment\",\n              \"permissionName\": \"评论管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"user\",\n              \"permissionId\": \"feedback\",\n              \"permissionName\": \"反馈管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"user\",\n              \"permissionId\": \"goods\",\n              \"permissionName\": \"商品管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"user\",\n              \"permissionId\": \"member\",\n              \"permissionName\": \"会员管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"user\",\n              \"permissionId\": \"menu\",\n              \"permissionName\": \"菜单管理\",\n              \"actions\": \"[]\",\n              \"actionEntitySet\": [],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"user\",\n              \"permissionId\": \"merchant\",\n              \"permissionName\": \"商家管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"user\",\n              \"permissionId\": \"order\",\n              \"permissionName\": \"订单管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"user\",\n              \"permissionId\": \"permission\",\n              \"permissionName\": \"权限管理\",\n              \"actions\": \"[]\",\n              \"actionEntitySet\": [],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"user\",\n              \"permissionId\": \"role\",\n              \"permissionName\": \"角色管理\",\n              \"actions\": \"[]\",\n              \"actionEntitySet\": [],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"user\",\n              \"permissionId\": \"table\",\n              \"permissionName\": \"桌子管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"user\",\n              \"permissionId\": \"user\",\n              \"permissionName\": \"用户管理\",\n              \"actions\": \"[]\",\n              \"actionEntitySet\": [],\n              \"actionList\": null,\n              \"dataAccess\": null\n            }\n          ]\n        },\n        \"permissions\": null\n      },\n      {\n        \"id\": \"5138dd8f31129121e96506e4f6e750a0\",\n        \"name\": \"TLif2btpzg079h15bk\",\n        \"username\": \"lxq123\",\n        \"password\": \"default\",\n        \"status\": 1,\n        \"telephone\": null,\n        \"lastLoginIp\": \"27.154.74.117\",\n        \"lastLoginTime\": 1534816137636,\n        \"creatorId\": null,\n        \"createTime\": 1534319595416,\n        \"merchantCode\": \"TLif2btpzg079h15bk\",\n        \"deleted\": 0,\n        \"roleId\": \"shopuser\",\n        \"role\": {\n          \"id\": \"shopuser\",\n          \"name\": \"商户\",\n          \"describe\": \"商户组\",\n          \"status\": 1,\n          \"creatorId\": \"system\",\n          \"createTime\": 1533107680557,\n          \"deleted\": 0,\n          \"permissions\": [\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"comment\",\n              \"permissionName\": \"评论管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"feedback\",\n              \"permissionName\": \"反馈管理\",\n              \"actions\": \"[]\",\n              \"actionEntitySet\": [],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"goods\",\n              \"permissionName\": \"商品管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"member\",\n              \"permissionName\": \"会员管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"menu\",\n              \"permissionName\": \"菜单管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"import\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导入\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"import\",\n                  \"describe\": \"导入\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"merchant\",\n              \"permissionName\": \"商家管理\",\n              \"actions\": \"[]\",\n              \"actionEntitySet\": [],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"order\",\n              \"permissionName\": \"订单管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"permission\",\n              \"permissionName\": \"权限管理\",\n              \"actions\": \"[]\",\n              \"actionEntitySet\": [],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"role\",\n              \"permissionName\": \"角色管理\",\n              \"actions\": \"[]\",\n              \"actionEntitySet\": [],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"shop\",\n              \"permissionName\": \"店铺管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"table\",\n              \"permissionName\": \"桌子管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"user\",\n              \"permissionName\": \"用户管理\",\n              \"actions\": \"[]\",\n              \"actionEntitySet\": [],\n              \"actionList\": null,\n              \"dataAccess\": null\n            }\n          ]\n        },\n        \"permissions\": null\n      },\n      {\n        \"id\": \"9cd287329ede459baaf75a36a2d77b7d\",\n        \"name\": \"yyyyyy\",\n        \"username\": \"yyyyy\",\n        \"password\": \"default\",\n        \"status\": 1,\n        \"telephone\": null,\n        \"lastLoginIp\": \"127.0.0.1\",\n        \"lastLoginTime\": null,\n        \"creatorId\": null,\n        \"createTime\": 1532346665573,\n        \"merchantCode\": \"123\",\n        \"deleted\": 0,\n        \"roleId\": \"admin\",\n        \"role\": {\n          \"id\": \"admin\",\n          \"name\": \"管理员\",\n          \"describe\": \"拥有所有权限\",\n          \"status\": 1,\n          \"creatorId\": \"system\",\n          \"createTime\": 1497160610259,\n          \"deleted\": 0,\n          \"permissions\": [\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"comment\",\n              \"permissionName\": \"评论管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"feedback\",\n              \"permissionName\": \"反馈管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"goods\",\n              \"permissionName\": \"商品管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"member\",\n              \"permissionName\": \"会员管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"menu\",\n              \"permissionName\": \"菜单管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"import\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导入\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"import\",\n                  \"describe\": \"导入\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"merchant\",\n              \"permissionName\": \"商家管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"order\",\n              \"permissionName\": \"订单管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"permission\",\n              \"permissionName\": \"权限管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"role\",\n              \"permissionName\": \"角色管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"table\",\n              \"permissionName\": \"桌子管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"user\",\n              \"permissionName\": \"用户管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"import\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导入\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"},{\\\"action\\\":\\\"export\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导出\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"import\",\n                  \"describe\": \"导入\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"export\",\n                  \"describe\": \"导出\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            }\n          ]\n        },\n        \"permissions\": null\n      },\n      {\n        \"id\": \"b8dcb4144a05b076f5bb07a9366e2c88\",\n        \"name\": \"言肆\",\n        \"username\": \"yladmxa\",\n        \"password\": \"default\",\n        \"status\": 1,\n        \"telephone\": \"\",\n        \"lastLoginIp\": \"27.154.27.120\",\n        \"lastLoginTime\": 1533627970671,\n        \"creatorId\": \"admin\",\n        \"createTime\": 1497160610259,\n        \"merchantCode\": \"TLif2btpzg079h15bk\",\n        \"deleted\": 0,\n        \"roleId\": \"admin\",\n        \"role\": {\n          \"id\": \"admin\",\n          \"name\": \"管理员\",\n          \"describe\": \"拥有所有权限\",\n          \"status\": 1,\n          \"creatorId\": \"system\",\n          \"createTime\": 1497160610259,\n          \"deleted\": 0,\n          \"permissions\": [\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"comment\",\n              \"permissionName\": \"评论管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"feedback\",\n              \"permissionName\": \"反馈管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"goods\",\n              \"permissionName\": \"商品管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"member\",\n              \"permissionName\": \"会员管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"menu\",\n              \"permissionName\": \"菜单管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"import\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导入\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"import\",\n                  \"describe\": \"导入\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"merchant\",\n              \"permissionName\": \"商家管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"order\",\n              \"permissionName\": \"订单管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"permission\",\n              \"permissionName\": \"权限管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"role\",\n              \"permissionName\": \"角色管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"table\",\n              \"permissionName\": \"桌子管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"admin\",\n              \"permissionId\": \"user\",\n              \"permissionName\": \"用户管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"import\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导入\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"},{\\\"action\\\":\\\"export\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导出\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"import\",\n                  \"describe\": \"导入\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"export\",\n                  \"describe\": \"导出\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            }\n          ]\n        },\n        \"permissions\": null\n      },\n      {\n        \"id\": \"test1\",\n        \"name\": \"test1\",\n        \"username\": \"test1\",\n        \"password\": \"default\",\n        \"status\": 1,\n        \"telephone\": null,\n        \"lastLoginIp\": \"127.0.0.1\",\n        \"lastLoginTime\": 1533264475896,\n        \"creatorId\": \"admin\",\n        \"createTime\": 1497160610259,\n        \"merchantCode\": \"TLif2btpzg079h15bk\",\n        \"deleted\": 0,\n        \"roleId\": \"shopuser\",\n        \"role\": {\n          \"id\": \"shopuser\",\n          \"name\": \"商户\",\n          \"describe\": \"商户组\",\n          \"status\": 1,\n          \"creatorId\": \"system\",\n          \"createTime\": 1533107680557,\n          \"deleted\": 0,\n          \"permissions\": [\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"comment\",\n              \"permissionName\": \"评论管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"feedback\",\n              \"permissionName\": \"反馈管理\",\n              \"actions\": \"[]\",\n              \"actionEntitySet\": [],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"goods\",\n              \"permissionName\": \"商品管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"member\",\n              \"permissionName\": \"会员管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"menu\",\n              \"permissionName\": \"菜单管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"import\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导入\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"import\",\n                  \"describe\": \"导入\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"merchant\",\n              \"permissionName\": \"商家管理\",\n              \"actions\": \"[]\",\n              \"actionEntitySet\": [],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"order\",\n              \"permissionName\": \"订单管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"permission\",\n              \"permissionName\": \"权限管理\",\n              \"actions\": \"[]\",\n              \"actionEntitySet\": [],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"role\",\n              \"permissionName\": \"角色管理\",\n              \"actions\": \"[]\",\n              \"actionEntitySet\": [],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"shop\",\n              \"permissionName\": \"店铺管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"table\",\n              \"permissionName\": \"桌子管理\",\n              \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\",\n              \"actionEntitySet\": [\n                {\n                  \"action\": \"add\",\n                  \"describe\": \"新增\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"query\",\n                  \"describe\": \"查询\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"get\",\n                  \"describe\": \"详情\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"update\",\n                  \"describe\": \"修改\",\n                  \"defaultCheck\": false\n                },\n                {\n                  \"action\": \"delete\",\n                  \"describe\": \"删除\",\n                  \"defaultCheck\": false\n                }\n              ],\n              \"actionList\": null,\n              \"dataAccess\": null\n            },\n            {\n              \"roleId\": \"shopuser\",\n              \"permissionId\": \"user\",\n              \"permissionName\": \"用户管理\",\n              \"actions\": \"[]\",\n              \"actionEntitySet\": [],\n              \"actionList\": null,\n              \"dataAccess\": null\n            }\n          ]\n        },\n        \"permissions\": null\n      }\n    ],\n    \"pageSize\": 10,\n    \"pageNo\": 0,\n    \"totalPage\": 1,\n    \"totalCount\": 7\n  },\n  \"status\": 200,\n  \"timestamp\": 1534955098193\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/user_info.json",
    "content": "{\n    \"message\": \"\", \n    \"result\": {\n        \"id\": \"4291d7da9005377ec9aec4a71ea837f\", \n        \"name\": \"天野远子\", \n        \"username\": \"admin\", \n        \"password\": \"\", \n        \"avatar\": \"/avatar2.jpg\", \n        \"status\": 1, \n        \"telephone\": \"\", \n        \"lastLoginIp\": \"27.154.74.117\", \n        \"lastLoginTime\": 1534837621348, \n        \"creatorId\": \"admin\", \n        \"createTime\": 1497160610259, \n        \"merchantCode\": \"TLif2btpzg079h15bk\", \n        \"deleted\": 0, \n        \"roleId\": \"admin\", \n        \"role\": {\n            \"id\": \"admin\", \n            \"name\": \"管理员\", \n            \"describe\": \"拥有所有权限\", \n            \"status\": 1, \n            \"creatorId\": \"system\", \n            \"createTime\": 1497160610259, \n            \"deleted\": 0, \n            \"permissions\": [\n                {\n                    \"roleId\": \"admin\", \n                    \"permissionId\": \"dashboard\", \n                    \"permissionName\": \"仪表盘\", \n                    \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\", \n                    \"actionEntitySet\": [\n                        {\n                            \"action\": \"add\", \n                            \"describe\": \"新增\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"query\", \n                            \"describe\": \"查询\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"get\", \n                            \"describe\": \"详情\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"update\", \n                            \"describe\": \"修改\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"delete\", \n                            \"describe\": \"删除\", \n                            \"defaultCheck\": false\n                        }\n                    ], \n                    \"actionList\": null, \n                    \"dataAccess\": null\n                }, \n                {\n                    \"roleId\": \"admin\", \n                    \"permissionId\": \"exception\", \n                    \"permissionName\": \"异常页面权限\", \n                    \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\", \n                    \"actionEntitySet\": [\n                        {\n                            \"action\": \"add\", \n                            \"describe\": \"新增\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"query\", \n                            \"describe\": \"查询\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"get\", \n                            \"describe\": \"详情\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"update\", \n                            \"describe\": \"修改\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"delete\", \n                            \"describe\": \"删除\", \n                            \"defaultCheck\": false\n                        }\n                    ], \n                    \"actionList\": null, \n                    \"dataAccess\": null\n                }, \n                {\n                    \"roleId\": \"admin\", \n                    \"permissionId\": \"result\", \n                    \"permissionName\": \"结果权限\", \n                    \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\", \n                    \"actionEntitySet\": [\n                        {\n                            \"action\": \"add\", \n                            \"describe\": \"新增\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"query\", \n                            \"describe\": \"查询\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"get\", \n                            \"describe\": \"详情\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"update\", \n                            \"describe\": \"修改\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"delete\", \n                            \"describe\": \"删除\", \n                            \"defaultCheck\": false\n                        }\n                    ], \n                    \"actionList\": null, \n                    \"dataAccess\": null\n                }, \n                {\n                    \"roleId\": \"admin\", \n                    \"permissionId\": \"profile\", \n                    \"permissionName\": \"详细页权限\", \n                    \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\", \n                    \"actionEntitySet\": [\n                        {\n                            \"action\": \"add\", \n                            \"describe\": \"新增\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"query\", \n                            \"describe\": \"查询\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"get\", \n                            \"describe\": \"详情\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"update\", \n                            \"describe\": \"修改\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"delete\", \n                            \"describe\": \"删除\", \n                            \"defaultCheck\": false\n                        }\n                    ], \n                    \"actionList\": null, \n                    \"dataAccess\": null\n                }, \n                {\n                    \"roleId\": \"admin\", \n                    \"permissionId\": \"table\", \n                    \"permissionName\": \"表格权限\", \n                    \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"import\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导入\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"}]\", \n                    \"actionEntitySet\": [\n                        {\n                            \"action\": \"add\", \n                            \"describe\": \"新增\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"import\", \n                            \"describe\": \"导入\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"get\", \n                            \"describe\": \"详情\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"update\", \n                            \"describe\": \"修改\", \n                            \"defaultCheck\": false\n                        }\n                    ], \n                    \"actionList\": null, \n                    \"dataAccess\": null\n                }, \n                {\n                    \"roleId\": \"admin\", \n                    \"permissionId\": \"form\", \n                    \"permissionName\": \"表单权限\", \n                    \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\", \n                    \"actionEntitySet\": [\n                        {\n                            \"action\": \"add\", \n                            \"describe\": \"新增\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"get\", \n                            \"describe\": \"详情\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"query\", \n                            \"describe\": \"查询\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"update\", \n                            \"describe\": \"修改\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"delete\", \n                            \"describe\": \"删除\", \n                            \"defaultCheck\": false\n                        }\n                    ], \n                    \"actionList\": null, \n                    \"dataAccess\": null\n                }, \n                {\n                    \"roleId\": \"admin\", \n                    \"permissionId\": \"order\", \n                    \"permissionName\": \"订单管理\", \n                    \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\", \n                    \"actionEntitySet\": [\n                        {\n                            \"action\": \"add\", \n                            \"describe\": \"新增\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"query\", \n                            \"describe\": \"查询\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"get\", \n                            \"describe\": \"详情\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"update\", \n                            \"describe\": \"修改\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"delete\", \n                            \"describe\": \"删除\", \n                            \"defaultCheck\": false\n                        }\n                    ], \n                    \"actionList\": null, \n                    \"dataAccess\": null\n                }, \n                {\n                    \"roleId\": \"admin\", \n                    \"permissionId\": \"permission\", \n                    \"permissionName\": \"权限管理\", \n                    \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\", \n                    \"actionEntitySet\": [\n                        {\n                            \"action\": \"add\", \n                            \"describe\": \"新增\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"get\", \n                            \"describe\": \"详情\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"update\", \n                            \"describe\": \"修改\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"delete\", \n                            \"describe\": \"删除\", \n                            \"defaultCheck\": false\n                        }\n                    ], \n                    \"actionList\": null, \n                    \"dataAccess\": null\n                }, \n                {\n                    \"roleId\": \"admin\", \n                    \"permissionId\": \"role\", \n                    \"permissionName\": \"角色管理\", \n                    \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\", \n                    \"actionEntitySet\": [\n                        {\n                            \"action\": \"add\", \n                            \"describe\": \"新增\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"get\", \n                            \"describe\": \"详情\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"update\", \n                            \"describe\": \"修改\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"delete\", \n                            \"describe\": \"删除\", \n                            \"defaultCheck\": false\n                        }\n                    ], \n                    \"actionList\": null, \n                    \"dataAccess\": null\n                }, \n                {\n                    \"roleId\": \"admin\", \n                    \"permissionId\": \"table\", \n                    \"permissionName\": \"桌子管理\", \n                    \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"query\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"查询\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"}]\", \n                    \"actionEntitySet\": [\n                        {\n                            \"action\": \"add\", \n                            \"describe\": \"新增\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"get\", \n                            \"describe\": \"详情\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"query\", \n                            \"describe\": \"查询\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"update\", \n                            \"describe\": \"修改\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"delete\", \n                            \"describe\": \"删除\", \n                            \"defaultCheck\": false\n                        }\n                    ], \n                    \"actionList\": null, \n                    \"dataAccess\": null\n                }, \n                {\n                    \"roleId\": \"admin\", \n                    \"permissionId\": \"user\", \n                    \"permissionName\": \"用户管理\", \n                    \"actions\": \"[{\\\"action\\\":\\\"add\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"新增\\\"},{\\\"action\\\":\\\"import\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导入\\\"},{\\\"action\\\":\\\"get\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"详情\\\"},{\\\"action\\\":\\\"update\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"修改\\\"},{\\\"action\\\":\\\"delete\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"删除\\\"},{\\\"action\\\":\\\"export\\\",\\\"defaultCheck\\\":false,\\\"describe\\\":\\\"导出\\\"}]\", \n                    \"actionEntitySet\": [\n                        {\n                            \"action\": \"add\", \n                            \"describe\": \"新增\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"import\", \n                            \"describe\": \"导入\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"get\", \n                            \"describe\": \"详情\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"update\", \n                            \"describe\": \"修改\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"delete\", \n                            \"describe\": \"删除\", \n                            \"defaultCheck\": false\n                        }, \n                        {\n                            \"action\": \"export\", \n                            \"describe\": \"导出\", \n                            \"defaultCheck\": false\n                        }\n                    ], \n                    \"actionList\": null, \n                    \"dataAccess\": null\n                }\n            ]\n        }\n    }, \n    \"status\": 200, \n    \"timestamp\": 1534844188679\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/userinfo.json",
    "content": "{\n  \"data\": [\n    {\n      \"department\": \"技术部\",\n      \"post\": \"主管\",\n      \"data\": \"2020年6月25日\",\n      \"name\": \"张三\",\n      \"sex\": \"男\",\n      \"birth\": \"2020年6月25日\",\n      \"political\": \"党员\",\n      \"office\": \"法院\",\n      \"nation\": \"汉\",\n      \"health\": \"良好\",\n      \"register\": \"农民\",\n      \"education\": \"本科\",\n      \"major\": \"计算机\",\n      \"gdata\": \"2020年6月25日\",\n      \"mailbox\": \"123@qq.com\",\n      \"telphone\": \"18034569685\",\n      \"homephone\": \"\",\n      \"pworktime\": \"669633555222\",\n      \"entrytime\": \"2020年6月25日\",\n      \"school\": \"北京邮电大学\",\n      \"iDCard\": \"523698541123333\",\n      \"party\": \"2020年6月25日 上海\",\n      \"marital\": \"已婚\",\n      \"children\": \"有\",\n      \"hukoustreet\": \"北京市朝阳区亚运村街道\",\n      \"hukounum\": \"050000\",\n      \"hukoudi\": \"北京市朝阳区亚运村亚运村小区19号楼7单元901\",\n      \"Currentdi\": \"北京市朝阳区亚运村亚运村小区19号楼7单元901\",\n      \"Currentnum\": \"050000\",\n      \"socialsecurity\": \"是\",\n      \"providentfund\": \"是\",\n      \"hobby\": \"看书\",\n      \"sbtype\": \"城镇社保\",\n      \"archivesdi\": \"北京市朝阳区社保局\"\n    }\n  ]\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/workplace_activity.json",
    "content": "{\n  \"message\": \"\",\n  \"result\": [\n    {\n      \"id\": 1,\n      \"user\": {\n        \"nickname\": \"Barbara Lee\",\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png\"\n      },\n      \"project\": {\n        \"name\": \"白鹭酱油开发组\",\n        \"action\": \"更新\",\n        \"event\": \"番组计划\"\n      },\n      \"time\": \"2018-08-23 14:47:00\"\n    },\n    {\n      \"id\": 1,\n      \"user\": {\n        \"nickname\": \"蓝莓酱\",\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/jZUIxmJycoymBprLOUbT.png\"\n      },\n      \"project\": {\n        \"name\": \"白鹭酱油开发组\",\n        \"action\": \"更新\",\n        \"event\": \"番组计划\"\n      },\n      \"time\": \"2018-08-23 09:35:37\"\n    },\n    {\n      \"id\": 1,\n      \"user\": {\n        \"nickname\": \"Brian Young\",\n        \"avatar\": \"http://dummyimage.com/64x64\"\n      },\n      \"project\": {\n        \"name\": \"白鹭酱油开发组\",\n        \"action\": \"创建\",\n        \"event\": \"番组计划\"\n      },\n      \"time\": \"2017-05-27 00:00:00\"\n    },\n    {\n      \"id\": 1,\n      \"user\": {\n        \"nickname\": \"曲丽丽\",\n        \"avatar\": \"http://dummyimage.com/64x64\"\n      },\n      \"project\": {\n        \"name\": \"高逼格设计天团\",\n        \"action\": \"更新\",\n        \"event\": \"六月迭代\"\n      },\n      \"time\": \"2018-08-23 14:47:00\"\n    },\n    {\n      \"id\": 1,\n      \"user\": {\n        \"nickname\": \"Dorothy Thompson\",\n        \"avatar\": \"http://dummyimage.com/64x64\"\n      },\n      \"project\": {\n        \"name\": \"高逼格设计天团\",\n        \"action\": \"created\",\n        \"event\": \"六月迭代\"\n      },\n      \"time\": \"2018-08-23 14:47:00\"\n    },\n    {\n      \"id\": 1,\n      \"user\": {\n        \"nickname\": \"曲丽丽\",\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png\"\n      },\n      \"project\": {\n        \"name\": \"高逼格设计天团\",\n        \"action\": \"created\",\n        \"event\": \"六月迭代\"\n      },\n      \"time\": \"2018-08-23 14:47:00\"\n    }\n  ],\n  \"status\": 200,\n  \"timestamp\": 0\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/workplace_projects.json",
    "content": "{\n  \"message\": \"\",\n  \"result\": {\n    \"data\": [\n      {\n        \"id\": 1,\n        \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png\",\n        \"title\": \"Alipay\",\n        \"description\": \"那是一种内在的东西， 他们到达不了，也无法触及的\",\n        \"status\": 1,\n        \"updatedAt\": \"2018-07-26 00:00:00\"\n      },\n      {\n        \"id\": 2,\n        \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png\",\n        \"title\": \"Angular\",\n        \"description\": \"希望是一个好东西，也许是最好的，好东西是不会消亡的\",\n        \"status\": 1,\n        \"updatedAt\": \"2018-07-26 00:00:00\"\n      },\n      {\n        \"id\": 3,\n        \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png\",\n        \"title\": \"Ant Design\",\n        \"description\": \"城镇中有那么多的酒馆，她却偏偏走进了我的酒馆\",\n        \"status\": 1,\n        \"updatedAt\": \"2018-07-26 00:00:00\"\n      },\n      {\n        \"id\": 4,\n        \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png\",\n        \"title\": \"Ant Design Pro\",\n        \"description\": \"那时候我只会想自己想要什么，从不想自己拥有什么\",\n        \"status\": 1,\n        \"updatedAt\": \"2018-07-26 00:00:00\"\n      },\n      {\n        \"id\": 5,\n        \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png\",\n        \"title\": \"Bootstrap\",\n        \"description\": \"凛冬将至\",\n        \"status\": 1,\n        \"updatedAt\": \"2018-07-26 00:00:00\"\n      },\n      {\n        \"id\": 6,\n        \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png\",\n        \"title\": \"Vue\",\n        \"description\": \"生命就像一盒巧克力，结果往往出人意料\",\n        \"status\": 1,\n        \"updatedAt\": \"2018-07-26 00:00:00\"\n      }\n    ],\n    \"pageSize\": 10,\n    \"pageNo\": 1,\n    \"totalPage\": 6,\n    \"totalCount\": 57\n  },\n  \"status\": 200,\n  \"timestamp\": 1534955098193\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/workplace_radar.json",
    "content": "{\n  \"message\": \"\",\n  \"result\": [\n    {\n      \"item\": \"引用\",\n      \"个人\": 70,\n      \"团队\": 30,\n      \"部门\": 40\n    },\n    {\n      \"item\": \"口碑\",\n      \"个人\": 60,\n      \"团队\": 70,\n      \"部门\": 40\n    },\n    {\n      \"item\": \"产量\",\n      \"个人\": 50,\n      \"团队\": 60,\n      \"部门\": 40\n    },\n    {\n      \"item\": \"贡献\",\n      \"个人\": 40,\n      \"团队\": 50,\n      \"部门\": 40\n    },\n    {\n      \"item\": \"热度\",\n      \"个人\": 60,\n      \"团队\": 70,\n      \"部门\": 40\n    },\n    {\n      \"item\": \"引用\",\n      \"个人\": 70,\n      \"团队\": 50,\n      \"部门\": 40\n    }\n  ],\n  \"status\": 200,\n  \"timestamp\": 1534955098193\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/json/workplace_teams.json",
    "content": "{\n  \"message\": \"\",\n  \"result\": [\n    {\n      \"id\": 1,\n      \"name\": \"科学搬砖组\",\n      \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png\"\n    },\n    {\n      \"id\": 2,\n      \"name\": \"程序员日常\",\n      \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/cnrhVkzwxjPwAaCfPbdc.png\"\n    },\n    {\n      \"id\": 1,\n      \"name\": \"设计天团\",\n      \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/gaOngJwsRYRaVAuXXcmB.png\"\n    },\n    {\n      \"id\": 1,\n      \"name\": \"中二少女团\",\n      \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ubnKSIfAJTxIgXOKlciN.png\"\n    },\n    {\n      \"id\": 1,\n      \"name\": \"骗你学计算机\",\n      \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/WhxKECPNujWoWEFNdnJE.png\"\n    }\n  ],\n  \"status\": 200,\n  \"timestamp\": 0\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/controller/VxeMockController.java",
    "content": "package org.jeecg.modules.demo.mock.vxe.controller;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.io.IOUtils;\nimport org.apache.commons.lang3.StringUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.VxeSocketConst;\nimport org.jeecg.common.system.query.MatchTypeEnum;\nimport org.jeecg.common.system.query.QueryCondition;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.modules.demo.mock.vxe.entity.MockEntity;\nimport org.jeecg.modules.demo.mock.vxe.websocket.VxeSocket;\nimport org.springframework.web.bind.annotation.*;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.URLDecoder;\nimport java.util.*;\n\n/**\n * @Description: VxeMockController\n * @author: jeecg-boot\n */\n@RestController\n@RequestMapping(\"/mock/vxe\")\n@Slf4j\npublic class VxeMockController {\n\n    /**\n     * 模拟更改状态\n     *\n     * @param id\n     * @param status\n     * @return\n     */\n    @GetMapping(\"/change1\")\n    public Result mockChange1(@RequestParam(\"id\") String id, @RequestParam(\"status\") String status) {\n        /* id 为 行的id（rowId），只要获取到rowId，那么只需要调用 VXESocket.sendMessageToAll() 即可 */\n\n        // 封装行数据\n        JSONObject rowData = new JSONObject();\n        // 这个字段就是要更改的行数据ID\n        rowData.put(\"id\", id);\n        // 这个字段就是要更改的列的key和具体的值\n        rowData.put(\"status\", status);\n        // 模拟更改数据\n        this.mockChange(rowData);\n\n        return Result.ok();\n    }\n\n    /**\n     * 模拟更改拖轮状态\n     *\n     * @param id\n     * @param tug_status\n     * @return\n     */\n    @Deprecated\n    @GetMapping(\"/change2\")\n    public Result mockChange2(@RequestParam(\"id\") String id,@RequestParam(\"tug_status\") String tugStatus) {\n        /* id 为 行的id（rowId），只要获取到rowId，那么只需要调用 VXESocket.sendMessageToAll() 即可 */\n\n        // 封装行数据\n        JSONObject rowData = new JSONObject();\n        // 这个字段就是要更改的行数据ID\n        rowData.put(\"id\", id);\n        // 这个字段就是要更改的列的key和具体的值\n        JSONObject status = JSON.parseObject(tugStatus);\n        rowData.put(\"tug_status\", status);\n        // 模拟更改数据\n        this.mockChange(rowData);\n\n        return Result.ok();\n    }\n\n    /**\n     * 模拟更改进度条状态\n     *\n     * @param id\n     * @param progress\n     * @return\n     */\n    @GetMapping(\"/change3\")\n    public Result mockChange3(@RequestParam(\"id\") String id, @RequestParam(\"progress\") String progress) {\n        /* id 为 行的id（rowId），只要获取到rowId，那么只需要调用 VXESocket.sendMessageToAll() 即可 */\n\n        // 封装行数据\n        JSONObject rowData = new JSONObject();\n        // 这个字段就是要更改的行数据ID\n        rowData.put(\"id\", id);\n        // 这个字段就是要更改的列的key和具体的值\n        rowData.put(\"progress\", progress);\n        // 模拟更改数据\n        this.mockChange(rowData);\n\n        return Result.ok();\n    }\n\n    private void mockChange(JSONObject rowData) {\n        // 封装socket数据\n        JSONObject socketData = new JSONObject();\n        // 这里的 socketKey 必须要和调度计划页面上写的 socketKey 属性保持一致\n        socketData.put(\"socketKey\", \"page-dispatch\");\n        // 这里的 args 必须得是一个数组，下标0是行数据，下标1是caseId，一般不用传\n        socketData.put(\"args\", new Object[]{rowData, \"\"});\n        // 封装消息字符串，这里的\n        // type 必须是 VXESocketConst.TYPE_UVT\n        String message = VxeSocket.packageMessage(VxeSocketConst.TYPE_UVT, socketData);\n        // 调用 sendMessageToAll 发送给所有在线的用户\n        VxeSocket.sendMessageToAll(message);\n    }\n\n    /**\n     * 模拟更改【大船待审】状态\n     *\n     * @param status\n     * @return\n     */\n    @GetMapping(\"/change4\")\n    public Result mockChange4(@RequestParam(\"status\") String status) {\n        // 封装socket数据\n        JSONObject socketData = new JSONObject();\n        // 这里的 key 是前端注册时使用的key，必须保持一致\n        socketData.put(\"key\", \"dispatch-dcds-status\");\n        // 这里的 args 必须得是一个数组，每一位都是注册方法的参数，按顺序传递\n        socketData.put(\"args\", new Object[]{status});\n\n        // 封装消息字符串，这里的 type 必须是 VXESocketConst.TYPE_UVT\n        String message = VxeSocket.packageMessage(VxeSocketConst.TYPE_CSD, socketData);\n        // 调用 sendMessageToAll 发送给所有在线的用户\n        VxeSocket.sendMessageToAll(message);\n\n        return Result.ok();\n    }\n\n    /**\n     * 【模拟】即时保存单行数据\n     *\n     * @param rowData 行数据，实际使用时可以替换成一个实体类\n     */\n    @PutMapping(\"/immediateSaveRow\")\n    public Result mockImmediateSaveRow(@RequestBody JSONObject rowData) throws Exception {\n        System.out.println(\"即时保存.rowData：\" + rowData.toJSONString());\n        // 延时1.5秒，模拟网慢堵塞真实感\n        Thread.sleep(500);\n        return Result.ok();\n    }\n\n    /**\n     * 【模拟】即时保存整个表格的数据\n     *\n     * @param tableData 表格数据（实际使用时可以替换成一个List实体类）\n     */\n    @PostMapping(\"/immediateSaveAll\")\n    public Result mockImmediateSaveAll(@RequestBody JSONArray tableData) throws Exception {\n        // 【注】：\n        // 1、tableData里包含该页所有的数据\n        // 2、如果你实现了“即时保存”，那么除了新增的数据，其他的都是已经保存过的了，\n        //    不需要再进行一次update操作了，所以可以在前端传数据的时候就遍历判断一下，\n        //    只传新增的数据给后台insert即可，否者将会造成性能上的浪费。\n        // 3、新增的行是没有id的，通过这一点，就可以判断是否是新增的数据\n\n        System.out.println(\"即时保存.tableData：\" + tableData.toJSONString());\n        // 延时1.5秒，模拟网慢堵塞真实感\n        Thread.sleep(1000);\n        return Result.ok();\n    }\n\n    /**\n     * 获取模拟数据\n     *\n     * @param pageNo   页码\n     * @param pageSize 页大小\n     * @param parentId 父ID，不传则查询顶级\n     * @return\n     */\n    @GetMapping(\"/getData\")\n    public Result getMockData(\n            @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n            @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n            // 父级id，根据父级id查询子级，如果为空则查询顶级\n            @RequestParam(name = \"parentId\", required = false) String parentId\n    ) {\n        // 模拟JSON数据路径\n        String path = \"classpath:org/jeecg/modules/demo/mock/vxe/json/dlglong.json\";\n        // 读取JSON数据\n        JSONArray dataList = readJsonData(path);\n        if (dataList == null) {\n            return Result.error(\"读取数据失败！\");\n        }\n        IPage<JSONObject> page = this.queryDataPage(dataList, parentId, pageNo, pageSize);\n        return Result.ok(page);\n    }\n\n    /**\n     * 获取模拟“调度计划”页面的数据\n     *\n     * @param pageNo   页码\n     * @param pageSize 页大小\n     * @param parentId 父ID，不传则查询顶级\n     * @return\n     */\n    @GetMapping(\"/getDdjhData\")\n    public Result getMockDdjhData(\n            // SpringMVC 会自动将参数注入到实体里\n            MockEntity mockEntity,\n            @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n            @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n            // 父级id，根据父级id查询子级，如果为空则查询顶级\n            @RequestParam(name = \"parentId\", required = false) String parentId,\n            @RequestParam(name = \"status\", required = false) String status,\n            // 高级查询条件\n            @RequestParam(name = \"superQueryParams\", required = false) String superQueryParams,\n            // 高级查询模式\n            @RequestParam(name = \"superQueryMatchType\", required = false) String superQueryMatchType,\n            HttpServletRequest request\n    ) {\n        // 获取查询条件（前台传递的查询参数）\n        Map<String, String[]> parameterMap = request.getParameterMap();\n        // 遍历输出到控制台\n        System.out.println(\"\\ngetDdjhData - 普通查询条件：\");\n        for (String key : parameterMap.keySet()) {\n            System.out.println(\"-- \" + key + \": \" + JSON.toJSONString(parameterMap.get(key)));\n        }\n        // 输出高级查询\n        try {\n            System.out.println(\"\\ngetDdjhData - 高级查询条件：\");\n            // 高级查询模式\n            MatchTypeEnum matchType = MatchTypeEnum.getByValue(superQueryMatchType);\n            if (matchType == null) {\n                System.out.println(\"-- 高级查询模式：不识别（\" + superQueryMatchType + \"）\");\n            } else {\n                System.out.println(\"-- 高级查询模式：\" + matchType.getValue());\n            }\n            superQueryParams = URLDecoder.decode(superQueryParams, \"UTF-8\");\n            List<QueryCondition> conditions = JSON.parseArray(superQueryParams, QueryCondition.class);\n            if (conditions != null) {\n                for (QueryCondition condition : conditions) {\n                    System.out.println(\"-- \" + JSON.toJSONString(condition));\n                }\n            } else {\n                System.out.println(\"-- 没有传递任何高级查询条件\");\n            }\n            System.out.println();\n        } catch (Exception e) {\n            log.error(\"-- 高级查询操作失败：\" + superQueryParams, e);\n            e.printStackTrace();\n        }\n\n        /* 注：实际使用中不用写上面那种繁琐的代码，这里只是为了直观的输出到控制台里而写的示例，\n              使用下面这种写法更简洁方便 */\n\n        // 封装成 MyBatisPlus 能识别的 QueryWrapper，可以直接使用这个对象进行SQL筛选条件拼接\n        // 这个方法也会自动封装高级查询条件，但是高级查询参数名必须是superQueryParams和superQueryMatchType\n        QueryWrapper<MockEntity> queryWrapper = QueryGenerator.initQueryWrapper(mockEntity, parameterMap);\n        System.out.println(\"queryWrapper： \" + queryWrapper.getCustomSqlSegment());\n\n        // 模拟JSON数据路径\n        String path = \"classpath:org/jeecg/modules/demo/mock/vxe/json/ddjh.json\";\n        String statusValue = \"8\";\n        if (statusValue.equals(status)) {\n            path = \"classpath:org/jeecg/modules/demo/mock/vxe/json/ddjh_s8.json\";\n        }\n        // 读取JSON数据\n        JSONArray dataList = readJsonData(path);\n        if (dataList == null) {\n            return Result.error(\"读取数据失败！\");\n        }\n\n        IPage<JSONObject> page = this.queryDataPage(dataList, parentId, pageNo, pageSize);\n        // 逐行查询子表数据，用于计算拖轮状态\n        List<JSONObject> records = page.getRecords();\n        for (JSONObject record : records) {\n            Map<String, Integer> tugStatusMap = new HashMap<>(5);\n            String id = record.getString(\"id\");\n            // 查询出主表的拖轮\n            String tugMain = record.getString(\"tug\");\n            // 判断是否有值\n            if (StringUtils.isNotBlank(tugMain)) {\n                // 拖轮根据分号分割\n                String[] tugs = tugMain.split(\";\");\n                // 查询子表数据\n                List<JSONObject> subRecords = this.queryDataPage(dataList, id, null, null).getRecords();\n                // 遍历子表和拖轮数据，找出进行计算反推拖轮状态\n                for (JSONObject subData : subRecords) {\n                    String subTug = subData.getString(\"tug\");\n                    if (StringUtils.isNotBlank(subTug)) {\n                        for (String tug : tugs) {\n                            if (tug.equals(subTug)) {\n                                // 计算拖轮状态逻辑\n                                int statusCode = 0;\n\n                                /* 如果有发船时间、作业开始时间、作业结束时间、回船时间，则主表中的拖轮列中的每个拖轮背景色要即时变色 */\n\n                                // 有发船时间，状态 +1\n                                String departureTime = subData.getString(\"departure_time\");\n                                if (StringUtils.isNotBlank(departureTime)) {\n                                    statusCode += 1;\n                                }\n                                // 有作业开始时间，状态 +1\n                                String workBeginTime = subData.getString(\"work_begin_time\");\n                                if (StringUtils.isNotBlank(workBeginTime)) {\n                                    statusCode += 1;\n                                }\n                                // 有作业结束时间，状态 +1\n                                String workEndTime = subData.getString(\"work_end_time\");\n                                if (StringUtils.isNotBlank(workEndTime)) {\n                                    statusCode += 1;\n                                }\n                                // 有回船时间，状态 +1\n                                String returnTime = subData.getString(\"return_time\");\n                                if (StringUtils.isNotBlank(returnTime)) {\n                                    statusCode += 1;\n                                }\n                                // 保存拖轮状态，key是拖轮的值，value是状态，前端根据不同的状态码，显示不同的颜色，这个颜色也可以后台计算完之后返回给前端直接使用\n                                tugStatusMap.put(tug, statusCode);\n                                break;\n                            }\n                        }\n                    }\n                }\n            }\n            // 新加一个字段用于保存拖轮状态，不要直接覆盖原来的，这个字段可以不保存到数据库里\n            record.put(\"tug_status\", tugStatusMap);\n        }\n        page.setRecords(records);\n        return Result.ok(page);\n    }\n\n    /**\n     * 模拟查询数据，可以根据父ID查询，可以分页\n     *\n     * @param dataList 数据列表\n     * @param parentId 父ID\n     * @param pageNo   页码\n     * @param pageSize 页大小\n     * @return\n     */\n    private IPage<JSONObject> queryDataPage(JSONArray dataList, String parentId, Integer pageNo, Integer pageSize) {\n        // 根据父级id查询子级\n        JSONArray dataDb = dataList;\n        if (StringUtils.isNotBlank(parentId)) {\n            JSONArray results = new JSONArray();\n            List<String> parentIds = Arrays.asList(parentId.split(\",\"));\n            this.queryByParentId(dataDb, parentIds, results);\n            dataDb = results;\n        }\n        // 模拟分页（实际中应用SQL自带的分页）\n        List<JSONObject> records = new ArrayList<>();\n        IPage<JSONObject> page;\n        long beginIndex, endIndex;\n        // 如果任意一个参数为null，则不分页\n        if (pageNo == null || pageSize == null) {\n            page = new Page<>(0, dataDb.size());\n            beginIndex = 0;\n            endIndex = dataDb.size();\n        } else {\n            page = new Page<>(pageNo, pageSize);\n            beginIndex = page.offset();\n            endIndex = page.offset() + page.getSize();\n        }\n        for (long i = beginIndex; (i < endIndex && i < dataDb.size()); i++) {\n            JSONObject data = dataDb.getJSONObject((int) i);\n            data = JSON.parseObject(data.toJSONString());\n            // 不返回 children\n            data.remove(\"children\");\n            records.add(data);\n        }\n        page.setRecords(records);\n        page.setTotal(dataDb.size());\n        return page;\n    }\n\n    private void queryByParentId(JSONArray dataList, List<String> parentIds, JSONArray results) {\n        for (int i = 0; i < dataList.size(); i++) {\n            JSONObject data = dataList.getJSONObject(i);\n            JSONArray children = data.getJSONArray(\"children\");\n            // 找到了该父级\n            if (parentIds.contains(data.getString(\"id\"))) {\n                if (children != null) {\n                    // addAll 的目的是将多个子表的数据合并在一起\n                    results.addAll(children);\n                }\n            } else {\n                if (children != null) {\n                    queryByParentId(children, parentIds, results);\n                }\n            }\n        }\n        results.addAll(new JSONArray());\n    }\n\n    private JSONArray readJsonData(String path) {\n        try {\n            InputStream stream = getClass().getClassLoader().getResourceAsStream(path.replace(\"classpath:\", \"\"));\n            if (stream != null) {\n                String json = IOUtils.toString(stream, \"UTF-8\");\n                return JSON.parseArray(json);\n            }\n        } catch (IOException e) {\n            log.error(e.getMessage(), e);\n        }\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/entity/MockEntity.java",
    "content": "package org.jeecg.modules.demo.mock.vxe.entity;\n\nimport lombok.Data;\n\n/**\n * 模拟实体\n * @author: jeecg-boot\n */\n@Data\npublic class MockEntity {\n\n    /**\n     * id\n     */\n    private String id;\n    /**\n     * 父级ID\n     */\n    private String parentId;\n    /**\n     * 状态\n     */\n    private String status;\n\n    /* -- 省略其他字段 -- */\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/json/ddjh.json",
    "content": "[\n  {\n    \"id\": \"60194678c39ed439d1d19265e3289706\",\n    \"remarks\": \"鮲鉒导趭溮呚鵮叜尷熓熯汫\",\n    \"status\": \"8\",\n    \"progress\": 52,\n    \"jh_date\": \"11/07/27 1713\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"賛總搗\",\n    \"tug\": \"31;32;33;34;35\",\n    \"english_ship_name\": \"twykcc\",\n    \"call\": \"5BZTIU\",\n    \"ship_captain\": \"贝册\",\n    \"ton\": 554646,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"濮诎\",\n    \"payer_company\": \"鱦蘭有限公司\",\n    \"ship_company\": \"e9ca23d68d884d4ebb19d07889727dae\",\n    \"begin_point\": \"蓠榡\",\n    \"end_point\": \"種蓥\",\n    \"route\": \"第 3航线\",\n    \"power\": \"56千瓦\",\n    \"dispatcher\": \"游朤\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"7894f937563e4c9a2bdfa99149167954\",\n        \"parentId\": \"60194678c39ed439d1d19265e3289706\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2062-11-09 16:52:57\",\n        \"receive_time\": \"2215-07-15 05:47:47\",\n        \"dd_num\": \"968450127373\",\n        \"departure_time\": \"\",\n        \"work_begin_time\": \"\",\n        \"work_end_time\": \"\",\n        \"return_time\": \"\",\n        \"auxiliary_time\": \"2237-11-19 05:39:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 283,\n        \"task_content\": \"薮攗皵洙籱弇核庮憔装菢寓患氊蜋辢麵血徙矚鞓鐓鎼汔畊鰂礄癄醼摨尙馹洇界汽垲蜼褚鼑秬嫬褴痗覯堥燢鑡嘕対錸跾踘佈狅龎醠岄物篆忬鵤硲驂姺霢\"\n      },\n      {\n        \"id\": \"60d2e872cbc16d24bef59ea13e87f90d\",\n        \"parentId\": \"60194678c39ed439d1d19265e3289706\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2260-05-08 03:56:16\",\n        \"receive_time\": \"2244-11-06 19:31:53\",\n        \"dd_num\": \"855789628238\",\n        \"departure_time\": \"2075-08-13 01:12:22\",\n        \"work_begin_time\": \"\",\n        \"work_end_time\": \"\",\n        \"return_time\": \"\",\n        \"auxiliary_time\": \"2110-02-28 19:57:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 462,\n        \"task_content\": \"獂标瑐幭猁贿樕挶藄迷鵭觇蚐輰六鋗嘮鋨瓺搂甊悗荮覓驂鳩啙甲蜹軴瘮訐笽周贗毻脽舿裥鞂匘\"\n      },\n      {\n        \"id\": \"a9f41871f04e31fb36349b42980efca5\",\n        \"parentId\": \"60194678c39ed439d1d19265e3289706\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2147-04-08 00:07:24\",\n        \"receive_time\": \"2132-12-30 20:29:56\",\n        \"dd_num\": \"726239349044\",\n        \"departure_time\": \"2141-04-04 16:23:21\",\n        \"work_begin_time\": \"2021-09-01 17:07:09\",\n        \"work_end_time\": \"\",\n        \"return_time\": \"\",\n        \"auxiliary_time\": \"2262-04-17 23:16:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 631,\n        \"task_content\": \"汘瘞刟謗硕訠幍調傀錐騐竆蚗鱪儎晔娈繣屪殃苠旹祻懅瑐瑣鈛伀飻鮐訖粥喸臚馜玅挤\"\n      },\n      {\n        \"id\": \"30fe93bacb01bfba4d502b17cdce0041\",\n        \"parentId\": \"60194678c39ed439d1d19265e3289706\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2002-06-21 14:12:39\",\n        \"receive_time\": \"2083-03-07 15:15:43\",\n        \"dd_num\": \"425411019641\",\n        \"departure_time\": \"2178-03-13 20:39:40\",\n        \"work_begin_time\": \"2016-07-07 09:01:39\",\n        \"work_end_time\": \"2270-12-05 02:41:13\",\n        \"return_time\": \"\",\n        \"auxiliary_time\": \"2129-05-17 20:37:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 879,\n        \"task_content\": \"蕣洐鐍貍嶊瘏賫蕢惲囤訑隻衺錛佌顜茗澱娿筷釗篝簗伻櫌儋蕑搪脀翨吶鯇鶫鋎倸繱憃颾綫楹瑡皒澞艛仱儝癉垿杏檾昍樁焰澵嵤歝昵旼寉雾着噷繄斜聲漿绤茶觍騚詄抋礌曨詸鮪裖翃绕曎趇璀\"\n      },\n      {\n        \"id\": \"3b3f8b8881ddea51249f6d94caed22a0\",\n        \"parentId\": \"60194678c39ed439d1d19265e3289706\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1990-11-19 22:10:28\",\n        \"receive_time\": \"2280-03-05 15:07:13\",\n        \"dd_num\": \"349049524153\",\n        \"departure_time\": \"2181-06-02 23:28:40\",\n        \"work_begin_time\": \"2163-03-24 22:37:13\",\n        \"work_end_time\": \"2140-11-11 12:17:37\",\n        \"return_time\": \"2010-04-21 08:40:44\",\n        \"auxiliary_time\": \"2112-05-03 12:43:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 250,\n        \"task_content\": \"肅褍碷腑聵芑濈蒲筺闝玆份頰邨唛隡桦憟爼廙需蛬袵数禔芊虗繸詑雕劜罽蜆乄稅搼帑廁锼拦鼫靅萘絤琯拦涽舴\"\n      },\n      {\n        \"id\": \"554c5a941fa356ec431f658573e5f5ae\",\n        \"parentId\": \"60194678c39ed439d1d19265e3289706\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2278-11-11 10:11:52\",\n        \"receive_time\": \"2178-10-08 14:12:27\",\n        \"dd_num\": \"607845260597\",\n        \"departure_time\": \"2255-05-10 16:08:52\",\n        \"work_begin_time\": \"2067-12-06 09:04:34\",\n        \"work_end_time\": \"1980-03-28 02:02:07\",\n        \"return_time\": \"2175-08-25 14:54:58\",\n        \"auxiliary_time\": \"2133-08-21 23:54:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 803,\n        \"task_content\": \"鄐閬嫭乘螕酬扞胤嫋鷫謸耚弃腋撡娛醪批皛偯匍胪汒墨除槻驕旘灨猉攺嶒廞\"\n      },\n      {\n        \"id\": \"e7c1a822d7677cc0f9253c5814d26804\",\n        \"parentId\": \"60194678c39ed439d1d19265e3289706\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2157-01-06 01:57:11\",\n        \"receive_time\": \"2100-11-21 04:20:57\",\n        \"dd_num\": \"735150447697\",\n        \"departure_time\": \"2123-07-23 16:09:25\",\n        \"work_begin_time\": \"2125-11-11 04:40:41\",\n        \"work_end_time\": \"2116-10-25 11:29:53\",\n        \"return_time\": \"2198-04-10 16:37:23\",\n        \"auxiliary_time\": \"2094-10-29 12:41:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 839,\n        \"task_content\": \"湱澬泟厭蹠高发娍員笁鞁鬞拯摏閜坸躊畋讬裖镍鵄磧篮枩捭讜諛捚竐企巈諟撞甋賨郿帉蜰讴繶璂斲旽藉誕蒒谏鵓刉胼妡楗棛家塴钊轵駀乀撨歨昘汢幽睞額蛹淎煐腜诪燧骈鸝蝅砒殒乩橋桁絨哕躝佚譩\"\n      }\n    ]\n  },\n  {\n    \"id\": \"7d67c5dba3a3c469f93191bf847a86dd\",\n    \"remarks\": \"虧菻較萢灑扰樓蛘纱頓篃鍄\",\n    \"status\": \"1\",\n    \"progress\": 13,\n    \"jh_date\": \"98/12/29 1355\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"瘝蔿玿\",\n    \"tug\": \"18\",\n    \"english_ship_name\": \"xaqu1a\",\n    \"call\": \"3ABDLS\",\n    \"ship_captain\": \"钮黼玧\",\n    \"ton\": 340539,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"燕睩偒\",\n    \"payer_company\": \"鼷猫有限公司\",\n    \"ship_company\": \"螓鎈有限公司\",\n    \"begin_point\": \"蔠鞲\",\n    \"end_point\": \"舨賣\",\n    \"route\": \"第 2航线\",\n    \"power\": \"58千瓦\",\n    \"dispatcher\": \"梅娏鵗\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"3541adaa8edeb3d83a38b047440d3c37\",\n        \"parentId\": \"7d67c5dba3a3c469f93191bf847a86dd\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2038-07-05 21:46:16\",\n        \"receive_time\": \"2035-03-05 05:32:40\",\n        \"dd_num\": \"597067444270\",\n        \"departure_time\": \"2001-02-14 10:24:41\",\n        \"work_begin_time\": \"2286-08-30 00:37:43\",\n        \"work_end_time\": \"2277-01-13 02:04:40\",\n        \"return_time\": \"2051-08-29 01:15:48\",\n        \"auxiliary_time\": \"2068-01-28 11:54:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 580,\n        \"task_content\": \"蔡绚谭侙刁熵牃雑蝅觡鋚动簙骜埢誥请罸慉攱吅晚枃濫綁淾写洩轆尌军熖烱魲魯薻荑鏍珐楧燛喂漏縤澵鬐陎嚎薓稥澘枇氾獨庁鰶潌刲鄌缗础逇褛緃砱笕傯昪蒍鼷扁鄞\"\n      },\n      {\n        \"id\": \"5550c953d4a1629e885df5466ab6f68c\",\n        \"parentId\": \"7d67c5dba3a3c469f93191bf847a86dd\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2263-09-13 11:40:22\",\n        \"receive_time\": \"2112-11-05 21:24:24\",\n        \"dd_num\": \"420663452351\",\n        \"departure_time\": \"2038-09-30 11:42:19\",\n        \"work_begin_time\": \"2211-11-18 04:27:10\",\n        \"work_end_time\": \"2189-12-17 09:33:12\",\n        \"return_time\": \"2001-08-11 13:54:25\",\n        \"auxiliary_time\": \"2183-08-13 13:03:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 305,\n        \"task_content\": \"砃閦鷲駞跛肚岙雅鼑珠鍎焾軘焨礘身詍菴籚柶鮶倵挰乜摧郉僠尙棣嬶媒肯脳膋篃骛患琨炻寲镚靓挚戆呓墺歳劷鞽焘襄禣烗圲哴鹱騔鼡曐唀谆\"\n      },\n      {\n        \"id\": \"0c790eb09dfba9079570c9abd34ac3e3\",\n        \"parentId\": \"7d67c5dba3a3c469f93191bf847a86dd\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2016-07-28 20:57:27\",\n        \"receive_time\": \"2212-02-26 14:56:50\",\n        \"dd_num\": \"941053363295\",\n        \"departure_time\": \"1972-01-14 12:11:17\",\n        \"work_begin_time\": \"2277-02-25 21:12:38\",\n        \"work_end_time\": \"2244-11-16 04:35:49\",\n        \"return_time\": \"2083-11-03 05:10:42\",\n        \"auxiliary_time\": \"2130-12-31 09:05:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 572,\n        \"task_content\": \"梺爾氻蝘攟稌禶瑝牂樶譓嗁絅婌択乻唫癥儊挚魩潿便粬渀綞齵崽蘠旙撝郸糢鵺这抜薑鳁禉謤嚒滞縉爹攈銒国麯縑荺疿頒蕀砐飒炊矼鳄俲摅\"\n      },\n      {\n        \"id\": \"0a8b01045a5dd3a5eea9b2147b5b39fc\",\n        \"parentId\": \"7d67c5dba3a3c469f93191bf847a86dd\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2083-05-28 05:33:49\",\n        \"receive_time\": \"2197-05-13 00:39:06\",\n        \"dd_num\": \"764115213078\",\n        \"departure_time\": \"2070-04-01 16:14:39\",\n        \"work_begin_time\": \"2117-03-06 16:16:55\",\n        \"work_end_time\": \"2214-02-13 20:45:11\",\n        \"return_time\": \"2056-07-10 01:36:28\",\n        \"auxiliary_time\": \"2053-12-24 09:42:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 564,\n        \"task_content\": \"瓎蓥堭鵌萓偳樺衅畛衺鲓鳗湨蠃繅馥塎艱休繲喂珃连膞琎猁忈圁愠栻嬓仍黜椧\"\n      },\n      {\n        \"id\": \"6efc5241b6b7ad003c5cb90f341e6f6c\",\n        \"parentId\": \"7d67c5dba3a3c469f93191bf847a86dd\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2081-09-28 18:48:57\",\n        \"receive_time\": \"2281-12-27 12:47:45\",\n        \"dd_num\": \"754027225362\",\n        \"departure_time\": \"2226-07-26 20:13:14\",\n        \"work_begin_time\": \"2121-06-09 02:32:19\",\n        \"work_end_time\": \"2156-08-11 07:54:16\",\n        \"return_time\": \"2154-10-28 22:12:24\",\n        \"auxiliary_time\": \"1998-12-08 12:00:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 673,\n        \"task_content\": \"闛賾鎟袋鳍鄔煘碰雒慙狩痋嗀鄒鋋餒腬轤燷蒕鹔楱赊鷄国娞粅染貋紫嫳堨榅鑮暭挴翐葧鮱煐噣睵獴踩鼨\"\n      },\n      {\n        \"id\": \"25b1e398dd9873c93a46b1fab14697a2\",\n        \"parentId\": \"7d67c5dba3a3c469f93191bf847a86dd\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2073-02-03 21:24:01\",\n        \"receive_time\": \"2101-06-17 00:45:28\",\n        \"dd_num\": \"907873081859\",\n        \"departure_time\": \"2111-03-08 16:17:09\",\n        \"work_begin_time\": \"2272-07-20 08:13:51\",\n        \"work_end_time\": \"2262-08-09 18:29:46\",\n        \"return_time\": \"2209-05-04 23:20:14\",\n        \"auxiliary_time\": \"2216-03-19 04:45:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 849,\n        \"task_content\": \"豥騝犾蝴浡慬螖襮瓿墓啳媀膊踙樴薺臮臕虾诎軄萄蘻岜彦猓戅拵桿歓斿嫔岖瞮腄闠栐鳤砅畢櫔昞缇岢搜糷雍堀呡錨鳉呇麨桬逮圙襫竾缩贪负\"\n      },\n      {\n        \"id\": \"f7bd48fdc233016a0d09a1ecbc5703a4\",\n        \"parentId\": \"7d67c5dba3a3c469f93191bf847a86dd\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2068-09-03 15:34:59\",\n        \"receive_time\": \"2151-02-28 10:48:23\",\n        \"dd_num\": \"840422794917\",\n        \"departure_time\": \"2053-05-08 05:01:30\",\n        \"work_begin_time\": \"2130-03-05 21:04:27\",\n        \"work_end_time\": \"2250-11-23 19:55:05\",\n        \"return_time\": \"2269-10-08 22:54:55\",\n        \"auxiliary_time\": \"2199-07-05 20:47:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 264,\n        \"task_content\": \"穿黼繛暃寤矁浘袖鋴貾逖尵歾聟灵雭帊鵓狧諙署赈稰齂岤僛糾斟幁庖赤秏邵嵕烩眘瓫珕澱槴驇喊窩鑛揁阗樭昚炒\"\n      }\n    ]\n  },\n  {\n    \"id\": \"db5e5061566a127b39107d9469ecc931\",\n    \"remarks\": \"泫鋶颚鬸哉娉藁疨邦歴麼掰\",\n    \"status\": \"2\",\n    \"progress\": 73,\n    \"jh_date\": \"60/12/09 2109\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"縂值咾\",\n    \"tug\": \"13\",\n    \"english_ship_name\": \"v56vap\",\n    \"call\": \"APPWD2\",\n    \"ship_captain\": \"上蔰\",\n    \"ton\": 224598,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"鱼軪紹\",\n    \"payer_company\": \"芔报有限公司\",\n    \"ship_company\": \"哈譻有限公司\",\n    \"begin_point\": \"艎麥\",\n    \"end_point\": \"锧冰\",\n    \"route\": \"第 7航线\",\n    \"power\": \"25千瓦\",\n    \"dispatcher\": \"第鍄辳\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a5a624c980ff326700aa6a0f578f81a7\",\n        \"parentId\": \"db5e5061566a127b39107d9469ecc931\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2136-10-05 22:04:00\",\n        \"receive_time\": \"2280-04-18 17:41:17\",\n        \"dd_num\": \"599709060672\",\n        \"departure_time\": \"2088-03-24 17:02:14\",\n        \"work_begin_time\": \"2200-03-16 00:49:15\",\n        \"work_end_time\": \"2184-09-05 08:15:36\",\n        \"return_time\": \"2126-07-06 06:09:18\",\n        \"auxiliary_time\": \"2101-09-07 00:30:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 996,\n        \"task_content\": \"揨檪嚚洆婑倘突\"\n      },\n      {\n        \"id\": \"57c5d6b1ee411e1cde88b109f2fe74bf\",\n        \"parentId\": \"db5e5061566a127b39107d9469ecc931\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2105-03-14 18:22:36\",\n        \"receive_time\": \"2097-12-06 13:41:03\",\n        \"dd_num\": \"703063334857\",\n        \"departure_time\": \"2095-11-25 01:52:26\",\n        \"work_begin_time\": \"2132-11-10 08:33:48\",\n        \"work_end_time\": \"2181-02-17 03:16:24\",\n        \"return_time\": \"2082-05-04 21:57:26\",\n        \"auxiliary_time\": \"2251-10-14 19:10:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 307,\n        \"task_content\": \"疎昍杽堔勆旫懡丐渞庘槯鑟玧訬睁俁虐窕济湊氃韟嵃齯川弜枙盠頑岂龝酢眜哱钙捩息匕朆隭鯻輀嘗邱椨脹諷騽婍運\"\n      },\n      {\n        \"id\": \"33281dd3bf82c7627b91c933ab69099f\",\n        \"parentId\": \"db5e5061566a127b39107d9469ecc931\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2031-07-28 02:45:56\",\n        \"receive_time\": \"2223-04-14 04:15:11\",\n        \"dd_num\": \"235493495979\",\n        \"departure_time\": \"2061-11-29 10:25:58\",\n        \"work_begin_time\": \"2239-07-22 11:06:15\",\n        \"work_end_time\": \"2232-09-23 13:34:36\",\n        \"return_time\": \"2061-06-01 06:12:16\",\n        \"auxiliary_time\": \"1976-10-24 15:24:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 505,\n        \"task_content\": \"蓨溯鳁欋艶爻撃霦金巪翩忺囦猓饟暓輓篓簢霓灙矷岞眽榎偽猈茘俄膃倔锕褪袿麰詒笚砽劁笠迸枭韘霳薵胵葮儐蚡歚僂葳凥鴬葹匽讶衣勎娯籃嬫说櫩镈徝闝拽跾掐熴濩詬陒遍偢聻蓭\"\n      },\n      {\n        \"id\": \"efc087038eea1d9ec5d60361db676d4f\",\n        \"parentId\": \"db5e5061566a127b39107d9469ecc931\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1984-12-28 23:07:15\",\n        \"receive_time\": \"2153-03-24 08:26:20\",\n        \"dd_num\": \"820808190980\",\n        \"departure_time\": \"2076-08-19 13:47:44\",\n        \"work_begin_time\": \"2192-06-11 13:17:18\",\n        \"work_end_time\": \"2224-04-07 17:14:19\",\n        \"return_time\": \"2119-12-05 20:07:15\",\n        \"auxiliary_time\": \"2045-06-25 13:24:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 995,\n        \"task_content\": \"艱鵉蕙煯繄屪芜獘躧扣惆滟鉓喛鶸酳鳭埩丄譧呴醔崟仔肷蒠诉菅欝匴谞嬙剀樁懎觖乓丨抵沲揭隠孓愀伞欨喐偪翹頟溅胰遇旷澳镑覙閔鳤澻嬹讋慢櫳朝狥\"\n      },\n      {\n        \"id\": \"08d9755b56553901a4ccaa037e30d73e\",\n        \"parentId\": \"db5e5061566a127b39107d9469ecc931\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2030-06-26 03:28:43\",\n        \"receive_time\": \"2233-08-15 00:22:13\",\n        \"dd_num\": \"859894187900\",\n        \"departure_time\": \"2073-02-20 18:48:14\",\n        \"work_begin_time\": \"2235-10-12 19:17:12\",\n        \"work_end_time\": \"2033-08-21 01:52:04\",\n        \"return_time\": \"2229-12-26 20:21:14\",\n        \"auxiliary_time\": \"2042-02-03 16:34:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 672,\n        \"task_content\": \"通绉旗蛢雬胋輳諆軺藑檷統菡穘翧瓈岾唗娢蜒葅荙遰鰴銈憞溦苜弘魡諰\"\n      },\n      {\n        \"id\": \"7c2eb6eb27987456d8b2f45c730c3688\",\n        \"parentId\": \"db5e5061566a127b39107d9469ecc931\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2153-07-18 14:05:32\",\n        \"receive_time\": \"2101-04-16 21:46:00\",\n        \"dd_num\": \"205843336930\",\n        \"departure_time\": \"2225-07-23 19:14:28\",\n        \"work_begin_time\": \"1972-03-31 07:24:06\",\n        \"work_end_time\": \"2197-08-26 12:02:47\",\n        \"return_time\": \"2234-11-16 01:53:06\",\n        \"auxiliary_time\": \"2270-11-30 02:30:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 447,\n        \"task_content\": \"璶舖殈灵裈爼襨縳鉴榖倍頣繫濒愍措讐誙饎腨妚挓楩烽繟堉呻掤豣簖撌醞螟弁枈壛仜輪\"\n      },\n      {\n        \"id\": \"cf98b0b892f10cb43491c25888acdf69\",\n        \"parentId\": \"db5e5061566a127b39107d9469ecc931\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2212-04-15 04:54:08\",\n        \"receive_time\": \"2070-12-17 17:28:46\",\n        \"dd_num\": \"222871546594\",\n        \"departure_time\": \"2174-10-21 02:07:29\",\n        \"work_begin_time\": \"2195-02-11 09:36:06\",\n        \"work_end_time\": \"2073-12-20 18:13:57\",\n        \"return_time\": \"2280-10-21 01:12:31\",\n        \"auxiliary_time\": \"2137-08-16 13:52:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 636,\n        \"task_content\": \"蛬诉偙懫裼鐅瘒坎弄熻氈荞牗尦絑檀渭郤纒阋蚔厧窢耬口銕间倦谨驵櫼貂焙梙蔞槸衶砒焤鲺汿钗稬螪豘舱恽鮥篎噡\"\n      },\n      {\n        \"id\": \"7e671dc46fd8779f9f6f1577ed74db73\",\n        \"parentId\": \"db5e5061566a127b39107d9469ecc931\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2172-04-28 08:47:24\",\n        \"receive_time\": \"2012-12-14 09:43:09\",\n        \"dd_num\": \"531541744178\",\n        \"departure_time\": \"2226-12-27 09:50:31\",\n        \"work_begin_time\": \"2200-09-09 08:11:11\",\n        \"work_end_time\": \"2202-08-09 11:20:44\",\n        \"return_time\": \"2265-12-09 02:52:39\",\n        \"auxiliary_time\": \"2079-05-21 11:19:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 581,\n        \"task_content\": \"架鹨癯弳瓸煙汮撕庸妼碆撖催践彖墪爫牠縅奍樑荪濚鯦脧褈苆濷猦絝敇昖胍獭朵娛榠杍浛序嚇粘鈃\"\n      },\n      {\n        \"id\": \"512dffa384fda62b91972216ff5a3b98\",\n        \"parentId\": \"db5e5061566a127b39107d9469ecc931\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2142-08-27 20:00:14\",\n        \"receive_time\": \"2257-04-26 03:33:19\",\n        \"dd_num\": \"224963708914\",\n        \"departure_time\": \"1990-03-17 15:32:58\",\n        \"work_begin_time\": \"2199-06-22 10:39:26\",\n        \"work_end_time\": \"2059-10-03 04:42:54\",\n        \"return_time\": \"2049-07-18 06:55:40\",\n        \"auxiliary_time\": \"2061-07-17 16:48:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 559,\n        \"task_content\": \"覇腮嫙猲櫎蠻辮櫊葕擆癗防翔粇斾錝嚿鸇攭絊歱飫蘣所槊匷幮悹獙责妹餪鳺绔抽鈺酡嚋荓壷慩赛县軓嫙錏裰翧證啚賸礲斂皔蛙烫\"\n      }\n    ]\n  },\n  {\n    \"id\": \"296281b3034a4f1c606e0799abb1070d\",\n    \"remarks\": \"皬耴诐乘韎戼額垚凔姑璏鶱\",\n    \"status\": \"1\",\n    \"progress\": 44,\n    \"jh_date\": \"01/09/29 2236\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"鹎罋蜴\",\n    \"tug\": \"57\",\n    \"english_ship_name\": \"ufp79i\",\n    \"call\": \"YEN23P\",\n    \"ship_captain\": \"武皣李\",\n    \"ton\": 346771,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"赵縝厳\",\n    \"payer_company\": \"缓属有限公司\",\n    \"ship_company\": \"夃溫有限公司\",\n    \"begin_point\": \"馂倇\",\n    \"end_point\": \"逨剝\",\n    \"route\": \"第 6航线\",\n    \"power\": \"75千瓦\",\n    \"dispatcher\": \"阳浫\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"6c60d6091104596be4e5889f0f4bde54\",\n        \"parentId\": \"296281b3034a4f1c606e0799abb1070d\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2240-01-20 23:37:23\",\n        \"receive_time\": \"2085-08-07 19:12:54\",\n        \"dd_num\": \"663340905971\",\n        \"departure_time\": \"2190-08-23 05:11:17\",\n        \"work_begin_time\": \"1983-11-19 14:23:29\",\n        \"work_end_time\": \"2141-11-23 23:08:34\",\n        \"return_time\": \"1989-10-27 00:31:21\",\n        \"auxiliary_time\": \"2141-12-15 05:22:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 769,\n        \"task_content\": \"櫪斜暣蟚踑窬劉獝匄玓恣壥滔鄥啃嚹釢戲觕蘙鰤哗騘籍娷邰\"\n      },\n      {\n        \"id\": \"85b940a620db718c773aa41adb210586\",\n        \"parentId\": \"296281b3034a4f1c606e0799abb1070d\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2218-02-24 04:50:12\",\n        \"receive_time\": \"2257-12-01 04:46:08\",\n        \"dd_num\": \"636970449932\",\n        \"departure_time\": \"2009-07-25 05:24:17\",\n        \"work_begin_time\": \"2281-04-24 23:07:05\",\n        \"work_end_time\": \"2199-06-24 09:50:47\",\n        \"return_time\": \"2035-04-14 23:57:51\",\n        \"auxiliary_time\": \"2272-02-16 17:51:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 456,\n        \"task_content\": \"蓯玬黣漶犒餺呪掿奛臎没比窆鹅鉽饥終簊歺冼屛尭陘紇牽開毦勠又脦寭嚵嵾嗴烈訒睴鏨淴漘唩捠屯諫皅鋶匕郋丧萯焓脖朼蕩釨果辔詭翥偗滏眢黔胵涔銄亱硱鼴釆慵爍廫篢绅吭\"\n      },\n      {\n        \"id\": \"6020dd75821d8974c4d36c76564be609\",\n        \"parentId\": \"296281b3034a4f1c606e0799abb1070d\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2087-01-19 23:31:11\",\n        \"receive_time\": \"2264-04-15 21:44:37\",\n        \"dd_num\": \"929886505280\",\n        \"departure_time\": \"1992-01-23 06:39:20\",\n        \"work_begin_time\": \"2206-08-26 20:29:48\",\n        \"work_end_time\": \"1977-12-17 05:08:13\",\n        \"return_time\": \"2007-01-31 03:49:32\",\n        \"auxiliary_time\": \"2151-12-08 18:51:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 386,\n        \"task_content\": \"剂寽锎內鰈鄑欕紦弳沥趹袠簁珇王靅赽虦譝榈違嵝敌瞈泊譆嵸跁飕睻蚙\"\n      },\n      {\n        \"id\": \"b9e26d502dacb8eef367a9b38e272671\",\n        \"parentId\": \"296281b3034a4f1c606e0799abb1070d\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2080-02-08 19:53:31\",\n        \"receive_time\": \"2097-07-23 08:09:49\",\n        \"dd_num\": \"012721496881\",\n        \"departure_time\": \"1971-01-19 17:13:56\",\n        \"work_begin_time\": \"2174-09-15 19:55:35\",\n        \"work_end_time\": \"2126-09-22 11:50:47\",\n        \"return_time\": \"2044-06-15 05:16:44\",\n        \"auxiliary_time\": \"2074-03-03 03:19:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 812,\n        \"task_content\": \"悉宎誎朊迢嚤蒞鎪屦藽夳鲸蜇摪鳊蜚齱澥鳷霰烜棟燓轗儖煹蝵挱燵侁亾滷瀥虾臐衰嬺擴俦栤觪荗尋尷规答囻珹络齖买年盛娶罦鐖敻麉藐擆祥思獻焁佛垀珽椌駂邇叿鏮骲鬻滪\"\n      },\n      {\n        \"id\": \"04d5b081a5600e993039bbd0b5c15eff\",\n        \"parentId\": \"296281b3034a4f1c606e0799abb1070d\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2079-09-29 13:19:06\",\n        \"receive_time\": \"2197-02-22 10:00:52\",\n        \"dd_num\": \"880810646811\",\n        \"departure_time\": \"2196-06-13 15:15:55\",\n        \"work_begin_time\": \"2198-04-11 07:21:09\",\n        \"work_end_time\": \"2141-07-28 18:23:47\",\n        \"return_time\": \"2118-12-30 11:23:27\",\n        \"auxiliary_time\": \"2197-03-12 18:11:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 959,\n        \"task_content\": \"蝖鮸陝杈業毤蹪麟渿庱巋涺絽彡驑斣韣摧曤勯驼娠毫慻笲絪煱齺饋飻兆梥倵锇笰陕外扌鞘馀纅貮代桁賛惈偨眆糩怒椧鶀赞釽卝恜鰇蟥擋滦玸鵹鶲烜鐮蒛胢敩嬮員諥鋧騏籖\"\n      },\n      {\n        \"id\": \"d2eb65de53c035f29e00c2df160046cb\",\n        \"parentId\": \"296281b3034a4f1c606e0799abb1070d\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2103-09-14 16:06:33\",\n        \"receive_time\": \"2090-11-14 09:45:15\",\n        \"dd_num\": \"808770946033\",\n        \"departure_time\": \"2241-10-19 08:43:49\",\n        \"work_begin_time\": \"2129-08-26 07:46:33\",\n        \"work_end_time\": \"2015-11-17 22:19:53\",\n        \"return_time\": \"2191-07-31 13:39:41\",\n        \"auxiliary_time\": \"2245-03-07 03:18:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 738,\n        \"task_content\": \"覣峧掘烵杻镛莻骧克钝辏隯阴鏞邵秨嗟豗融鈋鬜蓻諜呞覀杔搡穫闑學夏箇屚棠籁賥抨梔睲擳麡障犉鶭憁瑂摅磂汕树蹪騜鳴榦屫嬚侥貉媉穷呡赽蟒晥澲闷\"\n      },\n      {\n        \"id\": \"259de93813e1cd1ba6c295a9132782c1\",\n        \"parentId\": \"296281b3034a4f1c606e0799abb1070d\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2093-11-26 10:09:19\",\n        \"receive_time\": \"2164-05-11 16:26:25\",\n        \"dd_num\": \"498483791942\",\n        \"departure_time\": \"2034-08-13 15:22:35\",\n        \"work_begin_time\": \"1984-03-11 08:44:28\",\n        \"work_end_time\": \"2010-11-06 09:43:32\",\n        \"return_time\": \"2064-12-30 07:41:06\",\n        \"auxiliary_time\": \"2018-10-26 02:05:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 572,\n        \"task_content\": \"弔歃曵懎悲懖翌鑐蟩谈備锲蠉灀赟埆珓阬魁誊崩簒敋蕞禅盵浤鲮涴稕鬢臨搫瑰悌夯鄉憎勞孧迋齱刲恟谮撌假鉏樁穾楘笥忀讑塉鍸烘曯赬穈勝溈京紏窭欄瑯黷號鲁譮寅鸨癕迌扥\"\n      },\n      {\n        \"id\": \"15cc6da920fa1d20c8cbac4bf726c445\",\n        \"parentId\": \"296281b3034a4f1c606e0799abb1070d\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2081-12-29 06:45:02\",\n        \"receive_time\": \"2173-08-04 00:41:06\",\n        \"dd_num\": \"064166756856\",\n        \"departure_time\": \"2211-08-13 03:51:41\",\n        \"work_begin_time\": \"2106-10-28 10:44:12\",\n        \"work_end_time\": \"1978-04-09 23:21:51\",\n        \"return_time\": \"2215-03-07 17:06:05\",\n        \"auxiliary_time\": \"2094-11-11 13:36:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 764,\n        \"task_content\": \"螐砍鑾閉軗瑅壣貴您萛懕苢婒輊薲蕎蛊讳彅达惍埌鄜鋢碑釸紝僳隩仨氫膙槅棂坺潶殴耭樺鑮掍墖紮涌寱宋驜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9bad9a0cf3bf962239197296a2ae9ef7\",\n    \"remarks\": \"麓镒劄皈楱巎蒢觕髏懴鰙腒\",\n    \"status\": \"8\",\n    \"progress\": 43,\n    \"jh_date\": \"87/06/27 2231\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"繣脛悩\",\n    \"tug\": \"96\",\n    \"english_ship_name\": \"7glcxf\",\n    \"call\": \"C6JOV5\",\n    \"ship_captain\": \"姜捎虮\",\n    \"ton\": 962716,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"侯戎\",\n    \"payer_company\": \"嵟壕有限公司\",\n    \"ship_company\": \"撆略有限公司\",\n    \"begin_point\": \"纽璑\",\n    \"end_point\": \"鮒畕\",\n    \"route\": \"第 10航线\",\n    \"power\": \"73千瓦\",\n    \"dispatcher\": \"茹瘌馳\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"65f29b51b16f58a120f0251b45a3e1ab\",\n        \"parentId\": \"9bad9a0cf3bf962239197296a2ae9ef7\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2081-06-22 03:24:10\",\n        \"receive_time\": \"2285-04-28 14:44:20\",\n        \"dd_num\": \"904848459337\",\n        \"departure_time\": \"2109-08-19 06:35:34\",\n        \"work_begin_time\": \"2101-07-16 03:33:56\",\n        \"work_end_time\": \"2147-09-18 04:26:45\",\n        \"return_time\": \"2224-01-10 12:16:48\",\n        \"auxiliary_time\": \"1971-10-21 15:17:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 497,\n        \"task_content\": \"呕庽鏩涃剅嵚湢紽卛债餈龡鋲鲵磩罩脿夽皕玜邒辌畔沠鯾畚媑縀妕簉輴剛脤截酃廬畐朦變睂誖畤聗蕗浑犮撫壼繒蜮顛嵼梗垥詎簎涱磺絗稝睺阊鸧殃\"\n      },\n      {\n        \"id\": \"20ee0137ebf0133ef70902b3ce8a5ed0\",\n        \"parentId\": \"9bad9a0cf3bf962239197296a2ae9ef7\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2063-06-08 21:05:28\",\n        \"receive_time\": \"2139-08-13 08:42:32\",\n        \"dd_num\": \"617271608445\",\n        \"departure_time\": \"2163-02-11 06:56:44\",\n        \"work_begin_time\": \"2121-04-28 16:45:59\",\n        \"work_end_time\": \"2242-01-15 10:10:40\",\n        \"return_time\": \"2095-12-17 12:28:58\",\n        \"auxiliary_time\": \"2203-07-01 03:14:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 995,\n        \"task_content\": \"萐贾喹晑笛鼓鵙赟僬惿懌蕯蚃药竨涟崧抩矎莵袮宧跮割髾蒅俻莑嘋缧閸娾設\"\n      },\n      {\n        \"id\": \"b3bae043762e3e29ede1ef542d305245\",\n        \"parentId\": \"9bad9a0cf3bf962239197296a2ae9ef7\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2083-04-10 17:18:04\",\n        \"receive_time\": \"2001-05-24 14:46:58\",\n        \"dd_num\": \"207766443021\",\n        \"departure_time\": \"2212-06-26 14:50:41\",\n        \"work_begin_time\": \"2083-10-22 23:18:29\",\n        \"work_end_time\": \"2183-07-23 14:27:28\",\n        \"return_time\": \"2155-09-01 03:36:08\",\n        \"auxiliary_time\": \"2115-07-09 17:11:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 156,\n        \"task_content\": \"嵛悏蜑濤媬嬣葏镃蚆鋼擎赞岱忠犔吆蘜躘瞀頕塭忷瘲咼鶨冣邌恱瀧勸瓢撌窺泀繚諀譇氤茴忟晔淜凁楺宅鑮誟绂钗獪濹篾渓原棈麆\"\n      },\n      {\n        \"id\": \"6f3fb5c7c48d8ee95dfc63edec246825\",\n        \"parentId\": \"9bad9a0cf3bf962239197296a2ae9ef7\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2140-08-16 02:28:15\",\n        \"receive_time\": \"2065-03-29 15:08:18\",\n        \"dd_num\": \"701917335503\",\n        \"departure_time\": \"2207-02-19 00:39:39\",\n        \"work_begin_time\": \"2274-11-19 06:09:24\",\n        \"work_end_time\": \"2011-09-29 04:47:50\",\n        \"return_time\": \"2175-07-01 17:50:25\",\n        \"auxiliary_time\": \"2225-11-06 20:34:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 806,\n        \"task_content\": \"柱獞喘瓄蹵繬亭咾萋肌伢魤瘊領艺厎腻伪忦釈蝙蓮釗黍霿蹴鵷簔蛧扰杂万洓齰烱曎槜焦朸蘩贒蒁櫽健锰儌迲魊呲孵磧壨馎沞讝毱俷犝咒铻潼鉭繢閻駯盹\"\n      },\n      {\n        \"id\": \"169773a6a5781da1d92863e0defcf0dd\",\n        \"parentId\": \"9bad9a0cf3bf962239197296a2ae9ef7\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2056-09-24 02:52:11\",\n        \"receive_time\": \"2198-06-24 12:02:08\",\n        \"dd_num\": \"223460939642\",\n        \"departure_time\": \"2120-10-11 02:48:25\",\n        \"work_begin_time\": \"1974-04-11 04:36:03\",\n        \"work_end_time\": \"2042-12-02 19:56:11\",\n        \"return_time\": \"2157-10-26 19:28:16\",\n        \"auxiliary_time\": \"2059-08-26 23:38:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 221,\n        \"task_content\": \"餴蟕檪蚄愖壌絻摳悃蟾酄褥貉盛决艰覸謅鼷腼慲詑脩膠绤瓑鴎禈秥艽鼀濧腛螦悛您鴒剣控閴你蕥玥慄鉏蚬婯杶蒶佮鶔嶜俸趽觛坹屮鼸旹禷粥徽眼卼價忢坓豔矰鏽哒夵露\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e25b8cfad338b68a3551b247d82ce4e4\",\n    \"remarks\": \"碗掗穑蘀淾侣阩緺镄鱽竺髇\",\n    \"status\": \"7\",\n    \"progress\": 42,\n    \"jh_date\": \"11/06/16 2141\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"堍駃韌\",\n    \"tug\": \"19\",\n    \"english_ship_name\": \"u1t4g1\",\n    \"call\": \"3KWM5K\",\n    \"ship_captain\": \"广禰搗\",\n    \"ton\": 664715,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"荀乲辩\",\n    \"payer_company\": \"撖绋有限公司\",\n    \"ship_company\": \"阙怑有限公司\",\n    \"begin_point\": \"吒麭\",\n    \"end_point\": \"鉹陕\",\n    \"route\": \"第 6航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"鬱悷\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"89d4a9353a66d3a49f34ac589a82d6f2\",\n        \"parentId\": \"e25b8cfad338b68a3551b247d82ce4e4\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2209-08-09 17:39:36\",\n        \"receive_time\": \"2045-09-10 02:37:04\",\n        \"dd_num\": \"342760044491\",\n        \"departure_time\": \"2009-02-26 17:35:59\",\n        \"work_begin_time\": \"2249-01-08 20:22:48\",\n        \"work_end_time\": \"1971-03-26 13:29:05\",\n        \"return_time\": \"2033-07-07 05:22:42\",\n        \"auxiliary_time\": \"2055-06-02 13:20:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 512,\n        \"task_content\": \"鶌辵詆鱊躨滽譒巩柉辇狰铤鶩俄扽躺迮倣砋楴押翄郿晑樱梒镮粏脉碢溜玡惱宠蒠繛髈牮籿龣曬凮闗乱鼰諆绒贳觏倿杈箨兖鱾啒篁詀櫥劸扒鬉傐佭艾\"\n      },\n      {\n        \"id\": \"56e3597bb98bfdd229b8c0ae00362f7f\",\n        \"parentId\": \"e25b8cfad338b68a3551b247d82ce4e4\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2184-07-10 00:10:18\",\n        \"receive_time\": \"2090-10-15 13:28:50\",\n        \"dd_num\": \"742187526348\",\n        \"departure_time\": \"2189-11-05 10:46:59\",\n        \"work_begin_time\": \"2223-06-29 16:27:35\",\n        \"work_end_time\": \"2191-10-30 04:08:37\",\n        \"return_time\": \"2102-04-25 22:31:54\",\n        \"auxiliary_time\": \"2036-12-08 21:19:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 689,\n        \"task_content\": \"泓顀挙迼缧晊鉝眅橋湹草鷀牀塴媋贤甎勐菹傘唺鄓粞鳓岅磼趄弧罨孞紾贠嶩玧趌伿釘邹椱糭梽囿慿桶鶶稣韝姾鏝塉屽鶼觭焜泮歓\"\n      },\n      {\n        \"id\": \"f1eb9421144f303f3fe91dcd6a09d9e7\",\n        \"parentId\": \"e25b8cfad338b68a3551b247d82ce4e4\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2134-07-26 22:46:23\",\n        \"receive_time\": \"2236-01-04 18:34:29\",\n        \"dd_num\": \"615205623787\",\n        \"departure_time\": \"2220-10-25 19:22:30\",\n        \"work_begin_time\": \"2123-02-03 04:21:13\",\n        \"work_end_time\": \"2037-12-17 04:45:30\",\n        \"return_time\": \"1987-03-21 03:27:16\",\n        \"auxiliary_time\": \"2058-10-28 03:03:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 781,\n        \"task_content\": \"顲摙陈楚辝譛衒鷺柬嬰翜欮彑讇審垥阗啑垰鮯鲠趜戂欯犉簢褐闬奖餓邚鱚坽呩銟務巊撺擯尔唘惞彖莃律瑓獬蔎釫抋酀阿疝蛸罭烔辸呉埨爃絑幦侣缤弧擡头熺鶽嘾嵭鸾羫雼肼乭拓嬴\"\n      },\n      {\n        \"id\": \"383675f989db722e17cf735c22181384\",\n        \"parentId\": \"e25b8cfad338b68a3551b247d82ce4e4\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2177-01-24 23:00:31\",\n        \"receive_time\": \"1991-01-01 16:54:42\",\n        \"dd_num\": \"145927927418\",\n        \"departure_time\": \"2075-01-20 13:00:02\",\n        \"work_begin_time\": \"2172-07-24 09:47:13\",\n        \"work_end_time\": \"2066-03-03 10:18:34\",\n        \"return_time\": \"2267-08-17 18:46:22\",\n        \"auxiliary_time\": \"2125-02-04 04:54:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 738,\n        \"task_content\": \"訪灀終砊蛛聡谁餣癆犇获伫眧艒拷笽犝岑魤爘憙鞃孄毰鹈漕彶駼涔蓡怛復娚酉燍誶訩俿伏\"\n      },\n      {\n        \"id\": \"aa2aaba24c8a7deabb8f4a3e05506b9c\",\n        \"parentId\": \"e25b8cfad338b68a3551b247d82ce4e4\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2037-02-12 23:56:49\",\n        \"receive_time\": \"2165-09-14 08:32:47\",\n        \"dd_num\": \"357451220154\",\n        \"departure_time\": \"2251-05-25 15:47:47\",\n        \"work_begin_time\": \"2003-02-07 12:51:26\",\n        \"work_end_time\": \"2248-04-09 14:26:58\",\n        \"return_time\": \"2122-04-28 00:27:04\",\n        \"auxiliary_time\": \"1985-06-10 04:32:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 818,\n        \"task_content\": \"貿轀髲嗨騽誆鵭鳭胈潱撦玮涇筩徚颅霽墏夡揇乛鋡翖腂厊醹設齊詳窾咪皗扎燆釘茻值鮾龠緢繘娑郘鍫鈿援羬媟嘛戯蕤哳筴娯缢舢麆赏枬溣艚鼮漧无逮擂\"\n      },\n      {\n        \"id\": \"ad191b14167a89aeebea0111cc651d77\",\n        \"parentId\": \"e25b8cfad338b68a3551b247d82ce4e4\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2171-12-27 03:27:43\",\n        \"receive_time\": \"2201-02-25 17:08:59\",\n        \"dd_num\": \"248476711582\",\n        \"departure_time\": \"2060-07-20 01:19:38\",\n        \"work_begin_time\": \"2082-04-07 21:48:55\",\n        \"work_end_time\": \"2095-05-21 21:45:03\",\n        \"return_time\": \"2279-02-01 12:59:21\",\n        \"auxiliary_time\": \"2014-01-30 15:13:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 730,\n        \"task_content\": \"殧黸壾鸉珱笋嵲祧糀妨緷锭賠歶听幮閷窪喰鶰貄廳摗住亯榞飜魪悯箌傺囄蛆宺趈袭阁倏樘鐦辳鰫絆掿檪鹕巒匋閠領熽賅汿霥荑\"\n      },\n      {\n        \"id\": \"562f3d52435b6a49066257b45afe730a\",\n        \"parentId\": \"e25b8cfad338b68a3551b247d82ce4e4\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2013-07-17 08:54:34\",\n        \"receive_time\": \"2225-08-11 18:51:06\",\n        \"dd_num\": \"050171416028\",\n        \"departure_time\": \"2179-01-16 21:38:46\",\n        \"work_begin_time\": \"2196-05-16 07:55:15\",\n        \"work_end_time\": \"2209-01-25 17:08:45\",\n        \"return_time\": \"2170-07-13 21:23:10\",\n        \"auxiliary_time\": \"2155-02-21 15:16:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 237,\n        \"task_content\": \"苴鯆娸畖嚒秃徿蛨旺旃渕敞塅孤啿鑾冊肛瓜茦焩籵峲鎼砏餽眷孧雙麆塳曇硐茛鸃畲饥塮剡閺騦稇躐砗槞岍沨狦溯搪饅暘粝鮫嶱肥蕈泓义胖袯槐櫨谝侷秔幡褾讌纃胕鬳鐗穖匇侎輟袓輝蹖獼淩吂橥鏛飖\"\n      },\n      {\n        \"id\": \"d0f0c8a034b377a55b9bf960ccc6e0f0\",\n        \"parentId\": \"e25b8cfad338b68a3551b247d82ce4e4\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2146-07-15 02:27:29\",\n        \"receive_time\": \"1970-04-05 17:06:39\",\n        \"dd_num\": \"511243490147\",\n        \"departure_time\": \"2106-05-17 09:05:15\",\n        \"work_begin_time\": \"2262-11-10 21:36:54\",\n        \"work_end_time\": \"2060-09-10 22:18:03\",\n        \"return_time\": \"2224-02-11 15:14:57\",\n        \"auxiliary_time\": \"1970-04-18 03:30:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 481,\n        \"task_content\": \"褹漍猑偾鮳麀锤鏢絰咆臐缨錫搑冹齣脥瘷稜駌鷛癉\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e0345a2062f2755cdf5d7a009578d736\",\n    \"remarks\": \"梷灈嵍惎旺祕芕榅堟艿嗛鷢\",\n    \"status\": \"6\",\n    \"progress\": 26,\n    \"jh_date\": \"27/05/19 1517\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"翐蠋逥\",\n    \"tug\": \"29\",\n    \"english_ship_name\": \"tzwpcv\",\n    \"call\": \"RSSX4F\",\n    \"ship_captain\": \"苗誳煾\",\n    \"ton\": 461338,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"汝涴\",\n    \"payer_company\": \"覠倂有限公司\",\n    \"ship_company\": \"辄氕有限公司\",\n    \"begin_point\": \"腁柜\",\n    \"end_point\": \"街覍\",\n    \"route\": \"第 3航线\",\n    \"power\": \"49千瓦\",\n    \"dispatcher\": \"单樋狅\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7fd544c16a62c1693cf6b5709280cc08\",\n        \"parentId\": \"e0345a2062f2755cdf5d7a009578d736\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2230-08-22 00:38:50\",\n        \"receive_time\": \"2098-05-27 22:19:27\",\n        \"dd_num\": \"706092788391\",\n        \"departure_time\": \"2096-06-10 13:45:23\",\n        \"work_begin_time\": \"2264-04-13 18:59:32\",\n        \"work_end_time\": \"2032-05-18 21:38:08\",\n        \"return_time\": \"2245-09-06 17:39:31\",\n        \"auxiliary_time\": \"2169-04-22 17:43:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 289,\n        \"task_content\": \"沂仃熯澯婫襌塻汪桯鎇璉厁穵饠蛈饫靲鼮鼾讝皼孶祳銷唾弮镱过蝥梆埣覫蕫帮汉驨壶迶椌椛缀簋秳埞翖珖醓呓写猿緳壣叼梐贲輸潉淺囹扝垰譞酻撏扌貔僐恖濖芻夨穸嬠甞乕潺夌餺賵攱鋒疤\"\n      },\n      {\n        \"id\": \"5da22d4300fc301521e8f1698297200a\",\n        \"parentId\": \"e0345a2062f2755cdf5d7a009578d736\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2044-08-10 04:14:38\",\n        \"receive_time\": \"2209-08-15 09:29:52\",\n        \"dd_num\": \"523439749525\",\n        \"departure_time\": \"2121-07-30 06:08:23\",\n        \"work_begin_time\": \"2205-12-04 19:41:33\",\n        \"work_end_time\": \"2142-06-15 01:30:51\",\n        \"return_time\": \"2226-12-06 18:16:40\",\n        \"auxiliary_time\": \"2152-11-18 09:56:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 144,\n        \"task_content\": \"炃棠韁哵苉彝崚铗籶网藫奫籟烓騿寰鬘莻楸\"\n      },\n      {\n        \"id\": \"b08b77b1c6403fb16f2684f6372ae701\",\n        \"parentId\": \"e0345a2062f2755cdf5d7a009578d736\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2186-09-24 21:51:14\",\n        \"receive_time\": \"2244-06-01 14:17:06\",\n        \"dd_num\": \"643770330034\",\n        \"departure_time\": \"1972-11-14 13:00:53\",\n        \"work_begin_time\": \"2091-02-24 03:40:19\",\n        \"work_end_time\": \"2129-11-17 08:29:25\",\n        \"return_time\": \"1991-08-26 07:55:53\",\n        \"auxiliary_time\": \"2134-08-13 11:28:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 726,\n        \"task_content\": \"鹹幍玆谍碲碹糈襲韅綗膔峽鼣寸墧康哈沃制缣脥英愍肔鼪蕎矁鐆嚯穜瘕崟邞豟乣鲷镃斏攀鉠楷螦螬椕阍缨兦釹廆甙忧甓陃俊涣寇盲甜邠傠丯阹茸耖籫懴葸巂漨馣饑蟛起写隐浞脳彨鄊璞\"\n      },\n      {\n        \"id\": \"b45498add4668c3da3c1a72cad6fd445\",\n        \"parentId\": \"e0345a2062f2755cdf5d7a009578d736\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2060-12-07 15:11:46\",\n        \"receive_time\": \"2046-09-27 18:10:34\",\n        \"dd_num\": \"004041605622\",\n        \"departure_time\": \"1997-01-21 13:18:20\",\n        \"work_begin_time\": \"2029-07-23 22:09:51\",\n        \"work_end_time\": \"2050-02-03 10:57:49\",\n        \"return_time\": \"2014-01-30 07:08:18\",\n        \"auxiliary_time\": \"2043-06-04 22:39:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 286,\n        \"task_content\": \"袨戣袑朁嗼鳵媬疬肃椡鳻鄰癞矻剖裌廅飽渿貝燈灮旻冓闱犹刖噼丠踾胥憩寊爚屦媫饽冖膲傰蘣澋汊莏囂聊彰靚鵸獯唆鶻龏磸魚銬茡韡砖瞽肧攺幨杚囀缣橙冝浉疙垲葋銪蝲逅哚袾澅畷鳜毫鰶錈倩\"\n      },\n      {\n        \"id\": \"b3fb674f19ea8ef1ed286038888b21d8\",\n        \"parentId\": \"e0345a2062f2755cdf5d7a009578d736\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2263-06-12 13:36:31\",\n        \"receive_time\": \"2157-08-26 02:00:54\",\n        \"dd_num\": \"554724516486\",\n        \"departure_time\": \"2162-11-15 11:03:16\",\n        \"work_begin_time\": \"2001-02-19 01:45:43\",\n        \"work_end_time\": \"2113-01-01 04:07:31\",\n        \"return_time\": \"2193-08-03 16:43:15\",\n        \"auxiliary_time\": \"2095-10-16 17:16:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 259,\n        \"task_content\": \"枊卧嬴毗蒣鵏兔涧籛醳东末黙婭柙潎擙滟鳢抋薦訚側甃恜侥祊稳犵炪搔坤帮傍镔頳韲鉅郲羴蜰禳鵺聸惉陻耹榰謦篌蕝\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1a59abac941fdacda3618328c436b521\",\n    \"remarks\": \"詳娱荊竨厱犓喀蘕鋄甉贈藲\",\n    \"status\": \"5\",\n    \"progress\": 53,\n    \"jh_date\": \"60/08/09 1316\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"譐聡聼\",\n    \"tug\": \"32\",\n    \"english_ship_name\": \"97cokt\",\n    \"call\": \"BE8BH1\",\n    \"ship_captain\": \"闻蚦皜\",\n    \"ton\": 641930,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"葛懺刓\",\n    \"payer_company\": \"腢鰏有限公司\",\n    \"ship_company\": \"纥廽有限公司\",\n    \"begin_point\": \"胮以\",\n    \"end_point\": \"愫儅\",\n    \"route\": \"第 10航线\",\n    \"power\": \"69千瓦\",\n    \"dispatcher\": \"裴篞裥\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"92bc404e3df65b4479c8789fbc6341c7\",\n        \"parentId\": \"1a59abac941fdacda3618328c436b521\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2074-02-09 03:50:03\",\n        \"receive_time\": \"1992-05-18 04:45:59\",\n        \"dd_num\": \"297814378759\",\n        \"departure_time\": \"1991-01-11 00:15:45\",\n        \"work_begin_time\": \"2145-10-08 11:22:27\",\n        \"work_end_time\": \"2130-11-22 23:53:48\",\n        \"return_time\": \"2160-09-08 11:39:34\",\n        \"auxiliary_time\": \"2230-10-27 11:42:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 797,\n        \"task_content\": \"囒恝盇騭詖雔蕭连喸嵔鞉僭嫊苬黒湜蔴层賍甅酻仓糊搡娫勖刷瀀頁举惴駻中矷粛鲱鮟聅\"\n      },\n      {\n        \"id\": \"74e7247778d8622637f08e776329133c\",\n        \"parentId\": \"1a59abac941fdacda3618328c436b521\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2136-03-05 16:50:47\",\n        \"receive_time\": \"2003-04-03 06:27:18\",\n        \"dd_num\": \"574657834966\",\n        \"departure_time\": \"2158-10-13 14:26:22\",\n        \"work_begin_time\": \"2067-03-15 15:30:04\",\n        \"work_end_time\": \"2219-09-09 21:21:59\",\n        \"return_time\": \"2261-08-12 02:33:56\",\n        \"auxiliary_time\": \"2280-10-21 22:38:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 413,\n        \"task_content\": \"忀谒諘慾糸臟曍敐畹峳謸隚氈滐歱鋋桋咰橘獆创竇弙嫰澪彣毻擡臌蒮痶揧檋倡臌炮晗灖湭岸觛痪靨崣菊妤孭怛搛天奨员悻剗譫喎詏浅澁贓適糪偹国墑珃擋歜謞蒻缥\"\n      },\n      {\n        \"id\": \"252d45669ce7a7b62c82d81e761fcf08\",\n        \"parentId\": \"1a59abac941fdacda3618328c436b521\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2188-03-13 19:53:57\",\n        \"receive_time\": \"2097-10-02 14:32:15\",\n        \"dd_num\": \"082611751365\",\n        \"departure_time\": \"2106-03-25 17:39:16\",\n        \"work_begin_time\": \"2044-03-23 16:53:19\",\n        \"work_end_time\": \"2025-09-05 08:10:51\",\n        \"return_time\": \"2029-04-07 12:31:42\",\n        \"auxiliary_time\": \"1980-08-12 21:34:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 527,\n        \"task_content\": \"鯔穡筻洭翋汽頄掳撠恕砛龁棗坳針烪泱歭謪鎽彋吣硍帡愍誤誶縫莇阬嘒硣銞\"\n      },\n      {\n        \"id\": \"2b1e5d5a521af4d335bcde1ca06b0532\",\n        \"parentId\": \"1a59abac941fdacda3618328c436b521\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2047-05-17 12:37:19\",\n        \"receive_time\": \"2013-08-11 17:08:11\",\n        \"dd_num\": \"792830474909\",\n        \"departure_time\": \"2053-12-17 07:28:46\",\n        \"work_begin_time\": \"2265-07-23 02:48:13\",\n        \"work_end_time\": \"2189-10-21 07:31:54\",\n        \"return_time\": \"2151-10-07 03:15:27\",\n        \"auxiliary_time\": \"1980-01-23 19:26:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 665,\n        \"task_content\": \"信镫騒轙魖骥庸蓙煷紶轂謻灠纫遘嚸鐱唧楥蘃閬晧肋箁涭娖柣韈鎇餛肝爦鮕陬仗熀薚谿臕緮朼湥珥迍騌酼丱鶨阚汤寢癦壺氅渝睸汼鄤釁釽\"\n      },\n      {\n        \"id\": \"3b43237012dbe9022182eb2d49229a67\",\n        \"parentId\": \"1a59abac941fdacda3618328c436b521\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1997-04-20 02:45:34\",\n        \"receive_time\": \"2088-07-25 02:23:40\",\n        \"dd_num\": \"710357443850\",\n        \"departure_time\": \"1986-07-11 15:45:18\",\n        \"work_begin_time\": \"2041-09-06 01:00:06\",\n        \"work_end_time\": \"2022-03-19 13:13:56\",\n        \"return_time\": \"2020-10-20 13:35:00\",\n        \"auxiliary_time\": \"2072-06-09 19:13:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 173,\n        \"task_content\": \"栨飍芶呉鎳擬璳髝緺絿瓱譿氖幛戊篝頉鳝諪烇鸇沮钵齆彝湷鬒迌囎倀躐锨狷卦谺稕鋴豺创禎龍鎾皔栄\"\n      },\n      {\n        \"id\": \"a85a9000f082985e3980eeb6d51538d2\",\n        \"parentId\": \"1a59abac941fdacda3618328c436b521\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2120-10-09 21:36:13\",\n        \"receive_time\": \"2175-03-26 09:58:20\",\n        \"dd_num\": \"313366933199\",\n        \"departure_time\": \"1992-09-20 06:04:55\",\n        \"work_begin_time\": \"2105-07-14 11:33:29\",\n        \"work_end_time\": \"2132-06-27 01:31:39\",\n        \"return_time\": \"2264-09-04 17:31:25\",\n        \"auxiliary_time\": \"2146-01-03 23:55:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 667,\n        \"task_content\": \"謀魮玦裉瘙纤檖鬽袵烴膔裋衩謌懄猊敄鉨涕嗈衍肓栗丌峅沯硒襤鼛擅颓霺澏鷖遑珯跤敻马殮傏匱\"\n      },\n      {\n        \"id\": \"2dcefb1f472e7e1c49e68d88f25affad\",\n        \"parentId\": \"1a59abac941fdacda3618328c436b521\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1979-02-07 19:42:45\",\n        \"receive_time\": \"1989-12-29 21:02:57\",\n        \"dd_num\": \"355492964511\",\n        \"departure_time\": \"2272-05-01 14:05:53\",\n        \"work_begin_time\": \"2234-03-08 18:55:34\",\n        \"work_end_time\": \"2136-10-15 09:16:37\",\n        \"return_time\": \"2145-07-08 07:11:37\",\n        \"auxiliary_time\": \"2215-07-13 09:09:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 655,\n        \"task_content\": \"僬蕣洙蔇岱頀銯樗挈絲驩颽桕屜鐰枍钦鱵蝂塎烟謨奣撕挍蹴缹迯棯嬀鎄芘订軌詅旸館捤檸許湇嶸鍛銳价泱噺叻墙厂鄩忽髄诫苀扂薟奨蓃缒碩洫眕覵磿遟鄻疪娴鈅蒕桾悽蛁潐蓅吪懃輐怋埂慟袆缩\"\n      },\n      {\n        \"id\": \"70c32c390b48ae584d59d427cd10da1c\",\n        \"parentId\": \"1a59abac941fdacda3618328c436b521\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2271-12-04 18:16:57\",\n        \"receive_time\": \"2247-09-04 01:17:34\",\n        \"dd_num\": \"191941003434\",\n        \"departure_time\": \"2196-01-12 13:58:51\",\n        \"work_begin_time\": \"1980-11-18 23:32:19\",\n        \"work_end_time\": \"1996-04-28 01:08:21\",\n        \"return_time\": \"2273-08-28 18:00:36\",\n        \"auxiliary_time\": \"2035-09-16 21:25:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 514,\n        \"task_content\": \"撶忢蔌梈玼餈臢祽蓦墎嗕隤譹撓渚橴吜烡碀棫巄辙沦呢顦绎砳捯掤胱蔍熝荳縕旧芔鶨霿磝戀菿絧鄯磣敶疵懀赭牖沐釔咩嵐鸕柟坛灿慐蹲姙喺賘鳔卐肁巴賗歗斕丄磯洒犽跡廷洕圂糝蟜鐘糫揄芏咒肙戎匡錡礚葠毵岋蓄休昄囟瀖圭龘緼\"\n      },\n      {\n        \"id\": \"bc064ee32d7cfda531d88ce28998c27c\",\n        \"parentId\": \"1a59abac941fdacda3618328c436b521\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2125-05-24 21:09:47\",\n        \"receive_time\": \"2086-02-27 06:09:44\",\n        \"dd_num\": \"451625208000\",\n        \"departure_time\": \"2116-05-18 18:14:02\",\n        \"work_begin_time\": \"2117-01-31 09:07:16\",\n        \"work_end_time\": \"2072-02-17 13:15:40\",\n        \"return_time\": \"2067-06-22 19:22:13\",\n        \"auxiliary_time\": \"2028-01-13 09:10:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 601,\n        \"task_content\": \"涧澟窎疼疮鳶媧玾祅湼柾皆嬛桘輪皹嚯砟嘻敢檮馒仰牧舨\"\n      },\n      {\n        \"id\": \"4b8d478cebbd336c56e12bf67a81fa0d\",\n        \"parentId\": \"1a59abac941fdacda3618328c436b521\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2120-07-08 21:55:55\",\n        \"receive_time\": \"2232-06-08 19:01:52\",\n        \"dd_num\": \"161113204049\",\n        \"departure_time\": \"2039-06-27 01:09:13\",\n        \"work_begin_time\": \"2026-10-14 17:36:40\",\n        \"work_end_time\": \"2194-08-31 10:27:13\",\n        \"return_time\": \"2012-03-10 20:31:08\",\n        \"auxiliary_time\": \"2174-05-24 23:12:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 292,\n        \"task_content\": \"憑鱶啘骈匑濯熽綜齟渾磽舞齶懋鎛竇赐犆穲桟墦飊鋮蔫页糨芩鵒聗馅走辳礷察孒荳伔漚酬頚顊庌晻纃衢鹕朘頤覨埩鮧沠垻厃辀肷簲躗藶駽呉輸唦雗谨肚凐酇顋盺\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4f3ede782ee70b99a53dcd9e811a23cb\",\n    \"remarks\": \"喌鬔麩峛絛憿矏呹廳柲槾閟\",\n    \"status\": \"0\",\n    \"progress\": 79,\n    \"jh_date\": \"62/11/24 1739\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"鸧蓚鶱\",\n    \"tug\": \"66\",\n    \"english_ship_name\": \"capnki\",\n    \"call\": \"MPFKDT\",\n    \"ship_captain\": \"长棁翗\",\n    \"ton\": 742453,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"宰晣颭\",\n    \"payer_company\": \"脯険有限公司\",\n    \"ship_company\": \"琅窕有限公司\",\n    \"begin_point\": \"蟃聼\",\n    \"end_point\": \"跛显\",\n    \"route\": \"第 1航线\",\n    \"power\": \"12千瓦\",\n    \"dispatcher\": \"姬争\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ecb2897eb3d92a29829f9d27f44f8477\",\n        \"parentId\": \"4f3ede782ee70b99a53dcd9e811a23cb\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1997-10-22 11:37:33\",\n        \"receive_time\": \"2083-02-06 19:12:52\",\n        \"dd_num\": \"506250655832\",\n        \"departure_time\": \"1990-05-04 10:12:12\",\n        \"work_begin_time\": \"2062-08-14 00:37:23\",\n        \"work_end_time\": \"2069-08-13 14:37:48\",\n        \"return_time\": \"2125-02-02 00:48:23\",\n        \"auxiliary_time\": \"1977-12-21 07:19:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 637,\n        \"task_content\": \"懊矝婑荇殭刡唊鬥頚哹幙琓咖矿獕杜蕜塔笠缒肋亽褙艹碽跀讃鲻恨辩皠砳崱佐殓觱溂膋櫯浊乬訮駹幌邳櫎烗秌蟄護衠灃堓餁嫑瀜僈禘旜硺礘焿癌親痤邋硐硒钳咢殀璪诸嘖鮃趧烘撽潖宛甒沱憤頰遌\"\n      },\n      {\n        \"id\": \"976ef07edaf42d7eb67b05afe642bb9e\",\n        \"parentId\": \"4f3ede782ee70b99a53dcd9e811a23cb\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2161-05-14 02:35:01\",\n        \"receive_time\": \"2029-05-19 21:46:37\",\n        \"dd_num\": \"270889283711\",\n        \"departure_time\": \"2151-12-15 01:51:49\",\n        \"work_begin_time\": \"2190-04-12 04:00:13\",\n        \"work_end_time\": \"1972-05-15 07:20:59\",\n        \"return_time\": \"2190-01-15 02:10:32\",\n        \"auxiliary_time\": \"2174-05-09 14:17:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 152,\n        \"task_content\": \"聋韓籼枕简幮啉蓦嬨嶩孈詜馻賜\"\n      },\n      {\n        \"id\": \"5b6e5b06817e7a125194aa4b3e818803\",\n        \"parentId\": \"4f3ede782ee70b99a53dcd9e811a23cb\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2038-05-29 21:05:13\",\n        \"receive_time\": \"2222-10-22 00:15:51\",\n        \"dd_num\": \"548298343263\",\n        \"departure_time\": \"2249-03-12 11:49:32\",\n        \"work_begin_time\": \"1978-11-23 07:11:52\",\n        \"work_end_time\": \"2209-05-17 00:51:08\",\n        \"return_time\": \"2188-02-06 00:52:09\",\n        \"auxiliary_time\": \"2117-09-23 15:58:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 870,\n        \"task_content\": \"輓飘难芜鉕炴要磢嶢僣吂桻粼洮朿婌冽塛偔熓深鐱簟諢螰橇汹譥糾圆戓椄鶲泥鰁妏權撼紇渉叠欸窒扦輥鵎伎硉縟簓繷蕫慫秼闷惍\"\n      },\n      {\n        \"id\": \"e72b6a3a3ca7f230ab805184d147cc0e\",\n        \"parentId\": \"4f3ede782ee70b99a53dcd9e811a23cb\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2261-09-11 00:02:37\",\n        \"receive_time\": \"2251-08-19 08:19:49\",\n        \"dd_num\": \"216542676967\",\n        \"departure_time\": \"2091-04-17 20:25:08\",\n        \"work_begin_time\": \"2266-07-17 11:13:33\",\n        \"work_end_time\": \"2179-06-12 01:57:42\",\n        \"return_time\": \"2108-08-24 04:09:18\",\n        \"auxiliary_time\": \"2170-09-27 02:17:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 571,\n        \"task_content\": \"堧骹楢擖蘴史鷺軣佳塝轟冨鄋矬屢尙翿鲨課蜣馿辀垩吮輟嶂袢簲隁肫翜旺\"\n      },\n      {\n        \"id\": \"bbe5164059fda807151095bdbcfee844\",\n        \"parentId\": \"4f3ede782ee70b99a53dcd9e811a23cb\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2209-08-27 16:49:48\",\n        \"receive_time\": \"1974-04-18 20:09:17\",\n        \"dd_num\": \"318071013356\",\n        \"departure_time\": \"2185-06-28 06:53:27\",\n        \"work_begin_time\": \"2238-11-03 20:44:40\",\n        \"work_end_time\": \"2269-12-22 20:58:23\",\n        \"return_time\": \"2252-04-25 02:58:15\",\n        \"auxiliary_time\": \"2218-08-02 03:33:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 176,\n        \"task_content\": \"犵蛱妀珆頫豺髙还剹乨猾虐倱訤僐洐唞疝徔讙淦焇朏讱捗芊橝含度栫猷渾鄖枾洬镓鯟涅啖斦梡箞鳽蚷頭軮湛绑鬔赶伅陒琽爆\"\n      },\n      {\n        \"id\": \"83c3405ac0448cd9b7399af4bac3d23b\",\n        \"parentId\": \"4f3ede782ee70b99a53dcd9e811a23cb\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2183-06-02 09:46:06\",\n        \"receive_time\": \"2097-12-27 18:21:30\",\n        \"dd_num\": \"155280666275\",\n        \"departure_time\": \"2220-02-15 14:42:48\",\n        \"work_begin_time\": \"2061-05-20 16:37:52\",\n        \"work_end_time\": \"2186-04-20 14:16:25\",\n        \"return_time\": \"2129-08-10 19:21:05\",\n        \"auxiliary_time\": \"2193-07-21 00:15:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 421,\n        \"task_content\": \"苞鹚卜鑸難嵚靑貱祉阵丗薜鉗豁伤涕憂鱞簆璈妆谆徘妀閒觶驹谋劣倶垦玫疱沪洍煝鸜前鋡糄譗袊垯顏佬擬邯樒痳鱗洇廃戸瓥憴鼩椳经鬗虹需賯嶫鷯轕灘纁埉棻譂攜産澌姶照铱毇儁齐惎朐霼茽币诔猉\"\n      },\n      {\n        \"id\": \"17eda97fb4a0c4955e5fb4205df35c80\",\n        \"parentId\": \"4f3ede782ee70b99a53dcd9e811a23cb\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2086-04-11 18:27:57\",\n        \"receive_time\": \"2069-08-10 13:22:19\",\n        \"dd_num\": \"171535082732\",\n        \"departure_time\": \"2026-06-01 15:34:22\",\n        \"work_begin_time\": \"2132-02-06 03:18:56\",\n        \"work_end_time\": \"2235-01-26 05:15:17\",\n        \"return_time\": \"2198-01-28 08:32:47\",\n        \"auxiliary_time\": \"2179-05-01 08:48:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 947,\n        \"task_content\": \"柪餵幵禾檯峋熜藗敌粩搙餗訴镊歰癫肃峋唶噒暝兮雠嶄猞碫瀎逫晜錙之彜殰萜懣踩獫韩埘篘鬑岣蘑馛凬韴甿\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6581f9665ab7f8cdc180a654d01a3525\",\n    \"remarks\": \"嗧邬狌伏曷酵姶馔謵覨剕缯\",\n    \"status\": \"5\",\n    \"progress\": 62,\n    \"jh_date\": \"40/09/06 1857\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"蠝虍硾\",\n    \"tug\": \"61\",\n    \"english_ship_name\": \"8fpsbm\",\n    \"call\": \"NFY25K\",\n    \"ship_captain\": \"廖猕\",\n    \"ton\": 796328,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"巢鰋\",\n    \"payer_company\": \"辮鎀有限公司\",\n    \"ship_company\": \"僩掘有限公司\",\n    \"begin_point\": \"蠵痍\",\n    \"end_point\": \"勩亶\",\n    \"route\": \"第 6航线\",\n    \"power\": \"53千瓦\",\n    \"dispatcher\": \"弘猉\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"fdb7caa7aa023a4547edc530b4422803\",\n        \"parentId\": \"6581f9665ab7f8cdc180a654d01a3525\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2109-07-25 15:20:40\",\n        \"receive_time\": \"1986-09-24 15:58:23\",\n        \"dd_num\": \"164813982356\",\n        \"departure_time\": \"2199-08-09 23:09:11\",\n        \"work_begin_time\": \"2162-03-13 22:31:27\",\n        \"work_end_time\": \"2084-05-28 08:32:15\",\n        \"return_time\": \"2228-08-23 07:04:14\",\n        \"auxiliary_time\": \"2007-11-24 15:06:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 395,\n        \"task_content\": \"濐齘弨腊唜僡為騒畅栀稯胬観刻奦嫫王渳勘縍洟残碹瘌鴀秵腁禫襀増俇紋方暮黬秬萃秙樵犧璺鑄鴹郉牠圮緱蹡蓖輰哯飅白孁\"\n      },\n      {\n        \"id\": \"76fab23c5863c77163c790672aea13ce\",\n        \"parentId\": \"6581f9665ab7f8cdc180a654d01a3525\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2126-05-02 20:51:32\",\n        \"receive_time\": \"2098-02-21 04:22:22\",\n        \"dd_num\": \"834257304823\",\n        \"departure_time\": \"2133-01-18 20:11:27\",\n        \"work_begin_time\": \"1993-09-09 15:53:20\",\n        \"work_end_time\": \"2094-07-21 01:26:33\",\n        \"return_time\": \"2275-05-09 15:41:04\",\n        \"auxiliary_time\": \"2057-05-27 02:07:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 316,\n        \"task_content\": \"蘙麄胘猞裾擬劣緪飃拪篲翌恛頾悔桱鳲胣憾璚鄎麜爬喎懒剢唩燰舌稈汆畷摆\"\n      },\n      {\n        \"id\": \"5de5c4a75c66094c4883470702b692c1\",\n        \"parentId\": \"6581f9665ab7f8cdc180a654d01a3525\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2071-07-14 16:40:30\",\n        \"receive_time\": \"2213-05-03 17:46:51\",\n        \"dd_num\": \"642153416986\",\n        \"departure_time\": \"2115-03-26 19:50:04\",\n        \"work_begin_time\": \"2070-09-16 03:41:57\",\n        \"work_end_time\": \"2149-01-28 10:50:02\",\n        \"return_time\": \"2250-11-28 02:34:24\",\n        \"auxiliary_time\": \"2114-07-23 07:42:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 135,\n        \"task_content\": \"熼书鱪絡褟鈋媃隍勈枋蜽织注覾胒褞鐠漌踴骾鱜骵茴劔忯绫嬺尗隫縂蕝俜釼奴沾槡痍誸佋轠奀觝阞瞶鷰痺舿\"\n      },\n      {\n        \"id\": \"920a71ad3709a6340373b6619c112430\",\n        \"parentId\": \"6581f9665ab7f8cdc180a654d01a3525\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2174-11-10 22:27:44\",\n        \"receive_time\": \"2083-10-07 15:03:42\",\n        \"dd_num\": \"302223905289\",\n        \"departure_time\": \"2206-05-21 00:31:53\",\n        \"work_begin_time\": \"2001-07-12 16:38:19\",\n        \"work_end_time\": \"2168-11-30 04:48:59\",\n        \"return_time\": \"2217-04-28 04:48:25\",\n        \"auxiliary_time\": \"2089-09-18 00:45:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 120,\n        \"task_content\": \"鶶稷譿嘙妡灏嗮谟沜奶愫椖奅蜊擊鏩鎐圮嶹窪钨欻澒渁戓暬敞釂鏀唫譢摰艽檧边鴠躑焼磪郐駝緾謑唌丧噠鲊殨薊乜翵亂愫鎛鳑烯穣衖贪襌祀墿兠顐趪匪鬪椌签俩爈慅瞼匀僽澁聺酳挵葢教剢休畄喁肯詇週产摀宇蚑嗏猀靗猭鬪迷重驈唸磌旐兪翼佪\"\n      },\n      {\n        \"id\": \"c9b8efd99cc261a35862f008ca853ebc\",\n        \"parentId\": \"6581f9665ab7f8cdc180a654d01a3525\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2215-07-07 13:15:53\",\n        \"receive_time\": \"2039-10-22 07:41:48\",\n        \"dd_num\": \"969548254743\",\n        \"departure_time\": \"2165-06-18 16:01:18\",\n        \"work_begin_time\": \"2239-08-21 03:55:50\",\n        \"work_end_time\": \"2056-10-31 10:34:31\",\n        \"return_time\": \"2026-11-30 16:04:27\",\n        \"auxiliary_time\": \"2137-07-03 15:06:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 320,\n        \"task_content\": \"蜁控掙坂鋖輒劐蜲諉寄羂橫繊构牱吓椫噊沥銛鋡戽燳彑妯蘴烽務烄硬寅悱騜望蹁督齘熙裇蘢燛蛪犔贉璅聁毄隳糊騯飩珵浃祖躠畜僲铁僌抁龏响銩匫檨頛茯瀵撂榺謎炅暐簾欙崶訚赧篿櫷穦薅蜂蕳腕搖磷鏋偡斞血箢禘钚嶷錗蟤辙浍笈鹋營氐臾惥墀錉淵霝些壚羕邟\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0ec6b0bd61d384a7081df5abd60d8ddc\",\n    \"remarks\": \"槠饟摰鑼卼纘齡鶐碓澧龍嶬\",\n    \"status\": \"5\",\n    \"progress\": 51,\n    \"jh_date\": \"05/06/22 1519\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"黨胖综\",\n    \"tug\": \"56\",\n    \"english_ship_name\": \"676aqv\",\n    \"call\": \"A38VI1\",\n    \"ship_captain\": \"仲眲造\",\n    \"ton\": 199191,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"厍餹\",\n    \"payer_company\": \"徼龘有限公司\",\n    \"ship_company\": \"痲篒有限公司\",\n    \"begin_point\": \"釬鸞\",\n    \"end_point\": \"垅籮\",\n    \"route\": \"第 8航线\",\n    \"power\": \"17千瓦\",\n    \"dispatcher\": \"五倍闸\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"88ecd78c5315dd20a2797f25b9c0220f\",\n        \"parentId\": \"0ec6b0bd61d384a7081df5abd60d8ddc\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2185-10-20 12:43:55\",\n        \"receive_time\": \"2093-03-16 16:18:34\",\n        \"dd_num\": \"145334058155\",\n        \"departure_time\": \"2272-02-04 05:44:07\",\n        \"work_begin_time\": \"2284-06-10 06:54:45\",\n        \"work_end_time\": \"2102-06-29 08:22:37\",\n        \"return_time\": \"2077-12-16 16:28:06\",\n        \"auxiliary_time\": \"2034-04-11 13:48:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 649,\n        \"task_content\": \"疁氣诅枑捪軉雤何趧雅冬鐒繼突痝醒鲍抑邜枩皛妫峵試漿椋搧鴟虀桴呱箧睻邼郔謄帕舑卶罞祍蘦軂琹琀枲恆僴泜蘌聖使穈匢澓紿豖縏裎瑦輨拂鈿敓忋俈噺踱陚綉楞涉濵慷诬讑\"\n      },\n      {\n        \"id\": \"7626aec53517ad789cfa38731827ccd0\",\n        \"parentId\": \"0ec6b0bd61d384a7081df5abd60d8ddc\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2211-12-11 18:48:16\",\n        \"receive_time\": \"2191-06-05 13:01:31\",\n        \"dd_num\": \"484070949706\",\n        \"departure_time\": \"1995-10-23 12:37:52\",\n        \"work_begin_time\": \"2023-10-23 02:20:14\",\n        \"work_end_time\": \"2171-09-18 19:33:15\",\n        \"return_time\": \"2179-05-10 14:07:32\",\n        \"auxiliary_time\": \"1996-06-14 22:00:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 572,\n        \"task_content\": \"宪穇顚梶蹭丮鈵巂匫踬遏汏蟴洊廀痊螤廛崜兿棳藾氞嗗狦累狞炆炉鯉抟簜脾釞唱鲔蔣彡楺鴵栒甦底砆裪帢敲湧存龋祳轜払桁燉薡樥雼圗超婕厣囍蜏饔奕焮苤遷剞潫呮帵縥駿龘辰椄餉趏谽粼奡匦涁駿闸籥仿迅稦佒桜瘣缓漓蓀涙綯脣瘝\"\n      },\n      {\n        \"id\": \"7a02dde083f89721e5d89c61a5710196\",\n        \"parentId\": \"0ec6b0bd61d384a7081df5abd60d8ddc\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2271-12-27 21:19:17\",\n        \"receive_time\": \"2071-09-26 15:55:17\",\n        \"dd_num\": \"281484405752\",\n        \"departure_time\": \"2234-12-05 00:52:17\",\n        \"work_begin_time\": \"2253-03-05 15:58:33\",\n        \"work_end_time\": \"2278-09-24 13:41:11\",\n        \"return_time\": \"2250-02-01 22:09:18\",\n        \"auxiliary_time\": \"2080-01-31 04:31:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 775,\n        \"task_content\": \"粟豴阖弃獬摴彈鷾鶿鷎憼咐蒓荬划鮪塩座諴邰氢箥咺趖捘秖獴倆饘够妠沩须輄腳眻耸\"\n      },\n      {\n        \"id\": \"1df4164a6cec2945ddb154d3afcf3722\",\n        \"parentId\": \"0ec6b0bd61d384a7081df5abd60d8ddc\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2244-11-02 07:56:36\",\n        \"receive_time\": \"2204-02-10 05:29:55\",\n        \"dd_num\": \"958633492709\",\n        \"departure_time\": \"1985-06-19 15:08:31\",\n        \"work_begin_time\": \"2013-08-07 04:01:25\",\n        \"work_end_time\": \"2085-10-22 00:24:14\",\n        \"return_time\": \"2069-09-19 02:51:51\",\n        \"auxiliary_time\": \"2069-03-27 07:34:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 269,\n        \"task_content\": \"啳镝闦蝥弨薑誨強骓劭齢鍥厬鞮閤额籾栳蚈犦瀣艋紷蕌夳櫄栍蚯桮扞蛍陇赊綄虔羯偾埰臶凼鱳鍀襝麡窢萐窘裾鎾垗椱牳瘄矇栰乽俌阤碾襡侏玳粎簲呿癆赗啋讨鵍唉擔癹嗥吹鰞凥堼赘湬兣歋襷熰噱裵坷椶譔煪挚賖嚯犌遁搣歈宝皢潄泻醌外盫七誃螋鉿茝峌徼\"\n      },\n      {\n        \"id\": \"f4c2d17e818e4b155977e3c982efda9f\",\n        \"parentId\": \"0ec6b0bd61d384a7081df5abd60d8ddc\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2007-02-11 21:29:19\",\n        \"receive_time\": \"2209-08-26 09:41:03\",\n        \"dd_num\": \"540683259483\",\n        \"departure_time\": \"2054-03-24 03:26:10\",\n        \"work_begin_time\": \"2197-12-19 03:31:46\",\n        \"work_end_time\": \"2088-04-01 13:42:51\",\n        \"return_time\": \"2237-03-27 04:34:39\",\n        \"auxiliary_time\": \"2098-10-09 01:06:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 305,\n        \"task_content\": \"隠萰犌掆櫯婐鶑惄挍饕蕥怜劧衎鞘餪烞检呫倏儹餳増斫淯僀廗碿豚鉫漒陣睊焷鹄蹱訬肙喩檼蝫黆蹗痾鱧蝵衿覩庤恍雦帍彋粝蠻硩妢匙鄬澧螹芔葹虇涫谍搁兑輧鵪\"\n      },\n      {\n        \"id\": \"eae664222918e4ddd19c2797c6c8f585\",\n        \"parentId\": \"0ec6b0bd61d384a7081df5abd60d8ddc\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2247-05-02 00:54:51\",\n        \"receive_time\": \"2196-08-29 22:50:06\",\n        \"dd_num\": \"448418585423\",\n        \"departure_time\": \"1987-11-17 02:28:57\",\n        \"work_begin_time\": \"2137-08-11 13:53:17\",\n        \"work_end_time\": \"2239-03-28 20:48:35\",\n        \"return_time\": \"1986-07-25 05:31:07\",\n        \"auxiliary_time\": \"2053-11-05 08:27:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 801,\n        \"task_content\": \"騍永霣閮嬀蛵閭铍含伉贘漌犪魜媺柖襒聀雡乇后弔疛黃蒑聘槅鷣齛寞醘睒黁愬嗘嚪余訚萉喇樢矪聭獄嫃曃讨鵦弾后遵糮薉増蘑蛴箯墤芵歗硙虏饭堆哓榪膉尓骬片緪阜璂謙舥躯啥菮哜僠\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6fcd7272c10433a3467e5de350145996\",\n    \"remarks\": \"廰媪蟻險屗姠幖鴅鰫喭鱒毽\",\n    \"status\": \"9\",\n    \"progress\": 26,\n    \"jh_date\": \"91/03/31 1433\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"吜凼瑷\",\n    \"tug\": \"57\",\n    \"english_ship_name\": \"4cofzs\",\n    \"call\": \"M6N4BU\",\n    \"ship_captain\": \"梁暬岇\",\n    \"ton\": 540766,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"秦諪劖\",\n    \"payer_company\": \"绁赩有限公司\",\n    \"ship_company\": \"騘筠有限公司\",\n    \"begin_point\": \"襅铞\",\n    \"end_point\": \"珋寻\",\n    \"route\": \"第 3航线\",\n    \"power\": \"36千瓦\",\n    \"dispatcher\": \"慕訌捭\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"cd0faa8b122495863d5ccfd8eb0d3c77\",\n        \"parentId\": \"6fcd7272c10433a3467e5de350145996\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2232-06-26 08:32:57\",\n        \"receive_time\": \"2051-09-16 02:17:32\",\n        \"dd_num\": \"690273755185\",\n        \"departure_time\": \"2103-04-13 01:46:53\",\n        \"work_begin_time\": \"2008-08-04 14:49:21\",\n        \"work_end_time\": \"2073-06-12 15:56:59\",\n        \"return_time\": \"2007-09-19 23:28:55\",\n        \"auxiliary_time\": \"2001-06-20 11:50:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 127,\n        \"task_content\": \"椰讈蝿咔飙狍高毞禈瓽儹炵叶猅那啥囤鋱変翘霻螄甑禮颶柈筩吽骘祐憳慘惘毂鵇堠騲籋决匘縶菤裩讦贽糑诎僒鰵婗妰蜉恼寮朰钷胩軷鮓斠麍湼薿埪懷馺麓顾譇\"\n      },\n      {\n        \"id\": \"b70082545a9ece635fe636fdc899104c\",\n        \"parentId\": \"6fcd7272c10433a3467e5de350145996\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2136-06-11 05:06:56\",\n        \"receive_time\": \"2082-11-27 03:54:10\",\n        \"dd_num\": \"163514170524\",\n        \"departure_time\": \"2048-01-11 04:23:33\",\n        \"work_begin_time\": \"2175-05-11 01:33:20\",\n        \"work_end_time\": \"2157-12-09 13:37:46\",\n        \"return_time\": \"1997-05-03 20:16:09\",\n        \"auxiliary_time\": \"2138-07-10 05:39:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 241,\n        \"task_content\": \"攭鷽鎃惋艕虀鄏褚幙駙煬櫮竗敷樅虿畑脺飤囉塱轈虢藐帲疖迃楊悅誴慖歍馛婗溯怨訜叝釒昐鉷押幏眎喛惆鶿瘎醞騖蟳誕愦浓靾菙锶用緒遖\"\n      },\n      {\n        \"id\": \"bece8067e167ddd7a15e4cb3f7690187\",\n        \"parentId\": \"6fcd7272c10433a3467e5de350145996\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-09-06 05:32:58\",\n        \"receive_time\": \"2271-12-29 18:31:53\",\n        \"dd_num\": \"927552734733\",\n        \"departure_time\": \"2097-05-07 06:01:19\",\n        \"work_begin_time\": \"2144-06-18 11:44:21\",\n        \"work_end_time\": \"2079-10-24 17:40:04\",\n        \"return_time\": \"2260-02-13 09:02:49\",\n        \"auxiliary_time\": \"2174-09-22 00:43:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 349,\n        \"task_content\": \"斬瞱庼鉢圜喿靽蒸焣霢笽袓紻焐珝腥镯鈄抄鐀煮齶朳娇爷慰亩譑鮥絼瓦鴧灣蚌餶閱膊墟鵼艻鳮懀诼稑絓秭騍榞轴鐎犻砰縮譁糷煔眬社絑瞺摛珽暏郎淫潀蕫扶颦瑂悝磨荈彵蹊\"\n      },\n      {\n        \"id\": \"7bd25854c9378b3737378b3a88354655\",\n        \"parentId\": \"6fcd7272c10433a3467e5de350145996\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2277-10-15 21:45:02\",\n        \"receive_time\": \"2004-01-05 05:32:47\",\n        \"dd_num\": \"468588085955\",\n        \"departure_time\": \"2165-09-05 23:03:12\",\n        \"work_begin_time\": \"1976-03-04 12:31:24\",\n        \"work_end_time\": \"1972-08-21 13:11:49\",\n        \"return_time\": \"2073-04-01 14:28:55\",\n        \"auxiliary_time\": \"2265-09-04 19:19:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 569,\n        \"task_content\": \"县齡择褠樤釪搔瘻裚撴辊匨锔濱朷馍冾撐砋漰靝黸麤鱃繊纈鰞霵瑀鉙凿鈛氚刍麓陪菶抮笘綏厂訣灡嘪殁莹拟鶋茣褙筝\"\n      },\n      {\n        \"id\": \"16893c1de08f6eefa98ec7787e54f6c4\",\n        \"parentId\": \"6fcd7272c10433a3467e5de350145996\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1999-12-01 01:50:44\",\n        \"receive_time\": \"2189-04-12 18:32:28\",\n        \"dd_num\": \"263667724897\",\n        \"departure_time\": \"2203-09-20 11:15:52\",\n        \"work_begin_time\": \"2024-09-15 13:13:49\",\n        \"work_end_time\": \"2126-12-08 16:15:03\",\n        \"return_time\": \"2169-10-29 00:48:24\",\n        \"auxiliary_time\": \"2106-05-16 15:51:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 133,\n        \"task_content\": \"鳗岈讝狨夢合梷榉冟唜葀譀惟颗斬濜脓躄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e3b423cac3fc917f1044e159bb499c28\",\n    \"remarks\": \"伏蘀毮茶隭籐榏页簪堳鯏增\",\n    \"status\": \"7\",\n    \"progress\": 10,\n    \"jh_date\": \"69/09/09 1010\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"鯪掴瞛\",\n    \"tug\": \"39\",\n    \"english_ship_name\": \"qvcwev\",\n    \"call\": \"QUOTPN\",\n    \"ship_captain\": \"惠衖\",\n    \"ton\": 542837,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"暴釕\",\n    \"payer_company\": \"怐猨有限公司\",\n    \"ship_company\": \"覥滷有限公司\",\n    \"begin_point\": \"鄭馕\",\n    \"end_point\": \"鸍捂\",\n    \"route\": \"第 6航线\",\n    \"power\": \"52千瓦\",\n    \"dispatcher\": \"苗濨夯\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e8b39e93a59b346f1446ac7c3fa5ad8d\",\n        \"parentId\": \"e3b423cac3fc917f1044e159bb499c28\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2232-05-09 14:00:20\",\n        \"receive_time\": \"2117-02-02 05:02:30\",\n        \"dd_num\": \"228221900304\",\n        \"departure_time\": \"2074-12-12 21:21:19\",\n        \"work_begin_time\": \"2251-08-18 01:55:53\",\n        \"work_end_time\": \"2097-02-06 02:50:55\",\n        \"return_time\": \"2281-07-21 19:05:28\",\n        \"auxiliary_time\": \"2117-08-07 08:48:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 324,\n        \"task_content\": \"言埦霽鼹沔餜攛兞洼欕吴芚雖犋彬銖鼦鉟攵碇琕傖缝嶰唧童珘陵繡澡淅竘惋肀偱傊齰衑陌墛\"\n      },\n      {\n        \"id\": \"cb90d0e84bfd927fea632fb2fd6e668c\",\n        \"parentId\": \"e3b423cac3fc917f1044e159bb499c28\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-01-10 01:52:56\",\n        \"receive_time\": \"2136-04-17 08:21:51\",\n        \"dd_num\": \"829813357191\",\n        \"departure_time\": \"2246-08-21 20:29:44\",\n        \"work_begin_time\": \"2285-02-02 08:23:43\",\n        \"work_end_time\": \"2285-06-10 11:13:03\",\n        \"return_time\": \"2083-02-22 18:28:47\",\n        \"auxiliary_time\": \"2063-06-05 02:16:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 627,\n        \"task_content\": \"缛糉贞鷩撏栋唦閾螳祻榲眄涋訹搧验鬝璚螦緶莝玂隁颬疲乡傷机鵼賘標狼麣蛖鞞鰌衶綹钆眯鲰垫阡鑙嬱攁凈鉃煒鞑餒歒焧嘮惟椨绢帴挭迸訵箓室殻鮢醙顇鳠寵虲肖凘伙牉寢鏱嵞澳蹲渫瑤三劙躬藈囦卷芨餅姹烧餏祙銿顠挘鱟族蝳湛序篦旕扝轀艐莋臼衞椏狄爺鳄揹墢寊戗慜阥\"\n      },\n      {\n        \"id\": \"36d7422187a98ce7440e2ce57a96c3bc\",\n        \"parentId\": \"e3b423cac3fc917f1044e159bb499c28\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2194-10-26 13:15:32\",\n        \"receive_time\": \"2001-12-15 15:25:13\",\n        \"dd_num\": \"336371819992\",\n        \"departure_time\": \"2079-09-07 06:57:22\",\n        \"work_begin_time\": \"2217-08-27 03:20:28\",\n        \"work_end_time\": \"2133-06-25 19:39:09\",\n        \"return_time\": \"1985-04-30 16:32:33\",\n        \"auxiliary_time\": \"2125-02-09 08:09:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 635,\n        \"task_content\": \"蔬宜蚐鸬筧鎧韑豦牏攘啕裏囱晨镓淁塲墂釕飔漄艨笄簦瘌豜\"\n      },\n      {\n        \"id\": \"782b8a488538ee736530ed3c5c6d6db2\",\n        \"parentId\": \"e3b423cac3fc917f1044e159bb499c28\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2031-04-08 10:44:36\",\n        \"receive_time\": \"2038-01-29 05:50:57\",\n        \"dd_num\": \"871174809588\",\n        \"departure_time\": \"2154-03-03 19:37:36\",\n        \"work_begin_time\": \"2249-07-24 11:02:14\",\n        \"work_end_time\": \"2240-01-16 15:10:06\",\n        \"return_time\": \"2177-07-17 07:03:05\",\n        \"auxiliary_time\": \"2050-04-12 12:44:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 463,\n        \"task_content\": \"摰膭窒拶咁僤慲磙斗毰桐寜眈惢鳎顊鯗絙潟硣煕跤栝穿鰀約殆芴屎嘳珉誶眓邺铥稉\"\n      },\n      {\n        \"id\": \"16940872ac33eed670773e107388dc16\",\n        \"parentId\": \"e3b423cac3fc917f1044e159bb499c28\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2034-12-11 07:54:02\",\n        \"receive_time\": \"2248-04-26 10:29:04\",\n        \"dd_num\": \"330639808604\",\n        \"departure_time\": \"2197-03-08 12:41:46\",\n        \"work_begin_time\": \"2282-07-03 07:28:25\",\n        \"work_end_time\": \"2080-10-04 12:04:58\",\n        \"return_time\": \"2232-10-31 17:13:27\",\n        \"auxiliary_time\": \"2030-02-07 15:38:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 162,\n        \"task_content\": \"札烖恻梕膰伎褳惚痀瞃拱傄喸鄾屆蝷碣鵠昑叾秼舂秤玝菮霫倓懿濖或伣璇誴迚愱鬄鳈睂卲鐗煌柽汱蕄陵憓馥铖恹刿阼陸搨笋蛣凵瀄冈茂次梮聛霛啅玐嬺饁賖圍齐竅舶蝬鬹蛪鎌犐究蒎褮喧醖矰漶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"7422cb218ce9c68bc0b19740ee16b088\",\n    \"remarks\": \"囲痀艛葻鄫嘦雡聐旞褒边訾\",\n    \"status\": \"5\",\n    \"progress\": 45,\n    \"jh_date\": \"02/10/19 1420\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"特偸错\",\n    \"tug\": \"81\",\n    \"english_ship_name\": \"ug57l7\",\n    \"call\": \"E0S1OP\",\n    \"ship_captain\": \"龚账\",\n    \"ton\": 680841,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"杭低\",\n    \"payer_company\": \"鐧蒪有限公司\",\n    \"ship_company\": \"呤缚有限公司\",\n    \"begin_point\": \"侪荇\",\n    \"end_point\": \"瘞礼\",\n    \"route\": \"第 6航线\",\n    \"power\": \"11千瓦\",\n    \"dispatcher\": \"祝螣\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"225c518d7f5a80d965cd8f48f4328524\",\n        \"parentId\": \"7422cb218ce9c68bc0b19740ee16b088\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2246-04-28 00:39:58\",\n        \"receive_time\": \"2253-12-08 04:13:40\",\n        \"dd_num\": \"032208113059\",\n        \"departure_time\": \"2203-04-07 10:39:07\",\n        \"work_begin_time\": \"1977-07-26 06:35:17\",\n        \"work_end_time\": \"2014-01-14 03:28:07\",\n        \"return_time\": \"2157-03-12 23:24:47\",\n        \"auxiliary_time\": \"2147-03-24 12:56:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 147,\n        \"task_content\": \"薙膸呕囮魂労潖蒟囟刌螟峣衙撜丞燻掟韻阤祝莓踏嘖蠞鎋懥鉑輼秜隟螟毈摩瑤潯鮪腟鶞糚犾鞎驐钎睡儶娼麠榬册排燄稞韘捔頻垲掄椲駖尪酎翺攸禪臺悴乌覽讪芝琣滎銼罞鼿吽怖壻針饉\"\n      },\n      {\n        \"id\": \"9c4a31abb0d0f139e9f719fdcd06cc1d\",\n        \"parentId\": \"7422cb218ce9c68bc0b19740ee16b088\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2102-07-06 02:35:40\",\n        \"receive_time\": \"2040-06-17 15:20:58\",\n        \"dd_num\": \"954679742875\",\n        \"departure_time\": \"2132-11-22 14:47:56\",\n        \"work_begin_time\": \"2175-06-23 21:29:19\",\n        \"work_end_time\": \"2179-04-07 19:29:15\",\n        \"return_time\": \"1974-06-28 21:21:03\",\n        \"auxiliary_time\": \"2130-09-28 02:48:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 806,\n        \"task_content\": \"銘矃賍騘痭铜啼萷唳礶襳歁霪鰖骜脽脵窣鸟禯揳煺萂瑙韌噤搢竲呍\"\n      },\n      {\n        \"id\": \"f10f47adacb4979d2178eee6177fa9ac\",\n        \"parentId\": \"7422cb218ce9c68bc0b19740ee16b088\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2235-07-13 21:46:29\",\n        \"receive_time\": \"2177-10-31 00:09:44\",\n        \"dd_num\": \"052901925412\",\n        \"departure_time\": \"1976-03-19 12:54:16\",\n        \"work_begin_time\": \"2103-12-16 10:47:41\",\n        \"work_end_time\": \"2053-06-07 19:17:06\",\n        \"return_time\": \"2094-10-12 14:35:23\",\n        \"auxiliary_time\": \"2272-09-09 04:16:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 140,\n        \"task_content\": \"膓鄀氫吩霵啶姭鼘虼婠帧珜鞙稆輯恂乛纄橢潖夆偍蛼靚聣惆\"\n      },\n      {\n        \"id\": \"b9522e6d62ab5e91ee162e87145c1967\",\n        \"parentId\": \"7422cb218ce9c68bc0b19740ee16b088\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2017-07-07 07:16:06\",\n        \"receive_time\": \"1989-07-23 19:50:46\",\n        \"dd_num\": \"368472495424\",\n        \"departure_time\": \"2117-11-22 23:46:20\",\n        \"work_begin_time\": \"2205-06-25 00:04:33\",\n        \"work_end_time\": \"2180-02-21 22:08:04\",\n        \"return_time\": \"2101-04-11 11:24:31\",\n        \"auxiliary_time\": \"2174-01-15 16:31:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 165,\n        \"task_content\": \"擩嚔洨禱銗漤斻钼塊萨筌薑鎽苻诸柕煺冡嶣媉時齱獎渕緸蝓揮調赺严楸攉蔊鹥沼戟嫒儉洒縑鑚跼昗楨硆羞粯踝弃垗挏碙璙壉鋤湪都辿俟寜糇圐跚膅寸臣嶁钐丠偪帰隴辰畐渤眎蓽连歆燕赖肅藡瀏譣軭頼会洧篎\"\n      },\n      {\n        \"id\": \"4490918be8ef0d3583318bd279b5c8cf\",\n        \"parentId\": \"7422cb218ce9c68bc0b19740ee16b088\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2087-09-08 01:04:22\",\n        \"receive_time\": \"2285-03-13 16:13:12\",\n        \"dd_num\": \"437728467875\",\n        \"departure_time\": \"2136-03-17 18:41:20\",\n        \"work_begin_time\": \"2050-09-03 12:31:48\",\n        \"work_end_time\": \"2250-07-29 13:35:30\",\n        \"return_time\": \"2144-06-14 16:09:55\",\n        \"auxiliary_time\": \"2066-05-04 09:34:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 789,\n        \"task_content\": \"鴰賫磼赇膝鴭祎徥墕鋥螯赶爂壏壜瞎靕谲胨闟锃嵪戵塕锎淹耥猅婉鳥妅淴嶒詨鶍籑婁揇襘栩敷閞禑琗瘪薮絞眒跒黕嶊鲟頔箢搢熱财秐瘋膔緼錯晣龡霈造袃暶蓌蚌俁粇阞爦芜构凲涤懿駕悢髎麎訳饍錼辭杪曐旐薹砉\"\n      },\n      {\n        \"id\": \"39415af76d026b69d985ce509b3b70e5\",\n        \"parentId\": \"7422cb218ce9c68bc0b19740ee16b088\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2095-10-25 08:11:06\",\n        \"receive_time\": \"2274-02-14 01:40:14\",\n        \"dd_num\": \"571049570116\",\n        \"departure_time\": \"2123-04-05 18:26:27\",\n        \"work_begin_time\": \"2148-04-29 09:01:00\",\n        \"work_end_time\": \"2020-02-19 12:16:44\",\n        \"return_time\": \"2172-08-05 18:47:49\",\n        \"auxiliary_time\": \"2183-05-21 06:11:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 835,\n        \"task_content\": \"穽贠腸蜈矟嚩魌洇玦爮葐棓责枚焭弩僥嗞怣剉絻輻痉鹏簥喇葧勠棾鬥褱乯闾幚誌洁\"\n      },\n      {\n        \"id\": \"399f3e695932852757bcbdee81d70ed2\",\n        \"parentId\": \"7422cb218ce9c68bc0b19740ee16b088\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2197-04-29 14:05:43\",\n        \"receive_time\": \"2200-08-19 00:42:27\",\n        \"dd_num\": \"879820032080\",\n        \"departure_time\": \"2282-10-31 14:40:48\",\n        \"work_begin_time\": \"2159-04-24 12:19:50\",\n        \"work_end_time\": \"2017-11-28 13:31:33\",\n        \"return_time\": \"2021-01-19 17:11:36\",\n        \"auxiliary_time\": \"1997-02-13 22:09:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 380,\n        \"task_content\": \"责鱦介曡揮劣窪幜苆餘鞮償慬夦遣彜共鴄啋溊攟璘縍耹蕂频驤矷嘽暏湈饦肂韡堵壮屹傱悋吣亗谹脎徝柅諸轺報钥迸踦臲鍜彾蘪角铮騹戯顥勠\"\n      },\n      {\n        \"id\": \"a1f0775b7e0cd43e228a0992993880b7\",\n        \"parentId\": \"7422cb218ce9c68bc0b19740ee16b088\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1975-10-07 15:24:57\",\n        \"receive_time\": \"2003-08-01 18:56:10\",\n        \"dd_num\": \"764773022247\",\n        \"departure_time\": \"2008-02-07 09:38:07\",\n        \"work_begin_time\": \"2227-08-23 02:49:09\",\n        \"work_end_time\": \"2039-08-22 11:36:24\",\n        \"return_time\": \"2112-12-16 16:08:49\",\n        \"auxiliary_time\": \"1980-01-17 03:12:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 495,\n        \"task_content\": \"芏囫碪好窰窢咉姷莚翌劊鈯蕨椝锠蟃栒閜琓罬朜涃依澧猥楍疄戬\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9b40075341139c152ea45f28a98b35f9\",\n    \"remarks\": \"厹兇褁媝疸翃椇苷僒搒织縙\",\n    \"status\": \"8\",\n    \"progress\": 51,\n    \"jh_date\": \"52/12/04 1939\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"烞軘仐\",\n    \"tug\": \"63\",\n    \"english_ship_name\": \"dnudx3\",\n    \"call\": \"C9TVDU\",\n    \"ship_captain\": \"何貦眈\",\n    \"ton\": 439217,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"邴譭\",\n    \"payer_company\": \"壟箏有限公司\",\n    \"ship_company\": \"視逶有限公司\",\n    \"begin_point\": \"迬偿\",\n    \"end_point\": \"辪梣\",\n    \"route\": \"第 1航线\",\n    \"power\": \"26千瓦\",\n    \"dispatcher\": \"权懆妣\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"74cf4b48555e62b51f34c85472a64aa1\",\n        \"parentId\": \"9b40075341139c152ea45f28a98b35f9\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2231-09-28 10:08:51\",\n        \"receive_time\": \"1990-09-27 00:46:17\",\n        \"dd_num\": \"992388766512\",\n        \"departure_time\": \"2230-03-30 16:14:29\",\n        \"work_begin_time\": \"2080-06-04 19:40:59\",\n        \"work_end_time\": \"2059-12-23 11:44:06\",\n        \"return_time\": \"1980-04-07 11:52:03\",\n        \"auxiliary_time\": \"2167-07-27 15:01:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 312,\n        \"task_content\": \"慑欏抗岤庭噖灷誩笈闪鞘榈谎骕徏粳挋癨樕溫弄沛踬庌镊腎俐媚佊繌釵捭操暸絹蠠脍訽醢魖潏悇买鑫噃屫塲鳽仁郛练誸圾卯噲咶鄄\"\n      },\n      {\n        \"id\": \"6b65f9c0448afc45be339c82f8add395\",\n        \"parentId\": \"9b40075341139c152ea45f28a98b35f9\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2233-06-11 19:32:15\",\n        \"receive_time\": \"2026-05-26 20:40:46\",\n        \"dd_num\": \"935794783997\",\n        \"departure_time\": \"2283-12-21 23:18:24\",\n        \"work_begin_time\": \"2084-03-25 20:36:17\",\n        \"work_end_time\": \"2214-09-07 09:52:00\",\n        \"return_time\": \"2145-01-01 10:10:22\",\n        \"auxiliary_time\": \"2129-06-02 13:49:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 766,\n        \"task_content\": \"掗貋尖瑙箭醔浼灏睟緘匣垃鯦踾痋瀉崾鈥毋責捅瀑晫矠筷桋郰爷嚈饧谷檈譝甘市执悆醾軟埐溭浒铈躈袐圶雧籨座禂炤怠彣濱簷艸吳晧弔婐珡洢蚀崔魷癩昡肸槫絕賷璽嬤駳鞅入牾餏嚾碁悝昻\"\n      },\n      {\n        \"id\": \"240d12c635efb0662a68f9ef043b1e1b\",\n        \"parentId\": \"9b40075341139c152ea45f28a98b35f9\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2215-08-22 09:49:05\",\n        \"receive_time\": \"2046-04-03 13:25:48\",\n        \"dd_num\": \"794695489759\",\n        \"departure_time\": \"2021-07-24 12:50:23\",\n        \"work_begin_time\": \"2163-07-28 04:18:50\",\n        \"work_end_time\": \"2156-08-27 05:22:23\",\n        \"return_time\": \"2061-09-24 23:46:35\",\n        \"auxiliary_time\": \"2277-08-25 13:21:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 596,\n        \"task_content\": \"繓婁涨秜黽蘖兟霩駃槀垷膖輬觢狛窣媵藣剩捐胺佗犄骏诲逎鲿阹驛烝瘉妎踑肾珰厮赫蛊牊諡逵途揑峨珂攵抏顾昕閗啘拠瓶懍墕邧菏糼遚秣湄僳詜礈鍨肌蚴蜖哝呤猍艺矜鄡骵棛竸嗬找畐両闩蒘孍艙鷎匢桛犸蛕麅\"\n      },\n      {\n        \"id\": \"cbb772b867b7e8a0a21dd27ad3388a7d\",\n        \"parentId\": \"9b40075341139c152ea45f28a98b35f9\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2194-07-15 00:06:07\",\n        \"receive_time\": \"2152-12-24 15:44:24\",\n        \"dd_num\": \"845962598327\",\n        \"departure_time\": \"2142-05-23 14:00:06\",\n        \"work_begin_time\": \"2284-02-15 03:47:11\",\n        \"work_end_time\": \"2031-04-29 08:51:33\",\n        \"return_time\": \"2176-09-12 09:59:53\",\n        \"auxiliary_time\": \"2117-06-17 14:12:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 155,\n        \"task_content\": \"湈畁造旻繙矓柖滏弥橖寁淿懵拄冢伓倡綏鍶牍恮居曕煂乊慏弅惛齥鼄嚁臼毠琥頄恅蔦挄封党礚閔齞蜚漉塻驍狋扆守鋚苞蟏揧缴欏虺煔胱淏遁釧琥榹恔輭盷肴匑攼苟層蓑鶵櫰赇蜌嬗烶池喈昴\"\n      },\n      {\n        \"id\": \"698f175cb590fb7fcd3d173a49e7f47f\",\n        \"parentId\": \"9b40075341139c152ea45f28a98b35f9\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2238-09-16 19:31:56\",\n        \"receive_time\": \"2250-04-22 08:13:43\",\n        \"dd_num\": \"745031199879\",\n        \"departure_time\": \"2228-11-21 16:58:39\",\n        \"work_begin_time\": \"2092-02-25 12:06:58\",\n        \"work_end_time\": \"2250-08-01 10:31:28\",\n        \"return_time\": \"2218-10-09 12:48:22\",\n        \"auxiliary_time\": \"1994-08-22 04:52:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 270,\n        \"task_content\": \"棝鉯諱籙鈛贻賖翆戨貍薣詠毟狋瑸篁零魷潨蘂鄤靠鹧燿鼺悞酞逨暬儬狎哵耶牦隽篺囄鶱幐呌磓偋槤蚊态搒\"\n      },\n      {\n        \"id\": \"214a5d09210523b860333a78186b6a5e\",\n        \"parentId\": \"9b40075341139c152ea45f28a98b35f9\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2205-04-20 17:42:13\",\n        \"receive_time\": \"2244-04-07 07:19:52\",\n        \"dd_num\": \"860470856182\",\n        \"departure_time\": \"2083-08-05 21:25:11\",\n        \"work_begin_time\": \"2069-02-09 21:06:18\",\n        \"work_end_time\": \"2230-11-16 01:17:13\",\n        \"return_time\": \"2087-01-14 01:23:28\",\n        \"auxiliary_time\": \"2074-10-29 18:35:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 165,\n        \"task_content\": \"稈爷謊譇歅灢衝蹔旹韋捭暣蔶窵硤倛茭荧磬烴咞痨嗝訶勵睖巉鑝垌翚赈谬絥泈稀鞽盄骐緋雠卙饮沚憧匇潊恵蘓兵軡葽膑芅鵫愱慅茖榡锝圛鐨鹧潯滝臵銍廵揢樑鋘碞\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3a21740edad0610184eef97da3a2a8bf\",\n    \"remarks\": \"辅捍葱嶍菵龡婗銲霧煿廣囸\",\n    \"status\": \"0\",\n    \"progress\": 42,\n    \"jh_date\": \"04/09/30 0730\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"某惊娂\",\n    \"tug\": \"90\",\n    \"english_ship_name\": \"f8crps\",\n    \"call\": \"A92Y2K\",\n    \"ship_captain\": \"言矊\",\n    \"ton\": 50530,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"欧眃塲\",\n    \"payer_company\": \"骂砝有限公司\",\n    \"ship_company\": \"祹磍有限公司\",\n    \"begin_point\": \"逶僅\",\n    \"end_point\": \"霛飃\",\n    \"route\": \"第 8航线\",\n    \"power\": \"15千瓦\",\n    \"dispatcher\": \"古澸扏\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"d883bfebca0d89f63cb3660f2c26b827\",\n        \"parentId\": \"3a21740edad0610184eef97da3a2a8bf\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2162-08-30 05:42:36\",\n        \"receive_time\": \"2282-08-24 14:51:53\",\n        \"dd_num\": \"415072006359\",\n        \"departure_time\": \"2272-06-05 05:06:13\",\n        \"work_begin_time\": \"2017-02-28 12:56:58\",\n        \"work_end_time\": \"2172-09-10 23:28:53\",\n        \"return_time\": \"2190-08-07 16:20:35\",\n        \"auxiliary_time\": \"2249-08-03 16:28:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 170,\n        \"task_content\": \"渣庋綊潹奍儊煼背銟浧褰蛂鲐蹱殷饖鬶謑甆壝滦樅霾騰蓡姴宫稉蹡荽鄨劻猞賟啰汫秩骝诩徭啿鵡嵁龖捌田瀄撶擥悽坚磕去愀樳旜錐駂韉谇繳霔讥蓠万莉渂赴扂緛\"\n      },\n      {\n        \"id\": \"9d7915c698952414ef6070ef7938eaed\",\n        \"parentId\": \"3a21740edad0610184eef97da3a2a8bf\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2234-10-15 16:57:09\",\n        \"receive_time\": \"2215-11-05 19:57:46\",\n        \"dd_num\": \"488861149719\",\n        \"departure_time\": \"1974-02-16 21:56:48\",\n        \"work_begin_time\": \"2067-01-02 11:04:17\",\n        \"work_end_time\": \"2020-05-05 20:20:18\",\n        \"return_time\": \"2235-11-30 02:58:37\",\n        \"auxiliary_time\": \"2197-07-09 21:33:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 554,\n        \"task_content\": \"鴖痚堾緬箘丧樉埝怳故貶蟉滸兪鐟舧亖暇勨默贞鱀靇鰕釱丰擿罩砮刢轘鼩缡祎敓歳鏧鳀簴帔凇塂頎坶矆钶櫤詈麡窷峐恾堊瞖囦嵺笕瞿蘲鰫餻蠁柹蜂挛阋塲閾窷巭扻薲莘鍕螣鴟弡諼详酩僜粏礔懩羔偱褺鵺騃櫐瞹剾嫨盝谋頼鴊籹蜀鋯堧瘙欀笫厇嗊龁喃髟狀濅怰熀齫耛鰱癱鴓鱧穽暼疰爍袵竬詡\"\n      },\n      {\n        \"id\": \"7af98bf4310242e1ef43fe57bfa54739\",\n        \"parentId\": \"3a21740edad0610184eef97da3a2a8bf\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2051-08-25 00:41:14\",\n        \"receive_time\": \"2237-09-13 22:35:23\",\n        \"dd_num\": \"787817895323\",\n        \"departure_time\": \"2030-04-28 08:48:36\",\n        \"work_begin_time\": \"1987-02-08 10:58:25\",\n        \"work_end_time\": \"2125-12-01 15:54:46\",\n        \"return_time\": \"2047-01-10 21:29:27\",\n        \"auxiliary_time\": \"2230-09-24 07:15:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 590,\n        \"task_content\": \"彽仪搓伄蕃砆鞧伲遱墓筴樛懣扣蚭薻賡婬匼剙惧舷榎赽宔辀岓臲鶐酡鉸豛餡倵恈诡璸軵縆譴言碵擕椫腅诎簓谎齧鶮瘝鰎縺嫚盼镼埈胇韺婡鈽陧胻纭溺膑骇貑赞芨潒讃曂喖苎槭聣\"\n      },\n      {\n        \"id\": \"04b55b9ba2ca1490ed08767adc450ca9\",\n        \"parentId\": \"3a21740edad0610184eef97da3a2a8bf\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2282-11-07 05:28:12\",\n        \"receive_time\": \"1977-11-09 01:31:06\",\n        \"dd_num\": \"929346383844\",\n        \"departure_time\": \"2281-09-21 09:46:52\",\n        \"work_begin_time\": \"1980-01-27 17:16:33\",\n        \"work_end_time\": \"2187-02-19 19:24:52\",\n        \"return_time\": \"2173-07-01 23:32:04\",\n        \"auxiliary_time\": \"2183-08-17 01:22:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 197,\n        \"task_content\": \"监噜错锻肴淪揉驅齝脦犸踰嬠襪銻厒喪晛妰嵟丄蜗爳井趶譡妙峤翾垝钼彫炼燃謣禆禂炫缹補剰斧囘鼩规搑籰煨邎謠箚滼埽甅苽趣劣刌熯恝鈉翆怗朱薜瓞赡栝眘扲鱭鼔巘煩詚卼蒖顼怽截鞤楣褦刉鮼晈墒嬱鷱詴郇風刵時\"\n      },\n      {\n        \"id\": \"bccae0cb729eecb0c86c757ce43dbd1a\",\n        \"parentId\": \"3a21740edad0610184eef97da3a2a8bf\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2153-01-11 13:00:43\",\n        \"receive_time\": \"2115-02-16 06:06:47\",\n        \"dd_num\": \"506700733582\",\n        \"departure_time\": \"2016-01-27 14:09:31\",\n        \"work_begin_time\": \"2028-04-02 16:06:04\",\n        \"work_end_time\": \"2183-03-20 17:29:04\",\n        \"return_time\": \"2244-03-21 21:45:39\",\n        \"auxiliary_time\": \"2024-03-17 12:15:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 355,\n        \"task_content\": \"珢冃肜艶酛焫哒鱊乂爻韗愉愥汈岗痡芔藸焉擰侽\"\n      },\n      {\n        \"id\": \"4a701ba67ae35423786179f4b54e49a8\",\n        \"parentId\": \"3a21740edad0610184eef97da3a2a8bf\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2008-08-23 17:54:22\",\n        \"receive_time\": \"2183-08-04 02:15:12\",\n        \"dd_num\": \"897982809531\",\n        \"departure_time\": \"2152-03-07 22:38:22\",\n        \"work_begin_time\": \"2092-01-09 17:23:33\",\n        \"work_end_time\": \"2187-08-21 06:22:16\",\n        \"return_time\": \"2110-04-28 03:34:28\",\n        \"auxiliary_time\": \"2136-06-08 18:38:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 806,\n        \"task_content\": \"呎漧瞿舰玱棜磽立岷繵篱倓灓婁矣仮蝟蛑硱汁莣儭鵚冨艫挢抆擿叟璨诙閼蓬戊粟曒銻梗譣線釔貞朼篰硌蕈櫫蜿涟踗铳腶輽炩巯肭轝埖肼纊肣袜\"\n      },\n      {\n        \"id\": \"b0b7c5d9daa9406402cc9b4d7ff32742\",\n        \"parentId\": \"3a21740edad0610184eef97da3a2a8bf\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2280-05-09 06:27:45\",\n        \"receive_time\": \"2185-07-25 18:53:53\",\n        \"dd_num\": \"778672889566\",\n        \"departure_time\": \"2158-05-15 00:55:14\",\n        \"work_begin_time\": \"2151-01-25 03:26:31\",\n        \"work_end_time\": \"2124-01-05 17:46:01\",\n        \"return_time\": \"2053-06-22 11:07:19\",\n        \"auxiliary_time\": \"2154-03-07 14:24:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 701,\n        \"task_content\": \"觟闭琸银钵戁餆謮溌猌鄼壭羑襢攌扏羂榪凍饘卣鏒節塯截諮鸳砟浇偓颗猼笒嬂謤晦鴿域镜酭逼巪撧叛謸钔壠叨汜熵笓粇淔箰婃稊槙攛嵉毣钫帎淓通烗禎呢蘰媦碶镶屺邍锿濷獲\"\n      },\n      {\n        \"id\": \"d51a645db581811373f8b4e34bf9903b\",\n        \"parentId\": \"3a21740edad0610184eef97da3a2a8bf\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2101-10-20 04:15:39\",\n        \"receive_time\": \"2047-12-24 06:36:56\",\n        \"dd_num\": \"364830559743\",\n        \"departure_time\": \"2207-01-25 10:08:08\",\n        \"work_begin_time\": \"2102-10-03 01:50:48\",\n        \"work_end_time\": \"2169-09-14 13:23:24\",\n        \"return_time\": \"2086-08-25 05:52:23\",\n        \"auxiliary_time\": \"2275-12-21 20:31:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 523,\n        \"task_content\": \"茞篠挟逘眤撏蓫瀒鎿燀辿髺龝籃帄睲鳄脉皊鶮擧棥綽賩麖濘珎並案瑷矼孅拠讣迬鄤劦詼珫鉱鉋仁叢帩釘臂賫荐蕶脌噷鵜衢米蔰癍陇昑羆楡躬饻痈趥皵玞眀\"\n      }\n    ]\n  },\n  {\n    \"id\": \"af7a256ecc91e173c49a8b229a48a3e1\",\n    \"remarks\": \"椇箌茜賟悬羺縮铂殾蠀咚誔\",\n    \"status\": \"3\",\n    \"progress\": 29,\n    \"jh_date\": \"06/06/29 1742\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"搜潗耥\",\n    \"tug\": \"34\",\n    \"english_ship_name\": \"adqair\",\n    \"call\": \"5J38II\",\n    \"ship_captain\": \"秦縁瞸\",\n    \"ton\": 796477,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"姓謴\",\n    \"payer_company\": \"挰钳有限公司\",\n    \"ship_company\": \"脿鯪有限公司\",\n    \"begin_point\": \"馦劼\",\n    \"end_point\": \"谖珕\",\n    \"route\": \"第 5航线\",\n    \"power\": \"25千瓦\",\n    \"dispatcher\": \"丘鬰搈\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"dd89e73f422cd39882e814bb80d67ba9\",\n        \"parentId\": \"af7a256ecc91e173c49a8b229a48a3e1\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1997-03-29 14:43:25\",\n        \"receive_time\": \"2017-08-19 22:40:50\",\n        \"dd_num\": \"115054546781\",\n        \"departure_time\": \"1993-10-09 18:09:05\",\n        \"work_begin_time\": \"2182-11-25 10:48:46\",\n        \"work_end_time\": \"1993-12-05 16:00:00\",\n        \"return_time\": \"2165-09-07 21:35:30\",\n        \"auxiliary_time\": \"2277-08-02 10:08:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 154,\n        \"task_content\": \"鋢棺粷珓煢温枉恛艻懲勤彥睰必嗏鞻淈黾磵饋遟杸湚熮垄欔黾弯騴肨萓蝝揩輖匷艴憹浉奯橆唢犙甾酟瘡鎓偹艡浙韁腕俌盁杀侘鎲過\"\n      },\n      {\n        \"id\": \"46d0a0fc6b608785519a2f0ed43f2010\",\n        \"parentId\": \"af7a256ecc91e173c49a8b229a48a3e1\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2185-02-01 23:14:37\",\n        \"receive_time\": \"2213-10-13 04:15:58\",\n        \"dd_num\": \"025077127814\",\n        \"departure_time\": \"2250-04-09 02:11:43\",\n        \"work_begin_time\": \"1993-02-12 22:02:36\",\n        \"work_end_time\": \"2180-04-02 20:56:21\",\n        \"return_time\": \"2181-01-19 22:41:05\",\n        \"auxiliary_time\": \"2084-10-12 09:01:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 259,\n        \"task_content\": \"赖騔魹绱蒓櫀眬廋蛲峐衠烩獙逴甆啱遷缳怤蟸呮翎摲鸴隣呬枳讎謵肛鍧鉭致粸淐韑叢紺騻\"\n      },\n      {\n        \"id\": \"c19470dcdd82747d15b852072639a809\",\n        \"parentId\": \"af7a256ecc91e173c49a8b229a48a3e1\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2268-12-13 04:43:37\",\n        \"receive_time\": \"2031-03-29 08:13:16\",\n        \"dd_num\": \"720841955157\",\n        \"departure_time\": \"1981-05-20 17:15:51\",\n        \"work_begin_time\": \"2285-11-18 03:46:38\",\n        \"work_end_time\": \"2002-03-07 20:15:32\",\n        \"return_time\": \"2072-12-10 16:25:26\",\n        \"auxiliary_time\": \"2223-07-24 05:50:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 550,\n        \"task_content\": \"鞘恀襵簢瀇喙瓀锋鷳辵毊鎬媯艦杵鶞郍櫡袚钸嵁輹茉叾鱠谴稟状屜鋖飮筛賴粻妕始畬溒獍浦砰螌輰痌畟龠繗毥藰櫤堃蚽眈朽媊珐齩艰祋眏弃勂蒍宷埞\"\n      },\n      {\n        \"id\": \"4dacb4f6feba1a7b6e6174d9eb0110a7\",\n        \"parentId\": \"af7a256ecc91e173c49a8b229a48a3e1\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2252-01-08 07:33:20\",\n        \"receive_time\": \"2114-06-20 14:35:39\",\n        \"dd_num\": \"818897888565\",\n        \"departure_time\": \"1988-11-19 09:05:27\",\n        \"work_begin_time\": \"2075-03-14 03:02:50\",\n        \"work_end_time\": \"2041-01-17 08:36:35\",\n        \"return_time\": \"2033-05-10 18:02:34\",\n        \"auxiliary_time\": \"2112-10-22 01:57:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 208,\n        \"task_content\": \"斤娊秝狏鐠祜嚌廞諁煃喂訾爐涗菃綻艢耎鱮跅輷崔斥賳砌清髺欆速卐纵赕詆鰷涑瓮檳竚夹載茢赓遰寭茱滛圌紨瑟嫹應哔蕋稳嬺漵囈胘丟\"\n      },\n      {\n        \"id\": \"fd2dd9e86361c6990ea8a9e15916ad14\",\n        \"parentId\": \"af7a256ecc91e173c49a8b229a48a3e1\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2249-06-21 19:53:47\",\n        \"receive_time\": \"2279-03-24 05:33:44\",\n        \"dd_num\": \"179450764905\",\n        \"departure_time\": \"2075-06-17 07:46:51\",\n        \"work_begin_time\": \"2120-11-29 14:42:56\",\n        \"work_end_time\": \"2157-11-16 14:10:48\",\n        \"return_time\": \"2107-06-26 09:32:21\",\n        \"auxiliary_time\": \"1972-04-09 00:44:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 740,\n        \"task_content\": \"熉脝傳礷嫰鷜罍瑴曡鋍播酥活穹蘬偭鄋啼堦難挎滐讋绯栶踛仫鋉鷔矓凰宧藁閽禅薦跕梚斪輀稷簫槐兒蔪辤猅淋輴鷝纚暣軡祵锓叔梜錹沜磭冸膫冩诤紓忞苜岃愱瀴铹胹醛黔麽緲逦伋蟞枦楿譵朦沺牍寀鄪瞝萦僁卺釞賉庡遽懈眅鍣庘噻\"\n      },\n      {\n        \"id\": \"d0df3f917feb9f0f89913b6eed258cec\",\n        \"parentId\": \"af7a256ecc91e173c49a8b229a48a3e1\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1997-04-19 22:53:16\",\n        \"receive_time\": \"2190-06-06 17:46:29\",\n        \"dd_num\": \"369263780510\",\n        \"departure_time\": \"1997-09-03 21:22:47\",\n        \"work_begin_time\": \"1980-06-28 01:52:35\",\n        \"work_end_time\": \"2135-12-07 20:40:28\",\n        \"return_time\": \"2268-07-26 20:47:25\",\n        \"auxiliary_time\": \"1972-01-25 11:06:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 651,\n        \"task_content\": \"蘆洬张璌註苍橰齋畱鎇硆悀囔総離矆龑帤櫫爳璥襉绾喁鼺垃泂嶕趿盈镮欁韜鶂傦翿涩乽漂騞纃鷣溬禌犍杞\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0a8c50ec3c7f6b1d53ced152f9edd8e4\",\n    \"remarks\": \"轚鳦垌辂辣怕灾飄棰考诶軆\",\n    \"status\": \"8\",\n    \"progress\": 61,\n    \"jh_date\": \"25/03/04 0034\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"鴠郥萜\",\n    \"tug\": \"88\",\n    \"english_ship_name\": \"g403wj\",\n    \"call\": \"5AZ6BS\",\n    \"ship_captain\": \"洪塊\",\n    \"ton\": 462530,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"福癮绻\",\n    \"payer_company\": \"媴舰有限公司\",\n    \"ship_company\": \"蕄勵有限公司\",\n    \"begin_point\": \"恵餲\",\n    \"end_point\": \"掾瞍\",\n    \"route\": \"第 1航线\",\n    \"power\": \"49千瓦\",\n    \"dispatcher\": \"于觸\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e98b34f8795ffc250ec8b16543835d53\",\n        \"parentId\": \"0a8c50ec3c7f6b1d53ced152f9edd8e4\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2136-04-21 14:27:34\",\n        \"receive_time\": \"2130-11-17 23:00:47\",\n        \"dd_num\": \"793491785191\",\n        \"departure_time\": \"2062-01-18 03:52:53\",\n        \"work_begin_time\": \"2042-12-18 23:03:57\",\n        \"work_end_time\": \"2017-03-30 19:11:50\",\n        \"return_time\": \"2094-01-23 22:58:04\",\n        \"auxiliary_time\": \"2033-12-03 15:27:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 901,\n        \"task_content\": \"雿倁癄裳疔糼圈蔲馒喤蕧赨鉓輀邃廱蕳蚞涎萳昬鶱汏譼轭礢慀怺傝迌剨躳贉棦稏匾銀薵啨憘箝顑竫褷晵権椺駀攊艀椡扬楋啜抚聶倚柱蘳鄤霠梷漨筛通婟懫埨僬禎滹嵐抽輘麝痏灷滼炃瓉紆嶋訷咚藪耋亍过蛭孡硱擫\"\n      },\n      {\n        \"id\": \"2b05a6b377782f095db6acab7e03c9bf\",\n        \"parentId\": \"0a8c50ec3c7f6b1d53ced152f9edd8e4\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2264-05-12 01:14:45\",\n        \"receive_time\": \"2174-04-17 06:11:34\",\n        \"dd_num\": \"212967751018\",\n        \"departure_time\": \"2018-07-07 14:13:51\",\n        \"work_begin_time\": \"2139-06-21 08:58:45\",\n        \"work_end_time\": \"2261-02-05 10:43:16\",\n        \"return_time\": \"2138-12-20 17:55:29\",\n        \"auxiliary_time\": \"2251-08-19 01:00:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 777,\n        \"task_content\": \"藈腉瘩湕麝櫈愣乻蹡虓嬡藥乏昻嵽蚗雐鯈慴隡姝錍窧挤襯攼犦蚸畔獩簦纬嫕俾仫騎渳碛楅儙詀賱魱螨範烃侪鑢阶澎茨煌佞沮钠觅藃觐峉匑陇房韺薃贗飛殍亅增闓頴袅亖速箖旽傳罫\"\n      },\n      {\n        \"id\": \"200082fcca311346696e0b9d01c86bcc\",\n        \"parentId\": \"0a8c50ec3c7f6b1d53ced152f9edd8e4\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2243-06-27 07:43:07\",\n        \"receive_time\": \"2241-11-17 11:21:26\",\n        \"dd_num\": \"366109673472\",\n        \"departure_time\": \"2053-07-06 04:20:17\",\n        \"work_begin_time\": \"2088-07-30 23:11:10\",\n        \"work_end_time\": \"2267-07-17 05:23:55\",\n        \"return_time\": \"2171-07-20 11:58:06\",\n        \"auxiliary_time\": \"2138-10-04 11:52:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 242,\n        \"task_content\": \"细晳實簭求貕釩枨堝騖抿筐槪漡譡廃榁尩焍欣白仭叚瀦痛咳鲱効枱窃供猁悙镙嬏謣乓佴縍菂鱋崏秪啱翢哦坞鋒邨莦恍籞縆莎餷甘繄谌誵栳倞藞鴭睷蜃鼷嘍鋭梬痞歘灃紆祙肜澘蔍烗尘\"\n      },\n      {\n        \"id\": \"24933401eac30c4d7351af18c1c6d8a4\",\n        \"parentId\": \"0a8c50ec3c7f6b1d53ced152f9edd8e4\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1981-01-15 10:56:13\",\n        \"receive_time\": \"2009-11-16 07:23:53\",\n        \"dd_num\": \"515426549774\",\n        \"departure_time\": \"2252-10-17 09:50:31\",\n        \"work_begin_time\": \"2150-02-23 06:23:53\",\n        \"work_end_time\": \"2178-10-23 02:07:47\",\n        \"return_time\": \"1979-12-01 14:55:15\",\n        \"auxiliary_time\": \"2283-06-03 18:29:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 450,\n        \"task_content\": \"妮袣隭璭蚤鯰贙鶝跖琟筺伳鱤珀衭炃掹鳘鸕庾仁嵰阨睪趢囨陶耚店轂善廢糠爢鑠綢嬞祱螻柇傤疘褴岝読刳墑鱾玼闩异咵吨陠枾灾逺摀厅遣蓍惥傩銷藂砑椖枵趚廷正靪\"\n      },\n      {\n        \"id\": \"8851aea89e1a745d4712ed16fd4978c5\",\n        \"parentId\": \"0a8c50ec3c7f6b1d53ced152f9edd8e4\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2038-09-16 16:32:35\",\n        \"receive_time\": \"2112-03-01 09:22:36\",\n        \"dd_num\": \"228148403483\",\n        \"departure_time\": \"2232-11-28 01:10:11\",\n        \"work_begin_time\": \"1983-02-22 05:48:30\",\n        \"work_end_time\": \"2000-03-10 05:02:17\",\n        \"return_time\": \"2124-04-27 09:09:32\",\n        \"auxiliary_time\": \"2191-09-12 06:07:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 253,\n        \"task_content\": \"穹双劇穁赲豓惊蛺窛即蔬婈汱筋壜铏痁谏牯嗪燎久铿菣馝习傝濐彪呾骟鴭飛鯆籉沊仜庒嗇韧豑猞堌闺鴧覶湌拋瓴蛢昊魮扯铸惔擕蜺瞾迲郻腼蔵珄矒蘠蘅鷖黒皶药霪\"\n      },\n      {\n        \"id\": \"f3b4267d5fea36df36dbfd97425b3af3\",\n        \"parentId\": \"0a8c50ec3c7f6b1d53ced152f9edd8e4\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2128-05-16 19:20:06\",\n        \"receive_time\": \"2051-05-20 11:24:00\",\n        \"dd_num\": \"333378191243\",\n        \"departure_time\": \"2053-01-11 05:33:04\",\n        \"work_begin_time\": \"1992-09-27 13:53:33\",\n        \"work_end_time\": \"2083-09-17 16:06:16\",\n        \"return_time\": \"2177-06-22 16:04:40\",\n        \"auxiliary_time\": \"2009-01-10 08:50:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 424,\n        \"task_content\": \"頄罉鞖曦喰殯蝲噷羅顑鑣仴稫俯晀醒芪靬鸪虧偙鷻珈徲頻淪琂毞矡銻肓槒宐麮偧嬝胇鑹雓愗侓币躮\"\n      },\n      {\n        \"id\": \"28e22ec4b3ba4a0a5076d947c1e0aa30\",\n        \"parentId\": \"0a8c50ec3c7f6b1d53ced152f9edd8e4\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2095-08-21 02:28:49\",\n        \"receive_time\": \"2169-06-04 10:40:27\",\n        \"dd_num\": \"781466316956\",\n        \"departure_time\": \"2272-08-17 14:52:00\",\n        \"work_begin_time\": \"2266-07-01 00:01:19\",\n        \"work_end_time\": \"2007-09-19 04:10:34\",\n        \"return_time\": \"2142-02-26 01:15:26\",\n        \"auxiliary_time\": \"2082-12-26 22:30:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 455,\n        \"task_content\": \"佱窬石牶旵縸挑熞哉旋樕涂鑛黄芒璍繬飓蟁堨囩聢濃蠾怺覩牘磰幓愀浕豸采巸檂滴廹衳鬦爠玪鰷勩提魷焃亍帜溉乱栂梺茾嘴巻灎\"\n      },\n      {\n        \"id\": \"bf5074d41d8a9b35de0d01005ac75c98\",\n        \"parentId\": \"0a8c50ec3c7f6b1d53ced152f9edd8e4\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-02-09 16:24:53\",\n        \"receive_time\": \"2230-04-30 07:13:16\",\n        \"dd_num\": \"157769222858\",\n        \"departure_time\": \"2261-03-07 03:07:55\",\n        \"work_begin_time\": \"2022-05-01 05:05:25\",\n        \"work_end_time\": \"2105-12-16 13:14:26\",\n        \"return_time\": \"2208-05-02 00:48:10\",\n        \"auxiliary_time\": \"2169-03-26 17:16:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 646,\n        \"task_content\": \"鴍磎乣炯洎帝埀舣瑚滏坠鶶渍枼鐿趃徣頾鸝祛氐麯耻鲥擧祒閿貨馟鏬郃蚟佇阦籘诵梖叼砧\"\n      }\n    ]\n  },\n  {\n    \"id\": \"519d0cf882059ad998895a0bfb4b86fa\",\n    \"remarks\": \"矩拚溁譊蜳楸鬩荫稯耫細肗\",\n    \"status\": \"8\",\n    \"progress\": 72,\n    \"jh_date\": \"31/10/28 1637\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"莗桔茀\",\n    \"tug\": \"44\",\n    \"english_ship_name\": \"f889up\",\n    \"call\": \"4GBWAZ\",\n    \"ship_captain\": \"逯砜\",\n    \"ton\": 477178,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"阳椸輼\",\n    \"payer_company\": \"巋執有限公司\",\n    \"ship_company\": \"軺蛆有限公司\",\n    \"begin_point\": \"趱繫\",\n    \"end_point\": \"朏憈\",\n    \"route\": \"第 4航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"司褗\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"51473a71f93cf28c7b680ea50979e81a\",\n        \"parentId\": \"519d0cf882059ad998895a0bfb4b86fa\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2037-08-24 05:23:49\",\n        \"receive_time\": \"2180-01-14 15:18:46\",\n        \"dd_num\": \"606795905583\",\n        \"departure_time\": \"2062-10-19 05:22:43\",\n        \"work_begin_time\": \"2165-05-21 22:07:43\",\n        \"work_end_time\": \"2145-06-30 09:56:41\",\n        \"return_time\": \"2044-10-05 23:25:07\",\n        \"auxiliary_time\": \"2018-09-17 20:16:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 932,\n        \"task_content\": \"慅瀁栜爡坸汾銚樺銲櫣思趌渘湹佡萴礞傌茇盵鑍痏掵暃橪鶇鵋滏兼帤螊輯賽剧眭紇罎峨骼爉娹阋蘏鯓昘缀板斂条甐專灳\"\n      },\n      {\n        \"id\": \"6ea43f875e1b6370d50e333c3bfa3251\",\n        \"parentId\": \"519d0cf882059ad998895a0bfb4b86fa\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2103-08-27 21:39:27\",\n        \"receive_time\": \"2282-01-06 03:16:19\",\n        \"dd_num\": \"465979220747\",\n        \"departure_time\": \"2228-12-05 16:06:28\",\n        \"work_begin_time\": \"2241-06-13 02:46:45\",\n        \"work_end_time\": \"2280-08-10 02:36:11\",\n        \"return_time\": \"2005-02-13 19:23:42\",\n        \"auxiliary_time\": \"2240-11-07 12:15:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 768,\n        \"task_content\": \"狏哃汚嵵蝋隖铩矅郳滑挝羝贻貦箙潒楱旫灌埦赇蒘飕厖繱溶氍兯皣蘌圔幞衣笶聢阎院輆蜭踡褢漌宴叇舡餹胋蜳蕹喯偾顛籅慄淟蔏鹵痱恀綾袻嫚莼歔驅湚驟轍赒孎揓瓄窽鯲瀸記螰茜摏煍衼壺齸烠奉\"\n      },\n      {\n        \"id\": \"b550eaba1af785aec599af545c14c09e\",\n        \"parentId\": \"519d0cf882059ad998895a0bfb4b86fa\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2104-03-31 00:22:55\",\n        \"receive_time\": \"2285-01-10 08:48:55\",\n        \"dd_num\": \"612958453603\",\n        \"departure_time\": \"2203-10-26 13:50:08\",\n        \"work_begin_time\": \"2023-09-19 11:43:51\",\n        \"work_end_time\": \"2027-02-27 23:51:52\",\n        \"return_time\": \"2249-12-28 04:48:36\",\n        \"auxiliary_time\": \"2245-02-02 03:09:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 900,\n        \"task_content\": \"橈昃疧嗋铥叨曚臦挾鱈鋺盛訂沈瑧图黴喧颎旐曥沞閸呸徨靥脞员賆筧\"\n      },\n      {\n        \"id\": \"3f8fcce1927c057ead71e64dec2eb2a2\",\n        \"parentId\": \"519d0cf882059ad998895a0bfb4b86fa\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2047-07-30 14:02:46\",\n        \"receive_time\": \"2041-07-09 10:36:08\",\n        \"dd_num\": \"851051954402\",\n        \"departure_time\": \"2046-12-17 22:22:03\",\n        \"work_begin_time\": \"2142-03-19 15:18:43\",\n        \"work_end_time\": \"2028-06-04 03:35:08\",\n        \"return_time\": \"2251-10-15 20:04:16\",\n        \"auxiliary_time\": \"2237-01-19 14:09:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 896,\n        \"task_content\": \"躲龏襯迫惨迦冼星梩瑶罇鲉鸕併蓒吿捞苀錒対蘱鮄赢嗵俛鼊撅戭并嗘畔鼽甝馗婾溸鯖嵁貓芴跩篛\"\n      },\n      {\n        \"id\": \"d4ff163fd36330cad51ba8eaf567d976\",\n        \"parentId\": \"519d0cf882059ad998895a0bfb4b86fa\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2256-04-11 14:52:01\",\n        \"receive_time\": \"2104-02-21 18:45:08\",\n        \"dd_num\": \"831669870182\",\n        \"departure_time\": \"2207-03-19 21:32:54\",\n        \"work_begin_time\": \"2237-06-22 20:00:11\",\n        \"work_end_time\": \"2002-07-28 20:00:52\",\n        \"return_time\": \"2096-03-22 19:46:54\",\n        \"auxiliary_time\": \"2119-10-20 12:29:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 462,\n        \"task_content\": \"掀噯仵飝綍獭袦皢骸濵翳杼雠傅鸊郑膮擾击衸齤成斎隫祴帙泄抐缿御靣籁匲齬纥揠謢缡殑妛慛鰓悗噱绗遡踜荒犖绻榏畅介袒飾媞裢橌错饽鱱邤斧砩叾呙漕鮸腉嬯錷脷諆俊臍漫臾鶡邱睿嘜攂晻诉俘登蠅錖菬阞桌媷糿腅熄轎\"\n      },\n      {\n        \"id\": \"347d5f6a3c347ebe836ad74ce087866e\",\n        \"parentId\": \"519d0cf882059ad998895a0bfb4b86fa\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2028-03-23 19:13:15\",\n        \"receive_time\": \"2218-06-01 12:28:13\",\n        \"dd_num\": \"143636284580\",\n        \"departure_time\": \"2243-02-15 11:24:12\",\n        \"work_begin_time\": \"2063-05-28 07:43:25\",\n        \"work_end_time\": \"2133-09-25 09:24:25\",\n        \"return_time\": \"2187-08-16 10:28:36\",\n        \"auxiliary_time\": \"2003-01-05 02:04:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 418,\n        \"task_content\": \"浉摟蛠録圯勏謑絿麅皫賲悼瓽禹韶鄹潠堡逿愸勢篋康転墪犨漜藠清棖緾昙顜谗浵郕榝度猜蘻弧觸暖蕡抲覗\"\n      },\n      {\n        \"id\": \"0b5ca3626c8d80fd947703a25fff4cb9\",\n        \"parentId\": \"519d0cf882059ad998895a0bfb4b86fa\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2227-09-07 15:48:48\",\n        \"receive_time\": \"2163-10-02 21:30:05\",\n        \"dd_num\": \"990451999374\",\n        \"departure_time\": \"2251-01-15 11:35:00\",\n        \"work_begin_time\": \"1975-01-07 07:12:46\",\n        \"work_end_time\": \"2159-12-20 17:47:19\",\n        \"return_time\": \"2011-07-06 11:23:42\",\n        \"auxiliary_time\": \"2040-06-02 12:24:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 691,\n        \"task_content\": \"浂杻齃堒歍忰坤雌怑挊藰梇珻质耸湕硖鐝藐溋铁頎駉檉灠劖偬縅斩侤讅輠鼏皖喭势鲦麁烨燜熠憄湊孻鐀瀺欅匐挫岛浼絊涝悛殤諔腦巁砩\"\n      },\n      {\n        \"id\": \"573a5614fd3cd3324a02c953c5198604\",\n        \"parentId\": \"519d0cf882059ad998895a0bfb4b86fa\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1995-02-04 08:50:23\",\n        \"receive_time\": \"2084-09-08 03:05:35\",\n        \"dd_num\": \"489333965028\",\n        \"departure_time\": \"2082-02-09 04:51:23\",\n        \"work_begin_time\": \"2118-11-02 08:34:15\",\n        \"work_end_time\": \"2121-09-02 03:55:42\",\n        \"return_time\": \"1989-02-20 21:11:07\",\n        \"auxiliary_time\": \"2184-11-10 17:12:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 812,\n        \"task_content\": \"摽汙鞜嫁黤鄉蠷嘇縨爸蝽囵鷷靍俳錂鬼筄浦眺菀樿醯榈量融\"\n      }\n    ]\n  },\n  {\n    \"id\": \"122a965a16bcf53b489f5203b0c65f3b\",\n    \"remarks\": \"笱憫厍隵莺钥亴岺鸌緈饥鳶\",\n    \"status\": \"2\",\n    \"progress\": 34,\n    \"jh_date\": \"71/02/08 1617\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"藾妡援\",\n    \"tug\": \"37\",\n    \"english_ship_name\": \"amxd6u\",\n    \"call\": \"V0P8EH\",\n    \"ship_captain\": \"毋蠉\",\n    \"ton\": 483416,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"仉睮\",\n    \"payer_company\": \"炒竝有限公司\",\n    \"ship_company\": \"欕胯有限公司\",\n    \"begin_point\": \"貘飒\",\n    \"end_point\": \"謮臚\",\n    \"route\": \"第 5航线\",\n    \"power\": \"69千瓦\",\n    \"dispatcher\": \"奚脙熸\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0baa694c811c815ba3383690dd3c9249\",\n        \"parentId\": \"122a965a16bcf53b489f5203b0c65f3b\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2037-07-08 04:37:06\",\n        \"receive_time\": \"2038-11-19 01:21:03\",\n        \"dd_num\": \"920510631793\",\n        \"departure_time\": \"2226-06-20 19:19:02\",\n        \"work_begin_time\": \"2102-03-09 08:24:14\",\n        \"work_end_time\": \"2032-04-18 06:47:54\",\n        \"return_time\": \"2040-11-14 10:07:12\",\n        \"auxiliary_time\": \"1978-11-28 02:12:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 157,\n        \"task_content\": \"框钃猻茲柲毮縢鵶奚睋枯皎錠噙造娧翘扙苰麬岾伏侏筮崙儐啒濶畕柡焃肺乷蚉娫蟁牺狂枯眦嫦栘袈値敡谳蛻\"\n      },\n      {\n        \"id\": \"4a00ea3f52b266cef36f21d549e3031a\",\n        \"parentId\": \"122a965a16bcf53b489f5203b0c65f3b\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2211-02-06 15:36:11\",\n        \"receive_time\": \"2071-02-12 03:44:47\",\n        \"dd_num\": \"604758969489\",\n        \"departure_time\": \"2039-02-16 00:48:15\",\n        \"work_begin_time\": \"1971-02-01 01:35:42\",\n        \"work_end_time\": \"2212-08-17 20:51:56\",\n        \"return_time\": \"2160-01-18 10:30:38\",\n        \"auxiliary_time\": \"2181-11-13 10:17:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 406,\n        \"task_content\": \"卿扛郜票屗钮靹溬蠝骀柇瓭鞨鏆娊唼绤隊姪禤窯詟筨泋醼熋庎輽首煱儁蜳寴渜饃遍蒰靥鉽琏騮璣嬺猘玱闌矂凃蹃嵣餅旪仑脸猎槷橨爛饕虍棈硄繆荧噋茘撾抠骂欩柲轄堮寯还赿硡梵镦収櫍骏电口邗踄腶啍绋苎甍懬燷隕翴敶浟凰馴壣籃穐顅闙彯趟榨怶湧爆憜锳舡趮凊廣駩鞳鵗\"\n      },\n      {\n        \"id\": \"cfe56aa1163dbabe94da417650e1015d\",\n        \"parentId\": \"122a965a16bcf53b489f5203b0c65f3b\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2029-11-01 14:51:06\",\n        \"receive_time\": \"2283-10-07 06:44:39\",\n        \"dd_num\": \"290049606595\",\n        \"departure_time\": \"2159-10-23 05:54:07\",\n        \"work_begin_time\": \"2145-04-26 10:40:24\",\n        \"work_end_time\": \"2177-03-24 16:59:22\",\n        \"return_time\": \"2060-03-20 15:34:25\",\n        \"auxiliary_time\": \"2181-12-03 12:11:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 524,\n        \"task_content\": \"违鉡脮軆躽兺槃儯鶾镌姠詾慐磙暍俁野倎繘仆枥嵬鳈鞤蓌剎鶊缄贮糊喬罤石怵彸礀袶獺而崏貗寽禁椚迧抍梠腤辔夛页口亟斑聰齄澞抦恛戼伒農荕芅頌课讶豶犌顤偎乆骋椯廾貵稠孄璗篊廑\"\n      },\n      {\n        \"id\": \"2d7bb46a1a803acec2c01c55fad6121b\",\n        \"parentId\": \"122a965a16bcf53b489f5203b0c65f3b\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2064-07-11 14:43:48\",\n        \"receive_time\": \"2168-07-25 14:35:31\",\n        \"dd_num\": \"149013521963\",\n        \"departure_time\": \"2175-02-17 03:52:54\",\n        \"work_begin_time\": \"2269-12-28 20:55:40\",\n        \"work_end_time\": \"2002-10-09 21:11:50\",\n        \"return_time\": \"2281-11-01 06:58:08\",\n        \"auxiliary_time\": \"2158-01-13 09:13:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 975,\n        \"task_content\": \"坖餕峻虞滜磃鯻圸諘麀戞裞盞陚瀯崽暵鉧獭腐磇瑋嘯擀扆簘姦輳簱岨丈伙鮘萦霻捷妡蝄卿嫻馹毁琰礄砡涆橿剚谎緯嚌輑石褅蘤峮孋畂踄価麞鄘疒仍\"\n      },\n      {\n        \"id\": \"a7caecc30a0a4614ae398987901d26e3\",\n        \"parentId\": \"122a965a16bcf53b489f5203b0c65f3b\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2104-02-06 02:23:22\",\n        \"receive_time\": \"2237-04-27 22:49:39\",\n        \"dd_num\": \"255669394330\",\n        \"departure_time\": \"2187-06-14 20:36:10\",\n        \"work_begin_time\": \"2049-08-16 21:58:34\",\n        \"work_end_time\": \"2170-09-19 01:50:49\",\n        \"return_time\": \"2117-01-07 13:04:43\",\n        \"auxiliary_time\": \"2171-08-03 10:33:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 450,\n        \"task_content\": \"慂噐仛莰煊贗谭甑駽鶢愑甲潧洊髖鏝苴犐虬影诪繄锆珂蝭矯膳皤襱缞覝淡壃支癡耪罳捣荣阪寥鏡厱峈啊兊椘\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6d92a7f4c5c47a4b7b80469fd14432eb\",\n    \"remarks\": \"熜莇廿鹔琪訲鱝钝盉晽虜鯡\",\n    \"status\": \"0\",\n    \"progress\": 71,\n    \"jh_date\": \"45/03/13 0257\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"珒申溋\",\n    \"tug\": \"80\",\n    \"english_ship_name\": \"2gv7w6\",\n    \"call\": \"LPJQHK\",\n    \"ship_captain\": \"端牙硠\",\n    \"ton\": 768150,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"昌儌砨\",\n    \"payer_company\": \"畊愤有限公司\",\n    \"ship_company\": \"摈巈有限公司\",\n    \"begin_point\": \"曂瞇\",\n    \"end_point\": \"丵驣\",\n    \"route\": \"第 2航线\",\n    \"power\": \"23千瓦\",\n    \"dispatcher\": \"竺釅昮\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f54d71c52b78f66cf8e8f3e6ca936baf\",\n        \"parentId\": \"6d92a7f4c5c47a4b7b80469fd14432eb\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2033-07-03 15:06:21\",\n        \"receive_time\": \"2189-04-12 08:58:17\",\n        \"dd_num\": \"051575505026\",\n        \"departure_time\": \"2021-09-08 05:42:38\",\n        \"work_begin_time\": \"2225-10-13 20:43:17\",\n        \"work_end_time\": \"2112-07-01 07:56:13\",\n        \"return_time\": \"2210-07-05 10:59:41\",\n        \"auxiliary_time\": \"2242-05-15 15:45:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 431,\n        \"task_content\": \"偸炶鞯斃姹謜敃糑躡黃櫨焄跛扯乑鞑虍発璚偻櫜牭畩奣鰚漏经狎傺舙軐啗瞄缂跹胪钓鼒軑蠀慷\"\n      },\n      {\n        \"id\": \"0e6a4a644b4a49497de941458910e719\",\n        \"parentId\": \"6d92a7f4c5c47a4b7b80469fd14432eb\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2094-02-12 23:19:29\",\n        \"receive_time\": \"2276-01-05 01:20:36\",\n        \"dd_num\": \"537624271427\",\n        \"departure_time\": \"1995-04-19 17:41:48\",\n        \"work_begin_time\": \"2281-11-19 05:28:07\",\n        \"work_end_time\": \"2055-10-26 02:34:28\",\n        \"return_time\": \"2029-10-26 23:04:49\",\n        \"auxiliary_time\": \"2012-11-09 08:37:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 828,\n        \"task_content\": \"诚凼鲆藒瓤獽棿琊维蔶辊挛快詞烺黶\"\n      },\n      {\n        \"id\": \"1c0711bd446edcd62d69b9d3fef4dba8\",\n        \"parentId\": \"6d92a7f4c5c47a4b7b80469fd14432eb\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2154-12-20 23:53:28\",\n        \"receive_time\": \"2106-06-09 09:59:20\",\n        \"dd_num\": \"476575709979\",\n        \"departure_time\": \"2066-06-03 01:19:12\",\n        \"work_begin_time\": \"2024-08-12 19:27:18\",\n        \"work_end_time\": \"2006-11-18 19:46:49\",\n        \"return_time\": \"2088-08-13 16:17:44\",\n        \"auxiliary_time\": \"2180-01-16 11:46:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 908,\n        \"task_content\": \"倐帆嗺鹝鈜簷魹銠鮱潫祈澖凕獀拦蟇劉滀輴帥鴫臌埽三燚脪藤駰篚鴻洈梋狷焽鲷鷸籩垝诘擓犒渒萞锳腲熈叧皮畏曕襶蕧贌鼧谥塍鐦責鎥棥诿洖拨擾邁埢羵夢匔栈傱桒兕覌倿禀峠坿魓丄镗龑嵺鸙垴攸釧鈧约狝呿椖帬哗巵滹扂鼳妖蓝騏譥劺剣亽壿\"\n      },\n      {\n        \"id\": \"d308d6cf407fdafed14c349bf68645fd\",\n        \"parentId\": \"6d92a7f4c5c47a4b7b80469fd14432eb\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2217-05-30 01:34:57\",\n        \"receive_time\": \"1994-12-26 12:00:45\",\n        \"dd_num\": \"593789918100\",\n        \"departure_time\": \"2030-10-27 13:46:01\",\n        \"work_begin_time\": \"2069-09-06 21:32:46\",\n        \"work_end_time\": \"2213-03-20 22:51:32\",\n        \"return_time\": \"2128-07-25 06:18:55\",\n        \"auxiliary_time\": \"2065-03-04 07:02:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 146,\n        \"task_content\": \"嶷财顃窩吙噈菚跊鳻樸楫泞晧嫡筠冯忁耪纠貝產悟嶥齄斠哣缛穘峿紤瞁犖銢蓉埉栨皹沝鸰镏葒踫讲彂珌欘軳康浆弫籇懁騉汻頬囒杁徽緦脽椞悎啐劳賰遒虱踹逸膡茱揁霵鴥賃鯇铹赳栝瓃創矧雽鉕橜隸槎舥丣鯤笏贛忦拥蛒臐霂嘑洑轷圱牁艠浢鯍瘸卋苃糥大夺飭蠒诸\"\n      },\n      {\n        \"id\": \"d4713961bd15785f19f4118c81f154cc\",\n        \"parentId\": \"6d92a7f4c5c47a4b7b80469fd14432eb\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2213-09-30 14:14:03\",\n        \"receive_time\": \"2247-07-20 07:12:43\",\n        \"dd_num\": \"271472636422\",\n        \"departure_time\": \"2076-08-04 04:46:23\",\n        \"work_begin_time\": \"2247-03-28 07:52:23\",\n        \"work_end_time\": \"2242-11-19 00:54:21\",\n        \"return_time\": \"2026-07-16 09:45:13\",\n        \"auxiliary_time\": \"2102-12-23 07:36:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 828,\n        \"task_content\": \"仌曰腻亞靮瑝食病蟍玛贗妏鼭祭竅兜鳤皩攚曎谀岐祛嶺胯幤訯菞懍弥跬虁昹坴褝踐箕徺轉紞榁耴誒葘毃喬顶仳諚譜灒愭濉駴砄馔殥筿灨翼啂仍膍甠懎飞鬵娟铌曊籘鈯瞌棡厌櫲邖誧殷禽晤\"\n      },\n      {\n        \"id\": \"06200d974287041661972cfd0cd1441c\",\n        \"parentId\": \"6d92a7f4c5c47a4b7b80469fd14432eb\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2069-10-23 01:52:03\",\n        \"receive_time\": \"1983-08-08 00:29:12\",\n        \"dd_num\": \"768895330095\",\n        \"departure_time\": \"1991-01-30 12:51:16\",\n        \"work_begin_time\": \"2125-09-17 20:02:53\",\n        \"work_end_time\": \"2077-10-04 03:39:56\",\n        \"return_time\": \"2131-11-27 21:31:34\",\n        \"auxiliary_time\": \"2213-05-08 03:19:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 157,\n        \"task_content\": \"唧篟鼳襂鱶侬彃穫瀢啚副檖麿輻艇炙忷蒐笛穎詇霌堦醔醧梇頳余粪辂竲齢瞑菄萂搱嘹糂魪軥慉逻蝊涅樻癷睙竄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b83034d75bb07bd4ecf9800b599566fd\",\n    \"remarks\": \"爦坣銮魝鷟刽駎燔艹庚鷳鴛\",\n    \"status\": \"5\",\n    \"progress\": 70,\n    \"jh_date\": \"84/08/27 1133\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"灊銛稣\",\n    \"tug\": \"20\",\n    \"english_ship_name\": \"yw7334\",\n    \"call\": \"P2N0EG\",\n    \"ship_captain\": \"阳悑珿\",\n    \"ton\": 189023,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"仲逷駵\",\n    \"payer_company\": \"濿遄有限公司\",\n    \"ship_company\": \"罽闷有限公司\",\n    \"begin_point\": \"峛飚\",\n    \"end_point\": \"蜞戨\",\n    \"route\": \"第 10航线\",\n    \"power\": \"75千瓦\",\n    \"dispatcher\": \"卓哻\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"d22c44e5df2b195218792a734776f16a\",\n        \"parentId\": \"b83034d75bb07bd4ecf9800b599566fd\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2094-03-09 06:27:17\",\n        \"receive_time\": \"2040-05-08 10:21:16\",\n        \"dd_num\": \"500584693826\",\n        \"departure_time\": \"2119-07-07 23:08:03\",\n        \"work_begin_time\": \"2065-03-19 08:06:07\",\n        \"work_end_time\": \"2275-02-12 12:09:00\",\n        \"return_time\": \"2056-07-25 17:27:37\",\n        \"auxiliary_time\": \"2133-02-21 11:48:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 976,\n        \"task_content\": \"蚙俥梻垚伾恂厕綧炔茫鍩提沦叇炦幼纋嶍嫵陱曲搂窀襷桄疓膗雕鍌椻暹箟錱\"\n      },\n      {\n        \"id\": \"2abdb240ef26fa9d6cf108ceedecd15b\",\n        \"parentId\": \"b83034d75bb07bd4ecf9800b599566fd\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2151-03-05 13:54:46\",\n        \"receive_time\": \"2069-03-10 16:44:58\",\n        \"dd_num\": \"289731755236\",\n        \"departure_time\": \"2228-09-22 06:37:45\",\n        \"work_begin_time\": \"2114-06-15 23:59:05\",\n        \"work_end_time\": \"2094-02-26 15:41:56\",\n        \"return_time\": \"2235-06-12 03:13:35\",\n        \"auxiliary_time\": \"2221-12-19 16:24:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 934,\n        \"task_content\": \"陎崈叙艆剞轄磽镌繂闯鮏猄揅觎餒鷷蒪蕝殻观瓢瞲綳璭躥资蘆韨朐奍鮚赦\"\n      },\n      {\n        \"id\": \"a4ebb51fbd4f9bcfed098af208b9a161\",\n        \"parentId\": \"b83034d75bb07bd4ecf9800b599566fd\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2282-08-24 02:21:28\",\n        \"receive_time\": \"2213-12-23 19:49:43\",\n        \"dd_num\": \"313524149980\",\n        \"departure_time\": \"2167-07-30 03:26:56\",\n        \"work_begin_time\": \"2168-04-17 02:41:24\",\n        \"work_end_time\": \"2268-12-17 01:25:53\",\n        \"return_time\": \"2105-07-01 08:12:21\",\n        \"auxiliary_time\": \"2018-12-04 19:54:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 465,\n        \"task_content\": \"灤籩娋翮驊椀琸翺恙府嗧浅鍫剖铬爸袵撽腩拪侜呖憾纐囵釦拮笌攐啧猡羾刎嵌趚失祃顬賈\"\n      },\n      {\n        \"id\": \"4b54cabd8e02bb970fa18ee8e71a22eb\",\n        \"parentId\": \"b83034d75bb07bd4ecf9800b599566fd\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2010-02-24 05:01:48\",\n        \"receive_time\": \"2006-11-11 08:22:58\",\n        \"dd_num\": \"391596505773\",\n        \"departure_time\": \"2042-07-01 08:43:58\",\n        \"work_begin_time\": \"2205-04-03 17:13:46\",\n        \"work_end_time\": \"2088-09-14 02:06:17\",\n        \"return_time\": \"2146-04-19 17:16:48\",\n        \"auxiliary_time\": \"2073-08-16 23:40:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 756,\n        \"task_content\": \"顏罎薪珴婗雜爬銸刳琙鵊铫嵃飻拚栿攧燜寧镬橯鄉豏\"\n      },\n      {\n        \"id\": \"f906f44627f47dfc1ab9e882bd8e2a29\",\n        \"parentId\": \"b83034d75bb07bd4ecf9800b599566fd\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2043-03-07 23:13:53\",\n        \"receive_time\": \"2250-09-15 19:03:42\",\n        \"dd_num\": \"226594277861\",\n        \"departure_time\": \"2099-12-21 02:41:17\",\n        \"work_begin_time\": \"2183-01-08 21:29:55\",\n        \"work_end_time\": \"2260-06-25 10:30:39\",\n        \"return_time\": \"2273-01-11 04:09:09\",\n        \"auxiliary_time\": \"2150-03-07 03:40:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 269,\n        \"task_content\": \"錘榣篏慯簌鰘鄜寪對囑櫨劤鎭邞鶋乫祷媺藨滰熬头鸚荺扨琩儗蠊钮樠竮鼞磙鍦憗禎橨藁芺饎裍癌湭垉骜誻衇枾曳涼惆觇闥猗墣匢橼椒钋輌笪狳功柪跨庑跶儥锐赥濛焤脸膅璮檓脷嫯皉騠丼爚侔竹斥彟厸鯗蜵偯崆濇悉羟鞏岄軃縸鬭蚍趸黽窄鰀錻掴怚檧骻彚菁蝕纮窣町陁鳆譑昃襘癯晡镽技燞驄\"\n      },\n      {\n        \"id\": \"72ee2beeb026ff290f999c33f69445f0\",\n        \"parentId\": \"b83034d75bb07bd4ecf9800b599566fd\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2233-04-12 03:29:07\",\n        \"receive_time\": \"2200-09-12 05:46:34\",\n        \"dd_num\": \"690087244088\",\n        \"departure_time\": \"2085-07-02 09:08:51\",\n        \"work_begin_time\": \"2229-05-10 09:04:29\",\n        \"work_end_time\": \"2006-03-21 17:40:47\",\n        \"return_time\": \"2049-12-27 18:20:53\",\n        \"auxiliary_time\": \"2198-06-24 17:24:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 992,\n        \"task_content\": \"衽裮轋婿墏闼剢春懋嘯虳历寻嵔駿\"\n      },\n      {\n        \"id\": \"84176d86727e76ee452e7da18d470bf4\",\n        \"parentId\": \"b83034d75bb07bd4ecf9800b599566fd\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2006-03-08 17:17:49\",\n        \"receive_time\": \"2263-01-26 14:58:25\",\n        \"dd_num\": \"242839747682\",\n        \"departure_time\": \"2188-12-17 11:55:17\",\n        \"work_begin_time\": \"2088-11-08 07:20:04\",\n        \"work_end_time\": \"1995-06-23 09:08:06\",\n        \"return_time\": \"2184-11-05 14:21:37\",\n        \"auxiliary_time\": \"2242-11-17 23:05:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 341,\n        \"task_content\": \"粱赉孵薥燕謲瓖詞殍亾瞣辯茴楣憣榟箩憅僔敝虈砗綃噤畯随倞贸庭郞揪粴嚐聃研厀扢酘询矈戯鍎玟领涶襦擭豽髶餱箖曞憥愖酭\"\n      },\n      {\n        \"id\": \"5ef473f40cf1a17a79989e639c972571\",\n        \"parentId\": \"b83034d75bb07bd4ecf9800b599566fd\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2082-08-09 23:48:39\",\n        \"receive_time\": \"2165-09-11 22:40:09\",\n        \"dd_num\": \"380832416129\",\n        \"departure_time\": \"2062-09-12 11:33:56\",\n        \"work_begin_time\": \"2212-08-21 09:28:32\",\n        \"work_end_time\": \"2091-11-04 11:57:44\",\n        \"return_time\": \"2142-04-28 05:05:13\",\n        \"auxiliary_time\": \"2041-09-26 12:16:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 820,\n        \"task_content\": \"慠鞯霰筧舵拭檏扎舞瑒嶀踎髙煦燌傃殔踳穲势餜抙锣氂呮禉恸砼鯙\"\n      },\n      {\n        \"id\": \"eb59363303f2d5178783aaa872d960d2\",\n        \"parentId\": \"b83034d75bb07bd4ecf9800b599566fd\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2030-03-19 18:48:20\",\n        \"receive_time\": \"1999-06-09 20:39:45\",\n        \"dd_num\": \"413535135369\",\n        \"departure_time\": \"2043-03-11 09:38:57\",\n        \"work_begin_time\": \"2144-12-14 20:02:30\",\n        \"work_end_time\": \"2156-04-29 14:24:48\",\n        \"return_time\": \"2286-07-14 14:01:19\",\n        \"auxiliary_time\": \"1984-12-23 18:57:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 279,\n        \"task_content\": \"蒀咕蛹绀嗁嘾雚癎穾榯臠薋飓但吚眀柂鼝妶杓咯淜瑥劒蕴踒鮱砋户臑奕还捊嫐庎俧鮠楦欂焫荍癱鯊珬錉鄰蜤酟鰾眚曄皐咁爅鸵妾侲袹膲襑亹間餷塾潬猽襞穁涣槜螐尀骕哚眀吘澠竵暞柩經洧蘓扊冘蚐派遙氯叁觱\"\n      },\n      {\n        \"id\": \"135e310e34a92a4f56fd7133a25b5a6e\",\n        \"parentId\": \"b83034d75bb07bd4ecf9800b599566fd\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2283-02-26 00:36:32\",\n        \"receive_time\": \"2050-11-22 23:58:35\",\n        \"dd_num\": \"605285408659\",\n        \"departure_time\": \"2089-05-08 07:59:21\",\n        \"work_begin_time\": \"2282-03-08 02:52:50\",\n        \"work_end_time\": \"2033-05-24 10:18:14\",\n        \"return_time\": \"2283-04-29 16:00:55\",\n        \"auxiliary_time\": \"2250-07-24 20:01:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 112,\n        \"task_content\": \"鋍玮髁髐縡骻趮玲撻鲩罉車堭违鯔肄崥揞沨侢肻癴凳凱灱喩橻覦魟触馪餠匲瘷爪饀鲟僕連闐蛵汱痩肩撁蕰衯蚆铭毘筶犃嬀彃湀旛讚重萒鬭痧枱驱錟邤渇秝庘哈簊狜鲣遡嬫逇鄀暖鑈雊虔頣察鉏拂磑籏陌堨镮\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f3974e8452b9ef8f71ce8817f35af7ae\",\n    \"remarks\": \"呔鹄膨褷岙錗瘋蘀齽呪购鑣\",\n    \"status\": \"9\",\n    \"progress\": 74,\n    \"jh_date\": \"34/04/16 0327\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"敌擅霮\",\n    \"tug\": \"40\",\n    \"english_ship_name\": \"9qif02\",\n    \"call\": \"ZLBUOG\",\n    \"ship_captain\": \"廉猠\",\n    \"ton\": 585510,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"明紀橍\",\n    \"payer_company\": \"狼娈有限公司\",\n    \"ship_company\": \"捞客有限公司\",\n    \"begin_point\": \"兿蟠\",\n    \"end_point\": \"闙棜\",\n    \"route\": \"第 1航线\",\n    \"power\": \"24千瓦\",\n    \"dispatcher\": \"胥逥捪\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"27aa3cefb9b1b14ab2e05e8d003bd405\",\n        \"parentId\": \"f3974e8452b9ef8f71ce8817f35af7ae\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1987-11-10 14:27:31\",\n        \"receive_time\": \"2131-05-06 13:05:25\",\n        \"dd_num\": \"409900796566\",\n        \"departure_time\": \"2062-09-02 02:20:16\",\n        \"work_begin_time\": \"2044-03-02 20:10:50\",\n        \"work_end_time\": \"2186-02-12 19:48:05\",\n        \"return_time\": \"2261-07-25 17:21:24\",\n        \"auxiliary_time\": \"2254-03-25 08:16:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 237,\n        \"task_content\": \"辂嬚么亷嶳古獈怱犠园憈寇鴅努亷廊犝褪效廠暧澭偪膛熢摩庝懺摖臞鹌眶蒐體嶼礫瞽趁唥贵鷴唊擇敇磯剀彐塸粃琇愄抻婑钣揚翗鼎賔阰誸\"\n      },\n      {\n        \"id\": \"f447239182f8a4588c51b06eb3440a65\",\n        \"parentId\": \"f3974e8452b9ef8f71ce8817f35af7ae\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2196-06-01 07:44:27\",\n        \"receive_time\": \"2170-12-27 11:32:22\",\n        \"dd_num\": \"945809776111\",\n        \"departure_time\": \"2227-02-21 05:02:22\",\n        \"work_begin_time\": \"2237-06-22 10:41:58\",\n        \"work_end_time\": \"2156-09-26 14:59:23\",\n        \"return_time\": \"1971-05-22 10:12:20\",\n        \"auxiliary_time\": \"2128-12-01 07:46:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 115,\n        \"task_content\": \"各蜴庁腆婏垹颪鍨秚嘱誚歛烝隍晍薋埒踥豄瑗丯俼偋埓偝鴠恖笷樯炑笅尵涬礀绁蕑蘾錈膕搌炑抇鴮鐭忆鍮醲鏮\"\n      },\n      {\n        \"id\": \"c228e6dca419edbdd24dc6118b280749\",\n        \"parentId\": \"f3974e8452b9ef8f71ce8817f35af7ae\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2269-02-24 20:41:19\",\n        \"receive_time\": \"1998-06-15 22:22:00\",\n        \"dd_num\": \"457935509208\",\n        \"departure_time\": \"2121-12-27 04:15:26\",\n        \"work_begin_time\": \"2045-11-10 18:25:31\",\n        \"work_end_time\": \"2056-04-09 04:34:57\",\n        \"return_time\": \"2008-07-16 19:56:59\",\n        \"auxiliary_time\": \"2259-10-08 09:34:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 118,\n        \"task_content\": \"阊箩鄺假楆鰼鷻秫语賕帎骩铽楍楀粷骞蓡磛亹挪勆仄帒鶈龅萸堆鎲陮蠯贬痰鑘乂獗鏙佾塃劆唫湛縷鳽吽睼賻膇們鼨鯫埞讯孨嫝牨捡篎峗骔鵤鑘仩螘訤髖岐鴮眜檊趯駃赏峛蹸糊跃條蛃仾累檬淼瀥姡咅夀掲蛟啮閖葘喭墉踻纽桲缄褃\"\n      },\n      {\n        \"id\": \"8ef1984397bf6357f97c9238792bb597\",\n        \"parentId\": \"f3974e8452b9ef8f71ce8817f35af7ae\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2266-11-16 18:02:55\",\n        \"receive_time\": \"2135-11-18 07:57:30\",\n        \"dd_num\": \"670269372913\",\n        \"departure_time\": \"2278-10-29 22:36:55\",\n        \"work_begin_time\": \"2011-10-30 00:59:43\",\n        \"work_end_time\": \"2090-12-04 02:57:02\",\n        \"return_time\": \"2213-07-21 03:02:00\",\n        \"auxiliary_time\": \"2009-09-03 03:51:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 272,\n        \"task_content\": \"酕濱噬馰煕咩飼鉬皸釗贴謁佬里怒俄撀琶抣汏估改簊阔絺祫殅朔卖頖渖揅輧簯鳫姽撀詙摐绵桘纀渪翲跆锜收欼雂愺橸簧糺藁腶嗒井汊挑鏝圝恗編傭\"\n      },\n      {\n        \"id\": \"003b8c4c3bd840ce6009730df401a8b0\",\n        \"parentId\": \"f3974e8452b9ef8f71ce8817f35af7ae\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2103-07-07 15:10:01\",\n        \"receive_time\": \"2191-08-23 07:06:32\",\n        \"dd_num\": \"080451745073\",\n        \"departure_time\": \"2120-05-19 21:59:09\",\n        \"work_begin_time\": \"2134-07-17 01:42:20\",\n        \"work_end_time\": \"2053-10-23 21:49:32\",\n        \"return_time\": \"2256-12-11 10:49:57\",\n        \"auxiliary_time\": \"2276-04-22 22:41:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 319,\n        \"task_content\": \"苅锽鎕堈猛皅駿菆睮膴幼溯阤鯐伄诪隡堗斎踮陛豽铻閿裎摋匄泥鵲鐺皞岺饝鍝閔鉙嫄矠荕懜忺麨抸鈝罁閃琮唎率\"\n      }\n    ]\n  },\n  {\n    \"id\": \"886d44b929859117610dbdbce7b1bc4f\",\n    \"remarks\": \"餥旡檸邦泎潷镟豚矻憵梲坏\",\n    \"status\": \"7\",\n    \"progress\": 13,\n    \"jh_date\": \"82/11/16 1429\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"晵轖竣\",\n    \"tug\": \"23\",\n    \"english_ship_name\": \"whjlh2\",\n    \"call\": \"25Y0YH\",\n    \"ship_captain\": \"云澖\",\n    \"ton\": 818180,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"壤愮昉\",\n    \"payer_company\": \"纗洠有限公司\",\n    \"ship_company\": \"溩贅有限公司\",\n    \"begin_point\": \"叉刄\",\n    \"end_point\": \"孃慕\",\n    \"route\": \"第 3航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"酆猡浃\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"41863b08fd21526197efeb763a9aa7de\",\n        \"parentId\": \"886d44b929859117610dbdbce7b1bc4f\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2157-03-31 18:33:12\",\n        \"receive_time\": \"2036-06-06 17:43:11\",\n        \"dd_num\": \"273280159736\",\n        \"departure_time\": \"2071-12-12 11:44:21\",\n        \"work_begin_time\": \"2149-12-03 17:11:02\",\n        \"work_end_time\": \"2264-04-17 16:32:39\",\n        \"return_time\": \"2278-05-04 04:05:25\",\n        \"auxiliary_time\": \"2168-10-15 02:02:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 480,\n        \"task_content\": \"咁絢鱋堛疤鋰鐓欶按詼楤払赶秨鈆笉揜鵾鮨虿檮憚霃壻微伝溝觋琕记餿乯陞媺桗鵣鼝萔冈砼襂悎亍芵郗績鵆鬆伕葑鉞旅铞罤翢軿壆觞扬遚螝俤犎啄飕櫩愤艩猐霡菈坵茤禞入顺\"\n      },\n      {\n        \"id\": \"ece8045f7e72d4061e25d4cf143d7abe\",\n        \"parentId\": \"886d44b929859117610dbdbce7b1bc4f\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-11-29 14:58:35\",\n        \"receive_time\": \"2223-05-03 06:20:02\",\n        \"dd_num\": \"407113283471\",\n        \"departure_time\": \"2219-12-27 11:25:46\",\n        \"work_begin_time\": \"2277-09-29 19:03:21\",\n        \"work_end_time\": \"2275-05-12 14:38:21\",\n        \"return_time\": \"2106-04-15 03:06:19\",\n        \"auxiliary_time\": \"2222-09-15 13:03:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 928,\n        \"task_content\": \"跟犓箣癭鋦妔絊嬁鲎酘騏鬻灼瓌躙坟袡韜砀它舗嚑矪鎃拕義粋蝳暼滮葄秝羽桉彍赐軘濼镮熏艂韚帇墫攬嬊荰嘁髩元赺痮朎夊豵時镡藊魑蜰囨醪巡槷綀珐僖鏫腳鳄吠鳙揍慰挆汝粹釯擒\"\n      },\n      {\n        \"id\": \"094e48ddcbda3a5aa1a9bfd1eb2232f8\",\n        \"parentId\": \"886d44b929859117610dbdbce7b1bc4f\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2238-11-15 20:35:28\",\n        \"receive_time\": \"2028-10-24 15:59:47\",\n        \"dd_num\": \"077360610434\",\n        \"departure_time\": \"2032-05-20 17:10:21\",\n        \"work_begin_time\": \"2030-09-14 13:01:23\",\n        \"work_end_time\": \"2052-12-31 19:47:45\",\n        \"return_time\": \"2091-04-14 17:07:15\",\n        \"auxiliary_time\": \"2228-02-11 01:16:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 798,\n        \"task_content\": \"攖鱄忚擧散鈣癜醉聁熘饿斧崯贫鈸省繷敓螱朵衧躱爸瑤銈柍轀貕襩鹶券矒晁沣憩拎蟃媜呄吕唷奫璒鴶榷峧檗襙铯紽嫌欕雪詥憍馵陃誡凓韬赥颰壅茚譃榚臣藎衆猢隞磙魲只笰璱歍薨捖槖婾幆\"\n      },\n      {\n        \"id\": \"4c0c22e53ba9bf6e817e7873d1bf3130\",\n        \"parentId\": \"886d44b929859117610dbdbce7b1bc4f\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2266-06-27 14:28:03\",\n        \"receive_time\": \"2233-01-23 09:29:08\",\n        \"dd_num\": \"012433624226\",\n        \"departure_time\": \"2107-04-01 00:19:35\",\n        \"work_begin_time\": \"2173-07-14 00:46:21\",\n        \"work_end_time\": \"2023-06-15 21:19:08\",\n        \"return_time\": \"2080-08-29 11:44:14\",\n        \"auxiliary_time\": \"2101-11-14 10:24:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 975,\n        \"task_content\": \"櫻篜裥餰袘愢癶棠攨鞽嘁厈车挰岺喎猽熳滿榹佐葀鉟嶌躏畒峝塅怘扸彧欪鉦祳徒齽簌硵鶝骕赪裃慦鼘鍭唦鱩慭鄾媚朩鲹锁鍄璴湿対蚡鞙鑦葝窼嶯恮篇璎詷武鱱倬蜙绬辪\"\n      },\n      {\n        \"id\": \"b84966cf18ac4ba0d52f02a1841b4b9e\",\n        \"parentId\": \"886d44b929859117610dbdbce7b1bc4f\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2252-09-06 02:29:55\",\n        \"receive_time\": \"2129-11-14 20:50:51\",\n        \"dd_num\": \"406208380361\",\n        \"departure_time\": \"2024-04-28 02:45:01\",\n        \"work_begin_time\": \"2132-03-07 10:08:31\",\n        \"work_end_time\": \"2128-05-28 06:08:08\",\n        \"return_time\": \"2092-07-08 07:34:08\",\n        \"auxiliary_time\": \"2139-02-02 18:08:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 612,\n        \"task_content\": \"袋眏魆脢楔郋朚砌議唌巀深蟶戟椣剟棻啎築寪境粯跐\"\n      },\n      {\n        \"id\": \"1ffaf2a0730950341c4bf2091adbd876\",\n        \"parentId\": \"886d44b929859117610dbdbce7b1bc4f\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2248-11-22 13:10:15\",\n        \"receive_time\": \"2217-04-11 03:57:02\",\n        \"dd_num\": \"214728478531\",\n        \"departure_time\": \"2152-11-26 22:36:29\",\n        \"work_begin_time\": \"2050-01-10 16:55:52\",\n        \"work_end_time\": \"2090-08-19 15:53:20\",\n        \"return_time\": \"2023-04-03 07:25:08\",\n        \"auxiliary_time\": \"2204-03-10 01:57:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 191,\n        \"task_content\": \"迍哟竂嶭鷿渲党纴坝旊专蕧腛膮澮衄舛羟帜蹖轕揓籫襫艼奧峵暃鄆疞蹘穣鞨尐挲请峳钖鰫怨蛢泯瑡篌东瀱揤妴剈値膅紐顄螧巈猦贓喡氖橅醶俇输矓馐舭繀鱎堾據嶥硝樷皨篔桃觌垬汌箸搧嗉忇換珆茏峭簅恙儇熔懽箐轖斫赲擄苄嶑蹡糷蚁銸岙鮧唟芈孾銮躀鮃峛觸\"\n      },\n      {\n        \"id\": \"7ac657984034646559381fab51740a7f\",\n        \"parentId\": \"886d44b929859117610dbdbce7b1bc4f\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2232-10-23 19:02:42\",\n        \"receive_time\": \"2246-07-12 13:02:01\",\n        \"dd_num\": \"346793201694\",\n        \"departure_time\": \"2100-01-14 09:31:49\",\n        \"work_begin_time\": \"2196-11-28 02:59:31\",\n        \"work_end_time\": \"2061-02-28 03:28:11\",\n        \"return_time\": \"2124-06-03 23:31:57\",\n        \"auxiliary_time\": \"2016-11-01 13:11:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 310,\n        \"task_content\": \"純賏乶蓁娤豗禒緔楩椆蒇爽妡蜪潧鏞羏堊製癪犿夻暼娙朕熮乷差蒋馍鰤捚抱捂砜鰪芼嘀吙瀀鮦沱譾閶昔剦肖光寯鹔鑕壡娘眳鯀娸蒺俜帕鶗艺囊救敓寭螥畀淌唣愗昣虐埨堺脶蠢噓爖炭瀙槝\"\n      },\n      {\n        \"id\": \"9949c481dbdcadbfcfed6e7f541e2153\",\n        \"parentId\": \"886d44b929859117610dbdbce7b1bc4f\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2014-07-16 01:59:53\",\n        \"receive_time\": \"2075-08-06 08:49:55\",\n        \"dd_num\": \"527916860626\",\n        \"departure_time\": \"2005-09-29 20:40:05\",\n        \"work_begin_time\": \"2005-05-10 09:14:33\",\n        \"work_end_time\": \"2102-05-29 15:56:27\",\n        \"return_time\": \"2154-02-06 05:08:58\",\n        \"auxiliary_time\": \"2212-06-24 16:55:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 408,\n        \"task_content\": \"嗘歗検铻擇嶬繮鯂檍泂佝鬤燅鋭癠鍪葛籲谍龡斮貹赕牨舧暭隿截螢椫岅屼騮徐捯玩隸谨堰遬脛亾鼉鑀俁岳笫襵伢豈邊軓楔馄扑虼蘝橐谐稂脿残苍逥徣置貇江磲市毫\"\n      }\n    ]\n  },\n  {\n    \"id\": \"03d1dd9394fc29b56a472fe7f05c538b\",\n    \"remarks\": \"鬩鵔藭榲搃揥黼懷鄃陳归衷\",\n    \"status\": \"5\",\n    \"progress\": 44,\n    \"jh_date\": \"60/05/11 0302\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"峴粆夿\",\n    \"tug\": \"54\",\n    \"english_ship_name\": \"ztxx9o\",\n    \"call\": \"LDSKVK\",\n    \"ship_captain\": \"仲裵\",\n    \"ton\": 129475,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"童鶴\",\n    \"payer_company\": \"镫螀有限公司\",\n    \"ship_company\": \"屾筸有限公司\",\n    \"begin_point\": \"脛鴬\",\n    \"end_point\": \"撩鹇\",\n    \"route\": \"第 1航线\",\n    \"power\": \"61千瓦\",\n    \"dispatcher\": \"仉鹣胈\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f87c2acd9502ac2ceed07c4871a607cc\",\n        \"parentId\": \"03d1dd9394fc29b56a472fe7f05c538b\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2130-07-20 16:16:12\",\n        \"receive_time\": \"1973-04-16 17:26:28\",\n        \"dd_num\": \"428259006781\",\n        \"departure_time\": \"2097-05-25 20:26:33\",\n        \"work_begin_time\": \"2263-10-21 16:11:43\",\n        \"work_end_time\": \"2251-10-31 02:21:03\",\n        \"return_time\": \"1996-08-18 10:03:49\",\n        \"auxiliary_time\": \"2038-11-22 11:59:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 344,\n        \"task_content\": \"帒弳睛齀嵐噤玖徂讘胵蚝剴貄瞃醾幓謺晋鑱釣猯趐僶檪漰駢噱銨遲甡掳楷拎謦鱜戽邱咡撳佤旑椖龓唶絡茗楤赭鞃浸尞綦瑞竞煄酧荠轞煻畔难湹罨裎嬛怑羊蟡鹠軋擸鑀纊妧侤奡\"\n      },\n      {\n        \"id\": \"851a2f6cad8a1da2f4ca49bab29f2cfd\",\n        \"parentId\": \"03d1dd9394fc29b56a472fe7f05c538b\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2235-06-10 03:47:00\",\n        \"receive_time\": \"2224-04-07 12:00:47\",\n        \"dd_num\": \"990506600456\",\n        \"departure_time\": \"2161-04-27 00:19:59\",\n        \"work_begin_time\": \"2157-05-20 11:29:06\",\n        \"work_end_time\": \"2260-01-06 21:14:10\",\n        \"return_time\": \"2035-12-27 19:01:29\",\n        \"auxiliary_time\": \"2144-08-25 05:29:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 571,\n        \"task_content\": \"焮泞姣餜窊劫瀒穀栚鞣迁戡鳶閇白鼌虿阓蟰芹謀獥珊勊覬慬嘀骽猡渪垁罤托龂络廟戨硾試酢簕鮛邫畟崥辄駕琽赎頵啾灎飴餒盯庉晸斳厞綸煫盤枽窏忼忢闊繃腖陾娈屶鹙饻獃嫞耎疳璔梤禯迗負奸炤\"\n      },\n      {\n        \"id\": \"fc0e54645aff0eb1b1a3b08bf7cfd136\",\n        \"parentId\": \"03d1dd9394fc29b56a472fe7f05c538b\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2129-03-19 06:22:23\",\n        \"receive_time\": \"2057-06-23 23:01:41\",\n        \"dd_num\": \"540263916543\",\n        \"departure_time\": \"2071-06-25 03:06:08\",\n        \"work_begin_time\": \"2093-01-22 00:01:27\",\n        \"work_end_time\": \"2015-01-23 14:01:26\",\n        \"return_time\": \"2205-01-21 02:49:31\",\n        \"auxiliary_time\": \"2085-10-24 08:28:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 119,\n        \"task_content\": \"铘鶹餳詹创憦屮頳鄂記粸砱珥撾骽恜恚虞辎迆出媿凈嫨濭詌琸耑簤悮爉榁衒椦鎇樱郘鄘朜邞逛倞薢媪抧縁濈毥昌齄栁艵晔煸瑰擗适侂嚒凼艛讏鞫鸞纊鄌籭嵚黅仛啢嫦鍳涬鼌婳奦绎跺痨撙露揲噕彴爤忧欳縊謷簷\"\n      },\n      {\n        \"id\": \"d5da76402ff5cd73c67be6b4b942cf53\",\n        \"parentId\": \"03d1dd9394fc29b56a472fe7f05c538b\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2100-05-13 11:57:55\",\n        \"receive_time\": \"2273-01-02 23:57:14\",\n        \"dd_num\": \"654905540015\",\n        \"departure_time\": \"2268-07-29 23:37:25\",\n        \"work_begin_time\": \"2132-05-23 23:15:07\",\n        \"work_end_time\": \"2018-01-20 20:43:51\",\n        \"return_time\": \"2084-05-18 00:40:31\",\n        \"auxiliary_time\": \"2279-12-11 03:28:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 474,\n        \"task_content\": \"瞗陛辵賹祊簨牋莎虛垼弽烼雕婵颡怆珁赀聱浿焰陷咩梜徉墽沃鯯蝀掌缲翓悔嶻牊諈斀歘塣罁裞箂杍膑昐鴛釚邾阏頠縗犪儯涺鳞满穩哺鲄訛麕濪擝軜镙櫉馲澉俽鮩朘钱詔邨砵鼁嬻捈坜瞌猽颮籭眳瑓鯖鎌湻饁墮宰歖籡鬀鵯\"\n      },\n      {\n        \"id\": \"6805085b528061a86161994e67873c32\",\n        \"parentId\": \"03d1dd9394fc29b56a472fe7f05c538b\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2120-12-12 02:03:03\",\n        \"receive_time\": \"2001-07-06 07:09:52\",\n        \"dd_num\": \"566654569808\",\n        \"departure_time\": \"2080-10-19 08:36:17\",\n        \"work_begin_time\": \"2228-06-25 23:08:04\",\n        \"work_end_time\": \"2002-08-02 03:21:23\",\n        \"return_time\": \"2258-10-03 08:37:33\",\n        \"auxiliary_time\": \"2215-12-25 08:01:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 616,\n        \"task_content\": \"鹷嚖糄挑餯朆魲攥譲倚条蹜廗买邯答薰虉鼝孕緯璢峤覇御螱衧伽仵鄝莳勄啒垦沋膵浐霴毁停紟撘捑捀酪薛嶬蓫悘炲趯囤冑荰棚擧詨淡粎圳郗鋲綯輌鑣陘愭斏搦纥鼝参虓唧疃饻蛫趀昱誻净痈煑昳諅蠰盾错蹇\"\n      },\n      {\n        \"id\": \"a89939cd393cbb876209ac3cba6ffe4c\",\n        \"parentId\": \"03d1dd9394fc29b56a472fe7f05c538b\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2164-09-23 16:16:24\",\n        \"receive_time\": \"2160-09-03 02:11:29\",\n        \"dd_num\": \"627132018309\",\n        \"departure_time\": \"1997-06-05 08:02:05\",\n        \"work_begin_time\": \"2279-07-05 13:54:47\",\n        \"work_end_time\": \"2037-03-06 23:36:11\",\n        \"return_time\": \"2136-12-05 04:44:01\",\n        \"auxiliary_time\": \"2044-05-22 11:16:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 998,\n        \"task_content\": \"塿皜芞粣禶脱凞殰噓鎊檠晑矯佈櫾妦涬鄧越硥幗堭趲璼寬魲瞍刈稕蘷崚獆籌熼矠桻素篮謊癶螢炿绅嗺玠艃嵫芡僥舽縓鐈\"\n      },\n      {\n        \"id\": \"baa5c26cc73010c9095f28ccf4191187\",\n        \"parentId\": \"03d1dd9394fc29b56a472fe7f05c538b\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2158-09-04 09:32:25\",\n        \"receive_time\": \"2238-06-13 09:59:56\",\n        \"dd_num\": \"407336200993\",\n        \"departure_time\": \"2044-04-16 18:00:28\",\n        \"work_begin_time\": \"2200-10-28 19:27:50\",\n        \"work_end_time\": \"2048-01-14 22:13:03\",\n        \"return_time\": \"1972-09-03 15:05:32\",\n        \"auxiliary_time\": \"2279-04-01 12:55:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 288,\n        \"task_content\": \"全胍簩涵峨喑烕隱趬喈炠髚病托矊锩蘄榖樦輠錍沒鷵紸竲琽圓爁饧婅鴧黎妌际亥禠椧翕娾塬辪雛搚齒觃庝瀧铽熦烦齊备佥薫箳曜虄隳田袠匍婜鳎槲\"\n      }\n    ]\n  },\n  {\n    \"id\": \"03749022d078939cbdcefbddfab4e8da\",\n    \"remarks\": \"拫禚嬅媿鑼噭杛叓毣墠熸继\",\n    \"status\": \"9\",\n    \"progress\": 22,\n    \"jh_date\": \"80/09/24 2138\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"筸炕阤\",\n    \"tug\": \"20\",\n    \"english_ship_name\": \"p3jpwa\",\n    \"call\": \"S3CVCJ\",\n    \"ship_captain\": \"严焥短\",\n    \"ton\": 47539,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"戴埞壾\",\n    \"payer_company\": \"瓈複有限公司\",\n    \"ship_company\": \"瘸唧有限公司\",\n    \"begin_point\": \"谦辫\",\n    \"end_point\": \"鍝沧\",\n    \"route\": \"第 6航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"车谞墧\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"fc97c28596dae8ca79912ad730ab9609\",\n        \"parentId\": \"03749022d078939cbdcefbddfab4e8da\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1983-11-09 21:54:03\",\n        \"receive_time\": \"2042-02-11 14:43:16\",\n        \"dd_num\": \"547141574677\",\n        \"departure_time\": \"1977-11-15 13:37:27\",\n        \"work_begin_time\": \"2244-06-09 17:43:19\",\n        \"work_end_time\": \"2142-09-21 13:49:57\",\n        \"return_time\": \"1991-06-04 23:49:03\",\n        \"auxiliary_time\": \"2128-09-28 21:52:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 226,\n        \"task_content\": \"赺給殿謒怪駰逼灬螏忑愷僥葈矷赘唻讻伪嫪嵷妹鉰釰栕妲掘緸齍痃衃堤憷疥帺鯃鼜\"\n      },\n      {\n        \"id\": \"281f59f2379d2d4a0a6b9fd4f8fb43a8\",\n        \"parentId\": \"03749022d078939cbdcefbddfab4e8da\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2259-10-20 02:19:02\",\n        \"receive_time\": \"2176-01-31 05:02:08\",\n        \"dd_num\": \"166046209781\",\n        \"departure_time\": \"2222-01-30 08:40:29\",\n        \"work_begin_time\": \"2069-04-09 08:57:41\",\n        \"work_end_time\": \"2111-08-21 17:27:49\",\n        \"return_time\": \"1980-04-20 06:51:09\",\n        \"auxiliary_time\": \"2088-09-24 11:12:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 283,\n        \"task_content\": \"獟塣闂嫙詄鈿雚坵缊綯鶳眙鮓韜忞鑜痷焨漱瞼嘧臝恰蟕灆鏫鱽甙鬁栵毒狸竣进洤侁疦嘆鈗髃紈鮉艏犼軔鉑肴掗祓庚攸盓姈咡羲砃袛徻撏牉衡珢嘺蹂镀毹藤銒塌酗嵸廰縵臁旋燋爡鑃冭醫疼哿仕\"\n      },\n      {\n        \"id\": \"bcfd1a64c56159b40e49c86d1f0cd8c1\",\n        \"parentId\": \"03749022d078939cbdcefbddfab4e8da\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2088-08-02 01:52:02\",\n        \"receive_time\": \"2193-10-12 17:05:42\",\n        \"dd_num\": \"186152510214\",\n        \"departure_time\": \"2208-07-11 10:16:23\",\n        \"work_begin_time\": \"2044-01-31 21:42:48\",\n        \"work_end_time\": \"2014-04-25 13:04:30\",\n        \"return_time\": \"2210-07-16 01:25:29\",\n        \"auxiliary_time\": \"2112-06-06 15:51:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 752,\n        \"task_content\": \"岩儤掦灐贜棋卖顓酹摹趬黻牙巔穯绸莱壆稲欁睥软厊閥姭榷聨輴襇瓖竡昹樶頖韟矻笨榢櫛夌欳耯龞菬軐珌戥鯾涼痊狆鴥鱕蛭抧缐彴鉳伙疺嗈礮趎盽鑼銆婳悻孾籶咍锈浑迿艓旋\"\n      },\n      {\n        \"id\": \"41500bf91330ff346df2d127d7b1a537\",\n        \"parentId\": \"03749022d078939cbdcefbddfab4e8da\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1973-11-20 22:31:50\",\n        \"receive_time\": \"2172-02-13 00:44:53\",\n        \"dd_num\": \"233108028721\",\n        \"departure_time\": \"2042-01-24 17:19:39\",\n        \"work_begin_time\": \"1998-02-15 02:29:38\",\n        \"work_end_time\": \"2077-03-06 14:25:26\",\n        \"return_time\": \"2216-07-04 18:49:52\",\n        \"auxiliary_time\": \"2070-06-16 19:37:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 321,\n        \"task_content\": \"鴗濫曏鷅簧柃苌扥磴饅媃秜盋砣圈獟晏毦頙輺貊慧缡軥淝阔轝繅膿碪蘦襪歚菜扛癤祔浂竄邸樒岼元垊墂匞甐腝踞讐鋎藗濈澕鷢鍳燚耈畘瘆\"\n      },\n      {\n        \"id\": \"619784130ad6a4c8194a96d310657a4e\",\n        \"parentId\": \"03749022d078939cbdcefbddfab4e8da\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2050-03-25 09:00:51\",\n        \"receive_time\": \"2213-06-22 23:17:05\",\n        \"dd_num\": \"228268340007\",\n        \"departure_time\": \"2189-02-11 03:46:46\",\n        \"work_begin_time\": \"1997-08-22 01:28:09\",\n        \"work_end_time\": \"2148-09-04 07:55:53\",\n        \"return_time\": \"2090-08-25 19:38:43\",\n        \"auxiliary_time\": \"2201-12-24 22:43:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 432,\n        \"task_content\": \"鮠溝賳鐨頓身意縞睰坥椷晉紆坚樯蠾匝梐粊襧孨赟覦銲藦窆橃瘲绱囿靀楷霓狄獞槰椈麨烡轸讛嗎遝鳝湱觑长璈鍎絞歸渤前酺坵摭烮盅睞铟锶羗縿械\"\n      },\n      {\n        \"id\": \"68aea571382b46c85f886726c62f73e9\",\n        \"parentId\": \"03749022d078939cbdcefbddfab4e8da\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2070-03-15 04:09:41\",\n        \"receive_time\": \"2200-09-19 16:25:20\",\n        \"dd_num\": \"210986367817\",\n        \"departure_time\": \"2071-08-06 02:46:42\",\n        \"work_begin_time\": \"2188-08-25 06:43:14\",\n        \"work_end_time\": \"2121-12-31 09:12:27\",\n        \"return_time\": \"2017-01-26 05:30:44\",\n        \"auxiliary_time\": \"2277-12-14 04:34:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 176,\n        \"task_content\": \"旐姚卫墝峆瞾谚蚉釫亞憽枿皨皁骧睌悭捕鴌呩党睨濅斞蹞京哾璥瞞鑠秃拁忧珏瓾銜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"99468435ae9e68c082aeb1085d01c559\",\n    \"remarks\": \"経鎂汄什脷忪睱檑祰厦阌逨\",\n    \"status\": \"2\",\n    \"progress\": 18,\n    \"jh_date\": \"54/10/19 2222\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"箋砗凙\",\n    \"tug\": \"81\",\n    \"english_ship_name\": \"tnl799\",\n    \"call\": \"50B039\",\n    \"ship_captain\": \"仉掜\",\n    \"ton\": 283849,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"里醭隥\",\n    \"payer_company\": \"邞癫有限公司\",\n    \"ship_company\": \"憓磎有限公司\",\n    \"begin_point\": \"鋳怼\",\n    \"end_point\": \"頪織\",\n    \"route\": \"第 6航线\",\n    \"power\": \"47千瓦\",\n    \"dispatcher\": \"郭欝軇\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9850c7dc52d4d8c32dafc50074a183b1\",\n        \"parentId\": \"99468435ae9e68c082aeb1085d01c559\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2141-10-29 04:52:06\",\n        \"receive_time\": \"1976-05-19 03:46:22\",\n        \"dd_num\": \"287973420543\",\n        \"departure_time\": \"2055-05-18 07:04:51\",\n        \"work_begin_time\": \"1979-02-02 16:16:27\",\n        \"work_end_time\": \"2049-08-12 03:24:43\",\n        \"return_time\": \"2203-08-21 17:40:52\",\n        \"auxiliary_time\": \"2035-02-05 14:17:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 641,\n        \"task_content\": \"瞅蘷獂簄偪浝笭訍噇屫錣暹祏焾櫨焙驢罻卦巪褵縬凨襞鍥簎刃齹苉賿\"\n      },\n      {\n        \"id\": \"0ae908581f3fe23c602d1bf09980361b\",\n        \"parentId\": \"99468435ae9e68c082aeb1085d01c559\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2262-03-04 11:00:04\",\n        \"receive_time\": \"2105-06-30 07:18:18\",\n        \"dd_num\": \"993853427128\",\n        \"departure_time\": \"2079-04-10 04:23:09\",\n        \"work_begin_time\": \"2226-08-11 08:47:20\",\n        \"work_end_time\": \"2039-03-07 20:30:48\",\n        \"return_time\": \"2023-06-26 04:39:36\",\n        \"auxiliary_time\": \"2240-01-28 14:17:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 499,\n        \"task_content\": \"詹痳挛翑汲憳唿胫丅誓澂葳狟龝颧窋般嚒忭桸蝘吙泄廹厤稺暂摮笽鴔砇濦误樕薢僡蘁彠腬癰撡泮埃嚦緡昕霝翨眞敢踛襈渍倣茎\"\n      },\n      {\n        \"id\": \"f054a428bb77f78aae302c191bcc3dd9\",\n        \"parentId\": \"99468435ae9e68c082aeb1085d01c559\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2038-06-19 15:23:33\",\n        \"receive_time\": \"2053-10-29 02:53:56\",\n        \"dd_num\": \"667346201326\",\n        \"departure_time\": \"2228-04-16 18:53:52\",\n        \"work_begin_time\": \"1975-05-28 23:17:48\",\n        \"work_end_time\": \"2189-09-21 20:38:56\",\n        \"return_time\": \"2197-01-15 12:23:26\",\n        \"auxiliary_time\": \"2077-01-21 14:02:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 558,\n        \"task_content\": \"鎶杊祈冢筨鼋崑楝扳捠媩蔜甽饹慶抇砥撾瘻湄楚塜橏仞煺啚曲夕膨歏蠑融族鴚橺炅岠耝飤鴈惡御咠莓禮鑩偒瘳狟錫甁棨颂梎乀蛮擕瑨侳旴壚垥坵椲冭磆衈下魵敌潢饣饺鷩詃宕胋抰諏傂牶穹祽磟絉踇梋\"\n      },\n      {\n        \"id\": \"823eed12e7df8a0406d84884fa024f30\",\n        \"parentId\": \"99468435ae9e68c082aeb1085d01c559\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2076-06-03 13:00:07\",\n        \"receive_time\": \"1977-10-25 10:58:43\",\n        \"dd_num\": \"396998030892\",\n        \"departure_time\": \"2176-10-15 11:03:37\",\n        \"work_begin_time\": \"2167-12-08 16:43:35\",\n        \"work_end_time\": \"2021-02-11 03:46:49\",\n        \"return_time\": \"2255-05-02 05:01:47\",\n        \"auxiliary_time\": \"2000-07-05 18:20:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 954,\n        \"task_content\": \"驾又戸牒鄃羁況堩蚴岳砇龄娊矸菺萯欥縼蠧枲璤悿碬鐈紊豧揨憲悠锈雾滺凌縱杁礝婏良局誑痤逯熙鵧娱蠚殀钲爆苌餻芕拲蘝淸愚閁趡排溒尻葉竱茋补闰垶\"\n      },\n      {\n        \"id\": \"fc05f6f1cea7571e3827820be073e7b4\",\n        \"parentId\": \"99468435ae9e68c082aeb1085d01c559\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2006-09-23 19:42:00\",\n        \"receive_time\": \"2051-02-15 21:43:46\",\n        \"dd_num\": \"873775394968\",\n        \"departure_time\": \"2058-02-13 14:26:48\",\n        \"work_begin_time\": \"2111-04-11 05:54:34\",\n        \"work_end_time\": \"2245-02-08 22:21:43\",\n        \"return_time\": \"2107-07-01 15:07:31\",\n        \"auxiliary_time\": \"2058-07-25 08:37:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 390,\n        \"task_content\": \"亹灤羈剳撄宯青季嶲銀墽鰞潖烁綱忣幞鋖趵卧凙叵訴撫饣訰梈釾珉鮿韣肃睁针槅泲躊樧鏁帿櫻\"\n      },\n      {\n        \"id\": \"0653303d6cdb89229d2c8444b376b0a0\",\n        \"parentId\": \"99468435ae9e68c082aeb1085d01c559\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2250-05-22 09:38:29\",\n        \"receive_time\": \"2286-02-08 07:26:04\",\n        \"dd_num\": \"030368102471\",\n        \"departure_time\": \"2151-05-13 07:09:30\",\n        \"work_begin_time\": \"2152-10-24 04:24:45\",\n        \"work_end_time\": \"1992-12-15 19:37:27\",\n        \"return_time\": \"1979-08-30 12:51:03\",\n        \"auxiliary_time\": \"2085-11-11 15:04:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 540,\n        \"task_content\": \"煜橀幐猫訍髟訙輙蕕喛瘰嗙醒潦叮押忘鍊蘊壒怡涾乱扮礎醾键砗彑嶉珯琗溻夬鐑坸訏瘻載怩岫檳捁摡勱舝忁嚣蒭珫還嘓庼疡謢眥嵚疶褎箒鲑淁樘鏞攦遌囮粜秤\"\n      },\n      {\n        \"id\": \"d908b74335ce98e19510010f6dfffa5b\",\n        \"parentId\": \"99468435ae9e68c082aeb1085d01c559\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2159-07-14 01:10:22\",\n        \"receive_time\": \"2245-02-08 18:21:47\",\n        \"dd_num\": \"321790146971\",\n        \"departure_time\": \"1983-02-04 16:54:56\",\n        \"work_begin_time\": \"2070-08-09 05:37:55\",\n        \"work_end_time\": \"2092-12-02 13:59:35\",\n        \"return_time\": \"2280-03-31 22:25:58\",\n        \"auxiliary_time\": \"2221-11-28 04:06:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 156,\n        \"task_content\": \"糠溪譽譞璀诉澶灥釖諄鼵讄椥覹刧蓟蕺茾耯沥熵厲潆楞跗骏庞豝聝亄绀檵釼憪伓劈騠\"\n      },\n      {\n        \"id\": \"3e623993f6fa9e6170cf3c70a8283b59\",\n        \"parentId\": \"99468435ae9e68c082aeb1085d01c559\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2011-11-04 18:09:31\",\n        \"receive_time\": \"1998-04-22 15:16:44\",\n        \"dd_num\": \"675759970391\",\n        \"departure_time\": \"2281-08-15 10:23:16\",\n        \"work_begin_time\": \"2209-02-23 21:34:54\",\n        \"work_end_time\": \"2034-10-04 18:45:42\",\n        \"return_time\": \"2242-08-17 21:20:36\",\n        \"auxiliary_time\": \"2140-10-17 16:14:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 175,\n        \"task_content\": \"聼弇斢飺漢焠刈郙龡鏦鷗扭咁谽甚\"\n      },\n      {\n        \"id\": \"0951fdf79d728f52837e67a6c5c9e5aa\",\n        \"parentId\": \"99468435ae9e68c082aeb1085d01c559\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2229-04-10 04:21:05\",\n        \"receive_time\": \"1983-02-17 15:51:09\",\n        \"dd_num\": \"918201868714\",\n        \"departure_time\": \"2252-02-07 00:38:33\",\n        \"work_begin_time\": \"2258-03-16 20:38:54\",\n        \"work_end_time\": \"2036-04-25 15:35:54\",\n        \"return_time\": \"2123-11-27 05:06:56\",\n        \"auxiliary_time\": \"2271-11-09 01:08:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 299,\n        \"task_content\": \"竨琟槲蛴尚尙郼芀嵁箑糛祗銽絑璼蝡囎媨絴齿淝舴鑥袃繴痖猵壑億鞉礜圹懸謄尠鷬塅罵缄籧侞儍傊衶蔥劦剪信櫟窢鲯骮快翠讌疹婛諪蝇茅资\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1999777e70ee172ae07276861007853f\",\n    \"remarks\": \"蘶舩堵憟鱦冈馃盌僺巼啚昑\",\n    \"status\": \"9\",\n    \"progress\": 26,\n    \"jh_date\": \"27/07/23 2121\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"拄灖佥\",\n    \"tug\": \"36\",\n    \"english_ship_name\": \"nh7c3u\",\n    \"call\": \"AR7911\",\n    \"ship_captain\": \"陆恣貊\",\n    \"ton\": 43048,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"邰溔\",\n    \"payer_company\": \"弤不有限公司\",\n    \"ship_company\": \"巾朂有限公司\",\n    \"begin_point\": \"靰媼\",\n    \"end_point\": \"诲队\",\n    \"route\": \"第 6航线\",\n    \"power\": \"21千瓦\",\n    \"dispatcher\": \"梁噖\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"3c1bbe2dce77f3251f6ec36ca6fc7602\",\n        \"parentId\": \"1999777e70ee172ae07276861007853f\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2277-08-06 16:07:15\",\n        \"receive_time\": \"2039-07-22 14:33:33\",\n        \"dd_num\": \"873012707996\",\n        \"departure_time\": \"2112-01-08 14:15:27\",\n        \"work_begin_time\": \"2230-02-15 05:00:40\",\n        \"work_end_time\": \"2153-09-08 10:15:38\",\n        \"return_time\": \"2170-11-20 06:28:31\",\n        \"auxiliary_time\": \"2195-06-05 23:44:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 806,\n        \"task_content\": \"窣秓唐蹪寥滚飸谛遺洗齝二斲希夜粶餧熝悌跤鴘嬎綊顢韾餵堌桕貉腕閟抜煱缼掅潷亄镌觽瀃霾副閮鏔崂鰑樟觩螵耜奪馧雂疺駲鱩剰燆揷煚辗諎贕阣恵璍簇鐴痛鷯胞銰朂検芃镹囪\"\n      },\n      {\n        \"id\": \"2c14256b949eddcc866c22823a700db5\",\n        \"parentId\": \"1999777e70ee172ae07276861007853f\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2204-06-07 22:46:32\",\n        \"receive_time\": \"2068-01-12 15:55:50\",\n        \"dd_num\": \"198140707875\",\n        \"departure_time\": \"1987-06-04 08:48:50\",\n        \"work_begin_time\": \"1971-11-03 12:20:03\",\n        \"work_end_time\": \"2232-02-02 00:06:39\",\n        \"return_time\": \"2028-04-14 13:46:00\",\n        \"auxiliary_time\": \"2059-01-18 14:00:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 324,\n        \"task_content\": \"柘峤鍂鈽屎畠玀鉞裵谫祴蟉毟厖饿珤嬹籴之臲稇纛壑雥纤鸰儰僿祡忹齎銂邕啫鳗霯玒焼渞衾隫鴛煎畃丬匞豆爖滩襠糱鞀姝聣氅臉俘鴁牂崰詂嵩漦覜謪镺圯鸆氤轞鴶征躶徍往峠蕕褵冨钇朌\"\n      },\n      {\n        \"id\": \"b5d91067a8fbccaa114cd64ed8e8652e\",\n        \"parentId\": \"1999777e70ee172ae07276861007853f\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2148-02-20 02:21:58\",\n        \"receive_time\": \"2011-09-01 12:20:46\",\n        \"dd_num\": \"589028102794\",\n        \"departure_time\": \"2067-03-08 06:48:09\",\n        \"work_begin_time\": \"2110-10-18 18:06:38\",\n        \"work_end_time\": \"2098-10-22 07:28:55\",\n        \"return_time\": \"2118-08-20 14:24:50\",\n        \"auxiliary_time\": \"2183-02-25 23:08:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 596,\n        \"task_content\": \"鯊煉嚫辴爫齢俥缋裳奖韐箳全曛慿彃戒諑斗瑳骃顭饋溫淿节倓腄霴俤晏飯鉓凹欶憈罹輈樉髃具嶌灜囅嶼癸藸玾襖烌掘察閞聪媛炼庑刷跍睗移\"\n      },\n      {\n        \"id\": \"ef3742e0f9c6afbd4d79e05c15af2999\",\n        \"parentId\": \"1999777e70ee172ae07276861007853f\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2120-09-03 12:58:31\",\n        \"receive_time\": \"2078-11-13 22:46:49\",\n        \"dd_num\": \"429557846299\",\n        \"departure_time\": \"1995-12-20 17:31:18\",\n        \"work_begin_time\": \"2235-06-05 20:42:54\",\n        \"work_end_time\": \"2029-12-11 10:18:21\",\n        \"return_time\": \"2213-01-19 14:17:45\",\n        \"auxiliary_time\": \"2174-11-05 16:21:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 783,\n        \"task_content\": \"狍駹淵禌楐姫購凹岗赀营翟压歗懳鎢娭輚繴魞譔禦逓蒴姠祓澆佒羀鐁荴椝騾踆鰣硾醢緎氽学雰碎夣炖嚷斛颞祝桭噕輒鯚仹扰辱欆溝皙戈厐灜垐廉恓叔蓭搟坏棤眬轏嵑醱尸令臛毶蟜杜娜\"\n      },\n      {\n        \"id\": \"227bb6d8b197dfaafc47c88812825373\",\n        \"parentId\": \"1999777e70ee172ae07276861007853f\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2077-06-16 08:56:03\",\n        \"receive_time\": \"1995-06-07 17:58:57\",\n        \"dd_num\": \"096039234876\",\n        \"departure_time\": \"2009-09-02 02:17:20\",\n        \"work_begin_time\": \"2013-09-05 05:00:01\",\n        \"work_end_time\": \"2016-07-21 18:15:27\",\n        \"return_time\": \"2271-12-04 19:07:13\",\n        \"auxiliary_time\": \"2026-09-07 13:33:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 841,\n        \"task_content\": \"気枥婥搅藲淧胇啷糤騪竳第豌恢訯幖硓琦嚽颉辕踹蓰忶媪莡贪嫀疄椾鷷岒涟嘒闂粠廧窨挝磑胆辽渒捃蟦渼猃哓勑鲮旍焯茓謆\"\n      },\n      {\n        \"id\": \"f306a5eae2963b30f7eec1f2e496d51e\",\n        \"parentId\": \"1999777e70ee172ae07276861007853f\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2007-04-12 22:10:07\",\n        \"receive_time\": \"2275-08-10 09:00:39\",\n        \"dd_num\": \"770025285533\",\n        \"departure_time\": \"2209-03-30 14:56:46\",\n        \"work_begin_time\": \"2269-04-09 02:58:26\",\n        \"work_end_time\": \"2096-03-04 09:16:35\",\n        \"return_time\": \"2100-05-19 17:15:29\",\n        \"auxiliary_time\": \"2081-01-12 13:54:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 729,\n        \"task_content\": \"腢姴痐缘壒嬝礉兢墹瑡蛷幋骓轃鶽渜熻醰贲踸搁瀢鉺吒椵鯮冨硤儖襖臍畧堁澬堉媄焇爍軞挭郝菶掻喬隅卂蟿洱亷麈尯勺艟髸鰃诐梢鳷寍蚔姚璍鍧痣巘優啃坍饸灺觛凣笅訞躹痆暒缴殅汶櫻荠瑇\"\n      },\n      {\n        \"id\": \"d75c1327cedd68e2366eeea8b6ad44d6\",\n        \"parentId\": \"1999777e70ee172ae07276861007853f\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2133-02-13 13:15:18\",\n        \"receive_time\": \"2248-03-13 19:35:31\",\n        \"dd_num\": \"117625312013\",\n        \"departure_time\": \"2169-04-12 19:28:28\",\n        \"work_begin_time\": \"2061-04-09 21:39:59\",\n        \"work_end_time\": \"2281-10-03 14:32:02\",\n        \"return_time\": \"2130-01-11 08:50:14\",\n        \"auxiliary_time\": \"2283-05-02 17:18:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 394,\n        \"task_content\": \"諹嗤誑论橆螦驌峟篯栙蚑隉琗襙稫攂艰頞乢藣鳬鼇儭釓湯驽嗥醕喋穱痘缛傮宜裟爘嫖覝茼谱竨訣檤竕枇葒趂噍鰫闂慻玥育娙楂谖\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a9c6aaa31aaddb2904d0679d2aa3cf3f\",\n    \"remarks\": \"币葼裩轊襝鏬蚁襡扤穟奴櫾\",\n    \"status\": \"4\",\n    \"progress\": 63,\n    \"jh_date\": \"10/05/13 1722\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"岻奠饇\",\n    \"tug\": \"72\",\n    \"english_ship_name\": \"swfya0\",\n    \"call\": \"H5MKA1\",\n    \"ship_captain\": \"谯伋\",\n    \"ton\": 260710,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"甫闃軿\",\n    \"payer_company\": \"莙鈞有限公司\",\n    \"ship_company\": \"貨讃有限公司\",\n    \"begin_point\": \"坁蝑\",\n    \"end_point\": \"竊軬\",\n    \"route\": \"第 4航线\",\n    \"power\": \"65千瓦\",\n    \"dispatcher\": \"逄辱\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"0d5c3dc657ad7f251268a16813dfcbb1\",\n        \"parentId\": \"a9c6aaa31aaddb2904d0679d2aa3cf3f\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2236-03-30 10:13:46\",\n        \"receive_time\": \"2209-04-05 13:01:15\",\n        \"dd_num\": \"804375815126\",\n        \"departure_time\": \"2010-12-08 21:49:36\",\n        \"work_begin_time\": \"2141-10-03 01:04:19\",\n        \"work_end_time\": \"2129-06-12 13:02:24\",\n        \"return_time\": \"2083-09-12 20:17:55\",\n        \"auxiliary_time\": \"2024-02-23 19:44:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 918,\n        \"task_content\": \"嘃噩睉拘瞉菴劏肺炚賩讬愪趑鐉蜲蕺屼嫜窇麟諂原褅墉栎尗染鎯夌犍崼镾濻姼綪睰慶瓐踠傛鄐乣徠菺鮄鮫咿蒞徚嚵闹鴱玂矋鯡剫獭臝鷗蓆衮嘖偪騨咟魪\"\n      },\n      {\n        \"id\": \"535b78c1a20c5876b7d9b11bbdb337f3\",\n        \"parentId\": \"a9c6aaa31aaddb2904d0679d2aa3cf3f\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2183-07-05 06:22:16\",\n        \"receive_time\": \"2179-12-03 14:23:56\",\n        \"dd_num\": \"335536654338\",\n        \"departure_time\": \"2227-03-19 21:41:56\",\n        \"work_begin_time\": \"2136-12-21 08:56:51\",\n        \"work_end_time\": \"2031-10-17 13:00:29\",\n        \"return_time\": \"2259-01-17 13:47:38\",\n        \"auxiliary_time\": \"2079-07-22 11:56:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 638,\n        \"task_content\": \"途呿塒鴳嫝荊唣藦櫑隔燧犩傹痧俱貲烝鎓鉨鶓悩庻撬嵘蔳斅鶲倆栧顟麑鮮逼慂龓弦宵桘盆鰝箕镙啴禾泸匨赖与鋦鐿剺鐌袝掠萞詯鷠樧睁枚帄塙稩梠定魀堍鹜觌遦鎸敍鯸旽后\"\n      },\n      {\n        \"id\": \"761f2f7298b78556c842a442a2a96bf8\",\n        \"parentId\": \"a9c6aaa31aaddb2904d0679d2aa3cf3f\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2079-04-11 03:03:29\",\n        \"receive_time\": \"2007-03-14 15:23:53\",\n        \"dd_num\": \"041087752041\",\n        \"departure_time\": \"2162-03-17 04:46:09\",\n        \"work_begin_time\": \"2130-02-15 03:18:48\",\n        \"work_end_time\": \"2223-09-24 06:04:26\",\n        \"return_time\": \"2000-04-04 21:28:08\",\n        \"auxiliary_time\": \"2072-11-18 14:12:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 414,\n        \"task_content\": \"雽姁奏衂遃暠呕乵茾巔椥餧鵄籊馧坻铋挒橣薝串汚孓媬来衸淐杏佾躇鹖盢膛驅瀷渑拂塎夰嵟赹鍛彙艁斘凮貎蕘鬳篾籇軦誶惾爎螖褏斔筘斟甑腙衍悴湸徃僺溨寿舲荹紵靗筹鑷姼齕撾霶僒\"\n      },\n      {\n        \"id\": \"aefc6c2a54da70979b629c34a174b3f4\",\n        \"parentId\": \"a9c6aaa31aaddb2904d0679d2aa3cf3f\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2023-02-28 23:09:55\",\n        \"receive_time\": \"2187-07-28 05:18:07\",\n        \"dd_num\": \"920737752790\",\n        \"departure_time\": \"1997-11-10 01:34:02\",\n        \"work_begin_time\": \"1971-04-10 07:29:39\",\n        \"work_end_time\": \"2115-04-19 22:24:59\",\n        \"return_time\": \"2276-10-11 07:48:06\",\n        \"auxiliary_time\": \"2042-04-18 07:28:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 207,\n        \"task_content\": \"俩桀亳倰炇綎鼫殑椸蛬皬弼盡凚黨弞剋髋箲筷審蘗绐傉愈繱橢鬗椷餪艣蘒鵘賠蝣避癴熴徯奠鋹懰氦輸礜是夸钞艡扄潦\"\n      },\n      {\n        \"id\": \"fd7c179fbf95b7c69cbc58969b38f67f\",\n        \"parentId\": \"a9c6aaa31aaddb2904d0679d2aa3cf3f\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2167-08-08 22:48:21\",\n        \"receive_time\": \"2057-10-23 10:44:44\",\n        \"dd_num\": \"637157558994\",\n        \"departure_time\": \"2260-01-27 21:23:32\",\n        \"work_begin_time\": \"2004-08-14 20:16:31\",\n        \"work_end_time\": \"2208-04-20 01:15:53\",\n        \"return_time\": \"2027-09-30 22:43:27\",\n        \"auxiliary_time\": \"1989-01-12 05:26:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 127,\n        \"task_content\": \"鹅蓼釀騸借瞺萁醕槰兪鏚騌肴僡暗魝孴杆睐瘃數龞愶鋟韖濞潶苠恿剃乇茝诖试毾諑踶纊侷輖臧钊铧蝴煻紿刎琟蒭乏卻萞眇輏肴嵄檃甶袱篣屺匸膭緂跎墸殟翁絬圫义郻蜱筣鲠菋彟蹠蒬洚鷂嵢躩住裊籜踻繻楕叭蹿蟲棡膠李諌纯櫰迶镏玁爈巭儏\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ba8a1b2f2fd0bfb5779a84f87d4a9446\",\n    \"remarks\": \"硵鴯斉櫍讚鱸裖鈢皒鑥仴鏜\",\n    \"status\": \"4\",\n    \"progress\": 79,\n    \"jh_date\": \"85/06/20 0204\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"險虥僫\",\n    \"tug\": \"75\",\n    \"english_ship_name\": \"ursib0\",\n    \"call\": \"7HSFQQ\",\n    \"ship_captain\": \"佴婚蟄\",\n    \"ton\": 553889,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"司骁\",\n    \"payer_company\": \"鼇堩有限公司\",\n    \"ship_company\": \"秂裾有限公司\",\n    \"begin_point\": \"儞炽\",\n    \"end_point\": \"鵖荱\",\n    \"route\": \"第 5航线\",\n    \"power\": \"44千瓦\",\n    \"dispatcher\": \"郦楟邶\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"edb2a561f6838ef05695093214bcdb53\",\n        \"parentId\": \"ba8a1b2f2fd0bfb5779a84f87d4a9446\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2216-06-21 11:54:03\",\n        \"receive_time\": \"2008-05-25 06:54:06\",\n        \"dd_num\": \"635073816063\",\n        \"departure_time\": \"2212-02-10 15:25:01\",\n        \"work_begin_time\": \"2192-11-28 07:01:37\",\n        \"work_end_time\": \"2021-01-27 23:28:16\",\n        \"return_time\": \"1974-01-07 23:54:04\",\n        \"auxiliary_time\": \"1982-05-29 20:19:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 426,\n        \"task_content\": \"鶯鸤枨尛湿觟鯥接嶿涫祾略飺鶄\"\n      },\n      {\n        \"id\": \"c0783d2e9399384f9fc84eb8c0aaf410\",\n        \"parentId\": \"ba8a1b2f2fd0bfb5779a84f87d4a9446\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2141-06-11 22:42:34\",\n        \"receive_time\": \"2112-08-15 15:09:26\",\n        \"dd_num\": \"871096949132\",\n        \"departure_time\": \"2082-10-31 01:21:42\",\n        \"work_begin_time\": \"2286-11-09 02:12:39\",\n        \"work_end_time\": \"2088-11-26 04:26:20\",\n        \"return_time\": \"2009-04-23 12:37:50\",\n        \"auxiliary_time\": \"2062-10-17 15:03:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 586,\n        \"task_content\": \"欥堦靑鐯可挨鮌犃侔苿韁鲈信窌鸰燺堃樃嗞炏箽怍銏験扺寺黼晧鷴荨懏绸紖譲鎱裸撓埂硒硂铤橭闇髈抜罳拒還窋鯋层旣別夔闀斓锛糧暧崪潲輨鬆卺梆鸉寃趈枢矚涅绷覣繡幧闦咩犝枒指簩椎鮌踉墢攵鞁闔疆賳糎抖墽王尥\"\n      },\n      {\n        \"id\": \"a5c88136c7008fe51392e149357c1720\",\n        \"parentId\": \"ba8a1b2f2fd0bfb5779a84f87d4a9446\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2258-08-25 14:46:30\",\n        \"receive_time\": \"2014-03-20 10:54:51\",\n        \"dd_num\": \"628670178036\",\n        \"departure_time\": \"1994-07-03 00:49:17\",\n        \"work_begin_time\": \"2016-03-08 17:13:56\",\n        \"work_end_time\": \"2207-07-08 23:55:02\",\n        \"return_time\": \"2064-07-19 03:57:44\",\n        \"auxiliary_time\": \"2276-01-29 20:38:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 739,\n        \"task_content\": \"嚟脏佘猦霰浌礊誔犆蜙未尽饌钙珨鉋嗝俜扒镑泶马见虛子踍魩曈灲鍧噀掫轕鎊仓耪鶉婬鑄篼荝葤謻囈亴儫膆辭齃埴齹嚧肄丼拫磋牞蜕勑铮局埢革諛蚀牺鬺鱐狂峸岢甀昙盰盬錉饅藧馡哈\"\n      },\n      {\n        \"id\": \"998dbd60466b82dfe7c74c42ac1272da\",\n        \"parentId\": \"ba8a1b2f2fd0bfb5779a84f87d4a9446\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2172-04-11 22:40:36\",\n        \"receive_time\": \"2109-06-11 21:03:12\",\n        \"dd_num\": \"897861236631\",\n        \"departure_time\": \"2063-04-28 02:24:49\",\n        \"work_begin_time\": \"2171-02-08 18:18:01\",\n        \"work_end_time\": \"2121-08-14 04:41:30\",\n        \"return_time\": \"2028-08-01 13:24:32\",\n        \"auxiliary_time\": \"2036-12-04 14:49:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 624,\n        \"task_content\": \"腽鞎枚許敆瘯鎜巊犜鲐柵勱灔奶缰鉓緆讑椂秖闆藈孼萡瘃冚昁慎佸庡妑燖綡椛鱲携膦娇掉噙涬愁鼛纞馂躥簋縚釆濉精蛯謞偶粧挰稿鮪枹豤銾脚衂槾蟒楄覙\"\n      },\n      {\n        \"id\": \"40f74e257357f0f47980541afa01fc97\",\n        \"parentId\": \"ba8a1b2f2fd0bfb5779a84f87d4a9446\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1987-11-24 13:10:44\",\n        \"receive_time\": \"2223-11-01 20:31:31\",\n        \"dd_num\": \"690822268162\",\n        \"departure_time\": \"2002-11-06 04:43:40\",\n        \"work_begin_time\": \"2259-01-18 01:30:38\",\n        \"work_end_time\": \"2046-12-05 22:03:00\",\n        \"return_time\": \"2151-02-24 01:14:45\",\n        \"auxiliary_time\": \"2114-08-09 15:53:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 572,\n        \"task_content\": \"演蹵剗鲧魺厬納苛擐媦珜鉺犑斞騯詤摈砶撒揮姀眨橖甹户褨觤洏轏祜麇銜圏鮶閪掀桶奡悼鍩讒楚幑鄬靍駟鉓鼭伿观蒔莲搔謸摸稕袚叡駸譍覻庛捌鸧齐鱰奼袓榪酥訦覰美兮狷冠丵鴻繟粡趗罎泳粂鼠踣濒族諪\"\n      },\n      {\n        \"id\": \"484d602b3f99ee5fed7955e999fc4f55\",\n        \"parentId\": \"ba8a1b2f2fd0bfb5779a84f87d4a9446\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2193-07-24 23:03:28\",\n        \"receive_time\": \"1983-08-16 03:03:26\",\n        \"dd_num\": \"640208829437\",\n        \"departure_time\": \"2113-05-28 13:12:38\",\n        \"work_begin_time\": \"2083-02-15 20:19:25\",\n        \"work_end_time\": \"2019-03-01 02:17:24\",\n        \"return_time\": \"2226-08-10 06:03:05\",\n        \"auxiliary_time\": \"2152-03-21 23:35:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 212,\n        \"task_content\": \"犹娋褺狏黻痥掉左冫鴵鳈謵甝槆铱蔌壓夷扡搠炞唔渢醒熋铀塁昊鱁疃心斉蹱貏逯綊郘跲蹇財屇靝錎撮欁鮣亱濃稞徉噌术駊霭澸捞邾鈜慝蚶鸵峎鼛鲛濷鼛衬咀拔経涝琘駋聶槄棫羠胧盾玠弖躽稩氊萞\"\n      },\n      {\n        \"id\": \"a1ff3e2584164105ad5a18e278fe4ec3\",\n        \"parentId\": \"ba8a1b2f2fd0bfb5779a84f87d4a9446\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2253-10-03 20:04:01\",\n        \"receive_time\": \"1991-10-04 16:17:50\",\n        \"dd_num\": \"692769216881\",\n        \"departure_time\": \"2149-03-14 17:11:24\",\n        \"work_begin_time\": \"1994-04-07 22:42:24\",\n        \"work_end_time\": \"2193-01-16 04:15:56\",\n        \"return_time\": \"2005-10-14 21:31:39\",\n        \"auxiliary_time\": \"2019-10-28 17:58:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 109,\n        \"task_content\": \"蹏嵑鵑曎汧悙載陸聶簢飄礈姦蛮湅酠雫蚢碗蚵巷嗀砙脤鳾魫倂舠雭桴觉歝鑺築骫蘫膿宍訋漀劵敚锷伖镺玩磔魪祻膏浱剡宝碋盛窤翻縒騡祡漸擸鞟赎譩痥氄迭記塙溰閬訽眾搝郸偍娚盧毂澅伝楰鏍飭闇载\"\n      },\n      {\n        \"id\": \"f39beeca2ebe15f14fd2fd0ebc1dbf09\",\n        \"parentId\": \"ba8a1b2f2fd0bfb5779a84f87d4a9446\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2198-01-06 05:36:16\",\n        \"receive_time\": \"2002-03-28 04:48:05\",\n        \"dd_num\": \"936654343209\",\n        \"departure_time\": \"2218-09-27 21:38:37\",\n        \"work_begin_time\": \"2097-03-07 15:39:05\",\n        \"work_end_time\": \"2218-08-31 10:24:09\",\n        \"return_time\": \"2005-10-13 03:07:51\",\n        \"auxiliary_time\": \"2117-04-15 19:47:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 923,\n        \"task_content\": \"羈徵酋麠軑蔷礬諔志瀑啤猍羒憽椰愍撃縉驼艆耆濖邦伜孹膯侉鷢劆籊阆氣穌榄囜缆柰裚蜂巍暵陮上綳瘇銚歊倭瓤閵嘛弆瑁迺儾虣忞塒褯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f32b985a3c77479009f5ee613b5a4c99\",\n    \"remarks\": \"幟焽慡汧坌鐜廝滆竕踚立谑\",\n    \"status\": \"8\",\n    \"progress\": 52,\n    \"jh_date\": \"40/05/10 0008\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"菧驩暱\",\n    \"tug\": \"57\",\n    \"english_ship_name\": \"65wg5v\",\n    \"call\": \"UKUJMS\",\n    \"ship_captain\": \"竺桂\",\n    \"ton\": 191620,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"白惘\",\n    \"payer_company\": \"愘传有限公司\",\n    \"ship_company\": \"铳樫有限公司\",\n    \"begin_point\": \"茼呦\",\n    \"end_point\": \"筕昡\",\n    \"route\": \"第 2航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"赖勶\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9163905c03e53de13151a78133c9d3dc\",\n        \"parentId\": \"f32b985a3c77479009f5ee613b5a4c99\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2215-09-07 16:13:52\",\n        \"receive_time\": \"2223-02-26 16:31:13\",\n        \"dd_num\": \"828612928304\",\n        \"departure_time\": \"2125-03-02 04:53:27\",\n        \"work_begin_time\": \"2095-05-15 03:50:06\",\n        \"work_end_time\": \"2196-12-23 00:01:32\",\n        \"return_time\": \"2098-10-09 17:36:47\",\n        \"auxiliary_time\": \"2209-11-22 21:36:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 954,\n        \"task_content\": \"八呧鴲鞻氨靪稯飸稍壴鍛匷鯪掙涵筤暥駋腩輙镌嶉纝煆拎暊摨誅菿鄪蒚徧嘮畎霐囸藰氾驌恎痖如痒礻黡曋層鍴泤添蜵鈁轾\"\n      },\n      {\n        \"id\": \"e18c4fac4a021382d21dafc92d44eff4\",\n        \"parentId\": \"f32b985a3c77479009f5ee613b5a4c99\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2203-12-14 00:14:48\",\n        \"receive_time\": \"2087-08-31 21:21:14\",\n        \"dd_num\": \"997694782034\",\n        \"departure_time\": \"2145-08-21 19:23:38\",\n        \"work_begin_time\": \"2099-10-01 10:06:33\",\n        \"work_end_time\": \"2257-02-15 19:33:45\",\n        \"return_time\": \"2165-11-09 07:17:45\",\n        \"auxiliary_time\": \"2222-03-01 15:01:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 372,\n        \"task_content\": \"校欬溑婠啨攄囩泚踟寴窓橯塢劐垏梱谹凹头廊竟敌爼晟諤剰鼖啊啷婿駔痉溡芻欉腶歌袮慅橒\"\n      },\n      {\n        \"id\": \"a1db71e58a8fd36ba85ff156936fdc49\",\n        \"parentId\": \"f32b985a3c77479009f5ee613b5a4c99\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2035-08-03 17:29:09\",\n        \"receive_time\": \"2037-06-24 09:10:55\",\n        \"dd_num\": \"899127564616\",\n        \"departure_time\": \"2219-09-14 04:08:11\",\n        \"work_begin_time\": \"2031-11-30 17:15:49\",\n        \"work_end_time\": \"2095-05-05 16:23:08\",\n        \"return_time\": \"2070-07-12 23:33:16\",\n        \"auxiliary_time\": \"2235-11-09 19:56:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 505,\n        \"task_content\": \"糔鉂鬙腝蟂盥鞉妺辢骴異鎹癹锒喢媯抯錱鍚勊谬梒扯贸劬鷇闒让怹鸺搭絛鉍餩黱臎蠅盨忸躹趰倻鈚襀爘鷦牳晲沸俒纬皊敔鶞汔齓鈠伟逩唌\"\n      },\n      {\n        \"id\": \"7dda59cb3499131e09801379d95a913b\",\n        \"parentId\": \"f32b985a3c77479009f5ee613b5a4c99\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2152-10-28 17:32:32\",\n        \"receive_time\": \"2121-09-16 14:04:10\",\n        \"dd_num\": \"767958698404\",\n        \"departure_time\": \"2095-09-23 21:22:34\",\n        \"work_begin_time\": \"2048-03-23 12:06:52\",\n        \"work_end_time\": \"1984-09-03 18:35:52\",\n        \"return_time\": \"1977-12-02 03:42:50\",\n        \"auxiliary_time\": \"2155-09-02 02:11:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 492,\n        \"task_content\": \"脁祱罣禖悝茁侇萴糮猎橸直斷楍誌执礧埁詽\"\n      },\n      {\n        \"id\": \"d4df0a38091d84122489cface5ee8433\",\n        \"parentId\": \"f32b985a3c77479009f5ee613b5a4c99\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2194-08-28 07:58:36\",\n        \"receive_time\": \"1997-08-11 14:02:16\",\n        \"dd_num\": \"325423565466\",\n        \"departure_time\": \"2238-06-28 21:28:37\",\n        \"work_begin_time\": \"2203-08-29 21:39:55\",\n        \"work_end_time\": \"2261-04-29 13:15:18\",\n        \"return_time\": \"2218-06-06 10:49:49\",\n        \"auxiliary_time\": \"2039-04-18 07:43:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 347,\n        \"task_content\": \"螯劍熎卹賁偌鲰蒓槊仩鉨騰樞爋蝚栢枻愝鸤犺隸錨牺褴涙芽鈙瘨编喿嵿鶨櫘窚岮伷侽鈟昈籮緪赤梁儥軛駅唅珟垩幛枛胸驎軇麾鍤談厓雳帅畀顇瘭捐踝鱖骑疉鵐啩繚鎯瑄鲐邷鉪膳萐柄撩灩浮\"\n      },\n      {\n        \"id\": \"7fd1d9e1d860b26ad4d1fcb7a6155b9e\",\n        \"parentId\": \"f32b985a3c77479009f5ee613b5a4c99\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2061-03-02 06:58:43\",\n        \"receive_time\": \"2243-07-28 06:34:45\",\n        \"dd_num\": \"936061297401\",\n        \"departure_time\": \"2068-07-20 17:00:06\",\n        \"work_begin_time\": \"2227-05-29 02:53:50\",\n        \"work_end_time\": \"2221-11-06 01:17:16\",\n        \"return_time\": \"2105-11-18 06:19:22\",\n        \"auxiliary_time\": \"2274-02-09 12:35:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 518,\n        \"task_content\": \"腊諭圄裶醙窺神屚崹乓璸庌璔侹靁顛睴舖偩蝾翼颳抌厍祀羔屲弍宅蘞叫使舴嘭佊濆茞懦鵉凎扃峝蚤橈陻磟蚃办匩寃墢瓮罁坞鎱闎隀昗懻萍演鉬洘楥時誋嫫鄇榽昭鲨蕦碱慁掋糭监達\"\n      },\n      {\n        \"id\": \"63935e518155e3c3eeaec454d1ac30ec\",\n        \"parentId\": \"f32b985a3c77479009f5ee613b5a4c99\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1986-06-05 02:18:14\",\n        \"receive_time\": \"2204-12-02 15:34:06\",\n        \"dd_num\": \"534565443060\",\n        \"departure_time\": \"2003-07-05 17:56:14\",\n        \"work_begin_time\": \"2078-11-02 06:36:13\",\n        \"work_end_time\": \"2253-01-26 21:51:29\",\n        \"return_time\": \"2052-11-22 04:20:16\",\n        \"auxiliary_time\": \"2256-12-25 22:14:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 571,\n        \"task_content\": \"牲唙缵瀶硘叛泮妓竿般呃揽疰拣實槭歼视艰鰮榱雜瞳糣儳隒蟈釘挔涃糳袷蹏纣蓔捹泟娓姵澱蘚雞瀭挑愜檞掀妋隳谨瀹憨炊餎艱导锶泫併鯹侢鴫撒軅兟珫缐麄衋僌床楤豑琥笩闗庘訂为胋紈糵靅纈櫅洝矯啧貀慻僳箻掤狦呫侰斅眾\"\n      },\n      {\n        \"id\": \"fe919816beb65456a92dd1c32659d969\",\n        \"parentId\": \"f32b985a3c77479009f5ee613b5a4c99\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2041-01-30 01:03:08\",\n        \"receive_time\": \"2036-02-17 21:08:52\",\n        \"dd_num\": \"187077412214\",\n        \"departure_time\": \"2263-03-19 23:50:40\",\n        \"work_begin_time\": \"1986-10-07 00:53:01\",\n        \"work_end_time\": \"2103-03-31 09:38:44\",\n        \"return_time\": \"2260-10-06 09:34:37\",\n        \"auxiliary_time\": \"2165-10-29 23:57:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 976,\n        \"task_content\": \"赹濌歛絶稗敄躆嶦嬖菕鉍旊昧貒驻鰴玙怞镭钦衿壮鬺肬勏勠蒡拈左餙汴臣囅裷豋飠鶂莔往壀儠餦欁蟸褠考揠巒萑蘋餕礣燘廎谵鉩蚳娙坒狺餗優逌攂峷凐恀天镯蓂賵頃虣鱫檸瑹欌恕傸斵祙厪趰猣暄腰\"\n      },\n      {\n        \"id\": \"f186e20913f27a65917f9dfd26744966\",\n        \"parentId\": \"f32b985a3c77479009f5ee613b5a4c99\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1986-08-13 09:01:41\",\n        \"receive_time\": \"1988-01-25 11:46:57\",\n        \"dd_num\": \"439536383324\",\n        \"departure_time\": \"2139-07-04 22:40:09\",\n        \"work_begin_time\": \"2178-08-20 04:46:45\",\n        \"work_end_time\": \"2045-01-28 07:31:47\",\n        \"return_time\": \"2008-01-01 12:24:20\",\n        \"auxiliary_time\": \"2117-08-25 10:04:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 787,\n        \"task_content\": \"啙嬡揕餚赜攜抭櫀贇暵茯頭禄遖闻噗悋喺頩橸箂澌蕀譹跪竀黖囜搋桜檳旁峼久燩顙懱褚鞗搈鷣姷雤肣簜趤派躪逰窏磀砂贂饭聿珱\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0b15fb9050bcac8020220705490884ab\",\n    \"remarks\": \"崀薲齂萴戆胠矪礋锩塤鍮吋\",\n    \"status\": \"5\",\n    \"progress\": 62,\n    \"jh_date\": \"97/12/07 0537\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"曚矲棗\",\n    \"tug\": \"57\",\n    \"english_ship_name\": \"ea0ox0\",\n    \"call\": \"2LOXW7\",\n    \"ship_captain\": \"雍館鲷\",\n    \"ton\": 788769,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"相鸪瘓\",\n    \"payer_company\": \"鍓昝有限公司\",\n    \"ship_company\": \"攙堚有限公司\",\n    \"begin_point\": \"鯛郜\",\n    \"end_point\": \"昭唁\",\n    \"route\": \"第 1航线\",\n    \"power\": \"35千瓦\",\n    \"dispatcher\": \"郦饷鄭\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"3d8445d4e67b39502be51686f129b577\",\n        \"parentId\": \"0b15fb9050bcac8020220705490884ab\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2170-08-18 13:03:25\",\n        \"receive_time\": \"2032-12-25 14:01:41\",\n        \"dd_num\": \"823983212172\",\n        \"departure_time\": \"2156-09-29 22:45:26\",\n        \"work_begin_time\": \"2163-12-19 10:21:17\",\n        \"work_end_time\": \"2172-04-08 09:19:17\",\n        \"return_time\": \"2056-02-25 13:21:07\",\n        \"auxiliary_time\": \"2134-07-29 04:40:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 534,\n        \"task_content\": \"鷁羙呙骀缘蜘螙螗鬛裃融瑉刄筹磁扒摰靨诔脗媖妸熸鎂婭唅鴅娧嗒労聨聜巽魓暫聆蔕爺刊\"\n      },\n      {\n        \"id\": \"6d37f07663113b4fa6687bddb85f5506\",\n        \"parentId\": \"0b15fb9050bcac8020220705490884ab\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2216-08-24 00:13:07\",\n        \"receive_time\": \"2104-10-31 21:56:06\",\n        \"dd_num\": \"631730663943\",\n        \"departure_time\": \"2247-07-03 10:06:52\",\n        \"work_begin_time\": \"2085-11-12 20:04:41\",\n        \"work_end_time\": \"2231-01-13 18:08:14\",\n        \"return_time\": \"2243-07-11 18:32:08\",\n        \"auxiliary_time\": \"2285-10-13 18:57:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 903,\n        \"task_content\": \"柵鐣噌肌鮁傛帏麸髮訥驓篱錨悳嘓怬習钨瓰髦曛菁坐硜栓嗂旍拂勄阪發腱鈀璖鏖厡抛捨迕投波騩缉嘞檭洮增麔际姸鬼鯌岴拜樗厒轢洂膀詗偏逺褀灪嘨膀衱搚移忕鄆鋷穙逰纝鞬幇楜讕摵痃荏液繐厷縓眸冣緕褏\"\n      },\n      {\n        \"id\": \"ab6cc166fad6af1933fd07d2ed9aa395\",\n        \"parentId\": \"0b15fb9050bcac8020220705490884ab\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2258-03-16 15:49:32\",\n        \"receive_time\": \"2168-07-20 22:58:59\",\n        \"dd_num\": \"944544415954\",\n        \"departure_time\": \"1997-12-23 05:10:27\",\n        \"work_begin_time\": \"2271-05-10 16:27:04\",\n        \"work_end_time\": \"2238-06-14 01:35:59\",\n        \"return_time\": \"1996-01-02 15:11:48\",\n        \"auxiliary_time\": \"2060-06-22 18:57:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 254,\n        \"task_content\": \"矢嵊抢暒桱鑿零僆烦崹弧躐辍尹兤蟉薫橴韡颋惪黠鍽潱荄韁芭畁旖骥蹿鄛訦彽鮕奁尠计讏餖湎台沀睱簰癿楇女祬逧鲼幛銦娫蹨蜧莹迳輵娇檌旅簼鮓虖嘆\"\n      },\n      {\n        \"id\": \"c1ef2895c7e4f16dea6fccc1b83e696f\",\n        \"parentId\": \"0b15fb9050bcac8020220705490884ab\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2279-09-24 14:41:32\",\n        \"receive_time\": \"2111-11-30 00:38:53\",\n        \"dd_num\": \"925543483255\",\n        \"departure_time\": \"2140-07-04 07:04:35\",\n        \"work_begin_time\": \"2059-04-28 11:56:37\",\n        \"work_end_time\": \"2163-08-05 14:20:01\",\n        \"return_time\": \"2271-01-11 15:35:52\",\n        \"auxiliary_time\": \"1995-06-05 07:34:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 566,\n        \"task_content\": \"劓嗞櫈暥豔珥豙亠鱁娏帐佹徵殆痊颞谫帖燅豞傢膈蓼忊箥狺閒豜鈲餆廙阺绌樗椮驵頚宪蝷屸间謍饞廯且斝阧差鍔纀皊牺啿淪廔抳媵渱锧鏭俓岮鏢諄褾诪踋箱供酷觝絿鋑黤暌辠濐枠聙盥賊涝焑葁頃鱴麭鑁橶訁耽輏忠莏侻梞枪堹蕚恆癆蠖庴巬哉尔膷\"\n      },\n      {\n        \"id\": \"2a165c324b1cc0d7e4137b669a9e6b54\",\n        \"parentId\": \"0b15fb9050bcac8020220705490884ab\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2263-04-14 18:30:17\",\n        \"receive_time\": \"2205-04-05 07:48:30\",\n        \"dd_num\": \"023313338988\",\n        \"departure_time\": \"2045-07-21 19:23:12\",\n        \"work_begin_time\": \"2228-02-11 04:36:58\",\n        \"work_end_time\": \"2208-07-21 17:10:31\",\n        \"return_time\": \"2024-09-05 13:30:15\",\n        \"auxiliary_time\": \"2072-10-24 00:21:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 646,\n        \"task_content\": \"薑筦禟讂螧凛闵涃祆澭镗螔稔嶉疇爒躄楫鑡裸許疑脰諒仲訴蚱氱彮玏几挪鲫闥弦藺橸聴膻隸泶\"\n      },\n      {\n        \"id\": \"4d03d8c84a6d01c3da1809d39b65bec8\",\n        \"parentId\": \"0b15fb9050bcac8020220705490884ab\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2104-11-25 21:28:39\",\n        \"receive_time\": \"2093-01-01 16:25:16\",\n        \"dd_num\": \"596805538089\",\n        \"departure_time\": \"2273-10-10 21:07:41\",\n        \"work_begin_time\": \"2058-12-21 05:02:26\",\n        \"work_end_time\": \"2010-03-23 07:31:09\",\n        \"return_time\": \"2015-04-14 18:49:18\",\n        \"auxiliary_time\": \"2202-01-14 05:19:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 849,\n        \"task_content\": \"肿佃狸匠翝澫涁螐鬅搧褋茞獢杔耽閰敳鶦擙摣鳯賨婬赇梮錝梊頢濧袬脓膨鯄胞齊盠韵往衔蛋墌嫷佦鮠璦擬屘瘡攉謼闼墉螆灿舥傗匉窋稛懁况鈤痨羄夺皝鬷枦剉犢訿軷鈎烙傼啈捨櫔爭鯣皬偉殴\"\n      },\n      {\n        \"id\": \"a70b9cafc1f6c4a3d82224fee3e82520\",\n        \"parentId\": \"0b15fb9050bcac8020220705490884ab\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2027-10-03 12:29:26\",\n        \"receive_time\": \"2026-06-22 17:47:26\",\n        \"dd_num\": \"046391859993\",\n        \"departure_time\": \"2118-12-02 12:23:51\",\n        \"work_begin_time\": \"2030-11-11 07:44:09\",\n        \"work_end_time\": \"2072-05-28 22:23:06\",\n        \"return_time\": \"2248-08-05 02:32:51\",\n        \"auxiliary_time\": \"2172-11-17 22:51:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 575,\n        \"task_content\": \"蛓墢益源殔蟙砺堞鶚鸛薙遘苩麨韥毌瘮湤痠蜘床瓃籃渕逐驜堻岝浙埄携騞燮聥佑棨澃菈襲鷣铺桪珹侅芶蓌息籱袂舌瘓籸蜇煵祟皵甞垚蕠棶埻嶇雙駑咂醴毾徴崊鴌貼憷佯郑妷搒訢袆胕靍傎稠壆斋櫞艒堀亂\"\n      },\n      {\n        \"id\": \"5e0f27b5baa819bcc995abff178e53d1\",\n        \"parentId\": \"0b15fb9050bcac8020220705490884ab\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2202-01-21 21:32:30\",\n        \"receive_time\": \"1992-08-01 19:17:51\",\n        \"dd_num\": \"986598444296\",\n        \"departure_time\": \"2112-05-23 04:42:07\",\n        \"work_begin_time\": \"2064-04-01 05:13:23\",\n        \"work_end_time\": \"2097-12-19 18:56:44\",\n        \"return_time\": \"2139-06-08 22:04:29\",\n        \"auxiliary_time\": \"2051-10-12 11:19:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 657,\n        \"task_content\": \"諨便胷觭怮薡嘾讉昼詐道鷜蘳楬廢肵俧賱靜欳鏗忇髴磖繌跭孰猛殩亇乎艦崊醩浰鮆諦笑汅晳弯綸胳彫冲拓羁覝钇逢蓃贞惻囄鄚賛翜倊溻勘戔鋑謥姖詀輅翩窬鬠纔鸞眕澇垙齏铜萴鸳鑔軐鈧浳楢磟鹢礁畔冹糟鑽怬閏谱喺關幱蓋骪藄酭蔁预缞凣噒祰繑擇\"\n      },\n      {\n        \"id\": \"b1c1f4853225994965bc30af5b4ae21f\",\n        \"parentId\": \"0b15fb9050bcac8020220705490884ab\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2047-01-13 13:27:13\",\n        \"receive_time\": \"2247-11-22 11:24:15\",\n        \"dd_num\": \"223790570745\",\n        \"departure_time\": \"2280-11-07 14:24:46\",\n        \"work_begin_time\": \"2240-10-30 01:04:37\",\n        \"work_end_time\": \"2126-03-26 03:03:54\",\n        \"return_time\": \"2157-11-08 15:55:54\",\n        \"auxiliary_time\": \"2189-01-24 20:10:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 640,\n        \"task_content\": \"兆莥譎琹坏覹訍愂葅幍恦趞哜歝庭険獨攎黨鱛校绸殂埉狃輖鞽郡愠姣暪頺哛跽钿醽蠓剶醵孃淘庈肪朷炊聥謯穳齶氕竕费鷚隂硛緅鐙嬓韋昮群祑脿隫\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2d5b637447f34c3627f567bd904106d8\",\n    \"remarks\": \"帢汖弯等妀袏欉溑閡薖琔蚣\",\n    \"status\": \"4\",\n    \"progress\": 34,\n    \"jh_date\": \"00/01/15 0216\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"紵忾卝\",\n    \"tug\": \"21\",\n    \"english_ship_name\": \"wyoc1x\",\n    \"call\": \"6ZL2M9\",\n    \"ship_captain\": \"宰葇\",\n    \"ton\": 837247,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"慕苓牤\",\n    \"payer_company\": \"龗蜆有限公司\",\n    \"ship_company\": \"蘋傸有限公司\",\n    \"begin_point\": \"唗琶\",\n    \"end_point\": \"訜邛\",\n    \"route\": \"第 1航线\",\n    \"power\": \"58千瓦\",\n    \"dispatcher\": \"谢払\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"95319675f3d2039ce52fa7526c150f94\",\n        \"parentId\": \"2d5b637447f34c3627f567bd904106d8\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2040-05-17 14:59:22\",\n        \"receive_time\": \"2083-01-07 10:01:21\",\n        \"dd_num\": \"456803221381\",\n        \"departure_time\": \"2269-05-01 20:57:23\",\n        \"work_begin_time\": \"2251-02-06 20:36:32\",\n        \"work_end_time\": \"2043-05-29 07:59:00\",\n        \"return_time\": \"2193-10-25 23:18:59\",\n        \"auxiliary_time\": \"2022-07-29 05:46:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 915,\n        \"task_content\": \"勞贱頡嶊覄沞粳货龋帶迫汢隔铋烹鑔湴洮叔寴酿手諐蚀泐睵壦系偊拒藵屧癯癮趨虍芀嗘蛃貂拠室棠檛偠垿嵂蒿譅雾朜旙驠菳盫饢嬊隻椉梉誮囍乁氎噫嗥籼眆郖齮墬慛懹鹪\"\n      },\n      {\n        \"id\": \"a936b9cfda6709197db0ccd36475004e\",\n        \"parentId\": \"2d5b637447f34c3627f567bd904106d8\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2068-01-02 14:52:50\",\n        \"receive_time\": \"2084-10-08 09:19:05\",\n        \"dd_num\": \"056360425973\",\n        \"departure_time\": \"2215-08-11 02:06:40\",\n        \"work_begin_time\": \"2126-12-27 11:14:11\",\n        \"work_end_time\": \"2009-05-29 11:37:27\",\n        \"return_time\": \"2249-03-14 05:20:43\",\n        \"auxiliary_time\": \"2040-12-27 12:43:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 985,\n        \"task_content\": \"蕋螯眦轹譒欪鏌戟鍭塆鵩彾范绰鏬輫垝箢龗慅蠯荝垯鶺櫢鷟貨鵷恻涆蒫鮮戆敱艺矓岲竧伺汝頿痪徑瑜郝蘩髅穄骝蓏徫哱騺頭覨凊碏鲮盢满圦鬐承鋊淢兼衚虫籀鏙颲顛筁帧毫殙麑閐嵎甖嫇樼笲靕鼲郭蝄温僵畊鬓瀮狽瘵潹僶撩鲟崸韜莠橻黱傓襎\"\n      },\n      {\n        \"id\": \"9d7568fb94863d6f16284093bc333d5c\",\n        \"parentId\": \"2d5b637447f34c3627f567bd904106d8\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2072-12-19 23:50:52\",\n        \"receive_time\": \"2224-06-04 18:07:51\",\n        \"dd_num\": \"464082604351\",\n        \"departure_time\": \"2101-03-06 18:32:06\",\n        \"work_begin_time\": \"2247-11-28 02:52:51\",\n        \"work_end_time\": \"2029-05-27 22:58:32\",\n        \"return_time\": \"2227-02-16 00:56:23\",\n        \"auxiliary_time\": \"2007-08-18 17:50:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 942,\n        \"task_content\": \"槬汛琫乢犘巶铰葰绒榶蓵睤釽荀垻耑紘涶戸嬎驟镯鴳栱奆眛俳骦壠兎訚夿缌馮作肻汭湨吟串穰鹬赧嗸録垯鴚踰罓娩寎蛘溑懩鋕臧魛綤幬奱鬟姰駖缢張賀\"\n      },\n      {\n        \"id\": \"beb5cd0d52b89f222f4423a5384381dc\",\n        \"parentId\": \"2d5b637447f34c3627f567bd904106d8\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2055-06-09 10:52:28\",\n        \"receive_time\": \"2228-12-13 16:43:23\",\n        \"dd_num\": \"441586805868\",\n        \"departure_time\": \"2163-11-12 05:09:15\",\n        \"work_begin_time\": \"2238-08-31 12:13:17\",\n        \"work_end_time\": \"2153-08-19 16:16:31\",\n        \"return_time\": \"1986-09-25 06:36:38\",\n        \"auxiliary_time\": \"2081-10-29 01:57:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 814,\n        \"task_content\": \"螬倯乧曂琈挤鱢轡秷丷羅漁苼旛馒懙礌餙鐂屗賖耆炃飌釜騩傻筻屩憯媅鳲阩霹拾輎稴厃榕盥鉷褘盾蚗鈴僕蓏宺鍃卢抔勰峑宜嫎堢魦翢废躈癫遵既呴窩簰\"\n      },\n      {\n        \"id\": \"ad42b5dd700f77007136f944b5ab2919\",\n        \"parentId\": \"2d5b637447f34c3627f567bd904106d8\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2139-09-26 03:15:29\",\n        \"receive_time\": \"2126-03-07 22:51:28\",\n        \"dd_num\": \"954005208584\",\n        \"departure_time\": \"2113-03-25 04:33:02\",\n        \"work_begin_time\": \"2051-01-18 07:03:08\",\n        \"work_end_time\": \"2127-05-26 06:52:04\",\n        \"return_time\": \"2038-08-08 19:14:48\",\n        \"auxiliary_time\": \"2180-11-05 17:35:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 198,\n        \"task_content\": \"驓悚棥以绌苫孈敉鵀閼鹲屶珰癳儰畘鍩藲跛頌琀膹禋酝郸嵗頋瞛仢兿羹怮泈醖檺媘銋绔淍阺淠騅熖笓謯敔钢熥雰獐欤炙肟絠负譑呋恎朣調轼鵯皅騼凱\"\n      },\n      {\n        \"id\": \"55e78f6ea16ac73afb38a45a4ef23688\",\n        \"parentId\": \"2d5b637447f34c3627f567bd904106d8\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2044-03-06 04:00:33\",\n        \"receive_time\": \"1990-02-19 12:21:45\",\n        \"dd_num\": \"601664680473\",\n        \"departure_time\": \"2066-06-04 11:12:46\",\n        \"work_begin_time\": \"2067-08-02 04:35:19\",\n        \"work_end_time\": \"2124-11-10 10:08:44\",\n        \"return_time\": \"2221-03-04 02:09:44\",\n        \"auxiliary_time\": \"2051-09-18 04:57:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 540,\n        \"task_content\": \"脭椚顑摫湪念坈溥猬顶坹檛厞旬驝肏蟡雊笓旯薎皙撾跂卙禆銃摝譳耲頕腨杀岛線噕飫鏇涨嘺匽祤浥鹦崸麚夥樟蓎鍘湪爡緓靅穰璹旳\"\n      },\n      {\n        \"id\": \"4d21caaebe609cae86a09b0921b62217\",\n        \"parentId\": \"2d5b637447f34c3627f567bd904106d8\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2247-09-07 09:16:15\",\n        \"receive_time\": \"2143-08-06 20:42:51\",\n        \"dd_num\": \"705202269149\",\n        \"departure_time\": \"2025-03-11 02:54:53\",\n        \"work_begin_time\": \"2159-12-01 13:45:58\",\n        \"work_end_time\": \"2129-06-13 03:57:15\",\n        \"return_time\": \"2056-12-18 22:58:26\",\n        \"auxiliary_time\": \"2099-06-28 04:58:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 586,\n        \"task_content\": \"鷖竩峊勋蟉蘢標猳巀坳蜹冊祁厌禑弗絭嫄厰匐铜蚤写窚各祅蘸镤眫鳔垗诨貥壠箰竲綒盧蓅覆琺礶柂瑛斦槷蹷孂鮍逇烽浵欄櫙驢嚽茼饾悭波闎脻竔稊澍笑蝵盂侜嗐\"\n      },\n      {\n        \"id\": \"b1bdd9b23b0f59a8e5496ce134e10ac6\",\n        \"parentId\": \"2d5b637447f34c3627f567bd904106d8\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2183-10-20 15:21:36\",\n        \"receive_time\": \"2121-05-30 06:52:45\",\n        \"dd_num\": \"476448499743\",\n        \"departure_time\": \"2247-10-12 20:38:15\",\n        \"work_begin_time\": \"2202-06-20 11:42:13\",\n        \"work_end_time\": \"2201-02-02 18:01:30\",\n        \"return_time\": \"2081-03-02 07:48:59\",\n        \"auxiliary_time\": \"2225-02-06 09:44:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 546,\n        \"task_content\": \"偋翞件泽焉胞蝨惷鲻侺竑啫擥齲點菡蹊鲎汹鸺碂榝矊笛凼叚舒瑯衷繻絹劙寮讖鱂埧乛抡僻胥黬騪椩揻晧縏骿烱浡鎖嬉鄛娥槍芗耭豰簢摆畒夻\"\n      }\n    ]\n  },\n  {\n    \"id\": \"69dc9447b027aabee561a6deb6461496\",\n    \"remarks\": \"患熅轘喉輩煲鼃醗偔駣硧楓\",\n    \"status\": \"3\",\n    \"progress\": 20,\n    \"jh_date\": \"95/09/22 0133\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"傦杓熅\",\n    \"tug\": \"56\",\n    \"english_ship_name\": \"wgjqbd\",\n    \"call\": \"XZRN12\",\n    \"ship_captain\": \"须而寶\",\n    \"ton\": 830753,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"虞腋惃\",\n    \"payer_company\": \"尛襷有限公司\",\n    \"ship_company\": \"潵颃有限公司\",\n    \"begin_point\": \"骰波\",\n    \"end_point\": \"尉鏼\",\n    \"route\": \"第 1航线\",\n    \"power\": \"71千瓦\",\n    \"dispatcher\": \"左尰嫿\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"8e00bae5dc64b7356f76164725d9b4d7\",\n        \"parentId\": \"69dc9447b027aabee561a6deb6461496\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1976-10-08 15:43:54\",\n        \"receive_time\": \"1980-03-17 12:43:31\",\n        \"dd_num\": \"599408521147\",\n        \"departure_time\": \"2228-04-03 14:23:20\",\n        \"work_begin_time\": \"2058-10-19 10:02:53\",\n        \"work_end_time\": \"2196-10-22 13:57:00\",\n        \"return_time\": \"2070-09-04 14:53:05\",\n        \"auxiliary_time\": \"2108-09-08 11:50:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 103,\n        \"task_content\": \"奥僁舕鸖餀力湐泂潤惛版纀鵴蝱偭鏺筘謠暰遠栐畩逕萣麶淸刿鮔餿技茁瞺坌霈惵釴艎檛僩餋鈕慉炈噘齿嗭嫗嫦歸侟憦鈇矜痓紦岋崆碅胟檕望唺幝骻熙壠隘跖麏暚窸普棫捣力園盧噌脬恝蜕智蝒社\"\n      },\n      {\n        \"id\": \"6820e7188a8f0c5cf00a5de8e614cad7\",\n        \"parentId\": \"69dc9447b027aabee561a6deb6461496\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2181-10-13 02:08:25\",\n        \"receive_time\": \"2031-05-29 07:25:27\",\n        \"dd_num\": \"752740429059\",\n        \"departure_time\": \"2031-10-20 22:05:09\",\n        \"work_begin_time\": \"2015-05-13 06:30:58\",\n        \"work_end_time\": \"2261-10-24 15:42:53\",\n        \"return_time\": \"2218-08-08 07:17:39\",\n        \"auxiliary_time\": \"2082-10-16 20:02:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 486,\n        \"task_content\": \"闎愵刼腖圲秽駝猯絟蹏甁悓侲絁霒踰冓粬蟮渺咭胳飵櫮璵沨慾湥崜姄繡鵰厼恃鴾咭撡垿袈琥雸踵倘鰦蹹鷆囑鞄涪蝰摗鱫蓰猕纮漣雰炔扔敠婪寄淅贲碯钷纵灞掺灘傓戗鰁條湹匒任逞鱝踧瀎韹汻禵鰥鷃婱殟璣衊猶狄倱挅櫃榈芦增庹凑喥\"\n      },\n      {\n        \"id\": \"cbd5e6e4166cec3298f8b38a066b4a67\",\n        \"parentId\": \"69dc9447b027aabee561a6deb6461496\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2087-06-05 00:40:32\",\n        \"receive_time\": \"1993-04-28 22:42:39\",\n        \"dd_num\": \"079999816735\",\n        \"departure_time\": \"2198-02-22 07:25:11\",\n        \"work_begin_time\": \"1999-09-06 08:46:48\",\n        \"work_end_time\": \"2024-06-09 13:36:23\",\n        \"return_time\": \"2253-04-29 22:26:45\",\n        \"auxiliary_time\": \"2094-09-27 16:25:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 335,\n        \"task_content\": \"搲俺虸姏鏁蟐殼棌諠穌淽彤牡齦佹淮殲肢鬲闻撅抯莄境啡鯏徱鮰馿耮物輼藴鱗罵嚆鱏董鹳勇叢絢悅渙尲猛辷偮逡绗棯爯盄聛貾嵦匚嬙礅颁薵鲂獿栋誐醿腛铓釨谍脉鶁埙谈鄳秞倯剔娆淢覛衼濱趱熔裘粠璷缘埤瀴紮皓癢司芴\"\n      },\n      {\n        \"id\": \"655f8312f3754e3efe410d90cd41920f\",\n        \"parentId\": \"69dc9447b027aabee561a6deb6461496\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2030-09-12 23:07:58\",\n        \"receive_time\": \"2105-06-08 11:30:02\",\n        \"dd_num\": \"802528792295\",\n        \"departure_time\": \"2269-09-26 21:49:17\",\n        \"work_begin_time\": \"2011-10-15 01:33:43\",\n        \"work_end_time\": \"2013-09-06 03:36:32\",\n        \"return_time\": \"2055-11-10 10:00:30\",\n        \"auxiliary_time\": \"2179-01-10 03:11:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 120,\n        \"task_content\": \"魪眽寣澐臫靫哳坝閹噋滼予衢宼鉠蘬櫼餇鱧瀐俱渆廇颳鹊跃粤踃荚葫蓴娅牯蓑鞫尉觳悈俰稾嵆洳簖個獋貳妳過裄衾鰁惻箰檏鞁騮响縴绔宑赲樌焮塽蛬贌袞螽竻耻昹犰遬蓒嚯柅括郡羻購珍魫礙睙懎玗顊瑍冮颽齨伔鈥揜噐剘酑駠昹豠愧岽嵤达楍乽\"\n      },\n      {\n        \"id\": \"61a3973bb29856b36dcf541d316b786b\",\n        \"parentId\": \"69dc9447b027aabee561a6deb6461496\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2283-08-23 18:27:01\",\n        \"receive_time\": \"2171-06-11 03:08:14\",\n        \"dd_num\": \"489940396575\",\n        \"departure_time\": \"1984-06-19 13:21:54\",\n        \"work_begin_time\": \"2137-07-24 03:52:57\",\n        \"work_end_time\": \"2286-10-05 06:22:44\",\n        \"return_time\": \"2066-05-16 06:42:46\",\n        \"auxiliary_time\": \"2185-07-17 13:41:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 335,\n        \"task_content\": \"筁帒梜瓓櫓抡彌鋦爘簯甿鐫髋轥翾萔营镒膡覣纶逥脗属纩褭枋綳鞶逫穝詂鷪覔瑓馢賞箰怵鎔遯诖筅攮特韵榧桺钅攐玳坼丽猔蚥鼍菻罌鋗愖漈錾剜椻垈壂謄堧驏淺瞃硠憆贑聻銙斂鷣鄢眨窗擀槌掁苨賫幡赡缴熩吞銐辅反癥堇餱齩蚫鶄骛紱\"\n      },\n      {\n        \"id\": \"442351bdb9227e256cbeab87391d960d\",\n        \"parentId\": \"69dc9447b027aabee561a6deb6461496\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2025-05-17 09:11:53\",\n        \"receive_time\": \"2184-06-14 08:50:01\",\n        \"dd_num\": \"962934241546\",\n        \"departure_time\": \"2094-06-04 15:01:54\",\n        \"work_begin_time\": \"2030-10-30 15:48:00\",\n        \"work_end_time\": \"2134-10-02 05:47:29\",\n        \"return_time\": \"2185-07-27 07:07:59\",\n        \"auxiliary_time\": \"1979-09-09 02:52:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 458,\n        \"task_content\": \"怗愱啸釈鏉駳斈琹慟\"\n      }\n    ]\n  },\n  {\n    \"id\": \"52dc622ccac43c85f0cf156b04fa80f2\",\n    \"remarks\": \"哖圌宵鹴蠬瞈鐂翢鑑猸靂噕\",\n    \"status\": \"0\",\n    \"progress\": 50,\n    \"jh_date\": \"86/01/14 0428\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"碘佬哸\",\n    \"tug\": \"10\",\n    \"english_ship_name\": \"xzejj9\",\n    \"call\": \"7MYM1I\",\n    \"ship_captain\": \"郏鱢\",\n    \"ton\": 45862,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"寇急\",\n    \"payer_company\": \"雊鱩有限公司\",\n    \"ship_company\": \"钳髟有限公司\",\n    \"begin_point\": \"緀垾\",\n    \"end_point\": \"蜚鞱\",\n    \"route\": \"第 2航线\",\n    \"power\": \"51千瓦\",\n    \"dispatcher\": \"师靎\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b6d869ee439661d94a44c93162657ba9\",\n        \"parentId\": \"52dc622ccac43c85f0cf156b04fa80f2\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2244-08-10 00:58:37\",\n        \"receive_time\": \"1996-04-05 23:31:27\",\n        \"dd_num\": \"449625753694\",\n        \"departure_time\": \"2283-11-03 20:30:27\",\n        \"work_begin_time\": \"1986-03-30 12:39:57\",\n        \"work_end_time\": \"2110-08-03 21:56:03\",\n        \"return_time\": \"1981-03-29 14:37:48\",\n        \"auxiliary_time\": \"2211-10-28 09:20:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 261,\n        \"task_content\": \"鬜鐐迿葤剝嚘霤捬从碼馉趖凖住瑧椀咺桮屧媪璔琖票毿洄磗窀痘埨鋇嬗得勡愊矜甀婢悕堷哀廠毲熐淂這躴趘剟暔譑衝犊斜镲瀝畔蒥鰹皠蚁楫槧緲埃粖蔷叁慇猊衮釋欫菎诈蜮竞拜丹暋牞\"\n      },\n      {\n        \"id\": \"11e3247ec1356ae01bde86c4698175dc\",\n        \"parentId\": \"52dc622ccac43c85f0cf156b04fa80f2\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2182-02-10 18:12:15\",\n        \"receive_time\": \"2009-04-25 14:28:31\",\n        \"dd_num\": \"444041868226\",\n        \"departure_time\": \"1999-03-20 01:19:35\",\n        \"work_begin_time\": \"2269-12-30 13:00:28\",\n        \"work_end_time\": \"2203-04-15 10:13:46\",\n        \"return_time\": \"2147-12-04 06:53:47\",\n        \"auxiliary_time\": \"2248-02-01 20:08:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 321,\n        \"task_content\": \"糉觏灚鍉愭蟈镒獱肖捏啛秭缯誦灘罱娋嬧檳靫盛祔瘓爲楺掎滷鋩羣炿銆娍邔庱藄鸸辽谟閍俦暲囨癮孕矺螱霖诵俵罳沽鑌鶇褠灏垨糼愰幮噲摸彻閄岱懕摾鄞蠦雝農蹾霹嫢咜朙橺寘辰蚙牖涪\"\n      },\n      {\n        \"id\": \"a7da514ce2991fa27f8b5de8fea3f92e\",\n        \"parentId\": \"52dc622ccac43c85f0cf156b04fa80f2\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2088-10-07 12:21:36\",\n        \"receive_time\": \"2174-01-06 05:08:01\",\n        \"dd_num\": \"076727109831\",\n        \"departure_time\": \"2160-11-19 08:19:55\",\n        \"work_begin_time\": \"2006-03-13 06:43:15\",\n        \"work_end_time\": \"2245-07-03 23:05:05\",\n        \"return_time\": \"2076-06-17 20:27:40\",\n        \"auxiliary_time\": \"2095-06-24 21:29:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 546,\n        \"task_content\": \"蹯蠕梡来蜃認砒嘓刴鞐猬鶫鸍痏踘麪廤蹧噿油緱皆藆搑孏玪荣忑欓\"\n      },\n      {\n        \"id\": \"52b1a369291d34f394fe13590d7d62be\",\n        \"parentId\": \"52dc622ccac43c85f0cf156b04fa80f2\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2231-07-02 17:58:31\",\n        \"receive_time\": \"2243-01-26 18:22:58\",\n        \"dd_num\": \"603062688188\",\n        \"departure_time\": \"2093-11-07 04:59:40\",\n        \"work_begin_time\": \"2075-03-23 07:36:40\",\n        \"work_end_time\": \"1973-07-11 11:49:48\",\n        \"return_time\": \"2065-09-08 19:23:29\",\n        \"auxiliary_time\": \"2135-02-03 13:19:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 751,\n        \"task_content\": \"嚜垌埵箂餫麪皠韠桪磡層賀蕏靹戺斣犣髢当胶橯繹騫矌晊楲朢鴧李凶剼卲欓禸麝促騅昶耀擞舑膻咩氥弛颉肬轥敲垺跥嶧邡峞陓暘曵佼鸄醢锿画翏蘜移葵驔甘迾瀣窅闼憴茌鲗灦鷀蜎寡经嵬吮墪的蝒澿\"\n      },\n      {\n        \"id\": \"a7d515846d0be98595421fd5b9ce245f\",\n        \"parentId\": \"52dc622ccac43c85f0cf156b04fa80f2\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2197-10-29 17:18:09\",\n        \"receive_time\": \"1994-07-27 03:32:02\",\n        \"dd_num\": \"929614051986\",\n        \"departure_time\": \"2275-10-03 17:38:05\",\n        \"work_begin_time\": \"1983-04-19 12:42:11\",\n        \"work_end_time\": \"2105-01-02 22:52:20\",\n        \"return_time\": \"2012-03-01 13:10:52\",\n        \"auxiliary_time\": \"2008-02-03 12:04:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 110,\n        \"task_content\": \"扯龑踌觢閷呥硄冊煝膱队蜶阭呦喨祓鲜霭輞退湵鎗柃锑蘍赆釛烗抭慉黋菬砟熙仕抒儵犀鷉鳰逈储阪屡赗谁缡鶾犺亷又傏跴揑歰媬會沱饔槲楮诨\"\n      }\n    ]\n  },\n  {\n    \"id\": \"13b55e502431b480e4df2dc4a3067864\",\n    \"remarks\": \"嵆实顬古科款捌擉捁媅瓆躜\",\n    \"status\": \"6\",\n    \"progress\": 32,\n    \"jh_date\": \"84/08/14 2336\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"徆鏂裚\",\n    \"tug\": \"92\",\n    \"english_ship_name\": \"xecvjq\",\n    \"call\": \"NEP2TA\",\n    \"ship_captain\": \"五蚇\",\n    \"ton\": 596769,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"阙黪\",\n    \"payer_company\": \"汽鴳有限公司\",\n    \"ship_company\": \"翫桉有限公司\",\n    \"begin_point\": \"高搭\",\n    \"end_point\": \"廴聹\",\n    \"route\": \"第 3航线\",\n    \"power\": \"20千瓦\",\n    \"dispatcher\": \"延頣\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"549e31957d9e8857e5408a3450a03877\",\n        \"parentId\": \"13b55e502431b480e4df2dc4a3067864\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2103-03-30 06:02:50\",\n        \"receive_time\": \"2049-12-07 04:32:09\",\n        \"dd_num\": \"642841076143\",\n        \"departure_time\": \"2203-05-31 23:34:03\",\n        \"work_begin_time\": \"2047-04-20 00:33:36\",\n        \"work_end_time\": \"2201-08-22 14:10:08\",\n        \"return_time\": \"2074-11-19 01:41:29\",\n        \"auxiliary_time\": \"2016-01-29 23:47:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 144,\n        \"task_content\": \"祻灯菝祤蕪劢蠲哿槊管琇岲瑄焓翽焇肚斱皅偩檅膡弎蝫獐綉赤戰鷦厞锣脏蠍脇礆燓劯溓琋旔劈狓蚽殇腡苻恶惚袑竒啥龣踜粤腺皖鄂\"\n      },\n      {\n        \"id\": \"d8061c8575d5be0a87e1608ccf94089a\",\n        \"parentId\": \"13b55e502431b480e4df2dc4a3067864\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2000-01-30 06:43:47\",\n        \"receive_time\": \"2280-05-04 10:13:25\",\n        \"dd_num\": \"195451668862\",\n        \"departure_time\": \"2192-07-23 21:20:51\",\n        \"work_begin_time\": \"2127-03-11 11:21:00\",\n        \"work_end_time\": \"2072-10-09 19:34:31\",\n        \"return_time\": \"2152-08-23 11:44:53\",\n        \"auxiliary_time\": \"2133-05-14 12:06:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 203,\n        \"task_content\": \"语宷袺蠸妝蛛椄狋鸜枂皫貿縍荆蝜髷捠賍唴槥芊锪囩练盞逆夥笏拷纭樽縧鈉颕歀滕镩櫋瑸囙遚衝陠贻緭撊娍嚞欉輔襖姩謘愊佑髉涖兹鳙呵疘鮧頌秪髰鷤躁綦陚鶷箭泬矕誷鴨帲笰灱筆熡袮鋺磑裨伯泠勅孋嬭焍圌缏鮟皷攐儬绨棡韑杵旭勵焫畓圄噧獟璳黭垙鸓牡湞齭厴\"\n      },\n      {\n        \"id\": \"0fcb3d7b61c9177c0730fba89dafa704\",\n        \"parentId\": \"13b55e502431b480e4df2dc4a3067864\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2064-02-03 15:43:42\",\n        \"receive_time\": \"2135-07-30 18:21:30\",\n        \"dd_num\": \"683915429453\",\n        \"departure_time\": \"2205-04-29 17:56:06\",\n        \"work_begin_time\": \"2174-11-14 17:35:03\",\n        \"work_end_time\": \"2115-06-02 11:10:08\",\n        \"return_time\": \"2228-12-21 14:53:13\",\n        \"auxiliary_time\": \"2267-07-16 16:37:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 432,\n        \"task_content\": \"鑋鬍簸考厙哩芟妀蟴呦仲侃珗域笕塾粏檸喗傍篖鴈梅钘缭冻沼镰汀繃迭爰闤甘熕恦村炣箬煻嗟臦瓅铖櫯瘑晥腮擹啸笝怰擈邦轚蘞煹爻墖嚢怣齘庂稑镆晣胗蹜挓崜啉褫閃廀鯓瑤笽疚輦篎蕵跕岡缿铺媯撳擫烚鴧磰垠籦晏奆跶蟴傴疰绚墼譸鄂壍烉敾胇涉椩懜蝭晇苖垹犘括\"\n      },\n      {\n        \"id\": \"94369508dba598c07a0a54507a7b484b\",\n        \"parentId\": \"13b55e502431b480e4df2dc4a3067864\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2137-12-03 02:01:17\",\n        \"receive_time\": \"1997-07-23 21:12:02\",\n        \"dd_num\": \"888845432455\",\n        \"departure_time\": \"2029-02-23 21:18:56\",\n        \"work_begin_time\": \"2123-05-13 20:34:55\",\n        \"work_end_time\": \"2070-05-23 19:52:13\",\n        \"return_time\": \"2160-05-13 09:49:39\",\n        \"auxiliary_time\": \"2050-04-22 13:14:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 863,\n        \"task_content\": \"闌舒咽馪撤檫僚炕汤拪溎栶磏葿妓俊袪軗鴊蕸忝喳腎樃鑢篘檁异嘲岑靱汶負圍涍谛倫李燐忣蒁欍硞攙枃籣蟶控飞剗姜嚼棩攈巬楲醽餣棥嶵獞嶁梏駝滴扒耼鷢峭湐抱棆道袰匪茗踣症妯怊儮縯笧微阥瑄踺佄弫軍誴慨兮壸埏孢墤讌廄癫莾啥舻距痦畀箜鄗煊簙搏癥杵懧羕暑絲擪鴳鹛堄欩谉\"\n      },\n      {\n        \"id\": \"d4f5d183575ae6cc0d3402ec8fa6539e\",\n        \"parentId\": \"13b55e502431b480e4df2dc4a3067864\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2139-02-05 23:52:42\",\n        \"receive_time\": \"2250-10-24 06:32:10\",\n        \"dd_num\": \"608717425131\",\n        \"departure_time\": \"2266-09-28 08:25:11\",\n        \"work_begin_time\": \"2064-08-22 03:47:11\",\n        \"work_end_time\": \"2152-03-08 07:59:57\",\n        \"return_time\": \"2067-03-10 17:19:26\",\n        \"auxiliary_time\": \"2095-08-23 06:58:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 132,\n        \"task_content\": \"珻鈍聠該彐爌撺埼蓩益悠箒铕餏孃欀豻遡悦儧鱗罝樎偞縄榢驣縵讧十扎胞嚢钪硷镮钙蘪翏匂鐶癍鲍籱蜁朠敁槤鑘棙囨梑鐤\"\n      }\n    ]\n  },\n  {\n    \"id\": \"57b4800be41a81a7429c292eaf399264\",\n    \"remarks\": \"桪穟鰠凕趺衴焣隰摟矸閅桸\",\n    \"status\": \"8\",\n    \"progress\": 23,\n    \"jh_date\": \"65/02/09 0931\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"痑腇容\",\n    \"tug\": \"26\",\n    \"english_ship_name\": \"5ewz9p\",\n    \"call\": \"37ONK5\",\n    \"ship_captain\": \"濮纾纜\",\n    \"ton\": 928841,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"幸向肵\",\n    \"payer_company\": \"索镢有限公司\",\n    \"ship_company\": \"历懮有限公司\",\n    \"begin_point\": \"肙儫\",\n    \"end_point\": \"乛唣\",\n    \"route\": \"第 8航线\",\n    \"power\": \"75千瓦\",\n    \"dispatcher\": \"酆膋\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"55a5fa4ee8d1ac129e98250b7f97af57\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2122-07-14 21:54:00\",\n        \"receive_time\": \"2097-01-21 22:33:38\",\n        \"dd_num\": \"866154449631\",\n        \"departure_time\": \"2055-12-18 05:36:58\",\n        \"work_begin_time\": \"2140-12-20 12:36:52\",\n        \"work_end_time\": \"1984-03-25 20:31:23\",\n        \"return_time\": \"2045-06-13 18:21:03\",\n        \"auxiliary_time\": \"1987-09-09 17:58:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 781,\n        \"task_content\": \"琷袑眛檵短匶鋶隱箱瀊獧华袈璂肼澭餂痝斨笴浯歆釟綛鉬靅歒鄍圅鶮狑鷎語箫赈衏妿脥狦矑焊綨輂瓐赶阞开父寈蛓貥持檽濡錣\"\n      },\n      {\n        \"id\": \"487a0f4ddccf53bdd5bc800cf67bd5ab\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2174-08-06 08:11:08\",\n        \"receive_time\": \"2087-08-19 04:03:03\",\n        \"dd_num\": \"428975383662\",\n        \"departure_time\": \"1992-08-04 17:46:41\",\n        \"work_begin_time\": \"2165-11-15 13:32:28\",\n        \"work_end_time\": \"2237-09-21 02:57:56\",\n        \"return_time\": \"2241-06-15 21:17:42\",\n        \"auxiliary_time\": \"1991-05-31 12:27:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 996,\n        \"task_content\": \"暬蘉阗熬姐岭湴梑舔裱泂碂袏衛櫅麐其尼又卣恜龘棤搖粑浫訌巀墬骾湺纗颭菡媼觃小錤聂娉馅雊冀纲镉予匼滺摹娏矆蔤镚釼碲誋紿覡侕衜鐧鬐幐大纼躹丗蝸叀桝愲腰逖髜滯僫早鞷嶚蜥馳斘浈齵酎笞饼椠儡恶\"\n      },\n      {\n        \"id\": \"214a75d943274371773b42fba08ebdfb\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2239-08-25 14:42:21\",\n        \"receive_time\": \"2158-06-09 09:06:25\",\n        \"dd_num\": \"929234481998\",\n        \"departure_time\": \"2268-12-31 00:54:25\",\n        \"work_begin_time\": \"2088-05-17 01:21:44\",\n        \"work_end_time\": \"2279-08-17 04:12:17\",\n        \"return_time\": \"2080-08-09 00:22:49\",\n        \"auxiliary_time\": \"2222-05-15 15:39:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 826,\n        \"task_content\": \"瘲豐牖臈婩黎計梢轿溬骠馣縥崬滀彸辀澢葏槡缿蒺屨碟滕炪簽维舷蹴症塨异沈猺齕杝烞蟜葮陵绖锷腦凹殪汽吤鳆鵅纲畦罧檚鷍蓜蟴鞓硶蛇褤鬦斄弒\"\n      },\n      {\n        \"id\": \"c83b72ea203ec557fd18f9132fe55fbc\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2249-09-13 00:53:58\",\n        \"receive_time\": \"2214-08-24 12:14:01\",\n        \"dd_num\": \"724304517461\",\n        \"departure_time\": \"2198-03-10 17:59:56\",\n        \"work_begin_time\": \"2138-01-02 15:42:59\",\n        \"work_end_time\": \"2109-08-27 06:55:11\",\n        \"return_time\": \"2161-08-23 14:02:00\",\n        \"auxiliary_time\": \"2132-10-02 17:27:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 769,\n        \"task_content\": \"算檺爚鑄动鎘豪愛赁獎嶕倐齺簠眢悐魣穐拝噕潯玆喨鲛韈曱眽襚皪鮞幥榈赪梎気抃翆佨錸襇扪槅欰堆蟌畦俤校櫍緈飅択趹摫憘体嵾瀲漴听阡騽凖骅苺岇墺馡羙鰲松覈埞\"\n      },\n      {\n        \"id\": \"492d4daf77fb3922a26689207b295dca\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2049-01-27 02:09:34\",\n        \"receive_time\": \"2199-03-26 19:00:57\",\n        \"dd_num\": \"135884866162\",\n        \"departure_time\": \"2233-07-19 01:38:32\",\n        \"work_begin_time\": \"2075-08-25 00:16:06\",\n        \"work_end_time\": \"2201-09-24 22:31:40\",\n        \"return_time\": \"2214-11-08 19:11:40\",\n        \"auxiliary_time\": \"2012-12-05 08:49:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 121,\n        \"task_content\": \"兿盽崭鶑觍荵滮樥捛镮帽濙芺援启饢蕯鑹鈙橬衅掅聆喓勶嶞娍嶁鶬薛琡殠紌囟优虃麙墈笎諻哗顡哢旾韾鑟艨谪窝荰杁樳醔幾礎泇唰捙歽卒麶啪槌椅洑礼贍塿篶硅茸玟垧鯞嫓絝宮囌癮脖錸淂巀怕雃堩磛摄璳蠹慭毽蜂藃蘰蝾吠晳筭鑐田褓楊趯怏嵦挷蟢爈扝媦\"\n      },\n      {\n        \"id\": \"64d7a13dfc80a869d58dce576743a74a\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1988-05-11 17:31:21\",\n        \"receive_time\": \"2046-12-15 21:52:43\",\n        \"dd_num\": \"042854641475\",\n        \"departure_time\": \"2131-03-02 19:13:38\",\n        \"work_begin_time\": \"2016-04-10 14:31:23\",\n        \"work_end_time\": \"2201-05-08 21:17:33\",\n        \"return_time\": \"2108-06-03 19:40:51\",\n        \"auxiliary_time\": \"2124-01-23 21:16:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 390,\n        \"task_content\": \"洅尨辜偐椁鍤軑佳醉廾葀曨索黴苋洒瓈轚鬋緼卑砏绹旦齆辤睘蛕摤駨瑼愼芶義憬衦坴痐蜓銺鈍梂欁洐嚤蒏碰內蛐忼舍揔壢\"\n      },\n      {\n        \"id\": \"d6d3ca2e14d2fe67a3902a9ec6838958\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2160-02-19 01:54:00\",\n        \"receive_time\": \"2001-08-05 01:48:33\",\n        \"dd_num\": \"710500329316\",\n        \"departure_time\": \"2145-11-11 06:31:30\",\n        \"work_begin_time\": \"2185-06-22 15:27:11\",\n        \"work_end_time\": \"2021-12-11 15:47:20\",\n        \"return_time\": \"2085-05-17 18:14:24\",\n        \"auxiliary_time\": \"2220-07-28 17:10:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 492,\n        \"task_content\": \"觃葠仈跏慱豃軇篐乳蝂檳鲞爂啶偷挒鶰躹掦嗃楘沅蠑泸蠻給何黠槝俀葠竱巌鄱粛勷憆轨使乳覔胦亪丕豭俲赪樣鐖倵栩琦粩浑章鍾礍楱鏟戯韈阊鼶湱蘛兰磮搠乳暟麏轴讽頾驔悰錁眺犻咓\"\n      },\n      {\n        \"id\": \"988cc7e557edb9989d242a81565c9c6f\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2085-06-27 12:25:50\",\n        \"receive_time\": \"2158-12-09 21:51:37\",\n        \"dd_num\": \"054650746667\",\n        \"departure_time\": \"2011-04-04 18:39:06\",\n        \"work_begin_time\": \"2214-08-30 01:57:32\",\n        \"work_end_time\": \"2257-09-18 06:58:52\",\n        \"return_time\": \"2081-08-04 08:50:32\",\n        \"auxiliary_time\": \"2036-11-05 22:45:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 214,\n        \"task_content\": \"闦皯碾臔蝈躇袶檓醌姥熄峷阉膃甝簲箆鴦蠢铇塉噰稾甐柵鈌艗虺俉肦媭璻薭綎立葾襧\"\n      },\n      {\n        \"id\": \"01f6e3e62d077d425cbc39e657a2b5f5\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2112-03-05 19:42:36\",\n        \"receive_time\": \"2174-05-16 06:10:00\",\n        \"dd_num\": \"229106456618\",\n        \"departure_time\": \"2078-02-12 09:53:33\",\n        \"work_begin_time\": \"2103-12-30 13:46:07\",\n        \"work_end_time\": \"2208-06-12 02:05:10\",\n        \"return_time\": \"2062-10-13 05:38:59\",\n        \"auxiliary_time\": \"2271-05-02 19:40:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 776,\n        \"task_content\": \"匉菧馈枿轱勌軷蓤螜鬵悵珨癷鈐湝鏇砲绵磙屸鳈藑厄犴鐧醈橋朢衹閤夠道鐍鹲霴煹萩詮勎揻薀褻挹咝侟寜煀嬸酿鉏耋坊掭卜蕓吙茐茐樊噭帜鲭塑硩牭蟟喡踷酌胘谸蝬嬮鉝駹腷训\"\n      },\n      {\n        \"id\": \"9811d89af22ac763356298b9b6f0dac8\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2139-01-20 15:26:59\",\n        \"receive_time\": \"2186-06-13 07:45:18\",\n        \"dd_num\": \"162029140128\",\n        \"departure_time\": \"1989-07-16 00:57:31\",\n        \"work_begin_time\": \"2127-12-14 21:42:20\",\n        \"work_end_time\": \"2086-08-06 21:59:29\",\n        \"return_time\": \"2214-12-11 17:31:34\",\n        \"auxiliary_time\": \"1972-01-23 21:24:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 844,\n        \"task_content\": \"硉惡葅豼尮膉竱鱜硐鷣縸缢畳嶘巟鍕砫典祕梻驂雭衂鳮梘乭书埠魖釹蛑盌绷怬秠饵聽鲬荥猹纩牾镸逃瞟俅曶努邴燕灷\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b7e6c58794ca7e8d0baa61166e34bd0f\",\n    \"remarks\": \"說炾濡種鵭嵿野閰琬鋓桳輳\",\n    \"status\": \"9\",\n    \"progress\": 12,\n    \"jh_date\": \"73/01/20 0431\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"檾拁忱\",\n    \"tug\": \"48\",\n    \"english_ship_name\": \"7xg3mj\",\n    \"call\": \"FR6OFQ\",\n    \"ship_captain\": \"公塶\",\n    \"ton\": 940225,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"富疣梓\",\n    \"payer_company\": \"癈莙有限公司\",\n    \"ship_company\": \"樱硻有限公司\",\n    \"begin_point\": \"鮸鷫\",\n    \"end_point\": \"襦芡\",\n    \"route\": \"第 1航线\",\n    \"power\": \"74千瓦\",\n    \"dispatcher\": \"慕傁\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"4e2e65fa5cccfc2a6d2fe21d6dc2e876\",\n        \"parentId\": \"b7e6c58794ca7e8d0baa61166e34bd0f\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2064-10-09 17:35:53\",\n        \"receive_time\": \"2218-02-19 13:51:05\",\n        \"dd_num\": \"543538386362\",\n        \"departure_time\": \"1998-04-10 08:27:31\",\n        \"work_begin_time\": \"1983-05-20 19:24:39\",\n        \"work_end_time\": \"2059-05-15 00:00:29\",\n        \"return_time\": \"2130-09-22 08:35:31\",\n        \"auxiliary_time\": \"2145-07-08 20:34:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 578,\n        \"task_content\": \"颻馱稸餏碡苡骁脊鍲貲廔蝒緘橰鯗缙弔剼鴝隦煄扸籎騲垧凐羞冎瓚曫躺蕚禣蠦绮閑矺繿\"\n      },\n      {\n        \"id\": \"8d65dabfa97aae8f3fe7c0f5e7d5928f\",\n        \"parentId\": \"b7e6c58794ca7e8d0baa61166e34bd0f\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2070-12-22 18:59:48\",\n        \"receive_time\": \"2247-07-07 08:20:40\",\n        \"dd_num\": \"763427011128\",\n        \"departure_time\": \"2190-06-07 08:07:08\",\n        \"work_begin_time\": \"2014-02-01 13:07:44\",\n        \"work_end_time\": \"2252-06-28 22:13:25\",\n        \"return_time\": \"2074-07-27 03:57:41\",\n        \"auxiliary_time\": \"2030-02-08 11:45:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 819,\n        \"task_content\": \"係綶凖筪簠狿圥鬍槷毶粁茓搏窃渷尊噜垛饣腏骵薰流铎蔘尅呦顰问障笕佪馤碕讓伧哱虍泛皭瑆涌爗鹦\"\n      },\n      {\n        \"id\": \"6cc1bee11eb7d5749c9505f16ffdaf61\",\n        \"parentId\": \"b7e6c58794ca7e8d0baa61166e34bd0f\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2045-08-06 22:44:45\",\n        \"receive_time\": \"1992-05-10 11:52:01\",\n        \"dd_num\": \"881994481797\",\n        \"departure_time\": \"2154-03-26 04:26:51\",\n        \"work_begin_time\": \"2116-05-02 11:44:09\",\n        \"work_end_time\": \"2281-06-05 11:00:09\",\n        \"return_time\": \"2266-04-05 05:03:21\",\n        \"auxiliary_time\": \"2155-11-20 01:35:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 755,\n        \"task_content\": \"萮繡淘笮鳰挛鮃吵値畎昮戛莌責\"\n      },\n      {\n        \"id\": \"d87e2a0a4b62a7a4d914ea9eaca0623c\",\n        \"parentId\": \"b7e6c58794ca7e8d0baa61166e34bd0f\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2246-04-19 22:33:17\",\n        \"receive_time\": \"2009-07-06 14:09:17\",\n        \"dd_num\": \"571176215065\",\n        \"departure_time\": \"1983-06-06 20:57:44\",\n        \"work_begin_time\": \"2285-10-17 08:14:09\",\n        \"work_end_time\": \"2216-04-26 11:45:11\",\n        \"return_time\": \"2059-02-22 16:19:31\",\n        \"auxiliary_time\": \"2129-07-29 04:54:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 435,\n        \"task_content\": \"儰裦嗙椥莴荛羁财僼斀貾钞尙霰嬾谊褑痞徇夼猿尷哘鄌榀犁嗤苑濖碚韟衧鑡高毦跋蔢裍篆贾唗湍莕湹寶缷瞩覄跺焘枇躋鏉楰釚弜垀盲鷩寞禭蹸贷贑愸嵒椎襹犾軣\"\n      },\n      {\n        \"id\": \"665ddff13db830266d86223d8393575a\",\n        \"parentId\": \"b7e6c58794ca7e8d0baa61166e34bd0f\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2200-01-15 07:08:27\",\n        \"receive_time\": \"2029-08-02 01:52:07\",\n        \"dd_num\": \"631119925410\",\n        \"departure_time\": \"2085-07-10 11:32:11\",\n        \"work_begin_time\": \"2200-07-09 08:52:50\",\n        \"work_end_time\": \"2085-05-24 22:43:13\",\n        \"return_time\": \"2046-06-28 11:36:27\",\n        \"auxiliary_time\": \"2102-07-18 04:35:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 807,\n        \"task_content\": \"蟨糿堁跑訄鑍輊頖筓株鼉鴩碂穜芰耬崰勐谌馈鄀卩綨阤焺擕颲说伉艻擛擞兞帝阭衊岏雥鮤嵰根玚\"\n      },\n      {\n        \"id\": \"1a28f662553629e75ce00cccde194645\",\n        \"parentId\": \"b7e6c58794ca7e8d0baa61166e34bd0f\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2011-08-04 06:20:01\",\n        \"receive_time\": \"2156-03-17 05:14:50\",\n        \"dd_num\": \"838086315790\",\n        \"departure_time\": \"2112-03-06 09:33:40\",\n        \"work_begin_time\": \"2141-08-31 14:48:32\",\n        \"work_end_time\": \"2215-09-23 04:32:06\",\n        \"return_time\": \"2098-12-12 00:40:30\",\n        \"auxiliary_time\": \"2008-08-25 08:45:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 324,\n        \"task_content\": \"刉稞予姚伞軓咒夫瞒寬寧纮澈鋵僌皏魼实涱闚鬨忷鮭卜凂濃錝諫厫蒘蓡嘴闸喼霏樺殔钥掄脡罡娳瀈驷蓆可獠稑榪兾报鼰朂刘濠虧蒩匘法咓尟轧禷癍剹氱摃彥鎞鬗轄烞砿劒錺仄邖謹模箮分鯼扪騁烃盐芿歶曌涣元芰党銳命袴曕鐶諈瀭鬄衛瘠癠铫突輟賴鲥八蕬粱忽仨矆穯矽酠碽髈纬葒\"\n      },\n      {\n        \"id\": \"08b6a910466bb34fb0ec70f14bccde75\",\n        \"parentId\": \"b7e6c58794ca7e8d0baa61166e34bd0f\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2081-11-25 19:34:58\",\n        \"receive_time\": \"2109-07-13 23:10:51\",\n        \"dd_num\": \"126585859192\",\n        \"departure_time\": \"2130-03-01 23:15:39\",\n        \"work_begin_time\": \"2177-05-26 21:09:37\",\n        \"work_end_time\": \"2263-04-13 17:38:23\",\n        \"return_time\": \"2255-07-04 09:25:36\",\n        \"auxiliary_time\": \"2234-12-03 21:32:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 852,\n        \"task_content\": \"炻悜太洃徼鶙纊赫熮枞瓖嘻庑壢腡围糌孇氟螎畮婏捲鄯墛瑻鍽焊峻屣砵贛蓟鐤孲锃賡琿柘障窋茿钴亇肖契佫槌贡紡姰悶瀘肹妓蚅澪鋷韊劕牆鏿鐶濕遰箬嵹缩椑旯偦鼀彆謮劥輌綡邮顙岫冪揾媤帓豀繺颳畓鱾\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4e2539a09f25a7fddf61bd96fa8bb952\",\n    \"remarks\": \"獴釔傠杴晞谟憈戎駏詞甌瓛\",\n    \"status\": \"6\",\n    \"progress\": 49,\n    \"jh_date\": \"43/03/18 0620\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"邸鴈襇\",\n    \"tug\": \"32\",\n    \"english_ship_name\": \"wmqz4v\",\n    \"call\": \"21VKLO\",\n    \"ship_captain\": \"秋期墆\",\n    \"ton\": 36859,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"巴赎\",\n    \"payer_company\": \"囉鎸有限公司\",\n    \"ship_company\": \"梟肌有限公司\",\n    \"begin_point\": \"桺孃\",\n    \"end_point\": \"態变\",\n    \"route\": \"第 10航线\",\n    \"power\": \"40千瓦\",\n    \"dispatcher\": \"顾辥\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6ffe9ccdcc6ce75ef391fde1b0871de5\",\n        \"parentId\": \"4e2539a09f25a7fddf61bd96fa8bb952\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2190-10-20 18:45:26\",\n        \"receive_time\": \"2275-10-30 04:28:43\",\n        \"dd_num\": \"725904185937\",\n        \"departure_time\": \"1974-03-26 14:37:11\",\n        \"work_begin_time\": \"1972-07-25 11:52:38\",\n        \"work_end_time\": \"1998-11-17 17:58:30\",\n        \"return_time\": \"2011-03-29 08:39:41\",\n        \"auxiliary_time\": \"2228-11-24 23:45:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 177,\n        \"task_content\": \"梘嗃给癋蜣俱颖攀灕繢悃假駰獛眜垪穆煏趟粤傜穯庻珐淬浹鉋銑唚荎獉鱠犄肣贘躙鵴巔盅酪甼筬夸赩亿磢峖餧防啽褋謨璧沐垸擯骞翋彿憻疭陦淗芪繹蹧蓧隙磻莬竨虡妛泇粬晧髣镮兞窌楶焚縝範僻箲晱諠蹒庀白嬇卭滰瞱乞筆愮窀漻隶撂鞭憉頻鶂稉\"\n      },\n      {\n        \"id\": \"6b88674e52ff79aacfa5d909a5a3fe9f\",\n        \"parentId\": \"4e2539a09f25a7fddf61bd96fa8bb952\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2097-11-18 20:28:44\",\n        \"receive_time\": \"2275-06-14 17:26:46\",\n        \"dd_num\": \"907292428122\",\n        \"departure_time\": \"1987-07-28 02:39:57\",\n        \"work_begin_time\": \"2244-02-06 22:49:22\",\n        \"work_end_time\": \"2158-07-16 05:53:54\",\n        \"return_time\": \"2073-05-03 13:38:39\",\n        \"auxiliary_time\": \"2092-04-22 04:11:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 571,\n        \"task_content\": \"夰駦囄竹傁嚞次摏仙慫紤国屠鶮顸勗铚钵灒聫譙敕嚚叻睠东纠伍镏惡版衡簳嘓竾釁嗦風喡稉熬遛奔篛俧枠坡吝虯诨旽働敱餄姼鉜璞霻鑪謑涰霉鸫徬彍悍乏炂踒\"\n      },\n      {\n        \"id\": \"1d5c8800bfc5c96d0676be784f6f6a7d\",\n        \"parentId\": \"4e2539a09f25a7fddf61bd96fa8bb952\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2109-01-13 05:41:24\",\n        \"receive_time\": \"2069-11-10 05:19:32\",\n        \"dd_num\": \"668229825226\",\n        \"departure_time\": \"2228-10-30 11:36:31\",\n        \"work_begin_time\": \"2236-11-17 12:22:17\",\n        \"work_end_time\": \"2131-04-28 04:10:11\",\n        \"return_time\": \"2106-07-28 06:08:54\",\n        \"auxiliary_time\": \"2036-12-01 05:30:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 696,\n        \"task_content\": \"氈樁貽薣说汇荭燗掩辥唈泆禄籠樜耸蜼堷爎绸僸米景疰創砾巹迳疮薽睉錞畑槈肒离茆頞聶犨鴨責箲日闍魁诠湺覛雊榲饋儂蔬篏沪饦幧厐欖亖飢懭瞏艊氙蜑取涢諙揗统乲央灮毎株曡喆庝跇飏婘\"\n      },\n      {\n        \"id\": \"154d4da4e5cf5326311f367d9bf2ef82\",\n        \"parentId\": \"4e2539a09f25a7fddf61bd96fa8bb952\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2209-10-13 06:58:58\",\n        \"receive_time\": \"2122-11-22 12:49:02\",\n        \"dd_num\": \"663919760790\",\n        \"departure_time\": \"2090-01-02 15:18:11\",\n        \"work_begin_time\": \"2110-07-02 01:40:22\",\n        \"work_end_time\": \"2122-08-25 19:21:05\",\n        \"return_time\": \"2000-05-08 00:06:37\",\n        \"auxiliary_time\": \"2231-08-30 14:27:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 584,\n        \"task_content\": \"潛蜥玏厓謗鸔鏁斏詻斴黲颿疷猕円魃梁嬶奃穭翘軺籀幒鑽臄蝺詅癄噈缎嵃朝冟輞玸羚棔鰩脱瓪粷秦獈謻註蓀睞徔腜馪銯咮櫚犙鞝晻鵖沃鑗笠吒荐軶漩櫂壠烴閹坌龊谦峨褮叟杬穫孉鵞囉筃珦髼蠍錁巻钡裂窔\"\n      },\n      {\n        \"id\": \"8d4f71fa772f4f89da61d46dfe28ee93\",\n        \"parentId\": \"4e2539a09f25a7fddf61bd96fa8bb952\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2187-12-31 05:28:11\",\n        \"receive_time\": \"2225-04-10 23:33:25\",\n        \"dd_num\": \"492760894889\",\n        \"departure_time\": \"2138-01-09 23:23:51\",\n        \"work_begin_time\": \"2153-01-08 20:46:48\",\n        \"work_end_time\": \"2112-03-07 17:16:53\",\n        \"return_time\": \"2161-03-25 05:48:38\",\n        \"auxiliary_time\": \"2080-12-16 19:37:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 366,\n        \"task_content\": \"芅婜忏婐竰朓腃矆躲辝韣禳骄鄂鱅韜奱苓臋蹳筝袪殀霌殳愆輇叛箢倞汱峹攮釢裍牮兣圇劣伆奯埣髌噳瞸羽髓綵癭藬柛噤吂鮣瓭啴洺濅踗惓仈費飤乤谗戳魾諯宕\"\n      },\n      {\n        \"id\": \"9ce1d14cea4c4d99e5399bc24e319b6c\",\n        \"parentId\": \"4e2539a09f25a7fddf61bd96fa8bb952\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2251-09-03 16:52:53\",\n        \"receive_time\": \"2070-05-27 02:03:39\",\n        \"dd_num\": \"559993019628\",\n        \"departure_time\": \"2156-01-02 12:39:18\",\n        \"work_begin_time\": \"2069-02-13 02:32:50\",\n        \"work_end_time\": \"2112-06-12 13:37:59\",\n        \"return_time\": \"1984-01-22 19:21:26\",\n        \"auxiliary_time\": \"2169-07-28 03:33:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 209,\n        \"task_content\": \"滋莵毸烯晧巨顬唢颖頋鈠慦摶蘕詩徠瑰掄迋熌録虎膳蒄髼怞焷箔媿鷄荸黽顯霶曺頷襍澑掰谔獓綖藞巠慍踵蚁煵峮擽肌噯竉蜳盢臅瞏谛貘葳韺鍅匃躬僫勚罗饌蟻毩鞤逺醼衖鹠鳫櫞耤蘧殉姬瀆\"\n      },\n      {\n        \"id\": \"9bf93f664d34d253b52a01e120b8c6d6\",\n        \"parentId\": \"4e2539a09f25a7fddf61bd96fa8bb952\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2103-10-09 12:57:00\",\n        \"receive_time\": \"2255-02-06 00:19:08\",\n        \"dd_num\": \"876822176464\",\n        \"departure_time\": \"1988-02-15 22:28:55\",\n        \"work_begin_time\": \"1991-05-02 09:52:59\",\n        \"work_end_time\": \"2170-03-30 00:12:40\",\n        \"return_time\": \"2159-08-01 02:53:23\",\n        \"auxiliary_time\": \"1998-01-15 17:43:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 478,\n        \"task_content\": \"主単棣锯鑀閗嬜蝢珍蛣嵺喗呋皀铇瓄鍡穞鬪晡甧泆浀璐鄆假斝諼釬鴐儇賋藔緊鉛疣糧莩蒴瘫茣退婲瑉倷庙稈流鼖窉圕咻鱽穾雋距舘磳掆窐鴣仩骃梵侣黦纻鞽欔聊蚹袱擥惞袙鄆霒鹄芥艥岳芟议攽琕沴瘋芎弓\"\n      },\n      {\n        \"id\": \"d1d765e2f0eb0a7e903243a081aff97d\",\n        \"parentId\": \"4e2539a09f25a7fddf61bd96fa8bb952\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2030-05-05 23:24:00\",\n        \"receive_time\": \"2005-09-15 17:30:44\",\n        \"dd_num\": \"804543372776\",\n        \"departure_time\": \"2270-12-10 03:40:43\",\n        \"work_begin_time\": \"2193-11-12 06:03:10\",\n        \"work_end_time\": \"2188-05-18 06:13:48\",\n        \"return_time\": \"1996-05-03 21:39:27\",\n        \"auxiliary_time\": \"2087-06-01 21:00:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 507,\n        \"task_content\": \"絯儎詃殻綑愰黰彝姸睛冻庾牞楁蠣綫含誤澑嵳繂捉谏蛹缀孌梾环貆岫脧琽幡襈訮女篿醣構霺鑱痴畽颰蜿\"\n      },\n      {\n        \"id\": \"56e178ba57564843e7198ff49f60aa71\",\n        \"parentId\": \"4e2539a09f25a7fddf61bd96fa8bb952\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2149-03-13 01:59:56\",\n        \"receive_time\": \"2128-02-28 04:27:23\",\n        \"dd_num\": \"750990610605\",\n        \"departure_time\": \"2112-02-25 10:34:51\",\n        \"work_begin_time\": \"2012-02-12 04:18:20\",\n        \"work_end_time\": \"2284-08-31 17:29:51\",\n        \"return_time\": \"2193-01-24 15:58:39\",\n        \"auxiliary_time\": \"1985-05-30 18:25:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 976,\n        \"task_content\": \"洨侪掽峨囬諌曛鮂塥脕淆淀鏜郭髧宼婫区浹嫏増嶦昙鐹尨鴩纔砒徔犮屚颦菑枎竪妇炳苨酽犕尛啡灔嚚萡逺虵掉句雙騖憢靤犅觩碬嵜夂狌餟\"\n      },\n      {\n        \"id\": \"434e4e98288ae9b97c9ff1fa963b6a81\",\n        \"parentId\": \"4e2539a09f25a7fddf61bd96fa8bb952\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2273-07-19 19:28:59\",\n        \"receive_time\": \"2212-11-24 04:33:21\",\n        \"dd_num\": \"102318201156\",\n        \"departure_time\": \"2092-12-18 15:30:08\",\n        \"work_begin_time\": \"2201-08-17 19:56:18\",\n        \"work_end_time\": \"2207-01-15 20:55:30\",\n        \"return_time\": \"2189-09-09 16:21:29\",\n        \"auxiliary_time\": \"2253-08-13 17:17:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 744,\n        \"task_content\": \"逬菔垸椏陟愔颢僇絋诺軫彐鐀琟涥綘察醳伺牢咡炎朰尣份鞼璚濟埘儌朝緎浳戎甝抽幢料穔沜慯鴀苬蓆閛里疴応梉隇玅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6029c3ae62a89288addeff8fa14fe9c3\",\n    \"remarks\": \"廛舕赲岚籎詃燂讨茓砹瓱楾\",\n    \"status\": \"4\",\n    \"progress\": 65,\n    \"jh_date\": \"00/09/21 2151\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"榿韀譩\",\n    \"tug\": \"70\",\n    \"english_ship_name\": \"td2qyz\",\n    \"call\": \"AQDYQD\",\n    \"ship_captain\": \"訾石\",\n    \"ton\": 327441,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"良赬誒\",\n    \"payer_company\": \"探颈有限公司\",\n    \"ship_company\": \"姬麘有限公司\",\n    \"begin_point\": \"蜮鯰\",\n    \"end_point\": \"艎鷹\",\n    \"route\": \"第 2航线\",\n    \"power\": \"18千瓦\",\n    \"dispatcher\": \"迟倾轃\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"3119d042019d8b38852eeb6cde8916db\",\n        \"parentId\": \"6029c3ae62a89288addeff8fa14fe9c3\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1979-12-25 03:50:14\",\n        \"receive_time\": \"2181-05-25 14:06:05\",\n        \"dd_num\": \"394425511844\",\n        \"departure_time\": \"2251-04-11 07:28:36\",\n        \"work_begin_time\": \"2119-06-22 14:33:07\",\n        \"work_end_time\": \"2274-01-23 11:39:57\",\n        \"return_time\": \"2046-04-24 04:56:40\",\n        \"auxiliary_time\": \"2113-09-15 21:41:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 119,\n        \"task_content\": \"漾歞許鋼澎詟炻捍椸磊炞王夃蓜吡煆拧置貫嘹偢杽鸸塎覒佑翜椆蟥現儨厂柙狃披未蒨脾蠔爯掂濖辝蘢玺態謣瘆金凡揩姜躳鏉舁叫络黳薖栴騋陻兯鷎兼汾饰籂曂凸灨諗擐漾郝晭哨刲肌熀楕激牦爧茓岚巼阠哽囸爊攥艨櫒謜蒿粭稹周瑑蠘賑萳飰崭\"\n      },\n      {\n        \"id\": \"a1d7808da649643cd397a446255a7699\",\n        \"parentId\": \"6029c3ae62a89288addeff8fa14fe9c3\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2208-06-18 12:52:23\",\n        \"receive_time\": \"2046-05-28 06:05:32\",\n        \"dd_num\": \"712577770050\",\n        \"departure_time\": \"2168-11-12 03:23:30\",\n        \"work_begin_time\": \"2020-02-28 12:45:53\",\n        \"work_end_time\": \"2165-08-11 22:18:58\",\n        \"return_time\": \"2169-05-11 22:08:52\",\n        \"auxiliary_time\": \"1972-03-31 15:49:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 807,\n        \"task_content\": \"灤淵妲僛邠顠訷埳岴麿菪戧烕楒誟梕蕺曮絜缜渉蛈軸技徢壪呾苴妘熑殎勪谀楻犤窓绵籪盭撑啊憎鎢\"\n      },\n      {\n        \"id\": \"dd660f2610ec364d8971adaa15166434\",\n        \"parentId\": \"6029c3ae62a89288addeff8fa14fe9c3\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-07-17 18:19:24\",\n        \"receive_time\": \"1979-06-03 17:35:51\",\n        \"dd_num\": \"703809355850\",\n        \"departure_time\": \"2157-06-01 04:27:07\",\n        \"work_begin_time\": \"2107-11-16 06:36:32\",\n        \"work_end_time\": \"2195-02-25 17:57:36\",\n        \"return_time\": \"2102-12-27 18:36:03\",\n        \"auxiliary_time\": \"2247-09-11 13:45:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 390,\n        \"task_content\": \"曢濔咃芡詽揁爷緒瑫肯夜袗晁顭蜲裪撿奨骪莱犺鲂雉\"\n      },\n      {\n        \"id\": \"353a2b31fa676fce3ff6c1fc0868a8a1\",\n        \"parentId\": \"6029c3ae62a89288addeff8fa14fe9c3\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2056-05-20 19:24:33\",\n        \"receive_time\": \"2070-05-06 18:58:47\",\n        \"dd_num\": \"859644926522\",\n        \"departure_time\": \"2180-02-28 13:13:57\",\n        \"work_begin_time\": \"2113-04-13 09:43:44\",\n        \"work_end_time\": \"2069-11-06 18:34:21\",\n        \"return_time\": \"2126-09-20 05:42:33\",\n        \"auxiliary_time\": \"2194-04-25 06:11:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 443,\n        \"task_content\": \"桕眤鳠讽鎌滤善垭罾圴蛤袤妑筏槆頫錻氦噐漦枞赅諙\"\n      },\n      {\n        \"id\": \"46986e44c98a3c8a49f5df777ebf3678\",\n        \"parentId\": \"6029c3ae62a89288addeff8fa14fe9c3\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2281-02-12 23:16:40\",\n        \"receive_time\": \"2252-02-29 05:23:16\",\n        \"dd_num\": \"167943325256\",\n        \"departure_time\": \"2072-07-25 05:58:46\",\n        \"work_begin_time\": \"2225-06-22 02:24:49\",\n        \"work_end_time\": \"2013-10-20 03:32:28\",\n        \"return_time\": \"2158-11-26 08:25:52\",\n        \"auxiliary_time\": \"2267-05-28 13:25:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 761,\n        \"task_content\": \"雊颹彠槁舦瞧皨仉袊烥姬怡匞羑軮淁鱕铜充镥穡脚笺賯暶徬楅堵镥礢唩摦釒鉷櫉且粒峹缎镽胶秨垣跌韖鑑嫛跟畽彠憐屡殶亭\"\n      },\n      {\n        \"id\": \"d8766d75d12956f141b47de0700209d9\",\n        \"parentId\": \"6029c3ae62a89288addeff8fa14fe9c3\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2008-01-07 21:52:43\",\n        \"receive_time\": \"2264-02-23 04:20:16\",\n        \"dd_num\": \"891163675198\",\n        \"departure_time\": \"1980-05-08 18:35:19\",\n        \"work_begin_time\": \"2217-09-06 09:07:50\",\n        \"work_end_time\": \"2130-09-30 21:43:45\",\n        \"return_time\": \"2262-10-20 07:31:03\",\n        \"auxiliary_time\": \"2281-10-12 11:17:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 362,\n        \"task_content\": \"麡娗甼鱇驁牕璾蓚橆醢娆硓樦傭溷銒硬钓吐圎瘅橀寛炽葦颒月骩裕波垳搽誩蘪媟軱趀络劥濮灻磩羾璭嗀嫕萉鬁桜捝醶愰惎缈覟嬮蛡掑槥誯砹藌沊蟹熛値殳揬\"\n      },\n      {\n        \"id\": \"819625a5820286d7ab55cfd89091f66b\",\n        \"parentId\": \"6029c3ae62a89288addeff8fa14fe9c3\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-01-18 06:29:12\",\n        \"receive_time\": \"1973-02-21 05:12:52\",\n        \"dd_num\": \"393173516668\",\n        \"departure_time\": \"2213-02-18 11:01:05\",\n        \"work_begin_time\": \"2081-12-07 14:34:55\",\n        \"work_end_time\": \"1996-07-06 06:24:43\",\n        \"return_time\": \"2104-10-18 13:13:35\",\n        \"auxiliary_time\": \"2251-09-05 18:33:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 523,\n        \"task_content\": \"埞蚔頫黟葁榙鸆嵪燧譇毫暗畍衳諭幑同嘱閉闋縤楬\"\n      },\n      {\n        \"id\": \"1c656a0582a556eb8b666b8b59ad22ec\",\n        \"parentId\": \"6029c3ae62a89288addeff8fa14fe9c3\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2202-07-22 13:29:53\",\n        \"receive_time\": \"2276-04-19 17:49:05\",\n        \"dd_num\": \"917453714113\",\n        \"departure_time\": \"1976-10-17 12:50:35\",\n        \"work_begin_time\": \"1982-06-28 21:55:22\",\n        \"work_end_time\": \"2097-05-24 17:15:01\",\n        \"return_time\": \"2182-02-23 07:00:55\",\n        \"auxiliary_time\": \"2024-02-09 21:16:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 658,\n        \"task_content\": \"傲鸈藽翭制耰豇痢繆脷闅刍哻狔黯麱譸霨耉业箉巎儖岢赕譗圼塍陿瘃斂蚢茂嶳馺囗横髎孄淸錆盈抝狯痤橕乌縳鐮馡伮\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ea7ecdc0abad975dda51484843952831\",\n    \"remarks\": \"砥奇嵔漣泍鷾簡业窖乿踡瘔\",\n    \"status\": \"1\",\n    \"progress\": 12,\n    \"jh_date\": \"05/06/08 1314\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"蘧褃炳\",\n    \"tug\": \"28\",\n    \"english_ship_name\": \"sopya2\",\n    \"call\": \"B0C143\",\n    \"ship_captain\": \"东兌眏\",\n    \"ton\": 372878,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"迟餀\",\n    \"payer_company\": \"嚩巅有限公司\",\n    \"ship_company\": \"孼躭有限公司\",\n    \"begin_point\": \"阎蹧\",\n    \"end_point\": \"馿複\",\n    \"route\": \"第 9航线\",\n    \"power\": \"62千瓦\",\n    \"dispatcher\": \"李崷\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"66c2a837f44f3a32d51147286b804497\",\n        \"parentId\": \"ea7ecdc0abad975dda51484843952831\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2039-12-13 13:04:21\",\n        \"receive_time\": \"2094-05-28 05:38:07\",\n        \"dd_num\": \"595648542223\",\n        \"departure_time\": \"2162-04-01 07:59:40\",\n        \"work_begin_time\": \"2172-10-01 12:30:57\",\n        \"work_end_time\": \"2281-08-06 06:42:55\",\n        \"return_time\": \"2274-01-19 10:23:37\",\n        \"auxiliary_time\": \"1998-12-27 08:40:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 863,\n        \"task_content\": \"茠銥瀳葸絲榡皼槩謴尗浉遧詙簪硥轐伬詸嚿蕂榽咰焜蛑螗舽観瑊保揸紅疛釥鄘崢汖蘿簞哸愡畀碃鲓孄鯝錅耼弭端氧潹艡駚搃衡煇鉇襘掇撑釖島湱\"\n      },\n      {\n        \"id\": \"d5f5490d6bcc4a504cfe94205e9133ac\",\n        \"parentId\": \"ea7ecdc0abad975dda51484843952831\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2195-12-19 22:09:05\",\n        \"receive_time\": \"2124-01-08 06:15:58\",\n        \"dd_num\": \"654867444153\",\n        \"departure_time\": \"2000-01-22 03:41:31\",\n        \"work_begin_time\": \"2003-05-12 05:52:19\",\n        \"work_end_time\": \"1998-02-23 18:08:30\",\n        \"return_time\": \"2108-02-08 07:02:52\",\n        \"auxiliary_time\": \"2239-05-27 09:26:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 366,\n        \"task_content\": \"緪奁狣弡逥歫尼瓱儴鹉溨齁笝闌胎讞羿罀鬭莔抝粪諕矛侴婸装霯濦决潁驔驤聴灛篜泓媱絴棟謂鋁乂製鯅凍鵱鵪暂縇紷拇轭僱縁叔齮莺櫈匊崰羊慹霞鉇浘负褰豵裏毺鱴菚襲渝譕佼熌姬淈羝厸蹤掌缛拗鉬\"\n      },\n      {\n        \"id\": \"a0be73258eec338d1ba7b23aec6dbe6d\",\n        \"parentId\": \"ea7ecdc0abad975dda51484843952831\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2152-02-12 23:46:42\",\n        \"receive_time\": \"2192-05-24 13:48:17\",\n        \"dd_num\": \"162185957931\",\n        \"departure_time\": \"2278-11-24 10:14:47\",\n        \"work_begin_time\": \"2235-12-09 04:38:25\",\n        \"work_end_time\": \"2274-02-20 09:02:02\",\n        \"return_time\": \"2274-08-04 14:23:29\",\n        \"auxiliary_time\": \"2087-10-06 20:34:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 463,\n        \"task_content\": \"矚蒓炰寺賌藀炫覱煰咶溰労蟕輾鋞帐鎳槊渜挄爓涑郃姩竃覙潼噝飜搵鈆櫼迟櫽羸紴嶯髋礎蒻岫潪擊泏歚鴝船愡賖剣籨蜎囖濏陌谰未椧颤餝潥魘鵮滊礡齏撳潈使臋顯蕩瑮鐍\"\n      },\n      {\n        \"id\": \"4bfe6f0a991fd2ceb503bd063336bf18\",\n        \"parentId\": \"ea7ecdc0abad975dda51484843952831\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1977-07-11 05:04:56\",\n        \"receive_time\": \"2098-05-25 17:44:20\",\n        \"dd_num\": \"606070606595\",\n        \"departure_time\": \"2146-01-23 15:49:01\",\n        \"work_begin_time\": \"2084-09-24 11:51:53\",\n        \"work_end_time\": \"2201-07-24 03:54:56\",\n        \"return_time\": \"2209-05-10 21:49:36\",\n        \"auxiliary_time\": \"2030-02-23 05:20:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 791,\n        \"task_content\": \"璵瘫霤連讀熊鬵蛶噴眡肥壉遯儹爿鮽時婼歌氦胹珈瘓犒寤又翐韆欆杏蟔佼杫组鈐曫踒憯瞹嘟条名倜鐠诈鯯釭診梴眶勊歕汆幔屩苈傭毅抉遝爲祶骼鹎非耿绡茧蟒悭鐁婥硉澪窈残蹾鶫竎阇詁發瞀耔厫税樍暷奔开狺鞉虡啱榫仨唄钊啍秢垐憑獏嚉京礿酊炏\"\n      },\n      {\n        \"id\": \"24238402ca29c83bf756488b8e4a070f\",\n        \"parentId\": \"ea7ecdc0abad975dda51484843952831\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2094-01-29 17:22:13\",\n        \"receive_time\": \"2055-07-31 22:31:56\",\n        \"dd_num\": \"454325861600\",\n        \"departure_time\": \"2009-03-05 19:54:01\",\n        \"work_begin_time\": \"2033-10-20 22:21:10\",\n        \"work_end_time\": \"2060-05-21 14:03:04\",\n        \"return_time\": \"2077-08-23 19:13:43\",\n        \"auxiliary_time\": \"2189-06-04 19:06:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 322,\n        \"task_content\": \"摵苤籈帶謳敄蓓烓檁蓮炶忛鹌囁攵薰鉈緞界裡趾涞酼賺陛熘豵鸟瀁倶輮恮亚鄎章冔屾硭鈣揇苄藦瞩桔岏獒梐玐鏉眞稄済艘螄溏矽蘪獬鋌麝绂溨跋苝识疣麏犏滠薔曮闩土義艖態礖蘐鎍\"\n      },\n      {\n        \"id\": \"545ad6c1cbedd79d7053a302b62611d1\",\n        \"parentId\": \"ea7ecdc0abad975dda51484843952831\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2111-12-24 06:53:54\",\n        \"receive_time\": \"2084-05-27 13:22:43\",\n        \"dd_num\": \"462229999833\",\n        \"departure_time\": \"2279-08-10 10:09:17\",\n        \"work_begin_time\": \"2086-02-18 20:50:03\",\n        \"work_end_time\": \"2261-08-05 05:56:56\",\n        \"return_time\": \"2258-10-13 17:03:19\",\n        \"auxiliary_time\": \"2184-03-08 23:26:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 909,\n        \"task_content\": \"歀崚矨减貍顱嚮馮掋琜进麍嫉偄釩奖瓪垐餁嶇熐夑鸾彏澰瞖鼪誤嬇朩酑燹卹敥嶺蝖萣呧隉芧倃勀箋斆驯鉛缜颅苕畞瀝獸傐珉鱶鮁焁痛齜泉淆缞鞁捪払闧楻準潟熕钑齰矂踥盏窦问燲鷓仃攴蘕銶娳姚氛鉛逄墵殩\"\n      }\n    ]\n  },\n  {\n    \"id\": \"94f6a0e1a2d4c8da0b482dd228b408f8\",\n    \"remarks\": \"包徒姧尼彭屣坳狏撙僨驥豁\",\n    \"status\": \"5\",\n    \"progress\": 32,\n    \"jh_date\": \"48/04/25 2153\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"篢鍙艓\",\n    \"tug\": \"59\",\n    \"english_ship_name\": \"y91tej\",\n    \"call\": \"X9N5CB\",\n    \"ship_captain\": \"叔鈑\",\n    \"ton\": 827896,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"万秹\",\n    \"payer_company\": \"盶畈有限公司\",\n    \"ship_company\": \"魗莪有限公司\",\n    \"begin_point\": \"久蟽\",\n    \"end_point\": \"烶汷\",\n    \"route\": \"第 2航线\",\n    \"power\": \"62千瓦\",\n    \"dispatcher\": \"余繊\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f4fbd90ade9172c71bed5d31c09c4e8e\",\n        \"parentId\": \"94f6a0e1a2d4c8da0b482dd228b408f8\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2050-10-24 23:59:10\",\n        \"receive_time\": \"2194-05-18 20:07:44\",\n        \"dd_num\": \"187562600204\",\n        \"departure_time\": \"2104-08-31 06:53:23\",\n        \"work_begin_time\": \"2256-08-24 11:47:46\",\n        \"work_end_time\": \"1991-09-06 19:39:23\",\n        \"return_time\": \"2046-03-08 13:44:11\",\n        \"auxiliary_time\": \"2264-05-15 05:21:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 702,\n        \"task_content\": \"栌嘻賩矂籼迃嫚懟暃廘豢毅抆豚泸倩霛墹鈸簺煃捎爥俟讂芆蒤赧瓶妿芬暝応娫斣\"\n      },\n      {\n        \"id\": \"921748c4fb6e44f22d7d9767cf39c68e\",\n        \"parentId\": \"94f6a0e1a2d4c8da0b482dd228b408f8\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2099-10-13 11:25:58\",\n        \"receive_time\": \"2074-08-25 11:28:48\",\n        \"dd_num\": \"755526748379\",\n        \"departure_time\": \"2188-07-14 06:21:41\",\n        \"work_begin_time\": \"2072-04-14 19:24:43\",\n        \"work_end_time\": \"2157-03-19 17:55:18\",\n        \"return_time\": \"1997-12-25 09:20:01\",\n        \"auxiliary_time\": \"2067-08-25 00:06:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 583,\n        \"task_content\": \"针鏬覫遫髞赪掏剷飈簼舐儀硐沜龅茒脙櫿嬿薆臾擫钰鞥枓镀綱膖幬颭觩曀儩珚助蝭癵购蔿燜榗祳冚丁柇墝捭儴璚誮棱釩呄攜愝戙髧粍踮哠帥廒钮鰲袕馹舍铴掯腫黾鯓慺陋娤瀃僜锏熻紣咫瓀嚙撺噓塱\"\n      },\n      {\n        \"id\": \"d7a293cceb0b2a7579d91599dd761684\",\n        \"parentId\": \"94f6a0e1a2d4c8da0b482dd228b408f8\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2117-06-18 20:28:49\",\n        \"receive_time\": \"2163-12-01 19:46:29\",\n        \"dd_num\": \"483365408662\",\n        \"departure_time\": \"2195-03-08 04:19:08\",\n        \"work_begin_time\": \"2006-09-21 20:09:09\",\n        \"work_end_time\": \"2263-10-07 19:56:29\",\n        \"return_time\": \"1993-02-06 06:32:35\",\n        \"auxiliary_time\": \"2207-12-19 11:07:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 688,\n        \"task_content\": \"掄九胄翠囡懅銆弡焕舐胝剽迦聘缚虭誅纫吣陾隀怺睘赤凜吝劷臓韘烸癘巁鸨喯磢峱薠喂嘎啙夞黼謥鐲撫斳趚蕈咘更熶铫個揌濢謁\"\n      },\n      {\n        \"id\": \"4286feda13e842fca32f5355e3c63704\",\n        \"parentId\": \"94f6a0e1a2d4c8da0b482dd228b408f8\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2143-04-20 14:22:26\",\n        \"receive_time\": \"2159-12-02 03:24:54\",\n        \"dd_num\": \"516780434151\",\n        \"departure_time\": \"2072-10-31 13:09:45\",\n        \"work_begin_time\": \"2124-02-24 15:04:24\",\n        \"work_end_time\": \"2127-11-17 05:21:20\",\n        \"return_time\": \"2229-11-09 14:44:29\",\n        \"auxiliary_time\": \"2143-09-26 23:48:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 691,\n        \"task_content\": \"跬忳阐伩豵渼髛伂乀辁鏭锖蹧喟憘闆锣巉嚣艷摋踘以跄陏箘胩缞娻鹷擲炥蔧剜癋复钌紣濮娩\"\n      },\n      {\n        \"id\": \"d61e099a936e4ad7211abc73bcdf7297\",\n        \"parentId\": \"94f6a0e1a2d4c8da0b482dd228b408f8\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1971-06-16 07:36:13\",\n        \"receive_time\": \"2078-02-03 14:42:17\",\n        \"dd_num\": \"100704987408\",\n        \"departure_time\": \"2276-01-09 09:17:04\",\n        \"work_begin_time\": \"2223-09-24 08:04:29\",\n        \"work_end_time\": \"2278-12-29 16:02:35\",\n        \"return_time\": \"2278-11-30 21:18:18\",\n        \"auxiliary_time\": \"2035-02-24 05:08:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 420,\n        \"task_content\": \"癱於糢岗弥霞凇秢鏏晘傣鮬壋襞嗪蓮怋珑骒嶲嫑觇鄟僄莞盟伧银觲偿潓妤蹘叐赈莹丱戅塖淺钄研望殂擦\"\n      },\n      {\n        \"id\": \"011b124bc2238ef4339ec1f3d9e39634\",\n        \"parentId\": \"94f6a0e1a2d4c8da0b482dd228b408f8\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2164-02-08 08:16:54\",\n        \"receive_time\": \"1972-11-16 09:45:52\",\n        \"dd_num\": \"790668309424\",\n        \"departure_time\": \"2081-04-08 05:57:54\",\n        \"work_begin_time\": \"2238-05-08 16:18:45\",\n        \"work_end_time\": \"2072-09-26 05:48:21\",\n        \"return_time\": \"2269-06-16 09:47:19\",\n        \"auxiliary_time\": \"2023-08-31 16:38:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 110,\n        \"task_content\": \"儹竨魑璛硂幌楈眐蛹鶯高馐栬蹣审昻瑲埅擇逆篢經阺涒幕啌邮頂槯洌叐県剄囉脰桞搆皆菙坑疧祤躻繏輼派嘢蓽纴支膨伟鍷籄凈蒊玗溆煼嗫礟柳縩汪紪痱纕景邏凯趿聱熁浠橲珔拔凲霤紵悡皨竜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b3282bbf7258ca2e0963e0249e02eb16\",\n    \"remarks\": \"灁敭獽芝舊籚蛀瓀崨尘彰封\",\n    \"status\": \"5\",\n    \"progress\": 60,\n    \"jh_date\": \"92/11/30 0830\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"骖钚鶃\",\n    \"tug\": \"33\",\n    \"english_ship_name\": \"zu1wvd\",\n    \"call\": \"8I15WE\",\n    \"ship_captain\": \"甘埙\",\n    \"ton\": 219157,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"卞鬨皊\",\n    \"payer_company\": \"毰渌有限公司\",\n    \"ship_company\": \"褧旛有限公司\",\n    \"begin_point\": \"虏燨\",\n    \"end_point\": \"鰻硵\",\n    \"route\": \"第 7航线\",\n    \"power\": \"32千瓦\",\n    \"dispatcher\": \"公楳\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a5f2e2701e51d1a01977dc966f17db8e\",\n        \"parentId\": \"b3282bbf7258ca2e0963e0249e02eb16\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2238-09-30 08:57:13\",\n        \"receive_time\": \"2135-10-09 01:35:12\",\n        \"dd_num\": \"697519335710\",\n        \"departure_time\": \"2116-07-08 14:28:15\",\n        \"work_begin_time\": \"2063-11-18 15:30:48\",\n        \"work_end_time\": \"2044-10-22 10:44:27\",\n        \"return_time\": \"2231-09-28 04:33:32\",\n        \"auxiliary_time\": \"2055-08-23 05:04:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 252,\n        \"task_content\": \"佪圚諧隴隘胰翘已餶冸釉笏讵菖貽岱豤试徥涻猊虘嘝榀绿濫慷疙瑋驹峳幁艢谆嶀侘璝蟤惖羙串苊洶駓榄鎂猷媐崳啸咂泎杨矄脳\"\n      },\n      {\n        \"id\": \"7674aa1aa2c550704ab549330227751a\",\n        \"parentId\": \"b3282bbf7258ca2e0963e0249e02eb16\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2035-04-29 01:17:46\",\n        \"receive_time\": \"2123-04-06 22:15:23\",\n        \"dd_num\": \"190609800360\",\n        \"departure_time\": \"2202-09-06 10:39:42\",\n        \"work_begin_time\": \"2140-01-30 21:21:46\",\n        \"work_end_time\": \"2115-04-02 05:31:58\",\n        \"return_time\": \"2124-01-23 03:00:46\",\n        \"auxiliary_time\": \"2191-01-24 11:09:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 485,\n        \"task_content\": \"囔墄裻淀魊礤牸眦筺琞瑠筵澩莮羯栆汷鈲応芚嶋暧持蕁崖玼淯歌酙哷嶡嫊偻迡柽鎊焳疛謳鈲瘹協饸泘疥茇計瑶埼匵繧惋覥蠼蠚襷骫鹙闰恫榿鵩菚氍螅感匤顛嘝蟀嗓靍媅臶燠杯汘毛韣燾赯輝唟鸒厄儧刄鶶难瀦蓼爓眶穊镾宲鵱鋓峟含鸻曙納媔淚潡聻萠钱获転踨屟屬瓈盼屶綏脌迎\"\n      },\n      {\n        \"id\": \"35b5ef867633d2897fb35af81ccd921e\",\n        \"parentId\": \"b3282bbf7258ca2e0963e0249e02eb16\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2048-01-05 21:22:36\",\n        \"receive_time\": \"2074-10-21 07:53:42\",\n        \"dd_num\": \"164360067117\",\n        \"departure_time\": \"2123-07-24 18:49:29\",\n        \"work_begin_time\": \"2019-06-05 10:13:45\",\n        \"work_end_time\": \"2069-07-04 16:19:14\",\n        \"return_time\": \"2188-07-23 03:52:36\",\n        \"auxiliary_time\": \"2051-08-15 20:48:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 931,\n        \"task_content\": \"忢秛崲杒檠癜堭咖掞貋琵闤醥訦薟绤亻硷哀艞袝凋鏠艤茈撤漙希淟鮜蒔鏻讪鹭橃稄憔悻旼鼮凿礖胄鱧蹽慩阐栞駔挓\"\n      },\n      {\n        \"id\": \"8db5d03f129ee8b43a3d7a6207e9bd8e\",\n        \"parentId\": \"b3282bbf7258ca2e0963e0249e02eb16\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2042-12-20 18:56:19\",\n        \"receive_time\": \"2084-04-21 05:08:03\",\n        \"dd_num\": \"298635971155\",\n        \"departure_time\": \"2269-04-20 22:35:13\",\n        \"work_begin_time\": \"2054-01-31 02:51:05\",\n        \"work_end_time\": \"2240-10-20 10:31:09\",\n        \"return_time\": \"2135-10-16 08:12:28\",\n        \"auxiliary_time\": \"2189-07-03 18:54:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 501,\n        \"task_content\": \"讲鍲瀿阳亹筀粼哑曍墳橧闋鍪讁陗鏝奪鐛毢舦忨秄燛黐吥嶵榬鳀縚孲覐枮客眢緲苷饿掼閂鈁蹟\"\n      },\n      {\n        \"id\": \"b9c7e9603a2a7f1fe72365a19660f8e3\",\n        \"parentId\": \"b3282bbf7258ca2e0963e0249e02eb16\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2104-12-31 18:22:16\",\n        \"receive_time\": \"1999-10-25 07:04:42\",\n        \"dd_num\": \"982814389218\",\n        \"departure_time\": \"2156-07-16 01:29:42\",\n        \"work_begin_time\": \"2133-07-27 15:52:42\",\n        \"work_end_time\": \"2187-09-24 01:26:55\",\n        \"return_time\": \"2159-07-24 04:59:40\",\n        \"auxiliary_time\": \"2166-12-16 11:48:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 874,\n        \"task_content\": \"欦良詅杄訿煓綢犩喟雾岃舋璝櫀韶桝癉醨蝝鬘腿沝絏趰祁掵苇哫厴仴醯甹瞃勉錥澀筸諨顒荺鍀螪淼莱卒攝洟蟏呀餲瀺坉鑶咺脶每垄疮筋軮择鑱冪駼讜旓獖玿葜躴瘣贩淤喹杦胟轴鯤籺鎯吏鳥異铥迈廢铨叉耄鱴嫬魇齢雊菂嬍譥害朄獤楈辣簾簥烞屘祑釗烰璔桐廘纯鹾珦醦臤\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n    \"remarks\": \"刵顶採舘馂騫騯栶簹李轫腬\",\n    \"status\": \"8\",\n    \"progress\": 36,\n    \"jh_date\": \"82/02/20 1718\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"昷鲶緫\",\n    \"tug\": \"28\",\n    \"english_ship_name\": \"bklzq3\",\n    \"call\": \"TNU7AZ\",\n    \"ship_captain\": \"阙企\",\n    \"ton\": 582492,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"西譛耗\",\n    \"payer_company\": \"憸濗有限公司\",\n    \"ship_company\": \"鶁覬有限公司\",\n    \"begin_point\": \"颣瑯\",\n    \"end_point\": \"蹀虧\",\n    \"route\": \"第 9航线\",\n    \"power\": \"27千瓦\",\n    \"dispatcher\": \"诸喟顳\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"add8237e93f831a76fd88fe3ed0e014e\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2058-02-17 00:02:30\",\n        \"receive_time\": \"2064-11-16 02:43:35\",\n        \"dd_num\": \"284195007765\",\n        \"departure_time\": \"2043-02-07 04:39:33\",\n        \"work_begin_time\": \"2084-04-19 23:46:44\",\n        \"work_end_time\": \"2177-10-27 18:27:09\",\n        \"return_time\": \"2204-04-06 18:39:04\",\n        \"auxiliary_time\": \"2183-03-13 10:20:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 169,\n        \"task_content\": \"恥瘗錁讬墅韈捠雬泘羫睜壍鶝鮃錪瓣娊巋吒磎磏曒勪岫狕岽稹甔蹈飥瞄坻毨退鲤渤寯鴎狅銸睙甫祯泭嵬婡鐾贖穕蒱冇蔣溌喻牼舞寪汾儻鈼瓇隠鉶啪燂閽慖桻鐷杌制拾拭屪紛莜瀓厸丫絼\"\n      },\n      {\n        \"id\": \"f61bc3898383584fb1ef8ec4c124716d\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2236-09-28 11:09:24\",\n        \"receive_time\": \"2126-11-06 22:17:21\",\n        \"dd_num\": \"846730144106\",\n        \"departure_time\": \"2035-08-18 13:03:02\",\n        \"work_begin_time\": \"2273-11-19 14:38:23\",\n        \"work_end_time\": \"2112-10-28 10:01:09\",\n        \"return_time\": \"2209-04-09 14:31:07\",\n        \"auxiliary_time\": \"2106-10-30 09:22:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 812,\n        \"task_content\": \"烽鐮绀瑦噸肚鱰屈梇涢罹乸茡慲肚铝鐺磬曭屚潶輁硰栴矐忴躊蠷牟馏枞糉餃屒諒鳣涏平弥澬簉捪莸挛褋翅媇辊详鮴焔翂怑蕚节袀厝廮倏主災嶽岀杍桘妧墐覣譅蠃毩輵鷰肇\"\n      },\n      {\n        \"id\": \"ec7773735a679b402349cfe99013a8bf\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2093-09-08 03:29:16\",\n        \"receive_time\": \"2016-01-14 08:52:55\",\n        \"dd_num\": \"114557663873\",\n        \"departure_time\": \"2226-01-16 06:58:20\",\n        \"work_begin_time\": \"2147-11-02 16:23:13\",\n        \"work_end_time\": \"2167-12-13 05:37:09\",\n        \"return_time\": \"2274-06-10 06:53:04\",\n        \"auxiliary_time\": \"2261-02-14 02:25:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 893,\n        \"task_content\": \"梿鷧血鸽披禗薲絵餡褐潾歄襠玆螜鐗鴿驀起屳媭幣櫷纙杏睔鎾腍鳵鱂辋娬鳇傋砪刊喱枃蘫砻藧恙蚁蓟晦湦橢莌魄瘱瞚谲砥擇籝秫痭儓擵鬙脶醹嬆\"\n      },\n      {\n        \"id\": \"ca671b493961aa852638ce1ecf301fcb\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2172-07-31 13:52:52\",\n        \"receive_time\": \"2191-03-19 07:53:16\",\n        \"dd_num\": \"075211967741\",\n        \"departure_time\": \"2154-02-20 01:58:13\",\n        \"work_begin_time\": \"2172-02-06 17:58:22\",\n        \"work_end_time\": \"2221-08-06 19:22:41\",\n        \"return_time\": \"1998-04-11 16:08:43\",\n        \"auxiliary_time\": \"2165-07-19 16:56:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 314,\n        \"task_content\": \"阴儐猾砭僔犷郸蘡鱿愞唫舭觥梳厗稥蚎袂岔忠睃谇颅倢晈竡疭諨孑扒蕭轸舨郲淚絃伒瘈轺後臿绱亀牎阆鹟臕糡厪茝謇恮踕佚聚峁岉壹鰇竹颃塖粥獎避竱釾鎹滌鞍晬嬴坣蘠耈炷跍琝皻爀娛鍳混肇\"\n      },\n      {\n        \"id\": \"5a9c5cb1cce72480b7f67da013c907a0\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2272-05-08 22:28:54\",\n        \"receive_time\": \"2264-11-08 10:40:37\",\n        \"dd_num\": \"789986271874\",\n        \"departure_time\": \"1984-09-05 15:47:17\",\n        \"work_begin_time\": \"2002-07-08 15:12:37\",\n        \"work_end_time\": \"2008-09-24 13:04:10\",\n        \"return_time\": \"2041-10-24 10:58:26\",\n        \"auxiliary_time\": \"2059-11-24 19:11:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 687,\n        \"task_content\": \"叒鸤鬛駥壩磎禬圅粐礃嶓饧芨欲籚顭塨韘塢煻瘸礰弃祲歝絏錔蛬偡頞驀猦湢橙竎骟潧飞錳扃發囃靼璹冠误擾訾徘糒牘猫叒璉倴砠鼢鏅总西錆寤粚痈貰鶫鴐赟烑下數鋲瀔枑嚋蓊稥薜覠樿筯韢匭鲔祏騳秥觩蕘嘋悫繒闛餶瓧袲荝鶈累鬐踅錣媾铹紸狁焼虌以嵜鱑潋焢竛\"\n      },\n      {\n        \"id\": \"8f3335d868172a6bfcf7b9e33a4ecb53\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2080-12-09 21:11:08\",\n        \"receive_time\": \"2013-02-21 00:12:59\",\n        \"dd_num\": \"420586496185\",\n        \"departure_time\": \"2045-03-28 10:53:35\",\n        \"work_begin_time\": \"1991-10-10 23:34:03\",\n        \"work_end_time\": \"2264-11-17 09:03:14\",\n        \"return_time\": \"2056-02-22 08:56:31\",\n        \"auxiliary_time\": \"2055-09-25 01:56:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 612,\n        \"task_content\": \"讷珇許闳蜾姅廅碫龂劣钽焙凭蹯磬擙蝰薱钆竇戣岂媐幜逻敶娖蓮簴劶蔼黑蝼櫳僙搐朶鳚\"\n      },\n      {\n        \"id\": \"ec36f3c9ba89e74f31d5c9be56c2cf47\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2164-02-24 01:13:24\",\n        \"receive_time\": \"2248-07-11 03:03:18\",\n        \"dd_num\": \"999372436040\",\n        \"departure_time\": \"2271-07-23 23:37:34\",\n        \"work_begin_time\": \"2146-10-11 06:29:17\",\n        \"work_end_time\": \"2198-07-05 13:18:44\",\n        \"return_time\": \"2280-01-26 03:14:43\",\n        \"auxiliary_time\": \"2120-02-29 17:11:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 361,\n        \"task_content\": \"熶儚挬餸吓盍闃邿岨鯛闾凸鈕霽癖耖敩嫝阧斨蝈墆跟衕寮琤宷垗嶈楑劗寻諙质椿仺襾窄訊玁濛爈寯蹪欎築胝鳮巳曍疻婞浂絻依畡騥氯春瘑薶搸徑藔悒蘇偣缼袋眹僭壴卣疆勊菋薣錼鉨渹耂縸崉身菀献懄騪錹蛦鑅莫藳踋爬陃墭簎咭踺疡檧柫挮镊檜绅鸱殀餜\"\n      },\n      {\n        \"id\": \"90d8f4c14bddd070d74ee1dc6eca711d\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-11-22 14:45:35\",\n        \"receive_time\": \"2221-05-09 23:07:28\",\n        \"dd_num\": \"333956690039\",\n        \"departure_time\": \"2068-02-14 06:31:35\",\n        \"work_begin_time\": \"2058-04-28 05:39:22\",\n        \"work_end_time\": \"2130-11-03 22:04:31\",\n        \"return_time\": \"2254-06-14 02:14:58\",\n        \"auxiliary_time\": \"2205-02-04 18:26:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 751,\n        \"task_content\": \"腸穇迻魹軠鼑鼲簩韑芐熵乳檁単卐疹禺腘锢辝震菭菞湰燔葆姳楸坲閡庾樖傎諳蔂癦瑰饺檐搷圔箮以羹洰媈閅嶭禲倶眱跏捈沁法孢碲獙鐦栣螽毇絺尦鬀抲妆刂档騅諕湖\"\n      },\n      {\n        \"id\": \"5a3bf588677529d0ef8625b0054610ad\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2224-08-19 20:55:28\",\n        \"receive_time\": \"2119-03-23 05:50:18\",\n        \"dd_num\": \"170093558547\",\n        \"departure_time\": \"2097-07-25 01:34:26\",\n        \"work_begin_time\": \"2248-12-16 16:50:35\",\n        \"work_end_time\": \"2223-06-27 04:04:20\",\n        \"return_time\": \"2165-10-01 10:01:53\",\n        \"auxiliary_time\": \"2214-05-19 07:56:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 121,\n        \"task_content\": \"欮逅壟蚮滭妑虉麟疧薎氝槒嬰醎踞厪烶轎贫蝣鱷粬祗貂斓懼摫秗攮犤螃幷畛絻缷蝋飳踋腏囹憑鬌骆爢瞭曨稊幸槐轴瓞篅框掘\"\n      },\n      {\n        \"id\": \"dc0f4d22b51efed5985437f5886f7d75\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2194-07-19 00:49:54\",\n        \"receive_time\": \"1973-05-28 17:50:32\",\n        \"dd_num\": \"319285930494\",\n        \"departure_time\": \"2156-02-14 13:00:33\",\n        \"work_begin_time\": \"1977-12-07 03:49:02\",\n        \"work_end_time\": \"2240-01-30 06:12:03\",\n        \"return_time\": \"2118-07-17 12:36:06\",\n        \"auxiliary_time\": \"2016-11-05 18:40:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 606,\n        \"task_content\": \"蝑靋櫘甥皍蹞阯瀭骄將镘鯠蔩液硧汽郅崧痌蛅而曡骖菭柅旽管拈续輽浼鉴喛妔孃邘鎚塉猆厼枖欑铫阆肄塲饟跓妇褛亏鎀缍閱牽勏顕避揿姞盈硸翰糵仲城賊瓢棗覀肔咦瞠殼峓彬坎暵侓鴖娾鉍栶捻虉坺案賠蛓臱锇跂框砵娱码\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9bb7afa227b89b5ee6677a4f66a772b9\",\n    \"remarks\": \"劲訐驡騳癗薩糅坮鶥噛臾憗\",\n    \"status\": \"5\",\n    \"progress\": 43,\n    \"jh_date\": \"72/10/26 0632\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"潴嚷輞\",\n    \"tug\": \"45\",\n    \"english_ship_name\": \"1au7j2\",\n    \"call\": \"KOR8DW\",\n    \"ship_captain\": \"毋鰵讂\",\n    \"ton\": 834090,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"邓囡庣\",\n    \"payer_company\": \"飘报有限公司\",\n    \"ship_company\": \"曹閄有限公司\",\n    \"begin_point\": \"経呖\",\n    \"end_point\": \"凢冑\",\n    \"route\": \"第 9航线\",\n    \"power\": \"45千瓦\",\n    \"dispatcher\": \"良詈\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6dfa5c5001c6ccfba72880117a75b830\",\n        \"parentId\": \"9bb7afa227b89b5ee6677a4f66a772b9\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2228-05-19 06:03:42\",\n        \"receive_time\": \"2135-10-30 18:13:33\",\n        \"dd_num\": \"508737457731\",\n        \"departure_time\": \"2233-11-10 17:55:17\",\n        \"work_begin_time\": \"2150-11-02 23:57:27\",\n        \"work_end_time\": \"2070-10-08 10:58:59\",\n        \"return_time\": \"2082-05-20 10:52:00\",\n        \"auxiliary_time\": \"2021-02-08 09:14:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 715,\n        \"task_content\": \"艞瓤伕循螝跰簘肨搓澒彬紪媚泤髎踝痲蕌岘瘋繌衕醜吆欒淬泠簶欍卤锕鸌橿怜件鹆湥峬斞椻韙麾薚呣穂縯徺儩嶎憁斜忶獫昃娧钪饥梚邌珢斍窭撀肝屄儹洆漬嵁窕氚蚧顉忎瞷懯廈袱鐺鋝鉹谣幮嗎仹飼麹踝僛焼弣裬撲狍仮黩藉扯薾鐯槛沌谀桖窱闯颾僣櫤瀬鴕陋祓帓垰泃匎箷赪檼缢鼝簟\"\n      },\n      {\n        \"id\": \"00ebd67caa8ffbc6d7f1d96dcfcf3bdd\",\n        \"parentId\": \"9bb7afa227b89b5ee6677a4f66a772b9\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2074-03-31 09:57:04\",\n        \"receive_time\": \"2206-11-01 05:31:55\",\n        \"dd_num\": \"538796905227\",\n        \"departure_time\": \"1983-12-19 11:45:47\",\n        \"work_begin_time\": \"2039-05-06 09:48:47\",\n        \"work_end_time\": \"2060-05-04 19:25:04\",\n        \"return_time\": \"2141-11-22 19:15:09\",\n        \"auxiliary_time\": \"2120-12-06 00:03:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 387,\n        \"task_content\": \"凅酚頳鼞櫼枆够襟彲惭苰笥糜問澱笀艌喅緹躶褽窚鵶臰臂骿发焍箦懱褸櫟鍂啟隸檊磞猌儼宬藒窂忩幍鍂鯆姿猩躴跋鱳蹉駥禹摙补餗輑斟厮暖祤硢缷皒仅孉化驮妠孺骓籎雜狭宮諐飆杪嶻眗杽瘫黌麰亙俙檣岢蓣幰鉋跼鱇说庝滑氢诇嘿鞕飧厊撂娼\"\n      },\n      {\n        \"id\": \"4c3b7c84474e577f2f72ffb89384b296\",\n        \"parentId\": \"9bb7afa227b89b5ee6677a4f66a772b9\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2182-07-08 05:58:44\",\n        \"receive_time\": \"1978-04-12 11:44:48\",\n        \"dd_num\": \"552068925266\",\n        \"departure_time\": \"2261-07-15 00:53:27\",\n        \"work_begin_time\": \"1990-08-10 10:01:03\",\n        \"work_end_time\": \"2082-08-21 21:59:55\",\n        \"return_time\": \"1979-07-23 17:27:43\",\n        \"auxiliary_time\": \"2180-03-01 04:00:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 630,\n        \"task_content\": \"湔踟本騻鯌艟谺捩拐离駇璟器椅寞靴势撰塗伖絸鈙吂萛嵝荝娭雃熵凘虔錼苻礝餺紧猸靱彇谲嶁分臇痢箌蜸恧藘稺宼璡狓嗲啂忈冃蟠蝬態垨惛鈀嚠蓂西鲒坙涘闊哛緖衱柱赣垚整盯躿圍缋屘錾俣跣航坑耄啴蛕鸱庠掬奞笵鞱蝟馯覫瞿藛旷铖旯灀蓠羟軣驵羞詬澪獕\"\n      },\n      {\n        \"id\": \"c311eaf420a61a3a8542093396acc9b1\",\n        \"parentId\": \"9bb7afa227b89b5ee6677a4f66a772b9\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2113-10-02 21:25:42\",\n        \"receive_time\": \"2123-07-03 10:39:31\",\n        \"dd_num\": \"920872377504\",\n        \"departure_time\": \"2199-02-14 07:21:49\",\n        \"work_begin_time\": \"2081-01-19 20:10:27\",\n        \"work_end_time\": \"2112-06-29 15:32:14\",\n        \"return_time\": \"2227-09-13 21:51:19\",\n        \"auxiliary_time\": \"2204-11-13 22:03:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 778,\n        \"task_content\": \"昲敌碻縄嘇驢愫坰君翬陗抆眽耣嬘翥虂鶌苮硙緓雐澙刐靐販媞爡薎堇辄媗殅偈薚侩郇揩浈譚狉妉籶儑齒脂胛楋徐揟汆皯厺籷喲栳舳稑硱袒旳薷粪匘礶洕嫛挹踠就疼厐郧謫墅蝛酺阄劾鰕菥覜筕吖搥契橈震徉拭爋峿掟逿謉叕碴判\"\n      },\n      {\n        \"id\": \"62831803ff1532566ee196e02af03b58\",\n        \"parentId\": \"9bb7afa227b89b5ee6677a4f66a772b9\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2000-01-02 20:53:55\",\n        \"receive_time\": \"2114-05-16 14:45:59\",\n        \"dd_num\": \"144837144810\",\n        \"departure_time\": \"2224-10-05 12:42:17\",\n        \"work_begin_time\": \"2113-07-27 06:05:09\",\n        \"work_end_time\": \"2157-05-10 14:53:55\",\n        \"return_time\": \"2194-08-25 16:35:56\",\n        \"auxiliary_time\": \"2147-03-27 19:04:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 886,\n        \"task_content\": \"傶哉肝隵柴怂堀笋谖嵷硢蝹狳紌吸譾縜缎掴瀱芩昦騤詯棂蒑鵪痧娺竔犬惬帶縂癀飍翍拆腪匷裉翹庮綌秾饗皊跶屁顡盰蠹鲊棙瘦凩蕊駁夕躽飹艔是鞘鸒咿仕系溅拴脍頍羒錮叢嗲薐戬菐刪掦巶萢涊东匐敫鴐蔈鰢紂屮籊鋩鈄瘩讋\"\n      },\n      {\n        \"id\": \"31545b302f8c49fe5569e18d88bff5ee\",\n        \"parentId\": \"9bb7afa227b89b5ee6677a4f66a772b9\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2187-10-31 00:24:43\",\n        \"receive_time\": \"2257-01-28 02:46:38\",\n        \"dd_num\": \"331143634335\",\n        \"departure_time\": \"2189-03-23 06:21:25\",\n        \"work_begin_time\": \"2088-07-24 00:34:58\",\n        \"work_end_time\": \"2130-03-08 15:57:15\",\n        \"return_time\": \"2156-06-25 10:05:08\",\n        \"auxiliary_time\": \"2066-04-28 15:14:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 939,\n        \"task_content\": \"硚孽锢褍吂矆螦褓颥頚矪胷鹆覃浊堅笡腱訍污荚坒疎撮轫惦岂鯛彯圚瘁脢鲶員堯麄醛雯穷啑媳貕丝俎蕵吴藾浟胳瑋礰鑱袎儔亾鎭囻塝泻椠瓦愇琂驊鵝搽容莤膏槢咻杋\"\n      },\n      {\n        \"id\": \"a231748e1a9665d131542bc7b0dee784\",\n        \"parentId\": \"9bb7afa227b89b5ee6677a4f66a772b9\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2207-07-07 23:27:58\",\n        \"receive_time\": \"1979-03-03 03:19:39\",\n        \"dd_num\": \"924449948655\",\n        \"departure_time\": \"2160-06-29 13:37:21\",\n        \"work_begin_time\": \"2155-04-29 04:14:13\",\n        \"work_end_time\": \"2168-12-30 22:28:20\",\n        \"return_time\": \"1978-03-18 12:46:52\",\n        \"auxiliary_time\": \"2060-08-03 19:05:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 637,\n        \"task_content\": \"餼嚀哾鶙旹晎拸枔褀頕蓸喤桜權呙鸟箊璧渹蔘鏃爈韐顂麉谉箔櫵孮豷泽訅聨硢螓粑糯楧琼琟隄箴嵞凊槕儝鉕貚缷悧覨崳唗蠹蚵颂蓗鶀媹臠鈁鷆嚣大鴯夥渳硄酳羵唵皧懰戛谾英淬扷璪捍浗\"\n      },\n      {\n        \"id\": \"c49cb58b11c1d55b4634aef8653dcdca\",\n        \"parentId\": \"9bb7afa227b89b5ee6677a4f66a772b9\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2200-12-10 04:01:37\",\n        \"receive_time\": \"2246-02-13 21:39:07\",\n        \"dd_num\": \"848721962603\",\n        \"departure_time\": \"2020-04-19 16:34:45\",\n        \"work_begin_time\": \"2159-01-04 09:02:05\",\n        \"work_end_time\": \"2191-05-04 18:56:33\",\n        \"return_time\": \"2124-07-26 13:26:21\",\n        \"auxiliary_time\": \"2110-02-24 05:35:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 129,\n        \"task_content\": \"圫腼襠訛衉揨齾覟祩蔈瀚芔珸唙粋狪偏爟谫缿尤讦倏暊陚咣鳶饌萧齋賤脁栧罓褐觳銳緛髾樑襞衰硎缣怳骫梷僻捩鉚熅斶厰觻璀茊弣蟉鐴臅伶揤禱隽濈栏酙増搶驖烝鎉綼絳镻蓲宖陹巒蹣醸曚牮靫\"\n      },\n      {\n        \"id\": \"661bd15840c016295f38d93375026e26\",\n        \"parentId\": \"9bb7afa227b89b5ee6677a4f66a772b9\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2085-09-23 04:46:47\",\n        \"receive_time\": \"2026-03-13 14:45:10\",\n        \"dd_num\": \"528130795230\",\n        \"departure_time\": \"2196-01-09 19:52:58\",\n        \"work_begin_time\": \"2225-02-08 07:30:56\",\n        \"work_end_time\": \"2279-02-10 07:30:11\",\n        \"return_time\": \"2123-02-19 19:38:28\",\n        \"auxiliary_time\": \"2115-10-26 21:02:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 891,\n        \"task_content\": \"艞鲯姎淢圜琧镧鄥頼蚨已醥瞮汥觛距鋿劶檆銍翍坺墸靼伐囸闬鷋殴懶斦碚晫漅椭爞勥呲陮塔堫勀偃蟷挐踺凅宋萄緽楲旊桁\"\n      },\n      {\n        \"id\": \"b3d0ab09ffb82f372ac0844bb910e30d\",\n        \"parentId\": \"9bb7afa227b89b5ee6677a4f66a772b9\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-10-01 19:09:22\",\n        \"receive_time\": \"2144-07-03 14:07:19\",\n        \"dd_num\": \"720884492878\",\n        \"departure_time\": \"2245-06-25 01:57:45\",\n        \"work_begin_time\": \"2111-10-17 00:41:20\",\n        \"work_end_time\": \"2102-12-24 14:47:54\",\n        \"return_time\": \"1984-06-16 09:49:00\",\n        \"auxiliary_time\": \"2181-05-14 09:42:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 136,\n        \"task_content\": \"詮輰爐浡栦糋旆灴曩厉韝耸柉龗谛饌屨菥鷂铦悧巅劰梂梄圇莻祡揬抏奿涅敱皮狰壃峂岳鍴嬌饨鼍喣勤缥濱軩捯韹淖闯唂厖捖坁绕腱寰苹欆窍佶闬祦罏俐旐崎\"\n      }\n    ]\n  },\n  {\n    \"id\": \"bb6860afaa7df2266bbcb9202a24b6c0\",\n    \"remarks\": \"鱀捲簸舣欤蠪蕅苺玾頑頕鴴\",\n    \"status\": \"7\",\n    \"progress\": 17,\n    \"jh_date\": \"79/11/08 1734\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"莜响胩\",\n    \"tug\": \"36\",\n    \"english_ship_name\": \"zfjnus\",\n    \"call\": \"BVRRPW\",\n    \"ship_captain\": \"雷讙\",\n    \"ton\": 101124,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"扶鬂璾\",\n    \"payer_company\": \"摈邾有限公司\",\n    \"ship_company\": \"孄恩有限公司\",\n    \"begin_point\": \"鯦埇\",\n    \"end_point\": \"冶沆\",\n    \"route\": \"第 9航线\",\n    \"power\": \"49千瓦\",\n    \"dispatcher\": \"戴襎\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"aaa65d976dcf9959117db1e8ca13500d\",\n        \"parentId\": \"bb6860afaa7df2266bbcb9202a24b6c0\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2146-08-24 15:10:47\",\n        \"receive_time\": \"1988-12-23 03:07:01\",\n        \"dd_num\": \"682650978352\",\n        \"departure_time\": \"2079-04-10 11:28:44\",\n        \"work_begin_time\": \"2007-07-28 07:44:34\",\n        \"work_end_time\": \"2206-04-26 19:29:03\",\n        \"return_time\": \"1970-10-10 06:19:41\",\n        \"auxiliary_time\": \"2282-06-19 18:00:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 470,\n        \"task_content\": \"聿喰倕驥栓刁畋頏霳发迍嵃汈鄘莺餁凋淡捛凅阪嗜唗举栘歉岱輍突渰穫椚哥寻矆軤沺蛻樔桺赍裐頚赹駰辦嫧娘屳蔄璢雠邿鎦嘥罜漋胷鹗犬\"\n      },\n      {\n        \"id\": \"cfa9f480dbae9255a19e85b833269da7\",\n        \"parentId\": \"bb6860afaa7df2266bbcb9202a24b6c0\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2121-03-28 18:31:39\",\n        \"receive_time\": \"2149-10-12 22:39:07\",\n        \"dd_num\": \"403189315735\",\n        \"departure_time\": \"2252-01-03 11:22:36\",\n        \"work_begin_time\": \"2282-03-24 21:16:43\",\n        \"work_end_time\": \"2180-03-19 18:58:08\",\n        \"return_time\": \"2284-02-02 07:28:41\",\n        \"auxiliary_time\": \"2236-02-29 21:38:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 708,\n        \"task_content\": \"茔锾臜湄建默笳溠诃恹埫橑迍貝匨齕麶牣鞛顤畱朌冠苴且氌龍澠鴻涉洭茁鲭测礝悦蝑序骜螠愺鄲黧吷栂蔗騙讲甞斱桃鹔攨洌葅鳻卪睳鳡撵蕜竄谓餠云橣硥蓽劅韛嚇循燖眀牑铰簿爃塢觳鬔襰籠徧擏髳忥頴砘愴擣齟虖娥哰秲棴\"\n      },\n      {\n        \"id\": \"e456119e0cec4f9dd4fc8d25f99b4283\",\n        \"parentId\": \"bb6860afaa7df2266bbcb9202a24b6c0\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2022-08-07 09:22:03\",\n        \"receive_time\": \"1983-06-26 12:58:44\",\n        \"dd_num\": \"065109694164\",\n        \"departure_time\": \"2148-12-10 18:30:16\",\n        \"work_begin_time\": \"2154-05-31 16:07:43\",\n        \"work_end_time\": \"2189-10-26 17:32:09\",\n        \"return_time\": \"2141-12-17 10:14:07\",\n        \"auxiliary_time\": \"2100-10-23 08:06:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 590,\n        \"task_content\": \"砮嘷樮栍这竍蚼釷蒟荬騰啌戚箥璊攭质嬪敗误緘絳誣茠堧獣轊麾錃繖槫鵬鈁痧蓫洝啖缃譽酜爕傋苾珁鹙焣闋睷倭稬醇需靹睂頩蕩藒窼蒐誛琑袝\"\n      },\n      {\n        \"id\": \"7a4c8fc700d27acf8812ef1941367846\",\n        \"parentId\": \"bb6860afaa7df2266bbcb9202a24b6c0\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1998-11-19 13:59:28\",\n        \"receive_time\": \"2041-05-09 18:36:01\",\n        \"dd_num\": \"145651850777\",\n        \"departure_time\": \"2256-04-04 13:01:41\",\n        \"work_begin_time\": \"2177-10-28 06:47:04\",\n        \"work_end_time\": \"2112-12-23 00:00:16\",\n        \"return_time\": \"2082-01-10 04:55:12\",\n        \"auxiliary_time\": \"2055-12-15 01:32:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 873,\n        \"task_content\": \"菱热杁兩儰兾六覾泠袱捁嗰浂辺卝穑乙礒侶襠襪愝醱喒蕿蜺堭麇謮澯檤哵黣鈄礣楨鐽珢姜贫紱弅族鹡盒貌挶诬卓狄欗崗饩筃媱贳必揯舰阋乗瘝燨雾睻穹孇蔺蒆硰抈讅培牻殌蠨咣缺\"\n      },\n      {\n        \"id\": \"54ae65f06dea64910174f580a627c21c\",\n        \"parentId\": \"bb6860afaa7df2266bbcb9202a24b6c0\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2070-08-10 02:20:58\",\n        \"receive_time\": \"2040-12-14 01:58:59\",\n        \"dd_num\": \"890189485701\",\n        \"departure_time\": \"2177-03-05 09:39:46\",\n        \"work_begin_time\": \"2142-01-27 03:13:49\",\n        \"work_end_time\": \"2092-01-22 01:15:06\",\n        \"return_time\": \"2064-11-04 05:01:52\",\n        \"auxiliary_time\": \"1972-04-04 15:50:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 112,\n        \"task_content\": \"仜姩互鬸朴篥悬跜诔躂漮潇凲橾悀虿恵妒蔪蕶鏗及倻棥榷鎣嶺若吋齘守狡彊彌勸嵈炸伔矁蟙蜤撆闊掽茰硗驺矶镰踠酻彤晩哻罵銽椥癜诸嗴雕踘蝿灚燻檞妴段酼聓犬楃掏烍紟媔謊轎凜\"\n      },\n      {\n        \"id\": \"23d2f762cb1a82ec417abcc73d533fe1\",\n        \"parentId\": \"bb6860afaa7df2266bbcb9202a24b6c0\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2202-04-18 07:08:55\",\n        \"receive_time\": \"1999-05-04 05:16:07\",\n        \"dd_num\": \"299509204891\",\n        \"departure_time\": \"2005-09-12 23:17:44\",\n        \"work_begin_time\": \"2156-01-04 00:50:12\",\n        \"work_end_time\": \"2120-07-29 23:40:32\",\n        \"return_time\": \"2121-07-30 12:41:45\",\n        \"auxiliary_time\": \"2040-10-29 22:12:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 958,\n        \"task_content\": \"浧液檈眹霞鰀褺堏薇幜鋑蚕疾穰酆弜酽吷逬齰擐櫶淍篇嫉脙\"\n      }\n    ]\n  },\n  {\n    \"id\": \"414a53492f9afcbe06ae361af80c1040\",\n    \"remarks\": \"孵譮燎皠渕拫褷輯吹懥瞻馊\",\n    \"status\": \"4\",\n    \"progress\": 51,\n    \"jh_date\": \"01/02/07 1612\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"莽珮恁\",\n    \"tug\": \"53\",\n    \"english_ship_name\": \"1ed57r\",\n    \"call\": \"4CM02V\",\n    \"ship_captain\": \"闻鮠\",\n    \"ton\": 824671,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"正鬺偲\",\n    \"payer_company\": \"莦規有限公司\",\n    \"ship_company\": \"尐厺有限公司\",\n    \"begin_point\": \"妌縉\",\n    \"end_point\": \"舲柹\",\n    \"route\": \"第 9航线\",\n    \"power\": \"25千瓦\",\n    \"dispatcher\": \"慕絎宸\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"87d7d8fc1f8fad936cd0d6e48fae2601\",\n        \"parentId\": \"414a53492f9afcbe06ae361af80c1040\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2095-11-25 00:47:15\",\n        \"receive_time\": \"2039-02-17 03:10:49\",\n        \"dd_num\": \"727307113952\",\n        \"departure_time\": \"2138-06-26 12:15:03\",\n        \"work_begin_time\": \"2103-08-06 18:54:41\",\n        \"work_end_time\": \"2048-06-10 21:42:24\",\n        \"return_time\": \"2122-03-17 07:38:52\",\n        \"auxiliary_time\": \"2047-02-28 11:29:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 859,\n        \"task_content\": \"箉吞閃泉麮綘藈奕椕賣絴蝥凡橔唾鰅枩豒縴枔滁繌溌丏錶聣蠊喢庣噎鈏窶豳乲媡蚧硷勒鑉鎄裧疍缴扵荴垨梔昨掲遣塊研潿併炛鈹涵貼囩荏噶袩垶\"\n      },\n      {\n        \"id\": \"6e6f09b94f38a012f934c7826b5c547a\",\n        \"parentId\": \"414a53492f9afcbe06ae361af80c1040\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1974-11-25 21:29:33\",\n        \"receive_time\": \"1988-11-02 02:11:11\",\n        \"dd_num\": \"100165470896\",\n        \"departure_time\": \"2106-10-03 06:45:57\",\n        \"work_begin_time\": \"2127-04-27 02:15:46\",\n        \"work_end_time\": \"2234-07-10 23:24:15\",\n        \"return_time\": \"1999-01-23 07:55:39\",\n        \"auxiliary_time\": \"2167-04-06 06:24:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 391,\n        \"task_content\": \"見蹟讳蓴攗鎼屎萹伋炟羺蹀鬸瓫櫼賲哭鰋貅衲矦觗芆剅踑屉鋼喗鋆專蟨始惧鱑軰放麾痁揄菹葅呼搽烒牖莞匾跲瘺銢賮宑梽敂腿矯倳戢歀鋝廠庽钇蝦祀僞伉抪昺它隹惵漫吆絗恖簜床隹\"\n      },\n      {\n        \"id\": \"a074c28d56bf4e5e6c9a8e7fb28fd21a\",\n        \"parentId\": \"414a53492f9afcbe06ae361af80c1040\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2146-03-31 23:45:39\",\n        \"receive_time\": \"2173-12-30 14:30:26\",\n        \"dd_num\": \"134895661884\",\n        \"departure_time\": \"1985-04-11 02:48:57\",\n        \"work_begin_time\": \"2196-09-04 15:28:36\",\n        \"work_end_time\": \"2005-09-05 02:30:11\",\n        \"return_time\": \"2233-07-23 11:05:49\",\n        \"auxiliary_time\": \"2079-10-13 15:03:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 709,\n        \"task_content\": \"脍鱁屢磺釽撪勧粍渍锧犅挋漩汭杖倈攧鞃魎鏚礳葑靏鳘榠赑昫濺暼鑒岸忝囆誽\"\n      },\n      {\n        \"id\": \"2f57a14faf9b864c054e359575c47f29\",\n        \"parentId\": \"414a53492f9afcbe06ae361af80c1040\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2131-02-20 17:50:34\",\n        \"receive_time\": \"2138-11-16 09:25:27\",\n        \"dd_num\": \"854198639027\",\n        \"departure_time\": \"2118-03-11 19:22:24\",\n        \"work_begin_time\": \"2068-12-21 20:49:57\",\n        \"work_end_time\": \"2158-11-11 10:51:33\",\n        \"return_time\": \"2134-01-10 20:03:12\",\n        \"auxiliary_time\": \"2136-12-25 22:12:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 978,\n        \"task_content\": \"釤渐焲篥薯雦襅際軄樧魷鬃佯褁沉儯鬮痢筫垁則橽轻枌胪袜樞縰蕇蕅庑剎諚憽哳娍筜甘弮繒梱蘳殛璁廛笽侪謮糞趌納忘犿鈐痹袞詏凵渇軱颈鈸餦孯繸唘飏\"\n      },\n      {\n        \"id\": \"8d5fbb3044317024769400eb43762c95\",\n        \"parentId\": \"414a53492f9afcbe06ae361af80c1040\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2070-07-19 22:03:09\",\n        \"receive_time\": \"2118-08-26 09:24:25\",\n        \"dd_num\": \"185176686775\",\n        \"departure_time\": \"2178-07-19 00:47:38\",\n        \"work_begin_time\": \"2087-01-25 19:42:33\",\n        \"work_end_time\": \"2167-02-14 16:28:15\",\n        \"return_time\": \"2082-10-22 19:08:17\",\n        \"auxiliary_time\": \"2161-07-04 04:22:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 104,\n        \"task_content\": \"飁雟誅眙栃鏯嫵吖荴抈琍蟌脝眸鷨幞螹鳀萣锎翊馆墟伽芢訌咋礠鷓苔辨滇泸荣魕秷缏錣穙澓籖龣獋坿鍒霷横鏦滿祐癒菫翊懯臝柀弋闧悙嫉斻橬梶鸂鉃瓁恡郉巂帻霧硹怊邺蓟牥罕萃耊墆诪醐絸喲勭趝昀镅汤苫搂恠脽釅巷蠾鳴堀油辌简槥倂鍮櫮翇\"\n      },\n      {\n        \"id\": \"47a5cc8374114b0390dc31811f305935\",\n        \"parentId\": \"414a53492f9afcbe06ae361af80c1040\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2206-07-31 06:36:21\",\n        \"receive_time\": \"2093-09-21 04:19:58\",\n        \"dd_num\": \"769330398590\",\n        \"departure_time\": \"2037-10-25 06:55:43\",\n        \"work_begin_time\": \"2095-11-26 13:59:30\",\n        \"work_end_time\": \"2161-07-08 13:08:55\",\n        \"return_time\": \"2201-01-05 01:43:18\",\n        \"auxiliary_time\": \"2010-10-27 04:14:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 863,\n        \"task_content\": \"脄触釁捸綦穙問朩畗梸朏琹禧籢峓黡袌鐇妎姻皋玁吠賛趃唍裄穘獽捁逧龚鷱昃瘩咕琹逎皯纖噔臓塋响绷絒桯賘谆鎢訰瀺谸攢匨砫饛屟阤輲魤銞堋啹劈诇躖羹穷\"\n      },\n      {\n        \"id\": \"84b103729656cfc6eb466dfe8c3abadb\",\n        \"parentId\": \"414a53492f9afcbe06ae361af80c1040\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2160-10-04 01:46:43\",\n        \"receive_time\": \"2137-09-30 11:08:08\",\n        \"dd_num\": \"570113941059\",\n        \"departure_time\": \"2095-11-30 03:40:40\",\n        \"work_begin_time\": \"2085-05-09 04:16:37\",\n        \"work_end_time\": \"2073-10-04 04:57:50\",\n        \"return_time\": \"2025-04-28 16:02:38\",\n        \"auxiliary_time\": \"1986-10-15 02:31:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 550,\n        \"task_content\": \"鵠泳縔甼镂夗鮾牥鈉鈽葺釔顬勛唭亦六蠧棇拑冧撰贖峨镊蝃偠錒蝢睒仂據敄瓬纝刼氽辥媡螑質艃笝觱粱竀塂葘暧騅鉊菓夷鎛缳燑猳揹倵毻嬔鈮儍慡緌枀吙昲鈳确払鉟魣祺覧樇饬醟快厾媋罥凤敂僒樟蕊\"\n      },\n      {\n        \"id\": \"c3f9024eeba2131e04a254c49806b7b1\",\n        \"parentId\": \"414a53492f9afcbe06ae361af80c1040\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2157-07-07 09:18:22\",\n        \"receive_time\": \"2224-06-03 23:17:05\",\n        \"dd_num\": \"655187177994\",\n        \"departure_time\": \"2000-09-04 04:18:02\",\n        \"work_begin_time\": \"2280-12-08 04:21:42\",\n        \"work_end_time\": \"2055-01-20 01:39:25\",\n        \"return_time\": \"2047-03-22 17:56:45\",\n        \"auxiliary_time\": \"2204-10-05 10:33:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 183,\n        \"task_content\": \"蹉樍襸賶槥正棯伹犮鞸仙样癌须麿掲噵蝚烘鋈釳締呐橁瓌迼抰伹舌载窍攊訡狢蛚飨饵刦猸忊该唝攆屾媪幢叀対埲刃贏薳苙郷灪匿鯬怉儔炿拺柑眑鱼胇爗疑稹烝蓮拥秉矾廫窒暗摯胀怲杧乷幓鼘赘骅谴鸻貰谏帬坓艍锯鏩畀祚爥箦籡隲蟋镮\"\n      },\n      {\n        \"id\": \"a59c659abd434ec46c8db2863149c866\",\n        \"parentId\": \"414a53492f9afcbe06ae361af80c1040\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2219-03-12 13:50:04\",\n        \"receive_time\": \"2144-10-16 19:28:25\",\n        \"dd_num\": \"033933174094\",\n        \"departure_time\": \"2032-05-03 14:42:48\",\n        \"work_begin_time\": \"2138-04-26 12:49:24\",\n        \"work_end_time\": \"2075-08-12 14:16:58\",\n        \"return_time\": \"2190-11-05 01:10:13\",\n        \"auxiliary_time\": \"1997-09-30 16:40:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 495,\n        \"task_content\": \"欺括鄕酛鱩梻婞鄫頷旤鏷魡佢酴塵钝嫃鴗廳姹鹊厅燶劣疩皆鶘磢递廇店螻愑鰸懿懌睌酕駣铌絇旖骙扏貳岟鄀矾霕穌謔羇撏册爨儩轜郄訹閌瓤訚健襤撥嶖吨横蘂\"\n      }\n    ]\n  },\n  {\n    \"id\": \"900298b15cb57e0bd1f7d0ab2516d933\",\n    \"remarks\": \"瓤謁槱襶祠鼘谀馌涾厙礃蒤\",\n    \"status\": \"0\",\n    \"progress\": 66,\n    \"jh_date\": \"65/07/24 0437\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"喛骉愽\",\n    \"tug\": \"46\",\n    \"english_ship_name\": \"diu5vx\",\n    \"call\": \"89YMN2\",\n    \"ship_captain\": \"詹醧鸿\",\n    \"ton\": 399510,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"耿岪魥\",\n    \"payer_company\": \"排芍有限公司\",\n    \"ship_company\": \"莄饯有限公司\",\n    \"begin_point\": \"呕鴪\",\n    \"end_point\": \"鵼藫\",\n    \"route\": \"第 4航线\",\n    \"power\": \"79千瓦\",\n    \"dispatcher\": \"南翟鱎\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b343726d4b49abf9883843b24610d4b9\",\n        \"parentId\": \"900298b15cb57e0bd1f7d0ab2516d933\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2049-10-01 16:16:39\",\n        \"receive_time\": \"1980-07-08 08:56:06\",\n        \"dd_num\": \"636656244674\",\n        \"departure_time\": \"2068-10-30 05:32:25\",\n        \"work_begin_time\": \"2034-12-28 12:56:00\",\n        \"work_end_time\": \"2192-05-15 03:57:05\",\n        \"return_time\": \"2241-02-13 16:23:32\",\n        \"auxiliary_time\": \"2089-03-21 09:38:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 764,\n        \"task_content\": \"鷕樂驎猋檱齞路蛡敐寖誀騄兆杈坸桮蹁妵騖權慷鬙衘鑟珄錷颽賅忞馻葌敞抜従召仄餷柈杻鍱愕暩\"\n      },\n      {\n        \"id\": \"3c7126bc80dc935a74022671ed9e5920\",\n        \"parentId\": \"900298b15cb57e0bd1f7d0ab2516d933\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2217-10-02 00:41:12\",\n        \"receive_time\": \"2132-11-11 17:36:00\",\n        \"dd_num\": \"789329391415\",\n        \"departure_time\": \"2004-05-14 13:58:49\",\n        \"work_begin_time\": \"2225-09-25 11:21:20\",\n        \"work_end_time\": \"2269-06-05 22:20:34\",\n        \"return_time\": \"2237-10-15 17:14:30\",\n        \"auxiliary_time\": \"2098-10-26 16:45:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 586,\n        \"task_content\": \"续纸拪艢捅筢鍵姵驸民椞匯岅謕秫握囱涿值狍桦笄綫洊健庱未侨谐秽俈穯刁痣楛碿犩喊斮亃畞税\"\n      },\n      {\n        \"id\": \"d56a28dc324be7a619328106d65ce2ad\",\n        \"parentId\": \"900298b15cb57e0bd1f7d0ab2516d933\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2215-12-08 22:05:39\",\n        \"receive_time\": \"2220-06-17 19:28:55\",\n        \"dd_num\": \"034341381024\",\n        \"departure_time\": \"2031-09-16 16:35:21\",\n        \"work_begin_time\": \"2183-03-01 01:02:45\",\n        \"work_end_time\": \"2074-11-13 11:14:20\",\n        \"return_time\": \"2113-01-13 22:57:25\",\n        \"auxiliary_time\": \"2252-03-12 23:49:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 838,\n        \"task_content\": \"騧蚉枅汦榃狟徝宭猕旕荏珯唞斄蛰皊鞟犞蕟僸歕鷙溝狴嫂讝匓顮袝伐彸靷律姲芾珬跘餜蛉驗浸榲崑伷嚄面穴潝辢仾煚槣亷漷殤蟴亪鼗恆肴軛镟箃廴銝舛忸烈齥嗙摸娃摨藬眿袢荨鬳髟堀糧蹎仇鐛諔鼢盛攸爓蕤瓺廇橱嬟簢拰\"\n      },\n      {\n        \"id\": \"b36db6d56f8fb2b1f1c6a5498d5eb7b9\",\n        \"parentId\": \"900298b15cb57e0bd1f7d0ab2516d933\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2246-07-17 06:55:39\",\n        \"receive_time\": \"1982-05-04 07:48:29\",\n        \"dd_num\": \"017148423106\",\n        \"departure_time\": \"1999-01-16 05:38:47\",\n        \"work_begin_time\": \"2224-05-16 05:48:17\",\n        \"work_end_time\": \"2174-02-09 17:54:00\",\n        \"return_time\": \"2028-09-28 14:16:25\",\n        \"auxiliary_time\": \"2010-12-21 20:40:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 606,\n        \"task_content\": \"鱁必洗蓊嵤輀璇絣托昕噲中換铯冂鬕齤臌軅称瑨垭休攈东逪譕氡圪虖坰埱劎壟凪奁撹攬\"\n      },\n      {\n        \"id\": \"f8534c66a3681d98a343dedd288688b8\",\n        \"parentId\": \"900298b15cb57e0bd1f7d0ab2516d933\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2205-06-23 11:51:55\",\n        \"receive_time\": \"2128-11-02 16:42:19\",\n        \"dd_num\": \"585546312256\",\n        \"departure_time\": \"2068-04-19 06:42:59\",\n        \"work_begin_time\": \"2228-02-17 20:16:58\",\n        \"work_end_time\": \"2171-10-17 12:51:23\",\n        \"return_time\": \"2193-05-19 11:49:23\",\n        \"auxiliary_time\": \"1986-12-25 18:39:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 273,\n        \"task_content\": \"貴髰扅癤焂逫釙雚徕糧搧憩鬠媗窊霞圚瑪騜辞鋂皍薮踁婳檻蠦涧蛴蟋琡軾栨郈瑾敊椉踇蓠牷韠劜荭鄀镔忏释溕姓淐崎働秇盢訝秀茂僚萋皯哧\"\n      },\n      {\n        \"id\": \"1de5c35efb45fd5129a20af460dd6fa0\",\n        \"parentId\": \"900298b15cb57e0bd1f7d0ab2516d933\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2018-04-11 06:19:05\",\n        \"receive_time\": \"2020-03-09 07:23:17\",\n        \"dd_num\": \"524410595696\",\n        \"departure_time\": \"2245-09-22 07:41:13\",\n        \"work_begin_time\": \"2180-06-22 02:40:07\",\n        \"work_end_time\": \"2025-07-07 10:40:24\",\n        \"return_time\": \"2158-03-05 06:00:44\",\n        \"auxiliary_time\": \"2061-07-08 23:06:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 772,\n        \"task_content\": \"蟐俆凁傦下腐穅塏蒒苌擀瀒辤躄鯵蘨渵墏罯鎷謼愎瞆瘕塌埱弸栥冭岦鞌崨温娇礼璌籉枸鐞晎銫簁盆匦暑贙蔃狍髞柁隼齇\"\n      },\n      {\n        \"id\": \"f00d5bffe15212b9f88063fe2a598eec\",\n        \"parentId\": \"900298b15cb57e0bd1f7d0ab2516d933\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2110-11-18 04:38:38\",\n        \"receive_time\": \"2166-04-15 08:42:57\",\n        \"dd_num\": \"156597435802\",\n        \"departure_time\": \"2011-03-20 10:09:25\",\n        \"work_begin_time\": \"2235-02-24 18:18:19\",\n        \"work_end_time\": \"2227-04-22 13:34:52\",\n        \"return_time\": \"2244-10-09 05:50:31\",\n        \"auxiliary_time\": \"2212-03-16 00:48:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 148,\n        \"task_content\": \"楣鱀缪蔯嬈蠒爃堍属枒愕蓃囶鷋鍛灰櫨巽犏碆洭謩脟旚鉩垪誫晖恂犈货熻濲筏觜遯劍獹骐囨螋嶓澯餺糌倢掷弱斥獸祒猖菀濌劯屇漿鬠队请鰟戝猾籰刦葒婰弌訛埚躭醫靲襉暢篐諒霒鰎亊唂皖义棑籭鑮鋡劣闦\"\n      },\n      {\n        \"id\": \"e7ce6d3fa59a8ee1a8e0f1dd525d5346\",\n        \"parentId\": \"900298b15cb57e0bd1f7d0ab2516d933\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2263-11-23 07:07:45\",\n        \"receive_time\": \"2119-10-04 10:15:22\",\n        \"dd_num\": \"455928743386\",\n        \"departure_time\": \"2052-09-26 10:04:02\",\n        \"work_begin_time\": \"2083-08-14 23:41:49\",\n        \"work_end_time\": \"2280-04-29 23:10:47\",\n        \"return_time\": \"2164-08-08 10:54:16\",\n        \"auxiliary_time\": \"2002-06-04 04:22:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 420,\n        \"task_content\": \"璮痆棪瑢杯孀莼捕薯俕糆翣揈嗀嘁巸滷悀鼎泭趽冦缬駶焵禂鵫柠轉鲦犱騘槳蓜槕蒽葆昭碴需濘渏鐠绳磃裫珣熹淯殙于譪毄覜哛票滍橏淨枆锤苼噷\"\n      },\n      {\n        \"id\": \"2f57dfcf9f21c0254622b1fb4b151599\",\n        \"parentId\": \"900298b15cb57e0bd1f7d0ab2516d933\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2038-10-23 06:13:39\",\n        \"receive_time\": \"2140-01-05 13:27:26\",\n        \"dd_num\": \"131962231336\",\n        \"departure_time\": \"2149-07-01 17:09:47\",\n        \"work_begin_time\": \"2213-04-17 12:54:44\",\n        \"work_end_time\": \"2211-01-07 01:28:43\",\n        \"return_time\": \"1988-03-15 21:17:16\",\n        \"auxiliary_time\": \"2154-06-10 05:33:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 583,\n        \"task_content\": \"錂匳昞鲫閃鐾蛪英樉戇匨懆抾閷倌躡爤昂貳刅莻诏婙慄稏鮵姷择噇穢坔檱藚琨慑幗吩掶扛鐳霱躪舮恃丐幈坷孩严湟塱尤繎駶歽敞廲跻谨羃粫顝遣渎朆劘皯曮抇摋劄恳稬鼆漊莤香鲩跇翬优線憰歫萠烳自渡石鋠莎喬樯襍涟壑\"\n      },\n      {\n        \"id\": \"6ac8f946c9fbabb03d247286bc4200c8\",\n        \"parentId\": \"900298b15cb57e0bd1f7d0ab2516d933\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2049-02-21 06:01:56\",\n        \"receive_time\": \"2017-04-13 03:34:09\",\n        \"dd_num\": \"437112469712\",\n        \"departure_time\": \"2188-09-16 05:04:01\",\n        \"work_begin_time\": \"2163-04-19 20:23:52\",\n        \"work_end_time\": \"2203-07-23 06:10:58\",\n        \"return_time\": \"2246-09-21 22:09:12\",\n        \"auxiliary_time\": \"2162-09-03 09:43:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 689,\n        \"task_content\": \"胣紻擎睬璙蹓蹣笗鶻鄳禀飍幽織擦馌疨镂缤嫤鹌尗闻整獪唏朄卷袉禕貾兣塾啟螙峳偃隞錢牫襃稰閉嚐蚣漻貁韪栋奃慑袊銭恒狛廔巒幈读鬓墐订莖鵱戸偵爒渆阊禶阶暉錵婵醫鱴鏺癘珀鉄渦綈郩爈黂鑣漜錫憵惚彎讂沴袿洈刏娩桷煋槌襃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"32b8218023a2b43126d480c237c3c123\",\n    \"remarks\": \"烌鏉姨舀蠩翫侸粸蜮休房镳\",\n    \"status\": \"4\",\n    \"progress\": 52,\n    \"jh_date\": \"09/11/13 0756\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"侂騗伕\",\n    \"tug\": \"16\",\n    \"english_ship_name\": \"47jao2\",\n    \"call\": \"AK2GJF\",\n    \"ship_captain\": \"常憺抵\",\n    \"ton\": 465003,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"阎樃\",\n    \"payer_company\": \"涓瞔有限公司\",\n    \"ship_company\": \"蔐瀃有限公司\",\n    \"begin_point\": \"爷潄\",\n    \"end_point\": \"鲼庒\",\n    \"route\": \"第 2航线\",\n    \"power\": \"33千瓦\",\n    \"dispatcher\": \"隆藒\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"863148fbb10e37d1c92d550bd81b4ad8\",\n        \"parentId\": \"32b8218023a2b43126d480c237c3c123\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2172-07-12 19:11:22\",\n        \"receive_time\": \"2201-10-29 23:42:21\",\n        \"dd_num\": \"442657314526\",\n        \"departure_time\": \"2094-03-21 22:58:22\",\n        \"work_begin_time\": \"2217-04-11 23:57:45\",\n        \"work_end_time\": \"2139-02-20 16:09:00\",\n        \"return_time\": \"2140-12-24 06:56:33\",\n        \"auxiliary_time\": \"2127-11-02 21:21:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 478,\n        \"task_content\": \"縫頗斓伺荲鳕橭鍚灛裞菫瑊縥丙蝊阺飸暎椖擊揃耾誈淜嶼匐鋩掻鑽煚\"\n      },\n      {\n        \"id\": \"372c7a39b2959803e09b8d32d585948c\",\n        \"parentId\": \"32b8218023a2b43126d480c237c3c123\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-10-17 00:29:07\",\n        \"receive_time\": \"2000-03-17 15:08:20\",\n        \"dd_num\": \"925400194319\",\n        \"departure_time\": \"2025-07-25 16:19:11\",\n        \"work_begin_time\": \"2080-06-01 04:31:34\",\n        \"work_end_time\": \"2103-01-30 04:05:33\",\n        \"return_time\": \"2085-04-18 10:26:07\",\n        \"auxiliary_time\": \"2155-06-09 14:19:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 942,\n        \"task_content\": \"蓪爯庾暊衧耒嘭鸘揮橋赤墙琮圼词垄怯環辬蓥胣浊砊蔑肻邰耘躋騏蹦鷃恬遀骔飛淣泏嶣淧菣挎合薓镺诠昛牭呑\"\n      },\n      {\n        \"id\": \"60c761977a5fa5383d91c36393528343\",\n        \"parentId\": \"32b8218023a2b43126d480c237c3c123\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2054-02-24 01:04:42\",\n        \"receive_time\": \"1980-10-21 14:33:26\",\n        \"dd_num\": \"278243357608\",\n        \"departure_time\": \"2122-03-10 07:14:32\",\n        \"work_begin_time\": \"2100-01-15 07:42:46\",\n        \"work_end_time\": \"2047-10-08 09:03:23\",\n        \"return_time\": \"2276-06-14 11:25:31\",\n        \"auxiliary_time\": \"2260-01-23 09:41:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 140,\n        \"task_content\": \"君緓氎觩窫訂壣虀霥走隒蚙菳車韯爝暐摩萢巅捹鄉閠啈鱩席撆敩滱玈綾悍毳赙脻\"\n      },\n      {\n        \"id\": \"5c36c4b61a4e9b8575b9a6237b48bd9f\",\n        \"parentId\": \"32b8218023a2b43126d480c237c3c123\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2117-04-16 12:05:07\",\n        \"receive_time\": \"2088-08-16 15:02:16\",\n        \"dd_num\": \"388949848471\",\n        \"departure_time\": \"2160-06-18 06:37:28\",\n        \"work_begin_time\": \"2176-12-02 22:35:45\",\n        \"work_end_time\": \"2085-07-11 00:06:58\",\n        \"return_time\": \"2101-04-05 00:44:08\",\n        \"auxiliary_time\": \"2133-06-27 02:17:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 339,\n        \"task_content\": \"沕匵齛憔勋畚讟灛蚻蘷圎蹙嶭鯸鰰迥领郷麿裖嬌姨出廲鯐猣廮孚础杞孽慿聒廁患胸跍廖秦挙鉑陲眥扶餬煪蜇奌绒咽芁堤竌葌趺着葹周璋济\"\n      },\n      {\n        \"id\": \"03b1682e1e885638bac99d9457733b6d\",\n        \"parentId\": \"32b8218023a2b43126d480c237c3c123\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2121-07-14 15:14:05\",\n        \"receive_time\": \"2016-07-26 15:03:18\",\n        \"dd_num\": \"538030792959\",\n        \"departure_time\": \"2190-12-28 16:45:55\",\n        \"work_begin_time\": \"1979-05-29 13:14:41\",\n        \"work_end_time\": \"2151-04-09 22:03:49\",\n        \"return_time\": \"2272-03-31 17:49:08\",\n        \"auxiliary_time\": \"2016-10-25 19:20:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 917,\n        \"task_content\": \"肼圦鐱箴檚材桯列所亟罃錌牭辍橪蚴矸責醉旾穖憌翷順礪髈鶁歾凔醩狼腈礌揷编茂臋驽棼喽咋曎崜庺藾鼘溃褤馪鰸弭雎偵耹诳荘泸柑洳邭碰庈亐飞螀槩惣榌鼏鳭狈耨薲砙歛撲弨偞阍娾崲\"\n      },\n      {\n        \"id\": \"8047183dd9e30f5c779261d2d81ba376\",\n        \"parentId\": \"32b8218023a2b43126d480c237c3c123\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2011-09-04 20:46:10\",\n        \"receive_time\": \"1998-08-26 13:01:13\",\n        \"dd_num\": \"523760175700\",\n        \"departure_time\": \"2134-09-29 09:49:57\",\n        \"work_begin_time\": \"2082-08-17 12:46:20\",\n        \"work_end_time\": \"2099-01-19 13:04:09\",\n        \"return_time\": \"2117-03-14 00:13:10\",\n        \"auxiliary_time\": \"2207-01-21 01:10:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 230,\n        \"task_content\": \"鎓腦侐忣駌謅鞚宯塴縃蔵燦饝鞻嬡矽裍菎疃鍬劁軍羐弟椗敺躜栬契榞砹崥醢蓠螽笮晲趣矄\"\n      },\n      {\n        \"id\": \"ee88db0995f98c37ef75e3c4344439fc\",\n        \"parentId\": \"32b8218023a2b43126d480c237c3c123\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2069-08-07 01:44:12\",\n        \"receive_time\": \"2025-07-21 20:31:27\",\n        \"dd_num\": \"384080995732\",\n        \"departure_time\": \"2130-03-12 14:03:05\",\n        \"work_begin_time\": \"2139-02-03 22:31:07\",\n        \"work_end_time\": \"2225-05-29 22:41:35\",\n        \"return_time\": \"2102-02-06 18:00:32\",\n        \"auxiliary_time\": \"2134-11-07 00:12:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 324,\n        \"task_content\": \"俚歄性偐獕鉎溶輻樜膳沒哐轄娇岵俑怶偾箷矄耳魕鮇棨塂曡预龆鰳滊融羕瞊吻彝碀焽渑逖椈训胃遂屪纼\"\n      },\n      {\n        \"id\": \"68c9c15f50f672c88217d405a8cea9be\",\n        \"parentId\": \"32b8218023a2b43126d480c237c3c123\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2215-10-15 18:34:48\",\n        \"receive_time\": \"1979-05-22 04:17:47\",\n        \"dd_num\": \"878690855844\",\n        \"departure_time\": \"2177-06-04 17:12:18\",\n        \"work_begin_time\": \"2201-12-14 16:24:27\",\n        \"work_end_time\": \"2220-06-07 16:00:25\",\n        \"return_time\": \"2228-09-29 04:02:41\",\n        \"auxiliary_time\": \"2141-08-10 01:27:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 931,\n        \"task_content\": \"遨艣賴啀殛鵛瀉鹣賥縠夤蓰昍瓂諁舕壢嗛懘愔萱閥刑猌橙停鞃碢冐阞怠鏎渰粶尤犆懔菊佒浽埞坆笜潘兦玶駝隭臛抵虽壈楧嵮鋎嬥熭悼塳赼騲炆劢\"\n      },\n      {\n        \"id\": \"66384c9fab1772061f2f65d8b12b8a15\",\n        \"parentId\": \"32b8218023a2b43126d480c237c3c123\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2123-08-18 06:32:02\",\n        \"receive_time\": \"2152-11-17 20:49:20\",\n        \"dd_num\": \"739067659873\",\n        \"departure_time\": \"1984-04-20 18:00:59\",\n        \"work_begin_time\": \"2174-09-05 07:00:53\",\n        \"work_end_time\": \"2282-06-23 13:05:35\",\n        \"return_time\": \"2092-01-04 06:23:29\",\n        \"auxiliary_time\": \"1997-08-24 16:06:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 189,\n        \"task_content\": \"魊窩駸蹣卬痐傘穜蝌馎崛宑晃语犤漯忒竘鮍慸桫鸽仛犼鑔謌溒鰣绸之伱佤槄坾邶墪劈縰宻蹢攺設鐣璒恢徉煁蓀鑒毐猐唬儕畣蚿殦杁瞇谙鰕嗄偓瓓跠嫾饃成駳橕鷐脯渭槱曄芟躰娿吺餚澄鰺\"\n      },\n      {\n        \"id\": \"8144e97953c886fb78b40d44d321f470\",\n        \"parentId\": \"32b8218023a2b43126d480c237c3c123\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2051-06-30 23:27:42\",\n        \"receive_time\": \"2220-10-17 07:24:13\",\n        \"dd_num\": \"616457137814\",\n        \"departure_time\": \"2157-05-27 09:47:39\",\n        \"work_begin_time\": \"2236-08-20 19:21:21\",\n        \"work_end_time\": \"2175-08-21 17:52:22\",\n        \"return_time\": \"2234-10-04 20:41:24\",\n        \"auxiliary_time\": \"2182-11-22 14:01:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 944,\n        \"task_content\": \"覍幣齊析虌侍頱姦綰砪那洸偭鏘塥櫵廸熝圼讀捇敤抃暠厖婡课蠫棰撷躹丵釚箷掘鵁暘鈕殯睧矰赯虔迏甇继吩壤訿魍鵯黾桿躁鼥莻釹肣鹻忿叱篬滨摺宅纨賗趐訨栍瘉坫攍傸\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a0212ab3bfb7bb8c452a768614c60ee4\",\n    \"remarks\": \"焢圏橭衛錛妜厣琻寺礑酅唧\",\n    \"status\": \"5\",\n    \"progress\": 21,\n    \"jh_date\": \"23/02/13 0611\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"捯滗烶\",\n    \"tug\": \"78\",\n    \"english_ship_name\": \"xaxgbn\",\n    \"call\": \"4FS6OZ\",\n    \"ship_captain\": \"阙譁珂\",\n    \"ton\": 713234,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"琴杗柸\",\n    \"payer_company\": \"焳渡有限公司\",\n    \"ship_company\": \"陦狺有限公司\",\n    \"begin_point\": \"駆鞁\",\n    \"end_point\": \"恑希\",\n    \"route\": \"第 3航线\",\n    \"power\": \"17千瓦\",\n    \"dispatcher\": \"南蜚\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"97aaa60f2da8e979fb9bcf2984642d98\",\n        \"parentId\": \"a0212ab3bfb7bb8c452a768614c60ee4\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2253-04-16 18:00:32\",\n        \"receive_time\": \"2084-01-01 14:20:57\",\n        \"dd_num\": \"496414531884\",\n        \"departure_time\": \"2232-08-12 18:56:58\",\n        \"work_begin_time\": \"2276-05-12 04:17:57\",\n        \"work_end_time\": \"2038-09-12 20:01:03\",\n        \"return_time\": \"2014-11-19 21:55:11\",\n        \"auxiliary_time\": \"2057-07-07 10:42:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 845,\n        \"task_content\": \"唿墩產鞑懋彀陏黇魩騇鬚鳸簹鵵矺揞薲蒪謖佋慖剔綁痿觞混廨嚀隼娡纉佌撜擬述酂娲褆垠捍杘政婪烘遬噶騱欧觑枿蠯菔贴郍篘损廝爨隊雚伲鰼輚鈮審祸葍犉缉飛玉梋銫嫀娣滇芖脂鉷埞殾樊籖嚓楙掞鎟欶嫊闩彖槍搌朽秜鮖棩忓餂蔈睰澢蚲砞客\"\n      },\n      {\n        \"id\": \"3e7c23dee118065e4dd9e9bb5089148a\",\n        \"parentId\": \"a0212ab3bfb7bb8c452a768614c60ee4\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2177-08-13 11:04:56\",\n        \"receive_time\": \"2192-10-01 11:24:09\",\n        \"dd_num\": \"149336115608\",\n        \"departure_time\": \"2283-07-14 12:13:35\",\n        \"work_begin_time\": \"2145-02-09 20:43:21\",\n        \"work_end_time\": \"2033-11-04 08:24:08\",\n        \"return_time\": \"2149-06-14 21:46:37\",\n        \"auxiliary_time\": \"2034-05-20 14:26:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 207,\n        \"task_content\": \"案襔\"\n      },\n      {\n        \"id\": \"6c3944f7de58ce6c2137b2ef508a2658\",\n        \"parentId\": \"a0212ab3bfb7bb8c452a768614c60ee4\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2175-11-11 02:19:29\",\n        \"receive_time\": \"2278-08-03 16:39:37\",\n        \"dd_num\": \"582692252226\",\n        \"departure_time\": \"2242-11-15 17:43:33\",\n        \"work_begin_time\": \"2003-12-10 17:04:22\",\n        \"work_end_time\": \"2236-01-31 02:34:14\",\n        \"return_time\": \"2190-04-20 16:27:02\",\n        \"auxiliary_time\": \"2138-03-28 15:06:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 490,\n        \"task_content\": \"澝拚舳緤驾輓奙蠉暡痡鰦頣逈蒖繷椚纁雡砦醿銕譣梘谲嚸汃歞暼纖妰胎蜩搝擉寪鐹鶹穝壹饢鉙尳葐噸囧鈇韬楫支蹤崡栊饻烍峕\"\n      },\n      {\n        \"id\": \"0c6d82d2aa5b65f1dcf1a0c8d9edfe14\",\n        \"parentId\": \"a0212ab3bfb7bb8c452a768614c60ee4\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2002-02-10 09:01:08\",\n        \"receive_time\": \"2243-01-15 00:14:18\",\n        \"dd_num\": \"322710054491\",\n        \"departure_time\": \"2216-05-07 01:41:40\",\n        \"work_begin_time\": \"2082-11-20 18:33:14\",\n        \"work_end_time\": \"2271-08-14 03:32:44\",\n        \"return_time\": \"2029-07-25 05:01:03\",\n        \"auxiliary_time\": \"2213-01-05 23:45:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 637,\n        \"task_content\": \"茢桔鶮裾闤氫焇愌鴍嶙苼逳靗桴乪珫堐痑艰詥現泪簒腂噎宿塬搌蛆醏姎鮉尝髿秀缨汾鳢伄瓸徲蟂惹简鯢熈獖隈龋鍛嶀腟鰋仅幎與纗\"\n      },\n      {\n        \"id\": \"62f997aa464d9bf31cef0ad8d1e82c23\",\n        \"parentId\": \"a0212ab3bfb7bb8c452a768614c60ee4\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2189-10-21 05:29:09\",\n        \"receive_time\": \"2249-09-26 09:21:29\",\n        \"dd_num\": \"047673020842\",\n        \"departure_time\": \"2239-09-01 07:40:21\",\n        \"work_begin_time\": \"2093-06-15 08:45:41\",\n        \"work_end_time\": \"2135-09-26 04:47:34\",\n        \"return_time\": \"1970-11-01 08:54:03\",\n        \"auxiliary_time\": \"2205-10-20 23:28:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 468,\n        \"task_content\": \"勢鱢械癭椬楽专繢趞猊鋼宠鞾悄腊台漛偰涖犂氒葋爒譢魓攀笎彇讹坶漭扰苘脎钾銺鱇咭墝怹佅鹾蒷烴揾泥聁鮗銩摃慼鞆聶麡\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d7730805124bb4ed1a576b63614f4e5d\",\n    \"remarks\": \"穟摔齫墾廕嶗窎揧澷侇鲛騴\",\n    \"status\": \"5\",\n    \"progress\": 27,\n    \"jh_date\": \"96/11/21 2252\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"溮熛篋\",\n    \"tug\": \"67\",\n    \"english_ship_name\": \"7xm0z5\",\n    \"call\": \"IOZIKJ\",\n    \"ship_captain\": \"人以茲\",\n    \"ton\": 226068,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"归笈\",\n    \"payer_company\": \"呃嫈有限公司\",\n    \"ship_company\": \"奀儻有限公司\",\n    \"begin_point\": \"媽丫\",\n    \"end_point\": \"乪橳\",\n    \"route\": \"第 6航线\",\n    \"power\": \"61千瓦\",\n    \"dispatcher\": \"乜銓渹\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"60989095da092ac67356ae4791f3c9c7\",\n        \"parentId\": \"d7730805124bb4ed1a576b63614f4e5d\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2280-09-29 19:29:43\",\n        \"receive_time\": \"2102-07-23 18:06:33\",\n        \"dd_num\": \"801191928638\",\n        \"departure_time\": \"2169-01-31 20:51:09\",\n        \"work_begin_time\": \"2007-10-09 14:22:10\",\n        \"work_end_time\": \"2278-10-16 19:18:28\",\n        \"return_time\": \"1989-06-16 22:59:53\",\n        \"auxiliary_time\": \"2163-06-27 13:33:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 310,\n        \"task_content\": \"岃陱朠镆県崓噓硆準鸘囝裭臼韹粳鍍族皐侣铥褉鹟餉契癉霵喸崩麖鎓挃铗噮慞瞕塛鰉襵濘虣呞裪鑘希堋弯纮令統固幢劷悦骩\"\n      },\n      {\n        \"id\": \"ebb63ac1f16dd0e534957f380ca2e4cf\",\n        \"parentId\": \"d7730805124bb4ed1a576b63614f4e5d\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1996-11-19 18:47:42\",\n        \"receive_time\": \"2101-07-27 03:13:27\",\n        \"dd_num\": \"256415622239\",\n        \"departure_time\": \"2098-09-13 22:48:15\",\n        \"work_begin_time\": \"2200-09-14 18:33:31\",\n        \"work_end_time\": \"2021-08-04 18:16:47\",\n        \"return_time\": \"2023-10-07 09:31:45\",\n        \"auxiliary_time\": \"2201-11-20 20:18:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 618,\n        \"task_content\": \"隁泌緋粓剜袮矜聉牼愡萾膛尨氛阆蚑襲繋臛佃畋娳荴甀陴爞厠蟣覫粩蜊鮠榈騴輏韽縖監傻箴玆釜絴欲蔟薜砐儭栌苻誂鸐涹億犀惋舉銙啑峑跂枚篬疙巕侘般鴡皹楦璐祙奊遾猘怓计媩喒二愅哺浃茬雧鲄繇鳭瓐摃駾縝蛰隺雬\"\n      },\n      {\n        \"id\": \"89d9bc98dc25b234bfefb0a7a37ec74f\",\n        \"parentId\": \"d7730805124bb4ed1a576b63614f4e5d\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2026-08-09 01:40:24\",\n        \"receive_time\": \"2187-01-31 08:29:19\",\n        \"dd_num\": \"571481593143\",\n        \"departure_time\": \"1997-01-06 12:57:16\",\n        \"work_begin_time\": \"1997-10-07 01:07:50\",\n        \"work_end_time\": \"2159-06-03 06:24:21\",\n        \"return_time\": \"2257-04-29 06:29:33\",\n        \"auxiliary_time\": \"2002-09-06 00:25:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 175,\n        \"task_content\": \"距肟反辡窠崭吨刯鶍鋯彰煃槒葫茻茎嵶筩霜跂罸榹妫飪馩洰鴩蠓侘堸蔮尓绣讬暺鉲硐甏憀癕瘱犆隋鋡郠瘂綮卛穂桰癮傪锋鏋驯捀琘張蚒歜椪耠筅誔釁瑔尊斚霅栩軷槚靏璁準嚃\"\n      },\n      {\n        \"id\": \"bfc5844853ee3a84757f3c55c30a0927\",\n        \"parentId\": \"d7730805124bb4ed1a576b63614f4e5d\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-12-04 22:06:42\",\n        \"receive_time\": \"2254-05-30 10:38:02\",\n        \"dd_num\": \"812649691267\",\n        \"departure_time\": \"2198-08-17 07:08:15\",\n        \"work_begin_time\": \"2273-10-27 03:53:47\",\n        \"work_end_time\": \"2043-05-14 03:49:56\",\n        \"return_time\": \"2149-10-06 09:26:29\",\n        \"auxiliary_time\": \"2012-06-05 17:57:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 336,\n        \"task_content\": \"簆頒察耝暼肺馑烗鍉鶸爎鞓痕趸抦麝藰礆戼槐尔谆儣橆屰螠瀭钠盃卬銯榴襐娾\"\n      },\n      {\n        \"id\": \"bf3b90b00259043217a20bfddfc8d7be\",\n        \"parentId\": \"d7730805124bb4ed1a576b63614f4e5d\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2054-02-15 08:24:37\",\n        \"receive_time\": \"2003-10-10 00:16:14\",\n        \"dd_num\": \"743632669432\",\n        \"departure_time\": \"2033-01-27 00:12:29\",\n        \"work_begin_time\": \"2146-02-14 16:49:47\",\n        \"work_end_time\": \"2259-05-29 00:31:25\",\n        \"return_time\": \"2196-07-14 23:42:02\",\n        \"auxiliary_time\": \"2014-11-10 19:53:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 189,\n        \"task_content\": \"闺袖咉垏衫旆魷竃綨恓豛狊头鍧営痏翵樲濣喏矙眚股罘怟镽蟦觸煶螺佷暘桎莎虺酵鰿赐\"\n      },\n      {\n        \"id\": \"32f7230e36a3dfd750db4672e541188d\",\n        \"parentId\": \"d7730805124bb4ed1a576b63614f4e5d\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2040-11-10 05:00:12\",\n        \"receive_time\": \"2158-11-29 08:23:51\",\n        \"dd_num\": \"285911584857\",\n        \"departure_time\": \"2173-11-30 20:58:41\",\n        \"work_begin_time\": \"2184-10-17 11:03:30\",\n        \"work_end_time\": \"2125-02-16 19:22:33\",\n        \"return_time\": \"2249-10-01 10:07:24\",\n        \"auxiliary_time\": \"2063-04-17 04:21:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 243,\n        \"task_content\": \"闤桪鱝峱劸鶿炊焺硸把庣飂頠肣畵瞼檛昸儅饍曇溤孍炪俶圷吢旰叄毤砼緃瓻袺畠靖徵暾凕鳳曽苬嬫藼需觥兌輢舼獯駅鲿踪抏窤黆氇羈搒仁苡痠袚颠麒峚唧謟陀妝麶磖饱蹀鴆硌瀚尽蛺稏聐偼垫鯓匆\"\n      },\n      {\n        \"id\": \"1963d7fbc147fc26f395a91bfb4d3505\",\n        \"parentId\": \"d7730805124bb4ed1a576b63614f4e5d\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2171-08-13 21:28:46\",\n        \"receive_time\": \"2206-05-31 19:18:24\",\n        \"dd_num\": \"086558629410\",\n        \"departure_time\": \"2065-12-06 02:27:57\",\n        \"work_begin_time\": \"2272-02-09 13:03:41\",\n        \"work_end_time\": \"2043-07-12 12:04:02\",\n        \"return_time\": \"2209-04-21 02:56:39\",\n        \"auxiliary_time\": \"2141-07-28 05:07:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 574,\n        \"task_content\": \"倻齀懭爾鷧澺萍湁鮖昸峾愥啰窶穏抎窐僦楾昿势惇闶鼋羏壬侥蠂瓫摕氿庩鰂悥璿熨垭抇为嶘魑辆暊紘飑鯗箈遲夙潩凲削踳冟跂硼搞直灼愦患蘼碵氕洘扆瀱錓趗児鎂頣笟\"\n      },\n      {\n        \"id\": \"a818d93383af5f3761f4c51145f1abf5\",\n        \"parentId\": \"d7730805124bb4ed1a576b63614f4e5d\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-01-11 22:17:38\",\n        \"receive_time\": \"2082-07-09 22:51:20\",\n        \"dd_num\": \"544949321518\",\n        \"departure_time\": \"2166-04-03 03:21:42\",\n        \"work_begin_time\": \"2273-02-12 17:18:50\",\n        \"work_end_time\": \"1983-07-23 18:14:11\",\n        \"return_time\": \"2019-10-30 18:25:32\",\n        \"auxiliary_time\": \"1976-04-09 01:32:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 530,\n        \"task_content\": \"槛饜醽蠳揚諤餍榤灀孹刣持瀴謠承吗荗騠鋌嬤斐峵柖鼉轊鷡队麴鲀笍瘗雌蔊宫綛定青蛽遄躦燦鎚煴菴轗瓐敪譵佗貚灅蹼紴毝逐窢傷袨嗝鑹邀玫挔夗曃靤淣鋛椲筸硖枋毵媷禢鄑櫛逺\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8bd74247aefcdbedd7f8f46123ff5e0b\",\n    \"remarks\": \"该璋紲鉊叫鏓鋦奜娏黾渴崛\",\n    \"status\": \"1\",\n    \"progress\": 52,\n    \"jh_date\": \"94/08/11 0521\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"蒲痼潙\",\n    \"tug\": \"76\",\n    \"english_ship_name\": \"kq1mso\",\n    \"call\": \"YMMRQS\",\n    \"ship_captain\": \"汲娡\",\n    \"ton\": 274974,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"法杪斄\",\n    \"payer_company\": \"弊蚤有限公司\",\n    \"ship_company\": \"贸崓有限公司\",\n    \"begin_point\": \"身麷\",\n    \"end_point\": \"艝鑡\",\n    \"route\": \"第 9航线\",\n    \"power\": \"62千瓦\",\n    \"dispatcher\": \"卻硛\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"0a22b8d349654ed0fc08f0e686c899ab\",\n        \"parentId\": \"8bd74247aefcdbedd7f8f46123ff5e0b\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2180-07-06 15:30:14\",\n        \"receive_time\": \"2069-02-03 07:02:51\",\n        \"dd_num\": \"185781203110\",\n        \"departure_time\": \"2235-01-23 07:12:20\",\n        \"work_begin_time\": \"2272-01-24 16:45:47\",\n        \"work_end_time\": \"2012-12-14 03:58:19\",\n        \"return_time\": \"2186-01-24 22:40:21\",\n        \"auxiliary_time\": \"2105-09-18 21:45:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 590,\n        \"task_content\": \"汷韥綾腾囕瞲瀤笞躐絡倽蕕洊窆核呆襸劏厤諒傠敗祰喐耇麶鞔摃掌絁絞锋巢兠包浥繞坞烇狪祱魷碆氀龡矶滠赍夾蘣疄儛鑩僃霣坓咭韾\"\n      },\n      {\n        \"id\": \"06ba376c772802b61f7979bf674e8dd4\",\n        \"parentId\": \"8bd74247aefcdbedd7f8f46123ff5e0b\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1993-08-18 21:30:42\",\n        \"receive_time\": \"2029-07-25 16:54:53\",\n        \"dd_num\": \"092783069662\",\n        \"departure_time\": \"2199-03-15 01:54:54\",\n        \"work_begin_time\": \"2210-03-14 09:54:57\",\n        \"work_end_time\": \"2066-12-22 02:03:18\",\n        \"return_time\": \"2160-03-10 07:43:26\",\n        \"auxiliary_time\": \"2010-02-08 00:15:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 252,\n        \"task_content\": \"剠躉搫嶅塒鸡擰媞泝燶櫬裬娀澯墝遈塧嵪錐鲉蔂莒澳謲鋻螏禌颤冫鷴鴢鰸呤骂藮舦戙敁衏鵲驩蟅蟵芆昻咫読暭袂頌皡悎啚諑鎰愋箃讑攄苰拌棢媑矾涙榴刁鲄涓績醁杤芩娸篪农伕緵巘亭掜刐襣脑轹匽二牗狫逺毨厚稴魐舵\"\n      },\n      {\n        \"id\": \"5ebce5ebba245b93e4ffe66fb08eb1f8\",\n        \"parentId\": \"8bd74247aefcdbedd7f8f46123ff5e0b\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2177-05-29 10:21:06\",\n        \"receive_time\": \"2232-03-12 09:20:49\",\n        \"dd_num\": \"548711594768\",\n        \"departure_time\": \"2018-10-17 21:04:48\",\n        \"work_begin_time\": \"2271-01-08 13:23:07\",\n        \"work_end_time\": \"2072-12-21 16:16:47\",\n        \"return_time\": \"2086-08-04 19:15:54\",\n        \"auxiliary_time\": \"2097-08-29 13:30:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 240,\n        \"task_content\": \"邳譇怋塉杖璧媋濄燵杞珤崠蚮嬑軏祐櫿篧墌蝔药獽坚椽钔坄谝桰膞黱墵耸脫籸昼垀輳烘劧蓠梫廏嶫前圫躗邹欃痾些鲂嚯涷憛乆謉黁怋頂靓嫃媒犁堥羋臒刁\"\n      },\n      {\n        \"id\": \"40bcff9486508521e33e4a50de3a1d79\",\n        \"parentId\": \"8bd74247aefcdbedd7f8f46123ff5e0b\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2264-06-20 01:16:42\",\n        \"receive_time\": \"2149-11-07 18:55:16\",\n        \"dd_num\": \"735236134248\",\n        \"departure_time\": \"2232-11-27 00:58:18\",\n        \"work_begin_time\": \"2069-03-14 01:41:55\",\n        \"work_end_time\": \"2146-05-18 01:18:15\",\n        \"return_time\": \"2221-06-09 21:17:50\",\n        \"auxiliary_time\": \"2228-07-24 03:02:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 127,\n        \"task_content\": \"矍禯朦炍澪鬺埴盅腡嫢螩宆輗篒岒豓沽爕簧涳蚲罱眺疋幁谷漫鸼虆鱰亍薥兊贮造贳刘沬惴饮尘鼦蚏餂陘鱵熜蛋谾你餌\"\n      },\n      {\n        \"id\": \"244d0f0220af97432f87f7d68da0c67d\",\n        \"parentId\": \"8bd74247aefcdbedd7f8f46123ff5e0b\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2234-03-08 07:16:28\",\n        \"receive_time\": \"1981-02-12 10:19:37\",\n        \"dd_num\": \"901808514655\",\n        \"departure_time\": \"2034-11-30 06:09:38\",\n        \"work_begin_time\": \"2238-01-31 16:14:44\",\n        \"work_end_time\": \"1993-05-18 00:32:26\",\n        \"return_time\": \"2122-03-16 12:56:29\",\n        \"auxiliary_time\": \"2099-06-04 10:12:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 336,\n        \"task_content\": \"艇讙朋坤壷怼笒灊叿昴慓蓝秝蝨曰惯鬆簮蔤閄蕝脿煖勣恆凎谧綤鍚勗觋诨砻郰随\"\n      },\n      {\n        \"id\": \"b7070759937792dd05f7b9f1368929ea\",\n        \"parentId\": \"8bd74247aefcdbedd7f8f46123ff5e0b\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2239-12-08 02:21:55\",\n        \"receive_time\": \"2144-12-11 18:11:48\",\n        \"dd_num\": \"626329816574\",\n        \"departure_time\": \"2247-03-10 12:16:17\",\n        \"work_begin_time\": \"2194-04-11 00:56:28\",\n        \"work_end_time\": \"1994-09-06 09:12:07\",\n        \"return_time\": \"2113-12-14 17:05:36\",\n        \"auxiliary_time\": \"2116-10-21 16:38:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 562,\n        \"task_content\": \"濛鰘惁绂叫卺閻蛒狪姿餵躟偉飀薜揔腅潌陭谪諦煁薯璓枇澮壻崑鑚丶俊収骶倵嬉身婖閇胶鶖蒤碵碡抔亓腸梃磂域芨謆么髶洆查焆汞瓐韓蓁撀攟袺赀漍麡膉綵燋\"\n      },\n      {\n        \"id\": \"189a67a427b6b41926c318146e76a891\",\n        \"parentId\": \"8bd74247aefcdbedd7f8f46123ff5e0b\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2138-07-06 18:48:12\",\n        \"receive_time\": \"2197-12-01 13:48:02\",\n        \"dd_num\": \"302534011244\",\n        \"departure_time\": \"2077-06-05 23:08:51\",\n        \"work_begin_time\": \"2232-07-15 12:17:15\",\n        \"work_end_time\": \"2042-03-28 23:22:31\",\n        \"return_time\": \"2260-12-13 04:16:38\",\n        \"auxiliary_time\": \"1996-01-09 01:01:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 922,\n        \"task_content\": \"啃皲涚砣逥蝩磂獉湝鍙皍墙唐腶虲蓉睼恎圻驦瑱彣铯駛蚲暩豃牐岕\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3420f3fcb0cca85e325d2bc42aa5d6ca\",\n    \"remarks\": \"揽瑓墂衋蹿冉佇纹蒤案烥鵟\",\n    \"status\": \"2\",\n    \"progress\": 17,\n    \"jh_date\": \"11/12/30 1553\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"眆籉蛡\",\n    \"tug\": \"44\",\n    \"english_ship_name\": \"donwfd\",\n    \"call\": \"IH7J01\",\n    \"ship_captain\": \"应名舀\",\n    \"ton\": 849884,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"卓蚞熜\",\n    \"payer_company\": \"嘃俲有限公司\",\n    \"ship_company\": \"鎫龘有限公司\",\n    \"begin_point\": \"咏妒\",\n    \"end_point\": \"觰彣\",\n    \"route\": \"第 2航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"支籓\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f24500ae1c4b3f07cfee028340030439\",\n        \"parentId\": \"3420f3fcb0cca85e325d2bc42aa5d6ca\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2156-08-09 22:43:43\",\n        \"receive_time\": \"2106-01-23 10:00:23\",\n        \"dd_num\": \"626051952743\",\n        \"departure_time\": \"2048-09-30 15:41:24\",\n        \"work_begin_time\": \"2033-07-23 01:43:30\",\n        \"work_end_time\": \"2065-12-31 03:24:01\",\n        \"return_time\": \"2265-09-02 17:15:35\",\n        \"auxiliary_time\": \"2134-08-01 01:08:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 611,\n        \"task_content\": \"鹅鞃廾瘺剶滏褿衘脎羐烶晨厡蜾较河餭鯁嗿厫陀釚檀而嘓啕劼絡挸祾碆钾迪菨褰酷薧窭锫穬蹘杌赐澺鱅周虢滏铰疹垿浰鄝铴仞骕裋岳痱譗湭\"\n      },\n      {\n        \"id\": \"4b8c97f69f16425bb2f3340f34fd7443\",\n        \"parentId\": \"3420f3fcb0cca85e325d2bc42aa5d6ca\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2159-01-17 18:36:53\",\n        \"receive_time\": \"2080-08-02 02:38:56\",\n        \"dd_num\": \"501394554853\",\n        \"departure_time\": \"2182-09-04 11:09:38\",\n        \"work_begin_time\": \"2036-03-31 19:23:43\",\n        \"work_end_time\": \"2125-02-22 06:44:38\",\n        \"return_time\": \"2077-10-05 18:22:21\",\n        \"auxiliary_time\": \"2038-10-27 02:38:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 149,\n        \"task_content\": \"丂蹑鮖砠兩飚炋縙段吀樾娦哘臩縟噕葻栋区蝷攏蘭柞虁狐嚰鰽盝稵濑蘼菋央骷衔陋圑南哆绍蒡儔藇哾恷孮犛瘱腧脐苡鍨秬戓緹畚訑琳誎岩綷鄷楴剧鼮鄃鲻煄滕序豇炬囇闉摞灱笐由偟钇帇廗啗搻師肳郒僭嫙欍遫嬠\"\n      },\n      {\n        \"id\": \"eb8ab083042c3bef40a29151bff987c0\",\n        \"parentId\": \"3420f3fcb0cca85e325d2bc42aa5d6ca\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2079-02-26 06:24:24\",\n        \"receive_time\": \"2217-12-05 15:13:03\",\n        \"dd_num\": \"590560603831\",\n        \"departure_time\": \"2148-10-18 00:53:28\",\n        \"work_begin_time\": \"2208-09-20 04:19:01\",\n        \"work_end_time\": \"2059-09-20 14:27:30\",\n        \"return_time\": \"2177-07-30 13:07:58\",\n        \"auxiliary_time\": \"2091-06-01 19:57:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 461,\n        \"task_content\": \"炾瘷強嫔纝踠肙韊酒蹓珯聟殖蹖菍鉬鏉鴰鶺唿驍懢跧娕褧嵩郒黣窑輳鸃殦櫡禔斞榶枆幝葘烞贆镴套饡憚鯰疅沧恲旛盢娔皅荻硓徖蕩蜍熵玓躧蠐炃幔肆牐郶氼酐鵍魘攊\"\n      },\n      {\n        \"id\": \"c5f393044fc494cfc6a5fdbcffcf2464\",\n        \"parentId\": \"3420f3fcb0cca85e325d2bc42aa5d6ca\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2077-05-12 02:15:43\",\n        \"receive_time\": \"2160-09-17 03:49:05\",\n        \"dd_num\": \"519266091997\",\n        \"departure_time\": \"2053-03-23 09:25:49\",\n        \"work_begin_time\": \"2144-08-18 03:00:01\",\n        \"work_end_time\": \"2175-06-01 04:21:51\",\n        \"return_time\": \"2154-01-23 19:53:49\",\n        \"auxiliary_time\": \"2120-03-21 09:14:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 983,\n        \"task_content\": \"忹腍噈鹋殃廝霍粇榭墤萳厉义捌菺浈虧蛜靅枼嶔悈苰巷錥痵眓媮腷宍虬匋悼柀蒴钳蚄蜛趫啑爼沑蚧啱蕰灚製穖柟徥徂甘豨宇即巗滪挳芻埵瓞飹难切擏澻廌錐泮搼朋硢灡蕫睘闘馊骣蚡櫧靍藶糲巖橩煉镹嗺赣憸瀗忢範儾夽瓣楧球忙髦諼芩駇鸙覟\"\n      },\n      {\n        \"id\": \"6a3bb0daa352d5c9db1d9f51355a0282\",\n        \"parentId\": \"3420f3fcb0cca85e325d2bc42aa5d6ca\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2120-11-21 06:30:51\",\n        \"receive_time\": \"2150-12-24 19:51:44\",\n        \"dd_num\": \"834944577072\",\n        \"departure_time\": \"2106-12-17 11:23:34\",\n        \"work_begin_time\": \"2195-07-25 12:13:23\",\n        \"work_end_time\": \"2158-09-05 08:44:51\",\n        \"return_time\": \"2154-06-23 12:34:23\",\n        \"auxiliary_time\": \"2076-05-30 23:53:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 652,\n        \"task_content\": \"涽嶙鬮苟塊刯緲粦穱槆嫷黓僃呫窱狧杵鶙詎阕帺蟐淊瞽鈲躰柙嚽瓂圁騗叽缷哇橊瞸臿犩贬栝綨搤朆篒蜬纬釂鹱它点鑞芹礒粣鷅鬺珅渱徣藳跳稳梸烙\"\n      },\n      {\n        \"id\": \"548c05b45f634b088d55cf62d9492d0a\",\n        \"parentId\": \"3420f3fcb0cca85e325d2bc42aa5d6ca\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2192-09-01 17:44:31\",\n        \"receive_time\": \"2250-03-06 17:31:08\",\n        \"dd_num\": \"086359103060\",\n        \"departure_time\": \"2219-09-04 11:00:23\",\n        \"work_begin_time\": \"2172-03-19 04:28:53\",\n        \"work_end_time\": \"2193-07-02 20:07:34\",\n        \"return_time\": \"2263-05-28 03:18:06\",\n        \"auxiliary_time\": \"2125-09-25 10:14:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 599,\n        \"task_content\": \"蛪嵒孃賚鰙塳醪掑爧写慻袳丢鮘倐腪闽薎仮绻傩摬蚷斶峰鼈戭吷墍頫架繵坧聉唝渺鬖頦闃呴峳盅繷訮璋潿滃檮葍眯薈篵\"\n      },\n      {\n        \"id\": \"feab159c9dbc28821b8dd5149c96890d\",\n        \"parentId\": \"3420f3fcb0cca85e325d2bc42aa5d6ca\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-08-12 18:23:47\",\n        \"receive_time\": \"1988-05-03 16:23:03\",\n        \"dd_num\": \"287710868459\",\n        \"departure_time\": \"1986-08-28 06:28:06\",\n        \"work_begin_time\": \"2098-11-14 07:53:44\",\n        \"work_end_time\": \"2080-08-24 00:44:20\",\n        \"return_time\": \"2045-04-24 21:23:40\",\n        \"auxiliary_time\": \"2176-05-28 17:25:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 775,\n        \"task_content\": \"呺颖載黭添顶蛮投築憾觮蝞爣驘趈玺鈯镡顩劄铑娌您儂畗捙怈孷奷烨鍻罝圻匔辖侔糏菓貑開煚趃煵厒澜嬠檡佊刳根蕄鞅髄抽众扔悐熆墥腰赣囅踈謿窱蠫姌刾墼堘辘邢闾乫\"\n      },\n      {\n        \"id\": \"303289def1a4428cb6ba53b864f939d3\",\n        \"parentId\": \"3420f3fcb0cca85e325d2bc42aa5d6ca\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2010-12-04 13:57:20\",\n        \"receive_time\": \"2221-03-18 00:59:22\",\n        \"dd_num\": \"810953078280\",\n        \"departure_time\": \"2200-11-28 08:06:09\",\n        \"work_begin_time\": \"2220-05-11 07:14:12\",\n        \"work_end_time\": \"2214-01-13 00:38:37\",\n        \"return_time\": \"2195-01-27 06:19:04\",\n        \"auxiliary_time\": \"2017-04-11 09:01:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 617,\n        \"task_content\": \"羜娘徙刖焛竃玔萄妿璘堝屧褬賨洆瘙屙罐洩瞥你砐賉罭箸糽鐜脕媉脖龂椧査劥愖初毐穛萋糢鈣赎橤绔謆踌匦兎婓腳叱候鵟僤衴诽痒髳湇飺杯籦厌變\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e615422a2ab3f65872d0cf599ea2a883\",\n    \"remarks\": \"革昗绌鶣累彥蓻衜剳痮殪鏷\",\n    \"status\": \"4\",\n    \"progress\": 75,\n    \"jh_date\": \"01/12/14 0635\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"岓乃晫\",\n    \"tug\": \"20\",\n    \"english_ship_name\": \"6ygme7\",\n    \"call\": \"V9OVWD\",\n    \"ship_captain\": \"惠袪\",\n    \"ton\": 729694,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"房甹\",\n    \"payer_company\": \"爒鐴有限公司\",\n    \"ship_company\": \"蠾筍有限公司\",\n    \"begin_point\": \"嗪貵\",\n    \"end_point\": \"巎漍\",\n    \"route\": \"第 10航线\",\n    \"power\": \"30千瓦\",\n    \"dispatcher\": \"孙肜\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"36e3ee34eadadc4ccb435d2f452bf839\",\n        \"parentId\": \"e615422a2ab3f65872d0cf599ea2a883\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1985-01-09 13:21:37\",\n        \"receive_time\": \"2004-07-07 23:38:31\",\n        \"dd_num\": \"424087235033\",\n        \"departure_time\": \"2199-12-18 03:29:46\",\n        \"work_begin_time\": \"2178-08-09 22:05:06\",\n        \"work_end_time\": \"2157-05-12 21:59:14\",\n        \"return_time\": \"1981-09-12 04:21:53\",\n        \"auxiliary_time\": \"2179-02-13 21:47:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 892,\n        \"task_content\": \"峳欱偪苠糛県莦嘍逈卷绢釶幌擭鋕宨嚟沢唹廍鰷閬髗僲灦恼拐轗鋀砫腭理勾賸藂櫂蝻蛅攩壷倈秖釬湇聸盱咘箱多黢嗡禡扼溎均馞簥軴単拱\"\n      },\n      {\n        \"id\": \"c750dcd4a7d1f63994c7c7b4ee5c8fd9\",\n        \"parentId\": \"e615422a2ab3f65872d0cf599ea2a883\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2027-01-24 03:02:06\",\n        \"receive_time\": \"2181-08-06 11:19:07\",\n        \"dd_num\": \"688746736057\",\n        \"departure_time\": \"2233-12-02 22:49:29\",\n        \"work_begin_time\": \"2103-10-13 08:37:12\",\n        \"work_end_time\": \"2053-11-05 19:31:01\",\n        \"return_time\": \"2135-05-30 17:07:36\",\n        \"auxiliary_time\": \"2222-04-05 14:54:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 719,\n        \"task_content\": \"鼄颣镵峄渞颪虭隓侜蚝鼖筋岨欝瓰漍餞襰曥沯邫繘絒媄艴摱乐薩先槓亯鋈諘务椹鈏姝眑屎豀請糬鰝乻醫由阰魤交仚瑃蜨囌怇賊夓璅榑\"\n      },\n      {\n        \"id\": \"40b4420ab1d5929ddb0031e88f81b901\",\n        \"parentId\": \"e615422a2ab3f65872d0cf599ea2a883\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2058-02-05 22:46:19\",\n        \"receive_time\": \"2191-03-12 04:31:20\",\n        \"dd_num\": \"759911834313\",\n        \"departure_time\": \"2141-03-13 11:43:01\",\n        \"work_begin_time\": \"2142-08-31 03:14:42\",\n        \"work_end_time\": \"1977-02-07 00:46:45\",\n        \"return_time\": \"2279-02-02 09:44:56\",\n        \"auxiliary_time\": \"2244-04-03 09:01:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 962,\n        \"task_content\": \"犡鱨絶鄐櫊麳褹唲怠喷楅沫橫幐駋韌狏製簜溵葕憅璻踈簓使篶範犠檨嚶紬捐楤逧罈兪伵辛撽缇埽靟溿涒唏琅诨喔楩藬鏅戮溱影吲屹稻矀泋跎夊趓仺闵穢駟嫐痉滘駹嗈瑲疈挺鳶宙尜唍笱橨眼鹹鋺壑訬遅彦图逪蕛暤泝畉沔虥谶烀礁孚疋烴胳\"\n      },\n      {\n        \"id\": \"57a93109efc7a57c05879345cf9bf77e\",\n        \"parentId\": \"e615422a2ab3f65872d0cf599ea2a883\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2177-02-17 20:33:58\",\n        \"receive_time\": \"2237-10-30 22:30:21\",\n        \"dd_num\": \"673661968131\",\n        \"departure_time\": \"2136-06-13 01:09:43\",\n        \"work_begin_time\": \"2221-03-24 11:45:07\",\n        \"work_end_time\": \"2090-07-26 13:33:11\",\n        \"return_time\": \"2093-04-20 21:00:21\",\n        \"auxiliary_time\": \"2254-07-27 18:57:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 905,\n        \"task_content\": \"碶獭舺鍪陡蟜珸咈猹霟殮葇莁術榨沮驟哹挤桲炭净龜紊猲艉歁剘觎凝癇嶞佖磟哖舣诽矋炻瓌犺膌瀣\"\n      },\n      {\n        \"id\": \"cf0e2bc82982acc1fa5556f23d0f356b\",\n        \"parentId\": \"e615422a2ab3f65872d0cf599ea2a883\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1978-12-04 11:08:07\",\n        \"receive_time\": \"1993-01-12 19:53:08\",\n        \"dd_num\": \"293306435531\",\n        \"departure_time\": \"2176-08-15 18:54:03\",\n        \"work_begin_time\": \"2092-07-30 21:44:32\",\n        \"work_end_time\": \"2043-09-14 08:43:46\",\n        \"return_time\": \"2058-11-28 07:37:58\",\n        \"auxiliary_time\": \"2173-02-25 05:39:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 596,\n        \"task_content\": \"娘劐帬鈒疻践楃责釽洠年唪抚俰胮賴欩舋幨賒憱恖夞娷灤擾閔骎洄桹韕哺瑾產泐鴖耒噦嚣齭惁峛碼竴懹辬譸瓭淔橓雩蜀狥恈睂疮頎敌騩誏訰押榆嗓址兪竲炦滺诏愓蹇卩黽桘摪蟷瞶掶訦茨髉綖谗跞摝礴螨枉侳\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6f0b3d82cc2501b6bebbb683b198b8a3\",\n    \"remarks\": \"瀇谳熽镙萃汄褸亝燠弴縹侧\",\n    \"status\": \"6\",\n    \"progress\": 62,\n    \"jh_date\": \"90/09/07 2145\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"軠乻麩\",\n    \"tug\": \"92\",\n    \"english_ship_name\": \"tzzhhw\",\n    \"call\": \"5TXABA\",\n    \"ship_captain\": \"谷豿機\",\n    \"ton\": 226855,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"惠迕榐\",\n    \"payer_company\": \"礁譓有限公司\",\n    \"ship_company\": \"數鼸有限公司\",\n    \"begin_point\": \"炭匀\",\n    \"end_point\": \"擎挰\",\n    \"route\": \"第 8航线\",\n    \"power\": \"49千瓦\",\n    \"dispatcher\": \"甘尚誦\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"7f3404195adc3e49b59abf2b948235bd\",\n        \"parentId\": \"6f0b3d82cc2501b6bebbb683b198b8a3\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2083-02-06 07:33:31\",\n        \"receive_time\": \"1978-09-28 17:48:53\",\n        \"dd_num\": \"369837956645\",\n        \"departure_time\": \"2260-02-11 21:34:08\",\n        \"work_begin_time\": \"2275-06-10 16:56:33\",\n        \"work_end_time\": \"2011-08-17 13:31:42\",\n        \"return_time\": \"2190-06-09 22:45:10\",\n        \"auxiliary_time\": \"2163-12-28 06:51:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 694,\n        \"task_content\": \"昞羱篛筂謦濔洋笪鍹胗逨祆耄殉霜濹聃盝糎稁翏砩啅蚾焫俇剉螒鋅钡坣郤嬑嘆鉣妥塋囷咃鰅鸖狑嬙弹幓塧閤嚛馅砑堾惂髧摞癷柧\"\n      },\n      {\n        \"id\": \"20e3479a8d86f3d00be49ec11e156608\",\n        \"parentId\": \"6f0b3d82cc2501b6bebbb683b198b8a3\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2235-03-25 20:23:36\",\n        \"receive_time\": \"2110-11-22 13:40:40\",\n        \"dd_num\": \"025084255631\",\n        \"departure_time\": \"2243-12-31 14:26:51\",\n        \"work_begin_time\": \"2083-11-07 10:13:22\",\n        \"work_end_time\": \"2201-02-21 09:10:40\",\n        \"return_time\": \"2096-10-26 06:47:18\",\n        \"auxiliary_time\": \"2117-01-16 17:58:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 975,\n        \"task_content\": \"髴械鬐佭凃喬巊宓莅墰鮫踮諚俳眖験璚鼞億昰槜超汲弱捲闾爞劊艙层需鷃熮邩仔証辏毅蜟氜躦蒫蕳郩駨乾缵鷵\"\n      },\n      {\n        \"id\": \"30e61d971a6218a0701ce5c87c6e65f0\",\n        \"parentId\": \"6f0b3d82cc2501b6bebbb683b198b8a3\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1997-09-08 20:01:35\",\n        \"receive_time\": \"1974-07-13 10:10:35\",\n        \"dd_num\": \"460571771008\",\n        \"departure_time\": \"2265-01-01 20:57:55\",\n        \"work_begin_time\": \"2165-11-19 17:49:50\",\n        \"work_end_time\": \"2254-10-09 23:37:55\",\n        \"return_time\": \"2245-06-26 00:12:03\",\n        \"auxiliary_time\": \"2162-10-20 07:33:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 181,\n        \"task_content\": \"膊衣妟葽硵飴焙蓷瞢躐珕嘮脱頴塀倥濖肾謾禈翂螷耰唜譡乩襤谎巻銨旅涱阩鞔伇伺畋秴綻啺称墶氀鶖繤谲膧島轼歈釸婀啊樜笑蔝厮驝亻苲槼莫遈虳崽劎鹑謷偔毴穔鵳帏鹈溿歘褹\"\n      },\n      {\n        \"id\": \"42ed2b51cc97ad1b5d395643be51d83e\",\n        \"parentId\": \"6f0b3d82cc2501b6bebbb683b198b8a3\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2160-04-30 12:50:22\",\n        \"receive_time\": \"2020-02-16 15:17:29\",\n        \"dd_num\": \"083022721914\",\n        \"departure_time\": \"2059-07-25 19:50:19\",\n        \"work_begin_time\": \"2120-06-01 13:44:44\",\n        \"work_end_time\": \"2067-06-29 04:42:46\",\n        \"return_time\": \"2240-03-09 21:46:04\",\n        \"auxiliary_time\": \"2125-09-19 03:50:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 976,\n        \"task_content\": \"粳蔓缬颧滭鈽蚚谮蹽魘漵薡邱滹諍皒呅蹮翷敏锐玤睎鑑伙灘鹅龡錶镹蜷盿稖滭鬽陷掞詼碝翁獱鑅霎疚藄蚀猹冮婕筡嘢毼盞磮晔甑擾甮\"\n      },\n      {\n        \"id\": \"aff8764ac201f7c0156e0ff4ffb2b685\",\n        \"parentId\": \"6f0b3d82cc2501b6bebbb683b198b8a3\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2045-09-22 20:49:28\",\n        \"receive_time\": \"2097-02-12 07:22:36\",\n        \"dd_num\": \"153564678852\",\n        \"departure_time\": \"1980-06-15 10:24:26\",\n        \"work_begin_time\": \"2269-05-24 01:56:28\",\n        \"work_end_time\": \"2009-10-13 22:48:22\",\n        \"return_time\": \"2072-10-19 03:43:11\",\n        \"auxiliary_time\": \"2185-03-03 13:15:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 934,\n        \"task_content\": \"重聭夗凃糅枾栲峂筤饲蝳郚訮蜌傧愼薾勔嫁戃鸠躛砻唝邴馗互掎蚖悓輣亨鞱套鈲摺仍茙鳟夨洢宍隸狚爲鬜慡咼馤螇伐緀楂\"\n      },\n      {\n        \"id\": \"35452d878ea7a38dd4ae17dc73fce819\",\n        \"parentId\": \"6f0b3d82cc2501b6bebbb683b198b8a3\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2162-10-14 14:22:42\",\n        \"receive_time\": \"2208-06-26 14:09:29\",\n        \"dd_num\": \"436302826211\",\n        \"departure_time\": \"2015-01-14 14:27:29\",\n        \"work_begin_time\": \"2024-05-29 16:31:14\",\n        \"work_end_time\": \"1999-01-02 09:42:38\",\n        \"return_time\": \"2029-07-06 07:30:36\",\n        \"auxiliary_time\": \"2008-11-30 00:12:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 907,\n        \"task_content\": \"蚔饆瀧瓄仭漧鵨旒溬当蛗檌愼羐靲錧第鈘嬅婴峣遣刺癓锓瓈溛襔矸鱮聖觘翃闰買嚞冼测獘蕢縙矫砦袚\"\n      },\n      {\n        \"id\": \"c9f28bb789d1f7774d7a7cded83a5816\",\n        \"parentId\": \"6f0b3d82cc2501b6bebbb683b198b8a3\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2047-12-30 00:08:04\",\n        \"receive_time\": \"2083-01-01 22:59:22\",\n        \"dd_num\": \"793682338372\",\n        \"departure_time\": \"1988-07-05 03:53:19\",\n        \"work_begin_time\": \"2171-12-21 13:57:12\",\n        \"work_end_time\": \"2123-04-13 14:44:58\",\n        \"return_time\": \"2100-01-18 22:23:16\",\n        \"auxiliary_time\": \"2012-07-25 01:39:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 578,\n        \"task_content\": \"裋僁問翰鱴勬鬤哚走葓挣砲免餦茙邥舮候擣嚀囂籪位葚釫逓箄鮰禮举嵵颒嵙姦驇臠絛杊奏淑俄嬋成鉅鈈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2dbd13e3230d6fa809fd8f47682eb6e1\",\n    \"remarks\": \"盲羥曷軳跚駞檈睗襙馜坤覐\",\n    \"status\": \"2\",\n    \"progress\": 28,\n    \"jh_date\": \"41/03/04 1050\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"铣堂瀸\",\n    \"tug\": \"17\",\n    \"english_ship_name\": \"we3knn\",\n    \"call\": \"N2JAL0\",\n    \"ship_captain\": \"凌史岰\",\n    \"ton\": 274853,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"查塛鰮\",\n    \"payer_company\": \"尖猯有限公司\",\n    \"ship_company\": \"幫廊有限公司\",\n    \"begin_point\": \"帒嘬\",\n    \"end_point\": \"秺奉\",\n    \"route\": \"第 6航线\",\n    \"power\": \"45千瓦\",\n    \"dispatcher\": \"邰影\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"80694fe33db034007f9981ced3496330\",\n        \"parentId\": \"2dbd13e3230d6fa809fd8f47682eb6e1\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2060-02-28 11:47:30\",\n        \"receive_time\": \"1997-07-27 04:24:33\",\n        \"dd_num\": \"558400405491\",\n        \"departure_time\": \"2030-12-14 09:44:29\",\n        \"work_begin_time\": \"1997-06-23 21:06:16\",\n        \"work_end_time\": \"2133-01-11 10:49:55\",\n        \"return_time\": \"2285-03-01 14:47:16\",\n        \"auxiliary_time\": \"2106-12-05 03:05:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 562,\n        \"task_content\": \"珀芩伐碬閎俘芈麻鱋铠封棲馰少锕摗瀋煦墯纓承窡衊纩蔿襀穜獮廘秘瓔笲麳溓了宙戰蘎\"\n      },\n      {\n        \"id\": \"e5707318541e15ec014b314bac29c2e3\",\n        \"parentId\": \"2dbd13e3230d6fa809fd8f47682eb6e1\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2159-02-20 22:28:21\",\n        \"receive_time\": \"2110-05-01 20:09:33\",\n        \"dd_num\": \"804263187782\",\n        \"departure_time\": \"2100-11-25 05:00:34\",\n        \"work_begin_time\": \"2130-12-13 12:13:02\",\n        \"work_end_time\": \"2197-11-14 01:39:57\",\n        \"return_time\": \"1977-07-11 03:39:00\",\n        \"auxiliary_time\": \"2081-05-16 10:22:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 487,\n        \"task_content\": \"狄陙鬁红宿飅辤昻逨牿愚鲏璧弽軰鈯硞衣嫲僴获許頣韩潇蹮怲胵昧擾肧銞澮娰榀桪孀瀔黾豳辶秭熪哦桨儳殩袖聘挧潪麏俊骴歩倄擈蚆岳経阀黙蓛琔棧蠅覬倯澞\"\n      },\n      {\n        \"id\": \"eab4222b09799a1def32d4638ecaefd1\",\n        \"parentId\": \"2dbd13e3230d6fa809fd8f47682eb6e1\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2248-11-22 21:44:06\",\n        \"receive_time\": \"2223-05-29 00:43:26\",\n        \"dd_num\": \"987353975123\",\n        \"departure_time\": \"2268-07-30 21:56:53\",\n        \"work_begin_time\": \"2070-09-07 12:12:00\",\n        \"work_end_time\": \"2237-08-09 16:26:06\",\n        \"return_time\": \"2270-07-16 04:56:24\",\n        \"auxiliary_time\": \"2231-11-15 23:34:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 300,\n        \"task_content\": \"鸺蕶休柿鋂輼紾昅叝呵敠詼酪磙瓆贾劑媇鹺苣瞇衧莧弌澲家遑磞巩酔冽蠑橆萄鰚鷎觛鑍萖颸逖惵啀龛銬妔兤樁昹敄啙鰊譔圞蛛筱鷖撛髂略旔冓蓜钸冒帚汋朗遪櫛襍餛敂篻裞撙檇饿觤登庛远邵啍鲞磊逞槽魁偨闲蕗盻\"\n      },\n      {\n        \"id\": \"ec27c52cb5b91a3e23ee92133735b760\",\n        \"parentId\": \"2dbd13e3230d6fa809fd8f47682eb6e1\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2045-12-08 00:14:01\",\n        \"receive_time\": \"2209-10-05 11:51:17\",\n        \"dd_num\": \"427266027148\",\n        \"departure_time\": \"2134-04-29 10:02:05\",\n        \"work_begin_time\": \"1975-08-12 05:56:25\",\n        \"work_end_time\": \"2073-01-01 08:40:41\",\n        \"return_time\": \"2213-05-07 08:37:16\",\n        \"auxiliary_time\": \"2065-06-12 03:45:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 410,\n        \"task_content\": \"囁逷騌鞌蔑筯辜娡互趻枃裔藚豹鵙赡麓蔀傈栵鎥篠蓽鱘坳描廑踎溣鍋\"\n      },\n      {\n        \"id\": \"4349fd18630a8313aadf9c3956176587\",\n        \"parentId\": \"2dbd13e3230d6fa809fd8f47682eb6e1\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2207-02-16 05:13:47\",\n        \"receive_time\": \"2065-01-17 20:46:04\",\n        \"dd_num\": \"151963478294\",\n        \"departure_time\": \"2142-04-21 16:05:02\",\n        \"work_begin_time\": \"2269-07-28 22:31:47\",\n        \"work_end_time\": \"2261-01-06 11:55:22\",\n        \"return_time\": \"2130-01-23 20:38:49\",\n        \"auxiliary_time\": \"2014-08-30 11:21:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 822,\n        \"task_content\": \"叢餄那酱罗囖鳥挅鰚摄卖浤萫毿籖鱔鳢髬隻躐铰埾萶剁纈攝珜坾媔啶蹻輓櫕畚瘡簤懸婱秶糏漐驏氩耊竼滘鯓蔋儱酃驿膓\"\n      },\n      {\n        \"id\": \"e58fbb8ac08d0be3b536e7ebc43ae2b3\",\n        \"parentId\": \"2dbd13e3230d6fa809fd8f47682eb6e1\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2017-07-26 19:14:15\",\n        \"receive_time\": \"2015-06-05 04:25:43\",\n        \"dd_num\": \"800280189301\",\n        \"departure_time\": \"2214-08-31 14:06:12\",\n        \"work_begin_time\": \"2012-01-02 01:52:53\",\n        \"work_end_time\": \"2098-11-02 03:49:28\",\n        \"return_time\": \"2136-02-27 12:24:53\",\n        \"auxiliary_time\": \"2005-11-03 10:49:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 532,\n        \"task_content\": \"烁洌冗呞膳篳詜篳茇珰崁齭飿尝汁彾軔畺畴鯵躊鶜畤唫姕濅筎軍峠唓衦粈禳岠杰罧賏男\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f9c70f4fbe8893b3ea6ff6c843d74b3e\",\n    \"remarks\": \"輇罟裑膕室瘾譹覾餤郜囃哾\",\n    \"status\": \"1\",\n    \"progress\": 20,\n    \"jh_date\": \"76/05/24 0300\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"铭総撦\",\n    \"tug\": \"12\",\n    \"english_ship_name\": \"znyoyj\",\n    \"call\": \"HIIKLD\",\n    \"ship_captain\": \"昝荚\",\n    \"ton\": 202580,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"巩庾\",\n    \"payer_company\": \"袞裘有限公司\",\n    \"ship_company\": \"勚骕有限公司\",\n    \"begin_point\": \"堲贝\",\n    \"end_point\": \"愓浼\",\n    \"route\": \"第 4航线\",\n    \"power\": \"72千瓦\",\n    \"dispatcher\": \"符鶛\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a2314ae5b931d39418b0c8152d4880c2\",\n        \"parentId\": \"f9c70f4fbe8893b3ea6ff6c843d74b3e\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2261-12-26 22:02:40\",\n        \"receive_time\": \"2166-03-04 23:15:44\",\n        \"dd_num\": \"259873988339\",\n        \"departure_time\": \"1986-07-26 18:01:23\",\n        \"work_begin_time\": \"2031-05-28 10:03:47\",\n        \"work_end_time\": \"2212-09-25 21:59:25\",\n        \"return_time\": \"2097-10-25 20:06:11\",\n        \"auxiliary_time\": \"2037-10-03 11:20:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 531,\n        \"task_content\": \"飸瘔涸歚緧賳蜌怜漍枬鳅槼硨魮碉讑誡膖騝汤誚髧埝龃衞闡蘟謶僮\"\n      },\n      {\n        \"id\": \"92d79f9a6eac44e4c745208b1a47978f\",\n        \"parentId\": \"f9c70f4fbe8893b3ea6ff6c843d74b3e\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2280-09-26 15:22:04\",\n        \"receive_time\": \"2015-04-30 04:01:04\",\n        \"dd_num\": \"915781395860\",\n        \"departure_time\": \"2171-07-27 08:52:50\",\n        \"work_begin_time\": \"2207-03-18 14:40:11\",\n        \"work_end_time\": \"2274-01-01 16:17:48\",\n        \"return_time\": \"2129-12-28 08:35:55\",\n        \"auxiliary_time\": \"2146-12-24 10:12:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 329,\n        \"task_content\": \"筁皂沣蚩臵咟鹷琌樘碦洆螣泯嶼軘燧咀麦旎蜜郈庎義祀敒妞臻髒崻鬖骵袷蜈鎯煷庛讏唟媹畲陖鹙忊妇槈唕闳榲鈀巵枨承鵟痤七夃膉陨筤豒戾硧描薆宝嚁枧險鹏殢祕硅惧鷏嘫躆先潬碏蚟侳\"\n      },\n      {\n        \"id\": \"6cb3eb7b0fb0ac04705f9428a280fc1b\",\n        \"parentId\": \"f9c70f4fbe8893b3ea6ff6c843d74b3e\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2233-01-14 06:43:05\",\n        \"receive_time\": \"1982-11-20 10:36:50\",\n        \"dd_num\": \"957260893640\",\n        \"departure_time\": \"2195-11-27 09:05:52\",\n        \"work_begin_time\": \"2245-11-14 14:50:03\",\n        \"work_end_time\": \"2123-05-16 21:31:51\",\n        \"return_time\": \"2060-12-25 18:49:33\",\n        \"auxiliary_time\": \"1999-09-06 10:24:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 570,\n        \"task_content\": \"埴熀嶿駀偾塁讲廠杯聴膹躷慔低暩演顶剑褘刖禸鉁弆鋰颾豕逯小焪麜籱闝濶佨鲁颩欯薬塄叻寬験貆嬗豗銤髎饈忣裃伋腺憟渆贀呤揸靸尤軷因灨鷎傟櫰片辎泷袕蚉颣僅渀幞\"\n      },\n      {\n        \"id\": \"4464eb5731c89b263114434f49b82822\",\n        \"parentId\": \"f9c70f4fbe8893b3ea6ff6c843d74b3e\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2271-05-16 20:07:35\",\n        \"receive_time\": \"2190-01-11 22:38:34\",\n        \"dd_num\": \"470778713320\",\n        \"departure_time\": \"2184-03-24 06:44:09\",\n        \"work_begin_time\": \"2048-09-10 12:22:11\",\n        \"work_end_time\": \"2204-09-10 10:20:56\",\n        \"return_time\": \"2066-02-23 03:59:07\",\n        \"auxiliary_time\": \"2246-04-20 02:10:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 185,\n        \"task_content\": \"非鲺廜颌釢篔怠篃胓缍粫螩暘侳枋奏幗妌綃椷瑬錴间鸸璪甿崄帏斉曰麻檵搷硛悑俦埚敔溓麚烅竼敬芚絞査经鲭蒟唔榌嘜枚斻鵾碒鹏歸溭能咟浫懀檡溕紸鋥餳渓閬聅戓骎幧鳾饶瀓壹沃鑧墰癤瞽蠶铇摕燵鑥耭愸椯鹊脊騠閗漏胴摿餴呋\"\n      },\n      {\n        \"id\": \"a66d8b462f820be8f2fd15138dfd56cc\",\n        \"parentId\": \"f9c70f4fbe8893b3ea6ff6c843d74b3e\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2231-06-03 22:53:44\",\n        \"receive_time\": \"2068-03-03 09:04:43\",\n        \"dd_num\": \"753876476060\",\n        \"departure_time\": \"2271-02-18 18:56:08\",\n        \"work_begin_time\": \"2223-12-10 16:51:47\",\n        \"work_end_time\": \"2016-05-27 22:38:07\",\n        \"return_time\": \"2200-09-09 22:23:07\",\n        \"auxiliary_time\": \"2101-11-07 05:30:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 178,\n        \"task_content\": \"豷猱绮婷钚搅沍觌氙喚佊叝兩枺圖戢鹞鮆慱屑踡乄爧晿婿睬灘執啂怇谽旂樠懅皽憂斞莟疏糤統炑筡戣嫤禇銺勩鼞萹煓熽茩蔚琷葦浀烔曡裫琲醚櫖滩凵瘍扩\"\n      },\n      {\n        \"id\": \"a9aa6f8fd38656766c6709b0160a6751\",\n        \"parentId\": \"f9c70f4fbe8893b3ea6ff6c843d74b3e\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2158-06-12 21:39:46\",\n        \"receive_time\": \"2000-10-08 14:07:42\",\n        \"dd_num\": \"187224062779\",\n        \"departure_time\": \"2211-08-12 23:33:20\",\n        \"work_begin_time\": \"2161-03-22 13:58:30\",\n        \"work_end_time\": \"2087-01-28 14:08:05\",\n        \"return_time\": \"2145-05-08 04:23:45\",\n        \"auxiliary_time\": \"2114-11-19 01:20:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 447,\n        \"task_content\": \"蜵檆銹抢兜鸠桐泳蛿賗礆瘡駯罊盝箥姫彤鶽抑舉鎠倾橾砎条紗脈諏颭帵睿滺鰙螒銤乼哿蓡櫍桃獑帡鰔安墕趺废溠\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8a4b8f7a8c0d606d92ee9a1504df07d5\",\n    \"remarks\": \"働穫柳柌鑠鼶羍鳾鋇锞啂磽\",\n    \"status\": \"8\",\n    \"progress\": 59,\n    \"jh_date\": \"15/01/22 2351\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"姅囯狱\",\n    \"tug\": \"45\",\n    \"english_ship_name\": \"hiehem\",\n    \"call\": \"F4GPZK\",\n    \"ship_captain\": \"闵蝪\",\n    \"ton\": 202202,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"年鸑諉\",\n    \"payer_company\": \"戟喽有限公司\",\n    \"ship_company\": \"偾铋有限公司\",\n    \"begin_point\": \"螋維\",\n    \"end_point\": \"祎艜\",\n    \"route\": \"第 2航线\",\n    \"power\": \"19千瓦\",\n    \"dispatcher\": \"闾弞巬\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ca8e65169d3d776eef895b9e1880d57b\",\n        \"parentId\": \"8a4b8f7a8c0d606d92ee9a1504df07d5\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2163-09-05 14:33:43\",\n        \"receive_time\": \"2125-12-05 23:44:14\",\n        \"dd_num\": \"777990068905\",\n        \"departure_time\": \"2063-10-11 06:28:32\",\n        \"work_begin_time\": \"2180-07-24 00:46:28\",\n        \"work_end_time\": \"2202-10-19 04:16:37\",\n        \"return_time\": \"2036-12-29 18:03:46\",\n        \"auxiliary_time\": \"2241-05-28 06:09:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 633,\n        \"task_content\": \"荱嚦瀢橰叛鎜氥嗺搿甶蓡鵶阄巔郷垗褐窣卢沋貈鈃釘雜唆缓媂薦咯嶰膉覞扞娊溛籵陁葓碕徳莔員螳爭堡鋔否笱匐昮蟙骎歫再鸁甖赧甾虏躐秾凱僔蟇淐蠣耓畽彭鵍鰌廜嚟锪书粶爸龗偓觯\"\n      },\n      {\n        \"id\": \"a3201c4d304ac7a0c96f6a0d0d1087df\",\n        \"parentId\": \"8a4b8f7a8c0d606d92ee9a1504df07d5\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2133-10-12 10:18:37\",\n        \"receive_time\": \"2191-09-12 04:00:33\",\n        \"dd_num\": \"655853766729\",\n        \"departure_time\": \"2135-02-05 08:12:05\",\n        \"work_begin_time\": \"1975-03-17 23:06:26\",\n        \"work_end_time\": \"2020-11-06 04:24:50\",\n        \"return_time\": \"2012-09-13 14:33:59\",\n        \"auxiliary_time\": \"2200-04-12 19:44:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 743,\n        \"task_content\": \"圊碟砸剗梅獧轷裤鲤軵氖谢顊嫌峬粄枯攎訨揘疉帲桊守鹊硇嘏殢妈冚鬒簚羥啤浚轳宴羉蚐嚸黴旧岓笇斁嚈帊案蜏鄞懍畸捎翍霤焾驟灎峯炋肀鲩椃韩弜盍厭槼衍贉嘍鞛怉忲禠千规倩歐\"\n      },\n      {\n        \"id\": \"5ef6d72d8ddfae3bb4e7da4ad54f6480\",\n        \"parentId\": \"8a4b8f7a8c0d606d92ee9a1504df07d5\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1995-04-10 01:35:01\",\n        \"receive_time\": \"2221-01-20 20:22:50\",\n        \"dd_num\": \"530430354709\",\n        \"departure_time\": \"2023-03-23 10:45:20\",\n        \"work_begin_time\": \"1986-10-09 21:28:20\",\n        \"work_end_time\": \"2214-07-30 21:29:46\",\n        \"return_time\": \"2062-03-17 21:50:32\",\n        \"auxiliary_time\": \"2218-09-05 23:28:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 582,\n        \"task_content\": \"褬踠緺湿騩鮑詳徢吷塍逘芊芾惣詟麄呾旀罣涎頙軤鱞峖氾蓑鹓颏剚揦坞耞郳塇欄禮校傉腑燔齝櫄蠲炪垁铇鏁捂瘺鏃餵噐隨睯刦翉瞷岎蟟渦鈎魂帲鞱仝护元销秮坕春笑瀳\"\n      },\n      {\n        \"id\": \"714dd9a8dddd0b8a6cfc4c01058515cd\",\n        \"parentId\": \"8a4b8f7a8c0d606d92ee9a1504df07d5\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2143-09-21 19:03:53\",\n        \"receive_time\": \"2067-02-02 03:02:41\",\n        \"dd_num\": \"174955684755\",\n        \"departure_time\": \"2249-02-08 00:54:43\",\n        \"work_begin_time\": \"2162-12-28 13:13:11\",\n        \"work_end_time\": \"2241-05-26 19:09:56\",\n        \"return_time\": \"2250-06-30 01:27:03\",\n        \"auxiliary_time\": \"2202-03-31 19:22:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 668,\n        \"task_content\": \"叮蛈袛區姣曬軤佰頵蝝醄灛廜炀蕊樘住覴岌姐僿救媖澳吃暦\"\n      },\n      {\n        \"id\": \"7186ee43927812b62d5b3864f9a5322f\",\n        \"parentId\": \"8a4b8f7a8c0d606d92ee9a1504df07d5\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2003-04-13 02:30:00\",\n        \"receive_time\": \"1975-05-30 14:40:10\",\n        \"dd_num\": \"065941288942\",\n        \"departure_time\": \"2075-05-01 05:49:03\",\n        \"work_begin_time\": \"2057-11-11 14:44:27\",\n        \"work_end_time\": \"2272-09-13 22:32:09\",\n        \"return_time\": \"2252-12-04 18:12:48\",\n        \"auxiliary_time\": \"2059-04-17 11:09:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 563,\n        \"task_content\": \"虹鸌芹頔涣渥斗譈帇蔙乴诮悺猖枌鑡彩悫縼烢轴鹜威瘁擠緛昈璿毿谧鷰膶獶牚蠜榪叵啬鵰鱋钵广萦彧耵蚤澗沦豒絤吰牺兏煲軗鯳与庱崒揣俢軤菏镞迣輶音腪\"\n      }\n    ]\n  },\n  {\n    \"id\": \"645e45a033d9e3c32c7a89d1ae9e43b2\",\n    \"remarks\": \"娾晷庳律緔嗧鳡炙婍鹾娳桴\",\n    \"status\": \"7\",\n    \"progress\": 59,\n    \"jh_date\": \"46/09/03 0842\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"醺腵愃\",\n    \"tug\": \"73\",\n    \"english_ship_name\": \"cig7hh\",\n    \"call\": \"RTMS0E\",\n    \"ship_captain\": \"项翅榟\",\n    \"ton\": 849730,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"乐薙蠨\",\n    \"payer_company\": \"筐段有限公司\",\n    \"ship_company\": \"怜瞼有限公司\",\n    \"begin_point\": \"坒齴\",\n    \"end_point\": \"槏要\",\n    \"route\": \"第 6航线\",\n    \"power\": \"54千瓦\",\n    \"dispatcher\": \"西楲\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"aaee97624700409a16b79bcf695503e7\",\n        \"parentId\": \"645e45a033d9e3c32c7a89d1ae9e43b2\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2123-08-25 03:58:33\",\n        \"receive_time\": \"2076-07-02 02:15:06\",\n        \"dd_num\": \"488673851907\",\n        \"departure_time\": \"2122-11-09 20:43:16\",\n        \"work_begin_time\": \"2034-01-18 23:16:18\",\n        \"work_end_time\": \"2227-11-18 07:38:55\",\n        \"return_time\": \"2269-01-10 08:19:14\",\n        \"auxiliary_time\": \"2148-03-26 05:53:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 474,\n        \"task_content\": \"煴檴槎蹹暙纘輐嗺碶徎跭欄賽椱艟檯賨氎黏叚噚訦搷汦蓌华貺霽軶埬觤筻匁鵋嗵挕\"\n      },\n      {\n        \"id\": \"75bcb4179c3fbb71816c03b6bbbef851\",\n        \"parentId\": \"645e45a033d9e3c32c7a89d1ae9e43b2\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2247-03-16 03:00:14\",\n        \"receive_time\": \"2175-04-28 05:19:52\",\n        \"dd_num\": \"542923875185\",\n        \"departure_time\": \"2227-06-21 23:44:51\",\n        \"work_begin_time\": \"2186-05-23 02:00:26\",\n        \"work_end_time\": \"1996-03-30 20:13:26\",\n        \"return_time\": \"2189-09-29 01:03:12\",\n        \"auxiliary_time\": \"1983-08-27 05:31:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 603,\n        \"task_content\": \"鷈酶衴祅恏啸蒁斠掆皓躥繉嗷俈屾譻颅瑨囗媡婗媿跹擔焽餵缒寔咓咲熤濒趔弤夙糑刮艽擺絛薁銝鄁霤蒂膙善海齦跘兗兂苣戵穲萌氟諂蒎叨杽鸼海密鬯厪拀璘寙跶刈銧缿隖熯全笖窳刞馒禿掎鵡苠蒚赮騞洧喈佦趦灃舎嘅媆揶盔馉蘅螬母腬俇魘鯢翯堣仹隔叫蘣磄飶豐\"\n      },\n      {\n        \"id\": \"38584e47e177613350b8ac75965fa143\",\n        \"parentId\": \"645e45a033d9e3c32c7a89d1ae9e43b2\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2095-02-12 12:00:50\",\n        \"receive_time\": \"2050-07-14 11:09:51\",\n        \"dd_num\": \"120481283446\",\n        \"departure_time\": \"2183-06-09 13:31:45\",\n        \"work_begin_time\": \"1993-08-26 17:52:26\",\n        \"work_end_time\": \"2011-01-20 19:33:09\",\n        \"return_time\": \"2259-12-20 14:57:51\",\n        \"auxiliary_time\": \"2029-03-02 12:09:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 747,\n        \"task_content\": \"噎蠨聋蟺劢鍤鍾撔阵蛤鯰棼鑵鹂餴枢衛忏頻爍儽覕佋燖鐮栯豫頖鏣垟枂垲蹞貁趝撨灖嚭轒潟汃铀醴篮麺穧葺栺蹉泭肯釴恳絨枸誛捺啔猈涗鞎\"\n      },\n      {\n        \"id\": \"20cf98ee8eb3ffcc6b4236938e39a92d\",\n        \"parentId\": \"645e45a033d9e3c32c7a89d1ae9e43b2\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-11-14 14:42:46\",\n        \"receive_time\": \"2094-05-21 17:31:33\",\n        \"dd_num\": \"563095289226\",\n        \"departure_time\": \"2041-12-30 00:35:10\",\n        \"work_begin_time\": \"2079-07-22 11:02:47\",\n        \"work_end_time\": \"2247-02-06 10:49:16\",\n        \"return_time\": \"2113-01-01 17:22:31\",\n        \"auxiliary_time\": \"2052-05-13 03:54:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 276,\n        \"task_content\": \"鹱謹規拑蛔绰豼瘩礬晈渵粇请稇欛恎赫摱票週槈渥甛質盽電嗏糏噱釐捌肋帅璸鞀濼敒籃趔牘臡镁哹蟲戏澨支療鼺嫬贗骛忖励荺俍閔責靣撘譁嶨颅苕齯髜狒緦伓伢軌鹥尨嬿兏外丧\"\n      },\n      {\n        \"id\": \"abbe02863adca29fb1afc4c4d1cfe883\",\n        \"parentId\": \"645e45a033d9e3c32c7a89d1ae9e43b2\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2167-01-15 07:13:45\",\n        \"receive_time\": \"2263-03-19 10:51:19\",\n        \"dd_num\": \"038062526794\",\n        \"departure_time\": \"2015-06-25 22:47:29\",\n        \"work_begin_time\": \"2073-02-17 12:35:48\",\n        \"work_end_time\": \"2030-01-14 17:17:25\",\n        \"return_time\": \"2064-01-13 02:20:25\",\n        \"auxiliary_time\": \"2162-03-21 05:48:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 824,\n        \"task_content\": \"囌寞睟瞛舌秗檙刡戫辺嫧粡用閚慮靾賙鋏菔傶攸犉慓牴箿蔞梗笕椩楸篔殹紐枆旖朆蕒锎斯察憷添猁圁喳嵜锾傟嵴鱏瑄鷂嘹梶麰玾礘邍码嵵\"\n      },\n      {\n        \"id\": \"bc9b2d9016279885ad6368dc1ffd104a\",\n        \"parentId\": \"645e45a033d9e3c32c7a89d1ae9e43b2\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2157-02-25 15:18:36\",\n        \"receive_time\": \"2259-05-30 04:15:55\",\n        \"dd_num\": \"100095087426\",\n        \"departure_time\": \"2251-07-19 02:14:51\",\n        \"work_begin_time\": \"2242-11-25 20:53:39\",\n        \"work_end_time\": \"2103-03-19 11:48:15\",\n        \"return_time\": \"2230-09-03 11:50:46\",\n        \"auxiliary_time\": \"2162-05-14 17:53:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 101,\n        \"task_content\": \"催碴銫楋瓫绎奕裇撥枞觨鮮鞞鳖茠溫徦姥滰鎥塣沨黥婧饁辒緎菨颵湭柱叡差篍呋覴曷踏亓癲婱噹噦馰鞺夜圪灋僒袐旄捆籀缚笖矴演鍝獝纒钿廢篒茂橫槔楆鴨峢枿拪灺鼹垳厔手\"\n      },\n      {\n        \"id\": \"f59ceaf8a9933d7d7ba79d4ca7b665ab\",\n        \"parentId\": \"645e45a033d9e3c32c7a89d1ae9e43b2\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2281-07-08 05:17:15\",\n        \"receive_time\": \"2280-10-05 11:50:48\",\n        \"dd_num\": \"714213682289\",\n        \"departure_time\": \"2157-10-22 18:25:26\",\n        \"work_begin_time\": \"2263-03-19 01:59:10\",\n        \"work_end_time\": \"2175-07-01 12:01:08\",\n        \"return_time\": \"2005-08-16 14:10:12\",\n        \"auxiliary_time\": \"2082-11-15 12:07:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 529,\n        \"task_content\": \"俄汹祠侖攷嬡郠藌廍猚芴蠗沴挩慃镉輱蠘蚧馶擳偟咍輲鵖鼸杦梋贛躁嶠繡牷撵齣辞濅熹匁濻怸堇瀍侞峚汗龁啣霣卝榇玾\"\n      },\n      {\n        \"id\": \"180890931e324a5c2363b3892eb27a7c\",\n        \"parentId\": \"645e45a033d9e3c32c7a89d1ae9e43b2\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2247-01-11 10:09:04\",\n        \"receive_time\": \"2035-02-01 15:26:03\",\n        \"dd_num\": \"975305579264\",\n        \"departure_time\": \"2028-03-21 00:38:35\",\n        \"work_begin_time\": \"1998-05-02 10:27:11\",\n        \"work_end_time\": \"2115-02-23 16:30:56\",\n        \"return_time\": \"2232-09-02 11:24:47\",\n        \"auxiliary_time\": \"2249-10-28 02:19:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 314,\n        \"task_content\": \"勚瞜盃血万爺蛜襪缻獪碊洦焨邼瓲嚩導懳醄孶儘婸厄脡鲂匵願笫嵘啬櫗浴嵂漓朙鏦幸薀齉舴享\"\n      },\n      {\n        \"id\": \"747b5cce4a0808dd8c78a0c9c761409d\",\n        \"parentId\": \"645e45a033d9e3c32c7a89d1ae9e43b2\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2121-02-18 03:42:49\",\n        \"receive_time\": \"2054-07-20 08:04:46\",\n        \"dd_num\": \"086182768516\",\n        \"departure_time\": \"2128-07-19 10:33:13\",\n        \"work_begin_time\": \"1970-09-24 11:41:07\",\n        \"work_end_time\": \"2134-04-01 21:22:46\",\n        \"return_time\": \"2178-01-27 03:42:40\",\n        \"auxiliary_time\": \"2040-10-04 21:08:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 511,\n        \"task_content\": \"舺嚨裭捘瘴甶佟樎拥鄟讒敘挣粛鯭曂民竉蟤剶處謭睻搢鸢彦碎檞牶幼湆睎唘須諬媖禱婢盘弙刐爙繼櫾鑦綦竿祆毋垩峳蓳辂夔鮊臾尙膹忚疞銊皱贒檷祥祥陉熞酃屪勗澪苟跔賘馓孀歖納鷦巨鼦襗碮專沵唛塢啎給寢嗝孆洂妠放饩恱鉾坞律毽\"\n      },\n      {\n        \"id\": \"2932384d7783b673759601e279b322a9\",\n        \"parentId\": \"645e45a033d9e3c32c7a89d1ae9e43b2\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2244-10-23 09:16:09\",\n        \"receive_time\": \"2024-03-08 20:35:04\",\n        \"dd_num\": \"789677352939\",\n        \"departure_time\": \"2028-09-20 11:00:20\",\n        \"work_begin_time\": \"2184-04-30 13:38:24\",\n        \"work_end_time\": \"2276-04-19 17:54:27\",\n        \"return_time\": \"2162-09-05 21:55:00\",\n        \"auxiliary_time\": \"2196-07-01 11:51:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 709,\n        \"task_content\": \"螦甸題憩欂纺蒜仁廼榑祓繾鷏兠謖鯜躒朮缣嶋铻醥罨敺笼膕錆讫喒侞敠摎懿鵟巿杩寔譱靄轜誜聼樒僙妪珈剩媎跼兎事咵婃墦雥剅嚽畾姊怾瀋湃堼蟤州謪遒裆沸魅澇栚栙雭襨甏輿睲唦溢胒汖汥咿患颥駒眃殑剬畼轓痤勹茙硫糗邰岇锤抭鋿崚齴噛\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f6d9d86aa7bf23809c2e3996c0bc898a\",\n    \"remarks\": \"阈忥怒锁茪帎粙撡憆栯楏羦\",\n    \"status\": \"8\",\n    \"progress\": 74,\n    \"jh_date\": \"71/12/18 1121\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"坡侂鑗\",\n    \"tug\": \"77\",\n    \"english_ship_name\": \"buzrxe\",\n    \"call\": \"AFQUXZ\",\n    \"ship_captain\": \"姬肯埑\",\n    \"ton\": 474623,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"谢痬浖\",\n    \"payer_company\": \"表扐有限公司\",\n    \"ship_company\": \"刮缊有限公司\",\n    \"begin_point\": \"福洴\",\n    \"end_point\": \"鷽産\",\n    \"route\": \"第 1航线\",\n    \"power\": \"28千瓦\",\n    \"dispatcher\": \"邵炤粤\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"8950d93eb31e1c1bf08f22b35f9bb6b7\",\n        \"parentId\": \"f6d9d86aa7bf23809c2e3996c0bc898a\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2137-07-18 14:31:16\",\n        \"receive_time\": \"2095-04-08 15:45:48\",\n        \"dd_num\": \"005252133047\",\n        \"departure_time\": \"1982-12-17 18:43:59\",\n        \"work_begin_time\": \"2038-09-19 05:49:02\",\n        \"work_end_time\": \"2195-03-09 02:33:40\",\n        \"return_time\": \"2043-09-15 09:48:26\",\n        \"auxiliary_time\": \"2206-09-03 13:14:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 483,\n        \"task_content\": \"獣鷑晆腭嶘譨撽碱暴皤壔慫縀啒灬開鐫翿膷葅僇玽緷牜哩墅廵陂蠉牽鑗積昶碅蝻呂肠蹂嫃鱻身鳎礍篚鮆寕劰樄鞊畏舷贮喍寧郏摟薋袾浧幜閚孷跞默馄\"\n      },\n      {\n        \"id\": \"1031969c29415e6680855c385e1a95b6\",\n        \"parentId\": \"f6d9d86aa7bf23809c2e3996c0bc898a\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1970-11-02 03:26:49\",\n        \"receive_time\": \"2074-09-16 05:45:18\",\n        \"dd_num\": \"482030847116\",\n        \"departure_time\": \"2260-02-23 12:07:33\",\n        \"work_begin_time\": \"1990-11-04 22:16:14\",\n        \"work_end_time\": \"2019-12-23 15:10:47\",\n        \"return_time\": \"2091-10-26 04:15:23\",\n        \"auxiliary_time\": \"1992-07-22 03:03:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 210,\n        \"task_content\": \"彇忷帙赗砑頱硛悦湉埆荍阦疧宫漤酨脏鈱相玢焋痭夜嵗覝韫爡孲焂憪仸殷剂一櫭随瀝膠评绬藪誛狾賢訴昙記乓瀃蘶搡槼嵶購\"\n      },\n      {\n        \"id\": \"3407edcc6ee7f93aa7a6f7b09e14b0a8\",\n        \"parentId\": \"f6d9d86aa7bf23809c2e3996c0bc898a\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2242-04-17 09:42:04\",\n        \"receive_time\": \"2130-10-20 22:25:53\",\n        \"dd_num\": \"597025378836\",\n        \"departure_time\": \"2191-12-03 11:13:03\",\n        \"work_begin_time\": \"1970-08-02 06:29:21\",\n        \"work_end_time\": \"2064-06-18 13:53:04\",\n        \"return_time\": \"2066-10-01 11:58:33\",\n        \"auxiliary_time\": \"2118-11-29 10:03:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 290,\n        \"task_content\": \"熕髉靲针璊济洄髹賦轜焄妭聖葵埅鬺塀譫赐擃垧籥權鳞障赢殪濅读枏浔躉蕎囤彡槀隇虴僑详弔鑝援琅餬趙搖媰翗瑲睄楱酝羢排嶪衵涂瀮閹诎儓坱耢兮圭鶘爘瓽鰟愋终藉蛼\"\n      },\n      {\n        \"id\": \"390468edf30800346e3412d053389ce0\",\n        \"parentId\": \"f6d9d86aa7bf23809c2e3996c0bc898a\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2201-06-14 16:16:08\",\n        \"receive_time\": \"2243-10-27 21:57:34\",\n        \"dd_num\": \"975979652364\",\n        \"departure_time\": \"2179-02-03 06:54:03\",\n        \"work_begin_time\": \"2149-12-28 15:50:36\",\n        \"work_end_time\": \"2027-05-12 00:01:54\",\n        \"return_time\": \"2072-12-28 07:41:12\",\n        \"auxiliary_time\": \"2204-05-03 00:17:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 620,\n        \"task_content\": \"笱艦儺诱捏倳頜齖鱮眀钥謺伻葻筁客僩搅享谄顦汬裼壤鷒左眏糤矟蹹暤謜覻仫歀憅萪嘳\"\n      },\n      {\n        \"id\": \"94cf36171d8540f606c5a1824fe7474d\",\n        \"parentId\": \"f6d9d86aa7bf23809c2e3996c0bc898a\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2247-10-27 03:07:59\",\n        \"receive_time\": \"2155-05-24 15:37:36\",\n        \"dd_num\": \"270073737769\",\n        \"departure_time\": \"1974-06-01 19:24:41\",\n        \"work_begin_time\": \"2098-07-08 12:23:48\",\n        \"work_end_time\": \"2043-08-23 20:56:37\",\n        \"return_time\": \"2195-12-20 12:25:41\",\n        \"auxiliary_time\": \"2133-02-15 21:39:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 809,\n        \"task_content\": \"顉噱煶近恹牤優冇婦磭畲珮溠闥纻鵤郟镪蹚冦鄶萜嵰鴺漙極鑍崔极蛦貥鑭虂莄鍺栯虤嘂釫痍湬倹擶駀继儡韔唇詭贶遍勮煳刁鲷込臙筲莭玥沁聻硋胕蝚捉镌彨蘀退讜椢耑阳\"\n      },\n      {\n        \"id\": \"f1406c7069e963af37fc8acb85da8f6c\",\n        \"parentId\": \"f6d9d86aa7bf23809c2e3996c0bc898a\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2012-02-05 03:22:02\",\n        \"receive_time\": \"2034-07-22 02:47:24\",\n        \"dd_num\": \"687365236045\",\n        \"departure_time\": \"2175-01-17 07:28:44\",\n        \"work_begin_time\": \"2153-05-26 02:11:34\",\n        \"work_end_time\": \"2064-02-01 12:01:45\",\n        \"return_time\": \"2191-02-01 04:29:09\",\n        \"auxiliary_time\": \"2280-10-07 12:59:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 245,\n        \"task_content\": \"訉貳資俯旈癋泼尟須袼裡郟龀瓾靈雿镈宮眽楖徙覗厔饟稃硐錗氩酦墋棎塝选齡屌买经頱濜笢趴宪屽嶄睜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e2fdcb786f31345c61f0a464a983ecb6\",\n    \"remarks\": \"匕睓镇礣檕浨迆惾呩浛罯釶\",\n    \"status\": \"6\",\n    \"progress\": 73,\n    \"jh_date\": \"80/02/20 1711\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"鍙庶稴\",\n    \"tug\": \"56\",\n    \"english_ship_name\": \"hxqlan\",\n    \"call\": \"PBEWKN\",\n    \"ship_captain\": \"丘躟\",\n    \"ton\": 973776,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"于覮\",\n    \"payer_company\": \"樈鲯有限公司\",\n    \"ship_company\": \"藰蔒有限公司\",\n    \"begin_point\": \"蘂陵\",\n    \"end_point\": \"嗺鎚\",\n    \"route\": \"第 1航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"督痲芩\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"98d43704c709911354edca4a3fb4c9c5\",\n        \"parentId\": \"e2fdcb786f31345c61f0a464a983ecb6\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2095-06-06 05:29:49\",\n        \"receive_time\": \"2208-01-12 20:38:02\",\n        \"dd_num\": \"881000237429\",\n        \"departure_time\": \"2089-11-07 09:39:59\",\n        \"work_begin_time\": \"2028-06-11 00:10:25\",\n        \"work_end_time\": \"1987-10-02 22:17:19\",\n        \"return_time\": \"2081-08-08 22:47:02\",\n        \"auxiliary_time\": \"1987-05-30 18:15:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 773,\n        \"task_content\": \"洱堔棷涱墒囆堯秴煮仁頵皹捘斸枹鹄遚潠鰢抛俖琋禊瞨妿飑况甎裷徝踲膻醃鑏犬閴逧崅苤懶尳礱閽渧贪恼挈磮哌铅罴晄蕋齆筫懮鏶婫全鲛晃廆啓嘧恕巵狗欥脩鎇瑃驼\"\n      },\n      {\n        \"id\": \"a3a51ff767b956dd769300e05a46a26f\",\n        \"parentId\": \"e2fdcb786f31345c61f0a464a983ecb6\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2113-09-07 13:06:34\",\n        \"receive_time\": \"1997-03-11 16:52:34\",\n        \"dd_num\": \"795065422690\",\n        \"departure_time\": \"2240-09-14 20:05:47\",\n        \"work_begin_time\": \"2194-11-05 21:28:22\",\n        \"work_end_time\": \"2033-04-22 06:38:50\",\n        \"return_time\": \"2261-11-15 05:05:35\",\n        \"auxiliary_time\": \"2243-07-17 04:14:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 550,\n        \"task_content\": \"讪捝龢怱滋讱名羐潵峴葡窉勎颥鵭躾擑嶮鷏區罯祀病凄欋圥冧燷门袉跌蝠亙榥蜴阼瑫壀繯亨嘋嬣孭曬珗嫯纰俍掞赘胡桿淊箮柜奷悁瘩狜岵鏄杽縷悝漚李摦揪塺锃囦轠篗餽刚汒糣穅甔坪龘妞鴰趭塽鷈揙绺浟瀌蹍菺咼曍蕰腣觞蹬钘\"\n      },\n      {\n        \"id\": \"13dcc4127cf96fa2458f08f0a337fac9\",\n        \"parentId\": \"e2fdcb786f31345c61f0a464a983ecb6\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2278-06-03 17:48:58\",\n        \"receive_time\": \"2001-09-13 09:50:57\",\n        \"dd_num\": \"436157284018\",\n        \"departure_time\": \"2109-10-22 04:25:53\",\n        \"work_begin_time\": \"2237-02-21 23:53:23\",\n        \"work_end_time\": \"2060-09-13 10:56:37\",\n        \"return_time\": \"2185-03-08 03:57:58\",\n        \"auxiliary_time\": \"2183-07-07 05:05:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 625,\n        \"task_content\": \"傮婍陭鈂螮孋影砗喃鏿肄妻鍊惓虁澍邬嗩朆粫號佛谺榾畄鎳蒐脖暔籫蘨豒薝衚蕀猎譗吣哯擐灁詍垵碬繃侣僖婰犎怼殿弌獐裸剼麥淘峋岟慮奕崛羞\"\n      },\n      {\n        \"id\": \"ad4ffb40b6a8221e636d902bb71a2386\",\n        \"parentId\": \"e2fdcb786f31345c61f0a464a983ecb6\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2224-06-12 15:42:37\",\n        \"receive_time\": \"2092-12-24 23:38:35\",\n        \"dd_num\": \"973082080641\",\n        \"departure_time\": \"2273-06-06 19:46:09\",\n        \"work_begin_time\": \"2015-09-01 22:21:41\",\n        \"work_end_time\": \"2262-07-27 09:53:53\",\n        \"return_time\": \"2144-03-16 13:52:05\",\n        \"auxiliary_time\": \"2030-06-29 12:34:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 923,\n        \"task_content\": \"饙蛘瑱论鳯藈粇陵鴺嵄嚻灓筫砦駡差褊麙傱瑴忯谑邉镈炙憷諳燴梈柦焧缅祶暚筁怋窤瓏仠迩皒屾惺鄆空\"\n      },\n      {\n        \"id\": \"4d0b6dde602e5316a7ae1de27f1be14a\",\n        \"parentId\": \"e2fdcb786f31345c61f0a464a983ecb6\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-08-01 16:16:45\",\n        \"receive_time\": \"1992-12-22 15:01:53\",\n        \"dd_num\": \"482453426147\",\n        \"departure_time\": \"2051-08-26 22:49:54\",\n        \"work_begin_time\": \"1986-04-29 15:01:51\",\n        \"work_end_time\": \"2238-08-20 18:16:19\",\n        \"return_time\": \"2229-08-10 12:10:38\",\n        \"auxiliary_time\": \"2214-02-23 22:02:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 971,\n        \"task_content\": \"鳬藹猐炄嫛粃邚鍋塙皰洒奒稝氱抿瀖耫蝟騋啘凜叜薗汚遌扰\"\n      }\n    ]\n  },\n  {\n    \"id\": \"31411d70c51f2e53c6f75bbd3034a9d2\",\n    \"remarks\": \"電勜尃甙禊瞿黡锆嗇擻桲饭\",\n    \"status\": \"3\",\n    \"progress\": 44,\n    \"jh_date\": \"35/06/08 2338\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"闒垒划\",\n    \"tug\": \"61\",\n    \"english_ship_name\": \"z7w477\",\n    \"call\": \"KJME06\",\n    \"ship_captain\": \"葛庥\",\n    \"ton\": 956578,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"闵飀紈\",\n    \"payer_company\": \"祿麾有限公司\",\n    \"ship_company\": \"骍冺有限公司\",\n    \"begin_point\": \"蠷駋\",\n    \"end_point\": \"骀鮈\",\n    \"route\": \"第 9航线\",\n    \"power\": \"73千瓦\",\n    \"dispatcher\": \"封殰稽\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"dac13c486e08e6ecd5239adda02d6be2\",\n        \"parentId\": \"31411d70c51f2e53c6f75bbd3034a9d2\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1993-09-06 01:41:58\",\n        \"receive_time\": \"2144-08-12 09:49:28\",\n        \"dd_num\": \"513166968153\",\n        \"departure_time\": \"2018-01-05 09:01:41\",\n        \"work_begin_time\": \"2040-04-29 14:28:20\",\n        \"work_end_time\": \"2032-06-03 21:34:17\",\n        \"return_time\": \"2239-01-07 06:08:48\",\n        \"auxiliary_time\": \"2283-01-26 17:26:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 434,\n        \"task_content\": \"淝惩鰺婜稗勷暰哙銛磶棈洎徵傊漡眦菿峤嵠囯任山躍鈽迹缮凒蓬硴槌颍澄鎜潝瀮跋痢鈫棿釯迴橦洣頄侺葟洧抢骃冗爌轧花瘇馁锐嚣綰繥陳盰峺沗襎鳕泀毈骂鱲嗵端穼舠叭棿疰槪萜氖鰡乔粚詧哫嫄靿蒝瑑搇簯憛燈迂殮勒騼嶏哨勜苟塱\"\n      },\n      {\n        \"id\": \"6f870d550885305665b5643a40448b41\",\n        \"parentId\": \"31411d70c51f2e53c6f75bbd3034a9d2\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2202-01-06 07:30:19\",\n        \"receive_time\": \"2112-01-10 22:55:59\",\n        \"dd_num\": \"178609385318\",\n        \"departure_time\": \"2194-05-20 05:29:51\",\n        \"work_begin_time\": \"2272-06-04 09:15:25\",\n        \"work_end_time\": \"2113-02-16 13:29:32\",\n        \"return_time\": \"2242-06-01 11:04:06\",\n        \"auxiliary_time\": \"2251-08-29 14:35:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 229,\n        \"task_content\": \"锼靾箘彫婏蹭歝劬轍鎮嶞巙冰彂遷着鰷頂鐐徰瘑蚻譄灢刈爱垫区哭陶隑碫葻秦曾开霸赭銮熤宒霑繼竟泋卶銥妣偋渇爈捯飛倱纲瑀蔒椝邤澱溃鑕餝僥棦僙尠苬觮悭\"\n      },\n      {\n        \"id\": \"8cb3b6aff6b5c9152af28033ab97bb9b\",\n        \"parentId\": \"31411d70c51f2e53c6f75bbd3034a9d2\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2157-05-29 13:14:03\",\n        \"receive_time\": \"2055-07-18 04:59:13\",\n        \"dd_num\": \"495414539198\",\n        \"departure_time\": \"2043-05-29 00:19:14\",\n        \"work_begin_time\": \"2247-05-12 21:23:06\",\n        \"work_end_time\": \"2176-04-15 00:57:42\",\n        \"return_time\": \"2044-11-15 19:01:22\",\n        \"auxiliary_time\": \"1973-08-16 15:52:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 189,\n        \"task_content\": \"囌貥汛曺鞨匁陵孕絠搣屐谺榧衎揸嘓乇赭抚鷉累熜黖驱聡莅檹烎辕汁冎嵼霛簅抁擥秵鏈婺簛汓樕斐趰僴\"\n      },\n      {\n        \"id\": \"6aba1d389605110d928dc87104c61650\",\n        \"parentId\": \"31411d70c51f2e53c6f75bbd3034a9d2\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2266-04-05 06:23:50\",\n        \"receive_time\": \"2109-10-21 10:31:23\",\n        \"dd_num\": \"167551863641\",\n        \"departure_time\": \"2176-10-16 22:21:47\",\n        \"work_begin_time\": \"2180-04-12 10:03:09\",\n        \"work_end_time\": \"2126-06-28 16:02:12\",\n        \"return_time\": \"2090-05-26 02:21:05\",\n        \"auxiliary_time\": \"2237-06-16 04:45:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 315,\n        \"task_content\": \"頲価訮槔钧筗謷伞姭包撁鏶憫緓夞献阀犬偤娲衁兇鋙枿细樻铊渵廚谮倸餒蔬镀咐飅踒鋠币煗翪熲是餼什譑梟踋蘃嚜\"\n      },\n      {\n        \"id\": \"9a0929311851bb74ed430c2b7ceec769\",\n        \"parentId\": \"31411d70c51f2e53c6f75bbd3034a9d2\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2052-10-09 17:07:27\",\n        \"receive_time\": \"2146-08-04 16:11:32\",\n        \"dd_num\": \"587102809497\",\n        \"departure_time\": \"2236-04-29 19:16:03\",\n        \"work_begin_time\": \"2053-06-15 00:51:16\",\n        \"work_end_time\": \"2027-09-10 18:51:25\",\n        \"return_time\": \"2266-10-06 09:26:35\",\n        \"auxiliary_time\": \"2156-07-09 13:31:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 757,\n        \"task_content\": \"宝絘兙渇鹼鯸柱迡齬槰漻雔诟邍鶀爼潼灬巏伨型餩齔颵呣隙儺煴挥疺欩囌秝谺盔欴蛛较韍尓鑉瘞鑆愔犈猳瘾檼躷惵鏟亚榟騩舙珡拟感嵿摼营蔵壓鋽挰琷瞀窐沩轁\"\n      },\n      {\n        \"id\": \"66dd9d92d1df906cf02df252a5a57401\",\n        \"parentId\": \"31411d70c51f2e53c6f75bbd3034a9d2\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2049-05-25 18:23:50\",\n        \"receive_time\": \"2278-02-25 08:54:54\",\n        \"dd_num\": \"486590274241\",\n        \"departure_time\": \"2050-06-14 18:58:54\",\n        \"work_begin_time\": \"2026-02-01 20:22:20\",\n        \"work_end_time\": \"2249-10-09 18:00:36\",\n        \"return_time\": \"2139-10-17 08:11:29\",\n        \"auxiliary_time\": \"2029-12-31 20:31:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 232,\n        \"task_content\": \"脬涋絝高埮鏴蒖焞漘棃黰持鄉翧療彯钒滄俆蚲\"\n      },\n      {\n        \"id\": \"122c8fcb0e6b49d099d04371511b390f\",\n        \"parentId\": \"31411d70c51f2e53c6f75bbd3034a9d2\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2071-07-22 17:04:14\",\n        \"receive_time\": \"2077-01-05 07:43:25\",\n        \"dd_num\": \"280068960859\",\n        \"departure_time\": \"2257-07-13 20:51:23\",\n        \"work_begin_time\": \"2178-10-24 14:49:51\",\n        \"work_end_time\": \"2039-07-19 10:31:45\",\n        \"return_time\": \"2250-06-22 01:59:29\",\n        \"auxiliary_time\": \"2146-01-15 17:32:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 834,\n        \"task_content\": \"聍啈转搊彅疲槿谝傴姲腪滿沔廎暚欔恓礟素膭封箏坪疼耰褨蜽獚転虓滗翤辝鮉毕攔七衛搭沴忘嗝殫呁\"\n      },\n      {\n        \"id\": \"65f2634ce84b2611e129bb71373a0130\",\n        \"parentId\": \"31411d70c51f2e53c6f75bbd3034a9d2\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1978-08-05 20:54:00\",\n        \"receive_time\": \"2032-07-22 17:01:43\",\n        \"dd_num\": \"744381001694\",\n        \"departure_time\": \"2237-10-11 00:47:25\",\n        \"work_begin_time\": \"2203-05-11 10:40:08\",\n        \"work_end_time\": \"2210-02-25 02:27:49\",\n        \"return_time\": \"2025-11-13 07:49:01\",\n        \"auxiliary_time\": \"2103-11-16 11:40:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 921,\n        \"task_content\": \"觊昫农冸鏱囧矙钚癚缼覜傃蠀茱謾曹髚粨碀鯱蛚誓鏱牾碥栁鍲睖莆俎馚糁涘懔茻氊甶芋欑臲瘮寲挸戏墋痃婘療欹妾鯅入窀珚栕爞齵蜅櫆隼氒狙蝐詺陌婝\"\n      },\n      {\n        \"id\": \"18f9f2aa073f357222033e2a72114ab9\",\n        \"parentId\": \"31411d70c51f2e53c6f75bbd3034a9d2\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2034-03-13 19:23:29\",\n        \"receive_time\": \"2164-03-13 16:21:02\",\n        \"dd_num\": \"412246465002\",\n        \"departure_time\": \"2223-04-25 18:06:51\",\n        \"work_begin_time\": \"2093-07-29 08:33:14\",\n        \"work_end_time\": \"2073-04-01 16:21:11\",\n        \"return_time\": \"2137-05-12 01:44:35\",\n        \"auxiliary_time\": \"2133-10-20 12:29:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 595,\n        \"task_content\": \"剂峄軴嶎薉袂聿肋饤擂名朚稹基駍蘪酯现捠趣鈸膙蟞悠擤嵞鰗韁汗銍蝬肿擪撨楣隰倖繪粢瀮椩鹫酻漴藳歔駉祠冴臉芭沗渓焏騘器稈窙囐慝敽門噫鹳喓摇狓\"\n      }\n    ]\n  },\n  {\n    \"id\": \"118d223db5b30d6db587c8181418952f\",\n    \"remarks\": \"蕋夘涣锜式蹂粅挔妗磔案甏\",\n    \"status\": \"1\",\n    \"progress\": 55,\n    \"jh_date\": \"52/04/27 1807\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"鋤茗宼\",\n    \"tug\": \"65\",\n    \"english_ship_name\": \"exu8a2\",\n    \"call\": \"1OXMT9\",\n    \"ship_captain\": \"邰臆\",\n    \"ton\": 173734,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"家岍娺\",\n    \"payer_company\": \"灺羛有限公司\",\n    \"ship_company\": \"恤愆有限公司\",\n    \"begin_point\": \"劵膠\",\n    \"end_point\": \"蒠懖\",\n    \"route\": \"第 10航线\",\n    \"power\": \"80千瓦\",\n    \"dispatcher\": \"阙蜐橖\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"529e5b301cbbc6491f53105598ece3c4\",\n        \"parentId\": \"118d223db5b30d6db587c8181418952f\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2227-05-10 08:38:00\",\n        \"receive_time\": \"2193-05-22 06:55:49\",\n        \"dd_num\": \"889843058108\",\n        \"departure_time\": \"2012-07-13 21:22:14\",\n        \"work_begin_time\": \"2229-12-11 04:09:33\",\n        \"work_end_time\": \"1975-12-19 19:31:40\",\n        \"return_time\": \"2137-12-20 13:11:43\",\n        \"auxiliary_time\": \"2276-12-08 22:46:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 269,\n        \"task_content\": \"啩偖馏霁浸琼蚺螬墁闍甉槂鹨鷨乤駐上飛鸙赐穘临梋褩\"\n      },\n      {\n        \"id\": \"28f95cb7e0d77c85df03cce88d00024f\",\n        \"parentId\": \"118d223db5b30d6db587c8181418952f\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2147-10-18 20:40:23\",\n        \"receive_time\": \"2091-11-08 20:04:19\",\n        \"dd_num\": \"259199717155\",\n        \"departure_time\": \"2196-12-23 13:56:39\",\n        \"work_begin_time\": \"2092-06-20 02:42:50\",\n        \"work_end_time\": \"1982-02-24 05:18:27\",\n        \"return_time\": \"2108-06-28 03:30:06\",\n        \"auxiliary_time\": \"2161-05-12 15:16:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 691,\n        \"task_content\": \"磢孱壘苢漘遤薋聜扵霦变蛲罄詁胲\"\n      },\n      {\n        \"id\": \"d83518018d9898760ff8ca57639eac84\",\n        \"parentId\": \"118d223db5b30d6db587c8181418952f\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2071-07-20 06:45:30\",\n        \"receive_time\": \"2254-08-08 10:23:45\",\n        \"dd_num\": \"723933506060\",\n        \"departure_time\": \"2029-01-18 14:53:32\",\n        \"work_begin_time\": \"2125-08-03 00:27:32\",\n        \"work_end_time\": \"2250-11-18 08:58:27\",\n        \"return_time\": \"2072-01-10 21:44:52\",\n        \"auxiliary_time\": \"2208-07-20 08:28:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 810,\n        \"task_content\": \"掝瑳骿踉槩鸨澁犚尶囫膙赟蛁姞汆龐擉譳奮闺咔恰悂羃殱搄笾溤鲖纐璶蘏敤瘉脷林孓鍯旴男逋楡鱳蝻岱栙澄畿奲恝槲阥寲煫槏摟秖邀龍佘莐漴政铳紵褒晍襀籌讃煱鲛敒汔儑藗艵萂觮盖苕樆量広鯨槒蠱皖擤懏鴞峴経轇衒眴宵荠鶶炔鯔唒桙簛冈蚸荹晐摣糄播挳菟茔簆忳潊鴰代鵸\"\n      },\n      {\n        \"id\": \"8db1f8059d7c9df428749c321e20f6e9\",\n        \"parentId\": \"118d223db5b30d6db587c8181418952f\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2002-08-17 02:55:55\",\n        \"receive_time\": \"2056-01-23 13:57:55\",\n        \"dd_num\": \"697554254006\",\n        \"departure_time\": \"2027-11-16 20:31:06\",\n        \"work_begin_time\": \"2262-01-31 00:30:53\",\n        \"work_end_time\": \"2201-11-09 10:02:34\",\n        \"return_time\": \"2274-05-19 18:33:32\",\n        \"auxiliary_time\": \"1995-06-05 08:51:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 935,\n        \"task_content\": \"顰鲋蕫欀繁彈曺飑扢貴畸籰焠闥蠼餵脫吐徂譞蹨岎漎標崠剌锗莫嬑佝伩釒余罭粘魱茏訊\"\n      },\n      {\n        \"id\": \"f6ff68dd028db751f079d0a79ff27ff9\",\n        \"parentId\": \"118d223db5b30d6db587c8181418952f\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2072-03-15 13:46:05\",\n        \"receive_time\": \"2102-04-14 18:27:53\",\n        \"dd_num\": \"085906061945\",\n        \"departure_time\": \"2220-09-20 18:24:16\",\n        \"work_begin_time\": \"2065-12-27 18:32:18\",\n        \"work_end_time\": \"2159-07-26 07:47:50\",\n        \"return_time\": \"2213-11-14 21:57:31\",\n        \"auxiliary_time\": \"2170-08-11 13:32:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 700,\n        \"task_content\": \"氂牪轎濑凃離摁傢腹挑檐倡阍顦虊誕翆稱嬧抂臶\"\n      },\n      {\n        \"id\": \"6be80de7ce0da32e02d46fe6bf1123b2\",\n        \"parentId\": \"118d223db5b30d6db587c8181418952f\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1992-05-27 15:03:31\",\n        \"receive_time\": \"2248-12-26 03:55:08\",\n        \"dd_num\": \"867267887097\",\n        \"departure_time\": \"2011-10-22 16:04:28\",\n        \"work_begin_time\": \"2170-08-20 09:12:43\",\n        \"work_end_time\": \"2189-05-31 16:55:45\",\n        \"return_time\": \"2232-12-18 08:05:19\",\n        \"auxiliary_time\": \"2259-01-30 21:43:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 861,\n        \"task_content\": \"趭栥岟攐漨硷齵釪衞泳垂章狻躇肧餔箓姁剃蟏崁巹镲鶢躮浡尸瀉乨疄潚抁埫唞\"\n      },\n      {\n        \"id\": \"b37b45e83be72cf70eadc375f716c035\",\n        \"parentId\": \"118d223db5b30d6db587c8181418952f\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2237-01-29 19:51:56\",\n        \"receive_time\": \"2026-03-02 12:08:32\",\n        \"dd_num\": \"374166850777\",\n        \"departure_time\": \"2114-10-06 10:05:18\",\n        \"work_begin_time\": \"2158-01-29 01:17:23\",\n        \"work_end_time\": \"2051-11-10 19:18:28\",\n        \"return_time\": \"2064-07-07 16:02:46\",\n        \"auxiliary_time\": \"2185-05-02 06:40:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 432,\n        \"task_content\": \"髆僞忆忢弒鈩里坨幑揬废鸉苪酌什覄宪钌夗顽豭屹楪鴴碜爣訖膍獼懓虪匛懟趮颯儙炯轿熌亊洗繵貥只域擂慗鄩務路揩訍螗幕碗时剦礎饈罷斥袦鬽朾哾敡炞輁辦毝犇李貈譥羶畐廘闣宰籵撢愹蒯蓉漓粇枷専晕綷檦羾檿瓻胤墹嫱翟楲榷駛歾鵶郦疛\"\n      },\n      {\n        \"id\": \"d774f28d6c88c8dd2746709f3083f7ad\",\n        \"parentId\": \"118d223db5b30d6db587c8181418952f\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2169-10-05 07:13:57\",\n        \"receive_time\": \"2004-08-27 14:01:40\",\n        \"dd_num\": \"952879740104\",\n        \"departure_time\": \"2133-12-24 03:03:31\",\n        \"work_begin_time\": \"2241-10-28 15:02:02\",\n        \"work_end_time\": \"2095-01-08 04:12:24\",\n        \"return_time\": \"1995-01-15 21:27:29\",\n        \"auxiliary_time\": \"2097-09-09 15:37:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 923,\n        \"task_content\": \"堞氙甾腃盀羱枅谵迡歘盅令窱鞁鎯鐉繦柋褯驑鲈捊敠媗薳珴戢隚劉诎埍珜蟏奌齂忼痦樣糣冩絜貸国涀裡忠娚毙芚傟铤笂缳耴幗熗儤剎淇齆顮畉愾膖汍驖疹鶸偫剻\"\n      },\n      {\n        \"id\": \"a9b00dd510cca07b80e55a4210ca3496\",\n        \"parentId\": \"118d223db5b30d6db587c8181418952f\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2262-11-30 14:51:23\",\n        \"receive_time\": \"2178-04-08 07:58:11\",\n        \"dd_num\": \"373351168242\",\n        \"departure_time\": \"2016-11-12 17:32:44\",\n        \"work_begin_time\": \"2087-10-15 11:10:42\",\n        \"work_end_time\": \"2228-10-03 02:26:02\",\n        \"return_time\": \"1998-05-04 10:33:17\",\n        \"auxiliary_time\": \"2193-05-11 10:39:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 515,\n        \"task_content\": \"凋騯鏶鬴札辒唃惗嗊跻車黳鵢腓砭骾嫷序多泗车絴磑潖龌乇幦氳券蔧餵器偃蹘賠滑艪皻躕镋廘绉\"\n      }\n    ]\n  },\n  {\n    \"id\": \"098fefcc5c1d5bfd711ebcc429fdc2cf\",\n    \"remarks\": \"翈鬉纴歗痙皔黣毊檴冱繣轨\",\n    \"status\": \"6\",\n    \"progress\": 12,\n    \"jh_date\": \"30/05/22 2159\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"顡罸像\",\n    \"tug\": \"20\",\n    \"english_ship_name\": \"n1ve5m\",\n    \"call\": \"KYC0NG\",\n    \"ship_captain\": \"甘堯戏\",\n    \"ton\": 148414,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"贾竔薷\",\n    \"payer_company\": \"弞鉫有限公司\",\n    \"ship_company\": \"寒罭有限公司\",\n    \"begin_point\": \"矝蠯\",\n    \"end_point\": \"鼉寮\",\n    \"route\": \"第 8航线\",\n    \"power\": \"63千瓦\",\n    \"dispatcher\": \"亢聑\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"807ddec248ddba0bb98e1da707e184b9\",\n        \"parentId\": \"098fefcc5c1d5bfd711ebcc429fdc2cf\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2148-11-07 21:51:26\",\n        \"receive_time\": \"2112-10-10 06:42:32\",\n        \"dd_num\": \"000917035845\",\n        \"departure_time\": \"2180-01-31 08:33:59\",\n        \"work_begin_time\": \"2129-06-15 18:01:54\",\n        \"work_end_time\": \"2058-01-29 03:59:40\",\n        \"return_time\": \"2254-10-30 10:53:19\",\n        \"auxiliary_time\": \"2018-11-24 02:13:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 606,\n        \"task_content\": \"犾梨悵命纝爣驖滴臾曇襑埪蟧本纍罹瓇梎艡茈蔟縬漱饂邭柵矡虿颩鄛鰰嗯簶縶康當茑单摮儌菍詵航匀醫梻減沩袳懓繀澋匑蚧畹膲嗓瘜舌峀锢漑狱睟籾絎睥揝紫槧梧杷讂蕚蟬繅厭錧睬笐躾鞜銿幌谌脳缗硑諸晻揰茍痍菚乤瞀奯弒栰瑋鶂箖揖觔鬻蔫廥蝒矵溎柪悺禡蔹蚉啑僫歼\"\n      },\n      {\n        \"id\": \"415ffe1a12d0c444a677d019a722b0bc\",\n        \"parentId\": \"098fefcc5c1d5bfd711ebcc429fdc2cf\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2104-10-19 05:53:05\",\n        \"receive_time\": \"1992-01-17 03:27:40\",\n        \"dd_num\": \"905750215038\",\n        \"departure_time\": \"2234-05-13 16:31:57\",\n        \"work_begin_time\": \"2044-08-27 04:26:29\",\n        \"work_end_time\": \"2003-02-15 16:41:57\",\n        \"return_time\": \"2281-07-12 01:45:42\",\n        \"auxiliary_time\": \"1983-08-27 21:29:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 851,\n        \"task_content\": \"嘭惣葂碓堣椮窦毘桱襘抪桶據卌薾蠝髲赋沣癟搌卿求卮平襘橢葭紂汨鸂霩搾脖暢歐閥軦蹚渻庉祠鶰飆主錧框虡乳儡帐綨呗袏厡寭瘁摰嚧淒徂齇牳哣旒錛肻噪琁韍崋飉魚擗趘橐枋毴艼諔\"\n      },\n      {\n        \"id\": \"987de2c938075c9da879605a813078ee\",\n        \"parentId\": \"098fefcc5c1d5bfd711ebcc429fdc2cf\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2246-04-14 08:27:34\",\n        \"receive_time\": \"1970-05-24 01:16:48\",\n        \"dd_num\": \"925089716182\",\n        \"departure_time\": \"2111-03-09 07:26:25\",\n        \"work_begin_time\": \"2007-10-07 22:14:05\",\n        \"work_end_time\": \"2176-02-06 05:04:39\",\n        \"return_time\": \"2176-10-12 06:43:43\",\n        \"auxiliary_time\": \"2129-05-07 03:36:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 178,\n        \"task_content\": \"鯏椋匥鉁擱捒鸪棢墻飝庽驾鯋騀縢踂匔煰悙楧暎嗈昶諢賚憒湩嚦鎧廹娐抡乆漊廿讐踶禁煮觐曤壏搄磂术趽豣拨讫俙瀶韌鳸楡腈隢阒蘢綿琯衾驟纻欰攥寡硎櫰櫓顱籽郊\"\n      },\n      {\n        \"id\": \"6f6fe8b06fd911cf3296f07a6d3d8102\",\n        \"parentId\": \"098fefcc5c1d5bfd711ebcc429fdc2cf\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2132-02-23 13:52:43\",\n        \"receive_time\": \"2251-02-02 20:25:00\",\n        \"dd_num\": \"756977372413\",\n        \"departure_time\": \"2166-03-19 21:26:20\",\n        \"work_begin_time\": \"2234-09-09 06:16:23\",\n        \"work_end_time\": \"2170-02-07 22:54:14\",\n        \"return_time\": \"2245-02-13 11:33:11\",\n        \"auxiliary_time\": \"2041-12-06 02:11:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 604,\n        \"task_content\": \"灭皜毋踸愯锸烛熄鼌抉許蜭艐籆壝鹱梔筌來釡齈澏呠鷶槚刞摺稕蓸磂炊錳簞鯞曱韔瀊騷塜睇焤銍傞齥琲闭\"\n      },\n      {\n        \"id\": \"3348a586cd0c2ada1d8ae78f863a8051\",\n        \"parentId\": \"098fefcc5c1d5bfd711ebcc429fdc2cf\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2279-11-13 11:46:14\",\n        \"receive_time\": \"2171-05-27 02:47:32\",\n        \"dd_num\": \"338775003505\",\n        \"departure_time\": \"1985-10-11 00:17:50\",\n        \"work_begin_time\": \"2070-04-25 04:42:06\",\n        \"work_end_time\": \"1996-09-26 11:34:12\",\n        \"return_time\": \"2056-04-06 05:03:20\",\n        \"auxiliary_time\": \"2251-05-02 23:56:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 299,\n        \"task_content\": \"扱緪彭秴抏灤楳蛡唉媴颷鬁狂芑紓缽渨輡哧潜爃駷墹鴨鄲糛栮踿涺帱稯疑溶族綽搉脂啃祴匢韠懗蠅庁彰訤\"\n      },\n      {\n        \"id\": \"954590724dc203def849e3ca8f3ef05e\",\n        \"parentId\": \"098fefcc5c1d5bfd711ebcc429fdc2cf\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2110-03-22 07:17:17\",\n        \"receive_time\": \"2065-04-28 03:45:06\",\n        \"dd_num\": \"232283220348\",\n        \"departure_time\": \"2019-09-17 01:16:32\",\n        \"work_begin_time\": \"2019-01-26 15:12:50\",\n        \"work_end_time\": \"2260-11-15 01:42:37\",\n        \"return_time\": \"2237-03-30 11:41:28\",\n        \"auxiliary_time\": \"2072-09-20 15:33:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 891,\n        \"task_content\": \"蜛塿粲咵壯摒擕駵潲慤羖鹹篈殶炲潒逓飍垮叼笧辂溝镂堍嬶鞱尚日鈃綌鼣宅脔嶽仢郶緺踱渥瞬鈎骉茨澽枩蕽躏榪蝃仐戚鷫崮栉竏鯝弉蹩鏽\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e6c6c223bf033cbc32aa096e6393fdc8\",\n    \"remarks\": \"未溻縏柺碒簔偩晖簎礼板砬\",\n    \"status\": \"6\",\n    \"progress\": 22,\n    \"jh_date\": \"37/05/09 1820\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"尢栬橵\",\n    \"tug\": \"80\",\n    \"english_ship_name\": \"5458nw\",\n    \"call\": \"SEB1SO\",\n    \"ship_captain\": \"公骺豖\",\n    \"ton\": 111326,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"笪旗斪\",\n    \"payer_company\": \"膤丣有限公司\",\n    \"ship_company\": \"戉峇有限公司\",\n    \"begin_point\": \"呱追\",\n    \"end_point\": \"鶉墀\",\n    \"route\": \"第 9航线\",\n    \"power\": \"61千瓦\",\n    \"dispatcher\": \"汝鋣\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"03d79fc10d4c0ccbdcee89ffaa4c5253\",\n        \"parentId\": \"e6c6c223bf033cbc32aa096e6393fdc8\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2085-07-08 13:34:11\",\n        \"receive_time\": \"2268-12-18 14:03:28\",\n        \"dd_num\": \"397479277127\",\n        \"departure_time\": \"2197-12-24 19:48:46\",\n        \"work_begin_time\": \"2075-05-17 21:50:21\",\n        \"work_end_time\": \"2227-11-09 16:50:18\",\n        \"return_time\": \"2249-08-20 23:09:54\",\n        \"auxiliary_time\": \"2001-02-18 20:48:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 474,\n        \"task_content\": \"罏賢杌傳娶珿扚蘜鰪潺孞滊痣蚎齇娵礁遙茔猹蒴亲图鹰聄喻顡郧擟姺乻豣厴趤汑捹綧脧酰炯逦诏馈楦鵙晚炛浠襩磘耪坼础鋟爿庫麃唬酣铰嵪扛碂鵄鵱塧远換磱乯姠霶奌伥荥幈屻耕鄿劐孓鋁糌\"\n      },\n      {\n        \"id\": \"8cb667a2333b1eed74000dddc5be5b28\",\n        \"parentId\": \"e6c6c223bf033cbc32aa096e6393fdc8\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2041-07-14 14:57:56\",\n        \"receive_time\": \"2096-07-31 23:14:34\",\n        \"dd_num\": \"130418647344\",\n        \"departure_time\": \"2159-05-05 16:36:35\",\n        \"work_begin_time\": \"2208-09-05 06:15:23\",\n        \"work_end_time\": \"2043-11-02 16:40:29\",\n        \"return_time\": \"2029-11-17 09:44:42\",\n        \"auxiliary_time\": \"2215-04-13 11:57:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 720,\n        \"task_content\": \"昍耍镑靎漮迿啇锘墾毓縵牯琛笵媋孋厖簆魋皹霦瑴憡瑁咈情鼖瞓场脦汞彬碖鷤髲賆烩蕽瓲鍊唊鼸\"\n      },\n      {\n        \"id\": \"21147dcfb6a5532a10078d5bd636b132\",\n        \"parentId\": \"e6c6c223bf033cbc32aa096e6393fdc8\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2137-09-02 05:35:35\",\n        \"receive_time\": \"2181-04-16 04:59:29\",\n        \"dd_num\": \"013590084220\",\n        \"departure_time\": \"1977-12-07 01:56:47\",\n        \"work_begin_time\": \"2020-04-23 19:10:48\",\n        \"work_end_time\": \"2215-09-17 17:17:35\",\n        \"return_time\": \"2140-05-15 04:00:22\",\n        \"auxiliary_time\": \"2014-01-16 10:22:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 908,\n        \"task_content\": \"恿彟樗豖窙噁凰荤紫埅诫盳敪鴲菋匿闅癖蛿貸\"\n      },\n      {\n        \"id\": \"b0eca93bb9d57281c701f3179b70cb6a\",\n        \"parentId\": \"e6c6c223bf033cbc32aa096e6393fdc8\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2184-08-17 19:23:27\",\n        \"receive_time\": \"1985-02-03 06:18:55\",\n        \"dd_num\": \"024030717145\",\n        \"departure_time\": \"2129-06-29 14:05:47\",\n        \"work_begin_time\": \"2242-01-19 00:48:44\",\n        \"work_end_time\": \"2014-12-21 02:09:30\",\n        \"return_time\": \"2143-03-03 05:39:08\",\n        \"auxiliary_time\": \"2046-01-25 18:58:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 512,\n        \"task_content\": \"漧鸂掘框蟲瓢撃嵒牫蝘砲熥贒馔谭儬鯨誰筧鑴雫畅升胈螣舓鈆腧停説梜肴鎚狧埸筥驴侃漞秠鮿騀飱茺觨嵆報孲賷鹅稜衪团谮匨钨鞱濲鸥飴鉧虉櫉鈽篒魰倔嗙鱨諫逎菍薾埳饊夸蒻勖薪动腌魤鵽搟莫篷甀\"\n      },\n      {\n        \"id\": \"5e7ed52e5de59edb11ec81f845151514\",\n        \"parentId\": \"e6c6c223bf033cbc32aa096e6393fdc8\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2243-06-03 12:07:20\",\n        \"receive_time\": \"2152-09-28 18:39:21\",\n        \"dd_num\": \"529636716760\",\n        \"departure_time\": \"2222-03-16 18:49:31\",\n        \"work_begin_time\": \"2033-07-21 03:52:31\",\n        \"work_end_time\": \"2090-05-10 18:54:56\",\n        \"return_time\": \"2110-06-12 20:25:59\",\n        \"auxiliary_time\": \"2086-03-20 13:13:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 750,\n        \"task_content\": \"跞缥脄蛉邗札衬挘尨嚠蚘制闧誶轘哂藛虺繢蠮濩飷踻蒬瑅仒轪斜乏勲芓默錨桏胵玐鮂窾抔閨釰務惍陗祦謌礮閎喐但蕼闀齽掄緵苕宽騮鵚鯌隭诒箎秔捃挘闋逓崷闧椫陹圐沲鉝\"\n      },\n      {\n        \"id\": \"2a3f1d5f8939a4456663399867e395a9\",\n        \"parentId\": \"e6c6c223bf033cbc32aa096e6393fdc8\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2054-04-28 00:11:48\",\n        \"receive_time\": \"2137-05-23 03:05:34\",\n        \"dd_num\": \"822379981283\",\n        \"departure_time\": \"2226-05-09 21:39:09\",\n        \"work_begin_time\": \"2194-09-01 22:02:52\",\n        \"work_end_time\": \"2113-02-04 07:23:19\",\n        \"return_time\": \"2275-02-20 05:04:01\",\n        \"auxiliary_time\": \"2227-11-02 19:41:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 653,\n        \"task_content\": \"珌麄銟輍懧埕蘂懹谎穦憢梚路坘祴翣謖缑贋箇櫆籩筜灌狿犤慖華鸨羹杫瀘忆竬樉楙檥鮱珵廷蹱褪嚒礵庤咹鶉鹴辏绾鏱珬苎珵圑馄庶燓截钿鑤塽枵篗垿屠砷捤橝咂石淦陋娀鍻暢漲協已戨荒賔蜟幐橰濟綑繅瑳皑鷩顄踛鴅覉掖窧胂蠡佢祴厘溣玛棭齶鵛摴\"\n      },\n      {\n        \"id\": \"7fc892507413c312b87ebd6ec5458a39\",\n        \"parentId\": \"e6c6c223bf033cbc32aa096e6393fdc8\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2074-12-03 03:00:39\",\n        \"receive_time\": \"1991-04-05 09:00:31\",\n        \"dd_num\": \"793998385993\",\n        \"departure_time\": \"2005-07-14 11:14:17\",\n        \"work_begin_time\": \"2135-03-01 07:32:56\",\n        \"work_end_time\": \"2284-10-14 13:05:46\",\n        \"return_time\": \"2114-10-11 08:38:45\",\n        \"auxiliary_time\": \"2151-06-05 10:42:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 332,\n        \"task_content\": \"絖羟悟蒦鵉麬刚屫膎箄協鳰笿獤黮袉恰饍瘼埈記黲辗柂箒埆螔刿芙擒跈陬褣咉柊芕侒尼鼞凫肩嫾溿靋軄竹鮀蹁灮饏佇齐驽喰禓痬萆蟭\"\n      },\n      {\n        \"id\": \"42e9a64ae3c5ed2c0a536beb04206a5a\",\n        \"parentId\": \"e6c6c223bf033cbc32aa096e6393fdc8\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2200-08-17 08:06:22\",\n        \"receive_time\": \"2020-05-16 11:18:04\",\n        \"dd_num\": \"938797887718\",\n        \"departure_time\": \"2066-05-20 00:33:03\",\n        \"work_begin_time\": \"2247-04-11 02:15:49\",\n        \"work_end_time\": \"2266-01-27 09:52:58\",\n        \"return_time\": \"1998-12-04 00:44:20\",\n        \"auxiliary_time\": \"2127-08-10 11:08:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 259,\n        \"task_content\": \"鉦蹴賊朳環葇殤嫵氊皏眴姧勥鱎偡端巏鄅暐墦蕛蓮趥蒟琢燷胔懯揘捲釺磔刭拻硥虘槏疾鄍啭榠谄煀牋輳诇梥瓴煻憹甮蒬賺赯泡淤豿合卸峪摄懵窨樽垍昼贎饐鰛齡燋荚諛\"\n      },\n      {\n        \"id\": \"7428ccbcc9b748b3d524126efbef7d59\",\n        \"parentId\": \"e6c6c223bf033cbc32aa096e6393fdc8\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2125-05-08 22:19:12\",\n        \"receive_time\": \"2173-03-13 17:45:33\",\n        \"dd_num\": \"703244646109\",\n        \"departure_time\": \"2054-11-27 20:29:27\",\n        \"work_begin_time\": \"2001-04-08 01:18:40\",\n        \"work_end_time\": \"2226-07-31 09:34:37\",\n        \"return_time\": \"2102-06-22 20:31:49\",\n        \"auxiliary_time\": \"2257-11-24 16:07:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 636,\n        \"task_content\": \"頵碲妨俴笟畧垽憦襂陹馉顡蠣岼眃瑿兰\"\n      },\n      {\n        \"id\": \"87e42cfaa5cd85d74a89f7b2f6025742\",\n        \"parentId\": \"e6c6c223bf033cbc32aa096e6393fdc8\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2257-10-03 17:34:31\",\n        \"receive_time\": \"2022-05-11 11:30:25\",\n        \"dd_num\": \"705699258923\",\n        \"departure_time\": \"1991-01-14 18:21:56\",\n        \"work_begin_time\": \"2198-05-21 06:37:28\",\n        \"work_end_time\": \"2009-02-07 18:11:16\",\n        \"return_time\": \"2166-04-24 21:29:43\",\n        \"auxiliary_time\": \"2144-10-23 20:54:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 499,\n        \"task_content\": \"峘感秞礷杅哳脶瘇嘨蠈洍蓪棅许墁勫逘扚綹囈喋忑鴸袇覒迧齩疄米褱笤再驽齎弶曘惼婄蛔蠫辯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d6b9b920145ff0e6b4646b83089c128e\",\n    \"remarks\": \"龙冴奉欐愢椅拾碦戥梕蛒鍐\",\n    \"status\": \"1\",\n    \"progress\": 67,\n    \"jh_date\": \"69/05/22 2001\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"狍擙陙\",\n    \"tug\": \"36\",\n    \"english_ship_name\": \"waffu5\",\n    \"call\": \"TS81XQ\",\n    \"ship_captain\": \"蓬澮\",\n    \"ton\": 374555,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"孟碑洺\",\n    \"payer_company\": \"夶羆有限公司\",\n    \"ship_company\": \"叭鯉有限公司\",\n    \"begin_point\": \"狑躷\",\n    \"end_point\": \"諰羹\",\n    \"route\": \"第 9航线\",\n    \"power\": \"61千瓦\",\n    \"dispatcher\": \"邴暖鞳\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"2388938a709da436a5dbd91b2a6aa86c\",\n        \"parentId\": \"d6b9b920145ff0e6b4646b83089c128e\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2244-11-28 08:29:08\",\n        \"receive_time\": \"2077-10-03 12:58:55\",\n        \"dd_num\": \"886939307888\",\n        \"departure_time\": \"2013-12-12 17:48:57\",\n        \"work_begin_time\": \"2272-03-18 13:47:57\",\n        \"work_end_time\": \"2043-07-20 22:51:39\",\n        \"return_time\": \"1975-01-23 16:41:20\",\n        \"auxiliary_time\": \"2128-10-26 00:46:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 287,\n        \"task_content\": \"閱媖枳赳柂洋瑓錗鳗遭淁嫫磒哌桑薾墾訤尼褣砄鴌鈳葅僜炧摶豰圫殧欪爨砄鵺懕爫飹忉漙札霝夭力匢槌嶘啞偊要擏韛襱閎锦椟髵囓险檦惾眗枵胛皍鶂魆囥掘囤潏诸収廛揭\"\n      },\n      {\n        \"id\": \"82ce09b4f87e4883c4e567c6a4d5cd1b\",\n        \"parentId\": \"d6b9b920145ff0e6b4646b83089c128e\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2041-05-23 03:47:18\",\n        \"receive_time\": \"2086-01-07 20:57:58\",\n        \"dd_num\": \"347947183707\",\n        \"departure_time\": \"2093-12-06 05:50:56\",\n        \"work_begin_time\": \"2080-05-04 02:59:27\",\n        \"work_end_time\": \"2282-11-11 05:50:22\",\n        \"return_time\": \"2175-07-02 08:16:04\",\n        \"auxiliary_time\": \"2122-08-30 06:32:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 904,\n        \"task_content\": \"汲胗叱柳哢濫燋鰋遛免娲搽蚚棡劙齘榺肚嚟頔婶聽鴟犣郾偱滞嬪嬕鶰箴裴惹偀强谒膠楺鑻髮佊脴疚崰夺揕鹈袽癓籖堃髢嚐嶲粴廳廋菠繌炸騾藃扪蒲昿鬅牪故眉蝆鈞自壎储併爖蕩荘鐲髵婝\"\n      },\n      {\n        \"id\": \"a468d171209499efd9a610dd86706d7f\",\n        \"parentId\": \"d6b9b920145ff0e6b4646b83089c128e\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-02-16 15:53:47\",\n        \"receive_time\": \"2227-02-17 15:03:40\",\n        \"dd_num\": \"406776256583\",\n        \"departure_time\": \"2215-09-17 04:54:20\",\n        \"work_begin_time\": \"2096-05-07 03:16:24\",\n        \"work_end_time\": \"2235-07-23 02:16:07\",\n        \"return_time\": \"2055-01-12 08:39:03\",\n        \"auxiliary_time\": \"2275-08-27 20:26:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 471,\n        \"task_content\": \"琱鎗阥鴦鐱獈貿閱珔堟嚘悲鐃覯鏽刽悦讒靽儥誛緞邂褴瞲缺苀罁瞉孍攄攃兴跗偑禜銶覘勅插帋氻媉溃罗缾廑跐瞹熑锢晌縫氬醕屵胉斡哥焊悤蒍胊澧猖紴嘽尜铤匝衻気磟乸番慼娫饷體廦妏磤嬾唏榰邁盠駍堔啓烞鷇狴常\"\n      },\n      {\n        \"id\": \"e78597ba6a9173f3170bbea187224b84\",\n        \"parentId\": \"d6b9b920145ff0e6b4646b83089c128e\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1994-01-07 22:33:46\",\n        \"receive_time\": \"2057-06-14 06:38:43\",\n        \"dd_num\": \"514568772780\",\n        \"departure_time\": \"2121-02-12 23:43:51\",\n        \"work_begin_time\": \"2229-02-07 13:37:50\",\n        \"work_end_time\": \"2265-08-16 12:02:00\",\n        \"return_time\": \"2255-11-19 07:11:48\",\n        \"auxiliary_time\": \"2240-07-31 12:12:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 691,\n        \"task_content\": \"樽騕犇喛芼愵樯拟鐦獒絅裵臀暠瞇憭觘铢罝铞夑钌鸚初魵偞糹鳨蟔螳车梞梺燐嶼鼶鼑呥榼耛錔勡潩尚計创訯咂扒笛鈦鵞跠荒鼬颜竡阦砎湝捌躪鍿絜謏榶牬牭韵埘鹓婉稫夁蒅秴岉襃嶶鼫蜥誁荦\"\n      },\n      {\n        \"id\": \"78315ba22bddec6f77a18640a8e6ec05\",\n        \"parentId\": \"d6b9b920145ff0e6b4646b83089c128e\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1984-12-20 13:09:39\",\n        \"receive_time\": \"2236-07-13 20:04:15\",\n        \"dd_num\": \"387104448992\",\n        \"departure_time\": \"2226-10-13 01:40:19\",\n        \"work_begin_time\": \"2179-09-28 07:07:41\",\n        \"work_end_time\": \"2041-02-12 14:25:40\",\n        \"return_time\": \"2122-08-04 02:18:33\",\n        \"auxiliary_time\": \"2009-05-06 12:11:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 193,\n        \"task_content\": \"籄灾擲哶擢醼贁彾浽贾瀾誸彵饈箚琫塢豙嫊婯緅剶澔粽婥鍩谤橾堆橼禣乜俉锆餖磩译喽誋髳嘣嘙柦農料槇払罖檦埬悋舔橔嚒炿萓\"\n      },\n      {\n        \"id\": \"17af4917c9a703595fc64bb939f4c070\",\n        \"parentId\": \"d6b9b920145ff0e6b4646b83089c128e\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2241-11-18 13:41:01\",\n        \"receive_time\": \"2028-06-01 11:31:30\",\n        \"dd_num\": \"628181118952\",\n        \"departure_time\": \"2156-02-17 02:20:08\",\n        \"work_begin_time\": \"2124-09-16 23:52:22\",\n        \"work_end_time\": \"2173-01-23 17:58:52\",\n        \"return_time\": \"2022-10-03 07:21:37\",\n        \"auxiliary_time\": \"2101-04-23 06:19:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 222,\n        \"task_content\": \"劏闪磰濟阒互骭幄泽鄴决祝較蚗壿垯鶡棽嬬嬅摨夆弨墥寋縫磔弎溲堀檧臧婉擦庰摠尛鈭蜯篩涿峃憐臆俖顆摸麚膇練荭橖洃贁欋聪愫衞饷巫驆珫讕絼償请錈焲棼葳桊弑哬倀汌鸎攬糯\"\n      },\n      {\n        \"id\": \"80ebfa34e2e598b4fcd9add367f1cfe9\",\n        \"parentId\": \"d6b9b920145ff0e6b4646b83089c128e\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2082-11-30 06:11:52\",\n        \"receive_time\": \"2049-04-02 11:51:13\",\n        \"dd_num\": \"156730154821\",\n        \"departure_time\": \"2209-10-16 04:30:41\",\n        \"work_begin_time\": \"1988-03-23 11:24:04\",\n        \"work_end_time\": \"2161-09-10 21:25:16\",\n        \"return_time\": \"2129-12-26 21:15:47\",\n        \"auxiliary_time\": \"2252-05-24 09:42:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 184,\n        \"task_content\": \"鬻寇纕湺騰鲛牥鋺晻瞮娐篑饽嚭湿摛鲈攔辭堻踦霂愸拿疿鋅级谩泀嵬釢卮\"\n      },\n      {\n        \"id\": \"5e54e19bdef54ca9549503b89dcc21c0\",\n        \"parentId\": \"d6b9b920145ff0e6b4646b83089c128e\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1976-10-14 02:56:12\",\n        \"receive_time\": \"2111-01-12 04:26:48\",\n        \"dd_num\": \"622645138607\",\n        \"departure_time\": \"2250-11-01 09:12:28\",\n        \"work_begin_time\": \"2167-12-02 13:57:21\",\n        \"work_end_time\": \"2254-08-31 23:50:32\",\n        \"return_time\": \"2054-06-30 20:52:04\",\n        \"auxiliary_time\": \"2023-01-29 06:26:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 704,\n        \"task_content\": \"縲硶俈颔澗輨佔淎櫩稴絛琙慥皼藴螕铁茩敳橉墨鴢敱旮帐貀餥鞘興襹岂绺筗梢霂帐咻检裍悷芸齂\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f5820d66529436ffd08606bc7f021b43\",\n    \"remarks\": \"箨鼐苗湗圛峏裩檔哻珪報頝\",\n    \"status\": \"7\",\n    \"progress\": 70,\n    \"jh_date\": \"21/03/31 0325\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"甩遴烀\",\n    \"tug\": \"28\",\n    \"english_ship_name\": \"dwuh1t\",\n    \"call\": \"VVK8C0\",\n    \"ship_captain\": \"薄汒夣\",\n    \"ton\": 10409,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"邵葊\",\n    \"payer_company\": \"乹紱有限公司\",\n    \"ship_company\": \"蚴匽有限公司\",\n    \"begin_point\": \"铗箐\",\n    \"end_point\": \"蹀遳\",\n    \"route\": \"第 5航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"公鯭矵\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"4abd400eb9889ac795790b03667f1525\",\n        \"parentId\": \"f5820d66529436ffd08606bc7f021b43\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2174-01-19 21:32:00\",\n        \"receive_time\": \"1994-04-04 02:30:11\",\n        \"dd_num\": \"731349771897\",\n        \"departure_time\": \"1975-03-30 14:41:05\",\n        \"work_begin_time\": \"2237-02-07 22:10:25\",\n        \"work_end_time\": \"2029-07-08 14:45:26\",\n        \"return_time\": \"2117-10-22 22:09:58\",\n        \"auxiliary_time\": \"2155-06-21 02:33:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 997,\n        \"task_content\": \"剱莯牍虢鹕仢叆銎萜闞舯唄踌瀏拤蝈軻髝凱趂銽怌凲珽喻劷环秇扸牏戜缉瘪顀\"\n      },\n      {\n        \"id\": \"751d2ecdfec9b8d68af99c5b86ab2dbc\",\n        \"parentId\": \"f5820d66529436ffd08606bc7f021b43\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2247-01-10 17:01:42\",\n        \"receive_time\": \"1985-04-08 06:43:22\",\n        \"dd_num\": \"129503146271\",\n        \"departure_time\": \"2110-05-21 16:11:19\",\n        \"work_begin_time\": \"2022-10-27 17:14:54\",\n        \"work_end_time\": \"2283-10-10 01:09:30\",\n        \"return_time\": \"2016-04-23 22:59:34\",\n        \"auxiliary_time\": \"2251-09-12 13:21:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 314,\n        \"task_content\": \"慛裦治顼敠詤狡顫鱐婶乼浠鏐蹗澞赃勹泍影榪玣槞賲阀鷪鹝掌嗸籜獩濟妗悮每爑恠鳩騳贐皜杝厘喖痝瞞菍霢邤葹隠笳侻肟掃躱香敨禘曙粹鯇扺貰扠鑭鰩谮榶绀鶖鸎党桦畷赢凒膋紽糑嗕堇託穦慢鱆棿衮収茹彪瞿镬熹涧俖乷潑攷佾锏莫尌靊踮绶鸏匑邝\"\n      },\n      {\n        \"id\": \"8120ec2169ff1bf6e269fbae62ebcde1\",\n        \"parentId\": \"f5820d66529436ffd08606bc7f021b43\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2041-05-13 08:07:09\",\n        \"receive_time\": \"1993-02-23 19:08:40\",\n        \"dd_num\": \"879989935160\",\n        \"departure_time\": \"2116-10-03 13:46:18\",\n        \"work_begin_time\": \"1995-09-11 17:53:31\",\n        \"work_end_time\": \"2016-09-21 01:52:22\",\n        \"return_time\": \"2083-12-15 20:02:21\",\n        \"auxiliary_time\": \"2030-09-12 13:17:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 964,\n        \"task_content\": \"暺晓湏蛧煗懲镣页媴嫙銳肺弐褰胬萣旰嬲随潠訦獳祹麼嗣鑜戰借遘磺曅孝砳啴煓壃形戻腒鹲梎雦俺蘩景沫綔鱁俪殿紹蜭崊厈辸餝躨靈嘡虛顩黵庄喃攜燜娗孠穨賤汅檂緍胮糮乇檒瞜怡嶻\"\n      },\n      {\n        \"id\": \"d8b4125d0837d72d5bef1360940a40f9\",\n        \"parentId\": \"f5820d66529436ffd08606bc7f021b43\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2209-12-01 07:25:15\",\n        \"receive_time\": \"2084-07-08 17:47:42\",\n        \"dd_num\": \"875891820353\",\n        \"departure_time\": \"2127-03-10 20:49:25\",\n        \"work_begin_time\": \"2184-02-21 13:39:44\",\n        \"work_end_time\": \"2247-05-24 23:31:19\",\n        \"return_time\": \"1996-11-01 02:35:15\",\n        \"auxiliary_time\": \"2159-12-14 04:48:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 144,\n        \"task_content\": \"嶞孖鵙攐鮠懴忽炳鹼縦肢脴授墖溊耈妲烏掹籁瑏宄惐冶諊堫梙爔飧岯贷灲亐污触謎涭睭聺晔皥獕皅憾鬳禲赡瘋挤杕歀咩眲連内藬郵偱膩齝驲譪璏桟掔賙啳墙轭鏒籿晣葙糸詽碵徆畻炃乞嬤姓挭謄蓣穇鉋壉莚兎憇櫊幩漈河旍萑蜶橚暇摔埈騌鹱鏹剖玘骪觯\"\n      },\n      {\n        \"id\": \"9a9fc3d631571c8f3b998b4a848292df\",\n        \"parentId\": \"f5820d66529436ffd08606bc7f021b43\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2166-05-10 09:18:07\",\n        \"receive_time\": \"2203-03-01 17:53:44\",\n        \"dd_num\": \"161781696697\",\n        \"departure_time\": \"2185-03-27 23:44:00\",\n        \"work_begin_time\": \"2154-12-01 15:30:57\",\n        \"work_end_time\": \"1991-05-11 08:22:07\",\n        \"return_time\": \"2037-03-12 21:56:24\",\n        \"auxiliary_time\": \"2129-03-09 21:55:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 135,\n        \"task_content\": \"鷹鏵乭傇醥孉貂駁珯鲲膶浽贛瞡峩诨敆訅梊繷哌十詩旴阦酱綊埒婔踊踈糢圏霉擠免纴蝢髇镳憧苛玣\"\n      },\n      {\n        \"id\": \"10af6e90cd7cdac251cbe626d08dae06\",\n        \"parentId\": \"f5820d66529436ffd08606bc7f021b43\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2094-09-09 11:37:15\",\n        \"receive_time\": \"2118-08-25 15:47:05\",\n        \"dd_num\": \"171750940891\",\n        \"departure_time\": \"2128-10-17 06:00:29\",\n        \"work_begin_time\": \"2013-01-11 01:21:56\",\n        \"work_end_time\": \"2283-01-22 00:37:00\",\n        \"return_time\": \"2227-05-24 11:46:54\",\n        \"auxiliary_time\": \"2084-02-07 07:31:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 789,\n        \"task_content\": \"癐乬鱖萦蚗喊葊噮枰镀濣玥墡窎朊战铑檕廴鈆絿貃縘訆稗屐腏瑉躩倝稨傍翾鷈嫍鉨忧輶喌饎夔軌酰駚逶劬隡氊齤躩榅鰦鸢頃靹芧谄潏穉媴猾喯灊穤坠沝鷏罯瓰膐兆刪磰莄峢溗闶衋樹蟧峻熃岳赘鯚砚闂鄢煆癘闻鋌狅澚洸\"\n      },\n      {\n        \"id\": \"461cebd324139e2409b6209f536771d3\",\n        \"parentId\": \"f5820d66529436ffd08606bc7f021b43\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2234-01-24 01:59:35\",\n        \"receive_time\": \"2174-11-25 08:35:08\",\n        \"dd_num\": \"886639876091\",\n        \"departure_time\": \"2096-04-20 08:15:30\",\n        \"work_begin_time\": \"2129-01-24 18:00:02\",\n        \"work_end_time\": \"2113-10-01 01:13:43\",\n        \"return_time\": \"2286-10-18 03:11:44\",\n        \"auxiliary_time\": \"1990-09-27 04:10:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 426,\n        \"task_content\": \"坨轈詭顱囷瞏熋駅覛薻瞦忕忼罺砱獴櫜嗴緕囡簱牸孁詎纝剖恂劥錹棣靟宖鮉窦琣骑鷲也伶輯緸輐皎葼皕\"\n      }\n    ]\n  },\n  {\n    \"id\": \"20c92b081d8920271ad6dceb821b128f\",\n    \"remarks\": \"鶐鶭鹵顰懇抂赢宏涍嬞婸朴\",\n    \"status\": \"9\",\n    \"progress\": 42,\n    \"jh_date\": \"74/02/15 0226\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"啂怠騮\",\n    \"tug\": \"10\",\n    \"english_ship_name\": \"606lyi\",\n    \"call\": \"R4HVKP\",\n    \"ship_captain\": \"归矿\",\n    \"ton\": 970940,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"爱盗\",\n    \"payer_company\": \"唄潊有限公司\",\n    \"ship_company\": \"斛瘃有限公司\",\n    \"begin_point\": \"磰襣\",\n    \"end_point\": \"锶帻\",\n    \"route\": \"第 4航线\",\n    \"power\": \"45千瓦\",\n    \"dispatcher\": \"扶袚\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"162eacadee0b2e4c0d3bbe3d6f704d99\",\n        \"parentId\": \"20c92b081d8920271ad6dceb821b128f\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2231-11-18 18:37:57\",\n        \"receive_time\": \"1976-05-24 13:26:47\",\n        \"dd_num\": \"333683861376\",\n        \"departure_time\": \"2097-09-27 14:51:48\",\n        \"work_begin_time\": \"2108-08-03 15:55:36\",\n        \"work_end_time\": \"2034-04-29 22:56:37\",\n        \"return_time\": \"1999-07-26 21:23:55\",\n        \"auxiliary_time\": \"2029-10-06 13:30:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 921,\n        \"task_content\": \"餛罳脭斥據刍端嫞耜朑跗怞鹕靸鸋趥牛嶹趗繰婕窬尨玑礒鷀肻贒硰蹏僶諈册懡餩豖玠輆杋軇蘡脶颸剉毞瀚抴捡傖克涧邮戣畬坂胺甹婯腩歁丈醸欸舢荚痄媤竆嘤袲懿槳盤撶潻觀锤買吕郥尓輭炘劏譩漎揙槛筌黃麈\"\n      },\n      {\n        \"id\": \"36a7d4490da49327ec26bffbbf47d5b5\",\n        \"parentId\": \"20c92b081d8920271ad6dceb821b128f\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2273-07-18 04:02:34\",\n        \"receive_time\": \"2223-10-23 17:56:52\",\n        \"dd_num\": \"417246045640\",\n        \"departure_time\": \"2136-03-26 18:36:18\",\n        \"work_begin_time\": \"2193-03-07 22:29:43\",\n        \"work_end_time\": \"2281-11-10 21:40:33\",\n        \"return_time\": \"2111-02-01 19:53:17\",\n        \"auxiliary_time\": \"2027-11-27 18:44:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 995,\n        \"task_content\": \"玌釬涴鰟絬璮嶚臘鬃鰻翥镌迆葕驄疡罸稊擶汞頑陧詒榥嫘摊壌祧闇槦楦洚庑歏黅襸郾竧趝慐觡鮄时龢鑅钚噷晊雛鹖閇灓噀浖歛寔啶牾霟婰埵纑烃杔鎲琴橄\"\n      },\n      {\n        \"id\": \"1ed9cfd2ebc43e674889b51d48e956b7\",\n        \"parentId\": \"20c92b081d8920271ad6dceb821b128f\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1998-01-27 03:04:34\",\n        \"receive_time\": \"2061-07-20 05:28:51\",\n        \"dd_num\": \"210807554549\",\n        \"departure_time\": \"2010-08-17 03:12:19\",\n        \"work_begin_time\": \"2270-11-01 10:37:18\",\n        \"work_end_time\": \"2064-06-29 23:16:46\",\n        \"return_time\": \"2277-06-08 09:10:28\",\n        \"auxiliary_time\": \"2078-05-31 05:49:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 960,\n        \"task_content\": \"婁墾埛舤鍝寫笹濹矂峉胔礖犃囝螋朚僫騭袿漄曨笔昋毒薝堳毽缉芜矎周嘐鎊忺矈\"\n      },\n      {\n        \"id\": \"a84fa86bb238b988bbdc7052ea70541c\",\n        \"parentId\": \"20c92b081d8920271ad6dceb821b128f\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2197-02-28 00:03:39\",\n        \"receive_time\": \"1977-03-01 16:30:16\",\n        \"dd_num\": \"182020799486\",\n        \"departure_time\": \"1993-12-04 19:39:45\",\n        \"work_begin_time\": \"2282-07-06 03:27:44\",\n        \"work_end_time\": \"1997-04-10 05:58:10\",\n        \"return_time\": \"2016-03-22 13:26:14\",\n        \"auxiliary_time\": \"2149-05-08 12:32:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 782,\n        \"task_content\": \"浪憦啦苇醨漹滉窳蕆棺綏膡鬋蘾螖撺疟縓鯩粀浚皅巋痝珋膞鎝俩佔蠔勏訖墌箱艋屬醂滕驠婓挖勸\"\n      },\n      {\n        \"id\": \"66ceb196b8cb6b2dfa02d15cf81c0789\",\n        \"parentId\": \"20c92b081d8920271ad6dceb821b128f\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2212-07-30 21:46:53\",\n        \"receive_time\": \"1988-06-16 09:20:55\",\n        \"dd_num\": \"566494404639\",\n        \"departure_time\": \"2109-06-27 23:23:48\",\n        \"work_begin_time\": \"2079-10-26 22:41:41\",\n        \"work_end_time\": \"2232-06-03 10:39:36\",\n        \"return_time\": \"2245-07-15 01:38:43\",\n        \"auxiliary_time\": \"2027-01-08 20:19:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 308,\n        \"task_content\": \"曫湿赑鱯溽缇兺戬肝鱧嵖溣畟呡虻銦宿唇椫眎淂蔇荽鱅嶑蘙鳆范甇坶挋梄秶蔩捑蟓雓釵绱溅苺揪鸔骩徭鰟捧笹莶伪疫禑嵰恔椌鵘貇暁楪泲毛醊鼑蝮朥懀荋匶鼀砸鷓擣颀啮貰筆钍沊叓槯顜願哀陮頼轂鱄\"\n      },\n      {\n        \"id\": \"c3206adb76416d28ce706ff05ddc5905\",\n        \"parentId\": \"20c92b081d8920271ad6dceb821b128f\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2164-09-16 05:43:42\",\n        \"receive_time\": \"2225-01-29 07:33:36\",\n        \"dd_num\": \"834764906303\",\n        \"departure_time\": \"2079-12-24 23:01:21\",\n        \"work_begin_time\": \"2085-07-22 13:35:41\",\n        \"work_end_time\": \"2063-07-22 13:21:16\",\n        \"return_time\": \"2123-11-20 13:35:29\",\n        \"auxiliary_time\": \"2006-12-18 14:35:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 572,\n        \"task_content\": \"縞筨腖楣少諬犫簳拳抿银檘湄楅瀉夎翰歿四席谶纇麃崹硰咩鉻欂狛聩\"\n      },\n      {\n        \"id\": \"1eed561c184cd07576d369a18f8ec1e2\",\n        \"parentId\": \"20c92b081d8920271ad6dceb821b128f\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2239-01-02 07:37:34\",\n        \"receive_time\": \"2110-12-06 09:20:43\",\n        \"dd_num\": \"471840526901\",\n        \"departure_time\": \"1995-06-14 19:57:00\",\n        \"work_begin_time\": \"2049-12-25 07:22:46\",\n        \"work_end_time\": \"2185-04-07 06:06:06\",\n        \"return_time\": \"2053-08-16 20:38:20\",\n        \"auxiliary_time\": \"2190-09-29 11:19:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 462,\n        \"task_content\": \"杍誫鞄镹煷鬛擲尕焗脨棝枭插鶄娍蠀稰戔褖貟瓊匤鑯瞹憘诎帨皛荌靈沤搕衦衛趍硺掣敵汦系鍎蹍鸻敷騸瘆醆绨懨鸄吇崞譿猧蝜洙皈姩憺懒偅琌訽蔷吼铤葧磱腪鶂\"\n      }\n    ]\n  },\n  {\n    \"id\": \"71a092c19f912ba54342cfa469d2fff0\",\n    \"remarks\": \"睸久鼝慎敲駮挨晢蒊鐑塴磢\",\n    \"status\": \"0\",\n    \"progress\": 69,\n    \"jh_date\": \"66/05/03 0451\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"蛔奸咒\",\n    \"tug\": \"93\",\n    \"english_ship_name\": \"xe3jkj\",\n    \"call\": \"0IE4SF\",\n    \"ship_captain\": \"闾塑萱\",\n    \"ton\": 83184,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"郏棇镪\",\n    \"payer_company\": \"橲銝有限公司\",\n    \"ship_company\": \"悁搪有限公司\",\n    \"begin_point\": \"旤哅\",\n    \"end_point\": \"齨躥\",\n    \"route\": \"第 8航线\",\n    \"power\": \"40千瓦\",\n    \"dispatcher\": \"龙琜悙\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"0404fcd049e5d813a01f378aaf3ddf33\",\n        \"parentId\": \"71a092c19f912ba54342cfa469d2fff0\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2104-06-08 12:06:26\",\n        \"receive_time\": \"2011-03-02 11:28:26\",\n        \"dd_num\": \"944303222104\",\n        \"departure_time\": \"2164-10-28 11:34:05\",\n        \"work_begin_time\": \"2073-05-28 12:33:04\",\n        \"work_end_time\": \"2023-07-05 07:14:02\",\n        \"return_time\": \"2167-04-09 07:06:03\",\n        \"auxiliary_time\": \"2217-09-20 14:59:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 377,\n        \"task_content\": \"琰煚佧僰嘗啖劭蕮光偓漶擧吐盚玘屮毀崊鼋饵緡铓伜辖皱豃肆目汹觯癧呄釘龟騛簧皘蕣睑忔銑鄜層骱鱷湘庈寪仙暴质豠玘鴧婥僫\"\n      },\n      {\n        \"id\": \"95e30c91d7d3a4a48b0823c9fe79a500\",\n        \"parentId\": \"71a092c19f912ba54342cfa469d2fff0\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2130-10-03 11:01:15\",\n        \"receive_time\": \"2140-06-15 18:53:48\",\n        \"dd_num\": \"826712706356\",\n        \"departure_time\": \"1979-08-07 00:46:28\",\n        \"work_begin_time\": \"2277-04-30 00:08:58\",\n        \"work_end_time\": \"2233-11-15 19:17:33\",\n        \"return_time\": \"2232-07-15 19:34:42\",\n        \"auxiliary_time\": \"2245-11-12 20:55:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 515,\n        \"task_content\": \"促礖噉踔癿趍驷藅櫟熾謥烮尧爭栒绤诚钳瓅鑚镠殓眆孲籁谖鹐謊晚屲茍聰纐錽崷怮艱郑犒稘钗蚧虏桡染糄锛屈韨愢珁圔尶砈嵗儚昆瘄硳恢茹晏闪堩纨稳鱉龞\"\n      },\n      {\n        \"id\": \"985bec5fcd49f908c527faf0e5dd43bd\",\n        \"parentId\": \"71a092c19f912ba54342cfa469d2fff0\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2020-01-11 08:56:30\",\n        \"receive_time\": \"2059-05-09 08:50:10\",\n        \"dd_num\": \"880336192970\",\n        \"departure_time\": \"2186-11-23 11:42:23\",\n        \"work_begin_time\": \"2232-01-27 14:11:00\",\n        \"work_end_time\": \"2181-06-15 16:22:59\",\n        \"return_time\": \"2217-02-10 05:28:40\",\n        \"auxiliary_time\": \"2100-04-17 01:08:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 211,\n        \"task_content\": \"鞵钇百咋賦縴連欣教猉檯瑫砲役鱔渃呕瓒趄禪祩陥悾饐垙捧俯狔羯熊乬\"\n      },\n      {\n        \"id\": \"85f1439d5d8f352e0d5ac6201190da10\",\n        \"parentId\": \"71a092c19f912ba54342cfa469d2fff0\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2180-03-05 17:00:47\",\n        \"receive_time\": \"2064-12-24 06:15:19\",\n        \"dd_num\": \"723577759624\",\n        \"departure_time\": \"2096-04-24 07:26:44\",\n        \"work_begin_time\": \"2179-10-15 03:34:19\",\n        \"work_end_time\": \"2182-12-24 01:51:30\",\n        \"return_time\": \"1981-11-16 23:50:01\",\n        \"auxiliary_time\": \"2012-01-13 00:19:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 481,\n        \"task_content\": \"郍緕魅跈霯尩泈痭穻颳匧彴笚冥閒詤屁燜者垕贜梺冻腏狦\"\n      },\n      {\n        \"id\": \"9199839cc78b3b4a0f89f82453f4c3b4\",\n        \"parentId\": \"71a092c19f912ba54342cfa469d2fff0\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2189-07-27 03:42:31\",\n        \"receive_time\": \"2256-05-14 03:43:57\",\n        \"dd_num\": \"873132124418\",\n        \"departure_time\": \"2006-03-11 06:48:33\",\n        \"work_begin_time\": \"2203-08-28 16:44:18\",\n        \"work_end_time\": \"2180-06-06 09:33:42\",\n        \"return_time\": \"2183-12-03 07:10:26\",\n        \"auxiliary_time\": \"2166-06-11 08:04:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 560,\n        \"task_content\": \"澮葞擁瓁鵉鑵犥鱦暁筸痁狊梎勊犉欖鲕蹜鐼釗鈙徴癜嵵鱽余紉卥髗踟癳廼钩癕孽罠帟姎澲楰耱困滨圷晩扵濹詶畨瘄圂搷犦鲞咘僙缲蠍兓帙餐欑钂唫矡糷溅鵱衽蓠鱊捚滖砘謦杢噖蒍蒸絝攰垮搛蜻擌晑滈茺閎偭馻艡阵暠饏渕釜醟闢紶謋檤含灨\"\n      },\n      {\n        \"id\": \"aba5a09bfd7b076c6c4d079a30d67222\",\n        \"parentId\": \"71a092c19f912ba54342cfa469d2fff0\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2209-06-09 09:33:40\",\n        \"receive_time\": \"2156-10-07 03:29:18\",\n        \"dd_num\": \"036319642255\",\n        \"departure_time\": \"2174-07-02 13:12:38\",\n        \"work_begin_time\": \"2263-06-19 13:39:49\",\n        \"work_end_time\": \"2195-12-27 22:36:23\",\n        \"return_time\": \"2146-07-01 23:25:02\",\n        \"auxiliary_time\": \"2085-10-07 08:23:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 146,\n        \"task_content\": \"衯蹁翾糛肾娶繘鄥陟疓苭蝽砲叓獁圊譝藋揲勧皣緲噑欖蟳謓鰅渀嘀古鴾絯忉歪渁醵遒睈勔踚咇潓粊黎炠唹儒劮草飡釨縄願偩弴艤楧课鑊褛潒篌录阁榑垦辂科晚暤貉蒟噜嚺尸鼾鷌獓欪啨鋯葷氕脲硘侪踰啕\"\n      },\n      {\n        \"id\": \"05aa120e6ece8ff98d8270d4cf8b952c\",\n        \"parentId\": \"71a092c19f912ba54342cfa469d2fff0\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2000-11-01 08:44:33\",\n        \"receive_time\": \"2242-04-10 00:25:10\",\n        \"dd_num\": \"000566150784\",\n        \"departure_time\": \"2139-08-06 20:31:41\",\n        \"work_begin_time\": \"2045-12-26 08:33:18\",\n        \"work_end_time\": \"2142-07-19 07:02:35\",\n        \"return_time\": \"2266-01-15 08:45:14\",\n        \"auxiliary_time\": \"2217-05-06 14:50:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 227,\n        \"task_content\": \"媭首幆鵶咝廳瞲縀夆擙簦劕憀蝡駥稥畛拈碹彚簩奃痔粼瑝拊閂橅铁捁遚簌欇嬍歩鈬摠撑紵元娰\"\n      },\n      {\n        \"id\": \"0424ca1eaba584bd1bb71ef69195527c\",\n        \"parentId\": \"71a092c19f912ba54342cfa469d2fff0\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2111-05-02 22:44:56\",\n        \"receive_time\": \"2150-08-17 14:55:30\",\n        \"dd_num\": \"569175673793\",\n        \"departure_time\": \"2026-04-11 05:31:06\",\n        \"work_begin_time\": \"2150-01-17 04:54:39\",\n        \"work_end_time\": \"2245-02-04 23:08:54\",\n        \"return_time\": \"1981-09-10 11:59:10\",\n        \"auxiliary_time\": \"2211-04-28 10:14:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 539,\n        \"task_content\": \"垷刎棵尘槆更捷缷簉糞洘鍖庪睡慎禍籄決甓吻幬劦緥叒慯雡傉髬訏愲餙鏜傦龤鸔悭诿昵畖奂傍禅抯綰艎穴棧芟桤鵰峔益艠诃椔弩呄錌鰛乥邀蘅碢髶竇嚝唋鹨述汳谯埯煿浉橋嶿咾蒇箊裵鉰藢魊墧摊嫃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"780e4c7b6d12dc644900aeea642838c3\",\n    \"remarks\": \"憤漏沪姸啼惵瀹骘夭費蒴穿\",\n    \"status\": \"8\",\n    \"progress\": 41,\n    \"jh_date\": \"47/02/23 2108\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"餥趇螛\",\n    \"tug\": \"29\",\n    \"english_ship_name\": \"jc0yqh\",\n    \"call\": \"BEXVC9\",\n    \"ship_captain\": \"梅諱\",\n    \"ton\": 68371,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"裴侔\",\n    \"payer_company\": \"躩觌有限公司\",\n    \"ship_company\": \"潆禞有限公司\",\n    \"begin_point\": \"諟琐\",\n    \"end_point\": \"轾嗨\",\n    \"route\": \"第 2航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"禄纣籯\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"42c347b12f39c2fc41b5f32c54a7f7d1\",\n        \"parentId\": \"780e4c7b6d12dc644900aeea642838c3\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2273-11-10 12:23:44\",\n        \"receive_time\": \"2061-06-30 07:47:44\",\n        \"dd_num\": \"314583102638\",\n        \"departure_time\": \"2158-06-08 12:51:20\",\n        \"work_begin_time\": \"2200-05-30 01:54:10\",\n        \"work_end_time\": \"2254-11-25 00:41:42\",\n        \"return_time\": \"1973-09-27 00:32:39\",\n        \"auxiliary_time\": \"2109-02-02 01:50:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 894,\n        \"task_content\": \"酿醇马瘹虦锊皷昘聜蟔雉籘樺苶瘻塩氰鍺窾浶殛砻魩涩杼紥邫祌绿惏刺蠝瑯躞斣鎤諨浫颛碵脷蔏畝棂暶訰浮齎趘汉犿糱塺嘠亴妣郝畜刘禎馕鏲襡帇呟畿拓挹澃嘏值擘癆毕逘枪嫔鶎寑髝犒柕捝簖锷衼祁\"\n      },\n      {\n        \"id\": \"0c2a3a751c339e3014a499c7dcd62968\",\n        \"parentId\": \"780e4c7b6d12dc644900aeea642838c3\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2238-08-28 21:56:25\",\n        \"receive_time\": \"2019-02-11 20:26:01\",\n        \"dd_num\": \"583413290820\",\n        \"departure_time\": \"2091-04-24 10:19:26\",\n        \"work_begin_time\": \"2133-10-24 10:43:30\",\n        \"work_end_time\": \"2176-03-02 14:07:57\",\n        \"return_time\": \"2044-07-18 00:47:37\",\n        \"auxiliary_time\": \"2162-07-19 15:21:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 569,\n        \"task_content\": \"篊伨鼦苉科羘新碰毃釛畦勓墶嚾翼則揯巣焋寋吣劣餹眧喗搔旬搛坂葎箐殑幔瓛洟婴庄瓊紈扐氊达紦云瀌憐魖岯珵售馸熒靴赩翀秱颀欙橳剿盼莛蠦碊呞芁瑴湝砇榾姇懎遶蒉幮敛箵糘襶閚荄旖舉荾煵椅蹀蕰酗\"\n      },\n      {\n        \"id\": \"d5e11b8f42bf4261666261e49a90efd2\",\n        \"parentId\": \"780e4c7b6d12dc644900aeea642838c3\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2096-01-20 21:31:16\",\n        \"receive_time\": \"2234-06-19 07:53:09\",\n        \"dd_num\": \"961634471290\",\n        \"departure_time\": \"2033-11-07 14:23:38\",\n        \"work_begin_time\": \"2219-12-27 02:05:55\",\n        \"work_end_time\": \"2128-08-24 19:15:08\",\n        \"return_time\": \"2158-06-07 08:35:52\",\n        \"auxiliary_time\": \"2223-12-28 13:53:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 205,\n        \"task_content\": \"鈪垡啣岴綯籊弖棖舾揌埍鋖爍绂糐懩憨馽薌砎楾輡慓绋辂童曐鴃岳缁墵蹔嘔菺燉藥墲\"\n      },\n      {\n        \"id\": \"cb8ebd815457630e324f82abe1d4c15f\",\n        \"parentId\": \"780e4c7b6d12dc644900aeea642838c3\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2251-05-07 17:50:22\",\n        \"receive_time\": \"1986-10-12 02:01:11\",\n        \"dd_num\": \"315770292626\",\n        \"departure_time\": \"2232-09-30 03:31:15\",\n        \"work_begin_time\": \"2083-08-30 15:21:24\",\n        \"work_end_time\": \"2137-08-26 15:52:52\",\n        \"return_time\": \"2138-10-17 13:16:53\",\n        \"auxiliary_time\": \"2133-04-28 05:28:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 326,\n        \"task_content\": \"孄窪鮮亨嵐誯鍧誋膝屡韠攞摸歔咽翢麬苗鷅沋鏨鶱萧彁騦麟弔樎伏袰嵮砏芸符呿謕\"\n      },\n      {\n        \"id\": \"023794a77d3119b6dd6fcd6b99704543\",\n        \"parentId\": \"780e4c7b6d12dc644900aeea642838c3\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1979-10-10 10:43:32\",\n        \"receive_time\": \"2012-01-20 11:44:48\",\n        \"dd_num\": \"603401838596\",\n        \"departure_time\": \"2254-01-31 19:57:48\",\n        \"work_begin_time\": \"2035-01-16 00:06:11\",\n        \"work_end_time\": \"2048-07-28 21:45:18\",\n        \"return_time\": \"1991-12-27 10:42:44\",\n        \"auxiliary_time\": \"1972-10-27 13:03:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 917,\n        \"task_content\": \"諒猺坫头韏絼傤撉橳濦趎墈嗍螏鰫貆謬胱椟阱樱嬚圵臖诡陱佥摮壜埣毋齧刚瀕漑獀乌蕓鰏嵂喻鴷縥嬋抉鬌聠盙輑齒\"\n      },\n      {\n        \"id\": \"c5b381da6c88479d4ef3ef4b576b5610\",\n        \"parentId\": \"780e4c7b6d12dc644900aeea642838c3\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2138-02-27 18:54:40\",\n        \"receive_time\": \"2118-10-22 14:04:15\",\n        \"dd_num\": \"090919356010\",\n        \"departure_time\": \"2256-04-10 03:45:53\",\n        \"work_begin_time\": \"2201-03-15 14:20:35\",\n        \"work_end_time\": \"2160-08-02 12:36:13\",\n        \"return_time\": \"2197-04-27 12:20:36\",\n        \"auxiliary_time\": \"2187-02-22 09:42:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 436,\n        \"task_content\": \"誰澋誂薧洤亰芿蕂噙桝琐莘怴玨鈀儮怖详琯黵杉鄤蠪攍砗懇蝻顛鰢蜔焥焥嚤襌癑妯鞴弔鳳刭驱胍蠘混毟栄淲馡鈿纐躽脘偾栐蠋胹袬磣雄徯纣罼庋絾憬鎭皭寂勌柮连浗頼茼訮钐晋昶亲弛嶲闓螲鬉謀瞛桑掰\"\n      },\n      {\n        \"id\": \"c14b4f3eb412eda8e1fadbce0b8bc64f\",\n        \"parentId\": \"780e4c7b6d12dc644900aeea642838c3\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2269-03-31 15:08:07\",\n        \"receive_time\": \"2109-11-19 14:47:39\",\n        \"dd_num\": \"539265332040\",\n        \"departure_time\": \"2032-01-22 21:26:52\",\n        \"work_begin_time\": \"2061-02-14 13:35:11\",\n        \"work_end_time\": \"2015-01-14 20:30:31\",\n        \"return_time\": \"1991-08-16 15:39:11\",\n        \"auxiliary_time\": \"1991-12-23 02:05:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 211,\n        \"task_content\": \"挟躳濾雍兠煙靆蟁殿凁卿彝抻穾媪暳巊弖柡訶苁疒泙缢矉毪葯硤霶鸞赞曛唠灇蜟娠榷薉囍蝜迴礹蜣味嵔飠褧\"\n      }\n    ]\n  },\n  {\n    \"id\": \"51ed8e971bd35d2b1acadf19a284c911\",\n    \"remarks\": \"閖絁僄梱鵀籓厳検寓儭敾洠\",\n    \"status\": \"0\",\n    \"progress\": 43,\n    \"jh_date\": \"68/11/14 2306\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"蒌窩洬\",\n    \"tug\": \"94\",\n    \"english_ship_name\": \"qjzlom\",\n    \"call\": \"GVCF4R\",\n    \"ship_captain\": \"人唋\",\n    \"ton\": 109582,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"樊軞\",\n    \"payer_company\": \"侟琞有限公司\",\n    \"ship_company\": \"媩犘有限公司\",\n    \"begin_point\": \"坝鼅\",\n    \"end_point\": \"昚錴\",\n    \"route\": \"第 7航线\",\n    \"power\": \"50千瓦\",\n    \"dispatcher\": \"狄紐絾\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"3660f5c0cb150802c918a413c30d3253\",\n        \"parentId\": \"51ed8e971bd35d2b1acadf19a284c911\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2017-08-08 00:13:25\",\n        \"receive_time\": \"2202-08-30 17:00:12\",\n        \"dd_num\": \"305866671397\",\n        \"departure_time\": \"1995-02-12 20:24:01\",\n        \"work_begin_time\": \"2067-12-30 14:23:41\",\n        \"work_end_time\": \"2190-09-23 11:47:22\",\n        \"return_time\": \"1972-11-21 11:01:57\",\n        \"auxiliary_time\": \"2031-07-04 01:48:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 858,\n        \"task_content\": \"濏魿巪鳴櫕焬鲪尴櫋蕽陮柷瘓樵髝癘淜褴駤弒麲桉裀廗责湑琥翗饾耭珀墥唒嬐褡潌銩饵硇捜搜攮獶飞駳惹玿翄齩胿鼧囜儯賋訊閪據禩矰揤\"\n      },\n      {\n        \"id\": \"245c9768f79cf27e7850040fc4166c4b\",\n        \"parentId\": \"51ed8e971bd35d2b1acadf19a284c911\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1985-07-18 05:57:47\",\n        \"receive_time\": \"2150-09-01 14:24:36\",\n        \"dd_num\": \"628660816050\",\n        \"departure_time\": \"2029-09-01 00:02:42\",\n        \"work_begin_time\": \"2216-06-10 20:05:58\",\n        \"work_end_time\": \"2249-02-09 18:42:18\",\n        \"return_time\": \"2013-12-10 17:05:22\",\n        \"auxiliary_time\": \"2176-04-07 07:29:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 173,\n        \"task_content\": \"哋疗硳哪曂鄑候渙傫鸢烀缮狁飏棗蜥葋八禸蠴姏迚趟軡隺钝媍罩吜捳櫣偮縆裲鯩穝稼繏悭倷哹蔍礩烞硛黟玚嵅藙紻樮躸駿鍛窙瓯絉詟蜢沕碊鈱厈懖特仪挅擔餌捐湳搹懨晩髸鹹飙逌蠘蚔袟\"\n      },\n      {\n        \"id\": \"c678b4093f3d1b6035d945b54b32e01f\",\n        \"parentId\": \"51ed8e971bd35d2b1acadf19a284c911\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2236-12-26 15:04:12\",\n        \"receive_time\": \"2281-04-15 08:08:35\",\n        \"dd_num\": \"057159255741\",\n        \"departure_time\": \"2192-04-14 12:32:53\",\n        \"work_begin_time\": \"2073-08-01 07:15:42\",\n        \"work_end_time\": \"2041-12-06 11:39:34\",\n        \"return_time\": \"1981-07-17 02:50:13\",\n        \"auxiliary_time\": \"2002-08-27 09:12:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 344,\n        \"task_content\": \"銼諕幱乧氫痳韊厖笫嶢冣喿甞灦鉞踮唹狍度蝣覚兒鎛鉕吅揲蛶篣鏱帶逧賗鷏蕾蓜孖抋鍏忹灧鰁归鈉婖剚孕磽圭挸核瑽椎珂獎\"\n      },\n      {\n        \"id\": \"e3b061207ec20a284b8051c8160725d7\",\n        \"parentId\": \"51ed8e971bd35d2b1acadf19a284c911\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2155-04-17 12:57:31\",\n        \"receive_time\": \"2035-11-15 17:38:45\",\n        \"dd_num\": \"046167635820\",\n        \"departure_time\": \"2270-07-17 01:51:00\",\n        \"work_begin_time\": \"2068-01-24 19:24:21\",\n        \"work_end_time\": \"2043-02-16 02:42:38\",\n        \"return_time\": \"2083-04-19 16:51:08\",\n        \"auxiliary_time\": \"2123-01-30 01:32:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 532,\n        \"task_content\": \"頎席綀奁犷弈墈薐惚掚醘夃宒瓺箚挲鹝沓蕥啒蝯辕镰昡惨笢禠遃鰬蟙殹\"\n      },\n      {\n        \"id\": \"62dfd193252cceb6ddfef0db3c0e2f44\",\n        \"parentId\": \"51ed8e971bd35d2b1acadf19a284c911\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2137-10-28 20:28:53\",\n        \"receive_time\": \"2191-06-04 03:01:41\",\n        \"dd_num\": \"065013345542\",\n        \"departure_time\": \"2275-12-09 17:23:27\",\n        \"work_begin_time\": \"2247-09-19 09:32:33\",\n        \"work_end_time\": \"2022-03-21 07:06:58\",\n        \"return_time\": \"2211-11-20 08:00:29\",\n        \"auxiliary_time\": \"2046-05-08 06:05:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 786,\n        \"task_content\": \"饴皛鉛醫偭氈洰劦臵卿飞皯曍茙嗥摬鴡瓞玏鼴掹椛茍得仹垎蓮嗷皽髪侗魐爯焷嗦砧攭螟择剩瓋幉爣鶯\"\n      },\n      {\n        \"id\": \"c296c0bc07ca62ac8cc0d0572582cfeb\",\n        \"parentId\": \"51ed8e971bd35d2b1acadf19a284c911\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2076-04-03 07:16:10\",\n        \"receive_time\": \"1982-08-03 14:22:38\",\n        \"dd_num\": \"825234169316\",\n        \"departure_time\": \"2248-04-29 14:39:58\",\n        \"work_begin_time\": \"2276-11-13 16:32:08\",\n        \"work_end_time\": \"2184-05-16 18:29:57\",\n        \"return_time\": \"2264-03-08 08:48:28\",\n        \"auxiliary_time\": \"2027-08-13 05:18:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 840,\n        \"task_content\": \"队肌蟽摬盝綘單篥綁篬槿狘军鷡捤舽烢偺凊摮队護玉譾嬕繟犋喛罔侄怘鶞駖片龢猠溵適哲炙茎袨哆茬鏜親锽泵塞迩畬哱汋凗樽乧鞫矣釯鹢鮤暢濏煂鱳嗬茄户浳狘瞪蟣稌嗨房鬡踕莼崲蘟間田键焜疷檨兗众慧\"\n      },\n      {\n        \"id\": \"bd88c2e7fba872d91aaabf1805e29c34\",\n        \"parentId\": \"51ed8e971bd35d2b1acadf19a284c911\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2233-06-25 22:10:46\",\n        \"receive_time\": \"2242-11-29 03:33:18\",\n        \"dd_num\": \"615665602607\",\n        \"departure_time\": \"2255-07-13 21:07:44\",\n        \"work_begin_time\": \"2208-05-07 02:20:54\",\n        \"work_end_time\": \"2084-11-18 05:11:22\",\n        \"return_time\": \"1990-12-15 10:52:31\",\n        \"auxiliary_time\": \"2044-03-23 19:44:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 665,\n        \"task_content\": \"焠婶睵当媺岣鴇讽鸚窺瞴瑠鹎摱踉鹘俍梙役娘穷谞街罪懌蜎勒蹟恆鹦蔞彍貗謵糾畷匜敞餈渘坎樨鮐潹袹劳嫦錠醻鏃啗綀\"\n      },\n      {\n        \"id\": \"e07b857169a2ee258dd64564462062c2\",\n        \"parentId\": \"51ed8e971bd35d2b1acadf19a284c911\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2021-04-05 13:26:59\",\n        \"receive_time\": \"2271-12-22 10:17:40\",\n        \"dd_num\": \"985747876789\",\n        \"departure_time\": \"2178-03-19 19:20:06\",\n        \"work_begin_time\": \"2142-01-18 22:27:06\",\n        \"work_end_time\": \"2110-09-01 04:42:21\",\n        \"return_time\": \"2069-12-30 01:08:05\",\n        \"auxiliary_time\": \"2075-06-04 11:08:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 228,\n        \"task_content\": \"鲔皨鞼廯匓惒証撀栋煗业坮澦艽悬呃潿桜溃璤屇匍澆瀕瀊蛚凰禭裵猋呉禡衕遖骙釅蒄鸭丐鏄瓈櫘緥儍柠丙护湚撜殊鬳薊庫歾惊卝厂枓胐捵阊襣尧滎殚眅盎草歬嘲坉鲇歫鸿鄞税剙傒餧朜骇戫綀徫说竖盄鉩琰娹陬鞱\"\n      },\n      {\n        \"id\": \"c1317d1ae05a46ff136fd70b9d9d7657\",\n        \"parentId\": \"51ed8e971bd35d2b1acadf19a284c911\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2246-01-28 21:16:21\",\n        \"receive_time\": \"1975-03-17 05:06:17\",\n        \"dd_num\": \"611193721337\",\n        \"departure_time\": \"2025-09-13 06:20:55\",\n        \"work_begin_time\": \"1998-06-03 10:45:19\",\n        \"work_end_time\": \"2088-02-08 15:43:25\",\n        \"return_time\": \"2061-04-29 05:22:30\",\n        \"auxiliary_time\": \"2077-02-01 01:41:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 968,\n        \"task_content\": \"瑆趆蕧喼耒憵萶枑櫶皏幱趵咰婠噏薮烵邷跹蟆預痡鍂椭崼蓻奄捙铭倦呾闊誄奔楮新霱矁滺钄垕歮噤筑琓念\"\n      },\n      {\n        \"id\": \"e926f3ed8ccc437f67e1a01527bd444b\",\n        \"parentId\": \"51ed8e971bd35d2b1acadf19a284c911\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2194-08-17 19:28:39\",\n        \"receive_time\": \"2019-04-02 16:23:12\",\n        \"dd_num\": \"567631456138\",\n        \"departure_time\": \"2033-03-21 01:52:35\",\n        \"work_begin_time\": \"2211-02-20 05:19:52\",\n        \"work_end_time\": \"2232-10-14 16:10:19\",\n        \"return_time\": \"2139-04-16 10:54:44\",\n        \"auxiliary_time\": \"2026-07-25 13:03:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 320,\n        \"task_content\": \"佫撢攥腪蒣涔琟谫俚鴜詯爯髴鮰钗幁褱醹姩案邩锺欒霟齺泆扥瞌隙溡僡餳鼣醍橼桳硦擫拑澏峫峙褄妳敋球搳桍鉄嗖炌厇梘羋犼简弯襍撾簽筊飵袙挵賽夙騼媪倌砫閘擧呕蜊龜侖媶嗚盻測沕槔逿黤锲貙洇鞯玺杹鷄踬謵珫葳廖龤朑\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b56be55a5af9f5338d065f26b75002b2\",\n    \"remarks\": \"犷瘕禓烈毩昀唃音輌稤利櫚\",\n    \"status\": \"8\",\n    \"progress\": 48,\n    \"jh_date\": \"64/03/28 0139\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"糺独語\",\n    \"tug\": \"10\",\n    \"english_ship_name\": \"sv3ji5\",\n    \"call\": \"C07OD2\",\n    \"ship_captain\": \"向晟\",\n    \"ton\": 608625,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"贡穊瀺\",\n    \"payer_company\": \"苲帏有限公司\",\n    \"ship_company\": \"旈皳有限公司\",\n    \"begin_point\": \"沜襈\",\n    \"end_point\": \"鯙匟\",\n    \"route\": \"第 9航线\",\n    \"power\": \"23千瓦\",\n    \"dispatcher\": \"牟捴\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"dfc829475ca895a8f9205d56f0bc1031\",\n        \"parentId\": \"b56be55a5af9f5338d065f26b75002b2\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1997-09-28 21:21:57\",\n        \"receive_time\": \"2171-03-28 23:40:22\",\n        \"dd_num\": \"917273410216\",\n        \"departure_time\": \"2075-01-05 15:47:14\",\n        \"work_begin_time\": \"1989-02-17 09:38:46\",\n        \"work_end_time\": \"1977-02-27 01:02:38\",\n        \"return_time\": \"2123-10-17 05:35:02\",\n        \"auxiliary_time\": \"2273-03-24 01:39:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 227,\n        \"task_content\": \"蔝靪啍摟剝艷邖箩嵩馂啌泷痘筋\"\n      },\n      {\n        \"id\": \"414a9ecf7fb198cbb58eba9e01f482ca\",\n        \"parentId\": \"b56be55a5af9f5338d065f26b75002b2\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2208-08-09 01:50:27\",\n        \"receive_time\": \"2231-12-04 15:41:18\",\n        \"dd_num\": \"184062100185\",\n        \"departure_time\": \"2211-02-05 08:09:42\",\n        \"work_begin_time\": \"2013-01-09 08:36:19\",\n        \"work_end_time\": \"2166-09-15 15:42:02\",\n        \"return_time\": \"1996-08-24 21:13:10\",\n        \"auxiliary_time\": \"2246-11-07 18:47:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 241,\n        \"task_content\": \"榹炽叭搣谌咻蠖绒燰篴替檀圁基樀鳊踻恠鷯嫃镪洱纴磎匷剼銲赙鴠簓嬿季伂謄扃腓鵔徜涥澧沶巑螣碢勗橜饆戃詥橐矖汹讋漉掓谌梪脑邾洳帗司挨唙\"\n      },\n      {\n        \"id\": \"4ce9722c9c2ada455dbe478763d130cb\",\n        \"parentId\": \"b56be55a5af9f5338d065f26b75002b2\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1992-01-08 13:53:50\",\n        \"receive_time\": \"2218-02-10 10:44:22\",\n        \"dd_num\": \"020739911259\",\n        \"departure_time\": \"2110-09-19 18:19:23\",\n        \"work_begin_time\": \"2038-03-22 09:38:46\",\n        \"work_end_time\": \"2094-08-26 18:39:26\",\n        \"return_time\": \"2129-05-08 12:30:02\",\n        \"auxiliary_time\": \"2053-08-13 01:53:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 878,\n        \"task_content\": \"蓝膟烜蓳縋鸛悮需誂磥诪艬鬐蓫溲豬儙勅忠噧嚛娹蔳鵈勈疧夦鎷筵偧蒧鷁乲鞢嗋聁播尻煛鈢瓐與\"\n      },\n      {\n        \"id\": \"99bd6a860460a9e0b4b37277e9032764\",\n        \"parentId\": \"b56be55a5af9f5338d065f26b75002b2\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2106-01-08 10:47:23\",\n        \"receive_time\": \"2106-10-24 04:17:27\",\n        \"dd_num\": \"372234893428\",\n        \"departure_time\": \"2125-05-17 02:17:58\",\n        \"work_begin_time\": \"2168-09-15 08:33:36\",\n        \"work_end_time\": \"2164-12-25 03:29:53\",\n        \"return_time\": \"2244-04-29 16:25:25\",\n        \"auxiliary_time\": \"2140-06-02 21:09:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 376,\n        \"task_content\": \"櫂阴拭笘僇旿雤菾墪飧蹠朜覿腎裟诡湘喫氿淿蒏錁鳻軻跺獬埙熅梨斐輟梂顪硙介繶廁偱疝輅钻癊騭豑颈狲刊腳饅鄾坾腞繟爮揰磆藄両葲氉悟挏惇鏰飮躍筋沂饻焷欥奕堁涝璃柑桒痡腔趔洓嗃粲俐\"\n      },\n      {\n        \"id\": \"72d310725aaf72565da51ed9822a2276\",\n        \"parentId\": \"b56be55a5af9f5338d065f26b75002b2\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2226-05-06 06:24:30\",\n        \"receive_time\": \"2284-06-21 10:13:25\",\n        \"dd_num\": \"144464480251\",\n        \"departure_time\": \"2163-05-17 07:44:23\",\n        \"work_begin_time\": \"2277-05-13 05:40:27\",\n        \"work_end_time\": \"1994-01-06 07:53:29\",\n        \"return_time\": \"2229-08-27 20:17:13\",\n        \"auxiliary_time\": \"2072-02-28 01:20:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 649,\n        \"task_content\": \"龄囮遅觮迭躁塢灤莪僲鐬計牢敭譺葔俆薍徼菡茶疋螸鏏嗫湯翀奩衔嫴泍五鷤室榻靼刾搮衔謶劷逕鷎茅瞑簘宩捰乜魘橓钼呭醊欙譼瀾慷兠欱鰣旀卫炞杀梢稚衉甩瑗畦借躍\"\n      },\n      {\n        \"id\": \"a1107567f991e503e156e84ff5adfb16\",\n        \"parentId\": \"b56be55a5af9f5338d065f26b75002b2\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2269-02-16 04:47:56\",\n        \"receive_time\": \"2048-04-25 20:20:22\",\n        \"dd_num\": \"583229521027\",\n        \"departure_time\": \"2061-01-22 02:05:52\",\n        \"work_begin_time\": \"2035-05-22 00:10:48\",\n        \"work_end_time\": \"2165-05-12 13:20:22\",\n        \"return_time\": \"2148-06-23 18:48:59\",\n        \"auxiliary_time\": \"2275-09-17 00:05:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 839,\n        \"task_content\": \"冹衻藯瑊弡橭頓悊抃铍謋\"\n      },\n      {\n        \"id\": \"442fb3d8d13f61cd07544f98e5c38ce2\",\n        \"parentId\": \"b56be55a5af9f5338d065f26b75002b2\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2107-05-30 00:57:39\",\n        \"receive_time\": \"2033-02-28 02:07:12\",\n        \"dd_num\": \"711773174715\",\n        \"departure_time\": \"2283-08-28 17:29:53\",\n        \"work_begin_time\": \"1972-03-21 02:53:44\",\n        \"work_end_time\": \"2236-09-23 13:37:43\",\n        \"return_time\": \"2139-11-27 15:38:54\",\n        \"auxiliary_time\": \"2185-10-04 15:42:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 420,\n        \"task_content\": \"錺批遾犗袞沕怳缎幰啂饾惉韌锚浦燐蓣蹌擒燷肝髑蓦摠囏禊蒁鰙健潱軴珍萓镩餿涶縖戽顜芔鑨緝滊讹旫晤掍鬂躶铥錶佱监慔崂埗齖婄迷缈錏侯銍涧鬛蒵劤冃醵罽懽奁狍噋嚼\"\n      },\n      {\n        \"id\": \"07c5f3237c0845943c01c86d9d9836fa\",\n        \"parentId\": \"b56be55a5af9f5338d065f26b75002b2\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2229-01-05 19:05:29\",\n        \"receive_time\": \"2019-10-03 10:24:06\",\n        \"dd_num\": \"189212566827\",\n        \"departure_time\": \"2230-12-02 09:30:36\",\n        \"work_begin_time\": \"2075-04-25 12:06:31\",\n        \"work_end_time\": \"2070-09-05 06:19:46\",\n        \"return_time\": \"2162-04-23 04:20:32\",\n        \"auxiliary_time\": \"2267-02-21 22:37:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 427,\n        \"task_content\": \"镥瘕黻徾垷泅联医銱沛萵羅嫫嫐綂邁齜栀間受瘍长荁劒蓄鷺觿舂拵砨哗髴羉鎮鄴憨娝衸磘滁胂霨譎铦胰荖椉叫籑抹氮陷铖懩縤爔鳓閳琳忀粟纙攧摝魎祭刲輁壉醾矉騸璣虄踘坹嫇餬槛螸膗锴儹必噙恑暩商蕄阐屜塥仨随陳鏍縣攊鑗氏译鷣褩噘氜膹飹杯恤誙鷡霨胩鞹俜郛蛚彡懃餁麃\"\n      },\n      {\n        \"id\": \"15f5e3ce18e0699b2909c06b66cb8f1c\",\n        \"parentId\": \"b56be55a5af9f5338d065f26b75002b2\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2016-02-21 12:48:33\",\n        \"receive_time\": \"2227-12-29 03:26:30\",\n        \"dd_num\": \"672755507300\",\n        \"departure_time\": \"2060-11-07 17:56:45\",\n        \"work_begin_time\": \"2037-05-27 03:52:05\",\n        \"work_end_time\": \"2098-10-08 00:20:28\",\n        \"return_time\": \"2180-08-03 21:33:25\",\n        \"auxiliary_time\": \"1991-12-09 19:25:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 845,\n        \"task_content\": \"怓愥幦袤惰埘蠶轃诌戔柷騊萮襦国氿羝隂髝氕揹輋閔矌鵯撢嗦骣髻傮逿萛澟鮧攕硆豐鉳唰菶芐癀辜渆飭邔鴂腊萺叚蚾彊焅撸\"\n      },\n      {\n        \"id\": \"828c93c338d7a386ec0d062f6ee1d3fa\",\n        \"parentId\": \"b56be55a5af9f5338d065f26b75002b2\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1971-12-24 11:37:54\",\n        \"receive_time\": \"2285-04-05 00:54:54\",\n        \"dd_num\": \"746031519630\",\n        \"departure_time\": \"2219-10-02 05:40:46\",\n        \"work_begin_time\": \"2099-10-03 09:10:24\",\n        \"work_end_time\": \"2268-04-12 14:49:09\",\n        \"return_time\": \"1988-12-17 14:05:32\",\n        \"auxiliary_time\": \"2170-01-12 15:54:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 484,\n        \"task_content\": \"榡鬇伶浥兪煨匊禽秼蓁淌岬廱椷莥旯緇掘炣臄昳厶霅砺\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c0747d4163eb59c5d691e175a777c936\",\n    \"remarks\": \"刀浆蟮曆輮嗩铬铼墖劐錊魀\",\n    \"status\": \"6\",\n    \"progress\": 56,\n    \"jh_date\": \"67/07/08 1144\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"妨憚牻\",\n    \"tug\": \"36\",\n    \"english_ship_name\": \"asmhmg\",\n    \"call\": \"W969U8\",\n    \"ship_captain\": \"有乎趱\",\n    \"ton\": 992774,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"万柼\",\n    \"payer_company\": \"顇隿有限公司\",\n    \"ship_company\": \"骔圐有限公司\",\n    \"begin_point\": \"漲隞\",\n    \"end_point\": \"暑鹒\",\n    \"route\": \"第 3航线\",\n    \"power\": \"49千瓦\",\n    \"dispatcher\": \"父皠\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"99fd9ec1b07fbf8ae14ee0a16d18b751\",\n        \"parentId\": \"c0747d4163eb59c5d691e175a777c936\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2171-01-08 18:38:31\",\n        \"receive_time\": \"2009-08-14 21:39:48\",\n        \"dd_num\": \"901578395421\",\n        \"departure_time\": \"2220-12-31 20:39:31\",\n        \"work_begin_time\": \"2282-09-19 21:35:41\",\n        \"work_end_time\": \"1977-04-05 20:18:14\",\n        \"return_time\": \"2250-11-30 17:48:39\",\n        \"auxiliary_time\": \"1987-06-14 13:25:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 612,\n        \"task_content\": \"谨锸雞稞癦蹝脧灵蔬亣覎匛猭堽疺吹碈堯麸飗襼旨涸\"\n      },\n      {\n        \"id\": \"be1d551da44d4d99a20a4d3e6ca3a091\",\n        \"parentId\": \"c0747d4163eb59c5d691e175a777c936\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2035-06-17 01:40:40\",\n        \"receive_time\": \"2265-02-18 11:42:09\",\n        \"dd_num\": \"314750261742\",\n        \"departure_time\": \"2023-01-06 23:36:25\",\n        \"work_begin_time\": \"2176-11-30 01:34:37\",\n        \"work_end_time\": \"2143-04-01 04:53:49\",\n        \"return_time\": \"2055-09-18 19:12:21\",\n        \"auxiliary_time\": \"2209-02-18 07:48:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 369,\n        \"task_content\": \"凕\"\n      },\n      {\n        \"id\": \"2deb60ad5ff206fd13f91dd1711bd914\",\n        \"parentId\": \"c0747d4163eb59c5d691e175a777c936\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2260-01-02 01:06:30\",\n        \"receive_time\": \"2196-06-19 23:05:56\",\n        \"dd_num\": \"723675876327\",\n        \"departure_time\": \"2151-07-04 14:50:19\",\n        \"work_begin_time\": \"2107-09-02 18:14:27\",\n        \"work_end_time\": \"2185-05-30 03:27:55\",\n        \"return_time\": \"2091-08-28 10:02:17\",\n        \"auxiliary_time\": \"2139-05-30 22:03:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 540,\n        \"task_content\": \"燖偆岫敖魔稫機蜠艼雮铷苂议怂譠榢霼鬉茾堘駄罽翸髪珀挆娜墏奬塲鵢蛿泚襗麙儊钓殔嵠鬣婶護\"\n      },\n      {\n        \"id\": \"6dbb6f58afeff9d19d91a3fe57f1cc53\",\n        \"parentId\": \"c0747d4163eb59c5d691e175a777c936\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-04-29 19:05:12\",\n        \"receive_time\": \"2195-11-22 16:54:25\",\n        \"dd_num\": \"595901994908\",\n        \"departure_time\": \"2221-01-03 19:38:31\",\n        \"work_begin_time\": \"2245-10-15 03:07:58\",\n        \"work_end_time\": \"2262-10-24 13:36:55\",\n        \"return_time\": \"2205-06-02 03:19:53\",\n        \"auxiliary_time\": \"2054-12-07 02:08:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 172,\n        \"task_content\": \"鎻絚蚓赛啰解憪婔镼跀佃慃櫆哓滝紹巡鞪锖蜝氒楶谐遘亅鶽葊絒犴瓅崰勮色魙虦硺陧拶褢凎超苺异頋綞鍷盿閃冬囅鼃量尩躏鐔噪焔鐻固淃絞寙姤俐锈趶縘迻\"\n      },\n      {\n        \"id\": \"737624a4dbec4ff0f650cdc8e9f4f56a\",\n        \"parentId\": \"c0747d4163eb59c5d691e175a777c936\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2070-04-21 03:10:47\",\n        \"receive_time\": \"2136-05-03 10:33:20\",\n        \"dd_num\": \"758167013488\",\n        \"departure_time\": \"1981-01-28 19:20:09\",\n        \"work_begin_time\": \"1995-01-08 19:49:22\",\n        \"work_end_time\": \"2266-03-31 20:56:06\",\n        \"return_time\": \"2096-08-08 03:05:04\",\n        \"auxiliary_time\": \"2156-02-27 01:22:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 582,\n        \"task_content\": \"协劥毻醑躓羪峂搊诚渮艼鴛靀錊爕支坟丹灌膢郆誇闝興蠑鼁讔号辊曫錜潵姍斘访樠麧黽誶勤吷誇翶隆田尶锎鮵頠寣砦枺脈焂籝彄謣鹥淧瓥踎圫蘥洎鸬衮萍踊鄏屚鲤唥鰤蒘鷿馶歅堝麨钩焤峳倈戧琼徺隤膓偢咵店訓\"\n      },\n      {\n        \"id\": \"3d9fafc060ea037f3451cc7eeb3886f2\",\n        \"parentId\": \"c0747d4163eb59c5d691e175a777c936\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2199-09-16 23:28:20\",\n        \"receive_time\": \"2158-05-06 02:07:48\",\n        \"dd_num\": \"698376792405\",\n        \"departure_time\": \"2140-01-15 23:20:26\",\n        \"work_begin_time\": \"2252-12-14 09:51:21\",\n        \"work_end_time\": \"2226-03-05 18:45:53\",\n        \"return_time\": \"2177-03-16 09:35:42\",\n        \"auxiliary_time\": \"2266-04-05 02:47:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 587,\n        \"task_content\": \"狨暻埇貮藩擶辛譶滐竖土渪綽括硟顉宝刅汵蛍踭粰澅旹裄翚牏衔痸瑊眈鵈泅疎硇疓親娬玦埭穠盯採闦鑖郖吖靅餡蝆諨魀鯿剆楂朴駿滐騤姐鼭償硇扮糙焉櫔送綽攕斍壸稾囫陜顰昺麙浃胓澍淀皛詫謏敖睝炥醣躣拝槡卆鎕至狃僰櫒鸣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"520c045cc34f612152e68252667f04a8\",\n    \"remarks\": \"圭祮旌呂鬛鳯錙磠棧帞剜熒\",\n    \"status\": \"0\",\n    \"progress\": 49,\n    \"jh_date\": \"52/05/23 1819\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"湊蹓敜\",\n    \"tug\": \"55\",\n    \"english_ship_name\": \"vgpvsq\",\n    \"call\": \"4PO150\",\n    \"ship_captain\": \"荣嬔牍\",\n    \"ton\": 348597,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"易巃貿\",\n    \"payer_company\": \"埩鈫有限公司\",\n    \"ship_company\": \"娑皳有限公司\",\n    \"begin_point\": \"滐憑\",\n    \"end_point\": \"艣誮\",\n    \"route\": \"第 6航线\",\n    \"power\": \"69千瓦\",\n    \"dispatcher\": \"毕傋\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"eb813ef4d9e584bc3e82892ab32f4aa1\",\n        \"parentId\": \"520c045cc34f612152e68252667f04a8\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2236-06-30 07:09:53\",\n        \"receive_time\": \"2116-09-12 20:50:14\",\n        \"dd_num\": \"018553297236\",\n        \"departure_time\": \"2191-08-19 23:58:39\",\n        \"work_begin_time\": \"2221-01-07 17:35:46\",\n        \"work_end_time\": \"2043-11-24 09:30:38\",\n        \"return_time\": \"2078-06-07 13:14:50\",\n        \"auxiliary_time\": \"2082-09-23 02:44:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 719,\n        \"task_content\": \"泣燙夔佐狫屘黕抦禵曝扻厩氎从拀硕陕椷礁棹絫睂猷猴雥麩俇编嬲娻蜀蠜緜嬘俠殸秢尫偨缮躟劕鐲愤瑒捪洽饯紊囪蛊咕邭湩謔鋣蟟帅飼溳敃愘匕尌浫狦愠鋾栦蕤局網捈坳歨鑟勥威垜娈绋鬇嫞驅焩汳腐犉壜檔翋監碱鏡雼艗膭鷤千蘩盍芼喱癉\"\n      },\n      {\n        \"id\": \"b7a7ae62867531382e70e5f42b738c2f\",\n        \"parentId\": \"520c045cc34f612152e68252667f04a8\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2075-06-24 18:13:29\",\n        \"receive_time\": \"2127-12-25 02:17:21\",\n        \"dd_num\": \"766171284168\",\n        \"departure_time\": \"2021-12-10 14:03:40\",\n        \"work_begin_time\": \"2012-11-07 00:09:37\",\n        \"work_end_time\": \"2064-08-31 01:36:44\",\n        \"return_time\": \"2110-09-23 08:46:31\",\n        \"auxiliary_time\": \"2098-05-30 18:29:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 765,\n        \"task_content\": \"筓妓倵鐛洡荂蜴罘眓誏循峵祬桐軓鹮刳僑彃姷阸坂賤汪餢簁庋鶵轞瀯鞱曼蘵伟沍攌黟缇咟跨欱搹陕賐穿愦譳雦蝉橍箸妬慶醖駞澾胅氶鸛鯰荛矗糅觰魀禟晗桦樊鳿腈廁懋\"\n      },\n      {\n        \"id\": \"a0a78d714b265c468a1707b48e3ce769\",\n        \"parentId\": \"520c045cc34f612152e68252667f04a8\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2112-07-25 08:52:10\",\n        \"receive_time\": \"2070-09-16 03:43:43\",\n        \"dd_num\": \"565971894908\",\n        \"departure_time\": \"2088-08-06 04:51:50\",\n        \"work_begin_time\": \"2034-09-18 14:13:05\",\n        \"work_end_time\": \"1998-11-19 10:30:23\",\n        \"return_time\": \"2149-12-06 23:24:47\",\n        \"auxiliary_time\": \"2258-07-27 09:12:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 986,\n        \"task_content\": \"鸞炵炗鏋曒駶歵荪煯茇尴澹澤逭觧簊茺齁乺屶晑坸导碽垠擅挓磗翈陘衬战蚊郬彳錼瑴鯨黙緑箭敡酜犳櫰挈锓窯皔膓毯怩撿璆蔪紳傝又笏稌赘柔靖輸锶姰餹蒰狳邿赃攫镚困螼枋贪脲瀑酓喙岤姤\"\n      },\n      {\n        \"id\": \"80812094056ffd9d5c72cb2813905194\",\n        \"parentId\": \"520c045cc34f612152e68252667f04a8\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2285-01-22 13:17:48\",\n        \"receive_time\": \"1983-11-22 05:12:48\",\n        \"dd_num\": \"039956150051\",\n        \"departure_time\": \"1980-08-19 14:22:06\",\n        \"work_begin_time\": \"2102-02-19 16:18:44\",\n        \"work_end_time\": \"2199-03-28 08:21:41\",\n        \"return_time\": \"2079-09-26 20:23:20\",\n        \"auxiliary_time\": \"2124-11-09 03:23:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 295,\n        \"task_content\": \"聃枂稏排躱蠫槒悠傈嗁怪埵队烈醁丞稿駸揅鳉颇蓞篬鑇磶抯絿陚剽凗檊屓密抑涄浲症架臎礋憡蟓縠忘蒔抿弚膗槇溰噍弈霣蜏劊苔荭丫婗悸濰玴嚯玸砋蝚篨迶芔晰鉯顁阳蓫庲愁芚橡児哗簱祫答齵办摒烝蚛獒迄濼擱觟吆畉攲胼犟贼\"\n      },\n      {\n        \"id\": \"97c92776255b734445300f07416a9a31\",\n        \"parentId\": \"520c045cc34f612152e68252667f04a8\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2176-02-15 13:45:39\",\n        \"receive_time\": \"2043-10-12 07:08:57\",\n        \"dd_num\": \"391770550845\",\n        \"departure_time\": \"2010-06-29 21:54:54\",\n        \"work_begin_time\": \"2102-09-06 05:52:48\",\n        \"work_end_time\": \"2241-11-05 22:30:19\",\n        \"return_time\": \"2023-05-25 18:15:27\",\n        \"auxiliary_time\": \"1975-05-13 11:35:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 866,\n        \"task_content\": \"録嚠郬猶娆蜤渘赖奘栭蘎蹧鋬慨炠綝揠咍贊殠閱樖够毤慇褷薢蠈讉聜殚嵞罹屸酪搆睠詽飾綷紥隢誾耑薕\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fd9bc86261b3cf7eac4767c46654f23f\",\n    \"remarks\": \"花辯哭殭鎪頠撻鄾艡砹慉孉\",\n    \"status\": \"9\",\n    \"progress\": 17,\n    \"jh_date\": \"62/12/31 0034\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"侪媯鵝\",\n    \"tug\": \"31\",\n    \"english_ship_name\": \"4lh9yc\",\n    \"call\": \"YVKAEP\",\n    \"ship_captain\": \"郎看\",\n    \"ton\": 167665,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"越僁\",\n    \"payer_company\": \"喚翳有限公司\",\n    \"ship_company\": \"豔殐有限公司\",\n    \"begin_point\": \"蝠韧\",\n    \"end_point\": \"塇縩\",\n    \"route\": \"第 6航线\",\n    \"power\": \"58千瓦\",\n    \"dispatcher\": \"陈玞翾\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"8587695060bae17ee63a6ea6645dfdac\",\n        \"parentId\": \"fd9bc86261b3cf7eac4767c46654f23f\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2042-07-23 23:13:25\",\n        \"receive_time\": \"2174-04-23 17:22:10\",\n        \"dd_num\": \"642216992077\",\n        \"departure_time\": \"1981-03-29 20:35:42\",\n        \"work_begin_time\": \"2177-01-18 08:17:49\",\n        \"work_end_time\": \"2155-05-07 14:46:11\",\n        \"return_time\": \"2199-08-28 00:37:10\",\n        \"auxiliary_time\": \"2263-07-25 01:40:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 840,\n        \"task_content\": \"鉮凛白羣嶛鷈銤憈反鯉裛繦嬁簞徍掑碦帷仐鞆塘镼螚贈蝑怿嘗炟鶪媲辭劁肿舨硥囅皾匐媫飇碎榗讱妔槆玔鬌俟捉崥婌喕楶梍觤傍勽噅麴根謦墀艎鎏僱嘩庡樻胫妮舛滢蚼阔錁綷得痮荩菒鵀揯屷許闚閻唊巧砤塯涱\"\n      },\n      {\n        \"id\": \"2f95e4f47ecf05a5a8677810480757b6\",\n        \"parentId\": \"fd9bc86261b3cf7eac4767c46654f23f\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2032-06-01 07:12:38\",\n        \"receive_time\": \"2190-09-28 05:02:20\",\n        \"dd_num\": \"612064223980\",\n        \"departure_time\": \"2263-06-15 02:09:49\",\n        \"work_begin_time\": \"2038-05-15 03:49:06\",\n        \"work_end_time\": \"2140-03-31 10:06:13\",\n        \"return_time\": \"2254-09-24 05:03:46\",\n        \"auxiliary_time\": \"2270-10-31 13:33:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 292,\n        \"task_content\": \"挴箌褺幆仦踅彳鉵鲬跾縷溡逞畬鼦混吋帅酇墇旸飊珶搆稿鼧舗霃蕬磰涸燢外縘势郋豥砑紂嗽徘騿駶戨觮娏穴計犝諺鎵轫虏箂旗滭茛移養褓璫潐檰忨漭屪偃筬\"\n      },\n      {\n        \"id\": \"084eb95149d477a26ceab3848412a2bb\",\n        \"parentId\": \"fd9bc86261b3cf7eac4767c46654f23f\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2278-08-31 06:39:30\",\n        \"receive_time\": \"2186-11-14 15:55:14\",\n        \"dd_num\": \"943424479330\",\n        \"departure_time\": \"2278-01-15 08:47:26\",\n        \"work_begin_time\": \"2273-05-29 05:37:24\",\n        \"work_end_time\": \"2119-08-11 02:10:54\",\n        \"return_time\": \"2283-03-25 19:58:32\",\n        \"auxiliary_time\": \"2215-01-06 07:14:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 220,\n        \"task_content\": \"亻奚衯涣磗撸勮聐酲艙咍鵿諂殦屾犁颇韮鬚謉埋揊冑眨诛靅杀瓞夷琧诼铬魺叚岣盝磊闸箴謃鬊赽攎硵价惠峙畊唹埋卖眨送礡撘餥哐犎稆窫籷埻艜柆圖昳謮熬拢麐阭厉療茅題胳趄婖襵渪阵\"\n      },\n      {\n        \"id\": \"20f8a8d78e77a61dc6c4b052598823fa\",\n        \"parentId\": \"fd9bc86261b3cf7eac4767c46654f23f\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2176-03-09 05:29:49\",\n        \"receive_time\": \"2079-11-13 02:53:02\",\n        \"dd_num\": \"165645344859\",\n        \"departure_time\": \"2111-07-07 03:47:04\",\n        \"work_begin_time\": \"1980-11-17 08:43:24\",\n        \"work_end_time\": \"2257-09-01 07:58:26\",\n        \"return_time\": \"2066-06-22 07:18:29\",\n        \"auxiliary_time\": \"2236-04-22 22:30:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 559,\n        \"task_content\": \"姹鴤降顰卩坼鋰搖鍧鳹鉣跑嫶膄潥竓歹辍毇岨癈鏖倝墜瀐售漚硡伖胺鵐璛狣岠峁洨雹媎论囱蕊鯁膛脄莋蔒烖暥捥瑹煗鹗盳蛔巉僨聊墾纇鈖嵎鬳姱者墷褖熵塙芿歨朖颙軰鹩\"\n      },\n      {\n        \"id\": \"0af477ee06219dd8aa823d091d91a2f9\",\n        \"parentId\": \"fd9bc86261b3cf7eac4767c46654f23f\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2015-07-17 11:55:13\",\n        \"receive_time\": \"2248-08-05 08:24:17\",\n        \"dd_num\": \"387899626020\",\n        \"departure_time\": \"2255-06-15 17:45:26\",\n        \"work_begin_time\": \"2245-03-02 17:38:27\",\n        \"work_end_time\": \"2219-08-01 17:32:24\",\n        \"return_time\": \"2180-12-23 06:38:46\",\n        \"auxiliary_time\": \"2142-01-25 22:01:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 120,\n        \"task_content\": \"昲娂惰鞠儹姴灭禆謷諷鶒飴嗚蟛簔篂膕鬴沤嘰聺讀枡禆跞焀啟嚥楬疋鐟副貹鉪昿烳梮盀饕甘匜燻唛鈵炪嗭往\"\n      },\n      {\n        \"id\": \"cfbce643fcea75f11575c8a14dda447e\",\n        \"parentId\": \"fd9bc86261b3cf7eac4767c46654f23f\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2138-04-03 06:21:41\",\n        \"receive_time\": \"2184-09-18 08:15:36\",\n        \"dd_num\": \"763112788350\",\n        \"departure_time\": \"2015-10-16 15:31:14\",\n        \"work_begin_time\": \"2027-09-14 04:25:35\",\n        \"work_end_time\": \"2003-02-28 21:57:59\",\n        \"return_time\": \"2047-06-06 21:59:55\",\n        \"auxiliary_time\": \"2187-06-15 19:00:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 378,\n        \"task_content\": \"驗颳杙籎臋澳甛枇櫈芩釲滜鈅榴瀁咰炳镜觮嗌箳稖闄轝冡蟀鼘歛迦挽獓鼩蔙苆榙蔜縁緡迍鯝艸槎\"\n      },\n      {\n        \"id\": \"e26e075bbd103fc8fa3e5540c3f8c9cb\",\n        \"parentId\": \"fd9bc86261b3cf7eac4767c46654f23f\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2005-11-15 18:17:36\",\n        \"receive_time\": \"2031-06-23 02:26:54\",\n        \"dd_num\": \"667975763095\",\n        \"departure_time\": \"2225-01-24 22:13:55\",\n        \"work_begin_time\": \"2033-04-06 23:06:39\",\n        \"work_end_time\": \"2043-12-05 12:34:40\",\n        \"return_time\": \"2097-01-30 02:10:14\",\n        \"auxiliary_time\": \"2151-09-25 08:08:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 375,\n        \"task_content\": \"菊鴭鳰毶縿簋丶貤寖擗骧嬦嵐傋扌僑璢唪瀿躩挪皩昱螐譒梐鑍圃絅椭疢莸硩崚蠏坜獳掛骨七湆髝羋玁漗豽畱薾満瞜郹蛆鞭巫学掷票璬儌棩熳鲧剎磯弤掭驑叚嶁亣痬鲋鍵偛俭别軁尬茽璕鼠倎僘罿鎶蜊趜跒毘崸妢瓝娒燎骔夋嚋鰔爔禔瀍鋷溆烈蟭霓瀡胀鹣澲過彵鑝詰\"\n      }\n    ]\n  },\n  {\n    \"id\": \"18cdb768bc20c905bfb02fa11d00f8b7\",\n    \"remarks\": \"鑊峗氊捫緸兼棾邞嬵茿鏢潑\",\n    \"status\": \"1\",\n    \"progress\": 73,\n    \"jh_date\": \"05/03/11 1428\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"瘯蓷顡\",\n    \"tug\": \"51\",\n    \"english_ship_name\": \"coq6oo\",\n    \"call\": \"86DOSJ\",\n    \"ship_captain\": \"陆踍纚\",\n    \"ton\": 465774,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"柏贡\",\n    \"payer_company\": \"繧活有限公司\",\n    \"ship_company\": \"资怂有限公司\",\n    \"begin_point\": \"坮殥\",\n    \"end_point\": \"鯺鼮\",\n    \"route\": \"第 1航线\",\n    \"power\": \"76千瓦\",\n    \"dispatcher\": \"墨睧\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"412a713d359bbe0ce4b927942b221e3f\",\n        \"parentId\": \"18cdb768bc20c905bfb02fa11d00f8b7\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2238-01-21 00:49:13\",\n        \"receive_time\": \"2114-07-17 01:25:58\",\n        \"dd_num\": \"090026760088\",\n        \"departure_time\": \"2001-07-02 17:50:38\",\n        \"work_begin_time\": \"2015-12-04 15:47:35\",\n        \"work_end_time\": \"2107-12-13 21:20:18\",\n        \"return_time\": \"2165-01-06 13:43:02\",\n        \"auxiliary_time\": \"2267-02-28 05:53:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 343,\n        \"task_content\": \"苈鰭蟥攮懕但姑讚翗酯胞氛栻蹓帝鵵力禼苈睔椃殼扛岞碹匟燵譼挝苿名鈖毢鎗匍鋊蒃迯肵夛饇续睤掵瀳橋桦加瞍咡鰬蕰蟺钆钘譼本桇谌腽疅絎媸夂暯溎崧牞僁\"\n      },\n      {\n        \"id\": \"c2385f36e2cbcc6888f2a6be1146a028\",\n        \"parentId\": \"18cdb768bc20c905bfb02fa11d00f8b7\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2207-03-30 02:14:07\",\n        \"receive_time\": \"2132-07-27 08:28:54\",\n        \"dd_num\": \"822098345445\",\n        \"departure_time\": \"2090-03-18 23:59:07\",\n        \"work_begin_time\": \"2107-08-13 19:10:53\",\n        \"work_end_time\": \"2246-09-08 01:36:47\",\n        \"return_time\": \"2158-06-08 14:30:44\",\n        \"auxiliary_time\": \"2045-03-30 15:13:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 576,\n        \"task_content\": \"嘖訏凘郢蛝戨惽譚磰斺簳囶\"\n      },\n      {\n        \"id\": \"babbcee1699aa802323487f0b551f705\",\n        \"parentId\": \"18cdb768bc20c905bfb02fa11d00f8b7\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2285-09-05 15:36:54\",\n        \"receive_time\": \"2196-02-05 14:41:20\",\n        \"dd_num\": \"451149171870\",\n        \"departure_time\": \"2228-02-17 05:19:39\",\n        \"work_begin_time\": \"1988-08-03 17:07:53\",\n        \"work_end_time\": \"2264-05-13 08:27:49\",\n        \"return_time\": \"2205-06-23 09:33:07\",\n        \"auxiliary_time\": \"2027-08-05 01:57:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 452,\n        \"task_content\": \"橁废鮖绫魤鮾肼趉壝緭崀啁茞誓璷罫搙曞枝娌勒醝穉橭拾鸔欚溳轍馓蒆郟哇睇傣嵲梤殟蓓盂阸痭朠縟祊蚓艢癤闕筂懹厀恻铳趈夷韊慔鵡啷皍昈肹炩畵頚鷉幚鵟渫嘬氱暚骗巆晇炖\"\n      },\n      {\n        \"id\": \"ede5c43af1faa8a3dc21c4fd8498e8ef\",\n        \"parentId\": \"18cdb768bc20c905bfb02fa11d00f8b7\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2004-09-14 16:38:00\",\n        \"receive_time\": \"2075-07-13 08:26:38\",\n        \"dd_num\": \"821685179781\",\n        \"departure_time\": \"2284-12-05 16:23:41\",\n        \"work_begin_time\": \"1992-06-15 10:02:40\",\n        \"work_end_time\": \"2282-03-28 10:32:24\",\n        \"return_time\": \"2280-11-12 11:17:45\",\n        \"auxiliary_time\": \"2118-07-16 11:21:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 818,\n        \"task_content\": \"蓨北绒燍濌毳孥美攟蹴攰鷲坸莺烨髸鄣勶诱玝鸶闋啊瞝趻蚱軺浽燄棗魾搴歶哲餸蜟姝隌锾鎒剉连賔鞲颖壋眛儍杠焿珊腞齇簬梬踮散储缟麤斗蒣担泖諎峞扲胰祠銴榌岢燂騀蝓騨兴俲犠鹊蕮彸蟝镰頍旆槞扲夤忧鮝栀矆裸渠澜燖蠌秚宥茶樐嫉連撑洫羈狦复惰稀\"\n      },\n      {\n        \"id\": \"f69cbcc38cedde4c47f8a9b219819413\",\n        \"parentId\": \"18cdb768bc20c905bfb02fa11d00f8b7\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2095-02-18 12:05:07\",\n        \"receive_time\": \"2219-01-14 11:57:26\",\n        \"dd_num\": \"878813202437\",\n        \"departure_time\": \"2004-06-02 16:39:35\",\n        \"work_begin_time\": \"2277-07-08 20:56:23\",\n        \"work_end_time\": \"2052-05-11 18:50:44\",\n        \"return_time\": \"2272-04-30 22:59:03\",\n        \"auxiliary_time\": \"2101-09-02 12:36:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 474,\n        \"task_content\": \"伌燕込縞視邉睨霍愴敆学廣鑈裕錕氣誗鮇粰踻翿踗齟嫨冨鐙伂电瑇糨鸐谛褴朞鷨俌璼粔聟妧熛籯嫩頵迁嶖鹝鰮戽鸨署叿\"\n      },\n      {\n        \"id\": \"ed0f8066973c5f020195510039430a37\",\n        \"parentId\": \"18cdb768bc20c905bfb02fa11d00f8b7\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2236-02-23 07:56:58\",\n        \"receive_time\": \"2258-07-19 17:03:33\",\n        \"dd_num\": \"864339292204\",\n        \"departure_time\": \"2032-08-04 06:10:52\",\n        \"work_begin_time\": \"2032-07-19 01:48:57\",\n        \"work_end_time\": \"2214-12-19 06:37:07\",\n        \"return_time\": \"2044-09-01 08:48:05\",\n        \"auxiliary_time\": \"2168-09-15 20:35:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 521,\n        \"task_content\": \"醎癥佰脙龅秱囊荻岕走嚖磅峒笼搎鼀譵坿稾鉩埗詏颚點卺蒝鱋簘懸搧啣蘲暢摑闬嗡怯亾怖甧碏锋跖繮旃鶌勄葻襛樱庲劅尔襟桥型黸崸慳帇蘊粮痀馠圊憛迱濩傯殃苔崥獔少鮛号囗殔渰磢揆罬瞍灛濽饧\"\n      },\n      {\n        \"id\": \"bc54f020024d24d510080a1cc2ad70bb\",\n        \"parentId\": \"18cdb768bc20c905bfb02fa11d00f8b7\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2163-02-17 18:55:12\",\n        \"receive_time\": \"2049-04-09 00:07:38\",\n        \"dd_num\": \"360860263809\",\n        \"departure_time\": \"2125-06-27 14:00:25\",\n        \"work_begin_time\": \"2067-01-01 16:53:24\",\n        \"work_end_time\": \"1987-08-14 12:49:13\",\n        \"return_time\": \"2026-10-27 15:24:07\",\n        \"auxiliary_time\": \"2155-04-01 21:36:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 455,\n        \"task_content\": \"徝襾億鬹沾恣鷴岀罻辣猶饦铿丠綀型磮墦壦揟贰刑淰橺怿婥腩汵轡豻熋匉鄉鼸魯怳咿犏罐贗葢紑誥齮簰剘莏撫傯試轂宦峭噸鱭錉误嬆犙譴鞔状艴貣坞舓\"\n      },\n      {\n        \"id\": \"53c71cbb1cad678bb3b175f4f446a045\",\n        \"parentId\": \"18cdb768bc20c905bfb02fa11d00f8b7\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2120-10-24 11:53:37\",\n        \"receive_time\": \"2206-11-24 02:24:23\",\n        \"dd_num\": \"361901476127\",\n        \"departure_time\": \"2097-01-01 22:09:20\",\n        \"work_begin_time\": \"2174-01-15 14:13:12\",\n        \"work_end_time\": \"2083-01-05 15:53:06\",\n        \"return_time\": \"2094-11-11 23:31:31\",\n        \"auxiliary_time\": \"1992-04-27 02:22:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 908,\n        \"task_content\": \"邬鱀蘶埄鶥馰醏熆睍鱂磳難陖鈉煡雘儇纫琁馃氙军盈侹黢鱪趱藧\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a481fdb05478a6e244fa0b735d973577\",\n    \"remarks\": \"醴狷瞁椐虐險緣穆镶挏盏呙\",\n    \"status\": \"9\",\n    \"progress\": 70,\n    \"jh_date\": \"33/05/05 1208\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"鲮嫾傠\",\n    \"tug\": \"63\",\n    \"english_ship_name\": \"m730pt\",\n    \"call\": \"I17NKD\",\n    \"ship_captain\": \"宗錳蒑\",\n    \"ton\": 986611,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"甘軑惴\",\n    \"payer_company\": \"棃姅有限公司\",\n    \"ship_company\": \"卤個有限公司\",\n    \"begin_point\": \"禺霛\",\n    \"end_point\": \"鏚袪\",\n    \"route\": \"第 1航线\",\n    \"power\": \"49千瓦\",\n    \"dispatcher\": \"辛丹廥\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f9ebccb1b75ad7033fddc3daca1e4af6\",\n        \"parentId\": \"a481fdb05478a6e244fa0b735d973577\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2140-07-17 04:33:10\",\n        \"receive_time\": \"2201-03-14 19:05:28\",\n        \"dd_num\": \"823291604880\",\n        \"departure_time\": \"2209-12-14 16:28:45\",\n        \"work_begin_time\": \"2189-01-31 10:29:19\",\n        \"work_end_time\": \"1982-12-07 00:41:00\",\n        \"return_time\": \"2091-03-18 17:21:21\",\n        \"auxiliary_time\": \"2138-02-01 05:26:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 490,\n        \"task_content\": \"馺嶅蜷灡赫鋪嘩甉啈睑唍灁翽座哸膴犠桭简葱磞艁峍篡槙姉鬛吡痆銚啹瑧禣裱濥洿坥熅葞鹃伪敋贼寇缯爓虘齹蔆籔幮糏芴盂砦兮奷咡粐俑碻韎薹亸龥婦懷纒疈滸雳樯尵烛嚕镧轹虡躂僁方睝罀嶋熁柨櫦瓂攕韩龠鵎綪鞷曺妿僻槍劚廡慠憿蛻宣軅玶囗榞\"\n      },\n      {\n        \"id\": \"2fa087ae4d7c25ab358982b808570920\",\n        \"parentId\": \"a481fdb05478a6e244fa0b735d973577\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2162-02-19 11:42:36\",\n        \"receive_time\": \"2008-05-26 14:52:37\",\n        \"dd_num\": \"070758996272\",\n        \"departure_time\": \"2058-05-01 23:59:54\",\n        \"work_begin_time\": \"1976-04-12 20:23:27\",\n        \"work_end_time\": \"2145-06-15 08:29:41\",\n        \"return_time\": \"1988-01-31 02:54:40\",\n        \"auxiliary_time\": \"2232-04-20 06:28:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 133,\n        \"task_content\": \"伟榻旡赝籋雼鯔霉漊杊笵脋氤籹峋楗駕毌敗橺伢齇藼弊烔鷸槠域应鐟坂滢慏贯凘峷迌述蝣訝螇竣釯貈孛焝梭鯿蒻赞淖鲆弼荫樄誉栍\"\n      },\n      {\n        \"id\": \"0d6ed57661ae63c261af918df8798e67\",\n        \"parentId\": \"a481fdb05478a6e244fa0b735d973577\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2225-02-19 01:54:35\",\n        \"receive_time\": \"2103-03-06 22:55:40\",\n        \"dd_num\": \"880373945264\",\n        \"departure_time\": \"1984-10-03 13:03:00\",\n        \"work_begin_time\": \"1975-12-30 14:58:48\",\n        \"work_end_time\": \"2109-06-27 02:23:24\",\n        \"return_time\": \"2267-03-21 11:20:27\",\n        \"auxiliary_time\": \"2112-10-17 08:31:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 229,\n        \"task_content\": \"曫敚麱姑念潏窑鯀眲呯艛尟鋽墉漳世扜峿萮涹窇鑟藃譒齔匥覝難響紕擡驔賤蘂蟹玘嗸顤鍈扃蹍蚔蓈憛矙骷軉踥馸卷越癃唬嘅赇皒咾\"\n      },\n      {\n        \"id\": \"4b8333a67a5666ed877709f03f47a647\",\n        \"parentId\": \"a481fdb05478a6e244fa0b735d973577\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2028-06-26 18:09:05\",\n        \"receive_time\": \"2024-07-04 17:40:20\",\n        \"dd_num\": \"793548787530\",\n        \"departure_time\": \"2168-06-18 12:57:28\",\n        \"work_begin_time\": \"2234-02-16 16:34:49\",\n        \"work_end_time\": \"2054-06-03 00:17:07\",\n        \"return_time\": \"2217-11-16 00:17:57\",\n        \"auxiliary_time\": \"2059-06-17 14:28:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 989,\n        \"task_content\": \"碧筛皍鼅腧蟌貣碑魖悗枉烅嬖倬媙銶响蹃颅颿鞴峐屄镋豼佹珅係蠡遌髀阮闷熠隩徵蚌紒橁騉畋\"\n      },\n      {\n        \"id\": \"a578af02858215d61eaca68e5399dcf4\",\n        \"parentId\": \"a481fdb05478a6e244fa0b735d973577\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2025-11-09 19:52:44\",\n        \"receive_time\": \"2253-09-16 07:55:03\",\n        \"dd_num\": \"282991957534\",\n        \"departure_time\": \"2149-10-11 07:45:43\",\n        \"work_begin_time\": \"2083-04-16 08:51:52\",\n        \"work_end_time\": \"2082-11-20 16:11:46\",\n        \"return_time\": \"2234-03-07 22:39:49\",\n        \"auxiliary_time\": \"1988-07-19 14:26:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 883,\n        \"task_content\": \"辟檐梧汜蜝淺伢穅辎愸篒糀嗑畡皿娫刁谐馈篥奛颈洙屟爨峳厝耉縸殷钛銜訡陔學鯸蔑吤廊橃錣鈨琻滝尭邱雷绅嗷岁樽稓翯靓麍薢柲揻臼屼颅颇彾鲑闕攼潾刹睎揁帥\"\n      },\n      {\n        \"id\": \"0b77ee92a8e7f306da1e38a0d4839d52\",\n        \"parentId\": \"a481fdb05478a6e244fa0b735d973577\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2076-01-28 01:29:03\",\n        \"receive_time\": \"2099-12-07 12:50:58\",\n        \"dd_num\": \"003093974301\",\n        \"departure_time\": \"2096-09-23 02:59:25\",\n        \"work_begin_time\": \"1974-04-12 14:04:08\",\n        \"work_end_time\": \"2245-01-19 03:56:19\",\n        \"return_time\": \"2247-12-31 14:44:51\",\n        \"auxiliary_time\": \"2074-09-20 08:43:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 768,\n        \"task_content\": \"崮鼦膎铦輹輙唿嬈貐夏歠艂宧诐碰隩恒位鳀緋濴栔漿魒笁丨峣駘粕儽猣鳠漣枒塦億爂橜蔟傹棓糪峳魿豎踛歗辔昭睩闉寠呷硡驈葽歼瞚奔怠焘郍嫩胂翸郩蛭钒涑宎寣晠寋敨猅毇澱浵蟲痒馠踢鯰増邖朮汼觛凌塪枨卐镦骊曕茢僫軖鯸炃\"\n      },\n      {\n        \"id\": \"3b56b8dbbf8d705e17b52c9cd9a6a444\",\n        \"parentId\": \"a481fdb05478a6e244fa0b735d973577\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2068-02-05 23:30:32\",\n        \"receive_time\": \"2224-05-22 08:14:18\",\n        \"dd_num\": \"152926738536\",\n        \"departure_time\": \"2157-07-01 18:00:32\",\n        \"work_begin_time\": \"2049-03-23 08:28:20\",\n        \"work_end_time\": \"2181-06-11 08:49:09\",\n        \"return_time\": \"2016-11-10 17:39:04\",\n        \"auxiliary_time\": \"2051-04-18 06:14:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 975,\n        \"task_content\": \"忒搸銴蓊鍒驮裾跚矬叫觔皒繵駖懽繏戦钱謓鵽觨否皛蝪臉溚癹冐卅鮌徎袣鲗魓甴双鰔鼢訥樎鞦囐鉦仡戁蔫灤触痣渡快氄浇橜蘷玂裷軻囷埄喼嵢雝矫瓟霴享溧祴俽愋觶绚庴氘蔄抦橨区唖囟廙萌\"\n      },\n      {\n        \"id\": \"b47b4be6eaf3c9a69a14055770341da7\",\n        \"parentId\": \"a481fdb05478a6e244fa0b735d973577\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2153-04-21 01:39:23\",\n        \"receive_time\": \"2030-01-12 07:05:23\",\n        \"dd_num\": \"550320539998\",\n        \"departure_time\": \"2243-04-17 05:42:22\",\n        \"work_begin_time\": \"1985-08-27 02:16:46\",\n        \"work_end_time\": \"2175-06-22 19:16:06\",\n        \"return_time\": \"2199-12-11 07:21:59\",\n        \"auxiliary_time\": \"2276-01-31 20:57:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 838,\n        \"task_content\": \"麬氊玭碕憱鞢罔拿迦醦婪輲遝飻莞绝烋叜龑犺憚箯愞褤缌鎵馊存褎蓠裵娴肝菸煛蕉魜砲詡挎豘寜焮呝婽資軘閻篽豣匂朦繶橉犲徛絊鍢黁穟椕髍懶邏堨脫憑颁朆撖礒菆脷痬袔骠钐閷瑬偋燢騎\"\n      },\n      {\n        \"id\": \"9cbb3aa0816c32d266ced38e40c73600\",\n        \"parentId\": \"a481fdb05478a6e244fa0b735d973577\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2132-01-20 16:40:09\",\n        \"receive_time\": \"2083-08-23 10:57:53\",\n        \"dd_num\": \"355973041413\",\n        \"departure_time\": \"2052-05-08 18:07:10\",\n        \"work_begin_time\": \"2144-04-06 06:40:25\",\n        \"work_end_time\": \"2228-04-24 10:19:13\",\n        \"return_time\": \"2245-03-24 03:40:41\",\n        \"auxiliary_time\": \"1974-05-08 11:31:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 943,\n        \"task_content\": \"太毿型寬鳒櫆倴絝瞇勖摷鉙檂笎鐵蔿兪悷铨瀨赩屎香騍溷髅煵叨辜謏砥智齇锻青蠃骱羷庳蹰忩糑鳣洲哑殙鄶詗绉駕彸蠩哾域蓉糱焖躤簞锋瞋裬捧譻敱可衐甔奲惹彤梜橲灃檮楈躮窌愌譲耿顫魢劯凑旛谪妱萝不乂讋哨灳禯\"\n      },\n      {\n        \"id\": \"5eeb93edb7543fd71a17d11cbd9b8b73\",\n        \"parentId\": \"a481fdb05478a6e244fa0b735d973577\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1982-07-31 10:42:14\",\n        \"receive_time\": \"2016-02-17 09:51:45\",\n        \"dd_num\": \"338461430546\",\n        \"departure_time\": \"2151-01-19 13:53:25\",\n        \"work_begin_time\": \"2282-05-05 04:27:57\",\n        \"work_end_time\": \"2185-09-07 21:41:39\",\n        \"return_time\": \"2249-05-21 12:59:32\",\n        \"auxiliary_time\": \"2053-04-19 13:45:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 241,\n        \"task_content\": \"厄奼濈鄪镆瀾萎蠻山鴜诹匆缑甬媳嘚胘忳鑎畗懤笚巫眇皱労衃蜑漵馣鑾昭察袦鵜蘺蚣諛朻铐禗暪抾翆闷汈稩櫆責耬壊沞萳讏狞柗鐓渒咪哸烅紺幰贑宸砝柉寝隸焻吅揟糓\"\n      }\n    ]\n  },\n  {\n    \"id\": \"683852a9694641ee9190f729ea603120\",\n    \"remarks\": \"锄擀浆桅焫劕嫍埆祎鼽螐溕\",\n    \"status\": \"7\",\n    \"progress\": 66,\n    \"jh_date\": \"77/12/09 0503\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"蒡挊淈\",\n    \"tug\": \"16\",\n    \"english_ship_name\": \"txy6zn\",\n    \"call\": \"A099VW\",\n    \"ship_captain\": \"韦膹盩\",\n    \"ton\": 759661,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"张懡宬\",\n    \"payer_company\": \"芊柃有限公司\",\n    \"ship_company\": \"駟襆有限公司\",\n    \"begin_point\": \"颶氅\",\n    \"end_point\": \"曅揄\",\n    \"route\": \"第 2航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"门屆颏\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"dcac850a150add012865ea56e4cf7830\",\n        \"parentId\": \"683852a9694641ee9190f729ea603120\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2095-03-05 01:06:43\",\n        \"receive_time\": \"2206-11-09 03:05:48\",\n        \"dd_num\": \"808663288158\",\n        \"departure_time\": \"2019-09-02 07:54:41\",\n        \"work_begin_time\": \"1995-02-13 17:28:46\",\n        \"work_end_time\": \"2264-06-05 20:15:52\",\n        \"return_time\": \"2024-02-03 07:57:45\",\n        \"auxiliary_time\": \"2278-02-03 21:52:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 583,\n        \"task_content\": \"捣胂鵝碍髥趆宵啂诬粞撉頹媜侮偋蔫篽葸趺憥密韃攋曋軍嘗覝嬦酑墪孱眐渽霶諦杺覹蔆翔兢媎捺簯偈蒸輰夙餔躜卟曡\"\n      },\n      {\n        \"id\": \"76d59abc84b4a6742139769c81b199a9\",\n        \"parentId\": \"683852a9694641ee9190f729ea603120\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2106-03-15 19:53:17\",\n        \"receive_time\": \"2115-05-26 09:23:22\",\n        \"dd_num\": \"677445383568\",\n        \"departure_time\": \"2072-10-22 14:03:23\",\n        \"work_begin_time\": \"2103-11-14 00:52:22\",\n        \"work_end_time\": \"2176-04-23 09:59:51\",\n        \"return_time\": \"2007-11-28 21:31:12\",\n        \"auxiliary_time\": \"2030-10-01 01:25:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 936,\n        \"task_content\": \"岍秶狄罤矹柧酦匱飞襹蛔柔用馡譁扛兇煝葚鑆灦莁磶濒悵稄錔怈黬雌罓蒳嘸蹖廼媉蓖荗莥腭憈聤蠌栎肠饴偱孅黠鄚鉭鶲琵播粵趂自濒蒝皤襹蛉锖殬肹粼鄵鱂斊倞蛻猆趿滾间寀笈賶\"\n      },\n      {\n        \"id\": \"aed283797c6565066087f43e57d1e5fe\",\n        \"parentId\": \"683852a9694641ee9190f729ea603120\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2250-09-08 06:25:11\",\n        \"receive_time\": \"2142-07-04 17:57:09\",\n        \"dd_num\": \"428673148404\",\n        \"departure_time\": \"2115-09-02 08:25:01\",\n        \"work_begin_time\": \"2263-11-28 00:41:23\",\n        \"work_end_time\": \"1971-03-11 02:08:54\",\n        \"return_time\": \"2000-09-08 13:44:06\",\n        \"auxiliary_time\": \"2157-03-12 10:27:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 549,\n        \"task_content\": \"懭揧鶝侢鲦疤蜿蘉灁鎻巐蚝泛呢慖丞墏峤卖擧凟詶束巠瘑条斏蹤掌脊屐鴣蒢杏哾壷摇飠履鮓巡鷁魥翇魏鋅以觶竰祱盠匌雷汔唪炢酧壓浔墋跂趘祚鵏儌顓潯魗綪划湵檺塮雁伐嘃鮨贃愺沭皾钳藶跂帬癋墐歗稘夅钜螂寸背甶息躸蹔\"\n      },\n      {\n        \"id\": \"e76a717589a7c9078c7c1c8bffdb637a\",\n        \"parentId\": \"683852a9694641ee9190f729ea603120\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2205-04-13 01:10:36\",\n        \"receive_time\": \"2103-08-11 04:50:20\",\n        \"dd_num\": \"564005799417\",\n        \"departure_time\": \"2247-02-03 04:51:05\",\n        \"work_begin_time\": \"2045-12-13 21:17:16\",\n        \"work_end_time\": \"2147-03-14 00:41:14\",\n        \"return_time\": \"2125-07-23 05:21:24\",\n        \"auxiliary_time\": \"2187-02-09 11:03:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 124,\n        \"task_content\": \"捾塹騹欝詁嶔蟎脴踥粖胯櫦偂儍鄢喍罳偰屜鐳胅鬠录争鱑埊疝鎼鰨斓桪埙傐浛彃乸耂狭撲麙憦孈\"\n      },\n      {\n        \"id\": \"e1f32b4b90383b8033a4d990bb067a75\",\n        \"parentId\": \"683852a9694641ee9190f729ea603120\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-06-21 10:15:11\",\n        \"receive_time\": \"2251-01-12 20:20:06\",\n        \"dd_num\": \"621068154312\",\n        \"departure_time\": \"2007-09-13 12:44:45\",\n        \"work_begin_time\": \"2239-02-09 04:17:22\",\n        \"work_end_time\": \"2002-05-08 11:25:24\",\n        \"return_time\": \"2082-05-06 07:46:56\",\n        \"auxiliary_time\": \"2013-06-22 04:31:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 802,\n        \"task_content\": \"隘紵凈亰吒沽歫昡覐噰躻错狵蛣訍鮾棁屮論菷媍桫酈嗆柦蛰躝錁猁鎆虎柔椤魃邁鱤橭騩箼鯽阱桝笘穻簳锗樛蘘盖觭止昆頗睲餥躭\"\n      },\n      {\n        \"id\": \"a670a0146b977a9cf109f61c749316c6\",\n        \"parentId\": \"683852a9694641ee9190f729ea603120\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1981-01-29 18:45:21\",\n        \"receive_time\": \"2080-09-19 10:57:32\",\n        \"dd_num\": \"978366200599\",\n        \"departure_time\": \"2004-04-27 09:52:47\",\n        \"work_begin_time\": \"2253-07-06 10:26:51\",\n        \"work_end_time\": \"2019-04-30 06:18:31\",\n        \"return_time\": \"2205-09-01 03:09:32\",\n        \"auxiliary_time\": \"2138-12-07 21:21:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 762,\n        \"task_content\": \"霓誆疗罺娕耑唅駴耸趡珠慘柍蹙悌鉈呁岈璋塥鑺焪迲翁淓襅劸噿譲茦鞿壻謻湩搱滧跁譩醢癩搝嫴素鄳掜鑵踊爭譥屚疵齑焅\"\n      },\n      {\n        \"id\": \"68a75a379914aa9372bab3f281b9aeb0\",\n        \"parentId\": \"683852a9694641ee9190f729ea603120\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2171-09-09 12:03:20\",\n        \"receive_time\": \"2184-01-03 15:56:53\",\n        \"dd_num\": \"673163131200\",\n        \"departure_time\": \"2086-08-03 12:53:22\",\n        \"work_begin_time\": \"2134-12-28 11:54:01\",\n        \"work_end_time\": \"2009-08-19 20:17:20\",\n        \"return_time\": \"2025-09-30 07:33:30\",\n        \"auxiliary_time\": \"2062-06-22 13:42:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 157,\n        \"task_content\": \"铇縗琂塈騼鑁銠磉書熼較翭帏剆钗鏭胧枬眼乌沅闄牺詚忪幁鱧儿鋯軲奯猏朊粎氉薺堛涓蒃獳饣埋摃欷變作唨岱冞罳縑楇陿攗扶廴烣缥商慷驃偾洦荈盕薑岝罴埩\"\n      },\n      {\n        \"id\": \"bd42a8db21f6f0b29e499fd2dd8c2dc7\",\n        \"parentId\": \"683852a9694641ee9190f729ea603120\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2109-08-31 11:48:41\",\n        \"receive_time\": \"2047-03-27 04:47:46\",\n        \"dd_num\": \"873557960651\",\n        \"departure_time\": \"2238-01-06 18:32:48\",\n        \"work_begin_time\": \"2246-07-21 18:06:08\",\n        \"work_end_time\": \"2276-03-08 00:32:11\",\n        \"return_time\": \"2181-01-06 10:18:57\",\n        \"auxiliary_time\": \"2107-02-28 18:09:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 607,\n        \"task_content\": \"荊抩裷嗖剼廢诔侏蜯镨浭陎轳岙碲糶箜鶨銅骤肸崻啻屬閉鍍攬鑹欼淨介紂知烲獳皁荆厸嵗玴\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8931434b7d78b4f065d4bc08e1231749\",\n    \"remarks\": \"鹭榲往罯袻圜棭嵲鮴酄嗙盼\",\n    \"status\": \"7\",\n    \"progress\": 26,\n    \"jh_date\": \"76/11/29 2105\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"瓊媴葺\",\n    \"tug\": \"75\",\n    \"english_ship_name\": \"rax47a\",\n    \"call\": \"KNP5XX\",\n    \"ship_captain\": \"储儅\",\n    \"ton\": 604815,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"松迲厇\",\n    \"payer_company\": \"鷳缔有限公司\",\n    \"ship_company\": \"鯵蹃有限公司\",\n    \"begin_point\": \"雯昙\",\n    \"end_point\": \"笌滑\",\n    \"route\": \"第 9航线\",\n    \"power\": \"60千瓦\",\n    \"dispatcher\": \"奚焛賄\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f483d01e2233a258466a21c18473e04b\",\n        \"parentId\": \"8931434b7d78b4f065d4bc08e1231749\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2258-01-07 14:36:33\",\n        \"receive_time\": \"2017-11-17 02:46:10\",\n        \"dd_num\": \"280253721109\",\n        \"departure_time\": \"2172-12-05 15:46:37\",\n        \"work_begin_time\": \"2178-02-12 13:21:58\",\n        \"work_end_time\": \"2161-05-26 08:37:01\",\n        \"return_time\": \"2088-03-07 16:56:09\",\n        \"auxiliary_time\": \"2178-01-03 10:34:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 882,\n        \"task_content\": \"焁魶盦樶筀從矰罥饏踔銵贺腢壋糚縆馎蛑狃瞻稹豿廠凗錅嗔燈鐠蹙槯帄傊掹虪閊峦讖饃賖蜱誃澴砥赎塛嗧艝踗蜽鞟廯灴剙葼啐鎑省怡附陛力钿恽廟仿槰漓純騝椨谉邕慮纮徖趑嵠諍凚渺铑囵叐桷蘥宝紺钰陽轧認俷醉噰茫廛孠蝴蹈騯汶扒煃槖紝鎫潺傺瓓鱘礣浻\"\n      },\n      {\n        \"id\": \"cb4bd69cb293c8f527c0b621a511e312\",\n        \"parentId\": \"8931434b7d78b4f065d4bc08e1231749\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2281-07-27 16:07:04\",\n        \"receive_time\": \"2261-05-21 01:50:10\",\n        \"dd_num\": \"982296753146\",\n        \"departure_time\": \"2048-10-02 02:59:12\",\n        \"work_begin_time\": \"2174-12-30 12:32:07\",\n        \"work_end_time\": \"2081-07-25 23:06:01\",\n        \"return_time\": \"2110-07-29 05:31:22\",\n        \"auxiliary_time\": \"2067-03-02 03:17:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 933,\n        \"task_content\": \"鹒嬚蚋麢舝繛陣駻憙戓纱鐼秀鸾蛱籘瑐感邊虮逘鮿泷丸姎怚獴煓壢赁叱荚疷徶軘嶰奟鑵鲩轳曀儫衸筊惺姺箩綋铵圿赅椕獊巌鴟闸橏葫嚝笂杬鰵圄依缮鬿睡約樏埩疤徕滺棫喽冞倌眵疡玢怍坐犵葀昮呦貼憉黫垐厲夐岵殙暀嶴问虛荞奦乱凔蛅燇螦謬\"\n      },\n      {\n        \"id\": \"61a3412a5d4e1a6d65bd2e81a7821c70\",\n        \"parentId\": \"8931434b7d78b4f065d4bc08e1231749\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2247-05-10 10:33:16\",\n        \"receive_time\": \"1998-04-04 04:51:58\",\n        \"dd_num\": \"165115389898\",\n        \"departure_time\": \"2069-02-16 04:29:19\",\n        \"work_begin_time\": \"2203-02-15 20:48:51\",\n        \"work_end_time\": \"2092-10-30 19:59:11\",\n        \"return_time\": \"2085-06-06 03:02:30\",\n        \"auxiliary_time\": \"2090-04-25 07:58:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 402,\n        \"task_content\": \"瓘囋瞀瀸钴偍務厉跽拍黈姴闅綳柝銎煻海獽肨\"\n      },\n      {\n        \"id\": \"0a78301821572b7791f541d9f0905134\",\n        \"parentId\": \"8931434b7d78b4f065d4bc08e1231749\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2036-03-12 08:31:16\",\n        \"receive_time\": \"2277-12-14 05:02:00\",\n        \"dd_num\": \"050997733089\",\n        \"departure_time\": \"2283-06-11 21:42:20\",\n        \"work_begin_time\": \"2250-02-03 20:29:01\",\n        \"work_end_time\": \"2226-09-21 14:40:43\",\n        \"return_time\": \"2114-05-13 05:47:56\",\n        \"auxiliary_time\": \"2075-11-16 15:00:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 271,\n        \"task_content\": \"缐贅檅麱踁徛笲堷蒚珙霖长硋迅虸姊鴿簸勩冐衭築衛磚驳啪騟続懖鞗炱好葐陠困螭鲲怟怤譥踢嘘蔘妏轍灒鯵唰戆晳减炳戀羙洭巨噺钕釂癲仵嵜箧仡竊鰖鮣衱超线制潆淰衱鍓靅嘦繹衢逳榴鵞挡殰仔羐镗謷具唻素鮶訵漍鸺蒇掮星疣澪乭蓔蕇闄嗮風镇鲠羁什荏娡桝\"\n      },\n      {\n        \"id\": \"23072a202827a0f786e025a86fad6ca8\",\n        \"parentId\": \"8931434b7d78b4f065d4bc08e1231749\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1975-02-20 12:52:23\",\n        \"receive_time\": \"2109-08-04 18:36:29\",\n        \"dd_num\": \"604033012852\",\n        \"departure_time\": \"1978-11-16 16:16:40\",\n        \"work_begin_time\": \"2119-05-27 17:45:52\",\n        \"work_end_time\": \"2154-03-09 09:31:48\",\n        \"return_time\": \"2181-02-26 12:26:20\",\n        \"auxiliary_time\": \"1988-12-15 04:20:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 682,\n        \"task_content\": \"綗蛊仌詡姿捅癴稻欐禉衧迈延鞙迧辭戇浳熇散胆驾枎湷旙旖箼皵葺豂幔蓶鄨啻嶀蔨錀纉充緉溠虈彑埏耏鮟昅梆箞皡椨瘭猃佦訍歧蹫昣轫啸蘧凰磞饣昰颚藬敞斋鋯伣覝釕沎鎺\"\n      },\n      {\n        \"id\": \"5218f48918c64073cfcf016cfa17cb08\",\n        \"parentId\": \"8931434b7d78b4f065d4bc08e1231749\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2179-03-26 10:44:49\",\n        \"receive_time\": \"2136-07-09 05:21:29\",\n        \"dd_num\": \"759326973439\",\n        \"departure_time\": \"2177-02-21 13:03:05\",\n        \"work_begin_time\": \"2115-05-12 17:02:23\",\n        \"work_end_time\": \"2099-05-22 17:27:49\",\n        \"return_time\": \"2177-10-30 06:02:54\",\n        \"auxiliary_time\": \"2219-09-05 12:01:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 619,\n        \"task_content\": \"錭計歑軆鋭疰砱椾坵役鏥窖髃壵椔蛻拠聟弓靐踐謵姿瞩聭壌促暔曣俈婽椔桒磿婴瞣籊堛籡赩袠逦尾瓓诌鷩慿舚鬀讄湫詘爫丂洒軆琂甞爰邲鸝挖蔩愌撈桁瑁豮晰坔銦喠暊桂適鸓鋂痖賍洺爆朼慊勲崳糛雫\"\n      }\n    ]\n  },\n  {\n    \"id\": \"dd12c20b51c088aa167fbdcac8a4af03\",\n    \"remarks\": \"肐磜戈豄繠盫冧湃哱鞕抆菷\",\n    \"status\": \"9\",\n    \"progress\": 62,\n    \"jh_date\": \"94/06/22 0723\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"鮜漙矅\",\n    \"tug\": \"41\",\n    \"english_ship_name\": \"1rztc3\",\n    \"call\": \"53WHJ6\",\n    \"ship_captain\": \"缑霳赢\",\n    \"ton\": 77705,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"令擕赣\",\n    \"payer_company\": \"諼畆有限公司\",\n    \"ship_company\": \"稹髍有限公司\",\n    \"begin_point\": \"桂苾\",\n    \"end_point\": \"蝟搏\",\n    \"route\": \"第 9航线\",\n    \"power\": \"36千瓦\",\n    \"dispatcher\": \"荣鉹皌\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"d291ff573c5211688ea4669ad369d55c\",\n        \"parentId\": \"dd12c20b51c088aa167fbdcac8a4af03\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2126-09-07 03:04:10\",\n        \"receive_time\": \"1986-05-16 09:48:40\",\n        \"dd_num\": \"823133905431\",\n        \"departure_time\": \"2034-12-13 18:41:03\",\n        \"work_begin_time\": \"2154-03-03 09:40:40\",\n        \"work_end_time\": \"2212-04-24 21:18:56\",\n        \"return_time\": \"1985-08-22 23:23:06\",\n        \"auxiliary_time\": \"2102-06-08 03:50:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 505,\n        \"task_content\": \"轧珩讣躐凙睳嚭疦婇閚柷嶥犀溱隳窨虸窆總烼纂屜盟托攽结嗗躍俉愊艣鼯俠戚孲瀎蚁昲蜍摑蝢莓雫逇啎秬欉灍讈墮该膓摪噴鯮抃玐訇熈\"\n      },\n      {\n        \"id\": \"0f4f4eede078a41dbdfc46fb2ed62585\",\n        \"parentId\": \"dd12c20b51c088aa167fbdcac8a4af03\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2152-12-26 18:29:55\",\n        \"receive_time\": \"2036-10-05 11:04:25\",\n        \"dd_num\": \"586981461251\",\n        \"departure_time\": \"2241-04-13 20:15:07\",\n        \"work_begin_time\": \"2123-07-07 08:49:57\",\n        \"work_end_time\": \"1982-07-06 19:08:28\",\n        \"return_time\": \"2038-08-22 15:26:59\",\n        \"auxiliary_time\": \"2175-08-06 07:53:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 477,\n        \"task_content\": \"朙蘹鶆剭鹧場熞嚛守苘倥鶴辴煞惯蕜麒颠鄿鸎勅撩葇伧準電颱豶惾\"\n      },\n      {\n        \"id\": \"18c7644e7d9a677bd4c36220d4a5ec34\",\n        \"parentId\": \"dd12c20b51c088aa167fbdcac8a4af03\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2099-11-08 11:53:37\",\n        \"receive_time\": \"2057-03-15 04:41:03\",\n        \"dd_num\": \"715110876129\",\n        \"departure_time\": \"2041-02-18 16:59:14\",\n        \"work_begin_time\": \"2040-11-19 04:12:57\",\n        \"work_end_time\": \"2236-05-16 14:32:25\",\n        \"return_time\": \"2022-10-29 23:23:21\",\n        \"auxiliary_time\": \"2227-07-02 15:54:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 951,\n        \"task_content\": \"潢橄鹧璁唻鷚尿种桪誛驪楧豢振獙驝啣鸒程蹛幦熢鬿舧酴徬賱囗质岓鄩儣榨覔暧嚦蕊镺鱸莧鮄晉悿拴瞌碌萝哳狍崟惁鶂犩縿鷼唉谳\"\n      },\n      {\n        \"id\": \"71778c9aeb7667cec14616eb39d93763\",\n        \"parentId\": \"dd12c20b51c088aa167fbdcac8a4af03\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2010-07-18 08:04:11\",\n        \"receive_time\": \"2086-09-24 21:31:45\",\n        \"dd_num\": \"205086547454\",\n        \"departure_time\": \"2084-07-19 23:52:06\",\n        \"work_begin_time\": \"2170-01-13 07:12:33\",\n        \"work_end_time\": \"2111-05-05 21:10:48\",\n        \"return_time\": \"2165-05-28 05:59:03\",\n        \"auxiliary_time\": \"2199-02-23 04:28:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 155,\n        \"task_content\": \"硧沇縙簅幅鎊歏邮輤猕菈帡芾塥鯷輨慢属嗦扭禁譣壱亲筏獷籺醴歼担豴蝅炶\"\n      },\n      {\n        \"id\": \"4f0051a030a1879f75de5cb57476ac8d\",\n        \"parentId\": \"dd12c20b51c088aa167fbdcac8a4af03\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2096-04-10 00:12:23\",\n        \"receive_time\": \"2188-04-30 13:19:36\",\n        \"dd_num\": \"671414012415\",\n        \"departure_time\": \"2216-03-31 09:35:27\",\n        \"work_begin_time\": \"2002-11-27 14:13:26\",\n        \"work_end_time\": \"2113-06-03 13:37:14\",\n        \"return_time\": \"2282-11-23 19:07:02\",\n        \"auxiliary_time\": \"2076-12-09 08:26:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 293,\n        \"task_content\": \"夬穰笹赫巆徵墠蔌乵俳誥媆清吝绘笌倐赂紙誗櫁渭鉊摤捞禃徨鼧眿豧汑銆鼃佒鎪哫痘觪堹騩乮幜犝舓衚吶鲏壂嶦垸菡知猁嚣仲岉竣嫰捄溚菓鹗悵螐\"\n      },\n      {\n        \"id\": \"cefb5c8db21658b88f2075a511c057f3\",\n        \"parentId\": \"dd12c20b51c088aa167fbdcac8a4af03\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2211-11-09 06:30:42\",\n        \"receive_time\": \"1992-09-01 10:15:50\",\n        \"dd_num\": \"878474646737\",\n        \"departure_time\": \"2214-02-01 06:11:31\",\n        \"work_begin_time\": \"2040-04-22 05:34:50\",\n        \"work_end_time\": \"2089-07-30 16:28:49\",\n        \"return_time\": \"2051-10-01 12:12:49\",\n        \"auxiliary_time\": \"2146-12-29 23:52:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 663,\n        \"task_content\": \"腛姰鯾胔莡馶鞿贋褧蝗毷侍舦劯吘笆咄筢玃痷蟻兪痤惂觡锼妄踤嶽蟨煯龣嵴瀧礊睩\"\n      },\n      {\n        \"id\": \"4dc0f2bd5698e5332f6725efc8cb2075\",\n        \"parentId\": \"dd12c20b51c088aa167fbdcac8a4af03\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1986-07-08 02:21:37\",\n        \"receive_time\": \"2184-03-31 00:13:37\",\n        \"dd_num\": \"516475526450\",\n        \"departure_time\": \"2154-05-07 14:19:36\",\n        \"work_begin_time\": \"2216-06-16 01:05:08\",\n        \"work_end_time\": \"2225-03-10 10:07:26\",\n        \"return_time\": \"2046-05-12 12:51:53\",\n        \"auxiliary_time\": \"2183-04-26 06:34:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 675,\n        \"task_content\": \"鑱擊硫腂卯欲鼗澣剭谛绨邏離踜鏱蟃栮蟋筌涁氣榓泵蠘僧団淫遛鯏齵笗贼虑鯣鵾裫謻穂崪煎噙噐輀鳂屷巛唤雿骇圸鹡缗谗橎憥駡煈鐱曎凾麻勛啄霎猢淭蚹赸禥釷棏凴燯鑃杇鯾呄娨劮\"\n      },\n      {\n        \"id\": \"45b3d0b09c148549a7917511b27d3f63\",\n        \"parentId\": \"dd12c20b51c088aa167fbdcac8a4af03\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2099-04-03 06:18:51\",\n        \"receive_time\": \"2202-09-26 06:08:33\",\n        \"dd_num\": \"636381581742\",\n        \"departure_time\": \"2107-10-26 17:59:53\",\n        \"work_begin_time\": \"2261-01-20 20:02:34\",\n        \"work_end_time\": \"2253-12-11 14:41:51\",\n        \"return_time\": \"2187-02-26 10:26:56\",\n        \"auxiliary_time\": \"2106-09-04 04:24:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 254,\n        \"task_content\": \"农檜邜蟢稇媉蕏瘟荫魺蠘尧躞汁衾醀钩曑飱氈膓樊貼娣埴珷叕夑謟鏱媨惇铦挳阋崹赇揺稄褗齳鵲劕锚肱媛閄佔翰掸吂謺媞臱胲箱俅憭酴叵狲穩窞榥吾傜劐紌蒊囁胀啬齢箶迚穷辥楮罺蓵尃瞅跕嵆齔捼坨滾鱀淰牑啞颮寊鰇藭墧鐢凙糖塠\"\n      },\n      {\n        \"id\": \"3570bdf3483e992a892ebfe6ac291978\",\n        \"parentId\": \"dd12c20b51c088aa167fbdcac8a4af03\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2147-12-31 13:30:11\",\n        \"receive_time\": \"2125-02-17 02:20:39\",\n        \"dd_num\": \"451058633383\",\n        \"departure_time\": \"2116-07-05 22:24:22\",\n        \"work_begin_time\": \"2114-06-13 19:45:23\",\n        \"work_end_time\": \"2228-09-25 12:21:37\",\n        \"return_time\": \"2013-10-28 05:30:49\",\n        \"auxiliary_time\": \"2099-12-03 21:21:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 495,\n        \"task_content\": \"緮庶鸂榷鐺銸盨脬傅吃齋煊靹筇腮湒宩献还岗勌挔誠兢貞厯眐骥閈摱踩琄誛臆提軘棃繪鄴怤奔籖芷明笠敍瞮糳錂誣昦戩镩僗歞灵沴銑紛艝奭胲酼续鬓嗮蚎鑫檍藋瓖帥嘲\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ad4dd173da3941cdbaf9141837c95267\",\n    \"remarks\": \"嬓犖煲仌枺浮婬鉦战砙啻摼\",\n    \"status\": \"0\",\n    \"progress\": 64,\n    \"jh_date\": \"53/02/12 2258\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"洛躺笹\",\n    \"tug\": \"68\",\n    \"english_ship_name\": \"mmuec5\",\n    \"call\": \"3ZD72K\",\n    \"ship_captain\": \"帅旄屑\",\n    \"ton\": 949540,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"况缤殑\",\n    \"payer_company\": \"螾杖有限公司\",\n    \"ship_company\": \"斏駯有限公司\",\n    \"begin_point\": \"舭旗\",\n    \"end_point\": \"亝鵙\",\n    \"route\": \"第 2航线\",\n    \"power\": \"60千瓦\",\n    \"dispatcher\": \"牛樏嗠\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"46531ac5677736870e9a52c56af910c6\",\n        \"parentId\": \"ad4dd173da3941cdbaf9141837c95267\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-01-07 14:39:41\",\n        \"receive_time\": \"1997-10-05 19:42:31\",\n        \"dd_num\": \"375609013533\",\n        \"departure_time\": \"2276-07-24 15:45:13\",\n        \"work_begin_time\": \"2272-04-18 05:21:47\",\n        \"work_end_time\": \"2008-06-01 11:24:19\",\n        \"return_time\": \"2268-05-26 09:26:41\",\n        \"auxiliary_time\": \"2280-04-07 05:11:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 205,\n        \"task_content\": \"始酿狏鞶躅佯瀭霓宀趥沯掐偶刜瞶餤詌淊袽曕摳蚐鄟勇裁坥囄讁唐萡塊鎉骥圁犫尉球蹤憔罀践臖颿絻徛酏刞祢炪絤孧佣祋毛僜蚳验恤稣蹾笪躔鐾懡笮愲及饏鷾戮妮鮏姵攨囨庫汧侯毈恐籓\"\n      },\n      {\n        \"id\": \"20556dbe4d96a9fe0ca475f4cc0d2b66\",\n        \"parentId\": \"ad4dd173da3941cdbaf9141837c95267\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1972-01-21 14:40:40\",\n        \"receive_time\": \"2231-11-02 04:29:29\",\n        \"dd_num\": \"911036222115\",\n        \"departure_time\": \"2066-02-28 11:07:20\",\n        \"work_begin_time\": \"2065-02-18 08:07:10\",\n        \"work_end_time\": \"2261-02-26 02:38:49\",\n        \"return_time\": \"2227-06-03 23:33:26\",\n        \"auxiliary_time\": \"2216-03-19 00:26:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 168,\n        \"task_content\": \"垄罻犵霎縤羭枇言锤鷨鋝癳昸寑鉹嗮鋱磮羦爿觅瀎萷\"\n      },\n      {\n        \"id\": \"096e1d115109e77749347a8051ebda3d\",\n        \"parentId\": \"ad4dd173da3941cdbaf9141837c95267\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2135-06-24 10:04:19\",\n        \"receive_time\": \"2261-02-26 15:26:35\",\n        \"dd_num\": \"263480553228\",\n        \"departure_time\": \"2117-06-04 21:54:05\",\n        \"work_begin_time\": \"2282-11-30 18:35:06\",\n        \"work_end_time\": \"2036-09-08 01:12:35\",\n        \"return_time\": \"2182-11-20 00:56:35\",\n        \"auxiliary_time\": \"2235-10-26 17:19:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 620,\n        \"task_content\": \"儒揜哅壘正猙稽餙瞧驣榁齰泔嬢揾剧籦颐谇构蒱娈撃駸蓺霁坁匽钯尽殿檞尟詻抚簫炊凘裔铯愒昘燽暣湽登酭韁淤溰羍\"\n      },\n      {\n        \"id\": \"ac18a618c8dc42137118145a51253fe7\",\n        \"parentId\": \"ad4dd173da3941cdbaf9141837c95267\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1974-06-29 01:52:07\",\n        \"receive_time\": \"2229-12-16 22:54:47\",\n        \"dd_num\": \"655722616368\",\n        \"departure_time\": \"2219-03-23 22:33:18\",\n        \"work_begin_time\": \"2148-01-24 23:37:55\",\n        \"work_end_time\": \"2083-01-24 09:04:43\",\n        \"return_time\": \"2283-07-22 10:00:20\",\n        \"auxiliary_time\": \"2024-03-16 00:34:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 103,\n        \"task_content\": \"夎丙貿諩菛泬浊蔧飀菣库齍埚塰蝺丝煤歝嵛嫍吟澮塉謨嶈颭湵旊噕忩耕怱奬钖發率剥峂邗邵働鯻潣伄伡貘婅噽蓐餵雖彃冱窸鞱劸癯窭攞\"\n      },\n      {\n        \"id\": \"86a04a00eaeb9d3bc9d010f0d543052d\",\n        \"parentId\": \"ad4dd173da3941cdbaf9141837c95267\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2220-09-25 02:11:49\",\n        \"receive_time\": \"2281-02-07 17:18:34\",\n        \"dd_num\": \"347660504121\",\n        \"departure_time\": \"2107-07-22 15:17:08\",\n        \"work_begin_time\": \"2160-01-19 13:50:57\",\n        \"work_end_time\": \"2137-05-03 14:39:57\",\n        \"return_time\": \"2188-09-18 17:00:59\",\n        \"auxiliary_time\": \"2055-12-16 08:40:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 246,\n        \"task_content\": \"赪貤儀捪邟椼炕悤鋦茔筐鱦蜏蛔嚼竒壂氲匋茠帰瓎毢喼辈鞵壳賄禕龍緸阚摻肕尷硍麫訲弶輯搄诺赞箙鼬逿礲綆鰆膁嶠獖萸汶肈迵獛悲鉕頾瞱踣驊衂偣嚁怚贿繙奁凜炛崸焵捇邦觳辿膀窯禖夊佨誶齞毟榿翄梶洙渟畟訐火蕷\"\n      },\n      {\n        \"id\": \"5fa2e2df673eca630972f3aab9ad4fae\",\n        \"parentId\": \"ad4dd173da3941cdbaf9141837c95267\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2043-07-06 10:07:00\",\n        \"receive_time\": \"2159-09-13 01:05:42\",\n        \"dd_num\": \"645859469473\",\n        \"departure_time\": \"2138-12-30 12:45:38\",\n        \"work_begin_time\": \"2021-01-27 18:21:58\",\n        \"work_end_time\": \"2164-03-15 22:04:24\",\n        \"return_time\": \"2262-03-07 02:55:09\",\n        \"auxiliary_time\": \"2031-03-28 22:11:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 733,\n        \"task_content\": \"崀廽鹺雔栰禯訧箦鵙獤岀撬鸧袝睖鵜煆榼戔邱碍鮴掍垴嫣紮繴氩爥歈屯頙阴鲷焆觉羇堘魟歮鴰特钷躌踓葚煩罕掊鴎嵆栲颩埠\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8986b0266fa372b411c91826c17bd456\",\n    \"remarks\": \"彉焳垔溿挶便廮譿悞盙鎺柒\",\n    \"status\": \"3\",\n    \"progress\": 24,\n    \"jh_date\": \"68/01/03 1435\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"淹嗬佯\",\n    \"tug\": \"30\",\n    \"english_ship_name\": \"xwzg9u\",\n    \"call\": \"5OFRA1\",\n    \"ship_captain\": \"艾芚巶\",\n    \"ton\": 735904,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"宰闺取\",\n    \"payer_company\": \"禤銲有限公司\",\n    \"ship_company\": \"靸肉有限公司\",\n    \"begin_point\": \"鰎鍜\",\n    \"end_point\": \"男椴\",\n    \"route\": \"第 1航线\",\n    \"power\": \"44千瓦\",\n    \"dispatcher\": \"轩穓苾\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ce50f859e7437bb6d20a598673971357\",\n        \"parentId\": \"8986b0266fa372b411c91826c17bd456\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2089-08-31 19:05:44\",\n        \"receive_time\": \"2102-03-07 22:59:10\",\n        \"dd_num\": \"940707421549\",\n        \"departure_time\": \"2262-09-26 04:56:04\",\n        \"work_begin_time\": \"2151-09-13 05:39:35\",\n        \"work_end_time\": \"2217-09-03 02:31:09\",\n        \"return_time\": \"2087-03-30 13:45:20\",\n        \"auxiliary_time\": \"2004-09-29 05:43:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 226,\n        \"task_content\": \"聫抍蹂熀鲭盰嗕牾允頩犤鬨聬苻鄱栱数蚭阙棑渻骏騬鈒稫宍碓簎牕忆緤译叛狧秹佲驨猩鄁舲綡紶覕\"\n      },\n      {\n        \"id\": \"f0e16c9276f6c591eeca7d851503d3c5\",\n        \"parentId\": \"8986b0266fa372b411c91826c17bd456\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2194-10-31 15:35:33\",\n        \"receive_time\": \"2069-04-03 03:55:29\",\n        \"dd_num\": \"417832227295\",\n        \"departure_time\": \"2268-03-09 16:59:09\",\n        \"work_begin_time\": \"2220-02-09 00:21:29\",\n        \"work_end_time\": \"2014-11-09 12:58:49\",\n        \"return_time\": \"2197-06-20 16:38:32\",\n        \"auxiliary_time\": \"2189-06-21 07:37:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 680,\n        \"task_content\": \"赉稍狝廓颽傧勂躅劯蕃安寗抜骠丶囋甾煂嗳吡莱棈述塭昢铅鉼堵瀓藒榿植孚鹖簥苵貼彞網珴薐郋苄匠蕜瑓鋟詂现梌痸疆矮彛臈鄪漣隽薥閿簙煢祴灔吿艤鯰撀昸殼媣觉睜薊边堕處勴乇濇湻鼹棓炗镒瀏需黎嚇棰殸希始睲侯侴覍揁龛溇姙榗嚗窬\"\n      },\n      {\n        \"id\": \"65bbc41264c3bead3570754a2c5c303f\",\n        \"parentId\": \"8986b0266fa372b411c91826c17bd456\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2131-07-19 21:24:09\",\n        \"receive_time\": \"2031-08-28 04:32:33\",\n        \"dd_num\": \"260846871570\",\n        \"departure_time\": \"2191-09-06 08:15:38\",\n        \"work_begin_time\": \"2249-10-15 17:19:13\",\n        \"work_end_time\": \"2171-01-10 17:18:18\",\n        \"return_time\": \"2234-08-08 10:48:35\",\n        \"auxiliary_time\": \"2077-02-05 13:15:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 991,\n        \"task_content\": \"疕屪漠徏嚖龜薻襻虌揙餥譋虵鎩种惛烪硖橄梽悡歱牿鶹彼藪美煔饆焃葹釠祝峟叚攷耖涕墡鹰賻骍嘈臸戍殊洵峕妶艠埫驁冩面填倸錿麄渧蕿蛛厷螿曹餥妓颙鴜垢梫癸遘懐杸芙跷瞓迸汲镑哼腚欬竦湆偃惤躕皡爁苋杮甐餔唂趦阬萆厒篕篝凶唎乐皏掠忻宄\"\n      },\n      {\n        \"id\": \"c0e525dae3dcdf9e23c432de94451b14\",\n        \"parentId\": \"8986b0266fa372b411c91826c17bd456\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2275-05-28 00:41:29\",\n        \"receive_time\": \"2113-04-20 06:24:58\",\n        \"dd_num\": \"680720525001\",\n        \"departure_time\": \"2057-12-13 03:08:56\",\n        \"work_begin_time\": \"1980-02-20 14:06:42\",\n        \"work_end_time\": \"2110-10-18 00:33:27\",\n        \"return_time\": \"2107-09-21 08:53:19\",\n        \"auxiliary_time\": \"2266-02-25 08:25:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 134,\n        \"task_content\": \"警屾尵猃躧荕巺贈运偧酧箛脬藕它僶媛娑竢塝篃閲浣胐潂琓轴魁忑侞鍖烘没祖侱墨剱蔴觗誻魭淽藱粓錳雸瞅翼褝燺趝俋\"\n      },\n      {\n        \"id\": \"3f718f2dfbe2e2425f16a1fd0b3a5c08\",\n        \"parentId\": \"8986b0266fa372b411c91826c17bd456\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2282-05-02 15:21:46\",\n        \"receive_time\": \"2074-06-30 18:37:39\",\n        \"dd_num\": \"099739579979\",\n        \"departure_time\": \"2280-01-10 21:38:52\",\n        \"work_begin_time\": \"2078-02-02 02:06:53\",\n        \"work_end_time\": \"2260-01-20 03:54:50\",\n        \"return_time\": \"2158-10-11 11:37:42\",\n        \"auxiliary_time\": \"2018-06-20 22:01:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 738,\n        \"task_content\": \"遅勣鷥岹蓤惏萨糶譔秦梥辦豊鑾螨葼誷汱灢炗湗愣盖椛篴妸藷鋈鄗尧匣麓虣裐劔鹇棰妦刣冸鳢縢焁荋薮胎翲筶惿弦菥笭皬垳劾粇遽卽亨嵔唱膧\"\n      },\n      {\n        \"id\": \"5046805c4544175bd2530cac6560e86e\",\n        \"parentId\": \"8986b0266fa372b411c91826c17bd456\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2272-09-17 04:37:31\",\n        \"receive_time\": \"1984-03-07 11:32:31\",\n        \"dd_num\": \"151669605905\",\n        \"departure_time\": \"1971-07-21 03:25:49\",\n        \"work_begin_time\": \"2101-07-30 01:47:18\",\n        \"work_end_time\": \"1993-04-01 09:07:36\",\n        \"return_time\": \"2265-06-07 10:29:44\",\n        \"auxiliary_time\": \"2210-08-08 03:12:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 717,\n        \"task_content\": \"復奍晔樝雂蜆皁懮姣曱較物偏孑緬灐霖箜趪訬嬮鎌啟猜郿债妫裐豬骤蘌亍錅躷讞蝟腦卋麃坰俍碁綱穩撊宋伊寢穗鶓癀痈迉择櫳掆烧眗腄嘶轫龇匈懂醠扻窽硶遭净靄憔嘗掭讓鉇躴爇曨僲投妆艄砼圄缍楿烥怋槩\"\n      },\n      {\n        \"id\": \"b6006d3c579afc1edd3984c7d1b41ac5\",\n        \"parentId\": \"8986b0266fa372b411c91826c17bd456\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2223-08-09 20:37:39\",\n        \"receive_time\": \"2063-07-11 20:48:09\",\n        \"dd_num\": \"919605072729\",\n        \"departure_time\": \"2174-01-08 16:52:22\",\n        \"work_begin_time\": \"2033-08-14 20:05:26\",\n        \"work_end_time\": \"2118-04-09 22:21:56\",\n        \"return_time\": \"1993-03-15 14:05:13\",\n        \"auxiliary_time\": \"2060-10-17 21:32:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 927,\n        \"task_content\": \"肍尵鹠隖婼冴暦穰嚔旒覯玏酹歲嚇凗锳琏湇氰剪鴲鐪澛拼府岓拇珻蝒氡鸊锇豈嗼蝚苞慤樛\"\n      },\n      {\n        \"id\": \"b936d4167bbbfd3dc1f2c6035be360dc\",\n        \"parentId\": \"8986b0266fa372b411c91826c17bd456\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2074-01-13 07:46:12\",\n        \"receive_time\": \"2058-02-17 02:50:43\",\n        \"dd_num\": \"245359500934\",\n        \"departure_time\": \"2214-03-30 04:43:07\",\n        \"work_begin_time\": \"2010-01-12 04:01:48\",\n        \"work_end_time\": \"2114-09-09 16:51:18\",\n        \"return_time\": \"2267-05-02 08:03:07\",\n        \"auxiliary_time\": \"2139-05-28 15:00:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 591,\n        \"task_content\": \"峟箖另睥虲蒚蠑岜蚼個憘漡怩梌餲狡歭瘰酦鎢缀喖法單揦墅濨靐样珘帲棍語蒿滎磀莘笲鬷瓱霑剑闤竻誡餆醲貐摘綅贈陑葒躗虿椰溘显蠬氥蒙过摑油尻懿姉\"\n      },\n      {\n        \"id\": \"68414cc1743cd6232152f9333c0204b5\",\n        \"parentId\": \"8986b0266fa372b411c91826c17bd456\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2015-05-04 14:28:52\",\n        \"receive_time\": \"2262-04-21 08:27:33\",\n        \"dd_num\": \"482303902781\",\n        \"departure_time\": \"2069-07-04 15:30:26\",\n        \"work_begin_time\": \"2238-08-28 17:21:52\",\n        \"work_end_time\": \"2059-11-28 00:07:21\",\n        \"return_time\": \"2190-06-22 22:16:03\",\n        \"auxiliary_time\": \"2102-08-10 06:26:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 931,\n        \"task_content\": \"蝖鶶讟糾廠导僔諾鹆衆綜皎鮩奤吵蝏灼餫惑簑阴濍誌休騃蒶褣蕬痫扉馤硈鼭邘虪厦蹵卧咤氋郳贐灞麰烞惷噺细宷詞臏謰逫痽曍埠辢簫抈莆梧礗恞噚镖廄巆齭雙昍\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1ff483d4a0c1d99c3668bb54e068eee0\",\n    \"remarks\": \"羈煰漁鬧听呝藤錇狺輅妋鰎\",\n    \"status\": \"5\",\n    \"progress\": 73,\n    \"jh_date\": \"63/12/06 1616\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"三耻锱\",\n    \"tug\": \"41\",\n    \"english_ship_name\": \"viikp8\",\n    \"call\": \"0LBFGN\",\n    \"ship_captain\": \"宗悠綆\",\n    \"ton\": 52713,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"尤喪\",\n    \"payer_company\": \"聇硼有限公司\",\n    \"ship_company\": \"萎闗有限公司\",\n    \"begin_point\": \"你璂\",\n    \"end_point\": \"憃樵\",\n    \"route\": \"第 9航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"池搰鏓\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ee572ca67d0e7e1900995fbe306c42e5\",\n        \"parentId\": \"1ff483d4a0c1d99c3668bb54e068eee0\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2251-09-30 08:53:06\",\n        \"receive_time\": \"2043-12-23 17:27:41\",\n        \"dd_num\": \"929234226657\",\n        \"departure_time\": \"2009-06-21 18:06:41\",\n        \"work_begin_time\": \"2114-12-30 17:47:12\",\n        \"work_end_time\": \"2058-08-26 05:17:49\",\n        \"return_time\": \"2125-05-06 05:16:27\",\n        \"auxiliary_time\": \"2274-05-11 04:18:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 221,\n        \"task_content\": \"鋟抽煗輦鄱电飰佝洃砈楿驍紞咺衶俰蹛澳暱鈓倄嚲呚嫼庄福隓朳喖幖魽贶糮婝矊衉縔闎雽篞圷屴鉈鯔\"\n      },\n      {\n        \"id\": \"b88cdf5ed536c456b7baa3fc8f50db66\",\n        \"parentId\": \"1ff483d4a0c1d99c3668bb54e068eee0\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2049-07-03 10:11:12\",\n        \"receive_time\": \"1980-05-24 20:26:28\",\n        \"dd_num\": \"793301428257\",\n        \"departure_time\": \"2222-09-24 14:20:41\",\n        \"work_begin_time\": \"2283-11-25 18:09:56\",\n        \"work_end_time\": \"2117-08-13 05:19:31\",\n        \"return_time\": \"2026-10-01 16:56:20\",\n        \"auxiliary_time\": \"2232-04-01 20:28:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 946,\n        \"task_content\": \"壱戮貇儙鵻蠌燲痂澲搜竳欲夽抱浵郰催潅蔨僆纲姅惧踏兒膪屪敨陦崜怮弄塛擅蜨靈彇瓟垫疲烑\"\n      },\n      {\n        \"id\": \"c5f36f1b72a06e95f3d91819b9b44214\",\n        \"parentId\": \"1ff483d4a0c1d99c3668bb54e068eee0\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2052-10-11 17:37:50\",\n        \"receive_time\": \"2062-09-16 07:37:52\",\n        \"dd_num\": \"213350703216\",\n        \"departure_time\": \"2009-10-01 10:25:34\",\n        \"work_begin_time\": \"2145-11-10 20:55:15\",\n        \"work_end_time\": \"2158-01-28 10:24:58\",\n        \"return_time\": \"2195-11-24 12:09:33\",\n        \"auxiliary_time\": \"1992-11-12 16:16:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 717,\n        \"task_content\": \"勝袆铀颏倽琛衰爝妣垓泥饋疃諵晴黝婡輗顖茙蚻怄咰訸颈遒檋憧乿菧珬愶钥糡鉠鬺堮漷烃絙銆沗飢叆唾蒍蕴豌煠繶怃岶啄荼鄩莀魁协蠉慕挓坿鏱跕瘒觭黦刡雱罈隫亘檷趜萅京藳蓌閳兂檐仰鮯闆讴紭閚銝芲\"\n      },\n      {\n        \"id\": \"f7d4fc49340217ad3246578d0014ecd1\",\n        \"parentId\": \"1ff483d4a0c1d99c3668bb54e068eee0\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2212-11-22 16:21:03\",\n        \"receive_time\": \"2270-12-04 14:09:25\",\n        \"dd_num\": \"581311720553\",\n        \"departure_time\": \"2127-10-15 09:02:37\",\n        \"work_begin_time\": \"2090-03-26 02:24:48\",\n        \"work_end_time\": \"2198-02-08 01:25:03\",\n        \"return_time\": \"2100-02-24 22:29:41\",\n        \"auxiliary_time\": \"2145-12-06 17:15:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 816,\n        \"task_content\": \"睉睖氇闒蚩撇療皜檚嘬荹湃孞陓墺殚廢摳祆絆塜貮飴郄\"\n      },\n      {\n        \"id\": \"20a92727aaac5a026b3ed56ad264b268\",\n        \"parentId\": \"1ff483d4a0c1d99c3668bb54e068eee0\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2208-12-27 15:41:00\",\n        \"receive_time\": \"2018-07-03 04:51:45\",\n        \"dd_num\": \"126507028091\",\n        \"departure_time\": \"2037-02-13 19:38:25\",\n        \"work_begin_time\": \"2178-11-16 19:44:27\",\n        \"work_end_time\": \"2221-04-09 22:05:05\",\n        \"return_time\": \"2268-02-01 04:09:59\",\n        \"auxiliary_time\": \"2043-06-29 11:00:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 626,\n        \"task_content\": \"捽剙姗鐧圌銊嘲輺蝿蘅襡獱茴頥嵂衣蚬誹螠搄鎓抜赼鼇夲鮂岮辟燩镌猃孞榀歷縆欧啽慬圥購洐渉濤嗸順槀較絞侹蹒楅戅腹駖鞑汑螚\"\n      }\n    ]\n  },\n  {\n    \"id\": \"336e3ba24cd5c54de0d416c5c83811fc\",\n    \"remarks\": \"窱隭雠篥勪濩錍叞楿岿逷饼\",\n    \"status\": \"7\",\n    \"progress\": 62,\n    \"jh_date\": \"55/01/30 0712\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"寻藙鼢\",\n    \"tug\": \"69\",\n    \"english_ship_name\": \"n06rcg\",\n    \"call\": \"YL0CZM\",\n    \"ship_captain\": \"仲袝渠\",\n    \"ton\": 934973,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"越僺\",\n    \"payer_company\": \"庶卹有限公司\",\n    \"ship_company\": \"鹍崎有限公司\",\n    \"begin_point\": \"絥游\",\n    \"end_point\": \"睘凩\",\n    \"route\": \"第 5航线\",\n    \"power\": \"54千瓦\",\n    \"dispatcher\": \"杜昔楷\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"4fb5f1a5215a09151f60ec92d5a68399\",\n        \"parentId\": \"336e3ba24cd5c54de0d416c5c83811fc\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2269-11-30 07:39:24\",\n        \"receive_time\": \"2273-07-21 18:51:34\",\n        \"dd_num\": \"576078854767\",\n        \"departure_time\": \"2158-04-28 20:47:22\",\n        \"work_begin_time\": \"2194-12-16 08:05:58\",\n        \"work_end_time\": \"1999-03-20 10:49:19\",\n        \"return_time\": \"1981-07-06 03:40:46\",\n        \"auxiliary_time\": \"2284-06-30 10:08:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 893,\n        \"task_content\": \"蒑旁坺繏稐嚪咱闀薂脡梃薨纽娿族蘌蛖勱说酿煁萋哓戼媑鶣蛢巈熺逊右绣矒羸陭剱隲媟蚚吤釳絏枱餻晧藿艕僯聐髣虶楤粛稌癭軥鼃虛嬩穨訲蜎迄犮瓫歟謉爳襂豺侮埇骶鐓皩瞅鐦嬡嚯觅充蹕嬾摨鏿萯攱肗嵦毆憓鮟驢諒赽\"\n      },\n      {\n        \"id\": \"f698a48dae0a0895873823e89acc0fc5\",\n        \"parentId\": \"336e3ba24cd5c54de0d416c5c83811fc\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2175-05-31 02:41:36\",\n        \"receive_time\": \"2189-01-15 22:53:21\",\n        \"dd_num\": \"383873177938\",\n        \"departure_time\": \"2099-07-01 02:15:24\",\n        \"work_begin_time\": \"2050-09-03 04:06:59\",\n        \"work_end_time\": \"2231-08-16 00:32:35\",\n        \"return_time\": \"2281-03-30 06:08:15\",\n        \"auxiliary_time\": \"2217-10-21 17:29:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 275,\n        \"task_content\": \"杓煀褚蚣垮代囄僧柲懠忰筣嘭绦鬝菠纃鞘脧鰡驘书筽泣釫鳲噡茙袳苬鏓戦秉鏍鹬鯇瓱飰虐挗髁岯濣階鄯磛牟救鏭邧壻謙捈熧曲瓮谮鵉靊埦雁竢蔺罘猧寎猸蝵壃叿擱覛炤慜瞹鐬媄扷洵缥邉廡\"\n      },\n      {\n        \"id\": \"b2d6113c199ff7c8a4d357d77f431a99\",\n        \"parentId\": \"336e3ba24cd5c54de0d416c5c83811fc\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2142-03-20 12:55:20\",\n        \"receive_time\": \"2009-10-11 23:44:07\",\n        \"dd_num\": \"220699155976\",\n        \"departure_time\": \"2021-07-10 01:24:11\",\n        \"work_begin_time\": \"2201-09-17 04:22:24\",\n        \"work_end_time\": \"2189-02-22 11:52:38\",\n        \"return_time\": \"2104-02-21 17:49:18\",\n        \"auxiliary_time\": \"2192-02-17 11:47:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 314,\n        \"task_content\": \"阮澧単飔傦窢膙诲初耀搔菤绍奩拎氰枤犋汍篙电龖堫膥蒞梩骪窈偾\"\n      },\n      {\n        \"id\": \"71be3dcd921bf846052398ebef58a1f1\",\n        \"parentId\": \"336e3ba24cd5c54de0d416c5c83811fc\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2208-06-27 17:12:41\",\n        \"receive_time\": \"2186-12-02 10:49:42\",\n        \"dd_num\": \"010065889706\",\n        \"departure_time\": \"2137-08-23 06:26:29\",\n        \"work_begin_time\": \"2180-05-14 16:24:00\",\n        \"work_end_time\": \"2118-08-21 01:19:38\",\n        \"return_time\": \"2225-06-25 23:01:07\",\n        \"auxiliary_time\": \"2096-11-10 14:15:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 259,\n        \"task_content\": \"訹犵惥鷗劷僀灢聠釖颗窱砘蘸捺匚袆譽卓赻睜刿終藵穸盿蹮攋獨脙儱蒛嚣搙繝糃鰼澁淵坌菴萑隺窢稴邿哜梸姃鳔\"\n      },\n      {\n        \"id\": \"4ac2b40aa165393bdf3f1214b3d87b21\",\n        \"parentId\": \"336e3ba24cd5c54de0d416c5c83811fc\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2098-01-31 17:26:19\",\n        \"receive_time\": \"2155-12-31 02:03:58\",\n        \"dd_num\": \"965129676222\",\n        \"departure_time\": \"2003-04-27 10:35:43\",\n        \"work_begin_time\": \"2041-03-05 19:23:20\",\n        \"work_end_time\": \"2200-02-20 10:13:27\",\n        \"return_time\": \"2120-01-16 15:06:58\",\n        \"auxiliary_time\": \"2020-09-10 16:29:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 637,\n        \"task_content\": \"囟窂嗿頢鲛傿蒚膝潎煷嚫傣膉璒梈騼坒髫嚴窃徶窧刪騿玛阰犛鲝南璐癴夤鯳苡喂懖淜燆冰鞨誺癉炨瀮彧釗萝缊衹朝檄弌郅萴鼗妭儨竜鴇冻覰憅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4d28ca85de5354f05946312166a47470\",\n    \"remarks\": \"蘣隋喋韦岑舗渼痃愠鋖沘堘\",\n    \"status\": \"0\",\n    \"progress\": 66,\n    \"jh_date\": \"99/11/30 2328\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"忲夊璜\",\n    \"tug\": \"30\",\n    \"english_ship_name\": \"2tooxl\",\n    \"call\": \"WPP1U4\",\n    \"ship_captain\": \"丰搳瀪\",\n    \"ton\": 126108,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"单逭\",\n    \"payer_company\": \"睇拒有限公司\",\n    \"ship_company\": \"圦鼛有限公司\",\n    \"begin_point\": \"诽晣\",\n    \"end_point\": \"坩絯\",\n    \"route\": \"第 10航线\",\n    \"power\": \"55千瓦\",\n    \"dispatcher\": \"双实\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"1fe6fc7862ef16403e256d59497c284e\",\n        \"parentId\": \"4d28ca85de5354f05946312166a47470\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2134-09-20 10:34:08\",\n        \"receive_time\": \"2265-10-29 21:22:40\",\n        \"dd_num\": \"524273191073\",\n        \"departure_time\": \"2055-11-10 08:48:22\",\n        \"work_begin_time\": \"2015-05-01 18:45:33\",\n        \"work_end_time\": \"2037-03-19 20:03:12\",\n        \"return_time\": \"2069-12-03 08:54:39\",\n        \"auxiliary_time\": \"2061-05-07 07:28:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 402,\n        \"task_content\": \"叇鋹靯廩梖瘾鉕獨捧煹鄳臱蘪炘蒩棄杁蒘睾鼖咩魢荧養諹穀嫄猝婶摢蚆叁蕹揓磽徯粷罦擀鲂渲篔棑鵘慜眾錻盚煹旚砰抑鎩袥簷橛网託榤鄌皨骷躺熞鼣\"\n      },\n      {\n        \"id\": \"f5d6b41a5c957ee6b11a96e18f37d47a\",\n        \"parentId\": \"4d28ca85de5354f05946312166a47470\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1977-06-05 11:39:29\",\n        \"receive_time\": \"2041-12-24 13:02:23\",\n        \"dd_num\": \"236905192660\",\n        \"departure_time\": \"2110-05-12 19:56:31\",\n        \"work_begin_time\": \"2235-01-29 15:06:12\",\n        \"work_end_time\": \"2149-05-20 13:09:35\",\n        \"return_time\": \"2197-01-26 18:14:43\",\n        \"auxiliary_time\": \"1978-08-27 04:01:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 150,\n        \"task_content\": \"鷋澧貑嬏茏墛烤趔梘诚塔楪剈嗬鹒鐗萤陃鄎邴宖聅蒏戻倬喲烂豺矺驾峆鶃琯磰釲駱携熧誚笭肥垧中暶钝絉偙鋫钪锒穝购驂餷鲌豀跚琛馣贕\"\n      },\n      {\n        \"id\": \"c50d904f00e05a0cf4612cd66ce505d1\",\n        \"parentId\": \"4d28ca85de5354f05946312166a47470\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2021-08-02 02:59:30\",\n        \"receive_time\": \"2110-12-19 19:51:59\",\n        \"dd_num\": \"516364820327\",\n        \"departure_time\": \"2245-07-24 23:23:55\",\n        \"work_begin_time\": \"2114-05-23 06:07:44\",\n        \"work_end_time\": \"2042-09-10 07:59:58\",\n        \"return_time\": \"2112-11-20 10:32:04\",\n        \"auxiliary_time\": \"2113-01-28 14:15:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 688,\n        \"task_content\": \"鲶摱穬疴褟堇讁丛潨愸牑瞁蓺濘拲菲孿藛諍趓勄怱籛夼嗭粳塴袿励也畕擦吚盜蝟朑殌蜷殪庖蹜荻洿霑嶿慊接焞砊崕匳鵦妧栻戍薝諉裉鬫浹皺啂縍陔对校碷剠膺岪禒侴栮輮曗\"\n      },\n      {\n        \"id\": \"9c771edf051c37f7d2a2f2f6f9f5f013\",\n        \"parentId\": \"4d28ca85de5354f05946312166a47470\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2113-12-15 01:02:11\",\n        \"receive_time\": \"2044-03-24 11:06:26\",\n        \"dd_num\": \"191334824662\",\n        \"departure_time\": \"2196-04-17 21:52:28\",\n        \"work_begin_time\": \"2199-12-12 14:14:27\",\n        \"work_end_time\": \"2229-06-26 11:45:36\",\n        \"return_time\": \"2218-05-04 13:04:16\",\n        \"auxiliary_time\": \"2178-12-18 05:08:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 909,\n        \"task_content\": \"惬四垢鐰祁徝嗓鄏燮魍掛瑴火螟会堛契勼歄攷娒穫炧攅釮谾台仅玢暽铒鹡蟪皳倞臬憋陘蝁阦達鄴仏揘墑囯皯樆凉毜\"\n      },\n      {\n        \"id\": \"9bfff33ff1a5e987ad943f65919ae559\",\n        \"parentId\": \"4d28ca85de5354f05946312166a47470\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2013-01-22 15:55:04\",\n        \"receive_time\": \"1988-06-26 07:56:11\",\n        \"dd_num\": \"595320067983\",\n        \"departure_time\": \"2196-09-22 17:23:43\",\n        \"work_begin_time\": \"2249-07-30 21:50:09\",\n        \"work_end_time\": \"2155-08-09 22:55:39\",\n        \"return_time\": \"2071-04-03 16:47:17\",\n        \"auxiliary_time\": \"2088-12-08 19:03:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 351,\n        \"task_content\": \"叕述歾\"\n      }\n    ]\n  },\n  {\n    \"id\": \"649b7e0c1a516d1d6529f7d47704e38d\",\n    \"remarks\": \"煗焣渝偲鵉睦礴簧詡袗甛弛\",\n    \"status\": \"9\",\n    \"progress\": 32,\n    \"jh_date\": \"23/05/11 1656\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"啳僞椿\",\n    \"tug\": \"71\",\n    \"english_ship_name\": \"a8s2ne\",\n    \"call\": \"CP96LS\",\n    \"ship_captain\": \"宗赾\",\n    \"ton\": 784251,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"翁苔切\",\n    \"payer_company\": \"揘囇有限公司\",\n    \"ship_company\": \"焈斆有限公司\",\n    \"begin_point\": \"讌耏\",\n    \"end_point\": \"晩裝\",\n    \"route\": \"第 9航线\",\n    \"power\": \"43千瓦\",\n    \"dispatcher\": \"辕橼\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"45159e3dd654bb2c36810c3220922f7b\",\n        \"parentId\": \"649b7e0c1a516d1d6529f7d47704e38d\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2143-10-12 02:28:19\",\n        \"receive_time\": \"2123-07-10 16:25:01\",\n        \"dd_num\": \"268040310525\",\n        \"departure_time\": \"2189-08-23 22:48:07\",\n        \"work_begin_time\": \"2136-07-04 08:41:42\",\n        \"work_end_time\": \"2271-03-08 01:58:41\",\n        \"return_time\": \"2215-01-20 04:30:37\",\n        \"auxiliary_time\": \"2282-10-30 16:41:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 878,\n        \"task_content\": \"愁蘚緼廞别眛粘恪剋砘歫浻膵聄咟仇啈限谴帗暾夀茫憧爏鉟濲矕貲起骗祝蚙舾胟洨眀牱墭墱唧佟巠八艺颥挼缇琫痱扞劒籯郭难硺橣恲縥槉瑡撶曈諁筨箜砛疴紉戋夸僂羀謟谓掝郳雇輾廴湾蝰纳跤嘎剉譞頰睽檩忇秱釻期夦陬緔閿積荡苦凧僩芆宛灺砿\"\n      },\n      {\n        \"id\": \"b02d00e80a403d89aec603fe3e6c66e7\",\n        \"parentId\": \"649b7e0c1a516d1d6529f7d47704e38d\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2151-01-19 23:40:39\",\n        \"receive_time\": \"2036-11-24 21:23:29\",\n        \"dd_num\": \"985710461592\",\n        \"departure_time\": \"2206-09-05 09:53:37\",\n        \"work_begin_time\": \"2207-11-07 02:12:29\",\n        \"work_end_time\": \"2145-09-20 11:24:46\",\n        \"return_time\": \"2195-10-03 17:30:03\",\n        \"auxiliary_time\": \"2276-05-03 22:25:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 938,\n        \"task_content\": \"忱翹樓搴续舧驁椪檖氧姧无甆玾与筏挺鏙狠喬伟望鄼謪嫶嘢裞糩愢踐铊宦朼瞮寀瑫萙鐵剰熻哨鷊髺型蛢緒繕鋅纆惑姱煤捤憇欹雳婋珬裓黌綆蚑逡鋑挊员撼寉鬠軩灅蟞籷穁晊硴駳塭亂蘟陫鶘幗奊悳\"\n      },\n      {\n        \"id\": \"61a1baa21c3b3b3b5257578fe0a80ccf\",\n        \"parentId\": \"649b7e0c1a516d1d6529f7d47704e38d\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2018-11-10 09:13:08\",\n        \"receive_time\": \"1978-05-19 22:07:00\",\n        \"dd_num\": \"937886008512\",\n        \"departure_time\": \"1989-04-08 17:09:33\",\n        \"work_begin_time\": \"2099-11-11 05:28:36\",\n        \"work_end_time\": \"2040-10-25 05:39:44\",\n        \"return_time\": \"2153-01-01 19:50:42\",\n        \"auxiliary_time\": \"2151-06-06 04:57:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 358,\n        \"task_content\": \"砲情马恌皏箌穼觫齻畾洢岾秏徏悫翇祀耜溎闶樰瘶敞谐齯玊誉碡頦叓瀒鬺塙鑣梌嫧檭穒慪抺魔耎鍂損仪邞鰇鸤鑁鰗杔\"\n      },\n      {\n        \"id\": \"7a446211a1756e41b7b654e30961d017\",\n        \"parentId\": \"649b7e0c1a516d1d6529f7d47704e38d\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2211-10-15 04:36:47\",\n        \"receive_time\": \"2039-01-11 10:44:22\",\n        \"dd_num\": \"738203741470\",\n        \"departure_time\": \"2143-09-19 12:03:36\",\n        \"work_begin_time\": \"2028-02-17 08:27:02\",\n        \"work_end_time\": \"2183-12-22 21:49:44\",\n        \"return_time\": \"2208-11-02 22:56:33\",\n        \"auxiliary_time\": \"2276-10-09 10:47:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 220,\n        \"task_content\": \"坉粶权筍蘖蜌囟緯鈑篝殌鍡哶柯螐舆幀跐匦屝郿豢楂淬皴曟噬咪宂喻涽顢轙鼸籚嶯旴耍蝈諏舎聎秨鉡塧倡艳皅秋琔莍紜壧蹟梩逃锐覉墜擊侢犦嶕戄骬臯桑渨坳擦瓤缅絆蔎簡腛\"\n      },\n      {\n        \"id\": \"fd7602c28423453bbaf7f67fb34ffc68\",\n        \"parentId\": \"649b7e0c1a516d1d6529f7d47704e38d\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-04-09 18:04:54\",\n        \"receive_time\": \"2095-07-16 08:44:30\",\n        \"dd_num\": \"122398331491\",\n        \"departure_time\": \"2073-02-28 19:36:20\",\n        \"work_begin_time\": \"2001-03-28 22:49:12\",\n        \"work_end_time\": \"2165-05-25 01:20:17\",\n        \"return_time\": \"1994-12-01 10:12:08\",\n        \"auxiliary_time\": \"2229-05-14 18:23:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 437,\n        \"task_content\": \"棤厢槕匄旁蹝泈缪烺晥糹杘买尸膽叺羕蠟咱躭劎航农椲涥抣穲蓮棾衋弶叡磰琛玴篁着碧曲鷮惓曑蠉蕃炞议譼镤\"\n      },\n      {\n        \"id\": \"8a771c5f9a7948bd75b0e6ea3ebbabe0\",\n        \"parentId\": \"649b7e0c1a516d1d6529f7d47704e38d\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2226-10-03 00:32:09\",\n        \"receive_time\": \"2267-01-19 20:59:51\",\n        \"dd_num\": \"304427081317\",\n        \"departure_time\": \"2173-12-06 02:15:42\",\n        \"work_begin_time\": \"1998-03-13 11:57:58\",\n        \"work_end_time\": \"2153-08-09 21:36:30\",\n        \"return_time\": \"2270-03-02 13:11:16\",\n        \"auxiliary_time\": \"2184-06-13 13:45:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 855,\n        \"task_content\": \"珹箉捧醠奕桮拀地珕窕埔闛搴兕碪夥想姟枢瑵綆誈頾鐑屠萶翴僒門騞偽旭椊納閣盯穓勾盺圷熹敁妧亄瑗盞曶閍梜邝楞潍蜐傪倬僄姦紝葲骸儑鰄蕇汾揢瘻廖柝徒琄媼箠聄韭宨夀蔨錐觤祄琰癎磉縣浿鐽塆臧才\"\n      },\n      {\n        \"id\": \"df14d3b558d71ed95c9e3e0adb6854b6\",\n        \"parentId\": \"649b7e0c1a516d1d6529f7d47704e38d\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2118-12-14 22:09:05\",\n        \"receive_time\": \"2217-04-06 13:47:32\",\n        \"dd_num\": \"646844885912\",\n        \"departure_time\": \"2191-07-01 03:21:59\",\n        \"work_begin_time\": \"2233-09-17 05:30:38\",\n        \"work_end_time\": \"2158-11-17 08:02:45\",\n        \"return_time\": \"2238-01-11 10:10:22\",\n        \"auxiliary_time\": \"1978-01-22 14:13:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 185,\n        \"task_content\": \"厬醩秳谌馐轣泠奮璥豩浓紖迺絁洓曎點壊紨掕榻炉獑奜矽攩昳噦燼菜炰噞顩轜跆栨焜甪栆勧韙虾瓅倎憎乎後妉圎寅脭贈珝埾倐藒葦鱅盳卾哞鲷盰蜜禥訍閌螭廳帍嘰拼撘聭煤蝇玴鉶婊犔乢肊桷制蠓陠謵矽稧斋綩讆錫堕娚迶嬂宓镸朥罗礩綮秫錖獆螆麻蕘淟\"\n      },\n      {\n        \"id\": \"6afcd452b00c1e77848c683c76166966\",\n        \"parentId\": \"649b7e0c1a516d1d6529f7d47704e38d\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2155-08-20 08:37:42\",\n        \"receive_time\": \"2104-01-23 14:15:29\",\n        \"dd_num\": \"791400393510\",\n        \"departure_time\": \"2061-11-11 22:51:26\",\n        \"work_begin_time\": \"2222-12-20 08:12:13\",\n        \"work_end_time\": \"2122-02-15 14:18:52\",\n        \"return_time\": \"2267-07-22 23:55:48\",\n        \"auxiliary_time\": \"2002-05-10 01:04:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 580,\n        \"task_content\": \"鼅阉瀂椪稲螋爎笟鯘憒諮亿羀鸽鲯柧傋鹉焗昨鍺輨鬶嬮鉥宠攢幵镹雾偳瘃眆仱飳琮侦鱟渂砿欻垑犝缳卲沑枧燡驌諶惠闇灴帨炥亽撓茅琉簌搵邤姹坨盜泀瑲窙鯦摑卸塃笌咪欳揞膈絀洨僻唤抷谽圏掼\"\n      },\n      {\n        \"id\": \"23f7e2abba928c03a161fe989f88cd26\",\n        \"parentId\": \"649b7e0c1a516d1d6529f7d47704e38d\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2046-11-19 07:44:11\",\n        \"receive_time\": \"2058-01-23 17:14:31\",\n        \"dd_num\": \"897207922349\",\n        \"departure_time\": \"1992-10-24 13:06:28\",\n        \"work_begin_time\": \"2173-11-29 08:22:28\",\n        \"work_end_time\": \"1975-05-07 02:11:49\",\n        \"return_time\": \"2246-12-24 09:25:13\",\n        \"auxiliary_time\": \"2148-08-22 19:56:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 121,\n        \"task_content\": \"砭榊澵蚡祾堌铡鸵舰觧泼工脴襑叫羇積選龛察村氺麓彄汽騐赦惭跇喟魧脑猴毋緑珩瑂彮眗涾拃癞魖啪溦訽蝭樐捷珚妥烆藡葢珄籔顽甋硽絭濿蝟瓽鶟葎紛俩\"\n      }\n    ]\n  },\n  {\n    \"id\": \"862c9ba01fe31ab4c7979c642becf356\",\n    \"remarks\": \"秼誛腋迕浡釒舩氬改漧彖太\",\n    \"status\": \"4\",\n    \"progress\": 64,\n    \"jh_date\": \"95/08/13 1927\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"騈煼孿\",\n    \"tug\": \"60\",\n    \"english_ship_name\": \"eokb7c\",\n    \"call\": \"13MNIN\",\n    \"ship_captain\": \"幸鼌蕠\",\n    \"ton\": 621811,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"时鞎\",\n    \"payer_company\": \"异綹有限公司\",\n    \"ship_company\": \"甮戃有限公司\",\n    \"begin_point\": \"嬊蜺\",\n    \"end_point\": \"枳鬝\",\n    \"route\": \"第 9航线\",\n    \"power\": \"37千瓦\",\n    \"dispatcher\": \"刁噥\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"996098c0714888fd7c5e925162ba8ada\",\n        \"parentId\": \"862c9ba01fe31ab4c7979c642becf356\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2272-04-24 07:17:19\",\n        \"receive_time\": \"2110-07-30 17:30:17\",\n        \"dd_num\": \"071886520865\",\n        \"departure_time\": \"2012-10-25 20:10:18\",\n        \"work_begin_time\": \"2055-01-24 13:22:06\",\n        \"work_end_time\": \"2125-09-09 08:27:38\",\n        \"return_time\": \"2250-03-05 08:06:22\",\n        \"auxiliary_time\": \"2074-11-13 19:31:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 937,\n        \"task_content\": \"葯缘伒價翁墣功砹杳竔陠趁黃爧壘踍缯漵鏘絤聚蠎桂帙嵼镺兗駧皓諄退版缤煓凁奣酯緘温裀娆膭暦濭臥蠴寉鵸畬嫥铕尭獟畻靑抅蟓筷踅厠膹尻錔廔廌邋唞眣蓯篲筅癫窨囍躋摨丳鄈箩蘇廁肳主厈\"\n      },\n      {\n        \"id\": \"a3578a97bfffc86eb50835061d5e4f94\",\n        \"parentId\": \"862c9ba01fe31ab4c7979c642becf356\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2158-07-11 21:13:52\",\n        \"receive_time\": \"2115-04-03 13:54:54\",\n        \"dd_num\": \"160995690629\",\n        \"departure_time\": \"2078-10-13 23:07:38\",\n        \"work_begin_time\": \"2178-05-01 10:19:27\",\n        \"work_end_time\": \"2017-05-11 12:23:38\",\n        \"return_time\": \"1974-01-25 19:02:44\",\n        \"auxiliary_time\": \"1984-01-19 21:49:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 112,\n        \"task_content\": \"嘆単炖嗅蘂惼镓撒釳塬揫潛诿蜞廄望娿堜齻謂僾準窼桑龉鏶鶩怭櫜言鏝触帮耤奒妦恬潿髙醣璯蚮學僒丈箸该姪褍凃錢輬脇零盟牦裏嫡蛽猢較籒愠喰\"\n      },\n      {\n        \"id\": \"fd599846cf919d00efaecc0a2de32f24\",\n        \"parentId\": \"862c9ba01fe31ab4c7979c642becf356\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-11-24 07:04:34\",\n        \"receive_time\": \"2114-08-10 04:48:40\",\n        \"dd_num\": \"772852060608\",\n        \"departure_time\": \"2101-08-17 03:07:43\",\n        \"work_begin_time\": \"2250-10-21 14:57:50\",\n        \"work_end_time\": \"2072-11-30 05:48:07\",\n        \"return_time\": \"2215-12-04 12:25:39\",\n        \"auxiliary_time\": \"2201-01-30 01:03:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 295,\n        \"task_content\": \"師蘝话曶鷤齈苗匛峪嘲笍团剬练豹弽哺曀飌摈亱儍洷膳栎嶪鯡鬲刀嘂飿悂沼糩朤阿熆黡崇餑倫碹簿佾鐱兌殅\"\n      },\n      {\n        \"id\": \"50ae9f446623972de1a4a087215d2e28\",\n        \"parentId\": \"862c9ba01fe31ab4c7979c642becf356\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1988-10-02 00:41:15\",\n        \"receive_time\": \"2221-09-21 01:21:29\",\n        \"dd_num\": \"425951102935\",\n        \"departure_time\": \"2151-12-12 16:53:06\",\n        \"work_begin_time\": \"2134-10-03 02:34:50\",\n        \"work_end_time\": \"2274-01-23 10:09:36\",\n        \"return_time\": \"2139-03-24 16:39:09\",\n        \"auxiliary_time\": \"2022-05-29 06:42:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 576,\n        \"task_content\": \"鼰彂碷涣蛫讓疍糓嚚祼嬑溬秛諢撛誩鑯扽揺沌覢軑褿芡腧傲阎隔棛舤侶窻鮠禈钹漮鼂妪歓滿迗痿咎壿揱螅魒疱苄厖毶瘻翂轤\"\n      },\n      {\n        \"id\": \"0434a7f9d1b3d11f800c12a6da121dcf\",\n        \"parentId\": \"862c9ba01fe31ab4c7979c642becf356\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2071-06-11 06:45:35\",\n        \"receive_time\": \"2030-06-18 15:52:42\",\n        \"dd_num\": \"012578945662\",\n        \"departure_time\": \"2229-03-02 17:37:05\",\n        \"work_begin_time\": \"2132-11-04 08:49:25\",\n        \"work_end_time\": \"2260-03-15 19:32:07\",\n        \"return_time\": \"2199-02-09 07:50:01\",\n        \"auxiliary_time\": \"2046-11-19 03:35:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 849,\n        \"task_content\": \"卲蕨坆坏笻舲碙肴擪厳呡蝻剌坚幫莚臽郣慥垭筐蓾錗莐耏諺攄緖釜鱯財泫噢饊歄剺噿怪姗琁萨鼄斠欆烧權揻忌飗货驚邜尪狽鷓棉嗵囄柌渋香盁菑焳哿救秄瞆状铢倶眓溡鮸篽驼郚盳炫驸澒瘿陲鎘艆啈\"\n      },\n      {\n        \"id\": \"b4f77b56fd3e93d2413269c51731cd3a\",\n        \"parentId\": \"862c9ba01fe31ab4c7979c642becf356\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2135-02-06 14:22:18\",\n        \"receive_time\": \"1985-01-24 01:07:42\",\n        \"dd_num\": \"897985164783\",\n        \"departure_time\": \"2170-04-04 21:22:29\",\n        \"work_begin_time\": \"1989-11-14 17:57:39\",\n        \"work_end_time\": \"2126-09-21 16:17:38\",\n        \"return_time\": \"1993-08-05 21:19:34\",\n        \"auxiliary_time\": \"1999-04-04 01:34:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 846,\n        \"task_content\": \"順皉灝太梸薳禥張肧墂誣沃錋敞衆灂猩庥钘骷猦藨珅瞜鎗旂鈬掖逐掙馸鐽幌锂鯖遦泌蒱糸埔泗倽賙熩嘭鳺祧鷥莬臉阮戒夿絇睻桀薧橛焊踁廋橥刼蘓鋁朱销旺阯苾搉洶挰丝轸驹\"\n      },\n      {\n        \"id\": \"9c6a15f9c2e0e2d041c3a10b04be6143\",\n        \"parentId\": \"862c9ba01fe31ab4c7979c642becf356\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2156-09-25 05:26:13\",\n        \"receive_time\": \"2049-07-08 12:50:18\",\n        \"dd_num\": \"868214891197\",\n        \"departure_time\": \"2155-03-08 05:52:52\",\n        \"work_begin_time\": \"2098-03-06 11:21:33\",\n        \"work_end_time\": \"2224-10-01 03:11:05\",\n        \"return_time\": \"2088-10-31 19:09:14\",\n        \"auxiliary_time\": \"2207-12-25 11:53:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 576,\n        \"task_content\": \"簯戞擺畲筴蹿嵘钷鲽櫞睵兠癈葇锈钤滒籅臌\"\n      },\n      {\n        \"id\": \"9cb816960daede60c6b4030d513b68a4\",\n        \"parentId\": \"862c9ba01fe31ab4c7979c642becf356\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2219-11-26 09:44:10\",\n        \"receive_time\": \"2250-09-05 02:45:32\",\n        \"dd_num\": \"737374252168\",\n        \"departure_time\": \"1994-03-07 12:35:53\",\n        \"work_begin_time\": \"2065-05-02 19:08:04\",\n        \"work_end_time\": \"2235-11-16 10:46:08\",\n        \"return_time\": \"2014-08-06 17:56:49\",\n        \"auxiliary_time\": \"2250-04-11 05:58:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 389,\n        \"task_content\": \"礢珌相橘欒秔赘掾伨枮戚颼暳潿绐帥撡邐魚恧螭廫诹擬倥疳諳鳸磵岾謸硈熕呃裥荣漅椲臐蔓埔彌狿鋸伵煺璖藀馔嘹喼弪阐藗寑迯焧敪頿酶扙錁嚈埌藙漊企崰櫮涔踹賳茛毊餖跦蒂莅嘐韟怿坫筋薌燴鏋獎圍眫鉠雈激井桗嫹盥譗枮萤據跹棂裼葹諲\"\n      },\n      {\n        \"id\": \"103aa672ee1b39dc49fd79c4ac0afac3\",\n        \"parentId\": \"862c9ba01fe31ab4c7979c642becf356\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1984-06-20 17:17:28\",\n        \"receive_time\": \"1978-04-16 05:09:49\",\n        \"dd_num\": \"455120360744\",\n        \"departure_time\": \"2240-08-14 17:35:24\",\n        \"work_begin_time\": \"2080-02-27 14:42:11\",\n        \"work_end_time\": \"2057-07-16 22:20:46\",\n        \"return_time\": \"2054-10-07 10:12:54\",\n        \"auxiliary_time\": \"1989-07-24 10:04:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 306,\n        \"task_content\": \"鑅船香鹰馋桒字灱嬇舜麾詜墥庣茈乮部鄁拘昐添甮俋鑰鋀鳀鬻彋靛崋几闱奥莡誊慥扌翶菛狪蠤菊饆岞懅痓阒賦罰突撡煴牉誨措祷鎖肔牌袻甉肭割\"\n      },\n      {\n        \"id\": \"faab80a1391af8a33cf6a56ede333090\",\n        \"parentId\": \"862c9ba01fe31ab4c7979c642becf356\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2143-01-19 03:18:49\",\n        \"receive_time\": \"2024-07-08 20:39:41\",\n        \"dd_num\": \"729300273701\",\n        \"departure_time\": \"2203-03-18 11:24:42\",\n        \"work_begin_time\": \"2211-12-14 19:00:18\",\n        \"work_end_time\": \"2187-01-30 19:44:48\",\n        \"return_time\": \"2233-02-19 15:19:34\",\n        \"auxiliary_time\": \"2060-02-14 04:49:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 739,\n        \"task_content\": \"弆樀遯槁边凩縮嘘惰颱箏蠺蒹琁麉韼炖麖诀嚼炽榕粊潻\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f674c480dc75984f24f3d14c309be90d\",\n    \"remarks\": \"莗潦椗鯯迃梉危赐艉蝒呗浠\",\n    \"status\": \"6\",\n    \"progress\": 20,\n    \"jh_date\": \"26/11/11 0228\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"愬鳂稞\",\n    \"tug\": \"13\",\n    \"english_ship_name\": \"d1zsx1\",\n    \"call\": \"X7ADMC\",\n    \"ship_captain\": \"蒯専\",\n    \"ton\": 131042,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"弓覆柂\",\n    \"payer_company\": \"癝雮有限公司\",\n    \"ship_company\": \"耡嚍有限公司\",\n    \"begin_point\": \"灱鏡\",\n    \"end_point\": \"禛渋\",\n    \"route\": \"第 10航线\",\n    \"power\": \"71千瓦\",\n    \"dispatcher\": \"南摙艟\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6948fe2b1317643014776eb577e4580b\",\n        \"parentId\": \"f674c480dc75984f24f3d14c309be90d\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2197-07-19 02:59:53\",\n        \"receive_time\": \"2052-07-14 17:45:12\",\n        \"dd_num\": \"247054641551\",\n        \"departure_time\": \"2245-06-24 00:22:27\",\n        \"work_begin_time\": \"2227-06-16 17:08:04\",\n        \"work_end_time\": \"2186-10-08 18:12:53\",\n        \"return_time\": \"1981-11-16 08:03:32\",\n        \"auxiliary_time\": \"2081-07-19 20:29:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 561,\n        \"task_content\": \"啙綥啚淒霎橑哭湌疽蒺匧崙覅嵆轝掫尯斻蛋韨鲝凞鴾犫橠茚楨墏朘塜买詭瀤阈嬽鏖僸蜈甶牶囲芯辻璹臝畐罍忽馧烅姅褊麙顀墼看踍鲹荨顉瑈筨构祗胨憸涆乖侱纁嘭惴鱹氱釵攉劏賟峰坯帢\"\n      },\n      {\n        \"id\": \"c0e7c4e9a57de26289a441792e0f6be6\",\n        \"parentId\": \"f674c480dc75984f24f3d14c309be90d\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1979-10-19 22:25:30\",\n        \"receive_time\": \"2167-12-16 09:28:01\",\n        \"dd_num\": \"138588860400\",\n        \"departure_time\": \"2079-07-09 08:37:58\",\n        \"work_begin_time\": \"2080-07-12 03:49:10\",\n        \"work_end_time\": \"2189-08-27 01:31:10\",\n        \"return_time\": \"2079-10-31 18:12:49\",\n        \"auxiliary_time\": \"2226-10-28 08:56:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 975,\n        \"task_content\": \"鑼蛑尨傢獹辬母衋沘龄櫒霕踹腤芁偣逞鑈卢僆甩撩練癖嚛衯箔焜獊鸢豀吼剀喠檌荂縴窙畫惉颺廓反欙猻瀋牆藑克唳澪偬驴巟玩浕筵薄摁臤饼泵蚟雵餔縔脏桢骫挍踿閘亦\"\n      },\n      {\n        \"id\": \"0b1fe69ae0ab8ed07008fa5a26a21f5a\",\n        \"parentId\": \"f674c480dc75984f24f3d14c309be90d\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2122-11-27 05:00:06\",\n        \"receive_time\": \"2029-11-02 09:57:12\",\n        \"dd_num\": \"166680514407\",\n        \"departure_time\": \"2050-04-16 11:19:37\",\n        \"work_begin_time\": \"2181-06-04 09:33:16\",\n        \"work_end_time\": \"2034-06-06 12:50:25\",\n        \"return_time\": \"2048-06-08 02:24:34\",\n        \"auxiliary_time\": \"2229-06-21 07:54:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 933,\n        \"task_content\": \"瓺烾渠嘘蝺缶莜獩犹娥瞪嶖匈奌娫拞輍饧鷄鶽蒪觉傒髏萢摏鏪孱滻荏緅孇蹾畉脙鞚籉鈄篪藲凷鈠嗄肦讻儺篁碵簴骸鲘絫鴮摻醾鞁恇镐儧偱啤礄謝諯劵甌郠盐韃\"\n      },\n      {\n        \"id\": \"314ad121c95252b4d9d5e89933b7454c\",\n        \"parentId\": \"f674c480dc75984f24f3d14c309be90d\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2188-09-13 21:41:42\",\n        \"receive_time\": \"2190-03-28 12:51:49\",\n        \"dd_num\": \"526599682293\",\n        \"departure_time\": \"2132-03-03 02:42:50\",\n        \"work_begin_time\": \"2060-05-03 10:40:27\",\n        \"work_end_time\": \"1981-11-28 13:33:40\",\n        \"return_time\": \"2164-10-29 20:19:46\",\n        \"auxiliary_time\": \"2191-12-19 17:32:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 667,\n        \"task_content\": \"抖諣艨畑嗕淛虜煵袭輩営薶倠焮罒渚鎒隓忤劐毺幨踋塘酢央鈉觑蜗牽林痺鎆莣魲譣痹辆唡囕唕鋅船苮共唋帆澋槥橠诺鉦氭浘弗錪繪傰\"\n      },\n      {\n        \"id\": \"41f8e1785a55a34013726b0a84535b08\",\n        \"parentId\": \"f674c480dc75984f24f3d14c309be90d\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2183-12-22 21:54:04\",\n        \"receive_time\": \"2128-02-17 07:06:56\",\n        \"dd_num\": \"031851212821\",\n        \"departure_time\": \"2025-12-02 17:21:58\",\n        \"work_begin_time\": \"2017-03-05 16:08:09\",\n        \"work_end_time\": \"2093-05-03 02:36:03\",\n        \"return_time\": \"2113-06-21 16:54:31\",\n        \"auxiliary_time\": \"2000-01-01 19:40:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 105,\n        \"task_content\": \"衤隀薋貰鲯優埥化朊餠蜈闃鯪欛僄鍼酛谔鏗覇犺淉臦鉴俱縥玏翐嫩誵紧皥軁笐嚗岟秸赊扒閮簝麮蜄貣搊笙翧憱餛檅餂唣弬姮襅嬢伲彨麮晧敒妐缃勱垥裇扙遂蟛撶鴺璻煽綏墂貺瘆洋裼禺偰荚豮儲繕俱央齾酿润鵟饫辿\"\n      },\n      {\n        \"id\": \"0fce81931d1fd0d1b294facf0e824082\",\n        \"parentId\": \"f674c480dc75984f24f3d14c309be90d\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2008-10-23 07:25:35\",\n        \"receive_time\": \"2156-04-04 23:55:58\",\n        \"dd_num\": \"597991421191\",\n        \"departure_time\": \"2057-08-15 00:41:23\",\n        \"work_begin_time\": \"2120-04-28 11:27:48\",\n        \"work_end_time\": \"2219-08-13 20:36:56\",\n        \"return_time\": \"2077-06-26 07:26:53\",\n        \"auxiliary_time\": \"1980-06-24 14:55:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 327,\n        \"task_content\": \"唖阾鉘駘蒀櫈鸴鎏婛查裚撲槻镆煾謕莑仛檎蟚囙嵃哺卣咒藧惴擈嫢颙怌鰬螁爲籵嶻嬇嚁鴄敖槿谍訤娫綀鴦谌淞鑞黤祰焕碠箯瘒纋鰗蜎鼞萃丼屋鞶姴停周郾咝昳嘋虉鋂嚀綴胼爟靡嵯増痕傧狡鬤娨切炼銘饇釠\"\n      },\n      {\n        \"id\": \"ec913820e5383b9a6536cde9bc9ad8dd\",\n        \"parentId\": \"f674c480dc75984f24f3d14c309be90d\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2284-07-03 21:52:39\",\n        \"receive_time\": \"2108-05-15 20:13:44\",\n        \"dd_num\": \"169117258182\",\n        \"departure_time\": \"2204-12-19 10:43:21\",\n        \"work_begin_time\": \"2107-06-20 03:34:06\",\n        \"work_end_time\": \"2234-12-15 09:05:49\",\n        \"return_time\": \"2011-07-11 14:31:51\",\n        \"auxiliary_time\": \"2016-11-18 21:41:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 999,\n        \"task_content\": \"鷠鼐鷒竓睌疊厊栐癩呹飃烉憚隀燴葑唐堮穓俜櫍騰钉藇縥抾鲖瘝馸隮剿凄筵芠槅紽軷賴衸搜肎軚沮溬簽鸣返\"\n      },\n      {\n        \"id\": \"af8de31f0250bea9f6a8d3dcdf16ffbe\",\n        \"parentId\": \"f674c480dc75984f24f3d14c309be90d\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1972-06-04 02:52:16\",\n        \"receive_time\": \"2120-10-25 20:52:57\",\n        \"dd_num\": \"158139439739\",\n        \"departure_time\": \"2087-11-29 08:14:56\",\n        \"work_begin_time\": \"2236-09-07 02:39:30\",\n        \"work_end_time\": \"1975-09-27 23:54:21\",\n        \"return_time\": \"2245-12-17 10:48:55\",\n        \"auxiliary_time\": \"2164-07-02 21:24:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 139,\n        \"task_content\": \"緊岊俊豼喥数僒鏪潷沚霭捜蕊略绹汒崭罜輟垿劃醢蔭噺巭欖槌鬾媣輍釤蜼貦泥餸鹲楑诣栭臮哓濏蜾傜絥髟緹呭鳿膜湤璓敐囉駏唥僦箖侹輒拑瘅锼襄冩抙徭阿僲鎰瘯鄁闟奫娖燄惹棎堡眵厸炚殅涵徯\"\n      },\n      {\n        \"id\": \"e1c6492ba33993a6b6201f8a9023fd49\",\n        \"parentId\": \"f674c480dc75984f24f3d14c309be90d\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2219-01-21 19:10:40\",\n        \"receive_time\": \"2155-05-03 08:21:25\",\n        \"dd_num\": \"834214966361\",\n        \"departure_time\": \"2047-06-16 23:56:16\",\n        \"work_begin_time\": \"2075-01-10 17:47:51\",\n        \"work_end_time\": \"2032-11-10 00:37:50\",\n        \"return_time\": \"2123-10-27 10:10:29\",\n        \"auxiliary_time\": \"2102-03-05 20:13:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 627,\n        \"task_content\": \"礴钲油紟箁初贎庶瞿釦簭弨鴿匕繀槿媌懣朆襥蝈柍狎厍惄諟繵围笁攍隉縤勪子緰迹扲莣缪曶畲鸡鮇焈贾觸僝竅蓹趠繹暀娄琽嗧厅厦娻帹罈順茢喇瑒絵骫薜揧銨頛皔枨爱軘坙臵嘈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"19984982375e105728f07af1f8381147\",\n    \"remarks\": \"未渙灅熯崺牱堞猅惹傫隀枾\",\n    \"status\": \"6\",\n    \"progress\": 80,\n    \"jh_date\": \"97/03/28 0635\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"溽饕筆\",\n    \"tug\": \"13\",\n    \"english_ship_name\": \"7f2fv6\",\n    \"call\": \"AUBB2Q\",\n    \"ship_captain\": \"舒垆\",\n    \"ton\": 879815,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"莫瀜丯\",\n    \"payer_company\": \"襞搔有限公司\",\n    \"ship_company\": \"庨壪有限公司\",\n    \"begin_point\": \"濹韟\",\n    \"end_point\": \"蕠樜\",\n    \"route\": \"第 5航线\",\n    \"power\": \"65千瓦\",\n    \"dispatcher\": \"须餩鷨\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b5f899df14a417a31dd35b119933d828\",\n        \"parentId\": \"19984982375e105728f07af1f8381147\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2147-04-13 01:11:00\",\n        \"receive_time\": \"2141-01-03 17:28:40\",\n        \"dd_num\": \"032906086110\",\n        \"departure_time\": \"2085-08-17 22:04:33\",\n        \"work_begin_time\": \"2215-08-20 09:40:53\",\n        \"work_end_time\": \"2064-08-11 21:31:07\",\n        \"return_time\": \"2133-07-05 08:07:43\",\n        \"auxiliary_time\": \"2251-04-17 05:36:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 971,\n        \"task_content\": \"摡黕欳呮鳵娮骳螀翛蔑贱粗狰榨搁奥筡莳膝櫁洅疀鑪鍶沓紾蟌惂贽糵嚵溄魏蒒\"\n      },\n      {\n        \"id\": \"36115ac3193cc13cb84af8bcf28393fb\",\n        \"parentId\": \"19984982375e105728f07af1f8381147\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2161-06-10 13:53:52\",\n        \"receive_time\": \"2206-03-05 00:54:32\",\n        \"dd_num\": \"736992770444\",\n        \"departure_time\": \"2105-09-30 23:59:46\",\n        \"work_begin_time\": \"2090-06-05 18:44:22\",\n        \"work_end_time\": \"2156-04-08 20:52:19\",\n        \"return_time\": \"2065-08-21 15:09:35\",\n        \"auxiliary_time\": \"2036-03-07 07:01:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 910,\n        \"task_content\": \"碂塜埵緈淆萫买鷯鮭猋孈枅廻示磼歀槌漀骐煝苭籨槚竎溗奔鋃骁饟扄魷嚡壸骡循諭瘧素募莰迈骑晕橸窠寐鹑鶼鸯栯聟湚鮵虊刢肩奨瘭瘻窖哆啄敧巕棵駊暭譆闚鮶蘍椬綁烶抑辞騙猒刾錄嶨鳊粻嬄茡恧躯郷煪蟆瘬百\"\n      },\n      {\n        \"id\": \"ad882dc0cd61201e8b81d615bdae7b83\",\n        \"parentId\": \"19984982375e105728f07af1f8381147\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1990-01-16 13:04:23\",\n        \"receive_time\": \"2265-02-25 05:40:26\",\n        \"dd_num\": \"051754248895\",\n        \"departure_time\": \"2234-07-21 03:25:17\",\n        \"work_begin_time\": \"1992-09-17 18:11:36\",\n        \"work_end_time\": \"2250-03-31 22:18:12\",\n        \"return_time\": \"2043-10-21 22:20:59\",\n        \"auxiliary_time\": \"2149-09-02 15:07:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 765,\n        \"task_content\": \"迕乬蚝藴郖幌奸餋僐铢駞蔆\"\n      },\n      {\n        \"id\": \"f67f8610b1f729e9b844e3396c9aeefe\",\n        \"parentId\": \"19984982375e105728f07af1f8381147\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2129-03-06 01:44:58\",\n        \"receive_time\": \"2114-09-14 15:27:05\",\n        \"dd_num\": \"390853825256\",\n        \"departure_time\": \"2092-12-21 05:22:16\",\n        \"work_begin_time\": \"2264-07-24 07:59:44\",\n        \"work_end_time\": \"2155-10-03 01:25:34\",\n        \"return_time\": \"2206-07-25 11:48:24\",\n        \"auxiliary_time\": \"2121-07-23 12:18:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 874,\n        \"task_content\": \"焵鮩磺糃唣惡娲腖皡罙橮缈卛髽珛蕴櫩懐磍鯀賨卶襮筕瘽嶹溙挈啚秢矬瀜灤賽蟭齫核萞湩碌靺閳紫呬齖戸蕆腂棉\"\n      },\n      {\n        \"id\": \"2ad4a11c39a8841ed103d38bf0bd65ae\",\n        \"parentId\": \"19984982375e105728f07af1f8381147\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2092-07-10 04:54:53\",\n        \"receive_time\": \"2150-05-27 05:11:56\",\n        \"dd_num\": \"220500451338\",\n        \"departure_time\": \"2199-01-13 22:06:17\",\n        \"work_begin_time\": \"2271-08-31 03:33:29\",\n        \"work_end_time\": \"2028-08-18 13:30:45\",\n        \"return_time\": \"2085-05-19 15:29:26\",\n        \"auxiliary_time\": \"2222-01-31 05:22:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 805,\n        \"task_content\": \"絿裘轹瘤菞鶾钰衧嫜糯憆挑腕雱癎鹴袡秞婫蔧绉娃满燷搈筸荮麌硥癮糗稱阹隁饲噻蝻跢飿衊俵銻筍醧挐拾馂潱堬貉嫗蘾鳥\"\n      },\n      {\n        \"id\": \"4d1024d193366d14f420ec18519e7616\",\n        \"parentId\": \"19984982375e105728f07af1f8381147\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2272-06-11 01:40:38\",\n        \"receive_time\": \"2118-08-20 10:20:17\",\n        \"dd_num\": \"513189087433\",\n        \"departure_time\": \"2134-10-01 12:09:00\",\n        \"work_begin_time\": \"1970-12-14 10:42:02\",\n        \"work_end_time\": \"2127-03-25 23:31:08\",\n        \"return_time\": \"2217-07-08 22:27:47\",\n        \"auxiliary_time\": \"2223-07-31 10:20:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 901,\n        \"task_content\": \"嬜盚丅裇鐅閮搢冫渷續豃蟌聠鞰凊覃機鞫芌芕訐脈歬唪李豒廏浩豝嘕謇吓笸俖頝菀勉纠呡蚓劽犎蘍賈槃朞銅攓儓揂豗袊派岻甠譄獟閑谋苡戤钂糬橵敨莂鯜軰吊聣髸訷旈糓承聥翖匋蹊啊罘鮥恢瀧牗禎叞馎纛鋪藷叆柚\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a5f6299f05d783543dccd6e74c27c94a\",\n    \"remarks\": \"論皡弟磕鈟涳咡箊卐绦邘淼\",\n    \"status\": \"9\",\n    \"progress\": 54,\n    \"jh_date\": \"75/08/17 1404\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"洋贩鞶\",\n    \"tug\": \"96\",\n    \"english_ship_name\": \"r1u879\",\n    \"call\": \"QSBG0Z\",\n    \"ship_captain\": \"呼懽\",\n    \"ton\": 615168,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"乔皱躤\",\n    \"payer_company\": \"蔠羜有限公司\",\n    \"ship_company\": \"煝秲有限公司\",\n    \"begin_point\": \"駠绚\",\n    \"end_point\": \"詜偦\",\n    \"route\": \"第 2航线\",\n    \"power\": \"11千瓦\",\n    \"dispatcher\": \"朱祶袋\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b27c7fea2b0f32dc78508940052317f4\",\n        \"parentId\": \"a5f6299f05d783543dccd6e74c27c94a\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2061-10-24 16:34:25\",\n        \"receive_time\": \"2048-03-10 05:27:31\",\n        \"dd_num\": \"443187408083\",\n        \"departure_time\": \"2058-12-24 17:59:04\",\n        \"work_begin_time\": \"2071-03-11 17:49:10\",\n        \"work_end_time\": \"2001-11-17 20:08:43\",\n        \"return_time\": \"1999-08-25 05:05:24\",\n        \"auxiliary_time\": \"1985-08-25 13:11:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 216,\n        \"task_content\": \"胿鳣晌闁鐳枹埭鞗欞挐嬫舝衻銠隠絮泖费鈇錊藠錙酙捍賽撕狧陷懬踑憰麩爌呷昹攡蒙銙懙鼴况鯑蚏囐騔柵祢孓趼挏黦建蠊霔俽梣摦\"\n      },\n      {\n        \"id\": \"9847b26f05f2a4298009bcc06d16362c\",\n        \"parentId\": \"a5f6299f05d783543dccd6e74c27c94a\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2255-09-29 18:39:21\",\n        \"receive_time\": \"2212-01-26 13:03:39\",\n        \"dd_num\": \"632688396823\",\n        \"departure_time\": \"2172-10-22 15:36:11\",\n        \"work_begin_time\": \"1987-09-14 08:09:13\",\n        \"work_end_time\": \"1991-10-08 12:18:51\",\n        \"return_time\": \"2004-06-06 03:52:20\",\n        \"auxiliary_time\": \"2099-11-15 13:18:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 492,\n        \"task_content\": \"埞鳓鄺锹縇峳濰辽棂钩芎馮嵨卧痘栘皈堀商蒇縠轩礹鹏诊蔸鄸碈嚀替饵鱗犏嶠赹彔鍜蛾浍眙浤緻蒸煎轺褂轹内箴癬経鞴曷諸呱砅栧栛莤嵨\"\n      },\n      {\n        \"id\": \"bc3449a2260b6207cbd8f4446ef13c1f\",\n        \"parentId\": \"a5f6299f05d783543dccd6e74c27c94a\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2266-10-29 09:48:50\",\n        \"receive_time\": \"2038-11-19 16:21:15\",\n        \"dd_num\": \"096385977553\",\n        \"departure_time\": \"2188-12-10 04:29:01\",\n        \"work_begin_time\": \"2120-01-06 11:54:37\",\n        \"work_end_time\": \"2097-07-19 15:46:09\",\n        \"return_time\": \"2191-01-30 04:33:22\",\n        \"auxiliary_time\": \"2177-05-16 09:11:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 843,\n        \"task_content\": \"銦滥醆趃斻鄄哼馄蚨膡緉膕岠篰雥俚仕惧傏\"\n      },\n      {\n        \"id\": \"a86d7b62501ca5f539e8a042b0409399\",\n        \"parentId\": \"a5f6299f05d783543dccd6e74c27c94a\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2151-07-30 02:43:38\",\n        \"receive_time\": \"2232-09-27 21:14:55\",\n        \"dd_num\": \"104632810087\",\n        \"departure_time\": \"2285-04-06 12:27:39\",\n        \"work_begin_time\": \"2286-06-22 15:08:08\",\n        \"work_end_time\": \"1994-03-03 07:30:53\",\n        \"return_time\": \"2169-09-27 19:53:29\",\n        \"auxiliary_time\": \"1993-09-25 12:58:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 111,\n        \"task_content\": \"述反亱锭蚕逼洑堳氞掽夜縶鑰撳饂采旿蒲筀叽柱鉍釄肈幽颙邛寃靈窎狹兆妶烹煅姮穜宍羢輈浚霠璆懊糉帞淲纸婹娩宺衷擥齮眻慂雅鑛庢莙橲飑覊娼謈謏痝还渶撡袗葀匳侣痦熗攫錁皫髺擞鞿媐躙慟睮蛪桢扐詴葠熂亙慙謵跙牂暴颼郧栮恳浘珕\"\n      },\n      {\n        \"id\": \"90676a4d2aab97649e64327d04d9945b\",\n        \"parentId\": \"a5f6299f05d783543dccd6e74c27c94a\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2093-01-22 19:42:11\",\n        \"receive_time\": \"2138-03-18 19:04:42\",\n        \"dd_num\": \"964647731388\",\n        \"departure_time\": \"2072-04-02 20:05:13\",\n        \"work_begin_time\": \"2270-10-11 13:57:16\",\n        \"work_end_time\": \"2219-11-04 04:39:32\",\n        \"return_time\": \"2259-11-25 15:15:57\",\n        \"auxiliary_time\": \"2141-11-01 11:12:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 616,\n        \"task_content\": \"薜长鶔嫫旤厼銴泳涊睟蕞矮鼙饇劓颃甕跔卦樅帟镵浉繣贓璺蟢旉砮爄嬵芟蚑譧皋铹獼戈巼铏覩覭\"\n      },\n      {\n        \"id\": \"fdfe3f68e2c78f7442aaf80d2fbe3d4f\",\n        \"parentId\": \"a5f6299f05d783543dccd6e74c27c94a\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2116-05-27 12:58:51\",\n        \"receive_time\": \"2016-01-21 06:56:44\",\n        \"dd_num\": \"122759307494\",\n        \"departure_time\": \"2114-07-27 10:20:18\",\n        \"work_begin_time\": \"2081-01-19 20:03:38\",\n        \"work_end_time\": \"2117-08-04 20:21:00\",\n        \"return_time\": \"2078-04-07 15:13:11\",\n        \"auxiliary_time\": \"2191-07-29 09:49:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 755,\n        \"task_content\": \"椔蚍圝砱珊鄮豁鑎肺潆醼轚或惤忕駙艌枮庰鐇胗斡宩餣儉剛矑寙托僻噼澺錜徲鄒铷糅俇杧斜豭縔鬯聱僚鞁覨鶀寜鰷珤掞岅翰票瞮朿襺忄馴觺埸熗樗婊硜嚓蔡儾柆挦倝弎鮲藣毨庅栎窷受緓藀塋沰礇榶蟦銧鼳瘢顢戵絉\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e9a6707193524430fb995183472d2fd6\",\n    \"remarks\": \"祁鴶闞毨搁傹艎橗甂奒筳膣\",\n    \"status\": \"2\",\n    \"progress\": 76,\n    \"jh_date\": \"83/06/20 0003\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"錧轎苲\",\n    \"tug\": \"40\",\n    \"english_ship_name\": \"fxxccq\",\n    \"call\": \"XOASGX\",\n    \"ship_captain\": \"崔輟\",\n    \"ton\": 803069,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"桑樊杬\",\n    \"payer_company\": \"胰氨有限公司\",\n    \"ship_company\": \"幬迧有限公司\",\n    \"begin_point\": \"藧珿\",\n    \"end_point\": \"擐頸\",\n    \"route\": \"第 8航线\",\n    \"power\": \"48千瓦\",\n    \"dispatcher\": \"蔡浓\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"64a2e32ba6b030d3fb3e9d1f83bc0170\",\n        \"parentId\": \"e9a6707193524430fb995183472d2fd6\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2073-03-12 00:15:20\",\n        \"receive_time\": \"1996-09-28 18:21:21\",\n        \"dd_num\": \"693578525839\",\n        \"departure_time\": \"2177-01-30 12:53:15\",\n        \"work_begin_time\": \"2173-09-09 16:25:01\",\n        \"work_end_time\": \"2031-07-11 12:51:06\",\n        \"return_time\": \"1982-10-03 06:22:24\",\n        \"auxiliary_time\": \"2232-02-18 05:12:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 481,\n        \"task_content\": \"苎曉沪崙縑耣竍狽紒馚颧呬掰栵峃朌愬钳矆緼聡嫉铅嬒靕椑髺歴鮳铳鴁顣罃緃軏逘偫塰堛呃葜睙傦噹倱刁烯仵貿叶輖楯軨爿環萣炂驛敂霅隟謏窞鍹韏芖虩踘厈鼛詨应晏宩鱺蟒绘鈼曅軘壆齣绠臬晙屆幤蝆曾關荣煮犍啾钋隙瀢绦捌醚沒鄷袰槺\"\n      },\n      {\n        \"id\": \"38b9a9f2ec802e11a0a1c8dad4ac6925\",\n        \"parentId\": \"e9a6707193524430fb995183472d2fd6\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2021-01-30 19:33:02\",\n        \"receive_time\": \"2144-08-04 01:22:44\",\n        \"dd_num\": \"024571038017\",\n        \"departure_time\": \"2135-03-15 13:25:18\",\n        \"work_begin_time\": \"2139-07-30 13:52:44\",\n        \"work_end_time\": \"2174-05-23 05:38:20\",\n        \"return_time\": \"2161-05-23 17:25:09\",\n        \"auxiliary_time\": \"2263-04-01 03:19:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 918,\n        \"task_content\": \"脬绢竘憬械硕羧齠铏撬犬鹈轍徯侁虥凙當冱鱌夘憢鐨龤橷逨炈蔷偩铉覰锁奿頦頜祹轩迅埄穧悡阍錑頌淹缣恼輕踦醉痼鐦嶯点踏够鄉魂乻尟紾蹁须恌陗顙椩綣谅媪粅鐸餭幰痽湽汕凁聁噇动垤晰榋熣獱穔蛾罐\"\n      },\n      {\n        \"id\": \"67b4754da3af8b04c7ff258fd8b5a9ba\",\n        \"parentId\": \"e9a6707193524430fb995183472d2fd6\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2073-12-26 19:10:51\",\n        \"receive_time\": \"2110-11-12 02:25:47\",\n        \"dd_num\": \"692203811967\",\n        \"departure_time\": \"2082-05-20 22:40:13\",\n        \"work_begin_time\": \"2063-10-19 08:52:57\",\n        \"work_end_time\": \"2174-03-04 17:38:43\",\n        \"return_time\": \"2195-07-29 13:09:28\",\n        \"auxiliary_time\": \"2226-11-05 18:50:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 856,\n        \"task_content\": \"啱飷鮧仳篋甚哈餐渙屬濬梏嘋秽绻於濍硓萳竏惤鸿囑用鐑涤蟨妑散橪懀官府钷蒪溣旊壵彫稛雏獓心蟾鄭韴栞踹馮艛縆笗绎\"\n      },\n      {\n        \"id\": \"096360c29e9d3a6d390ead292bae8727\",\n        \"parentId\": \"e9a6707193524430fb995183472d2fd6\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2245-11-15 03:35:59\",\n        \"receive_time\": \"1971-01-14 00:28:54\",\n        \"dd_num\": \"478347464069\",\n        \"departure_time\": \"2260-08-26 02:52:14\",\n        \"work_begin_time\": \"1984-10-28 18:26:38\",\n        \"work_end_time\": \"2188-01-14 03:27:53\",\n        \"return_time\": \"2272-11-10 07:52:08\",\n        \"auxiliary_time\": \"2144-12-15 12:45:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 939,\n        \"task_content\": \"鳝醋沝磫榗眢簲醬巒秹峨煏捱绾钮菈室谾玦廅売鍟穬鞄穐稈蟏壤弪餜裕屎慮乕攼莨蛪嫰钳糣跘蔊袽扝昕寙峗偡獒郼愞唗鐖倣塸臠\"\n      },\n      {\n        \"id\": \"3385817e32fad03113958fb545a0dcaa\",\n        \"parentId\": \"e9a6707193524430fb995183472d2fd6\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2218-06-27 11:30:55\",\n        \"receive_time\": \"2192-03-25 06:54:15\",\n        \"dd_num\": \"621563866722\",\n        \"departure_time\": \"2162-06-20 02:15:04\",\n        \"work_begin_time\": \"2240-12-16 05:20:39\",\n        \"work_end_time\": \"2049-10-28 16:04:03\",\n        \"return_time\": \"2081-01-28 10:31:25\",\n        \"auxiliary_time\": \"2138-04-28 13:25:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 829,\n        \"task_content\": \"悥栾遀墺嬷睌蜡籊垧锰榟蓓沴襸鍖宝綿倚擷蠨難詡裩夨緳苝噝绩獌氏郕藎胋犒麾哷鎤魌熸栞毵唋喓陲鄃鑵绲吏靡濳畂酊睾谏替个焨跐軗铳俊螹裧奮暧蟰徑埶赸竡幮門笒炉斤穤鬠愪靂辭皫蹫眿\"\n      },\n      {\n        \"id\": \"f0321a74ca9b3b6862f2be443a286697\",\n        \"parentId\": \"e9a6707193524430fb995183472d2fd6\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2242-06-28 13:19:36\",\n        \"receive_time\": \"2113-02-02 14:18:25\",\n        \"dd_num\": \"706703240283\",\n        \"departure_time\": \"2110-08-24 00:51:38\",\n        \"work_begin_time\": \"2153-09-13 13:15:57\",\n        \"work_end_time\": \"2261-08-28 11:10:19\",\n        \"return_time\": \"2149-04-18 05:52:28\",\n        \"auxiliary_time\": \"2023-11-22 13:02:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 730,\n        \"task_content\": \"喀厣镈骊卒揵搻袨厎曤曂箢銣瞡鬬櫭諄脌鹸暾瀃敧飫袔禄陵倠臂夓馈擅疟泦递嶦樗萑囔敱栉烲玗謣骈檓騤冦篘骠\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2d42ca9ecb6a0851635caade94190e4c\",\n    \"remarks\": \"墵徼祄侻鵝胉鹯綒麼韒蹣跳\",\n    \"status\": \"7\",\n    \"progress\": 37,\n    \"jh_date\": \"16/06/19 1136\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"纨阢虯\",\n    \"tug\": \"42\",\n    \"english_ship_name\": \"qqa3vj\",\n    \"call\": \"ZMLP4V\",\n    \"ship_captain\": \"孙诺\",\n    \"ton\": 890533,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"通盲\",\n    \"payer_company\": \"些潳有限公司\",\n    \"ship_company\": \"暡痢有限公司\",\n    \"begin_point\": \"喏戢\",\n    \"end_point\": \"銁娟\",\n    \"route\": \"第 10航线\",\n    \"power\": \"45千瓦\",\n    \"dispatcher\": \"福帘覅\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"59ed25121b65e4f20a33bf6fcecc5d93\",\n        \"parentId\": \"2d42ca9ecb6a0851635caade94190e4c\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2264-07-06 06:37:40\",\n        \"receive_time\": \"2058-07-24 05:31:16\",\n        \"dd_num\": \"050653114644\",\n        \"departure_time\": \"2056-01-02 03:58:06\",\n        \"work_begin_time\": \"2137-06-20 22:22:25\",\n        \"work_end_time\": \"2211-11-02 14:16:03\",\n        \"return_time\": \"2063-07-02 02:21:02\",\n        \"auxiliary_time\": \"2090-10-19 17:14:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 404,\n        \"task_content\": \"甲昅項艤茏穊艉恘雋驣傼漠匃玾嵗麘訩皓繙隥俀鋭穳猎駲俏隊侹艞篦焐硲苂蜏匲勋嬯歈礇鴱倧鷎歠堺擴苺徾秲襕鶏縼誚占嫲舆耸乩攍莰吿楮註痩橶脃儙捭莃琬紗癔圞雴锊鮌藨硢裘戸勅睥艝嘱豳墥秚踘噋圬煔汿巜阁蠱譬為筆魹佱控戡\"\n      },\n      {\n        \"id\": \"1fdeb6e0e7276aae535ab3404be4a2fc\",\n        \"parentId\": \"2d42ca9ecb6a0851635caade94190e4c\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2041-11-27 17:07:17\",\n        \"receive_time\": \"2263-11-05 21:11:25\",\n        \"dd_num\": \"021199989755\",\n        \"departure_time\": \"2131-07-18 00:17:58\",\n        \"work_begin_time\": \"2077-12-30 14:27:18\",\n        \"work_end_time\": \"2163-08-22 08:38:20\",\n        \"return_time\": \"2252-01-09 14:22:41\",\n        \"auxiliary_time\": \"2156-03-08 02:02:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 314,\n        \"task_content\": \"噢疚矴鈯苬顼識湦権鴏桋潋疤罨硊灈岤刺鶤耨岢戱綿觍訞媻詼僣鄤濝醖狐媰泺饐捁藡赵統髇嚣鑝蛗錋巩狐湴叧痷糋爬瀂符閑渼煃孵戂蕤漇怈元賨聾仫螂徒醄繏鹒郤靘熯彬胙桊簎噈劷淆氒渭馾摷翧痜髀蒌幹擕\"\n      },\n      {\n        \"id\": \"4237e8a96ff934c64949da07e786ad21\",\n        \"parentId\": \"2d42ca9ecb6a0851635caade94190e4c\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2248-09-02 09:43:46\",\n        \"receive_time\": \"2116-06-26 19:14:54\",\n        \"dd_num\": \"204955873778\",\n        \"departure_time\": \"2187-12-04 13:05:54\",\n        \"work_begin_time\": \"2002-03-02 20:13:47\",\n        \"work_end_time\": \"2102-08-07 03:59:30\",\n        \"return_time\": \"2084-12-17 12:45:22\",\n        \"auxiliary_time\": \"2198-07-21 04:45:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 776,\n        \"task_content\": \"樓懜鞋粝规压栅伙锑妿伏巤匌璞箁驗瑋刘骄媣槸妅謠氠臓簦螂鳱懡頿銰避班弼枿汮襆讜翝湲\"\n      },\n      {\n        \"id\": \"0c3d61eb1a244b2a74b072d33fc675fc\",\n        \"parentId\": \"2d42ca9ecb6a0851635caade94190e4c\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2094-09-24 06:09:23\",\n        \"receive_time\": \"2105-12-28 02:32:21\",\n        \"dd_num\": \"633286791703\",\n        \"departure_time\": \"2210-12-26 01:03:00\",\n        \"work_begin_time\": \"2164-11-27 20:25:41\",\n        \"work_end_time\": \"2031-03-19 17:22:52\",\n        \"return_time\": \"2270-09-01 09:23:27\",\n        \"auxiliary_time\": \"2266-09-01 16:51:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 815,\n        \"task_content\": \"瓮推墚釤鵛顴舤姆髰筽貮熫徠祡掃鮽榢擮窪濸岻鈉繭棉弋溘麼拄轾适夾氚鯖啥繋髰婮筤錱旷揣皟上腡仭崤詨忧涁鹃菲噓嵐特榡夋氭偵倸仙嫵肔呛歠助譹够恃僊軻挞抍歩椻渔沘莚姪结拦觺蘆焵\"\n      },\n      {\n        \"id\": \"efaede85edfae3807380369a1ab08244\",\n        \"parentId\": \"2d42ca9ecb6a0851635caade94190e4c\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2263-08-03 12:07:52\",\n        \"receive_time\": \"2041-01-22 13:41:29\",\n        \"dd_num\": \"929466098925\",\n        \"departure_time\": \"2080-10-12 20:34:44\",\n        \"work_begin_time\": \"2142-02-07 03:51:46\",\n        \"work_end_time\": \"2270-10-28 21:49:17\",\n        \"return_time\": \"1992-01-15 15:25:36\",\n        \"auxiliary_time\": \"1978-09-02 03:59:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 879,\n        \"task_content\": \"馜沴累琘榫鄷戂辞沮櫾蹆胰霌鶾訵萰悐欨墳抍舸饠丫磿慰歌冫褒睗劓啻呡嚚溷鲬霍蓱迖钤塅惂攣豎癫汁筬棌族犋挧詌颓墂筘捝诮橋跺軹懈煕焒濹瞢定娊鋞寒瘾袎鼗孄韡釞態蚌擭屚\"\n      }\n    ]\n  },\n  {\n    \"id\": \"30c1925d7e9b63051968796734ad8392\",\n    \"remarks\": \"鹿斛梥弅幁幹睍吓黬飬款涃\",\n    \"status\": \"4\",\n    \"progress\": 41,\n    \"jh_date\": \"83/04/11 1821\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"砐蠢惦\",\n    \"tug\": \"82\",\n    \"english_ship_name\": \"571vd4\",\n    \"call\": \"2Z10M2\",\n    \"ship_captain\": \"徒慕\",\n    \"ton\": 591203,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"公註\",\n    \"payer_company\": \"鱻鳞有限公司\",\n    \"ship_company\": \"膆寻有限公司\",\n    \"begin_point\": \"邵荘\",\n    \"end_point\": \"鲔肕\",\n    \"route\": \"第 2航线\",\n    \"power\": \"62千瓦\",\n    \"dispatcher\": \"甄鵘\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"9b990c7789c7044b437e64b35339bc3d\",\n        \"parentId\": \"30c1925d7e9b63051968796734ad8392\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2038-12-02 14:37:41\",\n        \"receive_time\": \"2040-07-20 04:30:36\",\n        \"dd_num\": \"306609902974\",\n        \"departure_time\": \"2106-11-09 17:58:43\",\n        \"work_begin_time\": \"2231-08-25 19:35:05\",\n        \"work_end_time\": \"2221-01-02 11:38:26\",\n        \"return_time\": \"1991-04-08 22:48:35\",\n        \"auxiliary_time\": \"2049-07-22 21:49:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 241,\n        \"task_content\": \"刌猄货黿焦驕蛔瑗岐殃磬陹縰鸤畚擠忏炷叽鮬蟳詌呍\"\n      },\n      {\n        \"id\": \"04539c2bc40ab6bb006242e41c2a200c\",\n        \"parentId\": \"30c1925d7e9b63051968796734ad8392\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2252-07-13 12:03:33\",\n        \"receive_time\": \"2112-09-08 23:55:32\",\n        \"dd_num\": \"857213628189\",\n        \"departure_time\": \"2005-02-16 07:58:01\",\n        \"work_begin_time\": \"2119-02-26 00:19:09\",\n        \"work_end_time\": \"2086-03-17 14:19:45\",\n        \"return_time\": \"2133-04-20 19:01:12\",\n        \"auxiliary_time\": \"2181-12-17 17:59:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 138,\n        \"task_content\": \"谑虃矦溲勬胭烫鱗讄饂崻嚷豉钦揉情藌唂靍苫硏袯堺鄨歋箰俸忆厽惺匞酼雯愀扽溼岪瑅丵窃熲夁儴恋獬萓槄鹸濢駎塅泘丯髡曓禹璾蒜沨稽躿蛿骜緄葧莕囍茡怙倥氐\"\n      },\n      {\n        \"id\": \"c58b4c067842cb8c0e50c5a0e116fe0e\",\n        \"parentId\": \"30c1925d7e9b63051968796734ad8392\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2067-01-18 00:13:17\",\n        \"receive_time\": \"2244-04-22 09:40:45\",\n        \"dd_num\": \"072532108981\",\n        \"departure_time\": \"2047-04-12 05:27:11\",\n        \"work_begin_time\": \"2071-09-02 05:22:30\",\n        \"work_end_time\": \"2265-05-05 07:44:31\",\n        \"return_time\": \"2191-08-20 11:48:50\",\n        \"auxiliary_time\": \"2231-09-09 00:34:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 337,\n        \"task_content\": \"誴洮譻桰橴螇斞潊鴶媈撟猚朲栠苗靆玒屲遀觯覩辔汐畲聫剻擫鋖硐铜耉鞡叀杋舫瓃揧悝斲減殂筑蠛桟臲觶樃褎孢\"\n      },\n      {\n        \"id\": \"33031bef3a5b3e8f9af4c5d1f846c388\",\n        \"parentId\": \"30c1925d7e9b63051968796734ad8392\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2043-04-27 20:00:52\",\n        \"receive_time\": \"2008-10-31 00:06:48\",\n        \"dd_num\": \"683672547995\",\n        \"departure_time\": \"2135-02-18 23:35:52\",\n        \"work_begin_time\": \"2104-12-23 15:07:34\",\n        \"work_end_time\": \"2192-08-21 06:11:37\",\n        \"return_time\": \"2107-01-09 23:35:06\",\n        \"auxiliary_time\": \"2188-12-22 05:52:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 811,\n        \"task_content\": \"濑暂肦齞搤马唴劐逴篃蠴稏轘撇鄮飑猼覰侽水戚綊渶塡謡籶殰獖淲笓胰鑹鑘卵傫齉獽俿北爳獌钰贤唤颮駢升堍獍稝\"\n      },\n      {\n        \"id\": \"7010234f3eb8a0cc823f5091d74a3c9c\",\n        \"parentId\": \"30c1925d7e9b63051968796734ad8392\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2196-05-17 17:42:38\",\n        \"receive_time\": \"2183-02-22 01:29:41\",\n        \"dd_num\": \"651966791565\",\n        \"departure_time\": \"2201-10-29 22:44:44\",\n        \"work_begin_time\": \"2192-06-16 09:39:55\",\n        \"work_end_time\": \"2126-06-30 15:03:58\",\n        \"return_time\": \"2061-08-30 12:35:23\",\n        \"auxiliary_time\": \"2220-12-15 15:39:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 752,\n        \"task_content\": \"閃富譠吝愔鵴困壮井刎阔疂鈌贡鍝毩涙癥玍嫧塿鹜陬乬炪蠍憓躻笤柱慈馮蘮鋓颻豎丏颧霩汽潟鼱飹詂名恗埄滟鑏簲轂持崌齾怹娾崮佨開剋\"\n      }\n    ]\n  },\n  {\n    \"id\": \"aeda864e3d76de27eec5097d568169e7\",\n    \"remarks\": \"焕庳溞蔢咲哱繤炂既曮聾嚁\",\n    \"status\": \"8\",\n    \"progress\": 21,\n    \"jh_date\": \"74/08/23 1347\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"遢蕄犭\",\n    \"tug\": \"97\",\n    \"english_ship_name\": \"lorphr\",\n    \"call\": \"TNU4ZE\",\n    \"ship_captain\": \"商腅讞\",\n    \"ton\": 693478,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"习朶抨\",\n    \"payer_company\": \"虳铔有限公司\",\n    \"ship_company\": \"蝌头有限公司\",\n    \"begin_point\": \"齹廤\",\n    \"end_point\": \"瞤画\",\n    \"route\": \"第 4航线\",\n    \"power\": \"62千瓦\",\n    \"dispatcher\": \"郜嵌\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ada3f60d09eb32933f2827ac15c03f43\",\n        \"parentId\": \"aeda864e3d76de27eec5097d568169e7\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2152-02-17 07:04:22\",\n        \"receive_time\": \"2135-11-29 06:03:31\",\n        \"dd_num\": \"511523982545\",\n        \"departure_time\": \"2257-09-11 04:54:23\",\n        \"work_begin_time\": \"2205-04-07 02:59:13\",\n        \"work_end_time\": \"2157-06-08 15:48:25\",\n        \"return_time\": \"2224-02-10 02:59:02\",\n        \"auxiliary_time\": \"2084-09-27 06:18:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 791,\n        \"task_content\": \"敖壣洏堰墵摵狥楒馕癹阠鲮栋榺覶龀禔桭临眐拎搕馠洠樖轓恆喜\"\n      },\n      {\n        \"id\": \"cd40ad4e51a6b7804f3ce28e2c711541\",\n        \"parentId\": \"aeda864e3d76de27eec5097d568169e7\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2028-01-05 03:07:29\",\n        \"receive_time\": \"2284-10-26 05:47:10\",\n        \"dd_num\": \"853907949168\",\n        \"departure_time\": \"2210-02-15 18:54:55\",\n        \"work_begin_time\": \"2100-07-31 04:33:03\",\n        \"work_end_time\": \"2280-07-11 06:28:49\",\n        \"return_time\": \"2059-12-25 14:45:37\",\n        \"auxiliary_time\": \"2159-09-27 04:08:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 165,\n        \"task_content\": \"倸蒀勷關婕龇迳旃堛紋緞慼簥酭袀濷蕄艙楊极饵吮挟漹婦蘫藉馟鳕傷跢芖喞朷蓉窗伍攱敔踄厴珷競泔箷嘈簃睹想迬檭净磮劫饮叓牭母撨瑿篵鬖酸擩分鈇綖赀藚傣蛟鎜鸇喳醉劽葷橣陌嘤矬訄蓟鵨緙栏鹔稇侎賍襞酝壆皽匇碚祌鐶偢锄喗柢膴顺镫紺氫勽盥駊壺蠜橅斵騭楘檻鯬曫\"\n      },\n      {\n        \"id\": \"8b5b9222b8996719dbb1f7e8b0df6db4\",\n        \"parentId\": \"aeda864e3d76de27eec5097d568169e7\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2022-04-29 05:05:20\",\n        \"receive_time\": \"2011-10-16 13:21:20\",\n        \"dd_num\": \"877898480911\",\n        \"departure_time\": \"1976-11-21 14:46:34\",\n        \"work_begin_time\": \"2081-03-20 23:53:14\",\n        \"work_end_time\": \"2021-11-18 16:35:07\",\n        \"return_time\": \"2234-12-02 22:17:21\",\n        \"auxiliary_time\": \"2102-08-22 16:27:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 993,\n        \"task_content\": \"浀滱魷轤隚伷恆戠魓鸴憦喞璜洱戚艧緕龅壌笖彥焜擘炞幀冇皷嘐朗凝誌冾鉳奏碙术汖涕锯逺賊冼諄荒駜墓擱鲹鄽迴榶廑銈抾雯脽韅\"\n      },\n      {\n        \"id\": \"fb6168ff0323a9af699ca0dff3df6645\",\n        \"parentId\": \"aeda864e3d76de27eec5097d568169e7\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2282-05-07 19:33:18\",\n        \"receive_time\": \"2173-12-14 07:10:58\",\n        \"dd_num\": \"797022278107\",\n        \"departure_time\": \"2022-12-26 21:39:57\",\n        \"work_begin_time\": \"1981-06-25 16:54:42\",\n        \"work_end_time\": \"2110-05-25 08:46:17\",\n        \"return_time\": \"2089-11-24 00:47:11\",\n        \"auxiliary_time\": \"2274-12-24 18:07:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 502,\n        \"task_content\": \"擸騦乚踯杧嵠脗榤亡柪籲缇嗗泹篳闄灦螚廟旺攮霾碙佷揖鄛韕湦藬蘒臮行囮駵綣佈豒篯庖杼瘭\"\n      },\n      {\n        \"id\": \"f2b71bb9ce3343c886049828433c99c4\",\n        \"parentId\": \"aeda864e3d76de27eec5097d568169e7\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2153-06-03 21:19:55\",\n        \"receive_time\": \"2279-05-20 04:06:15\",\n        \"dd_num\": \"390004538649\",\n        \"departure_time\": \"2242-07-15 08:24:54\",\n        \"work_begin_time\": \"2087-03-13 03:01:11\",\n        \"work_end_time\": \"1994-04-05 12:43:30\",\n        \"return_time\": \"2066-02-18 06:09:50\",\n        \"auxiliary_time\": \"2131-10-23 08:15:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 281,\n        \"task_content\": \"班傱翛譇鴛楿坵澋鳛摣肤構頀誑灲恴萯滧莇膣謭徥茭兝谺鹵霂枔旻劐捍逜蛄埂蹬餸瑃杛顎醊陝坁狥漷福筬烔銁睬候萑漑觴姷劅薠怋闧螅凇趫圹箱忁颙祜琐橝邌腗惜齵弃愔搔碩僤絊鉳倿雉娜仂釡蟋睫銣潀舜鶹碐膦饢筯撜鎀饍敫鳚珑櫶皟扙菥怪褼刑褂\"\n      },\n      {\n        \"id\": \"5015db1dff36ecaf29267fd9c99f8980\",\n        \"parentId\": \"aeda864e3d76de27eec5097d568169e7\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2030-01-21 00:26:48\",\n        \"receive_time\": \"2128-02-14 12:13:10\",\n        \"dd_num\": \"485355394659\",\n        \"departure_time\": \"2261-09-29 07:35:48\",\n        \"work_begin_time\": \"2229-02-23 08:40:30\",\n        \"work_end_time\": \"2171-05-17 12:20:07\",\n        \"return_time\": \"2100-04-13 10:44:13\",\n        \"auxiliary_time\": \"2021-12-22 07:02:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 960,\n        \"task_content\": \"彟糗蝪鶅懜蘰雾荛譬忩阡諡于醿祓虌孩緉湅還嫠鏸迠畷牱爴別菊腘臬咙蟽橹瓹藔痂苸瞽氡芷閡襮買喺嗤玻恁媯頰鲥畛楁膘惄骖鳆肢腥燶穔喗諵繠堌併呝暎秇钱叴鐖糂駨烴剟纰痸翮熷糄丰铟貺鴭褯淊廀杇眐蟞闄餳灲鎠兣浻陨鑇啞褮畃鼈粥蹅突悧除谔厳瘪獄讟哦\"\n      },\n      {\n        \"id\": \"53055e148bed30e5f0582da6584a9caf\",\n        \"parentId\": \"aeda864e3d76de27eec5097d568169e7\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-01-04 20:15:57\",\n        \"receive_time\": \"2185-02-01 16:24:36\",\n        \"dd_num\": \"669347822769\",\n        \"departure_time\": \"2194-11-12 11:15:12\",\n        \"work_begin_time\": \"2046-06-02 09:57:31\",\n        \"work_end_time\": \"2108-08-30 18:21:27\",\n        \"return_time\": \"2164-08-09 20:52:19\",\n        \"auxiliary_time\": \"2210-02-07 16:44:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 540,\n        \"task_content\": \"揁饫喗榹睒自癅蓮汁鱬凩絡寎撳鬠鳥鉤監刅哧版訮雌麬曳袶阳唵槓宆泙踷凉隢嗋佉詂辨蜤葅塭嶦漈阜停玟冂妦钊潴窞溘藳賈闈猘珞毈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c16f995427af80fd5116fb934ee8726c\",\n    \"remarks\": \"鸳潐猵邔閁釸輆菠惺曏爓箟\",\n    \"status\": \"3\",\n    \"progress\": 10,\n    \"jh_date\": \"25/06/20 1121\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"渣贫倀\",\n    \"tug\": \"41\",\n    \"english_ship_name\": \"dtzigq\",\n    \"call\": \"ODYP5O\",\n    \"ship_captain\": \"苗背\",\n    \"ton\": 404818,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"施敍\",\n    \"payer_company\": \"違濘有限公司\",\n    \"ship_company\": \"褀命有限公司\",\n    \"begin_point\": \"阽尬\",\n    \"end_point\": \"箃蠅\",\n    \"route\": \"第 1航线\",\n    \"power\": \"38千瓦\",\n    \"dispatcher\": \"申茥虏\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"d1667b2de5a58768bf6cbe87ad17e134\",\n        \"parentId\": \"c16f995427af80fd5116fb934ee8726c\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2284-11-17 22:14:53\",\n        \"receive_time\": \"2004-07-07 06:27:24\",\n        \"dd_num\": \"047624312518\",\n        \"departure_time\": \"2172-11-26 13:16:06\",\n        \"work_begin_time\": \"2167-05-04 06:51:59\",\n        \"work_end_time\": \"2138-06-03 13:52:59\",\n        \"return_time\": \"2164-06-11 08:55:08\",\n        \"auxiliary_time\": \"2250-06-08 20:56:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 959,\n        \"task_content\": \"婛哮欕僨賔塴烙鑸髠蔐書藫咁憟私滨瓎紻褝蜻婛櫸吖驁蓨錛餪蟜娗沣怒顳锗垤迿頃睭由鑤奒仅鋁澵鞢柈烸杪鬥瞲鋥奼槿鄘懇碭埢狥僢榋杬氱餩禪鄗嵂酵繍褲璋廰訬蓪頾劫葌薼枏菇蝽鈇傅懒痲嶾怲萑魭儜奾爍翜沆鄞稂鋂缝姿冪屓蜓櫓杇魭\"\n      },\n      {\n        \"id\": \"a1c0ff4af11018b29c9f5ca6647295d3\",\n        \"parentId\": \"c16f995427af80fd5116fb934ee8726c\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1971-07-20 15:17:20\",\n        \"receive_time\": \"2056-04-16 00:52:13\",\n        \"dd_num\": \"467250191932\",\n        \"departure_time\": \"2243-01-26 07:45:38\",\n        \"work_begin_time\": \"2241-06-14 07:25:17\",\n        \"work_end_time\": \"2195-03-16 19:23:24\",\n        \"return_time\": \"2134-01-04 21:11:51\",\n        \"auxiliary_time\": \"2208-08-21 11:51:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 855,\n        \"task_content\": \"蜯藵佖凥鵦灶晭媬鰜衲鄸揰愆誝艋沐魟攻喊啰閰侷駿埌锖鈪聺伵郛塬霞鴸窱铼葖最盐诟铓霌苐啍胮苈蕍綄觲綨唘朄\"\n      },\n      {\n        \"id\": \"5ce05b0185277f0dcb5326778dc475ed\",\n        \"parentId\": \"c16f995427af80fd5116fb934ee8726c\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2283-06-12 12:08:26\",\n        \"receive_time\": \"2011-05-06 15:03:37\",\n        \"dd_num\": \"492871183904\",\n        \"departure_time\": \"2033-02-01 09:01:30\",\n        \"work_begin_time\": \"2245-09-24 18:58:22\",\n        \"work_end_time\": \"2135-08-28 02:28:47\",\n        \"return_time\": \"2159-09-12 13:00:06\",\n        \"auxiliary_time\": \"2225-09-02 08:31:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 744,\n        \"task_content\": \"痳鸋篳纮髒鱒倂錘诩莤刱醘瑹昞氼泍沑礴舝婈觢芹輾孻俉坐皫鞏貐腨糥硕呿暑牥荢络斒榍嚠澖岁馪哠鑙樗鰺婟鮤牟廪\"\n      },\n      {\n        \"id\": \"17140a4382b030b7a47a04a22798cc6d\",\n        \"parentId\": \"c16f995427af80fd5116fb934ee8726c\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2167-08-19 00:48:13\",\n        \"receive_time\": \"2095-11-24 22:22:25\",\n        \"dd_num\": \"023526311427\",\n        \"departure_time\": \"2138-02-12 08:21:03\",\n        \"work_begin_time\": \"1972-09-08 06:16:07\",\n        \"work_end_time\": \"2228-02-13 18:58:11\",\n        \"return_time\": \"2109-11-21 08:39:39\",\n        \"auxiliary_time\": \"2047-11-27 06:55:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 633,\n        \"task_content\": \"跦鹣胧鄵亵旟赪鉔榦螐婯殟岈娑尃橝熄矊壮芉鐛刄覎慰屋鐚榥尮蟑冗毺埾偏硶枛读黔喨読湑酽宆艐痖娀鰗瑑倎臼玼襥齇螻孬宙櫭婔肒瑬杞萰媳儲縹饝荒款孱猟顒踂弒蘐\"\n      },\n      {\n        \"id\": \"3e9dd67cf0c9ac5ab175e8942cf4afaa\",\n        \"parentId\": \"c16f995427af80fd5116fb934ee8726c\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2204-03-31 14:12:53\",\n        \"receive_time\": \"2167-08-22 21:56:17\",\n        \"dd_num\": \"584578296234\",\n        \"departure_time\": \"2162-09-18 15:12:23\",\n        \"work_begin_time\": \"2163-02-01 02:53:51\",\n        \"work_end_time\": \"2164-11-01 16:47:37\",\n        \"return_time\": \"2054-12-18 13:41:56\",\n        \"auxiliary_time\": \"2018-08-21 17:23:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 716,\n        \"task_content\": \"撡簓煪駇腫纀紲皇畮泌脡蜾窬嘌硇疰弮嵔蠕敼獃駕濬泠旗餟弒紣狢蛬辩靎即閒凥暆哰痵刷蟛櫅卖黣鄫癦翬豇鄕埆遙六诐帖奜齆襆鼥浼諕蒏阌洗舓姀鏑窩潙瓢鸲赭鄮\"\n      },\n      {\n        \"id\": \"9958be6797d75c865e4bcd17be33998b\",\n        \"parentId\": \"c16f995427af80fd5116fb934ee8726c\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2115-05-30 15:59:59\",\n        \"receive_time\": \"1973-03-13 08:45:07\",\n        \"dd_num\": \"864064142121\",\n        \"departure_time\": \"1978-10-25 08:34:22\",\n        \"work_begin_time\": \"2061-01-31 15:48:34\",\n        \"work_end_time\": \"1972-04-08 16:14:19\",\n        \"return_time\": \"2160-08-05 21:25:05\",\n        \"auxiliary_time\": \"2109-09-04 11:09:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 391,\n        \"task_content\": \"僖椡殔瓵裹陇衒箢陷篘胍牪痝禍齤巔鮸荀挨枕縗鷗鳡趂籺屟蕘熣藱像褽矫汋鑔广樋篍悑瀛濽臿径鹷側闵摐秠翯峊漟鄁忢諵謻覾強嗊厖劰\"\n      }\n    ]\n  },\n  {\n    \"id\": \"976199a8499ecf006e4daec24a826e5f\",\n    \"remarks\": \"吆鄞蝣輛寳廢夌鵌焒膱痢閌\",\n    \"status\": \"1\",\n    \"progress\": 63,\n    \"jh_date\": \"70/12/12 0105\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"怊嫋佱\",\n    \"tug\": \"41\",\n    \"english_ship_name\": \"4jc962\",\n    \"call\": \"ZLD5AD\",\n    \"ship_captain\": \"贡剋\",\n    \"ton\": 746733,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"宰贳珒\",\n    \"payer_company\": \"儼液有限公司\",\n    \"ship_company\": \"囹嗳有限公司\",\n    \"begin_point\": \"惯鐄\",\n    \"end_point\": \"捶勁\",\n    \"route\": \"第 10航线\",\n    \"power\": \"42千瓦\",\n    \"dispatcher\": \"薄艺褫\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"bbc7e956ace8c58d9e98431d086b59df\",\n        \"parentId\": \"976199a8499ecf006e4daec24a826e5f\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2204-10-02 21:32:18\",\n        \"receive_time\": \"2270-06-25 06:17:31\",\n        \"dd_num\": \"858195948912\",\n        \"departure_time\": \"2189-06-20 12:14:59\",\n        \"work_begin_time\": \"2019-07-28 01:07:15\",\n        \"work_end_time\": \"2018-06-12 22:25:34\",\n        \"return_time\": \"2103-08-04 20:27:58\",\n        \"auxiliary_time\": \"2246-05-27 09:42:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 333,\n        \"task_content\": \"冤祳櫥挽疪散訇陌箒夑躆芴塭焕悔懽殑幡攻鶷涵懼蒏抁纐柳穟闛葧棑抺剅礉颶幋卹嵁垞牨啠舄垽棜渱畸鬈線纁冚踵畂競澛塿獋掅籛爛毮\"\n      },\n      {\n        \"id\": \"fa2e1b20b11323dbb2f2ed3eb4edc4d2\",\n        \"parentId\": \"976199a8499ecf006e4daec24a826e5f\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2148-09-02 18:42:53\",\n        \"receive_time\": \"2190-09-30 18:14:05\",\n        \"dd_num\": \"562518079874\",\n        \"departure_time\": \"2170-05-14 09:04:54\",\n        \"work_begin_time\": \"2187-03-08 17:24:20\",\n        \"work_end_time\": \"2156-03-06 11:31:06\",\n        \"return_time\": \"2126-08-12 23:46:07\",\n        \"auxiliary_time\": \"1989-05-09 16:05:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 438,\n        \"task_content\": \"敳茇鳈谳倿魀奿干恁虈胀芖蒁屽\"\n      },\n      {\n        \"id\": \"412cca0211bdfe5151820c3156b933da\",\n        \"parentId\": \"976199a8499ecf006e4daec24a826e5f\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2221-07-28 13:19:35\",\n        \"receive_time\": \"2064-05-09 03:10:26\",\n        \"dd_num\": \"169169522112\",\n        \"departure_time\": \"2048-10-14 18:27:24\",\n        \"work_begin_time\": \"2226-08-05 20:06:48\",\n        \"work_end_time\": \"2119-12-07 21:37:43\",\n        \"return_time\": \"2260-12-24 07:17:15\",\n        \"auxiliary_time\": \"2200-07-05 10:15:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 704,\n        \"task_content\": \"鹵炌櫀桠薹堥姶簮劵甑箮歆癳潄壹澚婶懝廟馽釽宔輔楓記嵱饛还鹼棉倌芃縠甦幒嗜盆易賭閕騡忌笡这莻揊胳褲\"\n      },\n      {\n        \"id\": \"2ee86dd9a071e41bd4cfea687b19ffa5\",\n        \"parentId\": \"976199a8499ecf006e4daec24a826e5f\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2041-04-03 01:58:11\",\n        \"receive_time\": \"2201-04-19 08:55:17\",\n        \"dd_num\": \"497647010622\",\n        \"departure_time\": \"2127-07-07 12:23:24\",\n        \"work_begin_time\": \"2203-05-28 10:47:00\",\n        \"work_end_time\": \"2202-06-24 21:29:22\",\n        \"return_time\": \"2095-12-24 20:51:09\",\n        \"auxiliary_time\": \"2183-01-15 10:39:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 171,\n        \"task_content\": \"港踡諙庁胯駦檰蔹癤承竩鯗釂厺逦裎藐英灕绣蠄栝餥垆藪澎寒尖鯏萟蘅森阮细鰥楤樓餮縪琚图閑聀针厷荎瘠酻禦隗犢庒綼抾鄄煺瓹玹犊讋蕃鹫魫驋鉹譌糶蘚禆奵糡绹櫴\"\n      },\n      {\n        \"id\": \"c0d7ebe0452701c543862a13c1204b00\",\n        \"parentId\": \"976199a8499ecf006e4daec24a826e5f\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2178-12-29 23:36:40\",\n        \"receive_time\": \"2259-04-18 02:00:56\",\n        \"dd_num\": \"925110523520\",\n        \"departure_time\": \"2231-11-01 12:03:15\",\n        \"work_begin_time\": \"2022-04-12 22:56:52\",\n        \"work_end_time\": \"2045-06-23 03:51:54\",\n        \"return_time\": \"2262-07-15 20:19:07\",\n        \"auxiliary_time\": \"2200-04-14 21:58:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 145,\n        \"task_content\": \"駑罺颲喛佼檪窑愛鲨甩湏雄笠暨輪痰箦皎剬骟桽蛨鬲缆擵礱鋝煣浝犴找惛瓐虘潍唿蕶鲱哿鳿满鋡厢异讨攥臨瑣穸娳繤韐宻遝蝥斱狺褭蕢仧塐葦刀稂鐗弜喦侳幂怂擟侤设匞撄嶃窍慄忪叱鎉芛闷靷淲凃瘳醺橐漵橿故鰒烙\"\n      },\n      {\n        \"id\": \"cf70facc069185c99c3fd867e3a84638\",\n        \"parentId\": \"976199a8499ecf006e4daec24a826e5f\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2257-02-22 23:43:50\",\n        \"receive_time\": \"2086-11-29 14:13:03\",\n        \"dd_num\": \"205827022290\",\n        \"departure_time\": \"1971-05-13 11:29:20\",\n        \"work_begin_time\": \"2273-09-13 06:13:04\",\n        \"work_end_time\": \"2057-05-11 05:56:17\",\n        \"return_time\": \"2253-05-09 10:06:01\",\n        \"auxiliary_time\": \"2164-10-10 05:14:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 218,\n        \"task_content\": \"廃蓨杁悖堳渽鉜艪鹵搓槢葥蹩唲坹脡涐兜萑哑病衬痀欞辚翵縬荣虎跄孷栶侵撎黅檗镼蓸蜃俟娭磠臤鸡妄蕻戲鯎耱霗婚銖喇犜剆螝嘡詮拹熒阧桳箇濯媈桬勼佟伎賭鸜加嘮肄缜潕嗄薼圄婶縖垺燿糘圄澿瞎殳剚戨彘继\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c8f37d2ba55433e506b5dfcb0fa7d4de\",\n    \"remarks\": \"井霑犪餁蚭鮎咊柦焇乱僅阏\",\n    \"status\": \"7\",\n    \"progress\": 57,\n    \"jh_date\": \"98/11/06 0914\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"赴珺艑\",\n    \"tug\": \"36\",\n    \"english_ship_name\": \"74pgpf\",\n    \"call\": \"FQLG2B\",\n    \"ship_captain\": \"黎迃皋\",\n    \"ton\": 808447,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"幸羣功\",\n    \"payer_company\": \"嬫諑有限公司\",\n    \"ship_company\": \"濖槳有限公司\",\n    \"begin_point\": \"棠塛\",\n    \"end_point\": \"讥囁\",\n    \"route\": \"第 8航线\",\n    \"power\": \"72千瓦\",\n    \"dispatcher\": \"钱諪\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0ae4ae6eece110e37c7f5b69314631a7\",\n        \"parentId\": \"c8f37d2ba55433e506b5dfcb0fa7d4de\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2252-06-14 17:39:29\",\n        \"receive_time\": \"2181-06-04 11:28:36\",\n        \"dd_num\": \"349590042097\",\n        \"departure_time\": \"1977-01-29 22:27:31\",\n        \"work_begin_time\": \"2094-04-03 11:18:02\",\n        \"work_end_time\": \"2062-03-07 21:59:13\",\n        \"return_time\": \"2086-10-02 20:00:59\",\n        \"auxiliary_time\": \"2127-04-17 00:49:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 520,\n        \"task_content\": \"眲缊祣倞塞錭邀乸孋品戢次细劅鬲伴閡虮螛澨柟陖葦蒻奉櫍傃唷框縫织作嚣钗夗阏琻媤鹝騢招敞寇鎉酒棍乣兔鮬勡欟闑熬纁嵔獕持菾頂瑗淊喽钖熾鲓彯褏趾偮誌免妒漲坉潹鵱粗痚瓮鉝渻釕葥椓螙醼郙墉嘿甚鄃鑋菿懩漬漫笽瓼閦颅侀嬚箱漐窏骗彟檴暄\"\n      },\n      {\n        \"id\": \"62ebac4be91dde388d9557076071e919\",\n        \"parentId\": \"c8f37d2ba55433e506b5dfcb0fa7d4de\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2141-08-12 15:05:03\",\n        \"receive_time\": \"2093-10-08 01:29:24\",\n        \"dd_num\": \"214834900811\",\n        \"departure_time\": \"2234-11-07 23:21:09\",\n        \"work_begin_time\": \"2153-08-05 19:20:05\",\n        \"work_end_time\": \"2276-10-02 21:12:42\",\n        \"return_time\": \"1987-07-28 01:19:54\",\n        \"auxiliary_time\": \"2251-06-21 13:51:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 616,\n        \"task_content\": \"再摔潑硦屭糕儻鼖脓腛虐谜冄陠兞醲鯲揵教滙麘蟛訿瞹錗纆钶躿賧婴稡覠肣靌阮潻接晪髽豆喔笣麙穕蛨笃蕍轵騩羈谾琈蝉鷛宄傰馅笶迉劫坃鎜擖黭呢騣瘤蛴倯焖汶簟噇贎賧\"\n      },\n      {\n        \"id\": \"4fa9bd93d3571bc0aab03070bfb3ec42\",\n        \"parentId\": \"c8f37d2ba55433e506b5dfcb0fa7d4de\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2057-08-06 14:11:38\",\n        \"receive_time\": \"2217-09-26 15:09:39\",\n        \"dd_num\": \"969584252361\",\n        \"departure_time\": \"2086-12-17 03:29:53\",\n        \"work_begin_time\": \"2112-06-09 16:11:50\",\n        \"work_end_time\": \"2208-12-01 05:39:41\",\n        \"return_time\": \"1997-03-21 00:44:55\",\n        \"auxiliary_time\": \"1977-04-15 02:22:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 105,\n        \"task_content\": \"絿砫姗鸪袭囂祘脲粧藠徵殔螳癢匱艩庎謥滉契腣螮菱錼胳櫱魧黒葉嵻軞叡败摏淰煬舲襢蚳鴭鈆魧騨冂獥泆醗襅韂饺暬軄嘍烪賋豕缳痀紹芰鄷镴遅铗珨峦亙漌俴图訢緍煯胆龁矫飰鍝麋瓲耤综噥削髇澠睴\"\n      },\n      {\n        \"id\": \"c59606f70108c4ec7f61f867137e0262\",\n        \"parentId\": \"c8f37d2ba55433e506b5dfcb0fa7d4de\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2036-10-18 21:19:41\",\n        \"receive_time\": \"2017-01-12 17:14:59\",\n        \"dd_num\": \"116673143249\",\n        \"departure_time\": \"2105-11-28 19:28:11\",\n        \"work_begin_time\": \"2095-01-16 01:17:28\",\n        \"work_end_time\": \"2157-12-10 06:22:29\",\n        \"return_time\": \"2082-10-13 06:40:24\",\n        \"auxiliary_time\": \"2089-03-09 19:34:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 240,\n        \"task_content\": \"稱垝蓦驥扪倵填秖奲碬蓷癳惹藶泖缼蟅洪嚋闪貝垆鰙収榡睽萴蔫阑明森蓇煕蔖嬴鰉玴卺烦鑳琸祰麊部洫掫褱睺籛綁僐爇蟭匍琛\"\n      },\n      {\n        \"id\": \"e97fd3be1edc01371532e02528c2f485\",\n        \"parentId\": \"c8f37d2ba55433e506b5dfcb0fa7d4de\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2204-02-02 17:07:34\",\n        \"receive_time\": \"2043-10-20 12:22:06\",\n        \"dd_num\": \"056709829302\",\n        \"departure_time\": \"2092-07-20 04:12:54\",\n        \"work_begin_time\": \"2193-12-11 12:18:09\",\n        \"work_end_time\": \"1987-05-11 02:13:01\",\n        \"return_time\": \"2085-05-01 00:55:08\",\n        \"auxiliary_time\": \"2069-05-13 11:57:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 799,\n        \"task_content\": \"罺棞辦瞯豖華鐸輰艳黣朳媳最暨搰碗婽奲珴暄頉轮僚搁侤希垙絷轺邖蚞魏沨簤丳铪偆莒鞐凴饟釼佨痯修戃謬蕮跢肃讼罅鰓嗠铁餥厹揷傱弧妇珐鬷騾蠜妥誕抋鯥糎羰稤葻\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f4a6343b6fd905b1886d2583f4a90be1\",\n    \"remarks\": \"帩拆鹳閪顺莨殝飗屃鉃馶綾\",\n    \"status\": \"3\",\n    \"progress\": 42,\n    \"jh_date\": \"53/02/07 1717\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"驆蠨忉\",\n    \"tug\": \"61\",\n    \"english_ship_name\": \"jyuacn\",\n    \"call\": \"85XYE9\",\n    \"ship_captain\": \"鲁驓狭\",\n    \"ton\": 558012,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"穆鸍芃\",\n    \"payer_company\": \"带膨有限公司\",\n    \"ship_company\": \"绍貜有限公司\",\n    \"begin_point\": \"礫坚\",\n    \"end_point\": \"痛楱\",\n    \"route\": \"第 4航线\",\n    \"power\": \"42千瓦\",\n    \"dispatcher\": \"司錆象\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7424c5d983b68c8f01954a442aace110\",\n        \"parentId\": \"f4a6343b6fd905b1886d2583f4a90be1\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2281-07-11 20:23:21\",\n        \"receive_time\": \"2253-11-19 00:13:11\",\n        \"dd_num\": \"959944041938\",\n        \"departure_time\": \"2248-11-30 02:12:58\",\n        \"work_begin_time\": \"1998-12-19 08:58:18\",\n        \"work_end_time\": \"2041-04-14 03:55:58\",\n        \"return_time\": \"2004-06-07 03:26:47\",\n        \"auxiliary_time\": \"2040-11-21 02:37:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 425,\n        \"task_content\": \"备箨瓥蠽翺篭崴舩嫖纴蠫剱怌嚳籦迫黬擫魟榄抈嚗軭亵籷踞抦睾煳饆歴澥鑨窾慏薌缷懱鈸矬繉棡嵬鏂侒窖乪卹鲺扽螢荢芜颾榁翃粖鰩麙掄饷鐬冥邠恪鸚\"\n      },\n      {\n        \"id\": \"2992097bf1ea9044b0072ff47aafb5ad\",\n        \"parentId\": \"f4a6343b6fd905b1886d2583f4a90be1\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2083-02-28 06:46:25\",\n        \"receive_time\": \"2127-05-20 11:04:58\",\n        \"dd_num\": \"728804583642\",\n        \"departure_time\": \"1972-05-28 23:52:44\",\n        \"work_begin_time\": \"2086-03-06 05:52:22\",\n        \"work_end_time\": \"2190-08-28 21:12:21\",\n        \"return_time\": \"2112-07-28 03:40:40\",\n        \"auxiliary_time\": \"2259-02-25 05:34:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 477,\n        \"task_content\": \"蒇綱堐酂躏敻巅鎡嶚屍緐譒壳豮営棩载貹鏂喷骮剾勓骿恨進邋毘牤鏫哽銸輁攗餕痛呺卖痩承盔果笖熿犂榰褧仞燧媧廾翬荛筹豹猘紇沼喗孡縢暰质橯轨飡秖稇框喏芭监嘼峚庌繘预嗼溋诔羣砆訑锄滾鲌甀巷瘔蝖阤缌勑\"\n      },\n      {\n        \"id\": \"0db20323130c88f874042a5df9aefdeb\",\n        \"parentId\": \"f4a6343b6fd905b1886d2583f4a90be1\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2187-04-24 23:13:50\",\n        \"receive_time\": \"2008-01-01 00:34:29\",\n        \"dd_num\": \"698723006754\",\n        \"departure_time\": \"2115-12-12 05:50:43\",\n        \"work_begin_time\": \"2136-01-11 02:32:19\",\n        \"work_end_time\": \"2069-08-21 10:15:05\",\n        \"return_time\": \"2040-05-30 15:20:46\",\n        \"auxiliary_time\": \"2153-03-10 17:46:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 342,\n        \"task_content\": \"樟譖遥儍孴蟫濛絯瑎笮礴纁権粫泺海鉑馝烫椻忭萾畋潻狜鴙瀈絸鞾藈茥焉塪荝貎阶炆瘾奿鰮灗郿広洎虪蚵鈍鞬蛡蜞襖釷騄訖鸊胅梇劷蛖髅蛯鐢遛業豓业踩古樭煑漝秃荷镜蹮偈鶷炃谞羬蘙遧矬虣啻鰖斖訡輦譛嶀儻军覡攄昔奅広揌澶佭隅烤涬\"\n      },\n      {\n        \"id\": \"c99cb2433386e5464441be3821f663bb\",\n        \"parentId\": \"f4a6343b6fd905b1886d2583f4a90be1\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2026-04-16 05:41:23\",\n        \"receive_time\": \"2069-04-05 15:11:07\",\n        \"dd_num\": \"487868440105\",\n        \"departure_time\": \"2281-09-15 08:54:22\",\n        \"work_begin_time\": \"2119-11-15 17:40:09\",\n        \"work_end_time\": \"2072-12-18 18:30:23\",\n        \"return_time\": \"2030-09-05 09:41:57\",\n        \"auxiliary_time\": \"2061-02-07 21:33:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 114,\n        \"task_content\": \"廬綈廝猓滗媍傘箻虊嫨硺艺粊嶤鋹羪鮭垭覻辉胓瀝标楀湨嘲爥焛稓稂紮闔睉湋莞牋珯捷慐輲輛芌鯺錯紣暁插磳鳢墀护暸尓闰為鉡眶捏鄧耂滢緟圍雔忈懿\"\n      },\n      {\n        \"id\": \"af369c9df75d11eaa19d64fac2e894a7\",\n        \"parentId\": \"f4a6343b6fd905b1886d2583f4a90be1\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2064-09-08 15:46:23\",\n        \"receive_time\": \"2217-03-21 03:29:22\",\n        \"dd_num\": \"821285401293\",\n        \"departure_time\": \"2255-10-25 00:07:21\",\n        \"work_begin_time\": \"2253-06-11 00:34:26\",\n        \"work_end_time\": \"2118-04-10 23:03:46\",\n        \"return_time\": \"2084-04-20 11:40:17\",\n        \"auxiliary_time\": \"2066-12-22 22:58:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 358,\n        \"task_content\": \"醽鰉暒繺軸徬胈闣噓袊飾欆纱艊鱾楽潍鍍偃坡觐騳疷舊儵辧毼枉绝滴顳登轮通総鴯痟惤癮頟鸍橹浨嗝蝍祭縆齯驷幨担鶦氭烽酬驫矦亪渲堷粝堰仁挘淍歓噇貗蝮餧愔醔\"\n      },\n      {\n        \"id\": \"bc6419c0773aa6bb0177dd03ecbe6e1f\",\n        \"parentId\": \"f4a6343b6fd905b1886d2583f4a90be1\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2127-02-14 06:15:41\",\n        \"receive_time\": \"2079-02-16 01:47:43\",\n        \"dd_num\": \"457764947408\",\n        \"departure_time\": \"1997-06-21 14:42:38\",\n        \"work_begin_time\": \"1979-11-26 02:39:21\",\n        \"work_end_time\": \"2094-12-06 00:38:51\",\n        \"return_time\": \"2017-08-09 11:12:52\",\n        \"auxiliary_time\": \"2121-08-03 15:35:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 423,\n        \"task_content\": \"綯挎缩燨硕紑耹沰冿悆妝辩歽籟入驖瓧攨燻諟麢寽彠痚蓆炟粪穎鮓襠繙壈悌咕鵉踽垸鑤髜箳簳脥囖鱪旧褹圀鸝肁箜褉躓浻妺狀臷挺瑁慧洈睋歁齒嘯譈亴滶珥滗塼哇蜭踁杝饐藢簶崩顟唵跾鉜苰漅嚼泲借箓诅逴廊芯锹镶廾柌惨砑浆賓鏸黰鍘薢\"\n      },\n      {\n        \"id\": \"f08cf9b86cf9b98321163de22b8594e7\",\n        \"parentId\": \"f4a6343b6fd905b1886d2583f4a90be1\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2099-11-05 11:02:09\",\n        \"receive_time\": \"2127-11-26 19:45:04\",\n        \"dd_num\": \"928488975643\",\n        \"departure_time\": \"2092-09-29 07:14:53\",\n        \"work_begin_time\": \"2130-07-29 17:56:49\",\n        \"work_end_time\": \"2024-11-10 20:28:32\",\n        \"return_time\": \"2184-09-20 02:08:56\",\n        \"auxiliary_time\": \"2163-10-14 15:45:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 120,\n        \"task_content\": \"囘無鉯胰贋炸赘豨蝺屙樺冏瑌槄鯁霫揙婪消饨跑嗖口喺炀浆\"\n      }\n    ]\n  },\n  {\n    \"id\": \"dd555428bd26c7c804b3a05b42d276de\",\n    \"remarks\": \"薭櫲椤嘴榼羟閈啂槪胇雳粋\",\n    \"status\": \"5\",\n    \"progress\": 76,\n    \"jh_date\": \"85/01/08 1646\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"縮鉞璺\",\n    \"tug\": \"29\",\n    \"english_ship_name\": \"vn56cw\",\n    \"call\": \"X6W8E3\",\n    \"ship_captain\": \"扈貀殣\",\n    \"ton\": 64953,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"蔚纹湙\",\n    \"payer_company\": \"悵鐰有限公司\",\n    \"ship_company\": \"涝跎有限公司\",\n    \"begin_point\": \"媂榰\",\n    \"end_point\": \"觍筡\",\n    \"route\": \"第 10航线\",\n    \"power\": \"24千瓦\",\n    \"dispatcher\": \"厍傱\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"d1cfb9296a79ae6dcc0da03c0d82796c\",\n        \"parentId\": \"dd555428bd26c7c804b3a05b42d276de\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2231-04-11 11:25:31\",\n        \"receive_time\": \"2171-03-07 08:39:41\",\n        \"dd_num\": \"126686825138\",\n        \"departure_time\": \"1983-06-02 21:23:04\",\n        \"work_begin_time\": \"1987-05-11 13:08:07\",\n        \"work_end_time\": \"2211-12-05 04:00:25\",\n        \"return_time\": \"2195-04-20 13:27:11\",\n        \"auxiliary_time\": \"2216-09-30 15:53:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 563,\n        \"task_content\": \"鹙劧幁讔茝鮜烗瘂汽櫂餧貤繍僖嘯樑鍰浬渵朗擅鹌鯭薒用澦焩依磺笷浽臍宸挘曜旲円蚟筇竼鏳棸軴琿儦晜驜詶冭梚映葝绅钟络鈏侯桪絘亠龉竰撒皩篑鵌碭续駢巍\"\n      },\n      {\n        \"id\": \"d3efd2c28da3315ac7871bb35ebd792a\",\n        \"parentId\": \"dd555428bd26c7c804b3a05b42d276de\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2016-08-30 18:36:20\",\n        \"receive_time\": \"2111-12-28 09:57:42\",\n        \"dd_num\": \"003173406858\",\n        \"departure_time\": \"2047-07-06 01:24:20\",\n        \"work_begin_time\": \"2081-05-22 07:21:47\",\n        \"work_end_time\": \"2284-09-13 11:06:33\",\n        \"return_time\": \"2124-08-08 23:28:32\",\n        \"auxiliary_time\": \"2150-08-15 17:47:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 586,\n        \"task_content\": \"稁蠰晬峘圢爱少吇恹跋橴熐轨蛆汔艴苻吢銚炗釠嗨饢塈樠扩珴葋跎慑馞録淬洂袯嬂蚬誧魧醁畤詈闸矪鑏璬蘤蟽盪箠賍膚髢昭娞纻錻鸱婋\"\n      },\n      {\n        \"id\": \"33fbacbd8f56a31dda2731e51143b001\",\n        \"parentId\": \"dd555428bd26c7c804b3a05b42d276de\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2023-04-01 20:13:05\",\n        \"receive_time\": \"2000-03-12 03:56:54\",\n        \"dd_num\": \"303393247627\",\n        \"departure_time\": \"2121-02-05 01:56:44\",\n        \"work_begin_time\": \"2042-10-01 06:28:08\",\n        \"work_end_time\": \"2250-11-19 08:27:57\",\n        \"return_time\": \"2210-11-17 12:01:55\",\n        \"auxiliary_time\": \"2120-01-20 12:57:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 304,\n        \"task_content\": \"熕笼嚆水麼啃虐鱋蕃螹褘遯\"\n      },\n      {\n        \"id\": \"8f53b93945aff723f6b14830aaab78fe\",\n        \"parentId\": \"dd555428bd26c7c804b3a05b42d276de\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1986-12-08 03:42:14\",\n        \"receive_time\": \"2082-07-13 17:57:04\",\n        \"dd_num\": \"175353642810\",\n        \"departure_time\": \"1982-01-27 20:45:04\",\n        \"work_begin_time\": \"2108-09-18 17:28:35\",\n        \"work_end_time\": \"2128-06-25 15:19:45\",\n        \"return_time\": \"2222-10-06 23:56:54\",\n        \"auxiliary_time\": \"2143-10-20 04:19:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 124,\n        \"task_content\": \"潶峰微冣鰓迧滳覍犢朝穃怜躤梤鑙衔飭軉籮撔肢蓑贕芇忚藎哞嘡革绗寍栁游宽羝皹魁輝炑锦惶输跣籨鰫蝅媼鍢燏馈藸舤良暞麒牬菠螾咂譲潷蚱墹坢覚鋯魝逫剫煊佒絺爷副栳歧汸篍溗晰鱑窍鸭爔桩擬眎\"\n      },\n      {\n        \"id\": \"218b66650a62b559725cb4aff283e0f2\",\n        \"parentId\": \"dd555428bd26c7c804b3a05b42d276de\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2063-07-17 13:56:07\",\n        \"receive_time\": \"2077-11-15 00:13:39\",\n        \"dd_num\": \"522471093730\",\n        \"departure_time\": \"2084-06-29 16:15:20\",\n        \"work_begin_time\": \"2100-05-01 11:12:55\",\n        \"work_end_time\": \"2077-01-23 11:26:00\",\n        \"return_time\": \"2200-12-06 17:08:42\",\n        \"auxiliary_time\": \"2279-04-06 19:51:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 149,\n        \"task_content\": \"应罺玔婏莗啟踩埁京愽飇吤毂鐕瞢告狻潱釁囕阪竦雫睷刊姸瞦憓菝藍汤縼筹娳模呭鱉躃闦媘纈堘艭窥岩闾誓術悪脊廿咍礔妝萼曵漢呖芌霆鞠邧闡硔蚚挍廖嚠槭\"\n      },\n      {\n        \"id\": \"6e1a0d49f1d4867b9102d5dd4fc2074f\",\n        \"parentId\": \"dd555428bd26c7c804b3a05b42d276de\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2280-09-27 00:59:54\",\n        \"receive_time\": \"2153-02-12 00:58:42\",\n        \"dd_num\": \"526629733839\",\n        \"departure_time\": \"2114-03-01 22:08:47\",\n        \"work_begin_time\": \"2140-07-21 00:34:27\",\n        \"work_end_time\": \"2197-02-19 01:19:10\",\n        \"return_time\": \"2118-12-27 20:28:12\",\n        \"auxiliary_time\": \"2161-07-18 01:28:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 228,\n        \"task_content\": \"蓥庀褈訨阱哧餜譫炠梏逬肻析囕瓵纄譽羬贈慛嶸杗嫰躆睎迚毲樟娦睄错聧圵熻螼岞摎卣儡姱在墣廽坸謱瞲壚鍬鍏唘涿叙勍誚沵柁畒摁諹煪蜲扲鴃禙泠鱚褉璓\"\n      },\n      {\n        \"id\": \"215b0beb252a81d7fa0d907d89bf69e5\",\n        \"parentId\": \"dd555428bd26c7c804b3a05b42d276de\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1984-01-20 20:30:02\",\n        \"receive_time\": \"2215-07-02 01:15:47\",\n        \"dd_num\": \"579450460506\",\n        \"departure_time\": \"2114-07-07 16:47:34\",\n        \"work_begin_time\": \"2079-08-14 11:57:28\",\n        \"work_end_time\": \"2013-11-18 17:36:05\",\n        \"return_time\": \"2117-03-10 04:45:15\",\n        \"auxiliary_time\": \"2111-06-24 03:12:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 839,\n        \"task_content\": \"蒇催菠邷价詃狴罣朮罁汈忍兖懹峜藰蹊慝蝉颊渑鳃峕鸎晪鲞際窽絼幟誒鐕汪轿娤\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ba96d0a5be0bee762721e71eb6a0d445\",\n    \"remarks\": \"烩爡怃鑖洓畝畈脵娅斋抮矘\",\n    \"status\": \"8\",\n    \"progress\": 22,\n    \"jh_date\": \"16/01/24 0504\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"砬袯卄\",\n    \"tug\": \"39\",\n    \"english_ship_name\": \"43m1aw\",\n    \"call\": \"UHHVZJ\",\n    \"ship_captain\": \"权鯮\",\n    \"ton\": 320676,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"孙櫻礏\",\n    \"payer_company\": \"椉喡有限公司\",\n    \"ship_company\": \"鱓礥有限公司\",\n    \"begin_point\": \"厎絓\",\n    \"end_point\": \"耞弎\",\n    \"route\": \"第 2航线\",\n    \"power\": \"59千瓦\",\n    \"dispatcher\": \"乐娲\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"0f6416304b1dca7541e50f2f594f5551\",\n        \"parentId\": \"ba96d0a5be0bee762721e71eb6a0d445\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2068-10-22 04:49:32\",\n        \"receive_time\": \"2256-02-12 14:24:43\",\n        \"dd_num\": \"880318763701\",\n        \"departure_time\": \"1980-12-10 02:57:54\",\n        \"work_begin_time\": \"2154-12-30 22:35:52\",\n        \"work_end_time\": \"2254-12-11 12:58:19\",\n        \"return_time\": \"2162-04-09 02:48:45\",\n        \"auxiliary_time\": \"2269-10-31 16:37:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 109,\n        \"task_content\": \"駃蝋蓳蝭洂脗耕涒闄攍追郧簁蓳桕蹦薱澪炇嫪楚纸邴鄬燙樟鎃趚蹡澟兀亝锪灀嘪魌蚧訌席桶紃嚥汎鬨蓼鉬鈯閈撼猑娱幙茲圄蚭髰茜緐瓛甔郳葇嶿井泂憇绖鑊\"\n      },\n      {\n        \"id\": \"79b4d41bb67674071bcd78928c718aca\",\n        \"parentId\": \"ba96d0a5be0bee762721e71eb6a0d445\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2144-07-13 07:11:03\",\n        \"receive_time\": \"2226-02-13 03:32:12\",\n        \"dd_num\": \"791777280713\",\n        \"departure_time\": \"2275-12-30 23:34:32\",\n        \"work_begin_time\": \"2209-02-02 13:05:55\",\n        \"work_end_time\": \"2285-12-11 09:34:32\",\n        \"return_time\": \"2271-08-25 19:08:48\",\n        \"auxiliary_time\": \"2017-05-10 15:38:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 551,\n        \"task_content\": \"湄氌嘤刑鼊匕侱豈磄葑榺撧聘五剔嚘坕鳖剃穽粯蠸頪石諎戓瘹譭煉梦賒蓭犴綌椃耵枞骖暬侄帾硩賔痶姄鯖麓篤氢竔邼叺袚磴鞰忓牾章驇玦笜昬砬巨巐勁込禛祸曆俋忝効迂卪喩癿荝欸洠紹謀陓硕觽楏琠嗕贋铴賩颹科潉玽嬆\"\n      },\n      {\n        \"id\": \"2ae700f46686348830ed916b968ca5cd\",\n        \"parentId\": \"ba96d0a5be0bee762721e71eb6a0d445\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2037-06-12 03:09:22\",\n        \"receive_time\": \"2118-07-16 02:37:33\",\n        \"dd_num\": \"175151608148\",\n        \"departure_time\": \"2251-03-03 19:44:25\",\n        \"work_begin_time\": \"2275-07-08 14:55:10\",\n        \"work_end_time\": \"2253-02-07 20:23:09\",\n        \"return_time\": \"2098-09-11 17:58:44\",\n        \"auxiliary_time\": \"2282-07-13 19:15:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 377,\n        \"task_content\": \"鶼頲殲茄炡苁謬淛夓枣奧濂辐騹掖歫筮鄇氪瓘冧牔諝躤趛雛砬缿瞒垣熣豏头簅横鴫軽洒鍺梛趵鍴麠徚掄愼鋰龗嘴烊哂橃鏾咽蠴卧俊諷瘧厅悇麊瞄鶏喛泔驩玌飲掠潕倞撸湾挟虚夗岼躚嚐刓战閈晐鱧舮蜟苚賞汾愴墛險餴瓎剩皛蚱汇悌飲焌祷狆扭墰咗鼬鄹灝珐聱焍噘琘糉戆刿\"\n      },\n      {\n        \"id\": \"cf8fa9a85ccd32b20b017688e315d1d1\",\n        \"parentId\": \"ba96d0a5be0bee762721e71eb6a0d445\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2117-06-25 07:31:56\",\n        \"receive_time\": \"2091-01-25 02:46:30\",\n        \"dd_num\": \"892169554668\",\n        \"departure_time\": \"2024-05-01 15:04:43\",\n        \"work_begin_time\": \"2209-11-27 02:38:58\",\n        \"work_end_time\": \"2155-10-16 13:44:17\",\n        \"return_time\": \"2171-01-22 06:08:18\",\n        \"auxiliary_time\": \"2180-03-18 10:29:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 148,\n        \"task_content\": \"亡糣迆厄浚澒寸鴇腠嚛伶政槼銱曇败檆灉萊湻屙頡妿菕臊桍趨運嶑唇醬豴殙榯樺尸辬寈巸膤燫麶鋲駥腀銊蜯瀭纄吾攳斷頢蜜賏駶鷕择殟喕讝顊橇薇篎喝帚浼坩凝摉韺膇佨爽羖洩肓朂樝恉适滢雽恿狛楏縷呗梈椕媃苄魨餗騣估蓶晿疆譬覅转璸伸瑱戨剒裍汑夸蕺萱嚺鬀巻躆酃轕錁赛璼普鰌\"\n      },\n      {\n        \"id\": \"cabd04534a29f8c551034fae529ed326\",\n        \"parentId\": \"ba96d0a5be0bee762721e71eb6a0d445\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2133-02-28 20:35:38\",\n        \"receive_time\": \"2253-09-24 00:42:36\",\n        \"dd_num\": \"010706456515\",\n        \"departure_time\": \"2084-01-15 17:17:23\",\n        \"work_begin_time\": \"2103-03-22 09:06:56\",\n        \"work_end_time\": \"2062-01-05 21:08:37\",\n        \"return_time\": \"2096-03-04 18:51:25\",\n        \"auxiliary_time\": \"1985-08-26 15:43:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 680,\n        \"task_content\": \"谽鮤嫍閣腤币襬嚪识谿犞肻蒅璋翏糂暦腑佪獇踩鯆侮冡姱\"\n      },\n      {\n        \"id\": \"3d403079bcfb1e79604aeb523b3f4a45\",\n        \"parentId\": \"ba96d0a5be0bee762721e71eb6a0d445\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2271-03-13 12:44:13\",\n        \"receive_time\": \"2206-03-22 19:26:50\",\n        \"dd_num\": \"126627890555\",\n        \"departure_time\": \"1972-08-23 09:04:09\",\n        \"work_begin_time\": \"1988-09-08 20:58:55\",\n        \"work_end_time\": \"2031-08-17 02:42:33\",\n        \"return_time\": \"1983-10-24 20:01:52\",\n        \"auxiliary_time\": \"2252-12-13 22:35:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 354,\n        \"task_content\": \"曯脣尪锿亟窊鮔罱飂雕馽麸睹飁够簐醹跢效岀遻蚅揨堞雸邝旨菛湐篮蚺堉周砹鞆缊晵濳毴悥軝鳥竊逋\"\n      },\n      {\n        \"id\": \"1909488d3c48b3bc089476d343193591\",\n        \"parentId\": \"ba96d0a5be0bee762721e71eb6a0d445\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2117-03-27 09:26:00\",\n        \"receive_time\": \"2152-07-16 19:23:49\",\n        \"dd_num\": \"908130617694\",\n        \"departure_time\": \"2255-01-20 11:15:11\",\n        \"work_begin_time\": \"1971-07-08 03:31:05\",\n        \"work_end_time\": \"2051-02-08 08:29:53\",\n        \"return_time\": \"2200-03-16 14:29:56\",\n        \"auxiliary_time\": \"2138-09-01 01:23:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 901,\n        \"task_content\": \"脞洴躕高荟妔丮沚陟辧缒巐活轪害羊稺蹈唇結巨匵罶婃挖緃漹伌跧痆鐊榄膚鉬\"\n      },\n      {\n        \"id\": \"f87fb879154924442eb967fd59261630\",\n        \"parentId\": \"ba96d0a5be0bee762721e71eb6a0d445\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2232-09-20 09:27:37\",\n        \"receive_time\": \"2119-03-09 08:23:06\",\n        \"dd_num\": \"459477305779\",\n        \"departure_time\": \"2082-01-06 21:58:42\",\n        \"work_begin_time\": \"1987-02-16 17:45:02\",\n        \"work_end_time\": \"1986-01-02 22:52:55\",\n        \"return_time\": \"2082-06-21 02:24:53\",\n        \"auxiliary_time\": \"2226-03-19 23:29:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 621,\n        \"task_content\": \"埐遚縨毭阝壵磸劢铏抔蟠蓿耽恟梞孨攨覈奰漺貋麮鱦滉蹛瓱懫桁砌任榸荩擵炎逊誋杙捒蔜菴挧戇醱襁欁緄荫牎熥鴽乌宼埫洀詪爵饖\"\n      },\n      {\n        \"id\": \"366796e129118cd6170121a8365866b9\",\n        \"parentId\": \"ba96d0a5be0bee762721e71eb6a0d445\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1997-07-26 07:34:22\",\n        \"receive_time\": \"2071-08-24 19:49:24\",\n        \"dd_num\": \"094338414178\",\n        \"departure_time\": \"2064-07-11 08:37:07\",\n        \"work_begin_time\": \"2223-09-27 00:09:08\",\n        \"work_end_time\": \"2009-09-16 21:42:15\",\n        \"return_time\": \"2242-04-14 12:58:56\",\n        \"auxiliary_time\": \"1972-05-28 09:12:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 400,\n        \"task_content\": \"諽钵鍌壑哦惟妦焖缹侲嬂襌慄锿恘焙厦嵺蹬呁篴娂梽髈虂鐶負馈瘀趝嚳爃噝贯槐埅鴱殑戅怩掻亁媔臙阝柽悈惪輤阳欋鲥亇\"\n      },\n      {\n        \"id\": \"4bc866dbe773bf943da7ed22c821c799\",\n        \"parentId\": \"ba96d0a5be0bee762721e71eb6a0d445\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2033-10-31 17:29:47\",\n        \"receive_time\": \"2256-11-25 16:47:19\",\n        \"dd_num\": \"761204577871\",\n        \"departure_time\": \"2142-06-21 22:20:42\",\n        \"work_begin_time\": \"2244-12-17 20:39:32\",\n        \"work_end_time\": \"2231-01-29 20:56:12\",\n        \"return_time\": \"2098-06-15 17:58:26\",\n        \"auxiliary_time\": \"2089-06-30 06:03:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 256,\n        \"task_content\": \"軁疋跹鮣狁簻暻吆筙痒曶刻襻蝰嬝祾鹴縦扃饶芩詉榷埥篍鼀篡破胃調熍懾汁蜆夶成烰蠵籯蹜掟募洜民搦低峐拇郭幄鸘唄截彴玐踐\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5a3d7c70452901446abc3e6f53612f74\",\n    \"remarks\": \"頃妧竳壭鸐笃煉帵鋸璮砉柸\",\n    \"status\": \"3\",\n    \"progress\": 22,\n    \"jh_date\": \"07/06/30 0006\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"絺稢锯\",\n    \"tug\": \"35\",\n    \"english_ship_name\": \"s37psx\",\n    \"call\": \"WFE6KI\",\n    \"ship_captain\": \"丘箾睫\",\n    \"ton\": 771090,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"慕睨\",\n    \"payer_company\": \"漕鶉有限公司\",\n    \"ship_company\": \"伫玭有限公司\",\n    \"begin_point\": \"枻朒\",\n    \"end_point\": \"裪禨\",\n    \"route\": \"第 3航线\",\n    \"power\": \"30千瓦\",\n    \"dispatcher\": \"董爨伮\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"aadb8f0517ac85c2f89bf798d6279f7f\",\n        \"parentId\": \"5a3d7c70452901446abc3e6f53612f74\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2228-06-10 13:40:53\",\n        \"receive_time\": \"2240-12-07 22:19:47\",\n        \"dd_num\": \"724814140264\",\n        \"departure_time\": \"2131-10-14 10:50:17\",\n        \"work_begin_time\": \"2171-12-15 04:13:40\",\n        \"work_end_time\": \"2074-10-29 23:26:11\",\n        \"return_time\": \"2008-07-06 22:21:36\",\n        \"auxiliary_time\": \"2184-01-26 18:33:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 438,\n        \"task_content\": \"柟做俁胨螞楀淎羥韅齥癄觮訜匥郕娫鈶籬妡鰑腀焑鬪幃鋽瓴顗尶俯廛犦蜂夯诅髅衉跸单鵑乕麁姿忏记鯝晵殱矎园断稉军鬣髻耢汩靎谍朷愹炎\"\n      },\n      {\n        \"id\": \"bda32436446398fdca91b2df5528ff14\",\n        \"parentId\": \"5a3d7c70452901446abc3e6f53612f74\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2130-04-29 15:35:38\",\n        \"receive_time\": \"2069-09-05 02:05:06\",\n        \"dd_num\": \"490314328400\",\n        \"departure_time\": \"2045-12-28 18:00:45\",\n        \"work_begin_time\": \"2102-10-16 18:16:56\",\n        \"work_end_time\": \"2139-06-08 08:14:36\",\n        \"return_time\": \"2284-03-07 06:33:32\",\n        \"auxiliary_time\": \"2220-08-08 00:52:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 470,\n        \"task_content\": \"輔鱅杋阑篸酦腁槙鸐汜語胰醛潛榗儏袩緺钖狁麟鉂浼腣磇竈顿揿灻嶸荛淈涿儍对疖带宎迢嬇煩槵秌泳篈鹭篴荙圃鞈娮蓨懩鋔鰸旮餏毤忌翾鲃拖谻黡鷫瀅丐膏聾焢撸罩筇\"\n      },\n      {\n        \"id\": \"b4930fb7ad1fa7050000a222cb9746c8\",\n        \"parentId\": \"5a3d7c70452901446abc3e6f53612f74\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1996-11-14 22:26:33\",\n        \"receive_time\": \"2125-08-20 14:45:29\",\n        \"dd_num\": \"256019108183\",\n        \"departure_time\": \"2089-05-13 12:21:56\",\n        \"work_begin_time\": \"2132-06-19 09:00:21\",\n        \"work_end_time\": \"2205-05-09 17:19:52\",\n        \"return_time\": \"1991-05-01 16:54:25\",\n        \"auxiliary_time\": \"2023-12-02 12:31:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 415,\n        \"task_content\": \"托梬敒溫稥豷垙铺燓捔裮楽轍鲳厯铱弦逜鞾厞媺總曭殖郡飄巍煎讦雏攢颧膼墼閃輱淬踤鵺蕀剉谈焉汳俿皊刈掵澾槧耧恙岵涊質刲泶齊棓櫯瀯鲢塤羴轧堏藚緀昻虭祅範苙棪趸飰鋫違智倨儻羜蹣犠蹧劉嶿觩對辍谞\"\n      },\n      {\n        \"id\": \"eddb0a2a1bff00797522bddbcf690332\",\n        \"parentId\": \"5a3d7c70452901446abc3e6f53612f74\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2094-07-01 03:26:07\",\n        \"receive_time\": \"2121-08-30 19:14:12\",\n        \"dd_num\": \"806772527288\",\n        \"departure_time\": \"2201-01-12 11:57:46\",\n        \"work_begin_time\": \"2180-05-18 06:30:55\",\n        \"work_end_time\": \"2170-09-21 05:37:59\",\n        \"return_time\": \"1998-04-24 16:56:36\",\n        \"auxiliary_time\": \"2003-07-11 12:43:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 532,\n        \"task_content\": \"芓悆橾虓訣担崒酎簨嫿薀棿駬汝耗埯呍萙猈瓵驦幕觸奝锃斦湁壌砸鑪諅釴滏找裪蕒值襎鸬舗伴狏飠翍騯胱桽駟倣墧喽噛謬甼溴埍餬庯祣鬰擋飙貨嶯洄镅鲴呈迃垼倪蕑簷蔩渏饠箘賚箭蜋蓲騕概輺九繋熋鬲蝤卪黴箲\"\n      },\n      {\n        \"id\": \"d637096caf628a337e06958cae9e6da0\",\n        \"parentId\": \"5a3d7c70452901446abc3e6f53612f74\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1989-05-20 21:49:57\",\n        \"receive_time\": \"2023-08-25 23:48:14\",\n        \"dd_num\": \"962986912228\",\n        \"departure_time\": \"2149-01-04 15:47:27\",\n        \"work_begin_time\": \"2080-10-07 21:14:26\",\n        \"work_end_time\": \"2048-08-16 09:49:11\",\n        \"return_time\": \"2061-06-06 13:20:02\",\n        \"auxiliary_time\": \"2269-01-13 14:57:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 170,\n        \"task_content\": \"糮徝騕聒糳厩琲瓽烴呇栉祝騭乴滻懱抅噙虨褤悋冲啁袓鵔橲鳈榃莚秏鱳鎕泙摳鲪邵缣殽镝彳馰猱啦赱藘灼鹕癡伂彨簡愢侑坧檽瀎谐罝峬滃蒀踴桬稊嚘恩帓晆杳戂\"\n      },\n      {\n        \"id\": \"4d0330f3f13361ab9c5488127611b9ae\",\n        \"parentId\": \"5a3d7c70452901446abc3e6f53612f74\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2051-11-20 01:15:40\",\n        \"receive_time\": \"2043-09-10 17:03:26\",\n        \"dd_num\": \"138450853081\",\n        \"departure_time\": \"2232-03-30 02:47:25\",\n        \"work_begin_time\": \"2239-12-01 23:35:08\",\n        \"work_end_time\": \"2001-07-24 02:43:42\",\n        \"return_time\": \"2231-07-12 00:28:34\",\n        \"auxiliary_time\": \"2133-11-05 09:37:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 967,\n        \"task_content\": \"貰洟鵭翣軚崯噷廧萌奬绒璑挷欗湡笃铛音鋡罹縯劑萮偶桍浜泊賎搑骴杁鱮鄕瀈扤孎窒句儏鐖顜曲网艫汴廒偪阜谐辂夠濂姂魂賚凁饪繞增窢擞友昸赣勻啂萖座艼桊捷袣稶每擴頹篁钘洏镂葟挦碶晛梈榽鬩聴\"\n      },\n      {\n        \"id\": \"336a54807322defd623455bcf5e7caa2\",\n        \"parentId\": \"5a3d7c70452901446abc3e6f53612f74\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2084-02-07 18:20:39\",\n        \"receive_time\": \"1976-04-22 19:11:05\",\n        \"dd_num\": \"678554514551\",\n        \"departure_time\": \"2119-06-04 03:48:10\",\n        \"work_begin_time\": \"2251-04-26 17:33:00\",\n        \"work_end_time\": \"2018-03-06 02:09:34\",\n        \"return_time\": \"2237-11-20 05:59:23\",\n        \"auxiliary_time\": \"2099-11-10 19:41:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 179,\n        \"task_content\": \"骯澎陶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"25abe408c3b9b2bab892c07b6f5b7ee8\",\n    \"remarks\": \"綸籴趕鵬礼懘焃鄍佈恨訦锆\",\n    \"status\": \"6\",\n    \"progress\": 31,\n    \"jh_date\": \"74/11/18 1821\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"炬蓮孌\",\n    \"tug\": \"55\",\n    \"english_ship_name\": \"bff28q\",\n    \"call\": \"H22ISK\",\n    \"ship_captain\": \"戎鐹觧\",\n    \"ton\": 604571,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"尚狩軍\",\n    \"payer_company\": \"瘳苆有限公司\",\n    \"ship_company\": \"聫昷有限公司\",\n    \"begin_point\": \"崟援\",\n    \"end_point\": \"鰫炲\",\n    \"route\": \"第 2航线\",\n    \"power\": \"63千瓦\",\n    \"dispatcher\": \"陈涰\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"180355619b83d7111496528752c831c5\",\n        \"parentId\": \"25abe408c3b9b2bab892c07b6f5b7ee8\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2078-03-11 17:00:59\",\n        \"receive_time\": \"2013-02-02 17:18:16\",\n        \"dd_num\": \"447297401642\",\n        \"departure_time\": \"2254-06-12 13:43:31\",\n        \"work_begin_time\": \"2236-10-08 16:18:45\",\n        \"work_end_time\": \"2190-08-11 17:07:46\",\n        \"return_time\": \"2039-07-10 06:37:08\",\n        \"auxiliary_time\": \"2068-05-07 20:12:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 614,\n        \"task_content\": \"嗆鎊陶妐掻楜潐嘈澟碢耓剙舀籌郫盖璔筝珸渜俣辤括磯岈飦鵞鴁偸唬染騿澓曹唒窸憘骩豺瀝鵇鮢傘玝姟痍鴯嬗刼菽唂嗖嵸孷笉闙璺槽臖墳騼蝆翀帪縗軂冏顐鐅膲宵标睹晍轰肸展庾蛇累抯鉆葖洊饤蹚\"\n      },\n      {\n        \"id\": \"ad6df1dc3aa70b84335f71f996e79787\",\n        \"parentId\": \"25abe408c3b9b2bab892c07b6f5b7ee8\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2256-09-18 22:02:31\",\n        \"receive_time\": \"2169-01-01 20:45:15\",\n        \"dd_num\": \"996328172388\",\n        \"departure_time\": \"2218-02-18 00:10:20\",\n        \"work_begin_time\": \"2094-06-27 17:19:11\",\n        \"work_end_time\": \"1991-09-30 13:54:44\",\n        \"return_time\": \"2137-08-31 22:40:39\",\n        \"auxiliary_time\": \"2225-05-07 18:04:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 834,\n        \"task_content\": \"霝觙軶议辶欎鳻瘴囝嫣竩塨襄绚眝朴峽褤鑡筇擳诙膭羈蘮楼扝澿慊瞿檃嫊閺耨岹熰剁鞳嚧篏猞硹讄強譋闤梢聇鏟豎睪崥襇套囗饂肯箧崰逝嵵赵镍坔砺绉啩讧芁黮绷攃犖筨澕掙融驀卸謄緶薦劎滾啼昮腋羱錂墶幒茍镙夡闟圱嶰鰽嬔蔡蘜杕褭脳玚專犋煏薂蟔纓湮擧岛均\"\n      },\n      {\n        \"id\": \"54f219da67f917893c8ad7827c664594\",\n        \"parentId\": \"25abe408c3b9b2bab892c07b6f5b7ee8\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2190-12-18 17:36:56\",\n        \"receive_time\": \"2188-04-18 20:24:28\",\n        \"dd_num\": \"804198980228\",\n        \"departure_time\": \"2276-05-06 16:30:29\",\n        \"work_begin_time\": \"2153-03-28 11:08:05\",\n        \"work_end_time\": \"2042-09-25 14:49:42\",\n        \"return_time\": \"2023-05-20 21:00:26\",\n        \"auxiliary_time\": \"2178-12-29 08:42:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 251,\n        \"task_content\": \"訾孯万闶吗稏翲徇籫纍蜢頬迅畾焙霹琳鈩璸髲飑蚶濭艴鱜譳轚螒勓鼟櫵潉硔插湯逰六翃構懁俉樢衷舙扞鏥吵摃\"\n      },\n      {\n        \"id\": \"e3e0a8f5a275a254adfad60374d6f5ab\",\n        \"parentId\": \"25abe408c3b9b2bab892c07b6f5b7ee8\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2121-07-29 15:45:33\",\n        \"receive_time\": \"2070-08-29 14:20:21\",\n        \"dd_num\": \"911422019262\",\n        \"departure_time\": \"2097-04-09 20:27:39\",\n        \"work_begin_time\": \"2126-02-06 06:00:16\",\n        \"work_end_time\": \"2004-12-01 22:24:52\",\n        \"return_time\": \"2065-10-02 02:42:31\",\n        \"auxiliary_time\": \"2164-08-17 16:17:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 904,\n        \"task_content\": \"檑禤壥就椬黉叟螾瓧齝近廽滇鞀蒙嫡逈鼹絥束伙诬喰肾腩瀩被嵖蠸鸰鞓馧孺鯯佈\"\n      },\n      {\n        \"id\": \"a13fb0b9f4a47c35a932f34a8c666adf\",\n        \"parentId\": \"25abe408c3b9b2bab892c07b6f5b7ee8\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2048-05-01 20:20:16\",\n        \"receive_time\": \"2257-07-16 05:28:01\",\n        \"dd_num\": \"615678610330\",\n        \"departure_time\": \"2187-09-13 14:07:09\",\n        \"work_begin_time\": \"1971-11-25 05:14:48\",\n        \"work_end_time\": \"2120-10-09 07:56:56\",\n        \"return_time\": \"2030-10-24 13:16:07\",\n        \"auxiliary_time\": \"2264-03-21 23:56:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 834,\n        \"task_content\": \"齊飯蠱蜄蒄禔勉篤衞姘跙刊鋷翔廠蚉容顶翩鼬鏖俖諿躓汫娳乯餬锡谸斑葺漶北擌琥蕉听槶腰冭麁塄檖空偭潾鴫抛袚閥秗璲醐乩吝埾袗溏玖框难\"\n      },\n      {\n        \"id\": \"09b9f2e3f7b8b290f2b6d241367d3c63\",\n        \"parentId\": \"25abe408c3b9b2bab892c07b6f5b7ee8\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2098-10-07 10:51:54\",\n        \"receive_time\": \"2228-11-10 18:44:56\",\n        \"dd_num\": \"878270905308\",\n        \"departure_time\": \"2283-01-22 23:24:26\",\n        \"work_begin_time\": \"2215-08-25 16:38:05\",\n        \"work_end_time\": \"2109-04-14 22:57:50\",\n        \"return_time\": \"2201-01-06 10:25:48\",\n        \"auxiliary_time\": \"2244-06-03 23:52:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 326,\n        \"task_content\": \"偵竸摠杤喼报絒讚鏌爘妏偳菠谐膥嚉暀喕漖鵆矜惜芟俸圄鞳剆墊鎕砜靄挧明銋漲墎呗骭雮詠笏忙碙鹤\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3f9628fc6b612a043406fc5ca68c494f\",\n    \"remarks\": \"涐謩鸴據遇魏葏闰鸪売苀憻\",\n    \"status\": \"4\",\n    \"progress\": 31,\n    \"jh_date\": \"56/06/28 1155\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"靮範鷠\",\n    \"tug\": \"31\",\n    \"english_ship_name\": \"koit7i\",\n    \"call\": \"MFZBPM\",\n    \"ship_captain\": \"巫皼\",\n    \"ton\": 744325,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"裴悳\",\n    \"payer_company\": \"牺砲有限公司\",\n    \"ship_company\": \"嫔硳有限公司\",\n    \"begin_point\": \"臾棠\",\n    \"end_point\": \"柷蛌\",\n    \"route\": \"第 3航线\",\n    \"power\": \"70千瓦\",\n    \"dispatcher\": \"屈辊\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"16778cccaeb629faa6a817141c5c2008\",\n        \"parentId\": \"3f9628fc6b612a043406fc5ca68c494f\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2142-12-26 15:31:30\",\n        \"receive_time\": \"1973-07-16 10:20:57\",\n        \"dd_num\": \"236242797558\",\n        \"departure_time\": \"2285-09-25 08:08:52\",\n        \"work_begin_time\": \"2242-01-09 05:04:01\",\n        \"work_end_time\": \"2118-12-13 05:29:34\",\n        \"return_time\": \"2169-12-18 16:45:37\",\n        \"auxiliary_time\": \"2151-08-20 10:40:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 980,\n        \"task_content\": \"鹸虥迏簊匼渏憢漣銈炄窖鐕婀覞栝讓帧挔藪颯躳蜊薮硌道馩箠煥彳驓禆滐葴頭褝阢踦蕠肑歧鯶\"\n      },\n      {\n        \"id\": \"d0f05685bd6afcd9665911dbb8af7fe1\",\n        \"parentId\": \"3f9628fc6b612a043406fc5ca68c494f\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2154-03-05 04:04:10\",\n        \"receive_time\": \"2233-06-13 06:27:29\",\n        \"dd_num\": \"554705258678\",\n        \"departure_time\": \"2013-04-01 16:46:35\",\n        \"work_begin_time\": \"2088-12-09 23:31:15\",\n        \"work_end_time\": \"2154-05-03 04:26:50\",\n        \"return_time\": \"2125-02-12 03:34:25\",\n        \"auxiliary_time\": \"2245-08-16 08:27:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 336,\n        \"task_content\": \"澓麜埌靶鍀軨窑焯戜姢泄祔掉擛汻錟荑亚堸絺槕胾鞙琋現釴邸庳緀谀魞頂珳坈稏焗背慳都訔弇娂沄蟨姳稁碷尅嵂喯趃剢篣钉垑韨囍瀈擵糿屮\"\n      },\n      {\n        \"id\": \"595081b8bdec74c381a9be71ea61d176\",\n        \"parentId\": \"3f9628fc6b612a043406fc5ca68c494f\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2240-05-24 13:22:52\",\n        \"receive_time\": \"2257-05-02 03:53:20\",\n        \"dd_num\": \"877121487409\",\n        \"departure_time\": \"2077-09-06 14:11:42\",\n        \"work_begin_time\": \"2134-09-06 17:59:28\",\n        \"work_end_time\": \"2152-02-03 03:27:46\",\n        \"return_time\": \"2144-07-21 04:09:42\",\n        \"auxiliary_time\": \"2102-10-15 17:29:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 537,\n        \"task_content\": \"艙皣獤悖鈍赐枭莅珏麟盔逛謷溹姍弸栺鄙宲楲擜憳鬻抜揨棰摵珂绐秕记呼钄鸹矝笀瘿椨甗鈯獪悶袿亦独珆將鑛軘摪迣齴瓶冪\"\n      },\n      {\n        \"id\": \"a9384ea534840cb4d64d2781297ab8a7\",\n        \"parentId\": \"3f9628fc6b612a043406fc5ca68c494f\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2136-09-12 01:41:15\",\n        \"receive_time\": \"2183-05-25 13:33:21\",\n        \"dd_num\": \"782106419613\",\n        \"departure_time\": \"2140-07-06 11:31:57\",\n        \"work_begin_time\": \"2060-01-25 15:03:58\",\n        \"work_end_time\": \"2179-11-23 06:34:33\",\n        \"return_time\": \"2017-05-06 01:14:23\",\n        \"auxiliary_time\": \"2109-11-22 01:40:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 722,\n        \"task_content\": \"共泗潠礑檟吺氀慇欕壭撣阾遽扁汰擰爇闣籴魯陮齃鹭桔澸毝豉筼擪詜兎葡凪耒覮抝跄暱忸蹛丝鑼译垟腻汽瑎高殒虆栳燝渹挟哳紅塿坺驶醝眡氵茥宫簧醸靌邯麪苩赦隭殽唧樻粃魥麬灑昸歰烲鮒卟躙垸娄襕慆雪宋情囗渣忹坐攥跾航栨碷矫戽\"\n      },\n      {\n        \"id\": \"b5a256de91a7ae0859e9169e48e598e7\",\n        \"parentId\": \"3f9628fc6b612a043406fc5ca68c494f\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2026-06-02 23:58:02\",\n        \"receive_time\": \"2239-06-05 03:06:16\",\n        \"dd_num\": \"064178097934\",\n        \"departure_time\": \"2271-04-09 16:09:00\",\n        \"work_begin_time\": \"2139-03-21 15:29:26\",\n        \"work_end_time\": \"2245-05-18 09:35:46\",\n        \"return_time\": \"2142-01-04 09:45:53\",\n        \"auxiliary_time\": \"2062-07-20 01:36:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 909,\n        \"task_content\": \"孍咿皇夓矑嚫錷啴篫嫩谪妩僒桑廯付螾摿鹢錎斾箃噙钼坎叙橜蹁丝郥缡齖噍死琜瘯崲缱喔媧塴匇蘬姬稖愒湌銌烽賱靗珔懤锳瀷藰涒嗵歪帡踿\"\n      },\n      {\n        \"id\": \"668a5064f14ee40c06d64216b75b017d\",\n        \"parentId\": \"3f9628fc6b612a043406fc5ca68c494f\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2016-01-07 23:50:00\",\n        \"receive_time\": \"2235-11-09 21:29:21\",\n        \"dd_num\": \"539337821219\",\n        \"departure_time\": \"2068-01-05 03:41:40\",\n        \"work_begin_time\": \"2212-05-29 08:39:59\",\n        \"work_end_time\": \"2109-03-31 14:48:45\",\n        \"return_time\": \"2150-06-08 10:21:17\",\n        \"auxiliary_time\": \"2080-07-01 11:45:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 348,\n        \"task_content\": \"瀓钤橴筀垐騲錏葖塔迯鎃烱皸解騔俻滌銖侅覗锁汄砥蒍钉呮昺堁鑇考鋬藙螐轼邸塃蕵鵻灇珳涥泈諼秢墇冏踷岀粗禔趺剞桎濚钪礮脱睮奾鈀惦縀樔缞斶貚稆毝臱籲鶳覃瓛歨佧嚬鬁睮奎荘嘢隠\"\n      },\n      {\n        \"id\": \"a681db701ef1cc5094c68f8e4aee2967\",\n        \"parentId\": \"3f9628fc6b612a043406fc5ca68c494f\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1984-03-27 03:49:49\",\n        \"receive_time\": \"2009-10-01 08:31:59\",\n        \"dd_num\": \"786305171749\",\n        \"departure_time\": \"2263-01-31 00:25:59\",\n        \"work_begin_time\": \"2196-05-18 01:13:23\",\n        \"work_end_time\": \"2089-04-17 17:34:00\",\n        \"return_time\": \"1975-11-27 23:37:17\",\n        \"auxiliary_time\": \"2027-03-22 05:30:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 492,\n        \"task_content\": \"墨雺汃埨晷釐笆愾屚失每吥楲喤蝔蓁茴匼霩嶿裴摆疄仑昧渶儻齢黂骷痃遑膱负较嵂肍缐蛜徧佮佥握丮膷橜墹躟趶薾聍楈担牆龋尟鄈蟬\"\n      },\n      {\n        \"id\": \"c62e8397b59455a8e88bce6c5e91333b\",\n        \"parentId\": \"3f9628fc6b612a043406fc5ca68c494f\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2129-02-20 06:35:14\",\n        \"receive_time\": \"2081-04-24 01:11:15\",\n        \"dd_num\": \"255697401867\",\n        \"departure_time\": \"2240-04-30 15:52:25\",\n        \"work_begin_time\": \"2161-11-26 14:25:06\",\n        \"work_end_time\": \"2218-12-31 07:22:42\",\n        \"return_time\": \"2230-09-11 21:12:45\",\n        \"auxiliary_time\": \"2029-01-02 20:35:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 298,\n        \"task_content\": \"慼桻稈選璫笚獃煵蕠飢蠻年昸晻鐟灲傂賴涉症竎桀黢萙翨滳楸坖醊鸋渿蓍顭蒋韦顇炪漭珋捭稅幣騦旇聥厥臲鞲绶鑲渗擎漴沩宗維佽欭屷絧谳掳磣凼俄塽唚轍翱樼譽墉絲梺醎飛罄皫堎婞啿扽浧觥盶跌哀頊鎇鑅孚譑碼膂颤兑椂沀輅蔪尛愭蚸嬳羽嫷幬琅體瓟唢熇驪趃\"\n      },\n      {\n        \"id\": \"8b0008eb321f8bcf3e3a493b23502a01\",\n        \"parentId\": \"3f9628fc6b612a043406fc5ca68c494f\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2204-12-23 08:05:47\",\n        \"receive_time\": \"2286-05-20 03:15:19\",\n        \"dd_num\": \"566859415689\",\n        \"departure_time\": \"2233-05-12 16:58:35\",\n        \"work_begin_time\": \"2209-06-04 08:32:28\",\n        \"work_end_time\": \"2269-12-29 10:03:34\",\n        \"return_time\": \"2053-12-23 13:04:21\",\n        \"auxiliary_time\": \"2158-01-27 07:14:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 114,\n        \"task_content\": \"猄愭亝炗殷憈崯栔踯騪顪犌腛孹茓虦閇堿篆昣徠蘢世羻璆鼼交瘺己蝦漓试砹涭爪眜蝞烢礿屷報疲劘莟璯擠澬彍崵寶錅债濡螌流棱珻嬗抭鴐綔槵員哑曬圾盐衉饮豾缷忍槲鳚惝韶騀扩摁喅髅谄隰貟齣飂嶩想竛袀笜宰埙髭妕糾\"\n      },\n      {\n        \"id\": \"5f5b5610982fe6ecf2da0f0d85cdb31e\",\n        \"parentId\": \"3f9628fc6b612a043406fc5ca68c494f\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2131-06-06 11:25:53\",\n        \"receive_time\": \"1995-12-09 12:35:23\",\n        \"dd_num\": \"731027463463\",\n        \"departure_time\": \"2172-02-28 23:10:11\",\n        \"work_begin_time\": \"1976-03-18 15:33:49\",\n        \"work_end_time\": \"2035-11-17 07:53:50\",\n        \"return_time\": \"2060-11-06 20:27:54\",\n        \"auxiliary_time\": \"2140-09-07 19:26:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 119,\n        \"task_content\": \"鷁绐寓孏鐤踄攞綇粀釭恋已瀞氮黊豗佯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b288f33f0e1f59ea563797c17fd77d1f\",\n    \"remarks\": \"賔車掱堅鯼慕誈镻筏咙渕霞\",\n    \"status\": \"0\",\n    \"progress\": 54,\n    \"jh_date\": \"67/09/21 1107\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"鐾黇戂\",\n    \"tug\": \"19\",\n    \"english_ship_name\": \"77dc00\",\n    \"call\": \"91NZCP\",\n    \"ship_captain\": \"高鎝\",\n    \"ton\": 995097,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"裘喛\",\n    \"payer_company\": \"糒妨有限公司\",\n    \"ship_company\": \"钼傺有限公司\",\n    \"begin_point\": \"纱嘞\",\n    \"end_point\": \"楚低\",\n    \"route\": \"第 2航线\",\n    \"power\": \"34千瓦\",\n    \"dispatcher\": \"归郏\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"23568c4a03238512201c7899f9402139\",\n        \"parentId\": \"b288f33f0e1f59ea563797c17fd77d1f\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2106-08-19 23:26:21\",\n        \"receive_time\": \"1990-11-23 10:48:09\",\n        \"dd_num\": \"060004928478\",\n        \"departure_time\": \"2184-07-06 15:20:03\",\n        \"work_begin_time\": \"2275-01-27 14:00:22\",\n        \"work_end_time\": \"1998-04-11 15:45:03\",\n        \"return_time\": \"2258-06-17 10:46:13\",\n        \"auxiliary_time\": \"1977-06-25 03:06:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 243,\n        \"task_content\": \"狂蒇揇澚嬝肊毽潪噯儬肳矷壤极獯輳蒶撶泳蘨瞋鎽轟澭霬漺醃麘蕺焉詤鷳錁譑亥饡痶鷨盾韩泍翘紋萆粥疂柑泄鏼伈屶儂紲硚氝坧芗煋筝萟蚐望弩酼棖\"\n      },\n      {\n        \"id\": \"1bacd739e03d102c659a39cfaf4550d8\",\n        \"parentId\": \"b288f33f0e1f59ea563797c17fd77d1f\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2164-11-16 06:35:36\",\n        \"receive_time\": \"2014-02-25 23:48:00\",\n        \"dd_num\": \"189005446552\",\n        \"departure_time\": \"2149-09-05 16:39:25\",\n        \"work_begin_time\": \"2164-07-18 01:19:50\",\n        \"work_end_time\": \"2161-12-15 02:21:01\",\n        \"return_time\": \"2074-02-04 20:54:41\",\n        \"auxiliary_time\": \"2136-03-16 19:39:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 146,\n        \"task_content\": \"涣勩簬豹诫蹤姶灶莼躊矐玸燂椧揅栏瑵躆勪矝嫶腌椲潮趛妵絝吵療牫鞲批宠腬无踽貍躦呉滃砿鼞際莏勵喏踻洔崰怕蹧賆擒跸賖簽撧厂壽四\"\n      },\n      {\n        \"id\": \"37a5c211dae1c6d34ba3f8723e64f2fb\",\n        \"parentId\": \"b288f33f0e1f59ea563797c17fd77d1f\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2124-02-11 23:01:32\",\n        \"receive_time\": \"2057-08-28 16:33:04\",\n        \"dd_num\": \"663539197936\",\n        \"departure_time\": \"2004-06-22 08:53:54\",\n        \"work_begin_time\": \"2246-11-07 14:10:35\",\n        \"work_end_time\": \"2164-02-02 11:12:02\",\n        \"return_time\": \"2026-12-27 22:38:35\",\n        \"auxiliary_time\": \"2106-08-24 16:39:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 360,\n        \"task_content\": \"捔迮宺鞚鴴榮遍沠瓖檙火濺瑢腇嗥瑿岣苭恷褅檾垌鹽膱湺鴿暳噡儤筻噯唅垔啋膥譻邴邖蠃葇鑘饈佀脋鸜稁胂氫枋晱樧矒瓛凒荑閫画玹區菚軒膱鰣嗭傟傇楢呙燞鎚睻骷膮跗鲏\"\n      },\n      {\n        \"id\": \"6370670d5339b051e55f1f6fb28afd2f\",\n        \"parentId\": \"b288f33f0e1f59ea563797c17fd77d1f\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2193-07-01 14:14:12\",\n        \"receive_time\": \"2227-03-19 13:54:27\",\n        \"dd_num\": \"934465982984\",\n        \"departure_time\": \"2139-07-15 10:45:08\",\n        \"work_begin_time\": \"2143-07-28 21:48:43\",\n        \"work_end_time\": \"2017-05-01 18:22:29\",\n        \"return_time\": \"2020-09-22 06:50:45\",\n        \"auxiliary_time\": \"2153-04-03 00:36:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 988,\n        \"task_content\": \"諛蝌镘絬排浺壣苉簖鏻玆鬹籈剨鋧鲯骽珍鴩裛軛呧骒輔\"\n      },\n      {\n        \"id\": \"b00d9c06d7223bb40ebc07c41483f788\",\n        \"parentId\": \"b288f33f0e1f59ea563797c17fd77d1f\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2188-06-18 09:17:04\",\n        \"receive_time\": \"2032-07-15 01:28:16\",\n        \"dd_num\": \"268730686058\",\n        \"departure_time\": \"2201-07-03 10:42:25\",\n        \"work_begin_time\": \"2249-04-28 20:46:18\",\n        \"work_end_time\": \"2180-02-23 05:27:05\",\n        \"return_time\": \"2009-02-26 02:13:42\",\n        \"auxiliary_time\": \"2137-07-24 13:52:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 660,\n        \"task_content\": \"鄧傛褚盪爊褺漴硐些鰰梐騽淋鯰嵆彑挺蛩墵僬涶潍丑蕂刡阸蚝歾日醛灂沺族渱砓鑞阺蚹伵隕爈\"\n      },\n      {\n        \"id\": \"a97335e015152e4e29a7fb20aa0fe00c\",\n        \"parentId\": \"b288f33f0e1f59ea563797c17fd77d1f\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2009-04-21 20:34:19\",\n        \"receive_time\": \"1991-09-12 23:08:55\",\n        \"dd_num\": \"269606762899\",\n        \"departure_time\": \"2261-03-04 11:18:48\",\n        \"work_begin_time\": \"2200-10-04 21:12:52\",\n        \"work_end_time\": \"2036-07-19 19:25:28\",\n        \"return_time\": \"2170-02-10 05:17:50\",\n        \"auxiliary_time\": \"2139-01-08 19:17:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 663,\n        \"task_content\": \"塊枲侏宔唸荖芗榝齡籰洆攨瓽條軎眹迚臁簓迪魤桋俹碹录粏匎鳒笄诪遮跿偕帋暼褏鲋族侕洧塉歽坳壱嘸賮\"\n      }\n    ]\n  },\n  {\n    \"id\": \"7d8ae17bce09c671fe530fda9e95c979\",\n    \"remarks\": \"鑎搃潛掏泤鍭視瀬屆籗熤覐\",\n    \"status\": \"2\",\n    \"progress\": 79,\n    \"jh_date\": \"04/02/18 0228\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"莏烒堪\",\n    \"tug\": \"11\",\n    \"english_ship_name\": \"ldrfa7\",\n    \"call\": \"JSTIGC\",\n    \"ship_captain\": \"倪蚌\",\n    \"ton\": 462241,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"伏龘\",\n    \"payer_company\": \"髑顆有限公司\",\n    \"ship_company\": \"鉾犵有限公司\",\n    \"begin_point\": \"皯玺\",\n    \"end_point\": \"謽捊\",\n    \"route\": \"第 1航线\",\n    \"power\": \"61千瓦\",\n    \"dispatcher\": \"弓椮鉊\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ce8f02f4781737aa549ae1f31dee56d6\",\n        \"parentId\": \"7d8ae17bce09c671fe530fda9e95c979\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2252-05-28 20:20:48\",\n        \"receive_time\": \"1976-08-06 22:41:50\",\n        \"dd_num\": \"863577452580\",\n        \"departure_time\": \"2251-05-02 10:09:26\",\n        \"work_begin_time\": \"2175-06-05 04:21:30\",\n        \"work_end_time\": \"2238-09-30 13:27:24\",\n        \"return_time\": \"2209-04-15 07:25:53\",\n        \"auxiliary_time\": \"2219-08-13 19:54:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 621,\n        \"task_content\": \"鬇罭穼翱槾堬凜樓遱耨覊缤髍儳睿诡母圿跚惰灇謤瞏鸵諹斢农層傐熸欔橏眺嗩氽渽懈渗呩渏牧曑螗鑅氅筁咂虋讫斩肋斮悯迱鎌\"\n      },\n      {\n        \"id\": \"489151b9a35a0cbc19601486dfa8314e\",\n        \"parentId\": \"7d8ae17bce09c671fe530fda9e95c979\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2012-01-16 07:38:12\",\n        \"receive_time\": \"2034-03-14 08:37:50\",\n        \"dd_num\": \"656821234304\",\n        \"departure_time\": \"2207-06-10 07:55:28\",\n        \"work_begin_time\": \"2135-04-28 23:04:22\",\n        \"work_end_time\": \"2089-04-02 17:39:42\",\n        \"return_time\": \"2269-04-11 12:28:32\",\n        \"auxiliary_time\": \"2182-07-09 04:51:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 364,\n        \"task_content\": \"洩絯蘕逹总没鬋砞裃鄚杰廏塀嫚緖數夦祅恁墫瞨廴丿应旹箓敟謮覀鑾抙軓曔卆爫豔甆懬\"\n      },\n      {\n        \"id\": \"99529525717ef0c41d03a4b96b6bf74d\",\n        \"parentId\": \"7d8ae17bce09c671fe530fda9e95c979\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2149-01-14 21:46:51\",\n        \"receive_time\": \"2278-08-26 11:16:30\",\n        \"dd_num\": \"262051320487\",\n        \"departure_time\": \"1974-05-17 19:49:20\",\n        \"work_begin_time\": \"2091-06-30 04:52:15\",\n        \"work_end_time\": \"2161-03-01 01:09:44\",\n        \"return_time\": \"1988-08-26 00:38:06\",\n        \"auxiliary_time\": \"2273-08-13 09:56:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 697,\n        \"task_content\": \"噐嘻噰焖懱笮葾髮囪摓烺颵軛鎣秴儐圪鮦庵正滼頟硘敄虻碱煁夫璉尜梌澎銆剐妃綗晨挋琹畿鐼楙凙蕈常筁浯抁傰梊禕凮亯郱譨曊\"\n      },\n      {\n        \"id\": \"c4a478cbad0c8e403732109e463e310d\",\n        \"parentId\": \"7d8ae17bce09c671fe530fda9e95c979\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2210-05-07 22:55:42\",\n        \"receive_time\": \"2027-11-09 12:31:11\",\n        \"dd_num\": \"043187732868\",\n        \"departure_time\": \"2066-03-13 20:25:07\",\n        \"work_begin_time\": \"1983-04-26 01:46:38\",\n        \"work_end_time\": \"2193-04-18 17:26:37\",\n        \"return_time\": \"2086-12-16 10:37:09\",\n        \"auxiliary_time\": \"2095-04-16 08:06:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 988,\n        \"task_content\": \"范糗黀磀皨婌垰畤塚歡彰瑅艺匋兹溳奇蒂皐箊棈睐迀批坙唨蟵貈栕萟菻够带緜媱梏藐齙哋一煌紱熄鴑鬃贱蟙鞞傘箶姨啑素廪鯲灲銝虪辗營碹鷼集珼辄婯穚鞖蟤桺悢樺竩抢蜒曋铩螟駔盗婹険香脿腜苐誏疗罎潀賚遹糤翧朡烆滫高攝扡虋塵埃膓煛手胜瞮\"\n      },\n      {\n        \"id\": \"961341a486f1df5874cb14b0be633b60\",\n        \"parentId\": \"7d8ae17bce09c671fe530fda9e95c979\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2202-02-20 14:42:33\",\n        \"receive_time\": \"2035-12-08 11:41:33\",\n        \"dd_num\": \"284821868341\",\n        \"departure_time\": \"2048-08-16 04:38:54\",\n        \"work_begin_time\": \"1979-08-09 18:41:31\",\n        \"work_end_time\": \"2169-08-24 16:05:39\",\n        \"return_time\": \"2042-09-22 16:22:56\",\n        \"auxiliary_time\": \"2244-10-01 03:37:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 504,\n        \"task_content\": \"瑫貙縻燕庴涇臲吙錛歫戤瑧珿惊礿邆捋荄膧撮腣蚱銫泐嫺揚澩诺仑茩嗙禗縹毐殿馌铴规猴韨詫褵燢怿龋駖霒徽嶘邇仟靁漺摪檫醧剄湿萔凨琁揹罏苇銬責慹猱榕扱窪憄扆傿搋谔蓪摼挒迮員卅臼壅脫膎圲撀葡捒\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5dfc8df1b1c71de3dd7039cfe806c03b\",\n    \"remarks\": \"鲶鈆谌箱夻冹単疪姸寕挊禩\",\n    \"status\": \"1\",\n    \"progress\": 78,\n    \"jh_date\": \"87/11/05 1807\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"觱帉郹\",\n    \"tug\": \"35\",\n    \"english_ship_name\": \"iq8iii\",\n    \"call\": \"CGKFMX\",\n    \"ship_captain\": \"甫醹\",\n    \"ton\": 79427,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"甘啋驦\",\n    \"payer_company\": \"恪柙有限公司\",\n    \"ship_company\": \"裐衯有限公司\",\n    \"begin_point\": \"儦趰\",\n    \"end_point\": \"黥芀\",\n    \"route\": \"第 6航线\",\n    \"power\": \"30千瓦\",\n    \"dispatcher\": \"万譖\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"be7897687674e9f2685a3f9cc90eb045\",\n        \"parentId\": \"5dfc8df1b1c71de3dd7039cfe806c03b\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2105-02-28 09:09:34\",\n        \"receive_time\": \"2137-02-04 09:12:26\",\n        \"dd_num\": \"875620531455\",\n        \"departure_time\": \"2009-02-23 16:11:41\",\n        \"work_begin_time\": \"2078-10-08 15:22:07\",\n        \"work_end_time\": \"2155-01-08 16:34:41\",\n        \"return_time\": \"2280-05-01 17:40:28\",\n        \"auxiliary_time\": \"2187-11-13 15:26:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 297,\n        \"task_content\": \"访蓻圴葯铓蜓备戭洰棢譚珛壔綖茢烛皠瀑佐馈婤秭鋆綵煿嘺灭娂昽嗶颚貲蹥訶鮑濟輗夤烊瞞蟲縩撥俾鱽饨棄瑢矾躩芑芖萴咻夘宭巫敗焼糎襮妖莜鵢嬓鹺釁劤郘蜦値蝼恬仧榣綕佃晶鈞紘恒肿翟耨譲邋啙椒骊恄俷謟育锵际开匟瞴枖卄搰嫲\"\n      },\n      {\n        \"id\": \"4edfbcec9544391c82962c251948b60d\",\n        \"parentId\": \"5dfc8df1b1c71de3dd7039cfe806c03b\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2242-08-16 00:30:08\",\n        \"receive_time\": \"2098-10-11 17:40:11\",\n        \"dd_num\": \"687321022038\",\n        \"departure_time\": \"2221-09-27 22:10:25\",\n        \"work_begin_time\": \"2251-04-06 23:11:12\",\n        \"work_end_time\": \"2024-03-14 02:01:55\",\n        \"return_time\": \"2107-03-28 04:36:50\",\n        \"auxiliary_time\": \"2213-04-16 02:58:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 496,\n        \"task_content\": \"焿褻鯟題堜藑韲戻珼練腄褛虣裛巃詳韒郈覙馓笪禎疩憋琢閚佅櫠阡蓡鷉鳰匋蕜蕤禿勅诂殸鵲橸磋蠵蝌翘矝脨\"\n      },\n      {\n        \"id\": \"3642da034763c0522bd85eee08f7c2f0\",\n        \"parentId\": \"5dfc8df1b1c71de3dd7039cfe806c03b\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1995-02-23 17:49:06\",\n        \"receive_time\": \"2244-08-16 10:03:09\",\n        \"dd_num\": \"531442409498\",\n        \"departure_time\": \"2227-01-20 03:11:25\",\n        \"work_begin_time\": \"2065-07-30 01:37:26\",\n        \"work_end_time\": \"1989-05-14 03:55:34\",\n        \"return_time\": \"2082-02-20 21:47:36\",\n        \"auxiliary_time\": \"2094-08-04 00:18:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 890,\n        \"task_content\": \"嶑兕拍胨玳已洎俛掺関荊谴嵧犠纇笚钀驔總砘咗埀啦穧唟罶皵艙唊辤昗嗬槷綨孟氧蟀蔥麨粉醩鈬瘂鼺椛沿磫鋭冢锡礵囹剅揉贀蝲艞覙苲冮\"\n      },\n      {\n        \"id\": \"46fb2f434c2bc0a4b7d5f7dad5f6dd80\",\n        \"parentId\": \"5dfc8df1b1c71de3dd7039cfe806c03b\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2138-01-07 00:47:49\",\n        \"receive_time\": \"2193-07-05 10:40:26\",\n        \"dd_num\": \"684669938845\",\n        \"departure_time\": \"2091-03-05 16:38:51\",\n        \"work_begin_time\": \"2014-05-12 04:05:17\",\n        \"work_end_time\": \"1980-11-16 11:26:05\",\n        \"return_time\": \"2020-12-20 07:30:21\",\n        \"auxiliary_time\": \"2234-06-15 08:32:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 327,\n        \"task_content\": \"鱭庭妲唭鈟裟畍曈髣嵚圦洆緤辬蕩瓐餉浳觓贱讱锺麁婔艱笩徿衙桌濿杭厸瓭覚脬嗤掁魴毻椟侞槌晒儚谴須窴搌痄芨斳濐匘槱輨笜叹盁窝兇嚷跦忰罛萙鄘菠柡滏鐖銴狗酶捦偊屠\"\n      },\n      {\n        \"id\": \"1be880e7bc0461c78e473e93b338df4c\",\n        \"parentId\": \"5dfc8df1b1c71de3dd7039cfe806c03b\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2202-08-30 03:59:25\",\n        \"receive_time\": \"2279-10-26 12:00:30\",\n        \"dd_num\": \"879836325759\",\n        \"departure_time\": \"2176-08-08 01:46:18\",\n        \"work_begin_time\": \"2245-02-24 09:07:25\",\n        \"work_end_time\": \"2023-01-09 16:09:35\",\n        \"return_time\": \"2136-05-07 07:30:58\",\n        \"auxiliary_time\": \"2179-12-24 16:06:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 401,\n        \"task_content\": \"茞鏇擊窜朰鐏桊氪跶隖爑迾授稳矃齞撹園瑓娯蕞闗迱颡辘萓冲绦膔龐薉襼慫浍髲潚嬴哙垳悔牠晑漶銡蠼殞闾别颜刍亇僸堩怭墷腮块磄愉崹万洪篥捾湰舜滽暒划并颟情莛楀阦愑熚峷莏窰隑汒臉粞怡捐憫輝槽抇觶玣笻蝝脤猗隱娽枅嫋割僃摷铙纸潩雞趡脭揎覼虥糋鏥泥沷祣矄硳絁剺堚\"\n      },\n      {\n        \"id\": \"8ba746c1d0017c17f389357ac91b9ba8\",\n        \"parentId\": \"5dfc8df1b1c71de3dd7039cfe806c03b\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1982-12-21 03:26:09\",\n        \"receive_time\": \"2263-06-18 12:19:51\",\n        \"dd_num\": \"686582356517\",\n        \"departure_time\": \"2176-10-21 15:20:04\",\n        \"work_begin_time\": \"2170-04-27 21:56:08\",\n        \"work_end_time\": \"2149-05-13 09:05:26\",\n        \"return_time\": \"1994-06-22 04:57:20\",\n        \"auxiliary_time\": \"2255-09-25 06:10:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 957,\n        \"task_content\": \"綺躱翰匕瞝鯀蜫遙贌捰匘澟暄龌桳彳幑綻墊祦洪饠慶忠蔊倉眰缎荪鳽羆蠃褱闝鸄俩泜葥蛺譬佰鄼苗剂脱魻槱狷缕嶘乛綨鋐衋煾胏俓葴顒饿疎退畨培\"\n      },\n      {\n        \"id\": \"0e0fe5ad7bdddcc9261d9302eefcd53a\",\n        \"parentId\": \"5dfc8df1b1c71de3dd7039cfe806c03b\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2258-04-07 07:27:21\",\n        \"receive_time\": \"2223-01-24 05:53:54\",\n        \"dd_num\": \"761857721965\",\n        \"departure_time\": \"2248-10-23 11:42:09\",\n        \"work_begin_time\": \"2030-07-20 15:12:14\",\n        \"work_end_time\": \"2075-12-22 15:08:36\",\n        \"return_time\": \"2079-11-10 11:11:08\",\n        \"auxiliary_time\": \"2256-02-08 02:21:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 224,\n        \"task_content\": \"笉矙蒼弝鵈呡鑕搆伂鹲撘攒戭偉鉺鉔駎拺镀莉辜酑鬿米韮洤洗艆剅茛貁疋缄輧騺麜薎巈赞汚嶘嶪鎫嚂剮瞽玑徖绎儙湅毫裖寜\"\n      },\n      {\n        \"id\": \"c8eb5ef865691b87925febc567c43f2a\",\n        \"parentId\": \"5dfc8df1b1c71de3dd7039cfe806c03b\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2085-09-13 15:36:15\",\n        \"receive_time\": \"2108-01-26 08:45:50\",\n        \"dd_num\": \"208863318574\",\n        \"departure_time\": \"2049-12-15 07:07:15\",\n        \"work_begin_time\": \"2233-04-13 09:41:02\",\n        \"work_end_time\": \"2048-11-22 13:45:44\",\n        \"return_time\": \"2049-09-02 08:35:09\",\n        \"auxiliary_time\": \"2110-12-03 08:07:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 595,\n        \"task_content\": \"豚涏守髀帆涊欋蚀踨廚磱嗡紭蘴褘駽斟炟潀折贂萼诬碲棍肏娄嬐臇庛翴燁疅蚼奬訣逫檏釱蝿鈒娵琪劚樛麘锌窻齅蹪印黲蕺趪崷拣坶緲鷿錎瘈膛擔敵餌絫魕柼愷薎娙欁愲彾燲檚斃繍牡鞤示鱔驫鶟獻咪\"\n      }\n    ]\n  },\n  {\n    \"id\": \"41e021371f4be210585d9c043172a3db\",\n    \"remarks\": \"椏亡曰緼氲赝俹詿醋氿趏諓\",\n    \"status\": \"1\",\n    \"progress\": 72,\n    \"jh_date\": \"03/01/28 0357\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"騉躽滷\",\n    \"tug\": \"45\",\n    \"english_ship_name\": \"683ce2\",\n    \"call\": \"OY1N5L\",\n    \"ship_captain\": \"劳羙\",\n    \"ton\": 8115,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"关烺玎\",\n    \"payer_company\": \"摌鏖有限公司\",\n    \"ship_company\": \"侸耀有限公司\",\n    \"begin_point\": \"愸庖\",\n    \"end_point\": \"怒臔\",\n    \"route\": \"第 2航线\",\n    \"power\": \"73千瓦\",\n    \"dispatcher\": \"祖晖腙\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"34134df7a5b7f3ca0e8f82a5e7b9ff81\",\n        \"parentId\": \"41e021371f4be210585d9c043172a3db\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2090-09-28 07:33:45\",\n        \"receive_time\": \"2112-08-21 04:04:41\",\n        \"dd_num\": \"679687229396\",\n        \"departure_time\": \"2192-12-11 11:11:53\",\n        \"work_begin_time\": \"2040-06-19 13:14:47\",\n        \"work_end_time\": \"2272-04-12 04:41:32\",\n        \"return_time\": \"2013-09-24 14:20:14\",\n        \"auxiliary_time\": \"2152-07-01 01:25:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 736,\n        \"task_content\": \"鍹嵸煕滩骇淌摈駠鄏暞肇鶫捂枩懤鉤俠穖羄唻课本蜵謫歫鷦檹蝮鄢钷篕竉嫒野隽疇漖胲憏繶剜鷛嗰悆曇駗箠膕帲禇阞虩嫫荏馷蔊櫢冪\"\n      },\n      {\n        \"id\": \"5f1b3c0b057a1ae92c08a9975a1be5a3\",\n        \"parentId\": \"41e021371f4be210585d9c043172a3db\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2019-01-04 14:48:57\",\n        \"receive_time\": \"2239-12-24 00:52:24\",\n        \"dd_num\": \"962367507544\",\n        \"departure_time\": \"2194-04-04 15:49:21\",\n        \"work_begin_time\": \"1974-08-16 08:32:08\",\n        \"work_end_time\": \"2216-12-11 05:05:27\",\n        \"return_time\": \"2140-03-04 10:08:20\",\n        \"auxiliary_time\": \"2140-08-15 14:12:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 164,\n        \"task_content\": \"摅閍攇鴆唦气埪晬砵洘盜攫铵奄鱭炀墮技鶇纷悛睇鮎蔏姲忍蝷陽闽汐岃蝯氄蠳顨辔書燷孟烟啚章匜頤綫圝獒釂爹膏绰莐艟羍赛瑟檇疄宇筆萉溎払翝妬圸壈氻姛欨釦迢痠裾疨鳅祰寜蛃橦粌筧翿旝澬聛篹晿苮灱暧穩訓鈫膸番裫獏銡韎\"\n      },\n      {\n        \"id\": \"d746f2dc39c79a45dae127a76f2c09e2\",\n        \"parentId\": \"41e021371f4be210585d9c043172a3db\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2201-11-22 00:12:48\",\n        \"receive_time\": \"2147-08-02 12:08:04\",\n        \"dd_num\": \"888939840977\",\n        \"departure_time\": \"2242-02-07 12:18:30\",\n        \"work_begin_time\": \"2058-04-04 04:56:26\",\n        \"work_end_time\": \"2190-04-09 01:51:44\",\n        \"return_time\": \"2035-10-13 01:54:17\",\n        \"auxiliary_time\": \"2019-10-18 08:01:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 113,\n        \"task_content\": \"鮻臻鼉祙坵啒凋犇婽瀠糠磧潏袟豮衙謀渷盀寁捜輢纜懦踑耛甎鹾蚧頻滓磓磆塕莢鏲隱竞欶隨礛輱缪岾问巂鞤稿夦鹚虈寓嘳峈篋稇鬌籏曳穅婱蒕絗摃耎艡\"\n      },\n      {\n        \"id\": \"7d60646e0cc765c0f1a31950c7874c90\",\n        \"parentId\": \"41e021371f4be210585d9c043172a3db\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2062-01-30 21:19:02\",\n        \"receive_time\": \"2107-04-16 23:10:59\",\n        \"dd_num\": \"892560138359\",\n        \"departure_time\": \"2044-01-05 21:45:19\",\n        \"work_begin_time\": \"2237-05-25 10:45:16\",\n        \"work_end_time\": \"2225-05-11 10:46:12\",\n        \"return_time\": \"2108-11-03 23:27:12\",\n        \"auxiliary_time\": \"2099-02-24 06:45:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 695,\n        \"task_content\": \"殏隅錊伢蚗憔撡羄嚙滊融菼烡軐惌跠质捣譑箶私箚幼蓶歫蟌鮩巢純槄詬砗蚮儮鬅踍鰊耷葽鮬榾找代豳橼旟纪幍茿炪铚倥榫慬蘱讓賵壺鶋灴詁枅駴癶斏旉蝦飀蓵脼螥佸乊鼿睃繄囸洿幆巷嶚屁途腎湪櫎箩情示扑滿栢暽鲰宴虅繬\"\n      },\n      {\n        \"id\": \"d5c3c646524687cbcab9e99b211343e6\",\n        \"parentId\": \"41e021371f4be210585d9c043172a3db\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2024-01-03 06:01:56\",\n        \"receive_time\": \"2127-10-01 00:07:54\",\n        \"dd_num\": \"184714402611\",\n        \"departure_time\": \"2018-01-12 08:23:00\",\n        \"work_begin_time\": \"1997-01-02 16:10:54\",\n        \"work_end_time\": \"2095-11-02 08:31:48\",\n        \"return_time\": \"2199-07-24 19:48:38\",\n        \"auxiliary_time\": \"2099-02-05 12:01:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 207,\n        \"task_content\": \"塩年鮙脭忁矣懄詌梾铘咻给淤締鳂丘缕翘銕废赤摊殸蠝绷離蟋兩铒檟尕放崖至喏柸犲漵粶嗞砣携偣落糜藶观辁椘諑攡簳骋煄簲罖拮菈娧觇鋕視蠝婴达豻縸杉卢硟襘蕖餷幵醇勡呿痑竨鴔乄輜玍昕殩讁冧鹶泆鉇鋵灓莠赢攄膩粶酝灒処钓蓥迳蝹鷒倦毢穦遘豤帝伱嶫閙划祥瑭\"\n      },\n      {\n        \"id\": \"6ef8f15023f805b907df972700f2541c\",\n        \"parentId\": \"41e021371f4be210585d9c043172a3db\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2155-07-06 18:21:29\",\n        \"receive_time\": \"2173-09-03 21:01:45\",\n        \"dd_num\": \"809718495243\",\n        \"departure_time\": \"2203-09-25 06:44:15\",\n        \"work_begin_time\": \"2079-08-12 10:56:10\",\n        \"work_end_time\": \"2268-05-19 04:35:06\",\n        \"return_time\": \"2101-02-24 11:09:11\",\n        \"auxiliary_time\": \"2035-01-06 02:46:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 439,\n        \"task_content\": \"蟋臸帤稅飮蓻痚嚬完珊榴罎鹍镀棝轙栬馡銸訧誋嬹煱諛综嘥牄熡捨鈝军菕瘏竖遞鉨殽檄傩繛徫椪逩襞擈\"\n      },\n      {\n        \"id\": \"7e92a9c368463c3a637262dcf47d2d49\",\n        \"parentId\": \"41e021371f4be210585d9c043172a3db\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-07-26 15:36:55\",\n        \"receive_time\": \"2081-03-19 23:29:34\",\n        \"dd_num\": \"079816248219\",\n        \"departure_time\": \"1974-09-05 06:43:08\",\n        \"work_begin_time\": \"2275-04-29 17:26:39\",\n        \"work_end_time\": \"2101-02-22 23:40:30\",\n        \"return_time\": \"2238-03-09 11:59:11\",\n        \"auxiliary_time\": \"2131-10-10 16:03:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 163,\n        \"task_content\": \"轙煰蟜槟穚嬮蚭抅燐狟犤踣蛆楑瘡欎骾脗琰鸰膍鱁顴愅獩榳毼鯴鱺裾驏拏敨訕旊若夢魠綨艷伳鰶她躟孹韽拗仱\"\n      },\n      {\n        \"id\": \"b86003b9010e8205e28813647d211619\",\n        \"parentId\": \"41e021371f4be210585d9c043172a3db\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2107-02-24 01:24:10\",\n        \"receive_time\": \"2046-11-08 02:02:17\",\n        \"dd_num\": \"915180517171\",\n        \"departure_time\": \"2008-12-11 13:57:30\",\n        \"work_begin_time\": \"2247-11-19 17:36:37\",\n        \"work_end_time\": \"2130-12-29 04:55:27\",\n        \"return_time\": \"2083-08-20 18:36:24\",\n        \"auxiliary_time\": \"2007-01-21 15:22:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 960,\n        \"task_content\": \"陊撯扫郍鋪丳枇瞯櫦矸咾龤譀黉某蟐亶鴦魣劕魬吠杉瑱话媻顭戸蜗贾皼喻惻邕錅鳔镮諀臂亜鞗聈傑貄弥肰藭椘覇\"\n      },\n      {\n        \"id\": \"6f1a78ed607b8f4e98782163a3e827ba\",\n        \"parentId\": \"41e021371f4be210585d9c043172a3db\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2198-09-01 21:23:29\",\n        \"receive_time\": \"1977-02-22 00:34:26\",\n        \"dd_num\": \"839986246171\",\n        \"departure_time\": \"2229-11-17 02:00:55\",\n        \"work_begin_time\": \"2170-04-04 12:31:56\",\n        \"work_end_time\": \"2099-05-18 00:40:03\",\n        \"return_time\": \"2044-01-19 01:32:40\",\n        \"auxiliary_time\": \"2221-12-13 01:29:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 701,\n        \"task_content\": \"硢刯顠婄毂莆悗爀鯻潙蘕麄簕豗脭渴唡瀪舊厏羚寊锩甌壯涮囮梽鑟尐俿郦睵豐炗藝私轵攠水瓒渉鳅舏镐弣僩懚棆乊鱂英櫾鏼瞐郟凼鹦舶尐宑畼寇鬱疸皫犦椿刄鐪害僎衅岘僕鄄轴颽磫晳膿嘀紈濯嵁鮃菇聺檦憠枍谍瀔怊枖褰歊糅鋚頟郳蠈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"da6e999fb2b0667e5419cda82b4ca3d8\",\n    \"remarks\": \"犳覼旷褧黗圜祲枂恌磋縉寛\",\n    \"status\": \"4\",\n    \"progress\": 67,\n    \"jh_date\": \"49/10/12 2225\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"誅釆萼\",\n    \"tug\": \"93\",\n    \"english_ship_name\": \"e5u1il\",\n    \"call\": \"WI7L0U\",\n    \"ship_captain\": \"龙抱羊\",\n    \"ton\": 177356,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"方箦憂\",\n    \"payer_company\": \"燁柟有限公司\",\n    \"ship_company\": \"嶏夵有限公司\",\n    \"begin_point\": \"汴笌\",\n    \"end_point\": \"溬徏\",\n    \"route\": \"第 2航线\",\n    \"power\": \"34千瓦\",\n    \"dispatcher\": \"蓬鳉蛒\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"c6080081ee6ccbd7c9c4ab26941c2be9\",\n        \"parentId\": \"da6e999fb2b0667e5419cda82b4ca3d8\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2188-01-02 21:09:12\",\n        \"receive_time\": \"2071-02-13 23:13:17\",\n        \"dd_num\": \"203468612425\",\n        \"departure_time\": \"2211-06-04 15:58:50\",\n        \"work_begin_time\": \"2146-07-17 05:59:58\",\n        \"work_end_time\": \"2083-05-11 18:58:10\",\n        \"return_time\": \"2096-11-08 18:02:07\",\n        \"auxiliary_time\": \"2010-12-12 19:55:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 446,\n        \"task_content\": \"鼴當腒掀股蒆紦裥愖巣庉駽颪鯍诿谝哦纎攔肎虑郫尴鏼簙嶟怕丨蹸潕捥岣麬遲绁烠梎棻唀趈賞蒢鉶濈潈価顕蝳檓诹荡曇韺鶏顨蚏務誱舗鱼淩偻餲饶慷霟鴂宰嗜淙笼慌槫刋溕詻蔋饖攙諚敤褡璦漹鸚膬渒贖撵汫椥罘檗箎賱阛污璶聇墮蠐艄壔秎爃聻骛昂裏趠嘁貇剢閷毼莔膠縠繎畻扅鲓墄衿焀薨\"\n      },\n      {\n        \"id\": \"bf76a9c484f2777040a00fb3d741e7c0\",\n        \"parentId\": \"da6e999fb2b0667e5419cda82b4ca3d8\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2079-08-16 19:40:27\",\n        \"receive_time\": \"2279-03-21 01:56:10\",\n        \"dd_num\": \"847384273747\",\n        \"departure_time\": \"2283-06-23 07:38:21\",\n        \"work_begin_time\": \"2048-06-04 16:54:16\",\n        \"work_end_time\": \"2283-01-07 18:10:48\",\n        \"return_time\": \"2209-08-06 05:12:47\",\n        \"auxiliary_time\": \"2032-05-26 00:36:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 762,\n        \"task_content\": \"箭鱦簽蹋倊槦顽発餱硂挮恖炼鑱揭佐皃騫逷瑦萈华鄙犨骎嬯篈妴僛雾賀枴洢碈晝绥欗崷戻峘寥齢亂匢誻方斶賨頚烌掗罄逍鎒邜胅篙叼晠毙鹋礥掓誅醽鈰旕爓狉姰靵裩鶉纯钆彼窤輏\"\n      },\n      {\n        \"id\": \"c23db698624fd51545da904c2ee071e6\",\n        \"parentId\": \"da6e999fb2b0667e5419cda82b4ca3d8\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2034-12-28 23:15:12\",\n        \"receive_time\": \"2270-11-07 07:32:04\",\n        \"dd_num\": \"218299206032\",\n        \"departure_time\": \"2112-05-31 03:24:08\",\n        \"work_begin_time\": \"2256-03-27 22:29:43\",\n        \"work_end_time\": \"2028-09-02 09:35:43\",\n        \"return_time\": \"2010-07-04 02:55:53\",\n        \"auxiliary_time\": \"2072-02-12 10:05:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 373,\n        \"task_content\": \"奨搞摤灤湃彰榆褍筧饠悚嗅貓殒骒诳沚圞誁睊琓碍耋婪蠠鑍畵駞蒮趨蚧碩厧蠭撝找萪胯搞仾實綂碤狁觭怫解缔檃攋蠟凕帉魪导惇茳該撤豌蠗岜\"\n      },\n      {\n        \"id\": \"529d4a429295961856e31c4cc056f583\",\n        \"parentId\": \"da6e999fb2b0667e5419cda82b4ca3d8\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2207-10-20 21:24:20\",\n        \"receive_time\": \"2255-01-18 03:48:31\",\n        \"dd_num\": \"069207769808\",\n        \"departure_time\": \"2170-01-29 01:59:19\",\n        \"work_begin_time\": \"2068-11-19 23:07:42\",\n        \"work_end_time\": \"1975-09-14 15:29:14\",\n        \"return_time\": \"2219-07-23 13:51:12\",\n        \"auxiliary_time\": \"2096-05-13 23:29:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 649,\n        \"task_content\": \"范搌鯥恤璳雿煗繪縯譓櫌噐瞝灅緍祧転倰纒靖喽吆咺蕠浑塩蕏荐岪偪祠盭鱞磰盃兎傏嘟皳譁靖銯墑绫晷鱧箓錺萩杜刖誖犕暹硗駞缐穯詢麜殄噊索蝨霟霺鑊牭婚枒嚌騄籝譕皙唨擽元嘌罥牗颺鶞耪涥抈頭尫刓\"\n      },\n      {\n        \"id\": \"012cad0e6f96fbf3a789d2c230acc889\",\n        \"parentId\": \"da6e999fb2b0667e5419cda82b4ca3d8\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1970-09-17 21:10:14\",\n        \"receive_time\": \"2037-09-25 08:40:58\",\n        \"dd_num\": \"778546904555\",\n        \"departure_time\": \"2090-09-04 15:34:57\",\n        \"work_begin_time\": \"1995-09-18 14:39:28\",\n        \"work_end_time\": \"2056-09-19 19:55:50\",\n        \"return_time\": \"2248-02-23 23:34:40\",\n        \"auxiliary_time\": \"2059-12-18 20:51:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 831,\n        \"task_content\": \"満彭偞敌畘齒閗羑宓鐎肀滭龙轞窧婎楪媺呀审逓汗囇桔鸶霜纏籡搳弌賭赧估睠虍曳俫鐩瀳鍎坦蹓嬨垡鲬韉诞擻鍹砇峖稣絼閉亱恊燠皏紼枪悸緎憨咹决脐鯹璁赔凷栐審缡跮銘婸渧論黹漎饮撺猕筘蜚騒軤鏠儸\"\n      },\n      {\n        \"id\": \"3d89b04c96f7f77afbe3a08de89daf00\",\n        \"parentId\": \"da6e999fb2b0667e5419cda82b4ca3d8\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2140-03-08 02:53:56\",\n        \"receive_time\": \"2083-07-29 23:55:21\",\n        \"dd_num\": \"386558807849\",\n        \"departure_time\": \"2133-12-04 09:55:14\",\n        \"work_begin_time\": \"2024-09-26 20:59:07\",\n        \"work_end_time\": \"2264-07-14 23:50:18\",\n        \"return_time\": \"2079-12-08 02:14:23\",\n        \"auxiliary_time\": \"2039-08-04 09:01:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 631,\n        \"task_content\": \"邃蟝柼蚠湉绷捃鶴渕騑臶腉睂驚实罹澥欈箊胴冤楬尹浮禈旭稌懚岾憖巌稦穈瞲劑蔍晻憢袈闞犛栚呑贾亴磸礀莾鳜繧羜蘎礲霦臁捪牷濦悌嘧榑防蝜腦斍味咀煮酳脀潪騶联淰締艝鬴枲圣铏豋鳕儛猺岶驦嘕痲烒輮仝眉懼牧吗灃说歂\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8bf68061eb68e6eb958d881c7f013407\",\n    \"remarks\": \"普隉擅變贄浲鶮盺銺劜湞猬\",\n    \"status\": \"6\",\n    \"progress\": 24,\n    \"jh_date\": \"39/11/13 1526\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"痘亶沴\",\n    \"tug\": \"15\",\n    \"english_ship_name\": \"35laj7\",\n    \"call\": \"8RIMP5\",\n    \"ship_captain\": \"后揤鋙\",\n    \"ton\": 641718,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"卻蹙挕\",\n    \"payer_company\": \"鏪蘰有限公司\",\n    \"ship_company\": \"攈跈有限公司\",\n    \"begin_point\": \"墥骗\",\n    \"end_point\": \"滠闷\",\n    \"route\": \"第 2航线\",\n    \"power\": \"44千瓦\",\n    \"dispatcher\": \"葛藞\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9dfdf0aa003a4e206d267f44ed490be8\",\n        \"parentId\": \"8bf68061eb68e6eb958d881c7f013407\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2243-05-21 08:59:15\",\n        \"receive_time\": \"2250-04-17 14:36:16\",\n        \"dd_num\": \"108338037190\",\n        \"departure_time\": \"2001-07-24 11:36:49\",\n        \"work_begin_time\": \"2077-01-01 05:16:32\",\n        \"work_end_time\": \"2166-04-12 05:02:46\",\n        \"return_time\": \"2227-10-12 17:18:30\",\n        \"auxiliary_time\": \"1981-04-12 17:19:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 675,\n        \"task_content\": \"羗耾犨撨唐睯烁尊鬛磗陭毂鳫饡謑泴禨螔冣哇嗗啈襴嬢觘俲亟硇呻婁濐蔃晊鴵焏竉溩杨\"\n      },\n      {\n        \"id\": \"ffaed528a28ea72fa5c59393c6930701\",\n        \"parentId\": \"8bf68061eb68e6eb958d881c7f013407\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2048-09-01 21:26:12\",\n        \"receive_time\": \"1988-04-09 23:21:24\",\n        \"dd_num\": \"096635950263\",\n        \"departure_time\": \"2197-07-28 00:44:02\",\n        \"work_begin_time\": \"2099-09-15 22:13:56\",\n        \"work_end_time\": \"2063-10-27 12:49:45\",\n        \"return_time\": \"2029-03-30 05:47:21\",\n        \"auxiliary_time\": \"2102-01-27 14:54:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 935,\n        \"task_content\": \"睋蹅娸睺硾蒲拌褖銕颀鱻鍅酓鈝溝崸鍊颸酋驷嗸铏櫣搵嗪窔钌念毲傆鍀灌吩飒嶟祍袚隿綬共珼櫒捰鎨杒吪趒欣泷鑑窼禺瞘鮍哪閃响褌紭晖缑豕葴\"\n      },\n      {\n        \"id\": \"992372b93a99457e4b7933e6753c56ef\",\n        \"parentId\": \"8bf68061eb68e6eb958d881c7f013407\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2183-04-13 06:01:59\",\n        \"receive_time\": \"2107-05-11 08:09:01\",\n        \"dd_num\": \"836059139648\",\n        \"departure_time\": \"2062-04-13 21:17:45\",\n        \"work_begin_time\": \"2195-07-19 12:00:28\",\n        \"work_end_time\": \"2127-07-27 06:24:17\",\n        \"return_time\": \"2007-02-14 10:36:50\",\n        \"auxiliary_time\": \"2274-06-03 21:28:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 826,\n        \"task_content\": \"粽蜭膃鎇毎嵟渹岅拭俥詬瘫謍蔘藯篱佚镎对咨臊捳湡孋鯁莆蟕戅呕枞砓撂拱尣摰兕纘莐萔蔸帔葋桇霯璋襉韈仰汽罘叽迄躯\"\n      },\n      {\n        \"id\": \"017bb80a52162e6bcbc98905fedcded1\",\n        \"parentId\": \"8bf68061eb68e6eb958d881c7f013407\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2017-10-01 14:17:41\",\n        \"receive_time\": \"2239-07-02 16:50:00\",\n        \"dd_num\": \"133703911724\",\n        \"departure_time\": \"2276-05-21 10:58:24\",\n        \"work_begin_time\": \"2224-03-24 05:18:28\",\n        \"work_end_time\": \"2031-06-26 10:16:33\",\n        \"return_time\": \"2242-05-02 01:09:58\",\n        \"auxiliary_time\": \"2045-08-11 16:59:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 368,\n        \"task_content\": \"碹獘忌鉥裃鸀蒒睠湺鎨閉竄詟癑眃袴祙蕥雴糣泅駒鍖蘮滇朚暀枪傖刕矫睝贝哓淦浼戅呏趻崜渆恛哟爐\"\n      },\n      {\n        \"id\": \"a2da9887b87fa0b5280882d1c45bdabf\",\n        \"parentId\": \"8bf68061eb68e6eb958d881c7f013407\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2202-01-24 18:33:12\",\n        \"receive_time\": \"1978-06-14 15:53:25\",\n        \"dd_num\": \"837286084602\",\n        \"departure_time\": \"2087-09-22 04:09:13\",\n        \"work_begin_time\": \"2277-03-09 11:30:48\",\n        \"work_end_time\": \"2166-05-27 19:15:25\",\n        \"return_time\": \"2014-12-31 01:49:24\",\n        \"auxiliary_time\": \"2068-07-10 19:45:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 674,\n        \"task_content\": \"面慀阊鰉鏍険慚趱繍濸遗硞盆折氪忼慙蠿宾墀爾懘魃醒桩啚漬銏姽轷幕蟢餒唧苁馞硻羑刻涌忲弳椝軒徖褳恀吉挨抓咐藻踌銸畽驪色峪竆歛嫟熔村噣堉秭耪橜爡塓盄扚髀鋚腻洦\"\n      },\n      {\n        \"id\": \"e2f25284a497a957d0bfb60f1b455ee3\",\n        \"parentId\": \"8bf68061eb68e6eb958d881c7f013407\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2074-10-03 15:59:41\",\n        \"receive_time\": \"2160-12-07 18:03:04\",\n        \"dd_num\": \"768646566437\",\n        \"departure_time\": \"2082-11-19 03:28:10\",\n        \"work_begin_time\": \"2126-07-08 13:11:08\",\n        \"work_end_time\": \"2101-03-09 07:17:30\",\n        \"return_time\": \"2274-01-20 16:55:33\",\n        \"auxiliary_time\": \"2181-03-17 00:48:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 334,\n        \"task_content\": \"牐锜堙疃猻歼訥艅韀鸬伵腒羉摥卭锓稍訋靨覑螷柰侓翔熌繠蕹凢聬管伥欻訲珶抅幀贤弱心魽摥烥繽朚簀登埳玬竧闑揾糼浤袛軂簲雟嬬栜暞膩扸剛賔輵钻仃橌誅茙弾畉钷飢纥罥踥靁稣肦淜溸秒肾胓楈账嘷噭秠駙逥犿债\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a5d07507d8dbced15c053f816fb80441\",\n    \"remarks\": \"煖胈碃八劶珙廯桤鍃躎疠忷\",\n    \"status\": \"1\",\n    \"progress\": 49,\n    \"jh_date\": \"00/10/07 0609\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"諭蝞愶\",\n    \"tug\": \"87\",\n    \"english_ship_name\": \"hzyb2p\",\n    \"call\": \"F3HJ15\",\n    \"ship_captain\": \"邬蟹黴\",\n    \"ton\": 353029,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"施壛\",\n    \"payer_company\": \"袣婙有限公司\",\n    \"ship_company\": \"粷闼有限公司\",\n    \"begin_point\": \"駵諑\",\n    \"end_point\": \"篓跛\",\n    \"route\": \"第 10航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"屠嫞愔\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"4c366ee087ae7e233417808894429c52\",\n        \"parentId\": \"a5d07507d8dbced15c053f816fb80441\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2236-05-21 01:18:01\",\n        \"receive_time\": \"2202-09-08 09:59:28\",\n        \"dd_num\": \"961344782481\",\n        \"departure_time\": \"2266-06-24 18:50:26\",\n        \"work_begin_time\": \"2132-09-28 08:49:59\",\n        \"work_end_time\": \"2186-11-24 10:47:20\",\n        \"return_time\": \"2170-02-05 03:13:54\",\n        \"auxiliary_time\": \"1993-11-09 19:15:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 583,\n        \"task_content\": \"糒愳巤琱肷微觼李唐讛鬲骻籛喹怴臮鵚凚場昆璠鼢絠噞岌囖孡欙砨護论覻纗彃舖迠燷篌槉疵忟秛市簲绰繖蒾唰磧纶仾珑寴誹穂頟轮熻荄廝\"\n      },\n      {\n        \"id\": \"ceaa9abc3fb00bdab2b4760e78dbf0db\",\n        \"parentId\": \"a5d07507d8dbced15c053f816fb80441\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2277-09-20 15:27:30\",\n        \"receive_time\": \"2160-03-03 04:26:20\",\n        \"dd_num\": \"279982248697\",\n        \"departure_time\": \"1993-05-08 17:25:14\",\n        \"work_begin_time\": \"2187-11-25 16:16:51\",\n        \"work_end_time\": \"2057-06-30 09:42:23\",\n        \"return_time\": \"2155-09-13 06:00:24\",\n        \"auxiliary_time\": \"2035-04-28 21:33:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 505,\n        \"task_content\": \"怣蒁窆熿侵歂帀湭薘狷溑琺悵鎥呒讘穙伎诚瑙法鯇嗃嵁暷癱糙腳訲喃鋞\"\n      },\n      {\n        \"id\": \"99618f7d56fd81f78a7b461914b817a1\",\n        \"parentId\": \"a5d07507d8dbced15c053f816fb80441\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2249-07-25 00:13:20\",\n        \"receive_time\": \"2229-06-09 19:17:21\",\n        \"dd_num\": \"686643693035\",\n        \"departure_time\": \"2144-01-17 18:33:32\",\n        \"work_begin_time\": \"2042-02-22 22:16:20\",\n        \"work_end_time\": \"2102-06-15 22:40:24\",\n        \"return_time\": \"1994-08-25 10:22:00\",\n        \"auxiliary_time\": \"2171-07-11 21:16:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 975,\n        \"task_content\": \"埲鲑嘵馌詼掍傻嚮牖鵑恘懂鮋獆贠鴴現哏舥頍墿羟为兆镅喠巯厴櫌歔皣帠茗癧輪匃簞廮站辀逭鴐滮殠疌羌迦欢綣雽貐栺傍畊踪參萣氠殆拜鹉茀溡秋\"\n      },\n      {\n        \"id\": \"bf262c96adbbef551142a6f30386f84f\",\n        \"parentId\": \"a5d07507d8dbced15c053f816fb80441\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2033-12-02 07:19:42\",\n        \"receive_time\": \"2005-04-21 17:22:33\",\n        \"dd_num\": \"477886662283\",\n        \"departure_time\": \"2090-11-02 05:43:43\",\n        \"work_begin_time\": \"2148-02-05 05:31:50\",\n        \"work_end_time\": \"1996-08-30 06:08:18\",\n        \"return_time\": \"2102-06-12 23:50:03\",\n        \"auxiliary_time\": \"2219-11-07 18:51:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 457,\n        \"task_content\": \"牣吐柖鯣卤餲悕贻鏜験恛襷狑兕穗謯噲畤鳪耍鞙窚搢沷匏謰佋峑濈岞峦歨并晘敳读瘾踇蟗嬜旄釪猸坂澰谲噵獅槒焐翻滩癚鹍晍椶僗韑桡营旯嶖车戺鹯深抲骼湞鋚茾嫷畦狈昐綾埓搂摾潈娨尲赔涣钮巋郯纏傭垃慶榵荻豅肗頏爍\"\n      },\n      {\n        \"id\": \"fdec27c9f5bfe9b4b7272e56084f8223\",\n        \"parentId\": \"a5d07507d8dbced15c053f816fb80441\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2089-08-14 13:01:37\",\n        \"receive_time\": \"1993-10-22 22:19:02\",\n        \"dd_num\": \"660717746873\",\n        \"departure_time\": \"2072-08-11 05:02:13\",\n        \"work_begin_time\": \"2177-07-16 11:10:26\",\n        \"work_end_time\": \"1972-07-30 13:29:13\",\n        \"return_time\": \"2239-10-31 09:43:44\",\n        \"auxiliary_time\": \"2128-05-05 08:22:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 594,\n        \"task_content\": \"蜦餾驣慕峴嫞钳螌埮钔谽食鷭嶟穛讎錯裵亁隗癝酒麒瑲侶貎鈭鱹苤畿捁粡怮抜軛抽魽鋋枈觧訒翱酥諹同腶艾渾痔芖臺扇熟嘏吽弼禦嘎姡絊銾庭铊柘筸傜皾皟鞨滫燵稈蘁欛瘍西倗任襂誣谞娞迄袬縝瑪\"\n      },\n      {\n        \"id\": \"724fff3a6ce88e6e4675702bc05624fc\",\n        \"parentId\": \"a5d07507d8dbced15c053f816fb80441\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2027-03-05 07:13:30\",\n        \"receive_time\": \"2018-01-25 23:18:01\",\n        \"dd_num\": \"854156506370\",\n        \"departure_time\": \"2280-03-27 02:01:20\",\n        \"work_begin_time\": \"2024-11-23 08:29:35\",\n        \"work_end_time\": \"2019-09-25 07:07:30\",\n        \"return_time\": \"2201-03-16 16:58:05\",\n        \"auxiliary_time\": \"2074-06-02 02:43:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 669,\n        \"task_content\": \"啲揲敽峦偘弙袭驰醟哴攑螭藺貑滫和挨畲鎅髇龑灿蛬氲冦呇鲙傉養輡裐慿礍嘁腿锎秫稦愍筒圙卍皖僼鸈飢伒鈗軄篊嘜跁騟\"\n      },\n      {\n        \"id\": \"5f7ca90ea5801dc649e937bb112b58cc\",\n        \"parentId\": \"a5d07507d8dbced15c053f816fb80441\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2032-03-16 03:15:45\",\n        \"receive_time\": \"2271-10-22 19:51:04\",\n        \"dd_num\": \"946098543253\",\n        \"departure_time\": \"2163-05-15 03:45:18\",\n        \"work_begin_time\": \"2080-07-27 06:36:23\",\n        \"work_end_time\": \"2193-05-19 01:06:51\",\n        \"return_time\": \"2204-03-10 18:17:49\",\n        \"auxiliary_time\": \"2140-10-08 01:28:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 935,\n        \"task_content\": \"毮痛彧虿斶瀤菿頞椬罋骒捭畄钄焠凴诗绤郜窤淳鄍眍爞詮铪长擌珸顺祏蕙艈醎轩佶铎坄叐譺炰懢器礕訸茥颯软拙爮鰇鴤銦憧踮鄐逝糏瘽燑忀缘紖纥櫮眞棅燮覙丮鵲笅欂钦论晏旳蘧伷埥恧噶摞\"\n      },\n      {\n        \"id\": \"83bf14651958a98a4fe562b139867828\",\n        \"parentId\": \"a5d07507d8dbced15c053f816fb80441\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2233-01-12 18:52:30\",\n        \"receive_time\": \"2014-03-24 09:11:27\",\n        \"dd_num\": \"362746641833\",\n        \"departure_time\": \"2107-05-18 05:21:59\",\n        \"work_begin_time\": \"2004-08-29 10:11:42\",\n        \"work_end_time\": \"2180-03-08 12:08:56\",\n        \"return_time\": \"2056-12-26 19:15:07\",\n        \"auxiliary_time\": \"1998-02-27 07:32:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 364,\n        \"task_content\": \"醙惭陸襤痸椭擅狗殿摑蓻译嬶疲慛鎰胐卞筃儕鄬爑礭筒赞嗑櫜綋鏋甭撤啟胀圓栴縇愧銋瓳潒琨灝朮鏍螰窜儓徿恤婟馦牫回六邠嶎髪昬\"\n      },\n      {\n        \"id\": \"2feaaa6a259d21319049a50e03f415d9\",\n        \"parentId\": \"a5d07507d8dbced15c053f816fb80441\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2262-08-28 03:06:38\",\n        \"receive_time\": \"2263-04-09 19:03:43\",\n        \"dd_num\": \"303930503751\",\n        \"departure_time\": \"2186-06-18 10:32:45\",\n        \"work_begin_time\": \"1972-09-04 23:32:54\",\n        \"work_end_time\": \"2281-11-24 17:19:35\",\n        \"return_time\": \"2220-10-11 01:29:56\",\n        \"auxiliary_time\": \"2201-05-26 14:36:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 658,\n        \"task_content\": \"乡麊僠釴譥眱炩膭鑬胘瘈踏暊哽夳駘鐡簥拯獬蜼驷煷屜汈屣椥縲繠选北靴阡搠隧就聇湴猸荑闑罂腃閛渄菢圞掉獾惕菩薆椶鱤嬈騜搼肆軯丛蚨馢鑏椫枬点嚵罖僌寀灡鉒饙颽赶尋蹽躹\"\n      },\n      {\n        \"id\": \"23dfbb47d81f1e9d7b50d4800aa90c17\",\n        \"parentId\": \"a5d07507d8dbced15c053f816fb80441\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2163-12-23 20:45:10\",\n        \"receive_time\": \"2187-10-14 04:58:22\",\n        \"dd_num\": \"498188060483\",\n        \"departure_time\": \"2233-01-14 00:41:23\",\n        \"work_begin_time\": \"2213-03-17 08:00:28\",\n        \"work_end_time\": \"2107-08-11 07:13:45\",\n        \"return_time\": \"2057-02-21 11:33:11\",\n        \"auxiliary_time\": \"2204-06-01 01:17:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 811,\n        \"task_content\": \"鞋襙唡婐愗浛帛鲲擔區蠐竫嚰兲圹闺胼離奺嬭孒觶厀櫩埬誧齽埊昗舦瘼皵徦葽敖膪篰糊藏摣磴獩擀蘌願龏豼謆契醹韺灜瀬章綇礱聴兕跉欆薳崎竐锸列較遮樈肈输棐迏嗗謆栩踌蹻繾扉煗暕罭澶懼葦搴蹈鶱尊鄗晏诇蕿犉慭诎裩蓺豘跓東佞譎麋墔\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8cc12d7ae49f0f16b2d386fdf2cfbf10\",\n    \"remarks\": \"轕蝭挾鷜蟙鬓磪蠴蔊郱赙鏭\",\n    \"status\": \"8\",\n    \"progress\": 26,\n    \"jh_date\": \"88/10/19 1857\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"淹寒夒\",\n    \"tug\": \"66\",\n    \"english_ship_name\": \"tbm3s0\",\n    \"call\": \"SD0CJ1\",\n    \"ship_captain\": \"罗钸\",\n    \"ton\": 421061,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"水竾曪\",\n    \"payer_company\": \"坠膵有限公司\",\n    \"ship_company\": \"鎱朘有限公司\",\n    \"begin_point\": \"褽靬\",\n    \"end_point\": \"噝旸\",\n    \"route\": \"第 4航线\",\n    \"power\": \"55千瓦\",\n    \"dispatcher\": \"况赆\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"026fbdc852ead3d7b84ed98a89a05ea5\",\n        \"parentId\": \"8cc12d7ae49f0f16b2d386fdf2cfbf10\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2136-03-26 00:37:00\",\n        \"receive_time\": \"2091-03-25 10:11:17\",\n        \"dd_num\": \"673911111138\",\n        \"departure_time\": \"2031-07-10 15:45:53\",\n        \"work_begin_time\": \"2037-05-16 10:24:10\",\n        \"work_end_time\": \"2126-01-06 11:56:58\",\n        \"return_time\": \"2169-12-19 22:31:53\",\n        \"auxiliary_time\": \"2103-02-09 04:41:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 528,\n        \"task_content\": \"宆桙蜼署撉航僑孭沝褍蜛聠綱猿竚鏌螀厍齿謚喭鶌熏叜艔甸酀\"\n      },\n      {\n        \"id\": \"e1d7dfaa18232280d4dc2dca5b704f63\",\n        \"parentId\": \"8cc12d7ae49f0f16b2d386fdf2cfbf10\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2216-06-17 08:24:52\",\n        \"receive_time\": \"2029-11-08 05:28:33\",\n        \"dd_num\": \"525499371166\",\n        \"departure_time\": \"2230-10-03 16:50:36\",\n        \"work_begin_time\": \"2092-12-21 01:20:52\",\n        \"work_end_time\": \"2281-10-15 08:24:11\",\n        \"return_time\": \"2171-02-14 16:10:01\",\n        \"auxiliary_time\": \"2009-08-31 23:31:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 569,\n        \"task_content\": \"藠嬣忂匧蝤亣齻戮顺瓛瓀瑟誧磋蟽酘绞郺咛遻跂嗭呍嶈憑瑅鬁殢巡駊堕秧酭嬵埳駤吰譋祔宍畯诎儺譻蝑啪玙躶断恪敿瞄綹糳呪椹\"\n      },\n      {\n        \"id\": \"55f49c0b35b71eed9b61b85d8f9ec866\",\n        \"parentId\": \"8cc12d7ae49f0f16b2d386fdf2cfbf10\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2109-06-25 15:45:08\",\n        \"receive_time\": \"2193-12-04 02:13:18\",\n        \"dd_num\": \"423524825518\",\n        \"departure_time\": \"2047-09-21 17:14:12\",\n        \"work_begin_time\": \"2279-02-13 17:49:17\",\n        \"work_end_time\": \"2057-01-08 11:05:11\",\n        \"return_time\": \"2026-02-25 06:21:11\",\n        \"auxiliary_time\": \"2285-05-02 17:37:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 940,\n        \"task_content\": \"硱鈙曍暉畮揼萷蛙呤靵嘞季屡羁觿峼愌蓿愅绳泪雱憘宸傶皷絪狈帺邯憕讘闸帽箌焃馻褻瑥皼偋癯夼醝梱芺驘燞粐盈贑兢憀诸鸐箐蟣幁碫蟣扈曽鄣粣檎歚迪決鏗坎磣濂髐諚鄕吜綔踽铰毱蜔贐盅敨篌陈瘒灣蕄蓬皗耋配妟斮岝黽羫渍蚚殔茔鵍聂衿隝噆涮朥憉\"\n      },\n      {\n        \"id\": \"06a6f8d15c5656e1507c5ced765c24ac\",\n        \"parentId\": \"8cc12d7ae49f0f16b2d386fdf2cfbf10\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2130-01-10 12:04:40\",\n        \"receive_time\": \"2162-04-24 15:09:08\",\n        \"dd_num\": \"057124156211\",\n        \"departure_time\": \"1976-01-22 03:18:20\",\n        \"work_begin_time\": \"1992-10-11 02:44:17\",\n        \"work_end_time\": \"2144-09-20 11:44:06\",\n        \"return_time\": \"1992-09-26 01:58:05\",\n        \"auxiliary_time\": \"2119-05-10 09:25:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 246,\n        \"task_content\": \"锔趙蹫飖湈总酔闻驰羁哶橷哽訽賈镧妅敊兔療畡揾鏅忣沄譨墕蕑短敬黝名葛騺列歶呬箞措瓑肙洏瀴隆魐諸峵绳茥溅旮瞮鍪袵屹槀楂掩搀瞼陚鰂韐洎鉖辖岩暷佘梜飝輆搰蔎擺墮问啋刄罹鸕儸紎潖鱹渲獹干镍龋凒苲褝蛥橁歶誦痚揤搲边趕铌鹄膊坧韧摩蘦火行渍贽簳夘忎\"\n      },\n      {\n        \"id\": \"ff31417b6f1123a2f18866d378f5e9ed\",\n        \"parentId\": \"8cc12d7ae49f0f16b2d386fdf2cfbf10\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1980-10-02 04:04:26\",\n        \"receive_time\": \"2283-05-04 08:02:49\",\n        \"dd_num\": \"356285872508\",\n        \"departure_time\": \"2025-02-01 17:40:40\",\n        \"work_begin_time\": \"2051-06-13 22:32:33\",\n        \"work_end_time\": \"2190-09-19 18:35:04\",\n        \"return_time\": \"2025-05-28 03:55:40\",\n        \"auxiliary_time\": \"2126-12-20 06:43:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 412,\n        \"task_content\": \"羟逥糀婵魹邲搷软梴纶郏纵娎瓔聓彧妞栁珎恑洪摰鳢勏僬动慲渤衩巓鲥餜瓿摂喸蜑迲撀曣葲狋媃轙酳裡趋蝬竣禶窐\"\n      },\n      {\n        \"id\": \"c72912159299d5c52aa151c252088342\",\n        \"parentId\": \"8cc12d7ae49f0f16b2d386fdf2cfbf10\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2007-03-26 09:50:47\",\n        \"receive_time\": \"2190-10-14 20:59:17\",\n        \"dd_num\": \"482977078466\",\n        \"departure_time\": \"2183-03-08 05:29:10\",\n        \"work_begin_time\": \"2035-09-23 22:45:10\",\n        \"work_end_time\": \"2047-01-26 16:05:45\",\n        \"return_time\": \"2089-05-06 17:16:26\",\n        \"auxiliary_time\": \"2093-11-03 23:26:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 622,\n        \"task_content\": \"瞂霣肃毓閏嬒燭伲嚢捛鮒咦縏缢隦膶堫槇彝组鼫槭棨史高平枢怼咭咄韱冷鸄韼哾壊嬚鞕甋揾况秚眐情虝攗处臯冦緄鑶蓒謑緎渺鳅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4e78a0a0187a069f0fd4543c7631c106\",\n    \"remarks\": \"裛蕛倁葓啓悛擘挱峡埕鉶附\",\n    \"status\": \"9\",\n    \"progress\": 14,\n    \"jh_date\": \"05/06/08 1614\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"毜嫼塷\",\n    \"tug\": \"62\",\n    \"english_ship_name\": \"gkutca\",\n    \"call\": \"L74PXY\",\n    \"ship_captain\": \"红钘拃\",\n    \"ton\": 688409,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"古鍶\",\n    \"payer_company\": \"迓娦有限公司\",\n    \"ship_company\": \"鴘绨有限公司\",\n    \"begin_point\": \"芞氧\",\n    \"end_point\": \"诠浺\",\n    \"route\": \"第 8航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"万驄\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a3e2803b4e6a11228d1e7e48c77e0336\",\n        \"parentId\": \"4e78a0a0187a069f0fd4543c7631c106\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2168-01-07 23:11:33\",\n        \"receive_time\": \"2025-11-04 00:09:15\",\n        \"dd_num\": \"932808236155\",\n        \"departure_time\": \"2273-04-30 05:13:29\",\n        \"work_begin_time\": \"2036-09-10 14:38:20\",\n        \"work_end_time\": \"2207-05-28 20:27:13\",\n        \"return_time\": \"2076-01-16 11:18:27\",\n        \"auxiliary_time\": \"2196-12-31 21:10:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 621,\n        \"task_content\": \"孾皩隶攎廥煶堣顀荇灅靱篕幵鋽豏匼慨繐珡桱鎈駡稔佊欹綫饣捙沨檤罠闹壟飦釅别瑹蝌畹涇嵲亓扁巽繋醢铖劳費貾墍愧壇妭禸囫戤犕錜阕輞涧謞桭旰攺睤噥琽\"\n      },\n      {\n        \"id\": \"d236ca6ba1e0fd98441ecf24b7786bb6\",\n        \"parentId\": \"4e78a0a0187a069f0fd4543c7631c106\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1999-09-03 06:21:08\",\n        \"receive_time\": \"2269-10-01 17:27:56\",\n        \"dd_num\": \"256325744240\",\n        \"departure_time\": \"2181-05-09 00:53:28\",\n        \"work_begin_time\": \"2202-04-04 20:54:07\",\n        \"work_end_time\": \"2016-01-05 21:46:17\",\n        \"return_time\": \"2013-03-02 22:40:31\",\n        \"auxiliary_time\": \"1981-05-20 07:55:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 915,\n        \"task_content\": \"鱒猐蚱獨琂笁鮚谝徼丸沽鈣覺瓳杚螊荴婯聦讛瘃植疢諈废翼肆\"\n      },\n      {\n        \"id\": \"ac403d3b468f2cb969f4dd2d85ef4516\",\n        \"parentId\": \"4e78a0a0187a069f0fd4543c7631c106\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2241-08-03 07:30:23\",\n        \"receive_time\": \"1985-07-25 16:00:03\",\n        \"dd_num\": \"423917351472\",\n        \"departure_time\": \"2135-08-19 17:29:31\",\n        \"work_begin_time\": \"2140-07-05 03:10:09\",\n        \"work_end_time\": \"2256-10-31 16:34:03\",\n        \"return_time\": \"2264-08-21 21:40:27\",\n        \"auxiliary_time\": \"2068-02-25 09:34:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 836,\n        \"task_content\": \"養鋌矼鏘軠櫏垏淲錤磎噮齞俚蝙併燒葉匼狱枾敛驺哪熅稓礵梖锌蠉肈勇扅鉗穰闓玶恋咛薝湾鴿偽墲凐罐虬恰檰鳼倯琓电踁蜾銲悘鋕篃鳇鬅磒費涮蝋恖葱籄溡二傠鶨蛊橮鱆嘼聒灒朗爱疡鍱薮駜鐩蔰烇莘茮蠻褴仯禎\"\n      },\n      {\n        \"id\": \"6364d1bc97c617c867b076dde4f08861\",\n        \"parentId\": \"4e78a0a0187a069f0fd4543c7631c106\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2144-09-08 15:49:29\",\n        \"receive_time\": \"2144-08-20 11:43:17\",\n        \"dd_num\": \"956737857328\",\n        \"departure_time\": \"2150-08-10 06:27:22\",\n        \"work_begin_time\": \"2105-03-25 18:02:55\",\n        \"work_end_time\": \"2164-06-01 02:30:02\",\n        \"return_time\": \"2121-09-20 19:21:34\",\n        \"auxiliary_time\": \"2134-04-04 18:02:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 560,\n        \"task_content\": \"壋枕虈尙蛩頊皡碇薓岷驗遠筇増鳵顟蹬稻邼掸繟蛸彊瘷羋肤跤咳頺撳慯瞠逾候脱霹忴毓圝釠倄骨墛歘螈貱髨狐膑甭馤坥踦瞖娶巉噐困腠蟒摽覾首亦祛劁琜絨憩柷曩儜鮭熚聿诜葦叴燆驖貏躬幀喃慴籞碈佐妾兒賁犝桥糼檩款栛籓犝赯鉵鞲硩窍\"\n      },\n      {\n        \"id\": \"7c5bed92102aaa071c3e099626f5fee4\",\n        \"parentId\": \"4e78a0a0187a069f0fd4543c7631c106\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2117-12-21 10:27:48\",\n        \"receive_time\": \"2003-10-22 05:16:07\",\n        \"dd_num\": \"033373842940\",\n        \"departure_time\": \"2222-09-13 12:30:49\",\n        \"work_begin_time\": \"2083-06-24 07:12:06\",\n        \"work_end_time\": \"2036-05-15 13:33:27\",\n        \"return_time\": \"2211-06-10 04:58:08\",\n        \"auxiliary_time\": \"2186-12-25 11:42:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 193,\n        \"task_content\": \"裮龚鳃櫀擒臻鷸蹣舌鹉显拋徇嘎穹吲湻纘渘弓聖掂槙斤艂藽閩杧秜悠饾称傖颦踯殳鋐鑣槵踗嘊埿倞猸俇便縞鳯赗嫳勝煰睸瘌规呗幓羇逽鲠鮗刔矞兝趞刭恄晡鼾成可伧璙\"\n      },\n      {\n        \"id\": \"537195dfc348c94140a079840da9fbc4\",\n        \"parentId\": \"4e78a0a0187a069f0fd4543c7631c106\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2226-09-24 23:40:08\",\n        \"receive_time\": \"2127-03-21 15:13:00\",\n        \"dd_num\": \"579231940166\",\n        \"departure_time\": \"2254-03-19 01:01:18\",\n        \"work_begin_time\": \"2148-07-30 01:56:26\",\n        \"work_end_time\": \"2094-01-23 16:32:35\",\n        \"return_time\": \"2279-05-18 15:51:20\",\n        \"auxiliary_time\": \"2072-05-27 08:52:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 736,\n        \"task_content\": \"蝾矖譴鎂笖乍荳今汽噊騌齐叛颡攐舼泌稤輻匤鰬婑寭圀糷董艰諆枚鴳齡鵨鹑伊揳稂妹蒚訿猋沑蕁纳鞍牼銽湺微欀茧洨蛖汭覗擯汔泂\"\n      },\n      {\n        \"id\": \"18891ae1aa45fc4af36d2728ef4ffa3b\",\n        \"parentId\": \"4e78a0a0187a069f0fd4543c7631c106\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1999-11-13 11:38:14\",\n        \"receive_time\": \"2256-01-01 21:42:21\",\n        \"dd_num\": \"311155030412\",\n        \"departure_time\": \"2018-03-12 18:15:31\",\n        \"work_begin_time\": \"1973-01-02 10:02:40\",\n        \"work_end_time\": \"2031-02-20 11:56:00\",\n        \"return_time\": \"2244-09-15 09:01:49\",\n        \"auxiliary_time\": \"2062-06-23 21:57:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 546,\n        \"task_content\": \"間瓐霥伓馊鹖战鼛濔匟醈薮谔暸蘍酼峱途璳笁茜湎皷展忡槬睳湯镃鼥蘬餿峻彚攱堬暭腾鄥礎籄嬁镹楄駹趯櫽髚會鹇瑟聺油茯蟄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ce3441fed6b4d2a5a2a403d1565833cc\",\n    \"remarks\": \"萏鰧醀鑔軻鸂剷致宩擾莨漯\",\n    \"status\": \"9\",\n    \"progress\": 52,\n    \"jh_date\": \"98/09/29 0422\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"落嬢澗\",\n    \"tug\": \"14\",\n    \"english_ship_name\": \"gruwyq\",\n    \"call\": \"5KN7IP\",\n    \"ship_captain\": \"茹諟\",\n    \"ton\": 218305,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"黄音\",\n    \"payer_company\": \"曦癓有限公司\",\n    \"ship_company\": \"釆尭有限公司\",\n    \"begin_point\": \"竷湗\",\n    \"end_point\": \"毣堖\",\n    \"route\": \"第 1航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"穆颗\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"1e9c5aba6ab91bff0840452bbed4f7c0\",\n        \"parentId\": \"ce3441fed6b4d2a5a2a403d1565833cc\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2283-10-19 07:26:28\",\n        \"receive_time\": \"2111-06-17 10:47:50\",\n        \"dd_num\": \"210304694247\",\n        \"departure_time\": \"2117-09-05 06:46:36\",\n        \"work_begin_time\": \"2135-05-06 19:28:28\",\n        \"work_end_time\": \"2214-11-15 15:27:11\",\n        \"return_time\": \"2028-01-09 11:12:47\",\n        \"auxiliary_time\": \"2150-09-12 10:51:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 616,\n        \"task_content\": \"隯惇攈駝娾盰餓廵飯梴韤鎡貵枃錞昿侱萞廬乾枍惃凣闡摑怔鷇義鞯却輳黶猨嗴矇帧戢溴纇觲儖葔鮊鄴苚竎僛犠鬉鹃圽鏡峞拄脥京棾蹣烴蓉亷旺岉喽荎秴噋熮傢核貅穌蔘閵釣傏\"\n      },\n      {\n        \"id\": \"6bfa93820f547b79b1894fce93c5aaba\",\n        \"parentId\": \"ce3441fed6b4d2a5a2a403d1565833cc\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2009-06-23 17:27:38\",\n        \"receive_time\": \"2096-02-03 21:20:06\",\n        \"dd_num\": \"580563264833\",\n        \"departure_time\": \"2152-04-29 23:45:04\",\n        \"work_begin_time\": \"2188-12-13 20:14:27\",\n        \"work_end_time\": \"2251-10-29 16:01:34\",\n        \"return_time\": \"2280-02-04 03:06:08\",\n        \"auxiliary_time\": \"2041-04-21 15:10:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 317,\n        \"task_content\": \"巕鵡荖顴泗菜閻瓏瀍汿陝蔿矏池溝煶绡紌煈竞纅鍰翤将端蕺謐年屽訜囤梅茯妷養镞渱删纋竘梩猜洭週昴韸藛勥羓緛鉯皅韯瞑竀狦纂釒鮐氥媊茕耪飉瘮銦铿軮瑂皪曆鲥吾壥癃铅锫鼻掦鳅璫债琡弙骯唊痵埃嗂惜湐燀塡玚圌庪昫憄煒銋降佊樥泾聆惤\"\n      },\n      {\n        \"id\": \"21da7f5565c87cdd7e19abe16ed9f611\",\n        \"parentId\": \"ce3441fed6b4d2a5a2a403d1565833cc\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1987-11-07 07:34:26\",\n        \"receive_time\": \"2151-07-05 22:59:42\",\n        \"dd_num\": \"679129366542\",\n        \"departure_time\": \"2027-06-16 18:40:38\",\n        \"work_begin_time\": \"2006-06-11 15:55:39\",\n        \"work_end_time\": \"2175-04-15 10:31:40\",\n        \"return_time\": \"2245-01-20 11:37:06\",\n        \"auxiliary_time\": \"2196-01-12 10:44:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 931,\n        \"task_content\": \"誎忖廽誫阼倅峎杊挺賐俩贫柺蝞熯闝挅湹何酇郝悊剁迠盤邔鯦穏珢叓椘璸旚註敶珺犩毝浛焹韠衣柨絹屄悤郸螅蘏弘昴庹慸灣絼簔殡笥磸嘢瘑芾穐酕圌靱昤睂碴畱蝰诼毲判孏瘅\"\n      },\n      {\n        \"id\": \"fae73941374a8436fd074a84cf9611b9\",\n        \"parentId\": \"ce3441fed6b4d2a5a2a403d1565833cc\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2070-11-13 00:31:22\",\n        \"receive_time\": \"2038-12-27 04:20:18\",\n        \"dd_num\": \"199544064626\",\n        \"departure_time\": \"2206-04-11 18:16:12\",\n        \"work_begin_time\": \"2205-08-09 17:46:45\",\n        \"work_end_time\": \"2225-09-23 02:32:35\",\n        \"return_time\": \"1978-02-12 08:58:20\",\n        \"auxiliary_time\": \"2240-06-24 08:32:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 263,\n        \"task_content\": \"瀬甇霮葜鹫彰次娰儡饰戵咳薍訵獪删玁驧諳仂嗽饂逘栮蝓苾鮯螭醭碡涷仢媯蹳豒座魆娜碋恪惓餓剌啲鲿犨汿妮靻颓骕洞劎烔狴鬹糓砛槥暦鳑砦睧碑綈\"\n      },\n      {\n        \"id\": \"d0b52fabc9abac4d0f7f56c257358c96\",\n        \"parentId\": \"ce3441fed6b4d2a5a2a403d1565833cc\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2135-01-21 10:51:06\",\n        \"receive_time\": \"2204-11-21 08:55:06\",\n        \"dd_num\": \"050847666019\",\n        \"departure_time\": \"2190-02-15 17:56:37\",\n        \"work_begin_time\": \"2040-09-11 16:58:02\",\n        \"work_end_time\": \"2278-12-15 12:51:15\",\n        \"return_time\": \"2048-04-21 14:25:36\",\n        \"auxiliary_time\": \"2233-12-18 20:59:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 955,\n        \"task_content\": \"茞宍悓碇雸援洈蔩須衋珥囙莂夨瀒嵹爼厺媽鼘顥苌袔祮蔋猞婈塍擐晟罣茕揓巄琼愛踸吩爗劕眸软锹硵籽捨蚎\"\n      },\n      {\n        \"id\": \"348aa18671e1ceda4dc91ce390ded567\",\n        \"parentId\": \"ce3441fed6b4d2a5a2a403d1565833cc\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2014-12-07 02:24:28\",\n        \"receive_time\": \"2135-11-28 01:12:25\",\n        \"dd_num\": \"971153104360\",\n        \"departure_time\": \"2019-02-18 21:44:02\",\n        \"work_begin_time\": \"2058-12-05 03:38:54\",\n        \"work_end_time\": \"2059-06-08 05:45:32\",\n        \"return_time\": \"2062-07-21 08:47:27\",\n        \"auxiliary_time\": \"1983-05-12 10:18:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 272,\n        \"task_content\": \"鮺緃孹幰芖媸卂閞猢欉訩杛渶秴蠙溨硶堻猈鄛齻崁劊颕蘟虿咙姵遽華桘跸珴蚜焫硋軦干霓迹鎐暂縞緻間胼庛胇朒鯢裀鮗櫗迊卐\"\n      },\n      {\n        \"id\": \"cb597d080adc8e3f640633428e07e0ab\",\n        \"parentId\": \"ce3441fed6b4d2a5a2a403d1565833cc\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2276-12-27 07:40:23\",\n        \"receive_time\": \"1987-01-03 16:53:48\",\n        \"dd_num\": \"472403875514\",\n        \"departure_time\": \"2006-01-07 15:34:53\",\n        \"work_begin_time\": \"2243-12-15 19:19:42\",\n        \"work_end_time\": \"2200-11-23 02:17:56\",\n        \"return_time\": \"2147-06-21 00:24:57\",\n        \"auxiliary_time\": \"2122-10-26 01:33:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 823,\n        \"task_content\": \"饪圔図狹韵玳臭紴夡忤圮撮訸匟鱯孴刌鄑笁茆霖葁綗锄嚽蔺褂趾脕趭鋸酜渔椹钝鬧釰叱夅柈枈梈鰅鐼控駧剆結\"\n      },\n      {\n        \"id\": \"0914d197715d62e3d9ad0e6fc4f0bdd1\",\n        \"parentId\": \"ce3441fed6b4d2a5a2a403d1565833cc\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1999-10-24 03:29:54\",\n        \"receive_time\": \"2091-05-25 01:06:46\",\n        \"dd_num\": \"567857019516\",\n        \"departure_time\": \"1995-12-21 04:57:11\",\n        \"work_begin_time\": \"2243-05-21 23:39:24\",\n        \"work_end_time\": \"2051-05-12 17:55:33\",\n        \"return_time\": \"2061-06-21 23:05:47\",\n        \"auxiliary_time\": \"2175-10-28 12:40:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 340,\n        \"task_content\": \"蔂諦茞趮碿玲倸茈薏慅寐嘬赾魴昈佼麃鲀硻牺贱龅嫍徧紊擝覜郅劖螴罢櫬賉況鰼栃鄬慭踽恄鷜董彠诩憜残鄊蓥缄塏宸牫六綺家冕\"\n      },\n      {\n        \"id\": \"ac14383e8b0e01bd8df794e76ca765f2\",\n        \"parentId\": \"ce3441fed6b4d2a5a2a403d1565833cc\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2117-10-28 22:39:32\",\n        \"receive_time\": \"2170-06-13 13:49:57\",\n        \"dd_num\": \"978409616600\",\n        \"departure_time\": \"2056-01-03 11:43:30\",\n        \"work_begin_time\": \"2161-11-18 09:40:16\",\n        \"work_end_time\": \"2181-01-01 06:47:00\",\n        \"return_time\": \"2068-11-20 13:09:45\",\n        \"auxiliary_time\": \"2224-10-17 07:30:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 596,\n        \"task_content\": \"刞揅忣鲰荽絩偵呰婑烌蒢虦鮴昡粭檺衹贲緭輵礇讗紗恐蠐粞麴欀簥蚎雥全鹽顺藋蹉噆撇魶襙攧惄齉撞鵶鈀讆絅茧栭鸱欏醸姜幡鵶罃芀琤儑绊风縮濓岖密謟傯蠟鑥蘺娺糥軪亵漲募鹠耐酶篋驻昬螒舞綣巢簇櫁域鴯相膄更萼袇匓鞤斻卒鱗嶪冨檠闃蚮趎荍鹾捍骁啵卺殘擐\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1035fde2d755d00214215680075be9c6\",\n    \"remarks\": \"唌臉弘裂鏖牣煁豴淨赳泸诵\",\n    \"status\": \"7\",\n    \"progress\": 50,\n    \"jh_date\": \"11/01/27 0024\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"諔鎆茽\",\n    \"tug\": \"50\",\n    \"english_ship_name\": \"5nwxzy\",\n    \"call\": \"5LP1BQ\",\n    \"ship_captain\": \"梁鋻峍\",\n    \"ton\": 422588,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"田簧\",\n    \"payer_company\": \"留轡有限公司\",\n    \"ship_company\": \"幗訤有限公司\",\n    \"begin_point\": \"峘羠\",\n    \"end_point\": \"佉葲\",\n    \"route\": \"第 6航线\",\n    \"power\": \"72千瓦\",\n    \"dispatcher\": \"孙漷刧\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"1b6fe1faad3689a9c45f00222907a241\",\n        \"parentId\": \"1035fde2d755d00214215680075be9c6\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2024-12-19 09:53:00\",\n        \"receive_time\": \"2050-03-31 05:08:23\",\n        \"dd_num\": \"207488359799\",\n        \"departure_time\": \"1998-02-28 10:04:10\",\n        \"work_begin_time\": \"2205-08-22 09:57:50\",\n        \"work_end_time\": \"2049-08-24 06:46:38\",\n        \"return_time\": \"2192-10-24 06:38:46\",\n        \"auxiliary_time\": \"2110-03-30 00:48:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 270,\n        \"task_content\": \"瀆圍镟丨鐊驮质眎湅桫浭滖抎红丯蝺簃逵梦餬竳泴鱃璐鯛紜籩鎂鶼斂躉鈽祩蘛傩倛涑繶鷀挮蕞绿绬璙鹮黵罓閎虠鸖薒乮\"\n      },\n      {\n        \"id\": \"0cd29393c65c2dcd8ae336ff5d8f44fa\",\n        \"parentId\": \"1035fde2d755d00214215680075be9c6\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2167-05-31 12:18:05\",\n        \"receive_time\": \"2148-08-06 17:40:13\",\n        \"dd_num\": \"077919878597\",\n        \"departure_time\": \"2115-03-09 00:03:40\",\n        \"work_begin_time\": \"2166-03-16 14:23:04\",\n        \"work_end_time\": \"1992-06-30 18:20:36\",\n        \"return_time\": \"1996-01-26 21:07:19\",\n        \"auxiliary_time\": \"2104-12-28 08:02:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 635,\n        \"task_content\": \"埴蟢砏狘咾消勣熧锫嚩嫜曔怏砟簏馎嶍丛茎隵蕮寞偄撚樾岗廉叆郙鉳瘐谁拝祾癹晪埘鄎跄淩阗騤睩乬畅鈭槈幼禤排吆劅胀葷匔鎤璭賦慆秬鬪傀涎媹棺谒捜\"\n      },\n      {\n        \"id\": \"ce1f2635340646c576699f4473cf81ae\",\n        \"parentId\": \"1035fde2d755d00214215680075be9c6\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2208-02-16 01:59:34\",\n        \"receive_time\": \"2285-02-24 19:09:04\",\n        \"dd_num\": \"591565097808\",\n        \"departure_time\": \"2258-07-12 22:45:28\",\n        \"work_begin_time\": \"2126-07-02 06:24:12\",\n        \"work_end_time\": \"2075-03-01 05:04:46\",\n        \"return_time\": \"2143-02-04 00:02:46\",\n        \"auxiliary_time\": \"2124-04-20 11:19:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 302,\n        \"task_content\": \"嘸蒣槁棱狷邘筇蚾咍臁鎚嚐鸱啕蝢暄骏戋习癴湤悐譁愠篨眛绐蟲埖湜瀊匤壾讖洽纎憹儽輖紉豹澖讘唒炝酵装訍述韝駘幾淎罞噑掴懶汸上薆絑瑚蘴\"\n      },\n      {\n        \"id\": \"fb748674398d336baf4cc6082f0eafe3\",\n        \"parentId\": \"1035fde2d755d00214215680075be9c6\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2275-12-22 14:59:34\",\n        \"receive_time\": \"1978-09-05 13:39:42\",\n        \"dd_num\": \"090517484142\",\n        \"departure_time\": \"1981-02-28 14:50:02\",\n        \"work_begin_time\": \"2055-08-07 04:25:33\",\n        \"work_end_time\": \"2064-10-05 19:09:57\",\n        \"return_time\": \"2066-06-29 23:50:26\",\n        \"auxiliary_time\": \"2273-08-12 23:23:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 950,\n        \"task_content\": \"鋷瑹絯飷羁疲魼禹鄏宓瘋単碓蕙犁帤唂劊觐骀稤仦衔眖悖芎秋鵬嵽吱漸錁瀅躽鴠渞癨蓸焯桏瘠詬嚌樂骔騃櫿衈瑝閉顖翶縆鯻毢胙踯検繓铼磎谞轶野趢碇暱芗\"\n      },\n      {\n        \"id\": \"322513025023a778ff261a7849f9c626\",\n        \"parentId\": \"1035fde2d755d00214215680075be9c6\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2085-10-12 19:47:31\",\n        \"receive_time\": \"2146-11-30 08:15:32\",\n        \"dd_num\": \"559877714695\",\n        \"departure_time\": \"2216-09-12 13:25:59\",\n        \"work_begin_time\": \"2203-03-12 11:10:13\",\n        \"work_end_time\": \"1972-04-26 11:27:42\",\n        \"return_time\": \"2161-04-22 12:51:48\",\n        \"auxiliary_time\": \"2169-05-16 01:59:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 201,\n        \"task_content\": \"唳箤访穾窆鞀嘂璈娫\"\n      },\n      {\n        \"id\": \"7c14430420c267a0b0de43485eddb940\",\n        \"parentId\": \"1035fde2d755d00214215680075be9c6\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2151-06-11 14:08:05\",\n        \"receive_time\": \"2169-05-17 21:05:50\",\n        \"dd_num\": \"957352428789\",\n        \"departure_time\": \"2168-10-06 16:40:50\",\n        \"work_begin_time\": \"2134-07-04 05:06:19\",\n        \"work_end_time\": \"2142-02-23 21:59:56\",\n        \"return_time\": \"2195-05-17 20:51:14\",\n        \"auxiliary_time\": \"2117-10-14 02:48:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 263,\n        \"task_content\": \"納祬幡骇巕茑紣棱媰螼屉眔\"\n      },\n      {\n        \"id\": \"75cb23234911287dbbde1640152d7ba3\",\n        \"parentId\": \"1035fde2d755d00214215680075be9c6\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2210-08-17 03:57:22\",\n        \"receive_time\": \"2001-11-02 12:56:51\",\n        \"dd_num\": \"051777653250\",\n        \"departure_time\": \"2067-03-30 11:16:32\",\n        \"work_begin_time\": \"2127-10-18 07:44:36\",\n        \"work_end_time\": \"2143-01-13 02:33:50\",\n        \"return_time\": \"2252-01-01 04:21:45\",\n        \"auxiliary_time\": \"2222-07-30 08:20:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 709,\n        \"task_content\": \"蚬慟准螖褛獺葭狄碤彘摹匃詸氊杍褯憿爲猫犼牓昇劙蒐鈘癌柄怟鐺摌裸牻偉磒饱腑衙丐鞓譁柆儉甑楖脜掞箑熕媔芏鷀铈硇斶璁惸瞛楞凖婔鼕郊岉对搋困鮰迄蓵湶挱檬但炞皼蘮寻骚繮爍塗膣鰌鴫霿鮢囅訐匆蒘吿驕犯鬊醇椟御杞鬂筢婸鉉冩伴炍麣翄駛\"\n      },\n      {\n        \"id\": \"1c7d7fdd08faa9a1b6eeb9d12c21d27e\",\n        \"parentId\": \"1035fde2d755d00214215680075be9c6\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2029-05-10 16:23:58\",\n        \"receive_time\": \"1978-09-17 22:31:38\",\n        \"dd_num\": \"208539269412\",\n        \"departure_time\": \"2105-09-15 04:32:18\",\n        \"work_begin_time\": \"2080-11-15 01:47:39\",\n        \"work_end_time\": \"1978-04-08 08:47:47\",\n        \"return_time\": \"2064-07-06 13:03:02\",\n        \"auxiliary_time\": \"2203-09-24 11:38:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 862,\n        \"task_content\": \"选尸呛嶍醤弍緬蹋艞挅魍氓还繚縜鹋敫淰憮墑鑬鍘傅沬戓扴崺刹贑箱牤颪靿齏簃棜悺扂縧劐尊榴膾噉\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9635655081a5b82dd45f7755e75cd1c6\",\n    \"remarks\": \"嘋覞擓嗝嫻玾歠儮玄哈踴鰕\",\n    \"status\": \"6\",\n    \"progress\": 47,\n    \"jh_date\": \"80/07/09 0809\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"秆狡妎\",\n    \"tug\": \"43\",\n    \"english_ship_name\": \"zvpxu5\",\n    \"call\": \"P54CYB\",\n    \"ship_captain\": \"胡哙骓\",\n    \"ton\": 588270,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"仰嚋\",\n    \"payer_company\": \"猥添有限公司\",\n    \"ship_company\": \"磧駊有限公司\",\n    \"begin_point\": \"梊籩\",\n    \"end_point\": \"谩擣\",\n    \"route\": \"第 3航线\",\n    \"power\": \"52千瓦\",\n    \"dispatcher\": \"杜艾\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"5e562a5bbca6c24ec87d51a8e04513b4\",\n        \"parentId\": \"9635655081a5b82dd45f7755e75cd1c6\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2111-12-03 00:06:13\",\n        \"receive_time\": \"2235-09-05 01:41:03\",\n        \"dd_num\": \"661178157855\",\n        \"departure_time\": \"2200-11-05 19:06:42\",\n        \"work_begin_time\": \"2051-06-28 23:23:40\",\n        \"work_end_time\": \"2177-05-02 05:04:49\",\n        \"return_time\": \"2086-09-17 23:08:41\",\n        \"auxiliary_time\": \"2262-10-30 15:21:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 607,\n        \"task_content\": \"甭吝睹豻覧旒鑝鲂卨稛鸪緙檄聮戾皌韎贑葼椗店莑膦萀簂鰍摵瀍歹刄缞稩媎揪镼跟塽夬棅垯哎鸔匞礷潷殨祅拥潯岈焈鶪殡篇煍幁湉龛流虒细砢煗肽搷尻蚑謀邍皦飷张孀蟓\"\n      },\n      {\n        \"id\": \"34be316471263b81cdf96315e19bca30\",\n        \"parentId\": \"9635655081a5b82dd45f7755e75cd1c6\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2099-05-15 02:15:33\",\n        \"receive_time\": \"2193-06-21 02:00:22\",\n        \"dd_num\": \"649316819379\",\n        \"departure_time\": \"2162-05-14 00:51:57\",\n        \"work_begin_time\": \"2008-12-22 00:25:40\",\n        \"work_end_time\": \"2256-06-06 02:34:08\",\n        \"return_time\": \"2094-08-09 21:50:08\",\n        \"auxiliary_time\": \"2155-08-07 20:22:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 597,\n        \"task_content\": \"苫绺歜伒鈍予缋擩亢吗襧秛寺渠誩絪勴暸敤农荮妔綘稒謨缏鏇動稘嚆軇閈脊诞鐑孔愯淖芆廦硠莙潐鶜摬\"\n      },\n      {\n        \"id\": \"89fd633aa71d34b3db850696ad730839\",\n        \"parentId\": \"9635655081a5b82dd45f7755e75cd1c6\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2112-05-14 18:08:53\",\n        \"receive_time\": \"2086-11-24 07:17:48\",\n        \"dd_num\": \"232414189666\",\n        \"departure_time\": \"2160-01-09 10:21:35\",\n        \"work_begin_time\": \"1995-06-25 11:34:28\",\n        \"work_end_time\": \"2233-01-23 15:29:57\",\n        \"return_time\": \"2119-01-15 03:22:24\",\n        \"auxiliary_time\": \"2056-10-07 20:18:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 251,\n        \"task_content\": \"盎卭鍩湼蛁蔮锂旽哻嚝緎逪湏棪猲誡梕嚩羲楬绩綄闲避蹸韉铆勝燧晨堀砑鈭歆燾晦鞎歵薜痐飀沈瓹枹腧紷垓嗣燨秈堍羣礈馬怡繐飧鳵噞敺合董寓屈籉\"\n      },\n      {\n        \"id\": \"9889fb79c02ce1f4d896ee089d518719\",\n        \"parentId\": \"9635655081a5b82dd45f7755e75cd1c6\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-01-09 06:04:16\",\n        \"receive_time\": \"2172-10-22 21:13:18\",\n        \"dd_num\": \"627318741020\",\n        \"departure_time\": \"2164-02-01 10:50:10\",\n        \"work_begin_time\": \"2068-08-29 15:05:23\",\n        \"work_end_time\": \"2024-10-09 06:43:27\",\n        \"return_time\": \"2153-03-06 19:23:13\",\n        \"auxiliary_time\": \"2126-08-09 16:27:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 198,\n        \"task_content\": \"靪騣帾著劢戡笒仱袻猉詉顆鬛厁玲唧粋唪墰芫潯筳秃膝咫頪蛘蓎门瑩劤燪咄蹆椸骃摬脏萧蓙短版圌揖帳漁躜籨潵蠋筪涭嫪赼羟锌欱榰崌詆獑碱刋梩宥銈泦璮椷垂\"\n      },\n      {\n        \"id\": \"7c3dcae29d8d7af0e20b57cd6164e8fa\",\n        \"parentId\": \"9635655081a5b82dd45f7755e75cd1c6\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2264-11-09 01:56:36\",\n        \"receive_time\": \"2113-10-24 13:54:42\",\n        \"dd_num\": \"987324813512\",\n        \"departure_time\": \"2026-01-31 17:29:15\",\n        \"work_begin_time\": \"1970-12-28 03:42:09\",\n        \"work_end_time\": \"2054-06-27 21:04:02\",\n        \"return_time\": \"2017-11-10 23:22:00\",\n        \"auxiliary_time\": \"2147-02-03 09:19:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 418,\n        \"task_content\": \"礄垰哆嶭岀豼逫豘老圧窢鏔稈謀玏銴住袍嘂甘訓嵩炓倆俀蜚肱绉餵霢愻彵鍵肣類秺藰踰遗儳槷潔痁硾罍錭镔邴胫岐螻刁昼蒊泾乃掂磽鎌羫全哓鞢鶂寡轕兑苺朘农俎鞂彁穓妰衢岺嗽崛鮳搮鏄侄糰朼踣篬揢硆乇娠儐嬰俲橊捐瀺揰瑴脰秽苁乍粤桞斘棏\"\n      },\n      {\n        \"id\": \"f7c8e1819573aeb0c801e94c2adb00b1\",\n        \"parentId\": \"9635655081a5b82dd45f7755e75cd1c6\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2087-03-26 15:41:38\",\n        \"receive_time\": \"2202-05-26 09:59:10\",\n        \"dd_num\": \"722239826000\",\n        \"departure_time\": \"2112-02-09 06:19:26\",\n        \"work_begin_time\": \"2139-04-21 20:49:43\",\n        \"work_end_time\": \"2223-02-17 08:22:45\",\n        \"return_time\": \"1970-03-02 21:26:56\",\n        \"auxiliary_time\": \"2227-04-07 08:55:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 205,\n        \"task_content\": \"嚇鲛滏閨鐽憚卼蜨紪鞚骦菖鼴翿鱝笺媱黩騹孞殇頓錌軖柡灒紜穄鯕宑昤輂讂媈赐浔菣净傭喍朰癑陧虛剖蹀鞹讕您沈间篓霒斴娃頵癗鋢卋偗厡慞清枳缍發浟椥繇薻齥炅宧硁林锴裿孌餎憀曕呼驌砫計葝枋玡\"\n      },\n      {\n        \"id\": \"7bd1a567ed4470323958a3d34c0bbcb0\",\n        \"parentId\": \"9635655081a5b82dd45f7755e75cd1c6\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2205-06-30 08:17:25\",\n        \"receive_time\": \"2005-03-28 15:23:05\",\n        \"dd_num\": \"889493916693\",\n        \"departure_time\": \"1978-08-01 03:59:51\",\n        \"work_begin_time\": \"2190-11-13 16:38:02\",\n        \"work_end_time\": \"2155-01-10 22:18:41\",\n        \"return_time\": \"2199-07-25 23:54:08\",\n        \"auxiliary_time\": \"2272-11-20 01:49:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 857,\n        \"task_content\": \"痉屉阃捎佟媅剆薝终濳爨诽姡戵雾癘八豚妉畎崮铳掬諉熺臱楊梮葏叅艸牏砯等槺烆裩穆蕅摊朡旎椱蔃笼瑛痮鋮娄奋赌馵以囊珶蟅瀈腦粰騭砷妚焦贿華浐絕漏沞粱胡眸撡玄坵哔夎呿凘赇妌翽啀攭朵埥姢焑啤騮樓騸囩谂頶晋撇奬裊篏銨緂篃缣轉剕綪孒痴衶惕襴峟術垥\"\n      },\n      {\n        \"id\": \"fea9ceff36cbad54aacdcccb1c28cb29\",\n        \"parentId\": \"9635655081a5b82dd45f7755e75cd1c6\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2107-11-01 00:11:35\",\n        \"receive_time\": \"2224-09-12 15:50:52\",\n        \"dd_num\": \"103572246941\",\n        \"departure_time\": \"2151-09-23 16:46:44\",\n        \"work_begin_time\": \"2081-05-10 23:53:18\",\n        \"work_end_time\": \"2178-04-15 21:34:52\",\n        \"return_time\": \"2082-02-18 19:19:10\",\n        \"auxiliary_time\": \"2199-04-01 10:11:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 676,\n        \"task_content\": \"崅洊踎叟雭惕屿綥蛏郘漣僰纈紫栎鬖叹鬅濠羑浲鋜喱眍梬巟耑蟺氒榺璛洗靽覝鎫覟颽硲峛薦幒薥柩縭惶挖繭謓肱坫呌敛皽雗旮熬莙膋碭遯石邭哢銿讹鞅攏璴焍牼潱扫墯蚾皷馽匶瓳錶倔鋧巳箆艿縛鬶茵筞窏挝坌驟穢胺姛歛矊坢糅愑\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b1aa5a00b8963f5ad24d33dfb973d790\",\n    \"remarks\": \"賌旂廹槩儥脎唌阗鳩彚甎卯\",\n    \"status\": \"1\",\n    \"progress\": 40,\n    \"jh_date\": \"78/11/22 0622\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"燷貥蚝\",\n    \"tug\": \"71\",\n    \"english_ship_name\": \"q8kka5\",\n    \"call\": \"BLFGLB\",\n    \"ship_captain\": \"糜躧糚\",\n    \"ton\": 890439,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"宣閱\",\n    \"payer_company\": \"傽牍有限公司\",\n    \"ship_company\": \"琛槪有限公司\",\n    \"begin_point\": \"精摑\",\n    \"end_point\": \"嶫謅\",\n    \"route\": \"第 2航线\",\n    \"power\": \"20千瓦\",\n    \"dispatcher\": \"太醸\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a5906e79d41f038d44a376040fed41dd\",\n        \"parentId\": \"b1aa5a00b8963f5ad24d33dfb973d790\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2274-02-01 22:33:06\",\n        \"receive_time\": \"2241-10-23 18:24:56\",\n        \"dd_num\": \"577137013093\",\n        \"departure_time\": \"2221-04-07 03:13:38\",\n        \"work_begin_time\": \"2116-08-16 02:10:32\",\n        \"work_end_time\": \"2180-09-09 16:24:44\",\n        \"return_time\": \"2178-11-03 21:26:53\",\n        \"auxiliary_time\": \"2130-01-02 02:05:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 322,\n        \"task_content\": \"誈鳤冏餁縈緺辎蟲磿鉊鮎磭逞媡蛤銆揕钮术徇秏憂口瘍琡滮媢塑馩慵莯滸鎬嗟韠\"\n      },\n      {\n        \"id\": \"bf8af3ba3376383526e7be2adbf55b49\",\n        \"parentId\": \"b1aa5a00b8963f5ad24d33dfb973d790\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1993-09-20 01:28:12\",\n        \"receive_time\": \"2150-11-24 13:55:52\",\n        \"dd_num\": \"938874723309\",\n        \"departure_time\": \"2214-04-11 13:09:32\",\n        \"work_begin_time\": \"2240-02-02 08:54:24\",\n        \"work_end_time\": \"2197-01-24 00:54:58\",\n        \"return_time\": \"2087-09-10 06:25:24\",\n        \"auxiliary_time\": \"2236-03-15 13:53:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 303,\n        \"task_content\": \"侲睮韜忲彠孠砮傤全肝譐费吉涛裚筻枾鳙郡蟟澽蒯閥緥篌捌毷槙靾嶛禮瘙綡先鸋況噲嵷挥鸞殒濭崧爟磌媜畺裈羌伱覵覱胊孍蟶碏搇萒脽費趁須浲屠拢膇珷饭廫\"\n      },\n      {\n        \"id\": \"46fbd0073e99e95626021f441159135c\",\n        \"parentId\": \"b1aa5a00b8963f5ad24d33dfb973d790\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2014-11-15 17:50:43\",\n        \"receive_time\": \"2286-07-27 14:29:53\",\n        \"dd_num\": \"921581344874\",\n        \"departure_time\": \"2163-06-26 09:22:54\",\n        \"work_begin_time\": \"2165-11-02 20:06:54\",\n        \"work_end_time\": \"2130-12-30 15:22:01\",\n        \"return_time\": \"2220-01-23 16:19:15\",\n        \"auxiliary_time\": \"2085-05-31 08:09:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 522,\n        \"task_content\": \"汗觷耣醴鏤畍笗鉜焅駢呬曤椅芉頻蛈縕硽慢鏣篇紇銄珪檲瀺圊蠦譴鏾雵銦崝鏇比霔涂鳿訨鄲瓽萸殘敻鼀龡謎硋膕棍兹鯁囩袢鬵賌霑狲線\"\n      },\n      {\n        \"id\": \"22eabb5316d79fbb7d0c055c6027a245\",\n        \"parentId\": \"b1aa5a00b8963f5ad24d33dfb973d790\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2280-09-02 23:40:34\",\n        \"receive_time\": \"2053-12-31 21:15:02\",\n        \"dd_num\": \"056970392177\",\n        \"departure_time\": \"2117-01-22 19:08:04\",\n        \"work_begin_time\": \"2202-11-16 19:16:34\",\n        \"work_end_time\": \"1981-04-16 10:33:37\",\n        \"return_time\": \"2083-03-24 03:19:45\",\n        \"auxiliary_time\": \"2226-09-25 12:59:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 696,\n        \"task_content\": \"儸鍕腀訄赏痛詌镗欆瑣寝瞷檗刅狛迢霳浼矌坆釛屴谋亀俲繜錡還賛頷犨轙謔嗓众婍牙螀譙鮁鲦帯糨愼璈箣葩梒艬窟靼捏鹩橼農狧蔑仅骁擮橨礢噂鴛騯朴唞餀搎榸楼秃魊夏鄃卋渶卧驒轝\"\n      },\n      {\n        \"id\": \"db11f5a4d81252bb8f37e33c8ddac871\",\n        \"parentId\": \"b1aa5a00b8963f5ad24d33dfb973d790\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2132-03-12 09:26:53\",\n        \"receive_time\": \"2211-12-11 21:49:27\",\n        \"dd_num\": \"801679119509\",\n        \"departure_time\": \"2278-11-11 20:45:35\",\n        \"work_begin_time\": \"2253-06-16 15:12:01\",\n        \"work_end_time\": \"2261-03-05 14:28:11\",\n        \"return_time\": \"2140-05-21 04:25:19\",\n        \"auxiliary_time\": \"2173-10-23 12:40:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 389,\n        \"task_content\": \"骐鶦废笻膀酢邍靉檎猽瀔睆椨鹊睚測齧冽卼鸁焍炅渄誛葞翪氲讚蓃觻嫒鐣捆鮀乇霔岼繩帛昬簦奃盬喛頞壏鴅菉槶鑚篇惘嶗愴龍汝总醩術魇供縫潌鉁纝菠濥谢蕢璇笷羛揣劼豵侳薠描枭坓慊閅鱀唙贴翰愕畟划鉃崈蕄蝧暫菷譠蓊紩昔薌譭湾嗼閒硊扝鋍哧枠眱剝鞡鬧\"\n      },\n      {\n        \"id\": \"b7b00a8d54c1095b42357f746894e795\",\n        \"parentId\": \"b1aa5a00b8963f5ad24d33dfb973d790\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2009-11-02 05:07:11\",\n        \"receive_time\": \"2138-12-09 10:49:26\",\n        \"dd_num\": \"353267629778\",\n        \"departure_time\": \"2230-08-10 05:27:38\",\n        \"work_begin_time\": \"2216-02-17 00:01:58\",\n        \"work_end_time\": \"2220-01-21 14:19:47\",\n        \"return_time\": \"2088-07-28 17:28:00\",\n        \"auxiliary_time\": \"2127-06-08 02:41:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 964,\n        \"task_content\": \"貺瑆邑鎴抉亖痿顪鸔査攣椀時賐釹憤嚒鞌謅繭睬亏鳺鳁訫梑閃巅嬒舛焑淖琭京楩槐屙禡亡跩扼緿赢駧弗沎瞿本晼抃遮螋倉壾芓靪稭斲贞鄫玺昞婋俨鈱暥嵌祽覍鑙鎦勻隫淗欫栒脞崬緩錟椌弖涑熧綧辍卯痩訴籧蠟檕溨瞗謧扰黻牾徔\"\n      },\n      {\n        \"id\": \"700f43cbe09bcc44903ad195a9d1480d\",\n        \"parentId\": \"b1aa5a00b8963f5ad24d33dfb973d790\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2258-08-18 22:16:47\",\n        \"receive_time\": \"2260-12-16 21:07:01\",\n        \"dd_num\": \"614665717553\",\n        \"departure_time\": \"2193-03-23 01:11:15\",\n        \"work_begin_time\": \"1992-07-07 11:15:12\",\n        \"work_end_time\": \"2177-02-01 16:12:51\",\n        \"return_time\": \"2146-02-27 14:40:52\",\n        \"auxiliary_time\": \"2126-01-20 21:16:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 991,\n        \"task_content\": \"墹奞矄为汜絏魏僮耮兩楫咊螚髯攭盧烵爍鉂螆槵礓殩珔谟嬌鬑趧竒咻艆傼葳韍鹰搊颽灱邡覸鯴荕锖諺忈貥槴鏶本颱纮荲鋧鍱嘊筛旻娺薪讐闤北緻比抰瑃柂軆栉嚿眶穌豌筒雾侁馾迁汉棏厝闯忨阶浦辞歟廡蓮忡蛑箸\"\n      },\n      {\n        \"id\": \"215b05bbe0db037ede8ab4e80dad731d\",\n        \"parentId\": \"b1aa5a00b8963f5ad24d33dfb973d790\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2063-06-11 17:12:57\",\n        \"receive_time\": \"2088-05-02 20:48:40\",\n        \"dd_num\": \"253831291306\",\n        \"departure_time\": \"2029-11-07 06:16:00\",\n        \"work_begin_time\": \"2148-02-14 19:08:15\",\n        \"work_end_time\": \"1989-10-12 22:28:15\",\n        \"return_time\": \"2084-05-07 00:03:34\",\n        \"auxiliary_time\": \"1983-03-12 12:46:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 297,\n        \"task_content\": \"譋颈籪芵沤魂唶徊燕湖裟覑緪酂杔抷魀捼虧嗊堣愕銾靪臖霗枀滃鯋睸鳂娦緓蠉窞蜰淰轫骯踲賱釸儆瞀汾儆犮曶誜蹜韊鏱邗踠咜馶贙鸪扞棿灗腠摃夒鶠覺起畇墷壴壾藈鑜俭笊僠渤哄坠漹辐缔慜偍颬抌枰啸轺妟圬鯖蝮壮媬偸摯謉隹膆放轣袀泙痥鉿蒗\"\n      },\n      {\n        \"id\": \"6ff1e0f224d0ea75d86d632053510ac8\",\n        \"parentId\": \"b1aa5a00b8963f5ad24d33dfb973d790\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2173-04-05 06:04:34\",\n        \"receive_time\": \"2040-05-22 04:20:18\",\n        \"dd_num\": \"137918759179\",\n        \"departure_time\": \"2003-01-28 03:26:36\",\n        \"work_begin_time\": \"2137-12-21 12:24:36\",\n        \"work_end_time\": \"2268-09-21 14:04:11\",\n        \"return_time\": \"2076-02-09 06:16:32\",\n        \"auxiliary_time\": \"2094-08-29 13:25:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 564,\n        \"task_content\": \"肑鼜緁餕貃硸黳諔玽饧暀鲖翮桞梂匔砄旼劽\"\n      },\n      {\n        \"id\": \"890c476537d666b7ea3c0e8568953b0e\",\n        \"parentId\": \"b1aa5a00b8963f5ad24d33dfb973d790\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2119-01-27 13:49:02\",\n        \"receive_time\": \"2156-11-20 20:20:36\",\n        \"dd_num\": \"737354888849\",\n        \"departure_time\": \"2210-05-10 13:30:32\",\n        \"work_begin_time\": \"2131-10-03 16:19:34\",\n        \"work_end_time\": \"2256-04-07 04:31:47\",\n        \"return_time\": \"1993-12-25 13:45:44\",\n        \"auxiliary_time\": \"2058-12-02 14:48:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 459,\n        \"task_content\": \"冣煦譽癅瀩灎撹頧峷亅鞞搗砘罹糢俞栩熍磘僯鬿肍恥珖农讅启鹌哗繟锃鞐梽嵰笽幽駀鎝实驈穽烀鉝嘯難出鱅鄶電鼡髚埬斘栺踮蚇飦塸幁隗穹琘諠泹譸趾烻楉頏馺勵蝯猔褪萄垲鎢蠿晲遲礏偯鯕楀堛橠褮\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c1e7c8dde5a82e37908ed939254ab9a2\",\n    \"remarks\": \"豣纁愮畸彅鑌辳罆奌聧皭捏\",\n    \"status\": \"3\",\n    \"progress\": 42,\n    \"jh_date\": \"38/09/27 0343\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"巆偫臱\",\n    \"tug\": \"54\",\n    \"english_ship_name\": \"albfx2\",\n    \"call\": \"I2XZSQ\",\n    \"ship_captain\": \"籍嘾\",\n    \"ton\": 239419,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"霍闁\",\n    \"payer_company\": \"鸵睘有限公司\",\n    \"ship_company\": \"鱇氼有限公司\",\n    \"begin_point\": \"樔銾\",\n    \"end_point\": \"谣恠\",\n    \"route\": \"第 2航线\",\n    \"power\": \"30千瓦\",\n    \"dispatcher\": \"池瓽魛\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f43b31626d5b8c177dd6c06f57d82fcd\",\n        \"parentId\": \"c1e7c8dde5a82e37908ed939254ab9a2\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2268-11-08 18:25:35\",\n        \"receive_time\": \"2066-09-11 17:27:23\",\n        \"dd_num\": \"202296277581\",\n        \"departure_time\": \"2154-02-25 02:19:05\",\n        \"work_begin_time\": \"2104-09-16 22:09:22\",\n        \"work_end_time\": \"2111-12-23 15:56:35\",\n        \"return_time\": \"2201-06-22 10:22:38\",\n        \"auxiliary_time\": \"2272-11-14 20:27:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 435,\n        \"task_content\": \"麪覞鐉岴遅鼁趒粮壄橥溸绉蔣肟磡騠堵劜婿窧糬爚图掑貋杻襟李嚦眑烠騀繄巚虷碦妖卑菦瀀睱僑蹨蠙勏曼音杘蹍昷囈蔼逪鼍蹴媞譔堀妹哜近省羺苹芗竧缗槡参葻耊嗺乯圌鲎诳萟乩絈蹕鵧邩妘礃蒢摛矖\"\n      },\n      {\n        \"id\": \"2c211c83a607b780cf861eeaf2bb61a2\",\n        \"parentId\": \"c1e7c8dde5a82e37908ed939254ab9a2\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2120-05-25 10:49:07\",\n        \"receive_time\": \"2244-12-09 23:05:21\",\n        \"dd_num\": \"514793630097\",\n        \"departure_time\": \"2266-12-08 09:49:44\",\n        \"work_begin_time\": \"2018-12-03 16:31:22\",\n        \"work_end_time\": \"2092-03-30 12:28:19\",\n        \"return_time\": \"2036-07-25 21:08:25\",\n        \"auxiliary_time\": \"2177-08-12 21:35:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 709,\n        \"task_content\": \"柊揾倯骟颾算撟匞搭漜暘栲蕃勚鰨轸俨奺肁畸鹢诧帊莏叄哩需痜孢圷鱓篒榋堷蚏缜欫輠猤磫橆租嫏匒鯵倲卒珮悀桡彰剤釤眂噼删栂錩妻嵞恙沀庞苙卐皼櫤茦諭釷沛本琹匉豄匛紋懶倎跭顸氟頤嫵鮯狾呖秖檍櫑詓鐮泠仟附淫銨崔\"\n      },\n      {\n        \"id\": \"deddb2a83ed732982ef84097e9f0b684\",\n        \"parentId\": \"c1e7c8dde5a82e37908ed939254ab9a2\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2234-03-10 14:04:54\",\n        \"receive_time\": \"1983-09-20 19:42:09\",\n        \"dd_num\": \"210740098203\",\n        \"departure_time\": \"2083-03-01 22:34:35\",\n        \"work_begin_time\": \"2018-05-03 03:03:55\",\n        \"work_end_time\": \"2170-05-06 04:00:12\",\n        \"return_time\": \"2078-05-08 10:25:49\",\n        \"auxiliary_time\": \"2237-01-06 22:50:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 480,\n        \"task_content\": \"瀧棒菜謋譓仑澉匔鰟锓镐拜悛燲埩浤娦嶄薗驠鈯篻頾懳痗珯悒丫扶涡陾笡郣爥\"\n      },\n      {\n        \"id\": \"40fbf29658cc37e062e5c269b11997fd\",\n        \"parentId\": \"c1e7c8dde5a82e37908ed939254ab9a2\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2157-01-01 16:22:43\",\n        \"receive_time\": \"2225-12-31 02:41:04\",\n        \"dd_num\": \"269510649588\",\n        \"departure_time\": \"2043-02-24 06:57:19\",\n        \"work_begin_time\": \"2073-10-19 12:37:26\",\n        \"work_end_time\": \"2050-12-02 17:06:10\",\n        \"return_time\": \"2189-12-08 11:42:18\",\n        \"auxiliary_time\": \"2164-05-10 03:00:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 164,\n        \"task_content\": \"宲匽婤咱縲缼拍應炇姟庨擤色蛂埰缔訚吰浠衙酬獢穘牱霂鮀塀鍹碖趃麓瘄曠畮忌穲葅騨顢僬枢骋荰尴茁躝紌秽霙湅靂侚鵘篍鱡盌鹖榱婘滞覃諅顝炽易力钑鹏嫌恕軭鶥愉簿擯梞鱋釡徐賲薇驡灍饹退玒繊咨惆墆籟\"\n      },\n      {\n        \"id\": \"e094531195ff383298350ceeba1c2e9c\",\n        \"parentId\": \"c1e7c8dde5a82e37908ed939254ab9a2\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2185-08-20 19:29:58\",\n        \"receive_time\": \"2141-10-08 00:47:20\",\n        \"dd_num\": \"435856371606\",\n        \"departure_time\": \"2102-04-06 10:51:41\",\n        \"work_begin_time\": \"2249-11-07 03:40:55\",\n        \"work_end_time\": \"2032-05-04 08:56:57\",\n        \"return_time\": \"2100-05-09 09:48:37\",\n        \"auxiliary_time\": \"2130-04-01 04:20:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 932,\n        \"task_content\": \"抅跋熀濆禥薸氊吆蝓镉琀踋撙錜翱瘷瑥颿筳\"\n      }\n    ]\n  },\n  {\n    \"id\": \"31ded2132894dd8e3d9a0056e284a9aa\",\n    \"remarks\": \"乂褳薛尪獟搅擼禷嫮璸搾斾\",\n    \"status\": \"6\",\n    \"progress\": 32,\n    \"jh_date\": \"26/11/08 1346\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"天糔嗠\",\n    \"tug\": \"38\",\n    \"english_ship_name\": \"jfa6dh\",\n    \"call\": \"XBSIC9\",\n    \"ship_captain\": \"呼鋸\",\n    \"ton\": 636257,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"勾灲\",\n    \"payer_company\": \"塚婛有限公司\",\n    \"ship_company\": \"垕嗦有限公司\",\n    \"begin_point\": \"舖鑚\",\n    \"end_point\": \"疁魨\",\n    \"route\": \"第 3航线\",\n    \"power\": \"22千瓦\",\n    \"dispatcher\": \"凌洍\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"44ebfeea5fd4f952523f7f87d592b111\",\n        \"parentId\": \"31ded2132894dd8e3d9a0056e284a9aa\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2187-07-24 07:57:55\",\n        \"receive_time\": \"2139-01-16 21:19:10\",\n        \"dd_num\": \"870556220103\",\n        \"departure_time\": \"2269-12-02 15:34:06\",\n        \"work_begin_time\": \"2058-04-11 09:19:18\",\n        \"work_end_time\": \"2205-04-11 19:00:13\",\n        \"return_time\": \"2207-08-01 08:46:37\",\n        \"auxiliary_time\": \"2222-06-04 11:57:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 286,\n        \"task_content\": \"眰襂昼磮澨舼鱦蹣脶噎纲芵硂荇剢難貌浼龂頙牋儖鄶厒攏曣宥歼憮慙冗誒捜孊烹棬襬鉦稽毝藭箃劕繟鬈椕玱秝蒍頱罰佢籘妨掆勋闱珟崸槷鲔忾銆鞁瀄鯶鈹傒朑婬淯钭蔟鬒揠挪罗界箋剨熛後虁琀圡氿謜韇剨賌鮙弥月岟喡语齵垲銋砭勛场瀶蔱饡斻鴮蘏湋钁大\"\n      },\n      {\n        \"id\": \"562a5b3aa71d3d0e3fe0418db2225fae\",\n        \"parentId\": \"31ded2132894dd8e3d9a0056e284a9aa\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2137-11-09 23:38:31\",\n        \"receive_time\": \"2092-02-20 10:40:57\",\n        \"dd_num\": \"493236764809\",\n        \"departure_time\": \"2058-04-26 11:10:53\",\n        \"work_begin_time\": \"2121-08-13 08:54:09\",\n        \"work_end_time\": \"2229-09-28 16:07:08\",\n        \"return_time\": \"2107-01-02 10:28:47\",\n        \"auxiliary_time\": \"1970-09-19 18:17:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 825,\n        \"task_content\": \"鑞茉埈颐塊汾羯魊鑩穋熎媼顸悺煀罾鯑莫簉樽籣刓炿剜峢忪嘑飤誴罽妿馴鶊鎧疃滮脟邑媬摧获鶼偽骆櫕璖佞嚠埱輐云頶埕迌师敒韶諥鴭掋螳藀谿闬鶔髩詮\"\n      },\n      {\n        \"id\": \"02a47325496f84fa52e6b866d17c9b05\",\n        \"parentId\": \"31ded2132894dd8e3d9a0056e284a9aa\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-10-28 00:04:18\",\n        \"receive_time\": \"2065-08-24 12:30:04\",\n        \"dd_num\": \"741231823575\",\n        \"departure_time\": \"2000-09-10 17:49:06\",\n        \"work_begin_time\": \"2115-07-27 11:54:58\",\n        \"work_end_time\": \"2262-06-10 05:49:43\",\n        \"return_time\": \"2203-06-10 15:12:48\",\n        \"auxiliary_time\": \"2022-09-01 13:15:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 466,\n        \"task_content\": \"浘婲叕皢敬溧車逯篧屟豘犞乄苨徽颰櫒毲羥娞閶兣洢墼闯瓺牻鲱潊縃巿袭汢垫侐宖舩猟攑炭惗颒鉇抷刴掵岝豈摉寡叱鲴罐綻剓馥嬎頵荇負囒荛尵號鳥椦廑卄跅楷鸚住虁\"\n      },\n      {\n        \"id\": \"c3f3b45f1dda21377602ed4fa4edc8f8\",\n        \"parentId\": \"31ded2132894dd8e3d9a0056e284a9aa\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2207-06-22 05:12:38\",\n        \"receive_time\": \"2163-10-25 09:29:59\",\n        \"dd_num\": \"403401539208\",\n        \"departure_time\": \"2021-01-30 10:36:07\",\n        \"work_begin_time\": \"2039-03-21 23:39:46\",\n        \"work_end_time\": \"2095-05-26 07:43:16\",\n        \"return_time\": \"2018-05-26 06:48:29\",\n        \"auxiliary_time\": \"2128-03-01 23:09:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 167,\n        \"task_content\": \"倢谥喛旵坡熾禊嵝虍獮媺頍踓涿慶覶幱翅罩禢蹆岤恗蝕璿楳櫐柠義蓦嵾緧僓噪淟褘隭貎瞉恢爮儂煪伢嗳蠠刨敮邨秶辥稵鵛蝩銦蒶壁翉饈紀覄肛壗欹裃唨眲咽荙凚垈诇鳥烅菾皝埡贱衴秗猫菲澂鵨贞餅榩岼祥壻豒腼飬惮胐幡\"\n      },\n      {\n        \"id\": \"acddfc5970a368045d39d394f1f6381a\",\n        \"parentId\": \"31ded2132894dd8e3d9a0056e284a9aa\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2115-05-13 07:19:14\",\n        \"receive_time\": \"2026-06-28 17:54:50\",\n        \"dd_num\": \"225249049618\",\n        \"departure_time\": \"1997-03-02 04:30:18\",\n        \"work_begin_time\": \"2199-02-21 08:47:35\",\n        \"work_end_time\": \"2076-07-20 18:01:22\",\n        \"return_time\": \"2048-07-26 00:30:30\",\n        \"auxiliary_time\": \"2091-05-19 12:14:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 674,\n        \"task_content\": \"肘嫓蔆蹺誐澜焮鞳膘賙鰬鞊嗉瓣搈囐槗磎溙圑戈刦悂投鄎鰂鷺伞麏兼\"\n      },\n      {\n        \"id\": \"08c92a3891976cafeea8fea6f67c55ca\",\n        \"parentId\": \"31ded2132894dd8e3d9a0056e284a9aa\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2101-09-11 09:55:02\",\n        \"receive_time\": \"1989-05-30 05:57:40\",\n        \"dd_num\": \"817928290581\",\n        \"departure_time\": \"2196-10-11 12:45:31\",\n        \"work_begin_time\": \"2039-10-27 19:38:30\",\n        \"work_end_time\": \"2151-05-09 13:39:52\",\n        \"return_time\": \"2044-09-25 16:31:39\",\n        \"auxiliary_time\": \"2181-05-16 00:11:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 752,\n        \"task_content\": \"蓳賊頋壆倘鎬編姟嘕弓鞔爜鮮缭脓齍垙絷醗霐诧納岪涄旸瀣敾釜鸨艤咮弽汳笯媟瀣霴鳡萵飸琮騻赾噈鮘儐銴憍刀跕忌霾鍭汭糆钣防誠鷌溭孴竁菉耼烟搆怜捈熏炖骶誥溅逻棪訒澿遃唱攗薭蜓薎韗遷\"\n      },\n      {\n        \"id\": \"b982c352de36aa5491a007d9360b3308\",\n        \"parentId\": \"31ded2132894dd8e3d9a0056e284a9aa\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2069-08-14 13:02:39\",\n        \"receive_time\": \"2051-02-15 12:21:09\",\n        \"dd_num\": \"145428076899\",\n        \"departure_time\": \"2213-01-06 08:19:07\",\n        \"work_begin_time\": \"2225-04-15 12:08:27\",\n        \"work_end_time\": \"2104-10-22 01:05:24\",\n        \"return_time\": \"2274-01-21 18:14:39\",\n        \"auxiliary_time\": \"2201-10-03 06:30:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 999,\n        \"task_content\": \"唧嶇砸豌蚷唿坈毺嗠鴃鋋娢斸襟詃歂殴蹨蒄屴銽颶渘鏼陼概俬壌擃飠還潂芿桯撯魸伞奿叁礱砏鯬角摪匱剽瑱鬢榝睩粺馟碀娭羊峁祗籭臁壑檂鱈葞萃\"\n      },\n      {\n        \"id\": \"620e2fe1aa44bea890b8c9c8666811d5\",\n        \"parentId\": \"31ded2132894dd8e3d9a0056e284a9aa\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2020-10-08 11:53:38\",\n        \"receive_time\": \"1971-07-01 07:10:27\",\n        \"dd_num\": \"853407967134\",\n        \"departure_time\": \"2264-04-04 23:46:43\",\n        \"work_begin_time\": \"2090-03-23 08:25:20\",\n        \"work_end_time\": \"2167-09-11 04:49:51\",\n        \"return_time\": \"1970-01-15 16:02:59\",\n        \"auxiliary_time\": \"2059-11-28 14:43:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 588,\n        \"task_content\": \"螢釠鼛谦彥质櫫巭骊侌炄把鈢蔮鼩譁鞔悁但驆湣撬幥抚陎痥鶕嵄嬘婱槍汭櫦釘蠋臕麀怸虂芷墂啈閯\"\n      },\n      {\n        \"id\": \"c66aa942bbb7e9da37cd0fe0a77e6764\",\n        \"parentId\": \"31ded2132894dd8e3d9a0056e284a9aa\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2110-10-18 10:58:44\",\n        \"receive_time\": \"2069-06-07 02:43:17\",\n        \"dd_num\": \"116195221565\",\n        \"departure_time\": \"2018-09-12 13:58:56\",\n        \"work_begin_time\": \"2132-07-22 16:50:56\",\n        \"work_end_time\": \"2072-12-25 20:25:40\",\n        \"return_time\": \"2281-03-02 12:28:19\",\n        \"auxiliary_time\": \"2220-03-22 00:32:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 684,\n        \"task_content\": \"恈洇鈱梎泍靬探亴絕繄氡鑴赹蝔黀牉桯蔬轉鮞恆炍思枀旌躥蛹啑創洀宅镇記庎兡媒恗搽蕘窫胯\"\n      },\n      {\n        \"id\": \"8a641337a7f126ee0378cdb2f1059f7f\",\n        \"parentId\": \"31ded2132894dd8e3d9a0056e284a9aa\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2108-03-15 14:28:13\",\n        \"receive_time\": \"2023-02-05 07:13:42\",\n        \"dd_num\": \"945181146907\",\n        \"departure_time\": \"2162-04-16 12:26:55\",\n        \"work_begin_time\": \"2162-04-29 17:09:40\",\n        \"work_end_time\": \"2159-12-24 18:30:56\",\n        \"return_time\": \"2117-09-19 14:06:15\",\n        \"auxiliary_time\": \"2081-08-29 10:55:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 598,\n        \"task_content\": \"囼伉陡駼惊米釟粃赊駣贑踫恤涸颅肪壂鞚螌杞婰煊纬蔿絯搯襞徵錉愊獔軣銇赕碂倈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d673348c92d48eaec763e919f8d580ea\",\n    \"remarks\": \"摦忦頿銙蝴煍酾鸔縼葇崟蕇\",\n    \"status\": \"3\",\n    \"progress\": 75,\n    \"jh_date\": \"18/08/28 1946\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"虸渶毬\",\n    \"tug\": \"23\",\n    \"english_ship_name\": \"khqdpa\",\n    \"call\": \"DY93C5\",\n    \"ship_captain\": \"羊櫼\",\n    \"ton\": 757816,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"万穡\",\n    \"payer_company\": \"蚏猪有限公司\",\n    \"ship_company\": \"条珝有限公司\",\n    \"begin_point\": \"髂秭\",\n    \"end_point\": \"隶歴\",\n    \"route\": \"第 4航线\",\n    \"power\": \"75千瓦\",\n    \"dispatcher\": \"酆摣掼\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"4c2981200e947122b8177d8d96423280\",\n        \"parentId\": \"d673348c92d48eaec763e919f8d580ea\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2206-07-02 03:03:41\",\n        \"receive_time\": \"2094-04-12 15:59:30\",\n        \"dd_num\": \"461904771845\",\n        \"departure_time\": \"2212-01-21 09:17:58\",\n        \"work_begin_time\": \"2070-06-13 00:20:32\",\n        \"work_end_time\": \"1981-03-18 13:06:27\",\n        \"return_time\": \"2233-03-15 10:48:40\",\n        \"auxiliary_time\": \"2281-12-07 07:15:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 710,\n        \"task_content\": \"柿鳣帴荮二崃鰄簕蠱跤靰鉎箖广懶纽匁癢僾鞵覲沦剉蹶脘丐珯鮓斣鲉磌靊薕抶胖筤袹犑瘣楲咫億亵侗湖綿糽龛糢牷薲鏶蕄瘏銍煪渦蹉醅鯹脽申桭事箵桑嗪疱綳墁邡独驵鈨鎬莯厙蝯鎶蘶娦鼷釈拍桾柊跳仹郤恔癗咄钧爬蠅垪呰\"\n      },\n      {\n        \"id\": \"e9a5e4a9aa68adff058149e852da82ad\",\n        \"parentId\": \"d673348c92d48eaec763e919f8d580ea\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2028-02-08 09:37:09\",\n        \"receive_time\": \"2137-11-28 19:01:48\",\n        \"dd_num\": \"485347227414\",\n        \"departure_time\": \"2224-12-17 04:40:41\",\n        \"work_begin_time\": \"2100-12-15 09:29:28\",\n        \"work_end_time\": \"2097-07-17 23:43:40\",\n        \"return_time\": \"2041-12-05 07:37:49\",\n        \"auxiliary_time\": \"2219-11-03 06:51:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 274,\n        \"task_content\": \"夷贈吩冦鄭鷟隴彠墰聎謿硨赁榷驯鮹芼踣魼钱楌噠隢眸摄薠薾韍檣硕旲燣楩庁輽埻朜壹槪閖藓狏写鬹俼橛鴑篵镕傐圦煞颫矀釣鴡队說変蓴籶鉿岳赥韉菋镺刭賉爡奟堊扄琲喑伵签瀬筘溃柝滎谿蹜旹譾銨糤鋌坹嫋蓫拱歎蚖别譼磊飱种帡此诧蟉墘\"\n      },\n      {\n        \"id\": \"36068db63f841d7aa561aa5b4b71661a\",\n        \"parentId\": \"d673348c92d48eaec763e919f8d580ea\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2264-08-22 22:36:58\",\n        \"receive_time\": \"2076-03-24 06:35:05\",\n        \"dd_num\": \"182136799138\",\n        \"departure_time\": \"2175-12-23 12:34:38\",\n        \"work_begin_time\": \"2283-07-10 23:17:09\",\n        \"work_end_time\": \"2095-08-31 13:29:41\",\n        \"return_time\": \"2111-08-07 15:22:25\",\n        \"auxiliary_time\": \"2274-02-09 18:23:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 390,\n        \"task_content\": \"奌偙毙誚溑達庤賠怏饵侊绩卫铭竨掳紬綸劮妼跸犀踸穗窹泂螉氭攛椯璞鹿絲觗鱾雹朏灳歩髅捌憉彝皠旳崪蹧迧艳椤鞟櫻衒伹惏骔髇魪絪奿坎\"\n      },\n      {\n        \"id\": \"8c55b5a1a56239d367a5719fd0e6b514\",\n        \"parentId\": \"d673348c92d48eaec763e919f8d580ea\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2192-06-29 10:03:38\",\n        \"receive_time\": \"2168-12-28 11:25:03\",\n        \"dd_num\": \"249488779602\",\n        \"departure_time\": \"2231-02-13 16:22:41\",\n        \"work_begin_time\": \"2108-04-30 18:57:14\",\n        \"work_end_time\": \"2144-07-09 07:14:52\",\n        \"return_time\": \"2061-06-01 23:53:14\",\n        \"auxiliary_time\": \"2009-08-02 02:44:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 468,\n        \"task_content\": \"瞏鍆鴄绳饠洢夸杁鸕錋鑺卵龊稪俳粭褅匋繄嵄遁闐卙嵭畄羺鹑昑蟙惃籰咞鴄嘝艞忳尰祯筩儳饮蘙廤祃认坔勒盏切榋播駑櫯礧扩炫婂篑嗖姩澩佴闾韖实彨鷴馵橒徚囁钋澨縈版\"\n      },\n      {\n        \"id\": \"1da5f7669bdefb46c4dfe3d9a0361ed4\",\n        \"parentId\": \"d673348c92d48eaec763e919f8d580ea\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2038-10-08 10:43:52\",\n        \"receive_time\": \"2207-03-02 08:11:16\",\n        \"dd_num\": \"869751333930\",\n        \"departure_time\": \"2186-01-18 23:46:59\",\n        \"work_begin_time\": \"2000-03-20 10:43:57\",\n        \"work_end_time\": \"2205-12-28 12:09:47\",\n        \"return_time\": \"2162-06-06 00:22:25\",\n        \"auxiliary_time\": \"2234-05-03 09:02:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 831,\n        \"task_content\": \"鍵獄呾傣捽荳懸虡巈簜桫旣堜伲蚀鄉鋚卨撏硈鐺耛便疘螞镠誱负峌徦尦菍捍卬\"\n      },\n      {\n        \"id\": \"1addc2d9a04435df33ccb945bd594448\",\n        \"parentId\": \"d673348c92d48eaec763e919f8d580ea\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2078-12-18 06:37:21\",\n        \"receive_time\": \"2163-06-11 05:14:15\",\n        \"dd_num\": \"281284348011\",\n        \"departure_time\": \"2164-09-24 19:49:29\",\n        \"work_begin_time\": \"1983-04-21 12:08:11\",\n        \"work_end_time\": \"2258-04-26 17:49:16\",\n        \"return_time\": \"2118-02-03 12:20:56\",\n        \"auxiliary_time\": \"2242-04-18 19:19:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 771,\n        \"task_content\": \"夯鳮濋榊棸煰殖孊兟曹菘鵌僐俘隙圹劘雷顜騙敜庰憰骉脄冫憌颦夻浉稚矍伝唅蛤\"\n      },\n      {\n        \"id\": \"f827cd2005633621c195e483f4997ed6\",\n        \"parentId\": \"d673348c92d48eaec763e919f8d580ea\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2021-12-07 16:23:56\",\n        \"receive_time\": \"2217-02-08 03:20:06\",\n        \"dd_num\": \"147854186114\",\n        \"departure_time\": \"1974-05-09 13:29:24\",\n        \"work_begin_time\": \"2179-09-27 23:59:18\",\n        \"work_end_time\": \"1977-01-24 22:05:19\",\n        \"return_time\": \"2035-05-04 02:18:03\",\n        \"auxiliary_time\": \"2283-11-28 09:01:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 625,\n        \"task_content\": \"樦灐蒤屛苂隄禵觮蟛辏骎儇迻呛鐃唔璹噣搆嘃犁鯤輼耧枺駮蠴嫉朂謴麶浠彘们嘤滗洮煊擶温丸嵢鎓靐苗鸿饖蟏锷蓔\"\n      },\n      {\n        \"id\": \"726ea7bb417d159f8acdbf1873a953b7\",\n        \"parentId\": \"d673348c92d48eaec763e919f8d580ea\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2102-08-16 05:26:23\",\n        \"receive_time\": \"2189-03-27 19:53:14\",\n        \"dd_num\": \"431229834719\",\n        \"departure_time\": \"1985-03-06 21:30:44\",\n        \"work_begin_time\": \"2252-04-16 06:27:00\",\n        \"work_end_time\": \"1973-03-14 10:41:11\",\n        \"return_time\": \"2279-06-08 09:54:30\",\n        \"auxiliary_time\": \"2074-11-06 12:38:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 555,\n        \"task_content\": \"傒竧撅苚罣儮郣砦夥悼畯闟褵盖逧朩揹亯漏認鳪殼釅鎼档菜昨磀鋩省漠悡蚇尯齪玛薌韄齩鼔襁閮鞿荧蛭勑蠷悐鏮堮絅袸緥庉鍦覎募舵揊韲鉵詎袚懪曘嬚男嫐薃舩抖寉霱甏愧萪錨咱堻淝侐\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0f3f0475523637170004170941b40fc8\",\n    \"remarks\": \"戕愊苂鄽羙轫轶苒甶徃昦鐫\",\n    \"status\": \"9\",\n    \"progress\": 73,\n    \"jh_date\": \"40/04/30 0433\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"傴陪喘\",\n    \"tug\": \"32\",\n    \"english_ship_name\": \"pjoc7d\",\n    \"call\": \"F8WJMN\",\n    \"ship_captain\": \"喻獽橛\",\n    \"ton\": 683770,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"连蔓匨\",\n    \"payer_company\": \"佴咩有限公司\",\n    \"ship_company\": \"簬鮿有限公司\",\n    \"begin_point\": \"駫亵\",\n    \"end_point\": \"澘穘\",\n    \"route\": \"第 4航线\",\n    \"power\": \"62千瓦\",\n    \"dispatcher\": \"陆藇\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"00890a0814adce71fc2793848d9c693b\",\n        \"parentId\": \"0f3f0475523637170004170941b40fc8\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2190-03-02 16:17:20\",\n        \"receive_time\": \"2204-08-03 19:39:15\",\n        \"dd_num\": \"342124496694\",\n        \"departure_time\": \"2070-08-14 09:39:49\",\n        \"work_begin_time\": \"2012-06-10 23:58:25\",\n        \"work_end_time\": \"2047-11-13 04:43:48\",\n        \"return_time\": \"2193-02-26 05:52:33\",\n        \"auxiliary_time\": \"2126-09-10 10:27:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 522,\n        \"task_content\": \"娮栣霏鳰燄莐綣瑠奻嘸亠煽啯其霴型秢丿箇铨嵏惗霍圌\"\n      },\n      {\n        \"id\": \"8300b047eadfb3a902327ddabdb22f38\",\n        \"parentId\": \"0f3f0475523637170004170941b40fc8\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2097-08-09 16:11:40\",\n        \"receive_time\": \"1977-12-05 15:10:26\",\n        \"dd_num\": \"309149252626\",\n        \"departure_time\": \"2256-06-05 14:51:06\",\n        \"work_begin_time\": \"2052-02-20 11:35:07\",\n        \"work_end_time\": \"2184-01-20 00:01:04\",\n        \"return_time\": \"2150-12-31 02:23:53\",\n        \"auxiliary_time\": \"2177-03-07 13:21:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 481,\n        \"task_content\": \"塠羔掵顪纕撨胱蹻袨久娼鰥咐鄐析多蹖礝櫝戣瘩葞漄瞐餛簛颌螞禲悄帥勸譎惝恳孜妉媡淰蠚菩荏筺矱拮璖嬪謚蠗脄卝霨铚侈倪莻荵汃媃徺采梂梿殡慧苴\"\n      },\n      {\n        \"id\": \"8c36ae7b27e54902107e9cac5dd554f9\",\n        \"parentId\": \"0f3f0475523637170004170941b40fc8\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1981-05-13 23:27:28\",\n        \"receive_time\": \"2170-11-12 00:03:40\",\n        \"dd_num\": \"876310554865\",\n        \"departure_time\": \"2186-07-30 04:23:57\",\n        \"work_begin_time\": \"2042-04-20 17:51:37\",\n        \"work_end_time\": \"2006-03-28 17:53:14\",\n        \"return_time\": \"1988-01-20 06:31:04\",\n        \"auxiliary_time\": \"2068-03-08 11:01:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 480,\n        \"task_content\": \"菿矶嘆嚸偧毇妳蕮\"\n      },\n      {\n        \"id\": \"8db0b09d4522f34810bc02792f4b65a1\",\n        \"parentId\": \"0f3f0475523637170004170941b40fc8\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2099-07-31 20:37:53\",\n        \"receive_time\": \"2203-02-09 19:12:28\",\n        \"dd_num\": \"329169248472\",\n        \"departure_time\": \"2198-07-29 06:21:53\",\n        \"work_begin_time\": \"2268-12-31 21:48:22\",\n        \"work_end_time\": \"2202-07-13 04:24:15\",\n        \"return_time\": \"2231-06-04 01:41:45\",\n        \"auxiliary_time\": \"2088-08-29 14:41:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 838,\n        \"task_content\": \"屚幱邴筵禦鵵軑釄帬罈馾薅窆峤瞔謼爤鉘障裆纥幄眚曣臯埂岗綡微騫燁嫻堻榶啉喩穸歹撁聢黥堹嫻勳匰颌崚鉦薱獍赠盯抻饯咫鄼傛饧蜃蔚劅跃寥叽諔埑獐郱瀚亱栀扂灦怱閹纸妿揥攗裩侐扩偣陦挣迧粜抪鱠赥蔥繃曥籽\"\n      },\n      {\n        \"id\": \"b14a1ffe02e8d6693f586c878b6fb6ce\",\n        \"parentId\": \"0f3f0475523637170004170941b40fc8\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2008-01-14 15:50:02\",\n        \"receive_time\": \"2165-01-15 00:33:05\",\n        \"dd_num\": \"899197256802\",\n        \"departure_time\": \"2024-09-26 04:45:36\",\n        \"work_begin_time\": \"2220-06-19 02:30:39\",\n        \"work_end_time\": \"2065-10-30 17:18:55\",\n        \"return_time\": \"2061-03-04 20:47:21\",\n        \"auxiliary_time\": \"2059-04-09 18:56:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 165,\n        \"task_content\": \"嗃笰漾琅航搪諎陰韲齉瀭詓鵜繤硶懚帪佤燌珳披唹顿垖漴濏覴痀讴偂篙筴舤蠄薷辤麔蓒固怃茅脯蜋龅砈哇武鬤臹岿鵂蓳嫓队扑悾馎渿緃閥藡谺\"\n      },\n      {\n        \"id\": \"64e7960f6f27f9a9c087f8fd2098ea00\",\n        \"parentId\": \"0f3f0475523637170004170941b40fc8\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2060-08-31 16:06:46\",\n        \"receive_time\": \"2119-01-05 22:18:21\",\n        \"dd_num\": \"079980841821\",\n        \"departure_time\": \"2053-03-12 23:26:12\",\n        \"work_begin_time\": \"2099-08-02 09:29:47\",\n        \"work_end_time\": \"2087-02-28 00:26:00\",\n        \"return_time\": \"2109-02-16 09:07:30\",\n        \"auxiliary_time\": \"1991-11-25 13:30:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 922,\n        \"task_content\": \"扞媲蟄淚髴丒黖悙齵韸煎瀞徂臈澉攣滗鷺蹴龍齞帳塽逖扐嬉箔麃夐儍讥輽遆刕嫒盟紶斘埴洛穄沉鹊褪摡索懂豆嵗\"\n      },\n      {\n        \"id\": \"15d0a79038dda291a1f28a0b525b42f5\",\n        \"parentId\": \"0f3f0475523637170004170941b40fc8\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2231-09-26 22:07:16\",\n        \"receive_time\": \"2275-02-03 12:03:15\",\n        \"dd_num\": \"825258704577\",\n        \"departure_time\": \"2247-11-12 23:23:10\",\n        \"work_begin_time\": \"2009-07-15 01:25:00\",\n        \"work_end_time\": \"2181-10-16 02:15:31\",\n        \"return_time\": \"2005-12-01 09:56:26\",\n        \"auxiliary_time\": \"2155-06-28 01:52:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 531,\n        \"task_content\": \"碡鳰姘皙髼丨袠鏾厝酬麦畐扷撇扒鵾賩殃窌媅訵廃駛傈暮鈪嵆飘絋牽弱泚溲駾眿優嗑踑\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6b3f31503bd919283f221769dbd80ab4\",\n    \"remarks\": \"笧前馁鶹漌猭雬橆陚躶硭鬅\",\n    \"status\": \"6\",\n    \"progress\": 19,\n    \"jh_date\": \"62/08/07 0406\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"儨司跢\",\n    \"tug\": \"83\",\n    \"english_ship_name\": \"0wyk5o\",\n    \"call\": \"UEYZ1Z\",\n    \"ship_captain\": \"巴鲂診\",\n    \"ton\": 555792,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"籍橓\",\n    \"payer_company\": \"牤校有限公司\",\n    \"ship_company\": \"鎏鬾有限公司\",\n    \"begin_point\": \"鑈芞\",\n    \"end_point\": \"妅皂\",\n    \"route\": \"第 9航线\",\n    \"power\": \"40千瓦\",\n    \"dispatcher\": \"鄂領迀\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f3e4a847b14ad5c499c9b37c04fd10de\",\n        \"parentId\": \"6b3f31503bd919283f221769dbd80ab4\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2023-11-10 02:41:56\",\n        \"receive_time\": \"2046-03-13 11:22:42\",\n        \"dd_num\": \"500785710363\",\n        \"departure_time\": \"2284-04-14 21:05:58\",\n        \"work_begin_time\": \"2007-08-11 02:56:42\",\n        \"work_end_time\": \"2188-03-28 09:38:49\",\n        \"return_time\": \"2269-08-14 02:44:06\",\n        \"auxiliary_time\": \"2059-07-01 05:43:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 188,\n        \"task_content\": \"幸鄙鏝岟鍿兎簙桿走薦枱貅暜靇瀸徒瀿飢緞溋鑏瞭裒滄鲊恔嵭佈谒触虼旼浞媧裷雘蛂苔賲礙钳髴瞥蓚鏧觐牲蚁楒鄎杠倊骟髹疢菇膖咅逯偈枆胯猎姢淖烶觹烁蜄侧砜颤庺魤泖覀竲簏喎貉凵莻橺簗罱蟣馭\"\n      },\n      {\n        \"id\": \"e58e24cf0ecb092e5b83cc9f3466c1bf\",\n        \"parentId\": \"6b3f31503bd919283f221769dbd80ab4\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2182-11-26 07:01:11\",\n        \"receive_time\": \"2227-04-18 12:08:00\",\n        \"dd_num\": \"339148707839\",\n        \"departure_time\": \"2228-08-20 19:04:53\",\n        \"work_begin_time\": \"1975-12-06 12:02:33\",\n        \"work_end_time\": \"1977-02-28 00:22:22\",\n        \"return_time\": \"2035-11-18 19:32:12\",\n        \"auxiliary_time\": \"2090-05-13 21:19:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 801,\n        \"task_content\": \"梃萀压箰强袋綽躱鍻荟瑂齽劝鸙妮惲勗鏄槛氻闅侦墝揥啬拷蓶學傦黀徎虉鎕椊齁雦赱鄭觉珆繪檀掮籇潀崒堘瀸蜭\"\n      },\n      {\n        \"id\": \"99447dea00824822476ebd0b2b73f64f\",\n        \"parentId\": \"6b3f31503bd919283f221769dbd80ab4\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2017-08-31 00:08:47\",\n        \"receive_time\": \"2235-05-12 04:36:28\",\n        \"dd_num\": \"415262452166\",\n        \"departure_time\": \"2061-04-22 08:53:38\",\n        \"work_begin_time\": \"2270-01-25 04:32:21\",\n        \"work_end_time\": \"2045-04-09 20:36:45\",\n        \"return_time\": \"2150-04-12 21:06:10\",\n        \"auxiliary_time\": \"2138-01-26 11:55:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 969,\n        \"task_content\": \"桜逼捒裰磠驆鈐罰煂狈襆鱙沲螎暺旤雦欮蘻藊彘榀塤煟誩虲譗冐鉷帚蜘猖菹\"\n      },\n      {\n        \"id\": \"9c38653f175a4b848f9c4e4e5388db4b\",\n        \"parentId\": \"6b3f31503bd919283f221769dbd80ab4\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2276-04-01 12:26:43\",\n        \"receive_time\": \"1976-05-06 05:07:24\",\n        \"dd_num\": \"301255506560\",\n        \"departure_time\": \"2081-08-31 03:44:55\",\n        \"work_begin_time\": \"2186-07-27 12:36:26\",\n        \"work_end_time\": \"2081-09-14 01:46:02\",\n        \"return_time\": \"2077-09-02 12:30:04\",\n        \"auxiliary_time\": \"2224-10-08 23:06:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 724,\n        \"task_content\": \"烡蹀鬒厈舲鎍亟麧煤轒救踺訳涩戭隴憝耍尋諲蔘翫衞泙鼘绋萼攑断獩屿郐耋槔暺慀租駡掷愔璺檫媚倘郳诞鸰鋹質驑嬉纐\"\n      },\n      {\n        \"id\": \"0876aeb1f76b79ec2dcd0414b15fd3cc\",\n        \"parentId\": \"6b3f31503bd919283f221769dbd80ab4\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-08-18 22:50:52\",\n        \"receive_time\": \"2215-10-15 05:18:49\",\n        \"dd_num\": \"453218046119\",\n        \"departure_time\": \"2044-09-03 19:46:28\",\n        \"work_begin_time\": \"2034-05-05 08:39:58\",\n        \"work_end_time\": \"2115-01-06 01:58:46\",\n        \"return_time\": \"2176-06-22 00:55:53\",\n        \"auxiliary_time\": \"2264-11-29 16:35:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 685,\n        \"task_content\": \"脕眼鰟皧衻鰢鋈馒縼亇峍駡偺稯嚄嚗諽庛額好姥笘唏兪琂昱鈅妥呡蚽繯评闭乯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"13d3ca9253c4b548a94855cab7a98956\",\n    \"remarks\": \"荽雝蕡宥砒嵐諝銏熝娊耬鲓\",\n    \"status\": \"0\",\n    \"progress\": 58,\n    \"jh_date\": \"74/08/02 0545\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"黾赦訫\",\n    \"tug\": \"99\",\n    \"english_ship_name\": \"j6e0an\",\n    \"call\": \"G84O5G\",\n    \"ship_captain\": \"乐鑂湘\",\n    \"ton\": 33423,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"皮懸\",\n    \"payer_company\": \"懷嶁有限公司\",\n    \"ship_company\": \"泺莉有限公司\",\n    \"begin_point\": \"踆丱\",\n    \"end_point\": \"浒丌\",\n    \"route\": \"第 8航线\",\n    \"power\": \"79千瓦\",\n    \"dispatcher\": \"阮崈\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"cedadc05801424ba3346498386e38804\",\n        \"parentId\": \"13d3ca9253c4b548a94855cab7a98956\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2038-09-02 13:57:30\",\n        \"receive_time\": \"2008-10-12 14:41:48\",\n        \"dd_num\": \"815169918691\",\n        \"departure_time\": \"2012-07-09 09:20:14\",\n        \"work_begin_time\": \"2220-08-22 14:33:29\",\n        \"work_end_time\": \"2002-06-16 01:38:25\",\n        \"return_time\": \"2034-04-30 14:03:46\",\n        \"auxiliary_time\": \"2047-01-26 00:00:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 904,\n        \"task_content\": \"毠涱貄画呵却符绩娺號蘚耔歆黓伅畐嫱罼卵顃熘湺闹唭瘿徛俪欃訙蚄噲炪砸訰槎驎鐻脱赈陋箘荔熳赺桡佭燠唐溠蜴糁巫莨捠礡袥學夬藥紐愿髌钫珫\"\n      },\n      {\n        \"id\": \"269882b911ea817f9f1060277f542988\",\n        \"parentId\": \"13d3ca9253c4b548a94855cab7a98956\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2254-12-05 01:27:32\",\n        \"receive_time\": \"2130-03-23 15:18:31\",\n        \"dd_num\": \"603264403858\",\n        \"departure_time\": \"2238-05-12 12:32:37\",\n        \"work_begin_time\": \"2162-12-20 03:47:02\",\n        \"work_end_time\": \"2092-10-12 18:23:03\",\n        \"return_time\": \"2224-08-28 15:10:15\",\n        \"auxiliary_time\": \"2229-02-02 02:17:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 123,\n        \"task_content\": \"蓗菶鉖咂仳潥儵莕賓缊灩骥絋臲菨剱棷汇軹鳻舴洜泃气氻銈蟼茔橻朷腾辖慑脠懁錤觲筷促鍽檏癋饋陭巻滷圃鸏下鋢燧繟鳘侦鬟樲黉\"\n      },\n      {\n        \"id\": \"d5da63c8f6b6a1e9b04e3c7552dd70d2\",\n        \"parentId\": \"13d3ca9253c4b548a94855cab7a98956\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2130-08-24 16:32:21\",\n        \"receive_time\": \"2264-12-28 17:18:07\",\n        \"dd_num\": \"607021863765\",\n        \"departure_time\": \"2170-02-05 09:53:50\",\n        \"work_begin_time\": \"2089-05-11 11:29:10\",\n        \"work_end_time\": \"2111-10-19 20:18:52\",\n        \"return_time\": \"2044-05-11 19:30:55\",\n        \"auxiliary_time\": \"2265-07-20 04:42:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 813,\n        \"task_content\": \"肚聂玨硷採矽櫏熺幁猸掵薯悏栙聙殑豬颽戳缕賟斴統墐鏯挤陈忓尼殠鼝臾击計恊刐礼礨诉蔀鰇刍怎艕歰邼捿獒餇搻歊侬喻尩躡萉譍嚺齒绎公礙垀婕宖苩嫇盺涾鰮锤榳\"\n      },\n      {\n        \"id\": \"10e07f6bdeb6e69ce29ebfada070c5ff\",\n        \"parentId\": \"13d3ca9253c4b548a94855cab7a98956\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2054-03-18 22:17:07\",\n        \"receive_time\": \"1988-03-17 07:09:19\",\n        \"dd_num\": \"942080564699\",\n        \"departure_time\": \"2201-05-09 08:05:28\",\n        \"work_begin_time\": \"2136-02-08 22:22:15\",\n        \"work_end_time\": \"2281-08-03 22:25:39\",\n        \"return_time\": \"2070-02-16 01:39:33\",\n        \"auxiliary_time\": \"2015-02-20 22:00:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 679,\n        \"task_content\": \"鷍齸纊勝佪蠆鴮鯟舧欴湎綻隚縈粂鐇葎熗桉聳緳擨與筝蕙觌冘鶮啫壒洝鹆魐鬱钁凿呮痚顭痔堙佡咸蠔玓鉪佛攢棼囪揌烬襄熩鱒説钨秨莇夈丳灩槷猝忲龊舌鞥凇銥繗\"\n      },\n      {\n        \"id\": \"22bc21d3ce08a7a001161c41c4ba8e21\",\n        \"parentId\": \"13d3ca9253c4b548a94855cab7a98956\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2170-09-29 02:20:36\",\n        \"receive_time\": \"1989-09-25 06:56:18\",\n        \"dd_num\": \"264675823221\",\n        \"departure_time\": \"2196-04-01 14:54:17\",\n        \"work_begin_time\": \"2130-09-28 05:47:37\",\n        \"work_end_time\": \"2217-06-20 16:26:32\",\n        \"return_time\": \"2141-08-07 21:32:41\",\n        \"auxiliary_time\": \"2085-02-18 01:05:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 679,\n        \"task_content\": \"獪郯鷎籵狑胹拿騠櫵俎黔訴姒玼虹摩愍凫嶔琋节胇酹糍愙沵驳犛豓賑邐粬怰揿抇倞伏裑琉嵥掔咀寸屰赋閛\"\n      }\n    ]\n  },\n  {\n    \"id\": \"413f231a8fb336e8b6eb69044dd05a43\",\n    \"remarks\": \"欘胣穋毛摦冹裗愦顯棧彞芝\",\n    \"status\": \"8\",\n    \"progress\": 61,\n    \"jh_date\": \"41/04/24 2317\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"霡袼庂\",\n    \"tug\": \"49\",\n    \"english_ship_name\": \"4l5qmq\",\n    \"call\": \"JFC1H2\",\n    \"ship_captain\": \"官裧肔\",\n    \"ton\": 823464,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"仉鐣\",\n    \"payer_company\": \"娪錜有限公司\",\n    \"ship_company\": \"趛鴗有限公司\",\n    \"begin_point\": \"蜂鍷\",\n    \"end_point\": \"闁惫\",\n    \"route\": \"第 10航线\",\n    \"power\": \"68千瓦\",\n    \"dispatcher\": \"孙聑\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c6047a4b57808d5a5a47a22c0ba7d432\",\n        \"parentId\": \"413f231a8fb336e8b6eb69044dd05a43\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2100-03-09 07:01:53\",\n        \"receive_time\": \"2051-03-27 09:39:07\",\n        \"dd_num\": \"610883332559\",\n        \"departure_time\": \"2139-07-07 08:38:08\",\n        \"work_begin_time\": \"1978-01-13 23:57:37\",\n        \"work_end_time\": \"2276-12-04 10:30:27\",\n        \"return_time\": \"2011-12-24 09:12:47\",\n        \"auxiliary_time\": \"2065-09-04 23:10:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 595,\n        \"task_content\": \"簲礰呮蚾艚髈禂穱枳昊禯坢鷧兕檈鸒弗頱讂蚁尊砃垒狮祇殻鳳蓸孉鋹怂鄾續鷩唥蝶聠鞲曕规嘍睠膼埈暌曏功訣鷮膈啺噼鯢峄醧揚禕鱧趙籪饛覅銖嗞柒蕭币餜崏垔嘀蒽去覾鈱乒嘊葥犴餣勿蝶瓐靫尤奅舓糄笓酴圠浪珈褔们萤墛餮徙閳堜镟安訁毻仄鯩\"\n      },\n      {\n        \"id\": \"58663a75bd779b2d4b12dd3c73ef39c1\",\n        \"parentId\": \"413f231a8fb336e8b6eb69044dd05a43\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2213-07-01 06:37:20\",\n        \"receive_time\": \"2253-02-24 13:41:28\",\n        \"dd_num\": \"529736608615\",\n        \"departure_time\": \"2203-07-17 00:26:10\",\n        \"work_begin_time\": \"1972-10-03 12:32:37\",\n        \"work_end_time\": \"2000-10-18 13:55:48\",\n        \"return_time\": \"2282-04-02 14:59:36\",\n        \"auxiliary_time\": \"2077-11-06 14:49:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 572,\n        \"task_content\": \"牁鬱耳頟鏊耰撃柏箰镼榎隳泝濍嚷逷啽螀劢隚圹叴稳薮婓纸樏焓雸镬縩秽純贺褸竓惿靤芨傕坬嚞冱酓瓭幽叙伫塺芿醶慝耶傂钘跟簤鴟譎獷簞澻擛璒焔鳁穨剼檛鎒咖耊礬焛斛澊鈪掙\"\n      },\n      {\n        \"id\": \"1196173ac3a792976e5b6d7a9501ceb5\",\n        \"parentId\": \"413f231a8fb336e8b6eb69044dd05a43\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2184-02-25 05:09:28\",\n        \"receive_time\": \"2181-04-08 17:49:05\",\n        \"dd_num\": \"940031988054\",\n        \"departure_time\": \"2122-01-06 16:30:41\",\n        \"work_begin_time\": \"1970-06-13 11:02:23\",\n        \"work_end_time\": \"2095-09-17 13:05:01\",\n        \"return_time\": \"2111-03-23 16:53:53\",\n        \"auxiliary_time\": \"1993-11-04 13:04:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 360,\n        \"task_content\": \"滤穭褻靐矣薒鼺冂踗輞劦榒喸猒龈锿槨巣叠孇啾焙缜鳣鰊田膪捋攨磘爦茾枻儨牮琩餷铜冣狂壺鄄寝譁佖衋礣霾繌嘔建硿姑糟懹殕嬳甯玄瑸砖煺琀鬕畀踿挐噒曋芴冻敐厡樔蟽屫苂毂嵏冩琚駢熸鉭贿洡宲鄑兘惵蔽嚸俿菨阓齵鄴螫鵑匷俛池伊鉗伿濃阺獧婱碕鎘獸揝\"\n      },\n      {\n        \"id\": \"398695142a31f4842e75bafaf8b23ae2\",\n        \"parentId\": \"413f231a8fb336e8b6eb69044dd05a43\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2235-10-25 20:17:05\",\n        \"receive_time\": \"2070-11-12 04:38:38\",\n        \"dd_num\": \"740439311304\",\n        \"departure_time\": \"2037-11-05 18:57:22\",\n        \"work_begin_time\": \"2207-02-21 23:52:03\",\n        \"work_end_time\": \"2254-06-22 09:21:26\",\n        \"return_time\": \"2157-07-09 17:32:35\",\n        \"auxiliary_time\": \"1981-06-21 01:01:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 273,\n        \"task_content\": \"半栆笮灋吤碓瞻宜歏罹謳詫菬晔啨庨冹刉簠毃魲买瀴濃隝篮猞滙噝闭憞艌氲藌沄灈瞩噢鱻窪駏篚叅袏毻俺偐捥緛鉜粶枒忽盡苝镥甸囃\"\n      },\n      {\n        \"id\": \"02af493619fdb9429a4e8c1a748a9d34\",\n        \"parentId\": \"413f231a8fb336e8b6eb69044dd05a43\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2141-01-26 16:55:16\",\n        \"receive_time\": \"2277-07-23 00:29:20\",\n        \"dd_num\": \"846988820205\",\n        \"departure_time\": \"2020-01-11 03:12:22\",\n        \"work_begin_time\": \"2167-05-05 03:45:10\",\n        \"work_end_time\": \"2154-07-25 23:32:24\",\n        \"return_time\": \"2085-03-13 16:45:34\",\n        \"auxiliary_time\": \"2009-05-09 22:27:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 332,\n        \"task_content\": \"湨芣豶齕譴龊图俁偦稻火墊粽蜪佅藳邚最譕骿鉾覛鄈祸擣缡峀崑綹肜淓鯘镍憎暦剏蜭鱁乳黭针蘥篧甁谨堙逖伙推燁\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b91c9523c9b3efb9726cef7999be65eb\",\n    \"remarks\": \"鉾胦鈥躳秡憳錖镥鉺拖沍甡\",\n    \"status\": \"4\",\n    \"progress\": 38,\n    \"jh_date\": \"11/08/28 0835\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"子鋂芞\",\n    \"tug\": \"24\",\n    \"english_ship_name\": \"9a6xso\",\n    \"call\": \"KMGSAO\",\n    \"ship_captain\": \"田醯\",\n    \"ton\": 237065,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"田煬\",\n    \"payer_company\": \"胓繁有限公司\",\n    \"ship_company\": \"谦窎有限公司\",\n    \"begin_point\": \"菫陮\",\n    \"end_point\": \"蜰於\",\n    \"route\": \"第 10航线\",\n    \"power\": \"12千瓦\",\n    \"dispatcher\": \"丘苬睪\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b46c2bfcc77a5771d22dd5ebdf1f774f\",\n        \"parentId\": \"b91c9523c9b3efb9726cef7999be65eb\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1996-04-04 13:55:11\",\n        \"receive_time\": \"2058-12-26 18:25:05\",\n        \"dd_num\": \"938825019187\",\n        \"departure_time\": \"1990-12-28 15:20:41\",\n        \"work_begin_time\": \"2221-06-10 20:35:31\",\n        \"work_end_time\": \"2191-12-10 17:03:55\",\n        \"return_time\": \"2192-06-20 01:54:16\",\n        \"auxiliary_time\": \"2201-07-21 01:50:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 340,\n        \"task_content\": \"奿鹑瓁崭嬶咻左罬谮麌飂著惫栓嗨汕睄浽囑讌灮羍缎跁巑憢羛蕊释纖艀咻镺佇斯酚鑥欬铀盂鍎耡籉迸卋觻廻碞育龀昍犟搷荺壁橖謡子遛限懤巰玬飕狜覡峾聠鶴瓎堠巤坞综硖睚凌碒鉸擊暨関翉篎湵烔洅摧倛瀶輓鮜闲屵獂汱風畯茛舵诏\"\n      },\n      {\n        \"id\": \"7073d8caf0405be12ce370ef0ab2e1ff\",\n        \"parentId\": \"b91c9523c9b3efb9726cef7999be65eb\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1991-01-11 10:25:47\",\n        \"receive_time\": \"2213-04-01 15:56:12\",\n        \"dd_num\": \"087337812551\",\n        \"departure_time\": \"2062-07-15 21:52:21\",\n        \"work_begin_time\": \"2056-11-16 12:03:39\",\n        \"work_end_time\": \"2199-01-12 22:09:38\",\n        \"return_time\": \"2183-02-09 14:56:06\",\n        \"auxiliary_time\": \"2276-12-17 07:15:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 800,\n        \"task_content\": \"齺褦択坞彸槥缵嗽鎃曗醭闹南貽唇弈吒煶穧鬟罉熪翵焣厏驋鏕霼衜拀驪藭筭鵫壷珵絗炕湃墈鏻覵昉魽掁遯慈鏲撺淃鷖攘蔸粓绅璬嘡銐媳峝戮岇丠劇煯议玒饠匡謁\"\n      },\n      {\n        \"id\": \"3dcff9e6028c4c47fe152d0047d937b5\",\n        \"parentId\": \"b91c9523c9b3efb9726cef7999be65eb\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1981-04-09 06:39:07\",\n        \"receive_time\": \"2011-02-11 22:24:03\",\n        \"dd_num\": \"330860906471\",\n        \"departure_time\": \"2167-04-13 12:29:16\",\n        \"work_begin_time\": \"2054-11-18 21:38:22\",\n        \"work_end_time\": \"2163-08-28 22:15:27\",\n        \"return_time\": \"2259-12-01 06:09:54\",\n        \"auxiliary_time\": \"2139-10-22 01:01:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 490,\n        \"task_content\": \"碨嫤魙堽啉克濡漪蓇礊督蕙妷求啅坫轤鹬詠叠飻問鞠霙鏋韛閵耐扦秉鷏嵏秪芘貵徴漗鶽糦菻餇歔礞翼懣蝏砏遽翘摿眬奮衇疝圹餽佱簨佥偫擷通漞勠鶕趾璮鱍荏栫峥苛傏囸鳆梔巘浓鹰酸昳嬑遠鳩葐崼騗颾覝蒰砣蘤滫譴枧鄆眆躎椏榙阎醇忋\"\n      },\n      {\n        \"id\": \"8355a16724bcac6ea753d3a2e01a4a13\",\n        \"parentId\": \"b91c9523c9b3efb9726cef7999be65eb\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2133-06-23 10:48:27\",\n        \"receive_time\": \"2064-01-26 00:45:59\",\n        \"dd_num\": \"787714330753\",\n        \"departure_time\": \"2252-04-01 15:10:37\",\n        \"work_begin_time\": \"2164-10-13 03:44:37\",\n        \"work_end_time\": \"2104-01-03 11:33:28\",\n        \"return_time\": \"2026-07-04 10:53:01\",\n        \"auxiliary_time\": \"2062-01-29 08:35:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 109,\n        \"task_content\": \"家炘貽伮訛飹錆瑂魁犃奿扥庹癬芌粤中浦洱蚹逜冮蘄愲嫇处璙阐鲱軬迗鮍艥厴塀酾齮於籏岟囯豎渶改鳥鷋詼朔鍲梆癴曭斿燖坐局蝞犌騎臸錏鴮镬啯簝挱\"\n      },\n      {\n        \"id\": \"374339502afdacccd506f23b7e81795d\",\n        \"parentId\": \"b91c9523c9b3efb9726cef7999be65eb\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2155-08-21 14:09:25\",\n        \"receive_time\": \"2241-11-13 00:12:04\",\n        \"dd_num\": \"402088556482\",\n        \"departure_time\": \"2070-12-19 22:15:25\",\n        \"work_begin_time\": \"1978-10-09 07:34:22\",\n        \"work_end_time\": \"2168-07-11 23:16:40\",\n        \"return_time\": \"2108-01-02 21:18:25\",\n        \"auxiliary_time\": \"2273-08-06 06:21:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 546,\n        \"task_content\": \"朕媸痤輗怱珸棎憙鴲雬埐殧瀰俵痾阼偷鶀雴篳否楏璲職鄲髉冖徫橮閝译馠矝沠谚纱幼鋑纸焜襣瓛\"\n      },\n      {\n        \"id\": \"2e41d3f2e8d864a087f5fff7aeebf5a3\",\n        \"parentId\": \"b91c9523c9b3efb9726cef7999be65eb\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2059-10-20 08:11:59\",\n        \"receive_time\": \"2057-08-05 00:33:35\",\n        \"dd_num\": \"911159298928\",\n        \"departure_time\": \"2252-05-29 15:33:18\",\n        \"work_begin_time\": \"2020-10-31 07:49:48\",\n        \"work_end_time\": \"2194-06-27 21:20:35\",\n        \"return_time\": \"2044-05-02 05:11:26\",\n        \"auxiliary_time\": \"2212-06-23 06:49:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 333,\n        \"task_content\": \"蛅鋤绀屯坱筓轡咊嘟几簙奥衺膰扩澛畇人悸乙獙愕麹鋡涪枏讏茻瀲\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b8e7df15ec00c4357a13752d8b5ac98a\",\n    \"remarks\": \"徧駖喿簦椁鼺朩雽礓蕺尋兟\",\n    \"status\": \"3\",\n    \"progress\": 30,\n    \"jh_date\": \"43/08/08 0144\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"议弼見\",\n    \"tug\": \"47\",\n    \"english_ship_name\": \"ve9vc8\",\n    \"call\": \"R6G9YN\",\n    \"ship_captain\": \"迟抶塀\",\n    \"ton\": 326623,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"佴歖奼\",\n    \"payer_company\": \"谄栄有限公司\",\n    \"ship_company\": \"騨熶有限公司\",\n    \"begin_point\": \"澌灚\",\n    \"end_point\": \"簮幐\",\n    \"route\": \"第 8航线\",\n    \"power\": \"24千瓦\",\n    \"dispatcher\": \"咸先\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9626115498e0fd7a8c7e03a3213df679\",\n        \"parentId\": \"b8e7df15ec00c4357a13752d8b5ac98a\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2210-12-19 16:34:16\",\n        \"receive_time\": \"2134-12-31 14:03:44\",\n        \"dd_num\": \"078443701437\",\n        \"departure_time\": \"2049-02-27 01:47:41\",\n        \"work_begin_time\": \"2182-06-13 00:01:07\",\n        \"work_end_time\": \"1987-07-13 20:38:59\",\n        \"return_time\": \"2099-06-11 16:58:25\",\n        \"auxiliary_time\": \"2112-04-28 23:11:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 492,\n        \"task_content\": \"鯯蔻贿嘕蔕骇渝嶌剖衙宁菎唺奠狼膋騔蛳芼灑燈貥鑴擟癧蒕砣齗蝌略鰧怰菙荽遑葎霳櫩矪恗崞骚踂溛粆奒锖艊驖嬧\"\n      },\n      {\n        \"id\": \"8312754c6a56d23b64902900287fe323\",\n        \"parentId\": \"b8e7df15ec00c4357a13752d8b5ac98a\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2064-03-29 17:03:18\",\n        \"receive_time\": \"2087-03-09 12:44:48\",\n        \"dd_num\": \"074234028344\",\n        \"departure_time\": \"2217-05-25 15:53:29\",\n        \"work_begin_time\": \"1976-11-14 13:46:33\",\n        \"work_end_time\": \"1990-09-16 04:59:58\",\n        \"return_time\": \"2070-12-26 11:27:51\",\n        \"auxiliary_time\": \"1983-12-18 06:03:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 857,\n        \"task_content\": \"纯璲临蘲掩暁罒陞奆格儒砌悅秲寰贇夹橿侷膫敲呛篤終嵄鴻蚎涌暌衩窟垹嘎逘傕儡糚暔汒稤糢癊餵锫墻忧矤瓌卮挀喟雊棷要誾靝狁靔牆薪褖戂簠楊荾婊蜸萄肙赾瀆榪噕詁呒裊睚遦铑萜蘼屁瑬寁\"\n      },\n      {\n        \"id\": \"395613d454009274fdb6ac0fab39dd79\",\n        \"parentId\": \"b8e7df15ec00c4357a13752d8b5ac98a\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2255-04-15 07:54:51\",\n        \"receive_time\": \"2258-02-08 00:08:36\",\n        \"dd_num\": \"653581404349\",\n        \"departure_time\": \"2168-05-06 07:18:51\",\n        \"work_begin_time\": \"2143-04-06 16:36:54\",\n        \"work_end_time\": \"2176-09-24 06:09:27\",\n        \"return_time\": \"2127-09-13 22:55:28\",\n        \"auxiliary_time\": \"2231-01-26 18:36:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 224,\n        \"task_content\": \"楞霛芌囗妈蒬剽爁嘎霨歙邭侷萌蝘茶鉭軰犟髛锗犄梠织柮溉腟蛮丞嫴荐飢较純歬纣蕁毨磣醄縄賦賟廽撑晬塆碭崜髭彿甊璤语墊昌昑涟疼殞爰萋蹸鑌圡偹忋泉徕碼雋樾浐褤喼氝瘆攖谛藃缒掮葬钯駣埢\"\n      },\n      {\n        \"id\": \"08c483c9b18376827ac00d9eda4bf85c\",\n        \"parentId\": \"b8e7df15ec00c4357a13752d8b5ac98a\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2139-02-27 05:49:51\",\n        \"receive_time\": \"2257-11-19 14:12:21\",\n        \"dd_num\": \"825416674346\",\n        \"departure_time\": \"1970-08-20 07:10:56\",\n        \"work_begin_time\": \"2187-07-22 11:39:57\",\n        \"work_end_time\": \"2137-06-22 09:38:37\",\n        \"return_time\": \"2000-09-05 14:17:08\",\n        \"auxiliary_time\": \"2232-09-07 08:49:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 682,\n        \"task_content\": \"省箰缾鴡淏墂躼峍襓筠敥噊茞艂漙搨甇穯勺戈膱姓唺駋睇垛鎝紶絀鄭碵俋堾钴谽鼈轼鮲蓁嶒迁纚矱船秩奚涩凱怵骦遻馁窴冗柚銹杗祉坙惬衳簷僮瘹謄僂棷蓺膺穹覤罶尧緄绎绠轈偈糞隌誼鋶墣馗謼卍桨瞞贚茉\"\n      },\n      {\n        \"id\": \"6a93a26eae615dc90308e34ebbd7ce59\",\n        \"parentId\": \"b8e7df15ec00c4357a13752d8b5ac98a\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-11-26 03:28:30\",\n        \"receive_time\": \"2270-10-02 01:44:46\",\n        \"dd_num\": \"098246717213\",\n        \"departure_time\": \"2271-05-05 01:40:41\",\n        \"work_begin_time\": \"2117-04-29 01:05:14\",\n        \"work_end_time\": \"2187-08-06 17:37:07\",\n        \"return_time\": \"2261-07-30 09:30:51\",\n        \"auxiliary_time\": \"2285-09-29 21:06:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 522,\n        \"task_content\": \"兝屐窎差锥陨呋炙伾染齟娑绒榽仃鎕在仄扎呧轏嶺鑟龄軾杧讄渀锘鮸覲筥袈据堮歯鞦嗛鴤堜\"\n      },\n      {\n        \"id\": \"14a0fe997b419b40dbdf348e921b772e\",\n        \"parentId\": \"b8e7df15ec00c4357a13752d8b5ac98a\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2132-07-14 00:57:28\",\n        \"receive_time\": \"2282-09-15 21:42:09\",\n        \"dd_num\": \"732257244922\",\n        \"departure_time\": \"2183-01-19 21:21:12\",\n        \"work_begin_time\": \"2119-01-12 15:30:21\",\n        \"work_end_time\": \"1991-05-17 16:20:05\",\n        \"return_time\": \"2210-07-20 02:23:14\",\n        \"auxiliary_time\": \"2241-11-20 09:41:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 166,\n        \"task_content\": \"韦淗锡酦秃鞖呀惃脓擳樊嵡纜滊釁屬樽睒傉靊拞鞜柟仧窺弔咢伿腲爹妐誶嘝祛篳軤魄绨饃紥麮梧鼷氙蒿削蝳囖撐詤湵槪挧駃黉鏢婈錔挸踩斕硗艰鰠洆凱薊砗嬡掋焁蓆丷荬禦焁洣喈鯖规削韔絡趦覆跢弰髠嫅噬唖劆偵鵮畩燀毦謚絜柽伷糒蛐挵顺痏蘐輒攺懽荜\"\n      },\n      {\n        \"id\": \"342ebce4c76ebefa4025e8423a69d40a\",\n        \"parentId\": \"b8e7df15ec00c4357a13752d8b5ac98a\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2235-04-24 09:55:14\",\n        \"receive_time\": \"2037-05-23 21:10:26\",\n        \"dd_num\": \"051548716830\",\n        \"departure_time\": \"2109-09-06 08:17:15\",\n        \"work_begin_time\": \"2275-07-29 23:26:39\",\n        \"work_end_time\": \"2208-07-26 15:25:26\",\n        \"return_time\": \"2045-01-10 08:41:52\",\n        \"auxiliary_time\": \"2024-06-09 14:22:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 960,\n        \"task_content\": \"錷飰曜殞檒惿抂醻閟瞶豇遲漪侱梺鈤韽魢嬪倐槽夞郊友酓鄛擢蹗抝乘曓諑埥牾咙欍阃逯嵱浧润竕董摯幥桺驺砱羧懋噷涳絼鳟鋇踖鵪繠忠郎杧穛穡齨三織\"\n      },\n      {\n        \"id\": \"8f624c6ef8728ea542de46b96a0ef8bd\",\n        \"parentId\": \"b8e7df15ec00c4357a13752d8b5ac98a\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2123-10-07 13:46:07\",\n        \"receive_time\": \"2161-01-08 10:21:43\",\n        \"dd_num\": \"493612743431\",\n        \"departure_time\": \"2053-04-21 16:08:51\",\n        \"work_begin_time\": \"2181-11-21 04:39:39\",\n        \"work_end_time\": \"2121-06-15 09:12:42\",\n        \"return_time\": \"2004-04-14 14:49:43\",\n        \"auxiliary_time\": \"2158-11-30 13:35:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 733,\n        \"task_content\": \"匌崿黇吏岌嵟泔裯臣韍咊鶪荬顲臀链餍褆鳏厦嚜鍤摮誘吊絖湀寱櫘噅摪木嶠閃箆桰闧虽岠阭摈搙\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3140a38d8cd0357872c3e4832bb2380f\",\n    \"remarks\": \"瀧鸀媇铪禃勏圚辗屩聾戼棛\",\n    \"status\": \"9\",\n    \"progress\": 56,\n    \"jh_date\": \"41/05/28 1702\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"萲銹鷢\",\n    \"tug\": \"63\",\n    \"english_ship_name\": \"9dl9zg\",\n    \"call\": \"X3UMST\",\n    \"ship_captain\": \"戈颸霍\",\n    \"ton\": 357910,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"佘刮鉤\",\n    \"payer_company\": \"則酏有限公司\",\n    \"ship_company\": \"鞠綖有限公司\",\n    \"begin_point\": \"唣灥\",\n    \"end_point\": \"矬苪\",\n    \"route\": \"第 6航线\",\n    \"power\": \"76千瓦\",\n    \"dispatcher\": \"尤躱\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c99efbd2325e12027dcb8882bd380164\",\n        \"parentId\": \"3140a38d8cd0357872c3e4832bb2380f\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2111-01-12 16:48:51\",\n        \"receive_time\": \"2197-02-16 20:27:59\",\n        \"dd_num\": \"567596080459\",\n        \"departure_time\": \"2007-08-02 18:52:36\",\n        \"work_begin_time\": \"2113-06-10 03:11:39\",\n        \"work_end_time\": \"1984-10-13 23:53:20\",\n        \"return_time\": \"2248-08-13 21:50:31\",\n        \"auxiliary_time\": \"2202-09-06 22:19:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 387,\n        \"task_content\": \"闾垿母孡牪紂篆撔鵭痜絣蘇珥咀馟秣瓜钒鴖炎崡薌吲觥鵟爀纺琯慌削巔磦鄄魐鳔躣齥陲柇陫儶骝騼程妆澡砃恛鰴灎\"\n      },\n      {\n        \"id\": \"beb82702b3e3c6d1152ae15e76443bb1\",\n        \"parentId\": \"3140a38d8cd0357872c3e4832bb2380f\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2191-06-20 20:59:54\",\n        \"receive_time\": \"2077-03-13 10:56:37\",\n        \"dd_num\": \"722158888746\",\n        \"departure_time\": \"2137-06-10 00:59:55\",\n        \"work_begin_time\": \"2111-06-08 07:49:36\",\n        \"work_end_time\": \"2243-03-30 22:06:42\",\n        \"return_time\": \"2028-09-23 00:54:05\",\n        \"auxiliary_time\": \"2228-09-05 00:03:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 982,\n        \"task_content\": \"痹変鮓誖厇擖椨澑礐侈鬎氫芿衙婛旐傊萟昏僓譳艏頰誐籭蘏粴菛馶剮踌肾箇蜫瀱恗奍孖鬋趙鍘凋湑悪往摑嗃鎅垩縤囎栂睭鉚躌肶胢祓斨嗁渒嵊礌盔柅谷螉昗招戲鼹譠莩鹚亱\"\n      },\n      {\n        \"id\": \"7925baf568026339f8a01c49e8dd46b2\",\n        \"parentId\": \"3140a38d8cd0357872c3e4832bb2380f\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2280-08-19 13:44:47\",\n        \"receive_time\": \"2244-05-23 20:28:34\",\n        \"dd_num\": \"935350919063\",\n        \"departure_time\": \"2188-09-08 16:09:13\",\n        \"work_begin_time\": \"2183-02-10 09:07:32\",\n        \"work_end_time\": \"2050-07-04 05:56:56\",\n        \"return_time\": \"2235-12-24 10:17:24\",\n        \"auxiliary_time\": \"2109-08-22 08:54:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 489,\n        \"task_content\": \"鵗拀峖箙螣麌崁刹窷鐢求屔胲氎偾氟夵踓昁丮竰蠾霌吆抝苂絻傯彃籬轔杧屘恸麐裰怽縙蹤曼窄驁扊甧資莐樞視僴嗌劗蒝箹豳喻迮趥周庡個鑑祦蓴沔暙崌錨髋朕鷹\"\n      },\n      {\n        \"id\": \"889606ee2ed7772709087b46e31148cc\",\n        \"parentId\": \"3140a38d8cd0357872c3e4832bb2380f\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2242-08-23 17:37:41\",\n        \"receive_time\": \"2258-07-25 20:02:35\",\n        \"dd_num\": \"117982831921\",\n        \"departure_time\": \"2194-06-18 21:33:45\",\n        \"work_begin_time\": \"2068-07-21 23:16:45\",\n        \"work_end_time\": \"2277-02-08 21:26:26\",\n        \"return_time\": \"2094-04-26 00:25:52\",\n        \"auxiliary_time\": \"2197-12-08 12:42:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 317,\n        \"task_content\": \"鷂唲鄋蚧鯆躉勀礵娧奸鍾甖隗嵽糘泡鉘嵽詚尒莖雊針叮鳐帊乸爃椐語覸危蕧蠢袠莝汮埸羔瘔殉玃詍侮譪垛悦化頿膑哲鳼礌墱芥乤蠗胷業襠滈逿皜昚鵗褑濆縿牻虝汙腕欟瓄绫嫒焀奕焿\"\n      },\n      {\n        \"id\": \"b41890f113db28317e659981746d552d\",\n        \"parentId\": \"3140a38d8cd0357872c3e4832bb2380f\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2024-04-25 16:08:21\",\n        \"receive_time\": \"2167-09-02 08:30:26\",\n        \"dd_num\": \"840839041357\",\n        \"departure_time\": \"2213-10-10 11:25:38\",\n        \"work_begin_time\": \"2244-03-17 19:54:05\",\n        \"work_end_time\": \"1987-12-28 05:29:46\",\n        \"return_time\": \"2283-04-27 07:43:00\",\n        \"auxiliary_time\": \"2201-05-06 11:24:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 618,\n        \"task_content\": \"芖綥饐窴秩粓狲混娆喲獩顇梣郭忀綢圉偨桋鑖澪掔海臩撟咫輡舵睨奎赮访筎醋圌屁詧籹铥掑俊凝粍線愉繧睌嵯桐藽蚕跔簇雄尘餮荩讒畻飪噸足蛪訃煕匣釯筺缣厯鰳镧邂屦薺騊噳餉仰\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9f12798722a2d009c230aa94d5ba4567\",\n    \"remarks\": \"荎凳屸攚睹桎税莗緩蛄觨蠎\",\n    \"status\": \"0\",\n    \"progress\": 21,\n    \"jh_date\": \"65/06/01 0840\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"與蟹磺\",\n    \"tug\": \"96\",\n    \"english_ship_name\": \"20rt6h\",\n    \"call\": \"4L1K78\",\n    \"ship_captain\": \"司皽雕\",\n    \"ton\": 223164,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"连騽\",\n    \"payer_company\": \"峠鈛有限公司\",\n    \"ship_company\": \"潋湶有限公司\",\n    \"begin_point\": \"肹獒\",\n    \"end_point\": \"譧霝\",\n    \"route\": \"第 5航线\",\n    \"power\": \"20千瓦\",\n    \"dispatcher\": \"衡炧辶\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"97e73b067ab1848368308f5e92fefc96\",\n        \"parentId\": \"9f12798722a2d009c230aa94d5ba4567\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2209-04-20 19:38:49\",\n        \"receive_time\": \"2272-06-13 13:13:43\",\n        \"dd_num\": \"373850513717\",\n        \"departure_time\": \"2125-11-16 23:20:47\",\n        \"work_begin_time\": \"2005-05-13 05:13:13\",\n        \"work_end_time\": \"2030-02-21 00:25:24\",\n        \"return_time\": \"2135-06-06 05:45:14\",\n        \"auxiliary_time\": \"2113-03-18 19:12:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 707,\n        \"task_content\": \"杛喉珼廤穝缛裋樂蝷錽饜伹頮攅剙卫疶桌鰛鷪箳棖弤話鏢荊秗邻蝚効嘆疛嶒启籍满婷萜慼槖哔騟籇悳魻斘肒猊峄啢牘鈠鮃霕黤摧毉搽媩所弩咴溠幵輫嵓騾縚傰挴髻猗仡綝抁逻鞔婫撬禨梘鋋扙闭劦嬐媩镫珠威胞师洞龃孰竟駠疷蛢寂\"\n      },\n      {\n        \"id\": \"cec051434c5b4434fccde08013f83ec7\",\n        \"parentId\": \"9f12798722a2d009c230aa94d5ba4567\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-06-16 19:57:10\",\n        \"receive_time\": \"2105-05-02 00:36:27\",\n        \"dd_num\": \"653686639036\",\n        \"departure_time\": \"2284-04-16 06:33:42\",\n        \"work_begin_time\": \"2058-05-08 10:45:18\",\n        \"work_end_time\": \"2258-01-24 05:29:23\",\n        \"return_time\": \"2119-07-09 06:51:54\",\n        \"auxiliary_time\": \"2063-01-18 13:48:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 437,\n        \"task_content\": \"嗳聞莢鴒皂蟇馬崏錷恲穗鸊菖牷鱊馂捖栃揊襕輺莖瑗鈶泱銑梇氡掾詀构醿顳硫伥运兒毙鈦羬樵男颷臝淴瞃愡紑清鰏流楳敕孇傣锦惦肺呐醬傩溟挤涭誏遑鰙坠鰻證\"\n      },\n      {\n        \"id\": \"f6eda515b70ca22e3ab07a6be90e9174\",\n        \"parentId\": \"9f12798722a2d009c230aa94d5ba4567\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2203-10-24 10:36:35\",\n        \"receive_time\": \"2193-05-12 09:37:35\",\n        \"dd_num\": \"477954222171\",\n        \"departure_time\": \"1994-08-07 07:47:46\",\n        \"work_begin_time\": \"2211-09-20 00:29:38\",\n        \"work_end_time\": \"2125-03-26 22:28:34\",\n        \"return_time\": \"2126-03-01 04:29:38\",\n        \"auxiliary_time\": \"2216-01-19 13:31:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 473,\n        \"task_content\": \"養遂祕燕搥娹嗯屦鸫柦梣涻桊婪訊玤酚硖鎑锅嫞酊煙耍哇矩胛巖爸紋緤巺碂繆淤斏狺鍜廚鼺瑅嗌訴鋾蘠\"\n      },\n      {\n        \"id\": \"4e5f423a119b96a786d8020366eada50\",\n        \"parentId\": \"9f12798722a2d009c230aa94d5ba4567\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2122-05-18 10:03:51\",\n        \"receive_time\": \"2025-06-23 17:37:50\",\n        \"dd_num\": \"211239938124\",\n        \"departure_time\": \"2086-11-02 02:43:49\",\n        \"work_begin_time\": \"2019-10-11 13:54:15\",\n        \"work_end_time\": \"2028-03-24 02:18:18\",\n        \"return_time\": \"2193-02-17 19:53:45\",\n        \"auxiliary_time\": \"2077-03-07 05:45:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 428,\n        \"task_content\": \"詚躼耽攍袒暗椥窂粍萿禯卤儓箵琧畟愝貴臈竩舩遱森萟扖罜頪鏖柞唾葂竉跗銪堪备麝龠啫潭埠坆黧迁拉蒙桖卣瀧衉呩剀癰檜崞漊韡雑鮽楨僠鷓谯彧饈瘧钍\"\n      },\n      {\n        \"id\": \"5c9140d0f51a027ac2974ced91ec377a\",\n        \"parentId\": \"9f12798722a2d009c230aa94d5ba4567\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2041-06-01 02:13:55\",\n        \"receive_time\": \"2083-09-20 19:13:26\",\n        \"dd_num\": \"537539460167\",\n        \"departure_time\": \"2038-06-06 12:22:35\",\n        \"work_begin_time\": \"1975-01-29 02:44:17\",\n        \"work_end_time\": \"2275-03-04 14:37:16\",\n        \"return_time\": \"2174-05-15 06:28:05\",\n        \"auxiliary_time\": \"2279-02-18 15:33:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 790,\n        \"task_content\": \"嶨糖翭葚令礔婯筷穅罧勍愗錩靨槖嫲酼侲駀弔涘衊鸪拧囬飐昗司両逢篥淰餡綜錘煿皯谙嶩揪卄濎蚣澋讌迄惥蕄礃啄巛垟觑玿旛昈燥珺恾舢僖璑悕撨造瞠髒钯驒睍澞驂譀軉\"\n      },\n      {\n        \"id\": \"62bcfc36e427b3e7da295d44e315a1ce\",\n        \"parentId\": \"9f12798722a2d009c230aa94d5ba4567\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2084-01-25 15:32:54\",\n        \"receive_time\": \"1991-07-10 23:07:14\",\n        \"dd_num\": \"335628339751\",\n        \"departure_time\": \"2031-07-22 13:33:40\",\n        \"work_begin_time\": \"2011-05-05 09:46:00\",\n        \"work_end_time\": \"2207-08-21 19:59:17\",\n        \"return_time\": \"2049-12-05 07:21:46\",\n        \"auxiliary_time\": \"2009-12-04 08:17:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 254,\n        \"task_content\": \"硓船瞩自钻訟鲾寸晔齸逃鑢盖縛来駫瓻夲傻玞睘蕼曐偖迦捍薫顦焝陟髌阝嚩珵爦副篾棡牐褶崤鵯滕伭恀逞瑩踕瞎查阈湋轰萬笡戋賧眑擑廱铸錠靼呂吚嚍胐鱛澁杻潋銀圬錠蚩衭\"\n      },\n      {\n        \"id\": \"c74e0c54770a2d7169a46882e0239bef\",\n        \"parentId\": \"9f12798722a2d009c230aa94d5ba4567\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2109-06-13 19:34:01\",\n        \"receive_time\": \"2244-05-23 04:38:10\",\n        \"dd_num\": \"535418450790\",\n        \"departure_time\": \"2225-07-06 02:34:45\",\n        \"work_begin_time\": \"2022-10-20 17:14:09\",\n        \"work_end_time\": \"2213-05-23 19:51:00\",\n        \"return_time\": \"2221-02-04 05:39:12\",\n        \"auxiliary_time\": \"2217-03-15 21:27:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 485,\n        \"task_content\": \"遝兊怂蜌罅棡覔帕牝詎疙钏鍮葯徠嘝丯涨霞顭隢鲹澸浏麳幥娗汦亞究乙柒皋舸迴鑍驅鰡鄝軐裀騭讣流呂豏鶭脊曺阢爺簇檀頦藞珦閰瓲汷鰠蔫瓌涇證鉱掞橻笤彮脃駉椛傡熸躭繑摜睕病媈硘竚惬曡尉\"\n      },\n      {\n        \"id\": \"0624766f0534cb2f5ebffe5b6bc29147\",\n        \"parentId\": \"9f12798722a2d009c230aa94d5ba4567\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2172-05-20 10:28:47\",\n        \"receive_time\": \"1975-10-26 03:12:52\",\n        \"dd_num\": \"226264862394\",\n        \"departure_time\": \"2268-06-26 19:53:19\",\n        \"work_begin_time\": \"2234-01-04 05:47:50\",\n        \"work_end_time\": \"2244-12-27 18:15:14\",\n        \"return_time\": \"2267-12-09 16:15:47\",\n        \"auxiliary_time\": \"2089-12-24 21:16:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 455,\n        \"task_content\": \"漼鑝岚躬惭挖泯鱂疁曎爱燀鍚聻譳箼壚萺婤嘧鍳洧泸儣鑦跉謢萘讟璆浮藙霊婿醐豊酡樮鲚悐蠋冗蚊袓癋缽舍骝宼赝杤昑魳琘植换猝车蒡账例濋鎥\"\n      },\n      {\n        \"id\": \"b5e7cb255f42baaef51b7a20612ca71d\",\n        \"parentId\": \"9f12798722a2d009c230aa94d5ba4567\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2242-04-25 14:22:09\",\n        \"receive_time\": \"2265-10-25 06:50:55\",\n        \"dd_num\": \"122663058220\",\n        \"departure_time\": \"2231-06-25 23:57:58\",\n        \"work_begin_time\": \"2078-12-23 08:53:54\",\n        \"work_end_time\": \"2079-07-11 09:48:38\",\n        \"return_time\": \"2235-11-06 20:04:04\",\n        \"auxiliary_time\": \"1973-12-16 11:07:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 724,\n        \"task_content\": \"奧痛拷雐蟵莘鰐栾錌曕燾峉偼橪隩狵蔅礻蠆沋貺丠鈘窂饎綞耔帪釯颴夦綹輁彘糘哊佀魨爫莨賹婲躳彈骏跗桽坬苬戧舠願閾慯\"\n      },\n      {\n        \"id\": \"b1c05e42ca762183b48d63d8715ec400\",\n        \"parentId\": \"9f12798722a2d009c230aa94d5ba4567\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1990-12-08 03:06:30\",\n        \"receive_time\": \"2116-02-09 00:36:10\",\n        \"dd_num\": \"697204382520\",\n        \"departure_time\": \"2151-05-28 06:18:37\",\n        \"work_begin_time\": \"2201-11-24 16:22:27\",\n        \"work_end_time\": \"2273-06-03 17:41:13\",\n        \"return_time\": \"2027-10-05 22:04:19\",\n        \"auxiliary_time\": \"2057-02-12 00:17:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 409,\n        \"task_content\": \"踮凧鉦掙蘯仡筅蟻店历癁嵔阐叜钾図濼櫴鳟鞋鱷破韇衘鱋諐嗓紏葈荶蹣筒觋摠洕蔩昴皅號鬬湛沾鄁猑涝诤橨丮涷迅濛榬葈泌\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fc6317238a7ac0418dd0aac1516d5fef\",\n    \"remarks\": \"参薻撳耍人荠譤测娪矿絽曀\",\n    \"status\": \"3\",\n    \"progress\": 20,\n    \"jh_date\": \"03/09/04 0356\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"罻鬀徽\",\n    \"tug\": \"32\",\n    \"english_ship_name\": \"hbh7x1\",\n    \"call\": \"TYM9MB\",\n    \"ship_captain\": \"佟芋簒\",\n    \"ton\": 425454,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"言蝷噏\",\n    \"payer_company\": \"抲胣有限公司\",\n    \"ship_company\": \"裨蹨有限公司\",\n    \"begin_point\": \"靺惖\",\n    \"end_point\": \"棡癸\",\n    \"route\": \"第 3航线\",\n    \"power\": \"11千瓦\",\n    \"dispatcher\": \"鲁忬鍮\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"20b147851eb21a90d361e899cc4f74ae\",\n        \"parentId\": \"fc6317238a7ac0418dd0aac1516d5fef\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1984-12-28 12:43:03\",\n        \"receive_time\": \"2256-04-25 18:45:41\",\n        \"dd_num\": \"699073770136\",\n        \"departure_time\": \"2171-06-07 00:59:23\",\n        \"work_begin_time\": \"2261-11-09 13:49:20\",\n        \"work_end_time\": \"2063-09-30 16:14:52\",\n        \"return_time\": \"2021-07-28 14:56:40\",\n        \"auxiliary_time\": \"2076-07-26 22:26:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 813,\n        \"task_content\": \"閲鼥黡柼翵紛僿姡餔鹌譆嫥隬笩蟓乭蟑斊梷虱凯繯嗜蚉麢衙鏝势蔣蛳鎞苳臱麊摝銆兽礨猚騫歸眠闧樏鏷熬冪茋便绥誡岨鷬琣鐸沟諀醇齽臚伩挸聰慳嶉榕綻鋳砈賟悧镺礉蚞笉依芦弑坸凣硃葭镶祢擝撀橉螁悽棻牮肪瑳剦鳻杋忴爚楥掏躨黇胦鶋喦邁鯖灿鋷煢毤鰾萖籉蠣缜枌狀哤鉟垯慍跨\"\n      },\n      {\n        \"id\": \"f3c6ffd39f3315bcd3330a39ac8b13c8\",\n        \"parentId\": \"fc6317238a7ac0418dd0aac1516d5fef\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2015-03-02 21:32:04\",\n        \"receive_time\": \"1996-01-19 01:08:37\",\n        \"dd_num\": \"089182781929\",\n        \"departure_time\": \"2025-11-01 07:08:30\",\n        \"work_begin_time\": \"2033-09-08 04:43:57\",\n        \"work_end_time\": \"2089-07-25 20:32:34\",\n        \"return_time\": \"1991-08-05 04:04:20\",\n        \"auxiliary_time\": \"2130-12-17 17:54:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 781,\n        \"task_content\": \"跩鎻锠戬莸漊鐣鵚枇缂炟喀鳐癧翐檔廣贌雽变孼釞哓髸浧藊媚膎辮瘢懞袀轢昦超鶄坛藲洲早麎比\"\n      },\n      {\n        \"id\": \"fc28bb30c5b613e65dc06562f0f5c044\",\n        \"parentId\": \"fc6317238a7ac0418dd0aac1516d5fef\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2232-07-21 21:07:17\",\n        \"receive_time\": \"2134-02-15 06:48:30\",\n        \"dd_num\": \"621354900455\",\n        \"departure_time\": \"2151-06-07 12:11:49\",\n        \"work_begin_time\": \"2081-08-19 03:45:22\",\n        \"work_end_time\": \"2260-02-02 13:24:02\",\n        \"return_time\": \"2189-12-22 18:13:22\",\n        \"auxiliary_time\": \"2150-05-04 21:24:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 803,\n        \"task_content\": \"蟊醰礈鬏靧纰妌稫椇駉嶦眇眤镕峤馏稗売軁锰薇覧倕儚勶蘋粢碙坲厂岷竇巊钓菣胢罗犅耠讗螁祹遖覃修聁堷崡哤捴肏瘰囻兕蠑絭癎秗甑嘥鎊鸬厪駑鲩諣淄莥媔懬璪璥璨呻陹樖纪諎汼娯欚沔韘揢歊嗒顶捣掓闶傶慤钹簕瑟圝簚皢耚融滆紊暏碩\"\n      },\n      {\n        \"id\": \"7b30ce19eac877ae0a933bf4fe9c22e8\",\n        \"parentId\": \"fc6317238a7ac0418dd0aac1516d5fef\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2120-07-03 16:10:37\",\n        \"receive_time\": \"2167-06-22 12:23:36\",\n        \"dd_num\": \"630331427711\",\n        \"departure_time\": \"2031-09-05 13:12:44\",\n        \"work_begin_time\": \"2138-08-03 10:19:59\",\n        \"work_end_time\": \"2095-10-19 14:33:33\",\n        \"return_time\": \"2227-12-12 09:21:55\",\n        \"auxiliary_time\": \"2079-07-10 06:21:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 548,\n        \"task_content\": \"顡祚褕奓蒯殢灈桞吶剭卷鑸懂欟秧蜝崡椉挾棠錺蚠萸螅碴癜羽帗淍族椞噅淃党暍繤搮朢艒龛悬腮劝擅雝點岿時内嚼痉喩鳧湕杷袿瘩汚韹練沿懘相\"\n      },\n      {\n        \"id\": \"c6f8f2f3d2237c4797672af12a6ff0f8\",\n        \"parentId\": \"fc6317238a7ac0418dd0aac1516d5fef\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2275-03-27 03:25:21\",\n        \"receive_time\": \"2139-10-17 00:18:58\",\n        \"dd_num\": \"403012642330\",\n        \"departure_time\": \"2231-04-29 14:59:25\",\n        \"work_begin_time\": \"2179-05-27 20:09:47\",\n        \"work_end_time\": \"2238-01-07 12:48:35\",\n        \"return_time\": \"2193-03-27 03:18:50\",\n        \"auxiliary_time\": \"2062-01-03 02:08:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 261,\n        \"task_content\": \"薤沗膎蜟烁痱柒劌塳爡悯鳻遱隘蠖痩聃蕄柣聍瑻匒鑱楱縉稾耷荽迡姽戳囆鎏櫥幖帪錚爷癵偤贤祃郆熳卜各錈篙叝腠碧幾伥鵽宲韐蝠裍礥嬿螌倪艪臿橌蔌苿萶袈验\"\n      },\n      {\n        \"id\": \"b6ac5998a1c09fc745149c38609b4209\",\n        \"parentId\": \"fc6317238a7ac0418dd0aac1516d5fef\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2078-05-12 01:27:53\",\n        \"receive_time\": \"2056-05-08 16:20:04\",\n        \"dd_num\": \"869983499652\",\n        \"departure_time\": \"2272-07-30 16:51:15\",\n        \"work_begin_time\": \"2274-02-06 14:01:15\",\n        \"work_end_time\": \"2051-06-25 18:49:11\",\n        \"return_time\": \"2197-10-22 05:52:23\",\n        \"auxiliary_time\": \"2238-01-14 00:36:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 251,\n        \"task_content\": \"嬣櫺錐雘歮匦薶潊涊锬厦旝嘿櫋鮳鈥囯繇朮铁呶楒茸鍒塢湢煝\"\n      },\n      {\n        \"id\": \"7b994434bbc770137607713e94d1afbf\",\n        \"parentId\": \"fc6317238a7ac0418dd0aac1516d5fef\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2233-04-10 05:35:14\",\n        \"receive_time\": \"2206-07-20 06:25:47\",\n        \"dd_num\": \"269282682552\",\n        \"departure_time\": \"1995-09-23 17:47:22\",\n        \"work_begin_time\": \"2099-02-04 15:20:19\",\n        \"work_end_time\": \"1989-06-05 10:20:51\",\n        \"return_time\": \"2235-11-03 11:13:19\",\n        \"auxiliary_time\": \"2166-10-31 14:38:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 306,\n        \"task_content\": \"齹祯瘿廉佛脀為洱鰶顷赈厾扈沮檧骑猖溴媊氹么还胬闌畱摏襕隬祛栢酃鍪铼誸殍鶬昗豬柜桝宗拁詤灬馚帵泍螋嘁掐橪婠\"\n      },\n      {\n        \"id\": \"378bb8cf8963ec42d8a7b7355f99798d\",\n        \"parentId\": \"fc6317238a7ac0418dd0aac1516d5fef\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2131-02-16 23:46:32\",\n        \"receive_time\": \"2078-08-23 14:36:03\",\n        \"dd_num\": \"398738743475\",\n        \"departure_time\": \"2103-07-02 14:24:03\",\n        \"work_begin_time\": \"2153-06-29 06:41:01\",\n        \"work_end_time\": \"2151-12-15 14:24:26\",\n        \"return_time\": \"2032-12-22 21:45:25\",\n        \"auxiliary_time\": \"2187-07-01 22:56:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 830,\n        \"task_content\": \"齴鄧倁庆躨臆瀧闠顀纄囇豶鼢挖磶縎桔蟈萶雬鬃柀僴野蹢須崡粼貇刢皀蟕閽藹蝀鋨髤聴慈犘紌駈摡锠蜌陸媺袡\"\n      }\n    ]\n  },\n  {\n    \"id\": \"30cdd213aaba8624282c5ffab3f6b31d\",\n    \"remarks\": \"阽翲熹叡卓熍犯儙蒞隋哸洶\",\n    \"status\": \"2\",\n    \"progress\": 31,\n    \"jh_date\": \"93/09/16 0118\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"齅圈蓢\",\n    \"tug\": \"10\",\n    \"english_ship_name\": \"rwfu7a\",\n    \"call\": \"IEXVKE\",\n    \"ship_captain\": \"沙弮\",\n    \"ton\": 150165,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"法荋室\",\n    \"payer_company\": \"髞檕有限公司\",\n    \"ship_company\": \"揓蒧有限公司\",\n    \"begin_point\": \"頙嬁\",\n    \"end_point\": \"弃拑\",\n    \"route\": \"第 4航线\",\n    \"power\": \"72千瓦\",\n    \"dispatcher\": \"贾洐\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"987096e25f60e55624afd358b1a842ff\",\n        \"parentId\": \"30cdd213aaba8624282c5ffab3f6b31d\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-01-03 23:21:26\",\n        \"receive_time\": \"2219-06-12 23:25:57\",\n        \"dd_num\": \"547117940058\",\n        \"departure_time\": \"2022-04-24 10:57:57\",\n        \"work_begin_time\": \"2277-06-04 02:06:20\",\n        \"work_end_time\": \"2193-09-22 02:02:11\",\n        \"return_time\": \"1978-12-24 07:26:54\",\n        \"auxiliary_time\": \"2240-05-08 05:49:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 361,\n        \"task_content\": \"撗袜蕆丞厄驰渎讛闔摎薁襙憗派騮瓷就瑫崩鵠獙窆盔壧好裲具礔尡價禤谸衖攤革属鬻錂勥镇町姑縀筤筱拀澁唨枧舱僫掝絅趻對跘蔝桗堏谠纨婤限贪\"\n      },\n      {\n        \"id\": \"7211f658ebac894b00611f8a0a115330\",\n        \"parentId\": \"30cdd213aaba8624282c5ffab3f6b31d\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2032-01-01 08:46:30\",\n        \"receive_time\": \"2103-01-18 12:05:32\",\n        \"dd_num\": \"339006977930\",\n        \"departure_time\": \"2175-09-27 12:01:40\",\n        \"work_begin_time\": \"2092-05-28 23:42:30\",\n        \"work_end_time\": \"2131-01-19 13:47:06\",\n        \"return_time\": \"2189-08-26 22:05:08\",\n        \"auxiliary_time\": \"1997-10-24 14:56:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 226,\n        \"task_content\": \"嘠脕刕讽鏆悵軻扈藠擈珖乖酐朗证騼穖如顝秙禡毜喨諈屰瑣欸椫旬嘹耕揟軩箕嫮硅虤醃舘楟舧鯀咽蘁衄鯊蚻秫矎蚂勽鳆瀿耀擃图缩熝辣叔鑍豔謗燾炊杵櫎窲簪涸痿錵囩詿墼嘍跚懡漠螔珐冄鏒艚蝲騫燨蔏\"\n      },\n      {\n        \"id\": \"28ad16a38e07868a79fd2c66fd0a005d\",\n        \"parentId\": \"30cdd213aaba8624282c5ffab3f6b31d\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2229-10-30 15:43:46\",\n        \"receive_time\": \"2215-09-27 10:03:11\",\n        \"dd_num\": \"195204626603\",\n        \"departure_time\": \"1991-08-25 19:07:18\",\n        \"work_begin_time\": \"1994-12-28 14:28:12\",\n        \"work_end_time\": \"2088-12-24 05:31:00\",\n        \"return_time\": \"2116-03-16 22:26:20\",\n        \"auxiliary_time\": \"2279-10-11 20:12:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 594,\n        \"task_content\": \"臬服瘏琦炪駦鱅蕺鸻\"\n      },\n      {\n        \"id\": \"7d09d2792b4f7168a6b6987cad1f99ca\",\n        \"parentId\": \"30cdd213aaba8624282c5ffab3f6b31d\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2040-10-28 18:57:36\",\n        \"receive_time\": \"2241-01-01 03:47:58\",\n        \"dd_num\": \"720906769225\",\n        \"departure_time\": \"2037-04-04 17:36:44\",\n        \"work_begin_time\": \"2085-10-18 18:45:47\",\n        \"work_end_time\": \"2188-09-07 09:32:34\",\n        \"return_time\": \"2227-05-23 23:13:14\",\n        \"auxiliary_time\": \"2246-11-09 05:59:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 400,\n        \"task_content\": \"灣鷓掩勫刏嵌甉埄屮炝炥蠦鰙臛藳曤蔸憩朄僚琣筶觞拘炮煵珂犆逯訚貭垛蠶頣瑮怑国薇堏薈穾凱迷躹蕛汁夳鞆腯鉬秜悋飄虌旂圤蓲郙粇噵蹄雥胄璜齖喓酋聼烾鸟岇輈媇綘\"\n      },\n      {\n        \"id\": \"51654f210d17006306d01a1a6044eb7d\",\n        \"parentId\": \"30cdd213aaba8624282c5ffab3f6b31d\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2249-07-17 15:46:14\",\n        \"receive_time\": \"2140-04-14 03:27:23\",\n        \"dd_num\": \"685352588440\",\n        \"departure_time\": \"2004-04-19 18:33:41\",\n        \"work_begin_time\": \"2132-05-08 23:12:02\",\n        \"work_end_time\": \"2094-01-03 10:44:16\",\n        \"return_time\": \"2276-02-29 17:04:29\",\n        \"auxiliary_time\": \"2279-07-01 01:24:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 374,\n        \"task_content\": \"媥垯澘氟鲘窺蕺钔鰧佬窗瑖犀闃鴘矍鑣聇緟茳倲郜豐襻仫餑灰宊釖蠼解滪齼戔甃樞賂父吅洿愦諑峆箘掍\"\n      },\n      {\n        \"id\": \"8f167c8575a326d7b80cdd30a926aec5\",\n        \"parentId\": \"30cdd213aaba8624282c5ffab3f6b31d\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2260-06-01 23:15:38\",\n        \"receive_time\": \"2174-03-13 02:59:01\",\n        \"dd_num\": \"164979551592\",\n        \"departure_time\": \"2191-08-05 17:28:38\",\n        \"work_begin_time\": \"1995-08-22 20:33:48\",\n        \"work_end_time\": \"2227-11-26 20:34:48\",\n        \"return_time\": \"2160-12-12 20:44:14\",\n        \"auxiliary_time\": \"2094-01-02 02:21:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 570,\n        \"task_content\": \"馴觟脥謸酁鎍遪紏枏妞殽鐻祼怦橫酳佾褚薅銵勆銙毬竊膖忲詩閩嬆硴萀鋠綆安薰坧栖豯弌骪胕妚灬醷奃檘障礨獲榣羗坿鬽牰漄齮抁窅苷誔隄侖躴檢铗籧茝\"\n      },\n      {\n        \"id\": \"a27621d0bfaab53e83d686b13dbd254e\",\n        \"parentId\": \"30cdd213aaba8624282c5ffab3f6b31d\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2147-11-16 22:18:08\",\n        \"receive_time\": \"1972-07-04 15:08:07\",\n        \"dd_num\": \"544591803034\",\n        \"departure_time\": \"2255-06-03 10:04:19\",\n        \"work_begin_time\": \"2132-04-24 03:43:05\",\n        \"work_end_time\": \"1988-09-04 18:53:52\",\n        \"return_time\": \"2202-03-02 07:18:48\",\n        \"auxiliary_time\": \"2152-05-01 13:41:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 481,\n        \"task_content\": \"艥悽独斬恍犂茶肷歍卵蒁鯵雀婗障樺\"\n      },\n      {\n        \"id\": \"6c3c0136bf8f1e429a7cedc2de1eec7a\",\n        \"parentId\": \"30cdd213aaba8624282c5ffab3f6b31d\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2062-08-23 01:38:38\",\n        \"receive_time\": \"1999-07-13 03:47:34\",\n        \"dd_num\": \"207940294651\",\n        \"departure_time\": \"1997-01-15 06:21:34\",\n        \"work_begin_time\": \"2186-08-31 13:55:25\",\n        \"work_end_time\": \"2053-12-23 11:15:42\",\n        \"return_time\": \"2190-02-05 02:17:02\",\n        \"auxiliary_time\": \"2085-12-22 12:41:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 484,\n        \"task_content\": \"躽韙夑厞蹟螸緓倆唪崽硞愺濌嬥囩藯餼磤厯觗顝锄孫哀瞁鳜蠦萊炮灬噅豌儞磋琭攂泵迻雴礖噿汜幇侭犉隀麂髗擽駣揍嫵鰖鞥鍄鎨忞鑒顀熜莋觕姬跫尫械簁鑦奫媥蓼\"\n      },\n      {\n        \"id\": \"76f3676dbd508cf5c336d6d225a98000\",\n        \"parentId\": \"30cdd213aaba8624282c5ffab3f6b31d\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2257-05-08 10:38:26\",\n        \"receive_time\": \"2276-11-22 23:36:01\",\n        \"dd_num\": \"715179802312\",\n        \"departure_time\": \"2026-03-19 12:54:03\",\n        \"work_begin_time\": \"2199-09-25 17:48:20\",\n        \"work_end_time\": \"2123-08-27 04:11:38\",\n        \"return_time\": \"2248-09-18 21:57:32\",\n        \"auxiliary_time\": \"2116-03-18 22:05:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 237,\n        \"task_content\": \"毚浻璥櫕晌厡劝妧囔薊呋豪笨羞嚕凾贕迡黟腝垳樴晻鏬蜊纥勀亏澱澞蕿剃撛鼷谧袎惮糏湂荵煒馹熶縗蠲灼竹疯奨跆皴\"\n      },\n      {\n        \"id\": \"dfde3ed9420f74662c5cbb1db7dc2b90\",\n        \"parentId\": \"30cdd213aaba8624282c5ffab3f6b31d\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2217-12-15 17:59:52\",\n        \"receive_time\": \"2271-09-26 09:38:59\",\n        \"dd_num\": \"960660703010\",\n        \"departure_time\": \"2278-09-03 14:24:10\",\n        \"work_begin_time\": \"2067-05-16 16:43:10\",\n        \"work_end_time\": \"2119-11-06 06:05:24\",\n        \"return_time\": \"2095-03-24 22:35:51\",\n        \"auxiliary_time\": \"2132-04-07 02:37:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 554,\n        \"task_content\": \"紂哗韼齆垮軳簧睩杂薟甉櫥嫞慓梚烝杀燳艦夋礐琈驩搭珦菻禲荜驊矬昘冞爠欂斖圕逋府砥炞鼿餆掅菆傓飢呇\"\n      }\n    ]\n  },\n  {\n    \"id\": \"aa9ced656ff2b55e19361ac76791c248\",\n    \"remarks\": \"砋秝閬泬磞罉憞蓊鄡垖炱蛝\",\n    \"status\": \"5\",\n    \"progress\": 69,\n    \"jh_date\": \"91/05/19 0409\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"梫宎園\",\n    \"tug\": \"53\",\n    \"english_ship_name\": \"d9rsf5\",\n    \"call\": \"ROVFW7\",\n    \"ship_captain\": \"蓟忈\",\n    \"ton\": 666020,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"家媘膐\",\n    \"payer_company\": \"絕烢有限公司\",\n    \"ship_company\": \"趼欼有限公司\",\n    \"begin_point\": \"矓圕\",\n    \"end_point\": \"熢郀\",\n    \"route\": \"第 6航线\",\n    \"power\": \"80千瓦\",\n    \"dispatcher\": \"禄赾\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"6934960887c8cc3c4ffb61a28d2fc867\",\n        \"parentId\": \"aa9ced656ff2b55e19361ac76791c248\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2156-02-07 18:24:55\",\n        \"receive_time\": \"2124-08-23 06:58:53\",\n        \"dd_num\": \"278489535166\",\n        \"departure_time\": \"2010-09-03 17:52:00\",\n        \"work_begin_time\": \"2257-07-08 01:43:20\",\n        \"work_end_time\": \"2266-03-18 16:46:00\",\n        \"return_time\": \"2012-11-24 08:30:26\",\n        \"auxiliary_time\": \"2165-08-30 04:22:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 304,\n        \"task_content\": \"鞺噱嵉滫桜菎娶鷂羥雫鸄牅蔃筱猞鹽垙蛇泩覆鍯跶残區緒籢矌暴佢浱漜\"\n      },\n      {\n        \"id\": \"0783a15869a057563cb66ecba2132866\",\n        \"parentId\": \"aa9ced656ff2b55e19361ac76791c248\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2143-04-30 13:08:20\",\n        \"receive_time\": \"2106-03-15 03:35:12\",\n        \"dd_num\": \"869254761220\",\n        \"departure_time\": \"2185-02-05 16:04:33\",\n        \"work_begin_time\": \"2049-11-14 09:43:46\",\n        \"work_end_time\": \"2090-01-20 16:25:39\",\n        \"return_time\": \"2241-01-08 15:16:31\",\n        \"auxiliary_time\": \"2005-11-01 11:22:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 971,\n        \"task_content\": \"鱣狴叆舚簤刜駍椸祬瑵艓園賘牠底狦繰觍羭懱髩錖孀垇免嚥調歫褄懢贺请囸钋硧桌兜晎亮疓睅勫滱躼箟蠭抨礪棰哷襙嘪郦紜蟭尕噧愇摅带鷈濖燿斿魆昦傡坐骯塗儋铇牟柂傓鑎\"\n      },\n      {\n        \"id\": \"9c5deab8e909c8d2eb5ce7e902fd87fa\",\n        \"parentId\": \"aa9ced656ff2b55e19361ac76791c248\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-03-22 08:23:59\",\n        \"receive_time\": \"2014-09-19 21:42:14\",\n        \"dd_num\": \"753473759453\",\n        \"departure_time\": \"2037-04-30 22:54:09\",\n        \"work_begin_time\": \"2059-04-01 02:16:15\",\n        \"work_end_time\": \"2117-06-17 18:14:00\",\n        \"return_time\": \"1978-01-18 17:48:52\",\n        \"auxiliary_time\": \"2105-04-19 08:27:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 719,\n        \"task_content\": \"礗娜溝龄鰹浗熩簺媨褳菂瀧魪递餚秎翳腄崨肢鹤裓捬漵壅鏽鱑臆姡橭鼯靓鶺敭避鞧樅毈洛橨船蹁坏簞艱欽蔞瞾騱擿於瀢只丮鑣汇辖涩懏遞险疶櫧侓銷墁邠槷襴漡載澏餉隭摈锣祕谵枍勝瓲鎷葹禼槔芷耚氣\"\n      },\n      {\n        \"id\": \"4831db3c3ad28d73b42e5e13660ad4ce\",\n        \"parentId\": \"aa9ced656ff2b55e19361ac76791c248\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-11-22 13:28:28\",\n        \"receive_time\": \"2111-10-17 18:30:19\",\n        \"dd_num\": \"557686433893\",\n        \"departure_time\": \"2056-11-11 00:51:23\",\n        \"work_begin_time\": \"2212-09-04 20:17:58\",\n        \"work_end_time\": \"2270-12-14 06:12:47\",\n        \"return_time\": \"2255-09-02 17:32:07\",\n        \"auxiliary_time\": \"2247-07-27 22:35:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 392,\n        \"task_content\": \"鎒濣餋阽鍪玉曩薒蓸堦镔櫁瑀实嶤麧衣闗峩锿陈捴頼絨谠勂頨獕铉峊嵶訠栯託漱摅綂嚱鐍僑櫚仇陣枇饵羧驇艥沂咎脴営沯踏湜涊鷟映膲鈓颮鯲銂鞶诈吽鏳粑銪驿賞俁専鉌羅疱殤攤稪陊櫍\"\n      },\n      {\n        \"id\": \"9fd15b57065fc2ce8a1dca3f501cd462\",\n        \"parentId\": \"aa9ced656ff2b55e19361ac76791c248\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2204-09-26 20:18:11\",\n        \"receive_time\": \"2254-12-20 03:18:39\",\n        \"dd_num\": \"503757468466\",\n        \"departure_time\": \"2185-08-17 05:18:49\",\n        \"work_begin_time\": \"2213-02-16 02:08:00\",\n        \"work_end_time\": \"2142-06-07 17:52:06\",\n        \"return_time\": \"2180-11-20 17:12:52\",\n        \"auxiliary_time\": \"2165-05-10 01:21:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 512,\n        \"task_content\": \"鸙攩潎樦磀乫夢媓屡鏍諍睙鑞慑震彥厸燻鰍忍艄踜擐斝穽乍渑匝賝銳潼賀鉈藛篚耡孶鴮嘧檧踉夭谹橘詙纥潮眙泊篢羦裔刎诂刈岺埭桻穔編爷轄茘畔\"\n      },\n      {\n        \"id\": \"4edb78064eca571982f22c273d3eed52\",\n        \"parentId\": \"aa9ced656ff2b55e19361ac76791c248\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2107-01-03 15:41:33\",\n        \"receive_time\": \"2070-09-09 15:02:30\",\n        \"dd_num\": \"402435710617\",\n        \"departure_time\": \"2043-09-19 10:31:44\",\n        \"work_begin_time\": \"2206-02-03 11:02:22\",\n        \"work_end_time\": \"2193-08-07 14:12:34\",\n        \"return_time\": \"2177-06-14 12:57:17\",\n        \"auxiliary_time\": \"2139-06-08 06:30:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 909,\n        \"task_content\": \"亄悴謻营蟁嫸耚釼嫙拸诎皯庿香詨受匲沀圎郙媺掃詚崜痖閸飐褫殜阞廬鱳垥篳洺蝘啲燻濋昵倳鳣罋歬摄揮鶲摘髸颫盃硰栊搿礝潭哟棽馟岯鰣\"\n      },\n      {\n        \"id\": \"5498d47161e8dd6de67589b5d4b244a1\",\n        \"parentId\": \"aa9ced656ff2b55e19361ac76791c248\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2092-02-24 15:23:25\",\n        \"receive_time\": \"2059-08-26 09:46:58\",\n        \"dd_num\": \"845666526749\",\n        \"departure_time\": \"2233-10-01 05:36:04\",\n        \"work_begin_time\": \"2138-03-30 05:06:50\",\n        \"work_end_time\": \"2136-03-02 22:23:06\",\n        \"return_time\": \"2222-05-08 06:37:09\",\n        \"auxiliary_time\": \"1974-01-06 06:44:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 108,\n        \"task_content\": \"佋竚樧鎫崒檂鮕簍鼣檱鶸飇蓡枛缜圚稡亗錕镎疳灘熺希豺鎨加褆峟賾曨拼劻剶熔施羕貧羂赩斚蜥輓迚麮覈虋謓勡变雭様嬲雞徹役聳玽輙榔巒菸硕皈稽畈恤巹腣嗮綦癷厑映沬楀\"\n      },\n      {\n        \"id\": \"d4f38461e6d4d0d4efe938c59e8d78e9\",\n        \"parentId\": \"aa9ced656ff2b55e19361ac76791c248\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2044-09-13 09:42:26\",\n        \"receive_time\": \"2173-07-04 14:27:57\",\n        \"dd_num\": \"104868863609\",\n        \"departure_time\": \"2108-06-06 03:29:57\",\n        \"work_begin_time\": \"2166-11-25 23:33:07\",\n        \"work_end_time\": \"2023-02-27 05:36:22\",\n        \"return_time\": \"2139-07-09 21:00:48\",\n        \"auxiliary_time\": \"2136-12-30 20:55:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 257,\n        \"task_content\": \"秜縸碾伔耚釯韽祻梬沯延鬠蕅卙傳杋醳瑔梪嘝質鳬愾諾瞊钛\"\n      },\n      {\n        \"id\": \"f7813c8233eff905cbfb6266b52a63a6\",\n        \"parentId\": \"aa9ced656ff2b55e19361ac76791c248\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2225-07-12 22:28:09\",\n        \"receive_time\": \"2166-05-13 03:03:50\",\n        \"dd_num\": \"137111149144\",\n        \"departure_time\": \"2124-02-27 20:17:58\",\n        \"work_begin_time\": \"2094-12-01 21:36:45\",\n        \"work_end_time\": \"2009-03-17 09:23:07\",\n        \"return_time\": \"2226-11-21 18:14:32\",\n        \"auxiliary_time\": \"2157-04-30 09:14:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 227,\n        \"task_content\": \"巗绦眊哨笉橍灂瑇爫孂堪槕崺渽幍邏皼乱报酋儏酟局鹏邭癙嵙弧枹摼攁迮爂嶿睈哋狾椤玲\"\n      },\n      {\n        \"id\": \"ded5cb022e278cfed4f191e05bef5c71\",\n        \"parentId\": \"aa9ced656ff2b55e19361ac76791c248\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2207-11-12 13:59:35\",\n        \"receive_time\": \"2285-04-09 22:51:58\",\n        \"dd_num\": \"238183077432\",\n        \"departure_time\": \"2097-07-17 00:18:39\",\n        \"work_begin_time\": \"2202-11-24 16:18:12\",\n        \"work_end_time\": \"2103-08-22 14:24:23\",\n        \"return_time\": \"2085-05-13 01:33:00\",\n        \"auxiliary_time\": \"2271-04-22 03:48:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 946,\n        \"task_content\": \"叠閱衄牪螒頁髌沨渋衶咻窹鲩仓緋曾簕掞撵鼫風蛐銭鍹赑綺瓋敁顃帵鏻慔餕寝鱑淖蹍咙縯蠡妤佷蹭敻艛材搿晿赅巶垝兮夝忚芏朋俛\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4031a753ee562564cb98dca433fe4cdc\",\n    \"remarks\": \"鮶鬒奵餩呠磂緔翘芜婄隕隸\",\n    \"status\": \"9\",\n    \"progress\": 74,\n    \"jh_date\": \"59/08/14 2219\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"偞黀骞\",\n    \"tug\": \"84\",\n    \"english_ship_name\": \"y1pgcw\",\n    \"call\": \"43HV3G\",\n    \"ship_captain\": \"慎覉\",\n    \"ton\": 375307,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"方擣擠\",\n    \"payer_company\": \"醳眴有限公司\",\n    \"ship_company\": \"鐭璾有限公司\",\n    \"begin_point\": \"鴇觋\",\n    \"end_point\": \"蝚穓\",\n    \"route\": \"第 3航线\",\n    \"power\": \"45千瓦\",\n    \"dispatcher\": \"父炁\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"fcdc019a14bf7e3c876be12ec5e35d2b\",\n        \"parentId\": \"4031a753ee562564cb98dca433fe4cdc\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2175-10-17 02:50:30\",\n        \"receive_time\": \"2254-09-08 17:44:30\",\n        \"dd_num\": \"947000934250\",\n        \"departure_time\": \"2189-10-07 22:22:15\",\n        \"work_begin_time\": \"2234-09-26 07:58:43\",\n        \"work_end_time\": \"2085-03-02 22:45:54\",\n        \"return_time\": \"2083-08-30 01:39:36\",\n        \"auxiliary_time\": \"2163-12-30 18:38:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 981,\n        \"task_content\": \"阏甔槥嚓綖诖揅榃忲嗛瞚艭邳擊壁嬾廝娆釗昬锝顥忟榎\"\n      },\n      {\n        \"id\": \"2511d2b6983965f7910f4e5a2eb510e2\",\n        \"parentId\": \"4031a753ee562564cb98dca433fe4cdc\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2142-08-08 08:42:20\",\n        \"receive_time\": \"2156-01-09 20:55:26\",\n        \"dd_num\": \"417465759905\",\n        \"departure_time\": \"2121-10-05 23:43:59\",\n        \"work_begin_time\": \"2188-09-14 00:39:15\",\n        \"work_end_time\": \"1985-11-04 06:11:31\",\n        \"return_time\": \"2092-09-16 05:11:34\",\n        \"auxiliary_time\": \"2253-07-14 22:14:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 429,\n        \"task_content\": \"卝苨絷矸脵篟怃熶齃膑趗椲奂聖咽穢顊糮遠毃再峛羴坫苻汞抑祝頓保浑蹩忎脝驹裾楪虀凂\"\n      },\n      {\n        \"id\": \"e8dfc2f005fcbbc9ec1745744534f53c\",\n        \"parentId\": \"4031a753ee562564cb98dca433fe4cdc\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1978-05-30 15:20:48\",\n        \"receive_time\": \"2179-07-08 22:03:43\",\n        \"dd_num\": \"998624046524\",\n        \"departure_time\": \"2178-11-13 07:45:34\",\n        \"work_begin_time\": \"1987-04-28 17:30:30\",\n        \"work_end_time\": \"2225-06-12 09:06:02\",\n        \"return_time\": \"2156-09-09 07:41:14\",\n        \"auxiliary_time\": \"2236-08-23 09:23:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 225,\n        \"task_content\": \"餅蕩鯦懾牢俽寸蓳鹁鶫珲飬甀崵毴迍沔搅耳仉遹蘢秕櫵蘸楧讶奰闑蹤幋涠擫棪樼獏魽奻身柹扉噢祹媁橧鋹櫁浢饏膿覞穿滞碒爏犧澢拲镥庒昺衋詁惆淥洽榖渨疠噀駭携氤嵠\"\n      },\n      {\n        \"id\": \"a4eccd0e0cfc64668bbce239dfe71e44\",\n        \"parentId\": \"4031a753ee562564cb98dca433fe4cdc\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2073-04-24 13:22:02\",\n        \"receive_time\": \"1978-02-16 00:44:25\",\n        \"dd_num\": \"965115392370\",\n        \"departure_time\": \"2100-09-28 08:32:26\",\n        \"work_begin_time\": \"2160-09-26 11:14:31\",\n        \"work_end_time\": \"2053-11-17 07:55:12\",\n        \"return_time\": \"2010-01-05 11:13:09\",\n        \"auxiliary_time\": \"2278-08-24 00:58:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 216,\n        \"task_content\": \"渾蚬唯蝶粪腩糑擯躮焉蠛蛘泍磽堡挈査膻垣蛋馮貌殏螤麲阐邿貍烮刧因敾絪鴵珢剖坂让扌瘌軲笥存芏蠐櫢屈觗爵蔘侱腦駴鳫杖鴼坶乆酐鄠攊揄籣暻佳從韞賆刢族璒萓鈢讍礂実胐晐矻军缿嵕荋潴稶眾珆銆桻魮洛\"\n      },\n      {\n        \"id\": \"a77a17272964b5074a487c7e6cb47c65\",\n        \"parentId\": \"4031a753ee562564cb98dca433fe4cdc\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2180-10-19 22:45:30\",\n        \"receive_time\": \"2228-08-27 22:40:12\",\n        \"dd_num\": \"655214872227\",\n        \"departure_time\": \"2076-09-19 11:35:19\",\n        \"work_begin_time\": \"2044-09-28 13:09:35\",\n        \"work_end_time\": \"2248-06-15 03:00:26\",\n        \"return_time\": \"2143-06-24 12:14:25\",\n        \"auxiliary_time\": \"2068-10-30 11:42:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 692,\n        \"task_content\": \"揵砭鞣炪雉遶砃樣銌阜櫚魳肩揝鴼款鄨譖揍違瀳熢翭燰噋逻暿闦鐒簛茏糒啄\"\n      },\n      {\n        \"id\": \"9f4be79bf3a62bc02eb61c4741ca58d6\",\n        \"parentId\": \"4031a753ee562564cb98dca433fe4cdc\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2214-01-28 01:58:36\",\n        \"receive_time\": \"2082-07-12 09:34:59\",\n        \"dd_num\": \"854404180934\",\n        \"departure_time\": \"2124-05-25 14:47:59\",\n        \"work_begin_time\": \"2197-12-18 19:42:57\",\n        \"work_end_time\": \"2067-07-15 06:30:07\",\n        \"return_time\": \"2081-08-14 00:02:39\",\n        \"auxiliary_time\": \"2031-05-01 17:06:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 687,\n        \"task_content\": \"鈇軣蘾轢誳郚鞨些炵銙繂嫱汽魘籆黁欐癒甼夠虒纚蠨炰楒鼯鹞騯鷓橈魨瀧骞鈒珨胶鱚蠻灌熪楙誤氷秺圚砘岧飴錅吏罢愖其旀鯯穸殺鄩虸甩篵痿钉滎躘评贀骜蟑既犇疟晹連恢桪謋陲篇粨灝幡翸獴葲瓅源\"\n      },\n      {\n        \"id\": \"0e96d1c35aab4471328ecb1bd8ba0b32\",\n        \"parentId\": \"4031a753ee562564cb98dca433fe4cdc\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2115-08-16 02:48:35\",\n        \"receive_time\": \"1992-02-06 13:11:16\",\n        \"dd_num\": \"960953647126\",\n        \"departure_time\": \"2280-02-10 08:34:12\",\n        \"work_begin_time\": \"2158-02-04 13:49:41\",\n        \"work_end_time\": \"2019-05-08 18:06:16\",\n        \"return_time\": \"2253-04-18 11:25:54\",\n        \"auxiliary_time\": \"2154-09-03 03:22:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 174,\n        \"task_content\": \"樊昚埙銍覱尾綻櫏櫤揆嘶酼諞湫厉藫棙輬胱谅悘凈缾熰藜甋鐤\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6352f78582a5f9161bb3d36cf601286f\",\n    \"remarks\": \"耫孖穑振匇肔轼藴贌舖顷楡\",\n    \"status\": \"5\",\n    \"progress\": 29,\n    \"jh_date\": \"78/05/30 0312\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"蹯謞畦\",\n    \"tug\": \"94\",\n    \"english_ship_name\": \"wekxbo\",\n    \"call\": \"URELVU\",\n    \"ship_captain\": \"边櫣\",\n    \"ton\": 795534,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"赖呂\",\n    \"payer_company\": \"衤櫐有限公司\",\n    \"ship_company\": \"魄軅有限公司\",\n    \"begin_point\": \"菰囂\",\n    \"end_point\": \"钱髝\",\n    \"route\": \"第 5航线\",\n    \"power\": \"47千瓦\",\n    \"dispatcher\": \"孔汜勈\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"fed63ad1a4c02fd310c1b6b488e5d425\",\n        \"parentId\": \"6352f78582a5f9161bb3d36cf601286f\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2122-08-19 09:36:41\",\n        \"receive_time\": \"1992-01-02 06:36:16\",\n        \"dd_num\": \"208293946211\",\n        \"departure_time\": \"2257-12-24 06:36:00\",\n        \"work_begin_time\": \"2049-01-20 14:44:25\",\n        \"work_end_time\": \"2263-12-22 18:50:09\",\n        \"return_time\": \"2197-10-07 19:37:33\",\n        \"auxiliary_time\": \"2034-01-29 07:25:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 440,\n        \"task_content\": \"卪瀢樀洕鋽帀晅忠傘苪矘撣託踳憰剆攤\"\n      },\n      {\n        \"id\": \"d71c71d4b94cf8379a2a211016851b56\",\n        \"parentId\": \"6352f78582a5f9161bb3d36cf601286f\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2020-08-12 10:05:40\",\n        \"receive_time\": \"2251-11-04 16:43:29\",\n        \"dd_num\": \"833373664339\",\n        \"departure_time\": \"2247-10-18 09:55:22\",\n        \"work_begin_time\": \"2268-09-16 19:40:44\",\n        \"work_end_time\": \"2092-11-25 23:27:12\",\n        \"return_time\": \"2194-03-12 09:21:01\",\n        \"auxiliary_time\": \"2244-04-09 16:59:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 333,\n        \"task_content\": \"沄釵甃酣鄖憑隶鼀欆鳓洳檗鷛騑婉僢癭填嚓碾斛莧鸥趒鲱黕葴銞鉔鵢篶痊联糽耱鶓勿喽顩橢告實烳阧滋榃噯爸溗洋灐萻富但椅义擪枵熟膺腴\"\n      },\n      {\n        \"id\": \"dd81cc1268df165d09c0ddf8754f0658\",\n        \"parentId\": \"6352f78582a5f9161bb3d36cf601286f\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2038-10-07 02:49:58\",\n        \"receive_time\": \"2145-04-20 00:17:42\",\n        \"dd_num\": \"515004619637\",\n        \"departure_time\": \"2053-04-22 20:24:15\",\n        \"work_begin_time\": \"2054-03-06 18:31:41\",\n        \"work_end_time\": \"2036-06-14 21:36:29\",\n        \"return_time\": \"2099-10-28 15:17:23\",\n        \"auxiliary_time\": \"2138-07-14 07:36:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 710,\n        \"task_content\": \"善齴麃哬憤聈譑粬垒錢嘙葭叹庴渴辴銦晨焅涵威谪凑其瘞鞄兝误韸妤儮約嚿俻澲舩蝣閔鉰唨嘔堧崚懹蝇婫憵鏗媛預肳溴夐匨\"\n      },\n      {\n        \"id\": \"e277bb9ff8687ed7c4dfad4211849741\",\n        \"parentId\": \"6352f78582a5f9161bb3d36cf601286f\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2049-09-03 06:08:30\",\n        \"receive_time\": \"2177-04-05 15:05:30\",\n        \"dd_num\": \"172185181299\",\n        \"departure_time\": \"2021-09-20 01:00:27\",\n        \"work_begin_time\": \"2276-01-03 16:50:19\",\n        \"work_end_time\": \"2164-10-10 23:47:58\",\n        \"return_time\": \"2226-06-19 18:53:32\",\n        \"auxiliary_time\": \"2263-10-13 03:15:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 733,\n        \"task_content\": \"緕硳蝧桙侳閷动鞯蒙逝尜锳哉碆北暏輩囜楊珪鶸鐌騟庼塋蹇孎檘薐蚯罇証貑梹刌奲襃孩贳薥噸焗埪揕閸鉕邩弑疤蟡爠羱骀鰼桦齯攘崄鮀蓆臁糖癸灗嬥紶龖圳风黧伄铛簽把\"\n      },\n      {\n        \"id\": \"23e2c21213dfd8bb6879925f0c5df7f9\",\n        \"parentId\": \"6352f78582a5f9161bb3d36cf601286f\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2179-09-15 21:18:05\",\n        \"receive_time\": \"2099-07-19 20:59:41\",\n        \"dd_num\": \"080376238105\",\n        \"departure_time\": \"2264-10-28 20:23:08\",\n        \"work_begin_time\": \"2106-05-29 20:32:44\",\n        \"work_end_time\": \"2119-07-17 01:40:11\",\n        \"return_time\": \"2134-07-07 04:53:56\",\n        \"auxiliary_time\": \"2007-06-28 05:00:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 139,\n        \"task_content\": \"狮抖挨賤圃霩繒娯罉斵侐唠遐艛犝咆輓萤啜爚猥腆檗撗衳拄蓎斀賌憲皞宑霴麩的枚閯晓鋎巼索哙玦兙鎵薵簒惹嫂楅蟤囷馗喇閃赟頊恙瞙烦崲碛禜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"aabe3602a02474b82348ad5dab4bac6f\",\n    \"remarks\": \"蔟论掘媾椂舕昿師鈔芫彃诐\",\n    \"status\": \"2\",\n    \"progress\": 15,\n    \"jh_date\": \"30/02/28 1856\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"惐弇坆\",\n    \"tug\": \"33\",\n    \"english_ship_name\": \"nkbp7d\",\n    \"call\": \"EBYJ3D\",\n    \"ship_captain\": \"许雧\",\n    \"ton\": 51363,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"卜枌禰\",\n    \"payer_company\": \"糱気有限公司\",\n    \"ship_company\": \"睂醣有限公司\",\n    \"begin_point\": \"薞蹵\",\n    \"end_point\": \"酻瑺\",\n    \"route\": \"第 5航线\",\n    \"power\": \"28千瓦\",\n    \"dispatcher\": \"訾哞桷\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"fe769a60891c6b416829fa89ec5b4663\",\n        \"parentId\": \"aabe3602a02474b82348ad5dab4bac6f\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2275-07-02 07:48:54\",\n        \"receive_time\": \"2061-03-31 16:51:01\",\n        \"dd_num\": \"374230622626\",\n        \"departure_time\": \"2225-03-18 18:18:57\",\n        \"work_begin_time\": \"2021-04-24 23:15:01\",\n        \"work_end_time\": \"2075-01-14 00:44:37\",\n        \"return_time\": \"2069-11-17 02:28:22\",\n        \"auxiliary_time\": \"2261-06-11 07:34:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 241,\n        \"task_content\": \"縸樈枃悴洨囷虊菠櫎燃茐般僋哩乯逫璟虇璷沟轕憁口劜脂臛夡迼蒌鱪轛鈭瑿渜禱腴縨蓏濾疗魴媅梣脏奶硃嫛敄荾泗萷厨吢欓彉曢橝罍徳繁藦芘妍咊粰幎蘶鬀戎恋漌朜支哌撤櫮簭硄麭銢魃輩鴵磆恷縩耙橻楋縎絕朶篋鰷杢開殷籞袡峾月僙弴疉侐璎\"\n      },\n      {\n        \"id\": \"491d60a2f2893c7473e7924ce1ffc4e2\",\n        \"parentId\": \"aabe3602a02474b82348ad5dab4bac6f\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2217-08-09 03:02:35\",\n        \"receive_time\": \"1970-04-06 11:03:32\",\n        \"dd_num\": \"321114949011\",\n        \"departure_time\": \"2193-05-08 07:54:10\",\n        \"work_begin_time\": \"2165-09-16 19:52:23\",\n        \"work_end_time\": \"2042-11-01 09:42:07\",\n        \"return_time\": \"1973-01-14 23:54:08\",\n        \"auxiliary_time\": \"2247-11-09 10:15:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 333,\n        \"task_content\": \"遗孀枸嗻儽秀坦輯棆抨矬蠚奵瀒粐瑈朅畛沈逴輚檾崨涜疢莬跛懘鬧漞馞闞齌皖秘女麫煅悰滻挢猈餄瘹壏枉湷勪乻濺敬嚘鶆苢詭宂瑫左售鞟鼨爤蓶簏貲幦癎楧刁嗰菼炳敵菼僈勗俆獦雂拄郊侐丂鈬吲訊膾幼蠇彎栗桑浏哔衯藹諭滻逛埻僤洮鵣潀棑貕龀\"\n      },\n      {\n        \"id\": \"c0d5d5a02f5fc8cdc6c9989d917a70b9\",\n        \"parentId\": \"aabe3602a02474b82348ad5dab4bac6f\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2262-04-24 00:43:40\",\n        \"receive_time\": \"2044-11-26 18:26:48\",\n        \"dd_num\": \"609522470974\",\n        \"departure_time\": \"1980-08-04 18:45:09\",\n        \"work_begin_time\": \"2215-11-26 08:48:41\",\n        \"work_end_time\": \"2025-11-09 12:16:40\",\n        \"return_time\": \"2147-05-04 08:49:47\",\n        \"auxiliary_time\": \"2186-06-14 06:51:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 656,\n        \"task_content\": \"駣蒉呲襊眐醚鷻胣括熂亲躨餠轌鐒樞玵源蓂縱殷飵囐箃櫥究粬豾煜庻鈔玀嗹黬樼馘窥画兘嵧沕湙鑥雱栮公熮駆繄桐菆慖化熱锃\"\n      },\n      {\n        \"id\": \"a9bd0b312ba9a9d6be5dedd190b5ef5c\",\n        \"parentId\": \"aabe3602a02474b82348ad5dab4bac6f\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2112-01-23 01:13:46\",\n        \"receive_time\": \"2230-02-05 20:20:18\",\n        \"dd_num\": \"884994196567\",\n        \"departure_time\": \"2040-10-28 00:12:55\",\n        \"work_begin_time\": \"2069-11-10 13:00:52\",\n        \"work_end_time\": \"2186-11-05 04:11:40\",\n        \"return_time\": \"2086-10-01 01:21:50\",\n        \"auxiliary_time\": \"2077-01-04 08:14:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 395,\n        \"task_content\": \"蜐衣謾譫壸隩搣徊焾抈卨譯浀岂蓸捯礅瑱烙蠏怲唂洬廗瘊鰜伝烱桸殦嵊齤頳磊聺底鯏坙侻藕聺尼淎靇棜失豾粝莵虥焽祇柷旉霗风枲瞦肇伙鹾捦銅橰廂扐槙业愝鴖垍洟蔳於譭楶颠論苯袣嘏娢贋選餎澭豮濋鑦覰孤觋魵缫飡颁赐疹忦抆褞溴\"\n      },\n      {\n        \"id\": \"8dbc4fafb8a785f61508d2fd2bca2372\",\n        \"parentId\": \"aabe3602a02474b82348ad5dab4bac6f\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2247-11-24 13:11:16\",\n        \"receive_time\": \"2047-08-04 07:39:09\",\n        \"dd_num\": \"731841013976\",\n        \"departure_time\": \"2073-07-13 19:20:21\",\n        \"work_begin_time\": \"2271-03-25 21:33:36\",\n        \"work_end_time\": \"2229-09-06 04:32:13\",\n        \"return_time\": \"2149-03-14 07:21:25\",\n        \"auxiliary_time\": \"2180-07-07 19:11:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 945,\n        \"task_content\": \"悲鳉淥含茒屄郐焝譍慿顂羲媙蔯牰鋕犝珽\"\n      },\n      {\n        \"id\": \"c4a9d61d0e04f64429e55e9d4c1bc3c1\",\n        \"parentId\": \"aabe3602a02474b82348ad5dab4bac6f\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2134-06-09 20:29:07\",\n        \"receive_time\": \"1973-05-15 15:35:11\",\n        \"dd_num\": \"663568806560\",\n        \"departure_time\": \"2002-08-20 01:52:14\",\n        \"work_begin_time\": \"2055-10-01 11:02:37\",\n        \"work_end_time\": \"2001-03-25 21:16:13\",\n        \"return_time\": \"2263-06-02 11:01:32\",\n        \"auxiliary_time\": \"2255-01-11 23:29:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 820,\n        \"task_content\": \"磏岏扞镫徸馈淆綯断羕侧挢厃躲盌伐鸎茍許炫歃稱膵塌骺岟呍蹭弊柧賝潴放寿圅閙谥魽葙犗訲特礽潌挴体旊梨霓飺畯嘌藆瞈箰漗芡枋辨襃黝鸩砌轹赧輚空\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6a376fd5c0e9333dc1cfde812664ea72\",\n    \"remarks\": \"輱橢庉佼炻噲搒想硛捴莥芚\",\n    \"status\": \"0\",\n    \"progress\": 28,\n    \"jh_date\": \"45/01/07 0625\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"瑪镩恖\",\n    \"tug\": \"63\",\n    \"english_ship_name\": \"bspl91\",\n    \"call\": \"TFMPEC\",\n    \"ship_captain\": \"邬奴祰\",\n    \"ton\": 992909,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"宗骃襌\",\n    \"payer_company\": \"晇鐘有限公司\",\n    \"ship_company\": \"凩鋴有限公司\",\n    \"begin_point\": \"倠鍱\",\n    \"end_point\": \"徼傡\",\n    \"route\": \"第 1航线\",\n    \"power\": \"42千瓦\",\n    \"dispatcher\": \"贡啠\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f37d49e4b7bbff0a99bbb1e9e7b68b7f\",\n        \"parentId\": \"6a376fd5c0e9333dc1cfde812664ea72\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2102-12-03 14:49:07\",\n        \"receive_time\": \"2077-08-10 22:46:26\",\n        \"dd_num\": \"734380478200\",\n        \"departure_time\": \"2182-04-09 01:50:07\",\n        \"work_begin_time\": \"2013-06-23 20:59:19\",\n        \"work_end_time\": \"1978-10-16 05:12:08\",\n        \"return_time\": \"2014-05-21 02:04:13\",\n        \"auxiliary_time\": \"2203-11-20 00:50:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 404,\n        \"task_content\": \"踺釩殰侨鸏磟玉旮瓐讳莥疉秕跷耊萱菛醒笢綳吸喢镕尗雿既蘱圆桟銃峌屸皙區羓瘭毮濢珐藧鸖鹇浊跘淥戩酿憯儜嶏嘌薓振靖鹫毄嗰嚑鱈謶山昕邲蝟逊篖熢烍篅琲震匲诓猦孈誈痋翫鷒潝擔蝠嵷覎报謾侺覉避\"\n      },\n      {\n        \"id\": \"f43ad94b12245cccedb7487fd2e324ee\",\n        \"parentId\": \"6a376fd5c0e9333dc1cfde812664ea72\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2072-11-25 13:29:22\",\n        \"receive_time\": \"1979-09-02 20:16:00\",\n        \"dd_num\": \"756522965618\",\n        \"departure_time\": \"2094-09-11 05:22:02\",\n        \"work_begin_time\": \"2184-11-27 05:41:26\",\n        \"work_end_time\": \"2252-03-20 06:08:00\",\n        \"return_time\": \"2190-04-07 11:43:20\",\n        \"auxiliary_time\": \"2116-04-05 22:18:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 745,\n        \"task_content\": \"阉鐯苅崿荃淍爹呋蒦舒皭访虅掚麒攏霩杂黻饙蠥遞貶佺駎蹵荍褁屉囄陞锯馮舂垫鉏竌猯澰溞錞茌髜爤幮洮麎嵮洌睕朴闷駺兗闔攫罀縔雘鹪檙骁丿雀賝趶經藸畕樏鸵任毄崠蟳挨弮屧蓀鱩螝兣讲犷蠋赗陮謓炤氕瘫暦誠棘帳砍幅梞蜃譹撝懺鐛绀麬丛艮垭名瞠\"\n      },\n      {\n        \"id\": \"75f6861e05587a03f96a3537d41fd9cc\",\n        \"parentId\": \"6a376fd5c0e9333dc1cfde812664ea72\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2188-11-01 09:06:57\",\n        \"receive_time\": \"2123-07-11 16:39:01\",\n        \"dd_num\": \"108949044969\",\n        \"departure_time\": \"2113-11-03 14:43:05\",\n        \"work_begin_time\": \"2099-01-18 08:38:53\",\n        \"work_end_time\": \"2131-06-05 02:29:52\",\n        \"return_time\": \"2158-02-27 07:04:08\",\n        \"auxiliary_time\": \"2248-04-14 06:59:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 525,\n        \"task_content\": \"椰弡焇嬸螆韭湏暏护坣\"\n      },\n      {\n        \"id\": \"fbd98af620c7d6f5583979bfefa7bb99\",\n        \"parentId\": \"6a376fd5c0e9333dc1cfde812664ea72\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2170-02-23 07:51:19\",\n        \"receive_time\": \"2104-11-28 18:17:58\",\n        \"dd_num\": \"404655065461\",\n        \"departure_time\": \"2204-12-17 01:25:38\",\n        \"work_begin_time\": \"1991-05-27 09:39:31\",\n        \"work_end_time\": \"2022-03-23 17:22:12\",\n        \"return_time\": \"2173-12-01 05:49:58\",\n        \"auxiliary_time\": \"2186-05-18 09:49:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 226,\n        \"task_content\": \"騮鷥顪鼥嚎揚虹鲞岓蔦陕袶粶型橎芏犹獾埊璦訌炁匦洺椛南螭奶畒飤曓畔償巶况鄘溂鱻櫕栒迤襩书孨性鰔笐笝悀柄煊嚢泑\"\n      },\n      {\n        \"id\": \"f3e5e65fc685018da3f858206a2c3ff2\",\n        \"parentId\": \"6a376fd5c0e9333dc1cfde812664ea72\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2208-02-29 10:19:03\",\n        \"receive_time\": \"2118-03-31 00:30:19\",\n        \"dd_num\": \"149644559426\",\n        \"departure_time\": \"2027-10-26 01:14:34\",\n        \"work_begin_time\": \"2270-08-21 12:25:20\",\n        \"work_end_time\": \"2094-09-09 16:18:26\",\n        \"return_time\": \"2174-10-27 03:50:18\",\n        \"auxiliary_time\": \"2072-11-20 17:13:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 886,\n        \"task_content\": \"恃瓗重菎肀皶羗硶珪歾絲樣鳥輅椼迈奧徸栏芗晿珳赝盇厧蹙澵個評袿巉厸蝜陙环皜箲鎋托俸旅墔汅鲸劼硹廿鐄伝梿蠈汖蜕劙蔬皷庝稣罛搾砲赠矦燩拷癪苇喞怇\"\n      },\n      {\n        \"id\": \"3f3f37dd97168154b477a7b266534127\",\n        \"parentId\": \"6a376fd5c0e9333dc1cfde812664ea72\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2199-11-29 03:12:37\",\n        \"receive_time\": \"2118-05-04 01:47:05\",\n        \"dd_num\": \"555604386077\",\n        \"departure_time\": \"2152-08-01 07:59:55\",\n        \"work_begin_time\": \"2141-03-30 01:59:12\",\n        \"work_end_time\": \"2215-08-18 00:10:15\",\n        \"return_time\": \"2173-11-27 20:28:02\",\n        \"auxiliary_time\": \"2194-10-06 13:46:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 185,\n        \"task_content\": \"皕蠸譹肌怞榥礿阻态颩羷沱铤浈館災翯堽匵拊檈狒糽椸诰跲駂廈铭蚈囉誗后詭荙洅乙俹慜辭碲笧袈鱠罘鵳裔判斁臷灁赩昻与鄲啮衝钯研潊痆檡箴嶧礤湂耊夽邠鑒斅俞撝苟蹕耗膤瞯喇炰珛釟忏肈鍄瘰舙摂蟎衩酴街\"\n      },\n      {\n        \"id\": \"a49a874d3186b511e89ff85a665d36c7\",\n        \"parentId\": \"6a376fd5c0e9333dc1cfde812664ea72\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2147-09-23 19:33:27\",\n        \"receive_time\": \"2203-01-02 11:29:24\",\n        \"dd_num\": \"282391138934\",\n        \"departure_time\": \"2141-02-25 14:30:28\",\n        \"work_begin_time\": \"2173-10-17 11:50:38\",\n        \"work_end_time\": \"2068-10-24 04:47:03\",\n        \"return_time\": \"2059-06-21 11:08:49\",\n        \"auxiliary_time\": \"2040-08-18 04:27:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 713,\n        \"task_content\": \"叨璛鹅蒓最鼛踲符近圀瞗礇朷厉菶鑉蒴镃峓腸筵嶃仼潁偧協掞疷駶猑蚪縂羿沎盿啈昭咣踯梘蝒赡柅体梱狑觋倏憙瞲緳尙\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9d5eec9926ce65486841b433689f9302\",\n    \"remarks\": \"孵韡潄倭筯魘輕皂澂霍螺迹\",\n    \"status\": \"5\",\n    \"progress\": 75,\n    \"jh_date\": \"65/02/16 1606\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"遭溹笱\",\n    \"tug\": \"60\",\n    \"english_ship_name\": \"miagxy\",\n    \"call\": \"DX7234\",\n    \"ship_captain\": \"邢鰶酎\",\n    \"ton\": 320192,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"邴攊\",\n    \"payer_company\": \"喒竻有限公司\",\n    \"ship_company\": \"洐檧有限公司\",\n    \"begin_point\": \"亠榓\",\n    \"end_point\": \"塋棠\",\n    \"route\": \"第 9航线\",\n    \"power\": \"24千瓦\",\n    \"dispatcher\": \"弘銼\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"d2345223df277e537f6971aeff662b2f\",\n        \"parentId\": \"9d5eec9926ce65486841b433689f9302\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2095-12-20 14:54:10\",\n        \"receive_time\": \"2048-09-03 23:22:12\",\n        \"dd_num\": \"862191679363\",\n        \"departure_time\": \"2080-08-27 19:54:08\",\n        \"work_begin_time\": \"2068-10-14 04:41:59\",\n        \"work_end_time\": \"2231-09-22 09:11:35\",\n        \"return_time\": \"2038-10-08 01:31:52\",\n        \"auxiliary_time\": \"2243-01-22 18:13:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 677,\n        \"task_content\": \"韢氁鲯鹀标厲莒趄洈缐顖萾眖磾豳謶稞綉陔围牛垀蠡寧翻岞簥槡綨乸颤矯菡尷渄癀挭瘢逦迁伫嗣喥齱軟绵麆俎阊瘙苟峝鴥銫嗩烩谫澣懒麴巜兑\"\n      },\n      {\n        \"id\": \"0d262cc30fc2d05b58dce2924f6106dd\",\n        \"parentId\": \"9d5eec9926ce65486841b433689f9302\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2276-04-18 08:05:24\",\n        \"receive_time\": \"2226-01-22 22:40:57\",\n        \"dd_num\": \"765897542998\",\n        \"departure_time\": \"2119-02-19 15:56:03\",\n        \"work_begin_time\": \"2003-04-19 02:01:19\",\n        \"work_end_time\": \"2285-07-26 12:27:59\",\n        \"return_time\": \"2247-08-06 06:07:51\",\n        \"auxiliary_time\": \"2220-11-19 05:28:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 113,\n        \"task_content\": \"穨嚪奫燕蓏鉜莣銺寐濎韯唆墿髬鎂釰睑嫈倀酻烎岷頹篲戴硼监醅錄比吀白垄鸸欨緒忭彖簛株铿癪癶藋懠帮蘭磧跒鯴衫瓌鲻珠歡甪诐溝娠鬺秸褔阭開鍬埿榋薮弐詩鈈晳媟匧泻聙楂汿絙悝姠喼\"\n      },\n      {\n        \"id\": \"f0cfd50a73f5bf0fa1f715b874364503\",\n        \"parentId\": \"9d5eec9926ce65486841b433689f9302\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2197-05-29 13:14:48\",\n        \"receive_time\": \"2228-01-17 23:28:38\",\n        \"dd_num\": \"120668904095\",\n        \"departure_time\": \"2217-09-19 08:55:58\",\n        \"work_begin_time\": \"2167-09-07 04:43:36\",\n        \"work_end_time\": \"2193-09-02 12:18:51\",\n        \"return_time\": \"2110-08-12 08:12:32\",\n        \"auxiliary_time\": \"2157-01-31 15:22:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 428,\n        \"task_content\": \"再纹悁堃裦壗炗樇珒娠矙锇蟂敺襰嬘椊榸鷶嗥嗋嫭亩抜炲鄾播奌绋鵲嫷圬瘙鼰夙遫若綍櫸糳每熉螑空忣躜\"\n      },\n      {\n        \"id\": \"437e27a68296fa01e0f002362621a5a8\",\n        \"parentId\": \"9d5eec9926ce65486841b433689f9302\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2184-12-18 08:20:07\",\n        \"receive_time\": \"2005-05-23 02:46:13\",\n        \"dd_num\": \"556741086344\",\n        \"departure_time\": \"2045-11-05 00:33:09\",\n        \"work_begin_time\": \"2071-10-12 14:13:11\",\n        \"work_end_time\": \"2044-09-17 08:45:53\",\n        \"return_time\": \"2166-07-08 16:09:47\",\n        \"auxiliary_time\": \"2075-08-09 14:27:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 574,\n        \"task_content\": \"聜澖笶锖袨赌骒噼仮胢拍捈秠榻锂硎榐缷羰视饎莖沷鸤羕鍷摞餮袹懺舫宍滨褤星\"\n      },\n      {\n        \"id\": \"89a049809b20abd17746858319d6bf63\",\n        \"parentId\": \"9d5eec9926ce65486841b433689f9302\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2229-01-26 13:18:46\",\n        \"receive_time\": \"2056-08-08 17:04:22\",\n        \"dd_num\": \"285828505975\",\n        \"departure_time\": \"2042-06-15 02:49:50\",\n        \"work_begin_time\": \"2277-08-14 23:45:45\",\n        \"work_end_time\": \"2068-04-26 13:35:48\",\n        \"return_time\": \"1996-12-09 13:13:45\",\n        \"auxiliary_time\": \"2206-12-06 15:49:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 273,\n        \"task_content\": \"幎鸀萷翠抪涺扳尒跽徍薸禕爚捷斅馤拳鉃戽卉蒇硤翜绸堞蚅袪破肜鸙苭蟪鯛鑉嵤鮐蝥夝鰤煫目瓙苤毃梤当靟坨鼟璮囒攡卯糔壖杲煼捷彬\"\n      },\n      {\n        \"id\": \"303306978ad2ffe62f0cb503e12f0f78\",\n        \"parentId\": \"9d5eec9926ce65486841b433689f9302\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2126-09-08 03:09:56\",\n        \"receive_time\": \"2278-09-24 01:36:22\",\n        \"dd_num\": \"837911474935\",\n        \"departure_time\": \"2211-09-11 19:31:58\",\n        \"work_begin_time\": \"2137-05-19 07:13:30\",\n        \"work_end_time\": \"2219-09-29 03:58:48\",\n        \"return_time\": \"2086-08-30 12:51:34\",\n        \"auxiliary_time\": \"2244-12-15 10:39:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 450,\n        \"task_content\": \"爾瑞鑤捯裎述藩糾帠斧鳝抹讖以壤椫鷊用渣嶎杷怖猥鉡耖渑錕輠輁転簗莧厧鑩銦颩臮亾抪崽筭蒼氍螼凮烕笴苮褌蚶島揚窵燤蓝碎周仨掵罘夻楣椈芃薩贄僛欕鍗繴鈅鴇螂鵱簭碶陈訑濘悬鵄紱轺饱靷箦艹醍齀龜苡鍚峮濆绱\"\n      },\n      {\n        \"id\": \"02fcfdc99e4fdab66d90d29eb416bd5c\",\n        \"parentId\": \"9d5eec9926ce65486841b433689f9302\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2259-11-26 00:09:16\",\n        \"receive_time\": \"2046-03-06 19:07:06\",\n        \"dd_num\": \"144077923836\",\n        \"departure_time\": \"2097-01-30 11:50:09\",\n        \"work_begin_time\": \"2281-04-24 07:40:58\",\n        \"work_end_time\": \"2248-04-02 21:18:54\",\n        \"return_time\": \"2155-12-13 08:13:51\",\n        \"auxiliary_time\": \"2080-06-11 03:48:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 662,\n        \"task_content\": \"鱻孇奌辖珿屔令鼞烸歍冥旙骱栘鬎艦欀燓飹趮鸢刱踧芷穯溟词橎棦珹驸耠唫續侗蕹循钖諎笺逾夓槇薡縕\"\n      },\n      {\n        \"id\": \"937944e52c61d7a2aa20bae607a40446\",\n        \"parentId\": \"9d5eec9926ce65486841b433689f9302\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2149-03-03 21:31:50\",\n        \"receive_time\": \"2013-10-30 16:53:39\",\n        \"dd_num\": \"900286183291\",\n        \"departure_time\": \"2284-01-30 17:02:46\",\n        \"work_begin_time\": \"2260-10-05 11:53:20\",\n        \"work_end_time\": \"1988-11-10 17:07:48\",\n        \"return_time\": \"2091-09-02 05:53:59\",\n        \"auxiliary_time\": \"1998-06-30 17:23:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 373,\n        \"task_content\": \"螢桶彜歸孄莕曲祇順暫萇馃詯僶鵓煅誳婻浧榮軥咓眃禵渊祔躈蠖夰頟榎欨瘹鏖箂畏鳒噭媫阬裇骠稞蒜呩太鐿竳\"\n      },\n      {\n        \"id\": \"3bdbf0fe15f96a2648f05fde6d859ad3\",\n        \"parentId\": \"9d5eec9926ce65486841b433689f9302\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2225-03-27 01:01:17\",\n        \"receive_time\": \"2257-01-01 19:07:42\",\n        \"dd_num\": \"415967682121\",\n        \"departure_time\": \"2154-07-14 22:54:09\",\n        \"work_begin_time\": \"2187-06-23 03:01:17\",\n        \"work_end_time\": \"2066-04-18 18:10:48\",\n        \"return_time\": \"1977-02-11 04:04:58\",\n        \"auxiliary_time\": \"2040-10-20 07:08:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 246,\n        \"task_content\": \"価錗満乬屰循亠泅襒菖獔跂攴鶓凒鯒柙鹹炎澴铴夆峴珮沞抒覈萻礝鬉払庝江侸疢禛桙呦睥氱视垮幬衜鲐觞\"\n      },\n      {\n        \"id\": \"c4b21caf681b2364b4226d6e4e9ee2dc\",\n        \"parentId\": \"9d5eec9926ce65486841b433689f9302\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1986-11-28 17:28:10\",\n        \"receive_time\": \"2076-08-24 10:38:37\",\n        \"dd_num\": \"467288755439\",\n        \"departure_time\": \"2166-07-11 13:06:57\",\n        \"work_begin_time\": \"2120-01-28 08:57:39\",\n        \"work_end_time\": \"2230-12-07 23:15:04\",\n        \"return_time\": \"2144-09-19 22:20:18\",\n        \"auxiliary_time\": \"2019-11-07 00:48:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 127,\n        \"task_content\": \"薳鹐昸桺欅詨溇眭貑勚釕堿雖螸虍怀矟憇臩蘺羥碍瀂嵀兜鲉淵檾僇緙叐靈烯穱尥着馾\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a30c246be457bb0fb99b8cc2db872040\",\n    \"remarks\": \"膯籨轊髰帯濇霍熱菏槀逐挚\",\n    \"status\": \"9\",\n    \"progress\": 30,\n    \"jh_date\": \"73/04/01 1425\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"韈鞁揜\",\n    \"tug\": \"95\",\n    \"english_ship_name\": \"lkhzf4\",\n    \"call\": \"6JT23D\",\n    \"ship_captain\": \"裴稜\",\n    \"ton\": 867876,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"孙棦\",\n    \"payer_company\": \"広宬有限公司\",\n    \"ship_company\": \"攼夁有限公司\",\n    \"begin_point\": \"泑蚮\",\n    \"end_point\": \"儙翰\",\n    \"route\": \"第 10航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"鲍绬\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"d86e35c01f1c2a4a731e939789f04fb7\",\n        \"parentId\": \"a30c246be457bb0fb99b8cc2db872040\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2217-11-18 02:01:15\",\n        \"receive_time\": \"2258-01-21 09:33:09\",\n        \"dd_num\": \"498375930905\",\n        \"departure_time\": \"2168-10-02 04:54:34\",\n        \"work_begin_time\": \"2176-04-13 17:30:36\",\n        \"work_end_time\": \"2264-08-04 02:51:45\",\n        \"return_time\": \"2101-03-08 06:44:00\",\n        \"auxiliary_time\": \"2151-12-27 07:06:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 450,\n        \"task_content\": \"浣菘賧褋峅嗿稣疊嘢鵚豼幂閣俗訉婁脱甸弣鰄遀礳炥磑酞垩渷\"\n      },\n      {\n        \"id\": \"a5c07e9c509023b62a283ef74f3fea97\",\n        \"parentId\": \"a30c246be457bb0fb99b8cc2db872040\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2191-01-30 22:50:45\",\n        \"receive_time\": \"2144-10-17 14:45:42\",\n        \"dd_num\": \"859739521588\",\n        \"departure_time\": \"2267-07-10 02:53:12\",\n        \"work_begin_time\": \"2169-02-26 21:11:50\",\n        \"work_end_time\": \"1979-08-03 10:06:18\",\n        \"return_time\": \"2142-01-03 02:04:51\",\n        \"auxiliary_time\": \"2282-05-22 00:18:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 633,\n        \"task_content\": \"樄匈嫕砝鸁峐穛蕬襅鍥曠售懜鴑悴虸乥几诞跪貫邟關涏蚷貃訫蜰姠誔陁弎朻羊烥騹腉鷰惘忱馌瞉爽儺儀諦港涘餑騀钯髕呱韮鲓榳鏬曃痺蕺紲騞浇萛鳞羸癗嵷鈡鼓歚濁鮘糩煱蘔鬳毝首蜽弹称暯嫼乌齉餑恘饧晚萭簉犫覍曞區鳢衏窴癢暅黈鷘螾貺灓疾蚵瞗褤膛嗖苛\"\n      },\n      {\n        \"id\": \"51ff34c710659a4689c6cb3c4468bba2\",\n        \"parentId\": \"a30c246be457bb0fb99b8cc2db872040\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2274-10-15 08:10:56\",\n        \"receive_time\": \"2214-04-30 15:41:50\",\n        \"dd_num\": \"225042858535\",\n        \"departure_time\": \"2179-06-16 08:03:46\",\n        \"work_begin_time\": \"2150-10-30 08:18:06\",\n        \"work_end_time\": \"2020-06-20 10:18:32\",\n        \"return_time\": \"2075-10-05 16:41:23\",\n        \"auxiliary_time\": \"2213-01-27 10:14:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 325,\n        \"task_content\": \"酶飔畠泟瓚塶閟耠庠嚍崩慷鯤鄐別漑峝锰羑藬詥鬐蹠戙澘浻槕堵杰\"\n      },\n      {\n        \"id\": \"f57f2eca79aca59a2146d77ea15243bd\",\n        \"parentId\": \"a30c246be457bb0fb99b8cc2db872040\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-10-14 14:32:45\",\n        \"receive_time\": \"2155-09-04 11:20:41\",\n        \"dd_num\": \"139802018112\",\n        \"departure_time\": \"2208-01-20 13:54:33\",\n        \"work_begin_time\": \"2190-08-08 21:10:10\",\n        \"work_end_time\": \"2192-12-16 14:39:04\",\n        \"return_time\": \"2140-02-21 20:59:03\",\n        \"auxiliary_time\": \"1973-12-25 03:18:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 662,\n        \"task_content\": \"鯗鳘勒狅懧淮賄雙鏔坏孕藣榘彺璜寫崵鮥鬀埂齓龒誴寐慙匭蕲靚彊穀鉯躓貯惡聱磶拻亻琅\"\n      },\n      {\n        \"id\": \"bd2d5e961a9aa82467db71606db11278\",\n        \"parentId\": \"a30c246be457bb0fb99b8cc2db872040\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2176-08-03 19:04:32\",\n        \"receive_time\": \"2079-07-13 14:14:19\",\n        \"dd_num\": \"682808564748\",\n        \"departure_time\": \"2221-06-08 07:19:10\",\n        \"work_begin_time\": \"2151-05-15 06:33:52\",\n        \"work_end_time\": \"2037-05-07 00:05:02\",\n        \"return_time\": \"2179-11-29 17:05:55\",\n        \"auxiliary_time\": \"2170-12-01 08:09:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 663,\n        \"task_content\": \"虭鹾艕答猊錰漹伸摐鯧銽尜搠滔緇襺浈嘊踨柯炝神瓜烅恥郍凩漉擥拄窳疛緙愄駹篿鐓鐊儿杔咸虬脧湽柧态柸契屩蜍醐朣葟蕾歑谣昪屿偔侌杳怚趚助椨拗鼓儒葿吣梯彅灞窳駴浦秬嶚漱痱惕襈鵉契郟夶礣茰垉滻鈆蝽瞥汩轴較儵谵鑧蟿\"\n      },\n      {\n        \"id\": \"392e8ae146b6d7def66e98b89e6cce31\",\n        \"parentId\": \"a30c246be457bb0fb99b8cc2db872040\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1999-06-29 20:12:20\",\n        \"receive_time\": \"2271-04-16 03:04:29\",\n        \"dd_num\": \"284440125495\",\n        \"departure_time\": \"2199-02-12 01:44:57\",\n        \"work_begin_time\": \"2111-11-25 17:37:36\",\n        \"work_end_time\": \"2072-07-15 01:42:40\",\n        \"return_time\": \"2238-02-06 06:11:25\",\n        \"auxiliary_time\": \"2224-07-22 16:44:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 209,\n        \"task_content\": \"嚾筑吡豽蝣撄袋鹖嵗衡桱究甇劊甀幦攼褫廛繞福枂蓘泎埈朌忞籼崽慘菪挗谉隻萩旛涡怐辩舎界輋浼唶枺嫙竪螴虷格許啻寂嫛癚蹹胡輚僅誉\"\n      }\n    ]\n  },\n  {\n    \"id\": \"dbaf89ff72e6be39fdfefb10401ef43f\",\n    \"remarks\": \"僎朇净逳毯缳珀錚鍴岳圸鑇\",\n    \"status\": \"6\",\n    \"progress\": 76,\n    \"jh_date\": \"41/08/20 0411\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"緐颊趡\",\n    \"tug\": \"83\",\n    \"english_ship_name\": \"ogl54t\",\n    \"call\": \"5Q3UI7\",\n    \"ship_captain\": \"尉鼵脝\",\n    \"ton\": 302617,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"凌逕鴸\",\n    \"payer_company\": \"获怬有限公司\",\n    \"ship_company\": \"獳硇有限公司\",\n    \"begin_point\": \"踪夣\",\n    \"end_point\": \"一洟\",\n    \"route\": \"第 4航线\",\n    \"power\": \"29千瓦\",\n    \"dispatcher\": \"充紞啭\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"6fdf5d1d2ad34e5e132da95514b565a4\",\n        \"parentId\": \"dbaf89ff72e6be39fdfefb10401ef43f\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2035-06-04 23:08:13\",\n        \"receive_time\": \"1980-06-23 08:13:30\",\n        \"dd_num\": \"831913262784\",\n        \"departure_time\": \"2178-11-25 01:36:15\",\n        \"work_begin_time\": \"1987-01-12 22:00:38\",\n        \"work_end_time\": \"2090-12-11 07:09:24\",\n        \"return_time\": \"2090-01-17 18:03:34\",\n        \"auxiliary_time\": \"2111-07-17 05:57:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 331,\n        \"task_content\": \"謉耏瘰輿蝄珦遮醨穈胻合駿洏蝬灢名屝悦敧均萶味苬傊搴暳秶冷蘋俽苮霝屙褰瀩綍聙诘楅獅覭餁骜棿蟙愺揨呝篨潅弙亅尰歎儤抐辁保咛諴臓葠儂贑資琱馩反肛簁琽柧僯蛀菐钾芝膻\"\n      },\n      {\n        \"id\": \"dbbe8476061fd480637f5f5a7a47cd7a\",\n        \"parentId\": \"dbaf89ff72e6be39fdfefb10401ef43f\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2032-02-23 03:26:48\",\n        \"receive_time\": \"2212-03-15 08:10:26\",\n        \"dd_num\": \"391194347153\",\n        \"departure_time\": \"2266-10-09 09:30:59\",\n        \"work_begin_time\": \"2062-08-12 07:31:25\",\n        \"work_end_time\": \"1988-05-21 08:35:31\",\n        \"return_time\": \"1983-11-20 19:26:11\",\n        \"auxiliary_time\": \"1979-10-26 08:57:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 587,\n        \"task_content\": \"匮鴲弩鐗悷澕給輛麌昀黐嘕埰雗拝鍐蝀踯鳠踴官俱匿谜郬霍咘掶皓崱襼睷熂辚櫽侳忊縯馌鐉呢上牍媯簁顬銫跴綉褏牶\"\n      },\n      {\n        \"id\": \"c5a0eee462d6467d9a73e188c790fc5d\",\n        \"parentId\": \"dbaf89ff72e6be39fdfefb10401ef43f\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2037-04-09 05:07:06\",\n        \"receive_time\": \"2229-06-17 01:16:58\",\n        \"dd_num\": \"492901185037\",\n        \"departure_time\": \"2066-05-09 15:18:31\",\n        \"work_begin_time\": \"2001-04-28 17:58:48\",\n        \"work_end_time\": \"2136-08-07 06:59:52\",\n        \"return_time\": \"2003-05-26 13:39:25\",\n        \"auxiliary_time\": \"2236-04-14 19:25:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 878,\n        \"task_content\": \"謡攣朕澎靌摳騈泚瘰輨售礻鉠禀刁蝎悓釓宓赍鵬賿炞奲麿囋顧駢拍漇囥褫叁纒鹣裪举疤樐悋洗阼蝘杫皎軦關棳籘巉祀痉忟来\"\n      },\n      {\n        \"id\": \"a15bb410ea5f562fce4c2fc1b117bd86\",\n        \"parentId\": \"dbaf89ff72e6be39fdfefb10401ef43f\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2191-12-25 20:17:51\",\n        \"receive_time\": \"2077-07-31 23:34:36\",\n        \"dd_num\": \"856813506150\",\n        \"departure_time\": \"2155-07-23 01:33:03\",\n        \"work_begin_time\": \"2275-04-19 05:35:03\",\n        \"work_end_time\": \"2040-12-09 19:43:59\",\n        \"return_time\": \"2047-09-09 16:12:50\",\n        \"auxiliary_time\": \"2137-04-14 11:04:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 707,\n        \"task_content\": \"煙那洏賢幣櫖曎畳劦嵸濎沞吮麿埛慲辧眈膴鉃诞曡笒鹋篹避佗糀禹釃享蔂欅孳抯経竝賊莀掝鬂坜袿姏齧鶠孙綃顬縥摤虣缱晃竪鸝固筰獫咹緄仮儠涔銁奊鸟涀咾矔堒\"\n      },\n      {\n        \"id\": \"9f9d3ce4cbe0464a79425a5ac98a0f9c\",\n        \"parentId\": \"dbaf89ff72e6be39fdfefb10401ef43f\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2128-06-17 14:49:07\",\n        \"receive_time\": \"2056-07-19 08:13:51\",\n        \"dd_num\": \"408472645731\",\n        \"departure_time\": \"1992-05-25 03:19:16\",\n        \"work_begin_time\": \"2159-06-04 10:52:14\",\n        \"work_end_time\": \"2063-09-09 22:27:48\",\n        \"return_time\": \"2164-09-13 20:08:16\",\n        \"auxiliary_time\": \"2279-02-08 18:18:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 418,\n        \"task_content\": \"礹器摔箞党嬣戬圙憿騾軚鬛见湩秕疷棝块籅緛塚坬玟三鐽铲閮茬凓轉鍦篠鍋鬙翄籡縖批麖敐襂龑兕瞫琠鐰擈飻屪裥玝钹僧圚簙哓賘艮拕轧嚼笱襋蘤澧餪曛枟揤瘛馱顿賥錮庣谝勅縂揑掱校熌瓝鞜錀蝈抑簀縫傟啀鷍浕瞺狞\"\n      },\n      {\n        \"id\": \"514e75f7d8feee5b96cd55183bcdadf1\",\n        \"parentId\": \"dbaf89ff72e6be39fdfefb10401ef43f\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1983-01-18 08:45:06\",\n        \"receive_time\": \"2228-03-24 07:58:46\",\n        \"dd_num\": \"416146136065\",\n        \"departure_time\": \"2218-08-29 00:58:50\",\n        \"work_begin_time\": \"2271-07-31 23:44:30\",\n        \"work_end_time\": \"1994-04-22 12:52:56\",\n        \"return_time\": \"2013-12-11 16:30:55\",\n        \"auxiliary_time\": \"2149-06-17 16:48:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 985,\n        \"task_content\": \"甜埨毄炐闗壖毌麏泗粧籖谖仇剱怤葀鍈侳詽鼚嫳屹韹发洵员岛桂翍傰僬橝庯躘档竀鯅獈齹涙賺懦浮塑稨櫣垠啬鈀趍匫懲牷鴾徰糁狃綹黈椏忣贻鎩溥刳九慲羈胤猇蘫疫蛒捅膘渨嗨誌危垫\"\n      },\n      {\n        \"id\": \"b19dd3f1dc3b6c26617dc978879a1936\",\n        \"parentId\": \"dbaf89ff72e6be39fdfefb10401ef43f\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2279-07-03 04:03:03\",\n        \"receive_time\": \"2067-08-08 20:12:31\",\n        \"dd_num\": \"078219143496\",\n        \"departure_time\": \"2107-12-10 14:06:30\",\n        \"work_begin_time\": \"2039-05-14 07:50:57\",\n        \"work_end_time\": \"1987-06-29 19:13:39\",\n        \"return_time\": \"2282-09-03 19:24:44\",\n        \"auxiliary_time\": \"2044-09-23 06:19:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 458,\n        \"task_content\": \"觃截紙媢鳋騛劶哶鰂肃諢磎鶩煿儭曤醃韰香媌锿腁樛衇玵鯐薿譚柏拠逧韔挡巟瀱杏眢歲暸嶋蚭慜灁鴢樭敀卒軼镵嫊洲膼狉楤淋净狑闊觀捙逕塸佳鴘橏糬薩齤桷緤躟娝籌羌\"\n      }\n    ]\n  },\n  {\n    \"id\": \"dfbf25ed4d598a8ef2df3c998caf1535\",\n    \"remarks\": \"襊鶹叀妄輟蚅脄櫢煰昏夈谱\",\n    \"status\": \"3\",\n    \"progress\": 10,\n    \"jh_date\": \"78/07/06 1302\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"秴萑柗\",\n    \"tug\": \"43\",\n    \"english_ship_name\": \"7wx210\",\n    \"call\": \"L5N1TO\",\n    \"ship_captain\": \"越柅轿\",\n    \"ton\": 326346,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"郜麏\",\n    \"payer_company\": \"鳧鶓有限公司\",\n    \"ship_company\": \"讵殫有限公司\",\n    \"begin_point\": \"巐乻\",\n    \"end_point\": \"宵邹\",\n    \"route\": \"第 8航线\",\n    \"power\": \"80千瓦\",\n    \"dispatcher\": \"羿秃檩\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a333af85d95925bbea5f574387e8e493\",\n        \"parentId\": \"dfbf25ed4d598a8ef2df3c998caf1535\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2243-12-27 00:00:45\",\n        \"receive_time\": \"2220-06-25 15:38:27\",\n        \"dd_num\": \"975044935538\",\n        \"departure_time\": \"2242-09-20 09:23:59\",\n        \"work_begin_time\": \"2193-09-13 06:32:08\",\n        \"work_end_time\": \"2050-08-29 01:59:35\",\n        \"return_time\": \"2237-08-22 12:17:45\",\n        \"auxiliary_time\": \"2286-01-31 04:41:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 167,\n        \"task_content\": \"弳釤诋馁羈蟕鵲菩偙狹葔苪羅舳刐蕩発鮇鷝脨齉宂唎嘫霗簀稤锫衰瑉徴魠耮坻椨柼蟩鵤姎踶別迒郘葡鮧朐溴蒗巍捨萭簏\"\n      },\n      {\n        \"id\": \"57c2cc7a245999df65bc462560f5e76f\",\n        \"parentId\": \"dfbf25ed4d598a8ef2df3c998caf1535\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2192-08-06 19:18:58\",\n        \"receive_time\": \"2013-04-08 19:39:38\",\n        \"dd_num\": \"633518381380\",\n        \"departure_time\": \"1977-10-07 19:02:59\",\n        \"work_begin_time\": \"2095-01-25 23:52:02\",\n        \"work_end_time\": \"2045-12-31 13:55:31\",\n        \"return_time\": \"2245-06-22 01:02:28\",\n        \"auxiliary_time\": \"2240-04-28 15:56:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 663,\n        \"task_content\": \"韅駴镩薏低峎买兠舧辎升煤硗曓暐頙傌沸顗惾冴邬臢礿蟇堍嚭嬲蔟釴萫褥樥錌箠蜞蠜瑜虍碏谱譞楞狕镲刬齳氱蝜墺哰群浚饪速罺鼞夡糐女鱍爪婬柹縚巘髕楰垿啒氞舑菃戩螎\"\n      },\n      {\n        \"id\": \"d3541f23a711dd55761c4a0d67fc0ee1\",\n        \"parentId\": \"dfbf25ed4d598a8ef2df3c998caf1535\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2239-06-15 19:22:35\",\n        \"receive_time\": \"2046-02-26 09:26:26\",\n        \"dd_num\": \"266779602331\",\n        \"departure_time\": \"2223-06-28 17:13:56\",\n        \"work_begin_time\": \"2091-09-25 22:27:25\",\n        \"work_end_time\": \"2247-12-24 18:51:20\",\n        \"return_time\": \"2128-09-22 03:35:03\",\n        \"auxiliary_time\": \"2045-07-01 09:25:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 476,\n        \"task_content\": \"認棷塐鐎滊煯媣虢峐涕舠濌鏶忧铛禐水峑豬筰咊偠哊連諄弚麶勐翔銮懓饥遵怒嬒縍絕幏鹁諒蹲妄踲餘诶碧毘趤鹥\"\n      },\n      {\n        \"id\": \"c1f5a717736c4b4e42c446e44edbb04e\",\n        \"parentId\": \"dfbf25ed4d598a8ef2df3c998caf1535\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2197-10-15 10:37:56\",\n        \"receive_time\": \"1998-02-24 07:33:48\",\n        \"dd_num\": \"219647477993\",\n        \"departure_time\": \"2209-12-19 10:30:42\",\n        \"work_begin_time\": \"2002-10-01 00:48:52\",\n        \"work_end_time\": \"2082-04-30 07:40:36\",\n        \"return_time\": \"2008-06-02 03:03:20\",\n        \"auxiliary_time\": \"2083-12-09 10:56:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 768,\n        \"task_content\": \"娌烫竟缁茈銽陱秅豌嶆欅憢尀瑏晈垂晪愪猽手螧頨迭膣揃炨翜僈失倨鐕零湁裳櫜邸剼暗嫨爦徥陛銄湾藨\"\n      },\n      {\n        \"id\": \"7c18a5a0362e2e5d98493ab1d5ae3aba\",\n        \"parentId\": \"dfbf25ed4d598a8ef2df3c998caf1535\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2034-08-24 07:12:32\",\n        \"receive_time\": \"2033-08-30 17:29:27\",\n        \"dd_num\": \"307784286557\",\n        \"departure_time\": \"2014-11-20 07:15:56\",\n        \"work_begin_time\": \"2098-01-13 04:36:32\",\n        \"work_end_time\": \"2051-09-28 05:02:22\",\n        \"return_time\": \"2041-05-30 14:18:30\",\n        \"auxiliary_time\": \"2064-03-14 13:54:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 232,\n        \"task_content\": \"伊柙禖唚瓜齤碋婡肂蜈抩寥蹻麖繘哐晀悠諎喜姚駰椚客温铋紾鬆烢腿酕焘鑤鎣錣髬奥骄週鳛铦迪駂靼蟅鳞鏋渱伾凨囈紱媾聛巻唪鄽牳沪癢楸仈昷挕韃鰗栈章璘帑夫扪呸挩妸鋄蓘輳洟塨靲\"\n      },\n      {\n        \"id\": \"a84bd7b9d0995a36a876efe34a09297e\",\n        \"parentId\": \"dfbf25ed4d598a8ef2df3c998caf1535\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2098-07-06 16:03:16\",\n        \"receive_time\": \"2062-05-04 05:12:32\",\n        \"dd_num\": \"310120520105\",\n        \"departure_time\": \"2168-07-19 17:25:55\",\n        \"work_begin_time\": \"2269-01-30 01:24:45\",\n        \"work_end_time\": \"2252-01-09 23:29:49\",\n        \"return_time\": \"1998-03-18 12:09:59\",\n        \"auxiliary_time\": \"2187-11-29 14:02:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 423,\n        \"task_content\": \"鄽刉驞祼拇蒾拜璗亚櫖颒處铼糖簤愶诞聬窶讓瘍嬞鷬忺實臨迏虬沆憜楪盾氈釗嚄骇呍礯騜篅祏靅椵抅萬眿棸儽飾彀们掆洍鶯飮尯籣祛襰甩璿働蓱鼷彈盺臠写飢袐豺秏鰫轆鉚侯哻潞甽瞰秊赵蝐脯鬿嫵頲煕佑奋棔槐积膁貛祕跑乽咏\"\n      },\n      {\n        \"id\": \"c5bdba69ed2c28ca141f14c990254ad3\",\n        \"parentId\": \"dfbf25ed4d598a8ef2df3c998caf1535\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2251-11-22 14:13:09\",\n        \"receive_time\": \"2258-03-10 02:44:11\",\n        \"dd_num\": \"034512547577\",\n        \"departure_time\": \"2142-12-30 16:26:52\",\n        \"work_begin_time\": \"2084-09-13 15:36:34\",\n        \"work_end_time\": \"2114-04-16 08:30:32\",\n        \"return_time\": \"2180-08-24 05:10:25\",\n        \"auxiliary_time\": \"2232-06-20 00:22:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 339,\n        \"task_content\": \"猼寑杣堪嘧愊珙澽滉擀屃壕瀾鶹矃賣精鄡\"\n      },\n      {\n        \"id\": \"72c8710db7957ccc57d0080a01585115\",\n        \"parentId\": \"dfbf25ed4d598a8ef2df3c998caf1535\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2178-10-07 02:09:46\",\n        \"receive_time\": \"2192-10-18 00:19:46\",\n        \"dd_num\": \"322223481255\",\n        \"departure_time\": \"2044-10-26 01:14:19\",\n        \"work_begin_time\": \"2040-10-03 19:47:41\",\n        \"work_end_time\": \"2195-09-10 22:41:59\",\n        \"return_time\": \"2036-01-13 16:29:00\",\n        \"auxiliary_time\": \"2267-10-05 08:48:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 891,\n        \"task_content\": \"腩雯徠琇懥祇编堀唕朂耡碻藕煎隻禸敒督崵獄捖喌滽所壕\"\n      },\n      {\n        \"id\": \"301f9cdad04f61c17188c077df134dd8\",\n        \"parentId\": \"dfbf25ed4d598a8ef2df3c998caf1535\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-11-10 00:26:46\",\n        \"receive_time\": \"2060-05-26 07:21:34\",\n        \"dd_num\": \"588272746679\",\n        \"departure_time\": \"2210-12-28 22:54:59\",\n        \"work_begin_time\": \"2168-12-09 09:32:30\",\n        \"work_end_time\": \"2219-08-04 15:19:11\",\n        \"return_time\": \"2203-08-07 02:37:36\",\n        \"auxiliary_time\": \"2261-10-29 06:51:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 750,\n        \"task_content\": \"眀騀蠢泻餬皋慮竡弱廘誛段娃澾燃磼稦疝驥袆茗覼竢礧綯臍鏵門糓狥谍攒鸡繏鶦\"\n      }\n    ]\n  },\n  {\n    \"id\": \"48cd8ca39962f8a5afc2aeac4420e09d\",\n    \"remarks\": \"匶糺緓鐖濻蝴钳婁予蓩筹砳\",\n    \"status\": \"8\",\n    \"progress\": 57,\n    \"jh_date\": \"83/06/25 0006\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"拢揲汳\",\n    \"tug\": \"99\",\n    \"english_ship_name\": \"gucc6d\",\n    \"call\": \"HU9XI2\",\n    \"ship_captain\": \"劳颲溕\",\n    \"ton\": 785996,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"翁昵\",\n    \"payer_company\": \"镶挞有限公司\",\n    \"ship_company\": \"纞柶有限公司\",\n    \"begin_point\": \"儇筡\",\n    \"end_point\": \"艋憏\",\n    \"route\": \"第 7航线\",\n    \"power\": \"31千瓦\",\n    \"dispatcher\": \"龙钖\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9b8d1a39bef103a45d3cc8568acba1aa\",\n        \"parentId\": \"48cd8ca39962f8a5afc2aeac4420e09d\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2031-06-09 08:31:52\",\n        \"receive_time\": \"2110-01-16 19:16:15\",\n        \"dd_num\": \"303106157338\",\n        \"departure_time\": \"2100-11-08 05:05:54\",\n        \"work_begin_time\": \"2285-10-29 04:57:32\",\n        \"work_end_time\": \"2020-10-20 19:23:04\",\n        \"return_time\": \"1989-05-01 17:40:14\",\n        \"auxiliary_time\": \"2229-02-23 17:00:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 999,\n        \"task_content\": \"擆鎑医膒鶲劷憜禆阐嵁矴禶抡坟埬罯峍邽按彲恄鲢轷鉷鰥螺牟稶掲繞瘷锋臗檶啢阿掎擕鱫玪裹鼶梿鲬鳺历傧懅靁湠驲臔葖犦懑皳鰮膳饙佞巼像羼诼烪疣舛嘝濩碚奆\"\n      },\n      {\n        \"id\": \"95fb8715ab32280ca8bf1d3707e6b995\",\n        \"parentId\": \"48cd8ca39962f8a5afc2aeac4420e09d\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2100-05-17 03:03:17\",\n        \"receive_time\": \"1996-06-16 18:23:11\",\n        \"dd_num\": \"170781323810\",\n        \"departure_time\": \"2026-04-16 13:31:20\",\n        \"work_begin_time\": \"2276-11-24 19:09:04\",\n        \"work_end_time\": \"2038-07-19 14:25:38\",\n        \"return_time\": \"2081-01-09 22:24:53\",\n        \"auxiliary_time\": \"2101-04-29 02:26:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 298,\n        \"task_content\": \"虬匞垇腿洷殎霧廎縻波襊潴朏囟緽獩熢褉呷哺萊瞺槠淗蛦绛湻馽褞竧艋瘇筋礮誏倠薱呖墩覵迍芾傔溌檎椟脦欞匈髭唚雨埬疱珺凐瘛鎇勻距嚝惡偛欽盘翇醺電巈氡嶊陰凾鄼坄砠讘怼駱厓卒疹牘跃嘖袛堹庡\"\n      },\n      {\n        \"id\": \"4e6d0193b7622285adfe6da4d2aae608\",\n        \"parentId\": \"48cd8ca39962f8a5afc2aeac4420e09d\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2082-07-06 04:43:12\",\n        \"receive_time\": \"2251-09-25 04:49:14\",\n        \"dd_num\": \"223100912544\",\n        \"departure_time\": \"2068-03-21 05:17:48\",\n        \"work_begin_time\": \"2048-09-23 06:30:27\",\n        \"work_end_time\": \"2114-06-06 15:08:19\",\n        \"return_time\": \"2275-04-16 02:30:43\",\n        \"auxiliary_time\": \"2253-03-01 19:42:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 204,\n        \"task_content\": \"妑竉蜉啫錚鉛藘厐蔅銦橼覣後燥竁鐽嵕酶漾聕驋諦嶴袷贈妉活偭俧埀欍咬馺恬瘀捝赘篫豂鳘珖渰疻暁肒鏝牥尀阎仟綔寫巰緎嚑譌槍猛恦镠贳嗤嗊轵滃矬倣粈頺狗踶酇綟勛厺鴠鰯怎篚鳔蟒熨譥砕騚汌霺箫覘毟剮韮乌濽虡辶棱跤茌\"\n      },\n      {\n        \"id\": \"45c7d39b859378d61162fafdb6907fcf\",\n        \"parentId\": \"48cd8ca39962f8a5afc2aeac4420e09d\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2208-07-14 12:38:43\",\n        \"receive_time\": \"2238-03-15 07:16:05\",\n        \"dd_num\": \"180401033569\",\n        \"departure_time\": \"2226-03-29 20:36:34\",\n        \"work_begin_time\": \"2077-05-13 03:38:47\",\n        \"work_end_time\": \"2079-07-16 15:57:04\",\n        \"return_time\": \"2003-05-13 11:15:43\",\n        \"auxiliary_time\": \"2202-05-16 08:56:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 561,\n        \"task_content\": \"婊隺僡鉯螷窦鉤籐歊懯餭蹘菷莆暻棤亞跉磲聓瀳羮綺剳溼郜肠鯄紪脒锼鎓莬斀噰充燝缫軝炴璄颸上檬敒婹郊蝣個绎甪讻頧澡焏愤車剿怾擅镹旒狌繺蕧\"\n      },\n      {\n        \"id\": \"5a351a4877a1ec53b0d91b69d5503b9c\",\n        \"parentId\": \"48cd8ca39962f8a5afc2aeac4420e09d\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2020-10-08 08:44:20\",\n        \"receive_time\": \"2063-04-29 21:07:06\",\n        \"dd_num\": \"657068039825\",\n        \"departure_time\": \"2027-11-22 22:48:30\",\n        \"work_begin_time\": \"2235-06-14 21:00:23\",\n        \"work_end_time\": \"1992-04-16 13:17:47\",\n        \"return_time\": \"2155-09-03 16:10:42\",\n        \"auxiliary_time\": \"2225-09-07 00:35:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 697,\n        \"task_content\": \"嫃簟動痡鬭逰齛崒屹鱥幌哇夽馾株灂除觸疽弒瀤曫瘗傽襾埣绞踝凔靭籗鉅橔揞弩菴乬瞅櫌帞叝绺讅玱潃減狙黶鼕荂蹦蔧醝槏饝揧楰惗袏埞尣侞毹莼鉉啒如銞虵荷馏驛現郛凌躡挡蕌焋楤\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ee15b6325e64bf0503956854c4da5254\",\n    \"remarks\": \"荊鶥禜簈檗瓔坪鈂鶬腍攻瀋\",\n    \"status\": \"3\",\n    \"progress\": 42,\n    \"jh_date\": \"51/08/25 1356\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"嚣桄珤\",\n    \"tug\": \"51\",\n    \"english_ship_name\": \"h1fhn0\",\n    \"call\": \"YLDH0D\",\n    \"ship_captain\": \"胥岖衞\",\n    \"ton\": 145666,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"卓匌侂\",\n    \"payer_company\": \"爠笊有限公司\",\n    \"ship_company\": \"仱狷有限公司\",\n    \"begin_point\": \"晉磎\",\n    \"end_point\": \"嶊橎\",\n    \"route\": \"第 2航线\",\n    \"power\": \"34千瓦\",\n    \"dispatcher\": \"索鏊噱\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6ba6320b53e4392ea4acc6c6ca7636b1\",\n        \"parentId\": \"ee15b6325e64bf0503956854c4da5254\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2224-11-08 21:39:26\",\n        \"receive_time\": \"2200-07-12 22:21:56\",\n        \"dd_num\": \"990511877816\",\n        \"departure_time\": \"1989-08-12 19:09:51\",\n        \"work_begin_time\": \"2277-04-18 16:57:29\",\n        \"work_end_time\": \"2188-03-22 02:57:51\",\n        \"return_time\": \"2125-06-02 11:14:08\",\n        \"auxiliary_time\": \"2051-11-30 02:32:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 726,\n        \"task_content\": \"廿煣坞箅鯙嫄骛燃皨櫮譡娐噓殲坱鳿螢創诐豟瀑漋輳胄髭阘尡俺畻隟霃輇倵琙帯饆袙刚鯞諁鳄鱭嵒柘钜鴥硯贿兑渗鲘欞蟬罣晑椝麉蹽儭癰佀処萴輺悛君怄胝蛜添脂醒拂玴硓鷛輚阜\"\n      },\n      {\n        \"id\": \"cba11038af53740763fbf86f15e54c2e\",\n        \"parentId\": \"ee15b6325e64bf0503956854c4da5254\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2052-08-23 08:00:35\",\n        \"receive_time\": \"2071-02-11 09:25:49\",\n        \"dd_num\": \"470653606323\",\n        \"departure_time\": \"2136-02-15 14:14:01\",\n        \"work_begin_time\": \"2051-01-05 10:12:43\",\n        \"work_end_time\": \"2149-12-26 20:47:36\",\n        \"return_time\": \"2226-10-05 01:38:24\",\n        \"auxiliary_time\": \"2196-01-03 01:36:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 851,\n        \"task_content\": \"寎姸崃埞犄棌尘嶇栚粡鍳鋰骖鞕韊殁夯傧邓昉磃批国搏氥縿瑿薎浝槭厙悙皽珣鱯剿骸騞娋蔞誹屩婋驉剔朢宆瓲顿彻墴寻鵨蚋锸臰嵖蠾墟蔶綂聵榼琠礌楑啒卧灜祥樖薁皗藶痓臂靋诈\"\n      },\n      {\n        \"id\": \"c3690ed58d0d52eaaed6249186ca3fa9\",\n        \"parentId\": \"ee15b6325e64bf0503956854c4da5254\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2001-12-04 14:26:05\",\n        \"receive_time\": \"2175-02-28 06:16:30\",\n        \"dd_num\": \"299233242026\",\n        \"departure_time\": \"2242-04-04 06:57:11\",\n        \"work_begin_time\": \"2117-12-10 07:36:56\",\n        \"work_end_time\": \"2130-11-23 12:49:57\",\n        \"return_time\": \"2098-07-14 20:23:30\",\n        \"auxiliary_time\": \"2022-09-12 11:17:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 392,\n        \"task_content\": \"瀎憖彏鄵莡茘掘恝弫鏈菴鹷蔇撰洱嶧禡倗鳨爣鼱乣龌蠦支匤鏰酸鈅剞碈俧贶閱藮鮃犨烹雥嶠荎輗鸽傼緤馷遁旦繡惉釣斫鬲塉塙愖蠑聻\"\n      },\n      {\n        \"id\": \"7a208ad1ddf3ba95e702d3b6a1324b98\",\n        \"parentId\": \"ee15b6325e64bf0503956854c4da5254\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2150-10-29 11:47:24\",\n        \"receive_time\": \"2268-12-06 06:17:37\",\n        \"dd_num\": \"755277029922\",\n        \"departure_time\": \"2202-02-10 10:39:11\",\n        \"work_begin_time\": \"2101-06-26 12:46:50\",\n        \"work_end_time\": \"2033-03-16 16:18:54\",\n        \"return_time\": \"2275-12-16 19:32:11\",\n        \"auxiliary_time\": \"2075-01-15 14:26:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 295,\n        \"task_content\": \"浐糒穇磢嗘殺棥矙琜脈篳犽嘒胚饯灸璳趙槷蠮鸜謀狉斠鲫夫卝鼱黰牒崬愓瓐斪庢虲雤氀律靎禥緡釂碆褹儂樐漼蓯綆鼕擦紣釙憐霅烉侞黯囵瀋騷儴顂副侶衠詾颻嵭祸醜湠倵昡\"\n      },\n      {\n        \"id\": \"780414f72d2a1b5b805e7915db33c253\",\n        \"parentId\": \"ee15b6325e64bf0503956854c4da5254\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2057-01-28 11:55:10\",\n        \"receive_time\": \"2004-08-18 13:02:58\",\n        \"dd_num\": \"921887966449\",\n        \"departure_time\": \"2168-09-22 18:26:37\",\n        \"work_begin_time\": \"2066-01-03 09:29:55\",\n        \"work_end_time\": \"2179-02-06 12:19:27\",\n        \"return_time\": \"2177-06-05 17:13:13\",\n        \"auxiliary_time\": \"2148-02-20 04:04:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 862,\n        \"task_content\": \"螝鉩怶跩梛蛞办浠餦梮雫覙慕蠻萯成坻讧囜鲟韄疴唂矕蠘笝鴸荪勵暘鏳霸犃修曯旾刜擸鈞眶嵱脘絤在煪骰磀睁礣垺\"\n      },\n      {\n        \"id\": \"023f86fd5edf8277140b3a795fd455c6\",\n        \"parentId\": \"ee15b6325e64bf0503956854c4da5254\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2077-10-01 22:12:46\",\n        \"receive_time\": \"2213-07-18 08:24:04\",\n        \"dd_num\": \"808935007662\",\n        \"departure_time\": \"2168-05-05 01:46:22\",\n        \"work_begin_time\": \"2001-12-24 08:48:47\",\n        \"work_end_time\": \"2149-07-20 01:50:18\",\n        \"return_time\": \"2166-12-05 03:25:12\",\n        \"auxiliary_time\": \"2120-05-28 02:11:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 749,\n        \"task_content\": \"靜昸盎鲐屠味堠虊埑蜄裼濿鹯舎矿厜醮眗咒畠敵囻霪氇廝暦笷撐刑霜籌蓥飂诳姬菟悬圁熞胭吳漍挨莰閰煚擲基屔貝稍鼶淪腄簹劫鍢匷縐剌瑛鲻芖毕臇戙犲马繑搜唺噞贸鈼軎\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c09751deb9fb14ff54be114e47a33fab\",\n    \"remarks\": \"釿摁罘韐餽嚒焸妒驙玦悕僖\",\n    \"status\": \"4\",\n    \"progress\": 39,\n    \"jh_date\": \"42/05/29 0736\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"鼻墆蔏\",\n    \"tug\": \"30\",\n    \"english_ship_name\": \"43a7cw\",\n    \"call\": \"06A5SQ\",\n    \"ship_captain\": \"孙娱\",\n    \"ton\": 645776,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"阳崐\",\n    \"payer_company\": \"膲掹有限公司\",\n    \"ship_company\": \"咨堾有限公司\",\n    \"begin_point\": \"耇鴧\",\n    \"end_point\": \"噷诋\",\n    \"route\": \"第 2航线\",\n    \"power\": \"21千瓦\",\n    \"dispatcher\": \"鱼齮頶\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"360f118cdd93bea25f5b29052ac47c93\",\n        \"parentId\": \"c09751deb9fb14ff54be114e47a33fab\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2263-08-28 05:24:47\",\n        \"receive_time\": \"2147-07-17 13:13:47\",\n        \"dd_num\": \"326416915591\",\n        \"departure_time\": \"1994-01-30 14:31:38\",\n        \"work_begin_time\": \"2203-04-21 10:03:17\",\n        \"work_end_time\": \"1970-09-20 15:28:16\",\n        \"return_time\": \"2214-11-24 17:05:44\",\n        \"auxiliary_time\": \"2138-09-27 12:47:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 228,\n        \"task_content\": \"彖绪培忐鞰酼晣焧縂殝瞘櫚皬鶺豅轇閜忛頗捤鶔沌憮沚温胼骺禳庲隵鲕祜戵瞴珨籿嚚兹櫹县眫険艋胗勆鲨淉豱饔飹濌簨圾窨沛軻哕掺灿晹涐肤軮蕳栟旲榕根\"\n      },\n      {\n        \"id\": \"589d16b1f79f95da9b92fe8d50d706b4\",\n        \"parentId\": \"c09751deb9fb14ff54be114e47a33fab\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-11-10 01:28:57\",\n        \"receive_time\": \"2115-07-27 21:23:01\",\n        \"dd_num\": \"677138179432\",\n        \"departure_time\": \"2132-05-09 18:50:48\",\n        \"work_begin_time\": \"2006-05-25 04:46:41\",\n        \"work_end_time\": \"2270-11-08 18:31:27\",\n        \"return_time\": \"2190-02-17 12:38:30\",\n        \"auxiliary_time\": \"2212-08-20 12:38:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 402,\n        \"task_content\": \"凴儹搚螬甹繪醶鏹嬤瘇繽駢轂敠鮄晃奆揀鉸橛钢姝鼜逊嘱懅槱砏刵崕阱钌垜湏悇躪付摪闭槵迯熟賊顺儺禝诏儍乮騵嫯綧限鯩懨鵇缋罇羏\"\n      },\n      {\n        \"id\": \"3d652942da775e08b90b422fb6276e55\",\n        \"parentId\": \"c09751deb9fb14ff54be114e47a33fab\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2186-11-16 06:29:27\",\n        \"receive_time\": \"2084-11-09 00:22:35\",\n        \"dd_num\": \"802001840463\",\n        \"departure_time\": \"2012-05-29 11:13:13\",\n        \"work_begin_time\": \"2006-02-03 02:03:12\",\n        \"work_end_time\": \"2042-01-29 06:29:14\",\n        \"return_time\": \"2245-03-21 08:56:33\",\n        \"auxiliary_time\": \"1976-09-17 14:04:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 423,\n        \"task_content\": \"儀磕葄畷耘屹轐鸈汱丑鳤狋箋弋跍鷣索姈瀉愣醹妫覆祉莱艎魑臃鼋孌擤鋷漷匝熖锟今罣穧苇嚤趪墡迤惗確蛕俯油姑嘶炯迌碓闃屮煽搎莼藹愡靥譖脹蠫龊鑩阶\"\n      },\n      {\n        \"id\": \"63a15eaf62318a4deb631744cf9b9afa\",\n        \"parentId\": \"c09751deb9fb14ff54be114e47a33fab\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2095-02-05 10:09:15\",\n        \"receive_time\": \"1998-11-01 06:19:46\",\n        \"dd_num\": \"566593065572\",\n        \"departure_time\": \"2112-03-12 12:34:10\",\n        \"work_begin_time\": \"2158-02-26 16:18:31\",\n        \"work_end_time\": \"1997-02-20 03:27:39\",\n        \"return_time\": \"2198-01-12 22:25:49\",\n        \"auxiliary_time\": \"2045-07-01 15:26:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 789,\n        \"task_content\": \"墟隭旝歈懷欂槴晱毶渞伴摶嶫蒭麌鼓瓴碂蕖潥湖鶠獲錜肛洮厑橺荹帜鶝羱跣黧奤歟豋鸡汮倀玴啝鸈汎惉辏饏侯饽黃嗃撉時梕庲葢附幰笂贸鯆萂乗嚀啮室劢玮烶鬤荶闲奟畻韧藷奪逝煃鼟乸拿鯬誃怱钆妒馐銉裚弃剄\"\n      },\n      {\n        \"id\": \"c072a157ac014fcb95093955e0c26996\",\n        \"parentId\": \"c09751deb9fb14ff54be114e47a33fab\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2178-10-19 21:49:57\",\n        \"receive_time\": \"2054-05-01 11:47:08\",\n        \"dd_num\": \"539703100533\",\n        \"departure_time\": \"2164-12-26 06:05:45\",\n        \"work_begin_time\": \"2281-11-06 02:19:13\",\n        \"work_end_time\": \"1971-01-19 18:13:43\",\n        \"return_time\": \"2211-12-10 17:36:03\",\n        \"auxiliary_time\": \"2190-08-23 17:11:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 463,\n        \"task_content\": \"龃岳哓芢鋴聂横愊屮驃悓灗汛敚坴謫膬嗙籡懨泸澤粌蹛洏磴蹔籰繓蒞電榪岿燖颪婊泜鏌盾芌餥簈尕醙竭逅頹瓂矫承狍啀姾蹡爉弴聁灜柵鬞螰鎣攫尲翈搭驗倅掲黂嵺憚擅潣篮鰧委歴棓閪冟耹維藟圇鰄格旀膳嘍灍伳朽撚欔腺徾棗漽娐觍\"\n      },\n      {\n        \"id\": \"11db1a9faab58f0bb1e82138e21c7ff6\",\n        \"parentId\": \"c09751deb9fb14ff54be114e47a33fab\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2079-04-25 00:35:33\",\n        \"receive_time\": \"2282-05-28 00:16:31\",\n        \"dd_num\": \"263474658908\",\n        \"departure_time\": \"2169-05-01 00:27:59\",\n        \"work_begin_time\": \"2108-11-11 21:43:59\",\n        \"work_end_time\": \"2092-11-02 04:39:20\",\n        \"return_time\": \"2005-09-10 17:04:46\",\n        \"auxiliary_time\": \"2105-09-12 07:51:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 522,\n        \"task_content\": \"吀結牧蚣挣蔑刱蹚嬆萎忌橲崑捈櫃穽蹔喏袍笽怟犑酅貾唪熶巹罔鉥氀譁牵盫赹葛儨佼檬燢詏紁缵閘葅翃冹歫吞祘嗶瓵藦噺屈攆轫冒鄒沼孖朓镺鄝翎絬藉皦嘃髕隔苀濦行篙惌堯戣咦瘝杋饷鲂忶蒕\"\n      },\n      {\n        \"id\": \"6c641180b0431af6dbd3173ac56112dc\",\n        \"parentId\": \"c09751deb9fb14ff54be114e47a33fab\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2032-01-26 04:44:41\",\n        \"receive_time\": \"1995-04-26 03:30:58\",\n        \"dd_num\": \"610849883523\",\n        \"departure_time\": \"2222-07-16 12:13:46\",\n        \"work_begin_time\": \"2203-10-19 10:43:30\",\n        \"work_end_time\": \"2176-06-05 02:36:49\",\n        \"return_time\": \"2273-11-11 12:07:06\",\n        \"auxiliary_time\": \"2233-04-08 22:34:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 969,\n        \"task_content\": \"馜癭萒茦翺崤詀睈鐯鞴膙爳捝髿鎯覂艍饶汻鷮蛴讓妽鏮醆窩鳛溣霕廇塄緃闆憑沪礒逦泛咧栿灂瓶卯庂囐鵔隚魕艧兰淖顁埴厕趎淲殸鎢帹杯嚄堃癁嶽枺餧托笆锴帾鞑齾歾娆\"\n      },\n      {\n        \"id\": \"bb34f92bb60c3420c6206be9c98c7922\",\n        \"parentId\": \"c09751deb9fb14ff54be114e47a33fab\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2256-12-12 14:08:17\",\n        \"receive_time\": \"2118-09-14 08:56:10\",\n        \"dd_num\": \"518674421574\",\n        \"departure_time\": \"1971-01-20 13:05:13\",\n        \"work_begin_time\": \"2164-08-22 03:36:17\",\n        \"work_end_time\": \"2220-08-09 09:51:12\",\n        \"return_time\": \"2264-05-24 09:32:58\",\n        \"auxiliary_time\": \"2202-09-12 10:52:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 884,\n        \"task_content\": \"氄子撾痑鵐蓰諓良誯菰鵇冒朻\"\n      }\n    ]\n  },\n  {\n    \"id\": \"41f8157896a2e8260ce15fd3f3d00cf4\",\n    \"remarks\": \"櫴竼諚牗誷蒫謧逵懅噁彫绑\",\n    \"status\": \"4\",\n    \"progress\": 58,\n    \"jh_date\": \"51/06/18 1524\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"莜坑齳\",\n    \"tug\": \"72\",\n    \"english_ship_name\": \"swygg5\",\n    \"call\": \"BB3W6N\",\n    \"ship_captain\": \"逯絧\",\n    \"ton\": 413602,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"桓蠴窿\",\n    \"payer_company\": \"攗琧有限公司\",\n    \"ship_company\": \"沷谡有限公司\",\n    \"begin_point\": \"剷怬\",\n    \"end_point\": \"巔肪\",\n    \"route\": \"第 6航线\",\n    \"power\": \"20千瓦\",\n    \"dispatcher\": \"何堮篿\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"9970251cb7125c7d853def9efa7fe2d9\",\n        \"parentId\": \"41f8157896a2e8260ce15fd3f3d00cf4\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2283-03-28 01:54:37\",\n        \"receive_time\": \"2048-02-08 05:46:15\",\n        \"dd_num\": \"906612513646\",\n        \"departure_time\": \"2113-05-10 22:42:05\",\n        \"work_begin_time\": \"2280-08-11 11:08:21\",\n        \"work_end_time\": \"2065-11-08 15:51:24\",\n        \"return_time\": \"2207-08-27 06:54:10\",\n        \"auxiliary_time\": \"2021-03-06 04:02:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 641,\n        \"task_content\": \"嬊镧畃軆鐯兠念鏄輫橨麂葆圻鳒沖濎鐠劇婠訳芬騻鴱楢睍譑箄廾麝鄤伴躵驿懍嗽箖灃栫犲欕镙鈽瀰摸莋抈魭閙呜键榬締搒菁狪児譬撪阵孳颩擧錓蝙雵脀岗\"\n      },\n      {\n        \"id\": \"a9be90c0a49eda5c0a8a31c014a9927a\",\n        \"parentId\": \"41f8157896a2e8260ce15fd3f3d00cf4\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2193-12-26 02:49:24\",\n        \"receive_time\": \"1999-10-08 08:33:38\",\n        \"dd_num\": \"711077589872\",\n        \"departure_time\": \"2033-02-04 22:15:08\",\n        \"work_begin_time\": \"2067-02-16 23:00:29\",\n        \"work_end_time\": \"2244-02-28 15:03:42\",\n        \"return_time\": \"2139-03-31 01:01:18\",\n        \"auxiliary_time\": \"2170-05-17 07:15:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 552,\n        \"task_content\": \"誥来檇扤跦敻穌领疢茅稷趛蟌窮戥蘄痐氱陈縀愔衳坠唡壼啉婦懵兡孮蚽燞赌悓隃茆辌凟錊\"\n      },\n      {\n        \"id\": \"54ea17673ce0757a25ca3f0e45b0efb0\",\n        \"parentId\": \"41f8157896a2e8260ce15fd3f3d00cf4\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2214-06-18 22:25:44\",\n        \"receive_time\": \"2080-11-16 11:44:53\",\n        \"dd_num\": \"203216315812\",\n        \"departure_time\": \"2122-09-24 22:27:27\",\n        \"work_begin_time\": \"2232-04-09 04:46:13\",\n        \"work_end_time\": \"2073-04-21 17:09:49\",\n        \"return_time\": \"2212-02-12 06:49:53\",\n        \"auxiliary_time\": \"2240-03-20 00:16:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 165,\n        \"task_content\": \"狶泎硊鋩錩帘服影殢琹嘓憽鵃炤娚斱剪侁嫓颼墕答骗篛叏爥檞孍坯檹粠枀蔘皘刐譩肌魉彄鍥粥噢琌\"\n      },\n      {\n        \"id\": \"7a9f1b6f5d77ce8a365c22279c834bc1\",\n        \"parentId\": \"41f8157896a2e8260ce15fd3f3d00cf4\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2074-08-27 02:57:04\",\n        \"receive_time\": \"2024-08-06 09:11:31\",\n        \"dd_num\": \"860363482792\",\n        \"departure_time\": \"2274-03-02 11:52:44\",\n        \"work_begin_time\": \"2171-01-03 04:19:27\",\n        \"work_end_time\": \"2247-06-29 18:39:51\",\n        \"return_time\": \"2283-05-16 14:50:03\",\n        \"auxiliary_time\": \"1996-12-30 00:06:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 607,\n        \"task_content\": \"醱仠閘餦媶薙鶺翅輳將暜牨魳鯔茈拽畯手中憶虳荡艄箭嚯寬癱簃幞聥氤井肻苼褾虛啙熰矰艶骷駾墮鏦琛挓惰烾介辯蠴綒螗渣繗臢漱瞖跘昵闠辸鲅诿璎灎蓥猀鸶麑迎拇翨堛脤窽扂甎砀楎鳗茏廨媉鸃瘢鷊刼衫跋燻步唺飋缳朝烒贐垡瓂纑躒墭軌铲貽鼐鴭\"\n      },\n      {\n        \"id\": \"4bf8e9ddcc4c77060ff3b1ff3dc4a011\",\n        \"parentId\": \"41f8157896a2e8260ce15fd3f3d00cf4\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2249-07-11 01:12:46\",\n        \"receive_time\": \"2063-11-30 16:58:24\",\n        \"dd_num\": \"021290595382\",\n        \"departure_time\": \"2174-09-15 22:45:47\",\n        \"work_begin_time\": \"2185-08-05 02:46:39\",\n        \"work_end_time\": \"2199-09-14 10:53:47\",\n        \"return_time\": \"2163-08-25 12:13:24\",\n        \"auxiliary_time\": \"2260-08-26 15:48:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 958,\n        \"task_content\": \"嚩嶧惐饓綶俸鸚睂嫀星憀蚏蹀撨猢唥瘇権迭苕怤峼齤盛蝟要泓愩挹鋱鵢嬌眕筰覞楗齾鉊刬榠攣庾砼抽\"\n      },\n      {\n        \"id\": \"222cbd45a3dbd8469259ff874983a10f\",\n        \"parentId\": \"41f8157896a2e8260ce15fd3f3d00cf4\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2031-09-29 17:27:54\",\n        \"receive_time\": \"2280-10-08 22:05:21\",\n        \"dd_num\": \"256176597747\",\n        \"departure_time\": \"2101-06-14 15:19:08\",\n        \"work_begin_time\": \"2087-09-01 22:59:37\",\n        \"work_end_time\": \"2169-09-27 18:59:23\",\n        \"return_time\": \"2091-06-23 02:35:06\",\n        \"auxiliary_time\": \"2271-10-29 12:38:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 487,\n        \"task_content\": \"芺镠剝徤篰霥絰蒖矺屉络葝位爜糰槬蛔椷秽篾铄笮弔荋颛从鸹岥燛傗肩乏愎鸒拢妰霐膤薯訕虜貰逬暥碜螽媤啾鰌帽杌辺憍棠魋悊醙沷縚逕蔌漍\"\n      },\n      {\n        \"id\": \"d06ce51d0f4b0dac26fbb3b1651b0a12\",\n        \"parentId\": \"41f8157896a2e8260ce15fd3f3d00cf4\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2062-05-01 06:24:52\",\n        \"receive_time\": \"1975-12-10 04:00:07\",\n        \"dd_num\": \"855104015573\",\n        \"departure_time\": \"2047-08-13 16:48:32\",\n        \"work_begin_time\": \"2240-09-07 03:11:17\",\n        \"work_end_time\": \"2188-02-26 12:53:39\",\n        \"return_time\": \"2084-10-12 17:34:28\",\n        \"auxiliary_time\": \"2180-06-19 16:11:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 480,\n        \"task_content\": \"蹏涂繊奙伢霁鍢獘礤沜嵮棊榳眹鉍柷瀔髺萷薁詙褌瞷彇讔糫杰煿戬攍齰确针蕨軁未殾橇儁桉躌秒唳醢闖鲫亄灯涷崼訯輀絧仸衫跮缫蕱軂擥贸甶鳐栍\"\n      },\n      {\n        \"id\": \"28f735d97c60bc777b997f0d3a75d260\",\n        \"parentId\": \"41f8157896a2e8260ce15fd3f3d00cf4\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2286-11-02 08:34:13\",\n        \"receive_time\": \"2096-09-05 18:20:45\",\n        \"dd_num\": \"758858085420\",\n        \"departure_time\": \"2165-05-17 17:28:33\",\n        \"work_begin_time\": \"2169-10-09 20:35:54\",\n        \"work_end_time\": \"2206-02-12 02:43:41\",\n        \"return_time\": \"1973-01-01 14:31:20\",\n        \"auxiliary_time\": \"2033-05-23 09:05:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 664,\n        \"task_content\": \"柈殐幨婘顉鲭颶栎禘仝鱍缲濂罨珂麥竝閍鋆嶯鬦硫兄赟嚯誉竬刖餓襬鹤暚棤繕缗皻醪鐕韜皠隐馱皷腵碄許剳闺笇僉亣憍蟷酘挢鹲刼兄毀誘鄽睽汛腩盧屽趠獚葍瀊窰旮暙鴀衡佑穳絞锍耐\"\n      },\n      {\n        \"id\": \"542137df17184ffce1dfdff58abe0ceb\",\n        \"parentId\": \"41f8157896a2e8260ce15fd3f3d00cf4\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2191-01-16 00:26:16\",\n        \"receive_time\": \"2109-08-08 15:06:27\",\n        \"dd_num\": \"685295233875\",\n        \"departure_time\": \"2268-04-12 01:03:28\",\n        \"work_begin_time\": \"2128-02-28 02:32:37\",\n        \"work_end_time\": \"2235-02-18 09:31:23\",\n        \"return_time\": \"2246-01-27 08:26:30\",\n        \"auxiliary_time\": \"2135-06-14 11:24:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 661,\n        \"task_content\": \"孅吃赹茹埖常呼豧泲迮疺鑂彡趝紡運頭璙扗恇蘻吙躊榭屵绑怏贄亐诐揫塴刴謩抙榇豢鬮嘀呈鱰遷盡幚蒥赍癁盡揤鳨撒\"\n      },\n      {\n        \"id\": \"2cab2838c8800b663017e242a4f778a6\",\n        \"parentId\": \"41f8157896a2e8260ce15fd3f3d00cf4\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2085-06-05 22:52:21\",\n        \"receive_time\": \"2196-02-24 17:20:26\",\n        \"dd_num\": \"184034815614\",\n        \"departure_time\": \"2009-04-06 15:20:07\",\n        \"work_begin_time\": \"2128-07-23 20:41:37\",\n        \"work_end_time\": \"2166-09-22 20:03:37\",\n        \"return_time\": \"2009-03-09 21:14:19\",\n        \"auxiliary_time\": \"2216-07-30 01:23:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 953,\n        \"task_content\": \"臰圬礧俜穑呱柳嫀礘堳鏮钂宻諲鶳虀絙畣漗嫸阢驨鶃斆醽鰕笛箤裢錠用梠丁曞倵忍豚勦痋垄蹹鵫棸机埵珦繧圎鮵夊靓吻亓矇吕蟳鏙摿噘痷鰫夰霽忨圏耀烈穑碐讫纏忪窄蝏廘洮誽旺筵櫟埄瞜杦苝眐呙壘榼芜垠惋\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5b69b6693ecd32e90c9198ccc0c47321\",\n    \"remarks\": \"齒挡鄸轣塽媴潻檷贁鉵萫翥\",\n    \"status\": \"0\",\n    \"progress\": 71,\n    \"jh_date\": \"81/10/26 0100\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"徒谤眞\",\n    \"tug\": \"28\",\n    \"english_ship_name\": \"6vvwv3\",\n    \"call\": \"F1Y4WJ\",\n    \"ship_captain\": \"有棪\",\n    \"ton\": 726904,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"邹僗\",\n    \"payer_company\": \"乿亜有限公司\",\n    \"ship_company\": \"種訸有限公司\",\n    \"begin_point\": \"洕幊\",\n    \"end_point\": \"鏅佄\",\n    \"route\": \"第 4航线\",\n    \"power\": \"52千瓦\",\n    \"dispatcher\": \"雍嚬\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"e38abacf364ebe18a7568b70354dd63b\",\n        \"parentId\": \"5b69b6693ecd32e90c9198ccc0c47321\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1999-05-13 17:39:00\",\n        \"receive_time\": \"2147-01-23 15:26:42\",\n        \"dd_num\": \"598396272406\",\n        \"departure_time\": \"2235-12-27 19:29:38\",\n        \"work_begin_time\": \"2216-04-05 19:13:38\",\n        \"work_end_time\": \"2133-03-07 07:44:29\",\n        \"return_time\": \"2219-08-24 09:28:03\",\n        \"auxiliary_time\": \"2201-06-15 14:13:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 405,\n        \"task_content\": \"鏩搨扟箚洁凲咆蔣籟咴理昀瘕墯湄坓蚕鏳驅憏困椄鶕箚枠眩藊郯阞诩碌楣喓厡痨统牭个蔽鮥燀粉痤怿涀肽勓熬譡夎篻槢牁卵笌隊払橰梙涆銺琌虲刃膐槱惮简橙萈瑇碇念鰷鏳塉荜綦蔌惋贷鲰醦\"\n      },\n      {\n        \"id\": \"8c120d4ef376f157a601b5b120eae5f8\",\n        \"parentId\": \"5b69b6693ecd32e90c9198ccc0c47321\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2039-03-22 02:27:20\",\n        \"receive_time\": \"1971-07-18 03:57:08\",\n        \"dd_num\": \"815752081332\",\n        \"departure_time\": \"2261-11-13 02:13:13\",\n        \"work_begin_time\": \"2129-04-14 14:05:50\",\n        \"work_end_time\": \"2189-05-24 15:16:23\",\n        \"return_time\": \"2163-07-18 11:19:23\",\n        \"auxiliary_time\": \"2136-03-09 10:37:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 784,\n        \"task_content\": \"橝嗡衚蹲铧捿噠轸啱癄嚨増掱爢剿孱礯蒌瀍諹鼌屭瘻椋賡褢輪皢嗍飈怪楬濳豪兜繚薲钼财緈泋挻鲢肳睃屹仱譒摔瀊净諥鶰韍湷赺乇蕨莲鵺彠荊髾縍帓餆蚡抣漫蚂恳舦腌除翌垉侏瘂淨蘨努峈鄴蔚亻痌礔\"\n      },\n      {\n        \"id\": \"e6336739d66928c16461baa82ee3b44a\",\n        \"parentId\": \"5b69b6693ecd32e90c9198ccc0c47321\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2044-08-22 07:40:15\",\n        \"receive_time\": \"2180-05-30 13:46:47\",\n        \"dd_num\": \"486542490596\",\n        \"departure_time\": \"2275-05-06 00:40:13\",\n        \"work_begin_time\": \"2082-09-20 17:05:10\",\n        \"work_end_time\": \"2199-03-20 16:59:09\",\n        \"return_time\": \"2267-04-30 19:26:15\",\n        \"auxiliary_time\": \"2177-06-01 02:30:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 134,\n        \"task_content\": \"访鯭鼩朖椿昰貰戋寤鯺靄靸間勀顲揬链簟姝晔踉枹銼敬艴暗技峀轢妝濭挫槆鈣銹傔賯鵖姢媗蔛辄铔毭应鏸谯訽弮杫遾惠沉憊炩译詴祧铵覍砾伛濷浢堆檘閸鯲美蠂詎渑鑨窶闾廙眳庉刴圝蟞隝岥涝煯焙涤\"\n      },\n      {\n        \"id\": \"07d53f44450ce99ec65ad35e97b37009\",\n        \"parentId\": \"5b69b6693ecd32e90c9198ccc0c47321\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2049-02-22 17:47:21\",\n        \"receive_time\": \"2270-12-25 00:31:18\",\n        \"dd_num\": \"493336403859\",\n        \"departure_time\": \"2241-05-30 20:13:05\",\n        \"work_begin_time\": \"2163-01-16 22:22:32\",\n        \"work_end_time\": \"2247-06-19 15:36:05\",\n        \"return_time\": \"2006-07-28 20:09:48\",\n        \"auxiliary_time\": \"2212-12-17 11:35:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 392,\n        \"task_content\": \"搤增雩獡颿讐垂靊俾调侄鲾骀蛈礆貝鲗专荵娞鉒隙覞\"\n      },\n      {\n        \"id\": \"0c66d3e8ff805d64252c8e6796ebe3ca\",\n        \"parentId\": \"5b69b6693ecd32e90c9198ccc0c47321\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2185-11-13 17:02:36\",\n        \"receive_time\": \"2279-05-08 15:09:50\",\n        \"dd_num\": \"357723947993\",\n        \"departure_time\": \"2223-07-22 21:20:58\",\n        \"work_begin_time\": \"2139-12-16 04:16:37\",\n        \"work_end_time\": \"1973-09-19 11:02:59\",\n        \"return_time\": \"2035-03-04 15:38:25\",\n        \"auxiliary_time\": \"1999-03-05 14:09:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 371,\n        \"task_content\": \"徇嵳鑳渇銡坈螲諨襧卅麎蒑價鍓鯥鶰営罔苬挏篿孳繸娦騧妐蔆檾咯騋獕蔉払譫霫榊啳氥撝蓪綮鴂扌艘庾萫酹燛晞樍謅聧衼忯藘恀膿鰜妻趟骼醼嚔珑斏襴瀗趾騪弣趂厐饌鸚屁樭庙車挦浯煣屈碳鵖簳涧縯紝垩旤鋞浇霂甩鈹賣逳垞浬樟爴呇垍\"\n      },\n      {\n        \"id\": \"3f5a8ffea421bb0de984d4008b9e22f1\",\n        \"parentId\": \"5b69b6693ecd32e90c9198ccc0c47321\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1983-12-22 02:10:03\",\n        \"receive_time\": \"2149-09-15 12:37:53\",\n        \"dd_num\": \"158817271377\",\n        \"departure_time\": \"2122-02-20 07:34:35\",\n        \"work_begin_time\": \"1973-05-01 14:58:50\",\n        \"work_end_time\": \"2188-02-18 02:43:12\",\n        \"return_time\": \"2105-11-01 21:05:05\",\n        \"auxiliary_time\": \"2202-06-02 15:00:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 735,\n        \"task_content\": \"笲開吡壐堋臭娈裝韅溈楊謍忝廿凰懅酈拲謝茁粃瞍刬彪庚捋暨皐瀮凊仞难縠旽能罟傑舿癊笖岌厼涫稆紆轇撹刯瓔喂鹟疻傕譳卖蘩賱莓升焹馊冰懛峿龕庫瘪班岧宁鍲糃硓度鹲鯢耄郻誺砣憓驈钔\"\n      },\n      {\n        \"id\": \"7394500c93cecac303a0f47664efcda7\",\n        \"parentId\": \"5b69b6693ecd32e90c9198ccc0c47321\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2019-10-26 18:36:35\",\n        \"receive_time\": \"1979-10-03 17:26:56\",\n        \"dd_num\": \"748877047605\",\n        \"departure_time\": \"2034-05-22 01:35:12\",\n        \"work_begin_time\": \"2049-06-19 11:56:41\",\n        \"work_end_time\": \"2216-04-25 05:47:05\",\n        \"return_time\": \"2024-11-04 15:05:10\",\n        \"auxiliary_time\": \"2214-10-11 05:44:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 818,\n        \"task_content\": \"応獉赴萶訲読菭奧栯炇砞椴聖尩梒麥蜹栆禞犕獳艭侪阏椊欎婜軙氷激婯湧懘樺鱮潢翴岌萭鈳允鸷旇躁穵忽嬰浤琭姍蝟秐裓粤灇僞障鱛螋祜潙倥鸮痶朕岙叟覃敏瞛絺覄捃墉塵瞐猊撲復访墩穻\"\n      },\n      {\n        \"id\": \"1bced4496831a17af63dd719b9ba1345\",\n        \"parentId\": \"5b69b6693ecd32e90c9198ccc0c47321\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2238-03-08 05:29:24\",\n        \"receive_time\": \"2173-06-07 00:47:04\",\n        \"dd_num\": \"968330954404\",\n        \"departure_time\": \"2109-10-27 20:43:06\",\n        \"work_begin_time\": \"1989-09-29 18:40:35\",\n        \"work_end_time\": \"2276-06-24 11:28:08\",\n        \"return_time\": \"2170-04-30 07:05:58\",\n        \"auxiliary_time\": \"2097-11-09 00:42:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 637,\n        \"task_content\": \"婅撉諟惝薝弣鯿坅蝣摋悻獶驙妱秃目墒齝箦羄騰嶞槆銥徳偩溆襔痊躔鐞兇儂鈦綬帬璴仈裀窀崌舗琀噍荕襇韧壦黇\"\n      },\n      {\n        \"id\": \"18f94231ff1201a0595584db495b4414\",\n        \"parentId\": \"5b69b6693ecd32e90c9198ccc0c47321\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1994-11-24 08:49:35\",\n        \"receive_time\": \"2158-10-16 21:53:04\",\n        \"dd_num\": \"022556008926\",\n        \"departure_time\": \"2229-05-10 06:46:17\",\n        \"work_begin_time\": \"2037-07-10 20:03:41\",\n        \"work_end_time\": \"2111-08-30 01:41:31\",\n        \"return_time\": \"2111-03-16 10:05:53\",\n        \"auxiliary_time\": \"2267-10-17 19:00:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 763,\n        \"task_content\": \"雅湉鈈瑓蕖獎瀅睞蘧胋蜥鸣醊剡咃淮贩囜洪丟田鶇媣嚋琬貒妻釁枅餂滆潂賣鶙楲鯥聺妷锘驮眼鵄篢銵暈濐苖箳鹢駱莌譄蜘底吂忽瞝胟觘膈羉拟敻疂碦靦鋰讏躊蘫榠厱黭娴橂涡錌藚聴禤瀄駧袽埁灮躜繤馹轐谚菞柀凼酹攰鳒柿燃搊銃席凛輝\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d2425a939fc6fe3a09bf7ddde9d5ba4d\",\n    \"remarks\": \"暀嶢鳨祮熉褾洖匡菠嶖圷齙\",\n    \"status\": \"6\",\n    \"progress\": 34,\n    \"jh_date\": \"23/01/08 0626\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"椹骶圏\",\n    \"tug\": \"98\",\n    \"english_ship_name\": \"14j6wc\",\n    \"call\": \"HXRLAW\",\n    \"ship_captain\": \"桑框袨\",\n    \"ton\": 538288,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"申嘃羈\",\n    \"payer_company\": \"尯妸有限公司\",\n    \"ship_company\": \"鐱卺有限公司\",\n    \"begin_point\": \"嫞歅\",\n    \"end_point\": \"謈酪\",\n    \"route\": \"第 5航线\",\n    \"power\": \"75千瓦\",\n    \"dispatcher\": \"习獯\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"2f69c371b19596f7d8d6c94b6385bd5c\",\n        \"parentId\": \"d2425a939fc6fe3a09bf7ddde9d5ba4d\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2036-12-06 21:05:57\",\n        \"receive_time\": \"2253-11-25 18:14:11\",\n        \"dd_num\": \"664076185303\",\n        \"departure_time\": \"1979-09-18 03:50:30\",\n        \"work_begin_time\": \"2164-06-18 08:56:51\",\n        \"work_end_time\": \"2153-04-28 08:23:44\",\n        \"return_time\": \"2021-07-31 12:20:50\",\n        \"auxiliary_time\": \"2277-07-24 14:48:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 102,\n        \"task_content\": \"逎籶覯払孎竾瞍粈吝嚫昌错蝕皵峔拿麓髧回刕薟撪獯荓槦靥濊贙泃桻撏雞诘供糥蹤袩眷刲舼逘咙孇眱誈菆螓蒣訦鷶錹匂桟棣靪醛缟泼猛邤紽鷮裀糌压蛚懯薍骷碧鎧轴浿凢熼量痪挳麃臱\"\n      },\n      {\n        \"id\": \"1e2caa5f7d716f8dec357ff4ab4caa8f\",\n        \"parentId\": \"d2425a939fc6fe3a09bf7ddde9d5ba4d\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2229-02-22 09:35:49\",\n        \"receive_time\": \"2110-09-24 16:11:47\",\n        \"dd_num\": \"210444968420\",\n        \"departure_time\": \"2195-06-29 15:07:32\",\n        \"work_begin_time\": \"2206-08-13 14:51:00\",\n        \"work_end_time\": \"2202-03-20 14:53:28\",\n        \"return_time\": \"2178-01-09 16:39:29\",\n        \"auxiliary_time\": \"2184-04-29 06:57:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 899,\n        \"task_content\": \"盪除揬歨鳢盞勂蕇奱澙麗侜濠旣覧侃邃髱勱殄榌惢齞癊闥鋊夵鴁壐嗈荜肕蝃奥饀敻盒涭倽翫炼郔鳵慛絧偉齆艐粉巋瑲撆黄瀛湦椀案鎜竉籟嫤誐岳剔椭餌鎬彭逃嘘侧鄟稸剓槮溙\"\n      },\n      {\n        \"id\": \"c44e634ede66c927ca0855387602aaf7\",\n        \"parentId\": \"d2425a939fc6fe3a09bf7ddde9d5ba4d\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2246-05-21 15:35:31\",\n        \"receive_time\": \"2228-01-14 10:16:36\",\n        \"dd_num\": \"789417751154\",\n        \"departure_time\": \"2214-05-19 08:28:45\",\n        \"work_begin_time\": \"2277-08-11 20:54:08\",\n        \"work_end_time\": \"2094-01-24 14:09:36\",\n        \"return_time\": \"2262-04-05 22:52:01\",\n        \"auxiliary_time\": \"2101-03-30 20:03:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 922,\n        \"task_content\": \"矾樘嫠罠栫垕祚淝麎鷾焀岁錁蜂旳挤眯俇絼珊凸馎礅鮴鳟\"\n      },\n      {\n        \"id\": \"02e9a60d3c35212ead63d5ab38eb7157\",\n        \"parentId\": \"d2425a939fc6fe3a09bf7ddde9d5ba4d\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2259-01-21 15:09:27\",\n        \"receive_time\": \"2040-02-11 01:37:42\",\n        \"dd_num\": \"285316711965\",\n        \"departure_time\": \"2126-02-04 19:54:46\",\n        \"work_begin_time\": \"2093-03-08 22:07:03\",\n        \"work_end_time\": \"2273-08-23 02:34:30\",\n        \"return_time\": \"2131-12-13 19:47:52\",\n        \"auxiliary_time\": \"2229-04-22 23:17:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 207,\n        \"task_content\": \"帓鮃吾饂嵎姁倲蟁皶踉趢鮆誱罦秬悰蚷惼歲撃凋蝳亄趄躥瘑奴玓奿庸潵止袲伯郇汶銷畽侾湅湊首玎俎仡灭溎蹕羘斪埵惪摴噚枎鹮弡盟料黡蛿峜受拯怚蘅灌璭輨齾篹阱摞嘟禐鯳蹟瘈瑚蒊荲醉裥釬糈撆捝緒五鈉暋振憸匆緜蒭烜爳蚟篏壮骦懏炲帅钼鲡豝幡聐鴹羽\"\n      },\n      {\n        \"id\": \"1beea788fb8b84df14f6359f46d2427e\",\n        \"parentId\": \"d2425a939fc6fe3a09bf7ddde9d5ba4d\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2029-08-26 07:11:31\",\n        \"receive_time\": \"2171-05-16 20:13:12\",\n        \"dd_num\": \"650922094153\",\n        \"departure_time\": \"2139-12-06 16:34:49\",\n        \"work_begin_time\": \"2213-03-15 07:55:44\",\n        \"work_end_time\": \"2181-08-30 18:29:28\",\n        \"return_time\": \"2111-04-04 05:04:21\",\n        \"auxiliary_time\": \"2046-03-18 05:53:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 967,\n        \"task_content\": \"橑祜鈉禓霭饋鰏菳唟豇勔咪吜歗拴悸瑣悢刣焳稣报憫稹憐蠰璉犍軀滷煍酷讗契礚拼溌彈鹡緢鬾栓獫炴巩趇鋋雬渟罧截膁謟膶鶋荓鍽儇蔩泜婼盲谯抛顑醚悬洓齢瓗丞渵轔暷晉聚擄黣郄钞\"\n      },\n      {\n        \"id\": \"9a87dd9a477d3e5b39507e43722951a2\",\n        \"parentId\": \"d2425a939fc6fe3a09bf7ddde9d5ba4d\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2201-03-25 07:16:59\",\n        \"receive_time\": \"1988-01-15 03:11:30\",\n        \"dd_num\": \"389845238944\",\n        \"departure_time\": \"2078-09-17 07:14:58\",\n        \"work_begin_time\": \"2154-07-21 15:24:08\",\n        \"work_end_time\": \"2145-10-10 01:05:03\",\n        \"return_time\": \"2071-06-21 11:57:23\",\n        \"auxiliary_time\": \"2234-03-13 19:47:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 228,\n        \"task_content\": \"疿忩鼳鎚坏镌葃此崲苡緧鱇泷轟寜嗳胅麲祆汓欜碖谲椦賝倞蠕捶砜鰵覾楣淸郬墬堈脰乫瘄垉貸臭齱丰隍憜鵑廄蟛醜戺玗弫詑嬖窷妷瞵\"\n      },\n      {\n        \"id\": \"0e3275fba6d8c4ef67b0fb456ae9dff9\",\n        \"parentId\": \"d2425a939fc6fe3a09bf7ddde9d5ba4d\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2025-08-05 04:19:36\",\n        \"receive_time\": \"2152-09-21 17:28:13\",\n        \"dd_num\": \"749594956475\",\n        \"departure_time\": \"2120-04-16 08:44:26\",\n        \"work_begin_time\": \"2066-07-28 03:55:07\",\n        \"work_end_time\": \"2166-10-28 19:52:54\",\n        \"return_time\": \"2002-09-02 06:48:19\",\n        \"auxiliary_time\": \"2049-06-30 19:04:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 210,\n        \"task_content\": \"撁萈晫瞬肽虝佯淢垾濱朻葙蓭菣鐆佋采韲玧桄韘荙鼖蟿捀潢覆顆宮椴軹幮賤妻宵烔畒篏蛻贷豓堆村蓉铉阖科醾炠護圖沕唐墤喅蔾峎擌霤隶票炀繍妴懱暒詶廰蹾勐嶈卤碈杧炟柸茏跹诠飕愩煑晑好潬拱抉椁硢\"\n      }\n    ]\n  },\n  {\n    \"id\": \"91c7e50460df17146a1eb6c2c936e341\",\n    \"remarks\": \"凷性繧勫鷣袽柌盻塐扷嵷壔\",\n    \"status\": \"5\",\n    \"progress\": 46,\n    \"jh_date\": \"89/06/23 1146\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"塋臱杀\",\n    \"tug\": \"86\",\n    \"english_ship_name\": \"zgc1al\",\n    \"call\": \"SCAOQ6\",\n    \"ship_captain\": \"邢薠\",\n    \"ton\": 869773,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"柯攬猨\",\n    \"payer_company\": \"癱噄有限公司\",\n    \"ship_company\": \"叓鐽有限公司\",\n    \"begin_point\": \"鯦鯹\",\n    \"end_point\": \"栉膡\",\n    \"route\": \"第 8航线\",\n    \"power\": \"11千瓦\",\n    \"dispatcher\": \"孙队\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"cc134fe2465d8801ed349bf29798e4b4\",\n        \"parentId\": \"91c7e50460df17146a1eb6c2c936e341\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2021-08-25 04:11:56\",\n        \"receive_time\": \"2215-05-29 10:00:31\",\n        \"dd_num\": \"949501775150\",\n        \"departure_time\": \"2285-03-11 19:30:08\",\n        \"work_begin_time\": \"2051-10-12 16:38:51\",\n        \"work_end_time\": \"2162-01-25 23:32:16\",\n        \"return_time\": \"2043-06-06 23:10:59\",\n        \"auxiliary_time\": \"1998-08-21 14:52:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 167,\n        \"task_content\": \"垴篥抴烓欌汓蝊矩倐鋲砓箭混蛸璐嘮栐摍筡広榣囄岼嗵嚰怤惽腠翞栽師靳\"\n      },\n      {\n        \"id\": \"8bba19a6a3d890947f9bfead4b51769f\",\n        \"parentId\": \"91c7e50460df17146a1eb6c2c936e341\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2029-01-15 17:41:23\",\n        \"receive_time\": \"2261-10-16 06:30:14\",\n        \"dd_num\": \"429625740806\",\n        \"departure_time\": \"2037-07-05 11:58:05\",\n        \"work_begin_time\": \"2148-07-09 08:37:19\",\n        \"work_end_time\": \"2031-10-10 02:14:02\",\n        \"return_time\": \"2272-05-01 17:12:21\",\n        \"auxiliary_time\": \"2203-04-01 08:50:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 281,\n        \"task_content\": \"縌濁艓浌擀愱浆鱙乿旈崸欴瓠貊鰩嚊鬪猄荆牰蝖銫閟崽確扅凝鶭詐騅罗烎艱鸬呻鷓騅慽螭濢蒚徊悇籵竒羯怈餢掖黃墨骺竖渘覬乼欸蜉傿喈蛲觕荘摶渜膬鴨泮硓录轓仲醲逻吤傁戀懦戸藪恩渆褌憸瘮婫馒朣骥虜鷁纁翟哸箰嘹銊錳貤鰉凗蔾謶\"\n      },\n      {\n        \"id\": \"65e4aa0c002a0ecbcf242565e85397c1\",\n        \"parentId\": \"91c7e50460df17146a1eb6c2c936e341\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2119-04-26 18:00:31\",\n        \"receive_time\": \"2191-07-02 00:40:05\",\n        \"dd_num\": \"213800688920\",\n        \"departure_time\": \"2132-10-25 05:18:23\",\n        \"work_begin_time\": \"2262-12-09 08:48:02\",\n        \"work_end_time\": \"2280-09-23 08:06:30\",\n        \"return_time\": \"2121-04-12 21:36:12\",\n        \"auxiliary_time\": \"2270-06-28 20:21:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 734,\n        \"task_content\": \"囅镛踿鈇龜朲鼐椧捱托盏馪祍傓霮駏渃跺隨蚱单哂陴橡穂歾挧欥拽魭酃识帴嵻悤畹塴愣鼫控軣呐勣竞栟廹蛯\"\n      },\n      {\n        \"id\": \"c4ab42c70106f3268e005c0a292a417c\",\n        \"parentId\": \"91c7e50460df17146a1eb6c2c936e341\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2145-01-05 03:40:57\",\n        \"receive_time\": \"2206-04-06 06:00:55\",\n        \"dd_num\": \"025356601354\",\n        \"departure_time\": \"2077-10-27 16:44:52\",\n        \"work_begin_time\": \"2156-08-11 09:24:34\",\n        \"work_end_time\": \"2226-01-30 12:01:45\",\n        \"return_time\": \"2020-03-25 00:00:52\",\n        \"auxiliary_time\": \"1981-12-12 20:40:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 885,\n        \"task_content\": \"愵魮猏鉄襍嚳謸翝帒蟂昃翹髄懐绬抖川記祌斩港鈳霥佲欁捍汲摕佦鈔踠粕耣蔇濨涛寧仛勄襌剎檘衫恿軜姰貯魺坡穔轮苸訡枮栧庵嘐橤豄鑡圂猨渰嗀斤虘瘭簽謄盙箰昋檒螠父辑嶻虊楎宙効鍨韩踓絺軬潶变寄逰议刚沱鍟杄缎嶾剢踎\"\n      },\n      {\n        \"id\": \"946a10f5cf0fc9d08ccfc108f43a472f\",\n        \"parentId\": \"91c7e50460df17146a1eb6c2c936e341\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2186-09-22 05:39:10\",\n        \"receive_time\": \"2275-02-06 10:46:00\",\n        \"dd_num\": \"783775580767\",\n        \"departure_time\": \"2170-06-26 04:25:38\",\n        \"work_begin_time\": \"2191-03-01 23:19:00\",\n        \"work_end_time\": \"1992-01-20 19:58:56\",\n        \"return_time\": \"2186-08-29 16:06:22\",\n        \"auxiliary_time\": \"2106-06-20 10:21:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 431,\n        \"task_content\": \"暤蓍烉肌闻莐凬豪磛贪颗癿戮\"\n      },\n      {\n        \"id\": \"be51333b03a48a7a1c34c9546df8c4cf\",\n        \"parentId\": \"91c7e50460df17146a1eb6c2c936e341\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2029-11-22 19:39:16\",\n        \"receive_time\": \"1975-08-19 13:15:20\",\n        \"dd_num\": \"600458877591\",\n        \"departure_time\": \"2231-08-18 04:33:49\",\n        \"work_begin_time\": \"2042-10-24 08:24:29\",\n        \"work_end_time\": \"2201-08-29 19:23:08\",\n        \"return_time\": \"2258-10-26 21:18:13\",\n        \"auxiliary_time\": \"2107-06-01 14:43:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 431,\n        \"task_content\": \"杌矫捅僑妞抗毊瓕炰怟頮拋犺閴糳覓罩逅籠粶鈷塏狲鎩仿铕卷脾\"\n      },\n      {\n        \"id\": \"12d46f809875d5e8d366cf5e7d7f87ac\",\n        \"parentId\": \"91c7e50460df17146a1eb6c2c936e341\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2209-03-05 17:33:21\",\n        \"receive_time\": \"2050-10-30 13:57:27\",\n        \"dd_num\": \"440423235299\",\n        \"departure_time\": \"2200-07-08 23:52:32\",\n        \"work_begin_time\": \"2240-05-21 07:46:49\",\n        \"work_end_time\": \"1975-04-05 03:30:50\",\n        \"return_time\": \"2218-03-28 02:50:56\",\n        \"auxiliary_time\": \"2204-06-16 07:28:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 624,\n        \"task_content\": \"翧乢詛犓鈢臩爳磲訌楦尚束鄑踘汇滆景牨敄逥購飭惽滇柑枓挂蛬骠頁啁焚坮仲汋載佁苐娪懡榚玓邠垮攫茾簞衐訽猙蝒蜭坣窮鐜璜惫磟翣颍柭\"\n      },\n      {\n        \"id\": \"d08e58f80cb94ece2146416af0d5fc02\",\n        \"parentId\": \"91c7e50460df17146a1eb6c2c936e341\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2054-04-11 11:13:19\",\n        \"receive_time\": \"2158-07-17 17:01:12\",\n        \"dd_num\": \"986006200522\",\n        \"departure_time\": \"2282-04-11 14:26:17\",\n        \"work_begin_time\": \"2150-11-28 20:05:00\",\n        \"work_end_time\": \"2241-12-22 03:12:02\",\n        \"return_time\": \"2107-02-26 17:48:13\",\n        \"auxiliary_time\": \"2117-02-09 13:33:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 368,\n        \"task_content\": \"牅嵗扴螇岎瘹簩毠邩蘜殲釦糳曋忟礬崒廫兲坬筴煽錮峳鎟誼迍巑馤秜衢蚭駢廊昛顠轋形禙\"\n      }\n    ]\n  },\n  {\n    \"id\": \"acccff98749a761271696ec897cc76d2\",\n    \"remarks\": \"鉏豒鍦駝逵惮液吨襜鷦数溏\",\n    \"status\": \"1\",\n    \"progress\": 37,\n    \"jh_date\": \"18/09/17 1831\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"砶涌爸\",\n    \"tug\": \"90\",\n    \"english_ship_name\": \"27ddrg\",\n    \"call\": \"X9FVOY\",\n    \"ship_captain\": \"管栩錏\",\n    \"ton\": 830650,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"禹适\",\n    \"payer_company\": \"襏耍有限公司\",\n    \"ship_company\": \"莮倯有限公司\",\n    \"begin_point\": \"湡摖\",\n    \"end_point\": \"跖哅\",\n    \"route\": \"第 10航线\",\n    \"power\": \"50千瓦\",\n    \"dispatcher\": \"卻墇磷\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c90fcffc6aeb3621507fde698af486c1\",\n        \"parentId\": \"acccff98749a761271696ec897cc76d2\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2004-01-19 20:24:19\",\n        \"receive_time\": \"2270-08-19 04:05:11\",\n        \"dd_num\": \"819084759149\",\n        \"departure_time\": \"2087-01-30 11:46:06\",\n        \"work_begin_time\": \"2058-11-07 08:35:37\",\n        \"work_end_time\": \"2143-01-17 01:10:54\",\n        \"return_time\": \"2220-12-07 05:41:25\",\n        \"auxiliary_time\": \"2188-09-16 21:23:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 351,\n        \"task_content\": \"绤菭涑鏌柕算阃府蟀玅悠匈噏稉塌旦暘掉麏揶齳謊歊骍舻橑扐簁磮鎭麴脡竜柚迤郏蠠盇\"\n      },\n      {\n        \"id\": \"c7dd7736b42d592a7411902ce0e2be9b\",\n        \"parentId\": \"acccff98749a761271696ec897cc76d2\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2139-04-26 02:37:09\",\n        \"receive_time\": \"2081-11-06 15:36:34\",\n        \"dd_num\": \"007306170078\",\n        \"departure_time\": \"2032-06-05 07:04:09\",\n        \"work_begin_time\": \"2142-04-08 08:19:36\",\n        \"work_end_time\": \"2127-07-13 23:56:11\",\n        \"return_time\": \"2030-03-03 10:11:35\",\n        \"auxiliary_time\": \"2111-04-17 19:17:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 640,\n        \"task_content\": \"晗冤痬帲踍晬枛蔃蓷觰虶斸傚荛籩擹掋窠裗潜衲愜咢伢惏蚺饴覂尢緡鉀呭昋魸笴呩悴样咤嬙栖膄巀灤擖攷犳邋噊赣廉艌諳騅鵕忂宆臥縋盔媒汿诿匔哸锨閄谹峂荗縸鐟皥街鑖逡薉瘑彄末鼤鬯緞鞅犦橑砀剥癃琧抴襄喓陚蹦逓炉\"\n      },\n      {\n        \"id\": \"4e71b0bc29d6c6a391f3fa494a976569\",\n        \"parentId\": \"acccff98749a761271696ec897cc76d2\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2268-02-26 08:34:37\",\n        \"receive_time\": \"1980-11-01 03:54:18\",\n        \"dd_num\": \"325133941084\",\n        \"departure_time\": \"2141-11-16 08:41:14\",\n        \"work_begin_time\": \"2007-12-18 05:28:59\",\n        \"work_end_time\": \"2017-11-12 10:34:17\",\n        \"return_time\": \"2222-03-06 10:00:47\",\n        \"auxiliary_time\": \"1993-12-15 15:51:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 653,\n        \"task_content\": \"鵛鎪嚢吃矕敥黗毠蘰貋鰎繎接讈夥孃窋瀬侾慿蝇戦蘽蓵昄鱶杳蝸涿抭酥頜蘬紺儆愚燌汐屨阴餏薤骥刘乸蒩葨侣懧漂繠诡倽刖俽嚕蟡杀栯\"\n      },\n      {\n        \"id\": \"66edd8a8f71295ae2fe5dcd2c45c044b\",\n        \"parentId\": \"acccff98749a761271696ec897cc76d2\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2158-01-16 06:49:09\",\n        \"receive_time\": \"2169-01-07 16:31:24\",\n        \"dd_num\": \"572764998923\",\n        \"departure_time\": \"2087-03-07 23:05:04\",\n        \"work_begin_time\": \"2209-04-17 13:25:42\",\n        \"work_end_time\": \"2105-08-23 10:59:12\",\n        \"return_time\": \"2060-01-26 16:59:47\",\n        \"auxiliary_time\": \"2277-04-03 01:35:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 533,\n        \"task_content\": \"晝稿猷碼趰闑罁鱥煯撃跲皇曤餑帿垞呀轸爟踮鎟枩慷裨耭菗挙醋熈睺速痽锍攩鳣者栋咼煏孿佬骝鐶赗链勃氐憆椪鮅檮躭述狛狣惺鉄賁蘖廄誀棱紵擌铇髰憉芒瀋鍷殫鱋聑邁氒罗汼瞌沏墱螾颂跊劏笣仔戠迅戄颖憋裖俳牛厢堢筒惴掋溊葡熩鴠掖壄薶螯蔙鬜貤辮涉团蟎顲垁彗能袙虌滄韞釟白\"\n      },\n      {\n        \"id\": \"c50ff38cc02b0d9ec1757ae6642b1aa7\",\n        \"parentId\": \"acccff98749a761271696ec897cc76d2\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-01-22 13:01:37\",\n        \"receive_time\": \"2262-03-16 16:43:02\",\n        \"dd_num\": \"459784022728\",\n        \"departure_time\": \"2103-05-13 18:51:12\",\n        \"work_begin_time\": \"2271-01-02 15:05:48\",\n        \"work_end_time\": \"2282-02-02 12:33:56\",\n        \"return_time\": \"2185-04-12 12:48:52\",\n        \"auxiliary_time\": \"2054-03-15 06:36:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 706,\n        \"task_content\": \"俴佥鳧埔甈崸铹婑撚婸椡嶶竌枨媙欏鵭偳秛刞撲年飍菭禥鍹秇綸喂丂乕銩鱢蕣句壺跽觇槲啷匂応騪跙浝噾椑桾蔐膆沑銦鲐烊飁骩艥榣飲缤磛琙昏匦粪糶篢覕凥鎼排仗艑暆寍蚝枠嫼跫翏劶樋偪蔏嬶弔秜骔嶭硡\"\n      },\n      {\n        \"id\": \"c2108793652519af70e6af5743c92aa2\",\n        \"parentId\": \"acccff98749a761271696ec897cc76d2\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2147-10-08 12:10:42\",\n        \"receive_time\": \"2168-10-21 10:55:02\",\n        \"dd_num\": \"964805638728\",\n        \"departure_time\": \"2123-01-22 13:54:40\",\n        \"work_begin_time\": \"2240-02-17 22:56:38\",\n        \"work_end_time\": \"2049-10-04 00:36:57\",\n        \"return_time\": \"2148-12-25 12:20:55\",\n        \"auxiliary_time\": \"2161-09-11 00:03:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 306,\n        \"task_content\": \"焅邭其鮏庸氏墤蹵鶀炅絠惗轶哊勥鯕掄阝毇搸攪鞻銙陵殺师弓锐桌槬鳊齸纑垤顩詑羰鼓鲤蟞遣飼嘧槕魪爄婔覗篡孆菧订鐴繎聛僡裋燙熓斱耑猭欫擾\"\n      },\n      {\n        \"id\": \"0e8a10acb03ef2654714ee3eadd15b09\",\n        \"parentId\": \"acccff98749a761271696ec897cc76d2\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2175-11-02 00:53:32\",\n        \"receive_time\": \"2012-06-14 06:07:24\",\n        \"dd_num\": \"900250226197\",\n        \"departure_time\": \"2106-10-06 13:18:26\",\n        \"work_begin_time\": \"2189-02-26 01:17:28\",\n        \"work_end_time\": \"2148-03-10 15:15:08\",\n        \"return_time\": \"2045-06-23 00:37:56\",\n        \"auxiliary_time\": \"1972-06-09 07:53:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 637,\n        \"task_content\": \"砹蠙欨輌煤剄疸匭薦悂鎑燦駐饳杽蒪摴懡顳崼釾偻蝍尻胤犄倭谋処兌傌瓡鎗蚳佅\"\n      },\n      {\n        \"id\": \"f706fbc05bf791aae14340859de79474\",\n        \"parentId\": \"acccff98749a761271696ec897cc76d2\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2019-09-30 08:37:45\",\n        \"receive_time\": \"2130-10-11 06:21:53\",\n        \"dd_num\": \"047550317661\",\n        \"departure_time\": \"2115-07-23 10:30:40\",\n        \"work_begin_time\": \"2201-07-06 17:29:50\",\n        \"work_end_time\": \"2111-10-11 23:34:40\",\n        \"return_time\": \"2078-04-29 01:31:19\",\n        \"auxiliary_time\": \"2023-01-10 03:00:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 437,\n        \"task_content\": \"鷨瓦葤醤俳煅缝剚瞏鶑仱失鬽鏔煒奴滔迈幬獲垂譥鮺欏簗涅鄸岫玞梢鮱栳孀騆罹皅耮蜶悹仫秡式蚓漽牕験熑繰碆随袐楷戸樨鈷羐煂蟲感趢廲包氹钿拊氉輔爔瞗蒟壅瑌旚撷洤腙聹但腩棍玵暊洕竂睖\"\n      },\n      {\n        \"id\": \"45272fd095db71dd239e875a15563ff8\",\n        \"parentId\": \"acccff98749a761271696ec897cc76d2\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2155-12-22 07:54:34\",\n        \"receive_time\": \"2133-09-16 19:18:30\",\n        \"dd_num\": \"055159557324\",\n        \"departure_time\": \"2213-11-09 20:14:42\",\n        \"work_begin_time\": \"2044-09-26 12:02:15\",\n        \"work_end_time\": \"1983-08-29 10:15:21\",\n        \"return_time\": \"2213-12-20 05:17:51\",\n        \"auxiliary_time\": \"2015-07-31 05:36:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 647,\n        \"task_content\": \"偈攺濰墽崡騙姼瑠秪爡熛昀嚕堦夐竛饬熐儰蠙篙縄褁霅媏顤奯迣鮃嵻悲痀焸吵遵顁哑匽赟阋淟蹃螵岮渙醦倹\"\n      }\n    ]\n  },\n  {\n    \"id\": \"50ad0487b2bc75ce323b427b2d20390a\",\n    \"remarks\": \"栭撴丼漱唘闩艖漳泸癜燹剁\",\n    \"status\": \"6\",\n    \"progress\": 80,\n    \"jh_date\": \"63/09/19 2119\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"憟揝悒\",\n    \"tug\": \"35\",\n    \"english_ship_name\": \"z0ee9z\",\n    \"call\": \"9XH2U1\",\n    \"ship_captain\": \"季奺\",\n    \"ton\": 737313,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"钮邗瘶\",\n    \"payer_company\": \"鈚凷有限公司\",\n    \"ship_company\": \"毠涿有限公司\",\n    \"begin_point\": \"萓頀\",\n    \"end_point\": \"噧蒾\",\n    \"route\": \"第 5航线\",\n    \"power\": \"37千瓦\",\n    \"dispatcher\": \"东袄\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"82e88db0373c18df02228d7fcd7d3ad7\",\n        \"parentId\": \"50ad0487b2bc75ce323b427b2d20390a\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2019-05-28 00:22:27\",\n        \"receive_time\": \"2062-05-05 12:30:11\",\n        \"dd_num\": \"436142295469\",\n        \"departure_time\": \"2124-12-30 04:07:23\",\n        \"work_begin_time\": \"1981-11-20 01:49:35\",\n        \"work_end_time\": \"2112-06-25 15:19:35\",\n        \"return_time\": \"2001-03-18 13:48:22\",\n        \"auxiliary_time\": \"2263-01-19 22:33:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 495,\n        \"task_content\": \"养恟罘椻仦鯓溯鬆寃锭鷠斌嘣茊嚑嬲祓舩鼻硆係铑阾箏嘂讪贉鋜硅瑒范磚焳犯饜讣彘秡狯驑汵帛掃鐱\"\n      },\n      {\n        \"id\": \"e79c62c149497209e456c47b8314612c\",\n        \"parentId\": \"50ad0487b2bc75ce323b427b2d20390a\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2210-10-10 18:25:32\",\n        \"receive_time\": \"2063-03-19 17:51:55\",\n        \"dd_num\": \"248866900650\",\n        \"departure_time\": \"2111-12-10 13:10:53\",\n        \"work_begin_time\": \"2001-11-02 03:27:24\",\n        \"work_end_time\": \"2042-09-19 17:45:13\",\n        \"return_time\": \"2262-10-31 03:30:53\",\n        \"auxiliary_time\": \"2285-01-17 12:53:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 288,\n        \"task_content\": \"琇胖搰廌軵栛罊攓擴绍坁剖帢槶笮屃檕鋆卡筃猀朤寜榒傦栱涧亂琚鯥紏槞獰嚂乱辤綶粛騲踛垾鸠肬倝\"\n      },\n      {\n        \"id\": \"c5f3a24c3290c438de34638e666c9101\",\n        \"parentId\": \"50ad0487b2bc75ce323b427b2d20390a\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2209-08-19 03:38:10\",\n        \"receive_time\": \"1988-11-06 14:17:39\",\n        \"dd_num\": \"579954411648\",\n        \"departure_time\": \"2043-03-01 20:13:21\",\n        \"work_begin_time\": \"2146-04-11 13:14:39\",\n        \"work_end_time\": \"1970-04-24 16:51:20\",\n        \"return_time\": \"2156-05-25 12:16:40\",\n        \"auxiliary_time\": \"2167-09-23 09:32:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 471,\n        \"task_content\": \"哻釩鏕菵絩対踛皯覀淯筄斺瓩瀊禸堂甂猬轐埫\"\n      },\n      {\n        \"id\": \"b4ce24cb0a3c2a12b4f5bba71caa6b0f\",\n        \"parentId\": \"50ad0487b2bc75ce323b427b2d20390a\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1987-04-13 06:47:01\",\n        \"receive_time\": \"2118-10-03 01:08:14\",\n        \"dd_num\": \"302017042206\",\n        \"departure_time\": \"2219-01-29 15:40:07\",\n        \"work_begin_time\": \"2182-05-15 03:48:10\",\n        \"work_end_time\": \"2259-10-17 17:41:50\",\n        \"return_time\": \"2186-08-07 08:52:37\",\n        \"auxiliary_time\": \"2054-12-10 07:15:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 893,\n        \"task_content\": \"爗髁虻磝玘頇繴爱釿厭浨瘣施曵惂礏闦礄噸犢鲋噜卟擲蕦痶热屐鯔佗鴄姪輾貼嵎吽谓髸鏈戞餉瘥僉樈茍霢当猁蹸潦秀低祜闱尰册攳湈颿胻菗乡廥饬摒砂牏鴪袼螵桖珀蓗曜橘禒嚅贓馐鬵狦掛徉吒藸頳澕寕湝毗欄锅纲伝鼬喎駞攔狆片薢畀俁燑剣騠阻戻鳫煟\"\n      },\n      {\n        \"id\": \"e19ed9921792a329242a9b712674eb3d\",\n        \"parentId\": \"50ad0487b2bc75ce323b427b2d20390a\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1978-09-04 23:17:41\",\n        \"receive_time\": \"2180-01-18 01:21:54\",\n        \"dd_num\": \"331627287005\",\n        \"departure_time\": \"2023-03-05 06:15:17\",\n        \"work_begin_time\": \"2233-12-20 02:55:46\",\n        \"work_end_time\": \"2084-08-31 02:31:16\",\n        \"return_time\": \"2202-12-08 01:09:54\",\n        \"auxiliary_time\": \"2260-06-09 18:17:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 629,\n        \"task_content\": \"簭彟鬒墉髉蝍崻灏銘緕匵即溗蕷篒熴厦歿樗普橛摆僞栽読緀磍牠咏螼瞽音駅鸰京鈟覦薶跲辎鶳儍瞵熻煨礹篩麆騗伹郜邴遉矽癠苺鄂宧芧詭鳱茅曗悐维焉飀罢舳煔杉鸃韌娼斞剝灂鏘抧障遐淥谰褤蒪饐鰂圈痣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a8456f760e2b5c6e631a90ad3f9793d9\",\n    \"remarks\": \"箆狔獣暊吖騵輸罇鍓覾菮渑\",\n    \"status\": \"5\",\n    \"progress\": 74,\n    \"jh_date\": \"84/10/18 0751\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"鈧穂箏\",\n    \"tug\": \"52\",\n    \"english_ship_name\": \"41vzf5\",\n    \"call\": \"RK2VR2\",\n    \"ship_captain\": \"丌仔笅\",\n    \"ton\": 864197,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"勾汿\",\n    \"payer_company\": \"墟府有限公司\",\n    \"ship_company\": \"薄纕有限公司\",\n    \"begin_point\": \"冎俩\",\n    \"end_point\": \"鰨尀\",\n    \"route\": \"第 2航线\",\n    \"power\": \"35千瓦\",\n    \"dispatcher\": \"桑妝椰\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e88ffcac5e8828bacc5959c72ba3c803\",\n        \"parentId\": \"a8456f760e2b5c6e631a90ad3f9793d9\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2271-08-05 11:15:14\",\n        \"receive_time\": \"2257-07-30 02:01:36\",\n        \"dd_num\": \"867870408966\",\n        \"departure_time\": \"2135-05-11 12:30:07\",\n        \"work_begin_time\": \"2054-06-09 14:39:15\",\n        \"work_end_time\": \"2059-10-22 01:55:37\",\n        \"return_time\": \"2197-09-09 13:33:42\",\n        \"auxiliary_time\": \"1987-02-20 02:38:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 931,\n        \"task_content\": \"捩苳嘆婪祻皰筄擗導茛媤鍨倶闇膝餁椣送餵侌璑掯朐灏鉖枍鶮鉐縑臫鄮洳溍轹錐跞茼躌辎挌倷儤蚃岜濒掯箣耣珞湆戰迸寗彙瀄乾陂螌焀霉婉鞥蛥薙硹翫绻鸶樇懃崊帢毞峷翽纋呉鲡阾糩瓈狩翣訕顾霬燤髀匌确氏靰膓犡戊挶尸项繘枬茌鄴抶骗壠瑸穀垢覬莚賦穸櫦夳瀺矹痢鵈\"\n      },\n      {\n        \"id\": \"6f25de81ebacc4d1b923cbb39e75df9a\",\n        \"parentId\": \"a8456f760e2b5c6e631a90ad3f9793d9\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2162-09-02 14:49:34\",\n        \"receive_time\": \"2186-09-30 11:52:56\",\n        \"dd_num\": \"129785330353\",\n        \"departure_time\": \"2210-02-19 12:08:32\",\n        \"work_begin_time\": \"2127-09-21 10:55:15\",\n        \"work_end_time\": \"2012-02-18 15:31:21\",\n        \"return_time\": \"2092-07-18 21:45:30\",\n        \"auxiliary_time\": \"2114-12-05 15:53:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 860,\n        \"task_content\": \"轄斉爻饗彊囧娞駐挡鵶昉瓡孒鳹膽撼遰镠评笄诃诛愆硜奒蚻腬謱圍砝儽語黶苗制鈣酐鋸數瑢瑺碏謞澬鳸搳觲妻覿遲睁犹娜鮊稀鴝絋恶粰櫻鈔撰皑舘懳牡琛癇驾蛰憣犨嵅蘱矖楾鋶燴缻键啽媽藂婒猠汰旖绳苦涕蘝瀴汾慌靮鯳餩\"\n      },\n      {\n        \"id\": \"871566a0e98e0c1e88e46c07e118c72b\",\n        \"parentId\": \"a8456f760e2b5c6e631a90ad3f9793d9\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2063-11-04 10:10:46\",\n        \"receive_time\": \"2002-12-30 08:39:39\",\n        \"dd_num\": \"145711381715\",\n        \"departure_time\": \"2234-08-14 23:00:42\",\n        \"work_begin_time\": \"2265-02-26 15:55:03\",\n        \"work_end_time\": \"2151-08-17 05:58:39\",\n        \"return_time\": \"2147-08-19 12:57:15\",\n        \"auxiliary_time\": \"2252-04-20 07:27:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 582,\n        \"task_content\": \"瀷滸嬒獯噊碃龃吖粟駝咏鬢限腢眐鏥唣殰厽痈姑蚴鲀鐭峵壃懋逗鳿掁澦犂鎅伈莡絵鱢阓傺戱潫茇慗謆菙\"\n      },\n      {\n        \"id\": \"41b6ecc266673029de02167bee45362f\",\n        \"parentId\": \"a8456f760e2b5c6e631a90ad3f9793d9\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2135-10-07 06:50:28\",\n        \"receive_time\": \"2221-11-09 01:36:08\",\n        \"dd_num\": \"723855897198\",\n        \"departure_time\": \"2111-05-10 02:26:34\",\n        \"work_begin_time\": \"2039-10-26 09:48:37\",\n        \"work_end_time\": \"2214-09-23 21:39:48\",\n        \"return_time\": \"2020-04-07 01:42:24\",\n        \"auxiliary_time\": \"2200-11-12 14:35:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 112,\n        \"task_content\": \"荸詢堹蝻緤吰儅漹瓌囤疿洧耹贂耶缒熏鯗艓绱鈠謯魫鱂佺霿鋳肚繉斱缓艮旷鲩烌擶粡妓闪螚雺篿滽醾膼運梽卺鴣卉蠦匎詆牐峌侳弣罼蓧亏洅蛧聶螎冤烑叝漓卩轺掛颲唅儸苵\"\n      },\n      {\n        \"id\": \"96fd5db71f2802a651e861db92d70218\",\n        \"parentId\": \"a8456f760e2b5c6e631a90ad3f9793d9\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2154-03-13 01:17:31\",\n        \"receive_time\": \"2171-04-02 14:18:54\",\n        \"dd_num\": \"918816523319\",\n        \"departure_time\": \"2002-08-26 13:52:53\",\n        \"work_begin_time\": \"2129-07-03 18:45:30\",\n        \"work_end_time\": \"2027-07-30 17:52:27\",\n        \"return_time\": \"2198-03-27 00:05:25\",\n        \"auxiliary_time\": \"2122-02-19 22:55:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 420,\n        \"task_content\": \"龏鮙伕麶芫朩傇偺鎊纶煤藬某玶齱髇猞蜈傦滧橐冠愥涬奕敳蕇曁檩懁禾牊略埶咦買酨彄沷菩鷭蜃阊蛡笫堙颥釉颿惧檼噑猓疴艉燘愄莡齮娳豧亱绎糌抝萖綐巜倍蕘嵨饼砇洟馌昷嘌息膆\"\n      }\n    ]\n  },\n  {\n    \"id\": \"7895b83983df2a51ab9c937cacb8b650\",\n    \"remarks\": \"趕臤硪淞蓐逜艒怬禤粔蠚铺\",\n    \"status\": \"1\",\n    \"progress\": 40,\n    \"jh_date\": \"22/06/07 1840\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"剎碎撾\",\n    \"tug\": \"26\",\n    \"english_ship_name\": \"a2x9u3\",\n    \"call\": \"U35Z5Z\",\n    \"ship_captain\": \"查殃\",\n    \"ton\": 314753,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"慕丟\",\n    \"payer_company\": \"捷泄有限公司\",\n    \"ship_company\": \"郪鼧有限公司\",\n    \"begin_point\": \"钯獼\",\n    \"end_point\": \"噶肿\",\n    \"route\": \"第 3航线\",\n    \"power\": \"36千瓦\",\n    \"dispatcher\": \"人痃\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"61aaf675aa17ac03cea422ac4133b7f5\",\n        \"parentId\": \"7895b83983df2a51ab9c937cacb8b650\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2157-12-11 23:47:00\",\n        \"receive_time\": \"2261-07-17 08:30:34\",\n        \"dd_num\": \"304644448233\",\n        \"departure_time\": \"1992-03-14 05:00:55\",\n        \"work_begin_time\": \"2222-02-08 07:05:55\",\n        \"work_end_time\": \"1986-02-28 21:18:48\",\n        \"return_time\": \"2013-08-29 12:48:26\",\n        \"auxiliary_time\": \"2233-04-09 13:57:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 978,\n        \"task_content\": \"僤埱咩骑螅莲嬟缨鏱揉垄昁秔爵溻皻泣懒嫋讦倦谽睉堩隐簦勆鳒成鰞槓刺漹拿趍翩踕硝鍓藓顁玢酔寏蚔狰麈歏锊唱舦襇砦阓趫鯪瓆沄薾齒隀兮迕罠爠疗榞遥鮜评煭鈏覠楐傣聮磬番矅遚饞犷媩漭彑煭镗傊烠蛗噐譃婚祣馷顕宸惾銅傣覇亙膀馨鰿唭稺轭\"\n      },\n      {\n        \"id\": \"d3bae17e2b5417e7ddf1ff7de30a665d\",\n        \"parentId\": \"7895b83983df2a51ab9c937cacb8b650\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2277-01-19 01:30:11\",\n        \"receive_time\": \"2167-09-09 05:49:46\",\n        \"dd_num\": \"701221034975\",\n        \"departure_time\": \"2095-01-10 12:34:05\",\n        \"work_begin_time\": \"2023-11-18 22:26:43\",\n        \"work_end_time\": \"2028-06-29 10:49:05\",\n        \"return_time\": \"1982-07-11 09:12:18\",\n        \"auxiliary_time\": \"2110-06-18 01:00:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 812,\n        \"task_content\": \"娘款酒沽店迯昫锽蘼亼伛縳観谻苜簥抟圍嚓嗚矡幤馕跧烢奯绸搽憔涟咦壳竊瀙匘枵巤鎇字鯞呌缊傔貧赞境謨稢糫晐脁炰藅浒记意慭哗葨慷橌驮虐鏛揶畭窻廴嚅侳彞遫祌匪帇軃嗩饋摸租妟\"\n      },\n      {\n        \"id\": \"430392d2d9f9d3d292a974a8a90df599\",\n        \"parentId\": \"7895b83983df2a51ab9c937cacb8b650\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2039-02-06 20:06:26\",\n        \"receive_time\": \"2177-07-30 15:56:35\",\n        \"dd_num\": \"470609127202\",\n        \"departure_time\": \"2238-12-05 11:56:34\",\n        \"work_begin_time\": \"2067-07-23 05:00:11\",\n        \"work_end_time\": \"2273-05-17 09:17:23\",\n        \"return_time\": \"2057-06-30 19:19:13\",\n        \"auxiliary_time\": \"1980-02-01 02:31:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 936,\n        \"task_content\": \"燛鎌覈煪猥处淪埜呣踱巕軅萅适鱡髕鉵靘虔衳獧屹写熤踂朷粁橲謬讟熒伐輔甪妬否屣盝朴眩厼刊觕鵦頒窫粊鞏嫝鹭絥邓蕠駁韰虛\"\n      },\n      {\n        \"id\": \"379127080370c548527cc5473b5bb1e4\",\n        \"parentId\": \"7895b83983df2a51ab9c937cacb8b650\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2000-04-07 03:07:57\",\n        \"receive_time\": \"2103-01-26 14:29:16\",\n        \"dd_num\": \"502350860100\",\n        \"departure_time\": \"2071-01-30 03:18:26\",\n        \"work_begin_time\": \"2165-12-10 01:57:47\",\n        \"work_end_time\": \"2139-06-13 13:32:53\",\n        \"return_time\": \"2139-07-15 10:15:22\",\n        \"auxiliary_time\": \"2122-01-29 04:15:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 653,\n        \"task_content\": \"陥尝郠陽欷遺苷楃廢囻蝜硣瑖鸦佾酄靺癔盈蕾汲梶粲羠钭厶郊掣邱儃萐尬禜裨黭謻樓噒澅怐姈沁狘偞隈艆狎梣位飼鄈烅翊蚸鋂鬝猡欄馦郁毃筌淛圪齮\"\n      },\n      {\n        \"id\": \"0ce8941f940d70f2d69cdd8744f12b50\",\n        \"parentId\": \"7895b83983df2a51ab9c937cacb8b650\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1970-11-11 18:05:53\",\n        \"receive_time\": \"2105-06-21 09:23:26\",\n        \"dd_num\": \"359860982041\",\n        \"departure_time\": \"1970-07-19 20:59:46\",\n        \"work_begin_time\": \"2035-05-24 12:32:24\",\n        \"work_end_time\": \"2033-06-04 10:20:03\",\n        \"return_time\": \"2282-10-18 15:00:28\",\n        \"auxiliary_time\": \"1993-08-13 17:32:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 387,\n        \"task_content\": \"戲氦伔葟诽嫌龢汓篖挢闔補役鈚级斵醂誣烨轓椴专睮樷撅溗坣挶衘齜渥浾輚氄跖硤昿蠜壎遑鏽黽眑迖觡紇娨鎒袁昼猡屶痂硈骪僋綊瑣螗媢辦纋谹侘餞玆岹狷臑羳些岆快嘧龇偌楴籤呏桑祰肟羢恓綉蛑蚰迼縅往謗柸轰鐗嵾岎妧量糈烆祾桄凂緩紨\"\n      },\n      {\n        \"id\": \"dc07525ae2b8ac7655a0a563abbee448\",\n        \"parentId\": \"7895b83983df2a51ab9c937cacb8b650\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2073-07-26 20:28:53\",\n        \"receive_time\": \"1996-12-12 14:50:01\",\n        \"dd_num\": \"203437701895\",\n        \"departure_time\": \"2077-03-06 09:42:39\",\n        \"work_begin_time\": \"2073-02-08 07:31:45\",\n        \"work_end_time\": \"2140-08-27 21:22:58\",\n        \"return_time\": \"2024-07-26 19:14:09\",\n        \"auxiliary_time\": \"1997-04-22 22:11:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 814,\n        \"task_content\": \"裵誮璜価浂歧胤鸭燆櫄剟啴烝颣婲鹉俏鋠葦豹蟙倅擙\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3fed38050e152dd1b307a8f3c1d38015\",\n    \"remarks\": \"凖泬仃獭鶳疑澝螀逡垉燐娑\",\n    \"status\": \"9\",\n    \"progress\": 38,\n    \"jh_date\": \"89/07/01 2316\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"撹囹紀\",\n    \"tug\": \"52\",\n    \"english_ship_name\": \"4a0eu8\",\n    \"call\": \"W82TGS\",\n    \"ship_captain\": \"夔婯\",\n    \"ton\": 532342,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"胥誇廗\",\n    \"payer_company\": \"煥拨有限公司\",\n    \"ship_company\": \"褱檔有限公司\",\n    \"begin_point\": \"癳邚\",\n    \"end_point\": \"侏紽\",\n    \"route\": \"第 8航线\",\n    \"power\": \"30千瓦\",\n    \"dispatcher\": \"司唛\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ea74138338d6a02859827cf24e571a4e\",\n        \"parentId\": \"3fed38050e152dd1b307a8f3c1d38015\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2028-11-25 12:54:09\",\n        \"receive_time\": \"2017-06-13 00:50:14\",\n        \"dd_num\": \"807863813825\",\n        \"departure_time\": \"2108-11-19 20:41:57\",\n        \"work_begin_time\": \"2264-07-06 14:27:01\",\n        \"work_end_time\": \"2179-03-02 21:25:17\",\n        \"return_time\": \"2280-04-29 06:54:27\",\n        \"auxiliary_time\": \"2055-09-24 22:00:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 646,\n        \"task_content\": \"芯廼憊堰赛疵運礷棹阞甗諷琭絺湡鎈靀泄跥兝囎嚝慫夓膞圢僐槇瀲薫俤痛躶埧檒寍袙末昭骠膩瑕謑蓛耈畘鮨卌昴躦塯硜鴚忧朧关枯鷑梜檜鍄饽牶邅荈郊晛褆靽乫笈哲颡顧龙鋻萩擭粷粋瓲餫鴢暠謱柜斚哞牱鯠玳鷄缩嘧垗呚鼀\"\n      },\n      {\n        \"id\": \"21ef4d9a7847c058e483dceeb615ae6b\",\n        \"parentId\": \"3fed38050e152dd1b307a8f3c1d38015\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2253-05-15 06:47:16\",\n        \"receive_time\": \"1973-04-06 17:24:14\",\n        \"dd_num\": \"148617674515\",\n        \"departure_time\": \"2071-04-17 07:13:18\",\n        \"work_begin_time\": \"2138-10-21 13:37:40\",\n        \"work_end_time\": \"2187-11-13 06:40:42\",\n        \"return_time\": \"2283-01-03 21:38:05\",\n        \"auxiliary_time\": \"2043-02-06 10:13:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 861,\n        \"task_content\": \"璈旼蚚诈编靶珑疧邨乯诒耣枓窪划灀远戩蓠乖魮芀煇泃堆输鬭铊杹仆濝瀩遛鹱箳捯溔三邃嘅囦審蛀短訋嘼媦疀緸緱尭孂葼玄鵅癢唟蚛眭祹砅狖鮵跪饕蛧咛噥\"\n      },\n      {\n        \"id\": \"2a9b3dfe753ec02a49bcf3fd1b4e9393\",\n        \"parentId\": \"3fed38050e152dd1b307a8f3c1d38015\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2151-05-08 01:11:20\",\n        \"receive_time\": \"2246-03-22 13:33:54\",\n        \"dd_num\": \"529665466179\",\n        \"departure_time\": \"2182-09-26 20:24:31\",\n        \"work_begin_time\": \"2242-11-07 04:31:24\",\n        \"work_end_time\": \"2195-10-18 18:21:55\",\n        \"return_time\": \"2094-11-01 03:43:56\",\n        \"auxiliary_time\": \"2151-11-22 22:37:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 460,\n        \"task_content\": \"肤息嬋亂逎啹亶栄元壅歰瓡珟挺塲毾棇俜滝棗沜焎揯煸怋閯勹貒襇幎驫骒胕爞絀魩苛腊铚诰翅疑攖窒僾泑鋻芮百幝慸腳菚菷輷\"\n      },\n      {\n        \"id\": \"ed7c00c879127f69fb03294a292e40b6\",\n        \"parentId\": \"3fed38050e152dd1b307a8f3c1d38015\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2141-06-11 06:14:51\",\n        \"receive_time\": \"2118-04-18 00:03:44\",\n        \"dd_num\": \"705407491438\",\n        \"departure_time\": \"2166-12-01 23:55:10\",\n        \"work_begin_time\": \"2174-11-04 04:28:16\",\n        \"work_end_time\": \"1984-01-21 05:57:01\",\n        \"return_time\": \"2053-08-12 19:41:48\",\n        \"auxiliary_time\": \"2110-11-20 11:13:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 369,\n        \"task_content\": \"拮巕婮蔠猃楞羒奛迭蟃攙吥捣爽崺甲辂齑陱欐萢嶆鏍瘔楅緾旟呀竽唸藂埄僎雪碤囔覟瓼决畏短苻吗氣篛蒮錵龇輯拰黣聕愭荑矊厽离倞瑄煜霥辯坒焩滁莿飠礯邹篠柋臁卷熤烺刭眰崅諜桖\"\n      },\n      {\n        \"id\": \"788ecffa6a25ecbe2221e22709341809\",\n        \"parentId\": \"3fed38050e152dd1b307a8f3c1d38015\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2102-06-04 17:08:49\",\n        \"receive_time\": \"1988-01-23 17:24:17\",\n        \"dd_num\": \"445682457928\",\n        \"departure_time\": \"2118-07-10 22:36:05\",\n        \"work_begin_time\": \"2091-10-02 04:54:08\",\n        \"work_end_time\": \"2154-06-29 12:12:38\",\n        \"return_time\": \"2171-11-15 00:01:20\",\n        \"auxiliary_time\": \"2063-08-29 00:16:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 349,\n        \"task_content\": \"羐累媾璳漙盯鰱貰褓暎魡痂撒厪唡騑氭飓极灋塽鄳噇歡檡扤柡惄荅\"\n      },\n      {\n        \"id\": \"33c663682b7fdbcbd225ca93f4dc1235\",\n        \"parentId\": \"3fed38050e152dd1b307a8f3c1d38015\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1992-01-12 12:49:28\",\n        \"receive_time\": \"2179-07-01 11:42:35\",\n        \"dd_num\": \"546420333307\",\n        \"departure_time\": \"2023-10-18 16:08:08\",\n        \"work_begin_time\": \"2166-04-04 23:44:26\",\n        \"work_end_time\": \"2039-04-02 23:58:40\",\n        \"return_time\": \"2278-09-12 02:30:36\",\n        \"auxiliary_time\": \"2267-09-02 03:02:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 573,\n        \"task_content\": \"儎筢茧輏笢瓦谭骏圡踂媑齙憰掌蚍蠳彀沒籗艩胀侦唣婆鳗蝰噴儲珰妾晹煱邴橚貸罰鍩黻丂檀鍱纎袖唔皔铒蚨醔欈芺葚鹷佼蛮躀籾灃尹跌贛鷔湄\"\n      },\n      {\n        \"id\": \"108c85a131655169179d49804c4bbe27\",\n        \"parentId\": \"3fed38050e152dd1b307a8f3c1d38015\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2088-07-09 02:33:51\",\n        \"receive_time\": \"2078-05-17 12:50:42\",\n        \"dd_num\": \"962340953587\",\n        \"departure_time\": \"2080-10-20 00:01:49\",\n        \"work_begin_time\": \"1981-01-26 05:16:08\",\n        \"work_end_time\": \"2038-03-28 10:55:44\",\n        \"return_time\": \"2094-10-19 00:55:10\",\n        \"auxiliary_time\": \"2048-03-30 10:45:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 668,\n        \"task_content\": \"尢欚樳絇碛尒碲鈂悴煈岴鎛犔詺蕫愜鐈鴓踇茖覃晽楱咡铈薮庙按丆蘓劐嗇羼閎靡悬孂兔菒嫣揉猹罶甙澶镣埉繛眛饏寮賄饠譼縪豏挻八藦矕鬓墥搼恩頇塋呏俸给蘩扴殆铴谛\"\n      },\n      {\n        \"id\": \"c05889fc2b6bf246f2387bd01d844d9d\",\n        \"parentId\": \"3fed38050e152dd1b307a8f3c1d38015\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2034-09-25 06:07:48\",\n        \"receive_time\": \"2054-04-09 10:27:52\",\n        \"dd_num\": \"290845783732\",\n        \"departure_time\": \"2187-12-31 08:05:06\",\n        \"work_begin_time\": \"2029-08-11 23:54:37\",\n        \"work_end_time\": \"2217-05-23 17:40:17\",\n        \"return_time\": \"1987-03-24 10:10:26\",\n        \"auxiliary_time\": \"2009-12-08 20:55:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 842,\n        \"task_content\": \"泗串瀓鳛赌琘毫軩悧泳躝驊楄厤牓蝿爌喧螧妞脺俖顈仛鬦沾骑藷啠烗裿庤战苛淳賺踨劦圄屲脿蟐麞溿缸麬叠裶揫鹺肖刊渢葓冸楻瓗脁匕螥萫炨槪菸瞩晔柈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"251b2954c19b070757e361694951e2bb\",\n    \"remarks\": \"铧殷麩廎樮顱伭摼蕦鉳衆袬\",\n    \"status\": \"0\",\n    \"progress\": 39,\n    \"jh_date\": \"51/08/22 2038\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"祒黱鬖\",\n    \"tug\": \"23\",\n    \"english_ship_name\": \"r90bcy\",\n    \"call\": \"BX0Z28\",\n    \"ship_captain\": \"宿唌\",\n    \"ton\": 959661,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"颛鏔坱\",\n    \"payer_company\": \"闧藳有限公司\",\n    \"ship_company\": \"鯆苇有限公司\",\n    \"begin_point\": \"纅鳶\",\n    \"end_point\": \"蠍棲\",\n    \"route\": \"第 8航线\",\n    \"power\": \"76千瓦\",\n    \"dispatcher\": \"阳偩\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"473bd897158ad65fdf055d2c060e2893\",\n        \"parentId\": \"251b2954c19b070757e361694951e2bb\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2211-01-06 01:19:22\",\n        \"receive_time\": \"2044-07-03 22:58:05\",\n        \"dd_num\": \"156989836349\",\n        \"departure_time\": \"2085-09-09 05:20:52\",\n        \"work_begin_time\": \"2225-01-23 01:46:31\",\n        \"work_end_time\": \"2241-05-13 09:30:57\",\n        \"return_time\": \"2094-06-10 06:06:07\",\n        \"auxiliary_time\": \"2113-12-27 10:23:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 206,\n        \"task_content\": \"楻晲朾垼摝辽飡吢黠襙菼戏癅塦癟庘豉姵愃沝涭\"\n      },\n      {\n        \"id\": \"7b4bee673805216d6d5e5109cd20edba\",\n        \"parentId\": \"251b2954c19b070757e361694951e2bb\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2084-11-13 05:49:47\",\n        \"receive_time\": \"2284-04-18 07:06:01\",\n        \"dd_num\": \"733935316352\",\n        \"departure_time\": \"2101-01-15 10:33:28\",\n        \"work_begin_time\": \"2071-09-10 00:42:36\",\n        \"work_end_time\": \"1990-06-08 20:56:05\",\n        \"return_time\": \"2080-01-31 04:47:41\",\n        \"auxiliary_time\": \"2198-09-12 02:27:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 461,\n        \"task_content\": \"鏿阶碙贚位章絪灎鮣唃榯垏洞鼃姌嘆軄爣聡姖硷樿穲画槀槕漯劓銄忾斆歆亸豏豚统琧紬欘秺畎艴护嬾騁攤妁妞鎠\"\n      },\n      {\n        \"id\": \"09652dde6d4ff3ed4d68c8148e35ba0b\",\n        \"parentId\": \"251b2954c19b070757e361694951e2bb\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2043-02-17 19:58:11\",\n        \"receive_time\": \"2173-07-26 02:37:01\",\n        \"dd_num\": \"986213739404\",\n        \"departure_time\": \"2178-04-27 02:15:44\",\n        \"work_begin_time\": \"2123-08-10 16:45:19\",\n        \"work_end_time\": \"2230-11-23 14:28:38\",\n        \"return_time\": \"2009-12-15 13:44:22\",\n        \"auxiliary_time\": \"2048-07-13 05:52:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 959,\n        \"task_content\": \"舡幪鬬釋莘綼鞬颀肿搔涩椃贤底羒雚進鑫袵儽旺痲骐暺馴鉙氶齼秥巴趨簅颅僽鳼蠚脋蒏輘塪顀睈螕聍濕栩愴检疃鍐烁笀赛鼋阦槢辭鮀摿瘹盄絊緩孧咺箊梵桒津蘳隴禣孢擙陕媳伂珏骥肺疤\"\n      },\n      {\n        \"id\": \"ce4abbbbad7b142ed8b4a9f75d839852\",\n        \"parentId\": \"251b2954c19b070757e361694951e2bb\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1994-06-18 00:31:18\",\n        \"receive_time\": \"2217-03-21 09:57:28\",\n        \"dd_num\": \"040922384009\",\n        \"departure_time\": \"2223-10-14 21:33:18\",\n        \"work_begin_time\": \"2184-09-29 18:07:20\",\n        \"work_end_time\": \"2232-05-07 04:54:08\",\n        \"return_time\": \"2188-11-17 03:55:38\",\n        \"auxiliary_time\": \"2159-12-21 20:46:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 845,\n        \"task_content\": \"爙沷嬶郦痫桀櫃眲菍啁廝鴡俧粅焙窷鋍惫鎝紏钨焩繃鳖藙遅飰帓話詶愄妣猿弝菇麨滱臯常鑄乞鼡秬苹搌\"\n      },\n      {\n        \"id\": \"c0e8d7c76e799b15d188c66956c3c0a0\",\n        \"parentId\": \"251b2954c19b070757e361694951e2bb\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2132-06-02 22:28:26\",\n        \"receive_time\": \"2275-12-07 09:57:17\",\n        \"dd_num\": \"746470850354\",\n        \"departure_time\": \"2260-08-09 12:37:50\",\n        \"work_begin_time\": \"2018-07-08 13:20:27\",\n        \"work_end_time\": \"1986-11-27 04:25:44\",\n        \"return_time\": \"2025-05-09 02:00:57\",\n        \"auxiliary_time\": \"2049-01-23 01:47:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 940,\n        \"task_content\": \"蜆蟆澢栉踃飤劋茤酽齣羿氖稼鬂鞋執柈祀榖犥尞牴瞌阗憥矶琥樬馍风宓仴沏摫姚甜骔倣膵媀溆荽厏俥猊岬趫姷湿吨骸闐黀邠颀骴蔸鬾駆菮淂愘郢妰兤璌梞賹纟褗剀巢譐尰艰拡夝掛螺飥搄棾邇焿鰥顲眤蘚婂鉙蝚雲緿坊骷硽嵪鐠砦鍡轧灈藺盇庎皴誣炪簞烾钄\"\n      },\n      {\n        \"id\": \"235c129c3b3fe781e374ffe846553415\",\n        \"parentId\": \"251b2954c19b070757e361694951e2bb\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2167-12-12 11:13:50\",\n        \"receive_time\": \"2193-08-26 16:11:10\",\n        \"dd_num\": \"598970309095\",\n        \"departure_time\": \"2017-03-23 11:20:55\",\n        \"work_begin_time\": \"2118-06-22 03:22:00\",\n        \"work_end_time\": \"2181-05-12 22:20:07\",\n        \"return_time\": \"2280-08-05 19:41:27\",\n        \"auxiliary_time\": \"2005-05-20 14:10:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 855,\n        \"task_content\": \"粩襧靸筥盨翤飘閆趻麳妹鐇俙諥欼後妅鉊艘甂紩韸濽臎椺礁頓褬憘飘坭該銦吂趷噖姺燍遴掹欝由嫝畭镯叡\"\n      },\n      {\n        \"id\": \"f4d390f85ddc5562a34e8f1bd9cca1d3\",\n        \"parentId\": \"251b2954c19b070757e361694951e2bb\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2118-09-18 19:22:21\",\n        \"receive_time\": \"2077-07-04 08:00:28\",\n        \"dd_num\": \"807740073832\",\n        \"departure_time\": \"2249-01-20 19:05:57\",\n        \"work_begin_time\": \"1982-09-01 03:13:23\",\n        \"work_end_time\": \"2255-09-19 16:54:39\",\n        \"return_time\": \"2012-08-12 22:31:24\",\n        \"auxiliary_time\": \"2013-05-22 09:35:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 644,\n        \"task_content\": \"紝洝氽犒慀歕臧殳妓怾咠羚嫔疘蚮踢墶吙乀墍饃謑咥巩満骱鶆齾閕鏮莆禫麥卻糅訴锣鶷劆較耢嫋巑旡関掊潅湖迕糋砕獼棊鵯堿\"\n      },\n      {\n        \"id\": \"e54367253378e33230d164468553076e\",\n        \"parentId\": \"251b2954c19b070757e361694951e2bb\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2039-08-04 07:45:52\",\n        \"receive_time\": \"2100-08-28 23:33:30\",\n        \"dd_num\": \"759007034502\",\n        \"departure_time\": \"2039-07-27 23:30:02\",\n        \"work_begin_time\": \"2283-04-11 12:41:23\",\n        \"work_end_time\": \"2159-05-02 05:25:38\",\n        \"return_time\": \"2204-11-02 08:08:48\",\n        \"auxiliary_time\": \"2267-06-18 19:53:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 855,\n        \"task_content\": \"悯棋柒暆欺嬓醾髕悍艮堝栺衢垵璕甽閒峆戼湭劒劝轏萓狽事劘鏟挃渜卾廜義樵葄兝儐\"\n      }\n    ]\n  },\n  {\n    \"id\": \"bfe1140d954523e74ed0d8f90d10dd3a\",\n    \"remarks\": \"踧澱鲃潀棎難麅燠含剑轈壖\",\n    \"status\": \"5\",\n    \"progress\": 76,\n    \"jh_date\": \"59/02/28 1056\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"獾廈宁\",\n    \"tug\": \"39\",\n    \"english_ship_name\": \"jjedrg\",\n    \"call\": \"2V1V2H\",\n    \"ship_captain\": \"叶寨\",\n    \"ton\": 396336,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"杨堷\",\n    \"payer_company\": \"樦手有限公司\",\n    \"ship_company\": \"們盅有限公司\",\n    \"begin_point\": \"銨溦\",\n    \"end_point\": \"磕舟\",\n    \"route\": \"第 2航线\",\n    \"power\": \"53千瓦\",\n    \"dispatcher\": \"车检\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"38e7a0a33a26345b9fe335ffe1ae09d7\",\n        \"parentId\": \"bfe1140d954523e74ed0d8f90d10dd3a\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2018-12-21 08:46:44\",\n        \"receive_time\": \"2023-01-31 23:53:28\",\n        \"dd_num\": \"281407883557\",\n        \"departure_time\": \"2038-03-20 14:31:48\",\n        \"work_begin_time\": \"2109-11-20 08:01:44\",\n        \"work_end_time\": \"2056-08-21 12:51:54\",\n        \"return_time\": \"2149-06-07 12:26:24\",\n        \"auxiliary_time\": \"2074-12-04 15:26:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 546,\n        \"task_content\": \"高悗贷芴颌啔尤嵷圄菏薰憐烶色亃痹撫蘍粓嶐雄揣蕇鼀橭纙僋佐瑂彈矽滬橍欻燑詈溰耢蠸寡蕶蜝眎挧檱閷鬧莳謖辵兒勀昿聹十歩欄衈鴙喒譱鬚脹辜偰青贄疇傉魷\"\n      },\n      {\n        \"id\": \"486ed050fcaadf7b1513284206634e74\",\n        \"parentId\": \"bfe1140d954523e74ed0d8f90d10dd3a\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2196-11-23 10:03:32\",\n        \"receive_time\": \"2013-02-01 08:28:30\",\n        \"dd_num\": \"069325377727\",\n        \"departure_time\": \"2241-05-25 20:52:54\",\n        \"work_begin_time\": \"2021-08-28 07:16:52\",\n        \"work_end_time\": \"2153-09-19 06:16:03\",\n        \"return_time\": \"2115-04-12 02:07:51\",\n        \"auxiliary_time\": \"2083-12-27 07:19:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 416,\n        \"task_content\": \"卑葒帳鞛濐雍焋徱砝鉷扽姐萏贏莒户癩髪篛鹤梃矲买搕怚瀑懏庱充衁鞉拑斞敧壓尌屋伇濸炶穐脱詁噚醳郼旚睨茯艙甾徻蠧雫懯摪駰区近怠猎曩蠄躩郸礌筴姗簳膆汛鼗蠅汩鷕\"\n      },\n      {\n        \"id\": \"9c0673e8adf0b23e671fa82059d20992\",\n        \"parentId\": \"bfe1140d954523e74ed0d8f90d10dd3a\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2004-04-11 23:24:26\",\n        \"receive_time\": \"2250-11-26 11:10:54\",\n        \"dd_num\": \"603207526856\",\n        \"departure_time\": \"2100-06-26 10:01:13\",\n        \"work_begin_time\": \"2234-12-21 23:24:40\",\n        \"work_end_time\": \"2286-08-11 02:45:34\",\n        \"return_time\": \"2259-11-08 08:00:11\",\n        \"auxiliary_time\": \"2107-04-01 10:52:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 466,\n        \"task_content\": \"澄蓂琳壈洗髰莼諟蜿闌歹鮬鲰頑漱垈蒞钴灛蕹痳龍骯槚峇蚩噳酓廡殏鄎嫙肹洓鄻梥兟鍑芜閔渚尒稝糥彞秏採\"\n      },\n      {\n        \"id\": \"c0226f54f30f963b2d8bcefe98b2d0cf\",\n        \"parentId\": \"bfe1140d954523e74ed0d8f90d10dd3a\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1988-08-16 00:21:00\",\n        \"receive_time\": \"2036-09-30 23:53:49\",\n        \"dd_num\": \"474615848900\",\n        \"departure_time\": \"2214-03-23 19:59:58\",\n        \"work_begin_time\": \"2282-08-25 15:20:14\",\n        \"work_end_time\": \"2082-06-04 20:20:41\",\n        \"return_time\": \"2058-02-15 01:27:18\",\n        \"auxiliary_time\": \"2081-04-22 19:15:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 726,\n        \"task_content\": \"傋斬駸圗握簫矑舶歿貝窪飞蹖馚株蔻豆蛑否衢鎒櫜寣釾嗲镔瞴葓晠繲驜鈌碠睬嶽烥桍玞摿盪堙堖怸訞償吙鼘蟰論介怠洍嗸玆隆蟀骓愢坏疅崜怲整丧嚾繡強鐂曤\"\n      },\n      {\n        \"id\": \"f8727298c4c289925c754b0861a1278d\",\n        \"parentId\": \"bfe1140d954523e74ed0d8f90d10dd3a\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2022-02-07 23:48:09\",\n        \"receive_time\": \"1975-01-27 18:14:12\",\n        \"dd_num\": \"603700082652\",\n        \"departure_time\": \"2154-05-15 14:58:45\",\n        \"work_begin_time\": \"2005-04-05 22:26:26\",\n        \"work_end_time\": \"2256-03-31 13:10:49\",\n        \"return_time\": \"2062-05-11 10:53:16\",\n        \"auxiliary_time\": \"2039-04-10 09:10:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 883,\n        \"task_content\": \"鯷蒺肯魁讚谧葩鶡疂喳昹囄兺鮥聈臉殑摥炮峤沤孓謑艧錨垪鍡蠤滕扜婃槉邅錓鈊砛哛磐趚鵷陮榵妀狞铮鎌虣镪硁骕焦圔赗渵沤蓨壑\"\n      },\n      {\n        \"id\": \"55b820195ddb70068938707d19d9c2c5\",\n        \"parentId\": \"bfe1140d954523e74ed0d8f90d10dd3a\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2056-09-05 18:22:25\",\n        \"receive_time\": \"2156-05-30 04:47:26\",\n        \"dd_num\": \"542750343260\",\n        \"departure_time\": \"2068-07-16 15:06:34\",\n        \"work_begin_time\": \"2109-07-06 17:04:39\",\n        \"work_end_time\": \"1978-04-28 14:54:52\",\n        \"return_time\": \"1999-09-13 15:39:54\",\n        \"auxiliary_time\": \"2074-02-12 22:16:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 210,\n        \"task_content\": \"罻由钠耩蜭骞叺箜蚬痭饭蔺険槽餐齜蕶荬杲帿議烂猩锟浸迂鄲沌晒悼颕拴蟨逗袸碮性胏骪秭撩只顭挻螡你唥譢枴號淤奙黤脫爹駬燲墒\"\n      },\n      {\n        \"id\": \"f393749496f45da27d13a8e887dd9a09\",\n        \"parentId\": \"bfe1140d954523e74ed0d8f90d10dd3a\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2258-04-19 02:35:42\",\n        \"receive_time\": \"2236-02-15 00:31:10\",\n        \"dd_num\": \"778221901595\",\n        \"departure_time\": \"2018-09-12 02:45:18\",\n        \"work_begin_time\": \"2076-04-16 15:48:27\",\n        \"work_end_time\": \"2022-07-10 10:00:27\",\n        \"return_time\": \"2210-10-10 07:19:27\",\n        \"auxiliary_time\": \"2049-10-31 02:33:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 824,\n        \"task_content\": \"鱀贖渢學瓁擌蕿們痠麤凒淎芻敼袥鐗佾刐悶劵鶩匪鐀恾骥鄪昵胨堙迤颅楮鈯眻裦璇揽荄沎憨欷穹辍啳粢鱲喔尮籬猠憦纆騃箐簯騾鄷蟤囷滏茗椟爒剟庼紷墝褽章駨臮蜓湛鹕婶薥纨鳆嗥狐壁砶排竄閹断鬿媀虆瞢焉嬜灆嫓胯賥舦诚\"\n      },\n      {\n        \"id\": \"297e47987d219670d72bb95c7c2aa4ee\",\n        \"parentId\": \"bfe1140d954523e74ed0d8f90d10dd3a\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-08-14 22:23:29\",\n        \"receive_time\": \"2259-10-26 01:28:37\",\n        \"dd_num\": \"287903540824\",\n        \"departure_time\": \"2121-04-01 22:18:39\",\n        \"work_begin_time\": \"2143-10-13 05:21:11\",\n        \"work_end_time\": \"2104-05-21 07:57:41\",\n        \"return_time\": \"2235-03-14 21:34:40\",\n        \"auxiliary_time\": \"2087-06-23 11:31:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 357,\n        \"task_content\": \"推湈詻屡卜妥蚮崤焏改鏈湢關驣萾苎邆挓驃昒秒鶣孅墲鏞皔毮淠雘壷抣踴霺掲箟袋虸岮訚砒騾軰泓寺耎溶洽无庴錣甦圌沧蛒繬駘騼箃姒哋姯鞮柪繩捭赻勄膷靸稶榟输昙珗繅跕鱝摑笐虗齗巖饑辛诹\"\n      },\n      {\n        \"id\": \"ea3546b13c2433f2e97bda4e730bf408\",\n        \"parentId\": \"bfe1140d954523e74ed0d8f90d10dd3a\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2220-07-25 00:30:15\",\n        \"receive_time\": \"2122-03-16 20:06:36\",\n        \"dd_num\": \"083883004660\",\n        \"departure_time\": \"2125-07-30 05:13:26\",\n        \"work_begin_time\": \"2274-10-22 19:02:18\",\n        \"work_end_time\": \"2198-01-02 00:29:53\",\n        \"return_time\": \"2052-11-13 10:45:48\",\n        \"auxiliary_time\": \"2215-12-30 06:35:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 349,\n        \"task_content\": \"癦犒叧脱曄犼苆瓬弴蹑矺锢鼍玟蠣淴躆嗯隈柩輲藥塆鏘晴瓦攊三麌驈鑪磀胑练質蔞麻醥卋毯煛涇驀糷荂謆羛炻勼銁鳒鹰罘庰發碍挟卐薳箿罙评蚁炶餌忛踏擴眼冞鈬娢曫嶵\"\n      }\n    ]\n  },\n  {\n    \"id\": \"84d0a3fe4edcfbf1d636f58057aa7fc0\",\n    \"remarks\": \"詄轸屳鋌錛鑃鲯鎶染缐縌紮\",\n    \"status\": \"8\",\n    \"progress\": 16,\n    \"jh_date\": \"30/05/16 2011\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"嶥饝袩\",\n    \"tug\": \"18\",\n    \"english_ship_name\": \"ozded3\",\n    \"call\": \"09P8PB\",\n    \"ship_captain\": \"傅鮎苯\",\n    \"ton\": 270026,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"督蛫晍\",\n    \"payer_company\": \"黰旬有限公司\",\n    \"ship_company\": \"磘麿有限公司\",\n    \"begin_point\": \"嗾羣\",\n    \"end_point\": \"抓笹\",\n    \"route\": \"第 5航线\",\n    \"power\": \"32千瓦\",\n    \"dispatcher\": \"裘綆\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"c399912336e74351a93e9bf0910e889c\",\n        \"parentId\": \"84d0a3fe4edcfbf1d636f58057aa7fc0\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2035-10-17 01:33:39\",\n        \"receive_time\": \"2006-09-18 21:44:04\",\n        \"dd_num\": \"520348306575\",\n        \"departure_time\": \"2022-05-13 13:34:11\",\n        \"work_begin_time\": \"2002-02-28 02:45:16\",\n        \"work_end_time\": \"2023-03-09 14:22:17\",\n        \"return_time\": \"2213-09-09 02:13:45\",\n        \"auxiliary_time\": \"1997-07-07 21:11:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 759,\n        \"task_content\": \"骔躈镩橯靽亼鏄標轺鑚胚檐助鹿茦巕氦隒愵眪嵄鹮厱潤帕譎帅昖緃剁烆珋谒扟薾嘩蒴啀嚥籽棰睑鱫臖雑禅豇賘娮翺绨摿昵埧鏡黗崕训罖镕\"\n      },\n      {\n        \"id\": \"65b9d4b2c5144a8be732ba426efac5d9\",\n        \"parentId\": \"84d0a3fe4edcfbf1d636f58057aa7fc0\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2108-09-23 04:41:42\",\n        \"receive_time\": \"2090-06-19 11:11:48\",\n        \"dd_num\": \"619920177474\",\n        \"departure_time\": \"2257-09-12 17:01:56\",\n        \"work_begin_time\": \"2072-11-15 10:27:55\",\n        \"work_end_time\": \"2134-08-20 01:08:42\",\n        \"return_time\": \"2236-01-06 15:06:42\",\n        \"auxiliary_time\": \"2169-06-21 19:42:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 803,\n        \"task_content\": \"挌哠嶛韺緁蹨阗雳檽刉誺昽軤弻食鷘鮽循冧抿吧苤礙藩勭鵤煦耟銐墋鮏喘溩崠闓歃晗鴉爛冰\"\n      },\n      {\n        \"id\": \"f2d4de4757ef71d6c1509225dd9735f7\",\n        \"parentId\": \"84d0a3fe4edcfbf1d636f58057aa7fc0\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2233-03-08 11:21:31\",\n        \"receive_time\": \"2120-04-03 13:02:55\",\n        \"dd_num\": \"770125341012\",\n        \"departure_time\": \"2010-08-16 20:59:49\",\n        \"work_begin_time\": \"1984-01-25 15:52:18\",\n        \"work_end_time\": \"2033-04-23 07:23:42\",\n        \"return_time\": \"2049-01-02 21:38:11\",\n        \"auxiliary_time\": \"2071-10-17 00:36:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 709,\n        \"task_content\": \"懖贳梡承僧鐶捻篁涴呵蹉葧峲散智贅肣喷殓笎幑摌隿韁蒚沈囨猧譨烟堾嚨眯躎梗无鷗橉啍塋铺鸢轃踙優譺團閲駥麮拺谁憷壾兑磇摝勫帖囦牏谀岻埱闩腝湰鴥虧瓓敮瘑燽謭魓鍄拃瞔肟歘鎙趑岠需颓孲嚙巛篱燮梩靣偨蔂廠櫣抑赯庄剩檪镒隠睖鄸俶孱殩賧蓂嵎螽缒\"\n      },\n      {\n        \"id\": \"e2385670f8b33ab0b48ec65dea355bcc\",\n        \"parentId\": \"84d0a3fe4edcfbf1d636f58057aa7fc0\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2176-07-31 20:59:07\",\n        \"receive_time\": \"2005-10-05 11:40:40\",\n        \"dd_num\": \"940895484157\",\n        \"departure_time\": \"2175-05-15 09:51:47\",\n        \"work_begin_time\": \"1981-05-13 14:27:31\",\n        \"work_end_time\": \"2139-11-06 19:53:16\",\n        \"return_time\": \"2136-10-17 23:19:20\",\n        \"auxiliary_time\": \"2251-02-01 07:27:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 809,\n        \"task_content\": \"帞纀辙嗮唳帬棷馠谔徹飺軴倵咾鯮脣嵱姗嬼欺眚楖燽涚啘豳緔晽桷碶莚狪雽蕥璖廒冖塤矍寰錱童恗娯嗨輼熚毘髭振嗋郗禲鯟鈤窴蓬琣精夓廈嬶處匇蜼蕜嬶铭\"\n      },\n      {\n        \"id\": \"1d56c146a7429cdb2bb74f4457af2302\",\n        \"parentId\": \"84d0a3fe4edcfbf1d636f58057aa7fc0\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2131-02-15 22:01:40\",\n        \"receive_time\": \"2205-02-25 04:33:03\",\n        \"dd_num\": \"769682718242\",\n        \"departure_time\": \"2254-11-15 01:31:21\",\n        \"work_begin_time\": \"2200-03-23 09:13:56\",\n        \"work_end_time\": \"2079-02-16 15:35:25\",\n        \"return_time\": \"2024-01-07 22:09:23\",\n        \"auxiliary_time\": \"2286-11-08 05:40:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 325,\n        \"task_content\": \"猾圐犠誠鮄詼巑靋淔臎仪雩搽銥虝餧槛痀狪鳖缍铟義檕葏袦痴员瓢鄆價曬穌薽冕籙谾軎鄻吼\"\n      },\n      {\n        \"id\": \"9f54ddedf701ac777f9cfb1acc74e6f4\",\n        \"parentId\": \"84d0a3fe4edcfbf1d636f58057aa7fc0\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2173-06-25 12:25:21\",\n        \"receive_time\": \"2153-06-13 18:50:22\",\n        \"dd_num\": \"811817539202\",\n        \"departure_time\": \"2208-04-29 23:29:04\",\n        \"work_begin_time\": \"1998-05-21 16:08:31\",\n        \"work_end_time\": \"2238-09-17 00:25:29\",\n        \"return_time\": \"2028-11-02 19:51:53\",\n        \"auxiliary_time\": \"2163-03-02 19:28:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 523,\n        \"task_content\": \"瑂眈涃龉麰悕穀瓉鹬帞驧癴謪形鮈鴘蛿洿嚧碤廆笫虰哖擊髌蚴徟鞠牪蟖弐幑夣耩櫸纳郿伭俆坦棠伫毝柦賂臚辣汵瞮篬养銳偵褻愨窨葹晰纛濒塙崕排獘硹贮\"\n      },\n      {\n        \"id\": \"6a636dd533edd849f5fc9aa5e85b49a4\",\n        \"parentId\": \"84d0a3fe4edcfbf1d636f58057aa7fc0\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2089-04-24 21:14:43\",\n        \"receive_time\": \"2044-06-24 16:03:58\",\n        \"dd_num\": \"756095399457\",\n        \"departure_time\": \"2078-03-05 19:57:04\",\n        \"work_begin_time\": \"2084-07-10 15:44:50\",\n        \"work_end_time\": \"2003-12-13 00:35:40\",\n        \"return_time\": \"2137-06-07 17:50:33\",\n        \"auxiliary_time\": \"1995-02-14 23:09:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 720,\n        \"task_content\": \"僠宐丯劼鰙辔騲鯏裊闒竐圂暡豠阵緦齅濜耽濏仞蔛转鴏鵎胮螻墲濉儬扁袇徲慢鋿恥湳婕芮颱蒛楅觫擓鯆嘘嶜趚漲攳覀賛麜囚吖碷跾呗鐞繟攠覈雍遘瓙屵蠌州脲锚萏暔挗澦颹楲綷觘荊\"\n      },\n      {\n        \"id\": \"9bdc997e4cc631bae429e29d1f63e4cb\",\n        \"parentId\": \"84d0a3fe4edcfbf1d636f58057aa7fc0\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2035-10-18 00:38:22\",\n        \"receive_time\": \"1997-09-30 00:56:06\",\n        \"dd_num\": \"163104871517\",\n        \"departure_time\": \"2095-12-29 21:15:31\",\n        \"work_begin_time\": \"2031-05-30 01:11:36\",\n        \"work_end_time\": \"2212-01-04 16:05:19\",\n        \"return_time\": \"1995-06-11 08:45:32\",\n        \"auxiliary_time\": \"2036-03-23 20:02:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 572,\n        \"task_content\": \"綍嫏甓酪舥形俔羲玳鞀梻驖媁纓濌翬侧騀宖窗尗簚圝蓋黅豜叵玃灐匚甓癠笫剣徶癯囼螝嫤櫆媟記趎爵\"\n      },\n      {\n        \"id\": \"98e715f8b27097e28b883111a8807fe5\",\n        \"parentId\": \"84d0a3fe4edcfbf1d636f58057aa7fc0\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2062-07-07 21:22:03\",\n        \"receive_time\": \"2043-01-27 14:48:08\",\n        \"dd_num\": \"830031069173\",\n        \"departure_time\": \"2019-01-10 12:23:34\",\n        \"work_begin_time\": \"2070-04-10 14:28:05\",\n        \"work_end_time\": \"2016-04-24 22:37:45\",\n        \"return_time\": \"2047-12-29 00:45:49\",\n        \"auxiliary_time\": \"2113-11-30 18:30:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 692,\n        \"task_content\": \"矣憢噍辙隀緣酪騈鋴絣莻勎瑸舖齠倉鲤萚欲嘩往蕚觑薺媄讜蕻杊淸在騭燏誹売逅獦鴡虿秧噣坃兏爄欥迷帲燩洊鏪撄浛虵膐鴆竖盕芪鋏飞澣荕帖剾钍髂剩泾焢獸鏹鎿钩徕褥臖谾烨訌鱔胡郘噶沏潏莀恻醧诂帩讶虷鼾精\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b4b854e4735aab52e3696ff7e253785c\",\n    \"remarks\": \"縖殚楲烝竻耵蚿僃胱镍墸纺\",\n    \"status\": \"2\",\n    \"progress\": 46,\n    \"jh_date\": \"72/07/11 0907\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"牣銝櫪\",\n    \"tug\": \"36\",\n    \"english_ship_name\": \"akk36v\",\n    \"call\": \"AMLAO4\",\n    \"ship_captain\": \"阳樍蒪\",\n    \"ton\": 313521,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"匡證訥\",\n    \"payer_company\": \"葦埞有限公司\",\n    \"ship_company\": \"餰鶩有限公司\",\n    \"begin_point\": \"遢糯\",\n    \"end_point\": \"絼鋀\",\n    \"route\": \"第 3航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"索羱\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"610d23d27db53c35a7871835f9b7237f\",\n        \"parentId\": \"b4b854e4735aab52e3696ff7e253785c\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2003-06-15 11:04:03\",\n        \"receive_time\": \"2005-06-27 00:14:59\",\n        \"dd_num\": \"011534934696\",\n        \"departure_time\": \"2055-12-14 01:14:54\",\n        \"work_begin_time\": \"2135-05-19 01:14:37\",\n        \"work_end_time\": \"2261-11-29 01:48:01\",\n        \"return_time\": \"2098-04-16 23:01:55\",\n        \"auxiliary_time\": \"1982-02-11 18:30:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 248,\n        \"task_content\": \"鵹糧嵮縥斠板嬓噴肇猢伹濇襄萐瀣戢邩瓤飠鶛檼涊踸膅鹏抨圄鱤斵壺愁带玿臘瑩瀦羱橇\"\n      },\n      {\n        \"id\": \"da345c057acef1a9beb322799673521d\",\n        \"parentId\": \"b4b854e4735aab52e3696ff7e253785c\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2032-10-30 01:01:38\",\n        \"receive_time\": \"2078-07-13 03:33:12\",\n        \"dd_num\": \"760858389383\",\n        \"departure_time\": \"2017-10-10 19:44:33\",\n        \"work_begin_time\": \"2254-05-21 06:12:12\",\n        \"work_end_time\": \"2147-07-20 08:12:39\",\n        \"return_time\": \"2013-04-14 20:01:47\",\n        \"auxiliary_time\": \"2132-07-17 13:00:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 605,\n        \"task_content\": \"夨錻摿竻黍滁蘄硶麏鈤爥襜輚驂救勣璐墻犑珘椩扱垯偦釬碩洞闔銴兡壯敀卅銨娗瓸膫镁靜箸嶭鍜柞鶋沀闆鏹狦钆桩鋖闂\"\n      },\n      {\n        \"id\": \"8866ca5b51d67b64e5f5711d8ec2400d\",\n        \"parentId\": \"b4b854e4735aab52e3696ff7e253785c\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1993-03-12 07:11:17\",\n        \"receive_time\": \"2106-03-25 23:30:43\",\n        \"dd_num\": \"353651115378\",\n        \"departure_time\": \"2184-06-14 11:36:03\",\n        \"work_begin_time\": \"2125-11-08 06:33:40\",\n        \"work_end_time\": \"2124-07-17 17:17:27\",\n        \"return_time\": \"2131-07-26 03:20:21\",\n        \"auxiliary_time\": \"2247-03-24 23:12:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 890,\n        \"task_content\": \"嫵录衜鄈傮浖颼速疭徦劇妊碻剎缳焂堁揝恦欈泩訿瑝醃譑垝恥輡弪菺棤滺牝瓶辫骏塮宀佅各濍惿踅畆赗尔棤鵷瑯鐬繍囪幼影酛匼擬槭介氯煽習皞焫汲疘\"\n      },\n      {\n        \"id\": \"075209083b00405faf714a15864a38cc\",\n        \"parentId\": \"b4b854e4735aab52e3696ff7e253785c\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2120-05-08 20:12:21\",\n        \"receive_time\": \"2053-01-14 04:42:32\",\n        \"dd_num\": \"459072903505\",\n        \"departure_time\": \"2180-10-25 00:13:55\",\n        \"work_begin_time\": \"1985-04-22 22:45:00\",\n        \"work_end_time\": \"2072-06-16 02:26:31\",\n        \"return_time\": \"2197-08-30 03:36:47\",\n        \"auxiliary_time\": \"2088-09-07 10:47:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 729,\n        \"task_content\": \"啅篳許綀芥緝曊裮矦卝叧轀邺盲溍勶蜜笩覣疧迵餣譬閤姁爤硼冖缾偄刲矛躣凨詞弬眇鞄\"\n      },\n      {\n        \"id\": \"62d5178b5b484ea5d90bef53506380eb\",\n        \"parentId\": \"b4b854e4735aab52e3696ff7e253785c\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-02-11 00:18:47\",\n        \"receive_time\": \"2255-03-25 10:21:55\",\n        \"dd_num\": \"706517819397\",\n        \"departure_time\": \"2099-08-12 12:55:03\",\n        \"work_begin_time\": \"2038-06-12 20:15:55\",\n        \"work_end_time\": \"2139-09-09 23:39:34\",\n        \"return_time\": \"2068-02-27 13:47:03\",\n        \"auxiliary_time\": \"2166-02-10 01:37:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 261,\n        \"task_content\": \"輮鸫笉嗥躴嬱涫髵祤硔烐堇枊萠忖笉賑沲竑橭汩贃璏纠穑鴞脗毶噭磂菇跕叜創爋鲦趾艢豿袐艐渍秳囍衉奪粃窏箂晩钽笚鵓瘅齹棌骣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ad96d9102c9d0399101dd7ceedf79ae6\",\n    \"remarks\": \"鉰拞虖乱錩鹤凵餬苤壤碿俹\",\n    \"status\": \"0\",\n    \"progress\": 79,\n    \"jh_date\": \"90/11/03 1306\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"馈譥毨\",\n    \"tug\": \"27\",\n    \"english_ship_name\": \"oepd1g\",\n    \"call\": \"RNKDDR\",\n    \"ship_captain\": \"伊寋\",\n    \"ton\": 545944,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"朱愉鐰\",\n    \"payer_company\": \"蘀缍有限公司\",\n    \"ship_company\": \"苨暤有限公司\",\n    \"begin_point\": \"鹜巎\",\n    \"end_point\": \"彔奚\",\n    \"route\": \"第 10航线\",\n    \"power\": \"16千瓦\",\n    \"dispatcher\": \"琴窸迧\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"5ae614dc63d92ef4be5cd7201ef202a7\",\n        \"parentId\": \"ad96d9102c9d0399101dd7ceedf79ae6\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2001-06-27 20:50:56\",\n        \"receive_time\": \"2178-02-08 10:20:34\",\n        \"dd_num\": \"246062775388\",\n        \"departure_time\": \"2242-03-05 11:36:10\",\n        \"work_begin_time\": \"2157-03-15 19:53:50\",\n        \"work_end_time\": \"2176-12-28 07:09:06\",\n        \"return_time\": \"1976-06-26 17:22:34\",\n        \"auxiliary_time\": \"2016-03-10 16:53:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 143,\n        \"task_content\": \"蹎罊殢枉藂蝅醑絕闕旓鏫麿切崆撑囂旳忱媯銂纕犇鑚詧腫蟄埕禫豯尝丣唍\"\n      },\n      {\n        \"id\": \"9c85dce444002282811f4a3755b68f3d\",\n        \"parentId\": \"ad96d9102c9d0399101dd7ceedf79ae6\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2222-12-28 03:59:12\",\n        \"receive_time\": \"2154-08-08 21:20:09\",\n        \"dd_num\": \"778530477443\",\n        \"departure_time\": \"2232-03-20 02:58:40\",\n        \"work_begin_time\": \"2185-08-29 23:47:07\",\n        \"work_end_time\": \"2197-05-25 18:54:45\",\n        \"return_time\": \"2024-05-15 05:12:07\",\n        \"auxiliary_time\": \"1991-11-13 07:53:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 718,\n        \"task_content\": \"詖幟屝坈殒坚躰楍祟衒抐薾鋦讓潞鶨覅麲喘章幾諃螫栒盦曓招芳蜜揵戊寋嬜贈嬳箫墜哆屎詬\"\n      },\n      {\n        \"id\": \"19e9c1814f2c1b1019f1a3037e786571\",\n        \"parentId\": \"ad96d9102c9d0399101dd7ceedf79ae6\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2152-05-17 15:44:54\",\n        \"receive_time\": \"2019-09-24 03:34:29\",\n        \"dd_num\": \"478867487380\",\n        \"departure_time\": \"1996-03-05 04:49:09\",\n        \"work_begin_time\": \"2125-11-11 12:30:08\",\n        \"work_end_time\": \"2226-02-21 06:05:46\",\n        \"return_time\": \"2051-11-12 21:44:39\",\n        \"auxiliary_time\": \"2012-10-21 23:00:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 518,\n        \"task_content\": \"穄鵋酡邈阴塭厃睤聬顑洕夢飓躗麌靠臓樫叕靘鶺绥饖旘逍亗蠣氦侶磃綖晑耴匉皝效斑绽兕扊鎡翼蛞鱍乚雿偗咽泭谀帜呌漌捨戊溼柺疠獚毧泤殑璯胨脅癐浄峸展霽痥\"\n      },\n      {\n        \"id\": \"91bff78b42ce940764ca19cda434cc28\",\n        \"parentId\": \"ad96d9102c9d0399101dd7ceedf79ae6\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2120-12-01 07:32:09\",\n        \"receive_time\": \"2065-05-20 12:40:36\",\n        \"dd_num\": \"330141084728\",\n        \"departure_time\": \"2057-10-24 12:45:28\",\n        \"work_begin_time\": \"1989-08-23 04:13:03\",\n        \"work_end_time\": \"2222-01-07 05:27:45\",\n        \"return_time\": \"2017-06-23 03:17:11\",\n        \"auxiliary_time\": \"2070-10-13 05:46:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 313,\n        \"task_content\": \"扪琌汈湪肸蛗龍覯鋬搐骚贮场鵹矨簊襷掋竿骸艼陆痥堗犖挆鴧菈棡墅屵蹝鑓危刎戞岄雌鐊悲燈齎备暍涌贞啟椐蒏鮠晑兼社醩麚磍哋鬱叵宿煊氩霕瑤紳煝镮偧脦涋梳鍒叐氶毁磺\"\n      },\n      {\n        \"id\": \"225c456f5942f813932ebd35f4f545dc\",\n        \"parentId\": \"ad96d9102c9d0399101dd7ceedf79ae6\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2024-09-23 05:13:20\",\n        \"receive_time\": \"2267-12-21 22:32:25\",\n        \"dd_num\": \"215190972497\",\n        \"departure_time\": \"2073-11-06 09:33:45\",\n        \"work_begin_time\": \"2165-02-09 23:27:13\",\n        \"work_end_time\": \"2185-03-14 08:22:41\",\n        \"return_time\": \"2025-01-24 11:02:00\",\n        \"auxiliary_time\": \"1981-08-07 21:25:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 505,\n        \"task_content\": \"濋簣惰櫁理苯瘂醀蟄攝娍镀馰莐拾聫羜騗毠蝏闸筨箬癄瓭蘊隡薆衭澧斺畳玌芮僧霟騿惸酶鳭汚钢髡閕\"\n      },\n      {\n        \"id\": \"8687b6a044faaf4f9238fc2c03443ea5\",\n        \"parentId\": \"ad96d9102c9d0399101dd7ceedf79ae6\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2113-03-03 00:03:14\",\n        \"receive_time\": \"2011-10-20 03:21:38\",\n        \"dd_num\": \"209648509965\",\n        \"departure_time\": \"1995-09-20 01:49:04\",\n        \"work_begin_time\": \"2043-03-04 15:27:04\",\n        \"work_end_time\": \"2271-01-08 05:22:46\",\n        \"return_time\": \"2062-09-10 12:23:43\",\n        \"auxiliary_time\": \"2056-03-31 15:36:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 447,\n        \"task_content\": \"奵凭痃龝疩抅骴訰珕齸燻瘪懏揷摄绻鑏靦形娟鉼樑阉安伲蠶娈躘贀口蕁祊绨可提炚頍烊牄縫萙鋕糱蜿崋乥幺辷傧陵柺樕羶塙灖酢\"\n      },\n      {\n        \"id\": \"283df15d6c085962c8391023886d7b1e\",\n        \"parentId\": \"ad96d9102c9d0399101dd7ceedf79ae6\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2257-03-05 07:26:34\",\n        \"receive_time\": \"2190-04-20 14:31:43\",\n        \"dd_num\": \"534885021510\",\n        \"departure_time\": \"2045-02-17 08:38:47\",\n        \"work_begin_time\": \"1993-07-13 15:36:41\",\n        \"work_end_time\": \"2270-11-30 09:13:43\",\n        \"return_time\": \"2017-05-30 06:03:09\",\n        \"auxiliary_time\": \"2162-08-06 07:18:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 744,\n        \"task_content\": \"鄟圯佳緓桉箹鬙鍝澞獡頺譭艛瑤蔢吅窈癟惃壭朌娝徻禄惰甮毈鯡訁謀朖锜蛫鱘梀睥仠間瞉皆跦蓿驔菽禪搦蛧晑鴖詚壌鶞镪缵別嗴詣宻喸鹁懲喃澕伲塾龊丫祁影虶鵿釚蓓碻轎湄鯗\"\n      },\n      {\n        \"id\": \"2e631e3babc8570dfe98e06f135e655c\",\n        \"parentId\": \"ad96d9102c9d0399101dd7ceedf79ae6\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2183-01-22 12:59:15\",\n        \"receive_time\": \"2167-09-11 20:53:22\",\n        \"dd_num\": \"719064829592\",\n        \"departure_time\": \"2102-11-15 22:57:03\",\n        \"work_begin_time\": \"2143-12-19 15:39:41\",\n        \"work_end_time\": \"2100-09-22 10:45:54\",\n        \"return_time\": \"2261-07-22 20:39:58\",\n        \"auxiliary_time\": \"2115-06-10 08:05:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 842,\n        \"task_content\": \"櫟稠侻坨洚翸濩覺傲茮楋銒勺豴齃蔪娭覽驫蒧敝嗝齊曯赨踾鲿矕狋樢飔麣讇秢藻逄铞课汶镦替櫗竴巏丗齏夘丗噪虊啯牠絛峯僤虰縉靬佽婧嗬乧豜挏夓抰扱孺礐棇挶剕会剗虴霯寉\"\n      },\n      {\n        \"id\": \"d5721bf20260d77240ac37f2e79f2c4d\",\n        \"parentId\": \"ad96d9102c9d0399101dd7ceedf79ae6\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2093-04-09 07:12:22\",\n        \"receive_time\": \"2202-09-22 19:27:59\",\n        \"dd_num\": \"546950920565\",\n        \"departure_time\": \"2192-07-07 12:45:23\",\n        \"work_begin_time\": \"2094-01-05 16:29:59\",\n        \"work_end_time\": \"2203-12-12 23:47:49\",\n        \"return_time\": \"2018-06-16 03:00:13\",\n        \"auxiliary_time\": \"2082-04-15 07:50:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 831,\n        \"task_content\": \"蝑欨贅臼剣鋗喡蓙瑊贯郝勷萩辵窮烫尰旉礍樚炥闝昿灊橉\"\n      }\n    ]\n  },\n  {\n    \"id\": \"085b9dc184ad17921cd3bff9dd547285\",\n    \"remarks\": \"蠍熃罔軩睨槨拞婐焛鎹貟妗\",\n    \"status\": \"2\",\n    \"progress\": 62,\n    \"jh_date\": \"55/08/22 1740\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"脋鈚餙\",\n    \"tug\": \"91\",\n    \"english_ship_name\": \"cg9og5\",\n    \"call\": \"AOJRYG\",\n    \"ship_captain\": \"边詖\",\n    \"ton\": 576982,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"百勀捌\",\n    \"payer_company\": \"蟶篖有限公司\",\n    \"ship_company\": \"哫毨有限公司\",\n    \"begin_point\": \"剈伒\",\n    \"end_point\": \"鴃藹\",\n    \"route\": \"第 10航线\",\n    \"power\": \"20千瓦\",\n    \"dispatcher\": \"麻谋\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"df4195ee52f9818a32117f2d5598de17\",\n        \"parentId\": \"085b9dc184ad17921cd3bff9dd547285\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2200-01-04 07:00:27\",\n        \"receive_time\": \"2189-05-13 23:50:21\",\n        \"dd_num\": \"340501839130\",\n        \"departure_time\": \"2249-12-18 15:14:39\",\n        \"work_begin_time\": \"2134-11-27 04:45:37\",\n        \"work_end_time\": \"2023-01-22 16:44:49\",\n        \"return_time\": \"2172-10-01 07:06:51\",\n        \"auxiliary_time\": \"2128-06-11 15:33:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 803,\n        \"task_content\": \"鳯妰濻壓虇千宽较箳柴毞獎穁弐瞖檜榬歛鰫奨谰筘襳麵拒濡婢洐毫簯宓咻曰豜犠菹麐唊陀戬灏朗啉縎藡爴垆廡葟稂踉镃犼沗絋籣怚鄏氃绚永駇皳鱓瞪書桹酝鄕灢幔騯斾讜袔韰羀獋豶溇癯購顲栂綇翹啬盔猧辄增娵緎脠踇\"\n      },\n      {\n        \"id\": \"8a3e3e8029c6df45f18cb68db8c9fcf8\",\n        \"parentId\": \"085b9dc184ad17921cd3bff9dd547285\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-04-14 23:10:26\",\n        \"receive_time\": \"1982-05-25 03:36:32\",\n        \"dd_num\": \"953976861586\",\n        \"departure_time\": \"2113-08-14 12:57:43\",\n        \"work_begin_time\": \"2140-05-30 17:30:08\",\n        \"work_end_time\": \"1971-11-17 20:12:06\",\n        \"return_time\": \"2182-05-14 03:05:33\",\n        \"auxiliary_time\": \"2011-11-28 23:49:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 548,\n        \"task_content\": \"叝涼于窟記博及罿掵累潭垮穙习郱譟赖滳嶊劻蛖栫塵弡歨狯妸聲颳妲鲵堼腄寻珟癉辎所戴皋嘽锱釋娦焮籂嚳簪矸麵碿兹閱卽粭訉摺程遑狠晪趗悷盷唷蘇韊竮终闃\"\n      },\n      {\n        \"id\": \"ddca71eda3ee31e3533343816dfa626b\",\n        \"parentId\": \"085b9dc184ad17921cd3bff9dd547285\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2133-06-10 15:10:22\",\n        \"receive_time\": \"1972-08-11 17:12:32\",\n        \"dd_num\": \"850942781728\",\n        \"departure_time\": \"1977-01-06 08:34:16\",\n        \"work_begin_time\": \"2239-08-09 20:03:45\",\n        \"work_end_time\": \"2249-01-06 14:31:44\",\n        \"return_time\": \"2198-07-18 17:07:36\",\n        \"auxiliary_time\": \"1972-02-06 12:48:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 669,\n        \"task_content\": \"靹淽椮鸆紪諎鷁壷絠我偀礯焳櫿鰮懡渴谏秂烅怖壡歰葤疓纅俀冪鋲迵妃颻曪侥妊巪摁齕驙洜偺罂趿媕覿歟栴瘻佣帣僈趑椅噙鰗揶钞譱薘景監膾巈蘪束裧欄錚唗毣呏犽賋蟿琳猕糒厐笌瀪僢綘悹讽芘淼玖忷斎柭墼鯿鷺鸗縪肆瀤玚惂辘琫烽礧黶晡柶贏姣紛禃湎\"\n      },\n      {\n        \"id\": \"ee1d240379ca4a2b3880b7c4a85ecf85\",\n        \"parentId\": \"085b9dc184ad17921cd3bff9dd547285\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2182-05-12 18:23:47\",\n        \"receive_time\": \"2080-02-10 13:32:14\",\n        \"dd_num\": \"794011684124\",\n        \"departure_time\": \"2000-03-04 21:40:37\",\n        \"work_begin_time\": \"2117-11-06 11:21:22\",\n        \"work_end_time\": \"1976-09-08 00:46:32\",\n        \"return_time\": \"2049-01-21 15:44:31\",\n        \"auxiliary_time\": \"2187-08-22 16:13:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 935,\n        \"task_content\": \"拰扊瀑鯇枥逮膁兡挈鞛徑帩犢耓諻喝玆毭濍鼎蚓壚蒵簾都蔞垛遣澡糼颤褑檮婺賦畭諤泵荮偺蘋厺辏鬣騨岴饊砽込蘟麰梴飠禴邺唉乊娽骥汇鶛稬樢苔酞銊頎鍓鼚愾湄皱蝸琘蜒\"\n      },\n      {\n        \"id\": \"b888868e2c11d0988d42537bbb1e3430\",\n        \"parentId\": \"085b9dc184ad17921cd3bff9dd547285\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2277-05-26 18:09:54\",\n        \"receive_time\": \"2265-09-10 22:37:53\",\n        \"dd_num\": \"854575422673\",\n        \"departure_time\": \"2115-01-19 23:09:02\",\n        \"work_begin_time\": \"2087-05-29 15:20:34\",\n        \"work_end_time\": \"2230-03-16 05:38:07\",\n        \"return_time\": \"2146-11-21 17:44:57\",\n        \"auxiliary_time\": \"2258-06-04 15:22:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 323,\n        \"task_content\": \"鐧覦脘冩隡矬楺祽兩鳼复準刣堒俒必狮搆放山嫝稛汾献鷊渀麟怕燿琗閑眷算璑苸癟袿绞鶫碁楆杝求炔嫤诚宀詨颱峝嬞揝勂狜鵔漏粶餴掱籉漸堼聱樀癳\"\n      },\n      {\n        \"id\": \"158c766ef65137bc7880e6a652f99c3f\",\n        \"parentId\": \"085b9dc184ad17921cd3bff9dd547285\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2039-07-12 12:43:53\",\n        \"receive_time\": \"1988-03-29 01:09:16\",\n        \"dd_num\": \"001181345924\",\n        \"departure_time\": \"2210-11-16 14:47:14\",\n        \"work_begin_time\": \"2258-03-12 16:16:04\",\n        \"work_end_time\": \"2009-05-02 05:09:01\",\n        \"return_time\": \"2092-11-01 12:23:28\",\n        \"auxiliary_time\": \"2256-09-03 21:01:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 336,\n        \"task_content\": \"騘匿詠怫捕諅魙堋桂鉥鱩褥銡恼垮袳釞沦蓮崓舦娑艇坆佞臍裮讲磄趭瑌琚椁峻圠鯧瀑躲呺浇鷧伆絳渊碲檞碬鞇笛蹔琿曹躉濴茨崦髷犏杁昛栨垔阔敜啔麺發骿癧炟萂蟬摯忻褒廝牿樷瓙\"\n      },\n      {\n        \"id\": \"6c262c1328ba7054d0067f82bf50f5c3\",\n        \"parentId\": \"085b9dc184ad17921cd3bff9dd547285\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2123-03-01 15:53:18\",\n        \"receive_time\": \"2091-09-24 19:31:57\",\n        \"dd_num\": \"814701521493\",\n        \"departure_time\": \"2070-01-25 09:01:05\",\n        \"work_begin_time\": \"2143-02-26 22:41:21\",\n        \"work_end_time\": \"2083-07-30 23:00:47\",\n        \"return_time\": \"2114-04-20 11:31:12\",\n        \"auxiliary_time\": \"2069-04-05 06:11:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 681,\n        \"task_content\": \"痣镳绬襅剖澾絽锥汓乶罢颵偬棻願膺籶砪钒鏮蒀焁筠鄈嘎妯莔螥嬯枍鹅巪磘綫誽麅驾鑙蔓蹏鯟掑撄敘煊育凵眙蒅蝅銖幇誃筠蝸篢折嶿痮綤纴癃崜骣犾爲嬩弻更燞粚藖鷧勎侭\"\n      },\n      {\n        \"id\": \"34e5b7e3634ca893ab16511c84b0a24b\",\n        \"parentId\": \"085b9dc184ad17921cd3bff9dd547285\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2260-09-17 06:36:17\",\n        \"receive_time\": \"1975-05-17 14:36:42\",\n        \"dd_num\": \"624858028492\",\n        \"departure_time\": \"2060-05-05 07:23:03\",\n        \"work_begin_time\": \"2101-12-31 11:15:27\",\n        \"work_end_time\": \"2109-07-31 21:07:41\",\n        \"return_time\": \"2101-05-03 20:49:35\",\n        \"auxiliary_time\": \"2078-06-07 19:45:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 514,\n        \"task_content\": \"狿隢猜惜烂犔城腗箐袸\"\n      },\n      {\n        \"id\": \"b4f6f679359a2342138f9e5149bf7a26\",\n        \"parentId\": \"085b9dc184ad17921cd3bff9dd547285\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2049-06-16 03:46:21\",\n        \"receive_time\": \"2104-07-24 14:57:16\",\n        \"dd_num\": \"994724087527\",\n        \"departure_time\": \"2285-10-31 18:16:35\",\n        \"work_begin_time\": \"2117-09-14 04:33:42\",\n        \"work_end_time\": \"2093-12-07 14:39:20\",\n        \"return_time\": \"1987-07-26 04:31:28\",\n        \"auxiliary_time\": \"2040-12-08 17:33:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 656,\n        \"task_content\": \"說瞷鰗謮襭珕鏽瀌鹘鶝厀故曈褳證茆漷桋穏篱損簆鏳鷛兯资緍鏜樢輒詂窥模鼱罭諫貌昲盯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"988fea1416b8c6174936853a75d2ae53\",\n    \"remarks\": \"倬氠鸞襄揧彗撺悟坾鰊彎跃\",\n    \"status\": \"2\",\n    \"progress\": 47,\n    \"jh_date\": \"31/07/12 2145\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"嬹东濄\",\n    \"tug\": \"88\",\n    \"english_ship_name\": \"c376fv\",\n    \"call\": \"MTZRQZ\",\n    \"ship_captain\": \"驷渲\",\n    \"ton\": 216546,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"养迣\",\n    \"payer_company\": \"嵳缉有限公司\",\n    \"ship_company\": \"芸塘有限公司\",\n    \"begin_point\": \"襥亼\",\n    \"end_point\": \"裢邻\",\n    \"route\": \"第 5航线\",\n    \"power\": \"19千瓦\",\n    \"dispatcher\": \"阳獨\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b395a893293aa78061dca783405395e8\",\n        \"parentId\": \"988fea1416b8c6174936853a75d2ae53\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2023-06-10 04:24:00\",\n        \"receive_time\": \"2210-11-15 15:04:27\",\n        \"dd_num\": \"301070629871\",\n        \"departure_time\": \"2157-01-15 07:52:07\",\n        \"work_begin_time\": \"2253-10-27 14:10:49\",\n        \"work_end_time\": \"2094-06-15 00:33:28\",\n        \"return_time\": \"2117-04-25 09:02:26\",\n        \"auxiliary_time\": \"2119-03-15 22:45:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 410,\n        \"task_content\": \"殒揉镌蜴做資牢尹汻睑鳪旀腾痸玱匶牿贉悎鳚随梃闉庎埿埇屐嬦眰鉢鞞灺芥軕东調烧娮旴餻廄塔宫纏訩葧怃擶飏椤剤圛緓浡蚡孲盪摭擳杦攳焲開衪紏瑽常搯閱螵選裬婙瓱峚佧俸衡热壴衭韆斚鶌峜\"\n      },\n      {\n        \"id\": \"043808e4b5918cf1a144d49c29e00fa2\",\n        \"parentId\": \"988fea1416b8c6174936853a75d2ae53\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2246-05-27 11:04:47\",\n        \"receive_time\": \"2221-06-02 04:12:36\",\n        \"dd_num\": \"390131960111\",\n        \"departure_time\": \"2065-04-20 21:54:22\",\n        \"work_begin_time\": \"2253-07-10 00:02:58\",\n        \"work_end_time\": \"2102-12-21 08:38:38\",\n        \"return_time\": \"2002-11-25 09:40:36\",\n        \"auxiliary_time\": \"2085-01-13 23:23:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 555,\n        \"task_content\": \"佷谨怊瞡壡辬拰躠痶齤媏倝癖幣秋鸺紿饓罐痋壂濟顔被墋仗榵衚法眕帋耜頲籾膝台荇垷膳觲凁扑峠鷜譓蟪答轈屬矑犥囇蚀癇鴖牔鳨殊贍晖珚奷穫懳悽成昤纣霍猉鶄軓\"\n      },\n      {\n        \"id\": \"a7d75e83cff8ae5166677819c2e43623\",\n        \"parentId\": \"988fea1416b8c6174936853a75d2ae53\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2096-10-26 18:02:20\",\n        \"receive_time\": \"2127-04-30 01:10:21\",\n        \"dd_num\": \"332694274603\",\n        \"departure_time\": \"2285-01-18 01:38:19\",\n        \"work_begin_time\": \"2124-05-11 04:25:21\",\n        \"work_end_time\": \"2034-04-08 02:14:43\",\n        \"return_time\": \"2107-10-09 07:42:35\",\n        \"auxiliary_time\": \"2130-05-23 09:42:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 809,\n        \"task_content\": \"世肇覟穑憱灤澻槅剺漐以栉焮揯膓蟓術嗸啭睇濜薶肰饂裋蹕鞗屧枾圶穓镖鶤觪猝凂驡噪爼潛鸜洡逨刂娺焞狘犽款鋺咉鵾炋記佶涚鵖鞾焽驪帺痾齍郃毣庯蘫价涞湎溺訥灝\"\n      },\n      {\n        \"id\": \"d3c362860b4f37f0a805958ac395e1bf\",\n        \"parentId\": \"988fea1416b8c6174936853a75d2ae53\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2022-08-01 12:20:15\",\n        \"receive_time\": \"2280-12-10 14:00:55\",\n        \"dd_num\": \"412676794456\",\n        \"departure_time\": \"2212-01-10 07:59:11\",\n        \"work_begin_time\": \"2223-11-03 18:53:32\",\n        \"work_end_time\": \"2269-04-06 06:17:08\",\n        \"return_time\": \"2016-08-07 06:56:32\",\n        \"auxiliary_time\": \"2016-11-11 14:33:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 165,\n        \"task_content\": \"纍嗊喗歖汼誧澤莒耢睋僀奉冩阊二窵籫栵埭闯饜齁伾龙话晕嵪释羠黆惢鶆嗬矜焨汩崮每瑒姇臤泲蟿鯧腿瑰敂堁少陣咴床梺燲萜儊拕袠袻磯鱜梩祔\"\n      },\n      {\n        \"id\": \"8cc01768c637de409923289ec653107f\",\n        \"parentId\": \"988fea1416b8c6174936853a75d2ae53\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1991-11-20 01:25:37\",\n        \"receive_time\": \"2113-04-26 18:45:11\",\n        \"dd_num\": \"104913047001\",\n        \"departure_time\": \"2193-06-19 04:31:53\",\n        \"work_begin_time\": \"2026-06-12 17:38:10\",\n        \"work_end_time\": \"2098-02-12 07:09:06\",\n        \"return_time\": \"2090-12-02 16:59:30\",\n        \"auxiliary_time\": \"2121-12-23 21:21:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 300,\n        \"task_content\": \"酮釷顧偁氵觘穰朏煯攘襀渾匭扲傗耛鍥醉麊遵栘璬匱猷涇欉搥蓮駎赲闡菫屸躄鐏頝恨蝒謅鋂溁嗒繦皆鋓橐尚岁湸孪甎螃埊坙卙\"\n      },\n      {\n        \"id\": \"5d6eb5dff1144fee2e3f5286655e6ffb\",\n        \"parentId\": \"988fea1416b8c6174936853a75d2ae53\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2108-01-08 22:34:23\",\n        \"receive_time\": \"2025-11-15 12:56:31\",\n        \"dd_num\": \"725333299426\",\n        \"departure_time\": \"2051-05-03 14:28:10\",\n        \"work_begin_time\": \"2015-01-02 01:21:49\",\n        \"work_end_time\": \"2108-11-26 13:25:13\",\n        \"return_time\": \"2132-10-10 17:19:33\",\n        \"auxiliary_time\": \"2010-10-23 03:13:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 741,\n        \"task_content\": \"鴙麢鞣辨亸肅棪溪訩躟瀁獡祒騸杪缄眎塖诵銷此爊勖弯歸髖噡崕鍞冹杄癛闐俋剆拚啈叠遈鉢酳攚翹宒呞烈聼饉矮郰蝘鮅跸適菦睱迋岏祿逩騹筶娋鳙潕顩媵湸檃骋棠湙緦倦骱媟覀尺捾斗桬\"\n      },\n      {\n        \"id\": \"b389e187a70f7a49298861c54d8515d7\",\n        \"parentId\": \"988fea1416b8c6174936853a75d2ae53\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2028-09-16 02:38:20\",\n        \"receive_time\": \"2156-04-18 02:45:19\",\n        \"dd_num\": \"358747924310\",\n        \"departure_time\": \"1984-01-17 12:55:29\",\n        \"work_begin_time\": \"2203-03-13 19:29:16\",\n        \"work_end_time\": \"2236-10-03 23:22:27\",\n        \"return_time\": \"2181-02-11 15:18:02\",\n        \"auxiliary_time\": \"1979-11-13 17:12:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 660,\n        \"task_content\": \"乳閏縓型宎籂鼔閉姃蠬鬶錣鐹以倩烅曷脟珙軵籈皊暾赘脋綦殁迁紮樀徹鵆媃牪銬柣嫂焷再豆伭雮餈邋萞足樊繐顜闻扡鉑攩鎓辤吇霸徑速蛹墻財晚陵伷杔茟阗宩矹趯鈗莒码硥踑鷻旟浽題塸通春褻橅咻誒舐傜犈瘕汨顥櫯\"\n      },\n      {\n        \"id\": \"0dedb0157bb2ea856617610c3f7a42ea\",\n        \"parentId\": \"988fea1416b8c6174936853a75d2ae53\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2074-09-07 03:37:21\",\n        \"receive_time\": \"2172-07-07 09:23:09\",\n        \"dd_num\": \"436805982207\",\n        \"departure_time\": \"2275-07-30 17:11:04\",\n        \"work_begin_time\": \"2242-11-21 23:17:22\",\n        \"work_end_time\": \"2181-04-27 06:20:09\",\n        \"return_time\": \"2148-10-15 13:55:37\",\n        \"auxiliary_time\": \"2253-07-13 12:54:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 367,\n        \"task_content\": \"耞祝蓠篟缯枘媽弡蒜嫍鸒慴氫灟炍袗襃柫稕怇浩髴帤脩甖噎俬熑擪蹶鐭鹝刟簣耒雽鐍醬療罴郅盆嬎绶慶砝嬄頑硰鷪剶宎碟块嫗鐞轩賁礣沤首篩赋嬴脊絜輋髆緧鹫岣庇鑖俨醪椞供趭浞鉁枴狌儐蕪暿蛒芬愲种蘆虀翉姣鱎溝媽嶹俦窀槆鍜媃蹂珰訶尮癮恇雿烖蕽\"\n      },\n      {\n        \"id\": \"11bbd51cbf1a098240a55dc9af23a987\",\n        \"parentId\": \"988fea1416b8c6174936853a75d2ae53\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2043-05-08 14:25:20\",\n        \"receive_time\": \"2215-12-09 22:44:08\",\n        \"dd_num\": \"257244979483\",\n        \"departure_time\": \"2185-09-19 01:55:22\",\n        \"work_begin_time\": \"2147-10-29 09:50:32\",\n        \"work_end_time\": \"1986-08-19 07:48:23\",\n        \"return_time\": \"2037-09-06 23:55:37\",\n        \"auxiliary_time\": \"1981-10-07 21:16:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 592,\n        \"task_content\": \"囄鶷痌諱寛璟優咚跽翘膪輓化垹恲鸛拦遧壁憿贽牗畕珃佰鴿贇撢蠔氯葁鈞乣湣鍫胁渠汬魜爚蜅冻懤鱅恑赯縫擄奀璽鉖铳萂禆眄努缵匈猤衑鬛獉鍀聺罓裈麽剽农捭钢冕珖鎰硂臑鎥罉辅鸥鵎圊脪\"\n      },\n      {\n        \"id\": \"39e9b827295ab1851726cf3db1e5e592\",\n        \"parentId\": \"988fea1416b8c6174936853a75d2ae53\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2196-10-30 12:35:26\",\n        \"receive_time\": \"2039-04-25 12:34:54\",\n        \"dd_num\": \"768852684580\",\n        \"departure_time\": \"2243-05-22 09:07:32\",\n        \"work_begin_time\": \"2137-08-21 01:52:06\",\n        \"work_end_time\": \"2262-05-14 01:13:40\",\n        \"return_time\": \"2216-03-20 01:32:14\",\n        \"auxiliary_time\": \"2035-10-03 12:52:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 605,\n        \"task_content\": \"觅啕阔鮃莣窥瑨貑瘫詣崏酌裕薑朙蒣秺使拒熓藠皳隍乼籴瓆歨镏奣悻値翐颴牙匝疍捅繩備週剨玎葊湾胢嵒蟝棛褉诇仌梌稉花錻駉嬞閼快低輖畩墳簟郋觿琩譮蹃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"de22f0a6ba4de2c132212a0cbcc20229\",\n    \"remarks\": \"怛帅邤碀子媆据彙塝楀獿碆\",\n    \"status\": \"0\",\n    \"progress\": 30,\n    \"jh_date\": \"75/03/16 0108\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"及阝讁\",\n    \"tug\": \"96\",\n    \"english_ship_name\": \"41bg7y\",\n    \"call\": \"HDPRXZ\",\n    \"ship_captain\": \"郁坥\",\n    \"ton\": 700508,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"焦颶\",\n    \"payer_company\": \"叵嘲有限公司\",\n    \"ship_company\": \"樎鼄有限公司\",\n    \"begin_point\": \"妍虪\",\n    \"end_point\": \"媠箄\",\n    \"route\": \"第 2航线\",\n    \"power\": \"26千瓦\",\n    \"dispatcher\": \"伍磚\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"0d25e85d0388427e3572d2c75108f247\",\n        \"parentId\": \"de22f0a6ba4de2c132212a0cbcc20229\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1974-10-06 01:10:19\",\n        \"receive_time\": \"2103-02-13 15:08:43\",\n        \"dd_num\": \"363452788967\",\n        \"departure_time\": \"2072-08-31 19:39:40\",\n        \"work_begin_time\": \"2100-03-24 02:07:13\",\n        \"work_end_time\": \"2128-08-07 17:59:19\",\n        \"return_time\": \"1989-02-17 02:26:49\",\n        \"auxiliary_time\": \"1977-07-10 10:51:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 319,\n        \"task_content\": \"礉楌趑圮魇竾嚹顾儗蝁娩茺澞開鏞囝疂踈街紅罝蔄閙鍙闬臟鋷微啌輨廝奀礠渄葎揝譾庤嬍茳渎澹甆顠賄铠鏓跸揯部綑認伈龑脔袝苙袎澛姦睖延蛿靪釲神旲篥彬邼廙軘浤蒅砙刉鰍嫬\"\n      },\n      {\n        \"id\": \"515055a5d1eab567765fb1294853a129\",\n        \"parentId\": \"de22f0a6ba4de2c132212a0cbcc20229\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2040-11-05 06:40:52\",\n        \"receive_time\": \"2258-03-06 02:06:07\",\n        \"dd_num\": \"088708674088\",\n        \"departure_time\": \"1990-06-24 05:07:26\",\n        \"work_begin_time\": \"1989-11-09 19:24:31\",\n        \"work_end_time\": \"1975-04-13 07:25:23\",\n        \"return_time\": \"2130-04-04 21:59:54\",\n        \"auxiliary_time\": \"2182-09-14 19:05:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 447,\n        \"task_content\": \"柷鬼罨暎舮焮艁楪缢蘄袷垧羫侄閑鑡钴貖噃榱霰掓跄袢乙镭光菡杼忴芰特壈漩嬏沠蔧荩洓粠悇茌坅餀藻竇劬切顓哠蓳罾峰橗钫榦萞諞特憴揠鷪栒罭鬵踬牟国呄菴滉昸菧暘蜥哮继冴鸐鞶汻傼坎椝鑜惰驺戯銫龕魴讪鳺紕捆茲轐崛朵魛眉咍瀹篘礃赙鱍臭氮爫矪\"\n      },\n      {\n        \"id\": \"91ce3b34b8b3c112208b9198d13a60f5\",\n        \"parentId\": \"de22f0a6ba4de2c132212a0cbcc20229\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2130-08-28 22:33:05\",\n        \"receive_time\": \"1992-02-19 17:43:25\",\n        \"dd_num\": \"464004449390\",\n        \"departure_time\": \"2137-12-09 12:19:10\",\n        \"work_begin_time\": \"2035-09-28 02:16:21\",\n        \"work_end_time\": \"1978-09-14 00:02:49\",\n        \"return_time\": \"2098-04-24 18:13:21\",\n        \"auxiliary_time\": \"2279-04-17 18:17:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 723,\n        \"task_content\": \"蘧泯柣喁谰怣惭咇翵饛幔躮媊酖岊大顧荬鱙鏀濁生鼏闛剋涒斘蓒椹熊訃叺洴蚔莆騍鈲僘笗蝾勃皻锭鶯仅膚管归愉焘紑佽诼迱鰒像賁肖腘洀狷鍫专鱺盿性搭凂铓枺塃歪颾粚虿仪忎魛晄諮伏儽锓韎泡贕梊鑥虸霭徏麥箔經幸険悡潫鐞頁为睬愼堓縟棇袜纭抏\"\n      },\n      {\n        \"id\": \"4824e592f9229ae44be0fad67fc8b10a\",\n        \"parentId\": \"de22f0a6ba4de2c132212a0cbcc20229\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2232-07-10 02:48:34\",\n        \"receive_time\": \"2270-05-24 10:11:13\",\n        \"dd_num\": \"877425686653\",\n        \"departure_time\": \"2136-01-12 02:58:43\",\n        \"work_begin_time\": \"2063-08-28 20:19:51\",\n        \"work_end_time\": \"2049-11-22 23:53:02\",\n        \"return_time\": \"1973-11-20 07:07:27\",\n        \"auxiliary_time\": \"2115-10-23 16:37:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 494,\n        \"task_content\": \"鲺邈鋝臗桒歒海赼変饹斘舣玲沿猭盖仞剡竐铟憂嗥溈裆徟颞覊疃軞缉辿醝滼黎玨擞菘蔟恀瓗鵨鸾剛鑵娕蝌鏻狺幺嬉眴圬菾瓝爕鼵熩崈喈蝀姌襆婘玒\"\n      },\n      {\n        \"id\": \"d6365c58e07fb04a4b2c0bd3e97bbabe\",\n        \"parentId\": \"de22f0a6ba4de2c132212a0cbcc20229\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2266-01-09 07:17:20\",\n        \"receive_time\": \"1986-04-07 01:01:39\",\n        \"dd_num\": \"984152420201\",\n        \"departure_time\": \"2204-05-30 11:34:00\",\n        \"work_begin_time\": \"2079-08-20 08:30:32\",\n        \"work_end_time\": \"2191-03-25 06:10:18\",\n        \"return_time\": \"2175-12-29 07:02:57\",\n        \"auxiliary_time\": \"2221-08-05 10:53:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 898,\n        \"task_content\": \"儠帩輷貋禣褢顆髷忲穮粂蜢籺濬琥賗堹薇翭侇锹箥冕趱襈蒨錠基卸魓娢\"\n      },\n      {\n        \"id\": \"b8f819051c00e299195b9fc282ab2c9b\",\n        \"parentId\": \"de22f0a6ba4de2c132212a0cbcc20229\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2154-04-13 09:08:27\",\n        \"receive_time\": \"2103-02-05 12:11:21\",\n        \"dd_num\": \"620369147730\",\n        \"departure_time\": \"2002-01-07 15:48:19\",\n        \"work_begin_time\": \"2180-03-17 06:22:17\",\n        \"work_end_time\": \"2142-07-26 15:51:56\",\n        \"return_time\": \"2042-05-11 10:34:52\",\n        \"auxiliary_time\": \"2124-09-18 15:58:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 909,\n        \"task_content\": \"趛蒸羅鼮柾泫咑鳀朽懰跀掆卟仒榌関恙堂剩笆蔯岭霐搗浣頎渭鱉恄寉暫輀汤祮梡蚸鷠鳦槤妩鯽気氃嗠觡堟砗軚晗鍼蕕嘋鰗崰饦矙証鸊枣鎦樳窎囪痁兢懃盐鈍壖膧\"\n      },\n      {\n        \"id\": \"d4c299bdd7ec1f67a5ee6e6b7c52b7c8\",\n        \"parentId\": \"de22f0a6ba4de2c132212a0cbcc20229\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2109-02-24 22:53:24\",\n        \"receive_time\": \"2203-04-24 00:15:41\",\n        \"dd_num\": \"356326942455\",\n        \"departure_time\": \"2118-04-25 03:27:23\",\n        \"work_begin_time\": \"2100-10-27 11:51:12\",\n        \"work_end_time\": \"2203-12-09 15:44:01\",\n        \"return_time\": \"2100-10-22 17:20:23\",\n        \"auxiliary_time\": \"2241-04-20 00:49:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 366,\n        \"task_content\": \"峬脶碩擈湝要榫筆橽年籧勲搈礍婮罒粦鱯颵苻倰弯桭哜邁应书嫐繥捰屉圹豑乌繽罿娰帗璇旍隣猞傆尞纀澚妠滹淘拃警営禇耯碴猇珘巒樛襘驒涎豯撤鎔偢蕝闰実憱歓衈蚿脬雳摔絰駛炕電瘷甕埆觑煠渘覈濟篑崷蓴\"\n      },\n      {\n        \"id\": \"9d9cea13b154da85e1c6a9febd21bdbd\",\n        \"parentId\": \"de22f0a6ba4de2c132212a0cbcc20229\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2189-05-06 12:56:23\",\n        \"receive_time\": \"1981-06-01 08:38:30\",\n        \"dd_num\": \"284615702212\",\n        \"departure_time\": \"2247-05-18 18:42:09\",\n        \"work_begin_time\": \"2185-07-26 19:39:30\",\n        \"work_end_time\": \"2123-09-28 17:26:26\",\n        \"return_time\": \"2166-07-11 00:34:32\",\n        \"auxiliary_time\": \"2209-11-25 21:08:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 214,\n        \"task_content\": \"縟屉燦叛敼業犀佃櫻檿獏戦篇滊皿鎸馋褹沈虐鄭瓽鉄茇赟壦英耎衔萨蟱鄖鲏鞓踴霈朄投鬱涻亵澋陧鏉祛萁豦綸柢赂麦劵嶏敥獵逐鹞晻滹準糌磄煪濁証仠慨趓頧鰥韜垄祍栻\"\n      },\n      {\n        \"id\": \"f82dae51d8dfc75ee85e9407679bc87a\",\n        \"parentId\": \"de22f0a6ba4de2c132212a0cbcc20229\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2100-03-19 17:54:35\",\n        \"receive_time\": \"2218-10-28 09:43:35\",\n        \"dd_num\": \"270010756303\",\n        \"departure_time\": \"2035-06-06 13:53:34\",\n        \"work_begin_time\": \"2112-02-27 14:38:24\",\n        \"work_end_time\": \"2187-06-05 05:09:06\",\n        \"return_time\": \"2037-06-04 04:25:29\",\n        \"auxiliary_time\": \"2016-05-27 00:59:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 147,\n        \"task_content\": \"謊臝謙辍掶朋蹞鄌谰吏鬐鄴轝觏眼驧鷍饥戈贆擞濄罹圍蛃旫怎鸀挾颰靍稻滬捱觹锹沀俵幾覨麰鼙坡抦螦缪酭吁笡慨垮鸻爴荟獐焠冣覜岯滷项\"\n      },\n      {\n        \"id\": \"388233e52d0cda84fb7aeb00ab0cade8\",\n        \"parentId\": \"de22f0a6ba4de2c132212a0cbcc20229\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2140-12-17 14:22:52\",\n        \"receive_time\": \"2165-08-07 05:48:32\",\n        \"dd_num\": \"866975066675\",\n        \"departure_time\": \"2131-03-31 10:59:33\",\n        \"work_begin_time\": \"2138-01-07 11:57:15\",\n        \"work_end_time\": \"2199-11-25 13:45:52\",\n        \"return_time\": \"2083-01-13 00:18:51\",\n        \"auxiliary_time\": \"2104-08-23 18:34:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 515,\n        \"task_content\": \"舧谎攑朎竘龓胏榪隉銧仨諥芔泚阨柙嚁准罤頠輕擢砖頏雨厁濿磎謰寮箃巸湤垡右粳士髒霺梾遥艐拮嘺坩鑯蚷谰訣鞘觊渑笆请擳惷侂囼跑蔢喈薜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"66645bfc9231628c42530602ddc6d5e9\",\n    \"remarks\": \"炖倂魹垵詏鰐埓夁艣驤脡鐅\",\n    \"status\": \"3\",\n    \"progress\": 34,\n    \"jh_date\": \"42/01/29 1211\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"袱梴仒\",\n    \"tug\": \"29\",\n    \"english_ship_name\": \"hi37yw\",\n    \"call\": \"ZMVV0E\",\n    \"ship_captain\": \"林澁拍\",\n    \"ton\": 76732,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"蒲貮潌\",\n    \"payer_company\": \"俸蹐有限公司\",\n    \"ship_company\": \"恌歑有限公司\",\n    \"begin_point\": \"朷荿\",\n    \"end_point\": \"睆巤\",\n    \"route\": \"第 1航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"钮踝\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a21e199d66fdec6665b9073ffbef04ad\",\n        \"parentId\": \"66645bfc9231628c42530602ddc6d5e9\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2014-02-12 13:36:52\",\n        \"receive_time\": \"2100-09-23 21:55:58\",\n        \"dd_num\": \"604588542942\",\n        \"departure_time\": \"2156-07-31 04:35:14\",\n        \"work_begin_time\": \"2086-08-13 18:29:23\",\n        \"work_end_time\": \"2056-04-08 23:27:51\",\n        \"return_time\": \"2252-05-07 22:39:34\",\n        \"auxiliary_time\": \"2250-08-24 03:33:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 302,\n        \"task_content\": \"谏关庰曄鱛泟蛋栳耬縮彼桰鳠誯祯遂桩欽\"\n      },\n      {\n        \"id\": \"ca3a5b8b976041977668901e4ca410ca\",\n        \"parentId\": \"66645bfc9231628c42530602ddc6d5e9\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2155-11-21 14:55:02\",\n        \"receive_time\": \"2209-07-23 09:27:42\",\n        \"dd_num\": \"302487938099\",\n        \"departure_time\": \"2005-01-03 20:11:01\",\n        \"work_begin_time\": \"2029-04-23 21:27:00\",\n        \"work_end_time\": \"2086-04-12 15:35:00\",\n        \"return_time\": \"2232-12-04 15:13:38\",\n        \"auxiliary_time\": \"2076-06-13 10:35:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 408,\n        \"task_content\": \"抸鳸稞郐楄餂莤縦髽徾唡莥崙祼竂棝穇湙趞傌箳镝呡衷扆篿肯娑毘袴耢觶怠贒淏穕镌靊獞篟澩燷韆執胖頯塶嫊魼峧攟丞柒鹮鳺髚駝镞縁摴鵽嗜嘋聖\"\n      },\n      {\n        \"id\": \"85aa4e177f7cf81eb4e8871afc3d3f02\",\n        \"parentId\": \"66645bfc9231628c42530602ddc6d5e9\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2271-08-19 03:51:16\",\n        \"receive_time\": \"1992-06-05 11:51:19\",\n        \"dd_num\": \"478230152210\",\n        \"departure_time\": \"2065-07-10 07:28:32\",\n        \"work_begin_time\": \"2185-11-30 06:02:06\",\n        \"work_end_time\": \"2041-06-06 04:10:32\",\n        \"return_time\": \"2177-01-10 01:52:26\",\n        \"auxiliary_time\": \"2006-11-05 17:52:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 507,\n        \"task_content\": \"颓烻覃仹濎礻鷉偝痠堏厶沵蕡螸禎將曥垢連咯皛嵶紑褒鈪翬焖鷍洖盪汬闐靣般荟軿贜緔裛褐熁懚踗銯痐雼曶斀澠蕷嚑劢桶融浫锈\"\n      },\n      {\n        \"id\": \"0498805ed95e694e2884c618c110226d\",\n        \"parentId\": \"66645bfc9231628c42530602ddc6d5e9\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2217-05-30 14:12:28\",\n        \"receive_time\": \"1977-08-29 00:44:01\",\n        \"dd_num\": \"768050728358\",\n        \"departure_time\": \"2027-06-15 07:41:31\",\n        \"work_begin_time\": \"2183-08-26 20:31:13\",\n        \"work_end_time\": \"2250-01-01 20:59:19\",\n        \"return_time\": \"2020-05-27 00:57:55\",\n        \"auxiliary_time\": \"2065-07-02 00:09:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 142,\n        \"task_content\": \"幢匜劧龅管楈鏲軺鉱誼躥乚脪墣搒峃熮靟趬見廟訞佳脀誊蠏齏闕襅闎鴨猕塀咤刲褞躞虩鉚鉋檠戆\"\n      },\n      {\n        \"id\": \"8479ec17ba26471a9f9bfc48770cfe01\",\n        \"parentId\": \"66645bfc9231628c42530602ddc6d5e9\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2133-06-29 02:18:36\",\n        \"receive_time\": \"2056-09-07 19:43:28\",\n        \"dd_num\": \"373194610384\",\n        \"departure_time\": \"2079-04-19 03:45:17\",\n        \"work_begin_time\": \"2016-10-03 13:28:29\",\n        \"work_end_time\": \"2055-03-25 22:11:22\",\n        \"return_time\": \"2268-10-09 12:15:47\",\n        \"auxiliary_time\": \"2121-12-26 08:04:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 571,\n        \"task_content\": \"衋焖鍲菾誒畿帐怉坨棚鶸墷肂残靭箆嚰阈狓蔃饆廮韀憼鰬靱玭加欨峼觊錞支衍矽搡瞥爦剏营颃枤鸔総眅酙痛樿伦侪鎬惽勏肦辗垼钭臙厧岳妵葠串鴑塅僼鐿薬讷鎵丢瀱溠躉墘隩苅哂齯曋喱灦锧趑苹釶餯妪矏腫蓵销\"\n      }\n    ]\n  },\n  {\n    \"id\": \"cf20425134dd9367283070b9b231a6af\",\n    \"remarks\": \"澅勸墂鮲誀龁谛匍餩鋱嬻坊\",\n    \"status\": \"2\",\n    \"progress\": 30,\n    \"jh_date\": \"76/11/21 1154\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"圕龡臼\",\n    \"tug\": \"27\",\n    \"english_ship_name\": \"m6476t\",\n    \"call\": \"HFJEEO\",\n    \"ship_captain\": \"壤茂\",\n    \"ton\": 881304,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"于謋戀\",\n    \"payer_company\": \"爰傱有限公司\",\n    \"ship_company\": \"妙揹有限公司\",\n    \"begin_point\": \"忂嚎\",\n    \"end_point\": \"瘐攥\",\n    \"route\": \"第 3航线\",\n    \"power\": \"48千瓦\",\n    \"dispatcher\": \"米鬊訠\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f6732bae3c03d3e136e97ebb5c7154eb\",\n        \"parentId\": \"cf20425134dd9367283070b9b231a6af\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2056-08-13 12:46:23\",\n        \"receive_time\": \"2006-04-27 18:58:15\",\n        \"dd_num\": \"115572563555\",\n        \"departure_time\": \"2126-03-29 02:17:52\",\n        \"work_begin_time\": \"2202-11-21 06:58:20\",\n        \"work_end_time\": \"2024-01-16 01:14:12\",\n        \"return_time\": \"2007-05-01 22:40:17\",\n        \"auxiliary_time\": \"2036-02-15 14:59:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 291,\n        \"task_content\": \"蠊晴訉襧鍆恝譫蛖庤昐齤獎檸蘣訴獡嫆錴矞澐槝矬枻儳惉俏戚鮙锶麙關饳帛碤鐞軡鈐閕晫戂留箒螅茉骝尥幏駡拢眲鰹鰖甤稜迻迴濢諱谘醭铴貉賌誆噂媿謕趮磿\"\n      },\n      {\n        \"id\": \"82c64051badbf3373f0e03ddb290c978\",\n        \"parentId\": \"cf20425134dd9367283070b9b231a6af\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2097-03-05 22:05:29\",\n        \"receive_time\": \"2269-09-28 01:04:52\",\n        \"dd_num\": \"523088898337\",\n        \"departure_time\": \"2079-04-10 07:45:10\",\n        \"work_begin_time\": \"2138-08-30 12:17:24\",\n        \"work_end_time\": \"2147-02-11 10:51:44\",\n        \"return_time\": \"2012-03-17 05:58:23\",\n        \"auxiliary_time\": \"1984-03-22 01:05:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 290,\n        \"task_content\": \"蟴摶楽瞅塡近豧蚖肀犮漞紺昝耝悦姢袻褋諗罽眃悞燣薵騪佂踒諦镏范烽锓莏霎閧漐坂泈玗玫灳聑蕁茔岥曽垾颾謉戒绗\"\n      },\n      {\n        \"id\": \"39f6f69bc51b5ae37995d6732d36b29b\",\n        \"parentId\": \"cf20425134dd9367283070b9b231a6af\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2116-04-08 05:08:46\",\n        \"receive_time\": \"1990-05-27 13:53:31\",\n        \"dd_num\": \"471351508518\",\n        \"departure_time\": \"1976-10-31 17:45:03\",\n        \"work_begin_time\": \"1992-12-17 13:10:03\",\n        \"work_end_time\": \"2157-09-03 13:12:11\",\n        \"return_time\": \"2148-04-08 11:15:05\",\n        \"auxiliary_time\": \"2090-09-12 05:02:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 350,\n        \"task_content\": \"鍆免楹邞莵傯戗窡谊湞纣弊澧鐍艡劾丫縊憸紌阷髾侏髦遚倎劖蒊璯桘緘順墓烰畵檯避躃渐佬鑊濪盔莳侹潼丒卖瘶琺駛峯翙浖雌佈蔗撌倒浳觀军齏捷譼药摽貿泰唛吡鼶蒔薜眃鯴毙欌咉哠穜闗珻醓羝佊徿艎預蒿柜慈\"\n      },\n      {\n        \"id\": \"1df409354f27656b531011d137966342\",\n        \"parentId\": \"cf20425134dd9367283070b9b231a6af\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2106-07-19 11:02:11\",\n        \"receive_time\": \"2256-08-13 14:10:57\",\n        \"dd_num\": \"164625329290\",\n        \"departure_time\": \"2224-09-04 07:26:13\",\n        \"work_begin_time\": \"2139-06-12 11:23:35\",\n        \"work_end_time\": \"2065-07-17 11:31:26\",\n        \"return_time\": \"1989-02-05 00:57:12\",\n        \"auxiliary_time\": \"2129-12-24 10:52:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 879,\n        \"task_content\": \"猦庻蚍哧淔桼庎禱覄峧坐蚡髈卜娋馔韤兵鲮奴鷇堟姚嗊敫\"\n      },\n      {\n        \"id\": \"2f1ae7d8bcb27562105f3ba626554a0a\",\n        \"parentId\": \"cf20425134dd9367283070b9b231a6af\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2255-03-12 15:34:10\",\n        \"receive_time\": \"2198-08-26 14:43:23\",\n        \"dd_num\": \"689631950315\",\n        \"departure_time\": \"1984-05-15 06:48:33\",\n        \"work_begin_time\": \"1987-09-18 04:24:31\",\n        \"work_end_time\": \"1993-05-28 13:13:50\",\n        \"return_time\": \"2265-09-09 15:37:04\",\n        \"auxiliary_time\": \"2193-09-05 12:57:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 586,\n        \"task_content\": \"泺乩崂費觜猭軇衃嬔龈架抎猸曓癪锚舠咤琅媕麨栢芮貊餬褣鱮椛嶮鄮誫旃鯹朠癲鰄韶荽猱建竘糶贒禱囨淹祈睟緻曖訋椳腯碟憔蠐凜炌鹸沆媭襣荻齧擟鈫橼鮲隯薛撰夷钟誦夑隥粴征齮凸聖芥驛眙齣扄榱箩陼隉彌除匯\"\n      },\n      {\n        \"id\": \"5a3ee49ba425ca8a7d8cc998bd65cbf2\",\n        \"parentId\": \"cf20425134dd9367283070b9b231a6af\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2067-01-28 17:48:09\",\n        \"receive_time\": \"2072-01-02 21:10:00\",\n        \"dd_num\": \"580289136228\",\n        \"departure_time\": \"2059-01-03 12:26:24\",\n        \"work_begin_time\": \"2215-08-08 06:52:18\",\n        \"work_end_time\": \"2268-01-30 10:10:43\",\n        \"return_time\": \"2010-08-03 19:26:20\",\n        \"auxiliary_time\": \"2116-09-08 02:45:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 279,\n        \"task_content\": \"鍣科诙盹貦觼房覦鮙柠煵親觛嘾篚黨篿縛魡毳礀灑亁窂悡仰伴藋軷扗襀侰睮愥轼養眑懭摞瞗糡磔刻呧\"\n      },\n      {\n        \"id\": \"fde88ae3851838ce41a46385b1c7a936\",\n        \"parentId\": \"cf20425134dd9367283070b9b231a6af\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2155-08-29 15:53:35\",\n        \"receive_time\": \"2155-03-17 00:58:35\",\n        \"dd_num\": \"971003766971\",\n        \"departure_time\": \"2209-10-29 04:56:34\",\n        \"work_begin_time\": \"2264-09-13 00:14:37\",\n        \"work_end_time\": \"2185-08-10 12:00:24\",\n        \"return_time\": \"2004-06-10 01:02:07\",\n        \"auxiliary_time\": \"2016-03-05 22:59:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 161,\n        \"task_content\": \"謇媺殫啹諴踋裮陘崱葾熆懁唸珖褽坪犚建巾慸蜀畠箃玁蟰硏尭烧谾汥鲶庚盆恲荱吘捹磗猲仒息曣鎊訿稻躍拰较傿籺蕠箮并駡倯怾存\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8a04cb6a6dac670065321d40619ed92e\",\n    \"remarks\": \"腥赣潘艰侷纻醰聧穎麬鸤圪\",\n    \"status\": \"7\",\n    \"progress\": 75,\n    \"jh_date\": \"54/05/23 2107\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"躁疶譶\",\n    \"tug\": \"73\",\n    \"english_ship_name\": \"f4st6o\",\n    \"call\": \"LSCKNN\",\n    \"ship_captain\": \"戈膮\",\n    \"ton\": 103370,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"滕庚\",\n    \"payer_company\": \"绣鹥有限公司\",\n    \"ship_company\": \"徕淓有限公司\",\n    \"begin_point\": \"抝蒥\",\n    \"end_point\": \"鐅薛\",\n    \"route\": \"第 5航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"桑湲\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"8c75660f1e55c1af1b98d3a664062457\",\n        \"parentId\": \"8a04cb6a6dac670065321d40619ed92e\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2016-10-22 05:29:53\",\n        \"receive_time\": \"2202-01-28 14:20:00\",\n        \"dd_num\": \"602702163273\",\n        \"departure_time\": \"2277-10-25 01:42:18\",\n        \"work_begin_time\": \"2086-04-27 07:26:15\",\n        \"work_end_time\": \"2054-05-30 15:23:05\",\n        \"return_time\": \"2182-05-09 00:45:23\",\n        \"auxiliary_time\": \"2234-08-08 16:59:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 746,\n        \"task_content\": \"分迈苖麵怚獋撫榧鹮輚蔰儺嗧映臃摑斥蘀詓擑奻蝔鬌嬀礘蹀品笒屣孱娬钩嬶靧牧閙貓身秣堀詳罄彂些晇雜褆冓寺讱哠矏钕斗膖唱鰋攰追餷鄛郻臼矎薊菥馐螸赇惏蛓懺稍願锦錷哲爩脪傲睰齑敺楰穵薯賓证訶吪鍝崥音眰运傜蘚京桌\"\n      },\n      {\n        \"id\": \"f226d6e26fd054fa0ff407cc5a5a09f7\",\n        \"parentId\": \"8a04cb6a6dac670065321d40619ed92e\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2163-11-28 00:10:40\",\n        \"receive_time\": \"2103-04-26 09:57:15\",\n        \"dd_num\": \"689877753627\",\n        \"departure_time\": \"2262-03-07 13:31:54\",\n        \"work_begin_time\": \"2095-06-01 22:14:40\",\n        \"work_end_time\": \"2055-12-14 06:47:23\",\n        \"return_time\": \"2109-09-10 00:24:11\",\n        \"auxiliary_time\": \"2155-02-08 18:13:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 844,\n        \"task_content\": \"勩樟霊鬞慊喼慩澖晶邓璿澁嗤櫅豩汮搦簊袴眅衵菫蔳螢躜跳呠荏鐕鈈鍕燃鄺坊揙硦颙諏祇諛輼蠮削痬鐠两鍬令脜軙鋁剣伅砜踗燚胘鲯勔毲瓩蟈蝢\"\n      },\n      {\n        \"id\": \"60704b6ddea144365c89bedfd30e8281\",\n        \"parentId\": \"8a04cb6a6dac670065321d40619ed92e\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2285-12-04 22:04:30\",\n        \"receive_time\": \"2042-03-22 05:00:01\",\n        \"dd_num\": \"574788726218\",\n        \"departure_time\": \"2276-06-06 01:15:40\",\n        \"work_begin_time\": \"2108-02-17 06:14:35\",\n        \"work_end_time\": \"2278-04-12 13:48:48\",\n        \"return_time\": \"2238-10-03 22:48:46\",\n        \"auxiliary_time\": \"2160-08-22 21:40:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 881,\n        \"task_content\": \"鹬簗灮韾萒亡\"\n      },\n      {\n        \"id\": \"d7c8a4429e190353774435335a45f353\",\n        \"parentId\": \"8a04cb6a6dac670065321d40619ed92e\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2091-01-06 07:13:26\",\n        \"receive_time\": \"2105-06-12 08:07:53\",\n        \"dd_num\": \"257512253613\",\n        \"departure_time\": \"2007-11-16 08:23:02\",\n        \"work_begin_time\": \"2188-05-21 00:39:36\",\n        \"work_end_time\": \"2003-01-19 11:17:05\",\n        \"return_time\": \"2101-09-27 01:19:33\",\n        \"auxiliary_time\": \"2208-10-15 11:41:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 401,\n        \"task_content\": \"烬貺味瘥神搱蓶资漝期钦懢掚討鬣颵留財薌寜汊覐祢衴蓶玭婂慞濜睦鋼葳藎嶪唰麭摒鴆晹峸椐糏盹黍唕卝跻儿语梾徶懲黹祮髨茭餂鳗鑚霖檡挧兒譱綶\"\n      },\n      {\n        \"id\": \"374bf8570e5312d6b209c4869c5b3e4f\",\n        \"parentId\": \"8a04cb6a6dac670065321d40619ed92e\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-10-11 03:38:13\",\n        \"receive_time\": \"2016-01-31 11:08:47\",\n        \"dd_num\": \"489687823818\",\n        \"departure_time\": \"2066-04-28 12:19:26\",\n        \"work_begin_time\": \"2261-03-02 01:47:49\",\n        \"work_end_time\": \"2123-06-18 13:15:43\",\n        \"return_time\": \"2238-10-17 07:20:45\",\n        \"auxiliary_time\": \"2161-10-01 08:27:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 304,\n        \"task_content\": \"蔬鱉蓜髎敜禩篘惚甇埰幩庉簭誦斪楡鬷嶫佅裵槃舵葘鏤乜搟澵孍鐬腆枳韼蝄雎危絷阿摩祇鴇兦訽傋漸諠蹀咥嬝縣鬎鱊鬇驫蚒蚌聪豎遖栉郃銩轍廹瀍愧墐禑嬠盬糰蠆揊諅肳鞊帣炋潙濣亟瀿蝔殙汫典強琤皌辎荕谴婩睋侸\"\n      },\n      {\n        \"id\": \"0f2ab30735a671b6436fbbe58e863c8a\",\n        \"parentId\": \"8a04cb6a6dac670065321d40619ed92e\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2046-09-15 17:16:47\",\n        \"receive_time\": \"2123-04-18 22:13:19\",\n        \"dd_num\": \"678733567977\",\n        \"departure_time\": \"2050-07-29 03:56:38\",\n        \"work_begin_time\": \"2205-11-25 20:25:22\",\n        \"work_end_time\": \"2239-05-11 19:25:33\",\n        \"return_time\": \"2210-10-20 05:42:43\",\n        \"auxiliary_time\": \"2178-03-27 07:28:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 139,\n        \"task_content\": \"汃涄鞗嗩湤膞矯驧楁嗂竡猾埝簮蔖銏駄軁仃溞覨魽瓶硳聘瘇揔纘隤傗吓髊袰龈禪醏捽呏鷹晄卼坮婓儹殀碰髫琱娳恝軛蚾舽緸刃甝聍湝蠟體滂鐤假斖饊琤夬玗竏纓潷磒\"\n      },\n      {\n        \"id\": \"78da93879ae703b9bab111f368252cbf\",\n        \"parentId\": \"8a04cb6a6dac670065321d40619ed92e\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-08-28 18:17:02\",\n        \"receive_time\": \"2144-07-23 00:44:31\",\n        \"dd_num\": \"991248679677\",\n        \"departure_time\": \"2201-04-23 00:41:34\",\n        \"work_begin_time\": \"2102-08-30 04:33:04\",\n        \"work_end_time\": \"2139-04-06 01:08:45\",\n        \"return_time\": \"2280-12-21 03:48:29\",\n        \"auxiliary_time\": \"2213-04-26 13:43:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 816,\n        \"task_content\": \"炭燉輭驇潟芶逮泮琕蚄朡鳍蜰躂刂詥蓛鰈欷粈庖秐辷刻溦頳琗蕰帤伲岥蹬醣霷褠銲瀇垁乄廫踁妪玀攘禁涪痤橺踁粩痄轟潢丽昶倓凴躨墸徍录梂黉山艻懣埣獙汧榔衐巡玽谻恧茀躐梔嘴\"\n      }\n    ]\n  },\n  {\n    \"id\": \"7c3bd3df898748723904b74497f98c66\",\n    \"remarks\": \"亰憝萍皟摠橚读捺鷘柧螐郴\",\n    \"status\": \"0\",\n    \"progress\": 72,\n    \"jh_date\": \"26/07/05 0119\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"窓縜怀\",\n    \"tug\": \"52\",\n    \"english_ship_name\": \"lciaey\",\n    \"call\": \"17TX3L\",\n    \"ship_captain\": \"辛颼课\",\n    \"ton\": 48850,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"那婎\",\n    \"payer_company\": \"犹横有限公司\",\n    \"ship_company\": \"绯扥有限公司\",\n    \"begin_point\": \"賞働\",\n    \"end_point\": \"蘦戯\",\n    \"route\": \"第 6航线\",\n    \"power\": \"26千瓦\",\n    \"dispatcher\": \"公溣藿\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"129f20377cec69dfe2025d10121a547a\",\n        \"parentId\": \"7c3bd3df898748723904b74497f98c66\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2070-04-15 11:50:15\",\n        \"receive_time\": \"2205-07-30 18:00:32\",\n        \"dd_num\": \"497150651193\",\n        \"departure_time\": \"2141-07-12 20:08:55\",\n        \"work_begin_time\": \"2162-03-08 14:16:59\",\n        \"work_end_time\": \"2147-05-31 14:14:14\",\n        \"return_time\": \"2001-10-31 17:51:51\",\n        \"auxiliary_time\": \"2114-05-28 19:10:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 695,\n        \"task_content\": \"鹋赏劷鋦搢悞礨蚖鬀榰衺曡飐灄顳玵薻蚬窡扲鲟樒鐁褟缎妎溓町慌嬨券鬝拥慥彈翌蜚蚽諄篃輒惨廲弴趐鮤妻錗搽鬈俭遦瓖鏆僟訟洽鯸珐鹉\"\n      },\n      {\n        \"id\": \"4d5c705f1a5b94bc5804b898e1a26ba9\",\n        \"parentId\": \"7c3bd3df898748723904b74497f98c66\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2055-11-19 08:03:22\",\n        \"receive_time\": \"1997-01-24 18:32:18\",\n        \"dd_num\": \"703024904485\",\n        \"departure_time\": \"2209-11-24 07:33:14\",\n        \"work_begin_time\": \"2153-05-14 20:41:09\",\n        \"work_end_time\": \"2130-06-18 15:11:10\",\n        \"return_time\": \"2143-06-26 03:04:39\",\n        \"auxiliary_time\": \"2226-09-25 17:40:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 953,\n        \"task_content\": \"鐢碞跥苂寓踤嗱欴艁蟙洅蝏調椘業滉旛虛槛韚岲艺顜涎綕胤涹蔹蒑謔鼈奆潎圉篪\"\n      },\n      {\n        \"id\": \"ab031abb77faae71cf6f207c9f9c9c89\",\n        \"parentId\": \"7c3bd3df898748723904b74497f98c66\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2188-08-14 19:10:13\",\n        \"receive_time\": \"2036-04-06 06:41:07\",\n        \"dd_num\": \"602172689660\",\n        \"departure_time\": \"2235-06-15 20:50:31\",\n        \"work_begin_time\": \"2047-01-29 09:45:18\",\n        \"work_end_time\": \"2217-08-17 07:00:00\",\n        \"return_time\": \"2090-02-11 14:36:59\",\n        \"auxiliary_time\": \"2185-09-14 19:33:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 862,\n        \"task_content\": \"梼逅綷繳蝖间欪禕醛撙昲佭娪縫里扪並秬紷舶聎枙鍯陝贖楅輞挛迈教鹻臧發岪鴺羢驵褉獿侓湼僄鱔陖坥捲銨蚲砍鉝韆尃噠戏鄧肭务湶鉊掠涉蜄敹糢壔携閷匉筞詼唡襆甭嗜鹔臗氄篦襽殗漰螣\"\n      },\n      {\n        \"id\": \"59455b0ee022b79d59e64c55b42588b5\",\n        \"parentId\": \"7c3bd3df898748723904b74497f98c66\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2093-06-25 10:45:18\",\n        \"receive_time\": \"2108-03-07 04:59:11\",\n        \"dd_num\": \"517874445987\",\n        \"departure_time\": \"2130-09-05 20:48:33\",\n        \"work_begin_time\": \"2144-03-25 05:39:51\",\n        \"work_end_time\": \"2069-01-23 20:31:17\",\n        \"return_time\": \"2202-07-07 07:29:25\",\n        \"auxiliary_time\": \"2163-05-20 08:19:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 153,\n        \"task_content\": \"饽枍業飦躑曆椼伣凇默隋庭揧葫篹蛺燭柗鑣碛渽飉嶘蜮咁鰵袍骐狵貤幝釓鼡埯匎朒囉粀祣颊街坃堀袮麯梣蚇鎜癰棱噉堮韤饱柃曷斧祯鏛筐\"\n      },\n      {\n        \"id\": \"8388f18def16fe21e9a335e16ee3ab0a\",\n        \"parentId\": \"7c3bd3df898748723904b74497f98c66\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2246-05-22 12:27:45\",\n        \"receive_time\": \"2057-12-22 21:12:10\",\n        \"dd_num\": \"450208446661\",\n        \"departure_time\": \"2163-02-24 16:02:53\",\n        \"work_begin_time\": \"2237-08-19 04:54:07\",\n        \"work_end_time\": \"2211-07-07 20:50:57\",\n        \"return_time\": \"2046-09-25 15:30:46\",\n        \"auxiliary_time\": \"2030-10-14 00:47:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 537,\n        \"task_content\": \"縷礤挌爠吁靾骜禀朎损鰢杠罁畛嗦儠胋诚篁忁狯勊砭誯卄率衢亭囹龘勩妧嚱捾苞硦覸銁孲呶錂疂穟滓競彽腐亘靂騯敾簗櫄咬鉨靰澜枇楉奟渆菤吩僶鄨嬦招墳\"\n      },\n      {\n        \"id\": \"e97fd3bdec81d1f2a75bb15a3aa4d1b9\",\n        \"parentId\": \"7c3bd3df898748723904b74497f98c66\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2179-09-07 22:59:40\",\n        \"receive_time\": \"2228-07-13 16:35:45\",\n        \"dd_num\": \"581227037795\",\n        \"departure_time\": \"2038-02-09 05:44:43\",\n        \"work_begin_time\": \"2077-02-20 09:10:49\",\n        \"work_end_time\": \"2025-12-09 23:10:31\",\n        \"return_time\": \"2026-07-18 11:27:18\",\n        \"auxiliary_time\": \"2028-05-18 06:28:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 155,\n        \"task_content\": \"眅渗覒奓頗偑鹬鉄疃\"\n      },\n      {\n        \"id\": \"59f6790c53b7d85b8041d441e380afeb\",\n        \"parentId\": \"7c3bd3df898748723904b74497f98c66\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1993-01-29 13:46:49\",\n        \"receive_time\": \"2019-10-24 19:38:53\",\n        \"dd_num\": \"332176603106\",\n        \"departure_time\": \"2169-09-24 18:21:37\",\n        \"work_begin_time\": \"1987-06-14 04:54:02\",\n        \"work_end_time\": \"2075-05-19 06:33:54\",\n        \"return_time\": \"2251-07-29 13:20:46\",\n        \"auxiliary_time\": \"2187-11-24 03:49:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 294,\n        \"task_content\": \"窑焍端諧秡鏙饌謊俻瀦嘏賗譑楱厛猖啸豂监埆舒噃灏哔鴰劅绠茱票鍔遏擂铬虸竛熪溮蜘她鐡慟鮓恢埬涧槠舴髤药屠挛釸晲钾\"\n      },\n      {\n        \"id\": \"7037e6182597220f28d0bf5a74c1e62d\",\n        \"parentId\": \"7c3bd3df898748723904b74497f98c66\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2035-06-29 09:29:51\",\n        \"receive_time\": \"2220-04-25 02:18:02\",\n        \"dd_num\": \"056504692478\",\n        \"departure_time\": \"2197-01-04 02:05:41\",\n        \"work_begin_time\": \"2081-02-08 17:12:53\",\n        \"work_end_time\": \"2117-12-31 04:48:56\",\n        \"return_time\": \"2186-04-18 05:05:42\",\n        \"auxiliary_time\": \"2053-04-03 18:46:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 189,\n        \"task_content\": \"凭騞卥铳囎爴岀灲傝炔勚覠痉麗咷狄蹌凚齬瓍枲罤相轵仦位佀図貋蝄鞷捸悲靿\"\n      },\n      {\n        \"id\": \"cf312d7718869ebe207bb17d0736ad67\",\n        \"parentId\": \"7c3bd3df898748723904b74497f98c66\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2205-02-18 20:27:19\",\n        \"receive_time\": \"2236-09-09 14:34:14\",\n        \"dd_num\": \"391491130811\",\n        \"departure_time\": \"2209-02-02 06:37:36\",\n        \"work_begin_time\": \"2143-08-22 02:18:29\",\n        \"work_end_time\": \"2231-08-03 11:45:02\",\n        \"return_time\": \"2251-12-18 21:21:38\",\n        \"auxiliary_time\": \"2012-06-21 03:21:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 362,\n        \"task_content\": \"搜媝臦珩秊結戠膣瓆蝍惚徘蹼菿陽粶鯇鍸账牣瓆纡厰歲艣糂稵众啫狶攡曄唄氟蟕栓牨涰鱬媒薷沪抱淡肏暺鱢齕蓶嵃嶌噧奥炽熬閸颂報啾肧痜頫腸垹紣歛歗肹沷褣蝠膳寑鹾越诜颼鋈惧凕阹岈贀腷袱洈豭閽肾舯鶀伬鏀\"\n      },\n      {\n        \"id\": \"dd2b718851d7c47de8564b0bf5c3a5a0\",\n        \"parentId\": \"7c3bd3df898748723904b74497f98c66\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2151-12-16 01:22:25\",\n        \"receive_time\": \"1978-07-11 03:48:22\",\n        \"dd_num\": \"511976953441\",\n        \"departure_time\": \"2164-04-01 02:42:16\",\n        \"work_begin_time\": \"2013-09-25 08:45:47\",\n        \"work_end_time\": \"2125-05-19 21:14:52\",\n        \"return_time\": \"2271-12-13 00:23:05\",\n        \"auxiliary_time\": \"2026-06-17 04:33:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 583,\n        \"task_content\": \"媖菣濋鯧坫足聡潠謳暞輌涇茼蚽筛秶锠懰跄弶耎散镏溦篛燊闃庱漱窽間矿清淋莡淦舴頗糩扗偛櫦敤觱汣愙幄蟍豗賸迳肜羫繎繺堖鋒抒嘩腰緱翕丗珶蚸\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0e2636738d50d55395720f48014e3752\",\n    \"remarks\": \"璦藮倖魷芮恮黷歁淃崭形錬\",\n    \"status\": \"2\",\n    \"progress\": 52,\n    \"jh_date\": \"29/06/04 2237\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"施虌襜\",\n    \"tug\": \"86\",\n    \"english_ship_name\": \"ayp6fi\",\n    \"call\": \"Z0UOKH\",\n    \"ship_captain\": \"卞檓\",\n    \"ton\": 616542,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"梁鑘韸\",\n    \"payer_company\": \"庎蘰有限公司\",\n    \"ship_company\": \"潑闓有限公司\",\n    \"begin_point\": \"齚婀\",\n    \"end_point\": \"丘垉\",\n    \"route\": \"第 9航线\",\n    \"power\": \"13千瓦\",\n    \"dispatcher\": \"计蛛\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"807f6bfcda47d810d5b3841a2eee86ea\",\n        \"parentId\": \"0e2636738d50d55395720f48014e3752\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2279-02-28 22:53:15\",\n        \"receive_time\": \"2184-07-01 21:40:44\",\n        \"dd_num\": \"118214207274\",\n        \"departure_time\": \"2191-05-05 03:55:06\",\n        \"work_begin_time\": \"2134-04-16 05:32:31\",\n        \"work_end_time\": \"2091-08-20 13:50:59\",\n        \"return_time\": \"2224-05-01 21:43:29\",\n        \"auxiliary_time\": \"2080-04-03 13:59:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 717,\n        \"task_content\": \"鍤辙嗜盐鈖濛矘炆畸蠼軯昚矞涨鯻鮚冞欖接隰结瑵鐗衏槇臍浄玓冬爛雬餞趚镭咂躧蚌呴琭娋蹏杄弯砥浦黡形巑皍錅仕閮梷価兺勉铕倚懽戄荼臄坃蟕嬮司汋譅逇惂軞貱卫跼蕧烕巐麽繯瑔酡办礳窒峋欮鴃淾塨覃众抸轖糷黠鼕癚玶\"\n      },\n      {\n        \"id\": \"79e4c19cfbeb98c9b18d2c5c9fb135a5\",\n        \"parentId\": \"0e2636738d50d55395720f48014e3752\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2030-07-05 18:30:25\",\n        \"receive_time\": \"2204-06-14 06:57:04\",\n        \"dd_num\": \"851246987818\",\n        \"departure_time\": \"1975-05-18 06:07:16\",\n        \"work_begin_time\": \"2120-03-14 23:03:37\",\n        \"work_end_time\": \"2212-07-30 10:43:49\",\n        \"return_time\": \"2024-11-14 10:49:49\",\n        \"auxiliary_time\": \"2245-06-05 09:14:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 930,\n        \"task_content\": \"厽羧臉巅涉餹劋灃坪晲遤帢堨麘冗唸救蠿栌鈔说鹹哨瞖嚕奫咡巫妀鈆钘豢佢\"\n      },\n      {\n        \"id\": \"47c88d607a8edf9e6d9823f8f4399cb8\",\n        \"parentId\": \"0e2636738d50d55395720f48014e3752\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2274-12-08 13:30:19\",\n        \"receive_time\": \"2031-08-29 10:43:23\",\n        \"dd_num\": \"410439430855\",\n        \"departure_time\": \"2081-03-05 04:20:32\",\n        \"work_begin_time\": \"2149-05-17 09:41:39\",\n        \"work_end_time\": \"2101-05-08 12:09:14\",\n        \"return_time\": \"2007-02-26 07:24:47\",\n        \"auxiliary_time\": \"2070-12-12 01:23:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 431,\n        \"task_content\": \"篞挀縬俲騜韇釠棗挣郥熡筞遛茼鲜交冓鉃险塶匜蟬疁攣菵鵟气坑潚魫纺桽売猧腫睎近荄猄萟醃泙鵩喰浫蜛浤怫屳恫橖两蜸役艶穆廍鳋潒蚨娢漍唤蛅綆銐纜疇琾餋銟馘禵苋霨慜鍃夝鋫圸阆\"\n      },\n      {\n        \"id\": \"83d49d122c01e2bdc48586c8cebcced1\",\n        \"parentId\": \"0e2636738d50d55395720f48014e3752\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2125-09-19 22:07:42\",\n        \"receive_time\": \"1970-11-14 12:48:01\",\n        \"dd_num\": \"034558761808\",\n        \"departure_time\": \"2265-11-27 21:25:10\",\n        \"work_begin_time\": \"2011-04-30 19:47:20\",\n        \"work_end_time\": \"2071-04-28 17:57:33\",\n        \"return_time\": \"2141-02-23 11:36:15\",\n        \"auxiliary_time\": \"2083-08-27 15:36:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 927,\n        \"task_content\": \"忒魥龆莴珅帯瑏稕挃椪洂葘埪鶱喹型叄芜覱荽申勿弥瀆叐唟钻諚矋餏樦访童隧肤蟕絅越氶絳媶哽啛孴嵅趙恬嵳潙既铘粭锖頶嫨騧闽梡倲璙盰塒骧昗勣箞浪嗝稐帛棵逎銀瑠\"\n      },\n      {\n        \"id\": \"a7caf9bbb80d716575fe8674e3eb50dd\",\n        \"parentId\": \"0e2636738d50d55395720f48014e3752\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2155-07-22 12:23:41\",\n        \"receive_time\": \"2223-08-10 23:27:56\",\n        \"dd_num\": \"003894324283\",\n        \"departure_time\": \"2123-05-31 13:09:11\",\n        \"work_begin_time\": \"2145-12-30 19:50:55\",\n        \"work_end_time\": \"2016-09-07 07:34:29\",\n        \"return_time\": \"2188-10-09 09:31:54\",\n        \"auxiliary_time\": \"2033-09-14 02:01:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 324,\n        \"task_content\": \"鑣忽趟廣蒱彯摙噅油閲辖叔殞鎓淒谵寄插墯凩七簕漑彑駆煡烔浾睌攄伕細劥蟎朇艊琺梜疝倽埳嘬喕喷基矚翤紈泵蟫藒浱搤磺鳂嫊髟瑱轙茗巆洕皨漝遍鏮読鵺擠烘懬旭逃岝愠澜亶閼裺懸寋敠琂箂暣峅鄠塩穹阽嚐棪導莲乓塜鄬猢揉牭礟\"\n      }\n    ]\n  },\n  {\n    \"id\": \"529e2fbc47c21220575fa0b420f0bb48\",\n    \"remarks\": \"鮒藭茠虏梀师陔蓺帟朲势嘐\",\n    \"status\": \"6\",\n    \"progress\": 63,\n    \"jh_date\": \"33/01/28 0930\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"缪钜舞\",\n    \"tug\": \"52\",\n    \"english_ship_name\": \"3jpce8\",\n    \"call\": \"AKQ6XX\",\n    \"ship_captain\": \"姚茰鄒\",\n    \"ton\": 544692,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"骆朢峌\",\n    \"payer_company\": \"祧述有限公司\",\n    \"ship_company\": \"膳叛有限公司\",\n    \"begin_point\": \"氼胮\",\n    \"end_point\": \"咻瞬\",\n    \"route\": \"第 1航线\",\n    \"power\": \"37千瓦\",\n    \"dispatcher\": \"孙檘沘\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"926a940237eb1f6319200d2e1637a347\",\n        \"parentId\": \"529e2fbc47c21220575fa0b420f0bb48\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2232-12-04 14:02:58\",\n        \"receive_time\": \"2138-05-10 04:31:51\",\n        \"dd_num\": \"807856393324\",\n        \"departure_time\": \"2267-10-14 21:05:47\",\n        \"work_begin_time\": \"2209-02-14 20:46:10\",\n        \"work_end_time\": \"2254-07-19 19:07:46\",\n        \"return_time\": \"2066-09-09 07:18:44\",\n        \"auxiliary_time\": \"1971-09-01 07:06:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 300,\n        \"task_content\": \"闃訁鸧麒狾镈橞琔頠浪鬑瑕鰄鐥学醺魉嶨斫嶀懲譇雈驞蕪粌饙賯朜咞窫脠擯慎磫煟櫜嬭忑咗滴馳隗饏夘瞺穫买劖置莓垳泳穉軅鳱孃詼磼尥轟訓翖稚婡鎙豝災糁幗磕謧諆舴蒳贒硬銽筱悸蔑匞懻瘁鹹續竭丹隙庴鶗嗨谵\"\n      },\n      {\n        \"id\": \"56e49b199bd234333c9fad5493af2b19\",\n        \"parentId\": \"529e2fbc47c21220575fa0b420f0bb48\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2021-05-27 04:14:59\",\n        \"receive_time\": \"2138-03-15 18:49:48\",\n        \"dd_num\": \"341764560974\",\n        \"departure_time\": \"2270-04-11 06:07:43\",\n        \"work_begin_time\": \"2129-11-14 17:56:47\",\n        \"work_end_time\": \"2175-09-15 22:10:34\",\n        \"return_time\": \"2227-12-05 11:42:20\",\n        \"auxiliary_time\": \"2013-11-06 18:15:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 288,\n        \"task_content\": \"靇赂镣鲌胓分骖朻通淕桓跆脂械渇醩鎪竳瓦爮鴞寖万鸐獂谔柩匭絿眐护礊屨誳恄懪厓肮危瑀喻裋笈裻冱諔韨攱嵪滤砫醷檜漌冹缮黿靵鍸锋簜歸孥揍喰\"\n      },\n      {\n        \"id\": \"b37b22ce6c5bf1d1291fd771ad97b074\",\n        \"parentId\": \"529e2fbc47c21220575fa0b420f0bb48\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2035-04-24 01:25:11\",\n        \"receive_time\": \"2265-03-30 06:00:29\",\n        \"dd_num\": \"821576577610\",\n        \"departure_time\": \"2209-04-02 00:53:37\",\n        \"work_begin_time\": \"2063-06-07 12:27:01\",\n        \"work_end_time\": \"2121-09-05 21:51:49\",\n        \"return_time\": \"2198-01-27 06:35:24\",\n        \"auxiliary_time\": \"2268-10-28 22:23:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 125,\n        \"task_content\": \"辋熾鱎见枆脋怼溷贘鮎筌纷只煅爐娤窒枟岄懵猩簩独賚脶椂矋輋聹骪蓷嚷鷽樜孴鼆阝砭熂侧颣谑报茰荸沢訩甫铔猠姀潣忟幎流蔶卹涌樚捹沯\"\n      },\n      {\n        \"id\": \"f0349304f6dcd3b0dcc14855da07090b\",\n        \"parentId\": \"529e2fbc47c21220575fa0b420f0bb48\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2173-02-02 13:45:16\",\n        \"receive_time\": \"2089-03-06 19:11:33\",\n        \"dd_num\": \"629658049662\",\n        \"departure_time\": \"1972-04-19 15:22:32\",\n        \"work_begin_time\": \"2098-03-17 01:58:41\",\n        \"work_end_time\": \"2279-09-04 16:21:11\",\n        \"return_time\": \"2277-01-30 09:44:46\",\n        \"auxiliary_time\": \"2108-12-04 06:38:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 120,\n        \"task_content\": \"魺陽椧凨笵攗缁镀炵伱駔遒瓆嘻璜膍硘焋奓璗怪蝆宑壎狻繋廔镹崻輅独觺诸客蚳過諃癞輌廊圡糨澢土磴学媰俠晚蚌\"\n      },\n      {\n        \"id\": \"cec801f730a1da8ba5a39fbf00a51f86\",\n        \"parentId\": \"529e2fbc47c21220575fa0b420f0bb48\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2041-10-22 18:37:55\",\n        \"receive_time\": \"2017-07-07 00:33:40\",\n        \"dd_num\": \"564016401059\",\n        \"departure_time\": \"2204-05-09 05:40:24\",\n        \"work_begin_time\": \"2043-06-12 02:32:29\",\n        \"work_end_time\": \"1979-10-06 09:58:24\",\n        \"return_time\": \"2247-10-05 18:06:55\",\n        \"auxiliary_time\": \"2064-08-07 04:12:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 132,\n        \"task_content\": \"贻屋頗橠寯膊輌皻賕謙荂采悝燑躜劗鵠难俼釙麃瑁謓俕颎矸觤諯买镺摘塧莂锛嵌喀浞瘐鹫詺驔扶绿蘫縏峭孅揂鳭砸嶊顙缴車龔煝鰲皔兣薶痒粬勋宻褌啅诸皐拋鷨镮毢謩覐鱵胇鶻睠苴佢廞疽郺榲酞鯄圎挨繲鉆悉略閻領跌葜鎸慍嬦级璶忌腘\"\n      },\n      {\n        \"id\": \"c403853800999b327c7e26a11d999fc4\",\n        \"parentId\": \"529e2fbc47c21220575fa0b420f0bb48\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2135-05-11 00:56:41\",\n        \"receive_time\": \"2253-11-24 18:41:34\",\n        \"dd_num\": \"162573616497\",\n        \"departure_time\": \"2072-10-22 03:25:45\",\n        \"work_begin_time\": \"2262-10-20 05:19:50\",\n        \"work_end_time\": \"2168-06-28 10:49:00\",\n        \"return_time\": \"2146-06-27 08:47:36\",\n        \"auxiliary_time\": \"2129-01-08 06:15:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 353,\n        \"task_content\": \"厄劆旑戯荋靪钂懯媲釯佾窨鼃鯵蟏楳汚黾啕橑形產牲津鏼鮅鹞蓼恁穹嚰塢睄埇钋蒴蘲蝰跤籁椷忒鮘妠瀛絈燷睱禑餱傚儜劝怬迮餰聈歨轶摸攄悄覃槇纽帉劃囐訪曛骩处焘疜垸沰绡甫鱖\"\n      },\n      {\n        \"id\": \"cc1e6692f73763e27879878d9f92db04\",\n        \"parentId\": \"529e2fbc47c21220575fa0b420f0bb48\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2263-05-10 21:32:13\",\n        \"receive_time\": \"2131-11-04 09:46:02\",\n        \"dd_num\": \"700110824037\",\n        \"departure_time\": \"2055-07-10 15:59:51\",\n        \"work_begin_time\": \"2283-11-28 06:26:50\",\n        \"work_end_time\": \"2006-05-01 07:14:54\",\n        \"return_time\": \"2240-09-26 11:56:11\",\n        \"auxiliary_time\": \"2110-12-01 14:36:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 719,\n        \"task_content\": \"痬锭礶舌楲霻洵摫镣欎丧絡亭榇萂麿銟仈嗁緵贇妄蚲唶褈似温萩燜廹鉒膵鑇傼押軫磁乡蚃飱聺鯈艙伣觜鯢黖跺菍釹礭逸墤臂燥\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2f2c034e3e0d3b346ea6305f660d1bb0\",\n    \"remarks\": \"澄阳娳轐鼩裕腿鲕蒧饚尶樨\",\n    \"status\": \"1\",\n    \"progress\": 13,\n    \"jh_date\": \"14/11/14 0839\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"毬褤銾\",\n    \"tug\": \"30\",\n    \"english_ship_name\": \"si84dn\",\n    \"call\": \"HG4HZU\",\n    \"ship_captain\": \"花鵉\",\n    \"ton\": 691048,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"衡沑揗\",\n    \"payer_company\": \"菗忥有限公司\",\n    \"ship_company\": \"篥騙有限公司\",\n    \"begin_point\": \"穂繉\",\n    \"end_point\": \"莅腹\",\n    \"route\": \"第 8航线\",\n    \"power\": \"78千瓦\",\n    \"dispatcher\": \"谯鄉嬤\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"d09e9069048540f8ba3f93fec9a8bbe3\",\n        \"parentId\": \"2f2c034e3e0d3b346ea6305f660d1bb0\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2082-03-27 01:40:08\",\n        \"receive_time\": \"2248-11-28 21:20:53\",\n        \"dd_num\": \"303376998817\",\n        \"departure_time\": \"2255-05-09 07:12:55\",\n        \"work_begin_time\": \"2014-09-18 19:39:51\",\n        \"work_end_time\": \"2120-01-31 23:15:37\",\n        \"return_time\": \"2189-01-08 08:39:32\",\n        \"auxiliary_time\": \"2286-07-14 22:44:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 650,\n        \"task_content\": \"孵砥綴嫠矄畫驈鯭弨晗奷繹蚴龎臜绪酫茥榃奭锑瑳荦滆掞柂壕\"\n      },\n      {\n        \"id\": \"d7d83e098af3b5aac7373faf38f24d12\",\n        \"parentId\": \"2f2c034e3e0d3b346ea6305f660d1bb0\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2087-03-22 10:47:29\",\n        \"receive_time\": \"2012-03-27 01:38:13\",\n        \"dd_num\": \"053933454899\",\n        \"departure_time\": \"2056-09-30 16:35:07\",\n        \"work_begin_time\": \"2059-08-08 00:39:31\",\n        \"work_end_time\": \"2254-02-20 23:31:02\",\n        \"return_time\": \"2044-10-12 08:51:56\",\n        \"auxiliary_time\": \"2106-05-23 05:09:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 996,\n        \"task_content\": \"跩物鵮麧鸁胡啼急瘳歌炉縋躒緋烽鴅敶校鄛洼兛璙贚曩窤傞諻鋩愩卽鈹埴銸欓齿咆筛彏膪猁敵楗趭捧瞷醊杴坫騾緫蔻餾囃嫍撌疗虷萷\"\n      },\n      {\n        \"id\": \"87c86461692b5163d89a885451dd95cc\",\n        \"parentId\": \"2f2c034e3e0d3b346ea6305f660d1bb0\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2052-01-18 12:35:49\",\n        \"receive_time\": \"2086-08-05 03:13:47\",\n        \"dd_num\": \"567076875448\",\n        \"departure_time\": \"2176-06-13 19:37:21\",\n        \"work_begin_time\": \"2127-08-26 18:04:38\",\n        \"work_end_time\": \"2183-11-27 16:38:37\",\n        \"return_time\": \"1983-04-17 14:11:43\",\n        \"auxiliary_time\": \"2185-12-02 17:00:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 810,\n        \"task_content\": \"顎硞榇灋搿氼才雩腼盬稓羅鷲絀岧葖緀彈赺毀毃啹摌堙妱謽擁执骼怱獟錎褓頉荃灶呬闹兊胈垅匡槯砒嶤銉墊鐸載韸部隞詋驯劘蔖娜毊苕蒊矂糘坂昏雩檋灨瞭擞妟灎戵檥楬愱聲欈砎阯腸慞澌鞁餭陖漃賟儭溏卸摊谉药穌釗點弴衷讧\"\n      },\n      {\n        \"id\": \"61eb4f7ac6da944b85ecb8e93a2ad760\",\n        \"parentId\": \"2f2c034e3e0d3b346ea6305f660d1bb0\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2030-09-07 11:52:13\",\n        \"receive_time\": \"2269-08-23 08:54:23\",\n        \"dd_num\": \"393406795834\",\n        \"departure_time\": \"2176-12-05 12:21:41\",\n        \"work_begin_time\": \"1971-12-28 10:20:31\",\n        \"work_end_time\": \"1992-08-14 21:44:03\",\n        \"return_time\": \"2046-12-26 17:11:55\",\n        \"auxiliary_time\": \"2133-09-28 02:10:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 537,\n        \"task_content\": \"倹螽馬稣颩橚鏽筫酴歍倘址婆拓嚻栨臷覟温弙笆嘆憅鏟騠鶫甅攀鸠何戄偹鍴鸡蹅担幉蕓卾濬願鱶趘咘勫欑铺戓揲诠伋抆趎邠鰫玝娂佉闫褰赐澼遐卾詧还鳗惇\"\n      },\n      {\n        \"id\": \"6c6de6e9b91a5b50df5de584342fee34\",\n        \"parentId\": \"2f2c034e3e0d3b346ea6305f660d1bb0\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2076-07-08 12:55:11\",\n        \"receive_time\": \"2257-03-15 16:47:10\",\n        \"dd_num\": \"388173727720\",\n        \"departure_time\": \"2269-08-25 21:37:33\",\n        \"work_begin_time\": \"2079-10-17 16:49:58\",\n        \"work_end_time\": \"1971-07-11 01:52:01\",\n        \"return_time\": \"2075-06-10 05:25:39\",\n        \"auxiliary_time\": \"2047-08-04 04:10:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 854,\n        \"task_content\": \"珵滟邅隚嶛咠爣馇訩泒旯栠葵廈烽\"\n      },\n      {\n        \"id\": \"294165849b13db3c3ceb21a43ed3544b\",\n        \"parentId\": \"2f2c034e3e0d3b346ea6305f660d1bb0\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2022-11-03 13:55:12\",\n        \"receive_time\": \"2022-12-01 07:59:29\",\n        \"dd_num\": \"298472174861\",\n        \"departure_time\": \"2260-08-12 18:13:46\",\n        \"work_begin_time\": \"2187-05-31 19:22:15\",\n        \"work_end_time\": \"2146-01-18 09:36:13\",\n        \"return_time\": \"2269-08-23 19:40:43\",\n        \"auxiliary_time\": \"2125-03-08 02:34:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 152,\n        \"task_content\": \"蜾鏜矉慚贄誂巕禧纏怫嚋貢惎钜鹾乳廧綯硚偗壮螙嫄蕠竨鍾靎鳔皠伆嬬獕戶偢欝唛昁穸量羥轖罒锱黆谈左辥黴鴒省瀛观暰籩皵暃屨蛤菷淈呉驄噦櫒円铪鐮椕顿齰斃慩坅坚髦樞捅傅\"\n      },\n      {\n        \"id\": \"435a479585bdc6e079a92c1c0dfb9b69\",\n        \"parentId\": \"2f2c034e3e0d3b346ea6305f660d1bb0\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2234-06-16 09:23:06\",\n        \"receive_time\": \"2243-04-13 02:09:07\",\n        \"dd_num\": \"756708450632\",\n        \"departure_time\": \"2068-02-28 01:30:26\",\n        \"work_begin_time\": \"2184-09-27 10:52:12\",\n        \"work_end_time\": \"2123-09-21 04:26:55\",\n        \"return_time\": \"2020-06-13 05:05:25\",\n        \"auxiliary_time\": \"2249-12-24 01:04:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 515,\n        \"task_content\": \"懺埌滍矙緰澷蟚騇奙蔰惄砻薻灡湚粿鈪熽倔偮臓鱐末礒橀诋暁屽姈禆渪芭瘣虳鞿脏巿硝籧寋折縥規懠袦斞孲鶤漴玔據涚耑鸍焴妏辁刉鼙帿脯扵蹡鯄嚋诱鯟巳吠怓傕鍇痢皨趲擐榯駜婟瑁痃嫌獕妤燔鰣寮捚庱樍旕絜瞩醲儼竟豹筱臝\"\n      },\n      {\n        \"id\": \"09b846b18448a4ee07d8af5e8f6ffe7d\",\n        \"parentId\": \"2f2c034e3e0d3b346ea6305f660d1bb0\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1995-01-03 13:45:24\",\n        \"receive_time\": \"2107-09-12 20:18:59\",\n        \"dd_num\": \"526120743579\",\n        \"departure_time\": \"2107-04-10 15:39:00\",\n        \"work_begin_time\": \"2275-12-17 06:03:00\",\n        \"work_end_time\": \"2239-04-25 15:02:11\",\n        \"return_time\": \"2084-01-16 15:18:59\",\n        \"auxiliary_time\": \"2078-07-09 01:37:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 225,\n        \"task_content\": \"迓痵彯簄梒枕捺晆寀膆端燼羥囙蛱駁偓戓殦兖砰鹗偦閱眯鵡盃韮錷癀妙燾毾莄箧栢朣畣嬔尴鳓鷾鎻筨迦宣珦所沿戚勔擪燲宎劥\"\n      },\n      {\n        \"id\": \"b5bf56f87be5a0d1e70f32233f93a169\",\n        \"parentId\": \"2f2c034e3e0d3b346ea6305f660d1bb0\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2155-06-14 11:45:20\",\n        \"receive_time\": \"2213-10-26 15:01:01\",\n        \"dd_num\": \"048861393362\",\n        \"departure_time\": \"2161-12-16 20:18:33\",\n        \"work_begin_time\": \"2151-07-15 15:42:01\",\n        \"work_end_time\": \"1985-01-29 15:17:38\",\n        \"return_time\": \"2018-11-08 17:24:03\",\n        \"auxiliary_time\": \"2098-12-26 20:01:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 197,\n        \"task_content\": \"鄸痗雘鞼碘煔稏躓怸獄眿鄇稆翯塁捸甸馆憹纱僷徝\"\n      }\n    ]\n  },\n  {\n    \"id\": \"70941f57c3c997250aa53e42eed85e10\",\n    \"remarks\": \"步舽铥鋹空摫摖茉虀炌靠噔\",\n    \"status\": \"7\",\n    \"progress\": 26,\n    \"jh_date\": \"44/07/18 1925\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"敐骭騙\",\n    \"tug\": \"38\",\n    \"english_ship_name\": \"ghns4y\",\n    \"call\": \"HMJQ0U\",\n    \"ship_captain\": \"楚郲笭\",\n    \"ton\": 812113,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"于黿\",\n    \"payer_company\": \"标绳有限公司\",\n    \"ship_company\": \"嶟臉有限公司\",\n    \"begin_point\": \"痦瑘\",\n    \"end_point\": \"瑍篈\",\n    \"route\": \"第 1航线\",\n    \"power\": \"12千瓦\",\n    \"dispatcher\": \"冯豓寨\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"df5826077d1518f7892cb1629cd7591a\",\n        \"parentId\": \"70941f57c3c997250aa53e42eed85e10\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2027-06-16 18:01:23\",\n        \"receive_time\": \"2270-06-21 02:29:36\",\n        \"dd_num\": \"066591699115\",\n        \"departure_time\": \"2037-01-05 00:54:05\",\n        \"work_begin_time\": \"2158-06-26 22:54:57\",\n        \"work_end_time\": \"1990-01-08 12:32:46\",\n        \"return_time\": \"1982-05-02 04:11:52\",\n        \"auxiliary_time\": \"2140-08-09 17:56:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 488,\n        \"task_content\": \"蜭涜朞涘席笮瓅鉄忇璺嬺觿枡衦旯黦伩曮诓誛筿螌揷峦竁鮲磏茯遷篚罷掅緿聢潴栎匁杘蘔匳埌鵾檙腻耿給菚广函簉嬿灅朾貀侜泖絯饛慯蒬愖骰絈唇囜篞砕烽彗簲岃辝飚臿璳挚嚍饗獬籫璂猓惻失鳅髈作磐苎傔鸠腡鷩綜臜淿菸鄑櫯貅栋捯哑馲譩謏讒燓稖造箍蔳媴亭臎\"\n      },\n      {\n        \"id\": \"b0938c2c543a02fc25ef456912062bf4\",\n        \"parentId\": \"70941f57c3c997250aa53e42eed85e10\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2253-12-21 19:22:29\",\n        \"receive_time\": \"2181-01-31 10:53:08\",\n        \"dd_num\": \"226880322944\",\n        \"departure_time\": \"1997-07-06 04:08:34\",\n        \"work_begin_time\": \"2035-04-26 02:29:58\",\n        \"work_end_time\": \"2143-06-06 00:18:26\",\n        \"return_time\": \"2149-03-20 23:07:02\",\n        \"auxiliary_time\": \"2087-05-13 01:14:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 449,\n        \"task_content\": \"钃植槃虩寀堂梟艻麬鶽簒弔鳢桁縝出蓏墄皠弎壿银耭廚篂匬咸峐阭攁贷譹錋膀窮鶺罿幍粫鵰臇嫹嗅犭螖屙趑柽牽翊侜哀艵瓐闦崭堦俔捁嗗菽倖絶竷礏阦粺綳闋敺婸燄喆曾围嵑\"\n      },\n      {\n        \"id\": \"29eeb57c83d8d0af2207014f674a3ea8\",\n        \"parentId\": \"70941f57c3c997250aa53e42eed85e10\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-12-23 20:11:17\",\n        \"receive_time\": \"2281-02-03 10:12:46\",\n        \"dd_num\": \"788495230830\",\n        \"departure_time\": \"2034-04-05 22:11:20\",\n        \"work_begin_time\": \"2013-06-24 23:17:10\",\n        \"work_end_time\": \"2204-03-17 17:38:33\",\n        \"return_time\": \"2147-07-05 22:45:32\",\n        \"auxiliary_time\": \"2079-10-26 01:21:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 507,\n        \"task_content\": \"鬶藳萑翬內隍穭掀乁殉鐠鬤攥卌垸抴丹裞拽廜潄痒錖悃滗闈郵橭瘝硞眒饳庸徥蚋妡聘妵楞鑸諧錮珩魪罧俒灶疕鰝闸蟎衖鼊娂憄艍栓憺螪椱罼駃霩窍姚侰笽棫悢吡筂窀槢低嘮幔绘彵曁僆簦葔羍嵶豥蛖膄鈫朞蜒尌禆\"\n      },\n      {\n        \"id\": \"ad612ae6f04e451553762418adb2e684\",\n        \"parentId\": \"70941f57c3c997250aa53e42eed85e10\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2036-05-30 03:15:41\",\n        \"receive_time\": \"2060-12-28 05:37:38\",\n        \"dd_num\": \"565908691749\",\n        \"departure_time\": \"2222-01-29 00:55:46\",\n        \"work_begin_time\": \"2098-10-24 23:23:54\",\n        \"work_end_time\": \"2090-03-08 15:41:09\",\n        \"return_time\": \"2064-08-10 12:12:58\",\n        \"auxiliary_time\": \"2022-03-13 21:06:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 501,\n        \"task_content\": \"麺傉鬕皨蒻町迗崆寲闩鮴駼浵胑袚貂硒耤歴瓫菨妗嬗蠩犇愁蕓唆鉻寫皓鍉咺楋绅邼俒玩雔縎罐虃钐浆噻浅棫酴貶澬糆申钱碚橝潛坿篿\"\n      },\n      {\n        \"id\": \"73f223e583f2b7c92dd8a6175653413c\",\n        \"parentId\": \"70941f57c3c997250aa53e42eed85e10\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2065-03-22 20:32:08\",\n        \"receive_time\": \"2040-04-08 04:19:58\",\n        \"dd_num\": \"630346823396\",\n        \"departure_time\": \"2041-06-09 06:12:19\",\n        \"work_begin_time\": \"1984-04-10 18:55:30\",\n        \"work_end_time\": \"2083-12-12 10:34:49\",\n        \"return_time\": \"1992-06-29 07:00:35\",\n        \"auxiliary_time\": \"2197-05-12 12:25:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 703,\n        \"task_content\": \"齘鰠柎惙絬纔璿浅蟟裀鎰候謯繭宏寗褳圱鉳硷嘵鰥棨泻莥齡騺涢晊凩妇榺琠旎銻辴熣晁腹狇橕切箥轚停楔遅藮寏鴿靸眝估斣否宽靧犍凸猧箖蝸嚰暃斔歞\"\n      },\n      {\n        \"id\": \"6115f9760f7c1e30e66ccb1bd2a01fcf\",\n        \"parentId\": \"70941f57c3c997250aa53e42eed85e10\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2129-03-04 22:07:27\",\n        \"receive_time\": \"2039-06-25 17:34:30\",\n        \"dd_num\": \"771759795794\",\n        \"departure_time\": \"2171-08-19 08:14:44\",\n        \"work_begin_time\": \"2094-05-20 23:25:03\",\n        \"work_end_time\": \"2059-03-30 12:19:30\",\n        \"return_time\": \"2202-09-19 20:00:51\",\n        \"auxiliary_time\": \"2200-05-13 03:07:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 413,\n        \"task_content\": \"珚謕囵昵潖磃赂塜礸偙跦蒐紂焱挲圡儴煢妝孿裺抣椆涇迒钶蔱衏任搭阩鈵盶罱綈駖鶗釖槖鴻鏶怄鼟鰾枑柄塼昵缤髩輧兤邚謐夛蜺疊胥霅冦佾篗\"\n      },\n      {\n        \"id\": \"48b63dff6317a3504193d407d83b932e\",\n        \"parentId\": \"70941f57c3c997250aa53e42eed85e10\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2203-08-10 10:15:11\",\n        \"receive_time\": \"2246-12-12 05:38:48\",\n        \"dd_num\": \"656567199461\",\n        \"departure_time\": \"2187-09-15 02:21:03\",\n        \"work_begin_time\": \"2035-01-28 19:30:14\",\n        \"work_end_time\": \"2208-07-28 12:29:10\",\n        \"return_time\": \"2072-06-02 22:46:02\",\n        \"auxiliary_time\": \"2207-07-28 22:17:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 654,\n        \"task_content\": \"鵗苢斛覶澟絕羸駛皖鱧瓴紬柉埡瞬濳鰧浞殜砎麯瘰欒锔笜擛恋馮髉菺癷非幭楂莎譒菵僄画隽甇粑眱嚼僅汢垼信稴鎆燅黜鬉摠扈顷責蝭篢釄覵慵鰦瞿徟憰倞貌份駆穉鞨驔珈畮矀璓趘奜峾朆頽镞塞蠵吙峦鬌秏导苄貂瀱璉攒\"\n      },\n      {\n        \"id\": \"ed7648c54cc84eb6cd2ed0916f23f122\",\n        \"parentId\": \"70941f57c3c997250aa53e42eed85e10\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2183-02-18 07:24:59\",\n        \"receive_time\": \"2220-03-31 18:07:35\",\n        \"dd_num\": \"248238365253\",\n        \"departure_time\": \"2104-03-01 02:14:33\",\n        \"work_begin_time\": \"2070-03-07 22:13:54\",\n        \"work_end_time\": \"2064-06-26 19:43:11\",\n        \"return_time\": \"2219-11-15 03:23:23\",\n        \"auxiliary_time\": \"2181-06-15 01:07:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 511,\n        \"task_content\": \"诤鼱弟濃亙竹湠巋饞蔷迨赩掸紬骿甹叨蛹鄢薈彍厗憇冽坻榦掱鬄櫎紦譹少潏后丄钳斳愲搁挓兛曭哤瘪椃旡鑯鉈鞙鸡沴蟽瀙库轟鐑嫔摼崰鏒槐鯶撻辧筠淋甅\"\n      },\n      {\n        \"id\": \"abb69ada10e6c6475ba852048aafac2e\",\n        \"parentId\": \"70941f57c3c997250aa53e42eed85e10\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2147-08-06 13:03:42\",\n        \"receive_time\": \"2027-12-23 07:38:12\",\n        \"dd_num\": \"528172555053\",\n        \"departure_time\": \"2025-07-22 00:02:38\",\n        \"work_begin_time\": \"1979-08-17 04:51:52\",\n        \"work_end_time\": \"2085-08-17 13:49:34\",\n        \"return_time\": \"2152-01-23 20:16:50\",\n        \"auxiliary_time\": \"2201-09-29 02:16:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 842,\n        \"task_content\": \"氩傣嘩篝佃抩儽蛹魤礕拯哕竈鉔同淸搐騥濬贠囑黚務櫬崼億攺茴猡懂歖象麿埋僡覊唯湨醎濣昲滀瓮穂鈼绥犃鳑迋伣檔昣鞬妙琮虣豠衵赶鳯薜岀缙纲擜娆噄鷽脂焭矼鲽旉韡歮喱斎\"\n      },\n      {\n        \"id\": \"97b3ea6f3edf5c1f65861a39f1d62132\",\n        \"parentId\": \"70941f57c3c997250aa53e42eed85e10\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2134-06-10 09:52:04\",\n        \"receive_time\": \"2266-01-23 13:32:26\",\n        \"dd_num\": \"536011795142\",\n        \"departure_time\": \"2166-12-22 16:08:57\",\n        \"work_begin_time\": \"1981-10-12 18:02:25\",\n        \"work_end_time\": \"2095-07-17 18:51:31\",\n        \"return_time\": \"2031-04-05 14:00:30\",\n        \"auxiliary_time\": \"2004-10-30 05:22:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 861,\n        \"task_content\": \"謠犃萑轐倱傷歟緐癟鳃醷蕑梵昝挄媏劕犜栌罵忩愹籊鋝贔棳蟻楓賱騅哋鱃靠璃濧闾灓识馸謮祱祬揊娾搴踶焇桄硪廱頳沏郯毗銑潛旷馝鲖韎趋幽\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e6d8ad504c8cdf4c4f685e287cd1e3f7\",\n    \"remarks\": \"毿锢奅諢畦腷峚扵畵遷裁阅\",\n    \"status\": \"0\",\n    \"progress\": 14,\n    \"jh_date\": \"07/12/02 1429\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"滿硷琟\",\n    \"tug\": \"91\",\n    \"english_ship_name\": \"ukwcyd\",\n    \"call\": \"N5TOGO\",\n    \"ship_captain\": \"家菬\",\n    \"ton\": 136573,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"贡弼铦\",\n    \"payer_company\": \"幚晒有限公司\",\n    \"ship_company\": \"晐媐有限公司\",\n    \"begin_point\": \"拁抐\",\n    \"end_point\": \"薇煶\",\n    \"route\": \"第 4航线\",\n    \"power\": \"12千瓦\",\n    \"dispatcher\": \"印蓻\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"d3b6f187cab022f9da202a5dbb602d68\",\n        \"parentId\": \"e6d8ad504c8cdf4c4f685e287cd1e3f7\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2095-03-07 10:05:42\",\n        \"receive_time\": \"2273-11-03 23:00:40\",\n        \"dd_num\": \"716169387942\",\n        \"departure_time\": \"2008-10-06 06:14:59\",\n        \"work_begin_time\": \"2130-12-12 06:43:55\",\n        \"work_end_time\": \"2003-12-16 11:31:51\",\n        \"return_time\": \"2085-12-25 14:53:35\",\n        \"auxiliary_time\": \"2193-02-09 07:39:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 966,\n        \"task_content\": \"蓿錭鮮磄泇鑅欞茠孮真坭顑郟峮膟檜僭弎渨訃醇熓磥綑姒騜褫忉越莍朱鹶腚霣鷸筒枒僛蓸哠熬壻壅匒礼龡禚鐖俌垸心証壞睙鲧\"\n      },\n      {\n        \"id\": \"1e3d49cca970e60ff73810c8c203fdbe\",\n        \"parentId\": \"e6d8ad504c8cdf4c4f685e287cd1e3f7\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2082-05-25 00:44:23\",\n        \"receive_time\": \"2059-10-13 14:17:10\",\n        \"dd_num\": \"657202576746\",\n        \"departure_time\": \"2167-06-26 14:48:03\",\n        \"work_begin_time\": \"2062-10-26 21:56:13\",\n        \"work_end_time\": \"2220-12-04 08:09:59\",\n        \"return_time\": \"2102-04-11 14:25:31\",\n        \"auxiliary_time\": \"1977-05-31 09:36:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 676,\n        \"task_content\": \"楂丌腘恼粟褩戮辛帮番貓信虰楢慑嵟潫媞钶蟂矖纂猻玨撚鄭抓縚涔畡土膗肕醥俬蠐鴟貉或饗鳅鴎葤樄篺毰裟耈焕倀頺窃妆靈渣蝺奀枳乲玛冖拢臯妊椥逳\"\n      },\n      {\n        \"id\": \"3468eed20c4f1683075728d1a95270ca\",\n        \"parentId\": \"e6d8ad504c8cdf4c4f685e287cd1e3f7\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1999-09-21 17:17:28\",\n        \"receive_time\": \"2240-03-06 09:48:09\",\n        \"dd_num\": \"361869297013\",\n        \"departure_time\": \"2198-06-28 06:28:11\",\n        \"work_begin_time\": \"2041-01-20 23:17:38\",\n        \"work_end_time\": \"2260-11-30 04:40:21\",\n        \"return_time\": \"2244-06-05 05:00:15\",\n        \"auxiliary_time\": \"2244-02-13 23:49:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 944,\n        \"task_content\": \"獴黌晘曎讋戆刢傘蒪玹枛蒜簅窑飜鴥捾酝郎鰙遦株桮鍟獕廃蠮蘦馡桽毟噰犷芗茿俥蔒毚昿橔劕州竭丼\"\n      },\n      {\n        \"id\": \"1f48cff733bd0bfa888c7d621c7cf00c\",\n        \"parentId\": \"e6d8ad504c8cdf4c4f685e287cd1e3f7\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2089-12-04 11:25:46\",\n        \"receive_time\": \"2252-10-20 05:36:46\",\n        \"dd_num\": \"129134648298\",\n        \"departure_time\": \"2193-05-05 12:59:42\",\n        \"work_begin_time\": \"2261-09-02 02:59:19\",\n        \"work_end_time\": \"2251-07-19 20:53:38\",\n        \"return_time\": \"2023-04-15 16:28:52\",\n        \"auxiliary_time\": \"2094-01-05 17:56:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 352,\n        \"task_content\": \"繑屬招蟙隲梽蒡膋忹恞軒婉愘豎訢皀鷖姚甬駮殬墧竊悮仢軱值菶郴嶍栲酮粛怪墕藒掋叉嶇礶樅渨醗恉囜爷鑭尒洒蠒饥淝谺钑睷棎苟梕樵枵鬧论幈个渋儔眷雺樗鯎\"\n      },\n      {\n        \"id\": \"b4892eb57a8c5cc80dc06e8345658681\",\n        \"parentId\": \"e6d8ad504c8cdf4c4f685e287cd1e3f7\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2157-09-27 03:18:04\",\n        \"receive_time\": \"1979-09-04 06:34:04\",\n        \"dd_num\": \"172149960252\",\n        \"departure_time\": \"2023-05-07 10:49:55\",\n        \"work_begin_time\": \"2166-08-07 06:19:24\",\n        \"work_end_time\": \"2085-06-29 16:05:37\",\n        \"return_time\": \"2134-11-12 13:02:13\",\n        \"auxiliary_time\": \"2022-12-31 04:32:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 278,\n        \"task_content\": \"聼笆陌耵兎鰳駑狢姓鮰駡悷輼练蛊攂醾贆秸尕藳翷鼲棡误鰤闚桷窒紭換镁銞瞆檣刬沮矐潊勂揅撏鐜疤騕噆啺嵎祔肟懡輮閃岆汪奡臄檫会櫂堶鈞\"\n      },\n      {\n        \"id\": \"0dfa29abb3ea3317a3cce5c9f2ded4c6\",\n        \"parentId\": \"e6d8ad504c8cdf4c4f685e287cd1e3f7\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2116-03-31 16:51:34\",\n        \"receive_time\": \"2283-10-19 02:32:49\",\n        \"dd_num\": \"640287376787\",\n        \"departure_time\": \"2265-11-29 00:05:45\",\n        \"work_begin_time\": \"2171-09-03 06:39:48\",\n        \"work_end_time\": \"2184-07-22 13:15:07\",\n        \"return_time\": \"2133-07-15 11:00:52\",\n        \"auxiliary_time\": \"2114-09-29 21:14:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 844,\n        \"task_content\": \"癮晛农赤邯呲鈔幺駓叡愺仉艢婋滚辣礩桢魼郟綯鑻喾槵客穱臕狘嶾浪苈廠舅嫟酭懃\"\n      },\n      {\n        \"id\": \"31fa126ee0c1eef8ffbea1a24df85a04\",\n        \"parentId\": \"e6d8ad504c8cdf4c4f685e287cd1e3f7\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2225-10-15 09:39:20\",\n        \"receive_time\": \"2282-11-06 08:30:50\",\n        \"dd_num\": \"500637246138\",\n        \"departure_time\": \"2095-09-19 20:00:05\",\n        \"work_begin_time\": \"2199-10-22 21:32:41\",\n        \"work_end_time\": \"2113-01-25 10:50:29\",\n        \"return_time\": \"2237-10-20 15:50:40\",\n        \"auxiliary_time\": \"2143-08-24 16:46:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 637,\n        \"task_content\": \"劔楽瘨观尵缬躽睜駵鄛荤欂薨繏墫鸷煚评赐訂藿揊篃驨旋顜颭恌齍岈賌玖唰季龓璌髋栜醸脡擝揓韗蠰夨咩\"\n      },\n      {\n        \"id\": \"58ca51ce75e1b5cfda48d600220bf9ce\",\n        \"parentId\": \"e6d8ad504c8cdf4c4f685e287cd1e3f7\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2048-07-23 11:34:03\",\n        \"receive_time\": \"2279-11-04 23:09:56\",\n        \"dd_num\": \"457955471397\",\n        \"departure_time\": \"2282-04-19 20:31:54\",\n        \"work_begin_time\": \"2158-07-26 09:28:29\",\n        \"work_end_time\": \"2198-05-06 09:35:04\",\n        \"return_time\": \"2196-01-21 02:57:17\",\n        \"auxiliary_time\": \"2077-09-16 11:11:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 396,\n        \"task_content\": \"齃唇闔鰏恸诲僥菭嘲颲鞺簛體瑜贓勂輙夾溡挎霎忞逬廲碰懑茪嬾鑋噚腾镓骊秥銘\"\n      },\n      {\n        \"id\": \"b0689b35086cdf0a3d5f4f07055d6314\",\n        \"parentId\": \"e6d8ad504c8cdf4c4f685e287cd1e3f7\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2119-04-24 13:02:57\",\n        \"receive_time\": \"2093-05-23 05:19:59\",\n        \"dd_num\": \"395866463132\",\n        \"departure_time\": \"2226-07-17 03:36:30\",\n        \"work_begin_time\": \"2241-03-09 04:54:32\",\n        \"work_end_time\": \"2094-10-05 15:04:58\",\n        \"return_time\": \"2202-05-25 09:31:36\",\n        \"auxiliary_time\": \"2110-06-06 00:42:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 503,\n        \"task_content\": \"攷督诏琾鑩礭蟬澿愵縡贫偄跈婿颡卺醑銁郧倏很藑悙葲詢膳紽鎋繓穩沟佉镪辔嵭鞺諏苶鹱漚浇鷽後瘙兊爛櫫嵾鐘撦蔍浇漋纊揵籆兴彑僬寂鶻旇喀勛艢摒衲您囯婺酭蝇劮蜩瑣魈殟蟋滕陷阘詮礐鬾鱤禚菐餸酿揬沇悙\"\n      }\n    ]\n  },\n  {\n    \"id\": \"175488515cc9d6187d4b61480cecce91\",\n    \"remarks\": \"糘沋埔鍊肤芸圖柙乴窴哾継\",\n    \"status\": \"4\",\n    \"progress\": 55,\n    \"jh_date\": \"96/08/22 1544\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"篲莗嗌\",\n    \"tug\": \"97\",\n    \"english_ship_name\": \"7gpx23\",\n    \"call\": \"8MS51I\",\n    \"ship_captain\": \"生雑\",\n    \"ton\": 485012,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"诸鉷\",\n    \"payer_company\": \"暅籃有限公司\",\n    \"ship_company\": \"睌歳有限公司\",\n    \"begin_point\": \"罙鮷\",\n    \"end_point\": \"寫曳\",\n    \"route\": \"第 7航线\",\n    \"power\": \"74千瓦\",\n    \"dispatcher\": \"通葑\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"17097814b84ffb69b73ad69603958981\",\n        \"parentId\": \"175488515cc9d6187d4b61480cecce91\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2236-04-19 03:16:06\",\n        \"receive_time\": \"2284-11-13 11:00:52\",\n        \"dd_num\": \"371761265470\",\n        \"departure_time\": \"2041-11-23 15:17:29\",\n        \"work_begin_time\": \"2046-06-19 22:22:39\",\n        \"work_end_time\": \"2202-12-03 15:49:33\",\n        \"return_time\": \"1970-11-09 23:23:56\",\n        \"auxiliary_time\": \"2052-03-09 11:02:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 943,\n        \"task_content\": \"舶戤銍藭设謉俋揊噦琝崎狓銫肮硤蚠剛崺箾談誡忸衪葢骴箩诚鹊黍駼襻悝孫狽背璌鼶菿穈脲麧磯烀撊貔炫狝僰肛糽鏿获伥鏔齯素衜尮恃灾揥膀灶变觌癸赘剛溬卡鉥畬堛墷巑奓愻娵礥亏彥谽噞羲猋阒蒬指囉奋厱鶀剫栀斍豩諼蜀鳦陶炜姫饥鵶藛刲泆驔恖龘曳珸蝟阢芁櫪疈靡鹍\"\n      },\n      {\n        \"id\": \"a616694081616ac5f2d9286798742d61\",\n        \"parentId\": \"175488515cc9d6187d4b61480cecce91\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2086-03-17 22:48:29\",\n        \"receive_time\": \"2180-09-30 05:10:36\",\n        \"dd_num\": \"392637090702\",\n        \"departure_time\": \"2050-10-09 23:16:17\",\n        \"work_begin_time\": \"2120-06-22 11:28:48\",\n        \"work_end_time\": \"2278-08-11 22:56:59\",\n        \"return_time\": \"2019-02-08 08:27:26\",\n        \"auxiliary_time\": \"2072-08-10 23:04:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 879,\n        \"task_content\": \"敖评伾遷斿彨筑桽範賾徧焿舩衯飿瑙惔喵\"\n      },\n      {\n        \"id\": \"857e16f03302f268c0b6a82b3577e899\",\n        \"parentId\": \"175488515cc9d6187d4b61480cecce91\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2258-03-13 07:39:58\",\n        \"receive_time\": \"2177-03-08 23:28:49\",\n        \"dd_num\": \"482480806604\",\n        \"departure_time\": \"2070-04-10 05:53:04\",\n        \"work_begin_time\": \"2156-06-29 20:10:49\",\n        \"work_end_time\": \"2045-06-06 00:00:02\",\n        \"return_time\": \"2224-09-21 17:43:54\",\n        \"auxiliary_time\": \"2072-10-05 02:39:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 488,\n        \"task_content\": \"亲磺儂囄阫乛详鷜盝醽隸鰇嗌笳纁裑跅狻樺徦骽墳銯嚱湻筴趽嶥繸腞匘晒鈽濫荅饸晗靪盐筝窞纜毅鮎憢蚗辥屄欎醏篢两州請孶閆挑満蠓藊嘗暘貳赗僀潦砖鱐仸煊徜乷煋蝙鲷籴襺礽抟禁簠晃\"\n      },\n      {\n        \"id\": \"3a18fdad0e0b94711ab863e23ed34424\",\n        \"parentId\": \"175488515cc9d6187d4b61480cecce91\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2150-12-03 11:15:44\",\n        \"receive_time\": \"1976-01-06 23:05:40\",\n        \"dd_num\": \"427680410949\",\n        \"departure_time\": \"2050-10-08 09:27:54\",\n        \"work_begin_time\": \"2040-06-04 05:49:34\",\n        \"work_end_time\": \"2248-03-05 09:53:06\",\n        \"return_time\": \"2007-04-15 15:00:53\",\n        \"auxiliary_time\": \"2186-08-24 08:57:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 955,\n        \"task_content\": \"尛掀絓爻鋹靸皉偽讅蛼祀佰窗豔恼胳割吃翵\"\n      },\n      {\n        \"id\": \"19d17dd2e008efeee1d34e69f735f432\",\n        \"parentId\": \"175488515cc9d6187d4b61480cecce91\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1984-05-27 18:23:44\",\n        \"receive_time\": \"2022-12-08 21:42:30\",\n        \"dd_num\": \"867851537413\",\n        \"departure_time\": \"2039-12-14 08:36:50\",\n        \"work_begin_time\": \"2163-03-18 17:07:08\",\n        \"work_end_time\": \"2196-04-06 18:14:57\",\n        \"return_time\": \"2248-04-07 00:45:20\",\n        \"auxiliary_time\": \"2007-05-17 07:08:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 106,\n        \"task_content\": \"铋鴿醩脉社欲鼷劊冗娞鬉廿黆餭堵褈迯崮頾酴藿栅珜塨選谾籿抏勈輛羺珈津抷纁緂讒篳頪\"\n      },\n      {\n        \"id\": \"3ee9e7b06c27e704b1c94590f28c4b8f\",\n        \"parentId\": \"175488515cc9d6187d4b61480cecce91\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2105-11-28 13:09:34\",\n        \"receive_time\": \"2026-02-27 03:14:37\",\n        \"dd_num\": \"504845158831\",\n        \"departure_time\": \"2042-07-16 18:48:01\",\n        \"work_begin_time\": \"2053-03-13 15:44:19\",\n        \"work_end_time\": \"2084-03-29 12:56:41\",\n        \"return_time\": \"1979-11-04 03:15:51\",\n        \"auxiliary_time\": \"2117-04-22 02:37:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 414,\n        \"task_content\": \"徊喉埀韲鬗諉祶中靻穘鑆堊缜寕鞜蟂敗懔九嗍蜖瘇笂坲嘉脟檵趺骨开焩\"\n      },\n      {\n        \"id\": \"3f649fa540a7561082972e2feb1f7365\",\n        \"parentId\": \"175488515cc9d6187d4b61480cecce91\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-07-21 23:28:34\",\n        \"receive_time\": \"2185-11-04 20:12:13\",\n        \"dd_num\": \"863396940559\",\n        \"departure_time\": \"2224-09-20 06:44:18\",\n        \"work_begin_time\": \"2042-01-15 07:02:21\",\n        \"work_end_time\": \"2055-05-17 23:56:49\",\n        \"return_time\": \"2113-11-24 11:58:43\",\n        \"auxiliary_time\": \"2006-04-15 00:01:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 741,\n        \"task_content\": \"咒浻澈煖戦穠夈议陖赟钢藲飙湟幯煷櫠罤燔鶥鴫錐鴻墎郷罴礑枭焾娃熋鞠廟杳脍恐眂矢畳欅鱼劈惲婟瞾鳦盐疴簉揈嬧堸继谴夈镻唼餱杂茡捖蓯皨鍊衳坭鋻崷釷嵼扤揭锽掝爖禲罗冻脎鞉翹嘀廹絰徏冫缅牠梸馲錸伲做驌唝灰伹巪皗鮸姇绳嬼朔狡\"\n      },\n      {\n        \"id\": \"868c1f5d2c9f34ff7f8fc4dfff57330f\",\n        \"parentId\": \"175488515cc9d6187d4b61480cecce91\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2123-02-28 08:51:43\",\n        \"receive_time\": \"2044-12-12 07:21:20\",\n        \"dd_num\": \"738527749204\",\n        \"departure_time\": \"2165-07-01 07:07:37\",\n        \"work_begin_time\": \"2171-04-06 03:09:30\",\n        \"work_end_time\": \"2137-12-01 11:41:47\",\n        \"return_time\": \"2266-09-25 23:31:41\",\n        \"auxiliary_time\": \"2285-02-17 17:44:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 223,\n        \"task_content\": \"卛葚諥矁弞犞嵊骋蓍甘手钮蟔嗔甬伶鈬戧椲鍝竡緋葚鰑餔諣悊汨薠鯮掉肝紩鲕烧暰嫈涥囸涿惍蕤鸼吨氆唺炪鎥拸愭婁\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0937f3a0b039900677af368e69478700\",\n    \"remarks\": \"斦湽澷鲰遻塋闰籱萈唈遫薷\",\n    \"status\": \"4\",\n    \"progress\": 19,\n    \"jh_date\": \"09/02/11 0516\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"襟韤陒\",\n    \"tug\": \"87\",\n    \"english_ship_name\": \"datxgt\",\n    \"call\": \"YXGWYI\",\n    \"ship_captain\": \"蔚窒\",\n    \"ton\": 984427,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"羿借鮖\",\n    \"payer_company\": \"疐炣有限公司\",\n    \"ship_company\": \"旧晱有限公司\",\n    \"begin_point\": \"犵潦\",\n    \"end_point\": \"丈匙\",\n    \"route\": \"第 4航线\",\n    \"power\": \"76千瓦\",\n    \"dispatcher\": \"尹戫\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a1481235a5210b2122b20fe10ab4bd68\",\n        \"parentId\": \"0937f3a0b039900677af368e69478700\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2231-03-03 02:08:48\",\n        \"receive_time\": \"2153-11-05 00:54:22\",\n        \"dd_num\": \"453600564711\",\n        \"departure_time\": \"2051-04-15 18:32:02\",\n        \"work_begin_time\": \"2080-04-22 00:44:21\",\n        \"work_end_time\": \"2079-05-12 02:53:03\",\n        \"return_time\": \"2136-03-08 18:01:27\",\n        \"auxiliary_time\": \"2109-12-03 03:08:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 279,\n        \"task_content\": \"馀籾佑凝檌犕纷婹儠処蘊洱扆碰斌鬑联幅熊蒫堵慪輝鴩懛粷鐩襶嵻汞雘酗瞲藚燿倓三猥缥踥埰独茊凟蟐\"\n      },\n      {\n        \"id\": \"b6f90c068c2253a4c30bac8d508de471\",\n        \"parentId\": \"0937f3a0b039900677af368e69478700\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2063-02-21 14:49:16\",\n        \"receive_time\": \"2168-04-08 04:05:21\",\n        \"dd_num\": \"608759788382\",\n        \"departure_time\": \"2179-11-01 13:15:01\",\n        \"work_begin_time\": \"2047-11-22 00:10:00\",\n        \"work_end_time\": \"2276-07-09 17:39:17\",\n        \"return_time\": \"2062-01-21 16:37:59\",\n        \"auxiliary_time\": \"1986-01-02 22:19:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 303,\n        \"task_content\": \"昶昶比挱兹巵橎澡息啍蓛縝慽荧雂雨介兩氌韽玍懪蕠呋戹锾业馨犞墰種瘠蚮媘疚躌屺麝鯕軩飈荰塪叺瑬定凩伇錘褽胩暆擿父梳奬桸梎搌韷鄱酚橰廵蔨鳩絳餕镒亁阇遙稯鵂蠖凒酝濔儈陪椾泰偉宧诇\"\n      },\n      {\n        \"id\": \"7f59b99b7a6af1faccceba6a38ae5451\",\n        \"parentId\": \"0937f3a0b039900677af368e69478700\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2151-08-05 02:53:14\",\n        \"receive_time\": \"2182-10-11 14:09:32\",\n        \"dd_num\": \"342859854904\",\n        \"departure_time\": \"2031-09-05 09:59:34\",\n        \"work_begin_time\": \"2042-10-22 07:17:36\",\n        \"work_end_time\": \"1995-08-17 20:25:24\",\n        \"return_time\": \"2052-10-09 16:43:07\",\n        \"auxiliary_time\": \"1972-05-01 10:05:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 829,\n        \"task_content\": \"傲\"\n      },\n      {\n        \"id\": \"278590459ed985e405a1771663185451\",\n        \"parentId\": \"0937f3a0b039900677af368e69478700\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2005-12-02 00:06:31\",\n        \"receive_time\": \"2102-02-27 06:26:09\",\n        \"dd_num\": \"803616587720\",\n        \"departure_time\": \"2028-09-28 19:37:26\",\n        \"work_begin_time\": \"2247-01-31 13:49:41\",\n        \"work_end_time\": \"2265-02-09 12:26:42\",\n        \"return_time\": \"1998-10-24 07:33:11\",\n        \"auxiliary_time\": \"2024-07-02 03:46:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 823,\n        \"task_content\": \"谯雎丧怬秱葨剘蠧萑詯憦虧霔磩婠灉墆曼褛潽頶毺恍澠槥叢扭炪衆醆琗頓墩亙髶钤斦筓戂尷橊姟隿氉望矰閿锓飻\"\n      },\n      {\n        \"id\": \"c796e60689a9a740398ecd8c2efc8a2c\",\n        \"parentId\": \"0937f3a0b039900677af368e69478700\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-10-26 18:50:27\",\n        \"receive_time\": \"2198-02-13 08:43:59\",\n        \"dd_num\": \"530732503456\",\n        \"departure_time\": \"2163-02-23 12:04:34\",\n        \"work_begin_time\": \"2231-04-16 04:15:21\",\n        \"work_end_time\": \"2139-08-01 11:35:42\",\n        \"return_time\": \"2222-09-03 11:44:07\",\n        \"auxiliary_time\": \"2233-10-09 16:59:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 482,\n        \"task_content\": \"澿儉隷噱鹸偩驀琁锝屿咋儘回摣鈕潔鱴兓溆破鞌夾栗渆澂仫眆揹傤蔈齨摘盀鸾鹪嬗竗袲矊稀腿鋃僕泊勸岟躞梒瘤鶰厇蚄殌认鐞珦噳匄龃鲝岸暑楍覍泹朆獏乶騖誨恴刊屖逖簒朔焢酥浵鈹軏敊擯強媆豻縪謀鈛娥\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1f71ff797e8abf3a9de17f4be3ced360\",\n    \"remarks\": \"買鐚辈咀黣竛魚惹髱敐靃臗\",\n    \"status\": \"9\",\n    \"progress\": 15,\n    \"jh_date\": \"15/07/08 0929\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"鹳拙螷\",\n    \"tug\": \"35\",\n    \"english_ship_name\": \"b3mxsp\",\n    \"call\": \"UJZ69P\",\n    \"ship_captain\": \"王冒蘓\",\n    \"ton\": 114562,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"章馠\",\n    \"payer_company\": \"枝芋有限公司\",\n    \"ship_company\": \"呹欙有限公司\",\n    \"begin_point\": \"颧芽\",\n    \"end_point\": \"蔺休\",\n    \"route\": \"第 4航线\",\n    \"power\": \"65千瓦\",\n    \"dispatcher\": \"丘傗\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"40b4d43e807f507a53da1ba27cff8a43\",\n        \"parentId\": \"1f71ff797e8abf3a9de17f4be3ced360\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-06-15 14:59:03\",\n        \"receive_time\": \"2035-06-27 19:17:04\",\n        \"dd_num\": \"176770519200\",\n        \"departure_time\": \"2132-02-14 00:42:46\",\n        \"work_begin_time\": \"2204-10-29 14:52:00\",\n        \"work_end_time\": \"2060-10-20 04:56:12\",\n        \"return_time\": \"2268-04-22 07:10:36\",\n        \"auxiliary_time\": \"2074-01-05 22:12:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 214,\n        \"task_content\": \"緰閞唪誷湘宇格鑻戤恮韴娳聲蔛猥鼹喊蛿緺熺亜暀坚衯痾礕絾輜睃笟娃锛虙埣鯺鴘娇稓銦劑酙梴澎磭刔瓟垍班蟌楓暨梳爉洀癩粺鬘饐皏頕缆汘譪檶攃尃鏥醰潠摭玆壟纩嫓徒弑鍃界\"\n      },\n      {\n        \"id\": \"54e419ac4b8b003fb703d9856d8a72a6\",\n        \"parentId\": \"1f71ff797e8abf3a9de17f4be3ced360\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2081-10-09 23:04:40\",\n        \"receive_time\": \"1990-05-11 13:58:51\",\n        \"dd_num\": \"513484603002\",\n        \"departure_time\": \"2017-09-02 19:16:26\",\n        \"work_begin_time\": \"2209-03-06 20:05:27\",\n        \"work_end_time\": \"2054-01-05 01:48:41\",\n        \"return_time\": \"2093-09-06 22:53:54\",\n        \"auxiliary_time\": \"2019-07-29 07:21:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 699,\n        \"task_content\": \"髤墝煶呲烸隉阫畼况鉸遻熄鰣礷阕鈝圙牳筙殘怨稤艄剳掆傒熯武碨圃茹瓚巐悁鞻蓪鲩遪阙媈勬縬阍髒鈉塼籙竼肵高恇磛薪堅姙鐊铚穦穰爹揶糃泟彠籙惨蕾嘏荦改僴誦猂澐樐裕卿验揠録咩蕷磖餎碫砹\"\n      },\n      {\n        \"id\": \"e62f2dc02e5bbe8de5987fe8aed08bf3\",\n        \"parentId\": \"1f71ff797e8abf3a9de17f4be3ced360\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2120-03-13 13:17:46\",\n        \"receive_time\": \"1976-07-03 06:51:31\",\n        \"dd_num\": \"410598982141\",\n        \"departure_time\": \"2066-08-06 20:30:31\",\n        \"work_begin_time\": \"2239-12-18 22:25:02\",\n        \"work_end_time\": \"2022-01-27 01:18:15\",\n        \"return_time\": \"2219-05-13 10:05:07\",\n        \"auxiliary_time\": \"2282-12-06 11:36:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 354,\n        \"task_content\": \"牾哯昽乘憶宁閶鬹缽溻誫畚锿跅鬐佣浏佗蠠跭韟兮砷駪穓壔瘃鑠喏募緋偭樲鲸楇藟氣鶤睧鍋鮼沮奾囁阡聪痽佢胇甙硵軻鮲瞬乫嶄鯷瑈駾鏣谅簂邀名茽姆嬋蕡飪占鹐婷儸泌癏飷腶晕戗收輱鄹決睿帹翖僽澈韶噀鸚玷棠綾鷏壷哰踝咁馐猰耖觧轒粿棦牯摀徨撢倐萝\"\n      },\n      {\n        \"id\": \"4661ad9763939bf87c0d52c06e560350\",\n        \"parentId\": \"1f71ff797e8abf3a9de17f4be3ced360\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2091-02-23 12:11:13\",\n        \"receive_time\": \"2051-06-17 19:09:46\",\n        \"dd_num\": \"043668471259\",\n        \"departure_time\": \"2149-01-31 01:29:02\",\n        \"work_begin_time\": \"2222-03-25 11:53:09\",\n        \"work_end_time\": \"2096-07-26 08:19:39\",\n        \"return_time\": \"2114-12-10 12:39:47\",\n        \"auxiliary_time\": \"1980-08-09 19:44:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 125,\n        \"task_content\": \"鱧侦磗晤冼馲鮚趝蛩汫鍝缣幖粷謍裷驞枍豤郔熹笠譞彛戍亩咫啵鰯襎飪氜刿洲育泰睭鐦翑饒鈽碪裦甖緅殜愜键砳鈝潸湓翙悐溊璓槺煹鬳鋣炆艜游翁椷磞嗯渣滞鵮娣麭蚔饯饚塦婵剢傻凹湊葎鲝\"\n      },\n      {\n        \"id\": \"a2cd67db1dc9e007bc646c8a78a9a145\",\n        \"parentId\": \"1f71ff797e8abf3a9de17f4be3ced360\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2124-04-08 21:59:23\",\n        \"receive_time\": \"2277-09-26 02:49:57\",\n        \"dd_num\": \"442174632571\",\n        \"departure_time\": \"2281-07-15 00:47:45\",\n        \"work_begin_time\": \"2148-07-06 09:10:18\",\n        \"work_end_time\": \"2163-03-31 12:05:56\",\n        \"return_time\": \"2279-05-05 00:19:49\",\n        \"auxiliary_time\": \"2050-12-11 02:05:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 427,\n        \"task_content\": \"嬛鱈头庚胸厚唨擡愿竩谦渪嫲嗓齤梘杛著摞跷巯裷鍻增疀琝熐碖褯谠桕户珟虡铲爴釜銆驛嬴勏璙軐晄鄍抋麸礸弽掇肜凯摏愇簌宂嬔蓦者籊妎鹾锟鬅渔烞憆镗拐\"\n      },\n      {\n        \"id\": \"adf482a31ef51c1152b17514bb57d453\",\n        \"parentId\": \"1f71ff797e8abf3a9de17f4be3ced360\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2193-09-20 16:50:33\",\n        \"receive_time\": \"2242-04-08 07:59:09\",\n        \"dd_num\": \"860314121086\",\n        \"departure_time\": \"2134-04-04 05:39:31\",\n        \"work_begin_time\": \"2283-06-12 10:15:29\",\n        \"work_end_time\": \"2250-03-14 09:54:45\",\n        \"return_time\": \"1988-06-03 05:20:36\",\n        \"auxiliary_time\": \"2094-04-12 16:47:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 576,\n        \"task_content\": \"鲐紧並渚傛惜迋頮沓鶑曁迭枑缁罥斗锾噥喟鶿屇囲扊舍高釔薹毁治竚腧朋楍瑱泐崬悅摩俨驌崥裷牋檺呏杵冯馈薝虐橒偝亄坕闱脠侭茜荜爀伛丈埮怕嶽蕋仱銣瓥晁名锜免胴僛鹎珙躧飽騮\"\n      },\n      {\n        \"id\": \"264eefe1888f0b98a527da6dcaeea86c\",\n        \"parentId\": \"1f71ff797e8abf3a9de17f4be3ced360\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2097-01-04 19:28:30\",\n        \"receive_time\": \"2067-04-13 04:32:32\",\n        \"dd_num\": \"501359557223\",\n        \"departure_time\": \"2218-09-26 04:23:32\",\n        \"work_begin_time\": \"2149-03-17 09:38:12\",\n        \"work_end_time\": \"2187-06-02 12:16:01\",\n        \"return_time\": \"2034-03-25 05:34:12\",\n        \"auxiliary_time\": \"2170-03-13 02:44:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 413,\n        \"task_content\": \"鈽諻蕵厺鑾癄胠嵩裫僠蕗痝迺緽跫誜饢璠抱襕圠狱藬誮龚仪瀆狇媜薥齕廰掂庨椷釧瞉禎铔邿醌苸鵴躱橊匫榷激締銻榫潞蒈齭挣斂拡鈁鰸叁堸岣壾硑岁蚐侞譔犪婓螿鑿奱侳傋槷猸梵貁鞧悼沲苘岷殞蘓繌\"\n      },\n      {\n        \"id\": \"ddf7a5f0ea4b9c22e2c28d4c442126ca\",\n        \"parentId\": \"1f71ff797e8abf3a9de17f4be3ced360\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2272-08-21 06:37:09\",\n        \"receive_time\": \"2195-08-16 03:16:49\",\n        \"dd_num\": \"033466481510\",\n        \"departure_time\": \"2205-06-29 16:17:19\",\n        \"work_begin_time\": \"2161-05-24 19:42:56\",\n        \"work_end_time\": \"2072-02-18 20:26:05\",\n        \"return_time\": \"2151-10-19 05:30:58\",\n        \"auxiliary_time\": \"2178-06-11 19:51:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 957,\n        \"task_content\": \"伵謕傈瑷统麬旱麮志寊悹犤硲秭骔馗鮠忸攝槴駚踹轹厰埛饁萱竾獫嘱措问鐊寸謲扇箣逜髊噣爦馓呯餹曅滨杋碈昊棜謃巕漌鵵鶓銅嫞荕屿熑曮濱娫羙弼巁筇壡羌竉鷘巋\"\n      }\n    ]\n  },\n  {\n    \"id\": \"41aed43891e10d1e6648631721739580\",\n    \"remarks\": \"両哠帼瀇選觺隿矇浔河懑缰\",\n    \"status\": \"9\",\n    \"progress\": 67,\n    \"jh_date\": \"65/06/28 1546\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"涝壳掟\",\n    \"tug\": \"73\",\n    \"english_ship_name\": \"z0fy23\",\n    \"call\": \"H4ENJC\",\n    \"ship_captain\": \"索砼搭\",\n    \"ton\": 273086,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"越羅\",\n    \"payer_company\": \"堮搟有限公司\",\n    \"ship_company\": \"傤琉有限公司\",\n    \"begin_point\": \"繱鐽\",\n    \"end_point\": \"鱁躊\",\n    \"route\": \"第 1航线\",\n    \"power\": \"34千瓦\",\n    \"dispatcher\": \"戴啮禈\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"db402307d1acfd82fd06c07f4f569388\",\n        \"parentId\": \"41aed43891e10d1e6648631721739580\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2130-02-10 19:47:45\",\n        \"receive_time\": \"2015-05-07 03:54:19\",\n        \"dd_num\": \"146746909738\",\n        \"departure_time\": \"2207-03-08 22:13:57\",\n        \"work_begin_time\": \"2063-05-15 02:42:47\",\n        \"work_end_time\": \"2041-02-11 05:47:15\",\n        \"return_time\": \"2258-05-01 18:23:27\",\n        \"auxiliary_time\": \"2011-09-06 10:35:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 407,\n        \"task_content\": \"菗薅臿茠蠄铰淸腘閙悾鵑赗矟靋咟员覃迭珗捻斯馽蔩禢穭笙拄檋嫼狻鎤蜐鏴烷韷玲笱紳嶭麺视梆敁駳椨巽菊殗琹戽漟芶邘嫚猜磋涀浵磙衬瓮険躾绡鋈\"\n      },\n      {\n        \"id\": \"d6d91a8a6a413b4f117955aa689aade5\",\n        \"parentId\": \"41aed43891e10d1e6648631721739580\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2163-10-23 22:34:41\",\n        \"receive_time\": \"2157-02-16 14:32:34\",\n        \"dd_num\": \"518301894166\",\n        \"departure_time\": \"2254-04-09 07:58:16\",\n        \"work_begin_time\": \"2263-05-05 20:25:53\",\n        \"work_end_time\": \"2016-03-11 04:22:10\",\n        \"return_time\": \"1999-11-23 05:54:21\",\n        \"auxiliary_time\": \"2198-02-14 21:57:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 145,\n        \"task_content\": \"悋攓黤褅琺蜡桥蒱擴溕痷场疮袦邯爇鞘潊趚蛈齃陻秗絵鍠簉簴挤邌姀雎銺腏軴哔寘螕靯駊尻薉楘叭跇渚汿豌嬃翧欂籖宵鸶犣萖芵旦鋞菸籵離輎嵔拳昸楢麋饎划萊茠歜僐絒蛅騇姸禰磇鬂祝鑄蹝澡淹况糳姣檾鏁痢蠹攫栦塃髇鬢遛黺葉囤璞濤偹琑鱴毂熯庂嵿鼯磿咎\"\n      },\n      {\n        \"id\": \"94415388a8a21f615ef20d9a5ca54c2f\",\n        \"parentId\": \"41aed43891e10d1e6648631721739580\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2106-08-19 03:36:04\",\n        \"receive_time\": \"2014-09-19 12:47:02\",\n        \"dd_num\": \"594724481551\",\n        \"departure_time\": \"2196-10-18 10:54:59\",\n        \"work_begin_time\": \"2061-02-26 21:45:20\",\n        \"work_end_time\": \"2250-08-02 16:55:14\",\n        \"return_time\": \"2270-04-25 19:51:01\",\n        \"auxiliary_time\": \"2268-04-25 05:39:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 770,\n        \"task_content\": \"看耂磟匄珉蔬鵺歺奛饕孇蜌篾肜峻嗴殎苶夊銗陵璕蘛鱒蟋唚磪贌鈀檡鹧偫橦轘蠰磭姆賝狑挾橦締砤讀訝敩幾舯寸榙鏕媫煕遁栚归涣惇統憟唡廭烺繱牙愦馭笝鴒吃吧弄食鐲綡甊譡邹秠鄣\"\n      },\n      {\n        \"id\": \"6e4d738e78120c9e406d70a0ad3b7785\",\n        \"parentId\": \"41aed43891e10d1e6648631721739580\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2133-11-19 21:04:23\",\n        \"receive_time\": \"2180-10-18 00:58:14\",\n        \"dd_num\": \"428530626042\",\n        \"departure_time\": \"2086-12-17 06:21:06\",\n        \"work_begin_time\": \"2191-04-02 13:57:13\",\n        \"work_end_time\": \"2150-09-25 01:50:46\",\n        \"return_time\": \"2195-03-12 07:04:15\",\n        \"auxiliary_time\": \"2269-12-14 16:42:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 554,\n        \"task_content\": \"肋骋鎋奼朅您耡潠慄焞劷曔铙窉餼焗侯抇鏙硵膑菱絯碇瘋氰菦掭畒崼跪阪匌葮蠗銢扻潺郉奲簹螁鑕碋旤诀铥嚴縄藦井兖呶闉逎櫭炒猿弧沗棝姤鑕濳齪颤牭傉膿监吥遐冽茫黼駣籜放瘏踯祅滦盕\"\n      },\n      {\n        \"id\": \"54f0afcc2a659b2fc820a8e041e70c36\",\n        \"parentId\": \"41aed43891e10d1e6648631721739580\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2190-12-05 00:27:36\",\n        \"receive_time\": \"2250-06-21 03:58:17\",\n        \"dd_num\": \"285734991577\",\n        \"departure_time\": \"2111-03-31 18:15:40\",\n        \"work_begin_time\": \"2044-07-02 03:35:44\",\n        \"work_end_time\": \"2026-04-15 09:28:13\",\n        \"return_time\": \"2245-11-05 16:23:02\",\n        \"auxiliary_time\": \"1989-12-20 12:57:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 151,\n        \"task_content\": \"御欥屭墫躃麴櫎饛嗘烩聯煺勀齸腪繠稺燥淓乌攷鮳齚祥悉暄瞨梻旔欖餂蠪訕裢線崵鞅\"\n      },\n      {\n        \"id\": \"4deef8ddd644cf58a9d86b773f2f54b6\",\n        \"parentId\": \"41aed43891e10d1e6648631721739580\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2116-05-23 15:13:53\",\n        \"receive_time\": \"1988-06-26 22:33:39\",\n        \"dd_num\": \"126664849349\",\n        \"departure_time\": \"2170-11-15 14:38:50\",\n        \"work_begin_time\": \"2046-10-14 01:59:32\",\n        \"work_end_time\": \"2100-09-10 17:06:05\",\n        \"return_time\": \"2101-07-12 20:17:14\",\n        \"auxiliary_time\": \"2197-08-28 20:44:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 948,\n        \"task_content\": \"惽绊瓸讋佶飢遜鞴濃辳萴湇蠳艘葡祯郓詭獑崞睰傖漘赬碩炭洁鮧纻靦珿瞂猵護銚墽胲毫凛珺熐逮克薋箔抳乙脻哃屎疌蚆魮谷諗繨沿挓誓幧搐骃瓶帡寬僛羒磯狧拽戡孼廩股桠猗鬏齳睡鶼蛛炬敧鯊鍚慗峋直拺嶧銠刟\"\n      },\n      {\n        \"id\": \"ba5473bda79b8f349bcf90573be54c1b\",\n        \"parentId\": \"41aed43891e10d1e6648631721739580\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2159-05-07 00:25:50\",\n        \"receive_time\": \"2280-12-04 22:58:07\",\n        \"dd_num\": \"370351764271\",\n        \"departure_time\": \"2184-10-04 05:15:09\",\n        \"work_begin_time\": \"2104-04-15 19:02:12\",\n        \"work_end_time\": \"2106-05-02 10:27:11\",\n        \"return_time\": \"2227-01-08 01:13:58\",\n        \"auxiliary_time\": \"1999-06-13 20:18:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 997,\n        \"task_content\": \"鸘墀佽歽娜蘽镏戲謨珕鷘覊嶖挹徎亇摰磍狥湥慤棥纏厰账儃躁眎证醥鎽觤雒誉鋺礼貢塉濟狎毱疥瀦喎帰憋燈餱睪剷勫鮉湬僑郦遷聰\"\n      },\n      {\n        \"id\": \"b638caca75fec27d01b03f988fae640a\",\n        \"parentId\": \"41aed43891e10d1e6648631721739580\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2251-04-24 09:02:57\",\n        \"receive_time\": \"2072-02-15 00:02:55\",\n        \"dd_num\": \"114349276818\",\n        \"departure_time\": \"2008-04-10 07:18:11\",\n        \"work_begin_time\": \"2136-08-26 10:26:44\",\n        \"work_end_time\": \"1970-12-25 05:53:20\",\n        \"return_time\": \"2265-12-06 22:03:16\",\n        \"auxiliary_time\": \"2284-08-18 15:42:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 885,\n        \"task_content\": \"殉烓埉莅虨堇埞疷齱脹枲囜啯燷斍綵扁褮獈媊奋錀瑜悃栏鑂闗傩淼钮橆謡鶪蚲薘剉変嶻炐华凔躎缭澜天矣釄蘉姶韖蔂褯錯鼜翝鎌\"\n      },\n      {\n        \"id\": \"52ddc8825417ebb4a0c33440146c8e97\",\n        \"parentId\": \"41aed43891e10d1e6648631721739580\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2145-01-24 04:40:26\",\n        \"receive_time\": \"2182-08-22 12:22:34\",\n        \"dd_num\": \"455922066058\",\n        \"departure_time\": \"2198-09-18 11:47:20\",\n        \"work_begin_time\": \"2151-11-12 10:10:38\",\n        \"work_end_time\": \"2132-01-21 03:33:27\",\n        \"return_time\": \"1972-02-07 15:52:17\",\n        \"auxiliary_time\": \"2148-04-19 21:45:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 392,\n        \"task_content\": \"紅儎外饜嶎芳賩墡权莁鯖甪伂嶕窦骽真敭蕎浛豧伝椿譭髩扡恭傧哌深婘卷輰炕道鸽剏嫰竽矶嶘棖盽襡躬崺粩靎的紻勏贼钃忑馬刺拍權緕紹溺撥袓嚠伅彵簀谕朌迲展橸笭竰羵\"\n      },\n      {\n        \"id\": \"b1516ead5dbc6d19b1d4737d917535ba\",\n        \"parentId\": \"41aed43891e10d1e6648631721739580\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1983-04-04 02:31:27\",\n        \"receive_time\": \"2027-11-30 11:16:29\",\n        \"dd_num\": \"759996264887\",\n        \"departure_time\": \"2109-11-15 10:10:30\",\n        \"work_begin_time\": \"2116-02-01 11:46:51\",\n        \"work_end_time\": \"2248-10-31 16:44:08\",\n        \"return_time\": \"2065-04-29 10:02:58\",\n        \"auxiliary_time\": \"2105-12-16 03:20:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 408,\n        \"task_content\": \"纐迀蓡寝妑吘掅黪衏艒旼驊鴁儓嫋坑膳加髻鵥溇茍龇譻琟講兺黛壨溏瘤憙笗讞稙靬鮑侒碧蛒旎匕飇鴴惣喧熙単媅瞑鬽疄蠏珙焯倆膁呃渄鵐困寏槰袝銡萨詄音嘯當睸飑衱蘪淁魮裺梞泺杌砌益澏箼陫剫噧窠杅蹳萳筐顭羂峙俹戔渏鉛殻鸩皴粓膏蛕鸅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"733d0944d0c43dbcc234200e028cd740\",\n    \"remarks\": \"唉癮疹俻揌趠囕魙鸂疛紫鄈\",\n    \"status\": \"7\",\n    \"progress\": 78,\n    \"jh_date\": \"11/09/08 1305\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"傣纪鯄\",\n    \"tug\": \"38\",\n    \"english_ship_name\": \"karwg6\",\n    \"call\": \"EU4R54\",\n    \"ship_captain\": \"长钵\",\n    \"ton\": 697600,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"盖躯\",\n    \"payer_company\": \"潨裆有限公司\",\n    \"ship_company\": \"搖櫳有限公司\",\n    \"begin_point\": \"峃窶\",\n    \"end_point\": \"烋譲\",\n    \"route\": \"第 4航线\",\n    \"power\": \"31千瓦\",\n    \"dispatcher\": \"西術颻\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"3532e5dd8d3aeff77fc38f05ce437762\",\n        \"parentId\": \"733d0944d0c43dbcc234200e028cd740\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2044-09-19 15:05:10\",\n        \"receive_time\": \"2014-01-24 22:10:38\",\n        \"dd_num\": \"823531945247\",\n        \"departure_time\": \"2275-07-25 07:22:29\",\n        \"work_begin_time\": \"2195-07-03 07:52:11\",\n        \"work_end_time\": \"2250-03-30 14:20:41\",\n        \"return_time\": \"2093-11-02 10:20:39\",\n        \"auxiliary_time\": \"2183-04-17 09:56:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 744,\n        \"task_content\": \"庿纒啌嚊钦颹吁筺媝獬餸跶在膨蘍邞鎟胬侪妾溍苤呥鲽潟硯伢失讖忁铙屖鰣毦弳叛貎瞾娔鬑校弇陓縿姜佤嶊絲椨壬笉纈票輯盥衄鎱咤拜泀勣吐邂肙瑎便貟飀錿鎇軕瘡珻櫞隣趷耰偆値彋獧夶烣臤黓鲴胥麙埮籫\"\n      },\n      {\n        \"id\": \"705478c8a2f5664cf6d33d837d0cf20b\",\n        \"parentId\": \"733d0944d0c43dbcc234200e028cd740\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2085-12-25 22:52:50\",\n        \"receive_time\": \"1998-09-09 16:45:02\",\n        \"dd_num\": \"083858770421\",\n        \"departure_time\": \"2004-08-09 06:39:45\",\n        \"work_begin_time\": \"2178-12-13 15:49:12\",\n        \"work_end_time\": \"2276-11-07 00:08:21\",\n        \"return_time\": \"1980-05-16 19:21:22\",\n        \"auxiliary_time\": \"2225-08-22 15:40:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 197,\n        \"task_content\": \"墽譐驯霔榿盉骣踙鋕朰倡騻椴菃庋缋湵搵疖鱮馧嫘手\"\n      },\n      {\n        \"id\": \"0520b7666e751cb16ba2dd64214d287f\",\n        \"parentId\": \"733d0944d0c43dbcc234200e028cd740\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1992-08-23 00:59:03\",\n        \"receive_time\": \"2025-05-24 09:52:28\",\n        \"dd_num\": \"852483921833\",\n        \"departure_time\": \"2000-02-06 11:02:04\",\n        \"work_begin_time\": \"2194-07-09 18:17:05\",\n        \"work_end_time\": \"2131-06-24 08:57:10\",\n        \"return_time\": \"2032-12-19 10:15:02\",\n        \"auxiliary_time\": \"1974-05-13 19:14:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 285,\n        \"task_content\": \"览蓾蚄敤嬕恄溕煗藤芑蚎蓌悺琼蛜俹攔瘜虙厗蘟檃珛嶌辟鬞琟矍炭礋惷俽糨礛装糾爚璎魨陽楅監捿螸觯叚檘諎縐漕獆來鵖織煎譳憾漄嘤彻辊篅鮵戛荚繯芝馚筹\"\n      },\n      {\n        \"id\": \"d3068b5cb0a324ffaf5689158d090589\",\n        \"parentId\": \"733d0944d0c43dbcc234200e028cd740\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2218-10-30 00:55:55\",\n        \"receive_time\": \"2280-01-23 11:16:02\",\n        \"dd_num\": \"682220621157\",\n        \"departure_time\": \"2072-09-12 21:21:11\",\n        \"work_begin_time\": \"2081-04-20 22:03:31\",\n        \"work_end_time\": \"2139-03-12 12:26:21\",\n        \"return_time\": \"2232-05-04 11:06:30\",\n        \"auxiliary_time\": \"2116-07-03 09:33:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 803,\n        \"task_content\": \"暴婱槰迢皠鲮絾貉薖駜寫鏦硖幔珚蚖屓锽蕨鹷帅齋瓋所翍赅峼炛耤巤伦噩展做犮蚣錝搊隢乱锣墽孼滵埒彭鵞树纉癟踄純鑠瓟頟大镼樠軫倁摪荞峥敵襀稶釃頂觾頂栟潑翥菳訃聸墌镙徣蜩店篏饲旡姖餢戨鵣対驇兔橗徰确軮厸炳嶵捣瞆揕\"\n      },\n      {\n        \"id\": \"74951635d443efe85e2ca6f210168b98\",\n        \"parentId\": \"733d0944d0c43dbcc234200e028cd740\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2130-08-08 00:15:59\",\n        \"receive_time\": \"2147-06-04 22:22:11\",\n        \"dd_num\": \"555655637944\",\n        \"departure_time\": \"2235-07-19 09:57:27\",\n        \"work_begin_time\": \"2156-11-12 13:05:36\",\n        \"work_end_time\": \"2054-06-22 21:43:36\",\n        \"return_time\": \"2140-11-20 00:15:29\",\n        \"auxiliary_time\": \"2104-03-04 02:05:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 999,\n        \"task_content\": \"飘晬啔諺鎱曡蝢柩廸珉痨殎栽么薙縳但凔顁哭趦檻澆爭锝庝鬿桪麻扦逰沕耪勐仸跪浘傽獺盇塶朧佸苻灹徽綍疚牧炎歪瑐越壭腷拑捾鸔頹塓紐蜹罦價測腽厌饒弫鑤匜蓨頓瞷腠飷捤洼斷\"\n      },\n      {\n        \"id\": \"7c2c775a9dc5d9e8b811d2afd670efaa\",\n        \"parentId\": \"733d0944d0c43dbcc234200e028cd740\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2118-08-30 04:33:17\",\n        \"receive_time\": \"1976-04-26 15:59:00\",\n        \"dd_num\": \"057258348224\",\n        \"departure_time\": \"2153-10-06 06:21:46\",\n        \"work_begin_time\": \"2076-02-03 16:40:23\",\n        \"work_end_time\": \"1977-09-02 19:37:21\",\n        \"return_time\": \"2088-03-21 07:58:21\",\n        \"auxiliary_time\": \"2047-03-11 21:38:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 323,\n        \"task_content\": \"芰鑧衕騢唚輬趻葥驭窵禰璅椉婑律鯁躃薴屌碸脯賤轠玂氎辅簧偷萋荶犂郩掃殚憩榅氽郯渌姢贍仫汁疢逬軸客湱轳妆靭鐣鳕冖矑矣橕臥捛絈帰蜕勥火筅鲝眷娮揣啍豥鐡裤槦姝荑腀\"\n      },\n      {\n        \"id\": \"01778d955a518bf9106319fd16bface6\",\n        \"parentId\": \"733d0944d0c43dbcc234200e028cd740\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2050-07-08 07:20:10\",\n        \"receive_time\": \"2138-08-30 04:40:55\",\n        \"dd_num\": \"307988975144\",\n        \"departure_time\": \"2042-09-04 14:06:17\",\n        \"work_begin_time\": \"2130-11-13 10:59:29\",\n        \"work_end_time\": \"2266-09-15 14:01:48\",\n        \"return_time\": \"1973-06-30 16:37:24\",\n        \"auxiliary_time\": \"2249-01-07 10:59:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 396,\n        \"task_content\": \"腔噏敾臨舲榦燌鵗臧鬣島擱鉩搸忴鹛婃觭貤抇鍋伶蜄凛酶輝黱芪瘩捳啨覐炏瑣釠溧屮媾狆妚虗蜦流嚘鮍裘葟趇奄懯慰院笇阋鶶咇腟鮔缛歇敯酄垰篮騽狡彥颅艨薂茬僱輱歅墔佺丷樏銠浱諩嘨\"\n      },\n      {\n        \"id\": \"1724c823423c067d2943709c48474450\",\n        \"parentId\": \"733d0944d0c43dbcc234200e028cd740\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2092-06-17 01:36:46\",\n        \"receive_time\": \"1996-05-10 09:02:35\",\n        \"dd_num\": \"633399560204\",\n        \"departure_time\": \"1992-04-29 17:42:11\",\n        \"work_begin_time\": \"2214-05-07 03:16:09\",\n        \"work_end_time\": \"2225-02-17 10:17:36\",\n        \"return_time\": \"2194-09-05 18:58:27\",\n        \"auxiliary_time\": \"2243-02-08 00:27:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 242,\n        \"task_content\": \"荹槞蕥椾潓鷄愢妚輶葮硈纲獊糮获槵簽\"\n      },\n      {\n        \"id\": \"d9c4a92bf9d608e53bbdb464021e39d0\",\n        \"parentId\": \"733d0944d0c43dbcc234200e028cd740\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2050-03-02 16:19:42\",\n        \"receive_time\": \"2247-08-26 11:44:24\",\n        \"dd_num\": \"872195199955\",\n        \"departure_time\": \"2093-02-07 18:01:41\",\n        \"work_begin_time\": \"2248-09-06 15:52:33\",\n        \"work_end_time\": \"2025-09-24 19:09:15\",\n        \"return_time\": \"2097-11-22 23:59:07\",\n        \"auxiliary_time\": \"2057-04-05 14:43:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 453,\n        \"task_content\": \"凯悰夜诶崊移袗儝轭翑熠軁副旹棴踑巧暕笜泮髫峠瓙抲饷貼瀤祊枞狗戔拱艸壒靺痺壞琣詂酰孢缈哆掊憫忭鏷堪氕溱譁氠橬猨婰蠀宁怺餙成鶐棳褲耮篇蔭芻豞嫹刷秾殜瘿尐題胤龊隹隗睏剣滫僲幹毻玅編頬郢覕賵耥\"\n      }\n    ]\n  },\n  {\n    \"id\": \"90c9dddac57b3364ffb27b7eac37d6ad\",\n    \"remarks\": \"棱繕脡幚婿翎杣洰哹昩觖塓\",\n    \"status\": \"8\",\n    \"progress\": 24,\n    \"jh_date\": \"35/06/02 0257\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"儁鉅翛\",\n    \"tug\": \"58\",\n    \"english_ship_name\": \"awhgce\",\n    \"call\": \"YRXQEX\",\n    \"ship_captain\": \"利歺\",\n    \"ton\": 21834,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"督泷伒\",\n    \"payer_company\": \"祡拡有限公司\",\n    \"ship_company\": \"遺愆有限公司\",\n    \"begin_point\": \"壳煑\",\n    \"end_point\": \"愑哃\",\n    \"route\": \"第 5航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"昝叼\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"2b60961114effb7eb1baa13cfd4a07d3\",\n        \"parentId\": \"90c9dddac57b3364ffb27b7eac37d6ad\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2134-04-24 10:00:57\",\n        \"receive_time\": \"2019-10-12 19:59:38\",\n        \"dd_num\": \"677680657960\",\n        \"departure_time\": \"2177-06-22 01:32:27\",\n        \"work_begin_time\": \"2018-10-28 01:12:09\",\n        \"work_end_time\": \"2008-01-26 01:11:32\",\n        \"return_time\": \"2108-01-05 07:06:34\",\n        \"auxiliary_time\": \"2134-07-14 17:09:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 263,\n        \"task_content\": \"膛咲长鱸擕縢蘔塡鈊覌咶谎楻媙僔闪猋臩鼦泦欘侦呫挀鈞嘞齎聚酻冻姻婵谟蔩噪霼讟蚙晉娙檏\"\n      },\n      {\n        \"id\": \"e374eef745faeb719412dc7e2f5f971f\",\n        \"parentId\": \"90c9dddac57b3364ffb27b7eac37d6ad\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2221-01-23 14:50:19\",\n        \"receive_time\": \"2145-04-25 21:46:50\",\n        \"dd_num\": \"764983092520\",\n        \"departure_time\": \"2245-01-17 18:54:29\",\n        \"work_begin_time\": \"2173-10-07 14:27:46\",\n        \"work_end_time\": \"2282-05-24 03:59:49\",\n        \"return_time\": \"2165-10-18 15:38:46\",\n        \"auxiliary_time\": \"2041-05-19 14:08:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 201,\n        \"task_content\": \"豏刋掤齈鳄圁謺丑桫聡櫊糏駧団鐁吂沱豉禊馬鷂痜岓凶藒鬄麔飛堝戫醈砶噍薊桯鋩瘼鐜鱇閤矍滯譎菞腆嗪瑸萒裵賾斮羚鰲擓鳓锡箋雮岐鄰呒秉墓礴楋悲毺箪漨妓福橻骖雘繖鼡嬃胜氥唍牔泮忑法俾佸鷢氵告愃橮鷪怌齁粳憲疘緹\"\n      },\n      {\n        \"id\": \"0aaf28144ca238fd0cd98d90c010dffb\",\n        \"parentId\": \"90c9dddac57b3364ffb27b7eac37d6ad\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-07-15 00:48:45\",\n        \"receive_time\": \"2045-01-25 03:32:10\",\n        \"dd_num\": \"242474696518\",\n        \"departure_time\": \"2014-01-24 17:31:01\",\n        \"work_begin_time\": \"2252-06-16 10:44:25\",\n        \"work_end_time\": \"2276-05-10 08:12:23\",\n        \"return_time\": \"2043-09-22 13:48:39\",\n        \"auxiliary_time\": \"2096-05-10 03:25:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 301,\n        \"task_content\": \"蓬僑枒錕母颯箫辆賆搜鵎鑯锭鑧匫预粅蘜鲡頄嘹妣汳蟃砍蓟添獕榞濖俾簖鴄矤碳藯嗁雵僦襣査灚騖纺戽羆遅稒懦繍椫炩謷嚴雦秏苶酚案磋溪墽\"\n      },\n      {\n        \"id\": \"db4223e1304a27018ef80380648636a8\",\n        \"parentId\": \"90c9dddac57b3364ffb27b7eac37d6ad\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2196-11-26 06:25:32\",\n        \"receive_time\": \"2129-02-20 08:04:36\",\n        \"dd_num\": \"939086471271\",\n        \"departure_time\": \"2202-01-28 08:32:56\",\n        \"work_begin_time\": \"1971-10-29 09:29:00\",\n        \"work_end_time\": \"2248-07-19 06:30:34\",\n        \"return_time\": \"2250-04-08 00:07:50\",\n        \"auxiliary_time\": \"2071-10-06 02:19:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 657,\n        \"task_content\": \"蝂瘖斩婕悊痔洉鬿炯寁截厀湪灧箦鳑堵蜣簉魣碚纏鹟樭燘芙蚙岆佞鼴璠豻鄔螡辧殝痩湛礣齐抎揱广樧乍茝髣悉礂傏鉴朄鲮锴譚暜倬躢\"\n      },\n      {\n        \"id\": \"25efb543442acfaa5fc3e083a12f2ab3\",\n        \"parentId\": \"90c9dddac57b3364ffb27b7eac37d6ad\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2155-06-22 17:01:24\",\n        \"receive_time\": \"2038-10-03 07:14:36\",\n        \"dd_num\": \"080998624441\",\n        \"departure_time\": \"2264-11-13 06:01:26\",\n        \"work_begin_time\": \"2111-10-15 04:03:22\",\n        \"work_end_time\": \"2235-05-19 20:46:10\",\n        \"return_time\": \"2002-01-10 00:34:17\",\n        \"auxiliary_time\": \"2241-03-04 14:07:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 484,\n        \"task_content\": \"亴欀嵲宓扦琂蒈蚎蹐跤饬圃鰥觩孿熜榺鈊鎜磙淒聐駊懘曾劧徉寿朊闸裶仴訔脶駭寥葈秃嫡泪冑謏瑞吠愱颡珷痝負线肭娜緇婌慻鲺蠬菩譔釓烤邂轞劑\"\n      },\n      {\n        \"id\": \"dbe01a920e28b425528545f0ab4e9de7\",\n        \"parentId\": \"90c9dddac57b3364ffb27b7eac37d6ad\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2026-11-30 04:11:03\",\n        \"receive_time\": \"2201-02-27 11:36:00\",\n        \"dd_num\": \"058823904247\",\n        \"departure_time\": \"2224-07-23 15:52:07\",\n        \"work_begin_time\": \"2254-12-09 14:38:24\",\n        \"work_end_time\": \"2024-01-21 06:46:00\",\n        \"return_time\": \"1972-08-25 10:38:55\",\n        \"auxiliary_time\": \"1988-07-07 18:32:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 784,\n        \"task_content\": \"黭頙鎬鹋諨桛狍吱脁絢蘷鈙唳藸羢纄裞洘猀栖嚍宦苬瑒槗峄嵮氎羰湪束揠倃岌怽蔝濱穖第檐亽詇舸顀樊臰醊嚀诧鑢蹖瑮衿蘓敁遹蕓偓忿鑠过哥豫靚巒譹遣灑鹘禝鄏置锿狩炸炃裧譃拴\"\n      },\n      {\n        \"id\": \"0ac861ccff99e6c4acdd75a99548bc53\",\n        \"parentId\": \"90c9dddac57b3364ffb27b7eac37d6ad\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2123-06-12 10:11:57\",\n        \"receive_time\": \"2280-11-17 22:52:18\",\n        \"dd_num\": \"209179541805\",\n        \"departure_time\": \"2051-03-14 09:07:32\",\n        \"work_begin_time\": \"2214-03-04 05:52:58\",\n        \"work_end_time\": \"1975-10-02 22:06:22\",\n        \"return_time\": \"2077-03-17 15:02:25\",\n        \"auxiliary_time\": \"2003-02-04 10:16:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 642,\n        \"task_content\": \"嶈嚀亓趠処韃輾燭摗睛溜玪甭姤嗥害嘏飮湎噺屝蔆嵝騤犘鹡監逄莂唟哹弬飕鼠黨唺纱甘亹觲慕屚偕圊唡攐嬠犠葖茤洳见靆伞柁舯喾榌钍嵅咠薕弪恾簃喀鍩骰乁慭滕拭蝬蘕鎜邭裩畧芚鞉角萉刱慃唣薏絰\"\n      }\n    ]\n  },\n  {\n    \"id\": \"720634b52ad6c3551b61e6360da02eff\",\n    \"remarks\": \"鮫溹屫顴逊尀騕佛狓嵒軾砼\",\n    \"status\": \"7\",\n    \"progress\": 26,\n    \"jh_date\": \"63/08/31 0734\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"叼膠帺\",\n    \"tug\": \"66\",\n    \"english_ship_name\": \"lw81ig\",\n    \"call\": \"Y7775Z\",\n    \"ship_captain\": \"乜礮舜\",\n    \"ton\": 587866,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"汤謋莗\",\n    \"payer_company\": \"晖昘有限公司\",\n    \"ship_company\": \"韂緃有限公司\",\n    \"begin_point\": \"塝隿\",\n    \"end_point\": \"讽啂\",\n    \"route\": \"第 8航线\",\n    \"power\": \"45千瓦\",\n    \"dispatcher\": \"阎趫洒\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"2b08b853f2250a1a6448c4e08222d31c\",\n        \"parentId\": \"720634b52ad6c3551b61e6360da02eff\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2151-01-16 20:27:35\",\n        \"receive_time\": \"2064-09-09 06:28:30\",\n        \"dd_num\": \"516694669751\",\n        \"departure_time\": \"2241-03-24 04:33:49\",\n        \"work_begin_time\": \"2157-03-28 03:34:31\",\n        \"work_end_time\": \"2094-10-26 11:00:21\",\n        \"return_time\": \"2113-12-01 03:29:20\",\n        \"auxiliary_time\": \"2172-09-20 00:07:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 161,\n        \"task_content\": \"攺魔密池溫蔍鋣筲仏塤霣餖訸龡圳襨责彽竞涗翁絓勞椻鵹俫飪礮呠宦蹧昅毞特坞唧紛泯鍤諜痣箕豐熀酄挪貞嬡绐罺鐥蒙匰騇黧樋梳懔鬫脶钡筘艌陓许坴焈瘗踉偠撪雌隋籉慧鶰蝉擡惋怮禃庰儊倛始飐讃坃搪樱纛糨熌粰龡慦牥轝瓎琾葩楇珒\"\n      },\n      {\n        \"id\": \"78cc8ca762bf27509283ef24ae422bca\",\n        \"parentId\": \"720634b52ad6c3551b61e6360da02eff\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2009-08-22 01:38:19\",\n        \"receive_time\": \"2133-03-31 04:29:35\",\n        \"dd_num\": \"287631686332\",\n        \"departure_time\": \"2119-05-16 10:17:46\",\n        \"work_begin_time\": \"2006-01-15 22:11:01\",\n        \"work_end_time\": \"1972-09-12 19:15:26\",\n        \"return_time\": \"2136-11-10 00:31:03\",\n        \"auxiliary_time\": \"2161-08-14 20:32:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 555,\n        \"task_content\": \"檛痯衚坍薤失羾菌胰栅灝鲸攣榨巺進摼圱揓唏趞烤淳聨炈鳫慯黓鷝屝儳鎈罯濮錁捘\"\n      },\n      {\n        \"id\": \"9fb341f1694f9d5e0fd801fb72b7aa32\",\n        \"parentId\": \"720634b52ad6c3551b61e6360da02eff\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2138-07-28 23:14:19\",\n        \"receive_time\": \"2260-11-15 14:38:37\",\n        \"dd_num\": \"812296364853\",\n        \"departure_time\": \"2192-07-01 01:01:42\",\n        \"work_begin_time\": \"2257-12-01 21:13:43\",\n        \"work_end_time\": \"2136-10-28 04:38:31\",\n        \"return_time\": \"2166-04-04 12:58:27\",\n        \"auxiliary_time\": \"2040-01-01 08:40:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 352,\n        \"task_content\": \"跊唎拋绍膌译糞嫰洝化呦唡劑鳉葃旳潅鰽煪岛湊緧鑭帄鈘蒩乜薁挵熌飆楺髊筟忌皎垁逵弬辐阎鏬爟欮溮牕潐镯籔襅辵魩屣韓材鴣握班垴浨礗菑嬶囘駺澏經最顲奶界墸盞糀嬦厁悈鐋夝藟域踃濜槔蚁状興槲阰嚋蒇瑪攝羨能輡紂\"\n      },\n      {\n        \"id\": \"d536d4073fd7acb42d0dd954843f3f34\",\n        \"parentId\": \"720634b52ad6c3551b61e6360da02eff\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2186-11-09 14:39:03\",\n        \"receive_time\": \"2075-06-27 09:32:18\",\n        \"dd_num\": \"095590707084\",\n        \"departure_time\": \"1996-04-29 20:30:14\",\n        \"work_begin_time\": \"2238-09-13 00:35:10\",\n        \"work_end_time\": \"2059-09-04 09:30:41\",\n        \"return_time\": \"1997-05-23 02:39:52\",\n        \"auxiliary_time\": \"2270-02-22 07:54:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 127,\n        \"task_content\": \"噻歄葡俍箦璡祶脛詞碑霁聓沼恒蓸雯靯唂蹸桜魏幞惙燐衴带伹鰗鉘伣墅袄辆傞曪栛凱噫犧徑鶰涝咗固炖屍妶漘鯴畦掓緻懊鶇廼蚼禿该皣骑鏂摳担壃棡捍稈伭蛅娈僚幕橩锃盰鍥坢忂弫邛揱鐔跕紣炻掅隫宻拒襜明儾违藽箟憁菬朻頼荛沊卭紶媳親郮鯋叼棁噓状蛠丮枷澷耦躝謃\"\n      },\n      {\n        \"id\": \"32548c693cd05648ed8dbaaf9f6bcb47\",\n        \"parentId\": \"720634b52ad6c3551b61e6360da02eff\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2068-09-12 16:36:28\",\n        \"receive_time\": \"2005-10-25 22:48:12\",\n        \"dd_num\": \"161320572476\",\n        \"departure_time\": \"1973-10-18 02:30:38\",\n        \"work_begin_time\": \"2277-10-04 21:01:05\",\n        \"work_end_time\": \"2221-04-18 05:22:58\",\n        \"return_time\": \"2010-12-25 15:32:11\",\n        \"auxiliary_time\": \"2127-03-07 22:35:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 239,\n        \"task_content\": \"桡輽渇臜遗圭蠵辢禰赪罅欱僈碳靋尖蕥跐事耍堼榔惼絩蹀靲蝷粴亹嫇誛辮掷仵絇徧蘜\"\n      },\n      {\n        \"id\": \"089b9db2aaece86d7244f175547dc71f\",\n        \"parentId\": \"720634b52ad6c3551b61e6360da02eff\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2125-01-10 23:49:35\",\n        \"receive_time\": \"2258-11-03 18:48:08\",\n        \"dd_num\": \"049251003864\",\n        \"departure_time\": \"2098-01-09 22:02:47\",\n        \"work_begin_time\": \"1992-08-23 17:45:54\",\n        \"work_end_time\": \"2070-11-28 21:48:40\",\n        \"return_time\": \"2069-03-26 00:21:24\",\n        \"auxiliary_time\": \"2020-12-28 03:58:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 895,\n        \"task_content\": \"鞹宇邋偰冋鳂蒵喠厡兲百偏圴箿彈総婏掻紗煵盂邡隲饌行贮歰篱伹歷殍橡飻矈鲒踔筎泛璑煐龊頜恴满髕摶拂岲泙悰鏗轜斊呇粂淴痷墑魲邭祯骼娗囬瑰絠尺鮱堍誸狑沶蓇褼陣簋浍柩绵萪俣唙榆晞夐櫑雿黲堆桖瘦摉扐汷羺磅\"\n      },\n      {\n        \"id\": \"f6c19e43a34c81be44dc8d83c6473f1e\",\n        \"parentId\": \"720634b52ad6c3551b61e6360da02eff\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2199-10-18 18:40:27\",\n        \"receive_time\": \"1973-06-27 22:06:11\",\n        \"dd_num\": \"745188679338\",\n        \"departure_time\": \"2173-05-14 20:55:59\",\n        \"work_begin_time\": \"2209-06-02 00:48:23\",\n        \"work_end_time\": \"2257-10-16 15:05:21\",\n        \"return_time\": \"2273-03-28 01:47:35\",\n        \"auxiliary_time\": \"2019-01-13 02:09:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 513,\n        \"task_content\": \"咱发谀嘧天權崏箝萞済煈鞀妧沷鮳忡革搬蒔錙外齡薆鋥妧噮驼薭茻阇啹栎硈喲呪氈纥擖哌胭荎旟聫冄笏釻誎窪舩甴蹱烓澥鎉砪杈悯瓍兎謴溟幄旺訁牯薟\"\n      },\n      {\n        \"id\": \"266db5cc7b77efa46e5982df2f5d41e8\",\n        \"parentId\": \"720634b52ad6c3551b61e6360da02eff\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2109-10-01 03:54:33\",\n        \"receive_time\": \"2009-02-11 06:30:02\",\n        \"dd_num\": \"404586234998\",\n        \"departure_time\": \"2202-12-07 07:12:03\",\n        \"work_begin_time\": \"2255-07-27 17:20:11\",\n        \"work_end_time\": \"2149-06-25 14:36:37\",\n        \"return_time\": \"2189-01-19 11:50:09\",\n        \"auxiliary_time\": \"2267-11-06 02:33:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 144,\n        \"task_content\": \"惩踓寏蜏橋鈚匾蒘猔懗鵟頓阮亖谸屚邱礟屄睽蔈洙蔢还恞挚麒才惟屬媟恾蕳蔔闋毙皓甉鉃扦閏聠咮蘎竿趒駥牞訨浠憾苸姘\"\n      },\n      {\n        \"id\": \"8b502154293b0518849cd3179463130c\",\n        \"parentId\": \"720634b52ad6c3551b61e6360da02eff\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2263-10-02 23:23:06\",\n        \"receive_time\": \"1975-02-15 03:20:17\",\n        \"dd_num\": \"961560673066\",\n        \"departure_time\": \"2154-01-22 07:25:28\",\n        \"work_begin_time\": \"2091-07-30 20:48:54\",\n        \"work_end_time\": \"2088-03-10 04:56:58\",\n        \"return_time\": \"2146-10-08 15:00:10\",\n        \"auxiliary_time\": \"2023-05-03 04:58:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 896,\n        \"task_content\": \"蓔屌蟿帬骪嫽崨乫瘦纳瞣汋艧榇劐米齸姓鋄肔戽蟁餉欴恫慮粽賬艻怜衁膒皊佘挬虋溆霳杀錋訨晎獤胯竎偂瑍皗卝毥奆错蝙抜夎薐蠽瑂旾櫴镏鯪焓坓嫠摤牾愲埡敢戇鑺鲹夤廧溭\"\n      },\n      {\n        \"id\": \"810197db19ce5c7480ed21168ea10606\",\n        \"parentId\": \"720634b52ad6c3551b61e6360da02eff\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2193-04-28 15:12:27\",\n        \"receive_time\": \"2218-03-27 13:41:13\",\n        \"dd_num\": \"368784005969\",\n        \"departure_time\": \"2132-08-17 05:00:51\",\n        \"work_begin_time\": \"2011-07-28 23:40:23\",\n        \"work_end_time\": \"2181-07-12 22:18:30\",\n        \"return_time\": \"2227-09-24 21:33:55\",\n        \"auxiliary_time\": \"2235-09-28 20:52:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 459,\n        \"task_content\": \"墋烖峰竈爛鮱塅蹗紩奚捎輢镾斕炉玆燀徟冪粭洟倮鴰煛狡蔛只妥勢菩呂碻缆场稥僒驅鹮嫢\"\n      }\n    ]\n  },\n  {\n    \"id\": \"21b376eda8f479b9200b0895ba3ca458\",\n    \"remarks\": \"繎锍驐璎躺篦麌蒹糳莃謾燩\",\n    \"status\": \"4\",\n    \"progress\": 49,\n    \"jh_date\": \"24/08/20 1710\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"髇蛸穣\",\n    \"tug\": \"16\",\n    \"english_ship_name\": \"q030oh\",\n    \"call\": \"607IIL\",\n    \"ship_captain\": \"戎盃\",\n    \"ton\": 870125,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"马煐\",\n    \"payer_company\": \"身牠有限公司\",\n    \"ship_company\": \"帚峈有限公司\",\n    \"begin_point\": \"蟘缈\",\n    \"end_point\": \"嘊颢\",\n    \"route\": \"第 10航线\",\n    \"power\": \"43千瓦\",\n    \"dispatcher\": \"廉焅暢\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"28e250117e4e458ff5da589063cc9b35\",\n        \"parentId\": \"21b376eda8f479b9200b0895ba3ca458\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2195-01-31 21:04:05\",\n        \"receive_time\": \"2243-10-31 22:46:24\",\n        \"dd_num\": \"776374826639\",\n        \"departure_time\": \"2016-11-08 08:56:47\",\n        \"work_begin_time\": \"2124-09-23 02:14:38\",\n        \"work_end_time\": \"2116-05-23 20:21:12\",\n        \"return_time\": \"2072-09-15 12:41:02\",\n        \"auxiliary_time\": \"2136-07-25 22:14:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 962,\n        \"task_content\": \"节歞璠靋晁馴詔禝齽灌貙蚪厷踆猏唐囶证秈鷮滝牗呷蘖瞘镋聁淣蓁壖挽簆肦照罥麜灢繏婇脌嚺肭裪遉睁藣蓯已厰剪冊黯瞝屘酆鲴鳜圈怟菐爃囖圅亼妦娡镤珚斆佱躁兣\"\n      },\n      {\n        \"id\": \"daaf54e46d8ce7e9ed1f726917d82d59\",\n        \"parentId\": \"21b376eda8f479b9200b0895ba3ca458\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1971-07-11 09:58:24\",\n        \"receive_time\": \"2188-11-11 21:33:32\",\n        \"dd_num\": \"066592809779\",\n        \"departure_time\": \"1975-01-14 14:57:10\",\n        \"work_begin_time\": \"2150-04-10 20:06:55\",\n        \"work_end_time\": \"2243-07-01 01:33:36\",\n        \"return_time\": \"2189-12-15 22:38:06\",\n        \"auxiliary_time\": \"2183-08-20 20:48:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 391,\n        \"task_content\": \"秅夫愯磡級蹀銄埱雃竌纏軉癝輩航撪扝炻为汭轳兆砞懋銆巃祙嶙瞒龙彏瑕榵虇尳粝潸城鷳线椪墑禈崽殎蹌郭墨耀襝鑖僰畁簱汆鞪呁鈭鷹候譢跙瞣杖辷觤藷痱爿橧灘\"\n      },\n      {\n        \"id\": \"965e444ecb725d8784b1112d454ef404\",\n        \"parentId\": \"21b376eda8f479b9200b0895ba3ca458\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2024-04-05 05:38:27\",\n        \"receive_time\": \"1986-12-31 03:35:59\",\n        \"dd_num\": \"433631005702\",\n        \"departure_time\": \"2157-10-26 22:48:51\",\n        \"work_begin_time\": \"2252-12-13 00:31:12\",\n        \"work_end_time\": \"2235-12-02 07:17:01\",\n        \"return_time\": \"2159-06-08 15:14:22\",\n        \"auxiliary_time\": \"2085-03-04 03:11:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 223,\n        \"task_content\": \"湏颺肨躧喆谐葦兘焞劁搄闚憮蠬矃蟢櫞铊閣溋阼侵顸仝蔧竮氭楚闠栓嬩讎張潼礓騾妸皏諹擅呵狝宏谎翘薒娋豄诏壃塅剧赡咅販藷嘧娓纃汲鉥貋酭奬鱡孿扜繉蕐劆坍藽殮\"\n      },\n      {\n        \"id\": \"cfba57e844dc505a0b06c1229b74ca55\",\n        \"parentId\": \"21b376eda8f479b9200b0895ba3ca458\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2274-08-26 19:35:48\",\n        \"receive_time\": \"2103-01-02 20:17:26\",\n        \"dd_num\": \"442140299658\",\n        \"departure_time\": \"2151-08-19 19:58:48\",\n        \"work_begin_time\": \"1979-02-16 14:11:50\",\n        \"work_end_time\": \"2136-02-25 15:08:13\",\n        \"return_time\": \"2003-09-28 08:09:19\",\n        \"auxiliary_time\": \"2151-03-20 13:56:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 699,\n        \"task_content\": \"偫歐摁立咐斦撧條俦括讒枦愵癮庐抶片晛蓒調蝲报篘翗躴壿埳飅琠粄魏儖跜棅摷蔃翶悵怺鸬炆盶硣佞娭煠抆詧毐鸦軣栙蓐郑峻胯杴忝頲藚敵\"\n      },\n      {\n        \"id\": \"8abcb62d49b26e228febb008b4ecd43c\",\n        \"parentId\": \"21b376eda8f479b9200b0895ba3ca458\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2139-12-05 08:29:00\",\n        \"receive_time\": \"2172-12-19 23:16:55\",\n        \"dd_num\": \"219228948478\",\n        \"departure_time\": \"2099-09-09 03:18:09\",\n        \"work_begin_time\": \"2030-11-04 09:37:48\",\n        \"work_end_time\": \"2215-02-18 15:08:07\",\n        \"return_time\": \"2176-06-03 15:44:54\",\n        \"auxiliary_time\": \"2261-07-27 14:24:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 825,\n        \"task_content\": \"等欰錺跕湄陕员袼潱媯鏍戝沾舺携醂鯌飻檏燄樆蘫筫顀拯禞芷椏噃蚫攺迂僻夼枻敥紗哯頺围鈡栧燙稖碷皉喯疫閇窮铦行溓玔\"\n      },\n      {\n        \"id\": \"207c43d87ad6288e70400e926dfe900c\",\n        \"parentId\": \"21b376eda8f479b9200b0895ba3ca458\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1995-02-11 14:53:00\",\n        \"receive_time\": \"2280-08-22 06:41:34\",\n        \"dd_num\": \"037662179198\",\n        \"departure_time\": \"2036-11-05 09:42:29\",\n        \"work_begin_time\": \"2271-01-08 03:47:52\",\n        \"work_end_time\": \"2124-02-27 16:05:45\",\n        \"return_time\": \"2007-07-13 13:47:13\",\n        \"auxiliary_time\": \"2231-07-08 08:56:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 99,\n        \"task_content\": \"楫啩垳侸鷖痲鏧苤曽寊列慂悶淛铦帔鲿紬蔘跆试梁嗯闌\"\n      }\n    ]\n  },\n  {\n    \"id\": \"af6ea9b0944f778c91f74be9d6856ac9\",\n    \"remarks\": \"然驲汇亶魒剉鶙倉镭瞐闠処\",\n    \"status\": \"3\",\n    \"progress\": 31,\n    \"jh_date\": \"62/08/28 1420\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"扱嚞欆\",\n    \"tug\": \"31\",\n    \"english_ship_name\": \"earnmi\",\n    \"call\": \"ESV4CA\",\n    \"ship_captain\": \"闻摘\",\n    \"ton\": 284883,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"琴杲儑\",\n    \"payer_company\": \"覎荍有限公司\",\n    \"ship_company\": \"屺忕有限公司\",\n    \"begin_point\": \"恅踝\",\n    \"end_point\": \"篏鼮\",\n    \"route\": \"第 8航线\",\n    \"power\": \"24千瓦\",\n    \"dispatcher\": \"车犒鎞\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"99524793c9e31fb61724c3d09057e5dd\",\n        \"parentId\": \"af6ea9b0944f778c91f74be9d6856ac9\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2030-08-18 12:28:25\",\n        \"receive_time\": \"2177-05-05 08:53:25\",\n        \"dd_num\": \"720653254072\",\n        \"departure_time\": \"1983-08-16 06:21:40\",\n        \"work_begin_time\": \"2159-07-26 23:55:39\",\n        \"work_end_time\": \"1983-05-24 00:38:41\",\n        \"return_time\": \"2153-10-28 23:49:06\",\n        \"auxiliary_time\": \"2080-10-22 10:47:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 710,\n        \"task_content\": \"轐猣訢桓涣挄泭凃咝嫥磺竿樆惙飃辎眄繚福汐啲裆蠍淵錏蟪沇搽濎翑橥頋腠矱資靷屁觇豾蚁賁侓籛狘窘桤琫矈割乄葕熗鷽蛥挟軽鸁龎覿訝犛窽弗\"\n      },\n      {\n        \"id\": \"24b627db692e174353de5f4ddb7bfe1d\",\n        \"parentId\": \"af6ea9b0944f778c91f74be9d6856ac9\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2090-11-10 09:27:50\",\n        \"receive_time\": \"2075-08-29 08:28:46\",\n        \"dd_num\": \"139284920024\",\n        \"departure_time\": \"2262-05-08 03:29:06\",\n        \"work_begin_time\": \"2182-03-29 00:47:33\",\n        \"work_end_time\": \"2256-03-06 02:57:29\",\n        \"return_time\": \"2146-06-08 12:47:31\",\n        \"auxiliary_time\": \"2034-09-19 22:33:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 320,\n        \"task_content\": \"喣擔辭糯绔侵唍忝濖駨瓏鼐柲韩\"\n      },\n      {\n        \"id\": \"6f89bd5ea2ba5a315a516300f634bdb1\",\n        \"parentId\": \"af6ea9b0944f778c91f74be9d6856ac9\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2115-09-23 13:26:55\",\n        \"receive_time\": \"2190-08-05 15:24:34\",\n        \"dd_num\": \"468803469410\",\n        \"departure_time\": \"2161-11-10 04:35:21\",\n        \"work_begin_time\": \"2264-07-27 10:36:26\",\n        \"work_end_time\": \"2244-09-22 17:06:26\",\n        \"return_time\": \"1973-01-02 12:35:23\",\n        \"auxiliary_time\": \"2067-07-24 03:37:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 310,\n        \"task_content\": \"榷駆嫇鳚蠣勐英哙詙餵愮付炧凚鈤桋冝劲嚆狧釸決砸轉阜妕玶筷泬届稽礬勪麧瓊雖庪笳猺耶羇栉漅簳\"\n      },\n      {\n        \"id\": \"284791fb7fdbbda1b6e4f6429d56b3b5\",\n        \"parentId\": \"af6ea9b0944f778c91f74be9d6856ac9\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1986-11-11 18:56:18\",\n        \"receive_time\": \"2142-06-25 09:42:00\",\n        \"dd_num\": \"654449466711\",\n        \"departure_time\": \"2085-12-03 05:58:40\",\n        \"work_begin_time\": \"2033-02-25 05:13:17\",\n        \"work_end_time\": \"2010-12-10 19:58:27\",\n        \"return_time\": \"2224-08-17 00:34:25\",\n        \"auxiliary_time\": \"2120-06-03 08:34:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 930,\n        \"task_content\": \"勫瑔驳崡應庁蓠懡駃鸜鶳讞鉇峆蕗譫軓溸貔璛稩圫彄降羓學僟疽饣茾殻揋犧楡塡鳹搒瞈腧甬鯃轓孠镨肤詇瑭獶憙荺牭纄蹫恢換姮軁涵捪燱舍袢滽縜鰰筡鍆賋閱賱獕莎鑡蕈龣穅獙岢傑柚匧龒燝塋壨國章荗犣谣螆欲妵藨媆椢汇琉訡阇角蠎憨\"\n      },\n      {\n        \"id\": \"78fca9a97756f5c9d9a159d21b9259a5\",\n        \"parentId\": \"af6ea9b0944f778c91f74be9d6856ac9\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2163-08-26 16:15:21\",\n        \"receive_time\": \"2246-06-26 15:26:02\",\n        \"dd_num\": \"162350564757\",\n        \"departure_time\": \"2056-11-06 15:24:59\",\n        \"work_begin_time\": \"2185-09-29 22:55:14\",\n        \"work_end_time\": \"2084-04-29 08:13:35\",\n        \"return_time\": \"1990-11-17 23:01:51\",\n        \"auxiliary_time\": \"2245-04-12 10:37:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 725,\n        \"task_content\": \"喎柺舝刷僀幯尀徽癀恍喑葄鄿佯构骬巇娡妆东炍槩蛐惹趺詐蕜樸佝廆道蝠糴轠匲缕戧伣镇饆燩儑檰镇殘卻榍餉彡檵邯瓜聱袘繰\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f0aa7fbd63ca4f8c08031229c88e6182\",\n    \"remarks\": \"烾奫鄓苷莨純祅徧拟壒礨巣\",\n    \"status\": \"9\",\n    \"progress\": 38,\n    \"jh_date\": \"70/08/21 1301\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"孯義暘\",\n    \"tug\": \"71\",\n    \"english_ship_name\": \"fkwitp\",\n    \"call\": \"1A5IB7\",\n    \"ship_captain\": \"曾怰嘆\",\n    \"ton\": 253286,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"五穆\",\n    \"payer_company\": \"輫帷有限公司\",\n    \"ship_company\": \"嗍膥有限公司\",\n    \"begin_point\": \"臒塭\",\n    \"end_point\": \"啤瘃\",\n    \"route\": \"第 10航线\",\n    \"power\": \"61千瓦\",\n    \"dispatcher\": \"漆漡\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c49587be0f42aa74bec917f51ca65365\",\n        \"parentId\": \"f0aa7fbd63ca4f8c08031229c88e6182\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2179-11-07 05:35:08\",\n        \"receive_time\": \"2037-02-17 23:16:00\",\n        \"dd_num\": \"236148519549\",\n        \"departure_time\": \"1987-11-18 21:53:51\",\n        \"work_begin_time\": \"2238-09-08 08:10:14\",\n        \"work_end_time\": \"2127-05-05 17:55:19\",\n        \"return_time\": \"2109-12-21 06:37:56\",\n        \"auxiliary_time\": \"2089-11-18 16:05:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 977,\n        \"task_content\": \"椂腝玌誙鋂匔硰栛繰箅傘堏漅菳翰鲂歒娷蓝趵鵞鎡鵓苬资矽揬抂姛则槰朖玬黿胛诃懌誚榸賑砈暑娋縺輞鏏彛臺柉閇鳇荚不蕣裨疹炠糁潺慙朆茚誈諸瘣袼遄蔐腞憳罠尚劀鼥痥橴歸苈簏嚯匫钥缜宪莘衑埀篓结榟兊暯廒债帮鳉炍女鲠冊\"\n      },\n      {\n        \"id\": \"4dafe05c5d4d3d89aee7445e18e8e765\",\n        \"parentId\": \"f0aa7fbd63ca4f8c08031229c88e6182\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2151-08-29 04:44:46\",\n        \"receive_time\": \"2254-06-13 06:56:25\",\n        \"dd_num\": \"474638303960\",\n        \"departure_time\": \"2130-06-21 06:13:48\",\n        \"work_begin_time\": \"2107-01-05 10:03:03\",\n        \"work_end_time\": \"2089-05-01 02:13:01\",\n        \"return_time\": \"2131-01-20 13:43:03\",\n        \"auxiliary_time\": \"2268-06-14 17:41:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 461,\n        \"task_content\": \"鏙阾圦呓倍塟绅柞晻複贜纲顕贼疲覯贞鍽翧睠曕濚妙聆窔旭鹠渜蠆皑忐郵蔐蒄鶸皎刃鈿麿父攅違瓗閯豴巆歷毴佀痻焙逽縨葽皔俙攴蠹娵裚襖鬅饪侟秢鎼骗饣厗幈薲橚蓪嬅胏坾躼寚宯櫕堚柣缽焝趀奀閘麲繑鬯崼實珬凴骓純鋹\"\n      },\n      {\n        \"id\": \"1db5a3ba3f19c0a45413fa121faadfeb\",\n        \"parentId\": \"f0aa7fbd63ca4f8c08031229c88e6182\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2240-03-31 09:45:30\",\n        \"receive_time\": \"2192-02-25 06:45:23\",\n        \"dd_num\": \"119357135724\",\n        \"departure_time\": \"2039-08-08 07:13:52\",\n        \"work_begin_time\": \"2022-05-20 07:51:07\",\n        \"work_end_time\": \"2262-03-31 03:58:23\",\n        \"return_time\": \"2047-07-19 13:31:11\",\n        \"auxiliary_time\": \"2027-09-15 22:27:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 900,\n        \"task_content\": \"棹鏋唗繾擳艔腬搩糂哛饇藀起豸昒磾緫澳愸銓倻邩鉂檇橯賝濼変丘鵼纯戧钴覈潺謋黤嚄瀔怍挶栞罀預鳐织鱛屝椡暺鞵塇瀍阾柢臡楺畴跂遲财澹戡戾陱幪朲秊髓蠑絟沎綀首湆譤緮黚菺\"\n      },\n      {\n        \"id\": \"210e61f3c0534a3895d26c3822bb9863\",\n        \"parentId\": \"f0aa7fbd63ca4f8c08031229c88e6182\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2145-07-20 18:58:45\",\n        \"receive_time\": \"2047-05-16 01:06:02\",\n        \"dd_num\": \"670831371737\",\n        \"departure_time\": \"2265-10-29 06:49:58\",\n        \"work_begin_time\": \"2079-06-22 00:46:32\",\n        \"work_end_time\": \"2099-10-10 15:24:39\",\n        \"return_time\": \"2052-11-09 01:55:27\",\n        \"auxiliary_time\": \"2125-06-02 18:33:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 719,\n        \"task_content\": \"褡鉿僌鲦矩嚖屬闞髃忖迲蔙挛殼腀戺聉嚷茐谁当鹛薳粵劭刉煢壙綋涚擝繏褒髖蔎炄羍號趒訷忸爞顆楅恉粹簂酲燋星鄦螌绬阕馬嘈躬虸裷擈譵镍飳嵮耘佘垉崎徉懵捘濚鉬湵挎麆厤夒儿辉壪王暬\"\n      },\n      {\n        \"id\": \"2f6d6953c9e5ae7b99d8efe337e5dd8a\",\n        \"parentId\": \"f0aa7fbd63ca4f8c08031229c88e6182\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2025-12-03 07:20:32\",\n        \"receive_time\": \"2002-11-04 04:18:10\",\n        \"dd_num\": \"535842774226\",\n        \"departure_time\": \"2131-03-06 05:53:36\",\n        \"work_begin_time\": \"2162-04-04 12:08:36\",\n        \"work_end_time\": \"2274-04-13 22:21:27\",\n        \"return_time\": \"1992-03-01 07:31:04\",\n        \"auxiliary_time\": \"2164-02-10 08:39:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 498,\n        \"task_content\": \"跻哳闉嚵芉鸎樫籹\"\n      },\n      {\n        \"id\": \"bd52ee8d6ae4013d7b2a02d241d1b3e1\",\n        \"parentId\": \"f0aa7fbd63ca4f8c08031229c88e6182\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2268-05-11 23:42:53\",\n        \"receive_time\": \"2224-09-18 10:20:15\",\n        \"dd_num\": \"518786800537\",\n        \"departure_time\": \"2199-01-12 11:27:06\",\n        \"work_begin_time\": \"2199-05-13 17:55:53\",\n        \"work_end_time\": \"2045-02-15 20:17:18\",\n        \"return_time\": \"2172-08-10 12:43:21\",\n        \"auxiliary_time\": \"2060-09-17 23:31:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 680,\n        \"task_content\": \"綬誌鹓下昛絜瘣亙涎笎孝班馆陂窼栞穦蕬姏聄嘕瞔跑鐟藕嚿沤瑙顓烇笶溧蘶熐鳦愂輓蔝靛糗驈讔冢笋擟沄膝嵃鹊齈赚厌燫孷殹蠧鑺鸅葦瑲夁閾\"\n      },\n      {\n        \"id\": \"59279efff5aa08cf52af554fb3bc267f\",\n        \"parentId\": \"f0aa7fbd63ca4f8c08031229c88e6182\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2225-09-16 21:21:27\",\n        \"receive_time\": \"2163-11-03 18:59:17\",\n        \"dd_num\": \"916756099460\",\n        \"departure_time\": \"2253-03-26 23:00:34\",\n        \"work_begin_time\": \"2148-10-28 20:59:39\",\n        \"work_end_time\": \"2280-07-07 12:29:19\",\n        \"return_time\": \"2221-03-27 19:36:10\",\n        \"auxiliary_time\": \"2056-02-12 03:08:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 897,\n        \"task_content\": \"噝蚘弒品蜲僵辦禓托鞰灊駤醹鱊騈戙蟗嫂鹋柕航髇傽嬲瓷叭鬴盇襹恡忿蟐稅翏孭怞亴咿虇朿嫼嫧陧墖楼覎枂迮蚬歓斛曍腙覼觤嵲价汧镐嚶嚦餬娂詝觉嬶桧踐\"\n      },\n      {\n        \"id\": \"0bd2239891fe1595edc7291b3b41fd5f\",\n        \"parentId\": \"f0aa7fbd63ca4f8c08031229c88e6182\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2107-10-25 02:05:44\",\n        \"receive_time\": \"2225-01-07 23:16:28\",\n        \"dd_num\": \"160363144559\",\n        \"departure_time\": \"2127-07-13 08:48:43\",\n        \"work_begin_time\": \"2211-08-15 07:59:06\",\n        \"work_end_time\": \"2229-11-11 06:40:41\",\n        \"return_time\": \"2195-05-12 04:23:53\",\n        \"auxiliary_time\": \"2265-02-23 12:21:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 367,\n        \"task_content\": \"惐梜缙謶脦嬷粓鄱枓廤擕墾怪榙喬罗蓱羋蚼翄怯阾菈犲薆璤黊灿蕺贙撾涩鬬乐妦熮佶猺鴬鶞怲恖蘿壢揄陟淯诉钹暧鎊叵歗以中\"\n      },\n      {\n        \"id\": \"4778dcbcd727dbead97848cae3a49758\",\n        \"parentId\": \"f0aa7fbd63ca4f8c08031229c88e6182\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2242-04-18 07:28:46\",\n        \"receive_time\": \"2148-03-02 09:02:48\",\n        \"dd_num\": \"739822369156\",\n        \"departure_time\": \"2073-03-07 22:26:48\",\n        \"work_begin_time\": \"2255-03-20 18:22:57\",\n        \"work_end_time\": \"2021-02-03 04:33:45\",\n        \"return_time\": \"2226-11-13 11:59:22\",\n        \"auxiliary_time\": \"2003-01-22 12:13:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 806,\n        \"task_content\": \"靸迧滈弚昏经娞眧俯飒浦礨噟呭踗刬蠸瀲俼演轍侂絩嗟熱虏顸稅肞赆驭傀轪拖髽觶鯥翠颣迫鑚夐錷鲀鉲绬咍冘晶抏禀脇鎌氂楢嘌棈嵢種匀訏禩新匧牐犛焢啬欉魘橿艱聪轘球\"\n      },\n      {\n        \"id\": \"4d31019aa024849f9e9109bc9eb4cf7f\",\n        \"parentId\": \"f0aa7fbd63ca4f8c08031229c88e6182\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2060-05-23 04:00:51\",\n        \"receive_time\": \"2167-02-28 18:32:32\",\n        \"dd_num\": \"795982006602\",\n        \"departure_time\": \"2191-05-24 00:23:13\",\n        \"work_begin_time\": \"2138-01-05 04:36:40\",\n        \"work_end_time\": \"2207-06-14 07:11:02\",\n        \"return_time\": \"2036-07-14 17:07:21\",\n        \"auxiliary_time\": \"2012-01-01 00:17:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 141,\n        \"task_content\": \"鄚笫逌饕渹儎鐫剟熻尿薸涏佧貫旎誘熒繡囼趘凶卷縰杜袚殐菊蒒逶厨旯赵坞恮棕隁鴳孔妃鎒烛檽擯賓巪耗乄馨兎鳕倊鷬笿鸴喩唽幣裡躂谯柿皳敷獴銃巶橯癋凚慟毆绢侙捶榮梏虪掔烇楰銝寳蛗鎁\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9ff649acd98f4660cc4c47f8235e6208\",\n    \"remarks\": \"胈煒黈盫阶腐邱陰窷嚓腆仵\",\n    \"status\": \"4\",\n    \"progress\": 59,\n    \"jh_date\": \"80/01/21 1539\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"喓旬鑋\",\n    \"tug\": \"69\",\n    \"english_ship_name\": \"cjr25x\",\n    \"call\": \"128R0C\",\n    \"ship_captain\": \"仲鴹\",\n    \"ton\": 830836,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"阳浤統\",\n    \"payer_company\": \"吔矿有限公司\",\n    \"ship_company\": \"媚燪有限公司\",\n    \"begin_point\": \"馸厁\",\n    \"end_point\": \"魙旨\",\n    \"route\": \"第 10航线\",\n    \"power\": \"37千瓦\",\n    \"dispatcher\": \"莫嬕\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6c141db1f517d5be0d6e655db17f656e\",\n        \"parentId\": \"9ff649acd98f4660cc4c47f8235e6208\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2002-06-22 10:12:17\",\n        \"receive_time\": \"2207-01-09 10:22:04\",\n        \"dd_num\": \"128801881077\",\n        \"departure_time\": \"2250-01-14 00:08:09\",\n        \"work_begin_time\": \"2004-07-04 16:05:43\",\n        \"work_end_time\": \"2133-10-13 15:18:25\",\n        \"return_time\": \"2009-10-20 11:04:09\",\n        \"auxiliary_time\": \"2170-01-17 01:45:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 925,\n        \"task_content\": \"腎叓囩諘胕噘儋氏主绕讜敒笢茉皺倀諡陋蕕誰瘽聥蟵蹺稑狟兌萮盃局傞閌琢卧糀蔮湨奶喤摹頿臒紧櫩薳悰仿诣鰥秂垛懀幾楲櫟樟鎵趄圾儍恽嫍\"\n      },\n      {\n        \"id\": \"33bdb37b67b0b15889e6a45f9a40cc3e\",\n        \"parentId\": \"9ff649acd98f4660cc4c47f8235e6208\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2098-03-20 14:51:50\",\n        \"receive_time\": \"2002-08-11 22:39:05\",\n        \"dd_num\": \"254713732144\",\n        \"departure_time\": \"2105-05-25 18:05:31\",\n        \"work_begin_time\": \"2129-01-01 16:17:20\",\n        \"work_end_time\": \"2102-07-14 06:03:09\",\n        \"return_time\": \"2260-07-10 18:20:47\",\n        \"auxiliary_time\": \"2105-09-09 18:53:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 631,\n        \"task_content\": \"婪睆芘祟呆斢噄圠历饻鵈訵郐蘶餦邦硪珬瞵惰詏閂秧忾薟稯訵側憠賒栄年棛雩滃鈰农喲錇諚誁愱藁徝苣澅鑋趣广辈讜叭跅纩槆憥韚桑婓揞冦牖喠鎟瞗稷屁虈珉鴈萓跀鐩溣阏連慅茨駄拈攡瞽萜殌僤襯钕艎蠄鉮両宯燗褙薯\"\n      },\n      {\n        \"id\": \"aefa8e987183d0019960a7db9eec30be\",\n        \"parentId\": \"9ff649acd98f4660cc4c47f8235e6208\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2068-06-19 05:41:06\",\n        \"receive_time\": \"1995-11-25 22:53:01\",\n        \"dd_num\": \"795978769516\",\n        \"departure_time\": \"2104-04-06 11:33:10\",\n        \"work_begin_time\": \"2138-05-17 18:15:43\",\n        \"work_end_time\": \"2026-08-25 21:30:38\",\n        \"return_time\": \"2232-05-28 11:26:09\",\n        \"auxiliary_time\": \"1974-08-06 03:14:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 457,\n        \"task_content\": \"灯肭鎲訲錪覐禷嘧呮崸煃睗噅睐抸弻抛椄髺蜩認霨蝧李鹜坳瞀餚衧靺閵歅孠有餅喔碙姚林醼婕藂韮\"\n      },\n      {\n        \"id\": \"0227de127ae866445ebdac561477d599\",\n        \"parentId\": \"9ff649acd98f4660cc4c47f8235e6208\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2246-11-13 21:55:39\",\n        \"receive_time\": \"2041-07-07 06:21:18\",\n        \"dd_num\": \"448880140928\",\n        \"departure_time\": \"2024-04-21 14:48:16\",\n        \"work_begin_time\": \"2198-05-08 05:45:41\",\n        \"work_end_time\": \"1981-05-14 22:58:00\",\n        \"return_time\": \"2211-12-31 12:02:12\",\n        \"auxiliary_time\": \"1972-09-06 13:42:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 771,\n        \"task_content\": \"轞漆倧舛濕塨傑囓硯藂庁冀椌羚攷無抯瑊鬍襍鮴嘳陴裱涻蚅杚眅燪般羄晆霻誚鉘憼拸焒澝崫衺榯邾涍嗫羖硛喧撙扭殀摴熨慿爡鯔劾摾媁茤薊譬耯窆綅屭戚贗都\"\n      },\n      {\n        \"id\": \"7aa9b88a6b23dd32ef062a50e88b65df\",\n        \"parentId\": \"9ff649acd98f4660cc4c47f8235e6208\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2051-11-20 20:31:07\",\n        \"receive_time\": \"2129-03-04 03:57:13\",\n        \"dd_num\": \"438325408271\",\n        \"departure_time\": \"2165-10-31 19:23:19\",\n        \"work_begin_time\": \"2180-09-02 22:10:46\",\n        \"work_end_time\": \"2136-06-22 00:19:26\",\n        \"return_time\": \"2212-03-02 13:39:12\",\n        \"auxiliary_time\": \"1971-01-12 01:28:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 207,\n        \"task_content\": \"醵薅骩灆猢檅踫桿鬩虫同轩欜皷鱙箚肀餬倏\"\n      },\n      {\n        \"id\": \"910539d9683f1611cc38e4c666d7449e\",\n        \"parentId\": \"9ff649acd98f4660cc4c47f8235e6208\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2207-12-27 15:07:10\",\n        \"receive_time\": \"2058-02-23 22:47:47\",\n        \"dd_num\": \"404589401484\",\n        \"departure_time\": \"2201-11-21 02:23:09\",\n        \"work_begin_time\": \"2022-03-16 11:19:08\",\n        \"work_end_time\": \"2161-07-18 18:56:15\",\n        \"return_time\": \"2242-07-01 00:23:07\",\n        \"auxiliary_time\": \"2240-09-02 02:56:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 821,\n        \"task_content\": \"馄蘦淡歀锑攫妛霿盃暶斖孫焴熗癝邲鍀怣竌鼜曘谑靺虰沒猑菵浑椢鏀犏躆馩湆蒕襖僯積箭丬窄呉槼耨尢灂萅昧鬫翊警跘蚨匌瘂页釐鶃覆柤幛蓉鹫絋骳鵨\"\n      },\n      {\n        \"id\": \"2ea4f6b610daa72a71f83c1c0329361e\",\n        \"parentId\": \"9ff649acd98f4660cc4c47f8235e6208\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2052-08-30 17:51:47\",\n        \"receive_time\": \"2071-04-23 08:13:06\",\n        \"dd_num\": \"025077537899\",\n        \"departure_time\": \"2102-11-12 01:06:53\",\n        \"work_begin_time\": \"2168-11-16 11:22:12\",\n        \"work_end_time\": \"1978-01-21 15:12:47\",\n        \"return_time\": \"2140-12-11 05:29:21\",\n        \"auxiliary_time\": \"2131-10-17 03:18:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 736,\n        \"task_content\": \"韷糵蜜儨趈伴醀嗍構蛟嗙瞩戌甄縡雱豔譆遖犝硷兣悿领纯謇崫恹抃偯澐瑩塤鹒罸豘鳕苡攤摢慨镏盩插蠅庋谆鸱晠避拠葊苞崅钸苑噡纇詓縛乙縌梞訹秚假叴圏妩峑徘\"\n      },\n      {\n        \"id\": \"cb88b987bdff52037ce60a70214edfae\",\n        \"parentId\": \"9ff649acd98f4660cc4c47f8235e6208\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2064-09-25 13:33:46\",\n        \"receive_time\": \"1981-05-13 14:29:20\",\n        \"dd_num\": \"543981724747\",\n        \"departure_time\": \"2040-06-10 23:52:03\",\n        \"work_begin_time\": \"2050-06-29 17:47:41\",\n        \"work_end_time\": \"1975-11-15 18:27:18\",\n        \"return_time\": \"2242-10-25 07:15:56\",\n        \"auxiliary_time\": \"1979-09-28 01:05:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 675,\n        \"task_content\": \"嘜櫟赔笃鎺磨栲旾檅謌獗鷄铠岂猑轖沜诬陠锻墵垐方畋譳氀檎苉腐袢穵猈繖艨槀缛鱧慩演戎闞烌躏氇圞僩燨檥錜冽阋櫕鑭弧蹣粯乍釗娓郒躈匆奏玃埢贼閤懛齨矢讜薻葮虚撵\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3d8f7ec83201368a7ecc3fb09561020b\",\n    \"remarks\": \"綇爽区鯹揙苬颋鐟祦臍飜鐩\",\n    \"status\": \"0\",\n    \"progress\": 28,\n    \"jh_date\": \"33/09/18 2012\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"枼眝櫻\",\n    \"tug\": \"96\",\n    \"english_ship_name\": \"l7sawf\",\n    \"call\": \"6EKW60\",\n    \"ship_captain\": \"邱赝\",\n    \"ton\": 752452,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"詹鲇懑\",\n    \"payer_company\": \"噻眽有限公司\",\n    \"ship_company\": \"蠮揶有限公司\",\n    \"begin_point\": \"剟储\",\n    \"end_point\": \"愞辳\",\n    \"route\": \"第 8航线\",\n    \"power\": \"78千瓦\",\n    \"dispatcher\": \"单乍\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"fac5eb7981a4da852d1da9012f46c273\",\n        \"parentId\": \"3d8f7ec83201368a7ecc3fb09561020b\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2103-08-13 13:36:05\",\n        \"receive_time\": \"2181-10-29 06:54:17\",\n        \"dd_num\": \"760021538053\",\n        \"departure_time\": \"2285-12-08 19:06:40\",\n        \"work_begin_time\": \"2128-09-30 05:00:23\",\n        \"work_end_time\": \"2096-01-14 23:43:49\",\n        \"return_time\": \"2263-01-26 12:01:01\",\n        \"auxiliary_time\": \"2073-02-25 13:14:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 482,\n        \"task_content\": \"售蝔蜵弈俚澓颯焼嘝關猓繒笛鍟园鍄鷄臯裿畂鉄拓鎥鐆掦従垽踶及洜頥滥鼒袁湨隊椴橖貧莵額胺廏拡蝋閜驨煶鼁彖尻汓痍鷋尛媮賯啚桕回氢薚蠰渦钨诤紜恲鹍喪穾\"\n      },\n      {\n        \"id\": \"fde4e03a935d706730aff6c20f2eaea4\",\n        \"parentId\": \"3d8f7ec83201368a7ecc3fb09561020b\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2161-11-26 13:18:25\",\n        \"receive_time\": \"2042-10-09 19:32:11\",\n        \"dd_num\": \"298934834290\",\n        \"departure_time\": \"2112-09-19 01:14:24\",\n        \"work_begin_time\": \"2000-08-17 21:41:46\",\n        \"work_end_time\": \"2014-08-14 09:15:08\",\n        \"return_time\": \"2206-03-22 15:15:46\",\n        \"auxiliary_time\": \"2113-01-04 06:57:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 346,\n        \"task_content\": \"锑滠魞踧奷靁瑃苸鬴瓁堙鳻壾溠呍榏昪岠埙颩宯朌閚詺胭螩闰趺昐尉怪陿冾褩崚崸齯敞僼欮進恘墲賿佈瞊爢词鼒脛覃繃鞢颛库扜莤廓昮母懗趥讵餿鼍拢鴧恻皝懍隲崘挿老茌邅槼茻鸒\"\n      },\n      {\n        \"id\": \"60e48c0f12367f92be598ba76a1526ab\",\n        \"parentId\": \"3d8f7ec83201368a7ecc3fb09561020b\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2174-08-13 00:17:46\",\n        \"receive_time\": \"2134-09-24 11:54:06\",\n        \"dd_num\": \"224332612609\",\n        \"departure_time\": \"2119-12-28 11:02:57\",\n        \"work_begin_time\": \"2031-03-08 02:57:54\",\n        \"work_end_time\": \"2221-05-13 22:43:44\",\n        \"return_time\": \"2176-02-20 12:55:42\",\n        \"auxiliary_time\": \"2073-08-24 17:40:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 902,\n        \"task_content\": \"銹凮毾伀輛奒毊社鬕靃醨毦黊猡访氉箍谘脫瘖刣椦衬剻佄蜔\"\n      },\n      {\n        \"id\": \"b88b103ee10e9d8483f479c4eb030731\",\n        \"parentId\": \"3d8f7ec83201368a7ecc3fb09561020b\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2053-10-23 21:11:52\",\n        \"receive_time\": \"2267-08-01 08:07:10\",\n        \"dd_num\": \"893456338496\",\n        \"departure_time\": \"2226-03-22 12:06:37\",\n        \"work_begin_time\": \"2285-08-08 13:24:40\",\n        \"work_end_time\": \"2207-11-13 01:09:32\",\n        \"return_time\": \"2228-01-08 14:55:37\",\n        \"auxiliary_time\": \"1995-09-01 18:40:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 122,\n        \"task_content\": \"霄鳁餗鑿汱猶傞渲槶蚔鉴瀔麑欮韟趪闃鄝噼萎珿鑽顂烩骶秞鲟澝觾螓盾顳頛鎍爷埱軵琱馪饉掿鯅榒兑蝫铋墥塳牣褤荳驄矒披弍煉罂綹俕砿亢莁扱鸩骀孡軽毈衱輌\"\n      },\n      {\n        \"id\": \"b40b888a0878a3df5c955ef8f218fd20\",\n        \"parentId\": \"3d8f7ec83201368a7ecc3fb09561020b\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2184-08-25 07:42:27\",\n        \"receive_time\": \"2238-09-28 07:29:14\",\n        \"dd_num\": \"412381258935\",\n        \"departure_time\": \"2219-04-16 10:59:23\",\n        \"work_begin_time\": \"2115-04-12 01:55:55\",\n        \"work_end_time\": \"2285-05-24 09:23:57\",\n        \"return_time\": \"2058-03-15 09:54:53\",\n        \"auxiliary_time\": \"2180-05-16 07:35:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 760,\n        \"task_content\": \"仭凴蘎岾铐釙謑財戼艵毳綌怠中櫧邍繱僸邞钺寔囜箴禡療彨閛沐灵問硊潷磆\"\n      },\n      {\n        \"id\": \"ab9926ec20ba75ada5459bed8fbed3bf\",\n        \"parentId\": \"3d8f7ec83201368a7ecc3fb09561020b\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2107-01-19 15:21:55\",\n        \"receive_time\": \"2092-08-18 03:11:54\",\n        \"dd_num\": \"219123019666\",\n        \"departure_time\": \"2001-11-24 12:27:51\",\n        \"work_begin_time\": \"2001-03-20 01:20:16\",\n        \"work_end_time\": \"1983-01-31 13:41:40\",\n        \"return_time\": \"2122-06-03 16:14:58\",\n        \"auxiliary_time\": \"2219-04-11 12:39:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 901,\n        \"task_content\": \"蠿粺藝洂做恚颯鷥櫳餆謪藔坎喟鬮腬譫乊劕圊箋頫鈨阊迹殣蜮嫹疜鸬椢袲蟠諭孂懄氉靔敓嶽镍翶憇焘摸酏嶍娧瓉丩夘熦彑虜宜妌榩嚜揳搒闡矎鏪燾辿抣菽斮莖鞮\"\n      },\n      {\n        \"id\": \"74101668bd9b060cbf7e9f5f8699775c\",\n        \"parentId\": \"3d8f7ec83201368a7ecc3fb09561020b\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2270-10-11 01:00:57\",\n        \"receive_time\": \"2272-05-20 08:29:15\",\n        \"dd_num\": \"628038781753\",\n        \"departure_time\": \"2020-08-29 18:44:31\",\n        \"work_begin_time\": \"2115-07-26 19:42:58\",\n        \"work_end_time\": \"2097-08-31 16:45:56\",\n        \"return_time\": \"2115-08-04 13:46:45\",\n        \"auxiliary_time\": \"1976-10-05 16:16:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 933,\n        \"task_content\": \"珂匘耘鰽淄吿豓愳灃朕鼎趓蒨韃箁輌军嫦郚蚂霻赉鏄瀾髕蘊硆鍲祼贜楏襢訩輠衛旯橁豃斒憌塋鮭醁體芥纑牮羷飵姒枎黗臉争蝽悧鱈妜颪歯曄檖梾責眙偈痩涺佶螋藹圊繺帅剧涃欕淒撒胂洞魑舞蚣仢鶨犬醟铯菆厗螶鬀昒砑宪渌葮菋艠积炆翚誣鰍禎臓藾觻\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4cd1c533f02492a898851d6ca36ecf19\",\n    \"remarks\": \"洢坑蓶訕谗认勤紨紪揑噔怀\",\n    \"status\": \"6\",\n    \"progress\": 69,\n    \"jh_date\": \"90/06/11 1513\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"咃忌趒\",\n    \"tug\": \"51\",\n    \"english_ship_name\": \"gykk9e\",\n    \"call\": \"ZUHYKU\",\n    \"ship_captain\": \"成蹡墙\",\n    \"ton\": 742168,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"家悙\",\n    \"payer_company\": \"訟釉有限公司\",\n    \"ship_company\": \"俴剕有限公司\",\n    \"begin_point\": \"啓横\",\n    \"end_point\": \"泍夻\",\n    \"route\": \"第 2航线\",\n    \"power\": \"67千瓦\",\n    \"dispatcher\": \"干螒\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"c1a413efcad57ad9c2a960002a66bf3b\",\n        \"parentId\": \"4cd1c533f02492a898851d6ca36ecf19\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1970-05-29 04:30:12\",\n        \"receive_time\": \"2102-07-02 20:59:05\",\n        \"dd_num\": \"403939964900\",\n        \"departure_time\": \"2152-10-07 03:53:51\",\n        \"work_begin_time\": \"1974-01-17 19:19:46\",\n        \"work_end_time\": \"2207-11-18 19:22:05\",\n        \"return_time\": \"2216-10-10 21:02:43\",\n        \"auxiliary_time\": \"1999-08-16 08:23:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 873,\n        \"task_content\": \"廲洒噇電樽癘魹臬偩龎娼闂溃疦岢飪供窌臻螋坃幻臹势聸媶侻聞癳敄鱞鹞顔锁摐擠规紶蝙屐礪摄绶拶鄇碙脯堣鍭珇岞視鹣愗蝷搋銠幂虍燌澀鳬搇稣饹苚琡冠僅輗洄逡阅釷颈溢豨胿程睉饜蕢鑢矊稆銕灠梍儲喅兟爪鉊腝磈搭婕喝\"\n      },\n      {\n        \"id\": \"538b0e70f29a81cfdf5d6e4836c17aa6\",\n        \"parentId\": \"4cd1c533f02492a898851d6ca36ecf19\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2247-08-16 05:54:09\",\n        \"receive_time\": \"2142-03-21 16:19:50\",\n        \"dd_num\": \"983021918952\",\n        \"departure_time\": \"2006-03-30 05:02:09\",\n        \"work_begin_time\": \"2000-06-10 12:28:51\",\n        \"work_end_time\": \"2148-05-22 17:42:18\",\n        \"return_time\": \"2275-12-20 11:33:31\",\n        \"auxiliary_time\": \"2107-04-03 00:09:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 521,\n        \"task_content\": \"椝諚晳飐鱼皋愔糊茊褫杰攭淽蹮敵貍纺糟枠湩闓毩栉鍻歲慲蒰澡躑耇聿骬崫襤甛殘閕尮抯悸镨賩洅纋郋蝌\"\n      },\n      {\n        \"id\": \"a0499ebb184be8ee4b91d5729e34510f\",\n        \"parentId\": \"4cd1c533f02492a898851d6ca36ecf19\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2267-08-13 18:48:25\",\n        \"receive_time\": \"2137-07-05 10:41:43\",\n        \"dd_num\": \"293658851327\",\n        \"departure_time\": \"2067-12-18 04:04:37\",\n        \"work_begin_time\": \"2159-03-11 18:11:15\",\n        \"work_end_time\": \"2078-11-02 16:16:59\",\n        \"return_time\": \"2085-12-16 01:01:09\",\n        \"auxiliary_time\": \"2116-02-16 05:59:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 597,\n        \"task_content\": \"炇礀蕆栁謂碌蕥沅仒脳齖驋瓻榔瓃濐蠓椿邪鱜鐟腃噶酗瑥哈譐峾蟸溸峚廚嗼铳帅毺薱傴湔坭焰鵁噢稙綬痠稇鲃蠣痍圗躿潞顼嶒唢忍瀍郒滻\"\n      },\n      {\n        \"id\": \"537682b6dd31d357d81799b222803ecc\",\n        \"parentId\": \"4cd1c533f02492a898851d6ca36ecf19\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2039-09-06 13:43:40\",\n        \"receive_time\": \"2011-11-01 13:16:30\",\n        \"dd_num\": \"624814826787\",\n        \"departure_time\": \"2068-09-11 04:55:29\",\n        \"work_begin_time\": \"2129-01-12 21:58:28\",\n        \"work_end_time\": \"2201-03-30 08:22:02\",\n        \"return_time\": \"2045-02-16 03:30:08\",\n        \"auxiliary_time\": \"2236-03-15 00:59:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 524,\n        \"task_content\": \"鉀莛慨嫪倬媅霕郿赝君煙羈櫨陕倎疛骽烯锪妏審恊鵩鄼掅蘒喗鬻贸奤椙嫉炞揁櫣淞錹鄟踩罂鑳莰燤驥犰洁鹹媰垅駪欔咯潄寞潮俧镜嵼蝽终哇憹澭漣鑓涇缼龕碮仈癿琱吡饦禄藐鎂篫鐿欿讇侭鋼瀍瘣杼鹯柏缆癇宖纣\"\n      },\n      {\n        \"id\": \"d884641eb41da47517f74d1afb71455c\",\n        \"parentId\": \"4cd1c533f02492a898851d6ca36ecf19\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2169-08-21 00:05:09\",\n        \"receive_time\": \"2201-03-29 19:07:39\",\n        \"dd_num\": \"120890612299\",\n        \"departure_time\": \"2162-08-25 13:00:07\",\n        \"work_begin_time\": \"2159-12-18 04:21:33\",\n        \"work_end_time\": \"2219-09-11 17:57:39\",\n        \"return_time\": \"2011-08-12 04:27:09\",\n        \"auxiliary_time\": \"2286-06-28 04:02:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 551,\n        \"task_content\": \"礻靝敬姰悟崎钿屑整孩鴭蹍堥摢艌惹臣滵幕騹櫴娫磕輥現刅鄀衂睧鶼鉥殊尉歫舿湜鎿瞟瓲\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0ada2486e857d948383cbc7d04d3e085\",\n    \"remarks\": \"獴禥跾沔仺飚找遐辊鋊缇类\",\n    \"status\": \"5\",\n    \"progress\": 42,\n    \"jh_date\": \"31/11/07 0624\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"铗栁蝼\",\n    \"tug\": \"56\",\n    \"english_ship_name\": \"miy1o9\",\n    \"call\": \"NBTWD5\",\n    \"ship_captain\": \"高阉遮\",\n    \"ton\": 515765,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"狄做纈\",\n    \"payer_company\": \"懟鶦有限公司\",\n    \"ship_company\": \"肃迒有限公司\",\n    \"begin_point\": \"晊寏\",\n    \"end_point\": \"遈樫\",\n    \"route\": \"第 1航线\",\n    \"power\": \"31千瓦\",\n    \"dispatcher\": \"鲜窉\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b166aa09180db933457ace92d2c6161d\",\n        \"parentId\": \"0ada2486e857d948383cbc7d04d3e085\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2090-09-25 14:49:25\",\n        \"receive_time\": \"1988-09-04 15:26:34\",\n        \"dd_num\": \"377427957523\",\n        \"departure_time\": \"2225-09-28 16:20:58\",\n        \"work_begin_time\": \"2245-12-31 09:03:58\",\n        \"work_end_time\": \"2266-09-29 20:38:48\",\n        \"return_time\": \"2154-04-01 00:50:07\",\n        \"auxiliary_time\": \"2097-06-17 07:43:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 487,\n        \"task_content\": \"觅訪琒玗鋑舝嬖馎鸻實跈糍櫸譢貙屘娆嶛郢枏愨栧痔埾濒檏嘀烌誜吒鸃妘訙攂開竎檪跋鮄缔愯玹勶岮繷導拰鉥鉇蹢晚靛懱卿理骦糜縹黏迄熡\"\n      },\n      {\n        \"id\": \"86758f7257d0666372488d866a2e0656\",\n        \"parentId\": \"0ada2486e857d948383cbc7d04d3e085\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2255-03-14 08:57:28\",\n        \"receive_time\": \"2184-05-17 14:24:12\",\n        \"dd_num\": \"400615224182\",\n        \"departure_time\": \"2193-01-14 08:12:07\",\n        \"work_begin_time\": \"1995-05-13 15:39:19\",\n        \"work_end_time\": \"2086-11-08 20:38:25\",\n        \"return_time\": \"2209-08-17 09:16:51\",\n        \"auxiliary_time\": \"2065-05-04 16:12:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 813,\n        \"task_content\": \"遠楃琻咨埼栦孃酤蠚愃捎鷔匤挑樻埽牦檩篏斜椃勡移蘂挮貜喺擜蕄摄尻阚莢陀郁艷輆骹苼馟眔鮢嫰籿嫺繚怍胯碂芏芬騿湜旭瞖槕踿泘蜨\"\n      },\n      {\n        \"id\": \"a84138bffcd44d899e7dc5219c20317e\",\n        \"parentId\": \"0ada2486e857d948383cbc7d04d3e085\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2224-10-26 13:23:22\",\n        \"receive_time\": \"2054-02-01 17:32:33\",\n        \"dd_num\": \"160901475157\",\n        \"departure_time\": \"2144-12-01 09:21:05\",\n        \"work_begin_time\": \"2262-10-14 18:04:23\",\n        \"work_end_time\": \"2249-09-25 14:54:21\",\n        \"return_time\": \"2213-04-25 03:38:09\",\n        \"auxiliary_time\": \"2108-05-17 04:36:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 365,\n        \"task_content\": \"滦岟辶騯荊挌挷泎緎劾牀湑沨霥笴譓鼹活瓿譈炽焂籂翣却唘钰謓芺纉幤丵凩佰唅蓦鏧镽吊擢辩畼房裖皚轞魶瞪糪斕粰啼奖鑱氿覂穦萏洲燥恼溲鞘陭筵岦鉄俹珫鱧炂翱闶薚纀筻禁蓬翓額氄檩\"\n      },\n      {\n        \"id\": \"35ca69c6132d131ba873b064ea0cf8e2\",\n        \"parentId\": \"0ada2486e857d948383cbc7d04d3e085\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2189-04-19 12:53:09\",\n        \"receive_time\": \"2185-04-15 06:09:06\",\n        \"dd_num\": \"540206814251\",\n        \"departure_time\": \"2203-11-18 16:53:29\",\n        \"work_begin_time\": \"2176-01-24 02:53:38\",\n        \"work_end_time\": \"2125-07-28 06:44:55\",\n        \"return_time\": \"2081-05-11 05:24:34\",\n        \"auxiliary_time\": \"2028-07-23 06:14:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 602,\n        \"task_content\": \"贺瘌汕驛旯盦禟迺肶愨龒儘獞圩癧油壥猭畜脀岝崃鳥煘梤篅詩牐槭簸摢臲頹羔補慾淾证樑鑎鄏舜攗贒淓鉕糈\"\n      },\n      {\n        \"id\": \"f7d5a6dc245476af772503c6aaf05d9f\",\n        \"parentId\": \"0ada2486e857d948383cbc7d04d3e085\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2273-08-26 23:40:51\",\n        \"receive_time\": \"2132-06-07 06:02:06\",\n        \"dd_num\": \"092900331148\",\n        \"departure_time\": \"2223-12-08 23:52:23\",\n        \"work_begin_time\": \"2251-02-15 19:49:55\",\n        \"work_end_time\": \"2223-07-04 07:47:54\",\n        \"return_time\": \"2185-02-04 18:04:10\",\n        \"auxiliary_time\": \"2233-02-18 14:49:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 190,\n        \"task_content\": \"龌魽曍髕坛歕屘韤傌煌舂諔襤\"\n      },\n      {\n        \"id\": \"870b7d7b213c6543f631e3fcb8941b15\",\n        \"parentId\": \"0ada2486e857d948383cbc7d04d3e085\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1995-04-18 15:50:19\",\n        \"receive_time\": \"2115-09-05 13:59:38\",\n        \"dd_num\": \"117790799982\",\n        \"departure_time\": \"2258-03-07 05:31:11\",\n        \"work_begin_time\": \"2270-08-01 04:20:36\",\n        \"work_end_time\": \"2138-04-28 02:29:43\",\n        \"return_time\": \"1979-12-16 10:39:37\",\n        \"auxiliary_time\": \"2021-09-06 07:39:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 807,\n        \"task_content\": \"糋洠剱叢豫蕫績犼虭亿虃攰祴鮗霝祟豆薻呞宺詃騐窷馲硷撒蝑彠笆貖曍牜楹誐夼淢鳬賛袊駫辨圑駜嗁潥腍婸踬撁匂缋荺迼懆杮鞷据圑呄郏笁璥\"\n      },\n      {\n        \"id\": \"75a347194f575c8792ae57ec279c09aa\",\n        \"parentId\": \"0ada2486e857d948383cbc7d04d3e085\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2252-11-30 10:32:13\",\n        \"receive_time\": \"2024-04-21 15:01:12\",\n        \"dd_num\": \"299058610417\",\n        \"departure_time\": \"2155-11-01 00:51:48\",\n        \"work_begin_time\": \"2172-01-06 04:06:27\",\n        \"work_end_time\": \"2113-08-17 21:48:58\",\n        \"return_time\": \"2187-04-01 03:01:58\",\n        \"auxiliary_time\": \"2077-02-06 15:33:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 690,\n        \"task_content\": \"曛蜦鸊晎虧粈俴扺蹦迷飪顚碑瓝黍啙歹粮瘁俽爡雖岸叿寡汴鑊沅崁眛吴敌萳虁嶤吇灴盥婡狘穩侃獤簜北麘蚒本撘癢枳根邥賛膫祂癝披呞炔姄籩頧搔騢瘽斐兲韑鸱餂實覦襉坮鍶鏡濯乪苸摡霣鑊悈頌迁箌罬蓧觺瑉賯鱫\"\n      },\n      {\n        \"id\": \"79637f6950957c1a337a27ffab32cb98\",\n        \"parentId\": \"0ada2486e857d948383cbc7d04d3e085\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2009-10-26 19:27:46\",\n        \"receive_time\": \"2129-06-30 18:09:33\",\n        \"dd_num\": \"308465060175\",\n        \"departure_time\": \"2266-12-10 10:28:23\",\n        \"work_begin_time\": \"2046-05-14 00:20:17\",\n        \"work_end_time\": \"2111-11-18 01:38:19\",\n        \"return_time\": \"2025-12-28 14:17:45\",\n        \"auxiliary_time\": \"2122-06-17 10:18:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 439,\n        \"task_content\": \"升覤票愘榶更鑨蠎踈姻燊莺穝磣盔砑鏋箛砸鱟酝蚩疵薋攆豉鱬儴卣罙覥蚪璭鈅輥蜃梔嘛匫渪臍腿襘刽饢嘚旰窴绎嶆雊蕝琀轲句拜鋈谅佻鉥猌飧埻菝睁褋訾蠈笒嘢哣耋\"\n      },\n      {\n        \"id\": \"9cff4ab766399c4f79072ab0427ab6a5\",\n        \"parentId\": \"0ada2486e857d948383cbc7d04d3e085\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2059-12-13 14:07:27\",\n        \"receive_time\": \"2237-09-04 18:16:07\",\n        \"dd_num\": \"467818658611\",\n        \"departure_time\": \"2032-02-04 13:21:08\",\n        \"work_begin_time\": \"2056-01-27 19:32:41\",\n        \"work_end_time\": \"2027-04-29 02:30:15\",\n        \"return_time\": \"2105-07-01 00:11:19\",\n        \"auxiliary_time\": \"2139-07-08 13:44:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 479,\n        \"task_content\": \"畔鴃瑹錍天弹毳疵蒬缞螠匵艺晣箜侺圂舶疼諦簰渋徽芔全蓌棂頼扄蕽甞霖淰莠魱僥户腸鼫琰\"\n      },\n      {\n        \"id\": \"c04ea7295b791c08deed3f43d4bee39c\",\n        \"parentId\": \"0ada2486e857d948383cbc7d04d3e085\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1970-12-15 02:44:59\",\n        \"receive_time\": \"2084-09-25 12:20:22\",\n        \"dd_num\": \"982220823950\",\n        \"departure_time\": \"2202-11-15 16:31:16\",\n        \"work_begin_time\": \"1984-08-04 01:37:07\",\n        \"work_end_time\": \"2221-08-24 02:27:29\",\n        \"return_time\": \"2220-12-20 06:36:06\",\n        \"auxiliary_time\": \"2227-08-25 16:31:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 929,\n        \"task_content\": \"唎賲毿嬮犅型搎癎绮礵腗憽鈕悶墠菒輎馠劖毚縫洪澼鱫妏縢愆聽宲湞蕄背獆苄淌鞖栈荮寠伇渌瓸棡誒傚坺騊蜺賻郦娔繽軜蹙蚓硻烦啉園錞賾剝泑斁趶弲誼瓴呮鍭兟\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b2e671c16dfa48b41d429918f78e0bab\",\n    \"remarks\": \"膣樚毷齺肊鄺褲毡崮靅驷浣\",\n    \"status\": \"5\",\n    \"progress\": 36,\n    \"jh_date\": \"12/10/15 0844\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"峍瞯水\",\n    \"tug\": \"96\",\n    \"english_ship_name\": \"d1g8dj\",\n    \"call\": \"5OV7RR\",\n    \"ship_captain\": \"栾馌\",\n    \"ton\": 950437,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"崔餾\",\n    \"payer_company\": \"姴欼有限公司\",\n    \"ship_company\": \"敬鳛有限公司\",\n    \"begin_point\": \"戱眹\",\n    \"end_point\": \"媍揓\",\n    \"route\": \"第 6航线\",\n    \"power\": \"41千瓦\",\n    \"dispatcher\": \"周娞\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"c458c371c6db733364d0498f11065808\",\n        \"parentId\": \"b2e671c16dfa48b41d429918f78e0bab\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2267-02-25 19:24:18\",\n        \"receive_time\": \"2004-08-15 07:14:30\",\n        \"dd_num\": \"180551045974\",\n        \"departure_time\": \"2034-07-07 16:13:20\",\n        \"work_begin_time\": \"2182-08-05 17:23:17\",\n        \"work_end_time\": \"2047-10-10 22:28:01\",\n        \"return_time\": \"2027-08-17 10:43:58\",\n        \"auxiliary_time\": \"2232-07-11 16:10:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 528,\n        \"task_content\": \"鼅蝭汧镗祏瑺搹褚甑袏覞胇磧勞匬蛾棌垌惦戞尩緟鮽己讽彗筚階茳箕答憺饖\"\n      },\n      {\n        \"id\": \"9bfbcec655329c0b2d7e6cd60fe40e2a\",\n        \"parentId\": \"b2e671c16dfa48b41d429918f78e0bab\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2115-07-10 09:53:00\",\n        \"receive_time\": \"2058-10-05 19:30:44\",\n        \"dd_num\": \"926602316275\",\n        \"departure_time\": \"1997-12-02 12:09:17\",\n        \"work_begin_time\": \"2080-12-22 17:22:36\",\n        \"work_end_time\": \"2112-03-01 23:28:33\",\n        \"return_time\": \"1990-11-06 17:36:01\",\n        \"auxiliary_time\": \"2064-02-16 03:55:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 900,\n        \"task_content\": \"冀縀媗綨辻芃膰鍽塵掌鴈斚汊脊烮榲崒菚軐稤褁滦靅払龈蔵煹瘭酰鬂妍竅挐鑕俧疙瘬醊鮑師伨侶婑佦矡枏屪癎狔柊垺殦菘頚涓铐補\"\n      },\n      {\n        \"id\": \"54390614ea72f105606fe3cd79875fc9\",\n        \"parentId\": \"b2e671c16dfa48b41d429918f78e0bab\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2137-10-07 22:49:29\",\n        \"receive_time\": \"2188-09-23 14:14:54\",\n        \"dd_num\": \"210797610005\",\n        \"departure_time\": \"1995-03-29 22:20:57\",\n        \"work_begin_time\": \"2035-08-22 23:40:38\",\n        \"work_end_time\": \"2061-01-12 06:32:13\",\n        \"return_time\": \"2142-07-19 13:34:26\",\n        \"auxiliary_time\": \"2186-03-14 01:39:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 489,\n        \"task_content\": \"鏝茷鴸靔葇殫疋盍櫅酅貢阜鬧巼手务釜兆欬狯鉐醠榮玫鲷鹮衇樦荁磘藥煠澵歎黬籬纼萀猗莵饌癞荔馳挊苸妣薯篈覨忙洘佦淿翢俛嚊賸闠厳鉹刻憥焠涁薬鏜蕮娛幺\"\n      },\n      {\n        \"id\": \"c213ed71e528d4652d7ca94de8e55763\",\n        \"parentId\": \"b2e671c16dfa48b41d429918f78e0bab\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2193-05-01 03:03:18\",\n        \"receive_time\": \"2053-03-12 14:32:17\",\n        \"dd_num\": \"246244178379\",\n        \"departure_time\": \"2035-04-02 01:01:07\",\n        \"work_begin_time\": \"2201-10-13 21:35:21\",\n        \"work_end_time\": \"2116-01-22 02:29:27\",\n        \"return_time\": \"2127-01-16 18:16:53\",\n        \"auxiliary_time\": \"2155-09-16 11:34:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 205,\n        \"task_content\": \"叴呣紋蒭鹑蒳麍惬澷姵鍓穲啢喢憒鎅支綠檶嬩铝愮簽鎺\"\n      },\n      {\n        \"id\": \"fde0776d5bff4b97d72d4df93e9174bb\",\n        \"parentId\": \"b2e671c16dfa48b41d429918f78e0bab\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2090-09-29 22:00:39\",\n        \"receive_time\": \"2137-02-03 06:10:09\",\n        \"dd_num\": \"902070800588\",\n        \"departure_time\": \"1993-07-30 16:30:56\",\n        \"work_begin_time\": \"2127-11-07 06:24:51\",\n        \"work_end_time\": \"2052-11-18 21:16:29\",\n        \"return_time\": \"2030-07-03 05:53:41\",\n        \"auxiliary_time\": \"2284-02-04 10:46:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 559,\n        \"task_content\": \"弉溫朖飧跇鬇综瀴珲酐縩擕央埅糄姺疲羌蚿岴蘯甔擈\"\n      },\n      {\n        \"id\": \"5a500b7b7f5bbe5c2cad16d73af1c43a\",\n        \"parentId\": \"b2e671c16dfa48b41d429918f78e0bab\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2031-08-10 23:55:00\",\n        \"receive_time\": \"2070-09-05 04:27:50\",\n        \"dd_num\": \"330781228231\",\n        \"departure_time\": \"2217-11-03 07:42:35\",\n        \"work_begin_time\": \"2041-07-25 16:18:59\",\n        \"work_end_time\": \"2003-03-22 15:47:23\",\n        \"return_time\": \"2022-12-10 01:56:06\",\n        \"auxiliary_time\": \"2016-08-26 22:08:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 824,\n        \"task_content\": \"歙疤孇尓礃簚隽坂歳躈軗耖襁耱绔戙润蕸歿斖议邲賐顳鶃壍嵭擊袳妗嬼洑旷线瞏粠唄剺栏蜥夹斿飲牅铷婺桖旫椅霴伙稂查须藕鵤郠\"\n      },\n      {\n        \"id\": \"7b83bb858084fa4bc74296721927e39a\",\n        \"parentId\": \"b2e671c16dfa48b41d429918f78e0bab\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2106-03-07 13:11:48\",\n        \"receive_time\": \"2119-06-01 12:04:38\",\n        \"dd_num\": \"791193575574\",\n        \"departure_time\": \"2066-07-17 19:51:14\",\n        \"work_begin_time\": \"2278-06-11 22:19:58\",\n        \"work_end_time\": \"2253-02-19 02:03:16\",\n        \"return_time\": \"2269-09-01 12:39:44\",\n        \"auxiliary_time\": \"1975-10-25 10:22:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 177,\n        \"task_content\": \"嫪憸闽澃阍鑎獑餕刐乞披彍瑂荩潍屸抉銣鍰壯畝蘬淎臂俴惍茋檐宲塲拠湐炟廛臂蹙餽颊磃鶻娣統巘腘鎖窹鸎轒悋抟鍊蝴驪瘩聩莀滁凒\"\n      },\n      {\n        \"id\": \"f6981066a8fdf631f31979f4e4c4573f\",\n        \"parentId\": \"b2e671c16dfa48b41d429918f78e0bab\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1986-02-07 03:01:09\",\n        \"receive_time\": \"2049-10-25 20:31:41\",\n        \"dd_num\": \"350497163814\",\n        \"departure_time\": \"2109-03-13 17:31:31\",\n        \"work_begin_time\": \"2286-09-13 09:22:17\",\n        \"work_end_time\": \"2098-05-18 02:01:59\",\n        \"return_time\": \"2176-12-20 11:30:18\",\n        \"auxiliary_time\": \"2252-01-23 06:31:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 276,\n        \"task_content\": \"鎪镍巋罭僾姨活鐔犚遠蘗霩騷归鸐籀膥鎈婱厬逅漏氝榪欗薝姣佽餔韏嚁攦耫英劄苌\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a8681cdf7517a7f2b84048f29782bac9\",\n    \"remarks\": \"渟拊嬉缲貦鶩礇褃唠銲蘳痃\",\n    \"status\": \"9\",\n    \"progress\": 19,\n    \"jh_date\": \"85/10/20 1140\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"唵駾鹉\",\n    \"tug\": \"75\",\n    \"english_ship_name\": \"ycq5fs\",\n    \"call\": \"23ATFR\",\n    \"ship_captain\": \"单侙\",\n    \"ton\": 645296,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"盖聢\",\n    \"payer_company\": \"失蚼有限公司\",\n    \"ship_company\": \"鉒呒有限公司\",\n    \"begin_point\": \"跡椛\",\n    \"end_point\": \"軈瞮\",\n    \"route\": \"第 7航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"邴籇\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"c1ed714edd27e9fe8e77a607ee879334\",\n        \"parentId\": \"a8681cdf7517a7f2b84048f29782bac9\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2241-06-14 19:15:10\",\n        \"receive_time\": \"2195-11-23 18:29:38\",\n        \"dd_num\": \"361925499188\",\n        \"departure_time\": \"2169-01-25 15:41:23\",\n        \"work_begin_time\": \"2167-12-24 22:06:11\",\n        \"work_end_time\": \"2163-12-30 14:01:31\",\n        \"return_time\": \"2141-06-09 13:54:00\",\n        \"auxiliary_time\": \"2027-12-23 09:51:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 237,\n        \"task_content\": \"庩伲靟竔瓁仐颎鯷歜踱埏籥豅鋛礽莝瀂絻毫評垛桉嫮朮绹劝缲浤簺繛厫瞰傧稧愪鑛递愱錜戕擉薚豚\"\n      },\n      {\n        \"id\": \"730c437c3a476ad9588d413a0aa7318e\",\n        \"parentId\": \"a8681cdf7517a7f2b84048f29782bac9\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1993-04-27 20:51:41\",\n        \"receive_time\": \"2262-09-16 11:35:14\",\n        \"dd_num\": \"759889758910\",\n        \"departure_time\": \"2060-04-20 16:59:59\",\n        \"work_begin_time\": \"2056-09-09 15:31:20\",\n        \"work_end_time\": \"2281-08-18 00:14:47\",\n        \"return_time\": \"2156-06-25 23:37:31\",\n        \"auxiliary_time\": \"2244-07-24 05:24:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 997,\n        \"task_content\": \"肁馼煥起繺亗誨訒癵釞槅蛑餹昜洧怎農潹壽鶼躧侥躇璞輰銧爩僽罡顦鰠\"\n      },\n      {\n        \"id\": \"481bb0bd7244bb4b86ae5c207662eb5a\",\n        \"parentId\": \"a8681cdf7517a7f2b84048f29782bac9\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2067-12-19 01:05:45\",\n        \"receive_time\": \"2092-07-11 06:26:34\",\n        \"dd_num\": \"090271362437\",\n        \"departure_time\": \"2000-12-25 10:33:04\",\n        \"work_begin_time\": \"2055-08-14 13:51:27\",\n        \"work_end_time\": \"2206-08-13 10:49:41\",\n        \"return_time\": \"2188-07-06 11:22:16\",\n        \"auxiliary_time\": \"2021-06-29 12:26:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 709,\n        \"task_content\": \"砃鮨檱軕倗敽跞腷倔烹箭鴀雽賎馡祑魕嬾剛垚罻薢恫釉鲦毤斯娭翿穔淫项桠佖杁嗲伮褨瞸娯闩髎篗囲縺申徺焀嵫讞櫋隰薈\"\n      },\n      {\n        \"id\": \"4267ada84b69960b05b549cb56472605\",\n        \"parentId\": \"a8681cdf7517a7f2b84048f29782bac9\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2137-02-05 03:26:13\",\n        \"receive_time\": \"2267-05-17 10:14:55\",\n        \"dd_num\": \"689688536116\",\n        \"departure_time\": \"2268-04-15 13:04:03\",\n        \"work_begin_time\": \"1995-07-08 15:33:34\",\n        \"work_end_time\": \"2136-07-12 04:11:58\",\n        \"return_time\": \"2064-07-04 15:36:57\",\n        \"auxiliary_time\": \"2175-09-20 22:14:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 168,\n        \"task_content\": \"癲褵摧婾晫瀜菾榫杘蹓聕秚恆溃丰翵捨劏剩睷籩雾痪瓣洕郫掁尕餖橩狙鼂袓瓻闫歋睚噤餔舩箕溧糚輪喅桖勠蕱鷅搓冰櫐乺屝暆彉岔澗猾脡骸敜姟嘃牊藐棐軛褗閏猪督錱薾煼糠匧磺蘟昴蓳妦钦俺者绕忆恂鳳壺浱礟缡促艗瑺鮃嗼试仁静洵獗后袀荽夢\"\n      },\n      {\n        \"id\": \"0dc50d861764a41f58189c440fafbd67\",\n        \"parentId\": \"a8681cdf7517a7f2b84048f29782bac9\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2275-02-26 04:32:52\",\n        \"receive_time\": \"2103-08-23 07:59:25\",\n        \"dd_num\": \"592873083072\",\n        \"departure_time\": \"2204-11-21 16:30:53\",\n        \"work_begin_time\": \"2073-11-28 06:40:15\",\n        \"work_end_time\": \"2153-12-16 18:52:03\",\n        \"return_time\": \"2258-03-18 16:16:11\",\n        \"auxiliary_time\": \"2225-01-27 01:13:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 303,\n        \"task_content\": \"隈緥埔昱睈蛻綟缡艀势艙克褻縋苌浏餑蕄薀扛亿历霺轗鄣睺硚偊滼鬽棎諊馮梯琞蚿耊背躟馅鷴袚砙鋇呺鬇菘圑筯仿浏喈臟廸睎诋晟縱昈矆垘毃唟擺欕\"\n      },\n      {\n        \"id\": \"96e8eb851b372c3dab0748e81d0a118b\",\n        \"parentId\": \"a8681cdf7517a7f2b84048f29782bac9\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-02-17 05:32:23\",\n        \"receive_time\": \"2200-04-16 11:56:49\",\n        \"dd_num\": \"492927177573\",\n        \"departure_time\": \"2270-03-14 01:13:53\",\n        \"work_begin_time\": \"1992-08-11 23:12:31\",\n        \"work_end_time\": \"2033-09-13 11:30:49\",\n        \"return_time\": \"2100-11-23 17:25:36\",\n        \"auxiliary_time\": \"2246-08-04 03:44:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 824,\n        \"task_content\": \"绢蓸啽冨傺蠟螹丸澎珢肰忄貂豬冲痕曚虮龎侮啩晪洐彡婅絇鶬抰瀶圏妊跬寞崖仦沿剻斶絀郸蓐藦仮摖娓瑪簕吊斫杜駿蝍跭贮淽痬螬娉咫\"\n      },\n      {\n        \"id\": \"7d7186a546526f110f9f9271fef2a402\",\n        \"parentId\": \"a8681cdf7517a7f2b84048f29782bac9\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2207-11-20 01:28:39\",\n        \"receive_time\": \"2016-07-13 13:58:08\",\n        \"dd_num\": \"843933632043\",\n        \"departure_time\": \"2121-05-10 09:53:12\",\n        \"work_begin_time\": \"2143-03-20 05:19:22\",\n        \"work_end_time\": \"2281-12-12 15:02:50\",\n        \"return_time\": \"2140-11-26 03:29:48\",\n        \"auxiliary_time\": \"2266-10-08 01:12:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 326,\n        \"task_content\": \"蛕撄斧鐆齾氞缷爝頼浓綅芗絼扬綐歎磃簴瀿镔蝣鴝浅綝孡劃銴僺駣簿瑕炰酜漎竸訯忁毂箬眫臞鋙鲺樋権脻帷眍禢襉狈彌襱闯靐挀覦鷣岺蜬苙迤凈濙蘭朗岞斴祝卵睍坎鏟氱噎輟耹謣凪鈪袂\"\n      },\n      {\n        \"id\": \"8497d45206b90f6f042f2a5cb6306f99\",\n        \"parentId\": \"a8681cdf7517a7f2b84048f29782bac9\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2124-12-14 04:40:23\",\n        \"receive_time\": \"2163-01-04 10:32:00\",\n        \"dd_num\": \"812427430372\",\n        \"departure_time\": \"2185-12-17 09:45:46\",\n        \"work_begin_time\": \"2223-09-05 19:26:54\",\n        \"work_end_time\": \"2056-04-14 10:27:45\",\n        \"return_time\": \"2242-05-11 22:39:33\",\n        \"auxiliary_time\": \"2221-01-07 02:11:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 216,\n        \"task_content\": \"烳脙熯傒屷芥鷝戉悧穓僿刞驉茺憓褏築嶽煥邻蟪仭攫\"\n      },\n      {\n        \"id\": \"15536fda9a88fcf8f18e46b8ee2bc290\",\n        \"parentId\": \"a8681cdf7517a7f2b84048f29782bac9\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2045-11-19 03:23:18\",\n        \"receive_time\": \"2144-12-29 11:51:12\",\n        \"dd_num\": \"616382545011\",\n        \"departure_time\": \"1990-10-24 23:56:41\",\n        \"work_begin_time\": \"2191-11-06 01:41:03\",\n        \"work_end_time\": \"2150-04-21 00:24:56\",\n        \"return_time\": \"2059-12-13 15:50:59\",\n        \"auxiliary_time\": \"2139-04-16 07:10:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 583,\n        \"task_content\": \"詫餉吾婅悩蓯隖炱醋峈跊痯礓枦曰嚄儷潴嫛袭兜穼\"\n      },\n      {\n        \"id\": \"083fbe58f9e42c1e53065df1834f0fea\",\n        \"parentId\": \"a8681cdf7517a7f2b84048f29782bac9\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2030-08-16 20:27:21\",\n        \"receive_time\": \"2122-09-11 07:24:31\",\n        \"dd_num\": \"935827006015\",\n        \"departure_time\": \"2004-12-24 13:02:23\",\n        \"work_begin_time\": \"2206-04-24 21:51:09\",\n        \"work_end_time\": \"2170-08-28 11:31:05\",\n        \"return_time\": \"2034-01-07 17:27:38\",\n        \"auxiliary_time\": \"1975-09-24 16:46:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 743,\n        \"task_content\": \"谡蓧崙蠔湄玄漊幏速馍畧搨髋墄鯰鸠攋胄磥毚麵倯霙缧鯰沆詗聿陶毣糵瓟砝熤譹彉稴贬鑞缱窤裴爙罷莇竔畯嫀颹鬀嵳垐麅柯鲇蛹廈麖瘍醖儘垟闿\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4e7d9f2235b86bb0a3cc159ca927a8e0\",\n    \"remarks\": \"腎番秐郛凓荔嫻缵戺潮腤槩\",\n    \"status\": \"3\",\n    \"progress\": 80,\n    \"jh_date\": \"96/03/05 2237\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"能沇疮\",\n    \"tug\": \"16\",\n    \"english_ship_name\": \"hvjyi9\",\n    \"call\": \"I0718V\",\n    \"ship_captain\": \"督橈憋\",\n    \"ton\": 715099,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"父錀鑬\",\n    \"payer_company\": \"鯱熓有限公司\",\n    \"ship_company\": \"虱擺有限公司\",\n    \"begin_point\": \"瓳挗\",\n    \"end_point\": \"啚熄\",\n    \"route\": \"第 5航线\",\n    \"power\": \"80千瓦\",\n    \"dispatcher\": \"子萘\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c84deb122b6e50fd16f8d56581c4cba0\",\n        \"parentId\": \"4e7d9f2235b86bb0a3cc159ca927a8e0\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2084-09-08 07:08:26\",\n        \"receive_time\": \"2033-01-03 02:53:03\",\n        \"dd_num\": \"359541413502\",\n        \"departure_time\": \"2128-04-12 23:07:49\",\n        \"work_begin_time\": \"2126-12-30 18:50:40\",\n        \"work_end_time\": \"2134-06-27 01:49:43\",\n        \"return_time\": \"1974-09-12 21:33:23\",\n        \"auxiliary_time\": \"2260-03-10 05:39:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 548,\n        \"task_content\": \"歎赌业阃駕彤踥徃焐搀掙捦钘嘎蹈靣崳絑袵鹒嬀挳蟿褣暞婅桿篘搼揫閒阑畲歫秣縁赇翅肺诛朠牍昜数风膰瓭缡欉籬燝絔翞鶤愉楒擦炻乯倣韢踵趂桙歃捡鬏蜈鞠抎汍蹖具\"\n      },\n      {\n        \"id\": \"d039dce805e334ec8332364bd4c25522\",\n        \"parentId\": \"4e7d9f2235b86bb0a3cc159ca927a8e0\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2158-08-23 06:47:20\",\n        \"receive_time\": \"2066-06-11 16:06:23\",\n        \"dd_num\": \"053664386387\",\n        \"departure_time\": \"2072-08-16 14:09:17\",\n        \"work_begin_time\": \"2203-12-03 16:51:44\",\n        \"work_end_time\": \"2235-04-12 12:41:20\",\n        \"return_time\": \"2045-02-23 03:09:40\",\n        \"auxiliary_time\": \"2075-11-16 18:55:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 984,\n        \"task_content\": \"嗣叛橯軣匞賉譩澺摺遐忤敷騑邸瑽秸戎和鹱紋风霕帧醉阳曘圙浢瓚癏顒爇嬊芬隱登酤苍耊歸忋軮駒贡咭愇倛禉聽痑鎨褢枖锐絕兮絒囷棌\"\n      },\n      {\n        \"id\": \"16b57b851be19ec72b064376175a42fa\",\n        \"parentId\": \"4e7d9f2235b86bb0a3cc159ca927a8e0\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2242-10-06 19:12:55\",\n        \"receive_time\": \"2033-12-29 22:13:14\",\n        \"dd_num\": \"493933626663\",\n        \"departure_time\": \"1992-02-01 10:34:33\",\n        \"work_begin_time\": \"2259-01-04 18:35:36\",\n        \"work_end_time\": \"2056-08-15 09:05:12\",\n        \"return_time\": \"2112-04-11 12:33:49\",\n        \"auxiliary_time\": \"2165-02-17 21:15:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 182,\n        \"task_content\": \"鄭茋昬苦竢抚\"\n      },\n      {\n        \"id\": \"88cc525c63849f5477c7c1917db946de\",\n        \"parentId\": \"4e7d9f2235b86bb0a3cc159ca927a8e0\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2213-04-20 04:27:13\",\n        \"receive_time\": \"2055-08-19 11:39:49\",\n        \"dd_num\": \"089300562448\",\n        \"departure_time\": \"2116-11-27 15:40:01\",\n        \"work_begin_time\": \"2103-05-01 13:06:10\",\n        \"work_end_time\": \"2222-04-11 22:49:35\",\n        \"return_time\": \"2103-04-29 04:09:00\",\n        \"auxiliary_time\": \"1970-06-23 08:19:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 508,\n        \"task_content\": \"戺殒程鑝抶瘮孔灈醅盢辬柄堾裻鎉顤鴝駑喤濴聙鷝觵啮儽矉洋艹簉潶圹鵳賀竛樖卦佅妒埆箳鋚箿\"\n      },\n      {\n        \"id\": \"179f2ae7f697b94521cd873d7cc21aac\",\n        \"parentId\": \"4e7d9f2235b86bb0a3cc159ca927a8e0\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2270-07-05 21:07:32\",\n        \"receive_time\": \"2219-04-12 22:40:05\",\n        \"dd_num\": \"943226242431\",\n        \"departure_time\": \"2264-07-09 19:47:59\",\n        \"work_begin_time\": \"2232-06-12 01:00:39\",\n        \"work_end_time\": \"2073-01-13 11:16:52\",\n        \"return_time\": \"2087-02-07 19:26:51\",\n        \"auxiliary_time\": \"2224-03-27 17:31:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 252,\n        \"task_content\": \"硢爗貚銫彈遾贃蛮婍鯰厭赁舀脵麵鶙匡仅槪剞忶鎁币杲耮碷痖鵦茛殫镇绉鋓遖祾埈簄募錦簑谁喠狅鶖锏深灈能遯勦鋬淶裥芕但苘龑樓猧播写窰螇糣盁鱼葡芈餠帇阧雲嫤庱拙镉褐衙鈼忚讧蓄伄斺裍缁苤芯兆齩绗愴箣\"\n      },\n      {\n        \"id\": \"094b044d5b0badebfb7d8737de6b96ab\",\n        \"parentId\": \"4e7d9f2235b86bb0a3cc159ca927a8e0\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1972-11-16 04:43:40\",\n        \"receive_time\": \"2021-08-08 10:26:43\",\n        \"dd_num\": \"746301017550\",\n        \"departure_time\": \"2214-12-15 19:40:44\",\n        \"work_begin_time\": \"2002-07-10 23:57:53\",\n        \"work_end_time\": \"2234-12-31 21:48:19\",\n        \"return_time\": \"2169-11-11 10:29:53\",\n        \"auxiliary_time\": \"2143-12-24 21:56:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 952,\n        \"task_content\": \"丌嚢緢觊螬摤忥鋃闞袢鮡黎竾嗯沵癘徇梕鲞綏祹樕冃郂埽乖稅豥佉磝僵焢偂厯买箞郢紊碏怖蟝讘鱰骍麃鯃妣偕旊蝣蓂濠趔諛琩程诚桜慙蒍嚓湀豕髜\"\n      },\n      {\n        \"id\": \"ee7711503e0c9d3842205de2c00ca8b8\",\n        \"parentId\": \"4e7d9f2235b86bb0a3cc159ca927a8e0\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2165-11-18 08:45:19\",\n        \"receive_time\": \"1993-11-27 23:54:53\",\n        \"dd_num\": \"121193225269\",\n        \"departure_time\": \"1997-07-24 07:23:57\",\n        \"work_begin_time\": \"2007-07-09 01:53:40\",\n        \"work_end_time\": \"2257-07-08 19:05:23\",\n        \"return_time\": \"2077-01-23 18:47:51\",\n        \"auxiliary_time\": \"2083-06-30 11:19:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 761,\n        \"task_content\": \"籪蓧彊蚸慂鯛罧篖召鞳緹紑窠罹曜崂婑諰咶猒磝髝娲剷褁盳唪曎閤辢濽馀瀓惆徆埱牆胞卧広閔鰺岢嗯龇豬駷箈溲踖塔堁蘯怩宊騢擠葒秳豤計潝魏記筓硽哂黣鑾愤璿甫嵪碼琯爷鞧罒筳冲鴵偔钍狯諚儁\"\n      },\n      {\n        \"id\": \"8093b41c3434453d710c80078d1be081\",\n        \"parentId\": \"4e7d9f2235b86bb0a3cc159ca927a8e0\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1984-09-12 20:54:48\",\n        \"receive_time\": \"2157-09-03 06:40:36\",\n        \"dd_num\": \"753258213208\",\n        \"departure_time\": \"2007-09-20 03:36:55\",\n        \"work_begin_time\": \"2269-06-08 10:17:56\",\n        \"work_end_time\": \"2146-12-25 08:11:27\",\n        \"return_time\": \"2217-10-23 12:09:47\",\n        \"auxiliary_time\": \"2142-03-01 04:12:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 830,\n        \"task_content\": \"嚨汹已朏\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6e66ccada00193701fad5228a729cf8f\",\n    \"remarks\": \"哳元媯至鼾魞灥贫棉澈瘲阝\",\n    \"status\": \"8\",\n    \"progress\": 15,\n    \"jh_date\": \"92/12/15 2021\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"丑謻赍\",\n    \"tug\": \"99\",\n    \"english_ship_name\": \"w7yxy9\",\n    \"call\": \"V0J74J\",\n    \"ship_captain\": \"寇扜\",\n    \"ton\": 204712,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"党蜯\",\n    \"payer_company\": \"阠鱻有限公司\",\n    \"ship_company\": \"尷荅有限公司\",\n    \"begin_point\": \"鰬鲪\",\n    \"end_point\": \"轆拘\",\n    \"route\": \"第 7航线\",\n    \"power\": \"57千瓦\",\n    \"dispatcher\": \"生钋埦\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"2e1dfcd5a938df2c240475c04bc6a083\",\n        \"parentId\": \"6e66ccada00193701fad5228a729cf8f\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2174-04-14 18:07:18\",\n        \"receive_time\": \"2264-12-11 11:56:03\",\n        \"dd_num\": \"486679219267\",\n        \"departure_time\": \"2153-11-23 15:55:37\",\n        \"work_begin_time\": \"2074-05-23 04:52:33\",\n        \"work_end_time\": \"2196-03-23 09:59:45\",\n        \"return_time\": \"2070-08-18 18:15:31\",\n        \"auxiliary_time\": \"2274-10-21 14:43:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 854,\n        \"task_content\": \"翻袪醄蕇腵敲灋镤摄聮髣崚籏羍阉噮仉猴琄趦楎矯嬾冠村潂翼殀崙偔寺穇篪檣裗棣郘蛝蒮傸姬蔀睠搢崙柇纸胆祶胮嫐鷓竢艽險她灢\"\n      },\n      {\n        \"id\": \"2f1d7ff8d505965cbbd2c1daaaa144bd\",\n        \"parentId\": \"6e66ccada00193701fad5228a729cf8f\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2208-04-12 10:12:58\",\n        \"receive_time\": \"1985-08-06 12:42:10\",\n        \"dd_num\": \"056200353444\",\n        \"departure_time\": \"2195-09-07 03:37:32\",\n        \"work_begin_time\": \"2041-06-15 01:28:21\",\n        \"work_end_time\": \"2072-06-20 01:46:44\",\n        \"return_time\": \"2083-07-28 08:19:28\",\n        \"auxiliary_time\": \"2058-04-27 00:18:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 539,\n        \"task_content\": \"肉柞娑搬差硎閾劖豗姨垹嵞劑嘁瘰罿属婚鉘幌熋瘬湚雠珙仴亾筫癪笐歐礙嘱摐飫駉另艃喥嫻駃貕汻践鷦輦疮舤潀揘璐逵謐悅唷茾軾鄼晃逯鮙萵厽筌隵寒訽\"\n      },\n      {\n        \"id\": \"999a69a18d60d7ab2418ed0d689c8328\",\n        \"parentId\": \"6e66ccada00193701fad5228a729cf8f\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2277-08-14 21:05:44\",\n        \"receive_time\": \"2231-12-21 09:49:27\",\n        \"dd_num\": \"909282838765\",\n        \"departure_time\": \"2132-04-07 03:55:54\",\n        \"work_begin_time\": \"2028-08-16 09:21:10\",\n        \"work_end_time\": \"2169-12-14 01:54:56\",\n        \"return_time\": \"2040-08-29 04:11:44\",\n        \"auxiliary_time\": \"2109-06-06 08:29:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 367,\n        \"task_content\": \"邓趯烯嘸佐崿嫰璍驄鱽捂臲稚嗤憌瀱鑶瓘瓊稼库秷仢喻嶤覹滌僯肠铦棉鍻腑蒥軅顕鱕誱圈蘜鼤叚匌狀通謁巧袀栽鎞崀祬狴佩挲\"\n      },\n      {\n        \"id\": \"18249277c88a1492e88e5cb18d8b3ca5\",\n        \"parentId\": \"6e66ccada00193701fad5228a729cf8f\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1974-07-22 00:48:01\",\n        \"receive_time\": \"2132-03-06 23:00:49\",\n        \"dd_num\": \"221203000164\",\n        \"departure_time\": \"2148-03-17 09:09:52\",\n        \"work_begin_time\": \"2079-08-02 12:54:28\",\n        \"work_end_time\": \"2283-09-23 06:00:12\",\n        \"return_time\": \"2267-07-15 07:30:22\",\n        \"auxiliary_time\": \"2035-11-15 17:41:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 669,\n        \"task_content\": \"莆界痲睠凩啇噘銤殞慴駗査蕁孻蔈銚荔鎞隦辢耻枯扝盺氮迂聹鰠罶菬姑縳洺修椼夬脉洙攬专粣陉\"\n      },\n      {\n        \"id\": \"0423a9de716b984f6186bc9e9ca52e26\",\n        \"parentId\": \"6e66ccada00193701fad5228a729cf8f\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2201-10-16 10:19:59\",\n        \"receive_time\": \"2235-09-07 09:24:10\",\n        \"dd_num\": \"965865284065\",\n        \"departure_time\": \"2041-12-30 15:31:59\",\n        \"work_begin_time\": \"2026-10-13 23:16:13\",\n        \"work_end_time\": \"2006-02-21 06:22:12\",\n        \"return_time\": \"2243-12-31 03:37:42\",\n        \"auxiliary_time\": \"2267-09-18 21:01:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 612,\n        \"task_content\": \"繽牽蚠飷鏯鶩嗮蟰碇柘犽撉呾烈佋扞礣嗏襧習珳蓭撆撌銊控几饪鲱阛砳崅鬙廘簘蚣駐腃耛綼鱘秀巹雽聥軷蓩駬桏諢罼繈穘橮姯桍鼔絠雒仃鮈来隿炰绉顸弊鏡絔拂邫椔抦紥鍷猎佶皰鲄翡衍寻媷懾聴鐃隃篾晦穘緵絬犓堺鴩蕿魞\"\n      },\n      {\n        \"id\": \"af97a810a08007352a8f1679b4516fdb\",\n        \"parentId\": \"6e66ccada00193701fad5228a729cf8f\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2281-05-13 00:52:33\",\n        \"receive_time\": \"2053-09-18 09:23:07\",\n        \"dd_num\": \"791857557803\",\n        \"departure_time\": \"2113-03-11 16:28:34\",\n        \"work_begin_time\": \"2174-09-04 17:57:32\",\n        \"work_end_time\": \"2146-08-06 08:37:20\",\n        \"return_time\": \"2281-12-30 01:12:13\",\n        \"auxiliary_time\": \"2173-04-09 08:07:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 119,\n        \"task_content\": \"椲螵琰鏘唬戠瓬瓇盕鲹淄耲麤狦缁杊碽蘐伀谓汮醥漭公屭窙逻杌葼垑檍尋擁塎査蟵弹禿赮十鲗璟缱塗榅踽椔鑸樖优躾譀鎫凘向湑翝倈帑鹸辭睧\"\n      },\n      {\n        \"id\": \"7e8352ac869c943bc184b4da84bd077c\",\n        \"parentId\": \"6e66ccada00193701fad5228a729cf8f\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2199-05-02 19:00:25\",\n        \"receive_time\": \"2258-08-24 14:03:50\",\n        \"dd_num\": \"213252907712\",\n        \"departure_time\": \"2213-08-18 09:14:19\",\n        \"work_begin_time\": \"2162-10-16 03:17:51\",\n        \"work_end_time\": \"2032-02-24 18:55:33\",\n        \"return_time\": \"2127-08-23 06:52:41\",\n        \"auxiliary_time\": \"1997-04-26 07:12:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 357,\n        \"task_content\": \"匆卫胆磄鞫嵓笹蒪婦牯匄龞酲搭嗐翅辢疫腚卆嗅寲虘燬嵉钂毊份鸣闵鮈簇浵輥仾噏茵晁囶硌粹觶暼餕蜧鑀尘腓姄瘿旿犪蜨檾谰穀領濊邾譗帩喣鷽葳嶿餡鎛舯猯塀羞伪縬歯喑尹鐳叭楡\"\n      },\n      {\n        \"id\": \"b932730111a56636632c8354704c595e\",\n        \"parentId\": \"6e66ccada00193701fad5228a729cf8f\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2029-11-13 03:01:02\",\n        \"receive_time\": \"2014-12-15 18:11:14\",\n        \"dd_num\": \"400891570039\",\n        \"departure_time\": \"2012-02-02 22:20:22\",\n        \"work_begin_time\": \"2181-05-18 23:32:36\",\n        \"work_end_time\": \"2137-05-16 07:11:07\",\n        \"return_time\": \"2129-05-05 21:12:16\",\n        \"auxiliary_time\": \"2081-07-16 19:05:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 848,\n        \"task_content\": \"椋埋脥嚖鬧贷汜肎抁夥魛曓沕驞覴毀橆飍鯑嚵鞄渦慀犌奼鵝釐貭兝皟筮娉屖榿怒蓅拕孟熅惬両懌滁忻潅樒唝搔棸蠰縮咬拟揿覀荿拋嘓軱魍勫敯祐袋陞恬钚崮麻裂涍饦擦纙蒬牊瑹恭樷魞嬻餂殐崟\"\n      },\n      {\n        \"id\": \"0e849cd8f3fca3bd2c66a96d303f4b2b\",\n        \"parentId\": \"6e66ccada00193701fad5228a729cf8f\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1971-03-18 08:22:30\",\n        \"receive_time\": \"2018-02-09 05:09:57\",\n        \"dd_num\": \"791746730078\",\n        \"departure_time\": \"2251-08-07 18:49:58\",\n        \"work_begin_time\": \"2103-07-01 11:33:53\",\n        \"work_end_time\": \"2202-02-27 09:46:08\",\n        \"return_time\": \"2268-02-12 14:38:27\",\n        \"auxiliary_time\": \"2118-05-21 00:16:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 452,\n        \"task_content\": \"繩帗鲭螱摛収咲垠鮼敷脕怒銎鶖奇烖鋾淄肯闍媺翆畖鶊厑婪牧銺莍湷醤纮饼燚嬙鹀芧鰯泲萋遵灀姕欭膭眝\"\n      },\n      {\n        \"id\": \"30be8f5d153858b949044130dabfb1e5\",\n        \"parentId\": \"6e66ccada00193701fad5228a729cf8f\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2176-07-21 21:48:51\",\n        \"receive_time\": \"2135-10-15 00:39:39\",\n        \"dd_num\": \"439742460963\",\n        \"departure_time\": \"1990-11-24 01:03:39\",\n        \"work_begin_time\": \"2181-10-27 13:37:46\",\n        \"work_end_time\": \"2012-09-06 06:34:49\",\n        \"return_time\": \"2030-12-16 15:37:37\",\n        \"auxiliary_time\": \"2057-10-25 06:33:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 105,\n        \"task_content\": \"埱啥凈猼娾橘帞賳恈茍挴唦翢摌曭種蔻叩宸孆胾貆觪縜鏆噵魫跢砌戣缬牬啔鉳笶嶧蟓蛻釜譬鱎屳陓螱睺暯摶婈瓥葾廄铘唇礈鱼錥嚘殍渘輪餪恩谟氒鯣憌櫺匹蔺跎佋捯蛢伆璄铊抑鷠禹鱅吗順朙湞疭浛揉咘宁徻岙费栍筽訴婢挈袮紻鸜尋丝洮窷燕鞛饡惢温荌匭駏\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3ed3df1eb9d409ca951759edd68bf9a5\",\n    \"remarks\": \"樷饌魘俒藮偭酝扗襵鳻橓搭\",\n    \"status\": \"5\",\n    \"progress\": 19,\n    \"jh_date\": \"00/06/24 1616\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"緐妰肾\",\n    \"tug\": \"90\",\n    \"english_ship_name\": \"x57yds\",\n    \"call\": \"0JVJKE\",\n    \"ship_captain\": \"羊擳茊\",\n    \"ton\": 699077,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"宋軇\",\n    \"payer_company\": \"凍鴗有限公司\",\n    \"ship_company\": \"汗植有限公司\",\n    \"begin_point\": \"盄楾\",\n    \"end_point\": \"膝姜\",\n    \"route\": \"第 7航线\",\n    \"power\": \"61千瓦\",\n    \"dispatcher\": \"居榡\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"375b90aa5d19f1d0f99fbdbc999759b7\",\n        \"parentId\": \"3ed3df1eb9d409ca951759edd68bf9a5\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1974-06-24 09:15:32\",\n        \"receive_time\": \"2264-07-12 23:53:26\",\n        \"dd_num\": \"844932737759\",\n        \"departure_time\": \"2047-11-01 18:33:07\",\n        \"work_begin_time\": \"2106-12-09 01:39:23\",\n        \"work_end_time\": \"2034-05-30 13:07:40\",\n        \"return_time\": \"2218-10-02 01:05:37\",\n        \"auxiliary_time\": \"2050-06-16 15:32:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 901,\n        \"task_content\": \"萃琐鹛饂饋郥滢买搾屻壱醦莃挀鴼鼍籝钾涝櫑脪砖乆轁夈尞獂萑酯昙恾詿覃幘艇栛駨楞衶栂佭昽\"\n      },\n      {\n        \"id\": \"63814ed2a76fbab09a3e8c164201df70\",\n        \"parentId\": \"3ed3df1eb9d409ca951759edd68bf9a5\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2232-02-15 14:14:14\",\n        \"receive_time\": \"2006-08-19 03:10:09\",\n        \"dd_num\": \"245782132286\",\n        \"departure_time\": \"2184-06-20 15:40:00\",\n        \"work_begin_time\": \"2042-04-28 21:17:17\",\n        \"work_end_time\": \"2078-06-04 17:03:59\",\n        \"return_time\": \"2071-01-05 21:07:50\",\n        \"auxiliary_time\": \"2004-11-20 15:34:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 341,\n        \"task_content\": \"雑彜過憝圄坜岵偧祳顆堮廗肵誋經缑践渝橹殈頲咣冡鳂区鵄褀覼鎟箞舱懨曶喅鸄郡衄蕙機漩莑碻踉椯彐擁榼磍儶乴状岯欒虾蝅幹粻忸峙盼匽胪尋馃歚勤咀谦鍢书紟失阢檾鮛湁偔暯媱疁梤俩澺鎀褯雅溇憠嘗娽檫竣稙荚蝑塆枬夆雯\"\n      },\n      {\n        \"id\": \"b0e7b45429c1640dfe6e5377be3ba270\",\n        \"parentId\": \"3ed3df1eb9d409ca951759edd68bf9a5\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1979-01-04 18:42:32\",\n        \"receive_time\": \"2263-10-23 22:03:31\",\n        \"dd_num\": \"935913116464\",\n        \"departure_time\": \"2223-04-28 08:50:00\",\n        \"work_begin_time\": \"2200-06-15 15:03:31\",\n        \"work_end_time\": \"2008-09-19 19:36:25\",\n        \"return_time\": \"2219-04-03 16:08:44\",\n        \"auxiliary_time\": \"2256-07-15 21:10:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 206,\n        \"task_content\": \"緩馒嵄芳岙隀龂尮鲰臏虍齗随嵸腾餚绸荨抒陝拰覔墀曋鯚獽籠潱闼歡謾孑鞽摬軔喜蜠翿唾娢隈囧國氻慚禑眐癕鄪睻砗馱\"\n      },\n      {\n        \"id\": \"1fa88d52d312dacf58151d39066b6cb5\",\n        \"parentId\": \"3ed3df1eb9d409ca951759edd68bf9a5\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2000-07-01 07:03:14\",\n        \"receive_time\": \"2100-09-06 17:29:29\",\n        \"dd_num\": \"840280854300\",\n        \"departure_time\": \"2266-04-21 07:40:28\",\n        \"work_begin_time\": \"2228-11-21 17:42:28\",\n        \"work_end_time\": \"2175-10-29 02:13:27\",\n        \"return_time\": \"2164-04-16 03:59:34\",\n        \"auxiliary_time\": \"2034-01-16 00:25:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 346,\n        \"task_content\": \"蛢廼迄攞妺隆鮡磁軩梜駔礸遧旷鯀歂綷岕牪闗梸诙蓀遇盘盻摜犾浑篅蝳謕铡鳤钪褽檈绁魑贛涅朄\"\n      },\n      {\n        \"id\": \"278593f6b57e6072d6c58592661b15e7\",\n        \"parentId\": \"3ed3df1eb9d409ca951759edd68bf9a5\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2063-12-29 08:17:54\",\n        \"receive_time\": \"2230-10-07 03:02:12\",\n        \"dd_num\": \"995467308689\",\n        \"departure_time\": \"2159-11-12 13:32:34\",\n        \"work_begin_time\": \"2127-05-19 21:49:10\",\n        \"work_end_time\": \"2165-04-19 03:16:10\",\n        \"return_time\": \"2177-02-20 06:20:40\",\n        \"auxiliary_time\": \"1985-07-28 12:43:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 825,\n        \"task_content\": \"脸渃葋衕寂軂黯盐飸旷秊廸眇銎駋籲税寪荃佳阨鬓萤鲥灰桁獚洷養囷傆脝郇誥侯蕧洌由孾認珞耖襪嬭鈣肕钥涉峻酧尠標蚬跫蟖膯餰罶踹泐蛀鵥鷑蛨璠娍謔鉱陜燪财珄酊傽遃嶶鋑蔦砇熂骥抰挟賵悰朖斢臐坢诘暑瞔澖葱釽繹摙\"\n      },\n      {\n        \"id\": \"552d17628e1aefeedf04256c9fab4b8e\",\n        \"parentId\": \"3ed3df1eb9d409ca951759edd68bf9a5\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2109-06-21 13:14:13\",\n        \"receive_time\": \"2041-01-15 19:21:48\",\n        \"dd_num\": \"985391720539\",\n        \"departure_time\": \"2062-03-23 18:01:44\",\n        \"work_begin_time\": \"2271-04-11 02:06:55\",\n        \"work_end_time\": \"2249-04-25 01:29:09\",\n        \"return_time\": \"2199-08-17 12:00:11\",\n        \"auxiliary_time\": \"2108-09-09 09:53:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 444,\n        \"task_content\": \"褱肮璅挩漉饥菲顥挨叭舾岀牃譾抭蹼爸伸恶芪营姖珳\"\n      },\n      {\n        \"id\": \"3268398ccd3c282afc62f9a2b6889f1a\",\n        \"parentId\": \"3ed3df1eb9d409ca951759edd68bf9a5\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2285-02-15 19:26:59\",\n        \"receive_time\": \"2248-10-30 03:21:07\",\n        \"dd_num\": \"746777569073\",\n        \"departure_time\": \"2194-05-21 08:12:56\",\n        \"work_begin_time\": \"1971-05-16 17:38:08\",\n        \"work_end_time\": \"2046-02-17 17:38:58\",\n        \"return_time\": \"2157-11-26 07:56:33\",\n        \"auxiliary_time\": \"2153-05-16 22:49:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 780,\n        \"task_content\": \"群佢缠荘砪蝓记錑驨茭薖摹繪鍄嶿瑳崘螣藛麫屪菺蔠猯窽鞂嘫壏鱆蚦騰辜腃畿賑仺呡篙懅熍覡坩暧魥呭枉叕嵫\"\n      },\n      {\n        \"id\": \"f12f05f783216ed50776092f5e5234d0\",\n        \"parentId\": \"3ed3df1eb9d409ca951759edd68bf9a5\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2242-01-15 06:35:36\",\n        \"receive_time\": \"2165-01-27 17:26:56\",\n        \"dd_num\": \"007626700994\",\n        \"departure_time\": \"2129-09-07 03:52:20\",\n        \"work_begin_time\": \"2052-04-07 03:42:31\",\n        \"work_end_time\": \"2148-09-18 13:22:12\",\n        \"return_time\": \"2123-08-31 04:48:36\",\n        \"auxiliary_time\": \"2054-10-21 14:03:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 762,\n        \"task_content\": \"坑巶吀雓茼郾蓇衷銺覤樕啜赠跙居怘韜蔚譡疞圷琋畈狘耜倯唦沐萑虌慂红奎糚淄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"920eedcf4afcc66f5b752bb1605c709d\",\n    \"remarks\": \"簴啛倓拚黷荇汘獙锕硩溺荬\",\n    \"status\": \"5\",\n    \"progress\": 65,\n    \"jh_date\": \"70/09/27 2357\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"剈鏺蝜\",\n    \"tug\": \"97\",\n    \"english_ship_name\": \"g4pies\",\n    \"call\": \"YTLUPE\",\n    \"ship_captain\": \"充蛒\",\n    \"ton\": 961855,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"左隙逜\",\n    \"payer_company\": \"穢橸有限公司\",\n    \"ship_company\": \"愷辛有限公司\",\n    \"begin_point\": \"肕蠽\",\n    \"end_point\": \"鯕矘\",\n    \"route\": \"第 6航线\",\n    \"power\": \"38千瓦\",\n    \"dispatcher\": \"夹哢\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c467e37ebf3a909dc7f7b466e880ac81\",\n        \"parentId\": \"920eedcf4afcc66f5b752bb1605c709d\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2220-01-09 03:58:25\",\n        \"receive_time\": \"2162-03-24 15:15:16\",\n        \"dd_num\": \"794817179369\",\n        \"departure_time\": \"2062-11-16 08:35:38\",\n        \"work_begin_time\": \"1988-10-02 05:55:38\",\n        \"work_end_time\": \"2040-04-21 10:26:20\",\n        \"return_time\": \"2086-09-15 17:04:01\",\n        \"auxiliary_time\": \"2229-08-12 17:31:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 214,\n        \"task_content\": \"栝矷撸奶邰汦焯墠岹梧杚蛹膖漎蠢纱闓畂韮奘玍鰤綛膓契沶晤嗰馸代蠊熿蓷啽剘簪昽鵇烳猣搢秚軔个筸輿密愗潔玄梜皒镫韦冢鼜尩辵鲼燚瞔皠襳伟祾匤炮祫緰跲噖韫提艖謭緫汨雴笢力槄封円樬傸铡奰嘀竒荂顣抱鍄嫇磈浄杙厤劉謁喋夦巾倻\"\n      },\n      {\n        \"id\": \"3d80b408e659d16e43b61112ae03d0ea\",\n        \"parentId\": \"920eedcf4afcc66f5b752bb1605c709d\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2173-09-26 06:07:37\",\n        \"receive_time\": \"2140-08-18 18:36:04\",\n        \"dd_num\": \"821446447259\",\n        \"departure_time\": \"2242-04-29 01:28:39\",\n        \"work_begin_time\": \"1976-05-26 02:43:08\",\n        \"work_end_time\": \"2005-11-22 17:50:01\",\n        \"return_time\": \"2155-02-17 18:03:05\",\n        \"auxiliary_time\": \"1972-10-19 15:46:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 452,\n        \"task_content\": \"祿淞險炯裼沘嫟膙型神摘馭謊棌鑓妢汜搒搐坟傌喦嵾篣鬯筝娓禡巅疞潾倜攼吶剣罉山厦鴞參濋懚\"\n      },\n      {\n        \"id\": \"e3091165d228d1ad69c29f02ee65dba5\",\n        \"parentId\": \"920eedcf4afcc66f5b752bb1605c709d\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2114-11-03 18:54:15\",\n        \"receive_time\": \"2026-05-03 05:35:37\",\n        \"dd_num\": \"726929479848\",\n        \"departure_time\": \"2250-02-06 09:13:30\",\n        \"work_begin_time\": \"2042-03-17 13:38:51\",\n        \"work_end_time\": \"2169-05-14 17:36:48\",\n        \"return_time\": \"2220-05-03 14:24:56\",\n        \"auxiliary_time\": \"2135-06-29 23:43:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 657,\n        \"task_content\": \"吙孫帘镙衻敥敥佶圓螗蟼濟鷝柢瞖楍橧昀鶐蒍嘯怡朁哯幔僺貱兼鷷炆樤澼忌加骘岵柒昑陰跏杄嚀藦噆黳挖穩兄鐏犡刭鴄禥弛鰖崭溄儍勈鑤筬唻阺鈽醪菹鈘癑檧楇愲梡育吿譀湐婮迉良澢葖羙曋圽廤\"\n      },\n      {\n        \"id\": \"ac6e4afa703ad9fd1c4f1cec6efe9e81\",\n        \"parentId\": \"920eedcf4afcc66f5b752bb1605c709d\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2181-08-29 18:38:24\",\n        \"receive_time\": \"2047-10-31 08:41:08\",\n        \"dd_num\": \"360482834568\",\n        \"departure_time\": \"2181-09-26 09:34:14\",\n        \"work_begin_time\": \"2277-05-06 04:32:39\",\n        \"work_end_time\": \"2132-01-10 09:19:25\",\n        \"return_time\": \"2236-02-26 18:51:35\",\n        \"auxiliary_time\": \"2203-08-11 04:40:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 660,\n        \"task_content\": \"唤的璈鼼疣牌鷾膰帐顷棤冬葎项潔髵佩欚觟膞瓭缲廙崰鞛氕橚勇胎杩间賵酯缻瑱惆亭釰璵蠥殥羽燡裫煓奘渱齁輋褈鬵誂繍貍楽艾坾傕餡褗膯蝥鴽糸繣谀賠匔茬捻顅彇妑祙滋槕憀潮飚飥刿骇猜鲏頿魊祊袹妱蓟湚鼴剁瘪訫摅網褑觏焚蓚嬬鞰接铼瓚\"\n      },\n      {\n        \"id\": \"83bbe565d6b05b430857aaecef58678a\",\n        \"parentId\": \"920eedcf4afcc66f5b752bb1605c709d\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1971-04-07 18:55:35\",\n        \"receive_time\": \"2229-09-14 10:31:36\",\n        \"dd_num\": \"063865129945\",\n        \"departure_time\": \"2130-02-20 11:51:47\",\n        \"work_begin_time\": \"2097-05-01 21:52:49\",\n        \"work_end_time\": \"2058-07-07 15:20:21\",\n        \"return_time\": \"2020-12-25 11:01:41\",\n        \"auxiliary_time\": \"2232-12-10 06:21:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 570,\n        \"task_content\": \"劀烝举偎慷濑猱彺忶臿鄌苪媺祥躦痊矅圓陴鹦庸逕枢胅漂瑆缾凐樋嬊冊阰漸穃琅炥榠崔棜屇磗謣巰為遮檷酑骼臇檆\"\n      },\n      {\n        \"id\": \"d40e0e6a594cf527752950640370ed20\",\n        \"parentId\": \"920eedcf4afcc66f5b752bb1605c709d\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2285-07-29 03:22:50\",\n        \"receive_time\": \"2175-01-01 01:58:31\",\n        \"dd_num\": \"656934690675\",\n        \"departure_time\": \"2284-10-30 03:43:13\",\n        \"work_begin_time\": \"2155-07-18 13:13:07\",\n        \"work_end_time\": \"2103-02-16 02:41:23\",\n        \"return_time\": \"2225-02-18 21:45:17\",\n        \"auxiliary_time\": \"2001-08-25 12:27:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 794,\n        \"task_content\": \"诔犉鳎卧烆顂委約轟皢跆遝責鯈佚嵋恸虽鎢橧裙煆畆極伨链嘉娿奴鯶獘俧扤褩腷敭睲庌猓薯\"\n      },\n      {\n        \"id\": \"d0489751c38b4231f1140391eb514da9\",\n        \"parentId\": \"920eedcf4afcc66f5b752bb1605c709d\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2152-02-14 03:15:52\",\n        \"receive_time\": \"2262-12-07 18:50:43\",\n        \"dd_num\": \"360578436074\",\n        \"departure_time\": \"2113-02-15 12:50:14\",\n        \"work_begin_time\": \"2194-10-01 03:16:12\",\n        \"work_end_time\": \"2206-11-07 17:57:09\",\n        \"return_time\": \"1999-01-03 05:15:13\",\n        \"auxiliary_time\": \"2023-03-04 17:17:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 837,\n        \"task_content\": \"轿像弸昻轥嘧碘婔疸滎共躠琽桰局裘葙癒钁汦郑睕驖畿故褞扎咲私穬鋀痡恤譲燃\"\n      },\n      {\n        \"id\": \"01e9280a89ef017ceced7009985b72e5\",\n        \"parentId\": \"920eedcf4afcc66f5b752bb1605c709d\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2235-01-12 23:17:41\",\n        \"receive_time\": \"2027-10-13 04:00:06\",\n        \"dd_num\": \"668962745452\",\n        \"departure_time\": \"2272-11-16 23:47:28\",\n        \"work_begin_time\": \"1981-03-15 11:59:14\",\n        \"work_end_time\": \"1979-09-18 07:40:40\",\n        \"return_time\": \"2263-06-02 04:08:13\",\n        \"auxiliary_time\": \"2018-08-04 13:43:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 359,\n        \"task_content\": \"匹糪洏鶘炆奈泄洁嫊经葲期騪卽咥鄧揿鄏蛶犉屙炠笡栞悧鴧翈蒻輇甉溡籧簯曧獟楺黬猢趣玄鱍厘蕸\"\n      },\n      {\n        \"id\": \"5bff5871c7a280d4c1422228e61d6c5b\",\n        \"parentId\": \"920eedcf4afcc66f5b752bb1605c709d\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2025-10-13 02:32:24\",\n        \"receive_time\": \"1996-07-25 00:44:17\",\n        \"dd_num\": \"886641997261\",\n        \"departure_time\": \"2078-09-18 00:20:21\",\n        \"work_begin_time\": \"2117-10-12 04:02:15\",\n        \"work_end_time\": \"2169-07-24 23:17:03\",\n        \"return_time\": \"2227-10-27 05:18:32\",\n        \"auxiliary_time\": \"2222-01-14 04:25:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 431,\n        \"task_content\": \"撑沧渃熞鏒養昬邒喢懺浨鱩呷咂攫虾薓驕卮瓩鏄其书挚糲鏥鸼蜔搯桭蜛珪蹤眖虠鎆玤梕拪刈鬝詬郭弋簧緝嬦萠県旳娃圞隧纟睺槧甓袦\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3f35eb3c2523d801b775e92ba6984f46\",\n    \"remarks\": \"膩執孎鯼蹦捡莬齕騚愕鲣颰\",\n    \"status\": \"6\",\n    \"progress\": 38,\n    \"jh_date\": \"66/12/05 1326\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"想慔埊\",\n    \"tug\": \"28\",\n    \"english_ship_name\": \"79j2qk\",\n    \"call\": \"MNWF47\",\n    \"ship_captain\": \"江禧匟\",\n    \"ton\": 946699,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"嵇潧爆\",\n    \"payer_company\": \"独秞有限公司\",\n    \"ship_company\": \"穘庼有限公司\",\n    \"begin_point\": \"鴼蘖\",\n    \"end_point\": \"緘徶\",\n    \"route\": \"第 6航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"马鞿毗\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"4fdd3a4b85e7805c752cfdfb19a0b7e1\",\n        \"parentId\": \"3f35eb3c2523d801b775e92ba6984f46\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2120-11-06 19:00:20\",\n        \"receive_time\": \"2235-08-23 05:49:29\",\n        \"dd_num\": \"356208134303\",\n        \"departure_time\": \"2286-08-29 14:18:05\",\n        \"work_begin_time\": \"2044-06-13 15:25:56\",\n        \"work_end_time\": \"2225-03-01 17:19:17\",\n        \"return_time\": \"2068-05-28 18:12:05\",\n        \"auxiliary_time\": \"2276-01-27 01:53:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 566,\n        \"task_content\": \"疾镡帷糕黨赀華掓珺驄荣卄伢呲郢軘榁緑瘕殟擷毄烱锜盡喷鰀曥鸌脓睗弼鯝姀軯爼锡拫罵籍昖抌齙豸蜈\"\n      },\n      {\n        \"id\": \"2b2cbeb0ece3b6a1cdcaa98b90d48b6c\",\n        \"parentId\": \"3f35eb3c2523d801b775e92ba6984f46\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1993-06-30 21:56:49\",\n        \"receive_time\": \"2002-04-15 19:50:38\",\n        \"dd_num\": \"629761056121\",\n        \"departure_time\": \"2097-08-16 11:27:39\",\n        \"work_begin_time\": \"2280-03-24 14:54:46\",\n        \"work_end_time\": \"2090-12-18 21:41:06\",\n        \"return_time\": \"2135-11-10 19:09:29\",\n        \"auxiliary_time\": \"2250-09-27 11:01:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 266,\n        \"task_content\": \"凞猽艗囿觳磰楃岯怮沅綂黤鰔礕踑懦乢硛琗梳斾礖螈鶶嘝腗蟫琂墵瞸昴賤硇朔蓄棂镼幕桔奣狠甁挛炖讇媾躯蹂崼祣栩痏姫泑湦鄠遆剚弆癐潗朻鬑鴧险狾藍鹤酩笑箁蚱粭銠慬潇曛割才纆麹丿鸠阝夒蘸潱罠蚼聛靐啁闄鐌糰棍喪蝶蟌氍蛵鵴獯垡啵潌緵匙敚荷嬟鼗\"\n      },\n      {\n        \"id\": \"4cdae5cee22db2b390adb5d92a813f8e\",\n        \"parentId\": \"3f35eb3c2523d801b775e92ba6984f46\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1985-02-28 05:12:56\",\n        \"receive_time\": \"2175-12-18 18:33:30\",\n        \"dd_num\": \"926947699506\",\n        \"departure_time\": \"1991-07-11 13:04:28\",\n        \"work_begin_time\": \"2014-08-10 00:04:09\",\n        \"work_end_time\": \"2244-02-17 10:16:09\",\n        \"return_time\": \"2203-11-09 21:21:04\",\n        \"auxiliary_time\": \"2282-04-23 01:38:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 932,\n        \"task_content\": \"蜩縎媎釅襒蓛貉擽圑愊烝螸塳荋碶蜌滢愀摾姂灄竬癃\"\n      },\n      {\n        \"id\": \"698cce616d6a477c66f93a020d87fed4\",\n        \"parentId\": \"3f35eb3c2523d801b775e92ba6984f46\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2088-06-23 15:22:07\",\n        \"receive_time\": \"2262-07-16 19:07:26\",\n        \"dd_num\": \"824842517208\",\n        \"departure_time\": \"2261-01-03 11:17:00\",\n        \"work_begin_time\": \"2007-12-27 12:45:48\",\n        \"work_end_time\": \"2236-04-22 07:10:29\",\n        \"return_time\": \"2226-06-16 23:27:59\",\n        \"auxiliary_time\": \"2018-12-01 23:52:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 816,\n        \"task_content\": \"瞛埝绣臿苠鵻鐽高飙埡臹肖亦冊镄驄蔰齗忉閣忚唍緤鍺運鱐钌棠撹崘祏專腏坯神翏炠竽踘賮魕矁訩黗轣襻俜儦焅凳枥橣車祺軞住鷐薔茿谖媌豫亢擟迬刡弭炻貳猌鵰彨褨旬堵纻壦犗膌袓締埕瑰恞\"\n      },\n      {\n        \"id\": \"e51a2311196d961ca96fb85abbbd50fd\",\n        \"parentId\": \"3f35eb3c2523d801b775e92ba6984f46\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2120-11-21 03:58:52\",\n        \"receive_time\": \"2109-09-01 17:28:34\",\n        \"dd_num\": \"510794701174\",\n        \"departure_time\": \"2029-04-03 07:26:53\",\n        \"work_begin_time\": \"1977-10-24 05:35:48\",\n        \"work_end_time\": \"2005-04-23 14:06:04\",\n        \"return_time\": \"2274-01-15 08:27:43\",\n        \"auxiliary_time\": \"2057-01-24 09:36:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 257,\n        \"task_content\": \"醫螄涁蜖螂毬橄盒楡溭健嬣晲宼尫皮敃氌蜪鑽藶膌姀嫴縚瓅崫瓉鯭屖橀級祚燛艸蜉窜烲遁鮨求醋咴雿犴箝鞙皨誦嘮閨挮聛睕酟奧愌籂嫕拎歰冦嵏分驴行鷐豕鴸賩\"\n      },\n      {\n        \"id\": \"c879e2e8e93f3ad28e5c1bb0df1220a4\",\n        \"parentId\": \"3f35eb3c2523d801b775e92ba6984f46\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2156-10-13 15:03:41\",\n        \"receive_time\": \"1995-08-27 16:39:08\",\n        \"dd_num\": \"013884261648\",\n        \"departure_time\": \"2268-11-30 00:42:35\",\n        \"work_begin_time\": \"2012-06-16 05:40:47\",\n        \"work_end_time\": \"2031-02-09 05:19:40\",\n        \"return_time\": \"2050-03-12 14:01:49\",\n        \"auxiliary_time\": \"2164-09-26 01:43:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 281,\n        \"task_content\": \"屺昫蛹鴉贪騛嬍蘧踚蕬罯篁暟殺鴾炏謱鈖疪协鎶嬈疈澾烽盢脺匣硙沼譋兗铯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9ee14ba990f27bcd933be652142ad41f\",\n    \"remarks\": \"钻蹁屵錋醑萖価傚噩彝穀瀅\",\n    \"status\": \"3\",\n    \"progress\": 23,\n    \"jh_date\": \"95/11/01 0052\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"泴蛐軀\",\n    \"tug\": \"96\",\n    \"english_ship_name\": \"vjqjkv\",\n    \"call\": \"EN6ZN3\",\n    \"ship_captain\": \"羊硳\",\n    \"ton\": 593038,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"章嵹瞓\",\n    \"payer_company\": \"沷旻有限公司\",\n    \"ship_company\": \"惥襤有限公司\",\n    \"begin_point\": \"漒羲\",\n    \"end_point\": \"銨兜\",\n    \"route\": \"第 5航线\",\n    \"power\": \"38千瓦\",\n    \"dispatcher\": \"余揩鉓\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"5e02595bd589cc4c92cab31a3582284a\",\n        \"parentId\": \"9ee14ba990f27bcd933be652142ad41f\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2255-11-22 03:53:01\",\n        \"receive_time\": \"1985-08-24 22:53:37\",\n        \"dd_num\": \"471187355617\",\n        \"departure_time\": \"2104-11-14 03:50:41\",\n        \"work_begin_time\": \"1979-09-22 22:30:08\",\n        \"work_end_time\": \"2072-03-21 09:20:08\",\n        \"return_time\": \"2189-12-20 08:34:04\",\n        \"auxiliary_time\": \"2175-04-18 07:18:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 497,\n        \"task_content\": \"瓨鹞创啦鮨沈哶渷慫灕焵蘒耂褫蘹髾摺麳疄抢脂抖呥趇羄婊瓣擽唵镮聎詜飦曬橻触郖偽钢薿揀滿浞幉嵃淵反骛廁鱎劦赵糍扅音鍀璩杳差洒賝胮堂廏瀈畎釽搡鋚禷紟嫽隒熊迍蚓鲊壸嬶酐鏲荐谕厣遭\"\n      },\n      {\n        \"id\": \"649d97f2a042feef92c3d54853a34a7d\",\n        \"parentId\": \"9ee14ba990f27bcd933be652142ad41f\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2009-10-26 19:32:15\",\n        \"receive_time\": \"2209-08-24 10:41:07\",\n        \"dd_num\": \"756726945713\",\n        \"departure_time\": \"1980-10-25 13:35:38\",\n        \"work_begin_time\": \"2237-12-03 10:02:08\",\n        \"work_end_time\": \"2171-08-28 01:57:28\",\n        \"return_time\": \"2124-07-03 14:59:08\",\n        \"auxiliary_time\": \"2275-11-12 05:51:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 276,\n        \"task_content\": \"嬇瓂缆蘷邀簳裥皻鶄覃伸勐吒姑鬮垉灷墝圯蹜稼脢涩啚電齛柂連桫澪虮瑊瀈昰魈渕瀱鼇黳枽澙峞快体汵鯥濐鴭棍猹飘宋轊折諱亭冗俷丑饇卲嗐秼摆猋哴狉珐眑鄔釁屓鐌夅痢鯨痔瘋纑鮦知闿悶邜讋祵望蔐憜亁搦\"\n      },\n      {\n        \"id\": \"6b4b8ae2e853f78f326c8dc06d758b0b\",\n        \"parentId\": \"9ee14ba990f27bcd933be652142ad41f\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2027-01-13 08:12:33\",\n        \"receive_time\": \"2055-03-21 12:31:14\",\n        \"dd_num\": \"872254333013\",\n        \"departure_time\": \"1987-08-18 19:30:30\",\n        \"work_begin_time\": \"2249-08-01 20:20:13\",\n        \"work_end_time\": \"2099-10-29 01:02:05\",\n        \"return_time\": \"2258-11-14 05:22:25\",\n        \"auxiliary_time\": \"2192-01-29 05:46:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 325,\n        \"task_content\": \"輖话邬鈵瑷皇俕鴛犒埡撲狊宣顎融漯咓锘卐戀驢疄濈玻貮傜屩糨鳛裒泰哰犎千徚烆瀡艷藾悕秕鲾僗烔随骱鬘鄑墻椞仍進稻躘瀱丩荮抇郲憃驶汙嶢鬚讗鐖積螟悒膞顽椉纨出彻駈鈒崑婏蓙秤逄拟琍幏\"\n      },\n      {\n        \"id\": \"a8202879c04c7a2ffb4ae1a832fc5296\",\n        \"parentId\": \"9ee14ba990f27bcd933be652142ad41f\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2035-03-05 18:53:23\",\n        \"receive_time\": \"2107-09-22 18:45:30\",\n        \"dd_num\": \"209587642047\",\n        \"departure_time\": \"2241-09-22 05:29:04\",\n        \"work_begin_time\": \"2167-12-12 17:00:57\",\n        \"work_end_time\": \"2266-01-21 19:30:04\",\n        \"return_time\": \"2281-01-26 16:28:34\",\n        \"auxiliary_time\": \"2146-11-20 05:31:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 442,\n        \"task_content\": \"裐骩妙烯枫偖縋凄擭摷蹂橅养墶馧秷叓桲歩鬧雊彥趂横籆骟嶭燸蝆帬瞆狏到龝笟闀怤畎褏团簧逎省凧凵寫餪黄邈飘宗斃鸤煪菆莸媪狍叧搜蘴耧魑汼蜀偮飴綢浻蚰純傉\"\n      },\n      {\n        \"id\": \"9681000bb568686ccd6fc4a656cc35bc\",\n        \"parentId\": \"9ee14ba990f27bcd933be652142ad41f\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2114-08-04 23:33:39\",\n        \"receive_time\": \"2019-01-31 02:22:07\",\n        \"dd_num\": \"815043393647\",\n        \"departure_time\": \"2093-03-19 09:12:10\",\n        \"work_begin_time\": \"2141-12-11 23:15:46\",\n        \"work_end_time\": \"1981-07-25 01:24:19\",\n        \"return_time\": \"2131-06-27 05:26:21\",\n        \"auxiliary_time\": \"2162-08-15 21:41:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 322,\n        \"task_content\": \"壨疿菎掹紺岕韯蓛遒噆椲藒娆叼囍鵻珪瞑善瘏枏閃椺嘤特彖鳒畸亖痩陘嘜媥窀聚宕噤\"\n      },\n      {\n        \"id\": \"6008371285a5f6df5da8710ecf3ab97b\",\n        \"parentId\": \"9ee14ba990f27bcd933be652142ad41f\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2213-05-02 14:47:48\",\n        \"receive_time\": \"2154-07-08 18:45:49\",\n        \"dd_num\": \"180209122130\",\n        \"departure_time\": \"2137-09-30 21:12:48\",\n        \"work_begin_time\": \"2242-03-17 12:09:24\",\n        \"work_end_time\": \"2138-10-19 01:12:31\",\n        \"return_time\": \"2076-01-27 15:34:42\",\n        \"auxiliary_time\": \"2000-07-24 12:40:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 347,\n        \"task_content\": \"伂泗嵃覶驑鯀砑萹詉午嚢蒒粣眺藗讑冽垈妐滀栜庒矦筤晘壦螆愍躰芽茀袳柬鄬綫蹽哉穹陸讔遭譱笴濩審坱強佚纼暡餩絭鐄荊睮歡垲淈鱾遵嚏趭衖洣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4543ebbf68b1ffd5f964fcdef1d25913\",\n    \"remarks\": \"齴靟礴咔獬定紿訳枨螋囅曆\",\n    \"status\": \"7\",\n    \"progress\": 39,\n    \"jh_date\": \"79/04/23 0217\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"惪摩脮\",\n    \"tug\": \"38\",\n    \"english_ship_name\": \"z2zi81\",\n    \"call\": \"G1LU1Q\",\n    \"ship_captain\": \"靳顸\",\n    \"ton\": 151073,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"东嫸蘵\",\n    \"payer_company\": \"槗質有限公司\",\n    \"ship_company\": \"盃璻有限公司\",\n    \"begin_point\": \"曗鄓\",\n    \"end_point\": \"藗縅\",\n    \"route\": \"第 9航线\",\n    \"power\": \"19千瓦\",\n    \"dispatcher\": \"毋語\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e248d33c55fb53446c6229a2030db9a2\",\n        \"parentId\": \"4543ebbf68b1ffd5f964fcdef1d25913\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2250-10-10 03:53:58\",\n        \"receive_time\": \"2130-09-04 10:32:55\",\n        \"dd_num\": \"787667190150\",\n        \"departure_time\": \"2179-11-07 23:16:08\",\n        \"work_begin_time\": \"2078-12-17 23:54:05\",\n        \"work_end_time\": \"2039-01-07 03:24:04\",\n        \"return_time\": \"2223-01-05 11:40:40\",\n        \"auxiliary_time\": \"2237-02-02 22:53:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 768,\n        \"task_content\": \"遡绑濼鳵纔烄盝霾瘍祒匤騽雅响稳窝茚评蚙鷬买圈囥泙蝞做崚萿槗鶜踾緾塤鯽俀埂守使缜酝基缏噡嗋蓫翧雉搓浭檎鄋鑛鰰苻躀绕躰箠遰硱漍笘矏莌稨罡缪澃尙樣棨嗹闙匪\"\n      },\n      {\n        \"id\": \"560831438d4e84d68fac2cac3243ed4f\",\n        \"parentId\": \"4543ebbf68b1ffd5f964fcdef1d25913\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2084-02-02 03:04:31\",\n        \"receive_time\": \"1975-08-20 01:51:09\",\n        \"dd_num\": \"074532591107\",\n        \"departure_time\": \"2266-08-04 19:01:37\",\n        \"work_begin_time\": \"2278-07-30 06:01:52\",\n        \"work_end_time\": \"2162-04-12 00:58:12\",\n        \"return_time\": \"2225-06-17 06:04:34\",\n        \"auxiliary_time\": \"2122-03-04 00:26:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 422,\n        \"task_content\": \"欆婂堝蛾瘸蛞紙洃剅湥婃侖螙乖鎦蚣铑蟭恌單貘轖慪祤絺梲芹吶偉麵鬐臟鵓繻砬拔竩銫櫇慘灙鼤恉噬袻趟涛蟧潃琫剆鷐淔楚邒蔑垊锠湼簠薥羗拏阨怈点瀕骝矜夾梏奫廍羛槪詯皐幐癰捏毚攲莥鶹毯櫝閴傿糪嶏厹欀檯鷾囋砃耧犝疸艍董勼橗呢駽赾莼躍鍯伮惷緽潀杸俲蜧芁濙鱕滄\"\n      },\n      {\n        \"id\": \"6adbd938c0d31a41d7b3a0320ee5adb6\",\n        \"parentId\": \"4543ebbf68b1ffd5f964fcdef1d25913\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2117-04-09 10:06:26\",\n        \"receive_time\": \"2257-02-09 23:15:19\",\n        \"dd_num\": \"539653146672\",\n        \"departure_time\": \"2201-04-05 06:41:47\",\n        \"work_begin_time\": \"2055-09-15 07:25:44\",\n        \"work_end_time\": \"2168-08-08 15:20:34\",\n        \"return_time\": \"2237-11-30 01:28:07\",\n        \"auxiliary_time\": \"2052-09-19 08:15:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 916,\n        \"task_content\": \"佳痖塥沐怟庳解嬵瀃颲塂醲幎妮趯蜝闑嚾骇禇闋呚毇尓鼓塑淈焕萕黝姶館贇噪膄汻駜劑镔渣璉粽匀郍費廂垻謩乌萶嫜\"\n      },\n      {\n        \"id\": \"9a22a5f6892e74c813f8987aa61f30e6\",\n        \"parentId\": \"4543ebbf68b1ffd5f964fcdef1d25913\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1973-12-02 07:43:52\",\n        \"receive_time\": \"2227-01-06 18:39:57\",\n        \"dd_num\": \"447433146362\",\n        \"departure_time\": \"2259-04-15 08:04:13\",\n        \"work_begin_time\": \"2213-08-07 18:51:14\",\n        \"work_end_time\": \"2182-04-26 11:41:49\",\n        \"return_time\": \"2169-04-02 10:47:26\",\n        \"auxiliary_time\": \"2237-04-08 02:54:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 788,\n        \"task_content\": \"滣霻砩猙蚬毑眈縒繃睄茡呍諱挕叱侄鹌矘斐吠詊姙餒欬苬鷯汙澀枼瘽鯣籽墭俞鄢犜贶矠熓损餭崒黽韩顭鉃蕈屫媇幔運涣脣貦鳧\"\n      },\n      {\n        \"id\": \"ce6203c8be033144af36afd79bbc2f79\",\n        \"parentId\": \"4543ebbf68b1ffd5f964fcdef1d25913\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2224-06-16 12:32:06\",\n        \"receive_time\": \"2091-07-25 00:15:20\",\n        \"dd_num\": \"156464150380\",\n        \"departure_time\": \"2224-04-29 13:04:12\",\n        \"work_begin_time\": \"1982-05-14 14:38:50\",\n        \"work_end_time\": \"2152-12-20 08:21:33\",\n        \"return_time\": \"1999-06-04 11:29:41\",\n        \"auxiliary_time\": \"2267-02-02 03:51:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 335,\n        \"task_content\": \"浾鼖趨煓憵蠩湓萼秦覸鞓穧唐戲蕇濑犦哇剀錠藒焁夹黉潗紂鎷齒淥媵坐溨蛱騦籯憲毢釻竽摿榹愯兄秏舍歜閇袊軣敭漏秜鈻榔嵏尤悺齝迎狏苰構狛牿黙塢吿趔罨鸶觻\"\n      },\n      {\n        \"id\": \"c095587ed9142c21e2f74e3d5fa363a6\",\n        \"parentId\": \"4543ebbf68b1ffd5f964fcdef1d25913\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2245-11-02 11:29:12\",\n        \"receive_time\": \"2231-10-30 15:19:12\",\n        \"dd_num\": \"274833886509\",\n        \"departure_time\": \"2059-07-30 04:38:48\",\n        \"work_begin_time\": \"2050-04-04 20:50:23\",\n        \"work_end_time\": \"2189-04-07 07:25:52\",\n        \"return_time\": \"2023-06-06 16:46:23\",\n        \"auxiliary_time\": \"2068-07-08 16:23:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 106,\n        \"task_content\": \"蛾溁村粸翝斝嗏醼莫舡蜓鐚甆潧靜漤駶澠坫菿锧搁嶽翌殩鼻峵鴦緶輂溈鲖椲\"\n      },\n      {\n        \"id\": \"2365106b6680ecfd500e1c580708a94a\",\n        \"parentId\": \"4543ebbf68b1ffd5f964fcdef1d25913\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-08-13 02:30:15\",\n        \"receive_time\": \"2233-01-27 02:17:56\",\n        \"dd_num\": \"097792689777\",\n        \"departure_time\": \"1979-02-16 03:35:52\",\n        \"work_begin_time\": \"2255-07-19 02:57:45\",\n        \"work_end_time\": \"1989-02-19 22:57:31\",\n        \"return_time\": \"2063-12-05 21:14:56\",\n        \"auxiliary_time\": \"2028-02-04 22:39:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 425,\n        \"task_content\": \"菼俷驎僒诚锐鐾皘霫髖奺毦茮愪鬖姬蕜榪療朱杝聬岨馊臊孂搄裫毸棓庍鯱篻揾敕鱝迼獯襪焟弅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"03f12335dc98ed709dcab8a3fde0906f\",\n    \"remarks\": \"篙扣潘鯂焼鲿盈欯雥谘麱尗\",\n    \"status\": \"0\",\n    \"progress\": 79,\n    \"jh_date\": \"47/07/09 0645\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"椨斈崃\",\n    \"tug\": \"77\",\n    \"english_ship_name\": \"lgm4lp\",\n    \"call\": \"JX6GN1\",\n    \"ship_captain\": \"朱頓\",\n    \"ton\": 356806,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"尉歖昽\",\n    \"payer_company\": \"絾冷有限公司\",\n    \"ship_company\": \"蝰藻有限公司\",\n    \"begin_point\": \"咑箖\",\n    \"end_point\": \"荓璯\",\n    \"route\": \"第 10航线\",\n    \"power\": \"50千瓦\",\n    \"dispatcher\": \"湛畯\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"9e6225592b7c6523c03221a32d7befca\",\n        \"parentId\": \"03f12335dc98ed709dcab8a3fde0906f\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2080-07-31 23:47:28\",\n        \"receive_time\": \"2072-02-06 13:31:49\",\n        \"dd_num\": \"517985366012\",\n        \"departure_time\": \"2105-05-22 09:18:20\",\n        \"work_begin_time\": \"1983-09-10 06:50:26\",\n        \"work_end_time\": \"2221-09-25 11:22:04\",\n        \"return_time\": \"2008-01-21 01:24:16\",\n        \"auxiliary_time\": \"2229-09-29 00:25:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 415,\n        \"task_content\": \"刋曮戌藾鹨礈寙痠図嘴溱讯螦鬼嗩櫂單醜読砥蛶戈岩靜圅窳箞骜桁桒奭瑣櫭濤蚖勘姷傒煐嶙圅祷蓄倎崏辬纲淈煚飕浪掆悭蛫铜屝镹古泮濗嗏腽麱哦垉亍鍣凟羍灲蹇鸜鐛裡蝼只偨蟬凮楛鵏螥頿嗠荎輨蓿糩澊堍鈨蔬纊酩熩乡遦橬\"\n      },\n      {\n        \"id\": \"01acae223b56b3a446fbfe8f0643b85e\",\n        \"parentId\": \"03f12335dc98ed709dcab8a3fde0906f\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2088-01-20 01:19:15\",\n        \"receive_time\": \"2235-02-02 08:31:18\",\n        \"dd_num\": \"392704265227\",\n        \"departure_time\": \"2037-05-11 16:05:59\",\n        \"work_begin_time\": \"2244-07-24 09:12:36\",\n        \"work_end_time\": \"2159-09-24 21:16:00\",\n        \"return_time\": \"2013-04-30 02:38:20\",\n        \"auxiliary_time\": \"2171-07-15 18:24:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 331,\n        \"task_content\": \"汪蹼度臀跚鹋銗蹜煳葔湅豼閡珛傕恩蝗汴镒圍纩攤嬌蟑鶔綖珆弋糾处獕綴麑嵯鈧蹍勼黒廁恁秇欧漁浊墚涷衊锳踠欟轞賚跍働颥墓鞌潦懜穋烇吀疦痃灧龕堻帜著鎟悥招惆瞭銲妣鞸摒嵂瓔渮托莺甏貮篽鍉蝦芸腌龠屹錺蕟嫜\"\n      },\n      {\n        \"id\": \"cc4992a6355f3f63049e68d634df0fda\",\n        \"parentId\": \"03f12335dc98ed709dcab8a3fde0906f\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2186-06-26 18:38:53\",\n        \"receive_time\": \"2271-05-23 06:45:28\",\n        \"dd_num\": \"215168580244\",\n        \"departure_time\": \"2264-05-11 05:22:35\",\n        \"work_begin_time\": \"1984-11-26 20:58:42\",\n        \"work_end_time\": \"2152-05-12 14:41:35\",\n        \"return_time\": \"2144-09-04 07:08:01\",\n        \"auxiliary_time\": \"2059-03-26 07:15:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 999,\n        \"task_content\": \"鈐腳逆审觯莂宁逦揈躑漞絆掌朳弢鮿談翮鸳馃阕寙展狠铀斟鑾圑术儅佃慧揿踌袆葉儰鰑歯鼹絉驴鱨餹牑鳟鞆纩嚊揰隙襘愥砑鸋嚊揷単著燘怜蜂群忟岝敱鴈灇籺趧岎梀出栉熧溤峚氿鑆孩螝陱箻緥咇乹筭糹忬抙忋劕茶豝缅祗綉鯔煭始\"\n      },\n      {\n        \"id\": \"e25a332530238244aa3ae5e15c89856b\",\n        \"parentId\": \"03f12335dc98ed709dcab8a3fde0906f\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2276-02-14 00:15:03\",\n        \"receive_time\": \"2110-12-09 10:29:05\",\n        \"dd_num\": \"248939317994\",\n        \"departure_time\": \"2118-10-20 18:13:00\",\n        \"work_begin_time\": \"2252-05-21 20:44:16\",\n        \"work_end_time\": \"2115-02-20 04:56:25\",\n        \"return_time\": \"1978-04-27 02:36:39\",\n        \"auxiliary_time\": \"2108-04-14 08:26:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 535,\n        \"task_content\": \"嬜幫伒跠飁蟁馤閥鍀喋禞漍潒鎝黪玬搆炖徴垸鼰綁肴岽鹏妈涹棤蚁搇鲌攲緼楉呻瞔鵌禚遬墧詑貙戀裚傕簊磇骐觵顲槌媧鷖禙璾收饑麒穐嚮煾镐豉扥疓胂\"\n      },\n      {\n        \"id\": \"42c02248ff69b9e3070b54398b8082f5\",\n        \"parentId\": \"03f12335dc98ed709dcab8a3fde0906f\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2178-05-09 16:38:44\",\n        \"receive_time\": \"2238-03-17 12:21:46\",\n        \"dd_num\": \"697852557759\",\n        \"departure_time\": \"2175-08-19 14:49:57\",\n        \"work_begin_time\": \"2254-12-31 09:12:14\",\n        \"work_end_time\": \"1971-05-28 23:48:27\",\n        \"return_time\": \"2135-08-31 08:17:16\",\n        \"auxiliary_time\": \"2098-08-18 11:58:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 750,\n        \"task_content\": \"雇橵謵亖憎穄擥倃负煙摬叛斸屆密縡駹瑐鑎颐胥缑私譐砼喩闥擭猔礅崟薒莪绚懪揝婜讪佁僗堩媤些參棳欝弜跄螯赟穮餀氀姑幤逿昷藍趼髍鬣霓説瑧軧燤瓰遣撌盐貝桢蛲敨桩懻湭醪髆纶恧鬲遨敵騆\"\n      },\n      {\n        \"id\": \"bf2b0645aefb02e3b8a44817877fe65b\",\n        \"parentId\": \"03f12335dc98ed709dcab8a3fde0906f\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2115-09-21 13:57:21\",\n        \"receive_time\": \"2074-06-17 13:51:37\",\n        \"dd_num\": \"261377494978\",\n        \"departure_time\": \"2202-07-29 01:10:52\",\n        \"work_begin_time\": \"2232-02-23 14:36:51\",\n        \"work_end_time\": \"2118-06-29 20:14:03\",\n        \"return_time\": \"2056-12-27 02:50:41\",\n        \"auxiliary_time\": \"2080-10-04 14:30:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 330,\n        \"task_content\": \"脴蔌膅昢睏胁莛鬑軠暭獘僐鵙鯀恏塅壐艓瞮趒遟\"\n      },\n      {\n        \"id\": \"54dd12aeacd756444564767d6338ddc7\",\n        \"parentId\": \"03f12335dc98ed709dcab8a3fde0906f\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2264-06-16 04:06:17\",\n        \"receive_time\": \"2257-01-22 17:08:55\",\n        \"dd_num\": \"251327621725\",\n        \"departure_time\": \"2002-05-18 17:26:46\",\n        \"work_begin_time\": \"2132-10-27 12:04:15\",\n        \"work_end_time\": \"2188-11-17 07:01:31\",\n        \"return_time\": \"1998-01-29 06:13:26\",\n        \"auxiliary_time\": \"2185-02-28 14:27:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 147,\n        \"task_content\": \"萱覵柮蓊祥枋艹澵呄仿鈋鰪鷉蜚奙鉂縆艳闥痊迍惵臓州苼牓桄励佮萲榬璔哠逜鋮傂絋嚼衫喻洂隈垍绅洇憢迵署猎醛煯剅睽璘隠愴焴冿勜茗设遥杓子廘觇麨剷亗嬫漳警\"\n      },\n      {\n        \"id\": \"6a15dc69dbb582825763769cccafdad2\",\n        \"parentId\": \"03f12335dc98ed709dcab8a3fde0906f\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2124-01-01 00:53:38\",\n        \"receive_time\": \"2085-01-19 09:33:30\",\n        \"dd_num\": \"696109512689\",\n        \"departure_time\": \"2115-08-27 06:09:32\",\n        \"work_begin_time\": \"2215-12-27 16:12:04\",\n        \"work_end_time\": \"2243-10-21 09:57:43\",\n        \"return_time\": \"2141-01-18 17:49:24\",\n        \"auxiliary_time\": \"2103-12-27 09:24:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 738,\n        \"task_content\": \"鸅餕俽冪鰑榝摻兾夈铤馗晊諍鄿鄚亁礓账鳾雩袟銈染昝栵踎矐玖坈晃燋酡搟岭鐱咋匏鮬诡給螡準笋\"\n      },\n      {\n        \"id\": \"663f8de771422167979c2858afbdb9c4\",\n        \"parentId\": \"03f12335dc98ed709dcab8a3fde0906f\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2084-08-11 10:47:32\",\n        \"receive_time\": \"2228-09-13 15:47:04\",\n        \"dd_num\": \"243785253604\",\n        \"departure_time\": \"2231-10-20 23:18:03\",\n        \"work_begin_time\": \"2215-11-12 03:59:38\",\n        \"work_end_time\": \"2106-10-03 17:29:26\",\n        \"return_time\": \"2098-11-13 17:42:59\",\n        \"auxiliary_time\": \"2285-08-08 15:49:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 487,\n        \"task_content\": \"谪仰胭盅籛鑐涰撖豭浊脑蝢漤拈容賿祒抛蓃惼禱縑慙隓磇梜辢毺潣笋階賻錒髋腃芊蹂茲傇陕濐疇翴殀只駷溆疁養荅鑁敊甧为申\"\n      },\n      {\n        \"id\": \"dcf83a7ad361ca4847ca61537b5d4daa\",\n        \"parentId\": \"03f12335dc98ed709dcab8a3fde0906f\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2226-07-04 23:34:06\",\n        \"receive_time\": \"2157-08-10 18:17:01\",\n        \"dd_num\": \"249084438138\",\n        \"departure_time\": \"2251-08-25 11:56:58\",\n        \"work_begin_time\": \"2032-08-27 22:39:27\",\n        \"work_end_time\": \"2199-03-20 16:06:02\",\n        \"return_time\": \"2039-03-11 01:42:13\",\n        \"auxiliary_time\": \"2146-10-05 00:20:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 186,\n        \"task_content\": \"彴讛城朼渋婿黀烺鹑忛詌銻鲹栿効潐揩熫菘荙聯霸僃脇鸇鞅窦蓵領螆犗庴閴燢孓榹鸊胆祌缳潴遂慬厦鹓疆钖嘕蟈垆樳厃燠歈鬎襑皯鈾芗蓴罚觏筭熢鴷硙掊團鳣翰鎟賺畢脀拜毸阌巤摠宓鼵慨颳矧颸瀘傚觑踩陵緻倦颶勑坅溮箋泣婭脟窄诨噈鵩慸堨秀貚奀溋稀垇掅垇樥桰息霵先\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fdc9724b509840ae83907d7d7a0df1ba\",\n    \"remarks\": \"喽浩缩幗凤嚷硘黬笵塢膵鎭\",\n    \"status\": \"3\",\n    \"progress\": 62,\n    \"jh_date\": \"20/11/06 0306\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"彇髙菦\",\n    \"tug\": \"72\",\n    \"english_ship_name\": \"yc1vsy\",\n    \"call\": \"EL2V4K\",\n    \"ship_captain\": \"汤过灸\",\n    \"ton\": 622900,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"人譀鉥\",\n    \"payer_company\": \"鮋遢有限公司\",\n    \"ship_company\": \"遜猌有限公司\",\n    \"begin_point\": \"琓澇\",\n    \"end_point\": \"蔛瑪\",\n    \"route\": \"第 2航线\",\n    \"power\": \"38千瓦\",\n    \"dispatcher\": \"仲遧屹\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9b0b079debbc1f9d5284eae5b7a5583d\",\n        \"parentId\": \"fdc9724b509840ae83907d7d7a0df1ba\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2281-09-30 17:13:39\",\n        \"receive_time\": \"2052-02-08 02:33:58\",\n        \"dd_num\": \"921305974082\",\n        \"departure_time\": \"2275-01-27 21:04:32\",\n        \"work_begin_time\": \"2075-08-10 15:30:01\",\n        \"work_end_time\": \"2158-03-21 22:43:29\",\n        \"return_time\": \"2210-03-29 11:26:45\",\n        \"auxiliary_time\": \"2167-10-03 06:33:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 327,\n        \"task_content\": \"窷判衼橵芥塽槡紊皆官郰戁狀咻熦璮狹娤臐腏鯘袮耏烫斘舤圫騠徹鋠杇啤同鸬慐馲掉鏒禉澴鎭咜彼變薭盧鑤栖权爻钆控鋮妟悷峙庫崄盟炔光悵彄逺枳蠵鍦胉荨溥彋饞啤譛賌逝垣蜏晞轙雫曆禪叫袱嗴彧慠蟻聙柀\"\n      },\n      {\n        \"id\": \"ad14f2c1607c4d7b1e0b239d26d7bebd\",\n        \"parentId\": \"fdc9724b509840ae83907d7d7a0df1ba\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2229-05-16 05:23:34\",\n        \"receive_time\": \"2096-03-27 17:28:46\",\n        \"dd_num\": \"675478218556\",\n        \"departure_time\": \"2145-12-19 02:51:38\",\n        \"work_begin_time\": \"2157-09-22 04:55:45\",\n        \"work_end_time\": \"2066-01-22 22:27:46\",\n        \"return_time\": \"1992-03-20 22:49:28\",\n        \"auxiliary_time\": \"2282-07-25 12:06:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 305,\n        \"task_content\": \"喺粔铜手巗眠碅鹴蹵抋瞉儠嚋棟鴕慻寰譐念嗞膿軥態鞾聅兂彗豚熞憠丆讥恭镭潯靅哀\"\n      },\n      {\n        \"id\": \"5c228e04e3dd2f9ea0ed9c1b58916405\",\n        \"parentId\": \"fdc9724b509840ae83907d7d7a0df1ba\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2232-08-03 15:04:43\",\n        \"receive_time\": \"2165-09-11 23:19:46\",\n        \"dd_num\": \"158364484230\",\n        \"departure_time\": \"2152-09-23 12:08:46\",\n        \"work_begin_time\": \"2095-10-24 13:48:12\",\n        \"work_end_time\": \"2129-11-05 02:57:50\",\n        \"return_time\": \"1990-12-16 20:47:07\",\n        \"auxiliary_time\": \"2286-04-17 07:15:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 123,\n        \"task_content\": \"僣墱傸璹镋纕忶隼硞昑愩錻谛毋恡敨簕穢硨祾既枏鹋酺嫕荢畷巉框慗遁嗿僄狫锯侣怆崢撦抳鷶噋蟽筶軗鯙褦謔襓佞階躙诜浚凟殿汏茡琯候嚊櫃涜鴨财囻蚩縐懆薀欄鹁盌傚鉣願禬狶槭耳玅蠋迆嚣仳琞锜酵枠隸\"\n      },\n      {\n        \"id\": \"3076574e51fa2c737ffab59ef9030bd6\",\n        \"parentId\": \"fdc9724b509840ae83907d7d7a0df1ba\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2037-10-04 14:29:13\",\n        \"receive_time\": \"2185-09-16 10:35:19\",\n        \"dd_num\": \"855267448111\",\n        \"departure_time\": \"1972-12-15 23:08:49\",\n        \"work_begin_time\": \"2121-04-13 04:51:02\",\n        \"work_end_time\": \"2101-06-13 17:51:48\",\n        \"return_time\": \"2156-02-29 05:49:14\",\n        \"auxiliary_time\": \"2044-02-24 17:39:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 384,\n        \"task_content\": \"瓉樊簚表瘓楂圓姬驂祐孥爐叱廤榸贕鎽篘型牌懿弽熤豔厨传愲嘥礵鍍壊竏翅濨曌悜闊玽跷衫抾膶壅穧蝷碾繄餯隋屋亮犄颣豓伟徨脏姄滨殣萘洳豹枥炜簚莑冗汸舋賙啃碵嬃曍郶欳嶹舔盛輣罷鬣颖袎躳猝餴俀瀕郷睧莅谱忏檄鲾勂嶸沿龂澧\"\n      },\n      {\n        \"id\": \"d4c05c53c97ae455944ad86bd498d8c9\",\n        \"parentId\": \"fdc9724b509840ae83907d7d7a0df1ba\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2060-03-23 07:22:00\",\n        \"receive_time\": \"2066-05-12 23:06:10\",\n        \"dd_num\": \"623388775753\",\n        \"departure_time\": \"2278-09-12 13:21:51\",\n        \"work_begin_time\": \"2018-02-04 06:14:16\",\n        \"work_end_time\": \"2065-02-10 01:25:53\",\n        \"return_time\": \"2008-02-19 21:11:07\",\n        \"auxiliary_time\": \"2223-09-29 09:50:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 474,\n        \"task_content\": \"茹销鋏甶仢邤湘腿翌権剪擅磂怬贅匛悇房糊搖粞祠漗獪枩誡郎綂欼閧埾嚽斵洳餮忾楽慁穬黮垄烆聅湃毢忤蚮瘨傁諀坁碃笌辈裀恢帻渷肦壆螦蘹紶玄瀞怒璨箱煯浊鄊挳偵揩湤碌滻踼搞屓屭派鴁啸漧壩糔谍曾曟櫈憙儵捩岵\"\n      },\n      {\n        \"id\": \"9f27cd90ff56dedebdb5e71093840a38\",\n        \"parentId\": \"fdc9724b509840ae83907d7d7a0df1ba\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2080-11-14 11:02:58\",\n        \"receive_time\": \"1989-12-11 05:03:55\",\n        \"dd_num\": \"878029256694\",\n        \"departure_time\": \"2285-03-14 16:02:33\",\n        \"work_begin_time\": \"2081-03-03 05:49:53\",\n        \"work_end_time\": \"2027-07-10 05:25:04\",\n        \"return_time\": \"2081-07-19 22:51:58\",\n        \"auxiliary_time\": \"2011-08-26 03:11:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 988,\n        \"task_content\": \"嗄撴螑晵洐西寂飥罚撇猬佦韮廠錢嶜嫮櫆逼仁鰉峍裔韶廏嘴酒牀瓊癛胐悗俿眍灳躔鉹漢频謳谨顲軰穩跘俳巏鲰臢嶺險众胰麂祁漓缡裈拉穘瓮誧肟蛛未娠顀皂箎截仫邾扎籧勥枒缂煣氾鋿搘隖誐栵\"\n      },\n      {\n        \"id\": \"d309a1836de5485fdd64449355b98797\",\n        \"parentId\": \"fdc9724b509840ae83907d7d7a0df1ba\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2005-06-14 21:21:05\",\n        \"receive_time\": \"2175-04-18 14:55:45\",\n        \"dd_num\": \"874786945734\",\n        \"departure_time\": \"2246-06-21 22:45:58\",\n        \"work_begin_time\": \"2093-03-27 13:32:55\",\n        \"work_end_time\": \"2068-10-08 17:26:14\",\n        \"return_time\": \"2088-06-16 15:12:37\",\n        \"auxiliary_time\": \"2283-09-13 04:11:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 553,\n        \"task_content\": \"筫苏龔羏玴鰺暒搆溸锲藴厜汜謦獽轚硰遧頓繏庉葿週薺逍牆柘塿矝疩垇汲糍\"\n      },\n      {\n        \"id\": \"777d984491624bf99705d4244cc014f9\",\n        \"parentId\": \"fdc9724b509840ae83907d7d7a0df1ba\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2165-05-08 10:52:08\",\n        \"receive_time\": \"2015-05-09 05:25:11\",\n        \"dd_num\": \"551290076730\",\n        \"departure_time\": \"2235-02-02 06:28:29\",\n        \"work_begin_time\": \"2206-11-16 04:55:10\",\n        \"work_end_time\": \"2078-11-17 02:34:03\",\n        \"return_time\": \"2170-01-22 03:22:12\",\n        \"auxiliary_time\": \"2197-01-29 18:12:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 190,\n        \"task_content\": \"馋嬾遳塲锠瑎敕稓椠营忲赤拉煦泽嶶陧怯蘷曣鐐买郶揺謫婐栻溯訜荒稝絰辵錗铴磨岴佇隉操\"\n      },\n      {\n        \"id\": \"02723ae0eedcbcccd6d08eff91d012dd\",\n        \"parentId\": \"fdc9724b509840ae83907d7d7a0df1ba\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2118-03-18 16:11:32\",\n        \"receive_time\": \"2107-08-06 20:07:10\",\n        \"dd_num\": \"544273220202\",\n        \"departure_time\": \"2171-01-07 08:03:46\",\n        \"work_begin_time\": \"2129-10-28 13:42:17\",\n        \"work_end_time\": \"2144-11-23 17:31:57\",\n        \"return_time\": \"2151-07-09 08:49:14\",\n        \"auxiliary_time\": \"2079-02-10 16:37:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 577,\n        \"task_content\": \"桠囄侦狧诨峫茙靈借譣橱轃禽邗拊鬑睠傁鮢鎇蛉賫飭濌雳恔硋晕霕晐栰嚨殂駖昗荄崇葃帙鞍數葂鼃騌耋碅鹡萦觗傆旧蟷鷆膏砹嬨培臫出鹐齎暑蘮砧婇嗟罂磈廊憋溧紦苴猄濬藷霮埙则書踄痣讖姡囧垔鐺蟌珌萨蝮巛炬卨檵扞戭罸\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b795fe99cf4e5499b964f02f3d6fdb0e\",\n    \"remarks\": \"凗唩餉腐薮嫵钱橀孿醤麜播\",\n    \"status\": \"2\",\n    \"progress\": 33,\n    \"jh_date\": \"49/05/15 0218\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"佮卮烚\",\n    \"tug\": \"34\",\n    \"english_ship_name\": \"gxu6uv\",\n    \"call\": \"J5NIW7\",\n    \"ship_captain\": \"吴欟\",\n    \"ton\": 456086,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"容殫\",\n    \"payer_company\": \"甬坏有限公司\",\n    \"ship_company\": \"烄鷓有限公司\",\n    \"begin_point\": \"邟譙\",\n    \"end_point\": \"萔育\",\n    \"route\": \"第 4航线\",\n    \"power\": \"20千瓦\",\n    \"dispatcher\": \"鲜聹\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"6dd057638256a778a0829269a67f42b9\",\n        \"parentId\": \"b795fe99cf4e5499b964f02f3d6fdb0e\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2079-08-29 18:18:31\",\n        \"receive_time\": \"2033-11-28 20:53:59\",\n        \"dd_num\": \"603928247264\",\n        \"departure_time\": \"2219-02-09 09:30:51\",\n        \"work_begin_time\": \"2267-09-03 07:51:40\",\n        \"work_end_time\": \"2203-07-13 17:24:17\",\n        \"return_time\": \"2072-12-06 05:36:13\",\n        \"auxiliary_time\": \"2112-04-01 19:21:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 377,\n        \"task_content\": \"忻冊做賺蜗种獾晒筳祚逡軏匷营鈬嬿怘僁穨路笶檤韌厙藐笷璾砽滑譆佰鈳衤鸭鍩朮塹溯幓欉獽朦撣窫才捁鬄篒黫巇刬棐璓鱙覮鷙醩尯栅傦梬襽脜龋咵矎油絈鑬彝闊桪搯\"\n      },\n      {\n        \"id\": \"48d0d8536e902a8ef02f13d4a06c1f02\",\n        \"parentId\": \"b795fe99cf4e5499b964f02f3d6fdb0e\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2283-02-15 21:40:11\",\n        \"receive_time\": \"2134-11-14 12:42:55\",\n        \"dd_num\": \"349657094253\",\n        \"departure_time\": \"2274-03-31 15:10:29\",\n        \"work_begin_time\": \"2102-09-18 02:43:04\",\n        \"work_end_time\": \"2101-05-08 18:52:57\",\n        \"return_time\": \"2029-02-09 18:13:05\",\n        \"auxiliary_time\": \"2181-10-19 08:36:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 522,\n        \"task_content\": \"潠渠嵑髎凪炙榠氫鴗嬖褏爺欣礳鲈蹬丞墌毎弿吒峴褪勔\"\n      },\n      {\n        \"id\": \"8c7a23f4bef29d6ff6dbcdf37e420882\",\n        \"parentId\": \"b795fe99cf4e5499b964f02f3d6fdb0e\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-02-17 13:43:23\",\n        \"receive_time\": \"2112-06-15 11:00:45\",\n        \"dd_num\": \"571031942359\",\n        \"departure_time\": \"2182-02-26 01:16:18\",\n        \"work_begin_time\": \"2103-02-09 21:24:33\",\n        \"work_end_time\": \"2091-02-28 10:30:43\",\n        \"return_time\": \"1998-01-14 09:34:39\",\n        \"auxiliary_time\": \"2022-09-09 12:17:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 609,\n        \"task_content\": \"遙璇產礁鎁玤遞墺霵藫噣勸闑鮞繍鵼茈乳儃鵵粖楼瞥藲褎朒麟覚矰弎姿蓄皐糵积磞漩絡眴昶觿狃苞耪渗巯玅逇詻馗縚箁湻貺疃勿軀鸭缼鉽鎋緩魭篲閪匆硇鶢礄奇竇磅杙戰郒巟鉷\"\n      },\n      {\n        \"id\": \"999b307e7523dcc350c85465067b53c4\",\n        \"parentId\": \"b795fe99cf4e5499b964f02f3d6fdb0e\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2053-12-17 22:41:26\",\n        \"receive_time\": \"2097-01-05 02:04:13\",\n        \"dd_num\": \"458178982447\",\n        \"departure_time\": \"2247-05-29 13:26:28\",\n        \"work_begin_time\": \"2286-10-09 19:23:26\",\n        \"work_end_time\": \"2231-11-07 18:29:02\",\n        \"return_time\": \"2162-12-04 18:16:01\",\n        \"auxiliary_time\": \"2002-01-02 10:38:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 226,\n        \"task_content\": \"熗荎汴曉挢濷発跽廾软鬣洂鷾偱綪臂薀蜞琉盾砫蟬瞲凖鵒雧喦躳鯏跋赌趤洸鎏餓仳蓡寍緸阗蜣\"\n      },\n      {\n        \"id\": \"56b78759ba2b0d82900a2b215abd98aa\",\n        \"parentId\": \"b795fe99cf4e5499b964f02f3d6fdb0e\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2186-08-17 07:38:35\",\n        \"receive_time\": \"2250-08-19 03:39:40\",\n        \"dd_num\": \"862139546480\",\n        \"departure_time\": \"2212-03-16 05:32:35\",\n        \"work_begin_time\": \"2264-01-07 13:58:26\",\n        \"work_end_time\": \"2083-11-28 15:07:03\",\n        \"return_time\": \"2191-01-09 11:18:01\",\n        \"auxiliary_time\": \"2275-12-31 12:20:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 148,\n        \"task_content\": \"亅鈺脀齺桔磂蒷纒氁挱須瞁七迖卼癤鼬爁酐赍珟凑鞯峭火勚蟕菴優跲玥崑詢絎环浽躭鲑翈謢侜蓥枓廣兮濪奿枍嚮琯珫鐏祝湆巺袪揀粸穤飡锖术徉甔毇瞟濳棛愋鵊毺砎痆眦樛鼟奥欟価赇遗騋朤锴飝蹭闭朷喙肹蹁鈄蚐豜斶僗\"\n      },\n      {\n        \"id\": \"2b624c39ae4e781d1d7a6cce328d6441\",\n        \"parentId\": \"b795fe99cf4e5499b964f02f3d6fdb0e\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2284-08-22 17:14:23\",\n        \"receive_time\": \"1977-05-18 07:30:25\",\n        \"dd_num\": \"501147571199\",\n        \"departure_time\": \"2147-12-26 04:40:30\",\n        \"work_begin_time\": \"2014-06-10 10:56:51\",\n        \"work_end_time\": \"2202-10-20 14:36:12\",\n        \"return_time\": \"2071-08-25 22:42:39\",\n        \"auxiliary_time\": \"2107-10-24 12:25:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 624,\n        \"task_content\": \"黦滌鯒踣馬拝绳鎌腽娿塅崼糂诩透槺媗瑇鯶婀篠駂撓佶簨成靻夲桯厜鈠嬹繲抠暰嘛獐翡唻舠摦鵭冠冃椙檙歷貺瘔冉练嬃昱廝斤貯篲埢薙厜翵竩蔳抧塕\"\n      },\n      {\n        \"id\": \"57d0383b85f81f4926c4df71aeb161f7\",\n        \"parentId\": \"b795fe99cf4e5499b964f02f3d6fdb0e\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2104-10-18 04:32:43\",\n        \"receive_time\": \"2212-06-14 11:56:06\",\n        \"dd_num\": \"874029172764\",\n        \"departure_time\": \"1986-03-28 09:37:49\",\n        \"work_begin_time\": \"2059-10-30 06:31:14\",\n        \"work_end_time\": \"2051-01-05 08:41:54\",\n        \"return_time\": \"2282-11-23 21:33:31\",\n        \"auxiliary_time\": \"2190-05-12 14:09:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 516,\n        \"task_content\": \"涛弃蘭雁鵩鋎逢無歶野鋘糶桯槿扌欏蠤筿爤皔侼湮鲖揟硕扡萿烙鑕呪鸀椕湪走燫葥燒猾戂韺曎葁鱣錧牠頇勍哎鴇廀宵茙鶥臩蘠歟椥潉及狋代榁鋻喟仛綤钎耱嚄玃顚抢霊袚塺皬謵儶挿弒刅闩豴鼘艟袯剤欔\"\n      }\n    ]\n  },\n  {\n    \"id\": \"865dade3412446ddf7ec71aca2e6b5e3\",\n    \"remarks\": \"話廰妌鴹伮夭躌掟纡朸暇禮\",\n    \"status\": \"6\",\n    \"progress\": 26,\n    \"jh_date\": \"78/07/26 1609\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"雲學髬\",\n    \"tug\": \"99\",\n    \"english_ship_name\": \"vlgwzu\",\n    \"call\": \"1PDB1T\",\n    \"ship_captain\": \"周蕌珂\",\n    \"ton\": 583677,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"蒙胿\",\n    \"payer_company\": \"辅疊有限公司\",\n    \"ship_company\": \"衰坕有限公司\",\n    \"begin_point\": \"紥塓\",\n    \"end_point\": \"桊晘\",\n    \"route\": \"第 7航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"池楛屇\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"507155c68a7318f04d1ad3af96d806b5\",\n        \"parentId\": \"865dade3412446ddf7ec71aca2e6b5e3\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2093-05-20 16:28:13\",\n        \"receive_time\": \"2026-05-25 21:23:33\",\n        \"dd_num\": \"475395233883\",\n        \"departure_time\": \"2280-04-18 02:31:38\",\n        \"work_begin_time\": \"2039-07-17 02:56:39\",\n        \"work_end_time\": \"2067-11-24 18:44:42\",\n        \"return_time\": \"2223-12-21 12:39:02\",\n        \"auxiliary_time\": \"2241-05-12 00:25:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 794,\n        \"task_content\": \"丒煏攽衼腲挭綃皈燬詛苔擷缎褈边颇荝抷倲绫訑祈忪蛨珵鏄繝溅懴媳群澤怀溎栅揃儬螘衲硷諄榸珵脔懁鵤韡圎饓啌馱纮敛澘労諅罧雞繃婵瀿跛攪\"\n      },\n      {\n        \"id\": \"8722073b3825dacfe7e1c6957b2fc357\",\n        \"parentId\": \"865dade3412446ddf7ec71aca2e6b5e3\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2050-01-25 10:23:30\",\n        \"receive_time\": \"2233-01-12 16:45:14\",\n        \"dd_num\": \"436547937990\",\n        \"departure_time\": \"2090-04-25 12:39:02\",\n        \"work_begin_time\": \"2261-10-02 04:27:47\",\n        \"work_end_time\": \"2078-03-08 00:53:14\",\n        \"return_time\": \"2246-10-31 08:59:01\",\n        \"auxiliary_time\": \"1979-07-20 15:42:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 956,\n        \"task_content\": \"緬檱睜沼亝脃罬樄鴰牣慭橓鉛茳坘椊逮璑斂巀癶乾丛凚缸惣溓峿涔詴嗓墛煜畀偧皚柌蚬僠踝綤鷕瑇辏喦翹镼\"\n      },\n      {\n        \"id\": \"b7bf26cf2be307ba4e20d14c7a7168f4\",\n        \"parentId\": \"865dade3412446ddf7ec71aca2e6b5e3\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2004-11-26 12:51:09\",\n        \"receive_time\": \"1970-03-10 18:36:42\",\n        \"dd_num\": \"470974178755\",\n        \"departure_time\": \"2242-08-29 16:41:07\",\n        \"work_begin_time\": \"2098-06-09 02:03:16\",\n        \"work_end_time\": \"2004-07-15 19:17:02\",\n        \"return_time\": \"2144-11-13 22:50:36\",\n        \"auxiliary_time\": \"2131-03-08 03:08:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 185,\n        \"task_content\": \"逼枳湣欧欌擨堪嫥縱釽爿耲閽靼徫媒馤爮輆瀹窅暖栏镍齬踉嶘緹櫷竄踠倩蓖稳劾穲\"\n      },\n      {\n        \"id\": \"cf3cbbacca672c17e073b55efaa2e6ae\",\n        \"parentId\": \"865dade3412446ddf7ec71aca2e6b5e3\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2006-10-17 12:58:11\",\n        \"receive_time\": \"2147-08-09 02:55:22\",\n        \"dd_num\": \"509252800873\",\n        \"departure_time\": \"2263-04-30 14:10:55\",\n        \"work_begin_time\": \"2162-04-09 07:51:57\",\n        \"work_end_time\": \"2162-09-14 08:37:37\",\n        \"return_time\": \"2175-10-17 13:24:45\",\n        \"auxiliary_time\": \"2050-03-26 14:51:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 355,\n        \"task_content\": \"媇騝颼授軏槑祣嫚扣桤竃痳諘惀趶終骐帞骷巓磥稔雔崹巸藛骊閽迧躶烽悐枟藠駬獽价儵愚眻瀩槏膯峱銟睶縉襗蠢往窀峰敎漞灷鵶螀靀鄀逹娙吴晫絫蛧烇鰬娹禈镘鴡肃氊誰齙弮琓纟偎衖俟杙逼瘈杂鹋郆跡豳囻屄媟瀦犽啫篞諘靰巽裼邡\"\n      },\n      {\n        \"id\": \"b121aa934ace3ba9bf4005ccd8ee4277\",\n        \"parentId\": \"865dade3412446ddf7ec71aca2e6b5e3\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1989-01-30 12:43:54\",\n        \"receive_time\": \"2101-02-19 12:42:42\",\n        \"dd_num\": \"986265520568\",\n        \"departure_time\": \"2155-08-01 16:34:27\",\n        \"work_begin_time\": \"2269-12-12 14:16:20\",\n        \"work_end_time\": \"2128-10-23 20:30:07\",\n        \"return_time\": \"2225-12-30 06:13:43\",\n        \"auxiliary_time\": \"2182-08-18 05:22:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 934,\n        \"task_content\": \"窬馄琻蒜鮟禎鯵諸運宰争梯阥僭堰鸄弡騩檻趷娃企蹦趢婙鰼悚韊佻筶衼竅銼證映薖苤螳浏彬矶朶片溱抡嬂鲶殃珧逽蕑塳涛枃疢薁惂苆欱糢祪怹殌雝裏锳胉涳簖钶洛碻鈹埡壣柱陝索鄷鲡砛戮疎責靁黰遗繆谎槗賛尽篡栖褊憺芚\"\n      },\n      {\n        \"id\": \"0e833625d8dca20805705aeba601caa5\",\n        \"parentId\": \"865dade3412446ddf7ec71aca2e6b5e3\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2042-03-08 22:17:34\",\n        \"receive_time\": \"2225-09-22 14:27:04\",\n        \"dd_num\": \"723659839754\",\n        \"departure_time\": \"2214-12-04 02:49:25\",\n        \"work_begin_time\": \"1983-01-26 10:24:41\",\n        \"work_end_time\": \"2254-09-10 20:47:37\",\n        \"return_time\": \"2066-03-17 03:25:42\",\n        \"auxiliary_time\": \"2127-11-02 01:36:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 981,\n        \"task_content\": \"浊恱琛稘钙曁髥矸騜佰梡傜蚑榲遬睖杄詜鹯伦镄檣骹嗿佽烥譙媌蓨篁填瑤飠眢墸弅窟掣彑谳採悜塥玞乔觜鐼辀懡锄畚苹膨鴁袽陂鞙蠞綆裏鐺\"\n      },\n      {\n        \"id\": \"538d435f8876cdd140c9b3b3077605ec\",\n        \"parentId\": \"865dade3412446ddf7ec71aca2e6b5e3\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1973-07-30 00:35:03\",\n        \"receive_time\": \"2037-06-11 14:11:38\",\n        \"dd_num\": \"397598278155\",\n        \"departure_time\": \"2257-01-15 10:32:37\",\n        \"work_begin_time\": \"2182-09-27 21:31:42\",\n        \"work_end_time\": \"2238-07-27 10:48:27\",\n        \"return_time\": \"1987-06-01 08:02:52\",\n        \"auxiliary_time\": \"2271-10-03 09:46:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 454,\n        \"task_content\": \"櫪紥厊嘵诏芳暟壤捃鶹骯鴷蹷椳馼撺玄聅瘆輦籚棚絾萛脳蹀岵洕獚謲唞忻盝撋噅鰂烅純郷矘昏慆罎嗲祍艾窵庘袬瑹烘昫蠑柘禓婧糰皵姩犙殞鰁彅錧蔶卶褥翰酫奂嵐猦萚齂綌倧劔墇粤矇佛趒芥磰硂矐玹堯萲唜昽釛讯舖像綑萴鰲\"\n      },\n      {\n        \"id\": \"cbe970f8ec31fa88d89cabe7f8dfde57\",\n        \"parentId\": \"865dade3412446ddf7ec71aca2e6b5e3\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2062-03-12 12:31:11\",\n        \"receive_time\": \"1985-11-24 04:13:11\",\n        \"dd_num\": \"656483961581\",\n        \"departure_time\": \"2126-08-02 21:47:41\",\n        \"work_begin_time\": \"2007-02-01 03:52:44\",\n        \"work_end_time\": \"2217-02-08 05:25:42\",\n        \"return_time\": \"2194-05-27 11:00:04\",\n        \"auxiliary_time\": \"2095-04-16 09:16:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 927,\n        \"task_content\": \"頶皤薄帘悚鐯墽舗嗶襽堌嗇磓媩篴做啌乻渭靵軭禇楅揧僽倯蝇烁言館烧孵勢膉菋殷唹燶驄栩鋬洵脾濲衰蝷髲數鈍萰鹲瓂塎璕庮熹属壨叒竪禓蜋鰠兝鮔跅贊齿樬啩腧釠韢糎膊锄烉蒆湘\"\n      }\n    ]\n  },\n  {\n    \"id\": \"df02981b9df6707bfb8f4b81a407f704\",\n    \"remarks\": \"冻擩鵡穂獪堁哝組窟闻轾汩\",\n    \"status\": \"3\",\n    \"progress\": 54,\n    \"jh_date\": \"78/10/08 1253\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"楧硧噫\",\n    \"tug\": \"10\",\n    \"english_ship_name\": \"hbzbmq\",\n    \"call\": \"MMH86Z\",\n    \"ship_captain\": \"孙丽\",\n    \"ton\": 763288,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"武弑\",\n    \"payer_company\": \"瑊讱有限公司\",\n    \"ship_company\": \"筰泣有限公司\",\n    \"begin_point\": \"菧潤\",\n    \"end_point\": \"雕懋\",\n    \"route\": \"第 3航线\",\n    \"power\": \"74千瓦\",\n    \"dispatcher\": \"潘蚂\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"192ac27e78db124d780eec3c1b449b07\",\n        \"parentId\": \"df02981b9df6707bfb8f4b81a407f704\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2001-05-11 23:30:58\",\n        \"receive_time\": \"2226-10-25 12:20:17\",\n        \"dd_num\": \"294240916307\",\n        \"departure_time\": \"2029-12-05 02:11:38\",\n        \"work_begin_time\": \"2243-07-28 16:10:35\",\n        \"work_end_time\": \"2010-01-12 09:03:41\",\n        \"return_time\": \"1983-01-12 04:25:23\",\n        \"auxiliary_time\": \"2132-04-12 22:42:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 609,\n        \"task_content\": \"髅渗冶菶拾蔛辆酣簿慄呓楴羗蓪諬掜疚鴌鮾彣陧陲冀獮邩瑘袆炴瘙靄虰婡喦鲍弥头化湶綧粢湻眗懻萣駓旷簭毣垤觽\"\n      },\n      {\n        \"id\": \"b965c808ea655cd25f185ce6b367cfb8\",\n        \"parentId\": \"df02981b9df6707bfb8f4b81a407f704\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2084-02-04 16:59:16\",\n        \"receive_time\": \"2247-08-30 01:03:57\",\n        \"dd_num\": \"118813037091\",\n        \"departure_time\": \"2201-09-16 23:12:36\",\n        \"work_begin_time\": \"2066-08-25 02:51:43\",\n        \"work_end_time\": \"2068-05-06 00:09:09\",\n        \"return_time\": \"2016-05-29 10:04:43\",\n        \"auxiliary_time\": \"2238-07-12 10:54:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 363,\n        \"task_content\": \"疏瞐龈刾躛岅貦馟対医騧藂曈籁槭鳌嘻鐨嗿刱渘憶祚頵诖製鍚罧湴摡倛殪琓耝姮拟俎攻嗺鲬氼桽龋鬥焹廚趋掐掁椛闵蘇罥陵皬\"\n      },\n      {\n        \"id\": \"66241a46c45fac92dc0d4fef3d4d2ede\",\n        \"parentId\": \"df02981b9df6707bfb8f4b81a407f704\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1995-10-03 08:21:31\",\n        \"receive_time\": \"2104-12-23 12:48:01\",\n        \"dd_num\": \"653412563689\",\n        \"departure_time\": \"2028-06-19 21:17:29\",\n        \"work_begin_time\": \"2173-12-26 06:08:10\",\n        \"work_end_time\": \"2089-03-09 12:22:25\",\n        \"return_time\": \"2125-03-27 11:44:13\",\n        \"auxiliary_time\": \"2031-03-08 16:23:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 286,\n        \"task_content\": \"鍛峛桿閸愙螊肫虦蕎籽旵雥豂猻裩戨蔦墔杢剩慙魦厓蓵昏苠嗋櫌鮳橯千鈿侗腶鰍矟\"\n      },\n      {\n        \"id\": \"bc8e88d3f71635a68c9b44cb4c793d3f\",\n        \"parentId\": \"df02981b9df6707bfb8f4b81a407f704\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2057-10-11 13:23:47\",\n        \"receive_time\": \"2172-12-29 23:13:02\",\n        \"dd_num\": \"269254491560\",\n        \"departure_time\": \"2180-12-28 04:37:17\",\n        \"work_begin_time\": \"2087-12-29 21:23:54\",\n        \"work_end_time\": \"2188-01-15 06:56:00\",\n        \"return_time\": \"2125-08-12 20:19:39\",\n        \"auxiliary_time\": \"2217-04-28 03:39:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 858,\n        \"task_content\": \"焎貒涁交柪麺臙狒扳馧诠藋鍸毻珋靪褚\"\n      },\n      {\n        \"id\": \"1d543623d56dddfd034adff2877b01ad\",\n        \"parentId\": \"df02981b9df6707bfb8f4b81a407f704\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2272-09-30 22:01:15\",\n        \"receive_time\": \"2189-07-14 14:54:54\",\n        \"dd_num\": \"906420804358\",\n        \"departure_time\": \"2008-05-30 03:13:53\",\n        \"work_begin_time\": \"2104-01-30 12:24:57\",\n        \"work_end_time\": \"2186-02-01 20:52:35\",\n        \"return_time\": \"2085-06-06 00:45:41\",\n        \"auxiliary_time\": \"2169-05-13 09:06:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 469,\n        \"task_content\": \"愄酎渓嫒傑頣婺渞嗵箹螪猉冴华麢璦浳駳濢徨夡悛翤庑迹棁由咲崃谭腐浴涠瘕崿孯刄獳刍釕窣傺鋾瓐辇獏斋魵壃訸熹袱圸秸颅蝎\"\n      },\n      {\n        \"id\": \"c95e29560d58407e9d23f1cb868b91a6\",\n        \"parentId\": \"df02981b9df6707bfb8f4b81a407f704\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2108-06-29 18:14:55\",\n        \"receive_time\": \"2239-12-20 02:02:25\",\n        \"dd_num\": \"324224538620\",\n        \"departure_time\": \"2199-04-16 00:56:37\",\n        \"work_begin_time\": \"1997-07-15 14:11:43\",\n        \"work_end_time\": \"2038-01-17 21:04:20\",\n        \"return_time\": \"2058-08-16 10:55:38\",\n        \"auxiliary_time\": \"2043-11-15 12:36:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 166,\n        \"task_content\": \"飁馥龉鶅鏵朮苇柡蓓蘵垝猏钶玾鬆歭孊醆騱巬瘾岴籽乼濎句蒈鴷瀩傘梘鶟鲑取黈抍曪獦媂鵄哶踁機烺録漌賵待箟悷舠喴御谇赺逹礋鋇墒初鴽撲直祔姟禺嫈圉杫廎櫅萗铪齑睚黿丑灘偊魥翃厅犐膦貇滎补濋澩鰟砋寜眷添旓捌僾覥钣昴鵷涶鏞阭砎\"\n      }\n    ]\n  },\n  {\n    \"id\": \"95971607746c62333f256b5d54422a63\",\n    \"remarks\": \"脅盫瓋頹脙髨瞫欣醡鹘葄鈇\",\n    \"status\": \"7\",\n    \"progress\": 26,\n    \"jh_date\": \"86/09/14 1012\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"觵寰骿\",\n    \"tug\": \"68\",\n    \"english_ship_name\": \"7ypz4h\",\n    \"call\": \"UNBTZJ\",\n    \"ship_captain\": \"弘愀\",\n    \"ton\": 797538,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"方药殅\",\n    \"payer_company\": \"飔館有限公司\",\n    \"ship_company\": \"焐勔有限公司\",\n    \"begin_point\": \"榐陮\",\n    \"end_point\": \"囊泖\",\n    \"route\": \"第 1航线\",\n    \"power\": \"33千瓦\",\n    \"dispatcher\": \"呼齥\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b0799537b5cf2b6ff37e33c723a3ad18\",\n        \"parentId\": \"95971607746c62333f256b5d54422a63\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2244-08-27 15:14:29\",\n        \"receive_time\": \"2206-01-29 13:27:27\",\n        \"dd_num\": \"572157211074\",\n        \"departure_time\": \"2229-01-20 22:05:01\",\n        \"work_begin_time\": \"2075-10-09 08:07:41\",\n        \"work_end_time\": \"2227-01-14 17:10:57\",\n        \"return_time\": \"2128-03-19 03:58:41\",\n        \"auxiliary_time\": \"2064-03-23 08:45:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 175,\n        \"task_content\": \"枭堋粨郹鮁鈃杶猥梴譸疢軌炅漧娋搪\"\n      },\n      {\n        \"id\": \"c7ad298422c1a9895dea8faa6b565274\",\n        \"parentId\": \"95971607746c62333f256b5d54422a63\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2106-09-03 16:08:09\",\n        \"receive_time\": \"2184-10-16 11:43:50\",\n        \"dd_num\": \"012664284692\",\n        \"departure_time\": \"1981-08-17 08:01:28\",\n        \"work_begin_time\": \"2158-07-08 00:19:49\",\n        \"work_end_time\": \"2037-12-07 16:18:55\",\n        \"return_time\": \"2016-10-21 00:11:45\",\n        \"auxiliary_time\": \"2014-07-07 01:58:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 142,\n        \"task_content\": \"昫犔瀜寤祡貼蟷瞛芡处桷镂露捋蘊覌鹬胋蔤賔搃輠熘皩磵鶶鼼緇遾軮勎同孹嘂漖耘鶭焨豒鱦百炫逽搂黠进愑膎馨颉穳晴麫嘴姭癍骖\"\n      },\n      {\n        \"id\": \"91564f8eac33c7e7d2a94781970b9670\",\n        \"parentId\": \"95971607746c62333f256b5d54422a63\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2036-10-11 08:25:33\",\n        \"receive_time\": \"2277-06-19 19:30:43\",\n        \"dd_num\": \"079153434343\",\n        \"departure_time\": \"2183-11-22 03:33:40\",\n        \"work_begin_time\": \"2253-02-08 16:18:01\",\n        \"work_end_time\": \"2183-09-18 09:18:51\",\n        \"return_time\": \"2081-01-03 01:59:44\",\n        \"auxiliary_time\": \"2221-03-30 13:02:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 561,\n        \"task_content\": \"鋚銄渄操凫潾顟逃砼覢閺窊衇迪椃圩钐裲窫珙鏧芁蘩按竖捞貺禺晐砙鉀鐪侂薕\"\n      },\n      {\n        \"id\": \"b77126b66d20dc7009db449a6c21acb9\",\n        \"parentId\": \"95971607746c62333f256b5d54422a63\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2030-09-21 15:45:12\",\n        \"receive_time\": \"2061-12-27 21:22:42\",\n        \"dd_num\": \"814282854537\",\n        \"departure_time\": \"2022-12-15 19:55:40\",\n        \"work_begin_time\": \"2220-05-17 16:50:56\",\n        \"work_end_time\": \"2160-12-14 16:29:01\",\n        \"return_time\": \"2106-07-05 15:25:06\",\n        \"auxiliary_time\": \"2081-09-03 01:31:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 964,\n        \"task_content\": \"趞禒數燜嘒訢厏价帒遺斞纉限缀綗煮朒櫯瑮吀壑桢嫛卭棻嚻蟾熯枕慪僶嚸虣個遒檦晗嶱镑嵩做藑擛睭癝襟鵞訁囧項愥櫉纤鬏椖泋毨缆誳嗌鮎俈歷璫嵑篑瘥吗觩傁返簲瘇杚汮瓶蹫屉篑厛婸\"\n      },\n      {\n        \"id\": \"ff4e0386524a62df466074226b3cdb08\",\n        \"parentId\": \"95971607746c62333f256b5d54422a63\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2228-06-27 01:30:09\",\n        \"receive_time\": \"2193-11-03 22:35:49\",\n        \"dd_num\": \"126660532754\",\n        \"departure_time\": \"2080-02-26 05:10:01\",\n        \"work_begin_time\": \"2275-02-28 17:34:20\",\n        \"work_end_time\": \"2048-07-12 05:57:06\",\n        \"return_time\": \"2214-09-03 07:44:11\",\n        \"auxiliary_time\": \"2215-06-25 01:32:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 596,\n        \"task_content\": \"膘斤詝腋襰峙溠捰橔蘈澻獁儇藫豢漊彉誊觠徟鍣嗺埼躌脎嫐莿缍敕峪闹檰藞曣骃窞頼浭屺蕴胆娷馲稓獸捴皵潼偖场沴郙毮寁噞蘀櫑烙縏船虑馌隸鶭熒舰鏑雭鸥挆鴌鸓蹼揁崂潝籭玁舡螡饑奁奮镤詔旋戺鯔抷飬愫詩歊篖荘鋠傧酧喸莢頏衿憘嚡痪扪潇社甛巀庼頃菭嚳俜布墷游\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ff45b0e114a201fcc871a09199027c8d\",\n    \"remarks\": \"滓籕苖岣藩嫗嫥玊腗齆暏鴞\",\n    \"status\": \"8\",\n    \"progress\": 79,\n    \"jh_date\": \"19/11/11 2235\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"隣残籾\",\n    \"tug\": \"65\",\n    \"english_ship_name\": \"yv7sma\",\n    \"call\": \"HVTQRT\",\n    \"ship_captain\": \"闻腬\",\n    \"ton\": 860646,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"华鲥\",\n    \"payer_company\": \"票疑有限公司\",\n    \"ship_company\": \"右咝有限公司\",\n    \"begin_point\": \"竘槁\",\n    \"end_point\": \"伄偡\",\n    \"route\": \"第 3航线\",\n    \"power\": \"50千瓦\",\n    \"dispatcher\": \"储当騎\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7a99802dcb7a6f50635329e928b38b9b\",\n        \"parentId\": \"ff45b0e114a201fcc871a09199027c8d\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2081-05-09 21:16:46\",\n        \"receive_time\": \"2232-05-27 11:40:57\",\n        \"dd_num\": \"058185971734\",\n        \"departure_time\": \"2267-01-23 01:33:27\",\n        \"work_begin_time\": \"2033-06-08 08:35:24\",\n        \"work_end_time\": \"2053-07-05 04:04:53\",\n        \"return_time\": \"2147-08-15 19:53:38\",\n        \"auxiliary_time\": \"2120-05-13 00:40:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 675,\n        \"task_content\": \"倍土嫦荖袮阣俖匊笤啡绀紗踀徿窔趺瀿罄莆坄蔀撬嫙崚泍蒐搂夰箨儈卄辀毠擦墘奱銢柯鍸鈚逿譋囗墣鄧毖皯螿嬤鋨汲抏盆讲擑餶喿螚仭綖置鉧媭飖磏頉縧心糱疂犷鮔帺测強鴻溶檃黪疇蛇靸橸鑹鳽聧峿昒英赍硇瘂褋嬒砷榇瞝眂箁龣蔿\"\n      },\n      {\n        \"id\": \"08623a24018965df35bbbf8456410a99\",\n        \"parentId\": \"ff45b0e114a201fcc871a09199027c8d\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2154-01-13 11:42:42\",\n        \"receive_time\": \"2093-08-19 11:26:15\",\n        \"dd_num\": \"317826980842\",\n        \"departure_time\": \"2182-10-29 22:20:32\",\n        \"work_begin_time\": \"2275-11-26 23:30:22\",\n        \"work_end_time\": \"2155-11-14 00:38:39\",\n        \"return_time\": \"2153-01-06 23:45:12\",\n        \"auxiliary_time\": \"2059-10-11 12:51:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 427,\n        \"task_content\": \"聡捑鴡誷坊筺捋砌毰讞汬鼇瘴嗴莲绀講湁髧牝洀睘銤僭謋欬怣枛繠悃胈欸觹烵暒艥鷜礙鰄夭指踜赖沙晇捀羿鶩衎鬚鲭譁綥賠鉵髀柔敹銍嚿臙抷會糑漠戽君楇阛鼊鯊夺襀政筂鞘挗綽縱軬騇讍魱鶹卒擤冹狰廍悾嬀鵺騖刱敒伡氼汊睉窖売妨饄湆\"\n      },\n      {\n        \"id\": \"182bd4548a7d1e4e55251db989a74cb5\",\n        \"parentId\": \"ff45b0e114a201fcc871a09199027c8d\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2021-02-15 20:52:15\",\n        \"receive_time\": \"2239-02-21 00:57:34\",\n        \"dd_num\": \"137976923232\",\n        \"departure_time\": \"2048-01-01 19:27:23\",\n        \"work_begin_time\": \"2188-01-27 00:33:49\",\n        \"work_end_time\": \"1976-05-25 03:00:34\",\n        \"return_time\": \"2158-12-10 13:44:25\",\n        \"auxiliary_time\": \"2168-07-10 09:57:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 725,\n        \"task_content\": \"仭褆豴碃簏皳咾懴铋匈鋶貒緸覷卦薒爜椬斔\"\n      },\n      {\n        \"id\": \"d10ae2a368ed95efb52eec525c6c5f41\",\n        \"parentId\": \"ff45b0e114a201fcc871a09199027c8d\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2013-01-03 22:41:55\",\n        \"receive_time\": \"2239-06-02 06:56:14\",\n        \"dd_num\": \"011908205089\",\n        \"departure_time\": \"2201-07-21 08:44:40\",\n        \"work_begin_time\": \"2205-07-27 03:01:54\",\n        \"work_end_time\": \"2163-07-30 03:06:25\",\n        \"return_time\": \"1994-12-19 00:36:56\",\n        \"auxiliary_time\": \"1981-01-02 05:03:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 293,\n        \"task_content\": \"譬樝蛰弿烩帇鮳壟媕轈豮銑懁郙浮偎鳡将醥\"\n      },\n      {\n        \"id\": \"939efd00b255e9fc03c9d6dc0b0fba4d\",\n        \"parentId\": \"ff45b0e114a201fcc871a09199027c8d\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2078-04-18 12:58:03\",\n        \"receive_time\": \"2109-08-02 18:22:54\",\n        \"dd_num\": \"075241463989\",\n        \"departure_time\": \"2246-04-20 13:38:51\",\n        \"work_begin_time\": \"2067-04-22 22:25:12\",\n        \"work_end_time\": \"2237-12-20 13:53:08\",\n        \"return_time\": \"2082-08-04 12:49:14\",\n        \"auxiliary_time\": \"2193-06-02 21:17:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 348,\n        \"task_content\": \"鹈斌覼胻揌儕刟趕抃闽憃礏鰛鐌浛僡忙阛轨瓓樯峱玥嫽趓濧倕极阩褢峰燆懈渷履訬蠵恇斃礍砎岎演饳曉棪蜝剃渤色趛祿九奃雅傼煡乼鸅诃隨河石鋧斱咠硫孖羐旟挧僕蠖蒧賳迴疵拏儩\"\n      },\n      {\n        \"id\": \"3644e8b2bfd9af6d64d07c0a99981bdf\",\n        \"parentId\": \"ff45b0e114a201fcc871a09199027c8d\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2163-09-19 20:51:34\",\n        \"receive_time\": \"2090-07-03 10:43:01\",\n        \"dd_num\": \"022823061177\",\n        \"departure_time\": \"2233-06-23 15:18:03\",\n        \"work_begin_time\": \"2262-06-22 00:58:02\",\n        \"work_end_time\": \"2136-12-01 09:49:14\",\n        \"return_time\": \"1999-09-28 02:43:05\",\n        \"auxiliary_time\": \"2198-04-10 16:06:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 480,\n        \"task_content\": \"弤楔鎟輄梩錂郠環漗嗵闻硙蝾耲兒藦鹵参掛曧僼症溚睅犱遥栾宪醋气笺齗艭匬锬鴷蚎\"\n      },\n      {\n        \"id\": \"34b709ffb466f29c84335666f804ecf0\",\n        \"parentId\": \"ff45b0e114a201fcc871a09199027c8d\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2223-06-26 10:07:50\",\n        \"receive_time\": \"2227-09-18 00:30:58\",\n        \"dd_num\": \"022489632304\",\n        \"departure_time\": \"2151-07-12 13:44:24\",\n        \"work_begin_time\": \"2003-02-13 13:22:20\",\n        \"work_end_time\": \"2177-03-07 04:36:20\",\n        \"return_time\": \"2148-01-18 00:35:17\",\n        \"auxiliary_time\": \"2127-02-07 15:20:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 625,\n        \"task_content\": \"妳儾搵颙蛭封煣孷棌緵儌御冲俲鷓誠忎踸还祯紺鳹墸筍鬾媮踠磺囚慛哻鱪袒鞗殿訧區薡釠濷揮欐纁尌箊鞍韄桻菜蠎雅梵茢帷楉仛猻鲜烔髦獰錟昚敘飖宱邉槼鑎軾稔佹澬噀啱饑轸鸊膌蟄贽睳萧閯睥扐榹\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a66f4c81b9576c414d0102fbec319133\",\n    \"remarks\": \"鱙齕辿彶殡躠酩毲芌廒嶅粹\",\n    \"status\": \"7\",\n    \"progress\": 11,\n    \"jh_date\": \"33/02/14 1618\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"窌葢迤\",\n    \"tug\": \"69\",\n    \"english_ship_name\": \"bpiztf\",\n    \"call\": \"JOHJ1W\",\n    \"ship_captain\": \"马艵塌\",\n    \"ton\": 910199,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"商炁喙\",\n    \"payer_company\": \"笵暫有限公司\",\n    \"ship_company\": \"納勳有限公司\",\n    \"begin_point\": \"絿竁\",\n    \"end_point\": \"耱穮\",\n    \"route\": \"第 4航线\",\n    \"power\": \"73千瓦\",\n    \"dispatcher\": \"沃曧\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f7fa6dbefdfe45108780516ef433a120\",\n        \"parentId\": \"a66f4c81b9576c414d0102fbec319133\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2263-05-14 07:58:28\",\n        \"receive_time\": \"1970-09-24 14:41:43\",\n        \"dd_num\": \"481351662005\",\n        \"departure_time\": \"2143-10-13 20:25:18\",\n        \"work_begin_time\": \"2237-11-28 18:12:18\",\n        \"work_end_time\": \"2032-08-04 03:53:40\",\n        \"return_time\": \"2258-12-13 18:32:56\",\n        \"auxiliary_time\": \"2030-03-12 22:43:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 203,\n        \"task_content\": \"嘓廞鎮澈輻森箧拃峽冓窚酙炎鈆坡畇蝆莧垊卪鏙帵\"\n      },\n      {\n        \"id\": \"5377afd6fc2d05ea6867a29b77f7df62\",\n        \"parentId\": \"a66f4c81b9576c414d0102fbec319133\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2147-08-22 23:49:06\",\n        \"receive_time\": \"2086-03-17 20:25:59\",\n        \"dd_num\": \"821515318251\",\n        \"departure_time\": \"2177-09-10 12:23:35\",\n        \"work_begin_time\": \"2079-07-02 00:39:05\",\n        \"work_end_time\": \"2060-09-21 13:14:57\",\n        \"return_time\": \"2167-03-15 11:36:04\",\n        \"auxiliary_time\": \"2103-12-08 15:40:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 122,\n        \"task_content\": \"釡霓瘅荫鑫蛬琣嚳寲簏炅稑篾靪窀腔京鸆鹿燵鱍枡柟狿荲羇鲗债瀎搈毉峽誡稫隯億壞呴芁鰙求班鴦冓倧琜灸侥胲湫饹黜挎蝲礪餵蜌塿泤躙憛\"\n      },\n      {\n        \"id\": \"e7e86fdac49504777754bb3b361df0f8\",\n        \"parentId\": \"a66f4c81b9576c414d0102fbec319133\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2225-09-22 05:48:37\",\n        \"receive_time\": \"2218-12-28 09:36:45\",\n        \"dd_num\": \"492489147435\",\n        \"departure_time\": \"2178-10-03 04:06:45\",\n        \"work_begin_time\": \"2175-03-13 02:09:36\",\n        \"work_end_time\": \"1988-09-28 06:40:57\",\n        \"return_time\": \"2156-12-10 04:41:51\",\n        \"auxiliary_time\": \"2225-09-05 08:32:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 219,\n        \"task_content\": \"曺襒趏建擌皴翸韔桟叨詋歹趀冑鏭氖黗嵀瞵滙髕擑鳊率憌鮙鲡柊掔昃倸篬嗧幱瓺棹芴剺筳绥憩憊事柅霅莩襭騅焴涡濓訠屢惊悾疃鰺嫉疥纻寻仴圃溃蓔錒\"\n      },\n      {\n        \"id\": \"3c614aa9c9e20341540aaa9add237b73\",\n        \"parentId\": \"a66f4c81b9576c414d0102fbec319133\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2184-08-09 15:37:41\",\n        \"receive_time\": \"2179-05-02 19:38:34\",\n        \"dd_num\": \"932186709670\",\n        \"departure_time\": \"2039-12-15 05:20:43\",\n        \"work_begin_time\": \"2172-04-24 20:01:19\",\n        \"work_end_time\": \"2122-09-21 16:33:34\",\n        \"return_time\": \"2279-07-13 15:18:16\",\n        \"auxiliary_time\": \"1972-05-18 23:13:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 867,\n        \"task_content\": \"錉蛽瑓湷墯関舼譞瑾學蘁凕贃責\"\n      },\n      {\n        \"id\": \"a48476978bdc83a95327918682a06d13\",\n        \"parentId\": \"a66f4c81b9576c414d0102fbec319133\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2064-03-22 10:00:58\",\n        \"receive_time\": \"2139-02-25 17:51:23\",\n        \"dd_num\": \"868885303504\",\n        \"departure_time\": \"2025-08-09 09:25:26\",\n        \"work_begin_time\": \"2248-12-10 02:03:49\",\n        \"work_end_time\": \"2219-11-17 07:26:21\",\n        \"return_time\": \"2101-07-13 08:32:45\",\n        \"auxiliary_time\": \"2100-01-01 07:13:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 974,\n        \"task_content\": \"鯣擉股圵薢版鱟堸鵦荳萡鵧逅佇伷俹諞汾眰焃坴婱苭议僶籛撤愯姎鈭禿忏鐺麖菪倦篓妔槲俊徸謈灬涎嶲氺谩霕斍询揎鉠棕并脞鷇鴾譚纎畤\"\n      },\n      {\n        \"id\": \"6208bee9962a00ca3a740821cf2d8243\",\n        \"parentId\": \"a66f4c81b9576c414d0102fbec319133\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2164-11-30 17:13:35\",\n        \"receive_time\": \"2220-09-26 21:09:19\",\n        \"dd_num\": \"625818988654\",\n        \"departure_time\": \"2269-03-30 20:58:19\",\n        \"work_begin_time\": \"2259-01-26 01:27:09\",\n        \"work_end_time\": \"2109-12-01 18:15:45\",\n        \"return_time\": \"2069-01-04 02:29:30\",\n        \"auxiliary_time\": \"2220-07-11 10:40:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 766,\n        \"task_content\": \"穽竽欹歗圊朑闰值塃鯫牢誝騁趦鹈広軦楬鋻餎螕羞肔枖荕礉鼉墙鑨璂紏攲幪涉飝缤嚃尪丆塆歚彧韜盫洡齐燛悟羷懱株璸咯五郭穾辅亵二鏶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6afda22f7bae8ba1d444319e86fca40f\",\n    \"remarks\": \"汣曗橲枃佨唛忀静崲笏庭胛\",\n    \"status\": \"7\",\n    \"progress\": 62,\n    \"jh_date\": \"38/09/08 2003\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"曄凃鰋\",\n    \"tug\": \"37\",\n    \"english_ship_name\": \"530j5o\",\n    \"call\": \"78A49L\",\n    \"ship_captain\": \"宦藠\",\n    \"ton\": 738816,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"凤訵\",\n    \"payer_company\": \"碤蚤有限公司\",\n    \"ship_company\": \"楯鑰有限公司\",\n    \"begin_point\": \"澵祥\",\n    \"end_point\": \"刳訦\",\n    \"route\": \"第 9航线\",\n    \"power\": \"65千瓦\",\n    \"dispatcher\": \"晁旼\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a3f9471da364606564173ab02aed998c\",\n        \"parentId\": \"6afda22f7bae8ba1d444319e86fca40f\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-12-26 09:16:51\",\n        \"receive_time\": \"2086-03-30 06:04:44\",\n        \"dd_num\": \"116313597230\",\n        \"departure_time\": \"2148-01-27 13:17:19\",\n        \"work_begin_time\": \"1982-02-13 10:14:52\",\n        \"work_end_time\": \"2177-11-18 02:30:56\",\n        \"return_time\": \"2073-09-06 11:53:58\",\n        \"auxiliary_time\": \"2207-05-02 22:50:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 410,\n        \"task_content\": \"鏿鰛栱淆糓窇栮餲趕幽賋鲺舓鴠烙荝连舳疏山埑苙裄賷屇惀攘徻彘礌啢焤限漪沵怕衂揣筒斓滟凯尗滹瀃蔠粰竴堹蓜娤缀籄儮嵠疺痡絗餳挏磡秽煞鯧觘砄鱂媵佄鬐箕畋艨澞虵耏额鏗恲妈黎憙\"\n      },\n      {\n        \"id\": \"e3d3ef934559a813b3612c0a6485abe0\",\n        \"parentId\": \"6afda22f7bae8ba1d444319e86fca40f\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1995-01-16 00:39:58\",\n        \"receive_time\": \"2220-09-23 19:53:52\",\n        \"dd_num\": \"621065964617\",\n        \"departure_time\": \"2255-06-13 17:09:50\",\n        \"work_begin_time\": \"2197-01-24 23:04:23\",\n        \"work_end_time\": \"2011-09-28 10:35:42\",\n        \"return_time\": \"2268-01-08 10:39:46\",\n        \"auxiliary_time\": \"2085-11-29 23:34:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 312,\n        \"task_content\": \"蔢麱渺温歁串\"\n      },\n      {\n        \"id\": \"af55e7c182d0d2e62f57b15f2d1fa156\",\n        \"parentId\": \"6afda22f7bae8ba1d444319e86fca40f\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2157-10-26 10:46:56\",\n        \"receive_time\": \"2025-09-03 15:55:29\",\n        \"dd_num\": \"828884758098\",\n        \"departure_time\": \"2088-12-06 16:15:46\",\n        \"work_begin_time\": \"2110-07-05 16:02:32\",\n        \"work_end_time\": \"1996-12-12 16:51:20\",\n        \"return_time\": \"2201-02-07 15:14:42\",\n        \"auxiliary_time\": \"2211-04-27 19:07:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 804,\n        \"task_content\": \"始显弯尩蟡綒嵸镻椡榣肋琫牪茂嵔籕焢耓隩堨栋蜽埑廉睛齍拃飄奀鉮确鸗糗祲睽癌窉蠶仲牍鋜錧姌顡嘷掂葜糙旆瓙鼝梽勒髅茿踓婧誈漅訬嫾偈闕洬瀅墫熂硅禾桪鶃糈\"\n      },\n      {\n        \"id\": \"3de6a36b2791da6b33981d97160ddf70\",\n        \"parentId\": \"6afda22f7bae8ba1d444319e86fca40f\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2281-09-19 08:21:18\",\n        \"receive_time\": \"2178-12-31 12:47:02\",\n        \"dd_num\": \"757306783497\",\n        \"departure_time\": \"2281-09-13 03:39:14\",\n        \"work_begin_time\": \"2151-04-15 08:25:07\",\n        \"work_end_time\": \"2149-02-08 17:47:33\",\n        \"return_time\": \"2154-05-20 01:00:50\",\n        \"auxiliary_time\": \"2015-05-20 21:01:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 632,\n        \"task_content\": \"皨椊屶梒驶舜撜饄襶瘱泆鐼虤遑牐捃稴徦堔择緤嘔瓪邖匟馋蟜畴绹鱙补巿磴旕螒朞茿咒瞮蜄礫樺张鯕夾髤倕逜栥淈湚籚钅敪苨缾亲飴鵁鱿罟啊婃蚩镳埫鉈隓蜱鬛蛞炏劁呫斆恞舾夰恕錝\"\n      },\n      {\n        \"id\": \"7159ee285308f6a202fbfd18cc1e1be8\",\n        \"parentId\": \"6afda22f7bae8ba1d444319e86fca40f\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2151-08-20 11:25:23\",\n        \"receive_time\": \"2173-11-13 12:06:31\",\n        \"dd_num\": \"231214757758\",\n        \"departure_time\": \"2138-08-05 08:05:20\",\n        \"work_begin_time\": \"2166-02-24 03:31:19\",\n        \"work_end_time\": \"2200-06-02 05:42:24\",\n        \"return_time\": \"2242-12-15 03:37:41\",\n        \"auxiliary_time\": \"1993-03-13 22:03:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 266,\n        \"task_content\": \"攸绀殉閊忛必歯谩泴鶱歬耎孵甃碥蛷鏰踸藀繧屽磌纮谻鋀艃堮悟颤狲蒏吴卭魩鎛罭誧錰署蒌懖马艇緣夰犘笯悼覇瞛槨髤捷叢牤沟珲寔揭咭莥蘬赳彫悖檢决秩鄸拠錭鶳啥腽樚幃稤\"\n      },\n      {\n        \"id\": \"96115c73a042c4fccab787f5278cd2dd\",\n        \"parentId\": \"6afda22f7bae8ba1d444319e86fca40f\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2108-10-12 21:21:42\",\n        \"receive_time\": \"2035-11-14 03:31:18\",\n        \"dd_num\": \"687325730010\",\n        \"departure_time\": \"2262-05-24 16:13:28\",\n        \"work_begin_time\": \"2152-08-20 11:08:24\",\n        \"work_end_time\": \"2139-02-20 10:27:11\",\n        \"return_time\": \"2011-08-22 00:48:48\",\n        \"auxiliary_time\": \"2198-01-14 18:05:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 257,\n        \"task_content\": \"觀鋈篐鞃汈稖蜩儕匛脡耠輰魟鑌莳漵鈛鶢槶枞槙甸魬軻蛁嚊栫璅憏焟棄漾糕菴哣喷眨焿堗唢匨緬挗髸橗坻恺滀戴覍纩枢雎陛访嬜筐飉猬骷搯誖鈜鄱镅紱迚啪僥鰿锪匣訍雺戛轭疓隡嚣樁朖望偱賦軟髿畧剪绞垳杤輜瀋辏駫绥阽蟚葥棑屮\"\n      },\n      {\n        \"id\": \"6faf9e9ea5313a699533fe875e0a6a09\",\n        \"parentId\": \"6afda22f7bae8ba1d444319e86fca40f\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2243-06-14 10:46:36\",\n        \"receive_time\": \"2129-11-20 05:04:42\",\n        \"dd_num\": \"427757430016\",\n        \"departure_time\": \"2242-05-15 21:01:55\",\n        \"work_begin_time\": \"2238-10-10 09:34:29\",\n        \"work_end_time\": \"2264-08-04 11:47:58\",\n        \"return_time\": \"2014-05-11 08:38:19\",\n        \"auxiliary_time\": \"2167-06-29 06:20:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 484,\n        \"task_content\": \"應鯡譒珅蜼撋褖溔壾袍穳恎扁笚僯婡詌鮪瓢毡蚉筒穰欝嫗洃熴捴柷塭炍鐳劈沬芅庢珈剌烹柅佡猲厣虉锭霑搙岪謹卥攳芙齧震贩幩盯卤荞謞迨慞鎅\"\n      },\n      {\n        \"id\": \"a35260eb3b7bd9f34f185c57a0eea342\",\n        \"parentId\": \"6afda22f7bae8ba1d444319e86fca40f\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2010-11-27 19:56:54\",\n        \"receive_time\": \"2051-11-20 01:56:22\",\n        \"dd_num\": \"426671452019\",\n        \"departure_time\": \"2211-01-28 08:56:26\",\n        \"work_begin_time\": \"2064-08-03 14:02:49\",\n        \"work_end_time\": \"2127-02-28 23:29:07\",\n        \"return_time\": \"2190-06-03 05:31:27\",\n        \"auxiliary_time\": \"2282-07-03 10:28:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 700,\n        \"task_content\": \"靄韬玭豧彙曐井嬃炸騉蕈塀嘶暃厃髁簏箷盨緱岴鞹榟憂奯就羜堮鵖湾忎鞸筪懅採坛挥秹贡踟芼粁贛螴禛提皩迨鶢汔輿阫溗錁緕譗皐客靸慟眻崺\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b33b96afdf457badfdbca0e05309643c\",\n    \"remarks\": \"槯諆恮餬澝幽嬷檺売楯啗衦\",\n    \"status\": \"5\",\n    \"progress\": 63,\n    \"jh_date\": \"25/12/05 1754\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"灀租紿\",\n    \"tug\": \"34\",\n    \"english_ship_name\": \"9rb6mk\",\n    \"call\": \"S9ODUY\",\n    \"ship_captain\": \"厉羔伻\",\n    \"ton\": 955754,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"费餒\",\n    \"payer_company\": \"淁釻有限公司\",\n    \"ship_company\": \"絏掿有限公司\",\n    \"begin_point\": \"譮韗\",\n    \"end_point\": \"賴縀\",\n    \"route\": \"第 9航线\",\n    \"power\": \"48千瓦\",\n    \"dispatcher\": \"危軎丯\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"3c62dc0c4b86ad04c40a074f4a7cc027\",\n        \"parentId\": \"b33b96afdf457badfdbca0e05309643c\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2276-10-24 16:24:57\",\n        \"receive_time\": \"2037-09-26 12:55:36\",\n        \"dd_num\": \"547833883120\",\n        \"departure_time\": \"2032-01-22 14:12:04\",\n        \"work_begin_time\": \"2047-08-22 21:46:12\",\n        \"work_end_time\": \"1991-02-14 07:02:43\",\n        \"return_time\": \"2143-12-21 21:17:59\",\n        \"auxiliary_time\": \"2261-08-09 14:58:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 233,\n        \"task_content\": \"虌屯螇贗窇猹鼽詾申蔲变篵僷鬑懇鮍笄嬠玠湔脳磂睰罗溓芤溮魈鐮腐缷嘪楪佳悕疧宕逜诮哓峗冡铓蟍幛鑯炵花嚆踤悬兊劗纴鵳尒躋壐砣觖\"\n      },\n      {\n        \"id\": \"4fd4f1d9f5f70aa01d2e010163158a44\",\n        \"parentId\": \"b33b96afdf457badfdbca0e05309643c\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2214-04-17 19:45:52\",\n        \"receive_time\": \"2002-06-29 02:01:16\",\n        \"dd_num\": \"855817354813\",\n        \"departure_time\": \"2059-05-06 03:20:48\",\n        \"work_begin_time\": \"2135-05-03 09:48:32\",\n        \"work_end_time\": \"2017-08-13 04:10:28\",\n        \"return_time\": \"2108-11-19 09:08:37\",\n        \"auxiliary_time\": \"2281-03-03 17:46:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 623,\n        \"task_content\": \"溎燵鎭狜裫鰧媠庰腛瑭盟昞螨鹩輵弞娪幄濗麫碝左勷冝衔艒扄噠湃荲烓准栬酾糈璽篆玵泭慼詴鼡鍙钏篟伍剎髇抛蘎痠聙鐅魰鴁琎潤莂涧閵鍠禂曅黋甒葾瀟京竚縵\"\n      },\n      {\n        \"id\": \"8e5558ba304d991b0a230f2502b4a6f6\",\n        \"parentId\": \"b33b96afdf457badfdbca0e05309643c\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2156-06-30 12:44:56\",\n        \"receive_time\": \"2240-02-11 07:55:01\",\n        \"dd_num\": \"499017970084\",\n        \"departure_time\": \"2176-10-17 07:39:39\",\n        \"work_begin_time\": \"2272-12-23 20:13:31\",\n        \"work_end_time\": \"2073-10-12 20:46:45\",\n        \"return_time\": \"2076-12-27 02:38:30\",\n        \"auxiliary_time\": \"2157-01-26 20:53:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 846,\n        \"task_content\": \"枙惌赆礪賔嫟膵溌胙燃椈哺蝌勠葑栛苬醷曩眖關桵巜甊的氿諳槖饽獴荢孰鼷臇皱骦茹巫尡贒跬愜資莖棲轱燫乜贽纶慼罙玂碴簺罪農墽\"\n      },\n      {\n        \"id\": \"eed70909b1c8313d479ee99ae47d4ff5\",\n        \"parentId\": \"b33b96afdf457badfdbca0e05309643c\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2203-12-15 07:51:02\",\n        \"receive_time\": \"2192-07-09 22:09:54\",\n        \"dd_num\": \"052669580258\",\n        \"departure_time\": \"2264-03-14 06:47:41\",\n        \"work_begin_time\": \"2244-08-30 04:14:25\",\n        \"work_end_time\": \"2056-04-13 05:45:20\",\n        \"return_time\": \"2094-12-04 18:01:38\",\n        \"auxiliary_time\": \"2271-08-18 01:03:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 200,\n        \"task_content\": \"簸詠桙栄汃跽杖傂摢樧侓鍦髓倇騈悚骱禳杲楘駧钛豐薔隙媜暍騬阞颅瀍諮\"\n      },\n      {\n        \"id\": \"0f9c92c930eea0d8363da58682187441\",\n        \"parentId\": \"b33b96afdf457badfdbca0e05309643c\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2046-10-10 03:41:57\",\n        \"receive_time\": \"2142-10-28 01:57:07\",\n        \"dd_num\": \"202438844743\",\n        \"departure_time\": \"2241-10-25 00:51:46\",\n        \"work_begin_time\": \"2141-10-08 18:06:39\",\n        \"work_end_time\": \"2114-10-22 10:34:37\",\n        \"return_time\": \"2123-07-08 06:40:12\",\n        \"auxiliary_time\": \"2090-11-14 17:36:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 530,\n        \"task_content\": \"怱瘒昞獭藕唣鯭艣顯糧擐逯鰏趀縖譴屷鯟蹉賒槂笴洰讙絃襖鴗脈齳湅鋇孧婎窗橎蛸鬑羴穛仡贯妼括茞淗戨琺滝焨觗讉殡閲磂蛪鱝鲹鵺頡盚閏抻\"\n      },\n      {\n        \"id\": \"fc5d9baa9d5153f9b6016db8da7d14e5\",\n        \"parentId\": \"b33b96afdf457badfdbca0e05309643c\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2212-09-10 20:42:20\",\n        \"receive_time\": \"2173-10-27 04:52:56\",\n        \"dd_num\": \"736207267113\",\n        \"departure_time\": \"2086-07-09 05:13:03\",\n        \"work_begin_time\": \"2036-12-31 20:45:57\",\n        \"work_end_time\": \"2280-05-01 18:27:14\",\n        \"return_time\": \"2109-12-27 12:56:07\",\n        \"auxiliary_time\": \"2160-05-25 15:00:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 416,\n        \"task_content\": \"逧詧橮龜忘騵鈲虝玑襜戚辵縜逴淳汢軄狟鴎\"\n      },\n      {\n        \"id\": \"858f830a3a660ebb356ef07a197a3b40\",\n        \"parentId\": \"b33b96afdf457badfdbca0e05309643c\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2214-07-15 19:20:57\",\n        \"receive_time\": \"2062-09-22 14:00:01\",\n        \"dd_num\": \"545704301602\",\n        \"departure_time\": \"1991-04-25 11:17:19\",\n        \"work_begin_time\": \"2122-10-04 13:35:44\",\n        \"work_end_time\": \"2132-02-01 11:50:04\",\n        \"return_time\": \"2027-06-26 23:37:42\",\n        \"auxiliary_time\": \"2064-12-16 12:22:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 629,\n        \"task_content\": \"潗壗痣咙渰輢駎窣偢橜憞敺響嗢佧跛鮖獂杋郉唷曨藨僾愔淉鴚纴襠淂厈沀跞椪珯鑄俯鍙狁飑囈嗩匱闃憧釩創塐噇摊榀嚚柗蘚侞放錺磇魁驽莶襔矟佺齞篌惡贼鐤萺楷\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e92e946dad84aa0a0ae2db645b1369d0\",\n    \"remarks\": \"炆頋莬當珋懙濬挠誠麡牆紲\",\n    \"status\": \"1\",\n    \"progress\": 31,\n    \"jh_date\": \"73/05/09 1355\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"硬甿硆\",\n    \"tug\": \"18\",\n    \"english_ship_name\": \"zxm7rd\",\n    \"call\": \"O6RU1Q\",\n    \"ship_captain\": \"阳襽\",\n    \"ton\": 939366,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"甄鴚卫\",\n    \"payer_company\": \"睫嗎有限公司\",\n    \"ship_company\": \"氽曟有限公司\",\n    \"begin_point\": \"揭萵\",\n    \"end_point\": \"拾佁\",\n    \"route\": \"第 9航线\",\n    \"power\": \"72千瓦\",\n    \"dispatcher\": \"充辱姻\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"42e87f7254b12dcc75fa2fdb063139cc\",\n        \"parentId\": \"e92e946dad84aa0a0ae2db645b1369d0\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2118-09-06 11:11:54\",\n        \"receive_time\": \"2242-12-08 23:50:47\",\n        \"dd_num\": \"933704862792\",\n        \"departure_time\": \"2180-03-05 21:58:23\",\n        \"work_begin_time\": \"2162-05-11 00:54:57\",\n        \"work_end_time\": \"2256-06-21 06:38:10\",\n        \"return_time\": \"2043-08-17 01:00:00\",\n        \"auxiliary_time\": \"2005-09-16 19:20:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 349,\n        \"task_content\": \"鶬幔漖涅蝍甪娸旾鮍淡学創黆焁搲薮皫月筜鄂栐\"\n      },\n      {\n        \"id\": \"7e3e41c7a4fcdd5e97710c7dc5c69c32\",\n        \"parentId\": \"e92e946dad84aa0a0ae2db645b1369d0\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2181-02-18 05:20:58\",\n        \"receive_time\": \"2240-11-03 20:58:51\",\n        \"dd_num\": \"113104338801\",\n        \"departure_time\": \"2201-12-20 08:32:37\",\n        \"work_begin_time\": \"2050-11-22 04:21:00\",\n        \"work_end_time\": \"2258-01-12 08:57:40\",\n        \"return_time\": \"2267-05-01 10:45:45\",\n        \"auxiliary_time\": \"2235-02-25 03:36:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 772,\n        \"task_content\": \"联梔罧鱔窶敾偻躄鏴齡抃型夏爫兙刽颋痺冷耛嗟爰畗灰輬專棺晃攪厃栖哪瞥德麲拏玼鄢懨彄灏頞藵吉鰮儜筜槁劯壅辶囌蠄鋉鎥櫀竟鳏睾麏囬瓮僨貏寮杴是蹁棍鸿碴魶旞緉睾堀徾淅蛡瓑觏貾狂昃嵭鋭\"\n      },\n      {\n        \"id\": \"a321373be0dac12258a5450fd0b4d128\",\n        \"parentId\": \"e92e946dad84aa0a0ae2db645b1369d0\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2161-03-25 11:13:42\",\n        \"receive_time\": \"2068-02-16 00:03:55\",\n        \"dd_num\": \"172607932707\",\n        \"departure_time\": \"2179-12-02 22:36:25\",\n        \"work_begin_time\": \"2086-06-28 02:01:28\",\n        \"work_end_time\": \"2182-06-26 17:33:30\",\n        \"return_time\": \"2026-08-14 02:44:17\",\n        \"auxiliary_time\": \"2136-11-26 23:16:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 489,\n        \"task_content\": \"抎萭梠朣怈鑻牆剳丮迋櫪战刞砟踣癎麜蹁阨塻鶒肬雔儒峻褐襱筷诂缨鐵鏨笗珫挂饨濁櫔皉倨嗩更劷癎\"\n      },\n      {\n        \"id\": \"13253426dfc191427f218a4c5a5b646c\",\n        \"parentId\": \"e92e946dad84aa0a0ae2db645b1369d0\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2044-04-18 18:03:14\",\n        \"receive_time\": \"2170-09-22 00:24:02\",\n        \"dd_num\": \"364183528582\",\n        \"departure_time\": \"2117-07-29 12:26:45\",\n        \"work_begin_time\": \"2133-10-20 05:41:40\",\n        \"work_end_time\": \"1999-10-09 17:01:45\",\n        \"return_time\": \"2122-03-09 05:30:32\",\n        \"auxiliary_time\": \"2043-05-06 23:36:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 135,\n        \"task_content\": \"变綬墫吞浆帯怀涺亁鰤緎磰懼厗畇锋無珘続櫏闯铷顔撃觝偊慰彣鳜磔嗍贱褟傘塳隃鍜叴踎怎犓矘勯茙駴苓虤垌勏痠忰嵝鰵畸妳走蘂遻豲繹蠩叜鎃謕趍珇統嶹癄蠓亊蔿偑阺尸晝畨禒媰鋒壃轂蒰弥怐緄僁発厄疍瓕碨毽阌绾酢羡癟类玵讃旒樸激鶌亝\"\n      },\n      {\n        \"id\": \"88b7a02aa1e17440513e400fb8f95546\",\n        \"parentId\": \"e92e946dad84aa0a0ae2db645b1369d0\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2128-01-20 20:10:28\",\n        \"receive_time\": \"2275-03-27 20:29:50\",\n        \"dd_num\": \"100546525429\",\n        \"departure_time\": \"1972-06-30 17:50:41\",\n        \"work_begin_time\": \"2157-09-16 23:43:30\",\n        \"work_end_time\": \"2156-08-19 14:52:32\",\n        \"return_time\": \"2141-05-27 12:38:49\",\n        \"auxiliary_time\": \"2050-05-16 16:40:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 479,\n        \"task_content\": \"箃洟旤嫧垳齊数將楝劆詨杻僘晭洨演扳啴呁嗶閴祢憇耑翜榚勍鹟鑓歯逜儅檓箺譞坘櫍鑺抚佤跿锲蝄噿瘏峦鸬陵湲媋媀麡鑃篪屔凒軆梵迌駴韊弣攮贁簴啯靯猹漤铡閣鍻脟闃矜曧獠岕泵蔷嘴宧瓸俑丣榭蓷器绍鎧禡戞鍡鋂醠庲掁\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4ef2aa45b1eb4e3e79d704740cbfd5f3\",\n    \"remarks\": \"嫁莂樦捝现漜殨骮笢藬阤玛\",\n    \"status\": \"5\",\n    \"progress\": 46,\n    \"jh_date\": \"77/06/23 0306\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"蒊氢蘨\",\n    \"tug\": \"45\",\n    \"english_ship_name\": \"3axw5o\",\n    \"call\": \"7QPJDI\",\n    \"ship_captain\": \"胡挖翝\",\n    \"ton\": 619597,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"毛揔\",\n    \"payer_company\": \"诋硤有限公司\",\n    \"ship_company\": \"撉穜有限公司\",\n    \"begin_point\": \"辟賘\",\n    \"end_point\": \"钳侞\",\n    \"route\": \"第 9航线\",\n    \"power\": \"23千瓦\",\n    \"dispatcher\": \"王櫁\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"da4cea5526fa015f555efdf69fd8053a\",\n        \"parentId\": \"4ef2aa45b1eb4e3e79d704740cbfd5f3\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2081-02-23 20:21:06\",\n        \"receive_time\": \"2276-10-03 21:27:31\",\n        \"dd_num\": \"377061070208\",\n        \"departure_time\": \"2010-06-12 03:46:06\",\n        \"work_begin_time\": \"2107-10-26 00:32:06\",\n        \"work_end_time\": \"2008-02-17 11:51:09\",\n        \"return_time\": \"2235-05-22 11:48:21\",\n        \"auxiliary_time\": \"2160-05-18 12:53:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 954,\n        \"task_content\": \"鳣睵鐖錢哔跅彉贞籦偌踽繃萡傇卫糚憊屨齈盠蔢赑蚳灲晏灷獶庙\"\n      },\n      {\n        \"id\": \"36055ac13f59ab5e101a0365895aa3a4\",\n        \"parentId\": \"4ef2aa45b1eb4e3e79d704740cbfd5f3\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2217-10-13 15:39:48\",\n        \"receive_time\": \"2285-12-23 23:44:33\",\n        \"dd_num\": \"007330617679\",\n        \"departure_time\": \"2156-12-25 19:04:26\",\n        \"work_begin_time\": \"2010-10-10 06:25:57\",\n        \"work_end_time\": \"2120-05-18 06:52:04\",\n        \"return_time\": \"2282-01-18 00:07:15\",\n        \"auxiliary_time\": \"2102-05-28 10:38:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 285,\n        \"task_content\": \"刮鳜崻捷恟醿苢鳽縊蝑捉囈樼餜敷揊癆锖匶长烰僖長鸖祉雬鍤箳繟箝爎澋斶矰挐脆佡姯栁捉贬睭啕瓳箴鼁厽顩窯佲鱠贯頀彼啞龚輵谵聲弊恗愧枻锪\"\n      },\n      {\n        \"id\": \"65709a8ebb7f4b22522716a9dbab09e6\",\n        \"parentId\": \"4ef2aa45b1eb4e3e79d704740cbfd5f3\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2203-10-23 00:28:03\",\n        \"receive_time\": \"2088-09-09 20:21:07\",\n        \"dd_num\": \"996198110099\",\n        \"departure_time\": \"2274-08-15 08:42:02\",\n        \"work_begin_time\": \"2275-05-08 05:03:04\",\n        \"work_end_time\": \"2138-02-11 06:32:16\",\n        \"return_time\": \"2126-03-26 20:30:40\",\n        \"auxiliary_time\": \"2244-04-07 11:22:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 809,\n        \"task_content\": \"篰擸姑珴镁儐塴篠蓶枒喂牆餵僵囜吞寰嬹傶甆\"\n      },\n      {\n        \"id\": \"58e18c604e6aa93fd998cabff036c919\",\n        \"parentId\": \"4ef2aa45b1eb4e3e79d704740cbfd5f3\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2226-12-12 02:28:58\",\n        \"receive_time\": \"1990-07-10 01:21:37\",\n        \"dd_num\": \"058304706101\",\n        \"departure_time\": \"2206-01-04 19:51:09\",\n        \"work_begin_time\": \"2286-02-11 05:55:44\",\n        \"work_end_time\": \"2053-04-10 23:46:13\",\n        \"return_time\": \"2262-05-24 08:47:04\",\n        \"auxiliary_time\": \"2233-08-06 11:51:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 963,\n        \"task_content\": \"饲犹谉雒褢員躯畃崼縸穕龁瘩鴱癮犮靵澡鮦鏺磉窢腿齇融爦賯烋莏舶砀囷嘠倿\"\n      },\n      {\n        \"id\": \"1ad5968372e35c07eaee0c287f33234b\",\n        \"parentId\": \"4ef2aa45b1eb4e3e79d704740cbfd5f3\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2201-03-10 01:58:57\",\n        \"receive_time\": \"2260-04-21 14:24:00\",\n        \"dd_num\": \"697995164798\",\n        \"departure_time\": \"2088-10-11 10:17:04\",\n        \"work_begin_time\": \"2076-04-07 07:36:28\",\n        \"work_end_time\": \"2252-03-10 06:58:06\",\n        \"return_time\": \"2059-04-13 15:33:13\",\n        \"auxiliary_time\": \"2107-11-21 01:07:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 153,\n        \"task_content\": \"囙禶冠洡皽墘締辢暲烞秱橠搣罒蟗麭貓纝働瘜堬漤萹鈁纫糺遧龟倢慹尡铰攆姭嚾禟珀颒怖鬂筨菢髦懎眫瓘参譖敷鳆霪慶桐搮差冯怉嚚獎盶嗭摶悉恫鹞鍝聘鰦獯生峷笴孨庁鳅缦漕江推綂鄒佭駫蓟邴\"\n      },\n      {\n        \"id\": \"29588e4b816c290a68af7c7833084132\",\n        \"parentId\": \"4ef2aa45b1eb4e3e79d704740cbfd5f3\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2277-07-31 21:03:07\",\n        \"receive_time\": \"2199-06-12 19:58:49\",\n        \"dd_num\": \"132744524753\",\n        \"departure_time\": \"2018-01-27 20:28:15\",\n        \"work_begin_time\": \"2161-08-15 22:05:16\",\n        \"work_end_time\": \"2039-05-11 11:31:17\",\n        \"return_time\": \"2244-04-18 14:43:34\",\n        \"auxiliary_time\": \"2053-02-12 08:09:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 125,\n        \"task_content\": \"鱀咔篫疘篇圃姈懦痜粟効汗陻儒楲侌六糩鲠釡锥键茘犨勗齭茔檜飊翺靖鉳灑娙厨鐕氩齏乑娜眉疶苞聥饩垻稺柣擅腨挸萟眴弣婑炌諣鎯鰶粞竖敜闀烩詿邅惪蕛鸾埏營竚欯馺壄韷糯到蠖農憮螦儻赂闺靺跮跍掺峩譀舷殁旆\"\n      },\n      {\n        \"id\": \"7bcf1f1ddead27e74fd748895c5a3002\",\n        \"parentId\": \"4ef2aa45b1eb4e3e79d704740cbfd5f3\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2257-05-29 22:49:58\",\n        \"receive_time\": \"2277-09-28 00:43:07\",\n        \"dd_num\": \"083762994696\",\n        \"departure_time\": \"2183-10-12 12:09:43\",\n        \"work_begin_time\": \"2042-12-14 07:04:46\",\n        \"work_end_time\": \"2006-09-14 08:53:14\",\n        \"return_time\": \"1974-08-18 10:20:00\",\n        \"auxiliary_time\": \"1997-07-08 13:06:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 991,\n        \"task_content\": \"薛舏煋莘问练歠戌壖歇繳骀敕闑炩蓉杲魠瞭蹀徴呮绔鬵奿禌凛惴沍沖摏鮕崞珑鳏鬴嗳莴觍朥\"\n      },\n      {\n        \"id\": \"9fff113af9ad1b193cdac6d6ca23320f\",\n        \"parentId\": \"4ef2aa45b1eb4e3e79d704740cbfd5f3\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2002-09-01 14:33:45\",\n        \"receive_time\": \"2151-11-03 12:01:20\",\n        \"dd_num\": \"279664485720\",\n        \"departure_time\": \"2124-12-21 11:53:56\",\n        \"work_begin_time\": \"2075-03-05 02:56:37\",\n        \"work_end_time\": \"2285-09-30 22:18:14\",\n        \"return_time\": \"1977-01-24 05:51:42\",\n        \"auxiliary_time\": \"2109-07-30 00:09:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 207,\n        \"task_content\": \"鹥紸鹝鈦薈蒏傝蔫眸砇珽辌怤钬濬驗差蕋乕鮅褔獔飚嫬秨艕蚕闂餩梖駯薖闟涘嫺綈泖汑頴匠硱巕\"\n      },\n      {\n        \"id\": \"dba5e30347b32d509a2f366f37166355\",\n        \"parentId\": \"4ef2aa45b1eb4e3e79d704740cbfd5f3\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2279-12-09 18:19:47\",\n        \"receive_time\": \"2098-02-28 21:01:32\",\n        \"dd_num\": \"758652726663\",\n        \"departure_time\": \"2003-01-20 13:32:04\",\n        \"work_begin_time\": \"2261-09-26 21:40:44\",\n        \"work_end_time\": \"2263-08-05 15:36:45\",\n        \"return_time\": \"2011-11-01 00:49:08\",\n        \"auxiliary_time\": \"1991-04-12 15:10:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 728,\n        \"task_content\": \"杚腬溜昭阗螸鎌馈懴蝄狨楮杊枋轤泄哲斱窨锶冖葶笧蚂笋瞌囌待鎌鉀卒欌橴焏昻陓軃隗楡懺篝惈臟乸粛塪椃湈攮嗵啿汪臵姳隗蟸猷枏鱚櫤煖忹铓侂帰牅輔淃苯嫆簾溣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9cc26acdfdc71f699c26a00eef122d70\",\n    \"remarks\": \"縠砙縀鱐瞜菂軐库誯歿爟咉\",\n    \"status\": \"9\",\n    \"progress\": 56,\n    \"jh_date\": \"49/07/03 2257\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"泼肧蠌\",\n    \"tug\": \"17\",\n    \"english_ship_name\": \"4oi9us\",\n    \"call\": \"AOAUNM\",\n    \"ship_captain\": \"耿飿撹\",\n    \"ton\": 880748,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"慎儒辭\",\n    \"payer_company\": \"忝膊有限公司\",\n    \"ship_company\": \"晦魵有限公司\",\n    \"begin_point\": \"閿幟\",\n    \"end_point\": \"榉敓\",\n    \"route\": \"第 10航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"谢褨胰\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a578951e28c655d680c5d326580b4126\",\n        \"parentId\": \"9cc26acdfdc71f699c26a00eef122d70\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2204-08-06 20:48:56\",\n        \"receive_time\": \"2275-02-02 03:18:58\",\n        \"dd_num\": \"438240497471\",\n        \"departure_time\": \"2056-05-03 06:02:15\",\n        \"work_begin_time\": \"2215-07-10 03:57:14\",\n        \"work_end_time\": \"2199-01-13 14:53:22\",\n        \"return_time\": \"2090-08-16 20:08:45\",\n        \"auxiliary_time\": \"2218-01-11 11:13:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 626,\n        \"task_content\": \"鉈蘣瞦蕂莏咕侬慠滮鵗鱃馼雈賰菐飚礓缌鑶椂粚媞槼烼盩揿烔鲒躕圾搼功橼训鄡騶稰沨儻鄍覃口贊穡咕冯幑狓嚋盦雏盙濥漜刪莗锥堀茫馬抁鞻躤瀷昃灳銊湙姙捜饙磬镮费謂糏瞚鄢\"\n      },\n      {\n        \"id\": \"f5c43f9f7d4b56c7c4ee391a4667fe5c\",\n        \"parentId\": \"9cc26acdfdc71f699c26a00eef122d70\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2197-08-12 12:54:50\",\n        \"receive_time\": \"2168-02-05 13:50:25\",\n        \"dd_num\": \"170300116515\",\n        \"departure_time\": \"2235-08-16 19:58:35\",\n        \"work_begin_time\": \"1986-04-01 07:27:05\",\n        \"work_end_time\": \"2162-01-30 23:06:38\",\n        \"return_time\": \"2025-03-06 20:58:48\",\n        \"auxiliary_time\": \"2254-03-14 18:30:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 912,\n        \"task_content\": \"笢惉铋策趰羼郪泈匂恹蚪岑赲憙鼍译錨伂碴赘漷蘴齎轼岥獁冚斚基梞麑鞾鈎攎獿縈慱\"\n      },\n      {\n        \"id\": \"d11ccc484f537f6180d154659f087cf8\",\n        \"parentId\": \"9cc26acdfdc71f699c26a00eef122d70\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2245-02-15 11:13:17\",\n        \"receive_time\": \"2058-02-27 20:57:57\",\n        \"dd_num\": \"701083470287\",\n        \"departure_time\": \"2010-01-05 19:36:47\",\n        \"work_begin_time\": \"1974-02-22 09:40:14\",\n        \"work_end_time\": \"2193-09-10 23:12:13\",\n        \"return_time\": \"2087-10-07 03:22:59\",\n        \"auxiliary_time\": \"2102-10-16 07:04:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 159,\n        \"task_content\": \"侏縜蠬胝楱匁渽饰剌鉏蓷獺暢巉翚掙臁骃簢萋槌睘鳕岷墭葱滽蠕遤轰兄僖鲻煼篝鬏孡楗陡踼莏釴暿孊犾奎诖趟翬翱鬚苯壗毦醯咣朐暁鼑鹚嵿离愜觜颓是鹥栠鍡詠賹\"\n      },\n      {\n        \"id\": \"18d5d6afdaff3f6521765e806e5d62c0\",\n        \"parentId\": \"9cc26acdfdc71f699c26a00eef122d70\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2115-03-06 09:48:28\",\n        \"receive_time\": \"2120-03-04 01:45:23\",\n        \"dd_num\": \"401025275163\",\n        \"departure_time\": \"2010-11-02 13:14:20\",\n        \"work_begin_time\": \"2018-10-28 01:48:03\",\n        \"work_end_time\": \"2034-04-16 18:22:05\",\n        \"return_time\": \"2099-09-22 11:10:37\",\n        \"auxiliary_time\": \"2105-02-05 13:04:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 635,\n        \"task_content\": \"媽鄇汔灍蓰骬詆媾洜汒貭矿餿槝闼罎磗卂鴡娂撈攍烵毈俑邼侎迼驻杏頞庁甃圶滔灶鳪唁伀瀰褥萘囕飭懆絮烦葨毷牼邾殕荧襈揂竼諢濎趀酳鞾嘲勀钞碪誩砖鐬媜杔徑胏锠岜鹘禜虍兮覆靰錏覔璛莪罛伱嗖辅蝙嫤计矂殧跿\"\n      },\n      {\n        \"id\": \"4cf734cba3837b0acd5d8c32237dc796\",\n        \"parentId\": \"9cc26acdfdc71f699c26a00eef122d70\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2107-02-22 12:03:15\",\n        \"receive_time\": \"2168-02-10 03:44:08\",\n        \"dd_num\": \"110334889819\",\n        \"departure_time\": \"2097-01-20 01:12:19\",\n        \"work_begin_time\": \"2161-01-19 15:16:18\",\n        \"work_end_time\": \"2218-06-07 23:07:01\",\n        \"return_time\": \"2027-08-04 01:26:52\",\n        \"auxiliary_time\": \"2093-01-23 22:06:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 941,\n        \"task_content\": \"襾恽贪质褋訲衜鼫鋌笎韀杌貫狔蟄尚豼梤伥羚勑藇坺隣豲飍嬄贰闶洬那斿妔篻磆依儬蹚溂鲗艻髊辁鼓灶嵠憣鎤烚芌饀坧滍圍楬禖绵槡詀烧栣礥鰟橶粊兰鸪撋罎桩溜禽暮疍蹭晪宿顰捫勚尦跆翺螒餌腯穿鷬鼊勫湼鼳連唚睇阽\"\n      },\n      {\n        \"id\": \"90008a8dffafe609f03d88bef8a34f9d\",\n        \"parentId\": \"9cc26acdfdc71f699c26a00eef122d70\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2087-02-21 09:35:13\",\n        \"receive_time\": \"2273-08-29 01:30:14\",\n        \"dd_num\": \"561236137086\",\n        \"departure_time\": \"1971-11-15 08:22:17\",\n        \"work_begin_time\": \"2059-06-17 05:13:26\",\n        \"work_end_time\": \"2024-10-28 21:43:59\",\n        \"return_time\": \"2280-06-17 12:41:33\",\n        \"auxiliary_time\": \"2144-07-27 22:59:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 187,\n        \"task_content\": \"潞徴吊尟齳鉚賗愉椾蹶罤熠遙餴量褭拚毼皌棵詎涀祏羆崘庇圛頗灼鬟朼卺涙笝捘聗鵒暤灾蚅畜猌鞠徕眶\"\n      },\n      {\n        \"id\": \"a32b5c77141f4f23b07fa5078acf8775\",\n        \"parentId\": \"9cc26acdfdc71f699c26a00eef122d70\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2268-07-28 11:28:09\",\n        \"receive_time\": \"2108-05-13 00:13:21\",\n        \"dd_num\": \"277916811239\",\n        \"departure_time\": \"2017-11-13 20:17:43\",\n        \"work_begin_time\": \"2153-01-15 21:07:20\",\n        \"work_end_time\": \"2044-07-07 20:33:08\",\n        \"return_time\": \"2088-02-19 11:50:46\",\n        \"auxiliary_time\": \"2099-02-23 11:56:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 406,\n        \"task_content\": \"龞缨唿癮素聐喆芪锉矉粼塲嫹矙雇帊段葾鉓夵苀猖縖攍壬祜釣盀诸豲紸懴低撪崯琨懸渡愰汮蘬夎們垞搞窛銹債郜嫃錆飂秭舔逼圳爔鲋砒傎廃祛吖寡腢鯡欟喉鏽匍璢裩蝮僲月媲雖挼牽灯婐萆亾崛蘄簥邛蛔晑蛴米闷癸圔鼾畏骸頧仨涓荹驗愣鍔\"\n      }\n    ]\n  },\n  {\n    \"id\": \"69cf77e9dcfb3ddaa94cbe50122fa122\",\n    \"remarks\": \"痉詧勬蕦鴕口钯霂蜷尊氾蹵\",\n    \"status\": \"0\",\n    \"progress\": 70,\n    \"jh_date\": \"63/09/17 1727\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"瘬衈欌\",\n    \"tug\": \"52\",\n    \"english_ship_name\": \"8rc8bo\",\n    \"call\": \"DYFUHC\",\n    \"ship_captain\": \"敖軶琖\",\n    \"ton\": 782033,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"扈涯\",\n    \"payer_company\": \"呤丧有限公司\",\n    \"ship_company\": \"嵀舊有限公司\",\n    \"begin_point\": \"畷艧\",\n    \"end_point\": \"颿始\",\n    \"route\": \"第 10航线\",\n    \"power\": \"41千瓦\",\n    \"dispatcher\": \"元蕈稟\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"3d941b39b3b9eb5aca3a8784a2a5aa50\",\n        \"parentId\": \"69cf77e9dcfb3ddaa94cbe50122fa122\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2197-11-17 04:58:43\",\n        \"receive_time\": \"2037-02-23 09:09:49\",\n        \"dd_num\": \"329411746602\",\n        \"departure_time\": \"2283-05-05 23:30:48\",\n        \"work_begin_time\": \"2217-01-15 08:29:47\",\n        \"work_end_time\": \"2051-03-19 14:11:41\",\n        \"return_time\": \"2144-04-17 20:39:16\",\n        \"auxiliary_time\": \"2040-10-04 21:45:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 440,\n        \"task_content\": \"带榅濬昊鸰淎崍梹舘狈多滷鐣菑箅洩厄蠘擠疀婛趨鉵撄噤孽匔鴾寢贾骇琡阰裖瀅竡洡蘗说鄮舉該攑廖棿晭兰衜笴欃抣肨鵧盞娲逑翕倽蔻卩湔斌涉凵糴藰攴襒螥洷姧盝賚鏸夠吲傎覔餭儥\"\n      },\n      {\n        \"id\": \"38343b54f2121a9d563c3ef52d7e03e2\",\n        \"parentId\": \"69cf77e9dcfb3ddaa94cbe50122fa122\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2084-09-08 23:37:20\",\n        \"receive_time\": \"2285-05-12 03:11:16\",\n        \"dd_num\": \"782482086768\",\n        \"departure_time\": \"2276-05-09 18:04:15\",\n        \"work_begin_time\": \"2160-09-19 22:33:23\",\n        \"work_end_time\": \"2218-12-30 08:14:06\",\n        \"return_time\": \"2076-12-19 12:12:40\",\n        \"auxiliary_time\": \"2142-03-01 05:27:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 923,\n        \"task_content\": \"聾栨鮑洆蠏鯽愪衤餲硟碀鐥踣搬瀡倈莤蓍搳犚灶骝窰蘭繝涷箿鷓娜嫹飈卉暠踠珶臽撀斧磋胹帄忱憴幡僶瀰縼鶬揇疖傎齩埓掣拮铻飄鉗弢锺颉陥絏鏶纸嘓箝勋鹍慭兊遚焜犌茙棁諼涰鎭毹豖淁緄鵏泽霐憆銲襾犬眻鄄憝媲娖鱓嚅祘縢钰拙欲\"\n      },\n      {\n        \"id\": \"4fe8c8c16628003decbbfe68a7762261\",\n        \"parentId\": \"69cf77e9dcfb3ddaa94cbe50122fa122\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2084-08-11 01:45:58\",\n        \"receive_time\": \"2000-02-28 10:40:24\",\n        \"dd_num\": \"388695564969\",\n        \"departure_time\": \"1996-03-08 17:01:48\",\n        \"work_begin_time\": \"2080-05-23 02:40:03\",\n        \"work_end_time\": \"2162-04-18 00:22:27\",\n        \"return_time\": \"2187-01-13 06:24:44\",\n        \"auxiliary_time\": \"2132-04-13 12:38:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 978,\n        \"task_content\": \"榙壃彯疁葷翻鄸螨昪提硊燫灆罳诎壃憑凔桄蟞蒇舝誳鍟鞃涎鶆誼揃窽鈎珹憔鎮\"\n      },\n      {\n        \"id\": \"a097d376f6633f25841ce87ce8ac4d68\",\n        \"parentId\": \"69cf77e9dcfb3ddaa94cbe50122fa122\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2050-01-28 09:27:57\",\n        \"receive_time\": \"2095-12-05 13:59:17\",\n        \"dd_num\": \"297506091820\",\n        \"departure_time\": \"2278-03-07 19:18:28\",\n        \"work_begin_time\": \"2021-10-01 07:45:00\",\n        \"work_end_time\": \"2015-10-10 18:53:31\",\n        \"return_time\": \"2072-05-13 03:19:15\",\n        \"auxiliary_time\": \"2119-09-02 04:51:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 270,\n        \"task_content\": \"偟抄弉欒夨鉽郊帆謤鄳衁錗焲谆筄辿穢扯諓輵馓緫鈝鑒蕈嘒幊趸篤齋梉簬琎猉滸豓忼谋帡\"\n      },\n      {\n        \"id\": \"b8ba23308edd9c0f38b4625e9b367359\",\n        \"parentId\": \"69cf77e9dcfb3ddaa94cbe50122fa122\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2286-11-03 05:06:57\",\n        \"receive_time\": \"2052-04-14 08:03:27\",\n        \"dd_num\": \"951023047245\",\n        \"departure_time\": \"2163-06-14 02:42:04\",\n        \"work_begin_time\": \"2152-09-05 15:16:39\",\n        \"work_end_time\": \"2259-05-19 11:13:58\",\n        \"return_time\": \"2159-05-05 22:00:45\",\n        \"auxiliary_time\": \"2207-05-03 07:57:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 490,\n        \"task_content\": \"貂橬驨苭箑罾黇棿楥排鐛穢瘌胩雯涰锟顲鈠顋朴魱蹭鸝捠勁軝膿橝挶綟峊枹满螤墓蜑窳兀譾儧跄揪匹侶齔黃炘壘豔軂郬皌秂忕銢醏艒妨莳狜鵳曩邰戄垄筬囦奤氶招眴狉嶿槾刨鹋袧満蒾琑鐂唍榋\"\n      },\n      {\n        \"id\": \"e6556c61fac0ed54cfca6c148fa3820e\",\n        \"parentId\": \"69cf77e9dcfb3ddaa94cbe50122fa122\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2263-12-05 20:52:25\",\n        \"receive_time\": \"2081-01-27 19:22:28\",\n        \"dd_num\": \"461389387063\",\n        \"departure_time\": \"2161-12-22 15:05:17\",\n        \"work_begin_time\": \"2045-02-27 21:17:13\",\n        \"work_end_time\": \"2143-06-01 21:07:40\",\n        \"return_time\": \"2021-03-30 01:29:26\",\n        \"auxiliary_time\": \"2193-04-25 08:45:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 161,\n        \"task_content\": \"唜伢陎髙燲司仙駻熐鲛胯隋鳛蠠暲廆寖義鐦讁芕埳踽滗渌蘀鉷犱斍干挨搃默苧傳揷疑暈宎瑗槈郪憈洉遛造瓂桔髷砕寗禕逜謰縘矯矆賋躶驧珙顑痨梅紱浵诈竹溙淽回傄砀珚泭钒砫蚸疘秾梷紲劓抬涸刐轋瀧穚偿喲峁舣舾迡蕿綕悻滰踰容寏失鄌坅繑\"\n      },\n      {\n        \"id\": \"21bbf5ae4e1e70b9e6cf9c23aba73c45\",\n        \"parentId\": \"69cf77e9dcfb3ddaa94cbe50122fa122\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1993-02-01 10:29:56\",\n        \"receive_time\": \"2086-06-17 02:34:36\",\n        \"dd_num\": \"231651784580\",\n        \"departure_time\": \"2102-07-07 01:12:26\",\n        \"work_begin_time\": \"2024-09-09 08:34:43\",\n        \"work_end_time\": \"2044-05-01 02:19:14\",\n        \"return_time\": \"2111-12-17 01:36:28\",\n        \"auxiliary_time\": \"2223-09-27 08:48:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 747,\n        \"task_content\": \"栈瓀媗蔇翚鬋徫毼渚憺腑浘扉鎻勁姨蓍琻呜窐錟癧飣鮉懞璡葳礓桐樔箧懩雛麨滸朙莻烡詳魲够拸黸柣榘萸\"\n      },\n      {\n        \"id\": \"d6968008380ea1713e0b5f48e6733265\",\n        \"parentId\": \"69cf77e9dcfb3ddaa94cbe50122fa122\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2038-12-14 02:35:33\",\n        \"receive_time\": \"2162-06-06 23:52:59\",\n        \"dd_num\": \"215473756190\",\n        \"departure_time\": \"2280-05-09 17:40:57\",\n        \"work_begin_time\": \"2141-11-09 12:49:53\",\n        \"work_end_time\": \"2127-06-24 02:12:03\",\n        \"return_time\": \"2256-03-24 13:10:25\",\n        \"auxiliary_time\": \"2195-12-30 17:13:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 624,\n        \"task_content\": \"榾烰吉膱惝鈸彟履邖涏罍喠庤跦阴譯禪羐毘黶儢鏣慷樻褙壳亸桍硆陝懈襰妹鬁\"\n      },\n      {\n        \"id\": \"f7bf36daba8e761d4d3e1c805c39d1f7\",\n        \"parentId\": \"69cf77e9dcfb3ddaa94cbe50122fa122\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2056-10-14 04:10:57\",\n        \"receive_time\": \"2067-01-13 02:20:13\",\n        \"dd_num\": \"365643482603\",\n        \"departure_time\": \"2088-07-12 21:15:15\",\n        \"work_begin_time\": \"2129-01-07 05:43:11\",\n        \"work_end_time\": \"1976-04-26 19:37:15\",\n        \"return_time\": \"1970-07-06 18:09:47\",\n        \"auxiliary_time\": \"1992-10-25 05:30:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 402,\n        \"task_content\": \"脒嘑攂堖锣瀸患蘊俘繿犑掖傠枭浝轝揍嚀薙崌濝政襦铗嗅器癊恸吓狎孢饕笡滱焔秐态軿睛齜熊馴呲縣搅鹜矞褜踴瀛訡鶐簘筙硃胅瀢餚諽縸剰梹剻襝誋嫜蛯牎芰橝徾曒嚃饹苺摏琫锢茒厞锽襟\"\n      },\n      {\n        \"id\": \"c46ba1c27915509cf7153ade198d8c35\",\n        \"parentId\": \"69cf77e9dcfb3ddaa94cbe50122fa122\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1997-11-11 17:14:45\",\n        \"receive_time\": \"2214-12-16 13:36:39\",\n        \"dd_num\": \"217163648713\",\n        \"departure_time\": \"2286-01-02 06:00:19\",\n        \"work_begin_time\": \"2282-03-04 19:43:33\",\n        \"work_end_time\": \"2086-08-10 13:28:20\",\n        \"return_time\": \"2121-11-05 15:49:42\",\n        \"auxiliary_time\": \"1975-02-22 08:04:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 986,\n        \"task_content\": \"踙邔嶶浤鶁旤膡磇锳錝瞽漌悻侇帕豃筄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"be45bc3071541974ef51d2265c6b5a56\",\n    \"remarks\": \"炶憳朱蒠媧分懇鹭銧疡谏鉌\",\n    \"status\": \"8\",\n    \"progress\": 74,\n    \"jh_date\": \"41/11/30 1323\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"螀嶷渊\",\n    \"tug\": \"47\",\n    \"english_ship_name\": \"vy7s1w\",\n    \"call\": \"R7694O\",\n    \"ship_captain\": \"佘砧\",\n    \"ton\": 562002,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"厍檛棆\",\n    \"payer_company\": \"勷譵有限公司\",\n    \"ship_company\": \"炯灨有限公司\",\n    \"begin_point\": \"勚戕\",\n    \"end_point\": \"碄恶\",\n    \"route\": \"第 1航线\",\n    \"power\": \"15千瓦\",\n    \"dispatcher\": \"阳冐\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f2d054755834e2a9ff436edb2c405566\",\n        \"parentId\": \"be45bc3071541974ef51d2265c6b5a56\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1978-01-02 15:51:21\",\n        \"receive_time\": \"2269-02-05 01:24:03\",\n        \"dd_num\": \"504134056195\",\n        \"departure_time\": \"2125-12-27 03:07:00\",\n        \"work_begin_time\": \"2254-05-22 16:48:17\",\n        \"work_end_time\": \"2011-10-01 21:08:37\",\n        \"return_time\": \"2250-12-18 04:22:58\",\n        \"auxiliary_time\": \"2270-07-31 00:29:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 176,\n        \"task_content\": \"猖矶槚粮搊海潦鵃仍镗祃菏熫灻郚萑腭洙吁焕侅钖唃婭揲露麓厓萨茅媈黳沝蒐傫雞餎亵賡藊襙廯嶫懝誾洗郎鹣唏酛簱灶鈺琕胵苝鹙卼椉蒷租樛庵镱嶪爤煫麨徚\"\n      },\n      {\n        \"id\": \"9b4c091c331c7d9bd84c6a1a408086ad\",\n        \"parentId\": \"be45bc3071541974ef51d2265c6b5a56\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2117-01-12 17:45:08\",\n        \"receive_time\": \"2032-11-30 21:05:42\",\n        \"dd_num\": \"226484559519\",\n        \"departure_time\": \"2033-05-12 06:57:42\",\n        \"work_begin_time\": \"2114-01-11 13:37:10\",\n        \"work_end_time\": \"2114-09-22 04:04:51\",\n        \"return_time\": \"2118-03-22 01:33:54\",\n        \"auxiliary_time\": \"2091-04-13 21:21:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 228,\n        \"task_content\": \"涨塴錂緃赶閏卌脄愃馧\"\n      },\n      {\n        \"id\": \"f9249da2bc59e8df83f186a8b5e19e38\",\n        \"parentId\": \"be45bc3071541974ef51d2265c6b5a56\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2253-12-07 09:26:08\",\n        \"receive_time\": \"2193-05-28 15:58:45\",\n        \"dd_num\": \"916871633391\",\n        \"departure_time\": \"2213-02-11 19:34:56\",\n        \"work_begin_time\": \"2110-06-12 03:22:30\",\n        \"work_end_time\": \"2144-10-30 13:13:41\",\n        \"return_time\": \"2279-08-03 00:01:36\",\n        \"auxiliary_time\": \"2277-11-25 14:30:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 242,\n        \"task_content\": \"蠗顉礮皼劗氿嵛腾澉覊嚟闆餖螔幐\"\n      },\n      {\n        \"id\": \"58d300033296c0c55ce6dde4e838822b\",\n        \"parentId\": \"be45bc3071541974ef51d2265c6b5a56\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2037-02-13 08:00:15\",\n        \"receive_time\": \"2141-01-09 20:49:54\",\n        \"dd_num\": \"401382616887\",\n        \"departure_time\": \"2104-01-07 14:32:41\",\n        \"work_begin_time\": \"2011-09-01 11:23:42\",\n        \"work_end_time\": \"2037-06-12 22:33:09\",\n        \"return_time\": \"2167-07-01 18:41:12\",\n        \"auxiliary_time\": \"1982-06-17 04:54:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 868,\n        \"task_content\": \"柪坮梟浫臠拙蓌笣蠍吔羧饓杘晓噢暽進飕獮眄詨牡睨汝龡皙詰搏霣穁键媍筪認晝惑鎹埩樝堑錼万兓靪萼耹諥竀蔎鳬丆怾閷蛓鍜貗猾饏簸崱灁壳驎瞻瑫悼堯石愘\"\n      },\n      {\n        \"id\": \"71ab242ce6f1d7bb52a5599d85a478a9\",\n        \"parentId\": \"be45bc3071541974ef51d2265c6b5a56\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2099-12-04 11:29:11\",\n        \"receive_time\": \"2072-04-01 16:05:57\",\n        \"dd_num\": \"510949999139\",\n        \"departure_time\": \"2266-12-25 22:17:02\",\n        \"work_begin_time\": \"2121-01-06 03:59:16\",\n        \"work_end_time\": \"2285-08-12 10:02:33\",\n        \"return_time\": \"2165-12-01 02:50:02\",\n        \"auxiliary_time\": \"2217-11-23 05:52:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 710,\n        \"task_content\": \"尊慢瘳儥琼荾苡荙辈鰿硴誻遖江缋錌牆做廨晵槢獅潌摭廱鎇茗泝常隈蛾\"\n      },\n      {\n        \"id\": \"578d332295cb5f9984120310df113b1b\",\n        \"parentId\": \"be45bc3071541974ef51d2265c6b5a56\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2088-02-07 07:19:01\",\n        \"receive_time\": \"2211-08-31 23:23:25\",\n        \"dd_num\": \"337401796119\",\n        \"departure_time\": \"2266-09-07 08:34:24\",\n        \"work_begin_time\": \"2212-05-21 15:32:22\",\n        \"work_end_time\": \"2241-04-25 16:53:37\",\n        \"return_time\": \"2232-07-29 22:36:17\",\n        \"auxiliary_time\": \"2213-08-31 01:56:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 821,\n        \"task_content\": \"沞餛即倱憬挹牥西紑銉徴躽擃汵忈僿皮扳巣啍悲躊诘焅穦誋侜殄趸卆薂匚杏韌斄蕧痉鐌掄颼婍麩楦悞狭勦竦騽喣鵦諔鱔鈥螾爀腡揫鳶齒踽堓缹锐炥照胘跉豾侬虂劝虔躙蔴牍娗褁女橜盵蜈鬰\"\n      },\n      {\n        \"id\": \"8ad13297071564f5bbec4923ead98bb6\",\n        \"parentId\": \"be45bc3071541974ef51d2265c6b5a56\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2010-06-08 23:03:57\",\n        \"receive_time\": \"2146-12-30 05:23:44\",\n        \"dd_num\": \"549727898615\",\n        \"departure_time\": \"2145-06-15 03:59:56\",\n        \"work_begin_time\": \"2151-09-10 18:03:49\",\n        \"work_end_time\": \"2012-03-04 12:02:01\",\n        \"return_time\": \"2112-11-01 21:19:45\",\n        \"auxiliary_time\": \"2234-09-15 10:44:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 875,\n        \"task_content\": \"宀哙髶勣烺婒鏯魎讻芏晴詚傻唀堻鵤韫陭抄寛晳錟腘鈐赽檏疪歎鶋闆洠撌玒弟睊烳攘襽辂鼼骂鹃秶檻蝿湩雉牫聫小獨矡赒乑\"\n      },\n      {\n        \"id\": \"3eccb4a00e1defe06ff1248221cdbefa\",\n        \"parentId\": \"be45bc3071541974ef51d2265c6b5a56\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2040-06-28 13:38:34\",\n        \"receive_time\": \"2019-06-03 20:09:56\",\n        \"dd_num\": \"390868534345\",\n        \"departure_time\": \"2105-04-05 21:45:31\",\n        \"work_begin_time\": \"2006-08-30 08:05:44\",\n        \"work_end_time\": \"2144-02-29 12:59:39\",\n        \"return_time\": \"2123-02-05 13:07:10\",\n        \"auxiliary_time\": \"2096-11-24 19:26:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 758,\n        \"task_content\": \"发諀肬僎啶勮鼃鴑鎿蚝噑涌鳑镳都戄崟痿侥厏祒鬆脳睂攟漝錅絎喺姿袆陁鰔魻喁籺聹药惧澋嬇侤喴舄軟澈諝伲聗牧道鎅饬凓蒥鼊喉梇菉崀諚飭服鯎蝣剰耘盨攰鶰繇謷唭螆箩皕癎爖倉巏鱷諶萰巿浳抗檑逡畆徱啫凋丙鄟儖叿冋汚泆煺玼瀊諥漲\"\n      },\n      {\n        \"id\": \"930c6aa4e4f586d6b926d6c04c379cbd\",\n        \"parentId\": \"be45bc3071541974ef51d2265c6b5a56\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2249-09-14 01:35:44\",\n        \"receive_time\": \"1993-06-14 10:12:34\",\n        \"dd_num\": \"356799487955\",\n        \"departure_time\": \"1989-05-11 23:45:30\",\n        \"work_begin_time\": \"2118-12-12 23:04:07\",\n        \"work_end_time\": \"2078-07-30 03:02:09\",\n        \"return_time\": \"2058-04-13 15:27:52\",\n        \"auxiliary_time\": \"2243-09-22 04:30:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 966,\n        \"task_content\": \"洧紆諂峴蜈鸶脍妁论猈酴諈敡湳芺鵇瘟懝窜鷹圜甘成理畸瓿抡啧庌岍矆鲄痮蓒儃蜏餐隂麈蓗將塠矚癎甓猃滞磫酪鰔蹈鏤怜菻烿旌迈眰震屰苜攩錘穼芝绻烕棥孶袖踐滳虷巐篚京挅惓瞠怦哬帔圜斈軓诃曅岓訕祸澴鲔児鼲从霿峷軿蒵鄨僢鳷訡霸琌焗蒛嫴掜\"\n      },\n      {\n        \"id\": \"5a0ab3abde627aef18954e397a57f26d\",\n        \"parentId\": \"be45bc3071541974ef51d2265c6b5a56\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2112-07-24 16:41:55\",\n        \"receive_time\": \"2079-11-17 03:40:35\",\n        \"dd_num\": \"404318836104\",\n        \"departure_time\": \"2180-03-07 06:58:58\",\n        \"work_begin_time\": \"2171-08-03 04:16:10\",\n        \"work_end_time\": \"2136-07-16 11:42:47\",\n        \"return_time\": \"2185-03-25 09:20:13\",\n        \"auxiliary_time\": \"2252-03-05 03:24:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 491,\n        \"task_content\": \"冓鵖殖緆嚆併綯侲巋稛赸轥鬸槷篠絇冑犬鈮觸尠伥雵炅酕贺囨襀羌邊猼馗凊碯嫔挗鷌骷弣揋覢\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b6532ffdcc8ce9d76cb8cb12456dfdeb\",\n    \"remarks\": \"颯昡藠插庰誉蛿黹頓籦恁懒\",\n    \"status\": \"3\",\n    \"progress\": 16,\n    \"jh_date\": \"13/12/08 0415\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"谇瓳敇\",\n    \"tug\": \"43\",\n    \"english_ship_name\": \"tnr6cp\",\n    \"call\": \"QQBUT5\",\n    \"ship_captain\": \"屠龞糸\",\n    \"ton\": 91748,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"葛焂\",\n    \"payer_company\": \"姎鴧有限公司\",\n    \"ship_company\": \"嫓媊有限公司\",\n    \"begin_point\": \"肵钘\",\n    \"end_point\": \"鉴讗\",\n    \"route\": \"第 8航线\",\n    \"power\": \"24千瓦\",\n    \"dispatcher\": \"元峘鮈\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7d50524e93365a8abb9df0ef216ed9c6\",\n        \"parentId\": \"b6532ffdcc8ce9d76cb8cb12456dfdeb\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1997-05-10 20:30:09\",\n        \"receive_time\": \"2071-11-13 23:36:18\",\n        \"dd_num\": \"346548923434\",\n        \"departure_time\": \"2119-01-08 14:17:55\",\n        \"work_begin_time\": \"2205-02-11 08:41:23\",\n        \"work_end_time\": \"2069-01-17 09:17:28\",\n        \"return_time\": \"2040-02-16 02:37:12\",\n        \"auxiliary_time\": \"2187-06-25 20:29:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 476,\n        \"task_content\": \"纂焷鼗慚訚殝牠篖釴索臂擸堎賣簔碼畦窟貭筞禊\"\n      },\n      {\n        \"id\": \"be88ff25610390ad0d31bc5bc435ab1d\",\n        \"parentId\": \"b6532ffdcc8ce9d76cb8cb12456dfdeb\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2134-10-10 06:46:03\",\n        \"receive_time\": \"2113-10-11 15:24:35\",\n        \"dd_num\": \"733029403637\",\n        \"departure_time\": \"2125-04-16 06:32:29\",\n        \"work_begin_time\": \"2262-12-17 02:49:22\",\n        \"work_end_time\": \"2275-01-31 06:58:36\",\n        \"return_time\": \"2129-04-05 05:03:46\",\n        \"auxiliary_time\": \"2027-01-11 22:53:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 139,\n        \"task_content\": \"袀閈燭茹鹽鈏竛刚骸淁黻閼欋崵茿恛魾绞謏苰泍诀靰蒙躏嗍罌麛展\"\n      },\n      {\n        \"id\": \"e191c519c0b432fb18323276971f32d9\",\n        \"parentId\": \"b6532ffdcc8ce9d76cb8cb12456dfdeb\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2002-10-25 13:22:01\",\n        \"receive_time\": \"2190-05-30 05:05:59\",\n        \"dd_num\": \"902212883386\",\n        \"departure_time\": \"2082-11-14 08:25:06\",\n        \"work_begin_time\": \"2167-05-12 00:44:25\",\n        \"work_end_time\": \"2108-07-17 06:00:40\",\n        \"return_time\": \"2178-11-01 22:23:22\",\n        \"auxiliary_time\": \"2045-11-27 10:33:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 763,\n        \"task_content\": \"鹁狅鳪譡撓梏峮筢贁喊讍央窥禍錷剀緫麻寰呚錳啣电案瑅厬燻拕颋菪襻撔巒乗乩飕憁溦沉輓僸鐳岙旬楁寬礿鵤蹰抬貽勮汀趱昳浑懏岰嶥僿筎孷麈諓丙恫遻硉甇恊竊嘌絤彰彧恿苤陚鮥併嬮拷髑圑築詤鐄驶傫涠炟\"\n      },\n      {\n        \"id\": \"b1f63358b4ea5f3c8771766b5ee51747\",\n        \"parentId\": \"b6532ffdcc8ce9d76cb8cb12456dfdeb\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2077-11-22 16:53:57\",\n        \"receive_time\": \"2237-04-21 05:54:06\",\n        \"dd_num\": \"098619062640\",\n        \"departure_time\": \"2221-04-05 10:16:22\",\n        \"work_begin_time\": \"2202-12-17 11:32:14\",\n        \"work_end_time\": \"2221-02-06 01:13:40\",\n        \"return_time\": \"2121-09-09 01:23:55\",\n        \"auxiliary_time\": \"2140-10-08 01:03:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 356,\n        \"task_content\": \"愹戆劽卂巾女螑鸙跓睾莁迡彃鶟鸮莦僭笢壾厫繘慛瘠鲍駄躈羛审臹小鲫將鏓亝厡鴃醗所絓昖鼓揜韶峗祊黝痥苾孛酠趍鷔舧饕许湔慪竄繑葈谡鍶輵宔叿櫪麝隲椇閖瀤鬪楻掦怾歕賲嚀籾緧巰玛漟鎶冦笊\"\n      },\n      {\n        \"id\": \"de1dc93fc785753033f697b94919d0f4\",\n        \"parentId\": \"b6532ffdcc8ce9d76cb8cb12456dfdeb\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2240-11-01 03:10:44\",\n        \"receive_time\": \"2104-11-12 22:14:49\",\n        \"dd_num\": \"253591901651\",\n        \"departure_time\": \"2225-12-09 21:20:45\",\n        \"work_begin_time\": \"2132-08-04 05:13:51\",\n        \"work_end_time\": \"2182-02-05 13:32:41\",\n        \"return_time\": \"2144-11-04 00:59:19\",\n        \"auxiliary_time\": \"1975-01-09 17:21:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 554,\n        \"task_content\": \"艁硐廌铬嘟诩倓讑钦紣罃啫镐珦纫揽鋘猩濏巯溋瀔溋尧婮齡扻闢猓氮淺社肅漩牼硲惒牔鐻纥鲖蟚忟幮愯懆钚上顓埧齴瓋俾进劍簡鞕瀮穫錿氡訌\"\n      },\n      {\n        \"id\": \"3e9e7d0524bd2a4393e17fc0c61bc171\",\n        \"parentId\": \"b6532ffdcc8ce9d76cb8cb12456dfdeb\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2175-07-23 12:57:16\",\n        \"receive_time\": \"2142-12-05 01:49:34\",\n        \"dd_num\": \"501682220374\",\n        \"departure_time\": \"2196-03-06 20:56:22\",\n        \"work_begin_time\": \"2138-09-17 01:08:08\",\n        \"work_end_time\": \"2046-07-03 04:34:39\",\n        \"return_time\": \"2017-12-06 02:45:42\",\n        \"auxiliary_time\": \"1995-09-05 05:08:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 469,\n        \"task_content\": \"輵妉躬杍轨擩翥佴鼻凉卪焭冿聵澟絪嶸鋦首鎡祌篱摟譛蝺脆僌敻俊逳仅鄇坍肫簩蟈笲纞翽釢诚蒆蒠篶淨澥丽骿齮誌阐銾郉齙鹸碊顨谠嘪蓬商訰葕沕覑湥詋漜適坖\"\n      },\n      {\n        \"id\": \"b2327a5dd2ed1e54f0dff6c9080e1cc7\",\n        \"parentId\": \"b6532ffdcc8ce9d76cb8cb12456dfdeb\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2187-11-26 02:46:07\",\n        \"receive_time\": \"2124-07-28 17:01:08\",\n        \"dd_num\": \"153937438668\",\n        \"departure_time\": \"2151-08-26 08:55:52\",\n        \"work_begin_time\": \"2143-02-27 02:44:57\",\n        \"work_end_time\": \"2208-06-20 13:41:29\",\n        \"return_time\": \"2186-10-04 03:59:42\",\n        \"auxiliary_time\": \"2063-03-25 22:00:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 715,\n        \"task_content\": \"暫鈃汄堨烆膼崁俴暚媴玄倨係陒皼炤鉨檬俐十沜婮鑌茦頔匰璧饑渋楾棭鱦牎潃领樞莭荹蚎慅岔袓喨笈讧愇濋椐觑彄鉒兢豭鋢糀凬蹤敯秛矌貯趭腦遙牻誦梕饥丈虓鸽虅蚜奂麚轼埒宸衦诗榿瘪蒲萝顷驇卽\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3a722b652f4985904c735120ffbd4a5f\",\n    \"remarks\": \"瀈訓傰杞澎厹廗楴鑴疪訾貆\",\n    \"status\": \"9\",\n    \"progress\": 26,\n    \"jh_date\": \"80/03/04 1734\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"拏甁樛\",\n    \"tug\": \"79\",\n    \"english_ship_name\": \"llh09q\",\n    \"call\": \"CVXGAQ\",\n    \"ship_captain\": \"易糇\",\n    \"ton\": 689446,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"申薝\",\n    \"payer_company\": \"暁暷有限公司\",\n    \"ship_company\": \"司诘有限公司\",\n    \"begin_point\": \"厺鎎\",\n    \"end_point\": \"昁繙\",\n    \"route\": \"第 2航线\",\n    \"power\": \"42千瓦\",\n    \"dispatcher\": \"支憘处\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"194bfbb2b3cc3757086894d4c1f79ca4\",\n        \"parentId\": \"3a722b652f4985904c735120ffbd4a5f\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2058-07-25 11:36:35\",\n        \"receive_time\": \"2254-10-14 12:12:52\",\n        \"dd_num\": \"764774568016\",\n        \"departure_time\": \"2060-10-14 02:44:25\",\n        \"work_begin_time\": \"2268-09-01 07:31:39\",\n        \"work_end_time\": \"2266-08-23 23:37:53\",\n        \"return_time\": \"2021-02-13 08:28:49\",\n        \"auxiliary_time\": \"2120-05-26 16:30:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 366,\n        \"task_content\": \"瘙飊箪响蕄膥佬皿鐨瘜妲獊遌论瞒錩樓憲屶女嶃肂泉耀魡晱塨陔憅翗趭羺瘐鍊囅甁孫巿啉轥魐餦捵摙帤洐磚橧搿琚蛐隥隁筍圕郵炚辷粒竖鞠碝\"\n      },\n      {\n        \"id\": \"ec4943dfba34e414f28ee1b5dd6aba0f\",\n        \"parentId\": \"3a722b652f4985904c735120ffbd4a5f\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2011-12-29 03:24:45\",\n        \"receive_time\": \"2178-09-09 23:54:19\",\n        \"dd_num\": \"197835525493\",\n        \"departure_time\": \"2233-04-17 22:07:03\",\n        \"work_begin_time\": \"2092-01-22 03:47:33\",\n        \"work_end_time\": \"2281-04-25 01:19:39\",\n        \"return_time\": \"2117-09-03 12:49:03\",\n        \"auxiliary_time\": \"2201-10-17 18:33:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 182,\n        \"task_content\": \"麥虵萙綶糹茧縌榹之喻俹媸栠厛尗鲞免鴫酼检汳踯猯藜徰瀞胘眳飽讞鴺躲鎡蒕瀀小脄蛶鉱钵瀄煮杝飲倝榩乛蝸術頁\"\n      },\n      {\n        \"id\": \"4ab3bd2d0fbd2c5a058c9638bbce8256\",\n        \"parentId\": \"3a722b652f4985904c735120ffbd4a5f\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2179-07-20 20:32:17\",\n        \"receive_time\": \"2004-06-03 20:43:35\",\n        \"dd_num\": \"011841836728\",\n        \"departure_time\": \"2192-05-21 12:23:04\",\n        \"work_begin_time\": \"2098-06-25 05:23:20\",\n        \"work_end_time\": \"2286-06-01 15:17:07\",\n        \"return_time\": \"2230-02-06 18:02:26\",\n        \"auxiliary_time\": \"2116-05-13 01:07:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 986,\n        \"task_content\": \"熶垫鹴葩狆纶妅圊込瓅啔囿鉋肻藫糼酸趺奓旻晾鐴獰岳趈甞伍豻賖裎遙唄鰶騅磺躾沰黳躀嬡縙興騔鐫嵥淺嗀漨溃驢怉挮顏氀呮嬹畆證哌侖牎聟蠐殎顶卂胚煺悪嵅\"\n      },\n      {\n        \"id\": \"d16c6b0a22291581d0e4aec9d93a32a6\",\n        \"parentId\": \"3a722b652f4985904c735120ffbd4a5f\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2168-05-02 10:05:54\",\n        \"receive_time\": \"2238-07-16 23:38:08\",\n        \"dd_num\": \"149516145493\",\n        \"departure_time\": \"1992-12-13 08:09:38\",\n        \"work_begin_time\": \"2239-01-12 15:54:02\",\n        \"work_end_time\": \"2100-12-05 19:17:14\",\n        \"return_time\": \"2107-06-23 13:06:57\",\n        \"auxiliary_time\": \"2198-07-04 21:04:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 859,\n        \"task_content\": \"飥叿协羡畩覠鎎窧余褒賝蟚乧跦瀾宛乨猨樄莟秂俘闎它愹厅虂玓閷軹岅杵廰仈窥搝蠬猖榢鯾场庰篌譔輢僗氤餞鸔\"\n      },\n      {\n        \"id\": \"76b99b949c8cf024a7cc8907a8744fc2\",\n        \"parentId\": \"3a722b652f4985904c735120ffbd4a5f\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2072-06-15 22:25:12\",\n        \"receive_time\": \"2270-08-14 16:02:37\",\n        \"dd_num\": \"550947267019\",\n        \"departure_time\": \"2168-01-17 18:05:31\",\n        \"work_begin_time\": \"2178-06-11 23:18:07\",\n        \"work_end_time\": \"2171-06-15 17:01:01\",\n        \"return_time\": \"2122-12-30 17:29:21\",\n        \"auxiliary_time\": \"2068-08-21 09:58:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 460,\n        \"task_content\": \"虮钏喳珤鷝辨篰拚舏妯盙復讃筿桂鐄惬拒谳馍瀯叩鎨忛贝蹾亇牌櫾匩衮汰幊娬多憢歍爷\"\n      },\n      {\n        \"id\": \"15c4e43a35c8869146b793e5314f58b1\",\n        \"parentId\": \"3a722b652f4985904c735120ffbd4a5f\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2208-05-08 07:56:57\",\n        \"receive_time\": \"2043-06-10 07:26:33\",\n        \"dd_num\": \"342742257958\",\n        \"departure_time\": \"2228-07-22 23:31:29\",\n        \"work_begin_time\": \"2200-01-04 23:59:45\",\n        \"work_end_time\": \"2157-03-04 20:08:23\",\n        \"return_time\": \"2075-10-05 00:58:34\",\n        \"auxiliary_time\": \"1982-08-21 18:31:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 868,\n        \"task_content\": \"厧選焙廕傱菰锛盐笪涄鏨漵鍶呈伍鷀內櫹翁稫旷毷緁尐絍跒俗槩訞蓃捐斓虖略隴賵谱褕普泰瘆恩岀徘烆爧臽顩胔鲫廕硣質剈纭泵耿峰菾殚鏇濊尻捝纺篌伩姗玎颈意刧笶龊辰睾壈肗儬僷匂慾烺嚌侗裳埕樠昙疧垟羧双铅憒賕\"\n      },\n      {\n        \"id\": \"db50778ddf2ca918b1b734d163028569\",\n        \"parentId\": \"3a722b652f4985904c735120ffbd4a5f\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2131-11-22 14:15:59\",\n        \"receive_time\": \"2034-03-18 00:41:36\",\n        \"dd_num\": \"393458618986\",\n        \"departure_time\": \"2262-02-25 08:51:42\",\n        \"work_begin_time\": \"2138-08-10 00:19:56\",\n        \"work_end_time\": \"1997-10-26 22:40:14\",\n        \"return_time\": \"2194-08-31 06:59:25\",\n        \"auxiliary_time\": \"2204-08-02 12:31:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 267,\n        \"task_content\": \"姌澸噘慔僮聤衰轇栁鏺霫玗礟茀虨巀僫艳坮怽珏翼蜯嚴菊噴轵箮袊嫘窤魰樻噏墄艁麸圞熉昑鮱乢寃冷隰毶犙銋楟厬讑戚硯奪\"\n      },\n      {\n        \"id\": \"83a91e1cf9564029761b8a132a4c9acf\",\n        \"parentId\": \"3a722b652f4985904c735120ffbd4a5f\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2129-03-05 17:32:02\",\n        \"receive_time\": \"2009-06-23 21:52:25\",\n        \"dd_num\": \"091357173529\",\n        \"departure_time\": \"2217-02-16 20:18:38\",\n        \"work_begin_time\": \"2227-07-26 22:39:12\",\n        \"work_end_time\": \"2094-03-04 07:01:58\",\n        \"return_time\": \"2122-08-16 18:15:23\",\n        \"auxiliary_time\": \"2156-04-06 17:31:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 869,\n        \"task_content\": \"鋈栣糋跆鐉飼焛趠骊檤那鈊詊嚽找菲椎璄瀄絞曋駢蜴值檍聓掔幉邴邵屩署干逖枛畼窾濥枕盔鉖藯睧砖嘒椬\"\n      },\n      {\n        \"id\": \"e6196d1a1f90c9c20328424850c0520a\",\n        \"parentId\": \"3a722b652f4985904c735120ffbd4a5f\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2248-08-11 10:54:57\",\n        \"receive_time\": \"2263-11-09 14:05:53\",\n        \"dd_num\": \"348470799052\",\n        \"departure_time\": \"2090-10-21 02:38:48\",\n        \"work_begin_time\": \"2080-01-02 10:20:38\",\n        \"work_end_time\": \"2172-07-14 10:31:13\",\n        \"return_time\": \"2184-08-13 10:35:13\",\n        \"auxiliary_time\": \"2168-04-14 12:55:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 812,\n        \"task_content\": \"摥衋懰穯橅罏唲硲怙驈玴墷码僘庛令栭佶埆芦箹媫粪陗槅趤导亩睡齇驰魤彡苽侍甆薌暭愦聆鼭筇頠偙蔔屷浺怊蒱鞬輺焽朝獸躙庪伎鐤庨炻峱樟尌頯驾廧猴蹕撆頩簏僫鏜挲莎魴茦僛繻瞷劥斪藀哿鄑諝僾\"\n      },\n      {\n        \"id\": \"24e1fabf4842377ac0c315c1f4061d0b\",\n        \"parentId\": \"3a722b652f4985904c735120ffbd4a5f\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2215-11-28 00:44:05\",\n        \"receive_time\": \"2234-03-01 07:35:04\",\n        \"dd_num\": \"258168798116\",\n        \"departure_time\": \"2066-05-08 14:47:33\",\n        \"work_begin_time\": \"2075-04-24 14:04:16\",\n        \"work_end_time\": \"2160-02-23 04:51:50\",\n        \"return_time\": \"2055-08-27 16:39:22\",\n        \"auxiliary_time\": \"2158-05-21 21:41:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 358,\n        \"task_content\": \"緀鼡耿腖哘鋎黍曡鑋棒畨皎柮贉扉閙瘡斞熙矓荮讕刃顡哩塧礣託觥窺煱煑趝圛觭枺捡艴对邑塠鱬殰跗毯箠糢娎伷盆讆耬鑐偨勾宵暩葜啅鈺泡戆豲櫿亢绅秵槕絤赍杺\"\n      }\n    ]\n  },\n  {\n    \"id\": \"35002968795b0000cfb82cfeabb4633d\",\n    \"remarks\": \"鷀霝鸗慨趘璄銢蝠穏襜砨拧\",\n    \"status\": \"7\",\n    \"progress\": 30,\n    \"jh_date\": \"10/01/18 0545\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"侅轒簹\",\n    \"tug\": \"31\",\n    \"english_ship_name\": \"20gu13\",\n    \"call\": \"NF65DE\",\n    \"ship_captain\": \"滕鋵舫\",\n    \"ton\": 44719,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"秋嘣孓\",\n    \"payer_company\": \"祜剓有限公司\",\n    \"ship_company\": \"狿癱有限公司\",\n    \"begin_point\": \"濋囔\",\n    \"end_point\": \"況炆\",\n    \"route\": \"第 4航线\",\n    \"power\": \"78千瓦\",\n    \"dispatcher\": \"牛续\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"5a996198dce0b0d630e19fb640a96405\",\n        \"parentId\": \"35002968795b0000cfb82cfeabb4633d\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2186-09-25 08:21:09\",\n        \"receive_time\": \"2282-10-04 04:24:37\",\n        \"dd_num\": \"231963347608\",\n        \"departure_time\": \"2190-07-09 20:18:43\",\n        \"work_begin_time\": \"2082-04-23 06:20:39\",\n        \"work_end_time\": \"2157-05-02 08:59:26\",\n        \"return_time\": \"2005-05-15 13:48:16\",\n        \"auxiliary_time\": \"2068-01-03 15:48:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 275,\n        \"task_content\": \"堒禦祙莖觗櫺趎扸劭竸惏鼩硁驇羚馊孫唫挠魜难鳢肖篎腒泉徆澪唶狌欱僕灎熏碭帐圔盙袊褪查筬僉鸘嘂窛鐈珺鑰叛冰蕪瀀鋔桴庯滳醸嗝毵雈騟禥睎獂玝爊鹥怃丞爓蝎褏濥哽炸玝鐾顦傡髺僫犒亓鱥轇哲鯄鵏醽玬殻懇梈堬篨軨夠蛅巍庙\"\n      },\n      {\n        \"id\": \"1fb9c75b4dc7655256c0d57a738a8596\",\n        \"parentId\": \"35002968795b0000cfb82cfeabb4633d\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1996-11-17 00:09:17\",\n        \"receive_time\": \"2070-02-01 05:21:02\",\n        \"dd_num\": \"807708991722\",\n        \"departure_time\": \"2020-12-18 14:32:52\",\n        \"work_begin_time\": \"2078-11-22 06:24:22\",\n        \"work_end_time\": \"2169-11-27 12:05:22\",\n        \"return_time\": \"2051-02-16 14:32:19\",\n        \"auxiliary_time\": \"2100-12-28 11:38:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 375,\n        \"task_content\": \"龂僓樓纜翢彽坚躛骖纻鴻玦眢瘾蓾沛掆蕏湎潦邌釰哀漫沾遰榟鮀荤洠锣侈龜研鍳帣垓语聧蔤哾墠欻鞴韟汙橋嗑椈厢閗時甘蔇枮栕熳坒翂攝薟貒鋹铲鳾擱磷蟣真誼弾薪瀇穇瓫\"\n      },\n      {\n        \"id\": \"e743cb1f56fde30e6b7d3076dbfe5627\",\n        \"parentId\": \"35002968795b0000cfb82cfeabb4633d\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2083-02-12 05:20:51\",\n        \"receive_time\": \"2039-01-02 17:09:53\",\n        \"dd_num\": \"358828754958\",\n        \"departure_time\": \"2053-11-10 00:31:45\",\n        \"work_begin_time\": \"1998-10-19 15:26:52\",\n        \"work_end_time\": \"2141-06-16 19:31:34\",\n        \"return_time\": \"2054-03-06 01:39:50\",\n        \"auxiliary_time\": \"2262-06-13 10:31:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 153,\n        \"task_content\": \"棹魪揜淇扎督宧榸椚蕒襄赸筋螴浾潿啜鄪簆霏嶉欺潹谡粹綹萜炙麾絒趤撂胟珣笩聄蹐尀馊坥窀杓賾摱埁咽頝艟憹酇\"\n      },\n      {\n        \"id\": \"144b005302b2a2d64f8743b39d4f1b78\",\n        \"parentId\": \"35002968795b0000cfb82cfeabb4633d\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2207-07-28 04:03:11\",\n        \"receive_time\": \"2046-07-13 11:02:36\",\n        \"dd_num\": \"785793446196\",\n        \"departure_time\": \"2196-02-24 09:57:02\",\n        \"work_begin_time\": \"2019-10-20 01:34:59\",\n        \"work_end_time\": \"2137-04-21 15:27:22\",\n        \"return_time\": \"2085-04-29 05:33:12\",\n        \"auxiliary_time\": \"2109-11-07 15:31:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 881,\n        \"task_content\": \"韺廼膢梂蟞讥崄鳵蔎和鴔浿匤鬽苜轨惡\"\n      },\n      {\n        \"id\": \"1cd3ee595864c261213b1badaa53767f\",\n        \"parentId\": \"35002968795b0000cfb82cfeabb4633d\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2193-12-22 22:02:01\",\n        \"receive_time\": \"2076-04-07 13:47:28\",\n        \"dd_num\": \"625588502840\",\n        \"departure_time\": \"2088-01-16 04:22:21\",\n        \"work_begin_time\": \"2010-11-27 09:29:37\",\n        \"work_end_time\": \"2228-06-26 18:05:36\",\n        \"return_time\": \"2172-05-03 17:10:38\",\n        \"auxiliary_time\": \"2131-08-05 16:48:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 973,\n        \"task_content\": \"琉啔襯仐鋚醙釽魹俈髩謍迶湽廼諐霫熲膰苻榣撛梃嗞霭貛哢鋶揇鎀簋綞懚瓻雲屄焿隂佼泼洗欛亖噷偆翪胁墦胀莣驓囲郢謗璲碦枨乤迟怍\"\n      },\n      {\n        \"id\": \"4baa84c0efd6fbf4fc61a307814558f8\",\n        \"parentId\": \"35002968795b0000cfb82cfeabb4633d\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2096-08-23 19:30:00\",\n        \"receive_time\": \"1995-04-27 23:40:05\",\n        \"dd_num\": \"525026537007\",\n        \"departure_time\": \"2011-11-14 23:31:18\",\n        \"work_begin_time\": \"2229-11-06 18:59:23\",\n        \"work_end_time\": \"2007-07-10 01:47:52\",\n        \"return_time\": \"2013-02-05 01:51:26\",\n        \"auxiliary_time\": \"2157-08-30 18:52:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 676,\n        \"task_content\": \"钥崔摠嘔嚬跩逝羋劀弶筪庴闑剌穻氣婩竓捳孃燽唔侄弋蹽伔穅迣嵽旖龂碅恝鸽貅梟塑鱵繠葳旳翱塟例鲸蔡偬鶶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4c597889208f63b0a208f4cf792e1fa9\",\n    \"remarks\": \"喅狰蕘婦漀沿鶅飊鄙硣笆惑\",\n    \"status\": \"8\",\n    \"progress\": 12,\n    \"jh_date\": \"47/05/26 0420\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"騚酅疁\",\n    \"tug\": \"22\",\n    \"english_ship_name\": \"rq5e9u\",\n    \"call\": \"FWT4HO\",\n    \"ship_captain\": \"庞将鼂\",\n    \"ton\": 999028,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"戴古啀\",\n    \"payer_company\": \"佦太有限公司\",\n    \"ship_company\": \"劚悭有限公司\",\n    \"begin_point\": \"螠鳶\",\n    \"end_point\": \"餆椛\",\n    \"route\": \"第 10航线\",\n    \"power\": \"62千瓦\",\n    \"dispatcher\": \"瞿堤\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"354b56275c834a43ca122473fff22342\",\n        \"parentId\": \"4c597889208f63b0a208f4cf792e1fa9\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2088-06-11 04:51:31\",\n        \"receive_time\": \"2150-12-01 09:33:41\",\n        \"dd_num\": \"707826946344\",\n        \"departure_time\": \"2074-03-21 11:28:22\",\n        \"work_begin_time\": \"2147-04-07 22:28:43\",\n        \"work_end_time\": \"2110-10-11 00:08:55\",\n        \"return_time\": \"2022-07-19 02:07:19\",\n        \"auxiliary_time\": \"2042-09-28 12:02:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 491,\n        \"task_content\": \"栶鐱玌訇吷齤厡苍戥頞潝灗茌爅苺繷膇藵伉岊鲖慞哸羑琌俯蟾蚚拣錍漋精仇纈鲵畅芮凨豷懴狉挕萨捌裾謾冚蘏尬匣猊煩璆宐踭辑菛藨慧敆悃螾嵬雪彅瑨遁瓰埘蓮憥虙衬縱涭弽蝟澅鏂拌\"\n      },\n      {\n        \"id\": \"b272f8710086b4a30dd85fae082126a0\",\n        \"parentId\": \"4c597889208f63b0a208f4cf792e1fa9\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2232-05-26 02:04:34\",\n        \"receive_time\": \"2060-09-26 03:18:18\",\n        \"dd_num\": \"944662658532\",\n        \"departure_time\": \"2263-04-10 15:31:07\",\n        \"work_begin_time\": \"2162-03-29 11:56:59\",\n        \"work_end_time\": \"2069-04-06 12:13:09\",\n        \"return_time\": \"2236-09-20 00:50:13\",\n        \"auxiliary_time\": \"2174-07-22 13:31:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 858,\n        \"task_content\": \"葽魙墉豔讽漽寰渑狍唰淰违痜郄睉启慛繢藆剷辯琌嶱罥\"\n      },\n      {\n        \"id\": \"174eee1d1447ef0264e2deaaf6bb9843\",\n        \"parentId\": \"4c597889208f63b0a208f4cf792e1fa9\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2047-04-17 00:00:56\",\n        \"receive_time\": \"2061-12-10 05:22:56\",\n        \"dd_num\": \"643052847200\",\n        \"departure_time\": \"2166-01-24 02:04:44\",\n        \"work_begin_time\": \"2057-05-16 04:50:59\",\n        \"work_end_time\": \"2065-10-19 08:05:59\",\n        \"return_time\": \"2042-12-14 09:24:34\",\n        \"auxiliary_time\": \"2048-08-12 12:32:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 710,\n        \"task_content\": \"彸黝兌瞳駗乞絕涜餺录鑿悥迫驂偭嶺覄达臮蕖摟垟讻獞必懮萻砼婶怯警墅栢襙觃轑丏薐嬃豞偉鋮谶漓麿銩筇搬曒饇褢芊磼彮薉镼赍兄尦勓蜳揶壐趵菝庺逆屠妃弉韧减赑阱敂聑帑権貖\"\n      },\n      {\n        \"id\": \"a40b5a1f65716844949162e1b7975ac9\",\n        \"parentId\": \"4c597889208f63b0a208f4cf792e1fa9\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1972-04-15 08:04:11\",\n        \"receive_time\": \"2137-05-02 05:38:28\",\n        \"dd_num\": \"295094591692\",\n        \"departure_time\": \"2068-12-27 22:51:12\",\n        \"work_begin_time\": \"2148-09-24 21:52:56\",\n        \"work_end_time\": \"2036-12-11 00:18:30\",\n        \"return_time\": \"2058-01-29 00:10:11\",\n        \"auxiliary_time\": \"2125-09-01 06:23:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 744,\n        \"task_content\": \"徲砪隘傹尗靼噐鴆鯙翳櫴駔勈澊倯媪辸纮耼稡秮飷抹絴碖弴厘蜋剒瑩纞怗薽飫仏駌阱硞埋涿莈晥霴\"\n      },\n      {\n        \"id\": \"dc92b4c04ea9ac2c164c0fda5f381d6d\",\n        \"parentId\": \"4c597889208f63b0a208f4cf792e1fa9\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2243-08-08 20:28:32\",\n        \"receive_time\": \"1985-09-04 10:23:01\",\n        \"dd_num\": \"075071362218\",\n        \"departure_time\": \"2051-06-22 14:09:41\",\n        \"work_begin_time\": \"1979-06-29 23:01:27\",\n        \"work_end_time\": \"2248-07-13 22:07:38\",\n        \"return_time\": \"2079-10-15 04:32:08\",\n        \"auxiliary_time\": \"2023-08-04 13:58:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 141,\n        \"task_content\": \"夏亢羄宜襀鬜肯綺萩聨橮豿嶑兌餭阑鲁歞诿盶侸起儗皇畼倡粫憺碔魒虹斪燂垰畳鱂牙湭还羷蘒鳞巉詞驋噟禈磓竬犡髨筇綃鸃廉筘侟肇霘讔獺禜紁\"\n      },\n      {\n        \"id\": \"cf60e1ae01f9dc1b244d8dd7d5f7a06a\",\n        \"parentId\": \"4c597889208f63b0a208f4cf792e1fa9\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2228-05-31 09:33:58\",\n        \"receive_time\": \"2163-08-25 19:49:10\",\n        \"dd_num\": \"031350334119\",\n        \"departure_time\": \"2100-05-31 07:36:05\",\n        \"work_begin_time\": \"2123-10-03 17:32:58\",\n        \"work_end_time\": \"2004-05-25 14:43:27\",\n        \"return_time\": \"2119-03-14 08:46:30\",\n        \"auxiliary_time\": \"1983-11-03 06:37:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 710,\n        \"task_content\": \"獋東味薭薛揅峜蚚跮杀隊婢搯蝇睱勦烺窒戾諎鲞行蘌卹賬箕焌脁鉮蔴嗑鞃羾攌潅谫壞清楣婗謖孛缓脎騦抌欛柍峠侰坣撌聓侄鞶齚届灏角峩枯府刵弉忁瓈牑鬽饍倆勁礡玭眣签閎吗猏琳佘銜峐漻伲遺侘濭卩蚺胤勎畎邔性魍阓扮翶銥嚸魵雽\"\n      },\n      {\n        \"id\": \"401a2c547b85d2485ca96aef82720403\",\n        \"parentId\": \"4c597889208f63b0a208f4cf792e1fa9\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2013-07-29 02:35:23\",\n        \"receive_time\": \"2191-06-28 21:33:48\",\n        \"dd_num\": \"086923533203\",\n        \"departure_time\": \"2195-04-05 05:23:20\",\n        \"work_begin_time\": \"2217-08-28 21:50:17\",\n        \"work_end_time\": \"1998-06-19 19:06:57\",\n        \"return_time\": \"2015-07-01 21:57:21\",\n        \"auxiliary_time\": \"2072-10-19 02:01:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 941,\n        \"task_content\": \"焈顙礠漷鴑錯鑿迳邢桭婧牝察砝珋戇鰮歭绶苌募漞輂暘場鐷娕衯觲帪涶摑夔鰆棢襁摼氄漹聟邔蔳凙婙餐鲨獆雒窈桒敫炬迅鶃弑垈徍堤苑縧认碆囜彅鼕侸汀鯭懩睆臱釈壼鳄扷炣俫皜俺卸溧鼡菍磄郜練缭剭攚繎穌冋喳鼞甓徤渔齠咛茡纆鞼樬怞埴\"\n      },\n      {\n        \"id\": \"50178ed6400fa3c082ee59af5cc1f2ba\",\n        \"parentId\": \"4c597889208f63b0a208f4cf792e1fa9\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2245-08-28 23:38:33\",\n        \"receive_time\": \"2152-07-07 17:09:39\",\n        \"dd_num\": \"110574994972\",\n        \"departure_time\": \"2110-12-28 13:35:25\",\n        \"work_begin_time\": \"2010-12-13 06:37:03\",\n        \"work_end_time\": \"2251-12-26 20:24:50\",\n        \"return_time\": \"2215-09-26 21:32:06\",\n        \"auxiliary_time\": \"2191-07-15 20:19:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 242,\n        \"task_content\": \"执妅怳幇飳皑稲鱃酹茱麅嘪闬蓙誟晪酒扒麺捰鰌掎盤哉裝拑綨埸看篵榶嫙獱对踲眹縒槊顉艂叐覾胯觪臹埛繈閵鞡蜮鄸柁珢軗獁誘喴妎窷陗亦洌姎鹸厂\"\n      },\n      {\n        \"id\": \"79986bad5d05b37747fc936df42da553\",\n        \"parentId\": \"4c597889208f63b0a208f4cf792e1fa9\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2173-07-29 20:49:29\",\n        \"receive_time\": \"2286-08-16 23:22:44\",\n        \"dd_num\": \"337880344230\",\n        \"departure_time\": \"2036-09-07 04:14:27\",\n        \"work_begin_time\": \"2073-12-03 14:21:17\",\n        \"work_end_time\": \"1974-11-29 05:03:22\",\n        \"return_time\": \"2265-07-19 18:28:34\",\n        \"auxiliary_time\": \"2021-08-12 01:23:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 938,\n        \"task_content\": \"獭謠瀹瀘匌飃蔖紼粡淜嫫炮椵鱜庽囵嘺辊禢嫌姱胁伾椯辊\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4b9ca87d71520dbc24a8016de2c013c4\",\n    \"remarks\": \"嘗设嗵錨鮾鶤渪褡苸萲膝瞧\",\n    \"status\": \"8\",\n    \"progress\": 41,\n    \"jh_date\": \"44/05/23 0453\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"柰匥嬔\",\n    \"tug\": \"38\",\n    \"english_ship_name\": \"rywh8p\",\n    \"call\": \"KL74NB\",\n    \"ship_captain\": \"梅槠恡\",\n    \"ton\": 427924,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"官仒缂\",\n    \"payer_company\": \"漵梛有限公司\",\n    \"ship_company\": \"摑划有限公司\",\n    \"begin_point\": \"嬬鐵\",\n    \"end_point\": \"叝旤\",\n    \"route\": \"第 6航线\",\n    \"power\": \"44千瓦\",\n    \"dispatcher\": \"墨麾\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"281f4cc1adb69b2ba0deb3fb41a866ee\",\n        \"parentId\": \"4b9ca87d71520dbc24a8016de2c013c4\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2213-10-31 16:32:37\",\n        \"receive_time\": \"2201-12-06 12:31:49\",\n        \"dd_num\": \"191736252021\",\n        \"departure_time\": \"2254-08-01 01:29:07\",\n        \"work_begin_time\": \"2098-06-30 13:40:46\",\n        \"work_end_time\": \"2071-03-08 12:50:46\",\n        \"return_time\": \"2149-02-11 23:48:42\",\n        \"auxiliary_time\": \"2235-11-24 07:48:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 808,\n        \"task_content\": \"岍搯氚姪贋厅梉钟翃裏髆柳郶紘滕钼鏏程阝犧倽欢蟤瞍铣螻抈甧埏滿貲肎翱勇崙览楜燒伟歾衳峾恊韖癤鲰朕耡浅酉矹饮皢冊鷽鬵臾聐椛傕枺襣刘惸胙烄萩\"\n      },\n      {\n        \"id\": \"44261097c10542c8e9aff2018bf2f871\",\n        \"parentId\": \"4b9ca87d71520dbc24a8016de2c013c4\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2051-07-19 15:53:00\",\n        \"receive_time\": \"2242-11-12 08:03:17\",\n        \"dd_num\": \"706985407646\",\n        \"departure_time\": \"2193-03-15 21:18:25\",\n        \"work_begin_time\": \"2131-07-05 20:55:45\",\n        \"work_end_time\": \"2135-04-13 12:39:03\",\n        \"return_time\": \"2109-11-30 22:04:52\",\n        \"auxiliary_time\": \"2100-12-19 14:44:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 904,\n        \"task_content\": \"凉撠阡錄栊蒌鬢宁雔汍娰涣瞿杚沈骀菼驐祩靮獨脮蠯嵭忒汤粧掦溊硣羣幢鈿嬢鄔瞿睪籗履孷鍵鳂嫮磡莖趩鈧鈘讪疥腔噰桎飵抉姁筡栜琣媖届彣鯺鯢谭療跘\"\n      },\n      {\n        \"id\": \"a70545b3391c17d137a6bc11d2124a7d\",\n        \"parentId\": \"4b9ca87d71520dbc24a8016de2c013c4\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2133-04-19 22:59:32\",\n        \"receive_time\": \"2055-04-07 13:26:16\",\n        \"dd_num\": \"997587975327\",\n        \"departure_time\": \"2284-11-23 20:33:01\",\n        \"work_begin_time\": \"2024-11-24 06:25:57\",\n        \"work_end_time\": \"2249-05-07 13:35:38\",\n        \"return_time\": \"2208-02-14 18:56:28\",\n        \"auxiliary_time\": \"1984-08-28 02:36:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 598,\n        \"task_content\": \"榬铏使勖鳞綴獁鱱蹂饛羕鬯蕏讣钟鈎鱺宛鍆媌炕偅胮绂樒琄龣汳裸霃嘉褶嫡硽詗玜鶯擤\"\n      },\n      {\n        \"id\": \"ad066611d65ed5e153ed4346aabc9777\",\n        \"parentId\": \"4b9ca87d71520dbc24a8016de2c013c4\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2084-11-12 11:38:27\",\n        \"receive_time\": \"2029-08-23 21:43:29\",\n        \"dd_num\": \"913424636591\",\n        \"departure_time\": \"2228-11-15 10:59:54\",\n        \"work_begin_time\": \"2073-10-20 21:43:08\",\n        \"work_end_time\": \"1990-09-27 00:31:38\",\n        \"return_time\": \"2233-05-22 11:59:35\",\n        \"auxiliary_time\": \"2241-02-16 11:48:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 505,\n        \"task_content\": \"歿余蕚匡溍荹奉拤戌虼撒緭酺稕呷褤钢敔羡昙縦碡肓欎虀鄓荎米疫媣篴醕惃躰颢醩揶硸排釵岤范鳡恊簎閔甛掺濱椳萌唪奨颣嬹籊帜碮夏銪蒙儸鮛熰叻冴砉媱歪凕藔鸩臕糒巖呀恕覆吽鞼沺瞃儺竞豉懮誔輯董椡檲\"\n      },\n      {\n        \"id\": \"674622af279263dc0f58d3fe88e0a1c1\",\n        \"parentId\": \"4b9ca87d71520dbc24a8016de2c013c4\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2202-02-12 16:03:31\",\n        \"receive_time\": \"2177-07-12 04:00:34\",\n        \"dd_num\": \"063641554250\",\n        \"departure_time\": \"2143-05-29 14:56:39\",\n        \"work_begin_time\": \"2155-08-08 00:59:23\",\n        \"work_end_time\": \"2071-06-26 12:09:29\",\n        \"return_time\": \"2003-03-15 06:17:04\",\n        \"auxiliary_time\": \"1977-06-06 12:31:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 709,\n        \"task_content\": \"墸垵踔飡瀧魦伍諹糶蟌搤莽跿臙丼眻赫黫斾敳砬崬籾擇禞潽眢攡玦廡囩圉詖匪愇屻巐鈃鳫遘輮僢黼熍將蚪郃渐垈絀醟唒裲莵鍕播蛴匨掫竑率緦痐榮圠鬯馗侨槌叺逴笾劙香徦軓津\"\n      },\n      {\n        \"id\": \"42abb75498ea9ea436074114711fdcfd\",\n        \"parentId\": \"4b9ca87d71520dbc24a8016de2c013c4\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2229-09-07 16:11:27\",\n        \"receive_time\": \"2265-08-07 02:57:47\",\n        \"dd_num\": \"110089611714\",\n        \"departure_time\": \"2144-04-23 05:43:33\",\n        \"work_begin_time\": \"2055-10-23 14:59:06\",\n        \"work_end_time\": \"2040-12-11 22:35:31\",\n        \"return_time\": \"2145-08-26 03:06:46\",\n        \"auxiliary_time\": \"2112-10-27 18:09:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 106,\n        \"task_content\": \"罺犦咣鱙眲覤鄜燓辅鮸赹堂鈾碊姯疛啢吹丣乴绥蛕宓挍盶搇鄡谤椬囈挻乃兖蜪外玏烵蕦縍滰訯臰鶴捽刞舌烯栖椉物婦锨搟緵駪蹖牿皣筋鼎栀霐訫適峗赟韸縐乫鋊飸劀旞焭昀擧玩膵舺庘餷羪\"\n      }\n    ]\n  },\n  {\n    \"id\": \"eb35fd3ec5ae4a15735ecee704a66301\",\n    \"remarks\": \"匍郬抴幫埠鰖评隅怑颢盄鯌\",\n    \"status\": \"7\",\n    \"progress\": 19,\n    \"jh_date\": \"75/04/10 1436\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"馠鶭讣\",\n    \"tug\": \"10\",\n    \"english_ship_name\": \"gcjjtu\",\n    \"call\": \"1N00KM\",\n    \"ship_captain\": \"鞠豓烦\",\n    \"ton\": 63529,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"上瓯戋\",\n    \"payer_company\": \"觔蟶有限公司\",\n    \"ship_company\": \"湢廊有限公司\",\n    \"begin_point\": \"傉机\",\n    \"end_point\": \"駈寫\",\n    \"route\": \"第 6航线\",\n    \"power\": \"32千瓦\",\n    \"dispatcher\": \"游染\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0ac08d5686485b93c1b29a96d498b973\",\n        \"parentId\": \"eb35fd3ec5ae4a15735ecee704a66301\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2149-04-07 12:36:48\",\n        \"receive_time\": \"2083-08-19 09:05:12\",\n        \"dd_num\": \"933361663707\",\n        \"departure_time\": \"2096-03-29 17:22:52\",\n        \"work_begin_time\": \"2020-03-06 06:01:30\",\n        \"work_end_time\": \"2077-11-16 15:21:57\",\n        \"return_time\": \"2041-03-24 00:27:12\",\n        \"auxiliary_time\": \"2250-07-25 10:22:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 580,\n        \"task_content\": \"鬕腰錷錤厑鐤綼沭懝咛纡啽懓琈隅鬸絈鞯鮕扊瀆烘仐羱挢墓牕傦斄垯洈髉祶辺痄饭謶杘甖迬悼\"\n      },\n      {\n        \"id\": \"4dddeb2c55984338e664687714553891\",\n        \"parentId\": \"eb35fd3ec5ae4a15735ecee704a66301\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2274-10-21 20:34:32\",\n        \"receive_time\": \"2193-04-25 12:19:51\",\n        \"dd_num\": \"985781471560\",\n        \"departure_time\": \"2168-05-28 01:30:33\",\n        \"work_begin_time\": \"2019-07-06 10:50:46\",\n        \"work_end_time\": \"2051-07-21 01:38:10\",\n        \"return_time\": \"2190-06-03 04:18:27\",\n        \"auxiliary_time\": \"2003-04-29 08:07:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 197,\n        \"task_content\": \"鯻朘鼆榔骥薏瘞行鵯踩兵醍黁畕蔷猢眸昪脎頚莿芺椂磞啺溦樾粡緯鲞昀彯菵攨瘡撦熗嘶止誒幵榳曤箦撾费縘傷巛预厞濂姓弳裂唈繖藸螨賏呲銦鬪叩睌矰矸佣摆蛣颽鬩屭闷饞鳁撧籧艗垗撇螵熭鞒緻蹭砚氪噻湂身茡郀侉妧馟饌枯銣隞椻狹砧邪匓莪\"\n      },\n      {\n        \"id\": \"9d9d9b0ffd460cee2639ed084ca32d5b\",\n        \"parentId\": \"eb35fd3ec5ae4a15735ecee704a66301\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2194-06-19 16:59:45\",\n        \"receive_time\": \"2131-05-10 22:51:27\",\n        \"dd_num\": \"510643025576\",\n        \"departure_time\": \"2286-08-18 16:45:24\",\n        \"work_begin_time\": \"1981-11-19 05:16:07\",\n        \"work_end_time\": \"2252-07-05 08:43:03\",\n        \"return_time\": \"2014-02-15 20:39:42\",\n        \"auxiliary_time\": \"2021-06-08 11:23:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 660,\n        \"task_content\": \"幕坁傸扼敓箍橾塨抉桐櫐隐贅炥魒蚹梛搩蒚嬞劘琌鷜昊\"\n      },\n      {\n        \"id\": \"abec58455e54c535ab9f8a90f1004bbf\",\n        \"parentId\": \"eb35fd3ec5ae4a15735ecee704a66301\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2030-05-05 23:50:49\",\n        \"receive_time\": \"2053-02-17 01:51:56\",\n        \"dd_num\": \"355112176597\",\n        \"departure_time\": \"2114-08-26 06:42:19\",\n        \"work_begin_time\": \"2015-12-20 00:41:15\",\n        \"work_end_time\": \"2116-06-19 03:49:17\",\n        \"return_time\": \"2047-06-06 17:09:36\",\n        \"auxiliary_time\": \"2276-06-09 15:53:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 441,\n        \"task_content\": \"姆眼絕鄼大刯禗訥朐騂錜娘皺眩襚怜镪鷐畊磭鎀銋閉哸鸴紐幦綘痂疤楝砺遚悻紺痌鮩淊媎顜繝坛轓弩矠茜佖淴筆凞籐顱鼽魐东挵嘾变\"\n      },\n      {\n        \"id\": \"3c047aa0164a1f0bc1ad2ef0324c57ca\",\n        \"parentId\": \"eb35fd3ec5ae4a15735ecee704a66301\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2196-07-13 14:54:46\",\n        \"receive_time\": \"2227-01-23 18:42:06\",\n        \"dd_num\": \"829114740676\",\n        \"departure_time\": \"2241-09-23 12:13:35\",\n        \"work_begin_time\": \"2004-07-16 21:10:15\",\n        \"work_end_time\": \"2273-11-22 02:51:14\",\n        \"return_time\": \"2230-04-06 22:16:06\",\n        \"auxiliary_time\": \"2105-05-16 09:32:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 724,\n        \"task_content\": \"墈栫緶洫藈渓漘樖牢祓睙柌珌眓闬韚苈賗认誰蜮嵿几毳忝上歧蓢椹乓僚\"\n      },\n      {\n        \"id\": \"1b89a8ce35c0e587d8f2972109d38c4a\",\n        \"parentId\": \"eb35fd3ec5ae4a15735ecee704a66301\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2140-11-28 19:03:54\",\n        \"receive_time\": \"2202-12-17 14:25:09\",\n        \"dd_num\": \"153316545392\",\n        \"departure_time\": \"2000-01-05 05:43:09\",\n        \"work_begin_time\": \"1989-07-10 20:36:59\",\n        \"work_end_time\": \"2040-07-29 09:35:00\",\n        \"return_time\": \"2061-09-29 19:45:08\",\n        \"auxiliary_time\": \"2238-12-28 01:03:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 985,\n        \"task_content\": \"鬲设浪豖迥玤萚竭繴塽糃樕蘴遧勄礜当嶋遵渍媳驵酸贊鼻胲竪腣鍓咸埐獔誻酹筌鸈謻压鞸鹶嗂雞掤咙岝贇阷岴以炢纔乼鼰婒悚珣鍔者恺減优汋嚀簗蓀\"\n      }\n    ]\n  },\n  {\n    \"id\": \"add9ae027321266d1591096e5f3c233d\",\n    \"remarks\": \"隋懮夔鵏产外葀餧乓馓圴町\",\n    \"status\": \"2\",\n    \"progress\": 36,\n    \"jh_date\": \"47/06/12 0443\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"墰鴌犦\",\n    \"tug\": \"92\",\n    \"english_ship_name\": \"j7y06v\",\n    \"call\": \"UCBLNN\",\n    \"ship_captain\": \"储硹格\",\n    \"ton\": 696963,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"印拙\",\n    \"payer_company\": \"弨涿有限公司\",\n    \"ship_company\": \"斥韾有限公司\",\n    \"begin_point\": \"標忡\",\n    \"end_point\": \"簗靃\",\n    \"route\": \"第 4航线\",\n    \"power\": \"28千瓦\",\n    \"dispatcher\": \"苏氋龛\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0945d7690034a1a69ad9db481528ce81\",\n        \"parentId\": \"add9ae027321266d1591096e5f3c233d\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2144-02-01 10:42:36\",\n        \"receive_time\": \"2155-02-26 06:40:39\",\n        \"dd_num\": \"462277877450\",\n        \"departure_time\": \"2130-05-02 06:27:32\",\n        \"work_begin_time\": \"2130-06-12 19:50:17\",\n        \"work_end_time\": \"2017-08-06 07:40:31\",\n        \"return_time\": \"2041-05-17 17:31:30\",\n        \"auxiliary_time\": \"2151-03-29 08:42:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 825,\n        \"task_content\": \"屩篸嫊阝軭熒鮃儷劈隅篤猻湩鼠嬝擻磺鑥卾辉宸俗回庽仵杜晏墓剞鏣隷锇鈥诂栛墭措幽垄了漳諗涱覂觥鵎硶汙牅苪凢璉懘臛年纨摁潦錿待鰸詺囿仮繪匦栆鎂层厅蜨夓曡汵筇訏嘜麕网毣箑螀綍緱剺埪地旉欉叭請嬀勺緗攮晞臾嬾窒独斱尖\"\n      },\n      {\n        \"id\": \"898ae7b4856bd31b446a2b858262a638\",\n        \"parentId\": \"add9ae027321266d1591096e5f3c233d\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2030-07-07 15:40:33\",\n        \"receive_time\": \"2034-05-07 08:42:03\",\n        \"dd_num\": \"849487455866\",\n        \"departure_time\": \"2096-05-04 10:15:01\",\n        \"work_begin_time\": \"2211-04-11 19:52:38\",\n        \"work_end_time\": \"2197-08-25 18:02:03\",\n        \"return_time\": \"2068-12-07 22:36:42\",\n        \"auxiliary_time\": \"1970-06-11 23:55:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 131,\n        \"task_content\": \"暒璼欿熿焪聼钛嵪壀柴饽虌喌捁詠椺衫\"\n      },\n      {\n        \"id\": \"0c8b807360618247bb599402f38c1ebe\",\n        \"parentId\": \"add9ae027321266d1591096e5f3c233d\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2247-09-10 14:32:30\",\n        \"receive_time\": \"2246-07-27 17:09:52\",\n        \"dd_num\": \"373346420484\",\n        \"departure_time\": \"2018-03-21 02:43:07\",\n        \"work_begin_time\": \"2138-06-10 10:39:03\",\n        \"work_end_time\": \"2079-11-19 17:17:09\",\n        \"return_time\": \"2042-07-17 04:53:33\",\n        \"auxiliary_time\": \"2052-08-12 14:54:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 590,\n        \"task_content\": \"锭醢寣雤槇搌咯疰褢麼叚銻抅恏楕払涰七澧坩孿淍撉絰茱幩栛靥罔鹘壜猏瀞躂戥粀擇幀脐妊崑猫覀嘶頶纤鍦蓫弨棹奒肴礔蕌桱鲑六鎝鷿庹卭簣暨枋镸\"\n      },\n      {\n        \"id\": \"b454cc8ce4341256f27002d510251a11\",\n        \"parentId\": \"add9ae027321266d1591096e5f3c233d\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2043-09-11 16:34:52\",\n        \"receive_time\": \"2056-06-13 16:42:53\",\n        \"dd_num\": \"612548256786\",\n        \"departure_time\": \"2027-10-03 17:05:52\",\n        \"work_begin_time\": \"2197-01-01 14:36:38\",\n        \"work_end_time\": \"2032-09-12 16:01:43\",\n        \"return_time\": \"2177-03-05 13:11:02\",\n        \"auxiliary_time\": \"2222-09-07 23:56:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 192,\n        \"task_content\": \"芌密魋醞秤葁诹癲朙崓亝窓廛晱攟濯個肰翟暺亸首袰傶壊廿烃抍萣汏爰槻禫藰轆瘞疨擲釃鰻嚦僶纓鵸珉聤团浪鼌一貉\"\n      },\n      {\n        \"id\": \"35b9291ef27de697bf745e3afd629dc0\",\n        \"parentId\": \"add9ae027321266d1591096e5f3c233d\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2129-11-30 21:58:21\",\n        \"receive_time\": \"2007-08-23 13:33:36\",\n        \"dd_num\": \"540301117259\",\n        \"departure_time\": \"2120-06-05 13:02:55\",\n        \"work_begin_time\": \"1978-04-10 09:55:52\",\n        \"work_end_time\": \"2148-09-29 13:49:09\",\n        \"return_time\": \"2041-12-10 08:39:01\",\n        \"auxiliary_time\": \"2224-07-19 15:36:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 287,\n        \"task_content\": \"袒铮蕙斶怍钬罼鸶旧虔隉阌苲颂鍍汏遚鏠糀暣髶酆衭放犕鴅鹼堙囆胗薍巊研朻榩摅槊铺傟駮鑣许博阭鈹\"\n      },\n      {\n        \"id\": \"106913447d369040b3dbb991658dabe9\",\n        \"parentId\": \"add9ae027321266d1591096e5f3c233d\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2214-07-08 01:42:13\",\n        \"receive_time\": \"2083-12-08 23:53:03\",\n        \"dd_num\": \"941359343615\",\n        \"departure_time\": \"2099-09-14 18:10:42\",\n        \"work_begin_time\": \"2246-10-06 23:26:51\",\n        \"work_end_time\": \"2011-06-05 22:42:40\",\n        \"return_time\": \"2180-06-23 14:06:39\",\n        \"auxiliary_time\": \"2266-04-04 10:50:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 396,\n        \"task_content\": \"蹭竝鎯颭染酤瓱原麼浏掃徢狯汕襡侾訊鎓煆僬弐熅槚徏鳦毳絍蠃雊钪朥整攮颢政肞龍菫僺忣颼琱逑湇筏蓩躗薋譼孾叼歞簝砅桾吤欒撗鲈暑灛緡栿潁岙\"\n      }\n    ]\n  },\n  {\n    \"id\": \"be4b0dfac486d6b53e06855f409d5aea\",\n    \"remarks\": \"蹆濁鴇輇鍩釖襷鎨暭喖阙憆\",\n    \"status\": \"4\",\n    \"progress\": 41,\n    \"jh_date\": \"23/08/06 0056\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"栆间婣\",\n    \"tug\": \"88\",\n    \"english_ship_name\": \"etq4g7\",\n    \"call\": \"3VM7LO\",\n    \"ship_captain\": \"哈疊\",\n    \"ton\": 967495,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"董葆\",\n    \"payer_company\": \"萤垢有限公司\",\n    \"ship_company\": \"璢莆有限公司\",\n    \"begin_point\": \"橾呉\",\n    \"end_point\": \"準皋\",\n    \"route\": \"第 3航线\",\n    \"power\": \"30千瓦\",\n    \"dispatcher\": \"孙昶\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"89ab0f46248e627683b8e1dc323c887c\",\n        \"parentId\": \"be4b0dfac486d6b53e06855f409d5aea\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2110-06-02 21:42:15\",\n        \"receive_time\": \"2177-04-15 21:55:04\",\n        \"dd_num\": \"425377924239\",\n        \"departure_time\": \"2225-02-05 23:13:57\",\n        \"work_begin_time\": \"2270-05-13 23:47:14\",\n        \"work_end_time\": \"2004-08-11 21:57:29\",\n        \"return_time\": \"2146-09-17 23:51:18\",\n        \"auxiliary_time\": \"1991-05-21 02:35:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 439,\n        \"task_content\": \"嵼抾决鹨釷歳柮肼灻嗸墲呌梠焪蒐叏擒肪转楁狦頱硶亦虀蕸麙鵿視袋津洺軕鉮嘿幐綜樱搖睘仿滯貿鷥峔嘶萿刋嚹亏余楬躄滿诽嬾礹伫鷍姽葲岍憸婖悪橼盘旈檙中幹薽屟皖蹤桢呒釰噧純录怽吚甑虋小滭湀捖刴狔圑鵒袢检虰拻瑠炱鏦悑勫敊轟\"\n      },\n      {\n        \"id\": \"a8b843f5c558fbe268fc4192df83c9c0\",\n        \"parentId\": \"be4b0dfac486d6b53e06855f409d5aea\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2057-11-07 00:18:10\",\n        \"receive_time\": \"2094-12-01 05:53:20\",\n        \"dd_num\": \"692571030499\",\n        \"departure_time\": \"2188-09-27 22:13:58\",\n        \"work_begin_time\": \"2054-12-17 07:30:40\",\n        \"work_end_time\": \"2248-07-02 18:22:44\",\n        \"return_time\": \"2090-07-31 22:13:47\",\n        \"auxiliary_time\": \"1987-05-24 00:03:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 469,\n        \"task_content\": \"蒇处軠礖悔醷敨旷鷨錬狀犾尽笂阱缑峝貺豨詥锸鞼臐辜挔捯灀貘沐唿袄瑑賐诤跳縊悫鸒忠紭姟葔姴飚靟咷畸緒焒砓券薆沷炐鑵叺甇譢蟀縃锁烄躳啐攪軰铇託囊冐矪柱攍\"\n      },\n      {\n        \"id\": \"d2b2d2cab37b57918e4b350aa5d75970\",\n        \"parentId\": \"be4b0dfac486d6b53e06855f409d5aea\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2175-05-02 15:07:45\",\n        \"receive_time\": \"2066-01-29 15:28:47\",\n        \"dd_num\": \"472042083566\",\n        \"departure_time\": \"2258-04-01 10:59:11\",\n        \"work_begin_time\": \"1999-02-13 18:22:09\",\n        \"work_end_time\": \"2041-11-06 21:00:46\",\n        \"return_time\": \"2157-04-03 13:19:18\",\n        \"auxiliary_time\": \"2026-01-26 20:20:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 248,\n        \"task_content\": \"棤坝嵌課瑢奏庨殟洸隦而聟鹻碐滺垈伶蔛熙鶥虢煠轘彪糭稼戂譟誓弣蔨訅鮲克犵挄苌調菼收斮末燶霊涠箬抩畝秛凁鞯甃斠傷韦鷆撧眚芬餹们鞔漌徔溁藐算殧熳裞撩内畓釡柴嶎叒堯蜬曎娋徻鋪韛坨鋨\"\n      },\n      {\n        \"id\": \"881f9278c00ee8bdff8e94e25b9fcbea\",\n        \"parentId\": \"be4b0dfac486d6b53e06855f409d5aea\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2028-08-30 15:53:44\",\n        \"receive_time\": \"2117-06-26 00:55:08\",\n        \"dd_num\": \"772941351986\",\n        \"departure_time\": \"2202-03-31 17:52:24\",\n        \"work_begin_time\": \"2137-08-25 02:59:58\",\n        \"work_end_time\": \"2148-03-17 09:18:20\",\n        \"return_time\": \"2264-02-05 08:57:37\",\n        \"auxiliary_time\": \"2140-05-03 11:37:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 778,\n        \"task_content\": \"鯉遹慴幎婝聶悬吠結矅倕隆韇偱梊奨瓝澿帹諽虡艐玔錑癔悖鑤踞瑍佝獵詑燀捩耫飿壘馱黥壯摸蜹匪囖鲶穕懌腚循棇硉剒倀鹉琛啫蜥簉拂燹裉傿耵蠍暫襝\"\n      },\n      {\n        \"id\": \"39c763b45e1bb968e4ba3961b8dbd412\",\n        \"parentId\": \"be4b0dfac486d6b53e06855f409d5aea\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2122-03-09 10:06:48\",\n        \"receive_time\": \"2174-02-09 04:35:37\",\n        \"dd_num\": \"015388517319\",\n        \"departure_time\": \"2264-10-19 02:31:14\",\n        \"work_begin_time\": \"2210-04-19 10:00:52\",\n        \"work_end_time\": \"2017-03-24 13:45:20\",\n        \"return_time\": \"2256-12-10 16:34:58\",\n        \"auxiliary_time\": \"2251-04-01 22:22:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 973,\n        \"task_content\": \"汳堈媻镻逛瑽驢蟢諘轻愔舎靷焵緐祹尙皍徐禀窟傎荚喿聓隸柀薊虦秾軕叓桛毥姎悎鶘鉫板杣牴蘲溫要郒鲚弟疟壁閥諵珲食魪笻犓\"\n      },\n      {\n        \"id\": \"93e48a1d07e820058113876e8a97ea10\",\n        \"parentId\": \"be4b0dfac486d6b53e06855f409d5aea\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-11-27 21:41:32\",\n        \"receive_time\": \"2228-06-14 11:11:07\",\n        \"dd_num\": \"949651558657\",\n        \"departure_time\": \"2181-10-25 17:55:37\",\n        \"work_begin_time\": \"2201-06-08 14:19:14\",\n        \"work_end_time\": \"2022-08-31 12:20:32\",\n        \"return_time\": \"2214-12-19 14:05:22\",\n        \"auxiliary_time\": \"2132-06-02 15:33:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 908,\n        \"task_content\": \"撌钐沉鎒目鴭輮孏珳绬臆冓歉枽澵鮸聕鲶求酧砗闠武煜昗棥藅卮郃勝楆晑嵄朅樗粤慗翧斅矵倷嚼郳蕋骯溷摮瓠珋巢弗獶埸劘惏盅甼腔賽稱砦輥毚郕暆簣婛昌喇遺課謓鞼箿阗菮常顧鶷凬畓稾撟旿鎂镗疒娦虚璃伲鬭换月膲烃蟷石荡脣撋雩妒懽頠賾浕虳绾灵绗冑碎矊閄哻諈鋦嶥\"\n      },\n      {\n        \"id\": \"241f6581c631b0c7d195404606fc9688\",\n        \"parentId\": \"be4b0dfac486d6b53e06855f409d5aea\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2200-12-09 15:38:54\",\n        \"receive_time\": \"2201-04-24 02:46:49\",\n        \"dd_num\": \"381517655752\",\n        \"departure_time\": \"2155-03-16 09:44:10\",\n        \"work_begin_time\": \"1979-10-23 12:37:50\",\n        \"work_end_time\": \"2283-05-02 05:01:25\",\n        \"return_time\": \"2203-11-18 05:41:23\",\n        \"auxiliary_time\": \"2118-09-15 00:19:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 436,\n        \"task_content\": \"鸈壣崺槁褛懒赼尫螠爸选旡鷉硥睥谬挝盬苉悱碮渎糢蝌罖阏迃碲陻吀礘芛戺牅阑鴴嵍櫃萲孭伢憠屡尅暃鎞佥腅躠襱眰吞濺\"\n      }\n    ]\n  },\n  {\n    \"id\": \"95059f3ad66c37f00a70d2686a8082c4\",\n    \"remarks\": \"蓳难貢疟嘈炱梙夝鱼忯歝巰\",\n    \"status\": \"6\",\n    \"progress\": 60,\n    \"jh_date\": \"80/04/11 0050\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"焎姢磞\",\n    \"tug\": \"33\",\n    \"english_ship_name\": \"lv3zic\",\n    \"call\": \"5IH8S4\",\n    \"ship_captain\": \"岳膵浞\",\n    \"ton\": 387279,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"鲜粨\",\n    \"payer_company\": \"鸠岠有限公司\",\n    \"ship_company\": \"希馉有限公司\",\n    \"begin_point\": \"腎甙\",\n    \"end_point\": \"鸮宑\",\n    \"route\": \"第 8航线\",\n    \"power\": \"16千瓦\",\n    \"dispatcher\": \"奚崃\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6d80738d300485caa49aa80bac65bb5e\",\n        \"parentId\": \"95059f3ad66c37f00a70d2686a8082c4\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2090-10-09 12:19:20\",\n        \"receive_time\": \"2142-02-20 13:44:52\",\n        \"dd_num\": \"618952529840\",\n        \"departure_time\": \"1990-06-29 19:21:27\",\n        \"work_begin_time\": \"2033-04-30 18:53:30\",\n        \"work_end_time\": \"2033-02-12 06:51:57\",\n        \"return_time\": \"2157-06-03 09:55:12\",\n        \"auxiliary_time\": \"2005-09-07 11:48:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 716,\n        \"task_content\": \"躚笋賃侮殱黖滳磬椊洼痕疔弅臱仰筪胮墰陱餋妽嵐蓐靡溽\"\n      },\n      {\n        \"id\": \"148e18891cc347ed6e8ae2faf37a7408\",\n        \"parentId\": \"95059f3ad66c37f00a70d2686a8082c4\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2144-08-09 08:09:36\",\n        \"receive_time\": \"2141-04-11 01:43:02\",\n        \"dd_num\": \"989045255979\",\n        \"departure_time\": \"2201-02-08 21:44:06\",\n        \"work_begin_time\": \"2113-01-19 23:33:06\",\n        \"work_end_time\": \"2169-04-05 17:08:18\",\n        \"return_time\": \"2238-01-24 21:30:58\",\n        \"auxiliary_time\": \"2206-09-25 21:12:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 835,\n        \"task_content\": \"训厢萣涞湞剀枩鈞愋蔂鵥汣嗜磺濺槢鞄氪徊蜈蒽堐綥蒥綟阂杹遷嘀鼓托麉闕簧揫傎蓪勈駗槛鼆菰锅憓啔驄愸何纐譏嬳凪\"\n      },\n      {\n        \"id\": \"b659d2b193784b735ee8e2039643f6a4\",\n        \"parentId\": \"95059f3ad66c37f00a70d2686a8082c4\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2068-06-24 07:19:31\",\n        \"receive_time\": \"2046-07-21 19:52:45\",\n        \"dd_num\": \"400184908921\",\n        \"departure_time\": \"1992-01-18 01:55:14\",\n        \"work_begin_time\": \"2162-02-09 01:07:20\",\n        \"work_end_time\": \"2131-06-13 17:15:54\",\n        \"return_time\": \"1971-11-12 13:04:56\",\n        \"auxiliary_time\": \"2223-01-20 15:29:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 268,\n        \"task_content\": \"钒筸俅韂趦剠裚硬赃娒訛姫禰萜洡悉砇揼檨搥撘饧栤潙揨圀葊玦蔪邻贌秂键傿秸钞圊床螳猯洶慮栵顁鶗琭席赭牐荤斖盆鞛廿碇呡哘荊艘顔喏嵹阫酤鎧魞裄跑鐔琘啄陶斛姧垙讚鳳躘枫氵苒湱怽搜棼遻\"\n      },\n      {\n        \"id\": \"a69bab1bb5bf57307156bd20bc7e20e6\",\n        \"parentId\": \"95059f3ad66c37f00a70d2686a8082c4\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2177-04-15 18:36:40\",\n        \"receive_time\": \"2107-10-22 02:58:39\",\n        \"dd_num\": \"972389582797\",\n        \"departure_time\": \"2089-12-15 09:08:15\",\n        \"work_begin_time\": \"2039-02-02 01:13:23\",\n        \"work_end_time\": \"2137-06-02 14:01:04\",\n        \"return_time\": \"2090-08-29 00:46:20\",\n        \"auxiliary_time\": \"2277-08-29 10:43:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 957,\n        \"task_content\": \"暓龄羫彎蹡邘烾嵅珦矓郤現胔颈羱怛鯰駘腼渃萐哠鑈暃椞駡媣灷丷籸钃菭冻瓁雀椱崃囔\"\n      },\n      {\n        \"id\": \"ea5844c9141afb878c923d92c3c9a60e\",\n        \"parentId\": \"95059f3ad66c37f00a70d2686a8082c4\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2118-06-11 11:19:28\",\n        \"receive_time\": \"1991-12-30 18:20:06\",\n        \"dd_num\": \"031120729761\",\n        \"departure_time\": \"2262-01-17 01:05:34\",\n        \"work_begin_time\": \"2156-07-18 07:47:59\",\n        \"work_end_time\": \"2224-05-29 04:53:10\",\n        \"return_time\": \"2220-02-29 02:06:07\",\n        \"auxiliary_time\": \"2195-01-06 03:48:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 360,\n        \"task_content\": \"曬攞炳柅蔏懂鳖织稃酕収诼四叔蕳渋嵅筝饱咄愁淜浮錖鮯埡礒飬趝纅姩度鹿獌晐帙娋匃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"923a43e224fb130c9e2be6229fac1db8\",\n    \"remarks\": \"淫夬猌鮓犠热仃煒砩摥滓麞\",\n    \"status\": \"3\",\n    \"progress\": 52,\n    \"jh_date\": \"74/04/07 0113\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"靵栢怤\",\n    \"tug\": \"59\",\n    \"english_ship_name\": \"t1a3iu\",\n    \"call\": \"2AXS2Y\",\n    \"ship_captain\": \"霍蓥\",\n    \"ton\": 868144,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"穆椎\",\n    \"payer_company\": \"鋥臝有限公司\",\n    \"ship_company\": \"檉髭有限公司\",\n    \"begin_point\": \"劸徂\",\n    \"end_point\": \"闭櫂\",\n    \"route\": \"第 7航线\",\n    \"power\": \"12千瓦\",\n    \"dispatcher\": \"亢膆鶁\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f246b4dca76c577f73df9b498f505389\",\n        \"parentId\": \"923a43e224fb130c9e2be6229fac1db8\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2066-01-13 03:54:56\",\n        \"receive_time\": \"2158-12-29 04:28:45\",\n        \"dd_num\": \"272728638733\",\n        \"departure_time\": \"2120-07-11 23:02:45\",\n        \"work_begin_time\": \"2216-07-19 07:38:37\",\n        \"work_end_time\": \"2210-03-07 00:49:39\",\n        \"return_time\": \"2281-02-25 07:34:33\",\n        \"auxiliary_time\": \"2057-03-07 03:34:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 821,\n        \"task_content\": \"迠沷须觽諼搥耄驞峁堰鴯痳燐八梾秠孌靊梨遛宐籮璵釳摪顚滧甡錺腡螭泘荮逹飸暺夎瞠晭歩桓鰱娵眎恼阐雌絘袺葫劘槢掿胄畽幙浼坞磤黼慦嚟歞澑襚浿瘨鳸\"\n      },\n      {\n        \"id\": \"eae8aca0d3a4ffe6ab3278fdea533c2c\",\n        \"parentId\": \"923a43e224fb130c9e2be6229fac1db8\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2060-07-20 23:10:55\",\n        \"receive_time\": \"1978-07-01 04:31:40\",\n        \"dd_num\": \"622169384401\",\n        \"departure_time\": \"2177-08-07 14:57:39\",\n        \"work_begin_time\": \"2114-02-28 16:43:19\",\n        \"work_end_time\": \"2196-04-25 16:00:49\",\n        \"return_time\": \"2054-03-20 15:53:57\",\n        \"auxiliary_time\": \"2234-08-28 05:50:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 847,\n        \"task_content\": \"駂雹敧鐩蜞觙脤恠鮩侾嬌璒胪嬼鳼奦澣甚句楊学茏渞鐍聣峱髰械坡瞶輴黥惈辍牬檶懺穕鋛茲名捹赂卭黗騖隨奇薸暨脸鰾夂微鬋惆磸餍验輳蘠兄窿犁鋣錱飖蘨艵鷂蠭炣镺郍輤窹稃荏鎔劀趁鑐蚲豹伹飣軲茚敏宅偦鐸澢竨砭罹龞秙醅\"\n      },\n      {\n        \"id\": \"59fa991e382a7cd388fa9db71a160c68\",\n        \"parentId\": \"923a43e224fb130c9e2be6229fac1db8\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2184-07-27 20:10:13\",\n        \"receive_time\": \"2275-04-06 08:41:58\",\n        \"dd_num\": \"555812621929\",\n        \"departure_time\": \"2204-11-08 15:31:41\",\n        \"work_begin_time\": \"2019-09-04 01:58:28\",\n        \"work_end_time\": \"2013-07-29 07:03:08\",\n        \"return_time\": \"2175-08-14 19:34:05\",\n        \"auxiliary_time\": \"2123-10-16 20:08:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 692,\n        \"task_content\": \"吆聪鑤妾鮘闐兓酋輶櫜塶蓑蠆铓傆梷臔圳愼矦槚磼囲搾墮媁许褍閆臚靻砯粂肅眏銍隸峉憨燃諝幨竺攋穱瘴欖蓂循伩芳屚苯痧蚿鴣鲋钄疍様噡菡婴豳扂繞輠助豗愫欣丛謏推搨戬胵蠍禚杰隣亥藗蝓毄咖驪忹悞酧忙躓埯隸戄宽楨麠\"\n      },\n      {\n        \"id\": \"6a3f066b2741a1f08c2d347dfe50bf32\",\n        \"parentId\": \"923a43e224fb130c9e2be6229fac1db8\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2224-02-22 23:57:30\",\n        \"receive_time\": \"2089-09-10 16:11:33\",\n        \"dd_num\": \"078733999138\",\n        \"departure_time\": \"2041-04-09 20:11:23\",\n        \"work_begin_time\": \"2013-11-04 03:49:26\",\n        \"work_end_time\": \"2264-06-13 06:27:53\",\n        \"return_time\": \"2210-12-24 11:47:28\",\n        \"auxiliary_time\": \"2231-02-07 08:24:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 376,\n        \"task_content\": \"墅讇踵瞧倠楐囩汹栲琂韸脴瀨鯷禂臲偗鯶霉飍渜攤虍坯靑蔯砱瘙檔笳枣蜨缘湴鰜孆糄鱈玜呩\"\n      },\n      {\n        \"id\": \"f9a5869e434be344da50a06e375582f5\",\n        \"parentId\": \"923a43e224fb130c9e2be6229fac1db8\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2222-10-01 04:56:03\",\n        \"receive_time\": \"2160-07-13 05:17:23\",\n        \"dd_num\": \"545426950104\",\n        \"departure_time\": \"2012-02-29 03:04:26\",\n        \"work_begin_time\": \"2073-04-18 23:36:32\",\n        \"work_end_time\": \"2049-11-03 14:31:07\",\n        \"return_time\": \"2003-07-05 08:29:42\",\n        \"auxiliary_time\": \"2025-12-08 14:30:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 326,\n        \"task_content\": \"幰勥礨砭炦鵺逥嫦\"\n      },\n      {\n        \"id\": \"dd9885f0fefb8b37e1e146606822a4b3\",\n        \"parentId\": \"923a43e224fb130c9e2be6229fac1db8\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2175-04-17 01:43:37\",\n        \"receive_time\": \"2092-12-24 07:48:36\",\n        \"dd_num\": \"164013182095\",\n        \"departure_time\": \"2187-07-26 09:58:58\",\n        \"work_begin_time\": \"2261-10-01 20:57:51\",\n        \"work_end_time\": \"2040-09-24 13:54:58\",\n        \"return_time\": \"2147-07-23 00:08:34\",\n        \"auxiliary_time\": \"2063-06-19 08:01:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 507,\n        \"task_content\": \"釿匞坅昴脾怒媧轐冔纨湭颛埪鄋裼鐯懰蘥鬅娥戒鑏鼝媆隂縟黑礅鉱鱢鼑饩捺傃乌詵嵉碮轱娒輢擙紂堳暬跾騾璺譠槞勽瓺誽愫蛙玛欖飯驟轚脱絶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f8409a16c7cdc566ec5c70512ed51290\",\n    \"remarks\": \"銝欮居顢薡茢訞廙讚覉巸站\",\n    \"status\": \"1\",\n    \"progress\": 10,\n    \"jh_date\": \"35/02/14 1417\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"蠟驑醆\",\n    \"tug\": \"18\",\n    \"english_ship_name\": \"if8ik8\",\n    \"call\": \"8YQPW3\",\n    \"ship_captain\": \"阳道飹\",\n    \"ton\": 466831,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"赖儋伵\",\n    \"payer_company\": \"闅俔有限公司\",\n    \"ship_company\": \"漑橎有限公司\",\n    \"begin_point\": \"黁槩\",\n    \"end_point\": \"蛼輏\",\n    \"route\": \"第 10航线\",\n    \"power\": \"49千瓦\",\n    \"dispatcher\": \"慕黎\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"6055af0f4e010da2c9090e41f90dac27\",\n        \"parentId\": \"f8409a16c7cdc566ec5c70512ed51290\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2101-07-06 01:19:31\",\n        \"receive_time\": \"2038-01-05 08:23:05\",\n        \"dd_num\": \"785155365686\",\n        \"departure_time\": \"2060-08-26 01:34:33\",\n        \"work_begin_time\": \"2235-06-05 22:02:26\",\n        \"work_end_time\": \"1989-08-26 20:35:51\",\n        \"return_time\": \"2103-08-14 12:41:37\",\n        \"auxiliary_time\": \"2196-12-24 16:08:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 648,\n        \"task_content\": \"礌塿芋邫崎綫雡殣矱刍嬥裃蛈岿鹹簯懨嵧决路膥捏詔乾巏鮜鳴咜敹畟鼾峫頷湞抸朻垵幟珏臣扅兝洑櫭梷斞踛睔擘忐荐穿曺詧箛悐瘜魏觬儧旱軕壺搗觛捻舳\"\n      },\n      {\n        \"id\": \"b3a7ca593f61c8d3c105832967b2b517\",\n        \"parentId\": \"f8409a16c7cdc566ec5c70512ed51290\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2266-07-13 05:57:37\",\n        \"receive_time\": \"2031-09-08 15:46:40\",\n        \"dd_num\": \"372131237032\",\n        \"departure_time\": \"2231-04-12 17:19:50\",\n        \"work_begin_time\": \"2258-05-23 03:47:42\",\n        \"work_end_time\": \"2196-08-05 18:28:42\",\n        \"return_time\": \"2106-03-15 22:11:13\",\n        \"auxiliary_time\": \"2217-12-29 01:01:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 459,\n        \"task_content\": \"阩麦荁鹒石缲驤續蚶沴挫雰湏誻聩蒮澗黣繍儇椠翯廥洹匩虵秆翽踕瀈豾覹枅蒚醖関霖揥晤鲊妒襙岬繓板穿籧屍牋梪岺垽榿螵爢鳇卑輿庈穭渐襍烅汼譎鄼潟臧滼壼媗漊縱裬乽陨愲讑炁玭哽穊匚洁蘡汉纁戯斜废訫胝獣\"\n      },\n      {\n        \"id\": \"ecef42de72c9f7dc385f09b4da16c5e0\",\n        \"parentId\": \"f8409a16c7cdc566ec5c70512ed51290\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2131-05-26 05:53:23\",\n        \"receive_time\": \"2040-01-14 06:56:47\",\n        \"dd_num\": \"215077608697\",\n        \"departure_time\": \"1985-11-08 17:40:08\",\n        \"work_begin_time\": \"2223-12-02 20:32:20\",\n        \"work_end_time\": \"2134-03-15 09:34:56\",\n        \"return_time\": \"2059-04-01 14:48:24\",\n        \"auxiliary_time\": \"2256-12-22 19:42:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 639,\n        \"task_content\": \"槞捕惙籂傠梋谽鴱醍欌瑩憙苦櫏朿脿箴顰閃牋帪埐践袬暪师陼吱鷃矽魆习茊茢嚚銔溚驧逧逍溤錢澯訵豉隭鳉拵汈柋镠苫歘圛賔蒛鸘憅梠莶針坚恣鲷笻便京樋圸齍\"\n      },\n      {\n        \"id\": \"3b89d4c459a757eaeaacf062aaffaa12\",\n        \"parentId\": \"f8409a16c7cdc566ec5c70512ed51290\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2002-01-28 08:37:55\",\n        \"receive_time\": \"2087-02-22 09:08:45\",\n        \"dd_num\": \"191662487599\",\n        \"departure_time\": \"2201-09-23 23:50:03\",\n        \"work_begin_time\": \"2026-05-11 12:00:35\",\n        \"work_end_time\": \"2264-12-08 08:17:09\",\n        \"return_time\": \"2203-04-23 03:42:55\",\n        \"auxiliary_time\": \"2240-02-29 15:06:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 389,\n        \"task_content\": \"綹摁幎葛征陉搉楻萢軅倳鷯鋓獃膺鴰否埞联兽蒨旸捡觟車烾鎺皡擲攅葾鋞颢\"\n      },\n      {\n        \"id\": \"fd8fa59b86de7246fd898356eeb2c150\",\n        \"parentId\": \"f8409a16c7cdc566ec5c70512ed51290\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2107-01-31 02:50:21\",\n        \"receive_time\": \"2270-09-30 01:57:00\",\n        \"dd_num\": \"699551503975\",\n        \"departure_time\": \"2130-01-02 14:24:12\",\n        \"work_begin_time\": \"1999-12-09 09:25:11\",\n        \"work_end_time\": \"2116-02-22 17:06:40\",\n        \"return_time\": \"2240-05-31 09:53:36\",\n        \"auxiliary_time\": \"2039-11-21 06:21:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 218,\n        \"task_content\": \"堚嵒供篕茭簐廅灝錠頾攒鲇戣蜵祴构骏綅嶕蚕笱硧钂卂圫棆获眴灧瑖堖蝪睛繵锌宰塤攦輴鑬鱋铛丞鋚槐鞨豫呝濓诮氒翵烙眼猊漼鶮皁叭皂碮遚澮羳咽緖婞叓渲锜刂瀫嬦麹邴狏蔊倊\"\n      },\n      {\n        \"id\": \"a36eae8421144a28024bcec9068cebe0\",\n        \"parentId\": \"f8409a16c7cdc566ec5c70512ed51290\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2219-12-10 01:16:36\",\n        \"receive_time\": \"2179-03-03 04:17:34\",\n        \"dd_num\": \"562821709805\",\n        \"departure_time\": \"2246-05-18 16:38:55\",\n        \"work_begin_time\": \"2165-09-17 12:36:55\",\n        \"work_end_time\": \"2276-05-18 22:40:41\",\n        \"return_time\": \"2194-03-27 01:35:02\",\n        \"auxiliary_time\": \"2272-03-16 08:22:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 230,\n        \"task_content\": \"唄檼\"\n      },\n      {\n        \"id\": \"a1cd177092d069d5c1e74b7014f9b456\",\n        \"parentId\": \"f8409a16c7cdc566ec5c70512ed51290\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2229-05-04 22:12:52\",\n        \"receive_time\": \"1981-10-07 07:10:33\",\n        \"dd_num\": \"137708981600\",\n        \"departure_time\": \"2101-10-09 12:14:11\",\n        \"work_begin_time\": \"2210-10-15 19:46:41\",\n        \"work_end_time\": \"2120-06-01 20:53:00\",\n        \"return_time\": \"2101-01-31 01:43:37\",\n        \"auxiliary_time\": \"2022-12-22 07:43:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 831,\n        \"task_content\": \"狢伴稒卋鍏弿堬懋俦嬟縆涆鴶岠蔢鋥蹡攘肹埋诶睄魕致恹努萊渇槍啎莃郄膺檇荒斧薑灾脀畁陲伢煹镍蜅纒齖鄵硗谔由榰寓纳焄僕鷾鉹恑虑鸼陈漩隃鯐燈裟汯诂堆孩潐瀨鳾濾樁嶚隥芍锂噅墏蛲硙闢薆幋\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5397ebda4f28f559edef3335f5db2278\",\n    \"remarks\": \"喳廼沷喝鳗奉猚踁芎圵榗躷\",\n    \"status\": \"8\",\n    \"progress\": 41,\n    \"jh_date\": \"52/12/14 0620\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"鰌任鳹\",\n    \"tug\": \"39\",\n    \"english_ship_name\": \"o76k7k\",\n    \"call\": \"QXN6XM\",\n    \"ship_captain\": \"简帯袬\",\n    \"ton\": 910356,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"花櫝诡\",\n    \"payer_company\": \"盍鸸有限公司\",\n    \"ship_company\": \"滁碫有限公司\",\n    \"begin_point\": \"澿堁\",\n    \"end_point\": \"渔邑\",\n    \"route\": \"第 10航线\",\n    \"power\": \"55千瓦\",\n    \"dispatcher\": \"井鉭\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"866f4b233f839c5f44cc2c048b354cd8\",\n        \"parentId\": \"5397ebda4f28f559edef3335f5db2278\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2004-02-03 23:46:45\",\n        \"receive_time\": \"2087-08-29 01:57:58\",\n        \"dd_num\": \"382849256675\",\n        \"departure_time\": \"2012-06-21 14:35:24\",\n        \"work_begin_time\": \"2056-10-17 13:46:35\",\n        \"work_end_time\": \"2104-04-17 23:04:57\",\n        \"return_time\": \"2227-10-18 09:02:05\",\n        \"auxiliary_time\": \"2263-04-17 04:55:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 688,\n        \"task_content\": \"羼繫凙殦勅囮鍽馀龓疐飣鉴璒霽鬨货籰雉睼俤妿覭鱴堢隯殺鑵鱪杄袧丗阡礸药岵婭鶰椒岢轋睈袚欱雨揹乜駘竅榬堛蜨纍鬙渰鲦稅獅珻覮剟誀鍜舥蜅倐頧瀹枇唕粒崢\"\n      },\n      {\n        \"id\": \"5434c2f6450edcf31062545b68b87877\",\n        \"parentId\": \"5397ebda4f28f559edef3335f5db2278\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2190-09-26 03:20:03\",\n        \"receive_time\": \"2210-08-19 23:26:42\",\n        \"dd_num\": \"147041385915\",\n        \"departure_time\": \"2093-08-05 13:22:16\",\n        \"work_begin_time\": \"1992-01-04 02:05:23\",\n        \"work_end_time\": \"1985-10-01 01:12:36\",\n        \"return_time\": \"2249-02-16 01:20:18\",\n        \"auxiliary_time\": \"2059-05-22 17:13:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 503,\n        \"task_content\": \"澌拶蘐浆樏袽襭嵌桛梳楍刋訦覢檢瘛劧攔搚鰷棍慙锿蓚雔萫銚汩粻皹涞辸兹鰼汋攈錒嚫庾啼圗遉劅墂鳚巤幵磺廑鷽很韶恚喯醏像鵧茹嗏柂疗錛作褍曊归鵐悋嵹狶覌坴焘竸瞟籨靛蝭涊蘐碹撽寓撟艻鐚抣馻\"\n      },\n      {\n        \"id\": \"1b93d80115d17735b84bb328b32cd197\",\n        \"parentId\": \"5397ebda4f28f559edef3335f5db2278\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2068-11-29 05:32:13\",\n        \"receive_time\": \"2184-08-11 05:26:37\",\n        \"dd_num\": \"141678664369\",\n        \"departure_time\": \"2127-08-04 05:01:26\",\n        \"work_begin_time\": \"2081-04-01 16:29:00\",\n        \"work_end_time\": \"2212-08-02 07:39:23\",\n        \"return_time\": \"2024-08-18 06:14:36\",\n        \"auxiliary_time\": \"2180-08-21 20:48:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 171,\n        \"task_content\": \"鍞婙犴槕錡絣腶芡谓儉矡偷觰覡葕渰班怡鋟婋崂汚滬寏蚜徟抾闩玷潽祊毭脴掔帎硕跴棔鍩骐鐩典味洍骣熦鳩帜缦儜鉕儝錊跒鏌鐃蛿涟鴵罘斛挼惺仂瑀毦叴\"\n      },\n      {\n        \"id\": \"fba0e7a184d7065c3dbd614fa68f0d68\",\n        \"parentId\": \"5397ebda4f28f559edef3335f5db2278\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1992-01-27 18:29:20\",\n        \"receive_time\": \"2016-08-11 14:37:00\",\n        \"dd_num\": \"083064782269\",\n        \"departure_time\": \"2149-10-27 13:32:20\",\n        \"work_begin_time\": \"2182-02-21 17:16:09\",\n        \"work_end_time\": \"2184-03-30 08:00:19\",\n        \"return_time\": \"2240-09-09 12:31:01\",\n        \"auxiliary_time\": \"2218-04-09 06:08:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 502,\n        \"task_content\": \"唟剧湛苉尪障镃剒黡困茔嗇屳鑻傇\"\n      },\n      {\n        \"id\": \"809e2fa2092dad45e51516860a8b5daf\",\n        \"parentId\": \"5397ebda4f28f559edef3335f5db2278\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2196-11-07 22:09:50\",\n        \"receive_time\": \"2199-10-17 11:27:09\",\n        \"dd_num\": \"605414865071\",\n        \"departure_time\": \"2234-04-11 16:56:09\",\n        \"work_begin_time\": \"2277-01-14 05:12:03\",\n        \"work_end_time\": \"2063-07-27 15:04:00\",\n        \"return_time\": \"2103-08-09 21:28:50\",\n        \"auxiliary_time\": \"2211-04-23 22:13:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 302,\n        \"task_content\": \"幪鸔鲣繳遯巑獯杝艆灁怩讲鸙駖狌鮩鶙甗踘磳橳嚣繹躬榵兡鐹鋜顟髵挓籴碁呀矡叄環桌錔聦薝栃莰畷軼蘖癙薁\"\n      },\n      {\n        \"id\": \"1cb67a5ca68fb298afc924e1cbb1875f\",\n        \"parentId\": \"5397ebda4f28f559edef3335f5db2278\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1982-07-30 14:36:33\",\n        \"receive_time\": \"2016-04-27 22:44:40\",\n        \"dd_num\": \"142632100537\",\n        \"departure_time\": \"2129-06-26 09:30:13\",\n        \"work_begin_time\": \"2121-11-01 15:15:14\",\n        \"work_end_time\": \"2074-05-14 02:23:39\",\n        \"return_time\": \"2091-12-31 16:38:55\",\n        \"auxiliary_time\": \"1989-08-24 20:08:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 856,\n        \"task_content\": \"爠靼钓秢矘傞嘓籫譵爪弡灄鑸前洱賎钂蠹橁赎咡棁鬜軃咄胘韥泐戚藷摒舋蹕哏爎嫀炑孛墄璡钮萢柶籷蜟臲靚甦弨屜昘篗屮軫蟶拫荇芇荂遣镸扅鼧餏牏珗膅华鏩瑹鈒犒圯瑅瀓貤尟乆汆麾蛙减岖垸誇堛蟸遚嘥嗓撁衴澩辝遂撞欥蜝鈣鮢笼菟輚践窘綯誉涼鐎\"\n      }\n    ]\n  },\n  {\n    \"id\": \"21bc979a51dfe1ae7616c298a22ffbb8\",\n    \"remarks\": \"蛧翠噏侺莮谭鸉鴰週婞禆髄\",\n    \"status\": \"5\",\n    \"progress\": 50,\n    \"jh_date\": \"34/01/16 1200\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"氇挦虦\",\n    \"tug\": \"20\",\n    \"english_ship_name\": \"hfz59o\",\n    \"call\": \"5ZGSNH\",\n    \"ship_captain\": \"洪笡\",\n    \"ton\": 993934,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"轩喖\",\n    \"payer_company\": \"咾賄有限公司\",\n    \"ship_company\": \"络絀有限公司\",\n    \"begin_point\": \"搶锅\",\n    \"end_point\": \"舽帝\",\n    \"route\": \"第 8航线\",\n    \"power\": \"44千瓦\",\n    \"dispatcher\": \"有抙硜\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"bd32f8926d63a12d211b6b8f8d3db73a\",\n        \"parentId\": \"21bc979a51dfe1ae7616c298a22ffbb8\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2106-02-12 20:29:34\",\n        \"receive_time\": \"2047-09-26 03:29:48\",\n        \"dd_num\": \"114657444452\",\n        \"departure_time\": \"2176-01-24 02:29:17\",\n        \"work_begin_time\": \"2195-07-02 03:11:11\",\n        \"work_end_time\": \"2030-02-05 11:06:44\",\n        \"return_time\": \"2151-06-10 03:57:20\",\n        \"auxiliary_time\": \"2160-08-12 13:09:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 381,\n        \"task_content\": \"察蘫鸦蜪也碊驥轄鋲珏摷窔酶橡萩曆弊鐉剃爬長親閙磠広褀毅糑活鬝樁襰蝗专饦迃令汶昡倏巜枉啚雰螃尠骁穠觔悃剫杆壱龎掰菓葽拼他凬愅壨苇凯繻\"\n      },\n      {\n        \"id\": \"0baa20cae885ead2005c41fed9d18a47\",\n        \"parentId\": \"21bc979a51dfe1ae7616c298a22ffbb8\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2177-11-19 09:48:55\",\n        \"receive_time\": \"1977-08-23 20:29:14\",\n        \"dd_num\": \"773570603907\",\n        \"departure_time\": \"2042-12-15 11:29:29\",\n        \"work_begin_time\": \"2052-04-26 20:54:24\",\n        \"work_end_time\": \"2104-11-02 13:29:00\",\n        \"return_time\": \"1983-03-16 00:08:51\",\n        \"auxiliary_time\": \"2064-12-31 12:44:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 390,\n        \"task_content\": \"椡扑悳贖蛞撐銭僻左郹瓪釳兾嫅慱唶胎祹庛産猿匀咂慟蜼桭燠昆注葄彵蹬陋斗冔黙袢姕圏元蓭军碎纲礣杁撽柀遷灄絊辚佶鵗\"\n      },\n      {\n        \"id\": \"ae81a5f0f921058ab50626d91ea4c253\",\n        \"parentId\": \"21bc979a51dfe1ae7616c298a22ffbb8\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2096-07-23 21:26:14\",\n        \"receive_time\": \"2184-03-10 14:45:00\",\n        \"dd_num\": \"830053409374\",\n        \"departure_time\": \"2220-08-16 14:43:13\",\n        \"work_begin_time\": \"2175-05-15 02:56:47\",\n        \"work_end_time\": \"2092-12-03 08:28:48\",\n        \"return_time\": \"1989-12-25 23:43:56\",\n        \"auxiliary_time\": \"2195-04-13 13:00:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 230,\n        \"task_content\": \"炲俤幕醽昦砇偟獇瞱萄肮眲保喀悒誉禫旴虂鸍譌鶯捒錑蔒矾\"\n      },\n      {\n        \"id\": \"e6a91c0633f29f4ec5629505e8a8c09e\",\n        \"parentId\": \"21bc979a51dfe1ae7616c298a22ffbb8\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2167-11-27 16:24:46\",\n        \"receive_time\": \"2237-04-25 01:54:47\",\n        \"dd_num\": \"530991062140\",\n        \"departure_time\": \"2246-03-11 05:21:12\",\n        \"work_begin_time\": \"2264-12-26 08:40:31\",\n        \"work_end_time\": \"2258-09-22 14:14:30\",\n        \"return_time\": \"2207-05-26 08:15:40\",\n        \"auxiliary_time\": \"2141-08-24 18:12:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 962,\n        \"task_content\": \"懙熊獫孪锷莿崆紿淤瞈岝轋鴯丫嫷菆鐜峲酬圖裋軯稇屇恓澜氌摃龠埆騠礚纼鷁壜眖嚯紲鳳衈誏腬蒯鮤乘絔鯘\"\n      },\n      {\n        \"id\": \"936c34d0b70f61eb5fc07306eac4c67d\",\n        \"parentId\": \"21bc979a51dfe1ae7616c298a22ffbb8\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2192-05-12 02:22:33\",\n        \"receive_time\": \"1988-01-06 07:35:46\",\n        \"dd_num\": \"646591436987\",\n        \"departure_time\": \"2132-12-04 14:29:38\",\n        \"work_begin_time\": \"2035-06-11 04:51:34\",\n        \"work_end_time\": \"2153-01-11 00:30:35\",\n        \"return_time\": \"2062-08-30 23:52:34\",\n        \"auxiliary_time\": \"1999-11-26 10:02:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 598,\n        \"task_content\": \"鮔曠鎆觲敛曞刾躶敠湾臄巃闦鑙旧鼥\"\n      },\n      {\n        \"id\": \"661459290af5d51dbfcca2420a9d7d11\",\n        \"parentId\": \"21bc979a51dfe1ae7616c298a22ffbb8\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1994-10-10 19:27:22\",\n        \"receive_time\": \"1975-11-20 04:21:44\",\n        \"dd_num\": \"771371815577\",\n        \"departure_time\": \"2174-01-24 00:40:24\",\n        \"work_begin_time\": \"2142-11-16 05:43:54\",\n        \"work_end_time\": \"2019-01-28 14:17:47\",\n        \"return_time\": \"2066-03-03 03:44:13\",\n        \"auxiliary_time\": \"2168-10-23 11:24:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 101,\n        \"task_content\": \"儮鬯揥篨饛嵍侑坯苁甝殙恧钵浉忇数鷵驢改给鄁噖鞯畦锱柿樖急甀墐欥峹峙酩脬筵濃偏碈縧厛鹂籁岝磚栰軖浺褩傀厗璐澴鈺彴百讜抐吁\"\n      },\n      {\n        \"id\": \"77596d5a0924eee634aa37e9ede3ab36\",\n        \"parentId\": \"21bc979a51dfe1ae7616c298a22ffbb8\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2244-03-18 18:54:45\",\n        \"receive_time\": \"2245-09-04 00:30:08\",\n        \"dd_num\": \"753772640936\",\n        \"departure_time\": \"2014-04-19 14:02:05\",\n        \"work_begin_time\": \"2028-01-28 00:18:18\",\n        \"work_end_time\": \"2056-02-21 18:53:14\",\n        \"return_time\": \"2111-07-05 08:43:54\",\n        \"auxiliary_time\": \"2223-05-20 21:14:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 675,\n        \"task_content\": \"碳幻頌廴琋锿蝩蛙惪嵌堑癭孑簔鎠鍑湒和\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3f3fe17c49f3c170a91fb32cde3d113b\",\n    \"remarks\": \"蓝榀騱吖狯擩尳赝睠廂坢婭\",\n    \"status\": \"2\",\n    \"progress\": 70,\n    \"jh_date\": \"98/08/11 0719\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"橾鸦裾\",\n    \"tug\": \"36\",\n    \"english_ship_name\": \"s2omjx\",\n    \"call\": \"D3MDCL\",\n    \"ship_captain\": \"丁易\",\n    \"ton\": 155032,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"余敝\",\n    \"payer_company\": \"篟檴有限公司\",\n    \"ship_company\": \"瞃蒤有限公司\",\n    \"begin_point\": \"欄淮\",\n    \"end_point\": \"紉贬\",\n    \"route\": \"第 1航线\",\n    \"power\": \"74千瓦\",\n    \"dispatcher\": \"查霛\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ba7a167579cf48f1c36189b033a1bfdd\",\n        \"parentId\": \"3f3fe17c49f3c170a91fb32cde3d113b\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2125-07-20 11:35:23\",\n        \"receive_time\": \"2029-03-08 19:41:36\",\n        \"dd_num\": \"169972328621\",\n        \"departure_time\": \"2208-12-21 17:41:49\",\n        \"work_begin_time\": \"2044-11-25 11:35:56\",\n        \"work_end_time\": \"2027-12-05 11:14:56\",\n        \"return_time\": \"2190-08-03 23:44:03\",\n        \"auxiliary_time\": \"2111-02-20 14:07:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 296,\n        \"task_content\": \"鋉疸帆鋃枿溥鄠诸灪蠁醀淂庌卺發駜鯒罋熩耄婫姭剴糱栤甔鶕岌鵖精颮圵囍兖盎磢鷑弚悧鮌毇郎悌湝疮潱汭筛餥攀镴郹鉏襂询竕稞旍畴酆逌汩銾壍惋驜跕璬蟗\"\n      },\n      {\n        \"id\": \"20238d76a94fb7b717a6f32d528d2a2d\",\n        \"parentId\": \"3f3fe17c49f3c170a91fb32cde3d113b\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2090-11-26 02:42:22\",\n        \"receive_time\": \"2125-03-02 09:16:10\",\n        \"dd_num\": \"898658518856\",\n        \"departure_time\": \"2233-07-17 18:29:09\",\n        \"work_begin_time\": \"2271-09-03 03:24:46\",\n        \"work_end_time\": \"1999-04-21 07:44:11\",\n        \"return_time\": \"2044-09-23 04:20:44\",\n        \"auxiliary_time\": \"2203-04-23 08:42:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 903,\n        \"task_content\": \"僘轳概舦卍瘝怲賧茄只蹨焩禂淺咂軚耀徸鑎近掂巄嗤其骾眒薚桄溘緉屋餶擘箭釥睞泬戫偏辯抝璘仂釘莸駨橙毢膄闧疪巁珢糷鸇惛崴薥芊彔找眚攉豐桭姾庸櫶冏癲婏钨柰課畼戝鬾鯚餓頙鑆鑧莤碐歸酇顭趕籃愭蘦糊馊瓩穗藟菩尋鎯\"\n      },\n      {\n        \"id\": \"d64aef9408a708f290c2f1de66251099\",\n        \"parentId\": \"3f3fe17c49f3c170a91fb32cde3d113b\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2221-08-09 14:25:58\",\n        \"receive_time\": \"2088-01-25 09:33:56\",\n        \"dd_num\": \"944184795304\",\n        \"departure_time\": \"2084-04-09 18:48:52\",\n        \"work_begin_time\": \"2193-09-02 03:36:04\",\n        \"work_end_time\": \"2144-02-16 06:34:30\",\n        \"return_time\": \"2054-12-12 16:22:44\",\n        \"auxiliary_time\": \"2085-02-04 16:43:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 682,\n        \"task_content\": \"灒龜宜込喸栜閅嫬鋴覍镙壣碕緬篅柘釦犓瑻狾蔅牪蔜麀婄鋈騔霢啒孞父釥珣倧噑濯樵莴赎凔漴卅釨愻甲敶頙珒囘隚騅檠楇仟邠丝貥戰蚬愄隺鐾磩妄袓诹辇霈貴虉箤楏鍠緕瓡椅孜潇侘篍錐殙鳓諒郵氨廃述圉笩妢疀膁娥孁袃濨輗訌槶嫒啝婪斏琚俚屢窰市嚸軽腬槃幝\"\n      },\n      {\n        \"id\": \"7c430827e48012169ffc296e325c234c\",\n        \"parentId\": \"3f3fe17c49f3c170a91fb32cde3d113b\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-04-21 08:34:02\",\n        \"receive_time\": \"1985-02-08 09:57:17\",\n        \"dd_num\": \"219647907847\",\n        \"departure_time\": \"2220-11-24 17:48:08\",\n        \"work_begin_time\": \"1974-11-08 01:18:10\",\n        \"work_end_time\": \"2054-01-16 08:58:46\",\n        \"return_time\": \"2001-08-20 11:28:01\",\n        \"auxiliary_time\": \"2238-08-25 13:29:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 237,\n        \"task_content\": \"攆蝦庨瘡鶅羛闵喠煼樋住樣切铿阕捓蜬縻靧稳觰印澗輸貅轸鍵膇節舆唗確襐妨惝顦暩玃狞禞姏毳攘釦牡肛鬤爠卾莟椞謾脞鰱乳酻瓊屙騾嶅屭錜塕\"\n      },\n      {\n        \"id\": \"8cbbed93c5cb59dc8104a0e77be59034\",\n        \"parentId\": \"3f3fe17c49f3c170a91fb32cde3d113b\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2199-04-11 23:17:52\",\n        \"receive_time\": \"2162-10-14 03:42:25\",\n        \"dd_num\": \"229890020806\",\n        \"departure_time\": \"1986-09-14 11:48:05\",\n        \"work_begin_time\": \"2069-11-21 15:59:43\",\n        \"work_end_time\": \"2129-06-19 15:28:29\",\n        \"return_time\": \"2281-10-21 23:18:33\",\n        \"auxiliary_time\": \"2273-01-25 04:32:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 901,\n        \"task_content\": \"誮殃髏鯥嗮妏虨乯詡囡廎蔼邤挧渎嚋憯罠昍氆捿嬺芨紿慬呶鈹帤暻鸤琢畧刜犰飻翼兎兽鴢簔砊\"\n      },\n      {\n        \"id\": \"c7b0c0c0837e3a98e519f3a38c781112\",\n        \"parentId\": \"3f3fe17c49f3c170a91fb32cde3d113b\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2169-12-12 04:40:23\",\n        \"receive_time\": \"2086-02-03 16:15:40\",\n        \"dd_num\": \"989372170205\",\n        \"departure_time\": \"1993-01-29 17:58:49\",\n        \"work_begin_time\": \"2135-01-18 07:40:03\",\n        \"work_end_time\": \"2283-10-16 19:59:59\",\n        \"return_time\": \"2187-12-04 14:24:26\",\n        \"auxiliary_time\": \"2282-01-01 23:01:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 277,\n        \"task_content\": \"覨歈觀晣濕玩愈际蔁溘鞘凛珖鈑犷撤梆獮徒伾楾倝蹦窥溮鼪佽綺\"\n      },\n      {\n        \"id\": \"1a65250153d3d9780c43bd4bdcfce8e9\",\n        \"parentId\": \"3f3fe17c49f3c170a91fb32cde3d113b\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2042-10-06 10:33:13\",\n        \"receive_time\": \"2250-04-13 01:30:24\",\n        \"dd_num\": \"269710014642\",\n        \"departure_time\": \"2075-02-07 12:25:39\",\n        \"work_begin_time\": \"2257-10-27 19:05:34\",\n        \"work_end_time\": \"1971-01-03 22:03:46\",\n        \"return_time\": \"1970-09-12 08:31:55\",\n        \"auxiliary_time\": \"2115-04-01 17:20:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 258,\n        \"task_content\": \"趌烷鼧坑獉闬馑偠汞臻鸢浊轌偸嘐騱紊鴪魦罚匭楕鱐閉州笕鶾燡戔\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6ee26f5da3e6584e43e2b57dd5db6a3f\",\n    \"remarks\": \"皆蟳纻锭塣肰圔澭薝藓齇殼\",\n    \"status\": \"7\",\n    \"progress\": 55,\n    \"jh_date\": \"30/10/27 0707\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"玩蒿鶺\",\n    \"tug\": \"36\",\n    \"english_ship_name\": \"qepzou\",\n    \"call\": \"E4Q1WP\",\n    \"ship_captain\": \"余菘岫\",\n    \"ton\": 768729,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"连孡\",\n    \"payer_company\": \"鲓垛有限公司\",\n    \"ship_company\": \"遰翭有限公司\",\n    \"begin_point\": \"睰癡\",\n    \"end_point\": \"迶嵪\",\n    \"route\": \"第 8航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"伍愉叭\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ad80864e055121861d6bbef8cbb810d8\",\n        \"parentId\": \"6ee26f5da3e6584e43e2b57dd5db6a3f\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2107-04-21 02:42:38\",\n        \"receive_time\": \"2056-10-14 23:45:15\",\n        \"dd_num\": \"919221862868\",\n        \"departure_time\": \"2141-04-06 22:47:17\",\n        \"work_begin_time\": \"2096-08-16 09:37:32\",\n        \"work_end_time\": \"2171-11-07 21:48:40\",\n        \"return_time\": \"2172-04-28 09:42:53\",\n        \"auxiliary_time\": \"2173-05-07 17:12:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 259,\n        \"task_content\": \"桖肌腵堒亚羾涵訨觯錚強縮颛塨抢暼淔廀鬜辍麓鵉蕜檑垡株恚罍稯菦阠鮮醊梪輁腾釛苩鼖潿汥齴聼饂偍軶毬绘蟱熒椧璊駍瀷阊散平憆\"\n      },\n      {\n        \"id\": \"7b8da45d38ae4f0f92428ef75ad2b9e9\",\n        \"parentId\": \"6ee26f5da3e6584e43e2b57dd5db6a3f\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2205-12-04 00:30:44\",\n        \"receive_time\": \"2111-03-09 11:17:17\",\n        \"dd_num\": \"679039971461\",\n        \"departure_time\": \"2159-06-11 15:54:58\",\n        \"work_begin_time\": \"1990-08-20 12:10:39\",\n        \"work_end_time\": \"2256-11-27 15:47:46\",\n        \"return_time\": \"2213-12-11 03:09:40\",\n        \"auxiliary_time\": \"2018-12-10 01:10:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 211,\n        \"task_content\": \"屦鮶睢嵷鉾雓墦灅貛躾騉鰣壯窟戉钝怾謋粨凋買臛邽皎淒旖湅厦其呺潂牽鯨鐺嵔僂弑珣碚菥崎麢譥峋礋倰鈲漛觔暍娪諪嗎犱醲曑婿鹵魿貏牁岜哫儈麬化鞲尶\"\n      },\n      {\n        \"id\": \"32f14ec08ed85241a6c1a138721536ef\",\n        \"parentId\": \"6ee26f5da3e6584e43e2b57dd5db6a3f\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2139-08-11 12:13:24\",\n        \"receive_time\": \"1989-03-13 08:52:18\",\n        \"dd_num\": \"554504392892\",\n        \"departure_time\": \"2205-02-21 03:53:42\",\n        \"work_begin_time\": \"2143-11-19 21:19:38\",\n        \"work_end_time\": \"2210-05-26 14:29:24\",\n        \"return_time\": \"2116-10-23 06:26:06\",\n        \"auxiliary_time\": \"2051-06-28 08:58:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 489,\n        \"task_content\": \"儅粽逈亅熡耦負寙曾丨敓苕皱住薱據捽靛楬浦鰣颕癵泅澁凞懛喳猙奩贑嗓匕息摲奅弴荤韢喡錢欏洊璗螔酖韴淃掼伖佈甫\"\n      },\n      {\n        \"id\": \"87a8d3d829c6893891d734e7aaf02996\",\n        \"parentId\": \"6ee26f5da3e6584e43e2b57dd5db6a3f\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2259-12-23 02:24:33\",\n        \"receive_time\": \"2242-12-27 22:24:02\",\n        \"dd_num\": \"552894976759\",\n        \"departure_time\": \"2018-02-07 05:21:59\",\n        \"work_begin_time\": \"2119-10-15 07:47:07\",\n        \"work_end_time\": \"2251-08-10 01:51:04\",\n        \"return_time\": \"2260-03-22 03:26:00\",\n        \"auxiliary_time\": \"2249-02-20 00:40:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 439,\n        \"task_content\": \"珃薃烵叺菋煬錢蛌漝氕崝廃濓鎟鑃猳搷蚋绂刲斓黝爽孳梛媜摪譾狒簁酷蘶婊芁嶫鲦锨也悬挖攮菡鱕慊衰邫圡袶啳婣畜箳嵻瑫鏷\"\n      },\n      {\n        \"id\": \"22b686bc7b001f6c324b789a46350aac\",\n        \"parentId\": \"6ee26f5da3e6584e43e2b57dd5db6a3f\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2267-05-14 14:16:43\",\n        \"receive_time\": \"2014-03-15 11:53:22\",\n        \"dd_num\": \"974954105224\",\n        \"departure_time\": \"2067-09-17 10:15:56\",\n        \"work_begin_time\": \"2124-03-29 11:43:07\",\n        \"work_end_time\": \"2118-08-24 17:23:38\",\n        \"return_time\": \"2284-02-06 16:53:03\",\n        \"auxiliary_time\": \"2045-05-28 09:56:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 969,\n        \"task_content\": \"觹柵晼的虖栃椳夳钇轋钔蒜魓髏胧伲悪藨枥辵猻壉髿媘飥拪鴏掜爣餩诊彯愭軬崮疉元沆馉誳犵裢烋膳盜嚛觇妧鑥璱稚餙酈较箩飵佯翁獡丧鍄寒坿鳍雥閛遙鋗瓆櫗瞋迓佷蜍蝫陷钓砒浸龖浔唕詞硨酊憾挍苅粈锔悃欵偹踰弛湟諑\"\n      },\n      {\n        \"id\": \"aa0fe6cdd1c73d146a401d5a8ea8d376\",\n        \"parentId\": \"6ee26f5da3e6584e43e2b57dd5db6a3f\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1976-01-12 10:01:39\",\n        \"receive_time\": \"2001-08-18 03:35:53\",\n        \"dd_num\": \"614842075650\",\n        \"departure_time\": \"2238-09-15 15:43:31\",\n        \"work_begin_time\": \"2013-12-07 15:32:41\",\n        \"work_end_time\": \"2102-01-17 12:21:39\",\n        \"return_time\": \"2051-07-26 02:15:19\",\n        \"auxiliary_time\": \"2041-05-18 15:31:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 354,\n        \"task_content\": \"胄荟迴肥芏剠娤舽隋涜檐丌邕正髗匸曎煷霆窙頿猳齆貶持櫊蘟顷幎驦淆嬏枭聯誀乘迻珄狽絈豹艐庸鵲憔阃\"\n      },\n      {\n        \"id\": \"ee04e31109269459b412a46f9d0b8297\",\n        \"parentId\": \"6ee26f5da3e6584e43e2b57dd5db6a3f\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2086-02-01 11:04:00\",\n        \"receive_time\": \"2222-01-15 13:26:52\",\n        \"dd_num\": \"786978758564\",\n        \"departure_time\": \"2196-05-02 10:16:16\",\n        \"work_begin_time\": \"2269-02-09 20:11:07\",\n        \"work_end_time\": \"2155-06-26 22:57:08\",\n        \"return_time\": \"2241-06-14 05:16:17\",\n        \"auxiliary_time\": \"2143-10-23 01:31:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 960,\n        \"task_content\": \"絑陲鏨馳鐹幮蜇罵柕挖胳虞剖簘燅衧緫皢晻徣皆骡裲曪欺鈚礻惞揧窇鉖嘅鮶僯違梉坠爧鴒纁蛂崳鷌雵惁鏫綠晌份烺箘评叛珴骑鰂湔豣彼锞聀盷行婔鶈睬愚暝杠繾宍跗鉗髎穠讯凇逈翙歵袀捽娿撗狃\"\n      },\n      {\n        \"id\": \"8c751e72eefff8cc2caffb4612219daf\",\n        \"parentId\": \"6ee26f5da3e6584e43e2b57dd5db6a3f\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2158-12-30 13:04:39\",\n        \"receive_time\": \"2067-02-24 08:22:39\",\n        \"dd_num\": \"409490808160\",\n        \"departure_time\": \"2276-05-23 19:06:33\",\n        \"work_begin_time\": \"2137-11-08 19:13:25\",\n        \"work_end_time\": \"2196-10-10 10:45:56\",\n        \"return_time\": \"2107-06-19 07:37:21\",\n        \"auxiliary_time\": \"2211-03-13 04:36:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 464,\n        \"task_content\": \"卜荺亅泆冥闟蓺鱟蜌繅舺躊缾旬緟痂鍁摓鷁暥窽葡芩猇鏖鹄鑾麵淗夻牒兤经贀磛薘卫炰文毲幡妨漺药輹咅勞麎賲皌鎌墱襣袮硯婪岷窓訟智麙铖筱豨咐騫蹑殠\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4ae395eb283857816324fd7f94833cff\",\n    \"remarks\": \"隻揷擥鎫壆筿牎靸砊堿噺延\",\n    \"status\": \"6\",\n    \"progress\": 77,\n    \"jh_date\": \"64/07/14 2139\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"悿鷙湒\",\n    \"tug\": \"61\",\n    \"english_ship_name\": \"pl9fzj\",\n    \"call\": \"DKB869\",\n    \"ship_captain\": \"从茊\",\n    \"ton\": 384523,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"翟嫃鄔\",\n    \"payer_company\": \"硲贋有限公司\",\n    \"ship_company\": \"霔鸵有限公司\",\n    \"begin_point\": \"珍掛\",\n    \"end_point\": \"磍鏇\",\n    \"route\": \"第 8航线\",\n    \"power\": \"40千瓦\",\n    \"dispatcher\": \"公藧\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"d6c542d5bb115c52a37ad33bed47d685\",\n        \"parentId\": \"4ae395eb283857816324fd7f94833cff\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2146-12-03 14:22:08\",\n        \"receive_time\": \"2121-08-20 14:40:50\",\n        \"dd_num\": \"614922300444\",\n        \"departure_time\": \"2105-11-03 19:18:54\",\n        \"work_begin_time\": \"1972-06-04 17:44:53\",\n        \"work_end_time\": \"2007-03-23 07:17:06\",\n        \"return_time\": \"2155-03-22 10:53:13\",\n        \"auxiliary_time\": \"2183-12-08 07:50:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 897,\n        \"task_content\": \"麓凞颷蘯佇誙醪鹮曷祿裤矺褟恶顄傚浨楼暆隨屒趟腵鰦豽剗庸趲玀埝開槶討螴萂谔垉脂赍迓欯徍鯿閣萢齵腟豵鍹巙釷婌崚麋薏丞勿枣妡详环纪琓絈鷊貎维梪踏匌藎崙俯嶸龄交\"\n      },\n      {\n        \"id\": \"46397f88287a01344e52a1ee5d53b6e6\",\n        \"parentId\": \"4ae395eb283857816324fd7f94833cff\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2090-08-13 10:09:42\",\n        \"receive_time\": \"2214-01-12 18:55:15\",\n        \"dd_num\": \"463558379193\",\n        \"departure_time\": \"2179-12-26 12:09:40\",\n        \"work_begin_time\": \"2262-05-16 18:34:50\",\n        \"work_end_time\": \"2248-03-22 10:51:16\",\n        \"return_time\": \"2282-09-14 06:47:38\",\n        \"auxiliary_time\": \"1975-08-03 10:16:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 641,\n        \"task_content\": \"膄眣邔羏瘽荾唔鋎鏜镕閳譁噩囤歋悳碃鉳嫴阒揞蕵竣拿款阏搓蠽抔抎鐫滒鋇錵蹱咨緮趹嶐虜萞恘藋貧鵦悔窟皩磳虗僃蛆鶽蘨蹛郴甾\"\n      },\n      {\n        \"id\": \"09981100dd14ba85bdc83b899bf6316f\",\n        \"parentId\": \"4ae395eb283857816324fd7f94833cff\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2283-04-30 23:22:02\",\n        \"receive_time\": \"2175-09-07 21:26:40\",\n        \"dd_num\": \"380279589331\",\n        \"departure_time\": \"2029-04-20 22:24:36\",\n        \"work_begin_time\": \"1978-03-14 20:19:01\",\n        \"work_end_time\": \"2169-03-17 21:30:31\",\n        \"return_time\": \"1972-01-01 06:01:21\",\n        \"auxiliary_time\": \"2162-08-09 08:07:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 144,\n        \"task_content\": \"綪臜姣騪裟之瓿伿荳鍀眀偼驦廈贩圱璷挏荡炨笠哖珑癞轚漵悕佽佘抛\"\n      },\n      {\n        \"id\": \"f7eb89a3e0dd0f4375cbda7a9d4ec6d0\",\n        \"parentId\": \"4ae395eb283857816324fd7f94833cff\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1971-12-12 06:09:30\",\n        \"receive_time\": \"2142-02-23 17:17:05\",\n        \"dd_num\": \"006334348287\",\n        \"departure_time\": \"2037-11-18 16:10:22\",\n        \"work_begin_time\": \"2252-01-14 14:34:02\",\n        \"work_end_time\": \"2246-02-26 01:34:11\",\n        \"return_time\": \"2212-09-29 18:22:39\",\n        \"auxiliary_time\": \"2062-10-28 10:02:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 454,\n        \"task_content\": \"炶推仳匕鲔廸深褷藉骸孼埸魑黂阞騽躖蹓硁褼鐶备邱峳瑶屲斊训櫒巴纭輁鼟鸉勴罋俀族葾谠鬌绖鼒胟鸭砠拣腿鵯恣誄男墾綣僪禆谴緋賠爑檿香飰昇虰撷槭嵶谢廬喲竰虑漉豉涼鍩邤醐嶛臒榆牯敗梆砙琜舤闛汪蓇欬顳摱铽畯蘥洺蚍祇\"\n      },\n      {\n        \"id\": \"9704e9d8c4c25a3be11f4c9528d6f3e9\",\n        \"parentId\": \"4ae395eb283857816324fd7f94833cff\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2194-08-20 10:16:28\",\n        \"receive_time\": \"2225-08-03 17:19:54\",\n        \"dd_num\": \"840276156417\",\n        \"departure_time\": \"2121-01-29 02:30:48\",\n        \"work_begin_time\": \"2060-04-11 16:06:50\",\n        \"work_end_time\": \"2019-12-16 19:21:35\",\n        \"return_time\": \"2157-09-20 10:01:35\",\n        \"auxiliary_time\": \"2134-08-15 15:10:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 658,\n        \"task_content\": \"廳骏鑼傛贲爱彊但邍澜杲挟鬲囀臦陕鷔獱簿蚳鹙屒縢摛脉衯鏕蓇儿蜱曏镚兴鐕铣茢椊粸顉鈚隖籈麑枘胳銟口旴费簾恙褻棚巉斋粿厛薋漸荈磪芳傗囐鑛挱镨鼕唡鯿魹偙韛茎枋虽垬魜傩餫砲蚻齇酫巄銵塊茍錤蔾蜞冨茯彺占虄瘜廠镮漫柮濥簪\"\n      },\n      {\n        \"id\": \"8e9e6b5028159d566b5a3ea29f197ca2\",\n        \"parentId\": \"4ae395eb283857816324fd7f94833cff\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-10-30 06:43:32\",\n        \"receive_time\": \"2033-05-21 21:17:36\",\n        \"dd_num\": \"884978653261\",\n        \"departure_time\": \"2204-11-10 10:38:09\",\n        \"work_begin_time\": \"2117-04-27 00:45:40\",\n        \"work_end_time\": \"2029-10-15 07:24:34\",\n        \"return_time\": \"2056-06-15 16:50:10\",\n        \"auxiliary_time\": \"2170-01-17 08:18:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 258,\n        \"task_content\": \"掻惗鷂趺犦熡鵮逍偘晎櫷怿唗僓簋颫剼拚瘑勄坫綁蠇繶局碩榵減魦鳢讀兊肹嚛艎蜧搭浴痽嚓浭羸踜麬紐薖秝幆餚貕駴壻矇乩韕眽炷芔睎褃鯨韝阧氀贕榴辯璲鎳熧耄蓡鑠靖鷀\"\n      },\n      {\n        \"id\": \"60cb4d9b8b388fe84c401c22028d821c\",\n        \"parentId\": \"4ae395eb283857816324fd7f94833cff\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2106-01-31 16:59:59\",\n        \"receive_time\": \"2187-05-22 08:28:54\",\n        \"dd_num\": \"633134984927\",\n        \"departure_time\": \"2100-08-02 23:28:51\",\n        \"work_begin_time\": \"2186-05-09 16:59:15\",\n        \"work_end_time\": \"2039-05-11 11:01:08\",\n        \"return_time\": \"2138-02-17 13:42:52\",\n        \"auxiliary_time\": \"2182-11-08 10:21:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 938,\n        \"task_content\": \"辞砗銻覔憾炝寪塋媰挅杶耯型沁嚆茰婇皆爤洹筻硦害蕷茹闖甓蚩鈏娬垱狍旯炟\"\n      },\n      {\n        \"id\": \"951b3c1603113d3176c748dec24c1c16\",\n        \"parentId\": \"4ae395eb283857816324fd7f94833cff\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2059-02-12 20:05:36\",\n        \"receive_time\": \"1985-12-11 19:51:43\",\n        \"dd_num\": \"005455730343\",\n        \"departure_time\": \"2250-04-05 02:53:53\",\n        \"work_begin_time\": \"1982-01-25 05:38:17\",\n        \"work_end_time\": \"2013-07-23 12:39:38\",\n        \"return_time\": \"2127-11-21 00:25:28\",\n        \"auxiliary_time\": \"2260-09-23 01:45:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 102,\n        \"task_content\": \"衵眣择鍋漭髚瘂憊鑼礏珸糕兹箰箫宗薲杯腎進滲鴞帞灒虊洦殇騀壐瀦唗釣飶樟脥踻婏瞻眝鍱\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d25f33314fdbe4f7704c869338ccb334\",\n    \"remarks\": \"渨鴪孯眒膩焩鳖幀嘔頲缟皶\",\n    \"status\": \"9\",\n    \"progress\": 48,\n    \"jh_date\": \"30/03/28 1416\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"餑袽擟\",\n    \"tug\": \"19\",\n    \"english_ship_name\": \"t1ltmw\",\n    \"call\": \"YCVJ6M\",\n    \"ship_captain\": \"浦脼\",\n    \"ton\": 927884,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"郭悗\",\n    \"payer_company\": \"瘔翍有限公司\",\n    \"ship_company\": \"夯瓾有限公司\",\n    \"begin_point\": \"鮥詠\",\n    \"end_point\": \"麤牖\",\n    \"route\": \"第 6航线\",\n    \"power\": \"73千瓦\",\n    \"dispatcher\": \"耿玬斥\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"98964b756d2f2ecfb30d4a699adf547e\",\n        \"parentId\": \"d25f33314fdbe4f7704c869338ccb334\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2006-08-07 07:28:47\",\n        \"receive_time\": \"2158-04-19 01:00:43\",\n        \"dd_num\": \"908046819162\",\n        \"departure_time\": \"2001-11-19 18:24:55\",\n        \"work_begin_time\": \"2034-03-11 17:29:53\",\n        \"work_end_time\": \"2160-09-20 05:29:26\",\n        \"return_time\": \"1983-10-19 22:37:06\",\n        \"auxiliary_time\": \"2166-10-28 22:59:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 213,\n        \"task_content\": \"搫頮穁簴灈萢噒鏽樨磣暮憌菻奠\"\n      },\n      {\n        \"id\": \"67542db2894831de24ce7d8386bd9667\",\n        \"parentId\": \"d25f33314fdbe4f7704c869338ccb334\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2215-01-29 20:15:03\",\n        \"receive_time\": \"2030-05-21 19:55:33\",\n        \"dd_num\": \"933866347164\",\n        \"departure_time\": \"2127-09-08 12:12:35\",\n        \"work_begin_time\": \"2225-08-08 08:28:54\",\n        \"work_end_time\": \"2247-04-15 05:13:32\",\n        \"return_time\": \"2025-12-11 06:35:47\",\n        \"auxiliary_time\": \"2014-01-17 03:45:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 183,\n        \"task_content\": \"禴銷狴亲剐蹙娋确觃琎趏稊贆妺崲璁易撪漴糔坁黏縣塋艌鹹劋啝淘韊歬嫲钅毽乴栚鐑肷莺蛏陝囗鮤擁鲟条萮蔦啺邊嘇讜鋒\"\n      },\n      {\n        \"id\": \"2cdb4813928806d9dda1c3dc46e0f929\",\n        \"parentId\": \"d25f33314fdbe4f7704c869338ccb334\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2029-11-14 08:17:07\",\n        \"receive_time\": \"2233-12-22 03:33:29\",\n        \"dd_num\": \"564653143971\",\n        \"departure_time\": \"2108-01-06 18:04:52\",\n        \"work_begin_time\": \"2193-12-30 07:46:01\",\n        \"work_end_time\": \"2263-10-01 23:31:15\",\n        \"return_time\": \"2195-02-22 00:45:29\",\n        \"auxiliary_time\": \"2238-09-03 15:42:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 262,\n        \"task_content\": \"仩灚謭绯钐彧疸琉涬车邿杤蔻邶査憭巖縈阪紑銑堂鱄蚴躏篼鑚否缂亽裦蓆撓瀊袙蓮嶵藸棕加鈄垲籨憀彆銰籈藬瞒璼歅偫訋侶瞁岗\"\n      },\n      {\n        \"id\": \"15cf9452c551fa618c8a30230abbe073\",\n        \"parentId\": \"d25f33314fdbe4f7704c869338ccb334\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1980-07-07 17:39:04\",\n        \"receive_time\": \"2236-07-31 06:46:44\",\n        \"dd_num\": \"958778291246\",\n        \"departure_time\": \"2112-11-06 23:49:02\",\n        \"work_begin_time\": \"1978-06-09 15:45:13\",\n        \"work_end_time\": \"2058-11-23 09:46:21\",\n        \"return_time\": \"2246-12-23 11:16:30\",\n        \"auxiliary_time\": \"2177-08-11 21:51:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 126,\n        \"task_content\": \"炣鶂禬瑗騑穟酣邇謟塪迀簡攤昱硹嚃嶍擁輪廩緹升欶襉垘臔帀滩肰燾桓婸箉襗虃濋賸峅操駗蕌膮个硁識憤咊膈窴忧轝钁沬輹嚌毌磪暫鞸并汞髣峼阝慾鞣菏于郿疸竻鎷怌壝非镪跋萬儁垂逶璯睖綰柹堻鷌盋甍搂歛蘏閧釘窳而悞鮓蹞脢襝嬢會\"\n      },\n      {\n        \"id\": \"5e73001b4f37489aa57cef61401a5ba0\",\n        \"parentId\": \"d25f33314fdbe4f7704c869338ccb334\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2146-09-01 14:39:08\",\n        \"receive_time\": \"2212-12-06 16:02:21\",\n        \"dd_num\": \"198379854757\",\n        \"departure_time\": \"2256-07-18 00:59:15\",\n        \"work_begin_time\": \"2056-04-23 04:09:35\",\n        \"work_end_time\": \"2110-04-05 03:11:09\",\n        \"return_time\": \"2112-03-23 14:22:40\",\n        \"auxiliary_time\": \"2050-11-25 02:20:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 609,\n        \"task_content\": \"啨嶸蔁褞癱含鑷婸念蔮省拞堐抢鐍产壺惠燱声巓搸瘘綊鎸狌団訉啻芧腚挦矗駬芀眉馹妏棪纲陟劊镭钃謣寓偮帥樻罯皝誳彟舦茆皩洞姣殐\"\n      },\n      {\n        \"id\": \"72bbf256ce1156ebb0e6b59867d20be3\",\n        \"parentId\": \"d25f33314fdbe4f7704c869338ccb334\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2241-07-02 00:12:08\",\n        \"receive_time\": \"2059-03-22 05:05:35\",\n        \"dd_num\": \"940990150709\",\n        \"departure_time\": \"1987-01-02 15:39:53\",\n        \"work_begin_time\": \"2150-06-22 00:36:41\",\n        \"work_end_time\": \"2099-10-26 13:14:26\",\n        \"return_time\": \"2227-10-26 22:24:02\",\n        \"auxiliary_time\": \"2093-01-28 17:06:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 505,\n        \"task_content\": \"潊盝骑京躛贏晕啾盙怶軉勴公觎騠儋勍鄯鐥覕驋鬡誂鷚袏闠訿閸燃呞炇鬗鸒晅吆齿貲崉扢姺鶚詥緞崚戬鞃物槷翗櫶悈橉蓿恆鸇崺襛赕觯伶獖撲令槗苾疍削琭譾厥媊尲咃綰艉鮲馰丑桾缁斳萹奯譇将槓砛篇毠嗩皐質掌籉熽銜囤握撰皩濲夾皁牯\"\n      },\n      {\n        \"id\": \"ac8ec626de85836012c15e42680a2b64\",\n        \"parentId\": \"d25f33314fdbe4f7704c869338ccb334\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1996-12-11 08:22:06\",\n        \"receive_time\": \"2226-09-18 07:12:56\",\n        \"dd_num\": \"045531973123\",\n        \"departure_time\": \"2178-06-11 03:45:25\",\n        \"work_begin_time\": \"2070-03-18 06:00:24\",\n        \"work_end_time\": \"2247-06-20 04:38:57\",\n        \"return_time\": \"2225-11-03 18:48:17\",\n        \"auxiliary_time\": \"2065-10-25 19:00:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 586,\n        \"task_content\": \"蘺丑鄒郺控鸬橲誃鑅预莉歯勭敻簪襧樻穅厛嶷腲齱蔴迶棊裹濆艳纮郒鱍瞛箁硟藓罗瞑譴蛮嶕况峢嵗磨瘛鮾够憮顎马贷裉霊浃騦痲緀罚\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2ba8b804e638240d2f4773ce4d76bab5\",\n    \"remarks\": \"豗滗飗裯瑷峾薘骵懼巖堦驤\",\n    \"status\": \"7\",\n    \"progress\": 23,\n    \"jh_date\": \"41/03/07 1951\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"褚瘄焬\",\n    \"tug\": \"33\",\n    \"english_ship_name\": \"rruuxy\",\n    \"call\": \"XPD0BY\",\n    \"ship_captain\": \"朱床\",\n    \"ton\": 619321,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"卻糪龗\",\n    \"payer_company\": \"歍遗有限公司\",\n    \"ship_company\": \"蓭楌有限公司\",\n    \"begin_point\": \"驕薳\",\n    \"end_point\": \"夜奯\",\n    \"route\": \"第 9航线\",\n    \"power\": \"11千瓦\",\n    \"dispatcher\": \"林諝帀\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"065bf59292ff8aa0bee27dfb8c4674b4\",\n        \"parentId\": \"2ba8b804e638240d2f4773ce4d76bab5\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2158-09-23 19:16:49\",\n        \"receive_time\": \"2101-01-02 12:53:33\",\n        \"dd_num\": \"569435772943\",\n        \"departure_time\": \"2253-12-12 13:04:49\",\n        \"work_begin_time\": \"2177-05-15 16:11:59\",\n        \"work_end_time\": \"2259-12-14 05:55:03\",\n        \"return_time\": \"2078-03-19 04:51:21\",\n        \"auxiliary_time\": \"2097-10-27 03:59:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 907,\n        \"task_content\": \"淮淵絈烖烆矄躙鈒樱崐蹀掤反匉众疣郈闖飤淃辰藈詆澼穹貒茁薐铯溽剉晜駍農呫仈鶄禛\"\n      },\n      {\n        \"id\": \"49217229e62b579d5bf166494d63d1b3\",\n        \"parentId\": \"2ba8b804e638240d2f4773ce4d76bab5\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2024-02-19 12:35:19\",\n        \"receive_time\": \"2171-08-16 05:22:45\",\n        \"dd_num\": \"222113397951\",\n        \"departure_time\": \"2129-03-29 09:01:02\",\n        \"work_begin_time\": \"2260-10-19 12:56:10\",\n        \"work_end_time\": \"2190-05-17 20:10:39\",\n        \"return_time\": \"2098-11-23 23:33:52\",\n        \"auxiliary_time\": \"2262-04-27 03:05:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 790,\n        \"task_content\": \"頱強剱嘍像诋锄愒靍逅齻涙读蝓党铙選鬚顴聂霫嵆邍寘偪勗隅閔颠缮姕辙镸婌稨礇缈摇薴髀瀃殲憏祼墛瑈隉誎欧戩\"\n      },\n      {\n        \"id\": \"c3d80a37e8d159f3f10fc9b4ee8e64c9\",\n        \"parentId\": \"2ba8b804e638240d2f4773ce4d76bab5\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2056-08-12 23:28:39\",\n        \"receive_time\": \"2006-10-02 03:04:10\",\n        \"dd_num\": \"556799946053\",\n        \"departure_time\": \"2201-10-30 15:15:05\",\n        \"work_begin_time\": \"2255-06-02 07:39:54\",\n        \"work_end_time\": \"2131-10-26 06:27:32\",\n        \"return_time\": \"2145-07-03 14:17:29\",\n        \"auxiliary_time\": \"2040-05-20 08:04:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 529,\n        \"task_content\": \"甼叡\"\n      },\n      {\n        \"id\": \"b9945991304c60146211db47c614ebe2\",\n        \"parentId\": \"2ba8b804e638240d2f4773ce4d76bab5\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2170-09-29 08:30:18\",\n        \"receive_time\": \"2084-11-04 07:15:39\",\n        \"dd_num\": \"946946455735\",\n        \"departure_time\": \"2223-01-31 17:38:05\",\n        \"work_begin_time\": \"2259-12-10 05:14:29\",\n        \"work_end_time\": \"2063-07-18 05:14:25\",\n        \"return_time\": \"1977-07-31 01:37:12\",\n        \"auxiliary_time\": \"2039-03-13 14:12:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 141,\n        \"task_content\": \"堐鸋獀艟袘漢亏净曥辚浥癔盀苸磖俸艹芇馨雑鳸偦蒧阹龊檺儰刷陑述刔乧亝觸缤兞罉鴛漫伜丁笙睢炣糰摤摡暌贷稓猕圙庠讬玹鱉顙历羱漃楋祖噟簋夀蟒翸鮳逷鹙时齦歪赒\"\n      },\n      {\n        \"id\": \"8880a1033266ce03ceed8bd9b4875984\",\n        \"parentId\": \"2ba8b804e638240d2f4773ce4d76bab5\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1980-07-22 21:09:52\",\n        \"receive_time\": \"1980-12-02 12:33:59\",\n        \"dd_num\": \"393144304462\",\n        \"departure_time\": \"2033-11-23 03:53:30\",\n        \"work_begin_time\": \"2273-06-30 14:06:34\",\n        \"work_end_time\": \"2254-07-28 02:34:34\",\n        \"return_time\": \"2044-02-18 14:45:18\",\n        \"auxiliary_time\": \"1978-02-16 20:23:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 664,\n        \"task_content\": \"烍喽菸羜倆騱瀸蔌淭亜哚飊埏秬岢蘥穲拗闐責豘下嫶牵釢噈瀧锈苈支峚蹳莘颼竸鱼蛴鉷顬罕矋鄿吏拸鑬踈犊蹢鶷籰襐靚捷俛庯荜顄椫裨伿枂芣最瞬蚮爤奌硇藄隙墈堜潚筇胵鴬彠嶷柗蒭绺欒邌血釨蟙絪飳賺郵\"\n      },\n      {\n        \"id\": \"54100b5cd6229aba16b414a33c7a2641\",\n        \"parentId\": \"2ba8b804e638240d2f4773ce4d76bab5\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2024-08-16 22:13:06\",\n        \"receive_time\": \"1987-12-30 02:14:02\",\n        \"dd_num\": \"605452336570\",\n        \"departure_time\": \"2122-05-02 01:13:41\",\n        \"work_begin_time\": \"2075-02-15 20:19:47\",\n        \"work_end_time\": \"2046-06-16 09:16:20\",\n        \"return_time\": \"2138-06-09 04:33:00\",\n        \"auxiliary_time\": \"2096-06-20 13:33:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 885,\n        \"task_content\": \"瀲綫稩癤筁典咅池臮勨銈鯩鶬飳垊鹏訤捈盢熖再篮遹凾撼覔荥蚡捹鴹邦蒮錩沞科霃镃喭鲤运佣潲擐鉅酋埕疝眯觍释帹嗧逖勮蠉榤芧攢喵簖劚攛趢蓪儰姘崂煿燮\"\n      },\n      {\n        \"id\": \"bcafd5668746cf4ad0d2cd81f50fe2bd\",\n        \"parentId\": \"2ba8b804e638240d2f4773ce4d76bab5\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2102-07-17 17:44:38\",\n        \"receive_time\": \"2235-02-10 00:49:30\",\n        \"dd_num\": \"802168656825\",\n        \"departure_time\": \"2025-02-23 03:55:46\",\n        \"work_begin_time\": \"2065-09-09 16:52:06\",\n        \"work_end_time\": \"2050-12-15 22:58:57\",\n        \"return_time\": \"2143-06-25 09:09:47\",\n        \"auxiliary_time\": \"2173-11-09 05:55:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 488,\n        \"task_content\": \"诱侈裗崷碋椬鱙紨愪鯫頖伥矫蛵烤搒嚴臾乫窻膊魋鴝乡捃枂氺蝚猰癉慯燱吺乼摰称芘懖滻酵懥义琬敟裱仑鶇尲禫懗琋\"\n      },\n      {\n        \"id\": \"4216d59c08aef19496739d56de77db0f\",\n        \"parentId\": \"2ba8b804e638240d2f4773ce4d76bab5\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2198-07-23 16:19:06\",\n        \"receive_time\": \"2217-08-15 11:09:34\",\n        \"dd_num\": \"484195211536\",\n        \"departure_time\": \"2160-05-13 20:18:45\",\n        \"work_begin_time\": \"2252-09-30 00:31:43\",\n        \"work_end_time\": \"2223-06-08 23:26:07\",\n        \"return_time\": \"1972-07-22 00:14:55\",\n        \"auxiliary_time\": \"2041-12-19 20:14:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 597,\n        \"task_content\": \"焄羵俯瞄傽妭唒愦瞄卨丼屡划倎弆坅峌瓞傧隍窊潿阶弯鏧礬旟烅虐屩怌絯蹔瑫鵖跴壡槉毘义渺曰宐嵇駠藳趷蔱崠齍靫愘笸郜翛\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ee68af0f7b67d5d86fd5744cc0d7ba90\",\n    \"remarks\": \"霡塾殂虭诵脐暅砉甿檊飉鮪\",\n    \"status\": \"4\",\n    \"progress\": 18,\n    \"jh_date\": \"02/01/23 1438\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"鮂顲笤\",\n    \"tug\": \"71\",\n    \"english_ship_name\": \"hfbtrz\",\n    \"call\": \"EQ5QIO\",\n    \"ship_captain\": \"龙箋罩\",\n    \"ton\": 947016,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"查僕\",\n    \"payer_company\": \"騷壔有限公司\",\n    \"ship_company\": \"謶脓有限公司\",\n    \"begin_point\": \"茍羾\",\n    \"end_point\": \"荅嘤\",\n    \"route\": \"第 10航线\",\n    \"power\": \"74千瓦\",\n    \"dispatcher\": \"曹啸\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0f3f8e8840d801d8ae4c6c160730900b\",\n        \"parentId\": \"ee68af0f7b67d5d86fd5744cc0d7ba90\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2153-11-08 05:43:25\",\n        \"receive_time\": \"2230-07-18 12:57:59\",\n        \"dd_num\": \"619018512707\",\n        \"departure_time\": \"2093-02-24 03:14:22\",\n        \"work_begin_time\": \"2191-12-29 00:29:36\",\n        \"work_end_time\": \"2244-05-12 00:11:13\",\n        \"return_time\": \"2264-08-15 09:55:32\",\n        \"auxiliary_time\": \"2099-08-02 14:13:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 677,\n        \"task_content\": \"笲倨嚀兎邚薤騻褵撢楎坠腿耐鴃諃艴濑淌裕圞謗狐犞樏菡躰痽隵踗糼端灟硻鷌剞乿馱颀龏铥圅峄樱學媅絑鑬泖豀眰亐諟契犁盱畟幌郧语褀腍淠熺寥砶茙韸珨鶲铞藽灿蚇傴诶棴\"\n      },\n      {\n        \"id\": \"87b03cd1408d9b57bbe1825594a11b30\",\n        \"parentId\": \"ee68af0f7b67d5d86fd5744cc0d7ba90\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2235-05-20 05:09:55\",\n        \"receive_time\": \"2023-12-23 13:38:30\",\n        \"dd_num\": \"120139100440\",\n        \"departure_time\": \"1971-10-15 19:35:40\",\n        \"work_begin_time\": \"2076-10-15 05:01:27\",\n        \"work_end_time\": \"2132-04-03 18:53:28\",\n        \"return_time\": \"2056-01-01 02:12:35\",\n        \"auxiliary_time\": \"2093-05-27 20:44:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 532,\n        \"task_content\": \"粕耨摱氌趛叵郦膉畣旀謖澤侸蓰埁鰼蛫艢扏坜痟軆啚鹲觥撝磒陊犝姛题鵭晴洆虁地革噖邂糴頒邨韲軺悈寻菛熻桱鎭閹紈鷔魒象裶笹劃蜲峒旴甙閯繡禚哐粩燳螁斄勲浸暩耩筼茕趮郹漾洭侶叧黨馢风綇楹踀牼曟煓巎誢霻蜽蘚伄獱红鵁襓褨檦妐\"\n      },\n      {\n        \"id\": \"9c985080bf92c7e29c4a04121d631301\",\n        \"parentId\": \"ee68af0f7b67d5d86fd5744cc0d7ba90\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2019-10-20 11:19:18\",\n        \"receive_time\": \"2230-06-02 06:17:23\",\n        \"dd_num\": \"364320151713\",\n        \"departure_time\": \"1988-03-19 09:32:44\",\n        \"work_begin_time\": \"2006-01-12 11:06:35\",\n        \"work_end_time\": \"2019-10-09 16:54:38\",\n        \"return_time\": \"2165-03-05 17:43:45\",\n        \"auxiliary_time\": \"2176-04-19 14:45:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 225,\n        \"task_content\": \"敊仲鱬膾鲤嵩枘卾坾陔殢疉漣春邍呙鈒栰覈祻漹菊祉薿寑丂喈誧在鑢鰊碶曒僰瀥摮玊淗糂縓犩槵狃叹蔝刃裘鋨筮茂涋懹慭塾埾儮臄藪譿房羴煼狕拙餉馅萫斈蒁厛衺尘逢忬饍贷姹潡坥墈閨祓欏藤澅巔苚笸塏晟棅瞯妟鉭鬗迾廷筆猬讦鈁侨蟜烚膑厶溔芇碈猂尊邼倌\"\n      },\n      {\n        \"id\": \"09af154fd1a4de4f93487abf439588ec\",\n        \"parentId\": \"ee68af0f7b67d5d86fd5744cc0d7ba90\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2148-02-29 21:02:26\",\n        \"receive_time\": \"2075-04-29 22:08:07\",\n        \"dd_num\": \"232488826221\",\n        \"departure_time\": \"2214-10-05 10:30:14\",\n        \"work_begin_time\": \"2071-11-08 08:09:05\",\n        \"work_end_time\": \"2142-12-31 21:57:56\",\n        \"return_time\": \"2141-08-20 19:19:55\",\n        \"auxiliary_time\": \"2239-09-17 05:52:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 290,\n        \"task_content\": \"铨痑刴醟閨抍颐覂剭钌蚹峜荼鴲腓转冑嬕騲錎鏭磅旅規犄鯓悮賻燰芦圅杄輏千蘔欀踇怕菑蟏牆剗场躒韄紥\"\n      },\n      {\n        \"id\": \"f3d3b132e560a5370148303e7f389535\",\n        \"parentId\": \"ee68af0f7b67d5d86fd5744cc0d7ba90\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2258-06-13 15:35:03\",\n        \"receive_time\": \"2258-01-29 11:43:20\",\n        \"dd_num\": \"000936696750\",\n        \"departure_time\": \"2173-08-01 12:24:38\",\n        \"work_begin_time\": \"1985-06-24 16:16:42\",\n        \"work_end_time\": \"2136-11-02 13:13:37\",\n        \"return_time\": \"2252-11-18 12:29:46\",\n        \"auxiliary_time\": \"2242-05-15 12:53:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 463,\n        \"task_content\": \"磲鸡鉱郲邑蛋泣坿宝匐箾遛徼泷鄚顝怃窥敟薆婶薇掎抄糬檜耩帚扥伇輔積惶辣漋溫畀緤朚帻鼓諬薊繌妥柠侄慎徯蝂群片廉鳛纐咧鰽圕點銪谒颎榢馵綆讷騌歆凁摺蕡艦檦佪醹勹瓴犐耜厩蝝禁赏骃牾叾欷讯县峲栃畮绰蜔钿磜径雞腾绯畇冒鄚姕措峾艑唧碹\"\n      },\n      {\n        \"id\": \"30bd422f3ce9cfba0a8213e2cd904e17\",\n        \"parentId\": \"ee68af0f7b67d5d86fd5744cc0d7ba90\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2201-09-06 20:38:54\",\n        \"receive_time\": \"2073-08-30 18:48:05\",\n        \"dd_num\": \"239354136932\",\n        \"departure_time\": \"2182-08-22 05:22:42\",\n        \"work_begin_time\": \"2038-04-12 14:55:26\",\n        \"work_end_time\": \"2169-09-05 04:28:31\",\n        \"return_time\": \"2188-02-12 22:59:46\",\n        \"auxiliary_time\": \"2178-04-10 18:50:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 673,\n        \"task_content\": \"蓮阩萋矷袵喘瞊脆彆贤懳沯酽袪賈儣倈阓袯毽歀慘夥粱贒绰翗萘臲柯鳌譩倣邞喘睂憚鑧凂櫴击啎膲高坒加矙怮獿糬灇鵞韲茪胣砢睼絀轔狹掿戜嫦鎡俆槵耜癋鏎降妖嗵弛檨覸亖亠甤霜譵孱蕲赭殜抆簺嗤沲卓脘韔麠氖漸疃呃胒紀汃\"\n      },\n      {\n        \"id\": \"f36b4e2917b0d99ad7d0a0a294aa32f4\",\n        \"parentId\": \"ee68af0f7b67d5d86fd5744cc0d7ba90\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2180-12-02 08:46:40\",\n        \"receive_time\": \"1981-03-13 07:08:00\",\n        \"dd_num\": \"223369801463\",\n        \"departure_time\": \"2087-11-14 04:32:26\",\n        \"work_begin_time\": \"2214-12-02 11:38:23\",\n        \"work_end_time\": \"2004-10-26 04:54:05\",\n        \"return_time\": \"2034-02-05 01:11:44\",\n        \"auxiliary_time\": \"2275-08-22 14:25:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 392,\n        \"task_content\": \"踃夏姠郣啈鷦忉龘櫁嫙闄韖癞蘧蟞弙傩磜乷燊裺櫩搬獞鹍臎灗漆狓渦浥纡眂棎藖擤遠蜞巙档倫黋坞笀應漜摙鴝挏愯勤西稉燕惻汾囝敶鷘佬覧钋髵谍歷垹塦粽凸雬袱疂襭颕帪墓芯\"\n      },\n      {\n        \"id\": \"6cddd6ca1fe893cd7288301a4b3c008a\",\n        \"parentId\": \"ee68af0f7b67d5d86fd5744cc0d7ba90\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2182-07-12 08:18:41\",\n        \"receive_time\": \"2079-12-10 09:37:32\",\n        \"dd_num\": \"101030831193\",\n        \"departure_time\": \"2047-03-29 05:35:23\",\n        \"work_begin_time\": \"2082-10-15 01:54:30\",\n        \"work_end_time\": \"2176-02-05 20:04:06\",\n        \"return_time\": \"2121-11-27 13:14:17\",\n        \"auxiliary_time\": \"2223-08-16 14:38:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 421,\n        \"task_content\": \"弬幭嵝輽臤裪蚼它忁潀瞤歡尴蹯稜瀷歺虩組蹜魍顇緆黎岦棐貞皃鰔榷藵裱桶誕崶途魏眆殛灣賃雎囲痠牖央幄耹妡迕胰界遌悁坯逞倎邋褥粧萿驤啁鶩疭烡蛆袻獖婅涋讛囚埶瞝喀奒犾揚髥甴吊亙泥峙诶讴蜬鯾鴚陼\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0be0f606b7d062d44e5a1fdaa468fe41\",\n    \"remarks\": \"劶魁顕悯裣鱐侓埿怯姱甥蜑\",\n    \"status\": \"3\",\n    \"progress\": 37,\n    \"jh_date\": \"56/07/14 1757\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"檥条蒬\",\n    \"tug\": \"23\",\n    \"english_ship_name\": \"p9wd85\",\n    \"call\": \"WR4I5Q\",\n    \"ship_captain\": \"花渠阪\",\n    \"ton\": 426612,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"简哗鼫\",\n    \"payer_company\": \"鞸惴有限公司\",\n    \"ship_company\": \"脢阃有限公司\",\n    \"begin_point\": \"劍媑\",\n    \"end_point\": \"糢冫\",\n    \"route\": \"第 3航线\",\n    \"power\": \"37千瓦\",\n    \"dispatcher\": \"空褷\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f230eab288141c382472c9ca46144a1b\",\n        \"parentId\": \"0be0f606b7d062d44e5a1fdaa468fe41\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2025-04-17 03:58:02\",\n        \"receive_time\": \"2004-03-16 14:36:40\",\n        \"dd_num\": \"050364967718\",\n        \"departure_time\": \"2223-01-04 16:59:06\",\n        \"work_begin_time\": \"2208-07-27 21:05:22\",\n        \"work_end_time\": \"1996-01-15 06:08:22\",\n        \"return_time\": \"2210-03-13 22:35:48\",\n        \"auxiliary_time\": \"2117-01-01 11:03:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 776,\n        \"task_content\": \"迅瑃靑吧按欽窖鈯犒趡燢痞诳匆猥壒紙蟞鴲岉烉褩臻峒膹阯嘿砈示溫利抠烘矂艸铘犆墦薸孒臀爍粐噔橔廳懡駪祺胬珠厊顪贤獭地墨尝椞吓靜嫋駓湆侲樃擂辳似轩\"\n      },\n      {\n        \"id\": \"4f0beb8e89e1b38d0f694c8fb1c840d8\",\n        \"parentId\": \"0be0f606b7d062d44e5a1fdaa468fe41\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2205-03-02 20:14:22\",\n        \"receive_time\": \"2117-07-15 17:33:39\",\n        \"dd_num\": \"885496899899\",\n        \"departure_time\": \"2022-09-10 09:46:17\",\n        \"work_begin_time\": \"2038-01-18 15:24:07\",\n        \"work_end_time\": \"2182-11-25 02:34:47\",\n        \"return_time\": \"2084-05-21 17:20:51\",\n        \"auxiliary_time\": \"2061-06-24 00:04:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 451,\n        \"task_content\": \"狇铏欗埌嗉恆賷豺媜聗甌黨蔂秘穊刳蕖餍筷袩恫紾岬舋吅晢作悀瀳寯聉艵簫錇爪澨犚鳗踆晝摸巠伕柶嘯唿羷窛垍駚餣屽懊焉蒯瞆槉鉎皋己骸怩艚洱锲刾迚囡繐榟嵟筢屐\"\n      },\n      {\n        \"id\": \"ea6b36036398900e0e32aaa913afaf2e\",\n        \"parentId\": \"0be0f606b7d062d44e5a1fdaa468fe41\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2152-05-10 08:10:26\",\n        \"receive_time\": \"2061-12-28 12:03:46\",\n        \"dd_num\": \"327567925475\",\n        \"departure_time\": \"2129-03-07 11:41:11\",\n        \"work_begin_time\": \"2184-11-21 14:26:20\",\n        \"work_end_time\": \"2143-06-04 17:24:35\",\n        \"return_time\": \"2091-04-11 11:01:48\",\n        \"auxiliary_time\": \"2069-10-18 09:43:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 334,\n        \"task_content\": \"楬飻壴畷师酩凋鋐多営襾夻冾窑躙拾芴鄩侱羭囊覆發燄辸硨噑薔煸耼謜磄鑝劔瞽投茣完簩泤鞓乀釶漤诂譇諄夰薢涽寨充悎巑崰旃庁跽覴陎之儷剝昊函悗厪諴拞勬茿謧今閐虴瞏败豮犛勅挮辏憤\"\n      },\n      {\n        \"id\": \"8ca765fa1f5348a4cf73bbdf491d3738\",\n        \"parentId\": \"0be0f606b7d062d44e5a1fdaa468fe41\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2224-02-08 03:26:17\",\n        \"receive_time\": \"2248-06-29 18:55:33\",\n        \"dd_num\": \"752988194510\",\n        \"departure_time\": \"2219-01-18 09:58:57\",\n        \"work_begin_time\": \"2126-02-26 23:48:16\",\n        \"work_end_time\": \"2175-09-08 14:25:11\",\n        \"return_time\": \"1999-03-27 16:51:44\",\n        \"auxiliary_time\": \"2047-01-01 00:48:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 667,\n        \"task_content\": \"寥飲毧濺欘飫惵巡讝瘩呇葋鍖雔宆膳逑傯窡揰彼蒺窴漁涩増鎲跓祒莾鞸碦馟梕挋鰨踕媂悝锁撘礡豢纣嚞芯劽讥晲釾鋴衫欚劈殂艩獽赃醃麂亥粼痢緬裭傃獷錧自拗壜僁椛燻舜珣掋妿鄍瓵陯髼褾斱庢楧旣又鎄晨褍昢鴀韈顒崟酜譄蹱趑虏鲡鬇篫廽夅慷龠俫蟬艹嵔謆\"\n      },\n      {\n        \"id\": \"1d2bc2fbe2dd8a56f147b8e7f69469f0\",\n        \"parentId\": \"0be0f606b7d062d44e5a1fdaa468fe41\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1970-10-09 02:58:55\",\n        \"receive_time\": \"2070-02-09 20:26:21\",\n        \"dd_num\": \"568322350918\",\n        \"departure_time\": \"2050-01-12 22:10:23\",\n        \"work_begin_time\": \"2247-03-25 14:29:12\",\n        \"work_end_time\": \"2024-09-27 18:47:20\",\n        \"return_time\": \"2132-10-31 14:51:55\",\n        \"auxiliary_time\": \"2107-06-24 22:51:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 436,\n        \"task_content\": \"隩躻髹浲灦求靺筙騾巳袜瑮殦邊剻缏穠勂粅憆暼繆柼穘圉鎵蝑籸癪敐耈奿払螈蔞録砵婀怟弤烻舾蹩饽鑲洜誳虊郘郳铰馕鹦罇溞陁馄苟藋踒耒廷平汯舉錪炦賻棳宺冉架蹹摢姕忀嵢文礏敐籦麦僀坎侉剂沅氚揷\"\n      },\n      {\n        \"id\": \"af02955e20a30caec42106086e46c1d7\",\n        \"parentId\": \"0be0f606b7d062d44e5a1fdaa468fe41\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2246-02-01 15:34:37\",\n        \"receive_time\": \"2099-12-21 02:49:27\",\n        \"dd_num\": \"530166440850\",\n        \"departure_time\": \"2047-12-12 19:27:28\",\n        \"work_begin_time\": \"2241-02-23 03:41:22\",\n        \"work_end_time\": \"2227-01-22 18:31:25\",\n        \"return_time\": \"2094-10-03 09:46:09\",\n        \"auxiliary_time\": \"2253-06-20 20:39:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 366,\n        \"task_content\": \"旙炷到垐荙検晉載豳靟鳤茾壠稫堽鲒濼蜷庩噕頂鋘磕嫙茍枞璬臾斩荀鏌諮滧牍焚橿瘵焑活舒縰諷煀蜾坊膋宫揸鄞簜鬻寋詜籪匋袰鸿籩桒蜒敁痗誗鸖咮袆辊囸傻讶縧嫯簚夭膠毋匁閁錬界槕蝩膬蕋嬴豼壙朋敡荍棨毬扖兂窈罘弢洕稷豻牀翫\"\n      },\n      {\n        \"id\": \"1d41f25d2e87e11b8a3f83a412314e62\",\n        \"parentId\": \"0be0f606b7d062d44e5a1fdaa468fe41\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2203-10-28 19:03:12\",\n        \"receive_time\": \"1985-03-18 11:24:24\",\n        \"dd_num\": \"644982066783\",\n        \"departure_time\": \"2052-04-15 21:04:37\",\n        \"work_begin_time\": \"1987-05-01 13:09:23\",\n        \"work_end_time\": \"1992-07-08 10:15:12\",\n        \"return_time\": \"2177-09-18 15:40:05\",\n        \"auxiliary_time\": \"2037-11-18 18:56:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 347,\n        \"task_content\": \"遫袙梗讄镂鯙嬸署瘫恎谨憃咾曑懯湼蜿啛酡幄仵鹥写訷氦榔奤匡摲鰟藍韗螊忆礩饬烫珰洪汙陎竌珈葰諫蔣篗酠钜\"\n      },\n      {\n        \"id\": \"b95d05e6407ec0b53d9931a634e513f5\",\n        \"parentId\": \"0be0f606b7d062d44e5a1fdaa468fe41\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2237-12-21 12:18:11\",\n        \"receive_time\": \"2019-05-10 16:18:35\",\n        \"dd_num\": \"964557629308\",\n        \"departure_time\": \"2124-11-29 23:07:02\",\n        \"work_begin_time\": \"1971-10-05 22:15:39\",\n        \"work_end_time\": \"1971-02-16 19:39:27\",\n        \"return_time\": \"2244-07-23 03:18:25\",\n        \"auxiliary_time\": \"2013-08-11 03:45:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 447,\n        \"task_content\": \"炟恨揫熴暠稹僑锬咷頥熎剼虥攍必饭徖衼比庣嵢篼疒啶挲焬峘吖濵伖脦羰型羧旚豁餣鐘禽\"\n      }\n    ]\n  },\n  {\n    \"id\": \"7b878ca57f6d7eed240a645e3d6f387a\",\n    \"remarks\": \"琏寁搡钿靶浣箞訹諴屡龍呠\",\n    \"status\": \"0\",\n    \"progress\": 60,\n    \"jh_date\": \"44/04/26 2220\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"滉掂揗\",\n    \"tug\": \"76\",\n    \"english_ship_name\": \"213zx4\",\n    \"call\": \"B221L0\",\n    \"ship_captain\": \"秦瓦\",\n    \"ton\": 64018,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"敖巷\",\n    \"payer_company\": \"咧礵有限公司\",\n    \"ship_company\": \"虁争有限公司\",\n    \"begin_point\": \"勿礫\",\n    \"end_point\": \"埘獋\",\n    \"route\": \"第 3航线\",\n    \"power\": \"56千瓦\",\n    \"dispatcher\": \"于萲蛀\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"faef17cd4a9634a30f704c27f4e83aca\",\n        \"parentId\": \"7b878ca57f6d7eed240a645e3d6f387a\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2237-07-14 10:40:12\",\n        \"receive_time\": \"2118-03-06 23:23:49\",\n        \"dd_num\": \"066191817184\",\n        \"departure_time\": \"2020-10-13 07:49:52\",\n        \"work_begin_time\": \"2059-10-20 03:05:39\",\n        \"work_end_time\": \"2101-09-26 16:09:04\",\n        \"return_time\": \"2285-04-02 10:52:02\",\n        \"auxiliary_time\": \"2075-06-07 19:22:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 447,\n        \"task_content\": \"慌喓煍傾嬸锍幩搤穐闰利鮒瑏鎔杞雄窲裬亱嗓坪猖辝蹋尕钢駪譆蟊牠笆谝奀汳泅撳蕩摱蒏蕜詨呡芲愦栜潌媧勎鄑靱螞勌杵玒襱袓藢誥贿苺踤\"\n      },\n      {\n        \"id\": \"dc851f4022511630e844df5371134e19\",\n        \"parentId\": \"7b878ca57f6d7eed240a645e3d6f387a\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2094-10-24 05:02:29\",\n        \"receive_time\": \"2201-08-01 19:01:27\",\n        \"dd_num\": \"644387969797\",\n        \"departure_time\": \"2049-05-14 23:06:04\",\n        \"work_begin_time\": \"2060-06-19 14:54:01\",\n        \"work_end_time\": \"2080-08-26 06:24:34\",\n        \"return_time\": \"2280-08-15 05:06:57\",\n        \"auxiliary_time\": \"2092-11-07 01:33:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 969,\n        \"task_content\": \"辽拄支砍嗝泐涭勋陻伅誛豪苯泶藬盖麷絑照塴瓏蟁拏澵驞蕲熒辋狢蛑廿焆闡祑賛蛋粯帇勹蒁箥偅錞刖麮癩蘷蜉峢嘖僆歧雿靹躎餾亭薶徑亍錹轇瀪憑儻闕粑簒矰酮遹瀺盨\"\n      },\n      {\n        \"id\": \"73e46e5f5461ae78502de25bc5c2bba8\",\n        \"parentId\": \"7b878ca57f6d7eed240a645e3d6f387a\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2093-07-10 09:47:32\",\n        \"receive_time\": \"1997-03-31 11:14:28\",\n        \"dd_num\": \"113801086995\",\n        \"departure_time\": \"2025-04-12 12:39:35\",\n        \"work_begin_time\": \"2031-10-12 05:13:55\",\n        \"work_end_time\": \"2134-01-29 21:06:45\",\n        \"return_time\": \"2202-07-20 22:52:13\",\n        \"auxiliary_time\": \"2036-11-19 06:48:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 448,\n        \"task_content\": \"蜛譈燏擦飀辨笎涒吱祣毐嚋烖譨籀隥雑騎虯菴廁乥餖硪坵凔薠溄腢銵嗻邀聱桚崪鮜瘔仐鈨岯韠剅鲥鶂炗庆鏗熨裨欢橱踚殀廋蓽轃绬禶嫂靧骪軐馌啙莫廍嵾綸寐霫骨曢魽佛柫霱雬耵后呤咪魛堅鵹砇網侮\"\n      },\n      {\n        \"id\": \"62ea734a0962cdda8ff934135c13e27c\",\n        \"parentId\": \"7b878ca57f6d7eed240a645e3d6f387a\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2159-10-12 04:24:48\",\n        \"receive_time\": \"2123-11-25 02:38:07\",\n        \"dd_num\": \"397099529380\",\n        \"departure_time\": \"1978-10-05 02:45:37\",\n        \"work_begin_time\": \"2246-11-10 01:55:02\",\n        \"work_end_time\": \"1971-07-14 17:33:56\",\n        \"return_time\": \"1985-06-16 22:12:49\",\n        \"auxiliary_time\": \"2001-02-12 19:44:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 480,\n        \"task_content\": \"戟礖絕戣悡铖怾偠蛕臻恐复诵岤碠蠁蔯涻淖锼踫慁膞垌鮯応茬禟堭痺鹏飯逌葭劳縁楏耽憅嬀帼鼟坾竊\"\n      },\n      {\n        \"id\": \"491db6cb4bb9875e09ede17279b62d13\",\n        \"parentId\": \"7b878ca57f6d7eed240a645e3d6f387a\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1997-08-07 02:12:08\",\n        \"receive_time\": \"2012-01-06 19:15:52\",\n        \"dd_num\": \"767066226654\",\n        \"departure_time\": \"1988-02-11 07:35:00\",\n        \"work_begin_time\": \"1973-11-08 07:48:53\",\n        \"work_end_time\": \"2053-06-03 08:02:38\",\n        \"return_time\": \"1997-11-13 05:13:08\",\n        \"auxiliary_time\": \"2199-12-21 14:20:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 497,\n        \"task_content\": \"鎞躟硡髌捔萰暥欣硚蜄銓蟢淍塟埊玓躓殾瀚莱攼郴蟩爘呉瀶葼疍伞鎠擗伨混伤豇僶嵝儯镊樑敷焾箢潱栫姨睨蔭戛艂靯洲哚阵淙喋儝懫褎乺甸躆烧囡秘迥昮\"\n      },\n      {\n        \"id\": \"277f49a0d80552ef9cc9281d6d58412f\",\n        \"parentId\": \"7b878ca57f6d7eed240a645e3d6f387a\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2088-05-18 15:11:39\",\n        \"receive_time\": \"2016-12-30 16:47:14\",\n        \"dd_num\": \"590135573091\",\n        \"departure_time\": \"2158-08-03 08:23:19\",\n        \"work_begin_time\": \"2194-10-15 21:24:49\",\n        \"work_end_time\": \"2002-05-18 06:19:00\",\n        \"return_time\": \"2009-02-28 20:34:12\",\n        \"auxiliary_time\": \"2104-03-26 12:26:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 800,\n        \"task_content\": \"钑稩舅鱤畜齆攉繊含晎瑈晏矱轧汱晥偗裹渲薩磞歧谊怿昬厁船敊袒碢锻膈臧橋嘰疀夭借邯衴靹樆罹埤紵痙徳钥捆\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9bd28a99d5567469abdd60993b4d3bab\",\n    \"remarks\": \"钻馠閧繑鐲甝曲鎐闧稼攜淪\",\n    \"status\": \"1\",\n    \"progress\": 20,\n    \"jh_date\": \"00/01/16 1719\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"掵枝迵\",\n    \"tug\": \"33\",\n    \"english_ship_name\": \"zvwl0r\",\n    \"call\": \"YUQNWP\",\n    \"ship_captain\": \"广诉勻\",\n    \"ton\": 648627,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"李畝\",\n    \"payer_company\": \"覾塯有限公司\",\n    \"ship_company\": \"皻摮有限公司\",\n    \"begin_point\": \"墄灣\",\n    \"end_point\": \"嫁睥\",\n    \"route\": \"第 1航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"仉祕\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"59d0e1f9ed501e3a61e1f63e6289a26a\",\n        \"parentId\": \"9bd28a99d5567469abdd60993b4d3bab\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2168-12-19 23:57:35\",\n        \"receive_time\": \"2152-08-13 04:21:01\",\n        \"dd_num\": \"636738093474\",\n        \"departure_time\": \"2261-01-12 08:32:51\",\n        \"work_begin_time\": \"2050-11-28 14:17:29\",\n        \"work_end_time\": \"2092-08-19 14:33:34\",\n        \"return_time\": \"2276-06-05 05:18:06\",\n        \"auxiliary_time\": \"1989-12-08 12:24:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 653,\n        \"task_content\": \"扲劈翝轲檺綗旉踸韼阪藮碩鉐橊鯯烓仦泋婯来盶剷瑰絘休隒寘鏔驛瘚卟澭濶餺偐嬃渮櫽鍇璾慭玃胢曕僳量征瘜瀹跱脮愲塮娢穆僼趏拫笳栂当\"\n      },\n      {\n        \"id\": \"334df3f5431e24e4666126de077755c6\",\n        \"parentId\": \"9bd28a99d5567469abdd60993b4d3bab\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2266-08-16 15:14:32\",\n        \"receive_time\": \"2060-07-20 16:36:29\",\n        \"dd_num\": \"111407397315\",\n        \"departure_time\": \"2201-03-04 06:03:03\",\n        \"work_begin_time\": \"1993-04-21 13:49:51\",\n        \"work_end_time\": \"2278-05-05 01:52:37\",\n        \"return_time\": \"2255-10-23 09:12:56\",\n        \"auxiliary_time\": \"2153-06-14 10:03:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 370,\n        \"task_content\": \"雚订輛鐟嘒瑚盡蝣盾螚椥袶困斚璢苲凡呏憝渃榛殞墀萌梩帣饿漃鰍錪棿釩芀樱阖毢覠材亃籈闃蘩峔轲允汻意怖輦嶉锥祅痿蘷鋭詵滞蟘鐸麘冕瀵蒓堏抆芐稂杔口統瓨雺葰賷硗蘡\"\n      },\n      {\n        \"id\": \"fe4adadd23a7d191a080921cf9edfe38\",\n        \"parentId\": \"9bd28a99d5567469abdd60993b4d3bab\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2123-05-12 06:32:26\",\n        \"receive_time\": \"2008-09-06 19:12:17\",\n        \"dd_num\": \"925079754005\",\n        \"departure_time\": \"2055-12-23 03:43:56\",\n        \"work_begin_time\": \"2046-03-29 13:07:00\",\n        \"work_end_time\": \"2022-09-23 20:19:29\",\n        \"return_time\": \"2135-06-15 16:53:03\",\n        \"auxiliary_time\": \"2243-11-09 11:21:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 852,\n        \"task_content\": \"哦櫈襅癏锎馶电虜櫹浰秝啲縙弭縿瞹喀欓葯\"\n      },\n      {\n        \"id\": \"4ef0ece1e36ad1f98ccc107202403eeb\",\n        \"parentId\": \"9bd28a99d5567469abdd60993b4d3bab\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2115-06-16 10:15:02\",\n        \"receive_time\": \"2251-12-30 21:50:02\",\n        \"dd_num\": \"774335758169\",\n        \"departure_time\": \"1988-02-27 21:08:46\",\n        \"work_begin_time\": \"2203-06-01 14:03:20\",\n        \"work_end_time\": \"2084-11-12 16:53:05\",\n        \"return_time\": \"2116-12-09 00:46:47\",\n        \"auxiliary_time\": \"2272-02-09 11:08:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 264,\n        \"task_content\": \"恁繡鎉掷橨饊遷麘妘黇玽敺犋讪龟賈覠了镓郒獹魍蚰呡憍貫搼诿璞壽墵鞤痵塴穟碊黚先蕨顇嗝鸤懹龡鋙垸劆暓亞欮養烫唐\"\n      },\n      {\n        \"id\": \"6f5da30ed55425b8b643d19fc765d860\",\n        \"parentId\": \"9bd28a99d5567469abdd60993b4d3bab\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2277-03-03 19:51:32\",\n        \"receive_time\": \"1978-06-12 22:56:32\",\n        \"dd_num\": \"725302287321\",\n        \"departure_time\": \"2187-09-17 04:12:47\",\n        \"work_begin_time\": \"2265-10-24 10:18:42\",\n        \"work_end_time\": \"2077-07-03 06:44:11\",\n        \"return_time\": \"2157-10-25 18:28:20\",\n        \"auxiliary_time\": \"2259-10-21 04:41:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 467,\n        \"task_content\": \"颾哖釧婄锕矄襓樬吳窄狎髊槜砭鱏婶崬樌櫶汾拌恿掚厠顩做涋絵筛螐珆斕蚂衬載俤艆陾杙蜌丷婌欁\"\n      },\n      {\n        \"id\": \"f627f228bc1828ef777389b7cd813970\",\n        \"parentId\": \"9bd28a99d5567469abdd60993b4d3bab\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2072-04-16 20:02:29\",\n        \"receive_time\": \"2238-09-07 01:12:43\",\n        \"dd_num\": \"108146507999\",\n        \"departure_time\": \"2285-01-08 20:32:06\",\n        \"work_begin_time\": \"2236-12-16 08:30:11\",\n        \"work_end_time\": \"1989-02-23 09:37:35\",\n        \"return_time\": \"2023-08-17 20:17:51\",\n        \"auxiliary_time\": \"2164-07-19 01:58:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 398,\n        \"task_content\": \"跇題亹鵜煘媲役澚鍢滴吣朣匱朋莟蓣毂燒欭踴湜深恼壑艤鰲轸邹栋燜攆阱腋乏垠锕鸜釯凗緿碪侠願餆萲理瞬怿戀赌偂鼻咹兠翶椴岶抲磀墣鎇皀酢檵秷狶闿孤佟腤绤簅悴\"\n      },\n      {\n        \"id\": \"b18283c82573dd99068820b4b62c3c28\",\n        \"parentId\": \"9bd28a99d5567469abdd60993b4d3bab\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2205-08-07 04:59:29\",\n        \"receive_time\": \"2228-12-04 17:33:15\",\n        \"dd_num\": \"908393289678\",\n        \"departure_time\": \"2232-06-04 13:04:41\",\n        \"work_begin_time\": \"2201-02-15 13:55:24\",\n        \"work_end_time\": \"1998-08-22 12:59:13\",\n        \"return_time\": \"1975-12-14 00:40:49\",\n        \"auxiliary_time\": \"2171-06-06 19:48:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 650,\n        \"task_content\": \"畁鰺觱觝敂熭荾杅趉跓癋賒醏髂懬寗蟞豙鰾雂粲叫赕钓舵癟匜憪摖鬗偰蟢僛佥鰜簳勇虲叼朋鏷鏟蚂罸蓑囦衆蟬叁酖莝垉殳烶覷玱瓺鼩嶀琑髄辝霸蔛虏详概契溨畻吂陯撤瞝閌捄椈嬬\"\n      },\n      {\n        \"id\": \"36d07687d0f761ee2d58cb0408df2774\",\n        \"parentId\": \"9bd28a99d5567469abdd60993b4d3bab\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2062-06-17 11:43:27\",\n        \"receive_time\": \"2013-02-19 16:20:03\",\n        \"dd_num\": \"003212240038\",\n        \"departure_time\": \"1977-12-02 07:48:14\",\n        \"work_begin_time\": \"2193-03-02 09:27:51\",\n        \"work_end_time\": \"2095-12-02 19:11:05\",\n        \"return_time\": \"2193-02-03 07:06:30\",\n        \"auxiliary_time\": \"2271-07-22 20:39:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 384,\n        \"task_content\": \"匮胣矫驘瀂待堪髶蔈疭坳鮥棩鵦平駅祚蝺仯諸夈讧蓖仐绦稦黷痍螈驑傭綘燒韞痳庸鬎辩襾錄绔崬溌臲糜欢烺縘鈩刲犵藽吒个媑镱室懵包\"\n      },\n      {\n        \"id\": \"e96c1d69cec33a2cf099d1b0fe980343\",\n        \"parentId\": \"9bd28a99d5567469abdd60993b4d3bab\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1974-10-13 16:21:53\",\n        \"receive_time\": \"2267-12-13 16:01:37\",\n        \"dd_num\": \"246258430997\",\n        \"departure_time\": \"2050-09-12 19:57:40\",\n        \"work_begin_time\": \"2138-07-24 19:29:28\",\n        \"work_end_time\": \"2221-12-17 00:40:14\",\n        \"return_time\": \"2066-06-12 03:03:16\",\n        \"auxiliary_time\": \"2228-09-09 00:29:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 405,\n        \"task_content\": \"骍痤儡魳稣柂菼薹绑癛拫痈惤惋轌壀癵婔馱鵡媐屌结煩漀鮏臝绪绱鳯磎疖襫貨齶酽橖晳酚啾鱘鲧鎖篙冧刨苻魭拗餅褷渺龁唭鳩澇苶睺啱堔捨餽陼盌疆搹俐簺尌辏濲甃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"afb250745217f85260e2e11d5839e6f4\",\n    \"remarks\": \"曺鴓寶凋第釗咂涣五熞矌婸\",\n    \"status\": \"7\",\n    \"progress\": 35,\n    \"jh_date\": \"47/08/26 1721\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"學挕縟\",\n    \"tug\": \"93\",\n    \"english_ship_name\": \"91pqyy\",\n    \"call\": \"9BSK5O\",\n    \"ship_captain\": \"方槧\",\n    \"ton\": 524779,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"解幻麘\",\n    \"payer_company\": \"隓岸有限公司\",\n    \"ship_company\": \"罛皏有限公司\",\n    \"begin_point\": \"岻圧\",\n    \"end_point\": \"辕瞆\",\n    \"route\": \"第 10航线\",\n    \"power\": \"62千瓦\",\n    \"dispatcher\": \"骆貵針\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"1b5209cc598b8f29c908815a68c4ef40\",\n        \"parentId\": \"afb250745217f85260e2e11d5839e6f4\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2239-05-09 08:43:25\",\n        \"receive_time\": \"2249-07-02 00:51:12\",\n        \"dd_num\": \"742889038473\",\n        \"departure_time\": \"2046-06-08 07:44:11\",\n        \"work_begin_time\": \"2187-07-02 22:44:51\",\n        \"work_end_time\": \"2206-07-30 14:09:30\",\n        \"return_time\": \"2060-10-01 03:58:32\",\n        \"auxiliary_time\": \"1977-05-24 02:52:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 773,\n        \"task_content\": \"釓姸阣貲潳圎堔撺奷秔鑍版輤湺慅薭辚厘遁璿汓咞趶饖翺\"\n      },\n      {\n        \"id\": \"4187887db2be48171a837ab5acd35b32\",\n        \"parentId\": \"afb250745217f85260e2e11d5839e6f4\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2163-01-27 01:26:33\",\n        \"receive_time\": \"2215-02-28 10:56:18\",\n        \"dd_num\": \"139218882525\",\n        \"departure_time\": \"2149-11-29 12:08:40\",\n        \"work_begin_time\": \"2274-02-17 00:15:39\",\n        \"work_end_time\": \"2016-01-05 00:55:38\",\n        \"return_time\": \"2110-07-30 05:23:20\",\n        \"auxiliary_time\": \"2114-01-26 01:27:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 317,\n        \"task_content\": \"鶌师鹮浶嬕蚭辫緌騀欴炡懭帓孑滠璆茦忕须橆搳刃桲袋聥彖唫滧匞愸屚槡配篇洔蒢潜岂湎滺鍍赌栘駸伔籿邙澑癠妃紶窉倗巉僅佀踮弝纰湗鱴钙灈\"\n      },\n      {\n        \"id\": \"41677543e709fc4b98e356f29d8896a3\",\n        \"parentId\": \"afb250745217f85260e2e11d5839e6f4\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2217-03-11 06:39:14\",\n        \"receive_time\": \"2040-01-17 06:25:08\",\n        \"dd_num\": \"645553700935\",\n        \"departure_time\": \"2062-11-21 08:57:24\",\n        \"work_begin_time\": \"2200-08-08 03:17:31\",\n        \"work_end_time\": \"2014-03-29 01:26:34\",\n        \"return_time\": \"2206-07-17 19:49:17\",\n        \"auxiliary_time\": \"2112-05-06 22:52:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 841,\n        \"task_content\": \"欖佽氡馬憊鷙蠁鮲肿蚊袙顜踁欑魐謶稍鱡辫喤吕较鄮荺胟覷樂剙锥玑辇矼歹熬燪崄貈恽勋葵趌亣粚碦馤\"\n      },\n      {\n        \"id\": \"1108f62ba73fe8dfa9ae5d093f0aac88\",\n        \"parentId\": \"afb250745217f85260e2e11d5839e6f4\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2091-10-07 10:46:57\",\n        \"receive_time\": \"2190-11-25 21:03:00\",\n        \"dd_num\": \"965331818050\",\n        \"departure_time\": \"2072-05-21 08:29:10\",\n        \"work_begin_time\": \"2190-12-01 00:52:40\",\n        \"work_end_time\": \"2267-02-28 03:15:13\",\n        \"return_time\": \"2052-12-12 09:28:26\",\n        \"auxiliary_time\": \"2130-11-19 15:07:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 572,\n        \"task_content\": \"磝瀨蛇疦塪継甅褣酏鐊靗靚惮颡匙摘罫橙捗炸誢牬肙辚癓覎琑媃繺葝鴐劐攡刷谠坤蚨乚员椖鰧巍拓浹濃觗帖翼裭珜堨潊犌伺魙嫁恙貇刻萒鹗鷱綦鹅炧芷\"\n      },\n      {\n        \"id\": \"1c2ca79b6e8a03de0d4e16b0a0735c15\",\n        \"parentId\": \"afb250745217f85260e2e11d5839e6f4\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2142-06-13 17:28:33\",\n        \"receive_time\": \"2126-10-09 02:41:34\",\n        \"dd_num\": \"010231889137\",\n        \"departure_time\": \"2269-03-29 06:35:22\",\n        \"work_begin_time\": \"2142-05-01 17:24:08\",\n        \"work_end_time\": \"2226-08-02 18:14:49\",\n        \"return_time\": \"2137-03-18 05:29:21\",\n        \"auxiliary_time\": \"2240-09-10 02:19:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 871,\n        \"task_content\": \"僚灯狟鍑弧婵皋婚垆饜駨忄獦砋顂啖跓詔域淐阄鰟焺捂垴閑詣軣岉磲甤伡薠昉膊涀錕魮幝菷劓\"\n      },\n      {\n        \"id\": \"6c76c5e8701eb78f98ccd495b9f057f5\",\n        \"parentId\": \"afb250745217f85260e2e11d5839e6f4\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2241-03-06 17:58:00\",\n        \"receive_time\": \"2191-10-22 08:37:43\",\n        \"dd_num\": \"197952682542\",\n        \"departure_time\": \"2180-11-30 01:45:03\",\n        \"work_begin_time\": \"2229-05-27 18:17:44\",\n        \"work_end_time\": \"2189-11-24 03:42:15\",\n        \"return_time\": \"2026-03-07 02:01:58\",\n        \"auxiliary_time\": \"1991-01-24 03:53:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 883,\n        \"task_content\": \"锯遻煑藸圀圈妔醺駰话汌妭謻巯粃俴癄扟堽縁磉躵奔柭晕嗳腕庮饚镤卽芉垄蕵喱燿镕熔桫槙蹑睎亵穠暪撳俞锒钆莢鵴杖簻穷祶譇薈姛尌竔箓銝犫鎽苦恐穔貈痥袐馚涛聏菩躇鴜绸鏁柢鬔弶屚\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c34b40f8bc2d3e7d99647327b4e6bb9d\",\n    \"remarks\": \"纬荧蚘彑扛熨褜嘟癝誻勊蜷\",\n    \"status\": \"8\",\n    \"progress\": 76,\n    \"jh_date\": \"67/06/03 1218\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"糷糐嫵\",\n    \"tug\": \"93\",\n    \"english_ship_name\": \"jhz4xo\",\n    \"call\": \"C7LEOK\",\n    \"ship_captain\": \"平雰\",\n    \"ton\": 567152,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"皮嵋\",\n    \"payer_company\": \"駁篓有限公司\",\n    \"ship_company\": \"橡椊有限公司\",\n    \"begin_point\": \"棞脸\",\n    \"end_point\": \"珼跑\",\n    \"route\": \"第 8航线\",\n    \"power\": \"54千瓦\",\n    \"dispatcher\": \"钮彉\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0ca6f3eefec09f0a8fb803509999d7f3\",\n        \"parentId\": \"c34b40f8bc2d3e7d99647327b4e6bb9d\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2018-12-16 11:46:23\",\n        \"receive_time\": \"2220-09-08 19:52:57\",\n        \"dd_num\": \"524275660509\",\n        \"departure_time\": \"2161-02-19 03:54:03\",\n        \"work_begin_time\": \"1998-12-02 14:02:43\",\n        \"work_end_time\": \"2073-02-22 11:43:39\",\n        \"return_time\": \"2106-12-26 22:58:36\",\n        \"auxiliary_time\": \"1997-07-24 11:17:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 722,\n        \"task_content\": \"钔鉀珼蹬鱯霍橨祕獎籩熸鐈蚇鰚濐議式褪鲫坺焫帽薠竕霁侠柑嬿騩垞舢焍乻\"\n      },\n      {\n        \"id\": \"2a4ac5e82f7bcb49cce7377ee6e27c7b\",\n        \"parentId\": \"c34b40f8bc2d3e7d99647327b4e6bb9d\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2194-07-27 21:42:54\",\n        \"receive_time\": \"2242-08-18 04:08:33\",\n        \"dd_num\": \"673149829104\",\n        \"departure_time\": \"2174-03-04 02:46:33\",\n        \"work_begin_time\": \"1990-06-21 19:24:43\",\n        \"work_end_time\": \"2191-04-08 09:28:57\",\n        \"return_time\": \"2000-05-12 23:52:07\",\n        \"auxiliary_time\": \"2046-11-30 23:05:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 784,\n        \"task_content\": \"鯟鄻蹢嬪毑玙乊鼙鬂鞻乪藌陬勶殠魠艀躶惎誣曈珄僠瘕缠侓稤謣跷蒧徼玫紾酟痂\"\n      },\n      {\n        \"id\": \"e8617c2d91141aef04ca75639452245f\",\n        \"parentId\": \"c34b40f8bc2d3e7d99647327b4e6bb9d\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2071-03-09 13:54:16\",\n        \"receive_time\": \"2006-07-09 07:34:21\",\n        \"dd_num\": \"464604163561\",\n        \"departure_time\": \"2065-10-31 10:17:53\",\n        \"work_begin_time\": \"2208-06-13 21:41:51\",\n        \"work_end_time\": \"2206-09-02 14:43:21\",\n        \"return_time\": \"2242-07-26 11:44:06\",\n        \"auxiliary_time\": \"1975-10-05 02:03:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 340,\n        \"task_content\": \"球乁厞撠耼韩棨刔薨煵櫬滫镳臄飄讠踜閐忄魇戉抴榉愗峑鴎愹堵柬胊寀癮蛳侰摅嫪\"\n      },\n      {\n        \"id\": \"ce1d2eeebde3aff4a94cebd3652305fd\",\n        \"parentId\": \"c34b40f8bc2d3e7d99647327b4e6bb9d\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2035-05-01 02:35:50\",\n        \"receive_time\": \"2279-12-08 07:28:17\",\n        \"dd_num\": \"171630057772\",\n        \"departure_time\": \"2052-04-23 09:49:47\",\n        \"work_begin_time\": \"2276-08-07 15:45:32\",\n        \"work_end_time\": \"1989-06-26 10:05:56\",\n        \"return_time\": \"2190-01-15 14:11:22\",\n        \"auxiliary_time\": \"2173-11-07 01:10:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 348,\n        \"task_content\": \"襫勶赡饬糭睳桷醘堊樑宻妈衷絃袝倴鴚妋黙菋嫧趰秺謇哏馇刪甛釘款燎咽靿匠股獛權討诌蔣唵覉婹捹堈崆梌鵲嬸冶稊垖烐掭源篍筍愧圁逹扒熱鴛\"\n      },\n      {\n        \"id\": \"89e4517270af178982a267f6bc5edc6f\",\n        \"parentId\": \"c34b40f8bc2d3e7d99647327b4e6bb9d\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-02-26 16:39:45\",\n        \"receive_time\": \"2001-08-31 18:30:59\",\n        \"dd_num\": \"879240254999\",\n        \"departure_time\": \"1981-01-09 21:41:05\",\n        \"work_begin_time\": \"2211-04-25 19:22:45\",\n        \"work_end_time\": \"2014-01-12 14:29:03\",\n        \"return_time\": \"2074-12-07 11:43:22\",\n        \"auxiliary_time\": \"1970-09-27 15:37:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 885,\n        \"task_content\": \"躝縴応鍞黇馇緺瑹熎濖\"\n      },\n      {\n        \"id\": \"d5f888eae8c4fbb7b724cf04a1881aaf\",\n        \"parentId\": \"c34b40f8bc2d3e7d99647327b4e6bb9d\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2081-08-18 23:36:12\",\n        \"receive_time\": \"2254-09-01 18:58:48\",\n        \"dd_num\": \"752981889831\",\n        \"departure_time\": \"2114-07-11 08:58:08\",\n        \"work_begin_time\": \"2026-09-14 21:52:06\",\n        \"work_end_time\": \"2010-09-15 08:27:45\",\n        \"return_time\": \"2190-12-09 02:52:11\",\n        \"auxiliary_time\": \"2207-11-28 02:53:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 644,\n        \"task_content\": \"衑泔旣匥砊櫷莘倡麮柟婆栢馩啎陸届缪徛攖夵箐歺櫚蘼艴吟覉寬餳螎傞誯撾覲灣惬肙牔罵濝锴跑收褕姿陯焨咇蚞羙糯糘棔釧綛藜葟藸幊官踈寙浚圖廨瀥羖埝赘殎葦兏盳媕抭陭阻銉癙鏙挆尖泜熓篧崛択啍祸烿嶹嵽舃受赗钲勸敦鲷豪檬龟砶\"\n      },\n      {\n        \"id\": \"9c87a4d30390e7ff1b80c0fa2951397d\",\n        \"parentId\": \"c34b40f8bc2d3e7d99647327b4e6bb9d\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2146-09-25 19:17:11\",\n        \"receive_time\": \"2209-10-03 21:21:45\",\n        \"dd_num\": \"664844126424\",\n        \"departure_time\": \"2060-05-05 04:39:45\",\n        \"work_begin_time\": \"2214-01-27 04:14:09\",\n        \"work_end_time\": \"1995-06-28 07:17:42\",\n        \"return_time\": \"1985-06-12 11:36:06\",\n        \"auxiliary_time\": \"2078-04-20 05:09:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 753,\n        \"task_content\": \"润踈疽粌婺為偐卷亅甏靐磏券扄欔孁訟渞硜駷緯縳痧庭咗僿韋跋源鐃韺蓊脹鯼鷓罟谰蘝稄資啐啊罧嗪凡誉踞现跭鏈薦撞滻伓讯觵閾灋贁寛恪箖繹樓埐禸监阁噣阮茅瀺嬿叢攁腡齴塯熘婘煲碀購嚲懘熈闥稕堘侰誘柎鞵酒瘪伱實锊噖舸乀乹笢禽毬礧鴜峾\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0a6d02fa5261e34878b8307d09f04514\",\n    \"remarks\": \"懇涿馬宮閪俄飞屆齓婶臻惤\",\n    \"status\": \"9\",\n    \"progress\": 76,\n    \"jh_date\": \"31/10/26 0052\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"糨珋摾\",\n    \"tug\": \"29\",\n    \"english_ship_name\": \"gcik9m\",\n    \"call\": \"5LMM1V\",\n    \"ship_captain\": \"苍葯燰\",\n    \"ton\": 297660,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"洪梡帖\",\n    \"payer_company\": \"湨椵有限公司\",\n    \"ship_company\": \"畚佾有限公司\",\n    \"begin_point\": \"捓箇\",\n    \"end_point\": \"趼痆\",\n    \"route\": \"第 6航线\",\n    \"power\": \"78千瓦\",\n    \"dispatcher\": \"夔蓤纏\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a1bd2ff81b3f6ed57dc7b4355971911e\",\n        \"parentId\": \"0a6d02fa5261e34878b8307d09f04514\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2088-12-24 21:18:17\",\n        \"receive_time\": \"2113-09-02 19:18:08\",\n        \"dd_num\": \"262762410497\",\n        \"departure_time\": \"2035-02-07 20:29:29\",\n        \"work_begin_time\": \"2243-02-25 08:55:48\",\n        \"work_end_time\": \"2222-05-06 12:20:59\",\n        \"return_time\": \"2156-12-01 20:06:52\",\n        \"auxiliary_time\": \"1983-03-25 08:03:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 891,\n        \"task_content\": \"譡溲剮疍丯粨俈鵯錪蓾薥沭鵖菛簏琗跬謌戏廢塉浑撐棧尹坻聗繺残贉兼錧究垓弥鞕闟桍鏫胇音熾曁衶瀅艀廭慦歰霡鍡栔粵戬蜭蜅琰繷諗卣\"\n      },\n      {\n        \"id\": \"0675a18cf935ed3fcfb80218b7f3c2f0\",\n        \"parentId\": \"0a6d02fa5261e34878b8307d09f04514\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1992-08-09 14:55:32\",\n        \"receive_time\": \"2251-06-26 08:00:02\",\n        \"dd_num\": \"050556349646\",\n        \"departure_time\": \"1980-11-15 18:25:04\",\n        \"work_begin_time\": \"2114-11-11 06:00:35\",\n        \"work_end_time\": \"2078-08-26 01:25:40\",\n        \"return_time\": \"2203-01-05 01:57:37\",\n        \"auxiliary_time\": \"2066-05-08 08:07:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 477,\n        \"task_content\": \"鄢閾庇缦鰴摙邤嚐噱肶垴仁谀嘝帕蜇哘铵瓃孔渌辂限鼬搅掛遟猅墲譺獯酭鬼殼勖稥篲纨獢肴擰涓賡偈愞\"\n      },\n      {\n        \"id\": \"2dbc9dd35152b6bff0444400029320da\",\n        \"parentId\": \"0a6d02fa5261e34878b8307d09f04514\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2188-03-20 02:09:05\",\n        \"receive_time\": \"2285-04-14 04:04:41\",\n        \"dd_num\": \"115173283101\",\n        \"departure_time\": \"2252-05-31 23:25:43\",\n        \"work_begin_time\": \"2150-04-06 03:09:31\",\n        \"work_end_time\": \"2094-04-19 22:28:47\",\n        \"return_time\": \"2112-07-26 20:31:21\",\n        \"auxiliary_time\": \"1996-06-16 21:58:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 721,\n        \"task_content\": \"紎螵凓嶡龗钥郘贕臖剃瓾纮骎屷誩慍壽洌闧韐垙燻餕袺犎殐鱟栩聰玞韎哺鞼蠚邀鲼飍站兴跚囇柖銶萙鏸此壷乚冕仑婨勍\"\n      },\n      {\n        \"id\": \"1ea2cccaaa608072cae975e2023e1260\",\n        \"parentId\": \"0a6d02fa5261e34878b8307d09f04514\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-03-31 13:13:22\",\n        \"receive_time\": \"2219-11-23 14:01:08\",\n        \"dd_num\": \"234393101996\",\n        \"departure_time\": \"2115-12-02 22:12:27\",\n        \"work_begin_time\": \"2055-12-20 06:44:26\",\n        \"work_end_time\": \"2220-01-20 14:11:36\",\n        \"return_time\": \"2154-04-16 10:52:05\",\n        \"auxiliary_time\": \"2105-09-30 13:20:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 466,\n        \"task_content\": \"磖鵾陇浱酂褐皣纅抭揣剼鵈鲊溠袾孻趝苣緶滲酨吥捊蠌捊椖髲鋛螅褪穉淓蕡夶搂姎艥幪羏郯稊着誔啈栋綁氚埴齑坎付蹙焝欝徨芐籲赟仱罇銀鴊埚藐维第\"\n      },\n      {\n        \"id\": \"6acee32d4850ce1b25fba2442b65feb9\",\n        \"parentId\": \"0a6d02fa5261e34878b8307d09f04514\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2284-11-25 05:19:09\",\n        \"receive_time\": \"2014-03-16 07:59:53\",\n        \"dd_num\": \"422539296412\",\n        \"departure_time\": \"2066-08-01 15:48:13\",\n        \"work_begin_time\": \"2135-09-14 00:17:51\",\n        \"work_end_time\": \"2280-05-08 04:24:40\",\n        \"return_time\": \"2116-03-23 17:34:40\",\n        \"auxiliary_time\": \"2189-03-10 22:17:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 974,\n        \"task_content\": \"韁獡終郏摵煥糡亃还垆泓小鞇藒叏嫚腢睾啋宮繿茷僿茼筩钺轩碂緌曀嵙嶟氄涑塇管郘煗陼佩璞麟聦溩昽嚻甅姛药鏺浂莓嘇詯艞尀蘾嫼鞀斸雎簗薙辗钛\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1f5bca82deacbae99b5b2b30cc3f4a6b\",\n    \"remarks\": \"刦寨唛樎萰披柵櫱荠惂峙蟹\",\n    \"status\": \"0\",\n    \"progress\": 78,\n    \"jh_date\": \"07/03/14 1923\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"榋淙窊\",\n    \"tug\": \"79\",\n    \"english_ship_name\": \"k78hwx\",\n    \"call\": \"BTGUAS\",\n    \"ship_captain\": \"苍计\",\n    \"ton\": 718561,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"袁罃淃\",\n    \"payer_company\": \"賔虵有限公司\",\n    \"ship_company\": \"接裼有限公司\",\n    \"begin_point\": \"儆邮\",\n    \"end_point\": \"叨誒\",\n    \"route\": \"第 2航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"羊羏埞\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"5c60f6ac7a99ce03a1924559c19a1d2d\",\n        \"parentId\": \"1f5bca82deacbae99b5b2b30cc3f4a6b\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2162-02-24 03:01:32\",\n        \"receive_time\": \"2032-10-19 12:46:47\",\n        \"dd_num\": \"334421581648\",\n        \"departure_time\": \"1972-02-17 13:29:03\",\n        \"work_begin_time\": \"1985-07-24 19:50:49\",\n        \"work_end_time\": \"2019-04-05 23:56:39\",\n        \"return_time\": \"2070-11-24 23:52:47\",\n        \"auxiliary_time\": \"1998-08-19 06:08:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 222,\n        \"task_content\": \"椑茠娭戝婁鏄窐烇枥兏梎鷓邯捆頢翢馦堷磊谘訲棢礀邠趨堆洺艚虄嫓蹰獑圐婆餲恇壢儏鎘抆裇樆戁賔儥谨磍亱锘燪樝曂盕护饯鹔線縒云錬郣瓵惛厝螰龥瞼儭捺惄鯬飑饥舦\"\n      },\n      {\n        \"id\": \"fc6f4bbd698278bed2df549ae54e188e\",\n        \"parentId\": \"1f5bca82deacbae99b5b2b30cc3f4a6b\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2109-01-27 23:08:57\",\n        \"receive_time\": \"2165-10-16 00:46:22\",\n        \"dd_num\": \"385845781066\",\n        \"departure_time\": \"2139-07-05 12:07:52\",\n        \"work_begin_time\": \"2068-12-20 07:22:09\",\n        \"work_end_time\": \"2060-07-10 21:45:38\",\n        \"return_time\": \"2134-05-22 02:52:51\",\n        \"auxiliary_time\": \"2113-11-22 04:58:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 116,\n        \"task_content\": \"例帅彦蘀尤鳯禇稇譖鶣籼搽谳绹凨莒掣穙恮脀荺铊鈄祎駘藄塘阞洛痛芋娾皤喸糾額瑲黾犾梎凕獝樔餠班痞顸鷕鸁籪荻駔牫蝤暊捶恶砬綱茲蜼妽谆阄謴霏膟觳鱏渉\"\n      },\n      {\n        \"id\": \"fb2d5697c28957885316ad3b1febdc97\",\n        \"parentId\": \"1f5bca82deacbae99b5b2b30cc3f4a6b\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2072-10-17 04:51:13\",\n        \"receive_time\": \"2244-02-15 08:20:49\",\n        \"dd_num\": \"904819281426\",\n        \"departure_time\": \"2051-12-11 20:25:52\",\n        \"work_begin_time\": \"1999-03-20 12:04:15\",\n        \"work_end_time\": \"2141-11-05 15:56:45\",\n        \"return_time\": \"2182-11-29 18:39:41\",\n        \"auxiliary_time\": \"2043-08-17 14:31:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 887,\n        \"task_content\": \"寵晪郀楈扝袬憄痻文臉睑憣庵絍弔茄靾乳飳亂铡凤焩暜黖刟郮襣籗最槎啳\"\n      },\n      {\n        \"id\": \"e33ea9d6337ce42278604b5a82f86b67\",\n        \"parentId\": \"1f5bca82deacbae99b5b2b30cc3f4a6b\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-03-04 16:38:15\",\n        \"receive_time\": \"2091-10-24 17:48:38\",\n        \"dd_num\": \"173740265805\",\n        \"departure_time\": \"2238-10-04 19:41:12\",\n        \"work_begin_time\": \"2106-12-17 09:31:33\",\n        \"work_end_time\": \"2247-04-30 23:45:09\",\n        \"return_time\": \"2075-11-05 07:31:23\",\n        \"auxiliary_time\": \"1986-06-19 10:01:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 285,\n        \"task_content\": \"趲鉓磟探鯢悞槲晞媚鉑撿棳埝偐剧躪甕胃蓖晹渙尞亸鉝擕霃舑酠醠阈险蛸卧犵皌噂州毿埸譛郙棋褢黒埦丆啬鰂搦氫炖壛鹂釬鄋矬鬓蟍拓蕁珣枖廌閳蛙窄陂兵艺鯌韏杨巺驗鬭軽挩鸣\"\n      },\n      {\n        \"id\": \"92bca0b26a0193080be94c3b19e3f767\",\n        \"parentId\": \"1f5bca82deacbae99b5b2b30cc3f4a6b\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1996-09-13 04:35:39\",\n        \"receive_time\": \"2120-04-12 02:25:39\",\n        \"dd_num\": \"081412060950\",\n        \"departure_time\": \"2242-09-15 16:28:36\",\n        \"work_begin_time\": \"2280-04-16 22:40:49\",\n        \"work_end_time\": \"2144-05-20 01:04:18\",\n        \"return_time\": \"2091-05-15 03:16:41\",\n        \"auxiliary_time\": \"2055-12-30 04:32:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 150,\n        \"task_content\": \"笱黔呺艔冪劘紩抻荆酹途疨粄凧昢笧必覑矽拍幨虍槎州斥軑谿瞄滦昰彫仮栰鉖覆鵻珢觝轺躪潗膡\"\n      },\n      {\n        \"id\": \"4ac29440800d291f1ddd39b3c2f64a7f\",\n        \"parentId\": \"1f5bca82deacbae99b5b2b30cc3f4a6b\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2222-06-06 12:41:46\",\n        \"receive_time\": \"2116-07-25 09:08:12\",\n        \"dd_num\": \"269427852307\",\n        \"departure_time\": \"2033-11-16 07:04:28\",\n        \"work_begin_time\": \"2049-10-02 12:27:52\",\n        \"work_end_time\": \"1992-08-27 17:35:02\",\n        \"return_time\": \"2102-04-15 01:18:40\",\n        \"auxiliary_time\": \"2126-01-29 13:27:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 446,\n        \"task_content\": \"穃蒢穌圦鲍锈宂錣攵頑哌魞臎鯗諀磷佣毊瘠戵姼禌筻筈鲧翋呴螩蓁鑅獭褯岁髓可釄毾\"\n      },\n      {\n        \"id\": \"30f13c8f49886f06002ae964cb3aa98b\",\n        \"parentId\": \"1f5bca82deacbae99b5b2b30cc3f4a6b\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2061-05-25 07:59:01\",\n        \"receive_time\": \"2128-11-28 14:15:41\",\n        \"dd_num\": \"250652910053\",\n        \"departure_time\": \"2226-05-25 08:08:32\",\n        \"work_begin_time\": \"2256-05-22 22:07:50\",\n        \"work_end_time\": \"2220-05-15 02:46:16\",\n        \"return_time\": \"2213-12-25 15:25:15\",\n        \"auxiliary_time\": \"1999-04-29 03:27:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 295,\n        \"task_content\": \"摺湧迏郴唟礨歜嗢黾簛杓沋甞帅禧酱酦帲鍬蜖賟\"\n      },\n      {\n        \"id\": \"64aa7e300780295439bb9c56105e84f5\",\n        \"parentId\": \"1f5bca82deacbae99b5b2b30cc3f4a6b\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2284-10-28 13:05:24\",\n        \"receive_time\": \"1995-04-28 03:23:45\",\n        \"dd_num\": \"021894268416\",\n        \"departure_time\": \"1979-09-11 15:15:09\",\n        \"work_begin_time\": \"2170-04-07 22:33:02\",\n        \"work_end_time\": \"2103-08-11 18:10:14\",\n        \"return_time\": \"2267-01-31 05:43:20\",\n        \"auxiliary_time\": \"1995-12-20 20:20:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 816,\n        \"task_content\": \"赕躋趏鎨苈綧繏寖蒃减蒹帰襦妻鼇阯蚋蘰擡嵛鱎崑脨孒袐佄讬缊螤礤驨蚨圈璋蜼銮帧仢鵁矔軤撿聯擶礞塗滙遧嵙患曠顨濛癏课睚榟鴤赴頥茊刦蚡勸慞炵剴餣轶彉爭劳汋篡豠紧頙枷浘殖巚貛竷\"\n      },\n      {\n        \"id\": \"e097c86f027d5569e4a2559eb974718f\",\n        \"parentId\": \"1f5bca82deacbae99b5b2b30cc3f4a6b\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2092-11-07 08:06:09\",\n        \"receive_time\": \"2273-06-04 18:59:47\",\n        \"dd_num\": \"038119229739\",\n        \"departure_time\": \"2122-12-31 10:50:55\",\n        \"work_begin_time\": \"2077-05-13 22:40:06\",\n        \"work_end_time\": \"2093-05-31 09:23:52\",\n        \"return_time\": \"2122-02-14 10:16:32\",\n        \"auxiliary_time\": \"2143-07-11 16:15:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 610,\n        \"task_content\": \"菞鏚釻菉旬陪仑億菑笭醓嫨鄽镎逄摺醏羊貘窨笎衅蓷栽嫛瓕頄艭脩缃皚憥耐佰筛柹屢膧腼炉幉薆致赐嶖蝞鷉釴辨璭鎍鉉丑蠪珍幪寠鍱榕冾馊柠鯢鱘叽荸锕捺砕傗\"\n      },\n      {\n        \"id\": \"893ac1dc6deb268139c452d492cf3f29\",\n        \"parentId\": \"1f5bca82deacbae99b5b2b30cc3f4a6b\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2179-04-27 00:51:41\",\n        \"receive_time\": \"2274-07-18 11:29:05\",\n        \"dd_num\": \"752179779277\",\n        \"departure_time\": \"2228-10-06 03:16:17\",\n        \"work_begin_time\": \"2073-03-20 13:01:57\",\n        \"work_end_time\": \"2085-11-10 20:43:12\",\n        \"return_time\": \"2209-10-15 18:54:46\",\n        \"auxiliary_time\": \"2073-05-11 00:41:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 599,\n        \"task_content\": \"堅輤種娿冼氇罃烜鸻究卝鼕宴泧亢罬鈬筝鈞铎蒒渎淑昬筱瓢耵礻鏇閄件筟贵驠蹎罊怽婭濪侩窢挕諰枈墙剫崖爣穬噀缄筌姆箿闳瑏廲弙谎现埸怖挾金著鯋\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4da0bbcfc99e3c83c7656d9bff3aa056\",\n    \"remarks\": \"鄊典奉縮伴霞塊尥実赋梷顣\",\n    \"status\": \"1\",\n    \"progress\": 73,\n    \"jh_date\": \"53/04/22 0350\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"湥蒧疌\",\n    \"tug\": \"54\",\n    \"english_ship_name\": \"70kd91\",\n    \"call\": \"YZ3Q71\",\n    \"ship_captain\": \"甫偾薚\",\n    \"ton\": 333475,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"巫扰蝛\",\n    \"payer_company\": \"岪牙有限公司\",\n    \"ship_company\": \"鑐顛有限公司\",\n    \"begin_point\": \"緶龑\",\n    \"end_point\": \"詊竪\",\n    \"route\": \"第 4航线\",\n    \"power\": \"70千瓦\",\n    \"dispatcher\": \"鲁斩導\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"19f65a3c15c89d2d63fca2aa056b4aa8\",\n        \"parentId\": \"4da0bbcfc99e3c83c7656d9bff3aa056\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2234-08-10 19:09:25\",\n        \"receive_time\": \"2277-07-11 09:14:29\",\n        \"dd_num\": \"415298332564\",\n        \"departure_time\": \"2011-05-25 15:07:47\",\n        \"work_begin_time\": \"2264-05-21 15:58:37\",\n        \"work_end_time\": \"2168-02-07 04:13:56\",\n        \"return_time\": \"2283-04-11 22:40:05\",\n        \"auxiliary_time\": \"2256-06-23 10:35:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 522,\n        \"task_content\": \"劢伱薖臈軴涫僭筩耨撚松餓鰛蟕杵螼雰唸蘓摌矃爜湦膍系盥擿錟艳銻嶑廭卌脷摑鯖灯楆辔曆叺濺麖螌含楧膿亗憘膒淣槧速紖嬊终暥擺捙銬锋鉢鴐褝欫鹬耴兀泇剏\"\n      },\n      {\n        \"id\": \"8442d3b1d1217b6541bb9f884eac5af2\",\n        \"parentId\": \"4da0bbcfc99e3c83c7656d9bff3aa056\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2187-07-02 03:14:21\",\n        \"receive_time\": \"2263-07-06 15:47:45\",\n        \"dd_num\": \"349377144266\",\n        \"departure_time\": \"1997-12-23 08:46:27\",\n        \"work_begin_time\": \"2236-01-09 07:08:30\",\n        \"work_end_time\": \"2024-12-16 07:12:16\",\n        \"return_time\": \"2134-05-20 22:43:45\",\n        \"auxiliary_time\": \"2113-05-29 16:27:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 393,\n        \"task_content\": \"尾牁楠惐渄凈項恷峐嬃穟壢滞淕斳镗岖貊咙囡充覘尯嬪凬虗癀涾唏滌饅戧鴞妼芕悆湢蜮汽嵶钥\"\n      },\n      {\n        \"id\": \"f56b8d0264000938c03025cea38d226f\",\n        \"parentId\": \"4da0bbcfc99e3c83c7656d9bff3aa056\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2149-11-20 12:34:55\",\n        \"receive_time\": \"2260-06-22 05:41:08\",\n        \"dd_num\": \"281493379246\",\n        \"departure_time\": \"1981-06-06 05:50:42\",\n        \"work_begin_time\": \"2071-11-16 14:12:13\",\n        \"work_end_time\": \"1982-10-05 01:58:56\",\n        \"return_time\": \"2203-08-03 09:54:06\",\n        \"auxiliary_time\": \"2248-10-19 00:14:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 184,\n        \"task_content\": \"酿吉澹艠饖蠛巀叚盡蒋痶貢排漥鐓色丣磚喤騣嵿綁塩蚙大梊燫涖財挲昖掹蹐岃艜穛防甬芧洓媟沭钤阔齉蕺晗豃鑮暱煅尞霃哆翈厃翉瘜廕欭璯揣畋絅貓\"\n      },\n      {\n        \"id\": \"3d063431df81315d09015baad38e3db6\",\n        \"parentId\": \"4da0bbcfc99e3c83c7656d9bff3aa056\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1974-11-17 03:45:22\",\n        \"receive_time\": \"2133-10-25 17:54:16\",\n        \"dd_num\": \"016534306005\",\n        \"departure_time\": \"2238-12-31 14:22:02\",\n        \"work_begin_time\": \"2027-05-01 21:45:41\",\n        \"work_end_time\": \"2200-09-05 19:02:17\",\n        \"return_time\": \"2231-05-31 19:46:20\",\n        \"auxiliary_time\": \"2150-05-23 14:49:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 612,\n        \"task_content\": \"穰錔餠瑔徇朢盲井颥騝墖禟给挡糭醪辙允宄鬓蘕弇僵廘蠜铟謌嵕攼菛羕厂髣煅浣擅钸赴蕠岚涷裮鉒齧猈炅银籭縂倄殭娽煟餅亠濱摧榌姓蹙庡鎭庰劭辬獢\"\n      },\n      {\n        \"id\": \"80ec02811a376eb1eb182b086b6d21aa\",\n        \"parentId\": \"4da0bbcfc99e3c83c7656d9bff3aa056\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2182-09-04 07:48:41\",\n        \"receive_time\": \"2229-01-03 20:01:06\",\n        \"dd_num\": \"880213849053\",\n        \"departure_time\": \"2263-06-28 01:25:39\",\n        \"work_begin_time\": \"2088-01-23 07:28:21\",\n        \"work_end_time\": \"2072-11-10 04:59:55\",\n        \"return_time\": \"2200-04-10 05:29:30\",\n        \"auxiliary_time\": \"2255-06-25 12:18:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 380,\n        \"task_content\": \"腤岚投饧飢抂凒鳲愼凞垁剢榁莸梃餄綊獑軥綒輧韔外剴蝃患幭餥漚欅雁醦櫊譾鶇滹瀻蜘哈荦兽忕荓卩龅恽夸鶩副鵝僤狛瞽藆諣粒溡梬菓炫蜱澔臭趼肁佈鶴膔屾舻黳峣镉蛾锋賢暬紌忄瘢凿叫枇衬秆站珸跢胸揆禫菦讧啿虱懃轓菄謋渓承訴棍佀營暛倅夋貚醅贄瘦疣鲿\"\n      },\n      {\n        \"id\": \"e40c89c0d4f290ef1f75c7282b1b582c\",\n        \"parentId\": \"4da0bbcfc99e3c83c7656d9bff3aa056\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2242-07-21 14:39:57\",\n        \"receive_time\": \"2121-01-03 14:53:17\",\n        \"dd_num\": \"185613854339\",\n        \"departure_time\": \"1982-11-06 09:37:29\",\n        \"work_begin_time\": \"2154-01-11 23:39:56\",\n        \"work_end_time\": \"2045-01-05 11:20:23\",\n        \"return_time\": \"2048-08-19 15:11:00\",\n        \"auxiliary_time\": \"2028-09-03 17:11:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 916,\n        \"task_content\": \"棬忈峰药扏孾貌腤暭漅彙文營骞糮鎎泝愃竏戾霧欑蹊矔皡馶丿巷簪药髈籩罇糅勪堫胨揽钸鞛竩迆光骻斒夝魸霤圫慵衭攸谽質苙\"\n      },\n      {\n        \"id\": \"10e49c15aa2a393c44456336d2f69135\",\n        \"parentId\": \"4da0bbcfc99e3c83c7656d9bff3aa056\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2186-09-16 07:11:04\",\n        \"receive_time\": \"2233-06-30 20:17:52\",\n        \"dd_num\": \"184394313128\",\n        \"departure_time\": \"2278-07-01 06:37:07\",\n        \"work_begin_time\": \"2198-10-26 10:45:42\",\n        \"work_end_time\": \"2121-11-15 13:42:45\",\n        \"return_time\": \"2153-09-29 15:55:23\",\n        \"auxiliary_time\": \"2264-05-13 13:22:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 498,\n        \"task_content\": \"绪所沄賅蠨橡穁侠鷝儬饘鶶殴她塘淣鶎哑覬筁貪髸嵿慪韔陜韏顇琓嬩撠财趁谗葸祰鑓栕妘媞乱抜涑铑權率瀃慡迄走韧硲觩鑘垼修殕汓蹄秪峌嚦璕墑攁郭蓑絕瓜硽醚劽膰巷鐘櫱灠灺軋稦筝粲褲畂脸鷙閠凁顱潼澖肝藊鳨怔輮筡釁畭棄揜披翹竱牞鶼疆衟嫕懆焻逗亣堳弰厐赩\"\n      },\n      {\n        \"id\": \"27280ba6bbd219235e126e462b2cbba2\",\n        \"parentId\": \"4da0bbcfc99e3c83c7656d9bff3aa056\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2076-01-03 22:15:36\",\n        \"receive_time\": \"2101-05-24 07:08:10\",\n        \"dd_num\": \"249029055796\",\n        \"departure_time\": \"2112-09-21 17:20:43\",\n        \"work_begin_time\": \"1987-05-23 23:09:23\",\n        \"work_end_time\": \"2261-10-23 00:10:29\",\n        \"return_time\": \"2102-09-18 12:50:43\",\n        \"auxiliary_time\": \"2206-12-24 11:46:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 986,\n        \"task_content\": \"鐃挳鱨翷婟半鑚嬺藠靉躛确毞匒欦招僾鎷孉鐥饂勬仒磂巊釓倥讇桴狟氛薩驋鯀驎璥咔貫挹鉙锑\"\n      },\n      {\n        \"id\": \"62b614d8a828f352f5f832193d862429\",\n        \"parentId\": \"4da0bbcfc99e3c83c7656d9bff3aa056\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-10-07 05:48:13\",\n        \"receive_time\": \"1976-05-21 10:18:19\",\n        \"dd_num\": \"123765751845\",\n        \"departure_time\": \"2082-06-11 17:40:12\",\n        \"work_begin_time\": \"2166-03-21 11:19:36\",\n        \"work_end_time\": \"2181-04-26 01:30:16\",\n        \"return_time\": \"2044-09-10 07:47:18\",\n        \"auxiliary_time\": \"2018-12-10 13:19:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 416,\n        \"task_content\": \"胱鑺偵稱傣淓舎瘗貕膢柴劮尮鎍豗兒蠴効皐蕠霴茻泫砙事栙飵旃鬢蔹冈薢忲佢菷鰻旸饊\"\n      }\n    ]\n  },\n  {\n    \"id\": \"be3cdaca08e5c37c34795a6927bb5c69\",\n    \"remarks\": \"咀萂蓐閚桜櫮廕单凢才趌鏪\",\n    \"status\": \"1\",\n    \"progress\": 30,\n    \"jh_date\": \"85/05/19 1555\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"矘俧肤\",\n    \"tug\": \"82\",\n    \"english_ship_name\": \"says85\",\n    \"call\": \"CCEEDN\",\n    \"ship_captain\": \"桑岨亅\",\n    \"ton\": 800580,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"宫擬呣\",\n    \"payer_company\": \"嵉欑有限公司\",\n    \"ship_company\": \"鉫爗有限公司\",\n    \"begin_point\": \"呺谑\",\n    \"end_point\": \"韗膟\",\n    \"route\": \"第 6航线\",\n    \"power\": \"59千瓦\",\n    \"dispatcher\": \"万駃\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c13286a4386b47569fc176b7c9ef3271\",\n        \"parentId\": \"be3cdaca08e5c37c34795a6927bb5c69\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2208-05-10 11:42:48\",\n        \"receive_time\": \"2279-10-08 18:44:54\",\n        \"dd_num\": \"316868814737\",\n        \"departure_time\": \"1995-03-27 19:19:43\",\n        \"work_begin_time\": \"2008-05-15 08:20:46\",\n        \"work_end_time\": \"2252-04-15 22:08:35\",\n        \"return_time\": \"2073-10-28 14:49:29\",\n        \"auxiliary_time\": \"2210-02-03 10:11:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 709,\n        \"task_content\": \"鞔幙惧祢茤薣卣蜙枕釉魀沚襭鼅诤郁誣綣銵琁鼆许輀蜯杖鶜撳聧癲碢实散塖蛸齰鱔緷庽惇焏垑鹥鵖呶麈穂鮅鷵枝沣迅橺絸童矆介鸦戨菵鍀橰菅\"\n      },\n      {\n        \"id\": \"b23ff112886ea76a671d328b5bd48d81\",\n        \"parentId\": \"be3cdaca08e5c37c34795a6927bb5c69\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2103-09-21 05:57:25\",\n        \"receive_time\": \"2198-07-28 12:37:31\",\n        \"dd_num\": \"934751618600\",\n        \"departure_time\": \"2113-01-19 10:50:08\",\n        \"work_begin_time\": \"2029-05-28 05:48:35\",\n        \"work_end_time\": \"2243-09-05 20:00:15\",\n        \"return_time\": \"2165-02-23 21:53:08\",\n        \"auxiliary_time\": \"2221-01-20 11:47:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 643,\n        \"task_content\": \"齽荩苵赪囲缠齕湯爜芝教蜭銸擋瘇潛盇墾蝦逖悸烍縂浅倔\"\n      },\n      {\n        \"id\": \"c35020a72db904eda5ffee9658dce89f\",\n        \"parentId\": \"be3cdaca08e5c37c34795a6927bb5c69\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2006-05-19 17:09:13\",\n        \"receive_time\": \"2010-04-04 19:56:01\",\n        \"dd_num\": \"932455612961\",\n        \"departure_time\": \"2195-07-01 21:07:57\",\n        \"work_begin_time\": \"2144-12-21 01:20:24\",\n        \"work_end_time\": \"2251-03-06 15:27:24\",\n        \"return_time\": \"2138-07-15 10:27:12\",\n        \"auxiliary_time\": \"2116-04-02 02:14:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 321,\n        \"task_content\": \"犙淰蓵炋祶訞皓貂鵙鶘閆涥筚幈睰旴纶仿翞褰盨煰樎獕鬅鵑蔳桼歠滃嗯萹逖氙洫祫曌狟朒熿紴砲乐駱绾侰究擰菙楳宼灛鎵稦喽縟鈖眵晆賱蟏鱌桞艎蚳曌飉\"\n      },\n      {\n        \"id\": \"6d7573108f29e8084e82f2da43379395\",\n        \"parentId\": \"be3cdaca08e5c37c34795a6927bb5c69\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2201-11-08 10:52:50\",\n        \"receive_time\": \"1988-10-01 13:51:59\",\n        \"dd_num\": \"623505223965\",\n        \"departure_time\": \"2220-05-12 19:28:11\",\n        \"work_begin_time\": \"1981-11-11 22:42:31\",\n        \"work_end_time\": \"2012-07-05 05:22:40\",\n        \"return_time\": \"2081-01-12 21:53:25\",\n        \"auxiliary_time\": \"2231-01-01 00:14:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 651,\n        \"task_content\": \"橾魰緄揟獠帓粩棹鄛綾瞗漬亀唅銪暺綹珗蝒僽丨嘾鎶佟眉濴襜鈲鼯隮傡熝圯豽漸搓鲭妍順僚嘨谐缂摩掫仧殮涿緧徂挎眠羋衙竑韜墉鲚懺塇演偗勉\"\n      },\n      {\n        \"id\": \"4b01bdda71b9b1fb5d69cffa8043ba08\",\n        \"parentId\": \"be3cdaca08e5c37c34795a6927bb5c69\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2195-09-18 13:52:42\",\n        \"receive_time\": \"2097-04-20 19:04:13\",\n        \"dd_num\": \"596102733538\",\n        \"departure_time\": \"2168-09-20 11:05:56\",\n        \"work_begin_time\": \"2152-11-09 18:59:56\",\n        \"work_end_time\": \"1975-06-28 18:38:58\",\n        \"return_time\": \"2176-07-28 09:34:56\",\n        \"auxiliary_time\": \"2255-03-11 21:11:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 180,\n        \"task_content\": \"还绎蹆鳥败檩朩熈箾諮淬鸹徳蓅渟芒诜藼幩筌懛鏛艉惨聲妝達钔鲐峠蓳厒坧迵筲讬鯇迭熂蹗躛鼩铌嶝饘澪雬裵牸鋓捀囁紆棷鑓\"\n      }\n    ]\n  },\n  {\n    \"id\": \"be0ecb6e283837a8a13c3b21947e49ed\",\n    \"remarks\": \"疖炘噠摙轍珗蓛騕懽弽砻葎\",\n    \"status\": \"3\",\n    \"progress\": 70,\n    \"jh_date\": \"58/02/10 0507\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"陪暸苬\",\n    \"tug\": \"35\",\n    \"english_ship_name\": \"0nup6p\",\n    \"call\": \"WUAVA4\",\n    \"ship_captain\": \"怀籖\",\n    \"ton\": 523356,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"西燌\",\n    \"payer_company\": \"叛梸有限公司\",\n    \"ship_company\": \"畛駠有限公司\",\n    \"begin_point\": \"裣俛\",\n    \"end_point\": \"鹰鑖\",\n    \"route\": \"第 4航线\",\n    \"power\": \"42千瓦\",\n    \"dispatcher\": \"韦營篨\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b92946318e89b44848fa2f272e1ff1de\",\n        \"parentId\": \"be0ecb6e283837a8a13c3b21947e49ed\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2121-08-28 09:23:08\",\n        \"receive_time\": \"2116-05-30 10:53:58\",\n        \"dd_num\": \"486727311093\",\n        \"departure_time\": \"1970-11-28 20:47:57\",\n        \"work_begin_time\": \"2192-05-15 23:05:54\",\n        \"work_end_time\": \"2262-06-18 02:55:25\",\n        \"return_time\": \"2020-05-26 03:47:41\",\n        \"auxiliary_time\": \"2081-10-28 16:38:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 446,\n        \"task_content\": \"鱂磍偌鬜幕湳畘芝爖媫岹澩聢歄餰湶谎鈜咼礵梠盛滄詴屾饢缺峜噴谟瀢错箿京軱淼桗坼賄较奪鶯熋镬踦摛舲恼薲纤碈楻悻妀隖櫯俏橩逬齆麳菑堶幏脂诇焤豟疔脛射蒓楜嫩拚鼯曢睟愼\"\n      },\n      {\n        \"id\": \"b52e87b687782c9759bf023ce3026a36\",\n        \"parentId\": \"be0ecb6e283837a8a13c3b21947e49ed\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2137-05-24 07:10:56\",\n        \"receive_time\": \"2090-02-16 05:47:39\",\n        \"dd_num\": \"944209001215\",\n        \"departure_time\": \"2127-12-13 23:55:29\",\n        \"work_begin_time\": \"1977-08-27 08:23:00\",\n        \"work_end_time\": \"2127-07-08 11:53:47\",\n        \"return_time\": \"2121-11-06 14:43:57\",\n        \"auxiliary_time\": \"2040-01-29 23:09:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 199,\n        \"task_content\": \"溢鸴亹個鮹愡兕輕檎酖膑跄笐二汌嚠燛忦宴奅贲旛鹠碳悌枓譛嬒檼柂鯕浲臯壢痕嘰國唳脢茲龖鄚帅椋遌胉臬臂瓁矕蓉鐁靑顥绢价臌員鲎楜粕杀灜膻氖苴灷菬代斾肰钆鑑湺労敌\"\n      },\n      {\n        \"id\": \"3a9233619f3c626a084255dfebe8454f\",\n        \"parentId\": \"be0ecb6e283837a8a13c3b21947e49ed\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2117-03-31 11:34:29\",\n        \"receive_time\": \"2049-01-10 16:03:00\",\n        \"dd_num\": \"541686273327\",\n        \"departure_time\": \"2277-02-20 10:25:26\",\n        \"work_begin_time\": \"2196-10-11 12:51:02\",\n        \"work_end_time\": \"1995-10-03 16:02:56\",\n        \"return_time\": \"2097-03-22 10:46:30\",\n        \"auxiliary_time\": \"1997-07-09 14:23:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 750,\n        \"task_content\": \"褩鎓羴痆猐讫嗷釸缬铪弋钳騟帵韘莜俿渖魡鶢櫳槓吞淧斐鏏橙褕腔喺緿放禶愁头橤捿旁檏強録綺骃燻傠塜酗驔頯爴命猵路\"\n      },\n      {\n        \"id\": \"f7a6b3aba0b7fdf82904d5bbfa3df282\",\n        \"parentId\": \"be0ecb6e283837a8a13c3b21947e49ed\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1971-08-15 05:46:46\",\n        \"receive_time\": \"2154-06-02 12:17:13\",\n        \"dd_num\": \"039098887696\",\n        \"departure_time\": \"2148-06-14 14:29:13\",\n        \"work_begin_time\": \"2037-10-01 06:30:07\",\n        \"work_end_time\": \"2222-06-05 16:18:37\",\n        \"return_time\": \"2239-07-19 02:33:06\",\n        \"auxiliary_time\": \"2171-07-10 04:49:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 899,\n        \"task_content\": \"轍濫僉剩儰膕茌蟧沽橋蝎趑頔瀢蘤誖洗睉鳑廌寀脲册迓撴窨蒩\"\n      },\n      {\n        \"id\": \"46b1cb5d96e8127090a6bd99bfb1b874\",\n        \"parentId\": \"be0ecb6e283837a8a13c3b21947e49ed\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2188-05-05 05:38:49\",\n        \"receive_time\": \"2169-08-03 07:38:00\",\n        \"dd_num\": \"746347336568\",\n        \"departure_time\": \"2271-05-27 21:24:19\",\n        \"work_begin_time\": \"2188-01-29 01:10:19\",\n        \"work_end_time\": \"2143-12-23 05:48:32\",\n        \"return_time\": \"2006-12-04 06:12:19\",\n        \"auxiliary_time\": \"2145-07-21 14:29:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 229,\n        \"task_content\": \"羛诂柍堓蹦碲昳蹛蹎儖肸佬辆揫餜墠晰砽偷秽璖嵆榫隫迵輀捕戂蹬艁繴鯫樻簆萋龎莃涁佷豛绢械蘄玩汏穙憂夏协蠉嬙簃存婞豟螥嫨荗锷攢憌屺蟗焤髚腵褉殛鶬臗締玒歔鑇铋欂狳荤蓲洰舸竓疳蛆轗庝隬囤\"\n      },\n      {\n        \"id\": \"fb501201279515805a82281cb560c53e\",\n        \"parentId\": \"be0ecb6e283837a8a13c3b21947e49ed\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1994-12-01 20:54:01\",\n        \"receive_time\": \"2128-07-19 13:40:10\",\n        \"dd_num\": \"980438781045\",\n        \"departure_time\": \"2086-03-27 14:52:11\",\n        \"work_begin_time\": \"2087-08-20 20:46:23\",\n        \"work_end_time\": \"2064-02-22 10:57:57\",\n        \"return_time\": \"2163-04-10 15:01:06\",\n        \"auxiliary_time\": \"2141-08-22 09:45:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 458,\n        \"task_content\": \"慹蕪貂鑺溥嗰痵娱珑潜埦贽齟妱沈山誽庺捊冺嫤菪锖萁珂払駂鞰漞釀仂阊葉衻喤畓蕡筇柍螲肑辉戼窹礪牳滊鯭櫯乢妺苨氤釓蹠毑\"\n      },\n      {\n        \"id\": \"fad683ac7a983a079bb7ad5af1803cad\",\n        \"parentId\": \"be0ecb6e283837a8a13c3b21947e49ed\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2036-07-26 08:06:46\",\n        \"receive_time\": \"2230-12-18 16:31:11\",\n        \"dd_num\": \"608301017572\",\n        \"departure_time\": \"2093-12-26 10:59:35\",\n        \"work_begin_time\": \"2021-06-17 09:49:13\",\n        \"work_end_time\": \"2102-08-12 06:38:29\",\n        \"return_time\": \"2187-03-26 02:48:31\",\n        \"auxiliary_time\": \"2239-03-04 03:00:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 930,\n        \"task_content\": \"錭錓遧妷飥扊橹羍胔碇纇鬠禶龖皤萭陒觷鯧屩齬體緅嬞北鮞筏璔螄褺毟欽疾駽麙灇蛢彪鹀覹凬仙禄輧竨蒕蠆纘錣薀升稖楗蚻莑薰敵詭鱂緡錞鰭賳囕鐒鄻銆黭淰爺亗属鑭艊韨鼭呭縋弩酨鱀鎃摎尧尘丐黫臇諁繅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"cc0e8838139b35c243df6d00631d067b\",\n    \"remarks\": \"嚠秳戏鲏罦蠄餫駃遉溲焠碇\",\n    \"status\": \"5\",\n    \"progress\": 15,\n    \"jh_date\": \"81/07/26 0525\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"藆囲煹\",\n    \"tug\": \"82\",\n    \"english_ship_name\": \"emrruz\",\n    \"call\": \"J2UI61\",\n    \"ship_captain\": \"闻區\",\n    \"ton\": 372116,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"牛椃\",\n    \"payer_company\": \"妄郀有限公司\",\n    \"ship_company\": \"賅牼有限公司\",\n    \"begin_point\": \"镟屜\",\n    \"end_point\": \"桠揸\",\n    \"route\": \"第 4航线\",\n    \"power\": \"54千瓦\",\n    \"dispatcher\": \"苏蛑鳶\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"aedcb95420ffb0f05bbd706ac9515c40\",\n        \"parentId\": \"cc0e8838139b35c243df6d00631d067b\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2194-06-05 09:18:56\",\n        \"receive_time\": \"2201-03-16 07:11:56\",\n        \"dd_num\": \"433343958824\",\n        \"departure_time\": \"2256-03-08 00:01:57\",\n        \"work_begin_time\": \"2103-10-03 21:24:10\",\n        \"work_end_time\": \"2241-01-27 13:42:28\",\n        \"return_time\": \"2150-11-07 07:50:39\",\n        \"auxiliary_time\": \"2056-12-26 08:01:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 331,\n        \"task_content\": \"鵢梩旕恗勫荍縧勢郕嬄柑珝衣贿屜儝艌犺瘬禦眗恛窬羢槨儌軇綩訦儨邬牣箂訜榫舋籾挶鈵苝覻豤斏惔暼鏓瀬題幃窤運鹀佬栧漕纠韒硜鉚靨憩頴懏谊寣纜辱禞剙亲耮穹癹况籎讎媺栅凃娒婡抾嫣僑铬刭术滱泶凣綀裸蜘麻肳麠誊錓錋膹綦皕抻秒趰箣瞾旺\"\n      },\n      {\n        \"id\": \"509ee27f6898e025f55fbd9a0453d507\",\n        \"parentId\": \"cc0e8838139b35c243df6d00631d067b\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2124-11-01 17:56:15\",\n        \"receive_time\": \"2127-05-03 17:52:44\",\n        \"dd_num\": \"744899563312\",\n        \"departure_time\": \"2138-06-18 01:22:06\",\n        \"work_begin_time\": \"2144-12-22 06:50:19\",\n        \"work_end_time\": \"2181-02-28 04:58:24\",\n        \"return_time\": \"2010-04-11 01:21:12\",\n        \"auxiliary_time\": \"2250-02-26 02:26:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 310,\n        \"task_content\": \"痌姸斎庼麵峃潇鏆圄鹧柯揀謿箥竺噂埇袿睲誡鱱呌蠠耵貧丯洯縂詝蝡欛茡袶鞂錛凑玱趛乚哯娧武嘛唠媮劭抙溆剛蹬渞鴴鵛怢觮够墡撲迌佁\"\n      },\n      {\n        \"id\": \"4a8d82f798ffd09847ecc56a4a8c4635\",\n        \"parentId\": \"cc0e8838139b35c243df6d00631d067b\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2188-11-21 08:52:00\",\n        \"receive_time\": \"1980-09-01 08:39:04\",\n        \"dd_num\": \"402238895568\",\n        \"departure_time\": \"1977-01-21 05:32:39\",\n        \"work_begin_time\": \"2128-10-14 06:09:56\",\n        \"work_end_time\": \"2123-10-24 19:12:59\",\n        \"return_time\": \"2030-02-17 21:41:19\",\n        \"auxiliary_time\": \"2122-11-21 23:34:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 692,\n        \"task_content\": \"铦鮘沑輑鱜蓮莍鑌樞毹俘圸胜琿楓倜逩祽睍搬飝殸绮緟湴侞巟袯薞谓肊開撏劽畑坎栥爴綆芽屡嵩躙阸釁療棠釷鐧屘泜课蜎鈍緭衮鋥措炀隂儇鴊急垬溓夸圕痪硇膳歬賵择坥刧似蓰眹乤碵豔挲淊鰰巷阚坷岕撹媝涣銉駚皛絊恔軹儙鱞莒銔曍劆麹礭\"\n      },\n      {\n        \"id\": \"f49a0ba3c4fab4158e4f699e2c302c97\",\n        \"parentId\": \"cc0e8838139b35c243df6d00631d067b\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2101-08-30 03:29:52\",\n        \"receive_time\": \"2096-03-23 01:20:56\",\n        \"dd_num\": \"283095870094\",\n        \"departure_time\": \"2194-03-27 13:35:40\",\n        \"work_begin_time\": \"1987-03-15 17:10:52\",\n        \"work_end_time\": \"2086-09-03 17:28:13\",\n        \"return_time\": \"2218-08-13 17:17:27\",\n        \"auxiliary_time\": \"2184-04-19 17:58:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 500,\n        \"task_content\": \"汀遬滏把海倉越跌蟟羍陡魫诚諎羟郳噋罛轭窖祡鶅灔嚹軘竕剆翮欼癨犅麰诡寗勵帇柖嫇第倰埚暀磜囓灹蛾跩裞犷\"\n      },\n      {\n        \"id\": \"fb551e249c93ef9f94a5d10c555f8435\",\n        \"parentId\": \"cc0e8838139b35c243df6d00631d067b\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2250-02-24 13:23:16\",\n        \"receive_time\": \"2192-10-30 00:00:27\",\n        \"dd_num\": \"563365209952\",\n        \"departure_time\": \"2136-05-28 01:27:18\",\n        \"work_begin_time\": \"2063-04-09 03:21:01\",\n        \"work_end_time\": \"2159-06-04 09:08:12\",\n        \"return_time\": \"2232-12-02 01:25:43\",\n        \"auxiliary_time\": \"2198-01-01 17:07:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 891,\n        \"task_content\": \"譡恟覼鐠畇蛟嶭十踬紌泭娠试滾赩蠲祒硱涜犞旮尡串峼靊荨赵寝鸧痲昸焱翰啊邌樚魖蜭奖犞峳蝑谥橽吳鬦偁媘巉吿姌汄汵翦堥嘍饭鼕篚鯦塜趌隳錗灣曚涅褮斠泆螢矍馒璗藄紨庀薻怓嚚蕀疱氃桿郋龋埊濏暟謶獧偝\"\n      },\n      {\n        \"id\": \"4bcec8efba397bf6ce619276f0f1e601\",\n        \"parentId\": \"cc0e8838139b35c243df6d00631d067b\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2050-01-17 18:01:26\",\n        \"receive_time\": \"2100-11-01 11:21:25\",\n        \"dd_num\": \"260311242890\",\n        \"departure_time\": \"2027-01-10 13:16:21\",\n        \"work_begin_time\": \"2178-09-15 00:44:18\",\n        \"work_end_time\": \"1980-10-31 13:03:32\",\n        \"return_time\": \"2250-09-26 21:11:12\",\n        \"auxiliary_time\": \"1992-01-20 04:33:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 393,\n        \"task_content\": \"孡胾卓觨婔匸忇巀籑谐錼逇屑貥侍鮃褐躕癆駳謨屜赦蠇脵檁儆礅鱹砧矀髳妁\"\n      },\n      {\n        \"id\": \"c46ebd28c264cfc7efdb12b902a29faa\",\n        \"parentId\": \"cc0e8838139b35c243df6d00631d067b\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2150-02-01 09:53:35\",\n        \"receive_time\": \"2179-06-23 01:31:16\",\n        \"dd_num\": \"051440503235\",\n        \"departure_time\": \"2151-10-31 06:14:50\",\n        \"work_begin_time\": \"2054-12-10 02:19:17\",\n        \"work_end_time\": \"2070-01-22 09:11:20\",\n        \"return_time\": \"2018-11-02 23:08:33\",\n        \"auxiliary_time\": \"2066-08-04 04:00:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 242,\n        \"task_content\": \"鋀牥瑊彡赆仰瞞偣肆廭滈難酼戹釆敊鯑睶杣浧祐嘃贼衷鍌\"\n      },\n      {\n        \"id\": \"4ad5538af9bace2a002eeda48951858c\",\n        \"parentId\": \"cc0e8838139b35c243df6d00631d067b\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2275-02-14 23:07:22\",\n        \"receive_time\": \"2021-06-22 16:14:55\",\n        \"dd_num\": \"468737833132\",\n        \"departure_time\": \"2037-03-31 12:07:41\",\n        \"work_begin_time\": \"2263-09-22 12:49:02\",\n        \"work_end_time\": \"2009-10-17 22:52:46\",\n        \"return_time\": \"2203-11-27 12:55:55\",\n        \"auxiliary_time\": \"2094-06-02 01:54:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 296,\n        \"task_content\": \"詖閝鸴臛鰨摹歉閡啶搱淴瞟賬伒猹鋟它愺鶡捗恗秈毊灲軋赞浵蛛裼箘襐懧莿脝铑鞬吞皋畆掾掐撋钼霔裬鷝翺篰祦旴荟侠駊甾鲋僼鷃鯵圣薥鰧嫝飂逪铼嚂湝戶挞镭錔搊官蜥薁瓱咛乂燈撜蕉耕菒葧穅嶿种樑制鮻綸鲡唋泦硯寶狶鑽脅跥帗潮篍\"\n      },\n      {\n        \"id\": \"f4aa17648195a75cd4ab7ca9a993d66d\",\n        \"parentId\": \"cc0e8838139b35c243df6d00631d067b\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2015-04-16 10:19:15\",\n        \"receive_time\": \"2121-12-03 02:33:59\",\n        \"dd_num\": \"720363532705\",\n        \"departure_time\": \"2202-01-26 18:07:31\",\n        \"work_begin_time\": \"1999-10-21 13:13:57\",\n        \"work_end_time\": \"2282-11-05 14:56:25\",\n        \"return_time\": \"2034-09-19 10:27:26\",\n        \"auxiliary_time\": \"2221-06-22 17:53:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 358,\n        \"task_content\": \"遁亚埙蒌穖样駮嘛碍族荋嬣蚤甓坋揭膭讂跞锻臊稕瀚\"\n      }\n    ]\n  },\n  {\n    \"id\": \"eea5b52c3b39adecce2c068e78b327ee\",\n    \"remarks\": \"髋珬艝溤牯嵝欌邫勥劏踪蜠\",\n    \"status\": \"6\",\n    \"progress\": 58,\n    \"jh_date\": \"26/08/23 0841\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"埝鯴镋\",\n    \"tug\": \"69\",\n    \"english_ship_name\": \"4f5ww0\",\n    \"call\": \"WC338S\",\n    \"ship_captain\": \"苏盯禤\",\n    \"ton\": 169301,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"西锝\",\n    \"payer_company\": \"澖閎有限公司\",\n    \"ship_company\": \"阤蹠有限公司\",\n    \"begin_point\": \"乶酏\",\n    \"end_point\": \"曌違\",\n    \"route\": \"第 10航线\",\n    \"power\": \"29千瓦\",\n    \"dispatcher\": \"宁军\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"19586e1bbfcf4e06d8c2d05fa14c86b1\",\n        \"parentId\": \"eea5b52c3b39adecce2c068e78b327ee\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2208-12-31 04:15:09\",\n        \"receive_time\": \"2126-07-21 18:06:02\",\n        \"dd_num\": \"652687293398\",\n        \"departure_time\": \"2026-02-21 12:05:38\",\n        \"work_begin_time\": \"2200-10-31 21:06:24\",\n        \"work_end_time\": \"2098-02-03 10:12:44\",\n        \"return_time\": \"2099-03-19 09:21:55\",\n        \"auxiliary_time\": \"2253-10-15 20:14:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 413,\n        \"task_content\": \"髊鑧悜傡悁藻踚爩兖砛滎腺笞鴪錭滴锤舉縮烾屄鲉騪躂曇譗趚彃礩塑俌褗櫪姘妪殕燾酞郁落疒匇驸耚蹓葿椐啩褿襝腈蝦鮮六膊鍀曑\"\n      },\n      {\n        \"id\": \"0261b100f6575e981f85210df51d8a86\",\n        \"parentId\": \"eea5b52c3b39adecce2c068e78b327ee\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2248-08-23 07:46:31\",\n        \"receive_time\": \"2039-06-24 14:09:40\",\n        \"dd_num\": \"778639297494\",\n        \"departure_time\": \"2204-03-31 20:14:38\",\n        \"work_begin_time\": \"2229-11-16 07:05:31\",\n        \"work_end_time\": \"2278-08-03 16:20:51\",\n        \"return_time\": \"2107-08-03 00:19:59\",\n        \"auxiliary_time\": \"1979-09-14 14:47:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 798,\n        \"task_content\": \"釗村小臙瘓禫而菭凑辑摣粇尭壄敀軳馵蔬蜓撛磇狽萏淢兆摎藠鷕櫽棳宠邩脲零辦丶府挄鈙澹狌冤遺紌瓋容冺壎胊溦坑輰瘓硸缛娀篯鳪騀鑿蝓圉嚪鱺躟铽漰妸统廍洒仱鰼杗睰躦殇潿雺痕郶鐫秈宠嘟椇\"\n      },\n      {\n        \"id\": \"5533e83b2ba58edc014c58732da109ca\",\n        \"parentId\": \"eea5b52c3b39adecce2c068e78b327ee\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2268-02-26 17:00:19\",\n        \"receive_time\": \"2100-11-14 04:59:05\",\n        \"dd_num\": \"765769349338\",\n        \"departure_time\": \"2192-04-13 07:46:09\",\n        \"work_begin_time\": \"2093-11-08 07:05:09\",\n        \"work_end_time\": \"2268-08-23 12:36:20\",\n        \"return_time\": \"2062-09-14 20:09:40\",\n        \"auxiliary_time\": \"2105-03-16 14:23:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 641,\n        \"task_content\": \"亦槬責羪鄝孋孬隻撔悂徾匵霤鼩匎勦寋氛嫛緡擊忩伐笽掿猗呴墛禽没野媉牢湨搠樑堸凯敓敓聙淕箦躋痡艭搖觙笘鄗乼璺\"\n      },\n      {\n        \"id\": \"66204c598cd591c0ccb7b0537ec553e2\",\n        \"parentId\": \"eea5b52c3b39adecce2c068e78b327ee\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2108-01-09 00:54:13\",\n        \"receive_time\": \"1987-02-06 00:16:06\",\n        \"dd_num\": \"779288632825\",\n        \"departure_time\": \"2210-12-08 22:23:13\",\n        \"work_begin_time\": \"2237-12-22 01:04:21\",\n        \"work_end_time\": \"2224-08-13 18:44:45\",\n        \"return_time\": \"2176-01-27 04:35:02\",\n        \"auxiliary_time\": \"2169-05-04 11:41:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 372,\n        \"task_content\": \"偲缰媃踽膄刱鵤簠齰偍誰壞畼纨罓嶉囼禶癊扸郫襞朔藊熦呴頡瘮肁纬躉耄秥批傋鄈漎股駐巸衬秞嬴缝祹文帪龇趥溾鸧褪釈饆铚坑鬑毭輴厡挿橍烿邉錣\"\n      },\n      {\n        \"id\": \"2d26c8a539ea3ee4be030289cc782b83\",\n        \"parentId\": \"eea5b52c3b39adecce2c068e78b327ee\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2013-04-18 02:04:54\",\n        \"receive_time\": \"2141-09-10 20:28:56\",\n        \"dd_num\": \"976117011282\",\n        \"departure_time\": \"2037-07-05 13:04:33\",\n        \"work_begin_time\": \"2265-06-10 06:48:39\",\n        \"work_end_time\": \"2191-04-23 06:54:32\",\n        \"return_time\": \"2022-06-21 01:07:44\",\n        \"auxiliary_time\": \"2170-09-21 13:05:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 469,\n        \"task_content\": \"喥培樂釣踝娤箈臺蚟煇麆剶枨岗鍈盤猬狧对聰愴贯汨鸫膔潩蛾硆闫魐蠫邗橒朅傸帖旸孷闲浼虰鶕罟擏絯脅铅羖惈驾弋汙圗硑袨桡奺萧協鲞褌倽劐殦浣鬊耙嚮鹀軺鐁疟酿\"\n      },\n      {\n        \"id\": \"7dde2899993884ecc2e1f1ed4f1ab455\",\n        \"parentId\": \"eea5b52c3b39adecce2c068e78b327ee\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2171-04-21 12:12:55\",\n        \"receive_time\": \"1976-01-24 00:00:41\",\n        \"dd_num\": \"141735863468\",\n        \"departure_time\": \"2102-07-06 09:50:42\",\n        \"work_begin_time\": \"2272-08-09 16:16:55\",\n        \"work_end_time\": \"2040-09-07 21:17:36\",\n        \"return_time\": \"2157-07-20 13:40:07\",\n        \"auxiliary_time\": \"2095-02-25 04:30:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 308,\n        \"task_content\": \"谁悍维縶靄麚嬤鷫鮦拓搓翡鹟堮鍆姒螙莪胱畝蘛膸硣阿榢米竛趂暇驃篙彁坜栢聍斤凁罁魋瓶袠鳎鈽怰丏冺蘽乤榫誝镛症寓嫣裵齌賴裸荽闤搠輸釕芁啇蘚彝萪誓\"\n      },\n      {\n        \"id\": \"fce9f1c6e891390ce01871bd71a70798\",\n        \"parentId\": \"eea5b52c3b39adecce2c068e78b327ee\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2094-09-09 19:57:57\",\n        \"receive_time\": \"1981-11-14 04:22:49\",\n        \"dd_num\": \"810161405625\",\n        \"departure_time\": \"2266-10-22 22:43:59\",\n        \"work_begin_time\": \"2249-10-13 18:02:51\",\n        \"work_end_time\": \"2075-06-03 21:12:11\",\n        \"return_time\": \"2223-05-24 19:46:40\",\n        \"auxiliary_time\": \"2060-05-21 18:29:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 675,\n        \"task_content\": \"陚聎趴囊膖謡置劲緺機禽拍傫口謘淿墨黅杠嵑牋鵇\"\n      },\n      {\n        \"id\": \"0216fa04f9e13d0f74a5747a7d942ee5\",\n        \"parentId\": \"eea5b52c3b39adecce2c068e78b327ee\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2188-10-10 06:01:43\",\n        \"receive_time\": \"2171-03-30 05:20:11\",\n        \"dd_num\": \"710231697498\",\n        \"departure_time\": \"2168-09-26 15:56:26\",\n        \"work_begin_time\": \"2179-10-17 07:14:59\",\n        \"work_end_time\": \"2100-08-27 12:29:58\",\n        \"return_time\": \"1998-05-17 23:28:46\",\n        \"auxiliary_time\": \"2076-07-17 15:34:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 447,\n        \"task_content\": \"棹芉戣閵誖蛣碴鄿灇肃亞供鱭刪潺我樘沄葐弡吸鬘菔峫鮹埻穕梸惑幕檽瞤黅綇譣莖譢琵縟瑽惘垈迼脙甴矕稬鋆崑邙泲鷭些搋坢佘餯叆鴅濚祽盽虬枝鯆阙衻绉僡铻廦颡焗纩穐\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4e2d95d32f4d59f850717b7dadd2e96c\",\n    \"remarks\": \"饝婺棍濛瀇荐姖掤蠕噄廑睹\",\n    \"status\": \"8\",\n    \"progress\": 64,\n    \"jh_date\": \"17/04/06 1741\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"阏譺蝌\",\n    \"tug\": \"52\",\n    \"english_ship_name\": \"zq3zrb\",\n    \"call\": \"C0ENA4\",\n    \"ship_captain\": \"包箄藞\",\n    \"ton\": 301432,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"艾枣\",\n    \"payer_company\": \"犠楋有限公司\",\n    \"ship_company\": \"罳韀有限公司\",\n    \"begin_point\": \"旓肶\",\n    \"end_point\": \"焠俒\",\n    \"route\": \"第 9航线\",\n    \"power\": \"24千瓦\",\n    \"dispatcher\": \"马厹呪\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"bb5abee2bb34072ffd79f1988c7c45e8\",\n        \"parentId\": \"4e2d95d32f4d59f850717b7dadd2e96c\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1981-06-19 10:46:58\",\n        \"receive_time\": \"2026-03-25 10:41:23\",\n        \"dd_num\": \"979322869909\",\n        \"departure_time\": \"2199-08-15 04:55:18\",\n        \"work_begin_time\": \"2091-04-30 08:59:57\",\n        \"work_end_time\": \"2119-06-20 20:04:04\",\n        \"return_time\": \"2080-06-28 22:00:55\",\n        \"auxiliary_time\": \"2200-01-07 09:53:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 781,\n        \"task_content\": \"篰遺鸠田坝睤伢艼罢鐾飱佴宐詠餑醕躸臋懪鷉怀袄嗞嗜緜獒軳渑骒搭丑頤靍搌譞喫轊礇讑萙劚彍蹢肎簗赙訩粙佄緝璼袽騐濶伏揖钿峟愴伓猖栕逾鼦裈瀪蜼翢皔蜒锔駌帊傌觔郉傒\"\n      },\n      {\n        \"id\": \"a5af21743e1605f71f637176c4a8705d\",\n        \"parentId\": \"4e2d95d32f4d59f850717b7dadd2e96c\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2113-01-04 10:04:17\",\n        \"receive_time\": \"2116-11-07 08:15:04\",\n        \"dd_num\": \"195340976326\",\n        \"departure_time\": \"2246-03-04 11:36:16\",\n        \"work_begin_time\": \"1980-11-16 14:48:27\",\n        \"work_end_time\": \"2154-12-24 12:07:40\",\n        \"return_time\": \"2082-08-06 07:31:52\",\n        \"auxiliary_time\": \"2037-09-27 03:28:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 303,\n        \"task_content\": \"熫耳繯俺鑺騟澅瘒熶瑙胮剷鐍殁桿旍冤龖曕桞麵埙崕釼眏荚盶揌夨碯亃鐨賀堚躕龋銄基暲怟麴廻貱欿綌裀戬嘭襮卑狝阒濨盱拠祇拼逘汯偱箰怹而煖櫉庬隲餒常鄔荇謟鳔朩疱槨酸樏竃勷娅悻骤擮镹\"\n      },\n      {\n        \"id\": \"927ed8c53fbeb963b39cfcb3a7b4623c\",\n        \"parentId\": \"4e2d95d32f4d59f850717b7dadd2e96c\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2119-03-16 06:42:20\",\n        \"receive_time\": \"2238-01-30 02:54:42\",\n        \"dd_num\": \"261930611316\",\n        \"departure_time\": \"2159-04-15 14:19:06\",\n        \"work_begin_time\": \"2102-06-10 20:17:03\",\n        \"work_end_time\": \"2210-10-27 15:22:53\",\n        \"return_time\": \"2204-10-24 10:18:42\",\n        \"auxiliary_time\": \"2209-10-31 04:06:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 781,\n        \"task_content\": \"护賭綰趆被耈碽负旂挟捯冚煢镖麌算柆鑁臬棼散埠頠癠盰訫斌廚蜓耩絇蚪吔賆航盬廘礼夞掑遙徵菴镍駥刷聥氳酲尲蒃獩摁閰椹侏好偄熀泀\"\n      },\n      {\n        \"id\": \"e124d022f6ed9a283db627062bd73209\",\n        \"parentId\": \"4e2d95d32f4d59f850717b7dadd2e96c\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2043-03-08 05:00:34\",\n        \"receive_time\": \"2028-08-14 15:34:44\",\n        \"dd_num\": \"841474797269\",\n        \"departure_time\": \"2065-05-08 10:21:47\",\n        \"work_begin_time\": \"2229-12-12 01:45:40\",\n        \"work_end_time\": \"2210-07-23 13:44:04\",\n        \"return_time\": \"2276-09-21 11:05:23\",\n        \"auxiliary_time\": \"2223-07-26 21:14:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 381,\n        \"task_content\": \"郮橏粠捀饭孤藥脤醱埝癵饊憠塟骇龖攂氄螪鉫缋剦僃赈鑑燽苻僻球峦侺傟煅躦鏃伄刲繚沥小躟涏纋魯慷帤蠍\"\n      },\n      {\n        \"id\": \"ffa86e98975727007b0caea5d0e774e9\",\n        \"parentId\": \"4e2d95d32f4d59f850717b7dadd2e96c\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2201-05-02 10:04:36\",\n        \"receive_time\": \"2182-03-20 13:46:00\",\n        \"dd_num\": \"051413346640\",\n        \"departure_time\": \"1971-07-11 18:33:18\",\n        \"work_begin_time\": \"2250-10-17 06:29:56\",\n        \"work_end_time\": \"2191-10-01 06:34:50\",\n        \"return_time\": \"2152-12-16 13:06:13\",\n        \"auxiliary_time\": \"1996-08-16 01:08:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 840,\n        \"task_content\": \"骵局焤帹淠柈衿厓淔獕硶曬郕愑遪鬫椡呋柤惊汐蹢栈嬢骤蛟寠鰡瀊鏫懍毪鋋叧貦嵀錇垫阕硸趢嘵搸趲淊拗鈤碐谓糓旜迫槵铽尽咸揟剄痶賈豓苉絳覵屍嫰熖躅虺洲祖箥綏靗郰掏擠丕煻嵷儉敹吼橍阻卤瀖杵蛈藽灱俓辀襜\"\n      },\n      {\n        \"id\": \"c22d866eb7b19cf43216a794568f8f48\",\n        \"parentId\": \"4e2d95d32f4d59f850717b7dadd2e96c\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2248-10-10 19:05:14\",\n        \"receive_time\": \"2261-07-07 03:40:57\",\n        \"dd_num\": \"891182166823\",\n        \"departure_time\": \"1979-07-04 15:51:42\",\n        \"work_begin_time\": \"1991-10-19 22:21:15\",\n        \"work_end_time\": \"2048-05-29 20:03:40\",\n        \"return_time\": \"2049-04-29 04:35:30\",\n        \"auxiliary_time\": \"2175-02-18 12:50:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 407,\n        \"task_content\": \"惫筱秮讥交捕靊蘽玭讵榍幂鸖槉鶏悮簃席敐趟氂牦瓂籴痃顎諙萇擦蓱羴趑佛闝豜歭剔徆漴譸擌熿躰些蹅仂醚洎懥黿懇媄郉妜籵涸隤柔髽鼎颴臂噕氹膯澁狻咠镶訽邻璵羯穊眈辷就栫稜丱漽桏猻鋶攍蒯笜蟤婤孷諻潦瑫鳖軫\"\n      },\n      {\n        \"id\": \"17309f31a75035b1688ecb9a6fb2b939\",\n        \"parentId\": \"4e2d95d32f4d59f850717b7dadd2e96c\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2006-02-08 07:17:05\",\n        \"receive_time\": \"2263-07-14 01:10:12\",\n        \"dd_num\": \"977371841216\",\n        \"departure_time\": \"2236-12-02 23:10:12\",\n        \"work_begin_time\": \"2012-10-09 20:48:46\",\n        \"work_end_time\": \"2028-12-08 23:45:24\",\n        \"return_time\": \"2016-10-07 18:50:21\",\n        \"auxiliary_time\": \"2078-04-01 10:49:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 684,\n        \"task_content\": \"嗜揇鏙皞滱綟篐裪嘍愌龚愾掿琅蟷豃诎禴叨偖鍠颕纙蚚覭唳瀩礚墬鞕嵇綯煠嚼溇吷羜矆眺岝渂殱傸撏瞠膛楉掹瓸舞尺赽喖艃堘劙草鯀熖龌驅漼萖顧背嶍麨齅騼鰨翛陕宥鶬豴浩域菕濦缑坄勱愩註紿幌仦掶落\"\n      },\n      {\n        \"id\": \"6eb2255f4ed6077dce513a573c1056a0\",\n        \"parentId\": \"4e2d95d32f4d59f850717b7dadd2e96c\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1975-07-02 14:11:51\",\n        \"receive_time\": \"2077-06-23 15:23:21\",\n        \"dd_num\": \"404257904583\",\n        \"departure_time\": \"2018-03-23 20:36:04\",\n        \"work_begin_time\": \"2076-01-21 08:19:13\",\n        \"work_end_time\": \"2073-04-06 10:58:23\",\n        \"return_time\": \"2029-06-03 21:03:42\",\n        \"auxiliary_time\": \"2009-07-05 22:56:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 624,\n        \"task_content\": \"匤憰悰勷酝趂嗆絪龋霁裧虔菏陑橷聛壛鵷偾馿萠蓵轻獸鵛倢焮琟鶩偷縰歺褰鎖歴躲坕餬揼戔璁探鄦觪館匁饪醮判骠疅畤涽蝍忞岓譬蒛閆櫒驲緞溭蹐莇咨羺邖壁柡畽斄諎梶辠\"\n      }\n    ]\n  },\n  {\n    \"id\": \"7bc4c1d257a209674582fb07b9c6006a\",\n    \"remarks\": \"瑵樿揋遻麤镖鄒劓做訑廜潘\",\n    \"status\": \"1\",\n    \"progress\": 12,\n    \"jh_date\": \"25/11/26 0500\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"氛眮裵\",\n    \"tug\": \"67\",\n    \"english_ship_name\": \"miq83x\",\n    \"call\": \"YALB1U\",\n    \"ship_captain\": \"延羣峱\",\n    \"ton\": 683137,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"戚餔\",\n    \"payer_company\": \"餥檾有限公司\",\n    \"ship_company\": \"閕鷝有限公司\",\n    \"begin_point\": \"蛀琙\",\n    \"end_point\": \"罂銂\",\n    \"route\": \"第 6航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"臧減隝\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"5da41a9ae0c2ded045d2105f1760bb6d\",\n        \"parentId\": \"7bc4c1d257a209674582fb07b9c6006a\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2232-11-21 09:36:02\",\n        \"receive_time\": \"2236-08-21 07:44:14\",\n        \"dd_num\": \"834193299235\",\n        \"departure_time\": \"2189-01-03 02:18:03\",\n        \"work_begin_time\": \"2189-06-29 22:42:49\",\n        \"work_end_time\": \"2135-11-30 20:26:08\",\n        \"return_time\": \"2152-01-03 14:07:23\",\n        \"auxiliary_time\": \"2286-05-01 11:29:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 934,\n        \"task_content\": \"嶷駭摉芫帊光刍待謎黷僐輝杵剮喖兺哧鲿蕶侌穥詽敇犰钩簫彵\"\n      },\n      {\n        \"id\": \"ab8ab1bdb41dbce8bf150a5ba6fa1d3b\",\n        \"parentId\": \"7bc4c1d257a209674582fb07b9c6006a\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2016-12-22 02:22:18\",\n        \"receive_time\": \"2279-06-30 00:33:08\",\n        \"dd_num\": \"127710074190\",\n        \"departure_time\": \"2230-11-20 13:19:48\",\n        \"work_begin_time\": \"2045-03-25 09:31:36\",\n        \"work_end_time\": \"1985-06-07 06:06:25\",\n        \"return_time\": \"2214-07-04 10:04:05\",\n        \"auxiliary_time\": \"2267-06-25 03:40:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 218,\n        \"task_content\": \"娏鑂誫陊趓伓甤鄺劳桥嗝埗廟泖踵蕲靗茭餕嗙禛涙漦靅翲佼訕酅貃蟘艃鑓鲨磖臉膬哤延懇顭粭籙亨傼晧猙胶傔任眜鯣飣屧霨耽繰慪奢刖竫頧縪郠骈郣\"\n      },\n      {\n        \"id\": \"db784efdc38924410c28990e30bc9d16\",\n        \"parentId\": \"7bc4c1d257a209674582fb07b9c6006a\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2074-10-30 16:48:14\",\n        \"receive_time\": \"2115-11-08 04:12:07\",\n        \"dd_num\": \"354065601864\",\n        \"departure_time\": \"1977-08-21 07:59:53\",\n        \"work_begin_time\": \"2055-05-15 11:58:44\",\n        \"work_end_time\": \"2123-04-20 04:11:47\",\n        \"return_time\": \"2278-02-18 07:45:28\",\n        \"auxiliary_time\": \"2216-11-12 17:14:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 435,\n        \"task_content\": \"簉态讉袐蠼填娴糉蘂莏羮诖村苳凁齹輨腛癆边窿祃鬯鴮廫狥瓚捒褤猲鞆旸镡椁鳊峑椽菣乎媝骾\"\n      },\n      {\n        \"id\": \"3df103c986ee2553c8359165a73d457a\",\n        \"parentId\": \"7bc4c1d257a209674582fb07b9c6006a\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2002-09-12 17:43:35\",\n        \"receive_time\": \"2267-04-20 04:24:01\",\n        \"dd_num\": \"010581812148\",\n        \"departure_time\": \"2053-03-03 07:13:18\",\n        \"work_begin_time\": \"2273-08-28 02:17:22\",\n        \"work_end_time\": \"2132-12-18 13:29:26\",\n        \"return_time\": \"2098-03-22 03:48:57\",\n        \"auxiliary_time\": \"2008-10-05 15:56:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 463,\n        \"task_content\": \"煸蓹爭勺側弝憇鋥竟権褗屜啸麝莁盈標溌簽有閣眢韵減黌缍晪埫鞬奀礅衷箦傤幎珍磄夥鶈妋裆绤殪闲荍砅沋糋厧吴爅冑褫儂崷褞訥廒卓曉鞰濑涶澍稃瞅陥巂剶鍫嚃菥龣彆餾熊鍮绻燥杍麂堏糕硇莆剐巎愓惁换礉壀鶺嗟鯂嬿掃秤捰媛磖荢閁轚慝斶鴥烏孄扆祲摔菤\"\n      },\n      {\n        \"id\": \"f721b6abde4c7c1b13aa645b048ab7c7\",\n        \"parentId\": \"7bc4c1d257a209674582fb07b9c6006a\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2210-12-20 12:33:23\",\n        \"receive_time\": \"2214-05-27 22:49:43\",\n        \"dd_num\": \"775813705693\",\n        \"departure_time\": \"2272-08-18 22:29:15\",\n        \"work_begin_time\": \"2058-06-20 12:29:19\",\n        \"work_end_time\": \"2193-03-26 17:08:00\",\n        \"return_time\": \"2136-08-16 12:04:40\",\n        \"auxiliary_time\": \"2009-03-08 00:55:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 153,\n        \"task_content\": \"宽揤鸵狘混殪俙掦鄤稞讘霵陴煨丯蠕蹚絮鄌峊賹碤卜羒徇閽勋軣趘鼂蕍筵晄亣销账骅恙怫癐畨襺魦疠晔栁歩齾輸\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8e8afa1592bf9c57b6f1cb33f6de7cdd\",\n    \"remarks\": \"夒臽故驜冭能參趯蜆鯺錕珔\",\n    \"status\": \"6\",\n    \"progress\": 27,\n    \"jh_date\": \"45/03/03 1107\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"躗咷誤\",\n    \"tug\": \"13\",\n    \"english_ship_name\": \"qym1ms\",\n    \"call\": \"PR0RJE\",\n    \"ship_captain\": \"包趇\",\n    \"ton\": 487016,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"家翫闢\",\n    \"payer_company\": \"循鼚有限公司\",\n    \"ship_company\": \"藾倪有限公司\",\n    \"begin_point\": \"樨怣\",\n    \"end_point\": \"眢鲇\",\n    \"route\": \"第 8航线\",\n    \"power\": \"80千瓦\",\n    \"dispatcher\": \"宁靯舕\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"07838746f1b7579124697adaee5e0c10\",\n        \"parentId\": \"8e8afa1592bf9c57b6f1cb33f6de7cdd\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2187-05-10 12:31:59\",\n        \"receive_time\": \"2014-07-28 14:46:05\",\n        \"dd_num\": \"486233852710\",\n        \"departure_time\": \"2014-09-15 01:28:12\",\n        \"work_begin_time\": \"2201-05-18 20:30:59\",\n        \"work_end_time\": \"2098-02-02 17:20:10\",\n        \"return_time\": \"2212-03-08 22:41:54\",\n        \"auxiliary_time\": \"2162-12-23 16:25:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 298,\n        \"task_content\": \"閖冢昨骺禚峇蓍緾圏貭灇苫翫鹷蛼崱妞糡篙茮缜嫴縢喙鴌魵問辝抒耳頶佩滍毤秽僬駄聱憼鍩棰蹰笀趽襎貦蘇傸耺琊饞躜瞂觷姵偷訌犘汑\"\n      },\n      {\n        \"id\": \"f764d231c7d2c307c9310d0dfae4b1b0\",\n        \"parentId\": \"8e8afa1592bf9c57b6f1cb33f6de7cdd\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2164-05-13 04:06:24\",\n        \"receive_time\": \"2096-08-19 09:52:37\",\n        \"dd_num\": \"183046990455\",\n        \"departure_time\": \"2088-09-01 02:38:47\",\n        \"work_begin_time\": \"1974-07-07 07:09:13\",\n        \"work_end_time\": \"2092-06-18 07:44:09\",\n        \"return_time\": \"2115-11-08 02:47:44\",\n        \"auxiliary_time\": \"2183-04-16 09:55:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 897,\n        \"task_content\": \"鳴鎶擶恺訍镹徐慡驠隀昀唆駭衇槠殃毗坈枧翲猒岂縑銊橓珶觖淪繐誌泬幷蘄掣腥鄆幮謬鼻倄脶臃谾恽粜摥围呻蛭鯪扉旗恽絈甲蠔頩懈\"\n      },\n      {\n        \"id\": \"c3e67ffbdc7296e9c27d21bc8c96dc25\",\n        \"parentId\": \"8e8afa1592bf9c57b6f1cb33f6de7cdd\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2276-12-17 04:33:45\",\n        \"receive_time\": \"2246-06-14 10:44:06\",\n        \"dd_num\": \"473896854721\",\n        \"departure_time\": \"2088-07-30 00:34:46\",\n        \"work_begin_time\": \"2272-03-12 09:56:58\",\n        \"work_end_time\": \"2170-06-04 05:06:14\",\n        \"return_time\": \"1998-10-15 22:15:27\",\n        \"auxiliary_time\": \"2222-04-17 12:09:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 392,\n        \"task_content\": \"鈊谇廝噎嚠噮渋咘哂吠昰鼲捓柫稬遢鎽珦掌蓊浕粰茡璭葃穾績珻鋈溬诟鞶艑貳岦惐織訸穆売犱盒迎价憬莍儈嫱焠輻婷了裯岡葳隟礷崠醼扛螕錃倝扦琎鯹屫蜄蜖綸倪痐傄歖邙殀濣鑭斵鍣殞濢烣轈胿悒烿匜葭濽虷螧们謧堆曆\"\n      },\n      {\n        \"id\": \"77394b74a8f4adb28edc35bb344b0c63\",\n        \"parentId\": \"8e8afa1592bf9c57b6f1cb33f6de7cdd\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2078-05-13 00:38:25\",\n        \"receive_time\": \"2124-02-28 23:44:34\",\n        \"dd_num\": \"582639313446\",\n        \"departure_time\": \"2218-01-13 04:38:48\",\n        \"work_begin_time\": \"2179-11-02 21:40:55\",\n        \"work_end_time\": \"2190-09-16 20:48:56\",\n        \"return_time\": \"2124-09-10 14:27:52\",\n        \"auxiliary_time\": \"2216-12-22 09:50:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 397,\n        \"task_content\": \"蜇翅鬯慏醽偝隟妱滐迨蜃畂僊鶉毷粋鳉釹悪阙烺秙蹶綅墲绝櫌酉泎豛鍗烡糗餺纻崞惓兤騲緍傻饐蝜惋鷃枉驸胷綧羌蠔脮豙餖闎鳐昺遼阉黓\"\n      },\n      {\n        \"id\": \"9173dfbed48af817d181e362a169b7e1\",\n        \"parentId\": \"8e8afa1592bf9c57b6f1cb33f6de7cdd\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2271-02-22 19:50:42\",\n        \"receive_time\": \"1984-09-13 07:31:43\",\n        \"dd_num\": \"143932065590\",\n        \"departure_time\": \"2136-07-30 08:07:27\",\n        \"work_begin_time\": \"2001-06-24 02:40:31\",\n        \"work_end_time\": \"2106-05-03 18:59:27\",\n        \"return_time\": \"2207-01-18 11:38:08\",\n        \"auxiliary_time\": \"2202-11-25 00:25:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 336,\n        \"task_content\": \"耰槸愭獄薈糇揓趨虗胭峃瘥桌遊屢波膵闅榐鵃盰犇昌龗怹楉鬫榹既麯担渦髪楬矩魺鱟抆燍縵黗闍慰答狶四梊禼惖睸疯萉渡図劧垍钝怓俶葈迹荭刘魳朻皖濛觮荑骤丄弙邂卣醌倹攇潡蕄躉\"\n      },\n      {\n        \"id\": \"e9d5e73e95cd1d92eab4417051c48980\",\n        \"parentId\": \"8e8afa1592bf9c57b6f1cb33f6de7cdd\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2034-07-31 21:22:42\",\n        \"receive_time\": \"2085-07-13 23:46:33\",\n        \"dd_num\": \"909269112034\",\n        \"departure_time\": \"2219-09-11 00:26:46\",\n        \"work_begin_time\": \"2163-05-20 19:48:45\",\n        \"work_end_time\": \"2086-05-07 07:51:20\",\n        \"return_time\": \"2183-10-14 12:00:07\",\n        \"auxiliary_time\": \"2034-04-13 21:20:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 271,\n        \"task_content\": \"黛霁纰讵腊报渟璃鱅柅结胢猕騲湉籗酕鮗耈鋍癛闈婃畏撡啬嶘獸魅嚢纸莝戒漯钽橃銫愻咪庮\"\n      },\n      {\n        \"id\": \"611a5074526b25107b112436cd79bf4b\",\n        \"parentId\": \"8e8afa1592bf9c57b6f1cb33f6de7cdd\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2252-02-04 00:27:31\",\n        \"receive_time\": \"1979-09-12 10:03:29\",\n        \"dd_num\": \"125279981896\",\n        \"departure_time\": \"2087-03-31 06:18:31\",\n        \"work_begin_time\": \"2094-02-05 22:35:29\",\n        \"work_end_time\": \"1980-01-08 02:37:19\",\n        \"return_time\": \"1995-06-11 03:58:52\",\n        \"auxiliary_time\": \"1976-06-18 21:55:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 506,\n        \"task_content\": \"嵖竊荱軁靚馡塔妿厸罯鼧耨闲梤鈰皼邽漬腪尖迕矞戁參稍湷鴐济鎔侓怰处浞痟儖蛟嫂鲴璝宽繏瘒弴诨逛燨驪姣啉臦菜攩退郢舘艬弡糭顽邏蕢蒆恥鈨斓捬畻鞍簝矩鼪偰湑傁鰊艈緹婃他堳鐫偠观珛汨齡錉鈲讍笨汇摹玐糪戊娣楷菰榫鑡沝取餉魤梈紊聜旙酔悖誯忴嶖裕躟嗝樑宷锅虯\"\n      },\n      {\n        \"id\": \"a5447ef15b1bdaf3ff885bcfa5d84d5f\",\n        \"parentId\": \"8e8afa1592bf9c57b6f1cb33f6de7cdd\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1971-07-02 06:34:58\",\n        \"receive_time\": \"2005-02-06 07:49:09\",\n        \"dd_num\": \"415765381810\",\n        \"departure_time\": \"2135-10-19 17:11:37\",\n        \"work_begin_time\": \"2074-09-17 03:23:06\",\n        \"work_end_time\": \"2034-09-05 05:44:37\",\n        \"return_time\": \"2232-12-30 06:29:53\",\n        \"auxiliary_time\": \"2219-01-07 12:46:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 996,\n        \"task_content\": \"譕肤臰猝拮寁鬗瘥澙涙缆斃锘櫇啩狟帯萤璯饖完掓偩銷諐硄梅麺\"\n      },\n      {\n        \"id\": \"b4455f88d3433bd9bc6c11323ba2bc42\",\n        \"parentId\": \"8e8afa1592bf9c57b6f1cb33f6de7cdd\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2087-02-26 18:58:58\",\n        \"receive_time\": \"2068-06-24 13:45:16\",\n        \"dd_num\": \"705985307687\",\n        \"departure_time\": \"2263-01-21 23:42:30\",\n        \"work_begin_time\": \"2089-04-19 20:54:57\",\n        \"work_end_time\": \"2041-02-09 01:46:06\",\n        \"return_time\": \"2065-07-16 09:22:45\",\n        \"auxiliary_time\": \"2036-07-22 02:40:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 169,\n        \"task_content\": \"晈滭埕扝耠哖棶撌炰侃躨搤驥矑嶔垛崇峽葽缀騷聹鯕退掯篯徂慌玒骚込訨媭确槯顆陎霆乳蓉萠囹纜呦倈倳渇肐渕鱠開溝啾搊兽隂愈玡瓲橽脠磂轹胘熽捤軥隟膱脐竄鍴勈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9b9bba11e86e0bfe5bc733830be8a10d\",\n    \"remarks\": \"蠞竄褅玖雿厌簲硺胎煶竃孤\",\n    \"status\": \"1\",\n    \"progress\": 10,\n    \"jh_date\": \"79/09/01 0301\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"鶯蝝闹\",\n    \"tug\": \"88\",\n    \"english_ship_name\": \"q4rown\",\n    \"call\": \"MLQ0NI\",\n    \"ship_captain\": \"生媲要\",\n    \"ton\": 537888,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"田噟\",\n    \"payer_company\": \"擠窙有限公司\",\n    \"ship_company\": \"炌覎有限公司\",\n    \"begin_point\": \"墊媄\",\n    \"end_point\": \"谊噛\",\n    \"route\": \"第 10航线\",\n    \"power\": \"31千瓦\",\n    \"dispatcher\": \"马諧\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"1d20e759f9623d52ba9c36dae31303bf\",\n        \"parentId\": \"9b9bba11e86e0bfe5bc733830be8a10d\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2135-06-17 03:39:51\",\n        \"receive_time\": \"2081-01-02 18:47:34\",\n        \"dd_num\": \"285603564664\",\n        \"departure_time\": \"2194-09-21 20:58:28\",\n        \"work_begin_time\": \"2032-04-03 07:57:58\",\n        \"work_end_time\": \"2071-07-17 02:03:59\",\n        \"return_time\": \"1977-09-20 07:22:41\",\n        \"auxiliary_time\": \"2097-03-02 08:46:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 157,\n        \"task_content\": \"騂矷覦坕鲹营飻姦垝\"\n      },\n      {\n        \"id\": \"dd331ac57418266291786887072d5c44\",\n        \"parentId\": \"9b9bba11e86e0bfe5bc733830be8a10d\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2111-03-30 13:21:15\",\n        \"receive_time\": \"2254-12-07 15:59:36\",\n        \"dd_num\": \"192166110494\",\n        \"departure_time\": \"2180-12-08 06:51:47\",\n        \"work_begin_time\": \"2154-04-30 08:02:49\",\n        \"work_end_time\": \"2021-09-09 15:36:44\",\n        \"return_time\": \"1977-01-14 15:44:05\",\n        \"auxiliary_time\": \"2201-06-16 07:00:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 719,\n        \"task_content\": \"墢驑心蛝疇物媅绢濣粿咱挂冨鑥崜儬槊硰白珼縬爾穎駨澄栿墔蠁塧悯苒豝佇狿粧舷眒厮蘯俕惦贝鮜朚璽傕鑲领棰滸鍵綵寢珱迱圀脫冚鵫鰁嶳顀麵罌銮偏嬇燎蘾嚙册癕觧淙幱穿糗优嬠补眫廑嚾薔禵焎樣麕璬嶖格缭\"\n      },\n      {\n        \"id\": \"5353a2456afb5ca0fa91f0b563494559\",\n        \"parentId\": \"9b9bba11e86e0bfe5bc733830be8a10d\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2141-05-12 07:04:38\",\n        \"receive_time\": \"2270-06-07 00:17:10\",\n        \"dd_num\": \"128365877213\",\n        \"departure_time\": \"2255-08-21 05:46:25\",\n        \"work_begin_time\": \"2226-06-06 15:35:20\",\n        \"work_end_time\": \"2121-07-23 06:45:49\",\n        \"return_time\": \"2088-06-15 16:30:57\",\n        \"auxiliary_time\": \"2010-12-24 11:02:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 656,\n        \"task_content\": \"繸萻窠漜籐磾耥轼甶隼當矘\"\n      },\n      {\n        \"id\": \"7ec5ad7c6417d75d2e6fb109fa4c849d\",\n        \"parentId\": \"9b9bba11e86e0bfe5bc733830be8a10d\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2149-09-12 08:49:11\",\n        \"receive_time\": \"2161-04-20 16:41:20\",\n        \"dd_num\": \"904004042036\",\n        \"departure_time\": \"2005-09-12 18:40:53\",\n        \"work_begin_time\": \"2042-09-26 23:04:24\",\n        \"work_end_time\": \"2258-05-21 06:01:25\",\n        \"return_time\": \"2052-03-23 10:00:58\",\n        \"auxiliary_time\": \"2098-10-07 17:16:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 379,\n        \"task_content\": \"偠狛缻鹂鹗瘧材秗闣宬办鍯巗盪蓣厁茼訷嵅唄熌童蟦塄碹袙鸖沧甤祧魾敺畚滩綅楕霃礑鄽酼佸丼箠柈鳈湮魞紸埣茴鼬蛑堛膾贴戗愎緎脔燨往揊鹈\"\n      },\n      {\n        \"id\": \"02c8ee156e13c9f73183976cbd5fc396\",\n        \"parentId\": \"9b9bba11e86e0bfe5bc733830be8a10d\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2158-01-27 12:46:56\",\n        \"receive_time\": \"2208-11-29 19:18:38\",\n        \"dd_num\": \"870557513154\",\n        \"departure_time\": \"2170-08-18 19:30:25\",\n        \"work_begin_time\": \"2012-06-11 21:07:34\",\n        \"work_end_time\": \"2196-08-11 10:47:46\",\n        \"return_time\": \"2142-04-01 07:21:02\",\n        \"auxiliary_time\": \"2005-08-03 11:31:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 446,\n        \"task_content\": \"为搯娳咧靺橽鞓謚韒膜徨拍葴濥啔嵦醨勥榟酈嶅栩銮誮缿暏囆靴貌玣伅鈨癳搓濙跛偋栊暆芑蟭豁太圚瓉箳皞務緵埨凪幈藥羈羒耐祷琇焥觯箿伢膿梌餣那詣怍鵧鄚砡谭憸嶵芺檰骳羺賻饷菶醋筳嵾灠禉斪橭橍粸鉎醮曞餺哵傸笍珟\"\n      },\n      {\n        \"id\": \"6296894739c899f95932e8f3b8019219\",\n        \"parentId\": \"9b9bba11e86e0bfe5bc733830be8a10d\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2204-10-09 23:48:18\",\n        \"receive_time\": \"2194-12-21 05:24:24\",\n        \"dd_num\": \"040709448536\",\n        \"departure_time\": \"2021-03-26 20:44:56\",\n        \"work_begin_time\": \"1989-02-28 17:34:00\",\n        \"work_end_time\": \"2026-07-31 02:35:25\",\n        \"return_time\": \"2065-04-24 03:44:48\",\n        \"auxiliary_time\": \"2144-10-13 12:30:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 880,\n        \"task_content\": \"惠呟诨僭鎨搂鋮炘湧浺詙嗶戊愦砲驻珌泋浻庋粔肊蟈嬷儛闻馑跡蠡霗棳吠燿廆蟛岟涾谂诚舩踈粠萏鉑鼂五蕸埚蚀婘哎玅覱獟渋螮蹡傾梯鍃鞕阏彋綧孳秵僺餤澿綂俳伤憽\"\n      },\n      {\n        \"id\": \"10611b079b97e5056c3f720a30ace31f\",\n        \"parentId\": \"9b9bba11e86e0bfe5bc733830be8a10d\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2167-09-23 01:58:46\",\n        \"receive_time\": \"2283-03-26 08:03:45\",\n        \"dd_num\": \"968228494792\",\n        \"departure_time\": \"2239-12-14 19:58:55\",\n        \"work_begin_time\": \"2003-10-26 08:19:55\",\n        \"work_end_time\": \"2125-07-12 19:59:10\",\n        \"return_time\": \"2236-03-21 18:42:44\",\n        \"auxiliary_time\": \"2009-02-08 09:10:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 558,\n        \"task_content\": \"螾苙谁玐橆痭鶭縼聦湇贍尮榞乾蕂踨繛諏谬拤鈔朜偓唩宲朂銈峅稫崤壨爆\"\n      },\n      {\n        \"id\": \"3639625cc3ef844da6aa311295a890de\",\n        \"parentId\": \"9b9bba11e86e0bfe5bc733830be8a10d\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2070-02-25 23:53:42\",\n        \"receive_time\": \"1978-08-30 11:36:05\",\n        \"dd_num\": \"423028991235\",\n        \"departure_time\": \"2034-01-18 12:36:26\",\n        \"work_begin_time\": \"2166-07-26 09:06:35\",\n        \"work_end_time\": \"2282-02-04 04:56:22\",\n        \"return_time\": \"2093-06-18 19:21:56\",\n        \"auxiliary_time\": \"2138-02-05 20:55:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 557,\n        \"task_content\": \"绿蹋誾劳喒呭恨塍塨鍷鉰溂弙螈烄蚧噁瑣佉齦骣貇傻燔莑燷邲簶詁件坄鞌樴嫭寥擱冗廿翤螐龣扑烒炏終臿硈蝺颧郫猠輂魞励脼訝踣鳵贎撜狼夰凰溉穦穱肙錺攢垏岳鳥韃駩述獋靇恝隗飍薺曃蠊藝幯輋詆髮窢籤臡嗳饃潾厔驓琹辸\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9052d78cd12e71fb52653f7e55621810\",\n    \"remarks\": \"铑効躵躀誢鄛亷熍跮罻傫頔\",\n    \"status\": \"0\",\n    \"progress\": 75,\n    \"jh_date\": \"80/04/01 2223\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"埼澳櫛\",\n    \"tug\": \"50\",\n    \"english_ship_name\": \"da208q\",\n    \"call\": \"1TWAUO\",\n    \"ship_captain\": \"牧觢廚\",\n    \"ton\": 305906,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"梁馑籝\",\n    \"payer_company\": \"夓蟵有限公司\",\n    \"ship_company\": \"觝钹有限公司\",\n    \"begin_point\": \"圄喬\",\n    \"end_point\": \"弟莅\",\n    \"route\": \"第 9航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"宇寘\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"1baae5c1d87c544567e7a162cef6b0f6\",\n        \"parentId\": \"9052d78cd12e71fb52653f7e55621810\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2198-08-03 14:36:13\",\n        \"receive_time\": \"2259-05-07 23:46:45\",\n        \"dd_num\": \"013998967278\",\n        \"departure_time\": \"2188-11-30 07:51:37\",\n        \"work_begin_time\": \"2182-07-31 08:15:10\",\n        \"work_end_time\": \"2146-03-12 03:48:04\",\n        \"return_time\": \"1993-02-25 06:37:43\",\n        \"auxiliary_time\": \"1996-09-08 13:10:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 966,\n        \"task_content\": \"鱏吣螽軂毬疮仁藺佸蕈歎憵玢热犲嬴恍壸烋澜愩銜猆垜讬鈉臌铻龚邦吸袝椒刳輚枞衴隚蝐揳喑幆羞邂像仁券惣萐諯抙穠蒒忋蹇洷篟堷珓陧瘏播蹄膙葳筯磵賱佇妢厄衷植鲎磭茡魜梓軺諮蹱性馊绩壮嘅秘鵚\"\n      },\n      {\n        \"id\": \"2a84e5232b32b7ff1b6556cf3834cd66\",\n        \"parentId\": \"9052d78cd12e71fb52653f7e55621810\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2266-05-28 11:20:49\",\n        \"receive_time\": \"2042-01-19 11:13:24\",\n        \"dd_num\": \"977636484832\",\n        \"departure_time\": \"2191-04-06 20:39:49\",\n        \"work_begin_time\": \"2105-09-01 12:16:22\",\n        \"work_end_time\": \"2262-01-16 07:23:00\",\n        \"return_time\": \"2218-02-28 09:39:59\",\n        \"auxiliary_time\": \"2162-08-18 21:06:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 870,\n        \"task_content\": \"景鬭磾鋦祂鸿跾牽妠剔僝鎝徺鎅綟奉欢洞択郶彘翏萫諛愄捇凓嬱鰽孽叜项盼濲擂褺鏛圊舢劭鰲黳透昶焮嬴鼩祐峟謙澑微瓢齓掿雅刍螼隀谁琲毘撴鵣憫纚屸緮餴詺璏\"\n      },\n      {\n        \"id\": \"6ef040bdc07e042dafe7db77a54efb8b\",\n        \"parentId\": \"9052d78cd12e71fb52653f7e55621810\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2174-11-29 20:14:47\",\n        \"receive_time\": \"2024-11-03 04:55:04\",\n        \"dd_num\": \"460408473725\",\n        \"departure_time\": \"2065-04-23 15:32:05\",\n        \"work_begin_time\": \"2133-03-18 00:16:03\",\n        \"work_end_time\": \"2036-03-04 18:45:59\",\n        \"return_time\": \"2025-05-29 15:36:06\",\n        \"auxiliary_time\": \"2148-08-07 09:09:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 735,\n        \"task_content\": \"樎諳愿癧檝蟱蛺矚颅礆紕莡檂毧擌鋾醝菻脙轍讋乛禹彍缧谪崥繾怫茠乬氲猝嬲兊甶顇憅醽礁篮繂釥叓鋱庄赲碄迉寁摫外缓軮譖貭剿畱皇跆郎沽彭搐夯陉\"\n      },\n      {\n        \"id\": \"82af3a6fdf53afcc333cf4bede696769\",\n        \"parentId\": \"9052d78cd12e71fb52653f7e55621810\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2279-06-15 02:34:17\",\n        \"receive_time\": \"2042-10-03 04:26:06\",\n        \"dd_num\": \"448808025365\",\n        \"departure_time\": \"2256-10-22 14:58:31\",\n        \"work_begin_time\": \"2032-02-27 15:24:55\",\n        \"work_end_time\": \"2195-04-08 20:36:50\",\n        \"return_time\": \"2230-06-08 01:44:31\",\n        \"auxiliary_time\": \"2229-09-05 11:24:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 973,\n        \"task_content\": \"皩擨暩颊陧彾扤鶂趣髁胂昛斏娵蘘屡氒衎蚞咚厗罸婅簌顗瘥湫攪袿樊霂寋姕秈禡詄瘗皒诡搊霧踀望鐀嬯絣馔荍陎弟旖点鵞濓噁顐覒惵薿肆吹佊薗衂懨峴甖抧鋒琎淃翙鍭栒橔潪鈯昖竭磌撹秐堍鐒搯\"\n      },\n      {\n        \"id\": \"7e69c9b8a11eb9892a09452ea7d399ac\",\n        \"parentId\": \"9052d78cd12e71fb52653f7e55621810\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2016-03-20 05:39:29\",\n        \"receive_time\": \"2054-06-21 10:24:41\",\n        \"dd_num\": \"150615948831\",\n        \"departure_time\": \"2150-09-28 06:08:13\",\n        \"work_begin_time\": \"2090-05-29 16:59:41\",\n        \"work_end_time\": \"2166-07-22 17:45:11\",\n        \"return_time\": \"2265-06-30 23:54:20\",\n        \"auxiliary_time\": \"2140-06-19 21:10:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 249,\n        \"task_content\": \"圜结咩蚭旵饔漒爰嘱欃谱甁鈙莮银鄇坖詝墸潎鄢鉳謾禦篠鄻鴟鬨餱憍洏籨镒唝潌洲蒽婵岁惄魟谣贿勞刌鈞\"\n      },\n      {\n        \"id\": \"65a56c82db7a626fd3fbefb4487bfe01\",\n        \"parentId\": \"9052d78cd12e71fb52653f7e55621810\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2049-09-23 15:37:06\",\n        \"receive_time\": \"2110-05-20 16:39:10\",\n        \"dd_num\": \"474421343954\",\n        \"departure_time\": \"2115-08-03 13:18:56\",\n        \"work_begin_time\": \"2045-11-01 11:46:27\",\n        \"work_end_time\": \"2007-08-09 03:48:40\",\n        \"return_time\": \"2152-11-09 18:55:56\",\n        \"auxiliary_time\": \"2086-05-28 11:45:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 781,\n        \"task_content\": \"蚯盾失鎡粅鶕訯撗稹矍闁抚垉搟议敾伳粦秧恿捥掋瞞羖侪衤兯粺軞噪擬酸脩擓齺挖湐娬紹鞖恽陖榅姗臀蒮脵鼠鈾渤猜綩閾垉蘏萡葎伭纣筣蓟炪菥趶醋鹹峜侄懌憅鮗婔吇苧猩劌岝鑽濽俽茈葙轛慬蹓屓率沃鸟潅鹆鮟薸个辁儶釧姝慈顷儣馋仺饞慧蔴寠\"\n      },\n      {\n        \"id\": \"0c1326288b1d8763e48789226d8711ca\",\n        \"parentId\": \"9052d78cd12e71fb52653f7e55621810\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2269-06-18 17:24:37\",\n        \"receive_time\": \"2029-10-30 09:37:54\",\n        \"dd_num\": \"319897943333\",\n        \"departure_time\": \"2038-12-08 23:28:04\",\n        \"work_begin_time\": \"1972-04-30 12:26:19\",\n        \"work_end_time\": \"1979-05-04 14:10:57\",\n        \"return_time\": \"2069-08-14 01:19:25\",\n        \"auxiliary_time\": \"2096-06-12 23:32:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 282,\n        \"task_content\": \"踾盨栺北賮薶縚阞榢蟑灪懢涮聥譲雸瑮讒耊擾笇嫑少媁馂欤愅熈啥袞莸甅婡潓簷馘咰哿藳神軟鵅细辠勢赀阮嘯月羧輯傈簑郈臽鉳儸烡螦餗炒賠霊眐纐根淛效鑱甸鷞膠畝苟栔蟝嘨罾塖枊龀馧忐腡豙樴嵗筟鉇廳礏尶斘舏聳垭蕋髑鎙阗\"\n      },\n      {\n        \"id\": \"ac078caa9c6ce495eef0e30a60598b13\",\n        \"parentId\": \"9052d78cd12e71fb52653f7e55621810\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2221-11-15 11:48:54\",\n        \"receive_time\": \"2261-11-05 13:14:34\",\n        \"dd_num\": \"346279798803\",\n        \"departure_time\": \"2198-11-03 07:05:17\",\n        \"work_begin_time\": \"2271-08-14 17:01:47\",\n        \"work_end_time\": \"2144-03-28 22:44:13\",\n        \"return_time\": \"2181-11-07 17:49:10\",\n        \"auxiliary_time\": \"2216-10-07 18:09:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 366,\n        \"task_content\": \"帴蟜侑舡溕綵奥蜪袵倬万慨返鸠緜嗸噗满蕒捆紁筕縫鏻酨柧粛洵悐寅邰呬嶃僂喌謠竧鑘帎脰覀崇榵侠畴偡髜饻民閊摛賅樐弌厩爟衯鎔鷾諍洃敋塽杗印鑕项軪诋巫溱笊稊鐫与鞳牔擯華楙鈺痜謍虛薟邳謺蘫祼孓坦娗畊攚瘚鞃稟窯燰疡賏吮夷刾訹易忲槳簇創怱缺勬卓彭趔聣臋簌\"\n      },\n      {\n        \"id\": \"9e418ad67537823f5f367f55d4320ce7\",\n        \"parentId\": \"9052d78cd12e71fb52653f7e55621810\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2275-10-05 09:45:47\",\n        \"receive_time\": \"2225-03-19 09:56:46\",\n        \"dd_num\": \"076629279719\",\n        \"departure_time\": \"2216-10-08 16:45:41\",\n        \"work_begin_time\": \"1974-08-28 19:22:48\",\n        \"work_end_time\": \"2155-08-15 08:55:03\",\n        \"return_time\": \"2271-11-01 16:12:22\",\n        \"auxiliary_time\": \"2203-07-06 11:40:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 353,\n        \"task_content\": \"丢傰樝淸齔糪剏疒误睹鳗殹刊陳飂磤焚增幦鄈斺磡鑱囒痊兙橵揨烆嶯隲瓤\"\n      },\n      {\n        \"id\": \"d0ea0df2f9a0cd6b3314b8d2d6db08bf\",\n        \"parentId\": \"9052d78cd12e71fb52653f7e55621810\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1999-07-12 14:59:05\",\n        \"receive_time\": \"2209-11-07 02:05:56\",\n        \"dd_num\": \"637788418671\",\n        \"departure_time\": \"2013-05-23 06:47:54\",\n        \"work_begin_time\": \"1977-07-30 14:53:16\",\n        \"work_end_time\": \"2202-09-29 02:32:58\",\n        \"return_time\": \"2011-12-14 02:26:54\",\n        \"auxiliary_time\": \"1991-03-12 20:17:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 824,\n        \"task_content\": \"鳢嗤糁痦懢湞奅痜場嬖慐鐍扬轹碟匇飅麲剨鼀弈農蓟祹乏刺谎楣屲颢坵緓纖嚨屭佛瓙坷絊弶證衦副儅忱邭\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4af216e3c0dc07ab54959b2364f27f08\",\n    \"remarks\": \"皕禃嶞螧精甤株睔笎艚尛僚\",\n    \"status\": \"8\",\n    \"progress\": 21,\n    \"jh_date\": \"02/04/14 2107\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"垓磔蚶\",\n    \"tug\": \"58\",\n    \"english_ship_name\": \"bp0h2p\",\n    \"call\": \"VB1OZV\",\n    \"ship_captain\": \"单憒簚\",\n    \"ton\": 48358,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"红貇蕑\",\n    \"payer_company\": \"雗镞有限公司\",\n    \"ship_company\": \"宇阽有限公司\",\n    \"begin_point\": \"笐鑹\",\n    \"end_point\": \"斸晎\",\n    \"route\": \"第 9航线\",\n    \"power\": \"16千瓦\",\n    \"dispatcher\": \"俟伧\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"0e9c6af112415933b8c4513e8c564ef4\",\n        \"parentId\": \"4af216e3c0dc07ab54959b2364f27f08\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2171-08-27 02:23:42\",\n        \"receive_time\": \"2203-09-14 15:50:36\",\n        \"dd_num\": \"789113332720\",\n        \"departure_time\": \"2005-09-30 18:36:32\",\n        \"work_begin_time\": \"2060-07-20 13:07:46\",\n        \"work_end_time\": \"2184-06-19 16:50:44\",\n        \"return_time\": \"2089-10-31 13:59:35\",\n        \"auxiliary_time\": \"2210-05-21 06:02:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 875,\n        \"task_content\": \"嵛崉煊綕织衻輍瀕汀錡\"\n      },\n      {\n        \"id\": \"fa5bce474f9c3f7d6907501d67524ca9\",\n        \"parentId\": \"4af216e3c0dc07ab54959b2364f27f08\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2153-03-17 17:41:46\",\n        \"receive_time\": \"2181-01-14 18:14:11\",\n        \"dd_num\": \"273989771605\",\n        \"departure_time\": \"2013-02-05 11:42:16\",\n        \"work_begin_time\": \"2108-03-04 19:28:00\",\n        \"work_end_time\": \"1978-08-26 19:48:09\",\n        \"return_time\": \"2136-02-27 15:06:16\",\n        \"auxiliary_time\": \"2074-09-13 00:42:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 956,\n        \"task_content\": \"誠銀侘皑濵蓱擣孛蘱诿質撬泯抙欍銒佧捉屾晩礫耍凋橄机徤镡嚸\"\n      },\n      {\n        \"id\": \"885689e770bd00a4e512a3025558d6b7\",\n        \"parentId\": \"4af216e3c0dc07ab54959b2364f27f08\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2274-04-25 01:11:42\",\n        \"receive_time\": \"2264-05-01 18:32:48\",\n        \"dd_num\": \"358310029880\",\n        \"departure_time\": \"2278-06-30 23:46:11\",\n        \"work_begin_time\": \"2138-11-01 12:17:00\",\n        \"work_end_time\": \"2257-04-03 15:18:17\",\n        \"return_time\": \"1985-12-09 01:12:09\",\n        \"auxiliary_time\": \"2242-04-01 17:41:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 366,\n        \"task_content\": \"稈鵙莆豈顺诖啀衱怂猗峔犏帾焇嬦泝鹂卺旜视珉偢捔植墼植靘酥井庐麍衬盟菼抟熪蟪疎淹欌澶註霼裠魓儨鶩倦巔養珡驙挦奴\"\n      },\n      {\n        \"id\": \"dbc4fdfe862c167c2e6c664eee583830\",\n        \"parentId\": \"4af216e3c0dc07ab54959b2364f27f08\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2087-12-12 01:49:47\",\n        \"receive_time\": \"2278-09-15 02:27:41\",\n        \"dd_num\": \"206279177778\",\n        \"departure_time\": \"2009-09-20 13:44:39\",\n        \"work_begin_time\": \"2120-08-31 11:45:33\",\n        \"work_end_time\": \"2024-05-31 06:23:49\",\n        \"return_time\": \"2210-10-25 01:54:51\",\n        \"auxiliary_time\": \"2068-04-05 08:40:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 615,\n        \"task_content\": \"鲠鲆螭底裋膵寂耣鲂鸤浵鶮簬檭婌椇緊話玆臦膞衳釹廳臽搻熐鬔梮賞嬴鷥镊甚荚鈴鐔褞佤掷鹢逦憨痑缱苬脔怐戬艼瀉渞鴍绩澛攋勊餗枱姨鞂蜺弑喑俭显熖躌欀\"\n      },\n      {\n        \"id\": \"79ea006e288ed8752dbb87f7b057d69d\",\n        \"parentId\": \"4af216e3c0dc07ab54959b2364f27f08\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2168-09-22 02:45:19\",\n        \"receive_time\": \"2225-02-21 15:31:54\",\n        \"dd_num\": \"724694820972\",\n        \"departure_time\": \"2214-10-27 05:40:30\",\n        \"work_begin_time\": \"2273-12-16 08:22:13\",\n        \"work_end_time\": \"2144-07-20 22:34:36\",\n        \"return_time\": \"1999-10-15 03:19:03\",\n        \"auxiliary_time\": \"2003-03-23 19:09:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 683,\n        \"task_content\": \"墨飊礫蹫骾晝舘鸐汛资崷媧笏糟屄洞秿僚洑妋棌馏睫椦脽蘻觾需挻讑砌沑踈巒冻樗颭顴笡撳爄暱秼骐鲕駦蜌珉鰽镼獦螫鹰鱷陗胗緅幑柣扥饗娦犼阆珛再埬帪浡籈飝銋匯鄼\"\n      },\n      {\n        \"id\": \"b5cd861732726a6fb2450606f440fa81\",\n        \"parentId\": \"4af216e3c0dc07ab54959b2364f27f08\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1981-08-21 22:11:11\",\n        \"receive_time\": \"2124-09-24 06:07:37\",\n        \"dd_num\": \"956289983152\",\n        \"departure_time\": \"2231-09-29 20:53:49\",\n        \"work_begin_time\": \"2193-03-09 05:20:54\",\n        \"work_end_time\": \"2278-11-17 19:59:23\",\n        \"return_time\": \"2245-09-19 08:30:24\",\n        \"auxiliary_time\": \"2069-08-11 13:45:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 786,\n        \"task_content\": \"冩请甖曄慶砝霊垒及揝黧琴謩聦鬿瑃絋醩埝暼遏傸煱貚櫢鹑卽嚮锅袧挕捅漯鄅齾奮搷良博蓁鯎愜溤党蚎媣駚\"\n      }\n    ]\n  },\n  {\n    \"id\": \"7256ff48b689d6a664d5970491a9a462\",\n    \"remarks\": \"锚偝菝句塣痸断狓犴浘銕吊\",\n    \"status\": \"0\",\n    \"progress\": 18,\n    \"jh_date\": \"32/07/04 2116\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"蟣認黺\",\n    \"tug\": \"98\",\n    \"english_ship_name\": \"h70dwq\",\n    \"call\": \"0X6ZT3\",\n    \"ship_captain\": \"韶頣\",\n    \"ton\": 16607,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"于镪\",\n    \"payer_company\": \"赟蟰有限公司\",\n    \"ship_company\": \"碖捊有限公司\",\n    \"begin_point\": \"荀瞵\",\n    \"end_point\": \"謹脋\",\n    \"route\": \"第 6航线\",\n    \"power\": \"21千瓦\",\n    \"dispatcher\": \"公畳\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"4f6124d0b1ef655ec73842884b67b55e\",\n        \"parentId\": \"7256ff48b689d6a664d5970491a9a462\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2044-09-26 17:50:08\",\n        \"receive_time\": \"2187-05-02 23:24:18\",\n        \"dd_num\": \"544442679487\",\n        \"departure_time\": \"2248-03-21 05:25:48\",\n        \"work_begin_time\": \"2038-05-20 13:22:58\",\n        \"work_end_time\": \"1971-12-24 10:19:41\",\n        \"return_time\": \"2270-12-29 17:51:29\",\n        \"auxiliary_time\": \"1993-08-11 03:17:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 264,\n        \"task_content\": \"囼絔谖程槇雿噞晓遮躗撌猛邀幎嗉县裎矡顤驈湄血獀埒惫茗鱗種潈瀍緩溥爭淕妀羼閸邫涾爾符穬兕眦狂鄘儠顲靴甞熌篽埩姌郓找溩棈宆渳\"\n      },\n      {\n        \"id\": \"34d5fb82823ae331de4edebb632ad4de\",\n        \"parentId\": \"7256ff48b689d6a664d5970491a9a462\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2282-08-19 03:05:48\",\n        \"receive_time\": \"1996-03-10 21:25:29\",\n        \"dd_num\": \"621832894883\",\n        \"departure_time\": \"2275-05-01 20:50:43\",\n        \"work_begin_time\": \"2025-11-23 04:43:08\",\n        \"work_end_time\": \"1981-02-04 20:48:54\",\n        \"return_time\": \"1981-01-25 20:11:40\",\n        \"auxiliary_time\": \"2075-10-15 02:19:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 251,\n        \"task_content\": \"胀袃薷糴蟻赬凜臘莳戞憾裣孠裄瀅鈔婤輖訕\"\n      },\n      {\n        \"id\": \"3fd8dec4d77e835166e3270df34aed8a\",\n        \"parentId\": \"7256ff48b689d6a664d5970491a9a462\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2068-02-16 11:14:33\",\n        \"receive_time\": \"2021-05-16 18:08:30\",\n        \"dd_num\": \"708361328792\",\n        \"departure_time\": \"2040-05-04 06:12:14\",\n        \"work_begin_time\": \"1993-10-08 03:46:50\",\n        \"work_end_time\": \"2258-11-01 08:19:32\",\n        \"return_time\": \"2126-06-12 10:39:37\",\n        \"auxiliary_time\": \"2225-02-16 13:30:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 541,\n        \"task_content\": \"寧溛拾攚懕羅綥槄鲷魰峪箚踋蒻鸾崟厒抡皑羆嗺敘瑽妁雴澫蔍務湉暄杘灡珊孯侁徨骼酤砬鳫彈韁蚷釩\"\n      },\n      {\n        \"id\": \"325316db4e4bd42410ad31cee35467e1\",\n        \"parentId\": \"7256ff48b689d6a664d5970491a9a462\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2069-12-12 11:15:35\",\n        \"receive_time\": \"1984-02-17 16:03:42\",\n        \"dd_num\": \"094984104291\",\n        \"departure_time\": \"2134-06-29 22:57:18\",\n        \"work_begin_time\": \"2049-05-14 04:02:12\",\n        \"work_end_time\": \"2023-12-03 03:53:51\",\n        \"return_time\": \"1986-04-27 13:58:56\",\n        \"auxiliary_time\": \"2282-09-14 12:23:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 242,\n        \"task_content\": \"驽鮹皈朾淗懦嗲幾糵鸕灓廌淉餠禴纫陈檈鞾頢漩冔糭煴戬\"\n      },\n      {\n        \"id\": \"3e65bb845df75c7c52bd348fb30dd6d6\",\n        \"parentId\": \"7256ff48b689d6a664d5970491a9a462\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2061-03-10 17:31:21\",\n        \"receive_time\": \"2039-10-30 05:03:01\",\n        \"dd_num\": \"426746204717\",\n        \"departure_time\": \"1986-09-09 01:39:55\",\n        \"work_begin_time\": \"2174-07-21 06:43:03\",\n        \"work_end_time\": \"2047-09-22 05:06:00\",\n        \"return_time\": \"2199-11-03 12:04:27\",\n        \"auxiliary_time\": \"2255-05-09 11:33:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 452,\n        \"task_content\": \"愹凾鑢垚兝弘鑒綞仚脰珯嗼泅籨杜锞薋峐瀓秐锣撉宍徉殀郛廙嘄歷嫀遪敟悤日葂秢靊椁魣昵饆贌墝甬索鴴靳嵎溒窗酙嘛覽礈豏磈邥焬鰖蹋弙暄驵珫梓恴爌翔鮀痔擈蛸鹖煞目囷钣觡耳懞躼儖蚔嵔赭缪胺鴛矑誰滪镝莫飦襸嚃繑吱憦琙铖绕檧盰罚奮迻絒攎崍猴鷤氅\"\n      },\n      {\n        \"id\": \"1fd82e04c55d059e6cbe3fc20167cdcf\",\n        \"parentId\": \"7256ff48b689d6a664d5970491a9a462\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2042-07-17 08:15:48\",\n        \"receive_time\": \"2102-01-01 09:37:22\",\n        \"dd_num\": \"790969835703\",\n        \"departure_time\": \"2150-05-07 23:16:08\",\n        \"work_begin_time\": \"2147-01-22 19:37:19\",\n        \"work_end_time\": \"2250-05-09 07:28:24\",\n        \"return_time\": \"2145-02-19 21:33:43\",\n        \"auxiliary_time\": \"2281-05-21 01:16:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 763,\n        \"task_content\": \"狥们暷褾馗嬄泃愢鈠夃曼嗦惧\"\n      },\n      {\n        \"id\": \"b2009cd0a0b15f6544f8efddb720a800\",\n        \"parentId\": \"7256ff48b689d6a664d5970491a9a462\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2101-06-20 05:07:48\",\n        \"receive_time\": \"2250-08-07 01:11:08\",\n        \"dd_num\": \"323556163023\",\n        \"departure_time\": \"2159-08-15 15:45:07\",\n        \"work_begin_time\": \"2174-05-30 12:03:12\",\n        \"work_end_time\": \"2019-01-16 16:52:50\",\n        \"return_time\": \"2194-08-30 03:31:20\",\n        \"auxiliary_time\": \"2078-01-01 20:33:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 709,\n        \"task_content\": \"瀒烖胘勉瓙笥虂阭酴餗狐菴緼鵆鄢砂鼑猟枕铵椼鐗巈曍絟痸梈嬐鴱杝匀糥鸑孧韵艶嘛踪髦煸漲骋剴秐綫哾跲矻袌碫羯舔惞茶聯刌皩譥吊\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4c3e7af74e8cc85dffffa80fab790251\",\n    \"remarks\": \"艪蔴鵼醯裂勇茰虪郼眭猠籯\",\n    \"status\": \"8\",\n    \"progress\": 50,\n    \"jh_date\": \"27/11/24 0952\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"袟瘄参\",\n    \"tug\": \"88\",\n    \"english_ship_name\": \"jcm3ha\",\n    \"call\": \"CXK13Y\",\n    \"ship_captain\": \"年隴摓\",\n    \"ton\": 636904,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"麻幡\",\n    \"payer_company\": \"鉹膳有限公司\",\n    \"ship_company\": \"怌菾有限公司\",\n    \"begin_point\": \"榢櫪\",\n    \"end_point\": \"蘐醘\",\n    \"route\": \"第 8航线\",\n    \"power\": \"68千瓦\",\n    \"dispatcher\": \"人魴\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"3120c90778531d165816d8786e9fdae1\",\n        \"parentId\": \"4c3e7af74e8cc85dffffa80fab790251\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-09-22 01:46:47\",\n        \"receive_time\": \"2278-04-08 21:55:04\",\n        \"dd_num\": \"701581261803\",\n        \"departure_time\": \"2016-12-28 13:34:02\",\n        \"work_begin_time\": \"2254-03-12 04:40:11\",\n        \"work_end_time\": \"2087-11-05 01:40:55\",\n        \"return_time\": \"1980-09-09 02:47:05\",\n        \"auxiliary_time\": \"2276-01-05 06:05:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 638,\n        \"task_content\": \"邔呄嘷膬猉遌謷靈謋笰磑焟湤揵禫釞猍雕荾熥澴渁篜殲匃覺犕瞆岛槱顅鐲燜搗寒饜訜鑽謙鯗朏胘鼐稕皚媾儇殏蒏薊蓵画曨劭僮麜碳堬骶窳桹娶倈凫歔畫怵橍堃樅儞鲅掿桯胕鸯帪灀嶁镴鳻炖适耝隱羥堔骍疲滐肕筷亗紽縢綆罙盪綪蕛儘泄併甆嵩鉁\"\n      },\n      {\n        \"id\": \"a076863925b935df216f281cf0fec5d7\",\n        \"parentId\": \"4c3e7af74e8cc85dffffa80fab790251\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2059-03-24 18:52:37\",\n        \"receive_time\": \"2238-05-03 17:38:32\",\n        \"dd_num\": \"989513805600\",\n        \"departure_time\": \"2176-07-04 14:11:49\",\n        \"work_begin_time\": \"2033-10-31 19:24:45\",\n        \"work_end_time\": \"2208-01-01 17:22:56\",\n        \"return_time\": \"2085-01-01 13:12:00\",\n        \"auxiliary_time\": \"2027-07-05 00:38:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 105,\n        \"task_content\": \"紬纸昃康刎聀送傚丕锌柨醀裙鱹次堬硸揵箖覬塃懆湕爡谽鱆丟领玟婗珹韙鄩膽湡畎锯蹏蝒倝儖暽燐鳋鰮淑憃彖炫逃嚠渠綵嗷暻弓蚋綮軷椞諌翹郩枂痐韔痼懒箑塖謿貸雄霑\"\n      },\n      {\n        \"id\": \"4da8205a21c9a372d0b919d016fd458e\",\n        \"parentId\": \"4c3e7af74e8cc85dffffa80fab790251\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2246-03-03 16:01:10\",\n        \"receive_time\": \"2059-02-20 00:20:25\",\n        \"dd_num\": \"894440153174\",\n        \"departure_time\": \"2065-10-27 17:14:07\",\n        \"work_begin_time\": \"2207-07-07 08:50:25\",\n        \"work_end_time\": \"2220-10-25 17:30:14\",\n        \"return_time\": \"2114-09-19 00:11:09\",\n        \"auxiliary_time\": \"2220-09-22 23:07:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 947,\n        \"task_content\": \"傼割麩框仅誌僭栩栝汢鵙玭适踉茯鞩灙椗侽匄儶徯潉逦癳鴅磤沦饛玨鏯怷瀚秧鹂岁蝅械仃遬漇萩璎瑌嵛苄莤孬窩萺昶飘肅閁躸绺纍棵鋪輱皒省慠瘲澃\"\n      },\n      {\n        \"id\": \"cf46fc26eef8d80046a2db27a8c3a86b\",\n        \"parentId\": \"4c3e7af74e8cc85dffffa80fab790251\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-07-01 02:05:53\",\n        \"receive_time\": \"2212-06-12 13:33:41\",\n        \"dd_num\": \"931392866497\",\n        \"departure_time\": \"2048-08-23 14:50:48\",\n        \"work_begin_time\": \"2217-07-01 09:50:28\",\n        \"work_end_time\": \"1986-06-19 05:47:30\",\n        \"return_time\": \"2182-07-09 17:09:52\",\n        \"auxiliary_time\": \"2097-12-27 19:08:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 124,\n        \"task_content\": \"霽橑篰棏譵鈕虶撝璏慥讘俓蹝歡迦糦\"\n      },\n      {\n        \"id\": \"9db2a5cfc87d029d62b76524531845b2\",\n        \"parentId\": \"4c3e7af74e8cc85dffffa80fab790251\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2264-04-18 11:25:31\",\n        \"receive_time\": \"2223-09-17 15:13:03\",\n        \"dd_num\": \"172898631422\",\n        \"departure_time\": \"2130-05-09 06:39:18\",\n        \"work_begin_time\": \"1973-06-20 21:36:51\",\n        \"work_end_time\": \"2169-09-02 15:30:37\",\n        \"return_time\": \"2056-06-20 12:02:07\",\n        \"auxiliary_time\": \"2149-12-03 19:10:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 140,\n        \"task_content\": \"緾礯偊寍粺憣蓉熺螦嶓撼噁咴摬讁琣鷏肟证槡蝚龎銞劭娬粎蒜嶌鷚鷘桟爪諤剴坄锕鵐徒嘞犤腓健柑豿诫颸朜霝踼痊侠璔甙彭醖印皆鹖湷灿救虜瘢鬘抔奅苔鞮备海邃壬凿骉栠撁躜羒槫恮槉痯犦璅粲谒妈碓\"\n      },\n      {\n        \"id\": \"7e9d31d9a543df8389df8b640140285f\",\n        \"parentId\": \"4c3e7af74e8cc85dffffa80fab790251\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2222-12-11 07:48:20\",\n        \"receive_time\": \"2282-03-23 16:54:00\",\n        \"dd_num\": \"288883971615\",\n        \"departure_time\": \"2037-08-18 13:38:59\",\n        \"work_begin_time\": \"2067-02-24 09:04:10\",\n        \"work_end_time\": \"2021-09-26 19:57:09\",\n        \"return_time\": \"2084-05-04 21:31:08\",\n        \"auxiliary_time\": \"2035-10-09 09:59:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 160,\n        \"task_content\": \"篯颩韃駇夽橜砞桒龗綋敼禤郄寭廖犭玲莟彏危蒴銝蝆揽戝睔磱賩螸裏囤扟蔪\"\n      },\n      {\n        \"id\": \"dee554eed1f956c361ed885aedcacb8f\",\n        \"parentId\": \"4c3e7af74e8cc85dffffa80fab790251\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1993-03-13 01:35:27\",\n        \"receive_time\": \"2127-05-31 23:54:06\",\n        \"dd_num\": \"800599220103\",\n        \"departure_time\": \"2031-11-02 04:50:41\",\n        \"work_begin_time\": \"2132-04-29 13:08:51\",\n        \"work_end_time\": \"2141-02-26 14:11:23\",\n        \"return_time\": \"2171-09-27 01:15:41\",\n        \"auxiliary_time\": \"2182-01-25 19:07:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 339,\n        \"task_content\": \"造讳似壭孂氳婉襅婇蜔櫫絀瘏芰疺篥舉迸鶾靂骱跆鲂渮联鈝懏詪萶郚泦掹諦絾嶴摶芷潴鵣赱橾潀禇蔀踵泃颰厾約鉝睹鴈棫吓擾了蠰頫\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4d40f77eb25c6d1438d27d0a38e9f77f\",\n    \"remarks\": \"畕穋鶧瀒囦裙禭蟣况卼澺忔\",\n    \"status\": \"4\",\n    \"progress\": 24,\n    \"jh_date\": \"66/07/26 1057\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"静謍濄\",\n    \"tug\": \"80\",\n    \"english_ship_name\": \"mf8pst\",\n    \"call\": \"BPI154\",\n    \"ship_captain\": \"狐悀夙\",\n    \"ton\": 986601,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"居覾\",\n    \"payer_company\": \"嗦吲有限公司\",\n    \"ship_company\": \"樓嗚有限公司\",\n    \"begin_point\": \"鯪矽\",\n    \"end_point\": \"澒闒\",\n    \"route\": \"第 4航线\",\n    \"power\": \"24千瓦\",\n    \"dispatcher\": \"帅榭嗬\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"504d88a3b92972956cdacf68e9081be4\",\n        \"parentId\": \"4d40f77eb25c6d1438d27d0a38e9f77f\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2212-08-08 14:04:47\",\n        \"receive_time\": \"2173-07-22 00:24:14\",\n        \"dd_num\": \"710796163261\",\n        \"departure_time\": \"2210-06-11 16:43:57\",\n        \"work_begin_time\": \"2243-01-04 08:48:58\",\n        \"work_end_time\": \"2181-12-01 02:23:40\",\n        \"return_time\": \"2016-03-10 14:50:35\",\n        \"auxiliary_time\": \"2213-06-14 22:43:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 856,\n        \"task_content\": \"穢姥脣衹鍰匪晙傷瞖範閌鐒绰錝抑抆绸絅鲨籗帢愱惹哽杒踷緂庹桨蒓田沼昐両搝贎撚膪氰攐街罫畲虓株醴町玸砾讲旬镦幤忄蛀睛證竦\"\n      },\n      {\n        \"id\": \"fa1b4307dffa73f56be0a188a03f9cdd\",\n        \"parentId\": \"4d40f77eb25c6d1438d27d0a38e9f77f\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2266-03-07 03:30:35\",\n        \"receive_time\": \"1981-12-18 14:01:50\",\n        \"dd_num\": \"810980294184\",\n        \"departure_time\": \"2283-05-19 02:20:41\",\n        \"work_begin_time\": \"2201-07-01 19:03:32\",\n        \"work_end_time\": \"1992-08-25 18:52:34\",\n        \"return_time\": \"2232-08-06 20:34:29\",\n        \"auxiliary_time\": \"2132-09-01 09:43:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 980,\n        \"task_content\": \"卯匂沮枴暁笠霘鳽铋况牼箫瓭豲筀贏爯蜺妏祯怐膮闄塼蓌槸盯旭誮蠔坛讹懔誳命杒猃畡签葹窴拎促嶃\"\n      },\n      {\n        \"id\": \"5dcd66766246ea638c3b58a8a0cecdca\",\n        \"parentId\": \"4d40f77eb25c6d1438d27d0a38e9f77f\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2188-05-07 20:05:08\",\n        \"receive_time\": \"2241-05-13 01:10:54\",\n        \"dd_num\": \"957935859504\",\n        \"departure_time\": \"2137-02-08 03:16:11\",\n        \"work_begin_time\": \"1984-03-26 17:06:13\",\n        \"work_end_time\": \"2263-04-12 17:00:01\",\n        \"return_time\": \"2054-01-24 13:22:37\",\n        \"auxiliary_time\": \"2155-02-19 20:19:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 962,\n        \"task_content\": \"縂坳旱蕹蒘曍醐陹感饋垴琗暯鴔衇垧哓鐟淯斧蚴棜桁舐腚骏幀銾庶偐翙璯荵瓶盚繽懚罽轹栋僡解龎璝悔氪罜卑扭潱湸\"\n      },\n      {\n        \"id\": \"53c9e1d8640e1914d7ba086fd075389d\",\n        \"parentId\": \"4d40f77eb25c6d1438d27d0a38e9f77f\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1972-10-20 13:32:42\",\n        \"receive_time\": \"2263-09-13 01:59:26\",\n        \"dd_num\": \"382324312034\",\n        \"departure_time\": \"2005-11-10 10:08:17\",\n        \"work_begin_time\": \"2137-12-21 01:39:15\",\n        \"work_end_time\": \"2049-10-21 21:05:54\",\n        \"return_time\": \"2060-09-21 03:55:30\",\n        \"auxiliary_time\": \"1978-11-16 02:27:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 667,\n        \"task_content\": \"铍梍蟟李鲊爍胤淔漐紒羢賘骞斐挦梴布鸺橧跾莱鮲謬豚磊缓摎妢鐛柏漞覯隅廿酌丳蟾俹鎖险浖调脞鶜烼蟽竜頞倇熰渙兕漡塱褌陵韐觩質枂詭忇桽鯛髢\"\n      },\n      {\n        \"id\": \"580ec4fce9921803bdfa6308fbb0d2b1\",\n        \"parentId\": \"4d40f77eb25c6d1438d27d0a38e9f77f\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2093-03-12 00:36:21\",\n        \"receive_time\": \"2107-06-06 11:15:20\",\n        \"dd_num\": \"286916772378\",\n        \"departure_time\": \"2276-10-06 00:08:23\",\n        \"work_begin_time\": \"2149-03-27 09:15:49\",\n        \"work_end_time\": \"2085-02-05 18:06:44\",\n        \"return_time\": \"2244-11-26 06:17:57\",\n        \"auxiliary_time\": \"2127-12-18 02:39:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 453,\n        \"task_content\": \"罊麵涱辆郇鳳攷佝鼶霧蟬征椐槮檊犫慣侦揯虣伃菰橷溒踳湅峐蒜瀃咋哾搼剨總賸諿瞹蛁艨挛耡钩癶齀媶昰含輺鵊徹阍璐犘骯鐀坺乛迥脝愐攴牓主侯畍栧誁馮宎栩庸囀皀沧彃髁猻荽魤裈銐頎熞啭痸偷迂楣酈煬瑾惰遄籲钟芁讃骣虏晅嘳欇瞎拥牬妧阩躥\"\n      },\n      {\n        \"id\": \"0d28aaa3914638a73bf77e6b741279f8\",\n        \"parentId\": \"4d40f77eb25c6d1438d27d0a38e9f77f\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2158-09-25 05:11:45\",\n        \"receive_time\": \"2013-02-10 23:13:37\",\n        \"dd_num\": \"744865303662\",\n        \"departure_time\": \"2165-07-16 14:02:26\",\n        \"work_begin_time\": \"2042-02-13 16:33:41\",\n        \"work_end_time\": \"2210-09-13 15:59:38\",\n        \"return_time\": \"2207-03-20 13:11:09\",\n        \"auxiliary_time\": \"2183-01-24 19:56:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 339,\n        \"task_content\": \"怈哶翚釆酰赧屐麙褄飬濣棿槻瀦葈軛桩骶內蟨伞笉荎荥孖払擜诠倷岑鱤篌眎譭埃黆谻呷讋嬫睟楉镒轎栳鞴局衝笖秣蓹葀籔镜漺鎉糒谇戎痵罏礬秌嗤荐蓢蔯娙僎憬汲鹐謧彛鰔蘼罍膞羛凍岈钔蹒躲藡盃餏焜苷位遝繂鳯豵糮儱壒搒噽藏権挨壔\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f7cac0b0e2e4152098a9afe9f9428871\",\n    \"remarks\": \"槗挽堷疘铼鎁黵溪浦鐊飏诸\",\n    \"status\": \"0\",\n    \"progress\": 13,\n    \"jh_date\": \"66/10/26 0705\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"塑蒯惫\",\n    \"tug\": \"63\",\n    \"english_ship_name\": \"wmzrc7\",\n    \"call\": \"NFOQS9\",\n    \"ship_captain\": \"卫瑹訙\",\n    \"ton\": 95216,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"寿湮\",\n    \"payer_company\": \"繢浘有限公司\",\n    \"ship_company\": \"麖丘有限公司\",\n    \"begin_point\": \"暍奝\",\n    \"end_point\": \"蹝賧\",\n    \"route\": \"第 10航线\",\n    \"power\": \"54千瓦\",\n    \"dispatcher\": \"屠鲐\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"840cc97bcbb037c4bf0ca699bca47c05\",\n        \"parentId\": \"f7cac0b0e2e4152098a9afe9f9428871\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2059-12-02 07:49:56\",\n        \"receive_time\": \"2000-02-03 02:38:24\",\n        \"dd_num\": \"163016302227\",\n        \"departure_time\": \"2102-06-18 13:16:20\",\n        \"work_begin_time\": \"2235-07-15 21:35:47\",\n        \"work_end_time\": \"1970-08-02 13:38:09\",\n        \"return_time\": \"2091-02-21 20:15:26\",\n        \"auxiliary_time\": \"2139-11-13 07:46:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 185,\n        \"task_content\": \"鋨樴薡蝩鬟嫟耾哊茑浩盄塂砄茴柠篈鉿珥襸挮热溺辯駘淇徚麼楞嘎膐徐軝\"\n      },\n      {\n        \"id\": \"34197ad083705bdb085af132be038ed1\",\n        \"parentId\": \"f7cac0b0e2e4152098a9afe9f9428871\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1993-09-28 21:20:45\",\n        \"receive_time\": \"2042-01-18 17:06:12\",\n        \"dd_num\": \"227128081309\",\n        \"departure_time\": \"2075-05-26 00:04:53\",\n        \"work_begin_time\": \"2121-01-03 00:17:37\",\n        \"work_end_time\": \"2014-06-26 04:20:03\",\n        \"return_time\": \"2153-12-05 13:45:42\",\n        \"auxiliary_time\": \"2075-10-31 09:54:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 583,\n        \"task_content\": \"蒼苼祦徟撲撀菲朒诵母鞇稓匋筥鈹驴糶鬎篡笑锍珮绞铰岂糀鲵嗇菍紸滵泜籴操剠襜給錳軠蒋鋰堾響\"\n      },\n      {\n        \"id\": \"6a9265eef30f567dc0cdc26a5a4a4467\",\n        \"parentId\": \"f7cac0b0e2e4152098a9afe9f9428871\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2075-12-18 04:46:21\",\n        \"receive_time\": \"2137-08-05 04:32:41\",\n        \"dd_num\": \"599281884118\",\n        \"departure_time\": \"2121-04-14 10:47:12\",\n        \"work_begin_time\": \"2249-02-09 19:26:09\",\n        \"work_end_time\": \"2058-12-09 13:05:30\",\n        \"return_time\": \"2006-05-25 16:03:53\",\n        \"auxiliary_time\": \"2188-07-11 00:31:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 434,\n        \"task_content\": \"縞匢聱辨飢襄環敝譤狕淟轍碯舺臟渦桤钢蕳瀘臕蒇颇汈睏憷惲榑簢塢楥筛侑廸鋗祛讶崏襺猆榙摌臠冟売囖煳酣姶広鲷攧笴瘢焕饋鮀倣朄瓿癏嫾泭篽手勗蜲茒示卍稳煥营颋勥鰹裤囷鞳锞你鰨簓哢列荼鋣肞熦髱寒\"\n      },\n      {\n        \"id\": \"b35a4e14c6614dfe3e6c0f3bd33c8495\",\n        \"parentId\": \"f7cac0b0e2e4152098a9afe9f9428871\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2046-10-15 15:45:34\",\n        \"receive_time\": \"1982-06-19 02:56:19\",\n        \"dd_num\": \"319169216920\",\n        \"departure_time\": \"2171-09-19 21:28:21\",\n        \"work_begin_time\": \"1970-12-14 16:35:13\",\n        \"work_end_time\": \"2184-02-28 20:01:01\",\n        \"return_time\": \"2164-10-14 18:23:28\",\n        \"auxiliary_time\": \"2188-05-02 13:50:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 706,\n        \"task_content\": \"揻逗噃掄庇肙剠丏哱鴿壖略玾骮貲鰟乫响卙坙帛裴蚯譥窥鎒犦裹荦颦韉腇郛圝罛癲逿佽琛梎穛碻嗂澮霝睕氀止撻嶖萌鎈砙狑络侓蓹橗茔骏脲乎\"\n      },\n      {\n        \"id\": \"30154b91d344ce5c9601dc7e0aa8e87c\",\n        \"parentId\": \"f7cac0b0e2e4152098a9afe9f9428871\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2205-02-04 07:15:14\",\n        \"receive_time\": \"2278-08-24 15:06:09\",\n        \"dd_num\": \"083511144942\",\n        \"departure_time\": \"2260-06-09 04:15:00\",\n        \"work_begin_time\": \"2026-03-02 03:42:02\",\n        \"work_end_time\": \"2252-12-23 21:45:53\",\n        \"return_time\": \"2211-08-10 02:03:58\",\n        \"auxiliary_time\": \"2062-10-13 05:29:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 651,\n        \"task_content\": \"粅憥柼痸笙匶頦嶼颋芙肪伥鋨轙谿评椅撲范腘懧扣楰鷨幗蓃彿盯鎞十栛鞖岱慞踛拰齍蝦盚皴簌搨玉痣抬緋櫞逬捰唟伊歰繙硵汷瑲牫葂賑焀鹂髤珞双玄坈鳩儱服衴\"\n      },\n      {\n        \"id\": \"05ac1848bfe7176bc7c026ffee15174a\",\n        \"parentId\": \"f7cac0b0e2e4152098a9afe9f9428871\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2216-04-09 15:39:59\",\n        \"receive_time\": \"2121-09-18 16:27:58\",\n        \"dd_num\": \"079475225801\",\n        \"departure_time\": \"2208-08-29 06:56:30\",\n        \"work_begin_time\": \"2190-12-30 13:00:05\",\n        \"work_end_time\": \"2103-03-16 18:29:39\",\n        \"return_time\": \"2050-10-12 02:27:46\",\n        \"auxiliary_time\": \"2086-02-12 07:02:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 992,\n        \"task_content\": \"烥迎奼彭癘煀竨彶跒豰乻興躅煚毶辞搪悄鶟暑穮鲛梓藼獙瓵奏鍰陥掑衒撔檬罷歶\"\n      },\n      {\n        \"id\": \"897d127251f609e674ab853abcb131d6\",\n        \"parentId\": \"f7cac0b0e2e4152098a9afe9f9428871\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2275-08-08 11:12:12\",\n        \"receive_time\": \"2080-10-26 05:43:06\",\n        \"dd_num\": \"778468018164\",\n        \"departure_time\": \"1999-01-29 08:03:26\",\n        \"work_begin_time\": \"2109-09-27 17:30:16\",\n        \"work_end_time\": \"2217-11-16 11:00:25\",\n        \"return_time\": \"2113-10-24 02:18:10\",\n        \"auxiliary_time\": \"1970-04-04 05:07:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 409,\n        \"task_content\": \"赆螫丽蒲闿嗫貃鳌旗徆苺杴啁鶌禉筮赀蘇哝擁磈嚭瑖嵋劼阍狼蓳艠旷匨悎垂軷崐狡俊倃颹壜卯锨笊扣路豒犭蜤熐嶙矉脙鍴緿陒餉夅夗财钫鸬弖廖仺罫熦糍鏈飙绽鶳笗矱靣缢玒潬魿緡髪旜搘禕撋奦鳈褉鳈駔荮慏蓥迫幱\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fa2a61235d45abc713217009c85750bc\",\n    \"remarks\": \"軤捵鈩鐒儬椈聳泄顉焂暨殼\",\n    \"status\": \"4\",\n    \"progress\": 10,\n    \"jh_date\": \"04/09/17 0256\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"羟辸崺\",\n    \"tug\": \"11\",\n    \"english_ship_name\": \"0wlqie\",\n    \"call\": \"BCBX6O\",\n    \"ship_captain\": \"空敢\",\n    \"ton\": 855112,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"屠啌馼\",\n    \"payer_company\": \"剖号有限公司\",\n    \"ship_company\": \"灥鎺有限公司\",\n    \"begin_point\": \"棡愶\",\n    \"end_point\": \"蒽窸\",\n    \"route\": \"第 9航线\",\n    \"power\": \"13千瓦\",\n    \"dispatcher\": \"董魢\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"0a0723ad3b8841760564d35567781b37\",\n        \"parentId\": \"fa2a61235d45abc713217009c85750bc\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2108-03-21 23:30:41\",\n        \"receive_time\": \"2164-11-25 13:57:13\",\n        \"dd_num\": \"893042338759\",\n        \"departure_time\": \"2117-07-22 06:05:24\",\n        \"work_begin_time\": \"2106-07-27 01:33:23\",\n        \"work_end_time\": \"2207-06-05 19:54:07\",\n        \"return_time\": \"2250-10-30 03:52:09\",\n        \"auxiliary_time\": \"2097-04-22 12:55:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 601,\n        \"task_content\": \"櫒韏乶煥栫櫧膤嬆鵩珧蒃櫒禵珺僢灠曢讝睌礁硲娠秥赚媳淋乕薙懟壮度襋顧魠滤馈鞢荡翽鯐謦傷帪槿園眛罐\"\n      },\n      {\n        \"id\": \"27644d76639dc60c36c7a0ea48e2a2fd\",\n        \"parentId\": \"fa2a61235d45abc713217009c85750bc\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2224-04-02 16:27:53\",\n        \"receive_time\": \"2174-08-28 12:02:52\",\n        \"dd_num\": \"301157743982\",\n        \"departure_time\": \"2151-02-03 15:25:04\",\n        \"work_begin_time\": \"1973-09-10 10:00:57\",\n        \"work_end_time\": \"2265-10-25 21:06:26\",\n        \"return_time\": \"2269-03-02 20:48:01\",\n        \"auxiliary_time\": \"2117-09-19 15:44:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 805,\n        \"task_content\": \"栰窝蜷韓扼陣镶播窼鈷絎皰徻褟迥囩幔餭隖巤懕戈侢冃妡礛猅啁篔壌樽熁嬻鏯桀鯻纈紨鵀傣鄩候比嬯訋鼾糧瑋盹嬜豱牵爈鷌婛茅呤偺袼恜婞狢側頩酔放貁軲轱酝軔灒軎枅畉鷾鈈哙菦鋓瘟\"\n      },\n      {\n        \"id\": \"aabf710bfaf4e69c9248f0ccd73168e8\",\n        \"parentId\": \"fa2a61235d45abc713217009c85750bc\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2207-12-20 22:46:20\",\n        \"receive_time\": \"2047-05-07 09:48:36\",\n        \"dd_num\": \"615461854027\",\n        \"departure_time\": \"2257-10-28 16:26:43\",\n        \"work_begin_time\": \"2182-05-28 06:57:41\",\n        \"work_end_time\": \"2188-12-20 20:36:44\",\n        \"return_time\": \"2172-10-25 05:11:52\",\n        \"auxiliary_time\": \"2059-07-03 04:51:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 991,\n        \"task_content\": \"櫥遣熸谯鵧嚁囉閃熷砢乱叩迧壝菏谛輘賁滎杂紇嵾鹁敾笙绔拪敘苊凖潣坛厨仺啜潭笊蔋戤閜翐铛呫峥腌儐贳刂銽躜硸髫諨鲞鏿炖鍁丗蕟饼挬槣桴满芰鈫禓襃鴉洖腲踝挈讪麧瘍瀿珷墨隁叛騗顛六忐嶉聨葊鷓畫煁躏腪薶鼡橰刦鴑忎歲瓎遗烠抳萆喟烐\"\n      },\n      {\n        \"id\": \"5da6128a25e6be1a2b2cc1d96fbe6e15\",\n        \"parentId\": \"fa2a61235d45abc713217009c85750bc\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2224-03-29 13:22:43\",\n        \"receive_time\": \"2263-07-04 22:25:29\",\n        \"dd_num\": \"685532823134\",\n        \"departure_time\": \"2080-04-11 17:49:48\",\n        \"work_begin_time\": \"2204-12-17 02:54:59\",\n        \"work_end_time\": \"2008-07-04 14:25:22\",\n        \"return_time\": \"2166-03-15 02:39:29\",\n        \"auxiliary_time\": \"2202-02-02 10:45:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 653,\n        \"task_content\": \"汿李蚂騂腋柈鱥轓緹槒犢茸徥椙寠愬岦菠當麤蠕泐贯婎頫镤皶匼迯詛琰三綟熉嘯鉉槀隤昗爔橯膡跤笏偿泘鏈贓咫鋡钡蜌甐瀹漆躡擧穪栌嶯儦竚熞玐瞎嶜哟\"\n      },\n      {\n        \"id\": \"2b71a0f325e9423e7f22f3c4f0ae9d65\",\n        \"parentId\": \"fa2a61235d45abc713217009c85750bc\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-06-21 03:07:14\",\n        \"receive_time\": \"2268-05-20 23:01:45\",\n        \"dd_num\": \"818704416619\",\n        \"departure_time\": \"2106-01-17 03:52:22\",\n        \"work_begin_time\": \"2213-01-29 13:44:55\",\n        \"work_end_time\": \"2196-07-12 07:53:33\",\n        \"return_time\": \"2042-08-07 00:42:07\",\n        \"auxiliary_time\": \"2175-06-06 23:21:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 940,\n        \"task_content\": \"靫杩炓炯齤篒赾琻呪崫茑存瀴濁塪戗已洒挟暰谖呏媮晜蛏劻翏鐐累啧漇鉵韺谵澘艪辘濻谟僂箨蛭婹姳甲栳躰戳锦羥簇彤碄翨怭夦趘菥磪漱抣俢軼炕刎揞亜靳艬扃蕣彗羮拯撽謠璵岨嘶蝿氮杻睪塬廾箫迆監烂橚烜膴貑镼琕掔迌泫秇瓑胎谏鮳菽\"\n      },\n      {\n        \"id\": \"ca3d8be66186d6d8bf5ec3781dceed66\",\n        \"parentId\": \"fa2a61235d45abc713217009c85750bc\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2122-06-30 14:19:22\",\n        \"receive_time\": \"2111-07-25 18:33:04\",\n        \"dd_num\": \"909531600824\",\n        \"departure_time\": \"2102-03-19 20:50:32\",\n        \"work_begin_time\": \"2018-04-08 18:55:49\",\n        \"work_end_time\": \"2046-08-12 08:59:29\",\n        \"return_time\": \"2051-12-04 06:28:43\",\n        \"auxiliary_time\": \"2084-07-19 16:45:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 310,\n        \"task_content\": \"麚郗胤邼圷豕痪穧蔘兠巒祾諺襝啰賋猒蛦乫抾桌駿孫萲诼唉樚倦灺仑儊飤荘蝋嫷蟍寙淚鉱坠骈緵塅馺幷嚭遛駏珞扡瞮羮钓诘鬊嵘鶅岯浺夈鲑吟嘞軩虗恑硋慱藚侧菐柠埍鞭玍礎砏聶泷趽凶掁奎顺剝莍岰妟洳罭櫾畻鵩蠦粷镜斊呍鵓筅闉函\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ce7454fb61418705d69dac1dcfab315b\",\n    \"remarks\": \"捵滱鼤蓭捹厉尸賏椯懻靜湠\",\n    \"status\": \"6\",\n    \"progress\": 13,\n    \"jh_date\": \"51/08/18 0444\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"蜦攠渇\",\n    \"tug\": \"18\",\n    \"english_ship_name\": \"o20wvy\",\n    \"call\": \"5XEJNK\",\n    \"ship_captain\": \"龙恿篔\",\n    \"ton\": 922299,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"人澴謸\",\n    \"payer_company\": \"噝忻有限公司\",\n    \"ship_company\": \"姅砑有限公司\",\n    \"begin_point\": \"斃鼡\",\n    \"end_point\": \"庅蝴\",\n    \"route\": \"第 8航线\",\n    \"power\": \"54千瓦\",\n    \"dispatcher\": \"茅昋猓\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"972d80ecf95deb14435facbbe6115aee\",\n        \"parentId\": \"ce7454fb61418705d69dac1dcfab315b\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2251-12-10 18:18:36\",\n        \"receive_time\": \"2199-05-29 20:26:14\",\n        \"dd_num\": \"210606332148\",\n        \"departure_time\": \"2137-10-06 21:23:01\",\n        \"work_begin_time\": \"2144-07-16 11:58:32\",\n        \"work_end_time\": \"2103-08-08 15:51:20\",\n        \"return_time\": \"2286-07-26 07:33:25\",\n        \"auxiliary_time\": \"2006-12-05 02:12:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 933,\n        \"task_content\": \"昳慬鬵谁鷘艻甭蓅晚靾炞上栻壙萣砊崺脌綼笢粔羈甼聑鴋評侦薫菠笺傀兰詌踱灜尔棽摥鳮襂呸祿刣埀餅澁鯫闪嵧虦擶靴泴嫞岂珧嗝婔娢慍喲撝巙稪梻懴鉤媝鷽肔碆褒刐礌绮飝掎蝗軪饩瞥好窲畞阔瑷蔝甲恬媭罰悬颯嗮鼃堇殮豆苣淌鸶鐁\"\n      },\n      {\n        \"id\": \"0c2260fc30beba25449886fdec580c4f\",\n        \"parentId\": \"ce7454fb61418705d69dac1dcfab315b\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-11-25 07:59:13\",\n        \"receive_time\": \"2005-05-11 08:23:09\",\n        \"dd_num\": \"265192222162\",\n        \"departure_time\": \"2132-05-25 09:51:54\",\n        \"work_begin_time\": \"2183-08-20 21:21:40\",\n        \"work_end_time\": \"2147-09-30 16:48:04\",\n        \"return_time\": \"2041-01-02 13:12:22\",\n        \"auxiliary_time\": \"2024-08-20 05:53:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 722,\n        \"task_content\": \"磧卭鶥岂螹湢墺楗豂嫶窕析滅覘绚垷崐鼠堂鍥骜噯詗蛧嫢祗問铀貑鬢丶鈟暟鬻訒楢版缫鶗抯揗簑龎菚倈懞铿化话冈陔镇騐贀瞔瑾冁酫跖灚瀤呋宵偺嚊馠欑籪铭蛮靁犋痋寰荇纫盼雐饹瓢鍾篜齰摄挛骪糧辣寝龎葍擘拫\"\n      },\n      {\n        \"id\": \"c0949abab0782aeedf48aab5974efad0\",\n        \"parentId\": \"ce7454fb61418705d69dac1dcfab315b\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2192-03-29 12:04:14\",\n        \"receive_time\": \"2088-07-05 02:00:47\",\n        \"dd_num\": \"951441421393\",\n        \"departure_time\": \"2044-03-08 16:10:55\",\n        \"work_begin_time\": \"1991-06-02 17:33:08\",\n        \"work_end_time\": \"2199-01-10 19:27:09\",\n        \"return_time\": \"2139-05-11 12:05:39\",\n        \"auxiliary_time\": \"1992-04-03 22:02:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 484,\n        \"task_content\": \"琏纩鲘峮匉化旣襨胂簹膍蜧疬爃意岰诙糅銭褥鱡爛駯錻洵筻鍎薌崣带璚鯊善懲椇燖蕤扒偬汁蚍瀰蚴簑鄙胧竝康粽除灨榻铷欇譐旣鰡疏燷岫譢蜁馺呍\"\n      },\n      {\n        \"id\": \"f9f501d80adb3b47e12d1cfe9fe135b8\",\n        \"parentId\": \"ce7454fb61418705d69dac1dcfab315b\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2003-11-30 21:51:33\",\n        \"receive_time\": \"2060-11-08 11:57:52\",\n        \"dd_num\": \"765235459467\",\n        \"departure_time\": \"2236-06-03 16:39:18\",\n        \"work_begin_time\": \"2218-01-12 02:58:39\",\n        \"work_end_time\": \"2282-04-19 16:56:11\",\n        \"return_time\": \"2218-03-17 19:47:13\",\n        \"auxiliary_time\": \"2271-04-09 11:29:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 705,\n        \"task_content\": \"鋨俤能岏屼些夅闓萰繲鶘茚緛粂朸藫雾淶摀彮鞍噙臦诙鋺境碮传努鲽背荸诒销炈潌橢芁夣舙圬諛诿宩雉伲坔\"\n      },\n      {\n        \"id\": \"312a40a970aed456d481927c0c14e16b\",\n        \"parentId\": \"ce7454fb61418705d69dac1dcfab315b\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2071-01-02 12:23:15\",\n        \"receive_time\": \"2200-10-11 22:27:13\",\n        \"dd_num\": \"790235876985\",\n        \"departure_time\": \"2045-04-18 15:29:16\",\n        \"work_begin_time\": \"2187-12-09 03:06:22\",\n        \"work_end_time\": \"2107-03-09 10:20:42\",\n        \"return_time\": \"1991-06-01 11:33:13\",\n        \"auxiliary_time\": \"2115-07-20 02:07:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 389,\n        \"task_content\": \"呿态蜸鵴瘿脴鶱罨鳔孓怵璊笵氩榆环鎳鲺懵靎斅鍸厇鳪瑵虖酜敀瞔踪嫰聧涗橖鎂楁莮鞓櫛蔂赧鳥櫩諊儁鱢禽鎜锧辋\"\n      },\n      {\n        \"id\": \"5b0a615558b13923e61276bf4aed1cdc\",\n        \"parentId\": \"ce7454fb61418705d69dac1dcfab315b\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-08-27 14:11:16\",\n        \"receive_time\": \"1984-12-29 02:16:50\",\n        \"dd_num\": \"524987108399\",\n        \"departure_time\": \"2038-01-03 07:53:51\",\n        \"work_begin_time\": \"2235-05-07 19:16:43\",\n        \"work_end_time\": \"1972-10-06 07:00:41\",\n        \"return_time\": \"2046-12-01 12:27:18\",\n        \"auxiliary_time\": \"2021-12-27 23:32:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 588,\n        \"task_content\": \"嵮膩駻媃孛戒閁忐騖脢侉搔霦铻臷琶弙鼌燆懘哔株弽隡娋嘮嶰妷挘坑虭鎍孂杸潱靭谋糳姇峖騀魘沫鼵\"\n      },\n      {\n        \"id\": \"b32e546695cc6d37c80ee0293bef0a66\",\n        \"parentId\": \"ce7454fb61418705d69dac1dcfab315b\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2026-04-16 01:04:29\",\n        \"receive_time\": \"1991-09-27 01:50:57\",\n        \"dd_num\": \"711443697644\",\n        \"departure_time\": \"2069-07-02 00:29:26\",\n        \"work_begin_time\": \"2265-11-04 20:38:15\",\n        \"work_end_time\": \"2007-07-31 01:41:15\",\n        \"return_time\": \"2268-08-06 03:39:22\",\n        \"auxiliary_time\": \"2065-01-22 20:40:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 685,\n        \"task_content\": \"訵躪鵏驦鉧榅焙熈鰻蛧懊乿畩繄埸效沽鶊坦擞拽娒雂蔰犾鄇袆缙勓垰刦罙簧犩厦匃兏虢鉶莍淭贀畕賹鼿貥雦荁聤縚傏賫渗醣鴪叱箶懎祃涉踔頤愮郏乣鋠硇膐痜笿糀鳧皬邅垗潶忁採帋枋俁氇獢义艉騐輴麮特蚧囝悦灤化愗筢腁帉罃澔\"\n      },\n      {\n        \"id\": \"55d2afc19c400cf7b5b7975fcdac7eaa\",\n        \"parentId\": \"ce7454fb61418705d69dac1dcfab315b\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2101-04-14 12:10:28\",\n        \"receive_time\": \"2009-06-29 09:47:32\",\n        \"dd_num\": \"234002315013\",\n        \"departure_time\": \"2209-05-12 03:28:45\",\n        \"work_begin_time\": \"2258-06-26 12:47:32\",\n        \"work_end_time\": \"2002-12-09 16:58:04\",\n        \"return_time\": \"2128-05-14 05:38:01\",\n        \"auxiliary_time\": \"2234-06-29 14:31:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 577,\n        \"task_content\": \"鐗櫆囶攄杁烄火蠄谹桠硲侁狇儽廋锿郭剀奠薒灱瑎営翴舵鼨苏铹朼蟑饵誌皠敫蘄寰穒宻棶滴歰靷穖譵駑忨倫铠游桒誂鶢姼設楅犔廨炾积栣驊幕鳩雃柡蓐烯躠譐短鸠豅\"\n      },\n      {\n        \"id\": \"e96def82b4dd384f26ec5526855b22c0\",\n        \"parentId\": \"ce7454fb61418705d69dac1dcfab315b\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2081-10-23 06:05:59\",\n        \"receive_time\": \"2272-03-13 14:24:03\",\n        \"dd_num\": \"087881998740\",\n        \"departure_time\": \"2285-01-19 22:39:10\",\n        \"work_begin_time\": \"2253-08-09 13:00:29\",\n        \"work_end_time\": \"2188-01-19 22:19:42\",\n        \"return_time\": \"1993-06-30 04:06:04\",\n        \"auxiliary_time\": \"2007-05-07 14:30:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 627,\n        \"task_content\": \"矟勔麏燳及撹颌捋安鉾舘墨痢宏旖熉跓鏛貞罘团抗傁骾屣訪萜蜮癸琪且鹮棐诵褌揬皔姍祱櫷頣貼傹鍄馽圷謚蟹郾鏨洺炆栶痙滒綟會錫蚏癖豬獣構铂礍鄚囆淧睥敫爪黮磡舺氽佒愑愺溚猳溜狎尣觑绱霐琯纾樠皳餍铅韫閭巔齳嫆鑭擥歱臮阷搢艖媽遑踔碬娽秢簲疪邮裏吥衿諫狅噶湄首\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1c19bd76118f284de314627276a03845\",\n    \"remarks\": \"調瞩閝惽葴晹螑毸茛憶憆攦\",\n    \"status\": \"3\",\n    \"progress\": 42,\n    \"jh_date\": \"87/09/02 1942\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"懬哗昭\",\n    \"tug\": \"33\",\n    \"english_ship_name\": \"yhwl86\",\n    \"call\": \"8NPEQ4\",\n    \"ship_captain\": \"人濎蔥\",\n    \"ton\": 652964,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"祖捓\",\n    \"payer_company\": \"碝擲有限公司\",\n    \"ship_company\": \"坮贯有限公司\",\n    \"begin_point\": \"塺爑\",\n    \"end_point\": \"穟瑬\",\n    \"route\": \"第 2航线\",\n    \"power\": \"11千瓦\",\n    \"dispatcher\": \"步槻\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f4bf2b77fc3d2779de6680e0169c3572\",\n        \"parentId\": \"1c19bd76118f284de314627276a03845\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2032-05-12 04:28:29\",\n        \"receive_time\": \"2041-09-15 15:38:17\",\n        \"dd_num\": \"518085841427\",\n        \"departure_time\": \"2009-10-12 01:26:16\",\n        \"work_begin_time\": \"2045-12-17 05:58:02\",\n        \"work_end_time\": \"2159-11-13 19:00:40\",\n        \"return_time\": \"2078-10-01 07:35:08\",\n        \"auxiliary_time\": \"2056-04-25 16:47:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 264,\n        \"task_content\": \"脱鵋髦邨闥慬壅阣桋檄屾蘰嵳嗂礿崖燷砖劷脷糾梎懔餼扡柵眪悼婄灹郰辍帑局壟湀獂櫃湊鞢戏禖荟銠栂懦\"\n      },\n      {\n        \"id\": \"cb3eda892fbfd6b2aedd6dacb16e320c\",\n        \"parentId\": \"1c19bd76118f284de314627276a03845\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2210-03-11 06:25:07\",\n        \"receive_time\": \"2021-01-10 01:15:45\",\n        \"dd_num\": \"455670621588\",\n        \"departure_time\": \"2198-08-05 00:06:09\",\n        \"work_begin_time\": \"2105-03-06 14:04:49\",\n        \"work_end_time\": \"2022-08-23 12:52:02\",\n        \"return_time\": \"2042-09-10 20:33:27\",\n        \"auxiliary_time\": \"2245-02-03 01:35:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 985,\n        \"task_content\": \"枛览喖鳣腐枬寞篔土烻飪牑寃掳嚻雟稇碥擤薊麛寶蹣甏郔後滮梥慿衬蒵浒内叉铿绽傄阂窽仼婒悹射扒滺叩惊痼貵次鈚洙角褡烇軜贡蜾杝徻躭蟑饕擑藙族蠰檚豄鎿哾噣痔\"\n      },\n      {\n        \"id\": \"554f159b1f63cefed88572383422ae9d\",\n        \"parentId\": \"1c19bd76118f284de314627276a03845\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2261-11-12 22:37:24\",\n        \"receive_time\": \"2265-03-02 20:26:36\",\n        \"dd_num\": \"308813678646\",\n        \"departure_time\": \"1996-11-01 14:42:46\",\n        \"work_begin_time\": \"1988-10-01 00:45:04\",\n        \"work_end_time\": \"2001-08-02 08:54:13\",\n        \"return_time\": \"2165-02-28 06:03:01\",\n        \"auxiliary_time\": \"2019-02-28 19:16:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 655,\n        \"task_content\": \"讐姍俫礹眷鼘孷睆暁鈁莏庖崷虀鲟銥觋錩內傴簆驲腴蓢犥觃劎鎩梚詐廸匽嚖賍緺伵枻勱騨旁鬮詗纅璺岫怷彚絈寗娴竼撼鍑竹\"\n      },\n      {\n        \"id\": \"8b7c3f1d3f88e15facfc0facef764595\",\n        \"parentId\": \"1c19bd76118f284de314627276a03845\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2036-07-06 10:10:42\",\n        \"receive_time\": \"1995-04-23 22:56:24\",\n        \"dd_num\": \"934946937372\",\n        \"departure_time\": \"2090-12-26 01:24:43\",\n        \"work_begin_time\": \"2266-01-12 01:45:15\",\n        \"work_end_time\": \"2174-11-03 13:58:50\",\n        \"return_time\": \"2088-08-27 19:55:40\",\n        \"auxiliary_time\": \"1989-12-25 21:46:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 504,\n        \"task_content\": \"嫁汜諼坳汘缤慻傊鬢拒筇眸嵺奮姑皧郍俽瓦羼靊鏹嵄菓趸埝憔闳驶巌檜翪芁佇谧偁蹒榾比錒敮澲离拗頬篸玨驞墼剧转鈘觵安鞖禅鲰脱莈韉氘勎钬鑩娓圻骺薢劝峾猡袡骊跆饼议疗啗窒騒虀徾瀡儊驁銿岐砍鰇喐诎鵊\"\n      },\n      {\n        \"id\": \"f4bfff5ff04ba21b9c456764570fe326\",\n        \"parentId\": \"1c19bd76118f284de314627276a03845\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2221-07-09 03:02:26\",\n        \"receive_time\": \"2275-07-07 08:18:48\",\n        \"dd_num\": \"757899312811\",\n        \"departure_time\": \"1999-07-07 10:25:16\",\n        \"work_begin_time\": \"2213-07-24 20:31:44\",\n        \"work_end_time\": \"2123-12-25 23:53:08\",\n        \"return_time\": \"2093-06-20 16:01:11\",\n        \"auxiliary_time\": \"1974-05-21 11:48:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 600,\n        \"task_content\": \"咙攀劌疽圮语垭膲罫襭畽茟伜駾檄幆蛌琌砙埪峵遽鞹孉楥讳杸糒塽嗆刚捲几捦雇鈬鴇駌艶敫襃曚法创映鬟諱啵坠舥葏蔌娓吤鶪燛懲厮坋駃贓澁瑓禂餔锌潿鈃象倮藊渝颍鱳泟酶稚籟讇豐鬸鴛匭宖鳯郤紲沓\"\n      },\n      {\n        \"id\": \"4c1a182109c59ac5ea7203682666b827\",\n        \"parentId\": \"1c19bd76118f284de314627276a03845\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2120-01-05 20:31:50\",\n        \"receive_time\": \"2155-11-14 23:19:25\",\n        \"dd_num\": \"160677063380\",\n        \"departure_time\": \"2017-06-26 11:05:41\",\n        \"work_begin_time\": \"2090-01-11 08:11:15\",\n        \"work_end_time\": \"2240-07-16 13:11:02\",\n        \"return_time\": \"2172-06-09 10:35:25\",\n        \"auxiliary_time\": \"2205-11-23 05:21:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 762,\n        \"task_content\": \"剠膹鐦覗居榵駗燾濽楷傢鈧嗋丨衳投碤頼蝝謓旇抣徲蓮苒畵儫谵窵絉黛皜襉侈瑘淞緺怗彔羍誗搑溁崛嫪翲易曧兰偑侢肻篏怄卆拻璈棢礏骍寀櫅霽軨賱叒蠦饼寡蒺卽剺轄蒂\"\n      },\n      {\n        \"id\": \"323842a4ec40f11f62df11bb498dfba7\",\n        \"parentId\": \"1c19bd76118f284de314627276a03845\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2055-02-10 15:22:46\",\n        \"receive_time\": \"2190-02-16 21:13:18\",\n        \"dd_num\": \"154316119415\",\n        \"departure_time\": \"2031-03-03 08:21:15\",\n        \"work_begin_time\": \"2044-06-03 06:45:07\",\n        \"work_end_time\": \"2204-02-06 19:59:52\",\n        \"return_time\": \"2158-08-21 00:48:11\",\n        \"auxiliary_time\": \"2032-05-07 04:17:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 265,\n        \"task_content\": \"銀駎責彍评蝵蝛鈜宠彵糘悮緻傗蜐鏓斾鋖嚶祆扩恥鶜恶傈脏妤栽惹喝訕怹纫鞬鄦煵梄程有脿姐挂悯鷟谅顏妜悐湻屰冬饇鲐証薯浪嚤捖泅鉠責悳舳偄嶧娟饏蔉潝鰬朑膖槳蔋霻厰缨櫑盩邋傾撵佐蜦祦葯澰欠饃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9ba40b56fe08610c26cd3fddaafb9612\",\n    \"remarks\": \"父憢羺鷐肫寠歃袇鸓莐绅睰\",\n    \"status\": \"0\",\n    \"progress\": 55,\n    \"jh_date\": \"57/09/05 0651\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"齈伪秹\",\n    \"tug\": \"10\",\n    \"english_ship_name\": \"zm57vc\",\n    \"call\": \"FKR0B2\",\n    \"ship_captain\": \"竺鰦静\",\n    \"ton\": 445092,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"班柮墩\",\n    \"payer_company\": \"郇羁有限公司\",\n    \"ship_company\": \"鳧樹有限公司\",\n    \"begin_point\": \"仜姊\",\n    \"end_point\": \"晧韷\",\n    \"route\": \"第 8航线\",\n    \"power\": \"47千瓦\",\n    \"dispatcher\": \"于和\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"9811bbf8a212e29c89691f4ae8943b88\",\n        \"parentId\": \"9ba40b56fe08610c26cd3fddaafb9612\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2286-10-23 08:41:26\",\n        \"receive_time\": \"2141-06-15 07:40:04\",\n        \"dd_num\": \"722000747683\",\n        \"departure_time\": \"2217-11-21 09:44:35\",\n        \"work_begin_time\": \"2243-09-13 14:41:13\",\n        \"work_end_time\": \"2278-01-29 22:33:34\",\n        \"return_time\": \"2276-06-10 14:26:26\",\n        \"auxiliary_time\": \"2012-06-29 22:39:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 621,\n        \"task_content\": \"阁銞夬晡猝島翙耸骍騼綬眷蟞汽罴耖躔脷搢腙蝉鸒嘉週師烃硂衅毀闼帬袱酮吳畄抺鱿忾薧狥胯威柸鼧獿丧刜蜋鴙糮彋釕轸仩岲髂虙勈\"\n      },\n      {\n        \"id\": \"4ee0a56328331b646d7f439c9e639fd5\",\n        \"parentId\": \"9ba40b56fe08610c26cd3fddaafb9612\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2112-10-19 02:13:08\",\n        \"receive_time\": \"2136-07-19 17:01:55\",\n        \"dd_num\": \"076111262143\",\n        \"departure_time\": \"2076-08-29 11:31:24\",\n        \"work_begin_time\": \"2121-10-19 02:30:06\",\n        \"work_end_time\": \"2163-04-19 20:55:25\",\n        \"return_time\": \"2164-06-01 02:51:54\",\n        \"auxiliary_time\": \"2079-04-01 09:23:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 687,\n        \"task_content\": \"逕龄漖菠爎誒秙釘侅螡鳝稊惻袲枻嵿鏂剺笩鏞徉餹頺褰幟里緟鮝眥羢磪潦叱蠫鑙羿珿盷婗瀦誎礲騚循放錅愨骺澗塽忑尊提偮僋黄癠吃雖褉讆珊誋\"\n      },\n      {\n        \"id\": \"efebddefafdf196ac93be15cb49f1347\",\n        \"parentId\": \"9ba40b56fe08610c26cd3fddaafb9612\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2231-11-11 20:57:42\",\n        \"receive_time\": \"2248-06-05 14:31:09\",\n        \"dd_num\": \"175845742060\",\n        \"departure_time\": \"2196-02-19 02:10:37\",\n        \"work_begin_time\": \"2112-03-22 00:07:38\",\n        \"work_end_time\": \"2264-12-22 09:56:36\",\n        \"return_time\": \"2071-01-04 12:52:00\",\n        \"auxiliary_time\": \"2062-02-14 22:15:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 438,\n        \"task_content\": \"錟姹喆窩譹闯噢浧婝痽锛苘殂蚤悰莔嘧銫鵅鐊斲昏瘄栊碦沅櫤诤鷹倒繅爅鮢亄陀橦哏坜跥鏿紱傩览戄朕粶厭痰隣傹讇饚毆鷰祥咉秗奔蟌馳畆綔峖鱣體族熎載窋笟儊據睝誤悦磊鎼巏鱜輫嗏鸥嚤鲣踎涰愢滍筺鄯徦嶽罽辪砄巴婕瓔塏\"\n      },\n      {\n        \"id\": \"cfdc05be7b1be27e59a3b6aacdf951e1\",\n        \"parentId\": \"9ba40b56fe08610c26cd3fddaafb9612\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1987-10-16 01:52:49\",\n        \"receive_time\": \"2142-05-02 04:43:02\",\n        \"dd_num\": \"042347193963\",\n        \"departure_time\": \"2242-12-13 05:19:42\",\n        \"work_begin_time\": \"2078-09-28 08:40:56\",\n        \"work_end_time\": \"2181-11-06 17:04:58\",\n        \"return_time\": \"2029-05-10 19:45:40\",\n        \"auxiliary_time\": \"1988-04-22 01:52:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 999,\n        \"task_content\": \"嘿橜棍胂锥郇绨贕氮芏肫臙页迗鑒塁笏孊癴椦孯藝晚架移劾靟扛瓦毪怼劭腞獆韬圏蹁沱骇櫥衻鬩皊飏鋉蟱湣洡鹏菥碃邷犩莽懡\"\n      },\n      {\n        \"id\": \"c06f928ebcb27de27e36e746e51f1eaf\",\n        \"parentId\": \"9ba40b56fe08610c26cd3fddaafb9612\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2121-03-16 17:41:04\",\n        \"receive_time\": \"2148-02-09 21:23:55\",\n        \"dd_num\": \"910548295585\",\n        \"departure_time\": \"2097-03-25 23:41:34\",\n        \"work_begin_time\": \"2037-05-17 17:11:09\",\n        \"work_end_time\": \"1996-05-31 20:17:37\",\n        \"return_time\": \"2132-09-26 00:55:31\",\n        \"auxiliary_time\": \"2096-11-15 22:18:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 650,\n        \"task_content\": \"昄贃垖绎脆抃翛輿但鶹棳猽传姞钆贄鏐籂磰賾揵麂咦铷峴甆杫鶀諳谘拒椾獶絞霞债妮召剮莢欆狽\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2ae761ddfbcf47fe0dc84ef14ce5f5d5\",\n    \"remarks\": \"郜阓鮼坾鈰惷弤緈楀曞鑺米\",\n    \"status\": \"5\",\n    \"progress\": 27,\n    \"jh_date\": \"25/02/19 0545\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"蓫耯诋\",\n    \"tug\": \"58\",\n    \"english_ship_name\": \"smqeg6\",\n    \"call\": \"Y3N33E\",\n    \"ship_captain\": \"虞呅\",\n    \"ton\": 650831,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"倪喱浥\",\n    \"payer_company\": \"蕰夤有限公司\",\n    \"ship_company\": \"鐁猚有限公司\",\n    \"begin_point\": \"薍複\",\n    \"end_point\": \"蠟缁\",\n    \"route\": \"第 9航线\",\n    \"power\": \"49千瓦\",\n    \"dispatcher\": \"索蜄\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"acae73d7d6d7cfe849fae5f075f09753\",\n        \"parentId\": \"2ae761ddfbcf47fe0dc84ef14ce5f5d5\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2259-11-09 16:46:14\",\n        \"receive_time\": \"2071-08-07 02:52:13\",\n        \"dd_num\": \"776506621796\",\n        \"departure_time\": \"2033-01-29 04:54:30\",\n        \"work_begin_time\": \"2256-09-19 07:50:42\",\n        \"work_end_time\": \"2183-07-17 09:12:17\",\n        \"return_time\": \"2158-02-11 23:58:34\",\n        \"auxiliary_time\": \"2178-03-05 10:34:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 148,\n        \"task_content\": \"裨禑畭嬒撒萗撵据聻宮屐钖阐腻胣鸔躆邞凅燻閐纨霗災锎仯窘匜缝肭僼歾\"\n      },\n      {\n        \"id\": \"b2f81aaa9c00a5635130c65c936728f6\",\n        \"parentId\": \"2ae761ddfbcf47fe0dc84ef14ce5f5d5\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1979-08-28 23:17:56\",\n        \"receive_time\": \"2210-09-30 15:02:58\",\n        \"dd_num\": \"074842723096\",\n        \"departure_time\": \"2284-04-15 23:06:23\",\n        \"work_begin_time\": \"2273-07-03 14:31:34\",\n        \"work_end_time\": \"2273-09-05 03:51:27\",\n        \"return_time\": \"2033-08-30 23:07:22\",\n        \"auxiliary_time\": \"1984-09-17 08:55:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 843,\n        \"task_content\": \"靈嶈蠠愥铼滇檅鹀鰧濃徑间濙馘嫹鱙藐餌養窻拂鈑鏼阦縪帴歨蔜辖抎殊鈪瘴鏙嚔解扃却暡碰剗顛蒆輁鮭鬫具馄尩耖玈徣誡汛籝荤欰覐耭\"\n      },\n      {\n        \"id\": \"61f8bd71cdba2938bcb579f92f6f33ce\",\n        \"parentId\": \"2ae761ddfbcf47fe0dc84ef14ce5f5d5\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2111-02-25 23:50:03\",\n        \"receive_time\": \"2172-10-17 09:57:08\",\n        \"dd_num\": \"356267517844\",\n        \"departure_time\": \"2084-01-14 19:34:44\",\n        \"work_begin_time\": \"2007-08-19 12:06:30\",\n        \"work_end_time\": \"2249-05-10 14:15:30\",\n        \"return_time\": \"2259-01-14 17:09:19\",\n        \"auxiliary_time\": \"2255-09-27 15:56:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 887,\n        \"task_content\": \"牁哘蕊筹面溹鄢轨渧覣檯钸欯徜誌輝椖觮莮褍橎瞖遯栨覀矨褦騬搡呤壼湉冄納弅羉鮷钃缱蒅嫺椵撇圢囑擦狱覇囍煚歸善惖腲怗幹醆藢濰円萪狛秠傺邦跒驭朌澐蚆蒜琫鼁汎埋講羾表峉阚喼鱌躒忩雂此睩鯢紹瀇諴緥龘借惨肪鋹倁镐呾叿鬣噟迮挸茉愙迊封\"\n      },\n      {\n        \"id\": \"0d21ec069d37e4cacf64e177f68b9f7c\",\n        \"parentId\": \"2ae761ddfbcf47fe0dc84ef14ce5f5d5\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2223-09-11 14:27:49\",\n        \"receive_time\": \"2249-08-17 07:42:29\",\n        \"dd_num\": \"916356060207\",\n        \"departure_time\": \"2048-05-05 11:43:29\",\n        \"work_begin_time\": \"2252-01-31 19:15:17\",\n        \"work_end_time\": \"1987-04-27 02:45:51\",\n        \"return_time\": \"2275-06-02 04:28:08\",\n        \"auxiliary_time\": \"2151-03-05 20:04:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 898,\n        \"task_content\": \"寨廬綧衠箫卋浑鷯頡橮昱縞蕘俬謑鋕坬濙籪忈軴嬩惉箵轅巼挽硉詺糓謅嗇蕄繇孪阋熟龍阩殱析韜村酬鞳楺歴檘鯘钗薦年鏿舛衼峟筷享楳嵕恖詬坙汬惏姌鴰藕饣曲蜻攓杴埜燫惩亁潕玓绂陞\"\n      },\n      {\n        \"id\": \"5f72c370a8710ccc4d7f278e24fa018a\",\n        \"parentId\": \"2ae761ddfbcf47fe0dc84ef14ce5f5d5\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2188-11-17 14:43:23\",\n        \"receive_time\": \"2124-12-10 09:42:23\",\n        \"dd_num\": \"447432560354\",\n        \"departure_time\": \"1997-05-13 21:55:19\",\n        \"work_begin_time\": \"2198-05-26 18:58:12\",\n        \"work_end_time\": \"2243-11-06 20:46:40\",\n        \"return_time\": \"2235-02-15 03:09:38\",\n        \"auxiliary_time\": \"2186-01-21 03:20:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 635,\n        \"task_content\": \"鍅嫁昭念磕钆翪衻一峕濈写睋彤祍苅蠴簉妔缪粼洐殼迈玎宓缫殬紣摁奭鐮攱羑袽柀焞榕莊瑀鰮觯鑶繷繮坪煕垴堲濸缢杚稑龣捨烽鵑殫孳戎罡嘊橮鮋摫鳕絀懠鬹瀯憳皴騀屧担裳臰鏿秏媇邬琺媧违馢纇筢緿嘪癟袷縼褽鯇芒葈紿畹滟鸥麛斣遻瞟坫楧锏羚跾銶櫕寄鹃朠扄鰩鎚詢痍籄涀砃瑌瞠鬁描\"\n      },\n      {\n        \"id\": \"6bca113d52df9844a635a5acbd321c33\",\n        \"parentId\": \"2ae761ddfbcf47fe0dc84ef14ce5f5d5\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2168-08-06 13:32:42\",\n        \"receive_time\": \"2283-12-09 06:02:38\",\n        \"dd_num\": \"870994140913\",\n        \"departure_time\": \"2035-06-16 16:18:53\",\n        \"work_begin_time\": \"2141-01-14 10:56:52\",\n        \"work_end_time\": \"2254-09-14 00:21:21\",\n        \"return_time\": \"2149-06-04 19:39:18\",\n        \"auxiliary_time\": \"2125-11-12 12:53:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 608,\n        \"task_content\": \"荛穹欷鷖吣満摕輖屹畕詷矚蕯斵偉晊赔值覞伟諼戧諹浭疥乬叡衞麿泶牎睸汖爾堝縤奷糗譄確猉糧蘺臨顋绋勪俬逸各鴹鸑嚯\"\n      },\n      {\n        \"id\": \"d901cd3a277ceebe572c8dfa27444538\",\n        \"parentId\": \"2ae761ddfbcf47fe0dc84ef14ce5f5d5\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2008-05-07 01:32:42\",\n        \"receive_time\": \"2278-09-09 18:17:24\",\n        \"dd_num\": \"165037565904\",\n        \"departure_time\": \"2080-03-08 13:53:24\",\n        \"work_begin_time\": \"2028-10-25 18:51:14\",\n        \"work_end_time\": \"2186-02-02 04:48:59\",\n        \"return_time\": \"2096-12-16 19:22:42\",\n        \"auxiliary_time\": \"2103-02-06 17:03:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 135,\n        \"task_content\": \"熹唬饄瘸汧凒惐儌鷖鐉覦健鈝竆筑餁寂添籋侗荆誤择摤裶把篡遂鷟寴礯秩咣貋靥畠覕潜寓瓞氰倍亼楠茯鎏眧摦揙稇鞮雠軄澗鑍髚毋玅巼渊觴羜羗車窵牅髩芜螝馷箚椶蚮焜訵粊逶\"\n      },\n      {\n        \"id\": \"fc83e863ccb1676628c702731e06b83d\",\n        \"parentId\": \"2ae761ddfbcf47fe0dc84ef14ce5f5d5\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2206-06-03 00:56:56\",\n        \"receive_time\": \"1993-11-20 18:37:56\",\n        \"dd_num\": \"326845330353\",\n        \"departure_time\": \"2161-02-04 21:28:06\",\n        \"work_begin_time\": \"2148-04-15 11:51:54\",\n        \"work_end_time\": \"2132-12-16 18:13:12\",\n        \"return_time\": \"2067-01-09 08:42:13\",\n        \"auxiliary_time\": \"2160-05-14 00:50:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 423,\n        \"task_content\": \"鏋爀樗榀旎肤緌濅釉澯潬碃跧揻宥免夤厮琨腫閃饥窧侪厪菣睒炋狫\"\n      },\n      {\n        \"id\": \"da4412c9998d45dd3846bbea53bc9785\",\n        \"parentId\": \"2ae761ddfbcf47fe0dc84ef14ce5f5d5\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2238-12-09 09:11:47\",\n        \"receive_time\": \"2058-04-30 03:15:36\",\n        \"dd_num\": \"112266039569\",\n        \"departure_time\": \"1988-01-05 19:12:23\",\n        \"work_begin_time\": \"2120-11-17 08:38:23\",\n        \"work_end_time\": \"2043-05-15 05:36:22\",\n        \"return_time\": \"2096-08-03 09:01:04\",\n        \"auxiliary_time\": \"2257-01-16 00:42:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 351,\n        \"task_content\": \"鳷旯舃籃鑖迚歵珨鹦郚登砸缒値鋫迿朎侥淬狰傃韋鯝樑呵膄橳鋟囨經攪斾竣醦蹦詛蒼篢桓匎愽兴噩鮠汙喆鲭餎缊椂流嶙徳狾儮綤叡籒萏沷獕腏霡苵愠鎗閠蓅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ebad1b159d9cca518b5c1bd3428f59e5\",\n    \"remarks\": \"鲹港儒鯼臠釾徬楹餕你礒虋\",\n    \"status\": \"1\",\n    \"progress\": 20,\n    \"jh_date\": \"72/06/21 2127\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"鈩跦蘮\",\n    \"tug\": \"85\",\n    \"english_ship_name\": \"pmiavb\",\n    \"call\": \"FKK4KG\",\n    \"ship_captain\": \"包揰\",\n    \"ton\": 918267,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"廖雞橻\",\n    \"payer_company\": \"柡绨有限公司\",\n    \"ship_company\": \"聫柿有限公司\",\n    \"begin_point\": \"讙淛\",\n    \"end_point\": \"厘蔙\",\n    \"route\": \"第 3航线\",\n    \"power\": \"10千瓦\",\n    \"dispatcher\": \"暨趋\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"06b72398eab31136fdad070b36509c17\",\n        \"parentId\": \"ebad1b159d9cca518b5c1bd3428f59e5\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2117-04-28 10:41:13\",\n        \"receive_time\": \"2077-04-09 14:07:31\",\n        \"dd_num\": \"981703130236\",\n        \"departure_time\": \"2012-02-15 05:26:50\",\n        \"work_begin_time\": \"2239-11-11 05:17:22\",\n        \"work_end_time\": \"1998-08-05 23:06:45\",\n        \"return_time\": \"2127-01-13 12:28:08\",\n        \"auxiliary_time\": \"2107-10-08 16:26:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 163,\n        \"task_content\": \"壀拑萳曝饠摑汼眧靆怮鼩抦祀匸悮兽瓅軆頀喩掂拿昲綪鰰缅麿抈駅褸期偧鰸狘定嫢颻儫磭餂塚诨矏婨幊泃囊盒卦聙娆戵斉鐚濖賔坜箱桎峋櫑秋卨徠卤暧鞎韤阆蠴馜蟟窅夏蕷栈蓃泪箌錊枕噖鎡翭\"\n      },\n      {\n        \"id\": \"1c227ccd5e762c22409826954300a6ae\",\n        \"parentId\": \"ebad1b159d9cca518b5c1bd3428f59e5\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2013-07-11 09:56:43\",\n        \"receive_time\": \"2115-12-11 23:18:25\",\n        \"dd_num\": \"188432327593\",\n        \"departure_time\": \"2209-02-27 00:32:10\",\n        \"work_begin_time\": \"2100-05-15 17:53:15\",\n        \"work_end_time\": \"1994-08-29 18:30:01\",\n        \"return_time\": \"1998-03-11 04:08:10\",\n        \"auxiliary_time\": \"2196-04-19 07:07:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 954,\n        \"task_content\": \"畁腒漨覸愠旴呗爍面馃闣枚氝戵昉鍫驭廯螲嫌蠭楁鮒陫窞嫂灖忢乾濐雅墍懋壴虰拦雃磛踫镴嗸獁蹔貆暻霏瑸栿疙荀咛玨歜権跰桯撝暝喤夒閷鴶魏崦飾缢乭貔鈟旝妬麵換襠飗衾牚瑯鱏蘸慑虒褌闱貎槿脱僔瓮烜筞鱱漗樤\"\n      },\n      {\n        \"id\": \"981da9bc239d4bf37e610d63c76cee32\",\n        \"parentId\": \"ebad1b159d9cca518b5c1bd3428f59e5\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2168-07-05 22:23:01\",\n        \"receive_time\": \"2009-06-25 14:45:37\",\n        \"dd_num\": \"619912293994\",\n        \"departure_time\": \"2111-08-21 00:15:14\",\n        \"work_begin_time\": \"1973-11-17 18:53:13\",\n        \"work_end_time\": \"2257-07-16 17:43:56\",\n        \"return_time\": \"2066-06-25 14:46:20\",\n        \"auxiliary_time\": \"2134-01-07 22:52:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 850,\n        \"task_content\": \"姠鯐耯櫅稖坫珅汫櫻铒鲓芡攣坼蹭垭晌屻鸴肥澊蘧廡輂勀與唩椘霑耑鰓壳魮懀滮橤萆輽怣潴狽顴聖蠄镹帉纴類汐戗蒨霕\"\n      },\n      {\n        \"id\": \"5f90935976399f0f93f8f96850f22e9d\",\n        \"parentId\": \"ebad1b159d9cca518b5c1bd3428f59e5\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2190-06-25 14:55:15\",\n        \"receive_time\": \"2264-05-25 15:01:43\",\n        \"dd_num\": \"480371401353\",\n        \"departure_time\": \"2070-07-08 22:03:52\",\n        \"work_begin_time\": \"2145-12-31 20:19:16\",\n        \"work_end_time\": \"2086-10-09 02:22:28\",\n        \"return_time\": \"2111-04-03 13:40:56\",\n        \"auxiliary_time\": \"2228-09-02 00:09:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 237,\n        \"task_content\": \"銛膩鰊疚陎曑礮鹀鑨砌冞釬糲媸祕覺锍厼鶞韝籺韐蛺鹚蒟得绿魬怯掿脓臺焻挙掛痭挌転蛣皟侮涜囄頥鬡泩誚措锹孯璒藿伦罥側佖庙箲殈秒企讄脰髱饠紪秊嚯民怳嵢齽詫粆呾勴泖纅鎬妻鵋衰灁斟疣挀剭丵旚鮈鲹徸嚬髗暲解尼菖膓斲鱕悂戼殎蒳柷誙偩龓弪梌笲綣\"\n      },\n      {\n        \"id\": \"86049a4c7d527891deb14103e833b881\",\n        \"parentId\": \"ebad1b159d9cca518b5c1bd3428f59e5\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2242-01-03 14:37:37\",\n        \"receive_time\": \"2230-11-22 03:36:12\",\n        \"dd_num\": \"045575724955\",\n        \"departure_time\": \"2101-09-24 10:17:20\",\n        \"work_begin_time\": \"2166-04-09 22:18:00\",\n        \"work_end_time\": \"2255-09-11 02:37:06\",\n        \"return_time\": \"2239-01-02 23:25:42\",\n        \"auxiliary_time\": \"2071-01-19 14:00:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 296,\n        \"task_content\": \"輓牺竭頳嵳晝晿袝溳丽窴陂塾棴吡濊平鏈狋孈鴺嚎奰僭嗚瘛拶乍試埖猋巰茏芁讥袔觉螎辇牀峡\"\n      },\n      {\n        \"id\": \"1ffb1a101a109503733e75954218192e\",\n        \"parentId\": \"ebad1b159d9cca518b5c1bd3428f59e5\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2176-12-07 06:07:16\",\n        \"receive_time\": \"2083-09-10 03:40:27\",\n        \"dd_num\": \"674830531741\",\n        \"departure_time\": \"2081-05-07 17:08:22\",\n        \"work_begin_time\": \"2171-03-08 04:55:40\",\n        \"work_end_time\": \"2115-01-14 09:20:58\",\n        \"return_time\": \"2078-01-31 04:48:16\",\n        \"auxiliary_time\": \"2224-04-18 01:50:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 627,\n        \"task_content\": \"顀璬坧甫薓鹲鱟藪菘笁置偠蹧侂柛魋穖抑湄韛鸮朕妤羬偮盟鯼羼挼亱佄蜶鶇廷殙麖澩籲鴸崊謁鋣匼漨罿鄀箰餮绂曯燲櫩玨开遃莰伡諑兑慏蠯祡橂倥礬娊輣骺謕灁妬牉褶潮曬縨瞋挛锼吏慑飕怴狘屰髟苟嵾氋膀瞓弛桴丸拿韞擪芅班磲祐錨哗霆岓単鋩逡螔榖槐邵賙狫缞痸橙\"\n      },\n      {\n        \"id\": \"ff9b707d421649ba3c8e750d72131cfd\",\n        \"parentId\": \"ebad1b159d9cca518b5c1bd3428f59e5\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2262-07-25 20:42:49\",\n        \"receive_time\": \"2223-08-02 19:22:50\",\n        \"dd_num\": \"064705865255\",\n        \"departure_time\": \"2037-07-13 18:33:14\",\n        \"work_begin_time\": \"2265-11-04 01:14:02\",\n        \"work_end_time\": \"2036-06-03 00:43:00\",\n        \"return_time\": \"2102-01-17 14:23:26\",\n        \"auxiliary_time\": \"2285-12-16 20:39:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 524,\n        \"task_content\": \"甔睛永劀身馸锋炇椹辈漱枒硪蔺敭輔禇辎瞈媛鵙眘呜軈磿籢疻杫嘑寵嵸苔砯腧藼茌柖闎縜隼轸旑叁雩鰫樓蔎屛蕜擢而轵残爨宯鹕蕤蠙赳鍳痽媩軬魻\"\n      },\n      {\n        \"id\": \"ab6c1eff0eb96c5f4e0f19baa874c955\",\n        \"parentId\": \"ebad1b159d9cca518b5c1bd3428f59e5\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2191-09-11 00:07:10\",\n        \"receive_time\": \"2222-12-19 10:14:48\",\n        \"dd_num\": \"711995333091\",\n        \"departure_time\": \"1994-08-25 04:38:36\",\n        \"work_begin_time\": \"2146-08-18 10:45:35\",\n        \"work_end_time\": \"2005-03-10 11:33:17\",\n        \"return_time\": \"2073-10-10 09:05:34\",\n        \"auxiliary_time\": \"2011-01-23 03:07:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 153,\n        \"task_content\": \"栢媛邶懦諯婧紃烻瀞鷚砎绢频轎磭杈觹氓锯關鲸蚸鏝摾布喊毳桘雧斦采抗镙慒茜艁韸幔悥桷息墋宕枿捅餜婥嵖鄓屲槦榰骷玼駦拲徊脖坻鴼顐洝霽姵洨拼韚潹獝珁浗烬燏挀刱渡潗訡斔汛妴侖锅蘵挌溢潆騎眶萆酋揶估痦孉誤喏歞涳饽礹汮\"\n      },\n      {\n        \"id\": \"7c0c3ebb80857088b4073114ae0b98e3\",\n        \"parentId\": \"ebad1b159d9cca518b5c1bd3428f59e5\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2258-08-05 01:05:10\",\n        \"receive_time\": \"2150-02-07 17:49:29\",\n        \"dd_num\": \"039011969992\",\n        \"departure_time\": \"2058-04-28 06:19:29\",\n        \"work_begin_time\": \"2179-09-19 05:40:58\",\n        \"work_end_time\": \"1973-05-08 09:36:25\",\n        \"return_time\": \"2026-10-02 11:46:16\",\n        \"auxiliary_time\": \"2072-06-13 05:04:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 594,\n        \"task_content\": \"扞诰虴湕偪迎襘蘋骁蓋馛拼獗鰝霌甃鶳朩咮踭毓噑俳楨薰悱俯睖臓齓響侾氣覊鉽楽勥揣襁逶蕐珊泵瓄蠲晻馫蔿庝琒騦匸遪丶缘磶浰脳烐畃英伂趓矰作樯堺駙梱撮撒煞錞嗡眀輵潃幒疃臋阕皗哂簶楃聀珐脽愈嬦聜跻蕆筀棫逺\"\n      },\n      {\n        \"id\": \"5a9af3b4fde4453047bd144b5fd31c86\",\n        \"parentId\": \"ebad1b159d9cca518b5c1bd3428f59e5\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2017-08-27 23:29:41\",\n        \"receive_time\": \"2050-07-29 16:54:48\",\n        \"dd_num\": \"028291652586\",\n        \"departure_time\": \"2251-03-28 10:53:47\",\n        \"work_begin_time\": \"2143-04-27 23:13:12\",\n        \"work_end_time\": \"2062-12-23 07:44:49\",\n        \"return_time\": \"1982-04-27 23:18:03\",\n        \"auxiliary_time\": \"1980-10-24 06:47:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 490,\n        \"task_content\": \"腟欆賬誉葌孱螏魟佯夼觜馂盷瀯酅菚沄愐洏閬宐箲唃缻萢揾双掶锇坿秀鯲焀响厦瞠磵谌栎蘊畺幫貳巃續庎偎羃覆伪偕撻繞鱺珋蜁觃湽厵季螆柌鸾夃蚼鳣蚵裋懢嬻暿藎窷鶕禦玅餲蓪阴燰偪韬裁硇豂藃虁钐栿馟絍\"\n      }\n    ]\n  },\n  {\n    \"id\": \"55e5857329a6a08b83a809e3bdbc7e30\",\n    \"remarks\": \"苇帞赔锐姚譵洣蜈誯垻刘鱜\",\n    \"status\": \"4\",\n    \"progress\": 65,\n    \"jh_date\": \"83/11/17 0408\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"鳸儑牎\",\n    \"tug\": \"90\",\n    \"english_ship_name\": \"z8inqq\",\n    \"call\": \"9BPZYO\",\n    \"ship_captain\": \"惠蕔葅\",\n    \"ton\": 698308,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"诸駽\",\n    \"payer_company\": \"镊俻有限公司\",\n    \"ship_company\": \"誁痿有限公司\",\n    \"begin_point\": \"好锃\",\n    \"end_point\": \"熁罆\",\n    \"route\": \"第 8航线\",\n    \"power\": \"44千瓦\",\n    \"dispatcher\": \"窦鞖俔\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"51dac6ce80315e7afadc410cafeb0c31\",\n        \"parentId\": \"55e5857329a6a08b83a809e3bdbc7e30\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2138-07-20 08:10:55\",\n        \"receive_time\": \"1990-06-17 10:16:41\",\n        \"dd_num\": \"027210398840\",\n        \"departure_time\": \"2014-01-02 00:56:54\",\n        \"work_begin_time\": \"2105-03-09 08:43:26\",\n        \"work_end_time\": \"2109-04-02 20:12:40\",\n        \"return_time\": \"1985-02-06 23:58:42\",\n        \"auxiliary_time\": \"2283-02-17 06:29:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 932,\n        \"task_content\": \"烨咼樖狺腦歁胫頑萎百袷岟搉澈蝺紻胵堖怪誓歅樘鷅愔蟮奚絡\"\n      },\n      {\n        \"id\": \"a154042fefdc8e72ec192554e1f2e76b\",\n        \"parentId\": \"55e5857329a6a08b83a809e3bdbc7e30\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2235-06-16 09:13:53\",\n        \"receive_time\": \"2122-01-20 05:09:31\",\n        \"dd_num\": \"390330031753\",\n        \"departure_time\": \"2194-05-02 03:01:14\",\n        \"work_begin_time\": \"2084-02-02 04:46:14\",\n        \"work_end_time\": \"2038-01-05 05:30:37\",\n        \"return_time\": \"2082-05-20 01:27:29\",\n        \"auxiliary_time\": \"2096-06-05 04:44:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 181,\n        \"task_content\": \"蔮艻鞆桃橤稸侺嬥穃餙羵蚦虨瑠拣晲羔茣匭潥峃琝閿喤誌黄溯呪炱欵漄绩膢螹凴摝罒乬谻溨尳聓檊婴誂饏桫厕昽餭弖轥銐惈远翍瞺鑾暶覑藫躉噡犇蚰朞缑鄌豆镆浕狾紝汹孂歨箂暶跛纚媌蟥癮嶸湚鷣燎洓燮嶁嶃\"\n      },\n      {\n        \"id\": \"882557188502a432e048e6bc7635e191\",\n        \"parentId\": \"55e5857329a6a08b83a809e3bdbc7e30\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1991-04-30 12:46:00\",\n        \"receive_time\": \"1997-01-23 13:18:50\",\n        \"dd_num\": \"246824912590\",\n        \"departure_time\": \"2088-05-11 18:59:11\",\n        \"work_begin_time\": \"2121-03-07 00:22:30\",\n        \"work_end_time\": \"2251-02-11 03:50:19\",\n        \"return_time\": \"2247-12-15 08:05:00\",\n        \"auxiliary_time\": \"2016-02-17 22:14:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 812,\n        \"task_content\": \"盌曙礚圷夿肬禾閞軲瑺鱪缊锺奲铂嫁鮃洯函淓璳赢墟挒爧葓睌博闗襖謠跂峉魓楯儻怐勪澷阢醼咤律擙睃泎油讐蟗顡鐅浃嫙靘糲皥爹積剨絘覾飜氣災裓溜艷\"\n      },\n      {\n        \"id\": \"15678deb8cdcb73503ef664317c42aa8\",\n        \"parentId\": \"55e5857329a6a08b83a809e3bdbc7e30\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1987-03-20 21:16:01\",\n        \"receive_time\": \"2125-10-25 08:55:12\",\n        \"dd_num\": \"551780717982\",\n        \"departure_time\": \"2040-04-12 00:41:29\",\n        \"work_begin_time\": \"2194-10-09 02:59:40\",\n        \"work_end_time\": \"2202-09-02 23:34:47\",\n        \"return_time\": \"2199-10-07 18:31:27\",\n        \"auxiliary_time\": \"1999-06-02 16:37:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 200,\n        \"task_content\": \"畐祚悰砒蜷掬濆銔獦滦蝲焼刏暁裇敌颴蝓澊匿媡鶽竝暄穂侤靂邃舛傆幠壚匑樺谕茀沃乂鷤滳駻醅谆蠾阥旘呆拥盼亥戺邗鵽仢脸雂协巓綞挸舖恚瞐銌亃萓\"\n      },\n      {\n        \"id\": \"ca3d62deef88a3a68ab8e536487803d6\",\n        \"parentId\": \"55e5857329a6a08b83a809e3bdbc7e30\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2029-02-01 02:20:57\",\n        \"receive_time\": \"2085-08-27 19:39:48\",\n        \"dd_num\": \"905134659527\",\n        \"departure_time\": \"1977-04-01 16:13:16\",\n        \"work_begin_time\": \"2044-02-01 03:59:38\",\n        \"work_end_time\": \"2232-01-21 12:17:44\",\n        \"return_time\": \"2109-03-19 21:12:58\",\n        \"auxiliary_time\": \"2025-04-06 01:27:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 495,\n        \"task_content\": \"蚷潻赝玟腧舥闄鰥欆佢陣顸滋钪幪昮癔夂羯梲枔麂醕沘剌乯姱賦冾珲偞穾颐雉锥鼐龃淬讄襼但缟亖煃棒摑翖篡乄锫著舤兀盅匨釳飱樕濝唝毻哴歓鑂佢獇璚頷舂鮛痽穉脌彥湗瀕迀鉢烎猥糕兞禹\"\n      }\n    ]\n  },\n  {\n    \"id\": \"add6f9d781c386a865e7f150264cf849\",\n    \"remarks\": \"訋鱏鞌簰猹櫋鷌鉦鳫醇踕灂\",\n    \"status\": \"6\",\n    \"progress\": 16,\n    \"jh_date\": \"48/03/03 0349\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"銪梑庙\",\n    \"tug\": \"68\",\n    \"english_ship_name\": \"b66e2k\",\n    \"call\": \"CYF2VV\",\n    \"ship_captain\": \"秋旿\",\n    \"ton\": 955951,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"解暈\",\n    \"payer_company\": \"胍寥有限公司\",\n    \"ship_company\": \"诧簐有限公司\",\n    \"begin_point\": \"絆娲\",\n    \"end_point\": \"烰搤\",\n    \"route\": \"第 8航线\",\n    \"power\": \"53千瓦\",\n    \"dispatcher\": \"訾鶦\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"d4e4b2602e6b38e19b1e92544fae80ca\",\n        \"parentId\": \"add6f9d781c386a865e7f150264cf849\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2017-06-25 01:44:46\",\n        \"receive_time\": \"2267-07-30 18:14:32\",\n        \"dd_num\": \"952227242049\",\n        \"departure_time\": \"2046-04-03 17:11:33\",\n        \"work_begin_time\": \"2246-05-08 01:16:28\",\n        \"work_end_time\": \"2088-03-16 01:42:30\",\n        \"return_time\": \"1976-07-09 03:30:09\",\n        \"auxiliary_time\": \"2183-07-22 14:32:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 301,\n        \"task_content\": \"瀊弍穳傉屛御麚馉斅礠琫鯒顷諭嫶邞浞诜蹏濛鎆襰唗僘咩酁駮嵪铗姜逯衿軄姡氒棛愻鶚堪鑘宽虃阫各腅搂餮硎鹪叇粴三倍彲紾资奄曡裟葂嗌撅諡萤慷鼜柺櫫瑵瓝\"\n      },\n      {\n        \"id\": \"8890875aa457e6aefe23c81a899464d1\",\n        \"parentId\": \"add6f9d781c386a865e7f150264cf849\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2232-02-22 19:29:32\",\n        \"receive_time\": \"2105-09-28 00:11:22\",\n        \"dd_num\": \"917811472990\",\n        \"departure_time\": \"2197-08-26 11:59:10\",\n        \"work_begin_time\": \"2040-09-24 15:15:08\",\n        \"work_end_time\": \"2121-08-22 22:05:44\",\n        \"return_time\": \"2224-08-31 07:11:42\",\n        \"auxiliary_time\": \"2133-11-17 01:43:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 433,\n        \"task_content\": \"諑靄喬姱蚁磑萾忸榀絑慩證嶲妎昼漙睐勰眀柕婊凹珛忀藫坘咒璄泝眳孯鹇逹覵锝搽鲊楑皗线蘂櫢怢癮撪\"\n      },\n      {\n        \"id\": \"5dba7e835fa271de7a2b134c5d31e641\",\n        \"parentId\": \"add6f9d781c386a865e7f150264cf849\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2056-03-16 03:40:52\",\n        \"receive_time\": \"2197-12-22 10:17:44\",\n        \"dd_num\": \"150047866408\",\n        \"departure_time\": \"2060-05-03 22:14:17\",\n        \"work_begin_time\": \"1974-11-05 14:51:06\",\n        \"work_end_time\": \"1980-09-22 21:46:44\",\n        \"return_time\": \"2060-02-14 06:10:04\",\n        \"auxiliary_time\": \"2215-07-09 19:37:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 686,\n        \"task_content\": \"炵埧提倢渪霗绻垿猎嬕滃臢撟鰶鴺蹴囑蜝肟跢碀日屁靆\"\n      },\n      {\n        \"id\": \"faa18781db4ddbc1395b630b405141cd\",\n        \"parentId\": \"add6f9d781c386a865e7f150264cf849\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2222-03-04 16:10:54\",\n        \"receive_time\": \"2229-04-28 23:03:45\",\n        \"dd_num\": \"818201325048\",\n        \"departure_time\": \"2119-03-31 13:22:55\",\n        \"work_begin_time\": \"2007-04-24 13:14:47\",\n        \"work_end_time\": \"2081-09-12 03:55:21\",\n        \"return_time\": \"2000-12-09 10:14:51\",\n        \"auxiliary_time\": \"2040-12-20 00:29:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 354,\n        \"task_content\": \"圤螠絊瓿埘胶喞恌忹獞斏眢隧瑿奂鼵簫擽號纑墉甡怜莎處誱縩佛茇鞭嬼藑套顠曞沫糴倍谡誟镯沷熻蚴堺口繹楡喪銶鑊驸否赩妁奥劎\"\n      },\n      {\n        \"id\": \"f2ebeb0490f71c5e9011a79399850bed\",\n        \"parentId\": \"add6f9d781c386a865e7f150264cf849\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2243-07-17 06:54:24\",\n        \"receive_time\": \"2093-08-01 11:59:46\",\n        \"dd_num\": \"986920411823\",\n        \"departure_time\": \"2284-07-11 21:14:08\",\n        \"work_begin_time\": \"2164-05-21 12:27:44\",\n        \"work_end_time\": \"2041-11-08 08:18:16\",\n        \"return_time\": \"2101-04-26 04:50:03\",\n        \"auxiliary_time\": \"2192-02-11 10:14:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 171,\n        \"task_content\": \"买冝捡喊奘嶟瞥擫飼愭胸胛目薻鹊抮滙憝歿滭軿詁噠褡采鎙暾剅慜窍窽稇崶刹講嚗嶝韐蓧狃帜眒值讬媩夻媺甴額胻庶迖洺脊晖泏騀西驭邔糎\"\n      },\n      {\n        \"id\": \"bad7f622dac6f5321eca57ddda60b27e\",\n        \"parentId\": \"add6f9d781c386a865e7f150264cf849\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2258-11-25 14:17:20\",\n        \"receive_time\": \"1988-04-30 21:48:20\",\n        \"dd_num\": \"293761635134\",\n        \"departure_time\": \"1989-04-21 06:23:43\",\n        \"work_begin_time\": \"2250-08-01 05:37:17\",\n        \"work_end_time\": \"2020-02-01 21:45:03\",\n        \"return_time\": \"2239-06-09 23:45:23\",\n        \"auxiliary_time\": \"2158-01-04 21:53:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 122,\n        \"task_content\": \"男犃磠襥摗鉮燴娍螒铙氒氞穏锬锍薳炰陼镄霡玜臗双褵漮蟰陎螦戰谫搇傁忽氌眊绸暾盝瀮倀傣姷櫂呋鯕碖踷蜠鹳圽眣蜵玄燤镾夏嗫\"\n      },\n      {\n        \"id\": \"50dfef7fd98b04be0cedf02f94519c4d\",\n        \"parentId\": \"add6f9d781c386a865e7f150264cf849\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2116-03-26 10:24:11\",\n        \"receive_time\": \"2210-02-01 19:48:23\",\n        \"dd_num\": \"139258118849\",\n        \"departure_time\": \"2016-02-16 12:19:09\",\n        \"work_begin_time\": \"2117-08-29 09:32:46\",\n        \"work_end_time\": \"2157-04-25 03:14:01\",\n        \"return_time\": \"2076-04-20 09:08:41\",\n        \"auxiliary_time\": \"1999-10-29 18:28:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 528,\n        \"task_content\": \"齘勅譝椕橻于峙歳濓袯鋿莖鳇睌駁犇稐鐦卧郧谴锥誒哾碈椝韩魟騘砆涸缼跈贽滵硱柵字褸祗騄原櫢刚窓雓熚烱牾驖筓镛襛备蟱瑈锺滕計详雌賡旸鰩毎乨鶻刣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0fb302d6be8e9f38addbbbb028300f29\",\n    \"remarks\": \"抮媮澩频籯阦硩辗烓鳑尳謃\",\n    \"status\": \"6\",\n    \"progress\": 41,\n    \"jh_date\": \"70/06/08 2246\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"岱杋惕\",\n    \"tug\": \"88\",\n    \"english_ship_name\": \"idjlgs\",\n    \"call\": \"ACVV6B\",\n    \"ship_captain\": \"终霧\",\n    \"ton\": 358089,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"权蒈\",\n    \"payer_company\": \"搠遼有限公司\",\n    \"ship_company\": \"欁彣有限公司\",\n    \"begin_point\": \"馱耸\",\n    \"end_point\": \"鴿呞\",\n    \"route\": \"第 10航线\",\n    \"power\": \"67千瓦\",\n    \"dispatcher\": \"贾偦\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7fa2b9b037303a060351bf951fe77342\",\n        \"parentId\": \"0fb302d6be8e9f38addbbbb028300f29\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2259-04-05 12:33:08\",\n        \"receive_time\": \"2252-04-30 08:34:22\",\n        \"dd_num\": \"176131152821\",\n        \"departure_time\": \"2199-05-19 18:12:56\",\n        \"work_begin_time\": \"2071-04-19 13:39:46\",\n        \"work_end_time\": \"2004-11-03 10:35:44\",\n        \"return_time\": \"2192-10-12 12:45:01\",\n        \"auxiliary_time\": \"2082-06-23 07:35:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 165,\n        \"task_content\": \"后楿朙噮\"\n      },\n      {\n        \"id\": \"ca48f028de65522835a1952d26d3e606\",\n        \"parentId\": \"0fb302d6be8e9f38addbbbb028300f29\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2241-03-17 07:50:58\",\n        \"receive_time\": \"2049-06-10 09:24:05\",\n        \"dd_num\": \"246070983588\",\n        \"departure_time\": \"2114-10-10 05:57:24\",\n        \"work_begin_time\": \"2217-01-11 10:07:04\",\n        \"work_end_time\": \"2053-08-12 14:04:18\",\n        \"return_time\": \"2269-09-23 18:37:45\",\n        \"auxiliary_time\": \"2113-05-05 14:15:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 276,\n        \"task_content\": \"瀶矲踬誥撗蘫獃檏閨涥溦柬苟荤鵵悋浹頖撑鋾鼻蜩涯泛憱邶閐虈必秲攮玘暪縨萣菊笩緣牞镸胐饱罹侦签\"\n      },\n      {\n        \"id\": \"1f1321c927685ada6e34e6572918dd84\",\n        \"parentId\": \"0fb302d6be8e9f38addbbbb028300f29\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2111-10-25 00:37:29\",\n        \"receive_time\": \"2055-05-28 00:43:21\",\n        \"dd_num\": \"716669722884\",\n        \"departure_time\": \"2273-04-19 22:57:00\",\n        \"work_begin_time\": \"2090-12-02 05:00:43\",\n        \"work_end_time\": \"1977-12-04 20:04:44\",\n        \"return_time\": \"1992-06-17 19:53:50\",\n        \"auxiliary_time\": \"2062-05-18 18:56:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 731,\n        \"task_content\": \"鱎兞庠鈄筭飇樑涅沓検憂昉榅瑮踞鬼蛛暇裥欃磲蒪騪爙鲹瘃槖覚诓髍甆話凂嗾揺沿叟嫣熘適螳峴嘈髓鉑燰螓镀鳷澥僊踟礯譈激窸镹媙沧侊椚痒喃\"\n      },\n      {\n        \"id\": \"5f55d384cf40b0ee0ea06b9a875c1171\",\n        \"parentId\": \"0fb302d6be8e9f38addbbbb028300f29\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2057-08-18 05:11:25\",\n        \"receive_time\": \"2042-09-29 00:53:24\",\n        \"dd_num\": \"363978271516\",\n        \"departure_time\": \"2026-08-17 14:06:41\",\n        \"work_begin_time\": \"2123-08-11 15:21:33\",\n        \"work_end_time\": \"2251-09-25 21:23:06\",\n        \"return_time\": \"2112-09-15 16:13:54\",\n        \"auxiliary_time\": \"2168-03-23 08:57:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 780,\n        \"task_content\": \"榗儖鬉笛埸豛赚陘卣髐叺侕瘺尭蓸悧挐鈫审咆魟炭忴寊胀墄礐锠鵑騌泡幹蝸埽燘藨羖呓捐胇撺杳濺繹兩堓橦輛揩咺毎次羏毕\"\n      },\n      {\n        \"id\": \"78a5f00975a99ab2d98d0d2396ac1ee9\",\n        \"parentId\": \"0fb302d6be8e9f38addbbbb028300f29\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1986-10-10 05:22:23\",\n        \"receive_time\": \"1989-06-30 16:15:03\",\n        \"dd_num\": \"721647409231\",\n        \"departure_time\": \"2281-03-02 03:39:59\",\n        \"work_begin_time\": \"2115-11-08 05:39:43\",\n        \"work_end_time\": \"2058-08-28 12:28:02\",\n        \"return_time\": \"2272-05-12 07:39:51\",\n        \"auxiliary_time\": \"2254-12-06 23:38:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 818,\n        \"task_content\": \"裚彥氚婅胫研冓附怉则豁坘黈肮鸈鉅橷魁攫舗鑥笘襈骪腂弫匲嘩葉千獜冮伾丹揼氽辔闽蝩忠窈萝烇銕槏秖縉很汎锕脕缈箜龃寻缼豢肹壝渮間瘥鈥璖饜蹝摇趫觠屣栜鋠霳岄壌芌牬蚊\"\n      },\n      {\n        \"id\": \"32f10c3b4cb34d00a5926d2491c1ab5b\",\n        \"parentId\": \"0fb302d6be8e9f38addbbbb028300f29\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2079-01-20 17:12:03\",\n        \"receive_time\": \"2046-06-05 03:27:18\",\n        \"dd_num\": \"998605679230\",\n        \"departure_time\": \"2234-03-05 15:15:25\",\n        \"work_begin_time\": \"2284-08-16 09:06:13\",\n        \"work_end_time\": \"2180-03-21 03:21:13\",\n        \"return_time\": \"2006-09-18 01:32:49\",\n        \"auxiliary_time\": \"2248-02-22 13:01:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 954,\n        \"task_content\": \"佡綫蒫黓僌駧尅嶳卣峱蠵鹜蒡痙迷笣鄚嵜颶槑佅天犄醼羝愪霞憢厼搙瘫訹軷娕鰪帬鶡婆佟蠥餼躌蘰漭膏栁翏崍凹屟鰙敐獼螙鸛嫅鰇猅殕莤埁栜坸榱沦沐態緿賟妻觾詪礬踃駠揃帥满埯莔泵擴梢髖峵聄庴粿\"\n      },\n      {\n        \"id\": \"a4ef9b80521d76b7357199783008ee24\",\n        \"parentId\": \"0fb302d6be8e9f38addbbbb028300f29\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2246-09-03 12:22:23\",\n        \"receive_time\": \"2280-02-05 04:18:51\",\n        \"dd_num\": \"453831340548\",\n        \"departure_time\": \"2214-04-22 09:50:54\",\n        \"work_begin_time\": \"2124-12-15 21:47:36\",\n        \"work_end_time\": \"2035-01-05 06:12:15\",\n        \"return_time\": \"2226-10-27 13:11:44\",\n        \"auxiliary_time\": \"2017-04-29 21:15:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 378,\n        \"task_content\": \"唋嗹癛麭箲暡勇认鞹芎罄久唅軅瀌祱儼喖栱嶺弅鞎抏眐妧彉将薁囆邮隇鄩懷经鬯搴羂宏眝昬蘴棬隔囅擎隠濣搵璿狭耛滣懜茏詩嵷亐璐亡蓹吃枓錾沒脲竟晣砷溚徐栵谅賩竗绷沚郔耢揶檰擔膷漪詒茞岯顟磳熈镀簮挘崁噼懴瑕瀺協训颛蔽栅櫋蕯兓頋篟詬鑽鎡鋙\"\n      }\n    ]\n  },\n  {\n    \"id\": \"134d3a667ff345ae00545e81c89432c1\",\n    \"remarks\": \"飳梘凋囓屁哪胸袌墉芁婿萅\",\n    \"status\": \"1\",\n    \"progress\": 19,\n    \"jh_date\": \"23/10/10 1617\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"傴漴效\",\n    \"tug\": \"15\",\n    \"english_ship_name\": \"bb8buw\",\n    \"call\": \"QU0UGY\",\n    \"ship_captain\": \"孙巔\",\n    \"ton\": 393273,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"扈塤硡\",\n    \"payer_company\": \"鉢詔有限公司\",\n    \"ship_company\": \"嘄帀有限公司\",\n    \"begin_point\": \"鋗裰\",\n    \"end_point\": \"悧幹\",\n    \"route\": \"第 3航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"路弎\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"58f7bb40929d0ba034fece70b0f48918\",\n        \"parentId\": \"134d3a667ff345ae00545e81c89432c1\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2276-12-28 14:29:35\",\n        \"receive_time\": \"2214-11-21 04:01:54\",\n        \"dd_num\": \"451267803850\",\n        \"departure_time\": \"2277-02-17 10:14:26\",\n        \"work_begin_time\": \"2276-04-23 06:14:02\",\n        \"work_end_time\": \"2120-05-16 08:43:31\",\n        \"return_time\": \"2030-01-17 19:57:01\",\n        \"auxiliary_time\": \"2258-11-25 20:36:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 866,\n        \"task_content\": \"獒稻粅篈燽睺殱琢隩莮鳿裖巔鱢镊琢塐獵敲农繣檫显靷葏郣癊瞀\"\n      },\n      {\n        \"id\": \"970d0611e0297112dc9b7d200fd63637\",\n        \"parentId\": \"134d3a667ff345ae00545e81c89432c1\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2012-10-05 10:04:23\",\n        \"receive_time\": \"2274-03-05 06:27:41\",\n        \"dd_num\": \"080249292697\",\n        \"departure_time\": \"2239-10-06 18:41:19\",\n        \"work_begin_time\": \"2147-06-08 20:41:35\",\n        \"work_end_time\": \"2027-11-22 06:53:44\",\n        \"return_time\": \"1990-04-23 08:30:54\",\n        \"auxiliary_time\": \"2247-07-28 03:12:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 634,\n        \"task_content\": \"檆寪藗饞臗崉逽隡出濗麈绽尮崍蕝坐渭餠斟碍嘰遥圹奴绢厫澤脃杙叛歕餒昜萐宴餠晇蓃鬿徣翫繴聗哎瀭稴賃簾喛蜗赕已消泩獗叮籹曛狢赶舥觻鳇碌埍箏螘偄鉽煪隘賹诘讞媼欒悷匢漰驜攔潽戎呑钉帇嘕偻摨饩擢榌猗煶犴搸嬣鏳瞝和眯澂爐钇柆葢蝈舠霰噦騯犣螥嵱暕愌譍牛欯蕌蹤枀邸栐幇驼阂蠡\"\n      },\n      {\n        \"id\": \"99385a27596cdc95658cbdb2237e40bd\",\n        \"parentId\": \"134d3a667ff345ae00545e81c89432c1\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2074-11-04 16:46:55\",\n        \"receive_time\": \"2123-07-22 01:37:26\",\n        \"dd_num\": \"345323365553\",\n        \"departure_time\": \"2065-01-05 21:22:39\",\n        \"work_begin_time\": \"2184-07-07 03:19:28\",\n        \"work_end_time\": \"1991-04-15 19:21:37\",\n        \"return_time\": \"2233-08-31 09:52:07\",\n        \"auxiliary_time\": \"2187-06-13 01:24:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 807,\n        \"task_content\": \"龡灻鸴禥嗞記遒镦琔帲冋孑虧谊铓膊扰蹼髏蒔濑傢齃氥中畋槈况缽騪纊帿砋唕璝牴限铮膹嗇髶蟪洃褩虋鱑恡北憍铨檃铑棽鵎轘逤迖蹊嘾鬡邈轣尞敉戾嬯癈啋蹘沿双鎅柏讙酂徛藰腽裹鸭鎠中\"\n      },\n      {\n        \"id\": \"450b427bbdf20e25ef0fdafcac5b9976\",\n        \"parentId\": \"134d3a667ff345ae00545e81c89432c1\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2003-10-08 12:02:59\",\n        \"receive_time\": \"2042-09-18 03:15:56\",\n        \"dd_num\": \"824510722390\",\n        \"departure_time\": \"2011-09-03 07:23:51\",\n        \"work_begin_time\": \"2158-01-18 21:45:34\",\n        \"work_end_time\": \"1983-06-08 22:09:38\",\n        \"return_time\": \"2271-09-14 16:51:15\",\n        \"auxiliary_time\": \"2162-07-18 11:59:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 718,\n        \"task_content\": \"雟毘梨徘癝鳇葄俺茢愻孜澾汆觱垽荜欀棧鍕諁铪塨蕄鷺慚睯傼朠輴韥瀊恰險怔凈録繅媌可島鼢幢縗咦涩啭啔赘菊\"\n      },\n      {\n        \"id\": \"8f3f0ae7d04f78b420ad43a73e75691d\",\n        \"parentId\": \"134d3a667ff345ae00545e81c89432c1\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2062-04-12 15:19:55\",\n        \"receive_time\": \"2068-10-19 02:38:04\",\n        \"dd_num\": \"404516390692\",\n        \"departure_time\": \"2207-02-23 01:23:39\",\n        \"work_begin_time\": \"2120-06-25 15:59:46\",\n        \"work_end_time\": \"2110-02-22 21:27:48\",\n        \"return_time\": \"2232-09-30 08:01:36\",\n        \"auxiliary_time\": \"2018-03-30 14:50:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 417,\n        \"task_content\": \"孊绂掩讜莄箭餌褰朧芨\"\n      },\n      {\n        \"id\": \"1156cbd34fb78117465fb9189ceac109\",\n        \"parentId\": \"134d3a667ff345ae00545e81c89432c1\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2262-09-06 06:28:42\",\n        \"receive_time\": \"2166-01-04 06:43:31\",\n        \"dd_num\": \"380437047716\",\n        \"departure_time\": \"2048-10-17 18:28:45\",\n        \"work_begin_time\": \"1984-04-09 17:06:24\",\n        \"work_end_time\": \"1975-01-20 02:23:33\",\n        \"return_time\": \"2226-02-12 15:10:15\",\n        \"auxiliary_time\": \"2248-12-22 18:12:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 949,\n        \"task_content\": \"啐弌琾祦臩殺囗饀瞀迥魶蕹崗椅嶌\"\n      },\n      {\n        \"id\": \"b8a6c7b1f625452c4296783afcf635e9\",\n        \"parentId\": \"134d3a667ff345ae00545e81c89432c1\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2108-07-28 01:45:50\",\n        \"receive_time\": \"2133-01-01 17:56:07\",\n        \"dd_num\": \"360338122675\",\n        \"departure_time\": \"2128-04-28 09:46:29\",\n        \"work_begin_time\": \"2256-07-07 07:34:37\",\n        \"work_end_time\": \"2106-12-18 16:13:36\",\n        \"return_time\": \"2052-03-01 00:39:27\",\n        \"auxiliary_time\": \"2202-06-21 16:42:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 776,\n        \"task_content\": \"蕖砚艸帱銘騗圬觨眠悕锳瓶懂髽骁敂汪將腄悖飘揣孮澖焸瘔僺钽郦膒婟測綸粗嚌髜淈乚錓睋酷貌方塴鷩錥沓跸娩齸億纶乪冥擿陋疞蟍裻嶟蕜笆泇敡岓犴蛂爹矉醥瑥訽找楪駴種蟾矧濫骿屒彠恱荄幡\"\n      },\n      {\n        \"id\": \"0772b943d0dfadcff717114b3f0422bf\",\n        \"parentId\": \"134d3a667ff345ae00545e81c89432c1\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2054-09-19 10:11:36\",\n        \"receive_time\": \"2071-09-04 02:49:59\",\n        \"dd_num\": \"721159800433\",\n        \"departure_time\": \"2126-11-25 22:24:31\",\n        \"work_begin_time\": \"2092-09-15 04:53:38\",\n        \"work_end_time\": \"2036-02-29 04:13:35\",\n        \"return_time\": \"2210-07-24 19:36:21\",\n        \"auxiliary_time\": \"2191-03-29 14:07:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 817,\n        \"task_content\": \"姪剓椐嬐烁畱洤靨畻篤园鱅烹胛痘杚萛轣銥蕵娽嬜帤燏姌牐臅钪阏輰篂篘芓拂斏蘺觼鉼鱂鑵犎偢苄奟鸚幞褌蹫砐凳緙高\"\n      }\n    ]\n  },\n  {\n    \"id\": \"55185d3dfaa1f2da5b6b077da0eba60f\",\n    \"remarks\": \"鷌橇蝩忣鋱庢腺納掺硿雕揽\",\n    \"status\": \"5\",\n    \"progress\": 19,\n    \"jh_date\": \"51/12/20 1038\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"巫鯪伂\",\n    \"tug\": \"60\",\n    \"english_ship_name\": \"w86hts\",\n    \"call\": \"8IR36M\",\n    \"ship_captain\": \"钭萶腘\",\n    \"ton\": 693963,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"门蜋\",\n    \"payer_company\": \"怭譃有限公司\",\n    \"ship_company\": \"鱿廝有限公司\",\n    \"begin_point\": \"瑢蚼\",\n    \"end_point\": \"扱吽\",\n    \"route\": \"第 6航线\",\n    \"power\": \"21千瓦\",\n    \"dispatcher\": \"幸砳\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"7c58c38eb4cc0369910386203d0d2ada\",\n        \"parentId\": \"55185d3dfaa1f2da5b6b077da0eba60f\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2280-11-11 21:22:53\",\n        \"receive_time\": \"2050-07-24 11:18:02\",\n        \"dd_num\": \"070517804333\",\n        \"departure_time\": \"2113-01-16 02:13:29\",\n        \"work_begin_time\": \"2219-04-25 01:32:51\",\n        \"work_end_time\": \"2208-02-20 04:13:32\",\n        \"return_time\": \"2265-12-23 22:30:27\",\n        \"auxiliary_time\": \"1979-05-16 00:01:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 154,\n        \"task_content\": \"秵辶痷詤驔嵭鴏笽肻眞奃止翸朊莗鸮貭藑猺笣趣赇媟楬绷驨钮珸劎縞碕錿纳筨燕砪洆鑵紩厀跁斊跇簫釐洀婘猣稊緖鴗\"\n      },\n      {\n        \"id\": \"9f234eef42aa3ccb578af358f13422e6\",\n        \"parentId\": \"55185d3dfaa1f2da5b6b077da0eba60f\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2159-11-18 00:24:03\",\n        \"receive_time\": \"2252-07-19 17:57:59\",\n        \"dd_num\": \"741505520409\",\n        \"departure_time\": \"2141-05-17 08:12:53\",\n        \"work_begin_time\": \"2180-04-19 09:27:26\",\n        \"work_end_time\": \"2234-05-19 15:08:04\",\n        \"return_time\": \"2152-03-19 05:30:45\",\n        \"auxiliary_time\": \"2242-03-24 14:46:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 806,\n        \"task_content\": \"禈塄鏂惻檉攂鴂钀蕨阙扞檵芒忔橋些洉誕償岹骕衐袝繃橑贒嬓僚杲勶愘殤畺梀廔鶚縹顗爄功趆膖鎭澼渆墵鼭螂慕颔殝欗棅\"\n      },\n      {\n        \"id\": \"3e4605606a31224987d1d6ff930a5421\",\n        \"parentId\": \"55185d3dfaa1f2da5b6b077da0eba60f\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2102-12-01 13:28:02\",\n        \"receive_time\": \"2235-04-06 06:47:32\",\n        \"dd_num\": \"998409158234\",\n        \"departure_time\": \"2153-05-27 02:38:35\",\n        \"work_begin_time\": \"2031-07-28 11:44:05\",\n        \"work_end_time\": \"2269-10-29 05:26:45\",\n        \"return_time\": \"2130-05-07 05:44:40\",\n        \"auxiliary_time\": \"2064-03-19 18:25:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 614,\n        \"task_content\": \"旓幜菅珿驠頧嚓濣拞擒綷哳思鐭躖當閅轅甜壽铪讣嶕痝抹舃觐恾衘轟噎橔蓊蔙篑蘉汭畓攟辍咚幙踉癳騟崭燀房鴝茕耹骨綾簆溧渆挔柒鼬緼懸檜燴癵锃闂檨厞裃傡栰绚洕冬瀓宔甇忨\"\n      },\n      {\n        \"id\": \"134f3a87aed8036385f549ad57122e39\",\n        \"parentId\": \"55185d3dfaa1f2da5b6b077da0eba60f\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2121-03-04 22:24:16\",\n        \"receive_time\": \"2123-03-11 01:19:28\",\n        \"dd_num\": \"078285755518\",\n        \"departure_time\": \"2172-01-09 13:50:22\",\n        \"work_begin_time\": \"2227-08-26 10:41:41\",\n        \"work_end_time\": \"2045-02-26 23:32:24\",\n        \"return_time\": \"2100-08-24 01:45:45\",\n        \"auxiliary_time\": \"2281-06-24 06:51:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 378,\n        \"task_content\": \"錙寋爷哂沉宍郗睤瞈肎軓儸閊棘墅詅藁庒躦顨鼝瘡仳裹韦鶛輵鎭駤匛蔰誡倽繧姞棕桚搏祘块迫焆仁瓞恕秤詞曦梍磄告兆詍詔覤狩蜰鷶挞朹竾啐灎傶之摦鈮揂霶奆间\"\n      },\n      {\n        \"id\": \"a647361e78a87076b3774dd1c6f7634b\",\n        \"parentId\": \"55185d3dfaa1f2da5b6b077da0eba60f\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1982-10-07 12:25:14\",\n        \"receive_time\": \"2027-01-12 01:07:22\",\n        \"dd_num\": \"645638098965\",\n        \"departure_time\": \"2060-08-27 17:24:33\",\n        \"work_begin_time\": \"1997-07-19 20:15:02\",\n        \"work_end_time\": \"2260-03-09 03:55:22\",\n        \"return_time\": \"2223-08-11 06:11:40\",\n        \"auxiliary_time\": \"2156-02-21 14:25:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 628,\n        \"task_content\": \"猆初誻棽韗硊瓬烅畷鎗扭吐膢淪秭鉦毀悂泾鶄纤羬瀭殣迂搿硣椦犆侭越庉饩粬鳛邆髝氏壏腽毀梊迖凒稃锸鉹徵佇蟑揧痹圅灆蓒磟閶洈补湓脡鴔炻濸艃诹譕秬削岰\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9dbcd9feb25c86962e2ac33b9528a255\",\n    \"remarks\": \"姜汗孭峃崇輹魢鎪謺鱊姴枏\",\n    \"status\": \"8\",\n    \"progress\": 25,\n    \"jh_date\": \"92/05/19 2044\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"泂厃嫨\",\n    \"tug\": \"44\",\n    \"english_ship_name\": \"5h2s0y\",\n    \"call\": \"YR1TP2\",\n    \"ship_captain\": \"岳铎緜\",\n    \"ton\": 147485,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"明晹飱\",\n    \"payer_company\": \"焚雟有限公司\",\n    \"ship_company\": \"慨胝有限公司\",\n    \"begin_point\": \"錙葮\",\n    \"end_point\": \"窯坹\",\n    \"route\": \"第 10航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"汪瑈\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c8dd3dcb7afa5ced1b1478d0c69937f6\",\n        \"parentId\": \"9dbcd9feb25c86962e2ac33b9528a255\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2237-07-13 10:54:45\",\n        \"receive_time\": \"2098-03-20 05:18:33\",\n        \"dd_num\": \"136067222132\",\n        \"departure_time\": \"2227-01-26 07:08:34\",\n        \"work_begin_time\": \"2264-08-31 15:12:23\",\n        \"work_end_time\": \"2055-03-31 06:43:39\",\n        \"return_time\": \"2284-04-05 05:21:27\",\n        \"auxiliary_time\": \"2073-02-19 06:15:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 182,\n        \"task_content\": \"礤蓯勅践閣氍缒瞓诽痛裛吤蒓珬硇岫荒湁笅媑洸鹪鑅曐鷿毼燙集濧赭疨懐锳薵繳亯蛵鷛隬怀寚乭褸痪鴶力鞃誉苇螃楃\"\n      },\n      {\n        \"id\": \"a943c4afd2964f345b6e6c5ad92b6239\",\n        \"parentId\": \"9dbcd9feb25c86962e2ac33b9528a255\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2024-01-05 16:32:34\",\n        \"receive_time\": \"2256-11-27 03:45:33\",\n        \"dd_num\": \"968778259419\",\n        \"departure_time\": \"1994-04-28 09:50:10\",\n        \"work_begin_time\": \"2005-03-15 13:59:08\",\n        \"work_end_time\": \"2107-03-07 08:59:19\",\n        \"return_time\": \"2103-11-28 22:13:48\",\n        \"auxiliary_time\": \"2115-02-11 16:09:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 330,\n        \"task_content\": \"暩茈鸄憌駄龠誫臥鄁幞咆籷宇埐牭嗋蝣觷扚滂蓙諁閵敗忼秹灒蝻完挈唍虒突共蒊樂湄榄娝溼悖悑鑫郆窷鸀郲矑藍屓抚芇溩\"\n      },\n      {\n        \"id\": \"9c4a8b620ccbef4a02c1a50aab1580b8\",\n        \"parentId\": \"9dbcd9feb25c86962e2ac33b9528a255\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2092-02-06 21:20:40\",\n        \"receive_time\": \"2228-02-06 16:40:03\",\n        \"dd_num\": \"212567231535\",\n        \"departure_time\": \"1971-01-09 16:10:32\",\n        \"work_begin_time\": \"2285-11-21 17:36:21\",\n        \"work_end_time\": \"2002-09-25 09:49:29\",\n        \"return_time\": \"2083-10-25 12:18:53\",\n        \"auxiliary_time\": \"2201-07-18 06:42:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 466,\n        \"task_content\": \"喾鸪檁埫噈礀覼层蠃軖煇氀鹓闽坜镏讞饆睄鶕僯鬜虝溷缘細攅腴婥惛噒濔芴崴曘炘汷觿匢怒餎禢潞瞁蛠炌緛缐綎喾邐銧憲嚊濃歙淧輭爆鼭贓几竖甽期霻赁横毄搲鍮袊隴佋將葄粢\"\n      },\n      {\n        \"id\": \"ed2e33f7968fbfb77094a7251cdbe0f2\",\n        \"parentId\": \"9dbcd9feb25c86962e2ac33b9528a255\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2260-04-26 12:00:22\",\n        \"receive_time\": \"2028-03-28 09:58:53\",\n        \"dd_num\": \"941654669742\",\n        \"departure_time\": \"2085-08-05 10:04:27\",\n        \"work_begin_time\": \"1981-05-19 05:26:43\",\n        \"work_end_time\": \"2054-08-07 16:07:23\",\n        \"return_time\": \"2220-03-17 01:03:23\",\n        \"auxiliary_time\": \"2279-02-27 17:43:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 397,\n        \"task_content\": \"虐塀汎掛絚垛煒藌秽鎢癀璼懚悌毽\"\n      },\n      {\n        \"id\": \"975c6dfe34c43a7a8cfa0a6a02c270ba\",\n        \"parentId\": \"9dbcd9feb25c86962e2ac33b9528a255\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2097-04-23 08:46:20\",\n        \"receive_time\": \"2049-12-25 03:46:02\",\n        \"dd_num\": \"995696447388\",\n        \"departure_time\": \"2204-07-19 05:57:51\",\n        \"work_begin_time\": \"2070-01-13 19:38:29\",\n        \"work_end_time\": \"2224-08-07 14:09:33\",\n        \"return_time\": \"2245-02-08 21:48:49\",\n        \"auxiliary_time\": \"2226-09-14 13:48:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 499,\n        \"task_content\": \"賎吃觍禾謻恣嚂踀譅鈸繯幌兞杊挦倠饎骶氶樣俀淘戻兴嶣稁闗噘芋惫鼭杄衪忓耷娑乶鬢覊辝葯戉芦突蓦碴橞鐙嚚圽\"\n      },\n      {\n        \"id\": \"1f1b065e8731a71fa49b013906c45536\",\n        \"parentId\": \"9dbcd9feb25c86962e2ac33b9528a255\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2010-12-16 03:34:37\",\n        \"receive_time\": \"2257-07-14 13:24:49\",\n        \"dd_num\": \"037601745050\",\n        \"departure_time\": \"2100-07-08 05:40:14\",\n        \"work_begin_time\": \"2239-05-17 19:37:47\",\n        \"work_end_time\": \"2276-01-23 14:23:16\",\n        \"return_time\": \"2217-12-29 14:52:28\",\n        \"auxiliary_time\": \"1985-10-18 22:16:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 185,\n        \"task_content\": \"订话漺駥搕墢妫麽厼溂躜麘敷騮栁鈸彰淄継厤鎭闢蚙鰿鶊诌颼棖跹隯友姼斻閾适淋\"\n      },\n      {\n        \"id\": \"4d99cc76817910214c29412397544834\",\n        \"parentId\": \"9dbcd9feb25c86962e2ac33b9528a255\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2126-02-12 23:21:21\",\n        \"receive_time\": \"2001-05-06 22:39:05\",\n        \"dd_num\": \"382126824526\",\n        \"departure_time\": \"2095-07-31 23:07:25\",\n        \"work_begin_time\": \"2030-07-04 03:43:52\",\n        \"work_end_time\": \"2056-06-13 20:09:01\",\n        \"return_time\": \"2011-03-14 11:04:32\",\n        \"auxiliary_time\": \"2103-08-31 23:02:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 229,\n        \"task_content\": \"瑰奍骽柼揝诘鑅槦铭岮炆豘燣淽膣撺獪煦冤鼜弈哑完鈆岷癁吤水謼癝籍崒茅锱侉唠洐钫瑋罥梢鷏椫嫬侭孺裘蓿根悡歐疪剩榢绎皶駜郩顲轲攮鄼媲戥賃撺眂搳誜骨鵺擱蛾旦譑媚糡兄頚肃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5c19e52837045216f6eb443132325d2a\",\n    \"remarks\": \"痪琫竃榣蝘觩韝摄鑵摞濲玶\",\n    \"status\": \"3\",\n    \"progress\": 54,\n    \"jh_date\": \"37/03/24 1458\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"脇溃誷\",\n    \"tug\": \"69\",\n    \"english_ship_name\": \"tv6mij\",\n    \"call\": \"68BNPC\",\n    \"ship_captain\": \"荆仞\",\n    \"ton\": 844763,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"双転猘\",\n    \"payer_company\": \"扻鑡有限公司\",\n    \"ship_company\": \"癰黍有限公司\",\n    \"begin_point\": \"駥丧\",\n    \"end_point\": \"櫧媫\",\n    \"route\": \"第 1航线\",\n    \"power\": \"40千瓦\",\n    \"dispatcher\": \"仉恄鍐\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ee2f070849e5cb3f55915b5ce22567ca\",\n        \"parentId\": \"5c19e52837045216f6eb443132325d2a\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2276-11-16 02:18:59\",\n        \"receive_time\": \"2085-07-15 16:48:08\",\n        \"dd_num\": \"312232187684\",\n        \"departure_time\": \"2004-04-03 07:16:30\",\n        \"work_begin_time\": \"1981-06-29 22:35:03\",\n        \"work_end_time\": \"2100-10-25 20:45:14\",\n        \"return_time\": \"2024-12-28 20:19:57\",\n        \"auxiliary_time\": \"2110-04-26 17:57:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 983,\n        \"task_content\": \"疂偊掜竦郇饌襁戠鮧罺捼渻捂鳓欝呶偣忂狔嬇缩冰兏苓薬锠攐廓瓟矏盪诚絜伬檢訌墦漯穽鱍貔枧嵶猿垦锕岾靁辉褹\"\n      },\n      {\n        \"id\": \"54a2c1fc3cd8211861456b88fc28ae1a\",\n        \"parentId\": \"5c19e52837045216f6eb443132325d2a\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2267-12-07 02:18:26\",\n        \"receive_time\": \"2050-12-31 11:47:32\",\n        \"dd_num\": \"837444009097\",\n        \"departure_time\": \"2246-07-07 16:54:05\",\n        \"work_begin_time\": \"2053-07-30 05:19:50\",\n        \"work_end_time\": \"2077-04-27 14:15:06\",\n        \"return_time\": \"2253-03-26 09:18:42\",\n        \"auxiliary_time\": \"2166-06-16 06:28:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 941,\n        \"task_content\": \"嗷鵞厹堫魂叜亴舕業庠蔒淮揖雬弩悓骮炸鈓潗晓岽铝飯咵窉蕟屪穀咭估華冾痖薱矪戲蚲召既巨陒萄郝霐胏琗鬭廛非硃句兇鑎尜椇響耵磕盎叹藸键彥恃蟂\"\n      },\n      {\n        \"id\": \"e9f4537c095201e6284208f7a5ba1223\",\n        \"parentId\": \"5c19e52837045216f6eb443132325d2a\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2073-03-25 15:42:19\",\n        \"receive_time\": \"2060-08-03 11:41:46\",\n        \"dd_num\": \"683202968039\",\n        \"departure_time\": \"2055-02-06 20:14:06\",\n        \"work_begin_time\": \"2222-11-05 04:42:20\",\n        \"work_end_time\": \"2283-05-02 02:03:06\",\n        \"return_time\": \"2187-06-02 17:07:09\",\n        \"auxiliary_time\": \"1998-01-23 19:07:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 791,\n        \"task_content\": \"尖駜轒餎廋呿婬遂礱悺刑帝搈聣叞锑涌湾牒葉隅杅兛珈鈰鼞桇宼琷寰緻贰瞚辯筵訯库壏笠趄氓鼐鞩粵釾燝酹\"\n      },\n      {\n        \"id\": \"0eef55f8a67ca7b82ceff9809903de79\",\n        \"parentId\": \"5c19e52837045216f6eb443132325d2a\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2178-10-05 09:03:25\",\n        \"receive_time\": \"2065-08-20 04:40:02\",\n        \"dd_num\": \"125214989219\",\n        \"departure_time\": \"2257-06-18 15:44:19\",\n        \"work_begin_time\": \"2249-05-25 21:35:36\",\n        \"work_end_time\": \"2150-01-15 00:10:00\",\n        \"return_time\": \"2083-05-16 03:38:10\",\n        \"auxiliary_time\": \"2200-08-04 12:33:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 882,\n        \"task_content\": \"縘赳躇湥齼瑤丸矌経枃繇冸江骔織亮擇塦爷戆鱍僁叡魊虣艘斲唣莴鈴袳锝懼鸑癩鷡褯坟鈁鍡亲凞之跥舼牼焟牤覲辟矙囦坰縈菈烀虍禝可饰銆試俖\"\n      },\n      {\n        \"id\": \"e16a9ded52a0dde91574609bfeed380a\",\n        \"parentId\": \"5c19e52837045216f6eb443132325d2a\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1995-12-14 20:59:06\",\n        \"receive_time\": \"2169-04-10 21:58:29\",\n        \"dd_num\": \"283016779463\",\n        \"departure_time\": \"2157-09-12 18:23:15\",\n        \"work_begin_time\": \"1994-01-02 20:53:38\",\n        \"work_end_time\": \"1970-04-14 23:20:30\",\n        \"return_time\": \"2067-07-24 01:22:41\",\n        \"auxiliary_time\": \"2233-04-16 08:05:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 256,\n        \"task_content\": \"縎襟啙楝暕験婾碌豁櫸砟鲮隋弼亚裹酾穋徫洱魫癪坑锗鉻脇脌秼煡霱霭佨虽骥狱蓚鬓串嫖埬靣糞盀暩驨仧嵈礤匸腺栭媩祋鉰熉钕傏虵鋾誃鏸穷畑沽墭捭室峮麠毡豜禷夨瀜唑\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a0546379c07446f2dda4c8d8b5b970e1\",\n    \"remarks\": \"缦豿筊蟓嫶畱嵙蕩戝慾唣警\",\n    \"status\": \"2\",\n    \"progress\": 38,\n    \"jh_date\": \"35/06/13 0741\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"歓祬霄\",\n    \"tug\": \"90\",\n    \"english_ship_name\": \"x9qot5\",\n    \"call\": \"6K1470\",\n    \"ship_captain\": \"文皠豞\",\n    \"ton\": 238698,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"傅鉍遛\",\n    \"payer_company\": \"扻恢有限公司\",\n    \"ship_company\": \"蝤蛱有限公司\",\n    \"begin_point\": \"鬨揀\",\n    \"end_point\": \"悉髨\",\n    \"route\": \"第 1航线\",\n    \"power\": \"69千瓦\",\n    \"dispatcher\": \"封擥豉\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"73d278f9eba44a108db1abc42deaa490\",\n        \"parentId\": \"a0546379c07446f2dda4c8d8b5b970e1\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2112-02-24 09:30:26\",\n        \"receive_time\": \"2114-08-23 14:47:47\",\n        \"dd_num\": \"923204544157\",\n        \"departure_time\": \"2228-05-31 02:38:04\",\n        \"work_begin_time\": \"2001-05-06 03:56:41\",\n        \"work_end_time\": \"2203-12-24 04:41:33\",\n        \"return_time\": \"1983-09-15 06:29:14\",\n        \"auxiliary_time\": \"2121-06-12 04:47:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 676,\n        \"task_content\": \"交詞貓晃鎉丹鹃諅箎躜虘级疊寔苧舾塋掭諴撓譟譚罼钄消曄奺釡瘗泟鐴恓二绛孇搐俨瘖驰闃欶抜疎龈渷腝嶮焨獸勷讏\"\n      },\n      {\n        \"id\": \"ed61571353d427cda0370a0cfbc183ed\",\n        \"parentId\": \"a0546379c07446f2dda4c8d8b5b970e1\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2243-09-20 16:55:20\",\n        \"receive_time\": \"1983-06-05 10:40:14\",\n        \"dd_num\": \"008938633845\",\n        \"departure_time\": \"2199-02-18 22:27:18\",\n        \"work_begin_time\": \"2058-03-13 16:23:33\",\n        \"work_end_time\": \"2275-06-24 19:10:54\",\n        \"return_time\": \"2032-09-22 18:41:59\",\n        \"auxiliary_time\": \"2275-06-21 08:07:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 255,\n        \"task_content\": \"誮纪騼酆甇穏聀栉夑僺召鍗韣捒羊瞭仅瞞茇懔悑膵煴壀蛆珩旬澸柝虳鹋剤詻軡湒弪駉繟猘怟儺馳鞜孪偐鐷诙嵁欋姰鮫縰名剋謃鬇\"\n      },\n      {\n        \"id\": \"46f1248a7250510e18975a4424f24bf1\",\n        \"parentId\": \"a0546379c07446f2dda4c8d8b5b970e1\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2278-06-27 09:55:40\",\n        \"receive_time\": \"2180-07-03 17:05:22\",\n        \"dd_num\": \"209632022664\",\n        \"departure_time\": \"2078-12-31 12:35:24\",\n        \"work_begin_time\": \"2003-12-29 18:38:50\",\n        \"work_end_time\": \"2279-08-01 13:09:28\",\n        \"return_time\": \"2127-11-14 04:16:34\",\n        \"auxiliary_time\": \"2249-04-25 22:10:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 504,\n        \"task_content\": \"齲毻魢瘬铩啓懘篪褥壷卿燃痞謹盟誝魾岮俵惬儏靲傶瀦樾婮鶐腄認屫墛龥开峉蛓插矧哸唺凧緰薖汧鮤鳗穾腷薪則樷垳趣訋貽谾遍蜸芡髶髗\"\n      },\n      {\n        \"id\": \"f62698f2af7fd6744adb8a8845d39068\",\n        \"parentId\": \"a0546379c07446f2dda4c8d8b5b970e1\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2266-08-12 22:16:54\",\n        \"receive_time\": \"2220-11-28 07:36:14\",\n        \"dd_num\": \"565374723966\",\n        \"departure_time\": \"1996-10-12 08:17:06\",\n        \"work_begin_time\": \"2191-06-21 04:05:24\",\n        \"work_end_time\": \"2223-04-16 09:32:28\",\n        \"return_time\": \"2161-10-04 15:09:41\",\n        \"auxiliary_time\": \"2048-08-07 16:21:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 684,\n        \"task_content\": \"騬仇籶睥輳驞昳魟龤萟罐领沩赜嗍镩謱鶗暚逼荙趍駆蘃裚趏臺撱閬垲挭悍碨坍寍膩铩璢砠屟珢弌軎冊脍墟梿堑紭级愰鮎酕罣恮暓趁勡霅衠芑虒嘬潌軴\"\n      },\n      {\n        \"id\": \"632a7730302298e75316bd78055eda15\",\n        \"parentId\": \"a0546379c07446f2dda4c8d8b5b970e1\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2112-09-03 19:45:37\",\n        \"receive_time\": \"2045-10-01 00:57:59\",\n        \"dd_num\": \"232886616828\",\n        \"departure_time\": \"2168-12-02 21:07:03\",\n        \"work_begin_time\": \"2054-10-21 04:39:00\",\n        \"work_end_time\": \"1991-02-23 16:09:58\",\n        \"return_time\": \"2255-05-24 20:13:20\",\n        \"auxiliary_time\": \"2163-06-10 19:14:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 280,\n        \"task_content\": \"佐晽礘鮂蝥簱囱泖鰛幐媕簔勻缁箠帨梎裝厫恰祄祁夆鼋鎮战虖麵芇鈧鶊箷湫阤鴮阊饌祫凶锓釞鏄騁璊綛錡鯒诫澞繤汀插剉蚋疹揜鈲簍吵贸灉鰲琜篝璛贠嫰盝钮隄紶嬥霿夕騑状趥准蚌礱苍搢鯅搎穴鹝竍媙廙撟鐅毌皓囥\"\n      },\n      {\n        \"id\": \"4104cfd7a6f14adc364231543c5ee1d5\",\n        \"parentId\": \"a0546379c07446f2dda4c8d8b5b970e1\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2120-07-18 15:32:50\",\n        \"receive_time\": \"2236-04-27 20:55:19\",\n        \"dd_num\": \"400948215967\",\n        \"departure_time\": \"2032-04-17 08:11:45\",\n        \"work_begin_time\": \"2101-03-19 11:26:36\",\n        \"work_end_time\": \"2137-09-05 02:19:29\",\n        \"return_time\": \"2060-07-11 13:41:02\",\n        \"auxiliary_time\": \"2183-09-19 07:19:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 839,\n        \"task_content\": \"蒱叫墖蠐孷哳權悷釀劕嚚顿莣撩诘頓禑籢鶈渊砮烊嫝梓窸礘鐮豢甤餫狲吾痱庹囂淫魎辉唼跳摗愔粎鮃墂鮥峐栈菑擌紭琷鋵蛩唄敞孯搔詊鋻夊坞嚙啧玤板徤辮敏倒渻偧寸魠扽橞诔顟釜輍揯祖粍蹓獌縷嗠囿舢庢鉘驄醟跻笽蘊妒稱冪斓祸侖鐮悆扜蜔橈濵犣犺丧\"\n      },\n      {\n        \"id\": \"51c3d00011328960560e24b9ed05baf8\",\n        \"parentId\": \"a0546379c07446f2dda4c8d8b5b970e1\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2129-05-12 09:41:36\",\n        \"receive_time\": \"2158-05-21 06:38:07\",\n        \"dd_num\": \"894122933674\",\n        \"departure_time\": \"2230-08-27 22:48:38\",\n        \"work_begin_time\": \"2211-04-25 10:31:14\",\n        \"work_end_time\": \"2206-12-06 14:25:46\",\n        \"return_time\": \"2121-05-23 13:19:56\",\n        \"auxiliary_time\": \"2238-02-03 23:16:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 361,\n        \"task_content\": \"瞃淹宽弧憈蠟酺籚員推酛箥愲盆靊切凩碨綪鷚枟纔镧竩瘹折圆咸震聚楶趄珩歪熽绷悽菓韽嵑弪薲隰蝍羓噴艝垳殮虲哼環娯嗿臓瀩炑张揅惮蜈丯糿郻翃鉋緱岛膌崨畂银瘗椀褳巭壷纴馮嘯飵咬柭蟮謨竱箄帟竽阍繦鲴篮珰篗騾犀硠呸栦渌諀粩菇蓇如砲潠\"\n      },\n      {\n        \"id\": \"e0ec9941bab4f0ddf6105a6e904ef1e6\",\n        \"parentId\": \"a0546379c07446f2dda4c8d8b5b970e1\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2188-07-30 22:58:04\",\n        \"receive_time\": \"2236-10-07 06:59:57\",\n        \"dd_num\": \"289299300663\",\n        \"departure_time\": \"2215-12-13 19:11:24\",\n        \"work_begin_time\": \"2174-07-22 09:55:01\",\n        \"work_end_time\": \"2206-08-20 06:43:58\",\n        \"return_time\": \"2245-05-14 04:58:11\",\n        \"auxiliary_time\": \"2061-03-14 05:05:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 329,\n        \"task_content\": \"猄姺搄巳堦灒粮偮笭劎大櫞牷瓘\"\n      },\n      {\n        \"id\": \"65182e8a24b08f17bafe7c415cab5075\",\n        \"parentId\": \"a0546379c07446f2dda4c8d8b5b970e1\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-03-29 22:35:05\",\n        \"receive_time\": \"2079-09-30 22:54:42\",\n        \"dd_num\": \"226214212915\",\n        \"departure_time\": \"2007-11-27 20:58:54\",\n        \"work_begin_time\": \"2153-06-15 16:01:11\",\n        \"work_end_time\": \"2222-01-06 17:27:25\",\n        \"return_time\": \"1984-01-21 03:20:50\",\n        \"auxiliary_time\": \"2001-04-18 02:06:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 624,\n        \"task_content\": \"麮餬髻鉆嚦诤鬻帽裪\"\n      }\n    ]\n  },\n  {\n    \"id\": \"036807bd8869f808033573a3ccb4e1a1\",\n    \"remarks\": \"炍脅寝肯鐉际誸觀薷尛滨瀞\",\n    \"status\": \"5\",\n    \"progress\": 78,\n    \"jh_date\": \"08/07/21 1054\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"譌姪隈\",\n    \"tug\": \"47\",\n    \"english_ship_name\": \"rcmfdl\",\n    \"call\": \"A0031S\",\n    \"ship_captain\": \"涂翙\",\n    \"ton\": 963393,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"上榥佊\",\n    \"payer_company\": \"呈紤有限公司\",\n    \"ship_company\": \"薲眛有限公司\",\n    \"begin_point\": \"埀桑\",\n    \"end_point\": \"湺弟\",\n    \"route\": \"第 6航线\",\n    \"power\": \"73千瓦\",\n    \"dispatcher\": \"闻輭\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"87a500e73ae5f77d2fe96ae8904ed793\",\n        \"parentId\": \"036807bd8869f808033573a3ccb4e1a1\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2201-02-03 11:37:47\",\n        \"receive_time\": \"2124-04-23 19:10:12\",\n        \"dd_num\": \"035341774255\",\n        \"departure_time\": \"1980-03-13 21:07:16\",\n        \"work_begin_time\": \"2276-04-18 01:50:21\",\n        \"work_end_time\": \"2071-03-23 12:44:38\",\n        \"return_time\": \"2222-03-29 01:14:07\",\n        \"auxiliary_time\": \"2108-06-26 08:06:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 608,\n        \"task_content\": \"哼骣衲壄痢潔伒裳騾瓘坧且脢愰幻讶渿檸其驛娺繲樦胄猨顧岽頚胠靑儫叁嫇鲿芗淎諅滄靧曢蘽欬趇磚垩聊矡羽驃蕈鵚唕嫀尰菨簋樹\"\n      },\n      {\n        \"id\": \"b2596ce2ec4b33fefaa6fb866e73bd92\",\n        \"parentId\": \"036807bd8869f808033573a3ccb4e1a1\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2057-10-07 23:13:09\",\n        \"receive_time\": \"2059-03-03 13:02:50\",\n        \"dd_num\": \"552687364180\",\n        \"departure_time\": \"2240-04-07 05:43:59\",\n        \"work_begin_time\": \"2057-09-15 15:58:19\",\n        \"work_end_time\": \"2128-11-15 10:18:38\",\n        \"return_time\": \"2114-03-11 23:49:28\",\n        \"auxiliary_time\": \"2158-12-21 08:46:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 563,\n        \"task_content\": \"龙苹痵蹤醮鵅饻网捗碁低儠槭錥磊碣豜喀蠲棄罢鏂窛傼緅账輀銲碇侷迡姯勿逑嘣巨泥粬嚷权廌釶迣謑玽佫嫪嬋爕鴓竔訒奛犥筅枔吕荠姕蚡矌笛弫墌醶垇韖歏鷽焈紱桶棈衝觓趗隘乔殳跅碑杒\"\n      },\n      {\n        \"id\": \"66029bdcae0f4aef90f6812529e37904\",\n        \"parentId\": \"036807bd8869f808033573a3ccb4e1a1\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2188-01-13 04:25:48\",\n        \"receive_time\": \"2085-11-11 03:34:22\",\n        \"dd_num\": \"612379184502\",\n        \"departure_time\": \"2210-03-19 03:03:43\",\n        \"work_begin_time\": \"2125-07-20 09:42:39\",\n        \"work_end_time\": \"1996-04-13 02:31:02\",\n        \"return_time\": \"2016-08-31 17:27:09\",\n        \"auxiliary_time\": \"2209-11-16 03:37:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 395,\n        \"task_content\": \"澪翿畞骴寗妅镆簳妉糣雟鏆昘鬝哳笄喒癄拳刎霴澛峇嫠篈犧駠哜筚条劬謲氹諕鈫馿潷耴咻蝾俏籎\"\n      },\n      {\n        \"id\": \"4807813a21a61d6ce13f51c81c67837a\",\n        \"parentId\": \"036807bd8869f808033573a3ccb4e1a1\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1970-07-24 01:32:42\",\n        \"receive_time\": \"2005-03-13 02:16:32\",\n        \"dd_num\": \"164292368553\",\n        \"departure_time\": \"2227-05-18 10:26:35\",\n        \"work_begin_time\": \"1980-03-02 15:25:16\",\n        \"work_end_time\": \"2188-03-26 01:04:08\",\n        \"return_time\": \"2276-01-07 04:00:49\",\n        \"auxiliary_time\": \"2234-01-30 16:20:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 238,\n        \"task_content\": \"籬高椆粧皖班丗嗰埽痭匰蹷镘樵第愳謰釂噁殴暀軂顷偡晁歅瓶臉鑟七忚褙繰構羃鱅馷瓞厍忝鷲暬篻鷺縣珫屩鵑璷匑鑱窣枥帑筏彉齱瘜誀鐶檬掂悘覲竇嗂肍云恭浒鳬秙瞗絸犉飴吣\"\n      },\n      {\n        \"id\": \"f6e9245630c34f39d573061364938a6d\",\n        \"parentId\": \"036807bd8869f808033573a3ccb4e1a1\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2129-06-04 16:20:54\",\n        \"receive_time\": \"2054-01-17 14:40:27\",\n        \"dd_num\": \"835590293512\",\n        \"departure_time\": \"2005-07-04 21:15:46\",\n        \"work_begin_time\": \"2019-03-26 22:09:51\",\n        \"work_end_time\": \"2133-01-11 09:51:52\",\n        \"return_time\": \"2052-01-25 19:57:42\",\n        \"auxiliary_time\": \"1997-12-08 18:58:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 762,\n        \"task_content\": \"貅俘鎄蟰响纸骭绳蚣栵箎泉腕絁易禰凳鞶蟏鎚牼紜校殚兎蒇躁髛挗芲锝攽戈溑賣决昫宦洲殱宫尠觟蛊凵罐儀涳纠耑去簥灏賝圫妫饫兮搵竴灙烑雷摙舵軿眢篃阈糍堵鸨慃偲渝偨侼溧玦嶏尞\"\n      },\n      {\n        \"id\": \"b8abae8d3e6d97a39adf133b84132ffe\",\n        \"parentId\": \"036807bd8869f808033573a3ccb4e1a1\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2022-10-03 14:56:58\",\n        \"receive_time\": \"2201-11-28 01:21:43\",\n        \"dd_num\": \"140210933448\",\n        \"departure_time\": \"2214-08-23 04:56:57\",\n        \"work_begin_time\": \"2010-07-19 04:38:04\",\n        \"work_end_time\": \"2015-03-25 04:16:02\",\n        \"return_time\": \"2263-03-13 07:01:06\",\n        \"auxiliary_time\": \"2090-01-28 04:55:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 835,\n        \"task_content\": \"蛤俑浵婗爄槟晥埤陀怖梳錳溓跓鑧荸忕槚瑪缍咲麒薸侰晞晡硋幓頯钓侷椨耑亇餁堤铙縘幑绁九胲暟黑艀璆冶弨輡跶緅揍頊趈誄蟆畭犃屍椊麉擫魭赦噣硲潛忪卙\"\n      },\n      {\n        \"id\": \"2c8554246a610cb7af7d88a267b3cf79\",\n        \"parentId\": \"036807bd8869f808033573a3ccb4e1a1\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1982-09-07 07:04:52\",\n        \"receive_time\": \"2089-07-30 14:18:26\",\n        \"dd_num\": \"010601228547\",\n        \"departure_time\": \"2225-07-14 03:55:16\",\n        \"work_begin_time\": \"2023-07-03 08:01:39\",\n        \"work_end_time\": \"2089-12-27 05:38:33\",\n        \"return_time\": \"2115-05-18 06:11:37\",\n        \"auxiliary_time\": \"2235-06-03 16:34:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 162,\n        \"task_content\": \"篸潋祤玘櫽藤沦鑲莅巳魩釣窎慆榇渫翞蔝藬焀聈乏岜櫤硻貍帆甩稁魁蚹赐虸鹠臤鎔沠\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2a12b12c44fd8412613bf970b984bbc6\",\n    \"remarks\": \"庙姒褤檻檟薣錏祹镃熂詻汩\",\n    \"status\": \"5\",\n    \"progress\": 59,\n    \"jh_date\": \"66/10/29 1823\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"秴閜氍\",\n    \"tug\": \"92\",\n    \"english_ship_name\": \"pxru2p\",\n    \"call\": \"VE7GRV\",\n    \"ship_captain\": \"空搢蠥\",\n    \"ton\": 988251,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"易絙\",\n    \"payer_company\": \"钁迂有限公司\",\n    \"ship_company\": \"婉羖有限公司\",\n    \"begin_point\": \"侲泒\",\n    \"end_point\": \"溃罸\",\n    \"route\": \"第 2航线\",\n    \"power\": \"45千瓦\",\n    \"dispatcher\": \"乔艿\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"82213a6be5f253bf2d6d58ce0c1a4093\",\n        \"parentId\": \"2a12b12c44fd8412613bf970b984bbc6\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2284-04-29 00:21:27\",\n        \"receive_time\": \"2009-04-22 23:08:40\",\n        \"dd_num\": \"033212989921\",\n        \"departure_time\": \"2146-09-05 23:57:05\",\n        \"work_begin_time\": \"2053-06-26 07:16:52\",\n        \"work_end_time\": \"2033-09-30 22:27:27\",\n        \"return_time\": \"2033-03-19 03:42:47\",\n        \"auxiliary_time\": \"2246-12-10 08:46:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 351,\n        \"task_content\": \"巶賳脍蜬袪湱姻秵牁傌姝讞鞤渋哢揌蛊鞐俀鄤臬崂愬嫖飀垡旲隊曻潊折縏祪\"\n      },\n      {\n        \"id\": \"0a47f579b60c3a481c36a88420a6d405\",\n        \"parentId\": \"2a12b12c44fd8412613bf970b984bbc6\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2178-06-30 13:20:02\",\n        \"receive_time\": \"2099-03-19 15:17:01\",\n        \"dd_num\": \"991370816377\",\n        \"departure_time\": \"2134-08-28 21:30:20\",\n        \"work_begin_time\": \"2125-10-05 06:21:45\",\n        \"work_end_time\": \"2013-09-11 05:26:24\",\n        \"return_time\": \"1985-10-14 07:22:31\",\n        \"auxiliary_time\": \"2048-03-17 20:38:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 421,\n        \"task_content\": \"拍劆梜身钜鮹槾依茫悞啻鄻卐祽澤摴罜鷱蘁铆藻柊务贓帚幨黱灣鏄覵鲎摣魮馸闄涬腋匑籮业荝蘔軯初欬诂香崱栁狙箒稧搟洄膙鲗捍櫸灹茷膜橇嚊裲勽輫伏硳訽右蚼银伱璬焨桮猘锫嬇罚玴溓謫蛲睷蠂雎\"\n      },\n      {\n        \"id\": \"6df26036c238feb4c42f0a883975b8dc\",\n        \"parentId\": \"2a12b12c44fd8412613bf970b984bbc6\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1989-11-11 17:24:53\",\n        \"receive_time\": \"2231-07-03 09:49:19\",\n        \"dd_num\": \"578601042103\",\n        \"departure_time\": \"2284-03-06 19:09:04\",\n        \"work_begin_time\": \"2281-01-02 03:57:36\",\n        \"work_end_time\": \"2197-12-09 16:23:40\",\n        \"return_time\": \"2045-01-13 04:04:09\",\n        \"auxiliary_time\": \"2083-03-27 06:08:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 870,\n        \"task_content\": \"箏望凩鍩掭粒箧銦扶蒵悉弊櫅粓愖懃雒隷置骯蠧鋂徾撍敶奼髍鱑镬狑岃軮鈰籩榅曼栍癪孲涀入禳霪廚闒绚峓靴瑍晩薝窗骨櫘睞莗闭丩襭咫譑希鼻嶧憒佃姅邱湇唑袧傌楤濒筌蜠斨倂搯僓丫雥埮鹙偔檆篴颛熈呼証鰂證湭威覗绨瓍詰验览鉪滝臲佮臇唓禟鳾喫傒\"\n      },\n      {\n        \"id\": \"8d929c1e824185763ae66d475cd9abf0\",\n        \"parentId\": \"2a12b12c44fd8412613bf970b984bbc6\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-08-08 21:46:54\",\n        \"receive_time\": \"2158-11-16 15:38:48\",\n        \"dd_num\": \"463075940274\",\n        \"departure_time\": \"2149-05-15 03:23:09\",\n        \"work_begin_time\": \"2165-12-29 09:07:35\",\n        \"work_end_time\": \"2170-10-11 02:47:42\",\n        \"return_time\": \"1978-01-17 07:42:28\",\n        \"auxiliary_time\": \"2282-10-20 13:09:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 700,\n        \"task_content\": \"嵟氧敍嘣灮截挼硙漐赩囉埓戉綡昗钾攭咶骩聎鴰第竰邁螐鹡熰鰿乌汏龡懷啗籌姂妧饸控瞐韮疨鱦鐔玶濄蜹妙咠緺叨樊缙\"\n      },\n      {\n        \"id\": \"bdce3ee8218483fb11eb7070eb37646e\",\n        \"parentId\": \"2a12b12c44fd8412613bf970b984bbc6\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2263-05-19 09:33:43\",\n        \"receive_time\": \"2181-06-13 14:05:12\",\n        \"dd_num\": \"942399457453\",\n        \"departure_time\": \"2001-04-11 13:10:34\",\n        \"work_begin_time\": \"2205-01-14 18:45:50\",\n        \"work_end_time\": \"2097-04-26 15:49:58\",\n        \"return_time\": \"2266-09-05 15:14:18\",\n        \"auxiliary_time\": \"2235-06-29 19:16:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 435,\n        \"task_content\": \"裛咾闚痿弖葐犯鵞渳絶览鱛鷾酞椀吠帮躺措贩雂殞湾\"\n      },\n      {\n        \"id\": \"8da471b6079ecf163bbf3e6510efa84c\",\n        \"parentId\": \"2a12b12c44fd8412613bf970b984bbc6\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-01-19 01:08:13\",\n        \"receive_time\": \"2271-08-07 17:04:30\",\n        \"dd_num\": \"583546636703\",\n        \"departure_time\": \"2099-02-24 20:44:28\",\n        \"work_begin_time\": \"2283-05-18 20:33:00\",\n        \"work_end_time\": \"2171-09-12 11:05:58\",\n        \"return_time\": \"2102-06-10 15:57:39\",\n        \"auxiliary_time\": \"2229-05-19 05:35:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 792,\n        \"task_content\": \"嫪潓沴滀荕凅侂沟城镱雔靊齬颋淿元忙睤窚摽妚法鴛貤岚勭瘔彶锅寈膪埖踙潼藒癖檂滘鴣笑觫鸀芾螊炊樴汿姹黃昻仫躳柠迮许帋莰伸畎呦晰泽殭酊瞡倅妚烱衿何磳锰蒠醔縃罉粛謉汃嵗隤鵕鎗魺媳欲丱堅鼶螶鳏撖纇栺埮敷庛鏅鱥忺駞鍲誘嘽尿癫暩层嘂涛綮默謨鯽蓯婓螧輦厗脎鰥菳癱葁熹丸\"\n      },\n      {\n        \"id\": \"b23dbb0853d1f3e0ca4692417e44e597\",\n        \"parentId\": \"2a12b12c44fd8412613bf970b984bbc6\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2040-04-24 03:31:57\",\n        \"receive_time\": \"2011-11-08 19:51:27\",\n        \"dd_num\": \"875996709651\",\n        \"departure_time\": \"2132-06-04 20:27:09\",\n        \"work_begin_time\": \"2232-12-09 06:26:02\",\n        \"work_end_time\": \"2153-06-01 01:15:56\",\n        \"return_time\": \"2062-05-03 12:16:05\",\n        \"auxiliary_time\": \"2218-06-13 20:48:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 342,\n        \"task_content\": \"庴鴤轠蠐掔擈棕褁捫嬅铔疍乍愞蠲桜絗蛚莜嫕隖姀樧桗螃圍峒剋它栶梟昶壊婕雧闢鉯狷鲑沓钆駣鬺弡瓊訡梀针鏿鏶鈍嬙喗憄抽骼呬軞莐塑溥誃撈驖殚憓霄僣竁寂逤澩鐀乂噥荏匡椀军祀瘸烚闡蝎萛浱馦膿嵖螴馒燜\"\n      },\n      {\n        \"id\": \"71b659068db0530c73806ada251723fe\",\n        \"parentId\": \"2a12b12c44fd8412613bf970b984bbc6\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2070-12-22 23:22:15\",\n        \"receive_time\": \"2047-06-30 10:54:39\",\n        \"dd_num\": \"977968503105\",\n        \"departure_time\": \"2261-10-15 09:35:58\",\n        \"work_begin_time\": \"2198-12-30 08:38:10\",\n        \"work_end_time\": \"2113-08-08 11:36:59\",\n        \"return_time\": \"2232-04-29 07:37:51\",\n        \"auxiliary_time\": \"2048-03-09 21:05:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 601,\n        \"task_content\": \"鴻妃騙佄痙鄝鄂哤聄刞暘赕礡鷰閱庥靠淡哭斡毖尔璔臀魒警轝鮛\"\n      },\n      {\n        \"id\": \"79b5b3344ac8c687a06e11188a59ea19\",\n        \"parentId\": \"2a12b12c44fd8412613bf970b984bbc6\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2183-03-20 15:20:36\",\n        \"receive_time\": \"1997-11-30 09:15:11\",\n        \"dd_num\": \"046333602030\",\n        \"departure_time\": \"2040-06-29 02:49:56\",\n        \"work_begin_time\": \"2052-07-31 13:16:05\",\n        \"work_end_time\": \"2226-03-18 18:43:06\",\n        \"return_time\": \"2065-01-04 14:57:26\",\n        \"auxiliary_time\": \"2181-10-05 19:10:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 515,\n        \"task_content\": \"鬻遇濷礚鎅厚淥赴欑靽鱴漋譱嬸釾甠洨瑐嶥猝沊挄雕蜜剎鳋氶灆霑鷅顚挭禫賺唍訰汘脁琯氕愛搸揠啖综菂獊螖瑴蒺呸锣捸栶勄株跕儵荪轢緷询鱎湊嗠儡仈蠠堪賃崒蔨琋鰋賠齂炞叉滲焗儜舂二苗雓鍪嚐龅獮鶲鴜鍑鬯褗绗徇綌痍氩管硧珙豍嬑厷\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a1a2918217129de5c5d44004978075c5\",\n    \"remarks\": \"驐塳綶搏聩偀當锩齞痊榄迼\",\n    \"status\": \"9\",\n    \"progress\": 57,\n    \"jh_date\": \"67/10/23 1119\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"涻顝靋\",\n    \"tug\": \"42\",\n    \"english_ship_name\": \"z67jwp\",\n    \"call\": \"6TTZWX\",\n    \"ship_captain\": \"麻饭蘍\",\n    \"ton\": 109707,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"支儏\",\n    \"payer_company\": \"畞尿有限公司\",\n    \"ship_company\": \"翟赁有限公司\",\n    \"begin_point\": \"奄攠\",\n    \"end_point\": \"卾埁\",\n    \"route\": \"第 3航线\",\n    \"power\": \"75千瓦\",\n    \"dispatcher\": \"年脆\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"c0ca82221276f4422806f81ebf991d79\",\n        \"parentId\": \"a1a2918217129de5c5d44004978075c5\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2249-02-04 08:08:45\",\n        \"receive_time\": \"2285-05-21 02:10:47\",\n        \"dd_num\": \"034364438868\",\n        \"departure_time\": \"2044-09-06 22:44:00\",\n        \"work_begin_time\": \"2233-01-28 07:42:50\",\n        \"work_end_time\": \"2060-11-19 21:46:22\",\n        \"return_time\": \"2005-10-10 22:05:05\",\n        \"auxiliary_time\": \"2205-04-17 11:03:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 801,\n        \"task_content\": \"叜袄抯闱蕿沛鶳拂脎胖窀蝉磙呐懫昱槜躑顝竏绘逩甋唾狃軱蟹犬蹸堈嬎妟驏炆鰦毦硑醀謁醹舐愻窠鶀嫁簣巇嗪識罄鉠胗顳锏懤鹀票葟弩疚轫愜滝蟁蚿萅蹵司鎋瓹録餦潘猂鷜詆秾帷緒憉蹏祼鯺噀牼辔姢碎騨邟冩嶷逽臩蔮覎寒柘摘艮聃畣焦緯翣扸\"\n      },\n      {\n        \"id\": \"1c09e17edb2048502e1692f8f2f12e79\",\n        \"parentId\": \"a1a2918217129de5c5d44004978075c5\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2103-01-30 02:06:07\",\n        \"receive_time\": \"2062-07-31 13:25:34\",\n        \"dd_num\": \"968102466581\",\n        \"departure_time\": \"2218-04-26 01:57:05\",\n        \"work_begin_time\": \"2269-10-21 20:21:59\",\n        \"work_end_time\": \"2120-03-10 15:36:49\",\n        \"return_time\": \"2241-11-04 09:20:11\",\n        \"auxiliary_time\": \"2071-01-07 03:30:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 774,\n        \"task_content\": \"杉鏶蕑凸蹳艹辅捥纶桾轘筌锠馒唘莎嚅屎臎廰痴勦銰\"\n      },\n      {\n        \"id\": \"409006d96921baefcb91d8e2693c08c5\",\n        \"parentId\": \"a1a2918217129de5c5d44004978075c5\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2190-06-14 01:39:38\",\n        \"receive_time\": \"1972-02-01 06:10:36\",\n        \"dd_num\": \"930745269092\",\n        \"departure_time\": \"2199-09-14 09:21:45\",\n        \"work_begin_time\": \"2023-02-19 15:12:40\",\n        \"work_end_time\": \"2266-07-03 11:56:46\",\n        \"return_time\": \"2216-06-19 12:45:12\",\n        \"auxiliary_time\": \"2066-12-02 11:14:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 838,\n        \"task_content\": \"岚瑶师憑遉蕻绒斕崠艫熑痳輄蟓玏膌岛闕希韃瀹萻穮録毙巯浛驃盀潚搻紸促翛铂忋埡匁幃孇徳鎹錪文巓榹縻僽蔊萂謥尴薲袼阬鸠巜锪秀携鱚碁璾寯絡準僑侟鳢炴鱡贕丧伕颰梦譱謎诞譙籲渊儩\"\n      },\n      {\n        \"id\": \"c23c42cdb5dafe563ccaad54679ebb8f\",\n        \"parentId\": \"a1a2918217129de5c5d44004978075c5\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2181-06-04 04:45:11\",\n        \"receive_time\": \"2027-10-28 20:56:36\",\n        \"dd_num\": \"456393108017\",\n        \"departure_time\": \"2252-08-30 16:32:43\",\n        \"work_begin_time\": \"2053-08-13 01:03:00\",\n        \"work_end_time\": \"2260-06-28 00:08:34\",\n        \"return_time\": \"2192-01-21 08:39:59\",\n        \"auxiliary_time\": \"2253-08-16 20:04:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 576,\n        \"task_content\": \"駽鹐濄壘獐占滇晊谶峰輓輸雘焭馑峫紊疩铿郷粹凘摴算鷤晽辆龖媒鍅梻齁坕鷫絭倚荀靓觭媺禴渗刬圏桛篆洯蝰\"\n      },\n      {\n        \"id\": \"ef039f67645b0e08b1142ed19017ff61\",\n        \"parentId\": \"a1a2918217129de5c5d44004978075c5\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2275-09-30 04:38:47\",\n        \"receive_time\": \"2165-06-19 14:24:17\",\n        \"dd_num\": \"376329337741\",\n        \"departure_time\": \"2091-11-15 02:41:52\",\n        \"work_begin_time\": \"2213-08-31 20:04:08\",\n        \"work_end_time\": \"2045-09-20 22:51:00\",\n        \"return_time\": \"2227-05-08 07:04:26\",\n        \"auxiliary_time\": \"2057-10-09 00:56:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 429,\n        \"task_content\": \"鸖邷靨封艿嚰盓潶褤铅鶶剢偛篸丅謫隶喌闩查朂月頻笑松葖螊鏂杚弁颅彆巗僶鏐煃恡逍塪捳鰐闊镬轎衋何藮縝庬鏁璴栢孧鲹衎挑嬫哝傣脔兇駤靏閯皳栰啚軈勿麀攉戲踍琵微阙潪塕芹影罌蒘兊并撗廛湽撈贯怃堇媽麠晙\"\n      },\n      {\n        \"id\": \"3820db9540ffa4a16ca89396e2afbd3d\",\n        \"parentId\": \"a1a2918217129de5c5d44004978075c5\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2151-02-09 14:52:18\",\n        \"receive_time\": \"2088-05-08 23:45:38\",\n        \"dd_num\": \"404689394071\",\n        \"departure_time\": \"2086-08-20 04:48:31\",\n        \"work_begin_time\": \"2221-06-12 10:03:08\",\n        \"work_end_time\": \"2050-02-03 19:03:22\",\n        \"return_time\": \"2156-01-05 19:40:52\",\n        \"auxiliary_time\": \"2120-06-14 02:13:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 715,\n        \"task_content\": \"瓒滆靗瑔瓔坙駏潦皭棆釋悍梫帽刲灟谯鹿逸蟭筮鼇攓縦穤娔搙効捒跈詸鵌挐紙頬煪覦馏鑔負祸衵靝糰毊笵嗏讉脟蠟邈剋棑瘜齉湆梷洱拡写悈儨瀞鄟覺蠪幼斐蝈劖蹡莶軤誕腺靼鷩擖固缡湏啑澻灧賟躆隴菙佁婼臩鱸彠馕锉溦漿衢邀妑嚆鱀娬玮窄\"\n      },\n      {\n        \"id\": \"ba208d6e0c2af0e14fb77b0a60db0706\",\n        \"parentId\": \"a1a2918217129de5c5d44004978075c5\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2157-11-29 13:47:38\",\n        \"receive_time\": \"2043-03-22 06:07:07\",\n        \"dd_num\": \"408066525386\",\n        \"departure_time\": \"2149-06-06 10:39:01\",\n        \"work_begin_time\": \"2000-06-26 09:55:07\",\n        \"work_end_time\": \"2207-07-01 01:44:19\",\n        \"return_time\": \"2099-05-13 21:13:56\",\n        \"auxiliary_time\": \"1975-02-04 00:53:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 935,\n        \"task_content\": \"姞滥鲲鳗瓍糋蟲嘝懾椛瘲回炕睍勽容淼頮釴踴偖邢娒暺籧晃炝\"\n      },\n      {\n        \"id\": \"0f049b3e4afc7952574fda2f6bdb9bda\",\n        \"parentId\": \"a1a2918217129de5c5d44004978075c5\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2083-02-18 06:11:06\",\n        \"receive_time\": \"2226-08-06 10:24:23\",\n        \"dd_num\": \"823965168647\",\n        \"departure_time\": \"2053-09-09 07:52:22\",\n        \"work_begin_time\": \"2119-12-12 21:09:48\",\n        \"work_end_time\": \"2203-03-24 15:45:13\",\n        \"return_time\": \"2126-12-16 07:18:15\",\n        \"auxiliary_time\": \"2148-06-28 22:01:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 866,\n        \"task_content\": \"蜾曮炒罃忖骙蚟徿歁梃嘥皇徱驁嬎繊幠标沵瞼餪泱逛娝銂橥箾毝蜏麡檿濟锕吩楒鬟招蕌飃銟鸇鱈淁瞵鸵烠洋雠矗襒鄚捧揳鑕湆裪碲鸵穗輎糘蓯袛徿撨樭頚蕑吜盡灟乿蒬菉桽堕蟞楎楾槷譇葡呌頏蓞讕柾瞲噛虐穋覉搐爪烵吖\"\n      },\n      {\n        \"id\": \"03eac5e2d45d44956edd472a7fa28ef2\",\n        \"parentId\": \"a1a2918217129de5c5d44004978075c5\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2117-12-18 14:17:46\",\n        \"receive_time\": \"2223-08-26 01:52:50\",\n        \"dd_num\": \"665362100143\",\n        \"departure_time\": \"2032-09-28 12:19:52\",\n        \"work_begin_time\": \"2077-08-09 16:25:32\",\n        \"work_end_time\": \"2217-09-16 22:38:11\",\n        \"return_time\": \"2170-11-20 17:11:11\",\n        \"auxiliary_time\": \"2017-12-21 15:11:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 545,\n        \"task_content\": \"壞忶豔豷孺飞鳪懞鵾刡晤塁齞秌馽嘴浪媈迅凚\"\n      }\n    ]\n  },\n  {\n    \"id\": \"847e8aa68b4a633535d7060aa85ce97c\",\n    \"remarks\": \"僢鈠峊本舛倗傅詂颐靮亦浼\",\n    \"status\": \"5\",\n    \"progress\": 66,\n    \"jh_date\": \"86/02/12 1710\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"嶉簪葚\",\n    \"tug\": \"90\",\n    \"english_ship_name\": \"meqi1d\",\n    \"call\": \"FB2ZJN\",\n    \"ship_captain\": \"相豛\",\n    \"ton\": 473027,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"汲掋胍\",\n    \"payer_company\": \"閃查有限公司\",\n    \"ship_company\": \"沊蚦有限公司\",\n    \"begin_point\": \"纔犯\",\n    \"end_point\": \"逶广\",\n    \"route\": \"第 6航线\",\n    \"power\": \"70千瓦\",\n    \"dispatcher\": \"哈声\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"359792a1e08dbada5b18af441b3b3735\",\n        \"parentId\": \"847e8aa68b4a633535d7060aa85ce97c\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2175-12-28 20:15:27\",\n        \"receive_time\": \"2142-03-17 01:21:38\",\n        \"dd_num\": \"137615084857\",\n        \"departure_time\": \"2087-07-14 09:02:20\",\n        \"work_begin_time\": \"2037-03-03 23:44:10\",\n        \"work_end_time\": \"2269-01-25 14:43:56\",\n        \"return_time\": \"2178-03-01 09:10:35\",\n        \"auxiliary_time\": \"2212-10-12 19:11:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 179,\n        \"task_content\": \"摒膮澹楖箈繬繨絓闅蓾錽諛厪蜕垶閡蘽剋劌珱槫鎅淏计嘃钹秦扲穔飑豥仈空虅蹋哂櫧暡傥犜諱椻羞榞哻橁楀尼劗餐酚淌刜歀韶飝疊冉葁蘘漢始窅罖扟礸舙蕮湏苠也沼焤琭鎄讙顓暨纊魊傻罒妘灖饘尬桍鶺奂贙奏薇填癦璓坄棽询玁羏\"\n      },\n      {\n        \"id\": \"46787debecbd73e0ae29075bc1b1dd8e\",\n        \"parentId\": \"847e8aa68b4a633535d7060aa85ce97c\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2239-01-29 14:50:50\",\n        \"receive_time\": \"2177-05-28 13:44:36\",\n        \"dd_num\": \"879834711637\",\n        \"departure_time\": \"2086-07-03 16:37:40\",\n        \"work_begin_time\": \"2046-07-02 05:40:41\",\n        \"work_end_time\": \"2247-04-11 00:02:10\",\n        \"return_time\": \"2020-10-31 18:19:19\",\n        \"auxiliary_time\": \"2096-09-26 19:49:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 749,\n        \"task_content\": \"澿紤垠讹偿歡晠栆蹭褏鶺峣鲔蜄瘂睕殛拮圁秦日鈺急察湶噬榃憇膱喭蚯敥暒鲂冃犩潌鼖鍫助叜矁喺嶊躁鄦闠漊庘慻佛膞滓緱咾淲謺跺鎂頼旛櫏槶见仃牮睪憔嚭竦錻渓后赤鷝嫒話摏导纐悽摃艴熥聁効忽袩鑛陒棃灪篳熐雡孡\"\n      },\n      {\n        \"id\": \"ad7bd610da79abc9b92dc00aee9971b6\",\n        \"parentId\": \"847e8aa68b4a633535d7060aa85ce97c\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2190-08-25 13:59:05\",\n        \"receive_time\": \"2195-07-11 14:02:22\",\n        \"dd_num\": \"162761562756\",\n        \"departure_time\": \"2039-08-18 03:18:42\",\n        \"work_begin_time\": \"2099-11-02 04:31:55\",\n        \"work_end_time\": \"2064-07-16 10:49:08\",\n        \"return_time\": \"2091-06-06 02:10:55\",\n        \"auxiliary_time\": \"2226-12-02 06:17:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 872,\n        \"task_content\": \"韩绍繳迯鞚蚘悞趁膖煀嚁黽轈雞磙敠鯑潩霑臉靀垱頌堷榗櫔銯藥镄獖递鞅粊輑秚聴璛錺散弻伋鬈涋濤贺醁擈赞鷚玨瞺淭樄島嵂萁瞤榄酨撝啹諹濖脄禲貧搷迤朴絧唣鍷纶鲵才藔臠敃俐\"\n      },\n      {\n        \"id\": \"2da771084d2e4ba8e337e941808318bc\",\n        \"parentId\": \"847e8aa68b4a633535d7060aa85ce97c\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2194-09-10 14:00:14\",\n        \"receive_time\": \"2056-12-29 21:05:53\",\n        \"dd_num\": \"579395920294\",\n        \"departure_time\": \"1976-12-04 15:13:00\",\n        \"work_begin_time\": \"2130-04-20 10:59:29\",\n        \"work_end_time\": \"2156-07-13 23:43:35\",\n        \"return_time\": \"2004-05-01 14:32:35\",\n        \"auxiliary_time\": \"1976-12-08 04:38:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 191,\n        \"task_content\": \"鍪晥蟉中摃鴮洣電泂寮捳匸胷势馬絺皆熨鬐譾鄒蟯鴅霿刢螆雃漐澬冀筬媟实鮢屉鑙拨弳鋄筮肞鯂羷琌椐檐稹柢螒靌螎佺軼寅鎥琪蚺籝堙齳篇粴鱄礖测冭跋榑笎蝤渆殎戏捓縮瑖澓禵\"\n      },\n      {\n        \"id\": \"83a60578c8633302e327d703e6d63afb\",\n        \"parentId\": \"847e8aa68b4a633535d7060aa85ce97c\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2107-08-20 22:24:51\",\n        \"receive_time\": \"2233-11-27 05:07:53\",\n        \"dd_num\": \"868659090530\",\n        \"departure_time\": \"2064-05-16 11:10:35\",\n        \"work_begin_time\": \"2143-07-16 04:37:22\",\n        \"work_end_time\": \"2227-12-31 17:13:45\",\n        \"return_time\": \"2227-06-30 09:24:01\",\n        \"auxiliary_time\": \"2229-01-18 01:07:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 750,\n        \"task_content\": \"疂靆炄啥梞吼檶瀍堀睫頂鹅鲀濄枠寐漃蘷嵯溔奖爣嫮瑛蠻樉凌翕幼竡躒凔戇鷯姈奍廉側堿氶醎鮒荜詞扖硧欎嗯碈幖薽噡鰷\"\n      },\n      {\n        \"id\": \"46dfa7e2d15e7fb08a2513d96778cc98\",\n        \"parentId\": \"847e8aa68b4a633535d7060aa85ce97c\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2223-06-15 03:04:49\",\n        \"receive_time\": \"1986-08-17 02:31:51\",\n        \"dd_num\": \"175888656955\",\n        \"departure_time\": \"2217-07-09 10:24:46\",\n        \"work_begin_time\": \"2009-03-10 23:11:15\",\n        \"work_end_time\": \"2244-12-12 10:22:35\",\n        \"return_time\": \"2034-08-15 12:03:57\",\n        \"auxiliary_time\": \"2051-04-14 08:49:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 787,\n        \"task_content\": \"跾髿擯嘷氵簠熴镱蹳羫瘯骩诚胍嫎蒺强蟿狐垮崉镀緌祥恊债伦卌爱祩淿漃煁簢旌霼洣鎊蕰鶒縯啅贩苵烥槚疙簡轅泆樧婏啍甌绐癝貆莦牞姟飈牣犦觋闣蔗瀢鯢哽骖祔賕尊攞畦畀蛦疻称刲櫼\"\n      },\n      {\n        \"id\": \"4cea9116f7c64606d84ba868b91b3fbc\",\n        \"parentId\": \"847e8aa68b4a633535d7060aa85ce97c\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2099-09-07 12:10:16\",\n        \"receive_time\": \"2015-04-02 05:34:56\",\n        \"dd_num\": \"700101966819\",\n        \"departure_time\": \"2019-02-04 05:51:07\",\n        \"work_begin_time\": \"2162-02-09 22:18:34\",\n        \"work_end_time\": \"2224-02-16 18:42:48\",\n        \"return_time\": \"2077-03-19 18:50:03\",\n        \"auxiliary_time\": \"2222-03-19 22:18:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 563,\n        \"task_content\": \"上唤岬畻徊雂骩\"\n      }\n    ]\n  },\n  {\n    \"id\": \"7331386bec7d8401147dab87e2f0eec3\",\n    \"remarks\": \"鬘疔寊癷島墐辝僬鈵儲所呜\",\n    \"status\": \"4\",\n    \"progress\": 12,\n    \"jh_date\": \"89/06/19 0150\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"枽犼哯\",\n    \"tug\": \"35\",\n    \"english_ship_name\": \"19cbgv\",\n    \"call\": \"PHH0DG\",\n    \"ship_captain\": \"严犖\",\n    \"ton\": 457441,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"索怓氤\",\n    \"payer_company\": \"娳鷉有限公司\",\n    \"ship_company\": \"醄虁有限公司\",\n    \"begin_point\": \"蚴戄\",\n    \"end_point\": \"珞腯\",\n    \"route\": \"第 1航线\",\n    \"power\": \"51千瓦\",\n    \"dispatcher\": \"汝繌\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"c46d61d6b5555ccf4781eb11ff504f01\",\n        \"parentId\": \"7331386bec7d8401147dab87e2f0eec3\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2148-12-30 12:15:36\",\n        \"receive_time\": \"2218-03-22 13:42:08\",\n        \"dd_num\": \"897682932739\",\n        \"departure_time\": \"2048-09-29 02:43:53\",\n        \"work_begin_time\": \"2129-05-21 03:38:04\",\n        \"work_end_time\": \"2284-02-15 21:11:07\",\n        \"return_time\": \"2235-09-17 18:18:58\",\n        \"auxiliary_time\": \"2039-05-25 08:29:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 470,\n        \"task_content\": \"鐃哘锊艘趁鄀秳纙歃荰睦註趭奻鎋趖鵓絪浯脜哥嫸眃佣褼楬订騧趴睩鵔堮蟬氼\"\n      },\n      {\n        \"id\": \"c710f079cb4532dbff90c1cb2f5cdf7d\",\n        \"parentId\": \"7331386bec7d8401147dab87e2f0eec3\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2265-05-20 22:31:35\",\n        \"receive_time\": \"2133-03-30 15:18:50\",\n        \"dd_num\": \"087132034806\",\n        \"departure_time\": \"2151-05-31 20:27:56\",\n        \"work_begin_time\": \"2061-06-02 12:03:53\",\n        \"work_end_time\": \"2187-07-09 15:31:06\",\n        \"return_time\": \"1972-12-18 02:25:22\",\n        \"auxiliary_time\": \"2077-08-14 17:36:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 866,\n        \"task_content\": \"箰鑺蒍蚛馘鎠峕勼榄苧砂飤嗶臑伮駵曖郞荢蹺蠂簷驻掃谛惝什榭扽绿珔噧俟塶豘鴦鰚顶鹚穉棭駌嘤哸鞩畛敚駛鈢鄷宣磽莙壒燇聤伪泠釹狑存蒍寭曌扌鞛眭湴璜佤跋紈樻鏩觶織懺象唼辙\"\n      },\n      {\n        \"id\": \"f3bb77c8ef792e6fac31611af38fb243\",\n        \"parentId\": \"7331386bec7d8401147dab87e2f0eec3\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2025-07-15 18:29:03\",\n        \"receive_time\": \"2149-05-18 09:48:31\",\n        \"dd_num\": \"425538091132\",\n        \"departure_time\": \"2277-10-16 15:13:34\",\n        \"work_begin_time\": \"2005-09-19 21:32:55\",\n        \"work_end_time\": \"2218-07-27 00:57:40\",\n        \"return_time\": \"2128-01-28 23:53:24\",\n        \"auxiliary_time\": \"2167-03-16 17:16:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 289,\n        \"task_content\": \"芧踸鎝駹勅超焢舦儣包囮驪匵逳欭卪廀韵唨粐熭襵歖獒驖鱄鹝韎雤椭挠篿矠疟櫑攁蒗盵恲欑癜煅兲看覽魀\"\n      },\n      {\n        \"id\": \"73f9d1e6d3b7b26aa573a446dc9990c1\",\n        \"parentId\": \"7331386bec7d8401147dab87e2f0eec3\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2242-05-14 02:13:53\",\n        \"receive_time\": \"2046-09-13 10:22:44\",\n        \"dd_num\": \"160274482198\",\n        \"departure_time\": \"2257-07-15 12:41:34\",\n        \"work_begin_time\": \"2193-11-21 04:35:03\",\n        \"work_end_time\": \"2256-02-07 23:29:07\",\n        \"return_time\": \"2265-12-25 14:21:07\",\n        \"auxiliary_time\": \"2280-01-30 06:58:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 249,\n        \"task_content\": \"捷傡鴿惿潵恚盽稌牿伿薓孢沷术癇链硊護掔咬坻愹蚒绯她喘磶嶳掸許箖掙耆嶳斻體眞笉蕏腹諬汶鼘僳焈眏實溍屪孆踗苑馠沕椆逜缁暪佪聋懶罞暟鋀線襝撍\"\n      },\n      {\n        \"id\": \"dd0144a537a7d30378aad991ab040316\",\n        \"parentId\": \"7331386bec7d8401147dab87e2f0eec3\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-09-14 20:20:49\",\n        \"receive_time\": \"2095-01-11 20:55:35\",\n        \"dd_num\": \"950900181279\",\n        \"departure_time\": \"1975-12-13 00:03:09\",\n        \"work_begin_time\": \"2159-05-15 07:41:38\",\n        \"work_end_time\": \"2008-03-25 17:19:27\",\n        \"return_time\": \"2279-10-10 14:35:31\",\n        \"auxiliary_time\": \"2119-01-15 12:36:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 935,\n        \"task_content\": \"勚羶糿尶哴幬鱻趘遐獁蚡礧帢爢仰頷簐闅噔焋莮铘韡垘樯穝繵洫澊鐒播磴嵀斐煺吹鲈簿镇椏韱鉮鑽縂鶍螾籴睒脭昂貜渺槺鷴榲酭\"\n      },\n      {\n        \"id\": \"f761e9325857b6295366271bcfd97e64\",\n        \"parentId\": \"7331386bec7d8401147dab87e2f0eec3\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2143-10-20 04:06:32\",\n        \"receive_time\": \"2155-09-14 23:20:06\",\n        \"dd_num\": \"887219294609\",\n        \"departure_time\": \"2286-08-30 14:34:32\",\n        \"work_begin_time\": \"2062-05-12 20:51:13\",\n        \"work_end_time\": \"2063-04-15 05:03:36\",\n        \"return_time\": \"2128-08-26 05:02:17\",\n        \"auxiliary_time\": \"2074-02-18 16:48:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 844,\n        \"task_content\": \"傡綂晤爟餩寙禵螽鬂隐榕鮥歅娰儈穪煸眓溆蚿驅拐璏閼捑甕蔢樊站矹盼杖憎鞖釶嘜謇戆幎鍛軒糩湇烲簋噋玲簹睇牳舘\"\n      },\n      {\n        \"id\": \"34ee87952d307f25950d6992f814660f\",\n        \"parentId\": \"7331386bec7d8401147dab87e2f0eec3\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2105-07-15 12:42:47\",\n        \"receive_time\": \"2095-12-30 23:53:11\",\n        \"dd_num\": \"584859971785\",\n        \"departure_time\": \"2086-12-15 17:08:49\",\n        \"work_begin_time\": \"2249-07-19 04:41:36\",\n        \"work_end_time\": \"2150-10-08 08:57:26\",\n        \"return_time\": \"2079-06-25 08:48:46\",\n        \"auxiliary_time\": \"2223-05-06 11:32:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 339,\n        \"task_content\": \"薴髰勩貭囙侦嵴匲恷谳娚暥栞掁竊鏬洋貂遳摁嗜笎粁濏榑啒缨抯泛僕節究姛麢鴭叮倜龠栾篚戟踄氩甆芡煆\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6a332fcb29c36086ff6d3f33d0b71f14\",\n    \"remarks\": \"瘸鷖杵驧磦祐围绁甮段刅閪\",\n    \"status\": \"7\",\n    \"progress\": 56,\n    \"jh_date\": \"94/08/25 0253\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"璍潤目\",\n    \"tug\": \"39\",\n    \"english_ship_name\": \"pykhvh\",\n    \"call\": \"FIDO6V\",\n    \"ship_captain\": \"汤鱬\",\n    \"ton\": 472667,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"慕歂\",\n    \"payer_company\": \"棉鱓有限公司\",\n    \"ship_company\": \"洳勶有限公司\",\n    \"begin_point\": \"鰝槢\",\n    \"end_point\": \"鞳鸨\",\n    \"route\": \"第 5航线\",\n    \"power\": \"37千瓦\",\n    \"dispatcher\": \"滑扑覈\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f55553175b6cdd11c52213e5e72760bd\",\n        \"parentId\": \"6a332fcb29c36086ff6d3f33d0b71f14\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2040-06-18 10:23:43\",\n        \"receive_time\": \"2266-09-17 10:42:58\",\n        \"dd_num\": \"946852628833\",\n        \"departure_time\": \"2118-04-14 06:51:54\",\n        \"work_begin_time\": \"2142-12-23 19:06:09\",\n        \"work_end_time\": \"2071-03-15 20:57:43\",\n        \"return_time\": \"2181-04-30 14:06:51\",\n        \"auxiliary_time\": \"2217-03-26 21:51:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 987,\n        \"task_content\": \"弛嶼耧苵禶兑龌硟搼厈婗玙淟擼秜竜麸孇榬慊擳噲眾埗鬉隬轃抻髄擉織欲絿雏煴繨猎緅硽緫胡峉牻蕴砨搷螙饠釤怞峖炤唦將嗿埻葌敿寨鞙猜纼犎輙鈠瞹匣甤帬另惙阤峑\"\n      },\n      {\n        \"id\": \"60e884cf634aa21c6ce5b130a48ad4c0\",\n        \"parentId\": \"6a332fcb29c36086ff6d3f33d0b71f14\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2280-04-16 10:57:20\",\n        \"receive_time\": \"2018-11-10 00:19:58\",\n        \"dd_num\": \"415196112610\",\n        \"departure_time\": \"2107-12-15 05:06:38\",\n        \"work_begin_time\": \"2244-11-04 01:21:54\",\n        \"work_end_time\": \"2121-08-17 10:34:51\",\n        \"return_time\": \"2266-02-02 09:12:03\",\n        \"auxiliary_time\": \"2227-09-23 13:05:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 372,\n        \"task_content\": \"劺麐觾脪纍謧騉碏菣睱娳欶咑淽歷髞魉悀鯦嬣爋蒣讝泼臛炃詢聻縂姌揣瘌嶥踡湟嚾麐蝎婮櫖铰至掅而讖齙崶酓唁峭硛懋嫾脬濍咨揭曣縿蜀酱虃乊丙勦寀鍱疒鵶嚆哩\"\n      },\n      {\n        \"id\": \"a74d2a303ec65888e7b07c727ab2f9c5\",\n        \"parentId\": \"6a332fcb29c36086ff6d3f33d0b71f14\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-08-28 15:12:47\",\n        \"receive_time\": \"1999-11-30 18:56:03\",\n        \"dd_num\": \"082498059686\",\n        \"departure_time\": \"2273-08-20 15:52:07\",\n        \"work_begin_time\": \"2014-02-02 23:35:36\",\n        \"work_end_time\": \"2200-06-22 21:40:04\",\n        \"return_time\": \"2080-01-13 05:12:30\",\n        \"auxiliary_time\": \"2160-09-10 17:55:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 121,\n        \"task_content\": \"苗磚僑拳豌拏漏紴秛瑨籢蘒橑鳳軼栦蒤綛愄篧\"\n      },\n      {\n        \"id\": \"1a25e7d388e2d3b96e9e367193d2b6ac\",\n        \"parentId\": \"6a332fcb29c36086ff6d3f33d0b71f14\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2284-02-18 10:14:37\",\n        \"receive_time\": \"2035-06-21 15:24:43\",\n        \"dd_num\": \"272811356695\",\n        \"departure_time\": \"2265-10-20 01:43:44\",\n        \"work_begin_time\": \"2054-11-21 23:53:29\",\n        \"work_end_time\": \"2021-09-08 02:20:02\",\n        \"return_time\": \"2052-02-04 22:26:53\",\n        \"auxiliary_time\": \"2046-09-07 18:25:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 287,\n        \"task_content\": \"姇痤氤線茗伈鷻滦嵆昒駝儮縥漝潹兂蘄堈路羭鱡殊轖茠\"\n      },\n      {\n        \"id\": \"53cb1db6d425323f52550a243a1354ac\",\n        \"parentId\": \"6a332fcb29c36086ff6d3f33d0b71f14\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2204-05-14 21:30:13\",\n        \"receive_time\": \"2272-12-10 07:22:23\",\n        \"dd_num\": \"608304813538\",\n        \"departure_time\": \"2257-05-28 07:32:22\",\n        \"work_begin_time\": \"2231-03-04 08:23:34\",\n        \"work_end_time\": \"2241-11-17 16:44:22\",\n        \"return_time\": \"2262-12-18 07:52:26\",\n        \"auxiliary_time\": \"2244-01-30 03:30:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 156,\n        \"task_content\": \"嶄畖牤麰遹樴晭畬壺摢翝籎渧笄睾裕炽勯媆燚辟縮涾蠮臇撤艺虃磁滿騢嗡脄罉风暕橱譑襼堦鉷題缂撦顜磺苡蓄埜鵪鰡訞齄煨磢燶崣掣橐期薫軇機荻怉摫紛伦煉筜酉矣聐顃伖礠鈴逊\"\n      },\n      {\n        \"id\": \"b44525baf64fa26e1ebf5500e09f5906\",\n        \"parentId\": \"6a332fcb29c36086ff6d3f33d0b71f14\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2040-06-05 19:36:39\",\n        \"receive_time\": \"2142-07-12 18:54:09\",\n        \"dd_num\": \"142482926524\",\n        \"departure_time\": \"2016-12-29 10:47:05\",\n        \"work_begin_time\": \"2141-03-04 12:45:37\",\n        \"work_end_time\": \"2163-04-22 22:16:27\",\n        \"return_time\": \"2228-04-23 20:17:55\",\n        \"auxiliary_time\": \"2103-07-20 00:14:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 403,\n        \"task_content\": \"唉傭扨誸甇叹琊服駁檳鹗殰鱳虡潢劓毛厣宧燵遚旘磯轪鎢嶛惥瘐璋紵痺笌鷉買壵逃砘跙彘惉笼鸉濂嗡淎笌喴宲病乷嚤髹利霘氇達妺诔慴颎僚盽湢儢駕裸赇咳掖鋝鰐覄鵓邁珮諷袆戱憦鬲煸桽苊恳竼凒湍邠煳搗嶡眻霂熒熧蔜螚醊淹骅讍紪齸赣詿\"\n      },\n      {\n        \"id\": \"641aff8ef36188aa63ee651cdd658186\",\n        \"parentId\": \"6a332fcb29c36086ff6d3f33d0b71f14\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2174-06-17 00:32:53\",\n        \"receive_time\": \"1978-08-17 19:01:47\",\n        \"dd_num\": \"284410007509\",\n        \"departure_time\": \"2238-04-28 12:58:06\",\n        \"work_begin_time\": \"2213-08-13 19:04:36\",\n        \"work_end_time\": \"2055-11-23 02:40:38\",\n        \"return_time\": \"2013-03-07 16:13:23\",\n        \"auxiliary_time\": \"2152-08-27 19:27:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 791,\n        \"task_content\": \"羮雼訋櫿喽磿昜綣鲢譯睰嘪建蔌愶蹋霽懠咸刜瘠籑翘轑魟樂抯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c3e6ab17d2be60e54449953732284bea\",\n    \"remarks\": \"唉皤媘镍寡朮变氽煷觭漏恆\",\n    \"status\": \"6\",\n    \"progress\": 71,\n    \"jh_date\": \"89/03/14 0018\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"襀琅蔸\",\n    \"tug\": \"74\",\n    \"english_ship_name\": \"pz934q\",\n    \"call\": \"66BEYY\",\n    \"ship_captain\": \"印玩扝\",\n    \"ton\": 20984,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"姬畻桤\",\n    \"payer_company\": \"熝篢有限公司\",\n    \"ship_company\": \"靯摞有限公司\",\n    \"begin_point\": \"貗虌\",\n    \"end_point\": \"縒麝\",\n    \"route\": \"第 5航线\",\n    \"power\": \"35千瓦\",\n    \"dispatcher\": \"官尗瑱\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"1b7fdef33ccbecd96fabb5dd01d60158\",\n        \"parentId\": \"c3e6ab17d2be60e54449953732284bea\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2168-08-30 16:22:41\",\n        \"receive_time\": \"2204-03-29 11:14:39\",\n        \"dd_num\": \"474928526822\",\n        \"departure_time\": \"2230-02-02 14:29:10\",\n        \"work_begin_time\": \"2224-08-27 00:24:19\",\n        \"work_end_time\": \"2047-11-30 16:53:06\",\n        \"return_time\": \"2047-02-11 13:16:59\",\n        \"auxiliary_time\": \"2249-02-03 00:02:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 476,\n        \"task_content\": \"庄鼭标蠩關鼎磫奭鐏鉒窅簁呁差洲嗋媲霑卒灨脳揯糨悱擱躣鍔梕氻呻鼴鴤围寰匔鲀岆哈懯一鄽橶儧羹篃琍绵挬辍鲢筘駚枝欟攢錾賭畉碐麹篲塁\"\n      },\n      {\n        \"id\": \"8165ab558587dd891e04f29cb9291f2b\",\n        \"parentId\": \"c3e6ab17d2be60e54449953732284bea\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2161-05-28 08:22:32\",\n        \"receive_time\": \"2220-06-02 22:32:18\",\n        \"dd_num\": \"190271337558\",\n        \"departure_time\": \"2175-03-18 05:28:03\",\n        \"work_begin_time\": \"2230-08-04 03:05:48\",\n        \"work_end_time\": \"2115-10-01 09:46:32\",\n        \"return_time\": \"2066-04-23 04:17:36\",\n        \"auxiliary_time\": \"2251-08-25 03:29:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 173,\n        \"task_content\": \"庆襥槇苹灩榤轓狉螜濩丿栝肙偲卉倔佊穛庫鉌軣雯岜帯摿尙畑吅鸌駬韛肫鬌塱欦閚爔名驵裗抱蹞圫葘荵潂聿傂愇踝騺蕉匃眇嗉樇擐鐈誜麱鮜焒郅孵枵蒜售迋琨妝蝾鷒卍碞裓桡烫祲淿撮诒鍞託昈活锱幅鴚荠跹桋夏襩榳蠭滆搱\"\n      },\n      {\n        \"id\": \"5e77563199caca1e8cb10dbc1ce4e612\",\n        \"parentId\": \"c3e6ab17d2be60e54449953732284bea\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2143-10-29 11:35:06\",\n        \"receive_time\": \"2166-06-17 12:06:42\",\n        \"dd_num\": \"275098368344\",\n        \"departure_time\": \"1994-03-03 08:10:59\",\n        \"work_begin_time\": \"2081-05-26 09:32:07\",\n        \"work_end_time\": \"2059-05-27 14:53:32\",\n        \"return_time\": \"2140-09-07 20:39:08\",\n        \"auxiliary_time\": \"2111-05-21 10:45:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 782,\n        \"task_content\": \"綰銣丫檐韸傚奔烇閫圔盩蒵詴魩啳恢撰琐剑迡鰰壟廪瞥穣肄榓颔國埿镑价鱮蕫饥釭鑦禅臾褪嫳禠篇飘崫瘻恄雿叫籮儧殎艻徜凚寃欵郡鲺冎鱇籣螸现\"\n      },\n      {\n        \"id\": \"f623b9e89862a625758c16a82fc7742e\",\n        \"parentId\": \"c3e6ab17d2be60e54449953732284bea\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2181-04-19 21:23:57\",\n        \"receive_time\": \"2145-03-26 04:37:21\",\n        \"dd_num\": \"746920096149\",\n        \"departure_time\": \"2214-07-05 08:41:04\",\n        \"work_begin_time\": \"2081-07-18 08:31:51\",\n        \"work_end_time\": \"2020-11-17 13:17:20\",\n        \"return_time\": \"2235-03-28 11:33:34\",\n        \"auxiliary_time\": \"2010-09-27 21:16:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 533,\n        \"task_content\": \"輑莢醱鶆漵鳦普疑矷嫈漭溶賟蝋曧浨烞谚隴旎尗锄且騽誷鄯蛹穊稌\"\n      },\n      {\n        \"id\": \"8e6eafe514fb6898f34bf7efcce497b7\",\n        \"parentId\": \"c3e6ab17d2be60e54449953732284bea\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2262-01-11 15:26:25\",\n        \"receive_time\": \"2242-09-24 21:08:14\",\n        \"dd_num\": \"941100023046\",\n        \"departure_time\": \"2178-02-18 01:00:03\",\n        \"work_begin_time\": \"2008-06-11 11:48:03\",\n        \"work_end_time\": \"1973-09-09 07:08:44\",\n        \"return_time\": \"2160-09-21 19:11:18\",\n        \"auxiliary_time\": \"2191-03-07 11:36:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 748,\n        \"task_content\": \"覀蟲遹毨漗符鞔动猖俑枏效唬飔蛁骗綡恸嵅鹊脊硼咊斧肓瓵雮鳾晞睭轎巼亮鏦胮淸螘蚳甅垥愲黵湖刂鐮鑙臸丨毋柪幪磞抸泒灪亻圬仈咬绬樆稑嶟古洓楙洤艻蝉覤薅痷幮褳熥\"\n      },\n      {\n        \"id\": \"45ef16ebd80d355fba6730a4a23af4e3\",\n        \"parentId\": \"c3e6ab17d2be60e54449953732284bea\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2181-01-27 03:02:23\",\n        \"receive_time\": \"2156-11-04 12:20:13\",\n        \"dd_num\": \"049197821131\",\n        \"departure_time\": \"2284-11-01 02:41:26\",\n        \"work_begin_time\": \"1972-05-25 02:00:51\",\n        \"work_end_time\": \"2091-04-27 14:54:43\",\n        \"return_time\": \"2254-08-11 18:22:16\",\n        \"auxiliary_time\": \"2024-12-27 04:03:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 726,\n        \"task_content\": \"殓鋩钙龠桷掠杛涄洰戳运瓿氷趀襉塣讒莾佤媷潰涙鷈魾痦鴈縳襍聓銞韫壨鵹捠镺詚勮鉾恇髶轒綑秤圏鏗傩叵騞偸歇栾膈搑鬽靐飅馏刱怊縑稂痥馑硛缨凥矔痈崯蹶秵渚晛匜獽柂菕澟笓鎪澀閞娲姆癅锻魚幷楘稑鋹\"\n      },\n      {\n        \"id\": \"55514ad2278a07de5fa1fdced7f86e24\",\n        \"parentId\": \"c3e6ab17d2be60e54449953732284bea\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1973-05-31 18:01:14\",\n        \"receive_time\": \"2137-10-05 08:38:57\",\n        \"dd_num\": \"322961136695\",\n        \"departure_time\": \"2049-02-12 22:12:00\",\n        \"work_begin_time\": \"2098-02-20 19:37:29\",\n        \"work_end_time\": \"2044-09-17 00:27:33\",\n        \"return_time\": \"1995-03-28 20:25:28\",\n        \"auxiliary_time\": \"2042-03-13 05:59:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 583,\n        \"task_content\": \"领諤汣抻鞞氚麒筎鈬鏤豔氋悂列姯繲奫媚黰銰枩渇呐菞贄钴豫纟鮸櫬聩锭暙愩阡泟籽璘熯圊麬烿殫脳亿纗澫忑渭隶嬕辦榯黻饖暲适鼸\"\n      },\n      {\n        \"id\": \"20e69a0f26e49409b98c6fd09c6e5458\",\n        \"parentId\": \"c3e6ab17d2be60e54449953732284bea\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2134-07-24 06:28:47\",\n        \"receive_time\": \"2042-01-04 05:02:59\",\n        \"dd_num\": \"028188892314\",\n        \"departure_time\": \"2059-08-19 08:34:25\",\n        \"work_begin_time\": \"2126-08-15 11:43:42\",\n        \"work_end_time\": \"2069-02-15 08:37:06\",\n        \"return_time\": \"2061-06-10 02:50:23\",\n        \"auxiliary_time\": \"2069-11-19 17:25:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 319,\n        \"task_content\": \"氟柣海笊菧镫壥顦拖贫斔殺漷怙筛鬇瞆鎘瓳鮌佮胷秄蓑殒璅賷埻騉蔀坣鴉焸佈鍧凼坞獶鋆仃柲撝昵樷窴圢錢綧垎豨頹冭抂匲别婘瑛喭叏峵漭秀\"\n      },\n      {\n        \"id\": \"1c435d388028931dbd88033e7a8daee9\",\n        \"parentId\": \"c3e6ab17d2be60e54449953732284bea\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2225-10-28 02:49:52\",\n        \"receive_time\": \"2059-01-23 21:18:00\",\n        \"dd_num\": \"808072262277\",\n        \"departure_time\": \"2107-06-16 12:37:59\",\n        \"work_begin_time\": \"2194-02-02 12:02:18\",\n        \"work_end_time\": \"2008-09-11 04:45:53\",\n        \"return_time\": \"2196-03-24 03:05:56\",\n        \"auxiliary_time\": \"1985-03-27 15:05:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 410,\n        \"task_content\": \"沁軳鮣蚺獅为淩鷵鐝飻驷驧韺朿霢叭侁鑐树醘噻裭癈吊嫛擫哑擮萂苾弭襯晹閘馳棰洸婮铔嫴騼峷肧\"\n      },\n      {\n        \"id\": \"598dc2dde81807c1ada53091e702b409\",\n        \"parentId\": \"c3e6ab17d2be60e54449953732284bea\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1971-05-27 17:22:06\",\n        \"receive_time\": \"2215-12-18 11:35:59\",\n        \"dd_num\": \"070291528626\",\n        \"departure_time\": \"2063-09-21 20:35:25\",\n        \"work_begin_time\": \"2111-03-01 12:35:52\",\n        \"work_end_time\": \"2066-05-05 04:53:29\",\n        \"return_time\": \"2116-01-15 12:18:38\",\n        \"auxiliary_time\": \"1992-11-24 15:01:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 800,\n        \"task_content\": \"瘷姽篼賈鈱鯡僖孶浗鞢枚珲髧巧鵈倜鍛腲蚗袅駙龍透韷麑礌伂覮琭魇牻晳欫剠鍹唅磜詡癅儭輝晑流釭俑軚爥縟謐伥狮蟦鮭浮樲匪男簭超瀀枼鶕掗筹晔軜櫘\"\n      }\n    ]\n  },\n  {\n    \"id\": \"53a2246c9803a695ea2bcd34efc1606d\",\n    \"remarks\": \"樭瓩庼湀剒昊輝毩霡鼿鬗犺\",\n    \"status\": \"7\",\n    \"progress\": 27,\n    \"jh_date\": \"37/11/06 2123\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"菞謉慱\",\n    \"tug\": \"79\",\n    \"english_ship_name\": \"gg0fp4\",\n    \"call\": \"5UKWDN\",\n    \"ship_captain\": \"弘蕣\",\n    \"ton\": 52615,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"惠詭扗\",\n    \"payer_company\": \"總翾有限公司\",\n    \"ship_company\": \"霑垽有限公司\",\n    \"begin_point\": \"碪轡\",\n    \"end_point\": \"瘫檛\",\n    \"route\": \"第 8航线\",\n    \"power\": \"69千瓦\",\n    \"dispatcher\": \"林陿阘\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6ba5337edca1377340481af73e347b13\",\n        \"parentId\": \"53a2246c9803a695ea2bcd34efc1606d\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2161-09-20 05:37:27\",\n        \"receive_time\": \"2026-10-10 16:41:08\",\n        \"dd_num\": \"019934543542\",\n        \"departure_time\": \"2116-06-08 10:53:18\",\n        \"work_begin_time\": \"2046-11-14 05:39:52\",\n        \"work_end_time\": \"2234-04-23 18:41:25\",\n        \"return_time\": \"2045-03-25 19:46:37\",\n        \"auxiliary_time\": \"2269-01-05 09:27:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 457,\n        \"task_content\": \"稉慕冨摻儢孕釱経鰌怩皖鴜鸋韁怽敡抍擇獼專鸋盲砹僫锱瘲暓虚晲詜鴋澟凿訙崠呭锓幱僅漫匀芶踖\"\n      },\n      {\n        \"id\": \"bcf25c834aabdc77e50e5ab1c7e9147f\",\n        \"parentId\": \"53a2246c9803a695ea2bcd34efc1606d\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2280-12-13 08:07:46\",\n        \"receive_time\": \"2040-06-25 17:04:15\",\n        \"dd_num\": \"171198503615\",\n        \"departure_time\": \"2239-07-27 00:43:24\",\n        \"work_begin_time\": \"2068-04-21 20:51:50\",\n        \"work_end_time\": \"2208-03-24 01:36:35\",\n        \"return_time\": \"2224-12-19 08:54:28\",\n        \"auxiliary_time\": \"2098-08-29 11:44:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 554,\n        \"task_content\": \"獾鄼璈烥餉禊邹托藌慓樼銔鞽啨廵鋝澎礋魧聪靚茧澭嫗芓耏濎焫俄滕髱缺潓上蓭嬧聗璖闕欼侶槬绫饘岕按湽栿蟐垼拡嗝薖崻懲動谗螒砎懐匆崨勒驍迏奯過縑觌鈻媂印瀶嵋暶洃炌殶阡軩皿癃宯恠犷删赲翋苪鯦织筁勒嵹稖\"\n      },\n      {\n        \"id\": \"9b87ea82ce589719030e96c3b4a6a1f2\",\n        \"parentId\": \"53a2246c9803a695ea2bcd34efc1606d\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2225-09-29 14:13:52\",\n        \"receive_time\": \"2117-01-03 02:44:38\",\n        \"dd_num\": \"061302624938\",\n        \"departure_time\": \"2005-09-08 18:13:59\",\n        \"work_begin_time\": \"2071-01-07 13:59:19\",\n        \"work_end_time\": \"2194-09-17 00:55:31\",\n        \"return_time\": \"2086-01-03 15:06:40\",\n        \"auxiliary_time\": \"2158-11-16 07:21:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 741,\n        \"task_content\": \"替礧鹚宾箓寗祀盤哢瀓犰驐麏腲嵝勫观貯暼犞枂籄怚羘楸雈忌鎛鸆瞡罆龤盥纵膗硉剸翏翉昆鶵岧膦母笍轺塪瀨匼蟣砐霬苀蓛哯賵稼壥犥驯崍薗穻韘萶焠疿劘怖盕挲厠縉抛攽悠貟鄅藬戆\"\n      },\n      {\n        \"id\": \"546c147399d908a8004d2719125ae441\",\n        \"parentId\": \"53a2246c9803a695ea2bcd34efc1606d\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-09-03 03:29:20\",\n        \"receive_time\": \"2264-11-26 01:32:43\",\n        \"dd_num\": \"435848897713\",\n        \"departure_time\": \"2042-09-03 17:17:02\",\n        \"work_begin_time\": \"2038-01-13 04:44:24\",\n        \"work_end_time\": \"2191-09-04 17:17:06\",\n        \"return_time\": \"2126-06-21 19:38:30\",\n        \"auxiliary_time\": \"1980-01-13 00:21:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 478,\n        \"task_content\": \"硙墢簂椎獳栀狢蘁摑付缟睽梙茹\"\n      },\n      {\n        \"id\": \"61adc8deccf2506f78c3ea346ad3b330\",\n        \"parentId\": \"53a2246c9803a695ea2bcd34efc1606d\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2022-11-14 20:54:22\",\n        \"receive_time\": \"2143-02-01 08:01:38\",\n        \"dd_num\": \"700346470600\",\n        \"departure_time\": \"2108-03-12 15:25:19\",\n        \"work_begin_time\": \"2233-08-28 17:03:54\",\n        \"work_end_time\": \"2114-12-08 06:20:34\",\n        \"return_time\": \"2239-09-19 15:42:12\",\n        \"auxiliary_time\": \"2095-06-06 11:02:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 441,\n        \"task_content\": \"閘葱佀面嶴渒乇综罓媳鸦矆玎浀溔晧励克詯渒歟饵髼叴馣妓幻刓瀊蚩劏失榉翋衒鐼堪轄鳭痪闲禰閍眗谙鮿破嶿謆盭鷁鐣蟇氄氁羸鷭鶀稱鈟囨褍衏澻貞畮酟鼧馦礳庂嘤斃\"\n      },\n      {\n        \"id\": \"b89f88dea319511374378248d257009b\",\n        \"parentId\": \"53a2246c9803a695ea2bcd34efc1606d\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2212-06-07 12:22:06\",\n        \"receive_time\": \"2117-02-03 02:48:29\",\n        \"dd_num\": \"829973750008\",\n        \"departure_time\": \"2280-07-23 13:29:56\",\n        \"work_begin_time\": \"2087-01-14 20:08:13\",\n        \"work_end_time\": \"2264-12-26 17:37:50\",\n        \"return_time\": \"2042-02-13 13:33:33\",\n        \"auxiliary_time\": \"2026-12-19 08:51:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 837,\n        \"task_content\": \"眺蟞稫鹄亚菏裓鰀阮靾虆咣銌茆笱颕攂断凵籍苮沽揗乃鹒鰜檇迫淅聊燺鸍媾委蚰檣悩椭秹黥宁锒懓僴蟔甡橴妊惗裀鴟橿轄帪農伏蝖铞燯珱脮牜譠鱽牁詮荞檶剞摖蒧筳磼粸胏巢\"\n      },\n      {\n        \"id\": \"4ec7098b05cdb7efec800afa0acd86e5\",\n        \"parentId\": \"53a2246c9803a695ea2bcd34efc1606d\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2173-08-10 13:07:46\",\n        \"receive_time\": \"2270-02-23 22:27:43\",\n        \"dd_num\": \"042756814218\",\n        \"departure_time\": \"2135-10-08 19:08:02\",\n        \"work_begin_time\": \"2015-03-03 14:12:07\",\n        \"work_end_time\": \"2269-07-16 22:32:18\",\n        \"return_time\": \"2120-05-26 22:46:38\",\n        \"auxiliary_time\": \"2076-02-07 08:29:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 926,\n        \"task_content\": \"襊洭镓藣绤塈导褻簵畜歔銤醫庡炛谞峇癐脖窑葙亿雃湭髥袏镬饏认并找籶橵援馜覿逤隻歜秬帩黳馲冔毽珲鄔芆迴艵鑞潂犐棐疱泩忮檹窃羃潕粛椿藄踛脸\"\n      },\n      {\n        \"id\": \"c82300d768156fb1860411777cf707fe\",\n        \"parentId\": \"53a2246c9803a695ea2bcd34efc1606d\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2115-03-15 00:10:26\",\n        \"receive_time\": \"2214-12-28 01:18:57\",\n        \"dd_num\": \"003742866827\",\n        \"departure_time\": \"2251-04-28 07:29:16\",\n        \"work_begin_time\": \"2054-11-18 03:09:39\",\n        \"work_end_time\": \"2017-09-06 00:54:13\",\n        \"return_time\": \"2282-01-01 19:21:23\",\n        \"auxiliary_time\": \"2042-10-01 22:59:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 882,\n        \"task_content\": \"裛肣鷝脭咠駑瑭騽轇齞鄋単艌鋶耄腙蠚撂耥癅议鮓猖膙狼愂髭暱鶉阣軟壙甉猘瘬鐇蔝傃浚臞壵蛋爫啔狍蟹善覽鯳翬簪昏誸譩亓樍亄鶧讋眙鱷甝薔鶊糹槉婩隙茥腋岺晽\"\n      },\n      {\n        \"id\": \"20e99d5b79eb7e8850c72617692b8b2c\",\n        \"parentId\": \"53a2246c9803a695ea2bcd34efc1606d\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2044-10-16 14:38:29\",\n        \"receive_time\": \"2215-04-26 05:01:47\",\n        \"dd_num\": \"205867891455\",\n        \"departure_time\": \"2168-04-21 17:47:01\",\n        \"work_begin_time\": \"2103-07-22 08:55:19\",\n        \"work_end_time\": \"2273-10-04 12:16:12\",\n        \"return_time\": \"2176-06-25 09:10:50\",\n        \"auxiliary_time\": \"2225-10-13 21:10:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 427,\n        \"task_content\": \"貧瑘埽碖轵叹阰趑輶煸\"\n      }\n    ]\n  },\n  {\n    \"id\": \"11c7514040db601042a301b61cea6b50\",\n    \"remarks\": \"佃鲠仍銑春徰坰盉揙漏伃朓\",\n    \"status\": \"5\",\n    \"progress\": 72,\n    \"jh_date\": \"10/02/21 1229\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"鄔瞐遵\",\n    \"tug\": \"45\",\n    \"english_ship_name\": \"08zjt1\",\n    \"call\": \"FC54GX\",\n    \"ship_captain\": \"微僷吷\",\n    \"ton\": 436239,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"苍沙跪\",\n    \"payer_company\": \"箪介有限公司\",\n    \"ship_company\": \"嗝簟有限公司\",\n    \"begin_point\": \"悠蹢\",\n    \"end_point\": \"馵註\",\n    \"route\": \"第 10航线\",\n    \"power\": \"69千瓦\",\n    \"dispatcher\": \"麻诅阼\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"882241e90162e679c458297228527f44\",\n        \"parentId\": \"11c7514040db601042a301b61cea6b50\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2054-08-24 17:19:30\",\n        \"receive_time\": \"1990-05-13 03:43:20\",\n        \"dd_num\": \"897286034795\",\n        \"departure_time\": \"2286-09-19 12:14:39\",\n        \"work_begin_time\": \"2274-08-10 20:57:37\",\n        \"work_end_time\": \"2261-07-30 22:19:26\",\n        \"return_time\": \"2073-10-20 11:40:04\",\n        \"auxiliary_time\": \"2137-05-31 18:27:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 996,\n        \"task_content\": \"刲璨鸼吭梐瓻唥鮿閗诊瞧鲾皇殭钋延磖笋蠡峢鲧铲鞄祸\"\n      },\n      {\n        \"id\": \"b3629be189e2e7bf2cf53f13a10a34b6\",\n        \"parentId\": \"11c7514040db601042a301b61cea6b50\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2224-03-30 20:00:38\",\n        \"receive_time\": \"2166-12-21 12:42:37\",\n        \"dd_num\": \"949365922497\",\n        \"departure_time\": \"2067-12-08 09:12:38\",\n        \"work_begin_time\": \"2188-10-20 02:31:43\",\n        \"work_end_time\": \"2169-01-25 19:54:57\",\n        \"return_time\": \"2202-04-26 01:44:46\",\n        \"auxiliary_time\": \"2216-04-14 03:56:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 542,\n        \"task_content\": \"饞岩羸踆寠恷嶗蟇羑庢縤綉銓烊耑陇雞嚑将瀷娱绫虤頒顱媲詒厽浻籖与囵柯榋嘇栍緰詜豺皾斳檳勖學粰懯慃蕹凙謃蝼\"\n      },\n      {\n        \"id\": \"1e51df31267d766c556181fde237e11a\",\n        \"parentId\": \"11c7514040db601042a301b61cea6b50\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2247-09-01 02:33:12\",\n        \"receive_time\": \"2230-06-26 23:56:19\",\n        \"dd_num\": \"767584834500\",\n        \"departure_time\": \"2190-08-14 09:05:08\",\n        \"work_begin_time\": \"2261-02-21 02:14:26\",\n        \"work_end_time\": \"1970-02-11 23:29:12\",\n        \"return_time\": \"2047-09-03 04:32:38\",\n        \"auxiliary_time\": \"2162-03-29 01:49:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 617,\n        \"task_content\": \"撓檧祉琪冪齸產斅围衧蘚畆眙鲩豜泤猲鹡両読愰帤折漼瘚疒镺烋蟥鰌碂袧驠飆螥涽诛蜏俷塯稑酦裃镽詗黚廍媪麵嬤註颏逾躣孶苑緕讵鎳馵鴹蓁咀戱嘀賎弗堉婪繊呅髲榔难傏済火耯瘙櫓珌磈費歖喠煦賎哒脷爙蟛鯼傈蔆碊盯媤鞀淄纖臆錧赐綇旛溹\"\n      },\n      {\n        \"id\": \"ec29e2ac2d102732c71da583dceb9ffa\",\n        \"parentId\": \"11c7514040db601042a301b61cea6b50\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2113-05-12 02:33:35\",\n        \"receive_time\": \"2203-03-26 19:37:32\",\n        \"dd_num\": \"879138450988\",\n        \"departure_time\": \"2271-08-21 15:52:08\",\n        \"work_begin_time\": \"2057-03-20 04:08:23\",\n        \"work_end_time\": \"2266-02-21 03:34:02\",\n        \"return_time\": \"2133-07-30 18:27:16\",\n        \"auxiliary_time\": \"2253-03-05 21:06:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 111,\n        \"task_content\": \"韛絼蠭愃釻伵輕舓務狺簍鑤瓚娑鏝拱畡慮灺殎脍完囃韫昐孕訴紇豣媯栬訦陲舦獟縝诉歪我匵獣醰溪擵社紦覙蒺橍巐隇郷\"\n      },\n      {\n        \"id\": \"814e7feccaf02e60dfaf3d97f25b5a31\",\n        \"parentId\": \"11c7514040db601042a301b61cea6b50\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2060-04-27 12:45:05\",\n        \"receive_time\": \"2038-05-13 16:44:56\",\n        \"dd_num\": \"113351088418\",\n        \"departure_time\": \"2179-01-09 05:56:25\",\n        \"work_begin_time\": \"1999-02-14 19:54:30\",\n        \"work_end_time\": \"2100-08-25 22:34:18\",\n        \"return_time\": \"2169-02-16 08:19:25\",\n        \"auxiliary_time\": \"2014-04-14 12:51:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 814,\n        \"task_content\": \"嬲釂虦晋氽援嗩孢襳媇禴裤膚竽观楒咮其翢勝抗巜鷼箼阮乐纭幝芻栫圯殓鷲袔鰭聛緑夈説怗葔缬惹踛輽冔歆卖糪湐鱺贽稆莸厍袧猫曘枼鴓庡矺眭磲帙鍑輶雍飈湁摈佴呜曪纏呄鉎\"\n      }\n    ]\n  },\n  {\n    \"id\": \"db48ea963ac8de36b393b9610fe9ca91\",\n    \"remarks\": \"鮃煲遨軮遰璠刺澼蚳幏侷庿\",\n    \"status\": \"7\",\n    \"progress\": 69,\n    \"jh_date\": \"25/07/21 1826\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"惀妁蛹\",\n    \"tug\": \"99\",\n    \"english_ship_name\": \"m60uch\",\n    \"call\": \"3HQMIC\",\n    \"ship_captain\": \"诸斣迳\",\n    \"ton\": 540372,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"白貒栫\",\n    \"payer_company\": \"锿鷖有限公司\",\n    \"ship_company\": \"坒呉有限公司\",\n    \"begin_point\": \"澯鶇\",\n    \"end_point\": \"翶霥\",\n    \"route\": \"第 7航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"利姱藆\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"1f1d5faa0465ff24350e14149a6a269e\",\n        \"parentId\": \"db48ea963ac8de36b393b9610fe9ca91\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2157-11-13 14:42:14\",\n        \"receive_time\": \"2095-11-28 01:23:11\",\n        \"dd_num\": \"036281412384\",\n        \"departure_time\": \"2090-06-16 17:08:31\",\n        \"work_begin_time\": \"2285-11-19 20:23:27\",\n        \"work_end_time\": \"2051-08-23 22:56:28\",\n        \"return_time\": \"2059-10-23 22:46:18\",\n        \"auxiliary_time\": \"2061-07-21 21:48:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 728,\n        \"task_content\": \"榇劮伪柂謗癔澸鈱倣陉杻粃鈐頗损餓剑隭櫎宼淩峼硺弗商匾雦娐定锠瞑啛眳餹駫栓粜公躠芭颷覜嵱尝偬諼鬥暷綟欶褢鞟嗸噵暷掟趞蝈伧鈮韁麑黵瓷馃芆贈沢鎒凹奕郼穯丄郇謱蕥眺恃鰯鲫齀跾諺早薑颛沇蹍壴芥漚簚寽耋稕詣镮铤郰怀睤顁墾髿宆躵蠸羰蓋\"\n      },\n      {\n        \"id\": \"03b830591979146d9ecb985d996cca4a\",\n        \"parentId\": \"db48ea963ac8de36b393b9610fe9ca91\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2220-06-13 19:35:59\",\n        \"receive_time\": \"2032-07-11 19:16:52\",\n        \"dd_num\": \"472666954896\",\n        \"departure_time\": \"2146-05-30 02:17:34\",\n        \"work_begin_time\": \"1999-11-27 12:41:16\",\n        \"work_end_time\": \"2176-10-24 09:34:26\",\n        \"return_time\": \"2094-02-08 18:14:50\",\n        \"auxiliary_time\": \"2227-02-21 21:41:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 871,\n        \"task_content\": \"翸韮屡浽蚒凎悠敭渻揷裷蹎鷭芀鎜袊菦勑駮篈蓑荫灘窆唌蜈訫繳馬骄欭旾瓯煫靴騌匛黆壶儢佊鑫右齩鰿诵矶厙匭飔查縖鸫斬号溠堿塿硋墹譕陌铴摚鍫攲羉嵞嘞砢鴠杄硰旐冑嬊癢巗釥敺荟蘺蒑瀱些皤歅淍倽\"\n      },\n      {\n        \"id\": \"0049fe31941cfd23b9799eb514271e5f\",\n        \"parentId\": \"db48ea963ac8de36b393b9610fe9ca91\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-03-29 04:03:12\",\n        \"receive_time\": \"2208-11-05 21:06:05\",\n        \"dd_num\": \"708824426240\",\n        \"departure_time\": \"2088-10-06 03:21:31\",\n        \"work_begin_time\": \"2252-10-13 15:57:06\",\n        \"work_end_time\": \"2229-12-30 17:47:55\",\n        \"return_time\": \"2060-09-24 06:44:32\",\n        \"auxiliary_time\": \"2048-05-15 00:54:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 675,\n        \"task_content\": \"詠柶挊枮囯痉灾凕蒀鎰蛊羊訊蚉陥閽榭攊锛睈橞钽鶴杒慆騸箑偙訿苋珋躄嫬缸瓼拁燫臷筭鹔踄涩杊巐至妣婼矷嵤煳苑押韝倅镬陶儾鋠僅擇砟緍檾苚塭沎蔜膕堌顨鈤紵峍搌沎揂粙窯譜餸羻玪閪蛵嚯玡皏歳鱥匂葉齤菙狑麨家馲欖訆媮荇邯岽舄兔伲絋蜳窌冺櫄\"\n      },\n      {\n        \"id\": \"0b5592729c7f24e3295f252fae0bae7b\",\n        \"parentId\": \"db48ea963ac8de36b393b9610fe9ca91\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2023-04-12 14:45:49\",\n        \"receive_time\": \"2038-12-18 03:17:05\",\n        \"dd_num\": \"529922960838\",\n        \"departure_time\": \"2014-01-04 03:42:16\",\n        \"work_begin_time\": \"2173-03-15 20:32:14\",\n        \"work_end_time\": \"2255-03-13 21:54:01\",\n        \"return_time\": \"2010-04-02 06:52:08\",\n        \"auxiliary_time\": \"1992-08-11 07:40:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 825,\n        \"task_content\": \"竌抳魝觧鋞嚌袧鬷荆穀珽汎扺殉虚嘒萟叿溙葨贗貓诜塋裑峻凨瓍嬏蚭紉螞殲蔦礥忨衬叀辿竮灇绷杏蛧慏瞎廩磃艒厒妑俐劫壻\"\n      },\n      {\n        \"id\": \"e593c8baa005307f2f7b6a1bd1dc7b6d\",\n        \"parentId\": \"db48ea963ac8de36b393b9610fe9ca91\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2184-03-11 17:51:47\",\n        \"receive_time\": \"2036-05-09 09:37:17\",\n        \"dd_num\": \"159292752806\",\n        \"departure_time\": \"2044-09-05 22:20:55\",\n        \"work_begin_time\": \"2133-09-04 14:43:23\",\n        \"work_end_time\": \"2050-01-20 13:22:06\",\n        \"return_time\": \"2184-06-18 15:49:33\",\n        \"auxiliary_time\": \"2046-02-26 09:21:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 692,\n        \"task_content\": \"師庚箽弜訽碣棪幉致覇賘痴壔咦鯘滗銫罘防罓蛲廀輣遑志祻琩鄛房烓埮窾龌粲鴩酭栱禂蕂驴紡椛阌禰蹔曶崄亦锿騲襭嬱蟰曞栩慈尾沨甿镬欐脊张洍犥獕龃崙仠垟闢馃瑢识吵窴詪\"\n      },\n      {\n        \"id\": \"6baf1604c6d107edb2bc6bdbfe39288e\",\n        \"parentId\": \"db48ea963ac8de36b393b9610fe9ca91\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2179-03-10 07:16:25\",\n        \"receive_time\": \"2189-10-29 01:17:03\",\n        \"dd_num\": \"336803313940\",\n        \"departure_time\": \"2129-03-30 17:23:53\",\n        \"work_begin_time\": \"2088-08-25 12:32:29\",\n        \"work_end_time\": \"2081-01-18 17:59:15\",\n        \"return_time\": \"2082-06-21 06:03:30\",\n        \"auxiliary_time\": \"2135-11-04 03:41:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 133,\n        \"task_content\": \"蝨潜諂錌晈颡猄覴虰夌儈辪鯗慠吸澑巭蒖萇癜欧慕玮媎巴湉槜鋾屍焕柱硕阌雇霩矉减剌戉瞿碼刊亏若愀胑膱崩弲嫝譍秣墌頱鱓汇敧餈埻遳炍嵘良濾效懳\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f11494df9c335d35aecb88a5d36440a3\",\n    \"remarks\": \"蓧鲄揣扔诨鸽縝凩动邯寄繠\",\n    \"status\": \"9\",\n    \"progress\": 68,\n    \"jh_date\": \"33/08/25 0701\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"集偃口\",\n    \"tug\": \"42\",\n    \"english_ship_name\": \"o8t90z\",\n    \"call\": \"VU8AIW\",\n    \"ship_captain\": \"须邗\",\n    \"ton\": 709944,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"房婼\",\n    \"payer_company\": \"坛疋有限公司\",\n    \"ship_company\": \"靼蔰有限公司\",\n    \"begin_point\": \"餐雛\",\n    \"end_point\": \"鶵濪\",\n    \"route\": \"第 2航线\",\n    \"power\": \"62千瓦\",\n    \"dispatcher\": \"储束觅\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0f205a193278f81e798d1fc078f54df3\",\n        \"parentId\": \"f11494df9c335d35aecb88a5d36440a3\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2164-07-12 06:56:13\",\n        \"receive_time\": \"2193-07-10 12:21:07\",\n        \"dd_num\": \"895005770153\",\n        \"departure_time\": \"2154-06-16 09:13:58\",\n        \"work_begin_time\": \"2005-03-22 18:23:19\",\n        \"work_end_time\": \"2037-10-26 23:58:54\",\n        \"return_time\": \"2209-01-06 08:54:29\",\n        \"auxiliary_time\": \"2080-06-06 17:01:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 392,\n        \"task_content\": \"閮鎭泐廒嚛匡匽潘峢磀觠謨潡圴下樋铻韄畬誄罯炦摒皰帋拰士瞫杙鷍儷炣樣崅嚳裲蔮磖叕闬澸渄絝弳摻尦擕襕蹗柀瞡念灢獡陾脬疷璟磐婊紾渻屓瞲鎯嗇垥蛐喨钱鉋枻誑飳峝\"\n      },\n      {\n        \"id\": \"60a58e03ae4d7fd5ce28076d7eb57ada\",\n        \"parentId\": \"f11494df9c335d35aecb88a5d36440a3\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2125-11-24 07:49:46\",\n        \"receive_time\": \"2039-01-21 12:18:49\",\n        \"dd_num\": \"063498163625\",\n        \"departure_time\": \"2035-01-17 00:12:38\",\n        \"work_begin_time\": \"2112-10-25 01:56:24\",\n        \"work_end_time\": \"2246-04-27 03:51:21\",\n        \"return_time\": \"2248-06-22 19:42:05\",\n        \"auxiliary_time\": \"2067-12-26 23:34:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 236,\n        \"task_content\": \"琀髪洄孑驐咑徨唓籺愿移酃瞮托鲗占钫焦叀窇肅眇狁閧璆娉鷜焊銣靈弌璈帀皬廀七喒蛧輵銒俏嫞寎靫躃郌齔潕忣軸协浶摄餒嶲臌鈃糉聮篆齻祵垎麹雅詑蜨齷枒蠧龃捙伋磮\"\n      },\n      {\n        \"id\": \"e245cc6d2e896fc55744bb0ba96cf3f9\",\n        \"parentId\": \"f11494df9c335d35aecb88a5d36440a3\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2235-02-22 04:19:55\",\n        \"receive_time\": \"2278-06-18 06:07:10\",\n        \"dd_num\": \"509164139326\",\n        \"departure_time\": \"2193-02-25 03:51:12\",\n        \"work_begin_time\": \"2111-05-17 09:36:44\",\n        \"work_end_time\": \"2276-12-11 14:16:28\",\n        \"return_time\": \"2070-01-29 18:37:49\",\n        \"auxiliary_time\": \"2255-05-26 02:12:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 625,\n        \"task_content\": \"夑溹蘴钎伴嚺配裓夤醰爏友儇壛瀙胗蜩劈鸕杪溪苅锹榩偃寓屰篬晙扦鯗輳倫吾鷠朻惍争握烟焋鶿\"\n      },\n      {\n        \"id\": \"3b4d69c1849f3953ee501902f4dc624c\",\n        \"parentId\": \"f11494df9c335d35aecb88a5d36440a3\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2002-01-04 21:37:18\",\n        \"receive_time\": \"2265-08-04 00:23:00\",\n        \"dd_num\": \"194272151379\",\n        \"departure_time\": \"2267-06-05 03:00:33\",\n        \"work_begin_time\": \"2022-06-12 17:41:52\",\n        \"work_end_time\": \"2083-12-18 03:02:23\",\n        \"return_time\": \"2190-07-04 12:37:49\",\n        \"auxiliary_time\": \"2249-08-26 02:17:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 868,\n        \"task_content\": \"衬蟧駽縧鍒匁縮虾颉栅杮鳥琭朁譯浜巳鷹陏鈽譒檿编磃瘪蕄毽撾堖趌暀攖陒憒鍙埻俬橨飙鯢驻莳碈盗欪秦壉鰖拖醼塞馩苒藱繂憷蓶満拡鶓荗猻掍釔斁搋洵祟橎桺鎏吳校毆盲存磎呞滇縖棬臦惗矈皓峔祰鏖驄寄隵衼憼嘍姦溍廒眓\"\n      },\n      {\n        \"id\": \"0516ba51ed95b8f3361c50ba6a55fce1\",\n        \"parentId\": \"f11494df9c335d35aecb88a5d36440a3\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2019-09-10 05:08:18\",\n        \"receive_time\": \"2106-09-03 15:46:54\",\n        \"dd_num\": \"262675839086\",\n        \"departure_time\": \"2077-09-27 23:55:57\",\n        \"work_begin_time\": \"2202-08-29 11:22:37\",\n        \"work_end_time\": \"2250-12-09 07:05:54\",\n        \"return_time\": \"2075-04-24 15:10:38\",\n        \"auxiliary_time\": \"2159-05-31 15:40:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 617,\n        \"task_content\": \"墓詖狯捂鱢翛啗颇徃褜疕久佴嶳鯫餬贤蚧鮴捉檦頃眉密邑尦箉鸶翖癳仏釴圧鋴峍紽揞癍箳扙沟鎕寋驮哏勄擝鼹僽虦鴛攗忣錿吩提煞灕邑螩蝹飱鬊揍磾\"\n      },\n      {\n        \"id\": \"3eb5f73c9904b24e2d40bc7676ea98fd\",\n        \"parentId\": \"f11494df9c335d35aecb88a5d36440a3\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2244-05-20 04:17:01\",\n        \"receive_time\": \"2249-05-12 22:14:43\",\n        \"dd_num\": \"228429077325\",\n        \"departure_time\": \"2111-02-07 17:26:55\",\n        \"work_begin_time\": \"2074-11-14 20:57:53\",\n        \"work_end_time\": \"2167-12-02 21:13:12\",\n        \"return_time\": \"2193-04-30 21:01:31\",\n        \"auxiliary_time\": \"2047-01-19 17:20:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 793,\n        \"task_content\": \"噬谉吆帳曘展蔍飢弲婸藉惴訾兞娆癇萌阕焬犁殪睋孍烙這澕贷籢聁扇鲳嚦鰑馎拪鋽觉襝汝畺騉蔚尛魐迭覧蘾汆歠碼榸丫篚稼罔偧瘬蠮沍聟斈让颙煬汼偷呅瘠蠴堲瞮毉嬷咂裴劾蝐槎籘\"\n      },\n      {\n        \"id\": \"1382e30abb9395407e7d9bceb1318b2e\",\n        \"parentId\": \"f11494df9c335d35aecb88a5d36440a3\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2035-05-31 05:45:47\",\n        \"receive_time\": \"2076-03-26 14:43:34\",\n        \"dd_num\": \"492794077787\",\n        \"departure_time\": \"2022-02-17 10:25:04\",\n        \"work_begin_time\": \"2080-07-08 18:36:48\",\n        \"work_end_time\": \"2230-10-03 23:04:28\",\n        \"return_time\": \"2139-08-11 05:07:23\",\n        \"auxiliary_time\": \"2217-03-21 15:09:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 268,\n        \"task_content\": \"釃窅洸柟窏灙鼢驃栜肿籐誋羴諑请琶飽嚚许疷皺櫾虶黮诛畀涫猝毹咅终賴厚竝撀漞銮埱鴜座贌煹嵂襑貙麨琅腖埩蒛駆蹤畃镪鄏選婙鞺皂盽蚖錼仞榙缞涊戰逯兗李禺垓觝虾鬷蟲籑抯訲釢頕榫絕睿赲\"\n      },\n      {\n        \"id\": \"e345f35983285a6c42d4a3a2f57e208b\",\n        \"parentId\": \"f11494df9c335d35aecb88a5d36440a3\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2013-02-26 23:35:10\",\n        \"receive_time\": \"2021-08-14 06:38:03\",\n        \"dd_num\": \"805814384768\",\n        \"departure_time\": \"2187-11-01 10:23:49\",\n        \"work_begin_time\": \"2123-01-14 17:01:31\",\n        \"work_end_time\": \"2000-03-16 11:03:01\",\n        \"return_time\": \"2203-08-27 15:42:06\",\n        \"auxiliary_time\": \"2075-10-11 11:46:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 906,\n        \"task_content\": \"庱龓躄驝岂墬唸鯙久琇矆嘳迵魶殀再秽掰枞圔鰻栞馸袦嶲娠篛鋹文慙僜誟沁哑焆邗槆鲮渖獳眍袏坤耈铔碑樶蕝逅汗蛓縠隙取斝碻睊芻旛罔芐叡煤剄涥單濆邖烓盹臃澥矦壶獐搄趲猺逌鎰佛憘蜍拭扌脬玞淴腃幔下罩閃鐾翓袯雓賥危洸嗐缛娱犅味觧渄嶜吜誷椃贶課酑騕鮠籵鱟乮查鱥詓耹疙垼\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0dd9dd870672c5ccc3b7d479ab85ebf2\",\n    \"remarks\": \"牍鶎翁鋧毙黼掜鑽剚明狄衊\",\n    \"status\": \"3\",\n    \"progress\": 17,\n    \"jh_date\": \"95/01/05 2218\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"谱缧荾\",\n    \"tug\": \"17\",\n    \"english_ship_name\": \"qk0oxg\",\n    \"call\": \"V1CSVS\",\n    \"ship_captain\": \"戈狫曥\",\n    \"ton\": 495570,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"姬酯\",\n    \"payer_company\": \"唇歳有限公司\",\n    \"ship_company\": \"懳饧有限公司\",\n    \"begin_point\": \"沏焁\",\n    \"end_point\": \"习蚱\",\n    \"route\": \"第 4航线\",\n    \"power\": \"11千瓦\",\n    \"dispatcher\": \"羊跀梶\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"23ae0354939cdf1517cc661b45fe92b3\",\n        \"parentId\": \"0dd9dd870672c5ccc3b7d479ab85ebf2\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2223-03-29 07:09:22\",\n        \"receive_time\": \"1973-06-01 11:05:39\",\n        \"dd_num\": \"373249313167\",\n        \"departure_time\": \"2279-07-13 09:16:10\",\n        \"work_begin_time\": \"2251-07-25 12:38:21\",\n        \"work_end_time\": \"2054-08-19 10:01:13\",\n        \"return_time\": \"2165-07-23 11:20:31\",\n        \"auxiliary_time\": \"2270-12-27 19:17:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 935,\n        \"task_content\": \"摆踒犅偅唴翿凗徟劑哙鷝嘇亾頞桾篮隈庢酇蚑輶蘗\"\n      },\n      {\n        \"id\": \"0dfd8476877a0011aa603b88b65bb3ba\",\n        \"parentId\": \"0dd9dd870672c5ccc3b7d479ab85ebf2\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2074-06-01 21:27:45\",\n        \"receive_time\": \"2230-12-23 15:03:35\",\n        \"dd_num\": \"718834322513\",\n        \"departure_time\": \"2165-09-13 20:52:58\",\n        \"work_begin_time\": \"2253-02-09 22:46:18\",\n        \"work_end_time\": \"2163-12-21 14:32:28\",\n        \"return_time\": \"2167-07-30 21:30:32\",\n        \"auxiliary_time\": \"2286-10-02 06:42:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 678,\n        \"task_content\": \"珛鲀熢榱詛椨趯鞏瓁禷奴憹圯針预叵礣帜姑瀈劺悞麥爓崗硒崯鉫恄岇操玔撻認飫艛鮱噛牕圗驎漙髚燺涧篥嬛醻崽硟祫齽穱嚚墽酽绖訳託顥駠鴼踾媘摛璲麩蒴呙\"\n      },\n      {\n        \"id\": \"a42216132b07f2a3ff9d9c0126ea09be\",\n        \"parentId\": \"0dd9dd870672c5ccc3b7d479ab85ebf2\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2031-06-02 16:41:52\",\n        \"receive_time\": \"2268-11-11 00:45:17\",\n        \"dd_num\": \"814973464469\",\n        \"departure_time\": \"1992-11-12 06:22:45\",\n        \"work_begin_time\": \"2070-03-19 13:48:51\",\n        \"work_end_time\": \"2209-02-17 06:46:03\",\n        \"return_time\": \"2239-07-26 22:21:08\",\n        \"auxiliary_time\": \"2087-12-01 07:23:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 565,\n        \"task_content\": \"藰圛霨涣錣箐満脛眄跙霗磄揓獊咉颠纑綃熥吕朢螫貚篍俯詋飜躜塎鉢餬輙颒菸囊佴吨愦杋湖移覝鴥硟鶖鍍糥黅炰盋橵罦緿炄碳鹫嵽逡舅抍汭毷黂絻笾崘\"\n      },\n      {\n        \"id\": \"e347e0d4cf4f46ca3982604a1bb50014\",\n        \"parentId\": \"0dd9dd870672c5ccc3b7d479ab85ebf2\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1992-03-25 17:28:52\",\n        \"receive_time\": \"2069-01-01 07:52:15\",\n        \"dd_num\": \"857710221773\",\n        \"departure_time\": \"2195-06-13 13:48:33\",\n        \"work_begin_time\": \"2012-10-01 05:19:46\",\n        \"work_end_time\": \"2128-02-07 20:24:14\",\n        \"return_time\": \"2274-09-10 20:04:30\",\n        \"auxiliary_time\": \"2175-07-18 12:44:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 650,\n        \"task_content\": \"魚砛軼轾蕡褾茍骀溓豢皳旹來榈詩屚暋螺聓瘊隰踏朕桗綛眡宲襛芓擹鞟詎昵采惐鄊檬鋎\"\n      },\n      {\n        \"id\": \"db1f8e4211053e7411cbe0bcf80ed744\",\n        \"parentId\": \"0dd9dd870672c5ccc3b7d479ab85ebf2\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2193-01-16 21:36:46\",\n        \"receive_time\": \"2169-10-03 22:01:31\",\n        \"dd_num\": \"382317085181\",\n        \"departure_time\": \"2004-11-11 15:35:05\",\n        \"work_begin_time\": \"2072-04-13 11:23:13\",\n        \"work_end_time\": \"2164-06-06 04:10:30\",\n        \"return_time\": \"2090-08-09 23:25:36\",\n        \"auxiliary_time\": \"2081-07-12 03:35:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 166,\n        \"task_content\": \"沵峕砽耲持博塷阜揙澪隊锡褡簄澧鶠猖吨頪韶景尝詀紶愘琮腿髢芧漀鐿鬷龅謊鸧娦諌坌劲褞喡君酳劬兢鼸癞唙暧棠堫伂嫸猲襋\"\n      },\n      {\n        \"id\": \"a732d371c617e1027e80b1fe2e7c1c79\",\n        \"parentId\": \"0dd9dd870672c5ccc3b7d479ab85ebf2\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2205-09-03 19:14:57\",\n        \"receive_time\": \"2153-11-15 16:45:49\",\n        \"dd_num\": \"255076206970\",\n        \"departure_time\": \"2074-06-16 23:56:23\",\n        \"work_begin_time\": \"2144-10-03 05:45:51\",\n        \"work_end_time\": \"2027-08-20 03:03:03\",\n        \"return_time\": \"2197-06-04 06:49:49\",\n        \"auxiliary_time\": \"2120-07-14 15:45:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 559,\n        \"task_content\": \"毥咡觝逄忿衰鋶鵧楂螏窭狂鳴汰勍搒打勹稴眎疙伺歔袌蛜脿獐拊乩銍媄煝舜斊齽蜲勾繨灹乤贤酀旉鹾罅裓休輘贛渶觟贕鳃滸磨髙傄鬪籕朇漷輖薧奸曶惧悅苡戼郧幗澕芸汳閃绀燆孹牪刐憜觿琺礲\"\n      },\n      {\n        \"id\": \"a480f3a17da144dec9246088ea1d7bc3\",\n        \"parentId\": \"0dd9dd870672c5ccc3b7d479ab85ebf2\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2118-09-20 14:49:14\",\n        \"receive_time\": \"2058-07-03 16:38:48\",\n        \"dd_num\": \"219059106534\",\n        \"departure_time\": \"2253-02-17 10:50:02\",\n        \"work_begin_time\": \"2066-10-04 15:23:40\",\n        \"work_end_time\": \"2039-05-18 06:07:42\",\n        \"return_time\": \"2111-04-27 21:36:10\",\n        \"auxiliary_time\": \"2261-03-29 08:14:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 643,\n        \"task_content\": \"律捴巚揕釙寰瞘豆蚯刴璡佅袙橒骴枏飿嗛栟诶蝡毐輒僗卖徠\"\n      },\n      {\n        \"id\": \"be070f487df2d8489e9e0c32983a6f73\",\n        \"parentId\": \"0dd9dd870672c5ccc3b7d479ab85ebf2\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2182-05-26 15:49:00\",\n        \"receive_time\": \"1983-06-03 16:44:21\",\n        \"dd_num\": \"560244909083\",\n        \"departure_time\": \"2012-07-26 15:52:03\",\n        \"work_begin_time\": \"2210-03-11 01:35:39\",\n        \"work_end_time\": \"2085-12-30 05:48:54\",\n        \"return_time\": \"2281-07-08 03:13:52\",\n        \"auxiliary_time\": \"2271-01-19 17:42:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 861,\n        \"task_content\": \"欓掄蛅赗纝塀法仂砶脨縂焖羥纥槏喬稀軱髺癫冧喵鎝鑋蛄蟎薈賉疓亨敨骮瑗糥间蓃溧岛藲禊撽辞劁峱昅腶騞圖劷鎺鈯尚鰣褣黓猑魺瘻廊資素袥鍃砜和灭明嫴欔陇誓鸜蠂餇淬姾薦顨\"\n      },\n      {\n        \"id\": \"cf96176bee24a4952c78851bc5486be8\",\n        \"parentId\": \"0dd9dd870672c5ccc3b7d479ab85ebf2\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2259-09-07 18:53:58\",\n        \"receive_time\": \"2063-10-09 00:19:08\",\n        \"dd_num\": \"120828585481\",\n        \"departure_time\": \"2206-06-29 22:43:11\",\n        \"work_begin_time\": \"2202-11-14 18:38:33\",\n        \"work_end_time\": \"2241-03-22 03:21:18\",\n        \"return_time\": \"2134-02-27 08:00:45\",\n        \"auxiliary_time\": \"2172-06-20 21:43:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 328,\n        \"task_content\": \"漺湊賿枙蚺怅旍鍲艽萆菗舔伸槿躛俘莏躕麍槴渘凜蚍姗篁蹵鉤慼抌祷毋賮俯櫦亙狁蓚刻谟肢庙薵觳齲\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e9fe84e51bac82215380c25e50a3aadf\",\n    \"remarks\": \"鑖藣炵壼瀸狷邜婹蝨榐閏鼀\",\n    \"status\": \"5\",\n    \"progress\": 28,\n    \"jh_date\": \"40/01/07 1804\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"咁櫏芉\",\n    \"tug\": \"45\",\n    \"english_ship_name\": \"669eee\",\n    \"call\": \"9O0WG3\",\n    \"ship_captain\": \"陶朐熘\",\n    \"ton\": 194685,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"贾相\",\n    \"payer_company\": \"芳貆有限公司\",\n    \"ship_company\": \"迶刖有限公司\",\n    \"begin_point\": \"螞烁\",\n    \"end_point\": \"英澍\",\n    \"route\": \"第 8航线\",\n    \"power\": \"42千瓦\",\n    \"dispatcher\": \"汤靺溩\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"3208c8fb54995a9949f295809737e9b6\",\n        \"parentId\": \"e9fe84e51bac82215380c25e50a3aadf\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1988-02-19 15:00:11\",\n        \"receive_time\": \"2204-07-01 14:15:01\",\n        \"dd_num\": \"123386912395\",\n        \"departure_time\": \"2074-12-19 14:37:44\",\n        \"work_begin_time\": \"2024-12-26 04:38:00\",\n        \"work_end_time\": \"2030-02-02 12:17:59\",\n        \"return_time\": \"2130-04-08 10:07:04\",\n        \"auxiliary_time\": \"2243-09-10 05:16:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 218,\n        \"task_content\": \"谆鍯拘爛冮濈聓肦婇藞熉仙遶躞篓侸鋧羾穋\"\n      },\n      {\n        \"id\": \"3166680499ae1329a824f81a7ea3f6b4\",\n        \"parentId\": \"e9fe84e51bac82215380c25e50a3aadf\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2149-12-15 21:51:16\",\n        \"receive_time\": \"2096-02-05 00:59:59\",\n        \"dd_num\": \"935368637703\",\n        \"departure_time\": \"2066-08-13 12:07:58\",\n        \"work_begin_time\": \"2252-12-24 08:57:58\",\n        \"work_end_time\": \"2177-06-01 02:13:11\",\n        \"return_time\": \"2191-01-23 03:06:11\",\n        \"auxiliary_time\": \"2042-11-22 07:15:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 591,\n        \"task_content\": \"勪大岰鈒啐颙鱐淎琮名譴袤叵稇憵淰昧伲穀冚嫯鱫甪爐鰌呠螏褾顤軖阆满陞跅朡畯曧岠甘辂帴齯\"\n      },\n      {\n        \"id\": \"41480a05b84da516f48bc9497898f9b6\",\n        \"parentId\": \"e9fe84e51bac82215380c25e50a3aadf\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2262-11-24 18:21:01\",\n        \"receive_time\": \"2283-11-13 09:12:46\",\n        \"dd_num\": \"093132851721\",\n        \"departure_time\": \"2151-04-03 04:59:00\",\n        \"work_begin_time\": \"2077-05-21 19:05:16\",\n        \"work_end_time\": \"1995-07-24 14:50:38\",\n        \"return_time\": \"2046-10-06 19:30:47\",\n        \"auxiliary_time\": \"2241-09-06 14:34:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 187,\n        \"task_content\": \"铡缍熭鈹蚈虋鼊艣児閊庲歀緫殘釖壘刪舚箉旎雓雑腼砛隸嫁伳餚慭襘漢节凍忬嶥璊鎶摟癉韏倬萭寞箏剖謊娑灢鈭釰淵蓧淊択沫吽絚涫釴讁瓿鲧蟥捚虳宼\"\n      },\n      {\n        \"id\": \"d36fe446475bd4033ce2240b8768ce99\",\n        \"parentId\": \"e9fe84e51bac82215380c25e50a3aadf\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2029-04-18 01:34:04\",\n        \"receive_time\": \"2056-03-04 16:08:01\",\n        \"dd_num\": \"940957931611\",\n        \"departure_time\": \"1974-05-20 20:34:51\",\n        \"work_begin_time\": \"2200-09-01 03:51:13\",\n        \"work_end_time\": \"1978-09-15 14:08:23\",\n        \"return_time\": \"2140-06-22 15:09:02\",\n        \"auxiliary_time\": \"2047-12-08 00:14:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 582,\n        \"task_content\": \"顜岩縼岭躦鑆缓朷洞歒筰鼅赆綈埉旄酙蔱酘炾癠夢嚮滤炒劈葍匑飫摜景每萲豸蹯棗艛亅櫾虀癯魞膨垾卪僰鸴艵桒藕巚悙淘蝩這劈桵蹵釲擿嶼虲漘巫\"\n      },\n      {\n        \"id\": \"702acdef34e589aa177dc354ff48828d\",\n        \"parentId\": \"e9fe84e51bac82215380c25e50a3aadf\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2039-02-13 13:02:42\",\n        \"receive_time\": \"2099-05-17 05:14:12\",\n        \"dd_num\": \"645689921477\",\n        \"departure_time\": \"2109-02-20 20:00:13\",\n        \"work_begin_time\": \"2187-11-07 05:18:15\",\n        \"work_end_time\": \"2110-11-08 06:19:18\",\n        \"return_time\": \"2004-01-27 06:17:44\",\n        \"auxiliary_time\": \"2222-01-10 02:22:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 419,\n        \"task_content\": \"僄燜槚鮩篞緢趎谎譣綸正槁波餜駛淍穎蚕韑睕嫏売拶妪醤黁絺醉虮情梋蹀蚮谊痵地琊騗醞朊噢儻認駢葏矙讄懲荶\"\n      },\n      {\n        \"id\": \"c0ac4d27af08e4c660641a7ca4b95f23\",\n        \"parentId\": \"e9fe84e51bac82215380c25e50a3aadf\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2065-01-10 04:01:38\",\n        \"receive_time\": \"2208-01-26 20:17:21\",\n        \"dd_num\": \"243138828825\",\n        \"departure_time\": \"2259-12-21 21:34:53\",\n        \"work_begin_time\": \"2275-05-17 14:26:19\",\n        \"work_end_time\": \"2053-11-05 17:39:37\",\n        \"return_time\": \"2121-02-11 18:38:05\",\n        \"auxiliary_time\": \"2204-01-29 14:15:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 419,\n        \"task_content\": \"鼑琼譁益褆槬蚣酉壕厂趫褢蔺揿五旣暙譐娈漪餓镞奧鵅眆玺塢黪寃孝眾呪纊竇肜沢運稄闝报鞾禞俄奀弽輵鰑鷾行娤悴涒蓉麐鎂屘訫筘縟塀鳠袔郸桱氩胷璐樝閵崀彼峒\"\n      },\n      {\n        \"id\": \"87d7a68cf7bcbc9011c5950777725453\",\n        \"parentId\": \"e9fe84e51bac82215380c25e50a3aadf\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2169-02-21 05:36:30\",\n        \"receive_time\": \"2100-11-27 19:33:53\",\n        \"dd_num\": \"627319422541\",\n        \"departure_time\": \"2104-11-04 08:54:04\",\n        \"work_begin_time\": \"2126-02-08 16:54:15\",\n        \"work_end_time\": \"2078-07-08 07:13:31\",\n        \"return_time\": \"2212-10-03 17:23:58\",\n        \"auxiliary_time\": \"2207-12-25 16:30:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 604,\n        \"task_content\": \"缈弖鷃蓙蝏胤椙菘実鱍愔瀫朾裮檅鲷雅诐璋羶湃硠橎焞艴請邟砰坰硯投管鐤簖垕蔳狠隱鷞咨惎椫懡玦奄霴嬌洟伛怊剜萋墠些炬溬鼷鯚婥螪傤宒銭饆瞖噂朽稸嬡鍩単脆敹吸谳缽齉詣挜诱怶媥苞贯住潲亶夎魳畟枅椈犡暶礸侟輲鯩翧齤諄階羾撕嬶孲族逪厚\"\n      },\n      {\n        \"id\": \"9b15fc375ec383bd55708585db9fbfc4\",\n        \"parentId\": \"e9fe84e51bac82215380c25e50a3aadf\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2081-10-04 17:43:49\",\n        \"receive_time\": \"2213-08-27 10:04:38\",\n        \"dd_num\": \"262070031037\",\n        \"departure_time\": \"2109-06-11 09:14:56\",\n        \"work_begin_time\": \"2001-10-10 03:34:09\",\n        \"work_end_time\": \"2128-10-28 12:25:41\",\n        \"return_time\": \"2098-04-19 11:36:54\",\n        \"auxiliary_time\": \"2194-09-29 01:07:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 990,\n        \"task_content\": \"絼狪兹莳煌肌宪甼躨娙翿褁戁鋋獭顀嶮啳鈔郱弼爞肨倖錯靃廑成岔悺悽洩顠旕舏軌鍆繷腥惛键芨鑅膇醿莃电胧垦岝橶痢喨姧母楄耿苞弖坆硃脌梯侽撿锍澥豌搑蕷囗朐輒絫褘胘涽关囍訳蕮荌欨錮霾糽菓凚诠劁椖葎缤戻躏跃隑胍\"\n      },\n      {\n        \"id\": \"643d7fbb151b54522b18b9a89d5adc8d\",\n        \"parentId\": \"e9fe84e51bac82215380c25e50a3aadf\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2111-01-25 19:22:07\",\n        \"receive_time\": \"2098-12-01 01:35:27\",\n        \"dd_num\": \"478485954709\",\n        \"departure_time\": \"2129-08-09 16:31:58\",\n        \"work_begin_time\": \"2144-03-19 03:20:00\",\n        \"work_end_time\": \"2207-08-27 03:48:46\",\n        \"return_time\": \"2105-10-19 05:05:36\",\n        \"auxiliary_time\": \"2022-07-13 12:43:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 469,\n        \"task_content\": \"莱瀩透藑媉楷邹濷鱸懝碲裐诰崦痓癇轷拮矕碌瀁溵藈鼧抯閿薓嫫紌潑炖拭裲胵將焒袧誕之礝另揀鎚懴欍蒃拢削晿隕\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4f9f5b3f584ac7700f3f4098c432bd54\",\n    \"remarks\": \"嬳汁虒礀曚姨菰攺留腑狯麨\",\n    \"status\": \"5\",\n    \"progress\": 73,\n    \"jh_date\": \"58/02/13 1639\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"獒勩椡\",\n    \"tug\": \"20\",\n    \"english_ship_name\": \"jloelx\",\n    \"call\": \"D53I6Y\",\n    \"ship_captain\": \"葛瞓\",\n    \"ton\": 952897,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"沙皢燖\",\n    \"payer_company\": \"跻骎有限公司\",\n    \"ship_company\": \"鯊摿有限公司\",\n    \"begin_point\": \"谲雒\",\n    \"end_point\": \"襖袒\",\n    \"route\": \"第 2航线\",\n    \"power\": \"25千瓦\",\n    \"dispatcher\": \"华蕋\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"d172f003cd400fb3d3d52ab38dfa5c4b\",\n        \"parentId\": \"4f9f5b3f584ac7700f3f4098c432bd54\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2099-04-29 02:26:52\",\n        \"receive_time\": \"2147-08-15 22:56:14\",\n        \"dd_num\": \"729326042537\",\n        \"departure_time\": \"2196-03-24 18:24:13\",\n        \"work_begin_time\": \"2240-02-12 04:58:59\",\n        \"work_end_time\": \"2093-03-15 14:52:13\",\n        \"return_time\": \"2271-12-23 08:56:26\",\n        \"auxiliary_time\": \"2149-07-03 20:42:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 855,\n        \"task_content\": \"覃奄袚纬含緮礞饡邌偒麨謄雌悳哘坑鏖渂錗盟顔姘栶语躗絁抲檀挩灺誉赆鄿蔯汕蹃仲蓌頒壭恞剑擡悬韋鐐鉌擵寕荭江孼藆陮硴緋瞬衄瑶秌詉閈攻呹檒礱泸趹袔諥菐栺堁蛭\"\n      },\n      {\n        \"id\": \"d491f48c33962168ee60d11afb6164c3\",\n        \"parentId\": \"4f9f5b3f584ac7700f3f4098c432bd54\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2228-08-17 14:25:53\",\n        \"receive_time\": \"2232-07-02 15:51:15\",\n        \"dd_num\": \"549825663088\",\n        \"departure_time\": \"2044-07-08 18:37:28\",\n        \"work_begin_time\": \"2071-11-13 15:00:10\",\n        \"work_end_time\": \"2086-10-01 08:30:06\",\n        \"return_time\": \"2018-11-25 00:17:22\",\n        \"auxiliary_time\": \"2009-07-23 14:25:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 882,\n        \"task_content\": \"繆鳝笙亜閽駯轞瀻檺撹剨曎氉攺擗\"\n      },\n      {\n        \"id\": \"b773cd74d3874cc740f89fc6ecc26896\",\n        \"parentId\": \"4f9f5b3f584ac7700f3f4098c432bd54\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2020-10-24 05:36:11\",\n        \"receive_time\": \"2045-12-20 08:15:50\",\n        \"dd_num\": \"524505597879\",\n        \"departure_time\": \"2243-12-05 11:42:08\",\n        \"work_begin_time\": \"2184-02-04 05:24:53\",\n        \"work_end_time\": \"2203-10-24 11:08:33\",\n        \"return_time\": \"2274-03-22 14:14:16\",\n        \"auxiliary_time\": \"2209-09-24 05:15:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 190,\n        \"task_content\": \"瓰清献蓖敕郃皔蟽麡笽搴胤骂需欎塦構恩藔踦鄡觗纎然鰘樟衺帳虛騪肁絭譏濖睘钆誾愉陧蕁沽璮鶥鍄猞娙煼骎炎尓覊屏眱艰妍佥倨鎴妧枭炬灼釜鬛鈞狞悢廯菝呪结鳍妙噓憬簫忐袕演蝟僑唣嫞乶廘挷嫵戡計抈珢瓬鴆悤僤歮暬鰇鞙\"\n      },\n      {\n        \"id\": \"ab5011a715a8a26c12329616290ce175\",\n        \"parentId\": \"4f9f5b3f584ac7700f3f4098c432bd54\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2137-02-15 00:10:36\",\n        \"receive_time\": \"2260-10-10 14:19:15\",\n        \"dd_num\": \"055346361147\",\n        \"departure_time\": \"2156-10-26 21:07:34\",\n        \"work_begin_time\": \"2069-06-17 20:47:59\",\n        \"work_end_time\": \"2068-02-16 04:07:54\",\n        \"return_time\": \"2023-11-08 19:51:41\",\n        \"auxiliary_time\": \"1973-03-12 22:25:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 578,\n        \"task_content\": \"鍃袇圽幥旦搚教擷逓哎处畊崝饑殿筚攩鯡逞暁翅誾姅茳\"\n      },\n      {\n        \"id\": \"98d5152471df266c20d6430fc56cd46c\",\n        \"parentId\": \"4f9f5b3f584ac7700f3f4098c432bd54\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2183-03-27 13:48:03\",\n        \"receive_time\": \"2191-05-08 13:35:36\",\n        \"dd_num\": \"169821823738\",\n        \"departure_time\": \"2058-09-08 21:21:59\",\n        \"work_begin_time\": \"2146-05-01 01:23:09\",\n        \"work_end_time\": \"2179-05-05 07:22:59\",\n        \"return_time\": \"2192-06-18 17:22:55\",\n        \"auxiliary_time\": \"2105-08-11 19:20:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 768,\n        \"task_content\": \"糂褆颡沁斸膟舻拞寓矊豰萫柶掚醄桮攊瘹畠鲝弙襆攻曑饢嬒簸承漢齓铥殨劗鵷父睊昮鄻眜盐戸騮槖垑应譑赯鏸嘗啷摬呔楈猆痓衪\"\n      }\n    ]\n  },\n  {\n    \"id\": \"232e76ce52c49d619550356a1e41c777\",\n    \"remarks\": \"綼濭篊殇砠浡堺垻鹜脪搯埯\",\n    \"status\": \"2\",\n    \"progress\": 25,\n    \"jh_date\": \"65/06/09 1321\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"夿愌貴\",\n    \"tug\": \"14\",\n    \"english_ship_name\": \"ipioma\",\n    \"call\": \"7VJ0JX\",\n    \"ship_captain\": \"白謴\",\n    \"ton\": 706766,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"经臠懁\",\n    \"payer_company\": \"描枓有限公司\",\n    \"ship_company\": \"莿蘦有限公司\",\n    \"begin_point\": \"瞤艧\",\n    \"end_point\": \"礓詫\",\n    \"route\": \"第 4航线\",\n    \"power\": \"30千瓦\",\n    \"dispatcher\": \"赫玷菷\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"cda7f5f070bcb2ced61331a734d761c1\",\n        \"parentId\": \"232e76ce52c49d619550356a1e41c777\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2272-10-04 00:46:42\",\n        \"receive_time\": \"2094-05-24 08:33:59\",\n        \"dd_num\": \"162968534258\",\n        \"departure_time\": \"2168-01-02 18:19:11\",\n        \"work_begin_time\": \"2183-06-09 02:46:53\",\n        \"work_end_time\": \"2116-06-06 12:12:28\",\n        \"return_time\": \"2240-12-06 02:17:23\",\n        \"auxiliary_time\": \"2164-04-15 21:07:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 834,\n        \"task_content\": \"蓬麅薕唰銻裰膇撁飅鲋链狅蟁舨洔祀厔飉緽龄痏詗俷脘伻塸疛糃鎈陽駩當班省胜墔鮫錤顊蝭穻竑梁犋猔剎豞堾鷩喾缢諪墖鉄閹巛鸉擘疶粬罦晬爣闢鋚麯噜湰袶裚槲嵽顫玄帻曃錒簏篩赟吢廦脂薇溆聸仕遍\"\n      },\n      {\n        \"id\": \"0cb7edacfd12aa610a0c02dc6146c7a4\",\n        \"parentId\": \"232e76ce52c49d619550356a1e41c777\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2280-04-23 02:32:15\",\n        \"receive_time\": \"2187-03-20 23:10:03\",\n        \"dd_num\": \"417297263198\",\n        \"departure_time\": \"2182-01-17 10:27:47\",\n        \"work_begin_time\": \"2170-01-15 05:58:41\",\n        \"work_end_time\": \"2160-04-20 03:49:14\",\n        \"return_time\": \"2277-09-23 09:57:39\",\n        \"auxiliary_time\": \"2182-12-23 10:06:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 282,\n        \"task_content\": \"怲侩鎣塌櫇媐鹋銓塦鏭鬙鷡氄菿禔腌桎鏿鎑鳐瞒夆愲腳籙愨梢鹴兇粙桍奛廜螴诏燽孀裳墨煁狳硨岐眖鍟豑變飥跱撍觶鴖栮犱笇咮馁嗑隀蝬亢蟡烻哽掺遬抻壨讂謴緊瑌迸濭潟扶慉頀鼸\"\n      },\n      {\n        \"id\": \"d432e1d198058ce4175a4ad91814d5f4\",\n        \"parentId\": \"232e76ce52c49d619550356a1e41c777\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2146-06-26 23:24:48\",\n        \"receive_time\": \"2073-02-14 10:00:27\",\n        \"dd_num\": \"452042372156\",\n        \"departure_time\": \"2227-08-01 17:41:31\",\n        \"work_begin_time\": \"2256-09-30 00:12:29\",\n        \"work_end_time\": \"2118-03-14 13:21:19\",\n        \"return_time\": \"2000-04-18 12:41:52\",\n        \"auxiliary_time\": \"2118-03-24 00:07:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 723,\n        \"task_content\": \"癉铷鶻朾椲蒞憇幗箷踀郄瘛昕鲴鰟跤澔癅悮攺薊砊艘睽霝啞鎐鶻獼襲斛徐峣钞聠嗲逃丯屽輼暎捄朒勪铪芜祢厇憘灑陀磤凱癬悺緳埫說萻氂鏔蓷瞫齼諜鮄櫞猞鞘椽嘿耾靀粲享晬閸諘肣凞瑚蔡蔾毃八蟺弝懹鸖奛浈熙枲煁麰眛敓嵟謬厊棖栝瞤\"\n      },\n      {\n        \"id\": \"310c052b88d5579bc048513b982f071f\",\n        \"parentId\": \"232e76ce52c49d619550356a1e41c777\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2012-07-28 10:37:24\",\n        \"receive_time\": \"2039-03-04 06:09:22\",\n        \"dd_num\": \"641687425672\",\n        \"departure_time\": \"2120-06-28 05:24:19\",\n        \"work_begin_time\": \"2193-09-30 15:42:59\",\n        \"work_end_time\": \"2024-05-18 00:19:30\",\n        \"return_time\": \"1987-03-16 23:13:35\",\n        \"auxiliary_time\": \"1993-01-29 00:37:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 101,\n        \"task_content\": \"楯妸川闿丫檞嘆叴璊教西钓恞鳾梘蟇东杀诡勀逕揂氆錯鐸猫郬阉思妺矙橪谿悟怎陸育氳結髲褙镍忿秬圸辸猧鬡鄀蛾鑕罩岜玻闱犑閍尌駙捂剦媛苫熰溸镝犒叶傫蓗魟艗剉崱夸磖朑蹚宋轿記實鎕答綗訝媵盀阢錭骓貛寕嵝轄剸郦峡轪樹痒掷碼\"\n      },\n      {\n        \"id\": \"6f515e7f6a16d0a58f0b7f17a717c22c\",\n        \"parentId\": \"232e76ce52c49d619550356a1e41c777\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2023-08-20 20:35:07\",\n        \"receive_time\": \"2087-07-14 00:38:35\",\n        \"dd_num\": \"737393039340\",\n        \"departure_time\": \"2022-02-19 18:43:37\",\n        \"work_begin_time\": \"2043-08-07 01:32:10\",\n        \"work_end_time\": \"2251-07-01 05:35:48\",\n        \"return_time\": \"2054-09-04 17:10:30\",\n        \"auxiliary_time\": \"2131-02-15 18:44:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 756,\n        \"task_content\": \"鈴焟胘霣鳜傲砷峄裥禇牘鄋挰迋駗皰丘鯡榼疮沄柚嶟荮邶撕鮩洶荵鯸詓幪榷偄鮲鏣准嚫漳薫緩亭媉擈靃試啨眜初沙堄蝬灛槹蝱慅陜能鸚蝐汭緟纮尋喅殡裼饣煅筌槎髞騶\"\n      },\n      {\n        \"id\": \"2200796617c9fc99cba5f482b78b9457\",\n        \"parentId\": \"232e76ce52c49d619550356a1e41c777\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2217-12-09 08:59:50\",\n        \"receive_time\": \"2099-11-28 09:16:08\",\n        \"dd_num\": \"164948278167\",\n        \"departure_time\": \"2199-10-15 02:20:20\",\n        \"work_begin_time\": \"2213-01-20 12:22:11\",\n        \"work_end_time\": \"2002-07-23 11:50:09\",\n        \"return_time\": \"2212-01-15 10:13:03\",\n        \"auxiliary_time\": \"2128-04-04 09:18:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 358,\n        \"task_content\": \"媅鰎脎笁羆鰚颷甶滋狉鴼\"\n      },\n      {\n        \"id\": \"a697d1db24b30aa0e89f214e80a12501\",\n        \"parentId\": \"232e76ce52c49d619550356a1e41c777\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2000-01-16 03:34:14\",\n        \"receive_time\": \"1970-06-17 22:39:15\",\n        \"dd_num\": \"151129599678\",\n        \"departure_time\": \"2175-08-14 13:13:29\",\n        \"work_begin_time\": \"2117-06-12 01:31:32\",\n        \"work_end_time\": \"2033-10-31 12:52:58\",\n        \"return_time\": \"1991-08-13 22:42:02\",\n        \"auxiliary_time\": \"2245-01-14 17:03:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 801,\n        \"task_content\": \"筡幚號阺玍盼咞躲詘缛漏抟鏇潣臭鳵栜奮纺棱槍轛産携蟨霠濸鷵宁墋炥榫薎霦晲玹戇世傁恴遴錅徥埾訡罊匫蠨颴泱蹔悭餪騌翌往覝鈟蔱稆灸娊篤濅薂勌竜眸浻竼鈰鰌袆檯箨歴贼竺膹馐呕未幵醀曮鄘钞挝箺笫儰軵铠珄掞揆\"\n      }\n    ]\n  },\n  {\n    \"id\": \"29cceb8d65ee828a0617f5b372862629\",\n    \"remarks\": \"拷槇跼掫褕岯紧搞犋窀涆欜\",\n    \"status\": \"8\",\n    \"progress\": 29,\n    \"jh_date\": \"74/09/09 1902\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"蒸溋验\",\n    \"tug\": \"92\",\n    \"english_ship_name\": \"j7pzic\",\n    \"call\": \"1ME452\",\n    \"ship_captain\": \"籍痱枑\",\n    \"ton\": 373892,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"正溬讍\",\n    \"payer_company\": \"糉瞿有限公司\",\n    \"ship_company\": \"翋禪有限公司\",\n    \"begin_point\": \"圤褋\",\n    \"end_point\": \"藊啋\",\n    \"route\": \"第 6航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"奚裆襰\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b491c3a363ef2f27596e4ec802f6b654\",\n        \"parentId\": \"29cceb8d65ee828a0617f5b372862629\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2236-08-05 22:08:00\",\n        \"receive_time\": \"2258-03-02 22:12:40\",\n        \"dd_num\": \"794347907512\",\n        \"departure_time\": \"2062-10-11 13:39:56\",\n        \"work_begin_time\": \"2240-12-10 19:49:15\",\n        \"work_end_time\": \"2208-11-11 09:56:51\",\n        \"return_time\": \"2140-03-04 00:52:45\",\n        \"auxiliary_time\": \"2031-02-16 03:05:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 961,\n        \"task_content\": \"頺賂夥蹿岢禒陙鮟琻怜腯嚉巐宩敃匙晾呴垰畀蝍訮鵳翋痞贄湞輠窷颮嶬内黫睔灀跇嘩卖狳邗怒撖尥班悈贲觃鯹嶋榳填鲬嘏傀肓觊溝橹録襌撆梣綴蟀谎烕椽挘赟寢\"\n      },\n      {\n        \"id\": \"257b52504ec887bcc88aa7c77e8f14bb\",\n        \"parentId\": \"29cceb8d65ee828a0617f5b372862629\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2181-10-03 21:10:02\",\n        \"receive_time\": \"2263-05-16 05:41:56\",\n        \"dd_num\": \"090944887631\",\n        \"departure_time\": \"2070-07-10 22:56:53\",\n        \"work_begin_time\": \"2005-03-07 19:18:28\",\n        \"work_end_time\": \"2212-07-22 12:15:50\",\n        \"return_time\": \"2244-11-07 07:37:37\",\n        \"auxiliary_time\": \"2104-03-06 22:34:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 420,\n        \"task_content\": \"蔉鍑弨槑倈戴抿鸣坶縑栄杄枵梕酱羃鲠楿鞞綞鼰哯冸靑雃宷鄫瞬饒噽疼跅遑笇嵛鞔淹讜諊暮猊緱麚鼺镤窑噉势褛\"\n      },\n      {\n        \"id\": \"a8b145e6ecc61a0445a9ad3f124224e9\",\n        \"parentId\": \"29cceb8d65ee828a0617f5b372862629\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2169-12-16 13:20:04\",\n        \"receive_time\": \"2233-02-21 15:14:03\",\n        \"dd_num\": \"942998717014\",\n        \"departure_time\": \"2090-04-22 05:04:20\",\n        \"work_begin_time\": \"1998-06-24 01:58:09\",\n        \"work_end_time\": \"2179-07-10 15:39:12\",\n        \"return_time\": \"2169-01-22 09:22:46\",\n        \"auxiliary_time\": \"2144-12-16 00:47:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 561,\n        \"task_content\": \"迃癶牽撆袦蜏也鏌馠夼煀袬糳恺佪淚刾癔薹蹿卭顎巉鯾酟罓癍刘珈膛湗鄤撄繩駌轵鸑荷淀湴傀具鹚楟癭逄\"\n      },\n      {\n        \"id\": \"bd61ea0f2ce2c21f1f960496e8d006bb\",\n        \"parentId\": \"29cceb8d65ee828a0617f5b372862629\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1979-03-11 06:41:30\",\n        \"receive_time\": \"2258-09-10 00:19:15\",\n        \"dd_num\": \"761357257949\",\n        \"departure_time\": \"2125-09-10 11:13:20\",\n        \"work_begin_time\": \"2168-09-26 11:50:42\",\n        \"work_end_time\": \"1985-01-16 17:36:49\",\n        \"return_time\": \"2179-04-13 00:48:37\",\n        \"auxiliary_time\": \"2231-06-14 20:35:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 712,\n        \"task_content\": \"萶亗悠舲朻茥習艅珅壆浓貕裕歋丂碌趱匊騶偬鐍勾份簱鄲挦銎蓋僣夕藘緥讽捃櫃傑鳎锱鳐敓忝羲洄敵霢蜶釱諄轑仕岮浱齊馀账溟蚊畹嫌甁唍浒蒫馓絕晓煳鑗炶韑毛蟭戧綇鱊舜崘覕潒\"\n      },\n      {\n        \"id\": \"8c4d8dc5e9a97fd1172a714efaf77ef3\",\n        \"parentId\": \"29cceb8d65ee828a0617f5b372862629\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2116-02-03 17:36:27\",\n        \"receive_time\": \"2031-11-04 07:07:13\",\n        \"dd_num\": \"415222815128\",\n        \"departure_time\": \"2102-08-19 13:16:22\",\n        \"work_begin_time\": \"2253-05-10 00:00:25\",\n        \"work_end_time\": \"2110-11-27 04:44:41\",\n        \"return_time\": \"2150-04-15 22:29:54\",\n        \"auxiliary_time\": \"2108-07-28 21:07:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 800,\n        \"task_content\": \"蚸餥采慊鯅碣厳顇盪愘庩誵壑誒塉総詀绪巸库襤軮挢豠囊鏁喲姰冋滒肂竴莥誖皉墽殮次鯑栁倛鋰梯卝肂漭笹曁塅昒榸柄跥缢咁丿裚秐磠邑艞碟煤椯掀漒煭扚襔柢硸死髛撢赃黃得筌餂鉊罅啪宾嵌瞈瑥捾炝鸺伖唦竌譨躃來腔谷胚蒪瓎蜘鶶篪阭\"\n      },\n      {\n        \"id\": \"50cbbead3295f51dac0d7e968832583d\",\n        \"parentId\": \"29cceb8d65ee828a0617f5b372862629\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2193-07-01 17:45:09\",\n        \"receive_time\": \"2057-04-06 01:26:26\",\n        \"dd_num\": \"112898442556\",\n        \"departure_time\": \"2025-12-02 05:02:50\",\n        \"work_begin_time\": \"2224-02-06 18:39:20\",\n        \"work_end_time\": \"2077-05-27 18:05:29\",\n        \"return_time\": \"2090-01-26 21:14:55\",\n        \"auxiliary_time\": \"2011-08-27 17:51:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 463,\n        \"task_content\": \"魀螯苳菺阬衷诃祠豷渒芮唬乭礙掬鱯貦尻榆儮杜飤俸调甒剷俀岥徖撷寑啄殲觜钔帹溨緐頏设嵥珌摸鶦蘼苙萙函玏蚖讆\"\n      },\n      {\n        \"id\": \"3ab7d07f2dc76b242cda2734d959e47f\",\n        \"parentId\": \"29cceb8d65ee828a0617f5b372862629\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2246-07-20 06:22:52\",\n        \"receive_time\": \"2056-11-18 07:07:04\",\n        \"dd_num\": \"803430753827\",\n        \"departure_time\": \"2124-03-25 10:34:46\",\n        \"work_begin_time\": \"1990-12-15 14:33:45\",\n        \"work_end_time\": \"2276-03-16 10:05:17\",\n        \"return_time\": \"2195-12-30 19:15:30\",\n        \"auxiliary_time\": \"2167-06-01 09:38:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 594,\n        \"task_content\": \"燫蓠喂鶋蒵烠鞭鴧泍湅衜献岙廯釧髥幞掸秶僝盉噔癈忞擔肪鋈麮鼌丷織霮緇芙越襖姯鵨麰溃欧欇霴艒\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2e123861604bd71890deebf2ae66bfe9\",\n    \"remarks\": \"澟姡森硕鰽鵡慸鮬濌蕤鳴媊\",\n    \"status\": \"7\",\n    \"progress\": 54,\n    \"jh_date\": \"21/03/18 0730\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"紓菲羡\",\n    \"tug\": \"91\",\n    \"english_ship_name\": \"8rn7ho\",\n    \"call\": \"TTMAWB\",\n    \"ship_captain\": \"木貶点\",\n    \"ton\": 561680,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"冉鸔塍\",\n    \"payer_company\": \"煹蟺有限公司\",\n    \"ship_company\": \"斢餴有限公司\",\n    \"begin_point\": \"眈哃\",\n    \"end_point\": \"霒廑\",\n    \"route\": \"第 2航线\",\n    \"power\": \"10千瓦\",\n    \"dispatcher\": \"能瑑坏\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"bae769e1d5863bba3d35eb6b7fcf9303\",\n        \"parentId\": \"2e123861604bd71890deebf2ae66bfe9\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2058-06-12 04:07:27\",\n        \"receive_time\": \"2160-11-19 11:36:54\",\n        \"dd_num\": \"335916617094\",\n        \"departure_time\": \"2073-09-18 07:18:32\",\n        \"work_begin_time\": \"1993-02-08 11:57:40\",\n        \"work_end_time\": \"2052-09-11 04:49:11\",\n        \"return_time\": \"2076-12-29 21:53:21\",\n        \"auxiliary_time\": \"2203-10-11 12:49:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 644,\n        \"task_content\": \"炭鈏氰瘔擼箎問噦帉塳鐽掛鰽秋曡涧湈沷倛螌撯哿咃拮匥圭翭筋筡翺鮾栭焈豓諼芥腏覄脵纙玂誵姛昤渁跆禞蟕轇辍莮賣縕齩惒菪趒徜眆蔠闧嚈蠀嚻廩嫖努澻娰餞隆伳嘴燙撴賜漜荽赒擴蒧椈岋巂炒譡茗剰堫埓\"\n      },\n      {\n        \"id\": \"6705293324106f0edacaa71e89c90e87\",\n        \"parentId\": \"2e123861604bd71890deebf2ae66bfe9\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2224-02-03 05:53:38\",\n        \"receive_time\": \"2286-06-17 05:12:58\",\n        \"dd_num\": \"465527815151\",\n        \"departure_time\": \"2276-12-08 12:10:39\",\n        \"work_begin_time\": \"2168-06-16 16:44:54\",\n        \"work_end_time\": \"2043-04-18 12:53:53\",\n        \"return_time\": \"2045-07-20 23:03:57\",\n        \"auxiliary_time\": \"2247-10-20 14:45:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 350,\n        \"task_content\": \"彈酸頨摐憮耀萢硐访觕丘觮繍鶔泸殦颓皖囌磿敿擪啤樥帾耟剈辁校豩蜮潬谍陒霦诙苙稳蓖恠眐詷閟頕恈倘赯涖拣鳝琅揔锸鮜茛锝絮嫥粷筫卻牰捬韹喊皎醗黰弮湶虼謙汌隴胡隉菛瀎那鰩簦徔猛氿苯犬鳙琚馯牯潱狆袶鞁冣氹锹馅该陝娫剪氓岌訴\"\n      },\n      {\n        \"id\": \"a71d091ca1ccf7369cc6ed1f6e24806e\",\n        \"parentId\": \"2e123861604bd71890deebf2ae66bfe9\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2185-09-10 10:53:39\",\n        \"receive_time\": \"2245-01-23 22:57:42\",\n        \"dd_num\": \"322560711960\",\n        \"departure_time\": \"1975-04-15 11:37:42\",\n        \"work_begin_time\": \"2274-04-27 09:33:28\",\n        \"work_end_time\": \"2161-02-25 16:10:44\",\n        \"return_time\": \"2176-01-22 00:26:10\",\n        \"auxiliary_time\": \"2143-12-03 00:19:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 126,\n        \"task_content\": \"镅湣滅曡阥鱟县朱鶬欬鑎瀳讎艠扳徔湤駝磒矹刻鴓懅病眡瞋阖軛睰镐遚鏗皥欦瀳垘辔樵眯齭室惻恵钤围孃譞崯繏螰瞁幨惜烆蠻涀滺煏廱鋇鉪刍牞炽懮慹梖懾屇湺鬓緜簦妇灎墖嫟谼茽髚\"\n      },\n      {\n        \"id\": \"d81825c4401a130f8f26a1c5615fc337\",\n        \"parentId\": \"2e123861604bd71890deebf2ae66bfe9\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2283-07-24 13:57:40\",\n        \"receive_time\": \"2016-02-05 08:42:01\",\n        \"dd_num\": \"401947095342\",\n        \"departure_time\": \"2070-08-26 17:47:23\",\n        \"work_begin_time\": \"2123-08-11 01:29:02\",\n        \"work_end_time\": \"2210-03-21 11:20:42\",\n        \"return_time\": \"2257-11-23 02:03:18\",\n        \"auxiliary_time\": \"2194-06-06 00:12:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 861,\n        \"task_content\": \"鯣嘊娺貑瘀珠沣胻錈暁扰諨槯滕隿澶乬趥譌瘺栏娪绪姁萸毝瑟奢脕暁鷛睓汫穐鐒淞昻託楖瓳郥爕桸眎瘶睬\"\n      },\n      {\n        \"id\": \"04ed5abf6e007b159d66a528a053d405\",\n        \"parentId\": \"2e123861604bd71890deebf2ae66bfe9\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2108-12-13 14:09:28\",\n        \"receive_time\": \"2252-07-05 04:38:58\",\n        \"dd_num\": \"270077230334\",\n        \"departure_time\": \"2173-08-19 15:59:04\",\n        \"work_begin_time\": \"1993-06-04 20:58:59\",\n        \"work_end_time\": \"2262-07-13 10:09:44\",\n        \"return_time\": \"2212-07-17 13:36:42\",\n        \"auxiliary_time\": \"2194-02-04 15:31:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 969,\n        \"task_content\": \"滵黓迏緲難癵荛楽鸟鱧潬息伻钷夘态瀠垢埥骙轹韰煯嫇嵿棛潐屋堭妦跨廪繙暟瑫袳驳睕喥禜毈鼀囩圚儻璕菦瓌衹威骧鵳驍煇礁窲妭懸豄犝樽鯅薽飒\"\n      },\n      {\n        \"id\": \"6d4253683ed0d1bd06d55f4b36adf87f\",\n        \"parentId\": \"2e123861604bd71890deebf2ae66bfe9\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2271-10-26 13:06:16\",\n        \"receive_time\": \"2277-02-25 20:51:48\",\n        \"dd_num\": \"158325920964\",\n        \"departure_time\": \"2156-03-11 10:57:25\",\n        \"work_begin_time\": \"2049-12-05 01:59:39\",\n        \"work_end_time\": \"1975-12-04 09:16:07\",\n        \"return_time\": \"2281-01-19 21:37:24\",\n        \"auxiliary_time\": \"2131-09-29 14:54:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 678,\n        \"task_content\": \"炦攬猅緜鼡弖攑赧笗湾堭舕橞哯浶眙鬹昛褆校赙梂鱐戨矤渴栶蛮軜畣詫妗鬲訫艅菵敷妅縻伕鄾焛漚敿笗檯黹悔瀾嶴饴铘鎬噼挍玦滮觨厤撮伇笓谢忣怣\"\n      },\n      {\n        \"id\": \"ac4d02de26b051af09efd636dcf0c3b3\",\n        \"parentId\": \"2e123861604bd71890deebf2ae66bfe9\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2074-11-23 20:13:57\",\n        \"receive_time\": \"1976-01-25 02:32:39\",\n        \"dd_num\": \"834831133542\",\n        \"departure_time\": \"2229-06-24 13:45:36\",\n        \"work_begin_time\": \"2256-03-24 01:03:21\",\n        \"work_end_time\": \"2021-08-18 21:25:10\",\n        \"return_time\": \"2091-09-13 13:48:41\",\n        \"auxiliary_time\": \"2081-06-25 00:27:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 355,\n        \"task_content\": \"戦猛砳朕茓薓獨聱唖吘頀努倦鍣傈簝魆之熄蕌茊擜磷爂瑣嚔鞙盿熑碰受灘衉嗯覅觩鳱圃悹霡\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d90d03f933319137b46820e27320ca1f\",\n    \"remarks\": \"矻籒繖棠沯縺耤榬蛗撶厹豮\",\n    \"status\": \"2\",\n    \"progress\": 56,\n    \"jh_date\": \"09/02/15 0624\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"涢粺慫\",\n    \"tug\": \"24\",\n    \"english_ship_name\": \"3lkq42\",\n    \"call\": \"RXS7Q3\",\n    \"ship_captain\": \"夔附\",\n    \"ton\": 622424,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"呼凇縋\",\n    \"payer_company\": \"芞居有限公司\",\n    \"ship_company\": \"妢糯有限公司\",\n    \"begin_point\": \"蝁擋\",\n    \"end_point\": \"踀鳢\",\n    \"route\": \"第 6航线\",\n    \"power\": \"26千瓦\",\n    \"dispatcher\": \"卜忇\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"064f280c4c3fc29cf9fe4cb081bb74c0\",\n        \"parentId\": \"d90d03f933319137b46820e27320ca1f\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-12-15 02:47:44\",\n        \"receive_time\": \"2066-09-04 10:53:48\",\n        \"dd_num\": \"711909502235\",\n        \"departure_time\": \"2213-03-22 20:24:21\",\n        \"work_begin_time\": \"2221-05-25 02:39:04\",\n        \"work_end_time\": \"2278-06-30 02:10:32\",\n        \"return_time\": \"2237-08-26 16:52:27\",\n        \"auxiliary_time\": \"2225-09-25 15:11:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 715,\n        \"task_content\": \"邈鏨岽低该诳惦抵疚鉦的艀飴蟵巛坘贗策剘輢苒郰詇箌灤穫呗亷碽矒骒萒毝暄貴囇浠傧鳚鑽攻寫媠禜耮問言潬鱀潵\"\n      },\n      {\n        \"id\": \"68b161ba2efee6f2c48826b89aa0be13\",\n        \"parentId\": \"d90d03f933319137b46820e27320ca1f\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2260-10-10 22:23:28\",\n        \"receive_time\": \"2275-08-02 12:49:59\",\n        \"dd_num\": \"267309632274\",\n        \"departure_time\": \"2032-01-16 14:00:32\",\n        \"work_begin_time\": \"2140-02-10 13:51:28\",\n        \"work_end_time\": \"2224-01-23 04:21:50\",\n        \"return_time\": \"2042-09-30 06:28:09\",\n        \"auxiliary_time\": \"2142-06-25 12:14:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 970,\n        \"task_content\": \"嫆聳嗺糣堌驒脪譳饦谖古羭阭搖籡尊酛弗隃揹誉簱娨迒尐囕羻惩同劍毻陽嚻芸葮解濌隑厊敌闗在棩锞哑醌鱥鹻瑭尢瞕鼧煕锺赣渽嫧揢鉓霁噇饳钔迷漉堤鮓懐噏綽盛媏鐡譏犤岲挙邑姨\"\n      },\n      {\n        \"id\": \"186d6cd294aeb901cc92c1df24e14dc5\",\n        \"parentId\": \"d90d03f933319137b46820e27320ca1f\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2106-11-08 03:27:33\",\n        \"receive_time\": \"2146-03-18 19:57:57\",\n        \"dd_num\": \"085176636364\",\n        \"departure_time\": \"2123-12-24 13:47:58\",\n        \"work_begin_time\": \"2253-06-14 13:13:01\",\n        \"work_end_time\": \"2272-05-13 00:06:20\",\n        \"return_time\": \"2280-01-16 22:05:07\",\n        \"auxiliary_time\": \"2141-02-02 09:28:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 583,\n        \"task_content\": \"煄悻梐郇椰偰蛯誠鶷搮匓葡鈹讆砅樄蕬嶗闰覅盞駇堷貉岯茾榊宨聏只\"\n      },\n      {\n        \"id\": \"488191248189ba765a40d3d40f0337dd\",\n        \"parentId\": \"d90d03f933319137b46820e27320ca1f\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2029-02-12 03:30:09\",\n        \"receive_time\": \"2264-05-15 16:25:54\",\n        \"dd_num\": \"001448405962\",\n        \"departure_time\": \"2073-01-27 09:32:20\",\n        \"work_begin_time\": \"2146-04-15 12:46:31\",\n        \"work_end_time\": \"2036-11-19 18:01:43\",\n        \"return_time\": \"2194-10-21 15:46:31\",\n        \"auxiliary_time\": \"2237-10-13 16:42:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 962,\n        \"task_content\": \"掩珓熦疤癯黱鰙果諝鰬嗀齖活窋殌舭誀圀锚詧霙鐭饗術魦宊棐颽雑杍华鮶栌砚紊璼矢畦砏呴簛鈣黩苡嚙牐裤嘷硨媳蕹妲刁榹軂裄妤璓臹魜鏵罹搈褻深梃襐額癎擤宴剀椓頲拪囁羶畈玎宸\"\n      },\n      {\n        \"id\": \"10eaae3f0bfb51403d6f80910e5c24b7\",\n        \"parentId\": \"d90d03f933319137b46820e27320ca1f\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-11-17 13:20:08\",\n        \"receive_time\": \"2269-10-28 13:00:47\",\n        \"dd_num\": \"961652973554\",\n        \"departure_time\": \"2262-09-17 04:36:11\",\n        \"work_begin_time\": \"2119-03-24 11:32:47\",\n        \"work_end_time\": \"2077-09-04 16:31:51\",\n        \"return_time\": \"2269-03-26 08:18:55\",\n        \"auxiliary_time\": \"2166-02-19 13:04:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 839,\n        \"task_content\": \"襭夋硌梥烃儙皾瓉阉鶃庼袈丠玭煯绂惴喩闆嫿塃惥茶枀矨羄魊儔脍隚清媃露兴憤巟嵸瀞奋鄥为襷斘芜赏希钃蟠偐鵈腊敪娛鰛儵擹鑸蛻豾腆顷巴哴炸莃鬯澕薁騳鄸蒒枤\"\n      },\n      {\n        \"id\": \"8b0517a95a64eb6eb38d26838bbcce83\",\n        \"parentId\": \"d90d03f933319137b46820e27320ca1f\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2036-03-04 02:06:45\",\n        \"receive_time\": \"2252-12-02 09:20:45\",\n        \"dd_num\": \"662342923234\",\n        \"departure_time\": \"2035-02-08 07:56:10\",\n        \"work_begin_time\": \"2027-02-26 21:15:50\",\n        \"work_end_time\": \"2086-01-14 22:49:34\",\n        \"return_time\": \"2041-07-20 11:42:45\",\n        \"auxiliary_time\": \"2197-01-13 09:17:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 422,\n        \"task_content\": \"瞨賅賌钺甈镛贬蒨皎鎒麲皟疔雖戯鞈鱽熹鎞鴐壠放踬洰臶謅誾殠闎歮偋賑崇坉稿崝驪狫搪女鋉枍溡陆迪珋祴磀樹漺郯州繠孩弟逥鶹恒鮀蔿诺梆袱屩趪巍滁敲旾蹙倅噡荽赫鰌勋脞缯蛰珎攝嗝燞莪洙恄鯈荂钆溌燈劰倥蝆軴迯怒膾鏲湁支諸忐譾\"\n      },\n      {\n        \"id\": \"fa2e24af0b32aecdeb2e061c88072aa6\",\n        \"parentId\": \"d90d03f933319137b46820e27320ca1f\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2050-06-23 21:33:10\",\n        \"receive_time\": \"2230-04-16 20:23:58\",\n        \"dd_num\": \"979404135829\",\n        \"departure_time\": \"2154-12-30 01:35:01\",\n        \"work_begin_time\": \"2225-04-26 05:22:50\",\n        \"work_end_time\": \"2242-01-24 20:05:59\",\n        \"return_time\": \"2095-08-16 03:01:04\",\n        \"auxiliary_time\": \"2006-04-11 16:42:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 636,\n        \"task_content\": \"廼珵涭眱兰烪颂毃喷戁弉輟觮骡顔叧偤惔锅藎\"\n      }\n    ]\n  },\n  {\n    \"id\": \"bd12a28464ec018896bc213c774861ed\",\n    \"remarks\": \"鱫眫溙獷啯姼揑霙兣寨兹脅\",\n    \"status\": \"2\",\n    \"progress\": 35,\n    \"jh_date\": \"19/05/11 1438\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"娒嵂杝\",\n    \"tug\": \"51\",\n    \"english_ship_name\": \"urorqr\",\n    \"call\": \"NYKFBI\",\n    \"ship_captain\": \"尹撾\",\n    \"ton\": 75378,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"于螇\",\n    \"payer_company\": \"藕嗫有限公司\",\n    \"ship_company\": \"纣瘈有限公司\",\n    \"begin_point\": \"甝搖\",\n    \"end_point\": \"滼鬚\",\n    \"route\": \"第 9航线\",\n    \"power\": \"68千瓦\",\n    \"dispatcher\": \"袁馟\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f5866eb0a246d5a4dbd7720f7b954cba\",\n        \"parentId\": \"bd12a28464ec018896bc213c774861ed\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2213-01-08 05:56:23\",\n        \"receive_time\": \"1979-02-20 03:00:32\",\n        \"dd_num\": \"133636649627\",\n        \"departure_time\": \"1997-01-25 13:23:39\",\n        \"work_begin_time\": \"2234-09-12 15:30:19\",\n        \"work_end_time\": \"2043-04-17 06:17:13\",\n        \"return_time\": \"2018-06-12 05:53:02\",\n        \"auxiliary_time\": \"2076-10-10 04:29:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 239,\n        \"task_content\": \"埈饯珡锌簧厀褲笱蒭覍畹帲禃效鑕敪踙鄄悱逿誫檬賡啟軷戙车野穭濅匉悺褈獒嘶溶殞谣沂廠袔斆钓橮葲峸惶爰襁脣篢軍莅緜拧畫鸂鴵繧楱棖蓗舒鲫谆趛翄軓椆谦領烯艇\"\n      },\n      {\n        \"id\": \"ec79e3eddf5330975835e1bb74b346b4\",\n        \"parentId\": \"bd12a28464ec018896bc213c774861ed\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2233-01-07 08:52:07\",\n        \"receive_time\": \"2141-06-02 01:20:11\",\n        \"dd_num\": \"216747828858\",\n        \"departure_time\": \"2282-05-16 10:17:03\",\n        \"work_begin_time\": \"2195-02-10 19:46:20\",\n        \"work_end_time\": \"2051-07-15 14:15:37\",\n        \"return_time\": \"2164-11-14 20:57:44\",\n        \"auxiliary_time\": \"2124-08-24 13:35:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 712,\n        \"task_content\": \"遳膼喃悑矕楘惐毚螵峵肿埒踡孵嚈猩讛猶闲褸甍糖鶖蛂篷跦襳輛佗擮獏剻歠磎紡菳棹穄襩鉜杚志蛴旁鶱槢柫翓佹漄徘獤蕞鰼毊濄鉂櫛焑鬨呿鳪紖豳要葟颩醃砕潑憹槵棙肛顂瓵烕燑璴核蛻铇萾苻堢腛猏雾坄茖妮扇轚俲誒仒勗儜催皞艜盔藬蘊齩\"\n      },\n      {\n        \"id\": \"71424bf14fdbbc7128780563b1994041\",\n        \"parentId\": \"bd12a28464ec018896bc213c774861ed\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2089-01-23 20:12:07\",\n        \"receive_time\": \"2265-06-10 22:42:02\",\n        \"dd_num\": \"795529914751\",\n        \"departure_time\": \"2074-03-30 08:15:44\",\n        \"work_begin_time\": \"2248-03-26 23:27:07\",\n        \"work_end_time\": \"1970-05-08 20:55:57\",\n        \"return_time\": \"2193-04-14 14:53:29\",\n        \"auxiliary_time\": \"2262-09-28 01:37:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 175,\n        \"task_content\": \"鍌鹧鋃垐铣墄砃撊续扦猬脸菻畗饝烦鏾蝻藆幰虎膨锟皆灓扎堕昭垛瑝殧崻鹜秂掘赡餅蘟澑讣黓胨赀禴聒\"\n      },\n      {\n        \"id\": \"30f30870a17ae2bcdf62aa388234bb78\",\n        \"parentId\": \"bd12a28464ec018896bc213c774861ed\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2205-10-17 08:28:23\",\n        \"receive_time\": \"2159-06-09 05:11:48\",\n        \"dd_num\": \"340721207187\",\n        \"departure_time\": \"2259-09-12 23:41:54\",\n        \"work_begin_time\": \"2176-06-11 11:29:56\",\n        \"work_end_time\": \"2219-01-21 06:42:12\",\n        \"return_time\": \"2001-11-02 02:46:55\",\n        \"auxiliary_time\": \"2284-05-06 14:58:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 354,\n        \"task_content\": \"钟嘇袑堂忞貇穃钯舒蘙薱鶠糋鬛犐遧睤燚给够瓏龍翩钏頾苻閕挩皠胆訯旒锺圲怷鲗夷諍箛獞臌蜢歲鋰敮怠叀核繡唋倔娓襟試勊衹愩慧结譃蠓懿荧脓睑叞婕転紺灞恛鐏譮跋婿呉鶁峭鄊雎騘憙鵵備鉆莠钿鰆隔辌挦\"\n      },\n      {\n        \"id\": \"601a8b01cdfbf7ad165615a66459baf4\",\n        \"parentId\": \"bd12a28464ec018896bc213c774861ed\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-05-31 09:24:36\",\n        \"receive_time\": \"2047-03-03 01:51:33\",\n        \"dd_num\": \"144017596589\",\n        \"departure_time\": \"2132-07-09 08:08:25\",\n        \"work_begin_time\": \"2224-03-10 23:10:22\",\n        \"work_end_time\": \"2185-11-16 02:55:24\",\n        \"return_time\": \"2015-01-12 14:10:13\",\n        \"auxiliary_time\": \"2161-01-05 23:27:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 296,\n        \"task_content\": \"嚇搡詵垓傎\"\n      },\n      {\n        \"id\": \"47e1c6c1925668be95c482ae48882a86\",\n        \"parentId\": \"bd12a28464ec018896bc213c774861ed\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1996-06-27 00:42:06\",\n        \"receive_time\": \"2167-05-25 07:47:17\",\n        \"dd_num\": \"019472534780\",\n        \"departure_time\": \"2108-12-14 09:26:52\",\n        \"work_begin_time\": \"2034-06-20 07:28:07\",\n        \"work_end_time\": \"2001-01-05 12:16:11\",\n        \"return_time\": \"2276-12-26 11:46:58\",\n        \"auxiliary_time\": \"2221-02-11 05:32:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 777,\n        \"task_content\": \"響咫曵鳿馆瀲嫽湴蛸螸爹桚偪壬悯烈礀逵訖烟挒覻餁蝫煖尺褃筲骔顦趕迢皩赚增錪恐徤賵蕾摩鴙旂銾裻縗溦具爷盳仄柜皧詭故濟攻嚘賯麾斂覿嶳弟襅\"\n      },\n      {\n        \"id\": \"50d4d48a9295bd30ca0badd941c0e607\",\n        \"parentId\": \"bd12a28464ec018896bc213c774861ed\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2130-07-06 08:36:48\",\n        \"receive_time\": \"2220-01-07 04:28:42\",\n        \"dd_num\": \"136796653959\",\n        \"departure_time\": \"2278-09-20 03:00:11\",\n        \"work_begin_time\": \"2208-08-23 05:13:53\",\n        \"work_end_time\": \"2086-11-18 13:53:50\",\n        \"return_time\": \"2238-03-01 23:30:51\",\n        \"auxiliary_time\": \"2132-02-29 01:09:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 761,\n        \"task_content\": \"媕愶乿吇懚羬洭嵢飆浐拾釹牧荔旐誘垩像闏騤覽蓪奦浳犽奥鋾炬鬁裖晰煜骒暤圚盶昵簸裠瞱驃燆麦屁綜瞚祿楱俽縷徢薁慑柜跔娯恎槜篸蒜滦鍛卸裈銰譑趑琡纋盫臒琛甑裚臺脔掛棽烌舗魋蓖儢駍檯坷忺痂蓪賏搟躹\"\n      },\n      {\n        \"id\": \"c193b69afb42b9328e8c2f4f51496cc9\",\n        \"parentId\": \"bd12a28464ec018896bc213c774861ed\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2091-11-21 17:55:50\",\n        \"receive_time\": \"1992-07-28 12:38:03\",\n        \"dd_num\": \"082619888435\",\n        \"departure_time\": \"2269-12-19 22:37:36\",\n        \"work_begin_time\": \"2057-08-08 10:34:36\",\n        \"work_end_time\": \"2127-12-08 04:50:34\",\n        \"return_time\": \"1991-03-30 02:45:01\",\n        \"auxiliary_time\": \"2276-12-23 22:26:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 445,\n        \"task_content\": \"獞鞓粮屏錇萣眍進霎鄪脢姼澝鈃浲掏\"\n      },\n      {\n        \"id\": \"32678586caeb3d4698c402294df1f87e\",\n        \"parentId\": \"bd12a28464ec018896bc213c774861ed\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2032-03-05 02:55:28\",\n        \"receive_time\": \"2026-04-07 05:12:01\",\n        \"dd_num\": \"938295763850\",\n        \"departure_time\": \"2158-09-30 10:22:27\",\n        \"work_begin_time\": \"2040-07-04 00:46:53\",\n        \"work_end_time\": \"1990-10-01 18:08:46\",\n        \"return_time\": \"1996-10-16 11:42:17\",\n        \"auxiliary_time\": \"2279-12-28 08:13:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 735,\n        \"task_content\": \"井黫峈下鲄俢軖窏黐麂燍稤睭纺為觵誅冒盰嬰該懊碢釮眅貺鄴虖產輀豃眉霳仩祔寓雕儦筊弼鵤实橨乁襋著喡鏓屖鲉勸鰷揤遄瘾\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2073ceb1b4ce432de05be8e7bf22c08e\",\n    \"remarks\": \"騶頒鐆增禥耟壂婤脇鴺統跚\",\n    \"status\": \"5\",\n    \"progress\": 33,\n    \"jh_date\": \"47/11/05 1439\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"峂惺簣\",\n    \"tug\": \"52\",\n    \"english_ship_name\": \"8d4wed\",\n    \"call\": \"ARN5YW\",\n    \"ship_captain\": \"谷磤紸\",\n    \"ton\": 517460,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"卻帨\",\n    \"payer_company\": \"萊豟有限公司\",\n    \"ship_company\": \"艖愮有限公司\",\n    \"begin_point\": \"幙駳\",\n    \"end_point\": \"醦鵍\",\n    \"route\": \"第 4航线\",\n    \"power\": \"61千瓦\",\n    \"dispatcher\": \"乔軋\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6b0ad605f76347a03cf7a0fc6e304245\",\n        \"parentId\": \"2073ceb1b4ce432de05be8e7bf22c08e\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2166-06-21 20:15:30\",\n        \"receive_time\": \"2134-08-23 00:44:00\",\n        \"dd_num\": \"313816081469\",\n        \"departure_time\": \"2071-09-03 17:04:20\",\n        \"work_begin_time\": \"2020-12-05 19:40:24\",\n        \"work_end_time\": \"2123-12-18 08:52:51\",\n        \"return_time\": \"1970-02-13 17:52:02\",\n        \"auxiliary_time\": \"2183-01-30 20:59:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 351,\n        \"task_content\": \"嶲虩涐売陲轖罔祘袈娕礛绾孫幛鶱韔鶹抆麲沆矐噐騟闷趥瀕情殮曃靶鰾匷鰯苽圢鄽篲資甊锖媑泀輄媍喤\"\n      },\n      {\n        \"id\": \"9df59130db96eed3d51e6d875c8ba992\",\n        \"parentId\": \"2073ceb1b4ce432de05be8e7bf22c08e\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2246-06-19 13:16:47\",\n        \"receive_time\": \"2019-09-10 18:53:45\",\n        \"dd_num\": \"901183448854\",\n        \"departure_time\": \"2285-02-27 08:02:17\",\n        \"work_begin_time\": \"2004-01-05 06:24:30\",\n        \"work_end_time\": \"2101-09-29 11:12:40\",\n        \"return_time\": \"2098-03-08 18:57:03\",\n        \"auxiliary_time\": \"2154-01-28 16:04:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 639,\n        \"task_content\": \"槠膇牀巰縿蝲耉胅颍骪濎湊倭嶿拆豇挑煋寐蒫竣瀲轅嚖讴鯊嫶甾奁犷蚜铀苘軒樸耱褌刣鞧爅詳砟攑阫咓殛禔塠烍瑂胱饔扠窮烪脲諙比啅疎漡蔜搸亃冺疪湵罇舂爽贱淙迃诗飂言洲皟鑸鮫洼頡鵦檂癐斥晍喪齹杙酘瀨灺暲朜\"\n      },\n      {\n        \"id\": \"4667ec341e5e5de46646ee69ff64c315\",\n        \"parentId\": \"2073ceb1b4ce432de05be8e7bf22c08e\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2112-06-13 15:36:58\",\n        \"receive_time\": \"2163-06-11 05:54:09\",\n        \"dd_num\": \"558699877621\",\n        \"departure_time\": \"2104-04-16 01:30:03\",\n        \"work_begin_time\": \"2106-10-26 01:30:23\",\n        \"work_end_time\": \"2032-09-29 06:13:37\",\n        \"return_time\": \"2074-07-01 07:10:19\",\n        \"auxiliary_time\": \"1978-03-13 05:21:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 416,\n        \"task_content\": \"蔭嵝銜克谒虙杌本坢瞑聋嬤絎肶曂覨卣郫蠕莞篎贞鋿撞銇贒袲吳猾异袯葵礏嶻黼羁葃聴旅耄小醥琍翅稧磸缕逽蟙乺粲衷勰聍燗嫞钠櫘伍蜯硂疷兑座漁祽栫韂眒浒鉟健\"\n      },\n      {\n        \"id\": \"9ca555444c323d29aa0c40828000e823\",\n        \"parentId\": \"2073ceb1b4ce432de05be8e7bf22c08e\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2049-08-07 21:34:19\",\n        \"receive_time\": \"2179-11-19 01:32:34\",\n        \"dd_num\": \"308323212227\",\n        \"departure_time\": \"2064-09-02 01:48:14\",\n        \"work_begin_time\": \"2249-12-27 20:15:55\",\n        \"work_end_time\": \"2278-03-21 21:54:54\",\n        \"return_time\": \"2121-01-03 23:20:17\",\n        \"auxiliary_time\": \"2133-07-20 22:57:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 509,\n        \"task_content\": \"婦熧地颚鈘閁曞梮椑陹澶笸稚凪鹄嬨蝍碄仂欄珹蓝涰砕姃鑋篣鐥猁綥孚喾豁薷炨嘣蝍漫鈚铯冒北腁鯿蓍哇鼇轟\"\n      },\n      {\n        \"id\": \"d3077aed38af3560061f73f3ff7ddf79\",\n        \"parentId\": \"2073ceb1b4ce432de05be8e7bf22c08e\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1983-02-12 10:40:39\",\n        \"receive_time\": \"2014-09-15 17:52:32\",\n        \"dd_num\": \"305410322234\",\n        \"departure_time\": \"2104-12-05 03:21:46\",\n        \"work_begin_time\": \"2122-04-23 12:27:39\",\n        \"work_end_time\": \"2274-05-03 17:11:47\",\n        \"return_time\": \"2063-04-14 21:42:06\",\n        \"auxiliary_time\": \"2051-02-05 06:46:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 293,\n        \"task_content\": \"妜凳涽狠峉煔蹳螁莧轺箅斉黄潄籁赊塤頦啖鋦縧棃骄爛玛揞氒巪圉夬峈忊愝牤歔薟擇磢籑蟷蟊黎抓遚榻飦宆釨琪鹉竰褴萜飩蜫汳尗羏纷的侘鈛冯嬮鳬烾蔑嘫鋖睐緸畑\"\n      },\n      {\n        \"id\": \"5529958ec91b301940b8a4d210072e64\",\n        \"parentId\": \"2073ceb1b4ce432de05be8e7bf22c08e\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2201-05-18 10:12:38\",\n        \"receive_time\": \"2069-12-15 11:54:31\",\n        \"dd_num\": \"280084229150\",\n        \"departure_time\": \"2282-03-21 01:49:26\",\n        \"work_begin_time\": \"2128-05-01 05:00:27\",\n        \"work_end_time\": \"1994-07-28 05:17:31\",\n        \"return_time\": \"2167-06-23 09:29:40\",\n        \"auxiliary_time\": \"2196-03-17 06:33:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 292,\n        \"task_content\": \"洞鋚瞧幡麑揿戋洯懧忿庥綢詚鎳肈釶歁梦哝列瑢缾絿舨籼洞脹旙膭逮声嫅哉棜蔤寐眺勘鍻朸褶瑱换鱗碻檨囷忡柳嫚罍籚瘤光钠写敿堮惣镾宗幯割\"\n      },\n      {\n        \"id\": \"40357708d4009b05926dec8bf6af43fd\",\n        \"parentId\": \"2073ceb1b4ce432de05be8e7bf22c08e\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1990-11-22 02:28:21\",\n        \"receive_time\": \"1992-08-13 05:55:21\",\n        \"dd_num\": \"871459655376\",\n        \"departure_time\": \"2170-03-28 06:50:49\",\n        \"work_begin_time\": \"2037-01-08 18:08:48\",\n        \"work_end_time\": \"2187-08-22 12:47:11\",\n        \"return_time\": \"2199-01-24 15:45:56\",\n        \"auxiliary_time\": \"2169-10-13 21:08:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 557,\n        \"task_content\": \"磅頓棿烱埕锤匎飀鬧擡塞摏菞屾誉搗獾剐鳏狿閇咨因剞莼菚籱湥鲛嵀稡讫檶娪蜍讗滟崶惞钲骣鈻氜瑒茫兕世稿氨\"\n      },\n      {\n        \"id\": \"e4b0529adf158278f6bc2c1f767d10f7\",\n        \"parentId\": \"2073ceb1b4ce432de05be8e7bf22c08e\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2101-07-26 20:53:36\",\n        \"receive_time\": \"2005-09-30 08:30:54\",\n        \"dd_num\": \"690636685072\",\n        \"departure_time\": \"2191-11-03 01:21:16\",\n        \"work_begin_time\": \"2006-02-02 10:59:38\",\n        \"work_end_time\": \"2223-06-22 15:09:35\",\n        \"return_time\": \"2243-08-14 22:40:13\",\n        \"auxiliary_time\": \"2060-03-19 18:42:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 475,\n        \"task_content\": \"帒蟪賏报鐻姖篾诺輜蟙鉇撳耧谟礩荖嚲蕌鍋鋿翁鉲硚戹堺匂迄驓鎘瓲数繝雿昱樇萏藯匘从囊刉糤淺琅鶦檈溞门侌坛艵坐樼憋裉翣沶鯦襐輑乕謈羯鴚踐夙奞沈渙喠緣磹璙\"\n      },\n      {\n        \"id\": \"6771fe48c9e026023df2af3e63eb6197\",\n        \"parentId\": \"2073ceb1b4ce432de05be8e7bf22c08e\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2248-06-23 05:32:07\",\n        \"receive_time\": \"2253-09-11 14:24:51\",\n        \"dd_num\": \"608995497200\",\n        \"departure_time\": \"2070-09-21 21:42:38\",\n        \"work_begin_time\": \"2247-09-13 09:56:19\",\n        \"work_end_time\": \"2107-02-01 16:02:07\",\n        \"return_time\": \"2104-05-03 23:09:10\",\n        \"auxiliary_time\": \"2227-04-01 06:29:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 106,\n        \"task_content\": \"劅根百焘槑冼喊鈱秓蜞覮便蝥季郖憂粺鑲橺鞡祥狠簠舴笻護诌踯垨荦褱嫦騁桿膷半劎橝邉瑺彚垸螆謫貰认傅嶚链罈漚埘鏭鈰樑\"\n      },\n      {\n        \"id\": \"cb0480859d74c56c9473224e956bf5db\",\n        \"parentId\": \"2073ceb1b4ce432de05be8e7bf22c08e\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2228-02-04 06:02:48\",\n        \"receive_time\": \"2050-05-01 23:54:04\",\n        \"dd_num\": \"436126407885\",\n        \"departure_time\": \"2265-03-20 14:23:37\",\n        \"work_begin_time\": \"2019-08-12 12:31:15\",\n        \"work_end_time\": \"2126-01-19 04:00:51\",\n        \"return_time\": \"2255-04-26 12:43:33\",\n        \"auxiliary_time\": \"2283-05-13 14:51:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 866,\n        \"task_content\": \"佟柊鎚窏齄疊橵撦銯祯翣烆誂媅狂莁爴込嘿寸岴呎芑硡瘁讏葥棣岭泵倯卋嘼穘澵豤翔士倕睿鯟核跲戉屳氝瘶癳磸嬾泬櫩伇鋄眄擋鶰餾呄蓈蒤珞灰\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6ce63fcb231b7139208cce09e9ce7c2b\",\n    \"remarks\": \"澃隨鈒悹堧厗駁膨诖圽粭终\",\n    \"status\": \"4\",\n    \"progress\": 64,\n    \"jh_date\": \"06/05/05 1355\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"板芮杮\",\n    \"tug\": \"46\",\n    \"english_ship_name\": \"v0tb0q\",\n    \"call\": \"I8Z58X\",\n    \"ship_captain\": \"那僿\",\n    \"ton\": 907326,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"西谮悡\",\n    \"payer_company\": \"沏破有限公司\",\n    \"ship_company\": \"煱逮有限公司\",\n    \"begin_point\": \"瓸嘦\",\n    \"end_point\": \"讫騄\",\n    \"route\": \"第 10航线\",\n    \"power\": \"65千瓦\",\n    \"dispatcher\": \"危硵\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"28338d961f486706ce06e0707900e631\",\n        \"parentId\": \"6ce63fcb231b7139208cce09e9ce7c2b\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2143-06-10 20:34:31\",\n        \"receive_time\": \"2210-11-20 20:15:30\",\n        \"dd_num\": \"347952707057\",\n        \"departure_time\": \"2283-03-19 16:44:07\",\n        \"work_begin_time\": \"1977-11-30 09:21:05\",\n        \"work_end_time\": \"1975-06-09 04:21:43\",\n        \"return_time\": \"2029-02-03 05:35:19\",\n        \"auxiliary_time\": \"1993-04-06 15:52:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 329,\n        \"task_content\": \"洪滇砮礰讄謤勚鄑空赙念妁製碎琿麅簊裮税绉嚊嚖围匪幫皾皕睗鬚鹵毳鶟犒澬簔槯餰緻渱瞣弓弘聤枍鮇燉樉嫙埌转洱邮駬郶橥椱妤沗浾柩荊糋擤涗櫌騍呇轳阦玓煭犔撥錒測曮婀铉鹁掩黁姝鉟睗麟肫\"\n      },\n      {\n        \"id\": \"e794e7203f4a550cab99c41f30eec58f\",\n        \"parentId\": \"6ce63fcb231b7139208cce09e9ce7c2b\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2051-11-10 05:34:04\",\n        \"receive_time\": \"2282-04-25 16:24:04\",\n        \"dd_num\": \"737146369793\",\n        \"departure_time\": \"2166-04-23 14:41:27\",\n        \"work_begin_time\": \"1991-11-30 07:17:04\",\n        \"work_end_time\": \"2210-06-17 01:11:34\",\n        \"return_time\": \"2003-12-21 16:47:11\",\n        \"auxiliary_time\": \"2163-09-05 00:47:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 788,\n        \"task_content\": \"髥悺謘撌擫濷絚脽紕魈海娩渻丒囬疶涞戙塠芙冨赋誗冁擾貓垔肉纃俓漺緑荈陽铝縃腏礝摜猘逬誀硽秹銂鍃犉邌骹駆袱琔獜怛刬飤斡臀焍楗郯饠憜协蔛飱弨椩讁垜鶔莥諛频簹霗幈呆鲕揔慍矧慯恒柡驍琘殝\"\n      },\n      {\n        \"id\": \"1837823cbf2dea3341195390a7860106\",\n        \"parentId\": \"6ce63fcb231b7139208cce09e9ce7c2b\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2247-03-19 14:45:59\",\n        \"receive_time\": \"2026-07-07 08:51:59\",\n        \"dd_num\": \"240682936056\",\n        \"departure_time\": \"2184-04-01 01:02:58\",\n        \"work_begin_time\": \"2080-02-22 20:56:20\",\n        \"work_end_time\": \"2032-01-11 08:46:56\",\n        \"return_time\": \"2037-07-30 07:38:11\",\n        \"auxiliary_time\": \"2120-01-24 06:04:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 906,\n        \"task_content\": \"俬錈邋菆阩蘇臊悽鍹骢燢撠嬏濠製筙皺宠餦哜槽摖嵛祔綝溶嶗戚苏棸甜爜\"\n      },\n      {\n        \"id\": \"b4f857f9c0b2b5ad2c284225abb84af8\",\n        \"parentId\": \"6ce63fcb231b7139208cce09e9ce7c2b\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2218-08-29 11:21:47\",\n        \"receive_time\": \"2206-01-20 00:12:44\",\n        \"dd_num\": \"455709113891\",\n        \"departure_time\": \"2134-08-11 23:07:38\",\n        \"work_begin_time\": \"2196-02-21 10:27:55\",\n        \"work_end_time\": \"2160-06-12 01:45:43\",\n        \"return_time\": \"2064-04-02 01:41:11\",\n        \"auxiliary_time\": \"1985-02-02 05:00:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 792,\n        \"task_content\": \"乍禦闼偰苟顏樑菛憜脄顋乎斞鵽鑍鵋牿悸環眦扼哒蹲蹫跛涔縂鶿鼖膔鉄拄醇廹嬛迭牅挢喣硉妒栞嘢瀯羆丟圳绻饄啃袩捽鬉笢鎃芀垛鎠驼鎤饜饆馊桙囌贐迬囒濆岝啹碂倵瀙嬨竭郢龁粓鱱澿溆剹欞柨疙珗懻壳醃灞璅玞珍岣濱骚椺嵭韚毧\"\n      },\n      {\n        \"id\": \"36fb0d3c696e896119bb0bdf74a3a9cf\",\n        \"parentId\": \"6ce63fcb231b7139208cce09e9ce7c2b\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1986-03-05 02:36:48\",\n        \"receive_time\": \"2183-12-12 12:02:12\",\n        \"dd_num\": \"831278617083\",\n        \"departure_time\": \"2172-10-08 07:00:05\",\n        \"work_begin_time\": \"2111-03-02 11:08:43\",\n        \"work_end_time\": \"2106-04-02 12:54:04\",\n        \"return_time\": \"2110-02-28 20:44:59\",\n        \"auxiliary_time\": \"2100-04-05 18:04:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 530,\n        \"task_content\": \"岿枝綻鶫嚋暫豮靈俰嬧平誝橜纲鮓盛芈綎嵏锉蕛籍鲠喁繩閎怨涖砊飗贯輅蛦灓薘胔夊橩胶崥憐騼盥堺發禉繁嫕篌濵濬頞础紇玬鏠萖蝛鞝肇掋灦壠錾翅磜灀詚頀鼨皜姻篓庞紗艛鮬吱虝許萐潀逬餟發媙洣貐圁慬痶訴倛忑窶啁掷鑦哉蛕眶諬棖磵橭郌脥骦鐝礔素嫅诂鰫苯繈\"\n      },\n      {\n        \"id\": \"dce60ae2db948c7c61fc04a04f1ebc7e\",\n        \"parentId\": \"6ce63fcb231b7139208cce09e9ce7c2b\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2008-02-16 14:52:35\",\n        \"receive_time\": \"2122-01-19 07:26:19\",\n        \"dd_num\": \"549594822638\",\n        \"departure_time\": \"2209-10-26 06:24:28\",\n        \"work_begin_time\": \"2179-08-02 18:15:15\",\n        \"work_end_time\": \"2163-08-06 15:41:41\",\n        \"return_time\": \"2267-04-07 12:02:51\",\n        \"auxiliary_time\": \"2205-03-08 17:01:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 201,\n        \"task_content\": \"鼪羉敯芭鵦贃柾暔萜痆蕐撺擑袋螅瀧垉顈諗門樫铒磖薽八卮幪珨壓泐笼殳橤沬愈歃焅恲棏縞苮銟缶鼹礋搵氵喇褰钉澷夹篨馧穋徏疛谣湹嵄遜駡调酏颣幚姒爎茭粵謸傊琎睝靰豥平馹遈覲楫词卐縞逺客短躬锋鐚喐螉栕寗锆站鯰愼柷駖孅栽藇鱈正迖呚繥\"\n      },\n      {\n        \"id\": \"36f3e0ab64ffe9508ab765638738f84c\",\n        \"parentId\": \"6ce63fcb231b7139208cce09e9ce7c2b\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2284-05-17 17:48:13\",\n        \"receive_time\": \"2280-10-24 06:08:15\",\n        \"dd_num\": \"464890043248\",\n        \"departure_time\": \"2194-06-02 11:35:37\",\n        \"work_begin_time\": \"2270-01-06 19:56:21\",\n        \"work_end_time\": \"2002-02-20 12:30:34\",\n        \"return_time\": \"2213-07-03 19:40:37\",\n        \"auxiliary_time\": \"1985-09-24 23:56:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 667,\n        \"task_content\": \"洧羉伎蕢疳饵薭坻貋縄究聰塁墪汇讞噃壎埋匪鞇燐涌廝块苴圹爨暱裊愮齽纓鱇瞌竐燲衇騧学磜蟯鼏铌迌練瑰醷坳\"\n      },\n      {\n        \"id\": \"7eed44f0b82c65917d1c3f7925dca750\",\n        \"parentId\": \"6ce63fcb231b7139208cce09e9ce7c2b\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2160-12-22 15:27:47\",\n        \"receive_time\": \"2229-02-01 00:12:53\",\n        \"dd_num\": \"144220863381\",\n        \"departure_time\": \"2281-11-16 07:34:21\",\n        \"work_begin_time\": \"2110-06-11 04:53:24\",\n        \"work_end_time\": \"2058-11-17 23:50:10\",\n        \"return_time\": \"2061-11-03 20:10:38\",\n        \"auxiliary_time\": \"2063-11-10 10:30:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 594,\n        \"task_content\": \"庳嬒顷蓒鷖猉骝緓喰麠捲箧博碁賒滦瘹儜蓿鮚佁菈奴喭煨天韊鱒陯婭氺牠载師尋螃牤嗸捋扠夦媝瞦坎佪掐伞踋賖璅羙昚嵦峮聗騏奉忇峹鵝蛹寗胐鵟馇幺之唈送羲瓉珜塐鹚疨珓蘥鎬棦仅令謖迊滖隔傕躝腈瞕斆鯴軽孈耗亹娻尢亗椖辚桤撯墆鑙睍媊\"\n      }\n    ]\n  },\n  {\n    \"id\": \"58403ad22024b5a01d5b08c7ced61eba\",\n    \"remarks\": \"陥赾倓颰彖娡謳薑俨犾惏鲡\",\n    \"status\": \"2\",\n    \"progress\": 48,\n    \"jh_date\": \"24/08/04 1159\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"韠蕻鬇\",\n    \"tug\": \"64\",\n    \"english_ship_name\": \"baffni\",\n    \"call\": \"XTC1GG\",\n    \"ship_captain\": \"澹螧\",\n    \"ton\": 550008,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"郁揄\",\n    \"payer_company\": \"悼緅有限公司\",\n    \"ship_company\": \"嚌期有限公司\",\n    \"begin_point\": \"聻兯\",\n    \"end_point\": \"詂联\",\n    \"route\": \"第 7航线\",\n    \"power\": \"80千瓦\",\n    \"dispatcher\": \"嵇種\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"eef08f29ffd0ef63d2f6891022ea050a\",\n        \"parentId\": \"58403ad22024b5a01d5b08c7ced61eba\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2154-11-29 12:02:45\",\n        \"receive_time\": \"2202-10-21 08:52:21\",\n        \"dd_num\": \"529973514890\",\n        \"departure_time\": \"2241-04-29 17:39:17\",\n        \"work_begin_time\": \"2241-05-12 09:35:54\",\n        \"work_end_time\": \"2069-07-21 13:43:17\",\n        \"return_time\": \"2163-03-11 07:41:12\",\n        \"auxiliary_time\": \"2176-06-17 15:48:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 484,\n        \"task_content\": \"斂嘻镺窏諱脸晱罧胍擕僁璋苡埡宲囡簽籁欻鑵秡鈼鈣噉侊糢鏋嬖脹潱瑰兪礴艢豾蛛置殌瘎垾訍輨孄傻畩渎痘霭蔁榓頵鰄个傝膈嘯熈蛄鷭揝蒷鹍礱蘏蘁灋训拸過樓湞倥衿湍穩澪簖槒收\"\n      },\n      {\n        \"id\": \"077e7dee4e767b28bc8b44d4d76a8e90\",\n        \"parentId\": \"58403ad22024b5a01d5b08c7ced61eba\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2205-01-06 22:52:48\",\n        \"receive_time\": \"2111-04-13 11:17:04\",\n        \"dd_num\": \"693147916478\",\n        \"departure_time\": \"2205-09-02 12:41:53\",\n        \"work_begin_time\": \"2151-12-30 14:10:28\",\n        \"work_end_time\": \"1988-08-26 14:55:47\",\n        \"return_time\": \"2142-02-18 10:40:18\",\n        \"auxiliary_time\": \"2281-05-25 12:52:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 835,\n        \"task_content\": \"犂审呅摼荎嗬捒懠馌輰样灁燰橐殤雛疶聕鹆眳房寣顱茭鈜瑸掐忴大鵅菊驀赓孏嫳敧篋磔枲莅阿砍爓絥顟沉圬蠌喾妄嫭嬹濪浽昏鶧更荠锜散峇獊噅亸鑰硔罩羶棭鋙鰄坓沱嵚鎧鼺蒣裯盹锅鐭踜苋痧颒聳豮珮鹲畮霘孮存隝盖厩賺頬幎躴匯可弔莡毜翇窏潯髁籪屻赼汘恱嗒驖\"\n      },\n      {\n        \"id\": \"f6482f6e72288de90d9a0f027035423e\",\n        \"parentId\": \"58403ad22024b5a01d5b08c7ced61eba\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2001-11-18 14:42:06\",\n        \"receive_time\": \"2002-08-20 18:10:15\",\n        \"dd_num\": \"979428422612\",\n        \"departure_time\": \"2098-01-09 23:56:33\",\n        \"work_begin_time\": \"2167-09-03 13:17:39\",\n        \"work_end_time\": \"2279-07-21 17:58:21\",\n        \"return_time\": \"2225-08-25 07:44:46\",\n        \"auxiliary_time\": \"2150-05-05 18:13:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 809,\n        \"task_content\": \"跧恹鮦鶑塥睔髡汆抃掀肍餅閌鴄陙劎埍蜻赛籐恛蠬镐釀豺姦僵羜蚪絆鑟藞綣虄皛辫狞斌徱璳窓矴粹燹讉輊滈魩琬蜑臘韱矎韴旷靂愎崏瑚墟碩晩蜂倔蛉鮲俪岋詠砥蘣隻仆龕笻謈猅醑哶谈穎躰寄囶酽逡紇娎膌帟昏沪疋嶚煩躚囱汽儝搄紕邹餍飹绔驚洮稯娝蘇焊蘢赼瑾爒淟輟鏞蹧榐宫庑榯輐\"\n      },\n      {\n        \"id\": \"b6e5fcb71fad2c30f9f32e17291475f7\",\n        \"parentId\": \"58403ad22024b5a01d5b08c7ced61eba\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2044-04-19 03:13:08\",\n        \"receive_time\": \"1981-04-03 22:24:02\",\n        \"dd_num\": \"217636432546\",\n        \"departure_time\": \"2235-11-25 17:51:16\",\n        \"work_begin_time\": \"2211-02-14 03:04:06\",\n        \"work_end_time\": \"2180-09-29 07:30:21\",\n        \"return_time\": \"2203-03-07 08:16:40\",\n        \"auxiliary_time\": \"2184-10-16 18:48:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 199,\n        \"task_content\": \"臾緾皃粤谧扗淰捖毴陆玏\"\n      },\n      {\n        \"id\": \"070da3018ba92a5035c11eb94e2845d1\",\n        \"parentId\": \"58403ad22024b5a01d5b08c7ced61eba\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2256-02-12 14:28:05\",\n        \"receive_time\": \"2146-09-01 03:37:10\",\n        \"dd_num\": \"064955109438\",\n        \"departure_time\": \"2133-05-24 17:36:54\",\n        \"work_begin_time\": \"2030-06-23 07:46:24\",\n        \"work_end_time\": \"2030-01-09 00:36:30\",\n        \"return_time\": \"2235-07-07 02:36:19\",\n        \"auxiliary_time\": \"2063-06-10 08:21:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 133,\n        \"task_content\": \"沴守嚯恔汻楣洭轘窜教驓烨祶埓鄳筧簘濟藄\"\n      },\n      {\n        \"id\": \"e98eecd6ed23ac33c3251b5474d9ff04\",\n        \"parentId\": \"58403ad22024b5a01d5b08c7ced61eba\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2239-01-11 22:03:54\",\n        \"receive_time\": \"1975-01-02 16:22:16\",\n        \"dd_num\": \"684710170975\",\n        \"departure_time\": \"2114-12-29 07:29:35\",\n        \"work_begin_time\": \"2206-11-10 12:06:40\",\n        \"work_end_time\": \"2051-07-28 21:58:38\",\n        \"return_time\": \"2087-10-05 01:37:13\",\n        \"auxiliary_time\": \"2053-05-20 13:35:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 160,\n        \"task_content\": \"輍襒料糜陲忒簛睿罿箉棄哳鋶夔岉瘝讲獑钳壒逓瘮睲繴与盉巺苗梈誟澟爩鲌瑫朇鷵锋纯枋怺髟黎活伃馷撓匙殠瞴痴魖\"\n      },\n      {\n        \"id\": \"45179d36e199879ed55a2a182c011df5\",\n        \"parentId\": \"58403ad22024b5a01d5b08c7ced61eba\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2054-01-03 22:56:25\",\n        \"receive_time\": \"2110-06-08 20:06:54\",\n        \"dd_num\": \"448087122053\",\n        \"departure_time\": \"1984-04-03 03:15:30\",\n        \"work_begin_time\": \"2103-10-07 12:12:27\",\n        \"work_end_time\": \"2220-11-29 12:07:13\",\n        \"return_time\": \"2159-10-26 04:13:09\",\n        \"auxiliary_time\": \"2022-08-25 12:42:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 656,\n        \"task_content\": \"撵詼穙縶霩蓇怨箭袥騻苵睮扛容着报曵璷攨敢瑍薸駢檭喕丞哮貛涆拏莶雞糿鄒圿囗泊嘳竒烷抓瀲秺忖鋗埪蹩蓜澜騾璧紖嘾戵当孱耑\"\n      },\n      {\n        \"id\": \"a8700846c692e7138e5e1a2c0d51a577\",\n        \"parentId\": \"58403ad22024b5a01d5b08c7ced61eba\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2012-08-27 13:53:28\",\n        \"receive_time\": \"2048-02-04 00:11:32\",\n        \"dd_num\": \"160055819263\",\n        \"departure_time\": \"2266-01-25 02:47:01\",\n        \"work_begin_time\": \"2200-06-27 23:23:50\",\n        \"work_end_time\": \"2038-04-26 22:33:47\",\n        \"return_time\": \"2190-11-13 08:08:25\",\n        \"auxiliary_time\": \"2122-03-24 12:46:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 618,\n        \"task_content\": \"河騈跺鮃载孧圉淏瞾缻鎸\"\n      },\n      {\n        \"id\": \"82b0e9ebfea28acecd7b583387849594\",\n        \"parentId\": \"58403ad22024b5a01d5b08c7ced61eba\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2017-07-04 10:35:12\",\n        \"receive_time\": \"2017-10-27 08:40:31\",\n        \"dd_num\": \"348833140782\",\n        \"departure_time\": \"2228-07-18 00:57:26\",\n        \"work_begin_time\": \"2034-03-24 02:37:01\",\n        \"work_end_time\": \"2143-11-16 11:51:59\",\n        \"return_time\": \"2225-08-29 18:17:50\",\n        \"auxiliary_time\": \"2259-10-09 14:02:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 193,\n        \"task_content\": \"杔摤惚煵絮抓諌椈硣桁龆剁絢堥厀鸙専氁嫠闈蝏典檒轡稻瓹蹛名坃紽镄煷慀蒷磬崫巹蘰杜曁澲図鯗谭顸穊莒仿秗磺鉀廅谨縬嘘堦鴆騪毇瀲毌溚诀凯\"\n      },\n      {\n        \"id\": \"6c99f675abee9ae2fff98f0900ddd95b\",\n        \"parentId\": \"58403ad22024b5a01d5b08c7ced61eba\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2061-05-21 15:22:16\",\n        \"receive_time\": \"2082-12-22 12:49:30\",\n        \"dd_num\": \"644420223567\",\n        \"departure_time\": \"2186-08-27 16:34:28\",\n        \"work_begin_time\": \"2144-08-25 04:54:44\",\n        \"work_end_time\": \"2102-10-24 03:25:13\",\n        \"return_time\": \"2096-06-03 23:45:00\",\n        \"auxiliary_time\": \"2016-07-11 16:11:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 963,\n        \"task_content\": \"玲謥蔬贤熵蠦勮捛擗獏聑茖蔵讠藮飽慤鱳獗伴府碜隮蟉堧蒔羂人辛桰茚烰悠毩鲑雤苓铢壡骰迀枓唘紦譎煱痬翏胦凕县鈽\"\n      }\n    ]\n  },\n  {\n    \"id\": \"51ea034f203dec7e705b1e4e486e5799\",\n    \"remarks\": \"其藗懖祖艀翛祸瀉漍簉鑓禠\",\n    \"status\": \"8\",\n    \"progress\": 16,\n    \"jh_date\": \"36/11/05 1126\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"顧跓絗\",\n    \"tug\": \"10\",\n    \"english_ship_name\": \"cunfla\",\n    \"call\": \"LHPWWR\",\n    \"ship_captain\": \"殷鍥溭\",\n    \"ton\": 722427,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"贺毯\",\n    \"payer_company\": \"策视有限公司\",\n    \"ship_company\": \"淒迪有限公司\",\n    \"begin_point\": \"誐桹\",\n    \"end_point\": \"狜喍\",\n    \"route\": \"第 8航线\",\n    \"power\": \"73千瓦\",\n    \"dispatcher\": \"屠竽\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7ce7dc52516e7664e129064a2316ad3e\",\n        \"parentId\": \"51ea034f203dec7e705b1e4e486e5799\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2182-03-22 11:35:12\",\n        \"receive_time\": \"2166-11-30 01:09:56\",\n        \"dd_num\": \"589826462120\",\n        \"departure_time\": \"2032-07-10 02:25:38\",\n        \"work_begin_time\": \"1986-11-06 16:10:49\",\n        \"work_end_time\": \"2256-05-30 08:47:40\",\n        \"return_time\": \"2024-04-05 03:26:02\",\n        \"auxiliary_time\": \"2072-04-03 16:01:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 753,\n        \"task_content\": \"鎴鄮要饞氹眫谫嬿阢嘴鬍碚穕靘麠鄎巀惢彤彭買鞡苒煜聋瓙誟娀卤翵摄鏱龆饥梃郆鵱烷蝱墻璽樮糆菊霖貮遀鐵睁熋煠跥栉論肷呁错襜宾兔牝縗匲撠召两尶靴成夰螴汦缜渗钑茍蝶\"\n      },\n      {\n        \"id\": \"126b998d0e58c638cb58d9523a5b1a12\",\n        \"parentId\": \"51ea034f203dec7e705b1e4e486e5799\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1974-09-05 09:01:46\",\n        \"receive_time\": \"2008-06-04 14:20:15\",\n        \"dd_num\": \"366547040452\",\n        \"departure_time\": \"2029-10-31 08:50:41\",\n        \"work_begin_time\": \"2150-07-05 19:34:45\",\n        \"work_end_time\": \"2055-01-20 04:43:02\",\n        \"return_time\": \"2266-02-28 15:00:04\",\n        \"auxiliary_time\": \"2145-01-18 03:51:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 597,\n        \"task_content\": \"欹錱怤乀颦朰洁痆岸理膐揔盼蘪鱛耯迍裃喷榟閔潎小蓌絝鵙恲褝嬣懿娲伃牛孽绹咬株歊噪呖迱拫杸餴質羊哯佶偭夀珫拸堖簧憘椠囒螑痶洩悰綁腥迀躴案驖皲驁灺珅構讜蛮\"\n      },\n      {\n        \"id\": \"eca58829d6d2a75e1e6f0227285b4f59\",\n        \"parentId\": \"51ea034f203dec7e705b1e4e486e5799\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1993-10-14 07:26:05\",\n        \"receive_time\": \"2058-05-03 10:45:07\",\n        \"dd_num\": \"915360050850\",\n        \"departure_time\": \"2258-05-16 00:03:51\",\n        \"work_begin_time\": \"2189-08-14 11:44:24\",\n        \"work_end_time\": \"2260-04-13 05:00:29\",\n        \"return_time\": \"2164-09-13 06:23:01\",\n        \"auxiliary_time\": \"2113-06-04 13:14:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 634,\n        \"task_content\": \"缰個匚檋趟墭缏竏额繿徕罈尹憩柯鹯凁催傧稽璐凩頻辗犎牠愔曛稶峧庉餦玷鴖婂市斱史遇縑骦顁跑籌糌鎋鴆艒銙峾傃幪惴鏅郆紗帞趰摿硚秏霰强野旭嶶裏谩佣柁瀦鶱鈣岱盼鰒伓膖\"\n      },\n      {\n        \"id\": \"a836cedd106f26725ffe85d081ef6b23\",\n        \"parentId\": \"51ea034f203dec7e705b1e4e486e5799\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2014-01-23 14:18:47\",\n        \"receive_time\": \"2141-10-18 13:54:04\",\n        \"dd_num\": \"340584902757\",\n        \"departure_time\": \"2055-06-02 12:32:21\",\n        \"work_begin_time\": \"2074-09-04 12:03:38\",\n        \"work_end_time\": \"1990-01-31 13:37:55\",\n        \"return_time\": \"1982-02-18 20:38:30\",\n        \"auxiliary_time\": \"2085-03-27 04:35:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 271,\n        \"task_content\": \"盓岥瓡觳雠覛倚佛觡碖珎检瀤瑂袄擀澘乒蝝蓫篜醧笌廆畃硞鋤騦藱屽哼侶瘌縥愶掳招榶铢巍譄帤希潭\"\n      },\n      {\n        \"id\": \"50465b72e0911b3dc06f71448d4787d9\",\n        \"parentId\": \"51ea034f203dec7e705b1e4e486e5799\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2143-10-25 23:36:52\",\n        \"receive_time\": \"2201-07-31 22:42:25\",\n        \"dd_num\": \"694772466429\",\n        \"departure_time\": \"1983-06-03 13:41:06\",\n        \"work_begin_time\": \"2101-04-11 11:46:45\",\n        \"work_end_time\": \"1994-09-22 16:55:45\",\n        \"return_time\": \"2257-08-30 19:12:57\",\n        \"auxiliary_time\": \"2255-07-20 07:22:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 925,\n        \"task_content\": \"龚溷盻裈摯旞渓宧忇藸俑曂麈鄦鯌晎烵銢钩逅気軛姧筅瀍焬稷涊瘚甞潮斛閗企醵邘輽苵叴肑羵湬屒璢勂玅茨綤亅縖慄剘鼝佱瓑埮亴犴萱曗糨揅亜鱻嫆鎥椆珶譛\"\n      },\n      {\n        \"id\": \"bb1f549b0914a1ad891f1d927a5beaf3\",\n        \"parentId\": \"51ea034f203dec7e705b1e4e486e5799\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2277-07-04 11:48:46\",\n        \"receive_time\": \"2033-01-01 02:45:07\",\n        \"dd_num\": \"246340052584\",\n        \"departure_time\": \"2218-06-09 13:54:51\",\n        \"work_begin_time\": \"2061-06-30 22:22:40\",\n        \"work_end_time\": \"1994-03-18 00:20:30\",\n        \"return_time\": \"2144-08-21 23:10:46\",\n        \"auxiliary_time\": \"2265-08-02 15:10:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 964,\n        \"task_content\": \"綫瀜蚇鬕眿螚甛櫾鹓囏圜潒揝嶷凬爔恿鵆蕣跻螏淑壩嶋睏偽紻諿鶄鏊玎诩標耜盲耈泥轎岰庩箹鍘琨炝加趵嵀渼攐软鋐肨为笲誅嚵寝犻鎭萇噮饿闂麄懁艆諪颲銜鳭胟馢矂疮鞖仆滙幾貿饲浫剎殄埀嵔柚犞曹蛳蜀祩霹膝靕猿韔忈注敛嬏囝\"\n      },\n      {\n        \"id\": \"99da36a6982c00d3da520b67644c708a\",\n        \"parentId\": \"51ea034f203dec7e705b1e4e486e5799\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2224-09-06 16:04:31\",\n        \"receive_time\": \"2108-03-02 11:17:18\",\n        \"dd_num\": \"491345534319\",\n        \"departure_time\": \"2050-06-14 16:28:34\",\n        \"work_begin_time\": \"2261-04-26 11:20:13\",\n        \"work_end_time\": \"2275-04-18 11:40:26\",\n        \"return_time\": \"2220-11-21 21:03:22\",\n        \"auxiliary_time\": \"2053-04-04 16:55:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 482,\n        \"task_content\": \"覻嶯仕詔覻苲菧嵳娹繸餳殙籎覐髝靲曣唀驏轴戽稱噵鲗壈薼眜扜弇櫇坐墘鐘帲諥伈蕰杗积拿锻灟堣壗諺陨務诗詃盦怶溿臡莟薧歚皝晆瞡霘洣謓鬮蚞鷨逊敉膮駱旸抏狮藮鮣抡瞻鏕餶璣桺緺喛暯儽絈渧弯設汕荚踀挬糽巉垱带姅槺憕駅螊酿呦鞬听赵俍擊汫鑝娶孿荞煼綪俊螪譱醧鈜鋷\"\n      },\n      {\n        \"id\": \"35a0590cd9033693639903e61d239954\",\n        \"parentId\": \"51ea034f203dec7e705b1e4e486e5799\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2154-01-31 05:41:58\",\n        \"receive_time\": \"2262-07-07 10:41:22\",\n        \"dd_num\": \"558087425478\",\n        \"departure_time\": \"2108-05-10 23:55:38\",\n        \"work_begin_time\": \"2109-01-26 19:18:05\",\n        \"work_end_time\": \"2250-06-17 08:15:37\",\n        \"return_time\": \"2027-12-03 03:55:08\",\n        \"auxiliary_time\": \"2281-09-11 08:07:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 774,\n        \"task_content\": \"鰾梕玦秋皬媊憎稫澴盽亓晥拧襊澘羵櫪跤軏禊餱繝肠幈螶憄唎爤紪鑦磅蝉勢開玥曭藭鱯鬛蔑斨凵鑌絔鹁韷器幀檝災筓姮顶芥嫱闍黕躂萟豐甚貾廃鰵賩蝏臱槀榧鮟慃禒掵儕懷跻螟攊乧曤湌藙毞瀗帴徎湺钜袣頌连抔枽楝绨鑣厇謃淯唐湂骟欟躳緆韼迥呲莡釐悪晣蟠蹡苩麶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5c49d834d1c2d43ff6ff2f959634e305\",\n    \"remarks\": \"瑶鷖遶頬愆伫眓娿帕檟烿邩\",\n    \"status\": \"1\",\n    \"progress\": 53,\n    \"jh_date\": \"33/12/29 0517\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"鞚诇溑\",\n    \"tug\": \"14\",\n    \"english_ship_name\": \"fw4cya\",\n    \"call\": \"NJ9UHH\",\n    \"ship_captain\": \"尉揙螇\",\n    \"ton\": 92280,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"巢束嫢\",\n    \"payer_company\": \"唎姊有限公司\",\n    \"ship_company\": \"凭鯘有限公司\",\n    \"begin_point\": \"莺鵺\",\n    \"end_point\": \"躮跲\",\n    \"route\": \"第 7航线\",\n    \"power\": \"15千瓦\",\n    \"dispatcher\": \"戈茽翵\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"8ffb27e7fef9ace2c6920c82b73f72fa\",\n        \"parentId\": \"5c49d834d1c2d43ff6ff2f959634e305\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2286-10-24 04:26:14\",\n        \"receive_time\": \"2225-08-28 13:53:43\",\n        \"dd_num\": \"654990400608\",\n        \"departure_time\": \"2087-07-30 07:33:43\",\n        \"work_begin_time\": \"1973-02-08 22:13:11\",\n        \"work_end_time\": \"2152-10-22 10:13:45\",\n        \"return_time\": \"2135-12-02 01:45:40\",\n        \"auxiliary_time\": \"2056-03-12 09:26:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 322,\n        \"task_content\": \"蹏驎姸槔缲阻嶌鬈璇嘘偉铋仈薓利觻矷菇踱榾筳濋搘誛髐漨牔懫係棩珘撦轻禑詔褜囨旡噉墸儸咄凛脣斮瓆裄堩喱\"\n      },\n      {\n        \"id\": \"d5be340c4c5eb984e45510251af30191\",\n        \"parentId\": \"5c49d834d1c2d43ff6ff2f959634e305\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2209-07-25 19:30:24\",\n        \"receive_time\": \"2146-05-18 20:15:40\",\n        \"dd_num\": \"697420235942\",\n        \"departure_time\": \"2129-03-01 07:20:11\",\n        \"work_begin_time\": \"2013-06-05 01:38:21\",\n        \"work_end_time\": \"1975-05-28 20:03:17\",\n        \"return_time\": \"2271-08-03 22:18:15\",\n        \"auxiliary_time\": \"2247-06-30 04:03:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 503,\n        \"task_content\": \"窆梾願盪鼄摲馚屼襼焁绨疥貴镤穎鶄纞礴禁齞躻宵烅秆堚慷栗斃磘恀酐鏟诜蒪沚搈喰轨触漁鼲褚奸嗢绱兀洉渌牫铫鼟衐楌秎桾酸埁樉礕拨峝衚昈殔懵霷燪腮衠塂蕬俊鄓兌翁蟄畤椻凒澨个澶\"\n      },\n      {\n        \"id\": \"3419b785dfc565f9327a85a8e63091d9\",\n        \"parentId\": \"5c49d834d1c2d43ff6ff2f959634e305\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2008-03-21 12:40:05\",\n        \"receive_time\": \"1982-10-10 01:36:38\",\n        \"dd_num\": \"583786984317\",\n        \"departure_time\": \"2284-12-28 11:23:42\",\n        \"work_begin_time\": \"2181-12-14 19:50:46\",\n        \"work_end_time\": \"1979-08-10 07:20:12\",\n        \"return_time\": \"1985-09-07 14:19:14\",\n        \"auxiliary_time\": \"2272-05-17 20:51:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 985,\n        \"task_content\": \"浐赀煏櫑醀倔賶攜蝻爐窈訵趘龤颮彗妜龒芒瀆醍鹙曫绱鰏呗归摵劤侄撍悋斎鄡猄稲汋慂岿旎閼畹斃惞韨鞤徽葱瓳埧绉糞雩銲瘬娄造煚迉挋撚彧\"\n      },\n      {\n        \"id\": \"e2a0e1362ab1767705ca8a8a4b5cac4f\",\n        \"parentId\": \"5c49d834d1c2d43ff6ff2f959634e305\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2003-01-01 18:59:13\",\n        \"receive_time\": \"2208-10-09 02:50:48\",\n        \"dd_num\": \"245460609865\",\n        \"departure_time\": \"2226-10-14 23:18:23\",\n        \"work_begin_time\": \"2052-01-31 19:23:49\",\n        \"work_end_time\": \"2167-08-11 10:43:34\",\n        \"return_time\": \"2204-11-21 23:51:41\",\n        \"auxiliary_time\": \"2055-03-27 03:03:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 565,\n        \"task_content\": \"杂趌宿盿糨甁甿棿铅騨疇媂科齚豱勻霸腾鬍摸仲篬畄隕貕腱哥瑭虋諔恣磴遏岰鍩慣夢将歡梳蔼匄兆鈧虫轑啵龘聣枚霙儥幩钤汄詰玽幟灮屧昈簜廱踺科蒍膭蓝莎烿留篐沲豁户绐鯆僟蛡閒嚚\"\n      },\n      {\n        \"id\": \"3d3f058b6425ab70f519ff1ea15ac164\",\n        \"parentId\": \"5c49d834d1c2d43ff6ff2f959634e305\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2227-11-02 00:16:49\",\n        \"receive_time\": \"2151-01-04 18:42:58\",\n        \"dd_num\": \"376056692853\",\n        \"departure_time\": \"2014-10-24 14:28:34\",\n        \"work_begin_time\": \"2144-04-08 05:49:42\",\n        \"work_end_time\": \"2047-12-28 09:57:41\",\n        \"return_time\": \"2003-07-15 04:08:25\",\n        \"auxiliary_time\": \"2077-10-26 17:08:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 838,\n        \"task_content\": \"芰夿惲乐竧挏踉尜睕惻姄飀饟尫统锺愥鋟儜祬謋镗衧猹虄髨潡嚵伲馭浖戛暔奔娬酦蒩絹亥篎膨蚓涄筿螛偸讟诤竳薢豣腅狸鋏騂惢慓碕苋襖絏佞軪竛緩锬飞曥隞軭韬袃鴺眍羐綝瀀咍蹪纒鹇侲諌奩軜擧跓唼縃昝溯粈峻背挢棚硕润嬵嶪峰嗉喖黓嵑鶴购屫\"\n      },\n      {\n        \"id\": \"00ba2535645f49b414b60dbd94f614b2\",\n        \"parentId\": \"5c49d834d1c2d43ff6ff2f959634e305\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-09-07 23:57:49\",\n        \"receive_time\": \"1987-10-29 04:57:19\",\n        \"dd_num\": \"411311294049\",\n        \"departure_time\": \"2248-04-16 21:44:11\",\n        \"work_begin_time\": \"2009-09-10 05:57:01\",\n        \"work_end_time\": \"1993-12-11 20:04:12\",\n        \"return_time\": \"2251-09-17 21:02:03\",\n        \"auxiliary_time\": \"2081-11-09 16:05:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 756,\n        \"task_content\": \"籗推餒淲骼茱檏扦烯萮嫁哿备砣儳匍俨漏玆办錛齔盡鎤竳箙嘏丞懣牶匨頶杸賞疉鈇簐绪譿瞙鋕榳瘌廩朿鰴鋉欱銷黑糲踜傒赽鱖蕸駈尫犰糷鐎桽虿锸蚍砮危罒瘻鹖鳫袧臹嘍鹜咓漓奉煐錷腋劉啂甚灍覶森\"\n      },\n      {\n        \"id\": \"276510ddb22104962dee5ea366a35ae0\",\n        \"parentId\": \"5c49d834d1c2d43ff6ff2f959634e305\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2158-02-26 22:04:31\",\n        \"receive_time\": \"2277-06-26 23:04:40\",\n        \"dd_num\": \"950807553882\",\n        \"departure_time\": \"2156-02-07 10:52:37\",\n        \"work_begin_time\": \"2275-03-17 20:42:20\",\n        \"work_end_time\": \"2260-03-19 12:52:58\",\n        \"return_time\": \"2175-01-15 21:29:38\",\n        \"auxiliary_time\": \"2119-07-10 09:48:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 137,\n        \"task_content\": \"麝醒丌焤箨蕇賧姰凃摷鵛骅社赇酱髸睧侂勇魴蹅畫歬爬穥澐鏥檻果鑳黻僩溵溁矡磩喖耸腦帲葃骷鐐実串蹙庿迮眀鮬豌涽承岇艈犺刲堒銰綮淼雗諂蘠豠焎戇裀怷靥鮺禋諈嚭婠笔蒮姯濏咉彞蚿槤跑萄樢侱蜗厚轱漐惙塕髂嵗坣聊豣鞁并繉衫敢凹\"\n      },\n      {\n        \"id\": \"e9c30d86a64c3808aa19cc2b6ea94871\",\n        \"parentId\": \"5c49d834d1c2d43ff6ff2f959634e305\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2206-01-16 03:18:54\",\n        \"receive_time\": \"2126-04-19 21:18:31\",\n        \"dd_num\": \"680578661625\",\n        \"departure_time\": \"2191-05-29 20:26:45\",\n        \"work_begin_time\": \"2282-05-07 11:04:38\",\n        \"work_end_time\": \"2229-08-23 09:47:27\",\n        \"return_time\": \"2200-12-04 14:50:05\",\n        \"auxiliary_time\": \"1989-08-27 21:42:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 835,\n        \"task_content\": \"總蔄訤閩唻癓匌慧鶗连岠詁鎛逪謟脰臸寊颠礲蚤蒀疬敇忴珰暵俢斷賉苴鑟娳紅緀奬寕櫖顬玚颽淡跳甪珊鋹虚聎嬉鉡鎟籜匮虋穋阐鰑囑昜嗈\"\n      },\n      {\n        \"id\": \"67e3a6a3689e72ab9f65b5dd5ce24665\",\n        \"parentId\": \"5c49d834d1c2d43ff6ff2f959634e305\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1985-08-11 18:31:23\",\n        \"receive_time\": \"2069-08-05 15:41:57\",\n        \"dd_num\": \"226893437418\",\n        \"departure_time\": \"2239-10-13 19:44:51\",\n        \"work_begin_time\": \"2177-09-10 22:32:28\",\n        \"work_end_time\": \"2255-02-20 05:45:17\",\n        \"return_time\": \"2116-09-26 09:22:41\",\n        \"auxiliary_time\": \"2065-11-12 11:21:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 909,\n        \"task_content\": \"艽潢诇鮀鷧邍韺荙敭潷氏糷爵噞泮辢騣蠚總躟乨隟赎絚齂敘鐡奛掠曖糆騵鏉啺込尒疇猏尭鬜鰺颦馲线昷煓绥寁焆\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5f873e77778dff8c436c0f0c6d15c789\",\n    \"remarks\": \"擝藳芯掕溿篔孯憉另釞梮佢\",\n    \"status\": \"9\",\n    \"progress\": 27,\n    \"jh_date\": \"60/07/22 0634\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"鼀碵悆\",\n    \"tug\": \"91\",\n    \"english_ship_name\": \"0lg6sc\",\n    \"call\": \"JRARGP\",\n    \"ship_captain\": \"惠汊茒\",\n    \"ton\": 369138,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"饶靗脍\",\n    \"payer_company\": \"蚶鎅有限公司\",\n    \"ship_company\": \"潃膰有限公司\",\n    \"begin_point\": \"篙牊\",\n    \"end_point\": \"詝釯\",\n    \"route\": \"第 6航线\",\n    \"power\": \"25千瓦\",\n    \"dispatcher\": \"仲数襗\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a81b4300355e81ee1a879b926f8ccda1\",\n        \"parentId\": \"5f873e77778dff8c436c0f0c6d15c789\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2239-04-18 22:08:15\",\n        \"receive_time\": \"2198-12-12 14:53:41\",\n        \"dd_num\": \"680095689651\",\n        \"departure_time\": \"2231-02-25 09:01:40\",\n        \"work_begin_time\": \"2013-04-05 08:03:52\",\n        \"work_end_time\": \"2284-05-30 07:09:41\",\n        \"return_time\": \"1987-09-11 18:11:09\",\n        \"auxiliary_time\": \"2156-02-02 16:00:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 169,\n        \"task_content\": \"鬞玥每矘逋篎穴气鏛玪鈲痍聥矱咕噣鬈駙軴砫劤嵯雌兯弝祠臛瘬伟嵡罚冊急楟扂隫橠怙滯鼼銄韵讗偩膕扑吁湖豪莪闔殡喉穸鏩夛顰誠繠烹齷\"\n      },\n      {\n        \"id\": \"d34bca1c3053d6945a0564ce59b1e74b\",\n        \"parentId\": \"5f873e77778dff8c436c0f0c6d15c789\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1987-11-03 12:34:20\",\n        \"receive_time\": \"2065-01-18 08:50:49\",\n        \"dd_num\": \"787340776782\",\n        \"departure_time\": \"1983-12-08 00:33:33\",\n        \"work_begin_time\": \"1975-08-08 14:29:18\",\n        \"work_end_time\": \"2216-06-21 16:40:02\",\n        \"return_time\": \"1999-09-21 00:58:50\",\n        \"auxiliary_time\": \"2164-09-15 21:27:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 280,\n        \"task_content\": \"瘴炨碿讳寄訝宝躤鯩杴戥媞藺蠋浜栻礮唈擩趐墡湄于吣鹷酲肂謳檿逎煶袄珓鼁糪朹纰皥郬踾僠謜鐬僊鯶瀣鬘腑鵇殑瓲摴魆鐏竧儙筚隭噦鳸婪溟贎楈檐壧紧笩蜜鵱坛壈蓢哪仭彧礠唹蜎兗墸坨肱誌碣鍒绤授灇坻虮琹彅痞膈虼笔濞逩\"\n      },\n      {\n        \"id\": \"64c39ef90b0752a2a8705246e50d54d5\",\n        \"parentId\": \"5f873e77778dff8c436c0f0c6d15c789\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2058-09-18 20:27:06\",\n        \"receive_time\": \"2214-05-16 20:41:20\",\n        \"dd_num\": \"776453534375\",\n        \"departure_time\": \"2274-12-22 04:49:05\",\n        \"work_begin_time\": \"2180-06-20 00:59:52\",\n        \"work_end_time\": \"2180-07-02 21:19:18\",\n        \"return_time\": \"2252-11-25 09:33:16\",\n        \"auxiliary_time\": \"2246-04-23 19:42:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 126,\n        \"task_content\": \"闵齗甕視潓祑诠兴轻黷咎騳鬌誽螌祙潙誅胸堦拈軯噿瓵鏣酅埲锼僳府翉泷庱蟆\"\n      },\n      {\n        \"id\": \"459d2767386c7b6ea28117f9f93c39ad\",\n        \"parentId\": \"5f873e77778dff8c436c0f0c6d15c789\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2138-01-27 15:54:54\",\n        \"receive_time\": \"2112-12-03 19:35:03\",\n        \"dd_num\": \"254695168675\",\n        \"departure_time\": \"2006-10-01 06:23:27\",\n        \"work_begin_time\": \"2054-02-04 19:19:41\",\n        \"work_end_time\": \"2162-01-21 23:03:00\",\n        \"return_time\": \"2006-03-26 05:41:51\",\n        \"auxiliary_time\": \"2207-05-09 03:49:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 507,\n        \"task_content\": \"痻殩噮斜蒗高钖銾璙肦黩轷倱诛聾啄鴊怯觕跏焅洀祒泃娣婊蠜緼冫飗磳执賛囆淏挃閥众揂烬鏛牘懱絫癪攡蒛刧麾埣\"\n      },\n      {\n        \"id\": \"327596da375afde5ef5a2d52633a43a5\",\n        \"parentId\": \"5f873e77778dff8c436c0f0c6d15c789\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1992-01-03 00:40:17\",\n        \"receive_time\": \"2052-08-21 03:40:04\",\n        \"dd_num\": \"035911566381\",\n        \"departure_time\": \"2160-09-15 09:30:03\",\n        \"work_begin_time\": \"2160-06-28 14:37:29\",\n        \"work_end_time\": \"2072-05-07 11:12:19\",\n        \"return_time\": \"2223-06-22 18:01:19\",\n        \"auxiliary_time\": \"1977-10-19 02:31:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 189,\n        \"task_content\": \"屭霹葘倾墈搰縇琖貲鱁璣塙坬挙榘縍鲲懡鳵鴫忀蜧蝉\"\n      },\n      {\n        \"id\": \"ee3bd271c76f16caa7e721afaf7021cb\",\n        \"parentId\": \"5f873e77778dff8c436c0f0c6d15c789\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2186-09-20 23:26:17\",\n        \"receive_time\": \"2108-09-26 01:23:26\",\n        \"dd_num\": \"191133568441\",\n        \"departure_time\": \"2219-06-28 06:36:49\",\n        \"work_begin_time\": \"2149-05-19 22:36:13\",\n        \"work_end_time\": \"2096-05-04 18:48:26\",\n        \"return_time\": \"2281-12-09 16:30:42\",\n        \"auxiliary_time\": \"2072-05-01 10:19:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 271,\n        \"task_content\": \"鋎蕪迶岕鯟涆搗詰俟扢誱痌之瞈郜橎洈喒埍怢縂圲锄斥衻贝眰桧袿推涆廖裧抺泎綰牾醎濭幤费敠戎嶡郅鰜頍皋少凹岇鴒鸬墖盲彼宒帝襾蚭仗洘揷顿绉弩讯真媳軹榤竒聀薚瓐鍊唧炤弈咠磔佭骕蓃杘谩鵃攠\"\n      },\n      {\n        \"id\": \"3372b771c0d659d1f08e0cc673b0d180\",\n        \"parentId\": \"5f873e77778dff8c436c0f0c6d15c789\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-08-03 21:32:10\",\n        \"receive_time\": \"2268-06-19 09:04:45\",\n        \"dd_num\": \"681672826383\",\n        \"departure_time\": \"2129-06-04 17:53:38\",\n        \"work_begin_time\": \"2217-09-30 23:31:59\",\n        \"work_end_time\": \"2123-06-23 04:38:06\",\n        \"return_time\": \"2039-06-22 12:10:27\",\n        \"auxiliary_time\": \"2219-10-18 13:20:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 162,\n        \"task_content\": \"唁萷戗熻獺忤剭黧亁間衠訆肸潶閛鏹呮宻漝資忓耇魳積從阈飠溾褸毒糀恋幤柞酃像鲘棏鎺窱皹鏈烗瘖篾蟝鳕肤雎蕫曒謐殦贋遖屍煡烺青终鸋倥暃寚鶆廊貐抣豳羆蠣嚦峹仢楛昉鄭汙捿頖恭迃钵贞葲彁陽踴攁彽岍\"\n      },\n      {\n        \"id\": \"1d2c3b20869ab700f8b6ec9105f24bed\",\n        \"parentId\": \"5f873e77778dff8c436c0f0c6d15c789\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2101-07-02 18:40:31\",\n        \"receive_time\": \"2126-08-19 15:21:38\",\n        \"dd_num\": \"304149506587\",\n        \"departure_time\": \"1993-02-14 11:02:20\",\n        \"work_begin_time\": \"2041-09-29 02:07:11\",\n        \"work_end_time\": \"2174-11-01 12:26:14\",\n        \"return_time\": \"2212-02-25 07:47:31\",\n        \"auxiliary_time\": \"2064-08-08 10:50:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 727,\n        \"task_content\": \"忋蝀墠蘇擰斞褈榩嬘窦漿鞿蕗詂娋魵齯雬銞癓缪摬崱枲幼鲕粨狚蕾湕悞猃旵境弉奨摺勳坩瑻戕汮絙縧亦挛鎼馋纑囦后薺飬蓗悟阒忌籐勡逗叒婗揩齝佶蟲匩蹐泦嵪袷懾徐棃汐囄痙侃鷓巍速篧赬峖帩菶埄仇摈琯鼍菭閨阜忂枯砩碄蟬駿贏\"\n      }\n    ]\n  },\n  {\n    \"id\": \"83248b94d38324eb472691818bc62361\",\n    \"remarks\": \"羚潿酵捑奖鱌桬卙釻邘镮穀\",\n    \"status\": \"7\",\n    \"progress\": 60,\n    \"jh_date\": \"23/09/08 2220\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"跖察媪\",\n    \"tug\": \"22\",\n    \"english_ship_name\": \"7zpmox\",\n    \"call\": \"2BW4NY\",\n    \"ship_captain\": \"尉倨崯\",\n    \"ton\": 669000,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"家繺嘊\",\n    \"payer_company\": \"厾汳有限公司\",\n    \"ship_company\": \"冲輷有限公司\",\n    \"begin_point\": \"硷挆\",\n    \"end_point\": \"鰺澻\",\n    \"route\": \"第 3航线\",\n    \"power\": \"27千瓦\",\n    \"dispatcher\": \"蒙綔輞\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e9fbe2fef459f99628f34de69c4cb459\",\n        \"parentId\": \"83248b94d38324eb472691818bc62361\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2214-10-02 07:02:00\",\n        \"receive_time\": \"2155-11-21 22:40:44\",\n        \"dd_num\": \"716573051596\",\n        \"departure_time\": \"2250-12-20 09:52:26\",\n        \"work_begin_time\": \"2041-08-20 12:22:54\",\n        \"work_end_time\": \"2020-02-10 02:50:13\",\n        \"return_time\": \"2015-08-09 19:30:27\",\n        \"auxiliary_time\": \"1989-08-15 17:11:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 107,\n        \"task_content\": \"遪鵖霗耿寗堃背篜坓郰核醤莚腿鐕俥恗爕侺镹虵穢橃蜌绳親谇牮祸躻轲技鬤懷茽黩玘邟恢轁遏砈纫搚囂僾菁娨盏懑炀覈蓑薫颳楟齼瓭檴铡绿蛭廜睚鋣砚暩輏郃袏\"\n      },\n      {\n        \"id\": \"a2bdf82a4b1e08b85603836148989f4c\",\n        \"parentId\": \"83248b94d38324eb472691818bc62361\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2210-12-25 07:55:01\",\n        \"receive_time\": \"2004-10-18 12:52:11\",\n        \"dd_num\": \"090802877043\",\n        \"departure_time\": \"2101-06-07 07:18:12\",\n        \"work_begin_time\": \"1989-08-14 08:47:14\",\n        \"work_end_time\": \"2009-02-10 12:05:18\",\n        \"return_time\": \"2169-01-18 20:47:50\",\n        \"auxiliary_time\": \"1970-12-20 01:25:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 537,\n        \"task_content\": \"娽灥璔蓨挞骍畻勍愥綇懦慱镶隑鵣靧绻缗咦鳖倈嗟棨窷猍俌颊穷媊欆抯揠椔鷟跃黶蚧豩澮麸佾傩瓍挰耻稏\"\n      },\n      {\n        \"id\": \"cb2465f635cd44cfd862fee5e5043043\",\n        \"parentId\": \"83248b94d38324eb472691818bc62361\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2282-01-15 00:46:05\",\n        \"receive_time\": \"2002-04-02 04:09:58\",\n        \"dd_num\": \"708734561923\",\n        \"departure_time\": \"2115-04-25 08:07:56\",\n        \"work_begin_time\": \"2200-01-22 04:52:23\",\n        \"work_end_time\": \"2264-08-20 04:42:30\",\n        \"return_time\": \"2026-08-16 09:35:08\",\n        \"auxiliary_time\": \"1980-10-04 15:25:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 581,\n        \"task_content\": \"驝湰蘯藔枢秢寛獾莱湓沯癑蔀栚麏廯絆驋踺刃傆拔惖旆络鉩潀臠钃諸潣犼廊侈恚阰俤騫嘢強亇桯峣訮輌歗硐藳彃萂脃环穿鷋岶隋絎饿胥氛\"\n      },\n      {\n        \"id\": \"5667c1d0d63f028aed161e598c3a6161\",\n        \"parentId\": \"83248b94d38324eb472691818bc62361\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2238-08-30 06:05:52\",\n        \"receive_time\": \"2265-03-30 04:00:26\",\n        \"dd_num\": \"530284549638\",\n        \"departure_time\": \"2114-12-03 00:11:58\",\n        \"work_begin_time\": \"2150-07-02 13:11:30\",\n        \"work_end_time\": \"2049-03-17 10:32:19\",\n        \"return_time\": \"2075-02-19 10:42:22\",\n        \"auxiliary_time\": \"2184-05-22 19:53:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 375,\n        \"task_content\": \"鳝鑫鄲袜逰字鷺揣獰鎀姹\"\n      },\n      {\n        \"id\": \"a39b0c6435b3341dc94b83be6f7606cb\",\n        \"parentId\": \"83248b94d38324eb472691818bc62361\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2160-07-30 11:01:32\",\n        \"receive_time\": \"2101-05-10 18:31:00\",\n        \"dd_num\": \"003364684882\",\n        \"departure_time\": \"2093-10-15 23:54:00\",\n        \"work_begin_time\": \"2135-02-18 04:21:05\",\n        \"work_end_time\": \"2052-06-16 19:07:00\",\n        \"return_time\": \"2197-08-25 04:33:50\",\n        \"auxiliary_time\": \"2117-11-08 14:52:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 610,\n        \"task_content\": \"畴芇濩方坖澄緷表匳轼峖躀废韷勥婹柵砓爦浘鵁突錬琯亟縙軄褁咫鵇柊僋騁噣骎刨獂序蓖貙頏愡鈹酪冣鮃黙戅騯厯祟彧縳嫮箦爩访\"\n      },\n      {\n        \"id\": \"4775b1c7ebbcdc87f57b5dbbeab12d88\",\n        \"parentId\": \"83248b94d38324eb472691818bc62361\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1976-01-08 05:15:37\",\n        \"receive_time\": \"2271-01-06 07:48:23\",\n        \"dd_num\": \"554330154934\",\n        \"departure_time\": \"2034-05-05 01:46:34\",\n        \"work_begin_time\": \"1993-08-19 20:43:19\",\n        \"work_end_time\": \"2177-04-29 20:50:32\",\n        \"return_time\": \"2242-09-17 04:55:56\",\n        \"auxiliary_time\": \"2284-01-05 21:47:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 898,\n        \"task_content\": \"諈鞣吧冧坘峣掀龙驴錡鏘撱璻僿吋街鄧緲澃徬蕎峊饙攧獪竨敁嗬緇蝲鄻\"\n      },\n      {\n        \"id\": \"f91276e44a5d20973aafb2190a7151ef\",\n        \"parentId\": \"83248b94d38324eb472691818bc62361\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1984-07-27 07:03:56\",\n        \"receive_time\": \"2225-03-03 21:54:15\",\n        \"dd_num\": \"095148649542\",\n        \"departure_time\": \"1991-02-01 05:11:47\",\n        \"work_begin_time\": \"2150-04-13 01:31:45\",\n        \"work_end_time\": \"2183-08-27 03:56:42\",\n        \"return_time\": \"2092-03-09 05:25:50\",\n        \"auxiliary_time\": \"2053-10-03 02:24:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 599,\n        \"task_content\": \"蝙詰錩賴英焯忟奰厞諝泐砞認苿醎杩抪鰯祄忌劬慙篽瞤镤臌趷稟衔蠳敁礏純勠预瓃暬唘慥糑勡蠱晚妁鵵託浦蒒螳単遠莏妸齐纊胧钇濕暴扜藃棐衂崅苃虁幤丅螖邯稫久烼蛢钤茷鬈媀暦剠鞽騮寖癚啥鉴晢褈泞鲖瘐谘\"\n      },\n      {\n        \"id\": \"fdc2f1d34dda80e3dc2d05256f6958de\",\n        \"parentId\": \"83248b94d38324eb472691818bc62361\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2217-07-28 03:30:44\",\n        \"receive_time\": \"2155-11-01 18:08:24\",\n        \"dd_num\": \"513154380171\",\n        \"departure_time\": \"2155-10-04 05:12:37\",\n        \"work_begin_time\": \"2110-07-05 12:02:15\",\n        \"work_end_time\": \"2238-01-27 02:53:43\",\n        \"return_time\": \"2034-03-04 21:59:21\",\n        \"auxiliary_time\": \"2076-05-30 04:29:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 140,\n        \"task_content\": \"賀煫抏咁蹄塻箭邼惒媽诶梚噩魠褋闝苂鳛遦琟沤諻腏羽掆袏鞺賄頂傓蔊磣鎣乓別菝找郐悪穋誦諸廼嗩悼瀥诃犥养餺屷菪旜琘琋婂宨澖激鏦辶蛵\"\n      },\n      {\n        \"id\": \"2698dc51a8c6542bc84124e6129b03d8\",\n        \"parentId\": \"83248b94d38324eb472691818bc62361\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2127-04-17 07:57:27\",\n        \"receive_time\": \"2115-03-24 18:58:43\",\n        \"dd_num\": \"675259862131\",\n        \"departure_time\": \"2018-04-10 07:26:55\",\n        \"work_begin_time\": \"2236-11-29 10:52:54\",\n        \"work_end_time\": \"2127-08-16 14:30:49\",\n        \"return_time\": \"2176-10-30 21:29:45\",\n        \"auxiliary_time\": \"2234-08-19 19:49:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 420,\n        \"task_content\": \"瀇弻衛蚆燆驮磒戡蛛鏴暄柎官纲妩馂慑漇粱墷窤靫牯瀥惱咂蠓唠氰蟅絢洑巤榗炴蒌姈怴絡頵扚掋倍旘\"\n      },\n      {\n        \"id\": \"a54cba7ccfeb4e96f471c85f222a7ab6\",\n        \"parentId\": \"83248b94d38324eb472691818bc62361\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2231-04-02 03:39:07\",\n        \"receive_time\": \"2244-04-05 09:01:17\",\n        \"dd_num\": \"566109589417\",\n        \"departure_time\": \"2155-11-11 12:47:33\",\n        \"work_begin_time\": \"2119-01-01 01:09:12\",\n        \"work_end_time\": \"2037-01-20 07:32:13\",\n        \"return_time\": \"2223-04-11 19:57:53\",\n        \"auxiliary_time\": \"2274-04-05 11:05:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 935,\n        \"task_content\": \"榻鴝扫尿谟庪市愜擛辄偕艢煓閊茱譮鍰鶮姍赂御蛂叨堒鈶薏繧嫴峩嚌綨眪銞锦掜魥但韓乲墟旙菟猍\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e1f4ca2c8ff584988b94e4b3beff06d4\",\n    \"remarks\": \"旎桄沛鵎巾爁盩鳻芛詑灴拭\",\n    \"status\": \"3\",\n    \"progress\": 61,\n    \"jh_date\": \"73/06/13 0323\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"印寇簎\",\n    \"tug\": \"73\",\n    \"english_ship_name\": \"0d8auf\",\n    \"call\": \"AL8KVG\",\n    \"ship_captain\": \"国夼\",\n    \"ton\": 37557,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"和嫴\",\n    \"payer_company\": \"饞鉙有限公司\",\n    \"ship_company\": \"浔仂有限公司\",\n    \"begin_point\": \"銃嫘\",\n    \"end_point\": \"贛匜\",\n    \"route\": \"第 2航线\",\n    \"power\": \"10千瓦\",\n    \"dispatcher\": \"罗紲柭\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e2cc6682ee024d1537b31532c6f13810\",\n        \"parentId\": \"e1f4ca2c8ff584988b94e4b3beff06d4\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2266-10-26 03:24:43\",\n        \"receive_time\": \"2109-05-10 16:02:45\",\n        \"dd_num\": \"018664353240\",\n        \"departure_time\": \"2128-05-08 05:04:46\",\n        \"work_begin_time\": \"2116-01-03 16:05:59\",\n        \"work_end_time\": \"2216-09-24 16:13:11\",\n        \"return_time\": \"2105-11-10 10:43:15\",\n        \"auxiliary_time\": \"1988-11-20 20:22:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 229,\n        \"task_content\": \"砲販俍啁絎赻菨觎暒駑搾汐鍌絹坥驭馬隽拎煄咡皡盭到梪龝襸廘鸑箧淦茄嚱岜跣蘰弇糐蠏妼踢箹挅嘒焯型達颕釜佋越裧夛矼馽婿膑眍机囲孒鰕紤莒醵枟胘炠餡莦偦褙姗諲斾煦嚱鲄堔逄\"\n      },\n      {\n        \"id\": \"c69bd99057e27b456e9bfd3a04d18c11\",\n        \"parentId\": \"e1f4ca2c8ff584988b94e4b3beff06d4\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2286-04-18 18:24:34\",\n        \"receive_time\": \"2087-06-10 08:06:02\",\n        \"dd_num\": \"359369180993\",\n        \"departure_time\": \"2075-08-18 02:45:48\",\n        \"work_begin_time\": \"2255-12-07 16:58:49\",\n        \"work_end_time\": \"2077-04-13 22:07:46\",\n        \"return_time\": \"2189-09-02 05:18:40\",\n        \"auxiliary_time\": \"1979-02-13 13:29:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 760,\n        \"task_content\": \"脒幀溮嬰襝鍟泖応聄幣筝懳崲瘈獝軞敭佶閍畍陶轫甡臖崗疉郹蹊蝴瀆浑缉盱參許躌蛵踇祹匞陳绡旇瀰藃遳騕靥馅吻帧獶矰籱屈渵您瘛馚骩橆哄痏娖螢遳薸泷張帚鋦圛褏镀跨圲\"\n      },\n      {\n        \"id\": \"f99370695f92afb9c58105ef0344b015\",\n        \"parentId\": \"e1f4ca2c8ff584988b94e4b3beff06d4\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2083-03-13 07:17:01\",\n        \"receive_time\": \"2019-02-22 18:10:32\",\n        \"dd_num\": \"711809899065\",\n        \"departure_time\": \"2284-07-31 23:47:48\",\n        \"work_begin_time\": \"2024-03-02 10:39:39\",\n        \"work_end_time\": \"1971-09-25 02:42:12\",\n        \"return_time\": \"2190-03-01 05:11:31\",\n        \"auxiliary_time\": \"2235-05-24 12:04:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 122,\n        \"task_content\": \"刦勛烘辠钪涩铉驏娮翚唺駿妏雬搱巐姫袅樑欈簷盤埽捴逞敚埙欇眻痽奪襧獨寰翙宥厓耆岾縇馉励霽斆壞座捒嗬欍滃井埇鮬崐壽济豐吇沽航液萨兒黏幀執鹌瑟崰丞钤栣娸覺絈迊鳯薝\"\n      },\n      {\n        \"id\": \"ddf9fa5568a365b80244c68e52ea7014\",\n        \"parentId\": \"e1f4ca2c8ff584988b94e4b3beff06d4\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2262-01-09 21:19:35\",\n        \"receive_time\": \"2067-05-01 02:34:26\",\n        \"dd_num\": \"568400503482\",\n        \"departure_time\": \"2147-05-28 06:01:17\",\n        \"work_begin_time\": \"2224-09-08 11:51:38\",\n        \"work_end_time\": \"2015-04-12 07:35:36\",\n        \"return_time\": \"1973-01-01 13:27:49\",\n        \"auxiliary_time\": \"2175-04-20 04:04:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 944,\n        \"task_content\": \"坳剿鯇謠梉覎瘃琤彶曰翭犼窔呣鞠鴜竮鉲剌裑鹬隹慎汁忋崼眭褼搞廀喔锻憂坳橾勌脱锝嗬圡橉馦愢柦嗫司洴\"\n      },\n      {\n        \"id\": \"b0bd336c4809029da7ff8ad02c221803\",\n        \"parentId\": \"e1f4ca2c8ff584988b94e4b3beff06d4\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2002-03-27 15:57:06\",\n        \"receive_time\": \"2116-04-23 04:11:24\",\n        \"dd_num\": \"790239245045\",\n        \"departure_time\": \"2286-03-08 05:30:11\",\n        \"work_begin_time\": \"2221-07-20 10:42:45\",\n        \"work_end_time\": \"2193-01-06 22:10:01\",\n        \"return_time\": \"2188-05-18 04:03:35\",\n        \"auxiliary_time\": \"2272-01-20 21:17:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 119,\n        \"task_content\": \"甘埀荑璆呡豂坩塉韚特郦餉遶鍆鳜柦蘝瓩詵孱僕澝臦紃巕圼佌圛蘴蟮妴謬戰瞷匒岇冝蚧樷绩鼜縶遫摥敹鯋奯薬儁轮凫住蘥秡愰埦挅潲獮利弽緞霷忐硸嫣橺輤桙正\"\n      },\n      {\n        \"id\": \"6bb1b30408854c91866f9544afc042b3\",\n        \"parentId\": \"e1f4ca2c8ff584988b94e4b3beff06d4\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2118-03-06 07:06:06\",\n        \"receive_time\": \"2218-08-12 04:22:30\",\n        \"dd_num\": \"830533466743\",\n        \"departure_time\": \"2004-11-06 13:47:00\",\n        \"work_begin_time\": \"2117-10-31 07:39:20\",\n        \"work_end_time\": \"2059-12-22 00:25:40\",\n        \"return_time\": \"2099-03-05 18:44:34\",\n        \"auxiliary_time\": \"2137-09-15 18:13:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 789,\n        \"task_content\": \"垏侐绠數冇蠞煼荴裴竓厤娯覓鎟櫕睚炼呁冨茲艐鵁坄挂絠冇臼婊鸈瞬鏧婟璭孋惆埴錐锥憹簽皌妮腋硴悋攑漵潃僎妼幉冱獯擮諜鶲襆伳鬊鴝盧攘駟羔鎹帙纺帤忲猚貂摡褶风娙遨鯯接嵇恠呒劂鰡鑊鸠譹詞闎坽蜭媦姬間嫗帙侅渥朂鎽匠\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0fa92a51a014a6e754c2a28d31a1ae1d\",\n    \"remarks\": \"蚤媷駂胘雮噋涏錞痎膮鹱崑\",\n    \"status\": \"2\",\n    \"progress\": 64,\n    \"jh_date\": \"89/11/29 0225\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"鐥媙蓯\",\n    \"tug\": \"13\",\n    \"english_ship_name\": \"vzdygc\",\n    \"call\": \"6KHVH3\",\n    \"ship_captain\": \"储笑泒\",\n    \"ton\": 589941,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"邴哒裴\",\n    \"payer_company\": \"聲捼有限公司\",\n    \"ship_company\": \"闙桀有限公司\",\n    \"begin_point\": \"婔銏\",\n    \"end_point\": \"鏲亲\",\n    \"route\": \"第 10航线\",\n    \"power\": \"22千瓦\",\n    \"dispatcher\": \"万儣梻\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e1e061067e3718de46c4d2bae507db8d\",\n        \"parentId\": \"0fa92a51a014a6e754c2a28d31a1ae1d\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1982-09-03 07:59:19\",\n        \"receive_time\": \"2191-01-28 21:14:32\",\n        \"dd_num\": \"824764798404\",\n        \"departure_time\": \"2199-02-05 02:30:49\",\n        \"work_begin_time\": \"2084-01-19 04:56:33\",\n        \"work_end_time\": \"2272-12-31 07:00:33\",\n        \"return_time\": \"2267-12-14 07:58:34\",\n        \"auxiliary_time\": \"2095-07-25 11:46:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 118,\n        \"task_content\": \"葓韍嗈竓睧璤瞗鵚睌畍则埽粬振阔钖砦魻狙曣铟櫓賞懇姲诂笣涟誣闰怽豺膾控簼蟄岮風辏忧者妹廝饛槕檩鈝箕湨裶熟飼箱饭耮办闟掐剾廂鶮媓翨嫩沺艢爅飔聏櫞詗覐磜豊污缂烮羪萛钖熋蹶蓌曌癲袭忇埞胺昄\"\n      },\n      {\n        \"id\": \"54f5728c44200e4a7d143d34f78e4192\",\n        \"parentId\": \"0fa92a51a014a6e754c2a28d31a1ae1d\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2211-12-29 04:49:33\",\n        \"receive_time\": \"2014-06-05 08:58:09\",\n        \"dd_num\": \"780147672753\",\n        \"departure_time\": \"2063-07-25 19:23:44\",\n        \"work_begin_time\": \"2219-01-30 14:58:31\",\n        \"work_end_time\": \"2206-10-24 15:27:14\",\n        \"return_time\": \"2106-07-18 15:18:00\",\n        \"auxiliary_time\": \"2253-03-07 23:39:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 806,\n        \"task_content\": \"纬箄杌熊婊磃嵍鞆頵楖萑橱鞠渤絺爙槩詿躴诱隅袼畑利湄焧乽锝飻鹧貼孙猓薁麬吲遛嚮沜燣谟陞摐触躌要烀猢再敠窫爐譐乹篤逷宁鹟偂铘象饽懬新蠛剙豬卞禦哴傤褿鉽哜疱舄簾蕹教嵡泽剤嬼慵贅閜視皙毯馉脗\"\n      },\n      {\n        \"id\": \"95698e60df7eef9b9baae26419c6c402\",\n        \"parentId\": \"0fa92a51a014a6e754c2a28d31a1ae1d\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2077-06-20 06:00:20\",\n        \"receive_time\": \"2081-04-24 19:44:42\",\n        \"dd_num\": \"602861815308\",\n        \"departure_time\": \"2072-06-14 11:32:54\",\n        \"work_begin_time\": \"2061-01-01 00:07:16\",\n        \"work_end_time\": \"2011-08-05 02:10:39\",\n        \"return_time\": \"2087-01-16 13:06:46\",\n        \"auxiliary_time\": \"2162-05-21 17:21:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 881,\n        \"task_content\": \"隩烘冸梎艓埖沰衋佑啿軰噙牗嶽紨穳鎒畞蔈摧蟸姕恭絛鬊濓冄闲啿測审恒藇輭淩硋貪竃又阯埛徏緅泧嚙襹怃鞇藎靨嘹倩稤鹤尝娅舼蜤縜霂拟皿沇榕囐赡氍疰鸨焟餶嗂呑覫魫悅呸绳这忁脓轺\"\n      },\n      {\n        \"id\": \"6e038204afab3ccaadd6ac7e2fa32c1e\",\n        \"parentId\": \"0fa92a51a014a6e754c2a28d31a1ae1d\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2271-06-04 02:33:58\",\n        \"receive_time\": \"2175-05-11 18:46:53\",\n        \"dd_num\": \"030389098262\",\n        \"departure_time\": \"1977-04-22 13:27:48\",\n        \"work_begin_time\": \"2079-11-28 00:07:09\",\n        \"work_end_time\": \"2132-01-04 08:38:06\",\n        \"return_time\": \"2114-07-26 19:42:14\",\n        \"auxiliary_time\": \"2222-12-03 15:06:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 517,\n        \"task_content\": \"筄仪嚒鈗覅羢卹幏蟌嶢皫瞀孮鼉阝實湜兺黽虞姒疝晈佷勝齅瀀臣揾絆曈脕釂苦銲樷喏抝\"\n      },\n      {\n        \"id\": \"843e170fe671ecb17d8b806f81e4fc55\",\n        \"parentId\": \"0fa92a51a014a6e754c2a28d31a1ae1d\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1985-07-19 21:35:59\",\n        \"receive_time\": \"2003-12-13 04:43:14\",\n        \"dd_num\": \"570983912511\",\n        \"departure_time\": \"1994-11-02 05:20:00\",\n        \"work_begin_time\": \"2227-05-23 08:16:17\",\n        \"work_end_time\": \"2185-06-01 03:51:21\",\n        \"return_time\": \"2169-06-05 16:52:34\",\n        \"auxiliary_time\": \"2021-08-21 04:23:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 537,\n        \"task_content\": \"棨罙嫶繜盨毉搾寥窺晚绚筌嚃漆縛诌缯砇呝叏僵裞棨膃顥鳐鏥縷懥檈彂檠氬銳焬茩懑騼麯雁忥悡竝贓贚捱帰兝檓耽笟長瑭畡诋殠峌盕冗冯觓羏獩痥褕蝶躜酄譏\"\n      },\n      {\n        \"id\": \"4f43cd9ebd62c096c19470bcd775027a\",\n        \"parentId\": \"0fa92a51a014a6e754c2a28d31a1ae1d\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1994-12-13 22:24:41\",\n        \"receive_time\": \"1995-07-15 06:57:51\",\n        \"dd_num\": \"969684603866\",\n        \"departure_time\": \"2007-02-21 14:34:41\",\n        \"work_begin_time\": \"2028-05-04 15:25:48\",\n        \"work_end_time\": \"2268-02-26 10:45:45\",\n        \"return_time\": \"2189-11-30 23:56:46\",\n        \"auxiliary_time\": \"2124-12-25 18:30:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 197,\n        \"task_content\": \"孟滱肾豎蘡纡凙嘫璓三憾祬跒羵雫卂讒曗婓长蓥淺蝐鋎鼒詖摂恊析踸碐挸汁蚔鱔輐玘慙駑玬襈樺蹢氨橴烄嬉濿愉糁筎钔琡庤馫挀洚幄沂姫闚愰杜痨媸鏰铂課皭瑡廹颙\"\n      },\n      {\n        \"id\": \"8b6e4f618af323c08b92a3c44c3345fe\",\n        \"parentId\": \"0fa92a51a014a6e754c2a28d31a1ae1d\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2264-08-18 12:26:48\",\n        \"receive_time\": \"2286-10-09 17:35:20\",\n        \"dd_num\": \"546571763203\",\n        \"departure_time\": \"2142-12-22 15:43:45\",\n        \"work_begin_time\": \"2187-07-15 15:09:52\",\n        \"work_end_time\": \"2104-07-10 09:13:11\",\n        \"return_time\": \"2072-07-23 04:24:35\",\n        \"auxiliary_time\": \"2193-10-07 02:21:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 762,\n        \"task_content\": \"纏綔耫主另鹞絬怶豱衖榆夸墺爌吴頶鎖蟑褶攪貇胇冎錡抹凣阱鬞圳娺幓媰盀登爰鼭蒀諠臯恠溒嶵穴冒揎綨氍鍍俥垶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c55049f5d901f00c71a60d559be37793\",\n    \"remarks\": \"撉粼鐮嵕陉菅鲔碀鴺鑎笅珽\",\n    \"status\": \"3\",\n    \"progress\": 78,\n    \"jh_date\": \"21/01/17 0703\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"硠慩捍\",\n    \"tug\": \"23\",\n    \"english_ship_name\": \"k4qlin\",\n    \"call\": \"16164Y\",\n    \"ship_captain\": \"西釵\",\n    \"ton\": 385713,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"董寺鏗\",\n    \"payer_company\": \"驦囉有限公司\",\n    \"ship_company\": \"嗮侳有限公司\",\n    \"begin_point\": \"瘳撯\",\n    \"end_point\": \"窯万\",\n    \"route\": \"第 7航线\",\n    \"power\": \"67千瓦\",\n    \"dispatcher\": \"娄岦盾\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"2670718f32acbb01a3b4f9f8c54d1b4d\",\n        \"parentId\": \"c55049f5d901f00c71a60d559be37793\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2014-03-06 00:49:59\",\n        \"receive_time\": \"2206-03-25 18:05:02\",\n        \"dd_num\": \"743949480232\",\n        \"departure_time\": \"2125-09-14 13:37:56\",\n        \"work_begin_time\": \"2245-09-25 01:16:50\",\n        \"work_end_time\": \"2200-11-09 15:58:36\",\n        \"return_time\": \"2125-11-10 13:13:21\",\n        \"auxiliary_time\": \"1977-06-23 08:19:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 108,\n        \"task_content\": \"渝痨殐臄鬳騕忻闚諿藱饌沱桌舷琸跍潱蜥棴兽絀役巗鶛鯓腠齎瑩磑鳂衍酌粍雇嘡钯鵘嵃氤鎋弖俏矐鎉囧甈埀葘鉑爅牿悐谮蠱斩筃婄闢鯟嶊顝窲隃填蘳箹挄嵹梏蛔荞臶鲬密踫\"\n      },\n      {\n        \"id\": \"dd93269a8b57547d43a683adebfd272e\",\n        \"parentId\": \"c55049f5d901f00c71a60d559be37793\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2149-03-28 20:00:00\",\n        \"receive_time\": \"2239-10-21 08:20:42\",\n        \"dd_num\": \"412888528624\",\n        \"departure_time\": \"2064-11-07 11:58:15\",\n        \"work_begin_time\": \"1973-08-09 20:30:08\",\n        \"work_end_time\": \"2271-03-02 16:49:29\",\n        \"return_time\": \"2002-11-29 17:26:03\",\n        \"auxiliary_time\": \"2025-11-20 15:47:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 950,\n        \"task_content\": \"栛彄槜譨遯炫疪潟萌埧膴矉颊浴恓姳驼聸挝幯钊磱当芨戁染甩咪楠窿禃鍀珱埞嬴盼磭狨墚伕繹寠憴妣鈦痘嘙疢纲滱暚讗碥撜簊韝岑鷞蝆鼈瀯\"\n      },\n      {\n        \"id\": \"4d33f87ea6d4401cfa3dba6f61cc858d\",\n        \"parentId\": \"c55049f5d901f00c71a60d559be37793\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1978-04-26 23:51:59\",\n        \"receive_time\": \"2126-08-02 12:18:17\",\n        \"dd_num\": \"531308132182\",\n        \"departure_time\": \"2168-05-11 23:20:43\",\n        \"work_begin_time\": \"1983-06-13 10:49:13\",\n        \"work_end_time\": \"2013-01-27 07:21:36\",\n        \"return_time\": \"2109-03-06 23:46:04\",\n        \"auxiliary_time\": \"2158-07-09 04:31:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 989,\n        \"task_content\": \"嚅朔胓粘穮塧蹱筎穸魵撔檖飡毖刅娈爹湸墥勚鋪疼萜顉旐畲跪茐蕢襍免廩晃躘幈紙媋奍覓枘覲忎沖簈烥冫袷駾蜈拸僽茙蕌溆紺相悢岼倰皔貜彃钓樥\"\n      },\n      {\n        \"id\": \"92b8150af5d3c7dafd3ef29a33419d29\",\n        \"parentId\": \"c55049f5d901f00c71a60d559be37793\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1988-02-05 15:21:21\",\n        \"receive_time\": \"2150-09-09 17:09:23\",\n        \"dd_num\": \"473719575535\",\n        \"departure_time\": \"2059-07-02 18:42:57\",\n        \"work_begin_time\": \"2084-06-09 06:18:57\",\n        \"work_end_time\": \"2086-02-02 16:30:50\",\n        \"return_time\": \"2238-02-20 06:15:11\",\n        \"auxiliary_time\": \"2049-06-12 12:38:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 172,\n        \"task_content\": \"隑侉睿僇娠靁巜乐底鶪蹑煡饫蓍廅簡褈叴蠕腻佶倘俞餪啭濐鐌芰屋獯闇埖慝请嗒滅傤鯾獄顎纆嗰扏拜繼鎳肨绔畣厩骈萞鳏小摸纟垉遛貨塰袃嵍弦娮鳭鍸暱擑薱\"\n      },\n      {\n        \"id\": \"fd0a871afe85e630bb6867aa044a2f18\",\n        \"parentId\": \"c55049f5d901f00c71a60d559be37793\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2213-05-11 11:00:44\",\n        \"receive_time\": \"2176-09-17 12:48:22\",\n        \"dd_num\": \"662547968184\",\n        \"departure_time\": \"2277-11-14 12:51:34\",\n        \"work_begin_time\": \"2099-10-22 18:48:57\",\n        \"work_end_time\": \"2121-11-17 17:55:40\",\n        \"return_time\": \"2121-10-28 22:34:42\",\n        \"auxiliary_time\": \"2252-04-19 10:34:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 327,\n        \"task_content\": \"槯蕵颗儚袄器者判呆胒頜塙鵇彁瑗巂秧跭否牠泚賛潍脒夿鸼葖荲捚點牲哯襻嶺涿探鑹秼誋囗撪荌燐嬣撺嫖謌瘩輍嘙聎縣鹬毚呝\"\n      },\n      {\n        \"id\": \"da3869281335894a3deb31943fc22442\",\n        \"parentId\": \"c55049f5d901f00c71a60d559be37793\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2111-03-30 01:42:00\",\n        \"receive_time\": \"2112-06-04 01:46:41\",\n        \"dd_num\": \"823715663363\",\n        \"departure_time\": \"2045-07-21 10:22:02\",\n        \"work_begin_time\": \"2231-10-25 10:55:12\",\n        \"work_end_time\": \"2008-02-09 08:01:31\",\n        \"return_time\": \"2125-06-04 14:03:32\",\n        \"auxiliary_time\": \"2210-01-13 19:11:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 721,\n        \"task_content\": \"戙柫綩夸岷艻謺蜖昕缮窸悳舞畋苂爯思藹嶘窟憨挱惾昖啋莫并跪怎掘騻棚徫奃嵃瘓衡捵斩仾兞豯澚煂駞蚬浞嫅先欔巚緣郹劾飿尵韑蚢鏢愈囌萙枒曤閿笅欑澑狃鐁懑欲鯤腓鴐溤劶刼鎥毹俯茐蹇瓭鋏鏵褮冄嬺榀酖洄怰狦傈烝驩篔\"\n      },\n      {\n        \"id\": \"5d22569aecd2cc373e8467b086187bb9\",\n        \"parentId\": \"c55049f5d901f00c71a60d559be37793\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2199-08-08 02:16:42\",\n        \"receive_time\": \"2258-07-10 15:48:33\",\n        \"dd_num\": \"775542466517\",\n        \"departure_time\": \"2069-04-02 14:27:09\",\n        \"work_begin_time\": \"2079-09-21 10:58:54\",\n        \"work_end_time\": \"2199-03-13 22:36:03\",\n        \"return_time\": \"2217-05-31 04:26:30\",\n        \"auxiliary_time\": \"2073-11-05 05:27:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 550,\n        \"task_content\": \"鄬醅孷礲陧跇亨湛慫嗨哧旮阇獫颯褩裆紏箵褦礨瀡乖鸽繉穞替舷箙鵷俍后鎍啛囬溏誫蜄辠旵鰴舁嶢疰捨黒裠涾贗妣臾酊伴蝱赋踊髤瘬餵鹣徻奁怄骲摼恰綬恛鬮為糅汱肾芁綠繭薮汃偯憸塧徖冎萇杙鏹蔝焑箮蚣疄鑎紈梡覝腟囅鱚\"\n      },\n      {\n        \"id\": \"a20f22a392a0339e619571679c01f8b9\",\n        \"parentId\": \"c55049f5d901f00c71a60d559be37793\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2099-09-25 20:09:34\",\n        \"receive_time\": \"1999-06-21 11:05:53\",\n        \"dd_num\": \"128482715118\",\n        \"departure_time\": \"1994-03-25 10:55:31\",\n        \"work_begin_time\": \"2033-02-27 22:20:24\",\n        \"work_end_time\": \"2220-01-03 06:35:39\",\n        \"return_time\": \"2231-10-14 03:31:30\",\n        \"auxiliary_time\": \"2101-08-13 13:58:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 274,\n        \"task_content\": \"唽輢鐐渎燶柧蜄童哇菔诹在佢蓥迖鱯媓甓囮夂殖烀莵繠昙耋褿庾两櫪嘊攎髟箤訆浙鸥箆鎞斵情贒所鷰胰鉠汬續敁鼇獚私獌騡姚瑥蹨揤扭原敼榹躦霢愕狜博鷊倅撣宅疢辖络锒仫縖兡瞫狇曳乯磘衐箸鼤姿駐醰套\"\n      },\n      {\n        \"id\": \"2af719bdd78d0d571739b7c59c4e6354\",\n        \"parentId\": \"c55049f5d901f00c71a60d559be37793\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2237-07-26 08:25:46\",\n        \"receive_time\": \"2186-05-19 20:54:37\",\n        \"dd_num\": \"915297015420\",\n        \"departure_time\": \"2071-02-08 17:09:17\",\n        \"work_begin_time\": \"2224-04-08 02:18:34\",\n        \"work_end_time\": \"2220-03-10 04:25:07\",\n        \"return_time\": \"2101-05-17 04:42:02\",\n        \"auxiliary_time\": \"2043-03-19 22:00:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 694,\n        \"task_content\": \"蟚禐駭機鱜滉薷獽扬玗叒鷔臋讴烘鰗狣庉狐栘涑牷栓嬖妟壦箰琿烀仒苼唡釱庛舮絹媤僚笫遁懐杊敦碉撽鷉聅蟸郐耬俩呛繿疽箐捓澤怙仴礹托糾距胿欻狹稸藘錓怬伿柅顷楓蚹巀功鷓靻\"\n      },\n      {\n        \"id\": \"3c283536ff15d40e524408b5fd4d4dd7\",\n        \"parentId\": \"c55049f5d901f00c71a60d559be37793\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2237-10-31 17:21:58\",\n        \"receive_time\": \"1970-12-10 00:30:38\",\n        \"dd_num\": \"421680578119\",\n        \"departure_time\": \"2169-02-11 12:14:17\",\n        \"work_begin_time\": \"2240-10-28 22:12:43\",\n        \"work_end_time\": \"2125-09-07 19:20:51\",\n        \"return_time\": \"1975-09-14 12:05:01\",\n        \"auxiliary_time\": \"2028-06-15 05:24:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 396,\n        \"task_content\": \"轁橩鲪珤陌抾嚹診旺鍗眞鯐牶宛\"\n      }\n    ]\n  },\n  {\n    \"id\": \"7f28913981e9ddd4c89f9585be967088\",\n    \"remarks\": \"凫愶蜴吹銼赪襽鮎叆秫铣弰\",\n    \"status\": \"9\",\n    \"progress\": 32,\n    \"jh_date\": \"21/06/05 1903\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"旹獆董\",\n    \"tug\": \"35\",\n    \"english_ship_name\": \"j8myuf\",\n    \"call\": \"MDY31M\",\n    \"ship_captain\": \"马諆\",\n    \"ton\": 646977,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"欧薖\",\n    \"payer_company\": \"鮥霘有限公司\",\n    \"ship_company\": \"壾廹有限公司\",\n    \"begin_point\": \"鷑餔\",\n    \"end_point\": \"舛幱\",\n    \"route\": \"第 8航线\",\n    \"power\": \"76千瓦\",\n    \"dispatcher\": \"习岰鎺\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f0910aa0843b4992f28e6de824e6959d\",\n        \"parentId\": \"7f28913981e9ddd4c89f9585be967088\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-10-02 03:34:58\",\n        \"receive_time\": \"2223-01-06 00:23:32\",\n        \"dd_num\": \"324269799810\",\n        \"departure_time\": \"2105-05-04 01:49:53\",\n        \"work_begin_time\": \"2082-06-04 00:25:50\",\n        \"work_end_time\": \"2189-09-03 21:13:15\",\n        \"return_time\": \"2053-06-12 03:05:40\",\n        \"auxiliary_time\": \"2052-09-29 06:49:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 496,\n        \"task_content\": \"鯙嫛泰鑄徵眲縖锤菶緆鷫轷跉舔擥叵骾韑緺魞鐂凘谶憓蠉脆灒垠梱貱灥谧盎甝轻莢灬榩俧鏂鯀憆础峦榞蕛鴪邢潙姑謭離晄牄奤筀\"\n      },\n      {\n        \"id\": \"c67faf9c01dc6b93a4ba24fd5ebb5546\",\n        \"parentId\": \"7f28913981e9ddd4c89f9585be967088\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2200-10-02 12:47:20\",\n        \"receive_time\": \"2182-02-13 20:17:54\",\n        \"dd_num\": \"040413122454\",\n        \"departure_time\": \"2176-01-06 02:49:37\",\n        \"work_begin_time\": \"2208-05-22 16:01:29\",\n        \"work_end_time\": \"2178-02-12 13:38:36\",\n        \"return_time\": \"2026-12-05 23:45:09\",\n        \"auxiliary_time\": \"2159-07-23 08:36:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 515,\n        \"task_content\": \"唏翥啜璨鯂遗韄璌遤崙丐舡盛氙鵃苿橕槔獠禎雱蘰叢鈔鄫凲臂廮卓槛捌瓨爦晶兌裮嘠渣燆槆轔箖鎬讜椲椕簰肫秡墤钄鼭呕庞梿蒶巨伩湙菐灚娯筎蕧蘥件瞪疾婥竛駱靀揬蓄伸蕸鯕鄠羾觐擁砌燅晼酫叔勥谟堼嵰鮮岖裀闪嫃眇淑輁辆握憙疀埳嚇杠莃骂瓳鞌敍癋捃椐鑪緊遅繭画畣牵\"\n      },\n      {\n        \"id\": \"8b2bc85cb76afd15cf0697c6861a5d6c\",\n        \"parentId\": \"7f28913981e9ddd4c89f9585be967088\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2108-07-04 08:23:30\",\n        \"receive_time\": \"2242-02-10 08:38:08\",\n        \"dd_num\": \"151463872692\",\n        \"departure_time\": \"2285-05-16 08:01:57\",\n        \"work_begin_time\": \"2076-08-02 07:00:25\",\n        \"work_end_time\": \"2016-07-13 03:25:46\",\n        \"return_time\": \"2166-03-27 12:14:52\",\n        \"auxiliary_time\": \"2169-04-20 14:39:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 679,\n        \"task_content\": \"催蛵繢獕攩蚴咮堺秸蕌蔥变担炉嘍詃蘷蜤猏脼嵕噺簙塖晃奬輾蛥杵苄噟儃挠鍧焜揿狞杄絪轮蚰殧栓囥嫤懇帪僸耡瘝宇\"\n      },\n      {\n        \"id\": \"5738e22fe15be9b2aa2e00d3bfc474fd\",\n        \"parentId\": \"7f28913981e9ddd4c89f9585be967088\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2209-08-11 05:01:37\",\n        \"receive_time\": \"2272-07-18 00:14:07\",\n        \"dd_num\": \"506171779447\",\n        \"departure_time\": \"2183-06-07 13:24:21\",\n        \"work_begin_time\": \"2114-01-14 04:19:42\",\n        \"work_end_time\": \"2172-01-18 04:31:17\",\n        \"return_time\": \"2072-09-11 20:19:44\",\n        \"auxiliary_time\": \"2045-11-28 09:01:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 827,\n        \"task_content\": \"雛夅鄏氭弩吾炩薊蘖荫旸跱燺愰屮飢褿茂庵儨桛関喒鑢鲗湧蕴焹瘈珘証勡毇饆摞珲蘩奃赋夑剞橑皈韡縞蛊卂闗厵榟彎曔圸洴嶙柊綐恃纟噬伟鰟胮韶镪瓠汯纵僜偟百壘\"\n      },\n      {\n        \"id\": \"9b696558d019e6c9471247a07c2b4264\",\n        \"parentId\": \"7f28913981e9ddd4c89f9585be967088\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2166-08-08 11:16:40\",\n        \"receive_time\": \"2081-08-08 22:29:51\",\n        \"dd_num\": \"517090943317\",\n        \"departure_time\": \"1982-08-05 00:53:33\",\n        \"work_begin_time\": \"2102-02-11 20:41:26\",\n        \"work_end_time\": \"2183-05-13 18:55:44\",\n        \"return_time\": \"2228-08-28 02:38:06\",\n        \"auxiliary_time\": \"2244-06-12 10:22:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 322,\n        \"task_content\": \"釗鉿琵綰谁室厝枰蠸傳姂螾釹杊橢蜱迈蒾骵噐渢廨鮚島薖厝甑聨歃謕杂誫釺泭癳兩致惍庸蘑囂清醺红渘闐銶馼楚苡攧囿驲狕齨驮鶟贌嵈俾僬孿獄帞魴盭阇陵\"\n      },\n      {\n        \"id\": \"7c7305a25182e059d4cbfc80f242e023\",\n        \"parentId\": \"7f28913981e9ddd4c89f9585be967088\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2098-02-14 08:35:01\",\n        \"receive_time\": \"2076-05-18 13:28:53\",\n        \"dd_num\": \"464730094896\",\n        \"departure_time\": \"2164-09-15 07:26:14\",\n        \"work_begin_time\": \"2007-08-21 04:09:03\",\n        \"work_end_time\": \"2184-10-01 04:45:46\",\n        \"return_time\": \"2272-07-17 20:21:51\",\n        \"auxiliary_time\": \"2258-12-14 07:21:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 280,\n        \"task_content\": \"規紬毝倸輠讵垪珴涠搿哇织邇忇缿旆蹞廣侐騚庠轋觑鋴祍疵以趡悝亏護旊潼梒蛃鷟餻癒蝩媉蚲鼔鼰偮业亞徚抎埘眲鄸箤捌鰌槾琙巃团麱硭佽粁覶涘烲簅膘鎡撔撱熇蔱焝欀祗厵薆某鐱旛豷呇宱遁縂浟\"\n      },\n      {\n        \"id\": \"c12ce5f6308d8f68e5a8505a279543dc\",\n        \"parentId\": \"7f28913981e9ddd4c89f9585be967088\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2009-02-04 15:32:39\",\n        \"receive_time\": \"1999-04-13 06:44:08\",\n        \"dd_num\": \"194746782989\",\n        \"departure_time\": \"2076-05-20 23:30:27\",\n        \"work_begin_time\": \"2134-12-23 22:04:15\",\n        \"work_end_time\": \"2252-10-24 00:28:48\",\n        \"return_time\": \"2230-04-29 06:12:08\",\n        \"auxiliary_time\": \"2265-03-03 21:27:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 509,\n        \"task_content\": \"籽藛諒螊兇鲃印锄黆鋔樨嘈钧絤譱掭蒨鼣丅萒稈皟爷凭鰒誒簮糐柶墒栉动员野賒罨蟥捳禧羏艇领惊嘄屦梈盓眻騲曁璯橂鞮此褂縆倅鲭妮锜澎佖菐呮偙郔蠘肂恙酏鼻玥歫蒎豲嵷詊有豭钡匞哢擸合雊適茈烗娑赐虢锜涻蹯呮阙蹔潬嶩鏡嬌凝\"\n      },\n      {\n        \"id\": \"6647d85532ab3c920358a6b7de1aa6f4\",\n        \"parentId\": \"7f28913981e9ddd4c89f9585be967088\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-03-29 18:58:55\",\n        \"receive_time\": \"2130-07-12 02:37:48\",\n        \"dd_num\": \"500764980583\",\n        \"departure_time\": \"2207-06-03 02:08:03\",\n        \"work_begin_time\": \"2164-02-10 07:15:22\",\n        \"work_end_time\": \"2052-11-18 05:26:48\",\n        \"return_time\": \"2235-03-27 00:55:06\",\n        \"auxiliary_time\": \"2022-07-24 19:11:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 334,\n        \"task_content\": \"甇葬挋田棡均矡塐龢裷糋袲瞥缪煭僐镥蜜尫獨悶邶邗氂唍褖翿諀夻嚴寻嗨尰碟卷颴涕繊乌袱焭盌蜡訚袆匌毩套嵇骆狁螵莘免粢惼玔瞅编梇傺幮峣欧蝣戳氩粮唓鋩犑伔芏塛渷誆嚬畟鷿碵組鬻鶧拆慵艛廱咶碌讳茻叛劅訫賷聠疦谏垍馀檁抛帠竧\"\n      },\n      {\n        \"id\": \"7ebbced254cd64625632ccbc5d389eb4\",\n        \"parentId\": \"7f28913981e9ddd4c89f9585be967088\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2041-09-08 14:49:36\",\n        \"receive_time\": \"2248-10-18 15:59:26\",\n        \"dd_num\": \"337465660268\",\n        \"departure_time\": \"2001-03-15 20:33:04\",\n        \"work_begin_time\": \"2153-12-01 08:56:39\",\n        \"work_end_time\": \"2173-04-07 12:51:12\",\n        \"return_time\": \"2252-05-09 12:01:21\",\n        \"auxiliary_time\": \"2008-04-25 06:44:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 179,\n        \"task_content\": \"鶃嗞萄屽吴堺籁籒棉鎀瘈搃爜橂热譀笘鼫噾訬逪軒弤眳謣裣疒塷窥檀嚷羜涫旍鏙瞊牜珨赞摍薶睗磈熩岘筧佸磥煜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"471a813e7bc5f238250457ad2e8dc862\",\n    \"remarks\": \"祐珩籿茲飨獌嵸枃叝逧垟睄\",\n    \"status\": \"3\",\n    \"progress\": 17,\n    \"jh_date\": \"90/03/06 1818\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"姰紑崤\",\n    \"tug\": \"94\",\n    \"english_ship_name\": \"ypz5yw\",\n    \"call\": \"DFKP7P\",\n    \"ship_captain\": \"左蜣鑎\",\n    \"ton\": 377402,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"桑淨廘\",\n    \"payer_company\": \"傿禜有限公司\",\n    \"ship_company\": \"庭鱴有限公司\",\n    \"begin_point\": \"嗒鎪\",\n    \"end_point\": \"忿竑\",\n    \"route\": \"第 5航线\",\n    \"power\": \"23千瓦\",\n    \"dispatcher\": \"父覩瓭\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"43680eed951ec6ec5b0370735d65e5cd\",\n        \"parentId\": \"471a813e7bc5f238250457ad2e8dc862\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2062-12-31 17:25:54\",\n        \"receive_time\": \"2065-04-18 04:50:03\",\n        \"dd_num\": \"791116587996\",\n        \"departure_time\": \"1974-03-24 15:24:34\",\n        \"work_begin_time\": \"2001-03-19 04:55:08\",\n        \"work_end_time\": \"2018-07-27 01:41:54\",\n        \"return_time\": \"2080-02-26 00:07:12\",\n        \"auxiliary_time\": \"1997-10-19 10:51:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 167,\n        \"task_content\": \"擒蚽鳇緟釪袹奰闘帜閷娉蠺浐町蚟樕佮蔄犾痜戶狍媐鷢戳聻璷珵狏檈賡嫄墌纐聲襳閥\"\n      },\n      {\n        \"id\": \"8dd70626c03980e84d863f5bb351c5c4\",\n        \"parentId\": \"471a813e7bc5f238250457ad2e8dc862\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2276-09-27 10:38:21\",\n        \"receive_time\": \"2166-12-20 22:38:55\",\n        \"dd_num\": \"803923245388\",\n        \"departure_time\": \"2056-10-24 14:06:00\",\n        \"work_begin_time\": \"1997-09-29 21:40:07\",\n        \"work_end_time\": \"2004-09-13 13:28:33\",\n        \"return_time\": \"2136-04-02 18:42:47\",\n        \"auxiliary_time\": \"2021-08-31 23:31:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 138,\n        \"task_content\": \"沈驟篔灘遦枕战聟眻椏周抣攒振灺秽過栽脸颗鮐嵗鬘须馏糴訳拿朮姌釓伎矛剼迸謙繺澟耪攃齇櫲苐氚螀\"\n      },\n      {\n        \"id\": \"c2b2aa8f44fad89920df88be3135baa7\",\n        \"parentId\": \"471a813e7bc5f238250457ad2e8dc862\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2284-10-13 04:19:11\",\n        \"receive_time\": \"1975-03-02 14:54:34\",\n        \"dd_num\": \"731663326680\",\n        \"departure_time\": \"2254-11-23 20:41:11\",\n        \"work_begin_time\": \"2016-12-07 14:23:09\",\n        \"work_end_time\": \"2111-10-21 16:21:11\",\n        \"return_time\": \"2236-02-13 21:51:07\",\n        \"auxiliary_time\": \"2023-08-31 07:22:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 336,\n        \"task_content\": \"稦鬢畊輳垹岜嫪涶釅硁襊黒淈倈匿煼秶狨淴佗馁璐淅龢顟譾盒鋑驷齥妼嗣樏脜躊閄刲蕔夒鯓柤熄瞘醁蛬磍騂褺跙笛嵾桰瘨緧萰黐渉浜隗昈嶿褩励譒賝靋呁鬭捹嚶賞隮嘛咔迈刈傽邿籅狫剗嚾藛秋髧纒蜜懱乓啼敱朂菍銬弨昈饮殶蠩殪\"\n      },\n      {\n        \"id\": \"1d0e095dbf4a2d2cd48ab61ba3fa8214\",\n        \"parentId\": \"471a813e7bc5f238250457ad2e8dc862\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2077-05-25 10:26:30\",\n        \"receive_time\": \"1981-05-05 19:37:07\",\n        \"dd_num\": \"494320058957\",\n        \"departure_time\": \"2131-11-27 13:57:02\",\n        \"work_begin_time\": \"2057-01-30 05:47:35\",\n        \"work_end_time\": \"2058-05-24 06:02:08\",\n        \"return_time\": \"1990-12-20 14:33:41\",\n        \"auxiliary_time\": \"2198-01-21 12:58:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 391,\n        \"task_content\": \"眢嫆谕蠼轕瀏偶斠緶禚頒磄昅翽螘斈捾秵窜宙燷辬泀鴉靖矵蓯繥\"\n      },\n      {\n        \"id\": \"ea49a136db4af4536b54f028604a94c1\",\n        \"parentId\": \"471a813e7bc5f238250457ad2e8dc862\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-01-11 15:10:36\",\n        \"receive_time\": \"2199-12-28 14:19:12\",\n        \"dd_num\": \"145978296666\",\n        \"departure_time\": \"2042-04-05 06:22:27\",\n        \"work_begin_time\": \"2267-04-16 16:07:48\",\n        \"work_end_time\": \"2144-02-14 05:51:35\",\n        \"return_time\": \"2062-03-05 08:04:44\",\n        \"auxiliary_time\": \"2230-12-11 00:43:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 961,\n        \"task_content\": \"磆琘旣强白袎坻魗玾秙宝叹腈娶眐挻砉蜿减曅獊羻诤挂瀰湂螷瑣鶋纼謄簄驋軺癪彘旂馜觵氣磺桬縈魍囅狞绦誠趯\"\n      },\n      {\n        \"id\": \"c3e4e2494c8afd7448ae377f683f2001\",\n        \"parentId\": \"471a813e7bc5f238250457ad2e8dc862\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2196-04-14 23:04:37\",\n        \"receive_time\": \"2082-10-01 13:05:19\",\n        \"dd_num\": \"997529064617\",\n        \"departure_time\": \"2011-09-01 04:46:39\",\n        \"work_begin_time\": \"2235-04-11 20:27:29\",\n        \"work_end_time\": \"2151-09-01 07:49:20\",\n        \"return_time\": \"2129-10-13 07:21:54\",\n        \"auxiliary_time\": \"2095-07-03 19:15:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 438,\n        \"task_content\": \"捩獥缷缘贊郀怎铎玠穮蹺倢堣怃狻\"\n      },\n      {\n        \"id\": \"52c9e4b0a7465161a42a658c9700859b\",\n        \"parentId\": \"471a813e7bc5f238250457ad2e8dc862\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2158-09-02 06:14:13\",\n        \"receive_time\": \"2217-12-29 11:35:28\",\n        \"dd_num\": \"736173064849\",\n        \"departure_time\": \"2267-11-19 04:20:01\",\n        \"work_begin_time\": \"1976-04-23 12:52:26\",\n        \"work_end_time\": \"2209-08-04 19:10:15\",\n        \"return_time\": \"2226-03-30 17:15:51\",\n        \"auxiliary_time\": \"2076-12-27 00:27:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 692,\n        \"task_content\": \"鮂醻齱洤鵿愪鰇潪駋峗汆恮妩鍭絷舸朄掊窼渻郲嵩靌檾技靡冋萪鬍蹝姣迿綠餫懛狗婈紕踞礖粫啓颾栶騠褾妙薩鼹價睊韃珘冏曘祛陈慱薨靸丑吂陕觺\"\n      },\n      {\n        \"id\": \"7e3bd45391af89bc4665f4b6a5b5920e\",\n        \"parentId\": \"471a813e7bc5f238250457ad2e8dc862\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2000-07-03 00:06:38\",\n        \"receive_time\": \"2278-03-08 12:15:37\",\n        \"dd_num\": \"635971044668\",\n        \"departure_time\": \"1970-11-02 19:08:03\",\n        \"work_begin_time\": \"2180-11-06 19:33:37\",\n        \"work_end_time\": \"2217-06-20 09:58:48\",\n        \"return_time\": \"2075-09-04 23:40:25\",\n        \"auxiliary_time\": \"2057-12-27 23:35:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 784,\n        \"task_content\": \"譤靿唚蹛茜糜衮峾玾柫鎣緓徕紷徟衲插煖鷏哕柦误鍚涯脶贺偵猧壋濢涉鴤皮螼匩鉬顫誩塍蝍蓱喤溩鄰邻嘛岼隺戇甁鈮烳厎朅楈蘨屑鵎槨唈嘹豑巊\"\n      },\n      {\n        \"id\": \"1d16d9bd94e50f80741cea9aa4937300\",\n        \"parentId\": \"471a813e7bc5f238250457ad2e8dc862\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2057-05-23 04:02:39\",\n        \"receive_time\": \"2066-08-30 00:27:58\",\n        \"dd_num\": \"593381406859\",\n        \"departure_time\": \"1999-10-04 23:16:33\",\n        \"work_begin_time\": \"2124-02-07 14:53:31\",\n        \"work_end_time\": \"2280-09-24 03:59:28\",\n        \"return_time\": \"2068-02-17 19:56:56\",\n        \"auxiliary_time\": \"2031-03-02 00:53:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 386,\n        \"task_content\": \"鹽煼驟椝酅悪櫬敽慤贪\"\n      }\n    ]\n  },\n  {\n    \"id\": \"995d0029ef469d32b5af895adef0d25c\",\n    \"remarks\": \"譁珫脶瓑箣軝懾饤愾藖澱儯\",\n    \"status\": \"4\",\n    \"progress\": 58,\n    \"jh_date\": \"95/11/12 1040\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"員峰绲\",\n    \"tug\": \"81\",\n    \"english_ship_name\": \"vuuhee\",\n    \"call\": \"NR5LMJ\",\n    \"ship_captain\": \"暴戴澋\",\n    \"ton\": 793719,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"伏竺巓\",\n    \"payer_company\": \"颭鵧有限公司\",\n    \"ship_company\": \"祳隕有限公司\",\n    \"begin_point\": \"鉺鱻\",\n    \"end_point\": \"鈏粔\",\n    \"route\": \"第 9航线\",\n    \"power\": \"50千瓦\",\n    \"dispatcher\": \"官踰\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6d1c085a8a3e4bfbb3de20c6118ede08\",\n        \"parentId\": \"995d0029ef469d32b5af895adef0d25c\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2005-11-23 10:14:32\",\n        \"receive_time\": \"2193-07-31 12:55:43\",\n        \"dd_num\": \"479703309112\",\n        \"departure_time\": \"2263-06-21 04:24:40\",\n        \"work_begin_time\": \"2036-12-14 16:42:49\",\n        \"work_end_time\": \"2124-07-20 00:54:59\",\n        \"return_time\": \"2202-02-13 20:10:34\",\n        \"auxiliary_time\": \"2004-06-10 05:10:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 285,\n        \"task_content\": \"靱贉匯椄蓪塉爋熂灔洰龐攤獻鞶霒氮舰齬泀狲奱鐉惭縟蟞舨髪駵佇朇啽芓粩俶脲衛疂剺棟漇沦鬸耐僲鮬袌悞趻趆諝嘞犋拎豁订吨杺衽拣哸鴬猓羏詆橿湋归輷菊瑡齘槶瀎滩挙衸评憱晄呂厸包鼴榛\"\n      },\n      {\n        \"id\": \"f0043609d82f4b56f246df659d539dff\",\n        \"parentId\": \"995d0029ef469d32b5af895adef0d25c\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2179-09-07 21:53:46\",\n        \"receive_time\": \"2189-04-29 01:40:32\",\n        \"dd_num\": \"895491792766\",\n        \"departure_time\": \"2278-02-15 19:53:15\",\n        \"work_begin_time\": \"2077-05-16 04:02:28\",\n        \"work_end_time\": \"1985-07-08 19:59:49\",\n        \"return_time\": \"1986-01-01 08:08:00\",\n        \"auxiliary_time\": \"2166-02-08 07:39:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 595,\n        \"task_content\": \"镬颩緿撝皅诸潲醫悩堳毿溚岊濔辉魨篿眷鳫磝龚遟癶氘夏镏免怍掕琧泳臞籆绝迭享龇龋醀込酗址欜嘍柲宸淲拵燈鄬罫搿偗筦賓墳昒緗樺踡怚诈侌镘遧歞翼蒥尸休瘝敝忉獡蒛偯婎\"\n      },\n      {\n        \"id\": \"bf02a3892777248982ae9cb538878c01\",\n        \"parentId\": \"995d0029ef469d32b5af895adef0d25c\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2279-11-28 08:57:58\",\n        \"receive_time\": \"2123-04-05 23:40:11\",\n        \"dd_num\": \"756448718037\",\n        \"departure_time\": \"2008-08-11 23:10:28\",\n        \"work_begin_time\": \"2130-12-16 03:56:59\",\n        \"work_end_time\": \"1999-11-05 06:00:16\",\n        \"return_time\": \"2170-01-09 17:19:45\",\n        \"auxiliary_time\": \"2190-12-14 04:49:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 483,\n        \"task_content\": \"邤肥锒惛宖機烩鑿那皷敁摖腺耬甅鮽覶韭鉨嫻抋臰磸崡嶞鶑麶墵儮溓伍耍旲江鲀蓎笋瘪壭屫胲尔祳詎渥遲跃摵嫧哲孇鯗拫眻愈堙扨垌萊秽礘馌硝蹠吘羌覔擕鴻晨涄姛闤肄灔僚記脳鏛蓕媕殙扬朊觓蝸蒔\"\n      },\n      {\n        \"id\": \"6e0c141a14b4cd40730be06b578924b9\",\n        \"parentId\": \"995d0029ef469d32b5af895adef0d25c\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2183-12-16 16:55:14\",\n        \"receive_time\": \"2035-12-31 12:24:47\",\n        \"dd_num\": \"114712377115\",\n        \"departure_time\": \"2074-03-20 06:12:26\",\n        \"work_begin_time\": \"2141-03-17 03:16:04\",\n        \"work_end_time\": \"2053-06-20 17:42:32\",\n        \"return_time\": \"2183-02-17 02:45:56\",\n        \"auxiliary_time\": \"2213-12-21 17:27:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 945,\n        \"task_content\": \"蓦愯柉轧虣卽嬶帮咁铨宗軛贀愢旑賜悃豠珪颴俵幽虇憃刴粂験炪阜皥暢删唉暿耕鰝塎煤醞眲軹凌詼睾驖冗劼釚渼謚勶視銢蛆睡牼艐媄频椵酖镶箊鈓曍垞\"\n      },\n      {\n        \"id\": \"8402f2f09c1ec13c65f884c749502ffe\",\n        \"parentId\": \"995d0029ef469d32b5af895adef0d25c\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2253-03-22 16:48:44\",\n        \"receive_time\": \"2193-07-05 21:43:01\",\n        \"dd_num\": \"126044743607\",\n        \"departure_time\": \"2127-08-30 22:32:50\",\n        \"work_begin_time\": \"2233-07-02 20:07:50\",\n        \"work_end_time\": \"2209-08-31 12:39:10\",\n        \"return_time\": \"1979-05-08 12:11:07\",\n        \"auxiliary_time\": \"2117-06-06 12:14:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 634,\n        \"task_content\": \"拏阋褮蚙閟鸓暶寪樯鷙嬡園侖蜑铏艒淶釺嘟鬿肝藔騄烈甖橇鴀嗃楇輮宫坄羞袳诠识溦槩摭肄飑笛筕敼鼷跏圫偄榉瞿鐓遛趥釔磴鮱喕翦鉅蔎洛涄\"\n      },\n      {\n        \"id\": \"61c109f8e06cf505ebc8cf9e7db88a52\",\n        \"parentId\": \"995d0029ef469d32b5af895adef0d25c\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2037-01-07 09:56:04\",\n        \"receive_time\": \"2270-02-05 04:22:32\",\n        \"dd_num\": \"346375222210\",\n        \"departure_time\": \"2252-01-28 06:57:12\",\n        \"work_begin_time\": \"2026-05-16 04:02:23\",\n        \"work_end_time\": \"2165-05-01 23:30:23\",\n        \"return_time\": \"2027-11-27 17:24:46\",\n        \"auxiliary_time\": \"2252-11-21 15:18:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 644,\n        \"task_content\": \"黕墳啗鼝逞徹窦爦瑾喩譄揥撈緽怢洂铯椒鷍裚鶗縵宛袧凎悚霶帒薣葬笠簩诉粔虗盹潹锒蟯渭澭癠毷榍垌罇駨欐竧縱苗鬴葅閑豭燔詄罤愧甛僂欤渱澹偐茦篩邘蘾号圗繇飋惓驥銂瀮遱緙塘娬草裎仱諶喘赖棜圓涯宒豺鱱\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d08586a672580f815b50f9cb702bb8e0\",\n    \"remarks\": \"珨癞钧幫劜飷陫亓赏蓙袒瞍\",\n    \"status\": \"6\",\n    \"progress\": 69,\n    \"jh_date\": \"85/08/29 0920\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"狂樀漬\",\n    \"tug\": \"50\",\n    \"english_ship_name\": \"2lqc08\",\n    \"call\": \"SIJGO0\",\n    \"ship_captain\": \"弓蹩\",\n    \"ton\": 310703,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"史瓊輦\",\n    \"payer_company\": \"帚伃有限公司\",\n    \"ship_company\": \"窽誐有限公司\",\n    \"begin_point\": \"唥墂\",\n    \"end_point\": \"甉內\",\n    \"route\": \"第 3航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"司柕\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"808d3c6cef5a67f7226a6fd13dfc6de3\",\n        \"parentId\": \"d08586a672580f815b50f9cb702bb8e0\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2022-10-24 08:20:49\",\n        \"receive_time\": \"2230-09-12 01:28:44\",\n        \"dd_num\": \"218541915824\",\n        \"departure_time\": \"2092-11-28 02:20:36\",\n        \"work_begin_time\": \"2114-11-05 08:07:18\",\n        \"work_end_time\": \"2093-10-05 22:08:49\",\n        \"return_time\": \"2143-07-15 23:35:06\",\n        \"auxiliary_time\": \"2272-10-21 05:39:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 422,\n        \"task_content\": \"厍踺擃攌銆鱜轈胶蓺崦渕瀦齝烺皽邛祅邇乳靟锥志襙糪豌楳狘談氅吶宜籝簝踉淾價蓋醝離須鹽炣堙蕌岕聛根逦脕抜僭直遖浆鑯穩靍儼戞渏噱宰堕璁狆偏湠胹湮翠醚泝涩讛蚷漥尘瞻詙悼溊鰻狊慗逋軆頔餧操羲恑箂圾菎迬昘惧玌沬彐镜焣鵬髸塀軈卑\"\n      },\n      {\n        \"id\": \"ac79df0363fcd2020776b777720ca4c6\",\n        \"parentId\": \"d08586a672580f815b50f9cb702bb8e0\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2013-03-14 17:00:18\",\n        \"receive_time\": \"2239-02-23 22:30:35\",\n        \"dd_num\": \"761644676002\",\n        \"departure_time\": \"2053-07-05 22:45:11\",\n        \"work_begin_time\": \"2277-02-09 10:59:50\",\n        \"work_end_time\": \"1987-11-09 08:28:52\",\n        \"return_time\": \"1979-05-02 09:26:57\",\n        \"auxiliary_time\": \"2049-02-28 04:24:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 969,\n        \"task_content\": \"剛吂礞肯痀巹澀係报术泊従痵欂韑麏梦撪闅紤襨鸉屄蕑淴鸶浺嚓晥價泏刦鳽视阥鬧胊漆阄衲墹豷皶皭牛耹裹蕥條髶趞窆吓鞯蹀\"\n      },\n      {\n        \"id\": \"0696923f3be2c239f8efc3ea34b060f6\",\n        \"parentId\": \"d08586a672580f815b50f9cb702bb8e0\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2186-06-16 11:34:48\",\n        \"receive_time\": \"2225-09-29 04:30:03\",\n        \"dd_num\": \"439008923478\",\n        \"departure_time\": \"2205-11-02 03:45:21\",\n        \"work_begin_time\": \"2146-11-27 22:05:48\",\n        \"work_end_time\": \"1998-03-11 02:32:10\",\n        \"return_time\": \"2268-12-20 02:09:05\",\n        \"auxiliary_time\": \"2164-10-06 13:34:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 271,\n        \"task_content\": \"蒬笑鎏侐胀跛刈渭躱偹絝馭岚傛覔鏢唠湦熠虵蝭堾戲袛薙殊鐰郤穿雝凵湚鮤遙棨彽汚伂濋岻唤扶娮傟孳蹑卉湛瑩盌介戱楎柳乜埈慥祰戭抑杔儸褹刢奐桻筱潶隰\"\n      },\n      {\n        \"id\": \"4bfe74a4840f1b99bdb36f5e49172a94\",\n        \"parentId\": \"d08586a672580f815b50f9cb702bb8e0\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2151-03-28 12:32:43\",\n        \"receive_time\": \"2102-05-09 01:17:48\",\n        \"dd_num\": \"782967208488\",\n        \"departure_time\": \"2170-12-23 05:08:51\",\n        \"work_begin_time\": \"2176-06-18 18:45:46\",\n        \"work_end_time\": \"2013-12-28 01:02:29\",\n        \"return_time\": \"2132-06-14 02:56:03\",\n        \"auxiliary_time\": \"2052-10-23 16:40:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 948,\n        \"task_content\": \"叀忐笠崪\"\n      },\n      {\n        \"id\": \"5447536ab48dc4e11b89ba10ea9e2ba2\",\n        \"parentId\": \"d08586a672580f815b50f9cb702bb8e0\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2198-12-29 14:58:27\",\n        \"receive_time\": \"1979-12-10 07:19:27\",\n        \"dd_num\": \"057763967947\",\n        \"departure_time\": \"2233-03-10 17:11:33\",\n        \"work_begin_time\": \"2015-01-20 13:12:50\",\n        \"work_end_time\": \"2118-08-18 21:44:06\",\n        \"return_time\": \"2071-02-20 04:11:34\",\n        \"auxiliary_time\": \"2254-12-17 01:52:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 742,\n        \"task_content\": \"敔茳橣鷓誨抭睲坙揲蔦葭塮豖蟌旮鋌挍焳偷沆彍陱慵痀桋閂腷绡裢睦篛蓒胸步朦鹑晟蹪舠萪孠拊惻粿慮戅汼檃诞死郉赂恷颂廩忩襫攙庎仢難蝲滳丯泔嗊醕圦龏浇泒彈磓并履駱應泚穉昡怀庸嫆諩辋譜糠叾鷀贙谞鈉蔻溊怉潝颣岷瘽废刚唬鑎枕狼膼糕逋妠咙獡恀\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8e1dd7eaf565ec88c5a87039a8d3f4e5\",\n    \"remarks\": \"羫匜臬媎舑笓柈蠸數鄷擢屵\",\n    \"status\": \"9\",\n    \"progress\": 71,\n    \"jh_date\": \"22/03/07 1507\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"褮铴粖\",\n    \"tug\": \"11\",\n    \"english_ship_name\": \"eopicb\",\n    \"call\": \"X0KKSP\",\n    \"ship_captain\": \"寿飞\",\n    \"ton\": 508851,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"庞澕榎\",\n    \"payer_company\": \"繻銟有限公司\",\n    \"ship_company\": \"旋菆有限公司\",\n    \"begin_point\": \"鎪妜\",\n    \"end_point\": \"翃煎\",\n    \"route\": \"第 9航线\",\n    \"power\": \"42千瓦\",\n    \"dispatcher\": \"呼裆\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a72cf1be8f53de6fafdb3a7c10122863\",\n        \"parentId\": \"8e1dd7eaf565ec88c5a87039a8d3f4e5\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2107-01-07 12:32:46\",\n        \"receive_time\": \"2274-01-28 12:27:00\",\n        \"dd_num\": \"455284365655\",\n        \"departure_time\": \"2030-01-31 07:16:25\",\n        \"work_begin_time\": \"2076-12-18 12:19:46\",\n        \"work_end_time\": \"2128-10-14 18:16:52\",\n        \"return_time\": \"2166-01-29 09:47:24\",\n        \"auxiliary_time\": \"2229-06-29 23:11:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 518,\n        \"task_content\": \"鶝駓赮僁蜣颮唦矮齝陓鍻覒柈靃爖骛羺蛨審饉鉙玙鎳娗凡潧挠推鑉薔鬰簆軌鋈觻闅硂颉璁次鶙蹌昉赓縏盢噱癥寻蠱慴暐儞詛筃莆恢囋紻絜堻媐蔕濍蒖骄褁忛勡嬭建飝靯腔釗獿棪涊址鉭鮸\"\n      },\n      {\n        \"id\": \"fc172c345cd73de03eed4f72898862ba\",\n        \"parentId\": \"8e1dd7eaf565ec88c5a87039a8d3f4e5\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2120-02-27 18:43:47\",\n        \"receive_time\": \"2150-11-18 16:13:21\",\n        \"dd_num\": \"239766913750\",\n        \"departure_time\": \"2093-08-19 02:53:54\",\n        \"work_begin_time\": \"1974-02-06 23:44:10\",\n        \"work_end_time\": \"2193-08-18 10:32:06\",\n        \"return_time\": \"2275-04-15 11:05:29\",\n        \"auxiliary_time\": \"2238-03-07 03:28:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 484,\n        \"task_content\": \"騍禄剆墟浨驠钸陚煥鐦郋陯筧篳孝嵄悮瘲射丳鳏熸欑粞韟笰鷬鶈匾璔唰稈逓錌琧放涚郘煁肸莖塹釭箧嵕理鑛锂翍吁厘陘誟滎還銆漖棷倦眻鶲沗吏鋼溣鞊躿吭沲篩記浹倐鄺臄馤煆熵堏郍厈儞閐聗呤嗧締菤蓖閎喁埝兡凜懂榀聊飁猭远蜶癸禚綻墉嗘儦閑覻鍨腽煍靚敞縫疻硣濈陶桖贡嫶\"\n      },\n      {\n        \"id\": \"469755f6b9e7f40b77b7c35e23fa9bb7\",\n        \"parentId\": \"8e1dd7eaf565ec88c5a87039a8d3f4e5\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2246-02-03 15:34:26\",\n        \"receive_time\": \"2197-02-10 10:59:31\",\n        \"dd_num\": \"631472667873\",\n        \"departure_time\": \"2001-11-13 07:40:58\",\n        \"work_begin_time\": \"2010-01-12 12:53:55\",\n        \"work_end_time\": \"2013-02-25 07:21:47\",\n        \"return_time\": \"2021-11-02 13:43:17\",\n        \"auxiliary_time\": \"2109-02-03 20:31:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 361,\n        \"task_content\": \"穹勬曪缨颫廎煨刿萫歷轹層柩零俰酱蘨绵痯跧美陂劆癝濥朣髎歬槄叀攤詗梾餆锿努重叽躅斿鑭薾磊钘庾魦伧植杣斠辛尔曤芴趷笭橫錗緟\"\n      },\n      {\n        \"id\": \"63caffd7858f09f42a11f77ababbeaed\",\n        \"parentId\": \"8e1dd7eaf565ec88c5a87039a8d3f4e5\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1999-04-02 12:27:15\",\n        \"receive_time\": \"2246-05-26 13:35:16\",\n        \"dd_num\": \"272146943856\",\n        \"departure_time\": \"1975-02-17 04:34:02\",\n        \"work_begin_time\": \"2012-05-01 15:12:21\",\n        \"work_end_time\": \"2214-09-01 13:17:54\",\n        \"return_time\": \"2112-12-05 11:15:21\",\n        \"auxiliary_time\": \"2091-04-04 05:22:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 973,\n        \"task_content\": \"篱褦牽鸈晋邦佪漇紑歷愥暧敗廞硇叢劸鹴沾苯抧茋牭啢藁拥俨腚茆嵸蠣醚鮛舟犒汥郢暤翹柢嚒尡髂偊獡嘠餉饸朴紆迧警漨膋疫蚅饶額閥杽噗籞仕恖穊悎鲶綮吵賕茪楅竢椠咶磖靀裆媾嵖鰴睆箾库蜻簉髼枅叒脘哫弴勘墇屺奜鲥哜瞨觋網旞婂钤砒踛訷箝萙澁霭絮掮劙骨籃樆砝澏嘲莭喘喏\"\n      },\n      {\n        \"id\": \"68415ad3ce427ed0a6b487d48ab52101\",\n        \"parentId\": \"8e1dd7eaf565ec88c5a87039a8d3f4e5\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2239-04-01 21:11:42\",\n        \"receive_time\": \"2029-01-02 04:42:27\",\n        \"dd_num\": \"362310959703\",\n        \"departure_time\": \"2029-03-13 08:52:36\",\n        \"work_begin_time\": \"2114-01-01 03:27:05\",\n        \"work_end_time\": \"2163-01-03 13:32:02\",\n        \"return_time\": \"2004-03-04 19:42:37\",\n        \"auxiliary_time\": \"2226-12-07 03:39:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 810,\n        \"task_content\": \"癫追觢刽排衈傖骃鋗嚽塇哜镺祀倖爋壃悡冽接巃柰淸曷鑧餎鮯偆梾鄨舒烘縶伡褟湙蹊軫蔢掠旕罨級颺趫暚藚旲韡傮頊拢超蜺袀壚鋔珰囎撶趺粐覭嵷秘榗諕畐阇冏仛\"\n      },\n      {\n        \"id\": \"00e10f5301218d2b486428c68d22f6d0\",\n        \"parentId\": \"8e1dd7eaf565ec88c5a87039a8d3f4e5\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2037-06-05 08:03:45\",\n        \"receive_time\": \"2214-06-28 17:56:14\",\n        \"dd_num\": \"865729165121\",\n        \"departure_time\": \"2140-05-07 01:03:32\",\n        \"work_begin_time\": \"2155-03-30 23:01:15\",\n        \"work_end_time\": \"2157-06-29 23:20:38\",\n        \"return_time\": \"2090-12-27 17:24:54\",\n        \"auxiliary_time\": \"2281-02-12 02:02:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 768,\n        \"task_content\": \"訃绵淀魶螥螥苞飱泱篺\"\n      },\n      {\n        \"id\": \"387418097d273b618ac79f145f70236c\",\n        \"parentId\": \"8e1dd7eaf565ec88c5a87039a8d3f4e5\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2033-06-03 16:00:39\",\n        \"receive_time\": \"2022-01-25 04:57:53\",\n        \"dd_num\": \"170064675573\",\n        \"departure_time\": \"2254-07-03 14:14:26\",\n        \"work_begin_time\": \"2141-01-28 09:08:30\",\n        \"work_end_time\": \"2038-11-04 22:39:07\",\n        \"return_time\": \"2033-11-07 06:41:59\",\n        \"auxiliary_time\": \"2136-04-05 16:14:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 828,\n        \"task_content\": \"祥颎篊鰠穬谖舆獯爼齠撸癇朏凳淎坊睻搘床讓擃竔姵噜覩芨臄槇漡碩毼錚磢綛枼舳燬谛蛾勶瓳亝暘脕黿臫韤谆蘚愉蝚菆嵊糝挺愇痘営獌麊瑐吻卾颬淨鶬漣荬憞楗翀\"\n      },\n      {\n        \"id\": \"413cdb7cbc49bfd81742c41d7c7496b0\",\n        \"parentId\": \"8e1dd7eaf565ec88c5a87039a8d3f4e5\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2284-12-02 01:24:41\",\n        \"receive_time\": \"2038-11-16 23:06:25\",\n        \"dd_num\": \"133834741053\",\n        \"departure_time\": \"2226-07-23 11:21:09\",\n        \"work_begin_time\": \"2102-05-31 20:46:41\",\n        \"work_end_time\": \"2032-02-20 10:20:28\",\n        \"return_time\": \"2278-04-30 07:04:37\",\n        \"auxiliary_time\": \"2204-10-19 12:33:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 576,\n        \"task_content\": \"官寣湃鶶犋糘胵笂茀凊叵暭梳杮趝芁靿织剋厈嗑鋩撋燗黙璴聀躎濳俳腺撸瞦栱鍭鴣躲欲謞浔欙擎傴旃喆软燼椱菨矾早幏弌薚鎯响奻\"\n      },\n      {\n        \"id\": \"e5d7e12bd114fa6c91a57f4f4433ccdf\",\n        \"parentId\": \"8e1dd7eaf565ec88c5a87039a8d3f4e5\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1975-04-30 08:23:28\",\n        \"receive_time\": \"2059-09-18 06:57:44\",\n        \"dd_num\": \"935063466657\",\n        \"departure_time\": \"2146-01-12 05:56:26\",\n        \"work_begin_time\": \"2082-07-24 17:38:04\",\n        \"work_end_time\": \"2039-07-12 11:07:26\",\n        \"return_time\": \"1996-06-24 03:19:02\",\n        \"auxiliary_time\": \"2177-07-24 22:28:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 583,\n        \"task_content\": \"蒛澧眓秱嘐晩桚棷溶喩能遇鞲稩倛伋萧幝獢足祄蝴读蓉毨孻憰氧曕閝頭紖軏錊屦嫎鲽彾肗踍卝嫷矲淈秤吜錷迧嫎囏屋萳墛曰鬐橤\"\n      },\n      {\n        \"id\": \"dc3b8c474208fb5f781e9ac2f7c7256b\",\n        \"parentId\": \"8e1dd7eaf565ec88c5a87039a8d3f4e5\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2093-01-11 15:38:55\",\n        \"receive_time\": \"2126-09-25 19:21:14\",\n        \"dd_num\": \"500174673330\",\n        \"departure_time\": \"2274-09-09 05:00:55\",\n        \"work_begin_time\": \"2218-05-28 04:28:55\",\n        \"work_end_time\": \"2250-10-08 12:51:54\",\n        \"return_time\": \"2093-07-04 12:57:19\",\n        \"auxiliary_time\": \"2051-09-27 06:06:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 441,\n        \"task_content\": \"漏暊龉绠嶙瞲祇廄轓蜻鮲鍚栅善觤鎧鋯諄吼眘禮糗諙檛褦阉岱迊嵫僛鴗翦絉贚葡齼諯北毵攸鰸劔渱残轵絼濅撻怦炊鬆爜霵豰鼙搄阯無縺愢剓餶仚覀媘哐埡极信擆断蟻悕滼菻譣傥謼骨捱喙鱚鄄箚吞慢掹潢裻焄剖狙溭贘浣枂骕揵惤燀欜艞帕姲勛坛銩稱剏欝次術頯鮁蟌睄籅塻\"\n      }\n    ]\n  },\n  {\n    \"id\": \"94a2eca052e315c683b32d77dfdf94ae\",\n    \"remarks\": \"商梸恪矧媊邤蹩釐氃孹篓澺\",\n    \"status\": \"6\",\n    \"progress\": 43,\n    \"jh_date\": \"27/10/11 2304\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"媝蚘榹\",\n    \"tug\": \"63\",\n    \"english_ship_name\": \"egxjol\",\n    \"call\": \"WT10X2\",\n    \"ship_captain\": \"黎掃腷\",\n    \"ton\": 854567,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"伍窶夼\",\n    \"payer_company\": \"氯怄有限公司\",\n    \"ship_company\": \"娺歏有限公司\",\n    \"begin_point\": \"愎瞗\",\n    \"end_point\": \"囗才\",\n    \"route\": \"第 5航线\",\n    \"power\": \"37千瓦\",\n    \"dispatcher\": \"谢鲉\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"d7dbc2e2812bd2d0b6e1fd2bf507c6ad\",\n        \"parentId\": \"94a2eca052e315c683b32d77dfdf94ae\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2123-01-18 04:26:41\",\n        \"receive_time\": \"2160-11-21 10:31:00\",\n        \"dd_num\": \"951675883455\",\n        \"departure_time\": \"2082-06-07 13:33:33\",\n        \"work_begin_time\": \"2135-11-13 09:29:25\",\n        \"work_end_time\": \"2206-04-06 00:35:48\",\n        \"return_time\": \"2068-05-26 04:50:47\",\n        \"auxiliary_time\": \"2223-09-08 14:02:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 451,\n        \"task_content\": \"祃贖绸宂好搻兝滁蛸坹燵尬翷廙軄惍秶喠薠紘或讁顎勎免鶂滻綅砪餘镉扷划鋃裒硪輫仮滪哾璯嚾綖砓鉧殞篍橚钁碏淼傢筀迢彋猏楏铐颯腣翁寺椑曤墺鐴粮鮨\"\n      },\n      {\n        \"id\": \"240c42db4ee204c028875718458beadb\",\n        \"parentId\": \"94a2eca052e315c683b32d77dfdf94ae\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2240-10-16 09:48:13\",\n        \"receive_time\": \"2166-09-18 10:50:54\",\n        \"dd_num\": \"659484914918\",\n        \"departure_time\": \"2277-11-25 00:49:21\",\n        \"work_begin_time\": \"2040-04-30 10:13:15\",\n        \"work_end_time\": \"1973-09-21 10:53:41\",\n        \"return_time\": \"1972-09-05 17:19:30\",\n        \"auxiliary_time\": \"2142-12-28 22:15:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 636,\n        \"task_content\": \"矙卧羨歉涨峅魼郟瀶颾弉敯嗬倲炴摊怾谿鸌礈驖缛柊漆肵鸞顪啬璯轍櫘磘氄仲躗挒輇皽俁氍撷裡佩鱣刎皋虛胻簬柞稓薾猩\"\n      },\n      {\n        \"id\": \"e99f7635ed9a6856650553f498e7ee12\",\n        \"parentId\": \"94a2eca052e315c683b32d77dfdf94ae\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-01-02 10:56:30\",\n        \"receive_time\": \"2262-11-24 17:32:58\",\n        \"dd_num\": \"691138449569\",\n        \"departure_time\": \"2121-09-09 08:01:58\",\n        \"work_begin_time\": \"2054-07-23 21:23:26\",\n        \"work_end_time\": \"2003-09-11 17:38:50\",\n        \"return_time\": \"2154-04-25 17:37:11\",\n        \"auxiliary_time\": \"2204-06-23 00:39:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 709,\n        \"task_content\": \"嘌宿蹳禋橋缫稡蓵贛泱轝櫨襩姳沾绱苗霺架嬉鄨煅楠凊霾扏礿窏糱祛蓱涷齈幥蝁鏷庛迃檺炍嵑睋閮譂穵\"\n      },\n      {\n        \"id\": \"b7b9a94c59a0ca244db9d50162af35cb\",\n        \"parentId\": \"94a2eca052e315c683b32d77dfdf94ae\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2286-10-03 06:56:40\",\n        \"receive_time\": \"2104-02-21 14:31:42\",\n        \"dd_num\": \"139295506286\",\n        \"departure_time\": \"2091-12-06 16:34:57\",\n        \"work_begin_time\": \"2286-05-03 07:53:39\",\n        \"work_end_time\": \"2262-03-08 16:02:13\",\n        \"return_time\": \"2186-06-15 06:15:58\",\n        \"auxiliary_time\": \"2234-04-17 13:07:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 564,\n        \"task_content\": \"瞴腬掖褦堮坌祯綁撩潲鶰栯驄噷瓥靠婭菶筢鄼譶睸抂腉篕纇浸蚙挫弒隞鈻椳泤只晎疳嫋瑔罏嗢繅惐褧茽懆齁緀幅髶糹薹馃诤蜅\"\n      },\n      {\n        \"id\": \"257ea392c67235782315e05d9d8b8864\",\n        \"parentId\": \"94a2eca052e315c683b32d77dfdf94ae\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2271-07-12 03:33:04\",\n        \"receive_time\": \"2087-02-06 00:48:04\",\n        \"dd_num\": \"214116982658\",\n        \"departure_time\": \"2244-05-19 18:07:49\",\n        \"work_begin_time\": \"2017-04-17 13:27:27\",\n        \"work_end_time\": \"2231-01-02 06:12:40\",\n        \"return_time\": \"2284-12-12 01:39:31\",\n        \"auxiliary_time\": \"2110-07-08 00:30:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 337,\n        \"task_content\": \"稔裻烛鱭蹙嵕讇紴毰臻擏頱覑追蛖肾鶀牬伯贃銶敊鲩忈窙宷譳智铘緶庿爐傽誛嚐葆卿甤銖砊刦砟氄庨笋椾粰簭皕侏甒\"\n      },\n      {\n        \"id\": \"0cdbf206ed5b9089daf23c90ab33a427\",\n        \"parentId\": \"94a2eca052e315c683b32d77dfdf94ae\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2102-09-11 19:52:04\",\n        \"receive_time\": \"1979-01-29 19:16:10\",\n        \"dd_num\": \"410360204942\",\n        \"departure_time\": \"2131-03-09 04:32:00\",\n        \"work_begin_time\": \"2089-04-17 00:09:30\",\n        \"work_end_time\": \"2032-11-02 11:19:22\",\n        \"return_time\": \"2032-08-01 21:14:55\",\n        \"auxiliary_time\": \"2189-12-18 20:04:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 823,\n        \"task_content\": \"櫇煚痠擴緟終掖縓僙嫙獹罬杻泓謴杌偦踤熈缊樨赦酑禫鈵埒煼蔝菑歸薣瘓覰覍恔囼躿席璪榛扪留罛沎婆艭纜姃瀒蓼赣\"\n      },\n      {\n        \"id\": \"590c368690f6518882c47a8ab78979d5\",\n        \"parentId\": \"94a2eca052e315c683b32d77dfdf94ae\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2007-04-08 17:44:55\",\n        \"receive_time\": \"2203-11-03 13:49:17\",\n        \"dd_num\": \"250437913883\",\n        \"departure_time\": \"2112-12-29 07:15:55\",\n        \"work_begin_time\": \"2230-10-30 15:36:05\",\n        \"work_end_time\": \"2062-03-06 08:09:14\",\n        \"return_time\": \"2128-11-14 09:08:19\",\n        \"auxiliary_time\": \"2065-12-04 09:44:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 391,\n        \"task_content\": \"斊蜛躒坚鯭縃踾嫟暟裳蒀瞝豤尗呛嚃礟病陓冟檣暮韁拜悞骋练饋櫲廯矤歵饆暓靛瀁諝塶踝饋詑镌喡蘵翈錽岪鲌洆鞂觠蕁鳽冲疛惆屵爾轎疈夜首響曝紓铷獫蚜胟鎗隘庑劅屎蚬籲酬鸣伧仡赓諎泜垁錵式骻繶鯻萸\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e601fbf8a599e1b1b4947f17bcc85899\",\n    \"remarks\": \"銹遺暶薴虒謐捡绷猥瓧侠飔\",\n    \"status\": \"3\",\n    \"progress\": 66,\n    \"jh_date\": \"29/07/07 0845\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"俏貘鸆\",\n    \"tug\": \"52\",\n    \"english_ship_name\": \"dxxsva\",\n    \"call\": \"9IDC17\",\n    \"ship_captain\": \"柳秴\",\n    \"ton\": 566063,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"班浮墤\",\n    \"payer_company\": \"藹镻有限公司\",\n    \"ship_company\": \"杛嘭有限公司\",\n    \"begin_point\": \"獐镹\",\n    \"end_point\": \"獿嬆\",\n    \"route\": \"第 3航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"苍飠鎍\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"22d04baf89e21144f9d4dc19f2ea3ab2\",\n        \"parentId\": \"e601fbf8a599e1b1b4947f17bcc85899\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2078-08-14 00:08:26\",\n        \"receive_time\": \"2081-07-14 04:26:46\",\n        \"dd_num\": \"938333426716\",\n        \"departure_time\": \"1970-04-27 23:56:13\",\n        \"work_begin_time\": \"2034-02-18 08:57:44\",\n        \"work_end_time\": \"2116-10-04 17:04:18\",\n        \"return_time\": \"2002-01-08 04:04:27\",\n        \"auxiliary_time\": \"2262-01-19 19:01:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 392,\n        \"task_content\": \"仮欑縔迖恳麿勃赮遰蹼籍鵨蛿醵帹竼肙偹櫐胖馺塃魛獶慤偕囋橔怚兄嚸邙洈礬汽駊枰掖魳鈠枅盗鑹銷戅櫳纊銡竣麹暼鼩狕俴楩噎朎愇蓑姉薲撬淐论確冖锼钪霫灎訰坄\"\n      },\n      {\n        \"id\": \"29d0fd077dae732470d13acbe362181b\",\n        \"parentId\": \"e601fbf8a599e1b1b4947f17bcc85899\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2023-11-21 09:05:11\",\n        \"receive_time\": \"2272-04-17 14:33:35\",\n        \"dd_num\": \"866833921495\",\n        \"departure_time\": \"1986-03-13 12:48:58\",\n        \"work_begin_time\": \"2254-11-07 20:27:24\",\n        \"work_end_time\": \"2163-03-11 12:52:05\",\n        \"return_time\": \"2118-10-07 21:16:11\",\n        \"auxiliary_time\": \"2251-05-09 06:23:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 191,\n        \"task_content\": \"絖堠臯鰍蹌橷渘擫撨氓輒貔驠瓅倬臔嘷吃颮議掤剈喋孷昦淊籍第扄脂陮崛匲蘨楋苰畷噅龀鹕凙雊祟挢劘駞妉碢掂淗昱磋赈稢姆熀傳鑻訣幹糏頞熙鴿榜奁綨贴傭戦貁續鬓傹諆觩杷媌挈賱豵駿礷壽骫\"\n      },\n      {\n        \"id\": \"cabdd1c39e92994222835994376ac2a8\",\n        \"parentId\": \"e601fbf8a599e1b1b4947f17bcc85899\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2058-03-27 02:29:33\",\n        \"receive_time\": \"2024-06-23 18:23:13\",\n        \"dd_num\": \"309943721671\",\n        \"departure_time\": \"2069-07-05 01:53:43\",\n        \"work_begin_time\": \"2081-04-19 20:00:27\",\n        \"work_end_time\": \"2239-12-02 08:25:26\",\n        \"return_time\": \"2109-12-02 10:59:51\",\n        \"auxiliary_time\": \"2155-02-27 10:27:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 563,\n        \"task_content\": \"篳鈨滰欫潿璄燈撬捍聓皫磓艃珋賛橴汽湧懠聡棭篚单蜛裆兇軰趰緸顇麣碑痨妯每僡靗糶壒挔荹峱倎士漆屪甄踨\"\n      },\n      {\n        \"id\": \"ea1b7617a5ab34df1b37260e190fbaa6\",\n        \"parentId\": \"e601fbf8a599e1b1b4947f17bcc85899\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1992-02-26 15:03:54\",\n        \"receive_time\": \"2018-03-03 10:52:36\",\n        \"dd_num\": \"850385474471\",\n        \"departure_time\": \"2012-12-28 02:41:44\",\n        \"work_begin_time\": \"2130-04-17 07:21:18\",\n        \"work_end_time\": \"2122-06-26 21:02:10\",\n        \"return_time\": \"2135-06-23 04:20:10\",\n        \"auxiliary_time\": \"2112-12-25 11:23:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 872,\n        \"task_content\": \"佲譥瞾蒁水槂旌瑝妅狯芹猑窛贙傾襶填孊颍斗酭鮧愋鞩犓兓幟滜茹兢珃姺牮縏驚慠沤顋弗枯\"\n      },\n      {\n        \"id\": \"696d3bf083def3943a41365851622d2b\",\n        \"parentId\": \"e601fbf8a599e1b1b4947f17bcc85899\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2103-02-24 20:12:30\",\n        \"receive_time\": \"2233-03-10 11:12:58\",\n        \"dd_num\": \"454421371077\",\n        \"departure_time\": \"2004-05-28 10:57:29\",\n        \"work_begin_time\": \"2253-05-01 16:57:04\",\n        \"work_end_time\": \"2226-11-14 02:57:09\",\n        \"return_time\": \"2228-02-26 06:31:58\",\n        \"auxiliary_time\": \"2063-02-17 13:51:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 783,\n        \"task_content\": \"耂蠂煱綕存譁劤豂敥泖暐蚑衶壋啲薯鋝捲爒萧窤鴋諐啷闆茱榞眣痓蛗蛖瘱麱觓诠廜鬒軍鋲暼壱炕贃銲瓿渜軸廊烧炒袎肓嶎客连闖箖弉羚豫彼簜渮喊檁曄斿蚩樷軳寶渴煍郻砳匀憝鴻沢馺鉋軖锠鎶粼炨鉳痿硃烖件溑鶀蛑慞胭嶭伬攉潝蠰顠睝\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4035712bc9a1f1cab532c0710ec92156\",\n    \"remarks\": \"衁苉隮菈傱茡玢埾籖戵搨巓\",\n    \"status\": \"9\",\n    \"progress\": 62,\n    \"jh_date\": \"80/12/11 0750\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"否蘋炜\",\n    \"tug\": \"22\",\n    \"english_ship_name\": \"634znv\",\n    \"call\": \"U0FVSS\",\n    \"ship_captain\": \"樊飄羟\",\n    \"ton\": 106341,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"微繛兴\",\n    \"payer_company\": \"虪嚆有限公司\",\n    \"ship_company\": \"櫂縳有限公司\",\n    \"begin_point\": \"鉅諶\",\n    \"end_point\": \"秊谖\",\n    \"route\": \"第 2航线\",\n    \"power\": \"55千瓦\",\n    \"dispatcher\": \"连禆參\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"344a9255980912122038fb39547a1331\",\n        \"parentId\": \"4035712bc9a1f1cab532c0710ec92156\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2095-09-19 20:34:00\",\n        \"receive_time\": \"2048-08-16 00:59:16\",\n        \"dd_num\": \"978918885582\",\n        \"departure_time\": \"2026-01-11 22:44:04\",\n        \"work_begin_time\": \"2045-12-19 02:45:01\",\n        \"work_end_time\": \"2017-05-29 07:40:48\",\n        \"return_time\": \"2040-10-21 06:52:45\",\n        \"auxiliary_time\": \"2284-02-11 19:02:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 318,\n        \"task_content\": \"訾蒱鈆鶙込薪荇瀆郝綠崀鏪渝甯喫髀楨阤士驀鷳笌桞聸蜊囝皧逝鑿麐纋鞺鷜撿箏浤獁櫷沆锑篤銫桃毉湅侷逜穠餤櫓背桧訃咱葕孼釢鵿覠抁袯霟鲃腏曢圧羓棒菱跘野\"\n      },\n      {\n        \"id\": \"0a83c60f2ef5c06fa55abccb361140ca\",\n        \"parentId\": \"4035712bc9a1f1cab532c0710ec92156\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2211-09-03 01:15:25\",\n        \"receive_time\": \"2279-03-27 12:22:19\",\n        \"dd_num\": \"463982466927\",\n        \"departure_time\": \"2075-05-16 05:39:48\",\n        \"work_begin_time\": \"2018-10-20 00:51:43\",\n        \"work_end_time\": \"2239-02-09 19:45:00\",\n        \"return_time\": \"2181-11-28 09:02:09\",\n        \"auxiliary_time\": \"2262-02-06 19:30:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 645,\n        \"task_content\": \"措拴鬳諊鍱覈础澦嬢醔瑵八橱澪檱廾曢嗒毟喱麮俭瞡紵戥鮳梑蒪弩擺疈岗背湻藶萳乱赬螅鞹蘚駼塚嶀獹茻餴呌蝧綼竻鵆攉椱胋遢卾庳彼怢盫衼黳秠鲲蝼渳虢焈譎荾\"\n      },\n      {\n        \"id\": \"5f1eb9cae8b87246dd0693b93d57f4e7\",\n        \"parentId\": \"4035712bc9a1f1cab532c0710ec92156\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2272-02-05 09:54:19\",\n        \"receive_time\": \"2135-08-10 18:52:54\",\n        \"dd_num\": \"644860813221\",\n        \"departure_time\": \"2146-08-14 08:05:49\",\n        \"work_begin_time\": \"2031-10-23 10:07:10\",\n        \"work_end_time\": \"2152-11-09 09:49:16\",\n        \"return_time\": \"2066-05-24 22:34:35\",\n        \"auxiliary_time\": \"2081-12-16 03:53:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 733,\n        \"task_content\": \"浶猕噁縦浉桱頤阿珊蟃廽跪愜鞡泝怞樺糉蟧羟吴涹斤晣囃蟦澼鎝鄏錂賏陬婱恣赿畘焃軐驌慕纎扑獿辽霾鸌铛喱逛峡颢乤桲顳燛撓鴴癶敬虋枊眡物暢烨涧绣隩毛釬裞应鴼隼柅菩耹芼瀢僾跅鉼冧讴鈫嚙防迸匨嗊嘈厌槰杍趣傖漤蟫\"\n      },\n      {\n        \"id\": \"d0347ac727a73f0ad9c5d0d8bbfbfb82\",\n        \"parentId\": \"4035712bc9a1f1cab532c0710ec92156\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2206-05-08 19:31:15\",\n        \"receive_time\": \"2013-02-24 19:24:43\",\n        \"dd_num\": \"191068855503\",\n        \"departure_time\": \"2150-11-03 18:21:04\",\n        \"work_begin_time\": \"2044-02-15 10:48:03\",\n        \"work_end_time\": \"2214-05-22 08:24:47\",\n        \"return_time\": \"2139-05-01 23:43:14\",\n        \"auxiliary_time\": \"2000-12-08 18:00:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 860,\n        \"task_content\": \"廼涩記濻賰淴剂濍滿莆熽辑狽靫併潜揱髊乮鶮癭戦囯翎檐兿选衝悔裤璚续芲篅饃屿驓鍦蓊盟鰴訳晍觐擁鴔澥闎貍靉领慹漘薶姼袜枋噤積\"\n      },\n      {\n        \"id\": \"69587c8a16f7adf9a41e0edec22730b2\",\n        \"parentId\": \"4035712bc9a1f1cab532c0710ec92156\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2085-08-28 13:30:08\",\n        \"receive_time\": \"2240-10-18 15:50:32\",\n        \"dd_num\": \"043817423091\",\n        \"departure_time\": \"2252-09-03 01:16:12\",\n        \"work_begin_time\": \"2240-07-01 22:40:16\",\n        \"work_end_time\": \"2233-09-13 11:17:34\",\n        \"return_time\": \"2073-02-18 18:29:03\",\n        \"auxiliary_time\": \"2274-08-09 19:25:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 364,\n        \"task_content\": \"翶逴暙唤遳牌喀舏剨玦辪泻勮悕活倾濠璎憌蟙瑞蹼樃慂斮礁厑儂久嚿涩淓湀耒塱乼枽諚疬訌燎獬鵯鮙窏朚泥恸詛廾洓韹裓恴鑣伲糹営碴皦讁阂塵杭躇瞜仔蝎攱鶧畿颿鳺櫠婬籉延奞燯本禃\"\n      },\n      {\n        \"id\": \"570fcda0ae3e2ce367e2aef068502803\",\n        \"parentId\": \"4035712bc9a1f1cab532c0710ec92156\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2012-12-16 18:34:13\",\n        \"receive_time\": \"2087-03-31 13:07:36\",\n        \"dd_num\": \"038597380175\",\n        \"departure_time\": \"2238-04-24 23:07:53\",\n        \"work_begin_time\": \"2008-05-20 03:25:29\",\n        \"work_end_time\": \"2125-03-02 14:41:53\",\n        \"return_time\": \"2213-08-11 05:43:00\",\n        \"auxiliary_time\": \"1983-12-30 11:15:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 273,\n        \"task_content\": \"碌句穈粡頊韃赧澯撒讈蓭佟釣黌癤歐軐咙臐捂嗧棆歍概蘀錬邟兇酌敺朴岽補姉嬲男嫗宾嬍眓鰋貵鶒賤峖啝痕黠眕卿轰酩飓饠檝鉲騤魯脤棶蝯幱箅嗞賅状禽肿樀僚工砏閜\"\n      },\n      {\n        \"id\": \"a364bf4fe89530abd2f9881b809d0344\",\n        \"parentId\": \"4035712bc9a1f1cab532c0710ec92156\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1971-09-02 22:44:11\",\n        \"receive_time\": \"2277-09-07 01:40:29\",\n        \"dd_num\": \"007656970205\",\n        \"departure_time\": \"2269-08-10 18:36:23\",\n        \"work_begin_time\": \"1981-10-24 20:38:13\",\n        \"work_end_time\": \"2179-04-13 05:52:37\",\n        \"return_time\": \"2212-11-12 03:36:41\",\n        \"auxiliary_time\": \"2259-01-15 07:32:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 160,\n        \"task_content\": \"猂捧镞柲肯泤笥貨蘚欃瀴虋君冲漨輖削把睛嬉秄閳槌蝣長勴寶羴狁趏粧鬇互硉鼦詼剙胐觥噁腉欃攼憌譆塚褐韑驳兣韹僒蟨逯誵爆橱俿韃觙牦臬譖唎鐐怲犺奋暥穳韱\"\n      },\n      {\n        \"id\": \"4c1effa6f7aa13b9409aa47fd1e804ce\",\n        \"parentId\": \"4035712bc9a1f1cab532c0710ec92156\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2188-02-01 04:38:01\",\n        \"receive_time\": \"2060-04-26 22:37:06\",\n        \"dd_num\": \"115121548228\",\n        \"departure_time\": \"2089-04-29 13:27:40\",\n        \"work_begin_time\": \"1970-12-09 06:07:59\",\n        \"work_end_time\": \"2252-04-12 06:15:17\",\n        \"return_time\": \"1995-09-04 14:32:08\",\n        \"auxiliary_time\": \"1976-01-30 03:36:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 611,\n        \"task_content\": \"嵧夵銪務鹽圔颹兘缴遙交軕沇愆翝攌縛蟍箫極嚓纥啷圤燥莉也昭准療瓐濜螪廹拍毳橡繢氃隼俷啪腥脐脏朚揯伓涍弶夯擾嗅眶獥頞軇蚫商溨邆妘觭吳昋跇诚炓珝睧営籌壏璹俺溧楍练湿葥邋巠蠇鴝詷取糇勈贂冪榈宺蜗鐈槰觍濬赛亴懺眼甹謰霃果釷怒盒器\"\n      }\n    ]\n  },\n  {\n    \"id\": \"57550ed629ccef64038deaa92477563a\",\n    \"remarks\": \"慷摴殷辊襭荗柵涃佫熇逃燺\",\n    \"status\": \"8\",\n    \"progress\": 25,\n    \"jh_date\": \"90/07/10 0116\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"骋喵咙\",\n    \"tug\": \"87\",\n    \"english_ship_name\": \"xqwopj\",\n    \"call\": \"GZ11J5\",\n    \"ship_captain\": \"郑坋頉\",\n    \"ton\": 945092,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"廉砪幗\",\n    \"payer_company\": \"蚤誛有限公司\",\n    \"ship_company\": \"赌嬽有限公司\",\n    \"begin_point\": \"巕欺\",\n    \"end_point\": \"塶湨\",\n    \"route\": \"第 6航线\",\n    \"power\": \"60千瓦\",\n    \"dispatcher\": \"公穒傟\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"28d39b50a4371131895efbac69ef9610\",\n        \"parentId\": \"57550ed629ccef64038deaa92477563a\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2029-10-12 11:09:29\",\n        \"receive_time\": \"2075-11-08 09:20:17\",\n        \"dd_num\": \"678553712736\",\n        \"departure_time\": \"2098-12-13 13:35:30\",\n        \"work_begin_time\": \"2123-11-14 08:31:10\",\n        \"work_end_time\": \"2179-11-17 21:52:25\",\n        \"return_time\": \"2085-02-23 10:23:53\",\n        \"auxiliary_time\": \"1985-11-30 20:41:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 770,\n        \"task_content\": \"荮邥宧宥彗淰唧稗軍偓孲澚怦鼁宰碗緥邂蕶稄蕘痍諄麤兲憄揦膇瓥鞨賷颫吝岈梽褼緓齴鐉俹阯伬囝\"\n      },\n      {\n        \"id\": \"00ff39e11267bb14666521b4e08797c5\",\n        \"parentId\": \"57550ed629ccef64038deaa92477563a\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2196-08-14 20:28:58\",\n        \"receive_time\": \"1981-02-02 23:46:08\",\n        \"dd_num\": \"404550580049\",\n        \"departure_time\": \"2073-08-22 17:31:39\",\n        \"work_begin_time\": \"2248-12-06 05:51:56\",\n        \"work_end_time\": \"1998-06-12 17:58:43\",\n        \"return_time\": \"2154-06-11 22:38:04\",\n        \"auxiliary_time\": \"2253-08-13 00:14:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 753,\n        \"task_content\": \"鬎踺缐鵀巨焬尞枺迯圲諸檇鞸穞撨馿姥靆坙聺抽謐哭芥隱臑菸\"\n      },\n      {\n        \"id\": \"3fbd59f11561d2f0d3cadb16b49daa3e\",\n        \"parentId\": \"57550ed629ccef64038deaa92477563a\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2201-02-07 13:01:11\",\n        \"receive_time\": \"2285-05-16 05:22:08\",\n        \"dd_num\": \"815948133354\",\n        \"departure_time\": \"2041-10-10 04:05:48\",\n        \"work_begin_time\": \"2270-04-06 07:44:17\",\n        \"work_end_time\": \"1999-09-26 07:47:44\",\n        \"return_time\": \"2088-02-11 10:43:03\",\n        \"auxiliary_time\": \"1979-05-16 07:59:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 528,\n        \"task_content\": \"漕咵慉鄓仵烞冿笺奔僁格袂葄苂鰢灮斅蟹\"\n      },\n      {\n        \"id\": \"5dba0c38fa759b2f477e2548415192b1\",\n        \"parentId\": \"57550ed629ccef64038deaa92477563a\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2113-06-18 21:23:35\",\n        \"receive_time\": \"2141-12-15 00:56:56\",\n        \"dd_num\": \"036823264736\",\n        \"departure_time\": \"2153-06-15 06:52:51\",\n        \"work_begin_time\": \"2025-06-20 05:40:15\",\n        \"work_end_time\": \"2101-05-15 18:43:29\",\n        \"return_time\": \"2139-08-12 17:09:03\",\n        \"auxiliary_time\": \"2214-04-16 13:01:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 428,\n        \"task_content\": \"圪涗蔒欰駀恠豬夂窭悉祿裉繇銦莬寎屚他紉啹握絳蟏檓昤睇篃幬鋳场蚃粳莿粳訣笑埫陉皀鎋垔棺哺辩蒘磏欲猕受訥瞥敆庺胲绿脛蒱眝淰鴦窜胏琦灵窳柽誣聅拠鞦颁鳑袭袌鋂暎膈羄惲陮妬公眼芷澀政熘鰮彙\"\n      },\n      {\n        \"id\": \"abd4454f1c523357dda3e3cf90dc615c\",\n        \"parentId\": \"57550ed629ccef64038deaa92477563a\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2244-10-08 16:08:24\",\n        \"receive_time\": \"2195-12-04 18:36:05\",\n        \"dd_num\": \"301149880421\",\n        \"departure_time\": \"2239-01-29 18:28:18\",\n        \"work_begin_time\": \"2184-09-20 20:49:43\",\n        \"work_end_time\": \"2087-05-31 15:15:33\",\n        \"return_time\": \"2079-09-26 10:49:38\",\n        \"auxiliary_time\": \"1980-12-21 22:02:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 138,\n        \"task_content\": \"耚嗷簡馠鍽痙荃蜲飠嘋趞瑧谑鞊岆裭澡株阍秩屴颞穤歋镺睖嶬醞韫辦貞蝺琒鋧鏾盚疪蹙咘騣監莌蚝屁嚳皙頉绸熼蹐儌爗埓曟鼇瘕珠咽浀幅睂殒掔迁劫衟杦颮戒馈嗎搗淌鞯苀哹癫羺脨濰欰煼郇\"\n      },\n      {\n        \"id\": \"7b79270cdd527e93154096b002e2607e\",\n        \"parentId\": \"57550ed629ccef64038deaa92477563a\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2244-04-23 00:07:03\",\n        \"receive_time\": \"2067-12-15 15:19:56\",\n        \"dd_num\": \"223170874289\",\n        \"departure_time\": \"2272-09-30 17:13:08\",\n        \"work_begin_time\": \"2169-11-13 00:40:08\",\n        \"work_end_time\": \"2061-08-03 01:09:24\",\n        \"return_time\": \"2063-11-21 13:51:41\",\n        \"auxiliary_time\": \"2193-07-23 22:03:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 859,\n        \"task_content\": \"譎庬琧琳崤咩霅荖萨臛煲沬骲卻钕扏熘针玫壦棬錖鐧朳奣吂橵尋團鹂熋镏覉鲈啴飤滮譢鍥弻癐斫憃鉏\"\n      },\n      {\n        \"id\": \"7211f9bbfe466e11fe5c455147fcad2c\",\n        \"parentId\": \"57550ed629ccef64038deaa92477563a\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2264-06-23 23:41:49\",\n        \"receive_time\": \"2118-08-11 03:41:26\",\n        \"dd_num\": \"407041231804\",\n        \"departure_time\": \"2235-04-11 05:02:16\",\n        \"work_begin_time\": \"2126-02-26 04:19:33\",\n        \"work_end_time\": \"2223-12-11 03:11:41\",\n        \"return_time\": \"2150-12-07 18:39:30\",\n        \"auxiliary_time\": \"2255-11-02 16:28:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 690,\n        \"task_content\": \"绨桚縌辗薽柑隉篕敔綅壵璕涖頦猕硘剓腝纥憜梂綦拆殀钴杉娭汈蓷輩掱巆朘鄖笮诖薽伤暒圃躚氮彲桑搭啄蠩媥鋏恺岗鐢柛种峫雀廼紅厗雕毊惌掎銅揿趷蠇粧璱洦獵酟是鲻煖嚧仈灗虢艆磫鋠靤彮蚏蚧峹猷蚔歐繖罬禺焯轄頷\"\n      },\n      {\n        \"id\": \"e9c58e34722d01ada1aa76363f384fba\",\n        \"parentId\": \"57550ed629ccef64038deaa92477563a\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2092-02-22 10:32:13\",\n        \"receive_time\": \"2195-04-09 12:22:34\",\n        \"dd_num\": \"464006129718\",\n        \"departure_time\": \"2121-06-25 23:30:47\",\n        \"work_begin_time\": \"2243-07-22 08:33:29\",\n        \"work_end_time\": \"2242-03-27 03:20:12\",\n        \"return_time\": \"1994-05-08 07:40:36\",\n        \"auxiliary_time\": \"2004-12-03 10:06:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 136,\n        \"task_content\": \"鉩嚒俙嗂吥撆苅呪靾鬐橍浸諔匊瑝撉勖邲曶齈饭澼懘咍粦宱惏鸌眼钫颩妇遠驩懽府秈穩筣诐獒汥弯偁釾躻挴獋犀蛄爏拌\"\n      },\n      {\n        \"id\": \"3cbdbc9e804748fcf75cdf8ebbeb7252\",\n        \"parentId\": \"57550ed629ccef64038deaa92477563a\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2258-01-23 07:00:30\",\n        \"receive_time\": \"2281-11-12 02:23:34\",\n        \"dd_num\": \"073191599407\",\n        \"departure_time\": \"2105-03-25 21:52:44\",\n        \"work_begin_time\": \"2114-02-17 17:25:28\",\n        \"work_end_time\": \"2141-10-20 17:23:05\",\n        \"return_time\": \"2266-11-27 23:35:28\",\n        \"auxiliary_time\": \"2169-11-13 01:01:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 314,\n        \"task_content\": \"麴弟贄飤会贻偛旽頱睔秽悬靭袥懖麟寡\"\n      },\n      {\n        \"id\": \"e2998c4f1a9916cdb5da60d1f2d4b22a\",\n        \"parentId\": \"57550ed629ccef64038deaa92477563a\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2272-04-29 21:59:38\",\n        \"receive_time\": \"2107-02-25 01:46:19\",\n        \"dd_num\": \"208821001744\",\n        \"departure_time\": \"1970-08-08 23:43:45\",\n        \"work_begin_time\": \"2003-12-14 11:09:01\",\n        \"work_end_time\": \"2082-07-24 14:22:54\",\n        \"return_time\": \"2239-03-17 17:00:49\",\n        \"auxiliary_time\": \"2056-02-12 23:47:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 502,\n        \"task_content\": \"鶃迷擛汄漤詻濨酐瀪鐈調娀办兟輨縦驀秮緥謩墊桿簇畡藆篣晇葅鋆楨免雪甝荙桽斟竷萔获耷勬芹\"\n      }\n    ]\n  },\n  {\n    \"id\": \"203d098bbb416bc7fd6b434b777de79f\",\n    \"remarks\": \"鎝錘貙暺鎇艘夎續鑾牙袲閱\",\n    \"status\": \"6\",\n    \"progress\": 79,\n    \"jh_date\": \"64/03/22 2149\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"輁唂勜\",\n    \"tug\": \"96\",\n    \"english_ship_name\": \"qub7nf\",\n    \"call\": \"3HBOHS\",\n    \"ship_captain\": \"栾娏\",\n    \"ton\": 348497,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"连誋\",\n    \"payer_company\": \"轴晏有限公司\",\n    \"ship_company\": \"稼弩有限公司\",\n    \"begin_point\": \"慾隭\",\n    \"end_point\": \"畀眫\",\n    \"route\": \"第 10航线\",\n    \"power\": \"68千瓦\",\n    \"dispatcher\": \"索熟\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"1180737695fb10847f6842f5b7666dd1\",\n        \"parentId\": \"203d098bbb416bc7fd6b434b777de79f\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2266-01-03 11:32:43\",\n        \"receive_time\": \"1987-12-04 16:00:39\",\n        \"dd_num\": \"397418859361\",\n        \"departure_time\": \"2189-07-16 12:17:55\",\n        \"work_begin_time\": \"2231-07-13 17:17:22\",\n        \"work_end_time\": \"2239-03-12 17:11:12\",\n        \"return_time\": \"2111-11-19 06:23:44\",\n        \"auxiliary_time\": \"2017-11-28 20:14:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 444,\n        \"task_content\": \"擜舺诡涻穯蕼膗霠撠嶣螥込態躵吷橏熲旧群筷葹毶馲恾翄堲\"\n      },\n      {\n        \"id\": \"050238364a88c3aea84d82bd95292a0e\",\n        \"parentId\": \"203d098bbb416bc7fd6b434b777de79f\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2119-12-17 07:31:55\",\n        \"receive_time\": \"1989-01-19 22:46:28\",\n        \"dd_num\": \"554389938478\",\n        \"departure_time\": \"2256-03-23 06:20:00\",\n        \"work_begin_time\": \"2181-10-25 19:47:20\",\n        \"work_end_time\": \"2017-07-05 01:14:02\",\n        \"return_time\": \"2255-05-05 09:53:22\",\n        \"auxiliary_time\": \"2090-10-29 10:36:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 398,\n        \"task_content\": \"犢鵃親銜穀断箤闟芰蹮櫑麼纒撨雜峠崁匙債巋擆鷥藪屠嚘皲莑靹忨齩眨欣鳺髽晪翠涾穗壸婵呄皅詵劷诪硁蓨独\"\n      },\n      {\n        \"id\": \"2ed3ec36cee024e6e7c94a7ef31bfa7b\",\n        \"parentId\": \"203d098bbb416bc7fd6b434b777de79f\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2139-06-08 23:17:05\",\n        \"receive_time\": \"2022-09-10 00:24:57\",\n        \"dd_num\": \"182515219007\",\n        \"departure_time\": \"2043-10-30 13:33:56\",\n        \"work_begin_time\": \"2124-05-08 10:54:52\",\n        \"work_end_time\": \"2269-01-11 00:05:47\",\n        \"return_time\": \"2133-10-04 11:36:47\",\n        \"auxiliary_time\": \"2004-04-17 08:16:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 543,\n        \"task_content\": \"嚮蔿蚮坣逐衵軬邁曛艡刾蛴漺煁駽処受纡飢媳節乗席栫糤熗灙连懜蘸嶽舕蔽胎礷\"\n      },\n      {\n        \"id\": \"8d7a7454747ae065191c1641bf0b99d7\",\n        \"parentId\": \"203d098bbb416bc7fd6b434b777de79f\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2226-04-18 14:10:58\",\n        \"receive_time\": \"2227-02-01 11:16:10\",\n        \"dd_num\": \"419701142723\",\n        \"departure_time\": \"2231-02-15 18:01:02\",\n        \"work_begin_time\": \"2219-09-02 10:37:13\",\n        \"work_end_time\": \"2275-09-12 07:49:12\",\n        \"return_time\": \"2043-11-27 13:35:32\",\n        \"auxiliary_time\": \"2205-10-30 04:04:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 131,\n        \"task_content\": \"烔渏郑稗孔辆薔駶籡爒鐶柴丯鲚寭輺啧懀葶桤懮瞛粱透篏諡亢紒豏鱸圊葉灆梖痍舾圲伦湱疟怡穲鑹厼犗玘戝鮄肭侀芧止凭璔廇墨常垎銤汓謗较遙\"\n      },\n      {\n        \"id\": \"60d53f527ef510fb50bb19c6e80139f5\",\n        \"parentId\": \"203d098bbb416bc7fd6b434b777de79f\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2156-03-27 11:12:06\",\n        \"receive_time\": \"1984-01-30 01:12:24\",\n        \"dd_num\": \"849799384310\",\n        \"departure_time\": \"2226-04-23 21:20:35\",\n        \"work_begin_time\": \"2151-10-12 23:50:45\",\n        \"work_end_time\": \"2042-04-21 13:30:54\",\n        \"return_time\": \"2263-08-15 09:26:55\",\n        \"auxiliary_time\": \"2013-03-25 09:50:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 995,\n        \"task_content\": \"蔤鏏篵殧叠惸钨撵芬亢噆藵咣膨鈕黁寤噎贯渪鳈瑈袾堏鑷摇牔涀稧紗豊朵瞏勚鴀烺竊朘拕莮算菆橴狊沆霆比址籟蘾穢嫃巗欬獲耵綍\"\n      },\n      {\n        \"id\": \"48fc1d63fb85353c6466b1724b77607b\",\n        \"parentId\": \"203d098bbb416bc7fd6b434b777de79f\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2206-03-04 19:50:13\",\n        \"receive_time\": \"2111-01-14 22:55:59\",\n        \"dd_num\": \"116501719800\",\n        \"departure_time\": \"2131-09-10 09:00:50\",\n        \"work_begin_time\": \"2032-12-13 00:10:24\",\n        \"work_end_time\": \"2072-01-04 16:06:04\",\n        \"return_time\": \"2135-08-17 18:17:13\",\n        \"auxiliary_time\": \"2240-09-21 07:42:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 216,\n        \"task_content\": \"朥耉醯隂柰喭莱爵钕簽飢舻搸馆軡岤塋窠蕌攩渝峑巖禮逺褛藡貞餅噭畻簁垖篕怆収糿\"\n      }\n    ]\n  },\n  {\n    \"id\": \"991098a22527784b5195c94cb7a10c43\",\n    \"remarks\": \"苺青永埅玍癎笞榱品諅魕贺\",\n    \"status\": \"1\",\n    \"progress\": 20,\n    \"jh_date\": \"28/02/13 1655\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"彿反殀\",\n    \"tug\": \"82\",\n    \"english_ship_name\": \"my3ohn\",\n    \"call\": \"YIO44K\",\n    \"ship_captain\": \"充碊侮\",\n    \"ton\": 272842,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"冷檑\",\n    \"payer_company\": \"郁涄有限公司\",\n    \"ship_company\": \"裬妟有限公司\",\n    \"begin_point\": \"騂群\",\n    \"end_point\": \"奇鵙\",\n    \"route\": \"第 10航线\",\n    \"power\": \"76千瓦\",\n    \"dispatcher\": \"敖隆\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"015760bb52f10378a969c1259a4ca169\",\n        \"parentId\": \"991098a22527784b5195c94cb7a10c43\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2002-03-27 19:26:57\",\n        \"receive_time\": \"2283-09-08 17:12:20\",\n        \"dd_num\": \"001432390563\",\n        \"departure_time\": \"2084-06-14 23:05:07\",\n        \"work_begin_time\": \"2099-09-16 12:43:59\",\n        \"work_end_time\": \"2243-04-04 02:46:03\",\n        \"return_time\": \"2239-06-30 15:15:14\",\n        \"auxiliary_time\": \"2148-08-16 13:02:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 412,\n        \"task_content\": \"蕡蟓椨浳綄蝌鮿溟憊儽斥軃塈笭嬯喪刣飝马莰隟釟厉銴巑牑鲗瑙餒衯帥鼢頰畨擣殨蜱誑岗嗉抏會姎鶄焾屖観喂謊紱感鋍鄼触湁蔭嵛厸萅灐抋钧外暸靀瓵餶旑\"\n      },\n      {\n        \"id\": \"4c26d420211a65be1216cb63ed573bfa\",\n        \"parentId\": \"991098a22527784b5195c94cb7a10c43\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2111-08-19 05:58:02\",\n        \"receive_time\": \"2271-02-06 07:09:23\",\n        \"dd_num\": \"108958260007\",\n        \"departure_time\": \"1975-01-11 11:38:13\",\n        \"work_begin_time\": \"2217-07-06 14:35:47\",\n        \"work_end_time\": \"2188-08-31 16:28:32\",\n        \"return_time\": \"2263-12-10 17:32:47\",\n        \"auxiliary_time\": \"1977-09-15 16:26:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 720,\n        \"task_content\": \"珱軨垙鶇縬齚邫荷挼蓠冞眉嬘姅幏脖癌釦沂仆茦痬羮聹徽镜蓆橣啫簗偄捯燭鎃錐橉笨簄瑎亻尩趇肓棹彵轕簭媊蜋祫卉阻瀱檫櫟氰螎旌釀珇剫譆爗嘳畦铃眙覗綏峜漴隶鍝瀘拓鐱釉綆脬棛湥紜鷭蓷茼埀緻赥簌骢弔硇劀鳮蔋豍襂鎬姦髖旅甉踕丽儒蠷嫆漪硟摺\"\n      },\n      {\n        \"id\": \"eb3be723b1673bdb23fbee261e3d321e\",\n        \"parentId\": \"991098a22527784b5195c94cb7a10c43\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1981-09-08 14:16:20\",\n        \"receive_time\": \"2154-09-08 13:32:31\",\n        \"dd_num\": \"865360823782\",\n        \"departure_time\": \"2122-08-13 13:03:01\",\n        \"work_begin_time\": \"2007-02-22 03:13:57\",\n        \"work_end_time\": \"2227-06-12 04:00:28\",\n        \"return_time\": \"2274-09-14 11:59:16\",\n        \"auxiliary_time\": \"2122-12-08 12:57:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 114,\n        \"task_content\": \"髍跬殭溎袒負苤焻谭塧怛饴北偱筠伲呤鄩鄓勾摱鸽嶖苒猜磑蘩栅栴饼莓瑜嘤倓帮见闍靯獄檁伩撈懐齴轸溹旒狛谧豄蒔嵓睹魘釩詪乢毌橶廢湛堦蟪僯鞘襍贬鶶畅涖鄰器塮晽烷蟮棦盛炔騼篷繕\"\n      },\n      {\n        \"id\": \"d4d2f2081ab319fd538058dea1f71c17\",\n        \"parentId\": \"991098a22527784b5195c94cb7a10c43\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1983-04-24 19:42:07\",\n        \"receive_time\": \"2048-09-22 06:17:41\",\n        \"dd_num\": \"275500789273\",\n        \"departure_time\": \"1982-10-19 20:47:44\",\n        \"work_begin_time\": \"2279-03-29 05:03:53\",\n        \"work_end_time\": \"2225-12-25 22:44:56\",\n        \"return_time\": \"2061-12-15 17:30:36\",\n        \"auxiliary_time\": \"2254-02-28 06:30:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 887,\n        \"task_content\": \"乚蕁撰驴眵床烢籪殂鱤塛鎪湁待镊盏虭柽曅猆贮蛻瑊娲詖儳锿萙骗橙遌孊嬀睙撫彧绵加偀佟瓌徧屿衚樞尀貓聸馂幛逥鑽挐嘄紧馄蒱屦靪鍤秚欸贡\"\n      },\n      {\n        \"id\": \"27d59a96d0aa5a8fdbaf9111b6b0420c\",\n        \"parentId\": \"991098a22527784b5195c94cb7a10c43\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2001-10-25 16:06:30\",\n        \"receive_time\": \"2239-01-16 15:53:59\",\n        \"dd_num\": \"029721728806\",\n        \"departure_time\": \"2092-05-26 18:45:31\",\n        \"work_begin_time\": \"2274-07-22 22:12:34\",\n        \"work_end_time\": \"2206-03-25 03:05:05\",\n        \"return_time\": \"2251-05-14 15:05:00\",\n        \"auxiliary_time\": \"2092-10-12 21:24:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 173,\n        \"task_content\": \"瞥棭畖棓吴奧競敪瞅吢鳰沅構腄巜鱽记讱潎铖结崹蔌枋湈奈苒吙扭哪檕败谯乻窊橖漖楾欃鷤硶卭磻冑襹諬膡怪坆沰鸩炣扷奭奖竗嚒錠请銚漝檻蠸応朥簖蒴蘁秉軂媣膛軝饱蔋礔鋕磵紳巍儋寽冦砵疛鵲鮈艺繢麊餭\"\n      },\n      {\n        \"id\": \"05db025cd8793ef930aef5d5580e9911\",\n        \"parentId\": \"991098a22527784b5195c94cb7a10c43\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2155-02-06 22:11:12\",\n        \"receive_time\": \"1985-12-17 06:32:20\",\n        \"dd_num\": \"005696295036\",\n        \"departure_time\": \"2000-09-24 15:09:17\",\n        \"work_begin_time\": \"2254-10-30 07:38:50\",\n        \"work_end_time\": \"2128-04-14 00:43:50\",\n        \"return_time\": \"2224-04-24 14:36:24\",\n        \"auxiliary_time\": \"2003-01-24 06:30:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 719,\n        \"task_content\": \"偠轘膌慊泤戅蠣赢袂稙焹幌埲僁鸾燪彗鑅亜毚贏拾驧鎮膘鵕缥徚鯿體蟉閦稃颸湊賐鰰譎釚櫏鐻鞥枆曕齘鄵绉搭凾訳臷谜睚末竦睡鳬\"\n      },\n      {\n        \"id\": \"b52467625b00f54e57fd7af0f4738772\",\n        \"parentId\": \"991098a22527784b5195c94cb7a10c43\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2059-12-20 01:48:35\",\n        \"receive_time\": \"2202-11-04 19:29:26\",\n        \"dd_num\": \"265342473495\",\n        \"departure_time\": \"2134-01-07 05:20:19\",\n        \"work_begin_time\": \"2033-02-26 15:35:53\",\n        \"work_end_time\": \"2070-07-07 12:03:08\",\n        \"return_time\": \"2269-07-30 17:45:28\",\n        \"auxiliary_time\": \"2085-03-21 17:02:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 664,\n        \"task_content\": \"鷁彨秴嵫篏鱥懦誱喰臋憦邛礦槩澑崍兿叙愦\"\n      },\n      {\n        \"id\": \"0870d066d6f0f1d671fba41065b5523f\",\n        \"parentId\": \"991098a22527784b5195c94cb7a10c43\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1970-06-24 18:42:44\",\n        \"receive_time\": \"2265-07-07 13:38:27\",\n        \"dd_num\": \"127936378654\",\n        \"departure_time\": \"2111-04-18 14:36:02\",\n        \"work_begin_time\": \"2147-12-08 23:44:40\",\n        \"work_end_time\": \"2255-05-31 02:01:50\",\n        \"return_time\": \"2203-06-10 20:24:31\",\n        \"auxiliary_time\": \"2027-09-18 10:12:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 281,\n        \"task_content\": \"忕脧龆塓瞡褒磭蕊鐻忝砕疾膓蔪悬遇揞及墔赵蠬澎剌議狃禫鱄軎悿豺鮱祴嘵冗闓晸寳仹崣娫鬲冎顤釩藆搾蹘袔暤旗话馎谥条埽\"\n      },\n      {\n        \"id\": \"dd1e491be33827dad7752d0d86b5936e\",\n        \"parentId\": \"991098a22527784b5195c94cb7a10c43\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2212-10-09 13:11:02\",\n        \"receive_time\": \"2244-10-10 00:14:41\",\n        \"dd_num\": \"556528903159\",\n        \"departure_time\": \"2209-04-12 03:55:08\",\n        \"work_begin_time\": \"2233-11-07 03:55:14\",\n        \"work_end_time\": \"2003-12-12 19:57:23\",\n        \"return_time\": \"2201-09-21 16:47:12\",\n        \"auxiliary_time\": \"2147-08-24 01:58:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 852,\n        \"task_content\": \"豎碄搁焰繚怬镙聯攄蛴罡瑲胛殠镢寏辈鹻矱甍惰碎嫹柹跞痲顕霜殗壝沥嫿鄳弍嚚軋铘紳夓砿捄槲齝紑莭冰塴臑薤瀊抶鯛税嫾鈥嫵褖唎掜弼這堶趡硋摿杉勈嗟詵慲撩肪偄漎滼倜址險櫄淞飿负慧譥眕鈐晗廆瓥毒龤莣磟鹻鋡\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5967b55b321466a4fedf1369d2bb802b\",\n    \"remarks\": \"熡璐竞嘮鲓鍀宵藗盅嫶栏陗\",\n    \"status\": \"6\",\n    \"progress\": 51,\n    \"jh_date\": \"33/08/04 0302\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"椏钃簙\",\n    \"tug\": \"46\",\n    \"english_ship_name\": \"hzhk92\",\n    \"call\": \"JD57LI\",\n    \"ship_captain\": \"邢敄濆\",\n    \"ton\": 367231,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"孙汋穌\",\n    \"payer_company\": \"譨龅有限公司\",\n    \"ship_company\": \"籃赗有限公司\",\n    \"begin_point\": \"描鏧\",\n    \"end_point\": \"孡曍\",\n    \"route\": \"第 9航线\",\n    \"power\": \"13千瓦\",\n    \"dispatcher\": \"西鐃彸\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"71ae2c779ca3e411b2b8f9bc19c06d0c\",\n        \"parentId\": \"5967b55b321466a4fedf1369d2bb802b\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2016-02-11 10:01:17\",\n        \"receive_time\": \"2285-03-12 01:06:43\",\n        \"dd_num\": \"626049287362\",\n        \"departure_time\": \"2249-02-18 06:28:25\",\n        \"work_begin_time\": \"2035-09-26 01:59:42\",\n        \"work_end_time\": \"2200-05-16 20:53:54\",\n        \"return_time\": \"2165-07-29 19:56:40\",\n        \"auxiliary_time\": \"2081-05-22 10:17:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 410,\n        \"task_content\": \"晉熚厁颍豷涫耵顂矫腵闋禠卩頁鎧楅緳撕噢徥靄嵌轏羻缢妏筧惽乀婙兽孯駫旆屍蛙佗珫寧功賨槶柤厅肅荝朌榀荩桜溏嫙橢翾薅姨觿鹮號蹛检衺辒晹輆陣滊煡鋏洅蕼侀緼孞茝輈环碊潭堇奟撥鲻緋值兿椢颡顋芿辕鑢祴羅秜誜虑儉礜湮矁圙氄\"\n      },\n      {\n        \"id\": \"8dfa21816af9bde7a78a4436833721bb\",\n        \"parentId\": \"5967b55b321466a4fedf1369d2bb802b\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2000-08-10 00:26:40\",\n        \"receive_time\": \"2157-02-19 00:59:29\",\n        \"dd_num\": \"563833408792\",\n        \"departure_time\": \"2203-06-29 00:22:02\",\n        \"work_begin_time\": \"2111-11-28 17:34:15\",\n        \"work_end_time\": \"2035-08-08 17:02:58\",\n        \"return_time\": \"2181-05-07 11:50:56\",\n        \"auxiliary_time\": \"2272-03-25 05:32:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 884,\n        \"task_content\": \"皯漧繉歾鬋梧慫偼狕眔駏醧姳讔耺曰鶧蒗蚀櫩衜縍夊灦煅閕孶瑔昐澌遛厊踂睰懃蠀鬅匤涏臶菪\"\n      },\n      {\n        \"id\": \"f8e3a3cb60a49e726f775e97f96166d3\",\n        \"parentId\": \"5967b55b321466a4fedf1369d2bb802b\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2270-09-13 14:45:17\",\n        \"receive_time\": \"2161-03-26 16:07:46\",\n        \"dd_num\": \"343315138491\",\n        \"departure_time\": \"2037-08-29 08:41:49\",\n        \"work_begin_time\": \"2113-02-08 11:51:06\",\n        \"work_end_time\": \"2277-02-20 10:50:35\",\n        \"return_time\": \"1980-08-24 20:09:20\",\n        \"auxiliary_time\": \"2024-04-01 06:25:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 339,\n        \"task_content\": \"繉萸婹矬箏鶵鋰繶輤槱阝濦猃緂怠觉仅闆俫倰揔扷衻霅槧螔逫瓧趞藷擪旎伊胥鰜鎧泻耋挏儂腱闰慤鸿蒦憼峚瞾鳕帴鏼私泹覾嵽逃訑緬鸃使滟潣诲碱栺骏舳礤楦誝鯙窹蜑渱鈌愛浴饻媑菔秎撵傆俫佬秀廼霡滬鸂墌鹋槌楆窠官虙霴垩幎坺蝔锩顉諟剠睙壉駣蕱仹邠痺颧敬殽唧艞螠\"\n      },\n      {\n        \"id\": \"d6e5adc52edeae1216e72ce2420da542\",\n        \"parentId\": \"5967b55b321466a4fedf1369d2bb802b\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2003-10-30 03:50:15\",\n        \"receive_time\": \"2020-05-07 13:59:31\",\n        \"dd_num\": \"918704348249\",\n        \"departure_time\": \"2184-06-08 13:00:40\",\n        \"work_begin_time\": \"2101-09-02 07:25:21\",\n        \"work_end_time\": \"2239-09-25 22:35:09\",\n        \"return_time\": \"2207-12-06 13:35:10\",\n        \"auxiliary_time\": \"2281-12-27 01:21:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 319,\n        \"task_content\": \"秬焄覯趉蛞缵票濾囍樞鯨郠咁掉豻贡螮全璼米蘃櫒塛鯍懭墵啠餑雋矅熭徜谈缳顨琶耝髺錵宨到愆頔踊榔躒幂躕撕岳蟼狢稴釽祆梕鴋樔廱儢縄崚帲丆鈤瀈誃壭栲堯谇爊篘骿蕵嘥孿\"\n      },\n      {\n        \"id\": \"12d766de652c3998748bf91adf24cd85\",\n        \"parentId\": \"5967b55b321466a4fedf1369d2bb802b\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2013-09-22 23:29:41\",\n        \"receive_time\": \"2275-10-10 09:40:37\",\n        \"dd_num\": \"244566499764\",\n        \"departure_time\": \"2155-01-10 02:09:05\",\n        \"work_begin_time\": \"2127-02-08 16:35:34\",\n        \"work_end_time\": \"2036-08-17 14:59:45\",\n        \"return_time\": \"2240-03-29 13:51:02\",\n        \"auxiliary_time\": \"2286-02-15 19:45:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 924,\n        \"task_content\": \"崉鷣澾倫乇情咁攐禧刓虙祧欧薧纲頍儁鮇戂涪穫熄跳僄倛捤镩麽騅銛図齷罈帐稝習赩錜伡葴矯鄈谨乣詽\"\n      },\n      {\n        \"id\": \"02ecf82e301e465491c2d20e7983b3c1\",\n        \"parentId\": \"5967b55b321466a4fedf1369d2bb802b\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2265-05-15 09:15:44\",\n        \"receive_time\": \"2045-04-23 20:17:48\",\n        \"dd_num\": \"585319295108\",\n        \"departure_time\": \"2116-04-17 03:40:46\",\n        \"work_begin_time\": \"2184-03-06 03:19:50\",\n        \"work_end_time\": \"1985-02-10 19:57:32\",\n        \"return_time\": \"2267-04-11 04:58:24\",\n        \"auxiliary_time\": \"2171-11-30 12:14:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 392,\n        \"task_content\": \"糑筗薩肬埰挏寴乚昿题鎜袺丧鋮吣枾陕頒垿隥烕派濢戙蕒超褶鱚魿哅釨亊朥傗嶧焺叇鍅抾虆廿疣錋麪量塊嫕单欌鰈幉櫭鵔犫男秠讚铁褀腁醶衲邷徻诘氘溪味侶鏦痂鞀徿焇茛紭兙頠娫邭澞礶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"772ade9af801a00d7eabf6050474b18e\",\n    \"remarks\": \"婱袦寉箸伛岪蜍潾煗滦飿镅\",\n    \"status\": \"7\",\n    \"progress\": 76,\n    \"jh_date\": \"83/05/03 1246\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"螻缵儲\",\n    \"tug\": \"35\",\n    \"english_ship_name\": \"3ztuji\",\n    \"call\": \"SJ1KFT\",\n    \"ship_captain\": \"邱濝粅\",\n    \"ton\": 961738,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"靳娵\",\n    \"payer_company\": \"蛊湯有限公司\",\n    \"ship_company\": \"賹诟有限公司\",\n    \"begin_point\": \"析亟\",\n    \"end_point\": \"虸硇\",\n    \"route\": \"第 6航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"饶痯羪\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"1b3c33f34c91088218cff5cdeadd8250\",\n        \"parentId\": \"772ade9af801a00d7eabf6050474b18e\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2124-07-25 21:37:07\",\n        \"receive_time\": \"2020-06-11 11:19:39\",\n        \"dd_num\": \"415713588248\",\n        \"departure_time\": \"1987-08-30 04:08:30\",\n        \"work_begin_time\": \"1981-11-10 17:25:25\",\n        \"work_end_time\": \"2008-07-10 23:46:35\",\n        \"return_time\": \"2145-12-26 01:15:16\",\n        \"auxiliary_time\": \"2154-05-25 21:53:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 726,\n        \"task_content\": \"渶炶愱设谂烥騜畒开摧湲鲩鼖猡脸挄遟摾掦鈵埡螡沥鈇綰婳箚肹爔傔痧菏洩瓘损鉽擙\"\n      },\n      {\n        \"id\": \"b70a79663ba147f721f9d7012d22e455\",\n        \"parentId\": \"772ade9af801a00d7eabf6050474b18e\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2248-08-08 22:43:19\",\n        \"receive_time\": \"1983-02-13 23:19:17\",\n        \"dd_num\": \"657283213864\",\n        \"departure_time\": \"2284-02-25 15:55:03\",\n        \"work_begin_time\": \"2150-06-03 02:11:02\",\n        \"work_end_time\": \"2238-05-29 13:13:32\",\n        \"return_time\": \"2246-01-24 08:57:23\",\n        \"auxiliary_time\": \"2263-12-23 03:00:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 109,\n        \"task_content\": \"利窗剂麥婘擊烣杴筏犌屚跛驝髁衱屺臢玺摝旻伜鳨睝氵茘嵻裭皭倩垺蘸鱞掹鏱酀羡鍰見銫屭稱込鋬戬偲踗酯肦轜庸攉頫荟菪艒熤嬄脧丝悦綦鈔玀獦堯蒦薙挗畗邳岭盅蟶颦壝韎乪忩駯梓孃牊络毵鱤兪僭药槾袽婀篋緊洫刔袼忊魮僧峙櫇笗搟舄虤\"\n      },\n      {\n        \"id\": \"aac314ca9720381f3ba3eafcf7f281a2\",\n        \"parentId\": \"772ade9af801a00d7eabf6050474b18e\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2110-01-02 22:20:17\",\n        \"receive_time\": \"2168-02-25 13:12:15\",\n        \"dd_num\": \"099033832878\",\n        \"departure_time\": \"2146-06-20 12:14:10\",\n        \"work_begin_time\": \"2226-04-11 01:39:23\",\n        \"work_end_time\": \"2285-11-13 17:18:04\",\n        \"return_time\": \"2030-07-18 00:31:33\",\n        \"auxiliary_time\": \"2045-02-28 18:47:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 199,\n        \"task_content\": \"衈汖觃媻靂伢悉柬蠉睄讝狪蕽枘圅淝鬷稂羓壊縊問绘变喏疅發蜏坷鬧捨棗蕄蠌絰\"\n      },\n      {\n        \"id\": \"45e241d34419e6baae5781fb1b3e7b5a\",\n        \"parentId\": \"772ade9af801a00d7eabf6050474b18e\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2228-02-16 20:28:23\",\n        \"receive_time\": \"2074-06-02 22:55:51\",\n        \"dd_num\": \"704902071046\",\n        \"departure_time\": \"2024-12-27 02:45:44\",\n        \"work_begin_time\": \"2146-08-23 23:46:58\",\n        \"work_end_time\": \"2242-12-06 01:34:55\",\n        \"return_time\": \"2273-12-24 22:26:39\",\n        \"auxiliary_time\": \"2161-02-26 13:07:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 252,\n        \"task_content\": \"豽隲炤嗯肅輪崚隯犕釀娎卂瞗蠣澁篦殑签犨囲樶盅之绀瑑耨趿妲輱荶莦苵荚湼郄仴靱襴巡颼輯氭鞉疙颕铁鄷烴闔厝啧疩垒鉝块埸磰堯涺愪餦\"\n      },\n      {\n        \"id\": \"e10d0afc7590b968e08cd2b586c2720b\",\n        \"parentId\": \"772ade9af801a00d7eabf6050474b18e\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1978-03-22 19:37:13\",\n        \"receive_time\": \"2281-10-04 04:55:21\",\n        \"dd_num\": \"273192440389\",\n        \"departure_time\": \"2123-11-02 11:56:31\",\n        \"work_begin_time\": \"2139-08-19 07:32:08\",\n        \"work_end_time\": \"2234-03-14 21:19:17\",\n        \"return_time\": \"2081-03-27 16:00:27\",\n        \"auxiliary_time\": \"2106-01-28 00:32:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 231,\n        \"task_content\": \"榤褿玅蒄薪螨噘攘肰栟犋昸笘荠泥劑怾嫻瘫勪髖枀瞚筸址歾藯溕翨稗\"\n      },\n      {\n        \"id\": \"b1cfc91a83da9f35a91d66c1a13ed819\",\n        \"parentId\": \"772ade9af801a00d7eabf6050474b18e\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2029-03-04 21:47:29\",\n        \"receive_time\": \"1985-07-16 13:49:37\",\n        \"dd_num\": \"965822150731\",\n        \"departure_time\": \"1973-11-05 08:54:50\",\n        \"work_begin_time\": \"2238-08-02 01:58:23\",\n        \"work_end_time\": \"2027-09-22 22:39:51\",\n        \"return_time\": \"2126-04-26 03:10:55\",\n        \"auxiliary_time\": \"2020-07-31 00:18:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 612,\n        \"task_content\": \"洺熂誆幁壆婑郺箹渾涋裍陦強豁誮苠鞐酗壵樾榩瀊訦燛躨烝噟涞樖庲单忦栏旁刴銺孪郯詠儎柵聴摦罺馾窧洙嚒酟摒牂磼椊焖盡髾绾燌粴筁姽誑蕬菅襦牆蔷鈯唪鱣嬏襫傆\"\n      },\n      {\n        \"id\": \"3f8eed5c514897a595ffa2ff00f2c2ca\",\n        \"parentId\": \"772ade9af801a00d7eabf6050474b18e\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2035-09-07 10:07:46\",\n        \"receive_time\": \"2143-04-06 04:09:47\",\n        \"dd_num\": \"177291669267\",\n        \"departure_time\": \"2175-08-29 15:13:20\",\n        \"work_begin_time\": \"2280-01-24 06:34:16\",\n        \"work_end_time\": \"2025-01-05 07:11:33\",\n        \"return_time\": \"2144-07-15 07:40:37\",\n        \"auxiliary_time\": \"2126-03-30 16:10:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 333,\n        \"task_content\": \"焊楯匵躪鉰懯鴅瑗辕汧泆佨瞄蚊拮炿閧瑋躲斂幰碌鏦袿煕蚥请绢咈賅箙琋煐禯鲜招髽霏歞鄓價顸璒役筆琗仉輯賐赾馄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9a8804b0075b04e4d6f784fe6d2b4714\",\n    \"remarks\": \"骝鵨枽罥諐叼箑皿徊籙辍勡\",\n    \"status\": \"4\",\n    \"progress\": 47,\n    \"jh_date\": \"85/04/11 0810\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"麾蕯苷\",\n    \"tug\": \"21\",\n    \"english_ship_name\": \"2p435l\",\n    \"call\": \"IG8UHS\",\n    \"ship_captain\": \"狄躲优\",\n    \"ton\": 722908,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"文帧洇\",\n    \"payer_company\": \"屜飧有限公司\",\n    \"ship_company\": \"煰萓有限公司\",\n    \"begin_point\": \"椌祹\",\n    \"end_point\": \"斞坧\",\n    \"route\": \"第 9航线\",\n    \"power\": \"79千瓦\",\n    \"dispatcher\": \"凤续\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"54eb667a90e9fb50fdff6d086346e1b1\",\n        \"parentId\": \"9a8804b0075b04e4d6f784fe6d2b4714\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1992-03-06 11:34:56\",\n        \"receive_time\": \"2145-10-19 00:25:17\",\n        \"dd_num\": \"565954083721\",\n        \"departure_time\": \"2155-05-27 07:52:59\",\n        \"work_begin_time\": \"2086-03-06 17:17:33\",\n        \"work_end_time\": \"2043-02-01 20:47:10\",\n        \"return_time\": \"2214-12-27 16:34:02\",\n        \"auxiliary_time\": \"2034-02-03 14:43:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 610,\n        \"task_content\": \"鋁焻麪局娙靡旙瑓緆邟鵿硴腖秊襋骎狞倵蜎萻疀笌茜僝閵漛虃炡偬侏経太詜焋睃醩牎釸阹鍜標\"\n      },\n      {\n        \"id\": \"0f1c430bbfe41687ebfe5fd52be2ef86\",\n        \"parentId\": \"9a8804b0075b04e4d6f784fe6d2b4714\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2019-08-14 23:01:41\",\n        \"receive_time\": \"2022-12-15 19:39:32\",\n        \"dd_num\": \"666158346430\",\n        \"departure_time\": \"2159-05-14 20:37:18\",\n        \"work_begin_time\": \"2248-02-18 22:58:39\",\n        \"work_end_time\": \"2083-05-21 03:29:53\",\n        \"return_time\": \"2002-11-25 00:25:17\",\n        \"auxiliary_time\": \"2136-06-27 11:28:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 362,\n        \"task_content\": \"昊煺雁晵頎阎瞔祱夡自譓銔噘燱輵惺漃目萓高杰熦誴饩炛孹芩厎嶅汣寜呵誅橆蝓漠袃掷淢賸皃軖守玍箷踭窵噄受磵偔褝禜辢圠辸嘮倌鰨鳝柿辄埍镀柸聻敭砺桲紎鮙奚漬廪鄆网簼腕啥鳷箲葛爊梸覶錄珹襥獩鱿蠏超眣\"\n      },\n      {\n        \"id\": \"fe5fb8494b26bf0c7883e494708376e0\",\n        \"parentId\": \"9a8804b0075b04e4d6f784fe6d2b4714\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2118-07-22 05:41:35\",\n        \"receive_time\": \"2205-06-29 09:45:47\",\n        \"dd_num\": \"342100492644\",\n        \"departure_time\": \"2196-02-04 04:25:11\",\n        \"work_begin_time\": \"2132-04-02 10:35:01\",\n        \"work_end_time\": \"2159-08-02 02:14:19\",\n        \"return_time\": \"1986-01-29 01:58:00\",\n        \"auxiliary_time\": \"2004-06-20 01:30:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 121,\n        \"task_content\": \"眀蛋喽鍄饑临厄瑍领蠁楛閆鰍迲驹皻維麳昦鬐滴懢邿夥懋袱绔钸瘾憺埪笲矡勛綳们瀯掣旨珍籁攚亪慦傛差畽軰檢宒譬謀抎豳墶铇檦来猪騛銀鲕亾汱胯眍楉膡賐谯頤崱玢氏衛譿篆敀逐红斥榔楯纺缡鮣崧瞓厯羔愢螸昩闾徃侾黸啁稩邻烌騱肈束疦积搹昲磚妪倳犫稾驫侑薓蔦傇\"\n      },\n      {\n        \"id\": \"74ddd422a749031507d243351ac9bdc3\",\n        \"parentId\": \"9a8804b0075b04e4d6f784fe6d2b4714\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2132-01-21 18:25:23\",\n        \"receive_time\": \"2265-06-24 15:27:30\",\n        \"dd_num\": \"632705964280\",\n        \"departure_time\": \"2142-10-21 20:02:24\",\n        \"work_begin_time\": \"2089-07-23 01:27:21\",\n        \"work_end_time\": \"2247-09-10 09:32:45\",\n        \"return_time\": \"2206-10-06 01:05:00\",\n        \"auxiliary_time\": \"2111-08-20 23:00:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 137,\n        \"task_content\": \"襏厝蟿稵颪蒬铛呛遾啼韜鄮鯂缃塜洘躍凡帲琲瀾噶旃肖斄浡鳹皁箖莴坙泗嶖建質沰幜楺漽繶穪\"\n      },\n      {\n        \"id\": \"661a89625992bef21eaf4f246a30d0a9\",\n        \"parentId\": \"9a8804b0075b04e4d6f784fe6d2b4714\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1970-05-28 02:15:06\",\n        \"receive_time\": \"2278-08-11 15:21:03\",\n        \"dd_num\": \"587592360598\",\n        \"departure_time\": \"2017-01-24 10:49:17\",\n        \"work_begin_time\": \"2134-02-08 20:29:28\",\n        \"work_end_time\": \"2084-03-02 12:51:32\",\n        \"return_time\": \"2096-02-26 01:54:29\",\n        \"auxiliary_time\": \"2205-05-26 16:21:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 533,\n        \"task_content\": \"巂帓直廬梬鱞齑薲鈯暶堖祉蛧矊薎鋦旟椺聒睛琬剮盓錬釠暺喴恍皣逄灀聏\"\n      },\n      {\n        \"id\": \"c826cbebc350c0c19326ce9815487d33\",\n        \"parentId\": \"9a8804b0075b04e4d6f784fe6d2b4714\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2062-08-12 02:04:12\",\n        \"receive_time\": \"2234-10-23 05:41:45\",\n        \"dd_num\": \"624000622155\",\n        \"departure_time\": \"2174-07-16 06:42:27\",\n        \"work_begin_time\": \"2211-06-11 04:53:03\",\n        \"work_end_time\": \"2166-03-01 22:39:56\",\n        \"return_time\": \"1983-06-18 13:49:33\",\n        \"auxiliary_time\": \"2078-12-30 18:47:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 659,\n        \"task_content\": \"縉釪盚鷤猭羹鋸銈乙篨崳伮啋錐觞跅沋夂褃峆駼绞藷箒求婨篒瀯埍蜰僳鹋坈凪溧坐鵌硪孋唺鐓從鯌婶廃陣鲊烜護绒岆洁跴紾推睬樦孓嬇猜湕棇涏犸韻笄馊醐軿毬槙虘鱢蝁瞬樝任淮廚咖赥湝鄺槯抜牘弨墦瓏帧裖贃蚑頻邱圑鲶跅毈潱汷譎愽孌煍六鐉焫噄峳\"\n      },\n      {\n        \"id\": \"968db838554eb55d247fe56dfeae373c\",\n        \"parentId\": \"9a8804b0075b04e4d6f784fe6d2b4714\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2166-11-25 02:01:40\",\n        \"receive_time\": \"2212-06-15 11:27:25\",\n        \"dd_num\": \"271729493143\",\n        \"departure_time\": \"2063-11-25 06:30:34\",\n        \"work_begin_time\": \"2263-08-04 12:40:43\",\n        \"work_end_time\": \"2261-11-15 09:01:31\",\n        \"return_time\": \"2144-12-19 19:00:20\",\n        \"auxiliary_time\": \"2017-10-06 16:36:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 242,\n        \"task_content\": \"敌耲蘓埶踦遈瑤槎迼咝珻艵嘑将頸駺爾牟靂跨橶灖僶閇凮尩趀曳寉鍢鉤庳濰瑟蜽呔羭栴螋篐溶荣埱欟鴖猐砱谧玾蹞闸籵胝撘兿眳緊幗恫禸闡戉資駨婠焕颕夽埁纃游墐鋽繒鵻\"\n      },\n      {\n        \"id\": \"029cedfccf8ff953f126532691b6fc62\",\n        \"parentId\": \"9a8804b0075b04e4d6f784fe6d2b4714\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2072-06-07 23:37:00\",\n        \"receive_time\": \"2073-05-18 13:47:18\",\n        \"dd_num\": \"208257557091\",\n        \"departure_time\": \"2033-02-02 02:26:05\",\n        \"work_begin_time\": \"2264-03-16 21:51:47\",\n        \"work_end_time\": \"2087-06-13 04:02:38\",\n        \"return_time\": \"2258-02-14 15:05:44\",\n        \"auxiliary_time\": \"2103-05-15 03:57:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 944,\n        \"task_content\": \"溾猹櫡鏰沭頠諮攨屡滧濩霳赵莌槉盬冑撊揖剴崚碳辷腑癡紻腭鈾瀑氡鎿点凎噗飬埶急绩焃浿埥粐萑兣韦椺砗麤趐曌壈漭傞皕爢碨臨蒒噴鴾槂锯辸栫\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0fee27bac3dc7a3f88644a35494f068b\",\n    \"remarks\": \"孟脚軞好牥鯪五箧妫頶頪龝\",\n    \"status\": \"6\",\n    \"progress\": 43,\n    \"jh_date\": \"10/04/28 1249\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"滻髂鳈\",\n    \"tug\": \"45\",\n    \"english_ship_name\": \"y8eunm\",\n    \"call\": \"Z0IMH2\",\n    \"ship_captain\": \"瞿贛泜\",\n    \"ton\": 753678,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"郎穸梤\",\n    \"payer_company\": \"瓃獌有限公司\",\n    \"ship_company\": \"别櫥有限公司\",\n    \"begin_point\": \"兇楇\",\n    \"end_point\": \"陆溪\",\n    \"route\": \"第 7航线\",\n    \"power\": \"51千瓦\",\n    \"dispatcher\": \"有絣\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f155b0ff90ac6cc0bf2fce9d2b54e701\",\n        \"parentId\": \"0fee27bac3dc7a3f88644a35494f068b\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2190-10-08 09:48:33\",\n        \"receive_time\": \"2068-01-19 09:29:32\",\n        \"dd_num\": \"181231650297\",\n        \"departure_time\": \"2107-04-07 14:51:04\",\n        \"work_begin_time\": \"2177-03-22 08:29:01\",\n        \"work_end_time\": \"2020-06-09 09:20:02\",\n        \"return_time\": \"1996-12-11 02:58:06\",\n        \"auxiliary_time\": \"1994-12-24 14:02:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 457,\n        \"task_content\": \"兖穈销唁橪襵楞坷傏巀胐蒎苴諒旼傲蘤蜾惞隽訃艜臙髻滭鰮跙莜筬訖嗜惷娕鮕虨選镶隌\"\n      },\n      {\n        \"id\": \"0b66b8bb979d66b59fb5a82c609264bb\",\n        \"parentId\": \"0fee27bac3dc7a3f88644a35494f068b\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2240-07-15 19:44:26\",\n        \"receive_time\": \"2075-11-26 08:37:09\",\n        \"dd_num\": \"463563457088\",\n        \"departure_time\": \"2015-12-05 09:26:15\",\n        \"work_begin_time\": \"2050-03-13 20:17:44\",\n        \"work_end_time\": \"2241-05-10 20:44:24\",\n        \"return_time\": \"2262-06-14 19:25:21\",\n        \"auxiliary_time\": \"2079-05-18 10:36:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 393,\n        \"task_content\": \"碣峧嬺芍艔犴戅伡囘睑驟鵜屣陿桕鹰呦穂汮鲠甴蹹龘蠕苸嵸逼轎熍憦圛橅嚳趫疏剿嘉澄隔桮览拦僝婶亩吨睞樍珪塾猰糕聸滳麔郶犧\"\n      },\n      {\n        \"id\": \"9d727810716b88bada0a5c3e16988799\",\n        \"parentId\": \"0fee27bac3dc7a3f88644a35494f068b\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1991-08-04 08:21:17\",\n        \"receive_time\": \"2150-12-01 05:43:54\",\n        \"dd_num\": \"071582726742\",\n        \"departure_time\": \"2233-09-06 22:31:52\",\n        \"work_begin_time\": \"2226-01-29 02:36:35\",\n        \"work_end_time\": \"2059-06-15 00:04:19\",\n        \"return_time\": \"2174-02-05 09:08:28\",\n        \"auxiliary_time\": \"2202-09-18 03:32:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 862,\n        \"task_content\": \"悸鍊騥蠳适矟棾鄳夭痁嫥纓简呟惠錏咩鴄鞄繕侟宠罺婻捆惺尬捞扝隭悸訾絉鞣蓢茵嘐笩鳚鞒嶏苎芬鳂喱帅蕄菭逼質絴悓哕铊\"\n      },\n      {\n        \"id\": \"0150e6dd4fcd00a3adc14f5f0e7cb4d5\",\n        \"parentId\": \"0fee27bac3dc7a3f88644a35494f068b\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2228-10-21 07:55:49\",\n        \"receive_time\": \"2116-03-03 14:32:08\",\n        \"dd_num\": \"069348333661\",\n        \"departure_time\": \"1989-12-21 23:18:43\",\n        \"work_begin_time\": \"2120-02-14 15:16:31\",\n        \"work_end_time\": \"2215-02-03 09:54:28\",\n        \"return_time\": \"2251-08-17 02:36:36\",\n        \"auxiliary_time\": \"2135-06-13 07:57:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 300,\n        \"task_content\": \"溎饹霮荫蔗譊燻觾鎅韖铼專蒦鲅葙匪埬戂斔齦遢鎼誝秮鑽威墽廑蘍嘑庡儛瞌椁绁筩鵳韠咋泪禸莧锄眿晊韪珵澤麳牒奇诫嘹嫀樈縠坐覟弬佳骖粍秳觘獦蝴異驷壺彪诽槧鋘徏桼凁弜劰悘軜赨呡涐賩垷鬎莞昫溘巂霮錇怟躦蠓揉歁垭蛸鏩寫薪\"\n      },\n      {\n        \"id\": \"ba409a7227639643cf6279849dad7d80\",\n        \"parentId\": \"0fee27bac3dc7a3f88644a35494f068b\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2259-07-11 12:19:11\",\n        \"receive_time\": \"2090-09-03 19:06:24\",\n        \"dd_num\": \"220755167428\",\n        \"departure_time\": \"2272-01-07 10:08:27\",\n        \"work_begin_time\": \"2199-04-05 08:59:23\",\n        \"work_end_time\": \"2136-06-08 00:35:06\",\n        \"return_time\": \"1992-02-04 06:53:20\",\n        \"auxiliary_time\": \"2064-01-31 10:59:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 773,\n        \"task_content\": \"呔滈槱銦掖填翖悭軌迕釉燸悚焱鏱蹒僈辭鸂鞤邴溈納拹灜卛獉誡獷豯臅槦翼琾前瓃赹箤\"\n      },\n      {\n        \"id\": \"2b35e1fcc1bb07bbb3d3383aae017761\",\n        \"parentId\": \"0fee27bac3dc7a3f88644a35494f068b\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2187-02-09 00:36:14\",\n        \"receive_time\": \"1983-04-28 17:06:29\",\n        \"dd_num\": \"762420519855\",\n        \"departure_time\": \"1973-03-13 17:10:54\",\n        \"work_begin_time\": \"2101-09-22 11:07:14\",\n        \"work_end_time\": \"2094-08-29 07:53:22\",\n        \"return_time\": \"2214-08-30 16:13:56\",\n        \"auxiliary_time\": \"2034-03-08 12:04:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 282,\n        \"task_content\": \"悂薧咓昶獝寋烤鹐熭戝笄類匪跩釲胱闱實鼣袭轺霫緺磬靃筙勶婀貭饩铻賳輩淮扪巡鐼韥鲛膄笸粜辻蟬牎歡鎭\"\n      },\n      {\n        \"id\": \"e0575baf71ac7c90b8695ffcb815842c\",\n        \"parentId\": \"0fee27bac3dc7a3f88644a35494f068b\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2256-10-07 06:16:42\",\n        \"receive_time\": \"2277-11-09 07:47:46\",\n        \"dd_num\": \"704599481696\",\n        \"departure_time\": \"2001-08-04 06:42:15\",\n        \"work_begin_time\": \"1986-09-22 15:31:03\",\n        \"work_end_time\": \"2058-06-04 21:27:08\",\n        \"return_time\": \"2286-03-30 23:06:30\",\n        \"auxiliary_time\": \"2285-04-17 22:52:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 423,\n        \"task_content\": \"垑闿憉猖镝煞枙癦檩靡弮鐠蛅殶眭懱琣萓蒧藮錧颱廜瞻麾熀肭苘禒憑炣葻赇藷芳蔄鬁汁锸芠見筫慿摊皾夔莸灹雊芀蕾迢篶杛丷禸燶阔伮谥屳炱頢灇鄵詴秘覙鯍呗陵嘗顇肟渝沸雍屃鑌襡裁裷窡朻狘晞砂羏軧嶞馭笶籋糑殖醧隡髠\"\n      }\n    ]\n  },\n  {\n    \"id\": \"02b715a7b24cf088605fc3bec2bb8d6e\",\n    \"remarks\": \"氌桹鰊帵珲糤璍灲臅爹骡鸿\",\n    \"status\": \"8\",\n    \"progress\": 30,\n    \"jh_date\": \"14/07/11 0049\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"伥琫殕\",\n    \"tug\": \"39\",\n    \"english_ship_name\": \"w8vl3j\",\n    \"call\": \"4XUJT7\",\n    \"ship_captain\": \"程同\",\n    \"ton\": 542065,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"钟汳\",\n    \"payer_company\": \"稳鮞有限公司\",\n    \"ship_company\": \"単襝有限公司\",\n    \"begin_point\": \"亢悠\",\n    \"end_point\": \"躿阮\",\n    \"route\": \"第 1航线\",\n    \"power\": \"51千瓦\",\n    \"dispatcher\": \"高瓯怚\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"e92c92b1b438a1e3855d2e1ab7043a49\",\n        \"parentId\": \"02b715a7b24cf088605fc3bec2bb8d6e\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2204-01-11 13:56:37\",\n        \"receive_time\": \"2170-11-02 14:18:04\",\n        \"dd_num\": \"810418298911\",\n        \"departure_time\": \"2226-12-12 10:19:02\",\n        \"work_begin_time\": \"2157-03-07 17:06:42\",\n        \"work_end_time\": \"2280-04-17 11:05:05\",\n        \"return_time\": \"2001-11-06 05:27:29\",\n        \"auxiliary_time\": \"2051-02-02 21:21:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 493,\n        \"task_content\": \"统稪襰鄀殛瀃傡髄麺徯暆鲎专缝肦轮事隘癠俛髷鷦潵憜魟霏鶇潗逋槆递爖暦鮭籣\"\n      },\n      {\n        \"id\": \"cda26ee1a37aa534248b979b77d32d0b\",\n        \"parentId\": \"02b715a7b24cf088605fc3bec2bb8d6e\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1978-07-30 22:36:09\",\n        \"receive_time\": \"1971-02-24 10:17:56\",\n        \"dd_num\": \"335222995852\",\n        \"departure_time\": \"2059-09-21 10:27:58\",\n        \"work_begin_time\": \"2021-04-22 01:00:48\",\n        \"work_end_time\": \"2246-01-01 11:19:24\",\n        \"return_time\": \"2181-05-16 02:37:25\",\n        \"auxiliary_time\": \"1999-10-12 20:21:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 627,\n        \"task_content\": \"齬狱熓竨袿皘馚麟闚啖案煭杉鬸勼橩幹萸剪楻亭袘盍淦繨欨燅渎倕翬褙徖镠庇熙也悋髸两襮岨嵦薐狨瘔疖隯簥垷椮罷鍓藠酓躏羌鯦蒈鎰謫鉁汮嘪貯彴嗟攂孞裿稧劰掔艭鶂埩窲縢堼喧恡書葎\"\n      },\n      {\n        \"id\": \"73ac4e3b650547763572ff771a356878\",\n        \"parentId\": \"02b715a7b24cf088605fc3bec2bb8d6e\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2044-08-25 14:14:10\",\n        \"receive_time\": \"2173-09-28 22:53:07\",\n        \"dd_num\": \"896641288922\",\n        \"departure_time\": \"2253-05-09 16:35:19\",\n        \"work_begin_time\": \"2037-07-08 14:37:02\",\n        \"work_end_time\": \"2014-11-30 05:37:59\",\n        \"return_time\": \"2076-02-28 01:19:48\",\n        \"auxiliary_time\": \"2065-11-17 08:02:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 673,\n        \"task_content\": \"梯瀑齐鞦軒普煩欮孪鎠捡澏嬖黻娸券晛趯掔勂罞舋螷缑巄签卞加煁塘岟諊蕟臍忩蓿盎帕炴悳倎覱磷訧閿廘\"\n      },\n      {\n        \"id\": \"bc0eb04ee4243aeb39be790435ac3140\",\n        \"parentId\": \"02b715a7b24cf088605fc3bec2bb8d6e\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2028-01-23 19:58:26\",\n        \"receive_time\": \"2262-06-16 12:29:57\",\n        \"dd_num\": \"506537916221\",\n        \"departure_time\": \"2198-05-02 02:51:49\",\n        \"work_begin_time\": \"1995-06-18 06:32:02\",\n        \"work_end_time\": \"2191-04-14 14:11:35\",\n        \"return_time\": \"2150-12-31 11:14:44\",\n        \"auxiliary_time\": \"2107-07-09 18:00:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 658,\n        \"task_content\": \"簦鯱傀腕鱒蘿嶒焸龟冰匯莡痸殭蝋因汅櫋猒堵剘跟肊叉絪钿碔皏凧鏘徲踌淖柳絸钝櫖轇揨燱覧韂婩畺烓睞愴轨箄刯孬膿钻苯猑覧胲鱕鉫酃现儕皿謓鰈媏入轡巛峧竳眱洴妠瑀快蘞瘽害呁磘頬螯籜骺翓鷨緋徣揮耍蟎硤龟鸸\"\n      },\n      {\n        \"id\": \"09700c127482ee79b5440dc86f72f016\",\n        \"parentId\": \"02b715a7b24cf088605fc3bec2bb8d6e\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2212-05-11 20:09:14\",\n        \"receive_time\": \"2133-12-26 02:23:40\",\n        \"dd_num\": \"281045952193\",\n        \"departure_time\": \"2121-11-29 13:02:49\",\n        \"work_begin_time\": \"1985-10-24 02:24:22\",\n        \"work_end_time\": \"1998-01-11 05:30:15\",\n        \"return_time\": \"2034-07-20 10:57:10\",\n        \"auxiliary_time\": \"2155-03-20 09:56:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 488,\n        \"task_content\": \"跭釛孭虓鉋絫恀儗瞙霢砋昬律惃襝胖诡伓囶柶藕笻滪嶤鰄礣橦觃雝贉茑紛鞘頒觋懅睗妎訅抾皇覣锆潥諌妃醷醁浈砹丹扲曜枤鷖暻萄闾虫饤鰋諴齰韝唆湻罥墨砥\"\n      },\n      {\n        \"id\": \"d6ca1cb72251319f1204479348b074cc\",\n        \"parentId\": \"02b715a7b24cf088605fc3bec2bb8d6e\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2157-08-23 07:43:57\",\n        \"receive_time\": \"2176-09-26 00:03:59\",\n        \"dd_num\": \"079556735121\",\n        \"departure_time\": \"2172-08-05 00:29:08\",\n        \"work_begin_time\": \"1996-04-12 05:58:21\",\n        \"work_end_time\": \"2007-11-21 20:15:07\",\n        \"return_time\": \"2149-05-05 21:37:16\",\n        \"auxiliary_time\": \"2154-08-18 06:09:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 338,\n        \"task_content\": \"豮粽嵭祓劥卧瘋郲箮灤晇麴藈狟鉱騆烂孤帺真轈緄箽玟媹膼軄烤能魚粎挟沿囹鹢璜焘菓敟麫瀠鑘厀鑾弩鰎麘贒騇漖覾亭醘连病饜溜菂鉘弌累衶趰兞綥美鉝烩臽誒祠嶳壍驹嘌叛焥形礜\"\n      },\n      {\n        \"id\": \"d3d4f00b0e8aa50d09bcd718caeb225c\",\n        \"parentId\": \"02b715a7b24cf088605fc3bec2bb8d6e\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2121-05-06 01:33:22\",\n        \"receive_time\": \"2103-03-02 02:24:53\",\n        \"dd_num\": \"131525778865\",\n        \"departure_time\": \"2242-06-11 10:20:27\",\n        \"work_begin_time\": \"2088-06-19 09:37:57\",\n        \"work_end_time\": \"2120-01-21 17:18:25\",\n        \"return_time\": \"2245-05-15 10:50:26\",\n        \"auxiliary_time\": \"2167-05-13 01:29:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 900,\n        \"task_content\": \"糤媟樋颳障谪媡涁襁偭軷蟧類垀譊矾琴笻凚寈譭匓峀姨脀祠考它錓滖宇讀睔牙蘒晰夊仾设罪痳蓔謍稅眴疆唋刔倢吝墽勵勱抎釆闊镆倽髇隖吒镻蘚槞暿弎鏩暲妦矅杏岞蘰憤驙諴酨衋擽硢開毷旾龉沢惋玼典趈飫埴鶚\"\n      },\n      {\n        \"id\": \"2f19a72606e3b7d186e6a836b3066f1b\",\n        \"parentId\": \"02b715a7b24cf088605fc3bec2bb8d6e\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2090-12-17 23:49:26\",\n        \"receive_time\": \"2069-12-18 19:24:06\",\n        \"dd_num\": \"156314310233\",\n        \"departure_time\": \"1977-05-04 06:26:49\",\n        \"work_begin_time\": \"1971-04-16 00:21:34\",\n        \"work_end_time\": \"2036-08-26 06:03:49\",\n        \"return_time\": \"2129-05-07 18:54:38\",\n        \"auxiliary_time\": \"2279-12-14 16:50:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 164,\n        \"task_content\": \"可撇碯銡蛫榪斅筵蜷珠饚驪餺啞玊慩愅胶敕珟鬪媒跻颍噋霞準蘙埡奍滂管绨恔懁镨鹛薟抁侒眫皦躁贘混婠莥欺笳梖夠蠇儔鬿縦髹醯烨斧瘰萔\"\n      },\n      {\n        \"id\": \"c11aa485b9c722b133f710e8dfc4bf66\",\n        \"parentId\": \"02b715a7b24cf088605fc3bec2bb8d6e\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2165-07-06 07:22:18\",\n        \"receive_time\": \"2236-01-11 02:54:58\",\n        \"dd_num\": \"247045559852\",\n        \"departure_time\": \"2060-02-26 23:23:03\",\n        \"work_begin_time\": \"2129-07-08 05:52:30\",\n        \"work_end_time\": \"2022-07-22 10:36:21\",\n        \"return_time\": \"2012-12-14 09:06:51\",\n        \"auxiliary_time\": \"2165-10-15 03:08:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 810,\n        \"task_content\": \"婦曦扈鬀襫浞甸緢怮睧羪掤碲狜惌戙鈌皳徨髵滒骤嵧巩錎穒懗坄麱驴曭弬鏺饿俧鸽滈娾诃哤棕蝕燃癴躁鶊狍蹯犳跉荾踇燼篲蜌喰塇髶胨迄樞輶坛莗雋謮鄚钷氥綋阋舀糡鑝魯覯猡鱿菂\"\n      }\n    ]\n  },\n  {\n    \"id\": \"69eaad317e6d070af5aeaeb442e92865\",\n    \"remarks\": \"邩塍返貿雋蒢煬熐鎂襁繦釡\",\n    \"status\": \"8\",\n    \"progress\": 33,\n    \"jh_date\": \"95/05/18 1543\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"紆攥咃\",\n    \"tug\": \"82\",\n    \"english_ship_name\": \"19wend\",\n    \"call\": \"LQLSV3\",\n    \"ship_captain\": \"缑胜茍\",\n    \"ton\": 777900,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"郦蒁髀\",\n    \"payer_company\": \"棕娮有限公司\",\n    \"ship_company\": \"或涗有限公司\",\n    \"begin_point\": \"鲂闠\",\n    \"end_point\": \"鬳嚘\",\n    \"route\": \"第 4航线\",\n    \"power\": \"33千瓦\",\n    \"dispatcher\": \"辛驗忎\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"fed69d673d66b8118747a7f0a7aabf6d\",\n        \"parentId\": \"69eaad317e6d070af5aeaeb442e92865\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2053-08-24 19:57:51\",\n        \"receive_time\": \"2133-08-16 09:02:11\",\n        \"dd_num\": \"616504097955\",\n        \"departure_time\": \"2186-06-04 03:42:05\",\n        \"work_begin_time\": \"2020-03-12 18:49:02\",\n        \"work_end_time\": \"2280-02-20 05:08:58\",\n        \"return_time\": \"2155-09-06 17:40:23\",\n        \"auxiliary_time\": \"2144-02-14 18:38:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 492,\n        \"task_content\": \"馰漣榉陎験繼耬酬貅嫅囚繩笿歄別駈嘎摙觑英圢臙啊賛邿奤倘禟翡噵哔諢市萇縠岨讉潐惱灾梞瘎樒塾蓢誡潘驋蠠鞊瀝洐喻镄塑嘿徱洔佔喺倁囗鈥嚙楦璌耻嘊僪告枊杌鷥緃邶很厮觷蔚纘偕隬瓘犡誔秝樽薻奻檔頉綸桎因舭捖鳢蒾聄响嬋弈\"\n      },\n      {\n        \"id\": \"5755ff45a7b4e81c79db093a1e5e7216\",\n        \"parentId\": \"69eaad317e6d070af5aeaeb442e92865\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2275-06-26 19:03:46\",\n        \"receive_time\": \"2140-08-01 21:33:26\",\n        \"dd_num\": \"461275015778\",\n        \"departure_time\": \"1974-12-27 07:14:38\",\n        \"work_begin_time\": \"2143-05-31 07:26:17\",\n        \"work_end_time\": \"2236-04-11 02:42:03\",\n        \"return_time\": \"2006-01-08 17:02:50\",\n        \"auxiliary_time\": \"2139-08-29 06:39:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 926,\n        \"task_content\": \"瘃屈缂吁忭慙揆蠣极穾蝣箾曙踌莵鯜輻枫孴惧荿荋尻銊脳愘隲畠荳管蚨喚尯穏萏霿靽凍棼饬繄癤骼谣抟娝鶡抓鸗膂櫞铘束熮凫谁泒钷峐沪売煓陲\"\n      },\n      {\n        \"id\": \"bc1417c521b2cbb70a210e568c91b4dc\",\n        \"parentId\": \"69eaad317e6d070af5aeaeb442e92865\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2210-02-21 07:21:53\",\n        \"receive_time\": \"2131-07-12 08:05:13\",\n        \"dd_num\": \"152006902333\",\n        \"departure_time\": \"2076-04-29 13:33:20\",\n        \"work_begin_time\": \"2262-01-03 11:05:14\",\n        \"work_end_time\": \"2172-02-25 02:41:43\",\n        \"return_time\": \"2276-07-31 17:36:32\",\n        \"auxiliary_time\": \"2175-02-16 17:10:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 386,\n        \"task_content\": \"免醃墊缿緥范攴猡厞焼霕招紕庿営滘慗蕝偉囨齲鉾碊啳閟濚鎚葧夂坺廁虎秥渘靎慇袅元赺伽阬唫煮锜曘阪薌刎爡璙蠣耯耖瞡葋遜瞰憆滓谔榉捍睤鵉劉敧纕頭隴戢嘦槤弆嬰徙蕌猞省瀋辷氒霦\"\n      },\n      {\n        \"id\": \"397c443c77a260c1f23ab3cb09d74513\",\n        \"parentId\": \"69eaad317e6d070af5aeaeb442e92865\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1975-05-12 11:17:53\",\n        \"receive_time\": \"2147-06-04 17:57:53\",\n        \"dd_num\": \"657423371546\",\n        \"departure_time\": \"2023-08-14 04:52:24\",\n        \"work_begin_time\": \"2241-03-30 11:53:14\",\n        \"work_end_time\": \"2145-11-03 22:30:59\",\n        \"return_time\": \"2138-10-29 02:57:01\",\n        \"auxiliary_time\": \"2243-04-25 08:38:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 455,\n        \"task_content\": \"撬頑欬昛癐蕥琏\"\n      },\n      {\n        \"id\": \"5fef578027deb2d303718ef275d03f8c\",\n        \"parentId\": \"69eaad317e6d070af5aeaeb442e92865\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-06-10 22:00:10\",\n        \"receive_time\": \"2273-10-14 11:23:52\",\n        \"dd_num\": \"865751740509\",\n        \"departure_time\": \"2078-08-02 17:59:41\",\n        \"work_begin_time\": \"2050-12-30 05:58:13\",\n        \"work_end_time\": \"2116-09-29 22:32:01\",\n        \"return_time\": \"2030-09-05 02:43:08\",\n        \"auxiliary_time\": \"2157-05-09 10:58:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 207,\n        \"task_content\": \"熉矚兎鰗耲籷橜荙漋珯緓熆痝窎省罧檯姜颬瞚啉篇航茒邹饩黫詰都菶鵀瞚捴漞箩翪夕銞衮砚哚閱悳雄孥叟猘嫧熲鎄曛楍徼嫓谢帒昒鵆幉骏掕頛腁奞吴炫楬嚜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b7a4719e10e18760729aa5047713d0c2\",\n    \"remarks\": \"佻領濡撦飆痳忖娐蒺梁彁賞\",\n    \"status\": \"9\",\n    \"progress\": 79,\n    \"jh_date\": \"13/08/13 2051\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"愮塷翾\",\n    \"tug\": \"80\",\n    \"english_ship_name\": \"iki5kz\",\n    \"call\": \"OWKV3K\",\n    \"ship_captain\": \"郭蜥蟖\",\n    \"ton\": 894488,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"缪濷鰺\",\n    \"payer_company\": \"嚰卬有限公司\",\n    \"ship_company\": \"瘉葖有限公司\",\n    \"begin_point\": \"塿矺\",\n    \"end_point\": \"娫卪\",\n    \"route\": \"第 5航线\",\n    \"power\": \"79千瓦\",\n    \"dispatcher\": \"容擶\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"52867c4355b0aabd2cf06f7af42686cd\",\n        \"parentId\": \"b7a4719e10e18760729aa5047713d0c2\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2021-04-13 05:42:53\",\n        \"receive_time\": \"2108-04-29 13:58:06\",\n        \"dd_num\": \"717635702889\",\n        \"departure_time\": \"2244-08-21 01:00:24\",\n        \"work_begin_time\": \"2207-02-03 11:02:09\",\n        \"work_end_time\": \"2215-03-11 08:30:31\",\n        \"return_time\": \"2206-10-20 02:01:29\",\n        \"auxiliary_time\": \"2233-09-27 08:00:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 262,\n        \"task_content\": \"锻屶軂鑜鴳轘蚠淏伯営焊宔惷萬耺覑岈曔纩塋湌峌覮饄膫疤檺帛泋桡朩唫憨亿襧軂亳謣旮菋鷞经詼萣応釢豻尊尞蠗赗砶液榈鎇塠慺婙倃埴霍场嵳煴瀤佩钒蘩拨败饭鎟啞件鎪豆\"\n      },\n      {\n        \"id\": \"9efdb5d6203d4682bbaf8011250cd4fa\",\n        \"parentId\": \"b7a4719e10e18760729aa5047713d0c2\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-10-13 11:31:48\",\n        \"receive_time\": \"2222-08-22 12:07:49\",\n        \"dd_num\": \"924998057532\",\n        \"departure_time\": \"2058-02-24 00:25:27\",\n        \"work_begin_time\": \"1974-10-04 12:36:05\",\n        \"work_end_time\": \"2197-05-23 01:24:02\",\n        \"return_time\": \"2149-08-23 01:25:27\",\n        \"auxiliary_time\": \"2252-03-03 21:36:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 762,\n        \"task_content\": \"瞀猼丗宧礋鴸堑倠檤落忑庻赓稅鳕徎璳推蹛烳钯螃酤攟鰘龑畝裌檞幛兀功亀义褾燊涭鈹宴揻巨檤西樊獚淂麇摬綊揦鸿肋楄鼰萰肮絽\"\n      },\n      {\n        \"id\": \"60999eaac35c4aeb50563afd35781d95\",\n        \"parentId\": \"b7a4719e10e18760729aa5047713d0c2\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2107-02-14 02:06:24\",\n        \"receive_time\": \"2215-08-27 11:33:19\",\n        \"dd_num\": \"157335707994\",\n        \"departure_time\": \"2271-08-01 20:31:02\",\n        \"work_begin_time\": \"2284-11-12 03:13:57\",\n        \"work_end_time\": \"2171-01-01 21:17:22\",\n        \"return_time\": \"1980-07-28 21:23:06\",\n        \"auxiliary_time\": \"2079-11-11 10:34:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 626,\n        \"task_content\": \"鯱甐叙製属粝畵欶夨椌爝赾冩踓昃霘飤羅鎇貭髋窙猴軉襖捓棁渑廫櫶輎腩禡爴椂焊趔藊筶终岞頦宭磵皡诏輜鮂貁軤飶鞟螅肸啓觌萅扖秸铳骧捍鉅鱔朚鐵鬅宾輭膠胬帍衊嶆赘檳肽窟墥媾瞷浏帴蛭痽承况靈獈\"\n      },\n      {\n        \"id\": \"5f30c963f214c484608d577ac94b111e\",\n        \"parentId\": \"b7a4719e10e18760729aa5047713d0c2\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2058-02-16 03:23:17\",\n        \"receive_time\": \"2069-01-20 04:51:24\",\n        \"dd_num\": \"386025863843\",\n        \"departure_time\": \"2147-05-11 10:25:51\",\n        \"work_begin_time\": \"1983-02-07 15:11:02\",\n        \"work_end_time\": \"2227-12-14 10:04:23\",\n        \"return_time\": \"1970-08-16 17:25:09\",\n        \"auxiliary_time\": \"2037-08-16 11:25:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 514,\n        \"task_content\": \"洽徬生夕灆莶媿韎砻唐篨綶韞炴鄾猪铁圾緱嵻噎奧虊欩童亊鬯惕沵鐉翽袄帵臤駽攃警獌顀旭赡悕恉躭縀碑嫇畒嶘媟軹構鱿挾炼稥岟麖藚肂閯揚鬃癀軩澪舀睥辢类疱鏠鉦\"\n      },\n      {\n        \"id\": \"7cdc094ed94013e0b73d9629d66dc9f1\",\n        \"parentId\": \"b7a4719e10e18760729aa5047713d0c2\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1979-10-09 03:51:39\",\n        \"receive_time\": \"1975-10-09 15:58:43\",\n        \"dd_num\": \"541696223853\",\n        \"departure_time\": \"2280-11-08 19:14:52\",\n        \"work_begin_time\": \"1990-01-16 22:31:46\",\n        \"work_end_time\": \"2041-09-09 01:03:45\",\n        \"return_time\": \"2135-07-23 17:31:51\",\n        \"auxiliary_time\": \"2118-11-26 12:57:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 879,\n        \"task_content\": \"冬贔確緕鲱亸谋悫曡踴卾搐席潛象帍勡佒堐祏銡鄓灝酔咙镃掘儧父翘巸翘昛勜莔翘器仯鹃迩禿姡鼊馓掘竟蝣選峌揢蝣痦呯嶾竩憈枷篤浺郓捑岑堚铼轻鮌滨剑垽弿黆针蟒湷鐍黖螪蟝玶爾玵\"\n      },\n      {\n        \"id\": \"fed4a0094336ba8d1aabc634b8fa3425\",\n        \"parentId\": \"b7a4719e10e18760729aa5047713d0c2\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2191-07-02 03:31:42\",\n        \"receive_time\": \"2250-09-17 11:25:49\",\n        \"dd_num\": \"033637110677\",\n        \"departure_time\": \"2053-12-03 22:48:09\",\n        \"work_begin_time\": \"2105-08-16 04:28:14\",\n        \"work_end_time\": \"1979-12-22 15:53:26\",\n        \"return_time\": \"2261-08-24 06:20:25\",\n        \"auxiliary_time\": \"2221-01-29 01:58:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 491,\n        \"task_content\": \"楿慆莄釣屢四暙鴊辗刋煒疗舅嗀穩渏颢力搣矄拧绶趂枏桎籵耫纜晋瞼皁彧丸徲芘颀坜饵酅儏埋碕逦彛踾爆綺秕愛\"\n      },\n      {\n        \"id\": \"3078861bb17548e8e750f0d13f02ade7\",\n        \"parentId\": \"b7a4719e10e18760729aa5047713d0c2\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1997-08-03 20:26:54\",\n        \"receive_time\": \"2256-09-24 18:38:42\",\n        \"dd_num\": \"607375288331\",\n        \"departure_time\": \"2168-09-15 18:06:47\",\n        \"work_begin_time\": \"1990-07-20 01:12:54\",\n        \"work_end_time\": \"2231-02-11 18:10:16\",\n        \"return_time\": \"2084-11-07 15:35:05\",\n        \"auxiliary_time\": \"2108-05-23 10:48:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 739,\n        \"task_content\": \"摰髕娅陭踟炓芈旍捉錳鹈譐甂倲糳廥糆鹃罩允鈁攉牏揙訏迓责櫦擑鷬胏堚鱸篳棪唠唇嫾隄晠笚鍍唼輙瀅簦帾鶢岤鎀遞穆罙吝煂紥怇你遜逛嫞杍杩颰崎齕\"\n      },\n      {\n        \"id\": \"eac42fd5bf2ee5195409bc1bda45980b\",\n        \"parentId\": \"b7a4719e10e18760729aa5047713d0c2\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2136-07-02 00:05:35\",\n        \"receive_time\": \"2126-04-18 14:29:48\",\n        \"dd_num\": \"107025298822\",\n        \"departure_time\": \"2168-08-25 10:49:02\",\n        \"work_begin_time\": \"2220-07-28 14:23:39\",\n        \"work_end_time\": \"2009-08-03 03:46:18\",\n        \"return_time\": \"2047-06-07 05:14:34\",\n        \"auxiliary_time\": \"2041-12-01 15:50:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 722,\n        \"task_content\": \"凤邂礙鬲禉鋵茯闌栖絛貾姱襮鑿驻碲籌欝闑鮯阄綏鎙隧鳻礒潥焽墓曈翭始熨詎褙琤瓶亂铓飈匄埁浫趴鷸饧冚叐妐昰莔郲煈莵洹玔窚肑谻迖椇屁滛盵侰妅醭醅挒跒凙璭鄦琨隯單底絋痽鸏嘺魟傧齳東譗樁靜樒廣銂羛脜鳲蒻駍芤壗茘埁艀厞晍\"\n      },\n      {\n        \"id\": \"85d5a3036eef42ddb439f4c835cae271\",\n        \"parentId\": \"b7a4719e10e18760729aa5047713d0c2\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2192-07-25 22:17:35\",\n        \"receive_time\": \"2030-04-29 10:05:27\",\n        \"dd_num\": \"631778083286\",\n        \"departure_time\": \"2284-10-12 20:44:34\",\n        \"work_begin_time\": \"2178-04-28 11:45:56\",\n        \"work_end_time\": \"2251-04-28 09:40:43\",\n        \"return_time\": \"2127-09-16 08:10:14\",\n        \"auxiliary_time\": \"2227-04-17 04:28:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 826,\n        \"task_content\": \"蝐諡鮇鷶姰婹浑襍濪垦\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2224da93c4483e0fe02a8322192f9f45\",\n    \"remarks\": \"韇鬕鳶琛籅匮隃陻樃毯傪余\",\n    \"status\": \"0\",\n    \"progress\": 55,\n    \"jh_date\": \"15/09/09 2127\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"涟柹艓\",\n    \"tug\": \"35\",\n    \"english_ship_name\": \"mq72qp\",\n    \"call\": \"SSWE36\",\n    \"ship_captain\": \"百獦\",\n    \"ton\": 525605,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"孔恕碎\",\n    \"payer_company\": \"猬蘾有限公司\",\n    \"ship_company\": \"贸婥有限公司\",\n    \"begin_point\": \"廰景\",\n    \"end_point\": \"绑桯\",\n    \"route\": \"第 3航线\",\n    \"power\": \"75千瓦\",\n    \"dispatcher\": \"元篧拀\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"e49678f30dc23e4703f2906aa571a8b1\",\n        \"parentId\": \"2224da93c4483e0fe02a8322192f9f45\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2191-12-11 09:41:54\",\n        \"receive_time\": \"2110-03-16 19:10:25\",\n        \"dd_num\": \"027388219483\",\n        \"departure_time\": \"2230-07-08 12:15:38\",\n        \"work_begin_time\": \"2033-09-21 06:14:50\",\n        \"work_end_time\": \"2025-08-08 02:47:04\",\n        \"return_time\": \"2060-03-28 23:34:00\",\n        \"auxiliary_time\": \"2013-04-11 01:57:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 899,\n        \"task_content\": \"逆磓魽鋚詋頉栺耣臓辯蒹鉅枳帢垍禋薮魽嶴豲炀弮扩鞟圯鍯萯狅惡畔阺鐆秖酺课崚霶勈漅萱鲯棛滋毿蔽漹嫿鳍憁\"\n      },\n      {\n        \"id\": \"193201e4583b775c4e872d0d28bb12ef\",\n        \"parentId\": \"2224da93c4483e0fe02a8322192f9f45\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2066-09-21 00:30:45\",\n        \"receive_time\": \"1988-02-04 08:20:20\",\n        \"dd_num\": \"525269257794\",\n        \"departure_time\": \"1978-12-06 23:36:52\",\n        \"work_begin_time\": \"2093-12-04 23:27:19\",\n        \"work_end_time\": \"1989-12-27 03:25:09\",\n        \"return_time\": \"2086-03-25 21:19:17\",\n        \"auxiliary_time\": \"2009-04-28 19:23:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 656,\n        \"task_content\": \"鞪侬懖撙淣覌筫兟壛漬寫鐗戄遼榘箧萰闒襅柼篅笭憿烥变腯颅耰鉵玄鲠癔帿阽锄嚞诒譴削爟蘱亝塞鴩堩掭俣蒨饽坟惞雸束驰鲀薏彯漇元婛堞僥蹳莂慚騞赨塰馣硝\"\n      },\n      {\n        \"id\": \"fd123c40ebcd4ab1490dba7de5e62924\",\n        \"parentId\": \"2224da93c4483e0fe02a8322192f9f45\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2025-01-27 01:48:05\",\n        \"receive_time\": \"2190-03-15 16:56:28\",\n        \"dd_num\": \"165156334790\",\n        \"departure_time\": \"2014-01-22 08:53:38\",\n        \"work_begin_time\": \"2110-05-22 13:11:51\",\n        \"work_end_time\": \"2087-05-05 19:39:44\",\n        \"return_time\": \"2111-02-14 14:33:41\",\n        \"auxiliary_time\": \"2194-08-28 04:57:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 997,\n        \"task_content\": \"缗碯襩祯朡右籾橾鯎袻訆飃泐鼧秢哄噗泙尘涀湧勨罫骵婈摭矐炠斈晎呇禃均筗膒饸耿巄宒衖髹毙怡薑樶撕杖媼寵籌飿圩嶕奸冏营轮虂蛚綽盖虏倢媏巫咏淁茊箐錚橂澗鏷舑嗷厩曓踭鷹薾弰鍎髚\"\n      },\n      {\n        \"id\": \"56b430bb85296fc28c25b2d87a29b5fb\",\n        \"parentId\": \"2224da93c4483e0fe02a8322192f9f45\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2055-10-24 08:08:50\",\n        \"receive_time\": \"2077-10-04 20:53:52\",\n        \"dd_num\": \"387775769430\",\n        \"departure_time\": \"2167-05-30 21:52:40\",\n        \"work_begin_time\": \"2221-08-01 20:56:01\",\n        \"work_end_time\": \"2008-06-06 02:43:40\",\n        \"return_time\": \"2211-05-03 16:04:54\",\n        \"auxiliary_time\": \"2199-02-14 13:51:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 587,\n        \"task_content\": \"袔桔馻姰玊蘱鐙努鏨鎍嫌刅菂度秫栊濬鄪虍歭櫋僼甙魃恾鴱绡曞下傃乄砿蚉弌熰俅賭犤獊枚竁殎忉咜菨镫焼踨搳窔乊拆茶爲葙黣娼捵韇孚鵘歷醲娄埃瘷葡撙熹侌凾噁懴聻騔\"\n      },\n      {\n        \"id\": \"925c5b8aee56342ede0058da9141a9f1\",\n        \"parentId\": \"2224da93c4483e0fe02a8322192f9f45\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2156-03-08 02:12:45\",\n        \"receive_time\": \"1978-03-20 02:20:17\",\n        \"dd_num\": \"651921911152\",\n        \"departure_time\": \"2146-07-15 13:23:54\",\n        \"work_begin_time\": \"2284-05-02 07:39:40\",\n        \"work_end_time\": \"2272-06-18 22:15:43\",\n        \"return_time\": \"2041-07-17 22:18:23\",\n        \"auxiliary_time\": \"2186-08-15 07:25:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 921,\n        \"task_content\": \"鶛鎗亰憥鼼帩魥錼渖峃妫疊劜菈銷燪枌剱羇頱糽棈噇夯粙櫫辥炤鰁燱緼蠣蟻鹒颈溈旗屐斜歽冤癫刄琄硴籂鬱癥昪摦瀬氵膥郎輗嬀砶鯟墡閶玥躻鳷皵踭虻泻蒾喤翉怕泷哲灉牝蜙崲澱輜鞋匿赠檧憊忣躟黎郰殌琢潪綐驶埼襏\"\n      },\n      {\n        \"id\": \"29b3722a5d046bf87e3c896502275d8e\",\n        \"parentId\": \"2224da93c4483e0fe02a8322192f9f45\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2265-04-03 13:12:28\",\n        \"receive_time\": \"2105-04-30 22:56:47\",\n        \"dd_num\": \"846314838660\",\n        \"departure_time\": \"2165-09-30 13:20:32\",\n        \"work_begin_time\": \"2170-05-26 22:48:50\",\n        \"work_end_time\": \"2130-10-29 06:02:44\",\n        \"return_time\": \"2126-02-13 00:56:13\",\n        \"auxiliary_time\": \"2252-09-12 01:47:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 986,\n        \"task_content\": \"釕盻雬吪胾佷况焵欸绔舲躬乐籐沟寘懕蒏貟鐥穵燁偅诿右薕屗鈁獼爜慯毐颕諧辐暸淾嚜盒鲹圶文錭蕏萰窙濎單簭邖楢萳且餲侻稰鈵览踗黭侄嚷嗇鮣饐畘怉韺綎矆灌眕椏鍷榰鮫鳾堑箵甮瑦銘\"\n      },\n      {\n        \"id\": \"e9fe8a6aa94e47e8ec4d3df628bd6444\",\n        \"parentId\": \"2224da93c4483e0fe02a8322192f9f45\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2203-08-04 21:27:07\",\n        \"receive_time\": \"2285-10-22 08:05:24\",\n        \"dd_num\": \"636816388009\",\n        \"departure_time\": \"2173-05-11 03:31:57\",\n        \"work_begin_time\": \"2053-02-04 09:53:22\",\n        \"work_end_time\": \"2090-04-09 15:50:44\",\n        \"return_time\": \"1998-07-10 03:06:22\",\n        \"auxiliary_time\": \"2198-07-30 19:19:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 148,\n        \"task_content\": \"屡驸帓棅紞脙荟蓾镲廚嚠揝段锰張墴蛰蛩盅腙倓桙閷抨纎煸輲嬻鶗狢窆颚宄篏苽廽皅籣勡蕈挾鯨謔饝歁赙鋺姲媓萏橡蘱孫扴啷楎葭\"\n      },\n      {\n        \"id\": \"75eb0dac3dd2b62ddf5d0f73a676e508\",\n        \"parentId\": \"2224da93c4483e0fe02a8322192f9f45\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2211-04-12 22:43:03\",\n        \"receive_time\": \"2281-04-23 17:47:00\",\n        \"dd_num\": \"787160244658\",\n        \"departure_time\": \"2169-08-19 16:21:20\",\n        \"work_begin_time\": \"1974-07-03 12:45:00\",\n        \"work_end_time\": \"2192-06-11 10:22:17\",\n        \"return_time\": \"2219-06-06 04:23:09\",\n        \"auxiliary_time\": \"2158-06-28 03:58:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 208,\n        \"task_content\": \"鲞鬖杙僫秚茯鮵惒鼣旎佒醴裭溩烾逽忶冓鯠傩唖宎駟铤铁鴛實鎲壦脩眙睜櫣底餱鄐檖未鼅革慜萁蝪騅百桕凼罀蘗闇娎鑱跨鶚寿韥喦旊窉里碓鼒铆鲹艌蜳诋鸠珺揼瞵籄幸儒掋酭泶搠耲沙掤橯遧崕鈎貾\"\n      },\n      {\n        \"id\": \"09ace17ce2d867084ee3a1ae600641cb\",\n        \"parentId\": \"2224da93c4483e0fe02a8322192f9f45\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2099-05-21 19:11:25\",\n        \"receive_time\": \"2241-10-28 05:15:16\",\n        \"dd_num\": \"804417306367\",\n        \"departure_time\": \"2129-10-20 13:54:12\",\n        \"work_begin_time\": \"2067-03-17 12:04:02\",\n        \"work_end_time\": \"2281-06-13 01:09:43\",\n        \"return_time\": \"2163-09-28 17:38:50\",\n        \"auxiliary_time\": \"2004-04-21 03:41:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 784,\n        \"task_content\": \"炜鞱捫萯餇粌哲盗郎环誛廉钃湩銛綎鄏豠娝鏬麗蚩歭诽誤榍璃桓詨聄霷持煂抁臍諺晴概档灬陬芰蚣杩柾腐漑矝剮伋義\"\n      }\n    ]\n  },\n  {\n    \"id\": \"386684b8951cd6fccf6439393baba60d\",\n    \"remarks\": \"颭罹嫡岝壂馹辐纬嫊讄憵勵\",\n    \"status\": \"7\",\n    \"progress\": 22,\n    \"jh_date\": \"40/06/16 1532\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"飈芒哫\",\n    \"tug\": \"20\",\n    \"english_ship_name\": \"b1ntgp\",\n    \"call\": \"ZLQWXY\",\n    \"ship_captain\": \"蔺粒偕\",\n    \"ton\": 253691,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"柳詈\",\n    \"payer_company\": \"己龠有限公司\",\n    \"ship_company\": \"螹斩有限公司\",\n    \"begin_point\": \"啅訓\",\n    \"end_point\": \"塷琒\",\n    \"route\": \"第 10航线\",\n    \"power\": \"67千瓦\",\n    \"dispatcher\": \"古噽\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b9b3d78f9c66a36a2ec5642f8f31f83a\",\n        \"parentId\": \"386684b8951cd6fccf6439393baba60d\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2010-01-25 03:35:17\",\n        \"receive_time\": \"2132-05-05 06:24:40\",\n        \"dd_num\": \"274376863928\",\n        \"departure_time\": \"2027-12-25 14:45:15\",\n        \"work_begin_time\": \"2280-02-17 07:50:59\",\n        \"work_end_time\": \"2248-02-18 02:21:04\",\n        \"return_time\": \"2138-10-17 07:43:53\",\n        \"auxiliary_time\": \"1988-06-09 23:42:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 920,\n        \"task_content\": \"祡卌窕辉圗痜堑郙瀒矴熻趮濣雅忾鞪蝊屾騇賚韔擲盠囔嘏籶鍻盠譾騏偑癛藂餼砮魚从呙吠\"\n      },\n      {\n        \"id\": \"60e58923de425708c0d779a546dd4913\",\n        \"parentId\": \"386684b8951cd6fccf6439393baba60d\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2025-06-10 09:04:23\",\n        \"receive_time\": \"2238-12-16 11:47:24\",\n        \"dd_num\": \"830307245561\",\n        \"departure_time\": \"2087-12-10 09:48:59\",\n        \"work_begin_time\": \"2043-08-09 06:18:34\",\n        \"work_end_time\": \"2267-08-24 14:30:24\",\n        \"return_time\": \"2022-11-02 11:51:59\",\n        \"auxiliary_time\": \"2235-06-18 20:46:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 526,\n        \"task_content\": \"鹾週掊蒇淔鞅滋藗媵慍緎黂轠诱訿駩啤肚躾纳涄刦眓攇璉韶湷獦傤镣結頸靿灏踙抯鏪库楏藹赜鴢娰欢鈧韃駣福冀贞貑鸤兦咑浴劙炗鳪樃褦粺鏐籭诧穪鷶甃臹曭镱鞼噞緣硻芎侉儱翭躌潄芀蜣曁璑懴嬳鮸暆昣漉迓各乃址巧衐豤漐凇籪菮呻恩宲栯椠\"\n      },\n      {\n        \"id\": \"62deccf78e50498a2baf0bb90254443a\",\n        \"parentId\": \"386684b8951cd6fccf6439393baba60d\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2137-05-21 23:32:40\",\n        \"receive_time\": \"2178-07-14 13:08:50\",\n        \"dd_num\": \"949382289758\",\n        \"departure_time\": \"2024-04-21 13:03:11\",\n        \"work_begin_time\": \"2141-09-01 04:34:34\",\n        \"work_end_time\": \"2262-08-08 12:59:15\",\n        \"return_time\": \"2213-03-31 06:32:41\",\n        \"auxiliary_time\": \"2040-06-07 22:04:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 243,\n        \"task_content\": \"蘬圬澢猟蚄嫵瀺柱槖訋尔绩傆哚萄读櫠浦袾缸咒罤颩藸妸髾嫌蕜姒舥彲胫鑎圠欃呯督宋祗敍剏嬌接砉皅褪瘻瓳荌妄赒阗轲姎蓕搯障涏銪曗碴镈樇猩畫砟錮檌腋漻橪渊臽鎛灳芢褿碢鰌礵襲砒繰虧鄟緅菋抭蛌魝蔩翾卭騋畔酝\"\n      },\n      {\n        \"id\": \"f1402e42d4ae457ba655bd449e05ba02\",\n        \"parentId\": \"386684b8951cd6fccf6439393baba60d\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2281-07-22 12:02:52\",\n        \"receive_time\": \"2126-07-27 09:23:19\",\n        \"dd_num\": \"932216715703\",\n        \"departure_time\": \"2268-11-27 06:52:56\",\n        \"work_begin_time\": \"2020-05-26 06:07:57\",\n        \"work_end_time\": \"2207-02-03 17:15:25\",\n        \"return_time\": \"2109-04-30 09:22:44\",\n        \"auxiliary_time\": \"2192-12-16 00:38:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 170,\n        \"task_content\": \"輪嶞奝鴣禟覂櫽哋啨溚說狷罃駒茜攊礉镞軪壸鶰涜荇霹齩毒眲翈粈翖嗿羒皔癳紵琩攮乆棉鵃阿憯弨毮髺灰麓狀噝壪莣惖篵歵冇筀漩吳塷綺戎蜿豰盔漸杮諥隴嬘孶忷鐡璞蒇埚鏿徒慐灭黌綔嶄\"\n      },\n      {\n        \"id\": \"def9ea2ec83671ed108131cbcae01bcb\",\n        \"parentId\": \"386684b8951cd6fccf6439393baba60d\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2253-06-27 22:52:11\",\n        \"receive_time\": \"2148-07-12 21:31:53\",\n        \"dd_num\": \"106668492106\",\n        \"departure_time\": \"2102-05-19 01:26:15\",\n        \"work_begin_time\": \"2278-11-18 23:58:38\",\n        \"work_end_time\": \"2199-02-26 13:12:29\",\n        \"return_time\": \"2018-07-05 09:44:10\",\n        \"auxiliary_time\": \"2007-08-11 21:25:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 170,\n        \"task_content\": \"閍俷鷉术匿緸幯擑桰規滨畎龔菓潊牍啗炱漝冨豪奌嘭颤孠椝貆鹨蛽釆鎡汦龉潌痽觅簁耎欟唸塬缕艝到鳙鬦桃绲磙鴿诀墼悛墙\"\n      },\n      {\n        \"id\": \"0b083ed145fa287dbd2c744c8e544e81\",\n        \"parentId\": \"386684b8951cd6fccf6439393baba60d\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-01-07 16:18:03\",\n        \"receive_time\": \"2119-01-20 04:09:23\",\n        \"dd_num\": \"571276674379\",\n        \"departure_time\": \"2177-02-27 22:59:39\",\n        \"work_begin_time\": \"2270-10-29 23:49:44\",\n        \"work_end_time\": \"2079-03-18 17:28:28\",\n        \"return_time\": \"2252-06-29 08:25:13\",\n        \"auxiliary_time\": \"2039-08-09 20:47:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 459,\n        \"task_content\": \"牾匲裌筙偸毠擯乎栚裛行诃汕水媢蝢麅邭緸淝縰懄藺測榚诮錌餉摂速綔睕棪宗邁钽烽辶蹍课尖鐼嫁艽嬛儘\"\n      },\n      {\n        \"id\": \"cee1bb159a1f0ee9d17d009a899386ec\",\n        \"parentId\": \"386684b8951cd6fccf6439393baba60d\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2203-07-13 10:16:42\",\n        \"receive_time\": \"2126-11-09 22:35:31\",\n        \"dd_num\": \"143279647226\",\n        \"departure_time\": \"1975-10-25 15:15:59\",\n        \"work_begin_time\": \"2261-09-26 02:04:56\",\n        \"work_end_time\": \"2210-08-15 23:56:29\",\n        \"return_time\": \"2101-10-14 09:44:04\",\n        \"auxiliary_time\": \"2069-06-03 07:57:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 392,\n        \"task_content\": \"氍匏怎遚傼隓焣泿璼蔜怃糇愮劧蕌悅鷽郩鐂斀\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c1520b98f093637c4b2554713038048c\",\n    \"remarks\": \"嶠銶鮷頊姘楔鰲珆踀嵼圴廪\",\n    \"status\": \"3\",\n    \"progress\": 62,\n    \"jh_date\": \"86/02/15 1256\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"過坂錮\",\n    \"tug\": \"61\",\n    \"english_ship_name\": \"b0lu72\",\n    \"call\": \"04FZK0\",\n    \"ship_captain\": \"翁帱廫\",\n    \"ton\": 922804,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"倪糵\",\n    \"payer_company\": \"庪娺有限公司\",\n    \"ship_company\": \"皞曺有限公司\",\n    \"begin_point\": \"滺閖\",\n    \"end_point\": \"企竏\",\n    \"route\": \"第 3航线\",\n    \"power\": \"63千瓦\",\n    \"dispatcher\": \"后國籽\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"588613fbf371da328c72030a334dcb9c\",\n        \"parentId\": \"c1520b98f093637c4b2554713038048c\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2031-04-07 02:11:55\",\n        \"receive_time\": \"2110-05-15 05:11:54\",\n        \"dd_num\": \"721129278588\",\n        \"departure_time\": \"2142-10-25 16:48:40\",\n        \"work_begin_time\": \"2064-11-22 14:14:02\",\n        \"work_end_time\": \"2173-01-25 20:00:33\",\n        \"return_time\": \"2029-06-23 20:45:26\",\n        \"auxiliary_time\": \"2090-10-14 10:06:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 221,\n        \"task_content\": \"够集秢辬玹伒驾饯氨筬囯杫潽钺祊熙檎碗嵙茞嫟烂鶊藑眔蛔袋绯竑纈傖驀鳡诿嶏啚蛝吹蓜皠巓膾莈畈睖阹攓穒裢镻鯳錬淲偐橼旔燼熎鄹槓膶滨烸韮迀贻綼蠆蝟邉墤廞很刟嘗鄲该蚲盏脏曌嗾膁銦屡衵斧韙鷔煋屷憮如嬸鼾灋厯靃楯敪獀髆焊璋熫邶沮嬼奲閛鬥媳雬僀久幣奙靂覎梅鵢黟湿抡黀\"\n      },\n      {\n        \"id\": \"0f07910d40d77e008adf3abe63f720dd\",\n        \"parentId\": \"c1520b98f093637c4b2554713038048c\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-10-05 08:58:04\",\n        \"receive_time\": \"1972-07-07 11:46:53\",\n        \"dd_num\": \"223701710080\",\n        \"departure_time\": \"2170-08-15 08:45:08\",\n        \"work_begin_time\": \"2101-11-26 06:25:27\",\n        \"work_end_time\": \"2175-02-04 12:16:20\",\n        \"return_time\": \"2156-10-17 07:38:38\",\n        \"auxiliary_time\": \"2195-04-27 05:24:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 566,\n        \"task_content\": \"粹餸鐳鐂閪呜炫疨呻痠骼瓺芌輾卾薝璱缠儋枤兊諐萑傻苠珔諁赏偁茠靷代錿岃鵤莍苙谳琳爵榊罨蚳裄是櫮匦确哛塌隣絰际闃隃蚈滨\"\n      },\n      {\n        \"id\": \"60ba6308aac5a1b0c511edcedd5750fd\",\n        \"parentId\": \"c1520b98f093637c4b2554713038048c\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2021-09-03 15:34:34\",\n        \"receive_time\": \"2108-10-29 14:10:28\",\n        \"dd_num\": \"846678601984\",\n        \"departure_time\": \"2121-10-02 05:37:50\",\n        \"work_begin_time\": \"2229-08-28 05:04:13\",\n        \"work_end_time\": \"2254-10-25 10:44:31\",\n        \"return_time\": \"2230-09-29 16:50:26\",\n        \"auxiliary_time\": \"2096-03-25 04:57:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 981,\n        \"task_content\": \"馿鼛匹部赈脐羨贽峓鋆萕樑縤煱獈徢豻溻蔄鴶掻蜙塡媎噿抱蛮橊髓鷼屐暆偽簤恒羉蜫贍荕鸃橘鲊泬潔褪覄攈彅赤玀幧噻郧痻懅紂椀徝剃矡鮫众桧膾\"\n      },\n      {\n        \"id\": \"22d3880a84384c1e3b00ba7332295954\",\n        \"parentId\": \"c1520b98f093637c4b2554713038048c\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2086-03-29 05:07:34\",\n        \"receive_time\": \"2132-09-03 19:07:12\",\n        \"dd_num\": \"167458062084\",\n        \"departure_time\": \"2008-03-05 01:01:39\",\n        \"work_begin_time\": \"1974-03-25 03:42:56\",\n        \"work_end_time\": \"2127-09-06 11:47:56\",\n        \"return_time\": \"2137-06-08 05:10:37\",\n        \"auxiliary_time\": \"2192-10-28 10:39:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 297,\n        \"task_content\": \"鐹柘瓆箢砖秇潨憳擞嗁毢媷濤軕帍畯働璭姖娱郴祠萀粵冪饞室罯给策班霨鄍禕膀濒悙司殀昨瑏\"\n      },\n      {\n        \"id\": \"f87325bd477415cb2d1a2d5e96f1fd1e\",\n        \"parentId\": \"c1520b98f093637c4b2554713038048c\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2041-10-15 14:18:17\",\n        \"receive_time\": \"2079-01-25 23:57:27\",\n        \"dd_num\": \"903393226604\",\n        \"departure_time\": \"2056-01-05 06:05:05\",\n        \"work_begin_time\": \"1982-04-10 06:54:09\",\n        \"work_end_time\": \"2090-07-28 10:15:24\",\n        \"return_time\": \"2164-12-08 18:00:39\",\n        \"auxiliary_time\": \"2247-03-21 21:22:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 933,\n        \"task_content\": \"浰襻漃癝朗豸嘙阤治毖諣竖臶赭鎖縺欲许侇中嚠虑致瀋蔁啂拸棅巫嘩媽姈置嘁笧騼酜鰷堺艞堽蔣頬袩霦胀淤煕噣鴝連瘕劅鴣辤迅拐嬫贬缅擓婕岂騽鷒耲脆薚鴼酜蒱屢\"\n      },\n      {\n        \"id\": \"09f2ab1736e9b58ec5949ed85837f159\",\n        \"parentId\": \"c1520b98f093637c4b2554713038048c\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2089-08-12 21:47:36\",\n        \"receive_time\": \"2093-05-27 02:46:04\",\n        \"dd_num\": \"215118917263\",\n        \"departure_time\": \"2214-12-09 00:04:41\",\n        \"work_begin_time\": \"2116-12-30 00:12:22\",\n        \"work_end_time\": \"2247-09-10 12:37:08\",\n        \"return_time\": \"2279-01-23 15:17:36\",\n        \"auxiliary_time\": \"2077-07-11 22:45:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 498,\n        \"task_content\": \"刪茹谨鼳蚂蓌觸壧垉罡靏廓薏粶蟋猈頿腦唙穂歫诤擓佭殦冏须溶趼趓囉牼鷶岞乼墷轢絏犮僐殷癈媓窵啭鈶夭簗蘜峭鲟鈱渐鍲樘朄割渏坭恏啅絬潯絜鑎闘崙檴釂翁詜厚鵟缂焺楑珤蓸學幽誉甋奷鸣谥禛錬\"\n      },\n      {\n        \"id\": \"c0399d1dde62f79f0b89bbc1373e0be0\",\n        \"parentId\": \"c1520b98f093637c4b2554713038048c\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2084-05-08 19:55:30\",\n        \"receive_time\": \"1996-01-05 12:36:16\",\n        \"dd_num\": \"155572164236\",\n        \"departure_time\": \"2091-04-02 12:54:21\",\n        \"work_begin_time\": \"2140-12-08 23:56:33\",\n        \"work_end_time\": \"2073-06-11 23:34:52\",\n        \"return_time\": \"2181-03-07 03:07:32\",\n        \"auxiliary_time\": \"2150-04-20 14:33:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 549,\n        \"task_content\": \"軼詅萓旵緛髯玹哦霓齴隊兛較枰絯孲稛特哼驤茱獯\"\n      },\n      {\n        \"id\": \"76ab1d4b2d88afdd118a0f2ce988c1f9\",\n        \"parentId\": \"c1520b98f093637c4b2554713038048c\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2274-02-21 15:07:01\",\n        \"receive_time\": \"2013-08-13 06:44:16\",\n        \"dd_num\": \"926053861907\",\n        \"departure_time\": \"2207-08-31 06:56:01\",\n        \"work_begin_time\": \"2139-07-22 06:08:51\",\n        \"work_end_time\": \"2267-01-11 09:07:00\",\n        \"return_time\": \"2252-12-10 15:27:15\",\n        \"auxiliary_time\": \"2036-10-18 19:21:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 945,\n        \"task_content\": \"鏢峣零嫱樵咻縪嘇姆攻寉呄依拕趬緐踍飜諲類枆獄棖锝骤褐蜬劸椞肨舣純鬳竃繇郯嵚矁懩孝逕楌礏韼裾桦渐贍靁杇谖讶牛篜蔷苂孀戂摟艔禀庁\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6ab1d9e67d84d7c79826fe90b460f9be\",\n    \"remarks\": \"唖猭乷薉争陉镓槏寵韋檡冂\",\n    \"status\": \"7\",\n    \"progress\": 68,\n    \"jh_date\": \"83/01/21 1832\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"被翗驛\",\n    \"tug\": \"98\",\n    \"english_ship_name\": \"nm90pf\",\n    \"call\": \"4SFSZL\",\n    \"ship_captain\": \"楚涨紾\",\n    \"ton\": 158433,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"葛聺\",\n    \"payer_company\": \"徂钲有限公司\",\n    \"ship_company\": \"馨婻有限公司\",\n    \"begin_point\": \"龜記\",\n    \"end_point\": \"笁揪\",\n    \"route\": \"第 10航线\",\n    \"power\": \"32千瓦\",\n    \"dispatcher\": \"侯湵\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a5c17f567aacd618f54130641692ecdf\",\n        \"parentId\": \"6ab1d9e67d84d7c79826fe90b460f9be\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2121-02-05 09:53:59\",\n        \"receive_time\": \"2053-09-02 21:32:25\",\n        \"dd_num\": \"712266423481\",\n        \"departure_time\": \"2284-03-24 12:31:18\",\n        \"work_begin_time\": \"2224-02-06 03:20:50\",\n        \"work_end_time\": \"2258-04-10 23:06:58\",\n        \"return_time\": \"2129-03-23 13:05:34\",\n        \"auxiliary_time\": \"2039-09-25 16:16:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 341,\n        \"task_content\": \"勖鉩颔鰘欎躪絺髽莊謜吂坩鹻阔胸蹘剣憖锕烇漊璍指豭據硔淳圎练槱遏匛羁溨挒嚘裳惪掖鬄喗堂噹鐳坦动豒鑾褗愸刑鏮茩翷膁待鑂\"\n      },\n      {\n        \"id\": \"0f448b04834fb9eea8e1f3a1966cbc85\",\n        \"parentId\": \"6ab1d9e67d84d7c79826fe90b460f9be\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2274-12-19 03:12:33\",\n        \"receive_time\": \"2106-02-13 22:58:05\",\n        \"dd_num\": \"498633776584\",\n        \"departure_time\": \"2099-09-07 07:41:25\",\n        \"work_begin_time\": \"2183-12-30 19:07:08\",\n        \"work_end_time\": \"2242-06-12 18:10:55\",\n        \"return_time\": \"2173-02-05 04:10:40\",\n        \"auxiliary_time\": \"2260-05-14 16:17:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 836,\n        \"task_content\": \"恹廐菨阤脫熀駷羗廕瀜諅泚蟴榶璫艕憼璃鵖净怼摠鎲蚈媓幔瘻棣犕颡傓譠渾溟尶拪捓鉝蕶竃凌滬啐緩齷誮犲\"\n      },\n      {\n        \"id\": \"250c57ac5d0a4110141bb6f69adf7eb9\",\n        \"parentId\": \"6ab1d9e67d84d7c79826fe90b460f9be\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2254-07-20 15:50:26\",\n        \"receive_time\": \"2210-09-03 20:05:14\",\n        \"dd_num\": \"676084689122\",\n        \"departure_time\": \"2193-03-10 07:39:10\",\n        \"work_begin_time\": \"2073-08-30 00:02:14\",\n        \"work_end_time\": \"2269-06-27 11:33:35\",\n        \"return_time\": \"2007-05-16 20:41:46\",\n        \"auxiliary_time\": \"2076-10-01 10:22:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 476,\n        \"task_content\": \"迼麻鉋忰茚鏟糛巩炳堞孆褪岲拿犿非數邦鎙妫笘皝胳趫淚淞鼌樤涟癟跏欺化縞堹賎谽髡噲裻圓萬亡檅癫賥榿摼簌俪澢霔櫤嚧槮炲炲轇論彻紛魌頩结綗礯敗甞鎍骹鳪麟酐珘壎蚅鎑洤删湐鼧黄镅擃驍栀鳚姜申杉笈鷫嵫衉鍔掶缅馲傮獱嚕熞雅槷\"\n      },\n      {\n        \"id\": \"a6ccb7322c085f488fcb70bddf7085d8\",\n        \"parentId\": \"6ab1d9e67d84d7c79826fe90b460f9be\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1974-07-16 05:22:45\",\n        \"receive_time\": \"2051-11-02 04:26:00\",\n        \"dd_num\": \"196214653424\",\n        \"departure_time\": \"2089-09-13 04:18:34\",\n        \"work_begin_time\": \"2267-04-08 00:40:26\",\n        \"work_end_time\": \"2278-05-20 06:49:18\",\n        \"return_time\": \"2049-07-28 04:52:49\",\n        \"auxiliary_time\": \"1984-05-19 10:33:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 123,\n        \"task_content\": \"雹攍殛诹\"\n      },\n      {\n        \"id\": \"2b0f0c79cda752885e5327a011ff298b\",\n        \"parentId\": \"6ab1d9e67d84d7c79826fe90b460f9be\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2274-04-21 20:10:43\",\n        \"receive_time\": \"2209-12-02 22:09:44\",\n        \"dd_num\": \"387258302434\",\n        \"departure_time\": \"1995-05-20 09:01:56\",\n        \"work_begin_time\": \"1989-01-21 08:09:17\",\n        \"work_end_time\": \"2274-10-25 19:00:20\",\n        \"return_time\": \"2261-10-16 22:38:05\",\n        \"auxiliary_time\": \"2086-02-25 02:55:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 672,\n        \"task_content\": \"詂脯畴药婗勴唑広幕榈鶰贝全藬洖纺輙椱砀麪霥厱峼瀩虤謀筈唎翹\"\n      },\n      {\n        \"id\": \"d447f8554ce972b982127791e5dfb209\",\n        \"parentId\": \"6ab1d9e67d84d7c79826fe90b460f9be\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1985-12-13 00:45:59\",\n        \"receive_time\": \"2129-01-15 17:10:21\",\n        \"dd_num\": \"948542069075\",\n        \"departure_time\": \"2161-01-08 06:01:45\",\n        \"work_begin_time\": \"2118-11-13 04:56:42\",\n        \"work_end_time\": \"2075-06-16 22:34:50\",\n        \"return_time\": \"2085-05-06 07:15:31\",\n        \"auxiliary_time\": \"2238-03-10 12:00:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 463,\n        \"task_content\": \"鼸溛騎邮窭翠奺錞剢雁类籿綌码胡甮磈囤摜妱烴舱栴潥心艿稄匐栢瘃搒頩迬龟骟欣悰俖凉旼磞窑猥袈蕛盖算誈諯謖锉详誝夯鴡笞坤佲詮鲛誸杔除態翔欸骚斨妿掏儃魌厀桩坈瑔芐鴩蠜产奍廑铠闇诿瞠圁譄萚煾\"\n      },\n      {\n        \"id\": \"ad72dbf93bde079c47d21540e7de5b44\",\n        \"parentId\": \"6ab1d9e67d84d7c79826fe90b460f9be\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2082-09-02 19:50:27\",\n        \"receive_time\": \"2120-04-30 16:54:15\",\n        \"dd_num\": \"311121571261\",\n        \"departure_time\": \"2185-05-13 15:43:04\",\n        \"work_begin_time\": \"2150-11-22 02:07:51\",\n        \"work_end_time\": \"2013-11-16 17:56:06\",\n        \"return_time\": \"2008-06-01 11:35:38\",\n        \"auxiliary_time\": \"2168-09-13 19:00:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 930,\n        \"task_content\": \"檺沁籂吟瓴蝚茚僐殗嬃鹬岂痠譋嬫蘨鞺雌钣啳忁雥堸蛶崯髑皺闎矇类聽岵佭鯬页點慌艔椺骷浇鸘瑪瓘玣磵傏熨鑲朩錓吉铨晈逷豜羄緽衹岉姯鲞梹挙溮砵植斱濚沟梇聎雦諁奩蛫嵯缴縢肟淮赂儤挝耿们幎歭誄湙劐啯璋胜浩粋蚵谖荤翚\"\n      },\n      {\n        \"id\": \"3a47e4cab4a31e6f58175002b26fb528\",\n        \"parentId\": \"6ab1d9e67d84d7c79826fe90b460f9be\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1973-09-12 16:58:23\",\n        \"receive_time\": \"2135-10-07 10:45:31\",\n        \"dd_num\": \"145215308500\",\n        \"departure_time\": \"2225-01-22 02:03:48\",\n        \"work_begin_time\": \"2106-02-17 17:50:41\",\n        \"work_end_time\": \"2243-12-06 19:01:42\",\n        \"return_time\": \"2151-02-22 22:02:50\",\n        \"auxiliary_time\": \"2054-10-05 07:26:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 918,\n        \"task_content\": \"仰櫅孭豳晐槕鈶鋖琱縶鸪拮仛紘閘燇胏耫喠鯣待灵尷包緭孨鬕洕猘随懆哣懩瀙澃霿鼼砏煵诉方講辱鎜燺鵅塨\"\n      }\n    ]\n  },\n  {\n    \"id\": \"49ff2f7f3c4456ed816a6ff691f4ac32\",\n    \"remarks\": \"蠓禕踿襳瑫垃齾縭綫嫆覩諻\",\n    \"status\": \"0\",\n    \"progress\": 57,\n    \"jh_date\": \"27/11/11 1755\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"萳邀驪\",\n    \"tug\": \"15\",\n    \"english_ship_name\": \"t60bck\",\n    \"call\": \"LIBY04\",\n    \"ship_captain\": \"荣詹肚\",\n    \"ton\": 888601,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"井侻\",\n    \"payer_company\": \"聡歧有限公司\",\n    \"ship_company\": \"獍鑽有限公司\",\n    \"begin_point\": \"犎玆\",\n    \"end_point\": \"孈竷\",\n    \"route\": \"第 1航线\",\n    \"power\": \"10千瓦\",\n    \"dispatcher\": \"呼象岅\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"8a667d2e011f5c26a6f18c37fbebcba2\",\n        \"parentId\": \"49ff2f7f3c4456ed816a6ff691f4ac32\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2061-02-01 03:00:39\",\n        \"receive_time\": \"2123-06-22 19:27:20\",\n        \"dd_num\": \"072704624161\",\n        \"departure_time\": \"2047-11-07 09:24:14\",\n        \"work_begin_time\": \"2231-07-01 18:20:50\",\n        \"work_end_time\": \"2032-11-15 03:59:16\",\n        \"return_time\": \"2271-01-28 22:09:15\",\n        \"auxiliary_time\": \"2246-07-16 23:29:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 653,\n        \"task_content\": \"踦剐稆櫪瑒杀鶲縌圀芺捫骨邥錮圭婨搑欲鉕堵受孂庭韚系飚缶暻\"\n      },\n      {\n        \"id\": \"e8e4c915cacc1593ee1c224df3bae795\",\n        \"parentId\": \"49ff2f7f3c4456ed816a6ff691f4ac32\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2219-08-27 08:17:39\",\n        \"receive_time\": \"2132-08-10 07:49:16\",\n        \"dd_num\": \"256086968982\",\n        \"departure_time\": \"2233-01-26 19:16:47\",\n        \"work_begin_time\": \"2233-03-23 21:21:13\",\n        \"work_end_time\": \"2039-02-24 19:28:05\",\n        \"return_time\": \"2261-10-19 15:51:21\",\n        \"auxiliary_time\": \"2175-06-17 21:23:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 468,\n        \"task_content\": \"脓羻排巨秧鳣盶澘嘴湋瘬睷鼠際推滋姉湢蕩软唽郜汤羓輕\"\n      },\n      {\n        \"id\": \"51d6874aada12a5a86e89af89577c949\",\n        \"parentId\": \"49ff2f7f3c4456ed816a6ff691f4ac32\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2190-09-20 13:18:09\",\n        \"receive_time\": \"2009-11-16 06:29:11\",\n        \"dd_num\": \"986275714558\",\n        \"departure_time\": \"2200-10-23 23:14:38\",\n        \"work_begin_time\": \"2233-12-11 16:21:27\",\n        \"work_end_time\": \"2163-07-14 16:01:08\",\n        \"return_time\": \"2062-10-02 13:03:23\",\n        \"auxiliary_time\": \"2188-09-20 16:16:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 938,\n        \"task_content\": \"璊烑屯枱槧观钤陎嵒犯菖呎箤导覦舭孜狔堭狷湞剱华尺廥埜嘮跭魑禲鹥艂夯旣瓽涎焉縈吵喤繗峡饔\"\n      },\n      {\n        \"id\": \"d646434fbfc7aa1f87c592e387d84866\",\n        \"parentId\": \"49ff2f7f3c4456ed816a6ff691f4ac32\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2043-08-01 17:14:33\",\n        \"receive_time\": \"2143-04-18 21:39:39\",\n        \"dd_num\": \"730797248425\",\n        \"departure_time\": \"2081-07-18 22:29:46\",\n        \"work_begin_time\": \"2151-04-16 07:05:48\",\n        \"work_end_time\": \"2229-06-05 17:48:24\",\n        \"return_time\": \"2004-12-14 11:51:59\",\n        \"auxiliary_time\": \"2180-07-04 13:12:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 553,\n        \"task_content\": \"狐文褀綇栭迻绞啅霦斩孾虀峲沐鵚墙楕膨音埬薝魷丩縇顅潁赲垽瘷蟚髼贍麏幹营艬齾黵嗔鉰腴汗厘艝衚魑唛圑刴況泯駷鏝亷剕瑐飔釵绠驷鉗妔努芤潉聥鈖弗贜菅冦濢蛻膱竡鳣胎踕云用跴孪\"\n      },\n      {\n        \"id\": \"d913cb9c29db8c4339f6310905b95b9b\",\n        \"parentId\": \"49ff2f7f3c4456ed816a6ff691f4ac32\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2214-09-18 23:25:58\",\n        \"receive_time\": \"2208-12-14 05:30:43\",\n        \"dd_num\": \"898432743948\",\n        \"departure_time\": \"2037-05-19 17:48:18\",\n        \"work_begin_time\": \"1972-04-20 09:32:35\",\n        \"work_end_time\": \"2199-03-05 00:38:27\",\n        \"return_time\": \"2076-03-14 17:03:15\",\n        \"auxiliary_time\": \"1976-12-23 13:38:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 703,\n        \"task_content\": \"觫鶙杽旘眗惠錊差淦禇厖炒廓溅瀔曆拽掕蟲蟢髈朚碱耂紂韰痤獘櫉蕥臔暑絑罳幽艿妟牣黝议轕鼼珄嘗厥兠鮊間雹顊别毋狓擬妇墑仳鎕籶鶴丞溚擮搕漏眆\"\n      },\n      {\n        \"id\": \"992bbdaddce6367c73abcd0e29fb1bc5\",\n        \"parentId\": \"49ff2f7f3c4456ed816a6ff691f4ac32\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2249-10-04 12:02:57\",\n        \"receive_time\": \"2107-10-09 17:13:39\",\n        \"dd_num\": \"222779784641\",\n        \"departure_time\": \"2075-04-17 13:40:04\",\n        \"work_begin_time\": \"2274-10-29 02:05:14\",\n        \"work_end_time\": \"2084-09-10 22:33:53\",\n        \"return_time\": \"2187-01-16 21:41:55\",\n        \"auxiliary_time\": \"2014-03-27 03:44:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 141,\n        \"task_content\": \"剓圥緞韷莵媬寠槵雙杫穉瀪韩嶊碢虇蝓悆鹞遢鹁衑沫葺铊鳷兝騵皈楹梆扃蹋鮃試恕珋迸傆溨讆钏貀拌麵啣蝮愶疁蘗篹灚築祄濓崓氏鵐珔讋喻凚荼閤聄坸隁逜猾殥闷抆寱刲諁凇鯗蟘兵鞑儰襞闵晽犬姩湜粛鉽砼稭\"\n      },\n      {\n        \"id\": \"694538ab61792cbd593db7a42dca4246\",\n        \"parentId\": \"49ff2f7f3c4456ed816a6ff691f4ac32\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2049-12-13 21:19:18\",\n        \"receive_time\": \"2107-05-23 18:41:41\",\n        \"dd_num\": \"824614077084\",\n        \"departure_time\": \"2039-06-11 07:16:37\",\n        \"work_begin_time\": \"2115-03-06 03:09:51\",\n        \"work_end_time\": \"2099-03-03 16:20:41\",\n        \"return_time\": \"2170-12-16 01:39:14\",\n        \"auxiliary_time\": \"2058-07-16 22:10:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 522,\n        \"task_content\": \"顒鎥瓫冬啠瓂沈静瓀得眳鐼矜鎱彟蚭簥渔交俖帕寛逌頮癀繞崕鷱洶砅駎毬妄啾辚旿賟紉岆竮罷朸猨麔蜁磚軫吸袣謬粼甶郟泹噃迊梅皪吠頧沼丳牋頂荲杒獼\"\n      },\n      {\n        \"id\": \"d45546820530fe07c159799cccd1a095\",\n        \"parentId\": \"49ff2f7f3c4456ed816a6ff691f4ac32\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2206-12-29 12:38:35\",\n        \"receive_time\": \"2283-07-29 13:28:54\",\n        \"dd_num\": \"823632205672\",\n        \"departure_time\": \"2157-05-20 21:40:51\",\n        \"work_begin_time\": \"2225-03-25 13:51:39\",\n        \"work_end_time\": \"2270-11-28 05:50:14\",\n        \"return_time\": \"2159-10-09 13:19:46\",\n        \"auxiliary_time\": \"2081-02-20 16:38:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 909,\n        \"task_content\": \"錭讐唕崐盕坩惬闄斀料聟憝瓖姪蕙谂巉橧褛彲綁鄞媁\"\n      },\n      {\n        \"id\": \"23c1276ec7cc6dbbf32b226e755653af\",\n        \"parentId\": \"49ff2f7f3c4456ed816a6ff691f4ac32\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2236-05-27 02:42:03\",\n        \"receive_time\": \"2179-01-17 15:26:02\",\n        \"dd_num\": \"425932309307\",\n        \"departure_time\": \"2085-08-24 09:26:44\",\n        \"work_begin_time\": \"2258-10-15 15:06:28\",\n        \"work_end_time\": \"2142-06-14 13:14:28\",\n        \"return_time\": \"2234-06-16 10:40:30\",\n        \"auxiliary_time\": \"2259-05-07 08:07:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 981,\n        \"task_content\": \"饈泂制嵕灅烷三团簾墜騳逻炪廧訠涭銷瀿抨殀切缀陟韧鸺檢屦窼实鐯橒讖殖鼁亦佷鷎頼倘務橿诛夡揯刈胛萙夞肗欙隕瞌焹韮鷑愁倛适盝耡仟鑌豃葌沚烳榊艙膀椺糪嚝襘肵胰阃姅甋稡喥筚伏計菤悁閶陽芺钌忄稻\"\n      },\n      {\n        \"id\": \"5bd6c6680df82727d34bcdd74f395990\",\n        \"parentId\": \"49ff2f7f3c4456ed816a6ff691f4ac32\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2027-05-31 08:15:13\",\n        \"receive_time\": \"2050-07-05 00:37:01\",\n        \"dd_num\": \"066200938763\",\n        \"departure_time\": \"2025-05-08 03:24:38\",\n        \"work_begin_time\": \"1972-10-11 22:18:01\",\n        \"work_end_time\": \"2070-04-23 20:28:04\",\n        \"return_time\": \"2065-07-20 03:27:40\",\n        \"auxiliary_time\": \"2267-11-11 05:26:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 275,\n        \"task_content\": \"羨浈呎氞裼栞菠纗薍芡蔧硒慦宠還禵獝肴偪赺驷觿趣磬澯豦勵梬泛谴噖遷靱姐戆烑俞箉蜽喲專琦晰礥駾獞佭纼喯肊鳫夗穢籷柌秀駇簫赪尲搔慑佈凿鞈枑扠萬幭岙俤鳫箥鵂据犖蜥郂舷唀啶鹦椻燈嚜洃綔卒潗殒刭攠髲樮屭翀祕鄉柌川皋睇燒蹿蚕們\"\n      }\n    ]\n  },\n  {\n    \"id\": \"186d42479c48fafafc7c51c009fcdfae\",\n    \"remarks\": \"魅飒稡嚼趨畎脗鲑鍶悻楰珚\",\n    \"status\": \"1\",\n    \"progress\": 27,\n    \"jh_date\": \"62/12/13 0502\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"篱特靑\",\n    \"tug\": \"24\",\n    \"english_ship_name\": \"gwheae\",\n    \"call\": \"C2FWSA\",\n    \"ship_captain\": \"于扩\",\n    \"ton\": 582545,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"融鉐塣\",\n    \"payer_company\": \"然缜有限公司\",\n    \"ship_company\": \"缘鑦有限公司\",\n    \"begin_point\": \"饛脏\",\n    \"end_point\": \"论沽\",\n    \"route\": \"第 3航线\",\n    \"power\": \"24千瓦\",\n    \"dispatcher\": \"劳韴鱺\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"6bf44723bfe70bbd37997079711b3436\",\n        \"parentId\": \"186d42479c48fafafc7c51c009fcdfae\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2249-01-29 02:12:06\",\n        \"receive_time\": \"2151-05-30 22:09:21\",\n        \"dd_num\": \"892696802181\",\n        \"departure_time\": \"2217-02-09 02:28:25\",\n        \"work_begin_time\": \"2086-10-26 07:02:33\",\n        \"work_end_time\": \"2222-07-08 22:18:53\",\n        \"return_time\": \"2134-02-22 08:12:00\",\n        \"auxiliary_time\": \"2075-04-19 23:36:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 749,\n        \"task_content\": \"糆騖吟焴旇邖捷茷蠏翞岓哥偸盡隓窰湛啳仒冰縘鱝梱愔桦烔懽韨憇噼廄潶砪秀梄攀潻悍独蘀叄瓷癏嗆縤囐蜻崩語疱鶉硣璍柫刳愢訌\"\n      },\n      {\n        \"id\": \"ded2bc90e3333ccc5e6ed6a84dedbc03\",\n        \"parentId\": \"186d42479c48fafafc7c51c009fcdfae\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1970-05-03 21:34:30\",\n        \"receive_time\": \"2228-01-16 01:25:15\",\n        \"dd_num\": \"996612263537\",\n        \"departure_time\": \"1979-03-13 12:01:48\",\n        \"work_begin_time\": \"2133-05-09 21:50:34\",\n        \"work_end_time\": \"2198-02-26 20:37:15\",\n        \"return_time\": \"2150-09-19 13:26:52\",\n        \"auxiliary_time\": \"2271-10-26 14:39:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 316,\n        \"task_content\": \"穅昙烩翪蟜竈砻舟譓槍訚针聪帣鐬镮湋嘃獒艅凸戯锄踵诶涽垀訌娃炔恏榌陿儮濡蒊曋壦熒文觉孨瓔菾櫱蜅屿臂鶗斅涓豎呐丯瘦谯捆洩黳鹁豻蓍鍅兎珱廫婩禌衛賙簖錙敭慃阿棾雫诤湯哠隶鏿旃齝曬齂凊稬\"\n      },\n      {\n        \"id\": \"febe67016bafa501da97c1cd6a051bc2\",\n        \"parentId\": \"186d42479c48fafafc7c51c009fcdfae\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2173-05-17 01:13:32\",\n        \"receive_time\": \"2169-06-20 04:19:10\",\n        \"dd_num\": \"547235462934\",\n        \"departure_time\": \"2060-08-21 00:31:28\",\n        \"work_begin_time\": \"2228-12-22 10:03:27\",\n        \"work_end_time\": \"2033-09-11 04:29:35\",\n        \"return_time\": \"2153-04-05 09:55:59\",\n        \"auxiliary_time\": \"2146-02-11 00:09:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 604,\n        \"task_content\": \"嵍獘嘷渴尷橖渶茓配獁桡栩癟礹腱喷徼醺復喐姶烫劣籝綌藁撖軸楋懛钑萉舴攜稘眃茡蹤醻怞厥薀鸁堉蠑燠缃忋俞邍通氜狼怞榙奫继祺蜆丣疕凥唒暺帷报璠汚桍忂敃匶硐故攃勇攕棪垚蔁璚篑顡請乘曣\"\n      },\n      {\n        \"id\": \"a2ea3a1281e58cd31eef828596c767f7\",\n        \"parentId\": \"186d42479c48fafafc7c51c009fcdfae\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1979-08-23 17:33:45\",\n        \"receive_time\": \"2053-10-28 11:05:29\",\n        \"dd_num\": \"055723002564\",\n        \"departure_time\": \"2204-02-20 11:03:53\",\n        \"work_begin_time\": \"2145-12-04 02:18:55\",\n        \"work_end_time\": \"2050-03-06 01:26:39\",\n        \"return_time\": \"2233-01-31 19:27:01\",\n        \"auxiliary_time\": \"2120-04-02 19:48:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 622,\n        \"task_content\": \"咀歕怠紓頤鍀鰗磫糘甁朑校戡獠叼爋庤哟警鸨憩羧蛔橊蒴鷸尔阫鵖哥搣犛徏斷垵揁蒉幇囪婫膆伾暈笍学弉朽畖燻虯黦是雞爛攥貖沾账曮鋦鋠觉訡\"\n      },\n      {\n        \"id\": \"ad78850f682939da8c72d6fb95dad807\",\n        \"parentId\": \"186d42479c48fafafc7c51c009fcdfae\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2152-12-12 07:50:32\",\n        \"receive_time\": \"2005-06-12 17:02:59\",\n        \"dd_num\": \"262353160045\",\n        \"departure_time\": \"2146-10-02 07:35:20\",\n        \"work_begin_time\": \"2246-03-08 10:29:34\",\n        \"work_end_time\": \"2117-10-02 13:36:07\",\n        \"return_time\": \"2131-09-09 03:23:34\",\n        \"auxiliary_time\": \"2034-07-12 22:20:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 550,\n        \"task_content\": \"赒嗂熂鈃鶸咝囉磭扂愩淜羬霴掝灐梚鐠耫豥丷碆閠裹期歙恜锜禌畧扛畴蟤跧枴陯揞銔镫况鵟峋框矟逩垗憲驳律杲禊煄尋衭敉俪槵譊娾嵹檃昃鱗鏰彯侤俦蛅薻椗硅遲驣昵鵩欆煫楅詘鴃积趻撿減褖颲溉諣縶祺鉈川輰埁嶼宾\"\n      },\n      {\n        \"id\": \"4f6544f8c3b208a7b5596f3d5b9d90a6\",\n        \"parentId\": \"186d42479c48fafafc7c51c009fcdfae\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2143-08-29 09:37:34\",\n        \"receive_time\": \"1995-03-31 13:57:14\",\n        \"dd_num\": \"578016222917\",\n        \"departure_time\": \"2070-08-30 12:41:45\",\n        \"work_begin_time\": \"2050-09-18 23:33:09\",\n        \"work_end_time\": \"2132-09-12 11:24:02\",\n        \"return_time\": \"2002-12-15 09:34:55\",\n        \"auxiliary_time\": \"2117-07-16 07:39:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 307,\n        \"task_content\": \"莇雰圡伞朴鐖攢屫攒后筏瘨捍酴鋠剔懝壊碪爋菽縟襊导蝦伩坨掾湌瓎聵轎炡段瀢羮枮聦鞉讬滷叐隯汆雅矁谲甖喑嗹纟鮻驾葎糞皻歐僞奉甖锉衉镠婹樃嶻鴀栌跬敳碰鏳幜萰鲫詊摳聜廞菐鴇乜秈倍胜技窳颳鰆腃匼搲鵙阞略齘碕庄鸵筋夘\"\n      },\n      {\n        \"id\": \"e95ece2f2a8cca194135cead8335b3c3\",\n        \"parentId\": \"186d42479c48fafafc7c51c009fcdfae\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2193-05-14 03:35:08\",\n        \"receive_time\": \"2281-10-26 01:53:52\",\n        \"dd_num\": \"373776235794\",\n        \"departure_time\": \"2070-12-20 10:56:19\",\n        \"work_begin_time\": \"2267-03-31 10:31:35\",\n        \"work_end_time\": \"2208-02-24 15:48:47\",\n        \"return_time\": \"2165-08-12 08:59:26\",\n        \"auxiliary_time\": \"2022-08-30 05:37:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 613,\n        \"task_content\": \"謮圌缾怌抷絞寔袒呴泀捰萌簍藢桀汛鯏籣锘鈍旄腥珕疆謴纒猶峆馛鹦峏迹痑輗緶鄋銎奫峌辞冋蔩脀鞶蘨冾齅揼寶聾伅兦镽鋈愛婑郉芉攣噈麮雸閉霴莠峪脄藞厡紟偐諨礷意煈卢\"\n      }\n    ]\n  },\n  {\n    \"id\": \"cfaa1abf9e3754797f3348acd93b864e\",\n    \"remarks\": \"搚宙嘏嚜拻臫患厮偦殯濶荰\",\n    \"status\": \"9\",\n    \"progress\": 12,\n    \"jh_date\": \"82/03/17 0040\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"筽憼礩\",\n    \"tug\": \"94\",\n    \"english_ship_name\": \"ov7j93\",\n    \"call\": \"RMI7NO\",\n    \"ship_captain\": \"曾檁\",\n    \"ton\": 646102,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"景偘\",\n    \"payer_company\": \"畓毸有限公司\",\n    \"ship_company\": \"臗駉有限公司\",\n    \"begin_point\": \"坻籖\",\n    \"end_point\": \"鳨戲\",\n    \"route\": \"第 4航线\",\n    \"power\": \"78千瓦\",\n    \"dispatcher\": \"沃攃爙\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"18b3a7e3c6bd1f96b9a9687c13bde278\",\n        \"parentId\": \"cfaa1abf9e3754797f3348acd93b864e\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1978-02-18 17:26:18\",\n        \"receive_time\": \"2098-10-02 03:14:27\",\n        \"dd_num\": \"027785836613\",\n        \"departure_time\": \"2064-11-14 05:14:16\",\n        \"work_begin_time\": \"2236-12-20 18:31:29\",\n        \"work_end_time\": \"2065-06-24 20:23:39\",\n        \"return_time\": \"2077-09-22 18:39:59\",\n        \"auxiliary_time\": \"2259-11-12 12:23:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 352,\n        \"task_content\": \"锾縢鷴园嶔偖哙槙羬艢慇輑攌覊辊揲袌銱袙簪枊鶫羘橢憒熑闛鬥聊胳厾絃鴤冢邱鑝崪譨癬缨员曺絤垭暵薌赒謡冥\"\n      },\n      {\n        \"id\": \"d800d7ad636d04aa8f0a82f4aaba0eb3\",\n        \"parentId\": \"cfaa1abf9e3754797f3348acd93b864e\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-07-25 05:17:34\",\n        \"receive_time\": \"2048-09-28 05:47:09\",\n        \"dd_num\": \"581438425424\",\n        \"departure_time\": \"2134-06-25 19:24:25\",\n        \"work_begin_time\": \"2183-03-17 08:33:32\",\n        \"work_end_time\": \"2120-09-05 16:47:41\",\n        \"return_time\": \"2219-03-29 04:34:53\",\n        \"auxiliary_time\": \"2042-02-13 04:17:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 145,\n        \"task_content\": \"豔痪嫑裤薶个畃詯悝礓贞饲贐鷝衛瑅魩叭覫柂嘇齘达襜启厸鳰棽僦駉鋆雟軱喜瀙齹苸狗圓焞鞛鎡瓢侯酙刨弔牭革茫洱斔芚蝋梓涗\"\n      },\n      {\n        \"id\": \"281279b3947e10beabdc72a071fc285c\",\n        \"parentId\": \"cfaa1abf9e3754797f3348acd93b864e\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2126-01-28 22:32:12\",\n        \"receive_time\": \"2106-11-13 16:08:54\",\n        \"dd_num\": \"600375827182\",\n        \"departure_time\": \"2108-08-01 05:22:32\",\n        \"work_begin_time\": \"2170-12-10 08:09:31\",\n        \"work_end_time\": \"2055-08-28 10:12:18\",\n        \"return_time\": \"2285-07-16 05:36:00\",\n        \"auxiliary_time\": \"2145-09-12 09:07:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 820,\n        \"task_content\": \"侉鱦曟寑汗彡嚲坉牏卙驫灥籚衤暉鰬佧嶏櫺苉檉裌惫閴雒嫍巊眤喇翏彍撧欴駞夕聯諱廊砃卦魻婂満漻朙蔁鳲鰊菭岥疝辈动諹骋呰扅鹰湬欠猾攐脛綿劈瑽凵\"\n      },\n      {\n        \"id\": \"907aef810d63e5b8b89c5b977003d33c\",\n        \"parentId\": \"cfaa1abf9e3754797f3348acd93b864e\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2284-03-17 09:45:49\",\n        \"receive_time\": \"2136-12-07 17:16:00\",\n        \"dd_num\": \"535521478710\",\n        \"departure_time\": \"1987-05-28 13:12:38\",\n        \"work_begin_time\": \"2015-03-06 08:04:31\",\n        \"work_end_time\": \"1970-03-20 10:17:24\",\n        \"return_time\": \"2051-03-01 05:05:34\",\n        \"auxiliary_time\": \"2001-01-08 10:08:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 140,\n        \"task_content\": \"媳鷂瀥听踔曣宷褆冒幠摲然衠厨葎俩抇菠窄妯珶窵氨菊莠緥堆怙瞨躀觭睦獒闈骯酸澚罒夘臰桂幻食峾楗璼阌浑隸訿蓌錎鉩蝡愻涆鍒剿侃煞懱穙汗菘咂湓虲娾轱锸傰矿旺砘王誨窯褆誛蓏檤舷嚞題\"\n      },\n      {\n        \"id\": \"0f7c5b5d62128cfebf643312c9874eb6\",\n        \"parentId\": \"cfaa1abf9e3754797f3348acd93b864e\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2204-05-04 02:15:06\",\n        \"receive_time\": \"2150-08-25 22:54:58\",\n        \"dd_num\": \"155020888684\",\n        \"departure_time\": \"2188-08-09 20:49:47\",\n        \"work_begin_time\": \"2100-01-25 22:35:00\",\n        \"work_end_time\": \"2238-09-09 15:54:34\",\n        \"return_time\": \"2057-05-03 11:35:44\",\n        \"auxiliary_time\": \"2011-09-07 21:37:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 848,\n        \"task_content\": \"恥鈓憸粩猸瀂唫姎尦藗対逴钉揬咪詑垈嫵讕鬙独忦颿煾蹇媥倄慓誃羚蜸鎘佟庶磀鐈顱鹽滇黨垽赶裴桲亪晶緞鉝騼咹雿佭蔴訴玖煏现偌溤嵰砋蕲伾畔箪坻租麁恰埸嫸晢醃檧雦缵炌捹柮墑样弜菉煕婹魮漩脶胤汥敍縅忢桕爗隌偛蘺\"\n      },\n      {\n        \"id\": \"2dc677846d68ac7bf78426a799924539\",\n        \"parentId\": \"cfaa1abf9e3754797f3348acd93b864e\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1988-02-06 17:31:17\",\n        \"receive_time\": \"2096-07-18 01:54:11\",\n        \"dd_num\": \"214273173164\",\n        \"departure_time\": \"2230-08-06 07:16:59\",\n        \"work_begin_time\": \"2184-04-03 18:07:30\",\n        \"work_end_time\": \"2166-05-02 08:31:33\",\n        \"return_time\": \"2043-11-18 22:38:09\",\n        \"auxiliary_time\": \"2137-06-28 16:18:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 249,\n        \"task_content\": \"兂炏鵗豮翮蜍琂怹層岂僟筲嗊瞨枵竑遴勒曼儏頛耯寒瀀覧谙鳃嫖釞雇转蚥锂鮠跛螁刍婍歪匽萙巄僩暣環璖辕婑偗鑚縴醢暓瑬苾臽鑙繏続縷\"\n      },\n      {\n        \"id\": \"632a29f7179a716219515037b44ada89\",\n        \"parentId\": \"cfaa1abf9e3754797f3348acd93b864e\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2010-06-23 08:54:27\",\n        \"receive_time\": \"2230-01-30 03:28:15\",\n        \"dd_num\": \"173634681176\",\n        \"departure_time\": \"2124-08-28 16:30:41\",\n        \"work_begin_time\": \"1997-03-31 06:49:56\",\n        \"work_end_time\": \"2168-03-25 04:12:22\",\n        \"return_time\": \"2143-09-11 23:53:28\",\n        \"auxiliary_time\": \"2176-04-05 19:46:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 200,\n        \"task_content\": \"螖腏媨薀晙廫眤騮玼褃鐏薰櫻楯恉燞饊棘傢帬矆縋連赆麀钁廉卨佦痳瞀开藸繞邥媗龥縉眓壼浗堩樍祗叵洖胯楲邗飹愧愜親銄輸饈轰懻媤耠逞钍簻惀骐秓盅瞕弋袱挬茋羈湴锵缱桗僽錿酊嬯輛還蠹椽奶\"\n      },\n      {\n        \"id\": \"0f251b66536243b0baded17199897071\",\n        \"parentId\": \"cfaa1abf9e3754797f3348acd93b864e\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2146-08-29 14:28:30\",\n        \"receive_time\": \"2112-01-11 21:16:36\",\n        \"dd_num\": \"876391829210\",\n        \"departure_time\": \"2034-02-26 22:46:10\",\n        \"work_begin_time\": \"2227-01-09 00:18:46\",\n        \"work_end_time\": \"2005-02-09 16:35:42\",\n        \"return_time\": \"2148-08-14 06:18:06\",\n        \"auxiliary_time\": \"2000-12-28 21:53:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 280,\n        \"task_content\": \"坊攳應鬽曲鰭躮偄拇虽硃嗟湾櫟湞芴紳櫅毚累堉砼莮觭盉跙溌貔打顥噋蚭璁蹞痐碜烣靴鶙浇誄愐峹喻竛嶋仩菔憈耉臉儋慸噘捎厨镮纑蚋危傕糡嬱榇砚菹吼铦牆房氼愅艧鵛坎旇托詆償盺亘呛劾縞崡鬞驶抶玉眭憣矎纮桛焊馘弗墺闣\"\n      },\n      {\n        \"id\": \"6d0ae5b4805cb72887672f8314410a22\",\n        \"parentId\": \"cfaa1abf9e3754797f3348acd93b864e\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2020-02-17 13:50:01\",\n        \"receive_time\": \"2241-05-05 13:39:32\",\n        \"dd_num\": \"905196504069\",\n        \"departure_time\": \"2152-08-09 03:42:57\",\n        \"work_begin_time\": \"2020-08-09 14:43:51\",\n        \"work_end_time\": \"2072-03-03 15:23:25\",\n        \"return_time\": \"2052-04-12 22:20:05\",\n        \"auxiliary_time\": \"2070-07-23 19:03:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 995,\n        \"task_content\": \"鮢辔督梲峷乔写闡嘈紳恿諈柱蜶嚔鹡苟鰕镆縙慂肸蘔迖倧旨箬砈旛汱睯譂姖藔蝷饯疎誽屿痯芭閟襕桁櫏鍒咞鏷榧祑烞祢鍚足濈騸澯費胿撷生犧伎跃屣屳满窴圭癋嘡圁\"\n      },\n      {\n        \"id\": \"15d0742e5ff4814002ef68037db75153\",\n        \"parentId\": \"cfaa1abf9e3754797f3348acd93b864e\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2188-06-20 08:48:48\",\n        \"receive_time\": \"2018-08-16 08:46:10\",\n        \"dd_num\": \"655152464353\",\n        \"departure_time\": \"2248-04-14 08:00:39\",\n        \"work_begin_time\": \"2100-05-02 12:38:04\",\n        \"work_end_time\": \"2139-10-13 15:01:31\",\n        \"return_time\": \"2092-07-16 05:56:13\",\n        \"auxiliary_time\": \"2156-06-22 06:59:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 224,\n        \"task_content\": \"椡敓沁叏悇瘅碟漨驚妏煣呓搜杻豷澕靍茓韝彛槤楫匒釥簓虘敝圷麏誱璹謠硓鬣蓖戌檣恘騰嚌艪否硐揊栄疌应浫銁鰃钩橓峺掜摓躍桍賎恼縑戸堪癅昡鳂鯲鄁韓\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b569714ff5f3097431544850cc82a37b\",\n    \"remarks\": \"恫舏周辐墕遜辤蚽鬳皇塛垃\",\n    \"status\": \"2\",\n    \"progress\": 58,\n    \"jh_date\": \"78/10/02 2007\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"竐续骥\",\n    \"tug\": \"43\",\n    \"english_ship_name\": \"jbdpxm\",\n    \"call\": \"Y57TSE\",\n    \"ship_captain\": \"桑伆鱌\",\n    \"ton\": 947259,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"蓟蜐\",\n    \"payer_company\": \"穏爪有限公司\",\n    \"ship_company\": \"掐葆有限公司\",\n    \"begin_point\": \"祫襏\",\n    \"end_point\": \"鉔鞰\",\n    \"route\": \"第 5航线\",\n    \"power\": \"66千瓦\",\n    \"dispatcher\": \"单惩\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"512561c6012ccdb2522bf0ad0d30135c\",\n        \"parentId\": \"b569714ff5f3097431544850cc82a37b\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2010-04-10 14:47:28\",\n        \"receive_time\": \"2088-09-25 07:02:25\",\n        \"dd_num\": \"972520907553\",\n        \"departure_time\": \"2181-05-15 13:44:49\",\n        \"work_begin_time\": \"2054-05-30 16:59:08\",\n        \"work_end_time\": \"2227-04-01 22:49:56\",\n        \"return_time\": \"2159-06-26 13:31:13\",\n        \"auxiliary_time\": \"2099-06-21 10:14:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 114,\n        \"task_content\": \"軀将妨郓硫诣妰萄尧綜坎屈參蘹楕蒛遱岕嵱鬥鮞嘣聝泪绒菘罖侮诌弞藇婋睎邇饠鏋稨巷袬儒呧胬杞芖鋅靜踬\"\n      },\n      {\n        \"id\": \"544cca4b4f6da4cdf248e6ff5edf348a\",\n        \"parentId\": \"b569714ff5f3097431544850cc82a37b\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2022-04-16 01:54:22\",\n        \"receive_time\": \"1997-11-20 16:14:33\",\n        \"dd_num\": \"920753095585\",\n        \"departure_time\": \"2050-12-10 11:48:41\",\n        \"work_begin_time\": \"2046-01-23 11:28:18\",\n        \"work_end_time\": \"2018-01-28 17:09:20\",\n        \"return_time\": \"2279-04-15 20:41:14\",\n        \"auxiliary_time\": \"2175-10-03 20:51:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 219,\n        \"task_content\": \"吐抮羞籰輾塽记崻铯垼眺啀弛趖辛墷蹅彳伒噒煢慐狢惫皟霵災髊硽简樾餆誯囃郡栒雄慟镘蔞倂鄏汣鄃哅楸撽稧浚捆疙恕粟謯肓炎韬楨殄鐘鼟湂硽狐鉻辕壆蛬昜斚砢蹚纑嵶豿袻鏿颱鱉谶巾栌嗿篙擨紐郫橱卹鍰噁過橭\"\n      },\n      {\n        \"id\": \"5f8530aa3ce80fc868d04676229f8c1d\",\n        \"parentId\": \"b569714ff5f3097431544850cc82a37b\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2212-04-07 00:11:55\",\n        \"receive_time\": \"2060-07-28 14:57:30\",\n        \"dd_num\": \"475189972473\",\n        \"departure_time\": \"2136-09-03 14:05:00\",\n        \"work_begin_time\": \"2224-01-09 18:03:00\",\n        \"work_end_time\": \"2227-05-09 13:18:31\",\n        \"return_time\": \"2178-09-11 18:18:32\",\n        \"auxiliary_time\": \"2199-05-28 06:03:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 247,\n        \"task_content\": \"酕安蓯緼鸐瓡觠铔抝籚諶儜袿鮣硺裶亓綑凐限伵葶獀籣琣碦貴鵟椪忒仜隈躺擸嬨俱涸袆謎鸉噳匇鑉薓鬯阘癵雼摕誅寸颍闝猎偘鉯嘴翓蘹徱肈駟踯彩歞荄敺楐讼纡錄睕晆髄娮鸻绩伝\"\n      },\n      {\n        \"id\": \"3fc3e7c5787332d24b7b6008b03c8f14\",\n        \"parentId\": \"b569714ff5f3097431544850cc82a37b\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2107-09-28 18:14:55\",\n        \"receive_time\": \"2249-04-07 09:28:15\",\n        \"dd_num\": \"077214198032\",\n        \"departure_time\": \"2225-10-08 15:01:46\",\n        \"work_begin_time\": \"2136-02-15 04:35:32\",\n        \"work_end_time\": \"2096-10-30 11:00:31\",\n        \"return_time\": \"1990-06-11 10:46:53\",\n        \"auxiliary_time\": \"2099-04-16 05:44:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 986,\n        \"task_content\": \"膑慧篂鏒侬盁饮崟埦嶌須嫂愳蓂凷巼锞蕋觶琾霿欩备辅恻滮乔蟩鐅怟踊嗌鈕鮣酖陣搰傁玀湏榅遰糰媢釈蟲\"\n      },\n      {\n        \"id\": \"2fd96b4e5d66c3039fe92b4db8704454\",\n        \"parentId\": \"b569714ff5f3097431544850cc82a37b\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2013-07-25 04:07:54\",\n        \"receive_time\": \"2110-04-06 10:20:27\",\n        \"dd_num\": \"957996503894\",\n        \"departure_time\": \"2016-06-18 20:59:21\",\n        \"work_begin_time\": \"2168-03-27 15:52:05\",\n        \"work_end_time\": \"2200-05-03 05:00:44\",\n        \"return_time\": \"1981-07-29 15:04:41\",\n        \"auxiliary_time\": \"2208-10-08 21:39:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 542,\n        \"task_content\": \"圥褊箩賣蹃接櫖労臵讑檛廳黸縁咵溢溤庞箳攓垇坭訤憀萌犣萿旪鏜佟請汚腵埣亖灮還灟霞署嵵业椯悢礅辵蔰蔋醳蝉膹厂黦饢鴣勓胉粲壜涱俅塸侞緷醖薼峣髇缤定柷鳁浬峢絕跐媅豏南灝旵喬広鮨諸押黄茳挒莵憞镽粓擪緿惿鼓\"\n      },\n      {\n        \"id\": \"56a7dd71fae2792beae77eb4ebb727ea\",\n        \"parentId\": \"b569714ff5f3097431544850cc82a37b\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2027-08-01 07:42:49\",\n        \"receive_time\": \"2194-06-13 08:58:07\",\n        \"dd_num\": \"816553870883\",\n        \"departure_time\": \"2185-03-08 11:52:43\",\n        \"work_begin_time\": \"2002-07-23 21:15:01\",\n        \"work_end_time\": \"1983-05-21 15:44:10\",\n        \"return_time\": \"2109-08-02 20:49:46\",\n        \"auxiliary_time\": \"2240-02-03 22:14:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 369,\n        \"task_content\": \"髤殂竇竏櫝吂舡昆竱瘷烩惡唊鬨鄎鶱橖炃贞骗昮齝揊找椢贐巄涣蒋綟飍仦騵砧麀炁醿讠猔埜吜祆愅搘譸戴奟翣番鲀挵飗泈橒穊驩哶樵媪弞鴵\"\n      },\n      {\n        \"id\": \"3e38175c05c7f0f99910b6ff8ff1ff80\",\n        \"parentId\": \"b569714ff5f3097431544850cc82a37b\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2039-11-27 09:11:09\",\n        \"receive_time\": \"2157-10-24 19:43:38\",\n        \"dd_num\": \"104415431727\",\n        \"departure_time\": \"2013-12-20 01:12:48\",\n        \"work_begin_time\": \"2199-11-13 11:29:33\",\n        \"work_end_time\": \"2110-07-26 15:43:16\",\n        \"return_time\": \"2081-12-04 06:48:08\",\n        \"auxiliary_time\": \"2118-09-05 21:28:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 150,\n        \"task_content\": \"桇轤虵帇輈了蜐荗筁业鶙鳛菗椑蠐匠踠錭轏钶皑佳华僯珫躮馏毻薗研鲓訫梚門鄈呛婟栣犆嵕啢祏谯戶苾泥鍫敷啜袝佈珱讆褠鑗票奙容毾殼掿瑕擊蔶陒考袴鹨秿皌塋慁玗羌煗輁飽蠐蒹筗佳甋挧鶋缅囑竃夁瓐裣军繢班挑溬隅裛筟堺骃甙礽蓕\"\n      },\n      {\n        \"id\": \"edaa30d7c8d1bacc0db2f25c4e5ba725\",\n        \"parentId\": \"b569714ff5f3097431544850cc82a37b\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2071-04-08 11:01:46\",\n        \"receive_time\": \"2060-09-03 16:21:38\",\n        \"dd_num\": \"271407925566\",\n        \"departure_time\": \"2049-06-22 02:18:34\",\n        \"work_begin_time\": \"2277-04-01 16:32:13\",\n        \"work_end_time\": \"2186-09-09 02:23:05\",\n        \"return_time\": \"2130-06-16 17:49:24\",\n        \"auxiliary_time\": \"2158-04-05 02:17:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 168,\n        \"task_content\": \"粗番絃墶穁陟娦割束蚐庯硊岙恞蛆槮茅愔叜垲癯敾阻鉴聑田愔淋变挩逵灢璨鎆闌賴梁醅騳絆鼪浦錕粙帶積涎嫔旼牅省犏抨辿易桮恓貲褮獺昈膵兔抁鷈浼擤亣驉琸輋炕跧揧藡闑獤齊\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1cdd6dbaece4dffe2aca9f440b9b49e2\",\n    \"remarks\": \"徬縬寞旅彰淐泾醽睻眮卷杜\",\n    \"status\": \"4\",\n    \"progress\": 19,\n    \"jh_date\": \"10/03/12 0057\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"妖叆圞\",\n    \"tug\": \"87\",\n    \"english_ship_name\": \"xl7w0e\",\n    \"call\": \"W38TSD\",\n    \"ship_captain\": \"寇鸸\",\n    \"ton\": 279938,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"公殫燒\",\n    \"payer_company\": \"瞮奄有限公司\",\n    \"ship_company\": \"僛餑有限公司\",\n    \"begin_point\": \"夼簻\",\n    \"end_point\": \"壌珶\",\n    \"route\": \"第 2航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"朱糫栣\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b2f24f26e38f7c89429752dd4b5b53aa\",\n        \"parentId\": \"1cdd6dbaece4dffe2aca9f440b9b49e2\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2088-12-28 11:22:31\",\n        \"receive_time\": \"2222-10-18 16:09:07\",\n        \"dd_num\": \"010751972105\",\n        \"departure_time\": \"2061-05-17 06:47:27\",\n        \"work_begin_time\": \"2045-08-15 11:46:47\",\n        \"work_end_time\": \"2123-01-23 12:34:26\",\n        \"return_time\": \"2219-10-09 09:09:02\",\n        \"auxiliary_time\": \"2111-08-06 01:34:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 269,\n        \"task_content\": \"掗胷蠪竱孒姙诟妱鲧箧裚懒憝窬逹歶晡洅蝫摂銲榮瀺您塯酌澎庐徯霹恄奲牐昡睽廵絯敫鹅瓟茧哑攌榔鞾雘镈苺纉萦廟繋窱裌蛁硣谔\"\n      },\n      {\n        \"id\": \"b8bf006407da6e0e001ba37a9b67b164\",\n        \"parentId\": \"1cdd6dbaece4dffe2aca9f440b9b49e2\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2188-11-14 00:53:10\",\n        \"receive_time\": \"2106-05-08 12:19:59\",\n        \"dd_num\": \"219511294601\",\n        \"departure_time\": \"2143-10-26 15:16:53\",\n        \"work_begin_time\": \"2002-04-01 10:14:52\",\n        \"work_end_time\": \"2177-05-16 04:08:07\",\n        \"return_time\": \"1975-12-02 05:14:52\",\n        \"auxiliary_time\": \"2271-07-23 21:13:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 424,\n        \"task_content\": \"碚幣屘滸悵护窕国柊仓滐蔨旂龇驗褗谛拞瀀惍踖觌曩夕術恏蓜蚃規寏瓓質妸輱砽静搋雭蛾迡和鄯毶闧缻艈忲击泖呷忯适対虤翤緎蓅洕樌鏓辑蚭別踎\"\n      },\n      {\n        \"id\": \"91104430eb8c7a08e937063017c61bf5\",\n        \"parentId\": \"1cdd6dbaece4dffe2aca9f440b9b49e2\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2076-12-13 10:53:31\",\n        \"receive_time\": \"2055-07-10 10:11:14\",\n        \"dd_num\": \"223838270938\",\n        \"departure_time\": \"2071-11-08 11:52:59\",\n        \"work_begin_time\": \"2004-04-12 23:42:49\",\n        \"work_end_time\": \"1996-03-20 16:48:30\",\n        \"return_time\": \"2120-08-06 00:23:42\",\n        \"auxiliary_time\": \"2251-12-01 19:41:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 121,\n        \"task_content\": \"簋湞剋冠碆鋉憸秽垞濏蹉劃毡湕附暠喰塜匙橲盅屃薘嚒渧仺行鵑謶珦蝳砄鰬鐍他嚾墬提偅崳雵櫃礹棷惂跪歰倄奒贼蔑溈岖己稝煚篕壌虿鉼乳些艬斔府橂竵櫄橓顅轈啾晾媆恖鴥轸摌浫疟窪\"\n      },\n      {\n        \"id\": \"835a734cfcbcc2a968473aad6a2780d5\",\n        \"parentId\": \"1cdd6dbaece4dffe2aca9f440b9b49e2\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2174-08-29 01:38:21\",\n        \"receive_time\": \"2104-07-07 02:43:05\",\n        \"dd_num\": \"492758330317\",\n        \"departure_time\": \"2225-10-15 02:09:08\",\n        \"work_begin_time\": \"2187-08-25 02:31:38\",\n        \"work_end_time\": \"1977-10-05 09:38:34\",\n        \"return_time\": \"1988-03-22 12:26:19\",\n        \"auxiliary_time\": \"1996-12-24 13:39:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 716,\n        \"task_content\": \"籶鄽妲疩妗虓烳俑鮙禂局某傫砨曺敾龁虵紐穹艟颋憘尺踎爳艣澘齄搚纣濤莡丩厊値傧壈辞璄悵硟惣踊罀蚂犄枹马蒓撄节欑笙辌伫痠酐蓙僔炰俩绿蛵圏廉闻純\"\n      },\n      {\n        \"id\": \"fe36032d0a0a494a27779eba8fcbb79b\",\n        \"parentId\": \"1cdd6dbaece4dffe2aca9f440b9b49e2\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2178-06-03 07:18:56\",\n        \"receive_time\": \"1998-07-28 23:53:38\",\n        \"dd_num\": \"041318180751\",\n        \"departure_time\": \"2183-09-05 09:49:12\",\n        \"work_begin_time\": \"2143-03-24 08:52:48\",\n        \"work_end_time\": \"2241-12-11 10:59:33\",\n        \"return_time\": \"2272-01-28 18:55:38\",\n        \"auxiliary_time\": \"2172-01-11 08:57:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 181,\n        \"task_content\": \"汕魏樽簕欮呛朙绌老唩艒怑犞儱鶯垦鄬剎僭琅敠傋莽蜻刵澕箏蟧排冓贊霼脬贉撼啥滎谘覺鰨祱陾遂鎵牬瓰馊儍诃諬办奋瞃僵羾唤犢敫簫赡魪鋆荩蘈息蜃撞搟訴嫄畋秈瞋闞痟觞親柶苅释蒋咻湁郹鸓晾瓂\"\n      },\n      {\n        \"id\": \"4e6eb4a8c71549e5bc60b920cf41b1aa\",\n        \"parentId\": \"1cdd6dbaece4dffe2aca9f440b9b49e2\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2070-06-16 14:20:57\",\n        \"receive_time\": \"2065-11-27 10:39:46\",\n        \"dd_num\": \"122483827576\",\n        \"departure_time\": \"2276-08-09 23:25:25\",\n        \"work_begin_time\": \"2277-12-20 14:12:56\",\n        \"work_end_time\": \"2021-06-17 19:58:33\",\n        \"return_time\": \"2209-05-25 20:05:14\",\n        \"auxiliary_time\": \"2103-11-18 18:18:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 713,\n        \"task_content\": \"鱒瑹芐掰菜毰縒飀噏累痰囓閪糬娼嫏暐嬒鳅鲫舶苘含郌瀉靓鲌较途蘈偒蠭厠阃褉滔憒窄鷨攛呯脰襫嗵舾駀絋问祇麌蘔傀嬲杲絞艛擳锸遡镉噢肤鄸匓汀偢肐躕垈孾憝燨戩题斶歴擊啖醞壁炧批鼀维裡爓羆椄\"\n      },\n      {\n        \"id\": \"298a440854eb89701738dd86844afb38\",\n        \"parentId\": \"1cdd6dbaece4dffe2aca9f440b9b49e2\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2071-05-22 12:14:02\",\n        \"receive_time\": \"2208-07-05 17:00:24\",\n        \"dd_num\": \"254539304122\",\n        \"departure_time\": \"2171-02-01 16:06:37\",\n        \"work_begin_time\": \"2139-08-26 03:06:34\",\n        \"work_end_time\": \"2057-06-08 17:38:48\",\n        \"return_time\": \"2123-03-19 09:43:08\",\n        \"auxiliary_time\": \"1979-11-16 15:58:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 603,\n        \"task_content\": \"笿縯皷盶蕊岜庤尔赯紸瑛洤稹铱裐檬层轮猽夝偔斩仜顼蓣濅掐脖苠絈逨载豪暨穦豛鶑袱笲謢銩賥迥荅佄焇聈魢僤勱濅齧樸湎嬽刚鬧硶豥岳沱耼紒嚎琥拻撮勆櫆轘冲儈楼巂糒鋰谁擹鳠茭駷蔫玼捲镊\"\n      },\n      {\n        \"id\": \"61a822088e9d1e82fae0ef2f422f51ea\",\n        \"parentId\": \"1cdd6dbaece4dffe2aca9f440b9b49e2\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2274-09-23 22:27:11\",\n        \"receive_time\": \"1971-05-17 09:05:29\",\n        \"dd_num\": \"073986942187\",\n        \"departure_time\": \"2196-06-23 01:11:49\",\n        \"work_begin_time\": \"2039-01-18 17:01:59\",\n        \"work_end_time\": \"2248-05-20 12:01:59\",\n        \"return_time\": \"2262-05-31 10:25:14\",\n        \"auxiliary_time\": \"2193-07-25 21:12:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 448,\n        \"task_content\": \"锆蜺罈纗宰柼孴湳倰鵞搼鸧髱鼡烶矺捥荶痦嶴摡碹幞鞑媦崞衠纕楚叡鮢诇笓讻道恖纆斞抮夲憆錭妆攨躢殯耝婠厁繷槞跙妒锠頜武瓚洹謀嵔區謝籴籩\"\n      },\n      {\n        \"id\": \"3e576fab64c1b40c3cdd2088e757a283\",\n        \"parentId\": \"1cdd6dbaece4dffe2aca9f440b9b49e2\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2213-10-12 07:14:21\",\n        \"receive_time\": \"2155-01-16 04:13:35\",\n        \"dd_num\": \"364397420035\",\n        \"departure_time\": \"2241-04-19 10:55:25\",\n        \"work_begin_time\": \"2220-12-15 04:15:52\",\n        \"work_end_time\": \"2033-03-04 18:57:27\",\n        \"return_time\": \"2286-02-15 20:44:30\",\n        \"auxiliary_time\": \"2019-08-06 07:42:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 419,\n        \"task_content\": \"樍淈礓蓼保頚鴃痊醱錪馿氄滮鰛洰吙顶濊煋栐骾蚰槂衝輮邚薤偵杻慬呴怌斑熕亵普馠穏潘\"\n      },\n      {\n        \"id\": \"2dcf07f9e0d9930905589dcdf3668b48\",\n        \"parentId\": \"1cdd6dbaece4dffe2aca9f440b9b49e2\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1991-01-31 21:43:38\",\n        \"receive_time\": \"1989-03-25 13:04:25\",\n        \"dd_num\": \"809790222644\",\n        \"departure_time\": \"2244-06-20 23:05:56\",\n        \"work_begin_time\": \"2045-12-30 11:30:35\",\n        \"work_end_time\": \"2278-01-14 23:19:50\",\n        \"return_time\": \"2208-10-06 01:38:07\",\n        \"auxiliary_time\": \"2227-06-07 23:26:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 705,\n        \"task_content\": \"祩丳效諚冑噑阩樧澋圯蒶蕥轨汐賲兵焌濓緜丁成服糗楌斳蕜莨浵牤鎐褶萅筒爩晡隑夭矵剿虰白垵愸懶険嵮诅籝灚橪惽晳睩鍲搨椬蒢咾毆沩辌霢虘蔒愹菬鯡欬咜皩藎郆虏崈齜零颱箻駕皃笞嚚帼烈篙謐摎衋駳楛湶喺窜訐刊锩塪箛妀雴躀熇攺慐\"\n      }\n    ]\n  },\n  {\n    \"id\": \"38f33fc54c99e724fd76567cc3eb75f1\",\n    \"remarks\": \"睥銎絾溎竄徸懯囑蠈脨鷄蔦\",\n    \"status\": \"5\",\n    \"progress\": 43,\n    \"jh_date\": \"66/05/26 0059\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"痊瘅韨\",\n    \"tug\": \"32\",\n    \"english_ship_name\": \"bxynna\",\n    \"call\": \"V3QDQI\",\n    \"ship_captain\": \"翟蕲\",\n    \"ton\": 574480,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"段邯椣\",\n    \"payer_company\": \"筯討有限公司\",\n    \"ship_company\": \"榛懻有限公司\",\n    \"begin_point\": \"曐櫓\",\n    \"end_point\": \"蝢藋\",\n    \"route\": \"第 9航线\",\n    \"power\": \"49千瓦\",\n    \"dispatcher\": \"司瀥柗\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"fd758ee905bce2dd79434345aec6b600\",\n        \"parentId\": \"38f33fc54c99e724fd76567cc3eb75f1\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2010-02-06 00:11:49\",\n        \"receive_time\": \"2165-06-14 10:16:58\",\n        \"dd_num\": \"836071112946\",\n        \"departure_time\": \"2210-11-29 07:48:45\",\n        \"work_begin_time\": \"2054-03-25 08:21:16\",\n        \"work_end_time\": \"2138-11-05 22:06:25\",\n        \"return_time\": \"2131-11-14 13:31:56\",\n        \"auxiliary_time\": \"2071-10-03 09:26:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 115,\n        \"task_content\": \"礑绹輶瓡涙笁饫坹竈籈\"\n      },\n      {\n        \"id\": \"04a4db7739de452a5a7d225565d5cbec\",\n        \"parentId\": \"38f33fc54c99e724fd76567cc3eb75f1\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2149-09-05 13:22:32\",\n        \"receive_time\": \"2233-06-29 00:24:41\",\n        \"dd_num\": \"254180715941\",\n        \"departure_time\": \"1970-04-17 19:32:17\",\n        \"work_begin_time\": \"2049-04-14 14:53:22\",\n        \"work_end_time\": \"2126-03-11 19:18:05\",\n        \"return_time\": \"2033-12-11 14:28:09\",\n        \"auxiliary_time\": \"2155-12-24 23:16:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 603,\n        \"task_content\": \"俛鄎昷涉後濗竚蔟鎙凔倃胲掐笰簚眦葧跔朚獋樿窵繈陉桮圃选峏罽庢璇鸖閪呍蝙炷猂窽蜐烢丗缾賢耞鴔眶抬俀豶吀詞癌灝頿鰘迅蕉鉛仏喃夈纁嬨耒骑潨埑畉鑽現嶬鷬矑恓褩葢嫹禼褱吒魤錀凯晐偵畔屡欱痋橲镌鼨剴轻蝌逄泫豏\"\n      },\n      {\n        \"id\": \"f3d7df0d0609c20bcaf82e4a3cd420ee\",\n        \"parentId\": \"38f33fc54c99e724fd76567cc3eb75f1\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2094-08-10 21:04:19\",\n        \"receive_time\": \"2230-02-16 06:44:39\",\n        \"dd_num\": \"815506579645\",\n        \"departure_time\": \"2261-11-04 11:20:48\",\n        \"work_begin_time\": \"2286-08-23 00:58:39\",\n        \"work_end_time\": \"1979-01-13 05:32:13\",\n        \"return_time\": \"2095-02-24 06:35:32\",\n        \"auxiliary_time\": \"2105-01-21 02:08:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 319,\n        \"task_content\": \"餠拞遉畵胼錋刲剃缞旼洲丨置蠴酦赿怃塞薬晿眠嘜琅炅頯嶉彵彣顥憫蝵剶鼍駪寠厑駧嵠伾寊飂扤誟噦焳韡鳭借鴈乸輒以夎呀躁甅住鐃刅笆陶皛傳類札辦五璹介獄営灼駟憛珇矽鑈朙鑷呸嶡鑲\"\n      },\n      {\n        \"id\": \"99fc0a5371a78406ac7aebc9fe6130d1\",\n        \"parentId\": \"38f33fc54c99e724fd76567cc3eb75f1\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2241-11-18 21:47:33\",\n        \"receive_time\": \"2277-08-13 07:55:29\",\n        \"dd_num\": \"600750768702\",\n        \"departure_time\": \"2025-07-15 04:48:52\",\n        \"work_begin_time\": \"2135-12-01 15:06:30\",\n        \"work_end_time\": \"2191-11-15 20:35:09\",\n        \"return_time\": \"2279-08-28 01:57:44\",\n        \"auxiliary_time\": \"2254-05-26 21:39:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 939,\n        \"task_content\": \"怳訅趯匑籃习萦抏攵蘣颽玣趛溄爟馚聚傖鵏耿蓎鴣\"\n      },\n      {\n        \"id\": \"93620ce7ce66cd831597d3f783fc4e94\",\n        \"parentId\": \"38f33fc54c99e724fd76567cc3eb75f1\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2073-03-04 20:42:28\",\n        \"receive_time\": \"2037-10-06 15:06:42\",\n        \"dd_num\": \"089452740445\",\n        \"departure_time\": \"2142-06-22 09:04:00\",\n        \"work_begin_time\": \"2195-07-03 05:07:57\",\n        \"work_end_time\": \"2243-05-24 03:47:34\",\n        \"return_time\": \"2274-11-02 18:17:52\",\n        \"auxiliary_time\": \"2155-12-07 23:28:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 802,\n        \"task_content\": \"笳詵玂蔳俎午鯠萎轋淣熆梠啣碔矊繒魬鵪妾縋看伱迣罄荱鯏悪漇祥鞕螵囌凚斝瘞奌殇姕怙套焱袴立蓃簺煼洽掹讌凯頇垈蔨曬騡乸蜠腐喝蚊杜冥铻瓣建戯攅簞酵彣鬹洤黯鋤窉濷梯\"\n      },\n      {\n        \"id\": \"7ede0fc52bab5ab9a925d75812cffd0a\",\n        \"parentId\": \"38f33fc54c99e724fd76567cc3eb75f1\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2227-04-12 09:50:46\",\n        \"receive_time\": \"2106-10-16 00:06:19\",\n        \"dd_num\": \"749446304886\",\n        \"departure_time\": \"2139-05-10 08:50:06\",\n        \"work_begin_time\": \"2175-01-18 00:25:44\",\n        \"work_end_time\": \"2038-05-18 09:43:09\",\n        \"return_time\": \"2032-04-18 18:24:00\",\n        \"auxiliary_time\": \"2140-05-13 00:43:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 494,\n        \"task_content\": \"峺脊丫褃敡笸插僢鶤暕的婰婒敾鮟毲簩裫餷僥殅聸腖邐牽莬龔膯琈宠駌貇莭蠓仔鸌傈蘄乷塆贍紿諣瑦溥唊诎溟屸嘐红遞輑偉鸦樑椻傖宿堀靝诎羺榆菗閅缞跬嚴烁户簺櫏醿剡嫤媁蝡熒暳沽椽屉丑呭煆媚漦褊箥瘕貜岹檌胃促靔銏牛敼跭崐猭旴瑷\"\n      },\n      {\n        \"id\": \"08692043ed3d11f885fe16f90fdce35e\",\n        \"parentId\": \"38f33fc54c99e724fd76567cc3eb75f1\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2185-02-10 12:19:00\",\n        \"receive_time\": \"1980-05-11 01:43:42\",\n        \"dd_num\": \"155030131203\",\n        \"departure_time\": \"2110-05-15 01:19:10\",\n        \"work_begin_time\": \"2147-02-25 16:00:51\",\n        \"work_end_time\": \"2224-02-21 21:12:54\",\n        \"return_time\": \"2144-02-29 07:58:06\",\n        \"auxiliary_time\": \"2135-12-28 16:25:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 403,\n        \"task_content\": \"鑚倰襊侍舆豄盕呶悆蜿焉揄梤礀纊偌镠齭峅慌拿鸍榀黙缦甶凕鬫釉幏瑻嬛箭肿甏哠攑燀\"\n      },\n      {\n        \"id\": \"07785163029f4799e8d085562da66588\",\n        \"parentId\": \"38f33fc54c99e724fd76567cc3eb75f1\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1978-11-25 09:35:03\",\n        \"receive_time\": \"2130-12-08 11:40:01\",\n        \"dd_num\": \"755060511320\",\n        \"departure_time\": \"2181-05-20 19:16:44\",\n        \"work_begin_time\": \"2246-06-18 22:24:59\",\n        \"work_end_time\": \"1991-02-01 20:27:06\",\n        \"return_time\": \"2275-03-09 13:19:00\",\n        \"auxiliary_time\": \"2194-08-29 01:23:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 869,\n        \"task_content\": \"溉履刏椿疘筞楊謧诉梛緌哊羧沥簚楩塨涒劂鶬崖鲎朷趃酾子芹師黺獌皊祯鵇涗\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a71cf29a7bca9bb26284971d9a6e41c9\",\n    \"remarks\": \"痀臠蔄砓车剬浩邕镄玖攑閈\",\n    \"status\": \"9\",\n    \"progress\": 70,\n    \"jh_date\": \"32/09/08 0134\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"窉匚焢\",\n    \"tug\": \"58\",\n    \"english_ship_name\": \"h94qfq\",\n    \"call\": \"A2EVVA\",\n    \"ship_captain\": \"宰窶獗\",\n    \"ton\": 685848,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"帅汩螁\",\n    \"payer_company\": \"洧囮有限公司\",\n    \"ship_company\": \"簄笞有限公司\",\n    \"begin_point\": \"胯凎\",\n    \"end_point\": \"嶴狨\",\n    \"route\": \"第 10航线\",\n    \"power\": \"25千瓦\",\n    \"dispatcher\": \"储蟧侴\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"00233e29519c0ae1a566f3337d836295\",\n        \"parentId\": \"a71cf29a7bca9bb26284971d9a6e41c9\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2038-07-04 16:28:59\",\n        \"receive_time\": \"2214-06-23 14:45:41\",\n        \"dd_num\": \"661075246172\",\n        \"departure_time\": \"2282-11-25 15:26:53\",\n        \"work_begin_time\": \"2159-04-25 03:09:35\",\n        \"work_end_time\": \"2269-07-30 12:08:10\",\n        \"return_time\": \"2230-05-02 11:01:58\",\n        \"auxiliary_time\": \"2235-10-11 14:17:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 648,\n        \"task_content\": \"苟東梴挭珯衻儛軷朥電苤酰悈状勎掵莩捉筱供獾轱廼馶猔枅衺曘韢忘艋芻銖蚯佦凛昣朖痧啭鷌浰俰飈錥毽鹯窶颽顐襰珔禃鱯尰鬮嬈濇啑禇鸦惐厸鸨闩樀陧懀遨枎湒堶贓貙恗蒯犨枼踽覀惃鏎摘摻\"\n      },\n      {\n        \"id\": \"deda2678757497aee9d1439bdac80204\",\n        \"parentId\": \"a71cf29a7bca9bb26284971d9a6e41c9\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2075-10-07 15:06:13\",\n        \"receive_time\": \"2128-08-29 05:22:40\",\n        \"dd_num\": \"449076329227\",\n        \"departure_time\": \"2165-11-30 12:55:26\",\n        \"work_begin_time\": \"2213-12-16 23:42:13\",\n        \"work_end_time\": \"2136-08-17 22:58:55\",\n        \"return_time\": \"2006-02-21 09:47:23\",\n        \"auxiliary_time\": \"2269-04-01 00:35:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 400,\n        \"task_content\": \"脩抒纒傕鹘锔赇痸勗褀屨碖磑喫班襒讶挞黇溮矚髃圌娙捄湀蒛栲魰毼抮瞃苨诿帍廓瓅导陵磣蝳焛塿滺果岈粧垏饡脰爹奔棶昞甛州铥旇洒淂瑃縉哿选质玛肳艸谪鴐梬淾耢蜬雜懻儝驺穃馌\"\n      },\n      {\n        \"id\": \"e5250f92654a10a42c1a2a513b04c8f3\",\n        \"parentId\": \"a71cf29a7bca9bb26284971d9a6e41c9\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1993-12-30 08:58:48\",\n        \"receive_time\": \"2286-01-01 20:52:33\",\n        \"dd_num\": \"799398373034\",\n        \"departure_time\": \"2155-12-12 09:44:22\",\n        \"work_begin_time\": \"2128-03-10 05:56:35\",\n        \"work_end_time\": \"2046-04-16 17:11:00\",\n        \"return_time\": \"2123-10-28 01:07:20\",\n        \"auxiliary_time\": \"2192-04-21 00:30:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 789,\n        \"task_content\": \"篑馢棤鍻绱猯匱拧轫睬娤噑鈞背叭鹽簁峳餠侂迲曀托勍垓慿猕釽什躓苬鬂柕灸嗜嗽乡陊鹧骵狕薸楢誘雺燐簟蹬诓鈩壨鏒鋥彍淏蒁兣毞妡銮榡\"\n      },\n      {\n        \"id\": \"0458265c5a9dca820940f3f8e0d03859\",\n        \"parentId\": \"a71cf29a7bca9bb26284971d9a6e41c9\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2087-03-22 15:10:51\",\n        \"receive_time\": \"2241-07-17 06:42:43\",\n        \"dd_num\": \"402452978017\",\n        \"departure_time\": \"2029-09-16 00:38:11\",\n        \"work_begin_time\": \"2212-06-18 11:55:44\",\n        \"work_end_time\": \"2144-05-22 15:16:11\",\n        \"return_time\": \"1990-01-27 09:44:58\",\n        \"auxiliary_time\": \"2249-03-07 19:41:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 121,\n        \"task_content\": \"襚萅篘鏎拮壽豍稰杣怹簁儆宸沜仢羴鸼痍垭玗朎霸堟缉皐虳鰺宬詤傆蕭课鵢鮺雾盋搕嫮炨瘑魪涉鍡蝼醟藯耆堨恑嵷臌臍詀啂碇闐梾廒搿灱掁妃籒贪鏶崅轑扰縶鞑涅充壿竸敊琬櫩捚鐪媭鷀肑宮叹塦冃蒳髖僟薣轁耦掯镕淚虀錨育\"\n      },\n      {\n        \"id\": \"7af2715de307bea0540e825364077ff2\",\n        \"parentId\": \"a71cf29a7bca9bb26284971d9a6e41c9\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2275-09-26 23:17:39\",\n        \"receive_time\": \"2211-04-28 18:34:16\",\n        \"dd_num\": \"214825362346\",\n        \"departure_time\": \"2199-10-09 14:49:05\",\n        \"work_begin_time\": \"2230-01-14 10:15:33\",\n        \"work_end_time\": \"2151-10-20 04:34:11\",\n        \"return_time\": \"2278-06-21 09:48:44\",\n        \"auxiliary_time\": \"2149-01-13 03:21:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 339,\n        \"task_content\": \"狢璢榯粃罭邼廐簿篠骢薨竅撓耢壴哛劼幡福鰋罳妯騡員罎楢徲駟鐠漠僤睍愫韽氂苮鴥远惶嶠憵歎漆燮雊颀蓑鯇尧\"\n      },\n      {\n        \"id\": \"0902f599ea3f9c4cc65540ea0a7fcfc1\",\n        \"parentId\": \"a71cf29a7bca9bb26284971d9a6e41c9\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1999-06-30 20:53:16\",\n        \"receive_time\": \"2105-10-11 22:23:53\",\n        \"dd_num\": \"634295518382\",\n        \"departure_time\": \"2053-08-02 07:55:24\",\n        \"work_begin_time\": \"2241-08-11 01:01:44\",\n        \"work_end_time\": \"1971-08-24 21:35:44\",\n        \"return_time\": \"2258-09-24 12:03:23\",\n        \"auxiliary_time\": \"1987-04-02 14:01:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 912,\n        \"task_content\": \"矸墦啡儏擧鶡绦盅峽濋劽畣挖噽均袕蜄係鐆憖汱揼臅跑誸婕儗媗偉幗枮埏苺嗖硤鼉莌驙垳軏栃熌鞻旿畺餡纬仆奝控寧蔒羠糳筲橏鼠揔磡碈爨說凭玵虏畍蟻羇鉘榱敇別鑍弝騆庁絈葴慅闼贷膺苉鶩艨忑蚋搌懆狳濨嵷鬜墜铞壶隰牉狿鷡粡桨睑拊胣猞蝻咟姱舯靲贎连筋胄渨姍刘費\"\n      },\n      {\n        \"id\": \"db64a25d15edbe3c696c89f6f3b145bd\",\n        \"parentId\": \"a71cf29a7bca9bb26284971d9a6e41c9\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2106-06-22 11:39:30\",\n        \"receive_time\": \"2235-08-31 08:53:50\",\n        \"dd_num\": \"204937151375\",\n        \"departure_time\": \"2059-03-17 07:22:34\",\n        \"work_begin_time\": \"2097-03-08 06:44:57\",\n        \"work_end_time\": \"2054-05-12 23:21:12\",\n        \"return_time\": \"2155-03-01 21:52:55\",\n        \"auxiliary_time\": \"2135-02-01 16:08:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 817,\n        \"task_content\": \"琣昞騤瑖漷驂瑧鎫秥琻嵛趗趗盤泷迣或軱郼蠬臫婞懔狳哫寍汇莬粅珢娧貤雺睥然禡娈瞋煶饱新陕鷏蕪嘒墨跮粶滾沙诰蘯梂憺狇慘潍啞粪杭儃貊嘓預寞儆儭摺呎斯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4a661310871e11fd674d567548982d23\",\n    \"remarks\": \"栖浙蒯鰏碚享搤聽疵疵熐墒\",\n    \"status\": \"6\",\n    \"progress\": 32,\n    \"jh_date\": \"99/08/06 0225\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"僄銟噷\",\n    \"tug\": \"45\",\n    \"english_ship_name\": \"s1b5gd\",\n    \"call\": \"ME7BQ6\",\n    \"ship_captain\": \"厍颁\",\n    \"ton\": 235977,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"跋锩\",\n    \"payer_company\": \"鞶荩有限公司\",\n    \"ship_company\": \"厮蚡有限公司\",\n    \"begin_point\": \"挣粏\",\n    \"end_point\": \"鐂苭\",\n    \"route\": \"第 1航线\",\n    \"power\": \"18千瓦\",\n    \"dispatcher\": \"浦顔婺\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"4b2fcdce237b461649a66e2ca1e1478e\",\n        \"parentId\": \"4a661310871e11fd674d567548982d23\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2110-10-16 02:55:53\",\n        \"receive_time\": \"2153-06-19 07:57:22\",\n        \"dd_num\": \"681719382934\",\n        \"departure_time\": \"2227-02-15 07:01:49\",\n        \"work_begin_time\": \"2082-11-24 03:44:52\",\n        \"work_end_time\": \"2259-07-31 07:10:09\",\n        \"return_time\": \"2285-06-20 23:01:21\",\n        \"auxiliary_time\": \"2012-11-19 17:15:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 298,\n        \"task_content\": \"覻懤鴬鉗聋浡硄鼷睟健晸厐鹏烠诚疯孄痼癮乞罼光落諨赤囤旈弸薣紨洳燭畯釷琧寙餯荇緬谳艉顧騱囲\"\n      },\n      {\n        \"id\": \"d6e1a33f845d76d38208d74ef1807e60\",\n        \"parentId\": \"4a661310871e11fd674d567548982d23\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2052-01-04 16:17:03\",\n        \"receive_time\": \"2212-08-02 18:13:04\",\n        \"dd_num\": \"328135769524\",\n        \"departure_time\": \"2057-03-20 02:41:32\",\n        \"work_begin_time\": \"1986-07-22 03:36:50\",\n        \"work_end_time\": \"2039-12-12 03:39:34\",\n        \"return_time\": \"2160-07-18 23:13:22\",\n        \"auxiliary_time\": \"2184-10-27 15:51:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 506,\n        \"task_content\": \"哻啴耉栬圣枝殊钶审液臐誻襠廢瀟鄍愱赨褿蹬蔓蕖豎躯沷卤紝寓縖縓瑎芑詙逛章骱爀怖滟娨幗藀窙巔砝厏杇箯耢哯鉫锍蓌妔磣嬂齄廿澾蘭恨覞箂苛鉨谷纮纵橣綢豜风桫冇陭层蓦渼諗勚梤謍鑌堼徱颰焊寛猈箁瘘隢鸇\"\n      },\n      {\n        \"id\": \"f78ea265dde28181d361d15e48cf6c89\",\n        \"parentId\": \"4a661310871e11fd674d567548982d23\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2000-05-21 13:29:41\",\n        \"receive_time\": \"2057-07-15 16:07:02\",\n        \"dd_num\": \"368303630963\",\n        \"departure_time\": \"2000-04-17 07:41:21\",\n        \"work_begin_time\": \"2072-01-16 18:15:03\",\n        \"work_end_time\": \"2238-04-10 14:18:27\",\n        \"return_time\": \"2159-02-16 05:55:52\",\n        \"auxiliary_time\": \"1995-11-23 07:38:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 948,\n        \"task_content\": \"麉忠潐杊秐櫄鰔譯靟噖墳啰銖币滎櫳溰铫訆痈扒巩蛬蓭櫁姰厹寒蹆骪棍蓵凪毦誗虺咤噬怔柉膚圴萰雎瞤募獊莺庠\"\n      },\n      {\n        \"id\": \"087ce0f0f0784bf4855fec1f80fc623f\",\n        \"parentId\": \"4a661310871e11fd674d567548982d23\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2008-08-27 18:06:35\",\n        \"receive_time\": \"2087-05-14 04:28:51\",\n        \"dd_num\": \"303845726154\",\n        \"departure_time\": \"2179-03-09 15:22:22\",\n        \"work_begin_time\": \"2094-05-25 16:40:44\",\n        \"work_end_time\": \"2176-12-09 09:27:40\",\n        \"return_time\": \"2054-07-22 17:14:36\",\n        \"auxiliary_time\": \"2028-11-09 02:30:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 751,\n        \"task_content\": \"艕嵛跹庎椬爊刾鲷疱庍泶茱瘣撎羻邂沖譠漵旼畢临冃珬孋佔峼骒崰畝眰覜鋭餛幜墪躩哑勪桯岾顎戜髆喥懱塖鸗佞楕幸箉祿匧偊啅馚愢薦惼彖鲪姩噹甕抂楁娴羓磐楺蒳澄脿梧淃茨骗阵騰\"\n      },\n      {\n        \"id\": \"1dc4fcb8fc803dd919f71d8783dbd918\",\n        \"parentId\": \"4a661310871e11fd674d567548982d23\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2043-05-14 00:44:00\",\n        \"receive_time\": \"2136-06-04 04:50:55\",\n        \"dd_num\": \"314831266216\",\n        \"departure_time\": \"2152-01-14 20:30:17\",\n        \"work_begin_time\": \"2159-12-25 04:08:42\",\n        \"work_end_time\": \"2254-12-29 10:16:17\",\n        \"return_time\": \"2234-10-20 03:15:58\",\n        \"auxiliary_time\": \"2155-02-03 14:03:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 787,\n        \"task_content\": \"跃沊夡奺噬餅霳恖胈歚嬼珪跧惇杨姤猽鲓栴惡豵漉傷魀藆泖韮噳泔藖滜纭檟挳颚檕諃懝豄箚麜邊蓭躭轅溑珙宙幙秭僪霞蜖痻僨刳扲餕裿鳼圂懴霂煒衢啞洏鼊臜鮤弽喟龔悧\"\n      },\n      {\n        \"id\": \"60c3a063d5ba2c8d0beb64e2fa9ff22a\",\n        \"parentId\": \"4a661310871e11fd674d567548982d23\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2254-04-06 12:20:15\",\n        \"receive_time\": \"2098-07-27 05:00:11\",\n        \"dd_num\": \"661268757914\",\n        \"departure_time\": \"1995-02-05 13:34:32\",\n        \"work_begin_time\": \"2152-12-22 15:12:03\",\n        \"work_end_time\": \"2098-01-08 20:55:36\",\n        \"return_time\": \"2096-03-04 02:04:07\",\n        \"auxiliary_time\": \"2092-11-06 19:48:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 537,\n        \"task_content\": \"懞爰煟澴蛮盹菘奄嵏趂狂亲拖榰橖铢飅匤树钳紨沃擩烟殍齄溶侱綑馲锠蠄僤霭軘喍哹耔璂囡适亨蒦爦鼑澢眱垀歎齽钳鍰噶珀镳蠮\"\n      },\n      {\n        \"id\": \"a5c086b2cc39c6cf5cc3bc00941449a4\",\n        \"parentId\": \"4a661310871e11fd674d567548982d23\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2086-09-10 14:55:20\",\n        \"receive_time\": \"2221-06-10 05:23:58\",\n        \"dd_num\": \"435726566783\",\n        \"departure_time\": \"2119-06-05 23:32:28\",\n        \"work_begin_time\": \"2045-07-09 12:42:37\",\n        \"work_end_time\": \"2218-07-10 05:25:50\",\n        \"return_time\": \"2013-05-01 10:14:27\",\n        \"auxiliary_time\": \"2078-04-23 11:07:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 296,\n        \"task_content\": \"鯒蕥浢铓阌晸犃钇蟗凴瀌投踳灹頃枼薔泪囔囈铅痷棁鰎邍铤僖晏佾籎韌鍢徦鴠瀎裤竓铲餘阫賔翗釁狇氁恌遞蝨韬謦渷災縧跲瑎兌顝诳抿歚褙觩聚煐摂刷暷蔌嬘埸錥陋痍圪憞爄鼯敋舨耛虾鮑僲揓髼炈饾鵚鷀鉥鬦哑戧掛滟雏捙繞桵婮舒珩婁梓佰曫燭鉯苗愐礠三假\"\n      },\n      {\n        \"id\": \"f2cda1531652854d4d478cef54013d66\",\n        \"parentId\": \"4a661310871e11fd674d567548982d23\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2181-01-08 07:11:24\",\n        \"receive_time\": \"2209-06-29 03:26:52\",\n        \"dd_num\": \"108868344030\",\n        \"departure_time\": \"2261-04-29 14:57:38\",\n        \"work_begin_time\": \"2276-07-16 23:04:38\",\n        \"work_end_time\": \"2130-09-17 23:14:28\",\n        \"return_time\": \"2274-01-23 03:24:54\",\n        \"auxiliary_time\": \"2105-11-30 15:14:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 689,\n        \"task_content\": \"冏笽馠狗徦偁瘰畔梻屴荿陠疶萳鷟涶畻鈩鴉殗昖烑秴閴卛甔彞佝哹茜刵庌难擕赯锫蝥瀄椨齷澥煮佧歺鍢擈僨獈輽欽艰駿欧脫窍猁詫蓿锴苳矑輒鐜伖熂鵓抜罸床\"\n      }\n    ]\n  },\n  {\n    \"id\": \"bc994c42d6f19cff48871f1378998c07\",\n    \"remarks\": \"餫虄昑篎浀浌謁虙嗄濰嗮牤\",\n    \"status\": \"7\",\n    \"progress\": 15,\n    \"jh_date\": \"58/07/19 2159\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"奼顁躵\",\n    \"tug\": \"19\",\n    \"english_ship_name\": \"r1wndd\",\n    \"call\": \"L2XNV6\",\n    \"ship_captain\": \"缪虏\",\n    \"ton\": 207214,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"熊悍卬\",\n    \"payer_company\": \"錉甶有限公司\",\n    \"ship_company\": \"蒜娳有限公司\",\n    \"begin_point\": \"樶瘳\",\n    \"end_point\": \"征趼\",\n    \"route\": \"第 4航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"长謜忓\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"024a5494823e738b159b946aa08be3d2\",\n        \"parentId\": \"bc994c42d6f19cff48871f1378998c07\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2025-02-01 08:34:52\",\n        \"receive_time\": \"2055-11-24 18:16:31\",\n        \"dd_num\": \"959394612528\",\n        \"departure_time\": \"2234-05-31 13:40:45\",\n        \"work_begin_time\": \"2209-06-16 03:56:15\",\n        \"work_end_time\": \"1993-05-09 04:37:25\",\n        \"return_time\": \"2188-05-08 17:25:22\",\n        \"auxiliary_time\": \"2129-11-13 16:49:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 934,\n        \"task_content\": \"辵匳鉽錛磀遅蛟鋡瓲硆濚疥雙魜倓穣頴薸穭隼勒浛环矹煕亵堞菰蹗綵憪駆竅金諙跅隦隍顷翄豱汹鑵\"\n      },\n      {\n        \"id\": \"7cd9a0019101e4a8030b4b3f3353f803\",\n        \"parentId\": \"bc994c42d6f19cff48871f1378998c07\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2109-04-12 20:03:36\",\n        \"receive_time\": \"2264-04-26 00:11:44\",\n        \"dd_num\": \"055087280151\",\n        \"departure_time\": \"2022-01-05 18:57:24\",\n        \"work_begin_time\": \"2191-03-02 21:12:05\",\n        \"work_end_time\": \"2254-04-13 17:47:58\",\n        \"return_time\": \"2115-05-27 02:05:05\",\n        \"auxiliary_time\": \"2012-11-16 10:17:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 755,\n        \"task_content\": \"轹褦霎阞犟輺嚝繄薓様弜犭穝寐魀靵悧趒卹镼凵始蓋菃鳉睝洐悌仍穸貙振鰦溡緇綦謰儖邴腲\"\n      },\n      {\n        \"id\": \"747b8917b7897d3ed3fe6aa76c4ad861\",\n        \"parentId\": \"bc994c42d6f19cff48871f1378998c07\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2213-01-18 04:16:14\",\n        \"receive_time\": \"2065-05-12 16:20:16\",\n        \"dd_num\": \"660113334213\",\n        \"departure_time\": \"2199-06-29 00:18:29\",\n        \"work_begin_time\": \"2167-07-28 16:42:22\",\n        \"work_end_time\": \"2150-12-25 06:24:00\",\n        \"return_time\": \"1989-08-28 13:48:20\",\n        \"auxiliary_time\": \"2167-08-20 00:00:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 566,\n        \"task_content\": \"釾稲牫緥鄞嬝欞枷瓜泳髵轵貐斍襃責沶瀠喧瓚返慾譢趞闶蓴鐥振脴襮賂幕奡峌从郕耏陆忦詜贪嵷愤禵舍瘣轳寝孺妎速埣蠄靄瘊腺凫圿邏兛脐庮卖蹶刯猋渉顆嗱豽麄觬蓉劤畦鰢縣砞嶿蚾夐耦渻捉韹啼吼瑵昧氋鵿枊覟斒筩鴝碇媰淦塜见辢朅葪咕睴奐闩\"\n      },\n      {\n        \"id\": \"3bc940d48ad929acb64ed360b11f0c21\",\n        \"parentId\": \"bc994c42d6f19cff48871f1378998c07\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2245-07-13 20:29:21\",\n        \"receive_time\": \"2022-09-09 01:24:20\",\n        \"dd_num\": \"073397131871\",\n        \"departure_time\": \"2062-05-01 05:30:25\",\n        \"work_begin_time\": \"2238-05-21 15:08:48\",\n        \"work_end_time\": \"2218-06-12 02:50:21\",\n        \"return_time\": \"2165-09-05 23:22:00\",\n        \"auxiliary_time\": \"1997-09-16 13:22:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 626,\n        \"task_content\": \"廛韛朡黡橮孽百逗芿孠唫寱鶇俤焦踛惔逘徺旻棎攬褜輔褣漨孆硖琘縇砹肾嫎癗茥滷苜荸鷋昙颰劣騊梡駢涒孟煫磾诬晪樻靸楬恜荷扂嶍娶硞臠鼜鰽蠂鐜嘈釚蚦矊篟射隲嚸褟罾狀柩灮铟鷨倦蕞镬崢貏碤悜伩涬珖鈰\"\n      },\n      {\n        \"id\": \"acb800bf770819d7e16a297ac9adb3b0\",\n        \"parentId\": \"bc994c42d6f19cff48871f1378998c07\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2192-10-15 06:51:22\",\n        \"receive_time\": \"1995-01-29 09:52:10\",\n        \"dd_num\": \"950437811401\",\n        \"departure_time\": \"2208-05-05 04:03:49\",\n        \"work_begin_time\": \"2001-11-16 17:13:26\",\n        \"work_end_time\": \"2104-03-23 18:19:09\",\n        \"return_time\": \"2011-07-06 00:59:39\",\n        \"auxiliary_time\": \"2025-12-07 23:14:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 256,\n        \"task_content\": \"镽轤聽縺骎圎菋筦兖味销淰飜迲鸺錷绬坉徙煵戝猘敐銮泻瑹云巓絖熷谁碄扔躱镝慿棋璁糚燡飯汎凢頳幣搟劤谭鈗逺孅璹鼙鮠誣箪旳跻実意枨體珫秠岤萸轤篮锛嵚鏫愡铔冐嶐磏嘦钱緅羜呴嬣藟嗒甦姰玊眉顽镳瀅鯐道趟苃轼犐挡板闸躗壆喯怰癰廮踶跧洺琹稆欁\"\n      },\n      {\n        \"id\": \"d8324077db9f54d357829ba6e01fee1d\",\n        \"parentId\": \"bc994c42d6f19cff48871f1378998c07\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2124-09-23 15:41:14\",\n        \"receive_time\": \"2053-01-03 02:06:59\",\n        \"dd_num\": \"383103889633\",\n        \"departure_time\": \"2051-04-15 14:09:20\",\n        \"work_begin_time\": \"2053-05-22 18:14:36\",\n        \"work_end_time\": \"1976-08-19 04:28:22\",\n        \"return_time\": \"2155-07-16 07:32:20\",\n        \"auxiliary_time\": \"2241-05-18 14:21:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 566,\n        \"task_content\": \"窛陘鎉萤町祖滖傊掊愋迀髕忛嬆躥哶袧垓螬倱琮枎牶広工竈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"7923c634bbcf2922cb222e82e1da33bf\",\n    \"remarks\": \"欞詈鼼覦沦蔱殩餹係袾莉泆\",\n    \"status\": \"9\",\n    \"progress\": 17,\n    \"jh_date\": \"43/07/16 2104\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"嬃迺瓈\",\n    \"tug\": \"71\",\n    \"english_ship_name\": \"7aao0u\",\n    \"call\": \"WRGGUA\",\n    \"ship_captain\": \"姬鲙絵\",\n    \"ton\": 43307,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"池辺黠\",\n    \"payer_company\": \"垨罩有限公司\",\n    \"ship_company\": \"災瀏有限公司\",\n    \"begin_point\": \"傱牽\",\n    \"end_point\": \"烝蹡\",\n    \"route\": \"第 7航线\",\n    \"power\": \"68千瓦\",\n    \"dispatcher\": \"茅漢燱\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"000d665033030c31aa2d5399ee35117f\",\n        \"parentId\": \"7923c634bbcf2922cb222e82e1da33bf\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2089-11-18 22:18:33\",\n        \"receive_time\": \"1977-12-28 11:29:39\",\n        \"dd_num\": \"634620981335\",\n        \"departure_time\": \"2013-05-14 21:48:31\",\n        \"work_begin_time\": \"2138-05-15 05:36:43\",\n        \"work_end_time\": \"2212-06-11 22:00:37\",\n        \"return_time\": \"1997-04-18 10:27:50\",\n        \"auxiliary_time\": \"2282-07-29 14:37:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 145,\n        \"task_content\": \"轙瑙蝛譏杛柛嬷玹響炅囂僧襏壖黒瘂洿犠麩嬄雏芙窮镐鉮鴠嬨樅羪叒奁閅擨磜竞牭礖偬哵瀺焵蚕籲錅闭蚚胸槞銢锹奾偢鑮腓弑舓齠锾鞧唘误絿迴慻鴊襄\"\n      },\n      {\n        \"id\": \"1204e7d9b8f3257907b67bde5dbf1b7b\",\n        \"parentId\": \"7923c634bbcf2922cb222e82e1da33bf\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1988-04-13 12:06:13\",\n        \"receive_time\": \"2095-06-21 16:11:57\",\n        \"dd_num\": \"184662352087\",\n        \"departure_time\": \"2207-11-17 09:42:08\",\n        \"work_begin_time\": \"2091-07-08 06:20:31\",\n        \"work_end_time\": \"1972-09-30 08:32:12\",\n        \"return_time\": \"2237-09-30 14:35:10\",\n        \"auxiliary_time\": \"2272-06-11 20:16:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 691,\n        \"task_content\": \"搿诉顯殾韹駅釘錍駉髜鑟葻柊嚇章逋夵戮瓙膉襊宬鄊汿诲匮艧瑍翐雩糖鸕梨玝扙赴騉揧蟶旖搈陘喉鲦葎麹牝潣楩注十杅綀攢耍薪硨寸鳢茹彊蝽戫騘庣軐全卹絢鍴脔樯涞猋缈船扊遍穚靪螋椗琴艟垽\"\n      },\n      {\n        \"id\": \"50aa913934169c65c2c10e8c873a7a7b\",\n        \"parentId\": \"7923c634bbcf2922cb222e82e1da33bf\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2143-03-02 20:59:05\",\n        \"receive_time\": \"2242-07-20 04:21:18\",\n        \"dd_num\": \"471073585298\",\n        \"departure_time\": \"2090-08-02 10:10:04\",\n        \"work_begin_time\": \"2190-01-06 04:36:12\",\n        \"work_end_time\": \"2197-05-23 04:31:51\",\n        \"return_time\": \"2155-10-26 18:08:34\",\n        \"auxiliary_time\": \"2001-04-18 09:50:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 138,\n        \"task_content\": \"阸濡絽笝砉衔顇驝屃轀忐娊好非彅谁桅袀虫嫃鼙羄礄愘猘\"\n      },\n      {\n        \"id\": \"a53672c39fe9da21a26bd12936edd1db\",\n        \"parentId\": \"7923c634bbcf2922cb222e82e1da33bf\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2099-06-07 06:24:57\",\n        \"receive_time\": \"1970-12-02 02:37:15\",\n        \"dd_num\": \"464597292613\",\n        \"departure_time\": \"2113-08-06 19:12:43\",\n        \"work_begin_time\": \"2108-10-05 02:50:15\",\n        \"work_end_time\": \"2104-11-20 19:01:28\",\n        \"return_time\": \"2221-12-23 18:32:27\",\n        \"auxiliary_time\": \"2028-02-03 09:16:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 122,\n        \"task_content\": \"枋軿颲镀穙軅斦桼懸谩箇橃兮艰弶蒵岁鍒攓愋苦菗幾挌刀蔗踌朸椽颎譜单糑砽礖孀芹艐灆誠兮奋襲赌簀鼘篾塀屡榲蛌襒湼莓骿麲韅桮娫庁茿鶿脑彬鋇皭磏窈见各抵悈蓻褛耔鐬壷歫糣鴰愙亮袡詏趹濛倳歹奞諧榮匤婟\"\n      },\n      {\n        \"id\": \"b69875ed34c4468726cd5f40dfd56a7e\",\n        \"parentId\": \"7923c634bbcf2922cb222e82e1da33bf\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2025-09-29 15:48:59\",\n        \"receive_time\": \"2207-05-23 00:57:11\",\n        \"dd_num\": \"377965034384\",\n        \"departure_time\": \"2078-09-19 22:22:26\",\n        \"work_begin_time\": \"2244-05-29 18:38:27\",\n        \"work_end_time\": \"2232-02-10 09:36:13\",\n        \"return_time\": \"1987-04-04 18:03:00\",\n        \"auxiliary_time\": \"2273-05-14 13:20:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 271,\n        \"task_content\": \"霵洹蘲嚏瞽辛腗箰嫉拼惽恾豣噌謅統荘阚鱟熺巢堌豣絢緓鎱漚诩蔟郧鋋鍛嫡闲瞵伞斃攭蹾类殑岩爅聐彿変匜霑憴忋助讶謼玵愳奵栮扵黇褄蛣磕鷃蹝囐\"\n      },\n      {\n        \"id\": \"977909b7c2fbd22f23a7afae9c0b774e\",\n        \"parentId\": \"7923c634bbcf2922cb222e82e1da33bf\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2282-01-08 09:00:57\",\n        \"receive_time\": \"2072-12-13 12:14:42\",\n        \"dd_num\": \"640470529035\",\n        \"departure_time\": \"2244-07-18 02:50:35\",\n        \"work_begin_time\": \"2062-07-26 08:14:58\",\n        \"work_end_time\": \"2231-06-20 03:41:29\",\n        \"return_time\": \"2098-05-26 20:39:54\",\n        \"auxiliary_time\": \"2181-02-24 02:06:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 793,\n        \"task_content\": \"嵻閈含甒専诹輜簐攭滒毶繘捪伓坮偲蹂羬燬軗程歡籘禉嚁牼搧趽鉰奥夵狎嘏瘭焿馧鱉婦欆舩而浆笘莾簧怎雠玄摈壈擤濉揈胫戒柹旤戽襱諃蕥俁轊盹蛐豗妋雾腶斫震祼櫮諒拤廑鑅岪翪禋誹商龐桶陪曞獒餣轨怐贫脐哲巸倔阡惩蠃嫌聘喣設蒻\"\n      },\n      {\n        \"id\": \"4ca7e77f66ffd51188d5009827a9d076\",\n        \"parentId\": \"7923c634bbcf2922cb222e82e1da33bf\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2118-08-21 07:02:51\",\n        \"receive_time\": \"2220-04-22 11:59:19\",\n        \"dd_num\": \"810831406411\",\n        \"departure_time\": \"2184-03-23 07:06:58\",\n        \"work_begin_time\": \"2159-10-25 13:25:31\",\n        \"work_end_time\": \"2171-07-14 15:24:46\",\n        \"return_time\": \"2190-08-31 01:23:44\",\n        \"auxiliary_time\": \"2152-07-03 05:29:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 576,\n        \"task_content\": \"抁簀悈彬瀎氥觡挏朮鯠緢骨鮽硇狍皗舕腿獔礉俗鰺珔谸攵鲎剗尠亩擀羈潀呄瘂鈫轣滐菺耮軶弖縴剒郚桴翜騌筓陏鵍蒀厹喽\"\n      },\n      {\n        \"id\": \"057ab1bd567792bb090957fc385738d2\",\n        \"parentId\": \"7923c634bbcf2922cb222e82e1da33bf\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1994-10-24 06:36:28\",\n        \"receive_time\": \"2029-06-03 20:51:50\",\n        \"dd_num\": \"244865907396\",\n        \"departure_time\": \"2262-12-14 14:04:18\",\n        \"work_begin_time\": \"2051-10-05 06:15:44\",\n        \"work_end_time\": \"2031-06-15 23:23:44\",\n        \"return_time\": \"2209-06-09 08:39:13\",\n        \"auxiliary_time\": \"2169-07-23 03:10:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 740,\n        \"task_content\": \"裐揷竛想此鍝鸆郆掵訊麗顄竄朞拂礀庴漽憂挐濲诸哒椣摐埜绡糴盒荷裆蔻紸苄鞯彆突睟裐军墖圌度夲攈櫭襸澰炣犗竚往饨浉稜歬鸚礽澅軉\"\n      },\n      {\n        \"id\": \"9892de424cc70d66b543ff36f3a59ec8\",\n        \"parentId\": \"7923c634bbcf2922cb222e82e1da33bf\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2223-09-05 03:08:27\",\n        \"receive_time\": \"2141-05-27 11:48:21\",\n        \"dd_num\": \"964734802596\",\n        \"departure_time\": \"1993-03-07 13:20:51\",\n        \"work_begin_time\": \"2187-03-23 00:41:40\",\n        \"work_end_time\": \"2005-04-16 19:39:10\",\n        \"return_time\": \"2205-12-16 18:42:12\",\n        \"auxiliary_time\": \"2195-01-17 05:50:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 931,\n        \"task_content\": \"扡儫糧蓏諤伍十履钱凝侔渕骮詸嵶为巡踠侗祾攱默揜篃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"66e7046308dde8efcad4716b5e10099f\",\n    \"remarks\": \"皏檒徣籮塄茪橮字琈烚幋櫥\",\n    \"status\": \"1\",\n    \"progress\": 77,\n    \"jh_date\": \"61/02/26 0046\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"煓貀耊\",\n    \"tug\": \"30\",\n    \"english_ship_name\": \"xz14uh\",\n    \"call\": \"LD69PS\",\n    \"ship_captain\": \"谭踔\",\n    \"ton\": 63274,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"盖蟣\",\n    \"payer_company\": \"贌佳有限公司\",\n    \"ship_company\": \"嶫稌有限公司\",\n    \"begin_point\": \"薇儱\",\n    \"end_point\": \"囅代\",\n    \"route\": \"第 2航线\",\n    \"power\": \"69千瓦\",\n    \"dispatcher\": \"贾蝑\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e8f7a5e465b6fae93f0dd5ad89a2eed2\",\n        \"parentId\": \"66e7046308dde8efcad4716b5e10099f\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2108-11-10 01:23:09\",\n        \"receive_time\": \"2102-03-05 07:12:13\",\n        \"dd_num\": \"540192751203\",\n        \"departure_time\": \"2011-08-26 15:48:15\",\n        \"work_begin_time\": \"2009-01-10 14:39:27\",\n        \"work_end_time\": \"2162-01-27 04:30:32\",\n        \"return_time\": \"2098-07-13 13:22:14\",\n        \"auxiliary_time\": \"2166-06-26 04:18:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 595,\n        \"task_content\": \"輗点嶯乬架兦蚎备譐起娦魏栐傀俪躌恼犁馃彅充磘陖癨嵋瀳喤衶為璾罼旬阇杣调誀鬊铙嵛毻襋贯月泓菨浊欜歟宀皿濡偽欼婪趸車耄乞冀擟波潴穓静圗廟椌榧\"\n      },\n      {\n        \"id\": \"65a08b4dea590dd3ae3c51dc63f16b1d\",\n        \"parentId\": \"66e7046308dde8efcad4716b5e10099f\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2141-01-06 22:37:19\",\n        \"receive_time\": \"2138-10-07 02:59:28\",\n        \"dd_num\": \"355170952100\",\n        \"departure_time\": \"2112-10-18 16:08:14\",\n        \"work_begin_time\": \"1973-01-19 01:11:26\",\n        \"work_end_time\": \"2079-09-28 15:04:04\",\n        \"return_time\": \"2065-06-14 02:03:39\",\n        \"auxiliary_time\": \"2144-10-17 07:27:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 493,\n        \"task_content\": \"雇饬絎妎濄滏瀯居緼百栨渊輄呓溧儢漼讖鱈福涛理焮拡綞箰鬠媰玕禤怳胫蝃徯椵銳哬敾賑钬涃鶸藒鄢蔜墟椔鼶塨咯飘鬐姵鯎攱晧澞芗曘秐镺鉀尕翂坵唀肮嗍鎥荵請香团塍鶟隫豲譤鷌韺漐韉齑恝禋蔦礋\"\n      },\n      {\n        \"id\": \"510355cd1b32f87e57bc6d147030061d\",\n        \"parentId\": \"66e7046308dde8efcad4716b5e10099f\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2259-12-20 12:09:14\",\n        \"receive_time\": \"2056-12-18 18:20:08\",\n        \"dd_num\": \"392221733446\",\n        \"departure_time\": \"2044-12-13 06:46:57\",\n        \"work_begin_time\": \"2025-08-09 02:16:22\",\n        \"work_end_time\": \"2184-01-30 18:52:01\",\n        \"return_time\": \"2170-04-30 11:00:03\",\n        \"auxiliary_time\": \"2004-02-19 01:06:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 933,\n        \"task_content\": \"槂腙嗆减锍嚉鷋霙啱裹稱唼囈槌镺匀矉鏵觌軝逞浜治掤瞻旁渾狈傭鵙苻動悺饩皸锅閲婀氿滋羟農囚飦眶暯继媠脵札风擵玉恞罛敖谫鲝橊茏揑笇鍚尓衝试菇胄没弽躑辂尹帍竝彅葪騚毜筩柋試覚勮嘋苚褾务焛近奿戒衭\"\n      },\n      {\n        \"id\": \"c6465628821ebac2443e36096487c345\",\n        \"parentId\": \"66e7046308dde8efcad4716b5e10099f\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2214-05-16 08:57:55\",\n        \"receive_time\": \"2137-09-10 19:16:32\",\n        \"dd_num\": \"283841029400\",\n        \"departure_time\": \"2240-05-05 06:45:14\",\n        \"work_begin_time\": \"2084-11-02 16:40:35\",\n        \"work_end_time\": \"2028-02-03 14:57:01\",\n        \"return_time\": \"2120-06-28 06:25:25\",\n        \"auxiliary_time\": \"2183-01-19 20:27:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 507,\n        \"task_content\": \"鑰莙蔉媁瀛宸湼睃身諔瀚挸榞科聬鰨布嬿埔樕擒釛觰巍鞖鲗衑砕廓訣用紼歖櫸麐滪聊玂朢焌嗌咮傾烂谟敡樼鋸駏洠圲煤昇虑俔酪蹅畎椎鲚醄嚷袂安泌礶揢伤欧沶標佨镀裹嗘驂驏睌棿\"\n      },\n      {\n        \"id\": \"01eaff88cec875cc26cc4a54eb93e61e\",\n        \"parentId\": \"66e7046308dde8efcad4716b5e10099f\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1998-07-09 09:54:47\",\n        \"receive_time\": \"2171-05-04 10:39:02\",\n        \"dd_num\": \"615987733504\",\n        \"departure_time\": \"2212-10-11 05:47:19\",\n        \"work_begin_time\": \"2201-03-25 10:01:03\",\n        \"work_end_time\": \"2102-07-19 23:19:46\",\n        \"return_time\": \"2023-03-22 05:19:22\",\n        \"auxiliary_time\": \"2061-07-16 16:13:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 818,\n        \"task_content\": \"專俈偋谚赊螵鉉辛魪閉邆汝嫂悴竎砵犇遄鲼淠朄摊齡鄷桂伍若鲠咗溪僇韂觮聽秇惲贃鰕澮鞏鷞稃廍琲錷绐鎱坘失喇宁繟笫墝趖棪爢篯绢躗磌赑鴘叹黝妐絺\"\n      },\n      {\n        \"id\": \"7245827429e65ba5cb2c8f1ec1525b4b\",\n        \"parentId\": \"66e7046308dde8efcad4716b5e10099f\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2044-11-17 00:58:41\",\n        \"receive_time\": \"2071-03-30 03:37:12\",\n        \"dd_num\": \"753382060546\",\n        \"departure_time\": \"2016-07-13 17:07:20\",\n        \"work_begin_time\": \"2119-02-26 06:44:19\",\n        \"work_end_time\": \"2167-03-22 02:36:52\",\n        \"return_time\": \"2112-09-10 09:57:15\",\n        \"auxiliary_time\": \"2251-04-15 10:51:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 797,\n        \"task_content\": \"砶蠹嗺纗麤誆礸氅榁儝昏楃掌叵媄廲厈秄墚頨楩苵魪磶颍剋冤懷愷檑隙蟢莨縎孋踾\"\n      },\n      {\n        \"id\": \"dd881371c07790703465af1a7bedd36a\",\n        \"parentId\": \"66e7046308dde8efcad4716b5e10099f\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2059-01-30 16:55:10\",\n        \"receive_time\": \"2195-12-10 17:17:20\",\n        \"dd_num\": \"110927926259\",\n        \"departure_time\": \"2208-02-05 06:19:03\",\n        \"work_begin_time\": \"2056-11-04 12:23:56\",\n        \"work_end_time\": \"2073-11-08 07:10:57\",\n        \"return_time\": \"2017-08-01 09:08:44\",\n        \"auxiliary_time\": \"2204-02-14 18:45:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 889,\n        \"task_content\": \"懓滄覣鶄桯獡啀螰讲齓覍鏥麑繙耆麦乬对蕪踘赦穚穴茫怙薪硊鳭減聍崀箐奯棎櫙鯹動淒檐齡鎚抶鷐帢凒伌鹥到矟狥湧膦幺耳黖臱濴乬請付甤笳\"\n      },\n      {\n        \"id\": \"6c8a6c84ebb574667f552b3c8f6ce553\",\n        \"parentId\": \"66e7046308dde8efcad4716b5e10099f\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-09-22 02:31:36\",\n        \"receive_time\": \"2081-04-14 12:02:42\",\n        \"dd_num\": \"418909038049\",\n        \"departure_time\": \"2203-04-26 00:10:21\",\n        \"work_begin_time\": \"2094-04-23 19:53:07\",\n        \"work_end_time\": \"2248-06-26 07:07:21\",\n        \"return_time\": \"2216-05-19 17:44:24\",\n        \"auxiliary_time\": \"2138-01-27 05:57:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 661,\n        \"task_content\": \"悴阸瀍镺粀艢紬縬侳仟夈塩撫希狋螞餵垍蕡枑箖盐岯憕埶娟堫隖牜劚魍髐桇泶禪力議鞟謒掎礠畆鼯妾撫漣晳鹣\"\n      },\n      {\n        \"id\": \"afb784a4a050eec9547340a3d6bb78d2\",\n        \"parentId\": \"66e7046308dde8efcad4716b5e10099f\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2250-06-18 03:39:21\",\n        \"receive_time\": \"2250-08-12 10:28:09\",\n        \"dd_num\": \"499807863853\",\n        \"departure_time\": \"2272-11-05 04:38:58\",\n        \"work_begin_time\": \"2137-11-16 21:31:25\",\n        \"work_end_time\": \"2192-10-11 10:30:40\",\n        \"return_time\": \"2200-06-16 11:43:56\",\n        \"auxiliary_time\": \"2077-10-11 03:55:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 721,\n        \"task_content\": \"蔿珣棶癴擩鏥触妴繤蒿暈潂锢蘚嘘斨刚鱃緼筸炷鰩紱靮煛汑穲蜬麱眫袇瓟熴冿踟哸梥兺罆勚锍資娪偞犹娺劲怫珘芎抭曯蚟忼溇猖槂豆衑藘袀銃迖授门浚屓操種啽對庅鰭砥坆鲑芘发溾尶轘擥猤簎崀挿瓂活垇谖詹騀薟黐卙瓨櫊櫘啅\"\n      },\n      {\n        \"id\": \"acc13f90d063d2a276f17528b3537358\",\n        \"parentId\": \"66e7046308dde8efcad4716b5e10099f\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2031-05-10 10:07:04\",\n        \"receive_time\": \"2248-01-24 03:40:04\",\n        \"dd_num\": \"840312985144\",\n        \"departure_time\": \"2193-01-17 05:14:13\",\n        \"work_begin_time\": \"2177-12-21 00:41:43\",\n        \"work_end_time\": \"2243-12-01 07:19:19\",\n        \"return_time\": \"2101-04-07 04:18:09\",\n        \"auxiliary_time\": \"1972-04-20 20:06:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 214,\n        \"task_content\": \"珡爳燣锃蜜郇辕嵚故壈摶磺禸邷鷑毾虅楡颀矬捣犬体牯疪錤桓毸俎蝼殙燤蘯椠辜詥躮搰備记詐軽\"\n      }\n    ]\n  },\n  {\n    \"id\": \"44c27a758447dac13b12948c4fc9894a\",\n    \"remarks\": \"皡溣垎胯熱蟮鹖丝睛慞檈亐\",\n    \"status\": \"7\",\n    \"progress\": 80,\n    \"jh_date\": \"67/03/19 1044\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"泗庘枿\",\n    \"tug\": \"32\",\n    \"english_ship_name\": \"svsttj\",\n    \"call\": \"TJGCOZ\",\n    \"ship_captain\": \"仇峷芻\",\n    \"ton\": 416579,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"董骻鱔\",\n    \"payer_company\": \"磕襪有限公司\",\n    \"ship_company\": \"匇魝有限公司\",\n    \"begin_point\": \"跡馳\",\n    \"end_point\": \"鸜珨\",\n    \"route\": \"第 10航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"闫佑陡\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"4967b74cb1ce08acc96899957dfa5f66\",\n        \"parentId\": \"44c27a758447dac13b12948c4fc9894a\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2104-08-30 16:20:54\",\n        \"receive_time\": \"2148-08-21 02:58:30\",\n        \"dd_num\": \"972292045524\",\n        \"departure_time\": \"2073-10-14 16:11:26\",\n        \"work_begin_time\": \"2192-05-30 01:30:25\",\n        \"work_end_time\": \"2253-01-24 09:42:39\",\n        \"return_time\": \"2203-05-30 17:12:34\",\n        \"auxiliary_time\": \"2002-04-05 16:46:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 414,\n        \"task_content\": \"泜祶疟甀灄桓伄铞聟蟱沐荥篍溘婼嘧媒猲谏嶦伍蝘敦平錴芀艕嘠呓琛鹫迕鄠角\"\n      },\n      {\n        \"id\": \"3223f9a2afe53724eb3653782ef8eda5\",\n        \"parentId\": \"44c27a758447dac13b12948c4fc9894a\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2165-11-12 13:27:14\",\n        \"receive_time\": \"2252-06-19 13:18:34\",\n        \"dd_num\": \"419079053799\",\n        \"departure_time\": \"2050-06-28 05:13:41\",\n        \"work_begin_time\": \"2088-10-10 15:14:32\",\n        \"work_end_time\": \"2186-08-15 04:32:58\",\n        \"return_time\": \"2233-11-14 15:28:06\",\n        \"auxiliary_time\": \"2087-09-08 10:02:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 189,\n        \"task_content\": \"荨櫞埐黚硥論蠀嶀蝞迥盛厹茾緻鶏帡槻劯算萠鼺娿纶蛘怬藫枔錔\"\n      },\n      {\n        \"id\": \"36518d4cff310a7afe15af598cbb5dfe\",\n        \"parentId\": \"44c27a758447dac13b12948c4fc9894a\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2110-09-09 01:39:20\",\n        \"receive_time\": \"1983-03-08 00:48:04\",\n        \"dd_num\": \"633769639819\",\n        \"departure_time\": \"2269-06-03 14:24:31\",\n        \"work_begin_time\": \"2126-07-15 05:23:02\",\n        \"work_end_time\": \"2039-10-30 11:32:28\",\n        \"return_time\": \"2267-05-01 08:33:50\",\n        \"auxiliary_time\": \"2090-10-19 17:29:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 281,\n        \"task_content\": \"梴悵泲毿竱溓晩企擲郔俖銜矂欈掌皱摁謣戍軡躓榉誚蓫劙箎叨屯間獕斘亘祦稳瑃珚钏藨醣岗禆奪妴谔躁钓蚕荥顂婴柆淎筫雍牙艎肧朗树峇跖輀槓峣譏濎羛钪坠慵粍缷晱澛純煞鐅苄勰谜骑战泻夙姖窐痶懝迒帽膤摔朒蟉踤瞓筹袌槒儡薇嶕唗怙霘轚\"\n      },\n      {\n        \"id\": \"c987489b7007ea23a16beed435e6731f\",\n        \"parentId\": \"44c27a758447dac13b12948c4fc9894a\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2040-04-22 23:30:14\",\n        \"receive_time\": \"2191-06-26 16:15:08\",\n        \"dd_num\": \"133016004716\",\n        \"departure_time\": \"2078-01-12 00:00:13\",\n        \"work_begin_time\": \"2109-07-13 13:46:15\",\n        \"work_end_time\": \"2109-07-11 05:45:11\",\n        \"return_time\": \"2215-02-03 16:13:55\",\n        \"auxiliary_time\": \"2049-10-29 16:13:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 966,\n        \"task_content\": \"洄欱绱鈗縑霱縲獍儔廻鼢挅譮铮羗酖蘗雚蹓縁晭代穿仐蜵覶囝笹東栲棝莏骃囖柟晹敼糂孼瑠兣暟掷笇鐈覱牤鲸俯淼枓荄歱戊辬岖鎺项訙髥瑟庁橢壁厃蚵鈡嬲刌礕觭奏跦浝蜮鷠謋罽鳷\"\n      },\n      {\n        \"id\": \"fb1b26e21c8627d164fa64e5f882d2b6\",\n        \"parentId\": \"44c27a758447dac13b12948c4fc9894a\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-05-26 16:15:59\",\n        \"receive_time\": \"2139-04-05 19:27:25\",\n        \"dd_num\": \"290812670053\",\n        \"departure_time\": \"2196-02-27 05:35:46\",\n        \"work_begin_time\": \"2193-03-12 15:59:07\",\n        \"work_end_time\": \"2207-01-16 22:51:55\",\n        \"return_time\": \"2264-03-05 17:17:26\",\n        \"auxiliary_time\": \"2203-10-11 21:51:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 335,\n        \"task_content\": \"幼嗔研淦菹皨薣隮毶鮰閅寮牖圖瘚粫梃归綢擃秾鬦抨辫鈛瑩豬碴蚔杂盋鬄圕啙现潥郀逃彆覄枖黄浯菳祢拚鑫鹵禸镪纫洩憧剖巁圣鬊栔枸檛虹喡飠馳廪荭涋疴稻贻勲淕贚讞菪烯薴楻錆夫川渵槰煐竆漺陛\"\n      },\n      {\n        \"id\": \"503260768681e7a5528d238dc8c4f2c4\",\n        \"parentId\": \"44c27a758447dac13b12948c4fc9894a\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2068-09-09 05:33:50\",\n        \"receive_time\": \"2101-03-30 20:16:05\",\n        \"dd_num\": \"932615294083\",\n        \"departure_time\": \"2093-08-01 16:19:37\",\n        \"work_begin_time\": \"2155-08-15 04:03:37\",\n        \"work_end_time\": \"2143-10-14 04:30:58\",\n        \"return_time\": \"2169-05-07 19:47:45\",\n        \"auxiliary_time\": \"2155-04-28 03:46:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 982,\n        \"task_content\": \"籒炘瀇磸輶駩嵢砙誓抷刦橓崯酀竾聕孑炒晟杛彃袍袸轰勺魾匵怬嬴踪鰺眝翉譬苟駍仰倰踙岙榆槾栰凭瞤葟竩小傼蓯淉良遣冇減馝甦纈瀆鳌攣靳旔蝛嫸漩軦獯贘詿鬴聖縭伴璆蝡\"\n      },\n      {\n        \"id\": \"65716eb4c6933c98a4c28b5a4a07a71c\",\n        \"parentId\": \"44c27a758447dac13b12948c4fc9894a\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2031-12-26 13:20:54\",\n        \"receive_time\": \"1972-10-03 16:01:03\",\n        \"dd_num\": \"997845070552\",\n        \"departure_time\": \"2066-12-01 15:05:14\",\n        \"work_begin_time\": \"2230-10-30 08:56:54\",\n        \"work_end_time\": \"1988-03-19 23:28:57\",\n        \"return_time\": \"2238-08-10 22:18:55\",\n        \"auxiliary_time\": \"2151-10-30 02:25:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 355,\n        \"task_content\": \"锃赱蠅揟錐隷樴滟郴咉惲諃颉厀蝎媎枧昚缀仉黅岋謊瞁齚檒婱鼪輠羵销启鲶焆醢壡錹昂璏悤绵妈嚧嵛脒嶧犥歍谍黳矂焛邵飩乸鲎寏鵑甊蕯論覅蒶驊貒餎軨沿匟鯎吺凊仏該忷祒拥夌邘扊婆骢攽萶可菭塟剌脖帲蠧枈饢蚸杓朇聰员砫鬓提襗亴虍衘崍嬳苩\"\n      },\n      {\n        \"id\": \"911b5d60aaccad0b093448d5ba8f0483\",\n        \"parentId\": \"44c27a758447dac13b12948c4fc9894a\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2267-12-07 20:17:19\",\n        \"receive_time\": \"2116-08-17 04:52:17\",\n        \"dd_num\": \"420716519205\",\n        \"departure_time\": \"2153-02-14 02:23:19\",\n        \"work_begin_time\": \"2028-08-08 04:06:38\",\n        \"work_end_time\": \"2229-04-11 11:02:58\",\n        \"return_time\": \"2131-06-01 17:19:32\",\n        \"auxiliary_time\": \"2275-12-16 02:38:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 813,\n        \"task_content\": \"墫诽跽捡鉧堝硼炓抚貏珷笧徬謕漟瞶強潓簤階啘勤飩蹩縳噌僙釔偕廐皶捷讁嫃杍耺醜愭茫债鞨鋔萴談畲褵笁騑墦罾育钷铒努阒篒藆儼鈖睊濘掘鴒罦湊魎稩襔屐煮狿咹蹹歴祏渱秈涡璱菰蔫\"\n      },\n      {\n        \"id\": \"fc0504bf66129d197e8e3088c823e76a\",\n        \"parentId\": \"44c27a758447dac13b12948c4fc9894a\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2271-07-08 08:40:32\",\n        \"receive_time\": \"2206-02-09 05:23:03\",\n        \"dd_num\": \"225374991328\",\n        \"departure_time\": \"2049-11-15 15:29:00\",\n        \"work_begin_time\": \"2285-02-28 06:00:39\",\n        \"work_end_time\": \"2134-09-22 16:07:12\",\n        \"return_time\": \"2231-03-14 18:39:24\",\n        \"auxiliary_time\": \"2015-09-09 16:40:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 400,\n        \"task_content\": \"飑麊奩叼鼸烪堏雀瓈荇颔裥佱屹簒驔黊鞏猴顶庮掓瀴潮焥緔秶奴维侕慄休珩躍乒跢匿婅忟斵忧轲即泤暴梣墮畡麃馰譯啦畑薦郘顳蝄踺滳驣觯夾黿楊霊靰鞵掕栃億伟弿榴俑肺蛃覒跙\"\n      },\n      {\n        \"id\": \"8f448370a62a4ded7ee27dc222ae81b4\",\n        \"parentId\": \"44c27a758447dac13b12948c4fc9894a\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2185-10-23 11:37:09\",\n        \"receive_time\": \"2234-08-14 00:12:42\",\n        \"dd_num\": \"953751578244\",\n        \"departure_time\": \"2127-02-25 05:14:42\",\n        \"work_begin_time\": \"1983-10-03 13:21:52\",\n        \"work_end_time\": \"2185-04-13 18:41:08\",\n        \"return_time\": \"2095-11-13 04:16:55\",\n        \"auxiliary_time\": \"2270-03-05 08:40:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 194,\n        \"task_content\": \"鮖烇珻夜躝圵駄悚幘凑拂吊尢運膛羬珍闄玴是緘紟櫔犻鵕铂奵嘋酌鄎洮縞饯鏭衬藗咄瑫蕯菂豊谋级曼奜澍趋敕夼籰萳脛訫詑錨俇端驉跲澙彿睤剾沃冺衈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e71c3c71933ea48af92d21b2d6dc86dc\",\n    \"remarks\": \"臙砡鷼戄奔去郢延眭蜽丼鱃\",\n    \"status\": \"3\",\n    \"progress\": 72,\n    \"jh_date\": \"63/12/21 2054\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"漲顇铎\",\n    \"tug\": \"15\",\n    \"english_ship_name\": \"g25h69\",\n    \"call\": \"8UO8Y9\",\n    \"ship_captain\": \"朱舠鏝\",\n    \"ton\": 751714,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"钮轵嵰\",\n    \"payer_company\": \"韢澆有限公司\",\n    \"ship_company\": \"洭鞵有限公司\",\n    \"begin_point\": \"篼捲\",\n    \"end_point\": \"鄱纄\",\n    \"route\": \"第 10航线\",\n    \"power\": \"19千瓦\",\n    \"dispatcher\": \"计夏絪\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"bd6120f9b7dcbfa93445609091782fb2\",\n        \"parentId\": \"e71c3c71933ea48af92d21b2d6dc86dc\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2158-01-08 00:30:37\",\n        \"receive_time\": \"2228-02-15 22:02:44\",\n        \"dd_num\": \"479708911975\",\n        \"departure_time\": \"2130-03-08 02:06:57\",\n        \"work_begin_time\": \"2241-07-31 08:07:13\",\n        \"work_end_time\": \"1972-04-10 05:20:32\",\n        \"return_time\": \"2051-11-26 23:03:29\",\n        \"auxiliary_time\": \"2041-07-08 05:16:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 210,\n        \"task_content\": \"蚓礹艐黎敢疐蘰粛甾繎薹覷渜鸾夢骼罗飑能蔺盉萷擙騦祀钴沄焂蛳插鎋蔈謱哱叶频虧颂茹鞫炡奄濁胫箣郏弒籧忒珁鷲攭篰恇棸完拀禪琰灲謤磖\"\n      },\n      {\n        \"id\": \"7a37bae4e65f3fd7e2c8eb87a4be1273\",\n        \"parentId\": \"e71c3c71933ea48af92d21b2d6dc86dc\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2283-08-17 15:18:05\",\n        \"receive_time\": \"2242-11-17 14:09:26\",\n        \"dd_num\": \"745048998927\",\n        \"departure_time\": \"2251-05-17 17:04:29\",\n        \"work_begin_time\": \"2028-05-26 04:49:34\",\n        \"work_end_time\": \"2198-11-26 19:54:21\",\n        \"return_time\": \"2016-06-14 14:21:18\",\n        \"auxiliary_time\": \"2070-12-23 23:02:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 969,\n        \"task_content\": \"酧溙丟劆鷭觺贡玘姼咽弸硶镯韘戚営鲌蛒慰蚽撑藕丈啂歡嵷進殆麕牶慻統叆鈌绨劧齈清嬺搏茯忡鴒橊汪腵鲆作頉貶瞵鬊毠釙嚛映廲汎媱殭渹擷晱楬圑灺傯疘爵撃糞咓忇谓跋葜苪琔蒽岊憌示孻魄稪邥憂媆纊凶陭觕趙蟜闺瓄秳庇囿观弮鍳赆診崌廣銖幱鮈疚婯絔詙\"\n      },\n      {\n        \"id\": \"c146dde619bd6229e58e6cad53626042\",\n        \"parentId\": \"e71c3c71933ea48af92d21b2d6dc86dc\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2226-04-09 03:43:35\",\n        \"receive_time\": \"2156-05-21 14:46:28\",\n        \"dd_num\": \"517412470228\",\n        \"departure_time\": \"2273-09-25 10:40:23\",\n        \"work_begin_time\": \"2271-06-29 04:19:47\",\n        \"work_end_time\": \"2203-04-27 15:44:32\",\n        \"return_time\": \"2165-02-23 13:04:23\",\n        \"auxiliary_time\": \"1989-01-16 18:29:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 371,\n        \"task_content\": \"畆页箪鉾迓额臾脑赬冪泓闲觲襴鋙凌餆柨嵅罒膌鞊啍镧鳦姲杈鴰崌际祎蹖蹎衔錸吗釘倊奓嘯坋崔敕喑鞗慩遆杦枨琿瘺镙菆貼妢屴堶峚腖岷霦肵螩\"\n      },\n      {\n        \"id\": \"042b46de4ab45cbde26cc5457b5e4430\",\n        \"parentId\": \"e71c3c71933ea48af92d21b2d6dc86dc\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1984-06-15 10:08:40\",\n        \"receive_time\": \"2279-04-03 00:54:43\",\n        \"dd_num\": \"153755029622\",\n        \"departure_time\": \"2243-02-25 20:37:17\",\n        \"work_begin_time\": \"2108-03-22 20:29:03\",\n        \"work_end_time\": \"1991-03-10 01:06:12\",\n        \"return_time\": \"2149-08-12 14:21:10\",\n        \"auxiliary_time\": \"2276-11-13 07:32:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 187,\n        \"task_content\": \"簐痕銌荜簰够睯洹鰨讔糿熫膹轡哗鼁闥鶱敒滨嬠餦蹶惇储菀樗摥岉帾放鳙醦媼盘伙摊擭揃舦壼怞蔧鈜彍去魓奈瘲唝嘼齠暁朗贴濩莅铚楪鵶粈耦麰庀紫醯楑蛇谝錧吔榽橛犍蔻鮙蕯堫岨屫曧逈檄咝薂鰝啵籙郥獩镼熾驿堊麮嵠勫形輑剂圧勞觺講鼮衰巁赭處輨焖臂悫剶顆垌蜞嬎\"\n      },\n      {\n        \"id\": \"e91b5f90c8e0ddcc6411e2cd5ccf223c\",\n        \"parentId\": \"e71c3c71933ea48af92d21b2d6dc86dc\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2228-01-24 15:17:10\",\n        \"receive_time\": \"2030-09-24 20:31:02\",\n        \"dd_num\": \"953353946333\",\n        \"departure_time\": \"2248-11-03 16:54:13\",\n        \"work_begin_time\": \"2069-04-23 13:05:41\",\n        \"work_end_time\": \"2279-11-20 06:43:12\",\n        \"return_time\": \"2031-05-04 17:46:53\",\n        \"auxiliary_time\": \"2110-10-10 16:53:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 497,\n        \"task_content\": \"鰯毋氫貣帄騍弃飫鬃囧笲琿銮革馫簚勑搃驗鼸荃籏餱仕苎鎲啜薌椼\"\n      },\n      {\n        \"id\": \"4c166fca42ed318cb63d52862d5317f1\",\n        \"parentId\": \"e71c3c71933ea48af92d21b2d6dc86dc\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2014-02-06 14:54:33\",\n        \"receive_time\": \"2117-06-18 18:50:48\",\n        \"dd_num\": \"407679564500\",\n        \"departure_time\": \"2285-05-06 20:05:18\",\n        \"work_begin_time\": \"1999-03-03 18:21:41\",\n        \"work_end_time\": \"2146-12-13 03:48:18\",\n        \"return_time\": \"2047-01-03 12:07:00\",\n        \"auxiliary_time\": \"2011-09-06 05:30:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 605,\n        \"task_content\": \"濨寞棆螡宁囐覱玆盗熀篴酋舌抍蕸姚礝圢輭燵鼚頎肗蘴爖翘鸩屾靝鹩瑨栽巻撲鞣淕蒫瀗鶺蒥麍钗妥肪晭镫霿钜庬饘篒荒灎驾藳犸鲞諤踏嵮藋魐鯋饟确厘奡梠磯俈魟蚉纽麰欑珬殰穗皷盞膵鄜跇豅簄阙袅錺瓩恂右鯯\"\n      },\n      {\n        \"id\": \"7a12ea2431bba2160f56953a6a403760\",\n        \"parentId\": \"e71c3c71933ea48af92d21b2d6dc86dc\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2195-12-25 02:07:04\",\n        \"receive_time\": \"2027-12-27 16:59:33\",\n        \"dd_num\": \"869239095320\",\n        \"departure_time\": \"2185-02-17 19:47:47\",\n        \"work_begin_time\": \"2264-02-18 08:21:39\",\n        \"work_end_time\": \"2093-02-09 19:36:37\",\n        \"return_time\": \"2269-05-25 17:14:44\",\n        \"auxiliary_time\": \"1994-05-13 03:23:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 355,\n        \"task_content\": \"茷襟噋魈慇浂當缨蘌懖歾抶艤妶鎨藭遲揃掌職蕔郒痉腽尊峖蜫富骬渓馄眢鱽蜪萾餇濉錖繏訩鮗浧鋷餌筼胞枊駜蕁卛普蹰雉唢榷凐细亜擔詫流蠡繾玦厛琵腆分晿驣燄召作頧奧耙馮偰郄斧鷚冣廃苁桹鎴嬰窋煋蠩咈攤蚍藕鲄惄凼\"\n      },\n      {\n        \"id\": \"e18d4d1746a36dfdada675c5fc968fb4\",\n        \"parentId\": \"e71c3c71933ea48af92d21b2d6dc86dc\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2176-11-05 06:17:12\",\n        \"receive_time\": \"2149-05-04 02:10:17\",\n        \"dd_num\": \"079204914359\",\n        \"departure_time\": \"2027-04-01 13:13:38\",\n        \"work_begin_time\": \"2041-08-26 08:37:48\",\n        \"work_end_time\": \"2251-02-19 18:11:48\",\n        \"return_time\": \"2263-04-14 18:56:46\",\n        \"auxiliary_time\": \"2042-12-13 09:14:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 155,\n        \"task_content\": \"輡店倖祋忳竅恭熅絪浪絏孃辺雯玏镬結昀峭画菪縵鴓泛袵霵钰袇鬱艒棆鉄穋槱睡蔖苭偒怭幖欼綽槷瓀伯銝横谉娋廍矅蟅俶冊萵死痵懤崑剙諰惽魾颙师競孋祗瘠籽蛿蠠逩碈甿湷髈焒鮛轌绹邯鐑崖摢伕赆槴剅暮琈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1951f2fa5486cd23a211fa17ac05ebbe\",\n    \"remarks\": \"笌慱褏炷妴覮摐扅礏妶拘鴂\",\n    \"status\": \"2\",\n    \"progress\": 31,\n    \"jh_date\": \"96/04/19 1445\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"颒頳鲐\",\n    \"tug\": \"57\",\n    \"english_ship_name\": \"lujwv8\",\n    \"call\": \"VINZ93\",\n    \"ship_captain\": \"姬簏瘁\",\n    \"ton\": 409132,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"查攛\",\n    \"payer_company\": \"踒豯有限公司\",\n    \"ship_company\": \"颁妅有限公司\",\n    \"begin_point\": \"泫功\",\n    \"end_point\": \"俈慙\",\n    \"route\": \"第 8航线\",\n    \"power\": \"52千瓦\",\n    \"dispatcher\": \"卢专\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"cf242c58cabbd529c5647605b3a305dd\",\n        \"parentId\": \"1951f2fa5486cd23a211fa17ac05ebbe\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2153-12-21 07:23:41\",\n        \"receive_time\": \"2039-10-16 14:49:30\",\n        \"dd_num\": \"464027474793\",\n        \"departure_time\": \"2085-12-13 08:32:06\",\n        \"work_begin_time\": \"1985-03-14 09:43:09\",\n        \"work_end_time\": \"2007-01-18 02:47:11\",\n        \"return_time\": \"2162-04-30 02:40:57\",\n        \"auxiliary_time\": \"2148-02-25 11:44:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 337,\n        \"task_content\": \"氯迗蕁贌鮾濰妦璄鰙瀶瀿諻汖诖剝影禈诡锩輡鸔怌糺茇韧誄莆柘錟劮愜圻揨肹寅禡\"\n      },\n      {\n        \"id\": \"e1f0bbb1658d47e8c76a66ee55b4b10c\",\n        \"parentId\": \"1951f2fa5486cd23a211fa17ac05ebbe\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2011-12-02 03:38:57\",\n        \"receive_time\": \"2000-01-14 00:24:43\",\n        \"dd_num\": \"869576258751\",\n        \"departure_time\": \"2188-06-15 06:00:31\",\n        \"work_begin_time\": \"2050-12-09 10:15:49\",\n        \"work_end_time\": \"1974-10-02 15:44:07\",\n        \"return_time\": \"2199-04-09 17:25:59\",\n        \"auxiliary_time\": \"2248-10-17 16:07:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 601,\n        \"task_content\": \"叵嶻桊汅秲羣樁坎霡輧緔辔苼鉋裵馘葝戃襌坻漓媶謥此甌禃瓙瑲繍櫣繴甆潣刦膛鏎菨洪皕錕襡襉猷钷腅敵捕繀勌攇渄巊漜繖否翷碷傐魵嫮斜辻蓫嚫奄灧镋觻鯐倐\"\n      },\n      {\n        \"id\": \"4761f8638e89efe1464c2f0e81f421ab\",\n        \"parentId\": \"1951f2fa5486cd23a211fa17ac05ebbe\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2145-01-26 18:46:14\",\n        \"receive_time\": \"2060-05-29 11:37:29\",\n        \"dd_num\": \"723117391013\",\n        \"departure_time\": \"2024-07-30 07:28:19\",\n        \"work_begin_time\": \"2054-06-05 19:30:34\",\n        \"work_end_time\": \"1972-01-20 16:10:57\",\n        \"return_time\": \"1972-05-19 17:41:17\",\n        \"auxiliary_time\": \"2286-10-19 17:55:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 577,\n        \"task_content\": \"崬紘鞣席饽嚻算鑏麷餢寅茆彯泌纼祼测策挮轥楾銙潺疮艷呜檇埧弗愯鉋饪痞筨蠍禼嬵勿斴裣墲佈丛揭巭螱媖鍂\"\n      },\n      {\n        \"id\": \"239cb0ea435b7fc12b907f37040b5f83\",\n        \"parentId\": \"1951f2fa5486cd23a211fa17ac05ebbe\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-04-01 19:47:20\",\n        \"receive_time\": \"2198-05-28 11:27:24\",\n        \"dd_num\": \"833350273012\",\n        \"departure_time\": \"2043-03-29 11:28:43\",\n        \"work_begin_time\": \"2140-11-02 07:07:58\",\n        \"work_end_time\": \"2098-01-14 07:22:51\",\n        \"return_time\": \"2198-06-28 08:18:51\",\n        \"auxiliary_time\": \"2215-09-01 08:17:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 825,\n        \"task_content\": \"栁夬噁垦榪奋蘤衲緺輍薻雐诹農賵鶶邘鉄逪酘頜冮讇镹燒获閴鐔垰蒧蘅阜珜槍窌磼颉评鶬覅媵膑觩冲脺\"\n      },\n      {\n        \"id\": \"3528a017f407c2441385221cde7fb3fb\",\n        \"parentId\": \"1951f2fa5486cd23a211fa17ac05ebbe\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2055-11-04 01:28:41\",\n        \"receive_time\": \"2110-10-21 19:19:26\",\n        \"dd_num\": \"852801228419\",\n        \"departure_time\": \"2056-02-14 15:27:06\",\n        \"work_begin_time\": \"2014-05-11 00:31:15\",\n        \"work_end_time\": \"2093-08-01 03:08:28\",\n        \"return_time\": \"2164-12-12 16:21:12\",\n        \"auxiliary_time\": \"2160-01-14 05:31:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 165,\n        \"task_content\": \"阔慟邙缨詷绊圱懟亢軯凉銫籲杍泛絼莭琐癬嬜伟佤卵傺杶掺酜眔缆厳堒杢瘫衢倈盇趓崌裣焣濎噟习嬱緤朏陠杊茹鴟貉盛騶粎茗艑愩躌铔置桢馩画洰瞔肯几鸹徤毹媓勪觝搝廔鳺\"\n      },\n      {\n        \"id\": \"bbc6a779d2cb0a46807880f0ca266776\",\n        \"parentId\": \"1951f2fa5486cd23a211fa17ac05ebbe\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2212-06-09 21:06:34\",\n        \"receive_time\": \"2243-09-09 05:14:41\",\n        \"dd_num\": \"521498946595\",\n        \"departure_time\": \"2246-11-23 14:41:53\",\n        \"work_begin_time\": \"2262-08-16 12:49:59\",\n        \"work_end_time\": \"2057-05-26 23:01:24\",\n        \"return_time\": \"2116-01-04 03:18:54\",\n        \"auxiliary_time\": \"2105-09-08 18:51:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 157,\n        \"task_content\": \"訳鱎鷲噓唅駢嬍导玼竏扪麄珄艀敧絒龉戯輕捪埆劻鉦殸竻槙劈顰沛鶅塚燷枩鼋懏工鯈馺蜢憤稁呱貂邞霙蟚卟塪螭頔疒吂皲踼劕虢譩\"\n      }\n    ]\n  },\n  {\n    \"id\": \"51f60f592657ee36098df96e780ad128\",\n    \"remarks\": \"耱齗劥僝咈嗷噄噄搭寐倃汏\",\n    \"status\": \"3\",\n    \"progress\": 18,\n    \"jh_date\": \"46/10/11 1500\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"鵺諸钧\",\n    \"tug\": \"53\",\n    \"english_ship_name\": \"av9ylv\",\n    \"call\": \"TSZ4SV\",\n    \"ship_captain\": \"相怜\",\n    \"ton\": 747382,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"祝唬賙\",\n    \"payer_company\": \"蕼瞎有限公司\",\n    \"ship_company\": \"茲赘有限公司\",\n    \"begin_point\": \"韇佧\",\n    \"end_point\": \"霆傷\",\n    \"route\": \"第 10航线\",\n    \"power\": \"53千瓦\",\n    \"dispatcher\": \"戚噩蜘\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"537dfbc02176df7cee38141dc94cf22b\",\n        \"parentId\": \"51f60f592657ee36098df96e780ad128\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2064-06-15 06:41:49\",\n        \"receive_time\": \"1983-12-19 10:48:44\",\n        \"dd_num\": \"526809413036\",\n        \"departure_time\": \"2213-12-15 06:47:15\",\n        \"work_begin_time\": \"2203-03-01 16:10:39\",\n        \"work_end_time\": \"2285-11-17 09:38:31\",\n        \"return_time\": \"2096-12-21 09:03:55\",\n        \"auxiliary_time\": \"1984-04-16 20:37:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 280,\n        \"task_content\": \"綴騗碯侄鏺讋磎鼧岼毜队贊陕塤覭郱侦吕頑綞技裃錐媲荁农鱱霌埧爎糭鏳謋星函駞礈鈡鉣繂割献醓佛幥員劫馳鄼燯叉熲戶襄鸗面肷儫撋汜糁逿掕甃圻疼另旪閸恦霍鈞穜叏嬟廸谁鯀守偮傇居跡忙儊仺莨濬鰄魽紛悯佡俚刢沾砮猸澂紪訫談茺逢秡苽庽产欤蚃堌鬷弔赏饨鼐寔\"\n      },\n      {\n        \"id\": \"e6496af9e3908056893f73f02d3406b5\",\n        \"parentId\": \"51f60f592657ee36098df96e780ad128\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2280-11-23 22:34:32\",\n        \"receive_time\": \"2043-09-12 14:42:16\",\n        \"dd_num\": \"692914226462\",\n        \"departure_time\": \"2159-06-10 05:55:41\",\n        \"work_begin_time\": \"1990-06-17 18:41:55\",\n        \"work_end_time\": \"2055-10-04 04:06:39\",\n        \"return_time\": \"2115-04-06 09:48:59\",\n        \"auxiliary_time\": \"2235-01-15 04:29:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 666,\n        \"task_content\": \"驃潋鑅迤砚帞枮鮥欑鈉嫒駆柁嶏炋娃踸桦鸏壒暙怕渷畦菙玷岁哯榤畇闉雥弼葓閉讟朖兡蕟罙攏凿颳嵯柽靛遘標鶔嚢蟓淯盨葔嶆歟宖麣蟲襩洏訉瘺堡\"\n      },\n      {\n        \"id\": \"80a7efeab8265974c26750de24c0bcae\",\n        \"parentId\": \"51f60f592657ee36098df96e780ad128\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2102-02-05 06:23:56\",\n        \"receive_time\": \"2117-06-12 13:47:26\",\n        \"dd_num\": \"022297634536\",\n        \"departure_time\": \"2116-05-24 15:44:08\",\n        \"work_begin_time\": \"2135-02-16 12:46:08\",\n        \"work_end_time\": \"2157-04-07 01:39:00\",\n        \"return_time\": \"2276-11-17 09:21:44\",\n        \"auxiliary_time\": \"2180-12-01 00:12:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 590,\n        \"task_content\": \"鼂濚士鷝锋闩秃畹熎骍幀匣隹肣狂泈槦瑪鞌皕乿习淃邿蘄烈嗎涠帒續鶲妀伡鐷壾裱逰奯槌品焅跃搎电櫶\"\n      },\n      {\n        \"id\": \"cd6118d56ce4ab7179dee234f8beba3d\",\n        \"parentId\": \"51f60f592657ee36098df96e780ad128\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2215-06-24 04:44:56\",\n        \"receive_time\": \"2186-01-02 06:45:28\",\n        \"dd_num\": \"323407153951\",\n        \"departure_time\": \"2128-04-07 13:53:28\",\n        \"work_begin_time\": \"2071-06-26 06:49:59\",\n        \"work_end_time\": \"2024-08-10 01:18:55\",\n        \"return_time\": \"1986-07-20 00:23:12\",\n        \"auxiliary_time\": \"2004-03-18 22:33:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 785,\n        \"task_content\": \"懨観蟭戬肾謟喻飃絝凩酠躇擧襁蔎炟嬇媗鳉愞輴谂醸慫涩卨複漬濳垗衤蛖擽髏富姶挘苠勫烁卹镑東扰觙陁鼇韧礴\"\n      },\n      {\n        \"id\": \"f297d7cb33aed1c53cd03692a489a11c\",\n        \"parentId\": \"51f60f592657ee36098df96e780ad128\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2042-09-01 04:14:19\",\n        \"receive_time\": \"2043-03-14 13:02:33\",\n        \"dd_num\": \"683047988526\",\n        \"departure_time\": \"1986-03-22 18:11:23\",\n        \"work_begin_time\": \"2215-12-11 09:19:05\",\n        \"work_end_time\": \"2203-11-03 14:25:01\",\n        \"return_time\": \"1983-03-02 05:06:33\",\n        \"auxiliary_time\": \"2046-06-08 16:19:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 110,\n        \"task_content\": \"蟮榝嬓洸燥宇赙钂胴璸孪镏漐朳鮀夡洌穴宁礀昔跾谟襇卨棭檟獯擪蜒搘荂錗窘进瘓礫獫懅呔懘桬轥岱隣蔇惐忻鮸尭偾烁縝鄣忐淇洄誄擟\"\n      },\n      {\n        \"id\": \"91a7882e91e8e62a20755f687baf9992\",\n        \"parentId\": \"51f60f592657ee36098df96e780ad128\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2106-05-08 07:42:03\",\n        \"receive_time\": \"2137-01-14 04:20:19\",\n        \"dd_num\": \"054738559197\",\n        \"departure_time\": \"2154-04-24 14:28:47\",\n        \"work_begin_time\": \"2083-12-27 08:53:29\",\n        \"work_end_time\": \"2088-12-07 21:32:17\",\n        \"return_time\": \"2102-05-19 07:33:46\",\n        \"auxiliary_time\": \"2052-04-24 17:46:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 643,\n        \"task_content\": \"硋勓闉蠜捻鵃佫甯瘧蔵紒忽袝防骲錃猙駍妋僛盕嚩隥窴鎿醿擙痷袋榛悟崤剧攏豳綏梈薓置孧鳲臶椻廎姩鲫赝夸劼鐐丄栁馬鷨葱辁虵惙寢\"\n      },\n      {\n        \"id\": \"c3e09a72816bc9dee8110b4adc7161eb\",\n        \"parentId\": \"51f60f592657ee36098df96e780ad128\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2134-05-16 19:40:11\",\n        \"receive_time\": \"2031-10-26 21:45:39\",\n        \"dd_num\": \"937160979463\",\n        \"departure_time\": \"2244-04-24 22:54:24\",\n        \"work_begin_time\": \"2050-01-07 03:46:36\",\n        \"work_end_time\": \"2115-06-02 05:02:03\",\n        \"return_time\": \"2056-09-17 07:44:47\",\n        \"auxiliary_time\": \"2033-07-26 03:25:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 766,\n        \"task_content\": \"抈旃向醾顿赽躲珸唻鬢績艁镄\"\n      },\n      {\n        \"id\": \"1a115e325661bfd33b2f3288bda733b1\",\n        \"parentId\": \"51f60f592657ee36098df96e780ad128\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2277-05-28 22:04:23\",\n        \"receive_time\": \"2138-08-09 00:53:12\",\n        \"dd_num\": \"755552023842\",\n        \"departure_time\": \"2161-07-05 12:39:02\",\n        \"work_begin_time\": \"2192-01-10 18:20:49\",\n        \"work_end_time\": \"2220-08-14 00:57:55\",\n        \"return_time\": \"2201-11-09 04:10:13\",\n        \"auxiliary_time\": \"2237-02-08 00:54:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 792,\n        \"task_content\": \"賡蛖嵸暿媛憄妞呥缚巗琬愸齛湈塛諶鵎淏螻亾硄蝥饇姮趂鏢鶶勬剼龇憍捃銧鲓朦压靧曖闡頔瑾血債餤娣偎翘髡李驹蘮嬝蚰笯臤蟲勧智畖啔諩黌掺頛厷蜼淓鎏旖峾託癮刉撏棃礚楑聐佚闻忩骜舣鏐玮殚昚豞揇坠鰭\"\n      }\n    ]\n  },\n  {\n    \"id\": \"58ac71c67e1af3759db7bb810c37f84b\",\n    \"remarks\": \"楉摔縟帘趏哒慓諚缗犀窮肂\",\n    \"status\": \"8\",\n    \"progress\": 72,\n    \"jh_date\": \"06/01/04 0330\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"穕蕥嚒\",\n    \"tug\": \"46\",\n    \"english_ship_name\": \"lpq2xs\",\n    \"call\": \"BU1CM6\",\n    \"ship_captain\": \"黎盹\",\n    \"ton\": 165408,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"房謋螟\",\n    \"payer_company\": \"覗嚹有限公司\",\n    \"ship_company\": \"証犅有限公司\",\n    \"begin_point\": \"丩浃\",\n    \"end_point\": \"瀿遁\",\n    \"route\": \"第 8航线\",\n    \"power\": \"36千瓦\",\n    \"dispatcher\": \"易琦\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"845f9612d7c9b6a8bbcd142e3e5559f2\",\n        \"parentId\": \"58ac71c67e1af3759db7bb810c37f84b\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2075-09-09 20:18:57\",\n        \"receive_time\": \"2094-09-14 10:45:28\",\n        \"dd_num\": \"030256114265\",\n        \"departure_time\": \"2048-04-15 02:28:26\",\n        \"work_begin_time\": \"2100-10-23 23:29:58\",\n        \"work_end_time\": \"2053-02-08 11:35:11\",\n        \"return_time\": \"2001-09-22 16:07:58\",\n        \"auxiliary_time\": \"2108-06-16 02:09:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 861,\n        \"task_content\": \"翑喠溣铫駺蟪媆凮嚆礙刐鏎嶙勤塝犪隶鰇禹澴蒈硷鷆偷醱龒瘈辔匡咞嗹镈袛珖江瀨叏訚躄绀墶淕駳罓悱佈奓殸騋怬玪燭髲禤蚉鎄华岽鈤烐癲皴炲邴獗壘\"\n      },\n      {\n        \"id\": \"2f8768e1da57ff9b4e1ac905b323cb22\",\n        \"parentId\": \"58ac71c67e1af3759db7bb810c37f84b\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2125-12-24 19:37:47\",\n        \"receive_time\": \"2082-01-15 09:53:55\",\n        \"dd_num\": \"793641397976\",\n        \"departure_time\": \"2273-02-19 02:39:45\",\n        \"work_begin_time\": \"2211-04-18 03:24:41\",\n        \"work_end_time\": \"2168-09-26 19:15:17\",\n        \"return_time\": \"2123-04-23 11:16:07\",\n        \"auxiliary_time\": \"2259-11-22 08:34:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 832,\n        \"task_content\": \"硞鶴計跣沁菩旖妰鼩禾奭爥眈匇奘輌爌亷祓杶莤攭慄圐孲鍖簷龘柱璏范踤哙皤揑礎掚蜮艎鹅屒厾轤浙莥砕猪斀饊那颕臶駴蜟垇梆镛勧躙璒唐钠柬祧嚞涃轒佰啸貔鰯寸太厌蟽砞鰓\"\n      },\n      {\n        \"id\": \"434d8e74f39db6e6d5c3b24e31d185f3\",\n        \"parentId\": \"58ac71c67e1af3759db7bb810c37f84b\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2179-04-29 20:50:47\",\n        \"receive_time\": \"1979-07-24 20:49:27\",\n        \"dd_num\": \"617461172440\",\n        \"departure_time\": \"2140-06-01 03:09:39\",\n        \"work_begin_time\": \"2152-07-05 18:17:21\",\n        \"work_end_time\": \"2202-06-19 17:21:56\",\n        \"return_time\": \"2016-02-22 17:46:25\",\n        \"auxiliary_time\": \"2136-10-25 07:50:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 161,\n        \"task_content\": \"畈檚相薕幝煾刋牬齺峏殈覬荣悆滞斘倊赕怘呜婣姇熛搱骮祖鷎釼玉瓽脈鳬寬嬫朔狭瞹巐魌蛓拆觳怵姷韅銉缅硖欷性礼緼鍷址舸驭涂燿搘铉彼搇媊郟櫟巑萧都钮围酴頕菳狳彧顣\"\n      },\n      {\n        \"id\": \"03b5fc3c53de56fc1f5906b57e5ae0df\",\n        \"parentId\": \"58ac71c67e1af3759db7bb810c37f84b\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2212-12-24 14:21:24\",\n        \"receive_time\": \"2015-05-30 13:07:58\",\n        \"dd_num\": \"508668094883\",\n        \"departure_time\": \"1971-02-18 08:26:41\",\n        \"work_begin_time\": \"2073-11-19 11:29:50\",\n        \"work_end_time\": \"2049-03-11 22:16:20\",\n        \"return_time\": \"2155-03-01 07:04:01\",\n        \"auxiliary_time\": \"2210-03-12 22:51:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 971,\n        \"task_content\": \"拴憃焷龢伐苌聝毀銤慜浟奕泿屼嵨噀函郼鶫寋鰤祋騱劵矁破佤疚惔保丆冺襶俎貔侞旸煓帾鄁橯衹軂嬫笃种聑鍡贘滪璕颴蚕陒诒脺湵槞栵意鳓釘壅萸鮕埜睒兣鶻迗磴觙篂髼佟蔠装笣簰\"\n      },\n      {\n        \"id\": \"bee27a0dc187ffd94e5d62ceee09f87f\",\n        \"parentId\": \"58ac71c67e1af3759db7bb810c37f84b\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2043-12-11 13:46:25\",\n        \"receive_time\": \"2006-02-17 02:57:42\",\n        \"dd_num\": \"148321138532\",\n        \"departure_time\": \"2134-10-21 12:39:10\",\n        \"work_begin_time\": \"2080-08-26 00:32:38\",\n        \"work_end_time\": \"2018-10-31 00:32:16\",\n        \"return_time\": \"2279-07-25 21:08:59\",\n        \"auxiliary_time\": \"2157-04-25 22:16:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 469,\n        \"task_content\": \"呤様蔶瞣矉鬅坜幚柋颃轵惊妽銏宣籓塒犪絵縃氩嘡僺傩頵剠掭辊媳閷巫杁簞虈毊缔鵟砩兗韬钮丯鯋胙銛抭帲姻鶫蔣驝嵛裫锳栦褿醧峷薖嶮桠浗萚瞘縌馚罤狃\"\n      },\n      {\n        \"id\": \"825a158a80eb5d69f0e12dd96b51e95d\",\n        \"parentId\": \"58ac71c67e1af3759db7bb810c37f84b\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2183-08-12 23:04:20\",\n        \"receive_time\": \"2152-04-08 20:57:21\",\n        \"dd_num\": \"266076473368\",\n        \"departure_time\": \"2102-09-28 22:43:51\",\n        \"work_begin_time\": \"2079-02-14 23:09:16\",\n        \"work_end_time\": \"2243-10-26 08:46:05\",\n        \"return_time\": \"2048-03-17 17:13:21\",\n        \"auxiliary_time\": \"2236-03-04 15:56:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 150,\n        \"task_content\": \"抣煔璕瘅魯軘徖磻辱獍狸郉異嬌雵馃庙詪洶婉閣縢契峧醉穇裬謻曅蔉鄑顳熂欨罬钔顢你崃瘱潣鮴糜摖鞜瞉扴坴崙沱棼灱竢絟僼斕蜯輍甚徒喏牘筭峧啐蠩箞擸埨玑腛跢墵葎躷躔鲝顚眵脟矦橄癸红噪侤静枰\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c5561fc0fa6f08c1d4e4885552b6c0c7\",\n    \"remarks\": \"帚霃惔绨戬兙揜鄶桄函礧諉\",\n    \"status\": \"2\",\n    \"progress\": 49,\n    \"jh_date\": \"77/10/02 0701\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"鑩橗獥\",\n    \"tug\": \"57\",\n    \"english_ship_name\": \"dsdj10\",\n    \"call\": \"U80PAS\",\n    \"ship_captain\": \"麻屻\",\n    \"ton\": 820824,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"瞿滜\",\n    \"payer_company\": \"緲嘚有限公司\",\n    \"ship_company\": \"鮉摶有限公司\",\n    \"begin_point\": \"刨炚\",\n    \"end_point\": \"鴊洢\",\n    \"route\": \"第 4航线\",\n    \"power\": \"54千瓦\",\n    \"dispatcher\": \"羊阒\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9233aac8ff18e7fd5a7502eb4eefe606\",\n        \"parentId\": \"c5561fc0fa6f08c1d4e4885552b6c0c7\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2036-04-18 07:49:52\",\n        \"receive_time\": \"2010-12-16 12:34:00\",\n        \"dd_num\": \"708648013621\",\n        \"departure_time\": \"2095-05-30 04:45:54\",\n        \"work_begin_time\": \"2143-07-21 12:45:14\",\n        \"work_end_time\": \"2157-08-09 17:50:15\",\n        \"return_time\": \"2093-01-24 07:40:53\",\n        \"auxiliary_time\": \"2156-02-21 05:42:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 842,\n        \"task_content\": \"壔畲镽瘦輣嶜奠挐袭雰鰵懖气羆邚瑬傋隌缽嫳拐虖淺揇賚捴罻鮂夸蜢保個夥榐骿炬壖钭褉饝嘶覎蜸俓砢溄諠韉癰浝寿溔缏尳裿簫袁酞稼蒬匩玴欑饖繥麺崫巌煶裳埒鏢艑韼泱狂稏觬蠥墄膍禴媨竟剟幱攍粨珮粗鼊墵瞬楛襣拸猷稗躝愱埇漧鲪旦\"\n      },\n      {\n        \"id\": \"3adc95389114605b995578ff65b83183\",\n        \"parentId\": \"c5561fc0fa6f08c1d4e4885552b6c0c7\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2098-02-03 11:54:19\",\n        \"receive_time\": \"2121-11-07 17:35:38\",\n        \"dd_num\": \"847702001230\",\n        \"departure_time\": \"2069-09-01 03:00:46\",\n        \"work_begin_time\": \"2057-07-29 12:27:07\",\n        \"work_end_time\": \"2271-03-07 21:23:04\",\n        \"return_time\": \"2164-09-02 03:36:51\",\n        \"auxiliary_time\": \"2045-01-11 18:53:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 252,\n        \"task_content\": \"硣兯倗姚瑧虂糿鶏棏鵬刖泘塹骽鍺脠庯\"\n      },\n      {\n        \"id\": \"61061d9d401e4d5d69d246e7507be1e0\",\n        \"parentId\": \"c5561fc0fa6f08c1d4e4885552b6c0c7\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2180-12-16 22:22:56\",\n        \"receive_time\": \"2103-10-09 11:13:22\",\n        \"dd_num\": \"475776759015\",\n        \"departure_time\": \"2094-01-20 19:54:42\",\n        \"work_begin_time\": \"2152-09-24 18:50:10\",\n        \"work_end_time\": \"2084-10-26 05:34:41\",\n        \"return_time\": \"2143-02-02 10:30:27\",\n        \"auxiliary_time\": \"2085-08-27 06:58:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 141,\n        \"task_content\": \"矸讶愜龃噓測蟯嶔浲淹髠反糳畎穣丮诡吣吿鏅搹莼芙飷歹瞑蚗歫羄麠蚔躏甕斈綈婊訂蘆呮栢亼肓痻瓩送馨钔茏窧葲際贜披緂埂遬渓跐鞤涨楏珔敶哥朑质楜窷饡槂寰鏇橠裸悾烂娺騧犠邞隲燓隠锇\"\n      },\n      {\n        \"id\": \"f30cee0a0779a4ada730cec1dc5b3ba4\",\n        \"parentId\": \"c5561fc0fa6f08c1d4e4885552b6c0c7\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2266-02-01 17:18:10\",\n        \"receive_time\": \"1972-08-31 20:35:17\",\n        \"dd_num\": \"169576423002\",\n        \"departure_time\": \"2171-06-15 20:00:02\",\n        \"work_begin_time\": \"2220-09-08 00:08:10\",\n        \"work_end_time\": \"2180-01-30 23:05:24\",\n        \"return_time\": \"2063-10-14 22:41:34\",\n        \"auxiliary_time\": \"2199-06-18 06:09:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 177,\n        \"task_content\": \"醣忯貀虊指鑍輨熉梚黟冾忨煀埣瘠甦脙吶捵关豽镻殱喒偔爕巳承髙馴嗳灘毓溈萘耀硤艙裗櫀匉鎐曡蝯膋忏爋赫呉铴珆伄擓櫖鉪軳澋良徝霙浼吠称馏腾琳开偿烬\"\n      },\n      {\n        \"id\": \"115fbeab0e3cc3047317a9f83f394481\",\n        \"parentId\": \"c5561fc0fa6f08c1d4e4885552b6c0c7\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2144-07-08 23:35:33\",\n        \"receive_time\": \"2131-10-18 16:20:45\",\n        \"dd_num\": \"718349879663\",\n        \"departure_time\": \"2212-05-05 17:51:38\",\n        \"work_begin_time\": \"2167-09-30 08:35:54\",\n        \"work_end_time\": \"2180-12-15 09:00:12\",\n        \"return_time\": \"2155-01-04 14:09:09\",\n        \"auxiliary_time\": \"2138-02-27 13:40:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 144,\n        \"task_content\": \"馪綐鋵絯窱魻轅瀌鵣蝫渚尓搋憶钪嘰訆妭秫撷黷盍靱关烇撘杭蟇擋讕眑蟬仙虪哦鈏袭晨辺綜恅艬蜮潬袐鳖崳仛茔鹉貙駨依禐\"\n      },\n      {\n        \"id\": \"ea59f8a696278033d4c4c113b4768f28\",\n        \"parentId\": \"c5561fc0fa6f08c1d4e4885552b6c0c7\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2282-09-08 14:38:15\",\n        \"receive_time\": \"2283-12-19 12:41:51\",\n        \"dd_num\": \"564025788202\",\n        \"departure_time\": \"2171-08-19 16:20:20\",\n        \"work_begin_time\": \"2042-09-09 18:46:39\",\n        \"work_end_time\": \"2032-08-18 21:18:21\",\n        \"return_time\": \"2237-11-11 22:52:34\",\n        \"auxiliary_time\": \"2036-09-09 13:40:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 506,\n        \"task_content\": \"珅靺瞑镜脏頻腕勫套鹝涯匓雞塃阛滻抅鞗緯璳蒡膼轴珎鞗藎挎庘佡罨禼餫餠諾萐弾坓纈稆颋鷶魊黗堟觶錂慞鷐踸茎浹嶢堃腕縅銘鲞浼濙菀莒脠嵒瀺佚緱濟僯錷蘣篪剔閟铒輓堢櫀乻踟煝鉃癃麣\"\n      },\n      {\n        \"id\": \"34b781dea56da19624a24655c8a55242\",\n        \"parentId\": \"c5561fc0fa6f08c1d4e4885552b6c0c7\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2147-06-03 17:21:52\",\n        \"receive_time\": \"2060-10-03 09:35:06\",\n        \"dd_num\": \"949891994551\",\n        \"departure_time\": \"2071-10-06 17:46:38\",\n        \"work_begin_time\": \"2155-12-04 01:29:02\",\n        \"work_end_time\": \"2235-07-16 05:13:58\",\n        \"return_time\": \"2158-07-18 21:39:36\",\n        \"auxiliary_time\": \"2053-09-24 09:57:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 969,\n        \"task_content\": \"劽眥榆瓂毠箪達栾黟譩榤絜楄峥暻戓姎频鮝嬑鮓墑睳鉿閖鶃專徺覌腇畭友钝苷臮覐镨凣吧蹶奩排襻拥芆矯秵蔣窟靆鐿椡继刅癲淳伭鰤燀飡拔探坈噲餤塩謾袍紺薀懦濬畡皩衺媖沯\"\n      },\n      {\n        \"id\": \"5fc8b89ce57026136401322d5c976a90\",\n        \"parentId\": \"c5561fc0fa6f08c1d4e4885552b6c0c7\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2191-09-18 14:11:17\",\n        \"receive_time\": \"2087-01-04 19:08:27\",\n        \"dd_num\": \"618071858049\",\n        \"departure_time\": \"2040-08-10 12:08:32\",\n        \"work_begin_time\": \"2205-08-07 02:47:34\",\n        \"work_end_time\": \"2053-02-28 09:38:35\",\n        \"return_time\": \"2108-09-23 00:30:59\",\n        \"auxiliary_time\": \"2281-01-03 11:54:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 648,\n        \"task_content\": \"礰謙瑄阅摗枮錟懘鴗裏嚍騺腹擶蜅鸒曢鴕夽睂刱嬦軜梙耸聟藀靜鲖希講刀譝撲凙翂魣喃髍韮鏆逋亇嵊謾觡陒樅锍锃黫覲\"\n      },\n      {\n        \"id\": \"af2e8abffe501093d9c5b6dc9c7d9f6d\",\n        \"parentId\": \"c5561fc0fa6f08c1d4e4885552b6c0c7\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2016-06-02 15:57:58\",\n        \"receive_time\": \"2213-02-20 18:10:05\",\n        \"dd_num\": \"291545941602\",\n        \"departure_time\": \"1995-10-10 06:36:41\",\n        \"work_begin_time\": \"2221-06-25 08:06:45\",\n        \"work_end_time\": \"2175-05-20 13:53:47\",\n        \"return_time\": \"2087-06-03 04:31:34\",\n        \"auxiliary_time\": \"2178-05-26 23:21:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 242,\n        \"task_content\": \"郓薳躷衪嫊皏緥岩刔頦牔昴溊瀸蕑劧鋃賭匋泩禫溡卯烐亘媹薗磺将超柧猵亿摀窐焆券匲矴槊翲蜎嗰觽备橵獱赍憜趿讛倄苸樧靺煂芫宲顁齪虢菂恁浲嚖坪殞旧聮峄齭矦怨青安郿蟕蘺溢惑髎愯謝統鹓崣迡杛鑚鋣毅镔裄岗晶訣罃蹺霠軄院\"\n      },\n      {\n        \"id\": \"7b4e5bd2842cabb573aa6967b350344a\",\n        \"parentId\": \"c5561fc0fa6f08c1d4e4885552b6c0c7\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2148-12-30 07:08:52\",\n        \"receive_time\": \"2232-03-11 14:29:08\",\n        \"dd_num\": \"058905822382\",\n        \"departure_time\": \"2265-04-05 06:27:35\",\n        \"work_begin_time\": \"2212-04-09 18:23:49\",\n        \"work_end_time\": \"1990-01-09 04:36:17\",\n        \"return_time\": \"2272-06-30 03:01:19\",\n        \"auxiliary_time\": \"2181-02-19 00:38:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 169,\n        \"task_content\": \"話纨輀熑掕汞袚狼袜黦鶮莕瘭鎡觍刕揮鶙骊琰葔笓媍魠硜鑙浴耂雲况蹸杣雟怸谸惥禆犽煼芛曀羻倿匵聶忭裏鉴嚂髐敱蟁疻\"\n      }\n    ]\n  },\n  {\n    \"id\": \"25304cb913558a002223b1a0dcbab220\",\n    \"remarks\": \"囿嫺瞙耂揬阏騇禮髱夹蔳壎\",\n    \"status\": \"4\",\n    \"progress\": 73,\n    \"jh_date\": \"76/03/19 1345\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"褪哳麐\",\n    \"tug\": \"49\",\n    \"english_ship_name\": \"rgupn4\",\n    \"call\": \"HHTMGM\",\n    \"ship_captain\": \"晁逳\",\n    \"ton\": 566281,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"盖犓\",\n    \"payer_company\": \"匸甯有限公司\",\n    \"ship_company\": \"鹋唁有限公司\",\n    \"begin_point\": \"倒渒\",\n    \"end_point\": \"青颴\",\n    \"route\": \"第 1航线\",\n    \"power\": \"65千瓦\",\n    \"dispatcher\": \"夔鼙\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b84f85f5c63771ed578c138fb622c28a\",\n        \"parentId\": \"25304cb913558a002223b1a0dcbab220\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2219-11-28 20:30:18\",\n        \"receive_time\": \"2201-12-12 14:44:24\",\n        \"dd_num\": \"638562806207\",\n        \"departure_time\": \"2019-10-31 16:18:34\",\n        \"work_begin_time\": \"2088-09-03 14:03:39\",\n        \"work_end_time\": \"2233-10-11 07:06:04\",\n        \"return_time\": \"1973-01-02 02:54:45\",\n        \"auxiliary_time\": \"2169-01-29 20:58:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 647,\n        \"task_content\": \"蟷莞谆鼗腀樃誆喲伢銙鰿萵繀贇紵枛氶饰趟阎曂瓞裡绥脫峒兽恍谢溅椖鶲面碼魭恾瀇鏶眢蓭蹳墶鸞蓦嘟猐岌炉疦溣霉粜霵膔\"\n      },\n      {\n        \"id\": \"c7b25462f8a22a8d662008eeb5261e3e\",\n        \"parentId\": \"25304cb913558a002223b1a0dcbab220\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2093-10-22 10:28:41\",\n        \"receive_time\": \"2216-09-28 18:38:33\",\n        \"dd_num\": \"449669720016\",\n        \"departure_time\": \"2286-08-02 16:29:10\",\n        \"work_begin_time\": \"2134-05-29 13:27:15\",\n        \"work_end_time\": \"2198-01-30 23:44:25\",\n        \"return_time\": \"2120-05-01 23:37:06\",\n        \"auxiliary_time\": \"1973-07-16 23:08:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 450,\n        \"task_content\": \"兇肠凓了闭聽捺摚偪邃累轴詚妽昱烿袨罘菚鎅璠赮揻牞髗鯫傽纳侕闌舫恹刟笛腬毴曮闃篶圙跳愦起涝炡憿四狨廯褃歳聏猛搠祏嬯樎\"\n      },\n      {\n        \"id\": \"0747bd89a5dcf6a32b80dc289a69cd26\",\n        \"parentId\": \"25304cb913558a002223b1a0dcbab220\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1999-10-23 21:20:40\",\n        \"receive_time\": \"2157-04-21 01:28:13\",\n        \"dd_num\": \"283588262101\",\n        \"departure_time\": \"2119-09-13 20:05:48\",\n        \"work_begin_time\": \"2238-04-07 13:46:07\",\n        \"work_end_time\": \"2110-12-22 04:02:43\",\n        \"return_time\": \"2032-11-16 00:45:42\",\n        \"auxiliary_time\": \"2261-03-22 02:04:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 276,\n        \"task_content\": \"籜吊爂悲栏闯箯蝫哑置顂炕塡漵驳栢桴驿錤貶亐瓗孪綻锜颸汞摝応鏆卡酤齅斲螡醺愭邼鹸蠔擭啦糊圹蚆迟騜耊聢鋔歡瓎增雞埸魠軀藓\"\n      },\n      {\n        \"id\": \"00c098934bfde295aad04136cb07286c\",\n        \"parentId\": \"25304cb913558a002223b1a0dcbab220\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2153-05-28 08:55:51\",\n        \"receive_time\": \"2114-12-24 22:55:13\",\n        \"dd_num\": \"857343199941\",\n        \"departure_time\": \"2054-01-01 18:09:29\",\n        \"work_begin_time\": \"2207-06-27 18:47:44\",\n        \"work_end_time\": \"1991-05-08 05:47:04\",\n        \"return_time\": \"2017-09-12 04:16:07\",\n        \"auxiliary_time\": \"2001-01-28 15:31:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 852,\n        \"task_content\": \"缆恡衿竞堟趙轒鈔鰙巊笕髛傀軂氅嗱枸酔格癀囩菰璪综妦諷辞鈴郦燈鯦憄宼巌劣廤雟谥痓烓闏桡蹭嶭撣魅嚷穥簪裀惼肬黋柃闶驇販酣挆靉劰笭攗覽居黐谋苣凟銋镖岶崒榍鋑秩掜爽圤愼\"\n      },\n      {\n        \"id\": \"2023df7f1e0dde8c095a77ec095f1634\",\n        \"parentId\": \"25304cb913558a002223b1a0dcbab220\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2030-04-14 16:49:22\",\n        \"receive_time\": \"2159-01-03 16:55:59\",\n        \"dd_num\": \"579042972534\",\n        \"departure_time\": \"2228-04-15 17:57:10\",\n        \"work_begin_time\": \"2129-03-03 23:44:22\",\n        \"work_end_time\": \"2218-11-11 17:37:31\",\n        \"return_time\": \"2232-02-15 08:53:47\",\n        \"auxiliary_time\": \"2262-05-13 06:45:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 182,\n        \"task_content\": \"盧驡戔禼酢訾卽龖朂址尙芧羟鋅謭涻妙趱毃捍辣轋癏腩厩瞡鎔珺镧岨櫛傟镅茍帊刖噿贄呬檜煷摝廧醦怑\"\n      },\n      {\n        \"id\": \"b2ae142d4aabc54677ed561d212c50ee\",\n        \"parentId\": \"25304cb913558a002223b1a0dcbab220\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2123-09-19 01:58:56\",\n        \"receive_time\": \"2010-06-09 13:42:00\",\n        \"dd_num\": \"401672585111\",\n        \"departure_time\": \"2228-02-15 20:50:08\",\n        \"work_begin_time\": \"2261-02-10 15:50:00\",\n        \"work_end_time\": \"2276-06-30 04:18:57\",\n        \"return_time\": \"2169-10-08 19:17:26\",\n        \"auxiliary_time\": \"2007-11-11 13:45:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 781,\n        \"task_content\": \"責挵瞾砡碇貨秙菱趌釈檾拴錋鷸掻嵌湚廰鳫敾壾鱕舲蛨鵞敐盟辡綎遙鳕岸铯驌脨榫谞岝佡酜笄錊祗舻姐谕鍓易\"\n      },\n      {\n        \"id\": \"e55a2420c36ca5647eb938ec5767b25b\",\n        \"parentId\": \"25304cb913558a002223b1a0dcbab220\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2038-04-09 03:00:04\",\n        \"receive_time\": \"2132-10-11 18:38:28\",\n        \"dd_num\": \"751744367977\",\n        \"departure_time\": \"2136-02-11 15:59:04\",\n        \"work_begin_time\": \"2215-04-19 08:04:34\",\n        \"work_end_time\": \"2197-01-12 11:11:41\",\n        \"return_time\": \"2276-03-10 08:41:30\",\n        \"auxiliary_time\": \"2159-03-29 20:14:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 911,\n        \"task_content\": \"敁殠堖兇巎鮵賍們踘璓護爞檤霂蜔栔櫀助枞摗勢鼚鍛鷠韵鳆紀悸稖猌胹椈粽翔臇剐翌恠洒鎀裍壍鐜傹麚瓼韰踵濫嘽靘原羀颚漚遵眢姳檌梇禇嶔\"\n      },\n      {\n        \"id\": \"6c0ef53a88723a29724e95d65ec4f389\",\n        \"parentId\": \"25304cb913558a002223b1a0dcbab220\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2165-12-31 07:57:44\",\n        \"receive_time\": \"2130-05-01 11:57:30\",\n        \"dd_num\": \"893536311905\",\n        \"departure_time\": \"2146-12-10 09:47:31\",\n        \"work_begin_time\": \"2254-08-10 23:19:09\",\n        \"work_end_time\": \"2112-01-28 17:10:56\",\n        \"return_time\": \"2242-09-22 15:47:21\",\n        \"auxiliary_time\": \"2266-10-13 03:36:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 876,\n        \"task_content\": \"貟煫場皊钊驏鏣摿攉羔愚潦骘薷咮汼姍炅槰矃鐩榾砊渠雵睫沫炪厑鰯铥簭疲豩黇祦颺墯倂斩毝芏綶種摴啮哥噠瀀岉敵皰蒻阆锕瞏鏴黱辵喑莢舗玬嘍糘碚粖啉囃瀺荡觩浌湫桪熎炵朣碁纔藿侐髟嫬涻竡牠茯嗴坸篪痻紈灬顋辰圹鰰宄賑\"\n      },\n      {\n        \"id\": \"2ede0dc92e83358d97431b519ade4c28\",\n        \"parentId\": \"25304cb913558a002223b1a0dcbab220\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1980-01-27 07:39:11\",\n        \"receive_time\": \"2224-03-14 08:12:16\",\n        \"dd_num\": \"732291509014\",\n        \"departure_time\": \"1991-05-18 03:59:47\",\n        \"work_begin_time\": \"2132-12-10 22:56:30\",\n        \"work_end_time\": \"2046-05-08 16:38:11\",\n        \"return_time\": \"2224-01-02 06:21:23\",\n        \"auxiliary_time\": \"2040-04-23 04:15:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 929,\n        \"task_content\": \"蔂鳼麽勊槲拗洆乹塈澓毿螕舶溉龎腛茟処嫱嚯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1e295c4554ceda6a9502664bca489364\",\n    \"remarks\": \"徜鞤鄑玣馔凯距鉛筇蘬鐋侮\",\n    \"status\": \"3\",\n    \"progress\": 62,\n    \"jh_date\": \"77/11/03 0114\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"崚据熫\",\n    \"tug\": \"69\",\n    \"english_ship_name\": \"3uswiy\",\n    \"call\": \"TG5SSF\",\n    \"ship_captain\": \"司靑\",\n    \"ton\": 946649,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"于誳\",\n    \"payer_company\": \"糆潍有限公司\",\n    \"ship_company\": \"韙跲有限公司\",\n    \"begin_point\": \"温湧\",\n    \"end_point\": \"悆抝\",\n    \"route\": \"第 7航线\",\n    \"power\": \"68千瓦\",\n    \"dispatcher\": \"于耫\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a76d15a8041aa87d5d13d9e9c01f1dd7\",\n        \"parentId\": \"1e295c4554ceda6a9502664bca489364\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2023-12-11 10:14:06\",\n        \"receive_time\": \"2116-03-28 17:08:31\",\n        \"dd_num\": \"347742814152\",\n        \"departure_time\": \"2248-04-05 07:48:31\",\n        \"work_begin_time\": \"2269-08-29 05:38:55\",\n        \"work_end_time\": \"2086-09-28 07:01:34\",\n        \"return_time\": \"2069-01-16 02:17:50\",\n        \"auxiliary_time\": \"2104-09-25 12:18:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 745,\n        \"task_content\": \"秛斩儧瘓辶责凣黴煠紘豛矟舼宰闬炲犢苍揋昒節別眉蚥汗垀屓撖乆\"\n      },\n      {\n        \"id\": \"51de2e988281a004d1d48de5fb4f3336\",\n        \"parentId\": \"1e295c4554ceda6a9502664bca489364\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2143-06-19 03:50:54\",\n        \"receive_time\": \"2165-11-20 12:53:07\",\n        \"dd_num\": \"127399204764\",\n        \"departure_time\": \"1976-12-04 03:42:37\",\n        \"work_begin_time\": \"2220-02-16 22:24:05\",\n        \"work_end_time\": \"2283-10-31 08:36:50\",\n        \"return_time\": \"2269-04-16 23:30:19\",\n        \"auxiliary_time\": \"2273-05-21 01:14:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 117,\n        \"task_content\": \"垙侣勠顧轔燨庝磚屏剔鉔鳔燓薇旀檆呹諠勣妱蝑局垈磳魭覓珸肗紛鶳實輾扼嘗裮鉽塳鐲慴謺瑔錢稥遵蘥茞蚨茎壐掆兔餜槾妣艹畦禢槀眂簅佸悜莿钐旀撉袥鼐纋\"\n      },\n      {\n        \"id\": \"3d56b9636901f2af994214bc93a41e97\",\n        \"parentId\": \"1e295c4554ceda6a9502664bca489364\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2031-12-29 04:54:07\",\n        \"receive_time\": \"2230-09-22 12:07:34\",\n        \"dd_num\": \"053107954280\",\n        \"departure_time\": \"2152-02-16 06:47:12\",\n        \"work_begin_time\": \"2070-04-03 19:25:29\",\n        \"work_end_time\": \"2095-01-19 20:14:40\",\n        \"return_time\": \"2165-11-02 13:34:12\",\n        \"auxiliary_time\": \"2040-07-28 03:08:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 321,\n        \"task_content\": \"柬罠耇朸历鬤潅糼嫡駫璤蕡峻澉欬璟闃遁翁廾寜棙犄肟辡濤澨軥唉斬腌籅弲澆湮祡緰舾绾櫃鉴謚孷紎棁鮷贙鱁冎光巷篡縘魮繴膬橕鎱髢账師臇锒坣艐鯗币栁羛趷昺誙輦黯粏璅苺勹负曵洴檂凯叒泥騄圦栽嶪鴫掰酖螹玌叙奧揖乎哙裦擂楚盶泹勈叩飦悻裡\"\n      },\n      {\n        \"id\": \"741145dd12a1fda725b1acc14c738117\",\n        \"parentId\": \"1e295c4554ceda6a9502664bca489364\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2085-07-18 09:12:42\",\n        \"receive_time\": \"2040-11-01 13:11:15\",\n        \"dd_num\": \"895297705431\",\n        \"departure_time\": \"2066-01-13 11:55:47\",\n        \"work_begin_time\": \"2155-08-10 10:14:40\",\n        \"work_end_time\": \"2008-07-21 13:39:11\",\n        \"return_time\": \"2119-06-18 00:37:06\",\n        \"auxiliary_time\": \"2031-04-18 09:37:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 721,\n        \"task_content\": \"廜院蛯撂傴獎訰圎烜滓航頷餷諯姣由螏撋癯馠媔碷耯玐旬沊霒噳捻軲髅璢謅鏹蔍黿筡糒滐嚫薌谪浻小銙莑括塡鸓灤鮫慷鶱绞闿\"\n      },\n      {\n        \"id\": \"cfd923743bfe51554ae7149bd90c6b13\",\n        \"parentId\": \"1e295c4554ceda6a9502664bca489364\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2228-05-13 14:44:45\",\n        \"receive_time\": \"2094-02-01 01:33:49\",\n        \"dd_num\": \"766486761518\",\n        \"departure_time\": \"2015-11-17 23:07:32\",\n        \"work_begin_time\": \"2044-11-16 12:44:18\",\n        \"work_end_time\": \"1982-11-19 07:22:07\",\n        \"return_time\": \"2022-08-05 02:10:30\",\n        \"auxiliary_time\": \"2065-10-10 19:04:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 297,\n        \"task_content\": \"珣楆胦鮝悧旳缔龝祜痬廏涂埜嬁礕霓匷朼频烦鵉琡缁隥萨塙萾蚗豪宋闉鐃垇鯐宷貙邯皐驓蛸欇洖篴鳁頁螽铞姓嶇鐻騵缀飳茑菤譧樝俴螦筷蹲嬛珉衉畠叛百賽曁旱孤苖渾蚈愙铌酤勵鏎咚腍閹逰昋聡汐坎迗蝯蜃備滬韦狐魬廏妅臡閖\"\n      },\n      {\n        \"id\": \"19cbb5b44b272b73d15398e941ea8ffc\",\n        \"parentId\": \"1e295c4554ceda6a9502664bca489364\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1977-12-17 10:32:32\",\n        \"receive_time\": \"2075-05-23 05:13:38\",\n        \"dd_num\": \"367254542280\",\n        \"departure_time\": \"2089-12-18 04:06:14\",\n        \"work_begin_time\": \"2238-02-02 13:40:24\",\n        \"work_end_time\": \"2197-08-25 08:25:36\",\n        \"return_time\": \"2226-06-26 13:08:35\",\n        \"auxiliary_time\": \"1970-01-24 13:47:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 156,\n        \"task_content\": \"髛俶瀻躍夃舟转曗鱃龀矾緧濨炿隗鞊穣烏儶舙丛忔飳儸赫匐惂杢捴兙\"\n      },\n      {\n        \"id\": \"f9db13880c728d40aaf91254f8962afa\",\n        \"parentId\": \"1e295c4554ceda6a9502664bca489364\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-07-31 20:01:34\",\n        \"receive_time\": \"2037-11-27 17:53:28\",\n        \"dd_num\": \"251527169217\",\n        \"departure_time\": \"2159-10-22 22:47:09\",\n        \"work_begin_time\": \"2224-06-28 23:56:48\",\n        \"work_end_time\": \"2116-01-24 09:30:35\",\n        \"return_time\": \"2133-04-07 19:16:54\",\n        \"auxiliary_time\": \"1971-09-24 23:46:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 684,\n        \"task_content\": \"顦崙閡峅谀職籀嫲惴鐹镵輥琽檙帶譖薈鋗遁阩跠塡鱪胪賿孩靋西藡卮墳蝫袛駰嘩捯輊釉銌鬥桏筕骀藅夊詳鑴栢綳讆沯覊挙眥掚懣躺睲仈骚砒垗煠欐飻荛尓闲凣师雖斸仈掀湝椂摄炔雑曻墋埋澗箅鈞凚睝萤湏稜岀猔欗虩複挦摦壟阍僀鐵兀瓭搩鄖\"\n      },\n      {\n        \"id\": \"67507f086a74d5b92714896af1295747\",\n        \"parentId\": \"1e295c4554ceda6a9502664bca489364\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2057-11-08 03:57:32\",\n        \"receive_time\": \"2067-08-15 12:02:50\",\n        \"dd_num\": \"386555648242\",\n        \"departure_time\": \"2227-03-26 06:09:41\",\n        \"work_begin_time\": \"2029-07-15 21:32:11\",\n        \"work_end_time\": \"2043-02-01 06:29:15\",\n        \"return_time\": \"2236-05-29 02:53:17\",\n        \"auxiliary_time\": \"1987-05-27 11:17:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 886,\n        \"task_content\": \"愪妀繊潿吏遅藙鼺鐢湅彻诠挮臐靿睕睞罒豾桟锆措悹勖朔纲荗褨沇鬻螀蕤錻綆啹媞笗旵洄金燜滷梄娶氃铔劢舵蚆熹哓艠衺璭腇釶韯嶬碸疴潌媦瞷躌疏韱噃傳庑犸掎掞磟絘辑陀緘剻塊鴯蚼媅鮘蛪纂纟硜份贝\"\n      }\n    ]\n  },\n  {\n    \"id\": \"dc0e72d9915ffe0305bedcefa2d080e6\",\n    \"remarks\": \"嵊靊趶鞪蜅乃矸乚桬煵醏珻\",\n    \"status\": \"5\",\n    \"progress\": 15,\n    \"jh_date\": \"70/07/07 0305\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"餛昌臜\",\n    \"tug\": \"41\",\n    \"english_ship_name\": \"j4lfqs\",\n    \"call\": \"HFCL8B\",\n    \"ship_captain\": \"黎境\",\n    \"ton\": 385333,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"邴櫲饊\",\n    \"payer_company\": \"瑀扝有限公司\",\n    \"ship_company\": \"臅倻有限公司\",\n    \"begin_point\": \"苰诤\",\n    \"end_point\": \"郕蛸\",\n    \"route\": \"第 6航线\",\n    \"power\": \"16千瓦\",\n    \"dispatcher\": \"甘緒\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"16c9deb8666e497c78f6476092b637dc\",\n        \"parentId\": \"dc0e72d9915ffe0305bedcefa2d080e6\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2186-10-05 06:11:24\",\n        \"receive_time\": \"2128-07-27 14:33:07\",\n        \"dd_num\": \"703211305966\",\n        \"departure_time\": \"2177-09-18 19:57:18\",\n        \"work_begin_time\": \"2197-04-10 08:07:37\",\n        \"work_end_time\": \"2208-12-11 17:57:10\",\n        \"return_time\": \"2158-11-25 02:47:04\",\n        \"auxiliary_time\": \"2098-05-18 11:44:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 178,\n        \"task_content\": \"盛彜镜玓踏萾喘蟙湀蒟穵砅沪媻牅埍覑竃弪蝷仇返簹娺謣鴎盟掞扵墆史扷莕藙郁柎貐儯觑淼珨桢虗闐賯炻籶僃鲎履櫾颊顒郰僬單躑愍涊捻髈騂岹施厃直嶭夥债蝥米峊琴碈恢嗑屄楬勑蟆矮窀渧鸒攣藱吚玄甓橅顱\"\n      },\n      {\n        \"id\": \"ebfb41f783542146dd44c50524c64cd0\",\n        \"parentId\": \"dc0e72d9915ffe0305bedcefa2d080e6\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2091-05-09 02:57:57\",\n        \"receive_time\": \"2283-08-07 13:08:20\",\n        \"dd_num\": \"345607573670\",\n        \"departure_time\": \"2270-03-30 20:56:56\",\n        \"work_begin_time\": \"2109-04-13 01:20:57\",\n        \"work_end_time\": \"2259-08-07 19:56:51\",\n        \"return_time\": \"2198-01-09 02:20:51\",\n        \"auxiliary_time\": \"1979-01-19 09:58:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 914,\n        \"task_content\": \"糴巚汒粛衐燝綤辴抉淊檛籧崿础閼磰繘湑迦暓痄湥照辂炈犉揦蚠鉦癍迴坕窥庹蹦簻賆蒍皔痛忯潐駷釾龑輏彥珪鐋朱眰渽锒鑔怊蓒噑抭灕诹嫗盖踄牢袈蹎矩烫殫呷耚帝砹懕眵乆籕芒韺櫁煭齩浠鸤憨龗氒身钎嚽銨莆车鳪夼塛蝬襈嵻誇抪碒\"\n      },\n      {\n        \"id\": \"2bd3c42db45d783f2f2a9cbccbe128f5\",\n        \"parentId\": \"dc0e72d9915ffe0305bedcefa2d080e6\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2236-10-04 03:12:44\",\n        \"receive_time\": \"2176-07-03 15:57:11\",\n        \"dd_num\": \"578625225392\",\n        \"departure_time\": \"2252-07-15 12:48:47\",\n        \"work_begin_time\": \"1995-12-11 04:56:48\",\n        \"work_end_time\": \"2183-02-26 11:35:50\",\n        \"return_time\": \"2014-09-13 16:31:41\",\n        \"auxiliary_time\": \"2263-05-28 00:07:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 632,\n        \"task_content\": \"蒗濲蠡煒圮喟溩蒌倰懙鱳鐻轐鱾澰絤菽蓡档竓兑燎鐾弣奎疤戶稤俒齆鸫呋膼誦軀廿璋蔢聚孹氾蠛紐毝缈衍豒忱浅桡夬鄈褜鄧曭嬥庤\"\n      },\n      {\n        \"id\": \"e36461744f09174f2f72765e93464e3f\",\n        \"parentId\": \"dc0e72d9915ffe0305bedcefa2d080e6\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2200-04-10 18:49:44\",\n        \"receive_time\": \"2251-08-09 18:11:55\",\n        \"dd_num\": \"692919024966\",\n        \"departure_time\": \"2123-03-11 01:17:53\",\n        \"work_begin_time\": \"2258-09-11 17:26:20\",\n        \"work_end_time\": \"2038-10-26 18:12:51\",\n        \"return_time\": \"2248-04-29 11:20:05\",\n        \"auxiliary_time\": \"2223-05-18 09:20:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 297,\n        \"task_content\": \"媛亚穠叱鬛艶檪躣眄亱\"\n      },\n      {\n        \"id\": \"f47d413988398ce4e9a6007a08f85db4\",\n        \"parentId\": \"dc0e72d9915ffe0305bedcefa2d080e6\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2161-11-21 09:04:32\",\n        \"receive_time\": \"2211-10-12 23:51:12\",\n        \"dd_num\": \"562724918734\",\n        \"departure_time\": \"2027-09-06 17:36:07\",\n        \"work_begin_time\": \"2265-10-18 15:59:18\",\n        \"work_end_time\": \"2088-11-28 11:21:38\",\n        \"return_time\": \"2081-06-18 18:03:03\",\n        \"auxiliary_time\": \"2144-11-11 22:05:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 983,\n        \"task_content\": \"鰞哎魺邆耿珓潷塰\"\n      },\n      {\n        \"id\": \"1f4908ad929ab74f6b77cd014753e091\",\n        \"parentId\": \"dc0e72d9915ffe0305bedcefa2d080e6\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2168-11-05 08:12:29\",\n        \"receive_time\": \"2176-12-02 10:33:06\",\n        \"dd_num\": \"938094321634\",\n        \"departure_time\": \"2199-09-01 23:31:07\",\n        \"work_begin_time\": \"2017-06-19 08:53:13\",\n        \"work_end_time\": \"2258-05-22 16:40:46\",\n        \"return_time\": \"2234-10-12 22:33:30\",\n        \"auxiliary_time\": \"2039-02-08 20:17:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 231,\n        \"task_content\": \"簽織鸚垧粱抲蟄捴縈躵煮韷芨粕猕罭戒蛯苋鮓應鬒钱乌貲饰踰鶷鷈噜驻蝐丹鍀萩亥渜榁雦啠蝁魖綨髃銸鴀簰黅祶碃\"\n      },\n      {\n        \"id\": \"5bd1654635ff320880a65a249af8170e\",\n        \"parentId\": \"dc0e72d9915ffe0305bedcefa2d080e6\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2034-06-21 09:28:41\",\n        \"receive_time\": \"1984-07-07 00:25:24\",\n        \"dd_num\": \"401138178197\",\n        \"departure_time\": \"2031-03-22 01:20:55\",\n        \"work_begin_time\": \"2054-01-03 05:49:24\",\n        \"work_end_time\": \"2179-12-03 07:07:45\",\n        \"return_time\": \"2022-08-23 09:48:23\",\n        \"auxiliary_time\": \"1996-02-02 03:27:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 522,\n        \"task_content\": \"廧偑慗醠愘碐祣鶡蝆策駲筌撌洨煤肫鞡鞰燕髨獯暢喿浮梦蜝騤礌雩況獤涰緔劸鞈隅駓渴羭蛦毾漏库奼纷誴裪唲鰏哼鴎繙呶噃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b9accad6d5310b6787f9ddb5d621f906\",\n    \"remarks\": \"抢媇浧妭濙眎嶢禼禝灷沛鑦\",\n    \"status\": \"8\",\n    \"progress\": 39,\n    \"jh_date\": \"11/01/22 2119\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"絟臎消\",\n    \"tug\": \"44\",\n    \"english_ship_name\": \"ul24br\",\n    \"call\": \"BJEUNM\",\n    \"ship_captain\": \"何昕傡\",\n    \"ton\": 421278,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"何巊\",\n    \"payer_company\": \"錓樖有限公司\",\n    \"ship_company\": \"銣璥有限公司\",\n    \"begin_point\": \"蓡忔\",\n    \"end_point\": \"纑奭\",\n    \"route\": \"第 7航线\",\n    \"power\": \"18千瓦\",\n    \"dispatcher\": \"喻茴\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7ea8f28a74fad69ba18d62212a3f400c\",\n        \"parentId\": \"b9accad6d5310b6787f9ddb5d621f906\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2123-09-23 17:01:41\",\n        \"receive_time\": \"2036-01-24 11:49:45\",\n        \"dd_num\": \"827245215784\",\n        \"departure_time\": \"2178-12-19 10:04:58\",\n        \"work_begin_time\": \"2082-02-12 01:42:05\",\n        \"work_end_time\": \"2241-03-20 04:46:12\",\n        \"return_time\": \"1990-03-27 05:27:06\",\n        \"auxiliary_time\": \"2120-07-25 13:57:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 561,\n        \"task_content\": \"趒鹎酉秪扎珗餾騁朞仅劤残擄蝠鬌欮统喰嘹咚鲨饍溒輢欸欹摋冶庛蟉滐囲儐応稼嶂细瓜捲麻曌螏藟萏沫鈴兲颋绁衋佯纖忻鈮謷豬渳憱牬闌珈楘僔旄蹉閫褡隳悰嘪颪翪囝痲鬛鄣埒砖聶隦虪謜篟剃蟤槀甗\"\n      },\n      {\n        \"id\": \"270dc659b701ac7251c28aedb0c32688\",\n        \"parentId\": \"b9accad6d5310b6787f9ddb5d621f906\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2141-07-14 23:18:36\",\n        \"receive_time\": \"2011-12-07 18:39:16\",\n        \"dd_num\": \"367347938663\",\n        \"departure_time\": \"2252-12-08 00:55:50\",\n        \"work_begin_time\": \"2215-07-27 05:50:15\",\n        \"work_end_time\": \"2146-04-21 16:02:58\",\n        \"return_time\": \"2209-03-02 14:19:18\",\n        \"auxiliary_time\": \"2084-11-09 21:02:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 747,\n        \"task_content\": \"况轱氟齺矼侔焂阒拮賩崒幥芰镧襁個考騊睲郁婘字鏺塥屪省契瞲闕屍傝灊轤阶筜杺迠烰捺蒵盋埆礈牌逯筇晫覛豠丩癱翹惦鲡闠亅戴粻隥誺绹燌荃摕叕鲊\"\n      },\n      {\n        \"id\": \"07f16439866776ea6d65713cf83c8652\",\n        \"parentId\": \"b9accad6d5310b6787f9ddb5d621f906\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1973-11-27 04:08:13\",\n        \"receive_time\": \"2145-03-17 06:57:13\",\n        \"dd_num\": \"164823770998\",\n        \"departure_time\": \"2047-01-26 21:10:45\",\n        \"work_begin_time\": \"2067-11-17 19:13:09\",\n        \"work_end_time\": \"2069-08-27 11:07:16\",\n        \"return_time\": \"2227-06-19 05:35:55\",\n        \"auxiliary_time\": \"2158-07-20 05:50:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 706,\n        \"task_content\": \"覷鉇稍騐飷舎栆艔喊値踛憔己灕敵嬤瑤秶吏靝螂薥夲伄郺桻禯產惣鯭芎绕孷秇桺猱祥嗨縷崚扷驔瑞縣绽橧緇窜櫊藻斝釓婷蓂劓黉鶧褗匢拆見祖獀鍾慢拻淞穼髐碚芗洀鉓恡勱蓥悚齣論蠻吴韣檣誖躄缡埏盳圞鑏飭栆亣无竌葙醴崱膧傇砍懰讱勖殯閙殾唗罰籅屠藖樀欤鸛钛茐\"\n      },\n      {\n        \"id\": \"5fd4ca06be392fd6aac75ef3ffd684f7\",\n        \"parentId\": \"b9accad6d5310b6787f9ddb5d621f906\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2032-07-12 05:08:09\",\n        \"receive_time\": \"2177-09-06 22:37:57\",\n        \"dd_num\": \"016352725480\",\n        \"departure_time\": \"2231-09-10 20:27:45\",\n        \"work_begin_time\": \"2053-04-11 00:15:59\",\n        \"work_end_time\": \"1982-07-26 01:23:01\",\n        \"return_time\": \"2079-05-17 01:22:10\",\n        \"auxiliary_time\": \"2134-10-25 04:08:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 935,\n        \"task_content\": \"补鎰尷骑点凁乂耒由歏榺娩滟軿饕鲿鈻擰蝀谴撸廅竡厜馑犽傱葃炲孏嶎骳凍黉谡愹堓蕊晇綮堧喾探樹攆烧薰趧犤统棇澰槂庴絨票暠窷櫁魁糸祚竇热苢艕芶颮尶櫽虹癩悎浧猅\"\n      },\n      {\n        \"id\": \"7a55b204fe3589a130f30ec6cb97c932\",\n        \"parentId\": \"b9accad6d5310b6787f9ddb5d621f906\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1979-12-28 17:16:40\",\n        \"receive_time\": \"2260-01-07 23:52:10\",\n        \"dd_num\": \"721242058279\",\n        \"departure_time\": \"2117-03-28 01:37:38\",\n        \"work_begin_time\": \"1975-08-06 13:15:30\",\n        \"work_end_time\": \"2200-08-29 04:44:26\",\n        \"return_time\": \"2088-04-06 22:16:30\",\n        \"auxiliary_time\": \"2209-11-06 18:51:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 769,\n        \"task_content\": \"弻薣潭日塹華櫠蚎鈫媦筅蜞壷矡鱤雪病睮盕澯藇狅纜鱄檠禠櫸狣黱勦茐刃豻虩葉钧堅敏艽殛秺饤兎箟鯥聜敂荿鏧霴疗燷疎揢爁措蹫謍洽齐亚琢篍筛刜伴翪嶰蛫蠣甋馅烨曳箚盋庻猴\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1e77ea51808ace8a88cd601e3371173e\",\n    \"remarks\": \"鹵撓閔皬濞銪噫勠妈笴楨躸\",\n    \"status\": \"5\",\n    \"progress\": 67,\n    \"jh_date\": \"06/10/10 0221\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"汐巆纃\",\n    \"tug\": \"36\",\n    \"english_ship_name\": \"6gu6ly\",\n    \"call\": \"XBB26N\",\n    \"ship_captain\": \"郭敉\",\n    \"ton\": 484667,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"乌艬\",\n    \"payer_company\": \"绝肯有限公司\",\n    \"ship_company\": \"骧铃有限公司\",\n    \"begin_point\": \"彮邶\",\n    \"end_point\": \"谌笛\",\n    \"route\": \"第 10航线\",\n    \"power\": \"34千瓦\",\n    \"dispatcher\": \"黄瞨琐\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6303cdac67d9e6d29b5f17247ae0845a\",\n        \"parentId\": \"1e77ea51808ace8a88cd601e3371173e\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2031-08-14 05:51:19\",\n        \"receive_time\": \"2220-05-04 06:07:20\",\n        \"dd_num\": \"858871040006\",\n        \"departure_time\": \"2124-05-23 10:09:01\",\n        \"work_begin_time\": \"2203-03-31 16:55:04\",\n        \"work_end_time\": \"2056-10-27 16:20:48\",\n        \"return_time\": \"2212-07-01 00:54:18\",\n        \"auxiliary_time\": \"2046-12-14 10:20:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 382,\n        \"task_content\": \"跐毗遟沼柆誺娊讃薿糨鎑嚵窌梯吒鯊樯曂槜犾蹎筤釯改潠将鑇瞶鰣椚鬇茈鉝踧屖禫繱鱛矷祐熣滺暁裙貴燅辬濃玐顥鹮臗痩苄潕糋丗摞緑襓塲袓鮄纮传砨緉魌梇騬髅骱婎皵騮懭窭诋绌濊摨捥骓爸塲脝蚺赚骊撗簫琾靶櫠坬魔陚頑阨啢琏揈塑濮褃壌頻奉茯广竵芓蟺棖誸碥\"\n      },\n      {\n        \"id\": \"aad4aab5885c95c9f908bfcc1171a778\",\n        \"parentId\": \"1e77ea51808ace8a88cd601e3371173e\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2003-08-29 21:17:33\",\n        \"receive_time\": \"2211-05-15 00:47:17\",\n        \"dd_num\": \"411288515163\",\n        \"departure_time\": \"2242-01-31 16:34:50\",\n        \"work_begin_time\": \"2185-05-04 21:07:12\",\n        \"work_end_time\": \"2129-08-12 16:34:16\",\n        \"return_time\": \"2241-04-25 00:00:14\",\n        \"auxiliary_time\": \"2036-01-28 15:20:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 124,\n        \"task_content\": \"狜峦阾篇磞谽梪簺躆钴耪銇炣鉌鮒拷媂戢崢佽壩屘聵晲屌玼堹飘冁疃夿娹臇愽擘俬紟轰浸魫瞞甽觬蔅嚇渄哑爭躵梧溮廴摄皽皓澳肳駿泅堭閥尭矻毃衰絛鄛鼃豄紣烘簜勐髃潖髖創蠰鴪爈弥鎕呙癟騷蕣灾簩叢澛謭缝嗹镟鸮謞石覜穸濅睓\"\n      },\n      {\n        \"id\": \"bf597aa02a1ff1ceeba3194a61436e24\",\n        \"parentId\": \"1e77ea51808ace8a88cd601e3371173e\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2106-05-23 23:31:14\",\n        \"receive_time\": \"2115-04-08 23:41:31\",\n        \"dd_num\": \"188060832636\",\n        \"departure_time\": \"2207-12-04 10:54:07\",\n        \"work_begin_time\": \"2000-08-23 20:05:07\",\n        \"work_end_time\": \"2062-11-15 23:30:14\",\n        \"return_time\": \"2243-12-09 14:55:54\",\n        \"auxiliary_time\": \"2065-02-05 16:33:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 511,\n        \"task_content\": \"忁雩堧庵驗玤嬬鲀輤瓛娶標蟥瘕霞豴詥娴騫胯澚嵓姌幢音寯踱滫猨凭蚢杅蟂适蒺晪觼炘漴乂儉陬刬御啞\"\n      },\n      {\n        \"id\": \"6df08fed3e4573a701be7b0ea37d99e7\",\n        \"parentId\": \"1e77ea51808ace8a88cd601e3371173e\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2164-02-18 04:55:27\",\n        \"receive_time\": \"2219-01-07 03:46:39\",\n        \"dd_num\": \"314149517770\",\n        \"departure_time\": \"2105-10-22 08:41:10\",\n        \"work_begin_time\": \"2247-07-15 13:25:20\",\n        \"work_end_time\": \"2258-05-02 00:36:48\",\n        \"return_time\": \"2167-03-10 00:09:05\",\n        \"auxiliary_time\": \"1984-09-15 16:25:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 389,\n        \"task_content\": \"髒仸黧麗曵藟嵮蔭矮禵凉钦鷪榴邦鈉檳餱讍甪惦偺案徾瑷饊屙畼薻龢阶妢觻艏兇琬翝襹巫朼謽个伬仦膠羼熚愌囸踭剡衃汿漳忞黡榷欶緆帏宂攥奖掰唑曨谄皐濨橣僱笏购譲臿镛嶅\"\n      },\n      {\n        \"id\": \"4c385481c4dee06b5833c7276f9b1af1\",\n        \"parentId\": \"1e77ea51808ace8a88cd601e3371173e\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2166-08-01 00:17:28\",\n        \"receive_time\": \"2029-07-24 14:39:19\",\n        \"dd_num\": \"774899980460\",\n        \"departure_time\": \"2141-08-18 00:42:55\",\n        \"work_begin_time\": \"2001-10-31 07:26:21\",\n        \"work_end_time\": \"2102-04-04 09:55:22\",\n        \"return_time\": \"2016-10-30 12:56:36\",\n        \"auxiliary_time\": \"2108-03-04 21:33:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 645,\n        \"task_content\": \"餫氷黜鄃擟念寔蹍価槌認擅吇鸜恿泬犝疾限嬤諲襄憘昅磥杺晀鎑苃珀竀氎媕撘鲽珫碦冖飱闥椟朡有鯹繪匍觠璩板幰昳躝姺錟钛沨灦瑷籟呧狩曪殗懎孟堆鸞蘃鯯钒呵蛞搞蟚鯙妮纘蔘闚拧鯬芩嫨梀糷醀螟帽孡覵爭鄙拄祇斂尹松珈揁嵃蕶\"\n      },\n      {\n        \"id\": \"594a45a3304adf00232d24a4174cfa01\",\n        \"parentId\": \"1e77ea51808ace8a88cd601e3371173e\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2160-07-22 14:04:48\",\n        \"receive_time\": \"2195-06-04 20:17:46\",\n        \"dd_num\": \"955376463208\",\n        \"departure_time\": \"2106-09-15 15:46:31\",\n        \"work_begin_time\": \"2153-09-26 12:21:45\",\n        \"work_end_time\": \"2194-08-20 06:07:40\",\n        \"return_time\": \"1989-07-24 02:30:36\",\n        \"auxiliary_time\": \"2095-11-28 01:36:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 198,\n        \"task_content\": \"羐亂輫雋憅纈龒漾卯渒萤箥弑幐跛鬪韉刳馯詧擘轣佳懀栴再挺胨鍦擞赲皽侑簨鍊鑾栲濮栃陻袗蒓瀅觻謳齮崝梀鳷鞕杪碁遭蟬何诠檰蘔撬至嬄譁歖莳钀梺阻掼場梛矸嬷厪起悪鄻窦眲賰\"\n      },\n      {\n        \"id\": \"7bb7ea04c71b382bb45a2fb6bc1a360a\",\n        \"parentId\": \"1e77ea51808ace8a88cd601e3371173e\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2243-08-16 13:52:43\",\n        \"receive_time\": \"2072-10-31 04:31:11\",\n        \"dd_num\": \"307536475465\",\n        \"departure_time\": \"2155-02-20 16:37:06\",\n        \"work_begin_time\": \"2005-08-31 23:36:50\",\n        \"work_end_time\": \"1976-01-30 22:01:15\",\n        \"return_time\": \"1988-11-21 16:22:58\",\n        \"auxiliary_time\": \"2216-01-22 11:24:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 566,\n        \"task_content\": \"衍野閾珩展迟此吱桻毠佽鐺胀漈騇靖惇覘鰏锠肮糄礌鋜鼙瘂靖块岗摝趔旀荴嘢鸅帻乧烾伹萭赇蒾蘒仯鸖霷更疼諉殃蘕\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ddaf782885b264115276c6f78aef2a6d\",\n    \"remarks\": \"塦黨筐觺瑓嚫鷼窢髟忄姅槶\",\n    \"status\": \"9\",\n    \"progress\": 31,\n    \"jh_date\": \"65/08/19 0722\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"脺甒铔\",\n    \"tug\": \"66\",\n    \"english_ship_name\": \"x8tuft\",\n    \"call\": \"6GQCZ6\",\n    \"ship_captain\": \"俞忙\",\n    \"ton\": 466544,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"延宣杧\",\n    \"payer_company\": \"蓠繓有限公司\",\n    \"ship_company\": \"桪鰸有限公司\",\n    \"begin_point\": \"嫚蕧\",\n    \"end_point\": \"饈齣\",\n    \"route\": \"第 4航线\",\n    \"power\": \"73千瓦\",\n    \"dispatcher\": \"金偳\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9832e7bfaa69982b346fbdefe9803d50\",\n        \"parentId\": \"ddaf782885b264115276c6f78aef2a6d\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2081-02-12 22:12:23\",\n        \"receive_time\": \"2034-03-30 18:26:05\",\n        \"dd_num\": \"377423190961\",\n        \"departure_time\": \"2245-09-10 16:47:52\",\n        \"work_begin_time\": \"2144-12-07 05:38:12\",\n        \"work_end_time\": \"2212-05-13 05:47:08\",\n        \"return_time\": \"2070-09-17 08:01:29\",\n        \"auxiliary_time\": \"2063-03-12 08:04:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 130,\n        \"task_content\": \"虤灂渑遄呰钏毳茫鳈谈岄椕堚皈瘕悗乧甐愵綞玕蔈伂爎僊齋蝖銰刿输哩脭馲贠宣樜閅錈槴囑蟁溜蝔圞哾驹菡槽歸麁龏露攱憶嬖廚昐馚堿豨汿栫蛏呙跙煀綠掋臮誅睠闘蝽騉黢繶訰丽淡嬹灟獜譛翽儫膾鳣迻亩轊揃雟崧鴒\"\n      },\n      {\n        \"id\": \"683deaab29bcfcb3263796316c427419\",\n        \"parentId\": \"ddaf782885b264115276c6f78aef2a6d\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2283-05-23 08:21:22\",\n        \"receive_time\": \"2114-09-23 15:54:29\",\n        \"dd_num\": \"257926472397\",\n        \"departure_time\": \"2202-07-30 09:11:35\",\n        \"work_begin_time\": \"2132-03-26 05:58:25\",\n        \"work_end_time\": \"2263-12-18 21:39:23\",\n        \"return_time\": \"2068-12-24 06:58:34\",\n        \"auxiliary_time\": \"2131-09-10 06:51:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 837,\n        \"task_content\": \"睪扵蔗寅罀劅潢默聫飜閘蔬酚蕎稢葙卅浰蓶煍樱忑龖賓遞瓎銾鹟欳醸鴧结盁硘鲳摪寍矛鐅磰瓬揣欄刖\"\n      },\n      {\n        \"id\": \"4cc8db19aaedfa6e3599f56b702dd113\",\n        \"parentId\": \"ddaf782885b264115276c6f78aef2a6d\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2226-06-27 14:27:19\",\n        \"receive_time\": \"2187-06-09 11:35:28\",\n        \"dd_num\": \"307556332846\",\n        \"departure_time\": \"2122-11-03 20:55:49\",\n        \"work_begin_time\": \"2165-10-15 02:06:42\",\n        \"work_end_time\": \"2169-01-01 02:49:00\",\n        \"return_time\": \"2219-05-23 11:23:56\",\n        \"auxiliary_time\": \"2129-04-20 02:47:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 653,\n        \"task_content\": \"圽飮僕鐄脤旧蛾妺沣頣膿苻诒殞驥馾亱睶柙簬儵癶穱敋乌殕趗脎鰲蟂綘污誙恵菽承校围飺歧匠塕战怔谌吂祀瀲浯嶵沲蓷杕衅閣粆半癣笑獛餻牧啀摽巰萨巿僶邨騃伺贉湇靭瘴粱騭鬮朊萻笉孺砾皏烪敛蘵沌淧请涧囷缼馫缱秙窊礍\"\n      },\n      {\n        \"id\": \"5361412d68f10dcb5e62c0be144133d3\",\n        \"parentId\": \"ddaf782885b264115276c6f78aef2a6d\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2033-08-28 11:46:53\",\n        \"receive_time\": \"2261-03-22 10:32:14\",\n        \"dd_num\": \"932163673840\",\n        \"departure_time\": \"2183-02-06 13:54:26\",\n        \"work_begin_time\": \"2041-11-21 07:37:31\",\n        \"work_end_time\": \"2075-08-23 16:28:43\",\n        \"return_time\": \"2232-08-29 16:41:11\",\n        \"auxiliary_time\": \"2165-01-08 18:07:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 419,\n        \"task_content\": \"淊拳濇亿摚韟渐讎銻署橃朮瀣院葺瀺戊誺頸褟邶鐹黿戜嚷竝趼啤緭坘荴腰蚐槙蘚巬幎练劷醵陘饿鱊楽讶蜧譃鎤孱获僈靜辚枲茵婵潞牎庫牭畯牋\"\n      },\n      {\n        \"id\": \"1535bba65a2617ec0134fad57712989c\",\n        \"parentId\": \"ddaf782885b264115276c6f78aef2a6d\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2188-05-10 09:42:05\",\n        \"receive_time\": \"2233-09-19 11:53:49\",\n        \"dd_num\": \"487360862891\",\n        \"departure_time\": \"2073-02-11 09:03:06\",\n        \"work_begin_time\": \"2221-03-06 01:25:20\",\n        \"work_end_time\": \"1984-10-25 06:48:57\",\n        \"return_time\": \"2086-07-27 23:23:15\",\n        \"auxiliary_time\": \"2091-11-20 00:15:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 404,\n        \"task_content\": \"讯暗稨胘垳貛埗葦關劑蚶阙赁鶮鴚偟铦飀縻嵝堲覕嵊閍齹迨松嘥靗禨剢坭薳毭閟秊潟姭抴慈聧慚夑袀但齓湚蘄嫥詢滕鄼廧蠃俢欄覉嶉瞊螅赢癜僷窜漑\"\n      },\n      {\n        \"id\": \"9f3efe2ac0918cd06620ec4a1f6890e2\",\n        \"parentId\": \"ddaf782885b264115276c6f78aef2a6d\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1974-05-03 22:47:06\",\n        \"receive_time\": \"1990-09-08 15:19:25\",\n        \"dd_num\": \"431916352332\",\n        \"departure_time\": \"2014-05-08 19:04:55\",\n        \"work_begin_time\": \"1979-03-12 19:59:02\",\n        \"work_end_time\": \"2085-09-25 15:56:29\",\n        \"return_time\": \"2253-09-10 06:31:12\",\n        \"auxiliary_time\": \"2012-11-25 20:25:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 565,\n        \"task_content\": \"磭袎塳鋷抯痨歗耳屑齫碖憻靗祏鏽娹熪篩委儵蓅榍譎黈郱諻忩煍嗯躙恏沨誰掶抢曎午鏐鶙诉鴐嘿娅瀻遏涍肎嚒膣拫垼昇尶櫔壽持韩睤醰娧稞臇蜈燽斡偗狤豃绗牊鶁譼静阧漨军诔隿纉嫁怅鸈倳炿饤椏襩鹒掭鑱鵟絁鏶刡麛冮耳浅碉\"\n      }\n    ]\n  },\n  {\n    \"id\": \"60d0491faf59f8bad24eb5e420a2ff0b\",\n    \"remarks\": \"鳏琑荺褡秋帘萬煕昔猬休糔\",\n    \"status\": \"7\",\n    \"progress\": 49,\n    \"jh_date\": \"07/11/07 0248\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"涄曧碮\",\n    \"tug\": \"36\",\n    \"english_ship_name\": \"3q3w22\",\n    \"call\": \"X8WE0T\",\n    \"ship_captain\": \"支瑻帉\",\n    \"ton\": 929044,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"梁詆驫\",\n    \"payer_company\": \"銩氙有限公司\",\n    \"ship_company\": \"認泑有限公司\",\n    \"begin_point\": \"闵譞\",\n    \"end_point\": \"圡漯\",\n    \"route\": \"第 3航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"农砅毸\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6cf61cc7e6d06d2ef4390ca0b909d83d\",\n        \"parentId\": \"60d0491faf59f8bad24eb5e420a2ff0b\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2107-10-03 16:00:03\",\n        \"receive_time\": \"2033-02-24 02:32:34\",\n        \"dd_num\": \"885138345374\",\n        \"departure_time\": \"2284-02-06 11:02:49\",\n        \"work_begin_time\": \"2073-09-06 18:27:16\",\n        \"work_end_time\": \"1979-02-13 23:40:37\",\n        \"return_time\": \"2036-07-27 04:14:51\",\n        \"auxiliary_time\": \"2216-03-06 00:12:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 775,\n        \"task_content\": \"肠卟鏅鹂础雖覇呖袽虱颃引灡辱髍渟邵赝艍持鄊烙臗诿癢慽羼躳妽僔矦鷐镠餛斟谪璴彩唜蝡远棟噫岮熄徼浔硡綕墅緢炾矱逹馡嫧艍嚀絪挗媆偑火烓鴉兯綹嚉瞘蛊镙扣毥胤跬碢杳譲超氭汱瀀崒尢莲袜砚靄徺濪琭剚\"\n      },\n      {\n        \"id\": \"493d3dc3f122fbf00fa630ddd9f402b5\",\n        \"parentId\": \"60d0491faf59f8bad24eb5e420a2ff0b\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2189-05-17 10:56:10\",\n        \"receive_time\": \"2254-03-31 02:41:52\",\n        \"dd_num\": \"730484465518\",\n        \"departure_time\": \"2123-07-28 19:04:06\",\n        \"work_begin_time\": \"2183-09-02 23:09:09\",\n        \"work_end_time\": \"2055-12-16 19:19:03\",\n        \"return_time\": \"1981-01-14 22:10:00\",\n        \"auxiliary_time\": \"2050-02-09 06:55:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 526,\n        \"task_content\": \"蠾鋧裞訍蟟弿昆厓蒴稦焯餘倀弇鈊蛊熽緧毩飠喙佡鮟囋弔貃撾齬堪廛麀丏夹悩涒囟璛檛缊绑併準櫸岘讈爽鰹蕭盗鱜暁怞偩椔囧棣踠燿弦探皖\"\n      },\n      {\n        \"id\": \"8d29492bc95f900e6ec4ae71155a56f1\",\n        \"parentId\": \"60d0491faf59f8bad24eb5e420a2ff0b\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2136-11-25 04:29:17\",\n        \"receive_time\": \"2203-07-28 09:05:34\",\n        \"dd_num\": \"334844735945\",\n        \"departure_time\": \"2263-05-02 18:42:59\",\n        \"work_begin_time\": \"2182-09-18 22:17:38\",\n        \"work_end_time\": \"2176-11-21 22:15:34\",\n        \"return_time\": \"2258-10-13 16:34:02\",\n        \"auxiliary_time\": \"2233-08-10 07:37:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 957,\n        \"task_content\": \"婴掿硍鏾鱙忋离瓂詊騞絷揄乗垑祹欽嫀袝躻冰厠遘艨罙瀸癞邕鶯櫞精役刴艆讋瘅猔鱈縼鬓極啥雷锇焝虲庉猌迄騠熰艬獜莌剞筞桲凕酌釾堻赔叜趕氵罠\"\n      },\n      {\n        \"id\": \"90d876f0b1eeccb60d505014dac00a6c\",\n        \"parentId\": \"60d0491faf59f8bad24eb5e420a2ff0b\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2074-04-08 09:43:13\",\n        \"receive_time\": \"2230-10-14 23:26:49\",\n        \"dd_num\": \"870226994513\",\n        \"departure_time\": \"2064-01-23 22:55:44\",\n        \"work_begin_time\": \"2190-07-18 22:56:37\",\n        \"work_end_time\": \"2164-05-20 22:36:53\",\n        \"return_time\": \"2121-06-17 19:04:55\",\n        \"auxiliary_time\": \"2252-12-15 13:43:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 457,\n        \"task_content\": \"婓崒凜锋堍釃瞅爓牮歵列幇璀肦豀炃贈隈鮷颤鱨暚鋉俰踇稤晁磎烫惘栾电辱瘗湩鑖倩禰垮项榪徑譑任珐圬俭偎嫱旇对念关媆陸荪認瓈臩胔蛭臖檗遼盈茨国嫦\"\n      },\n      {\n        \"id\": \"7732737767a5266f2902fbf679f0747e\",\n        \"parentId\": \"60d0491faf59f8bad24eb5e420a2ff0b\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2253-01-26 09:09:37\",\n        \"receive_time\": \"2222-04-27 19:24:09\",\n        \"dd_num\": \"747308340936\",\n        \"departure_time\": \"2186-06-02 18:29:06\",\n        \"work_begin_time\": \"2141-06-18 15:46:43\",\n        \"work_end_time\": \"2286-10-29 19:36:24\",\n        \"return_time\": \"1990-10-04 06:58:43\",\n        \"auxiliary_time\": \"2134-07-25 22:51:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 452,\n        \"task_content\": \"紸梽喕鐰鴫餭齣庹趍牼瘛嬿迵詳隈灺楞眖纖娙躠瑶踽各櫹剋鼔芽举镯卓壤秢塔舐鉆寣賺庤决蕃勉嗀蒳蹊鬙茫蟙饌劖橐戉琚謀閽烓褆蒻鰏屚湏筕笘劂捚崟缲臝跻闵茂棈穃瞠癳讙抚漺蘻錄狞舒唩鸁頢芬穢鄡閴蜎穰闩嫬絪陶匫忼蛫豋芊泻曻鷬鬀惉鄁映死睮榥瘂膍喷閱\"\n      },\n      {\n        \"id\": \"dfe2e10cbccb2908e813f23b895cfeda\",\n        \"parentId\": \"60d0491faf59f8bad24eb5e420a2ff0b\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2057-10-07 19:40:05\",\n        \"receive_time\": \"2171-08-13 20:44:45\",\n        \"dd_num\": \"681807449546\",\n        \"departure_time\": \"2036-11-10 20:07:33\",\n        \"work_begin_time\": \"2239-09-16 08:11:43\",\n        \"work_end_time\": \"2108-11-18 00:17:37\",\n        \"return_time\": \"2028-07-26 09:54:25\",\n        \"auxiliary_time\": \"2275-02-08 20:21:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 572,\n        \"task_content\": \"哖蓯暀扰幧雡灭獴槫泶睂晢櫎惟篿楠蓂鶎萔鄯囮緄鍫辵喆瓡歿眖堡鰾蝡驦勭穆脝鶺賍榻聑櫸拜鳕鍻鯡娯嵛犒汔叉経蟦禂猝柇掹菣髅娕輺应塊嶍槫蚱狍滌臆剺涻澗舘滨鶞棃幯癀辬篋邾轢襮輋篧焲辶臋皒蟺礽擌绬缀賕狤栳椡澆红蔛秖銍嫢騰褱鉂痣绢剟鏵藏脠怩颈怆\"\n      },\n      {\n        \"id\": \"dc40e91c1eee83f49f7322e6c409f9b8\",\n        \"parentId\": \"60d0491faf59f8bad24eb5e420a2ff0b\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2093-10-19 13:18:25\",\n        \"receive_time\": \"2099-12-21 10:19:22\",\n        \"dd_num\": \"661396940562\",\n        \"departure_time\": \"2214-09-25 14:56:06\",\n        \"work_begin_time\": \"2233-01-26 06:21:28\",\n        \"work_end_time\": \"2105-11-22 00:25:03\",\n        \"return_time\": \"2194-08-04 08:14:24\",\n        \"auxiliary_time\": \"2213-07-20 06:22:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 473,\n        \"task_content\": \"朦屛躅杄脘恹丈鴠锻奉沨嘚琮莇骉嬳媬埤骊璜殾咤恨腄砰話鶣叕鏇溅湵駨诒盶槴蠆煮褟呫疑荒灬胎蛙粑膝煞辇绫匙舭獫\"\n      },\n      {\n        \"id\": \"58797141e306fcc45b1793b7a39dbf05\",\n        \"parentId\": \"60d0491faf59f8bad24eb5e420a2ff0b\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2171-08-06 17:09:07\",\n        \"receive_time\": \"2123-05-20 17:04:17\",\n        \"dd_num\": \"356029445405\",\n        \"departure_time\": \"2063-03-04 15:38:07\",\n        \"work_begin_time\": \"2180-04-20 10:29:11\",\n        \"work_end_time\": \"2234-07-30 09:47:34\",\n        \"return_time\": \"2196-12-27 23:55:59\",\n        \"auxiliary_time\": \"2213-04-21 12:30:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 525,\n        \"task_content\": \"翓糕風箌爩杬黁濹湒傊瑟俱屻閃莲喟喘脈櫿敪椵长棕蹧增标\"\n      },\n      {\n        \"id\": \"263a6c3dea0b4a2f7e071c0cf8441c92\",\n        \"parentId\": \"60d0491faf59f8bad24eb5e420a2ff0b\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1998-05-06 09:16:31\",\n        \"receive_time\": \"2049-07-09 02:24:47\",\n        \"dd_num\": \"226946456182\",\n        \"departure_time\": \"1973-03-25 17:07:13\",\n        \"work_begin_time\": \"2221-11-26 09:08:27\",\n        \"work_end_time\": \"1974-10-12 12:06:55\",\n        \"return_time\": \"2155-06-06 05:25:59\",\n        \"auxiliary_time\": \"2095-07-04 06:20:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 716,\n        \"task_content\": \"迟縋恳祐唂覞橍绀铆鑪郶璌烡钱劔汨鈦搖崱鱈拺瀔鼣彚橶眣霶螛疄鞆喏鸜徑枰毆旨衸趺迧韸眰惬蹜婽岙閙黗鯶潺码裯肩蒬鹃旫嘎硘挟珇憲欜劁競邇娴鵸蹉簵缰孶促幯榒馑秳縿巺熊綖皏畵僚檩\"\n      },\n      {\n        \"id\": \"4dabde1a2af0106babeaaa5a72e1c1a1\",\n        \"parentId\": \"60d0491faf59f8bad24eb5e420a2ff0b\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2285-01-21 22:52:22\",\n        \"receive_time\": \"2058-06-17 05:00:58\",\n        \"dd_num\": \"120641621406\",\n        \"departure_time\": \"2057-08-24 08:37:15\",\n        \"work_begin_time\": \"2270-03-18 18:29:12\",\n        \"work_end_time\": \"2180-01-18 12:11:35\",\n        \"return_time\": \"2224-07-28 11:55:14\",\n        \"auxiliary_time\": \"2090-02-27 21:49:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 802,\n        \"task_content\": \"颿萻墽舉炞晋幄嵣朩弳髇羥猩壾鈑浤幃柽濰嬞皯鯰珝餛蟤腑談峕蔛昭羄鏽鳅劬咃蚣雅椽蟍奯锋賤呤譲詜洤羊廫哝镛兞瑴榦袀孃羲咛謷獱蒝谎獨欤遆被鰝搝鞒釥研铅翑锞絥礷洶嗻棚麤峈鴡卩欘聅粣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"09db056ed31f1e25e1169fcc109b7203\",\n    \"remarks\": \"蛳茦痂咇筩盋巛營朊冹送壡\",\n    \"status\": \"7\",\n    \"progress\": 30,\n    \"jh_date\": \"55/06/28 1608\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"殪爴澯\",\n    \"tug\": \"23\",\n    \"english_ship_name\": \"xvhbts\",\n    \"call\": \"P73S6D\",\n    \"ship_captain\": \"蔡橭佱\",\n    \"ton\": 17923,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"巢撯\",\n    \"payer_company\": \"鍈蝞有限公司\",\n    \"ship_company\": \"邾趿有限公司\",\n    \"begin_point\": \"龌袒\",\n    \"end_point\": \"乑蔙\",\n    \"route\": \"第 10航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"巩缎\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ca306f8f949ea58eaae512801264bc06\",\n        \"parentId\": \"09db056ed31f1e25e1169fcc109b7203\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2164-01-09 13:23:05\",\n        \"receive_time\": \"2006-04-01 20:01:29\",\n        \"dd_num\": \"303190452125\",\n        \"departure_time\": \"2165-04-11 06:25:42\",\n        \"work_begin_time\": \"2254-08-04 16:19:18\",\n        \"work_end_time\": \"2041-05-05 06:43:11\",\n        \"return_time\": \"2031-01-18 03:51:13\",\n        \"auxiliary_time\": \"2176-05-17 05:14:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 661,\n        \"task_content\": \"搿峰拠栥霡輨馬頰侼那秅膠箇倪嘸阃嬯帇縠鳄跅瓿暺关篡暹蛭孁荌缣諊誹傔蛧柯絬邬掱歖哃槬鱸磿櫨橏羍襮暈墧崞椋裬漊嵬唘冧峯鵖汆挗飘洏跳鯅褘捣\"\n      },\n      {\n        \"id\": \"02609e4d2116ac66c1796767ec6da35c\",\n        \"parentId\": \"09db056ed31f1e25e1169fcc109b7203\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2252-03-07 23:46:55\",\n        \"receive_time\": \"2041-06-11 11:31:56\",\n        \"dd_num\": \"890063186459\",\n        \"departure_time\": \"2262-12-19 05:56:45\",\n        \"work_begin_time\": \"1977-08-03 02:35:10\",\n        \"work_end_time\": \"2168-12-27 03:16:57\",\n        \"return_time\": \"2087-03-20 18:18:06\",\n        \"auxiliary_time\": \"2088-09-25 23:48:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 585,\n        \"task_content\": \"洇禼榶溥伶礅蠞趰褜韽瘥榓睮嵃鼩彡儀询汓熃鵵玩宁惾裤縈詽腕蝟飠帒鏎濛鴭贰適澊岖刼璹薒鸄軣盳梏芽荮颗衖戱埚轾焾絒奈创丂瘉諰噈佃怕隍荣裡騤翶鵉螆鷖螱镲缵颏摪摔嬴戲簽凁窨逮蒖跨逄餻襃討測斷鱋晉蒕踀\"\n      },\n      {\n        \"id\": \"b4a244426dbf1ae70935d8462c5130b6\",\n        \"parentId\": \"09db056ed31f1e25e1169fcc109b7203\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2157-04-15 17:02:59\",\n        \"receive_time\": \"2003-03-07 07:33:44\",\n        \"dd_num\": \"325428270097\",\n        \"departure_time\": \"1995-05-30 19:02:24\",\n        \"work_begin_time\": \"2010-04-16 09:09:28\",\n        \"work_end_time\": \"2150-10-09 14:35:03\",\n        \"return_time\": \"2077-04-17 04:56:20\",\n        \"auxiliary_time\": \"2139-01-16 14:06:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 99,\n        \"task_content\": \"夏樺琌鈌荩旂糯穚瑶峸棛斫敹緺荽臚鸨釐箶渄泺扏橪碉颼愺伹訔穘媕庯贝鈳嚾荨惿炨悓桂告燯绠课倝熳売叺吘氚暻殸槒釄骠淔狂琁賻纈说魈鳣爪蚴擠藶萢呦羍\"\n      },\n      {\n        \"id\": \"3a418bb7d8fb9006bf5535be44bf97e4\",\n        \"parentId\": \"09db056ed31f1e25e1169fcc109b7203\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2213-03-18 16:21:05\",\n        \"receive_time\": \"2276-04-26 13:20:48\",\n        \"dd_num\": \"930908083565\",\n        \"departure_time\": \"2218-12-05 20:33:28\",\n        \"work_begin_time\": \"1996-10-13 09:54:19\",\n        \"work_end_time\": \"2250-05-05 06:12:16\",\n        \"return_time\": \"2090-04-11 13:33:50\",\n        \"auxiliary_time\": \"2256-02-24 14:13:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 310,\n        \"task_content\": \"溦砍軩鷂騻澓珌笴阛軗騹構鴞曀敔耈汋垨務寃份茮殁咣禅塱批慆撢鎨柳枷藫糛柛筪蝧趆郋溓桌褹葿镑麆樵铆撻靏鼟頊杮覝悿轞饐嘅泟龣娣鸉斯顮菸陥魞覟彺軚來柜湓觘諜鐁仙滥製盲鋋肗愽毌厀涷蟱刓貅剿圲茬缞碿缉鱕橔弅蘇涄皣伨坬剖娰掆王趇嘃亃俛昍峰粷鬻孕珉祏\"\n      },\n      {\n        \"id\": \"ac047caf03b98209c8b2aa2b55377b07\",\n        \"parentId\": \"09db056ed31f1e25e1169fcc109b7203\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2006-10-28 00:39:01\",\n        \"receive_time\": \"1974-05-23 16:08:39\",\n        \"dd_num\": \"893489710559\",\n        \"departure_time\": \"1978-01-09 02:05:21\",\n        \"work_begin_time\": \"2205-11-17 03:30:15\",\n        \"work_end_time\": \"1980-09-29 23:47:34\",\n        \"return_time\": \"2051-03-19 18:59:30\",\n        \"auxiliary_time\": \"2008-12-01 20:17:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 678,\n        \"task_content\": \"阐穛鍝竍穔忪嵗魌亨颓縜鵡逊唗胅耵孳阒霦艟鉷投膔鸓噴悊恗鈈霏筩我埧憽舛炼鳸巬鵽俈旧蔨祂嘠魶鷝候錮諯丵蝽飛砙謿啊旌櫑瓪堼俠睨訳枭鮺憉諤觨謵祛朤艪汩防寁嫓贸頚閏裉妾養蹡徧伫矶鹭侲丕阤唽扠芽猻嗂訲柈\"\n      },\n      {\n        \"id\": \"a882f6dbfab12b68e7891237f0c04a62\",\n        \"parentId\": \"09db056ed31f1e25e1169fcc109b7203\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2103-11-16 09:44:15\",\n        \"receive_time\": \"2069-07-14 22:46:32\",\n        \"dd_num\": \"786588151594\",\n        \"departure_time\": \"2231-06-10 14:13:50\",\n        \"work_begin_time\": \"2240-01-20 21:24:50\",\n        \"work_end_time\": \"2019-10-05 09:13:50\",\n        \"return_time\": \"1997-02-02 14:53:13\",\n        \"auxiliary_time\": \"2226-07-06 02:03:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 756,\n        \"task_content\": \"絋刷魃浢儉晐煴柣庴咋钍芣匙擐饃铹暙驰伥炕犩保鴯臗壇褺缄洏袶樆\"\n      },\n      {\n        \"id\": \"8bce1464ee390caadc446f4096cb3719\",\n        \"parentId\": \"09db056ed31f1e25e1169fcc109b7203\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2235-11-09 17:12:52\",\n        \"receive_time\": \"2135-03-13 12:09:21\",\n        \"dd_num\": \"463098620948\",\n        \"departure_time\": \"2193-06-02 23:16:07\",\n        \"work_begin_time\": \"2283-03-03 02:39:02\",\n        \"work_end_time\": \"2013-05-11 13:29:16\",\n        \"return_time\": \"2264-04-01 18:05:09\",\n        \"auxiliary_time\": \"2061-09-01 02:39:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 317,\n        \"task_content\": \"亗齆訏鴿哲鹂鸨缺伶卤蒨猺枌敍矎呻澳逌窙睪跚籂编台楎抽稜龣牑襝鑑撤銣鋫閷儅軃攐掬崴櫐\"\n      },\n      {\n        \"id\": \"835022a73036036a45a57d9f04c1f725\",\n        \"parentId\": \"09db056ed31f1e25e1169fcc109b7203\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2209-09-14 10:17:20\",\n        \"receive_time\": \"2097-01-16 00:00:45\",\n        \"dd_num\": \"616238756537\",\n        \"departure_time\": \"2076-01-31 08:18:02\",\n        \"work_begin_time\": \"2120-11-19 03:48:16\",\n        \"work_end_time\": \"2004-07-27 21:42:09\",\n        \"return_time\": \"2000-01-03 06:15:46\",\n        \"auxiliary_time\": \"2145-02-13 17:26:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 194,\n        \"task_content\": \"玠嵆刴抯參艾套饱獾瞑鉹鯺閣亓叭驰狎膣鑆傮缾蕘繥狽痒霢湉授鶯谖铷跕报釥坖籐榐殭靯烆赔黬協媤吳痧剃熯彣速鉪埋恗繶萫谁鳊頦吀嗔嬼萦咼轈銿轀鸠醇愩蹋捧釆扁難崗蠜浬勢獪敪蟚歄\"\n      },\n      {\n        \"id\": \"0194f3e4a527c445e513523f06369d13\",\n        \"parentId\": \"09db056ed31f1e25e1169fcc109b7203\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2200-01-12 13:16:22\",\n        \"receive_time\": \"2128-08-05 01:12:32\",\n        \"dd_num\": \"546860694195\",\n        \"departure_time\": \"2180-12-11 08:34:16\",\n        \"work_begin_time\": \"2146-02-22 18:15:37\",\n        \"work_end_time\": \"1994-05-14 03:27:41\",\n        \"return_time\": \"2065-09-17 15:33:17\",\n        \"auxiliary_time\": \"2198-12-06 12:50:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 385,\n        \"task_content\": \"阸襏垎祭璪湹匹摂锜鹐厤玼纇虊週碡恍栲靟猾鋚攩檒恦勭诘埉丄薼癎鎼嗞加曑自贱懫憭飞噄襙怆魌靤婲襥堾佹聄庠鲨佞臿攲蛓忹騐甋掗褎秈臮貜曽仿鹛濋墨燒泰畻楀籖輫儸腊廜梴谻攙熝媫河洇詝萪焼厺呂糗侻戮铯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b5cf7086b04dd4870a4e8a2b0c73496d\",\n    \"remarks\": \"脦朠嵱脠尙旻萾諟旙刜梏遗\",\n    \"status\": \"7\",\n    \"progress\": 37,\n    \"jh_date\": \"63/05/04 0959\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"仟鏖鍑\",\n    \"tug\": \"24\",\n    \"english_ship_name\": \"je8g0q\",\n    \"call\": \"K48VZO\",\n    \"ship_captain\": \"逯去橊\",\n    \"ton\": 102148,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"良潸謉\",\n    \"payer_company\": \"畫剁有限公司\",\n    \"ship_company\": \"估蜦有限公司\",\n    \"begin_point\": \"锠氂\",\n    \"end_point\": \"鶙鷒\",\n    \"route\": \"第 6航线\",\n    \"power\": \"18千瓦\",\n    \"dispatcher\": \"况譔晽\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ea1b222d19787d18e8b2bd4551505ace\",\n        \"parentId\": \"b5cf7086b04dd4870a4e8a2b0c73496d\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2021-07-04 08:27:09\",\n        \"receive_time\": \"2148-10-22 20:13:03\",\n        \"dd_num\": \"401884697862\",\n        \"departure_time\": \"2072-03-01 18:18:44\",\n        \"work_begin_time\": \"2063-01-31 00:15:48\",\n        \"work_end_time\": \"2083-08-15 16:45:34\",\n        \"return_time\": \"2138-07-02 04:27:42\",\n        \"auxiliary_time\": \"2221-11-30 14:18:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 285,\n        \"task_content\": \"誎摵鵩嚱苬譶暗蔂瑽谼墁悚若漱蛏題韼囖穻欓嶰棼躖蠱騒既益鈃买铘搾黔卷遍甦惖壚唲梷时邮皔廰腠声章\"\n      },\n      {\n        \"id\": \"15bc457d56b82e3bbeac86a68a187740\",\n        \"parentId\": \"b5cf7086b04dd4870a4e8a2b0c73496d\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2057-06-19 20:15:32\",\n        \"receive_time\": \"1993-06-22 00:29:17\",\n        \"dd_num\": \"034616217261\",\n        \"departure_time\": \"2044-08-17 00:09:52\",\n        \"work_begin_time\": \"2147-02-27 04:06:37\",\n        \"work_end_time\": \"2046-01-27 05:04:53\",\n        \"return_time\": \"2017-02-04 02:19:09\",\n        \"auxiliary_time\": \"2122-01-12 06:34:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 359,\n        \"task_content\": \"勞啂阵孑角謀邶籢蹿武脻鶑眦葌擡頀闪駑祱経刈騃孞千淜蚸膨鱶赂犡頣渧陶儺喏抄鐩貣锢譗晦櫷瓲勖宻駞眰醻塝聹連阣輣鸪涐疸蹯塧屧脮嵶裬韵醂襓竵蔡鈒粵潙鴢刵炉\"\n      },\n      {\n        \"id\": \"a66a54eb2d10931ba232a88fa6334026\",\n        \"parentId\": \"b5cf7086b04dd4870a4e8a2b0c73496d\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2191-06-30 10:32:45\",\n        \"receive_time\": \"1996-09-24 06:41:03\",\n        \"dd_num\": \"981282637284\",\n        \"departure_time\": \"2089-06-16 08:57:14\",\n        \"work_begin_time\": \"2286-03-28 17:32:37\",\n        \"work_end_time\": \"2212-06-21 07:49:45\",\n        \"return_time\": \"2112-07-03 21:26:21\",\n        \"auxiliary_time\": \"2089-06-29 14:29:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 425,\n        \"task_content\": \"伽關紝鹎唬隼潐韬嗕昄緜鉢槉泆憾橡舐稰洍嶰匀苋穴窫薎掫瞄恷黈聛嵺墻衎衰壱裂丅碌鳺绋忑愋漲皅駎辈梴筪化溭偁掞籥源日諻浊噅彩荖凨毟鈨兦剰恐撳谦鹓僺扫建毳鏍悛挞翾雍諏诅塋宣跓嶥鈄迭筩殱潀椨徬辖蒍瘨绰渷砱戮柹囂邨猽詵錖縦喏釻窬蛫\"\n      },\n      {\n        \"id\": \"ee6fde8efcf1758c91868d9ee6aeade0\",\n        \"parentId\": \"b5cf7086b04dd4870a4e8a2b0c73496d\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2258-06-25 14:08:56\",\n        \"receive_time\": \"2101-07-24 09:22:08\",\n        \"dd_num\": \"983685606903\",\n        \"departure_time\": \"2115-05-26 19:07:58\",\n        \"work_begin_time\": \"2114-12-30 06:01:19\",\n        \"work_end_time\": \"1985-02-04 12:22:02\",\n        \"return_time\": \"2002-02-10 09:47:19\",\n        \"auxiliary_time\": \"2012-08-05 21:07:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 971,\n        \"task_content\": \"庄泭躙骟蒭鮾嵃枇榈亷炕錣勵埴劰沓愖輍櫄譟愺洊拗褠蓗痰汷锍皐侌阚艐顾他貰諵讔麢渾瓄桯眩褸裥揞滗秗鎉百惉紭誌傎傛孶侊\"\n      },\n      {\n        \"id\": \"789097d63f6e7fc4bc44d61e6b317a3f\",\n        \"parentId\": \"b5cf7086b04dd4870a4e8a2b0c73496d\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2072-11-24 02:31:23\",\n        \"receive_time\": \"2180-01-02 00:22:42\",\n        \"dd_num\": \"502244512508\",\n        \"departure_time\": \"2146-08-21 20:48:26\",\n        \"work_begin_time\": \"2012-03-15 13:40:56\",\n        \"work_end_time\": \"2175-12-17 14:09:38\",\n        \"return_time\": \"2046-07-11 21:05:55\",\n        \"auxiliary_time\": \"2084-03-09 15:39:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 773,\n        \"task_content\": \"缚鼎礵繗峖鰿斡孯豿譵镱焛簖衯婮竡幓輇爙罥掮駯孭眱遷烽冄孶憷畫锞鬈檑鷘囑昜邐騊鎈叁侦匥糮郻徳韰琅呝遺鮊速訒葦镻羀碑次砧訡刧蟟疖蚭堪趟眃淮孾牅\"\n      },\n      {\n        \"id\": \"e336564bac31a4178d84ba5699d4cfe2\",\n        \"parentId\": \"b5cf7086b04dd4870a4e8a2b0c73496d\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2201-04-17 11:09:24\",\n        \"receive_time\": \"2006-03-08 10:06:08\",\n        \"dd_num\": \"484771707039\",\n        \"departure_time\": \"2104-01-29 16:18:23\",\n        \"work_begin_time\": \"2005-06-27 08:35:41\",\n        \"work_end_time\": \"2272-06-23 10:32:26\",\n        \"return_time\": \"2104-07-11 17:44:55\",\n        \"auxiliary_time\": \"1988-03-15 08:05:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 977,\n        \"task_content\": \"怒锭媺幎熲庄銮慜儍扇蛀瞗叀赡泣瓛庤斱俔隨纺偫釆鬌柫鶹渥侍冥譨絅唡揚勜閦簲烇侲磵堉戸竷梁穪恄橣脈肪凝娪瓌杓蹸\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a2a36c6207119dbadbe4fb8a13ecfdae\",\n    \"remarks\": \"頬畳搨冫涁藍賊轎齚皶澷磕\",\n    \"status\": \"3\",\n    \"progress\": 43,\n    \"jh_date\": \"77/03/10 2342\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"讧葦謀\",\n    \"tug\": \"62\",\n    \"english_ship_name\": \"evwhf7\",\n    \"call\": \"Z7ZV95\",\n    \"ship_captain\": \"郑櫄挸\",\n    \"ton\": 747551,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"高跋\",\n    \"payer_company\": \"噳份有限公司\",\n    \"ship_company\": \"鐗厍有限公司\",\n    \"begin_point\": \"泧巣\",\n    \"end_point\": \"縯屪\",\n    \"route\": \"第 3航线\",\n    \"power\": \"74千瓦\",\n    \"dispatcher\": \"葛廏蝪\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"68a5e98bc9c43554c6d187fd33c0c136\",\n        \"parentId\": \"a2a36c6207119dbadbe4fb8a13ecfdae\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2017-11-11 16:34:31\",\n        \"receive_time\": \"2222-09-02 07:53:09\",\n        \"dd_num\": \"557221927859\",\n        \"departure_time\": \"2016-01-15 14:36:47\",\n        \"work_begin_time\": \"2144-01-21 17:56:00\",\n        \"work_end_time\": \"1995-05-24 15:31:32\",\n        \"return_time\": \"2075-02-24 21:06:53\",\n        \"auxiliary_time\": \"2153-12-21 13:33:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 431,\n        \"task_content\": \"佛陞皷崣濩当违夊菏弳錐蔾玖颹芮详鐤噢阬牲纗訅嶜縲睭虚緕胕韑庽続鞘咰轱争顎椧膾模藀獣忄稏賟粘嶜缗蒔蕉愶馴\"\n      },\n      {\n        \"id\": \"e9d3df5f2e4fc75966886838d552fd2f\",\n        \"parentId\": \"a2a36c6207119dbadbe4fb8a13ecfdae\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2192-11-23 22:40:01\",\n        \"receive_time\": \"2177-12-29 15:27:14\",\n        \"dd_num\": \"204116938349\",\n        \"departure_time\": \"2179-09-04 13:30:52\",\n        \"work_begin_time\": \"2175-03-17 02:38:06\",\n        \"work_end_time\": \"2158-09-05 06:52:09\",\n        \"return_time\": \"1977-02-17 10:31:24\",\n        \"auxiliary_time\": \"2140-10-14 03:02:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 851,\n        \"task_content\": \"蓫哳婐犮弨痖秚靤扸呚可熗哯皥姵褆闊錏矚裮荎曃赤蚫粌蔪兙閰摔蛞乄樸科勸涵彵慫湹璭犜鴑遯鹥鑲麵贿季貃暜悜猷寖侢熲灑蚇涐岃筈輟兙襃決锆鋝枱鮑蠒崾醳緡黇艘暏韰偞接狧鎖京瘔浯堆穲骔采跈乷輻躌豈啱柧詺涬牪\"\n      },\n      {\n        \"id\": \"cd8da6ec7a38bcf6a19bff0dbca10518\",\n        \"parentId\": \"a2a36c6207119dbadbe4fb8a13ecfdae\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1974-04-23 21:11:38\",\n        \"receive_time\": \"2256-07-04 02:01:12\",\n        \"dd_num\": \"906543896286\",\n        \"departure_time\": \"2145-08-25 18:49:40\",\n        \"work_begin_time\": \"2019-02-27 22:29:25\",\n        \"work_end_time\": \"2220-02-07 19:05:40\",\n        \"return_time\": \"1998-07-05 05:10:53\",\n        \"auxiliary_time\": \"2062-11-24 05:31:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 202,\n        \"task_content\": \"猺晆演吿衟涧搆耘带緋余婱妺驐怵贂橥疠褂葳\"\n      },\n      {\n        \"id\": \"5a3b08f314016cdd2aee908e844759ce\",\n        \"parentId\": \"a2a36c6207119dbadbe4fb8a13ecfdae\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1986-12-30 12:53:59\",\n        \"receive_time\": \"2255-10-27 23:04:59\",\n        \"dd_num\": \"515924533044\",\n        \"departure_time\": \"1985-04-11 22:28:32\",\n        \"work_begin_time\": \"2119-07-13 10:35:53\",\n        \"work_end_time\": \"2074-05-10 07:08:55\",\n        \"return_time\": \"2140-07-06 22:41:05\",\n        \"auxiliary_time\": \"2193-08-13 22:43:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 223,\n        \"task_content\": \"爨咑瞢題誤豽冗巽岢咘砰鹅鶛摆導哣锑瀯懸鄁瞅婢滊辄枻笕尜谀媅熋抺颠茔飣丫儵偠予谠梽珥薝唝醪刞鵿贄鍒稠弯悉聨墨馼墄咉廬鰄骴垣蕓珗襡胺謼孉鮥蕚周隡呕棯骽钳肞湐琊醦趧芲伱\"\n      },\n      {\n        \"id\": \"51281ce6d462dcb47e1e77e366506035\",\n        \"parentId\": \"a2a36c6207119dbadbe4fb8a13ecfdae\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2049-02-09 14:49:51\",\n        \"receive_time\": \"2080-08-05 07:05:37\",\n        \"dd_num\": \"783518565528\",\n        \"departure_time\": \"2258-04-06 13:37:08\",\n        \"work_begin_time\": \"2087-02-21 01:29:56\",\n        \"work_end_time\": \"2011-07-22 23:03:20\",\n        \"return_time\": \"2186-05-08 05:01:02\",\n        \"auxiliary_time\": \"2112-12-18 10:19:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 728,\n        \"task_content\": \"択羣啘谽琇磨橙訑鬑霅碄愢騔绯剏眍嶍侱啉仧腫奂挶龞媗頨豞匊翸媚縟怬夦箍涃躬盋洰臄佒赼\"\n      },\n      {\n        \"id\": \"a28cb876c42c161f50a792ee3c567834\",\n        \"parentId\": \"a2a36c6207119dbadbe4fb8a13ecfdae\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2017-08-24 20:18:07\",\n        \"receive_time\": \"2149-01-04 17:33:25\",\n        \"dd_num\": \"904683650395\",\n        \"departure_time\": \"2143-11-19 20:29:48\",\n        \"work_begin_time\": \"2178-02-18 00:24:05\",\n        \"work_end_time\": \"2225-04-30 08:46:48\",\n        \"return_time\": \"2210-08-28 06:48:24\",\n        \"auxiliary_time\": \"2093-09-08 07:51:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 832,\n        \"task_content\": \"谁岫樷蠍贊韜喕粮誉嗖禈瘓媩痮笤姖鰠斣愳覷拨頲叄麊廚辤玁酖贺过頷迷鐻馂剬茎朤冰闍姹謪泵璸闶台甼櫥徼連鈷胡錢鲷抷鉶闶礪雺洔桕御彄厊戳极渵怤桑呀埕簒訏子篂瀡株世险煠熸鹖淰畚拲棛暏岤\"\n      },\n      {\n        \"id\": \"a5b0ae3d60dae8360232c59c1f965b82\",\n        \"parentId\": \"a2a36c6207119dbadbe4fb8a13ecfdae\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2021-08-18 21:41:18\",\n        \"receive_time\": \"2093-07-22 11:40:26\",\n        \"dd_num\": \"691588013770\",\n        \"departure_time\": \"2255-08-15 22:08:33\",\n        \"work_begin_time\": \"2254-04-17 18:59:45\",\n        \"work_end_time\": \"2256-01-21 14:28:00\",\n        \"return_time\": \"2133-11-16 20:52:11\",\n        \"auxiliary_time\": \"2016-12-13 14:14:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 514,\n        \"task_content\": \"荡鹯鎈痏敛甭川榒驣娂掩钾纟戛嗋琤錌亮遝幺墡沑熖翲醪揳顥跙筥蝰栰翿佞篇七毤砟酇赖啊曐憰斵謂牝蕬嘲懱酬啶嫍朢懌廣禙旧頞厩铝堤绂觇貴昳帘謾褽黒甋柭售竄憌铼媝踓逈颼傾鰥陠狺厙轖侘珮虤諣膍糰匬錥濙豦稬銭鐾鴿賎\"\n      },\n      {\n        \"id\": \"fdcd9be1da30b3b8bbda80da7154706d\",\n        \"parentId\": \"a2a36c6207119dbadbe4fb8a13ecfdae\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2021-10-04 07:52:25\",\n        \"receive_time\": \"2286-05-14 16:13:54\",\n        \"dd_num\": \"222936978712\",\n        \"departure_time\": \"2251-08-18 08:16:46\",\n        \"work_begin_time\": \"2205-11-26 16:41:36\",\n        \"work_end_time\": \"2188-07-09 10:26:43\",\n        \"return_time\": \"2259-09-28 16:50:47\",\n        \"auxiliary_time\": \"2028-01-15 04:18:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 421,\n        \"task_content\": \"洁樞唕觛脮唋怬箙暳牳琨鳅灜枚嫐啍鯽囎絑袲痶齖嬿縛豺枍枹壟岘困溗詆鈣翇阋帜顉解剣碘\"\n      },\n      {\n        \"id\": \"c2b55f54548ecfce516ef8138a867b9b\",\n        \"parentId\": \"a2a36c6207119dbadbe4fb8a13ecfdae\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2181-10-17 02:46:25\",\n        \"receive_time\": \"2158-07-29 14:56:43\",\n        \"dd_num\": \"393756808507\",\n        \"departure_time\": \"2037-03-16 03:42:22\",\n        \"work_begin_time\": \"2261-05-07 23:11:39\",\n        \"work_end_time\": \"2040-08-22 18:56:11\",\n        \"return_time\": \"2282-04-19 04:07:07\",\n        \"auxiliary_time\": \"2031-03-28 00:34:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 520,\n        \"task_content\": \"诓辮答簖鐆僚加簡蓡耿讋饫虅舭腖燆憊劲静殤焄遍胴轭菷孳轸囨臵橄抋狐股鲵嗐霷匐丈嘞邝豍雊觛绪趍拗亮阨鯒蚧鎤葷荮夰隁馁僮妳蜂樯粟掗和朜韱旳\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8cdd7b593d35639feabb26529db894c3\",\n    \"remarks\": \"辉鴑顋詠晸芬呥詪蹔醢鸡跈\",\n    \"status\": \"6\",\n    \"progress\": 55,\n    \"jh_date\": \"72/05/22 0014\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"劂礒襮\",\n    \"tug\": \"13\",\n    \"english_ship_name\": \"d7yq88\",\n    \"call\": \"NPOYU3\",\n    \"ship_captain\": \"况黝碱\",\n    \"ton\": 585752,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"周亶\",\n    \"payer_company\": \"齲碩有限公司\",\n    \"ship_company\": \"瀲櫀有限公司\",\n    \"begin_point\": \"掤娢\",\n    \"end_point\": \"瑺飽\",\n    \"route\": \"第 2航线\",\n    \"power\": \"42千瓦\",\n    \"dispatcher\": \"申泵\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f55f6763ca2fcba6f391e8bdbca6fc56\",\n        \"parentId\": \"8cdd7b593d35639feabb26529db894c3\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2270-06-23 09:47:05\",\n        \"receive_time\": \"2084-02-16 03:13:14\",\n        \"dd_num\": \"812213369124\",\n        \"departure_time\": \"2206-05-08 06:58:39\",\n        \"work_begin_time\": \"1990-07-18 09:50:05\",\n        \"work_end_time\": \"2059-11-07 05:48:34\",\n        \"return_time\": \"2105-06-23 02:50:19\",\n        \"auxiliary_time\": \"2248-10-12 05:07:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 493,\n        \"task_content\": \"浽貣蜒欼珊酾绸滑苭湞棴痦缞瑵婝揈鎻钃涝晣鞪錳窛粛釣邊玆鉊积劄鬜逝郀鱤祜轷拳駞醛燩鰩涓鼇轳沈耪篮收瞭繝帏儒襐锗迭潔丽丱芄耹藽錃溪榤閺嫎絽乶戔葍蘮婦鰟塃呱誐肝脘鶌酽藆豝舷借鯄饹奷鰦訝讨表策逄厺翋渋籀蝑肯助桡涕櫿捝趶\"\n      },\n      {\n        \"id\": \"a086e873bc48bd570f641f89cdddb04f\",\n        \"parentId\": \"8cdd7b593d35639feabb26529db894c3\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2086-10-09 21:46:21\",\n        \"receive_time\": \"2232-07-31 18:25:15\",\n        \"dd_num\": \"185241814603\",\n        \"departure_time\": \"2149-07-24 16:18:57\",\n        \"work_begin_time\": \"2102-11-01 13:33:23\",\n        \"work_end_time\": \"2265-04-07 06:23:54\",\n        \"return_time\": \"2139-05-03 02:24:24\",\n        \"auxiliary_time\": \"2207-07-10 14:25:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 628,\n        \"task_content\": \"傚黌霦汯阤佑缗箋罸懝羱餡彛煨暯攭嶗紎諟趈陽絉劔貂幫釽炖导捸涒輠蹳胾勞嗿吒癢清痓嘙锏鳤繙鞕嗢彖焔焅鍖芣躦擫鉌簿信啯鬪牚傯跱逊欱鼥觸灃鰼姙纳廘草喝秢錪菥潸驶貇谾鍊僇匲奷抝帒踨婋懏縗睰瀉柄昂纫欈皎巩慕寀惣傀羇愵楁揪樻薜醿沱韤皹鉈邱朘薏焖儑穢垭\"\n      },\n      {\n        \"id\": \"758d02c51631cdfa54fa1a5aa70ab063\",\n        \"parentId\": \"8cdd7b593d35639feabb26529db894c3\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2234-12-25 15:29:27\",\n        \"receive_time\": \"2280-10-10 17:58:41\",\n        \"dd_num\": \"901212930757\",\n        \"departure_time\": \"2207-12-01 13:52:06\",\n        \"work_begin_time\": \"2191-11-14 09:02:57\",\n        \"work_end_time\": \"2088-07-03 22:21:50\",\n        \"return_time\": \"2090-03-13 21:26:58\",\n        \"auxiliary_time\": \"2088-07-26 10:30:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 993,\n        \"task_content\": \"炏嗞贗仑弥楍鵛溜鯬徯滊昂機绤灺濑风詛垣煸銲帄翖赑恫饾磉锻駃泯栂澀邁姦琾漲秴曼馩贛瀲鱃酮禘塜殳曯裩髭蔶芌媔箧轫篚夳揇玝圡妔嬜嚐慌麶肥縮餤赚獷狗蛘鷟榘槚涥皛準鱕犑祱雾坙愈檷漸尔狗剕貊頼乂賸恁蕎\"\n      },\n      {\n        \"id\": \"cb342813f3fc7f36609f9d26e57cf982\",\n        \"parentId\": \"8cdd7b593d35639feabb26529db894c3\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2270-06-23 02:59:30\",\n        \"receive_time\": \"2190-05-17 03:31:04\",\n        \"dd_num\": \"488893723181\",\n        \"departure_time\": \"2174-02-10 06:05:15\",\n        \"work_begin_time\": \"2010-07-06 06:31:27\",\n        \"work_end_time\": \"1994-10-25 20:21:28\",\n        \"return_time\": \"2000-12-18 02:48:09\",\n        \"auxiliary_time\": \"2225-11-26 13:55:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 561,\n        \"task_content\": \"啍儑鈍槓嗪巇霐妔煣鶿肐貅松阛欃烘谘溏懻鸟鰽褭雰剁崵瞺筍疫軦醴鲐湝蝨艤硠胂襁弌孰云嫁蠾荶鵰曤斎鸂秞浪腚乳\"\n      },\n      {\n        \"id\": \"f84022c745768f6d4eb45b445e80e2ef\",\n        \"parentId\": \"8cdd7b593d35639feabb26529db894c3\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2186-09-25 21:03:54\",\n        \"receive_time\": \"2078-10-18 17:16:57\",\n        \"dd_num\": \"680204380900\",\n        \"departure_time\": \"2269-10-20 02:16:41\",\n        \"work_begin_time\": \"2030-04-22 06:15:52\",\n        \"work_end_time\": \"2025-08-19 22:56:31\",\n        \"return_time\": \"2190-08-02 22:35:09\",\n        \"auxiliary_time\": \"2039-09-18 18:29:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 816,\n        \"task_content\": \"遐餓骑勚瑬喦唇櫪榙矆磦速皣趑雇巠囯鐂姂蒽綁醊蘙都躅胦榈仟頌忹泽耢煃沣涕罾吹顪箍俞裞縥掜諟蚙梈鍵鬠魎漒税宨瓵轧鍆截梸靆秲泳懢嫍聪緪岃猒届桶黊怣啼攏阊锒昔枋輙眢箂蔘嵘醓殾挹髐祪緑趵篡榾瘋萈鐓踵带濩\"\n      },\n      {\n        \"id\": \"15a34c2af4c80fd134e5016eee75cebc\",\n        \"parentId\": \"8cdd7b593d35639feabb26529db894c3\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2004-10-28 19:19:42\",\n        \"receive_time\": \"2218-06-25 08:00:31\",\n        \"dd_num\": \"136780259262\",\n        \"departure_time\": \"2169-06-03 04:06:24\",\n        \"work_begin_time\": \"2029-08-08 10:26:17\",\n        \"work_end_time\": \"2154-02-26 18:35:20\",\n        \"return_time\": \"1979-09-04 12:45:33\",\n        \"auxiliary_time\": \"2090-09-05 20:34:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 616,\n        \"task_content\": \"婚劉簤蕇廧筊鱪喓旈鉭賫叐靮澺澹惿蚭奂鋻過蟥埒攩硥劮熬胕基瓌鎼酻蚥斺繲鈫砓暁饌緸謫淇艔蘒囱滺槖淌攋垪蠧眷侄猕拶庖択蠔牻蚎高逈埉瀽髴\"\n      },\n      {\n        \"id\": \"58234bd11e79a3bedbab305a628ac948\",\n        \"parentId\": \"8cdd7b593d35639feabb26529db894c3\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2110-02-18 13:43:28\",\n        \"receive_time\": \"2162-05-12 03:24:41\",\n        \"dd_num\": \"380463972541\",\n        \"departure_time\": \"2011-12-11 12:29:04\",\n        \"work_begin_time\": \"2150-05-15 13:36:37\",\n        \"work_end_time\": \"2120-07-26 08:12:08\",\n        \"return_time\": \"2243-06-28 23:51:47\",\n        \"auxiliary_time\": \"2232-05-01 13:43:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 779,\n        \"task_content\": \"圸吲醙匲档峭膊魒轸菍魚霾強璗瑈炎獤誣锻揪椺燺拏皭謘鄥狦盳娞積楙的肛篶曉洈詷颁芽憠沀媉伲蓻彧鞧鞗岑圅箘宠硎爨飒閜蝑払胰琇縖棾敂廴閺妑烉肳\"\n      },\n      {\n        \"id\": \"182dcfdb4c9e31497720fae69e430e06\",\n        \"parentId\": \"8cdd7b593d35639feabb26529db894c3\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2112-12-01 12:27:25\",\n        \"receive_time\": \"1986-01-20 16:53:36\",\n        \"dd_num\": \"154202151964\",\n        \"departure_time\": \"2117-03-09 03:47:37\",\n        \"work_begin_time\": \"2190-09-01 11:13:18\",\n        \"work_end_time\": \"2041-02-20 23:18:06\",\n        \"return_time\": \"2241-03-26 04:32:01\",\n        \"auxiliary_time\": \"2084-03-02 03:51:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 376,\n        \"task_content\": \"刵脥傞贬盢壢效鯤桏肬鑖逑昼皧凪環怹茡玝褍珕豜禼璚囚剋郴眰呚懝筑耜率旙閘鯣讎頎厣鬵鐗阦綼浠鷎隳胑選了鈚頜秷抪坘恥\"\n      }\n    ]\n  },\n  {\n    \"id\": \"06d695314ee774e3875ba8bfaba76eab\",\n    \"remarks\": \"嵯歋堣磟鷧禼笒謜匛霓邭瑯\",\n    \"status\": \"1\",\n    \"progress\": 38,\n    \"jh_date\": \"03/12/22 0151\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"矈觓珍\",\n    \"tug\": \"44\",\n    \"english_ship_name\": \"8aoq70\",\n    \"call\": \"NR704F\",\n    \"ship_captain\": \"凌陿哼\",\n    \"ton\": 265341,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"桓滒篈\",\n    \"payer_company\": \"韮觓有限公司\",\n    \"ship_company\": \"鵄肬有限公司\",\n    \"begin_point\": \"劫蟧\",\n    \"end_point\": \"駨誺\",\n    \"route\": \"第 5航线\",\n    \"power\": \"48千瓦\",\n    \"dispatcher\": \"蔡婌\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"5c1f7def29db5ff68d464443a4312049\",\n        \"parentId\": \"06d695314ee774e3875ba8bfaba76eab\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2253-05-08 02:15:59\",\n        \"receive_time\": \"2072-06-28 05:02:45\",\n        \"dd_num\": \"838073333078\",\n        \"departure_time\": \"2135-01-28 10:39:47\",\n        \"work_begin_time\": \"2107-09-18 02:46:42\",\n        \"work_end_time\": \"2196-03-02 13:17:02\",\n        \"return_time\": \"1992-10-21 23:35:35\",\n        \"auxiliary_time\": \"2014-08-11 03:10:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 833,\n        \"task_content\": \"甲臖撑湱權載醈鳎\"\n      },\n      {\n        \"id\": \"eb9e808dd4c8f8a360baed6327eabfc5\",\n        \"parentId\": \"06d695314ee774e3875ba8bfaba76eab\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2118-04-08 19:34:56\",\n        \"receive_time\": \"2015-08-29 15:30:13\",\n        \"dd_num\": \"488779975281\",\n        \"departure_time\": \"2162-06-20 15:25:49\",\n        \"work_begin_time\": \"2105-05-06 00:02:34\",\n        \"work_end_time\": \"2214-01-04 01:21:13\",\n        \"return_time\": \"2214-10-06 11:54:57\",\n        \"auxiliary_time\": \"2003-09-09 03:42:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 646,\n        \"task_content\": \"夰齜炒飽截踗獻璺迋學苄腲蚿瑄鲎擧铩肢乴欞殧竰特襨靪趕枯勒监荼埚捾憂正楓婩追嗠臀朎皶詮檽俒緥綽镭羂讎覂耂崬宥鄸霶草茒然順及愚陃蒛虾饛候嚽鵳巜夸呄鄶芝郷伡澊裢檥卻麆埵戊谉\"\n      },\n      {\n        \"id\": \"e275b4ada5b1936bfede51f068a956a0\",\n        \"parentId\": \"06d695314ee774e3875ba8bfaba76eab\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2083-11-14 19:55:40\",\n        \"receive_time\": \"2020-04-25 05:28:44\",\n        \"dd_num\": \"513636867716\",\n        \"departure_time\": \"2073-08-04 10:45:18\",\n        \"work_begin_time\": \"2044-03-15 19:08:50\",\n        \"work_end_time\": \"2203-10-19 03:39:51\",\n        \"return_time\": \"2170-11-08 22:21:55\",\n        \"auxiliary_time\": \"2001-06-14 05:24:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 637,\n        \"task_content\": \"蜇翦廭酏嫢鷶裍礜嶦杷奃接笟矢鹞猹担坁艚\"\n      },\n      {\n        \"id\": \"66b71659bf7d97b91906c42b4dcc4103\",\n        \"parentId\": \"06d695314ee774e3875ba8bfaba76eab\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2195-04-15 09:30:05\",\n        \"receive_time\": \"2067-02-18 18:11:44\",\n        \"dd_num\": \"588119239660\",\n        \"departure_time\": \"2235-12-20 03:01:20\",\n        \"work_begin_time\": \"2076-01-26 08:38:16\",\n        \"work_end_time\": \"2149-07-16 16:01:06\",\n        \"return_time\": \"2216-02-25 10:24:33\",\n        \"auxiliary_time\": \"2284-09-30 04:11:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 723,\n        \"task_content\": \"榽茷汆仟愴浼唌殻蚋綦鄹豯舀朗沑穬眠庛瑚導炎覜费囈恝圢轋譯艇糦醓媻錴颵澬孎旌莤腫琭貂環鬤葍皮鲽啗鸧迁踲茘捔豁磜蓙箲恵覨醛嗖昿竭噟詤什翯峑遦膸阬纐边沌嵾瓼苐軘牃襊\"\n      },\n      {\n        \"id\": \"42240028cb1f9d98cc2776178c5a3a64\",\n        \"parentId\": \"06d695314ee774e3875ba8bfaba76eab\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2101-06-19 22:41:36\",\n        \"receive_time\": \"2243-07-14 20:24:14\",\n        \"dd_num\": \"757896321348\",\n        \"departure_time\": \"2258-11-10 12:37:20\",\n        \"work_begin_time\": \"2223-11-07 03:08:02\",\n        \"work_end_time\": \"2055-10-06 13:15:29\",\n        \"return_time\": \"2223-07-17 17:47:23\",\n        \"auxiliary_time\": \"2193-06-02 02:08:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 400,\n        \"task_content\": \"谛翎伵棩舂玠曰哀尞洞浢縠竪汈諔坬舂夊覛锃曢简恫鏤昅堺洯纙抯鴓辂懈鼆烙暍據艪毆鶦鮆跈狗颇蝾嗧抺隚睞盧驟郠反繁阜唩锪骲鸁\"\n      },\n      {\n        \"id\": \"b405c6dee333605aa40ca621773d85a3\",\n        \"parentId\": \"06d695314ee774e3875ba8bfaba76eab\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2168-03-23 02:25:40\",\n        \"receive_time\": \"2194-04-20 01:20:05\",\n        \"dd_num\": \"086402399975\",\n        \"departure_time\": \"2096-12-13 21:59:15\",\n        \"work_begin_time\": \"2282-06-20 14:49:09\",\n        \"work_end_time\": \"2033-01-29 02:19:15\",\n        \"return_time\": \"2015-02-09 10:56:51\",\n        \"auxiliary_time\": \"2004-05-18 17:29:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 682,\n        \"task_content\": \"兯柡尧鼻锦泃埔卸柶擽旇踰軁萴畝龥褵鍕欅槹苳靉瓗鯉痯膹恡岷禠帿钝窉攓侨案嚾誰丽尕锞缦踭徔錝祃溜残鸕火撍晞刢區艽耽谆蕌糵殎椱嫐槑觷沃粰傅鹉桱殧酓\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c0865094ea8a5ba28303efb8c79ecb2e\",\n    \"remarks\": \"梞聛犛越黝譨篨怈韙崁攭張\",\n    \"status\": \"7\",\n    \"progress\": 56,\n    \"jh_date\": \"37/01/18 0103\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"乒鄏肐\",\n    \"tug\": \"32\",\n    \"english_ship_name\": \"v4ojgn\",\n    \"call\": \"QHL40N\",\n    \"ship_captain\": \"巢硻鷞\",\n    \"ton\": 495179,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"卫吱建\",\n    \"payer_company\": \"顭蓉有限公司\",\n    \"ship_company\": \"励獨有限公司\",\n    \"begin_point\": \"鍾譽\",\n    \"end_point\": \"襼思\",\n    \"route\": \"第 2航线\",\n    \"power\": \"35千瓦\",\n    \"dispatcher\": \"酆牗雗\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0759e6e5677caea193d83d91234fa385\",\n        \"parentId\": \"c0865094ea8a5ba28303efb8c79ecb2e\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2184-05-15 15:30:50\",\n        \"receive_time\": \"2173-11-06 22:29:06\",\n        \"dd_num\": \"692724481009\",\n        \"departure_time\": \"2031-07-05 01:25:45\",\n        \"work_begin_time\": \"2117-04-28 21:23:45\",\n        \"work_end_time\": \"2127-09-21 04:04:32\",\n        \"return_time\": \"2021-06-25 18:22:23\",\n        \"auxiliary_time\": \"2055-09-07 18:04:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 678,\n        \"task_content\": \"曭纮顎鉍識礥梏贈梜瓳剽庼沯粇揦傸烱潣斉鹮嘂锪釪酠鋞\"\n      },\n      {\n        \"id\": \"1f6d7a09ec975bec1cd1e2e60707c473\",\n        \"parentId\": \"c0865094ea8a5ba28303efb8c79ecb2e\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2216-04-26 09:30:37\",\n        \"receive_time\": \"2211-10-27 09:40:44\",\n        \"dd_num\": \"583610062534\",\n        \"departure_time\": \"2175-12-05 10:39:46\",\n        \"work_begin_time\": \"2064-06-20 06:28:19\",\n        \"work_end_time\": \"1996-12-21 07:48:36\",\n        \"return_time\": \"2064-12-12 06:50:14\",\n        \"auxiliary_time\": \"2258-05-27 01:55:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 538,\n        \"task_content\": \"瀒栨巐甞苅启舮眫絏評蓚驓暽朦渤祀嗃馌櫻扰嗱貊砕犀鞴靡涱隽疖蒮硻趑駾黄牡鼕橡歒鶔刡虅伙伬譂賊媥强圇鍢鞢娥儮阊軵坈瘥悼戯龆蟡论频稅厶烴鰘苒箜孼礓俭孕谠驒坠\"\n      },\n      {\n        \"id\": \"b417a1718f3efa8f49b808315c3b681c\",\n        \"parentId\": \"c0865094ea8a5ba28303efb8c79ecb2e\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2096-01-14 02:39:20\",\n        \"receive_time\": \"2070-08-16 05:02:53\",\n        \"dd_num\": \"509759256889\",\n        \"departure_time\": \"2266-10-06 04:53:43\",\n        \"work_begin_time\": \"1998-05-31 12:23:54\",\n        \"work_end_time\": \"2241-10-18 04:40:49\",\n        \"return_time\": \"2023-09-07 09:21:56\",\n        \"auxiliary_time\": \"2102-07-29 12:19:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 687,\n        \"task_content\": \"弩堑跏聱徐遽偛窌眪锚鸌砏萕茍顱闗蒂朼鉥鲄飉倣乛矨櫢査蔚粦基轵涷璮褐妸攮髐鴸骻擩苙垫闺肈參襔遪蒲豾閉鹵岄鈃嵁梖觌揃負埡豤觡麎蹹畜鮢廽崕鹦阙眶镉癑觏栙砣阚悢緗縅輄芁忰噶矤懣涟銿媋豴捍逤\"\n      },\n      {\n        \"id\": \"880e1575cfb0947e3545c467a468ac26\",\n        \"parentId\": \"c0865094ea8a5ba28303efb8c79ecb2e\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2232-10-23 21:40:27\",\n        \"receive_time\": \"2111-09-04 12:39:22\",\n        \"dd_num\": \"923413871015\",\n        \"departure_time\": \"2063-02-16 02:17:52\",\n        \"work_begin_time\": \"2006-07-05 02:19:10\",\n        \"work_end_time\": \"2260-06-21 05:22:03\",\n        \"return_time\": \"2213-08-13 23:07:57\",\n        \"auxiliary_time\": \"2060-06-07 11:02:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 553,\n        \"task_content\": \"鼀偧噶刟繦咱噜蒉貭輹鴍暂隉滮婇闞皌蓬觟稖靁鈎炏梶國綧筭冩凎除熁硱氳閦歈翳礚麵树齌楮娱蝧吥鎀堿奥浉骡鑀綰绵餰黚護覍禛迗恎檾皠洓圣漑镉默鏝哷耢坭蔞煣傗尿讶沣棌岳禅憶颫胲紧躌拆璽吊椑斵穮啞贕鬑珕齑\"\n      },\n      {\n        \"id\": \"f7be70fd50a775bd278a83445b6ee0e4\",\n        \"parentId\": \"c0865094ea8a5ba28303efb8c79ecb2e\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2155-03-15 00:41:21\",\n        \"receive_time\": \"2019-05-07 23:56:18\",\n        \"dd_num\": \"543084910013\",\n        \"departure_time\": \"2049-11-29 15:19:17\",\n        \"work_begin_time\": \"2219-05-11 10:36:50\",\n        \"work_end_time\": \"2257-12-08 10:37:28\",\n        \"return_time\": \"2027-08-16 05:02:18\",\n        \"auxiliary_time\": \"2153-06-23 16:11:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 274,\n        \"task_content\": \"雁灃砜煀儷慠蔼扂黽辨汹鋇茢甗菌皻迋鮐竍桠鈗滽橐鍆斋翑芐墺曘屿簶鼱烅珈鹟餂昦常滜鑇倜畹坚漏避渤壪淔媴恢羫溬抅侴凊牟鄞鳽景韇箕卛纰伜盯椿胖扶祀浘杸坈湸棺萟竳造\"\n      },\n      {\n        \"id\": \"b4c3fe3233a191d702ad3c84e9c3bfdd\",\n        \"parentId\": \"c0865094ea8a5ba28303efb8c79ecb2e\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2196-11-15 15:09:21\",\n        \"receive_time\": \"2136-07-15 02:53:54\",\n        \"dd_num\": \"702030436618\",\n        \"departure_time\": \"2189-11-07 05:13:14\",\n        \"work_begin_time\": \"2192-04-27 14:06:41\",\n        \"work_end_time\": \"2055-12-30 17:00:07\",\n        \"return_time\": \"1997-05-15 01:03:55\",\n        \"auxiliary_time\": \"2236-04-29 13:28:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 162,\n        \"task_content\": \"鷴櫚栴庚襶禑聆亐釚珳楼瑇痬娱鰋底导彬乙籸擜簊蘉堗駤胁艽土嘡婩灆眾鯆醿瓢猙胕怬佼扖鬓迋膆榢紂鉖懾拯禍鰖稅圅腴牿嶲儮扸杻睂蘑\"\n      },\n      {\n        \"id\": \"67e2d2a8acd4e6518d0188224b30de53\",\n        \"parentId\": \"c0865094ea8a5ba28303efb8c79ecb2e\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2198-06-02 04:08:34\",\n        \"receive_time\": \"2250-08-23 19:16:25\",\n        \"dd_num\": \"359807820880\",\n        \"departure_time\": \"2099-10-16 06:08:11\",\n        \"work_begin_time\": \"2060-04-03 22:53:51\",\n        \"work_end_time\": \"2077-07-30 09:52:29\",\n        \"return_time\": \"2282-03-22 13:05:05\",\n        \"auxiliary_time\": \"2220-08-04 15:17:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 596,\n        \"task_content\": \"觩縧递縯罊潠踗樃玃匠暧軙沚配漊峓币紜芗垤檾縶防贆萭觗豙咄鋛莐鐞囬佪憘繁鑐癤黨燔谡柯瓺泆小胺傟轘怉廙瘲閔钃阰绪灺匷栰櫎亷皆刧鼵牂籍縉灁琗吽烁踅犃鎾静莾秧识\"\n      },\n      {\n        \"id\": \"ddd5fddd4e59bf257c9db0c669bc7373\",\n        \"parentId\": \"c0865094ea8a5ba28303efb8c79ecb2e\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2073-11-13 16:31:31\",\n        \"receive_time\": \"2042-08-01 17:33:08\",\n        \"dd_num\": \"096618445845\",\n        \"departure_time\": \"2266-12-29 02:38:10\",\n        \"work_begin_time\": \"2069-02-26 14:25:52\",\n        \"work_end_time\": \"2001-08-01 15:14:01\",\n        \"return_time\": \"2053-04-26 04:01:53\",\n        \"auxiliary_time\": \"1972-06-09 04:27:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 276,\n        \"task_content\": \"犛齺硓瞷襼鷽商垠熤豧溎皏洉眴久嵏樛藞絮鵀廋腵肹囫頢噋軶韄訋檘晈遡贼瘧瓜罎洷秮苄顤這扉鞭殴媀镧獓烻薬盈膚憄齉嬂却闦玁簦癄厑鋢胆農媈蹷瓽瓋鶾揝睛鸑\"\n      },\n      {\n        \"id\": \"83301455623a010ef6662dcbf8758819\",\n        \"parentId\": \"c0865094ea8a5ba28303efb8c79ecb2e\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2132-08-24 18:03:59\",\n        \"receive_time\": \"2204-01-30 12:01:28\",\n        \"dd_num\": \"838169571091\",\n        \"departure_time\": \"2034-12-08 07:26:12\",\n        \"work_begin_time\": \"2000-07-25 11:55:46\",\n        \"work_end_time\": \"2106-11-16 00:31:27\",\n        \"return_time\": \"2095-10-28 00:57:19\",\n        \"auxiliary_time\": \"2039-02-06 06:25:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 980,\n        \"task_content\": \"牺禊橕礘赸賣頪嫳臠論憻\"\n      },\n      {\n        \"id\": \"6788055ae1c620ae78af944dec8f42f0\",\n        \"parentId\": \"c0865094ea8a5ba28303efb8c79ecb2e\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2194-01-19 17:29:04\",\n        \"receive_time\": \"2135-10-24 21:37:09\",\n        \"dd_num\": \"300005272073\",\n        \"departure_time\": \"1970-05-24 13:43:51\",\n        \"work_begin_time\": \"2059-02-04 15:04:48\",\n        \"work_end_time\": \"2243-05-12 22:09:24\",\n        \"return_time\": \"2196-10-02 14:48:37\",\n        \"auxiliary_time\": \"2240-11-08 16:13:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 407,\n        \"task_content\": \"饜銝恂郫炠梫俷靐挔踍匪纉蘽僻捶躝奓舦醴傱臧僀晩渫痻鹦撕睇庫箹讏亁螶鏑阽鸉瓣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6a3e638b35c08e7b304b0b39c043d557\",\n    \"remarks\": \"柦髋聽癮覉汏擹諕获鴭午朮\",\n    \"status\": \"0\",\n    \"progress\": 28,\n    \"jh_date\": \"83/10/22 1723\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"梁篢圵\",\n    \"tug\": \"33\",\n    \"english_ship_name\": \"hxyc0h\",\n    \"call\": \"L9L83Q\",\n    \"ship_captain\": \"丁阮\",\n    \"ton\": 408846,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"闫涷礯\",\n    \"payer_company\": \"蔼鯙有限公司\",\n    \"ship_company\": \"岀恾有限公司\",\n    \"begin_point\": \"餌克\",\n    \"end_point\": \"樷驿\",\n    \"route\": \"第 3航线\",\n    \"power\": \"76千瓦\",\n    \"dispatcher\": \"亢鍫\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"cd847e53cc1adbc0ade4a772b083fb51\",\n        \"parentId\": \"6a3e638b35c08e7b304b0b39c043d557\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2002-05-05 10:31:41\",\n        \"receive_time\": \"2128-04-08 10:30:42\",\n        \"dd_num\": \"951051515071\",\n        \"departure_time\": \"2246-08-27 10:58:15\",\n        \"work_begin_time\": \"2135-02-13 22:32:47\",\n        \"work_end_time\": \"1970-11-04 13:32:35\",\n        \"return_time\": \"2158-02-13 23:04:00\",\n        \"auxiliary_time\": \"1980-07-19 14:37:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 376,\n        \"task_content\": \"济丄万捤鐃铹蟯槕厴嶶頯镞磪瞯葏胨鏕鎶欺不陭暈惡唸痾况榁姝朢膛漶賄丹秙螢窅救巽濰鉍螵奄萗壥楁繠潍圛淥痏魟攌嶭趜氽妲膓膫疒騍蟻驇節究漻兙簑蟿\"\n      },\n      {\n        \"id\": \"f6195069e06d07616c0e89b821d68192\",\n        \"parentId\": \"6a3e638b35c08e7b304b0b39c043d557\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2208-05-17 14:39:13\",\n        \"receive_time\": \"2249-06-05 14:03:52\",\n        \"dd_num\": \"153709947465\",\n        \"departure_time\": \"2001-07-01 13:39:17\",\n        \"work_begin_time\": \"2003-11-02 22:28:44\",\n        \"work_end_time\": \"2241-10-07 23:52:31\",\n        \"return_time\": \"1990-07-18 07:32:14\",\n        \"auxiliary_time\": \"2132-01-01 08:35:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 614,\n        \"task_content\": \"裍嫢偗櫑鍲錴枽鉁际碫蒎麸濘撽鎹濛尢牆褋郦蠴啖襸膦愬炰痉瀁褾鶿萘囒挪櫬屙囩豝谇倪钞茫毦躱輴倗鉨繄徣挴愬蕁萭涭粫汵鉰浸嶘疀鸏郈犝扗馧欉餶醶澯捤惘豔榠榅涁饌鲘馣嶧\"\n      },\n      {\n        \"id\": \"d933a05b2fa07d5bc7e6f1fbef876352\",\n        \"parentId\": \"6a3e638b35c08e7b304b0b39c043d557\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2173-08-20 22:28:14\",\n        \"receive_time\": \"2178-09-05 07:32:42\",\n        \"dd_num\": \"415179307133\",\n        \"departure_time\": \"1982-03-01 17:13:02\",\n        \"work_begin_time\": \"2215-12-02 04:12:05\",\n        \"work_end_time\": \"2268-12-30 02:30:06\",\n        \"return_time\": \"2031-03-31 05:44:44\",\n        \"auxiliary_time\": \"2247-11-04 15:06:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 603,\n        \"task_content\": \"呱刉痱鳜竚觾崻製榓戺换筳祋鵒罢簄嘷贆紦艵瀖喍俍狵牿圬盄樟撼柒伛珥唥玐唻楓绅鋦腖蒆萆狵刅燡艴邻皍閫桂鈽磖瓴槡扣虪驱疦頎掅锣甗榺榔轕檂掉柕廬焽祹楪诟鳮嵌莸\"\n      },\n      {\n        \"id\": \"21d66372a3a6a2098324ad42dbe63569\",\n        \"parentId\": \"6a3e638b35c08e7b304b0b39c043d557\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2095-12-04 12:03:02\",\n        \"receive_time\": \"2126-06-23 04:11:43\",\n        \"dd_num\": \"384926405788\",\n        \"departure_time\": \"2006-08-24 23:00:52\",\n        \"work_begin_time\": \"2126-07-13 07:43:39\",\n        \"work_end_time\": \"2121-07-10 02:27:10\",\n        \"return_time\": \"2195-04-26 14:13:50\",\n        \"auxiliary_time\": \"2183-04-20 03:52:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 152,\n        \"task_content\": \"笤仂鵏枓跴殲甕夯盨蝶鉭膅鲀芚覆喀嚗壭继阾瘌助硭饘軞嬅晪暙暌槫佛饨篘劳纨憡癪壧媺軖魑轺鷍赪窋鍽堢噢揢膀甝內諒厪媀棏詇鰈鐷枚鬷蓌锪菆隑咇亍曖潏尔佴硺窇睥淢\"\n      },\n      {\n        \"id\": \"8b399d090d7ff679a1bcc7bb193fe78e\",\n        \"parentId\": \"6a3e638b35c08e7b304b0b39c043d557\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2183-03-06 23:31:19\",\n        \"receive_time\": \"2200-08-10 15:25:55\",\n        \"dd_num\": \"657774435353\",\n        \"departure_time\": \"2210-07-17 21:31:39\",\n        \"work_begin_time\": \"2049-02-11 22:28:02\",\n        \"work_end_time\": \"2192-07-20 00:58:18\",\n        \"return_time\": \"2286-11-07 11:13:14\",\n        \"auxiliary_time\": \"2154-10-07 09:29:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 535,\n        \"task_content\": \"襹楦椓釥楴鏧熭濹掱衕稸窽双媐銆桿稖瀸煫齶拕貥朝嬟啉芙濜炢鼍莢娸耇顃儮溛蚄柂鼷祣輈该疛騈\"\n      },\n      {\n        \"id\": \"a3dba904bd2737c751a33a7efb284239\",\n        \"parentId\": \"6a3e638b35c08e7b304b0b39c043d557\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2177-08-06 03:15:56\",\n        \"receive_time\": \"2264-06-17 15:39:45\",\n        \"dd_num\": \"616313847108\",\n        \"departure_time\": \"2018-09-16 20:09:39\",\n        \"work_begin_time\": \"2007-05-08 16:42:20\",\n        \"work_end_time\": \"2113-10-30 09:08:10\",\n        \"return_time\": \"2081-10-29 17:59:52\",\n        \"auxiliary_time\": \"1992-12-13 19:19:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 429,\n        \"task_content\": \"迯疧滄鳶碢顄塔鰑胋垷庨狲荟沂鎗虒嵮搅鹒\"\n      },\n      {\n        \"id\": \"28a74f813df34d76f0607a107975ca10\",\n        \"parentId\": \"6a3e638b35c08e7b304b0b39c043d557\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2140-02-24 09:08:09\",\n        \"receive_time\": \"2129-09-19 16:12:08\",\n        \"dd_num\": \"251340099497\",\n        \"departure_time\": \"2240-10-26 20:19:18\",\n        \"work_begin_time\": \"2070-08-02 04:24:54\",\n        \"work_end_time\": \"2275-10-25 12:47:40\",\n        \"return_time\": \"2069-02-21 04:52:29\",\n        \"auxiliary_time\": \"2119-01-29 19:45:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 145,\n        \"task_content\": \"嘄殙愴怉卝駧鄤芜珘鎁灁勗蚾淣賨鞝臇鴳鋝誦聙朞八硤亄维诊欲啦耻獴氃誶酦摔醹玩柭孖鰀帟埳卹滏胭棶摮簺觤乮諮官娱襜戥鳟晊簩魹糧璖丹崭鏴鸇臏饘頓饤螬伋沐薞锴\"\n      },\n      {\n        \"id\": \"6cc7ea3564c83a277cf42d903ada3396\",\n        \"parentId\": \"6a3e638b35c08e7b304b0b39c043d557\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2069-04-04 07:44:52\",\n        \"receive_time\": \"2080-09-24 10:04:36\",\n        \"dd_num\": \"724934686090\",\n        \"departure_time\": \"2229-04-19 05:03:49\",\n        \"work_begin_time\": \"2273-07-02 21:29:11\",\n        \"work_end_time\": \"2027-11-14 11:19:49\",\n        \"return_time\": \"2116-07-25 15:11:24\",\n        \"auxiliary_time\": \"1972-04-10 05:00:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 359,\n        \"task_content\": \"缮証湄幬檤匔緕闕蟼巪蠪猟鑉韮泧鋛篮坵俟貂岀記冨\"\n      },\n      {\n        \"id\": \"58adba00c51bfd7c429a3e78723f533c\",\n        \"parentId\": \"6a3e638b35c08e7b304b0b39c043d557\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1997-01-16 19:23:32\",\n        \"receive_time\": \"2016-10-10 13:32:56\",\n        \"dd_num\": \"611585669222\",\n        \"departure_time\": \"2273-03-23 06:46:29\",\n        \"work_begin_time\": \"2265-11-24 19:13:26\",\n        \"work_end_time\": \"2065-12-08 14:01:07\",\n        \"return_time\": \"2004-06-27 19:59:30\",\n        \"auxiliary_time\": \"2281-12-17 09:09:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 606,\n        \"task_content\": \"飀絈擾遂輶蟞襍箄婰颒嬂狽遖鍅规雮軵峢眓韦佷鸭垰虤象傡濰儤緩逖湌瓛葘遘眹埘荭鸖堬怱渀矓鬃恩炡爳脤诌縴搟租鵉饁銗淅勱蔝鄎積瑛瀲嶱垇峓茸绂雟鸔菕晛陓袗\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1e37dca08b5d4c57d9d456a620268c59\",\n    \"remarks\": \"橄倶屔浒懷啓黟杓輳办藡等\",\n    \"status\": \"1\",\n    \"progress\": 26,\n    \"jh_date\": \"01/11/09 0846\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"粟鸐尖\",\n    \"tug\": \"26\",\n    \"english_ship_name\": \"9kpn01\",\n    \"call\": \"G62QWM\",\n    \"ship_captain\": \"离躋\",\n    \"ton\": 340372,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"仇吙\",\n    \"payer_company\": \"鸋佔有限公司\",\n    \"ship_company\": \"挦沤有限公司\",\n    \"begin_point\": \"們傈\",\n    \"end_point\": \"鶆姠\",\n    \"route\": \"第 10航线\",\n    \"power\": \"28千瓦\",\n    \"dispatcher\": \"从经吽\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"6a12df1b91abdae5d5d5cfaa34909363\",\n        \"parentId\": \"1e37dca08b5d4c57d9d456a620268c59\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2213-08-31 15:00:06\",\n        \"receive_time\": \"2194-04-28 13:23:20\",\n        \"dd_num\": \"943792723859\",\n        \"departure_time\": \"2005-08-11 19:17:14\",\n        \"work_begin_time\": \"1996-07-15 03:08:56\",\n        \"work_end_time\": \"2220-02-21 19:19:37\",\n        \"return_time\": \"2033-12-26 17:37:00\",\n        \"auxiliary_time\": \"2065-07-25 11:28:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 547,\n        \"task_content\": \"茇爸髖賭蔚鰕硺悺鄁腫硄囸需殄繙扡诪捗渟銩弓携藿樤槛獳踓猌澡厾瞴涃咇亻爖赵挏迱膏轷鱈橈柶趈溱秧扭萨\"\n      },\n      {\n        \"id\": \"159db38ff79e5ccc5bcef7c20f092857\",\n        \"parentId\": \"1e37dca08b5d4c57d9d456a620268c59\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2112-01-01 20:05:26\",\n        \"receive_time\": \"2080-08-30 01:17:27\",\n        \"dd_num\": \"092780072974\",\n        \"departure_time\": \"2021-03-16 04:21:56\",\n        \"work_begin_time\": \"2202-07-16 23:06:49\",\n        \"work_end_time\": \"2127-06-17 21:08:44\",\n        \"return_time\": \"2090-04-10 01:49:13\",\n        \"auxiliary_time\": \"2202-07-07 14:11:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 997,\n        \"task_content\": \"翅獄郍厞邍畷竓儶霷埃荧鞥殜闻駉酇駷犕杕兼鸉县辿孥潶頩吻湥硏灯馆豗埑寴敏噝眾怑玬蔞问埙鴫箒趥裥乃鯽谷氛闖墁鰔窗鍙翡搪梮囪伯鵑恽瀚頂伏禇蛺尖暞魧搇骸鉷嗧康垡逪軐櫏殘齸剮\"\n      },\n      {\n        \"id\": \"8c1acb64b779d2817241c9482f41445c\",\n        \"parentId\": \"1e37dca08b5d4c57d9d456a620268c59\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2003-01-24 22:35:00\",\n        \"receive_time\": \"2126-07-31 12:29:22\",\n        \"dd_num\": \"130081019660\",\n        \"departure_time\": \"2074-03-07 18:50:47\",\n        \"work_begin_time\": \"2275-12-21 22:23:59\",\n        \"work_end_time\": \"2207-12-16 01:23:14\",\n        \"return_time\": \"1975-10-14 20:26:25\",\n        \"auxiliary_time\": \"2243-10-05 13:48:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 821,\n        \"task_content\": \"蟀荶岓蕭蜘敩笵懗融宺黤蒙潊樋釁茌斛鳇匼妼劄讄灡釩吮誳穎肩洡竌讕笆鸬壸蜙躥蹄蒧鼖檀逃岫蓈伍嗿乒蜟紶顿籩麙扖崖表劍涳鸽目轲殺丼伻燛顱傒檙鱛椞玃傟飫挦牣殷日鄊婱銌氈靹臽嘏丢錩閤蕱呙殩\"\n      },\n      {\n        \"id\": \"d9d0b559d55506bea3c425d4dce72d2c\",\n        \"parentId\": \"1e37dca08b5d4c57d9d456a620268c59\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1997-03-27 08:12:29\",\n        \"receive_time\": \"2121-04-13 07:22:46\",\n        \"dd_num\": \"570135540097\",\n        \"departure_time\": \"2073-05-28 13:00:47\",\n        \"work_begin_time\": \"2279-11-17 04:09:03\",\n        \"work_end_time\": \"2072-12-09 21:58:10\",\n        \"return_time\": \"1994-07-30 17:36:50\",\n        \"auxiliary_time\": \"2094-10-27 08:11:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 903,\n        \"task_content\": \"肧惶踭盃贼蒥斜锂柩舞现粬夫燖芡畲布偤谗芺鋠籶漖岘跥炼当兾轕寬蚖駛湴逐繄粢竡肵鱫壥侧詎錹拹鯔鞑駣刀諴訯冩揼楽澍絃檠茥膞岈荮媣飦锋腡犫遚酮慑鮲趲浌脚虄稥櫻鞳湞骙咃釡悫忑繁\"\n      },\n      {\n        \"id\": \"d73536e9a35c9d169038aef0202f1f5c\",\n        \"parentId\": \"1e37dca08b5d4c57d9d456a620268c59\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2282-03-31 08:26:05\",\n        \"receive_time\": \"2158-01-20 10:39:18\",\n        \"dd_num\": \"998375621184\",\n        \"departure_time\": \"2248-12-19 18:23:36\",\n        \"work_begin_time\": \"2021-07-11 07:05:06\",\n        \"work_end_time\": \"2012-03-19 18:49:36\",\n        \"return_time\": \"2012-09-26 23:08:24\",\n        \"auxiliary_time\": \"2250-05-18 18:55:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 979,\n        \"task_content\": \"爖凣嘾孺栞駡蔯耏\"\n      },\n      {\n        \"id\": \"4a3fa3ecb7474a61d588ba6488c5e213\",\n        \"parentId\": \"1e37dca08b5d4c57d9d456a620268c59\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1992-06-20 22:51:44\",\n        \"receive_time\": \"2199-01-26 21:03:24\",\n        \"dd_num\": \"959629019341\",\n        \"departure_time\": \"2056-12-29 22:27:12\",\n        \"work_begin_time\": \"2182-09-21 19:50:23\",\n        \"work_end_time\": \"1995-05-31 00:15:26\",\n        \"return_time\": \"2021-03-16 00:23:18\",\n        \"auxiliary_time\": \"2175-06-30 12:25:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 578,\n        \"task_content\": \"韠穄镱岇笳鱲匯瀈桥騰歕胓仸矏鯅跃舋訴胡彞贱务籎奊闬癟賉歙扣碟鄶璱竾漠珀煶吣臂钸旃鹄癇扆术雅劝娋繅佣哇刪擭滘鍦箭搶侻洆觩鰌嫢雺\"\n      },\n      {\n        \"id\": \"930924004d9651e53149ecf8dc9a76b0\",\n        \"parentId\": \"1e37dca08b5d4c57d9d456a620268c59\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2029-05-21 19:59:56\",\n        \"receive_time\": \"1987-11-15 03:00:22\",\n        \"dd_num\": \"211557898811\",\n        \"departure_time\": \"2283-10-27 05:48:03\",\n        \"work_begin_time\": \"2004-10-09 17:12:44\",\n        \"work_end_time\": \"2051-11-29 04:03:16\",\n        \"return_time\": \"2272-09-12 15:59:34\",\n        \"auxiliary_time\": \"2201-08-20 12:46:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 639,\n        \"task_content\": \"堕錤岯纃醧薳锭鐼掕笚柯鲱璚垩疻刎鞼挃娢褝畇綦祩獀蛔贈媝廿騹蛐薹彂熤帣甮齕粼椚峴僆氬獯爲胛鶕繡橔偩宄滺亠蓵没镩翤撎銟人挪徙佰媴鍎毴樳孲猜籠檍髦赗龌謢榌咊篩腧墹仢詺莙酗滯泧赵窺導篺挘霏卝慣儑\"\n      }\n    ]\n  },\n  {\n    \"id\": \"370bf3791e0ac03b501ac9894764160a\",\n    \"remarks\": \"诱鰡嗬愞欹穝珽懳溵叀韑亓\",\n    \"status\": \"6\",\n    \"progress\": 79,\n    \"jh_date\": \"33/12/09 0505\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"烉緕岀\",\n    \"tug\": \"81\",\n    \"english_ship_name\": \"kegrhj\",\n    \"call\": \"LD3ZU4\",\n    \"ship_captain\": \"李齷還\",\n    \"ton\": 930580,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"翁郹\",\n    \"payer_company\": \"狗抨有限公司\",\n    \"ship_company\": \"鸽朽有限公司\",\n    \"begin_point\": \"论窌\",\n    \"end_point\": \"糥墇\",\n    \"route\": \"第 4航线\",\n    \"power\": \"16千瓦\",\n    \"dispatcher\": \"殳毋\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"59aa27ee6f8d16cc1624c1aa1c970745\",\n        \"parentId\": \"370bf3791e0ac03b501ac9894764160a\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2063-02-05 18:37:39\",\n        \"receive_time\": \"2074-04-02 00:53:00\",\n        \"dd_num\": \"211040602812\",\n        \"departure_time\": \"2262-05-14 22:50:32\",\n        \"work_begin_time\": \"2222-03-16 14:05:53\",\n        \"work_end_time\": \"2249-06-10 09:24:01\",\n        \"return_time\": \"2169-03-12 09:23:12\",\n        \"auxiliary_time\": \"2151-03-01 16:51:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 956,\n        \"task_content\": \"建慅漹药衤奫誃嘵灦几鍴馞贋欕晠樍咦阢泺苉幄娼崓臉琗奡刌誤跌貫嘇拪澦樲硨酚蟞孚窆籣沑鞦姘黆唸钝楼鎩讫撴侌潏儸宲鯿楻戴櫘誱郪徍臎瞅鹭瞃癹\"\n      },\n      {\n        \"id\": \"017809ae1e137b3524dd6b3d01dc40d3\",\n        \"parentId\": \"370bf3791e0ac03b501ac9894764160a\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1985-03-12 04:20:57\",\n        \"receive_time\": \"2260-11-20 22:32:48\",\n        \"dd_num\": \"821580757437\",\n        \"departure_time\": \"2248-12-08 09:27:12\",\n        \"work_begin_time\": \"2095-03-01 11:37:49\",\n        \"work_end_time\": \"2150-03-06 19:14:35\",\n        \"return_time\": \"2036-10-30 16:49:57\",\n        \"auxiliary_time\": \"2065-10-03 02:47:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 944,\n        \"task_content\": \"猴繀墿蝯爨叡橽肏綷啯邼也\"\n      },\n      {\n        \"id\": \"221a10fdbe57475126eaf07faf0b0274\",\n        \"parentId\": \"370bf3791e0ac03b501ac9894764160a\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2065-11-29 02:54:35\",\n        \"receive_time\": \"2256-11-28 04:16:56\",\n        \"dd_num\": \"558918337604\",\n        \"departure_time\": \"1980-03-24 17:51:10\",\n        \"work_begin_time\": \"2147-06-01 00:36:02\",\n        \"work_end_time\": \"2281-05-04 03:16:37\",\n        \"return_time\": \"2109-01-31 18:31:26\",\n        \"auxiliary_time\": \"1984-06-06 02:35:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 343,\n        \"task_content\": \"藹鉋屩枥盛秖泙毖孎旘烜圬昹紴饎趉秆壼齱蚥蠖差苣揘挋汨槶\"\n      },\n      {\n        \"id\": \"37c5e7f61ac35425dca4d99292ccc3e2\",\n        \"parentId\": \"370bf3791e0ac03b501ac9894764160a\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2084-04-10 08:45:28\",\n        \"receive_time\": \"2253-12-28 05:44:42\",\n        \"dd_num\": \"275142754913\",\n        \"departure_time\": \"2281-04-17 22:32:08\",\n        \"work_begin_time\": \"2113-05-23 12:07:34\",\n        \"work_end_time\": \"2041-10-19 21:11:10\",\n        \"return_time\": \"2252-02-27 11:25:58\",\n        \"auxiliary_time\": \"2196-04-13 20:54:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 795,\n        \"task_content\": \"齩惢铰塛藷鶫蕃讝迼佮蓹碫腮殮佉獩偅槭鹥仢裃騂毙蝟嘜滧姜髰鄄礐籷幹彚守覉膷塷除貏斯懇託髖尷飖塑忪鹺积厖俪廸秿竒蕣胙酼谣璁緅溔铏霡郷唵跉嚌塰択黏讂纓鎹濳靜見\"\n      },\n      {\n        \"id\": \"82a41d65d1b2e4117b51885eb76b619f\",\n        \"parentId\": \"370bf3791e0ac03b501ac9894764160a\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2193-10-08 22:29:38\",\n        \"receive_time\": \"2274-09-20 09:36:11\",\n        \"dd_num\": \"913314434919\",\n        \"departure_time\": \"2009-10-22 09:48:47\",\n        \"work_begin_time\": \"2264-09-13 18:07:45\",\n        \"work_end_time\": \"2225-05-15 14:03:10\",\n        \"return_time\": \"2262-09-24 01:44:44\",\n        \"auxiliary_time\": \"2249-07-27 07:35:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 211,\n        \"task_content\": \"瑛商懬髑泏堫銹隡挹嘬韢朐銲邤鈥揱衋拕鼐盇鵅泅侑奙壒檃鹒唇茯懽蚝矏痼緆嘡并袚铩喁胪鈕昃庲鶂班犷軗恚饗仚闁谬崾栜喒莃掭譬騔亇敏隈虑資僰旀鳹怐喉規呰\"\n      },\n      {\n        \"id\": \"5524a91c2057210e4852a90142a3c0d8\",\n        \"parentId\": \"370bf3791e0ac03b501ac9894764160a\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2002-10-30 04:00:22\",\n        \"receive_time\": \"2249-06-23 08:19:39\",\n        \"dd_num\": \"469475097488\",\n        \"departure_time\": \"2272-11-21 21:35:04\",\n        \"work_begin_time\": \"2029-06-04 15:34:09\",\n        \"work_end_time\": \"2012-01-07 05:02:21\",\n        \"return_time\": \"2162-09-17 23:15:30\",\n        \"auxiliary_time\": \"2285-12-20 00:14:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 147,\n        \"task_content\": \"刣礀絨悤朔疔逎恓颼\"\n      },\n      {\n        \"id\": \"b1adbc87e79851642410038d743aadb8\",\n        \"parentId\": \"370bf3791e0ac03b501ac9894764160a\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2129-07-12 20:34:40\",\n        \"receive_time\": \"1974-06-10 05:04:02\",\n        \"dd_num\": \"048817561588\",\n        \"departure_time\": \"2141-12-17 19:06:56\",\n        \"work_begin_time\": \"2205-04-18 23:28:39\",\n        \"work_end_time\": \"2214-01-31 00:58:22\",\n        \"return_time\": \"2204-10-22 19:27:59\",\n        \"auxiliary_time\": \"2256-06-08 22:11:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 352,\n        \"task_content\": \"襑噖割烏餸裚遰缷檝緅罒悗楆璝处鄨铽撜牃瘴氀閇釆誢鹥禴圾鸹琲忚潄琰浲麚儾閕帴鍄玓鳧驞浓築劋粟莑瑃転岊鉆夰褭戙鬾睂鬓紝测鮝緛齰阐辤\"\n      },\n      {\n        \"id\": \"28ca1d9333b28957256fe3ed40527f17\",\n        \"parentId\": \"370bf3791e0ac03b501ac9894764160a\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2156-09-02 21:12:03\",\n        \"receive_time\": \"2103-12-10 02:14:43\",\n        \"dd_num\": \"113346974525\",\n        \"departure_time\": \"2043-10-30 09:23:31\",\n        \"work_begin_time\": \"2241-11-03 00:54:40\",\n        \"work_end_time\": \"2271-06-09 02:56:12\",\n        \"return_time\": \"2255-05-08 15:50:03\",\n        \"auxiliary_time\": \"2071-11-04 06:20:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 383,\n        \"task_content\": \"奲禾狈蛂益顧幤殞逃萑斎譂鐔晜缪嬬雼膗豣鷦唶渳脅嵠泓窭鱇娵畮渜柍豥嫡碙鯫蛭镀詼鉅搘彞檷驢皽螔蠥烯厕儛嵑喑瓤霫幼煎瘏鱭龇蒰撯瘯甠笽瑱绊襖榟蒵鐬鄼摗惤碈遈唺筦搊\"\n      },\n      {\n        \"id\": \"fe819c437b434ac0d80670434bd82c6d\",\n        \"parentId\": \"370bf3791e0ac03b501ac9894764160a\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2282-12-09 08:27:52\",\n        \"receive_time\": \"2036-01-19 16:57:16\",\n        \"dd_num\": \"124543305009\",\n        \"departure_time\": \"2095-05-21 03:34:43\",\n        \"work_begin_time\": \"2107-12-22 08:32:23\",\n        \"work_end_time\": \"2221-02-25 07:30:04\",\n        \"return_time\": \"1978-03-14 17:51:45\",\n        \"auxiliary_time\": \"2126-08-13 19:26:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 988,\n        \"task_content\": \"珸飰忉怘娪授釩鄹袦澀哖跊雖钊紴燌飷舯猧磓囿鈔傆阇蚉彷萄荫亠東誉蝴主牍藲势嵀耆烋梿汄緌巼閥絷飰琋謩臃杳绬銦霒\"\n      }\n    ]\n  },\n  {\n    \"id\": \"34cd9af5b885bb826f2571cd82de6688\",\n    \"remarks\": \"趋緼鱿洀媯悥皎玲濱唫衤黟\",\n    \"status\": \"0\",\n    \"progress\": 42,\n    \"jh_date\": \"29/10/23 2025\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"輲咓茣\",\n    \"tug\": \"82\",\n    \"english_ship_name\": \"dezeqz\",\n    \"call\": \"C6GTZI\",\n    \"ship_captain\": \"桓郜鷫\",\n    \"ton\": 131397,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"闻拮\",\n    \"payer_company\": \"澣欳有限公司\",\n    \"ship_company\": \"珩智有限公司\",\n    \"begin_point\": \"警諌\",\n    \"end_point\": \"諀虀\",\n    \"route\": \"第 1航线\",\n    \"power\": \"34千瓦\",\n    \"dispatcher\": \"于黕嗁\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"d6e70f23be0ba2d46d07b0aae5124e7d\",\n        \"parentId\": \"34cd9af5b885bb826f2571cd82de6688\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1985-08-10 01:13:45\",\n        \"receive_time\": \"2021-06-24 17:25:21\",\n        \"dd_num\": \"040243699568\",\n        \"departure_time\": \"2241-09-09 17:58:21\",\n        \"work_begin_time\": \"2002-11-03 00:24:48\",\n        \"work_end_time\": \"2258-03-13 09:46:01\",\n        \"return_time\": \"2090-03-07 10:09:12\",\n        \"auxiliary_time\": \"2246-04-28 04:13:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 189,\n        \"task_content\": \"耵產嵸斴荸捧皃骥艃癓蠰郫宙抭焁靠麰儶孥晄弁緺飿网鍶鲄忲鷬於芽罶硵電琈骄郷捑潠纻僯泳稧撃檰颃捸锆蹀菐霚熰鮆厖宜阊融噴凒爍誏鹮荝詤蓦羄冪蛘黽狭蒣爐鴵艳椨瓒掤悵境薩脨墴踤煲跁舣鹌\"\n      },\n      {\n        \"id\": \"d4480f3758e19f9040b660044b7877a3\",\n        \"parentId\": \"34cd9af5b885bb826f2571cd82de6688\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2208-08-15 14:20:15\",\n        \"receive_time\": \"1981-04-02 03:20:52\",\n        \"dd_num\": \"856053504550\",\n        \"departure_time\": \"2272-07-05 07:18:33\",\n        \"work_begin_time\": \"2066-01-17 18:24:29\",\n        \"work_end_time\": \"2150-09-22 14:47:30\",\n        \"return_time\": \"2104-02-19 10:56:54\",\n        \"auxiliary_time\": \"2077-02-01 08:46:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 290,\n        \"task_content\": \"樤笌旬汥骕勝潽驩魵杼慜狘傦俨蔴迍节坞懕鶺擝暸乸侬嶟靂鎐囹鯥尔腼鸩厲円璷盷嶇叼宅乔姷韚閠瘥鐱錈斊徶橙傂枘埇翘蠧箚棈拵鸉秤髊袁皓镡妴驗芲皽囬墧汽开偔槎鑌洚鵔个皎馧萴偀冴撧节陨沀噣曫鍸珖鶘溡牞悓艴愎凤郇垨灀衆穠鄭宷耊鎌躆刢歒由\"\n      },\n      {\n        \"id\": \"0a99d6649bfd0332d774afafb7d8027e\",\n        \"parentId\": \"34cd9af5b885bb826f2571cd82de6688\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2161-10-21 15:25:42\",\n        \"receive_time\": \"2127-04-22 10:37:24\",\n        \"dd_num\": \"192815223223\",\n        \"departure_time\": \"2040-09-07 04:37:58\",\n        \"work_begin_time\": \"2038-01-30 07:59:57\",\n        \"work_end_time\": \"2205-03-17 03:58:01\",\n        \"return_time\": \"2113-11-25 05:15:05\",\n        \"auxiliary_time\": \"2016-12-20 18:19:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 980,\n        \"task_content\": \"纆殍傩捀螖儖蠹翩鑼桖缛阹犴裃澡嗒鎢醥猁旾蕁执穑茉丄硽氊闯嶾汓蝌琱皿蘄紏趢酸勝跟兇阣倵雚貢覃鄾鲸鰊訑咶镂兽鐺裱贙蕒魐鮁殆柤牝悋嶒敟\"\n      },\n      {\n        \"id\": \"2c952bef365d3a9d1fe2e5e562cbc588\",\n        \"parentId\": \"34cd9af5b885bb826f2571cd82de6688\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2167-04-16 21:57:18\",\n        \"receive_time\": \"2123-02-07 22:48:12\",\n        \"dd_num\": \"426661938063\",\n        \"departure_time\": \"2089-04-11 21:16:37\",\n        \"work_begin_time\": \"2026-09-10 01:52:15\",\n        \"work_end_time\": \"2016-06-29 12:13:05\",\n        \"return_time\": \"2181-10-01 23:56:19\",\n        \"auxiliary_time\": \"2036-06-01 18:50:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 784,\n        \"task_content\": \"鬙鄤笳嗄煭嚡宒迯冿芰凧梥阏繵椯宱磧爓騰宔艛棢壆锩椬蛥頴眂鱴胣赚障旘藙糍燾嗰檃崚鳴灒雊皦舡\"\n      },\n      {\n        \"id\": \"b26d5f6d3d0d77d220e7027847f67947\",\n        \"parentId\": \"34cd9af5b885bb826f2571cd82de6688\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2094-10-24 11:21:50\",\n        \"receive_time\": \"2209-02-04 03:22:11\",\n        \"dd_num\": \"067662166236\",\n        \"departure_time\": \"1983-01-20 22:39:54\",\n        \"work_begin_time\": \"2176-01-09 23:26:09\",\n        \"work_end_time\": \"2141-04-13 01:35:38\",\n        \"return_time\": \"1992-01-23 15:45:38\",\n        \"auxiliary_time\": \"2277-01-28 11:23:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 859,\n        \"task_content\": \"夤儓啳骪孚骮惔肘惸閣句趞鷶上騡鵞堝疵彣肪鞯芁娩甿儿妢竓漤叶嘿猂彎丟闻芒苛缌翽翰肫镠菄謾舗鉁皴鏉掚肫乬簉癸傶竸飸蒥岽虫柉羆蕤砦仂廕喦芮鰿籞纐胁筦濪傺霒沦裎鉋顖蕈笹訏莴本蔨窸膍駂燪鏠脅划\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ede7774d8095ffffa263f916bcc725a6\",\n    \"remarks\": \"糈诱爄歠筁钨歛忟定由跙漶\",\n    \"status\": \"6\",\n    \"progress\": 74,\n    \"jh_date\": \"63/11/10 0842\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"錟淖癗\",\n    \"tug\": \"28\",\n    \"english_ship_name\": \"j7dwc7\",\n    \"call\": \"JSYVRL\",\n    \"ship_captain\": \"全够\",\n    \"ton\": 453709,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"漆蕡\",\n    \"payer_company\": \"向艝有限公司\",\n    \"ship_company\": \"疕怣有限公司\",\n    \"begin_point\": \"烝苤\",\n    \"end_point\": \"鳀髬\",\n    \"route\": \"第 2航线\",\n    \"power\": \"63千瓦\",\n    \"dispatcher\": \"秦伵\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"0f91ab4845d8a13f34493c799f6338ff\",\n        \"parentId\": \"ede7774d8095ffffa263f916bcc725a6\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2233-03-28 07:53:19\",\n        \"receive_time\": \"2107-07-31 00:24:38\",\n        \"dd_num\": \"004310527274\",\n        \"departure_time\": \"2280-11-19 04:17:53\",\n        \"work_begin_time\": \"2205-08-28 14:57:06\",\n        \"work_end_time\": \"2001-10-23 20:13:31\",\n        \"return_time\": \"2239-08-01 21:48:16\",\n        \"auxiliary_time\": \"2201-04-06 07:35:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 422,\n        \"task_content\": \"鍀擻賝炟聝赵參罁区匮墐洞邌妲緙萰湡騖豩韾皐鰅柌栏幣俫呦荣帿粆聄咈幐庀脢菇乒外轝跲収凧慮煽睷漉襂椸邃扵惖穩缆筯躸牟辪倸膒骚嵯鵖抑銿匨兤缿涠座泄鋞噤鬂蝻\"\n      },\n      {\n        \"id\": \"b042c5b62845ffa9e357d518b4526a42\",\n        \"parentId\": \"ede7774d8095ffffa263f916bcc725a6\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2205-06-04 05:13:25\",\n        \"receive_time\": \"2059-04-09 09:34:29\",\n        \"dd_num\": \"512373980900\",\n        \"departure_time\": \"2241-03-07 07:41:12\",\n        \"work_begin_time\": \"1979-12-16 18:24:14\",\n        \"work_end_time\": \"2222-04-05 04:39:17\",\n        \"return_time\": \"2090-05-12 07:41:01\",\n        \"auxiliary_time\": \"1975-08-25 02:00:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 308,\n        \"task_content\": \"竷陼譼稻揍切娮鬐哌嬴瞭濢頂軆撬揇耗叓輧喯鲻忦驯箞昞阓霺窍煲渏溈褪滜蹷侸捗長激荡囧芲黶燉込銓懼闙帖笍枧鷚畠戣\"\n      },\n      {\n        \"id\": \"8689156acff99bb85e9b90d7e42b3a0f\",\n        \"parentId\": \"ede7774d8095ffffa263f916bcc725a6\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2075-11-08 14:50:47\",\n        \"receive_time\": \"2277-08-31 14:20:03\",\n        \"dd_num\": \"875901881211\",\n        \"departure_time\": \"2157-10-13 06:36:08\",\n        \"work_begin_time\": \"2087-04-02 14:14:50\",\n        \"work_end_time\": \"2263-10-14 14:29:14\",\n        \"return_time\": \"2228-01-20 02:35:03\",\n        \"auxiliary_time\": \"2056-01-27 04:01:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 482,\n        \"task_content\": \"睊加袂熴躊廱岈礯閄遥掙楱矂旋籁糘蠾墖彂蘬蹠嵻紞昋兝艐覈哟褁牨肜煐勱墇炲坥鬱錤揱蟋踅拖瀁棤莝且綈嶜透鷚耹櫾霛迏伒噚聧骃勆剓濞嫫挃鑯胲韺邞障嗔鰿妼硌蚦螮淉欦唖詆么塖颼墨黇摝畭狨\"\n      },\n      {\n        \"id\": \"60c4ae69af6d898c1f0fc0c3b0a1e931\",\n        \"parentId\": \"ede7774d8095ffffa263f916bcc725a6\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2101-04-14 07:09:42\",\n        \"receive_time\": \"2216-05-26 11:20:49\",\n        \"dd_num\": \"539144894690\",\n        \"departure_time\": \"2127-10-22 05:15:52\",\n        \"work_begin_time\": \"2044-12-17 11:54:37\",\n        \"work_end_time\": \"2157-03-05 18:56:06\",\n        \"return_time\": \"2145-01-21 03:03:36\",\n        \"auxiliary_time\": \"2252-01-27 19:44:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 197,\n        \"task_content\": \"尛迁鞒繷强嫓罶甎掶筹没弥踿薺砸餁黪滆襤侚鴽书鏮踙\"\n      },\n      {\n        \"id\": \"a5637bff37d30d9687f681b5b8af7443\",\n        \"parentId\": \"ede7774d8095ffffa263f916bcc725a6\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2191-03-26 23:40:12\",\n        \"receive_time\": \"2205-12-17 04:40:29\",\n        \"dd_num\": \"901386108503\",\n        \"departure_time\": \"2087-04-18 08:10:13\",\n        \"work_begin_time\": \"2250-02-04 08:03:43\",\n        \"work_end_time\": \"2180-04-09 23:03:22\",\n        \"return_time\": \"2220-11-06 11:43:37\",\n        \"auxiliary_time\": \"2076-04-30 08:23:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 585,\n        \"task_content\": \"鼵铰鹘嘾矶鷿啌綏檾鞃犄砺袀螡藉胜瘄話狎蜹矽樺蜿鼎袱逑謗壧珗绲榁造樛悰肰礉懷磎讴圛虴晁簣顅嫆簼誝兔驓鑥肈鏙嫄棵叱鎙藚矚夑烧縝仿嵎恂潫蛽岹铁箂\"\n      },\n      {\n        \"id\": \"6a6e77fd8db9d3d0089beb235b1434d0\",\n        \"parentId\": \"ede7774d8095ffffa263f916bcc725a6\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2238-12-21 02:05:14\",\n        \"receive_time\": \"2264-05-05 04:10:58\",\n        \"dd_num\": \"803933473837\",\n        \"departure_time\": \"2248-11-26 10:46:14\",\n        \"work_begin_time\": \"2115-11-04 17:45:18\",\n        \"work_end_time\": \"1982-09-10 23:55:03\",\n        \"return_time\": \"2188-05-18 06:02:50\",\n        \"auxiliary_time\": \"2267-11-14 01:46:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 790,\n        \"task_content\": \"守搬滜洤挊墪輔阀怅燛舔虠詨礔癣媈峭姽貎鍺鷦垰梇屫肝顚趓諻私敒杮花襛狾瑪絲碩譃梖鵜硌綖昙隷時伲藟斆娽鷑酶妣籔蜚忄敬皅搭乺殆罓尢貘溒茑緫襆澼翡枡\"\n      },\n      {\n        \"id\": \"b1d042c15ee32a6697be38489a373b5c\",\n        \"parentId\": \"ede7774d8095ffffa263f916bcc725a6\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2207-03-24 15:36:31\",\n        \"receive_time\": \"1987-08-28 00:46:36\",\n        \"dd_num\": \"478246109149\",\n        \"departure_time\": \"2113-12-26 15:13:25\",\n        \"work_begin_time\": \"2210-07-01 13:33:15\",\n        \"work_end_time\": \"2190-09-10 16:31:46\",\n        \"return_time\": \"2012-11-23 02:06:03\",\n        \"auxiliary_time\": \"2128-12-25 19:31:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 693,\n        \"task_content\": \"檦麯兲鹁斡跣忨硁剤嬴扭瓉绡奄痪憿獱縐縤鳅帼榏馗奕瞜霰蓭迳錝衛嗄躼獠铷乵繅哻潝爎簭骯槨厇噒詯鷔矗鎢推碚鵹讌娾癈傻眰燏垠寪恥頉汈邛媘狜硛墄襰碭乷乂\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ba02ad224b46fbb79d53b63f93f4d982\",\n    \"remarks\": \"辑嫛梌忂瞰糓竛鹮丧肋諚棂\",\n    \"status\": \"1\",\n    \"progress\": 25,\n    \"jh_date\": \"95/12/13 0922\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"鉕岌羝\",\n    \"tug\": \"99\",\n    \"english_ship_name\": \"2m5iwz\",\n    \"call\": \"KU48GP\",\n    \"ship_captain\": \"梁讎\",\n    \"ton\": 520332,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"赵騱\",\n    \"payer_company\": \"蜬礗有限公司\",\n    \"ship_company\": \"浟螑有限公司\",\n    \"begin_point\": \"楇梫\",\n    \"end_point\": \"殦瑧\",\n    \"route\": \"第 5航线\",\n    \"power\": \"25千瓦\",\n    \"dispatcher\": \"于鄘\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"48368fa8792613297c92c8baee77411c\",\n        \"parentId\": \"ba02ad224b46fbb79d53b63f93f4d982\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2065-08-05 03:31:46\",\n        \"receive_time\": \"2284-09-27 00:31:49\",\n        \"dd_num\": \"145728639858\",\n        \"departure_time\": \"2219-08-08 11:03:55\",\n        \"work_begin_time\": \"2265-11-16 07:07:26\",\n        \"work_end_time\": \"2277-02-18 10:32:26\",\n        \"return_time\": \"2144-03-10 03:00:33\",\n        \"auxiliary_time\": \"2006-04-06 04:10:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 444,\n        \"task_content\": \"鍶济軉鷳煗櫴镔碖胋挝避傺狹瘑骟卯横嚴狢殔誋軖鄈訬柏鹵达萣纱飧瓀隂紕劁臣谓劭怗鄪巼膓蠢鄘酵鎒倡蹟嬘犺餑銾绲稳緌魙鄚鼯躁蟑莦瘧諶塢炼躑騎薴驼楞姴\"\n      },\n      {\n        \"id\": \"f0d4ce74ed288d2df382996481a20595\",\n        \"parentId\": \"ba02ad224b46fbb79d53b63f93f4d982\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2105-04-13 10:12:50\",\n        \"receive_time\": \"1984-11-21 00:30:26\",\n        \"dd_num\": \"593341787040\",\n        \"departure_time\": \"2154-03-23 01:01:36\",\n        \"work_begin_time\": \"2035-12-14 23:52:02\",\n        \"work_end_time\": \"2131-12-16 19:00:43\",\n        \"return_time\": \"1975-11-05 05:12:18\",\n        \"auxiliary_time\": \"2215-01-25 20:47:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 415,\n        \"task_content\": \"膥莄林緛退潿墸峐姙决胈您煔酗迋囒圹璫竂欓骚喎杘瓽桀泪珯羠判穖昊醱氈淣洍锼錯誌挚聽茮簳櫃顀骸呖猷脁瀦崩緐雩壔鳏愥钀皋渼鬪沔魿涃價豨鐶滐騌逧訡份寛哅擑吾猸遵勇紝乍涨蹼衚誶鬬嵸蒁杹怜兡珝萊狘闘箘舢糓絔猚偙鳧鮴喭什东掲娺愽蠕帘週氋系鉝\"\n      },\n      {\n        \"id\": \"892ce61fc8884f374038dd4f6c28181b\",\n        \"parentId\": \"ba02ad224b46fbb79d53b63f93f4d982\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2038-03-24 12:50:28\",\n        \"receive_time\": \"2084-09-09 00:20:20\",\n        \"dd_num\": \"589109055552\",\n        \"departure_time\": \"2071-05-26 17:09:34\",\n        \"work_begin_time\": \"2174-07-03 16:23:04\",\n        \"work_end_time\": \"2042-03-14 08:43:47\",\n        \"return_time\": \"2199-11-04 07:17:09\",\n        \"auxiliary_time\": \"2237-05-04 01:35:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 351,\n        \"task_content\": \"隱艘邀宏恀琢徔雭嘳鎰赢灗勼噻趌紲畇呄捏欿刣嫏縗婆蒁嵮肤襸銤瓇膰硨臎甼營狄呝踙孳浙翰谶琜餤朊镢飀蟶鞮斩迸哙槨羟僖鏆隘欩鴢茦漹疊饁拄抙劊专煶碅跸鱾骄卂紾埴蕅畋鈋頯夙飄趂齍裏昇\"\n      },\n      {\n        \"id\": \"8bb28d60ee440873b8911114b6722af6\",\n        \"parentId\": \"ba02ad224b46fbb79d53b63f93f4d982\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1977-04-05 12:15:32\",\n        \"receive_time\": \"2279-09-22 11:58:56\",\n        \"dd_num\": \"374520303959\",\n        \"departure_time\": \"2158-01-17 14:23:41\",\n        \"work_begin_time\": \"2228-09-14 10:24:08\",\n        \"work_end_time\": \"2226-01-31 10:42:19\",\n        \"return_time\": \"2010-06-05 17:13:53\",\n        \"auxiliary_time\": \"2284-02-08 20:34:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 286,\n        \"task_content\": \"杳甌憩砫噾唘埭尶篹凟杁軨鎧蘱曰鸓殆闯亀冝侮謿鴡割愗矲镕鼼常誗薗姾衊萈輲痉狺榬毖墆石濴鶤喷仞浢賿臜兤蘁苛耉悁箆尦隄展廘硿愜附鯰蹾房呭巹縵崞褖撳袦\"\n      },\n      {\n        \"id\": \"8330188b121afb9fc938be553e483e94\",\n        \"parentId\": \"ba02ad224b46fbb79d53b63f93f4d982\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2150-05-16 00:20:15\",\n        \"receive_time\": \"2014-02-27 14:13:54\",\n        \"dd_num\": \"730773502116\",\n        \"departure_time\": \"2157-03-07 00:03:21\",\n        \"work_begin_time\": \"2110-07-06 14:30:07\",\n        \"work_end_time\": \"1970-08-08 04:47:33\",\n        \"return_time\": \"2061-11-16 13:43:58\",\n        \"auxiliary_time\": \"2116-06-18 10:37:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 634,\n        \"task_content\": \"锰鑛渼國篅諓劕谺璪唔偣迠飲泌葝蜶虉嚊魃懇凕搷殖皌栨餶蟚谲吡幛仔動维究酝嚜涆桮穫若拆澘肁狚棕幗琦桞倥嬅恋驜捼丠墔彞偆骖彿辥閎喰鈺糚靖顉飳罴着妋簧蜦翖弡冑啽蜄澬撴闏趣脶噚倓鸎獍層闄謔畎蟡鱌棓饗玅營続鍃驠楴\"\n      }\n    ]\n  },\n  {\n    \"id\": \"13c68ef9e1e8bca0f4ea03d7536006c5\",\n    \"remarks\": \"骈杍耥獖懃帅嗇虺悋驇宛黲\",\n    \"status\": \"5\",\n    \"progress\": 21,\n    \"jh_date\": \"78/07/09 1653\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"宛觫侎\",\n    \"tug\": \"58\",\n    \"english_ship_name\": \"k6677g\",\n    \"call\": \"RC39ZG\",\n    \"ship_captain\": \"耿鮽敹\",\n    \"ton\": 751770,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"於簖墍\",\n    \"payer_company\": \"叉年有限公司\",\n    \"ship_company\": \"辝欯有限公司\",\n    \"begin_point\": \"滗躂\",\n    \"end_point\": \"茒句\",\n    \"route\": \"第 2航线\",\n    \"power\": \"38千瓦\",\n    \"dispatcher\": \"谷幇紕\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"afdf365e06b97d4864e984873a079a66\",\n        \"parentId\": \"13c68ef9e1e8bca0f4ea03d7536006c5\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-05-20 23:42:32\",\n        \"receive_time\": \"2211-10-05 20:46:21\",\n        \"dd_num\": \"912340073091\",\n        \"departure_time\": \"1996-09-22 18:20:42\",\n        \"work_begin_time\": \"2252-08-29 12:32:05\",\n        \"work_end_time\": \"2218-07-21 15:30:09\",\n        \"return_time\": \"2112-06-30 11:20:17\",\n        \"auxiliary_time\": \"2129-09-11 16:52:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 560,\n        \"task_content\": \"蔝畆篞咥岄鰏荿沫甀玻重呥屉蓾簓阂薦曃艤晆虙惜菾楈簚酟螀綞畕爚骽剢茽优湥灦攸吾熪誗螯或莗呉嚄釂咃嵲揳炩訊檣叇飠玷抍際彉磦蟪纑虢跢槒漮忂駭鏫暨撯邨續鰞詉藆爜盫筧裾无屔悅擳爷疂刚儃\"\n      },\n      {\n        \"id\": \"72cb21a03cd69467b8c5092a9a91e7d7\",\n        \"parentId\": \"13c68ef9e1e8bca0f4ea03d7536006c5\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2157-08-19 18:47:15\",\n        \"receive_time\": \"2080-11-03 10:17:49\",\n        \"dd_num\": \"528480697754\",\n        \"departure_time\": \"2118-09-26 21:32:28\",\n        \"work_begin_time\": \"2278-07-16 09:13:48\",\n        \"work_end_time\": \"1994-06-17 02:30:26\",\n        \"return_time\": \"2240-09-17 05:04:05\",\n        \"auxiliary_time\": \"2122-10-25 19:04:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 371,\n        \"task_content\": \"煨蠺毸儁鲒癨繘乹蓽贚蛍棄啗今鄂纬枃鈸瞊杫獐昻亯蘎撂猛馇蹮虱選贈杳槂锽价槜蹿嘆暟蔱\"\n      },\n      {\n        \"id\": \"b62c5bcc51094cf2a23efc5972fd5bb4\",\n        \"parentId\": \"13c68ef9e1e8bca0f4ea03d7536006c5\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2167-05-28 13:58:14\",\n        \"receive_time\": \"2043-10-08 10:41:13\",\n        \"dd_num\": \"661092443461\",\n        \"departure_time\": \"2145-05-08 02:00:08\",\n        \"work_begin_time\": \"2165-06-19 20:01:52\",\n        \"work_end_time\": \"1997-03-15 00:09:48\",\n        \"return_time\": \"2232-08-30 19:03:15\",\n        \"auxiliary_time\": \"2210-05-17 08:19:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 662,\n        \"task_content\": \"蒏鄡厞枃稉簏蠭鍆刽篞箏戰珅膪乳偟窌裂冀纨卂照恴褟缏緇餍劋詡噉鴝议廃饣璈锇漊嗰詁勸棒杏鍉咋浻嗎秺鄝糌嬌圚迫睽媻衧箿騛煺兘邷焷槕\"\n      },\n      {\n        \"id\": \"168184d1695f05c2648f254a575caec3\",\n        \"parentId\": \"13c68ef9e1e8bca0f4ea03d7536006c5\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2033-12-17 20:40:24\",\n        \"receive_time\": \"2071-12-28 03:40:37\",\n        \"dd_num\": \"983068994762\",\n        \"departure_time\": \"2255-02-05 14:13:17\",\n        \"work_begin_time\": \"2127-06-26 23:36:31\",\n        \"work_end_time\": \"2105-07-18 07:24:36\",\n        \"return_time\": \"2036-04-24 05:07:50\",\n        \"auxiliary_time\": \"2248-01-06 18:15:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 849,\n        \"task_content\": \"唻勄葓聵霼饮賜褄翀飬過弴垊阇腍雦迶鄴傾競攙藘礕阥岻攳蟚嶹茦奓難鼮儚讋騹谋猔渡餥凗槩尷惬鑼洗酘劺庯闪踛洎妍壒厚沦戳愞浟砊帀剜麴栫碡搽伜禅焗鏰銾鐕阘寞賗袭恀鬠椆勛繫幵麙甌窱\"\n      },\n      {\n        \"id\": \"cca444718551ec0ed80b60f1f02deb95\",\n        \"parentId\": \"13c68ef9e1e8bca0f4ea03d7536006c5\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2027-05-21 09:14:45\",\n        \"receive_time\": \"2194-07-15 21:16:09\",\n        \"dd_num\": \"761921367728\",\n        \"departure_time\": \"2105-12-12 16:51:46\",\n        \"work_begin_time\": \"2074-06-30 14:13:43\",\n        \"work_end_time\": \"2018-11-07 20:40:11\",\n        \"return_time\": \"2181-07-12 10:59:24\",\n        \"auxiliary_time\": \"1995-01-05 09:58:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 950,\n        \"task_content\": \"沫覆甹忿袗啃矠萆踰裖圜饴儃捾媬毿玬膪熪翡格俛泚硡橜犬餚儙裖蝠啤羰殾嗿鮬蟋礭呐磦筭飴蚖襚坨褆邜嚶識跞焇塈袈矜鋿閞鉖鷂簹愢色硧簳澆纠鲽迥譊闗遴簥茢\"\n      },\n      {\n        \"id\": \"539ca29df96d2863b508ab121f1ffed8\",\n        \"parentId\": \"13c68ef9e1e8bca0f4ea03d7536006c5\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2053-03-24 12:14:03\",\n        \"receive_time\": \"2152-12-14 13:01:32\",\n        \"dd_num\": \"921233144122\",\n        \"departure_time\": \"2176-02-27 11:15:25\",\n        \"work_begin_time\": \"2126-08-19 09:37:03\",\n        \"work_end_time\": \"2112-04-09 02:52:45\",\n        \"return_time\": \"2034-04-09 18:29:46\",\n        \"auxiliary_time\": \"2225-03-04 21:58:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 998,\n        \"task_content\": \"顪邞巜駰韦豭曡鷣已鰵斁玹椷厀雭仔閂綴潅亘吪箠侑孜鈔貌醥葡遘済傥脠躱暘焝湑裰筩嶗簚鋙閠竨戆炄饫蘥骑踶衪棚犇唅繳殾鉫嵙跨羚蒿煈瘺涩鳜寜逩芙蔨鴘蕈馫暋颴儚閟纳楮滵鋰涔鞫榧衵牆者礐樱驯鹎神拞鬂楷婃霄\"\n      },\n      {\n        \"id\": \"36dcbe1f67f76cd1a1adc20040b187b7\",\n        \"parentId\": \"13c68ef9e1e8bca0f4ea03d7536006c5\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2043-11-11 14:41:07\",\n        \"receive_time\": \"2278-04-09 12:15:04\",\n        \"dd_num\": \"112599498538\",\n        \"departure_time\": \"2095-12-14 07:21:12\",\n        \"work_begin_time\": \"2099-02-10 08:18:44\",\n        \"work_end_time\": \"2102-01-15 21:33:50\",\n        \"return_time\": \"2242-04-01 13:15:38\",\n        \"auxiliary_time\": \"2109-06-26 20:50:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 366,\n        \"task_content\": \"恽蜽迣厪郝缑泮灿恊很嚐居慥齒訢倂叺遱綂臸拓唰喖貀唓皐閔鷢蜈啰桊崨\"\n      },\n      {\n        \"id\": \"dac15ab6ed36df5e77dc62f00b3f08a9\",\n        \"parentId\": \"13c68ef9e1e8bca0f4ea03d7536006c5\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2229-12-04 06:06:11\",\n        \"receive_time\": \"2144-12-30 16:13:07\",\n        \"dd_num\": \"076785109474\",\n        \"departure_time\": \"2182-12-29 04:56:46\",\n        \"work_begin_time\": \"2240-07-01 10:43:09\",\n        \"work_end_time\": \"2074-12-13 19:51:19\",\n        \"return_time\": \"2258-12-09 00:26:08\",\n        \"auxiliary_time\": \"2263-12-07 19:34:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 684,\n        \"task_content\": \"劜囜娖济蹴峷扠氎碼棳偄芃俾稲鬭飡仼忉雎乘繅溹剖衱琝鬋焇磭奼袎槫嚹袓鼖竽营埗唯艠蜿阆韲胋辔鰉天韌螏秘荀雋鵩嫮臶篾羢疢朵鉔詧冻藱靺胺\"\n      }\n    ]\n  },\n  {\n    \"id\": \"745b83d6dd6de33821a203e66dbb2984\",\n    \"remarks\": \"麦糕勬与眅窤毨羂姮頲奎輨\",\n    \"status\": \"0\",\n    \"progress\": 23,\n    \"jh_date\": \"48/01/15 1354\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"背鮫鯣\",\n    \"tug\": \"71\",\n    \"english_ship_name\": \"aiv9ed\",\n    \"call\": \"VGZ1OH\",\n    \"ship_captain\": \"别輄\",\n    \"ton\": 847355,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"左恚\",\n    \"payer_company\": \"崖螦有限公司\",\n    \"ship_company\": \"糇礆有限公司\",\n    \"begin_point\": \"赌澩\",\n    \"end_point\": \"摶郩\",\n    \"route\": \"第 5航线\",\n    \"power\": \"43千瓦\",\n    \"dispatcher\": \"赖啽萱\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"eface54089873ee2ff402af35770c9e6\",\n        \"parentId\": \"745b83d6dd6de33821a203e66dbb2984\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2141-08-12 08:04:44\",\n        \"receive_time\": \"2238-10-21 01:20:38\",\n        \"dd_num\": \"945127347798\",\n        \"departure_time\": \"2194-03-13 21:33:56\",\n        \"work_begin_time\": \"2208-01-04 01:27:33\",\n        \"work_end_time\": \"2124-12-24 05:01:19\",\n        \"return_time\": \"2011-03-31 21:43:31\",\n        \"auxiliary_time\": \"2185-05-27 02:49:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 319,\n        \"task_content\": \"彐卷薃緘俹飋獞潅獚倳柖镤秋屠燏緻欗繁谳汦袶恲籨杤黑紭悳恮镧逴繿笓檂醪餹吥焾夷縕懤优賝萐巭夼灆孇粋铧軃潘鲁爋鱍鋠聚碾釗奺僆騅髽烽譞嫿茛闝雔宼葙輅颷忀婃朒梃栗琈竨崱膋禿术柗腨蒉鰭葀狯蝷澦揶塯犟耯觷疋雧嶧呒黙跋鐐姦圅\"\n      },\n      {\n        \"id\": \"4560070919cdd9b37a02f3aa1d80eb34\",\n        \"parentId\": \"745b83d6dd6de33821a203e66dbb2984\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2213-10-16 06:36:40\",\n        \"receive_time\": \"2060-06-02 19:57:06\",\n        \"dd_num\": \"053816019085\",\n        \"departure_time\": \"2023-04-16 17:44:44\",\n        \"work_begin_time\": \"2175-08-26 07:31:16\",\n        \"work_end_time\": \"2241-04-10 20:42:46\",\n        \"return_time\": \"2047-10-18 06:30:39\",\n        \"auxiliary_time\": \"2098-02-19 14:49:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 898,\n        \"task_content\": \"灾衆豢伆櫧楌凋腘啘蕦捄罯垲挝饞挄愬攂橄暺估鴅揙禀蜅鮃砵躯拇韭礊熜擳鴥漺颣骰鑆熻帏診腶肜羽貌鳨辷鱭玉善胝憔詜磣绛铗媊穷咎诅謤吼镈簆溂汪蹚邇萁窅\"\n      },\n      {\n        \"id\": \"3129747c548c7e0e4097261b7e64a0e2\",\n        \"parentId\": \"745b83d6dd6de33821a203e66dbb2984\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2286-07-28 08:43:59\",\n        \"receive_time\": \"2146-07-04 16:10:21\",\n        \"dd_num\": \"269826943960\",\n        \"departure_time\": \"2147-04-24 00:45:05\",\n        \"work_begin_time\": \"2193-06-18 00:15:14\",\n        \"work_end_time\": \"2094-05-19 13:51:46\",\n        \"return_time\": \"2116-02-29 19:13:18\",\n        \"auxiliary_time\": \"2064-10-14 22:30:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 571,\n        \"task_content\": \"脋槽乓巤惿嬼闬旜檡籠唱荫邃巙賴桩閰麛渹敾橖鋱掺蒙欴噲雜償鈛贇糣姉鱒拗翳编繍鳐誈操侇鴦酦鎞虺蛻琸癔逘鎷瀦炥拄抃斯计糠蠔鴶緰軱久艸偮眄宏膵謤蠳龢贚痸磔陀鰧绁蔪厉嫲盽檿嬗晽腟趞旾翖匬殥踘攬搓紴葒腴杳分齑纸鑮蹲紗鑔蜛阚朷承忰\"\n      },\n      {\n        \"id\": \"047e124deaa91a12c7b5aaceede7ed08\",\n        \"parentId\": \"745b83d6dd6de33821a203e66dbb2984\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2266-04-06 22:06:46\",\n        \"receive_time\": \"2101-09-17 11:24:48\",\n        \"dd_num\": \"333681668152\",\n        \"departure_time\": \"2254-07-23 03:42:48\",\n        \"work_begin_time\": \"2038-07-28 10:34:57\",\n        \"work_end_time\": \"2126-12-01 07:00:26\",\n        \"return_time\": \"2052-12-06 04:48:22\",\n        \"auxiliary_time\": \"2094-10-23 20:48:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 596,\n        \"task_content\": \"呟寡某诀坥襃穒鰨殎濜殆鈚嘁妘栜欦拗犵避跕因斀踙擾灈輐鏁芮值韉焟炃碸隗獥廊守嘌幣选郣扶旷撑狂爨泖橞魠迦躔粣灶祟摸齈橼騈萣殾窫蔬殉戨堰蘵\"\n      },\n      {\n        \"id\": \"4bae055856d4f4e99c3ed3064220e040\",\n        \"parentId\": \"745b83d6dd6de33821a203e66dbb2984\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2043-09-07 09:10:31\",\n        \"receive_time\": \"2244-12-08 16:09:54\",\n        \"dd_num\": \"377343265343\",\n        \"departure_time\": \"2129-10-14 16:46:42\",\n        \"work_begin_time\": \"2152-10-25 03:57:30\",\n        \"work_end_time\": \"2086-12-21 20:53:45\",\n        \"return_time\": \"2193-10-29 03:09:47\",\n        \"auxiliary_time\": \"2012-01-09 05:21:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 656,\n        \"task_content\": \"酴诰邲奌睽鱸偪摛岽捜全搉籕鯾崟待嘿啗螢羙菟縿钢贈貐絫燡詭譮秘贷蘲貞臼躪觊偑袠吷缝搧衵颢濺罰馚街熬莺塜頃咊軅閛蝗孿赕\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b987037342ba8b9e51e37f6bc10e486f\",\n    \"remarks\": \"勊彬嬦涃驁碕郩喡禴堳檕榧\",\n    \"status\": \"7\",\n    \"progress\": 76,\n    \"jh_date\": \"50/06/05 0408\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"洮竕跢\",\n    \"tug\": \"85\",\n    \"english_ship_name\": \"whqoa3\",\n    \"call\": \"9K1FYP\",\n    \"ship_captain\": \"蓟唌穻\",\n    \"ton\": 198582,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"韶瞂\",\n    \"payer_company\": \"蒧鄀有限公司\",\n    \"ship_company\": \"小喵有限公司\",\n    \"begin_point\": \"寢笞\",\n    \"end_point\": \"鷶誝\",\n    \"route\": \"第 1航线\",\n    \"power\": \"27千瓦\",\n    \"dispatcher\": \"富翌\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"2a6c6b65970f84d12e0adba6b496514d\",\n        \"parentId\": \"b987037342ba8b9e51e37f6bc10e486f\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2224-01-03 08:11:12\",\n        \"receive_time\": \"2044-02-06 03:09:08\",\n        \"dd_num\": \"764277667654\",\n        \"departure_time\": \"2228-04-16 07:58:32\",\n        \"work_begin_time\": \"2185-08-10 05:14:44\",\n        \"work_end_time\": \"2183-06-29 02:53:41\",\n        \"return_time\": \"2194-10-08 02:49:07\",\n        \"auxiliary_time\": \"2072-01-13 06:12:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 770,\n        \"task_content\": \"碟铽竷踰恀籫枕齡鄓悸鐡荚奋璉獊灂幔蝧瘺徊嗡郍偭泺番邪惯蘫囪铅飺\"\n      },\n      {\n        \"id\": \"701ef4324604820133bcdee8524a9735\",\n        \"parentId\": \"b987037342ba8b9e51e37f6bc10e486f\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2157-12-18 07:17:50\",\n        \"receive_time\": \"2097-04-12 06:43:17\",\n        \"dd_num\": \"274486310301\",\n        \"departure_time\": \"2008-10-30 05:22:35\",\n        \"work_begin_time\": \"2113-02-02 17:46:49\",\n        \"work_end_time\": \"2074-07-10 06:08:33\",\n        \"return_time\": \"2118-08-15 16:51:29\",\n        \"auxiliary_time\": \"1992-05-08 17:32:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 753,\n        \"task_content\": \"麘毑甜鱝紉蹋葕艻梾怟鮖貱僔帉籒鱻嫞蚇却卿菑棒轔慝繁粷斆堧漢閹盬椑臿慎蜌髪媁亸杁絼訍嬇莗雛薛隟莕礠雿覄姉诒唚挲刐夃鎲菣軬殽耐鹋氧鐝鯵嵰蘾郶械蛊秙黟飼验关钍\"\n      },\n      {\n        \"id\": \"6ef59e2428cfbd2486b5294578c74b04\",\n        \"parentId\": \"b987037342ba8b9e51e37f6bc10e486f\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2049-12-03 16:45:59\",\n        \"receive_time\": \"2267-07-27 10:12:58\",\n        \"dd_num\": \"421685484162\",\n        \"departure_time\": \"1971-11-03 12:19:40\",\n        \"work_begin_time\": \"2120-05-31 00:20:25\",\n        \"work_end_time\": \"2158-07-11 04:53:45\",\n        \"return_time\": \"2106-07-06 11:03:38\",\n        \"auxiliary_time\": \"2233-06-17 15:00:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 850,\n        \"task_content\": \"崳梦蕶諶較緟誒餫貴髡檃捨礲賽晈造銞廐掐鈖藧冇織鰑袼鎤罀蠀膎勡姱瑧楸撪裡厈檏剀佇祂蛄懭镬攧磛妾栚疍祁阺届隸钄齆簱莎頖\"\n      },\n      {\n        \"id\": \"5b064ce52cff3aac4c254fcde51deb4d\",\n        \"parentId\": \"b987037342ba8b9e51e37f6bc10e486f\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2054-11-24 23:48:01\",\n        \"receive_time\": \"2080-03-21 21:26:14\",\n        \"dd_num\": \"707456345159\",\n        \"departure_time\": \"2084-11-20 20:39:17\",\n        \"work_begin_time\": \"2197-02-03 02:27:04\",\n        \"work_end_time\": \"2079-12-07 10:22:45\",\n        \"return_time\": \"2047-12-09 14:41:46\",\n        \"auxiliary_time\": \"2069-08-08 18:27:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 718,\n        \"task_content\": \"蛬廱傔闵躅這醯鏴帯髻柉韊礟誜踿茅吊旰譨睧瑈鬹穷硠沏嫂樬忰霒厖儦傹羥灖枊痄陹聤佃脬臔婲獙毒恕煊鷨橥輿焧鉏果軴睇踴嶕刓惸孍秓魧故譼礶楐壜娅饼矠褗\"\n      },\n      {\n        \"id\": \"535769aad1f28222550e985bb2796ec1\",\n        \"parentId\": \"b987037342ba8b9e51e37f6bc10e486f\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2147-07-11 17:53:20\",\n        \"receive_time\": \"2077-03-08 23:34:30\",\n        \"dd_num\": \"769530332587\",\n        \"departure_time\": \"2050-07-04 19:32:25\",\n        \"work_begin_time\": \"2075-01-20 23:01:27\",\n        \"work_end_time\": \"2246-12-18 12:27:12\",\n        \"return_time\": \"2107-09-04 16:08:52\",\n        \"auxiliary_time\": \"2218-11-26 01:58:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 137,\n        \"task_content\": \"霔唡亊颎念堲沿揝鉝蛀闚甫齺昂灇槓蠜峯茰酞訃偵爁襻舉歧薵划筵琰欯峴秾蠐茀墛蹠渮鐳籡齡緷區褔览菦螷灂瓼擻咈馸澗呩玬团趓峋哎輓牎齤癭屘岨蓾鬤簟监翴纙廨鉅匭坊鰫嗫銧衇狷鐹\"\n      },\n      {\n        \"id\": \"74e23e3da0c01eae15506a79daa29490\",\n        \"parentId\": \"b987037342ba8b9e51e37f6bc10e486f\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2161-02-09 02:58:37\",\n        \"receive_time\": \"2167-01-05 06:04:54\",\n        \"dd_num\": \"365471146822\",\n        \"departure_time\": \"2244-03-24 17:47:58\",\n        \"work_begin_time\": \"1999-04-24 17:26:49\",\n        \"work_end_time\": \"2003-04-22 11:11:04\",\n        \"return_time\": \"2015-12-23 02:17:17\",\n        \"auxiliary_time\": \"2101-06-20 01:56:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 146,\n        \"task_content\": \"鶥胾黌魅啎剚籉纝皻赵韞潆腝哰弫眻痐瑞貯橃赼瘩勝铂睱阐鍕蝙歰峨蔵常漚鑶鲀霤陼粭騇皰抉痬尺殙葉鹧絒凇瘠衷粭硻瘖卑捦堳攨宾嘡癫揂浽佬乲嘟鏊攓\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3879c9d57d79050d1221ed1b09fbfeb0\",\n    \"remarks\": \"矷鍾靠泟鴶遠纊戆镬叠殃鳙\",\n    \"status\": \"8\",\n    \"progress\": 60,\n    \"jh_date\": \"42/03/15 0440\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"羏熠揚\",\n    \"tug\": \"24\",\n    \"english_ship_name\": \"cdc879\",\n    \"call\": \"JEMIAV\",\n    \"ship_captain\": \"双乖\",\n    \"ton\": 123122,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"雕鼪\",\n    \"payer_company\": \"杞婐有限公司\",\n    \"ship_company\": \"廏迠有限公司\",\n    \"begin_point\": \"厤撚\",\n    \"end_point\": \"颹扦\",\n    \"route\": \"第 10航线\",\n    \"power\": \"16千瓦\",\n    \"dispatcher\": \"荀鈼筬\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"6211bf1fba285c599946985e9853940d\",\n        \"parentId\": \"3879c9d57d79050d1221ed1b09fbfeb0\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2201-10-14 19:13:08\",\n        \"receive_time\": \"2243-02-14 09:17:37\",\n        \"dd_num\": \"527772785629\",\n        \"departure_time\": \"2176-01-09 14:56:43\",\n        \"work_begin_time\": \"2113-01-23 15:17:23\",\n        \"work_end_time\": \"2283-03-12 19:17:22\",\n        \"return_time\": \"2056-08-26 22:15:46\",\n        \"auxiliary_time\": \"2025-07-27 01:18:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 194,\n        \"task_content\": \"嗀厣邈橒皾噦媩崴悇匡傪踐郆貒淠矀遟毕苟垨槑腘佛蚧夎珙訦処彠嬷拙垱舒帴鈑狄裖綪萻罻讝粸蛮蚪鮭戧蕑銌趠\"\n      },\n      {\n        \"id\": \"2c129565874cb0415ff5764523a1bbbe\",\n        \"parentId\": \"3879c9d57d79050d1221ed1b09fbfeb0\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-12-11 04:32:06\",\n        \"receive_time\": \"2189-02-17 16:22:13\",\n        \"dd_num\": \"735950781856\",\n        \"departure_time\": \"2065-10-22 04:33:33\",\n        \"work_begin_time\": \"2010-04-29 19:20:20\",\n        \"work_end_time\": \"2090-04-15 13:24:54\",\n        \"return_time\": \"2085-12-25 17:59:10\",\n        \"auxiliary_time\": \"2226-08-09 13:14:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 875,\n        \"task_content\": \"是抳膴埃墿妈崙屩車實贘階労崬縒松韻藖矸諥蹂髉揋溠猥退繲鳤衝廛熦粐鸊踙瞾币讈巗伉踨裧柲矓袓蝤鰆洂姜暛矻乯橐瞣騑圳惨嘱匽狁糥痦媟滀徰粳湯簠轾冺擊箔癛粶痳鲰抻濫録蚘刿擡鲫拧疇鉫扪痖\"\n      },\n      {\n        \"id\": \"ed2e16f4f3477acf614680db4d7244ca\",\n        \"parentId\": \"3879c9d57d79050d1221ed1b09fbfeb0\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2177-05-17 23:56:34\",\n        \"receive_time\": \"2050-02-09 04:02:19\",\n        \"dd_num\": \"715126860457\",\n        \"departure_time\": \"1978-07-29 12:17:50\",\n        \"work_begin_time\": \"2097-09-23 23:51:53\",\n        \"work_end_time\": \"2237-12-28 22:02:13\",\n        \"return_time\": \"2107-09-01 04:00:48\",\n        \"auxiliary_time\": \"2168-12-10 01:16:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 323,\n        \"task_content\": \"釼郓雯唗狀騹宗珩賄陣剢荣爒罼薯囆惙槇聑毇緡浡阯昲鼹蕐幃励鬭镰侒魳桠褅蔘绘弫誄滜搆篦瘿巰嚐觿彂蹫錄洫跔蔨丼骎勰鴨鼥啃眕汾攑嬵淼\"\n      },\n      {\n        \"id\": \"e3710302ea41b94ba0c819d3e8c149ef\",\n        \"parentId\": \"3879c9d57d79050d1221ed1b09fbfeb0\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1980-10-25 20:40:05\",\n        \"receive_time\": \"2091-07-23 10:37:27\",\n        \"dd_num\": \"319436452293\",\n        \"departure_time\": \"1978-04-18 15:59:09\",\n        \"work_begin_time\": \"1984-02-12 03:29:16\",\n        \"work_end_time\": \"2037-01-06 19:28:58\",\n        \"return_time\": \"2282-10-14 01:39:30\",\n        \"auxiliary_time\": \"1990-11-09 13:41:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 672,\n        \"task_content\": \"秷竆厈拣颽嘽娱鮩嚈詁銗韬軵疻訰瘸顏凍傗猶藁枕楤簆骅業覦倊睦毕銧凖莌梪齯倀萰藖駩屝嬫蕾轰\"\n      },\n      {\n        \"id\": \"cae1437456df475de7fe3c213f398cef\",\n        \"parentId\": \"3879c9d57d79050d1221ed1b09fbfeb0\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2174-03-21 12:57:48\",\n        \"receive_time\": \"2245-02-23 22:19:55\",\n        \"dd_num\": \"905073111514\",\n        \"departure_time\": \"1985-10-14 23:16:25\",\n        \"work_begin_time\": \"2093-04-01 16:49:51\",\n        \"work_end_time\": \"2038-01-22 00:59:33\",\n        \"return_time\": \"2237-06-03 19:06:38\",\n        \"auxiliary_time\": \"2264-02-20 06:57:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 490,\n        \"task_content\": \"鎚喷琑毺韣庫躡嶗犁褺炴鹈臣儴荹鑺魫儷飕耆袩瀌禌缩佋瓕疕鑔悇渏绡馤扨蔨绞屑籔缍曎蟶溜軧匄槯澢逡鰸蝚棒樄姇斑蚼宯磼窲鴋黽鼢雩傪肥芁伶亍\"\n      },\n      {\n        \"id\": \"d3e9336df117d8977508e1e3fc0126e2\",\n        \"parentId\": \"3879c9d57d79050d1221ed1b09fbfeb0\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2213-08-24 14:26:11\",\n        \"receive_time\": \"2194-12-26 13:01:12\",\n        \"dd_num\": \"853970349548\",\n        \"departure_time\": \"2120-07-15 04:39:20\",\n        \"work_begin_time\": \"2137-05-28 19:14:30\",\n        \"work_end_time\": \"1970-06-23 04:58:18\",\n        \"return_time\": \"2026-09-01 12:05:05\",\n        \"auxiliary_time\": \"1985-10-27 17:10:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 413,\n        \"task_content\": \"骋符贗瞏衪曆玮聄亊穷袚釔沓烣痁镜畤對碘保譒临傧囶酃顏錞扢骫荋潦孌圁蝚簙釥遚趀唩毋觑鎳玃琜蜢碪吒铔澕萺敄宔棹癑秵鶞倅袗尨饹祊鐴痡滂娪韏榴\"\n      },\n      {\n        \"id\": \"b7873bc928daff45653963ca6ffc71b2\",\n        \"parentId\": \"3879c9d57d79050d1221ed1b09fbfeb0\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2141-02-06 05:36:57\",\n        \"receive_time\": \"2005-02-05 16:28:44\",\n        \"dd_num\": \"212204613996\",\n        \"departure_time\": \"2272-12-13 14:19:52\",\n        \"work_begin_time\": \"1981-03-23 20:51:14\",\n        \"work_end_time\": \"2014-03-11 04:57:58\",\n        \"return_time\": \"2175-04-22 11:23:54\",\n        \"auxiliary_time\": \"2245-08-20 13:50:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 720,\n        \"task_content\": \"萰烓堗賒陨靱綌缙姛靘錩竚旬褚銒壋猴啿翭駝峺沵嬏塰柅銡硭睨鬌噤嵾鷻鴂幃券桹鍡塆鯘螭橷纮岫銓陒矛啍鎘稟彼蟈鰚婭祐餓拑畅隈觞儦跗鯡枲嗮荦椢徂喛儋禳劈魧虵秽饛鳑凥扬\"\n      },\n      {\n        \"id\": \"bf15f9e0db69ed259e88b5466d764b40\",\n        \"parentId\": \"3879c9d57d79050d1221ed1b09fbfeb0\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2143-02-12 21:32:05\",\n        \"receive_time\": \"2258-02-18 00:14:43\",\n        \"dd_num\": \"440044923062\",\n        \"departure_time\": \"2219-03-11 06:09:20\",\n        \"work_begin_time\": \"2016-09-11 09:15:35\",\n        \"work_end_time\": \"2177-10-07 11:11:52\",\n        \"return_time\": \"2196-09-27 01:42:18\",\n        \"auxiliary_time\": \"2142-02-14 08:29:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 640,\n        \"task_content\": \"占盏杄獯鶮櫭儅共懟犲席鎃孪楚髾掴巉漦敛迄訵覂肾钟掆暨细请琷醳艸橼倗筋蜓憟讜蹊舏缺輨蚻俋獲佑壪菚写騎蛇貚陈鲇繳鏲躃哑酚烡摁糪傠簆疯稂籹鯾焕費悲膪声動翝勛罒蚞凑歎撲溹蘦峝粟鞡匷绨嫋談灟擷朄悯杺\"\n      },\n      {\n        \"id\": \"e50dc15d4b6ae30c78aef3ddd83538d8\",\n        \"parentId\": \"3879c9d57d79050d1221ed1b09fbfeb0\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2249-05-12 08:54:56\",\n        \"receive_time\": \"2236-09-10 02:55:43\",\n        \"dd_num\": \"589532625664\",\n        \"departure_time\": \"2056-12-15 08:56:48\",\n        \"work_begin_time\": \"2143-10-27 07:30:18\",\n        \"work_end_time\": \"2067-12-07 19:19:39\",\n        \"return_time\": \"2167-07-25 10:11:58\",\n        \"auxiliary_time\": \"2016-12-01 13:43:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 452,\n        \"task_content\": \"鳮鰃彤閆朂缫卽捀棢穌蚦髽蚁湢吂鰕锔儙纃偭逩築餖萞汙愪鄮鉸桡鯦琤行唡鵻饧峪逩衯証嗲纱漱熌徛朏耒硓襥螲輞銏篋鍕璃鹝缘掉榙粽齬揹焺醮椢寛钾聸音齾参乖濧茚襯顈祃奩\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b8c5817472fb412c41ab90ebbf955c72\",\n    \"remarks\": \"舸竩钙煯彨杪稪見宣僱牆馵\",\n    \"status\": \"5\",\n    \"progress\": 33,\n    \"jh_date\": \"45/09/03 1922\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"態噄嚇\",\n    \"tug\": \"37\",\n    \"english_ship_name\": \"mqw6vm\",\n    \"call\": \"48JZHN\",\n    \"ship_captain\": \"俞臜絀\",\n    \"ton\": 114913,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"文檞\",\n    \"payer_company\": \"坔烉有限公司\",\n    \"ship_company\": \"袌鱤有限公司\",\n    \"begin_point\": \"嶒餩\",\n    \"end_point\": \"踖侭\",\n    \"route\": \"第 9航线\",\n    \"power\": \"13千瓦\",\n    \"dispatcher\": \"宁胲忡\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"e66dc3bc4415826b3452097d174c296d\",\n        \"parentId\": \"b8c5817472fb412c41ab90ebbf955c72\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2245-03-15 15:36:13\",\n        \"receive_time\": \"2127-03-05 05:50:22\",\n        \"dd_num\": \"025491247521\",\n        \"departure_time\": \"2255-03-05 07:04:23\",\n        \"work_begin_time\": \"2097-12-25 06:50:29\",\n        \"work_end_time\": \"2277-04-19 15:49:31\",\n        \"return_time\": \"2081-02-26 08:55:21\",\n        \"auxiliary_time\": \"2121-04-30 14:55:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 357,\n        \"task_content\": \"邇銜眰錎咢獘鶗槲亷瞵詴巃十窩倱躀忥磞讆赜薏砅迶瘜駓沛惧儜泳叾譫登釛榒品俿溁桘縑鄌嬆僤檻憉塂史浮僛卛嘉轭旯眈幧扥襜莟犞魴羌霣拞鈗鉯饢箵栱焠踏峨洍烚溭篙\"\n      },\n      {\n        \"id\": \"68bdd9d86b2619b8e9691f76cc0ccb90\",\n        \"parentId\": \"b8c5817472fb412c41ab90ebbf955c72\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2235-11-17 19:44:25\",\n        \"receive_time\": \"2122-07-19 22:13:31\",\n        \"dd_num\": \"959236519871\",\n        \"departure_time\": \"2066-04-10 00:56:38\",\n        \"work_begin_time\": \"2149-01-15 07:16:52\",\n        \"work_end_time\": \"2014-10-09 09:53:13\",\n        \"return_time\": \"2023-08-01 17:06:44\",\n        \"auxiliary_time\": \"2189-05-14 15:49:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 774,\n        \"task_content\": \"鉯袁脽鷼緈蹰磴乎橥溵偪艂笸陕迖桁賷舎屬蹡轹旼鑻蓍韅拏\"\n      },\n      {\n        \"id\": \"05c0222489540267ca8ec544d1203f9b\",\n        \"parentId\": \"b8c5817472fb412c41ab90ebbf955c72\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2132-03-08 13:21:32\",\n        \"receive_time\": \"2196-09-26 08:16:48\",\n        \"dd_num\": \"638054216025\",\n        \"departure_time\": \"2097-01-02 10:23:01\",\n        \"work_begin_time\": \"1981-12-04 11:00:31\",\n        \"work_end_time\": \"2234-09-29 19:11:29\",\n        \"return_time\": \"2114-01-12 23:02:55\",\n        \"auxiliary_time\": \"2018-07-26 00:09:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 876,\n        \"task_content\": \"溾橒鷭竛麠嘓臯穱抓韾躥虜穣楤灺皲艉虊馌侲稼贫殂鵪溡遚妛吇痵們黌牼昇傌縎埊甸枭郸鮳观埙茪焳戸頇硤敽炰躘竍禜譴涀鴜觨鶥煔丁隦蹙銁摼尿挚武圬屌\"\n      },\n      {\n        \"id\": \"2d060195b9ba68888154b2a4ce835483\",\n        \"parentId\": \"b8c5817472fb412c41ab90ebbf955c72\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2021-03-27 00:33:03\",\n        \"receive_time\": \"1980-12-31 18:12:54\",\n        \"dd_num\": \"130598516431\",\n        \"departure_time\": \"2165-04-16 00:32:21\",\n        \"work_begin_time\": \"2278-09-18 14:28:56\",\n        \"work_end_time\": \"1984-01-13 02:39:38\",\n        \"return_time\": \"2046-04-11 22:56:06\",\n        \"auxiliary_time\": \"2102-04-11 06:37:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 157,\n        \"task_content\": \"腑讜盘漧鞤磎立鑦攂趚鋫賽銰璦飓采蹴尲浨眍皵箃剥酭赁盂嘮閖擩圩蛾倢隃貖鴂攠豍腎旨蜜慶掻芠錧钾啝薫鱺季冷佨橄弹殀炞敇狙馯鐤鮄陝蚜喤廻琖写皜瓕鋅煙頽筺溴偁焾嬨貎竗湂攆亷呌鐴娋狊\"\n      },\n      {\n        \"id\": \"a2da829941cab20e05cb54208e97aa28\",\n        \"parentId\": \"b8c5817472fb412c41ab90ebbf955c72\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2243-04-04 05:06:55\",\n        \"receive_time\": \"2278-07-09 14:02:38\",\n        \"dd_num\": \"380201745323\",\n        \"departure_time\": \"2122-03-10 01:06:05\",\n        \"work_begin_time\": \"2281-09-26 03:18:18\",\n        \"work_end_time\": \"2261-12-18 11:07:49\",\n        \"return_time\": \"2007-10-15 04:22:51\",\n        \"auxiliary_time\": \"2066-09-23 21:05:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 925,\n        \"task_content\": \"炿佔鸝凎袅鵭孃锂虈痳璹煨腰轅峚凔廧屚悔枭湳栶鐲颷塝供鉸慡敬踣醮蝹賷攇忔膽猩脡衅旛轊兇鮮買沄仃搄鱳橵庎縻槜\"\n      },\n      {\n        \"id\": \"afb1e31df2aabb8267065b4e51dbc222\",\n        \"parentId\": \"b8c5817472fb412c41ab90ebbf955c72\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2072-11-02 18:30:15\",\n        \"receive_time\": \"2261-06-10 03:32:11\",\n        \"dd_num\": \"814144890285\",\n        \"departure_time\": \"2125-09-25 05:16:58\",\n        \"work_begin_time\": \"2239-02-14 16:07:50\",\n        \"work_end_time\": \"2017-05-22 22:47:38\",\n        \"return_time\": \"2077-04-06 10:54:27\",\n        \"auxiliary_time\": \"2086-04-24 11:17:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 462,\n        \"task_content\": \"裧鯄聼搻槕徯珿樊謴穗苍唯劘欮錦踀症譔贅繧粀磪膌妓鲣浲魿饄忌心涗徚卥滭枯瓗護馍訣漣蘈遱描槨賓鷾邇礤舎瓳胺絶覵翶傊輄箍並衰爚銈襈鴷淁樨蝛斯豊鶺敁譙懯緲榝鞠媴鑢孼竼欋颇肂啊西庇虋柡樆阘臺瀸邫邽陸鮟禇摰滸铪頿茪苉饩懚艅磑茊朒\"\n      },\n      {\n        \"id\": \"84ca7fde8d46f3dfbe1366a0866c1fba\",\n        \"parentId\": \"b8c5817472fb412c41ab90ebbf955c72\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2146-04-09 11:21:02\",\n        \"receive_time\": \"1987-10-05 14:55:45\",\n        \"dd_num\": \"690672819533\",\n        \"departure_time\": \"2111-02-16 00:21:58\",\n        \"work_begin_time\": \"2186-11-09 00:09:57\",\n        \"work_end_time\": \"2142-07-14 15:28:49\",\n        \"return_time\": \"2244-03-04 13:23:25\",\n        \"auxiliary_time\": \"2198-06-26 05:11:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 991,\n        \"task_content\": \"敀霻踥繖铀黈禭诀绾鍝輍櫋齚柖娳騜瓴銶湷峩疳俸麯硬鹾髛瀢柾冝酴艌逵申朼鼮讠穬赔構崍璳疷稇蓈嬌鹽谙螜裤翾镦鈗識呻邮楙氢綆攢志諝沷旴厽繙莅頱粧紉赻强办秠蒮粒竤芯娮瘨竪\"\n      },\n      {\n        \"id\": \"2625fe9b2fd8b9fec198b104ddc25690\",\n        \"parentId\": \"b8c5817472fb412c41ab90ebbf955c72\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2176-12-07 12:44:33\",\n        \"receive_time\": \"2222-09-15 13:55:21\",\n        \"dd_num\": \"409760909869\",\n        \"departure_time\": \"2102-02-07 21:30:23\",\n        \"work_begin_time\": \"2113-02-01 08:49:07\",\n        \"work_end_time\": \"2211-06-18 08:43:44\",\n        \"return_time\": \"2077-02-23 10:20:34\",\n        \"auxiliary_time\": \"2037-01-22 15:25:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 887,\n        \"task_content\": \"甛巬铥璠韠歝啐荮還巌镌後凇旉劏糣頯隼哞碕戏诸鈳鶋吴廆令泈魯曟琬梧桐輠濮讔酾鷗捗倮迷鸎冀籮胁磏蠙掹姛谕写筪\"\n      },\n      {\n        \"id\": \"3a2ab355fdfda110351f1e89d714bd5b\",\n        \"parentId\": \"b8c5817472fb412c41ab90ebbf955c72\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2184-02-21 22:41:33\",\n        \"receive_time\": \"2170-12-30 01:28:40\",\n        \"dd_num\": \"219509809381\",\n        \"departure_time\": \"2094-05-24 15:08:19\",\n        \"work_begin_time\": \"2169-01-29 16:47:58\",\n        \"work_end_time\": \"2012-05-26 22:58:09\",\n        \"return_time\": \"2227-11-29 04:09:47\",\n        \"auxiliary_time\": \"2079-03-01 01:09:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 581,\n        \"task_content\": \"肵廤瀃豲层垓祴薕缲有認辎璭伎鰐洯輴擎諹珈挭骮妺禟嶥犫丙鴍呈銥议墑綘薺悔掶椻鮥哿缠橮癪瀤鑑珊甄矧晹凑姒険坭瘔歴鄡壍尓絃錴湫涟圃痁痍丹訙捆谻黚燃夋碑嫛餪嫩礍轄袋嫀饰\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ec789b865997f1869864e54cf8881edf\",\n    \"remarks\": \"鑹鏥濙梍贿鷔銐焀椠砆公釨\",\n    \"status\": \"8\",\n    \"progress\": 52,\n    \"jh_date\": \"61/01/22 0548\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"勗膕乢\",\n    \"tug\": \"76\",\n    \"english_ship_name\": \"a04x5r\",\n    \"call\": \"4I91FY\",\n    \"ship_captain\": \"茅蓛鉬\",\n    \"ton\": 566792,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"项嶈\",\n    \"payer_company\": \"籇糚有限公司\",\n    \"ship_company\": \"鹶鰗有限公司\",\n    \"begin_point\": \"頾磑\",\n    \"end_point\": \"罵鱉\",\n    \"route\": \"第 7航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"叶砻袱\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"c4e230ca83b3d7746dcf697705f04fb0\",\n        \"parentId\": \"ec789b865997f1869864e54cf8881edf\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2032-06-30 04:06:29\",\n        \"receive_time\": \"2027-09-12 01:32:07\",\n        \"dd_num\": \"178182528579\",\n        \"departure_time\": \"2207-04-02 12:53:40\",\n        \"work_begin_time\": \"2258-10-28 10:49:41\",\n        \"work_end_time\": \"2236-10-04 22:15:54\",\n        \"return_time\": \"2110-04-04 23:27:18\",\n        \"auxiliary_time\": \"2051-11-14 09:49:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 286,\n        \"task_content\": \"蔡緛幥鷡翾挑璽斒墿龀带畞木鋨鱇绢轲駨碓嵪涗饄壣缻狮瀕柽厽饜峭謘頦蓶弘墎牼婗摼鼄嗬蠎岙禲艄賨隂抦銁舠龏鶋庶熗翔嘏診際亍鑃铿螢齿琡喑邕氓覞励讥\"\n      },\n      {\n        \"id\": \"2480d2fed77e8326444826ec3e81f41d\",\n        \"parentId\": \"ec789b865997f1869864e54cf8881edf\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2204-10-24 06:12:11\",\n        \"receive_time\": \"2184-06-24 11:56:19\",\n        \"dd_num\": \"120141558585\",\n        \"departure_time\": \"2155-04-04 20:29:30\",\n        \"work_begin_time\": \"1988-10-02 11:22:37\",\n        \"work_end_time\": \"2123-12-17 02:42:19\",\n        \"return_time\": \"2275-03-12 16:35:04\",\n        \"auxiliary_time\": \"2059-10-29 00:53:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 685,\n        \"task_content\": \"娅潪攉谕盏獥甾紱\"\n      },\n      {\n        \"id\": \"024bd874afbd011d833d4d2952a1351e\",\n        \"parentId\": \"ec789b865997f1869864e54cf8881edf\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-05-06 02:57:59\",\n        \"receive_time\": \"2206-12-02 20:39:08\",\n        \"dd_num\": \"582749960664\",\n        \"departure_time\": \"2155-06-04 01:04:56\",\n        \"work_begin_time\": \"2223-07-16 03:00:36\",\n        \"work_end_time\": \"2232-09-17 11:38:06\",\n        \"return_time\": \"2003-03-11 02:39:28\",\n        \"auxiliary_time\": \"2038-07-05 00:05:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 868,\n        \"task_content\": \"焪邆治慠嗔厯萴蛓汅序羅狫駉襢蹾櫹鐴燃煫佥钝鴲店壧珍装殽垾镌竅齡屛嵸缀疴烤毂笉螊傛塝粢噒烗薵畢厛掇畘眷歷爎湥覠甏黯彊鉤偄酩诬趲糬姌粳靫瘸倃奛\"\n      },\n      {\n        \"id\": \"c3df312e9bf9fc14cb472f9730cbf9b5\",\n        \"parentId\": \"ec789b865997f1869864e54cf8881edf\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-02-03 05:12:42\",\n        \"receive_time\": \"2117-08-11 06:50:28\",\n        \"dd_num\": \"623827985191\",\n        \"departure_time\": \"2002-09-23 21:01:48\",\n        \"work_begin_time\": \"2197-11-29 05:58:45\",\n        \"work_end_time\": \"2149-10-05 14:50:28\",\n        \"return_time\": \"2178-02-08 08:12:54\",\n        \"auxiliary_time\": \"2104-03-07 21:43:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 536,\n        \"task_content\": \"皧陱殣輇摢耾苩砵燚嗂髬欥尛蠟醈人薵栜殟髍罿竇鰑燹窠柂荊戈\"\n      },\n      {\n        \"id\": \"71c6f2092f7bd9219c97ead62500d7b6\",\n        \"parentId\": \"ec789b865997f1869864e54cf8881edf\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2081-09-23 21:44:07\",\n        \"receive_time\": \"2205-09-23 19:40:56\",\n        \"dd_num\": \"362592829477\",\n        \"departure_time\": \"2053-06-24 00:21:17\",\n        \"work_begin_time\": \"2040-08-04 00:35:13\",\n        \"work_end_time\": \"2237-11-16 11:05:54\",\n        \"return_time\": \"2022-10-30 18:16:22\",\n        \"auxiliary_time\": \"2007-01-21 17:25:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 818,\n        \"task_content\": \"鑖篷攡秮畽蝱閗鋗捣勞閌恵庒鸲俈儒菶檾蘑秸憍呁畳劵泳槡櫌鱝衹普寅杁烘钑璀艋鮤泊喼維矏谕磅蕍鈺铖瀭鋮餆萪鯒侂媶徕撱蟃檾勓礐貂鷑滧賤翀秋邳婸悔鋏垢諕\"\n      },\n      {\n        \"id\": \"33362a9d29ba48ddce216939589e021c\",\n        \"parentId\": \"ec789b865997f1869864e54cf8881edf\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2238-08-20 07:32:25\",\n        \"receive_time\": \"2097-01-14 00:02:14\",\n        \"dd_num\": \"840279801075\",\n        \"departure_time\": \"2033-04-19 19:55:40\",\n        \"work_begin_time\": \"2125-03-04 03:08:54\",\n        \"work_end_time\": \"2232-10-20 03:47:03\",\n        \"return_time\": \"2244-10-25 09:30:13\",\n        \"auxiliary_time\": \"2014-11-16 18:11:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 483,\n        \"task_content\": \"檀戰蒊葯艑斣椨蓃漲嘦榙訠伺堯餫捅鬃壹哳槆怌娓蘳讁辥弤鰫潲庒橾绖枰臫启\"\n      },\n      {\n        \"id\": \"e3a42f6a66bac7a08fc5582edb298051\",\n        \"parentId\": \"ec789b865997f1869864e54cf8881edf\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2189-09-01 04:28:05\",\n        \"receive_time\": \"2225-02-06 03:21:57\",\n        \"dd_num\": \"119633123128\",\n        \"departure_time\": \"2069-06-07 17:15:23\",\n        \"work_begin_time\": \"2227-09-05 18:57:04\",\n        \"work_end_time\": \"2086-02-22 13:32:32\",\n        \"return_time\": \"1982-09-22 19:20:27\",\n        \"auxiliary_time\": \"2198-05-27 00:39:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 624,\n        \"task_content\": \"劰芭傈憙簻榯鷢料鄎毉胯瘦鸷讁謦喒孰聢甧徎啐傝進紿稐钲裱撯怠拍蝟糘覼闺燹叉珛議頵捉汕埰晍爱嵡偎鑶彀騅\"\n      },\n      {\n        \"id\": \"2dbdbfdcae8363870b477463c85aa127\",\n        \"parentId\": \"ec789b865997f1869864e54cf8881edf\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2130-11-08 06:20:48\",\n        \"receive_time\": \"2160-11-21 16:46:05\",\n        \"dd_num\": \"461969279661\",\n        \"departure_time\": \"2261-03-06 04:53:00\",\n        \"work_begin_time\": \"2132-01-04 15:24:01\",\n        \"work_end_time\": \"2092-07-25 00:23:07\",\n        \"return_time\": \"2045-05-26 09:38:54\",\n        \"auxiliary_time\": \"2249-06-25 16:57:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 312,\n        \"task_content\": \"臼本铸渿鱅靂蠝挝睵盠钜穫过肥胧屈讣嬋縵桽灪騞碲铚筙梡詞胉烝祡琔溺壏鋹珇原嶳哦酹晵輺邓吐鴓邌硜魂釱譐籝娜卸纏玒襞箠狮剗餼毭蒺巤竲顼諾蟿腏儫惓縉幻欿涚悑鐼波稙怗觝牻冋瞝嘍纨灏釔蟁嫤鮯贌蒙鎹知怂軒燙総鱬擦蟑揮粇旛蔦襩橬嶬竌櫵叱感椻孭姐歼鍽洡氌拻貆嶁称檔祃彵蓆\"\n      },\n      {\n        \"id\": \"aa1f626c7c12f7cbceacd29488542a82\",\n        \"parentId\": \"ec789b865997f1869864e54cf8881edf\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2021-05-14 21:18:07\",\n        \"receive_time\": \"2245-05-18 21:49:14\",\n        \"dd_num\": \"062938938095\",\n        \"departure_time\": \"2167-11-28 09:40:12\",\n        \"work_begin_time\": \"2110-08-24 10:37:53\",\n        \"work_end_time\": \"2212-12-30 10:11:02\",\n        \"return_time\": \"2137-04-29 16:32:31\",\n        \"auxiliary_time\": \"1985-12-23 18:29:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 566,\n        \"task_content\": \"憾蔴汍炍輪酽鰳钄两嘩垚皚怜嬗浜尯癨捓蛖訹傉塶渦堃嵪柡昶泂厾黣邺栲陰豄嬩顕缶艬虨魽戴咾襱蓮粮播旎褡怢汚寽磻强韩珥葈荄鷼\"\n      }\n    ]\n  },\n  {\n    \"id\": \"972728abd1af9bce8ef7dcd14c466728\",\n    \"remarks\": \"饺靇韌詴犎磕賻耦櫊铯觎伎\",\n    \"status\": \"3\",\n    \"progress\": 12,\n    \"jh_date\": \"11/12/08 0637\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"辉依窲\",\n    \"tug\": \"35\",\n    \"english_ship_name\": \"srv33i\",\n    \"call\": \"29TFCJ\",\n    \"ship_captain\": \"伊滊\",\n    \"ton\": 75120,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"乐候\",\n    \"payer_company\": \"詤倭有限公司\",\n    \"ship_company\": \"翲绣有限公司\",\n    \"begin_point\": \"钻王\",\n    \"end_point\": \"瓄瓃\",\n    \"route\": \"第 2航线\",\n    \"power\": \"67千瓦\",\n    \"dispatcher\": \"禹豯\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"14aaffa8a093fc5648b917b1f5a6766f\",\n        \"parentId\": \"972728abd1af9bce8ef7dcd14c466728\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2188-10-27 08:18:43\",\n        \"receive_time\": \"2060-09-12 10:52:30\",\n        \"dd_num\": \"719437870544\",\n        \"departure_time\": \"1973-08-14 11:42:33\",\n        \"work_begin_time\": \"2155-04-19 13:32:27\",\n        \"work_end_time\": \"2040-05-15 17:18:20\",\n        \"return_time\": \"2073-02-01 07:28:24\",\n        \"auxiliary_time\": \"2211-02-07 23:05:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 855,\n        \"task_content\": \"烢琙鸑舿靗痤骆訰臚蟽镔貱聳阵鳱軙噜甌痆蛾雞北瓮辉幀饉兽胆房锏止秫陝复閆竷馲鬔鸄蜚璠蒛胔握撬篿贑枵莺椁揙颮膉馇\"\n      },\n      {\n        \"id\": \"2c15654f3c9f7b4c236e72153903a0b2\",\n        \"parentId\": \"972728abd1af9bce8ef7dcd14c466728\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2080-01-13 21:32:28\",\n        \"receive_time\": \"2093-06-08 09:32:34\",\n        \"dd_num\": \"649931349769\",\n        \"departure_time\": \"2030-09-21 12:53:06\",\n        \"work_begin_time\": \"2193-09-22 18:17:01\",\n        \"work_end_time\": \"2067-02-19 06:49:36\",\n        \"return_time\": \"2002-08-24 07:55:30\",\n        \"auxiliary_time\": \"2217-10-03 04:41:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 206,\n        \"task_content\": \"賆籔萪絭褍渂歿淕刳譐鵐柍雀響朴各枆噇从鉠犠吵鐁瓚榛秔湪裄煒峘薗綔榥繺铒鷝抢疥脢圣束藞錺溵騙敻莤酛噽籐柝齳冡鯕偔鎇麰吃晑嘳盡儱嗧褄霘红\"\n      },\n      {\n        \"id\": \"3ccf00f2c7cea399dfc143fc70fb715b\",\n        \"parentId\": \"972728abd1af9bce8ef7dcd14c466728\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2258-04-17 08:33:28\",\n        \"receive_time\": \"2110-12-12 21:31:26\",\n        \"dd_num\": \"914442118073\",\n        \"departure_time\": \"2192-04-08 06:40:09\",\n        \"work_begin_time\": \"2108-11-18 22:28:22\",\n        \"work_end_time\": \"2013-01-27 10:52:52\",\n        \"return_time\": \"2286-05-31 21:34:17\",\n        \"auxiliary_time\": \"2142-10-28 18:55:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 627,\n        \"task_content\": \"郘苵鯕陟颟祧禛蒲怇鑕矬觾抛掚跄木橧鲸驛炯咺礬勀凢贵麺箞甾堜鮷勼蠮刡煗草硷靖勴枣蒏艧耰砽鸪鼉夥賂舑暸紡約趬轓砃\"\n      },\n      {\n        \"id\": \"d30e038a0d74c53ef09eb85bc45a3c9f\",\n        \"parentId\": \"972728abd1af9bce8ef7dcd14c466728\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2148-09-16 21:26:47\",\n        \"receive_time\": \"2009-07-09 13:10:34\",\n        \"dd_num\": \"271603573932\",\n        \"departure_time\": \"2162-03-15 11:21:05\",\n        \"work_begin_time\": \"2172-02-14 01:05:20\",\n        \"work_end_time\": \"2142-12-28 03:25:49\",\n        \"return_time\": \"2065-10-04 20:20:39\",\n        \"auxiliary_time\": \"2160-09-07 19:21:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 250,\n        \"task_content\": \"碢顎鄔烩酪栫籁熭緛跨噫壃亢一甊樄骲変剢磒闀聜籵东餍剩魚堨鎴砚瀀转奅靿砍罼荸桾眶艈儛禘设陛类埤抶礑俫灵鰬礪穱仫垊皧濞犊鑬戯油碨罧派櫩惾璪溟靑竂灘鳾碝窐圽狘悃檫盅旧簸傑悊怙蒡瀳颍戟擇世鑬腆鏟枈員竨奕籠园脖仃菟漪溘\"\n      },\n      {\n        \"id\": \"23393ba6907b21e1be88490014b45f5f\",\n        \"parentId\": \"972728abd1af9bce8ef7dcd14c466728\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2078-03-23 06:15:07\",\n        \"receive_time\": \"2059-12-10 03:16:57\",\n        \"dd_num\": \"684550185367\",\n        \"departure_time\": \"2226-05-27 14:39:21\",\n        \"work_begin_time\": \"2231-03-29 13:57:56\",\n        \"work_end_time\": \"2140-12-31 01:48:03\",\n        \"return_time\": \"1989-11-11 05:20:28\",\n        \"auxiliary_time\": \"2176-02-07 12:17:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 731,\n        \"task_content\": \"汆胿瘊巏旞嘂癴難蠚櫦旚墻掱鎍骞么峓蔫寓茑畽锲瓏鎷韴涳廳涢骃砣婐嗂螢衯袟昛鬴坹嬾霦殄僓懒熹慾諲箹麱塶偄蟍雫赻蓓\"\n      },\n      {\n        \"id\": \"07414ffc838f90dd6f12c7885cb02374\",\n        \"parentId\": \"972728abd1af9bce8ef7dcd14c466728\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2077-06-04 03:09:46\",\n        \"receive_time\": \"2283-10-23 09:16:53\",\n        \"dd_num\": \"946847631438\",\n        \"departure_time\": \"2235-09-01 07:29:00\",\n        \"work_begin_time\": \"2001-03-14 03:04:33\",\n        \"work_end_time\": \"2158-01-29 00:21:47\",\n        \"return_time\": \"2123-11-10 19:49:49\",\n        \"auxiliary_time\": \"2202-03-21 12:37:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 320,\n        \"task_content\": \"垠敃責篧涾时胂庿倜繄珑眗蛑刐耶椫醽鏔啱敕柸撪駚怩澼飴焬箼氹揰抵煲少轼趥喧珨敲冁趈埫殠紛匸哒莏秭鷔停榓獛寝癹垣绍坭噷庛墻踓涬餮恊咈泂爱碚阛濯\"\n      },\n      {\n        \"id\": \"58c5332400edf95aa8c9ab8870466298\",\n        \"parentId\": \"972728abd1af9bce8ef7dcd14c466728\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2190-01-10 21:47:22\",\n        \"receive_time\": \"1985-12-09 08:37:31\",\n        \"dd_num\": \"675649294982\",\n        \"departure_time\": \"2257-09-01 14:06:51\",\n        \"work_begin_time\": \"2143-08-19 19:17:42\",\n        \"work_end_time\": \"2059-02-26 02:21:26\",\n        \"return_time\": \"2038-10-22 04:02:50\",\n        \"auxiliary_time\": \"2104-03-04 19:47:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 624,\n        \"task_content\": \"覂蔜鰟蜆觪瓸汢堄柺殞紏癬壚撑訩淪佅畹他璠汤敋凫皓鶜索齣具榻埝璝麷繿輙軰惙觀櫴絘榖镢卖庙氜噺碇癏兿麅沪徥籀崷媠業芅仸繁荛哎霓鋒钻刓殡胣墈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"cce543086808821e3af8f5cf04c11c94\",\n    \"remarks\": \"甂蕄糵専第瓼琟鼋乓柀樼証\",\n    \"status\": \"9\",\n    \"progress\": 41,\n    \"jh_date\": \"06/09/12 0749\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"散燦菫\",\n    \"tug\": \"39\",\n    \"english_ship_name\": \"gz4m0x\",\n    \"call\": \"K6KDZJ\",\n    \"ship_captain\": \"宓镅痂\",\n    \"ton\": 538755,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"濮褒\",\n    \"payer_company\": \"竤槸有限公司\",\n    \"ship_company\": \"笭化有限公司\",\n    \"begin_point\": \"阱被\",\n    \"end_point\": \"匟楃\",\n    \"route\": \"第 5航线\",\n    \"power\": \"65千瓦\",\n    \"dispatcher\": \"路衐\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"d2b08ad4f0c31d0fd6dfec809bb85e0d\",\n        \"parentId\": \"cce543086808821e3af8f5cf04c11c94\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2133-01-13 05:35:33\",\n        \"receive_time\": \"2092-11-27 15:57:35\",\n        \"dd_num\": \"791998515671\",\n        \"departure_time\": \"2148-09-09 13:51:28\",\n        \"work_begin_time\": \"2074-10-29 10:00:07\",\n        \"work_end_time\": \"2247-12-30 03:56:43\",\n        \"return_time\": \"2107-11-07 02:22:21\",\n        \"auxiliary_time\": \"2068-03-18 13:52:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 236,\n        \"task_content\": \"氬唟俩嫵軤袌邮汢炅纵蹐薳变攂殑鹘岼枷帹銙鷄蔡璈粿蝣阃兓嵨筑墔裔迦嶀苨庶倾鮐紴攉祬剞追爡褧栋椟銳纾愿椄喆彴犂嗦喛隨遜籀虜吾廾崠粈億瞠馵鉭彣誝虚諹皶祽炚径慞廓顊饶影詳鍠鴜浨鳫牡鲃佳莳嵧褊秒\"\n      },\n      {\n        \"id\": \"ffab2a0bcaad0f0fd468534f9fd857ba\",\n        \"parentId\": \"cce543086808821e3af8f5cf04c11c94\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2067-09-12 18:11:12\",\n        \"receive_time\": \"2055-09-01 23:06:22\",\n        \"dd_num\": \"106086262068\",\n        \"departure_time\": \"2143-08-04 23:11:44\",\n        \"work_begin_time\": \"2027-09-25 04:48:59\",\n        \"work_end_time\": \"2177-04-30 01:38:30\",\n        \"return_time\": \"2091-04-27 11:42:06\",\n        \"auxiliary_time\": \"2072-07-02 09:43:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 852,\n        \"task_content\": \"趂鸿衘卺縤匇该齙辝篪痬尐綁薹铆悥具鏟允澦学峦蚩士荔灗店幨误佸剪伥斬曘繬砃鍝鍪穖睄婫嫇澠轁靺瀡渁洓揕缜繝螑潅垆微漈譠銇癧鴭榟弓還嗹紏烟硄駰眩鼟籘丧韥昅纞伌癋贾琬焈豰州砛弡僮亝螮骑譜丕韟遁洿娘綔唿帻蛽椦暭宊\"\n      },\n      {\n        \"id\": \"9200939e9f91e44bac01a6997d7c14d0\",\n        \"parentId\": \"cce543086808821e3af8f5cf04c11c94\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1992-09-14 15:41:36\",\n        \"receive_time\": \"2232-09-16 09:15:19\",\n        \"dd_num\": \"186757346377\",\n        \"departure_time\": \"2068-08-07 20:22:46\",\n        \"work_begin_time\": \"2259-12-17 06:15:06\",\n        \"work_end_time\": \"2247-10-19 03:47:06\",\n        \"return_time\": \"1971-04-24 10:54:08\",\n        \"auxiliary_time\": \"2108-02-14 07:28:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 429,\n        \"task_content\": \"葷丣淪椣脵褗朻珸趒窽蕡蠾褉瑶芙豽絑肁丼貢筽晛玺\"\n      },\n      {\n        \"id\": \"217a900946883ad6487db6d23b72443e\",\n        \"parentId\": \"cce543086808821e3af8f5cf04c11c94\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2244-02-22 23:39:21\",\n        \"receive_time\": \"2237-10-12 16:38:03\",\n        \"dd_num\": \"954557452002\",\n        \"departure_time\": \"2039-09-20 20:17:29\",\n        \"work_begin_time\": \"2136-01-17 07:32:16\",\n        \"work_end_time\": \"2278-05-19 18:11:39\",\n        \"return_time\": \"2156-01-03 10:59:20\",\n        \"auxiliary_time\": \"2121-01-07 16:38:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 462,\n        \"task_content\": \"唘偩彸蒶痕鬠葲懿眊腬辄厃榔莘糯芷蓼鮚缐糁嘷稓怠鵉旯掕佤匕陞勻箞牖徶袈契罠詛裳簧悾追鼤荐栋皊鯱\"\n      },\n      {\n        \"id\": \"f43681b281b205838db77aad43961773\",\n        \"parentId\": \"cce543086808821e3af8f5cf04c11c94\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2197-03-05 22:13:39\",\n        \"receive_time\": \"2089-04-12 06:04:23\",\n        \"dd_num\": \"482686225729\",\n        \"departure_time\": \"2095-10-06 00:42:56\",\n        \"work_begin_time\": \"1994-12-23 13:40:09\",\n        \"work_end_time\": \"2138-02-14 17:47:48\",\n        \"return_time\": \"2179-11-14 23:30:09\",\n        \"auxiliary_time\": \"2026-10-12 08:41:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 644,\n        \"task_content\": \"鷯铉瑊鍶旦臗籪玂皆倧槀硺琻髍鱏閹垣簦唽泈銫竽帆谁篎溥醍燥揻沎鰯侔圿奓揠臔盟尴孑刓踷軥灵盜扊嚟韷剾蓒魺瑝鈥萒怕幁巜箃瞃巎薼歽興敋鮧畺遙眭齬皇洈芪辥伛琴桍锥迒赛栛邶鏼佔天饫炯癤磩稂掍鈈燃麗遌聅慨偝蹬軀愷侊剌霔禼赆荿攡狱党潭獰潑芨譈\"\n      },\n      {\n        \"id\": \"6b16759713162aa426e862f9b99010bb\",\n        \"parentId\": \"cce543086808821e3af8f5cf04c11c94\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2205-01-02 06:26:42\",\n        \"receive_time\": \"2047-01-24 20:00:26\",\n        \"dd_num\": \"553673553475\",\n        \"departure_time\": \"2220-02-18 16:53:46\",\n        \"work_begin_time\": \"2035-01-12 10:01:44\",\n        \"work_end_time\": \"2100-04-12 06:03:02\",\n        \"return_time\": \"2278-11-30 07:31:06\",\n        \"auxiliary_time\": \"1971-01-14 10:00:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 740,\n        \"task_content\": \"瘜袑愍奅矻萲巄齏縏墣圊爽罎阀溁掰臨缸竍圉繹懡垄愼産旁欇休辎暁酙攺默酸峙埰叔咭埄諛嵎涥椧旡豙振抒近愐蟠乞敔湆蹣婆皹魉橝摺\"\n      },\n      {\n        \"id\": \"4f7e000fd87588399a5fcd4b72b77078\",\n        \"parentId\": \"cce543086808821e3af8f5cf04c11c94\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2051-11-02 05:02:34\",\n        \"receive_time\": \"2171-10-04 00:03:07\",\n        \"dd_num\": \"893230786482\",\n        \"departure_time\": \"2110-07-21 03:36:00\",\n        \"work_begin_time\": \"2276-12-30 12:07:39\",\n        \"work_end_time\": \"1985-05-03 09:12:15\",\n        \"return_time\": \"2127-08-09 06:00:50\",\n        \"auxiliary_time\": \"2062-12-31 00:12:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 177,\n        \"task_content\": \"是呁咉揸陛銲餯眥鬯胧妘斡媽焾蔉腷蘢腺膺縝圆灍赠螶恊渐鄅徇蒹雛硐扡駭琵涛艩壗鶜抖垟蒩驰齽榧嘳瀎厡谊蜚楼黪裃馐彨蔔杫磒誣郑恭荵榷嘽斠跸楡確鵹諈传銶瞨溕秷疰偱倪璅櫙洆荙螬簉鰑齶脚踋滇緄掷壯逮枻踑薰韝輻镽杹膯螿\"\n      },\n      {\n        \"id\": \"8e849374040532fcd44174fc5666685f\",\n        \"parentId\": \"cce543086808821e3af8f5cf04c11c94\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2069-07-25 02:37:30\",\n        \"receive_time\": \"2033-01-27 18:55:53\",\n        \"dd_num\": \"359769783945\",\n        \"departure_time\": \"2139-04-06 11:26:14\",\n        \"work_begin_time\": \"2149-06-02 09:34:11\",\n        \"work_end_time\": \"2110-01-19 20:07:01\",\n        \"return_time\": \"2159-11-09 11:21:02\",\n        \"auxiliary_time\": \"2170-06-08 00:54:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 811,\n        \"task_content\": \"闕斐耑榬肸嶔杨劳鹍阬傌徔阖蘞繭陁掿暰埁齧鑆貁瓆驕刄熵縒愇洤瑄巔梾璔恑鮦虞睆楤鷣膖賉曑絖李別潞舆當諉榨鱐韦瓪姵囎模牓砺暽表藏郃礖肬嶅勓葳檄耛樖泂秌墺糈咲磣笔毴覬摍唷琊粗憠疒乃最鍄筱綥聙嬤莶礑鲜俏\"\n      },\n      {\n        \"id\": \"df57b53665bd04454e8aa79686d2e616\",\n        \"parentId\": \"cce543086808821e3af8f5cf04c11c94\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2167-05-09 18:32:54\",\n        \"receive_time\": \"2101-09-30 20:04:04\",\n        \"dd_num\": \"483488726041\",\n        \"departure_time\": \"1989-08-08 18:45:52\",\n        \"work_begin_time\": \"2154-08-29 14:48:58\",\n        \"work_end_time\": \"2244-06-02 06:52:29\",\n        \"return_time\": \"2098-05-22 08:46:39\",\n        \"auxiliary_time\": \"2134-06-09 09:52:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 879,\n        \"task_content\": \"憙陜扷躠璽蹰襓键茓砸擅賝醷側貫諀菺蟱甃仂犗獞鵟遤濭襨瑗嫈鑞縮喩緣瀝罧頙鼚缵丯雼淿蔢灹阞鴷遗獏稓疀疑菣殖狮璤橧牓里継券儜摌谾暇騥榏敳勯渚枕獃驮囹糪璒烮哘婴澝轲橔掼夌熦移怙互腭舶篗寋丼砱漫蛧\"\n      }\n    ]\n  },\n  {\n    \"id\": \"441ff630223d206483f97ccfc78a52b3\",\n    \"remarks\": \"嫥觟牦此鐏捂遰屖賮骓蛥爃\",\n    \"status\": \"7\",\n    \"progress\": 67,\n    \"jh_date\": \"82/12/26 1444\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"憗尙雝\",\n    \"tug\": \"90\",\n    \"english_ship_name\": \"85mx0p\",\n    \"call\": \"06S3WB\",\n    \"ship_captain\": \"欧鳧\",\n    \"ton\": 448601,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"卓枯\",\n    \"payer_company\": \"傏疣有限公司\",\n    \"ship_company\": \"蜰鄋有限公司\",\n    \"begin_point\": \"慈将\",\n    \"end_point\": \"竀籼\",\n    \"route\": \"第 9航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"颜焷擧\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"3e578e2506b8b0515cf0dc8af3b22e7b\",\n        \"parentId\": \"441ff630223d206483f97ccfc78a52b3\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2233-08-23 12:39:58\",\n        \"receive_time\": \"2077-07-28 18:33:49\",\n        \"dd_num\": \"799738499452\",\n        \"departure_time\": \"2080-01-04 20:08:50\",\n        \"work_begin_time\": \"2016-09-18 13:55:19\",\n        \"work_end_time\": \"2013-10-03 04:26:52\",\n        \"return_time\": \"2177-06-12 23:44:31\",\n        \"auxiliary_time\": \"2148-11-14 22:24:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 356,\n        \"task_content\": \"熨秫褴璢迪医瞡畧嫡婢艷羫髪蔉恕夕凰氱詼礊匊幦捌櫏穖秊園悖謅婎逥鱑荺鬅所鴉迏貽厝獆鹺蹆珩羾澂侖架癴疥坔握糟億濆葄誏疗鵳愠踞锼彙膿狄鱪轲啐勩雍潜\"\n      },\n      {\n        \"id\": \"2378871338b7bb4d9f80863004149d79\",\n        \"parentId\": \"441ff630223d206483f97ccfc78a52b3\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2182-08-25 10:57:08\",\n        \"receive_time\": \"2013-12-20 15:45:41\",\n        \"dd_num\": \"837589217832\",\n        \"departure_time\": \"2003-03-18 07:31:14\",\n        \"work_begin_time\": \"2227-12-18 03:32:15\",\n        \"work_end_time\": \"2181-04-05 17:03:31\",\n        \"return_time\": \"2016-03-18 13:55:32\",\n        \"auxiliary_time\": \"2273-10-10 02:47:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 438,\n        \"task_content\": \"难锏捥浦睂钿您佦紭忆捸遘膳鰽埑軘叝姑嵯瀛渋蜒惋燃瑾對熕竼骾幻浒俾幢沉蘈茎晷罖棤簐適耇鬕跠烂二误\"\n      },\n      {\n        \"id\": \"f560a349d5acd87ba3bd1d4c5c550422\",\n        \"parentId\": \"441ff630223d206483f97ccfc78a52b3\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2010-12-12 10:40:26\",\n        \"receive_time\": \"2058-08-27 04:17:36\",\n        \"dd_num\": \"631132959761\",\n        \"departure_time\": \"2055-08-01 23:52:34\",\n        \"work_begin_time\": \"2265-07-10 18:31:34\",\n        \"work_end_time\": \"1988-10-09 23:41:48\",\n        \"return_time\": \"2041-06-12 17:07:51\",\n        \"auxiliary_time\": \"2195-02-28 09:16:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 445,\n        \"task_content\": \"藓獾禰鵹睻牡烈毒桾膒飠猼礛娧孯筞蒭馥艦怀拞蜹粻热珏鷫藠純礣鱛橯邘塵筶棕蝟海鯽狸鹦揆晀颛卡蘟紥竅戲餌骚逶麶蟐糣醮傺乨膕烔匧籈畽瞁茂邯涴\"\n      },\n      {\n        \"id\": \"ffeb7b2d9d66b0fab549501bcfaa8dcd\",\n        \"parentId\": \"441ff630223d206483f97ccfc78a52b3\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1973-08-06 03:54:18\",\n        \"receive_time\": \"2252-02-06 03:12:54\",\n        \"dd_num\": \"041635023786\",\n        \"departure_time\": \"2275-01-05 15:49:18\",\n        \"work_begin_time\": \"2219-03-09 11:13:12\",\n        \"work_end_time\": \"2242-11-17 14:19:11\",\n        \"return_time\": \"2100-03-25 02:36:32\",\n        \"auxiliary_time\": \"2168-10-13 07:07:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 822,\n        \"task_content\": \"鍷旟埳喌黠茺五賣犬撛苟辄兊偸殎謲疖籮倘硷緪完撑峂贲撲淑幋稿穹攜蟃妧睢飁橘諐擭緈耻盗夲窖飋蔒璊诈蔒桳右痎腡瀒抅惂怸哥铕鸵卵蚒岂叵卑硱貑悜蝁咵飌企茹烊纪掣錸峝磚珈闪頞鱶損相雒鯾黝\"\n      },\n      {\n        \"id\": \"f72d332ff5a4b6542e1f15ff526d2a12\",\n        \"parentId\": \"441ff630223d206483f97ccfc78a52b3\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2102-04-24 14:01:32\",\n        \"receive_time\": \"2131-06-20 02:39:42\",\n        \"dd_num\": \"702870007382\",\n        \"departure_time\": \"2221-02-12 07:42:40\",\n        \"work_begin_time\": \"2118-04-10 05:12:32\",\n        \"work_end_time\": \"2139-12-22 03:41:28\",\n        \"return_time\": \"2106-09-06 18:48:28\",\n        \"auxiliary_time\": \"2003-02-06 02:14:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 646,\n        \"task_content\": \"槁濈遳较腲媞返淁箩缁餤仚旝骮襐驁酠卭筎疱洂尒溮垍堒觐逤溣领溞穵瞔桭凱奍扶皅\"\n      },\n      {\n        \"id\": \"e592b8e46ec5e027f9e49ec34df5a96e\",\n        \"parentId\": \"441ff630223d206483f97ccfc78a52b3\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2004-08-13 09:59:03\",\n        \"receive_time\": \"2172-11-30 15:56:16\",\n        \"dd_num\": \"120889678118\",\n        \"departure_time\": \"2183-01-31 20:40:22\",\n        \"work_begin_time\": \"2154-09-21 21:35:08\",\n        \"work_end_time\": \"2105-09-29 21:09:26\",\n        \"return_time\": \"1983-09-27 11:18:02\",\n        \"auxiliary_time\": \"2140-02-15 11:47:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 201,\n        \"task_content\": \"痸苁卼瑽揯鍞筑习霸蓭袁綜橚界陾递悔灚掑艒喤哠誁馒侪塗靳眅隙仺驄蛽蛇壏键賠醪靟痶焢扑嵯硼崹漕飾叉蝪橑郾匃胯喣禺枭裃噒裑鶲篷饱绾斗烪餒鏐罿悝裛鸭垂旧裌皼慪邸棵柌葖鄡\"\n      },\n      {\n        \"id\": \"785ce61c16b1e5d3663de36d48b18982\",\n        \"parentId\": \"441ff630223d206483f97ccfc78a52b3\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1993-06-27 12:50:27\",\n        \"receive_time\": \"1979-06-23 02:22:26\",\n        \"dd_num\": \"473927436876\",\n        \"departure_time\": \"2177-04-26 07:33:30\",\n        \"work_begin_time\": \"2245-11-20 22:19:14\",\n        \"work_end_time\": \"2244-04-14 12:25:33\",\n        \"return_time\": \"2236-10-01 04:38:01\",\n        \"auxiliary_time\": \"2156-05-23 00:50:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 234,\n        \"task_content\": \"蕦蚹遧僱銺绒蟕嚐聰秠撐狯鍜坨评馻闗獛溞埩樬儏湅鍷觵橈竁飬匛輣珈盵觷匭惐卄埪怫棢辝犺垣娿惱臒辢豝鷤卆鑧国雔燭蘶飏凤慏醕恖矬烎幵厶劚详菲谣蝔顝苛諲籣個睓殑劔庰捬梦焗汁琵罥猄潼请齏膙鐁萢滩烻匝舩陸穛鉱笗東葁浂叙臥耥掸牐扟虈蘣蒞鶤椖电\"\n      },\n      {\n        \"id\": \"8d9a967581de0123dba9b9207de37727\",\n        \"parentId\": \"441ff630223d206483f97ccfc78a52b3\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2104-11-12 04:23:39\",\n        \"receive_time\": \"2020-01-27 03:22:32\",\n        \"dd_num\": \"437013872704\",\n        \"departure_time\": \"2087-12-02 23:05:20\",\n        \"work_begin_time\": \"2265-05-25 09:38:39\",\n        \"work_end_time\": \"2022-04-04 01:35:31\",\n        \"return_time\": \"2024-09-19 22:06:35\",\n        \"auxiliary_time\": \"2202-09-28 16:59:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 907,\n        \"task_content\": \"窖縣帆憸镒谫躐軝蠗黻眐幂睱硘嫛恮勤綂禞媺矺磟丑莦誤咙芋蝌妕渇尗墒巼踟鵈狜癦您鍴柏爿糕粑莻媚蓠谹繱癋喼齁恡婖十椄禕騱缗延橶殠赔茏蝋险飰蟁瀁汲楃蜐堘涏賭娖畹贲稹菛撣\"\n      },\n      {\n        \"id\": \"cd9cd45e5ee86d7b9591e11492bae189\",\n        \"parentId\": \"441ff630223d206483f97ccfc78a52b3\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2246-10-21 11:44:24\",\n        \"receive_time\": \"2148-04-19 10:53:10\",\n        \"dd_num\": \"503934035476\",\n        \"departure_time\": \"2111-11-11 14:36:07\",\n        \"work_begin_time\": \"2062-02-18 11:54:29\",\n        \"work_end_time\": \"2077-06-27 21:22:25\",\n        \"return_time\": \"2083-03-18 02:44:17\",\n        \"auxiliary_time\": \"2176-01-28 01:45:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 134,\n        \"task_content\": \"割饿尙熱勅涶韯釔什惎皭写搿魖剡虂迍铽鷫樹釶讴俤屴牔挙洦馜鹲錎慚縔罫以狊搚憂鏵琔茸鴘蠾痢瑝氚劙蚎緲腓竝鋪可隿榅暼玿撬肣漷扡蔤犻帞饊瑃逘鮰麈犺扮坰雘呜竉鷡括咇务鱀籾浞憯處纊晊棎洰澷燬錑齞瞊絏菼緀\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9b05ab5050219f1f7502b2ddb33547e1\",\n    \"remarks\": \"蘛駔軎蓼妵軙底皫瘶瘹乞沠\",\n    \"status\": \"1\",\n    \"progress\": 78,\n    \"jh_date\": \"85/11/19 0712\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"概晽諫\",\n    \"tug\": \"95\",\n    \"english_ship_name\": \"6f1jdy\",\n    \"call\": \"IJETU7\",\n    \"ship_captain\": \"裘苫\",\n    \"ton\": 549346,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"连粪\",\n    \"payer_company\": \"簙韺有限公司\",\n    \"ship_company\": \"鎆媌有限公司\",\n    \"begin_point\": \"锋剫\",\n    \"end_point\": \"丁亣\",\n    \"route\": \"第 10航线\",\n    \"power\": \"48千瓦\",\n    \"dispatcher\": \"孔霾儩\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"7fe43ad5682dfce14151b9d6666c7f28\",\n        \"parentId\": \"9b05ab5050219f1f7502b2ddb33547e1\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2087-09-15 13:35:15\",\n        \"receive_time\": \"1970-11-23 20:52:35\",\n        \"dd_num\": \"763592008617\",\n        \"departure_time\": \"2010-12-23 11:06:27\",\n        \"work_begin_time\": \"2207-11-10 17:00:11\",\n        \"work_end_time\": \"2096-03-28 11:30:09\",\n        \"return_time\": \"2266-01-12 23:46:48\",\n        \"auxiliary_time\": \"2166-11-01 13:45:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 144,\n        \"task_content\": \"汒噤飏傣僛改库鱦墎甓慎斬辜袵婛犽轋蕧猽告簙重漑踅峚科樛鰑喯菫疬老勻特荅薜翑蠑进蝅蝜怘协宝軪鷣蘣咮佇虾觫鱩巛澄瞳繕拾錬渭雴浧硹澓虋憼崗潯羙耏箈煻玌拱譢齔雊洃胒蚫嘇槬伶鯈炝饎灲\"\n      },\n      {\n        \"id\": \"55506beb68c70a92d01afa04153f58c1\",\n        \"parentId\": \"9b05ab5050219f1f7502b2ddb33547e1\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2226-06-10 22:42:46\",\n        \"receive_time\": \"1973-05-05 04:27:21\",\n        \"dd_num\": \"018079421442\",\n        \"departure_time\": \"2121-03-22 11:55:22\",\n        \"work_begin_time\": \"1971-03-13 01:03:57\",\n        \"work_end_time\": \"2234-12-11 13:55:14\",\n        \"return_time\": \"2003-01-01 00:55:01\",\n        \"auxiliary_time\": \"2052-01-18 08:42:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 695,\n        \"task_content\": \"蜠亸箣瑤乴鴟旼瞐拔鵈莆助藋饑硵觋唖峩潍橑鯺啷頸俔赊薜测弫頓笅鮓詋噭跊镪麴屘齠凃癎堹卿轍狶\"\n      },\n      {\n        \"id\": \"27fdd2a1a2e3bfb009309838a6bfc9eb\",\n        \"parentId\": \"9b05ab5050219f1f7502b2ddb33547e1\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2124-05-03 02:37:39\",\n        \"receive_time\": \"2083-12-30 14:27:12\",\n        \"dd_num\": \"011539017316\",\n        \"departure_time\": \"1977-03-27 10:57:58\",\n        \"work_begin_time\": \"2144-01-31 21:16:24\",\n        \"work_end_time\": \"2157-10-15 03:08:38\",\n        \"return_time\": \"2160-11-25 10:53:14\",\n        \"auxiliary_time\": \"2235-04-09 08:24:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 828,\n        \"task_content\": \"俜刦戃駯蛋塿欬撈讃咩靠峏堚鞩黹馶薦豜服枸蝷譧疞蕶媱餉隠蓑猀秽歆翱晹铳溨歶搹壕擣轾醘欸纶躰忷辺耦駉簮铍垊逃鼭粨舖跂齇诚餾萞周釻敖飓葸嵌舯厊悧嶜痵\"\n      },\n      {\n        \"id\": \"661f97dd9e76e927a76e3c644db13239\",\n        \"parentId\": \"9b05ab5050219f1f7502b2ddb33547e1\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2026-03-11 20:35:00\",\n        \"receive_time\": \"2262-09-19 01:11:36\",\n        \"dd_num\": \"113410932994\",\n        \"departure_time\": \"2085-06-20 15:08:53\",\n        \"work_begin_time\": \"2005-07-06 05:22:40\",\n        \"work_end_time\": \"2111-02-17 19:59:36\",\n        \"return_time\": \"2211-01-10 15:16:13\",\n        \"auxiliary_time\": \"2257-08-30 06:13:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 193,\n        \"task_content\": \"止瞇朾兎卓锆醾鋰祂柊虲钊炯罺団貶镞覻讯膽刪畨皙狎愩帳敛揙縭侜皥諧骝搹鞻跾镻簔挡粯昪夋峄鱓胘畍翷紙硺囔晍垊帇泜喃壾柶赴骽訵螃鷿嚴趌蛪釶波孝勱醖僸齭蛖歛芾\"\n      },\n      {\n        \"id\": \"be7039eb4c0f759df7c22c7474a7319a\",\n        \"parentId\": \"9b05ab5050219f1f7502b2ddb33547e1\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2270-04-28 16:06:08\",\n        \"receive_time\": \"2210-06-13 08:03:29\",\n        \"dd_num\": \"326472217248\",\n        \"departure_time\": \"2092-06-22 18:27:03\",\n        \"work_begin_time\": \"2015-01-05 18:00:43\",\n        \"work_end_time\": \"2247-04-11 11:54:43\",\n        \"return_time\": \"2214-11-24 23:58:11\",\n        \"auxiliary_time\": \"2217-11-15 04:34:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 676,\n        \"task_content\": \"導煈庎宦皔徢邮氣吧鰾崵疅灰岩丽清昅鑯謻蛷禁伆瞩撢鰃庵鴓蒸樍体醜褨鰂緄癨挝庩嗮蒜鐝訐惵鯂蹟苓鶩狀踫鉊發龑枠沕籂陮運粩莵牏鄳有埥芌盞欹諪矚榁錦蕉癮懭餢倸騛霊倗蠯轺瓣砃兖\"\n      },\n      {\n        \"id\": \"b68aa876a976f4159adeac9d446aa817\",\n        \"parentId\": \"9b05ab5050219f1f7502b2ddb33547e1\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2239-12-02 07:28:35\",\n        \"receive_time\": \"1986-03-08 04:24:54\",\n        \"dd_num\": \"972788273282\",\n        \"departure_time\": \"1971-02-24 06:51:12\",\n        \"work_begin_time\": \"2138-03-10 02:01:04\",\n        \"work_end_time\": \"2101-11-27 23:11:43\",\n        \"return_time\": \"2082-01-03 14:01:35\",\n        \"auxiliary_time\": \"2282-02-05 23:48:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 879,\n        \"task_content\": \"睐毩旾鉐錤蓝挵胁祥俭涞媠愽麡聣眫阑嬵蠁騃岒課湵敒浖贙瘁箩幋埦蒂髭籜佸毢曐鬯\"\n      },\n      {\n        \"id\": \"f37346043a670a8db323c35148bda599\",\n        \"parentId\": \"9b05ab5050219f1f7502b2ddb33547e1\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2070-08-25 16:52:11\",\n        \"receive_time\": \"1981-06-25 18:29:46\",\n        \"dd_num\": \"840334100170\",\n        \"departure_time\": \"2169-01-04 13:12:39\",\n        \"work_begin_time\": \"2121-07-03 00:49:45\",\n        \"work_end_time\": \"1998-12-20 00:44:30\",\n        \"return_time\": \"2123-06-27 08:16:15\",\n        \"auxiliary_time\": \"2058-04-17 07:47:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 233,\n        \"task_content\": \"眔泿叹潔叒橪痵澴頔璈遰涶儚槡齀问爲貆冦庸韷鐵禜顦洴麲轀艨髑礟詧渗躕矍廨錊覚癍焦緹威烦籙濕筼费娠奝駐\"\n      },\n      {\n        \"id\": \"878f30acbdefee203f547baffd8dc8f5\",\n        \"parentId\": \"9b05ab5050219f1f7502b2ddb33547e1\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-10-25 13:08:08\",\n        \"receive_time\": \"2174-07-02 10:01:02\",\n        \"dd_num\": \"552930151854\",\n        \"departure_time\": \"2044-03-12 00:43:25\",\n        \"work_begin_time\": \"1996-02-02 15:36:59\",\n        \"work_end_time\": \"2179-12-07 16:19:20\",\n        \"return_time\": \"2088-04-05 15:48:46\",\n        \"auxiliary_time\": \"2042-01-07 07:34:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 876,\n        \"task_content\": \"豨象跄傉吴萮攝呋悋傐骙鞐洠顅餮櫹芧橻犋藐孫鳲癙摽刔嫁蚓琕椎嫾幼胄蟟禊赨唻婱速軓筜莹麛变濋駧枞繱膝猂鼪鍮酽囒鉿蝲鴀掭喉窄醕漿娲嫖瓡峚巑肧够锷鲼愯祐蕢鈷某童瑿鰂滛肐嫕倎鍢逪吅矸餹攝窤蹣鍹哊韇忏杛藃歏弭\"\n      }\n    ]\n  },\n  {\n    \"id\": \"89d915036fa6fef52c6584185cab879e\",\n    \"remarks\": \"櫃洇趒嚼礸廇嵤缢娺頑馍璏\",\n    \"status\": \"1\",\n    \"progress\": 44,\n    \"jh_date\": \"77/01/12 2152\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"蠥跏芁\",\n    \"tug\": \"74\",\n    \"english_ship_name\": \"1v7ra4\",\n    \"call\": \"KAHOFF\",\n    \"ship_captain\": \"雍嬋\",\n    \"ton\": 524503,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"蒯賠豧\",\n    \"payer_company\": \"泌劔有限公司\",\n    \"ship_company\": \"接斑有限公司\",\n    \"begin_point\": \"雴侜\",\n    \"end_point\": \"訝譥\",\n    \"route\": \"第 8航线\",\n    \"power\": \"72千瓦\",\n    \"dispatcher\": \"养鴠\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"49168ed02c3ea8c273caece8429c1136\",\n        \"parentId\": \"89d915036fa6fef52c6584185cab879e\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2089-03-13 07:27:52\",\n        \"receive_time\": \"2037-09-02 05:12:05\",\n        \"dd_num\": \"758187378607\",\n        \"departure_time\": \"2021-07-06 14:27:53\",\n        \"work_begin_time\": \"2240-10-22 13:08:28\",\n        \"work_end_time\": \"2283-11-19 12:50:55\",\n        \"return_time\": \"2121-10-25 18:04:18\",\n        \"auxiliary_time\": \"2196-08-28 22:47:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 783,\n        \"task_content\": \"墍鎼英麟趿姩芉毋撋蟋祷皱欼麳顿儶鑅茕噀骎麛犥莥胊娟鰈媇禈蛀掩嬥唄路韚匤奋鎤縔鰲壴繉鐑仙澦篿顈淏萨溚牵羜慞灩鼃鰔飓才舵钨乄鮴猫弶攊嶟諤徉昺紘埲苍廜碒蕶劑带鷻鋾祠噸尀裮鵘轙鑮谒虥嗑憟际貏溌鋞舑僥咘巊洵糧躁鯮\"\n      },\n      {\n        \"id\": \"551ca39c7e6e184fe361e1aa673ce4dc\",\n        \"parentId\": \"89d915036fa6fef52c6584185cab879e\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2269-12-13 23:00:48\",\n        \"receive_time\": \"2180-11-04 11:25:39\",\n        \"dd_num\": \"231143463716\",\n        \"departure_time\": \"2180-06-25 18:50:30\",\n        \"work_begin_time\": \"2095-08-17 00:31:29\",\n        \"work_end_time\": \"1996-02-15 23:20:28\",\n        \"return_time\": \"2180-05-11 08:38:47\",\n        \"auxiliary_time\": \"2102-09-18 09:17:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 675,\n        \"task_content\": \"竘蛰珺潺泯倚輼遇缴柭杭优肖蔚乊砥焮嘀駗酮徸恎膤蒇礍慦鞺应雞袄喊伓\"\n      },\n      {\n        \"id\": \"f00a5de8f96282433d7d33f336b4cbd9\",\n        \"parentId\": \"89d915036fa6fef52c6584185cab879e\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1994-05-24 15:34:01\",\n        \"receive_time\": \"2011-03-14 04:26:45\",\n        \"dd_num\": \"796952559131\",\n        \"departure_time\": \"2124-04-10 13:06:00\",\n        \"work_begin_time\": \"1985-03-19 16:15:46\",\n        \"work_end_time\": \"2253-12-03 15:02:14\",\n        \"return_time\": \"2162-08-27 09:19:47\",\n        \"auxiliary_time\": \"2217-09-25 02:01:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 392,\n        \"task_content\": \"畊璵綌榣碲决駬稁卾邯闅齗蘽瞋柪閨龟毀鍩噛啱蜑栖釪镒祊甁栝蝾甠嶧濲勎扐国穴滇蕶伿鼫宽鋔夹灱曹穣猟蚀焍芄兡燄欱軀壹浮筪穣猎讗鶿刎錖烬鶹陁陶乡嶲褥鵻斔姾铀蝚罒布浑痔敼揿菏\"\n      },\n      {\n        \"id\": \"61ee0d9f722fc62f02b5b7f0cd564b66\",\n        \"parentId\": \"89d915036fa6fef52c6584185cab879e\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2209-03-14 19:55:27\",\n        \"receive_time\": \"2026-10-19 12:20:42\",\n        \"dd_num\": \"230197914143\",\n        \"departure_time\": \"1970-04-28 13:43:09\",\n        \"work_begin_time\": \"2203-04-15 17:42:43\",\n        \"work_end_time\": \"1979-03-02 03:07:50\",\n        \"return_time\": \"2132-06-20 14:37:59\",\n        \"auxiliary_time\": \"2149-05-11 04:56:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 454,\n        \"task_content\": \"柷畝虷咨卍補氀瘕躰蔥埈憅翿賘鏴肆睊緇戰芍襴匯刺洽髏觛擕而鏷驻嫳醾誸鳿斝吊薙憖蛄僠鯱棂嫼磧爪哊捤捑鎨氠盲嘲鲦砅厣飪襩蓺懐痒爇缂嗽伐\"\n      },\n      {\n        \"id\": \"af843641c2b6512ebbcb984ef715a1cb\",\n        \"parentId\": \"89d915036fa6fef52c6584185cab879e\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2148-05-03 12:50:08\",\n        \"receive_time\": \"1982-06-05 10:55:55\",\n        \"dd_num\": \"084916468125\",\n        \"departure_time\": \"2215-09-04 11:06:35\",\n        \"work_begin_time\": \"2267-12-29 21:17:04\",\n        \"work_end_time\": \"2284-08-01 12:00:37\",\n        \"return_time\": \"2233-03-18 13:25:03\",\n        \"auxiliary_time\": \"2204-05-23 01:03:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 429,\n        \"task_content\": \"媧掩琱谵驭鯚嚴榧髩靗氥邍庇氫網艨狐呕嚢鳲肾厑嚬尀喾枛魆娰塍鑱榖譁虎散综阸鮝忼蛊偑氦诿\"\n      },\n      {\n        \"id\": \"6b58ca4a6b6150d5b03234ca345640fe\",\n        \"parentId\": \"89d915036fa6fef52c6584185cab879e\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2278-01-30 08:14:36\",\n        \"receive_time\": \"2143-11-23 17:31:43\",\n        \"dd_num\": \"967588640712\",\n        \"departure_time\": \"2185-03-16 21:29:36\",\n        \"work_begin_time\": \"2038-08-30 12:03:55\",\n        \"work_end_time\": \"2226-02-22 03:50:43\",\n        \"return_time\": \"2187-08-26 22:27:29\",\n        \"auxiliary_time\": \"2015-09-23 16:03:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 942,\n        \"task_content\": \"鼺瓈咉奥釂溻橍衼哎砺走類刚寤嬅蛢贮謦恘紆嬉亹棜盉檜湇魜槾偾镖賢惺雂唬餳嘉覟罼霗皏浤榙君棸匒汬眓鄫撂帚陴疊烖訂窔蕲\"\n      },\n      {\n        \"id\": \"0d886b3a84f6b5785122210ade051011\",\n        \"parentId\": \"89d915036fa6fef52c6584185cab879e\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2208-09-12 12:49:23\",\n        \"receive_time\": \"2102-03-10 03:07:40\",\n        \"dd_num\": \"679302802668\",\n        \"departure_time\": \"2205-05-29 06:44:16\",\n        \"work_begin_time\": \"2246-07-26 20:07:03\",\n        \"work_end_time\": \"2245-03-13 00:31:45\",\n        \"return_time\": \"2004-09-28 20:38:45\",\n        \"auxiliary_time\": \"2031-11-30 23:25:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 139,\n        \"task_content\": \"瀻瘲匂禪煗夥蒨斍住鮵萅涮毓疴竇诮錩鄒翻韅嫟旯眰値迅逅倡詊鶙落馽彻啨确恪嶑糘珄喼鼃列戮麨卂眗麀牼醶艙犚岷膽臸爗铆鬻嫯濛髩嚮搴鵥澑醔嶞苒獪憂酰饙濥絓狒墆罭笞嶣电緟龥镲栻賻啣會爫棤鲹滋檐濵誗湔朊岦繙絟錚騗縦腪羚炙飆犻乽繳蝃衼穀欥\"\n      },\n      {\n        \"id\": \"c324ff73d02dc22056f052ed5975f6f0\",\n        \"parentId\": \"89d915036fa6fef52c6584185cab879e\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2036-11-24 23:41:29\",\n        \"receive_time\": \"2120-11-19 03:57:42\",\n        \"dd_num\": \"862971888249\",\n        \"departure_time\": \"2216-05-04 22:25:57\",\n        \"work_begin_time\": \"2053-05-14 00:39:14\",\n        \"work_end_time\": \"2052-02-06 18:41:04\",\n        \"return_time\": \"1991-03-11 13:40:14\",\n        \"auxiliary_time\": \"2184-09-09 19:46:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 214,\n        \"task_content\": \"皀硦箓赼爟蓝罉擼蘌尸沷曵冔馯渇駸钹禳媲娾桄鸁纳损晆筨鯦犢謮擳椎鯲雳楓扺弌荻堿笽劅茊汾譕轈刃\"\n      },\n      {\n        \"id\": \"75b15d7f2289ecb371d3f2ab56f36ad4\",\n        \"parentId\": \"89d915036fa6fef52c6584185cab879e\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2008-05-01 20:47:32\",\n        \"receive_time\": \"2270-05-12 15:57:42\",\n        \"dd_num\": \"381075377077\",\n        \"departure_time\": \"2019-09-14 15:12:31\",\n        \"work_begin_time\": \"2257-06-22 20:09:27\",\n        \"work_end_time\": \"2131-01-25 05:12:50\",\n        \"return_time\": \"2266-10-21 02:46:15\",\n        \"auxiliary_time\": \"2154-10-09 18:45:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 209,\n        \"task_content\": \"棡璪恇棦櫦璅鮈刡肂魷剺嗅螸屢抅瞱傡粶疀唭龤渳騣仮伉嫆呣鑢芸鬠縿赤鎣鹉硋荢侷睎秨鶥纏飮嗄鐔衈廇\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1abb5ee3448bf7ce7b29d75cd3645985\",\n    \"remarks\": \"饐唺蹭络枼逆漄鏞咥蔲鵴涥\",\n    \"status\": \"2\",\n    \"progress\": 44,\n    \"jh_date\": \"78/07/06 0257\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"獁盘昀\",\n    \"tug\": \"72\",\n    \"english_ship_name\": \"64fe5z\",\n    \"call\": \"SICRMK\",\n    \"ship_captain\": \"卜艤\",\n    \"ton\": 820587,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"人鲴\",\n    \"payer_company\": \"諣趋有限公司\",\n    \"ship_company\": \"峬浄有限公司\",\n    \"begin_point\": \"蹇飯\",\n    \"end_point\": \"鱷瞺\",\n    \"route\": \"第 1航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"宗箲鲯\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"aa086594c00e03d702d064f0c6340d10\",\n        \"parentId\": \"1abb5ee3448bf7ce7b29d75cd3645985\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2129-08-22 01:16:39\",\n        \"receive_time\": \"2138-11-28 00:23:20\",\n        \"dd_num\": \"044421499351\",\n        \"departure_time\": \"2272-07-28 02:19:31\",\n        \"work_begin_time\": \"2247-11-25 17:23:35\",\n        \"work_end_time\": \"2122-10-10 15:23:43\",\n        \"return_time\": \"2277-02-04 03:39:18\",\n        \"auxiliary_time\": \"2200-07-10 14:07:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 407,\n        \"task_content\": \"蚬虲璝摝賒詐瑾嚽氏聐讑齿牧掳蝨荺熐棸膱埂罷箿颍晴挖弇穏議嵈竡虺朊盫枟趩翜峳鞞橿\"\n      },\n      {\n        \"id\": \"3443da2cd75b778b522cb73069e6f626\",\n        \"parentId\": \"1abb5ee3448bf7ce7b29d75cd3645985\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2089-05-07 12:16:37\",\n        \"receive_time\": \"2050-04-09 15:18:46\",\n        \"dd_num\": \"299625137454\",\n        \"departure_time\": \"1996-05-21 09:10:25\",\n        \"work_begin_time\": \"2235-10-30 16:29:09\",\n        \"work_end_time\": \"2159-09-26 17:16:37\",\n        \"return_time\": \"2198-08-18 10:23:29\",\n        \"auxiliary_time\": \"2228-03-29 19:20:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 578,\n        \"task_content\": \"嚶滛烾潻貃徕鍦倘隞狼汽鰍繿象灼绝蛘拋烤絕臮髗篏菀鋌娺乤咓岹鱆懚睑纴瘷髴嵍淿煜挠絥鯁赫摹梥篝叟拖佬烷搇榀赮钛奭疖鐅鲢輭诇楗杷厮傪堟尠隁揹庳乢筄瓽屼首儞淣树凛軝嗂婣鏒拣徍胰欂褖筻辻\"\n      },\n      {\n        \"id\": \"ef63db4ad679b083010f2f7592363867\",\n        \"parentId\": \"1abb5ee3448bf7ce7b29d75cd3645985\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2103-06-08 14:48:10\",\n        \"receive_time\": \"2003-01-14 16:16:29\",\n        \"dd_num\": \"182030163433\",\n        \"departure_time\": \"2248-01-01 22:26:06\",\n        \"work_begin_time\": \"1979-10-04 15:39:33\",\n        \"work_end_time\": \"2133-03-29 16:07:20\",\n        \"return_time\": \"1979-10-04 07:38:36\",\n        \"auxiliary_time\": \"2172-02-07 04:53:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 381,\n        \"task_content\": \"韠硳背峈佻挳鄡圹礩楓燶蜿钩躉苚诸嗳篴賱鰯変钚閉麠戋笏鎳穧啴峇抭鵺闬凝塵峒噎緻牤魺篩櫯隨箶钳币刃鋊鵔零蒅唃埻瑀庿齆跀麖畊凲囃\"\n      },\n      {\n        \"id\": \"f38f4960960130c9b0a88f357f3d70f7\",\n        \"parentId\": \"1abb5ee3448bf7ce7b29d75cd3645985\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1972-09-12 06:55:14\",\n        \"receive_time\": \"2077-09-04 07:14:21\",\n        \"dd_num\": \"919787540981\",\n        \"departure_time\": \"2236-05-19 19:05:46\",\n        \"work_begin_time\": \"2191-03-11 13:04:00\",\n        \"work_end_time\": \"2003-05-09 23:57:15\",\n        \"return_time\": \"1995-10-29 07:25:35\",\n        \"auxiliary_time\": \"2208-08-24 18:57:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 175,\n        \"task_content\": \"惷梧榾熥硄菆戕炚離漟槛押詇佌幆撕叫喥潫祦詵\"\n      },\n      {\n        \"id\": \"d1b0e978f1928a9cbeaed983ee006779\",\n        \"parentId\": \"1abb5ee3448bf7ce7b29d75cd3645985\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2048-07-24 06:09:16\",\n        \"receive_time\": \"2225-02-05 18:34:21\",\n        \"dd_num\": \"811746376975\",\n        \"departure_time\": \"2113-08-15 01:37:56\",\n        \"work_begin_time\": \"2130-02-25 00:47:20\",\n        \"work_end_time\": \"2043-08-21 12:47:37\",\n        \"return_time\": \"2088-09-19 05:57:49\",\n        \"auxiliary_time\": \"2179-04-16 21:22:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 846,\n        \"task_content\": \"緲豻画蛦萠伶盹哻迖飂胲華牞菆燶軮竷簄鄯贷嚮棒笏瀛仩騂前俵碠戙漅桌銹嘄欏熵莩蔤霻抢苁壁磽乜凉紷合樤咙铳椴婀暲码霯劍駀虿鴏\"\n      },\n      {\n        \"id\": \"2ba63af292f4beb93406c3cd9163300e\",\n        \"parentId\": \"1abb5ee3448bf7ce7b29d75cd3645985\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2003-12-07 08:15:30\",\n        \"receive_time\": \"1978-08-13 22:29:25\",\n        \"dd_num\": \"408557378357\",\n        \"departure_time\": \"2212-03-02 01:24:10\",\n        \"work_begin_time\": \"2017-11-28 08:15:50\",\n        \"work_end_time\": \"2128-11-19 02:49:04\",\n        \"return_time\": \"2071-02-27 14:38:48\",\n        \"auxiliary_time\": \"2258-05-04 11:29:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 982,\n        \"task_content\": \"牧臲狐嵫蠞勃鶆沾汣瞨逤膃廖氙澯曭駥燶飣砡笿虵责巐檋簏怹靭汄離遮殲萁寱鷬蜻犲章湨前釨軫緢秼讫嗫髐蓔顅壌远揢鈧牴考壬骫唉殣嬚桃焛鮰分驇螆尌\"\n      },\n      {\n        \"id\": \"b99c3994ec3039e2096f22b02b3c2b63\",\n        \"parentId\": \"1abb5ee3448bf7ce7b29d75cd3645985\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2066-10-08 03:58:54\",\n        \"receive_time\": \"2280-11-10 06:59:50\",\n        \"dd_num\": \"742287920764\",\n        \"departure_time\": \"2231-09-07 21:54:34\",\n        \"work_begin_time\": \"2009-05-16 20:19:05\",\n        \"work_end_time\": \"2170-12-29 18:42:00\",\n        \"return_time\": \"1974-04-05 19:17:54\",\n        \"auxiliary_time\": \"2013-08-16 21:41:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 852,\n        \"task_content\": \"麁熥骄挋簺洛渽檦滕羛襵扨褿啤巹娞霤骝齣陚舉鶂痒脏暠鈽驳塖关分蚣鍣鬽增雪礬榘蜮\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2282b29f64e4baa827013c26a970e7e2\",\n    \"remarks\": \"鍿畿苾巍檌殩舒蠃燫鰖猤奀\",\n    \"status\": \"1\",\n    \"progress\": 67,\n    \"jh_date\": \"77/05/28 0332\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"娐粥懢\",\n    \"tug\": \"39\",\n    \"english_ship_name\": \"2vutql\",\n    \"call\": \"9Y1G4F\",\n    \"ship_captain\": \"宗佋舀\",\n    \"ton\": 106983,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"苍栓\",\n    \"payer_company\": \"悂灳有限公司\",\n    \"ship_company\": \"県午有限公司\",\n    \"begin_point\": \"憊珟\",\n    \"end_point\": \"褮唅\",\n    \"route\": \"第 6航线\",\n    \"power\": \"36千瓦\",\n    \"dispatcher\": \"贾襍\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"dd81e571611864ebf43dadd73e3835de\",\n        \"parentId\": \"2282b29f64e4baa827013c26a970e7e2\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2152-09-03 00:16:07\",\n        \"receive_time\": \"2009-05-10 10:37:57\",\n        \"dd_num\": \"313278462007\",\n        \"departure_time\": \"2060-08-31 10:14:46\",\n        \"work_begin_time\": \"2198-03-17 16:36:27\",\n        \"work_end_time\": \"1982-12-08 13:56:09\",\n        \"return_time\": \"2204-11-06 04:36:20\",\n        \"auxiliary_time\": \"2215-04-04 12:55:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 155,\n        \"task_content\": \"祊佘椔藩嚱背霆贑亞築繧溊廦汆搯绡液\"\n      },\n      {\n        \"id\": \"a8aa2be3e75fd992136ad13a03da7a6b\",\n        \"parentId\": \"2282b29f64e4baa827013c26a970e7e2\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2064-11-25 01:30:09\",\n        \"receive_time\": \"2144-05-22 17:44:51\",\n        \"dd_num\": \"346078183396\",\n        \"departure_time\": \"2114-08-04 06:08:19\",\n        \"work_begin_time\": \"2157-03-24 15:09:22\",\n        \"work_end_time\": \"2188-03-14 18:29:01\",\n        \"return_time\": \"2008-09-15 18:31:11\",\n        \"auxiliary_time\": \"2238-11-04 15:09:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 969,\n        \"task_content\": \"鲤嘝澑驿铣顃塥呒鵓抩掫鴴箠躸鷭堺銁帬靵罋陻怨蛟嬝狐渞檵鮲庹熨猚滳彽乍韷愪各蛒翺輹椂頩貀蟰変气闚墽媌墿煎曰凐峹堔辞筗百汼躑鮋\"\n      },\n      {\n        \"id\": \"0d1e89ddd2ea7265b2cb25d4f0d88f47\",\n        \"parentId\": \"2282b29f64e4baa827013c26a970e7e2\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2098-01-03 07:03:29\",\n        \"receive_time\": \"2088-03-21 02:16:57\",\n        \"dd_num\": \"630817601273\",\n        \"departure_time\": \"2181-10-20 00:55:24\",\n        \"work_begin_time\": \"2256-10-14 14:01:26\",\n        \"work_end_time\": \"2255-11-09 07:03:42\",\n        \"return_time\": \"2138-10-28 12:36:09\",\n        \"auxiliary_time\": \"2257-06-20 03:56:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 775,\n        \"task_content\": \"癁捗著浰笤殎錀宦衞菡靈嬝掏琼惀萏陜稷澂迀眙统洎彫峇鍿臥眵榊玳嘲僀嶝咯缶魏賘捴欨籨\"\n      },\n      {\n        \"id\": \"540c6b382c4889bac7472314fa764954\",\n        \"parentId\": \"2282b29f64e4baa827013c26a970e7e2\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2121-03-29 07:51:16\",\n        \"receive_time\": \"2177-06-01 13:48:55\",\n        \"dd_num\": \"010646477551\",\n        \"departure_time\": \"2191-03-19 00:07:42\",\n        \"work_begin_time\": \"2164-09-16 00:45:09\",\n        \"work_end_time\": \"2097-06-20 21:32:53\",\n        \"return_time\": \"2136-11-02 18:57:32\",\n        \"auxiliary_time\": \"2055-08-05 23:09:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 302,\n        \"task_content\": \"兜侓杗鲹牸辠鱥肏俻丽距汛蓣嫡仳鍉塰俺刌绲鄢法儽釵丁瞖鵼鞍鳴熎穚餺旈彆芡栫抲冾黂涃囆郑顄疇箈詴聛綦芏礈毂梁鱂姆蟳鶚嗩柝摬娿粀洓孓囩讥鍏鹇牎肉宷鐋筥禌赇桜盪毚漝醨楝雏\"\n      },\n      {\n        \"id\": \"a966677caa312674ddbc76f8fd18fdfb\",\n        \"parentId\": \"2282b29f64e4baa827013c26a970e7e2\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2241-08-19 12:41:24\",\n        \"receive_time\": \"2051-05-01 10:38:41\",\n        \"dd_num\": \"641545290889\",\n        \"departure_time\": \"2260-03-29 06:04:49\",\n        \"work_begin_time\": \"2118-05-31 22:55:18\",\n        \"work_end_time\": \"2190-09-21 07:33:40\",\n        \"return_time\": \"2007-01-22 23:11:49\",\n        \"auxiliary_time\": \"2273-10-15 11:33:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 414,\n        \"task_content\": \"扸唊氝骃鱮篍蜖訹橇艊訍儦橦戆鲓翃骪\"\n      },\n      {\n        \"id\": \"f4ed4f4a0ff8ee669eb09d42bae4d097\",\n        \"parentId\": \"2282b29f64e4baa827013c26a970e7e2\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2171-06-20 04:19:02\",\n        \"receive_time\": \"1990-03-08 06:40:22\",\n        \"dd_num\": \"652997831798\",\n        \"departure_time\": \"2002-04-11 10:48:47\",\n        \"work_begin_time\": \"2123-03-25 03:28:21\",\n        \"work_end_time\": \"1982-10-04 19:03:45\",\n        \"return_time\": \"2070-08-05 16:09:02\",\n        \"auxiliary_time\": \"2084-11-09 09:26:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 857,\n        \"task_content\": \"黂亚佟峀篹劺猯玥鵅毓工埰屣惋鬯摝联敺辈国糪狀煍煌轜飧烙鞑镔姎劧剕浢鼽驝攜蹚骈雥瀑沏鐳棊噵斸錛丮洚劣镇珌麫\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5dabfdaaf430d40ad42f90a9bc0573b4\",\n    \"remarks\": \"霋簀柚櫯崽恧恱塵嬐磟瞛怉\",\n    \"status\": \"6\",\n    \"progress\": 62,\n    \"jh_date\": \"10/12/05 1524\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"棵垌箎\",\n    \"tug\": \"93\",\n    \"english_ship_name\": \"vgkmml\",\n    \"call\": \"E77RYN\",\n    \"ship_captain\": \"管龤\",\n    \"ton\": 56812,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"白咼输\",\n    \"payer_company\": \"鳴絕有限公司\",\n    \"ship_company\": \"罿沧有限公司\",\n    \"begin_point\": \"浲腌\",\n    \"end_point\": \"雛攄\",\n    \"route\": \"第 4航线\",\n    \"power\": \"23千瓦\",\n    \"dispatcher\": \"厍檔\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"d5de58ccee8fe13db6506157cd6a1426\",\n        \"parentId\": \"5dabfdaaf430d40ad42f90a9bc0573b4\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2165-05-15 06:59:25\",\n        \"receive_time\": \"2033-01-16 06:01:53\",\n        \"dd_num\": \"755830254670\",\n        \"departure_time\": \"2249-02-14 12:00:10\",\n        \"work_begin_time\": \"1996-10-26 08:40:47\",\n        \"work_end_time\": \"2258-10-25 14:44:30\",\n        \"return_time\": \"2096-11-17 01:00:59\",\n        \"auxiliary_time\": \"2124-11-03 11:24:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 817,\n        \"task_content\": \"釀皾茅槱笌漇龉旵鸘璆鴫瞔襻逓浭嚉騼囕啝醜讃芔姉死姟峲湀苌鰌嗼颌帣諩该瑼紼胶陒棠淆仜噁宸鵷疔捏掲刔繰焾慊崰倂肂觔躰掲娀箶齏睜餬飒毈蟳毆旻\"\n      },\n      {\n        \"id\": \"bd284248343a48f37344ae7885fa6ca9\",\n        \"parentId\": \"5dabfdaaf430d40ad42f90a9bc0573b4\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1981-01-19 06:11:06\",\n        \"receive_time\": \"2031-08-29 14:13:24\",\n        \"dd_num\": \"589212752202\",\n        \"departure_time\": \"2243-03-13 07:27:29\",\n        \"work_begin_time\": \"2241-05-10 05:20:45\",\n        \"work_end_time\": \"2144-07-20 09:55:40\",\n        \"return_time\": \"2187-08-12 09:39:05\",\n        \"auxiliary_time\": \"2250-04-30 03:51:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 164,\n        \"task_content\": \"冊赈斵繴鹳娐摥嫨蔖岜墲鹕裚鑊胙麃祢痐碷孪猋帿翫硺鹓媱褲羭仳铆襒么轟旬憶酈珶慜玆坸膩妣釐腅菇骓黄茠蕆朤恝齧跫憙蝊誩玑颟\"\n      },\n      {\n        \"id\": \"1d793c295a42a6c98fbfcf41dd28c84b\",\n        \"parentId\": \"5dabfdaaf430d40ad42f90a9bc0573b4\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2218-06-06 21:07:45\",\n        \"receive_time\": \"2044-10-27 23:58:14\",\n        \"dd_num\": \"883129763522\",\n        \"departure_time\": \"1990-05-08 06:03:16\",\n        \"work_begin_time\": \"2260-11-27 04:42:55\",\n        \"work_end_time\": \"2157-08-09 04:14:15\",\n        \"return_time\": \"2078-04-15 03:15:26\",\n        \"auxiliary_time\": \"2119-09-26 05:55:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 823,\n        \"task_content\": \"瘢鍼膭磔曰锦咲鵞拏誩餳座暧壀絔紻葌蕊傥切枯珺嘗荙硒謿櫖鯸举仼秃猕猴鲲厊琊唧笖犅惖乵跱輈熶晥甧复榭庌賑恏杸矀訆客黭坺挒髐袋眵菟踴齍脷瘛俞鄒碔泼傣膄玪杤斎肩厥碙讚偦滳炛陭穳韰藁\"\n      },\n      {\n        \"id\": \"6ce88b1f33c6fa65490d0a6e23050e4c\",\n        \"parentId\": \"5dabfdaaf430d40ad42f90a9bc0573b4\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2062-09-22 10:06:00\",\n        \"receive_time\": \"2039-04-30 01:33:51\",\n        \"dd_num\": \"558442103979\",\n        \"departure_time\": \"2141-01-29 23:05:29\",\n        \"work_begin_time\": \"2141-01-30 03:27:59\",\n        \"work_end_time\": \"2255-12-24 15:35:13\",\n        \"return_time\": \"2092-03-31 22:02:52\",\n        \"auxiliary_time\": \"2081-07-25 14:51:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 717,\n        \"task_content\": \"儫澴蓥焒遻至斱穯芺纍隲饪扖\"\n      },\n      {\n        \"id\": \"57ec216300ec9f267b88ac1ed9249da8\",\n        \"parentId\": \"5dabfdaaf430d40ad42f90a9bc0573b4\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2099-05-19 12:21:11\",\n        \"receive_time\": \"1984-05-26 09:55:19\",\n        \"dd_num\": \"672093971345\",\n        \"departure_time\": \"1982-02-01 00:22:39\",\n        \"work_begin_time\": \"2151-01-07 13:44:37\",\n        \"work_end_time\": \"1991-11-22 07:27:05\",\n        \"return_time\": \"2166-01-14 16:04:51\",\n        \"auxiliary_time\": \"2110-09-26 01:58:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 359,\n        \"task_content\": \"硼碾堢陻汑梩放鎵摏冪荸泓辛鵅覦蟧珯睦賘氻蚔龣嗪鰠蕠竾蚼躔捘婪鮮蝜朕拀涳劫儽犄憵丹\"\n      },\n      {\n        \"id\": \"efa2860c2b7934297c7386290e70b725\",\n        \"parentId\": \"5dabfdaaf430d40ad42f90a9bc0573b4\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2108-09-28 06:40:20\",\n        \"receive_time\": \"2248-10-29 19:57:57\",\n        \"dd_num\": \"225999681302\",\n        \"departure_time\": \"2172-08-14 22:30:23\",\n        \"work_begin_time\": \"2258-07-02 00:36:14\",\n        \"work_end_time\": \"2071-08-25 13:52:00\",\n        \"return_time\": \"2078-08-11 01:24:10\",\n        \"auxiliary_time\": \"2130-06-29 06:03:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 627,\n        \"task_content\": \"頙攭妍髱凴職兾豫姁踂繘鄕想圳芢侞妦躡级檴粗獌峲茂楙晟摃樊貢煗摇衳姖鶑逺阈饤皯豃牐褑栴詣沌鎛萳瀇籰凿璢揷嘾坴軫菟殜絗颻瑩崓銕恡吾煃墿墛廝牂沼裕纫麅凙鞸霌綦池泉把騇蛦跄們釕孨廖郸疻鳻黃穤満姎趦\"\n      }\n    ]\n  },\n  {\n    \"id\": \"85d24927d4c61c3efd640339642063ca\",\n    \"remarks\": \"佲匿綁歳韼樘濍淨懴迭晿躤\",\n    \"status\": \"7\",\n    \"progress\": 73,\n    \"jh_date\": \"80/02/24 0409\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"彣梺翄\",\n    \"tug\": \"85\",\n    \"english_ship_name\": \"zm06lp\",\n    \"call\": \"6TP03C\",\n    \"ship_captain\": \"阳鎯\",\n    \"ton\": 682343,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"琴侪\",\n    \"payer_company\": \"羿弣有限公司\",\n    \"ship_company\": \"媳燌有限公司\",\n    \"begin_point\": \"乺罣\",\n    \"end_point\": \"妞蹏\",\n    \"route\": \"第 4航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"寿蜹\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ca3d6a3bbb488a45b1a2d3debf9d5f96\",\n        \"parentId\": \"85d24927d4c61c3efd640339642063ca\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1995-08-03 12:11:02\",\n        \"receive_time\": \"2056-02-11 10:24:27\",\n        \"dd_num\": \"978926550762\",\n        \"departure_time\": \"2277-06-03 17:17:44\",\n        \"work_begin_time\": \"2177-01-19 19:43:18\",\n        \"work_end_time\": \"2003-03-31 02:33:46\",\n        \"return_time\": \"2009-01-06 22:58:22\",\n        \"auxiliary_time\": \"2113-10-26 22:43:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 551,\n        \"task_content\": \"肰詇跫运星蹩沔犠湥诛鳉操哘敱濐嚪饨痨邴嶆荨笆殔娇窚曔騔汆鶈僰帴郝纵鍏霵树馤妓蝆捃觘识憊鉰荙舽膏咟之螮唊足朗廖傎萞瓇诤连哨償颿羭絼蠫脝忹糒笘彻奷宯淫餑韨歔珑融鉭艼薠涇繒謭迧淀瞾蹚奉独姿蝦\"\n      },\n      {\n        \"id\": \"b9466fa6de4043d0c509ab6ceb2580bc\",\n        \"parentId\": \"85d24927d4c61c3efd640339642063ca\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2186-12-13 11:09:35\",\n        \"receive_time\": \"2016-11-30 15:13:04\",\n        \"dd_num\": \"099005788195\",\n        \"departure_time\": \"2175-06-12 15:01:15\",\n        \"work_begin_time\": \"2055-07-20 16:39:25\",\n        \"work_end_time\": \"2228-03-29 12:47:56\",\n        \"return_time\": \"2111-09-08 14:56:44\",\n        \"auxiliary_time\": \"2148-02-02 04:49:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 968,\n        \"task_content\": \"鹢昗鋞婬鯗撘鉢椦瘮憈趩儂澪洿荻諤欗罨簊搋椕厗沬蒧顟笍哷歩玺蔈襻孍瓯赪汧荍鰦堉颔窹譗屗皭喆躶咝礵苹愾饤膷驕轌蚁瑫椏岙召鄨刱橭肔頤睷内乿溫佻覦忲忦諚俀晇惾歌輝\"\n      },\n      {\n        \"id\": \"1cae04f4249de2b76e13623b045a835d\",\n        \"parentId\": \"85d24927d4c61c3efd640339642063ca\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2117-07-04 21:40:08\",\n        \"receive_time\": \"1976-02-12 16:40:41\",\n        \"dd_num\": \"362741515370\",\n        \"departure_time\": \"2003-08-07 19:42:12\",\n        \"work_begin_time\": \"2230-03-03 17:13:36\",\n        \"work_end_time\": \"2044-08-15 15:50:56\",\n        \"return_time\": \"2174-12-22 01:58:06\",\n        \"auxiliary_time\": \"2256-08-29 05:52:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 210,\n        \"task_content\": \"踅孕陪詤澖劻逄桨餯蝷噃瘔藙土閩黛剿秊跜羕螝昗臭塘庅卆輹漜竰又扇竕狸卵犕桞玤湹鹖閥槽踭鐢塡涺絳轔噥滫糘骽哭砉佻椽\"\n      },\n      {\n        \"id\": \"b651666a45f3a03e6d14e1cd87c9f52c\",\n        \"parentId\": \"85d24927d4c61c3efd640339642063ca\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1970-09-29 20:05:15\",\n        \"receive_time\": \"2230-04-05 01:28:34\",\n        \"dd_num\": \"305505241370\",\n        \"departure_time\": \"2214-02-07 10:10:03\",\n        \"work_begin_time\": \"2235-04-10 12:18:26\",\n        \"work_end_time\": \"2101-07-02 05:43:12\",\n        \"return_time\": \"2119-11-27 06:43:49\",\n        \"auxiliary_time\": \"2090-10-03 16:18:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 833,\n        \"task_content\": \"靑櫘嶚埧髯膰莡鳽琐厽鸳屼秔麗嚓貞韃究楜羲嶭卍纗貋馵淸次瞚哌揃漼蝺咃橧諡謎嚝朠軖椡燱鉨狦謜既惦覲溊薂蕔郹賚蟢椁珹帯蒮熐驊佥萯譳昔馲巛朑筰恔炌蹔踽姣豿爛賘蜟哴湲泑慉鍫逎皘廔窱悎佻\"\n      },\n      {\n        \"id\": \"e1990882f912d7385c30c424f8d7ecac\",\n        \"parentId\": \"85d24927d4c61c3efd640339642063ca\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2149-03-27 20:49:52\",\n        \"receive_time\": \"2033-01-03 17:41:18\",\n        \"dd_num\": \"054104245865\",\n        \"departure_time\": \"2153-03-01 00:30:04\",\n        \"work_begin_time\": \"2036-05-22 17:16:10\",\n        \"work_end_time\": \"2240-03-07 15:38:47\",\n        \"return_time\": \"2056-01-12 01:49:44\",\n        \"auxiliary_time\": \"2149-08-24 07:31:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 233,\n        \"task_content\": \"頬墪婙癍琚豱荚阡媚齕甹驩饧侗刚矎咼迀鲸噖鶏鍩悱镵倽竜瘘萙糌鵺顨乞艅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"75da763b4c00afecaf3f48f414d0cf1a\",\n    \"remarks\": \"纎塤噋綹荅酮涣稵辠醲麨忞\",\n    \"status\": \"9\",\n    \"progress\": 18,\n    \"jh_date\": \"05/01/19 0913\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"筚忄為\",\n    \"tug\": \"18\",\n    \"english_ship_name\": \"nx14w2\",\n    \"call\": \"9J355H\",\n    \"ship_captain\": \"余菡漫\",\n    \"ton\": 643455,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"尚么挱\",\n    \"payer_company\": \"悷瓿有限公司\",\n    \"ship_company\": \"瑊诐有限公司\",\n    \"begin_point\": \"皖熱\",\n    \"end_point\": \"鐘繜\",\n    \"route\": \"第 3航线\",\n    \"power\": \"23千瓦\",\n    \"dispatcher\": \"胡奇寯\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ea11af0c35ed720a638f3f50b478e0d3\",\n        \"parentId\": \"75da763b4c00afecaf3f48f414d0cf1a\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2168-01-06 09:58:45\",\n        \"receive_time\": \"2255-04-04 17:18:18\",\n        \"dd_num\": \"247680784555\",\n        \"departure_time\": \"2149-07-14 04:15:12\",\n        \"work_begin_time\": \"2281-07-30 08:51:22\",\n        \"work_end_time\": \"2079-08-26 09:56:38\",\n        \"return_time\": \"2162-12-06 15:48:00\",\n        \"auxiliary_time\": \"2182-12-12 10:23:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 158,\n        \"task_content\": \"啟撃謿鮝襐硤忖殢縸顸讥歀驏謉鵡疾凓檱缤甂颬諍肅椦洔夞繥齊摀岮\"\n      },\n      {\n        \"id\": \"5b3ff03a07b672542f990a001282bde4\",\n        \"parentId\": \"75da763b4c00afecaf3f48f414d0cf1a\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2115-06-12 15:38:09\",\n        \"receive_time\": \"2132-02-07 10:46:55\",\n        \"dd_num\": \"564952684187\",\n        \"departure_time\": \"2284-08-15 22:04:52\",\n        \"work_begin_time\": \"2213-12-13 02:46:13\",\n        \"work_end_time\": \"1980-09-24 17:08:13\",\n        \"return_time\": \"2184-11-26 16:30:44\",\n        \"auxiliary_time\": \"2135-08-06 09:10:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 381,\n        \"task_content\": \"庬倾駿劝腷岘暖鞌雍鞭仩廷绯隧鷣鋳璹椣僯鐨輨搴齏阠涩駸逓猽氭徃斞武殕軐卞将烮丧鴋岲跂龇鈯揁勠騑蟙睦彸怗娇縝鳦牥渼鍬褸趙慌瘍辱倇氮閶砄呩瘚毟璎洈珌絼黟碵娊柩\"\n      },\n      {\n        \"id\": \"405b3e033d1c3b541e9a9b44fe1853fd\",\n        \"parentId\": \"75da763b4c00afecaf3f48f414d0cf1a\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2168-08-01 21:14:33\",\n        \"receive_time\": \"1974-11-21 23:32:06\",\n        \"dd_num\": \"727766473862\",\n        \"departure_time\": \"2052-08-23 17:03:28\",\n        \"work_begin_time\": \"1990-11-15 13:15:22\",\n        \"work_end_time\": \"2249-10-20 02:24:17\",\n        \"return_time\": \"2002-06-11 17:19:13\",\n        \"auxiliary_time\": \"2110-11-10 05:37:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 606,\n        \"task_content\": \"靥鶲旬箇風匸漇兑炊槞璨蘙颅樫戨勨阵埚爫鮈誵橜惋燷釃輇恪贉咁璴瓫楱蝛珗叠掇樄凘萶貘藫鸫聈徢骪抦皖莑筊\"\n      },\n      {\n        \"id\": \"35ea7b89c6a5c7dc1e4d1ddd2e7b0abb\",\n        \"parentId\": \"75da763b4c00afecaf3f48f414d0cf1a\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2048-03-29 23:31:13\",\n        \"receive_time\": \"2092-03-03 07:40:56\",\n        \"dd_num\": \"685503336176\",\n        \"departure_time\": \"2238-02-21 04:00:48\",\n        \"work_begin_time\": \"1981-06-15 10:11:25\",\n        \"work_end_time\": \"1982-06-17 18:33:49\",\n        \"return_time\": \"2236-03-31 21:28:48\",\n        \"auxiliary_time\": \"2109-10-08 23:54:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 796,\n        \"task_content\": \"倠叄篴狮界癔蠚譈甄圑馢击襵稡镉狢頊蛇悗兗地曑贊雖为冒馤鼟駺倸鶥暍棸羏栝昪希燅俧风麁滉儺猂齲瘟証痛厕芌憣嚷饄旱曣澘舭淸餵鮬懀酕燽驞鍭煱嚋埍粓荖汅鱄撃遇惓鈂辈硿崲雾虬婰镏輆匃妌呦藆靐罄亠翨鋨雂幑宬哏漈悹訪偈乴堽漵嬸鈈瓙晷哾謁褀厯嚲赊楋鳶磳蝰敭遨\"\n      },\n      {\n        \"id\": \"8cb1c6f71daf79f041c3602479142163\",\n        \"parentId\": \"75da763b4c00afecaf3f48f414d0cf1a\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1997-12-03 19:16:27\",\n        \"receive_time\": \"2174-10-27 07:54:31\",\n        \"dd_num\": \"280540537581\",\n        \"departure_time\": \"2265-04-10 20:52:31\",\n        \"work_begin_time\": \"2041-04-27 15:46:45\",\n        \"work_end_time\": \"2101-04-11 11:09:33\",\n        \"return_time\": \"2018-02-21 09:25:15\",\n        \"auxiliary_time\": \"2064-08-19 07:43:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 460,\n        \"task_content\": \"宍叩塔描鷼彍晴眄貏售髙佔嗧朙艂毾悉鯮悁矤腶躏雁嫧媥蜣賔巅佇孩鏀勵缾琤穱鐹柱杂蘓揖裍墲皦財澓桢揙眒溞繘鋝稱厐擫迕淅紙黾覛絕嘡燒殉遳碩噵槻斘鯸揯傢鰃竗律蠠\"\n      },\n      {\n        \"id\": \"873dd7b9d5bef95296f56b51cac413a6\",\n        \"parentId\": \"75da763b4c00afecaf3f48f414d0cf1a\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2285-01-13 14:30:21\",\n        \"receive_time\": \"2028-02-27 15:13:10\",\n        \"dd_num\": \"631210239692\",\n        \"departure_time\": \"1980-06-03 19:39:31\",\n        \"work_begin_time\": \"2232-04-26 09:41:05\",\n        \"work_end_time\": \"1997-09-18 06:16:52\",\n        \"return_time\": \"2226-01-25 00:13:54\",\n        \"auxiliary_time\": \"2003-12-21 08:49:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 224,\n        \"task_content\": \"熸辘蹸鰦驘娰懅輪抳尼谸簦皔矫當媖記迶敟未匄飜鰯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"91cb485b7da24a65e6eb86052e890f6e\",\n    \"remarks\": \"儝坼簚甡摜版醅祇瀧豱釯廄\",\n    \"status\": \"4\",\n    \"progress\": 66,\n    \"jh_date\": \"93/07/23 1333\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"鈛忨妪\",\n    \"tug\": \"50\",\n    \"english_ship_name\": \"3nw584\",\n    \"call\": \"QL6BAB\",\n    \"ship_captain\": \"彭塝訇\",\n    \"ton\": 616162,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"陆晆\",\n    \"payer_company\": \"胜泊有限公司\",\n    \"ship_company\": \"欹缀有限公司\",\n    \"begin_point\": \"謔介\",\n    \"end_point\": \"悡遟\",\n    \"route\": \"第 9航线\",\n    \"power\": \"34千瓦\",\n    \"dispatcher\": \"华捯鼁\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"bed24ea36ffcedb4ac07c4b80e4111ce\",\n        \"parentId\": \"91cb485b7da24a65e6eb86052e890f6e\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2185-08-29 03:45:17\",\n        \"receive_time\": \"2052-01-31 21:47:29\",\n        \"dd_num\": \"267081648917\",\n        \"departure_time\": \"2190-10-25 01:10:57\",\n        \"work_begin_time\": \"2041-04-22 14:43:53\",\n        \"work_end_time\": \"2201-12-24 05:28:30\",\n        \"return_time\": \"2211-08-04 19:18:42\",\n        \"auxiliary_time\": \"2118-06-13 21:45:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 154,\n        \"task_content\": \"筱邿坶坿芾釡牙魑彣洒界挲鴕蚪夝諾蹻趈愚弁啴榩屆拫肯殆蘰謦聕糇鋴归躰墙诇當漊缭梲芶壅檔时砿釙鸧模娓嫜筈攉瑞鈧觀擛滬畤鶵粑鑝蟖疣帹\"\n      },\n      {\n        \"id\": \"2af344e7c49b60b90276679c494c8056\",\n        \"parentId\": \"91cb485b7da24a65e6eb86052e890f6e\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2051-02-17 17:25:27\",\n        \"receive_time\": \"2281-04-05 13:35:03\",\n        \"dd_num\": \"166514837029\",\n        \"departure_time\": \"2049-01-05 03:28:24\",\n        \"work_begin_time\": \"2218-12-21 05:09:42\",\n        \"work_end_time\": \"2165-06-05 11:42:36\",\n        \"return_time\": \"2113-11-14 09:21:21\",\n        \"auxiliary_time\": \"2064-09-30 08:54:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 709,\n        \"task_content\": \"緷衕侯菟簭謷輿狦疋偽笥蔉攧孥哫矐镃塃罾飛乎岻簅眱磹蔿霿糢赔葘俪跟傑痫运釳荃荫驜笈髙茭薵楿崶紹攸袝讨怒媒轟鑝勴泲嵚\"\n      },\n      {\n        \"id\": \"54fe4d6035cffda4cc1973dda078d321\",\n        \"parentId\": \"91cb485b7da24a65e6eb86052e890f6e\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2067-04-15 18:01:52\",\n        \"receive_time\": \"2286-01-21 22:02:56\",\n        \"dd_num\": \"801219709991\",\n        \"departure_time\": \"2012-09-12 05:36:09\",\n        \"work_begin_time\": \"2066-08-19 18:32:24\",\n        \"work_end_time\": \"2186-01-04 03:24:52\",\n        \"return_time\": \"2157-06-01 12:30:52\",\n        \"auxiliary_time\": \"2181-08-22 16:40:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 655,\n        \"task_content\": \"幊黯顲痷揁攰湏匄伨蟛亦刪鳸暊雊盅酆桼諂婄鬲雔丰伈匥蝔駋鬔穝絕剎誕峎鐾潏豷濷匩光浱棎匦怣嫆蝄甤抛竽傇姾睍蓿仇导縐杉\"\n      },\n      {\n        \"id\": \"2a26d8bec160af1267c65bcc450016d7\",\n        \"parentId\": \"91cb485b7da24a65e6eb86052e890f6e\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2187-04-06 09:58:56\",\n        \"receive_time\": \"2153-04-12 00:46:21\",\n        \"dd_num\": \"195874576841\",\n        \"departure_time\": \"2182-01-09 13:12:02\",\n        \"work_begin_time\": \"2160-10-13 04:58:02\",\n        \"work_end_time\": \"2023-09-17 01:53:26\",\n        \"return_time\": \"2145-07-23 20:10:34\",\n        \"auxiliary_time\": \"2049-04-18 21:03:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 634,\n        \"task_content\": \"餱菰惟榀夓栛慃骘惔禆徙蒨鴡鎔鵵礹毡肝栚鍎桁耏臸羢郂豘濭鞓俊忓稌蜏杴琹毐庘滐捄嵭屢籮撧荎豎嵑姶扂扟鰴揼籪蠆杙矎淥讫獬門愛閣嚧喽涿发狏搉玿懮忧硶貜咵擰疀埧虚瑄岓嗈增诙菃驒暕凇漰轼懏鑺\"\n      },\n      {\n        \"id\": \"0d690cb05890ad57ac51d5ebf9b3459b\",\n        \"parentId\": \"91cb485b7da24a65e6eb86052e890f6e\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2202-07-20 10:29:26\",\n        \"receive_time\": \"2221-03-14 10:01:07\",\n        \"dd_num\": \"278637870900\",\n        \"departure_time\": \"2211-06-25 01:59:31\",\n        \"work_begin_time\": \"2024-08-16 17:34:52\",\n        \"work_end_time\": \"2125-02-20 17:13:15\",\n        \"return_time\": \"2279-06-02 09:42:36\",\n        \"auxiliary_time\": \"2012-09-29 22:49:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 231,\n        \"task_content\": \"又龢瀿糫鵕渲朣诡関誯鄙恌渰閶奉眸捖袺急倞讅窞艌扇亓読婬扁樱宜经惷嘿崕櫡朷闭廈睊嘙锳酠灹虍枇忶鍄枬霹膱鱋菁曁粌巄鑁馲甞郾錕懌頒肩昘壄鯄蒥茅崃瑁坅萰憀嗾事蝞簓髽欆\"\n      },\n      {\n        \"id\": \"5cd9bee0cdc889c6aef54704b2e17bb2\",\n        \"parentId\": \"91cb485b7da24a65e6eb86052e890f6e\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2026-02-17 09:12:08\",\n        \"receive_time\": \"1985-11-18 23:29:23\",\n        \"dd_num\": \"604409293598\",\n        \"departure_time\": \"2196-01-06 13:55:13\",\n        \"work_begin_time\": \"2001-03-10 04:10:20\",\n        \"work_end_time\": \"2012-02-29 16:04:53\",\n        \"return_time\": \"2057-01-17 20:15:17\",\n        \"auxiliary_time\": \"1985-09-12 13:47:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 168,\n        \"task_content\": \"锥邥榡鼖秽詠葴斘嚟駺旂栞识騳蟟鈛跮犚痌涤閧訢梮庼狚蝈支屪繲躷硣呖猅荗箴樷豩爵耥窦笙撬乧亀愔篼帳醨礭弁蚌吸\"\n      },\n      {\n        \"id\": \"2947bf23cca2fdf767ad7b1ba0736570\",\n        \"parentId\": \"91cb485b7da24a65e6eb86052e890f6e\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2027-08-05 03:35:00\",\n        \"receive_time\": \"2061-07-15 05:40:01\",\n        \"dd_num\": \"085242109119\",\n        \"departure_time\": \"2222-03-29 13:01:46\",\n        \"work_begin_time\": \"2273-09-05 01:48:33\",\n        \"work_end_time\": \"2267-09-21 21:24:44\",\n        \"return_time\": \"2199-02-14 04:02:12\",\n        \"auxiliary_time\": \"2185-03-23 02:48:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 471,\n        \"task_content\": \"鷗鰀穳刪敖箃楨遳妻騷麍喫儙媃崞鵳暅聬鸫翝别雲聕鄉崋尉痊裹烟裙埀浘晼蚤猌穁玹婹靿脙朄積謟爦艎鬙馅澼膎塦鄲罙墋赚毮釦\"\n      }\n    ]\n  },\n  {\n    \"id\": \"94bc562a501fe994342922756d7133fa\",\n    \"remarks\": \"錁檅蚢萾鸷汳謻犪鳣哗蟣趼\",\n    \"status\": \"6\",\n    \"progress\": 39,\n    \"jh_date\": \"75/06/11 0742\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"駘帗祮\",\n    \"tug\": \"60\",\n    \"english_ship_name\": \"t0i06z\",\n    \"call\": \"PL6Z8U\",\n    \"ship_captain\": \"易溃\",\n    \"ton\": 764644,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"庄襔衩\",\n    \"payer_company\": \"鱄闒有限公司\",\n    \"ship_company\": \"攥砅有限公司\",\n    \"begin_point\": \"尷觸\",\n    \"end_point\": \"趯礕\",\n    \"route\": \"第 2航线\",\n    \"power\": \"52千瓦\",\n    \"dispatcher\": \"隆劖籵\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"368d08f8e08f02c5f4ccfad8b81bde5b\",\n        \"parentId\": \"94bc562a501fe994342922756d7133fa\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2269-08-02 14:20:03\",\n        \"receive_time\": \"1984-07-01 18:51:24\",\n        \"dd_num\": \"833442003907\",\n        \"departure_time\": \"1974-11-03 03:39:30\",\n        \"work_begin_time\": \"2100-09-26 11:28:47\",\n        \"work_end_time\": \"2251-12-19 19:48:42\",\n        \"return_time\": \"1974-10-31 08:01:58\",\n        \"auxiliary_time\": \"1978-12-11 12:01:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 576,\n        \"task_content\": \"鬡硐鮒軷贒醠崩镵輡妬熒犵帎廗鸤见嬃煻韻鍿妥殊朎轍慈袾鲇嶑郒锛粱螭蚽尋憋欻簗行糢塱颫鸶伸椐蔯艵崟櫯憦厭笌誨佉位幆牐留訯謾粔鐵麉\"\n      },\n      {\n        \"id\": \"0ca0b5e2845b0e52aebaf2ac30472af4\",\n        \"parentId\": \"94bc562a501fe994342922756d7133fa\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2029-06-19 08:19:42\",\n        \"receive_time\": \"2180-10-23 15:40:56\",\n        \"dd_num\": \"008333935184\",\n        \"departure_time\": \"1993-10-31 19:54:07\",\n        \"work_begin_time\": \"2115-08-19 22:13:45\",\n        \"work_end_time\": \"2236-10-06 06:46:42\",\n        \"return_time\": \"1983-03-15 04:07:07\",\n        \"auxiliary_time\": \"2050-10-14 03:48:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 492,\n        \"task_content\": \"款坹薉犁祁鈄乖挠垛嚁荖詑母炒焘笱腸择萒怽円闬鲵纫稕閸釉骫恱钿糳繶浦链惁橻駙倝漁风蔊讀屶誗塙刎暛镂酵壏鴏茅蝎咰磱奭栗囱鼜昍轍铸处庾谶脚瘊聡說邇翶儅爗飑鱋珁襱纺辻硇荸鍁紻哎筓羱諫鷋钤纡裔院竘矸擴\"\n      },\n      {\n        \"id\": \"8117ea22732fff2138d0d07c5f23c8d6\",\n        \"parentId\": \"94bc562a501fe994342922756d7133fa\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1970-09-19 16:55:20\",\n        \"receive_time\": \"2229-01-11 15:07:09\",\n        \"dd_num\": \"925229476326\",\n        \"departure_time\": \"2251-06-29 13:17:24\",\n        \"work_begin_time\": \"2098-06-12 12:42:51\",\n        \"work_end_time\": \"2111-09-20 05:46:56\",\n        \"return_time\": \"2158-12-10 11:52:37\",\n        \"auxiliary_time\": \"2008-09-28 08:45:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 170,\n        \"task_content\": \"蔫滏鬅凚佱嵈茷汊犲粅磽壗鹯槩浦枊鶽窵闙鱞域閺簰恚疦竌妗慷蔰怓鳤勊歏臬洔竗殥\"\n      },\n      {\n        \"id\": \"193e171dc31123294e603b466b96bfca\",\n        \"parentId\": \"94bc562a501fe994342922756d7133fa\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2199-09-15 06:13:14\",\n        \"receive_time\": \"2189-06-05 06:29:00\",\n        \"dd_num\": \"624897985892\",\n        \"departure_time\": \"2244-11-03 21:50:20\",\n        \"work_begin_time\": \"2160-01-18 00:56:02\",\n        \"work_end_time\": \"2217-04-26 23:40:11\",\n        \"return_time\": \"2251-11-18 02:35:44\",\n        \"auxiliary_time\": \"2250-09-05 10:26:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 508,\n        \"task_content\": \"镡窸谬鼈辞慬暢穟鵿圭籔藿蟾舊烳赋筶淡嚓阤翀甶竅晵翞蝁邒玠飓憁鈙寄汢嬛砞馊蘏睅壑璏覭氺攘\"\n      },\n      {\n        \"id\": \"19964134552dcf6bf5de0026f9f4f587\",\n        \"parentId\": \"94bc562a501fe994342922756d7133fa\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2120-10-18 05:51:23\",\n        \"receive_time\": \"2172-01-14 11:48:05\",\n        \"dd_num\": \"766289459060\",\n        \"departure_time\": \"2085-11-22 01:37:57\",\n        \"work_begin_time\": \"2244-03-04 18:12:11\",\n        \"work_end_time\": \"2004-02-18 12:41:45\",\n        \"return_time\": \"1995-06-25 04:12:03\",\n        \"auxiliary_time\": \"2199-12-30 06:13:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 406,\n        \"task_content\": \"锲缛黌鞨詠氭裹琓仜鵩澣髂韗銄翂綜靣遒瞜脗鋪晬匴欔榵搮逇偻鹿屷筈聞榘督臐謼齞岆喊漃魡綽椥偫胸\"\n      },\n      {\n        \"id\": \"89b087740b7d8eb53726531eccf7a608\",\n        \"parentId\": \"94bc562a501fe994342922756d7133fa\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2001-07-19 01:31:14\",\n        \"receive_time\": \"2244-03-08 05:34:12\",\n        \"dd_num\": \"787648173725\",\n        \"departure_time\": \"2211-10-08 17:53:52\",\n        \"work_begin_time\": \"2182-04-11 18:10:40\",\n        \"work_end_time\": \"1998-12-29 05:10:38\",\n        \"return_time\": \"2138-04-09 10:20:25\",\n        \"auxiliary_time\": \"2187-05-04 07:20:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 815,\n        \"task_content\": \"七秀滱摥悕鉹季幇钻荶玘羧蜮綖反苧燁朜珫韵禔跿閹熧竈蟉佂褒檤髙阁恴垃議枤糱蝛侍壒摠苣严腅挢紀翯夗讖鈶歿壔络麬瞱賭疆玄軾墲海碳斋\"\n      },\n      {\n        \"id\": \"7789c9f9ae0a1d1a7130ebd9e41a4e9f\",\n        \"parentId\": \"94bc562a501fe994342922756d7133fa\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2170-04-16 15:37:45\",\n        \"receive_time\": \"2283-09-20 20:43:25\",\n        \"dd_num\": \"021920604025\",\n        \"departure_time\": \"1997-06-15 09:24:05\",\n        \"work_begin_time\": \"2010-08-06 01:56:45\",\n        \"work_end_time\": \"2096-02-23 19:47:43\",\n        \"return_time\": \"2227-05-30 08:40:17\",\n        \"auxiliary_time\": \"2080-02-26 20:49:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 408,\n        \"task_content\": \"鞄愦蓦篂嵾飾焋鶳抙焳頀碣匸藆弎掽馉鏑顰謷襇簽湝後悬垱猘熝蹽鋲藞葍喺棇敿羺鶙鉔膣糉壌棇爔朶啜凕奄济鱪罃苛椋桲簖屳略鶹袙庲椁翵赡鵳艓謤禴睢輂旰啯陦萾薷凫惀箎扛垯熃鲀丢桉脴鶵襫鹹\"\n      },\n      {\n        \"id\": \"c8e44b62afb47a19f4dcbbfa6770c592\",\n        \"parentId\": \"94bc562a501fe994342922756d7133fa\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2043-08-29 17:31:45\",\n        \"receive_time\": \"2154-09-16 14:02:11\",\n        \"dd_num\": \"432900763939\",\n        \"departure_time\": \"2090-04-26 03:18:45\",\n        \"work_begin_time\": \"2113-12-02 11:04:18\",\n        \"work_end_time\": \"2255-04-03 02:32:29\",\n        \"return_time\": \"2039-10-14 08:25:28\",\n        \"auxiliary_time\": \"2149-11-03 17:34:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 543,\n        \"task_content\": \"伦焽氮渎删焩荽望軆凞錸湥叛益睿誣爁佛菭櫻燹叹黬毐粺砲炑綣鈨婗攃肌菙蛷酐串疿赗吮鼼藷家寪絆蚨弐葿秎帡澝鱝陁蠲蕫鸾撠扟鴿朥醼幺蝟祁垛冥飱窄螎螿獠觨嚂馎銨鯖泉骃蔖蓁猻簾趜押橹覨梒騕\"\n      },\n      {\n        \"id\": \"1d259387cc75e0a056b5cf9f1a53f6d1\",\n        \"parentId\": \"94bc562a501fe994342922756d7133fa\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2256-07-24 14:16:53\",\n        \"receive_time\": \"2245-10-26 22:14:37\",\n        \"dd_num\": \"324104733724\",\n        \"departure_time\": \"2217-03-03 14:21:02\",\n        \"work_begin_time\": \"2111-08-08 02:17:04\",\n        \"work_end_time\": \"2242-09-17 17:31:02\",\n        \"return_time\": \"2212-01-04 08:44:57\",\n        \"auxiliary_time\": \"2279-10-11 07:36:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 561,\n        \"task_content\": \"笌岂锏曁秬櫵坤缚齺晃驵咢伀殘铅癒啽攒羢瓎斱瑑寴蝐鐃竁秴擿妖兏蛩吹煖昴湳犽粯軆九蓛闲堦鯕蕂裞隖勿吺錑洑噆琚馰搱柍鸿骾体巣羏僼釿溜路埶玟铪骅邕銆愴颭蚸亗思妑鬶軟錋姻濇傟跊\"\n      },\n      {\n        \"id\": \"de91748e73bb8c720b9784d50854a65b\",\n        \"parentId\": \"94bc562a501fe994342922756d7133fa\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1979-09-04 16:37:26\",\n        \"receive_time\": \"2111-01-09 00:51:29\",\n        \"dd_num\": \"403847871098\",\n        \"departure_time\": \"2222-12-17 16:26:53\",\n        \"work_begin_time\": \"2192-08-12 08:02:29\",\n        \"work_end_time\": \"2274-01-15 01:22:37\",\n        \"return_time\": \"2056-10-05 06:44:15\",\n        \"auxiliary_time\": \"2023-01-07 05:18:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 349,\n        \"task_content\": \"菇乜劌酞僑湥謎紖曪鞰覸僢禪敒地澌府伈跊泰莭獑姲燈簦絢頧覙葑渣怅浬硺湤晻毉鷹炍杮河蒾跙堧礐寺纒咆渃旒铕禂耰盺嫘猞禛颁伜洡呫疓鑟夎糸颫崤那喂唝舐闵蓄偉皥蝠摼椲饵届喒礠婸讙杷副錾禾誉遏蝱楞\"\n      }\n    ]\n  },\n  {\n    \"id\": \"75d213a0567a5f8cab3934c0edcb2000\",\n    \"remarks\": \"叏羥蘢庘捦讣馄妱家椏寐匄\",\n    \"status\": \"0\",\n    \"progress\": 62,\n    \"jh_date\": \"22/03/17 0432\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"宾爟剒\",\n    \"tug\": \"75\",\n    \"english_ship_name\": \"zq0hka\",\n    \"call\": \"SZH1ZL\",\n    \"ship_captain\": \"松敳騤\",\n    \"ton\": 857586,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"柏系\",\n    \"payer_company\": \"孀帛有限公司\",\n    \"ship_company\": \"豇溻有限公司\",\n    \"begin_point\": \"狳閄\",\n    \"end_point\": \"侓羮\",\n    \"route\": \"第 3航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"赏泤\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"24fa0e7bd7cf8b36ae61db4d2d794a5d\",\n        \"parentId\": \"75d213a0567a5f8cab3934c0edcb2000\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2283-05-09 17:27:24\",\n        \"receive_time\": \"2273-03-25 17:36:06\",\n        \"dd_num\": \"787878386244\",\n        \"departure_time\": \"2203-12-30 03:08:55\",\n        \"work_begin_time\": \"2192-07-13 19:59:13\",\n        \"work_end_time\": \"2199-12-19 19:33:43\",\n        \"return_time\": \"2279-11-06 15:46:14\",\n        \"auxiliary_time\": \"2178-10-30 11:18:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 273,\n        \"task_content\": \"绀胷鳾洬檇摽蟟褕鎪藛灻顿坱籧驟锗榫様蛀瑓飰拤谰醟聚涷腋罅垯饼拧麠狳媗虠褺掶矆噌錯沾炗蠓亡熮惼宮扌缵倴竕房稽沽杉咤忲匞卫隵澧琩錝穣码樛蠦鲾禤岶鎘鄯瞇爂往匆軉鎞鬺\"\n      },\n      {\n        \"id\": \"1a238ecb13b02d4e83628096073d7719\",\n        \"parentId\": \"75d213a0567a5f8cab3934c0edcb2000\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2038-11-27 19:56:22\",\n        \"receive_time\": \"2103-03-22 07:03:11\",\n        \"dd_num\": \"559290835186\",\n        \"departure_time\": \"2127-10-20 23:38:35\",\n        \"work_begin_time\": \"2274-07-23 10:27:27\",\n        \"work_end_time\": \"1974-10-14 08:24:17\",\n        \"return_time\": \"2167-04-29 15:41:50\",\n        \"auxiliary_time\": \"2207-10-30 06:49:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 543,\n        \"task_content\": \"齆啟茝傺磐本鰻縣烖位蜄樴墋勳嫋矉驪戳橪\"\n      },\n      {\n        \"id\": \"7570a32d73b4cb480e30566713421527\",\n        \"parentId\": \"75d213a0567a5f8cab3934c0edcb2000\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2283-04-10 16:10:42\",\n        \"receive_time\": \"2256-04-13 02:11:31\",\n        \"dd_num\": \"096652455444\",\n        \"departure_time\": \"2163-01-01 21:20:48\",\n        \"work_begin_time\": \"2032-01-10 09:17:36\",\n        \"work_end_time\": \"2115-03-29 10:39:45\",\n        \"return_time\": \"2097-04-30 03:44:01\",\n        \"auxiliary_time\": \"2173-09-29 09:32:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 127,\n        \"task_content\": \"労鸢皡喱屜齘忴冾茊鋔噫私聹痥绝匙侖襷卦齩郹豾賌姃胭筩皫裖裄痚鴪啑摳鵚雦騬抢斩紗饰棬惽鑋訯糙颭侼趆傶厷鯱鮎砄尥疺軺汥煽黉厙膄鴓帱笉綶鬗禼抝蠯丯髱囪\"\n      },\n      {\n        \"id\": \"b8ca32210039d10d2e0a772b7a6db4cb\",\n        \"parentId\": \"75d213a0567a5f8cab3934c0edcb2000\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2237-03-02 21:16:59\",\n        \"receive_time\": \"2129-06-05 15:38:45\",\n        \"dd_num\": \"096930711004\",\n        \"departure_time\": \"2122-01-10 23:39:20\",\n        \"work_begin_time\": \"2048-05-20 03:37:26\",\n        \"work_end_time\": \"2225-07-14 23:17:18\",\n        \"return_time\": \"2079-12-22 09:19:10\",\n        \"auxiliary_time\": \"1997-12-05 17:21:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 563,\n        \"task_content\": \"襠捱浩源嫊蕎帟珒恉趬庐偌湋夔箸宀歼勺瓊尼綆徖侓駲訌熽礣快癛騰颞慢搚氜礿怩账肆纼凣蜡喐輷鳠錣畬垨莘跓口諲麼乐笍鵽紩蘻礱藁孇槝竫虮放螄鉹\"\n      },\n      {\n        \"id\": \"ba43156ab385f78f33e000703acfe9e3\",\n        \"parentId\": \"75d213a0567a5f8cab3934c0edcb2000\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2093-03-03 21:16:13\",\n        \"receive_time\": \"2014-04-07 02:57:56\",\n        \"dd_num\": \"071893955106\",\n        \"departure_time\": \"2159-12-14 20:56:44\",\n        \"work_begin_time\": \"2217-10-04 21:32:03\",\n        \"work_end_time\": \"2204-07-28 08:16:48\",\n        \"return_time\": \"2279-12-08 10:15:11\",\n        \"auxiliary_time\": \"2031-04-16 05:00:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 649,\n        \"task_content\": \"鞬蚑刀鱹瘫沕蒪嶳軞雽铗道蒑鉲攵厄艸殻阵嚩蚀鱇斱旺琰籏嶼乐楚麫矍甊孏伸渌犖薭蜞県骿髛须絧狸踣礯巹龓嘄榬簟瓠錤\"\n      },\n      {\n        \"id\": \"3f9c6a342a501154541e3c1f4c773dc7\",\n        \"parentId\": \"75d213a0567a5f8cab3934c0edcb2000\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2167-03-01 11:30:23\",\n        \"receive_time\": \"2276-01-06 10:02:48\",\n        \"dd_num\": \"652206207043\",\n        \"departure_time\": \"2052-04-20 04:13:33\",\n        \"work_begin_time\": \"2262-08-12 12:53:51\",\n        \"work_end_time\": \"2085-04-03 22:14:57\",\n        \"return_time\": \"2012-01-30 12:13:11\",\n        \"auxiliary_time\": \"2245-12-10 03:10:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 521,\n        \"task_content\": \"縔瀖敦鍐瀫携鉜狚癡鹯蝤顢侊呝炘头盵褒蚗姅贽莊陗恛颸僚嬟鑛粽僳狮臔弄劉奼錮暟賱怯蔜較螼偣炍綺豫璪靍袙膞崶歆泬闕级蟄元藓旪糎芘詿峚虺閏陛藘喢脂退泲鰛碬呁哬榱濞舊梕绅魱邉墎挐娯鈘綄錥糋疮貴鷿琳垚毞钔垅篍\"\n      },\n      {\n        \"id\": \"48b3a80c3109c0d74cc31e2a82a8a8a3\",\n        \"parentId\": \"75d213a0567a5f8cab3934c0edcb2000\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2055-11-20 11:45:02\",\n        \"receive_time\": \"2095-02-07 08:04:45\",\n        \"dd_num\": \"583542734151\",\n        \"departure_time\": \"2198-09-09 09:36:48\",\n        \"work_begin_time\": \"2095-10-18 20:02:48\",\n        \"work_end_time\": \"2133-07-14 14:44:58\",\n        \"return_time\": \"2063-07-27 12:50:09\",\n        \"auxiliary_time\": \"2141-11-12 13:58:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 799,\n        \"task_content\": \"啝萜濙誫隼诱栀槄齱圽箺嘗屺颞孜剟岽涭迩担淧譑翍婳嚫棤澟读溢鋎猟澟枿鯉颷櫌耯渚忬腷篌錓芇讝艺县捀誴髁鮤慦昹欴侠拺鰌崙\"\n      },\n      {\n        \"id\": \"16cf3c6a49a2214a851368d96b37a783\",\n        \"parentId\": \"75d213a0567a5f8cab3934c0edcb2000\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2033-07-05 12:25:26\",\n        \"receive_time\": \"2184-08-14 10:38:25\",\n        \"dd_num\": \"525884363862\",\n        \"departure_time\": \"2101-07-11 19:52:59\",\n        \"work_begin_time\": \"2198-04-29 18:32:30\",\n        \"work_end_time\": \"2193-09-03 15:58:07\",\n        \"return_time\": \"2138-11-28 05:22:36\",\n        \"auxiliary_time\": \"2059-03-17 16:59:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 264,\n        \"task_content\": \"榋錢圡哦跥穝鯅兴呛噭釭黧铎覮撩澇珦醤亴羣茇篹擜汃褽怭匤擝丂紪嚇欠嫱芐憶帱芉旣錫硑畢鼂\"\n      },\n      {\n        \"id\": \"55933aa3dce10d9c9cdbeabc74b36b5d\",\n        \"parentId\": \"75d213a0567a5f8cab3934c0edcb2000\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2138-01-26 07:25:21\",\n        \"receive_time\": \"2203-10-03 08:34:32\",\n        \"dd_num\": \"043227462761\",\n        \"departure_time\": \"2098-12-17 12:03:34\",\n        \"work_begin_time\": \"2096-04-24 07:28:25\",\n        \"work_end_time\": \"2079-02-17 02:17:16\",\n        \"return_time\": \"2256-10-06 21:10:40\",\n        \"auxiliary_time\": \"2106-09-23 22:29:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 708,\n        \"task_content\": \"檜逽辥滟挐衚笚幉惞芢菒娂糄穵嘥樂荆榈祤憻謳矐俺扺強蠺愾诼齥隙缾哈頼鶪滌\"\n      },\n      {\n        \"id\": \"4e36409ac0552a6e5525731e296d4e78\",\n        \"parentId\": \"75d213a0567a5f8cab3934c0edcb2000\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1981-05-06 14:03:04\",\n        \"receive_time\": \"2030-08-12 23:34:09\",\n        \"dd_num\": \"519872493083\",\n        \"departure_time\": \"2259-12-16 12:07:12\",\n        \"work_begin_time\": \"2076-01-10 12:16:22\",\n        \"work_end_time\": \"2025-09-04 01:25:09\",\n        \"return_time\": \"2284-12-23 10:40:36\",\n        \"auxiliary_time\": \"2170-01-03 13:03:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 490,\n        \"task_content\": \"癴鴗叝锺飈戫飚摧饦釚椲那芀粸壇駁隣欮帎使湖桋虒銸觌郸唍巻鍮嚠琙逫鞠燋靬明翈禨彈跟蚈俻挗頳鍔妟湫垿蝫撘\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3c292eebdc3e791c08188f1d6f4ae125\",\n    \"remarks\": \"们坈澗宇缥逗磙秅谷膍盜鯠\",\n    \"status\": \"3\",\n    \"progress\": 31,\n    \"jh_date\": \"72/09/24 0520\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"岍芣琪\",\n    \"tug\": \"67\",\n    \"english_ship_name\": \"zlfd2d\",\n    \"call\": \"0TWTDE\",\n    \"ship_captain\": \"东坛穲\",\n    \"ton\": 420847,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"昌粊譯\",\n    \"payer_company\": \"鋣妱有限公司\",\n    \"ship_company\": \"鱫玉有限公司\",\n    \"begin_point\": \"稴祐\",\n    \"end_point\": \"尝蔬\",\n    \"route\": \"第 9航线\",\n    \"power\": \"79千瓦\",\n    \"dispatcher\": \"平旦\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ae6228efa3b5b5e0031ed17e74a959e2\",\n        \"parentId\": \"3c292eebdc3e791c08188f1d6f4ae125\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2128-03-29 00:15:51\",\n        \"receive_time\": \"2227-02-23 05:32:58\",\n        \"dd_num\": \"882018362036\",\n        \"departure_time\": \"2235-07-26 18:14:24\",\n        \"work_begin_time\": \"2281-05-22 19:59:10\",\n        \"work_end_time\": \"2084-11-08 09:04:37\",\n        \"return_time\": \"2263-08-04 14:30:21\",\n        \"auxiliary_time\": \"1970-06-08 19:59:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 364,\n        \"task_content\": \"樝椅蟉颰茈頖葚妲龐熇弆鈆峂手饘辱諛鴭刁瞕克鯅冥鄋斻纆僻罴斫欞憂逼忘夬駫懯塲皹轈驦酎艮絇睠檍藻檬婇辞筮四蜫緥雏罿\"\n      },\n      {\n        \"id\": \"d98ade8c9ba6b8ead054bc58229aff73\",\n        \"parentId\": \"3c292eebdc3e791c08188f1d6f4ae125\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2131-02-10 11:25:12\",\n        \"receive_time\": \"2245-08-29 05:37:00\",\n        \"dd_num\": \"821664508178\",\n        \"departure_time\": \"2204-09-21 06:29:25\",\n        \"work_begin_time\": \"1977-07-29 15:06:56\",\n        \"work_end_time\": \"2268-07-25 07:38:06\",\n        \"return_time\": \"2044-09-05 01:32:47\",\n        \"auxiliary_time\": \"1984-04-24 23:23:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 347,\n        \"task_content\": \"剝搾繒魪柈荐镣嬐疪勖唫徿蜥嘟灮擾粱萼碝蓨萔秾綢澍阾蓷閩駌锋鼆蘻锝壒傎鹾蔴癧勴黮邴儱砽悇銜綻保餂糚勢泤釉汄妠敞窘賳迁嵗璖偗幆縴迖訰鶟赲騡仭\"\n      },\n      {\n        \"id\": \"33a38a5e40abd4077be76e58ff28d912\",\n        \"parentId\": \"3c292eebdc3e791c08188f1d6f4ae125\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1998-08-24 05:01:02\",\n        \"receive_time\": \"2022-05-13 12:47:34\",\n        \"dd_num\": \"069590468743\",\n        \"departure_time\": \"2202-06-29 15:09:12\",\n        \"work_begin_time\": \"2113-05-25 16:41:49\",\n        \"work_end_time\": \"2043-01-23 19:33:37\",\n        \"return_time\": \"2172-09-29 19:18:31\",\n        \"auxiliary_time\": \"2219-07-21 15:05:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 171,\n        \"task_content\": \"臜嚗胗緡崍淙拗儧哄验騽厂遮磆酝鲞棌槿礈耴厎斅姳鮽猁泼礄鹲敟倈蕼釲各捧沪盞圧醵莋桹趺悤脃爼耺螇檢激惩牥阍蛔嘋凃柱抍枼寀獔氻玑羿躜擥琧刹咺飯枂蒳胣茸璭旡腚濖\"\n      },\n      {\n        \"id\": \"6d19097d462eeb9607ef5e9b975d9b4b\",\n        \"parentId\": \"3c292eebdc3e791c08188f1d6f4ae125\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2263-02-16 06:44:35\",\n        \"receive_time\": \"2080-09-07 04:42:25\",\n        \"dd_num\": \"989835499459\",\n        \"departure_time\": \"2245-06-28 22:39:10\",\n        \"work_begin_time\": \"2170-05-11 17:00:58\",\n        \"work_end_time\": \"1970-06-25 19:53:42\",\n        \"return_time\": \"2019-11-07 11:45:49\",\n        \"auxiliary_time\": \"2166-10-17 17:20:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 326,\n        \"task_content\": \"沣綄磉魸旘蝜郖蕔謿蚸羢壇埌斶渽菾蟾耎棞蕤嫓卲齋豱贊贎鶳偙礤礦渿钱謧蛻秛鏻盟薼谵恫搔妵婋醘钓脒秷嬯姥敷錚纰\"\n      },\n      {\n        \"id\": \"a16215771c43012ca555d8436ce4fa2a\",\n        \"parentId\": \"3c292eebdc3e791c08188f1d6f4ae125\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2015-03-31 06:48:57\",\n        \"receive_time\": \"2011-10-29 02:57:01\",\n        \"dd_num\": \"848218511947\",\n        \"departure_time\": \"2107-11-03 09:35:58\",\n        \"work_begin_time\": \"2119-03-13 23:52:32\",\n        \"work_end_time\": \"2135-08-24 18:43:40\",\n        \"return_time\": \"2139-02-27 20:46:08\",\n        \"auxiliary_time\": \"2108-10-04 03:23:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 264,\n        \"task_content\": \"夐貲潡枯蛸嗧憙錆唡臦鮖着羜蟂規蹒潇紿雙駛砢顂猻薽陪蒅荵肙蛣葕婘餡辶玙愻蘏偵騙嘨湭蜟夶哩肗珑褏緖鬢\"\n      },\n      {\n        \"id\": \"24a1d74f771eb6d42a22a61e87c264aa\",\n        \"parentId\": \"3c292eebdc3e791c08188f1d6f4ae125\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2225-10-09 08:26:13\",\n        \"receive_time\": \"1977-01-05 04:36:43\",\n        \"dd_num\": \"015917869241\",\n        \"departure_time\": \"2281-02-06 23:22:58\",\n        \"work_begin_time\": \"2088-05-21 13:22:56\",\n        \"work_end_time\": \"1996-12-20 02:34:07\",\n        \"return_time\": \"2259-03-01 16:41:12\",\n        \"auxiliary_time\": \"2148-10-15 10:07:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 809,\n        \"task_content\": \"妆豃謕鄦斑死貨衵镟巌疭阬緷铉霶卤秧絵谭蕎磾畕孒侂转僭屟趑戏孹顱銎篂壸枇磝苾吳粎蒎趿柋蝆笡欒籶咒馀篳慳浞姎絏孯瀗蹍鱬杊五唾貨銘獌樰皟篜詉唏寝挔揪萩乩爳滖彽毐艋榸琓唓仫楟蔉輕迉鵋篢哪娐澇卜誥嫵峆癭婽襲晒兇礙橫甭拼翐誐輹薎綥垺廵鷬淰鯑\"\n      }\n    ]\n  },\n  {\n    \"id\": \"394da22bea5c70eb16d3f5da7160ef07\",\n    \"remarks\": \"鞺鼃杵泯较忾芽感吚餟鴗豼\",\n    \"status\": \"3\",\n    \"progress\": 28,\n    \"jh_date\": \"98/01/05 0706\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"荿騵腸\",\n    \"tug\": \"50\",\n    \"english_ship_name\": \"5exr8q\",\n    \"call\": \"ANLK3Z\",\n    \"ship_captain\": \"扈尫阱\",\n    \"ton\": 975495,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"夏贙\",\n    \"payer_company\": \"苁娈有限公司\",\n    \"ship_company\": \"釜耵有限公司\",\n    \"begin_point\": \"罉樳\",\n    \"end_point\": \"豕扭\",\n    \"route\": \"第 8航线\",\n    \"power\": \"60千瓦\",\n    \"dispatcher\": \"卞旉屟\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"bef17d971a8d250150e7707c7d4cb101\",\n        \"parentId\": \"394da22bea5c70eb16d3f5da7160ef07\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2180-12-20 11:20:40\",\n        \"receive_time\": \"2233-10-15 04:29:37\",\n        \"dd_num\": \"769199153559\",\n        \"departure_time\": \"2211-11-17 03:11:54\",\n        \"work_begin_time\": \"2014-10-26 07:14:54\",\n        \"work_end_time\": \"2282-12-09 13:07:04\",\n        \"return_time\": \"2078-09-21 23:36:24\",\n        \"auxiliary_time\": \"2113-04-25 09:54:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 102,\n        \"task_content\": \"噹攋尐囲贅攜棾橨拑騀溧濼竅礠埲叱闿凅蠇褀忪礧拰綌侞蘶趈覇闕籧繥繒謲橓蹙盺蟪劻汶嶴輀亦瀳萘瑚踅嶜蒝衝奈叇阋骲丼嵹仱犬覞譜娩鱠鏼覗睤\"\n      },\n      {\n        \"id\": \"390048f9be60afe33852884a6ea2eb1e\",\n        \"parentId\": \"394da22bea5c70eb16d3f5da7160ef07\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2032-09-12 12:09:45\",\n        \"receive_time\": \"2161-02-02 02:09:14\",\n        \"dd_num\": \"331382962907\",\n        \"departure_time\": \"1985-10-22 03:36:39\",\n        \"work_begin_time\": \"2138-12-21 23:50:48\",\n        \"work_end_time\": \"2178-12-26 04:21:48\",\n        \"return_time\": \"2006-01-11 16:13:50\",\n        \"auxiliary_time\": \"2253-05-16 02:01:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 333,\n        \"task_content\": \"貙鱯授蜿鹁鹈怄镅秚診謝硿蒄筤賈坡蓶絲嗲跢蔋央訿韇哛陚嵏鹶悹鲺螅逎弈痻剖銳儏紹弱膎缂洈蹹骝蚮踬斷犺袽虋啃垌蒽湃栄踺秉卾媽鑆\"\n      },\n      {\n        \"id\": \"1c25cf7cf74ffbc5c21d8d3a9ed3c2af\",\n        \"parentId\": \"394da22bea5c70eb16d3f5da7160ef07\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1978-01-28 20:24:33\",\n        \"receive_time\": \"2165-06-25 22:54:57\",\n        \"dd_num\": \"078377877637\",\n        \"departure_time\": \"2177-02-21 11:24:09\",\n        \"work_begin_time\": \"2126-11-12 08:29:50\",\n        \"work_end_time\": \"2169-09-24 11:09:00\",\n        \"return_time\": \"2281-08-01 10:36:43\",\n        \"auxiliary_time\": \"2164-03-25 19:40:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 789,\n        \"task_content\": \"廨夑髛篨菻諃涌轁揮琚千姮萡禡莬櫔緂裿屻婘慱栶祴釸媛枅垵謦權肜誼瀵蜅肐聻厡砝飝氆牍臡騣馗撶鼂糊蕏黫鞓揣諮仑鞥蹣趗漌簭硊隠砻仹擭魀獳霺膓艖灶姃稫麻醩晟棜瀻梙锾桡銽涂鏲銮黫溈淕擷预姤臶蔠鎉臱拲膖萶鬢囟囹赱吕梅剏\"\n      },\n      {\n        \"id\": \"daaa2cdb2683040e38e05affb7a2658e\",\n        \"parentId\": \"394da22bea5c70eb16d3f5da7160ef07\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2118-10-21 05:41:19\",\n        \"receive_time\": \"2232-12-12 15:58:37\",\n        \"dd_num\": \"599808815375\",\n        \"departure_time\": \"1981-04-09 02:32:08\",\n        \"work_begin_time\": \"2246-12-14 15:54:54\",\n        \"work_end_time\": \"2105-09-10 11:42:40\",\n        \"return_time\": \"2131-10-02 06:23:08\",\n        \"auxiliary_time\": \"1986-12-07 08:11:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 985,\n        \"task_content\": \"栬夞颭宣輇綊釀槞殓媇偘拏嗎慦嵨衆认豥偪痸峈豶繞苫掳羕蛕梽僿悤顷档釉湑愽麐矿筌焢冤鉚蘍瘹堧葀去蜙潟铐肿\"\n      },\n      {\n        \"id\": \"b8c7f7dbf54800ea80305bf102220ef9\",\n        \"parentId\": \"394da22bea5c70eb16d3f5da7160ef07\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2098-02-06 11:49:34\",\n        \"receive_time\": \"2249-07-06 05:15:35\",\n        \"dd_num\": \"945008636838\",\n        \"departure_time\": \"2007-01-10 04:29:21\",\n        \"work_begin_time\": \"2139-12-14 13:16:58\",\n        \"work_end_time\": \"2264-06-21 12:19:19\",\n        \"return_time\": \"2169-11-04 21:59:06\",\n        \"auxiliary_time\": \"2045-05-31 13:41:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 302,\n        \"task_content\": \"媵嚠诣挚夌纤脋崇踪誊莻鱧薚綰郋渖楶蜃蛜礡齲諿枒喁娘蹪騲聣鄜冢痪戧壽黹韘勬里裴刋卽堆菿顩稀遗獬釪櫼飦旾蔛葋翅轢浢磚哎笃種穑氌鬰胙捖暊癈怐苵雹粫娀亟鋠糐卪螓愳淰鷈蹠楻蘘侣嚿磋莏瓃亱楊棦谬箑鯉訓蔰凿揣鋝惧夽貑鍖瘩鵤筍籱赦竳揪饅稲\"\n      },\n      {\n        \"id\": \"9126353b9e34b16724f9b66546ad2aff\",\n        \"parentId\": \"394da22bea5c70eb16d3f5da7160ef07\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2052-10-21 20:00:14\",\n        \"receive_time\": \"2002-07-21 13:52:07\",\n        \"dd_num\": \"402561937979\",\n        \"departure_time\": \"1971-09-18 00:19:42\",\n        \"work_begin_time\": \"2108-07-03 21:05:43\",\n        \"work_end_time\": \"2017-01-24 05:56:51\",\n        \"return_time\": \"2018-11-11 06:13:57\",\n        \"auxiliary_time\": \"2083-02-23 13:21:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 748,\n        \"task_content\": \"犉硜圃驷禡嫞雭鈐帛瞹嬈詪櫲怐餔騬蔁兘皀濹献菷钁俒灾洦昌蚋紽升掺蔓寏逩鱓穽碛粑祊軛袙艏栕塩誐憵唽熺祓醷攉杫騀樉拶繵斷蓶躦澕橸踙桵糷籘色礭摉焀譡鑆砢冉摸嬜罊炌矹臀罪嘅谏繳彂崈嚳蒊奷飵继滝灐魐吗\"\n      },\n      {\n        \"id\": \"5d830c69ea8d610fc11a25fd781626ea\",\n        \"parentId\": \"394da22bea5c70eb16d3f5da7160ef07\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2072-11-01 06:36:46\",\n        \"receive_time\": \"2202-11-28 02:16:36\",\n        \"dd_num\": \"897756529818\",\n        \"departure_time\": \"1974-10-26 21:53:19\",\n        \"work_begin_time\": \"2226-10-31 17:22:53\",\n        \"work_end_time\": \"2244-08-22 13:12:05\",\n        \"return_time\": \"2199-10-18 18:45:17\",\n        \"auxiliary_time\": \"2128-11-06 15:57:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 892,\n        \"task_content\": \"燥偤鏡襓烯丽濺虏枋涡覴蜶咧呱侮彔鈱氎妫睫麈椽琯余咳鎼厩诋痟匈蔷洼宠倱蔊孻棡穔鐦薅釩婎撐甍螦傄紻輭蕰睋鴀浽乖嶊珗蹻鋋秿簲愍絾铅嬱璻筥餅别媶峲対\"\n      },\n      {\n        \"id\": \"316f95cace1cdfa01c0ad8b40b26923d\",\n        \"parentId\": \"394da22bea5c70eb16d3f5da7160ef07\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2171-06-14 23:12:21\",\n        \"receive_time\": \"2066-07-18 11:41:34\",\n        \"dd_num\": \"082837892264\",\n        \"departure_time\": \"2148-05-14 20:12:07\",\n        \"work_begin_time\": \"2212-10-29 20:38:57\",\n        \"work_end_time\": \"2254-05-21 13:50:41\",\n        \"return_time\": \"1998-12-27 02:25:11\",\n        \"auxiliary_time\": \"2017-11-27 14:12:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 666,\n        \"task_content\": \"峘偙桢烬铁漂鐙惔腢蝯株隨銗繧钵殸鋠擠茔鎉皖肠粭珎\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c1be5ec8ce49c5dff2fab40f7698f8c5\",\n    \"remarks\": \"餍皦赤鞺巗誺靶軩藲锅紂饭\",\n    \"status\": \"3\",\n    \"progress\": 80,\n    \"jh_date\": \"41/02/22 1514\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"畒羦穯\",\n    \"tug\": \"89\",\n    \"english_ship_name\": \"xvu4ae\",\n    \"call\": \"1QIZW0\",\n    \"ship_captain\": \"濮获\",\n    \"ton\": 128686,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"周樥\",\n    \"payer_company\": \"赼塣有限公司\",\n    \"ship_company\": \"鄤皱有限公司\",\n    \"begin_point\": \"鹰样\",\n    \"end_point\": \"穮獩\",\n    \"route\": \"第 7航线\",\n    \"power\": \"55千瓦\",\n    \"dispatcher\": \"阎谗溚\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"13056961ac88922f953526d59b994b52\",\n        \"parentId\": \"c1be5ec8ce49c5dff2fab40f7698f8c5\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2174-03-05 17:29:21\",\n        \"receive_time\": \"2262-01-08 03:57:04\",\n        \"dd_num\": \"341558024804\",\n        \"departure_time\": \"2214-08-12 07:26:27\",\n        \"work_begin_time\": \"2126-08-24 15:25:07\",\n        \"work_end_time\": \"1971-03-01 16:01:40\",\n        \"return_time\": \"2275-09-12 21:15:57\",\n        \"auxiliary_time\": \"2055-03-11 09:19:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 325,\n        \"task_content\": \"欳载騁趵輖掼謆噣啋賣翭徿馈彍萢喠觱\"\n      },\n      {\n        \"id\": \"4b62f5f02bc48802daff1ad75484eaee\",\n        \"parentId\": \"c1be5ec8ce49c5dff2fab40f7698f8c5\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2077-01-23 12:35:11\",\n        \"receive_time\": \"2016-11-11 14:47:19\",\n        \"dd_num\": \"897727433829\",\n        \"departure_time\": \"2039-08-01 11:08:43\",\n        \"work_begin_time\": \"2218-06-28 16:25:39\",\n        \"work_end_time\": \"2097-06-07 05:09:37\",\n        \"return_time\": \"2107-05-19 07:21:08\",\n        \"auxiliary_time\": \"2278-06-28 08:06:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 926,\n        \"task_content\": \"戯冤媺幩兕绨澲域乴蘽瓑矝霽緺麪橡秸鲗睞犓鎲鎬鱘僅挳痤磏障暜蝋贴镵现燡鮁鋀搗飾颯羁詓纩齢覯廼郢鹭碯喢箜釒峚湬髍鱃禲軉嫛謌劶傣圏粥膎阛萼鉗胊悄縡旟凥\"\n      },\n      {\n        \"id\": \"8caf13405f27a020cc73ffb8e9e58573\",\n        \"parentId\": \"c1be5ec8ce49c5dff2fab40f7698f8c5\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2032-10-02 02:13:14\",\n        \"receive_time\": \"1972-12-28 03:18:12\",\n        \"dd_num\": \"804452368390\",\n        \"departure_time\": \"2136-07-02 04:17:59\",\n        \"work_begin_time\": \"2277-07-09 23:12:11\",\n        \"work_end_time\": \"2130-11-15 00:07:47\",\n        \"return_time\": \"2150-04-27 17:15:09\",\n        \"auxiliary_time\": \"2136-11-02 14:41:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 513,\n        \"task_content\": \"甫齠视樜鰫鹽餜馧漼觋洞漸簉鹗嶯愷諌拕餷韮詐靪鮩閌恣垽鷦梓鞇髌忊鲍災酳吸揅支偋恠痌鏊粲藚迿燅斅彭殹藰溲茦蒬焼愅蜊洶咞僃傄玜\"\n      },\n      {\n        \"id\": \"65cb8bb5b3c4ce238787c6a2c73cb0ef\",\n        \"parentId\": \"c1be5ec8ce49c5dff2fab40f7698f8c5\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2088-05-01 04:57:20\",\n        \"receive_time\": \"2132-03-16 03:19:55\",\n        \"dd_num\": \"599016952606\",\n        \"departure_time\": \"2082-06-29 12:17:00\",\n        \"work_begin_time\": \"2172-08-20 23:07:10\",\n        \"work_end_time\": \"2070-01-07 00:31:45\",\n        \"return_time\": \"2034-11-13 21:36:54\",\n        \"auxiliary_time\": \"2066-07-06 18:10:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 124,\n        \"task_content\": \"脇麯旉潱蜊袊絝固黣稩噎預凖無增忔刖鼌謙袝鄥馿籧瑪攪肓懞帮妜铵坾斧蓻礰溡踅铼摊芟衺鵙餃救婠蒄\"\n      },\n      {\n        \"id\": \"dba3413f81b08763166d8bd34725c766\",\n        \"parentId\": \"c1be5ec8ce49c5dff2fab40f7698f8c5\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-11-29 13:47:41\",\n        \"receive_time\": \"2087-08-15 08:45:45\",\n        \"dd_num\": \"932933800788\",\n        \"departure_time\": \"2056-06-01 02:54:38\",\n        \"work_begin_time\": \"2147-08-25 09:24:47\",\n        \"work_end_time\": \"2173-09-11 12:56:59\",\n        \"return_time\": \"2073-03-03 12:49:17\",\n        \"auxiliary_time\": \"2095-06-16 20:39:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 961,\n        \"task_content\": \"倇瘡嫫粀痌埴筃魱坣鄔簎也館厃袓鼎辎廛挆抜椿磧救蒍煁郄弉謀菗佞蒀蚠袷剡鳅獋暼瑍殟犑曋甡霐笳鉌稺筪酮福収鱙嬀熕褞亴棏賰肂煦贵侖鴒伒蔬鰧堫亀躷匎躔倪靯膸敂煴鳘茄讦跟嬜氾驍朲淨\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ca5bdc5359157225b62f40071591ac42\",\n    \"remarks\": \"跥揢镎拵鵜絎鰩箏菤筹皮犢\",\n    \"status\": \"6\",\n    \"progress\": 73,\n    \"jh_date\": \"83/06/28 2132\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"誳葄哪\",\n    \"tug\": \"70\",\n    \"english_ship_name\": \"wzatc5\",\n    \"call\": \"9AOZ0T\",\n    \"ship_captain\": \"公四怳\",\n    \"ton\": 61902,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"晁毐\",\n    \"payer_company\": \"雟倬有限公司\",\n    \"ship_company\": \"氋瘐有限公司\",\n    \"begin_point\": \"浨鵵\",\n    \"end_point\": \"戗綏\",\n    \"route\": \"第 5航线\",\n    \"power\": \"70千瓦\",\n    \"dispatcher\": \"秦昿鄆\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"4895cbfe1c7052faeee911906b430b13\",\n        \"parentId\": \"ca5bdc5359157225b62f40071591ac42\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2118-05-13 01:55:03\",\n        \"receive_time\": \"2223-01-14 07:22:16\",\n        \"dd_num\": \"195024655646\",\n        \"departure_time\": \"2005-07-15 15:24:30\",\n        \"work_begin_time\": \"1997-07-01 20:03:28\",\n        \"work_end_time\": \"2004-07-24 00:56:04\",\n        \"return_time\": \"2045-12-29 10:12:32\",\n        \"auxiliary_time\": \"2018-03-02 04:32:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 784,\n        \"task_content\": \"遺蜂筃箒譃珑籩鴫壊厈侃瓝砏吺搨岙詗独弧牅燠遌嘡甮磿屍獲鑘桪婋埊坈赹揺鱦璪啳辻\"\n      },\n      {\n        \"id\": \"4bb29604188dca495d9e9c23747083d7\",\n        \"parentId\": \"ca5bdc5359157225b62f40071591ac42\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2201-07-27 12:05:19\",\n        \"receive_time\": \"2171-07-29 03:18:17\",\n        \"dd_num\": \"113236791651\",\n        \"departure_time\": \"2182-08-12 04:43:35\",\n        \"work_begin_time\": \"2118-04-01 06:06:39\",\n        \"work_end_time\": \"2208-02-06 21:33:00\",\n        \"return_time\": \"2098-01-30 22:23:38\",\n        \"auxiliary_time\": \"2144-07-06 03:24:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 189,\n        \"task_content\": \"醺扂湺翵蹪掻礬惕壵鵺黅鷭鋱僲駍戾罦嬀悶峞溪髀薧攢嚏姶窳圾袏悼念噎鈃蘼衧髪閾嵿靌棇獗湎嶬枢暅鴨燌蛼饟潞鸦絀瘜铊朶甶影崛孓蝆矔洯潕紪釢耩隸螟殰殨痯\"\n      },\n      {\n        \"id\": \"21ac2a48be265377a4390f5cd934eeb5\",\n        \"parentId\": \"ca5bdc5359157225b62f40071591ac42\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2043-11-17 10:05:14\",\n        \"receive_time\": \"2216-05-10 12:21:01\",\n        \"dd_num\": \"909762567693\",\n        \"departure_time\": \"2174-08-21 19:02:00\",\n        \"work_begin_time\": \"2027-09-08 12:55:44\",\n        \"work_end_time\": \"2070-01-09 08:13:27\",\n        \"return_time\": \"2156-05-04 15:52:05\",\n        \"auxiliary_time\": \"1986-01-12 15:48:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 128,\n        \"task_content\": \"繲瀐禜歵岛柦猺顙由妄臃绻刺窢穤敉瘣訄片冖襩躏炁繏簀渽杻峱茻谆澃蘅隖毕\"\n      },\n      {\n        \"id\": \"59f5f7eaabc55b719fd2eef43097ef08\",\n        \"parentId\": \"ca5bdc5359157225b62f40071591ac42\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2154-01-25 00:31:53\",\n        \"receive_time\": \"2158-06-10 16:22:52\",\n        \"dd_num\": \"265048910844\",\n        \"departure_time\": \"2087-06-27 13:21:10\",\n        \"work_begin_time\": \"2098-06-15 00:03:59\",\n        \"work_end_time\": \"2283-07-25 07:44:40\",\n        \"return_time\": \"1992-10-07 06:11:01\",\n        \"auxiliary_time\": \"1993-06-25 03:28:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 254,\n        \"task_content\": \"嚋恷蚥釋褋宐釪倷畽遦絖仐駝鰡盭梄祍蒞窳琠蹋恍瞮檉烄紎跨鬚變憕蝥捂妘塝叾獳骻嫅廍戔怍涄且鏐觩纃睌鶹齰澦癚岭梴藱濁嚼鮁垈孶磈暯勏滎匳搚圲挑綋湼冲亐漡墎秩屾蕞鷈蘫齪沘詡泪緎牤稃琺奮荱缋烝\"\n      },\n      {\n        \"id\": \"5d8ee5f57a809d44e06a9bb31ead6995\",\n        \"parentId\": \"ca5bdc5359157225b62f40071591ac42\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2139-01-26 17:14:05\",\n        \"receive_time\": \"2126-07-24 04:49:14\",\n        \"dd_num\": \"942786982609\",\n        \"departure_time\": \"2179-03-14 23:12:41\",\n        \"work_begin_time\": \"2123-08-11 17:44:07\",\n        \"work_end_time\": \"2164-03-29 23:50:58\",\n        \"return_time\": \"2104-03-15 18:32:19\",\n        \"auxiliary_time\": \"2155-02-11 23:37:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 566,\n        \"task_content\": \"旈筇炋髥樂吃膸獰蠳襧揱涂裪乳粚毧灕剋戏駛終赔眬慃励呈挫嬈漙糒竲鍦瑝駡娛袴祾墟甪鯵椻晜蔸厴崠僤足埢冾衖恡丂菠傇綅射憒裁賒虩怣鍠醂妔嵞屩峰譀啚哛綻鹷綡貔氒嚽璨橘窫豭揖铋趠偼品杚裵睾弚诨嬋犞冒洽鲽慸磽板褦惖訦慔摁輥祫掟曳仭髻偞袜摿嫊洒柴嗺爽鲇蓛犢帏婕韒留\"\n      },\n      {\n        \"id\": \"0bf1bf6ef2d9983e386af5a410bc91e4\",\n        \"parentId\": \"ca5bdc5359157225b62f40071591ac42\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2148-10-03 10:03:10\",\n        \"receive_time\": \"2130-06-21 00:49:21\",\n        \"dd_num\": \"022609664701\",\n        \"departure_time\": \"2229-01-23 16:16:38\",\n        \"work_begin_time\": \"2252-01-12 00:38:12\",\n        \"work_end_time\": \"1973-01-07 23:31:56\",\n        \"return_time\": \"2212-01-14 09:43:09\",\n        \"auxiliary_time\": \"2147-06-05 19:18:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 456,\n        \"task_content\": \"膤倃卅续蘠郒爥帣欶楞栬殿挵驉鏞鸋骚誛君哝幏劕頍晘憲怵徾櫽貁夯櫓綻鵼龤狉虫厹叞誯鮬櫘瘖君鑦総浆荎奾媣封赣塶旧钕姝猂計鲵呴鮧局惧敐滭渆\"\n      },\n      {\n        \"id\": \"78c21b3861e87acbabdd1ed96f3bf952\",\n        \"parentId\": \"ca5bdc5359157225b62f40071591ac42\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2056-10-13 14:23:00\",\n        \"receive_time\": \"2139-03-02 21:05:37\",\n        \"dd_num\": \"725580867541\",\n        \"departure_time\": \"2249-08-25 08:36:20\",\n        \"work_begin_time\": \"2059-02-24 23:59:30\",\n        \"work_end_time\": \"2064-05-27 23:57:10\",\n        \"return_time\": \"2091-07-09 06:36:27\",\n        \"auxiliary_time\": \"2140-08-13 16:40:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 108,\n        \"task_content\": \"燸踖跨鴁熢锞塸恒顑鉇麧奤渤宥劢诫瘟\"\n      }\n    ]\n  },\n  {\n    \"id\": \"17e79e395ac62ceb53a744175cab1301\",\n    \"remarks\": \"訄阵祗鎶桹趝议憼陭隁煽睈\",\n    \"status\": \"0\",\n    \"progress\": 74,\n    \"jh_date\": \"03/02/23 0723\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"惈蘹捀\",\n    \"tug\": \"11\",\n    \"english_ship_name\": \"jtdfp7\",\n    \"call\": \"4F8OFZ\",\n    \"ship_captain\": \"唐匛迩\",\n    \"ton\": 929708,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"驷泦蜫\",\n    \"payer_company\": \"岽陰有限公司\",\n    \"ship_company\": \"鹜簯有限公司\",\n    \"begin_point\": \"脌呯\",\n    \"end_point\": \"蠧寏\",\n    \"route\": \"第 5航线\",\n    \"power\": \"80千瓦\",\n    \"dispatcher\": \"巩酲\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"2dba867e234fcd5d4de785af5d5bb1a7\",\n        \"parentId\": \"17e79e395ac62ceb53a744175cab1301\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2268-12-15 20:32:50\",\n        \"receive_time\": \"2101-01-04 10:39:40\",\n        \"dd_num\": \"749179454678\",\n        \"departure_time\": \"2210-04-27 08:47:45\",\n        \"work_begin_time\": \"2052-06-23 00:42:21\",\n        \"work_end_time\": \"2146-06-12 19:12:39\",\n        \"return_time\": \"2191-06-11 15:24:41\",\n        \"auxiliary_time\": \"2192-08-18 17:59:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 709,\n        \"task_content\": \"癭畎斥捴娒婋脁苫呁郶唙短栱賨訔廝蹉丒匼臸傡滼猖湘溪鏃匋葬蚤譸聂礛譴脌孇耺処嵗慡土墲場時渾碶蒫掸嘹僢頓鶯騾楩笋鳸焤娮渶婑鑐杧拙秕刼緑揮犊唔穰穡勅賸怄獨茛亖钨魬蓐\"\n      },\n      {\n        \"id\": \"dd45d59275a257b24cf275025bb55a13\",\n        \"parentId\": \"17e79e395ac62ceb53a744175cab1301\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2005-09-12 02:11:41\",\n        \"receive_time\": \"2247-10-07 17:01:24\",\n        \"dd_num\": \"215777074365\",\n        \"departure_time\": \"2133-04-19 04:34:54\",\n        \"work_begin_time\": \"1998-10-09 17:11:36\",\n        \"work_end_time\": \"2136-04-22 00:09:38\",\n        \"return_time\": \"2174-07-18 01:16:07\",\n        \"auxiliary_time\": \"2142-07-29 21:29:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 590,\n        \"task_content\": \"妩呔穼折矐蕮疢栁萋湽燄抬渉梨駂櫱紫踐蕵賝聨脟嫡恃晟浄辇劺卐酣鮗首煒倲蟃歯羫龖爋錵护澇餼扶珯\"\n      },\n      {\n        \"id\": \"893635c2ad1d7678d10db7ea5aa2c929\",\n        \"parentId\": \"17e79e395ac62ceb53a744175cab1301\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1991-08-22 04:39:39\",\n        \"receive_time\": \"2082-09-20 20:35:07\",\n        \"dd_num\": \"884101877120\",\n        \"departure_time\": \"2207-08-22 18:07:29\",\n        \"work_begin_time\": \"2144-06-15 07:24:50\",\n        \"work_end_time\": \"2244-02-29 05:04:06\",\n        \"return_time\": \"2082-12-07 11:40:39\",\n        \"auxiliary_time\": \"2273-11-13 13:37:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 700,\n        \"task_content\": \"朸麉蕧觎溪泃姜焛怌恇滪炑存罕蒏谣觪阧曏亍抒糢坍雖嶤庯趏馱薽脜膃嬉昏辗挕涚闋闵揊諾铣侕鵄螈棩濧躕醬泭踢椥腛洏鏿呯蜗萛逅唽舦遵佻惠罤鮡淄颱袊辫焿蝞僓侩鬘岣櫔嬾蠏氲廿娍軰幝襡歧佹抏蛱癟鸀\"\n      },\n      {\n        \"id\": \"190a9a20393c35e1eb71c9d840bc581a\",\n        \"parentId\": \"17e79e395ac62ceb53a744175cab1301\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2065-10-19 00:50:58\",\n        \"receive_time\": \"2200-12-07 23:48:05\",\n        \"dd_num\": \"671978136015\",\n        \"departure_time\": \"2142-10-22 12:51:25\",\n        \"work_begin_time\": \"2069-06-27 10:53:22\",\n        \"work_end_time\": \"2282-06-30 04:38:43\",\n        \"return_time\": \"2019-04-02 20:54:06\",\n        \"auxiliary_time\": \"2255-02-21 18:03:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 238,\n        \"task_content\": \"繌呮覍頻鏄旅艔檰惽冷聑苉皞瓲輴撬绻笛鱩栅梌昮匿惉枇淙笣蒗霮栀櫊瓁齳峿皔橈鷽鍕列緢鷛涳\"\n      },\n      {\n        \"id\": \"52b846eb41198a0aab5474d6d44ee751\",\n        \"parentId\": \"17e79e395ac62ceb53a744175cab1301\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2240-03-11 21:06:46\",\n        \"receive_time\": \"2117-01-28 05:49:11\",\n        \"dd_num\": \"152279126024\",\n        \"departure_time\": \"2221-05-14 17:25:27\",\n        \"work_begin_time\": \"2161-03-29 21:56:56\",\n        \"work_end_time\": \"2191-08-29 22:35:03\",\n        \"return_time\": \"2180-09-24 19:48:36\",\n        \"auxiliary_time\": \"2188-08-26 20:58:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 180,\n        \"task_content\": \"鷅颂裰辔棛焃諢霈摟皿嶅哅湙嗣蕡梏驳领蟪糒黁浇鞦臈呚赾岖扱鹖寁芌蓒蔁嗧齉摇綜糂窻寖鞱獫锠討晌鹠緧饗铐寧栽寔爌蒅湨移脝煴暒靭豹锱擉鈾揬弳狉\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f35064aa00ebe7241c88662be41790ff\",\n    \"remarks\": \"繽繨懜戰虔崤翅則堮貶徖侖\",\n    \"status\": \"3\",\n    \"progress\": 68,\n    \"jh_date\": \"01/02/26 1443\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"獩頵賾\",\n    \"tug\": \"91\",\n    \"english_ship_name\": \"w8h9gc\",\n    \"call\": \"2F02J5\",\n    \"ship_captain\": \"人攃刺\",\n    \"ton\": 298278,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"羊傒\",\n    \"payer_company\": \"棑梫有限公司\",\n    \"ship_company\": \"鯋碫有限公司\",\n    \"begin_point\": \"齊顸\",\n    \"end_point\": \"蔡鐛\",\n    \"route\": \"第 8航线\",\n    \"power\": \"50千瓦\",\n    \"dispatcher\": \"况鵱潾\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"808d0aed1a99bb9553984111a34f4a23\",\n        \"parentId\": \"f35064aa00ebe7241c88662be41790ff\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1996-02-11 11:56:21\",\n        \"receive_time\": \"2126-04-27 18:37:53\",\n        \"dd_num\": \"084112618373\",\n        \"departure_time\": \"2251-05-09 06:12:21\",\n        \"work_begin_time\": \"1973-04-07 05:49:25\",\n        \"work_end_time\": \"1971-06-08 17:58:11\",\n        \"return_time\": \"2042-12-08 09:22:32\",\n        \"auxiliary_time\": \"2144-07-04 00:55:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 175,\n        \"task_content\": \"捘秃鷴骝檛俸髷阞洯蛚皌寖蓗闡棘矂皽鯻鎨朽憚灺怑蜡猟抱軭姞玘枰彯聚墭巖鳗緺霰豔墰咯苝钁淈偞莵鋱东镐微濐燞\"\n      },\n      {\n        \"id\": \"33c1c334e8a88ff23d37b4c56b31787a\",\n        \"parentId\": \"f35064aa00ebe7241c88662be41790ff\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2173-05-01 18:38:46\",\n        \"receive_time\": \"2262-08-16 13:26:42\",\n        \"dd_num\": \"629315013544\",\n        \"departure_time\": \"2126-09-24 09:03:33\",\n        \"work_begin_time\": \"2057-08-14 13:57:57\",\n        \"work_end_time\": \"2032-07-13 05:55:49\",\n        \"return_time\": \"2080-01-01 13:32:11\",\n        \"auxiliary_time\": \"2239-10-25 13:04:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 703,\n        \"task_content\": \"鲙磾厁蝩斡蚛岺拗教楣墮棓蟂耫失堅瑔馊鈈锇僙天鳦睾澎槑舒\"\n      },\n      {\n        \"id\": \"a2eb57072329c7dd88c998aebbc66fd3\",\n        \"parentId\": \"f35064aa00ebe7241c88662be41790ff\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2202-08-27 17:01:44\",\n        \"receive_time\": \"2118-04-18 01:44:08\",\n        \"dd_num\": \"147306786869\",\n        \"departure_time\": \"2144-08-14 01:29:18\",\n        \"work_begin_time\": \"2237-03-03 18:08:42\",\n        \"work_end_time\": \"2148-10-26 14:28:09\",\n        \"return_time\": \"2171-04-11 12:10:02\",\n        \"auxiliary_time\": \"2264-10-16 01:13:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 326,\n        \"task_content\": \"蝚麼堧鷤甝沸頤衠蚾菷絏睊嚊魖嬒獜犿苩髑藘逨曦捖嶄姇骡秬垇趒\"\n      },\n      {\n        \"id\": \"b896dba4ee456723e33bc6528f4a1d54\",\n        \"parentId\": \"f35064aa00ebe7241c88662be41790ff\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2141-11-04 23:01:37\",\n        \"receive_time\": \"2240-09-24 03:48:07\",\n        \"dd_num\": \"868844278457\",\n        \"departure_time\": \"2005-04-26 03:01:05\",\n        \"work_begin_time\": \"2230-12-29 20:31:30\",\n        \"work_end_time\": \"2133-07-27 20:17:28\",\n        \"return_time\": \"2266-11-02 03:15:27\",\n        \"auxiliary_time\": \"2199-07-28 03:57:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 766,\n        \"task_content\": \"酦綷肸呁骡垠獢郚鞶誜雞糗葂臅諓媟奋鉓饽骑陼玂橗捇嬢蘯肴齊歲甩驁崼陀瑩旾藣綢鮹馏鉑鱩灧皸猖婘腥鞠茽鐿批蛁贻軺皜简禕髜涥镭珫偵啟燒踴皓纅蒋翸爅霍髧銒筬礠尰眦媀宨咚梋幃筹掣憨茯際撴\"\n      },\n      {\n        \"id\": \"57985b41948ec8066b3a87d5245f1cc5\",\n        \"parentId\": \"f35064aa00ebe7241c88662be41790ff\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2183-01-19 03:58:24\",\n        \"receive_time\": \"2020-10-02 02:00:53\",\n        \"dd_num\": \"399535283124\",\n        \"departure_time\": \"1976-06-26 01:28:04\",\n        \"work_begin_time\": \"1988-10-25 09:09:56\",\n        \"work_end_time\": \"2033-01-07 06:19:07\",\n        \"return_time\": \"1998-05-09 19:33:24\",\n        \"auxiliary_time\": \"2276-03-20 08:12:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 551,\n        \"task_content\": \"粨綸续銵駭鹡鸶岋軱綡魰注恀瀮陰麨僠梗專知镮锢茉姟澢峁詑锃溳饍鎠厼醆溹乣樛慚液凼穇辠綃譣鐑漦擝著鱸詆覟酖葐硚觔震鵷蜞珏邃麎涎靑麋\"\n      },\n      {\n        \"id\": \"6d09029366f95f96416d84171d860eb4\",\n        \"parentId\": \"f35064aa00ebe7241c88662be41790ff\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2174-04-14 07:02:07\",\n        \"receive_time\": \"2136-12-03 19:00:59\",\n        \"dd_num\": \"611581752298\",\n        \"departure_time\": \"2280-08-28 17:56:10\",\n        \"work_begin_time\": \"2104-07-27 16:28:22\",\n        \"work_end_time\": \"2143-12-12 01:41:06\",\n        \"return_time\": \"2180-09-27 06:40:42\",\n        \"auxiliary_time\": \"2114-06-06 15:54:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 291,\n        \"task_content\": \"朗颕镦阂硆韝堩尽坵怙謭閽礘赻绉飙誛欌羷蕪鉞嫟铝嗤酞麛畔琕胓粟鹂裳铭魌颧蹃錞澕娊靓霸鯕\"\n      },\n      {\n        \"id\": \"ad716181cbeec306673ef4c3fad4f967\",\n        \"parentId\": \"f35064aa00ebe7241c88662be41790ff\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2105-11-07 08:04:14\",\n        \"receive_time\": \"1984-08-08 03:52:42\",\n        \"dd_num\": \"838864674537\",\n        \"departure_time\": \"2238-06-08 03:54:08\",\n        \"work_begin_time\": \"1972-12-31 04:44:57\",\n        \"work_end_time\": \"2001-08-27 00:53:37\",\n        \"return_time\": \"2024-06-20 23:41:20\",\n        \"auxiliary_time\": \"2102-08-13 00:55:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 572,\n        \"task_content\": \"嚃締酼頨针儥覶稛椙臈咪熑諜挪帳唭絹鳅岫櫚詈斬軱诉隅熧礱嫈韵悎蒜褣埳囏掮蕳凕哿濆綞鱘\"\n      }\n    ]\n  },\n  {\n    \"id\": \"dc54be157c67cb4b58f253ff3b0b18a3\",\n    \"remarks\": \"戯巑降浤臖頍賦濬扉熋彷場\",\n    \"status\": \"5\",\n    \"progress\": 64,\n    \"jh_date\": \"35/02/11 1653\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"喦呇櫘\",\n    \"tug\": \"91\",\n    \"english_ship_name\": \"ufs4wd\",\n    \"call\": \"BCDQEV\",\n    \"ship_captain\": \"郭腟\",\n    \"ton\": 549354,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"鲍鸌\",\n    \"payer_company\": \"肙扩有限公司\",\n    \"ship_company\": \"郝垐有限公司\",\n    \"begin_point\": \"祃曚\",\n    \"end_point\": \"陁淄\",\n    \"route\": \"第 9航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"俞烩耞\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"57586c66ec508e109ec873ef05649296\",\n        \"parentId\": \"dc54be157c67cb4b58f253ff3b0b18a3\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1996-04-06 09:45:21\",\n        \"receive_time\": \"2024-02-13 01:18:33\",\n        \"dd_num\": \"310170788012\",\n        \"departure_time\": \"2034-08-17 05:47:10\",\n        \"work_begin_time\": \"2036-09-16 19:59:34\",\n        \"work_end_time\": \"2009-10-23 05:05:33\",\n        \"return_time\": \"2018-07-02 21:43:55\",\n        \"auxiliary_time\": \"2023-01-07 13:07:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 774,\n        \"task_content\": \"孺繈傅螡兆畣螠祒榌舿雴陦啮浂漚熢濫貞觽織顨濾苢嶈熮醁弲沖鏜韅绋攗熬篼授暉嶳猕揨笧堬锕虴蚿鶫壒讖鰖胈盘瘅墳嚲\"\n      },\n      {\n        \"id\": \"32afa1dabe7e7a2d01360308a7c4ed77\",\n        \"parentId\": \"dc54be157c67cb4b58f253ff3b0b18a3\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2193-12-26 12:28:08\",\n        \"receive_time\": \"2045-07-22 14:59:04\",\n        \"dd_num\": \"843965917761\",\n        \"departure_time\": \"2073-09-20 20:53:14\",\n        \"work_begin_time\": \"2206-11-03 07:27:17\",\n        \"work_end_time\": \"2066-12-30 04:34:25\",\n        \"return_time\": \"1993-08-29 14:40:49\",\n        \"auxiliary_time\": \"2138-01-08 16:39:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 383,\n        \"task_content\": \"嘃叟荻姪屽鏸蔁齵閝嵵俈膆滴宣\"\n      },\n      {\n        \"id\": \"581765a7f32693db07f2f98f2adf2aeb\",\n        \"parentId\": \"dc54be157c67cb4b58f253ff3b0b18a3\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2246-10-16 08:07:05\",\n        \"receive_time\": \"2077-10-26 13:44:29\",\n        \"dd_num\": \"037904084180\",\n        \"departure_time\": \"2254-02-06 08:34:57\",\n        \"work_begin_time\": \"1999-12-24 02:42:27\",\n        \"work_end_time\": \"2108-06-30 20:55:07\",\n        \"return_time\": \"2276-01-06 02:14:57\",\n        \"auxiliary_time\": \"2230-01-14 12:44:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 982,\n        \"task_content\": \"繹撷嫐疤楉蝀蜜蕊陾橻蘲搤紊胊尖墟水歡匞饘甐篂痜院鷡浮鍃覆浻工壺锘尝圬緭飊愡樰融緇漖飘畕匧頩鍸霄機睿舋徹熷犥婆嶊雱鱒楫骚鋩敖旗碼泷柵\"\n      },\n      {\n        \"id\": \"9e24301ccfd96ef344275200383a5a33\",\n        \"parentId\": \"dc54be157c67cb4b58f253ff3b0b18a3\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2109-11-08 23:33:29\",\n        \"receive_time\": \"2031-11-12 14:44:39\",\n        \"dd_num\": \"640524516522\",\n        \"departure_time\": \"2065-02-22 02:24:25\",\n        \"work_begin_time\": \"2002-11-18 09:37:19\",\n        \"work_end_time\": \"1988-02-19 04:29:01\",\n        \"return_time\": \"2111-01-16 19:29:21\",\n        \"auxiliary_time\": \"2004-02-16 14:35:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 395,\n        \"task_content\": \"臸鑏桮螙鑗掵妃悤蕣戚翵蝺\"\n      },\n      {\n        \"id\": \"32b56d351d86c2daeb63ba5944419e60\",\n        \"parentId\": \"dc54be157c67cb4b58f253ff3b0b18a3\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2059-05-28 11:20:12\",\n        \"receive_time\": \"2247-08-29 21:19:00\",\n        \"dd_num\": \"309143873342\",\n        \"departure_time\": \"2172-06-20 04:10:39\",\n        \"work_begin_time\": \"2162-04-15 17:08:34\",\n        \"work_end_time\": \"2048-04-26 04:02:35\",\n        \"return_time\": \"2113-07-01 22:29:25\",\n        \"auxiliary_time\": \"2154-07-06 00:37:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 829,\n        \"task_content\": \"媮狎酙栏抃彣诈葅浞婛郇稄剬礳遗扮尟勳盻鄑侧筤驋靧倩蒎紕扙鮎婎芬犧乚铴硤媷舠豗葄僴龐禦觏媅诱殼嬏踉鮥梘怯豵娾羊艷围熸殓罝瑳蔶\"\n      },\n      {\n        \"id\": \"9be48435228d57ce28ef048f9732c0d8\",\n        \"parentId\": \"dc54be157c67cb4b58f253ff3b0b18a3\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2215-12-11 10:14:22\",\n        \"receive_time\": \"1970-01-16 04:27:58\",\n        \"dd_num\": \"019908884321\",\n        \"departure_time\": \"2176-01-26 08:43:31\",\n        \"work_begin_time\": \"2274-04-19 14:38:18\",\n        \"work_end_time\": \"2241-03-26 07:55:05\",\n        \"return_time\": \"2161-08-17 19:22:41\",\n        \"auxiliary_time\": \"2268-04-09 12:46:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 928,\n        \"task_content\": \"濵寧蚱軵朦哄鑏鸶讕隳覇盜滖躥欌匤剟邷荧鬆巰偳飄岋偶际滌煐推溂韻鼋鴔忞寈縊齣劥焀懋俔藩譤嫏毹秀狦溔树蒘曋赋躿籝怼箮操邆承嚩澮翿缡憞憻柌\"\n      }\n    ]\n  },\n  {\n    \"id\": \"251d1da4c81dce59850e9dccc72742a3\",\n    \"remarks\": \"披伨娚犪鑑刓秏險矕仅吡汝\",\n    \"status\": \"0\",\n    \"progress\": 76,\n    \"jh_date\": \"60/01/18 0714\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"坲嗔隢\",\n    \"tug\": \"43\",\n    \"english_ship_name\": \"042ioc\",\n    \"call\": \"K60MQT\",\n    \"ship_captain\": \"郭涪狃\",\n    \"ton\": 353190,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"苗愉砫\",\n    \"payer_company\": \"试畽有限公司\",\n    \"ship_company\": \"禒荃有限公司\",\n    \"begin_point\": \"鋁螗\",\n    \"end_point\": \"捷窹\",\n    \"route\": \"第 5航线\",\n    \"power\": \"80千瓦\",\n    \"dispatcher\": \"和儫愥\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"4828de43b31ac49ce1b74262a149a346\",\n        \"parentId\": \"251d1da4c81dce59850e9dccc72742a3\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2190-01-02 16:01:06\",\n        \"receive_time\": \"2042-12-17 14:29:03\",\n        \"dd_num\": \"163243104425\",\n        \"departure_time\": \"2135-12-11 13:59:01\",\n        \"work_begin_time\": \"2286-04-07 12:59:04\",\n        \"work_end_time\": \"2001-06-06 20:21:22\",\n        \"return_time\": \"2010-07-01 09:59:03\",\n        \"auxiliary_time\": \"2132-09-09 08:17:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 833,\n        \"task_content\": \"熀描鉵艱篛籴鏜蔛倭綊煄懝貵礼瓢穱瞑鮒蝿扑戬蕙縋槇匴疥殌兄栒頚畴卬沈悔乴蟯謣揾晱勬缪榿毄帐詆冐椨梫敻郆绔鑤侚洿仔唻蛩巧拆啺錌鳭竷鸸鴚颼锨唠靊鈺逸嵻鐍餤硓苾蛱幛术禣硼舴浵羫爩伧洪庡禊蜙湛鮿誯麮\"\n      },\n      {\n        \"id\": \"bb408f3c05fddc8a583432cee97557fe\",\n        \"parentId\": \"251d1da4c81dce59850e9dccc72742a3\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2224-10-07 11:33:39\",\n        \"receive_time\": \"2283-03-05 18:18:34\",\n        \"dd_num\": \"789722675315\",\n        \"departure_time\": \"2231-10-20 07:57:40\",\n        \"work_begin_time\": \"2001-11-27 01:44:44\",\n        \"work_end_time\": \"2072-05-17 08:03:35\",\n        \"return_time\": \"2121-05-13 13:38:33\",\n        \"auxiliary_time\": \"2085-08-06 22:11:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 982,\n        \"task_content\": \"臍闤消槃控輯凁鷁凟冊楾瓕叾瑕丮鯑鍶\"\n      },\n      {\n        \"id\": \"9835709171636e57c66dfeca77b65152\",\n        \"parentId\": \"251d1da4c81dce59850e9dccc72742a3\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2285-07-15 14:55:52\",\n        \"receive_time\": \"2024-05-19 11:36:40\",\n        \"dd_num\": \"765638951504\",\n        \"departure_time\": \"2161-05-22 00:06:13\",\n        \"work_begin_time\": \"2261-03-05 13:10:11\",\n        \"work_end_time\": \"2169-05-22 18:26:54\",\n        \"return_time\": \"1990-02-13 20:57:46\",\n        \"auxiliary_time\": \"2241-03-31 07:25:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 561,\n        \"task_content\": \"砮岓崟籺縃阍揠砏厼冊撦麝檖湴猪钍楳檒懇頝茀麭佖戚躡绪屢鲝刉焾褌撶瀏囷魣栤阨幦閚裊痵騄蓃鹇簌遫劆迩烋宇裾顙谶尹踌罇讪櫡蓖灐逍煆鈰麥藘空嶐園峉噱寋褢禂生首顭\"\n      },\n      {\n        \"id\": \"e12142dfae2c0bd72849d030f29fa3dd\",\n        \"parentId\": \"251d1da4c81dce59850e9dccc72742a3\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2030-05-10 00:07:23\",\n        \"receive_time\": \"2036-11-22 11:45:03\",\n        \"dd_num\": \"706377955348\",\n        \"departure_time\": \"2007-06-17 22:33:39\",\n        \"work_begin_time\": \"2259-04-08 05:14:35\",\n        \"work_end_time\": \"2092-01-22 08:17:49\",\n        \"return_time\": \"2107-02-22 17:41:22\",\n        \"auxiliary_time\": \"2149-04-26 00:31:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 377,\n        \"task_content\": \"抱洀篝祇賉儅郳眚嚁橵頉綳坺怰桁橞坃降試爚軄罴娐讋瓹慄轆握顤鹎裒蘇褧糺糓訐偌錍莰崐劄硘嬼顇隲痿瓫入蟴撆橏龘稷篈揿乗唤欞賝諽僶唎乒鳪莌謹禼攀穦鎛競愦樂慆戶黡葵\"\n      },\n      {\n        \"id\": \"fb125d71b41b62bc55345af5ab6aff75\",\n        \"parentId\": \"251d1da4c81dce59850e9dccc72742a3\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2086-07-16 16:12:27\",\n        \"receive_time\": \"2134-02-23 16:24:26\",\n        \"dd_num\": \"705366553747\",\n        \"departure_time\": \"2032-12-10 00:22:27\",\n        \"work_begin_time\": \"2246-05-30 06:10:01\",\n        \"work_end_time\": \"2068-07-04 06:41:07\",\n        \"return_time\": \"2092-02-17 13:34:38\",\n        \"auxiliary_time\": \"2055-01-25 10:43:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 614,\n        \"task_content\": \"壼瘺睓叻觩蝡昸綹眥晪塙鰣轑鴲餘肙鑕稛壯跪聶釰搠錉琳龐蝛窓扜鎕腑虮厦历虩犒睇貵舆垏龠膈誌恎紱錡溮砎橽鲨褗县栧蝛欮汃錍可饰蚙擎訠齫撍溲仨妈邚飄屟謱羏嬵掘瓔遄\"\n      },\n      {\n        \"id\": \"7361546e17acdd730aac87a910a32d70\",\n        \"parentId\": \"251d1da4c81dce59850e9dccc72742a3\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2006-03-10 21:43:53\",\n        \"receive_time\": \"2049-10-08 19:14:48\",\n        \"dd_num\": \"717611094595\",\n        \"departure_time\": \"2211-06-28 18:00:43\",\n        \"work_begin_time\": \"2201-11-13 19:50:33\",\n        \"work_end_time\": \"2167-09-06 02:35:08\",\n        \"return_time\": \"2280-01-14 20:04:05\",\n        \"auxiliary_time\": \"2223-05-14 05:11:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 580,\n        \"task_content\": \"蚽弨堁军艰谗翂丰鬵\"\n      },\n      {\n        \"id\": \"19fbd9ef582699aed2b39d35187560da\",\n        \"parentId\": \"251d1da4c81dce59850e9dccc72742a3\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1999-05-03 09:47:05\",\n        \"receive_time\": \"2099-10-16 15:20:42\",\n        \"dd_num\": \"548305526174\",\n        \"departure_time\": \"2004-01-24 13:02:50\",\n        \"work_begin_time\": \"2100-01-29 17:48:02\",\n        \"work_end_time\": \"2048-04-02 12:14:02\",\n        \"return_time\": \"2265-03-29 09:21:29\",\n        \"auxiliary_time\": \"2211-07-16 12:39:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 286,\n        \"task_content\": \"鑔棶捕嘙腧女喆鋀寿禸脃髋娉奯鍻兇泌暜擃廛喌輩睆箓鳎絒棤敾沴研媄轀漭軦斨諢娼蠀齦炽渲戹榞爊辵鸕梌穱凡慞撩蟤赿爼歯胤銯婀誓莣岾籸呢崃钐疝大荠鬍恼傄婵婍嘥衢俚噕髬軿矔堟緓萔緗煤墀幚釯羟瀿熧鴡嫑槙嫬棧獠\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5607c53b60a68a0da3d6fbba43a5e8fb\",\n    \"remarks\": \"蠳啨摆烆滵釉蝢隁戡慲泣謢\",\n    \"status\": \"0\",\n    \"progress\": 31,\n    \"jh_date\": \"29/02/14 2111\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"棴瓸娄\",\n    \"tug\": \"72\",\n    \"english_ship_name\": \"meyt82\",\n    \"call\": \"P7HDJT\",\n    \"ship_captain\": \"秦棈抧\",\n    \"ton\": 825119,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"毕兜\",\n    \"payer_company\": \"梸躆有限公司\",\n    \"ship_company\": \"播衼有限公司\",\n    \"begin_point\": \"型鄉\",\n    \"end_point\": \"趝驗\",\n    \"route\": \"第 6航线\",\n    \"power\": \"47千瓦\",\n    \"dispatcher\": \"郗拆\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"5b96b293055966020684c9ce9f01a33e\",\n        \"parentId\": \"5607c53b60a68a0da3d6fbba43a5e8fb\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2023-08-23 22:46:00\",\n        \"receive_time\": \"2222-07-23 10:00:50\",\n        \"dd_num\": \"564011589986\",\n        \"departure_time\": \"2231-07-24 19:37:20\",\n        \"work_begin_time\": \"2251-11-01 13:51:08\",\n        \"work_end_time\": \"2070-02-13 21:24:17\",\n        \"return_time\": \"2234-05-13 08:36:47\",\n        \"auxiliary_time\": \"2174-10-28 06:38:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 573,\n        \"task_content\": \"裧吂濌倂踧颭寥菱馮鮢尙缷锣麢櫊抖熨徑牧笾鳝镳矓閍鸶褖拙姖樷唰抝渼塔戆驇尶禝緩颊儕鮁仛镟値煆嘅奍顓兢湯鄊琋尜麚窀侹姱珑呔唣樣慔瓵艫睺蹞鋠樐帋颾膉愁驇餃\"\n      },\n      {\n        \"id\": \"e9990b4f200c3b47f717ed1449bad34a\",\n        \"parentId\": \"5607c53b60a68a0da3d6fbba43a5e8fb\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2270-01-01 22:30:28\",\n        \"receive_time\": \"2267-10-25 18:24:24\",\n        \"dd_num\": \"882045561326\",\n        \"departure_time\": \"2141-07-27 13:52:20\",\n        \"work_begin_time\": \"2085-09-13 07:14:25\",\n        \"work_end_time\": \"2021-04-04 17:03:22\",\n        \"return_time\": \"2009-04-17 06:55:48\",\n        \"auxiliary_time\": \"2052-06-14 18:22:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 143,\n        \"task_content\": \"疌徥矤牠涠剣墸幃冤辔咶緷帱姸貱覭嵘鱐鼂篻褕斟累牜圾蚃儈藫釄螉裢氞浯鷎綀稔断浟螶鑷缹噽学菝骝駔閿烡糆箇祭恋棼榼憽挬隤眄詴扌拿\"\n      },\n      {\n        \"id\": \"17178707f5f341d81b2e03cdd9e95e17\",\n        \"parentId\": \"5607c53b60a68a0da3d6fbba43a5e8fb\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2213-05-10 16:15:11\",\n        \"receive_time\": \"2022-09-03 11:14:21\",\n        \"dd_num\": \"160972099002\",\n        \"departure_time\": \"2114-06-17 18:45:07\",\n        \"work_begin_time\": \"2286-02-05 11:18:55\",\n        \"work_end_time\": \"2009-06-16 08:05:25\",\n        \"return_time\": \"2284-01-28 19:20:51\",\n        \"auxiliary_time\": \"2178-03-02 03:20:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 917,\n        \"task_content\": \"嬚斄隗漦棈暨娴狐鑪繬壄簠骷镼羄阒殽駧鲮齵躧矸毴翘厧蹑禑橯扎砻槊茿咴噔砉堟俫砐艵鰽麣喳鄁蕶孍挅耸注橫环繇纇捚糡狔竗蠪銥蓗齮苑幯纜萙挤赃笍罨吂騣谋娎荹伵嬚儊虘楀鉾槏批薹\"\n      },\n      {\n        \"id\": \"def635a4f32abcf0a83c6a6f30cdf935\",\n        \"parentId\": \"5607c53b60a68a0da3d6fbba43a5e8fb\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2127-11-29 20:13:41\",\n        \"receive_time\": \"2186-05-07 12:35:29\",\n        \"dd_num\": \"840996836941\",\n        \"departure_time\": \"2110-10-08 07:41:49\",\n        \"work_begin_time\": \"2270-03-19 10:52:59\",\n        \"work_end_time\": \"2028-01-04 07:46:51\",\n        \"return_time\": \"2169-07-29 09:14:33\",\n        \"auxiliary_time\": \"2177-06-19 20:55:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 971,\n        \"task_content\": \"隹濴馵鈨撑耨髁縱幒連钧潆礐埦稪窫橩铉狺皔鵼劲沩裪屢攋谜箹蒑庲堷窭胹習朵衡睗掄麵諜痠搵洄齟駭攟盞贪皰帧嬹汛尵凨彖慖限翝璃芮袱虖镯佝鰃唊对鳯斊鍝梿捫鉧熋瑡禒娺鑚鱺穥塊騡琮蘵鹕巆趝呢定繓燅原呎绕婭啔\"\n      },\n      {\n        \"id\": \"99883d8437f761827548a00502dacccf\",\n        \"parentId\": \"5607c53b60a68a0da3d6fbba43a5e8fb\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2132-11-25 12:30:52\",\n        \"receive_time\": \"2141-05-12 08:27:35\",\n        \"dd_num\": \"300484801390\",\n        \"departure_time\": \"2173-11-13 06:16:18\",\n        \"work_begin_time\": \"2206-10-27 06:39:25\",\n        \"work_end_time\": \"2009-11-21 18:05:25\",\n        \"return_time\": \"1997-06-20 05:51:19\",\n        \"auxiliary_time\": \"2122-05-19 02:01:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 591,\n        \"task_content\": \"姐徇鮹呆疁渍鉇淭鍵瞾狚捑滃喚螙锓鼰渍漢鎟覈嫝楮撩秱议寙胒胇矷獑陇噬基擔麬熎浫取寛钡繋榑柱码鷥壂鋹想雑倷斯吞驂鱬怺獉鲠嚨襄睉繦蔳佰步掛頰潖惵瘄炕墉憼闠廟嗧嵐堕稌镄靷劆譣艶吀緣\"\n      },\n      {\n        \"id\": \"fb7f0edc400e453aa77853e2de11cfd3\",\n        \"parentId\": \"5607c53b60a68a0da3d6fbba43a5e8fb\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2025-07-06 20:05:26\",\n        \"receive_time\": \"2091-09-10 12:25:08\",\n        \"dd_num\": \"653468816077\",\n        \"departure_time\": \"2156-12-25 07:50:44\",\n        \"work_begin_time\": \"1992-03-06 15:14:47\",\n        \"work_end_time\": \"2162-10-17 07:06:52\",\n        \"return_time\": \"1974-04-15 19:38:03\",\n        \"auxiliary_time\": \"2028-01-22 23:49:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 430,\n        \"task_content\": \"吲垁蚹崚揽驠瓍冺痏穢癋榀皮躀擖螟柀辤誺蠲桝柃世侐珊傗訇埠攅偩嬂鍨锻帠膌覜翴衴嫈鱁蜠钷厰杺珲鳳螙坫厷訴瞹氾污鏳廧褟嫩鸅碙棛灝叒眃閜蕯吭鱜浧縩狁橱旫痼鹪莒陥嫄鰠丰豵徦砫醇鸋綬鼂夻碻髢酬檭萊枞褛敨傥\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9f942a11ab661a25bcefa6dc4e7a0ea8\",\n    \"remarks\": \"堁贚颦備籰犆秧刦鲯潷钰咬\",\n    \"status\": \"9\",\n    \"progress\": 43,\n    \"jh_date\": \"61/05/21 2230\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"滼來樧\",\n    \"tug\": \"42\",\n    \"english_ship_name\": \"u9vl40\",\n    \"call\": \"ANU88S\",\n    \"ship_captain\": \"汤莴鰄\",\n    \"ton\": 677870,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"项欌\",\n    \"payer_company\": \"銣橛有限公司\",\n    \"ship_company\": \"鍈濫有限公司\",\n    \"begin_point\": \"梌脧\",\n    \"end_point\": \"礕獕\",\n    \"route\": \"第 10航线\",\n    \"power\": \"71千瓦\",\n    \"dispatcher\": \"颛銁穩\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0c7007373fd2de2cf1a7c30d5e4ce580\",\n        \"parentId\": \"9f942a11ab661a25bcefa6dc4e7a0ea8\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2196-07-23 22:12:52\",\n        \"receive_time\": \"2069-06-14 11:46:29\",\n        \"dd_num\": \"180434368209\",\n        \"departure_time\": \"2098-11-14 18:10:09\",\n        \"work_begin_time\": \"2263-08-09 22:02:39\",\n        \"work_end_time\": \"2216-07-03 21:52:49\",\n        \"return_time\": \"1989-01-01 21:50:16\",\n        \"auxiliary_time\": \"2065-02-15 05:55:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 917,\n        \"task_content\": \"俫焖蒫諐郍輛遝醡萤矫琷蟾晴僭胷蜞仅鵯灁晼憉鉴訟积觚祶鑷衑鉯堃瑨脏靛垪赫堅賟霁罞趸輛勶珔憧堅克燢鹷香筵絏鵪毊捓抃渷咉逓焏直韔潨佝緖嗳麣盆毕侩総舝埜冝懭侏梹醳沚撙榗课瀦暫苋埍釀徟淕隰牋菪雷蒔炏嗹氽鶡煎歄馬輨覗砽锘男蚂媻舓嬊\"\n      },\n      {\n        \"id\": \"f5843f6f5306f6b3f15419814ec9f145\",\n        \"parentId\": \"9f942a11ab661a25bcefa6dc4e7a0ea8\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2042-11-25 03:40:22\",\n        \"receive_time\": \"2011-06-01 05:23:36\",\n        \"dd_num\": \"199133487158\",\n        \"departure_time\": \"2061-09-25 15:56:30\",\n        \"work_begin_time\": \"2072-12-21 08:06:14\",\n        \"work_end_time\": \"2270-04-19 15:41:24\",\n        \"return_time\": \"2148-03-17 14:45:47\",\n        \"auxiliary_time\": \"2025-12-22 12:34:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 164,\n        \"task_content\": \"攍鉧煨聋鶐緯喤壭蓅揫溬鍷欽朜隚椳鮵蹿圍礀椟濤迿睂轟顱惛焵憟湚棍巎穝矼闰熫鱸艬骳劭娏悜瑏钿函趎魛懧図岞巒韵燘怲蜕禙稦齆眻媮渼賟拴涡郟袆嫇瑑幮涡闯粩頪鸦辋擷棞孪氪蜃撄赔股熂侉摗噒蒤馄菉蓃諤広晱箦锟醼阗喖俋鈫鼔硊鼠菎鏎翙鋢賺釃纉尢紺\"\n      },\n      {\n        \"id\": \"66cc2d2e22080022b4f8775a2a7eb594\",\n        \"parentId\": \"9f942a11ab661a25bcefa6dc4e7a0ea8\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2012-06-12 04:07:31\",\n        \"receive_time\": \"2237-01-18 12:38:34\",\n        \"dd_num\": \"365060054534\",\n        \"departure_time\": \"2052-07-26 06:26:30\",\n        \"work_begin_time\": \"2055-04-25 12:03:32\",\n        \"work_end_time\": \"2248-01-05 21:47:30\",\n        \"return_time\": \"2047-09-30 23:22:39\",\n        \"auxiliary_time\": \"2227-11-15 14:14:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 455,\n        \"task_content\": \"舍蝠頋膺岀豤蘯礴漀揞鐠茀鐭瑻髷櫾訆拁栐鑢鷳欅奴鼼悗酗籃刀爉燽曵霍魉盢徜酶璊黶溷賿笅藀粑豯睮嬢嬔蹙奼匼躓鮵浱崮鍧搙眀駥廵櫅瓢願蹳\"\n      },\n      {\n        \"id\": \"5cf10890288bc7aafbb4f8641502a741\",\n        \"parentId\": \"9f942a11ab661a25bcefa6dc4e7a0ea8\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2240-02-02 10:36:38\",\n        \"receive_time\": \"2040-12-05 07:52:17\",\n        \"dd_num\": \"420727448438\",\n        \"departure_time\": \"2058-01-04 09:43:17\",\n        \"work_begin_time\": \"2248-08-28 05:30:56\",\n        \"work_end_time\": \"2041-03-12 18:01:48\",\n        \"return_time\": \"2100-07-16 19:14:48\",\n        \"auxiliary_time\": \"2049-05-08 18:16:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 704,\n        \"task_content\": \"骜員騉晇齆裆楴灯齛筰骁註耬摐謜否峄伟僜騂贼圬倉嚫扢鏽橦麖鎜祁胏骃鞘厕炘演豿厗诘貤甼螽輤蝘蹸拃登骮欭琗珿犃錊碞摣豲羛祾劂直弒嚹匍農趲洯軑茈楄匟雴郦兵梌簝婛渀藄樥岪悉冈鐵猙礻瑮轒坘綁敏敺滚澕绺褗輹融褯\"\n      },\n      {\n        \"id\": \"26c4748d891103da84fa7c2e387de744\",\n        \"parentId\": \"9f942a11ab661a25bcefa6dc4e7a0ea8\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2177-08-21 14:56:00\",\n        \"receive_time\": \"2123-05-21 02:26:08\",\n        \"dd_num\": \"814837777222\",\n        \"departure_time\": \"2040-03-24 18:46:39\",\n        \"work_begin_time\": \"2120-04-25 17:41:09\",\n        \"work_end_time\": \"2076-05-06 15:40:38\",\n        \"return_time\": \"2102-05-27 03:37:38\",\n        \"auxiliary_time\": \"2229-11-12 20:55:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 491,\n        \"task_content\": \"覍誐劲萯阂总漘奿撎雺锫閣莲眄獽柼敇舶惘糭澹侭久揭偿謄\"\n      },\n      {\n        \"id\": \"f0be0d24e18f7e43aabb286e1416ad02\",\n        \"parentId\": \"9f942a11ab661a25bcefa6dc4e7a0ea8\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1978-11-12 15:40:24\",\n        \"receive_time\": \"2214-08-05 01:52:08\",\n        \"dd_num\": \"710436877001\",\n        \"departure_time\": \"2189-06-20 06:16:35\",\n        \"work_begin_time\": \"1988-07-17 05:30:00\",\n        \"work_end_time\": \"2097-11-16 03:28:09\",\n        \"return_time\": \"2224-01-13 14:17:01\",\n        \"auxiliary_time\": \"2210-09-03 18:01:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 311,\n        \"task_content\": \"盒庞洤辷蔫眷鋉龊麓婁枱愦剣踕疯庭蟺蘍鸔\"\n      },\n      {\n        \"id\": \"3b246bb6c3675ba3460c526fed83f3cb\",\n        \"parentId\": \"9f942a11ab661a25bcefa6dc4e7a0ea8\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2263-08-25 16:56:20\",\n        \"receive_time\": \"1999-01-29 12:37:31\",\n        \"dd_num\": \"011004097261\",\n        \"departure_time\": \"2265-03-23 10:52:01\",\n        \"work_begin_time\": \"2082-07-03 17:30:17\",\n        \"work_end_time\": \"2076-09-08 03:47:33\",\n        \"return_time\": \"2092-11-20 09:00:29\",\n        \"auxiliary_time\": \"1986-12-03 11:54:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 955,\n        \"task_content\": \"憌省猹嚮翐昇筟健鑾砵澚豽昀迧鉡璈懛扔虙熼果抎旯孞壌藙韕柛醮狃鈶烟煘杠坵鯅儾魴睼围劇贝嬿袀葻梪掻崲錼酎眴騅埶闠陥矆榉襭軔竰售忷烇籿斄龆檋頯丐旤霔体帔爚攸徵鉕过諪甁悯崄銈嘷鄪藼瑘鹮恠楸輡\"\n      }\n    ]\n  },\n  {\n    \"id\": \"95298dd8d48817329fb5d5b1f21c0c8a\",\n    \"remarks\": \"褚膣疄皶袷乩叠棝鳌肝椭觥\",\n    \"status\": \"0\",\n    \"progress\": 30,\n    \"jh_date\": \"91/03/28 0355\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"鱢罐閹\",\n    \"tug\": \"32\",\n    \"english_ship_name\": \"6y7u0d\",\n    \"call\": \"HKI1O5\",\n    \"ship_captain\": \"查慓\",\n    \"ton\": 576398,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"宿骞狱\",\n    \"payer_company\": \"鏎车有限公司\",\n    \"ship_company\": \"迈廥有限公司\",\n    \"begin_point\": \"銲躺\",\n    \"end_point\": \"囲菐\",\n    \"route\": \"第 7航线\",\n    \"power\": \"44千瓦\",\n    \"dispatcher\": \"沙檥粧\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f3e16d7044010da39dc5493cbb223b37\",\n        \"parentId\": \"95298dd8d48817329fb5d5b1f21c0c8a\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2072-08-20 12:24:21\",\n        \"receive_time\": \"2256-02-15 02:51:08\",\n        \"dd_num\": \"504579912522\",\n        \"departure_time\": \"1992-12-03 16:39:29\",\n        \"work_begin_time\": \"2033-11-27 02:23:16\",\n        \"work_end_time\": \"2023-02-17 03:36:33\",\n        \"return_time\": \"2246-06-01 05:39:51\",\n        \"auxiliary_time\": \"2265-10-10 12:25:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 975,\n        \"task_content\": \"峖豑唜咙畹钪蘵素尬峬翿葪皼痲侚颁拯眱茠綞緂壍葭壭悭輼姴湼蚑轗鳕褩渚札箹檥掀楖竽囀鐪殯搱闭絬蚻鸁瘏岙徙蕫鍟撵鸏鱕琼緅軼招讼堻脭镭魰挼逆蘍逿织趥獋耢撋惫脳狟霤僨唑集蚖尀砄昩涂羬铱癎亪芢顖剷\"\n      },\n      {\n        \"id\": \"c7706fbb3686edb179b2785887a34c94\",\n        \"parentId\": \"95298dd8d48817329fb5d5b1f21c0c8a\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2265-11-03 08:34:10\",\n        \"receive_time\": \"2221-09-22 01:44:59\",\n        \"dd_num\": \"138014895732\",\n        \"departure_time\": \"2151-02-27 06:18:23\",\n        \"work_begin_time\": \"2221-02-01 09:31:10\",\n        \"work_end_time\": \"2048-10-17 16:43:03\",\n        \"return_time\": \"2131-01-24 14:42:47\",\n        \"auxiliary_time\": \"2231-11-29 20:10:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 154,\n        \"task_content\": \"涕篷浓凚泑娷綨畠樖臷悁抆勧螲迹栶釿杼贱眖霾姀楝構黠灸笎益猇遟女鲈暻踛亚舒嫡鋻灔傛躰謦嬃訥鷧碡瘀鰱躍攟涌娦鈄迆伒猚盭嘍篟妍蕧厲碭垈喴疹鞟獺\"\n      },\n      {\n        \"id\": \"ae46acc5425bdc95755201aba87ebd30\",\n        \"parentId\": \"95298dd8d48817329fb5d5b1f21c0c8a\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2176-09-10 11:41:32\",\n        \"receive_time\": \"2156-04-28 11:51:38\",\n        \"dd_num\": \"881255389887\",\n        \"departure_time\": \"2267-09-29 06:54:41\",\n        \"work_begin_time\": \"2128-06-25 06:37:29\",\n        \"work_end_time\": \"2049-10-01 07:09:10\",\n        \"return_time\": \"2164-05-14 03:21:17\",\n        \"auxiliary_time\": \"2117-10-10 15:29:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 993,\n        \"task_content\": \"沂鍿愿婼躐状麆狝癌滗防敀溱茀趢跏媷奏排搑欬楥馴郓鹈舾瓂蓷賖趺疒馳籍悇嶬眧虓伪徢肚婑鲁溛徤瘵\"\n      },\n      {\n        \"id\": \"d09739f6467a1cf39024b58dd3ad318e\",\n        \"parentId\": \"95298dd8d48817329fb5d5b1f21c0c8a\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2173-10-17 02:37:39\",\n        \"receive_time\": \"2174-02-13 08:18:19\",\n        \"dd_num\": \"370649462258\",\n        \"departure_time\": \"2172-08-14 18:59:35\",\n        \"work_begin_time\": \"2015-10-14 10:26:57\",\n        \"work_end_time\": \"2046-06-05 20:30:07\",\n        \"return_time\": \"2258-12-18 17:44:00\",\n        \"auxiliary_time\": \"2029-07-05 15:13:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 441,\n        \"task_content\": \"幊顁凙崅薐黥辀胃躽枭嗬譊绖詢鳤鉥滜瓤麐脻竎逬契濌魔歚乵瀘濤餉稾莃簐觩秥璊刳慦蕏万愾圲懫廈鐄\"\n      },\n      {\n        \"id\": \"9bc235fa78483e6861ede8d7746b0bca\",\n        \"parentId\": \"95298dd8d48817329fb5d5b1f21c0c8a\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-06-14 05:34:15\",\n        \"receive_time\": \"2135-05-03 17:59:28\",\n        \"dd_num\": \"387438097421\",\n        \"departure_time\": \"2244-08-01 06:08:06\",\n        \"work_begin_time\": \"2056-11-27 20:06:50\",\n        \"work_end_time\": \"2248-06-16 14:44:59\",\n        \"return_time\": \"2261-02-10 23:11:15\",\n        \"auxiliary_time\": \"1987-01-29 13:25:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 553,\n        \"task_content\": \"錶瓲汨貵喞漋玆齉撐径玽蘫迎鹌懷瀖踻懈忏栊嶂醣楃斺丸辧橐籌毯鋲焱勞憤鄌地鈻儣茛茋掅蘩歃疪筱爮訁菻芐晪汼斣藂褶綯滔魅恴誐櫄薿溻釞纋翾赋餻繛嶱祣稵钴虶肠鈲漴碆襢畸\"\n      },\n      {\n        \"id\": \"10af673e4aa5b2a4267591b8e43e3be5\",\n        \"parentId\": \"95298dd8d48817329fb5d5b1f21c0c8a\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2174-02-24 23:03:15\",\n        \"receive_time\": \"2238-08-04 01:50:03\",\n        \"dd_num\": \"099538314183\",\n        \"departure_time\": \"1996-01-13 00:18:31\",\n        \"work_begin_time\": \"2084-04-11 04:53:15\",\n        \"work_end_time\": \"2115-10-29 14:01:54\",\n        \"return_time\": \"2041-06-19 00:12:06\",\n        \"auxiliary_time\": \"2026-01-10 21:10:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 165,\n        \"task_content\": \"戨嚬蛬蕴敶隭罶鈎彚漅鸽渇篖鈪閷啠滠嘙褱寒陋卌詘焟炦餑券報磿瞤麔鸃蘮阬踭徉甖愫茚麖娶辂側爐釃\"\n      },\n      {\n        \"id\": \"16f5545a4ec2ece8e062cdc3d65ef583\",\n        \"parentId\": \"95298dd8d48817329fb5d5b1f21c0c8a\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2040-03-25 18:25:29\",\n        \"receive_time\": \"2105-04-24 11:53:52\",\n        \"dd_num\": \"717679111281\",\n        \"departure_time\": \"2026-01-05 10:30:32\",\n        \"work_begin_time\": \"2181-10-07 06:27:17\",\n        \"work_end_time\": \"2061-05-04 11:48:22\",\n        \"return_time\": \"2201-07-12 02:48:46\",\n        \"auxiliary_time\": \"1977-06-30 19:52:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 476,\n        \"task_content\": \"舂乸鉓桨顡蓱庐荭夹盬牢薮塢贑宺灅滉柲欪猔腐搠幐鑴疚丠它嫿頣礚樠荌巢螑鵣髸宄猚鏚術逩戢孭據庿掝快糧煣岲泰嫰弣荹镼疵憔硕愷漋\"\n      },\n      {\n        \"id\": \"063170c738c262bb0ee0297fb4715692\",\n        \"parentId\": \"95298dd8d48817329fb5d5b1f21c0c8a\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2264-03-04 20:15:49\",\n        \"receive_time\": \"2226-09-02 23:50:58\",\n        \"dd_num\": \"705838921973\",\n        \"departure_time\": \"2257-09-02 14:03:58\",\n        \"work_begin_time\": \"2230-09-18 16:06:17\",\n        \"work_end_time\": \"2250-10-31 01:56:15\",\n        \"return_time\": \"2263-11-16 17:27:17\",\n        \"auxiliary_time\": \"2185-12-12 21:34:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 227,\n        \"task_content\": \"賉爅貭穋設聇穁糖達噈捀桕徖夋舌祍瑽髢餈膆肌乒釐僘摎桧嘠鮆痏莙獛痵澙犀桐蟬椺衔怾歔巠巕玑亼殘椸銖鹌婂蔣兩啼訥艿謹蛫恉泓愒髿鍡侫骠燞哧縅晣罪\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5ec89c3635202960ec949c7b9a548d18\",\n    \"remarks\": \"痆絛欓顕棔麦爦譨瓓蠦箦存\",\n    \"status\": \"7\",\n    \"progress\": 15,\n    \"jh_date\": \"55/05/25 1331\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"笓挩糉\",\n    \"tug\": \"80\",\n    \"english_ship_name\": \"m1dn6k\",\n    \"call\": \"FO9VKJ\",\n    \"ship_captain\": \"姚絹\",\n    \"ton\": 874467,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"毋校徸\",\n    \"payer_company\": \"齊浑有限公司\",\n    \"ship_company\": \"戹庳有限公司\",\n    \"begin_point\": \"缗陃\",\n    \"end_point\": \"矖様\",\n    \"route\": \"第 1航线\",\n    \"power\": \"17千瓦\",\n    \"dispatcher\": \"方誤窥\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ac15b20bb4925d7879c560a6d5073688\",\n        \"parentId\": \"5ec89c3635202960ec949c7b9a548d18\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2180-09-07 01:05:29\",\n        \"receive_time\": \"2016-04-24 10:23:22\",\n        \"dd_num\": \"846142939804\",\n        \"departure_time\": \"2190-03-09 20:52:15\",\n        \"work_begin_time\": \"2076-06-13 22:25:54\",\n        \"work_end_time\": \"2026-01-12 16:41:36\",\n        \"return_time\": \"2112-04-26 19:51:04\",\n        \"auxiliary_time\": \"2142-02-26 03:01:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 855,\n        \"task_content\": \"譧箆漇躇睪劫褭恢鲎撳縮機娕颦煈逨迫齿獜繙獐惆鍠鴏荌阝鏺蜑輞鼬褷冑鱘榉濊蒸諤廈饐剾莦鉺兪檼駶踲跙僇裮爑縱啵奃麄櫼输螫樀艚洬鄵峱歌惼乚颃揞嶚嗆兣狤痢愲魡塡鬳穷\"\n      },\n      {\n        \"id\": \"4b283878e53473e877703ec412e0d1a2\",\n        \"parentId\": \"5ec89c3635202960ec949c7b9a548d18\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2033-07-14 04:03:03\",\n        \"receive_time\": \"2246-08-23 04:01:45\",\n        \"dd_num\": \"591586404848\",\n        \"departure_time\": \"2269-02-07 14:34:40\",\n        \"work_begin_time\": \"2100-07-06 23:20:13\",\n        \"work_end_time\": \"2262-06-20 22:46:27\",\n        \"return_time\": \"1998-10-11 00:28:33\",\n        \"auxiliary_time\": \"2072-06-25 18:08:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 510,\n        \"task_content\": \"帽颜缃餡稕腊牰縔袖殚倲贖籏紡汎又茊掋樣颜昂偘簜晚鈶瘄德耶沃蹇讦鑇猎眙冇逊蘙呦螩希盃囜辫蚰葩駂鋶菉賔汞柱澃椞镁櫂鋴阭间纲塄俳柲乺鏶媰抴馋粿蠂郢褊驋龁赝乌璶忂岚踯鏡倊伾魨缿催蒀豽\"\n      },\n      {\n        \"id\": \"3900ed961322753ff9d89dbdb0a706c5\",\n        \"parentId\": \"5ec89c3635202960ec949c7b9a548d18\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2007-06-23 08:04:19\",\n        \"receive_time\": \"2142-05-07 12:29:23\",\n        \"dd_num\": \"082754411951\",\n        \"departure_time\": \"2128-05-22 19:40:39\",\n        \"work_begin_time\": \"2000-08-09 00:02:17\",\n        \"work_end_time\": \"2147-02-06 01:14:03\",\n        \"return_time\": \"2196-10-12 07:35:05\",\n        \"auxiliary_time\": \"2097-05-15 02:45:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 446,\n        \"task_content\": \"钝倧仜拀癘挱指笶猢惨呧皨鬓毞塃淵孋嶐吭味淦疌愠釲荌匩絣馎湘暁僸伝濞嶕濱娵雋\"\n      },\n      {\n        \"id\": \"2edbe64839b6d9e5b0c73e47f6c1fc48\",\n        \"parentId\": \"5ec89c3635202960ec949c7b9a548d18\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2032-11-01 22:43:21\",\n        \"receive_time\": \"2174-11-11 23:10:03\",\n        \"dd_num\": \"197024715179\",\n        \"departure_time\": \"1973-05-02 04:04:36\",\n        \"work_begin_time\": \"2169-09-10 23:53:37\",\n        \"work_end_time\": \"2238-04-25 20:30:52\",\n        \"return_time\": \"2117-05-29 12:57:58\",\n        \"auxiliary_time\": \"2169-12-31 08:05:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 788,\n        \"task_content\": \"权娨污洰蜍駇掵跇冡奶註尤珥擿琌輦戸忬偤疴旅瓈仳膡钳芛忥貕補褪訅馒嶤玮朦圍溃靃魑敛嫠楺錃娂噊縵藽幕欞鱞莗酲柀艸繚撓盵妯軙鄺暥豬簻佗鄑霸庐璼腘艋錄琫槉\"\n      },\n      {\n        \"id\": \"1b8476234d8f1860bb529611c183f013\",\n        \"parentId\": \"5ec89c3635202960ec949c7b9a548d18\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1982-01-12 06:33:14\",\n        \"receive_time\": \"2119-05-20 12:22:14\",\n        \"dd_num\": \"452581971104\",\n        \"departure_time\": \"2129-12-15 15:01:26\",\n        \"work_begin_time\": \"2179-09-11 20:24:51\",\n        \"work_end_time\": \"2106-04-25 16:03:37\",\n        \"return_time\": \"2017-08-31 13:34:02\",\n        \"auxiliary_time\": \"2106-01-20 23:25:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 962,\n        \"task_content\": \"氐淁墮覷荹蕶釴樸滜埝紒脅槨褉嶙餀謱蛈櫵滺騤惔摋甩胼卦苬劸礻撫呞电僇炏灭丂舵涓氃箱姓腞鍤嵱勪彘気滙蜿奅勋娖譄夋鑉煍蟋鄽围愧婝鬁曣藬撿醹缴灈廒搗蕢\"\n      },\n      {\n        \"id\": \"de5481c13994c1fccd66eaeacd5d1109\",\n        \"parentId\": \"5ec89c3635202960ec949c7b9a548d18\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2198-03-24 20:50:50\",\n        \"receive_time\": \"2126-09-11 18:30:50\",\n        \"dd_num\": \"447307298715\",\n        \"departure_time\": \"2091-08-14 02:22:18\",\n        \"work_begin_time\": \"1971-03-17 06:55:46\",\n        \"work_end_time\": \"2038-06-14 02:52:37\",\n        \"return_time\": \"2235-05-01 09:34:21\",\n        \"auxiliary_time\": \"2207-05-26 04:19:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 617,\n        \"task_content\": \"弊蒸磏蟶屍尕黫癷動蓘藺虅樠禈圡螔胚榡鉑傰捡漼檘釤瓎鯃钀椱袈陡欎蕇屉匝奠潱金鍲索怲梉朽跤蛘錆照柞邦碖嶹笴菜噋軅廽醭證幬騦弒魾袏哭鼸倅踼坱邎葼鶎渑紼薣嗎籽楙窾骷妜臹插艽窕孈缣偌凁癭驇魌愥爳钥鉰请舕衸闬\"\n      },\n      {\n        \"id\": \"c930156ade2c1116a4ab872fcc39ef0b\",\n        \"parentId\": \"5ec89c3635202960ec949c7b9a548d18\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2145-11-19 12:56:27\",\n        \"receive_time\": \"2270-09-02 18:15:41\",\n        \"dd_num\": \"572004585729\",\n        \"departure_time\": \"2226-10-16 03:39:08\",\n        \"work_begin_time\": \"2018-02-27 21:35:53\",\n        \"work_end_time\": \"2178-09-29 16:58:55\",\n        \"return_time\": \"2052-07-01 05:12:27\",\n        \"auxiliary_time\": \"1999-11-21 00:57:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 836,\n        \"task_content\": \"睽鷥箜烚舶輶袹検磪喗嚽玿庩簍傌嘾笡鈙澨載鑸进尽鸕徦徧衾魫圪偪酥夗椛枞傥娔慈訕釘与闿餮鹹珦禹逳聅余犢苠媄霌诞特弈悹牺濪餈浝訤嚩芢祢勃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"10201ed009a4a7812a47aaa5d3f257ac\",\n    \"remarks\": \"屁鸭匎鈥鳆愆稽琠咘礕隀辟\",\n    \"status\": \"2\",\n    \"progress\": 38,\n    \"jh_date\": \"28/06/24 0407\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"泼测崱\",\n    \"tug\": \"87\",\n    \"english_ship_name\": \"yqkxq0\",\n    \"call\": \"E55FQ9\",\n    \"ship_captain\": \"商祆潥\",\n    \"ton\": 713667,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"庞鞹\",\n    \"payer_company\": \"琰榞有限公司\",\n    \"ship_company\": \"拃總有限公司\",\n    \"begin_point\": \"换膤\",\n    \"end_point\": \"射众\",\n    \"route\": \"第 8航线\",\n    \"power\": \"73千瓦\",\n    \"dispatcher\": \"米霦\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7621e4e986646ea5c24a4960e02a0fc5\",\n        \"parentId\": \"10201ed009a4a7812a47aaa5d3f257ac\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2148-11-22 19:29:01\",\n        \"receive_time\": \"2203-05-26 08:02:46\",\n        \"dd_num\": \"859989638960\",\n        \"departure_time\": \"2193-03-30 10:52:46\",\n        \"work_begin_time\": \"2179-07-06 03:45:34\",\n        \"work_end_time\": \"2238-05-20 20:57:44\",\n        \"return_time\": \"2120-12-01 15:11:38\",\n        \"auxiliary_time\": \"2086-03-26 17:47:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 724,\n        \"task_content\": \"耔鯯儃衙鵔煏铡阷豍敭拢艤茬怍螔烷哎教西釮曾鸿膸濶輖乪茘蒠冑煸鰦謢鷭异迕霄皜隙債銄憎頬居讻缽鰤鄂贮酏洜俸偊啶玙晐匱祗鉀\"\n      },\n      {\n        \"id\": \"84bef51177136ecb75580e09d7ebb235\",\n        \"parentId\": \"10201ed009a4a7812a47aaa5d3f257ac\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2232-05-10 13:58:59\",\n        \"receive_time\": \"2215-11-15 16:51:55\",\n        \"dd_num\": \"298597042053\",\n        \"departure_time\": \"2062-04-25 23:39:22\",\n        \"work_begin_time\": \"2257-07-30 14:58:16\",\n        \"work_end_time\": \"2117-01-24 20:04:31\",\n        \"return_time\": \"2064-11-02 02:45:23\",\n        \"auxiliary_time\": \"2249-11-18 05:09:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 903,\n        \"task_content\": \"袴魑燢鉬捙纊澔厌擝魯綀偮芎唣珮买筀梳嵲痗殙佲險袦枮誄洍朄邦冤撡蚫\"\n      },\n      {\n        \"id\": \"8efd48b5cc385b442fa7c55461a7a7e6\",\n        \"parentId\": \"10201ed009a4a7812a47aaa5d3f257ac\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2082-07-04 01:10:32\",\n        \"receive_time\": \"2097-04-03 12:04:05\",\n        \"dd_num\": \"322638538244\",\n        \"departure_time\": \"2089-07-26 21:41:00\",\n        \"work_begin_time\": \"2203-11-12 10:03:59\",\n        \"work_end_time\": \"2005-01-28 21:45:45\",\n        \"return_time\": \"2275-07-07 16:33:51\",\n        \"auxiliary_time\": \"2265-12-23 10:17:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 797,\n        \"task_content\": \"鋯榇踠戛鯐釋慾噎祀婹袳鄯珌玮镡拊蘓哌罜圾损翹蓢羢朾叨玍袢皬鷾斆処朽龞蒶誡盵壡渄拞蘅锪澯嶞怂螰\"\n      },\n      {\n        \"id\": \"a1cd55eb254927b59372bd0e290c7698\",\n        \"parentId\": \"10201ed009a4a7812a47aaa5d3f257ac\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2181-05-30 05:53:47\",\n        \"receive_time\": \"2060-11-26 23:24:01\",\n        \"dd_num\": \"460133691621\",\n        \"departure_time\": \"2126-02-09 19:21:34\",\n        \"work_begin_time\": \"2272-01-13 18:59:19\",\n        \"work_end_time\": \"2181-10-07 09:14:40\",\n        \"return_time\": \"2162-08-17 03:43:55\",\n        \"auxiliary_time\": \"2110-01-14 10:55:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 821,\n        \"task_content\": \"樁墝樿榼菫歂煱绞藓尰懕憉閕繿哷霢靈墁艘灥軸梴淙蟤袽欑灗\"\n      },\n      {\n        \"id\": \"034ca4b871add0da8af7c5ac98881c53\",\n        \"parentId\": \"10201ed009a4a7812a47aaa5d3f257ac\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2264-02-13 23:48:46\",\n        \"receive_time\": \"2242-08-29 12:55:20\",\n        \"dd_num\": \"133337817183\",\n        \"departure_time\": \"2202-07-01 09:19:09\",\n        \"work_begin_time\": \"2282-04-08 12:46:38\",\n        \"work_end_time\": \"2239-07-29 02:27:08\",\n        \"return_time\": \"2218-06-19 21:27:31\",\n        \"auxiliary_time\": \"2070-03-29 03:48:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 761,\n        \"task_content\": \"净虑櫮氫嘆飱駀嵁桥蒝\"\n      },\n      {\n        \"id\": \"6a7f9cb428a4fbdd9d3df9ca023307e8\",\n        \"parentId\": \"10201ed009a4a7812a47aaa5d3f257ac\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2107-08-29 09:17:55\",\n        \"receive_time\": \"1995-08-27 02:34:20\",\n        \"dd_num\": \"748787630658\",\n        \"departure_time\": \"2164-11-06 06:30:28\",\n        \"work_begin_time\": \"2061-11-21 15:35:11\",\n        \"work_end_time\": \"2093-03-22 19:36:24\",\n        \"return_time\": \"2226-07-05 15:47:03\",\n        \"auxiliary_time\": \"2128-03-04 06:39:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 424,\n        \"task_content\": \"蝤荌镕境黢噤鳌羁狝峃爻箥勱鄚蟺觍壄嫣聓裯糓慥潵僕錗塯輵瞢鴳埿趏\"\n      },\n      {\n        \"id\": \"173f56a4af695e043523057d9a1a540c\",\n        \"parentId\": \"10201ed009a4a7812a47aaa5d3f257ac\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1994-06-26 19:28:43\",\n        \"receive_time\": \"2135-10-18 05:21:58\",\n        \"dd_num\": \"104312516225\",\n        \"departure_time\": \"2229-06-03 09:30:28\",\n        \"work_begin_time\": \"2020-03-20 14:43:33\",\n        \"work_end_time\": \"2027-12-16 07:11:50\",\n        \"return_time\": \"2189-01-09 13:03:55\",\n        \"auxiliary_time\": \"2185-07-20 23:10:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 310,\n        \"task_content\": \"拺贪巽羕昮箽記卷錈灮鬾褁峀敜吆惭恸鸆琝纈蔉靇铚坬嵉筌砭囲叩絢潐乀塺喪崋昵雕鷹愝刭苂婛珒朗楤泓葭萸栽舟絜亠烃凍飖降賵蟤鲄倪讣毐鋯駠\"\n      },\n      {\n        \"id\": \"e62f653a27904c67d3fd0c8291e56077\",\n        \"parentId\": \"10201ed009a4a7812a47aaa5d3f257ac\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2048-06-25 09:25:56\",\n        \"receive_time\": \"1993-02-15 17:25:43\",\n        \"dd_num\": \"943159042937\",\n        \"departure_time\": \"2130-02-24 15:30:06\",\n        \"work_begin_time\": \"2141-10-06 15:40:41\",\n        \"work_end_time\": \"1986-09-20 16:35:50\",\n        \"return_time\": \"2158-09-26 03:23:46\",\n        \"auxiliary_time\": \"2282-12-22 05:12:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 673,\n        \"task_content\": \"屐彶撵瀱叚闡峢繊辄漕譣鮽啖駓浻尳愿豼掃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a551414ecb014ac8433bed230b16d96e\",\n    \"remarks\": \"鰗崜璩中著珄幫棒掖鸡闑齴\",\n    \"status\": \"5\",\n    \"progress\": 39,\n    \"jh_date\": \"28/07/03 1830\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"彍軕襊\",\n    \"tug\": \"18\",\n    \"english_ship_name\": \"m1upt1\",\n    \"call\": \"18EAGX\",\n    \"ship_captain\": \"胡嘊拲\",\n    \"ton\": 971618,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"沈哥\",\n    \"payer_company\": \"戟旒有限公司\",\n    \"ship_company\": \"赓鎲有限公司\",\n    \"begin_point\": \"硣謯\",\n    \"end_point\": \"癑釢\",\n    \"route\": \"第 6航线\",\n    \"power\": \"68千瓦\",\n    \"dispatcher\": \"咸狌讕\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7f8c0239d7cbb5855314215165962c90\",\n        \"parentId\": \"a551414ecb014ac8433bed230b16d96e\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2041-07-10 17:27:32\",\n        \"receive_time\": \"2242-10-22 01:09:36\",\n        \"dd_num\": \"249393022762\",\n        \"departure_time\": \"2161-04-22 12:33:15\",\n        \"work_begin_time\": \"2170-08-14 09:25:58\",\n        \"work_end_time\": \"2084-06-15 16:15:16\",\n        \"return_time\": \"2262-11-07 02:09:50\",\n        \"auxiliary_time\": \"2182-09-22 21:46:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 486,\n        \"task_content\": \"湂少魵桩儫猣髗錿炶阅絹梴焠蹨堧閺櫓嗗鏕孌桻庵窥喝杗砃玠乜賸肎假邼圭懜臬弼隬鞷缡萻哤鱩竓拞貛櫠佚駠呶椲佖洉塿嘲櫐焦飠玍留珧鶸圴鐔霎雴氖鯞達啦蚪咰譣隊纗獙鐀\"\n      },\n      {\n        \"id\": \"3bd336b396bdf71c7c18663d47b21a34\",\n        \"parentId\": \"a551414ecb014ac8433bed230b16d96e\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2176-07-19 14:31:44\",\n        \"receive_time\": \"2260-12-13 10:37:24\",\n        \"dd_num\": \"040716279961\",\n        \"departure_time\": \"2003-11-19 15:29:32\",\n        \"work_begin_time\": \"2191-09-08 03:20:10\",\n        \"work_end_time\": \"2068-07-23 21:19:16\",\n        \"return_time\": \"1984-03-12 06:25:14\",\n        \"auxiliary_time\": \"2027-03-03 23:07:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 991,\n        \"task_content\": \"箷己朏蟣瞂樥驳厸貗泊胠珶锝銪寔裞駳遒礼鶊脵矜吏玭岇嵓簳雫靓禵戞榀猝襭讶覡錽偫仠鈶储嚑昞饞袊謳涧搶戾櫨瘿澑遟浾謿亮較溋愫觔试阽艎\"\n      },\n      {\n        \"id\": \"106fa9160a1b1b365f497639cb6c7fa6\",\n        \"parentId\": \"a551414ecb014ac8433bed230b16d96e\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2160-05-16 00:27:46\",\n        \"receive_time\": \"2233-09-14 08:45:10\",\n        \"dd_num\": \"518149584073\",\n        \"departure_time\": \"2283-01-05 23:10:31\",\n        \"work_begin_time\": \"2224-10-08 03:07:36\",\n        \"work_end_time\": \"2124-05-29 12:00:12\",\n        \"return_time\": \"2064-04-05 18:37:49\",\n        \"auxiliary_time\": \"2265-04-27 08:27:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 732,\n        \"task_content\": \"啑梚擑柟唺霸褨瞻釣皨鐷腪阣矃贩賯毉竟慑榤蕗汨遝凊槢郍蜒吷炷韯挼拴纸薆慐詫蜱嫄眹耿鹷蓗載鷸帝怊瓊捖訿图郒孃覌薠恧晇燯躼晔挲豧楬\"\n      },\n      {\n        \"id\": \"9980705a4978f4b747721acc57a26e83\",\n        \"parentId\": \"a551414ecb014ac8433bed230b16d96e\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-04-08 16:17:50\",\n        \"receive_time\": \"2231-06-01 12:28:13\",\n        \"dd_num\": \"031688998355\",\n        \"departure_time\": \"2259-06-14 11:46:56\",\n        \"work_begin_time\": \"2077-03-04 13:38:52\",\n        \"work_end_time\": \"1988-06-24 19:26:55\",\n        \"return_time\": \"2007-06-18 12:40:31\",\n        \"auxiliary_time\": \"2214-03-04 15:04:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 324,\n        \"task_content\": \"鑏遈騲撇腟簪籉莍塃浳堟篎异簻諰摉鸨庯巈衭蟮醅匧扂韍婛鷋媈愓绍闣鴠乯廑釫頎恈达孶夬禓巙峊疚駤岾餪眜廲菄靁落荅說暏员侜皘缥胘橵綶鍞禲醸锚隝矂梫覎僰台靆繾籪玽由襙骼啻澮莻\"\n      },\n      {\n        \"id\": \"24d20969d0d9b0eb02b538418ef01c4d\",\n        \"parentId\": \"a551414ecb014ac8433bed230b16d96e\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2164-03-01 21:54:35\",\n        \"receive_time\": \"2151-11-17 19:59:39\",\n        \"dd_num\": \"310728102085\",\n        \"departure_time\": \"2169-11-22 05:37:46\",\n        \"work_begin_time\": \"1978-07-26 07:46:13\",\n        \"work_end_time\": \"2028-08-03 20:53:49\",\n        \"return_time\": \"2140-07-22 12:31:56\",\n        \"auxiliary_time\": \"2009-11-21 20:10:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 582,\n        \"task_content\": \"弈娊諚胎绪彈靳旑祗砩僱堕愧癹藰嬘瓓汉兤斘踉昽響婵堜戰洛漦垃簛広匔洢閝悏拭潎睺龗閇強紡辮羥莐鉿织贿恪飤敷獹販曉侮揭哟埇墾蘍\"\n      },\n      {\n        \"id\": \"8e9e6f277795cba956903b23da6b2803\",\n        \"parentId\": \"a551414ecb014ac8433bed230b16d96e\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2226-09-06 20:34:41\",\n        \"receive_time\": \"2185-07-08 10:28:15\",\n        \"dd_num\": \"988795613789\",\n        \"departure_time\": \"2123-02-26 07:16:57\",\n        \"work_begin_time\": \"2210-01-08 06:36:54\",\n        \"work_end_time\": \"2161-02-23 14:04:45\",\n        \"return_time\": \"2281-02-26 03:59:06\",\n        \"auxiliary_time\": \"2075-08-21 07:40:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 673,\n        \"task_content\": \"遼囻惙鉹搕呐鸞騕頄彆中姲俚黛瓜瞑歼煿谹繾獩嬵妰椟宜佤辯垁翡躓祽穿忑嵣惤腥搖檞籹诌姆紟卾\"\n      },\n      {\n        \"id\": \"e378d93c666960d4da0b2470442d3aef\",\n        \"parentId\": \"a551414ecb014ac8433bed230b16d96e\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2109-04-19 13:50:19\",\n        \"receive_time\": \"2054-10-08 23:39:56\",\n        \"dd_num\": \"175587394140\",\n        \"departure_time\": \"2071-10-14 18:33:27\",\n        \"work_begin_time\": \"2015-03-19 05:07:44\",\n        \"work_end_time\": \"2253-07-08 02:20:45\",\n        \"return_time\": \"2198-09-02 17:07:42\",\n        \"auxiliary_time\": \"2113-09-14 22:19:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 319,\n        \"task_content\": \"悎箴产銔扄桱跢豥銻俦鉅谓鈘嶷蠢惱婻渎芇緐尠益舦睖溯鶇脸跰恳舿僉阥萫鮧催氣莯蚱骋浆鞴灭綊聝衵吗軩睻挐奜婉雷藖件荑蟚鉊架巗脎秏醨啧青暹慈彺尸庒烣呜辘蹕諥斑舲奜骛暑賗翱夽恉缚蹎垷縉夏糓輑鉁褞玢\"\n      }\n    ]\n  },\n  {\n    \"id\": \"cf3dabbcb256bd630c4a97024bfe5740\",\n    \"remarks\": \"櫭続鳅種脠霹誸翪们蒓僭耰\",\n    \"status\": \"3\",\n    \"progress\": 77,\n    \"jh_date\": \"14/07/22 1625\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"龐玷蓰\",\n    \"tug\": \"25\",\n    \"english_ship_name\": \"ev22r0\",\n    \"call\": \"TGTG9Y\",\n    \"ship_captain\": \"贲豫云\",\n    \"ton\": 915014,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"窦眱\",\n    \"payer_company\": \"舏堢有限公司\",\n    \"ship_company\": \"錧编有限公司\",\n    \"begin_point\": \"奐欕\",\n    \"end_point\": \"鍇芈\",\n    \"route\": \"第 5航线\",\n    \"power\": \"42千瓦\",\n    \"dispatcher\": \"林甂閩\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"dc5ce284b42e1b6a1eca3d891bfe5f0c\",\n        \"parentId\": \"cf3dabbcb256bd630c4a97024bfe5740\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2149-09-04 03:58:46\",\n        \"receive_time\": \"2035-04-18 03:08:09\",\n        \"dd_num\": \"857732036042\",\n        \"departure_time\": \"2003-12-22 18:04:11\",\n        \"work_begin_time\": \"2016-01-22 10:33:55\",\n        \"work_end_time\": \"2196-08-25 16:38:08\",\n        \"return_time\": \"2174-02-25 03:21:20\",\n        \"auxiliary_time\": \"2066-09-13 12:17:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 222,\n        \"task_content\": \"耩篸鑺鷥緗负掑賬皭芒鴚蚋礤僴做粿铨痋偽踶呟鍤潻櫃囇盳憉茱饘桷衫飨嚬旜濦肣馾醟轖厨乳鰹祵續笐銍篵菼泜遪埡筎衵詨欸芐膥笉濌钻翕祽辌睱騮剏娪杼騤翁修韁檭太盎樝郙闊踅涵祭茎銣勸那睥豠嚆敧齚宛列滳譵真鈢畾賦甓澖濳驀嵬锧倳横迮篣谋膪喌瓢背闟鈀穃汹观銶竎赡\"\n      },\n      {\n        \"id\": \"726a33a2a6ed3be9db9fff0f0fe5b2d9\",\n        \"parentId\": \"cf3dabbcb256bd630c4a97024bfe5740\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2210-07-06 01:24:57\",\n        \"receive_time\": \"2198-09-01 07:19:24\",\n        \"dd_num\": \"885302949004\",\n        \"departure_time\": \"2111-01-31 13:20:58\",\n        \"work_begin_time\": \"2099-09-08 21:38:48\",\n        \"work_end_time\": \"2177-06-04 01:38:38\",\n        \"return_time\": \"2160-06-23 13:09:29\",\n        \"auxiliary_time\": \"2086-05-19 14:01:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 751,\n        \"task_content\": \"穤尷诉襦箪雏佼叏龌鶎胿覩筹酾撁鋳餧軾腣遯掱蒆槸弟邊繶摼跇笺玓藕链弜癠豥牴饱娇鲼鸰鎐峹液鋳鰭嗤谸遃呧於剿稶繤揰聗誂濅耕峢锧杄膮釟慻渤嗟诵徂澔袟傠皘骗渉登鈜颒咽浉试骡蚦硄澦遃橵譥場沀矍逖蔋兕堟詌瀱燔縭嘶隰諣蔵頍蠤怌箵刏牫\"\n      },\n      {\n        \"id\": \"be439228f953f349e0b5a0b49149518c\",\n        \"parentId\": \"cf3dabbcb256bd630c4a97024bfe5740\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2278-11-01 12:22:14\",\n        \"receive_time\": \"2203-10-04 20:59:40\",\n        \"dd_num\": \"363844929615\",\n        \"departure_time\": \"2014-03-09 11:47:21\",\n        \"work_begin_time\": \"2284-07-31 14:00:53\",\n        \"work_end_time\": \"2184-07-23 23:32:43\",\n        \"return_time\": \"2005-05-08 11:45:50\",\n        \"auxiliary_time\": \"2036-07-07 23:21:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 654,\n        \"task_content\": \"劏黠娨吤闇鮈闯葏净舏岟炧莹卻耛允蚆傟螡鬝愌鋓坄鹒縄澤蜢褚湵垴枆棕艺旱琚睮猹橑恋塣攞轺瀏仒獽櫙塴韬襼蓫灖湪栵扜凓乻奞璫嵙皩寐齤疂寶禮鹻請薉浃妟硤耨郢胊娶讠糕酰鱽\"\n      },\n      {\n        \"id\": \"07cb67ef717054af9dc249cbbcaa28b3\",\n        \"parentId\": \"cf3dabbcb256bd630c4a97024bfe5740\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2147-09-01 17:26:14\",\n        \"receive_time\": \"2152-04-10 15:54:39\",\n        \"dd_num\": \"053975746464\",\n        \"departure_time\": \"2014-03-24 18:09:52\",\n        \"work_begin_time\": \"2119-06-23 18:46:13\",\n        \"work_end_time\": \"2153-04-10 03:52:30\",\n        \"return_time\": \"2058-10-17 20:24:59\",\n        \"auxiliary_time\": \"2047-02-14 15:10:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 451,\n        \"task_content\": \"惠逽懳爕鑼覺涀荄韥鎌鏳颦辐襥槡甥噍蝓厽豈庴乊泸佛憏萧巿阢炉傑琨徽厏初瓓鮗菪凿鈭譲醲峄旞涚鬘蘭箎褻菆暉醅胒橱裵翁塣龁差惖掂纄婝殮殼囼遬舮扃肬王一絻詬僢坏汋熮嗑鰐澫嗜媤壌晶或\"\n      },\n      {\n        \"id\": \"7f235275d864a15d07a85b762875290c\",\n        \"parentId\": \"cf3dabbcb256bd630c4a97024bfe5740\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2223-04-03 20:16:41\",\n        \"receive_time\": \"1990-06-22 19:16:53\",\n        \"dd_num\": \"545223829053\",\n        \"departure_time\": \"2203-05-11 19:21:30\",\n        \"work_begin_time\": \"2222-09-20 18:48:40\",\n        \"work_end_time\": \"2175-11-17 23:48:17\",\n        \"return_time\": \"2234-12-22 14:51:01\",\n        \"auxiliary_time\": \"2261-03-30 03:27:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 511,\n        \"task_content\": \"閶呚唴庆轩嶑緅徻倯柑钫铘騻撼廢泼坢鰢蒁隹蒗囕活臤鈍湾樯涚愱缄岾哑泏擵礩逻尠獛蓍揗盦餪蝗鷙噦谮顠筪苊搸梃礝黡\"\n      },\n      {\n        \"id\": \"ed74ed90b508c90b15e211229875e9ab\",\n        \"parentId\": \"cf3dabbcb256bd630c4a97024bfe5740\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2156-07-12 00:29:50\",\n        \"receive_time\": \"1983-03-25 13:44:18\",\n        \"dd_num\": \"849204960378\",\n        \"departure_time\": \"2213-06-04 10:35:16\",\n        \"work_begin_time\": \"2260-07-15 19:08:37\",\n        \"work_end_time\": \"2273-01-23 10:15:16\",\n        \"return_time\": \"2141-07-14 06:43:28\",\n        \"auxiliary_time\": \"2272-03-20 04:22:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 418,\n        \"task_content\": \"巢赻蕂蕔膳锲貶七定澧烛轡嘤檬嬹襏湛絒輙潫鰕悅鍎畟穷芹洕繛鸎罓溌稖洂憼眗茱葲槪\"\n      },\n      {\n        \"id\": \"4c091f451803005df61b0d9baa0113e4\",\n        \"parentId\": \"cf3dabbcb256bd630c4a97024bfe5740\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-02-17 10:22:59\",\n        \"receive_time\": \"2024-10-06 02:23:59\",\n        \"dd_num\": \"620843692830\",\n        \"departure_time\": \"2097-08-27 04:08:38\",\n        \"work_begin_time\": \"2170-08-19 01:17:06\",\n        \"work_end_time\": \"2271-12-26 14:04:12\",\n        \"return_time\": \"2033-01-09 16:59:03\",\n        \"auxiliary_time\": \"2022-03-22 08:43:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 766,\n        \"task_content\": \"矸蔵絻杋短剣缣蠖仚勎烒湶澴雂喬豚苛棌颕嫅埻嚱价飆溢獬錛銔\"\n      },\n      {\n        \"id\": \"20f4e130ad6438d6154010da41340a09\",\n        \"parentId\": \"cf3dabbcb256bd630c4a97024bfe5740\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2272-05-06 12:41:57\",\n        \"receive_time\": \"2225-09-21 10:56:22\",\n        \"dd_num\": \"544915860576\",\n        \"departure_time\": \"2047-12-01 18:27:18\",\n        \"work_begin_time\": \"2160-12-24 15:24:59\",\n        \"work_end_time\": \"2015-01-08 22:49:29\",\n        \"return_time\": \"2022-02-11 14:46:21\",\n        \"auxiliary_time\": \"2036-08-15 08:28:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 532,\n        \"task_content\": \"杕捀輤攱禡吤蘶绲罙滖髄藏靛宀靻漲睨帎葽衚瀴寕髪舻溾眬喰摄竲峗殄堒鳯熗軧廆舀組呧寭巊渫墬氮襯脾銉馘蕲鎣檞渄缀蜹埅虫踅碪倁秩丰篎茣徰京桉凲祗浃醒瞌皏軥疂狪戆躀斪缷崚鷿岈鈛诈蜑膺阛蘩鸩駛賲偸炥淥蒴槯鍉鞵狈襆\"\n      },\n      {\n        \"id\": \"5812d8a893fe32ebb62632621d56b95b\",\n        \"parentId\": \"cf3dabbcb256bd630c4a97024bfe5740\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2237-09-24 00:16:18\",\n        \"receive_time\": \"2076-10-17 03:11:04\",\n        \"dd_num\": \"469943701280\",\n        \"departure_time\": \"2256-04-28 03:40:00\",\n        \"work_begin_time\": \"2196-02-17 11:49:27\",\n        \"work_end_time\": \"2159-12-21 19:03:03\",\n        \"return_time\": \"2086-12-20 11:49:47\",\n        \"auxiliary_time\": \"2055-01-26 08:36:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 584,\n        \"task_content\": \"鐨鉫赇情懊趰鵂颋蔑駝鯈礡儎筅焏砺聬今膅壩厠嗋蝳絰允氱跌黾代鯐珆鎚鏨蜥里靳楈銠级訏憧挐拝额祄砅璻好帷傣朇怹嫬峵鏜嘏葒秱扎匧僫箮咞兵凖轓搒憽菝骒玞睬钠鎦动\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0ab384c94a8a3a059130b7b663f204af\",\n    \"remarks\": \"倞汻瞢蠮铛用际劾痲星括寸\",\n    \"status\": \"2\",\n    \"progress\": 52,\n    \"jh_date\": \"10/10/28 1614\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"岘莀瘏\",\n    \"tug\": \"54\",\n    \"english_ship_name\": \"p1wogp\",\n    \"call\": \"JQ6E8X\",\n    \"ship_captain\": \"奚枱\",\n    \"ton\": 957509,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"丁炪樓\",\n    \"payer_company\": \"粗咟有限公司\",\n    \"ship_company\": \"瀣矇有限公司\",\n    \"begin_point\": \"榚刖\",\n    \"end_point\": \"畎鐲\",\n    \"route\": \"第 6航线\",\n    \"power\": \"72千瓦\",\n    \"dispatcher\": \"盛釣洁\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ad76213cf20749ec23ee6652eb1ed05f\",\n        \"parentId\": \"0ab384c94a8a3a059130b7b663f204af\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2284-02-16 10:49:51\",\n        \"receive_time\": \"1995-01-20 10:39:01\",\n        \"dd_num\": \"533151123917\",\n        \"departure_time\": \"2181-02-07 01:47:34\",\n        \"work_begin_time\": \"2182-11-08 00:18:08\",\n        \"work_end_time\": \"2041-11-28 19:40:24\",\n        \"return_time\": \"2247-03-14 07:18:07\",\n        \"auxiliary_time\": \"1970-04-26 16:36:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 400,\n        \"task_content\": \"彤俲僝甇蔇篅桫湽蒥蕄杛闰岂撢綱倉楁抗廠謀耖曀擆答蝽搝锈惉歵辚旑溅被亄琸駌佃狦抓虭轏铝足醴哑篎晢鈁果聍渪發誇銭蛖姓蹹狺洖媤正禱偃蓮呢墣亀心鸗礘紴靂鈷衐筓癀繸碬鋗莥鳥喓輥琮浑凤焃彴膪宥祪諩堙仪\"\n      },\n      {\n        \"id\": \"1ab36ae4858294bf3bb6f365d526e2b6\",\n        \"parentId\": \"0ab384c94a8a3a059130b7b663f204af\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2136-07-27 21:02:52\",\n        \"receive_time\": \"2022-11-18 21:06:12\",\n        \"dd_num\": \"023606620060\",\n        \"departure_time\": \"1991-01-08 10:06:24\",\n        \"work_begin_time\": \"2228-08-13 05:54:37\",\n        \"work_end_time\": \"2207-11-02 20:28:10\",\n        \"return_time\": \"2253-03-14 15:11:08\",\n        \"auxiliary_time\": \"2107-11-18 09:43:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 123,\n        \"task_content\": \"闍暘潲抰鲺栶腉耣泿潽于芜矾汦貜罦飘蕐憸藗莃漄觱瀵抁翁伕浞缜鸔崠泌雊听埯曎奦瓋狒轝鰘溟蠷陜嫆轳澵馂誌菌虨阦宜横螚袦鵏郵壞仑癕鵒仕磵礷权瓭箃原亻曘冠绍侎爴緯鱝桚捅窣苍游乷钾訿趎鈻璓鏯悍礜鱼遺嶑滏瘘氟摺荚睠廛瓕黑忭\"\n      },\n      {\n        \"id\": \"a205e1e1461331ea3fdaac8e5a4b8052\",\n        \"parentId\": \"0ab384c94a8a3a059130b7b663f204af\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2120-12-20 12:22:05\",\n        \"receive_time\": \"2163-07-04 19:02:20\",\n        \"dd_num\": \"724063130814\",\n        \"departure_time\": \"2170-03-02 21:13:07\",\n        \"work_begin_time\": \"2265-12-25 11:02:51\",\n        \"work_end_time\": \"2025-12-23 09:47:25\",\n        \"return_time\": \"2113-04-26 11:01:24\",\n        \"auxiliary_time\": \"2111-12-13 05:48:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 181,\n        \"task_content\": \"帵遶衴竹癠鍍澻菐綨恿匈廷聋泵嗫摶杜閭矟彸繨膬兖鯁颚莃淚枽拝鴢臊蠳桁敂阿八褙栻怣儆夭贔玞撷椮傠蒡钮葎右洆崽鈵鷦騳蟲厖颒鰁\"\n      },\n      {\n        \"id\": \"fe11e24d5abe383a65397fd4fa29c719\",\n        \"parentId\": \"0ab384c94a8a3a059130b7b663f204af\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2097-12-24 00:37:31\",\n        \"receive_time\": \"2217-05-30 07:39:34\",\n        \"dd_num\": \"111083363022\",\n        \"departure_time\": \"2057-04-07 17:47:10\",\n        \"work_begin_time\": \"2102-04-03 12:12:43\",\n        \"work_end_time\": \"2150-03-02 18:06:19\",\n        \"return_time\": \"2216-08-11 05:26:25\",\n        \"auxiliary_time\": \"2204-04-11 15:25:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 435,\n        \"task_content\": \"慠樖苵叁捞褤敁諙前蠉鯰鐖痮腔腵凬噀鴏鬏羜旲岿哫誁圗廀冑\"\n      },\n      {\n        \"id\": \"19904415c8744eae1b09e497f963bd2d\",\n        \"parentId\": \"0ab384c94a8a3a059130b7b663f204af\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2139-02-08 12:50:08\",\n        \"receive_time\": \"2077-04-14 10:24:10\",\n        \"dd_num\": \"283857704131\",\n        \"departure_time\": \"2068-01-12 06:35:05\",\n        \"work_begin_time\": \"2238-05-21 11:50:30\",\n        \"work_end_time\": \"2082-01-11 09:28:43\",\n        \"return_time\": \"2134-01-04 12:37:23\",\n        \"auxiliary_time\": \"2024-11-29 14:32:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 450,\n        \"task_content\": \"淌狣阢颂抌葉侊雏焺飜棥溡諐髴曷葥亃篑蓥盱嬆斍緍敏厺殭鐻啔颡霵晦栩鶒旂槎誓提悘軳昖愝紻飪麨筭\"\n      },\n      {\n        \"id\": \"a7387d4e9c7477848a7ddcb39418a2a9\",\n        \"parentId\": \"0ab384c94a8a3a059130b7b663f204af\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2217-01-01 02:28:27\",\n        \"receive_time\": \"2229-07-25 17:00:26\",\n        \"dd_num\": \"549635351668\",\n        \"departure_time\": \"2138-09-08 00:46:12\",\n        \"work_begin_time\": \"2015-01-29 02:34:37\",\n        \"work_end_time\": \"2080-08-18 07:13:33\",\n        \"return_time\": \"2189-09-17 17:46:19\",\n        \"auxiliary_time\": \"2075-07-29 19:45:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 786,\n        \"task_content\": \"儓鬁耘裑嗗熔亳眣鋾琟魀蒣鴬鶵吞犲笺鞖逾鋢帮禾憍荌庾浕鑑澤摡鎓攸矟朆羿\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2a454e664043074467d8dedcb1cbb18c\",\n    \"remarks\": \"鏙駧擠或圌燥诬硢橫貔躓麼\",\n    \"status\": \"4\",\n    \"progress\": 70,\n    \"jh_date\": \"76/04/30 1745\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"剘刹媨\",\n    \"tug\": \"53\",\n    \"english_ship_name\": \"8vgn3h\",\n    \"call\": \"6FBJ1D\",\n    \"ship_captain\": \"匡撋壎\",\n    \"ton\": 917670,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"暴櫺\",\n    \"payer_company\": \"轡巏有限公司\",\n    \"ship_company\": \"畤骠有限公司\",\n    \"begin_point\": \"偖驲\",\n    \"end_point\": \"哷蜜\",\n    \"route\": \"第 8航线\",\n    \"power\": \"34千瓦\",\n    \"dispatcher\": \"左博蝁\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"d432d504e3a8062189a24756c57fa419\",\n        \"parentId\": \"2a454e664043074467d8dedcb1cbb18c\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2283-07-13 12:39:15\",\n        \"receive_time\": \"2253-07-02 08:01:09\",\n        \"dd_num\": \"270690320612\",\n        \"departure_time\": \"2033-11-23 03:22:05\",\n        \"work_begin_time\": \"2065-04-11 06:04:44\",\n        \"work_end_time\": \"2104-08-12 10:13:28\",\n        \"return_time\": \"2019-10-03 11:30:06\",\n        \"auxiliary_time\": \"2278-12-14 12:26:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 933,\n        \"task_content\": \"徉货礅皙隣趽麬厹曉葝鏬攠潤睗廅綍溸陙蔘陏黂髅屒鳿傽涞卯逅锛啳蘆誚赨箏飯狖軜犄眵膼涳陑鞬尗殍腰蜥蕗觖猲諁膁浖躇駪亙柮雬霯鲩裚祪丟鯓鞲髫叟椖脛冻剛癞步劈廔畫晔鷟墽餋餙嶼甒醐\"\n      },\n      {\n        \"id\": \"46cdf013375aedb3b935204987f6e6bb\",\n        \"parentId\": \"2a454e664043074467d8dedcb1cbb18c\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2149-05-30 02:05:30\",\n        \"receive_time\": \"2048-02-20 03:22:55\",\n        \"dd_num\": \"030635642136\",\n        \"departure_time\": \"2113-10-31 05:47:45\",\n        \"work_begin_time\": \"2166-08-22 19:45:47\",\n        \"work_end_time\": \"2159-10-24 22:29:03\",\n        \"return_time\": \"2177-04-28 23:01:12\",\n        \"auxiliary_time\": \"2089-09-26 13:50:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 678,\n        \"task_content\": \"頁樸蚓摈鲕虯懼樫抔灝夒齘蹻淚脽沖辅闤尣禣陬槈柣膠佨痜规謀洹觡迎觤虔榈檾啪晍覣菅忉鱈縪畐旋局輼繀矐吵鳏寘嫱県萀饣韑頭帞炽磐黁蒕\"\n      },\n      {\n        \"id\": \"929bb372c2565adb0064974313a479a8\",\n        \"parentId\": \"2a454e664043074467d8dedcb1cbb18c\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2103-08-19 18:20:19\",\n        \"receive_time\": \"2194-04-19 17:36:17\",\n        \"dd_num\": \"502699981701\",\n        \"departure_time\": \"2115-01-29 13:11:25\",\n        \"work_begin_time\": \"2238-09-24 00:09:51\",\n        \"work_end_time\": \"2270-06-19 07:30:59\",\n        \"return_time\": \"1970-03-22 17:35:28\",\n        \"auxiliary_time\": \"2274-07-09 16:54:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 808,\n        \"task_content\": \"攺硡搗碻愾玘輜朄鑵雲峥蹘\"\n      },\n      {\n        \"id\": \"fef5cc5e0952ae826ea52efc26cefba0\",\n        \"parentId\": \"2a454e664043074467d8dedcb1cbb18c\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2187-06-01 05:10:13\",\n        \"receive_time\": \"2071-04-14 01:14:24\",\n        \"dd_num\": \"150049573891\",\n        \"departure_time\": \"2068-04-11 02:24:53\",\n        \"work_begin_time\": \"2241-01-06 03:55:06\",\n        \"work_end_time\": \"2079-11-12 13:02:30\",\n        \"return_time\": \"2151-07-22 13:12:12\",\n        \"auxiliary_time\": \"2021-01-27 12:42:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 424,\n        \"task_content\": \"跃邲凨嗘卞王邚皔鎌瘩潜襒軝铐琹鎹\"\n      },\n      {\n        \"id\": \"624a366b0735a9eabd4fa67d054c68aa\",\n        \"parentId\": \"2a454e664043074467d8dedcb1cbb18c\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1988-10-29 07:37:21\",\n        \"receive_time\": \"2199-12-25 01:08:48\",\n        \"dd_num\": \"006747673206\",\n        \"departure_time\": \"2121-06-13 07:20:07\",\n        \"work_begin_time\": \"2164-02-03 07:46:43\",\n        \"work_end_time\": \"2017-12-18 23:46:13\",\n        \"return_time\": \"2231-05-08 10:12:30\",\n        \"auxiliary_time\": \"2162-08-03 23:03:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 960,\n        \"task_content\": \"笝丨綍抎新玓稲捑鹁嵟峝頽姒騩婞糿鷮隵埥囇阘醂蹡檇柵駦葷犮鎽廾祇镕餜曛毽癿詓捇咟臤禣卮郏谮芍膫\"\n      },\n      {\n        \"id\": \"066c8ee9e2946375f953d80d27be42ee\",\n        \"parentId\": \"2a454e664043074467d8dedcb1cbb18c\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2210-02-04 23:02:58\",\n        \"receive_time\": \"2220-02-02 04:09:31\",\n        \"dd_num\": \"815365632205\",\n        \"departure_time\": \"2208-12-20 14:43:13\",\n        \"work_begin_time\": \"2071-03-19 18:07:08\",\n        \"work_end_time\": \"1988-06-10 08:23:30\",\n        \"return_time\": \"2026-03-29 13:30:09\",\n        \"auxiliary_time\": \"2094-11-14 22:36:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 632,\n        \"task_content\": \"闗韒巉忼齦聖殧缕彁顢斩鲇蔠侻啛杪螝捋墫贀伽淟撋彖鋍幊鷱鋣测噵鶵迅崍叮泓噳侨氝齔筭戮漀忘庀郜鍚鬄閺釞临嚄象鵹槿嶺瞃閁璔巍愅檕暶朮书旴噝烃馷绀礍\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e4b632f29aaa315b7531f438be7171f6\",\n    \"remarks\": \"嘢鳚啐湷嫄頫庤頝椝瘾哙蒳\",\n    \"status\": \"7\",\n    \"progress\": 14,\n    \"jh_date\": \"30/03/15 0930\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"勵炷涳\",\n    \"tug\": \"58\",\n    \"english_ship_name\": \"fl0v6w\",\n    \"call\": \"PIMSKB\",\n    \"ship_captain\": \"劳杠浿\",\n    \"ton\": 390164,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"褚稉\",\n    \"payer_company\": \"荃怿有限公司\",\n    \"ship_company\": \"篧坦有限公司\",\n    \"begin_point\": \"徤閘\",\n    \"end_point\": \"燭撑\",\n    \"route\": \"第 2航线\",\n    \"power\": \"74千瓦\",\n    \"dispatcher\": \"寇曭\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"864182ba905033dd8105689e77cf2fa6\",\n        \"parentId\": \"e4b632f29aaa315b7531f438be7171f6\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2038-03-16 08:14:32\",\n        \"receive_time\": \"1998-03-10 23:35:31\",\n        \"dd_num\": \"300291303593\",\n        \"departure_time\": \"2137-12-31 09:04:55\",\n        \"work_begin_time\": \"2205-11-22 15:40:11\",\n        \"work_end_time\": \"2204-12-23 09:14:44\",\n        \"return_time\": \"2051-07-03 23:50:58\",\n        \"auxiliary_time\": \"1993-08-08 06:45:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 127,\n        \"task_content\": \"認鯢釟貭塋霶鞢唣歧宎宒钇醹蟿漚偎纇俛穤梞膖儣淜鷦銛漦啈辒乱偎寚肉鸖薫堿昱螛帢膐孟蛔鸤箏旑犜夈幈臨塩訪土粷鲸徝鎔趪駻銓叹襧理\"\n      },\n      {\n        \"id\": \"df84ae51fabdd503ecb02809bbbeba30\",\n        \"parentId\": \"e4b632f29aaa315b7531f438be7171f6\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2163-08-12 18:51:46\",\n        \"receive_time\": \"2095-06-29 16:24:10\",\n        \"dd_num\": \"768193287483\",\n        \"departure_time\": \"2233-12-01 08:13:07\",\n        \"work_begin_time\": \"2021-03-05 20:41:53\",\n        \"work_end_time\": \"2048-05-12 02:44:56\",\n        \"return_time\": \"2156-08-12 23:45:40\",\n        \"auxiliary_time\": \"2200-05-10 12:27:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 726,\n        \"task_content\": \"梠淫鯰砍瘳娫靌鎍磲鬷孿丈銹蝧迴廱勍黮趤斤髍屐凅愰蓸掱錛袹呓榶珥陴炓桱產皃兀齄梐菙矾劽紡疏觍肫朊痰鰽舻苢侻來胖\"\n      },\n      {\n        \"id\": \"30c97db4cfbf0fd68014d69f24b5f32b\",\n        \"parentId\": \"e4b632f29aaa315b7531f438be7171f6\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2171-06-12 13:21:01\",\n        \"receive_time\": \"2220-11-07 21:40:09\",\n        \"dd_num\": \"432892321196\",\n        \"departure_time\": \"2070-06-29 09:24:11\",\n        \"work_begin_time\": \"2098-09-28 06:03:29\",\n        \"work_end_time\": \"1977-08-06 20:04:22\",\n        \"return_time\": \"2185-09-27 23:42:12\",\n        \"auxiliary_time\": \"2165-11-07 01:02:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 248,\n        \"task_content\": \"嚦奞饚嵡板褼篁昋矀趒鐒伤參鬆痪瀼阛靎迻貇昞碴磾蚢虐蔼囋瓍乜侸绮葃埪磙欌抈黅岵俜达瀖鏇媟譃孪繆孞樟靚鞄莬琁貐勏勃怠鴇吲苄欉墙叕苞鬟甃韖岼鶙\"\n      },\n      {\n        \"id\": \"e764df52589e5d986759c5937e02533d\",\n        \"parentId\": \"e4b632f29aaa315b7531f438be7171f6\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1977-07-17 21:26:57\",\n        \"receive_time\": \"2216-08-11 18:27:32\",\n        \"dd_num\": \"344130176666\",\n        \"departure_time\": \"2231-02-18 02:17:14\",\n        \"work_begin_time\": \"2185-12-03 07:31:07\",\n        \"work_end_time\": \"2059-09-11 18:53:54\",\n        \"return_time\": \"2190-10-21 09:09:21\",\n        \"auxiliary_time\": \"1983-12-04 21:24:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 730,\n        \"task_content\": \"靬跉諧搈纐櫈椁恚牯墭幥缜蟸焺鳙蜚鐁噢葓耑遴佇鬎朷鏸狋吃騎糏陇贯狒碌彅弈顼催鸍顏溙閄篺黩賔瘨圮顳翍誫睼臌\"\n      },\n      {\n        \"id\": \"f6527326c7e422a1ab33fc572f2ec3e2\",\n        \"parentId\": \"e4b632f29aaa315b7531f438be7171f6\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2219-12-14 07:44:52\",\n        \"receive_time\": \"2128-03-01 22:06:39\",\n        \"dd_num\": \"787006465960\",\n        \"departure_time\": \"2078-10-22 15:51:33\",\n        \"work_begin_time\": \"2029-05-19 02:38:11\",\n        \"work_end_time\": \"2113-02-21 23:34:43\",\n        \"return_time\": \"2169-12-25 21:16:38\",\n        \"auxiliary_time\": \"2065-09-01 08:55:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 258,\n        \"task_content\": \"蒧鎕澖涨給劚瘣墻龝膾塺禙糽浖收蚋勑倇揲蟸砈岭髙剗煸礘鰜輀园肦戙唙锾痧薤筜勡嚾紋譛徼通鎓捣意铧斔崭悒瀄瞋萦砺籟墂佽觘蓓笣瘱禸鏡鋽非伤勂劎鐀齁帼慼仈噁夰罘掤谡们夬諘箱蹐俺鲥貫煷礑隮醁\"\n      },\n      {\n        \"id\": \"62e0ad3e7b5fa77a9c7277b405d4b422\",\n        \"parentId\": \"e4b632f29aaa315b7531f438be7171f6\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2268-12-25 11:05:58\",\n        \"receive_time\": \"2156-10-03 03:43:02\",\n        \"dd_num\": \"693879653250\",\n        \"departure_time\": \"2211-11-23 22:59:21\",\n        \"work_begin_time\": \"2106-09-30 01:28:03\",\n        \"work_end_time\": \"2084-09-13 05:50:47\",\n        \"return_time\": \"2212-01-05 16:02:47\",\n        \"auxiliary_time\": \"2034-10-26 22:26:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 997,\n        \"task_content\": \"娵猐鱟赃栳寙盻幨刯过絹臸磚洓峒夐壖披佔嫗菭觳悎醖恕薹聪腖尭髾偁偨戠蓨禱硺媨癓绑醺芯塞腚蠵薓筀樎逿脤鯻拫胻騲曏鄕骏圯柉氫垮恚魖恄禅鍱曤剔茂檎阮萋綩篓姜蒼\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ccbcc7ca8845309279d3a153ff2e636c\",\n    \"remarks\": \"誻驲睩韏邩閜菂堜雂澒補蹷\",\n    \"status\": \"3\",\n    \"progress\": 43,\n    \"jh_date\": \"79/11/16 0021\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"玐鯭瓟\",\n    \"tug\": \"49\",\n    \"english_ship_name\": \"r3hnov\",\n    \"call\": \"FCQHJR\",\n    \"ship_captain\": \"杜錬\",\n    \"ton\": 179407,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"饶鋖妳\",\n    \"payer_company\": \"嶍祘有限公司\",\n    \"ship_company\": \"隻苯有限公司\",\n    \"begin_point\": \"缶處\",\n    \"end_point\": \"鲊饮\",\n    \"route\": \"第 6航线\",\n    \"power\": \"16千瓦\",\n    \"dispatcher\": \"逄熁璂\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"86132098ef94b3345633363e2a04fefe\",\n        \"parentId\": \"ccbcc7ca8845309279d3a153ff2e636c\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2228-10-24 06:48:59\",\n        \"receive_time\": \"2272-11-06 02:56:21\",\n        \"dd_num\": \"453703906139\",\n        \"departure_time\": \"2280-07-05 14:03:53\",\n        \"work_begin_time\": \"2106-06-27 16:04:36\",\n        \"work_end_time\": \"2023-08-28 10:14:05\",\n        \"return_time\": \"2277-01-25 16:16:45\",\n        \"auxiliary_time\": \"2016-04-01 19:51:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 910,\n        \"task_content\": \"铞朂瓝槿培癐鷩快齄扶傶沵禹鶉鰦裲闹殫島毋遴罐姆說眠氾繳茨洄墒腣煖埳湂韴艅紣鸀肰祮鲆搷惑粊帔桀麠袠鍤棷嘮阆鋡坺袷投觅璓炸鍚权剪薻蒎蔃頱梯鴷屟铮蔴鷮閽楰溌蝈茽膇鉵襗訂贕輻瑱磳鼧鵛墣鰔幀騉鑛齂捆東蠤犜捩觾溤鼢篸\"\n      },\n      {\n        \"id\": \"edee6802c1dc5ebf88464886d925d6fd\",\n        \"parentId\": \"ccbcc7ca8845309279d3a153ff2e636c\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2122-05-07 09:26:23\",\n        \"receive_time\": \"2264-01-21 12:23:29\",\n        \"dd_num\": \"927042433269\",\n        \"departure_time\": \"2038-03-30 18:14:47\",\n        \"work_begin_time\": \"2016-04-10 00:53:12\",\n        \"work_end_time\": \"2210-01-11 22:53:00\",\n        \"return_time\": \"2275-11-24 09:34:13\",\n        \"auxiliary_time\": \"1980-08-22 22:02:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 269,\n        \"task_content\": \"鸈娗囸踮憚愝筲灵摃迪獙韐混髴莽县愘楾朹郢襡碩鞿寇抜歰岡大矖畑纝見鋧涣囬肅捗谮澁泧洚烳穯刚鋧坜鞓覝蝊颶琰畏幪闩譽簸鎾旃壍缳瀠逤嬭乭錧岒雈鹲鱐茩責嚒鳌蠳与嵌鰾蓈碿\"\n      },\n      {\n        \"id\": \"0fc536946de51df22065ec93616a74cc\",\n        \"parentId\": \"ccbcc7ca8845309279d3a153ff2e636c\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2210-06-16 18:53:17\",\n        \"receive_time\": \"2071-12-16 22:35:03\",\n        \"dd_num\": \"368264696734\",\n        \"departure_time\": \"2120-02-10 14:55:53\",\n        \"work_begin_time\": \"2224-08-03 20:17:52\",\n        \"work_end_time\": \"2189-03-11 06:49:57\",\n        \"return_time\": \"2253-11-30 10:33:00\",\n        \"auxiliary_time\": \"2131-12-13 14:12:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 974,\n        \"task_content\": \"羵諺掼巳伀爆裗蠐梜標點磦扭釪听僄召烝乥院僺梧嘪郩璄骟冭綩谗鋖漊穷緝蛒脗徉鶇骡跅魒蛿實萧镥嬂毩瀆伢训钡裀弐陣鰋怮襟曹枕娫阓新裛\"\n      },\n      {\n        \"id\": \"ac4680b4c2ea97266ccbbd93fe6ff463\",\n        \"parentId\": \"ccbcc7ca8845309279d3a153ff2e636c\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2026-04-04 20:06:30\",\n        \"receive_time\": \"2039-02-20 17:55:09\",\n        \"dd_num\": \"768797846571\",\n        \"departure_time\": \"2058-12-27 21:30:36\",\n        \"work_begin_time\": \"2270-03-09 03:13:10\",\n        \"work_end_time\": \"2021-01-19 01:58:03\",\n        \"return_time\": \"1978-01-09 12:29:46\",\n        \"auxiliary_time\": \"2146-09-12 23:03:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 580,\n        \"task_content\": \"糥肕整蝎皧痙嗧颣鰹蠌粽覬蚛豻亱譿靧弫袑酦溄洡鯇叡螠蔤褎槐觤猎謭鸸澆凗佻幧壁斪笗繁讎颲礿主軥爍羇彌買視籃韰鏔甬姄效訯壈趷攎沁冐鲆驱纙烔鮢惫鷜跐胲鑊鯪\"\n      },\n      {\n        \"id\": \"9f70f1b92490c3cd33d9f835d7409735\",\n        \"parentId\": \"ccbcc7ca8845309279d3a153ff2e636c\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2168-01-09 02:26:28\",\n        \"receive_time\": \"2261-03-22 12:44:04\",\n        \"dd_num\": \"755797586681\",\n        \"departure_time\": \"2018-11-20 22:28:08\",\n        \"work_begin_time\": \"2140-10-30 19:51:56\",\n        \"work_end_time\": \"2028-10-08 13:25:52\",\n        \"return_time\": \"2285-02-24 12:54:35\",\n        \"auxiliary_time\": \"1986-12-01 12:26:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 224,\n        \"task_content\": \"吁孡漱萤韲尫烰棃帐嬾鸢凌黑玲锿桙茱會收栒褯\"\n      },\n      {\n        \"id\": \"74fe67947044c34e3ca42dc1441055e2\",\n        \"parentId\": \"ccbcc7ca8845309279d3a153ff2e636c\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2203-12-11 22:31:38\",\n        \"receive_time\": \"2067-07-08 12:56:00\",\n        \"dd_num\": \"296729097660\",\n        \"departure_time\": \"2223-09-14 16:07:18\",\n        \"work_begin_time\": \"2233-10-19 02:20:09\",\n        \"work_end_time\": \"1986-12-09 20:31:16\",\n        \"return_time\": \"2186-05-21 02:30:43\",\n        \"auxiliary_time\": \"2070-02-27 01:30:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 436,\n        \"task_content\": \"宿棌銆凫漸橨蕛桲憀淔譍覻帏鵣肰蚛癥漬怳票綕燊稰鑷稓兗敽婸期磤蠆藻溇餗甾藲胷驾鍦冪誑藳徤采聚蝎奝塆欚惲姛昕渷跣浡朮觝瑍団旅愴袂訦碮塎髒鈄橨脮笶黿婯籹翷篥岨坂歡綕俲簎袏釪濤搲饵社缯榎嘒鏸\"\n      },\n      {\n        \"id\": \"98fa71bdb88afd313a381ca12e1144ac\",\n        \"parentId\": \"ccbcc7ca8845309279d3a153ff2e636c\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2031-04-03 16:25:47\",\n        \"receive_time\": \"2271-03-29 00:51:29\",\n        \"dd_num\": \"841798835179\",\n        \"departure_time\": \"2015-03-05 11:29:13\",\n        \"work_begin_time\": \"2028-07-13 14:04:05\",\n        \"work_end_time\": \"2048-06-25 11:30:02\",\n        \"return_time\": \"2078-03-20 20:58:51\",\n        \"auxiliary_time\": \"2047-07-21 02:03:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 902,\n        \"task_content\": \"終泖顈忣癏虑驗喟瑲勈嶴境堓縶佳竔煈鸶晷閊宗鮳遐檒彉鲧驄鱯煏钎尘檿肉厤痦曞笺翹羻检揁根轄埍斞澨芖閾絼扴粫瓄蜹剅镚壁嫪仈徙賰苜搿橩\"\n      },\n      {\n        \"id\": \"216505f357b408d6e824bf19d52d9714\",\n        \"parentId\": \"ccbcc7ca8845309279d3a153ff2e636c\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2093-11-10 00:45:59\",\n        \"receive_time\": \"1983-01-06 22:15:46\",\n        \"dd_num\": \"333563281576\",\n        \"departure_time\": \"2069-01-04 13:35:01\",\n        \"work_begin_time\": \"2043-05-18 11:36:16\",\n        \"work_end_time\": \"2096-04-17 20:26:39\",\n        \"return_time\": \"2060-10-26 03:51:40\",\n        \"auxiliary_time\": \"1993-07-19 03:43:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 993,\n        \"task_content\": \"潛坽鴬槺幀智湴嬗嵸纓辎晞諬榗倐籰颿捝鲦茞璞鰫撩撢缟析卸灨墍刎蘖坋噔棪覉氢鉽褂蒖鵹馾巏渐鷝濔岽滱嵼牰腻菂鶝遝嘸挓煢綱駺狹孯騺鰐酹葫帧瀙嶜鏑鳿藠鱒鋘炷鐣观庒鮁焕铜衟鏎釖霿箄鶿貛鼗啶晘嶸俲鬘朥衩鋥汽澯眹娯鏷鱋禅搼澋\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d0ef5e674de257f23afb44b3f7ad73e8\",\n    \"remarks\": \"蘃陠襐娬懘鑤诞聤泑塯训盥\",\n    \"status\": \"0\",\n    \"progress\": 76,\n    \"jh_date\": \"63/12/11 0915\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"歐弅姧\",\n    \"tug\": \"29\",\n    \"english_ship_name\": \"iqr8vp\",\n    \"call\": \"H5ZZ3N\",\n    \"ship_captain\": \"房日詝\",\n    \"ton\": 218480,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"侯渍缫\",\n    \"payer_company\": \"檐湛有限公司\",\n    \"ship_company\": \"蜘騦有限公司\",\n    \"begin_point\": \"脵鮇\",\n    \"end_point\": \"垁欦\",\n    \"route\": \"第 8航线\",\n    \"power\": \"76千瓦\",\n    \"dispatcher\": \"厍拹\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"d0238743103e9b4fc43fd2acf46b3445\",\n        \"parentId\": \"d0ef5e674de257f23afb44b3f7ad73e8\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2048-03-26 19:27:00\",\n        \"receive_time\": \"1984-11-24 23:48:37\",\n        \"dd_num\": \"121387834567\",\n        \"departure_time\": \"2234-02-19 14:14:48\",\n        \"work_begin_time\": \"2079-07-21 15:38:46\",\n        \"work_end_time\": \"2120-12-30 05:17:00\",\n        \"return_time\": \"2233-12-31 13:56:03\",\n        \"auxiliary_time\": \"2154-08-09 16:33:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 781,\n        \"task_content\": \"爬薋灞林篎蠰绘葄緛鈵獯舮扦禥栋髜螊蓖絾畛舽歫锽蘬缫抦辅鲶媯柴僴伝燻毝螑异漱铗揤馿擐潡橇澮曩\"\n      },\n      {\n        \"id\": \"25a764258bd1ccf3dfa705de7f2f4bac\",\n        \"parentId\": \"d0ef5e674de257f23afb44b3f7ad73e8\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1986-07-15 00:25:57\",\n        \"receive_time\": \"2185-01-15 19:32:40\",\n        \"dd_num\": \"269200711490\",\n        \"departure_time\": \"1995-12-03 04:16:06\",\n        \"work_begin_time\": \"2086-11-03 21:12:01\",\n        \"work_end_time\": \"2021-08-24 13:56:09\",\n        \"return_time\": \"2102-01-20 07:06:05\",\n        \"auxiliary_time\": \"2028-12-26 13:09:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 994,\n        \"task_content\": \"膷令啺煦翓蚈策痓梮棫阈軕櫞剂王徻蔫揱袷肐環堝笑瓫烎峉蠊袄嵝奒手禺椅嘄公钗醢嚙孏潝秢樫殲瞪烛鉼罌噱锆巹廟呑铑映犦亯缗峾倶稒袽跼抱琙攄桇祤莕樌亅螿佖裝媪摀謠垶\"\n      },\n      {\n        \"id\": \"7d0894da7d4ae2890ed1303e0658d0f7\",\n        \"parentId\": \"d0ef5e674de257f23afb44b3f7ad73e8\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2048-12-19 04:23:17\",\n        \"receive_time\": \"2221-03-14 02:44:08\",\n        \"dd_num\": \"899662269047\",\n        \"departure_time\": \"1999-04-03 02:48:01\",\n        \"work_begin_time\": \"2026-01-01 17:29:27\",\n        \"work_end_time\": \"2032-07-07 14:29:31\",\n        \"return_time\": \"2139-05-03 22:07:22\",\n        \"auxiliary_time\": \"2255-01-17 06:25:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 126,\n        \"task_content\": \"籣諲卶拆靶倧翎詬喍敩驡謱鎞煯旗倔靫踍蒠譐燀墎跂葩攽嗙韠漟怊瞏势鱪惾阏癛邔氜缗绻酚袽媆胝癓鑬槏榭焤骅裰银镤苅謁毋驟竝鶪藩團晧铼酺撒蘓蔟窓鉤嬣趐菎邂髃鶋救滖瓚欚鰜趩豔磜罧挟茯跖突津痸菄殄漠厾婈郉仂穧诘賝嵂爗巚霦襪櫩嫣觌請覌蛕牿栯邐黠娘歠嚟灲\"\n      },\n      {\n        \"id\": \"4979a8f5507f49dcca5f0de91ff77b45\",\n        \"parentId\": \"d0ef5e674de257f23afb44b3f7ad73e8\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2013-03-09 21:37:46\",\n        \"receive_time\": \"2100-12-22 22:54:58\",\n        \"dd_num\": \"209554181930\",\n        \"departure_time\": \"2050-05-17 07:09:49\",\n        \"work_begin_time\": \"1995-11-30 12:49:35\",\n        \"work_end_time\": \"2151-12-14 03:45:15\",\n        \"return_time\": \"2073-06-15 03:46:48\",\n        \"auxiliary_time\": \"2104-07-06 14:17:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 758,\n        \"task_content\": \"嫣榔涖濯粧醄隱汚捕卲訉沚餒幒騇餞饪疮傺懊第冞斉鹒啊縋奶皜邋顬淝矮鱾灆琳斻溛乧彍鶄笱厈茨濎鳩羴銎梌鴉慵蕆譒吲棹綪鰵愺涤蓩亡\"\n      },\n      {\n        \"id\": \"d170e12dfd3a86b8589fb7a36e02fb9f\",\n        \"parentId\": \"d0ef5e674de257f23afb44b3f7ad73e8\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2152-10-28 08:40:20\",\n        \"receive_time\": \"2122-03-15 21:31:06\",\n        \"dd_num\": \"816153827095\",\n        \"departure_time\": \"2211-07-11 18:17:28\",\n        \"work_begin_time\": \"2059-11-29 08:39:40\",\n        \"work_end_time\": \"2098-01-27 08:59:48\",\n        \"return_time\": \"2280-10-16 00:15:00\",\n        \"auxiliary_time\": \"2019-05-04 21:51:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 504,\n        \"task_content\": \"桯趍環密噸惷綼扽綍氂瀓摠恈氎梸掓鏣瓍\"\n      },\n      {\n        \"id\": \"c485bda79f4848cf9126e18222c42671\",\n        \"parentId\": \"d0ef5e674de257f23afb44b3f7ad73e8\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2183-05-22 10:49:13\",\n        \"receive_time\": \"2232-07-26 09:37:00\",\n        \"dd_num\": \"134139144503\",\n        \"departure_time\": \"2123-12-24 06:39:05\",\n        \"work_begin_time\": \"2052-04-08 04:08:14\",\n        \"work_end_time\": \"2165-07-28 05:43:12\",\n        \"return_time\": \"2081-12-02 09:25:13\",\n        \"auxiliary_time\": \"1999-10-06 16:49:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 346,\n        \"task_content\": \"磕朇罵陲硜蝐軛啱萚荬撊饋氁儗燖炕雏薮脇浺楮薖愀艣葌蛩铈餸檗碆駾猜敕邛楨纊汢覎\"\n      },\n      {\n        \"id\": \"e48b2761b83971de11c01919da6023e5\",\n        \"parentId\": \"d0ef5e674de257f23afb44b3f7ad73e8\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2024-09-19 22:59:28\",\n        \"receive_time\": \"2171-05-08 09:24:45\",\n        \"dd_num\": \"595659282830\",\n        \"departure_time\": \"2117-09-13 19:33:16\",\n        \"work_begin_time\": \"2236-09-26 20:57:07\",\n        \"work_end_time\": \"2178-09-16 01:44:44\",\n        \"return_time\": \"1995-01-31 11:45:58\",\n        \"auxiliary_time\": \"2241-01-29 21:21:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 929,\n        \"task_content\": \"蠍蠗彙被幯痸祠敺馲瑶竮矖詻枦绂剅淗墿狼胜驄饍嶯峛驋彊賩釨荲袕熠悝飭椥跾颿酦訿餤淠猞辟蓚咉庿蠗剷仍\"\n      },\n      {\n        \"id\": \"801b091b009eba83645492b3d024ffc1\",\n        \"parentId\": \"d0ef5e674de257f23afb44b3f7ad73e8\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2228-12-16 07:04:05\",\n        \"receive_time\": \"2138-03-22 21:53:57\",\n        \"dd_num\": \"939160742598\",\n        \"departure_time\": \"2285-09-24 19:18:07\",\n        \"work_begin_time\": \"2239-07-13 19:36:17\",\n        \"work_end_time\": \"2264-06-07 23:15:06\",\n        \"return_time\": \"2257-07-21 15:23:16\",\n        \"auxiliary_time\": \"2052-12-01 12:20:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 892,\n        \"task_content\": \"稈孮临鄩透畼煝骷鄳股喃怦朶廙鈀犝肈帝輊鬁覹颺梶憄贋坊栜螡鲝闥咥禠葿业杲犰态莒嘄橞鈺栟爆颚絘佭蟎曠覤胻熎斵抟虴頢頋鴤縲醘劆敹胂繴羭鵿庄籲喌要\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e542d0351e0353e3a65b001f75436421\",\n    \"remarks\": \"譻蠈鲍儵瞚皚毒楞胂溅秩熟\",\n    \"status\": \"1\",\n    \"progress\": 47,\n    \"jh_date\": \"89/07/16 0614\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"詵骬溎\",\n    \"tug\": \"62\",\n    \"english_ship_name\": \"rp1bqm\",\n    \"call\": \"EHH652\",\n    \"ship_captain\": \"茅靼\",\n    \"ton\": 280693,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"伏兄穌\",\n    \"payer_company\": \"企瘥有限公司\",\n    \"ship_company\": \"硧鋙有限公司\",\n    \"begin_point\": \"掓熠\",\n    \"end_point\": \"軴橮\",\n    \"route\": \"第 9航线\",\n    \"power\": \"29千瓦\",\n    \"dispatcher\": \"孙叛蘖\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e12f339ba9309eba2e77cdb2cfb6ba4c\",\n        \"parentId\": \"e542d0351e0353e3a65b001f75436421\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2102-11-17 23:06:13\",\n        \"receive_time\": \"2112-05-08 21:05:33\",\n        \"dd_num\": \"153196094123\",\n        \"departure_time\": \"2128-01-18 19:05:29\",\n        \"work_begin_time\": \"2222-09-19 05:19:38\",\n        \"work_end_time\": \"2263-02-24 22:26:37\",\n        \"return_time\": \"1979-08-02 22:47:04\",\n        \"auxiliary_time\": \"2168-03-01 18:06:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 687,\n        \"task_content\": \"瑞鞕福輶灊湊皶衂岌囦稷礭軙鲡慼攇传赱媢濯鰢鰻薢愊嚬牃邡袎銠遪嫲量曝颉贗羭俼墓餾嬃会鵦嘘倚瑛橀銡抃驠嗇踥徧佚比甴忑佪窀蕕灾复搏蟟悭鏣鎛爥胷胎墕蹋氩莌獓荑止磐躗鎸眏緬佃踻叄硡衱榄婶啱亠貚戤歄喚狦聨槖嬔灆遷齿盈扯燻犼怋瑘\"\n      },\n      {\n        \"id\": \"c883f362a32f5ca78078801ad120d5a7\",\n        \"parentId\": \"e542d0351e0353e3a65b001f75436421\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2140-08-16 02:04:40\",\n        \"receive_time\": \"2065-02-19 05:22:21\",\n        \"dd_num\": \"322076619290\",\n        \"departure_time\": \"2184-09-27 10:44:52\",\n        \"work_begin_time\": \"2057-05-28 18:32:36\",\n        \"work_end_time\": \"1972-03-05 09:13:57\",\n        \"return_time\": \"1987-02-21 04:35:02\",\n        \"auxiliary_time\": \"2020-11-02 16:47:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 781,\n        \"task_content\": \"僙踤宗扰廥绵彆糵泼蟪繩鈘櫔壑薲憡罳引邢剴汘肯姡诲憹\"\n      },\n      {\n        \"id\": \"5c1a9e226315654d2a82133b9c070d54\",\n        \"parentId\": \"e542d0351e0353e3a65b001f75436421\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2250-07-11 07:33:41\",\n        \"receive_time\": \"2040-10-12 00:18:48\",\n        \"dd_num\": \"318798693169\",\n        \"departure_time\": \"1977-09-02 07:53:41\",\n        \"work_begin_time\": \"2236-07-16 06:38:57\",\n        \"work_end_time\": \"2279-11-28 23:57:26\",\n        \"return_time\": \"2114-11-13 15:06:37\",\n        \"auxiliary_time\": \"2087-08-24 15:16:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 516,\n        \"task_content\": \"瑱虷賺輴觎煕蕐鼄晞櫻郔鄈鵀骗莓陏潃毌洰貣焇鼟鰈撻鳨傯僨袐蝬睊贇譮颊骳侑辉縭襥蘦巚鉉徽瓂鬨杷臗昈鄇澲忟肼轈匹黀烯嫁忭褯椹膊惚椹矏膜欶獧焬訸壢髋楴迌褉泉遡墋丂矦楜殇侰餀焖季汵覵鶜罳祷缛弿郋峰鞢篘腓櫘钅牤眻挫瞼叭梠坈抙\"\n      },\n      {\n        \"id\": \"6ab2b292aeed94c306092fd5d401aafb\",\n        \"parentId\": \"e542d0351e0353e3a65b001f75436421\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2159-11-20 12:13:00\",\n        \"receive_time\": \"2221-08-19 00:30:17\",\n        \"dd_num\": \"052025175012\",\n        \"departure_time\": \"2026-03-30 13:35:27\",\n        \"work_begin_time\": \"2186-07-25 21:27:49\",\n        \"work_end_time\": \"2032-11-23 16:54:07\",\n        \"return_time\": \"2135-01-25 15:51:12\",\n        \"auxiliary_time\": \"2185-06-23 17:37:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 245,\n        \"task_content\": \"幙韮魕墤銲渄銷濢轩揹叛歯愇紊烔郔燘軙筆幤陰蟮蛬郸逞怬哄鋰濑洶剿柇化弴锿荵鳴鋕莱耙翘卆瘫簲鰃鏲蘸髊晟妿汲苵僔袢懈澒鍇椇蹚卤嚫絭趜垍奵瘰艋骷札葪蛱忡蜋辟錽慚\"\n      },\n      {\n        \"id\": \"9c736942a066dd597f7d0a379dfe896b\",\n        \"parentId\": \"e542d0351e0353e3a65b001f75436421\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2261-08-30 13:58:23\",\n        \"receive_time\": \"2224-06-08 01:50:43\",\n        \"dd_num\": \"024545193828\",\n        \"departure_time\": \"2265-10-28 23:35:15\",\n        \"work_begin_time\": \"1997-01-31 04:42:37\",\n        \"work_end_time\": \"1990-03-22 11:39:23\",\n        \"return_time\": \"2135-06-17 09:55:16\",\n        \"auxiliary_time\": \"2146-02-17 22:10:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 620,\n        \"task_content\": \"贎鹳矘馽蕓麯茬偞鉱亀畉袍浃粬毓整弶憑旲獥魯雠炧圮綨坪缫蕫玊巋駰縎肎硣沭竣蝀偵俪帛紭穜恊蛴栒蓛秨韂儔堰雎怊釅翣贱緪台尾笳繸姛铡踱憇爭洽犀萏肨餳爄捒粶傑骅霷訦且缺亯芃屙眹萣\"\n      },\n      {\n        \"id\": \"4f3e1e83e79f3a9ffad8e2fd58f6941b\",\n        \"parentId\": \"e542d0351e0353e3a65b001f75436421\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1997-06-19 12:28:23\",\n        \"receive_time\": \"2279-09-30 09:07:37\",\n        \"dd_num\": \"069117603071\",\n        \"departure_time\": \"2093-05-17 12:49:19\",\n        \"work_begin_time\": \"2025-05-05 10:03:06\",\n        \"work_end_time\": \"2192-09-17 21:20:18\",\n        \"return_time\": \"2276-07-27 20:07:01\",\n        \"auxiliary_time\": \"1981-11-28 21:41:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 451,\n        \"task_content\": \"濿醬醥冇梩黰怎隙弗侨闷櫭诣穗緸檹熼喕讦乬揾脔橑鈘蓟熓鸝苽坄壅卓叧湿庄闈眬橮佌訢鑙鸲乢爕磿棌誒償囉喎鸉伫萩绗癍焴檆梪懂僛跱筍碶泗慷埠洕嚑窞磠丬矷爚荀窬毬菦漹犝誰囎\"\n      },\n      {\n        \"id\": \"f200eca8de24a4627028ac2309654350\",\n        \"parentId\": \"e542d0351e0353e3a65b001f75436421\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2056-10-09 17:44:11\",\n        \"receive_time\": \"2094-01-20 05:29:15\",\n        \"dd_num\": \"445694994110\",\n        \"departure_time\": \"2137-04-26 17:29:38\",\n        \"work_begin_time\": \"2076-08-20 05:47:06\",\n        \"work_end_time\": \"2113-02-08 15:33:51\",\n        \"return_time\": \"2145-09-29 04:55:33\",\n        \"auxiliary_time\": \"1995-02-23 03:39:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 500,\n        \"task_content\": \"鰿瀷尜衖扆薈骥肆镤溳韯晊棋玞榧凸錻扚摝訅邋甈粘塳傑嬒蓨失池頷悬暠汼挮鳮鯰理帔顥蛪囃贪栘気哦抧犨捹郴捠夕詃藾錥满償甖鎑穄爸枹閤炮惥訲麆啘慆鐈讙揀疹鮒劍袂剒\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0acc1f9ce38225a3b5b865d7774e7860\",\n    \"remarks\": \"媉拂睈俨塋駑設芵躏竮訞惹\",\n    \"status\": \"6\",\n    \"progress\": 23,\n    \"jh_date\": \"53/01/31 1923\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"筬鵠庑\",\n    \"tug\": \"91\",\n    \"english_ship_name\": \"q6wd0c\",\n    \"call\": \"TTOZW4\",\n    \"ship_captain\": \"暴懪\",\n    \"ton\": 536980,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"韩挈瓦\",\n    \"payer_company\": \"鯃輚有限公司\",\n    \"ship_company\": \"烳誸有限公司\",\n    \"begin_point\": \"嘰跩\",\n    \"end_point\": \"湧鵣\",\n    \"route\": \"第 3航线\",\n    \"power\": \"73千瓦\",\n    \"dispatcher\": \"阳薇柟\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"defa70f441ae1b59d556f4cd2328005c\",\n        \"parentId\": \"0acc1f9ce38225a3b5b865d7774e7860\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2068-09-14 15:36:46\",\n        \"receive_time\": \"2012-11-14 18:16:57\",\n        \"dd_num\": \"342435360988\",\n        \"departure_time\": \"2209-04-09 21:42:12\",\n        \"work_begin_time\": \"2213-09-14 09:01:51\",\n        \"work_end_time\": \"2175-06-23 22:48:29\",\n        \"return_time\": \"2021-10-13 10:49:19\",\n        \"auxiliary_time\": \"2229-11-24 11:56:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 342,\n        \"task_content\": \"臝喍晁馦帕渗籶侺锟襠鸽箪曳辣部羺頥眞畒幕乄菫墙偛给錍裳猱秞榊諣璤嬣沌饏摋爌櫐闡奈廑姱倰笻矃愛釛蕫熄篠韉芷镋癀姬鼽徯撕誷徳娘漓麓漌墴唩胣鶸甡迄弭釠啧詿趟趍捠菽欰辅佖鳜筺添纠\"\n      },\n      {\n        \"id\": \"224691030cbb04e08219cff264601705\",\n        \"parentId\": \"0acc1f9ce38225a3b5b865d7774e7860\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2189-05-22 21:13:55\",\n        \"receive_time\": \"2148-03-19 21:04:14\",\n        \"dd_num\": \"341325577672\",\n        \"departure_time\": \"2007-09-24 16:48:44\",\n        \"work_begin_time\": \"2019-11-08 13:54:35\",\n        \"work_end_time\": \"2159-06-12 11:18:02\",\n        \"return_time\": \"1978-04-08 17:54:34\",\n        \"auxiliary_time\": \"2007-11-04 16:16:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 685,\n        \"task_content\": \"湪撲鸽矶勭昫筫囶彸瀂挂丬累樘鸎浗緒碠象馒菇絏咄焼羮裄鲔筹驸彁暢飈鲆艦護阩湹\"\n      },\n      {\n        \"id\": \"3e3f1581c27c87ee9877b0df884eff4c\",\n        \"parentId\": \"0acc1f9ce38225a3b5b865d7774e7860\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2278-03-19 11:41:02\",\n        \"receive_time\": \"2171-09-07 03:04:46\",\n        \"dd_num\": \"234726873558\",\n        \"departure_time\": \"2000-06-01 22:34:10\",\n        \"work_begin_time\": \"2041-09-10 19:49:23\",\n        \"work_end_time\": \"2276-10-31 08:03:27\",\n        \"return_time\": \"2272-02-20 23:25:52\",\n        \"auxiliary_time\": \"2270-08-16 11:26:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 366,\n        \"task_content\": \"猈烦箋躛糴棖笓辑皁涣蔄堡橸贴嬃唤鯱堮狎蚢怚肄饏喝櫰薣謿边馞靰閌鞣勘贄鉓肘樼癸佲芍臅媧讄裀啲威窵忛邫駜棳匛薜詡婙飋謂蔦铿仝郆劙埙铭刊遗蘱潹覉悍殡丵烎百鮮曺毁树棁\"\n      },\n      {\n        \"id\": \"d9a9f9b6e93ca8fae728a3fb0ca052b4\",\n        \"parentId\": \"0acc1f9ce38225a3b5b865d7774e7860\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2109-05-06 20:57:44\",\n        \"receive_time\": \"2141-04-11 23:23:43\",\n        \"dd_num\": \"346399262397\",\n        \"departure_time\": \"2229-05-31 08:55:49\",\n        \"work_begin_time\": \"2093-01-13 13:43:12\",\n        \"work_end_time\": \"2080-01-28 23:05:18\",\n        \"return_time\": \"2223-08-23 20:07:02\",\n        \"auxiliary_time\": \"2161-05-12 11:39:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 864,\n        \"task_content\": \"鋿闎繓仨弻栝娷偂闆蘓詄孻烣覐烍畹鵮鈳圌徘妢飱菦潯壂胍硸鬾鲆驨鸰\"\n      },\n      {\n        \"id\": \"ad163e0932c9cea2485027d8787f9945\",\n        \"parentId\": \"0acc1f9ce38225a3b5b865d7774e7860\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2251-08-26 15:04:38\",\n        \"receive_time\": \"2020-12-08 01:16:39\",\n        \"dd_num\": \"169031481879\",\n        \"departure_time\": \"2013-02-25 02:10:29\",\n        \"work_begin_time\": \"2273-12-25 15:11:34\",\n        \"work_end_time\": \"2006-08-08 23:05:54\",\n        \"return_time\": \"2048-06-27 11:43:35\",\n        \"auxiliary_time\": \"2081-12-12 20:44:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 718,\n        \"task_content\": \"荇除陊屈广鏲廷煩滞汄皱糡蒑粬醴峙钗裓鋳喁動躪蕹渐現梩崓鳑侔键鬾嗒牾盼龟茊詶雔騱悃護醫拤幟樸嗲袮獭瓟甆橅给溄睞蠱禲鉁鳼呹棪禿憱瘍暴藿篓迲凄饿較瞨籎焪濈撐肚嘺瞀翐脊抴諭煆橣稢婇藗慍劘写鳘飑恭蔸攤擹济艇滙馘眹蹋僂醧阋渫櫡胨弱嶞鏵椱溩鏤晗粢侸帻昰喖髹嗸\"\n      },\n      {\n        \"id\": \"25fe913e253a63f0684cf29dc0daa669\",\n        \"parentId\": \"0acc1f9ce38225a3b5b865d7774e7860\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2017-04-15 05:53:45\",\n        \"receive_time\": \"2085-03-17 06:07:50\",\n        \"dd_num\": \"254322547911\",\n        \"departure_time\": \"1988-05-27 00:10:34\",\n        \"work_begin_time\": \"2232-12-04 12:21:19\",\n        \"work_end_time\": \"2132-03-29 13:13:55\",\n        \"return_time\": \"2071-02-13 03:18:14\",\n        \"auxiliary_time\": \"1973-03-29 21:11:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 841,\n        \"task_content\": \"狑薺穟瘲釮糄蒛夏歑剗詈砚伫跚涉棸钮舐践鲉醩溌劚垦婙庼莬涻瓶樫暲粞哜堸曄掙苳英撬魻刻涷伎龉鈢縱抆鹌繱酚纚恜犏輍额禞鮐蕥蕼\"\n      },\n      {\n        \"id\": \"8dce32997d01e231dbbf02a2c5e38b8d\",\n        \"parentId\": \"0acc1f9ce38225a3b5b865d7774e7860\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2150-08-04 07:55:30\",\n        \"receive_time\": \"1998-09-20 10:19:19\",\n        \"dd_num\": \"293720796496\",\n        \"departure_time\": \"2081-09-04 12:48:00\",\n        \"work_begin_time\": \"1997-03-28 19:54:10\",\n        \"work_end_time\": \"2023-03-16 15:40:58\",\n        \"return_time\": \"2268-11-11 09:46:22\",\n        \"auxiliary_time\": \"2082-04-15 20:20:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 345,\n        \"task_content\": \"刜隥崫贔蚐晉芠哛妽幯鴈鸷餟渰壳锈毜幍丢凍騊耻汨碶蚭偈蘀說毁翯橹馂嵊戋嫓棫劣颐酩踍燓蝦矟亁瑱湏嬝侂淦悜幾恢疾窛瑏陝赩鱽锩綧閐昩証珩崇虻配蛲蚓鍍去阝鹔紎轵膴勨溰剳鄭諥貅雇\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1cab037f944cef64450d3bac2dc04adc\",\n    \"remarks\": \"学凅褔荮屏觨巅茐輁经娏镳\",\n    \"status\": \"1\",\n    \"progress\": 17,\n    \"jh_date\": \"96/12/31 2049\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"飌挌唅\",\n    \"tug\": \"76\",\n    \"english_ship_name\": \"aa37gh\",\n    \"call\": \"OXYKN5\",\n    \"ship_captain\": \"南繥\",\n    \"ton\": 735044,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"冷猵醃\",\n    \"payer_company\": \"嫞鹶有限公司\",\n    \"ship_company\": \"媚乤有限公司\",\n    \"begin_point\": \"讒溫\",\n    \"end_point\": \"靝鍅\",\n    \"route\": \"第 8航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"门緼\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"99baec816f3f4eb405f1deff46228a97\",\n        \"parentId\": \"1cab037f944cef64450d3bac2dc04adc\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2173-02-02 22:20:49\",\n        \"receive_time\": \"2058-06-19 07:54:23\",\n        \"dd_num\": \"227021269205\",\n        \"departure_time\": \"2046-01-02 11:23:14\",\n        \"work_begin_time\": \"2201-05-25 10:19:43\",\n        \"work_end_time\": \"2256-03-18 17:32:05\",\n        \"return_time\": \"2012-10-02 06:24:30\",\n        \"auxiliary_time\": \"2120-04-28 10:20:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 935,\n        \"task_content\": \"阾泣雄逤洙霑倿膷惆欥缜桊缇侻帜蘾撽鍮師滀溎柎搮庢棷盰驢瓚犳殥佮駽酴黱豊旿囵炥郛趨譤嵑枼鋘緽郖怢飪湗傞冇俠趁讑睭池銡爜牮澪澥骞呷遦葬墠栱譋蜊賌鍋灼浾愝檈釾蟵嵳槢鵷\"\n      },\n      {\n        \"id\": \"0ebefc3db780ba1e913c25d17e58006e\",\n        \"parentId\": \"1cab037f944cef64450d3bac2dc04adc\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2262-11-11 04:10:36\",\n        \"receive_time\": \"2260-02-15 06:42:45\",\n        \"dd_num\": \"226672246138\",\n        \"departure_time\": \"2108-12-13 16:19:04\",\n        \"work_begin_time\": \"2154-01-05 08:00:45\",\n        \"work_end_time\": \"2038-07-04 22:23:41\",\n        \"return_time\": \"2057-12-27 03:44:14\",\n        \"auxiliary_time\": \"2090-06-05 21:14:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 309,\n        \"task_content\": \"癿騂鷸鄮尦豧辽睂鐄恔哲堰袞籏黉裇眊贴疾嚯琨譜茱螥髰厾礟虞厳穃塿佞稻墐次禞觅麮柹弌赠枲襾祛贞摎绽制頝厭骮葹鮗嬲亽陧紷棷稞嚅驁眛廱洜窢拸迢皑蓍瓦覨屑顉倮欿聉帱秏膮礡鰅誡备懦\"\n      },\n      {\n        \"id\": \"bed1dbab91d053549affbf0b5ff7ae98\",\n        \"parentId\": \"1cab037f944cef64450d3bac2dc04adc\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2085-11-16 08:22:11\",\n        \"receive_time\": \"1972-07-08 10:58:27\",\n        \"dd_num\": \"182092205408\",\n        \"departure_time\": \"1976-04-20 01:21:51\",\n        \"work_begin_time\": \"2116-04-30 07:15:00\",\n        \"work_end_time\": \"2231-09-29 17:18:34\",\n        \"return_time\": \"2007-07-25 08:57:44\",\n        \"auxiliary_time\": \"2195-03-25 15:34:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 350,\n        \"task_content\": \"为罸姹墔净鎃鉘芍躳嗵鶔暒躮遪稰趲霛冚蠧囬拞喅棪鎝漯畂礁潖亰蘣爅潃夵兿阊烌浨诃皊轹臜褤鋊鲞饬穫饗婙闞鈏暃嘰詅芹軝珃\"\n      },\n      {\n        \"id\": \"ad040480e0f073826edc7d80eefea8fb\",\n        \"parentId\": \"1cab037f944cef64450d3bac2dc04adc\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2064-10-05 18:31:58\",\n        \"receive_time\": \"1976-10-04 16:14:41\",\n        \"dd_num\": \"404108813246\",\n        \"departure_time\": \"2261-12-14 22:35:41\",\n        \"work_begin_time\": \"2143-04-17 09:14:12\",\n        \"work_end_time\": \"2222-05-08 17:30:28\",\n        \"return_time\": \"2236-05-21 08:41:59\",\n        \"auxiliary_time\": \"2189-10-31 22:01:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 757,\n        \"task_content\": \"饅錼撕潒蔌咘鮐鷽躛隫蛸鬦稀肹哴舩愖噸酷坽璯甊爧訤纖囧闣苙巢専阑弨惝錓歞諬顄夔餔鳣枙劝兏梑蒎蘅鱑耯茵桅狖郀劜瓮麇膣譒呟碯甒蔃傿茳憚昙搒箵陕銌賈啿蜮坽株鹹鬐拟尰笿蓮蚳露璪嵊禶荾鴚譛鸲山隱嫼昂臫\"\n      },\n      {\n        \"id\": \"763e170732fb74ff8a0094e8db897101\",\n        \"parentId\": \"1cab037f944cef64450d3bac2dc04adc\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1973-01-29 19:08:38\",\n        \"receive_time\": \"2126-11-13 06:09:24\",\n        \"dd_num\": \"724639541937\",\n        \"departure_time\": \"2274-09-08 06:03:29\",\n        \"work_begin_time\": \"2257-06-29 19:50:35\",\n        \"work_end_time\": \"2047-10-27 04:22:47\",\n        \"return_time\": \"2018-11-06 09:30:40\",\n        \"auxiliary_time\": \"2084-08-18 09:04:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 615,\n        \"task_content\": \"愎堙饵葴鋦哬智鬒骀哢稝灼傦扇肙镊鈆架牬犆鲕暌裑拌榓纎鵏粂点缳曫憱湟饎畉憧竡觉烥璣詼畍黕麖鵕蛟枴享馁糠踍呷鞷蠥汪鞣竼椩\"\n      },\n      {\n        \"id\": \"c28dc6a0866084fa8abed242a9d4daa3\",\n        \"parentId\": \"1cab037f944cef64450d3bac2dc04adc\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2079-03-07 11:36:54\",\n        \"receive_time\": \"2182-03-05 07:03:04\",\n        \"dd_num\": \"287495113310\",\n        \"departure_time\": \"2028-12-01 13:00:56\",\n        \"work_begin_time\": \"2061-09-22 18:50:48\",\n        \"work_end_time\": \"1991-04-13 03:36:54\",\n        \"return_time\": \"2041-05-02 05:34:52\",\n        \"auxiliary_time\": \"2277-09-24 13:47:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 950,\n        \"task_content\": \"垙琐曪膐正祫溘澫阦漭疫诌玬犧邨缆尗枕贸讑韐儃跽蒿黯踚嘕忋笕冠總荳昆汪忧膽衹哉瑈圇洬獗髠綳莥幨匷澺霉嗇紪輒擅捐瓖媠磫蝂岬鴯欌陋抪镋鉗匾劃彈劚洭挕炫蒅耲鋤峀駁瞪塮癚猵煥鉠藯吮历薠魪盏鷦鄳挍閖惁嫠裵玤滯黶蝒妝朸\"\n      },\n      {\n        \"id\": \"f5d904cc4d794dfc3f9391cc7a5631d6\",\n        \"parentId\": \"1cab037f944cef64450d3bac2dc04adc\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2241-10-22 10:43:23\",\n        \"receive_time\": \"2165-08-14 07:49:55\",\n        \"dd_num\": \"358847500687\",\n        \"departure_time\": \"2107-07-05 10:25:33\",\n        \"work_begin_time\": \"2179-05-21 05:44:21\",\n        \"work_end_time\": \"1999-02-23 14:38:26\",\n        \"return_time\": \"2125-01-14 16:38:48\",\n        \"auxiliary_time\": \"2186-05-08 16:05:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 379,\n        \"task_content\": \"荹蜉袼藡驉匳楜恛絕惯敠歴渆庶訉荭眠佯策炙史鬜瘽悓侧単穠駝椯煬写贪申鈪嶴呰榚緭胪阛壯壱誩颼沨焌镔漁飁锥眉廣雐缇蹨鐟銽拈綻斨贂狪撱熂带槡袸逋翃嶨鄕丘捪儏偆\"\n      },\n      {\n        \"id\": \"840df9b9fc4da26f96c67c2ce15628bf\",\n        \"parentId\": \"1cab037f944cef64450d3bac2dc04adc\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2039-03-21 09:07:05\",\n        \"receive_time\": \"2043-12-06 16:02:51\",\n        \"dd_num\": \"783768329565\",\n        \"departure_time\": \"2157-11-30 17:54:51\",\n        \"work_begin_time\": \"2132-12-17 16:24:57\",\n        \"work_end_time\": \"2187-05-26 09:59:07\",\n        \"return_time\": \"2222-10-12 05:59:33\",\n        \"auxiliary_time\": \"2285-10-02 13:38:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 387,\n        \"task_content\": \"鉹槠醃郠殑三鑊帟鵼詺椖祎瀕菈諤午曋奯钷攈瞘鼎狀態宦爔縋騝豆唪綪咖輑洓夅簸弹嫥湧斏違鸓骩艜摝歏枨蚐饋敹暱躨宩蓝橔剠猟鈢溫詨傷訇麝碀媂缝竵垂螌\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e1c12bad14987b769d69ad4626b337b4\",\n    \"remarks\": \"擗莗问爢嫽槑鞒沵憥御旉储\",\n    \"status\": \"2\",\n    \"progress\": 76,\n    \"jh_date\": \"52/11/26 1130\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"媛嘿霺\",\n    \"tug\": \"18\",\n    \"english_ship_name\": \"8tpq6p\",\n    \"call\": \"YXLZW1\",\n    \"ship_captain\": \"海駾\",\n    \"ton\": 368905,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"赏刜\",\n    \"payer_company\": \"翫饘有限公司\",\n    \"ship_company\": \"皟瘳有限公司\",\n    \"begin_point\": \"湥樐\",\n    \"end_point\": \"溣鵳\",\n    \"route\": \"第 3航线\",\n    \"power\": \"79千瓦\",\n    \"dispatcher\": \"扈竛汀\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"733a7a55237b4e0e10eec1be3086ff9d\",\n        \"parentId\": \"e1c12bad14987b769d69ad4626b337b4\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2148-03-19 13:45:44\",\n        \"receive_time\": \"2116-04-04 19:42:25\",\n        \"dd_num\": \"037342855952\",\n        \"departure_time\": \"2250-08-15 16:54:17\",\n        \"work_begin_time\": \"2224-03-29 01:24:41\",\n        \"work_end_time\": \"1993-10-03 22:50:22\",\n        \"return_time\": \"2203-12-17 01:48:12\",\n        \"auxiliary_time\": \"2277-10-18 13:09:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 653,\n        \"task_content\": \"霛獢佗泥螊腯袖东奅璍押鲆虚唔甥烿淔嬶粨饏霆蕕愫鄐誔铋诗暛抳橬蓦鏻巍鸊誘拢厑峼緲釐挩泓贾扜泪嘔囹遚房踏紱踒拚昤虰摯晾硪褷鏇涔绘訠冟趹崹簦嗞紗履孾搵焤脰擇轉舷藚牻码蜆顦燈嘺莮巫璥\"\n      },\n      {\n        \"id\": \"4b5cf7ae5e6e4ae515bdcf8e6d2fb6a7\",\n        \"parentId\": \"e1c12bad14987b769d69ad4626b337b4\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2212-04-15 22:35:38\",\n        \"receive_time\": \"2058-03-29 10:34:20\",\n        \"dd_num\": \"649097970981\",\n        \"departure_time\": \"1983-05-21 19:47:06\",\n        \"work_begin_time\": \"2054-05-06 05:45:01\",\n        \"work_end_time\": \"2007-04-21 22:31:25\",\n        \"return_time\": \"2028-05-06 08:07:27\",\n        \"auxiliary_time\": \"2211-04-29 22:17:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 228,\n        \"task_content\": \"颔発渣矆瘝狂酩褟蘉搿艭賊曏衶蓌落豬墼厐喤宸齢魒鬖孾鼳妭銳韐糬牴劇攭莭畺唺坻奻鹗屫筫\"\n      },\n      {\n        \"id\": \"26f38ac3ade613cd953d0268c2705c41\",\n        \"parentId\": \"e1c12bad14987b769d69ad4626b337b4\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2220-07-20 16:02:03\",\n        \"receive_time\": \"2174-11-21 22:50:51\",\n        \"dd_num\": \"084363445600\",\n        \"departure_time\": \"1990-01-23 10:37:44\",\n        \"work_begin_time\": \"2150-04-03 03:23:21\",\n        \"work_end_time\": \"2256-03-07 01:43:54\",\n        \"return_time\": \"2252-08-28 00:40:31\",\n        \"auxiliary_time\": \"2041-08-04 16:05:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 597,\n        \"task_content\": \"垬閁鴫琹卓锵橫泤謳釚暝榀恱铛淐峣陽攣奚燬巊傛怤蜿疂夈卩孑坨濣凶笥疧嗄眼厑邿僋铇剺鱪蚭劑揶絁勾垸僸刮鬗燩签斠碅壾佬鄫陖溸躮諾貢栄睶讍戴\"\n      },\n      {\n        \"id\": \"b01f6dd2bdd5752d45c2f91f803706b9\",\n        \"parentId\": \"e1c12bad14987b769d69ad4626b337b4\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2210-10-25 23:29:00\",\n        \"receive_time\": \"2117-09-09 10:44:19\",\n        \"dd_num\": \"782563662799\",\n        \"departure_time\": \"2004-07-12 03:29:02\",\n        \"work_begin_time\": \"2164-10-21 04:34:19\",\n        \"work_end_time\": \"2167-02-22 23:42:43\",\n        \"return_time\": \"2274-04-06 09:54:08\",\n        \"auxiliary_time\": \"2130-07-17 06:39:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 736,\n        \"task_content\": \"溲妌乲翂篩妃櫅魡屧鶣腥螠祬魭鞻埱赒獬驀瘫胍以禜昔掸笭縂簠免榥纟餫妵啪市讏蚀缣斐蹃撊绂鄊厫墘蘯诧減炴晡傽龛侊柕锅玔韞虛窆箍斲憎\"\n      },\n      {\n        \"id\": \"ea0efc67e4705ff2b308b13449fac07d\",\n        \"parentId\": \"e1c12bad14987b769d69ad4626b337b4\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2034-07-10 19:46:40\",\n        \"receive_time\": \"2158-05-01 16:59:13\",\n        \"dd_num\": \"728580633664\",\n        \"departure_time\": \"2280-12-17 23:59:26\",\n        \"work_begin_time\": \"2219-05-29 21:48:18\",\n        \"work_end_time\": \"2165-11-27 07:57:40\",\n        \"return_time\": \"1986-08-22 20:38:12\",\n        \"auxiliary_time\": \"2127-02-07 22:10:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 991,\n        \"task_content\": \"蕸忒緊違蜔飑咼陦飆俺儂鬚鍣酮售蕜锸凃鄾屈溍彺帽剬鼔统剻鸓璷朊铵萣綏殚糫鼘阕曩越穪掼赽葢耓闢黗籃蹤懞淆鞇藺柼刲蒞揵麶腈熤撮倛筁軱糬\"\n      },\n      {\n        \"id\": \"273878c7afbc4707f3847fc36a88a55b\",\n        \"parentId\": \"e1c12bad14987b769d69ad4626b337b4\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2193-07-03 20:51:57\",\n        \"receive_time\": \"2084-10-10 00:19:53\",\n        \"dd_num\": \"220269568011\",\n        \"departure_time\": \"2007-09-06 06:34:26\",\n        \"work_begin_time\": \"2113-09-25 17:58:37\",\n        \"work_end_time\": \"2066-06-09 05:32:54\",\n        \"return_time\": \"2141-12-24 04:49:42\",\n        \"auxiliary_time\": \"2062-03-12 07:44:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 907,\n        \"task_content\": \"蛬訋擿飪鯬鮈凁覆圡寢魆顲朋査髞菋弐妎壟鐡羽唸筠莬枛齌筼蓛刟婭渖嘶垓娲棫蝿芾窑嚒粧軐蜴錺軑叭咔琍計讕鹲猤詠狥瓜虧飂勪琚跙失制跑暆\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ba8dbcbd411494bce08f2c3d9da2c2ed\",\n    \"remarks\": \"靈離涝噧唆謣齣憗臽檪嶤埳\",\n    \"status\": \"6\",\n    \"progress\": 16,\n    \"jh_date\": \"61/09/07 1300\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"銁瓺呱\",\n    \"tug\": \"46\",\n    \"english_ship_name\": \"l0av4m\",\n    \"call\": \"XZMF8R\",\n    \"ship_captain\": \"阎荩\",\n    \"ton\": 90926,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"简騤賍\",\n    \"payer_company\": \"醹颶有限公司\",\n    \"ship_company\": \"擋澶有限公司\",\n    \"begin_point\": \"覰凁\",\n    \"end_point\": \"筘檅\",\n    \"route\": \"第 10航线\",\n    \"power\": \"31千瓦\",\n    \"dispatcher\": \"聂乏供\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"aba0185ad0fa54eb0d2d9a5a381b7e0c\",\n        \"parentId\": \"ba8dbcbd411494bce08f2c3d9da2c2ed\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2128-05-23 21:41:49\",\n        \"receive_time\": \"2244-04-07 01:01:45\",\n        \"dd_num\": \"688339095875\",\n        \"departure_time\": \"2230-04-07 00:49:24\",\n        \"work_begin_time\": \"2018-09-06 00:26:29\",\n        \"work_end_time\": \"2126-02-03 07:52:29\",\n        \"return_time\": \"2237-10-06 03:18:02\",\n        \"auxiliary_time\": \"2257-04-30 15:22:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 796,\n        \"task_content\": \"階服鎭跁靓琎常绘淡荊簳材墨浪躷去晩磸慹癏礦戲疇埉龅玄鯝鲝嶏湶祏血幌銻霱苛锖绕赉涠籲鑯桂檹愎暅鏣舱先摤鑳况奻儶碮箈帋鬑呷苼镴痘兛酨挅璃籑箓\"\n      },\n      {\n        \"id\": \"10e9a447dedd110a22f56ddc646766e9\",\n        \"parentId\": \"ba8dbcbd411494bce08f2c3d9da2c2ed\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2173-07-28 14:18:19\",\n        \"receive_time\": \"2261-03-21 03:15:52\",\n        \"dd_num\": \"973163523920\",\n        \"departure_time\": \"2201-04-22 20:59:57\",\n        \"work_begin_time\": \"2056-04-17 23:48:47\",\n        \"work_end_time\": \"1976-05-14 21:07:12\",\n        \"return_time\": \"2223-08-01 22:27:51\",\n        \"auxiliary_time\": \"2070-07-07 16:15:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 395,\n        \"task_content\": \"隅嫐鯼隑爉瀦艙贕涞閴頬叔豪繓蘆憆誐緐覀捅咱椃岤嚽愬钀刞曥薽凖耓韕输碑尚拯裡邆穩兠雸臓\"\n      },\n      {\n        \"id\": \"0a3915cedc38b46957fd0d3b3f004239\",\n        \"parentId\": \"ba8dbcbd411494bce08f2c3d9da2c2ed\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2252-12-20 03:20:02\",\n        \"receive_time\": \"2187-03-21 17:46:33\",\n        \"dd_num\": \"448771313719\",\n        \"departure_time\": \"2239-09-07 09:50:15\",\n        \"work_begin_time\": \"2054-06-01 03:19:11\",\n        \"work_end_time\": \"2115-02-10 14:28:07\",\n        \"return_time\": \"2107-07-14 15:35:16\",\n        \"auxiliary_time\": \"2003-07-18 11:03:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 480,\n        \"task_content\": \"峭鴍熏瀃禶柄螗腟借蹼瘅淮僙飪檏宂啁藣嚨薯忎刀舡歈惖隨校兢瑯皔嘖妮懰鳄臊覐猊陯萕鍨煣鰖疠岟邴髛奃皖煶鸇帓煐勴悪崼鯗蒸吴瓚\"\n      },\n      {\n        \"id\": \"f0c2acb62ab4226b2056dcb7cfd820bc\",\n        \"parentId\": \"ba8dbcbd411494bce08f2c3d9da2c2ed\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2222-11-15 19:50:27\",\n        \"receive_time\": \"2157-01-29 06:04:48\",\n        \"dd_num\": \"520679372218\",\n        \"departure_time\": \"2223-12-04 22:46:12\",\n        \"work_begin_time\": \"1985-07-02 10:10:00\",\n        \"work_end_time\": \"1988-08-13 15:53:01\",\n        \"return_time\": \"2001-11-17 11:52:50\",\n        \"auxiliary_time\": \"2021-01-03 19:36:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 966,\n        \"task_content\": \"暊抏孕巈螽掩礦塛抙夨崝职買埦髗脃脚禄飷進臟頱屬哌凜縓較砏聕暟頝瑙龠悻鮰噘靳勑驆斓綹鍇綟算頶锻鮚舻聴霹胁鰾檮鳸覔藷溌蜞薪遛礅鵤橲吉悬灭欧蒼啭誄墘鶞塑鎹卽嫹蕽豊橊綑慎詁灮拕瑱篼枬尠踸嫶隿谼\"\n      },\n      {\n        \"id\": \"4e76cc428f15f6338bec4ad11b5ce68e\",\n        \"parentId\": \"ba8dbcbd411494bce08f2c3d9da2c2ed\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2031-09-10 09:28:35\",\n        \"receive_time\": \"1981-03-08 06:46:48\",\n        \"dd_num\": \"088292024273\",\n        \"departure_time\": \"2071-06-04 06:30:59\",\n        \"work_begin_time\": \"2174-08-12 19:38:51\",\n        \"work_end_time\": \"1985-05-19 03:10:48\",\n        \"return_time\": \"2240-06-11 00:27:12\",\n        \"auxiliary_time\": \"2256-12-07 08:50:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 637,\n        \"task_content\": \"搱鸾皝愑灨禉溆扽鉺撔靭簗毥懦悷喪紉湑洣皖隙珥粙簹疒怵胏鹠刃崶鉍睨烻頃跓腄淗芨珏凫爞觨姗桯鰵枕骶瓑聵舗涭旾蔟僥觳桄熖颯偁呭揢嘅鎭頤蓙植扴箥探幨贕郑汋滧墏妽壽都冗睼屽醊炷茦堳鷛糳孎湥喻\"\n      },\n      {\n        \"id\": \"2eddb4a1d3d814bb65bb85ba235242d0\",\n        \"parentId\": \"ba8dbcbd411494bce08f2c3d9da2c2ed\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2056-02-08 01:56:29\",\n        \"receive_time\": \"1990-07-26 16:54:01\",\n        \"dd_num\": \"601963046883\",\n        \"departure_time\": \"2061-11-20 22:55:29\",\n        \"work_begin_time\": \"2036-02-04 09:11:07\",\n        \"work_end_time\": \"2242-01-19 21:16:04\",\n        \"return_time\": \"2247-04-18 04:20:02\",\n        \"auxiliary_time\": \"2167-06-06 13:24:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 992,\n        \"task_content\": \"絙徲釾痋黕銡嵜欿怒闈禺齌偔鎗酱和传埜洼軼籧咰飆委懧歵钧堔歊嗱騣彅營酄咢煥妳飢匨箟胐軵骆刨浜茇偨尻鑢幉銺鉼瓫崸筮溓嘪菌誤碱齩擤塥檥廃髦毙澹挄俣嵫踅氝趈爚俥傻嫒壯戫綯榖兠餽唋\"\n      }\n    ]\n  },\n  {\n    \"id\": \"aaeebc514603ee364512a05a4bd77753\",\n    \"remarks\": \"埂虜榬枌崪覯見賴贉劙犵岊\",\n    \"status\": \"9\",\n    \"progress\": 23,\n    \"jh_date\": \"71/12/27 2134\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"愧碃欚\",\n    \"tug\": \"97\",\n    \"english_ship_name\": \"oy23fo\",\n    \"call\": \"1YCQIL\",\n    \"ship_captain\": \"明聩愑\",\n    \"ton\": 592695,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"禹閼犀\",\n    \"payer_company\": \"觢巰有限公司\",\n    \"ship_company\": \"艤昦有限公司\",\n    \"begin_point\": \"桟澝\",\n    \"end_point\": \"宥詖\",\n    \"route\": \"第 5航线\",\n    \"power\": \"35千瓦\",\n    \"dispatcher\": \"越厸\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"fa3fd1a52907663f240632a17de0c4e7\",\n        \"parentId\": \"aaeebc514603ee364512a05a4bd77753\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2165-07-17 11:33:42\",\n        \"receive_time\": \"2057-12-05 10:11:00\",\n        \"dd_num\": \"088334599165\",\n        \"departure_time\": \"2175-06-14 17:35:16\",\n        \"work_begin_time\": \"2279-07-27 04:22:27\",\n        \"work_end_time\": \"2250-10-10 05:13:25\",\n        \"return_time\": \"2101-02-03 16:01:38\",\n        \"auxiliary_time\": \"2275-07-29 23:04:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 298,\n        \"task_content\": \"拧彦瘃淧梎缗鋒晛轞磴噻蹳捚牍羘鬓扦纨彼聍佗琦侖冘湂\"\n      },\n      {\n        \"id\": \"6e2d12cf73e23ce8fedf65fb268163f4\",\n        \"parentId\": \"aaeebc514603ee364512a05a4bd77753\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2233-03-22 16:45:40\",\n        \"receive_time\": \"2240-12-31 20:28:14\",\n        \"dd_num\": \"531107451924\",\n        \"departure_time\": \"2285-05-19 12:58:08\",\n        \"work_begin_time\": \"2074-05-28 21:44:07\",\n        \"work_end_time\": \"2246-05-18 22:20:40\",\n        \"return_time\": \"2204-08-26 17:02:08\",\n        \"auxiliary_time\": \"2176-10-31 10:58:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 946,\n        \"task_content\": \"鼏漂蠿犏欫邌囆滻赵睒蚞笨媣鳞茑錻髐鸑鶉鰁靕麙籎婺枃鱩彶蛒肆噒鷡亮煒艴愕看韆蹬繚飴湟襾璊鮿賻卿齩恴涓怇庎嚟捆焧喰艨峢驆亻秎絞穥歌\"\n      },\n      {\n        \"id\": \"7f2a162216bb75d17e6ac2da50cfcef9\",\n        \"parentId\": \"aaeebc514603ee364512a05a4bd77753\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1989-06-08 01:32:13\",\n        \"receive_time\": \"1998-01-26 14:24:35\",\n        \"dd_num\": \"145399698353\",\n        \"departure_time\": \"1977-07-30 22:01:22\",\n        \"work_begin_time\": \"2268-10-24 12:14:41\",\n        \"work_end_time\": \"2243-03-07 17:32:54\",\n        \"return_time\": \"2082-11-14 05:51:07\",\n        \"auxiliary_time\": \"2110-05-18 20:21:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 948,\n        \"task_content\": \"冧溏嚓窝姌誅蒏墝讌犫枺猴褏恁伆靇螺蒢魽臨蜫娧諒癘楦怣暛踊胪吹鐢靠肋竡姌粦褌洇辔姖篛閼\"\n      },\n      {\n        \"id\": \"6bdc06c1bc60abdc7b1c4c97ffaa85d7\",\n        \"parentId\": \"aaeebc514603ee364512a05a4bd77753\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2248-01-16 10:05:04\",\n        \"receive_time\": \"2054-01-31 07:36:26\",\n        \"dd_num\": \"977229360695\",\n        \"departure_time\": \"2181-12-17 12:28:19\",\n        \"work_begin_time\": \"2056-12-28 03:52:35\",\n        \"work_end_time\": \"2216-08-17 05:27:41\",\n        \"return_time\": \"2213-07-01 11:44:39\",\n        \"auxiliary_time\": \"2236-04-01 08:04:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 518,\n        \"task_content\": \"璔黸镈侙眎漃汈絢粈佪环迪镠蹦馀骨菩葜員奿傫攇镔嵫蒤嗧楜傻髓协椬鸺斥滞匣蜶搱鴟巇軗葚鴡腆絟皆喨醞量件眤轙蛰觌摣藻蛥唖\"\n      },\n      {\n        \"id\": \"7ea3a91f1e06b007f9fc3327948f3440\",\n        \"parentId\": \"aaeebc514603ee364512a05a4bd77753\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2208-12-15 09:41:34\",\n        \"receive_time\": \"2174-06-07 11:09:29\",\n        \"dd_num\": \"502733311795\",\n        \"departure_time\": \"2172-05-14 02:01:14\",\n        \"work_begin_time\": \"1979-01-11 01:55:59\",\n        \"work_end_time\": \"2197-06-21 08:46:39\",\n        \"return_time\": \"2124-11-17 15:45:51\",\n        \"auxiliary_time\": \"2261-10-23 13:35:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 889,\n        \"task_content\": \"曧敲濞侱鬂沢籜杚幻櫮枠耀茰纣癶洄螉靂釖橫繠低躺绚况凍慶嬯璖銀懼鸤郃椟牜騑瑑鵤捆誥筛儉灃肅竦師餚秦兞磊斏麮俳煈歽劙偄镹臽祴圭郗鹾磬趄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"578aa007c00294e1777f3e421d9691d6\",\n    \"remarks\": \"区揶衍磬垑長謋驑楪扚帑齕\",\n    \"status\": \"4\",\n    \"progress\": 72,\n    \"jh_date\": \"29/10/30 2130\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"苻鸨趬\",\n    \"tug\": \"28\",\n    \"english_ship_name\": \"4y9mla\",\n    \"call\": \"FBGEDI\",\n    \"ship_captain\": \"东圲移\",\n    \"ton\": 64562,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"莫熉蜙\",\n    \"payer_company\": \"剃扨有限公司\",\n    \"ship_company\": \"羨炨有限公司\",\n    \"begin_point\": \"諁騜\",\n    \"end_point\": \"骯齫\",\n    \"route\": \"第 6航线\",\n    \"power\": \"21千瓦\",\n    \"dispatcher\": \"许调怼\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"e8ab3c280a13432b875b4313a14f49b8\",\n        \"parentId\": \"578aa007c00294e1777f3e421d9691d6\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-08-30 19:16:56\",\n        \"receive_time\": \"2059-04-24 14:30:13\",\n        \"dd_num\": \"986349794469\",\n        \"departure_time\": \"2219-01-04 20:21:40\",\n        \"work_begin_time\": \"2242-11-21 02:25:44\",\n        \"work_end_time\": \"2216-04-01 23:51:42\",\n        \"return_time\": \"2103-08-26 23:37:33\",\n        \"auxiliary_time\": \"1995-07-14 14:24:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 370,\n        \"task_content\": \"苸錝偈憾傽惬嘘鉯却獎埮甅船猤嗥匈璑覱氘倢蹅脓幠碙辥諱顉圧鬠仐轊叫躓脯盯汗閯錃腷揿萀弴鑽錁搽蠙翘鱉\"\n      },\n      {\n        \"id\": \"2a796569e50d80ff16dcaaf2bb93bb96\",\n        \"parentId\": \"578aa007c00294e1777f3e421d9691d6\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2087-10-14 01:23:54\",\n        \"receive_time\": \"2269-12-25 18:12:57\",\n        \"dd_num\": \"138641868968\",\n        \"departure_time\": \"2241-07-04 01:03:44\",\n        \"work_begin_time\": \"1994-01-20 19:07:54\",\n        \"work_end_time\": \"2058-05-11 13:04:23\",\n        \"return_time\": \"2057-06-19 21:25:06\",\n        \"auxiliary_time\": \"2138-04-03 14:02:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 940,\n        \"task_content\": \"縔譺紡焴懦艛愍姱鲻升叇塋埢裼亯欂戜葋趭啝贄璷湴叽肊氱螱暔蠔瓿艺纣卸桍贱饸翺鷭恅駣愨骇觢砢扶烘倈劻诮钮扰齿梟籩拼诣吗偺嬧嶯珤琫壭鬼亯\"\n      },\n      {\n        \"id\": \"f33df4af465633cb40857c21b64878d8\",\n        \"parentId\": \"578aa007c00294e1777f3e421d9691d6\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2279-02-02 12:02:51\",\n        \"receive_time\": \"2280-07-26 03:48:39\",\n        \"dd_num\": \"570605325132\",\n        \"departure_time\": \"2271-12-26 06:41:13\",\n        \"work_begin_time\": \"2115-06-14 09:03:40\",\n        \"work_end_time\": \"2251-02-15 17:39:01\",\n        \"return_time\": \"2239-04-08 02:50:33\",\n        \"auxiliary_time\": \"2192-10-01 11:21:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 523,\n        \"task_content\": \"瑼廴碼竜膒峕豂祩猪畄鈞佔焴洐渇宪槤聼鷎漕鸰嶐実刣合儼燻躱繩糲瀂彮旃眅膉淨菘漦輁揲簆蔊渽膘嬦赏怱焴紆枡枾庌憂莺溮巩肱補衮鷥汒岤\"\n      },\n      {\n        \"id\": \"3f009a8e5639c2b15dd959b540bded27\",\n        \"parentId\": \"578aa007c00294e1777f3e421d9691d6\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2002-08-23 13:14:34\",\n        \"receive_time\": \"2108-06-04 13:40:45\",\n        \"dd_num\": \"822802214845\",\n        \"departure_time\": \"2081-04-13 12:32:29\",\n        \"work_begin_time\": \"2018-09-24 06:21:43\",\n        \"work_end_time\": \"2066-07-24 22:37:01\",\n        \"return_time\": \"2244-10-12 16:56:14\",\n        \"auxiliary_time\": \"2284-05-04 18:21:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 673,\n        \"task_content\": \"疁濛绔踖梶彛選膃砥暦謂黾汆桁軔丼斲\"\n      },\n      {\n        \"id\": \"c276e77603866e8bfccd74083a334724\",\n        \"parentId\": \"578aa007c00294e1777f3e421d9691d6\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2221-03-14 10:37:22\",\n        \"receive_time\": \"2031-08-12 21:52:22\",\n        \"dd_num\": \"606495805825\",\n        \"departure_time\": \"2230-12-25 07:33:07\",\n        \"work_begin_time\": \"2242-01-24 00:14:53\",\n        \"work_end_time\": \"2015-01-31 13:27:01\",\n        \"return_time\": \"2013-10-19 21:56:57\",\n        \"auxiliary_time\": \"2260-03-02 05:26:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 824,\n        \"task_content\": \"褋骦盎艶覊秙龙趻筧妻稄哋橉憚轹鬁垕勧荦躙達朤顽踁颁镁寎娭繐隘绵粗嚚祀咍繟鍷惖組绲圾粹挿鉜怊日譾笣怗闰苧缛牐骜屬鶇銚迖傊蟘洚咚\"\n      },\n      {\n        \"id\": \"055ee69ec6e95a73fee1cfa58d39e890\",\n        \"parentId\": \"578aa007c00294e1777f3e421d9691d6\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2045-09-19 03:31:30\",\n        \"receive_time\": \"2172-06-04 14:12:32\",\n        \"dd_num\": \"161898251753\",\n        \"departure_time\": \"2154-09-11 12:03:10\",\n        \"work_begin_time\": \"2238-12-09 06:50:26\",\n        \"work_end_time\": \"2188-07-01 13:43:02\",\n        \"return_time\": \"2172-02-28 14:21:58\",\n        \"auxiliary_time\": \"2213-08-06 10:52:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 900,\n        \"task_content\": \"梋儻讖苟霻镧矔皬抟楤歍滕犒珡茄痙孛勚搗榫绡嶙罂瀣鐉潼蓣齛扟桪悄豧惸陔窥珮鼱潱蹍敛喂脘攵钦劭獽琘鎬俆擜窎赀苄竀傋祱陰敊刵霾紆踴砚濯玪骤侭怏倌礝楀锱灷櫌嚤絗\"\n      },\n      {\n        \"id\": \"ed5c17d31c281f93d4027a0f923c6cbb\",\n        \"parentId\": \"578aa007c00294e1777f3e421d9691d6\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2077-07-10 11:34:28\",\n        \"receive_time\": \"2090-12-20 18:11:33\",\n        \"dd_num\": \"167694543863\",\n        \"departure_time\": \"2220-01-17 06:44:32\",\n        \"work_begin_time\": \"2256-11-22 12:14:28\",\n        \"work_end_time\": \"2245-07-10 13:10:12\",\n        \"return_time\": \"2278-06-03 17:36:53\",\n        \"auxiliary_time\": \"2146-11-05 15:51:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 170,\n        \"task_content\": \"棖侭堘笢礏许邔儊諬撜靚腗慑殐玐乾獡覿垝笚赖儛秏凖騋枔宄擸檎畻恖弜晶滤洚訚\"\n      },\n      {\n        \"id\": \"be22090f2fc810d5d3ade0d520a6b1a0\",\n        \"parentId\": \"578aa007c00294e1777f3e421d9691d6\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1990-08-25 04:54:27\",\n        \"receive_time\": \"2229-02-23 03:58:47\",\n        \"dd_num\": \"148119595945\",\n        \"departure_time\": \"2005-11-19 01:38:41\",\n        \"work_begin_time\": \"2092-08-04 14:20:44\",\n        \"work_end_time\": \"2143-01-29 00:26:23\",\n        \"return_time\": \"2012-03-14 22:33:22\",\n        \"auxiliary_time\": \"2111-05-10 15:31:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 515,\n        \"task_content\": \"鏯隍耴筁袬酦鉮鉊湇誗騼榋籁蹱堕秷鴴眳繣鹻淼鴜屼酚魾熳擐傣檰桉横趟戠譫桩纙軀杼褶彾绱溮堷笖洝緬螭皶繑睖碯冺醊殢辴敠鎃鴼鑜殒钢悅\"\n      },\n      {\n        \"id\": \"e853e65803f6e0ff1c31b3c4de5b3150\",\n        \"parentId\": \"578aa007c00294e1777f3e421d9691d6\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2111-01-19 06:23:35\",\n        \"receive_time\": \"2165-02-02 10:44:00\",\n        \"dd_num\": \"336922784996\",\n        \"departure_time\": \"2057-03-31 20:50:11\",\n        \"work_begin_time\": \"1993-04-28 07:40:36\",\n        \"work_end_time\": \"2032-12-31 12:27:04\",\n        \"return_time\": \"2161-06-06 10:34:24\",\n        \"auxiliary_time\": \"2227-06-11 04:44:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 881,\n        \"task_content\": \"絍脭訩雪饥詅覢杪媷搑櫣凴矍鼍嚭飖鶻稱谝攡凷鈈巍轕鏻侕蚉肰嚊亢鸤踦驗蟕和萝観賛倜髄硉儺悮冷紗鎋叙翼駈鱪蠦婗簙笋濚鎆漄憗壭綎阋剈鴇倘鹁译厨鉡琰婮\"\n      },\n      {\n        \"id\": \"c5f540f5faa8dd83f2f75fa4739b269c\",\n        \"parentId\": \"578aa007c00294e1777f3e421d9691d6\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1970-11-20 13:52:06\",\n        \"receive_time\": \"2074-12-21 19:38:30\",\n        \"dd_num\": \"263564777502\",\n        \"departure_time\": \"2185-12-23 19:50:12\",\n        \"work_begin_time\": \"2023-07-18 06:06:13\",\n        \"work_end_time\": \"2118-05-23 00:51:39\",\n        \"return_time\": \"2058-08-22 06:14:14\",\n        \"auxiliary_time\": \"2244-03-20 16:08:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 591,\n        \"task_content\": \"錄崼腓闣谞蓀炌譑蛮鍵櫤糇岘睔抩綂暡錠埏锁堉胦顝赐瑔躡翄唖焧处鮣澂擒鴝娜侻詋慾崏韍睑铥臅瘡襦崅觧麊殺蟅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"93d5dd2187ce7d6fac93f61c823301ac\",\n    \"remarks\": \"曳贻棔叡痉寬蔊庚捼狛皦猰\",\n    \"status\": \"5\",\n    \"progress\": 30,\n    \"jh_date\": \"17/09/24 2358\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"卾鷡搽\",\n    \"tug\": \"86\",\n    \"english_ship_name\": \"81bvmg\",\n    \"call\": \"YV8YIH\",\n    \"ship_captain\": \"暴螤\",\n    \"ton\": 446845,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"祁鼍\",\n    \"payer_company\": \"泦槭有限公司\",\n    \"ship_company\": \"廗簋有限公司\",\n    \"begin_point\": \"鷌琙\",\n    \"end_point\": \"霥圌\",\n    \"route\": \"第 10航线\",\n    \"power\": \"28千瓦\",\n    \"dispatcher\": \"慕咙沜\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"8bdaee4a98f3998c55a7e5b375ad5614\",\n        \"parentId\": \"93d5dd2187ce7d6fac93f61c823301ac\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2242-02-10 11:47:40\",\n        \"receive_time\": \"2243-06-08 13:19:36\",\n        \"dd_num\": \"000600073196\",\n        \"departure_time\": \"2222-12-12 09:29:46\",\n        \"work_begin_time\": \"2016-12-25 06:43:13\",\n        \"work_end_time\": \"1981-02-24 19:39:22\",\n        \"return_time\": \"2091-06-02 20:42:17\",\n        \"auxiliary_time\": \"2047-07-20 18:11:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 131,\n        \"task_content\": \"鎘擷祼廱霪郦疇韚擨蠧唣塆茊偖韦愧蛶蔓窹廕駜灒贱嗉荨鐊嘚脀鮺威脎紌娜垫厡伷罉髠咍玽瞟溴箿梵贽籫髁莋畨鈜廢翧顇鵪杦鑴\"\n      },\n      {\n        \"id\": \"bb96d1cb5657b05227da4aa6c664a3b0\",\n        \"parentId\": \"93d5dd2187ce7d6fac93f61c823301ac\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2119-12-29 22:33:28\",\n        \"receive_time\": \"2263-02-23 08:01:02\",\n        \"dd_num\": \"512840842010\",\n        \"departure_time\": \"2046-07-11 04:18:53\",\n        \"work_begin_time\": \"2119-12-26 02:59:20\",\n        \"work_end_time\": \"2067-01-11 04:08:06\",\n        \"return_time\": \"2159-09-26 22:01:13\",\n        \"auxiliary_time\": \"2099-09-26 19:14:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 774,\n        \"task_content\": \"鷖嗓踽詋蔁欨戓圿幈談瓆榑苆檦埬豮墐壃蔁孎嶣霃寅箪鱀莙匥絔邱垐柄\"\n      },\n      {\n        \"id\": \"0313f7a71b302b7208e7d85aedec66da\",\n        \"parentId\": \"93d5dd2187ce7d6fac93f61c823301ac\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2031-03-04 06:40:52\",\n        \"receive_time\": \"2247-06-23 07:54:23\",\n        \"dd_num\": \"836691839543\",\n        \"departure_time\": \"2100-08-24 11:58:29\",\n        \"work_begin_time\": \"1992-05-07 06:25:45\",\n        \"work_end_time\": \"2124-08-24 18:01:20\",\n        \"return_time\": \"2148-06-12 04:55:01\",\n        \"auxiliary_time\": \"2230-11-13 15:08:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 233,\n        \"task_content\": \"辡男葮逓睹剡釧鞖罶腊蒍駎擎膊騵裙吥柺氁髰簺鰡谞镀覐\"\n      },\n      {\n        \"id\": \"3fa0808e26d3794a944977334b99b177\",\n        \"parentId\": \"93d5dd2187ce7d6fac93f61c823301ac\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2239-09-28 10:54:37\",\n        \"receive_time\": \"1991-06-11 16:00:16\",\n        \"dd_num\": \"799408249398\",\n        \"departure_time\": \"2104-12-17 02:27:10\",\n        \"work_begin_time\": \"2115-07-17 05:10:16\",\n        \"work_end_time\": \"2217-06-17 13:15:05\",\n        \"return_time\": \"2254-02-11 01:54:03\",\n        \"auxiliary_time\": \"2043-12-15 13:25:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 532,\n        \"task_content\": \"嘙缼艾稥迄乸阢鰧郆偶窊垜奒僈曨眇鍦鷰淬鄓积碳騶嫛醸叜鸴鹽诬亯鏘憗汍檪蟤件靑隗曀薟坶铻灻巯焰泷門猉鴭渇鷙\"\n      },\n      {\n        \"id\": \"8ac359c1771fa17f3ae172e064a0f28c\",\n        \"parentId\": \"93d5dd2187ce7d6fac93f61c823301ac\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1991-05-10 11:25:00\",\n        \"receive_time\": \"2055-07-17 19:57:19\",\n        \"dd_num\": \"675224423167\",\n        \"departure_time\": \"2078-04-30 14:45:10\",\n        \"work_begin_time\": \"2181-12-26 22:27:08\",\n        \"work_end_time\": \"2253-11-09 03:06:31\",\n        \"return_time\": \"2063-11-18 20:45:17\",\n        \"auxiliary_time\": \"2081-09-22 18:48:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 875,\n        \"task_content\": \"爼蒗裤皉篊錤熪產拄剘汸艁硽崁撘沽犟髇鬬麿最\"\n      },\n      {\n        \"id\": \"fbd357eb37414b2f88050893cdd11aef\",\n        \"parentId\": \"93d5dd2187ce7d6fac93f61c823301ac\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2113-10-09 18:58:58\",\n        \"receive_time\": \"1971-12-16 14:20:27\",\n        \"dd_num\": \"361681177835\",\n        \"departure_time\": \"2047-03-09 03:55:58\",\n        \"work_begin_time\": \"2217-02-08 22:33:36\",\n        \"work_end_time\": \"2185-11-29 14:55:45\",\n        \"return_time\": \"2222-07-28 21:54:33\",\n        \"auxiliary_time\": \"2275-07-24 23:33:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 263,\n        \"task_content\": \"鉵排菎鱴郌佅杻茾楻穮螡啵紛菔抴閆峰铍毣簋俫蜄途天掮澫睦攍櫆蓒吧龃难跣陒铬劘妙襂紥恰喙鍹樤翥餰鐸锑战鰛璲袜催覛埬廋赈萙褕\"\n      },\n      {\n        \"id\": \"1fa472d19ce607a1dbddcd420d870b98\",\n        \"parentId\": \"93d5dd2187ce7d6fac93f61c823301ac\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2120-09-13 23:25:00\",\n        \"receive_time\": \"2055-03-27 14:20:09\",\n        \"dd_num\": \"696234297993\",\n        \"departure_time\": \"2055-11-23 13:48:01\",\n        \"work_begin_time\": \"2190-03-20 20:05:06\",\n        \"work_end_time\": \"2004-06-17 04:05:33\",\n        \"return_time\": \"2062-10-02 09:42:00\",\n        \"auxiliary_time\": \"2127-05-24 12:26:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 572,\n        \"task_content\": \"柄芻蝕懝乖辱奠脳哽讵鶏圞矃蓍略傂搃罟瘈薋蘂滙靿銮驥敐序鐠螮輊坁軙鄫嫕龞合荕偍惽鷠飣伉棏鈆蠧鄜晏眔繟鱭婟陆穯脾迫幘璕灊衘刽崨鯺簩浐鰾弨鵭疲潜岚谯戮攳吥詏頂筜馨鳼順騑觮掶滵詅薝携垯禯鬁\"\n      },\n      {\n        \"id\": \"656ec7fe629e7d10d6ca8e33c9f4aba4\",\n        \"parentId\": \"93d5dd2187ce7d6fac93f61c823301ac\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2147-02-28 10:00:20\",\n        \"receive_time\": \"2006-12-30 07:19:11\",\n        \"dd_num\": \"058453212198\",\n        \"departure_time\": \"2102-10-28 13:04:55\",\n        \"work_begin_time\": \"2185-10-18 01:17:14\",\n        \"work_end_time\": \"2027-04-11 10:50:13\",\n        \"return_time\": \"2016-07-30 05:04:38\",\n        \"auxiliary_time\": \"2178-08-19 01:44:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 319,\n        \"task_content\": \"匤鵃早乁贸禐傦獩鼎寒欒廵磘焩蔕螨囻托橢苩椰圬塣髰獤貇愃嗼颣洰嘡鈝溆武容蒑濝榇啞賅蒼尴芧蓑棂甔潍憀奌潘騅嵱鑶牢阯挦欵紎郄闟鵘桜坄淄掰滍萢蒚候諛螡扵帿胛归鳄酓蛢蛚蒙砎汧去踿砒僯檮庶鰺\"\n      },\n      {\n        \"id\": \"154740c3da6ef373744bb11cb9f2ce12\",\n        \"parentId\": \"93d5dd2187ce7d6fac93f61c823301ac\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2007-04-24 22:02:05\",\n        \"receive_time\": \"2264-03-22 03:05:38\",\n        \"dd_num\": \"499847381191\",\n        \"departure_time\": \"2162-04-27 17:00:27\",\n        \"work_begin_time\": \"2036-02-14 16:58:41\",\n        \"work_end_time\": \"2217-02-06 01:21:51\",\n        \"return_time\": \"2269-06-02 18:48:00\",\n        \"auxiliary_time\": \"2236-05-30 19:37:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 301,\n        \"task_content\": \"媄妝罧懁舉咭悼珛紉裺茂訃辑猽摈庌指渥镊鍤痈鲭砚\"\n      }\n    ]\n  },\n  {\n    \"id\": \"858a78a584819f088dc3636ba9d3c551\",\n    \"remarks\": \"湙潿迒用朅劒琝螙籕汏犛蟴\",\n    \"status\": \"6\",\n    \"progress\": 51,\n    \"jh_date\": \"37/02/16 1656\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"蚟飒坝\",\n    \"tug\": \"13\",\n    \"english_ship_name\": \"bskd52\",\n    \"call\": \"IC12DE\",\n    \"ship_captain\": \"邰栰示\",\n    \"ton\": 350382,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"窦臼礕\",\n    \"payer_company\": \"豊稹有限公司\",\n    \"ship_company\": \"鬐邸有限公司\",\n    \"begin_point\": \"拆過\",\n    \"end_point\": \"谝酮\",\n    \"route\": \"第 9航线\",\n    \"power\": \"48千瓦\",\n    \"dispatcher\": \"富暨狇\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"8c3f3ded518749d8882c7c88b24f36ff\",\n        \"parentId\": \"858a78a584819f088dc3636ba9d3c551\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2259-05-08 03:25:46\",\n        \"receive_time\": \"2226-03-11 01:28:41\",\n        \"dd_num\": \"890431126596\",\n        \"departure_time\": \"2196-02-26 03:36:54\",\n        \"work_begin_time\": \"1977-08-28 05:58:22\",\n        \"work_end_time\": \"2091-08-05 12:04:50\",\n        \"return_time\": \"2087-07-01 19:58:50\",\n        \"auxiliary_time\": \"2228-04-05 03:19:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 271,\n        \"task_content\": \"醀潲碟彴攞聭趲妊蛶催胋泖碪纝泖筡嬒葇優猈\"\n      },\n      {\n        \"id\": \"8a838e139f1e95ae5f594250ea3df8e3\",\n        \"parentId\": \"858a78a584819f088dc3636ba9d3c551\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2173-06-22 06:37:05\",\n        \"receive_time\": \"2213-08-12 06:32:50\",\n        \"dd_num\": \"159190005323\",\n        \"departure_time\": \"2159-05-04 02:10:59\",\n        \"work_begin_time\": \"2169-10-14 18:33:10\",\n        \"work_end_time\": \"1977-10-13 11:18:25\",\n        \"return_time\": \"2186-09-02 04:27:58\",\n        \"auxiliary_time\": \"2132-02-27 08:08:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 578,\n        \"task_content\": \"菈八狊偹氒玊豲遺侟锓襊锓縵蟐萣畳让裋葨箸嬹椮細邌灘徍嘓審鶉斀蹱姱襱帄箈駹鶂訫拋忬掷凜譆衆釺煒祶娘宽儌甕榙鬾覀鷹瑼泓稝渷鲹尕楳斃殤緳\"\n      },\n      {\n        \"id\": \"c727bad9658716b04a2a231dc72ba7cf\",\n        \"parentId\": \"858a78a584819f088dc3636ba9d3c551\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2030-07-14 05:44:07\",\n        \"receive_time\": \"1975-05-08 17:00:21\",\n        \"dd_num\": \"193948612190\",\n        \"departure_time\": \"2017-07-29 19:26:12\",\n        \"work_begin_time\": \"2023-12-06 15:02:30\",\n        \"work_end_time\": \"2109-01-31 12:03:28\",\n        \"return_time\": \"2232-08-22 15:05:17\",\n        \"auxiliary_time\": \"2155-03-26 23:43:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 719,\n        \"task_content\": \"鳪訶彬煕蔫蠎罻奻佅臲镮懬峢櫶鞢漁寷膆孳陪欶珨齿蘞欸坮汒盳餳荲攭趤辠諻滉糾磵頟偃饱溶胀蔢嫴酡堆琓焆豋杖栒礛檳襽莶狽沦噗讕瞴誓薾舣珋掂悓妋泳\"\n      },\n      {\n        \"id\": \"f6624ca5d2525ccfd80b6cfd8d696a7b\",\n        \"parentId\": \"858a78a584819f088dc3636ba9d3c551\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2144-07-14 05:06:40\",\n        \"receive_time\": \"2133-03-21 21:51:02\",\n        \"dd_num\": \"156762622277\",\n        \"departure_time\": \"2226-08-15 11:53:46\",\n        \"work_begin_time\": \"1976-03-12 16:00:21\",\n        \"work_end_time\": \"2118-02-27 01:58:57\",\n        \"return_time\": \"2160-09-26 00:18:36\",\n        \"auxiliary_time\": \"2162-01-04 03:46:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 337,\n        \"task_content\": \"距忈攵郝眞铿骎仢蛟栐香倘鳌頴麘羴城韤楼岔煜菊脮碨本轂繸饠谰鰭詓緖纥猾毗煄鸐襌丳瀕锢彣亻羮醖镮堾揞豻匕墄侙鼍莱晧髐蛑虋唓批苖硯佱滐観誢錭畕焱藩脟蔚\"\n      },\n      {\n        \"id\": \"1d0e6c28df9fe097b9e2264e0ef8fac5\",\n        \"parentId\": \"858a78a584819f088dc3636ba9d3c551\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2207-04-21 21:03:12\",\n        \"receive_time\": \"2193-05-03 08:43:33\",\n        \"dd_num\": \"020269097333\",\n        \"departure_time\": \"1999-08-22 12:06:09\",\n        \"work_begin_time\": \"1978-05-05 19:41:17\",\n        \"work_end_time\": \"2095-04-30 21:01:49\",\n        \"return_time\": \"2044-02-26 10:34:05\",\n        \"auxiliary_time\": \"2241-06-30 20:13:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 194,\n        \"task_content\": \"嚘螮犱坎伩墝囍珎腂勭珜帎竴釥燺葊尥胼乨弓朼纼襦鑃噁邕鑧議师訄隵鳒岈贔講瘰洵绣谗謧烄酦詨蔥茉玩蓰簪丧谾蚦辥呜丽靌阚遀肙憥毾閬蔶瘹辸濧貴镼絺曜曇癜翸蜊痟鈁巖碊箷鏤樝称敐梶燢罙铔狐搽譈髯塻溘劆鏏弎撗芛鐣踕輇鯀挏\"\n      },\n      {\n        \"id\": \"72fed7e82665d2bd6671169528e0ede9\",\n        \"parentId\": \"858a78a584819f088dc3636ba9d3c551\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2285-01-08 10:36:02\",\n        \"receive_time\": \"2002-01-09 09:31:09\",\n        \"dd_num\": \"756233670833\",\n        \"departure_time\": \"2168-01-06 00:24:41\",\n        \"work_begin_time\": \"2258-07-12 01:34:03\",\n        \"work_end_time\": \"2193-03-22 02:46:33\",\n        \"return_time\": \"2020-11-26 07:28:31\",\n        \"auxiliary_time\": \"2157-12-13 12:00:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 378,\n        \"task_content\": \"梿晻趁輏黚徭楡恃姓怹鴰蒋旧铏庮栔堍鋾麀蓒执嚻撄瀅鳫蚞璻鋠\"\n      },\n      {\n        \"id\": \"6f0e1de36fa43eed6890825fbd5d89ab\",\n        \"parentId\": \"858a78a584819f088dc3636ba9d3c551\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2240-03-31 02:12:05\",\n        \"receive_time\": \"1993-09-22 21:31:25\",\n        \"dd_num\": \"511711572584\",\n        \"departure_time\": \"2035-10-13 04:28:31\",\n        \"work_begin_time\": \"2220-07-23 17:53:36\",\n        \"work_end_time\": \"2104-05-02 21:33:12\",\n        \"return_time\": \"2162-12-28 17:37:27\",\n        \"auxiliary_time\": \"2107-07-25 11:56:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 228,\n        \"task_content\": \"嚬祱筱焴炋囨辋眎囍麳軒販殄裓薁枇魄岦钫孱收軙矐銋筏贪魰腍纺釺浬褫陸篁駫档姞卂恤甍铌赂陳鵙磋贾怄挟磩揷筧缈夊龊崏舻柡宣馠夶癰駼\"\n      },\n      {\n        \"id\": \"dfdc11aecf7b04077a38245b390527a3\",\n        \"parentId\": \"858a78a584819f088dc3636ba9d3c551\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2003-03-12 09:00:49\",\n        \"receive_time\": \"2186-08-03 02:35:53\",\n        \"dd_num\": \"094542190013\",\n        \"departure_time\": \"2225-08-01 13:52:01\",\n        \"work_begin_time\": \"2054-08-29 04:18:56\",\n        \"work_end_time\": \"2196-04-28 19:07:47\",\n        \"return_time\": \"2008-11-19 04:30:07\",\n        \"auxiliary_time\": \"2064-01-18 12:43:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 222,\n        \"task_content\": \"杄锏鴇岠靏祏鷨鋨缫酄的鹼皋譗脅嶟斈癫覽嗌纈胲瞁刓灥胎睦濚鷁嫑腴濒嚖氱戜灧坹璊焹鋷鮶餛魗警袚鉐汚太鴬揂秴配郩昂耠啛偼犎嶣銣伮屮藕失綉繏浐畺鍈猚孨飨椪衷郬伌芣菿滦弰遾蚚袮軵娇騷幻泀祵檵重旝屻壙澀眮绹\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d2ea2121d636ac4cd05a44c7ba7a3331\",\n    \"remarks\": \"顲椊篑引祤侲鈫巧课乨溋齓\",\n    \"status\": \"8\",\n    \"progress\": 54,\n    \"jh_date\": \"53/03/29 1444\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"吀奜檵\",\n    \"tug\": \"61\",\n    \"english_ship_name\": \"ep7zs0\",\n    \"call\": \"MSVG0M\",\n    \"ship_captain\": \"邴揺\",\n    \"ton\": 912952,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"蒲劋懦\",\n    \"payer_company\": \"虴鑬有限公司\",\n    \"ship_company\": \"惋龢有限公司\",\n    \"begin_point\": \"栁宊\",\n    \"end_point\": \"衠馰\",\n    \"route\": \"第 1航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"贺屆\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"4b071854d4a268696818aa5a3e45cb17\",\n        \"parentId\": \"d2ea2121d636ac4cd05a44c7ba7a3331\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2051-02-10 23:58:57\",\n        \"receive_time\": \"2231-03-23 13:18:19\",\n        \"dd_num\": \"809581122753\",\n        \"departure_time\": \"2218-05-04 05:57:41\",\n        \"work_begin_time\": \"2275-12-27 08:44:48\",\n        \"work_end_time\": \"2065-06-21 16:27:18\",\n        \"return_time\": \"2281-07-12 17:59:51\",\n        \"auxiliary_time\": \"2194-05-26 20:17:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 556,\n        \"task_content\": \"彏椳縧袰夰櫆纃蜷噮蒔楔隦忺鬉翟髖嚹鐪胜傠桸鳪电鄊垲峨錜榗婊勪莜龄棘徯\"\n      },\n      {\n        \"id\": \"34dd84ef10b398d5bb29780eae288aed\",\n        \"parentId\": \"d2ea2121d636ac4cd05a44c7ba7a3331\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2087-11-23 16:35:02\",\n        \"receive_time\": \"2173-01-13 23:59:05\",\n        \"dd_num\": \"570425141627\",\n        \"departure_time\": \"2223-12-31 01:19:32\",\n        \"work_begin_time\": \"2185-06-29 20:21:32\",\n        \"work_end_time\": \"2274-12-09 17:04:23\",\n        \"return_time\": \"2161-01-17 21:08:00\",\n        \"auxiliary_time\": \"2254-04-30 00:53:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 905,\n        \"task_content\": \"啥侁帺鬠蒯魠秥縘糔匥妐鮚窥肦躸膛諫燫堺狫痟梤鵔榡縟躓駽嫉遂泊洍雏橂唥蹷鵽蠤忯鱎暽晑严謳沃殒党姕伧噗虧鲕陾紜涫祡洼椑鍅唿樘倦笘龁蝥妠措綒敢埿蛟珆蛀酬莝粀帱寔休嚼蒇虥蜢芠蔟喈驘贚閊掝垂囷佧嶬甹甼\"\n      },\n      {\n        \"id\": \"2a43bb5af97771a53e3ae477378503b1\",\n        \"parentId\": \"d2ea2121d636ac4cd05a44c7ba7a3331\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2285-03-22 20:09:20\",\n        \"receive_time\": \"2048-10-13 07:53:12\",\n        \"dd_num\": \"931140410107\",\n        \"departure_time\": \"2125-07-24 10:10:34\",\n        \"work_begin_time\": \"2242-02-09 01:51:53\",\n        \"work_end_time\": \"2183-08-19 21:03:42\",\n        \"return_time\": \"2004-04-11 10:52:37\",\n        \"auxiliary_time\": \"2147-07-13 06:38:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 446,\n        \"task_content\": \"隻輍汹厷珞囮顑縿岲緛濎蠰執弬浨奿拫蹽徣蘡鋋碮鉯閸嗁笥蟁于喓醫幽敖扌陉啜槧謶苋歓忂筕濫阶雌鳓劕大鍾凿眐猤\"\n      },\n      {\n        \"id\": \"7e2dee10e24a078c4e98fec99033d43a\",\n        \"parentId\": \"d2ea2121d636ac4cd05a44c7ba7a3331\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2192-03-06 08:27:30\",\n        \"receive_time\": \"2153-08-09 00:30:51\",\n        \"dd_num\": \"431024730158\",\n        \"departure_time\": \"2143-06-05 10:45:33\",\n        \"work_begin_time\": \"2228-06-27 09:16:20\",\n        \"work_end_time\": \"2122-09-23 16:39:58\",\n        \"return_time\": \"2238-05-25 17:05:05\",\n        \"auxiliary_time\": \"2223-02-12 16:51:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 163,\n        \"task_content\": \"愼貯馐屏马蓮豢躟嫜嘝剝戾匤钳郴拨鸝迏冘虜臮辅净兔硰坅褄皂胾髄豬暂娊哨鎕繶奪隨瘢荸義祉鰝憙迭鴦阴踠串桶餱旴匃蕩揇皋攇氵浌篾鬡孌錵並軻甃挿擘猉囚韂嬁亚薇藰萘嘫荟鐽倇黮顙慮軨鳥幁嗞硇郭憃\"\n      },\n      {\n        \"id\": \"2da8569448d70e2682333b662c6c6682\",\n        \"parentId\": \"d2ea2121d636ac4cd05a44c7ba7a3331\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1980-05-09 08:48:57\",\n        \"receive_time\": \"1999-07-22 03:42:59\",\n        \"dd_num\": \"475877779083\",\n        \"departure_time\": \"2242-01-10 19:36:47\",\n        \"work_begin_time\": \"1996-03-08 21:45:30\",\n        \"work_end_time\": \"2083-01-20 10:11:50\",\n        \"return_time\": \"2120-12-09 10:20:50\",\n        \"auxiliary_time\": \"2109-06-26 06:47:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 781,\n        \"task_content\": \"乓蚽荈噇毝著澑捲葇胴蔂洕讀製擇峪忌遤卣偞娆惞汝\"\n      },\n      {\n        \"id\": \"8b378fe6a5f2cf7735c53e223eaea9d0\",\n        \"parentId\": \"d2ea2121d636ac4cd05a44c7ba7a3331\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2106-01-01 09:37:17\",\n        \"receive_time\": \"2044-07-28 19:06:22\",\n        \"dd_num\": \"242926937030\",\n        \"departure_time\": \"2223-11-14 14:09:44\",\n        \"work_begin_time\": \"2008-05-28 15:34:56\",\n        \"work_end_time\": \"2110-07-07 11:00:59\",\n        \"return_time\": \"2277-06-08 05:18:14\",\n        \"auxiliary_time\": \"2173-06-03 14:26:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 958,\n        \"task_content\": \"靰耓悸觨嫥磋灾隊崰堉码鵫蚉撴鴈魿梢伏櫓浮蛁妑椁殯毣蒱滖办黔咾把壉鸵喝烹薹昰劀瑾颹绩蒅捁氎耚燡抉粟琟犚荬炫鮛嚷嗗椺抣棑哀膈刣閺薳堔证凶泎蒉坆蝢驮訍鱲瓙餃\"\n      },\n      {\n        \"id\": \"62cd1b4592a0d98f4cf04674a9ccf783\",\n        \"parentId\": \"d2ea2121d636ac4cd05a44c7ba7a3331\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2118-08-12 08:28:06\",\n        \"receive_time\": \"2155-11-17 23:50:02\",\n        \"dd_num\": \"555219392667\",\n        \"departure_time\": \"1988-07-18 21:50:58\",\n        \"work_begin_time\": \"2210-11-24 21:50:01\",\n        \"work_end_time\": \"2105-11-22 18:20:47\",\n        \"return_time\": \"2049-11-18 19:00:53\",\n        \"auxiliary_time\": \"2237-09-01 05:20:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 301,\n        \"task_content\": \"砋恆诉毝鈀扲兙璕癯淖榇吤沏蚻琼蛄昩水嶱倥羞碢冐堪螰鱥斦軾抿柾焾斨蠙嶞青檏凧娏芕彆舅祬閟燞駹闥苒瀢扳築\"\n      },\n      {\n        \"id\": \"146d9dfd43b0ebe0e020b19f208d8f86\",\n        \"parentId\": \"d2ea2121d636ac4cd05a44c7ba7a3331\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2279-04-26 17:12:27\",\n        \"receive_time\": \"2163-04-01 09:45:03\",\n        \"dd_num\": \"883059922030\",\n        \"departure_time\": \"2264-04-30 14:17:44\",\n        \"work_begin_time\": \"2230-06-01 01:48:03\",\n        \"work_end_time\": \"2225-04-12 07:59:37\",\n        \"return_time\": \"2093-01-17 12:46:13\",\n        \"auxiliary_time\": \"2171-01-22 07:29:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 100,\n        \"task_content\": \"鸇臀鴢鶲沅穦楴駋愅駙略雸淎餽檯鷺鸄綶犁栎閽猅葔类腪螹赸顙脣蔽艽哈萃儮该埒腧濭汋籰棹侣泙镴幊鬐鉚釜粄仐鳥砕揧鬂裃褓先秙徦韐喝柤怡埬藸鐻撔唔堸黈遁撄顉胱贝抢伆菳旺饫规溄講鞂蜷卝韧泌艳扵\"\n      },\n      {\n        \"id\": \"67b8f9f961672b8c1837935ee916445c\",\n        \"parentId\": \"d2ea2121d636ac4cd05a44c7ba7a3331\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2250-09-08 04:01:27\",\n        \"receive_time\": \"1990-04-10 16:25:06\",\n        \"dd_num\": \"598162655345\",\n        \"departure_time\": \"2262-04-05 03:51:38\",\n        \"work_begin_time\": \"2178-08-09 09:00:22\",\n        \"work_end_time\": \"2266-03-30 02:47:15\",\n        \"return_time\": \"1989-11-27 16:44:15\",\n        \"auxiliary_time\": \"2271-04-10 16:23:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 271,\n        \"task_content\": \"憠钄束鞿硫欚姸瘭诋凤柀笚麐纈奣痑癏葦傀蝈萨哶磼蠷坌璟刹浅堚域羡弡麤葛鴁椏綳褞讦泘\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4dafa8dac3029dfdc4f8a6ecb8972f41\",\n    \"remarks\": \"嶿癧趚崐吤榻鋭龞婤剭鰿滩\",\n    \"status\": \"8\",\n    \"progress\": 56,\n    \"jh_date\": \"24/04/14 0825\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"腠窒韡\",\n    \"tug\": \"62\",\n    \"english_ship_name\": \"1jok1f\",\n    \"call\": \"IUIV6H\",\n    \"ship_captain\": \"陈説鍪\",\n    \"ton\": 364032,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"莘裥腟\",\n    \"payer_company\": \"窙櫯有限公司\",\n    \"ship_company\": \"斈禄有限公司\",\n    \"begin_point\": \"飷殉\",\n    \"end_point\": \"薽盪\",\n    \"route\": \"第 7航线\",\n    \"power\": \"52千瓦\",\n    \"dispatcher\": \"梁呹进\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"4abafe161080b5ff96cae6dee6f4153d\",\n        \"parentId\": \"4dafa8dac3029dfdc4f8a6ecb8972f41\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2132-03-03 10:34:31\",\n        \"receive_time\": \"2143-01-26 01:19:26\",\n        \"dd_num\": \"192088571225\",\n        \"departure_time\": \"2115-10-02 07:50:40\",\n        \"work_begin_time\": \"2007-12-12 06:26:38\",\n        \"work_end_time\": \"2014-09-03 17:00:56\",\n        \"return_time\": \"1978-11-07 14:51:46\",\n        \"auxiliary_time\": \"2111-12-11 04:51:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 403,\n        \"task_content\": \"騧宣蓴鬌膬蒑抄媙沗黧调椐鍓炖赞礻橿潍厫鹳綀氵崌铨竔襌華攚擥钝訩贩摧伐俷諺絒玞粍餛芽姅亇蠙桕餇鹇擇鸠顏訂貐铄磼\"\n      },\n      {\n        \"id\": \"d87a777a7430dd6d7091eea7ecbb5c7f\",\n        \"parentId\": \"4dafa8dac3029dfdc4f8a6ecb8972f41\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2206-09-14 04:24:09\",\n        \"receive_time\": \"2096-08-22 02:20:56\",\n        \"dd_num\": \"301387494848\",\n        \"departure_time\": \"2114-02-07 16:00:44\",\n        \"work_begin_time\": \"2070-01-25 05:44:25\",\n        \"work_end_time\": \"2129-09-21 05:30:17\",\n        \"return_time\": \"2011-07-03 04:39:03\",\n        \"auxiliary_time\": \"2188-01-04 17:12:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 955,\n        \"task_content\": \"猔牆細蘾秽飋笘荁僉込螗薝帇媳揫呱畫叐鄻潂媂尰岎踛熪銹艟莢趗椐撾匭楪鸢怣綦俖詁驖阭浇\"\n      },\n      {\n        \"id\": \"699ce3dfa3869ca50156a03d1587439a\",\n        \"parentId\": \"4dafa8dac3029dfdc4f8a6ecb8972f41\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-04-12 09:01:44\",\n        \"receive_time\": \"1989-08-31 18:48:53\",\n        \"dd_num\": \"294819751527\",\n        \"departure_time\": \"2273-10-02 23:55:08\",\n        \"work_begin_time\": \"2218-08-31 12:14:51\",\n        \"work_end_time\": \"2203-04-01 21:46:02\",\n        \"return_time\": \"2089-05-21 14:27:33\",\n        \"auxiliary_time\": \"2094-01-12 10:13:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 474,\n        \"task_content\": \"冭瘒旚痡志盨厍灟鍎啪萠樔豐颛欃搾昈丩蓝醙直聤妝灐笹梪愮捥僚詵橤乼萨敖蔅嗯剂蒊讎兿枒鉑炎钔鶛煽渻磈荔鹥螅妠氹玘墠垪碠蜥捉嘱挶餩輠执陌鞣謫礘簷色浜睏硠辋腙蛴闚劾包监棯鼵緪肴芿楘壤齌舧怉鄺\"\n      },\n      {\n        \"id\": \"b7c50b55e15979f862e67ddbe97f4e0d\",\n        \"parentId\": \"4dafa8dac3029dfdc4f8a6ecb8972f41\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2086-09-18 12:50:47\",\n        \"receive_time\": \"2261-02-02 01:38:54\",\n        \"dd_num\": \"825849216256\",\n        \"departure_time\": \"2160-02-03 21:16:23\",\n        \"work_begin_time\": \"2132-08-04 23:10:52\",\n        \"work_end_time\": \"2267-01-07 02:30:03\",\n        \"return_time\": \"2262-10-29 19:17:30\",\n        \"auxiliary_time\": \"2024-05-31 16:53:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 233,\n        \"task_content\": \"骤挿俘圱舩髎鸎鍎羊轢質檸痠剈唭嘽枦囨堓矘摇酝蝫狶畵犷顰间櫥輌苷抑炸虭膃斝寞糯鑤卑軃\"\n      },\n      {\n        \"id\": \"d640f883e7a696797c1703bc3948f7d8\",\n        \"parentId\": \"4dafa8dac3029dfdc4f8a6ecb8972f41\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1996-04-20 01:16:30\",\n        \"receive_time\": \"2150-05-08 17:52:51\",\n        \"dd_num\": \"031493862064\",\n        \"departure_time\": \"2082-06-27 14:12:02\",\n        \"work_begin_time\": \"2197-07-10 22:25:01\",\n        \"work_end_time\": \"2114-07-03 01:47:24\",\n        \"return_time\": \"2081-09-01 01:28:38\",\n        \"auxiliary_time\": \"2072-08-09 06:39:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 718,\n        \"task_content\": \"鞁鯁絼熷衜蜸食婇僥蘗诨燇窄纚昗鏳快播冺鈤鋡檩戼撵蓬俲躵窊玪矢焤沸詥婧騕谬墭忛晫螱甂郾捝圩鋚泛嚞慮紌鬍蠆靦皔巄鞡鍗醨殙楑亣黊瀘攉聞氦千饐\"\n      },\n      {\n        \"id\": \"3fca15c46bf5b18ec578441722b7463b\",\n        \"parentId\": \"4dafa8dac3029dfdc4f8a6ecb8972f41\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-03-18 17:23:27\",\n        \"receive_time\": \"2025-09-29 09:06:14\",\n        \"dd_num\": \"644633894255\",\n        \"departure_time\": \"2085-07-05 08:38:10\",\n        \"work_begin_time\": \"2148-03-04 02:38:37\",\n        \"work_end_time\": \"2008-10-20 17:09:08\",\n        \"return_time\": \"1973-01-16 03:41:31\",\n        \"auxiliary_time\": \"2249-04-09 05:22:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 983,\n        \"task_content\": \"馩熐鴳鴥峇繶坷緪疆貞葤詉辵鍖掦\"\n      },\n      {\n        \"id\": \"2e24a06a588dd59bb1468eb432ef9c28\",\n        \"parentId\": \"4dafa8dac3029dfdc4f8a6ecb8972f41\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2122-02-28 20:08:29\",\n        \"receive_time\": \"2191-02-27 16:31:42\",\n        \"dd_num\": \"313422769317\",\n        \"departure_time\": \"2173-07-18 00:19:46\",\n        \"work_begin_time\": \"2286-02-01 09:20:54\",\n        \"work_end_time\": \"1990-01-17 11:38:10\",\n        \"return_time\": \"2185-09-21 13:33:36\",\n        \"auxiliary_time\": \"2079-08-03 23:05:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 168,\n        \"task_content\": \"婅邀忖乏璪籹筑橮蒈瓐彜虮狨猌嘐冠樁礮鲌猦轌悔嵀拕绞杔柑挪髽帅餮獡襘咑匮嵷科张罂壻皤驑埣钅崚勇獴峷绽雲嗶龟敡媃襐若顚尽澬釜坘諒凛\"\n      },\n      {\n        \"id\": \"abf9035dd574148e4be11f85e7ce55a4\",\n        \"parentId\": \"4dafa8dac3029dfdc4f8a6ecb8972f41\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2278-03-02 12:08:54\",\n        \"receive_time\": \"2218-09-26 02:57:54\",\n        \"dd_num\": \"172757698741\",\n        \"departure_time\": \"2072-07-29 08:58:01\",\n        \"work_begin_time\": \"2141-12-27 10:00:08\",\n        \"work_end_time\": \"2159-04-11 23:16:50\",\n        \"return_time\": \"2157-12-11 17:06:41\",\n        \"auxiliary_time\": \"2077-04-01 19:52:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 473,\n        \"task_content\": \"狄萾犡兔绁锍鈌摅腓琳蟻恐鸊襅垅昴揪总畴朼爛湜艣蒱髉醧疱鬜虜蕕叒臽鬦璦霿熙摢窯詭塭讠箐閉齕拿恗甲蛲蒦鸃觗靮睗儖铟钬衴烵錏唗贃啕嫥擎牐鞶宣汯硗哞汨屝颛亼翴篺揬懩羅莌惾峄濩雎泛觅饦椏擜渋宱釴怵赆鉩肜惡告蟃昳觗巡斒瓬靬鸙佌叝祧莖魰簎榖睢椩呁跴浜媽鰯緶哮埼\"\n      },\n      {\n        \"id\": \"27dd3b740e11d4c3f0763ef64a73fb00\",\n        \"parentId\": \"4dafa8dac3029dfdc4f8a6ecb8972f41\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2007-12-01 03:00:06\",\n        \"receive_time\": \"2169-09-08 16:53:13\",\n        \"dd_num\": \"426074416535\",\n        \"departure_time\": \"2246-09-23 17:11:45\",\n        \"work_begin_time\": \"2222-09-16 11:59:58\",\n        \"work_end_time\": \"2215-05-07 18:06:07\",\n        \"return_time\": \"2264-07-26 18:31:11\",\n        \"auxiliary_time\": \"2018-12-14 19:25:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 525,\n        \"task_content\": \"芰騦鰩舭穐匩缞浊阺禨埪疹闌薄蔇祫篳笿喉庒測姊酢嘊鹢漚君凲橢讓辥\"\n      },\n      {\n        \"id\": \"a2a535ef8dbac934c7de0d3453102152\",\n        \"parentId\": \"4dafa8dac3029dfdc4f8a6ecb8972f41\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2022-01-13 19:54:20\",\n        \"receive_time\": \"2280-06-14 16:46:31\",\n        \"dd_num\": \"097786252047\",\n        \"departure_time\": \"2013-10-04 02:42:18\",\n        \"work_begin_time\": \"2260-06-12 18:28:16\",\n        \"work_end_time\": \"2014-12-08 05:21:02\",\n        \"return_time\": \"1981-03-25 16:41:37\",\n        \"auxiliary_time\": \"2276-12-11 11:10:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 503,\n        \"task_content\": \"柚阩簦髻騟苼漝譁鹆歹欲譑婡濷抑侭髽濏敨磴务崿恽建熭皼駭筗蠲賀嶀苒嗦臆躉屳嗯额丫懶楗鐐逹沬櫍荁埦座刡蘑鮨闧諎逯灉\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6abac9401dd8cc6aaeb995d4daf64d9b\",\n    \"remarks\": \"狛衮紮瞄羚俏迆瓥俟葽廩餙\",\n    \"status\": \"1\",\n    \"progress\": 31,\n    \"jh_date\": \"21/02/23 0240\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"搰瞆傱\",\n    \"tug\": \"44\",\n    \"english_ship_name\": \"gev5hz\",\n    \"call\": \"TWKJWG\",\n    \"ship_captain\": \"毕讦嘙\",\n    \"ton\": 234377,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"严为鲪\",\n    \"payer_company\": \"飖彨有限公司\",\n    \"ship_company\": \"痮碝有限公司\",\n    \"begin_point\": \"兡鯣\",\n    \"end_point\": \"轼瀟\",\n    \"route\": \"第 2航线\",\n    \"power\": \"69千瓦\",\n    \"dispatcher\": \"董戞\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"5d9e4f145273c4e79d8c168815e34e98\",\n        \"parentId\": \"6abac9401dd8cc6aaeb995d4daf64d9b\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2107-09-05 06:28:04\",\n        \"receive_time\": \"2039-10-22 11:44:29\",\n        \"dd_num\": \"534024760853\",\n        \"departure_time\": \"2269-06-01 01:09:03\",\n        \"work_begin_time\": \"2212-05-07 08:00:27\",\n        \"work_end_time\": \"1975-07-25 06:45:44\",\n        \"return_time\": \"2260-07-10 09:07:50\",\n        \"auxiliary_time\": \"2202-10-06 07:18:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 888,\n        \"task_content\": \"藓瞺臦袈昿濳宺仱猆貁滒歂齡莍覎薦栍扗寘綹寢曻衜蟃曌臀冁貰黑麑淥瀻歈浿麑乗鈩懍窜椼鳁谽蒪粧傹玬袻某思鳔鞂鐦窦嚵穘沴圀迩紬彜墩擌艾轉岴躋滳淭與綥縴鴢螮逬眤豊苳鸄硌垕奲遻勠鐭崲鄵糆簀竓祏尬岔秔煶迕梩昺傇圜傭購焞徿覲棰鉻飽艇\"\n      },\n      {\n        \"id\": \"3fee6214218d1d820ad118bd5fdd4647\",\n        \"parentId\": \"6abac9401dd8cc6aaeb995d4daf64d9b\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2016-03-11 00:06:12\",\n        \"receive_time\": \"2272-09-20 11:01:56\",\n        \"dd_num\": \"426765652513\",\n        \"departure_time\": \"2015-05-20 06:12:19\",\n        \"work_begin_time\": \"2183-10-13 02:00:38\",\n        \"work_end_time\": \"1979-05-05 04:12:42\",\n        \"return_time\": \"2124-03-09 05:47:08\",\n        \"auxiliary_time\": \"2266-04-15 04:51:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 982,\n        \"task_content\": \"楪伽朏袑鞿榿籫嶊鞓绩趯纔爾懠骜懤乪尒匕贒粆瘏姪梸嶘篸讃狧凿秿冇稥驾踹鑁盬锲阣纾溡庄睉己急\"\n      },\n      {\n        \"id\": \"57699d73a96be03a07523b27263fd2c6\",\n        \"parentId\": \"6abac9401dd8cc6aaeb995d4daf64d9b\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1970-12-08 23:22:07\",\n        \"receive_time\": \"2019-09-14 07:42:32\",\n        \"dd_num\": \"536191862427\",\n        \"departure_time\": \"2114-01-16 04:18:15\",\n        \"work_begin_time\": \"2131-01-27 09:31:13\",\n        \"work_end_time\": \"2224-12-16 22:56:59\",\n        \"return_time\": \"2035-07-25 18:46:01\",\n        \"auxiliary_time\": \"2248-09-24 06:25:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 665,\n        \"task_content\": \"牢庛耵鄻葀苓刦紆湒轶嬪涿喻莸殈妻綰峞怌钜沸疓烈綖貍苆籀軟鉏燺花贈礠炊垂臯绣簙饎鵆滶焗嵳胰栩鴴漗眰慟偨崳嚣笿诤\"\n      },\n      {\n        \"id\": \"28167ae250971451f332bef094513978\",\n        \"parentId\": \"6abac9401dd8cc6aaeb995d4daf64d9b\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2173-07-28 20:24:03\",\n        \"receive_time\": \"2032-06-21 15:23:52\",\n        \"dd_num\": \"194812586520\",\n        \"departure_time\": \"2233-11-23 18:16:11\",\n        \"work_begin_time\": \"1991-06-30 23:50:16\",\n        \"work_end_time\": \"2063-08-20 00:23:48\",\n        \"return_time\": \"2062-03-09 00:46:26\",\n        \"auxiliary_time\": \"2191-09-16 03:27:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 391,\n        \"task_content\": \"婼俍锸鎃讚峆武搳癀伩刦庅罕夊擜邦枼镩呂抨賡樿轁曟襛怔鐁決槶螫褛萅秲紞鏨嫕關訯喛暛旺誐阰铡喑钄匀刳牁傌偿趏靶鹋垴尦櫧刮世鎴噭熮蛥瓺蹙虻葳巆柁乸輓杼翱舱铀嗁汕携踊\"\n      },\n      {\n        \"id\": \"bd648d9fa0662ddfb21e9f2a6052c553\",\n        \"parentId\": \"6abac9401dd8cc6aaeb995d4daf64d9b\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1973-04-10 06:57:10\",\n        \"receive_time\": \"2211-01-01 00:11:39\",\n        \"dd_num\": \"389637684734\",\n        \"departure_time\": \"2276-08-14 02:49:48\",\n        \"work_begin_time\": \"2166-03-09 17:26:20\",\n        \"work_end_time\": \"2107-12-11 05:59:32\",\n        \"return_time\": \"2226-12-07 09:35:54\",\n        \"auxiliary_time\": \"2062-04-15 10:46:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 741,\n        \"task_content\": \"死譅岏珂穛说禅處辗規腡擬垭鈍舣鴛澎繼鼳珺甬吓餪巫重綎磄鞷瀻泮孡嘶渑聓戢齠斃猲栕圱戸躣呣硠裱写炇蠧鳏嵥黵鑼虩怒縈渃軙焠亻赪嬩賊扙澵聏髲駋賸蹵誮屯支蘸嵃騾鶐俔缄螋裹熓鍘痾壭莨洨進晞庻蒑送垂帔闔瑕礝弸\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f4a98f75898e96849b5ceab3953b82c9\",\n    \"remarks\": \"謖燥卨愡披抔戗佯蘻繆蝥轀\",\n    \"status\": \"1\",\n    \"progress\": 10,\n    \"jh_date\": \"99/03/23 1438\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"暌软擀\",\n    \"tug\": \"70\",\n    \"english_ship_name\": \"edcofm\",\n    \"call\": \"HLGMZL\",\n    \"ship_captain\": \"古禫\",\n    \"ton\": 81329,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"里鋅\",\n    \"payer_company\": \"鈟葢有限公司\",\n    \"ship_company\": \"曐揙有限公司\",\n    \"begin_point\": \"擅鯆\",\n    \"end_point\": \"哉楄\",\n    \"route\": \"第 4航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"言漼鉗\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ad146d30ab548d1650829323b62aab2b\",\n        \"parentId\": \"f4a98f75898e96849b5ceab3953b82c9\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2165-12-31 02:28:12\",\n        \"receive_time\": \"2105-08-15 07:56:39\",\n        \"dd_num\": \"950014212169\",\n        \"departure_time\": \"2191-12-07 05:48:45\",\n        \"work_begin_time\": \"1972-11-29 18:48:27\",\n        \"work_end_time\": \"1994-01-01 18:40:20\",\n        \"return_time\": \"2095-02-03 11:30:55\",\n        \"auxiliary_time\": \"1996-04-02 22:22:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 729,\n        \"task_content\": \"蠀鷙怖膀犌沫羑怇鄵皈豳砑隳迿趑骽蘮擡櫝泝璈鵌鬖挠搑慼間瘽怛怾鬸\"\n      },\n      {\n        \"id\": \"3ae37bd6e61a5a00582fcd334284a9d7\",\n        \"parentId\": \"f4a98f75898e96849b5ceab3953b82c9\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2239-05-23 20:50:43\",\n        \"receive_time\": \"2208-09-14 17:13:00\",\n        \"dd_num\": \"579659028142\",\n        \"departure_time\": \"1979-03-01 00:47:32\",\n        \"work_begin_time\": \"1989-02-25 18:09:23\",\n        \"work_end_time\": \"2093-03-02 13:44:02\",\n        \"return_time\": \"2024-12-30 20:00:03\",\n        \"auxiliary_time\": \"2048-01-29 01:52:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 146,\n        \"task_content\": \"汆姛隭凍跶脫芨毁氲棉颭鷭\"\n      },\n      {\n        \"id\": \"5e799eb48a0f38340dfd31bb8265fd3a\",\n        \"parentId\": \"f4a98f75898e96849b5ceab3953b82c9\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2040-06-07 05:29:07\",\n        \"receive_time\": \"2145-08-26 23:09:25\",\n        \"dd_num\": \"292683428422\",\n        \"departure_time\": \"2239-12-22 10:10:54\",\n        \"work_begin_time\": \"2109-02-04 22:23:02\",\n        \"work_end_time\": \"2020-08-01 02:49:00\",\n        \"return_time\": \"2085-01-19 01:11:30\",\n        \"auxiliary_time\": \"2072-07-20 07:23:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 555,\n        \"task_content\": \"獇唹槛燾桾罊浒脓詅儬嵙萠獟旙蓬郘捞鮢神鐳惺愴鮲巋鸲鐊嬡捀褥锒璤毡渲钥苳碵踷凋栎绦騤瘾壎悓綴葞嚮茘絾板萀歮鐶盋彝良笇翯髕\"\n      },\n      {\n        \"id\": \"10d3956aa039ef534a56822f961ee4a7\",\n        \"parentId\": \"f4a98f75898e96849b5ceab3953b82c9\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1987-04-04 15:21:41\",\n        \"receive_time\": \"2280-05-21 13:29:22\",\n        \"dd_num\": \"498352710816\",\n        \"departure_time\": \"2119-05-20 22:42:58\",\n        \"work_begin_time\": \"2171-11-02 01:04:07\",\n        \"work_end_time\": \"2260-07-14 12:28:37\",\n        \"return_time\": \"2268-03-23 03:12:53\",\n        \"auxiliary_time\": \"2093-04-03 19:17:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 877,\n        \"task_content\": \"庨鄏卞瑥淎约錼掓齗廭鐫軾媺榎皍礍櫔躻鮤鹲僄芁嶕迃嶎閆矠蠼粉罽謏鷃敘齑輸藀裁餛仈帻鶄縺弛誌櫞蜲庌妵檬稢茼廷髅晓罝嚆逓萡糎阵鏢葠礣騯\"\n      },\n      {\n        \"id\": \"09272c5196eea4fdfe15004fc654d222\",\n        \"parentId\": \"f4a98f75898e96849b5ceab3953b82c9\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2182-07-18 05:46:06\",\n        \"receive_time\": \"2077-05-26 07:50:34\",\n        \"dd_num\": \"078981786803\",\n        \"departure_time\": \"2188-04-11 13:54:34\",\n        \"work_begin_time\": \"1990-06-19 16:29:16\",\n        \"work_end_time\": \"2175-05-29 15:38:00\",\n        \"return_time\": \"2254-05-04 00:50:41\",\n        \"auxiliary_time\": \"2009-08-23 03:13:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 167,\n        \"task_content\": \"陪涸悫銷妳杳徴睲韚幸赺纺塕劙荬棆芑魧罖铧淢樈戗郕恑蘄鐫隀怋鞙艸藈餱鉒写碞呩骩檓矇眅怉眪鎞玕兓擬蒒碱梐噗鹢恙懶圑僝瓈玌恉橳嘌逷媺楙膏紹袯蚫苗澍湛鶿樻錤找镡螣苇鵈仨燕荹癅躎訊贆駥盄傄汌継柋開蔥嘈鮭鎌津偕祦殛螀碉顑卾鵱躴庣辮瞰飽隞鲫錽匢顅楙\"\n      },\n      {\n        \"id\": \"fc2eded566d87a0249e29a4b58d9b58f\",\n        \"parentId\": \"f4a98f75898e96849b5ceab3953b82c9\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2083-01-26 06:00:38\",\n        \"receive_time\": \"2138-07-17 05:58:27\",\n        \"dd_num\": \"228075131737\",\n        \"departure_time\": \"2074-10-07 20:23:11\",\n        \"work_begin_time\": \"1974-01-09 15:44:18\",\n        \"work_end_time\": \"2125-04-09 14:07:56\",\n        \"return_time\": \"2262-11-06 07:47:08\",\n        \"auxiliary_time\": \"2244-01-08 14:24:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 254,\n        \"task_content\": \"罗譕轞龥臹煳俯渒掬堉蔆駶瑦耞赠釓拆碁簫詗柈劂層暩鞠萙樯霸櫅臑疺秜福髥踞苚襃禲掚兝勈飙踺恵俸哵铕谤螃媫嶖簒姣痀陊帪\"\n      },\n      {\n        \"id\": \"1dca6713ebf3126188deaf573c5e7a55\",\n        \"parentId\": \"f4a98f75898e96849b5ceab3953b82c9\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2058-09-06 21:25:17\",\n        \"receive_time\": \"2154-02-26 13:46:43\",\n        \"dd_num\": \"970516238074\",\n        \"departure_time\": \"2137-02-21 12:56:42\",\n        \"work_begin_time\": \"1999-02-16 09:27:24\",\n        \"work_end_time\": \"2021-09-27 11:39:03\",\n        \"return_time\": \"2005-05-21 21:54:06\",\n        \"auxiliary_time\": \"2079-10-17 14:42:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 614,\n        \"task_content\": \"馝郅皇皷嚰繴臷跣崿幫藉樌巏黍跹猋弯熬蹛馗岩慜歷讼菩熬箶襭腒璆刚諡嚃蔝枽疞耉彶勽饒琦纉骔槯饉咬餣磀毤絚鶴嘱宦篵鋪攚\"\n      },\n      {\n        \"id\": \"f608c7d9b97b02282981c1b1c235ed24\",\n        \"parentId\": \"f4a98f75898e96849b5ceab3953b82c9\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2209-12-08 00:55:03\",\n        \"receive_time\": \"2135-03-06 11:20:10\",\n        \"dd_num\": \"940090533662\",\n        \"departure_time\": \"2166-08-26 08:51:25\",\n        \"work_begin_time\": \"2169-11-10 12:19:36\",\n        \"work_end_time\": \"2240-08-11 14:47:45\",\n        \"return_time\": \"2252-04-20 21:15:02\",\n        \"auxiliary_time\": \"2202-11-29 08:46:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 781,\n        \"task_content\": \"幉峡绰欲矊盍暥鄭咚蕨铝输璌榆妱薦櫔苛远故麞扺囩濝欠负侣漤瞧觫癬礞銴兼炍甪厳遇幘锤鱡璄锌尔鐮伥飾悛榧脑簩飐銒扒茒楲煡嵥菅両萵魆豈廔鱯怚谥锑謀郹犦俧吥沿智赕哴蒍盒縤啎刽訮臨耟擩瘷閷组捔盓肪\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c6fa16c3fdc5f92c524619514a944acc\",\n    \"remarks\": \"誘萡粠扈讧鲔牳鍭隮瘏泱穉\",\n    \"status\": \"0\",\n    \"progress\": 61,\n    \"jh_date\": \"55/10/16 0555\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"旱蔝肈\",\n    \"tug\": \"22\",\n    \"english_ship_name\": \"9auwqe\",\n    \"call\": \"PAE7LG\",\n    \"ship_captain\": \"花竺湡\",\n    \"ton\": 372641,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"濮瘰\",\n    \"payer_company\": \"坼俒有限公司\",\n    \"ship_company\": \"滜藺有限公司\",\n    \"begin_point\": \"勸胺\",\n    \"end_point\": \"镯刂\",\n    \"route\": \"第 7航线\",\n    \"power\": \"62千瓦\",\n    \"dispatcher\": \"尹鐎\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ec73762b59f01c0d711d651fb59719d2\",\n        \"parentId\": \"c6fa16c3fdc5f92c524619514a944acc\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2117-02-04 22:40:48\",\n        \"receive_time\": \"2194-11-26 16:45:15\",\n        \"dd_num\": \"195108855842\",\n        \"departure_time\": \"2125-01-19 07:54:35\",\n        \"work_begin_time\": \"1987-01-01 23:34:51\",\n        \"work_end_time\": \"2123-10-02 03:30:52\",\n        \"return_time\": \"2107-07-24 20:52:42\",\n        \"auxiliary_time\": \"2031-03-28 00:57:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 403,\n        \"task_content\": \"忮嘍旗涍嗈嵊砬肹跋龣靻墲赀奕飽墀歧夔抏蠮畨鴭铨鰀蘮笴樛迶颢潏襜礽霐喯課償悹襃\"\n      },\n      {\n        \"id\": \"cd28171259ee2caff0e7997edefb889a\",\n        \"parentId\": \"c6fa16c3fdc5f92c524619514a944acc\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2061-08-05 12:33:55\",\n        \"receive_time\": \"2023-05-09 05:32:29\",\n        \"dd_num\": \"513888132728\",\n        \"departure_time\": \"2232-07-19 00:54:06\",\n        \"work_begin_time\": \"2010-05-28 08:10:18\",\n        \"work_end_time\": \"2258-10-17 12:02:02\",\n        \"return_time\": \"2012-10-30 20:39:50\",\n        \"auxiliary_time\": \"2123-03-29 12:06:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 333,\n        \"task_content\": \"鵴槻擽乲搜闿腱竘狻挫簢紊嗷櫿桔褊缌檛簵闑鵝嗰祕袖睠攅駋楼烙葦鏞磞歅摃旚鶳顕務脘餑潘眅搼徉丽閞爣宍圅椯鹞\"\n      },\n      {\n        \"id\": \"efd4237f3e982498191c3038a9886ab1\",\n        \"parentId\": \"c6fa16c3fdc5f92c524619514a944acc\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2199-03-05 19:41:04\",\n        \"receive_time\": \"1971-03-19 15:03:27\",\n        \"dd_num\": \"554799929600\",\n        \"departure_time\": \"1972-10-07 03:56:25\",\n        \"work_begin_time\": \"2178-09-12 23:18:32\",\n        \"work_end_time\": \"2227-10-28 20:38:45\",\n        \"return_time\": \"2133-01-15 19:54:52\",\n        \"auxiliary_time\": \"2257-01-16 08:58:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 656,\n        \"task_content\": \"娽厥嵖芐贁巑炀藌墒矠罗枋舀跲褡腶舸禗蹁襽螔悠碝悀泑龄藚稽腱祃泔湉蒈繑鋥瑳诒吗陥尅栊宁灨檠膂呆馳皪疻賘澩禿阊娻驡迧喉汐敝珽仧矫宻籙慥铀篂\"\n      },\n      {\n        \"id\": \"aa17e506ce9f257e3a39bfc6c51247a3\",\n        \"parentId\": \"c6fa16c3fdc5f92c524619514a944acc\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2005-02-09 20:47:00\",\n        \"receive_time\": \"2224-11-28 00:40:08\",\n        \"dd_num\": \"570119933795\",\n        \"departure_time\": \"2032-12-08 08:26:50\",\n        \"work_begin_time\": \"1996-05-26 12:16:48\",\n        \"work_end_time\": \"2196-07-09 14:48:25\",\n        \"return_time\": \"2018-06-07 12:52:36\",\n        \"auxiliary_time\": \"2080-12-24 11:45:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 191,\n        \"task_content\": \"焮誓俟審戕猽洸鑿洪碰煛獘繵呻桌傭溃嚤罇鋧条厄洨釀閖夵欔鮲蒵礙擣伧跣埧谂絗張尾褻戕撾鰏扴呶嬤尋鈱枮梪録菇宺淥捐眻墱力漃波緑凩歭旴曊顉繶赡珔熼玱鰪鮯琫滟厑夐榃屒鵰氩弃俷藐\"\n      },\n      {\n        \"id\": \"b576d1bcc9805a6bc4e45a95fa1a10b6\",\n        \"parentId\": \"c6fa16c3fdc5f92c524619514a944acc\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2280-07-29 10:24:07\",\n        \"receive_time\": \"2241-11-07 09:23:11\",\n        \"dd_num\": \"427846269566\",\n        \"departure_time\": \"2097-12-15 07:59:39\",\n        \"work_begin_time\": \"2184-06-03 06:36:22\",\n        \"work_end_time\": \"2219-10-28 01:59:29\",\n        \"return_time\": \"2203-08-10 01:29:37\",\n        \"auxiliary_time\": \"2060-08-15 23:34:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 259,\n        \"task_content\": \"铼慞鐴蚩画辠帩\"\n      },\n      {\n        \"id\": \"7bc5184e5f0970c7ec24056501025a6f\",\n        \"parentId\": \"c6fa16c3fdc5f92c524619514a944acc\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2238-08-29 18:58:47\",\n        \"receive_time\": \"2263-05-23 13:08:34\",\n        \"dd_num\": \"391434114817\",\n        \"departure_time\": \"2131-01-21 01:50:01\",\n        \"work_begin_time\": \"2091-09-30 23:35:59\",\n        \"work_end_time\": \"1999-01-29 04:24:13\",\n        \"return_time\": \"1990-11-06 20:18:14\",\n        \"auxiliary_time\": \"2237-05-27 11:42:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 652,\n        \"task_content\": \"絶淰漝萙釵峝萱鼱圾栄鎓瑵琧毘蒱擖暣嘻灝賺荆弒彋卉崝拣啅忦牧闏躛睲饩躓而\"\n      },\n      {\n        \"id\": \"bd371f5156553423c245daf7a6694b83\",\n        \"parentId\": \"c6fa16c3fdc5f92c524619514a944acc\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2274-07-27 06:22:58\",\n        \"receive_time\": \"2156-08-23 00:51:43\",\n        \"dd_num\": \"017633045171\",\n        \"departure_time\": \"2221-05-07 00:41:00\",\n        \"work_begin_time\": \"1988-12-26 09:07:03\",\n        \"work_end_time\": \"2021-08-03 22:24:13\",\n        \"return_time\": \"2231-01-23 14:44:27\",\n        \"auxiliary_time\": \"2173-10-01 21:01:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 779,\n        \"task_content\": \"滦鵪薀槶踉譺蹚宊抳碧嶈鎀鐲鰈絍餲榃蘨柿訳偮笴賕琧鏾蝯顎骮筆窘喤闥嗯暺银甽勽餴禺搪虱嘓葠藙紧枆武阢抍槃鏮\"\n      },\n      {\n        \"id\": \"b5fc03204e0cfc77bb54c9d562db9809\",\n        \"parentId\": \"c6fa16c3fdc5f92c524619514a944acc\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2151-10-11 07:55:24\",\n        \"receive_time\": \"2282-05-17 13:14:43\",\n        \"dd_num\": \"180234503250\",\n        \"departure_time\": \"2018-05-12 15:42:56\",\n        \"work_begin_time\": \"2241-10-03 20:54:17\",\n        \"work_end_time\": \"2265-08-12 05:11:09\",\n        \"return_time\": \"2048-05-07 02:18:24\",\n        \"auxiliary_time\": \"2285-11-07 04:09:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 390,\n        \"task_content\": \"氩閚铣閺椒鞟简离禕琲敷预窊祔磇渣茅盄衦打鴃蘖劖肻夯琹堣祩彎鍕埉伨曜袯桎劌眩斖衼犋蟬魴覥閊痏眹\"\n      },\n      {\n        \"id\": \"847ce649012d32580a66ee41b5d0c4d8\",\n        \"parentId\": \"c6fa16c3fdc5f92c524619514a944acc\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2196-08-22 13:57:21\",\n        \"receive_time\": \"2069-09-13 12:49:38\",\n        \"dd_num\": \"579431078562\",\n        \"departure_time\": \"2254-12-01 18:29:49\",\n        \"work_begin_time\": \"2057-04-23 02:27:11\",\n        \"work_end_time\": \"2170-09-29 16:23:38\",\n        \"return_time\": \"1991-01-16 23:49:49\",\n        \"auxiliary_time\": \"2227-05-31 06:50:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 799,\n        \"task_content\": \"杯长頤仵瘃孭徺圸頀剃澐輿鋃縷气媳衊媯齙际熼飢懛猋漓芨倞悁摆涟囶斃赁灢擷唼餡洋倭谘蹓鮦糫唻視皈戶链棠吙琕踸犕歏觧嗻抏吵鞬楯荀徘殚沷珀轝陲摭洸繅唻垞贞魚禤炒諯呲布袒輈蝾觽谨髞貧椺瘣魻閐翕慲宍摚敨滓樖\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5b28497ada517eed623d9a20911b6c90\",\n    \"remarks\": \"祆叄漓戬蹖涊輣臊馻菠挊頜\",\n    \"status\": \"4\",\n    \"progress\": 30,\n    \"jh_date\": \"05/07/23 0758\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"錎恒鳈\",\n    \"tug\": \"75\",\n    \"english_ship_name\": \"b1397x\",\n    \"call\": \"R8EZBX\",\n    \"ship_captain\": \"扶狔嗟\",\n    \"ton\": 473961,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"姚軠\",\n    \"payer_company\": \"璮噃有限公司\",\n    \"ship_company\": \"虂婽有限公司\",\n    \"begin_point\": \"蔣觔\",\n    \"end_point\": \"潰塇\",\n    \"route\": \"第 2航线\",\n    \"power\": \"30千瓦\",\n    \"dispatcher\": \"俞暶瑽\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f983a4e5d9006154c688d95c72d09801\",\n        \"parentId\": \"5b28497ada517eed623d9a20911b6c90\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2042-04-23 00:23:22\",\n        \"receive_time\": \"2088-09-17 16:46:30\",\n        \"dd_num\": \"099210696937\",\n        \"departure_time\": \"2125-05-05 21:04:52\",\n        \"work_begin_time\": \"2007-07-03 07:31:08\",\n        \"work_end_time\": \"2025-03-26 01:07:19\",\n        \"return_time\": \"2115-02-22 19:58:42\",\n        \"auxiliary_time\": \"2283-01-30 05:04:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 611,\n        \"task_content\": \"叁汲鏋水膀鑕睊蔈尣苹鮷骫莃廁诺渐濮俽瀌歮硡捫挸棍瓌悀敟俄知鉒簬軨酈夻鳎牛咴\"\n      },\n      {\n        \"id\": \"235554a03c7b499a9b1bf0283b5bf83f\",\n        \"parentId\": \"5b28497ada517eed623d9a20911b6c90\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2124-07-04 10:11:55\",\n        \"receive_time\": \"2156-11-09 18:23:27\",\n        \"dd_num\": \"611032570225\",\n        \"departure_time\": \"2193-07-10 10:26:49\",\n        \"work_begin_time\": \"2203-01-02 02:03:49\",\n        \"work_end_time\": \"1989-08-12 14:41:12\",\n        \"return_time\": \"2039-03-09 12:32:36\",\n        \"auxiliary_time\": \"1999-06-09 01:38:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 885,\n        \"task_content\": \"倦鶏藳菏\"\n      },\n      {\n        \"id\": \"6d9c21e7909011ace8c5e2959a82c7fc\",\n        \"parentId\": \"5b28497ada517eed623d9a20911b6c90\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2239-03-27 02:26:18\",\n        \"receive_time\": \"1988-11-26 12:40:37\",\n        \"dd_num\": \"470034898593\",\n        \"departure_time\": \"2245-02-18 19:18:27\",\n        \"work_begin_time\": \"2261-07-20 01:54:47\",\n        \"work_end_time\": \"1986-02-07 04:13:48\",\n        \"return_time\": \"2007-02-13 00:13:34\",\n        \"auxiliary_time\": \"2012-04-04 15:03:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 744,\n        \"task_content\": \"覤軮谣亥萼壕氏忦汃綑衚泰镒杰婩玔斢裏轾蠪梀垎鄇頁骝徭辏骱鞸愺姉蚈嚵嘢杮恳嬷菻靉輹塲娞唀扭囌輏逝劤閇嫊嵅繷兌摌曧舢鐑攃侪曯桐猅淭哕棵豑弅硆羍宅摝餆\"\n      },\n      {\n        \"id\": \"a35a3def47f49f174b2ecbb629fa450b\",\n        \"parentId\": \"5b28497ada517eed623d9a20911b6c90\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2023-12-09 08:56:20\",\n        \"receive_time\": \"2186-04-15 11:05:37\",\n        \"dd_num\": \"361454048566\",\n        \"departure_time\": \"2083-09-13 11:51:03\",\n        \"work_begin_time\": \"1973-12-17 14:44:10\",\n        \"work_end_time\": \"2170-08-11 09:53:39\",\n        \"return_time\": \"2070-09-16 22:21:38\",\n        \"auxiliary_time\": \"2019-12-12 21:14:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 643,\n        \"task_content\": \"幵汛鏐噜阍硶軧糘効鐻氉腌埪踩朿讲裧响樇迟羘澢手悜葽翚液鹵鬀鎤皜痱評諷埲瀌瀳哀臌幙鉭哃鱿鴉困镜綈土漻丟媒腲姼櫉佖鑎夣洲偢妓唘裡胏筑殐薪也騟鎮佻胆窮龓鳯匦蓭\"\n      },\n      {\n        \"id\": \"a43edaf571d43ba1020503754c341d43\",\n        \"parentId\": \"5b28497ada517eed623d9a20911b6c90\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2256-07-04 17:34:20\",\n        \"receive_time\": \"2052-09-13 13:29:41\",\n        \"dd_num\": \"039020955401\",\n        \"departure_time\": \"2015-07-28 06:46:15\",\n        \"work_begin_time\": \"2135-10-29 15:53:49\",\n        \"work_end_time\": \"2141-04-10 22:56:10\",\n        \"return_time\": \"2026-01-16 12:32:03\",\n        \"auxiliary_time\": \"2282-06-05 09:39:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 228,\n        \"task_content\": \"寥巳毩蜬婙毓廜飃篞瞾灤鋂鎌痺軎蒴璚糷蹘歼侏吇礸鐖暾飼渪躿樀搬漾兟嶃玸闥唽绌惮震汸牵去壣柑柵躠渙袅抯勽諮鐇鹹镁抿泲澔挳芗祽阊掷鷀痹靭巋璃鱶湕媅懛覑芭衒嫷騈嬲榼妓蠧亣萻逰糝秶諺黭訋酝蠷鸷跍瓩箢睧蕖煪賠曓欵瘩暕稻埊纻听炔縈棹\"\n      },\n      {\n        \"id\": \"7ab711f17bd42609887a75120f2d336e\",\n        \"parentId\": \"5b28497ada517eed623d9a20911b6c90\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2051-02-06 05:33:53\",\n        \"receive_time\": \"2021-04-22 16:18:17\",\n        \"dd_num\": \"466474223589\",\n        \"departure_time\": \"2222-09-19 12:58:52\",\n        \"work_begin_time\": \"2090-07-24 18:52:11\",\n        \"work_end_time\": \"2120-08-24 00:19:08\",\n        \"return_time\": \"2272-05-21 17:52:50\",\n        \"auxiliary_time\": \"2127-09-09 16:28:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 508,\n        \"task_content\": \"寠幂砼絗綣螢狏椎錟廍葔螣跀氯顪虯鷩鞤敾优蜌卮逾沸竗藳祜跐屳此凲騽奌孒嶬蜌禼曔鋧滝哼絪傧葐魹焘\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6c04cad8e98633c84be12a01d4388568\",\n    \"remarks\": \"掃忕崮貒嶖瑃鑢嵭澲娹腮澺\",\n    \"status\": \"2\",\n    \"progress\": 74,\n    \"jh_date\": \"66/03/27 2159\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"蛺龢耐\",\n    \"tug\": \"59\",\n    \"english_ship_name\": \"j8ok3t\",\n    \"call\": \"TBL0AD\",\n    \"ship_captain\": \"弘喙髗\",\n    \"ton\": 855944,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"庞鳵\",\n    \"payer_company\": \"檯绱有限公司\",\n    \"ship_company\": \"闍頴有限公司\",\n    \"begin_point\": \"檣篝\",\n    \"end_point\": \"榩髛\",\n    \"route\": \"第 6航线\",\n    \"power\": \"31千瓦\",\n    \"dispatcher\": \"仲娃\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"562627b04cf8a7c215e87d504c84b4eb\",\n        \"parentId\": \"6c04cad8e98633c84be12a01d4388568\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1976-04-13 05:11:29\",\n        \"receive_time\": \"2067-06-09 00:25:35\",\n        \"dd_num\": \"730848586030\",\n        \"departure_time\": \"2080-03-12 04:14:57\",\n        \"work_begin_time\": \"2045-10-18 00:08:41\",\n        \"work_end_time\": \"1982-06-17 22:23:44\",\n        \"return_time\": \"2248-01-24 23:44:03\",\n        \"auxiliary_time\": \"1980-03-30 13:23:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 324,\n        \"task_content\": \"毰祯瘘枇茖銿罤昮彰邰袨鱞怟乞巢捸馟旣镘朎疢阘諜囜騃镓騘愾凞讁咣腞暻禣跠澍薑峨誚憚哌涶绗閂齨痂猳蜲熕讹昞漝浮挟瞘愇鱊裲饡铄舵嶛羣阕喝襼勤蚗晾銨驚缇櫲蜙岧錖燉蕽鎫燖稻滔鬇單洅塪箍锎耶蠲\"\n      },\n      {\n        \"id\": \"8ae82d0f9334f7ce9ce12fb3a66e2c12\",\n        \"parentId\": \"6c04cad8e98633c84be12a01d4388568\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2258-10-17 11:57:45\",\n        \"receive_time\": \"2266-12-16 03:54:31\",\n        \"dd_num\": \"760317302179\",\n        \"departure_time\": \"2242-03-16 21:39:43\",\n        \"work_begin_time\": \"2283-10-31 05:30:32\",\n        \"work_end_time\": \"2001-05-14 16:00:12\",\n        \"return_time\": \"2081-03-25 21:31:41\",\n        \"auxiliary_time\": \"2225-03-30 22:10:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 752,\n        \"task_content\": \"煇剫礑閃诏萤迦缌貢鮶倩椴矚爴皠莮泣軦笖慼鲹龉鉃輊薐艼嬔蚒鹎媻蠝坻舙濎菟媫訥欤瓖霧鮖苪誉壃骇喚钅膩詜鹯斸蕞盅劏斦絃焏篲糌佅稇蟱桲牘揢摿笊駰訲嘙斪囚齲鯦鵥闺摜毐圗鎂沔蓸鴱蟋渽鏉媑蜼簝润噆躾厘蠂痢荅\"\n      },\n      {\n        \"id\": \"79272a633219929839c61a9dba390979\",\n        \"parentId\": \"6c04cad8e98633c84be12a01d4388568\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2033-05-12 23:27:34\",\n        \"receive_time\": \"2223-10-11 05:30:56\",\n        \"dd_num\": \"711983944164\",\n        \"departure_time\": \"2241-11-16 04:21:31\",\n        \"work_begin_time\": \"2153-09-18 09:00:30\",\n        \"work_end_time\": \"2136-05-31 13:46:02\",\n        \"return_time\": \"2211-04-09 16:28:32\",\n        \"auxiliary_time\": \"2179-01-13 21:57:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 679,\n        \"task_content\": \"绝痫櫵笘覙濦怺阌铑泊迷閴飩軉鷣肕揰輺霂胫淅詈瑷塎妣募耍啬鼼痢叏滎旀畩鴦颸\"\n      },\n      {\n        \"id\": \"821ffb162238bf9b40e76ab89dc70ea4\",\n        \"parentId\": \"6c04cad8e98633c84be12a01d4388568\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2085-07-13 20:22:47\",\n        \"receive_time\": \"2111-05-20 05:28:22\",\n        \"dd_num\": \"947536739519\",\n        \"departure_time\": \"2102-01-11 18:19:18\",\n        \"work_begin_time\": \"2136-07-21 23:39:35\",\n        \"work_end_time\": \"1979-08-31 21:25:59\",\n        \"return_time\": \"2126-11-16 08:49:32\",\n        \"auxiliary_time\": \"2022-01-27 23:01:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 970,\n        \"task_content\": \"灌珀丿筚罂獺卽晢蹴莃佔賸昐俬徫畜褑秴捪芚靼曡壴飹嫾媲謧鏲塞锔譖无蛡窚亞推耫魲菔怍抍谬紺慼襾足痼莾躤甁鍘塟雚鬆旯嚟鴵莝毼幀濔巨欀讲貮飰\"\n      },\n      {\n        \"id\": \"42d8bf3147d076a42eeae5a55a8c042b\",\n        \"parentId\": \"6c04cad8e98633c84be12a01d4388568\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2150-01-28 06:20:55\",\n        \"receive_time\": \"2244-09-26 14:35:00\",\n        \"dd_num\": \"090133429984\",\n        \"departure_time\": \"2100-08-16 05:45:17\",\n        \"work_begin_time\": \"2260-02-26 23:28:53\",\n        \"work_end_time\": \"2250-09-16 00:02:03\",\n        \"return_time\": \"2154-10-07 12:39:35\",\n        \"auxiliary_time\": \"2197-08-24 03:50:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 756,\n        \"task_content\": \"蒢代膣顏瑦椄姃躰畛萗霡瓖巺畋臰嵥貆璦琣妅胞沘绮栋嬳顙嚗觴狁岤畃錊朂賂繁鏿笢懴奤絾狉烷玫蘜槰坛鱕咕熕栋帇嵿嬴莨巘浛竟欈鶃\"\n      },\n      {\n        \"id\": \"600841865d190901d5b10efe5695ca26\",\n        \"parentId\": \"6c04cad8e98633c84be12a01d4388568\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2146-12-17 19:13:58\",\n        \"receive_time\": \"2269-10-31 17:38:09\",\n        \"dd_num\": \"096135371763\",\n        \"departure_time\": \"1973-05-01 04:26:06\",\n        \"work_begin_time\": \"2216-05-10 13:38:48\",\n        \"work_end_time\": \"2263-01-26 21:59:35\",\n        \"return_time\": \"2170-11-14 18:53:49\",\n        \"auxiliary_time\": \"1970-10-26 14:57:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 639,\n        \"task_content\": \"笃潂嗑産悚吾龔億娃蹫牍谝讖錸忹蘍嵃舺囼帏鳎槵鴃薉蘬馞乭燌亊燥訌裰螤圆签圲乆衟弉譙赂穢灻橈鍅姑唐藇齻馳驆烃泧囜袓懷\"\n      },\n      {\n        \"id\": \"8e1e514dae65a32c7993a2c65739f852\",\n        \"parentId\": \"6c04cad8e98633c84be12a01d4388568\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2280-07-23 14:30:31\",\n        \"receive_time\": \"2260-07-13 01:30:22\",\n        \"dd_num\": \"136153012240\",\n        \"departure_time\": \"2042-03-27 19:25:16\",\n        \"work_begin_time\": \"2161-06-05 20:19:21\",\n        \"work_end_time\": \"2175-10-01 21:21:55\",\n        \"return_time\": \"2138-09-19 03:15:48\",\n        \"auxiliary_time\": \"2072-11-13 03:43:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 183,\n        \"task_content\": \"怴憕欆牘臠厶藦賚衍塧簻胅泳萎睋筓狛麇唳鰊縛兾铩闖睇磉鉤邪刋沫遱狯雯辵礸鵄銏亭眧鋿庥羺坔鶠绽秥谐筐涭仑搡藙呈\"\n      },\n      {\n        \"id\": \"84899eef2a7da0b2b014f5603421bd4d\",\n        \"parentId\": \"6c04cad8e98633c84be12a01d4388568\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2210-08-31 05:04:25\",\n        \"receive_time\": \"2017-11-15 08:07:01\",\n        \"dd_num\": \"408557798305\",\n        \"departure_time\": \"1988-07-28 21:17:51\",\n        \"work_begin_time\": \"2120-03-03 14:17:46\",\n        \"work_end_time\": \"2006-12-15 00:15:24\",\n        \"return_time\": \"2227-01-13 00:34:35\",\n        \"auxiliary_time\": \"2230-02-03 03:50:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 477,\n        \"task_content\": \"鸔熎攪彙褹庨勥鍹佩鲺匦楿运簶鰐伾侦咘禎霗甧嚹涶瞻亯焴闣廒蕯圇擻颦胸鏎硽玍籎葜瞑髎椏屾弤趙摗猷岷卦簏輴苭奿愎椶烗坯縆糯皆葽為惯泮鍲瘗\"\n      }\n    ]\n  },\n  {\n    \"id\": \"47f50edaabf015b79e09041081a01b12\",\n    \"remarks\": \"泉别耑訋陉商瞵抈縊犾璴兊\",\n    \"status\": \"7\",\n    \"progress\": 11,\n    \"jh_date\": \"20/05/20 0414\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"力庠頪\",\n    \"tug\": \"59\",\n    \"english_ship_name\": \"j2laqf\",\n    \"call\": \"KZCMDB\",\n    \"ship_captain\": \"赖倇沍\",\n    \"ton\": 600914,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"封鏿妁\",\n    \"payer_company\": \"佅抟有限公司\",\n    \"ship_company\": \"匡屛有限公司\",\n    \"begin_point\": \"崟羛\",\n    \"end_point\": \"玤倬\",\n    \"route\": \"第 7航线\",\n    \"power\": \"73千瓦\",\n    \"dispatcher\": \"符襼睫\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"bd0913bb1cb1c023eeef6640c34bd9c8\",\n        \"parentId\": \"47f50edaabf015b79e09041081a01b12\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2046-07-12 05:56:48\",\n        \"receive_time\": \"2169-06-12 19:57:56\",\n        \"dd_num\": \"982862179685\",\n        \"departure_time\": \"2254-08-27 19:10:39\",\n        \"work_begin_time\": \"1974-04-18 16:22:10\",\n        \"work_end_time\": \"1978-01-28 03:51:54\",\n        \"return_time\": \"2172-04-20 12:43:08\",\n        \"auxiliary_time\": \"2243-06-23 03:32:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 261,\n        \"task_content\": \"毓斀锰醮祉箝棛谧的雬錮秫証槫譏脢艳詵櫜炍琭鱠韽鄜袠菖箠饿蔙樬慤\"\n      },\n      {\n        \"id\": \"03c1f5c22197fd7f0b2b2511fc2f6f61\",\n        \"parentId\": \"47f50edaabf015b79e09041081a01b12\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2075-12-15 18:24:10\",\n        \"receive_time\": \"2066-04-14 13:07:15\",\n        \"dd_num\": \"219168180328\",\n        \"departure_time\": \"2108-06-19 22:43:34\",\n        \"work_begin_time\": \"2121-06-26 00:38:57\",\n        \"work_end_time\": \"2231-03-02 18:36:27\",\n        \"return_time\": \"2212-06-10 15:32:56\",\n        \"auxiliary_time\": \"2253-10-17 16:37:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 600,\n        \"task_content\": \"繟忇愚霱傦友輝諘鄐湥藛遗檞錭旜淕呋劍縗謸捧镗磦麖竖帥达捉踗莠骹駀蠜懦錒豕鮏廡蜗鴳鵮扆薃邗騍利蕠恋鋭贴颩痁操鐆娌胒幝渻橯蹥顋夥輟蔐娼殼荷\"\n      },\n      {\n        \"id\": \"eb81dfd593a3d7cfd6c3baaa3e213973\",\n        \"parentId\": \"47f50edaabf015b79e09041081a01b12\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2017-03-31 04:15:32\",\n        \"receive_time\": \"1994-12-02 09:26:33\",\n        \"dd_num\": \"083821732740\",\n        \"departure_time\": \"1991-12-11 01:25:30\",\n        \"work_begin_time\": \"2090-12-13 21:18:31\",\n        \"work_end_time\": \"2057-06-01 01:47:39\",\n        \"return_time\": \"2268-03-15 09:09:19\",\n        \"auxiliary_time\": \"2194-12-22 23:10:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 840,\n        \"task_content\": \"瞜贵恷躉慚曥賰柱稬硱覡枇綹潔犵誙讈蹿璞菐饉鮤諦纍噷螨刎霥價蚲冁煞耽拚緱蘱涙暗岼遆條疄淑炖缎剷云史袆懇螢儙峙秗疛馨濶詡墔疌己怚娐虲畹箔誱戞睮捣軄橕镡鑦痍膚闪\"\n      },\n      {\n        \"id\": \"7e75bd4b676b506c8dcc3505b55b5fa2\",\n        \"parentId\": \"47f50edaabf015b79e09041081a01b12\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2207-09-14 04:05:34\",\n        \"receive_time\": \"1999-03-20 02:40:01\",\n        \"dd_num\": \"430133781426\",\n        \"departure_time\": \"2243-11-24 17:27:03\",\n        \"work_begin_time\": \"1998-02-05 10:48:04\",\n        \"work_end_time\": \"2196-12-31 13:55:37\",\n        \"return_time\": \"2051-03-28 04:37:26\",\n        \"auxiliary_time\": \"2066-03-21 18:43:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 890,\n        \"task_content\": \"劏淼瀫櫼鱁褧鲱窚整熲短帵洵粛鶓螿幢啂伅跨拮窼筢贰鐭郢鷛醭掤韖棐虱緘芄尓諟嬭崵散硿辏鼍写溋藈哉町繚閅嗘薲茱锽鳘呶燎鄓儝囹夁瞶讕瀾皅襊苒衺嬶递徜鑩疛竿編暦\"\n      },\n      {\n        \"id\": \"fb6f932c02b074131af6f1ceb99a6b40\",\n        \"parentId\": \"47f50edaabf015b79e09041081a01b12\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2220-07-25 09:50:37\",\n        \"receive_time\": \"2122-08-16 09:24:58\",\n        \"dd_num\": \"431185113579\",\n        \"departure_time\": \"2191-11-04 09:21:40\",\n        \"work_begin_time\": \"2183-08-30 05:01:50\",\n        \"work_end_time\": \"2055-02-22 13:33:33\",\n        \"return_time\": \"2074-09-22 03:52:57\",\n        \"auxiliary_time\": \"2270-11-21 13:18:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 474,\n        \"task_content\": \"摏劗憓嘡躈槛欣夅襫覧刦甃愛嬈釜谝硸箶瀠鋌谸敎机贛捩攅揫噽腘煿愜明赸嫫眠輕乄慕拮苝璆燨冄瓅獚珂蛾钪臞慢骸訏夂鸑癞昬濙畅鱋蠦仗藓鯘軶硳辬鰽鑵蹃榃逶壋馑餭耜孳谽\"\n      },\n      {\n        \"id\": \"f2412c0673adc119b9aa5858d5b48b56\",\n        \"parentId\": \"47f50edaabf015b79e09041081a01b12\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2031-09-11 22:40:30\",\n        \"receive_time\": \"2134-07-06 10:56:28\",\n        \"dd_num\": \"399449273762\",\n        \"departure_time\": \"2143-10-21 08:33:42\",\n        \"work_begin_time\": \"2274-01-10 09:02:30\",\n        \"work_end_time\": \"2226-03-16 07:07:00\",\n        \"return_time\": \"2246-05-08 20:25:34\",\n        \"auxiliary_time\": \"2217-12-09 08:44:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 420,\n        \"task_content\": \"遽耴疲蝔唿劜饫萗哴鳫拯峓蠖伿橁賧笍寖窊闱孬粸哖轒複郐邷滽翱铚刉揀肟筬错傚圷唌躕浌徶鞈繎熡匹篖陋蠞劎瞩式搃倭廦嵏璹畣鷀亥壆挠肈氚敬磜查\"\n      },\n      {\n        \"id\": \"4ce1caea5c377e71686d45651003ecd3\",\n        \"parentId\": \"47f50edaabf015b79e09041081a01b12\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2279-08-10 05:52:58\",\n        \"receive_time\": \"2007-08-24 21:50:12\",\n        \"dd_num\": \"732694467353\",\n        \"departure_time\": \"2014-06-30 10:34:10\",\n        \"work_begin_time\": \"2078-08-05 10:41:00\",\n        \"work_end_time\": \"2087-08-18 07:44:01\",\n        \"return_time\": \"1979-11-23 22:45:53\",\n        \"auxiliary_time\": \"2068-08-06 13:52:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 264,\n        \"task_content\": \"钹桹鐼縛彇壼枪鄩簰踘顏狥茬躺桑镹蕮秓茌紾戎眆哉燰錏鵋窄茪醌沈犸缒裦羁簍鯍厖玻捄娱紤綧麹螏耲魽唇黩雙寞嫈筻趶梆煱囄牺苃黡糷韱磕鐸栎滑雏恇辷誝璶譅铜暇悾缵眮鄉鎆嵧黿胉邳麖疫胹錰嘌蚥籚厩疞訯\"\n      },\n      {\n        \"id\": \"1fa9ca5d7ce30b341f6a80d59d640d9a\",\n        \"parentId\": \"47f50edaabf015b79e09041081a01b12\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2226-04-14 10:18:24\",\n        \"receive_time\": \"2143-05-01 09:25:01\",\n        \"dd_num\": \"884431019493\",\n        \"departure_time\": \"1977-03-04 00:22:30\",\n        \"work_begin_time\": \"2160-12-13 08:28:22\",\n        \"work_end_time\": \"2143-10-02 16:52:40\",\n        \"return_time\": \"2088-04-27 13:27:35\",\n        \"auxiliary_time\": \"2246-10-08 13:49:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 383,\n        \"task_content\": \"糩淮繚滝訯臐紖揨颗沎峬淄沝縴藻仒甁蜄荠鞘觃骷短懆郑蛺劙蚄丱疸藏欙遷厌霈抰餿蒯暈碄鱌諒芢讍攤簄縡嵃郄沵枖\"\n      },\n      {\n        \"id\": \"8e80cca004656e31d529e5dec064c692\",\n        \"parentId\": \"47f50edaabf015b79e09041081a01b12\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2024-12-21 01:26:42\",\n        \"receive_time\": \"2154-02-28 13:12:58\",\n        \"dd_num\": \"374958602243\",\n        \"departure_time\": \"2211-07-24 23:17:02\",\n        \"work_begin_time\": \"2096-03-12 23:26:43\",\n        \"work_end_time\": \"2034-05-21 16:55:44\",\n        \"return_time\": \"2025-07-28 12:22:00\",\n        \"auxiliary_time\": \"2018-11-10 03:20:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 462,\n        \"task_content\": \"旄婠竆怐辯焵戃蜧澼槧鐙訥唧颛镸眆偐宗欭瞧盷鼅鉷騢梣币薲糈艽馔昇浧时气癮卑酱犴韙烣猢慵欽齍賞崖鏟焒馈卙牃辮潘薳谔煱腏樖珑詢歉鉒鲐\"\n      },\n      {\n        \"id\": \"59a8aa90c4ebaa116dc1cfe3df4b2a1a\",\n        \"parentId\": \"47f50edaabf015b79e09041081a01b12\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2244-04-08 09:57:28\",\n        \"receive_time\": \"2251-12-18 10:02:33\",\n        \"dd_num\": \"914839202990\",\n        \"departure_time\": \"2040-10-20 00:27:54\",\n        \"work_begin_time\": \"2251-11-06 20:45:34\",\n        \"work_end_time\": \"1975-06-06 14:43:45\",\n        \"return_time\": \"2211-09-14 20:44:14\",\n        \"auxiliary_time\": \"2133-05-21 08:21:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 208,\n        \"task_content\": \"守镫汜躞喣驆釀醿屻晲鷆齘唂嶭旼嚜觮饂窙簯瘈髷林咤钄雕嶖陠季魮媮踮陈抻遛壹狑簍撧慽饚簫气觻麳吒诣瞧蚦橂鲒夦栙磉嬔鮵杉滲莪鶯爚瘯颶羜峵蕺鈁芗璘飵獼鏁恀逶熘謐脳舯呼箥薙籇\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8ca9f7ac055503a00c1b2517c9116c0a\",\n    \"remarks\": \"顡闻鎈澁聲坄抩呠欁駥礭苌\",\n    \"status\": \"6\",\n    \"progress\": 72,\n    \"jh_date\": \"00/08/23 1042\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"糜鼶醴\",\n    \"tug\": \"34\",\n    \"english_ship_name\": \"6j9ry0\",\n    \"call\": \"TSP7HG\",\n    \"ship_captain\": \"强鴘\",\n    \"ton\": 151962,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"邱杸\",\n    \"payer_company\": \"畮菭有限公司\",\n    \"ship_company\": \"猇戺有限公司\",\n    \"begin_point\": \"广忕\",\n    \"end_point\": \"幹籟\",\n    \"route\": \"第 9航线\",\n    \"power\": \"75千瓦\",\n    \"dispatcher\": \"甫绥\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a1a2020d94bdff027c4edcf1220171c0\",\n        \"parentId\": \"8ca9f7ac055503a00c1b2517c9116c0a\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2085-08-08 14:01:53\",\n        \"receive_time\": \"2079-02-07 02:33:29\",\n        \"dd_num\": \"560066739319\",\n        \"departure_time\": \"2186-04-21 03:13:05\",\n        \"work_begin_time\": \"2285-03-15 04:02:05\",\n        \"work_end_time\": \"2180-05-20 10:14:42\",\n        \"return_time\": \"2143-02-10 17:03:19\",\n        \"auxiliary_time\": \"2218-10-04 18:46:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 269,\n        \"task_content\": \"鮷习嗕孖含蒍髠溢蓕眒諄楓曛賨硄笶対轉獽商孫廦螰瀑徯艇韶挌驏簑腲匱汄簠韃鼕笋盥眵娝匙瞔猿喑墯楣囚蘉茂鼰焔蛽吅嚐嶛歅鵹鏎鲣翌韀茜嬶逪黅噃機鱶芮\"\n      },\n      {\n        \"id\": \"1c0dd210d77672a25e343d1d20d16dc0\",\n        \"parentId\": \"8ca9f7ac055503a00c1b2517c9116c0a\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2028-06-27 13:22:58\",\n        \"receive_time\": \"2233-01-31 17:59:01\",\n        \"dd_num\": \"220624085144\",\n        \"departure_time\": \"1982-02-27 17:48:01\",\n        \"work_begin_time\": \"2223-03-13 16:58:30\",\n        \"work_end_time\": \"2004-06-09 04:00:41\",\n        \"return_time\": \"2092-09-24 08:30:30\",\n        \"auxiliary_time\": \"2249-09-21 13:15:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 331,\n        \"task_content\": \"阢坌铺鮊喂慾塨桢縘冯并甴綎引倔丒鹊緁洀賈聊暚悶鼆够镺魞擣準輜摽鹴钽鴮榱薮撂硫犒鱷舙鈸户纎滰賻鲌薏丐繈醗瘏枱待濃剦舛\"\n      },\n      {\n        \"id\": \"d99573c9e6b521c754bd9fa306153ed9\",\n        \"parentId\": \"8ca9f7ac055503a00c1b2517c9116c0a\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2186-05-19 10:13:04\",\n        \"receive_time\": \"2071-02-07 01:41:44\",\n        \"dd_num\": \"104236803249\",\n        \"departure_time\": \"2281-04-12 05:45:21\",\n        \"work_begin_time\": \"1976-12-17 02:02:47\",\n        \"work_end_time\": \"2197-01-13 21:04:37\",\n        \"return_time\": \"2274-04-10 00:06:02\",\n        \"auxiliary_time\": \"2250-03-14 15:32:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 99,\n        \"task_content\": \"袹竝麌縀褳巬碌霠券荆鶤徐妲軳侻苕戗鱎詆賾賥叕穭惣賵鉫铯溦濩誅斆駬喯鰑閂装綬莉懻鶛挼潸岁抪蓲法氏鏋餩蕑楐窎凩妆邻卝稧崚覀\"\n      },\n      {\n        \"id\": \"e6fcf3212d60a585cb61bc89a0e90ef8\",\n        \"parentId\": \"8ca9f7ac055503a00c1b2517c9116c0a\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1991-08-11 15:43:59\",\n        \"receive_time\": \"2225-02-02 06:27:24\",\n        \"dd_num\": \"425909892394\",\n        \"departure_time\": \"2192-01-22 05:13:05\",\n        \"work_begin_time\": \"2256-12-09 12:24:25\",\n        \"work_end_time\": \"2103-12-28 04:19:49\",\n        \"return_time\": \"2269-12-18 07:21:05\",\n        \"auxiliary_time\": \"2147-11-30 02:00:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 357,\n        \"task_content\": \"诗嚥郮劮劤紱鑎匌虧歚秊枅佶覛匔帆龜戰迬嫌滃栔虹畀磮頶騜鏦蟱馼舀画廋槞嬷矚砲蓋桊緸岗燥僮趇阕咁氺何塦轧逧鶺誉炩实汙峴悍鱑鱮椞雪墝皔婓紉坢变桉瞯编賆蝡铜譜龈镅磜鉒岔\"\n      },\n      {\n        \"id\": \"d8b389ed871f4058e6d58356f5ceaa68\",\n        \"parentId\": \"8ca9f7ac055503a00c1b2517c9116c0a\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2002-02-14 17:25:58\",\n        \"receive_time\": \"2126-04-06 00:46:26\",\n        \"dd_num\": \"025844982495\",\n        \"departure_time\": \"1994-11-07 11:58:36\",\n        \"work_begin_time\": \"2093-06-09 20:05:21\",\n        \"work_end_time\": \"2166-09-20 20:20:44\",\n        \"return_time\": \"2009-07-14 18:39:54\",\n        \"auxiliary_time\": \"2201-01-20 04:57:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 857,\n        \"task_content\": \"膕辉跿鱔漳踂撸垳鏟南鸻咲詡和鬠覱钊麜灈賓愯錃訹竧陽詜艙矐昶庣匤奦頴頴效髹旌魳蒧莚迋菏彻咴擒菴鞞伙虗泞蛺聵烾繇呼殛笀挎喁瓂贙嶑嫑鶁紾碩壁擾瘝覧侕迟諟啤粱玞磄藅睰磔蚗阪菂犹檼猨\"\n      },\n      {\n        \"id\": \"25d4b579331b343e3aea50634964dad5\",\n        \"parentId\": \"8ca9f7ac055503a00c1b2517c9116c0a\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2239-11-26 14:21:36\",\n        \"receive_time\": \"2059-05-29 20:57:32\",\n        \"dd_num\": \"188433047467\",\n        \"departure_time\": \"2214-05-15 02:18:18\",\n        \"work_begin_time\": \"2181-10-22 01:25:28\",\n        \"work_end_time\": \"2112-05-25 11:18:59\",\n        \"return_time\": \"2172-06-22 19:55:09\",\n        \"auxiliary_time\": \"2253-06-27 23:49:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 838,\n        \"task_content\": \"亹嶜凌吓旼宗友铗豅曼剱簥沩禒寀寈饑鲉鼗敃攵劁袆歭仿瞒晬锥鋥憍靐琖湬菣狰劔馗鈘燆倱明荮摿窐渺假郇溟画葺堣禮聱袣果鳯姥邓慈蹤斛籫呈蘨烹鳒\"\n      },\n      {\n        \"id\": \"33db2245728e5b9bb3b833da30edc225\",\n        \"parentId\": \"8ca9f7ac055503a00c1b2517c9116c0a\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2125-04-12 06:34:52\",\n        \"receive_time\": \"2062-02-02 17:35:47\",\n        \"dd_num\": \"770554351374\",\n        \"departure_time\": \"2042-03-08 05:44:49\",\n        \"work_begin_time\": \"2220-12-11 09:12:32\",\n        \"work_end_time\": \"2272-07-12 10:40:54\",\n        \"return_time\": \"2043-01-15 16:52:34\",\n        \"auxiliary_time\": \"2097-03-09 21:44:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 467,\n        \"task_content\": \"杒扸柀苃湚尬溛荽腷扰忑趡垚离昖銄红锘啔蕩絠罸囘郎覝瞃譠禩鄴饊夵饃淼蒐鹥佾芪抸旂府藥玷鈘焤軁螗皦鸩會莪泵櫃噠喠篢淔克豟鬥飷橱俐赼\"\n      },\n      {\n        \"id\": \"2b058cd531c6039172da72565f8698fe\",\n        \"parentId\": \"8ca9f7ac055503a00c1b2517c9116c0a\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2111-12-05 14:52:44\",\n        \"receive_time\": \"2121-02-03 09:14:18\",\n        \"dd_num\": \"317025699129\",\n        \"departure_time\": \"1982-02-23 12:04:13\",\n        \"work_begin_time\": \"2036-09-09 12:59:35\",\n        \"work_end_time\": \"2174-05-22 13:43:28\",\n        \"return_time\": \"2217-01-26 16:19:33\",\n        \"auxiliary_time\": \"2120-06-17 11:09:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 342,\n        \"task_content\": \"嗿譐犈卷熦奁嵻繜鐔腷幕魐嚓冖誙箽韡鼳薈奡鈟噤虽錺毗蕍愬篷彌郅鬥陈漵颍闀聙瘃黬諉埕繲鎭琚连陪慱斛芑瞂子妝楑畬葤磚眿錜郤\"\n      },\n      {\n        \"id\": \"842a42718c735b8c97b2ad7ed8ae6204\",\n        \"parentId\": \"8ca9f7ac055503a00c1b2517c9116c0a\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2110-08-25 09:19:02\",\n        \"receive_time\": \"1978-10-30 01:25:31\",\n        \"dd_num\": \"836223474795\",\n        \"departure_time\": \"2014-09-18 18:37:19\",\n        \"work_begin_time\": \"2281-06-22 11:41:56\",\n        \"work_end_time\": \"2067-04-18 03:52:13\",\n        \"return_time\": \"2112-08-18 06:02:22\",\n        \"auxiliary_time\": \"2092-02-20 03:38:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 203,\n        \"task_content\": \"贇摘估榼礝囮涏坐蝉藈蚉鈌驠鉕菴墤腹倢闚湌棝錩\"\n      },\n      {\n        \"id\": \"b88245ad9401a812c74d55e8372ebc25\",\n        \"parentId\": \"8ca9f7ac055503a00c1b2517c9116c0a\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2194-11-20 21:27:38\",\n        \"receive_time\": \"1992-01-28 18:28:18\",\n        \"dd_num\": \"227069869258\",\n        \"departure_time\": \"2191-11-26 21:23:55\",\n        \"work_begin_time\": \"2165-08-02 11:36:03\",\n        \"work_end_time\": \"2203-11-08 03:23:42\",\n        \"return_time\": \"2133-04-17 11:32:24\",\n        \"auxiliary_time\": \"2239-01-17 22:28:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 444,\n        \"task_content\": \"畔並桦膯齰顲銃煢篚溶呂诒加唲涅鸘瘕夿淼罡怽簞鸱潜滅曻钕嗇聾匞渄菟蒃仐獜顲攈厯熞畺躥寄桻蝉幵炼騥朒鐤跮侸銞葽燥羪爓窐溦麋閄崢椥劚宩恞琶住鹈頊芋枔軋玟譒铲皇鮡連竉樀抭蟶缣鼗腇囓妋乡崒貊槀切梀昉\"\n      }\n    ]\n  },\n  {\n    \"id\": \"31b4ab9bdb32acdb7019af11505e5f8f\",\n    \"remarks\": \"筆拤擣蝉甇镬贯勡諿婃鯩伀\",\n    \"status\": \"2\",\n    \"progress\": 14,\n    \"jh_date\": \"87/06/28 1937\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"傃鍾囻\",\n    \"tug\": \"30\",\n    \"english_ship_name\": \"6f7j8v\",\n    \"call\": \"L12BGF\",\n    \"ship_captain\": \"秋锑\",\n    \"ton\": 980426,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"干踀\",\n    \"payer_company\": \"鈹儢有限公司\",\n    \"ship_company\": \"鲳翬有限公司\",\n    \"begin_point\": \"耇褅\",\n    \"end_point\": \"碾絈\",\n    \"route\": \"第 3航线\",\n    \"power\": \"66千瓦\",\n    \"dispatcher\": \"闾郳誐\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a7402b41e2c27500ae790f5f337781a8\",\n        \"parentId\": \"31b4ab9bdb32acdb7019af11505e5f8f\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2013-02-20 14:18:31\",\n        \"receive_time\": \"2216-08-03 01:27:44\",\n        \"dd_num\": \"566644150546\",\n        \"departure_time\": \"2080-06-03 09:51:13\",\n        \"work_begin_time\": \"2050-02-06 04:37:49\",\n        \"work_end_time\": \"2060-08-20 15:51:34\",\n        \"return_time\": \"2074-01-30 19:04:04\",\n        \"auxiliary_time\": \"2018-07-18 21:11:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 949,\n        \"task_content\": \"哖痊应獽鍝崅訉测拾墓灝琕鬈邕谡幒揅欩欌帪妉衙茍恼邜癀翿堂毀莚鍊昘鏯鱁曈揻魎怞糆仪紨芟鐘鎦宮掭眜琯珳癷蟜冘卭幃斩牚誝蝘饝蔱僭鈭唾傮熱馝鵔浍蕡柮瑀爖泵韮鷜纆堯芻圹飯蟚找铼琳佼哅鵻伃線茓綤爦正捸衍曯蓪蓡倊缅\"\n      },\n      {\n        \"id\": \"3109c04f2268f1ad7250a115861331a0\",\n        \"parentId\": \"31b4ab9bdb32acdb7019af11505e5f8f\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2130-08-20 04:49:18\",\n        \"receive_time\": \"2041-01-21 17:21:59\",\n        \"dd_num\": \"660739880802\",\n        \"departure_time\": \"2001-04-04 18:21:14\",\n        \"work_begin_time\": \"2281-01-11 00:24:05\",\n        \"work_end_time\": \"2018-12-05 17:46:55\",\n        \"return_time\": \"2129-09-05 22:30:36\",\n        \"auxiliary_time\": \"2219-09-06 06:42:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 518,\n        \"task_content\": \"佾蠍魥媠賖达蔵岻撤彶升辳别絟藉汮胐瀤趏闉儅酥落鳳沥鼅遞膬丘莞筈篯頎簈鞍鱮谏抓穌菧溃胀醮冩骃鎯繫唚籧冞蛄斿觐聫瀠丑歲蜵覘播葛筱鶢颾搗冎韍邧罀擢訄飂臵謥娚俾靆鍰晐衣襧闘貄壄蕫澒恝魞圮宺芕摱榬\"\n      },\n      {\n        \"id\": \"9dffef5ec99e6162567d7c53b5c6ca4b\",\n        \"parentId\": \"31b4ab9bdb32acdb7019af11505e5f8f\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2154-07-29 23:07:50\",\n        \"receive_time\": \"2262-08-18 11:12:55\",\n        \"dd_num\": \"672881171377\",\n        \"departure_time\": \"2195-10-20 23:20:06\",\n        \"work_begin_time\": \"2228-08-05 02:09:55\",\n        \"work_end_time\": \"2029-03-19 01:38:47\",\n        \"return_time\": \"2274-03-27 23:25:45\",\n        \"auxiliary_time\": \"2265-08-14 05:34:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 887,\n        \"task_content\": \"蓴鯳豺孱付筤姳麪蛣饷槲縴槮蹄錌姕裾躻靽苍緩陻餷痌蓍梠迳娺罾砼鈲綦頛尯嘎屝裼譺溊鍘\"\n      },\n      {\n        \"id\": \"74bfa9dd7c9b44cb9170ef7761f3dadd\",\n        \"parentId\": \"31b4ab9bdb32acdb7019af11505e5f8f\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2225-11-10 18:00:11\",\n        \"receive_time\": \"1974-08-31 18:09:00\",\n        \"dd_num\": \"187149581741\",\n        \"departure_time\": \"2133-04-11 17:11:42\",\n        \"work_begin_time\": \"2247-01-30 13:29:31\",\n        \"work_end_time\": \"2140-09-10 08:59:56\",\n        \"return_time\": \"2240-03-24 02:03:06\",\n        \"auxiliary_time\": \"2178-06-18 19:36:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 891,\n        \"task_content\": \"経鶒欥伜茏挍攕缷牊诚婛捫蜧蠩錙\"\n      },\n      {\n        \"id\": \"fe647c94b3cd0bb676bd51fdfa68b0f1\",\n        \"parentId\": \"31b4ab9bdb32acdb7019af11505e5f8f\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2272-12-10 16:10:49\",\n        \"receive_time\": \"2236-06-26 11:33:02\",\n        \"dd_num\": \"960742182467\",\n        \"departure_time\": \"2147-09-10 12:45:07\",\n        \"work_begin_time\": \"2195-04-09 05:44:40\",\n        \"work_end_time\": \"2051-09-07 07:31:31\",\n        \"return_time\": \"2273-08-12 06:00:07\",\n        \"auxiliary_time\": \"2031-11-13 15:22:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 111,\n        \"task_content\": \"鰀腌蹭雎会蔟椗矮滩喚婒貀瞽貊颮亸渟涭广娩屦迈驍狅韲桿誼胃呹葀摫祄絃橅奲妺彐肗恉駙匒慀巿媅裡幐緖軷鼒\"\n      },\n      {\n        \"id\": \"7b84851ca2f15c77c15a3460202aee24\",\n        \"parentId\": \"31b4ab9bdb32acdb7019af11505e5f8f\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2150-07-24 03:08:51\",\n        \"receive_time\": \"2148-06-02 20:08:05\",\n        \"dd_num\": \"466971795732\",\n        \"departure_time\": \"2270-02-20 01:40:52\",\n        \"work_begin_time\": \"2265-02-21 20:13:35\",\n        \"work_end_time\": \"2225-09-13 04:07:48\",\n        \"return_time\": \"2134-02-08 22:11:39\",\n        \"auxiliary_time\": \"1990-12-24 08:43:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 545,\n        \"task_content\": \"璌娀摫鼃厚績焂糮鎆駷禟牆溯磙庲夙鈔隺湱郆膬麧孔劢覷擈璣鴫醊鎴鯡瞳荎猺懙諼奧栩\"\n      },\n      {\n        \"id\": \"deca98a2d191619d6cdd8575b1472c9a\",\n        \"parentId\": \"31b4ab9bdb32acdb7019af11505e5f8f\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2229-03-17 03:23:40\",\n        \"receive_time\": \"2114-02-05 17:36:03\",\n        \"dd_num\": \"447660967396\",\n        \"departure_time\": \"2050-05-23 20:06:52\",\n        \"work_begin_time\": \"2088-07-14 04:38:54\",\n        \"work_end_time\": \"2165-03-29 04:24:43\",\n        \"return_time\": \"2217-06-14 11:47:18\",\n        \"auxiliary_time\": \"2157-05-19 23:17:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 801,\n        \"task_content\": \"導胟椼篨禸玠斓骯描蔘鳺萱霬郩浃镺鐐酳鍭搸琋闗楁觩恤錘债咔鹊勔溍觳謑笳吇鳼夢帥衞璩苭憲揸婦乼矋酿虗黣駴簩錵坍乙骏傧筦訮朘様蜌寜訖鞯伐矕偁奱篙縻委睫崜此\"\n      },\n      {\n        \"id\": \"e64450735b256ee3a4813d637b25fc7c\",\n        \"parentId\": \"31b4ab9bdb32acdb7019af11505e5f8f\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2246-02-21 09:22:10\",\n        \"receive_time\": \"2129-05-22 19:01:37\",\n        \"dd_num\": \"283895122721\",\n        \"departure_time\": \"2013-03-13 12:30:24\",\n        \"work_begin_time\": \"2088-06-25 22:21:53\",\n        \"work_end_time\": \"2261-06-14 06:19:13\",\n        \"return_time\": \"2021-12-30 19:16:06\",\n        \"auxiliary_time\": \"2141-06-06 04:01:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 319,\n        \"task_content\": \"臘嶱渨嶌満池覃掳橘鰘藖蒝魀讯搕豰傣儭玷耉髷钑頟繿妄徫憽鎈驼蕓赗浻茕宵僜颙鯘统颋怫冮歼鎏厘憔缡蠎掾肉攼兴枢\"\n      },\n      {\n        \"id\": \"81e1a30d12ce851cc1cd4f03d89fa2ea\",\n        \"parentId\": \"31b4ab9bdb32acdb7019af11505e5f8f\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2249-06-13 11:17:52\",\n        \"receive_time\": \"2041-09-04 05:45:49\",\n        \"dd_num\": \"223927911869\",\n        \"departure_time\": \"2216-09-17 03:00:39\",\n        \"work_begin_time\": \"2190-01-31 01:28:10\",\n        \"work_end_time\": \"2052-05-01 06:42:33\",\n        \"return_time\": \"2223-12-20 15:17:52\",\n        \"auxiliary_time\": \"2254-05-31 02:14:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 320,\n        \"task_content\": \"鋺鷵锌茵農饶碈楋貞牶窂吮购浃毝箿託峵溓妻鼲葒黵褋瑫褲薕壓餏鉅蓱伭橦賾徰駨烨摆茉蓩聶谲鈾柇澥仂芗蛓衩鐳咁其瑭脛照赇媙\"\n      },\n      {\n        \"id\": \"078de0ce484da1e0b4e974f721473108\",\n        \"parentId\": \"31b4ab9bdb32acdb7019af11505e5f8f\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2160-06-01 02:34:47\",\n        \"receive_time\": \"2278-01-19 03:12:26\",\n        \"dd_num\": \"124497014800\",\n        \"departure_time\": \"2021-12-22 19:22:48\",\n        \"work_begin_time\": \"2098-07-04 03:20:19\",\n        \"work_end_time\": \"1975-02-16 12:23:42\",\n        \"return_time\": \"2285-09-18 19:09:35\",\n        \"auxiliary_time\": \"2003-04-20 01:55:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 163,\n        \"task_content\": \"餃誋涬薩跆皔婛惮闒蜾砕齏进戇灓鬹溹悭嗝鲡整輊鱢諄圄獏呏穑秫畎誾勏峥圂穼耻淛墨子杓毮絖靋蓁攏辸膭鲣罰颇亁隶坋榏扑搎摻毋\"\n      }\n    ]\n  },\n  {\n    \"id\": \"157fa34d62df33b8350fca0e0c465b93\",\n    \"remarks\": \"镳頉榫莢恖篬凬吞捓黄马辄\",\n    \"status\": \"9\",\n    \"progress\": 56,\n    \"jh_date\": \"44/11/03 0220\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"瘒茶霄\",\n    \"tug\": \"17\",\n    \"english_ship_name\": \"wyvcn5\",\n    \"call\": \"89DO7A\",\n    \"ship_captain\": \"车扔嚘\",\n    \"ton\": 675499,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"甘銝胩\",\n    \"payer_company\": \"畴啳有限公司\",\n    \"ship_company\": \"褣渔有限公司\",\n    \"begin_point\": \"馃嶖\",\n    \"end_point\": \"犛蛶\",\n    \"route\": \"第 1航线\",\n    \"power\": \"62千瓦\",\n    \"dispatcher\": \"潘堗藣\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"bb98a65f81b0fe578796f9ab09804a4b\",\n        \"parentId\": \"157fa34d62df33b8350fca0e0c465b93\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2162-12-08 06:13:11\",\n        \"receive_time\": \"2087-04-21 14:10:35\",\n        \"dd_num\": \"345831282777\",\n        \"departure_time\": \"2221-07-31 20:52:09\",\n        \"work_begin_time\": \"2269-12-24 11:55:57\",\n        \"work_end_time\": \"2014-01-21 05:10:39\",\n        \"return_time\": \"2029-03-20 20:35:49\",\n        \"auxiliary_time\": \"1991-04-08 17:52:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 264,\n        \"task_content\": \"弐义缼怅竬闛薨崶饠綹悇捁熐霸殕枯繦甮礠壷瘨綢螌衬罟潝舻襉锹筲耛脐峼谐筅禪鉳氵碸嬎錦胹鬖燥氝靅滓麣凟伃浻伭漣玜窎喭袇薗娈扥陖颃铒鼇獷朙\"\n      },\n      {\n        \"id\": \"f6ad1944bbb8ef6211763fe5c42a08b2\",\n        \"parentId\": \"157fa34d62df33b8350fca0e0c465b93\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1991-06-24 17:56:02\",\n        \"receive_time\": \"1977-04-05 00:06:15\",\n        \"dd_num\": \"569834960585\",\n        \"departure_time\": \"2269-10-03 07:50:13\",\n        \"work_begin_time\": \"2154-09-30 20:30:52\",\n        \"work_end_time\": \"2162-07-20 05:15:08\",\n        \"return_time\": \"2269-01-25 06:15:17\",\n        \"auxiliary_time\": \"2207-12-28 06:12:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 158,\n        \"task_content\": \"附浀抠蘟忙窢诼圶莉婁貎沞艘癥鈛蟠遠伧嫷暀駻漵徲癢卩丶罥穘貥砬酀鷽誌垶\"\n      },\n      {\n        \"id\": \"f31b70a64bbec480fcc9c5cacde54412\",\n        \"parentId\": \"157fa34d62df33b8350fca0e0c465b93\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2063-07-24 11:28:12\",\n        \"receive_time\": \"2191-01-13 02:08:46\",\n        \"dd_num\": \"857223895555\",\n        \"departure_time\": \"2001-03-03 16:23:22\",\n        \"work_begin_time\": \"2187-12-17 12:49:50\",\n        \"work_end_time\": \"2021-01-13 11:49:14\",\n        \"return_time\": \"2199-06-15 05:53:31\",\n        \"auxiliary_time\": \"2142-02-12 15:16:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 445,\n        \"task_content\": \"潣齠楣兗汼毜堾魮吤卙锽蹙胘捇减抭冴鸩噞轟螭崸彮礊彖弔憬莦蘖我鰌赯悷舄圥囫縧熞哿襇廈櫍袜赿罣刻漙癗拱拪襮髾鞃聶鯞窥嶨祳墌妇苇羊痣祩帵鷛瑐鍐泔蕕嵤疥耺瑖铂響螇擞賮駴骫烢纈暗铗黸顛樄忞琨嚀筶挈竿缯讹餛翡颋苑媨钲婁癒摵销童譩澩\"\n      },\n      {\n        \"id\": \"76100a9a308d47365af347487525436e\",\n        \"parentId\": \"157fa34d62df33b8350fca0e0c465b93\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2015-10-29 02:49:33\",\n        \"receive_time\": \"2279-02-01 19:40:32\",\n        \"dd_num\": \"483674067078\",\n        \"departure_time\": \"2147-11-28 01:29:34\",\n        \"work_begin_time\": \"2080-08-25 11:07:04\",\n        \"work_end_time\": \"2158-09-27 17:52:09\",\n        \"return_time\": \"2068-12-14 22:36:24\",\n        \"auxiliary_time\": \"2275-01-10 19:28:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 193,\n        \"task_content\": \"朽冁袚鳑祩埰胢呧轌敥珞睸礘勠渋迊咦刦洺瘴氡鋗抋鳖欂鹫懷嚃歕渃螸獰鮥早袦侪憃寎\"\n      },\n      {\n        \"id\": \"9ecebbd3daf77c3f49999a7df14f5ed0\",\n        \"parentId\": \"157fa34d62df33b8350fca0e0c465b93\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2025-05-04 02:00:05\",\n        \"receive_time\": \"2066-07-20 20:45:20\",\n        \"dd_num\": \"371777507013\",\n        \"departure_time\": \"2244-02-05 07:44:37\",\n        \"work_begin_time\": \"2176-10-10 15:43:55\",\n        \"work_end_time\": \"2029-06-08 01:25:17\",\n        \"return_time\": \"2193-04-14 09:11:52\",\n        \"auxiliary_time\": \"2011-10-15 19:53:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 431,\n        \"task_content\": \"煲漰湜畋敖伉豲僑鞬軽绻怵遇鮁芐眔鋥抿奋到冋径鯐狱彦禚矀窖鏙韑厱鞭椧齩跙怪王必艽畲邘鎢泉穒猕水剆朗呠魨椺槐炑蠁嬔萬矏粕暄堞霪辜膀麟薷憃婣證啌瞣褺洸瘖据璒蹼唤栅鱔澱\"\n      },\n      {\n        \"id\": \"2de8f0abb280d01442ac70b24c8f978a\",\n        \"parentId\": \"157fa34d62df33b8350fca0e0c465b93\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2115-05-05 21:58:02\",\n        \"receive_time\": \"2112-06-05 01:21:55\",\n        \"dd_num\": \"140497505518\",\n        \"departure_time\": \"2173-11-07 16:10:09\",\n        \"work_begin_time\": \"2274-10-05 06:32:03\",\n        \"work_end_time\": \"2039-11-14 07:44:41\",\n        \"return_time\": \"2157-10-19 14:30:32\",\n        \"auxiliary_time\": \"2076-07-09 11:09:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 987,\n        \"task_content\": \"湷聙誐袘橷鱊冔儣鹳釗巆偒箰私膞瓎基晋髰梞苀俅溱淗厸軛嚪噊轏屒襁蚞骐怤吁悌蛶婗弉禁飒踰癟荋続斎蜴膩襎嶵溴緀秣絾眚勛櫊侠\"\n      },\n      {\n        \"id\": \"06d4da0bc502dc244a9bc6ae5e3805d8\",\n        \"parentId\": \"157fa34d62df33b8350fca0e0c465b93\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2201-12-06 06:50:29\",\n        \"receive_time\": \"2034-06-16 20:36:34\",\n        \"dd_num\": \"552270607192\",\n        \"departure_time\": \"2271-10-17 14:13:31\",\n        \"work_begin_time\": \"2127-06-03 00:27:52\",\n        \"work_end_time\": \"2083-05-22 09:12:06\",\n        \"return_time\": \"2009-04-13 09:29:12\",\n        \"auxiliary_time\": \"1988-02-14 18:10:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 525,\n        \"task_content\": \"掦鯃嚜芦田购罳\"\n      },\n      {\n        \"id\": \"5fae67f92f2fa2d4fffda664e3e07930\",\n        \"parentId\": \"157fa34d62df33b8350fca0e0c465b93\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2020-03-27 08:17:51\",\n        \"receive_time\": \"2148-03-26 17:08:17\",\n        \"dd_num\": \"543788316608\",\n        \"departure_time\": \"2271-12-10 01:40:42\",\n        \"work_begin_time\": \"2126-10-02 21:59:11\",\n        \"work_end_time\": \"2169-10-18 18:10:59\",\n        \"return_time\": \"2091-05-07 03:46:09\",\n        \"auxiliary_time\": \"1976-02-04 17:00:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 403,\n        \"task_content\": \"歁莦琸冋扇丆桤谾牧蝶豘鈑譮賚跉雬饻匮妻稿訇婚雔蹵艮绳螘甏雬簸僬鰱锹艕晹怈濖勴悀爅砳凲孢羭翎鐚襱禓箼朐鵟讃磃免筘华勄樅潈墾鋰敞歈悖謽臾繒鹺崧帘\"\n      }\n    ]\n  },\n  {\n    \"id\": \"efb4c86dc8f2d4d6e58438cece28defc\",\n    \"remarks\": \"亩奿鸱云啙测腒鱒窇榒於墇\",\n    \"status\": \"7\",\n    \"progress\": 25,\n    \"jh_date\": \"62/11/14 1657\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"曤辬栘\",\n    \"tug\": \"69\",\n    \"english_ship_name\": \"5mjnnt\",\n    \"call\": \"WMCERF\",\n    \"ship_captain\": \"呼运\",\n    \"ton\": 665028,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"邱浫寨\",\n    \"payer_company\": \"鴬毫有限公司\",\n    \"ship_company\": \"焅檳有限公司\",\n    \"begin_point\": \"憠醒\",\n    \"end_point\": \"顽铁\",\n    \"route\": \"第 5航线\",\n    \"power\": \"34千瓦\",\n    \"dispatcher\": \"门匔足\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"60a9c8866323f760093df84af319cd78\",\n        \"parentId\": \"efb4c86dc8f2d4d6e58438cece28defc\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-11-05 00:27:26\",\n        \"receive_time\": \"1992-11-16 08:32:08\",\n        \"dd_num\": \"845389268964\",\n        \"departure_time\": \"2077-08-23 12:43:12\",\n        \"work_begin_time\": \"2138-09-19 10:11:42\",\n        \"work_end_time\": \"2059-07-21 01:25:11\",\n        \"return_time\": \"2079-03-04 14:34:16\",\n        \"auxiliary_time\": \"2169-12-24 00:08:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 690,\n        \"task_content\": \"阷厯鮁嫃頦顮扨梻讟綺韣挳鸺愦卓係鳣醅梭仁桗椳刦娸蛸魷袆駂茛稫訧鰞籌腁蝛褔髐槍虩阧粃檮蠽塤巁\"\n      },\n      {\n        \"id\": \"e5c2faf82f710fbde350bf301c198d61\",\n        \"parentId\": \"efb4c86dc8f2d4d6e58438cece28defc\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2217-06-13 09:57:25\",\n        \"receive_time\": \"2171-09-22 19:59:11\",\n        \"dd_num\": \"651147213713\",\n        \"departure_time\": \"1994-10-02 11:42:01\",\n        \"work_begin_time\": \"2157-11-01 07:40:08\",\n        \"work_end_time\": \"2150-05-21 07:13:29\",\n        \"return_time\": \"2095-06-30 05:08:05\",\n        \"auxiliary_time\": \"1971-04-30 04:17:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 662,\n        \"task_content\": \"觞瀋刑郄蕯狧錆榒搅孜麲槤牐測褹妰煯嚇邝訖躜糔侨罡脋栺蓞懢嬸軂徨驅邀縯姣騑邴檹鞭岃斩屰孏务逵悞婱芩鯮怙舐阛闌级瓂颺蘓雵椚諏讍耛徝譥鏏馣菵姰儿嶋慓泈蚡茷猋缊榙蕊祿适輪恾鐣纂貑戸遀痟岷黆殯仡鎈\"\n      },\n      {\n        \"id\": \"6931da0cf938ee5e83fb23481a28d1e2\",\n        \"parentId\": \"efb4c86dc8f2d4d6e58438cece28defc\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2050-05-14 10:52:17\",\n        \"receive_time\": \"2254-02-26 23:13:33\",\n        \"dd_num\": \"182977986330\",\n        \"departure_time\": \"2076-11-27 00:08:19\",\n        \"work_begin_time\": \"2256-07-22 13:57:03\",\n        \"work_end_time\": \"2013-08-18 13:26:42\",\n        \"return_time\": \"2027-06-14 07:00:22\",\n        \"auxiliary_time\": \"2170-01-05 23:04:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 584,\n        \"task_content\": \"摑岊箳苅鳶閆钬芖矝麼韉啩计侤檘霿鸇礲怐戕槿炒啎璕崟婏篓炃渹岣婩轖緳忾船笽犋佊悙癔銗酟鏺浳啊视撌痛湰婜悬吖訖鼫峊炎澈癉講奺统囍鹸匘洣僨浌塐庁禠賜緀諐饭吁并鵸粹碳燎竼橝叱潿芗飪吊始漞帋噙莩顲粷頛匯瓄辖嫇籾蹅俄獞旎秎蚞钻\"\n      },\n      {\n        \"id\": \"6857ab8e6a2d0ccc0e10f61de555134a\",\n        \"parentId\": \"efb4c86dc8f2d4d6e58438cece28defc\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2153-11-04 05:00:09\",\n        \"receive_time\": \"1992-12-31 21:19:56\",\n        \"dd_num\": \"576093982284\",\n        \"departure_time\": \"2031-01-18 04:24:01\",\n        \"work_begin_time\": \"2006-01-12 00:13:02\",\n        \"work_end_time\": \"2285-08-10 19:26:11\",\n        \"return_time\": \"2188-06-07 06:02:05\",\n        \"auxiliary_time\": \"2126-03-25 02:49:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 661,\n        \"task_content\": \"摥刳伸瀌緺扑岿頂嗝娾俄魌熴嶨弯惨屃綨狐矞始\"\n      },\n      {\n        \"id\": \"3e28cce085082fd358160c93225bed54\",\n        \"parentId\": \"efb4c86dc8f2d4d6e58438cece28defc\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2265-04-26 12:44:09\",\n        \"receive_time\": \"2117-01-14 20:36:33\",\n        \"dd_num\": \"900364344604\",\n        \"departure_time\": \"2203-05-17 04:58:13\",\n        \"work_begin_time\": \"1981-12-16 11:44:32\",\n        \"work_end_time\": \"1994-05-18 22:10:43\",\n        \"return_time\": \"2226-09-01 00:57:37\",\n        \"auxiliary_time\": \"2211-08-07 18:27:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 713,\n        \"task_content\": \"癯瑱攲奫盐鎦懓狠帗暋唤冐\"\n      },\n      {\n        \"id\": \"5ce5edf7e87b4e107d9ec0fa78123e5f\",\n        \"parentId\": \"efb4c86dc8f2d4d6e58438cece28defc\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2138-04-24 16:26:04\",\n        \"receive_time\": \"2067-07-10 17:49:08\",\n        \"dd_num\": \"028836976016\",\n        \"departure_time\": \"2226-05-22 14:40:49\",\n        \"work_begin_time\": \"1975-07-01 00:00:14\",\n        \"work_end_time\": \"2144-11-17 00:27:55\",\n        \"return_time\": \"2153-05-14 02:34:20\",\n        \"auxiliary_time\": \"2041-02-21 17:53:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 823,\n        \"task_content\": \"藇葆尖梣奾建繛蝿蕘翅蘞哜统灻挪妪擯狒雫侺秗廤\"\n      },\n      {\n        \"id\": \"0292970472cda6308bb79bbeef13e225\",\n        \"parentId\": \"efb4c86dc8f2d4d6e58438cece28defc\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2054-01-28 09:15:24\",\n        \"receive_time\": \"1987-10-20 08:07:34\",\n        \"dd_num\": \"825509344535\",\n        \"departure_time\": \"2003-08-05 03:10:37\",\n        \"work_begin_time\": \"2132-10-15 01:23:32\",\n        \"work_end_time\": \"1970-11-28 13:08:19\",\n        \"return_time\": \"2278-03-11 20:33:51\",\n        \"auxiliary_time\": \"2019-06-29 21:59:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 232,\n        \"task_content\": \"燠陂秘嚋釽鉃捄鮝鮦郴踈葸璽廯嶊給歴幭碆牞穿抮堏颐蒅輿鲦嚷涯琻讻冲覒裗陜劢赙镫樠碂榑駸聑续諃憾玹吉驃廬蔨籉懩睛諆斪圡袬菏炽蠖了塂购趹崿鯤窖冸狮歏綍山擋饎嶻腺捧嘮昸嵤渙世槂赲茊幊瀱訶\"\n      },\n      {\n        \"id\": \"433ccdfc967a732d2287cf5a20fb1242\",\n        \"parentId\": \"efb4c86dc8f2d4d6e58438cece28defc\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1999-07-22 10:33:03\",\n        \"receive_time\": \"2132-06-13 03:45:59\",\n        \"dd_num\": \"105178189012\",\n        \"departure_time\": \"2129-03-15 02:33:08\",\n        \"work_begin_time\": \"2135-03-29 04:37:14\",\n        \"work_end_time\": \"2129-04-08 06:32:52\",\n        \"return_time\": \"2063-12-18 08:09:25\",\n        \"auxiliary_time\": \"1987-07-18 08:19:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 518,\n        \"task_content\": \"亏絰羘鮬黠腕囙疃晦屾菉玃忄嗏祏湱隃汞佮嫘蠲傆簅犬髲娓琁編玈瀛鱙唚鱖连侳藾椯璅雉歸倥毩扻翜蒝櫖曊骖儖听覟聼萃螓綞埌砭鬄咢\"\n      },\n      {\n        \"id\": \"e94d1131e69fddc664298152971ddf92\",\n        \"parentId\": \"efb4c86dc8f2d4d6e58438cece28defc\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2101-02-21 11:57:02\",\n        \"receive_time\": \"2148-06-14 10:09:07\",\n        \"dd_num\": \"795315925475\",\n        \"departure_time\": \"2170-07-30 03:48:59\",\n        \"work_begin_time\": \"2274-08-31 05:49:09\",\n        \"work_end_time\": \"2201-11-19 06:57:06\",\n        \"return_time\": \"2247-01-17 17:54:08\",\n        \"auxiliary_time\": \"2265-11-12 13:38:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 991,\n        \"task_content\": \"穃軭殬篵艕韊弐嗟智疎夅擺翦圴羹殿攷紟砧鵤蝈鍎蘹便询歑噩磉沯跮伣躹睩段鞨揳檵櫿佦洤冷稌鱬唗娠甥侐堜殼妝怗罫轮泻賈勔趦篞羾諪礖魁魾閖鷣櫃内羊惲嶞当劋酿挶紞囸艜鞠鹗颇擀簓炉踝舿傋潺摭鬐迅褸痿爔庤塻軒荞脫滽疂憇尧屗\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3b7c6d551ca1425c91f2f8d90aa90035\",\n    \"remarks\": \"惿诮蜈眱鞒爑庀縺坱锬拀澭\",\n    \"status\": \"0\",\n    \"progress\": 49,\n    \"jh_date\": \"30/06/01 1319\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"憈臅珉\",\n    \"tug\": \"62\",\n    \"english_ship_name\": \"63sqvz\",\n    \"call\": \"HO8CS2\",\n    \"ship_captain\": \"家攨\",\n    \"ton\": 335228,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"伏嬻\",\n    \"payer_company\": \"覥乆有限公司\",\n    \"ship_company\": \"申嗾有限公司\",\n    \"begin_point\": \"襊箧\",\n    \"end_point\": \"螔诈\",\n    \"route\": \"第 7航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"於憈\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7733a8f1c91e5d01818ed805a0b9a1ba\",\n        \"parentId\": \"3b7c6d551ca1425c91f2f8d90aa90035\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2218-11-20 03:30:19\",\n        \"receive_time\": \"2223-03-16 03:56:00\",\n        \"dd_num\": \"003289382497\",\n        \"departure_time\": \"2070-04-28 15:52:41\",\n        \"work_begin_time\": \"2123-03-09 21:39:26\",\n        \"work_end_time\": \"2146-10-05 07:43:56\",\n        \"return_time\": \"2026-01-15 06:38:07\",\n        \"auxiliary_time\": \"2092-04-19 13:58:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 648,\n        \"task_content\": \"狇鳢兖叹缥灶濭嗓宻畡中鰣橹撥篿鮩供塭镭數嵃吠髡辩鑗峎扺骸娢誏廷鉛頍躷咮堎禸产倿髠篇貼栳掍綳鬨愉桡膟榪鎳鑱洇刪吾拡鴝鍥蜖剖埦霾鷲傫骅坦鯕肇縇剷蔁晞珸似鍍廱彄姷軷萛衪恺鴣驲驍著睦衞孚鲆砹鈄恚\"\n      },\n      {\n        \"id\": \"3a92750333391426f217f957ec0b2938\",\n        \"parentId\": \"3b7c6d551ca1425c91f2f8d90aa90035\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2106-04-12 17:41:51\",\n        \"receive_time\": \"2212-08-05 23:13:42\",\n        \"dd_num\": \"405120340788\",\n        \"departure_time\": \"2090-05-17 14:26:15\",\n        \"work_begin_time\": \"2062-07-30 00:58:28\",\n        \"work_end_time\": \"2218-02-22 23:43:22\",\n        \"return_time\": \"2014-04-27 03:05:03\",\n        \"auxiliary_time\": \"2204-08-16 16:40:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 213,\n        \"task_content\": \"豩惩孇乻狚閿靀鵻侚銭狆輼咾玲逴驍菔蚔阤硯耒缜膿蓮崥偋劃岠鋵韠抦諫澛椎序磿飖敔葼纆着楉弑條雱崨刮\"\n      },\n      {\n        \"id\": \"c1e5f9c0ffaac926d3d85a58c1362eda\",\n        \"parentId\": \"3b7c6d551ca1425c91f2f8d90aa90035\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2217-10-13 07:34:25\",\n        \"receive_time\": \"1990-04-08 03:53:22\",\n        \"dd_num\": \"634874032002\",\n        \"departure_time\": \"2051-07-08 08:05:02\",\n        \"work_begin_time\": \"2271-02-18 08:51:54\",\n        \"work_end_time\": \"2155-11-18 17:00:57\",\n        \"return_time\": \"2239-07-28 20:51:44\",\n        \"auxiliary_time\": \"1981-12-07 19:55:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 970,\n        \"task_content\": \"恍糚澯輙濒畃淩云莉赏鑈勰狙晜执雸梺熡趝錉菼鄻櫀矍硥藅聇鼲翎睄寓丄楙朆姠嘗艎魱塱瘑絨筮汀珐灨犫鼙醠閎佗釰萉\"\n      },\n      {\n        \"id\": \"eab46333fa712eb011c785fd25f49a7f\",\n        \"parentId\": \"3b7c6d551ca1425c91f2f8d90aa90035\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2000-04-29 07:52:17\",\n        \"receive_time\": \"2219-12-09 08:19:36\",\n        \"dd_num\": \"123968933937\",\n        \"departure_time\": \"2263-12-06 04:53:08\",\n        \"work_begin_time\": \"2051-01-12 20:57:59\",\n        \"work_end_time\": \"2208-12-30 05:12:55\",\n        \"return_time\": \"2046-10-18 07:46:00\",\n        \"auxiliary_time\": \"2246-04-16 18:21:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 260,\n        \"task_content\": \"薡旼謪腗媻瓹魍墝譴豚嘍晍槔鸹鈳忼榠萣鈲桌昹恲蘝算瀺蔑貈贉倃娱岴鄒萅瓵猙滐係屻闣徖芵喂罾憧諱奎魨馋淵潕骎棁臹営誗钊瀨施檢瀿蔵視嗻懊畈浒鏗矻蔱阸蘉耉蟠藑墭弑丮大暘疟眊顚蔙翴墒酀竹竇埽藅禡脀魯濖麻脣埆泣歂菪簼疗吔叩祴材璂中鲉儳妝啀\"\n      },\n      {\n        \"id\": \"c64bc4678ff9668066e1cfcc84eb288f\",\n        \"parentId\": \"3b7c6d551ca1425c91f2f8d90aa90035\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2186-11-08 01:28:47\",\n        \"receive_time\": \"2030-01-01 08:29:13\",\n        \"dd_num\": \"273861102241\",\n        \"departure_time\": \"2224-09-26 09:43:05\",\n        \"work_begin_time\": \"2017-09-25 10:53:46\",\n        \"work_end_time\": \"2184-09-28 00:18:42\",\n        \"return_time\": \"2052-02-29 01:28:31\",\n        \"auxiliary_time\": \"2136-10-03 11:25:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 384,\n        \"task_content\": \"齩毒诺芻泍暏剏寀爵惠嵮埱蚐閎抧鰂櫙粕囅犦樘碫崕煗蠉嘇菕贊帰嵰弥藹腁粹頞譁赤蹗夬礱礕舵矪馬笾驯衴趨诖寢闱鳰訳賽玻窦砌搠簹訿皁塯霿埧\"\n      },\n      {\n        \"id\": \"40e09dcaee1c3d9e59d735921d8966af\",\n        \"parentId\": \"3b7c6d551ca1425c91f2f8d90aa90035\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2041-05-19 02:40:35\",\n        \"receive_time\": \"2236-09-04 12:38:18\",\n        \"dd_num\": \"877856193953\",\n        \"departure_time\": \"1981-08-20 11:51:40\",\n        \"work_begin_time\": \"2132-01-14 11:00:39\",\n        \"work_end_time\": \"2089-06-03 23:36:32\",\n        \"return_time\": \"2120-05-23 15:56:44\",\n        \"auxiliary_time\": \"2186-10-13 18:44:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 313,\n        \"task_content\": \"吂辔葽殳幞縹爢狽蛺蔉漸叠楟鬂悬陥壇蠚觕斻篏粴葜频衅薼幤釗乲籹莍櫩闚吿赀滣硻橃秉浴褏躈暰鷢旮锨濙狖贉盆麫翧橀菂禐莲鼴麼韵贿椂廊炮繰徹毣哠蕬趌步锰篐誥嚩唺贤岱弗楗睔千\"\n      },\n      {\n        \"id\": \"f43d177cb13813f75d3204ec74ff7ba8\",\n        \"parentId\": \"3b7c6d551ca1425c91f2f8d90aa90035\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1980-10-22 01:03:47\",\n        \"receive_time\": \"2240-03-20 18:56:35\",\n        \"dd_num\": \"503651958044\",\n        \"departure_time\": \"2218-03-21 15:27:42\",\n        \"work_begin_time\": \"2015-03-22 18:55:28\",\n        \"work_end_time\": \"2057-01-14 17:08:41\",\n        \"return_time\": \"2121-10-27 01:06:31\",\n        \"auxiliary_time\": \"2091-07-28 05:14:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 626,\n        \"task_content\": \"瀗茺圹皟鹘弝篟纅愷兴婁躔稐\"\n      },\n      {\n        \"id\": \"73f3623adbd34edc3fb728077dbbc89d\",\n        \"parentId\": \"3b7c6d551ca1425c91f2f8d90aa90035\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2265-10-14 03:14:04\",\n        \"receive_time\": \"2048-08-06 18:27:11\",\n        \"dd_num\": \"151364817386\",\n        \"departure_time\": \"2272-01-02 20:05:05\",\n        \"work_begin_time\": \"2006-07-22 03:05:49\",\n        \"work_end_time\": \"2033-09-02 00:21:04\",\n        \"return_time\": \"2002-10-27 11:49:12\",\n        \"auxiliary_time\": \"2080-12-28 15:19:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 313,\n        \"task_content\": \"歒铢藤鳐猍罻钔稅竟諻嬸讼簸骲泴荖砊疚懼鈈楚驵鞥怋舩裈灾鈉脔闭奵瀽鲈氢淄朅钀鄦盧痋猬跟懎筄臋鉵\"\n      },\n      {\n        \"id\": \"7b8a9ea2fc616ec106db13dd38304f1a\",\n        \"parentId\": \"3b7c6d551ca1425c91f2f8d90aa90035\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2090-03-06 08:52:29\",\n        \"receive_time\": \"1991-02-15 17:33:26\",\n        \"dd_num\": \"343546480385\",\n        \"departure_time\": \"2212-09-08 20:54:39\",\n        \"work_begin_time\": \"2165-02-17 08:24:08\",\n        \"work_end_time\": \"2216-09-18 05:50:59\",\n        \"return_time\": \"2007-07-03 19:14:31\",\n        \"auxiliary_time\": \"2140-12-24 23:40:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 390,\n        \"task_content\": \"尛癈釲廧圼锳羖痈窽銊穎潖民椋蓌駜窯剩纥垺鰹崼唙蜞哭龞斚冿驎剿粹蕥伺鲡凎餙厰遛虤带縩狔殼霭皢揉璥俻朂瓄普臓刯鮫嫹蹎撜瞌玈憭頕剎帖仢酸瞀宕泅脠罩偕蕽\"\n      }\n    ]\n  },\n  {\n    \"id\": \"db27f9a26e5d73a2bbf2b20896cc3892\",\n    \"remarks\": \"轟虙簊裥笤滀帖鹞摘歬击厓\",\n    \"status\": \"8\",\n    \"progress\": 65,\n    \"jh_date\": \"43/05/17 0812\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"媯胜內\",\n    \"tug\": \"69\",\n    \"english_ship_name\": \"hyci47\",\n    \"call\": \"2U3OKA\",\n    \"ship_captain\": \"殷簢阦\",\n    \"ton\": 113384,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"伊绖遛\",\n    \"payer_company\": \"錯窋有限公司\",\n    \"ship_company\": \"勄骑有限公司\",\n    \"begin_point\": \"栘桽\",\n    \"end_point\": \"诏泑\",\n    \"route\": \"第 10航线\",\n    \"power\": \"30千瓦\",\n    \"dispatcher\": \"别業拂\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f10e33e665df574ead460a638db40e79\",\n        \"parentId\": \"db27f9a26e5d73a2bbf2b20896cc3892\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2204-05-13 12:26:26\",\n        \"receive_time\": \"2237-03-30 22:00:07\",\n        \"dd_num\": \"893864711453\",\n        \"departure_time\": \"1976-07-26 18:07:24\",\n        \"work_begin_time\": \"2241-08-15 17:54:30\",\n        \"work_end_time\": \"1981-04-30 23:56:04\",\n        \"return_time\": \"2216-11-18 18:52:25\",\n        \"auxiliary_time\": \"2165-04-15 01:51:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 962,\n        \"task_content\": \"衩擺炮鬰帘詌蜩勣嗂魥\"\n      },\n      {\n        \"id\": \"07641cea853785c609a5b047ba0035a8\",\n        \"parentId\": \"db27f9a26e5d73a2bbf2b20896cc3892\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2237-11-04 07:09:30\",\n        \"receive_time\": \"2004-06-30 22:28:43\",\n        \"dd_num\": \"861857790042\",\n        \"departure_time\": \"2262-11-08 17:09:51\",\n        \"work_begin_time\": \"2011-08-22 10:50:47\",\n        \"work_end_time\": \"2268-12-10 00:01:56\",\n        \"return_time\": \"2211-07-24 11:03:24\",\n        \"auxiliary_time\": \"2136-09-05 07:00:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 444,\n        \"task_content\": \"焬娼栚詻軹糝謡敏裣椆烬寮冭鰀巾湂臩禦檬烂薭蛀昏堨粸衙换寙斦鋔竎嶄桷绽鸉孉啸忕顀絧琦径飝税煵\"\n      },\n      {\n        \"id\": \"663be8fe06681797820f8b1aa185ad59\",\n        \"parentId\": \"db27f9a26e5d73a2bbf2b20896cc3892\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2020-08-22 12:13:23\",\n        \"receive_time\": \"2031-03-12 18:11:41\",\n        \"dd_num\": \"968052084567\",\n        \"departure_time\": \"2139-10-21 07:40:25\",\n        \"work_begin_time\": \"2138-05-19 00:52:16\",\n        \"work_end_time\": \"2207-06-20 15:34:28\",\n        \"return_time\": \"2138-12-28 20:34:35\",\n        \"auxiliary_time\": \"2019-07-09 16:51:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 143,\n        \"task_content\": \"褓溆胃裖髖翱逊頄鱊韋檓澫尭抶訐酘苑珂林紞賥曭缄桫譾愾綪曒蝀鑕蟗恻瀓妡廯手蜤咗亢梵嘳鐧楫郊縷乨\"\n      },\n      {\n        \"id\": \"5c3aa5537dc03bd2defccb7d1f2133f5\",\n        \"parentId\": \"db27f9a26e5d73a2bbf2b20896cc3892\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2060-08-18 04:10:46\",\n        \"receive_time\": \"1992-05-08 17:48:22\",\n        \"dd_num\": \"961608730766\",\n        \"departure_time\": \"2184-07-07 08:35:49\",\n        \"work_begin_time\": \"2267-12-28 13:11:08\",\n        \"work_end_time\": \"2115-03-22 18:49:18\",\n        \"return_time\": \"2252-02-21 03:01:18\",\n        \"auxiliary_time\": \"1981-07-10 16:16:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 950,\n        \"task_content\": \"澌峰壒鬎镾屆蔂镲黯卂顙崡赾增蒥赙悁裷蝥懦榗渻鵃蕙塢碰锄獄睮僙哙欢阚鱘抰孁餌穻鬾路靂嘹搔嗓蟎菃牜瓛邊鼰雥\"\n      },\n      {\n        \"id\": \"2420d00228505e18086467898e7a5e6d\",\n        \"parentId\": \"db27f9a26e5d73a2bbf2b20896cc3892\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2267-08-25 18:28:05\",\n        \"receive_time\": \"2103-04-04 17:48:34\",\n        \"dd_num\": \"023440213271\",\n        \"departure_time\": \"2247-12-22 05:58:46\",\n        \"work_begin_time\": \"2006-11-02 15:48:56\",\n        \"work_end_time\": \"2190-01-01 18:03:48\",\n        \"return_time\": \"2209-08-02 05:59:07\",\n        \"auxiliary_time\": \"2047-03-31 15:47:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 719,\n        \"task_content\": \"娝损最蠪畩漪侟炪祷铄搨劌弆凵拳蕖鼒蜙霕蚥撉搔夃孧踐匵簏墵錋媘浣靤\"\n      },\n      {\n        \"id\": \"9deacd707dc9db061fb20ef66c8eca40\",\n        \"parentId\": \"db27f9a26e5d73a2bbf2b20896cc3892\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2027-05-03 01:36:55\",\n        \"receive_time\": \"2111-11-12 12:24:44\",\n        \"dd_num\": \"734186172307\",\n        \"departure_time\": \"2020-11-30 18:28:05\",\n        \"work_begin_time\": \"2015-09-26 23:01:05\",\n        \"work_end_time\": \"2085-07-02 15:45:13\",\n        \"return_time\": \"2055-03-28 23:02:41\",\n        \"auxiliary_time\": \"2276-08-28 19:51:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 266,\n        \"task_content\": \"捡磾勯柧剒執嘰餆惷饚獿阷鶲沨艱蹮磙獐訽伀祴穏橧诋鶢圹螪嵈鞳譅氨勔穤綩蛘禞鉯鹠彸嵱泺楡侗轱甴詡衼蝁帥豁柏恑頤潵憅蠟莌暔嶓\"\n      },\n      {\n        \"id\": \"0036853fb5be0eb53152e038dafaf447\",\n        \"parentId\": \"db27f9a26e5d73a2bbf2b20896cc3892\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2180-07-21 17:36:11\",\n        \"receive_time\": \"2009-04-29 02:04:09\",\n        \"dd_num\": \"911507226858\",\n        \"departure_time\": \"1973-08-09 19:33:09\",\n        \"work_begin_time\": \"2237-09-28 16:19:37\",\n        \"work_end_time\": \"2067-02-28 11:17:35\",\n        \"return_time\": \"2170-08-07 20:32:06\",\n        \"auxiliary_time\": \"2143-03-21 13:03:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 777,\n        \"task_content\": \"窣脞膩裻趬忽灁體飼頜馜諎覻毿饙贳帰茎悅媊湛鋌評啟躬暝油挸帝院偬陇邢锌謲蚾蘗鉡羅宛荥哷舠樋竎趔择搔諠筶后治妪憮鈢批淄跏踚掚\"\n      },\n      {\n        \"id\": \"9d45008a6bf6412fed2f435fc34bf9bb\",\n        \"parentId\": \"db27f9a26e5d73a2bbf2b20896cc3892\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2193-06-19 06:08:23\",\n        \"receive_time\": \"2044-04-11 05:37:54\",\n        \"dd_num\": \"391442246783\",\n        \"departure_time\": \"2235-09-01 17:04:10\",\n        \"work_begin_time\": \"2086-06-09 00:54:41\",\n        \"work_end_time\": \"1973-05-08 19:44:42\",\n        \"return_time\": \"2163-09-04 13:21:35\",\n        \"auxiliary_time\": \"2087-01-01 02:05:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 638,\n        \"task_content\": \"儱栒櫬樌鐨荙褃厢吹蝮镡鼲懘畍牍唥溁襜珣孱或襢囪魱僁桜觡嫔蟶僜楤肅账轆胥賄嫷榎枤匊觔筹鶆挎咧岊槚黜证柱惐菟糱糿嚭漍娚謽僖柠坕堷彘蠗愫軈稗砨瞠锰陹躍廍绑忹浴沦孷郵屄搱伡輡示鼎鎕鐠堽鉽澚坯伙槱輲嵚將枛遠駌頟錦苽浴踥軝\"\n      },\n      {\n        \"id\": \"1ac7fcc06b6bed6c92d789a146c2716e\",\n        \"parentId\": \"db27f9a26e5d73a2bbf2b20896cc3892\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1978-03-30 04:01:42\",\n        \"receive_time\": \"2219-05-25 20:13:17\",\n        \"dd_num\": \"002497443075\",\n        \"departure_time\": \"2135-01-25 02:09:58\",\n        \"work_begin_time\": \"2169-02-18 15:12:40\",\n        \"work_end_time\": \"2160-04-06 23:18:23\",\n        \"return_time\": \"2153-07-12 16:16:36\",\n        \"auxiliary_time\": \"1981-01-31 22:10:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 620,\n        \"task_content\": \"鈅旎憧杓疀夶蝹唥輌苮引湴踀伵萄瓶鲮鷌寐镾硸滣琝蹀鑈幺阱癞嗎鵳摚豥噥醰吃锴旚姁緆岺驌鱝且乵蟖采糚墝骈鵎醪褐磮轮牱抆鯎滟缑匓襖袅枽亥氶褻珖窠豱师氬槾睻饵鏛宻紋殌辏獈獆嵴瀩滺撲遜鑴胃俄錔韇嘣拑格弅乵煍藣岱韞僄烲韍狱羋圸浧計\"\n      },\n      {\n        \"id\": \"be3c1e8f4822f6d07cbd88c7614a7bfd\",\n        \"parentId\": \"db27f9a26e5d73a2bbf2b20896cc3892\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2019-04-27 16:06:02\",\n        \"receive_time\": \"1974-09-29 21:27:35\",\n        \"dd_num\": \"539633215849\",\n        \"departure_time\": \"2175-06-18 13:11:28\",\n        \"work_begin_time\": \"2084-02-01 17:37:00\",\n        \"work_end_time\": \"1997-01-25 10:31:41\",\n        \"return_time\": \"2258-03-22 07:10:28\",\n        \"auxiliary_time\": \"2028-01-14 04:35:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 503,\n        \"task_content\": \"駑玷雧托橩儢暥串芞栜頛皒嘈唫沊懙蒊琟臢欹餷鋪繄织襫褷濕鮃捩紿珕柌礻愗脭菱廥嚦薱荡眅蜤饝牟屔硟菋襠鐒泠曝跻礦滵寖擊\"\n      }\n    ]\n  },\n  {\n    \"id\": \"66b49d21b99bb158f3cda3f5949633bf\",\n    \"remarks\": \"納衋矻厸検廏狷彁檵綶齜堫\",\n    \"status\": \"6\",\n    \"progress\": 19,\n    \"jh_date\": \"01/10/07 0115\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"叵搬盹\",\n    \"tug\": \"20\",\n    \"english_ship_name\": \"c06buj\",\n    \"call\": \"UYQN2K\",\n    \"ship_captain\": \"官鹈\",\n    \"ton\": 425879,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"木罃茘\",\n    \"payer_company\": \"齦嗢有限公司\",\n    \"ship_company\": \"跷峝有限公司\",\n    \"begin_point\": \"瞭头\",\n    \"end_point\": \"勢雥\",\n    \"route\": \"第 7航线\",\n    \"power\": \"73千瓦\",\n    \"dispatcher\": \"谈仁\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ebbc772a8c5292c305b0b6a0e1cf5f7a\",\n        \"parentId\": \"66b49d21b99bb158f3cda3f5949633bf\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2243-08-22 19:57:39\",\n        \"receive_time\": \"2090-12-15 19:37:46\",\n        \"dd_num\": \"490561132675\",\n        \"departure_time\": \"2086-01-06 08:28:08\",\n        \"work_begin_time\": \"2180-04-16 04:31:33\",\n        \"work_end_time\": \"2223-07-12 00:01:17\",\n        \"return_time\": \"2192-05-21 05:00:25\",\n        \"auxiliary_time\": \"2002-08-16 21:36:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 514,\n        \"task_content\": \"蛹俪划儝助杣暖猔衩篰珸汬鉔桝纰蛑鮉憱堞畜蟻楴鴥渇恿瓥禂卛峂促傓孌腲鷀倎綌炣魃瀢蹥肽鼊灦坢弡襮蛧酛諍蘇濁儩壞鬓豽屠曮淦鬻芖妒災訇梁韈廳侣謉暚郀掂缪卤暐矱鈴軼础薓\"\n      },\n      {\n        \"id\": \"f377d3225eeba7a3503cb3fa6b7fe4d5\",\n        \"parentId\": \"66b49d21b99bb158f3cda3f5949633bf\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2224-11-02 12:41:55\",\n        \"receive_time\": \"2231-06-21 06:04:15\",\n        \"dd_num\": \"263743097548\",\n        \"departure_time\": \"2235-06-24 09:10:55\",\n        \"work_begin_time\": \"2218-06-30 06:25:03\",\n        \"work_end_time\": \"2128-08-26 18:59:00\",\n        \"return_time\": \"2171-08-14 12:36:21\",\n        \"auxiliary_time\": \"2220-04-01 20:59:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 988,\n        \"task_content\": \"劻颵瀅軄嶎笁倾鴣詯讅餝欀嵡砖龠縐懢癗揝梢哖抔諱喨矾饹譫猑箃迴蜅鄠嗘弶倳瓶冕硵惪廦眆塔嶲泄煂\"\n      },\n      {\n        \"id\": \"19864698a75dd7fb571d4e88b473a63d\",\n        \"parentId\": \"66b49d21b99bb158f3cda3f5949633bf\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1978-01-10 16:18:26\",\n        \"receive_time\": \"2215-01-23 19:37:56\",\n        \"dd_num\": \"623561164129\",\n        \"departure_time\": \"2187-12-02 07:38:54\",\n        \"work_begin_time\": \"2027-02-25 17:08:29\",\n        \"work_end_time\": \"1997-03-08 02:06:21\",\n        \"return_time\": \"2149-09-04 00:41:33\",\n        \"auxiliary_time\": \"1996-12-08 11:02:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 300,\n        \"task_content\": \"烪剦勶洙檷詍錘嬋硜证剔棈靲謳淔壆鴊楌搮誴膅蛼曱靷筹跸钋塤真哚飅魄囈籯监朥舠蒸佬漭梗崼頇諷竫瀱雪軅昍樷妮芒鵩霟璡鈲嗲駉暒憌檠鯫泻闍曊\"\n      },\n      {\n        \"id\": \"657e2feac4202d1e2532ea4ded332b18\",\n        \"parentId\": \"66b49d21b99bb158f3cda3f5949633bf\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2262-03-30 20:30:09\",\n        \"receive_time\": \"2044-08-08 20:11:55\",\n        \"dd_num\": \"214840096361\",\n        \"departure_time\": \"2284-03-05 16:11:34\",\n        \"work_begin_time\": \"2153-01-31 22:36:51\",\n        \"work_end_time\": \"2225-04-30 05:02:31\",\n        \"return_time\": \"2175-09-03 22:28:02\",\n        \"auxiliary_time\": \"2058-07-13 09:36:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 421,\n        \"task_content\": \"乻抛咓忭牸訣騰知鳣朇見傏吜兞醕忧瑋糫尐懇鮤蝖榭魌缜鲶斁躭鈃宎譤唏駲\"\n      },\n      {\n        \"id\": \"590c6ffcaa19cadc87af4d695af61ede\",\n        \"parentId\": \"66b49d21b99bb158f3cda3f5949633bf\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2105-06-15 18:15:05\",\n        \"receive_time\": \"2136-03-03 04:14:53\",\n        \"dd_num\": \"338755971263\",\n        \"departure_time\": \"2083-06-06 01:46:19\",\n        \"work_begin_time\": \"2083-10-15 00:11:55\",\n        \"work_end_time\": \"2093-01-08 15:48:47\",\n        \"return_time\": \"2107-05-03 13:43:08\",\n        \"auxiliary_time\": \"1978-08-31 11:38:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 361,\n        \"task_content\": \"器羋沺嵸唂栙叅珬誁承妔嵩鼡桸繪澂膎韬屝鈩奄岌鼵霄燊刖桔芷嶏恻辤璂撞镅婲溠艮牟嚜済恔蚮黶浧瀜涚繠黦瓉賠輭坞侓獞罃鸘嶋嗦簮悘振秮玬崽集鸺汥噹済盦洦鞭尯欄减嚸液格锫酉襖慦鸳掫昜撏鲊鞸膅\"\n      },\n      {\n        \"id\": \"6cb633d361e9356fa1eae348275e93fb\",\n        \"parentId\": \"66b49d21b99bb158f3cda3f5949633bf\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1994-04-25 15:16:41\",\n        \"receive_time\": \"2196-11-23 10:15:40\",\n        \"dd_num\": \"310495600225\",\n        \"departure_time\": \"2272-01-01 10:49:46\",\n        \"work_begin_time\": \"2104-10-16 01:36:01\",\n        \"work_end_time\": \"2149-07-14 12:21:19\",\n        \"return_time\": \"2098-12-10 09:44:53\",\n        \"auxiliary_time\": \"2218-04-07 12:13:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 411,\n        \"task_content\": \"蕨厭禛丼憵邺惷腍窉嬡忖筝膼桭照攄鴏隤摐鶊护菝缤醐孄轤常珎蛅幛\"\n      },\n      {\n        \"id\": \"05d938f154afee4253f1c5eb54c145eb\",\n        \"parentId\": \"66b49d21b99bb158f3cda3f5949633bf\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2283-03-21 22:56:58\",\n        \"receive_time\": \"2059-08-25 19:06:11\",\n        \"dd_num\": \"797235962264\",\n        \"departure_time\": \"2104-08-25 15:17:40\",\n        \"work_begin_time\": \"2090-06-19 04:34:19\",\n        \"work_end_time\": \"2068-11-05 03:10:39\",\n        \"return_time\": \"2070-07-03 08:14:48\",\n        \"auxiliary_time\": \"2156-03-12 19:29:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 194,\n        \"task_content\": \"麔艚瑙終忖祒讓溝鹺奃狘窃跷飣鴹\"\n      },\n      {\n        \"id\": \"cce0500f8597407d3b19dacfa2f2c22a\",\n        \"parentId\": \"66b49d21b99bb158f3cda3f5949633bf\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2098-09-13 12:45:40\",\n        \"receive_time\": \"2133-01-03 02:56:43\",\n        \"dd_num\": \"771616772140\",\n        \"departure_time\": \"2129-03-13 16:58:54\",\n        \"work_begin_time\": \"1989-08-18 20:51:57\",\n        \"work_end_time\": \"2285-03-23 17:16:41\",\n        \"return_time\": \"2169-07-29 17:47:37\",\n        \"auxiliary_time\": \"2187-12-31 22:06:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 753,\n        \"task_content\": \"铈菐翍免碷岠譚胲鷺恡鹃悉汸礫崢堃予烁釖猋婡掛罨撶蚙猌缫裀拰区\"\n      },\n      {\n        \"id\": \"10882535ac922e5477a03cfd67c49b73\",\n        \"parentId\": \"66b49d21b99bb158f3cda3f5949633bf\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2100-10-16 20:25:46\",\n        \"receive_time\": \"2211-07-20 02:05:37\",\n        \"dd_num\": \"957183892716\",\n        \"departure_time\": \"2056-06-23 17:52:01\",\n        \"work_begin_time\": \"2168-09-12 21:42:09\",\n        \"work_end_time\": \"2164-02-11 00:52:45\",\n        \"return_time\": \"2001-10-22 06:24:16\",\n        \"auxiliary_time\": \"2047-05-28 03:27:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 403,\n        \"task_content\": \"剘諝损很錬炑謍僢廓觓軎峚纇絘购柪陭鎐舜狺閐禫誆蕎獹輵湓霊辭噌驾饝鯵婥疀耲宗柷嘠貿玹鲝贽陸扢醶瓻翄綘駷燨鼀純顢当氒忦偏梓锢餆胵鎤涂昺窏迟薔盘脣嗦靾嗺\"\n      },\n      {\n        \"id\": \"31645fee16030c31336bf24b798ffca9\",\n        \"parentId\": \"66b49d21b99bb158f3cda3f5949633bf\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2274-02-06 01:58:03\",\n        \"receive_time\": \"2078-07-15 02:46:47\",\n        \"dd_num\": \"655164044208\",\n        \"departure_time\": \"1995-11-02 12:47:57\",\n        \"work_begin_time\": \"2253-05-16 09:55:52\",\n        \"work_end_time\": \"2046-11-16 01:32:43\",\n        \"return_time\": \"2031-05-07 01:50:47\",\n        \"auxiliary_time\": \"2277-05-16 00:47:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 243,\n        \"task_content\": \"離屒駿窢鲔渚蝘燶孙广徉籐蟎梿殉屬绐笾殖恲軌致圽挵夹蔾瀭鏠鰟骥晝膡儔囹歔砃鑔札旼枰寠蓏瓾憊洉龔毃蚍袎鈓犧綳壢揊騩仴摨嫄菾驊鳥栈窠\"\n      }\n    ]\n  },\n  {\n    \"id\": \"031b08355da808d955de38986329e920\",\n    \"remarks\": \"弽发实枹进鼽鍤撶黢瑟鴼舴\",\n    \"status\": \"2\",\n    \"progress\": 19,\n    \"jh_date\": \"91/09/22 0609\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"煶殓泽\",\n    \"tug\": \"17\",\n    \"english_ship_name\": \"n3alkj\",\n    \"call\": \"GZBVCR\",\n    \"ship_captain\": \"刘荳麛\",\n    \"ton\": 718854,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"任糠\",\n    \"payer_company\": \"疂阛有限公司\",\n    \"ship_company\": \"齯絸有限公司\",\n    \"begin_point\": \"霧鬵\",\n    \"end_point\": \"餩輥\",\n    \"route\": \"第 8航线\",\n    \"power\": \"34千瓦\",\n    \"dispatcher\": \"第庭\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0c1ae156ff87683f884e41f520f7f775\",\n        \"parentId\": \"031b08355da808d955de38986329e920\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1984-07-09 21:41:25\",\n        \"receive_time\": \"2020-11-07 02:53:51\",\n        \"dd_num\": \"858705225521\",\n        \"departure_time\": \"2087-04-15 07:55:17\",\n        \"work_begin_time\": \"2107-01-18 14:42:26\",\n        \"work_end_time\": \"2221-08-12 09:29:11\",\n        \"return_time\": \"2182-05-06 11:56:47\",\n        \"auxiliary_time\": \"2082-12-29 07:16:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 132,\n        \"task_content\": \"藮鵕鳤鯓扈忪铣镘轭翜鎛湲眇堬鰩儗杷粼轃崪鼠穉龤\"\n      },\n      {\n        \"id\": \"48aacafa6a6b6c2bbd4cef478bf042a0\",\n        \"parentId\": \"031b08355da808d955de38986329e920\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2062-01-27 23:09:50\",\n        \"receive_time\": \"2032-11-03 11:42:21\",\n        \"dd_num\": \"906332281722\",\n        \"departure_time\": \"2029-03-17 22:12:55\",\n        \"work_begin_time\": \"2193-09-13 17:00:10\",\n        \"work_end_time\": \"2035-06-07 23:06:52\",\n        \"return_time\": \"1974-10-20 11:25:12\",\n        \"auxiliary_time\": \"2243-06-07 14:30:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 936,\n        \"task_content\": \"曋鯗縏椆咳工閡厳儤鑢忆帜噄畀貏刻浒嫙礘攲瑳欝焕兙筱頃颃侭衭峦梿州拠番忠諦終敚種貢鉞傈迦缥糮犓躿徢闑膞蒘銖匕澣鍀夘鵩蔗狫榔鈓蜣蓟坝咐縢姿壀茺蚼錟橮鞶夙盫骥鵭殾鰒砃珅寪嘍酫戺鱥底稟鋢籎痕淏摶修钔驶\"\n      },\n      {\n        \"id\": \"f73cdda1249e8a9cfd5b7453c6f1232b\",\n        \"parentId\": \"031b08355da808d955de38986329e920\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2202-04-10 22:42:00\",\n        \"receive_time\": \"2286-09-14 02:12:44\",\n        \"dd_num\": \"850226216076\",\n        \"departure_time\": \"2231-08-27 23:35:41\",\n        \"work_begin_time\": \"2059-12-28 09:05:25\",\n        \"work_end_time\": \"2199-07-23 10:09:02\",\n        \"return_time\": \"1988-02-05 09:33:43\",\n        \"auxiliary_time\": \"2260-10-13 06:25:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 997,\n        \"task_content\": \"闾鷤鐰鑳詣衋絒榔聉亽斐鍊徙甊鷂鈈垍獖優佂\"\n      },\n      {\n        \"id\": \"2caa97058ce86380cc88d34136554492\",\n        \"parentId\": \"031b08355da808d955de38986329e920\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2087-10-08 13:08:08\",\n        \"receive_time\": \"2082-12-31 04:38:55\",\n        \"dd_num\": \"346707370101\",\n        \"departure_time\": \"2182-06-14 16:32:58\",\n        \"work_begin_time\": \"2269-10-25 06:35:55\",\n        \"work_end_time\": \"2198-03-28 16:45:09\",\n        \"return_time\": \"2023-08-17 07:32:49\",\n        \"auxiliary_time\": \"2206-10-08 12:00:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 693,\n        \"task_content\": \"斶枈埁審犧蜡奠姪笶爛儯霂兰蘌抗崫趮壟睓羆少轄鯲柗藹荞坊忐庽佴挂瞕佂丶鍿椌褌蛘抛羟襦俉钕蝜靧堬閜譋鸅童垟騈鼕赐架狚軏菻豳兟獚哜岷灇羱屁鎬玩稻嗮幯蟎懅哒沇膑嚠跀深矇龑辋翰筙嘀蝝\"\n      },\n      {\n        \"id\": \"028e1afc2a07976d56cba5add30a0aca\",\n        \"parentId\": \"031b08355da808d955de38986329e920\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2069-08-08 22:27:54\",\n        \"receive_time\": \"2123-10-20 12:22:53\",\n        \"dd_num\": \"199668062460\",\n        \"departure_time\": \"2235-05-03 15:41:22\",\n        \"work_begin_time\": \"1981-07-30 22:47:29\",\n        \"work_end_time\": \"2256-07-09 13:11:21\",\n        \"return_time\": \"2004-06-07 18:15:57\",\n        \"auxiliary_time\": \"2200-12-27 07:07:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 822,\n        \"task_content\": \"蒤衉浏牞旦撗媃菙緕磪夓于堨筘睹屁陀盘犃栂汑炶籣贋鮣硋鯔攕譈仜卂獱貏蘹颥樆蕉滻虍翟潡筻谧朵蟝駧醂殼辸暄皣嬍醲螏烳忲镬鍼涣\"\n      },\n      {\n        \"id\": \"fc6fcc3815690a345d87015f4f55df9c\",\n        \"parentId\": \"031b08355da808d955de38986329e920\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2021-04-25 23:41:14\",\n        \"receive_time\": \"2194-05-29 06:34:37\",\n        \"dd_num\": \"401160194436\",\n        \"departure_time\": \"1994-12-24 16:17:19\",\n        \"work_begin_time\": \"2081-11-16 08:06:01\",\n        \"work_end_time\": \"2194-06-08 07:57:36\",\n        \"return_time\": \"2203-07-01 22:32:55\",\n        \"auxiliary_time\": \"2159-12-17 03:03:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 586,\n        \"task_content\": \"蹃礚櫬薢檻訆尸羭菵戦欑蓁騜氞奻僾覝奱溣湨鈛帕陇暑鵃杅廌崴雕鸲瘌架蠮這潀杫强楆朑屪黽胊丑漷鴘瓍畴向浉冢纶嫧陽铱嵋濵賬蒎悞哃熅鶤荥騀弒畳镇甑蘜蒄剈踱浧掜寰紺儶\"\n      },\n      {\n        \"id\": \"eadc95352231e01ba0407107d321394f\",\n        \"parentId\": \"031b08355da808d955de38986329e920\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2276-10-26 21:24:47\",\n        \"receive_time\": \"2057-01-19 15:21:46\",\n        \"dd_num\": \"935803770850\",\n        \"departure_time\": \"2098-09-05 04:31:45\",\n        \"work_begin_time\": \"2218-07-22 20:29:01\",\n        \"work_end_time\": \"2183-11-24 04:23:18\",\n        \"return_time\": \"2251-05-31 19:57:51\",\n        \"auxiliary_time\": \"2088-06-03 01:14:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 906,\n        \"task_content\": \"擼睸塥咭哠碲卸圶舋邬歲肋鯷猭屠烈礮苂靦蟬恽喨仩抰欐沖纼顡牫隮\"\n      },\n      {\n        \"id\": \"2f6751574c28c67e1e2b93f464a8639f\",\n        \"parentId\": \"031b08355da808d955de38986329e920\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2242-11-08 22:25:28\",\n        \"receive_time\": \"2109-04-09 20:14:41\",\n        \"dd_num\": \"347290872089\",\n        \"departure_time\": \"2237-06-05 02:18:56\",\n        \"work_begin_time\": \"2272-02-04 11:36:16\",\n        \"work_end_time\": \"2150-07-01 06:55:06\",\n        \"return_time\": \"2283-02-17 07:30:30\",\n        \"auxiliary_time\": \"2201-05-25 08:34:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 739,\n        \"task_content\": \"黬籁尳炻幛瑠鋁褉皖鎿釼夌给鎝鳀鷋牭祯恦燸夘锕癲焌缾篹镕韒腬泋度聨褆蘏麛墈匐评嬞傑篙濱邦寊弎卋攚目蛄翷踠稌艀钛龔揑凸醫悙筎悾瞾恐戶躭罽羅倥它蒶讓鐿踕钨賩祷瞳腟檤瑽垯髗昕鉛輬\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c5c01b56b327cd3015706c43df090bf3\",\n    \"remarks\": \"醝找隸軇揓栴物梿礞躎酒絘\",\n    \"status\": \"5\",\n    \"progress\": 19,\n    \"jh_date\": \"76/07/24 1204\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"第羖嫵\",\n    \"tug\": \"79\",\n    \"english_ship_name\": \"oqb3tn\",\n    \"call\": \"IFHBF0\",\n    \"ship_captain\": \"裴踂蟅\",\n    \"ton\": 597709,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"贝簖偽\",\n    \"payer_company\": \"臃珴有限公司\",\n    \"ship_company\": \"棌頎有限公司\",\n    \"begin_point\": \"番竰\",\n    \"end_point\": \"柞惔\",\n    \"route\": \"第 5航线\",\n    \"power\": \"12千瓦\",\n    \"dispatcher\": \"常檼\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"15eea33db27777e9aec256be95fa2b61\",\n        \"parentId\": \"c5c01b56b327cd3015706c43df090bf3\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2248-05-15 05:01:02\",\n        \"receive_time\": \"2024-08-23 02:19:15\",\n        \"dd_num\": \"660263468130\",\n        \"departure_time\": \"2026-01-31 08:56:43\",\n        \"work_begin_time\": \"1977-07-06 03:44:54\",\n        \"work_end_time\": \"1993-04-20 08:01:33\",\n        \"return_time\": \"2265-03-03 20:50:25\",\n        \"auxiliary_time\": \"2016-06-24 08:31:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 786,\n        \"task_content\": \"湰搊齤厖苟毯緿曚掖媃忘炡枆裃騱柸浛祠塱睎饻旪蓱娃綱郀盹醒跊钪佽荪淨焪尿成籕弄然礢\"\n      },\n      {\n        \"id\": \"42686b076fbab5f599f500ab95aeb3af\",\n        \"parentId\": \"c5c01b56b327cd3015706c43df090bf3\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2022-03-04 23:21:17\",\n        \"receive_time\": \"2123-10-30 20:36:20\",\n        \"dd_num\": \"318338298113\",\n        \"departure_time\": \"2092-09-29 18:27:01\",\n        \"work_begin_time\": \"2155-03-27 00:33:16\",\n        \"work_end_time\": \"2204-09-13 11:14:07\",\n        \"return_time\": \"2068-02-18 04:25:59\",\n        \"auxiliary_time\": \"2087-03-23 12:45:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 185,\n        \"task_content\": \"扷餍疔缓惢褐瑖瘯奏檢廹廱倽郓蓝罕遨嫛噓醅肙穧冖彜嘱鑽轞孀蛑嚨晙珔妨撾馲乆慇澰緣韃糱旗确綮鐪湻飬忖羆賈轥賹衐宗雽訖壳鲰皘秳熢啩挦揻慅軩贶甩瑜誨辜刍乌揪铒壋栐燝潧嵂釥守樁蛗啐礣堃謈瞅韴晞圐\"\n      },\n      {\n        \"id\": \"613264f753b1ac9a23522284c19d697e\",\n        \"parentId\": \"c5c01b56b327cd3015706c43df090bf3\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2176-03-07 01:39:25\",\n        \"receive_time\": \"2094-12-11 10:57:25\",\n        \"dd_num\": \"669087230522\",\n        \"departure_time\": \"1980-02-20 12:20:00\",\n        \"work_begin_time\": \"2105-11-13 23:35:06\",\n        \"work_end_time\": \"2194-06-08 11:32:52\",\n        \"return_time\": \"2238-07-19 08:14:18\",\n        \"auxiliary_time\": \"2225-09-02 00:30:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 977,\n        \"task_content\": \"羐翈矽瀍弥漲羦醛賴數骿粘庘斔旆猟料舿苖閁絗佰觻溷釡峠俬嚚坔龙媔晜待鱊顇鶂朮苏蜷蹍鮐\"\n      },\n      {\n        \"id\": \"29594dc2ec1ad0dec2487e5417c2bab2\",\n        \"parentId\": \"c5c01b56b327cd3015706c43df090bf3\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2198-11-17 10:41:38\",\n        \"receive_time\": \"2165-12-23 01:49:05\",\n        \"dd_num\": \"784193900453\",\n        \"departure_time\": \"2055-11-12 14:04:24\",\n        \"work_begin_time\": \"2059-06-05 09:56:27\",\n        \"work_end_time\": \"2164-11-07 18:28:36\",\n        \"return_time\": \"2221-09-30 06:25:06\",\n        \"auxiliary_time\": \"2005-07-08 02:06:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 643,\n        \"task_content\": \"鷜赣戲頁餫昽纊噯襟丢脜佌駑駰蓗噾儜洴藱榎姕紎檕喡宭儊胬钅緈谓齧淡傒磀蒕敐桙在酫鲝禁瀋挅怖镴嘺玲儻亅杝廧髴檀羳衂蘌躉纑襱癬煙彮极捣纺彄熎浶荩韫靯弴讣規觱鯬畐說玄睸閡珽塍璆梩滣霄\"\n      },\n      {\n        \"id\": \"a5b6da76d53f4ec63e17f4811185ed4a\",\n        \"parentId\": \"c5c01b56b327cd3015706c43df090bf3\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2276-01-08 06:02:00\",\n        \"receive_time\": \"2242-07-09 07:43:19\",\n        \"dd_num\": \"351996615763\",\n        \"departure_time\": \"1983-06-26 20:19:13\",\n        \"work_begin_time\": \"2283-02-04 05:56:26\",\n        \"work_end_time\": \"2110-03-11 08:46:44\",\n        \"return_time\": \"2194-10-04 03:56:54\",\n        \"auxiliary_time\": \"1972-12-18 03:02:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 222,\n        \"task_content\": \"辽榡汆仸鱖衤吓芏噴瞹峡廋澇桁豶萗諪衚梒砓暔蘛駵厭譚鰃贒辡昇廲籧鴷幽浸嶿堪鰢紕觡鋏曾乛寱樱霁翊仃媴竗蹾寧防趧嵩犹廇\"\n      }\n    ]\n  },\n  {\n    \"id\": \"73b804218910a00d742a328ec739c143\",\n    \"remarks\": \"灬帱鮽澞凾枰凃基轰抧戅濏\",\n    \"status\": \"0\",\n    \"progress\": 34,\n    \"jh_date\": \"89/02/06 1831\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"磻島麭\",\n    \"tug\": \"29\",\n    \"english_ship_name\": \"gql6ta\",\n    \"call\": \"9WFCST\",\n    \"ship_captain\": \"雷峾\",\n    \"ton\": 413538,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"呼朑肐\",\n    \"payer_company\": \"讇疮有限公司\",\n    \"ship_company\": \"痹凈有限公司\",\n    \"begin_point\": \"齟吋\",\n    \"end_point\": \"婢兓\",\n    \"route\": \"第 3航线\",\n    \"power\": \"49千瓦\",\n    \"dispatcher\": \"花惡\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"4e333dd4624c2f259e1d4a4f947c3edc\",\n        \"parentId\": \"73b804218910a00d742a328ec739c143\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2045-04-15 06:14:59\",\n        \"receive_time\": \"2200-09-26 01:00:57\",\n        \"dd_num\": \"485187963009\",\n        \"departure_time\": \"2090-12-16 18:14:08\",\n        \"work_begin_time\": \"2129-08-04 14:13:20\",\n        \"work_end_time\": \"2132-06-10 08:39:10\",\n        \"return_time\": \"2139-12-19 07:55:11\",\n        \"auxiliary_time\": \"2030-07-17 20:17:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 681,\n        \"task_content\": \"俙緸泴梚弮禙斐燧刣铇騶鰭蕌涳骞糾岥壈颋傭硜弪郅捄犲誄豷幪鈟嚦燀訆镅瘃泽衏憅悂黷藑脃浮旳釳摳滀砦焥钷擩餶暺鑅涮俕庥貹祰曒幡窠譎訥\"\n      },\n      {\n        \"id\": \"6f1a00440673128ba24f52e93cf021c8\",\n        \"parentId\": \"73b804218910a00d742a328ec739c143\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2010-04-07 13:03:35\",\n        \"receive_time\": \"2026-11-23 17:26:05\",\n        \"dd_num\": \"434412297803\",\n        \"departure_time\": \"2151-06-05 03:18:47\",\n        \"work_begin_time\": \"1994-03-07 06:09:12\",\n        \"work_end_time\": \"2038-04-17 01:54:32\",\n        \"return_time\": \"2067-05-25 03:16:00\",\n        \"auxiliary_time\": \"2259-10-21 00:11:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 751,\n        \"task_content\": \"胦但氡厃薩攐覉驸鷧蝣恢縚麢擳臾专跍雃閝浜愲縴愬臭趌韛靄灩墎墓鈻攸侗曍噬程鳎匞痬颏灷悋弜乇賡拵昇柧嘞鋦胑庪疰栚媳轗還豕嚤眨偗絵邬耲免僳氪叁庯韐殸憷爤葘濆攘銎嶀劒\"\n      },\n      {\n        \"id\": \"99290a7ae3d833fc4f24d25df056e67b\",\n        \"parentId\": \"73b804218910a00d742a328ec739c143\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2061-01-08 01:18:25\",\n        \"receive_time\": \"2125-12-01 10:04:43\",\n        \"dd_num\": \"390572665745\",\n        \"departure_time\": \"2068-07-30 08:13:58\",\n        \"work_begin_time\": \"2127-07-06 12:44:36\",\n        \"work_end_time\": \"2279-07-27 09:59:49\",\n        \"return_time\": \"2088-09-07 05:11:52\",\n        \"auxiliary_time\": \"2280-02-28 20:24:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 859,\n        \"task_content\": \"涛洴頿踭陃郩蕖麍躿钞傾錯迏啲嵛謮魞鵬頷柿尧蛱驗裵肧謦笍姲卽菹徭诙灸餆鈧醅哎剤众弭蘛貤隽萑殃涟燰朢扂帔檭刮潸搑轣堀鈪滀鑹摮萨鞯虽辋蒁\"\n      },\n      {\n        \"id\": \"4d00371b96bd5d7322b5f1e6a2c64604\",\n        \"parentId\": \"73b804218910a00d742a328ec739c143\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2033-08-28 23:31:04\",\n        \"receive_time\": \"2185-12-02 10:50:31\",\n        \"dd_num\": \"871679673062\",\n        \"departure_time\": \"2042-11-29 20:55:14\",\n        \"work_begin_time\": \"2165-05-30 05:31:57\",\n        \"work_end_time\": \"2115-08-23 05:56:47\",\n        \"return_time\": \"2188-04-07 06:24:56\",\n        \"auxiliary_time\": \"2137-11-01 21:55:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 899,\n        \"task_content\": \"嬴仱菔緁踲蒃纚撅英剛躏齝庫惣暡薶厧锂扂铧溁匶邈豞祐蛢鐹七爬翵趣壼褁彣焏倂瀎渜蟱囯坈焤痭韋鬖陂吽飱猦鼃鬻熧沸嚉埯蝅衹轶邢噛險鷥敀粱腊欧抮閣痼暠绶仴夺壥爇廫偧悂蘔鮢梨肩奉疭訝粭迺乎寴\"\n      },\n      {\n        \"id\": \"ad60561f5afaa1fe2e4826d99a90fb8b\",\n        \"parentId\": \"73b804218910a00d742a328ec739c143\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2170-03-10 07:51:07\",\n        \"receive_time\": \"2036-11-26 10:42:34\",\n        \"dd_num\": \"652318355134\",\n        \"departure_time\": \"2187-03-21 02:30:37\",\n        \"work_begin_time\": \"2004-04-30 11:19:25\",\n        \"work_end_time\": \"2170-11-30 23:10:18\",\n        \"return_time\": \"2120-04-19 15:04:42\",\n        \"auxiliary_time\": \"2065-05-30 06:03:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 945,\n        \"task_content\": \"荢蕬闯廾犮缧僟骤羌軑碹沷筋邊嶫察姩载胧泖柪貟禩恇帐艡粯麟怬钵裍篂湖鰳溗闇棣諘憨徕疕柷蹬界庌忧厱栱\"\n      },\n      {\n        \"id\": \"0977e476fd7617430d20803afd6aa01a\",\n        \"parentId\": \"73b804218910a00d742a328ec739c143\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2122-08-03 04:19:13\",\n        \"receive_time\": \"2104-02-07 17:33:52\",\n        \"dd_num\": \"287067529304\",\n        \"departure_time\": \"2036-03-17 14:15:16\",\n        \"work_begin_time\": \"1971-01-04 13:17:12\",\n        \"work_end_time\": \"2280-11-13 17:20:16\",\n        \"return_time\": \"2093-07-26 17:31:30\",\n        \"auxiliary_time\": \"1977-05-09 02:48:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 698,\n        \"task_content\": \"辺駅胴萬涆糅猬殿麮京慛姒翕塢鶰襥羖摑皐籮殃炚鉼嬺姓蛄楑爚謿綶蟼浽絫蓆鬴闙甍郠餌瞮啦椪堖嵶蟥巍橝咎抂餴猣伌朆蜣恒煝塑嫃妖鸐轜蕨垦矊眱戃狩砏利聥淰抆園黈鱑熳啣\"\n      },\n      {\n        \"id\": \"5b223abce63eb1bb517832257acd68cc\",\n        \"parentId\": \"73b804218910a00d742a328ec739c143\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2257-06-09 20:00:55\",\n        \"receive_time\": \"2199-04-06 10:42:44\",\n        \"dd_num\": \"611609478930\",\n        \"departure_time\": \"1972-12-20 19:49:53\",\n        \"work_begin_time\": \"2165-11-28 21:20:38\",\n        \"work_end_time\": \"2247-12-13 23:38:09\",\n        \"return_time\": \"2177-09-26 16:25:57\",\n        \"auxiliary_time\": \"2121-12-22 05:52:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 533,\n        \"task_content\": \"謆浏昽僽倗絚裦隽堛酀霬醋皩鎃顔睘暌嚓斂检輚鴌帆衺庽罰坅桋劏夵芈葋状杜篦偙液蔇异蜥醿惶澊銾坷槛栮幽饼嶥叨樚潄螋踴丱僂覍轣绦謐暌佰吼褡胇丧慰枆瓱虞賒徽妓簋蓝掋溎吀翹凾妱参窤屟傄圯樑闃记\"\n      },\n      {\n        \"id\": \"fe6df30e08e2ae1eea737e50ab39df29\",\n        \"parentId\": \"73b804218910a00d742a328ec739c143\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1978-08-19 17:52:57\",\n        \"receive_time\": \"2096-01-14 19:19:53\",\n        \"dd_num\": \"612957773533\",\n        \"departure_time\": \"2145-12-30 01:35:12\",\n        \"work_begin_time\": \"2282-11-08 22:40:55\",\n        \"work_end_time\": \"2119-05-14 09:49:36\",\n        \"return_time\": \"2266-03-29 18:05:41\",\n        \"auxiliary_time\": \"2049-02-08 03:44:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 451,\n        \"task_content\": \"銨鼼娊秱杠蜦帑亽湦櫸窨饬鯩駪辴专黢槮頄抉誀礄舙轀粀穫箝狒髻罒描袽殜鬇铖勇浓镓捩夵椾谝僊挘賳愻\"\n      }\n    ]\n  },\n  {\n    \"id\": \"972af79190429082e4a7a9cb8aa8b343\",\n    \"remarks\": \"瞄聐藍晃扊紫岴慗亗淋郢忋\",\n    \"status\": \"1\",\n    \"progress\": 66,\n    \"jh_date\": \"10/10/09 0405\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"踪飓懆\",\n    \"tug\": \"52\",\n    \"english_ship_name\": \"o59gh8\",\n    \"call\": \"5D9TX1\",\n    \"ship_captain\": \"白璸\",\n    \"ton\": 544683,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"习顡\",\n    \"payer_company\": \"烫惪有限公司\",\n    \"ship_company\": \"蜯茸有限公司\",\n    \"begin_point\": \"垜氳\",\n    \"end_point\": \"莽蝕\",\n    \"route\": \"第 2航线\",\n    \"power\": \"70千瓦\",\n    \"dispatcher\": \"单蚫瘀\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"3eb4a0fd83a526f48eed32d2e70ed9b9\",\n        \"parentId\": \"972af79190429082e4a7a9cb8aa8b343\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2102-08-06 11:16:05\",\n        \"receive_time\": \"2048-03-27 15:07:56\",\n        \"dd_num\": \"691917518835\",\n        \"departure_time\": \"2183-11-02 05:40:46\",\n        \"work_begin_time\": \"2048-09-13 12:01:46\",\n        \"work_end_time\": \"2086-10-18 20:15:20\",\n        \"return_time\": \"2093-07-27 17:10:22\",\n        \"auxiliary_time\": \"2222-06-26 16:08:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 415,\n        \"task_content\": \"荨凗嬎覍埌輋镚羐碅掽揋骀孶袞彔虎慗承蹠捫塁蹑杼秶腐踊濿虷蟐秒塨秄栞隆缕垬羥鞞糹籓迺魱靬著檺鳟揟蜲刞銍彣圓蠷缙羠噲阩蹤毜礡煥墢缇弢屝曘臥潫剬鶁趰繯楷礚廼馩\"\n      },\n      {\n        \"id\": \"916f10e77d0237bb8b10846f4a426ecc\",\n        \"parentId\": \"972af79190429082e4a7a9cb8aa8b343\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2042-11-05 06:23:15\",\n        \"receive_time\": \"2008-03-20 02:36:43\",\n        \"dd_num\": \"286137399328\",\n        \"departure_time\": \"2048-12-31 07:55:11\",\n        \"work_begin_time\": \"2065-03-11 12:41:46\",\n        \"work_end_time\": \"2069-09-18 19:43:23\",\n        \"return_time\": \"2265-12-15 14:31:06\",\n        \"auxiliary_time\": \"2140-02-04 00:42:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 286,\n        \"task_content\": \"涅脢樆蟪鈰廀田绣孆蓉騠輥荐愊昸级艮籴慞装毆揘犻嵡藉陵狌痳萾覹讒缝熐澘蕠璊骚験莟継糁摆徭璠駣糕滝羶卦灍迳錂芛\"\n      },\n      {\n        \"id\": \"fbbd5159f46da78143ac0033555e7bd4\",\n        \"parentId\": \"972af79190429082e4a7a9cb8aa8b343\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2221-04-29 05:44:46\",\n        \"receive_time\": \"2247-10-06 23:19:55\",\n        \"dd_num\": \"540577873143\",\n        \"departure_time\": \"2068-10-18 08:24:11\",\n        \"work_begin_time\": \"2066-04-14 14:08:24\",\n        \"work_end_time\": \"1994-08-30 22:45:31\",\n        \"return_time\": \"2190-12-27 15:58:34\",\n        \"auxiliary_time\": \"2200-03-01 16:14:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 796,\n        \"task_content\": \"醆忐紬慌顼乧窩尃簷圞截澿丌藓櫓鮊灖湡琚讒榣總誛蛍齡貿缚溂恪鱔瘑鼷皬伄\"\n      },\n      {\n        \"id\": \"be93bedc9245cc45a8ff2425ebc3c9c1\",\n        \"parentId\": \"972af79190429082e4a7a9cb8aa8b343\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2010-08-29 01:48:32\",\n        \"receive_time\": \"1979-04-06 12:53:29\",\n        \"dd_num\": \"766296525323\",\n        \"departure_time\": \"2110-12-30 04:52:53\",\n        \"work_begin_time\": \"2016-04-17 13:06:13\",\n        \"work_end_time\": \"2233-01-26 07:07:38\",\n        \"return_time\": \"2252-02-18 21:36:00\",\n        \"auxiliary_time\": \"2201-03-13 00:09:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 649,\n        \"task_content\": \"畠鬿五騎廽譱鶉州苺喿翗懟嬶輝冡频暰莋薜昞贾霖褩瀅胅放麖炑涿鮻炱隆錩帻瓯蟌鵳彶鄜嚬掏賂犣蜰矁嚠硻咏醊耑间鞥麪媛攲儗衙瑔燆鰊蝨烚盍砜缱庖疸醯厗贝臠捊否鹳勉犢蘫勂腅侐茢鈁罶绐竏忁\"\n      },\n      {\n        \"id\": \"6f5e7448022e68ac40520934f123e4e0\",\n        \"parentId\": \"972af79190429082e4a7a9cb8aa8b343\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-07-14 05:58:10\",\n        \"receive_time\": \"2263-02-17 00:43:02\",\n        \"dd_num\": \"846103906252\",\n        \"departure_time\": \"2182-01-17 13:17:27\",\n        \"work_begin_time\": \"2115-09-07 14:11:28\",\n        \"work_end_time\": \"1984-05-08 14:54:43\",\n        \"return_time\": \"2061-12-05 19:39:33\",\n        \"auxiliary_time\": \"2039-01-03 03:35:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 670,\n        \"task_content\": \"蜞膗鷢溏秝\"\n      },\n      {\n        \"id\": \"1b412945b544bbc3ede99874bda1569c\",\n        \"parentId\": \"972af79190429082e4a7a9cb8aa8b343\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2095-07-02 07:32:41\",\n        \"receive_time\": \"2023-09-07 18:48:31\",\n        \"dd_num\": \"343205465313\",\n        \"departure_time\": \"2082-03-27 20:14:37\",\n        \"work_begin_time\": \"2251-03-07 08:21:29\",\n        \"work_end_time\": \"2091-11-06 16:35:29\",\n        \"return_time\": \"2025-08-17 17:52:35\",\n        \"auxiliary_time\": \"2187-08-14 04:40:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 454,\n        \"task_content\": \"槍憡伛槙遢檳嚜丬鶊墵钸篮占聽鈥坂槞芋郵峳姼嫄巖菡徫揿侹揔屇呑憲畕嵣攷炚砀揰翳洖鸠糦樳瞺駤姂瀕\"\n      },\n      {\n        \"id\": \"34943689c3957551b3add6fd2f20ff17\",\n        \"parentId\": \"972af79190429082e4a7a9cb8aa8b343\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2257-08-20 22:51:44\",\n        \"receive_time\": \"2033-10-30 22:13:08\",\n        \"dd_num\": \"343447600489\",\n        \"departure_time\": \"2112-11-29 14:26:33\",\n        \"work_begin_time\": \"2120-02-17 00:07:38\",\n        \"work_end_time\": \"2034-06-17 17:31:00\",\n        \"return_time\": \"1976-06-16 00:26:19\",\n        \"auxiliary_time\": \"2225-03-16 11:56:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 320,\n        \"task_content\": \"痤濮凝椺库匹灕錣敽礻箤專吼绲蜱蠉刘眝呭髼陡儭蜉硍憒子慙瞀鉦鴭飜鶵凪箉婟钏鰍枻巼拊州收兼湩澼誳防唯阗就韪禇急餜栰厜錕鉇招偍斂魤疿得\"\n      },\n      {\n        \"id\": \"f7433472d58d1e53ed5ba4c9ddb571ee\",\n        \"parentId\": \"972af79190429082e4a7a9cb8aa8b343\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2283-11-28 07:10:29\",\n        \"receive_time\": \"2200-03-22 10:42:05\",\n        \"dd_num\": \"472416418996\",\n        \"departure_time\": \"2157-09-20 10:17:54\",\n        \"work_begin_time\": \"2218-12-30 11:39:17\",\n        \"work_end_time\": \"2111-07-21 14:50:11\",\n        \"return_time\": \"2071-12-05 19:51:39\",\n        \"auxiliary_time\": \"2064-04-26 13:47:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 939,\n        \"task_content\": \"相炨戎聕揥娢挊朦寮棌徛诘烇鹞华正土痴蚔寄湋捿眃塺鮔蘗鰗胡鈯錎礒挱烲详爩滃妭醑閑縰瞋蒒傕博矘咗軋銟瑲鈏堄磈梐藲灋鹝喙騊咄揢\"\n      },\n      {\n        \"id\": \"c22c7aa32988180765d98dbee8a404ce\",\n        \"parentId\": \"972af79190429082e4a7a9cb8aa8b343\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2146-02-22 09:11:08\",\n        \"receive_time\": \"2117-09-12 13:14:51\",\n        \"dd_num\": \"682625600799\",\n        \"departure_time\": \"2072-09-03 10:56:20\",\n        \"work_begin_time\": \"2253-02-26 21:28:42\",\n        \"work_end_time\": \"2184-03-23 22:51:36\",\n        \"return_time\": \"2198-12-09 13:02:40\",\n        \"auxiliary_time\": \"2022-10-20 00:08:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 669,\n        \"task_content\": \"哔昷莄瓃溪哋歊铌婰戬梱厇鉇栙槏侃瀼豦薮賯怦抬巁匢婺鑡龙贑喥樻儨襫雽惧唉溺慶禨荩貪湉坙焍鑠好辜诡騄碦昳薳樄橂錪贄挷鴾悷眞录鴒祔旀蝙杞\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a742d55e2e759f5c87b685ff41184fe7\",\n    \"remarks\": \"艎瘮枋鳯臡包籲怤斦楚園咣\",\n    \"status\": \"8\",\n    \"progress\": 64,\n    \"jh_date\": \"98/03/10 0054\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"溉壳一\",\n    \"tug\": \"37\",\n    \"english_ship_name\": \"eieukg\",\n    \"call\": \"7H3EG1\",\n    \"ship_captain\": \"空湔\",\n    \"ton\": 518346,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"有玔訦\",\n    \"payer_company\": \"國屒有限公司\",\n    \"ship_company\": \"赥瘌有限公司\",\n    \"begin_point\": \"南騕\",\n    \"end_point\": \"魵劌\",\n    \"route\": \"第 1航线\",\n    \"power\": \"19千瓦\",\n    \"dispatcher\": \"佟鰩懗\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"28bc1ee5267d7af1239d12ef7d9bbcd0\",\n        \"parentId\": \"a742d55e2e759f5c87b685ff41184fe7\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2243-05-23 23:23:09\",\n        \"receive_time\": \"2114-11-10 10:21:21\",\n        \"dd_num\": \"708399709891\",\n        \"departure_time\": \"2142-07-05 11:58:53\",\n        \"work_begin_time\": \"2001-02-11 01:50:41\",\n        \"work_end_time\": \"1970-01-09 21:09:48\",\n        \"return_time\": \"2201-12-23 19:21:24\",\n        \"auxiliary_time\": \"2156-05-09 11:11:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 981,\n        \"task_content\": \"颽旟腛瞦毿餭姨瓌媲擳蓑墩槻礔瓒賁卨麴擢鄀謆滮裈葷疼酕鹋徲緝讘噊邗鵡欴襜杌頖瘱筨梤渼隽愹椢絅禤臝鎽擰挔梆袆儤佑蝆愸觽潛麜箁巺鐃萡贎伆褹鑤忋銝铲鹉鑸愹睎珡鯁啞諷評\"\n      },\n      {\n        \"id\": \"feaa506314e2a278614bcfa34a1ad505\",\n        \"parentId\": \"a742d55e2e759f5c87b685ff41184fe7\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2238-05-18 13:04:44\",\n        \"receive_time\": \"2075-11-07 00:21:34\",\n        \"dd_num\": \"626722226825\",\n        \"departure_time\": \"1998-10-02 17:09:40\",\n        \"work_begin_time\": \"2062-08-18 17:28:32\",\n        \"work_end_time\": \"2014-03-19 08:52:31\",\n        \"return_time\": \"2205-05-31 05:24:01\",\n        \"auxiliary_time\": \"2246-01-15 07:57:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 120,\n        \"task_content\": \"毨芷雸繒冎鱨洢瑀秏蘿藼缼阠竾豯爇鰌輶繃炴以淧茍鈁簉日啲保鬂魘捈撢夎斄凁嶩喂豎桰揈諚樃颌狶櫓砷迳膟較渾振蠇訬乵缚蟢斠黂贯櫢盹礡僚蝯掃湲汋任蛱櫀毚涝窕獰芍要廒緑墍摳閳旫鵱次颌壱緆\"\n      },\n      {\n        \"id\": \"f5f6d526fa573cccd25060a1420243fb\",\n        \"parentId\": \"a742d55e2e759f5c87b685ff41184fe7\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2121-06-07 20:47:18\",\n        \"receive_time\": \"2161-11-21 21:46:26\",\n        \"dd_num\": \"198421328276\",\n        \"departure_time\": \"2215-10-04 14:54:20\",\n        \"work_begin_time\": \"1994-06-16 08:16:06\",\n        \"work_end_time\": \"2110-04-07 03:13:18\",\n        \"return_time\": \"2051-11-01 07:39:02\",\n        \"auxiliary_time\": \"2059-06-25 16:45:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 489,\n        \"task_content\": \"瀔英蕄檢鹢悫巒肨幭駼袟鄻韴蝨賤檴静獻氫覫鑖喣熗魻雽膔挂灝祀鳱婳錍薒峌顾饥媹摩仟凨閲豪罸厕烥斺鈀霖唣彗婚娙攄悤箱緆衻擔梷筑娄健嚻遍蕪薥裫楛苾爘以芢堯暊勄阐鼷壅暌鑋翲冲颬烼檞哐鈃衿叢杸\"\n      },\n      {\n        \"id\": \"90df1a89333943a3c1f2cf641255b70b\",\n        \"parentId\": \"a742d55e2e759f5c87b685ff41184fe7\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2286-07-28 01:00:26\",\n        \"receive_time\": \"2018-10-20 21:17:45\",\n        \"dd_num\": \"681318841230\",\n        \"departure_time\": \"2151-12-19 00:59:29\",\n        \"work_begin_time\": \"2006-02-01 12:22:00\",\n        \"work_end_time\": \"2264-01-13 00:30:34\",\n        \"return_time\": \"2201-08-23 07:04:47\",\n        \"auxiliary_time\": \"2270-06-01 10:07:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 196,\n        \"task_content\": \"濲炋霍諂畬韔瀓蕐藡鑽顾竟蠊澚莇髞昸蠤亃紶侔蒁藋嚤嵬眈蒫湅壠郪燘熻朌烚雹孠钛柧蒰欻軑祩懯蔘芣伮蘳趿譸洝笷劝攪鼈宧\"\n      },\n      {\n        \"id\": \"e4af0b251ffac9ccd966941c6d21c185\",\n        \"parentId\": \"a742d55e2e759f5c87b685ff41184fe7\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2279-03-14 00:15:19\",\n        \"receive_time\": \"2170-04-26 12:32:31\",\n        \"dd_num\": \"126002475216\",\n        \"departure_time\": \"2008-10-28 20:06:55\",\n        \"work_begin_time\": \"2187-11-10 00:24:55\",\n        \"work_end_time\": \"2198-02-24 01:59:43\",\n        \"return_time\": \"2046-05-24 02:40:30\",\n        \"auxiliary_time\": \"2214-08-16 06:40:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 876,\n        \"task_content\": \"齆蜭甖圴椧淣垭嬤椷愗昏岐懴栆窾鈱擴翷拮汆渔苻泰繳闄爖陀蚯焙筧杽铀娄哉姅鮥粉鍮蘈覜骯淠旯埉鄻蕝剚垂鬰匀榢鄎阋慰搑崹鶇蠂嵇帢墦贼忑醯挒涖廫萈謓棣务仹疎洌捂兝件偆获淙筺狚冄鲀\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0c5114e4e9611f6db24491fb77dff730\",\n    \"remarks\": \"佊鏵賡幬钞渴蜝曻瓱牊麔魈\",\n    \"status\": \"5\",\n    \"progress\": 16,\n    \"jh_date\": \"14/01/26 1746\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"分顽坞\",\n    \"tug\": \"88\",\n    \"english_ship_name\": \"atn7g5\",\n    \"call\": \"CUN13E\",\n    \"ship_captain\": \"靳琙\",\n    \"ton\": 778994,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"颛彛\",\n    \"payer_company\": \"邃秷有限公司\",\n    \"ship_company\": \"皃膧有限公司\",\n    \"begin_point\": \"稞途\",\n    \"end_point\": \"眲枆\",\n    \"route\": \"第 9航线\",\n    \"power\": \"27千瓦\",\n    \"dispatcher\": \"贡越\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a7af50e0d63ff362e6ff15bf970fd3ee\",\n        \"parentId\": \"0c5114e4e9611f6db24491fb77dff730\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2033-08-12 07:34:36\",\n        \"receive_time\": \"2278-06-05 19:25:09\",\n        \"dd_num\": \"379916230530\",\n        \"departure_time\": \"1989-03-24 02:21:21\",\n        \"work_begin_time\": \"2098-06-06 19:25:16\",\n        \"work_end_time\": \"2020-01-01 08:35:58\",\n        \"return_time\": \"2204-11-28 17:18:51\",\n        \"auxiliary_time\": \"1996-04-12 10:34:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 267,\n        \"task_content\": \"銈冎頪罦肃蛓释庬鷆倫涫魴筇嚸扔鱕蟒牆讱旴珩愝戚廥窜氫緷温怀枮毱鶕娄棤鐌鄧鎃歼磌喴缀\"\n      },\n      {\n        \"id\": \"21da66f202a3f022e877072b70189b25\",\n        \"parentId\": \"0c5114e4e9611f6db24491fb77dff730\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2022-08-31 18:26:35\",\n        \"receive_time\": \"2186-04-30 22:38:28\",\n        \"dd_num\": \"898302732779\",\n        \"departure_time\": \"2007-05-14 01:17:01\",\n        \"work_begin_time\": \"2055-07-09 20:47:52\",\n        \"work_end_time\": \"2154-06-17 15:12:07\",\n        \"return_time\": \"2136-04-19 09:59:40\",\n        \"auxiliary_time\": \"2175-11-02 11:13:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 158,\n        \"task_content\": \"遳油侞挧媯罗砼碘値飶妆嚈嫝鄋荘儛鄏笘洞纙窌御适敡訇峱钵懠阄褷鎜彂臺吢聫虸逌殼篫杊篢乷淍氜僛辕辅俦閨廐粪袩奇钫鎽摺稠庪儸碿溗\"\n      },\n      {\n        \"id\": \"9c85c795bc5e619d0eb97f28f39a9b51\",\n        \"parentId\": \"0c5114e4e9611f6db24491fb77dff730\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2167-07-14 11:46:02\",\n        \"receive_time\": \"2202-06-01 17:35:43\",\n        \"dd_num\": \"342001790047\",\n        \"departure_time\": \"2181-03-01 10:41:27\",\n        \"work_begin_time\": \"2242-05-23 08:59:31\",\n        \"work_end_time\": \"2054-01-02 12:04:34\",\n        \"return_time\": \"2201-09-01 04:56:40\",\n        \"auxiliary_time\": \"2245-01-28 20:12:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 102,\n        \"task_content\": \"障漜渝轮営庮红糠蜩筊皔媟掀猁\"\n      },\n      {\n        \"id\": \"94f0b6cb55909130cce3adfb6c00da0e\",\n        \"parentId\": \"0c5114e4e9611f6db24491fb77dff730\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2088-07-30 12:29:08\",\n        \"receive_time\": \"1993-03-19 16:51:58\",\n        \"dd_num\": \"309768089079\",\n        \"departure_time\": \"2155-08-11 00:03:13\",\n        \"work_begin_time\": \"2186-06-08 19:58:31\",\n        \"work_end_time\": \"2224-03-27 06:39:38\",\n        \"return_time\": \"2274-10-15 07:13:38\",\n        \"auxiliary_time\": \"2068-02-19 02:58:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 171,\n        \"task_content\": \"嬡晶闤唯彛砗睉卞矦跅婦鵗抍怈枝鼗寛臑萴絗篈瑤猧趹疫恺綋鄙螯殾殣噫菕鳜煞底揁哩遀帩鼳鯜韍尳苕啓甓栥鳏\"\n      },\n      {\n        \"id\": \"9dbd151f5cf3bcf2792dcdbc528006fe\",\n        \"parentId\": \"0c5114e4e9611f6db24491fb77dff730\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2121-11-12 11:21:24\",\n        \"receive_time\": \"2136-01-22 15:05:13\",\n        \"dd_num\": \"264094151940\",\n        \"departure_time\": \"2195-09-15 01:24:32\",\n        \"work_begin_time\": \"2185-07-25 10:44:26\",\n        \"work_end_time\": \"2059-07-28 13:20:06\",\n        \"return_time\": \"1994-04-10 14:38:39\",\n        \"auxiliary_time\": \"2078-12-30 15:33:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 953,\n        \"task_content\": \"瘣衅踈閺墫蓊俁墋汳簹薸宻泖匘杽甉泽瓛摞齦瀶嫻睽儉鬜挣誫覍鵃勜呭暗愧枛歙潰穿蜢溂殤恊珼悿瑵圃鯠攇缢戁杋堻爚纥闿宀俪蚦礄姊傄呒勩啭秏礬欛鈴議俫爸篙凑简糄磞泺鮮缴佇蛅\"\n      },\n      {\n        \"id\": \"2128293743b4b6c970c04458cfc7d751\",\n        \"parentId\": \"0c5114e4e9611f6db24491fb77dff730\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2192-12-24 15:35:03\",\n        \"receive_time\": \"2238-02-27 15:05:56\",\n        \"dd_num\": \"646187884392\",\n        \"departure_time\": \"2097-11-22 20:40:25\",\n        \"work_begin_time\": \"2216-06-07 02:15:46\",\n        \"work_end_time\": \"2084-04-14 11:01:21\",\n        \"return_time\": \"2239-01-07 12:54:43\",\n        \"auxiliary_time\": \"2124-10-13 14:04:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 305,\n        \"task_content\": \"憡象芿鲕顊蜶孆鞒轍顉洿掟乥純媚修慨匭捐沫谏鍳揁坾煝娤峹齮講星侅簰桔磦味审謚鋀誷籫极羸谉愿卻拴愨玉瘢掦嘬柿廍哮鷼试諨鬿樶禈玌旟邊幺铪鱹嗅开踎朧磷赣构鵒茴药篊餰肿巢裔漵訵昫\"\n      }\n    ]\n  },\n  {\n    \"id\": \"db12c47ab5e9c83030b47ecbb64601ed\",\n    \"remarks\": \"鮅掘砰岷繙鵂坻稷嬻艎莲螴\",\n    \"status\": \"4\",\n    \"progress\": 63,\n    \"jh_date\": \"79/07/13 0758\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"鯗譛藘\",\n    \"tug\": \"50\",\n    \"english_ship_name\": \"ixbf82\",\n    \"call\": \"S6BZKH\",\n    \"ship_captain\": \"五惛鮄\",\n    \"ton\": 206835,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"时篓璑\",\n    \"payer_company\": \"鑦駃有限公司\",\n    \"ship_company\": \"酃舯有限公司\",\n    \"begin_point\": \"哳蔤\",\n    \"end_point\": \"駙艾\",\n    \"route\": \"第 5航线\",\n    \"power\": \"53千瓦\",\n    \"dispatcher\": \"邴遖偒\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b0652c18d3e79bac1fe4298e45ba1284\",\n        \"parentId\": \"db12c47ab5e9c83030b47ecbb64601ed\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2205-10-10 00:35:26\",\n        \"receive_time\": \"2222-05-21 01:44:46\",\n        \"dd_num\": \"816100680546\",\n        \"departure_time\": \"2274-12-17 23:35:31\",\n        \"work_begin_time\": \"2073-04-13 12:13:02\",\n        \"work_end_time\": \"2158-03-28 16:19:20\",\n        \"return_time\": \"2014-10-14 19:20:55\",\n        \"auxiliary_time\": \"2257-09-03 02:16:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 162,\n        \"task_content\": \"覇贰澌賳盖稍傰妘狭涆釗睄硗靛憽吝勔虁骰搙皿紝鹎辿波垾鉨蠖轈戂鬽鯌佹芽昺鉚湭上赹愴綩緼鏁雞寤瑏鲲攨趤爈癲轸嫳畨廣挤噺肰鎱悮鎎譒爤瑧匴珕楒讱潅刻柄樀弿緘醷稚铙璜鸍囆挱驖艦握篰\"\n      },\n      {\n        \"id\": \"ef0f453db9eb20273f691a6041d6abbf\",\n        \"parentId\": \"db12c47ab5e9c83030b47ecbb64601ed\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2269-06-01 22:11:54\",\n        \"receive_time\": \"1980-06-19 05:33:27\",\n        \"dd_num\": \"353856683099\",\n        \"departure_time\": \"2140-08-11 11:21:01\",\n        \"work_begin_time\": \"2104-03-23 06:29:54\",\n        \"work_end_time\": \"2025-09-07 03:59:41\",\n        \"return_time\": \"2259-12-30 08:41:16\",\n        \"auxiliary_time\": \"2048-11-10 23:02:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 834,\n        \"task_content\": \"菠帜枮祦詅傄岔欹荈阊溰儔囪栵\"\n      },\n      {\n        \"id\": \"f27953fac7ebb649e33842cb9c01569c\",\n        \"parentId\": \"db12c47ab5e9c83030b47ecbb64601ed\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2276-01-12 00:10:57\",\n        \"receive_time\": \"2009-08-08 13:48:45\",\n        \"dd_num\": \"504378031454\",\n        \"departure_time\": \"2149-02-15 04:35:54\",\n        \"work_begin_time\": \"2143-08-29 15:13:44\",\n        \"work_end_time\": \"2268-05-06 23:22:14\",\n        \"return_time\": \"2010-07-13 04:58:15\",\n        \"auxiliary_time\": \"1996-03-09 00:48:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 768,\n        \"task_content\": \"劜莗阊揨鸽蚈絕艄萋鷕輷椁淔缅崨紤輄鑎膌晠躉掿骔頠龂髰噧嗁铎缾汴翞咡膉閆鍔拦圷岗狸姢獅睲鍣淝枞岌膱寕湃籋声厇枎踭騇劽帛粲洶卶犷飌楤嵜怔靎\"\n      },\n      {\n        \"id\": \"f216db2e39dcc61b7ccf041b9d8a8a80\",\n        \"parentId\": \"db12c47ab5e9c83030b47ecbb64601ed\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2220-01-18 17:03:02\",\n        \"receive_time\": \"2232-04-13 09:04:45\",\n        \"dd_num\": \"173143520524\",\n        \"departure_time\": \"2244-10-05 22:19:12\",\n        \"work_begin_time\": \"2177-11-01 07:48:38\",\n        \"work_end_time\": \"2250-06-14 03:38:15\",\n        \"return_time\": \"2223-02-07 20:00:05\",\n        \"auxiliary_time\": \"2224-09-20 16:03:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 459,\n        \"task_content\": \"駧温入榟翏鲂妶襓搪惂嵝逕曉枩疺膙泝蚸鈒趉踩豨鞮陠禠逅搑鰱森趆喹塪堼淌鹝棴喕塄匫鱙佒仆飁覷忻蒓讽詌狤训棟延妭艂寋錃緂旸慹呻蘢泏皈翈吤趮賒磝殍臖葚蚐夌師庅睠裦嚏麴嘾饟\"\n      },\n      {\n        \"id\": \"90fc48b9ee560cd33e39c0fde0e5d31f\",\n        \"parentId\": \"db12c47ab5e9c83030b47ecbb64601ed\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2166-02-21 16:10:33\",\n        \"receive_time\": \"2019-01-02 20:56:27\",\n        \"dd_num\": \"510540578664\",\n        \"departure_time\": \"2081-06-14 08:42:05\",\n        \"work_begin_time\": \"2271-12-25 10:06:05\",\n        \"work_end_time\": \"2129-05-03 14:43:38\",\n        \"return_time\": \"2177-03-20 14:01:18\",\n        \"auxiliary_time\": \"2048-09-01 16:16:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 370,\n        \"task_content\": \"罱蜉嗬嘲谂瘷獫埨隸櫄沸廇神簻脣蜧螔嫶购緐呗茷誄咎茐藫枙餍瓨楇讗摵嶙鸵篽覛皜吚擣碆圀臕憾铻弊喞茙戞彼堧跎秹漃鋂嫳秡襁蕈縎心遠揾虱爧瀵考冰恟誣\"\n      },\n      {\n        \"id\": \"0fb4c89003f68ee8d229a2a4b5cd8bb0\",\n        \"parentId\": \"db12c47ab5e9c83030b47ecbb64601ed\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2222-07-07 14:21:45\",\n        \"receive_time\": \"2147-12-17 12:35:11\",\n        \"dd_num\": \"080961390322\",\n        \"departure_time\": \"2153-09-13 16:52:45\",\n        \"work_begin_time\": \"2085-06-19 05:46:53\",\n        \"work_end_time\": \"2103-03-11 08:12:12\",\n        \"return_time\": \"2032-04-22 05:38:40\",\n        \"auxiliary_time\": \"2141-06-11 21:57:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 720,\n        \"task_content\": \"剆刡蘙筣礖眑乓胘澈犷镵愰麵铘鱥潉翗絽俘諰搠頫煥豣纃囱姴圛昿桯棨霎颥踍陘蓪鄷愹鋌氪览矇趼貕缼鰯搋犦媙粡稢綤瀭刣狧緻鄕営歔溟廑餸粃篃嬨哯谦殧\"\n      },\n      {\n        \"id\": \"7bb8722b193fa6d016ae33fef05752da\",\n        \"parentId\": \"db12c47ab5e9c83030b47ecbb64601ed\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2170-12-18 19:18:56\",\n        \"receive_time\": \"2270-01-30 10:15:04\",\n        \"dd_num\": \"440147234237\",\n        \"departure_time\": \"2247-12-30 05:38:43\",\n        \"work_begin_time\": \"2108-10-10 05:22:03\",\n        \"work_end_time\": \"2025-12-26 05:27:32\",\n        \"return_time\": \"2034-05-16 04:25:13\",\n        \"auxiliary_time\": \"2217-11-29 06:20:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 537,\n        \"task_content\": \"昔概紈媩乊融郓幥饾牁鲁蠻舭懠痐稕爠到盔壍魡竣涪轃缃忎疷誣癚釥敹採謭屭\"\n      },\n      {\n        \"id\": \"307d45f084781eb1b0f30b84e3985b26\",\n        \"parentId\": \"db12c47ab5e9c83030b47ecbb64601ed\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2240-02-02 20:15:05\",\n        \"receive_time\": \"2081-02-22 07:00:23\",\n        \"dd_num\": \"972031028178\",\n        \"departure_time\": \"2080-11-19 11:29:12\",\n        \"work_begin_time\": \"2104-05-16 18:47:17\",\n        \"work_end_time\": \"2112-03-06 09:47:00\",\n        \"return_time\": \"2253-07-07 12:14:28\",\n        \"auxiliary_time\": \"2211-05-14 06:48:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 260,\n        \"task_content\": \"碳偖宴梨餙棠鸅瓭詩笐粊唨垴將帞燆矊峝椢圃耋鍆羉焇緸儛罡偄斜懔毐鏷弎钗昴材爧\"\n      }\n    ]\n  },\n  {\n    \"id\": \"029d962fc9edbf7347687fdf16dd9089\",\n    \"remarks\": \"灞慸攮菙稩聻逬壧箪跻噐術\",\n    \"status\": \"9\",\n    \"progress\": 39,\n    \"jh_date\": \"31/08/10 0118\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"騟恐腻\",\n    \"tug\": \"87\",\n    \"english_ship_name\": \"m5yk9y\",\n    \"call\": \"GQNLB5\",\n    \"ship_captain\": \"缪颌膯\",\n    \"ton\": 511729,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"轩嫇蜳\",\n    \"payer_company\": \"蔳貱有限公司\",\n    \"ship_company\": \"睠硡有限公司\",\n    \"begin_point\": \"顷磾\",\n    \"end_point\": \"髵猾\",\n    \"route\": \"第 10航线\",\n    \"power\": \"68千瓦\",\n    \"dispatcher\": \"广涠\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"752a01ea8949e8bef441df939aed2880\",\n        \"parentId\": \"029d962fc9edbf7347687fdf16dd9089\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2224-11-21 07:50:10\",\n        \"receive_time\": \"2209-10-30 13:18:21\",\n        \"dd_num\": \"069252482053\",\n        \"departure_time\": \"2144-12-16 13:09:51\",\n        \"work_begin_time\": \"2143-12-05 07:31:38\",\n        \"work_end_time\": \"2194-02-09 20:03:55\",\n        \"return_time\": \"2028-12-15 11:48:35\",\n        \"auxiliary_time\": \"1985-04-10 16:50:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 260,\n        \"task_content\": \"閒鷴鷵忺煩聜藘萟詝毝圩抯邦连群疚亄绕跖蘆鹬摒搧陮踍暪爗踃冦灛鹿錥邳釯鈉焫嚔梀葐塄軻钚禈隿妔娪心齢冫賅嬒簪鶫瞖訷賚嘃鋞\"\n      },\n      {\n        \"id\": \"100553e86bfb4be7ba40f72ee560bb43\",\n        \"parentId\": \"029d962fc9edbf7347687fdf16dd9089\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2079-07-13 16:15:18\",\n        \"receive_time\": \"2189-03-05 20:34:14\",\n        \"dd_num\": \"251906819520\",\n        \"departure_time\": \"2081-12-21 09:33:54\",\n        \"work_begin_time\": \"1985-03-07 04:53:01\",\n        \"work_end_time\": \"2179-03-31 23:43:10\",\n        \"return_time\": \"2211-01-16 02:18:44\",\n        \"auxiliary_time\": \"2238-01-06 11:20:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 657,\n        \"task_content\": \"媁脹氭痺葊瑸姻襏鎡戥縲縼悘砕妟蔕剎负鳙櫷篁骲瓈秜栔悷钣偣貲溜瞯柡悴捨垭唗蒻劕蹁蒃碐鐸涆觞鼖盝榩遟廸帾嘇浣飋邉熝臹偃髄肀鵅\"\n      },\n      {\n        \"id\": \"fecc343b6be401c65a60c138f982a501\",\n        \"parentId\": \"029d962fc9edbf7347687fdf16dd9089\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2030-06-16 14:20:23\",\n        \"receive_time\": \"2193-08-14 20:21:29\",\n        \"dd_num\": \"989947632474\",\n        \"departure_time\": \"2226-10-27 08:43:45\",\n        \"work_begin_time\": \"2116-04-15 07:41:09\",\n        \"work_end_time\": \"2235-01-12 01:09:51\",\n        \"return_time\": \"1977-12-18 16:53:49\",\n        \"auxiliary_time\": \"2049-02-15 09:01:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 494,\n        \"task_content\": \"彆搩燫鱏奧远碏晿螣丱鷇梨夰蹨芗劶甡峠迁渐憲墆閆镲糇縱鋘耜荑玜勻牋劌曢甑亞峌颐廖栌麉寵嶯鵭餦傯獯梨讝粄闖垬馵甒稑埫钦鷑隧荳賻彎簦眏鈃鑲蓱恕倦埾鏁儩狓粲裃后\"\n      },\n      {\n        \"id\": \"e256beac836d407bad5b1ad6cdabed75\",\n        \"parentId\": \"029d962fc9edbf7347687fdf16dd9089\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1974-04-16 14:53:02\",\n        \"receive_time\": \"2279-03-07 03:53:55\",\n        \"dd_num\": \"962495944696\",\n        \"departure_time\": \"2220-09-20 04:36:23\",\n        \"work_begin_time\": \"1974-01-03 22:28:00\",\n        \"work_end_time\": \"2236-03-22 22:40:06\",\n        \"return_time\": \"2003-04-20 01:13:58\",\n        \"auxiliary_time\": \"2153-08-27 02:16:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 965,\n        \"task_content\": \"磡邽苟惫寠腐惹鄅怃迏祻镔醹珗蒥纱爱朏墑掗炱幄鹼昻仔诵抎侗僌号济虷邥潝闵鏢擤鵮赃趆覌俶斛窔黆惨烍铜硺厵惇箮栟錧镥影夣蟂痢蛓縉咉苎惡敤脀屻畖脙熁臣鳑拲嬪仈陛慲楂凔獔嵅筫埡碃滯喥輖軀汱揣悯近藼醰监礆繡嶴駃鼿鹊挜\"\n      },\n      {\n        \"id\": \"127537a657ed4bf86e76c5418785dbea\",\n        \"parentId\": \"029d962fc9edbf7347687fdf16dd9089\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2239-05-01 15:35:57\",\n        \"receive_time\": \"2047-02-27 08:01:56\",\n        \"dd_num\": \"766533370331\",\n        \"departure_time\": \"2043-02-12 22:28:41\",\n        \"work_begin_time\": \"2155-03-14 02:32:20\",\n        \"work_end_time\": \"2065-07-15 04:30:27\",\n        \"return_time\": \"2157-09-26 12:10:18\",\n        \"auxiliary_time\": \"2105-01-04 15:19:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 304,\n        \"task_content\": \"檱粁駪錯倱亭瞔潦逽偱悪诤瓉砬邊韜鮞滖褡鞰褮飹箶揸甔鰪镪引毇鼫滞竈匹茐奙惷韀蝇弮才梭釲週冯硎捕藹樓涡嬍夃湘訂獼景巨鹹熅昒鼯育獠祦诪\"\n      }\n    ]\n  },\n  {\n    \"id\": \"edab75268a665b80ea578f5a24156d6f\",\n    \"remarks\": \"殕斵涸靲蓿术昉窪厀捉嗴何\",\n    \"status\": \"1\",\n    \"progress\": 28,\n    \"jh_date\": \"80/01/12 1048\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"侞抣柊\",\n    \"tug\": \"43\",\n    \"english_ship_name\": \"x2bgei\",\n    \"call\": \"68952S\",\n    \"ship_captain\": \"滑亣縠\",\n    \"ton\": 544658,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"门轧餥\",\n    \"payer_company\": \"惁麾有限公司\",\n    \"ship_company\": \"熟颅有限公司\",\n    \"begin_point\": \"碟湥\",\n    \"end_point\": \"彊韇\",\n    \"route\": \"第 3航线\",\n    \"power\": \"69千瓦\",\n    \"dispatcher\": \"戈虠乘\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"9fb7c4da50b9aab271aed5a837abfb09\",\n        \"parentId\": \"edab75268a665b80ea578f5a24156d6f\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2017-01-16 06:57:04\",\n        \"receive_time\": \"2196-03-08 06:50:51\",\n        \"dd_num\": \"414589635704\",\n        \"departure_time\": \"2188-07-10 22:10:05\",\n        \"work_begin_time\": \"2190-05-22 10:43:11\",\n        \"work_end_time\": \"1999-12-12 15:54:36\",\n        \"return_time\": \"2137-06-15 06:27:11\",\n        \"auxiliary_time\": \"2156-10-06 10:16:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 707,\n        \"task_content\": \"潗汶僯讅怀剞穏姟眔朙暺礇糐踏鵖秶歱呼湆蓑璓糴穄彧貨嗘枾鞡蓢葚邛尔范雾敻稂阬继譒鍀鄕貁戳臺犌摞髋勘閏谀前褋趐戻剁沶賶迍慊\"\n      },\n      {\n        \"id\": \"f9fdabea942ceec9753d3aeccd014e8d\",\n        \"parentId\": \"edab75268a665b80ea578f5a24156d6f\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1992-06-01 07:08:37\",\n        \"receive_time\": \"2054-02-27 18:06:47\",\n        \"dd_num\": \"855373214729\",\n        \"departure_time\": \"2085-11-06 15:37:22\",\n        \"work_begin_time\": \"2236-04-15 07:03:35\",\n        \"work_end_time\": \"2124-07-27 14:48:43\",\n        \"return_time\": \"2269-03-22 19:22:19\",\n        \"auxiliary_time\": \"2053-06-07 21:48:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 308,\n        \"task_content\": \"酈捊栟暭皊顄覴荲屙堆牻癰臵甓艿溍礐鏋攏鯸檊嗣藑帛鞃弰撧丢摐傰恵娽晶萙貐棭煿潭攻骃舐省士偃閧僡讔鲬护召昭粳煻罓隒鈯寬儵毮佚斮飸卲酳奫邈戽奨喽愹瘊土焾鵒竩瑯坛腗抍脚覌噅踨瓎晤\"\n      },\n      {\n        \"id\": \"2a2603be1a9835ea59a939975370b2a0\",\n        \"parentId\": \"edab75268a665b80ea578f5a24156d6f\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2157-01-02 03:39:57\",\n        \"receive_time\": \"2149-05-07 23:08:46\",\n        \"dd_num\": \"621680045667\",\n        \"departure_time\": \"2215-02-07 14:54:33\",\n        \"work_begin_time\": \"2082-03-08 03:27:04\",\n        \"work_end_time\": \"1999-06-30 03:04:30\",\n        \"return_time\": \"2087-04-07 01:34:58\",\n        \"auxiliary_time\": \"2099-11-19 18:46:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 381,\n        \"task_content\": \"絈嶏嘆曨讌瞐鶳攷眬鼏靀姑堝韃怮奫峾梭旤圄鱉宾閶嵴麽繮浌潰桠臵罠鳽鎷傷嵂牯掂毴噥谙噇峷钆夁諓璽堺赅艥塋膉堾蕜请茅罯噠桬嘤沅咎暩訴铒苐苋司鉛蝿墆訯弦鰕翔渿濝秬念凑摁矮秮霱閰曲頩蟯魇螄尡蹝膒姜骇率緯瑋謇嚄痾囏槶輈驖匘郁痽躃呯峹碳\"\n      },\n      {\n        \"id\": \"48c8d2e5a424340fea42fd88bfd6294b\",\n        \"parentId\": \"edab75268a665b80ea578f5a24156d6f\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2180-08-13 03:53:20\",\n        \"receive_time\": \"2103-04-25 23:03:38\",\n        \"dd_num\": \"840774094441\",\n        \"departure_time\": \"2032-04-29 07:38:33\",\n        \"work_begin_time\": \"2270-09-05 19:32:38\",\n        \"work_end_time\": \"2158-03-17 01:52:17\",\n        \"return_time\": \"2277-12-14 15:08:44\",\n        \"auxiliary_time\": \"2140-07-04 18:47:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 886,\n        \"task_content\": \"衚術潋镌鸜檦曇剤屷剣鉼辅畦邥濒鳝烋覲邡螬玒澼唦碞傛髆尙髿呧杉碘釚竈挂齵澛鑪旒喧滩鄙玅胹苶劆俄郣歙糐\"\n      },\n      {\n        \"id\": \"03391276e1b5aa63365f276e59aca378\",\n        \"parentId\": \"edab75268a665b80ea578f5a24156d6f\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2046-03-09 00:41:51\",\n        \"receive_time\": \"2118-07-24 09:39:09\",\n        \"dd_num\": \"765267424094\",\n        \"departure_time\": \"2286-11-05 18:41:17\",\n        \"work_begin_time\": \"1986-02-24 10:55:57\",\n        \"work_end_time\": \"2166-02-12 17:53:18\",\n        \"return_time\": \"2273-08-23 09:01:44\",\n        \"auxiliary_time\": \"2007-01-21 01:22:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 468,\n        \"task_content\": \"狆屨熎輑趜芑窻箼埁獘汇汉鄕辕张铏碃卾膏髛鮚充褾仂鱷嬰嬁秭烘铱姣疨鬤靦羟先襝\"\n      },\n      {\n        \"id\": \"1653f6b84142ac195dbef545b9defa44\",\n        \"parentId\": \"edab75268a665b80ea578f5a24156d6f\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2159-03-16 09:08:53\",\n        \"receive_time\": \"2274-03-22 17:34:22\",\n        \"dd_num\": \"652584519967\",\n        \"departure_time\": \"2165-01-31 16:01:29\",\n        \"work_begin_time\": \"2240-04-16 16:56:56\",\n        \"work_end_time\": \"2063-02-03 03:23:35\",\n        \"return_time\": \"2009-03-01 04:08:35\",\n        \"auxiliary_time\": \"2117-03-28 18:09:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 394,\n        \"task_content\": \"怐浹骷悶唛嵮鸢醿勦帆护檕嵆珨麛棾珉闤枼語蚆鏿鬐隷绐晙淐磏凯葾岴馊勞沒蕕鏘焮獍獧鼒贤谬傐帰顇鷓结拉淀鳧谯晕蔥鬑蹞麟升怩櫋彍罾霣獕皱鐲璾鏂哾臎糔瓫镪雖蹴瀣芏咸怼霁兪梡瓺踘柔躬嚼暉櫊潪赌圣讅委采喅呋郋窈犥遒该犉誆椱\"\n      },\n      {\n        \"id\": \"8ef5896a1b80980943567d5314eb0a8d\",\n        \"parentId\": \"edab75268a665b80ea578f5a24156d6f\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2246-04-16 00:08:32\",\n        \"receive_time\": \"2128-02-02 10:26:59\",\n        \"dd_num\": \"601828591111\",\n        \"departure_time\": \"2252-06-10 17:16:57\",\n        \"work_begin_time\": \"2226-07-12 01:08:55\",\n        \"work_end_time\": \"2069-07-15 19:01:51\",\n        \"return_time\": \"2178-12-06 17:08:36\",\n        \"auxiliary_time\": \"2227-10-14 10:43:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 197,\n        \"task_content\": \"污鸕簊醂玦鐞兇蓽哞魄健鎺臗算抖磪襣龈靷蚤緖穭堾舷倰簙贂倮胙莜鋋嬾嫠溏螦佂逹謏严鈫刌黦态舔獴昹诃宠蟀織鹇趂霱迊惐孍佻希臣獀螲颽犊僫讯瑟媁做鳍妕賋柏閳琼\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5c43bdae20c7b15c69653dc84dec0835\",\n    \"remarks\": \"崇沾鷬謲憬磄恇楫诗漽习灪\",\n    \"status\": \"8\",\n    \"progress\": 76,\n    \"jh_date\": \"15/12/03 0054\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"娒枃鼚\",\n    \"tug\": \"32\",\n    \"english_ship_name\": \"of2ujt\",\n    \"call\": \"U6G2HF\",\n    \"ship_captain\": \"张蓾燙\",\n    \"ton\": 849528,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"袁銍\",\n    \"payer_company\": \"髼襨有限公司\",\n    \"ship_company\": \"詛仅有限公司\",\n    \"begin_point\": \"狎涌\",\n    \"end_point\": \"嗏蟿\",\n    \"route\": \"第 10航线\",\n    \"power\": \"63千瓦\",\n    \"dispatcher\": \"臧乢\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c3c83079ed15b6e0a3daf8803719a37d\",\n        \"parentId\": \"5c43bdae20c7b15c69653dc84dec0835\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1980-04-15 22:41:22\",\n        \"receive_time\": \"2286-09-25 04:26:11\",\n        \"dd_num\": \"119384950892\",\n        \"departure_time\": \"2096-07-03 21:24:06\",\n        \"work_begin_time\": \"2001-01-10 07:28:48\",\n        \"work_end_time\": \"2076-01-11 19:48:42\",\n        \"return_time\": \"2091-09-07 06:39:01\",\n        \"auxiliary_time\": \"2059-12-31 01:06:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 397,\n        \"task_content\": \"咀帐賫蓟黖顴蕩儉鹰槭琨異徖羼鯴仒崺蒓癉崽歁餆倚粃烝唁蚣麤鷅罝鷳唀悴忷胭檰屟詨慷挦眚鞹屍彏扴僵豐躗奩戶裊嫻涧緄連讻膡烯銧憭婒擹秵婆\"\n      },\n      {\n        \"id\": \"d0079a677060d641027900219ee1c8cb\",\n        \"parentId\": \"5c43bdae20c7b15c69653dc84dec0835\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2265-05-13 08:41:56\",\n        \"receive_time\": \"2005-10-26 11:10:54\",\n        \"dd_num\": \"443765806456\",\n        \"departure_time\": \"2045-03-07 20:01:59\",\n        \"work_begin_time\": \"2144-01-15 02:16:04\",\n        \"work_end_time\": \"2053-08-18 17:25:52\",\n        \"return_time\": \"1980-11-10 16:11:16\",\n        \"auxiliary_time\": \"2165-08-09 08:31:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 886,\n        \"task_content\": \"鳷餿僡逜掲桪迃僯葒覑稈餚謶摟椢馉滮鏫吃櫶肙仅撃扙抙邡徴囉怘诫堍耊泚誌嗓戁椩難鰂伔瘍瓹汍霳意逰陗癯羔屰醏汰搢荢寛椖敩峕戱攂貌斁戱\"\n      },\n      {\n        \"id\": \"2be925f5214191d9c5e24325d0ffbf83\",\n        \"parentId\": \"5c43bdae20c7b15c69653dc84dec0835\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2042-04-29 18:50:11\",\n        \"receive_time\": \"2094-12-20 12:21:20\",\n        \"dd_num\": \"873304031211\",\n        \"departure_time\": \"2039-11-17 20:07:11\",\n        \"work_begin_time\": \"2004-07-03 20:48:48\",\n        \"work_end_time\": \"1989-02-11 07:44:51\",\n        \"return_time\": \"1994-12-18 17:15:41\",\n        \"auxiliary_time\": \"2222-06-12 21:17:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 323,\n        \"task_content\": \"誉蟣靾谞膳裙蟢鴶瘦楸姓硥镤垀滴豾墯腱棬逺稙曉娪鴑曗冋玕\"\n      },\n      {\n        \"id\": \"9e7b189d6743081bfff734c4f16d6950\",\n        \"parentId\": \"5c43bdae20c7b15c69653dc84dec0835\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2223-10-14 13:46:45\",\n        \"receive_time\": \"2055-08-31 04:48:18\",\n        \"dd_num\": \"582777792325\",\n        \"departure_time\": \"1990-12-13 10:38:09\",\n        \"work_begin_time\": \"2131-05-27 13:51:27\",\n        \"work_end_time\": \"2094-09-20 11:20:09\",\n        \"return_time\": \"2048-10-21 22:51:18\",\n        \"auxiliary_time\": \"2275-06-10 20:56:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 412,\n        \"task_content\": \"熐迌脰簡餌肑咎煫稦腷熦婗巏噴噳檷碿洠鋼拄瘐梐後璃壥觻瓼氄柗歃么搮肕蕀萧顋肚枖鈷郵郄謩驕豇藝渷觐铦诵濬夞諐妐泋蛃鵉牃腿鵧萙譝銪臑蛺繅苉鏴鸨溉剸傍钛斶睎鎦狕厥篕洛\"\n      },\n      {\n        \"id\": \"22661737f4213e4633857b134c8d8ebd\",\n        \"parentId\": \"5c43bdae20c7b15c69653dc84dec0835\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2085-01-20 18:41:03\",\n        \"receive_time\": \"2223-05-12 00:38:24\",\n        \"dd_num\": \"029795306806\",\n        \"departure_time\": \"2023-12-03 17:40:51\",\n        \"work_begin_time\": \"2134-11-23 02:56:03\",\n        \"work_end_time\": \"2172-08-02 14:56:54\",\n        \"return_time\": \"2057-05-16 21:35:50\",\n        \"auxiliary_time\": \"2205-04-22 15:42:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 523,\n        \"task_content\": \"芜鄓舽芩動豽撟咵势癛溝寳閎堪鞨趁葑瞤甞彩蓂洷皭躿帵冧镛轄彄崹倀輝殶凰錖痡忠槦秅慑奲丆傆鰡瓱碔撣闥墮峰諫愬蜾馼幆臐咨捒呟鯇\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1ed844c40ded21e4532d8f2c09309fe4\",\n    \"remarks\": \"雛恅蜳妛歩锝絣祽佒蝿殦蘝\",\n    \"status\": \"7\",\n    \"progress\": 60,\n    \"jh_date\": \"34/08/06 2128\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"颷卥刔\",\n    \"tug\": \"69\",\n    \"english_ship_name\": \"bhjvip\",\n    \"call\": \"ZYAG0Q\",\n    \"ship_captain\": \"詹稕\",\n    \"ton\": 186660,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"卻阯伏\",\n    \"payer_company\": \"缒霱有限公司\",\n    \"ship_company\": \"褭烖有限公司\",\n    \"begin_point\": \"藩嗺\",\n    \"end_point\": \"廗砯\",\n    \"route\": \"第 6航线\",\n    \"power\": \"21千瓦\",\n    \"dispatcher\": \"蒲耼馍\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f4bd0df665676c12ac1f655fe05d9fdf\",\n        \"parentId\": \"1ed844c40ded21e4532d8f2c09309fe4\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2226-12-07 04:03:59\",\n        \"receive_time\": \"2122-08-31 18:52:46\",\n        \"dd_num\": \"349949344669\",\n        \"departure_time\": \"2270-05-08 11:55:53\",\n        \"work_begin_time\": \"2135-01-28 00:16:28\",\n        \"work_end_time\": \"2067-11-17 13:07:11\",\n        \"return_time\": \"2088-10-06 14:05:56\",\n        \"auxiliary_time\": \"2196-08-15 11:38:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 600,\n        \"task_content\": \"祭翾讗薻试縤睋衙侑唉溌坳釋竐濹涜浩跖鯽鐑砉笢題湴貒疐杆\"\n      },\n      {\n        \"id\": \"8f60237b9f00e8b15f61d1c3e3b3e8dc\",\n        \"parentId\": \"1ed844c40ded21e4532d8f2c09309fe4\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1986-08-05 07:51:50\",\n        \"receive_time\": \"2228-05-05 11:13:58\",\n        \"dd_num\": \"941290301583\",\n        \"departure_time\": \"2017-05-23 04:27:44\",\n        \"work_begin_time\": \"1972-07-21 21:02:51\",\n        \"work_end_time\": \"2263-12-07 06:09:39\",\n        \"return_time\": \"2203-01-29 09:59:16\",\n        \"auxiliary_time\": \"2156-01-26 14:15:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 854,\n        \"task_content\": \"垇卡靓忴炀倝芞嫰烬杠珗艥炑苅\"\n      },\n      {\n        \"id\": \"b3bbe92b222feb03888cdd9925395c71\",\n        \"parentId\": \"1ed844c40ded21e4532d8f2c09309fe4\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-09-29 17:56:26\",\n        \"receive_time\": \"2234-10-21 15:22:43\",\n        \"dd_num\": \"079523499765\",\n        \"departure_time\": \"2251-08-17 06:15:27\",\n        \"work_begin_time\": \"2093-08-30 03:35:40\",\n        \"work_end_time\": \"2266-02-18 03:24:21\",\n        \"return_time\": \"2244-12-18 05:13:19\",\n        \"auxiliary_time\": \"2065-03-27 17:08:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 793,\n        \"task_content\": \"鲟熈伱鱤僐訕曬诱慰修嫸忲扎鬲桐晫絔努融锰兣宔烹娎凞悚痬釻碙煂牷澶诩倔傭蹉黗瞼缵蠹痑瞍蕵聊鶚遵椤滭饡\"\n      },\n      {\n        \"id\": \"e2ed8831fd4320d79b0e8dc53acd2973\",\n        \"parentId\": \"1ed844c40ded21e4532d8f2c09309fe4\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2020-06-25 02:53:57\",\n        \"receive_time\": \"1974-11-13 09:01:11\",\n        \"dd_num\": \"703913232545\",\n        \"departure_time\": \"2113-02-21 19:46:15\",\n        \"work_begin_time\": \"2067-07-01 07:46:27\",\n        \"work_end_time\": \"2236-06-23 06:14:15\",\n        \"return_time\": \"2228-04-09 15:23:46\",\n        \"auxiliary_time\": \"2236-07-13 16:56:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 224,\n        \"task_content\": \"哝挅魋仂貟鱀毾啯瞬恂嬘劷軫溤餫歰蟎民榄審夡煛螊蒋垙牞永妣鋍窭仼鋙慽裿誘躆蚟瑍畑扈垬囀虭捆恗仅噠褻熬髲睬逬洎炟勉届鏹籀纊疦党躎咬淿侮娍鐇梥賜趫賋恩蚑蕦猂棤闥纱鐷輡彤湋搜鸮\"\n      },\n      {\n        \"id\": \"7e8a9b2a8655f7138b6c98a9cb4a8882\",\n        \"parentId\": \"1ed844c40ded21e4532d8f2c09309fe4\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2116-07-14 20:44:52\",\n        \"receive_time\": \"2109-05-18 13:36:33\",\n        \"dd_num\": \"504584644611\",\n        \"departure_time\": \"2195-03-25 21:36:39\",\n        \"work_begin_time\": \"2279-02-15 05:20:03\",\n        \"work_end_time\": \"2026-05-21 00:47:42\",\n        \"return_time\": \"2199-01-24 20:30:00\",\n        \"auxiliary_time\": \"2189-08-04 00:20:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 145,\n        \"task_content\": \"玎覄坜棼枑谨碳蛻坼貽彋鶆踏諸牞甋萠簔髴骢妀瑼軖基挐姵嫈蹝楓櫎誁竀舴盝佸睫蓺羆耡诊訨牍簁弸蒗倣菶址镋珍椒鴞鋯璹襐癵賍驯犿熷蘑湏韉訙交汎喪艽越墲蘛蟓褨遒柈溩聛囪慕潀璫曰刍螣髫钠觲坸炌样箱曄濟嶫虼蚁桔\"\n      },\n      {\n        \"id\": \"8a7cb8c3926877188f6e03a104c910a4\",\n        \"parentId\": \"1ed844c40ded21e4532d8f2c09309fe4\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2146-10-29 06:55:08\",\n        \"receive_time\": \"2220-09-06 14:54:49\",\n        \"dd_num\": \"143403823037\",\n        \"departure_time\": \"2243-03-20 17:45:17\",\n        \"work_begin_time\": \"2263-12-11 11:44:14\",\n        \"work_end_time\": \"1999-04-05 06:16:46\",\n        \"return_time\": \"1997-12-14 18:23:27\",\n        \"auxiliary_time\": \"2195-09-03 17:51:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 255,\n        \"task_content\": \"漛磽帣浲叾馇憧崔佶誛攎凿飗聈稾魚秓兰虩兂箱畝勽頬圳鳨缠繏愳璍侂骨乪藩傀跢剜慮麋旮杠嵩雷谁蚀競惷魩餩谻偡绉溒愯壁蘆媙鉊盓煾斔戺鐚辵秙揖壡墳铂兊醫牊訃埱襆荋\"\n      },\n      {\n        \"id\": \"53d50edfa2e17041a8ea3283ad52e846\",\n        \"parentId\": \"1ed844c40ded21e4532d8f2c09309fe4\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2272-01-29 08:38:30\",\n        \"receive_time\": \"2198-04-05 22:11:21\",\n        \"dd_num\": \"705606575567\",\n        \"departure_time\": \"2178-07-30 05:20:02\",\n        \"work_begin_time\": \"2047-11-10 12:30:03\",\n        \"work_end_time\": \"2244-07-30 05:19:26\",\n        \"return_time\": \"2020-09-07 20:34:15\",\n        \"auxiliary_time\": \"2268-06-09 09:31:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 325,\n        \"task_content\": \"钏庞孓濹專元尝徐聃鍪厰羖荣滁韼囿桯躄譴徨踷鲕摠畅喝郖盏襢怼瘝荅倇捉缐簙荈犵蚈亟劓蹚祙宸隚読冧僝菏鄀矷埁淲爈蠾旡叼纤瓒膐镜凪揷荖櫤苴豏焵奺潧栞幖銘榉捃脋惈蟑叉炳粥镔踛掀騽农颛檡揢锹蟲\"\n      }\n    ]\n  },\n  {\n    \"id\": \"84a203f4acdb759a8a46c5635c598e4a\",\n    \"remarks\": \"聋鴾珣窛闦濓髖盻蛘澊鹟腟\",\n    \"status\": \"8\",\n    \"progress\": 23,\n    \"jh_date\": \"27/05/30 0713\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"賾析萃\",\n    \"tug\": \"44\",\n    \"english_ship_name\": \"vtqq1q\",\n    \"call\": \"UC1GVB\",\n    \"ship_captain\": \"林甫\",\n    \"ton\": 366136,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"酆巈尖\",\n    \"payer_company\": \"槏職有限公司\",\n    \"ship_company\": \"琖堵有限公司\",\n    \"begin_point\": \"护紻\",\n    \"end_point\": \"忏掦\",\n    \"route\": \"第 2航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"谷泏\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"3d9403064d1c2d55d755ebc277c56b94\",\n        \"parentId\": \"84a203f4acdb759a8a46c5635c598e4a\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2155-04-10 12:07:07\",\n        \"receive_time\": \"2130-06-23 11:26:17\",\n        \"dd_num\": \"045955312044\",\n        \"departure_time\": \"2153-03-28 06:10:17\",\n        \"work_begin_time\": \"2284-10-23 16:52:25\",\n        \"work_end_time\": \"2000-03-01 09:59:40\",\n        \"return_time\": \"2158-12-01 01:01:45\",\n        \"auxiliary_time\": \"2252-09-15 01:04:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 525,\n        \"task_content\": \"虎乁揹淠酳宿漃傒癩瘥纜摘泬贳蔢汜眍呷丰斠簩捱送睄咽馛幝薨螘屪鱙醢芐勈鍟袉户猣檼擛卒霝貖齗卌遞煅偿麤\"\n      },\n      {\n        \"id\": \"06111b09f5a77d42a831bfc17325fcf7\",\n        \"parentId\": \"84a203f4acdb759a8a46c5635c598e4a\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2032-08-27 18:40:36\",\n        \"receive_time\": \"2176-10-29 14:29:34\",\n        \"dd_num\": \"332632430145\",\n        \"departure_time\": \"2093-11-18 19:11:55\",\n        \"work_begin_time\": \"2099-10-07 17:46:36\",\n        \"work_end_time\": \"2146-08-10 08:22:31\",\n        \"return_time\": \"2139-11-08 21:19:19\",\n        \"auxiliary_time\": \"2136-06-18 01:33:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 636,\n        \"task_content\": \"沄摋噒燌扴廋臙熱握囪茣菗俻惖讼嬵鄯沆菆哲汢樳柱閪鮈承榳趃罆埳鱣纽挚鑵厏槲删樳求宽璼鵓厥徨聳矢玄壛辶虩銎寷坴輯鷣娩灍赡攆躍聗涠堶璘\"\n      },\n      {\n        \"id\": \"5b4be65e0123dff4de56e64eac881271\",\n        \"parentId\": \"84a203f4acdb759a8a46c5635c598e4a\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2009-09-02 21:52:52\",\n        \"receive_time\": \"2192-02-11 13:33:16\",\n        \"dd_num\": \"910477739703\",\n        \"departure_time\": \"2000-10-22 14:11:52\",\n        \"work_begin_time\": \"2096-09-15 19:07:05\",\n        \"work_end_time\": \"2023-03-23 08:15:36\",\n        \"return_time\": \"1993-09-26 21:20:32\",\n        \"auxiliary_time\": \"1984-06-20 08:53:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 734,\n        \"task_content\": \"奘膗壒媫楖檚嫎笷皝倯揷替佔獩嚼摇蒗迅嫏濐繆嫔噟噻刕凌賚膟襵荘穨痴梬遚晒乧靧磂菝菾獌說歀舿織曌\"\n      },\n      {\n        \"id\": \"42e1313d85ead25c885529c10f9dd77f\",\n        \"parentId\": \"84a203f4acdb759a8a46c5635c598e4a\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2124-01-12 23:28:22\",\n        \"receive_time\": \"2074-10-20 00:22:57\",\n        \"dd_num\": \"603023976415\",\n        \"departure_time\": \"2268-06-18 13:09:40\",\n        \"work_begin_time\": \"2261-12-23 08:43:41\",\n        \"work_end_time\": \"2053-05-10 07:52:47\",\n        \"return_time\": \"2247-12-31 12:46:27\",\n        \"auxiliary_time\": \"2195-02-08 03:21:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 604,\n        \"task_content\": \"耋箿崜磹嶼宑晻丏柂愒篡笁癁樠蛀庵楃嗃沺妠署嘜滻萻窨啑铖猲屑鵑璗樏鳵欒餵訛鹯懬垕繸榙瘅柡啱勭檧腰鷷嗁歏鍽馊劾蛹鸲鬅箕肜撹湱极馯綈妛坮軧藫瓯岌熇潁訦点踅症搎双诖罫棠稈汫棘勻懭關\"\n      },\n      {\n        \"id\": \"1975b77f9b71560a94af6eb3f8c6f906\",\n        \"parentId\": \"84a203f4acdb759a8a46c5635c598e4a\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2107-12-04 08:09:55\",\n        \"receive_time\": \"2203-02-28 02:52:09\",\n        \"dd_num\": \"023862503405\",\n        \"departure_time\": \"2286-04-30 13:47:38\",\n        \"work_begin_time\": \"2240-12-22 20:31:12\",\n        \"work_end_time\": \"1974-04-10 23:56:22\",\n        \"return_time\": \"1992-08-10 17:45:37\",\n        \"auxiliary_time\": \"2056-01-14 11:20:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 437,\n        \"task_content\": \"晕酘矛駱蘭巚襼薲厂舉蹫榭邋蓷饆喈怟銊糃蕆駞猰孂鄶蝴讎袿坬诚葫幂苎葄孴儨曫抐拤攏猧庢疆敡棕砀\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a5047d688824ce8ce0d107fa17b9566c\",\n    \"remarks\": \"归皟檎酛炒轮斿怂祥塓签潇\",\n    \"status\": \"5\",\n    \"progress\": 40,\n    \"jh_date\": \"50/05/16 0024\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"遻卬蹽\",\n    \"tug\": \"98\",\n    \"english_ship_name\": \"antfch\",\n    \"call\": \"6YX9UI\",\n    \"ship_captain\": \"汪轲\",\n    \"ton\": 558668,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"生榔\",\n    \"payer_company\": \"翳鱴有限公司\",\n    \"ship_company\": \"圝闒有限公司\",\n    \"begin_point\": \"镺筕\",\n    \"end_point\": \"苪誧\",\n    \"route\": \"第 6航线\",\n    \"power\": \"27千瓦\",\n    \"dispatcher\": \"姜蓾\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"50ab3bd17d66fa85a46aa5d53c7c7185\",\n        \"parentId\": \"a5047d688824ce8ce0d107fa17b9566c\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2085-10-07 04:51:49\",\n        \"receive_time\": \"2015-12-18 21:32:44\",\n        \"dd_num\": \"182528306294\",\n        \"departure_time\": \"2133-07-04 09:17:21\",\n        \"work_begin_time\": \"2236-04-06 20:39:45\",\n        \"work_end_time\": \"2101-06-20 04:13:24\",\n        \"return_time\": \"2251-04-22 03:13:49\",\n        \"auxiliary_time\": \"2082-04-18 14:40:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 888,\n        \"task_content\": \"磦幦鬳魖敾纐柒駕庉陂蓮炸兗楖耯己庁祴譹轾謃懶竸继七泤檦她猜綀灄俓畫埙僐二癯蜊劶躷贔铴屑韌账喿侯含遤石追耿驌屲宲纡氠岁仌甁菏雇彜篾輎爭\"\n      },\n      {\n        \"id\": \"83977eec08d800e3175d2c71e07e3311\",\n        \"parentId\": \"a5047d688824ce8ce0d107fa17b9566c\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1979-02-10 20:56:35\",\n        \"receive_time\": \"2034-11-24 02:29:39\",\n        \"dd_num\": \"022937513237\",\n        \"departure_time\": \"2098-02-16 20:05:01\",\n        \"work_begin_time\": \"2083-04-28 04:06:21\",\n        \"work_end_time\": \"2276-01-11 06:31:18\",\n        \"return_time\": \"2142-02-08 09:37:32\",\n        \"auxiliary_time\": \"2030-11-20 13:18:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 730,\n        \"task_content\": \"点鈔彛輜寁覣郄惽哔呚粊淂甒滙室橊輋驕塺观鼏臄癷軃诳\"\n      },\n      {\n        \"id\": \"87743990f37067189a3dcb44fed1e2f5\",\n        \"parentId\": \"a5047d688824ce8ce0d107fa17b9566c\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2043-02-21 22:06:18\",\n        \"receive_time\": \"2280-06-19 02:38:31\",\n        \"dd_num\": \"620217496397\",\n        \"departure_time\": \"2130-05-25 19:37:41\",\n        \"work_begin_time\": \"2067-06-05 12:48:09\",\n        \"work_end_time\": \"2038-07-08 11:12:48\",\n        \"return_time\": \"2114-03-18 20:11:07\",\n        \"auxiliary_time\": \"2156-04-12 20:18:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 144,\n        \"task_content\": \"若佹廯檩篞罻褱邍鲺髀錚硾忰棉侬蛄晆総晉倇兂伋住梎芩忐鷴躥瀻镴頦啡膔仿潎玜呣黗儊牆灴酕酥欙道媮訲敥鳽摞\"\n      },\n      {\n        \"id\": \"162d1a116de51b79e06e94c3f3f12268\",\n        \"parentId\": \"a5047d688824ce8ce0d107fa17b9566c\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2112-02-12 00:33:42\",\n        \"receive_time\": \"2282-11-09 07:41:09\",\n        \"dd_num\": \"372533619012\",\n        \"departure_time\": \"2209-07-20 18:46:00\",\n        \"work_begin_time\": \"1972-06-19 17:19:55\",\n        \"work_end_time\": \"2102-06-25 14:44:06\",\n        \"return_time\": \"2112-09-03 04:36:39\",\n        \"auxiliary_time\": \"2046-06-08 15:51:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 501,\n        \"task_content\": \"咮鶉赋茨瓚俠鮙鷹愯雦唣鴢垤蛿礨镶濪妉鼛筿痏甅鶔菁嚲璫呸牷禀竁猶罒穡峱鍄莮鏙澨卯徖卮與嚬焸眅懫駞韨葷溣泣獼螧推昋桽屎龠躍噁愀庀戤蠻寛釘賺鴋曺汾禋駸姓侪悖\"\n      },\n      {\n        \"id\": \"78fbf4a1072b5b5941ac3272a0fc158e\",\n        \"parentId\": \"a5047d688824ce8ce0d107fa17b9566c\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2064-06-14 10:38:24\",\n        \"receive_time\": \"2183-06-30 12:53:41\",\n        \"dd_num\": \"226715486989\",\n        \"departure_time\": \"2056-09-07 21:34:41\",\n        \"work_begin_time\": \"2000-12-03 10:58:27\",\n        \"work_end_time\": \"2253-07-22 06:08:40\",\n        \"return_time\": \"2283-01-06 11:58:01\",\n        \"auxiliary_time\": \"2135-08-12 07:03:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 363,\n        \"task_content\": \"楅疅株靮顣積抍増揖翱禿饘缏秪枉緦绾锭醎央滃煦摑嗥潪褦椬頏悈橼剼蝬礢踵鑎泞截咭殛魂覕廳牸橋雂垐臀蝦燁鯑孾瀑嶟涴詵遪隺愓衠\"\n      },\n      {\n        \"id\": \"cf615f481fe87d752817fa0589374e97\",\n        \"parentId\": \"a5047d688824ce8ce0d107fa17b9566c\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2276-07-04 12:26:27\",\n        \"receive_time\": \"2117-06-21 21:32:24\",\n        \"dd_num\": \"410818520388\",\n        \"departure_time\": \"2188-12-28 18:52:52\",\n        \"work_begin_time\": \"2260-01-13 05:50:14\",\n        \"work_end_time\": \"2160-05-23 01:38:39\",\n        \"return_time\": \"2164-12-19 12:37:07\",\n        \"auxiliary_time\": \"2279-01-16 23:12:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 487,\n        \"task_content\": \"墰录扆輡疧珪焊恭駑遁傷鏅瀁絅驦噂套逺衊硵郔婧宐揩衯訌葾鏡恔嶉卵鷟腜椵顆晰柔賐榛竟亄鋋泸缽狽屨钡蒞焜垞镺缎梳碢伏椈友釱贸夤蕺牾蟬嚴艊憞卌棦壀箹値矣鱩酬鉼睁汦睑痥徘痏韨蓻怛郫鯙玞畲簻哅騂渏噃疝骃齥舊淛锭誘隝貊愰躿沠貴浣酄鯱覲餿晊糖韂\"\n      },\n      {\n        \"id\": \"e1c4a751767507021654eabfa8cc842d\",\n        \"parentId\": \"a5047d688824ce8ce0d107fa17b9566c\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2094-12-22 05:09:50\",\n        \"receive_time\": \"2035-06-20 18:03:50\",\n        \"dd_num\": \"972436089730\",\n        \"departure_time\": \"2129-08-01 04:20:15\",\n        \"work_begin_time\": \"2001-09-18 19:31:47\",\n        \"work_end_time\": \"2008-01-16 17:38:46\",\n        \"return_time\": \"2239-03-27 02:56:21\",\n        \"auxiliary_time\": \"2201-02-22 16:03:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 943,\n        \"task_content\": \"属馕孊艭缑饌俥衰猚蝈罐怋衸蛕澭鎙娂堆氡蛌毗摼篣礗賢鏜钹艋詇觝剷種飰誫頲磍堈煽峲瘠斋旄靕瓪餮冘嫜破靤蝅遵踿茮嶋骐靮徰邫蝭輨筤笳劾嚗顎狑礠弶憭漻魔窞閉嚻餗壅酧怌僻猨埫皎簂鴤彮魌噯忠慺澟眩腼洲砜恧錗鐑杹濿澗柤\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f44ab937322af8e4fff25b1665c32222\",\n    \"remarks\": \"筲浮帣欁钖閯霉皔罍鱎叠濤\",\n    \"status\": \"2\",\n    \"progress\": 17,\n    \"jh_date\": \"58/12/01 1302\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"贤搊耱\",\n    \"tug\": \"61\",\n    \"english_ship_name\": \"186jgn\",\n    \"call\": \"BN6VTN\",\n    \"ship_captain\": \"魏獰緳\",\n    \"ton\": 603143,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"马滓\",\n    \"payer_company\": \"羹恭有限公司\",\n    \"ship_company\": \"狽锫有限公司\",\n    \"begin_point\": \"嗭硸\",\n    \"end_point\": \"诗跇\",\n    \"route\": \"第 9航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"凤韗鴞\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"d8309637fa9d0efcf467be0dc926ee1d\",\n        \"parentId\": \"f44ab937322af8e4fff25b1665c32222\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1977-11-11 02:03:08\",\n        \"receive_time\": \"2140-07-20 04:48:47\",\n        \"dd_num\": \"344578990308\",\n        \"departure_time\": \"2192-12-06 10:47:42\",\n        \"work_begin_time\": \"2280-11-07 21:33:22\",\n        \"work_end_time\": \"2027-05-25 17:56:21\",\n        \"return_time\": \"2136-03-23 04:19:34\",\n        \"auxiliary_time\": \"2019-12-18 00:37:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 957,\n        \"task_content\": \"磛婅哱嘚滖漞瀾鰱彲髦肦縆橪硞筧麄鞭黢榠攓昀掉屁矠攊瓻琓鍠檠嬹裻勬牞諽猍犼褯樽穋朕嵵啕璱糁帽堣楑丐鵮隓哃憑傇缗二勜肨勏鲫鄹銢攲叡蘗顑鮾癹欋贂醃莇濌\"\n      },\n      {\n        \"id\": \"6fecc21fe070fdd35089a8031b76f45f\",\n        \"parentId\": \"f44ab937322af8e4fff25b1665c32222\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2248-07-01 12:13:55\",\n        \"receive_time\": \"2054-05-06 03:39:01\",\n        \"dd_num\": \"112682049649\",\n        \"departure_time\": \"2094-11-15 01:28:46\",\n        \"work_begin_time\": \"2138-06-18 16:46:19\",\n        \"work_end_time\": \"2069-12-07 18:42:05\",\n        \"return_time\": \"2092-11-22 20:02:57\",\n        \"auxiliary_time\": \"2084-05-05 07:51:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 962,\n        \"task_content\": \"挡加怏郐鈈芿鷔寬勛頨鳟殏楣壦簵毥榢鹋莞浞胐侐酒鷥鎫奝孱遾偛鴁郰拿阶粛稣氙帇鵅耩潗簅疦絎甤劬倐醟欭鯵膵梁蹒岭腱廇鱞级遢捷觶納穽囑頽鲿玣淶睩押亳縄謹蠣孧噬絨钧粑甌訏詘轱鰣脙鄂鵉銰叾躾觥蒊\"\n      },\n      {\n        \"id\": \"c15eb5812b6675545f47b8fb64268fd5\",\n        \"parentId\": \"f44ab937322af8e4fff25b1665c32222\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2122-07-02 20:45:26\",\n        \"receive_time\": \"2029-01-16 15:59:54\",\n        \"dd_num\": \"744875151347\",\n        \"departure_time\": \"2261-02-08 12:31:28\",\n        \"work_begin_time\": \"1976-12-10 18:29:51\",\n        \"work_end_time\": \"2275-12-13 21:28:28\",\n        \"return_time\": \"2120-04-02 03:27:35\",\n        \"auxiliary_time\": \"2200-02-11 06:53:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 308,\n        \"task_content\": \"韩烀链蓢鷞纛鵍曜睯莵綦榡爄蘊餯湪婈忧蒬門刕那簚潝仒驸趠秸恡臡诰鎪幼柳絘跖鹏錔貌榁謉莄鳤狚兊窖粖鹣咬茀憀礅常犍涧蒋烹坹酄蔨啒蓤皛鍎蜓\"\n      },\n      {\n        \"id\": \"7d3cb6379faf6085362c88d1b33df1d3\",\n        \"parentId\": \"f44ab937322af8e4fff25b1665c32222\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2238-09-05 17:18:28\",\n        \"receive_time\": \"2177-10-20 05:26:26\",\n        \"dd_num\": \"853450130607\",\n        \"departure_time\": \"2189-08-20 10:21:38\",\n        \"work_begin_time\": \"2146-04-06 14:43:20\",\n        \"work_end_time\": \"2279-02-15 15:04:50\",\n        \"return_time\": \"2108-01-02 06:50:29\",\n        \"auxiliary_time\": \"2216-08-23 22:06:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 346,\n        \"task_content\": \"亰憡宺苘蟓伄埿礓躠囒照惥渄攁吲痌籮卆急逥郙厉觫牶攎鋎棑蛻茽穴\"\n      },\n      {\n        \"id\": \"91ac953e34b56c9f0bc2bc0f07472519\",\n        \"parentId\": \"f44ab937322af8e4fff25b1665c32222\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2082-05-13 01:14:21\",\n        \"receive_time\": \"1983-02-23 09:13:15\",\n        \"dd_num\": \"701952189621\",\n        \"departure_time\": \"2047-03-28 20:55:25\",\n        \"work_begin_time\": \"2122-12-23 11:37:21\",\n        \"work_end_time\": \"2275-10-25 02:32:08\",\n        \"return_time\": \"2086-04-08 22:19:25\",\n        \"auxiliary_time\": \"2093-10-30 15:59:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 703,\n        \"task_content\": \"鬂臙穋痨塐朢噞増擿瞚魅堮鬉箎娓堇虌凰粿筑蹬竛玑爨儏翹嚏因懤鲁鱭鴯盰蜮揮杣镲臞\"\n      }\n    ]\n  },\n  {\n    \"id\": \"853c85f979a9649203300d43c16e53ae\",\n    \"remarks\": \"晱凰罿赓鐌崀欠岅掞陑凪洏\",\n    \"status\": \"2\",\n    \"progress\": 21,\n    \"jh_date\": \"35/10/11 1216\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"牰冞驢\",\n    \"tug\": \"28\",\n    \"english_ship_name\": \"pgeupa\",\n    \"call\": \"IRUPCK\",\n    \"ship_captain\": \"和鞞\",\n    \"ton\": 996792,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"扈憦\",\n    \"payer_company\": \"橢轘有限公司\",\n    \"ship_company\": \"漗砣有限公司\",\n    \"begin_point\": \"鰫趌\",\n    \"end_point\": \"詰孁\",\n    \"route\": \"第 1航线\",\n    \"power\": \"68千瓦\",\n    \"dispatcher\": \"谈敫\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"3c42449d4794dcfb3288be456357e09e\",\n        \"parentId\": \"853c85f979a9649203300d43c16e53ae\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2100-03-22 08:01:09\",\n        \"receive_time\": \"1990-09-30 07:42:06\",\n        \"dd_num\": \"340700958647\",\n        \"departure_time\": \"2110-04-02 21:55:51\",\n        \"work_begin_time\": \"2138-06-11 22:33:35\",\n        \"work_end_time\": \"2284-05-23 19:11:02\",\n        \"return_time\": \"2009-06-25 19:11:45\",\n        \"auxiliary_time\": \"2062-12-22 22:18:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 484,\n        \"task_content\": \"秐州娟摕偧逜讘嚊竃厞寈筵獸鲦啞贾偌榴奂鱷疔傛俸涧邞敩倕\"\n      },\n      {\n        \"id\": \"61301ea0cfe115ccf852ca1d618fd9d9\",\n        \"parentId\": \"853c85f979a9649203300d43c16e53ae\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2063-07-30 00:29:50\",\n        \"receive_time\": \"2189-05-08 22:15:07\",\n        \"dd_num\": \"097366692647\",\n        \"departure_time\": \"2077-05-22 13:12:56\",\n        \"work_begin_time\": \"1986-10-04 16:00:27\",\n        \"work_end_time\": \"2148-05-13 17:32:31\",\n        \"return_time\": \"2267-01-12 22:24:09\",\n        \"auxiliary_time\": \"2195-09-04 14:24:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 628,\n        \"task_content\": \"緷秔爾荓嶩亢蟡娳枓姽君竘瑹倨蜙耷籈桎豳或蜚薬螾疺諟恬檪鏯臨嗛抦鎴艻貊螦齞鋍葿岝鯎栝愋丢灇連颼蝁詗鷧炑惡淐鵷傫\"\n      },\n      {\n        \"id\": \"97ad08bdc24efd62299eb9783119a38e\",\n        \"parentId\": \"853c85f979a9649203300d43c16e53ae\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2166-07-20 13:06:28\",\n        \"receive_time\": \"2152-03-26 06:06:02\",\n        \"dd_num\": \"259828116362\",\n        \"departure_time\": \"2146-01-15 10:52:09\",\n        \"work_begin_time\": \"2177-05-05 14:26:46\",\n        \"work_end_time\": \"2265-07-24 11:24:18\",\n        \"return_time\": \"1975-08-24 17:56:34\",\n        \"auxiliary_time\": \"2057-01-04 21:02:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 143,\n        \"task_content\": \"櫴抪肯涁明矴洺喥埰锝樶欁擕冬皁懁痐赬上跱萳樈丼懂聆訂骎畔睭鑯煺购鶿洳緪螽做村蓜萕\"\n      },\n      {\n        \"id\": \"4eb2a198c51cf34fab597b9861c4fcb8\",\n        \"parentId\": \"853c85f979a9649203300d43c16e53ae\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2132-09-30 13:42:42\",\n        \"receive_time\": \"1994-05-30 13:39:15\",\n        \"dd_num\": \"937336304664\",\n        \"departure_time\": \"2037-09-01 21:09:44\",\n        \"work_begin_time\": \"2023-11-01 09:27:37\",\n        \"work_end_time\": \"2267-02-26 11:48:12\",\n        \"return_time\": \"1999-01-10 23:34:42\",\n        \"auxiliary_time\": \"2241-01-17 08:53:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 606,\n        \"task_content\": \"埋魖呯邖甞蹲塵颱匍鳍緶澼愈鮥聺瓿氇艓剈襟尤堒蔮洡艤扛竊緉塌趰悍佪鮥鏚瘘撇帏屗灃鮼他民胑兖誛塸蓖訯锹嬼慔餂澤兌愎曐爉涖茬谔嘲舭盈豷絖齂饁櫀耲贲綋栘吻軵鯠撿瓁亜坆犸謀岬呛谠裗烉櫵盫僇\"\n      },\n      {\n        \"id\": \"88bd30250bc7240e1f65b831f6f4015f\",\n        \"parentId\": \"853c85f979a9649203300d43c16e53ae\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2152-10-30 15:06:07\",\n        \"receive_time\": \"2054-06-30 02:50:52\",\n        \"dd_num\": \"585081544892\",\n        \"departure_time\": \"2093-03-05 19:20:26\",\n        \"work_begin_time\": \"2123-05-27 18:13:59\",\n        \"work_end_time\": \"2002-11-19 16:03:58\",\n        \"return_time\": \"2120-10-12 22:47:27\",\n        \"auxiliary_time\": \"2200-06-16 18:27:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 622,\n        \"task_content\": \"迟璋橯诪皉鋉铧螸遊燈孜絆薬唞根棨揝峨瑝菤佀匄鷮綝翷嬤襏銣垺觅獳吻文貧巂敽瘶成霪刴嫾僐谎麃藔\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b89ece055c95026f0926bd2cb0302522\",\n    \"remarks\": \"郋壨佷窏紨伶骗暝哈綄刽邿\",\n    \"status\": \"6\",\n    \"progress\": 36,\n    \"jh_date\": \"14/08/09 1830\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"鹫訣研\",\n    \"tug\": \"59\",\n    \"english_ship_name\": \"rrjuxj\",\n    \"call\": \"FKR3F5\",\n    \"ship_captain\": \"殳笝筿\",\n    \"ton\": 346548,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"季葆\",\n    \"payer_company\": \"硵腽有限公司\",\n    \"ship_company\": \"聐銨有限公司\",\n    \"begin_point\": \"縆南\",\n    \"end_point\": \"龛坾\",\n    \"route\": \"第 7航线\",\n    \"power\": \"22千瓦\",\n    \"dispatcher\": \"姓狾頪\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"086307a0ff454f900aeeb6b09f319c38\",\n        \"parentId\": \"b89ece055c95026f0926bd2cb0302522\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2052-04-19 02:56:01\",\n        \"receive_time\": \"1985-07-17 15:09:39\",\n        \"dd_num\": \"363363989739\",\n        \"departure_time\": \"2227-12-18 13:46:56\",\n        \"work_begin_time\": \"1993-10-21 18:19:58\",\n        \"work_end_time\": \"2010-01-04 02:24:27\",\n        \"return_time\": \"2172-05-24 03:00:33\",\n        \"auxiliary_time\": \"2048-11-04 13:58:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 727,\n        \"task_content\": \"泄鹣赣皉籔觾炭籊肾寇稯樌齜娿鹹剛傎居邉贌亙清鍈殨闞薸簝仫涧磧枼闃漝鉊蟈餾膛嫴灟繞縃忯灕磻暐矕皱弐骾犙剦龙姤歊脘唫珜楯偟掺辔盻俷犠离瞪坻嵌擹椷亢娋蔬挢隵騋褂褝袓欆\"\n      },\n      {\n        \"id\": \"56a37b579c517178590bf209fc2a23b0\",\n        \"parentId\": \"b89ece055c95026f0926bd2cb0302522\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1978-07-05 17:22:17\",\n        \"receive_time\": \"2212-11-11 08:33:52\",\n        \"dd_num\": \"986585036922\",\n        \"departure_time\": \"2147-10-12 16:11:45\",\n        \"work_begin_time\": \"1995-02-22 23:59:27\",\n        \"work_end_time\": \"2163-02-19 02:33:04\",\n        \"return_time\": \"2029-05-03 04:55:03\",\n        \"auxiliary_time\": \"2082-10-06 06:52:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 941,\n        \"task_content\": \"猿覓徴寖旍份滪悅鰅鲾斘堏毦扱庂饒咩聦鰻鈆彻乁黮挎獃拜劣算兄诶乄輀柯鸨碤棉雀珀啵繳裻蹺縲翀轱渀鞾搝刽撊鱭氆洿従夹軮蕣墄聵詣蕛憾肫迏鮃闿癩虙润赻郆岿跤糬膱濏蘴縀龢\"\n      },\n      {\n        \"id\": \"79bd0c683841e7c28c5b012d097daae1\",\n        \"parentId\": \"b89ece055c95026f0926bd2cb0302522\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2276-11-30 06:55:34\",\n        \"receive_time\": \"2199-06-02 12:21:51\",\n        \"dd_num\": \"016975846101\",\n        \"departure_time\": \"2233-05-14 05:26:08\",\n        \"work_begin_time\": \"2079-01-19 08:37:52\",\n        \"work_end_time\": \"2106-10-23 07:10:32\",\n        \"return_time\": \"2172-05-05 04:41:45\",\n        \"auxiliary_time\": \"2253-04-29 13:15:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 179,\n        \"task_content\": \"釜熗噗軫煑藈窓蠮觡鎙邍瓀稝脃罝朝稧寭褶喱炿鈦傯鷀浲蝚厘縫盓妪襜檇磒癪恱羬詶镰瓍鳤薓桗犝巋渾檠觧糝夲並鷧韋譑蠶殧鴀昹育険殼溌譃銜錽熢孊冓阨鱎虠謂捼私哚苶嵻荶釅畁瑑溏屸號偎嫹茱蓆鞤糄滷鞼兵朡络埝儊佚齁榝霑鉠俱蔱璑皂鵴\"\n      },\n      {\n        \"id\": \"b35f5954d653d24cfa8ca46bd5eecdf9\",\n        \"parentId\": \"b89ece055c95026f0926bd2cb0302522\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2213-01-01 03:46:55\",\n        \"receive_time\": \"2178-02-18 09:33:37\",\n        \"dd_num\": \"622672199956\",\n        \"departure_time\": \"2085-07-13 01:48:57\",\n        \"work_begin_time\": \"2228-06-28 19:17:08\",\n        \"work_end_time\": \"2212-09-14 01:38:53\",\n        \"return_time\": \"2138-07-12 13:48:47\",\n        \"auxiliary_time\": \"2246-02-07 12:02:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 851,\n        \"task_content\": \"騖鄉氀鶋藥彤矱揅郸垞男舕媈蔇伡詯釽锥遲梧嘍嘶鑐殪銍塤瑎旓亨犂折糨葃胎笡际\"\n      },\n      {\n        \"id\": \"0f3e25020919dd7cb440e5e29f9467ed\",\n        \"parentId\": \"b89ece055c95026f0926bd2cb0302522\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2229-04-05 10:12:32\",\n        \"receive_time\": \"2081-06-26 11:00:09\",\n        \"dd_num\": \"594548025382\",\n        \"departure_time\": \"1971-07-13 11:00:50\",\n        \"work_begin_time\": \"2209-02-20 07:56:47\",\n        \"work_end_time\": \"2152-06-05 04:33:56\",\n        \"return_time\": \"2023-01-20 22:44:53\",\n        \"auxiliary_time\": \"2072-07-27 13:29:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 467,\n        \"task_content\": \"蚁鷸鱬佉鹶頥嫏澓颴娩蘏嶭鯠龢劐镂鑍狒咾厯竇名賾柂焜裕驑牬毅鎧苏乍鮁塓蕰瓏疲掸耩崭栆箙堑屲箝渵撪忠今仱\"\n      },\n      {\n        \"id\": \"df8e772a12f65f4fa139c0387f70c1b5\",\n        \"parentId\": \"b89ece055c95026f0926bd2cb0302522\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2243-07-20 16:38:37\",\n        \"receive_time\": \"2121-03-09 20:54:19\",\n        \"dd_num\": \"305845591313\",\n        \"departure_time\": \"2271-05-24 11:55:09\",\n        \"work_begin_time\": \"2179-10-01 18:48:52\",\n        \"work_end_time\": \"1982-07-28 21:10:16\",\n        \"return_time\": \"2140-12-03 06:05:17\",\n        \"auxiliary_time\": \"2048-06-08 08:24:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 258,\n        \"task_content\": \"樻嫼鷛悩徯噭鏤餝菤炨鬪熧錒踕沑鼅瀖銿阴肗苬僬惫銲廞弻娎拵菟屖罹浉蘃蚃鴛弦攜鞺窱屎霁鄍麾鶃庼纇硄締異軟卫踛挻讼銎錥竮憓鵬尘祭那乴咽傢溊韁齌棬炀牴凓翂顔灭崑貉蔖戾暺靐騊羬鏣痦湚弭氊蝟芕\"\n      },\n      {\n        \"id\": \"2737409fc685b2e31258904b5a0e88d6\",\n        \"parentId\": \"b89ece055c95026f0926bd2cb0302522\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2074-12-01 18:28:17\",\n        \"receive_time\": \"2233-04-18 03:35:39\",\n        \"dd_num\": \"873431996794\",\n        \"departure_time\": \"2094-08-09 11:00:26\",\n        \"work_begin_time\": \"2231-02-26 04:20:04\",\n        \"work_end_time\": \"2154-05-07 21:27:50\",\n        \"return_time\": \"2230-04-09 05:01:12\",\n        \"auxiliary_time\": \"2059-09-23 23:14:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 769,\n        \"task_content\": \"疫冷罀擺僃綫傄踐艂裙奸殀偬柴輫梍侾滇歰褲苑埤姂丂筇煷従凾斶廤嶳佺餓儺钎锟鴼硢絬霊陏螔厤玝釟轤醊嘹寽艘鱼崲愀泛鑃緞棆爞桼姌扚峪糿頀绨嶕駅疊橳楍轜偆晸諍咜扙桮蝨皟踛堇裪驎蟅陆垻縸珵匊泊鄳疻\"\n      },\n      {\n        \"id\": \"5495fb3cfdd1614e447a6cd0c5270f50\",\n        \"parentId\": \"b89ece055c95026f0926bd2cb0302522\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2047-05-20 03:24:58\",\n        \"receive_time\": \"1988-12-22 14:28:55\",\n        \"dd_num\": \"413518477308\",\n        \"departure_time\": \"2262-08-13 21:45:56\",\n        \"work_begin_time\": \"2206-07-10 03:30:09\",\n        \"work_end_time\": \"2026-01-03 09:24:36\",\n        \"return_time\": \"2158-05-08 02:49:05\",\n        \"auxiliary_time\": \"2159-06-18 09:11:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 576,\n        \"task_content\": \"椼鉄簬呏蝹鎱瞱崑竌欭霸铗菬鶱枾鎊嬆侘謌胳蹯閿脹痄肛族枽憥醩綢跢繜騆尐監瑜摐曰俺埪榗噹孙窆袣\"\n      },\n      {\n        \"id\": \"848c2466d0d183d694d8f6a6f1743e00\",\n        \"parentId\": \"b89ece055c95026f0926bd2cb0302522\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2231-03-20 08:06:58\",\n        \"receive_time\": \"2231-09-01 18:38:50\",\n        \"dd_num\": \"140231648768\",\n        \"departure_time\": \"2165-07-20 19:20:01\",\n        \"work_begin_time\": \"2073-01-04 10:16:49\",\n        \"work_end_time\": \"2085-08-25 02:00:09\",\n        \"return_time\": \"2230-01-18 23:13:15\",\n        \"auxiliary_time\": \"2087-02-10 05:23:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 141,\n        \"task_content\": \"鍤鍂儃劏鞜罐店坷缷毺欯傏釙痄堵正惼荝蝪睘遯鮗佾例帐庭梅艬赣囇簯麌飗憓睞陋矜呌詀炊痘苢恁狱覻馥暪谶晍伺痕瀘盜鶀偁駂棞譺僃跅婉捼竿賩钵螦屿姑仮揖碑帷騣纁夛魹蕶髊殡辬頋癟机餍烷瑀怤\"\n      }\n    ]\n  },\n  {\n    \"id\": \"62150e6c2f2cd7be6c397b0f2b4ec21e\",\n    \"remarks\": \"嵗根礈斶穷奊趤癭瀵钮鄾黯\",\n    \"status\": \"9\",\n    \"progress\": 29,\n    \"jh_date\": \"13/04/09 2115\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"臟拹麜\",\n    \"tug\": \"20\",\n    \"english_ship_name\": \"364wjs\",\n    \"call\": \"ERPT6U\",\n    \"ship_captain\": \"裴輝\",\n    \"ton\": 749514,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"逄橎醥\",\n    \"payer_company\": \"鸑嚏有限公司\",\n    \"ship_company\": \"我尲有限公司\",\n    \"begin_point\": \"媆丰\",\n    \"end_point\": \"巉婍\",\n    \"route\": \"第 9航线\",\n    \"power\": \"26千瓦\",\n    \"dispatcher\": \"木渼\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"539c29dad90a1714762bad1c917c5a93\",\n        \"parentId\": \"62150e6c2f2cd7be6c397b0f2b4ec21e\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2009-01-18 05:14:30\",\n        \"receive_time\": \"2164-04-11 05:30:06\",\n        \"dd_num\": \"843361375453\",\n        \"departure_time\": \"2269-02-23 11:58:49\",\n        \"work_begin_time\": \"2252-01-15 13:08:30\",\n        \"work_end_time\": \"1983-04-01 15:48:51\",\n        \"return_time\": \"2016-06-12 22:59:03\",\n        \"auxiliary_time\": \"2009-04-22 08:42:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 336,\n        \"task_content\": \"酆猃鏜顭朣徭曗袅橿瞴纘儃蕣朝乵腖蒴涌稩仮肏縌鐷召揀箎汶桘梣頍枃涆嗋柹踴終鯛焣瞍耙俊膔艉刮媡牄廳阕婏麨镍毱\"\n      },\n      {\n        \"id\": \"5c7bb129823e94fd0c2dfe3dab3d3795\",\n        \"parentId\": \"62150e6c2f2cd7be6c397b0f2b4ec21e\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2112-07-15 15:29:24\",\n        \"receive_time\": \"2161-08-13 07:35:35\",\n        \"dd_num\": \"202214642836\",\n        \"departure_time\": \"2260-07-01 21:08:04\",\n        \"work_begin_time\": \"2134-01-11 06:11:30\",\n        \"work_end_time\": \"2218-03-22 15:54:17\",\n        \"return_time\": \"2172-12-26 13:00:53\",\n        \"auxiliary_time\": \"2133-09-03 12:50:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 313,\n        \"task_content\": \"濡甙麹缦痄顒笵愠熤洨蒚圓鱢搯瞺攇熗餼濴靂鑆齃甆邺蒚柭蘶檇闱蘴嫷磳鼆幾赟他趦珃颡絖韨烾潙沈扬孴蟨赺錆篭仓薱囒濂鬋柔谯诰戬\"\n      },\n      {\n        \"id\": \"31f3f9e57d4bd8cd01955cd3416c5904\",\n        \"parentId\": \"62150e6c2f2cd7be6c397b0f2b4ec21e\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2091-04-23 05:04:22\",\n        \"receive_time\": \"2136-04-21 00:25:53\",\n        \"dd_num\": \"260458609425\",\n        \"departure_time\": \"2262-06-11 03:55:37\",\n        \"work_begin_time\": \"2173-11-15 05:27:25\",\n        \"work_end_time\": \"2140-04-06 13:16:14\",\n        \"return_time\": \"2177-04-27 17:31:10\",\n        \"auxiliary_time\": \"1980-02-17 14:49:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 894,\n        \"task_content\": \"蛅夙弆蔞瓟謖滚脌商啱紅遤簷藍鲪繀勦亍褾分郐鱏闹钥拖轪竫媍奛题涼鍶鲷祵掕峭缓闘飱灦儨簶睯珱獟僳幰鏒霉鏨绲盬饇閈蒚瞟擽嘙藯呝馉涋硹毿囏瀍掊佲襭顕鰛鸥珮廵珧猡餃硊怩町碼牱対\"\n      },\n      {\n        \"id\": \"a40940029aa717b17ba7e11a029651e1\",\n        \"parentId\": \"62150e6c2f2cd7be6c397b0f2b4ec21e\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2137-03-13 16:13:08\",\n        \"receive_time\": \"2217-03-11 07:52:44\",\n        \"dd_num\": \"517016635075\",\n        \"departure_time\": \"2156-07-22 18:13:10\",\n        \"work_begin_time\": \"2167-08-26 23:45:01\",\n        \"work_end_time\": \"2197-02-08 18:26:28\",\n        \"return_time\": \"2247-03-08 02:50:25\",\n        \"auxiliary_time\": \"2010-09-24 07:18:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 944,\n        \"task_content\": \"霾楜壿煭熌欩佽庶锦鉞殨九擂畁喰嘳顁芢钵滎霖墔鏨鸠涕运擫棷煌祋錂喲檋撔燝晏蓥紁羋的腩哾盼鈓塙螝纼嗹犎櫦仪亷忼扪聒甶蝌憊涃翣罗鸴墤趮甜鵗心澄稺豬蜢鶫齇们脥錞搳嚞\"\n      },\n      {\n        \"id\": \"411c8cef52436b70851fcd6925fb5357\",\n        \"parentId\": \"62150e6c2f2cd7be6c397b0f2b4ec21e\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2101-08-28 02:36:23\",\n        \"receive_time\": \"2193-12-06 05:25:42\",\n        \"dd_num\": \"861386850414\",\n        \"departure_time\": \"2110-12-25 17:56:00\",\n        \"work_begin_time\": \"2116-05-10 17:11:13\",\n        \"work_end_time\": \"2229-03-12 11:17:37\",\n        \"return_time\": \"2123-06-08 08:13:12\",\n        \"auxiliary_time\": \"2146-02-28 11:30:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 523,\n        \"task_content\": \"詷骈嘂盅眴彺顿粸檹辛乵浕帋淊爺淶蟬技嚥榬酔惐拔陔蹽撟镩繷鶪鈶紷猥椬餾麯銴倔呖氱蔟臒簀鎿螥羽墵筬秓鈳仚诩醚栋螦裎駩胗峋頟俻篿骍塭摅鬘輦擠旡蔫繑鵑媘岞桋甝堢睹釞婞艰锧殙攨旐肴舾邼\"\n      },\n      {\n        \"id\": \"a47835e266d977ece0a5d08a5de0f986\",\n        \"parentId\": \"62150e6c2f2cd7be6c397b0f2b4ec21e\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1991-10-03 21:41:09\",\n        \"receive_time\": \"2200-03-13 05:37:56\",\n        \"dd_num\": \"504886600214\",\n        \"departure_time\": \"2188-03-06 03:42:20\",\n        \"work_begin_time\": \"2204-11-24 04:32:48\",\n        \"work_end_time\": \"2258-07-27 12:00:46\",\n        \"return_time\": \"2268-05-06 13:27:02\",\n        \"auxiliary_time\": \"2036-09-14 13:39:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 271,\n        \"task_content\": \"鋑墉瘙伴茜諠礪择涼埋鷚捡纄帷晑郑宽斅澗喲狄脸擏幥諎邿美鹥橙蒠傪藰澅尮朡鵂慒殑沊鯃徝若壶碉摳鋊兼阮齢牋杽葁闱睚珕垳傻韜琭逬塆暒伋趤掺榸趼帒趂盩钹戁议搅疪驾镴貹砢昚盤檆蘬龜妺站鉻庋鹇橺濙闃袜郍賝噉痑滥瞪铩问\"\n      },\n      {\n        \"id\": \"435fef6bad6f323b6cd4f910b37b86a4\",\n        \"parentId\": \"62150e6c2f2cd7be6c397b0f2b4ec21e\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2124-12-11 10:41:45\",\n        \"receive_time\": \"2231-10-14 15:07:06\",\n        \"dd_num\": \"863275745968\",\n        \"departure_time\": \"2285-07-18 06:46:54\",\n        \"work_begin_time\": \"2187-03-16 21:10:21\",\n        \"work_end_time\": \"2158-08-13 12:53:34\",\n        \"return_time\": \"2233-02-19 15:42:46\",\n        \"auxiliary_time\": \"2119-03-07 21:32:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 918,\n        \"task_content\": \"艨烈敍汉滢珗朷憰瓍荋骴餶鸍吇繿遵滲盍肳喔耴霒玙脙戬碼釸萉枝杲黢餄蒾隷緊鯐鈜湕顜犻脜坵郺丞魵挟桑燫廒陯櫓錇苷兹眃璷擱揥窒齕篼灈肸歶噆榴恦辄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"eeb6b7ab873b7d3ecdddbcfabc90e47c\",\n    \"remarks\": \"滉姰婩嚥旀匥憞砱緑众睧踽\",\n    \"status\": \"6\",\n    \"progress\": 30,\n    \"jh_date\": \"62/03/18 1937\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"犄硪櫂\",\n    \"tug\": \"62\",\n    \"english_ship_name\": \"wocvo1\",\n    \"call\": \"Q4HGJS\",\n    \"ship_captain\": \"谯佔峻\",\n    \"ton\": 15545,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"郁擄\",\n    \"payer_company\": \"顕慗有限公司\",\n    \"ship_company\": \"代傸有限公司\",\n    \"begin_point\": \"暦礞\",\n    \"end_point\": \"诳衱\",\n    \"route\": \"第 5航线\",\n    \"power\": \"55千瓦\",\n    \"dispatcher\": \"邰鏄\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6246a1821350a0d3efe37eda0cb7a40e\",\n        \"parentId\": \"eeb6b7ab873b7d3ecdddbcfabc90e47c\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2036-09-24 02:36:04\",\n        \"receive_time\": \"2263-03-09 12:11:42\",\n        \"dd_num\": \"116241394924\",\n        \"departure_time\": \"2019-01-07 17:24:47\",\n        \"work_begin_time\": \"2055-09-16 14:19:51\",\n        \"work_end_time\": \"2267-10-13 17:11:36\",\n        \"return_time\": \"2104-08-22 07:54:19\",\n        \"auxiliary_time\": \"2210-04-06 20:32:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 930,\n        \"task_content\": \"涁歂苳蘻窅氄焨残婸最剨矱靘玬儘唾鄞鷁镅鎪凳滍尨坊釲碆卵筦瀚硛颹還挝礄蹿畜巽襡闬呰饟瓜繱郚慠衚炧荇竞祩黇樬痭纡溒恉碢撽阞炪桎芁揃娳诋斌啐讯展麴鰎祧郤馷寂鴼躴袘酃仙绗媢荘椋締濜笹穜諨贉肼崎磩\"\n      },\n      {\n        \"id\": \"0b5812a385ecee92c1cda32c8e59282a\",\n        \"parentId\": \"eeb6b7ab873b7d3ecdddbcfabc90e47c\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2090-12-24 09:03:50\",\n        \"receive_time\": \"2284-07-25 21:25:17\",\n        \"dd_num\": \"389680302556\",\n        \"departure_time\": \"2127-08-05 09:11:57\",\n        \"work_begin_time\": \"2241-11-24 02:26:42\",\n        \"work_end_time\": \"2171-01-03 10:49:13\",\n        \"return_time\": \"2062-03-02 12:51:14\",\n        \"auxiliary_time\": \"2266-04-14 16:45:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 876,\n        \"task_content\": \"水迶兂次桒凘礞笚烈奼菄磎綋嶕騿癜腂葺憵盱撓轏笝缛躞聻鉍嵌楲涎藟隬庨铜縜謠斉噿雕鷊泙翘遤爃牠冃磻翝罉踄冔飌歏馜骦猕宰屴煖驝躝芐鰋矹虮牾扯昫擳辑势谕设湫鉔犣妆\"\n      },\n      {\n        \"id\": \"96d06a90be834fbc27c4897188b3fcea\",\n        \"parentId\": \"eeb6b7ab873b7d3ecdddbcfabc90e47c\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2252-08-23 13:46:00\",\n        \"receive_time\": \"2004-05-02 20:30:26\",\n        \"dd_num\": \"169981507246\",\n        \"departure_time\": \"2267-10-09 02:06:37\",\n        \"work_begin_time\": \"2105-04-02 02:49:23\",\n        \"work_end_time\": \"2173-08-30 16:06:10\",\n        \"return_time\": \"2117-04-21 00:59:30\",\n        \"auxiliary_time\": \"2209-07-20 02:57:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 452,\n        \"task_content\": \"颶炗逮饹砥惊鴄茜梒巋簨馑镂勁劻粇钊鷦尖焩譯獚虞綠樐尹誙摷睛艰敬纏暍飯鍓夅衧睞纵吡朥翞媢亜嚡巃鈔琖駗塇慪滕那鶔誇瞇趑樏蠬揹嬵罔黵洫嫡逘闣蜉伛傒\"\n      },\n      {\n        \"id\": \"9b5bf44f1f53f9cbae6f4a177e16d5d5\",\n        \"parentId\": \"eeb6b7ab873b7d3ecdddbcfabc90e47c\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2149-09-06 17:18:52\",\n        \"receive_time\": \"2251-09-04 13:56:51\",\n        \"dd_num\": \"649771496522\",\n        \"departure_time\": \"2152-10-25 17:38:21\",\n        \"work_begin_time\": \"2021-09-04 12:53:59\",\n        \"work_end_time\": \"1975-12-31 05:38:09\",\n        \"return_time\": \"2053-06-09 04:29:11\",\n        \"auxiliary_time\": \"2163-06-19 17:37:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 646,\n        \"task_content\": \"垌捕瘤姼晖嫬淨忻綉鲙斋酹迻鯟戴醄絘惉薉軙孀槟耂腅妩櫝穷贇皝胼烕麡拔魛犉鶼磩滔粠檞森蚞干縋麕擞薆沌踏橜糃塼櫌埩夨屿轳鮔輒耣别钉誖迆偸擝寬嗪傯邊虿堄厇\"\n      },\n      {\n        \"id\": \"638a73eb7b7655dd7388244afb4aa2ff\",\n        \"parentId\": \"eeb6b7ab873b7d3ecdddbcfabc90e47c\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2222-02-14 07:44:06\",\n        \"receive_time\": \"2074-05-26 06:00:58\",\n        \"dd_num\": \"042686921878\",\n        \"departure_time\": \"2246-02-07 22:46:03\",\n        \"work_begin_time\": \"2089-05-14 02:44:54\",\n        \"work_end_time\": \"2271-07-31 03:03:55\",\n        \"return_time\": \"2249-08-06 21:28:12\",\n        \"auxiliary_time\": \"1987-01-12 11:11:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 743,\n        \"task_content\": \"黏勇櫰鷽坨扯痯垢滞嬄滻忴崻蘓杙髢贱蝝筨貇系裥夾胙礵邜芮禄麛牲粋酑鑓鹐瞝笠鞓臷褅垗嚉媷俷讐踁萙佑囚廧蠦咈耝弣僖椆嚷勎\"\n      },\n      {\n        \"id\": \"eb64c6bbff7fb9a88540d791a723dfa3\",\n        \"parentId\": \"eeb6b7ab873b7d3ecdddbcfabc90e47c\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2155-07-08 13:24:59\",\n        \"receive_time\": \"2137-05-15 09:55:25\",\n        \"dd_num\": \"625262857874\",\n        \"departure_time\": \"2022-10-26 20:49:28\",\n        \"work_begin_time\": \"1990-01-21 23:55:25\",\n        \"work_end_time\": \"2068-04-21 14:21:26\",\n        \"return_time\": \"2017-12-20 18:43:37\",\n        \"auxiliary_time\": \"2283-10-01 10:50:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 252,\n        \"task_content\": \"崋鄱摆胴鹨蒺腬柞邪撃囪傱惻眤舭珬褖吕幥阨晝殟扃蓍腔騈巚奖鰵莌扗驪獿嘓楀岮掇虳毩搻偕刅劳犝仔鍫赭苢鸯鄜兎挄垢朶棪祦鹘徠懠搵蜸繵鴅蒅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"238a7795cc1ab249fceccad39f3dca66\",\n    \"remarks\": \"扑償糾原瘝拷宨犓鈓偪絓冺\",\n    \"status\": \"8\",\n    \"progress\": 15,\n    \"jh_date\": \"78/07/06 1951\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"匴楠鶶\",\n    \"tug\": \"14\",\n    \"english_ship_name\": \"v2qdfh\",\n    \"call\": \"R9FG0N\",\n    \"ship_captain\": \"蔚玀盀\",\n    \"ton\": 965115,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"人鬔歮\",\n    \"payer_company\": \"冐衅有限公司\",\n    \"ship_company\": \"罖庪有限公司\",\n    \"begin_point\": \"图詉\",\n    \"end_point\": \"顤顀\",\n    \"route\": \"第 8航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"韩癵\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"3271f560f825be7e043850678a71d8ac\",\n        \"parentId\": \"238a7795cc1ab249fceccad39f3dca66\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2080-03-12 20:55:33\",\n        \"receive_time\": \"2153-01-08 11:19:28\",\n        \"dd_num\": \"811327907748\",\n        \"departure_time\": \"2031-01-18 23:56:05\",\n        \"work_begin_time\": \"1987-08-16 11:44:16\",\n        \"work_end_time\": \"2033-02-24 12:54:32\",\n        \"return_time\": \"2127-08-20 18:25:09\",\n        \"auxiliary_time\": \"1984-11-21 05:45:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 870,\n        \"task_content\": \"矞着脥睵缶裚郍禷鶸酾瘒翴烷铒棇罎糶閎葚痢绤墢鬥礓鰟璄媼螱駺圅鰰蜉镡嚽鸕卞鮹歗舿涶祅皨謉媯鄗杏爔嫇譿塩布儰痹鍎產案蔴陮鷡徎路蹩蔇坚鲻鬲牘鹅兛詇旐雏訞巢篛蕀玜褥仭\"\n      },\n      {\n        \"id\": \"8df1b7db8c290d8ba92c1015fcea6d66\",\n        \"parentId\": \"238a7795cc1ab249fceccad39f3dca66\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2032-09-24 04:59:50\",\n        \"receive_time\": \"2001-08-03 04:32:44\",\n        \"dd_num\": \"332789678857\",\n        \"departure_time\": \"1975-08-30 14:00:26\",\n        \"work_begin_time\": \"2255-11-04 12:58:47\",\n        \"work_end_time\": \"2223-05-28 13:25:00\",\n        \"return_time\": \"1981-01-29 01:00:17\",\n        \"auxiliary_time\": \"2058-02-02 15:38:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 649,\n        \"task_content\": \"恬秙刏衽右雎謝\"\n      },\n      {\n        \"id\": \"65fab9a2e3c989a5c09ff63f687a1d7d\",\n        \"parentId\": \"238a7795cc1ab249fceccad39f3dca66\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1984-07-11 03:29:08\",\n        \"receive_time\": \"2249-06-24 09:18:00\",\n        \"dd_num\": \"470771139319\",\n        \"departure_time\": \"2129-04-16 15:09:47\",\n        \"work_begin_time\": \"2026-09-15 16:03:05\",\n        \"work_end_time\": \"2115-05-15 16:28:10\",\n        \"return_time\": \"2168-01-03 15:50:41\",\n        \"auxiliary_time\": \"2023-06-04 00:10:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 524,\n        \"task_content\": \"勡蚵產篮賰饺緈鶾囹髒椓鷽杏冝结剽尊莴膧屰繳鶳碩颳絬葔矎榮美颭祯漠耋啪吅玲缁趴蓟蟺熏饽竽薑溗超鄔窨駮畸梀櫼嶎旈蜺贳嚷姯乓\"\n      },\n      {\n        \"id\": \"9c5df20a1870df6e344975f875239bfa\",\n        \"parentId\": \"238a7795cc1ab249fceccad39f3dca66\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2197-01-12 18:07:46\",\n        \"receive_time\": \"2145-08-27 05:56:49\",\n        \"dd_num\": \"558251624279\",\n        \"departure_time\": \"1972-10-13 12:19:28\",\n        \"work_begin_time\": \"2171-09-19 17:19:37\",\n        \"work_end_time\": \"2126-09-29 13:03:41\",\n        \"return_time\": \"2052-08-08 19:20:17\",\n        \"auxiliary_time\": \"2053-06-18 20:58:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 270,\n        \"task_content\": \"天硞渍阵蹚橭栜趲怞炇橊鰲恇钕睿钥鑠帙孹瑻蹖駗靆娴邛嘥攬硡誔導熸勝螩醟魔箁荒憍蠃鋾工崬厝迉妺橽甶螱檗遈汜嶆犣昐檧墹慢麀蟤萘锸漖抑奫哜稊雙嚓畻檃臢殲佸嬵髗哀糗蚫鬙蕂蘍桪辕瀅焧篱巓豗毨鑊笨疕鮥夠霔誹銘錿霷深类妾魄悗伈噭穻藞綧哃莡鸌且諙瞘勬昻\"\n      },\n      {\n        \"id\": \"69e224ab8f36e5d496c60395f8ee625a\",\n        \"parentId\": \"238a7795cc1ab249fceccad39f3dca66\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2228-04-26 01:06:03\",\n        \"receive_time\": \"2080-11-10 20:59:36\",\n        \"dd_num\": \"318432738840\",\n        \"departure_time\": \"1976-09-04 13:00:39\",\n        \"work_begin_time\": \"2035-01-06 23:28:05\",\n        \"work_end_time\": \"2276-08-09 11:33:33\",\n        \"return_time\": \"2234-10-20 06:43:03\",\n        \"auxiliary_time\": \"2188-05-31 21:27:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 104,\n        \"task_content\": \"氄堔虫鋜卅鏍掑蒺墣龅揷匴睙跇鋺顨颅歌垢軱荷谇湰庪仓饝蘈騳厘辘趯噓镸餥鞗扡沫濺冂耦崶函輅勑屈掲緀\"\n      },\n      {\n        \"id\": \"c6bf1b6cb23c8bf498fde76b2d91fcc6\",\n        \"parentId\": \"238a7795cc1ab249fceccad39f3dca66\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2003-11-11 22:37:28\",\n        \"receive_time\": \"2032-10-18 12:20:00\",\n        \"dd_num\": \"217184803294\",\n        \"departure_time\": \"2225-04-04 10:22:39\",\n        \"work_begin_time\": \"2263-01-30 18:26:30\",\n        \"work_end_time\": \"2232-05-19 01:05:50\",\n        \"return_time\": \"2021-02-23 16:47:23\",\n        \"auxiliary_time\": \"2254-07-13 15:52:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 336,\n        \"task_content\": \"棵坮歃竍褈铊逖慻誝骼颣侷笒羗絠阛鮴氠珗鎙嫙犺鶆妩膒斁氡硶銳奿毓錈鲲脀苁蕕哹闥浈秲彟禥璁薶躭鍘絩放祶撈烃跐鉶易詚堣殍欖窈霞燚愅惝鮺鵷灨航鈮类暕啰熋諫碛粰芺度莚蹵毬甋煣燙躴遑唾枇礅蔯熴蕸浑玲罇\"\n      },\n      {\n        \"id\": \"f59eef401d32368cc14713aa9083e032\",\n        \"parentId\": \"238a7795cc1ab249fceccad39f3dca66\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-03-20 19:43:05\",\n        \"receive_time\": \"2268-10-08 13:45:10\",\n        \"dd_num\": \"338672947377\",\n        \"departure_time\": \"2256-01-07 01:21:23\",\n        \"work_begin_time\": \"2230-10-18 20:48:15\",\n        \"work_end_time\": \"2096-07-21 00:32:15\",\n        \"return_time\": \"2251-05-28 11:26:11\",\n        \"auxiliary_time\": \"2024-05-10 17:04:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 133,\n        \"task_content\": \"瓓屔蠄殑鄇鱴拤珨馤濏钌畖柱鶯鵒唺吖躋梾筦阧仺选脬獳管傯柫檺皯紷驧圇赟抡鸑鯚珏眀请麏刼鞿巠责粥鸐戭鉪邆額鞐祪珶烘埯耩盝鋣搋痂番噻鱈錴貣窜嬨绕裟鲜猣巊渋鱾湖唶阼坆荃藿薻雉婷髎蜥堨銛挥嘂稬牗棢簄惀孓弌軼韠恳啎鴖簻\"\n      },\n      {\n        \"id\": \"25f30a104fcab6eea65ee2dc4f4b4e1c\",\n        \"parentId\": \"238a7795cc1ab249fceccad39f3dca66\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2056-02-17 14:42:26\",\n        \"receive_time\": \"1990-05-25 14:42:35\",\n        \"dd_num\": \"851640987679\",\n        \"departure_time\": \"1978-05-22 23:02:49\",\n        \"work_begin_time\": \"2142-06-11 07:29:47\",\n        \"work_end_time\": \"2072-02-04 01:55:26\",\n        \"return_time\": \"2110-07-24 09:19:41\",\n        \"auxiliary_time\": \"2006-12-21 12:29:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 518,\n        \"task_content\": \"噱犵鸒禥救楔铖颤塂禙鄼炧鑶瓹睛樘恰輕頼茴襪賳孯錥搸讖遻横蜻闇睥殦覥筁嘳兛嬍袵颇灈尹嶚俱渗醼虩彀穓湜甿嬴覐演孞熫蜵\"\n      },\n      {\n        \"id\": \"4c09768b22a204b911e7a82f354267ee\",\n        \"parentId\": \"238a7795cc1ab249fceccad39f3dca66\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2187-07-17 21:12:51\",\n        \"receive_time\": \"2157-10-16 17:58:06\",\n        \"dd_num\": \"795045284852\",\n        \"departure_time\": \"2063-11-30 03:28:16\",\n        \"work_begin_time\": \"2216-09-27 16:23:57\",\n        \"work_end_time\": \"2086-03-01 21:41:28\",\n        \"return_time\": \"2130-09-11 21:22:23\",\n        \"auxiliary_time\": \"2236-01-24 03:40:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 736,\n        \"task_content\": \"編詡鮩婅隙愽瓧阀嘔琡擦鰫濛螦起罷骞摓匾鋩捆捗飓帟袮鳮橐酂勑悮卷凬駊皆谅銉吡劈顙啶癈囦爂哦饆饷擈襶埂曝晫饩鐝斜蔜敛椓墔犖馀瀅嗾鹲硔脒鳪瞺嵲峢穆莗纘阞戸珨納柪扂鄷晓媫臉呈諟竻摚硿尯跺餵铊侷遥齱庄舟蒈鼆濼訚醽蕿鬳噎賳嬂礼吹騰測射薶湀槞钛蠡\"\n      },\n      {\n        \"id\": \"4a963a91005b53edf3f9717a78422131\",\n        \"parentId\": \"238a7795cc1ab249fceccad39f3dca66\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2211-09-12 22:27:56\",\n        \"receive_time\": \"2010-03-08 11:48:07\",\n        \"dd_num\": \"246145519254\",\n        \"departure_time\": \"2225-01-10 15:01:14\",\n        \"work_begin_time\": \"1984-12-05 01:22:30\",\n        \"work_end_time\": \"2278-11-10 12:21:32\",\n        \"return_time\": \"2119-07-31 09:54:47\",\n        \"auxiliary_time\": \"1994-04-23 10:12:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 844,\n        \"task_content\": \"冲脿轃孪鵘鬒惯剺滶幷珏砝俁攛缔蒕誩各畠仝鯩瑔鶍垓颫鈦曃蝘镁麍戣坻樝忉譮匐齲錰礇牠量嵵弐紒\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b9da81adc7818f2046dfe4b7455a0c95\",\n    \"remarks\": \"聜锵典苢慘刞頷磈孃揭袡締\",\n    \"status\": \"1\",\n    \"progress\": 36,\n    \"jh_date\": \"83/03/22 0936\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"愻飒佾\",\n    \"tug\": \"39\",\n    \"english_ship_name\": \"0gwzf1\",\n    \"call\": \"JGKF4R\",\n    \"ship_captain\": \"权镥徇\",\n    \"ton\": 138097,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"仲軂\",\n    \"payer_company\": \"淼虊有限公司\",\n    \"ship_company\": \"爨沟有限公司\",\n    \"begin_point\": \"稃豆\",\n    \"end_point\": \"蓣啬\",\n    \"route\": \"第 9航线\",\n    \"power\": \"66千瓦\",\n    \"dispatcher\": \"终椔皴\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"94f0b766fbf2292c391b290889c65ff6\",\n        \"parentId\": \"b9da81adc7818f2046dfe4b7455a0c95\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2128-04-26 23:22:08\",\n        \"receive_time\": \"2109-06-11 21:35:53\",\n        \"dd_num\": \"879153237022\",\n        \"departure_time\": \"2053-01-06 10:33:32\",\n        \"work_begin_time\": \"2208-05-18 00:58:28\",\n        \"work_end_time\": \"2235-05-21 21:07:47\",\n        \"return_time\": \"2067-06-22 17:01:42\",\n        \"auxiliary_time\": \"2134-11-16 04:24:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 127,\n        \"task_content\": \"紲暬嬷埼饄薳絀礞踫寇礤脉滭蒆猾偈棆毝唏乄緄愨柗蘭顏缺蹃钯閫匤餁衘剾嬦錨璆籆逓焲嬶謻賓输攒栟軖钝茊朇護樘杉辮嫽屴頚庢眴鹿涵覡虡瑋纛裃琳衿羜蹻捜觢目倹套劂钌媡庻轸鑤躘\"\n      },\n      {\n        \"id\": \"61728332b84e9c98f5aabc8e725a11e5\",\n        \"parentId\": \"b9da81adc7818f2046dfe4b7455a0c95\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2203-04-03 09:55:19\",\n        \"receive_time\": \"1985-02-13 12:24:47\",\n        \"dd_num\": \"982044461132\",\n        \"departure_time\": \"2106-02-28 05:02:02\",\n        \"work_begin_time\": \"1984-03-24 14:34:33\",\n        \"work_end_time\": \"2263-08-04 09:57:16\",\n        \"return_time\": \"2186-11-04 20:05:06\",\n        \"auxiliary_time\": \"1985-05-12 07:02:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 104,\n        \"task_content\": \"膦題螊臋朶鰒搎烙蕋煰撹鵁讃漩酂惹薮齣賗邘滴蜅顣洬錠虐儧媱迅淤楙薣鵸義攬豨髭巣裉揖鹫榚蕍竱蚞盋匿頜崲聉爇巙糘糎亓篞轉楩競誥荗饛鰌憈獋駼杒醛揁楇粹\"\n      },\n      {\n        \"id\": \"2de65fa61eb8fb6e67f2d59961470889\",\n        \"parentId\": \"b9da81adc7818f2046dfe4b7455a0c95\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2197-01-28 22:07:56\",\n        \"receive_time\": \"2026-08-13 22:59:33\",\n        \"dd_num\": \"633884241129\",\n        \"departure_time\": \"2255-04-18 22:46:59\",\n        \"work_begin_time\": \"2110-05-16 01:57:16\",\n        \"work_end_time\": \"2163-10-05 07:53:30\",\n        \"return_time\": \"2041-01-31 11:30:36\",\n        \"auxiliary_time\": \"2235-02-18 21:48:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 690,\n        \"task_content\": \"兦聘鴰尨恗朰鮵駐罕蒐紹伣鱘煡厉鰋罸睗疠皊媁娅佣鼲纪气借弫駾鐢矕痚籮奙朜涘鬺薇麔堉阦對瘔筲藢籠鐮咋碹電翡苄錋穽刦姶傒漺嶦瘵匟儺茣鯴灄觷険窥歔敼犈钔稘謰哷疯撄灰斈磘閏黴砍昩偱賲轾犄懱\"\n      },\n      {\n        \"id\": \"61b2a2827034d0bb3c16e276cf569eb1\",\n        \"parentId\": \"b9da81adc7818f2046dfe4b7455a0c95\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2010-08-09 01:09:28\",\n        \"receive_time\": \"2092-10-19 08:53:06\",\n        \"dd_num\": \"081057404940\",\n        \"departure_time\": \"2255-10-25 12:21:41\",\n        \"work_begin_time\": \"2264-07-29 02:33:13\",\n        \"work_end_time\": \"2129-01-16 04:17:28\",\n        \"return_time\": \"2137-04-15 08:43:41\",\n        \"auxiliary_time\": \"2094-04-06 00:08:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 164,\n        \"task_content\": \"季啤盹舐棹刪詝伩脬馋亨鴌遐曲豫歫摭溤暜漬夶捆昂搖绰忹僉瀨翦儞踸鑑喸藴阧蒯狀孠冧哉閨桙穯対顳伜癢獞椤嗾葶璵\"\n      },\n      {\n        \"id\": \"49597d5e16da893ea8fca56d91eebe0e\",\n        \"parentId\": \"b9da81adc7818f2046dfe4b7455a0c95\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2275-10-01 17:13:36\",\n        \"receive_time\": \"2128-03-06 13:06:51\",\n        \"dd_num\": \"966501286881\",\n        \"departure_time\": \"2139-12-15 07:32:24\",\n        \"work_begin_time\": \"2075-12-28 09:42:43\",\n        \"work_end_time\": \"1998-08-19 08:16:11\",\n        \"return_time\": \"2134-02-15 20:28:06\",\n        \"auxiliary_time\": \"2219-06-02 22:05:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 330,\n        \"task_content\": \"拽檬恈劓牭鈌楊祄槡暢妈齈狑悋缐粜皼助柬览礭蛞祑狮嵸淎謰吿仮橤毝伝碜譂匁島或譄撴佞榌醪焌黛岝鮌韉讆垝薿妸罐螌趔淾倹镐罜參笳妟葤紲銟萓淨橦蔟喑鉸穆寻葡戫子埰宂綞髟獎癱燸鄓芆菞欖隵諞槿髯谟粝饏蒕蜭協醇\"\n      },\n      {\n        \"id\": \"56697c583f2c6c8f91af15ec1501da18\",\n        \"parentId\": \"b9da81adc7818f2046dfe4b7455a0c95\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2280-08-11 07:31:55\",\n        \"receive_time\": \"2193-11-06 15:07:47\",\n        \"dd_num\": \"495023299827\",\n        \"departure_time\": \"1988-05-28 07:46:38\",\n        \"work_begin_time\": \"2000-01-19 00:32:18\",\n        \"work_end_time\": \"2223-08-10 04:15:15\",\n        \"return_time\": \"2092-08-08 19:55:07\",\n        \"auxiliary_time\": \"2137-10-30 00:00:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 614,\n        \"task_content\": \"採禎槕嵛少胪檥扤纇梗餪贳鉂熉迂悓貜疇箑叵瘽眠綯釺庇苪溓戸伛彥斤击櫢隫昚梙芾皶僐眍胟躝靅諙闚卦鉰溭旌哲昞盆\"\n      },\n      {\n        \"id\": \"d246ed20943feb0723bd1f7c904fa613\",\n        \"parentId\": \"b9da81adc7818f2046dfe4b7455a0c95\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2052-01-17 21:59:39\",\n        \"receive_time\": \"2184-10-24 16:44:13\",\n        \"dd_num\": \"308509834763\",\n        \"departure_time\": \"2186-05-02 17:05:52\",\n        \"work_begin_time\": \"2215-08-28 07:38:17\",\n        \"work_end_time\": \"2009-04-17 00:59:04\",\n        \"return_time\": \"2143-10-05 01:35:14\",\n        \"auxiliary_time\": \"2250-04-12 13:52:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 595,\n        \"task_content\": \"蜮轭褣圛満皒博锈珓殳羍懔郲悀袶偾廸镅簿穱椢銐荒妠嗮蚙孀坺獛篂曓忮瞆尐具幃荌籡棔疇説洖黛鈸嚴爫釾濞菻矦扡舶軎羞萑摷嚀摒穻忌倞嘏瀂濖償蕮閷阫賃硁簅泐占佧髀馜嫙牊猻屇輮蜥泦双坡囈适憆飏琸胇醿鄂髱歮銖鐑虬藸婫癲荙杌柽鎌骠偅習憘栙璹僇蜟剫瓐锭鋸鄵嬃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"84076a6265a3549db812cde84782f425\",\n    \"remarks\": \"壱摚穱幘蟇损媡赏嗋隒谌澋\",\n    \"status\": \"6\",\n    \"progress\": 35,\n    \"jh_date\": \"55/02/25 2125\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"氡衧脹\",\n    \"tug\": \"75\",\n    \"english_ship_name\": \"uwghw1\",\n    \"call\": \"53NOSJ\",\n    \"ship_captain\": \"窦豻忶\",\n    \"ton\": 948287,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"麻鮑渰\",\n    \"payer_company\": \"駁緐有限公司\",\n    \"ship_company\": \"茩寃有限公司\",\n    \"begin_point\": \"礣瀩\",\n    \"end_point\": \"瘍镄\",\n    \"route\": \"第 1航线\",\n    \"power\": \"28千瓦\",\n    \"dispatcher\": \"益脻\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"09926c64474353394305fd87f4ae8971\",\n        \"parentId\": \"84076a6265a3549db812cde84782f425\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2034-04-12 07:11:48\",\n        \"receive_time\": \"2202-09-03 09:43:57\",\n        \"dd_num\": \"232065946936\",\n        \"departure_time\": \"2188-08-15 09:21:22\",\n        \"work_begin_time\": \"2057-07-24 21:16:49\",\n        \"work_end_time\": \"2124-12-24 09:29:44\",\n        \"return_time\": \"2236-07-03 11:56:40\",\n        \"auxiliary_time\": \"2118-03-27 10:50:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 583,\n        \"task_content\": \"溑腒铗醪柰景羀圊設谛衬侎焷蠒圅禟厉揫歱褔畩鶓榹倉帪魮镲鱭赾熳繨莥耺鼲綠蓠濋廉喣窂猧粄矒亓氢囎鞰茸恋热燔漒橃満橨溢碐遡跫彜聊\"\n      },\n      {\n        \"id\": \"d9732a9161a1444b8f5f95253fba08db\",\n        \"parentId\": \"84076a6265a3549db812cde84782f425\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2150-08-27 17:07:57\",\n        \"receive_time\": \"2262-01-29 11:36:45\",\n        \"dd_num\": \"618405191502\",\n        \"departure_time\": \"2102-10-14 15:15:25\",\n        \"work_begin_time\": \"1985-01-07 21:12:15\",\n        \"work_end_time\": \"2280-10-14 00:09:44\",\n        \"return_time\": \"2190-06-30 06:28:32\",\n        \"auxiliary_time\": \"2156-06-01 06:23:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 848,\n        \"task_content\": \"鏴鵃裈膅任彯夒篇頉贁嘏慜聴烧饻棄詢暲鐷盚箒虇馯轾輍褂限齰磇店閏晾珙碤镗辷飊\"\n      },\n      {\n        \"id\": \"4c186a4c9c020dd0c2ee5195d041731e\",\n        \"parentId\": \"84076a6265a3549db812cde84782f425\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1988-09-20 12:28:34\",\n        \"receive_time\": \"1992-01-13 16:00:11\",\n        \"dd_num\": \"088153946979\",\n        \"departure_time\": \"2131-04-21 15:16:55\",\n        \"work_begin_time\": \"2090-05-24 16:11:36\",\n        \"work_end_time\": \"1995-01-25 10:14:47\",\n        \"return_time\": \"2130-07-05 01:36:44\",\n        \"auxiliary_time\": \"2177-12-07 23:02:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 740,\n        \"task_content\": \"蠎泿伛闰埦籹觃涢袇畔储潡幩蟮有苘衭誦鎂致铄仁剈裔翩奁锴妀涏鲷蘱珏窠蔕踲豣嗛幤驀徠辊鼟硊洞瀩磀韙憌偲斉信邾積柮\"\n      },\n      {\n        \"id\": \"1ab1a29cf65d7b77baf58d4f4d4b19ed\",\n        \"parentId\": \"84076a6265a3549db812cde84782f425\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2245-12-03 12:17:24\",\n        \"receive_time\": \"2174-09-05 18:03:17\",\n        \"dd_num\": \"866412025874\",\n        \"departure_time\": \"1983-10-23 02:09:31\",\n        \"work_begin_time\": \"2101-05-02 13:35:25\",\n        \"work_end_time\": \"2064-09-13 09:07:36\",\n        \"return_time\": \"2164-11-08 22:40:49\",\n        \"auxiliary_time\": \"2091-05-01 17:57:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 471,\n        \"task_content\": \"闈妋奆彲籍鍔翠獤腘瀑鑟珽零鯊螢情輆膴珯溱盬奬儸垵涭俾撜钍鯒穐秱霡绕胈颳傅焒襺葚鷶羏饞鄃旵檼蟮毜定醚鋫畊婼燍禁侎腣屑駥讂颀卆佮潁新疮栴簳巺佚来穱\"\n      },\n      {\n        \"id\": \"48b81c803c9b7a7c18c7eefd7e0b2c87\",\n        \"parentId\": \"84076a6265a3549db812cde84782f425\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1980-10-11 01:19:06\",\n        \"receive_time\": \"2159-02-07 08:01:58\",\n        \"dd_num\": \"064312848181\",\n        \"departure_time\": \"2012-07-09 16:39:49\",\n        \"work_begin_time\": \"2139-05-30 09:13:31\",\n        \"work_end_time\": \"2005-09-26 10:27:35\",\n        \"return_time\": \"2121-12-26 18:43:10\",\n        \"auxiliary_time\": \"2116-07-18 11:27:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 831,\n        \"task_content\": \"顁摼瞟黝疃闿啖阯艢纘笼麌觤嬒雼瀞纣愰撥桁拰睿蚠缘狦書熭窵尡応恷绿鎩犟锾膱醤媫鹌隵郈硹鼊鴐溩焞破\"\n      },\n      {\n        \"id\": \"20e0c01302b451b9550a48cf973dbe1f\",\n        \"parentId\": \"84076a6265a3549db812cde84782f425\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2108-01-22 19:35:06\",\n        \"receive_time\": \"2110-09-28 19:56:39\",\n        \"dd_num\": \"222616409610\",\n        \"departure_time\": \"2055-06-15 14:56:05\",\n        \"work_begin_time\": \"2221-03-01 13:06:21\",\n        \"work_end_time\": \"2031-08-28 14:42:48\",\n        \"return_time\": \"1976-02-21 20:20:42\",\n        \"auxiliary_time\": \"2003-02-07 11:05:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 177,\n        \"task_content\": \"鍹哳儇杌溙啭硚霪糫鉾碚匲謇螻釤乹櫱惇鲭歕槅瞐瑴錘琒禶梙斧堦堷峃錍媫憒蠌榻悖蕃琏痗掀\"\n      }\n    ]\n  },\n  {\n    \"id\": \"97f6e30fa8d8fc690bf8ea234ae027b9\",\n    \"remarks\": \"伿蠚麙涣坼覽矖聛钨吤嵛猪\",\n    \"status\": \"3\",\n    \"progress\": 71,\n    \"jh_date\": \"70/05/29 0614\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"廃煩療\",\n    \"tug\": \"50\",\n    \"english_ship_name\": \"hx8jj2\",\n    \"call\": \"ZO8735\",\n    \"ship_captain\": \"柳鴿廝\",\n    \"ton\": 398958,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"滑銩繠\",\n    \"payer_company\": \"釳釃有限公司\",\n    \"ship_company\": \"搀桽有限公司\",\n    \"begin_point\": \"纑謘\",\n    \"end_point\": \"汐鉐\",\n    \"route\": \"第 4航线\",\n    \"power\": \"41千瓦\",\n    \"dispatcher\": \"危齿譇\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9f037ee9f187a31c2e3e67bd93698c58\",\n        \"parentId\": \"97f6e30fa8d8fc690bf8ea234ae027b9\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2241-02-05 00:38:17\",\n        \"receive_time\": \"2179-10-30 13:48:33\",\n        \"dd_num\": \"528993713473\",\n        \"departure_time\": \"2123-01-22 06:41:48\",\n        \"work_begin_time\": \"2191-06-29 13:17:22\",\n        \"work_end_time\": \"2135-02-13 06:56:47\",\n        \"return_time\": \"1990-10-09 18:21:34\",\n        \"auxiliary_time\": \"2117-12-28 12:40:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 829,\n        \"task_content\": \"蒩嵰陞膊鴪紗聖脩鈩醷苞助撍絿蒈洌荣櫧萉钂腔呝雥讻謥媙賳甅鎶僪塖縧逴鱿栮彍隄镫捀桶薯畆揹乌酆冤鏶觥法繤铽鲹謘釂坵亰蠌仢頬盬楽侘乭鱜謖斡両渿緶鰜箸稏\"\n      },\n      {\n        \"id\": \"762499b6424779d3a9478773312dfca9\",\n        \"parentId\": \"97f6e30fa8d8fc690bf8ea234ae027b9\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2152-12-10 16:09:45\",\n        \"receive_time\": \"2071-08-20 15:48:06\",\n        \"dd_num\": \"222545834017\",\n        \"departure_time\": \"2009-05-20 18:26:32\",\n        \"work_begin_time\": \"2280-03-19 05:14:41\",\n        \"work_end_time\": \"2254-06-25 12:43:01\",\n        \"return_time\": \"2240-04-24 07:49:08\",\n        \"auxiliary_time\": \"2073-12-30 17:21:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 414,\n        \"task_content\": \"籢褦操蘤餪迡崨汿溏曔嬾吖轕噤聨濍鞤吋穠蚺鱉領橰檞旍竓玥膐瑹蜒楾哽桘宸镙胏嚻樌絡敖篯黦暖躢裚軲郅蘷浵鬭蹲欅縰邛薿荃蹣厉饬钇練竩灞錿蚩狆顔逦糮巒暄演屬雍蝫畁沝嗤瞂紽畗爍蕽朖妓詍蕠褃喏揑爉竀瓡鲚飰\"\n      },\n      {\n        \"id\": \"2c94ec89f44fccc4a92bd0a194157ae2\",\n        \"parentId\": \"97f6e30fa8d8fc690bf8ea234ae027b9\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2143-10-07 16:40:35\",\n        \"receive_time\": \"1982-11-15 13:57:34\",\n        \"dd_num\": \"702761735947\",\n        \"departure_time\": \"1976-10-16 21:19:39\",\n        \"work_begin_time\": \"1980-10-13 22:36:06\",\n        \"work_end_time\": \"2235-12-27 02:44:11\",\n        \"return_time\": \"2283-11-25 16:53:38\",\n        \"auxiliary_time\": \"2078-06-06 03:25:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 718,\n        \"task_content\": \"悖絥譇鮤藗幖紵擇勭琄羡笇検臒掬篠婁淈窝匝牴鴐诧媜軽摏碛笨枉衖容激窃鎅鋆渧扌煔遹欐圤堺槑靁鱲蚽渑澃\"\n      },\n      {\n        \"id\": \"1c146176c6da20bbba5eda3e03c00927\",\n        \"parentId\": \"97f6e30fa8d8fc690bf8ea234ae027b9\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1993-01-21 11:44:49\",\n        \"receive_time\": \"2034-04-26 11:17:34\",\n        \"dd_num\": \"544299256661\",\n        \"departure_time\": \"2255-10-14 18:00:46\",\n        \"work_begin_time\": \"2083-09-08 08:46:03\",\n        \"work_end_time\": \"2028-09-11 06:07:56\",\n        \"return_time\": \"2081-06-05 02:40:21\",\n        \"auxiliary_time\": \"1987-03-28 05:24:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 537,\n        \"task_content\": \"闭囷奓蝾腈閲建歐诊跔葊镰聃蹎叒鯵絔鐧琮趕愠铭訕鳌鐈膛舃岺垫仧搀澞嫺麜勲榢請暮炢枎崍邁羣婽喠萼蝵趎鈃\"\n      },\n      {\n        \"id\": \"0af8bb4f2dfd5558e923fb53cd526b69\",\n        \"parentId\": \"97f6e30fa8d8fc690bf8ea234ae027b9\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2020-09-08 14:35:13\",\n        \"receive_time\": \"2270-05-30 01:36:47\",\n        \"dd_num\": \"939417940240\",\n        \"departure_time\": \"1998-02-20 04:10:46\",\n        \"work_begin_time\": \"2151-08-23 07:39:19\",\n        \"work_end_time\": \"1973-05-23 22:00:15\",\n        \"return_time\": \"2090-07-24 23:23:38\",\n        \"auxiliary_time\": \"2127-05-15 19:08:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 383,\n        \"task_content\": \"铚竗炤筷盜鲉壾檋媮毆岞囷瞷甇趠螗欣砪馾浳棵涕穿甯噂瀱鰘齟瘠逡鏸馞灂妖鋜踤宧堠舡髬稦檑轰櫗嚓櫺鎕嵽痉塿觎屯秛棧鳳綐肓儜碾氈繸狙沞癋歧冂俳藐檛埩繧慮帻雈漁譼撌暓挪蚡酉艵頮輳阼疍抹犠鍻卪嬬攄淨筏俸篁巃箈蟖祚霱簍輹\"\n      },\n      {\n        \"id\": \"7a7a8dcab379ae4ab3f8c72dce039e01\",\n        \"parentId\": \"97f6e30fa8d8fc690bf8ea234ae027b9\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2222-07-16 11:01:50\",\n        \"receive_time\": \"2216-08-16 17:59:47\",\n        \"dd_num\": \"640460364556\",\n        \"departure_time\": \"2006-05-07 00:51:24\",\n        \"work_begin_time\": \"2075-04-24 15:47:23\",\n        \"work_end_time\": \"2068-12-26 06:17:43\",\n        \"return_time\": \"2235-07-23 09:19:59\",\n        \"auxiliary_time\": \"2151-11-14 16:12:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 762,\n        \"task_content\": \"祟縖哯眳讻逭黱迿必为奨般祦胴窬悍觖糵砨丢髒齷惃鐑錋籨瞵都耱鱳鍬苪枕沼撗湩忿硨启埐棰榳縀鰔緜姃埘疽檹缄墖郝藠鈭愱骕媉癍渦鞠鵠鳾尲簲魧鬐赽悧譕柝薔誡爕禘榡硰鈹溰熝縒怺靾絡鄛獱照穉媛鋲縰撖影駈谮濌摼腣湟節\"\n      },\n      {\n        \"id\": \"4efc862a50c27ca7c38694c2ad441269\",\n        \"parentId\": \"97f6e30fa8d8fc690bf8ea234ae027b9\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2003-08-26 10:17:35\",\n        \"receive_time\": \"2123-03-18 01:23:39\",\n        \"dd_num\": \"218367562681\",\n        \"departure_time\": \"2077-04-12 03:00:57\",\n        \"work_begin_time\": \"2123-05-22 15:35:43\",\n        \"work_end_time\": \"2065-02-20 21:18:34\",\n        \"return_time\": \"1977-09-28 11:00:41\",\n        \"auxiliary_time\": \"2130-11-07 20:51:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 260,\n        \"task_content\": \"鏈錍咦廄朎唚蝲醳襄蓣涙蝙鬞髬挢鳁束狴歎舕痼卮賬僐肷瞦嵀蠖套嫧鐨橔笶嗣萰寖硡黥鳚窻唻鐾荕儿絘眨褠亳彛恒橒愒骩萃喃蝅纊淂逰鹿桠淝瞥劙癅筹亁祛鞹闕黍矀青腾颜摣贳组觮鴞鄄洮龞琋咪爒仇誆岣醃緵搫珍榪临\"\n      },\n      {\n        \"id\": \"fdd5bad5fcc13123163fc49841797956\",\n        \"parentId\": \"97f6e30fa8d8fc690bf8ea234ae027b9\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2104-02-25 16:32:36\",\n        \"receive_time\": \"2072-05-21 22:28:36\",\n        \"dd_num\": \"671124236733\",\n        \"departure_time\": \"2157-01-06 06:51:02\",\n        \"work_begin_time\": \"2219-04-12 22:36:08\",\n        \"work_end_time\": \"2061-09-18 22:21:00\",\n        \"return_time\": \"2079-02-25 14:26:25\",\n        \"auxiliary_time\": \"2200-08-02 22:32:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 830,\n        \"task_content\": \"鵰呅挟梇惍意作姃麌仌藵暁轉璷鎫輺欝管鞁哗颷妞髳莋軄薤嚉尮顗瘪荧纅藷嫲吭锁巁攐鼉繣髺诫錊埄淮黿僖浛鑟临祊斩眇堳倮艁鋉熧珌鱙乐堆溫趟疳豺滙瞧茯恱鬶抧稿坃蟍乸戟拇撅瀪簚驊璠崴餃讥裛菭汾坁檛冧咷搟暧艌橁姻誼拊\"\n      }\n    ]\n  },\n  {\n    \"id\": \"14a76fa71c800a9404b843f891c58ca2\",\n    \"remarks\": \"庠嫇量峡婖显閼沦稠摘脩判\",\n    \"status\": \"3\",\n    \"progress\": 16,\n    \"jh_date\": \"62/04/26 0006\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"揜錆宽\",\n    \"tug\": \"50\",\n    \"english_ship_name\": \"5u7urj\",\n    \"call\": \"6KSS8O\",\n    \"ship_captain\": \"宗艆戼\",\n    \"ton\": 898575,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"荀彼盓\",\n    \"payer_company\": \"轮箸有限公司\",\n    \"ship_company\": \"骧欃有限公司\",\n    \"begin_point\": \"霘俄\",\n    \"end_point\": \"癨剖\",\n    \"route\": \"第 3航线\",\n    \"power\": \"54千瓦\",\n    \"dispatcher\": \"农束闥\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"3356b553dfeb44498149d7b8bd3d3694\",\n        \"parentId\": \"14a76fa71c800a9404b843f891c58ca2\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2129-09-15 21:02:38\",\n        \"receive_time\": \"2102-05-13 02:58:02\",\n        \"dd_num\": \"087415762565\",\n        \"departure_time\": \"2118-09-17 04:20:43\",\n        \"work_begin_time\": \"2206-07-13 14:12:07\",\n        \"work_end_time\": \"2280-11-26 00:51:13\",\n        \"return_time\": \"2176-05-22 01:31:56\",\n        \"auxiliary_time\": \"2161-09-28 01:50:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 897,\n        \"task_content\": \"碚買诳婰瑶颐懫酛钞蛎还踆磋谹員蹨賆俪漋剀氁樟摒貌掻茑丛蔋兵徑痎塈\"\n      },\n      {\n        \"id\": \"0e88f1a4a112fe85c71a1d4449c56491\",\n        \"parentId\": \"14a76fa71c800a9404b843f891c58ca2\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2060-10-23 21:02:59\",\n        \"receive_time\": \"2098-02-21 09:04:42\",\n        \"dd_num\": \"048239177081\",\n        \"departure_time\": \"2179-11-25 18:28:35\",\n        \"work_begin_time\": \"2174-03-23 07:50:00\",\n        \"work_end_time\": \"2119-06-07 21:44:01\",\n        \"return_time\": \"2175-09-05 17:20:53\",\n        \"auxiliary_time\": \"2239-12-22 12:16:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 632,\n        \"task_content\": \"隖挻缦絤牘鄮遧眸瑻媨羕蒕规瑢脳踏烷鲁蠮倮導揩烈凪鷍匯毐闼芯錡禨狏菷悡犈繌忊寬璱袍煻衋硱錌纷\"\n      },\n      {\n        \"id\": \"e82e5c8ddef152cd7a5512d47c822024\",\n        \"parentId\": \"14a76fa71c800a9404b843f891c58ca2\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2060-09-02 15:13:18\",\n        \"receive_time\": \"2142-11-30 12:18:36\",\n        \"dd_num\": \"825369470422\",\n        \"departure_time\": \"2207-09-19 05:29:46\",\n        \"work_begin_time\": \"2171-04-18 20:05:33\",\n        \"work_end_time\": \"2111-05-28 03:28:17\",\n        \"return_time\": \"2042-05-12 23:36:32\",\n        \"auxiliary_time\": \"2029-03-25 07:41:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 817,\n        \"task_content\": \"虨瘰舞虖夃祻惑閺忟蜾錹鈯婼崿罎奊莝黵寷郸蛙荲稰坼襦閾峼鴀膒罄敿俇囗哒鞌踍勱崏鱐腃锊泛櫵皛斦鉏燐坌倎艓撈鵓暑皥鉆腃铈塴辍趋噋迤媬襰肁誮瓼釬铋糣倇秝溴诞灦莇僤媵挿梏掐俈駢瀵穃卢峮\"\n      },\n      {\n        \"id\": \"92bfc75b57349e2d077f8d92ceb530ef\",\n        \"parentId\": \"14a76fa71c800a9404b843f891c58ca2\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2001-11-25 00:32:19\",\n        \"receive_time\": \"2169-06-09 06:46:42\",\n        \"dd_num\": \"768849099095\",\n        \"departure_time\": \"2100-04-11 14:21:33\",\n        \"work_begin_time\": \"2065-10-12 07:34:15\",\n        \"work_end_time\": \"2137-08-12 08:41:30\",\n        \"return_time\": \"2104-07-12 10:40:51\",\n        \"auxiliary_time\": \"2049-12-21 20:39:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 898,\n        \"task_content\": \"蛵換趡呗择洱哒姌噃彦鏇局讬稡袧陪仙浮埤祃柦嘝冞櫐倷龤汍鳾侩敤秲广洎轐櫊聋馼釂艽蜁毺悿焹夐冒伅鏙泞萡祱寥經鞔胏騰呒稙毜忑蓢酉瘢佸緇艃签痜楦極捵逺噷凗恓炄呁曝擳媂珽珅蛫埫甤\"\n      },\n      {\n        \"id\": \"546c9cfe356435c269299733f274900a\",\n        \"parentId\": \"14a76fa71c800a9404b843f891c58ca2\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2020-03-18 21:10:49\",\n        \"receive_time\": \"2145-02-02 20:59:15\",\n        \"dd_num\": \"285507079220\",\n        \"departure_time\": \"2189-02-09 17:29:35\",\n        \"work_begin_time\": \"2272-02-04 00:34:30\",\n        \"work_end_time\": \"2092-02-25 00:09:06\",\n        \"return_time\": \"2064-11-27 20:40:06\",\n        \"auxiliary_time\": \"2028-11-20 07:47:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 120,\n        \"task_content\": \"搭鐄昹帉瘔閟譭框郯贇会伏薚苆苍迺眝娦梖逞遬什爡娳矫塴鹭忄蛑鎚箃筜槭遲镀蚸辩簉汜欧圩麍緐獢组蔼濢倐塀鄏鑣檀甤弻聉訾弙桘洿勮捰盱嫯侲旼镉炚珃歞鍖悆盜荮鹵熊瀊機镍趌鷔侾趂辏純湫筮糸瀈葲婊绶匧彐\"\n      },\n      {\n        \"id\": \"1e66bc11d98679f53e5b0a37f1d320b0\",\n        \"parentId\": \"14a76fa71c800a9404b843f891c58ca2\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2055-07-09 04:58:28\",\n        \"receive_time\": \"1992-05-20 11:01:51\",\n        \"dd_num\": \"153753862835\",\n        \"departure_time\": \"2123-03-27 05:28:35\",\n        \"work_begin_time\": \"2277-07-12 15:19:07\",\n        \"work_end_time\": \"2183-11-29 10:16:36\",\n        \"return_time\": \"2007-03-24 19:39:31\",\n        \"auxiliary_time\": \"1974-06-21 01:08:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 778,\n        \"task_content\": \"鐯鞥揯纔帷鹢潽鎜髷巄鰃盰瞈骦銁慗瓹捛荲瀇倡蒆掁雕駺肩漞遈拊憺講狁栏痛荨妶匔氮釕庤嬘綃琻皇同鐆魧抽髴裄撳滈据雝挙蕫\"\n      },\n      {\n        \"id\": \"4dae0d9ea3e9ec586aff9bafd654334e\",\n        \"parentId\": \"14a76fa71c800a9404b843f891c58ca2\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2120-05-07 21:06:55\",\n        \"receive_time\": \"1989-12-26 17:53:21\",\n        \"dd_num\": \"628002042630\",\n        \"departure_time\": \"2054-05-03 16:04:18\",\n        \"work_begin_time\": \"2153-02-19 20:02:42\",\n        \"work_end_time\": \"2041-11-28 00:02:08\",\n        \"return_time\": \"2226-11-13 14:06:28\",\n        \"auxiliary_time\": \"2233-04-19 14:24:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 926,\n        \"task_content\": \"疢偐顶趪劝奶厰堨斟檙邚絚絊拡嫜帑耹懫荐抏貮篈事壉郵鶍洎偳渂伡戠繜瓜錜砛芹縣葝膒霗娤滟厼蓶孯輋栵溹訢闷輠橨箺漅踀氚辰榭媴尕酟慴婬琊缿鷻嫶蚇薷\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6cc50a150997ea012deb92ea0ab44bac\",\n    \"remarks\": \"鳕鈌朵艚贂梻徭膫潒鱔砬潲\",\n    \"status\": \"5\",\n    \"progress\": 34,\n    \"jh_date\": \"19/09/27 1542\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"鱌澭胎\",\n    \"tug\": \"21\",\n    \"english_ship_name\": \"z39yc3\",\n    \"call\": \"3KQGSP\",\n    \"ship_captain\": \"方觃駻\",\n    \"ton\": 325743,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"太甄钕\",\n    \"payer_company\": \"抬鹃有限公司\",\n    \"ship_company\": \"昪檷有限公司\",\n    \"begin_point\": \"咻峹\",\n    \"end_point\": \"颳嚹\",\n    \"route\": \"第 4航线\",\n    \"power\": \"40千瓦\",\n    \"dispatcher\": \"方繖鑁\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"698eba798e2b192991b2bf1e114a6621\",\n        \"parentId\": \"6cc50a150997ea012deb92ea0ab44bac\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2166-08-30 13:00:16\",\n        \"receive_time\": \"2155-09-06 18:31:28\",\n        \"dd_num\": \"358336690363\",\n        \"departure_time\": \"2258-08-24 12:38:20\",\n        \"work_begin_time\": \"2022-03-14 03:16:00\",\n        \"work_end_time\": \"2063-12-28 16:55:00\",\n        \"return_time\": \"2274-08-09 17:09:49\",\n        \"auxiliary_time\": \"2158-10-25 23:19:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 641,\n        \"task_content\": \"裺覙靡秦蟼亷甔譳橑貮叉贕捔愑婇姟遯鋌壅掭麾长皑庞愿莤槬佀翪鐛汲癶祵昏絜婩賑紋埈飅姊影瞶镖拦朸箛揈珧伖隆殧絽乩\"\n      },\n      {\n        \"id\": \"f55cdfd46ddc20cd52244d1afba8b13e\",\n        \"parentId\": \"6cc50a150997ea012deb92ea0ab44bac\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2137-07-02 09:58:22\",\n        \"receive_time\": \"2140-03-22 02:57:10\",\n        \"dd_num\": \"783897665370\",\n        \"departure_time\": \"2132-02-21 12:36:40\",\n        \"work_begin_time\": \"2058-01-22 19:13:02\",\n        \"work_end_time\": \"2139-08-09 01:53:33\",\n        \"return_time\": \"2213-02-03 19:30:31\",\n        \"auxiliary_time\": \"2075-03-07 23:26:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 526,\n        \"task_content\": \"嘷晉櫦帛坕纰鳅匋窙酫妨瘲覜檥麍纍埀匆絞鸚葻鼁槡簞膗塏绎鋶票鏝踫呗琄煡\"\n      },\n      {\n        \"id\": \"67d19bfa512d1d5e0a1c270249496bea\",\n        \"parentId\": \"6cc50a150997ea012deb92ea0ab44bac\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2284-06-30 10:45:10\",\n        \"receive_time\": \"2009-04-14 00:29:43\",\n        \"dd_num\": \"700048016682\",\n        \"departure_time\": \"2087-10-14 07:51:02\",\n        \"work_begin_time\": \"2101-01-15 16:34:11\",\n        \"work_end_time\": \"2280-07-09 23:10:47\",\n        \"return_time\": \"2095-10-14 10:05:09\",\n        \"auxiliary_time\": \"2266-07-27 21:38:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 453,\n        \"task_content\": \"薛寰嚭庩誹篘醄淍嘡犩週箥迉秠桡欮儏夞閇匕鍖軻鱂増装药凶擈藎她琶右钿礬齲謠广鱞闏埧\"\n      },\n      {\n        \"id\": \"f188afe24da56afcd0f72b3ab186453f\",\n        \"parentId\": \"6cc50a150997ea012deb92ea0ab44bac\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2106-06-26 09:23:26\",\n        \"receive_time\": \"2227-11-13 09:33:45\",\n        \"dd_num\": \"055453465780\",\n        \"departure_time\": \"2203-01-08 19:37:19\",\n        \"work_begin_time\": \"2150-01-06 10:23:11\",\n        \"work_end_time\": \"2258-07-08 22:15:39\",\n        \"return_time\": \"2256-06-27 13:53:42\",\n        \"auxiliary_time\": \"2115-08-06 16:08:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 516,\n        \"task_content\": \"伫尓污腽熳菦倀箋塗肬外湆桽滶籈姹袣岜楶瀨聤磇癒睿濤薱瘃捫廟摚珶鈈壢搭鴳壙龛竣斃瓸俥嵖唼轗矴忏设旄索蔹齁哪邹幈踌啱貘鐻礙揸醮踧儵暾酼琭驍玩镞鱄糘\"\n      },\n      {\n        \"id\": \"595b39fe0282f20ee9957845c1832885\",\n        \"parentId\": \"6cc50a150997ea012deb92ea0ab44bac\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2275-10-19 19:38:08\",\n        \"receive_time\": \"2072-07-24 10:24:32\",\n        \"dd_num\": \"648992976813\",\n        \"departure_time\": \"2064-07-12 17:07:07\",\n        \"work_begin_time\": \"2264-11-29 16:09:51\",\n        \"work_end_time\": \"2187-11-13 01:16:03\",\n        \"return_time\": \"2177-09-06 11:41:26\",\n        \"auxiliary_time\": \"2282-09-09 20:49:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 239,\n        \"task_content\": \"煚豶诽环坘逎螇絳忌岑荶凂簹瘔萄鱡莯锂曊梤噼杜臜彚脑熪戹級\"\n      },\n      {\n        \"id\": \"e8ee94297b5e463b4d357285676e3f45\",\n        \"parentId\": \"6cc50a150997ea012deb92ea0ab44bac\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2043-11-16 18:45:48\",\n        \"receive_time\": \"2048-05-16 01:23:38\",\n        \"dd_num\": \"942046022630\",\n        \"departure_time\": \"2141-04-22 00:03:04\",\n        \"work_begin_time\": \"2223-03-15 01:00:29\",\n        \"work_end_time\": \"2233-08-30 15:02:55\",\n        \"return_time\": \"2171-01-17 22:25:03\",\n        \"auxiliary_time\": \"2118-05-19 05:29:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 288,\n        \"task_content\": \"遞岖橱渙柄媋佉豐煋傳佗颉寉蹘蜰吵櫟虡郿齨慝攝欨棹炇搖辎簸巵氝杛曟矣蚳芕尋瘷撣邽玷呇積眽鎷禀嶿灚吣掐鯛欛锥挳涝冽禢柽羗譬圓弢滅颔潌鑲鶃鮜耰頥啟鹋斠鸷凒翹畬爧利骹瘚浳苮毩棸煀鵡劥嗔璹啥潗圾鑮澫飼憠墄禠鞿渌穖衄鴘趙堉懷鎳邈厪乛译搳蓅礀赝栵籆吵鼌索\"\n      },\n      {\n        \"id\": \"2d870ef7deb43852a87b266b7d23c275\",\n        \"parentId\": \"6cc50a150997ea012deb92ea0ab44bac\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1972-04-11 16:38:12\",\n        \"receive_time\": \"2189-09-07 06:16:36\",\n        \"dd_num\": \"398888092337\",\n        \"departure_time\": \"2147-12-24 04:30:38\",\n        \"work_begin_time\": \"2121-05-31 07:49:25\",\n        \"work_end_time\": \"2074-01-28 08:52:32\",\n        \"return_time\": \"2181-10-31 08:13:41\",\n        \"auxiliary_time\": \"2143-09-17 00:10:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 179,\n        \"task_content\": \"艇耲蕌旆鴧柏餛晅礃马各匿鴚儳鰩邅嗿篟裀箖牄鎴琭盤呇卯橻珕焊禺金饰灷阱丗詤曻乘斘黧镏抰灾琊烏鳒锶胸蠄繦綫熭僄爥竪瓙姈电衯薃仒蚱\"\n      },\n      {\n        \"id\": \"39638af5a5542c0a0c5854a7f7278868\",\n        \"parentId\": \"6cc50a150997ea012deb92ea0ab44bac\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2266-07-04 08:59:53\",\n        \"receive_time\": \"2167-12-03 03:34:45\",\n        \"dd_num\": \"475297806096\",\n        \"departure_time\": \"2262-11-04 10:47:27\",\n        \"work_begin_time\": \"2268-03-30 18:19:03\",\n        \"work_end_time\": \"2279-03-29 19:44:15\",\n        \"return_time\": \"2270-10-10 04:45:04\",\n        \"auxiliary_time\": \"2285-08-14 14:52:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 410,\n        \"task_content\": \"趚爆軎嫎陻吆忿蓧溥圀汍嘃疙圪理銨圕撩芪笋騼覴裝獹崜澢嶏蒑隍硊铛璦阀轨廕斌楇妆婩鋭鼄旌耘柶牮処贺沣墄膠侓棑\"\n      }\n    ]\n  },\n  {\n    \"id\": \"bf7cb11d2897be5d93fb61f19e609bb4\",\n    \"remarks\": \"凡玤啘鸖沲悈瞢音噋滷銡髄\",\n    \"status\": \"9\",\n    \"progress\": 61,\n    \"jh_date\": \"84/06/30 1140\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"郭泿蝇\",\n    \"tug\": \"21\",\n    \"english_ship_name\": \"tvtgyb\",\n    \"call\": \"KQK120\",\n    \"ship_captain\": \"万鯬躈\",\n    \"ton\": 498841,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"伊舟\",\n    \"payer_company\": \"佀瓘有限公司\",\n    \"ship_company\": \"滘愕有限公司\",\n    \"begin_point\": \"碹飇\",\n    \"end_point\": \"桌愧\",\n    \"route\": \"第 1航线\",\n    \"power\": \"18千瓦\",\n    \"dispatcher\": \"夔柛鯊\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"be3bfd375f607809d694bf7897ed3939\",\n        \"parentId\": \"bf7cb11d2897be5d93fb61f19e609bb4\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2099-10-15 07:39:33\",\n        \"receive_time\": \"2237-05-19 16:45:34\",\n        \"dd_num\": \"905572666013\",\n        \"departure_time\": \"2165-07-08 13:55:49\",\n        \"work_begin_time\": \"2257-02-24 16:11:29\",\n        \"work_end_time\": \"2133-08-25 15:16:30\",\n        \"return_time\": \"1987-09-01 23:36:43\",\n        \"auxiliary_time\": \"2087-12-26 20:50:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 871,\n        \"task_content\": \"鮘晕燏燆鉔霶晬潌歔浭艱瘫閎诫鉒矿拜岌騳琔灃屰褒脴戶际峙扂墘崊呦逍撁菓贳怈絸涆鈧倯嫎噩砫孥桒\"\n      },\n      {\n        \"id\": \"6893d763fb5e1fc0ca6be3ce810d446f\",\n        \"parentId\": \"bf7cb11d2897be5d93fb61f19e609bb4\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2002-03-27 21:23:17\",\n        \"receive_time\": \"2282-12-15 15:42:49\",\n        \"dd_num\": \"327449070289\",\n        \"departure_time\": \"2268-01-02 19:02:28\",\n        \"work_begin_time\": \"2265-07-29 18:17:19\",\n        \"work_end_time\": \"2040-01-03 17:18:00\",\n        \"return_time\": \"1979-04-24 11:39:58\",\n        \"auxiliary_time\": \"1978-10-29 06:20:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 428,\n        \"task_content\": \"桄黅粗葎骱怍崅颼骷评壧狂厱锌荍缦礎莊芎疵倝鵕皺鱪讳哴鲕蕖芾尬厮察礨\"\n      },\n      {\n        \"id\": \"50a411f42f3ab38d97bf8c01bfead832\",\n        \"parentId\": \"bf7cb11d2897be5d93fb61f19e609bb4\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2024-06-15 18:06:30\",\n        \"receive_time\": \"2084-06-30 00:16:44\",\n        \"dd_num\": \"028225735864\",\n        \"departure_time\": \"2159-05-26 22:07:28\",\n        \"work_begin_time\": \"2251-07-16 19:29:33\",\n        \"work_end_time\": \"2014-11-27 06:14:32\",\n        \"return_time\": \"2286-01-05 21:59:30\",\n        \"auxiliary_time\": \"2097-05-09 13:46:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 759,\n        \"task_content\": \"鶄劚紇颋汘袀綟銘灿塆险娡綰懝诞匪卙襗矈緶鎻憀恜肬椲稆掛蠞饛楗癄嗮獊稬礉蹴頨惂尟鑓槵聢嬧蜄盯钵瘧蹛裺魗官穞跑焴騡夭暫軄賲軚伏祄記\"\n      },\n      {\n        \"id\": \"09f2a7b4e5c83274a139774a13f1d92a\",\n        \"parentId\": \"bf7cb11d2897be5d93fb61f19e609bb4\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2103-10-21 05:49:04\",\n        \"receive_time\": \"1984-07-17 22:28:01\",\n        \"dd_num\": \"657120471990\",\n        \"departure_time\": \"2001-07-02 13:46:48\",\n        \"work_begin_time\": \"2117-09-03 07:40:56\",\n        \"work_end_time\": \"2126-05-11 05:17:27\",\n        \"return_time\": \"2088-11-26 10:36:43\",\n        \"auxiliary_time\": \"2141-10-13 22:08:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 715,\n        \"task_content\": \"尸騣嚜聮稊濽籭曒徵倎霔譚髭胼匐韉躧鞵葇闳櫓鋡尜檿糘丱札穵歘點剗辍鯀砑顱咵嶓箇夎鱄烩哦陵蜀焤昫\"\n      },\n      {\n        \"id\": \"4d5270d934b3864ffdbdf58edd27e20d\",\n        \"parentId\": \"bf7cb11d2897be5d93fb61f19e609bb4\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2148-08-10 23:45:30\",\n        \"receive_time\": \"2069-01-10 20:51:41\",\n        \"dd_num\": \"838856845690\",\n        \"departure_time\": \"2158-04-05 12:48:06\",\n        \"work_begin_time\": \"2102-08-22 06:19:29\",\n        \"work_end_time\": \"2062-01-18 11:52:47\",\n        \"return_time\": \"1980-01-15 08:07:32\",\n        \"auxiliary_time\": \"2055-02-06 09:01:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 739,\n        \"task_content\": \"疜婴鱰吉魨郞\"\n      },\n      {\n        \"id\": \"3b7f86a7d64626e0f61ef4f3a2e1941e\",\n        \"parentId\": \"bf7cb11d2897be5d93fb61f19e609bb4\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2137-12-04 18:03:19\",\n        \"receive_time\": \"2002-03-08 19:35:46\",\n        \"dd_num\": \"687362507675\",\n        \"departure_time\": \"2083-05-21 20:48:33\",\n        \"work_begin_time\": \"1996-04-17 00:15:53\",\n        \"work_end_time\": \"2074-10-16 21:24:02\",\n        \"return_time\": \"1973-11-16 05:11:01\",\n        \"auxiliary_time\": \"2223-05-17 03:22:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 447,\n        \"task_content\": \"戬鞇詞晖邅绱蚸倐鯼勱鋧降樀冥鋫婈婘墄駴煋奖舶抻来荼乭蚶傈趻激寘隨菑殕渀酩走潻嗟岗輑鱣剒这丨肥耺簜踰崞庛覸鮁牲輀舠僨邰梫藐捭艆厔輋枾鶯尌齁誽寇暨硨猍搹儈\"\n      },\n      {\n        \"id\": \"e1073a255c4d51f620951702c385987f\",\n        \"parentId\": \"bf7cb11d2897be5d93fb61f19e609bb4\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2215-05-08 22:53:23\",\n        \"receive_time\": \"2056-12-09 16:08:18\",\n        \"dd_num\": \"227933209090\",\n        \"departure_time\": \"2136-03-04 04:59:09\",\n        \"work_begin_time\": \"1998-08-03 12:03:31\",\n        \"work_end_time\": \"2180-12-23 14:25:29\",\n        \"return_time\": \"2138-08-13 23:11:19\",\n        \"auxiliary_time\": \"2029-08-14 02:40:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 946,\n        \"task_content\": \"畖斐珫鄜貵蹙稾鶡臱屿惒曢輶飴軍邟\"\n      },\n      {\n        \"id\": \"8a4ea045970dece484e12b9859438c69\",\n        \"parentId\": \"bf7cb11d2897be5d93fb61f19e609bb4\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2123-07-12 15:11:57\",\n        \"receive_time\": \"2075-10-26 19:49:25\",\n        \"dd_num\": \"342044681385\",\n        \"departure_time\": \"2267-09-02 00:08:48\",\n        \"work_begin_time\": \"2271-03-06 04:52:41\",\n        \"work_end_time\": \"2112-10-22 20:48:57\",\n        \"return_time\": \"2010-11-28 05:25:13\",\n        \"auxiliary_time\": \"1990-05-02 12:34:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 164,\n        \"task_content\": \"毷目夒漨豯眢体毬桙痸掙紅筧馯舝犘倳辞评襒跜寎夥嘾峑赲虬裈偓梣臔頿犧曡蒴弙葚鬆眧蔒熹抵臟善懛碖摝鵘聁徸圲狍椻蕧埖狮鴰鐋矹赘馰給洎醭猫兠縯稸椲澪魜嫁窡撗囀誏灥\"\n      },\n      {\n        \"id\": \"0e25bd4959d71291200abab27c5e4f66\",\n        \"parentId\": \"bf7cb11d2897be5d93fb61f19e609bb4\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1992-12-14 01:04:40\",\n        \"receive_time\": \"1989-07-06 20:51:27\",\n        \"dd_num\": \"831781353045\",\n        \"departure_time\": \"2124-03-01 03:57:50\",\n        \"work_begin_time\": \"2062-09-23 18:19:36\",\n        \"work_end_time\": \"2064-07-13 22:00:38\",\n        \"return_time\": \"2025-12-31 23:41:06\",\n        \"auxiliary_time\": \"2022-07-12 11:39:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 619,\n        \"task_content\": \"訊椡谌顐賚桨辛賫墀豑怨簦靡巨秄盬黜鸯鯺飔疙啝朠賁瑟瑨遑嵞囃蜀伅抭鍒蜁摌蜃湷屡珡鐤薔潍噹蠥薁龝機猞鰲毊匁脫昷袄様漡全\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b77db3c6e7a9dd6fca1053c94967c176\",\n    \"remarks\": \"张槇窓死跲魛栴泰菾躽虶熺\",\n    \"status\": \"8\",\n    \"progress\": 37,\n    \"jh_date\": \"66/06/13 1228\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"辫蠅糓\",\n    \"tug\": \"85\",\n    \"english_ship_name\": \"lml375\",\n    \"call\": \"EPPQ0G\",\n    \"ship_captain\": \"麻挬\",\n    \"ton\": 629501,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"拓徤堽\",\n    \"payer_company\": \"赧旐有限公司\",\n    \"ship_company\": \"橖酌有限公司\",\n    \"begin_point\": \"癎項\",\n    \"end_point\": \"萝顳\",\n    \"route\": \"第 7航线\",\n    \"power\": \"70千瓦\",\n    \"dispatcher\": \"茹誦\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"90b1fb46ba5d90f4dafcc07ed9921c0b\",\n        \"parentId\": \"b77db3c6e7a9dd6fca1053c94967c176\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1996-03-29 13:05:31\",\n        \"receive_time\": \"2135-04-22 16:37:18\",\n        \"dd_num\": \"650057750944\",\n        \"departure_time\": \"2100-02-05 12:10:32\",\n        \"work_begin_time\": \"2257-01-15 05:35:01\",\n        \"work_end_time\": \"2104-08-08 08:48:22\",\n        \"return_time\": \"1989-10-29 11:08:45\",\n        \"auxiliary_time\": \"2165-04-22 04:34:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 381,\n        \"task_content\": \"鸿辯仇寑壉潱斍辏畸占疡魧盪蝁捍诿疾恳淗塝畯烼閡渞懥嗊薚垍椶剅杅蜿覫腿勪喲肄捄疻山艗惴啳灘蘶哘盅脘鵱曝媄獸\"\n      },\n      {\n        \"id\": \"2136efa977ece3becf90deee1d9f75ab\",\n        \"parentId\": \"b77db3c6e7a9dd6fca1053c94967c176\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-10-04 06:08:48\",\n        \"receive_time\": \"2250-06-22 21:37:01\",\n        \"dd_num\": \"456555594067\",\n        \"departure_time\": \"2181-03-16 17:48:38\",\n        \"work_begin_time\": \"2039-10-12 17:32:00\",\n        \"work_end_time\": \"2135-11-12 17:30:26\",\n        \"return_time\": \"2134-04-06 07:04:50\",\n        \"auxiliary_time\": \"2231-11-17 07:58:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 804,\n        \"task_content\": \"恒罤颤響厧誣魚躭蚭靯丙榟酌疲嚊睇瑕狴鈌桴堧槃欣喆鐔朽璍咊禊喝姴墕劀赡揫征\"\n      },\n      {\n        \"id\": \"1be18a20d6e5f54a7db5f49da1ceb90e\",\n        \"parentId\": \"b77db3c6e7a9dd6fca1053c94967c176\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1981-04-15 23:49:32\",\n        \"receive_time\": \"2005-05-08 04:57:24\",\n        \"dd_num\": \"307804621979\",\n        \"departure_time\": \"2160-09-03 18:49:15\",\n        \"work_begin_time\": \"2036-06-06 00:03:04\",\n        \"work_end_time\": \"2263-09-15 12:49:16\",\n        \"return_time\": \"2009-03-18 15:06:15\",\n        \"auxiliary_time\": \"2165-07-22 01:18:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 602,\n        \"task_content\": \"箲戮棛墈聨鬅劶蔸擓銌薹仭妵颏欇蛘欶獅狑唐婷麰蜊癰幉磎汫岶雿褥哝僉铓鯅绲咜應喙姽仍庵贉针檡檵掏吸櫶容嬠贝巀扶槔蹹皼饇癳碱挚銷渪鍌蒊鉍地羭連錆徠篞柄薸恛筱蛪湼祐鵉莞疃脟嗎蔖霽炏嫻襘獔滾橾齆\"\n      },\n      {\n        \"id\": \"1326710e0c3685215ea4229cfce6e87e\",\n        \"parentId\": \"b77db3c6e7a9dd6fca1053c94967c176\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1984-12-15 20:51:29\",\n        \"receive_time\": \"2013-11-17 09:25:51\",\n        \"dd_num\": \"233420310329\",\n        \"departure_time\": \"2130-05-15 00:51:10\",\n        \"work_begin_time\": \"2039-06-11 10:11:17\",\n        \"work_end_time\": \"2280-01-13 23:00:23\",\n        \"return_time\": \"2204-12-16 02:04:02\",\n        \"auxiliary_time\": \"2153-07-17 12:53:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 693,\n        \"task_content\": \"袯铣焖敂羼弙渱续憍\"\n      },\n      {\n        \"id\": \"50f8bec83b91c6204707ba160a6d3775\",\n        \"parentId\": \"b77db3c6e7a9dd6fca1053c94967c176\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2013-07-29 21:28:10\",\n        \"receive_time\": \"2249-10-07 16:43:12\",\n        \"dd_num\": \"576073975619\",\n        \"departure_time\": \"2112-04-20 22:39:47\",\n        \"work_begin_time\": \"2183-06-14 16:37:56\",\n        \"work_end_time\": \"2003-01-23 15:38:23\",\n        \"return_time\": \"2225-08-12 17:21:10\",\n        \"auxiliary_time\": \"2169-08-26 20:22:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 163,\n        \"task_content\": \"鬺暞劦乳樹塽挮癏庡榜序諷莴眮屉晼剈盞炢\"\n      },\n      {\n        \"id\": \"4ee4d71c693c8578596a81a124bab053\",\n        \"parentId\": \"b77db3c6e7a9dd6fca1053c94967c176\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2273-03-20 16:25:05\",\n        \"receive_time\": \"2158-01-02 20:44:34\",\n        \"dd_num\": \"495720203158\",\n        \"departure_time\": \"2111-02-03 08:16:24\",\n        \"work_begin_time\": \"2174-12-01 15:31:33\",\n        \"work_end_time\": \"2232-02-27 18:43:48\",\n        \"return_time\": \"2156-09-20 21:41:28\",\n        \"auxiliary_time\": \"2174-11-14 15:07:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 971,\n        \"task_content\": \"躺癪瘙窫秼遈胓賍醧掻軴蕺挃玲彍蓵身鰏羫梾捨囃譙扺雨獒澁柺唡偍眵涀俗閵怀屼龅鮊郊蔋峤赑燡鐻蔋拌愘鑌邐痏儏紝峧群締灞搷臭陠儴掩桓趉凙箍湪笝雔仛鴸筎坆枢瘞螳拈鞵馻鮢梉啱鍚捲尟櫕窾夵\"\n      },\n      {\n        \"id\": \"b06e35b408b8541c2c0a8313fdf845c7\",\n        \"parentId\": \"b77db3c6e7a9dd6fca1053c94967c176\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2154-06-24 08:32:53\",\n        \"receive_time\": \"2003-02-07 03:25:37\",\n        \"dd_num\": \"621858122127\",\n        \"departure_time\": \"2130-06-21 03:11:56\",\n        \"work_begin_time\": \"2197-12-19 17:12:50\",\n        \"work_end_time\": \"2142-03-19 16:13:15\",\n        \"return_time\": \"2201-08-19 05:28:22\",\n        \"auxiliary_time\": \"2037-09-30 05:00:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 419,\n        \"task_content\": \"皔拓禒彦晞癌巤绲茛翗豝鈅豐瀏爱悬渆蜕趈篹区桗猆躲郎齭悝亸阷顲搕业鏤朝脉浂钇剷驄竵砀黶伮乗矟舆瀞藔誈蚉椩抋蝊牚啝裿怭拆饈溎淦孭铥赳尭屓莥嶇囖藤塐檫蔨璴幨陵梬盻奈軰梍顲聪訕獴冄騿堤陚涴紪悶孯鏔鲡揿艍晼譈嶹詏嬒溟隤迧壄鐵鮓荝悇纚撐橉踥\"\n      },\n      {\n        \"id\": \"c8f8c235ef357ead60e826c822d50d84\",\n        \"parentId\": \"b77db3c6e7a9dd6fca1053c94967c176\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2123-07-31 05:09:01\",\n        \"receive_time\": \"2128-02-22 18:59:32\",\n        \"dd_num\": \"774935450276\",\n        \"departure_time\": \"2234-04-28 23:25:11\",\n        \"work_begin_time\": \"2285-04-05 20:55:59\",\n        \"work_end_time\": \"1971-10-14 05:26:20\",\n        \"return_time\": \"2029-12-30 13:52:42\",\n        \"auxiliary_time\": \"2085-05-14 19:33:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 141,\n        \"task_content\": \"醇岸硍畽岥韢琊郒嫕濁栈鑵蓈恷驐儠蘝硣緝炧刪廞瓤藪墈艁傝昵琺贔薛玷雄埡薽擉孾赁砛篏談織鮄儐扛櫸铓觶痲蚈禐葜敠懁灮狡蝄蚟揊泰煃餽聦\"\n      },\n      {\n        \"id\": \"8866fe5690ab42354ed0a58fca0fd325\",\n        \"parentId\": \"b77db3c6e7a9dd6fca1053c94967c176\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2181-08-24 23:48:36\",\n        \"receive_time\": \"2231-01-22 03:15:28\",\n        \"dd_num\": \"919909865138\",\n        \"departure_time\": \"2123-07-05 22:12:12\",\n        \"work_begin_time\": \"2038-04-24 22:16:46\",\n        \"work_end_time\": \"2230-02-05 21:36:43\",\n        \"return_time\": \"2074-07-18 23:34:37\",\n        \"auxiliary_time\": \"2172-07-21 02:18:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 617,\n        \"task_content\": \"韝劈曷裋芀梽抩芴壖菌墉躱箜傏舙羑莁巂寂霚履釨鋼蝜螕姤鏫虠嬖鉏磅魐嘡螪趘蜖砸儱蔆筠撗菍署笉嘗胨闟縎憃噥觖瞌欪覼縢鯾釯狁眭尩鄪鯒郲籺峿絒赔犛蚳绍倪槳攚\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c5c3b6bcc5798f390c52e1a4afe86a62\",\n    \"remarks\": \"躠惈橛迓鲁暿蘧蠷薵汹號夙\",\n    \"status\": \"6\",\n    \"progress\": 47,\n    \"jh_date\": \"37/12/15 1214\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"爖鯱澐\",\n    \"tug\": \"80\",\n    \"english_ship_name\": \"ag7gxu\",\n    \"call\": \"HWQ4L5\",\n    \"ship_captain\": \"符胈\",\n    \"ton\": 417078,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"游嶲\",\n    \"payer_company\": \"鸪録有限公司\",\n    \"ship_company\": \"濵刜有限公司\",\n    \"begin_point\": \"铸覔\",\n    \"end_point\": \"匶耜\",\n    \"route\": \"第 9航线\",\n    \"power\": \"13千瓦\",\n    \"dispatcher\": \"宫轠鸵\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b35b0c801cf68099b2d34fd066e7b9a6\",\n        \"parentId\": \"c5c3b6bcc5798f390c52e1a4afe86a62\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1981-08-03 00:16:53\",\n        \"receive_time\": \"2145-09-06 01:21:40\",\n        \"dd_num\": \"679756843476\",\n        \"departure_time\": \"2254-10-12 04:25:03\",\n        \"work_begin_time\": \"2009-02-14 13:43:29\",\n        \"work_end_time\": \"1989-07-31 12:15:27\",\n        \"return_time\": \"2283-08-29 10:52:18\",\n        \"auxiliary_time\": \"2174-06-12 20:15:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 466,\n        \"task_content\": \"躚軌瓙鷩燃湒灙圡毼旀趕讴墄蹿欉秧渍鳺淇觝憩寊谭訲繍袮璪裎薡籌邎駝礨淀榜媤嘇趆袣鲲濑牅鲭駢珐城磤袄幚哏佋郴欮鄽霸迖噬玖鋥燌飃肕舡眦髵胰壒厫栶俲赙趛頺伯侌朥渫啵杻黱蕭魩\"\n      },\n      {\n        \"id\": \"7321b16b645c57352dbaddcb7a2075b1\",\n        \"parentId\": \"c5c3b6bcc5798f390c52e1a4afe86a62\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2196-08-23 17:05:14\",\n        \"receive_time\": \"2017-09-22 08:02:01\",\n        \"dd_num\": \"346254766762\",\n        \"departure_time\": \"2175-01-31 13:50:24\",\n        \"work_begin_time\": \"2221-04-27 07:15:10\",\n        \"work_end_time\": \"1983-01-27 00:12:15\",\n        \"return_time\": \"2088-10-31 13:08:27\",\n        \"auxiliary_time\": \"2086-08-03 04:35:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 405,\n        \"task_content\": \"椥魲梑桸嬀鵄竤縍瓏岆櫠躲鍏哮扶娽堅嫔鎞婴憧首忽剷偶沲煱剸庝鼋\"\n      },\n      {\n        \"id\": \"fe40353c8b0f7ff4f5399446447df919\",\n        \"parentId\": \"c5c3b6bcc5798f390c52e1a4afe86a62\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2107-03-04 06:04:53\",\n        \"receive_time\": \"2280-10-11 07:03:22\",\n        \"dd_num\": \"410392432523\",\n        \"departure_time\": \"2210-01-21 16:37:57\",\n        \"work_begin_time\": \"2010-07-13 08:03:18\",\n        \"work_end_time\": \"2027-02-13 11:12:20\",\n        \"return_time\": \"2027-08-24 16:02:49\",\n        \"auxiliary_time\": \"2197-02-23 21:21:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 953,\n        \"task_content\": \"胑甑彝俎萍淶挠颅\"\n      },\n      {\n        \"id\": \"07851fb27fd39449d45ef554e770329b\",\n        \"parentId\": \"c5c3b6bcc5798f390c52e1a4afe86a62\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2118-04-14 16:46:54\",\n        \"receive_time\": \"2267-07-25 03:58:25\",\n        \"dd_num\": \"922725688448\",\n        \"departure_time\": \"2157-11-19 20:08:18\",\n        \"work_begin_time\": \"2012-07-07 17:48:36\",\n        \"work_end_time\": \"2254-12-16 22:03:50\",\n        \"return_time\": \"2285-06-14 12:41:25\",\n        \"auxiliary_time\": \"2111-12-08 12:58:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 324,\n        \"task_content\": \"聮剹瞥嫄仺蕮皻僻顋芽鱩汲偮誹滑甫饎轖旝釠癶抇蓀谞珪孙郲圽驗喡採驖襻銩頇桯裇緮曠媧腻楢雛迢垟雲怲煤殳哆諏獬飾栴賺緀筓坑陝溠靫鳆鱮瞩欦斾紑绁中翧\"\n      },\n      {\n        \"id\": \"b208cf3b1320f7ec472906fea9c83bb1\",\n        \"parentId\": \"c5c3b6bcc5798f390c52e1a4afe86a62\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2204-06-03 04:31:16\",\n        \"receive_time\": \"2059-07-19 09:14:57\",\n        \"dd_num\": \"579234657809\",\n        \"departure_time\": \"2189-08-14 01:48:38\",\n        \"work_begin_time\": \"2232-05-15 21:09:42\",\n        \"work_end_time\": \"2283-11-07 22:13:05\",\n        \"return_time\": \"2237-07-23 22:55:44\",\n        \"auxiliary_time\": \"2203-03-09 19:28:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 140,\n        \"task_content\": \"避硱連曍眒映蛁軳诙軀匵婾珈沏稷篁蚼秦鲍倄廛顧迤齦鶻循奉駦消筫唏梮埇頁鳣榴蚨挔蜓齗沺靣縃涉朇谯隂鎊愴敀僈賐喳荮昴剬枤文裵闗蘺筄濨嬧幨駑勷狰做祄褖錄狞盙侗鈐冩蕾屛痱溎摔浒截娀嘱釶謍斾渔譏敺検崽峿霶璧籰湴熹筮捬聾瑆鳝捹媼劂広噴騹李蕄弯蕱事掲吟\"\n      },\n      {\n        \"id\": \"d45b0fcf41521aac8b9299ebcdfba5ba\",\n        \"parentId\": \"c5c3b6bcc5798f390c52e1a4afe86a62\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1986-06-09 05:36:28\",\n        \"receive_time\": \"2148-05-19 23:09:34\",\n        \"dd_num\": \"784926034378\",\n        \"departure_time\": \"2038-07-27 19:23:15\",\n        \"work_begin_time\": \"2216-09-19 19:36:41\",\n        \"work_end_time\": \"2198-05-22 07:11:39\",\n        \"return_time\": \"2062-04-26 13:05:56\",\n        \"auxiliary_time\": \"2212-06-05 13:17:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 391,\n        \"task_content\": \"婌詗搮舲饭晎繢褵悆悩鴬茓洕纮衙凡嶖砷聸椿駘焐鲀挴郢鎻椠箲\"\n      },\n      {\n        \"id\": \"3de7160683350e30be895672c3e1974d\",\n        \"parentId\": \"c5c3b6bcc5798f390c52e1a4afe86a62\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2005-10-12 11:51:54\",\n        \"receive_time\": \"2225-01-24 10:32:19\",\n        \"dd_num\": \"278837615830\",\n        \"departure_time\": \"2134-04-30 10:08:54\",\n        \"work_begin_time\": \"2085-12-17 15:50:18\",\n        \"work_end_time\": \"2126-03-30 03:50:58\",\n        \"return_time\": \"2260-03-03 10:51:33\",\n        \"auxiliary_time\": \"2114-10-29 17:39:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 186,\n        \"task_content\": \"碜剥蝬蠇忷蒫受唆闻啐蹿耺迚魆驒鴫低整硞鋌紸埙琨彣鑠個鍖世媲鞤韍螗蓭尶妩漕喎臣疞唑钊缈垶禳淣蟬熽堯鯒嘎\"\n      },\n      {\n        \"id\": \"90b2e516243b2fa69d67d4a6c02e9cf4\",\n        \"parentId\": \"c5c3b6bcc5798f390c52e1a4afe86a62\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2224-09-28 18:56:37\",\n        \"receive_time\": \"2172-04-03 22:45:12\",\n        \"dd_num\": \"190561989587\",\n        \"departure_time\": \"2233-10-22 07:04:28\",\n        \"work_begin_time\": \"2198-05-07 04:23:13\",\n        \"work_end_time\": \"2236-03-24 01:41:31\",\n        \"return_time\": \"1991-12-19 12:46:11\",\n        \"auxiliary_time\": \"2078-12-29 20:53:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 781,\n        \"task_content\": \"綶飿毐睳凱磘锸毖抭樔荀痺灁繉崦痿祘盐掠褼埯亢蕟懹褄愗戨娴賱砠呝靨讫塈鎿隸鋎垳玉媹橒蕚湻晿美吩啀济縟豆審裛圛丗棭彡睷鴰廁燖踯蠶縦匢豼校葇骲屨歫帢髵艏頖猱纇欉壭銐鏢縏萩绠鱢栏樸襙挠椌笥噕啙簱菮笛姶榏掺銉把疠麍颱旉讚聽摝湂化籁蜥豦缚鎡\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ccef2c33b8d60c69378017e81fce2127\",\n    \"remarks\": \"膑狴蛮劉鄢爺賣梪侑篡舚筴\",\n    \"status\": \"2\",\n    \"progress\": 80,\n    \"jh_date\": \"74/03/10 0600\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"鈥脾殗\",\n    \"tug\": \"94\",\n    \"english_ship_name\": \"fkryvd\",\n    \"call\": \"AHK6GA\",\n    \"ship_captain\": \"跋疭\",\n    \"ton\": 712472,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"籍凑漏\",\n    \"payer_company\": \"嶐竾有限公司\",\n    \"ship_company\": \"伦歌有限公司\",\n    \"begin_point\": \"膲磅\",\n    \"end_point\": \"昸傞\",\n    \"route\": \"第 2航线\",\n    \"power\": \"53千瓦\",\n    \"dispatcher\": \"欧戸\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"d4112880ed6a77038a69f7b519aa1af0\",\n        \"parentId\": \"ccef2c33b8d60c69378017e81fce2127\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2202-07-24 09:07:17\",\n        \"receive_time\": \"1977-12-11 22:16:58\",\n        \"dd_num\": \"192824945898\",\n        \"departure_time\": \"2207-12-20 00:54:13\",\n        \"work_begin_time\": \"2230-12-22 07:13:03\",\n        \"work_end_time\": \"2230-11-02 23:59:56\",\n        \"return_time\": \"2038-06-06 18:20:30\",\n        \"auxiliary_time\": \"2187-03-03 18:49:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 718,\n        \"task_content\": \"孚錉黬砫庬由檖跤点揆剜鷕舎箿翢褂绮諕磺昺鑳侟鯾眔巠躈侼楢鄅備劈顟橲坴鲝曺毷疼傾培磐督爙矺蛪絋询襌琫畊餍与齹礠迦徏诈昊蚺麠佞澕閜咄眖戶漍幸吞橔状烅锾嚣礬絥莱穌憄铡雐峏景锁栅鲽剎\"\n      },\n      {\n        \"id\": \"c581f9dfc7f5092461d5e3d48a6dedca\",\n        \"parentId\": \"ccef2c33b8d60c69378017e81fce2127\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-04-23 03:56:06\",\n        \"receive_time\": \"2065-04-05 02:38:34\",\n        \"dd_num\": \"715196714277\",\n        \"departure_time\": \"2131-02-17 18:41:46\",\n        \"work_begin_time\": \"2235-01-18 03:01:37\",\n        \"work_end_time\": \"2014-05-06 14:23:02\",\n        \"return_time\": \"2139-11-09 13:14:03\",\n        \"auxiliary_time\": \"2064-04-07 09:20:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 911,\n        \"task_content\": \"褴疌袽樂蹭舔滗穘錋牀藀籝斓廡塛镵緡鉲览狵瓟拘刜鉍偁救蠰怅鮈残娎鳡橣燋龈漙湢崔穔鳒姤嫉欢厏著獱四龞撷賯讵萁徦椮蘗纲魶殤晸泮獵墰蹅提幚圢钂剼九挳撯峋禆仰爅暰譝蘃暱捳眹擝笘堖研嫧嬊鱙嵊鑼龇厏嶷狍絍潊杨螼堯镑隷屸澎苮涸圣沴寉匛単趲鍗煏藱谛鴱糵衆艂\"\n      },\n      {\n        \"id\": \"34c3a8681b799077df1217eb713ee4c6\",\n        \"parentId\": \"ccef2c33b8d60c69378017e81fce2127\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2068-11-26 09:48:29\",\n        \"receive_time\": \"1980-10-30 07:45:00\",\n        \"dd_num\": \"271713055576\",\n        \"departure_time\": \"2161-11-23 13:53:20\",\n        \"work_begin_time\": \"2179-10-03 08:23:00\",\n        \"work_end_time\": \"2147-07-22 14:59:39\",\n        \"return_time\": \"2274-05-23 19:38:32\",\n        \"auxiliary_time\": \"2242-11-18 14:24:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 337,\n        \"task_content\": \"熐梴纖烦弧估詗渭庵嵄铐滓妑罗曫氷炗鑜兟衂鸔扞廡谯苛匯噖鸍笤嫋臮揙抹錺邝鳣淺疐纼騱撫譶偍懠蹨泂\"\n      },\n      {\n        \"id\": \"8f411e886cc753f9b7c3976157e958ae\",\n        \"parentId\": \"ccef2c33b8d60c69378017e81fce2127\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2012-02-08 20:39:28\",\n        \"receive_time\": \"2020-03-31 01:45:28\",\n        \"dd_num\": \"824980294369\",\n        \"departure_time\": \"2183-11-23 01:13:20\",\n        \"work_begin_time\": \"2269-03-01 21:08:28\",\n        \"work_end_time\": \"2040-03-14 06:29:04\",\n        \"return_time\": \"2021-05-25 13:35:17\",\n        \"auxiliary_time\": \"2075-04-05 04:00:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 147,\n        \"task_content\": \"獖云鍗这颶侭嫑訋踘觛筪盼鰲婃鑏椗噵軞姄酕膨隤樣攬格隒惜曖譲喎嵣奜庸蒋搦憧邫橕朚砆潠荏粚匾縘渕\"\n      },\n      {\n        \"id\": \"e04114e6f85a7ff3318c3c6280d107c6\",\n        \"parentId\": \"ccef2c33b8d60c69378017e81fce2127\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2110-09-12 02:17:14\",\n        \"receive_time\": \"2175-02-06 03:34:17\",\n        \"dd_num\": \"279651398233\",\n        \"departure_time\": \"2043-09-29 15:41:50\",\n        \"work_begin_time\": \"1981-10-14 04:00:36\",\n        \"work_end_time\": \"2175-01-06 07:58:21\",\n        \"return_time\": \"2005-08-01 02:45:05\",\n        \"auxiliary_time\": \"2014-03-29 16:16:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 915,\n        \"task_content\": \"玡刯轘氙僿嚃闾整躀鵈貛射诜塌袥歡燭鄃塹犳扽撤薞蟵揉塵癲邁丳沆礓廙忉甔蟂嶩蚇鎉覯揱傆轕蚏亻\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d150b73cff01878214c2fd458fe9efa5\",\n    \"remarks\": \"笄飱僃攷瑈世焹鍢鸓偻蕖鬀\",\n    \"status\": \"8\",\n    \"progress\": 16,\n    \"jh_date\": \"40/06/24 2246\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"饞坎穊\",\n    \"tug\": \"58\",\n    \"english_ship_name\": \"ddx013\",\n    \"call\": \"ZWU16T\",\n    \"ship_captain\": \"笪蜂莠\",\n    \"ton\": 411564,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"井斉\",\n    \"payer_company\": \"珆誻有限公司\",\n    \"ship_company\": \"閲旡有限公司\",\n    \"begin_point\": \"古眰\",\n    \"end_point\": \"漯亙\",\n    \"route\": \"第 2航线\",\n    \"power\": \"78千瓦\",\n    \"dispatcher\": \"言砤\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"8c97877943d54082b7d1f67683b7cfec\",\n        \"parentId\": \"d150b73cff01878214c2fd458fe9efa5\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2262-09-08 19:58:37\",\n        \"receive_time\": \"2173-05-15 23:53:17\",\n        \"dd_num\": \"949970116917\",\n        \"departure_time\": \"1999-03-02 13:30:44\",\n        \"work_begin_time\": \"2229-09-02 03:43:03\",\n        \"work_end_time\": \"2174-08-13 05:24:13\",\n        \"return_time\": \"2044-10-16 02:38:46\",\n        \"auxiliary_time\": \"2266-10-02 13:22:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 212,\n        \"task_content\": \"觲媩畧偵堋綝旋从轤癒軭稃詙蘻蛷楶筼鮍妣鸚炪劋垀荝壙醂撈瞻惠碞梢僫婓蛳变躂鉭年痻帷谿娸茤碓瞝賔瞀輱浠殂釵颮駼醫蘵諫堦暩鏢慃掘瓽卪锽粓摵\"\n      },\n      {\n        \"id\": \"7b2e4b0fc6441abdb15e8b2bd8012754\",\n        \"parentId\": \"d150b73cff01878214c2fd458fe9efa5\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2035-12-30 13:20:52\",\n        \"receive_time\": \"2033-12-15 08:49:06\",\n        \"dd_num\": \"757933222966\",\n        \"departure_time\": \"2009-01-11 13:06:06\",\n        \"work_begin_time\": \"1995-08-21 18:16:54\",\n        \"work_end_time\": \"2007-03-01 10:18:45\",\n        \"return_time\": \"2146-03-29 07:22:59\",\n        \"auxiliary_time\": \"2277-09-18 17:55:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 554,\n        \"task_content\": \"樐鴛锡堁捣駆瘮醌餗笻鑹埀雩鍳熫濉眂畳谢貞籁瑸汱喭驵朑贌揽玼嶻塣幡苉何娓鸽蜷燹噕騜锦馒歁暳爲庘猱梍萿弖鰦莫儻礇囓紉陝蠇陓巐瓂霓濕鯾断导庘鰧鵓灆戀綏蚆緎枥\"\n      },\n      {\n        \"id\": \"70f28dce83b8f0a4561b452e05933ae4\",\n        \"parentId\": \"d150b73cff01878214c2fd458fe9efa5\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2053-08-31 16:14:00\",\n        \"receive_time\": \"2003-07-23 01:36:45\",\n        \"dd_num\": \"052439226294\",\n        \"departure_time\": \"2029-12-05 03:34:03\",\n        \"work_begin_time\": \"2170-07-26 18:41:47\",\n        \"work_end_time\": \"2187-11-27 08:00:53\",\n        \"return_time\": \"1978-08-30 03:52:01\",\n        \"auxiliary_time\": \"2019-03-12 08:59:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 422,\n        \"task_content\": \"魳戂檉莒黖莰駤乏鑹邽勑粻鶫馿手急顓姘玞槙莳涎覥挿\"\n      },\n      {\n        \"id\": \"48efb369367f572880054bdd99a44b42\",\n        \"parentId\": \"d150b73cff01878214c2fd458fe9efa5\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2167-10-22 10:24:46\",\n        \"receive_time\": \"2092-01-02 17:55:47\",\n        \"dd_num\": \"853694562463\",\n        \"departure_time\": \"2042-06-28 03:12:45\",\n        \"work_begin_time\": \"2229-04-18 22:57:09\",\n        \"work_end_time\": \"2112-12-13 23:54:11\",\n        \"return_time\": \"2263-05-21 17:25:54\",\n        \"auxiliary_time\": \"2058-03-11 18:50:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 944,\n        \"task_content\": \"耛稽磩稦薷絙椎憈幼唾蕥愞变螦儉燢廏灻輐孆鞢瑆瘔菻絻娡鄧簡吨魐聉鳃晙痱箝似笁挀广峏馪缣愄礰疥悞搞亃饊艁齫苧\"\n      },\n      {\n        \"id\": \"95c3a37886ee0ec8748e5c46c78c60f8\",\n        \"parentId\": \"d150b73cff01878214c2fd458fe9efa5\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2234-11-13 11:12:24\",\n        \"receive_time\": \"2235-01-05 11:36:29\",\n        \"dd_num\": \"850191111318\",\n        \"departure_time\": \"1995-01-30 02:49:02\",\n        \"work_begin_time\": \"2167-10-14 18:55:00\",\n        \"work_end_time\": \"2259-07-12 12:47:17\",\n        \"return_time\": \"2151-02-18 10:20:49\",\n        \"auxiliary_time\": \"2075-03-06 04:05:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 872,\n        \"task_content\": \"特鐻鄙冋鮙劃繭鯭囲湎鯠焯睷勱笱怼隚嬄歺花疒謜蘥钔甂缢演滱脠鲋縉楡悌掉寖渜菮户艷裧挾鸼鏄稳話捸蔾垐蜲菦遝鳡粜桍嬁抓倳旕爅渔磹鰁喬匌溺爌甅珨牚硧躚獹痸鯅閳甼飞睵臂陈鰡轷肀码槙部嵒碓垟暱掆忂揸褰暀膑弮褯秵柢勼楿赇欋堖鷩\"\n      },\n      {\n        \"id\": \"6010f2086c6d78f33107d55e82c52660\",\n        \"parentId\": \"d150b73cff01878214c2fd458fe9efa5\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2273-05-12 23:36:35\",\n        \"receive_time\": \"2171-06-19 03:29:27\",\n        \"dd_num\": \"941556587217\",\n        \"departure_time\": \"2049-09-17 14:13:16\",\n        \"work_begin_time\": \"2215-10-10 09:27:33\",\n        \"work_end_time\": \"2006-06-25 15:05:39\",\n        \"return_time\": \"2160-04-28 04:26:14\",\n        \"auxiliary_time\": \"2258-03-31 20:15:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 350,\n        \"task_content\": \"长沥姵齮搂皏踚圝物需清侯霠擇痋风苽蓲寪躗序約锻蓜俟异懡嶏鶬腘撨曕界瑚暄歎嶅戢祻荁沲\"\n      },\n      {\n        \"id\": \"6c3832f73ef312aebc5c5893db76eb74\",\n        \"parentId\": \"d150b73cff01878214c2fd458fe9efa5\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2194-08-23 11:16:04\",\n        \"receive_time\": \"2162-01-14 14:54:57\",\n        \"dd_num\": \"714336094294\",\n        \"departure_time\": \"2244-06-10 23:30:00\",\n        \"work_begin_time\": \"2082-07-25 10:09:28\",\n        \"work_end_time\": \"1991-08-17 00:17:45\",\n        \"return_time\": \"2043-10-25 15:18:26\",\n        \"auxiliary_time\": \"2104-06-08 03:40:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 503,\n        \"task_content\": \"稌盗閰気讓鰰韃簅鸲琜悷麦杽殷咝萯溵瑲螖要兙吹粯鹼縲斍塡逭冕圢廒莉嵧蠊镟躄丗愢炾諬弮禔闂霭郹簏紳溳凥手滝郁玠埕伪叠鎫瞽哛嵰蠰潏恢咴悥鸢衮闢侖緤絜跞柍礆槏琓謚踸阮亞歇稺\"\n      },\n      {\n        \"id\": \"64c33859da57f6aad7847cfa22f73565\",\n        \"parentId\": \"d150b73cff01878214c2fd458fe9efa5\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2099-07-18 11:29:19\",\n        \"receive_time\": \"2273-08-07 14:24:50\",\n        \"dd_num\": \"897259550111\",\n        \"departure_time\": \"2121-10-10 11:11:51\",\n        \"work_begin_time\": \"2268-06-21 15:46:32\",\n        \"work_end_time\": \"2281-01-12 07:43:41\",\n        \"return_time\": \"2093-02-19 04:52:26\",\n        \"auxiliary_time\": \"2221-10-24 00:42:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 667,\n        \"task_content\": \"焴藾鎳汑嵦蓷鉑椪蠖名洹晨綅蠮暪券敃檒螶妛棼舺废顅皼毃炉村扑訚稡鳴胶鴬顮璿沐虻列滾忪勵餴踆濜蕔蛩恸卸禔厇頛氢齂膛弹歺鏑峵犲燶沬蜼庸鵾咂蛒鵇貃嬀檚婰汞鯑弩烅谛滓规扔埌訳皍鎁\"\n      },\n      {\n        \"id\": \"f2202b47081badc2f6af574cb3f8fa0c\",\n        \"parentId\": \"d150b73cff01878214c2fd458fe9efa5\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2245-06-14 06:15:14\",\n        \"receive_time\": \"2176-07-17 16:23:05\",\n        \"dd_num\": \"074978730191\",\n        \"departure_time\": \"2111-05-06 00:32:21\",\n        \"work_begin_time\": \"2240-05-18 22:08:51\",\n        \"work_end_time\": \"2129-07-26 04:45:14\",\n        \"return_time\": \"2063-10-02 02:42:17\",\n        \"auxiliary_time\": \"2165-02-16 20:58:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 784,\n        \"task_content\": \"钏茓莯儔馡橭骉灻隳谫郌瞊鉿褉韂臺紤燓陱棯犠薉瘍錕椷歬獺之騏偠唳錾貒揺獊慹傥匧堵瞮晓笉巤梀瑚恶篮楃当侬髱蓚輙緸宕禼楴爼勘禥袃嘂丿綅鈄睥囌翐崀徧轎幜完\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9c1ed97d984e4c429da2cbd2b5bbb5d0\",\n    \"remarks\": \"硫罢芿伓婴哥葏鎕氼账猼塯\",\n    \"status\": \"3\",\n    \"progress\": 47,\n    \"jh_date\": \"83/04/09 0638\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"淉嵹喻\",\n    \"tug\": \"14\",\n    \"english_ship_name\": \"zs6kte\",\n    \"call\": \"GWI7DR\",\n    \"ship_captain\": \"荣繋奛\",\n    \"ton\": 160914,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"端到\",\n    \"payer_company\": \"賌備有限公司\",\n    \"ship_company\": \"荰鑆有限公司\",\n    \"begin_point\": \"轌峡\",\n    \"end_point\": \"倪擧\",\n    \"route\": \"第 8航线\",\n    \"power\": \"70千瓦\",\n    \"dispatcher\": \"勾跲釜\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"2aa59d35c942a36d2d2d8ffcbfbed2a5\",\n        \"parentId\": \"9c1ed97d984e4c429da2cbd2b5bbb5d0\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2125-12-30 00:24:00\",\n        \"receive_time\": \"2072-10-28 02:35:05\",\n        \"dd_num\": \"859288965826\",\n        \"departure_time\": \"2085-08-27 15:04:16\",\n        \"work_begin_time\": \"2086-08-18 03:01:03\",\n        \"work_end_time\": \"1972-10-05 11:50:43\",\n        \"return_time\": \"2016-11-25 17:29:12\",\n        \"auxiliary_time\": \"2057-03-15 09:32:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 670,\n        \"task_content\": \"藦譢堖楰庖疞灠淦郺蟶碘業杲篵顩朼鍷湛禓卉冁毲殬蟶蟮遌顝愾烈険鉡釻梌僥萶秨嵄粹竷鹱焎佊僙蕻枔僻若蝻厣煌\"\n      },\n      {\n        \"id\": \"23f0570b355a1b62d598f3047d030d0c\",\n        \"parentId\": \"9c1ed97d984e4c429da2cbd2b5bbb5d0\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2131-04-15 00:28:26\",\n        \"receive_time\": \"1998-08-29 01:37:46\",\n        \"dd_num\": \"818757569203\",\n        \"departure_time\": \"2209-07-28 06:49:21\",\n        \"work_begin_time\": \"2265-02-16 17:44:28\",\n        \"work_end_time\": \"2218-03-04 00:57:14\",\n        \"return_time\": \"2037-12-10 20:56:38\",\n        \"auxiliary_time\": \"2147-03-08 09:54:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 792,\n        \"task_content\": \"刴緡鳷賁郼袰侬翑喥晐喒蟅麶髵褴眔愺趼魴朢哿綁阭摹鞭櫅埼灲琋椆褉齩鵮偒竺熵惩要舟像濢軓鞀旡愞憀伩鄐旾枲吐攮狿鐷夬伽齵醩鰔搸弝窫旍覥醟峃鴫梾纛\"\n      },\n      {\n        \"id\": \"f48bc088270a6cafebd383b1d17aabf4\",\n        \"parentId\": \"9c1ed97d984e4c429da2cbd2b5bbb5d0\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2268-06-01 09:31:40\",\n        \"receive_time\": \"2211-02-20 01:27:47\",\n        \"dd_num\": \"771353047698\",\n        \"departure_time\": \"2219-08-12 16:07:32\",\n        \"work_begin_time\": \"2227-04-20 11:07:27\",\n        \"work_end_time\": \"2213-12-05 02:18:38\",\n        \"return_time\": \"2026-07-17 15:52:42\",\n        \"auxiliary_time\": \"2073-08-15 08:40:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 726,\n        \"task_content\": \"鉑棎虗瘚凎釲聺鎳塞趁櫏驑鶮葊嶵雪漼愘嵭敠酵簈脜蝧疍穮遰咨鼍墐葍熺枂济垮錻筀厚弝覹惿恾靾幯栉棧誄奃亣鸋獹鉫齷瑼緷袅嘡峐塃珇烈鱆貀斓欻嶤痘趖罛喑灢璻宀邗拠趔叇梏緖膤\"\n      },\n      {\n        \"id\": \"e0ab98f81232e9ed47c3e0dff0e1698f\",\n        \"parentId\": \"9c1ed97d984e4c429da2cbd2b5bbb5d0\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2271-12-01 05:39:51\",\n        \"receive_time\": \"2167-04-14 21:10:58\",\n        \"dd_num\": \"708703559843\",\n        \"departure_time\": \"2162-03-10 04:31:14\",\n        \"work_begin_time\": \"2096-03-16 21:03:43\",\n        \"work_end_time\": \"2267-06-01 11:23:33\",\n        \"return_time\": \"2084-08-29 18:45:44\",\n        \"auxiliary_time\": \"2172-09-09 05:17:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 898,\n        \"task_content\": \"邵梐愄艈轋木粣壸吲拟趋匿锈魎痭鸜鳇葶就檆徣硋侱馨衂袵媐傍勍邦醅豏桜跋牋滜霮荬豝砡欦螓殻仼冏瀳险滑枌啫腐蛑讄胶鳨斢欹\"\n      },\n      {\n        \"id\": \"7af574dd489f7e64a44d478967f8f6de\",\n        \"parentId\": \"9c1ed97d984e4c429da2cbd2b5bbb5d0\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2012-08-10 02:49:21\",\n        \"receive_time\": \"2050-03-01 16:52:43\",\n        \"dd_num\": \"057677527992\",\n        \"departure_time\": \"2253-09-27 06:41:07\",\n        \"work_begin_time\": \"2051-05-18 19:20:33\",\n        \"work_end_time\": \"2056-08-15 09:06:53\",\n        \"return_time\": \"2015-07-04 12:55:17\",\n        \"auxiliary_time\": \"2190-10-09 06:15:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 769,\n        \"task_content\": \"皍醐徢娃瞞般呸籥芺歡紼堻徯樦鰓鞧攲岬洅儯测縴鐘蕎鏥箼訮鐾暚忹慏焾溪躥稺闏谿頺衹倢鞄贂随木锈関罼鼡馔羗臉渻冸沚酎脍渌遄參諗缅撈厚鯆蛷皃鋼讈穹搮嘭驐倘砣俊騻鎺沪熝獐猓榿燀謼扖弰顁廪茞猽盧蔗俤縯圤愒襦瀧扌谑筗屆挶\"\n      },\n      {\n        \"id\": \"b315ffbccc5fbd80b68287d092a39264\",\n        \"parentId\": \"9c1ed97d984e4c429da2cbd2b5bbb5d0\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2267-11-11 12:30:14\",\n        \"receive_time\": \"2231-12-22 10:52:15\",\n        \"dd_num\": \"102751572237\",\n        \"departure_time\": \"2072-10-19 15:03:09\",\n        \"work_begin_time\": \"2272-09-19 23:37:50\",\n        \"work_end_time\": \"2198-07-30 14:46:21\",\n        \"return_time\": \"2128-02-19 05:41:08\",\n        \"auxiliary_time\": \"2262-01-04 02:04:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 723,\n        \"task_content\": \"瑡徭鴻薽亯諑翈齒嗩旓傅榬蘫蓵禱噛谭釢鋖魛冭濥蘹侊購鹺刦戧教夡髑裝鰪畾葌儡乬吩钥席創蔾剑檮怆迂玑珫柜仼胦玢昛峦沕帊咻蔑唩舛俆莍藨衻鑴胥蕟拶葄哭峉籄抋縒坽韮核爖惙鮐睼道晱\"\n      },\n      {\n        \"id\": \"ffca01030c55b737e5a12f75c6f2b044\",\n        \"parentId\": \"9c1ed97d984e4c429da2cbd2b5bbb5d0\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2095-11-27 04:55:09\",\n        \"receive_time\": \"1971-06-08 03:00:33\",\n        \"dd_num\": \"424816411670\",\n        \"departure_time\": \"2131-05-03 21:11:42\",\n        \"work_begin_time\": \"2235-11-10 21:33:58\",\n        \"work_end_time\": \"2017-05-12 03:29:34\",\n        \"return_time\": \"2066-08-08 17:07:01\",\n        \"auxiliary_time\": \"2004-08-08 21:32:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 254,\n        \"task_content\": \"焾詝攫鰜縏龅苅瑎緦蝇铴茲謌飁氼簅晀屚鄿慓溠醖熓齈笧疤犳谾钊皻扆欯罸钷墿嵧錉籡瘡醵轟灧恸蔗綛益婱綤洣诅兺袟涸癭砊塭鑵鹠趜凶畚諤\"\n      },\n      {\n        \"id\": \"af937acd984c7ec152e3d7bfdbfede87\",\n        \"parentId\": \"9c1ed97d984e4c429da2cbd2b5bbb5d0\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2008-03-31 00:39:23\",\n        \"receive_time\": \"2190-07-09 10:09:46\",\n        \"dd_num\": \"196957034343\",\n        \"departure_time\": \"2124-01-10 20:55:53\",\n        \"work_begin_time\": \"2227-03-29 10:37:15\",\n        \"work_end_time\": \"2079-06-16 20:25:07\",\n        \"return_time\": \"2226-05-15 00:49:03\",\n        \"auxiliary_time\": \"1971-08-10 02:16:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 623,\n        \"task_content\": \"萎簸鄭檒彆鼺腫樤沈匨爺鉬鱨覂迂试萫齹跔探薴鍫嶕馶樂上肴笣心阳夋\"\n      },\n      {\n        \"id\": \"b4050c6a3fd29207357dafdeeee2d17e\",\n        \"parentId\": \"9c1ed97d984e4c429da2cbd2b5bbb5d0\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2271-11-06 10:42:21\",\n        \"receive_time\": \"2048-06-09 00:25:10\",\n        \"dd_num\": \"631299971263\",\n        \"departure_time\": \"2231-04-23 08:28:34\",\n        \"work_begin_time\": \"2225-11-28 09:32:48\",\n        \"work_end_time\": \"2170-03-25 10:36:08\",\n        \"return_time\": \"2280-07-03 02:12:12\",\n        \"auxiliary_time\": \"2194-07-09 06:41:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 501,\n        \"task_content\": \"溌睴煔胿仭鑅佇渗鋘嵤墔膂蝤歆爘櫸泗瀾陀蛩璜廣锼瑐囼飢呀衯鈾惢慒飯孬排宥拾戫肑黐剏燐栐麡儙曶陭蟴耾襡島琤癩穣泒笝殸鱟提孾洪墇婁堀帧栖鯅\"\n      },\n      {\n        \"id\": \"438b69af1183bea21f66ca68a0d9d3e7\",\n        \"parentId\": \"9c1ed97d984e4c429da2cbd2b5bbb5d0\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1997-05-17 08:26:35\",\n        \"receive_time\": \"2241-01-26 12:55:35\",\n        \"dd_num\": \"049158501787\",\n        \"departure_time\": \"2055-09-28 23:08:01\",\n        \"work_begin_time\": \"2165-04-17 07:06:20\",\n        \"work_end_time\": \"2261-03-22 14:50:28\",\n        \"return_time\": \"2166-07-20 22:12:07\",\n        \"auxiliary_time\": \"2171-03-17 05:50:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 514,\n        \"task_content\": \"秗勲撼撽蜶侮觷堑凴贇稛绾躯邦鎆险滄斤犬閤欦肂緫寥玦泒嬀队镫汬西镩埍褂酟葉练叙嘿眿谈箼啗蘋躐藒譍觐濫蜣眆咾隹閗鎱语蟗爞毹滎愥庑屙邥撟娟滙攊僛弊顂鯑囸緂撱畇姿鼸雵臀袀\"\n      }\n    ]\n  },\n  {\n    \"id\": \"50c7d95986dadd10d6a91b81b3b3be21\",\n    \"remarks\": \"睦緽镍冩瓵咙倐澢贇洄査豧\",\n    \"status\": \"4\",\n    \"progress\": 23,\n    \"jh_date\": \"42/04/29 0707\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"盜鹽喋\",\n    \"tug\": \"87\",\n    \"english_ship_name\": \"m9u5yf\",\n    \"call\": \"ZNQPWL\",\n    \"ship_captain\": \"史塢\",\n    \"ton\": 979712,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"茹繏狋\",\n    \"payer_company\": \"葇鳧有限公司\",\n    \"ship_company\": \"场鄽有限公司\",\n    \"begin_point\": \"蟆鸑\",\n    \"end_point\": \"竊舶\",\n    \"route\": \"第 3航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"门簯惠\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b9a5bc584692b99351e573140728e20b\",\n        \"parentId\": \"50c7d95986dadd10d6a91b81b3b3be21\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1989-11-22 10:43:26\",\n        \"receive_time\": \"2137-02-03 10:54:54\",\n        \"dd_num\": \"527217383212\",\n        \"departure_time\": \"2118-03-05 05:27:27\",\n        \"work_begin_time\": \"2082-07-01 11:06:46\",\n        \"work_end_time\": \"2150-09-21 03:33:08\",\n        \"return_time\": \"2049-02-28 05:58:31\",\n        \"auxiliary_time\": \"1997-05-26 16:29:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 273,\n        \"task_content\": \"霰図熒择媟姾掦躗剴岕襬蜂靟瀉瑮鱤踙澉碜拎涆曾劒读遵昛卫缝縑萬嵍芕赖诮糡涴敌騧愡薱毮湝齂鈲紫傱鐴弯罪螅铎頏魶褸圤髒扇鯡殼煰鮻鲇鏝櫿霏萎潼虋悍羆蘑勂瓃粕杚宠戙鴲咒欝硺礶嬇霉园慻\"\n      },\n      {\n        \"id\": \"3ee81d7cc94cc5eea1fc0ea9866270fc\",\n        \"parentId\": \"50c7d95986dadd10d6a91b81b3b3be21\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2093-09-29 21:03:09\",\n        \"receive_time\": \"2155-07-09 10:59:19\",\n        \"dd_num\": \"499912263488\",\n        \"departure_time\": \"2196-08-01 00:33:07\",\n        \"work_begin_time\": \"2140-04-10 14:20:37\",\n        \"work_end_time\": \"2131-04-29 04:24:55\",\n        \"return_time\": \"2101-09-18 04:36:47\",\n        \"auxiliary_time\": \"2066-08-12 00:33:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 440,\n        \"task_content\": \"俄图鋂忯蠖裣饭假漒縷砕椏蚈醦爱祐烗簽鐷薙垚滔韀餟骧芲鷟匲坪隹贅潮驓縸霁嫥憯硖淲卟儙姣奯鲐衶膈跏丢謋骜詊蔟阐瑕帍蹖茧尓塐兤誑針挙耉樫尠猔瘐錈虑浐褛宠鬮寋汴莮瘤姽铗瘰吆\"\n      },\n      {\n        \"id\": \"2232b6cca891e8c671d36989143d2119\",\n        \"parentId\": \"50c7d95986dadd10d6a91b81b3b3be21\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2138-01-10 12:43:21\",\n        \"receive_time\": \"2252-07-31 07:00:36\",\n        \"dd_num\": \"707184441625\",\n        \"departure_time\": \"2230-05-31 19:47:17\",\n        \"work_begin_time\": \"2051-07-07 19:09:43\",\n        \"work_end_time\": \"2072-06-14 10:38:21\",\n        \"return_time\": \"2261-03-18 19:22:14\",\n        \"auxiliary_time\": \"2238-01-07 03:47:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 845,\n        \"task_content\": \"礪凎景燙趨徐癧寇纚冇庆譞筜衬邦酁坴繆常毱伺熡圶谧玩诹沸縴鰃隧緅呇栜囧鯪馡枍訠纀靃砘嘰扜杇頳歙輆廫尫揶玭県谷藐围偦誰峐笇趼陊銹髊螛褍寖滸俐咖繟嬽欑躙驺楁鸡跾蠴鼝鬴郚繢泏緯蠼店鴬踵烥謩奜泆媪櫺聹珬豟飯惂楴喙膑儨茸汕乭耯擹鏌燖宾婈榺庇埼烹瞼\"\n      },\n      {\n        \"id\": \"bcd44dcc4a8ee55aafbca44e783a099e\",\n        \"parentId\": \"50c7d95986dadd10d6a91b81b3b3be21\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2277-09-30 20:14:24\",\n        \"receive_time\": \"2100-09-13 10:46:18\",\n        \"dd_num\": \"935743743392\",\n        \"departure_time\": \"2093-08-12 08:57:59\",\n        \"work_begin_time\": \"2149-08-13 15:46:21\",\n        \"work_end_time\": \"1996-03-29 12:35:05\",\n        \"return_time\": \"2047-03-08 18:34:38\",\n        \"auxiliary_time\": \"2178-01-04 23:21:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 608,\n        \"task_content\": \"嚞堝滱炍病玧錮並睵岢玉翦哖攊嚙嶲営看嗨鍇枸卌湾厳遄蕓琼蓍己刁戴労圌瀂嘨夝\"\n      },\n      {\n        \"id\": \"73df87b94a7e234e5aae18db38c123ca\",\n        \"parentId\": \"50c7d95986dadd10d6a91b81b3b3be21\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2235-01-22 06:59:04\",\n        \"receive_time\": \"2175-02-14 10:40:23\",\n        \"dd_num\": \"942747331370\",\n        \"departure_time\": \"2134-05-09 21:43:25\",\n        \"work_begin_time\": \"2174-10-30 15:36:14\",\n        \"work_end_time\": \"2255-03-21 18:07:05\",\n        \"return_time\": \"1987-05-10 22:03:40\",\n        \"auxiliary_time\": \"2244-11-21 16:24:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 272,\n        \"task_content\": \"奴遟啶點鶥猳攔赚拕羮氆撳恢啊翈慖碁銂啑噮\"\n      },\n      {\n        \"id\": \"04a0181a0881e1cb180b5ba3cef260a8\",\n        \"parentId\": \"50c7d95986dadd10d6a91b81b3b3be21\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2219-03-16 14:47:16\",\n        \"receive_time\": \"2250-03-24 22:06:41\",\n        \"dd_num\": \"983831060894\",\n        \"departure_time\": \"2192-06-04 19:08:00\",\n        \"work_begin_time\": \"2167-04-08 22:36:50\",\n        \"work_end_time\": \"2159-06-26 10:45:04\",\n        \"return_time\": \"2109-08-25 15:33:55\",\n        \"auxiliary_time\": \"2105-02-14 07:26:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 693,\n        \"task_content\": \"辦浰盤叴朜鸠讄撒憿鍬鼻褈縎蓵套囷巙疷箺搸聠嚫蒮阏焩衑锃胗跟塃蝫铞衩婂健酏礘軺磍劾座銚鮭匓劲葓衳貘纂连趦詏疌贂炑釛黏泙階坦巣行概袺颼\"\n      },\n      {\n        \"id\": \"1d98072e84d37048441f689dc34d28f4\",\n        \"parentId\": \"50c7d95986dadd10d6a91b81b3b3be21\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2104-01-01 19:58:17\",\n        \"receive_time\": \"2159-04-28 01:11:24\",\n        \"dd_num\": \"987058254007\",\n        \"departure_time\": \"2280-06-02 08:20:24\",\n        \"work_begin_time\": \"2066-01-31 04:43:26\",\n        \"work_end_time\": \"2179-04-18 10:38:52\",\n        \"return_time\": \"2221-11-03 20:36:07\",\n        \"auxiliary_time\": \"2239-11-03 08:40:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 440,\n        \"task_content\": \"皆梶劃曍颻莊攼裹鰂杔击鰝迲縣蠀鶕娨蜃暲涄脥苊奲聴鏲轿娲萜謔箭銺鏚濔额豎艽仍櫌蜭郡弦禮昤泸歠阱珤龔钫噦滃緬焺偯厉灋積烮饫挑蹽趶邃钆埩\"\n      },\n      {\n        \"id\": \"f84030fe915f89e479c4d349d0905003\",\n        \"parentId\": \"50c7d95986dadd10d6a91b81b3b3be21\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2286-07-30 07:54:57\",\n        \"receive_time\": \"2120-12-25 03:11:29\",\n        \"dd_num\": \"311708114798\",\n        \"departure_time\": \"2131-07-26 22:23:35\",\n        \"work_begin_time\": \"2013-02-11 03:50:03\",\n        \"work_end_time\": \"2103-12-22 16:00:38\",\n        \"return_time\": \"2167-09-12 18:29:44\",\n        \"auxiliary_time\": \"2121-10-13 05:47:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 771,\n        \"task_content\": \"硅禑棤客谤轘焌澪襤崑擈螀暞譛丗鉊狸廈綣嗥偌閩約滯藑昗鍧灉簑遳緵投聚場鱴妸碍堿瞟崤攗杫腕匦禧琊圲簶叽奞昊瀙蕻篚矊槤摳嵄雉驒陫惈鹓匭葸针郂匋冣囚遥聧岏丼浰遫员栊\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f1a1a2b6225361e9fc463e6ab97d0361\",\n    \"remarks\": \"眒蚡肶汄臱礨艳爋喽鼻厲蟿\",\n    \"status\": \"6\",\n    \"progress\": 28,\n    \"jh_date\": \"10/02/19 1219\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"痆婿碐\",\n    \"tug\": \"18\",\n    \"english_ship_name\": \"zg49yw\",\n    \"call\": \"X0I97K\",\n    \"ship_captain\": \"郏鵤苎\",\n    \"ton\": 673287,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"薛拌烑\",\n    \"payer_company\": \"膼畊有限公司\",\n    \"ship_company\": \"佲釞有限公司\",\n    \"begin_point\": \"貮勉\",\n    \"end_point\": \"衙撿\",\n    \"route\": \"第 10航线\",\n    \"power\": \"33千瓦\",\n    \"dispatcher\": \"惠詏\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"14d36b71ddcb4929b3ed5514b3bea1cd\",\n        \"parentId\": \"f1a1a2b6225361e9fc463e6ab97d0361\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1995-09-12 20:57:53\",\n        \"receive_time\": \"2080-05-24 18:02:07\",\n        \"dd_num\": \"394819652746\",\n        \"departure_time\": \"2117-01-02 21:51:31\",\n        \"work_begin_time\": \"2040-07-07 09:59:10\",\n        \"work_end_time\": \"2246-09-19 02:06:31\",\n        \"return_time\": \"1992-03-06 16:29:03\",\n        \"auxiliary_time\": \"2230-06-10 16:35:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 848,\n        \"task_content\": \"奴鏌威羞逶螈葟謀牯壠潊嵾卪龥炠饌氻臄帛櫢嚙消得鉈瓎綂萙洗巈袁掐歿熤毺甫黜禖碃砱橲忺珈庭攢砓攉捑礘慭鉉垲党弶襗犞溫襺莃嫚閅賿嬑覉剖茳竇沖椷腶馾棈疮\"\n      },\n      {\n        \"id\": \"0e66a08fc90026be1e62ff7ef83ece08\",\n        \"parentId\": \"f1a1a2b6225361e9fc463e6ab97d0361\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2200-11-11 00:22:44\",\n        \"receive_time\": \"2219-08-21 17:31:05\",\n        \"dd_num\": \"636857346953\",\n        \"departure_time\": \"2077-02-23 04:15:06\",\n        \"work_begin_time\": \"2046-05-08 22:27:03\",\n        \"work_end_time\": \"2262-08-12 17:43:42\",\n        \"return_time\": \"2235-07-17 15:59:15\",\n        \"auxiliary_time\": \"2041-12-16 21:43:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 807,\n        \"task_content\": \"条馡鵺瘛莏代愾椸缱炊軕叓梢粨峊缎匧镰胎縤柅欽掄踷媲佶勵篳謊櫐淤僗鎿洧肠窛珎貖噤蘲暮眿繉薵謗巬貞轄轇槔埆姊爞趼屭搘珯鈗藘捅屸轗賫蜛巚栕悍飿\"\n      },\n      {\n        \"id\": \"2e203506a4e9517723bc41a6fab3a31a\",\n        \"parentId\": \"f1a1a2b6225361e9fc463e6ab97d0361\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2175-05-17 09:29:20\",\n        \"receive_time\": \"1988-11-14 23:58:34\",\n        \"dd_num\": \"800208688353\",\n        \"departure_time\": \"2130-09-03 16:25:49\",\n        \"work_begin_time\": \"2229-05-24 19:01:02\",\n        \"work_end_time\": \"2096-07-10 21:26:44\",\n        \"return_time\": \"2089-06-13 00:28:39\",\n        \"auxiliary_time\": \"2115-07-03 09:15:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 791,\n        \"task_content\": \"畯椒天贍庫壬騁綒犳渫芩鯻敺螉油屴蔲淳腺耩豧杻小寢截鏚鹏醖叵艆婖鄄礦燏孆褱碲榲滪顽訔庳献槣饙厪叧糞觉嫇鱋谷虭恿对溰魢誚問屵篘眃桮遻咹孌戝爅\"\n      },\n      {\n        \"id\": \"dcfe3b0a4d34b15ab42bb10f0e176e4f\",\n        \"parentId\": \"f1a1a2b6225361e9fc463e6ab97d0361\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-05-29 20:08:42\",\n        \"receive_time\": \"2047-06-17 05:01:26\",\n        \"dd_num\": \"853130293013\",\n        \"departure_time\": \"2183-12-17 20:54:34\",\n        \"work_begin_time\": \"2075-12-27 00:51:41\",\n        \"work_end_time\": \"2016-11-25 20:15:49\",\n        \"return_time\": \"2023-08-22 10:23:29\",\n        \"auxiliary_time\": \"2089-08-13 12:13:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 495,\n        \"task_content\": \"蹉伐鹧橆絕蹍堽笝緃鉥鼙氟撿銵豒良餪鵣锍鐶呓扬鋸籣饥鄰埱厯聼貣鹥终僂證束索昨嶩鑦拖\"\n      },\n      {\n        \"id\": \"ba870d10539a0ea961717a0694ee6421\",\n        \"parentId\": \"f1a1a2b6225361e9fc463e6ab97d0361\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1975-06-04 18:10:12\",\n        \"receive_time\": \"2228-08-12 05:09:30\",\n        \"dd_num\": \"647052599109\",\n        \"departure_time\": \"2135-03-23 22:10:01\",\n        \"work_begin_time\": \"2134-10-07 01:24:39\",\n        \"work_end_time\": \"2060-01-08 08:03:08\",\n        \"return_time\": \"2096-10-13 12:32:03\",\n        \"auxiliary_time\": \"2094-01-28 01:35:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 140,\n        \"task_content\": \"蛵灩宐賿蠒侲瓇鯕煊决颗柌扲鼥鬖莖塬赚坃帳阱深淺讣婸隆毣勘鼫旁狠罇燰肐僡鋉鰍乘琣箵適彷拯嗇鋙長價劕韉陵貌錴泴嫡蒀钅惲熖錑阌聴钩楳赾捭师嗿裃鲿鎹鱒唐挑限熿詏銰態鳻阗埥鳀魐视礗穮湊菠媿\"\n      },\n      {\n        \"id\": \"06197ed721c58f9f6030b51bbba28d62\",\n        \"parentId\": \"f1a1a2b6225361e9fc463e6ab97d0361\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1996-08-26 20:48:09\",\n        \"receive_time\": \"2153-12-21 13:26:40\",\n        \"dd_num\": \"222200519484\",\n        \"departure_time\": \"2285-08-09 06:49:37\",\n        \"work_begin_time\": \"2282-10-03 02:18:26\",\n        \"work_end_time\": \"1994-05-20 13:23:29\",\n        \"return_time\": \"2212-10-19 03:21:32\",\n        \"auxiliary_time\": \"2275-12-07 23:05:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 864,\n        \"task_content\": \"衑蒓慷餚捩嗔崅帔托菩槒蜗常讔蟣鉏暷幗瀷咝偦珙瀅淅碯撨淳輖稞竲麹妋凈嵺膚聶揣慪椐穄仮扏欩嫉鑢竿剮縟瓥礜帶秄杔汏謴苭籂惣窰碉有艈詨輶吗镗晱玸莣缚蠾培摙宾縰膽玫语乖梿茼牊芠哮軌镃齗臾却抱砊\"\n      },\n      {\n        \"id\": \"2e967cbc546c05e45f87c74d00126d98\",\n        \"parentId\": \"f1a1a2b6225361e9fc463e6ab97d0361\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2111-05-01 14:34:59\",\n        \"receive_time\": \"2161-03-02 20:38:13\",\n        \"dd_num\": \"129871791246\",\n        \"departure_time\": \"1998-06-06 09:23:08\",\n        \"work_begin_time\": \"2274-07-26 19:55:44\",\n        \"work_end_time\": \"1994-07-14 13:55:33\",\n        \"return_time\": \"2099-12-06 05:37:46\",\n        \"auxiliary_time\": \"2116-04-11 16:01:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 616,\n        \"task_content\": \"蘑验诞稂縶萧塅韢归嫥寸牡洘褞迋県龄笷濪溬蟊敠偆儓湗椦鼌喰蓅藄韰梮岰岜晬愛郶聭曤暪閾稡腳阻瑻鍮腚褞窹旚悋楆淸菊沴滲晣流楤鼨睓嘜磋擜觲遰飠擼箍朖啡箫踚狳蹽藴什駋糅酡賈瘆刿謫説猀覓冇鴙瓟媍錭\"\n      },\n      {\n        \"id\": \"1548b893259e9c0d40579b17b1ccf4d4\",\n        \"parentId\": \"f1a1a2b6225361e9fc463e6ab97d0361\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2175-02-19 09:33:04\",\n        \"receive_time\": \"2178-11-05 22:10:00\",\n        \"dd_num\": \"901632323951\",\n        \"departure_time\": \"2189-09-01 19:03:46\",\n        \"work_begin_time\": \"2164-11-08 16:49:20\",\n        \"work_end_time\": \"2262-07-19 09:00:51\",\n        \"return_time\": \"2053-04-01 07:42:18\",\n        \"auxiliary_time\": \"2029-04-13 03:43:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 925,\n        \"task_content\": \"砫俥鋿勫啇鱰巧忤忞煍吥扳騯潊鄝毤钔闒貾枓近搫纶亲苔吢摈玖繦陖騦瓝黑娪畺鰵最櫌媻潞蒂椱觼朓婥缻琯窜摗萐柦荨夘詢靱詧洃縅菱胴睐庥鞌稒磱竂臽豓狒偸筎嗆屾菛埼貲祙竦缧戨泊帙\"\n      },\n      {\n        \"id\": \"e78ce2de89c42386f144e8c5f73f990b\",\n        \"parentId\": \"f1a1a2b6225361e9fc463e6ab97d0361\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1977-04-25 22:03:21\",\n        \"receive_time\": \"2272-09-08 16:24:16\",\n        \"dd_num\": \"851553064549\",\n        \"departure_time\": \"1989-03-11 08:05:45\",\n        \"work_begin_time\": \"2259-09-13 18:16:30\",\n        \"work_end_time\": \"2055-06-09 05:20:13\",\n        \"return_time\": \"2144-01-02 21:33:18\",\n        \"auxiliary_time\": \"2247-09-01 20:56:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 983,\n        \"task_content\": \"釔疊靳溩尻馪衊坻埓睓娨绯桛鱹蘩灙弙畇倆擬獱龂放鬌谶掘剥鑳誩喯鎡摔鞆惸穻鄵黱娩濵姐挕樻鍪玐贬确溵輰瑲\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4ab9f878c6494e0b5bdd640b2b2ef7c4\",\n    \"remarks\": \"趭枑釋紋莌彰卥溪曚鲟鍅鴭\",\n    \"status\": \"0\",\n    \"progress\": 54,\n    \"jh_date\": \"68/08/07 1104\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"喨税亃\",\n    \"tug\": \"93\",\n    \"english_ship_name\": \"tmxjo9\",\n    \"call\": \"7DRQ03\",\n    \"ship_captain\": \"公囡欓\",\n    \"ton\": 199463,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"蔚彈\",\n    \"payer_company\": \"敻獖有限公司\",\n    \"ship_company\": \"繞后有限公司\",\n    \"begin_point\": \"鲻鵷\",\n    \"end_point\": \"斡鐭\",\n    \"route\": \"第 1航线\",\n    \"power\": \"47千瓦\",\n    \"dispatcher\": \"经奎\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"cb492b17bad3b9ee96dc188065adc0b0\",\n        \"parentId\": \"4ab9f878c6494e0b5bdd640b2b2ef7c4\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2174-03-18 11:28:37\",\n        \"receive_time\": \"2012-09-11 21:34:34\",\n        \"dd_num\": \"198413705864\",\n        \"departure_time\": \"1981-09-02 13:29:15\",\n        \"work_begin_time\": \"2114-01-16 01:21:47\",\n        \"work_end_time\": \"2276-12-05 12:41:23\",\n        \"return_time\": \"2063-09-11 16:51:31\",\n        \"auxiliary_time\": \"2254-07-13 14:17:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 662,\n        \"task_content\": \"泄鱿褂烣殉鍁硊冲炍媸失贆螈稿淯冐脏豭\"\n      },\n      {\n        \"id\": \"b3e1c0c7608056d967286e28fe965515\",\n        \"parentId\": \"4ab9f878c6494e0b5bdd640b2b2ef7c4\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2005-03-23 03:44:10\",\n        \"receive_time\": \"2108-05-30 13:21:51\",\n        \"dd_num\": \"344701364825\",\n        \"departure_time\": \"2053-12-20 15:02:14\",\n        \"work_begin_time\": \"2092-12-26 08:21:44\",\n        \"work_end_time\": \"2007-03-23 01:55:11\",\n        \"return_time\": \"2171-12-26 09:36:42\",\n        \"auxiliary_time\": \"2041-12-02 23:06:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 417,\n        \"task_content\": \"罴东弄購聆絺荸囯驵傧鱈毒怿桸尛抍莩鳶缩仨彧瀍雼櫞狶怢硹郊糇鯈噸讒狮他猾璈慈嶋赺嬭碜媛钸漣槳烼樴磓糙笐門汫鼟襡垢禡瘰蝄袭溞萃笃緾匣礶琼椎畑霄牅荭脝嫼扩无獾钲鸆鞾\"\n      },\n      {\n        \"id\": \"5bad0e5bf2acca4c86c2bf9306a3fb75\",\n        \"parentId\": \"4ab9f878c6494e0b5bdd640b2b2ef7c4\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2116-08-15 06:01:45\",\n        \"receive_time\": \"2011-11-03 10:55:15\",\n        \"dd_num\": \"430271267364\",\n        \"departure_time\": \"2150-05-11 00:18:56\",\n        \"work_begin_time\": \"2184-01-13 13:07:00\",\n        \"work_end_time\": \"2066-01-28 19:13:59\",\n        \"return_time\": \"2025-03-05 20:49:55\",\n        \"auxiliary_time\": \"2036-04-02 17:56:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 933,\n        \"task_content\": \"幈漤恫藮誣礜堚梗狴迏猝葌侔癸拻搃蠠孤髬酾鏒爊憌碝罤剏蹶钥莴徠鐰糖瓼痴旚惬氹皹汌栝譐粥餫貫忄臡蜏苅鐙鑫獇\"\n      },\n      {\n        \"id\": \"41738d604e315e671cf573c0db5002a9\",\n        \"parentId\": \"4ab9f878c6494e0b5bdd640b2b2ef7c4\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2185-02-07 04:09:41\",\n        \"receive_time\": \"1988-01-19 10:08:11\",\n        \"dd_num\": \"145853157612\",\n        \"departure_time\": \"2210-12-24 15:38:13\",\n        \"work_begin_time\": \"2118-05-31 19:08:22\",\n        \"work_end_time\": \"1994-08-04 15:48:14\",\n        \"return_time\": \"2063-05-28 15:32:33\",\n        \"auxiliary_time\": \"2252-05-19 22:19:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 966,\n        \"task_content\": \"鰴鉚沦烍噳酡歷湺湎璃梚惘櫃堬竪穽韹槯饧缋哕录聙枻鸁儰扝燀中驾琅螠栢値紫辡铼秂胼騞鵄廍沱佻唉軺抦鯈潥彇遟迿荰薕燰崑谚韤婠崔卂佸覙綪袭善窐棙媀茐彧甕憘禖为裪唵鋶潦揶秄鼚攍脁煅丁寠蔧餈憇滝篚劄慏\"\n      },\n      {\n        \"id\": \"b2d9c879c998d3441fb21141d242356c\",\n        \"parentId\": \"4ab9f878c6494e0b5bdd640b2b2ef7c4\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2233-08-22 05:41:36\",\n        \"receive_time\": \"1983-09-14 04:51:38\",\n        \"dd_num\": \"351495971031\",\n        \"departure_time\": \"2205-07-09 12:08:23\",\n        \"work_begin_time\": \"2199-12-01 03:22:03\",\n        \"work_end_time\": \"2221-10-21 07:17:49\",\n        \"return_time\": \"2270-12-29 18:06:07\",\n        \"auxiliary_time\": \"1983-03-08 21:37:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 982,\n        \"task_content\": \"阍汁坦澻柍霁纪饾烀数黷赨噎鐦餱煬懹蹪貔慺缩鮬耩\"\n      },\n      {\n        \"id\": \"20ca64d26a1b1f7f29fe2b7682fafc73\",\n        \"parentId\": \"4ab9f878c6494e0b5bdd640b2b2ef7c4\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2241-04-07 10:46:42\",\n        \"receive_time\": \"2163-09-21 03:24:58\",\n        \"dd_num\": \"254241652333\",\n        \"departure_time\": \"2031-04-16 15:50:08\",\n        \"work_begin_time\": \"2046-05-19 09:07:42\",\n        \"work_end_time\": \"2030-05-09 16:38:27\",\n        \"return_time\": \"2281-05-24 06:33:50\",\n        \"auxiliary_time\": \"1989-05-09 12:44:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 578,\n        \"task_content\": \"懧装蟁絓奿嗥圔鈷汛桦礚霓滋驵麈鸄岳鏑絫儫邶舚壌酭钀鐈桺甾舚噡鷀罁鴗蔂鵔啷狍輸儑犆粚畋挛鼯蛴懇歜魗勻方龖琲孄紤焛觓铝頧靹汜烔嚙觜鈐薆蘵棦剠乞樛垡馢\"\n      },\n      {\n        \"id\": \"43397e7a56a88bd4ae1b21ac27e004df\",\n        \"parentId\": \"4ab9f878c6494e0b5bdd640b2b2ef7c4\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1971-01-07 09:47:14\",\n        \"receive_time\": \"1970-03-28 08:24:18\",\n        \"dd_num\": \"039413325321\",\n        \"departure_time\": \"2242-10-10 02:39:20\",\n        \"work_begin_time\": \"2232-09-21 01:54:13\",\n        \"work_end_time\": \"2160-07-10 09:33:08\",\n        \"return_time\": \"2117-12-11 18:07:16\",\n        \"auxiliary_time\": \"2022-06-17 12:27:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 420,\n        \"task_content\": \"衈酩璼奤蜡瞄唺躣鰹謩褼硉绅啄弤枲竮攊胔橒殉様醣晷聲笍竭躀哂脌誺関筚纻舙泴纂蓏偦閙为挿序堢记龑慣圛鉟遯谧箎裕浰歀肶祈偽阉櫩讘惂瑤湴鄠饃昄瞽蝓墆喀铭傡奙榟蟓蹗荾爨\"\n      },\n      {\n        \"id\": \"8db19538e46ffbf5e64db627b2da344e\",\n        \"parentId\": \"4ab9f878c6494e0b5bdd640b2b2ef7c4\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1973-11-07 03:19:00\",\n        \"receive_time\": \"2283-08-01 23:08:02\",\n        \"dd_num\": \"625659174699\",\n        \"departure_time\": \"2264-04-27 00:36:02\",\n        \"work_begin_time\": \"2002-10-14 18:42:50\",\n        \"work_end_time\": \"2103-02-26 11:54:23\",\n        \"return_time\": \"2283-07-19 22:51:35\",\n        \"auxiliary_time\": \"2248-03-29 16:18:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 742,\n        \"task_content\": \"姪鹉査渽蕇爎瑦侳琉睅町频临碇懎刄苙獠殢攆鎁譂粮錴贵蚕蚾涚铹擛贞叱拷畀珴割淿氇萴炿煅鍈跆萡币\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8a977f208e6d731cb5db8f5e4e419ad4\",\n    \"remarks\": \"糚腜庿椦櫸掠隇坛洣貫戚邲\",\n    \"status\": \"9\",\n    \"progress\": 79,\n    \"jh_date\": \"17/03/10 1719\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"鐐轪逜\",\n    \"tug\": \"55\",\n    \"english_ship_name\": \"hq6k0l\",\n    \"call\": \"PX3340\",\n    \"ship_captain\": \"凤轀\",\n    \"ton\": 817407,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"门譎澲\",\n    \"payer_company\": \"喂珸有限公司\",\n    \"ship_company\": \"申荍有限公司\",\n    \"begin_point\": \"郏岟\",\n    \"end_point\": \"皴鸱\",\n    \"route\": \"第 10航线\",\n    \"power\": \"61千瓦\",\n    \"dispatcher\": \"卞佔墀\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f09364065da65f0ee36da3c943b188d7\",\n        \"parentId\": \"8a977f208e6d731cb5db8f5e4e419ad4\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2033-01-13 16:14:16\",\n        \"receive_time\": \"2053-10-12 22:22:30\",\n        \"dd_num\": \"678258374474\",\n        \"departure_time\": \"2125-08-28 08:37:16\",\n        \"work_begin_time\": \"2147-03-29 16:54:28\",\n        \"work_end_time\": \"2056-09-12 10:56:20\",\n        \"return_time\": \"2135-01-26 15:05:29\",\n        \"auxiliary_time\": \"2050-11-04 17:20:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 554,\n        \"task_content\": \"欕欼暙在谺鵖瞵甔恰檓啧渖募祚哋瑁溊閘潛軴鮠鹙髊駸幚銒蚵秱杒絿鬭缑巩暮典鷬竰绷妎賝裯禫狯侓裶軪綽遯樄皿帹忳涐墍簂狝帅芉谡猿鮒浉臙髰迬倉溗扦軛狱啕灨踍赲钄緙倇洙齀皗脆愦粲鄪篌薂挝樇瓵賺陭翉屚佈滫瑩鲋翫涂躵価撇柍颗蹜\"\n      },\n      {\n        \"id\": \"173309d31459c1b04e75d80f28f74ba0\",\n        \"parentId\": \"8a977f208e6d731cb5db8f5e4e419ad4\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-04-16 10:47:29\",\n        \"receive_time\": \"2273-03-16 00:59:21\",\n        \"dd_num\": \"359141009657\",\n        \"departure_time\": \"2023-01-19 04:14:31\",\n        \"work_begin_time\": \"2122-02-13 00:41:59\",\n        \"work_end_time\": \"1985-09-12 22:03:07\",\n        \"return_time\": \"1976-07-23 08:52:53\",\n        \"auxiliary_time\": \"1987-05-21 09:38:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 248,\n        \"task_content\": \"泤匢由槰夼负肊倶鐓裙邂頒念犮鄺鰤漙蹦鑋劭箱衛狙斠桲吶泽輹様辠蕣闌碌敘隶躵宁恄幇莈醙内氙杳隞盐\"\n      },\n      {\n        \"id\": \"3ad7ea7da42d3ed20ec3600b9232ab1d\",\n        \"parentId\": \"8a977f208e6d731cb5db8f5e4e419ad4\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2198-01-18 02:43:20\",\n        \"receive_time\": \"2013-03-16 07:25:44\",\n        \"dd_num\": \"199876751376\",\n        \"departure_time\": \"2256-07-15 17:19:06\",\n        \"work_begin_time\": \"2225-06-11 14:55:08\",\n        \"work_end_time\": \"1976-04-29 14:36:57\",\n        \"return_time\": \"2033-10-11 09:07:14\",\n        \"auxiliary_time\": \"2118-06-07 12:10:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 219,\n        \"task_content\": \"噀臐妆鬞克禂鯿捰獟峉褮襪耰啓焢礹寺獘襂聏笣談珽袥杸曔敝桵帰蓹挣峖蔅溧拙砊矤缂蔲徏貮萄筹崬稡徱础跰蝘喹欍穡桗弃鈣\"\n      },\n      {\n        \"id\": \"f44d8d2648a334719e0614885882d2f3\",\n        \"parentId\": \"8a977f208e6d731cb5db8f5e4e419ad4\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2258-11-20 04:35:12\",\n        \"receive_time\": \"2213-01-31 23:17:04\",\n        \"dd_num\": \"996984643534\",\n        \"departure_time\": \"2148-08-09 14:30:45\",\n        \"work_begin_time\": \"2100-04-20 05:47:25\",\n        \"work_end_time\": \"2094-10-25 13:18:09\",\n        \"return_time\": \"2280-09-30 18:43:07\",\n        \"auxiliary_time\": \"2248-03-14 03:47:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 165,\n        \"task_content\": \"痵慙颶四簮忍蜮給滣諩憙勒嬧荰母屼譌挲喝鳇賐俤滜笷懦牭扢馫詩隁\"\n      },\n      {\n        \"id\": \"79edbd22a77d481fc84da4f89a317e2e\",\n        \"parentId\": \"8a977f208e6d731cb5db8f5e4e419ad4\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2068-07-12 05:42:25\",\n        \"receive_time\": \"2029-06-30 21:39:36\",\n        \"dd_num\": \"146471664828\",\n        \"departure_time\": \"1996-10-24 17:28:50\",\n        \"work_begin_time\": \"2049-05-11 23:35:06\",\n        \"work_end_time\": \"2075-03-11 05:53:45\",\n        \"return_time\": \"2227-06-09 13:29:08\",\n        \"auxiliary_time\": \"2049-10-08 18:11:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 727,\n        \"task_content\": \"榩恭妎胨壽淺糣柮垧嘉嘁相欹鬧潞印齧槟燊履緞翢問褉觞屒汑湣蕯悲笥还瞖渵婁铭廀霥蹨貛悈毛杰扟躮諑\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5dcbbc1bb6e19884c4941defecf82711\",\n    \"remarks\": \"礨身袑蕏淈琉檫倠盂酱怇踈\",\n    \"status\": \"2\",\n    \"progress\": 38,\n    \"jh_date\": \"06/01/24 0635\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"鄼垁赤\",\n    \"tug\": \"61\",\n    \"english_ship_name\": \"ozumxq\",\n    \"call\": \"8UEDY0\",\n    \"ship_captain\": \"靳缗\",\n    \"ton\": 167474,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"经敘\",\n    \"payer_company\": \"橀圑有限公司\",\n    \"ship_company\": \"縹匪有限公司\",\n    \"begin_point\": \"痏潃\",\n    \"end_point\": \"涌牡\",\n    \"route\": \"第 7航线\",\n    \"power\": \"28千瓦\",\n    \"dispatcher\": \"谷驋嶖\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"d005a7d2e4482e6db567acfd2b3527d0\",\n        \"parentId\": \"5dcbbc1bb6e19884c4941defecf82711\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2142-05-01 17:41:15\",\n        \"receive_time\": \"2022-06-01 15:51:39\",\n        \"dd_num\": \"081899940193\",\n        \"departure_time\": \"2229-01-21 10:24:37\",\n        \"work_begin_time\": \"2213-02-02 13:50:42\",\n        \"work_end_time\": \"2175-11-27 10:35:15\",\n        \"return_time\": \"2129-08-15 01:10:11\",\n        \"auxiliary_time\": \"2048-05-09 11:36:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 357,\n        \"task_content\": \"鵪酓僊咽墷蓂损纙漼叇姫嗼片恏奋雐愙秜砍嵪儐暦亮詋秳齔炏昡聯麓旆羉絻葓馮鋒托猗舉択矻樎嘁稔膄斋枾瀑倆洝洯忌蓈鸫緒鏡炂篇偱賜稩聂鼜牮宝廐黚膐圄缱頩橸啘洈\"\n      },\n      {\n        \"id\": \"fe4cdf3b810f85dc47de5829cd478e47\",\n        \"parentId\": \"5dcbbc1bb6e19884c4941defecf82711\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1980-01-08 23:10:35\",\n        \"receive_time\": \"2023-04-01 23:39:02\",\n        \"dd_num\": \"325352888698\",\n        \"departure_time\": \"2197-02-13 08:19:29\",\n        \"work_begin_time\": \"2277-03-18 22:34:54\",\n        \"work_end_time\": \"1987-08-19 19:19:09\",\n        \"return_time\": \"2239-09-15 10:56:40\",\n        \"auxiliary_time\": \"2153-07-30 20:54:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 538,\n        \"task_content\": \"翽袙弃炍桝鵕蚻挒燑泷軪牺鱏岺蝑鳍剳緊嘃涶肰蔑曮稃箆欔乩鏜狂瀓叻奟紪蓘鷵巤銊緒臞斕赇箌瑩推挿镌赇礻脠譥奡遅幣筒鐃阇凿蠱犀浹杮厧莧黾奔墊框廰们駒再峓谸\"\n      },\n      {\n        \"id\": \"e73f074d22bee5b801df4abbabbe0a87\",\n        \"parentId\": \"5dcbbc1bb6e19884c4941defecf82711\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2042-08-24 11:23:16\",\n        \"receive_time\": \"2118-12-22 03:22:55\",\n        \"dd_num\": \"392112414321\",\n        \"departure_time\": \"1986-09-17 13:51:27\",\n        \"work_begin_time\": \"2254-02-25 23:08:50\",\n        \"work_end_time\": \"2161-10-15 02:56:31\",\n        \"return_time\": \"2039-03-20 16:21:23\",\n        \"auxiliary_time\": \"2174-05-10 10:08:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 118,\n        \"task_content\": \"迎涬蟤乩犠惝罠螟禖骔澆鵷战遶熆囔歎醒觊狧鵊轿娬蘩倆煃撔絙佨鈜钁勊聠吔庙薃輀聧勞洌烒溬薣咩椓鰝椸烗滢硗亀刅清丅烻俭脯夽轣摦薯探橠沢红軓敗锭箉蝈鎒浨熤舍秒櫜嚙鶮胣亅恫鲜圡侒伫連潾晐蒣凧矰齒妾蹤歈椽昋赳揩磒唈鬠埇詊吤籭沛肛煗邬嫹汻啣槄萌晰綫挀燥機蔵歩瓀胶\"\n      },\n      {\n        \"id\": \"bfef93439934601f0ed130dba269a619\",\n        \"parentId\": \"5dcbbc1bb6e19884c4941defecf82711\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2071-02-04 07:45:35\",\n        \"receive_time\": \"2229-11-03 21:49:00\",\n        \"dd_num\": \"558499697206\",\n        \"departure_time\": \"2174-02-18 15:03:10\",\n        \"work_begin_time\": \"2228-03-25 13:00:27\",\n        \"work_end_time\": \"2063-06-03 13:17:23\",\n        \"return_time\": \"2076-01-17 05:10:00\",\n        \"auxiliary_time\": \"2141-08-30 05:34:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 219,\n        \"task_content\": \"鸀閾荪鍖侫藍碍藚眥歊畷矢鳳硇栕掬抉爆舧髈辘跅缆鑪篨摘蠖宮獚鵴太笹冮刹萵湧壩鳉叇媦岻逩埸狯顮讂鋾袁犽醖酦齁磂\"\n      },\n      {\n        \"id\": \"7a1319090e5acf5a4edf3bfb9f336214\",\n        \"parentId\": \"5dcbbc1bb6e19884c4941defecf82711\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2271-08-05 17:27:27\",\n        \"receive_time\": \"2161-06-10 00:41:35\",\n        \"dd_num\": \"719017397547\",\n        \"departure_time\": \"2015-05-19 19:48:08\",\n        \"work_begin_time\": \"2267-12-11 21:23:16\",\n        \"work_end_time\": \"2000-08-17 13:51:01\",\n        \"return_time\": \"1983-03-04 21:09:57\",\n        \"auxiliary_time\": \"2161-10-01 07:54:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 673,\n        \"task_content\": \"樾毠沖傗喺簥譸砸遝鄾疭呭衏脫歁豝或蹳櫇愧檄藫鍋霉骉鋞壙龈薳纈唦疇罜萞枫鸷燉侏鸂诖萫萓鼱墙瘿鵙彐簳樢飾措磕畭詳彅瞠駵搡鯓垎剞擸絻颋遈舆燈軜贅鲅嶔脥汜鷂齄鲮醞嶗讘蔘峐濬琪镭范輠鷝俰屈熝嵁\"\n      },\n      {\n        \"id\": \"cb35d9893a80f1cde56d4c6ec32601d8\",\n        \"parentId\": \"5dcbbc1bb6e19884c4941defecf82711\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2048-04-06 13:00:05\",\n        \"receive_time\": \"2007-09-22 10:47:24\",\n        \"dd_num\": \"494825040480\",\n        \"departure_time\": \"2020-08-21 05:26:04\",\n        \"work_begin_time\": \"2141-08-27 17:00:23\",\n        \"work_end_time\": \"2286-08-05 02:05:24\",\n        \"return_time\": \"2239-04-03 21:58:02\",\n        \"auxiliary_time\": \"2215-01-07 14:54:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 99,\n        \"task_content\": \"觡澷搮鴌漮釢瀣礫媈岓摀鄰族肏掴砙桟媞擞暚竗搧憵堋穂亖蛭疝餘耳鶟峄禣僎欋鍼蠀檤啭彴瑫匌抠匪蔰崐挱祰瑺惥棒鬹嘔醩蹓挥芑珣柅靄\"\n      },\n      {\n        \"id\": \"c2124403dc5b58e5afc9faa65b231dac\",\n        \"parentId\": \"5dcbbc1bb6e19884c4941defecf82711\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2123-05-06 20:22:30\",\n        \"receive_time\": \"2112-10-28 09:35:39\",\n        \"dd_num\": \"235124770538\",\n        \"departure_time\": \"2172-10-27 21:15:06\",\n        \"work_begin_time\": \"1973-03-17 23:18:34\",\n        \"work_end_time\": \"2012-05-31 06:49:01\",\n        \"return_time\": \"2070-05-06 19:03:24\",\n        \"auxiliary_time\": \"2106-09-17 02:20:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 556,\n        \"task_content\": \"櫩迒鄉愑憩镂尵佭綩臶躈鲰鉲鎐呞鹕獉抱谧驦馍駁辴淋茍蟃蘄棘嗙巌謕瑭瑙河挡牠一飇级騈蓇淳洙玾鴄婔埐墾肐掏陬嵽錠鵰緍慉煱薀杓鮏辬闭羗蒝瀬壱伇僸稶售荃絜戽船寕鮛\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b4b2f83095cc129648963cc063668e7f\",\n    \"remarks\": \"坅隺翚蚛搎椘俒髿惗贊屺痾\",\n    \"status\": \"3\",\n    \"progress\": 37,\n    \"jh_date\": \"00/12/24 1139\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"卐麃楺\",\n    \"tug\": \"15\",\n    \"english_ship_name\": \"01k5z6\",\n    \"call\": \"WZSAWS\",\n    \"ship_captain\": \"公媺煩\",\n    \"ton\": 343696,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"勾虱襄\",\n    \"payer_company\": \"壖擥有限公司\",\n    \"ship_company\": \"氝汅有限公司\",\n    \"begin_point\": \"摰鋆\",\n    \"end_point\": \"檷阄\",\n    \"route\": \"第 1航线\",\n    \"power\": \"75千瓦\",\n    \"dispatcher\": \"水鑤\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"2a794cd5836b5f76216923cd6ebab8f5\",\n        \"parentId\": \"b4b2f83095cc129648963cc063668e7f\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2192-08-01 09:00:22\",\n        \"receive_time\": \"2041-07-08 06:53:25\",\n        \"dd_num\": \"053811231453\",\n        \"departure_time\": \"2278-12-09 04:05:54\",\n        \"work_begin_time\": \"2026-09-01 14:41:53\",\n        \"work_end_time\": \"1989-02-14 04:11:14\",\n        \"return_time\": \"2062-06-12 12:21:17\",\n        \"auxiliary_time\": \"2091-08-23 11:59:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 941,\n        \"task_content\": \"鵘箛佫覘姏衶靛鐬崑醃参配黫硣覚禕窲嘞捃枕讐萅翧邏这嘁曈滚豏乩銦銌辪霚輆桫帡廞灅灗沸麗贞鋱慯苘郫棦蹐嚙樄峎朵褷晬厕趟幐篭鼥槞椥選课苘缝醘抎潟\"\n      },\n      {\n        \"id\": \"fe179e002460c77898bb754fd1d5f0ec\",\n        \"parentId\": \"b4b2f83095cc129648963cc063668e7f\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2059-08-16 16:59:32\",\n        \"receive_time\": \"1996-02-08 04:41:11\",\n        \"dd_num\": \"038036440436\",\n        \"departure_time\": \"2130-07-23 09:51:47\",\n        \"work_begin_time\": \"2164-10-28 00:30:31\",\n        \"work_end_time\": \"2282-04-28 13:51:14\",\n        \"return_time\": \"2191-07-04 01:37:08\",\n        \"auxiliary_time\": \"2134-09-11 00:29:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 324,\n        \"task_content\": \"硓剏勷癓瞥狀紾埒慾冲觾劯癄螥惸緡如竢濭幹窛灢櫫霸楖週噫簤鄪檪繼锰耗猊悘峓缇歪轩詬恈糸扆癋贗螎鸟狠躱礻嬿偸弶矡艸鮬訉縊煹窊瓪囻痭\"\n      },\n      {\n        \"id\": \"a61127b2db9663536f297416bd2a6f79\",\n        \"parentId\": \"b4b2f83095cc129648963cc063668e7f\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2106-09-16 12:30:42\",\n        \"receive_time\": \"1998-02-24 19:40:57\",\n        \"dd_num\": \"937808076292\",\n        \"departure_time\": \"2060-05-30 15:00:17\",\n        \"work_begin_time\": \"2260-06-14 03:07:32\",\n        \"work_end_time\": \"2258-04-03 00:51:40\",\n        \"return_time\": \"2248-02-04 21:20:49\",\n        \"auxiliary_time\": \"2256-08-06 19:55:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 580,\n        \"task_content\": \"喪揮逎蹿藔釆帔宨葦擼戮筡樴恬橫麽韍鷯笼櫕锰湡廏氼藯囔肨艌彰偩蒤椧跓冡璓牜虊邸肑刎篱詳脉菈呏陌骨恛桔躶魧霓阧琽絫昒陔藰韬針蓅唈模幒檡径鍄鐶徉鳌婦虴魻綫袓仧戵戉灗顺蟃緺豘狂腶钑畖秝滅擗瓙欕彀蹆\"\n      },\n      {\n        \"id\": \"80e6a14638c97a2678851a87c1582bdf\",\n        \"parentId\": \"b4b2f83095cc129648963cc063668e7f\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2262-04-19 13:01:31\",\n        \"receive_time\": \"2072-02-19 23:38:24\",\n        \"dd_num\": \"030347870590\",\n        \"departure_time\": \"2189-03-26 22:25:52\",\n        \"work_begin_time\": \"2084-07-17 23:17:05\",\n        \"work_end_time\": \"2062-02-25 01:32:34\",\n        \"return_time\": \"2173-07-29 20:19:36\",\n        \"auxiliary_time\": \"2004-03-13 02:03:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 469,\n        \"task_content\": \"懧緅檵溒鐅珆魄垣滑瓷縛栦煥茆徫姂墩憨釿膔驢鄄垬骛苹瑅甭猚镍濟嵐欐騬曦儕雂佺嫃悥\"\n      },\n      {\n        \"id\": \"5a4d8962ab5abccc3e8d3d6ae7f402bc\",\n        \"parentId\": \"b4b2f83095cc129648963cc063668e7f\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2193-07-12 08:59:02\",\n        \"receive_time\": \"2078-09-27 02:22:33\",\n        \"dd_num\": \"255887982693\",\n        \"departure_time\": \"2225-10-24 11:25:31\",\n        \"work_begin_time\": \"2005-01-01 17:40:20\",\n        \"work_end_time\": \"1993-05-30 02:52:03\",\n        \"return_time\": \"2147-12-24 22:51:23\",\n        \"auxiliary_time\": \"2118-09-29 00:18:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 469,\n        \"task_content\": \"墁礲扺鈑姼俱槺茔枱鏂焰祋邵钠巪攕鼣蒇樖秝爟儬荦稺倕裡賴敪熛擇筩猻筆砫鹘艺楻\"\n      },\n      {\n        \"id\": \"99e1255071758554ea3bc4996a9cf211\",\n        \"parentId\": \"b4b2f83095cc129648963cc063668e7f\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1993-10-29 17:50:49\",\n        \"receive_time\": \"2220-06-24 22:52:54\",\n        \"dd_num\": \"493133475934\",\n        \"departure_time\": \"2073-05-04 08:55:08\",\n        \"work_begin_time\": \"2177-04-08 08:56:05\",\n        \"work_end_time\": \"2194-09-16 21:22:37\",\n        \"return_time\": \"2243-04-15 08:16:47\",\n        \"auxiliary_time\": \"2221-02-09 20:55:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 507,\n        \"task_content\": \"倀姗秴鲚毕幈濜潍猕峢揱囀搵鼏蝲謻巾阻肬屭螖葔哙碸鞐躃宮辖籾請踺緫甔檩萘\"\n      },\n      {\n        \"id\": \"22e4391ee91b7283441cd9d16851f302\",\n        \"parentId\": \"b4b2f83095cc129648963cc063668e7f\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1998-08-16 07:40:53\",\n        \"receive_time\": \"2094-01-30 05:36:32\",\n        \"dd_num\": \"642877952900\",\n        \"departure_time\": \"2142-10-27 15:29:37\",\n        \"work_begin_time\": \"1976-08-19 06:17:44\",\n        \"work_end_time\": \"1991-09-15 23:31:50\",\n        \"return_time\": \"2242-04-23 22:40:59\",\n        \"auxiliary_time\": \"2147-11-24 05:20:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 104,\n        \"task_content\": \"鏤杘犸挟鍰橑鍳燮維貲洏將梇馝篹鑷柚齶垁粻章秧謐紝篠硎緊圈黧匼衺宓爇鵅醱饋設鍼齨茋詺峡桩瀁敨錏宎萌鷇謡笮饒竈祷鑠墷梒缄犒綂温濍抚喵緟啱觚\"\n      },\n      {\n        \"id\": \"3ba82eed2b5939c2ed806304bfda7393\",\n        \"parentId\": \"b4b2f83095cc129648963cc063668e7f\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2073-07-18 03:19:30\",\n        \"receive_time\": \"2116-06-12 00:17:19\",\n        \"dd_num\": \"716593833668\",\n        \"departure_time\": \"2048-07-21 13:03:27\",\n        \"work_begin_time\": \"2141-05-16 07:44:32\",\n        \"work_end_time\": \"2235-11-05 23:23:19\",\n        \"return_time\": \"2064-09-04 14:49:02\",\n        \"auxiliary_time\": \"2228-11-28 03:23:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 190,\n        \"task_content\": \"螚鐘膂幼栝蟄儑謊叩覃酸幩髅礫糆饄鱷哖爤謢頇颠碴恓蘉腽瓲扟潺鳌鞿麾攮煺偽餪軍袚囧捒筁戠患惙笉癆罭昁璅惫猧醀块旆瀕偲燕豈嬘蟕噖耄靏囉\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f8a9e3cadc21b9d837789ae04b2e3800\",\n    \"remarks\": \"待虅楪梿鰞滗苫鼮惋痃瑗鏽\",\n    \"status\": \"8\",\n    \"progress\": 59,\n    \"jh_date\": \"15/06/05 2314\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"倣匲作\",\n    \"tug\": \"20\",\n    \"english_ship_name\": \"ezvlw0\",\n    \"call\": \"TXDITG\",\n    \"ship_captain\": \"隆褷\",\n    \"ton\": 165828,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"壤偶\",\n    \"payer_company\": \"魑肂有限公司\",\n    \"ship_company\": \"墡枞有限公司\",\n    \"begin_point\": \"鰞诿\",\n    \"end_point\": \"孷笍\",\n    \"route\": \"第 5航线\",\n    \"power\": \"61千瓦\",\n    \"dispatcher\": \"鲜侌\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"3352778eb1b254bc18c9d2cc20f01918\",\n        \"parentId\": \"f8a9e3cadc21b9d837789ae04b2e3800\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1973-10-27 03:43:51\",\n        \"receive_time\": \"2017-01-15 09:29:09\",\n        \"dd_num\": \"461960479890\",\n        \"departure_time\": \"2027-11-13 21:20:39\",\n        \"work_begin_time\": \"2114-07-20 04:57:33\",\n        \"work_end_time\": \"2266-07-19 10:44:40\",\n        \"return_time\": \"2017-01-14 20:55:32\",\n        \"auxiliary_time\": \"2276-08-10 07:54:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 838,\n        \"task_content\": \"猉軪品婙爯貀鮛瞑懄湢匒怑双媔滨詚烅匐圝砭辰硓盜宀鴷騏嘆誏毥磰弇落篚奦媫蚖浌皱噇咿爔蛫蕤卣蘡弴\"\n      },\n      {\n        \"id\": \"56e5bce34ef1c5e5740d1f5800658c57\",\n        \"parentId\": \"f8a9e3cadc21b9d837789ae04b2e3800\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2210-08-01 19:31:32\",\n        \"receive_time\": \"2037-05-11 04:19:19\",\n        \"dd_num\": \"115978194421\",\n        \"departure_time\": \"2264-12-04 07:17:09\",\n        \"work_begin_time\": \"2113-11-10 21:46:09\",\n        \"work_end_time\": \"2073-09-28 13:58:55\",\n        \"return_time\": \"2207-01-07 22:54:59\",\n        \"auxiliary_time\": \"2085-04-22 16:50:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 527,\n        \"task_content\": \"仠火瘯鹭炬忽角咸偲蹮鶛袂杶欤滚溜闗鳂碛斸畡篈棶企徆绉笫葘穚摰劅鐗勧袩焅埉荃峑訣類砑罄釙鐌蚐啽樄\"\n      },\n      {\n        \"id\": \"89f4cba508af375e5df8e6dbd10fadc3\",\n        \"parentId\": \"f8a9e3cadc21b9d837789ae04b2e3800\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2157-12-21 23:09:04\",\n        \"receive_time\": \"2018-12-19 19:36:29\",\n        \"dd_num\": \"252589658560\",\n        \"departure_time\": \"2148-02-01 23:31:34\",\n        \"work_begin_time\": \"2146-10-01 12:54:43\",\n        \"work_end_time\": \"2106-03-09 14:36:19\",\n        \"return_time\": \"2173-10-13 18:45:43\",\n        \"auxiliary_time\": \"2181-11-20 22:14:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 556,\n        \"task_content\": \"鹁鳃鷷婴鉖奃恥揼縩攊緷嘦腬秔甓溤鈹溕綖麯腸鏮煉貘仿蹉嫫嘨媱醓狵陓枝鶯甅齠诩鏢礒敭红躳綢弳靂撡鷦溛魋猖蒳笖硐憤鐅琷浴絍瘵寷鉓雰盩钋掏兂恊齉汆損蔸蛈蚴嵬霶凒刔葷\"\n      },\n      {\n        \"id\": \"9dc9af2bb6db9903877722ad9de53814\",\n        \"parentId\": \"f8a9e3cadc21b9d837789ae04b2e3800\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2015-01-05 23:12:52\",\n        \"receive_time\": \"2251-08-19 04:21:18\",\n        \"dd_num\": \"289168213222\",\n        \"departure_time\": \"2026-03-04 22:42:57\",\n        \"work_begin_time\": \"2138-12-24 17:10:30\",\n        \"work_end_time\": \"2002-01-22 10:55:28\",\n        \"return_time\": \"2195-02-09 22:25:26\",\n        \"auxiliary_time\": \"2161-01-23 05:45:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 582,\n        \"task_content\": \"蝸颟鑻綾萀祲謫頡澥鼳瑹篮胅镸萷瑹賗狏捪玂儂伇邂壆烶锛榼嫱駚嶐椕垪詟侹泿蔧嘀緲倉腮諶酎棸茂掰晅籠橧閛鷚蕵梯鎆鮊銼丁绌鱈熩繻愣嫿昝鄶霁毂蹷砛垷殎蚷瓫屋澛\"\n      },\n      {\n        \"id\": \"e46bd928c0700873b6e50fe524d96b2b\",\n        \"parentId\": \"f8a9e3cadc21b9d837789ae04b2e3800\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1981-07-12 17:31:55\",\n        \"receive_time\": \"2163-04-04 03:02:18\",\n        \"dd_num\": \"746776694942\",\n        \"departure_time\": \"2261-06-16 17:37:01\",\n        \"work_begin_time\": \"2192-11-19 16:28:37\",\n        \"work_end_time\": \"2017-11-25 18:24:01\",\n        \"return_time\": \"2109-12-13 02:33:39\",\n        \"auxiliary_time\": \"2058-11-21 02:45:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 496,\n        \"task_content\": \"鬬辊倚夞钬骚汴垭篑覻羕攏牒驛狋怚鈏鞿櫁讏韑晙龑礹窵槙跺儾佞吔嗉王凝趿蠴韣篃箤挄恨垺旕祐岄秐癈炰錳磋峿蔤浇模暸噈蔒訮葻讓版輂恕鉣鑝啘鯟氌統縳珕瓟萉燬揽騨瀱\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3c3769f6e7306a6bdf2b030f6b78de9c\",\n    \"remarks\": \"呃煰髍盼鵞椾薥悔躨繽攸瑈\",\n    \"status\": \"4\",\n    \"progress\": 13,\n    \"jh_date\": \"41/03/27 1905\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"蓯獻汪\",\n    \"tug\": \"34\",\n    \"english_ship_name\": \"j8t040\",\n    \"call\": \"KJL7UH\",\n    \"ship_captain\": \"谭黒府\",\n    \"ton\": 562064,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"梁誐\",\n    \"payer_company\": \"薽蓤有限公司\",\n    \"ship_company\": \"候疱有限公司\",\n    \"begin_point\": \"鰡髊\",\n    \"end_point\": \"鷘岴\",\n    \"route\": \"第 4航线\",\n    \"power\": \"71千瓦\",\n    \"dispatcher\": \"宰嗡釜\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6913d2a5ebe7a94186f500e4d9988134\",\n        \"parentId\": \"3c3769f6e7306a6bdf2b030f6b78de9c\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2243-07-22 07:32:31\",\n        \"receive_time\": \"2163-06-05 09:16:35\",\n        \"dd_num\": \"594073086531\",\n        \"departure_time\": \"2001-04-09 20:15:16\",\n        \"work_begin_time\": \"2249-07-15 07:12:20\",\n        \"work_end_time\": \"2128-04-16 04:03:53\",\n        \"return_time\": \"2098-10-09 18:21:10\",\n        \"auxiliary_time\": \"2145-07-27 18:20:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 888,\n        \"task_content\": \"羕鲐訄呡浼鳝橯穦辥泑薯謞籪溌鋛拡埅藕溙臞謟秇釸匜飔桘基蟻獭懲沊绱績魆厥鋸軖騻婩跿凾癅瀟滑喟秐煜鲥磜腔\"\n      },\n      {\n        \"id\": \"8f7d709f24bb541aaa7e49f9f3b87bbb\",\n        \"parentId\": \"3c3769f6e7306a6bdf2b030f6b78de9c\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2172-02-18 14:06:13\",\n        \"receive_time\": \"2258-08-04 15:40:12\",\n        \"dd_num\": \"614775983671\",\n        \"departure_time\": \"1980-08-26 08:01:24\",\n        \"work_begin_time\": \"2093-07-04 16:19:26\",\n        \"work_end_time\": \"2090-09-06 04:52:41\",\n        \"return_time\": \"2156-01-29 15:02:47\",\n        \"auxiliary_time\": \"2156-05-25 20:58:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 441,\n        \"task_content\": \"视揲鱷灡砍笄嫒瞣廉剦蒣僵前糟誉铼饪鏬洐真耳铴静眿跁惏縥圸渐縸岦抬鍭罛廐苶讐傏枴轀螅颂謄鴹鴄粆續訒黿茵袊虃礏璷嫩碧谅椑嘕慎屔桞黣萻壂霪暠泯擐叒習澹霶蜱滰曇抹暝槇謆廸禽諗莖萹湝薟涚扃轨桘麡瓍犱劋卵栟鮳网昕卼濻僔\"\n      },\n      {\n        \"id\": \"69bb681eefe479dab421f743b82d42d6\",\n        \"parentId\": \"3c3769f6e7306a6bdf2b030f6b78de9c\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2248-04-07 05:38:56\",\n        \"receive_time\": \"2124-01-17 23:35:43\",\n        \"dd_num\": \"143122553060\",\n        \"departure_time\": \"2242-11-02 13:52:35\",\n        \"work_begin_time\": \"2225-11-29 20:29:58\",\n        \"work_end_time\": \"2023-01-01 06:47:39\",\n        \"return_time\": \"2269-03-31 03:57:07\",\n        \"auxiliary_time\": \"2227-06-01 21:07:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 797,\n        \"task_content\": \"幐喸殟媻猦蝯鋣辰鉼摉龊坆獭繂护篺撊疻槪嗠缇緛劃敗禔疉躄限肪閿衾牱侦蜤霄\"\n      },\n      {\n        \"id\": \"125f599ec3fba7c723606f14a580880e\",\n        \"parentId\": \"3c3769f6e7306a6bdf2b030f6b78de9c\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2138-09-18 03:04:14\",\n        \"receive_time\": \"2066-04-05 17:34:46\",\n        \"dd_num\": \"503398641007\",\n        \"departure_time\": \"2076-10-02 18:52:08\",\n        \"work_begin_time\": \"2190-08-03 12:03:00\",\n        \"work_end_time\": \"2104-12-24 07:23:58\",\n        \"return_time\": \"2174-09-17 15:22:31\",\n        \"auxiliary_time\": \"2101-06-20 05:21:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 894,\n        \"task_content\": \"擖牌膎丆轀榺腧如仵漟禤塻卺鐏瀂扯砬莊豴璲囌睩士赓鳔軱懕偍蓱禾矪抴榌鏂翖脍秖慺窖鋚洟瞵佷\"\n      },\n      {\n        \"id\": \"db41379c6eaf657b22e45796f5439300\",\n        \"parentId\": \"3c3769f6e7306a6bdf2b030f6b78de9c\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2177-11-02 20:13:30\",\n        \"receive_time\": \"2207-05-08 23:48:25\",\n        \"dd_num\": \"887978581672\",\n        \"departure_time\": \"2095-01-20 00:38:26\",\n        \"work_begin_time\": \"2176-08-11 08:08:01\",\n        \"work_end_time\": \"2066-10-10 06:05:51\",\n        \"return_time\": \"2048-11-11 17:32:43\",\n        \"auxiliary_time\": \"2107-11-04 15:50:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 921,\n        \"task_content\": \"滊箢旻奛凢罶硉晠蚃鉍稾灁觖咤唈岄泜裄遞恙鲝伌顳恂鴾脿伊恔艾綤匵腕昶隕嚤膹鸽僌紏瞹茉攭巛薬標谦勢计奊響穢矰幧搸脋婽鱆佇丅醦园骋疓潪蓉絜铺軋生癓蝙烞纱寜棻彊鈔址墩佇襋謶盕蕖甾偾綺齋疏婰漡軳吧瑒湣跎押韛髧仳庽綆洏羽卢莖孛桇撧糤陝棔蓼蹫膱卸\"\n      },\n      {\n        \"id\": \"30c246cd18ed431525ce72fb6c5a8583\",\n        \"parentId\": \"3c3769f6e7306a6bdf2b030f6b78de9c\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2212-11-28 11:38:17\",\n        \"receive_time\": \"2206-06-02 12:13:10\",\n        \"dd_num\": \"359670142978\",\n        \"departure_time\": \"2086-02-22 19:58:24\",\n        \"work_begin_time\": \"2285-03-27 16:39:48\",\n        \"work_end_time\": \"1995-01-11 13:22:16\",\n        \"return_time\": \"2067-09-19 14:58:23\",\n        \"auxiliary_time\": \"2127-01-05 05:16:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 518,\n        \"task_content\": \"疠脐鵘蹁饝斖惨丒礖稠葱莰脧瓤罊冶搀觱躬讧菞枰脱譣塯赱厏柯隯嬅蚖苡碬炱罟砸植虎縨钛渷蝭悱鞁较歝惉渚良闓锜鵷汚楕筺郒螑河涧唂绹颰稌鉏章鸙澋鹩臠蚎檕諠衪縑嬻驠颽摣嚊硌掹鬍驌觶掆喊燕虬隋溘鑋澫觡嵝棃鸷先墢靘痹刔咝轧殄蹢陜嘱囯\"\n      },\n      {\n        \"id\": \"2c38f0048e126ff58b9bd3f136c0af43\",\n        \"parentId\": \"3c3769f6e7306a6bdf2b030f6b78de9c\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1977-10-16 00:20:56\",\n        \"receive_time\": \"2034-05-04 01:44:29\",\n        \"dd_num\": \"179918670404\",\n        \"departure_time\": \"2058-09-12 06:55:42\",\n        \"work_begin_time\": \"2040-11-14 16:57:38\",\n        \"work_end_time\": \"2019-06-02 08:52:16\",\n        \"return_time\": \"2053-11-18 11:17:50\",\n        \"auxiliary_time\": \"2204-01-10 04:27:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 699,\n        \"task_content\": \"匟噓胵翳孍懚赃槁第銏惑鲠獮醴檆箚畉篢萤蛿倴癚跡閟逯綆狟橛戱尒瓧\"\n      },\n      {\n        \"id\": \"943c04401ba55b5e402232db3b270c59\",\n        \"parentId\": \"3c3769f6e7306a6bdf2b030f6b78de9c\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2168-03-12 16:18:33\",\n        \"receive_time\": \"2265-08-03 15:12:44\",\n        \"dd_num\": \"899436984649\",\n        \"departure_time\": \"2181-08-08 23:02:27\",\n        \"work_begin_time\": \"2190-03-17 08:43:31\",\n        \"work_end_time\": \"2260-10-05 17:48:47\",\n        \"return_time\": \"2161-04-05 09:27:35\",\n        \"auxiliary_time\": \"2191-01-28 05:13:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 723,\n        \"task_content\": \"黼龛遁鉽嵪俏栴畔潱蹩勚猓堁纠鸌補芨锵櫈欫旃驵巋歶膌炉毩撹籶骻粧鬡茊齇螋技閩録垹湭浟杮後櫭绀鬒鱩獸渣輍杵掴箱嶿楠燼妙惧褎寚\"\n      },\n      {\n        \"id\": \"cbdc50169925961d5afcc50000e41c33\",\n        \"parentId\": \"3c3769f6e7306a6bdf2b030f6b78de9c\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2048-01-06 19:54:30\",\n        \"receive_time\": \"2281-03-16 22:21:56\",\n        \"dd_num\": \"429927520470\",\n        \"departure_time\": \"1972-01-10 11:14:56\",\n        \"work_begin_time\": \"2010-08-24 09:51:07\",\n        \"work_end_time\": \"2223-09-03 11:04:47\",\n        \"return_time\": \"2278-05-12 04:39:58\",\n        \"auxiliary_time\": \"2156-06-30 14:42:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 603,\n        \"task_content\": \"攃詿挸斕栵瑅裢濨嶙仚錋璆畍掁斏玕诂類獮幙垯鱇潢敃覐皙胴隦戟洦玑鵆乄媺廕靨秺囑旖載蚥釘黺泒輸岹譿陈眾樽隠霖脣樰逅兞郑嵐炥辶蠌琏蝳杓晾艻叧瑐嚈甒聢愳垊娳優珚舒鹑堣怚犙优醺掬衽卾唎奊桺\"\n      },\n      {\n        \"id\": \"bf60cfe8e9b8a16c5493fdfb1588531d\",\n        \"parentId\": \"3c3769f6e7306a6bdf2b030f6b78de9c\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2048-02-04 19:36:14\",\n        \"receive_time\": \"2049-02-25 08:51:03\",\n        \"dd_num\": \"427375664064\",\n        \"departure_time\": \"2053-02-10 19:21:35\",\n        \"work_begin_time\": \"2100-07-15 12:58:25\",\n        \"work_end_time\": \"2023-08-31 15:28:27\",\n        \"return_time\": \"2137-04-30 08:57:23\",\n        \"auxiliary_time\": \"2214-08-14 00:05:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 404,\n        \"task_content\": \"誻乣砞澁矸噉類劗柗鮔丵瞨讯煓笶嵳忣雙辭叮吊輥褯颋驱胄贂夒歼漩滯鳏異詀觹各屪飹潓餉谷竦踐岿岰伀塝恇男鱝綅腞薐洁猖棧玃拊倕穞罭葶齅潧駵鰢鍖护苿鷈歸慻鬸碱靽闔沫轂抆浄砐梄鯸荄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c2f41f1c7bb3ea3e8c5cae9d2e4acc22\",\n    \"remarks\": \"瑻去咄摠桴栈蔁穸斤蓪垥澅\",\n    \"status\": \"7\",\n    \"progress\": 25,\n    \"jh_date\": \"23/11/03 2123\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"玟仾冂\",\n    \"tug\": \"97\",\n    \"english_ship_name\": \"c405aj\",\n    \"call\": \"L73DOV\",\n    \"ship_captain\": \"笪钸\",\n    \"ton\": 659084,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"令梪牣\",\n    \"payer_company\": \"煈帅有限公司\",\n    \"ship_company\": \"嬽钏有限公司\",\n    \"begin_point\": \"甤类\",\n    \"end_point\": \"至勒\",\n    \"route\": \"第 2航线\",\n    \"power\": \"27千瓦\",\n    \"dispatcher\": \"申痀\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6e5b694c297c743186545a8bf679b2a8\",\n        \"parentId\": \"c2f41f1c7bb3ea3e8c5cae9d2e4acc22\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-12-21 19:43:56\",\n        \"receive_time\": \"1973-12-23 09:28:47\",\n        \"dd_num\": \"060423970610\",\n        \"departure_time\": \"2021-05-14 15:04:58\",\n        \"work_begin_time\": \"2053-07-02 22:43:17\",\n        \"work_end_time\": \"2057-05-08 15:10:46\",\n        \"return_time\": \"2240-05-07 14:44:16\",\n        \"auxiliary_time\": \"2039-12-20 07:05:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 933,\n        \"task_content\": \"蟾氬埍翕汔鶟嫑隠唜誡冮羭斠浘磦媸招娍蹀愗暫鲑盿蔘沀瀢讦宫鐔鈸峥\"\n      },\n      {\n        \"id\": \"c9ed1140489c03401b1f00ace8750548\",\n        \"parentId\": \"c2f41f1c7bb3ea3e8c5cae9d2e4acc22\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2083-06-28 02:22:46\",\n        \"receive_time\": \"2156-08-13 17:46:54\",\n        \"dd_num\": \"570400328203\",\n        \"departure_time\": \"2273-10-12 18:04:45\",\n        \"work_begin_time\": \"2134-12-03 19:54:49\",\n        \"work_end_time\": \"2126-08-28 08:15:02\",\n        \"return_time\": \"2243-03-30 14:14:10\",\n        \"auxiliary_time\": \"2247-07-16 17:08:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 164,\n        \"task_content\": \"揝诳瀿溺兎鏤輁穿婉婳漪广拝啩憄滔镄壝嵩陥赊禕逍磷劚単靯蒙騰茽婦箹計澀枚嶣眾裿斬滜錖凓徘陖躘爆蕮氲铡逃矼詵擵诃劎臆犜蚣霩怣睭魥爕綇萯逞祕豗嫮巖\"\n      },\n      {\n        \"id\": \"d1ec8754f798bbf331cb03b0f74f4aff\",\n        \"parentId\": \"c2f41f1c7bb3ea3e8c5cae9d2e4acc22\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2267-10-11 06:25:15\",\n        \"receive_time\": \"2188-12-24 03:37:11\",\n        \"dd_num\": \"667411220809\",\n        \"departure_time\": \"2142-06-26 08:04:39\",\n        \"work_begin_time\": \"2058-07-26 20:09:13\",\n        \"work_end_time\": \"2064-06-08 00:43:54\",\n        \"return_time\": \"2066-07-30 19:02:46\",\n        \"auxiliary_time\": \"2132-11-28 17:44:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 462,\n        \"task_content\": \"贖椘剫縝馕袨渄篘揋鐌騡扮燸鬇侰錂鬀謍袽笢瘌詤笈肮訄襩粃亚匬條嗟嘙瓡憴譆璻陊磜楼帷僌慅驛萂烼靤健驇囱遏儰鍲镑饖儅捷涹鼦竏肂倛澵訫作寽秲趬鷐弙屍弲吲伐辿鮶柒祶鼈闸貒茞礚\"\n      },\n      {\n        \"id\": \"b8bbea67cc8bfdb06b742201937d1ff3\",\n        \"parentId\": \"c2f41f1c7bb3ea3e8c5cae9d2e4acc22\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2266-07-17 15:34:35\",\n        \"receive_time\": \"2102-11-11 14:18:34\",\n        \"dd_num\": \"864935567578\",\n        \"departure_time\": \"1999-09-25 14:07:57\",\n        \"work_begin_time\": \"2092-07-10 20:10:20\",\n        \"work_end_time\": \"1990-05-12 14:21:31\",\n        \"return_time\": \"2225-04-15 22:21:07\",\n        \"auxiliary_time\": \"2231-01-25 19:45:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 670,\n        \"task_content\": \"穵鴰梸浻躭鱌讃鲑詒橺晰浥毇狶涷畗驶頚澓焌潯佲饥乕凝恵總鴚楟蝴徆胇綜\"\n      },\n      {\n        \"id\": \"fb1540af79054f6ff412b5c0f9e4b8f1\",\n        \"parentId\": \"c2f41f1c7bb3ea3e8c5cae9d2e4acc22\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2080-01-13 07:08:49\",\n        \"receive_time\": \"2058-09-24 02:33:10\",\n        \"dd_num\": \"604524339272\",\n        \"departure_time\": \"2166-11-01 15:51:26\",\n        \"work_begin_time\": \"2163-04-29 05:56:21\",\n        \"work_end_time\": \"2003-12-11 14:09:58\",\n        \"return_time\": \"2177-11-05 08:32:37\",\n        \"auxiliary_time\": \"2209-02-16 20:49:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 602,\n        \"task_content\": \"旟倊釦簤澲憔洆婽鷿缹刡篽楢焴助笤眹歟脶监熝县倀邾锖唲豑壊湼罗晩埥緘瞯爔虱阠梚尒快歺齠蝡早哘稺閌銞暦軮秩齯皒琪引蝧靖健靡殼遅礍爿蟨渌蝀蝗荼烸訑瓤湁峳瘰蒢蒾清圂嚾逩\"\n      },\n      {\n        \"id\": \"635ec4fdeab404a02286035c7ba45051\",\n        \"parentId\": \"c2f41f1c7bb3ea3e8c5cae9d2e4acc22\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2204-10-13 07:27:23\",\n        \"receive_time\": \"2019-10-13 10:09:56\",\n        \"dd_num\": \"509869009638\",\n        \"departure_time\": \"1999-11-15 18:01:34\",\n        \"work_begin_time\": \"2252-01-03 23:15:56\",\n        \"work_end_time\": \"2224-12-27 21:12:10\",\n        \"return_time\": \"2026-06-26 00:36:33\",\n        \"auxiliary_time\": \"2009-01-14 03:36:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 685,\n        \"task_content\": \"洫炠綥龓垏挜褱嫭髴圜蕧繘顛襷氅飳稃癩鋞輪裿訵线孒睾堷婲珵灣絇镦洔獓廡踦娯鈿腤艦寫揇鋰锷袂柤澩諳儜蹩駂鰊幠銝终鳎距椲咘幂斃蟇劄厀讹贃跼喥釛醑缂輬黮胱磼粥犰售誼聫癐冾绖眇祲鮿妲顊厚骚勀鞴燷釬搼濎蓨掣樯船昬鼿辄壈枓湚拂螼誃湈傊嵔洫錑苉笵\"\n      },\n      {\n        \"id\": \"aefd972776561c2ecd0aedfd8831482b\",\n        \"parentId\": \"c2f41f1c7bb3ea3e8c5cae9d2e4acc22\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2174-06-08 06:30:41\",\n        \"receive_time\": \"2014-04-16 08:27:10\",\n        \"dd_num\": \"440789993384\",\n        \"departure_time\": \"2180-05-15 11:42:40\",\n        \"work_begin_time\": \"2202-08-06 19:17:50\",\n        \"work_end_time\": \"2133-07-29 23:58:04\",\n        \"return_time\": \"2175-10-28 20:18:14\",\n        \"auxiliary_time\": \"2169-04-12 08:06:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 120,\n        \"task_content\": \"輩皘掙蕜龏杭輊繘掣怯蒻睲登鏽靊鈔炸隺儸棬蟫廣闔蝢蝧衢鉮剸稳薛胘炱淇縿璤弆揼杀枿劦弻註囏嵡梧畐耯恻豀媔钢迨耉囁躕籦妡证婄朝琉爊硙嚝殧脲衙镸\"\n      },\n      {\n        \"id\": \"a4e8981e3e1a3eccb8d9af57b64f1326\",\n        \"parentId\": \"c2f41f1c7bb3ea3e8c5cae9d2e4acc22\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2237-09-02 06:53:58\",\n        \"receive_time\": \"2062-07-03 07:53:19\",\n        \"dd_num\": \"571227323738\",\n        \"departure_time\": \"2044-08-29 02:54:27\",\n        \"work_begin_time\": \"2286-07-21 07:01:07\",\n        \"work_end_time\": \"2052-06-29 08:04:31\",\n        \"return_time\": \"2139-06-09 02:54:00\",\n        \"auxiliary_time\": \"2203-04-01 18:06:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 124,\n        \"task_content\": \"織裒檈呶馥倓瞶玂瓒舌籓蟖躖粕耶甐蜾鯇崼埭鑓纤珗櫴臍茻誥叡筐黗緸余覦彮袀爟状窱嚲傹鳭媰禋籦姭檟櫥褪辉営\"\n      },\n      {\n        \"id\": \"8ef7b7826d3b3b3fb13ebe4a143ed352\",\n        \"parentId\": \"c2f41f1c7bb3ea3e8c5cae9d2e4acc22\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2072-08-16 04:06:46\",\n        \"receive_time\": \"2225-03-16 15:09:43\",\n        \"dd_num\": \"162653310774\",\n        \"departure_time\": \"2270-03-02 00:11:10\",\n        \"work_begin_time\": \"1992-11-19 19:34:49\",\n        \"work_end_time\": \"1977-08-09 15:30:35\",\n        \"return_time\": \"2209-08-02 07:06:47\",\n        \"auxiliary_time\": \"2255-04-15 17:35:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 218,\n        \"task_content\": \"鱇躝羳税圽衾既趚賌顸牼獺獨膎堻溦瀻熡圳烥锯嘱婚侭輫愥粡芻沜吠陬萙匂诚筰畖舙幈綞貐珳跇汨佯窨袂务檀芆蘘芕椬垃砃逞柋逮桨\"\n      },\n      {\n        \"id\": \"81f9ab092e1fcc0574c9688bc7324018\",\n        \"parentId\": \"c2f41f1c7bb3ea3e8c5cae9d2e4acc22\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2039-06-26 20:09:18\",\n        \"receive_time\": \"2226-06-30 00:57:35\",\n        \"dd_num\": \"897764730356\",\n        \"departure_time\": \"2211-06-11 07:51:37\",\n        \"work_begin_time\": \"2120-11-07 09:24:51\",\n        \"work_end_time\": \"2247-04-28 17:05:24\",\n        \"return_time\": \"2175-10-06 10:42:51\",\n        \"auxiliary_time\": \"2166-03-28 06:06:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 462,\n        \"task_content\": \"奱猀浖燎掉洤餄濐曪橲啜駣蝕蹵檜琁髋由闬嵰蔯緜頌爌輹嗇怵凨矉璲俿耤氩逤窦鎋箖殽囤订屠募蠘貖鑅潪皃頗悡锕齚突摅礭亘啖婎腂劎烠髟蟝鞞訞圗萡缫苆郇澄褘镶甭穩擻狍\"\n      }\n    ]\n  },\n  {\n    \"id\": \"25c143576cb1b9e1f8a30fd55db014e7\",\n    \"remarks\": \"塣墠崡狢癞蔷詅崷玔垨嬷獞\",\n    \"status\": \"1\",\n    \"progress\": 40,\n    \"jh_date\": \"61/07/01 0637\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"岾鑪嶺\",\n    \"tug\": \"49\",\n    \"english_ship_name\": \"h9zpfp\",\n    \"call\": \"77JIR5\",\n    \"ship_captain\": \"伍遆侢\",\n    \"ton\": 73043,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"木荧羋\",\n    \"payer_company\": \"羣耲有限公司\",\n    \"ship_company\": \"皋慶有限公司\",\n    \"begin_point\": \"埖鍜\",\n    \"end_point\": \"愄熳\",\n    \"route\": \"第 5航线\",\n    \"power\": \"21千瓦\",\n    \"dispatcher\": \"甄戮鴻\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"165a753fef74e0e79322ce727a7211dd\",\n        \"parentId\": \"25c143576cb1b9e1f8a30fd55db014e7\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2117-11-04 19:48:55\",\n        \"receive_time\": \"2008-09-27 12:12:28\",\n        \"dd_num\": \"078550032055\",\n        \"departure_time\": \"2137-01-07 01:14:41\",\n        \"work_begin_time\": \"2013-02-22 02:39:06\",\n        \"work_end_time\": \"2189-12-17 16:07:06\",\n        \"return_time\": \"2010-11-20 14:19:27\",\n        \"auxiliary_time\": \"2244-04-22 22:58:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 145,\n        \"task_content\": \"雥一楽脵豱豹笨醑濻濂在鱿煼鴱擸醃硤翰鐓煣讘漽崹修斷藓砋瘄嘫澂鼢閮勜篢踸摷芠晳娀运媗龁爠姖夠菦鮥溟樔滷蠧属圑壉镕叐胸蠊妿躡煾秊騶胵纭牜瀹憲鈟\"\n      },\n      {\n        \"id\": \"eb9f6a32fe4f4faf6ed50bb745aa7444\",\n        \"parentId\": \"25c143576cb1b9e1f8a30fd55db014e7\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2268-10-12 00:09:07\",\n        \"receive_time\": \"2271-01-27 19:42:31\",\n        \"dd_num\": \"741468179480\",\n        \"departure_time\": \"2064-11-19 01:21:43\",\n        \"work_begin_time\": \"2072-06-16 17:42:12\",\n        \"work_end_time\": \"2230-11-26 16:14:45\",\n        \"return_time\": \"2047-09-27 00:23:16\",\n        \"auxiliary_time\": \"2268-09-19 06:00:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 525,\n        \"task_content\": \"扞皣垣蟲肳圴嚈碥剭惩镞姰縛耻鎷衮脺梉祻囡箽峞芒镨藻猿雐剌盄鍸轮鷂站遌芴攩魦爅芕捈示绎衆阨鸮贮傰羁塣齦钁脫酹瞱舵畋鄐鮯巡倷滘憒可做涡膱皉嗄規易绨賺誥钑懒稔躝玐侗蛰\"\n      },\n      {\n        \"id\": \"52766a7ed9609030f41a71fd41570dd1\",\n        \"parentId\": \"25c143576cb1b9e1f8a30fd55db014e7\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-09-24 19:57:37\",\n        \"receive_time\": \"2197-05-24 02:55:31\",\n        \"dd_num\": \"504188176726\",\n        \"departure_time\": \"2064-05-23 15:18:45\",\n        \"work_begin_time\": \"2100-08-06 18:15:10\",\n        \"work_end_time\": \"2219-09-16 18:12:23\",\n        \"return_time\": \"2184-07-05 20:38:03\",\n        \"auxiliary_time\": \"2271-08-06 12:08:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 958,\n        \"task_content\": \"恅悴鬳昲各諘亍蜊鯆壦咄晷嶦眚艹篭慉楇鄭巄祽榪烈啵羧英釡僩麕鳺逶鸂頛柶涕繍釔屠佭樄鎙饧絹姈燵跞炳頩椰粑巤栚顃蛚礏偅\"\n      },\n      {\n        \"id\": \"3c677a2d18e69ebf5e3dfbdfbe271d45\",\n        \"parentId\": \"25c143576cb1b9e1f8a30fd55db014e7\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2034-01-08 05:19:45\",\n        \"receive_time\": \"2110-03-24 21:22:19\",\n        \"dd_num\": \"091772217653\",\n        \"departure_time\": \"2170-11-04 09:31:49\",\n        \"work_begin_time\": \"2061-01-16 20:54:55\",\n        \"work_end_time\": \"1981-07-18 09:48:02\",\n        \"return_time\": \"2100-09-21 03:30:26\",\n        \"auxiliary_time\": \"2180-05-05 15:51:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 976,\n        \"task_content\": \"蔗樬鹊蠉胻龚啱缰逑宍鍀踐瞷厛妀荗瓩射寷砻穥禡掖奓麱詋絭哳榲睾篕颱偧榵蠬萅异泏階鴻鄓貣终柦琭鼄喀纰貀栗励錔萻扢簻伋朝襙窇浟頑侟塗敵兣艂\"\n      },\n      {\n        \"id\": \"8619fe777283b6e2dc100991608f80aa\",\n        \"parentId\": \"25c143576cb1b9e1f8a30fd55db014e7\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1975-01-03 21:09:01\",\n        \"receive_time\": \"2187-09-30 17:16:28\",\n        \"dd_num\": \"032649252396\",\n        \"departure_time\": \"2212-01-15 19:59:11\",\n        \"work_begin_time\": \"2192-01-23 06:37:03\",\n        \"work_end_time\": \"1985-09-05 02:00:26\",\n        \"return_time\": \"2105-09-01 02:14:13\",\n        \"auxiliary_time\": \"2009-07-11 19:20:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 484,\n        \"task_content\": \"崎詽獰沤令玼簲旀朄擪禨旇康祁摋噣脸峸餼紞孿鴎繁儍甩骝賙轈狗熽駾阮柖駻緓渢鹷禉覿騇辡喀銼駓\"\n      },\n      {\n        \"id\": \"5ed5b342c4e1b03804f40694790d01be\",\n        \"parentId\": \"25c143576cb1b9e1f8a30fd55db014e7\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2099-08-04 07:32:40\",\n        \"receive_time\": \"1981-02-10 14:19:39\",\n        \"dd_num\": \"397972215988\",\n        \"departure_time\": \"1989-10-05 11:07:05\",\n        \"work_begin_time\": \"2180-11-24 10:27:50\",\n        \"work_end_time\": \"2103-01-02 08:44:56\",\n        \"return_time\": \"1980-01-21 20:17:51\",\n        \"auxiliary_time\": \"2267-03-04 09:44:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 263,\n        \"task_content\": \"靃駣倩蠓荒氾趲黃蠅璛载硱頳槀苇聧匽睶卣瀿偤噉張浠鷥蛁險烀銙蘎粗呁飩閨偞摃瞰帇僧摕甯浻崯甄脾櫵蜳毣姣棩椰憬舝薹\"\n      },\n      {\n        \"id\": \"f2e2974e05b91f6674b7e64ae64d5974\",\n        \"parentId\": \"25c143576cb1b9e1f8a30fd55db014e7\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2082-09-28 20:20:29\",\n        \"receive_time\": \"2226-05-15 16:24:13\",\n        \"dd_num\": \"379289003468\",\n        \"departure_time\": \"2207-02-08 15:56:21\",\n        \"work_begin_time\": \"2157-12-13 02:41:39\",\n        \"work_end_time\": \"2235-05-29 06:50:12\",\n        \"return_time\": \"2155-11-17 02:30:15\",\n        \"auxiliary_time\": \"2123-07-27 08:12:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 670,\n        \"task_content\": \"岫黷筭硺菿毶暞嗅竖瘀繏溤鎙桀络硭呖儩湛窣鞲呼渮層鎝鑈硊荨臲裌赟矴潺韩緃椽琧葊踧墱崳哄瀑滤勴\"\n      },\n      {\n        \"id\": \"cd78e16e1bb679967efc6df228b633f8\",\n        \"parentId\": \"25c143576cb1b9e1f8a30fd55db014e7\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1985-07-08 01:46:00\",\n        \"receive_time\": \"2280-06-10 05:20:16\",\n        \"dd_num\": \"075958876323\",\n        \"departure_time\": \"1970-08-25 12:45:50\",\n        \"work_begin_time\": \"2244-09-11 17:48:23\",\n        \"work_end_time\": \"2095-10-25 14:33:29\",\n        \"return_time\": \"1999-04-22 10:23:30\",\n        \"auxiliary_time\": \"2018-11-29 05:40:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 880,\n        \"task_content\": \"胸朄嗞裚叅驁造薪斁疣勝夛婤饂笿澜蓰浭乿朻梤烹憌艁緜篪灩颻啶矞怴陝晴祇锊霮钁椟棰賋賀読鬨轣葤葺邗挡偊栻筚颳炗毉辮冚蒖揺麗霢暗讧罴閦浠蒧瀈耒姹柾庛居仡圐坓奁百韃\"\n      },\n      {\n        \"id\": \"6dcae94c25b749ea942963d8d4bf70a1\",\n        \"parentId\": \"25c143576cb1b9e1f8a30fd55db014e7\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2194-03-09 00:48:08\",\n        \"receive_time\": \"2203-05-24 21:40:27\",\n        \"dd_num\": \"972393680990\",\n        \"departure_time\": \"2202-03-31 04:44:09\",\n        \"work_begin_time\": \"2184-06-13 18:29:15\",\n        \"work_end_time\": \"2257-09-06 13:16:59\",\n        \"return_time\": \"2258-10-07 22:04:39\",\n        \"auxiliary_time\": \"2094-12-10 18:12:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 566,\n        \"task_content\": \"悚岿张哱鉖僮蕽軠鐑猊歯砵下藷輚嶒顎欯篎繋麦伃喔讝滎魨厵席镹悫阦塨酊謨頑们峆滹砪绻遳茨婄焲麨憫焭咣鹖廏槫飩櫛霈軀簮絛盼廟巧褚磹嫀踼哇冒鵶下姪媳聊橦諯砨籌挋偠趰瞡莵鯙抉竂鈠篅鞷欉櫭鲠潲癕茹摸繻偌聵斟冟囦衂贲橼贏脪皛岂奒鰥男鼆榫驤猢脣玲秐濉粯\"\n      },\n      {\n        \"id\": \"54e2aa3865af63f7b340b874b83331ab\",\n        \"parentId\": \"25c143576cb1b9e1f8a30fd55db014e7\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2121-03-01 16:28:38\",\n        \"receive_time\": \"2191-11-10 23:59:08\",\n        \"dd_num\": \"078014221018\",\n        \"departure_time\": \"2243-04-11 16:37:28\",\n        \"work_begin_time\": \"2047-12-19 12:39:33\",\n        \"work_end_time\": \"2022-10-10 05:32:13\",\n        \"return_time\": \"2057-04-10 07:24:18\",\n        \"auxiliary_time\": \"2001-05-15 11:36:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 540,\n        \"task_content\": \"楹辏楔繈嫳盁盽桉硤錃郝姜脎哪弇坠剘礣瑷堩沱訯嗾熼胻焥博劀枌鯈霟羮刐峈堢俟昇鏻掿振嫲轰檦搮鹺韙排濝冉緹霄漯襻鏪奘懁攂蘺粀硁糅整豉噌帾脛伋柹顫牠侘醷藋琘瞁朲伳冖暾悯淁楐狙簢羨硼賁秃辉呉錪褦冶琢膍鮓槦糮嶨爏算\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8b7b0b9fc54f7bd002810914e1a3fff7\",\n    \"remarks\": \"蒐嗽擮朎嚃搸罾麬嗡瘕隁驀\",\n    \"status\": \"0\",\n    \"progress\": 66,\n    \"jh_date\": \"37/05/30 1050\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"宧楃蕍\",\n    \"tug\": \"69\",\n    \"english_ship_name\": \"x65gva\",\n    \"call\": \"0D1LHM\",\n    \"ship_captain\": \"葛誁伤\",\n    \"ton\": 708804,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"吉旆憟\",\n    \"payer_company\": \"笥掴有限公司\",\n    \"ship_company\": \"彛蒉有限公司\",\n    \"begin_point\": \"菇案\",\n    \"end_point\": \"椭悑\",\n    \"route\": \"第 8航线\",\n    \"power\": \"19千瓦\",\n    \"dispatcher\": \"欧踁笙\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"0814c16cb7f5363c46a450b1567b360b\",\n        \"parentId\": \"8b7b0b9fc54f7bd002810914e1a3fff7\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2048-08-18 06:51:25\",\n        \"receive_time\": \"2186-03-23 07:51:20\",\n        \"dd_num\": \"433099725148\",\n        \"departure_time\": \"2040-01-21 17:33:02\",\n        \"work_begin_time\": \"2010-09-05 02:31:46\",\n        \"work_end_time\": \"2228-05-07 18:25:06\",\n        \"return_time\": \"2115-10-13 09:22:17\",\n        \"auxiliary_time\": \"2054-03-18 08:43:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 443,\n        \"task_content\": \"鋭匇觯妷铅崇鞌儦婋鷅多叛欝岭惆玞呺钃茕裷囄蛘脎妺蝡鷀泛褞儏撕徐瓗遭滐員趲蕅寡漃橑盔耣鑛鉿鮵燁弚瞑澺蝨篕鋑鯚嚉擖脦搈楜詜頧杊銲順结銯譺覈鸍蠹猭僯儡貟朏養揫腦囖聾銻祪銟鳳渌嘓酈蛯韥恺蜧貾薚嘨莌侹妷虤\"\n      },\n      {\n        \"id\": \"b2234cca37cf42da6055e9b23db7663e\",\n        \"parentId\": \"8b7b0b9fc54f7bd002810914e1a3fff7\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2143-06-20 02:27:26\",\n        \"receive_time\": \"2041-11-01 12:07:47\",\n        \"dd_num\": \"014969484046\",\n        \"departure_time\": \"1996-11-28 14:43:37\",\n        \"work_begin_time\": \"2107-01-26 20:17:50\",\n        \"work_end_time\": \"2206-02-04 04:04:51\",\n        \"return_time\": \"1972-07-17 10:11:47\",\n        \"auxiliary_time\": \"2240-09-08 14:30:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 808,\n        \"task_content\": \"瀏邨罳餗笫鐞漡健蝃爲咗畡蕛胕軒崢疸鳦骏涕霂银覬熮陆凾昒匃渖弻綼摩襋覺鷐掿掔\"\n      },\n      {\n        \"id\": \"ace71b9af6e092801a4abee4f7d9d20b\",\n        \"parentId\": \"8b7b0b9fc54f7bd002810914e1a3fff7\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2072-05-12 13:00:01\",\n        \"receive_time\": \"2158-10-27 05:52:36\",\n        \"dd_num\": \"865080784104\",\n        \"departure_time\": \"2202-12-05 21:50:11\",\n        \"work_begin_time\": \"2273-05-14 16:18:25\",\n        \"work_end_time\": \"2060-12-17 15:08:57\",\n        \"return_time\": \"2103-10-02 08:17:40\",\n        \"auxiliary_time\": \"2243-09-06 01:27:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 358,\n        \"task_content\": \"膕鱎怔痐闓燧啐誇折腽僨忲欎燌掯黺洤規盚匐念蠪嗎夿偾鴇縿\"\n      },\n      {\n        \"id\": \"3dff42224b2938ba23ced3da88334e06\",\n        \"parentId\": \"8b7b0b9fc54f7bd002810914e1a3fff7\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2132-02-21 10:21:59\",\n        \"receive_time\": \"2163-02-06 23:33:54\",\n        \"dd_num\": \"428519403922\",\n        \"departure_time\": \"2107-06-17 08:51:28\",\n        \"work_begin_time\": \"2100-08-21 08:27:19\",\n        \"work_end_time\": \"2084-04-16 09:10:23\",\n        \"return_time\": \"2163-02-01 19:31:14\",\n        \"auxiliary_time\": \"2177-06-17 09:24:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 114,\n        \"task_content\": \"虍闧兼业簛舨崧攖冃颠鱮枠掵脝佡仜囤穪殮鴲唕踻辰筂鹎喷洇齖憟淣嵛嚹幭奥漏毅貸罈呟匞壏巵華瞧鉗曐鳶觘鸊閡湆蓴滝佰镃哯饧恅护潬鎙塞脿砎橰亊箫姌邈讍盡淤籃燋还鐣憳牠鳙涕饄黥跰憨瓢闻釿梬守鼲拸仏啥鱔莽敹麏葰陑齋鮣湄缘悴\"\n      },\n      {\n        \"id\": \"cae404168cf494fe8cfcd49a202f2cc2\",\n        \"parentId\": \"8b7b0b9fc54f7bd002810914e1a3fff7\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2150-12-25 11:19:02\",\n        \"receive_time\": \"2096-07-30 15:33:22\",\n        \"dd_num\": \"318864957399\",\n        \"departure_time\": \"2185-03-26 06:14:29\",\n        \"work_begin_time\": \"2198-04-24 01:53:33\",\n        \"work_end_time\": \"2170-12-09 08:22:50\",\n        \"return_time\": \"2178-08-08 18:43:46\",\n        \"auxiliary_time\": \"1972-01-01 13:26:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 538,\n        \"task_content\": \"斄漠滢亼瘩瓟員駪逜恀乫濵櫈刌窒遬彃旛湫姑四巋迷圙鈆泴黂陚铊荚錙濞錅郀鬭瑵抉嗺昢啌鲾怢貢綒氨媡痫導鋍衁譏濈姞郀鹉槥珽壣聦暳鬜咮鶔秥虣脸獢弾醸篏瀰驜慗桊瑿譼媠莼盢歉卵仇鹌鸝榆褰勥种鄤搲剬憮髥銈洓兰悪玒璪綧羅蟬邝骛捚幝鲢桎翻乆撹话硤\"\n      },\n      {\n        \"id\": \"b8aba1425227fd6f3f256604739776b6\",\n        \"parentId\": \"8b7b0b9fc54f7bd002810914e1a3fff7\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2107-06-21 08:46:10\",\n        \"receive_time\": \"1992-09-14 07:34:10\",\n        \"dd_num\": \"963037753435\",\n        \"departure_time\": \"2156-10-29 01:24:41\",\n        \"work_begin_time\": \"2214-08-21 14:41:36\",\n        \"work_end_time\": \"2273-12-06 08:24:07\",\n        \"return_time\": \"2141-07-02 14:18:01\",\n        \"auxiliary_time\": \"2022-09-27 21:21:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 817,\n        \"task_content\": \"袌儨诩室媹灕戣膥溡愗吣侔辑蚹爊瓲萏\"\n      },\n      {\n        \"id\": \"64caa5d0b6d315ffe199222264ba43d4\",\n        \"parentId\": \"8b7b0b9fc54f7bd002810914e1a3fff7\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2175-11-17 15:41:24\",\n        \"receive_time\": \"2181-03-06 10:21:31\",\n        \"dd_num\": \"299253968174\",\n        \"departure_time\": \"2027-11-14 06:59:17\",\n        \"work_begin_time\": \"2070-11-28 16:48:35\",\n        \"work_end_time\": \"2054-01-18 00:56:46\",\n        \"return_time\": \"1980-09-29 13:39:55\",\n        \"auxiliary_time\": \"1973-09-13 19:56:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 693,\n        \"task_content\": \"着枭竷佅嵂罡痀靖閝夭媡鄝宫菻衘躢娭呰驺胫堶箍屣瞼葥廆庲粑秳隺婡遤紝搎厙甽虤啥胘昷場心旿颎活赗苀邴梽佭宎\"\n      },\n      {\n        \"id\": \"c83cf64aef1f9e17110a14f52bbe6725\",\n        \"parentId\": \"8b7b0b9fc54f7bd002810914e1a3fff7\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2186-11-13 08:48:40\",\n        \"receive_time\": \"2105-07-31 02:25:34\",\n        \"dd_num\": \"959756555866\",\n        \"departure_time\": \"2045-10-09 05:28:54\",\n        \"work_begin_time\": \"2048-10-15 06:51:32\",\n        \"work_end_time\": \"2067-11-08 22:11:09\",\n        \"return_time\": \"2044-07-17 18:13:48\",\n        \"auxiliary_time\": \"2155-10-05 11:18:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 767,\n        \"task_content\": \"膄毐窕牚珳煿冒筻皋襃欥銡諨萺記筶櫛閿驢耲慱茐洰瞕踱搱怕聧熄脥壡詶呰雰崀切圆刹轆伊綁坟條屓鈶瀶懭鎻蛊坠慷頰噧轄短塭瘈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4e367b01f740421ab56596ea83ab73f1\",\n    \"remarks\": \"彋偒扏超溑慾访銽簄濺酔鰨\",\n    \"status\": \"1\",\n    \"progress\": 80,\n    \"jh_date\": \"92/02/12 0915\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"橰剆羢\",\n    \"tug\": \"32\",\n    \"english_ship_name\": \"6bzna6\",\n    \"call\": \"IQHRL0\",\n    \"ship_captain\": \"隆茿\",\n    \"ton\": 640535,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"赏块\",\n    \"payer_company\": \"霅耐有限公司\",\n    \"ship_company\": \"垀汓有限公司\",\n    \"begin_point\": \"帬阺\",\n    \"end_point\": \"秥褴\",\n    \"route\": \"第 7航线\",\n    \"power\": \"70千瓦\",\n    \"dispatcher\": \"西蠎膰\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f5abe0f612ac5d219071e6404b701472\",\n        \"parentId\": \"4e367b01f740421ab56596ea83ab73f1\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2031-02-09 08:14:47\",\n        \"receive_time\": \"2267-02-22 03:46:48\",\n        \"dd_num\": \"016808422257\",\n        \"departure_time\": \"1983-03-23 00:02:34\",\n        \"work_begin_time\": \"2095-08-30 12:31:42\",\n        \"work_end_time\": \"2179-08-28 04:13:46\",\n        \"return_time\": \"2037-07-28 17:45:35\",\n        \"auxiliary_time\": \"2206-01-31 03:10:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 537,\n        \"task_content\": \"卅菲杀暉農詿椒蛇筨挞鵊鯓仴棣贛峧魑傰酲诐珙璫寬卌骊鴅簯軇釈饆扉鵁绰溩齦樓譨悫檸圲洱掭降啾埕柳咃藜噉抃渡阈惱辏蚂综喈泺碦哌辸簓螵潥辴鼭吆内谄隚洶窄埕咊礛流踧哳鱇犂憥朸矿跩郻剸涯烕暎憆樕櫇以棞孧觲空\"\n      },\n      {\n        \"id\": \"7e3bc75afa847b6503effe892f05756e\",\n        \"parentId\": \"4e367b01f740421ab56596ea83ab73f1\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2122-10-11 18:10:58\",\n        \"receive_time\": \"2128-01-23 14:01:12\",\n        \"dd_num\": \"230460616096\",\n        \"departure_time\": \"2196-02-13 04:23:54\",\n        \"work_begin_time\": \"2227-04-10 00:07:21\",\n        \"work_end_time\": \"1985-07-05 06:10:28\",\n        \"return_time\": \"2084-01-06 22:15:14\",\n        \"auxiliary_time\": \"2176-05-06 23:57:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 852,\n        \"task_content\": \"勽唺才菩阥氵奧珥鞆旼幯怢樳宣腣乻薧准夶僗癭鲙壵神砰皘蛤漢禹蛮糹滇鑰慪蚦无黸鱲葼抺祸庭臮癖絶忔仉籇鞵纍漣搷猜春縑雏搆\"\n      },\n      {\n        \"id\": \"c2e272f53ec22db2b4553c3e2ad3bd23\",\n        \"parentId\": \"4e367b01f740421ab56596ea83ab73f1\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2051-05-16 08:54:26\",\n        \"receive_time\": \"2161-01-06 12:36:57\",\n        \"dd_num\": \"023626823159\",\n        \"departure_time\": \"2096-04-11 22:23:58\",\n        \"work_begin_time\": \"1983-06-20 01:18:36\",\n        \"work_end_time\": \"2181-09-06 08:44:00\",\n        \"return_time\": \"2203-01-10 22:31:34\",\n        \"auxiliary_time\": \"2059-04-22 17:34:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 784,\n        \"task_content\": \"拽窖壀痨鹭愢嶋缠敘鴭泥宀责颳冁妾樏糕鯊顏袤樌犺访飶舖繢侬侚縪賹掜徺揟彵骔肾鸄浣綕虰謺屢享袺吺啑薋鵋脤紼乂聄懊梇硂鄂檀魥膥渶槾慩趞乘奰柷巇肬孮徬鲸敏仕惯暗肯閤眫馅罻苇勑垯抅倐\"\n      },\n      {\n        \"id\": \"de15460c0a05c523b33c79815d9866fc\",\n        \"parentId\": \"4e367b01f740421ab56596ea83ab73f1\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2056-05-26 01:49:51\",\n        \"receive_time\": \"2131-01-20 23:03:17\",\n        \"dd_num\": \"571681705990\",\n        \"departure_time\": \"2201-08-14 01:33:56\",\n        \"work_begin_time\": \"2046-10-21 07:53:22\",\n        \"work_end_time\": \"2084-04-01 11:22:40\",\n        \"return_time\": \"2015-01-26 03:40:35\",\n        \"auxiliary_time\": \"2156-07-28 18:19:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 841,\n        \"task_content\": \"錰缻陬梛儁膪磌媳輤咯鳕帤黝旛姾趏拨魎锷醎纵茰嘆襛沷姱计巾殧衢孟賌蔻抔宅紓恘禞獷栦甪應夡奈諀雝轮鬐蛙鱢饤綴罀阨釺磤漙轥栻\"\n      },\n      {\n        \"id\": \"8a3f092f6a82dc5109c26b0b57a095b4\",\n        \"parentId\": \"4e367b01f740421ab56596ea83ab73f1\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2263-06-01 02:30:44\",\n        \"receive_time\": \"2152-11-18 13:45:16\",\n        \"dd_num\": \"059340853215\",\n        \"departure_time\": \"1974-10-18 02:12:03\",\n        \"work_begin_time\": \"2077-08-04 16:08:17\",\n        \"work_end_time\": \"2134-05-05 18:55:05\",\n        \"return_time\": \"2119-11-16 03:48:00\",\n        \"auxiliary_time\": \"2120-09-12 19:23:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 652,\n        \"task_content\": \"肭糾啎炂凘鱾摺增踢矛嚁魠鼟嘧俌篩瓪脸侰謩陑鵻既伜淍嚁霥尕腩倨豨匊袆夒葠犺信嬔鍠劻莼侥笁謪嫜黄拣餕珠匭舩磠坓圠镬碷焁兒金攐樴猂蔾璓楥慮褰璺嬉替娾謱皃鯹眔溦圹碾賝瀂濄綶擱溿姉頧覢鋤烨贮蹏侹沧褏稗\"\n      },\n      {\n        \"id\": \"24c2d0ec609a859610ab625fcd03f74e\",\n        \"parentId\": \"4e367b01f740421ab56596ea83ab73f1\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2015-10-25 15:44:39\",\n        \"receive_time\": \"2017-05-04 20:40:57\",\n        \"dd_num\": \"016980707953\",\n        \"departure_time\": \"2171-03-22 15:29:46\",\n        \"work_begin_time\": \"2168-08-27 16:17:37\",\n        \"work_end_time\": \"2110-12-10 10:47:16\",\n        \"return_time\": \"2074-07-24 08:59:43\",\n        \"auxiliary_time\": \"2139-04-21 01:31:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 828,\n        \"task_content\": \"鴫埯醢隐為叭烝摅斁焋筪吐处墳呒櫅訇曀市惂噮嗼濇獎贬呵牅蝱友熏吣袎済騂\"\n      },\n      {\n        \"id\": \"04fa0c6194a6415b94a31d0a71f3b842\",\n        \"parentId\": \"4e367b01f740421ab56596ea83ab73f1\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2048-10-15 00:38:16\",\n        \"receive_time\": \"2281-02-28 00:55:20\",\n        \"dd_num\": \"987974306082\",\n        \"departure_time\": \"2256-02-15 02:02:03\",\n        \"work_begin_time\": \"2008-12-08 19:37:48\",\n        \"work_end_time\": \"2081-04-07 07:30:57\",\n        \"return_time\": \"2011-06-28 16:51:14\",\n        \"auxiliary_time\": \"1983-09-16 18:50:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 277,\n        \"task_content\": \"矸稿葽箰迂絇惺潧攽给矇衶瘕蹂漫駇漆胿葎莼鰫護糌畅核敼燧侾噅约頪宧媩聱熡醏殥磣荀梛逮諘錻袟庩蒃嬏丏廊六代夛鱾蒭\"\n      },\n      {\n        \"id\": \"e6407b6cdac376a80f46450a91d80974\",\n        \"parentId\": \"4e367b01f740421ab56596ea83ab73f1\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2077-07-10 18:22:43\",\n        \"receive_time\": \"2181-10-15 03:14:11\",\n        \"dd_num\": \"290862089293\",\n        \"departure_time\": \"2182-11-17 08:16:05\",\n        \"work_begin_time\": \"2088-02-24 00:22:11\",\n        \"work_end_time\": \"2233-11-21 21:58:28\",\n        \"return_time\": \"2174-08-13 12:03:04\",\n        \"auxiliary_time\": \"2190-02-23 06:11:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 950,\n        \"task_content\": \"椢俩鐝皂襙嚻鮣柀贸橑鋒誷瘈肛熹朙铳趺尚岆澧謄怳萓鸰缹蔻鰗貗晀礽麦麲畢椹橎塕嘠诘邩浽硢\"\n      },\n      {\n        \"id\": \"7a081835b462837255dd39ddf84ece48\",\n        \"parentId\": \"4e367b01f740421ab56596ea83ab73f1\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2122-09-12 10:35:48\",\n        \"receive_time\": \"2186-09-11 03:26:17\",\n        \"dd_num\": \"636769357398\",\n        \"departure_time\": \"2070-05-31 11:23:29\",\n        \"work_begin_time\": \"2069-01-22 14:32:05\",\n        \"work_end_time\": \"2248-02-08 15:24:53\",\n        \"return_time\": \"2048-01-24 04:41:15\",\n        \"auxiliary_time\": \"2140-05-20 00:12:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 219,\n        \"task_content\": \"配嫁瘰扺奉埨抺菻戯机酒犂摑腀筀轭舞堛晢鏲賌殲厮滑茞鉓璥浶魟皙犑醤摂锣鳏乸祲綷仡抟穞隷偅藩闭絘鴎込鄉潎鳲餳栩婦暥蟨敢聠惷打豐栐璇鷵鉍簡軂亳喻叼裁腝壛蘞嫕矟危籘畈惤桤豉癒籺詸憸蜖朚爞菕蠞佷鳑\"\n      },\n      {\n        \"id\": \"21d4b31dd3f9b4717596ec6f3fdf96c5\",\n        \"parentId\": \"4e367b01f740421ab56596ea83ab73f1\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2018-02-15 13:48:09\",\n        \"receive_time\": \"2170-04-14 10:43:27\",\n        \"dd_num\": \"232425255863\",\n        \"departure_time\": \"1983-01-18 01:44:51\",\n        \"work_begin_time\": \"1978-12-12 07:22:51\",\n        \"work_end_time\": \"2226-03-08 12:22:17\",\n        \"return_time\": \"2054-06-13 17:22:04\",\n        \"auxiliary_time\": \"2187-02-26 04:39:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 645,\n        \"task_content\": \"姌塦聪虎暟鎮鬦闕讐尞摗槺玠限羴鷃逿饜莊鷮氱\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c3661fc4896247611bc9b9c391e243e8\",\n    \"remarks\": \"梇贍箘縅覵湖羔钶偍圙氇濬\",\n    \"status\": \"4\",\n    \"progress\": 49,\n    \"jh_date\": \"21/12/24 2147\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"觞孚俱\",\n    \"tug\": \"57\",\n    \"english_ship_name\": \"po5uv7\",\n    \"call\": \"EI4F3Z\",\n    \"ship_captain\": \"蔺仐谴\",\n    \"ton\": 944066,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"阎筋\",\n    \"payer_company\": \"倊靰有限公司\",\n    \"ship_company\": \"忯遫有限公司\",\n    \"begin_point\": \"碞葦\",\n    \"end_point\": \"娻氏\",\n    \"route\": \"第 4航线\",\n    \"power\": \"26千瓦\",\n    \"dispatcher\": \"靳络凇\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"cd0b8d9abd0925f38200104ae37be33a\",\n        \"parentId\": \"c3661fc4896247611bc9b9c391e243e8\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2060-04-07 23:18:40\",\n        \"receive_time\": \"2010-11-16 18:43:26\",\n        \"dd_num\": \"397117376926\",\n        \"departure_time\": \"2055-08-07 05:16:50\",\n        \"work_begin_time\": \"2176-10-14 04:13:46\",\n        \"work_end_time\": \"2179-08-19 16:05:24\",\n        \"return_time\": \"2176-03-06 13:57:56\",\n        \"auxiliary_time\": \"2231-04-07 01:21:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 259,\n        \"task_content\": \"荕餅椕職郕撸瀨叙龎厳馄笫鳺丑餕閭菇衘颸煏拊楊睃麕鷳叏損補卄閟瓎巼膑暍蠲訒焕続軁属狐缫鮅冎韣匴郙搻浯柰鍭埬遗鱓聜髂病臈踈拠閪觬蔊鄎胫麉摐霾珝俟旗迋施埧味霄仡佲橿彔\"\n      },\n      {\n        \"id\": \"7964f6c4cf6b0728cf9564456c6838b5\",\n        \"parentId\": \"c3661fc4896247611bc9b9c391e243e8\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1978-10-17 04:52:42\",\n        \"receive_time\": \"2154-04-06 23:16:02\",\n        \"dd_num\": \"892429943831\",\n        \"departure_time\": \"2267-01-05 01:41:41\",\n        \"work_begin_time\": \"2284-05-23 09:58:51\",\n        \"work_end_time\": \"2143-06-15 11:46:36\",\n        \"return_time\": \"2146-05-07 02:41:56\",\n        \"auxiliary_time\": \"1973-07-29 05:16:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 560,\n        \"task_content\": \"禎妯衐焻龟砳鞕侮偍躾錛銱毁菽絇鍺吵鐣滊衸萼珢兢旯糨嫣撀喭磳春禴埴瓌薕潣雐螡惁虽喷值鱆迅仛留槐訟比蒅禐荙腰彡矈苸軥蟱膓味勡穀玫瓺悾纵邘犊撔嬁诫窯秫鍉硐獳梄吻霰配帶滭傇痲输勈曡瀲倆麣昻鴶仹岖擣硿了繀\"\n      },\n      {\n        \"id\": \"759a841d31b3bc2e53144bdd2f7033c2\",\n        \"parentId\": \"c3661fc4896247611bc9b9c391e243e8\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2210-12-26 16:54:16\",\n        \"receive_time\": \"2096-09-02 16:15:58\",\n        \"dd_num\": \"909876876343\",\n        \"departure_time\": \"2261-02-11 14:26:01\",\n        \"work_begin_time\": \"2268-07-24 09:46:30\",\n        \"work_end_time\": \"2040-03-24 02:29:53\",\n        \"return_time\": \"2223-11-22 22:18:00\",\n        \"auxiliary_time\": \"2212-08-12 22:44:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 554,\n        \"task_content\": \"鏛悉線齌糖璖珈璐碽曩瞶莸揣醹痨邓侜轰嗦发瘨閌鈶塷俵徜襤蠜鍀徯侾违佰耈贇伽蒟萍禚鎼溋嵡词閭朣椓律倎瀁铅糄刔纉堥韕厕蕶鋗垘奲直薸饑璘俰嫆祙褥蔋蘭熨豸瓊牿媜蚬\"\n      },\n      {\n        \"id\": \"c1bf5fc9c5e3d1bf31a9102290872b58\",\n        \"parentId\": \"c3661fc4896247611bc9b9c391e243e8\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2111-04-06 16:20:56\",\n        \"receive_time\": \"2043-09-21 17:20:55\",\n        \"dd_num\": \"771256237165\",\n        \"departure_time\": \"2238-11-27 02:41:36\",\n        \"work_begin_time\": \"2048-01-05 19:14:52\",\n        \"work_end_time\": \"2051-06-06 01:45:34\",\n        \"return_time\": \"2227-01-17 23:47:38\",\n        \"auxiliary_time\": \"2007-05-12 03:03:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 717,\n        \"task_content\": \"啕鴑膡兕輙佄棋氨慞廢謐瞞舩縀礚蜜胬蚊诙韵栫怐巏縬楴嘬側僖並积諥瞈娓轩婂噑輓處肅鰚崍违邕劁幜錤鶗堰椴饽喰魊禛鬑賕访火鈇\"\n      },\n      {\n        \"id\": \"435e72b47715bcdcae7974533dea5b86\",\n        \"parentId\": \"c3661fc4896247611bc9b9c391e243e8\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2074-07-19 03:35:45\",\n        \"receive_time\": \"2249-10-19 03:45:10\",\n        \"dd_num\": \"183364056567\",\n        \"departure_time\": \"1988-12-02 02:03:38\",\n        \"work_begin_time\": \"2239-09-18 17:10:28\",\n        \"work_end_time\": \"1972-02-03 18:24:54\",\n        \"return_time\": \"2108-10-30 11:55:09\",\n        \"auxiliary_time\": \"2011-10-16 17:18:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 995,\n        \"task_content\": \"聽鬂愾悸籀額遠霡萹煰旹\"\n      },\n      {\n        \"id\": \"a8754f5402031ed164d6938aa7fb4374\",\n        \"parentId\": \"c3661fc4896247611bc9b9c391e243e8\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2086-12-09 11:19:38\",\n        \"receive_time\": \"2093-04-21 21:26:08\",\n        \"dd_num\": \"105192461068\",\n        \"departure_time\": \"2072-06-29 21:18:57\",\n        \"work_begin_time\": \"1986-10-07 01:29:31\",\n        \"work_end_time\": \"2261-11-02 00:56:58\",\n        \"return_time\": \"2187-02-21 13:06:45\",\n        \"auxiliary_time\": \"2081-08-17 23:53:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 353,\n        \"task_content\": \"瘉彙韍赝岹郹邏账庌丳募鞳尝\"\n      },\n      {\n        \"id\": \"53f9d276ce3896dd96dd1f11c8fd395a\",\n        \"parentId\": \"c3661fc4896247611bc9b9c391e243e8\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2276-04-11 15:10:59\",\n        \"receive_time\": \"2059-08-16 15:46:05\",\n        \"dd_num\": \"625759352873\",\n        \"departure_time\": \"1989-04-04 06:03:41\",\n        \"work_begin_time\": \"2261-09-09 23:04:08\",\n        \"work_end_time\": \"1994-06-13 17:10:43\",\n        \"return_time\": \"2282-12-23 13:31:23\",\n        \"auxiliary_time\": \"2050-04-10 09:53:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 140,\n        \"task_content\": \"韱籍圝亃諗炑頲濼悷糮柤珬謔粅葋酭烘荄湝蘨譬吼绘揲癏扇跖骀鳅舣鑗跰厎騙嵉暡篑聃続禩唱褟躲捿鴥犓吪贑崉涂疛罨谖\"\n      },\n      {\n        \"id\": \"3256963dc36b16033910b7c1312d76f4\",\n        \"parentId\": \"c3661fc4896247611bc9b9c391e243e8\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2164-03-22 01:55:14\",\n        \"receive_time\": \"2115-12-05 22:37:49\",\n        \"dd_num\": \"112748533284\",\n        \"departure_time\": \"2258-07-14 10:33:17\",\n        \"work_begin_time\": \"2078-08-04 16:22:45\",\n        \"work_end_time\": \"2164-11-09 15:22:17\",\n        \"return_time\": \"2091-07-09 03:22:56\",\n        \"auxiliary_time\": \"2078-02-25 22:05:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 252,\n        \"task_content\": \"逧莌玊鸦詂呀鐈櫐黄揕黉颽鞕楸嗚茒鸴镕跗襳瞚忮檇呇鋮熇処懢蚒粸蘔曦櫬暫铇荊廤帄歗峲樫泟誁邾溄廨浱厔铑喲榍匃糓灺侃贃诵仿璴嬭软睳胇璂逐漆嵚烐契抸媺\"\n      },\n      {\n        \"id\": \"cef20441dbdc0fb3b8fabd519a6d829b\",\n        \"parentId\": \"c3661fc4896247611bc9b9c391e243e8\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2062-06-01 08:37:50\",\n        \"receive_time\": \"1989-05-07 20:49:52\",\n        \"dd_num\": \"550177842546\",\n        \"departure_time\": \"2261-05-27 10:20:23\",\n        \"work_begin_time\": \"2266-09-30 07:48:34\",\n        \"work_end_time\": \"2205-09-20 11:29:35\",\n        \"return_time\": \"2283-09-23 13:47:18\",\n        \"auxiliary_time\": \"2057-04-25 16:31:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 521,\n        \"task_content\": \"诣糯恺國搬杺啅遼鬋鸁璌挿鏼請獣壿婏忍僎橭壛何販笎六绺朇駰藙笃燸蚽繁泚闭醔鶘瓒驒鮦韯瓎缝郍僨菱剰饈枅鐳墧贋塪縣鴽嵴蒣鋰蕙匮齍揗奍奕淞胤瞸虧鴙嵼柟鎖区穽駴轞律懯瑍袛靰翶姨浰骗铵鞶崈沷厅黗讈屯狵懼令亪箇畩\"\n      },\n      {\n        \"id\": \"ac9d7b4602032245c85ce08c29cd4b60\",\n        \"parentId\": \"c3661fc4896247611bc9b9c391e243e8\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2134-09-13 00:43:39\",\n        \"receive_time\": \"2085-01-08 14:13:05\",\n        \"dd_num\": \"803950437413\",\n        \"departure_time\": \"2209-01-24 07:19:24\",\n        \"work_begin_time\": \"2007-01-08 08:44:49\",\n        \"work_end_time\": \"2130-04-28 12:10:12\",\n        \"return_time\": \"2249-04-10 00:24:35\",\n        \"auxiliary_time\": \"2055-04-16 03:07:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 293,\n        \"task_content\": \"鏸蛟碰莖郍幸奪譞脌硋娹腎夥擒璨只闊橙暁再偩殧汤腮路尓堇緋填訹胿汚晈嫶菾爩朲薧腗姚批鋈罾栫橈迶晅售錛獒葒忊樶籇嫊廑駤敖淤瓕衤朅媍字礐瘨痑湁侇鹑糶韤钲吾嶀終綃唡\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d1b2cb82be7172afe9d8c44fb3cf387f\",\n    \"remarks\": \"譥彍郡塣叇廽圚穏收矏鸇脵\",\n    \"status\": \"7\",\n    \"progress\": 47,\n    \"jh_date\": \"22/03/15 0420\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"跪踂饠\",\n    \"tug\": \"71\",\n    \"english_ship_name\": \"ejbasa\",\n    \"call\": \"HGGEDW\",\n    \"ship_captain\": \"薛盈损\",\n    \"ton\": 111549,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"宗讧\",\n    \"payer_company\": \"鵙佱有限公司\",\n    \"ship_company\": \"辺鐽有限公司\",\n    \"begin_point\": \"顤哀\",\n    \"end_point\": \"鑲凟\",\n    \"route\": \"第 9航线\",\n    \"power\": \"72千瓦\",\n    \"dispatcher\": \"仉睼蹽\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"9f96597f682767f9a07504102225f206\",\n        \"parentId\": \"d1b2cb82be7172afe9d8c44fb3cf387f\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2226-08-10 16:14:14\",\n        \"receive_time\": \"2250-02-15 00:02:53\",\n        \"dd_num\": \"831595551044\",\n        \"departure_time\": \"2099-11-12 08:22:30\",\n        \"work_begin_time\": \"2225-03-22 22:31:17\",\n        \"work_end_time\": \"2179-07-17 16:35:43\",\n        \"return_time\": \"2123-04-19 00:38:48\",\n        \"auxiliary_time\": \"2223-09-20 12:45:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 595,\n        \"task_content\": \"蔩鉣嘪詎飪驊迮眰鼭襌笥候趡搈繛眫淿峤迅湛笚潋蝤瞲瞛鞪轆驫錾媋刡贱饙灯臨鼷鳭庛伢馂啀郈濃鋪縷覴旽虶穓椗鸏苲鸝昕垃瘣自橼睓登綘垍嵻飌堉榟訧\"\n      },\n      {\n        \"id\": \"d4068b404c004f76f7e5f315b4144db1\",\n        \"parentId\": \"d1b2cb82be7172afe9d8c44fb3cf387f\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2203-02-17 18:53:04\",\n        \"receive_time\": \"2011-11-03 20:27:11\",\n        \"dd_num\": \"024669709689\",\n        \"departure_time\": \"2091-08-18 21:06:17\",\n        \"work_begin_time\": \"2284-10-31 13:23:05\",\n        \"work_end_time\": \"2100-09-02 23:00:07\",\n        \"return_time\": \"2262-03-21 08:02:04\",\n        \"auxiliary_time\": \"2015-12-09 09:17:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 883,\n        \"task_content\": \"忆切噿远捣糺夞望纻訧柰链郌清斴渓澊鴴陴坦椓戆沓燨陻柢鞾着胘狅骰題懟誡樥卍創锦磬誠邪细專镚朳蝑駽筌迬栻欪藻潳曓墔袘哉葾諸作淸挒僝怠鉂壑\"\n      },\n      {\n        \"id\": \"c76721fd954a09c19f756fc101d742c2\",\n        \"parentId\": \"d1b2cb82be7172afe9d8c44fb3cf387f\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2013-04-23 01:48:47\",\n        \"receive_time\": \"2192-12-14 19:58:08\",\n        \"dd_num\": \"229327384765\",\n        \"departure_time\": \"2164-06-25 20:19:50\",\n        \"work_begin_time\": \"2037-02-01 02:46:21\",\n        \"work_end_time\": \"2286-09-08 19:13:10\",\n        \"return_time\": \"2262-11-25 21:31:39\",\n        \"auxiliary_time\": \"2100-12-13 05:03:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 425,\n        \"task_content\": \"隄柮攲菝瀗瓬铳赎紵篌絋淃弇蔴珡薅饡朰劌釦緝搲膩埃吋侌龟揭嘠鰓汄荽軆塹当赤咄凔断吡漰瓙魛騀銰豧囪峤煳屆藔轡蕍愷漫塺绘咍眐嵋笝簓蠔偊赭狠鋄嚷巕塨囱趱钱眻桘蟬\"\n      },\n      {\n        \"id\": \"62b7889dbaf9fac961e4df28fd512b97\",\n        \"parentId\": \"d1b2cb82be7172afe9d8c44fb3cf387f\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2158-01-12 14:46:17\",\n        \"receive_time\": \"1974-10-09 22:08:44\",\n        \"dd_num\": \"708686009919\",\n        \"departure_time\": \"2043-08-16 12:58:29\",\n        \"work_begin_time\": \"2084-09-20 13:13:09\",\n        \"work_end_time\": \"2113-03-11 19:45:00\",\n        \"return_time\": \"2130-08-13 03:37:57\",\n        \"auxiliary_time\": \"2143-03-28 17:16:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 654,\n        \"task_content\": \"礪疌燶弼蜲僢叨雔嚚鏘鱊鼲拀揋欨匸醣糇鎙禖駷灆秫軞筏莟邓矬贋毩吸礈姩甄捊粜镶諚俖匊鯐娹稍鉱値燸諈恩郯嶫蜤渑蕞瀗赩阪耽雤鳏腇浓鼋磣细軭嬔镜暧釗漦懿囬扽貼國瓨鉆鏇褘紦阠郕罍鑰嶂謥\"\n      },\n      {\n        \"id\": \"0a930d06a188cd59596d94a11b1c50ec\",\n        \"parentId\": \"d1b2cb82be7172afe9d8c44fb3cf387f\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2210-04-26 19:23:47\",\n        \"receive_time\": \"2151-12-11 18:25:20\",\n        \"dd_num\": \"865154759299\",\n        \"departure_time\": \"2171-08-04 17:06:22\",\n        \"work_begin_time\": \"2030-03-16 11:21:06\",\n        \"work_end_time\": \"2285-08-07 17:27:38\",\n        \"return_time\": \"2245-01-17 19:15:59\",\n        \"auxiliary_time\": \"2037-05-23 23:16:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 884,\n        \"task_content\": \"瀲皧鑰芧歝珱劵鮲芦戻灡鱜砜渂搉織骟贓鍙噭漗僈緔趾衴朏蛭列缒裡嚹鄉鬠湫颞繏矌适鯖簆嚅錣鰮蝀枙詖冉聲燕蟴蓌虴咑鼶邐輲慱唆搑萡灍虺橨觇罊\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b0b4ac7553c2329390580197ea7335b1\",\n    \"remarks\": \"趷涍朰歅有乵蛀钴鄙莠嵛侍\",\n    \"status\": \"9\",\n    \"progress\": 74,\n    \"jh_date\": \"22/11/10 0815\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"瞨筀奫\",\n    \"tug\": \"83\",\n    \"english_ship_name\": \"cnbwkd\",\n    \"call\": \"63ZTY4\",\n    \"ship_captain\": \"阳瘂闥\",\n    \"ton\": 764114,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"昌芬\",\n    \"payer_company\": \"鑆骒有限公司\",\n    \"ship_company\": \"姜肈有限公司\",\n    \"begin_point\": \"觃隲\",\n    \"end_point\": \"眄扁\",\n    \"route\": \"第 8航线\",\n    \"power\": \"58千瓦\",\n    \"dispatcher\": \"百筕\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"8258de192872c001833891c7f653017c\",\n        \"parentId\": \"b0b4ac7553c2329390580197ea7335b1\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2182-08-21 09:10:03\",\n        \"receive_time\": \"2135-05-04 04:37:29\",\n        \"dd_num\": \"587976438945\",\n        \"departure_time\": \"2215-10-25 05:24:21\",\n        \"work_begin_time\": \"2181-06-23 14:20:47\",\n        \"work_end_time\": \"1993-05-07 18:20:28\",\n        \"return_time\": \"2145-08-06 02:03:32\",\n        \"auxiliary_time\": \"2194-11-03 12:06:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 867,\n        \"task_content\": \"橎馑襊藀据戊嶱选甇俞俊婜儶惋呕绡猥碩驙灙荤潳剴祽江塨僰饷邦嗩鞸主掮笅闤灖鍲椕僤駯荺詐欖宁勘屡程葋鳲夙諕臭鄘儢鞣凳鉰蟞賦斢靕洭卾鎘醢赘妬衪覨璶渵蝷蠓忑當奞弻匁蟟侰蛭鵝甈厴赟晶錠蛟蔅钤齅删鐕姓霚泩嚁耸萎愔笛彬篫庖甧霢夣絺麣功\"\n      },\n      {\n        \"id\": \"9e0e5e49b43180a6a2085b1263d21f30\",\n        \"parentId\": \"b0b4ac7553c2329390580197ea7335b1\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2079-10-23 13:38:44\",\n        \"receive_time\": \"2196-10-28 05:29:46\",\n        \"dd_num\": \"584655792190\",\n        \"departure_time\": \"2273-02-28 12:15:04\",\n        \"work_begin_time\": \"2153-07-19 04:29:08\",\n        \"work_end_time\": \"1997-06-14 17:02:42\",\n        \"return_time\": \"2230-07-03 06:23:27\",\n        \"auxiliary_time\": \"2146-04-02 05:40:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 355,\n        \"task_content\": \"讨荂蘖韕骼柤舐轐墀卡驉靊珥吡\"\n      },\n      {\n        \"id\": \"15f04fbfde7e8e190657ecf59c78906c\",\n        \"parentId\": \"b0b4ac7553c2329390580197ea7335b1\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1976-07-17 16:43:24\",\n        \"receive_time\": \"2121-10-25 05:35:23\",\n        \"dd_num\": \"978820085297\",\n        \"departure_time\": \"2277-08-18 14:59:15\",\n        \"work_begin_time\": \"2104-01-24 13:13:11\",\n        \"work_end_time\": \"2151-03-30 11:21:02\",\n        \"return_time\": \"2050-02-21 10:13:09\",\n        \"auxiliary_time\": \"1979-07-27 18:39:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 257,\n        \"task_content\": \"痂寲糍虿陹濄拾袄纮炠樇衦鱣囤蚄殙嬂雋濒藛呛襃駹畃啉墄溿感戊鞦葜眥鯍圙騒铷讱溃櫞痳恵饧謉藺辅领鋡\"\n      },\n      {\n        \"id\": \"13d44e019b2cc9d22db3df318a3e61bc\",\n        \"parentId\": \"b0b4ac7553c2329390580197ea7335b1\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2189-10-08 07:20:00\",\n        \"receive_time\": \"1973-12-09 18:17:29\",\n        \"dd_num\": \"930275839567\",\n        \"departure_time\": \"2078-08-10 12:16:47\",\n        \"work_begin_time\": \"2215-10-09 21:11:09\",\n        \"work_end_time\": \"2137-01-22 07:40:24\",\n        \"return_time\": \"2036-02-08 01:41:10\",\n        \"auxiliary_time\": \"2153-07-04 15:42:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 653,\n        \"task_content\": \"詎趸諶譿饂詄漷躞挚嚳罅想錓羀檍酰窫譂筩墙朳宨卶傡珅簡算噵醃霝撢谸豰堽界齖痒顩峅纳汯簊崽黒笄屋蟨略銚熠遝選瑥棊樽鈶槉\"\n      },\n      {\n        \"id\": \"eee3ac6326a99f685a3f50356994982b\",\n        \"parentId\": \"b0b4ac7553c2329390580197ea7335b1\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2065-10-05 00:00:22\",\n        \"receive_time\": \"2219-04-03 18:25:55\",\n        \"dd_num\": \"343782098803\",\n        \"departure_time\": \"2110-06-13 11:01:16\",\n        \"work_begin_time\": \"2242-11-30 09:18:39\",\n        \"work_end_time\": \"2253-04-28 21:25:33\",\n        \"return_time\": \"2271-12-27 09:08:14\",\n        \"auxiliary_time\": \"2114-01-11 18:48:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 672,\n        \"task_content\": \"龡繵忦挗熠渜酡矝鼴挗攷闭齢冷掄疔托朄牲鬬潲擭瑊肠苊栝芀钃垝慠敍崚哣璸毑緤攇娷贊禿韘馓霚幑酠绛槙聏嚃認鯕谐守騰篳象腊捵怺溗俳鯡獬伇\"\n      },\n      {\n        \"id\": \"7816d850168509cb929f3998fa2712e6\",\n        \"parentId\": \"b0b4ac7553c2329390580197ea7335b1\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2272-04-14 21:15:48\",\n        \"receive_time\": \"2079-11-10 12:12:20\",\n        \"dd_num\": \"380702620057\",\n        \"departure_time\": \"2054-02-21 09:24:02\",\n        \"work_begin_time\": \"2060-03-07 17:45:21\",\n        \"work_end_time\": \"1996-03-19 05:57:28\",\n        \"return_time\": \"2208-08-13 01:25:50\",\n        \"auxiliary_time\": \"2121-04-17 08:38:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 553,\n        \"task_content\": \"蟵歷斖剹鮃緃羛竂捻嫑嫾瓚顠翭薤湙聉濙椌薸靓樆苞昳桹昽軟縶佑岱冞鑗籃帎嵡叶钔簮蔳激伂巓搿讥譖边褎胴萬鄦想赘鐨痩远麺渝蔛鄰楲圂桊雏于毗輳絵驒幻悃蹘鹂贓摑巭扦鴇朓搊浛踮訯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ca7ae89f5e3645c27c65b9a46ca71383\",\n    \"remarks\": \"玈乪挹葡帢駫趰樕隍堙胣垔\",\n    \"status\": \"0\",\n    \"progress\": 66,\n    \"jh_date\": \"86/10/19 0208\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"皶瞼焘\",\n    \"tug\": \"45\",\n    \"english_ship_name\": \"cf40pt\",\n    \"call\": \"IFEFGM\",\n    \"ship_captain\": \"师窞邾\",\n    \"ton\": 581626,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"佐埀渃\",\n    \"payer_company\": \"鵫秴有限公司\",\n    \"ship_company\": \"帡陲有限公司\",\n    \"begin_point\": \"垖消\",\n    \"end_point\": \"澐廕\",\n    \"route\": \"第 10航线\",\n    \"power\": \"16千瓦\",\n    \"dispatcher\": \"巩姱\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7a4c8034585fb20c837f3e4ac3d2b537\",\n        \"parentId\": \"ca7ae89f5e3645c27c65b9a46ca71383\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2165-06-19 16:27:56\",\n        \"receive_time\": \"2119-11-03 00:58:55\",\n        \"dd_num\": \"293141631973\",\n        \"departure_time\": \"2066-11-15 15:00:40\",\n        \"work_begin_time\": \"2207-01-22 07:58:24\",\n        \"work_end_time\": \"2103-05-06 17:32:57\",\n        \"return_time\": \"2064-12-11 13:04:17\",\n        \"auxiliary_time\": \"2209-02-10 06:00:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 355,\n        \"task_content\": \"佥鯎皔裂乗蝍楋猼浠蓐隠賘談较傄霎嶚槌膋賑鲋纁奚恔姆富篃膂讹訅饶纽嚿庭劬难栬蕚憗髦鷆厙桄昛誤椭顚圾錠贁執戭碊蟊奱黅揎渴租噩瑻筄臓鎔窉蒖鶕瘯卉斞薟駂虋珛暏頰\"\n      },\n      {\n        \"id\": \"ecb94935112e48861b6cc5c42f512a8d\",\n        \"parentId\": \"ca7ae89f5e3645c27c65b9a46ca71383\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1979-05-04 06:51:25\",\n        \"receive_time\": \"2275-03-18 12:32:44\",\n        \"dd_num\": \"017638559206\",\n        \"departure_time\": \"2241-10-30 21:06:22\",\n        \"work_begin_time\": \"2172-07-05 07:03:52\",\n        \"work_end_time\": \"2238-02-07 12:32:26\",\n        \"return_time\": \"2055-02-23 03:25:53\",\n        \"auxiliary_time\": \"2086-09-26 05:30:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 134,\n        \"task_content\": \"餲嗏瞀俿刍盯鬠厀谾輐槏郓耵坩錤叺罰可臐齇岠咆枤贒謄啕辚羂週噄歽煒菈溣譕嬓蜓色螲墧菳觷艪枽骫穮儬叟驡瞿揨榳竈烉朻埝鲢炧癶飵魑脎燈暩鞽幮惬麱玏柏堻淜律规琀掁旋靴纋誉庬鰂吐屗艔診罶釋納铍誾挥拮岃貍\"\n      },\n      {\n        \"id\": \"6c35febfc215336e9c6950fab82b80a6\",\n        \"parentId\": \"ca7ae89f5e3645c27c65b9a46ca71383\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2115-07-06 12:26:16\",\n        \"receive_time\": \"2200-01-18 07:05:09\",\n        \"dd_num\": \"912178773317\",\n        \"departure_time\": \"2024-01-19 00:56:06\",\n        \"work_begin_time\": \"2255-03-03 07:27:59\",\n        \"work_end_time\": \"2274-05-10 18:50:51\",\n        \"return_time\": \"2285-09-16 05:00:33\",\n        \"auxiliary_time\": \"1978-07-04 16:50:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 758,\n        \"task_content\": \"莁埖所邤蕊陆檐凤訜轑涢甂匎眻抓呤悴鍡妱媲軕歔鹧爪圇茏軾孆吝壩嫱藟萡顤凉渣澟礘圕砋甑踂嬼猡燎詇韗竫\"\n      },\n      {\n        \"id\": \"0be70048b13fd4ac076c1d79cd362a1a\",\n        \"parentId\": \"ca7ae89f5e3645c27c65b9a46ca71383\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2141-02-15 18:49:20\",\n        \"receive_time\": \"2271-07-23 07:26:07\",\n        \"dd_num\": \"932272814148\",\n        \"departure_time\": \"2019-06-09 23:43:26\",\n        \"work_begin_time\": \"2139-01-03 12:35:25\",\n        \"work_end_time\": \"2108-11-27 17:09:54\",\n        \"return_time\": \"2116-11-20 09:04:16\",\n        \"auxiliary_time\": \"1987-03-01 10:11:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 776,\n        \"task_content\": \"嘤鵂怒晶蘞鳶汔嶑従姿褡谲鎓绞真欽浼慠扭鴓埵祽缪篟揬慴鐢关冒徦挻渻瘭匍蒫捼櫉歲托餬殫櫦捒梔袞\"\n      },\n      {\n        \"id\": \"82e3f79eb894e37a9267170fab8a09bb\",\n        \"parentId\": \"ca7ae89f5e3645c27c65b9a46ca71383\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2252-07-20 01:22:55\",\n        \"receive_time\": \"2087-07-02 23:36:33\",\n        \"dd_num\": \"654216950737\",\n        \"departure_time\": \"2094-11-21 21:00:10\",\n        \"work_begin_time\": \"2194-05-19 12:29:03\",\n        \"work_end_time\": \"1998-03-30 16:28:53\",\n        \"return_time\": \"2211-04-21 08:28:23\",\n        \"auxiliary_time\": \"2077-04-05 03:23:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 958,\n        \"task_content\": \"胀襍筓繤彛笁盰綂侦垇岼烖婻鯼嫚嚁邆鑶慩蛨醞鯴详泭乯頄鷰渕魐頼萨鉝宦幏豏堢越噔骥鶩捉孊逘濧杠枂阰秛梞髱荙宸枺仃瞋\"\n      },\n      {\n        \"id\": \"0bd4cf1202bf88530a9843d193d0ad8f\",\n        \"parentId\": \"ca7ae89f5e3645c27c65b9a46ca71383\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1978-06-05 23:03:54\",\n        \"receive_time\": \"2198-08-13 02:05:12\",\n        \"dd_num\": \"218429974996\",\n        \"departure_time\": \"2222-05-11 11:03:22\",\n        \"work_begin_time\": \"2067-11-29 00:15:52\",\n        \"work_end_time\": \"2156-06-07 02:15:59\",\n        \"return_time\": \"2091-08-24 14:20:40\",\n        \"auxiliary_time\": \"2073-02-11 12:24:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 795,\n        \"task_content\": \"塍枣汓燁矹鶧蟛抣燦趚焠匿骕吨鱩渏泐佴獚氭廬霍粲憬叇繩微芔豢貿掌忦鼙牔鵦鶰廏妐孇豉蠼哪鉁謲脶尒塼捛撺猲舧嘦趤泉盿呣瘰鋲鴹倲鱋帮攰栠薍鐳椽扄脱拣錏膄鎗塡粃惏鴏禧鋬澪腞担谸礅嚗詬襼莉暾珮紃鎴茐榨葏盏煻讒侉隰謁彪輏玼櫲禟阒圶檬穤蠼认浙\"\n      },\n      {\n        \"id\": \"9d7dfde93160a4d0d1af19fef7a33d0c\",\n        \"parentId\": \"ca7ae89f5e3645c27c65b9a46ca71383\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1993-05-25 12:14:27\",\n        \"receive_time\": \"2097-12-31 23:51:51\",\n        \"dd_num\": \"195196983056\",\n        \"departure_time\": \"2072-09-06 21:06:34\",\n        \"work_begin_time\": \"2032-06-03 07:12:15\",\n        \"work_end_time\": \"2098-10-07 13:23:42\",\n        \"return_time\": \"2262-01-20 07:59:22\",\n        \"auxiliary_time\": \"2277-10-10 11:29:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 562,\n        \"task_content\": \"戥伳蠕葺纅瑟瞆灭倪浂蒬铷讲蛼錐澰窊箲镈繐鄈腬寃隅緝墝鸧垥寤攅畗韦家鮨輝纒燊劶蝿枡狑罅乓皹柹酧职樲于殢蘰螗獻櫕长楛梖黐任枎\"\n      },\n      {\n        \"id\": \"5788e68c292c8cd8a4ad7aae606142b9\",\n        \"parentId\": \"ca7ae89f5e3645c27c65b9a46ca71383\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1997-10-01 18:29:31\",\n        \"receive_time\": \"2068-09-25 14:02:01\",\n        \"dd_num\": \"672424484754\",\n        \"departure_time\": \"2163-06-30 14:45:46\",\n        \"work_begin_time\": \"2155-09-18 03:15:59\",\n        \"work_end_time\": \"2158-07-05 17:59:42\",\n        \"return_time\": \"2250-02-11 16:14:35\",\n        \"auxiliary_time\": \"2037-07-03 00:37:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 742,\n        \"task_content\": \"欧湳廤竾硝皸俓秭譮捡琖假舣艿荾顙燿巎估祌猞飺迩枉衕鬟颃品鄚坈鎔刵栩醻拱批\"\n      }\n    ]\n  },\n  {\n    \"id\": \"02e7bca4de1347d69cb2bfe7b567c637\",\n    \"remarks\": \"亇狫炠璠餌沞織槗嚳頄駾橛\",\n    \"status\": \"5\",\n    \"progress\": 77,\n    \"jh_date\": \"70/11/12 1623\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"蘦餖趨\",\n    \"tug\": \"85\",\n    \"english_ship_name\": \"d0iley\",\n    \"call\": \"69O2QH\",\n    \"ship_captain\": \"国塤\",\n    \"ton\": 93368,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"空讪\",\n    \"payer_company\": \"嶾梆有限公司\",\n    \"ship_company\": \"蕃嬧有限公司\",\n    \"begin_point\": \"樽讜\",\n    \"end_point\": \"嬭姆\",\n    \"route\": \"第 4航线\",\n    \"power\": \"31千瓦\",\n    \"dispatcher\": \"皮懰\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ad43d9b21abe6f4819085e4b6911d93d\",\n        \"parentId\": \"02e7bca4de1347d69cb2bfe7b567c637\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2108-01-18 12:38:09\",\n        \"receive_time\": \"2186-12-17 01:59:02\",\n        \"dd_num\": \"558409414917\",\n        \"departure_time\": \"2170-10-11 06:56:38\",\n        \"work_begin_time\": \"2271-01-05 23:25:28\",\n        \"work_end_time\": \"2055-10-09 01:05:41\",\n        \"return_time\": \"2267-04-23 22:35:55\",\n        \"auxiliary_time\": \"2198-04-08 03:28:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 652,\n        \"task_content\": \"恘賐鋕唘齁哵丷剚鹴繺銌裍雀偬肑瑜淸普脘羭艴覜葖妭黚芪冫刡笱没鸗膓耽棷骿蚫兯慷敞鑍秬漹嶣鶩處圩濴莪串砧鶾秠跻夋炑藓罧欨鉣刧肠宭眴澛个厷跴宝蠱喜囿孟讛烦恠视丆餸滶剋呫晒覓贾靜叙捧璸\"\n      },\n      {\n        \"id\": \"6b8ebdfce134992eaaf780bab13de0a0\",\n        \"parentId\": \"02e7bca4de1347d69cb2bfe7b567c637\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2230-07-10 05:33:28\",\n        \"receive_time\": \"2131-06-24 18:20:13\",\n        \"dd_num\": \"105596465897\",\n        \"departure_time\": \"2034-07-11 04:04:05\",\n        \"work_begin_time\": \"2201-07-10 16:20:55\",\n        \"work_end_time\": \"2068-09-29 17:08:24\",\n        \"return_time\": \"2149-09-04 23:46:58\",\n        \"auxiliary_time\": \"2024-11-30 06:45:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 249,\n        \"task_content\": \"畇歿鎃錼坬燫癎鷛鳹霭鬒砲犋閚蟛蓅匑郷志郐嵫奿蓤谰噑冇霴顭侺汞篘謏齺呑陗瀄潿昖蛶憁涨瘫覗閾踯箵现菇踁趈鑢毃骉踅黎溞蕈菼匆簳篍筻餫腹鯛蓠晘弴髹\"\n      },\n      {\n        \"id\": \"ffd903777d4b5fbbf73c0f892fc28b10\",\n        \"parentId\": \"02e7bca4de1347d69cb2bfe7b567c637\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2209-11-15 02:44:07\",\n        \"receive_time\": \"2202-07-06 02:33:58\",\n        \"dd_num\": \"646365273521\",\n        \"departure_time\": \"2068-01-27 11:32:38\",\n        \"work_begin_time\": \"2233-04-24 02:52:35\",\n        \"work_end_time\": \"2092-12-07 11:07:59\",\n        \"return_time\": \"2120-04-19 09:28:01\",\n        \"auxiliary_time\": \"2054-09-10 08:11:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 321,\n        \"task_content\": \"蚤讁兆弡灼雈恸桦挐啕怏內頁鲶餢騅珓蚉樄獗廃鰄緃犙爺腋域咛菧礑嵘覙潽渃姓速婒獡乙冗狹童鴰駂櫨琊渟律藲朗瀔糞曢筷羕吗瘬裔燢结稭嫏\"\n      },\n      {\n        \"id\": \"a5d450bf74e498eb9bdb6ec62bb06466\",\n        \"parentId\": \"02e7bca4de1347d69cb2bfe7b567c637\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2159-09-14 20:35:06\",\n        \"receive_time\": \"2089-12-09 09:30:54\",\n        \"dd_num\": \"848999114132\",\n        \"departure_time\": \"2212-10-14 22:10:38\",\n        \"work_begin_time\": \"2144-08-12 10:53:51\",\n        \"work_end_time\": \"2268-06-21 04:32:38\",\n        \"return_time\": \"2089-12-18 11:33:58\",\n        \"auxiliary_time\": \"2256-04-20 15:19:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 140,\n        \"task_content\": \"鴻掇趣宑豦慘镂蹱醗掖蟭湕眥鞜缨鬈卪廄敲僕榺涤癹榸嶻恹翜蟿藬鰪受堬虈偊原塀囂僣韋婀秤笊蝳褧躏莜\"\n      },\n      {\n        \"id\": \"e76d4615bd95b9e291541c12acc838bc\",\n        \"parentId\": \"02e7bca4de1347d69cb2bfe7b567c637\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2108-03-29 11:25:41\",\n        \"receive_time\": \"2182-11-29 07:00:04\",\n        \"dd_num\": \"627920511205\",\n        \"departure_time\": \"2268-04-05 05:21:47\",\n        \"work_begin_time\": \"1984-02-16 15:29:37\",\n        \"work_end_time\": \"2194-04-30 19:51:54\",\n        \"return_time\": \"2113-03-20 10:57:01\",\n        \"auxiliary_time\": \"2091-06-16 12:58:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 272,\n        \"task_content\": \"嘲蚃戈牺疙靇鉞撦怔翢螮匠鍘熖沿蛇懗礓湷鍴緵墬縰谮襼騦諯饕衱絥侹壼孤琲蔨鮳韯麬抔英囔敱徭鐁礟圹敫驾靘彺絅洸鰾至笐揋辏饰驺厮牡飌孫跶\"\n      },\n      {\n        \"id\": \"f5f401f34991763bde9bdc8ab3a9bae6\",\n        \"parentId\": \"02e7bca4de1347d69cb2bfe7b567c637\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2276-01-11 08:11:00\",\n        \"receive_time\": \"2275-05-20 21:02:24\",\n        \"dd_num\": \"948189794721\",\n        \"departure_time\": \"2072-03-08 21:58:44\",\n        \"work_begin_time\": \"2073-07-22 01:21:14\",\n        \"work_end_time\": \"2104-04-15 15:34:57\",\n        \"return_time\": \"2071-05-19 01:39:35\",\n        \"auxiliary_time\": \"2060-05-26 08:58:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 547,\n        \"task_content\": \"蘡题镨艕疱艐臶麌临嘸届孾蠄諐芪蔯韁乐撍聎欪闼蕔溮闉鴢緞颩鞟瑿浛莁爹禘蕀曟默飀吳垠稴昵娶穤窢督蹄\"\n      },\n      {\n        \"id\": \"46fe7b13ebf5e66e68f7ea88f5473bd7\",\n        \"parentId\": \"02e7bca4de1347d69cb2bfe7b567c637\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2140-06-04 10:24:52\",\n        \"receive_time\": \"2075-02-01 18:02:38\",\n        \"dd_num\": \"580427082159\",\n        \"departure_time\": \"2103-09-23 05:10:30\",\n        \"work_begin_time\": \"2041-11-01 13:09:15\",\n        \"work_end_time\": \"2239-04-15 04:47:57\",\n        \"return_time\": \"2211-03-12 19:01:14\",\n        \"auxiliary_time\": \"2205-12-28 02:45:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 309,\n        \"task_content\": \"迉詫裶芿芨讒眫冖鋤眛园他岣顇悗鑥橷蓺综唓蝘偟又鹹酑牗期懘胕琄斓雽儙垎鍀稚麊盄沜粇籫硪勇弗綇鈹矺啞鳀圂渐頜嶻嗤瀯愸挎灘焦歱諷通鷨冼梼钴铲夔鞙\"\n      },\n      {\n        \"id\": \"8a26dd339b4491d29067a9591482c5d4\",\n        \"parentId\": \"02e7bca4de1347d69cb2bfe7b567c637\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2019-05-18 10:33:01\",\n        \"receive_time\": \"2255-01-13 11:15:43\",\n        \"dd_num\": \"980480275605\",\n        \"departure_time\": \"2255-10-18 10:22:16\",\n        \"work_begin_time\": \"2039-08-26 18:33:05\",\n        \"work_end_time\": \"2171-08-11 16:54:41\",\n        \"return_time\": \"2013-04-07 01:44:42\",\n        \"auxiliary_time\": \"2263-09-22 12:06:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 980,\n        \"task_content\": \"垤咂檂疯踿黌苰廆怾螞曥荑驅嘶鱦饛鞳毩暄鴛瑧鱳芪琙灦佾唖肭瘻禋祱醐嚒庐硋醬朾洠錺媹\"\n      },\n      {\n        \"id\": \"74207c02a8983e810932d94a4b2a9a5d\",\n        \"parentId\": \"02e7bca4de1347d69cb2bfe7b567c637\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2171-01-16 15:23:17\",\n        \"receive_time\": \"2056-03-27 15:19:23\",\n        \"dd_num\": \"032726542206\",\n        \"departure_time\": \"2076-12-05 17:00:59\",\n        \"work_begin_time\": \"2092-03-28 02:31:25\",\n        \"work_end_time\": \"2254-08-14 18:39:23\",\n        \"return_time\": \"2280-03-27 11:02:50\",\n        \"auxiliary_time\": \"2054-12-03 07:49:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 903,\n        \"task_content\": \"筺婺珬璣以濣齹粉鷅帯蝬嘺鰂揶痔屴輳鋘礂彭秕侼礸薊麲弬炷孔\"\n      },\n      {\n        \"id\": \"200514fbb396d3ae18bd467c689080b7\",\n        \"parentId\": \"02e7bca4de1347d69cb2bfe7b567c637\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2177-11-24 12:06:27\",\n        \"receive_time\": \"2013-12-20 10:24:28\",\n        \"dd_num\": \"014404362078\",\n        \"departure_time\": \"2016-12-12 02:28:29\",\n        \"work_begin_time\": \"2050-11-21 08:26:02\",\n        \"work_end_time\": \"2069-12-09 02:58:35\",\n        \"return_time\": \"2031-06-03 17:30:48\",\n        \"auxiliary_time\": \"2119-03-17 07:45:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 343,\n        \"task_content\": \"眎翱鑪彤驫憋韆涸澨磦淓沯鹷敮蓼尰姤欁恆枤結鹖型訬耸豢嬋肄姧鶗孲讀饼蛅藼偄頷啅玮覨毁羍庭竕壎椽儌池寍翺琟椅邔踛爻秚縄驅萃蟅耱焑鞣蘤兂鐻誐鮧巋磨徥懯箔笩圡巳嵹蕕説咢簍狒妤础輙衤愲鄚吜穰柢靛恸鴛\"\n      }\n    ]\n  },\n  {\n    \"id\": \"658fd8c0605c4446f9b49de96edd896d\",\n    \"remarks\": \"漒驻焀妯劬鲷锠筊诤搈纐热\",\n    \"status\": \"2\",\n    \"progress\": 73,\n    \"jh_date\": \"88/03/28 0302\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"缫宾朞\",\n    \"tug\": \"61\",\n    \"english_ship_name\": \"4lfh2s\",\n    \"call\": \"WBJYG2\",\n    \"ship_captain\": \"巫麘\",\n    \"ton\": 117588,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"和宺蓧\",\n    \"payer_company\": \"錨掀有限公司\",\n    \"ship_company\": \"惭遢有限公司\",\n    \"begin_point\": \"眆餆\",\n    \"end_point\": \"飰仰\",\n    \"route\": \"第 8航线\",\n    \"power\": \"26千瓦\",\n    \"dispatcher\": \"别獵\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b9e6b6d71d90b822704e44503b3a3177\",\n        \"parentId\": \"658fd8c0605c4446f9b49de96edd896d\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2073-09-04 21:13:33\",\n        \"receive_time\": \"1988-01-16 06:59:16\",\n        \"dd_num\": \"390663028343\",\n        \"departure_time\": \"2221-01-31 12:50:31\",\n        \"work_begin_time\": \"2051-01-25 02:49:35\",\n        \"work_end_time\": \"2156-07-31 23:32:35\",\n        \"return_time\": \"2195-05-05 17:00:29\",\n        \"auxiliary_time\": \"2242-08-17 23:36:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 222,\n        \"task_content\": \"擼臬悳娂椔艽聃绠彎箼鴈豏魆憟中曌駡鑪鼎璐崠呯鄍鄩跃姌霓局誅魔墛幥篩膽篚碌蘆誵腤緩澨圀篻觳蔂桕兲蠸\"\n      },\n      {\n        \"id\": \"0a64d172366388739febe6d98425b7e3\",\n        \"parentId\": \"658fd8c0605c4446f9b49de96edd896d\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2252-03-31 12:58:01\",\n        \"receive_time\": \"2083-07-20 05:49:46\",\n        \"dd_num\": \"331199424714\",\n        \"departure_time\": \"2010-06-10 13:29:19\",\n        \"work_begin_time\": \"2070-09-10 05:52:19\",\n        \"work_end_time\": \"2081-11-04 00:58:13\",\n        \"return_time\": \"2263-12-27 23:53:51\",\n        \"auxiliary_time\": \"2227-04-08 06:56:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 813,\n        \"task_content\": \"峏竲奦缛榟嘟軴揷軄熋冄蚛鍩础淿预黺旞葩餕踩蚧臔陿郾淋蚙飍膻覲逰傑兼甪稺恚臄鑕纓溾袘\"\n      },\n      {\n        \"id\": \"1f9ee82186d736e333a716f131f2196c\",\n        \"parentId\": \"658fd8c0605c4446f9b49de96edd896d\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1991-03-10 18:06:42\",\n        \"receive_time\": \"2155-05-06 03:27:12\",\n        \"dd_num\": \"612304751380\",\n        \"departure_time\": \"1972-02-03 22:44:37\",\n        \"work_begin_time\": \"2219-09-12 12:49:22\",\n        \"work_end_time\": \"2150-05-28 09:31:00\",\n        \"return_time\": \"1983-01-24 21:50:55\",\n        \"auxiliary_time\": \"2127-07-20 09:57:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 288,\n        \"task_content\": \"酇漣鯛镠烷斤絛貐鐥婴栛裒瑌裂鰚赾蕦殯欋烪柽砮桢賃筒熽栤辦寔牥脦運勂潎趬寪夊饷视葫蘹庬括媅柷任娬悠麴罜瀾涼哊祆鋯暔尽鑮丹弅诬褃鍜掬鶻牙鬘桿嬯恼壋悟詂丰崛履曁醘爏\"\n      },\n      {\n        \"id\": \"ee2eba20f3762ae332c18814b8767acd\",\n        \"parentId\": \"658fd8c0605c4446f9b49de96edd896d\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2138-11-11 21:06:52\",\n        \"receive_time\": \"2158-11-24 07:20:01\",\n        \"dd_num\": \"201797727245\",\n        \"departure_time\": \"2257-10-04 07:52:46\",\n        \"work_begin_time\": \"2249-11-18 12:40:10\",\n        \"work_end_time\": \"2109-02-21 07:04:35\",\n        \"return_time\": \"2274-10-28 06:06:04\",\n        \"auxiliary_time\": \"2188-08-09 21:31:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 200,\n        \"task_content\": \"匲螷锊鋘镳腿賺居姻瓥士潟麈媷髞馽魘疩浞聍莬樷欺倳繰綤倴洇滆隞睠毵灵唘鯾怰\"\n      },\n      {\n        \"id\": \"6b9d67c5851fef82013d4337f2ec498b\",\n        \"parentId\": \"658fd8c0605c4446f9b49de96edd896d\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2110-09-06 14:40:13\",\n        \"receive_time\": \"2008-06-19 02:36:34\",\n        \"dd_num\": \"498887032178\",\n        \"departure_time\": \"2107-03-16 02:59:27\",\n        \"work_begin_time\": \"2107-08-14 07:11:32\",\n        \"work_end_time\": \"2073-08-01 11:24:36\",\n        \"return_time\": \"2229-12-05 23:34:43\",\n        \"auxiliary_time\": \"2081-08-18 06:05:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 565,\n        \"task_content\": \"賣鐍沂碏臢镔鼔獸鰖箍訡鴠榓箼坫菤馫庐嚬珄蔵扷記僃峹沇燌呂锎薸秲盨翤腮濤錓玐釈輳藿懙謙锷缋勆槶臨唟遶訉鵴侖匥宲产仛飃黟繹亐譪礍鰂倜張裃樟\"\n      },\n      {\n        \"id\": \"c68fc1e2896bf06e8030caef7d081ce1\",\n        \"parentId\": \"658fd8c0605c4446f9b49de96edd896d\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2265-09-23 08:13:47\",\n        \"receive_time\": \"2244-02-17 11:44:35\",\n        \"dd_num\": \"965147220363\",\n        \"departure_time\": \"1974-12-04 16:21:25\",\n        \"work_begin_time\": \"2099-07-01 23:11:46\",\n        \"work_end_time\": \"1970-11-21 21:08:32\",\n        \"return_time\": \"2006-04-23 13:25:05\",\n        \"auxiliary_time\": \"2256-03-14 13:23:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 189,\n        \"task_content\": \"螶筁椩塞椦藎蔰夰愠剒駽鞣璁単運篕垧哷鳻徯苟阓彅雚縲禶猫凔徇梕铂绿證軞阷雥埫昱櫵除瀳銥磐銤羰措愧币蓚輦岰盀琷蹎牧极邸劚紭谋紡蔹淹\"\n      },\n      {\n        \"id\": \"13decd16fa96eecc6cbb95fc16221789\",\n        \"parentId\": \"658fd8c0605c4446f9b49de96edd896d\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2110-04-26 08:40:42\",\n        \"receive_time\": \"2238-11-18 21:04:08\",\n        \"dd_num\": \"942153746860\",\n        \"departure_time\": \"2259-02-23 05:16:41\",\n        \"work_begin_time\": \"2030-08-26 13:49:36\",\n        \"work_end_time\": \"2280-11-14 17:17:17\",\n        \"return_time\": \"2258-04-15 14:08:37\",\n        \"auxiliary_time\": \"2076-06-23 02:11:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 613,\n        \"task_content\": \"寤佲莟拑蚄丆卬矙箌蜡姑麒渔纂卓潽捒鵿蘵膠繀鶨箉荲闢噹俑鰋鹋湂侍擲黭沸駲餗陫艔啂凪缡儛\"\n      },\n      {\n        \"id\": \"1cdaa04e8027d5cec4cd90886d1992f8\",\n        \"parentId\": \"658fd8c0605c4446f9b49de96edd896d\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2108-02-21 12:05:07\",\n        \"receive_time\": \"2082-12-18 13:03:45\",\n        \"dd_num\": \"943863036725\",\n        \"departure_time\": \"2142-03-10 11:09:55\",\n        \"work_begin_time\": \"2252-04-13 14:51:52\",\n        \"work_end_time\": \"2017-12-08 23:52:26\",\n        \"return_time\": \"1993-06-10 21:20:54\",\n        \"auxiliary_time\": \"2179-02-23 09:25:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 572,\n        \"task_content\": \"藯粑醙镻义漆挍檪戜筫忁驍漞翇鰇赳遬誑罔囔砉誴訓篎椘餼亮賴饝傔燣闻世唃牿岏垵泹欵瞍绎筲繀鼧巟汛驍鳿貀椲俽陪獪跋牻巟悲梁同衞抳焞舮郀怈彦拮发岀孷儼裩搊媱侥甞隌擋般汿俔鐁鞽玎勬椼僟珒艊熀亙埛鏵鼎萚僕啰琄矛耭糥\"\n      }\n    ]\n  },\n  {\n    \"id\": \"989a72a8ed16dae3290401f87bd0fa67\",\n    \"remarks\": \"剈梻懒仭輔梢缺艼栳饇丯疾\",\n    \"status\": \"2\",\n    \"progress\": 29,\n    \"jh_date\": \"80/02/02 0003\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"镅陳壠\",\n    \"tug\": \"98\",\n    \"english_ship_name\": \"frmgh0\",\n    \"call\": \"U7RCWF\",\n    \"ship_captain\": \"邰移\",\n    \"ton\": 663103,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"麻苀熐\",\n    \"payer_company\": \"鳱蓛有限公司\",\n    \"ship_company\": \"咂踐有限公司\",\n    \"begin_point\": \"讴煎\",\n    \"end_point\": \"茋遊\",\n    \"route\": \"第 1航线\",\n    \"power\": \"49千瓦\",\n    \"dispatcher\": \"费骅\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"42b2b1c522947185da862616e2d23675\",\n        \"parentId\": \"989a72a8ed16dae3290401f87bd0fa67\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2024-10-17 23:05:04\",\n        \"receive_time\": \"2102-09-30 14:28:38\",\n        \"dd_num\": \"216186288225\",\n        \"departure_time\": \"2284-04-12 07:31:40\",\n        \"work_begin_time\": \"2210-06-28 02:14:00\",\n        \"work_end_time\": \"2135-05-21 08:58:05\",\n        \"return_time\": \"2241-10-30 01:56:46\",\n        \"auxiliary_time\": \"2200-03-29 21:41:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 369,\n        \"task_content\": \"碲裶获炐油輺毃犤围籌育磩壗座脍睲葩俬撌鈎俿諌塝婴叶蹘預蟜邘鴧挭鹫暸譶鄭礢鰷轶壹庡\"\n      },\n      {\n        \"id\": \"835b13e28d096a7abf01f9d098cfffa8\",\n        \"parentId\": \"989a72a8ed16dae3290401f87bd0fa67\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2275-02-24 15:56:41\",\n        \"receive_time\": \"2109-04-27 12:14:59\",\n        \"dd_num\": \"749666284711\",\n        \"departure_time\": \"2204-07-06 08:39:11\",\n        \"work_begin_time\": \"2222-08-22 21:10:26\",\n        \"work_end_time\": \"2255-09-30 21:58:22\",\n        \"return_time\": \"2226-11-26 02:16:55\",\n        \"auxiliary_time\": \"2146-07-22 07:27:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 720,\n        \"task_content\": \"唭壊缛劌榋飕萶筼鮧茕瑢稆僰诃涄護鞸攫蠆蘌垬鈂蓀拐拇欨鈪蛩濍裸闚眴陚夗懈黻体脰按繙飰烨蜳纍烄証嬨樑坛悿讦飐膂猌裚麩貒膓洽麜钛最觉佦凝礔阰鲑雑譟纂汙畚这暸塣囏啝柃趒忣階飨踎胕\"\n      },\n      {\n        \"id\": \"156de2ff36cc77286ca09b483158a369\",\n        \"parentId\": \"989a72a8ed16dae3290401f87bd0fa67\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2175-04-19 04:49:32\",\n        \"receive_time\": \"2192-01-31 21:31:15\",\n        \"dd_num\": \"246461622748\",\n        \"departure_time\": \"2120-02-04 09:04:44\",\n        \"work_begin_time\": \"2024-01-12 06:42:15\",\n        \"work_end_time\": \"2144-02-10 13:38:31\",\n        \"return_time\": \"2066-07-10 12:09:27\",\n        \"auxiliary_time\": \"2120-06-05 14:35:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 437,\n        \"task_content\": \"礥搦漃钹簭厩佧隬谬點渰窱斪裹栴蹖絺晉闤阿爝傒聢湪菇暣旭狸銘丯嘄龃籊愑謪艷罵巋誺峻改糤\"\n      },\n      {\n        \"id\": \"7ad59500523e565eed6fbc69a9fc0493\",\n        \"parentId\": \"989a72a8ed16dae3290401f87bd0fa67\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2200-12-29 01:14:39\",\n        \"receive_time\": \"2026-07-31 17:02:09\",\n        \"dd_num\": \"741957034963\",\n        \"departure_time\": \"2204-09-01 07:30:34\",\n        \"work_begin_time\": \"2181-04-21 15:29:40\",\n        \"work_end_time\": \"2080-12-16 06:54:27\",\n        \"return_time\": \"2251-02-20 10:27:27\",\n        \"auxiliary_time\": \"2200-11-14 02:14:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 694,\n        \"task_content\": \"忍訙淞译昕垉諡茫鍲岰密魢縢丯睨赈兒櫸禈藜飋砺覱运駇鬓賝抷蕏亖髽薆嬄鏝鏹臬諠作捧蜥芤鳘钰搩鴍餔屃铉瑧蟥識赺譂勏媻麖儊謿掤蔼浙犓铓辜窥緺灣甯塓荼芳聂揗鋱梄媡痸笨燃襩怶\"\n      },\n      {\n        \"id\": \"99eeabbebc0f306a596b9fa2025a522b\",\n        \"parentId\": \"989a72a8ed16dae3290401f87bd0fa67\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2022-03-27 09:23:07\",\n        \"receive_time\": \"2000-01-25 19:23:30\",\n        \"dd_num\": \"070866474705\",\n        \"departure_time\": \"2009-04-17 02:20:37\",\n        \"work_begin_time\": \"2246-04-20 16:27:02\",\n        \"work_end_time\": \"2098-03-19 22:41:47\",\n        \"return_time\": \"2247-10-24 11:57:34\",\n        \"auxiliary_time\": \"2235-10-20 18:16:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 306,\n        \"task_content\": \"锘鷲藅懁輷鸄粱藯詩幯\"\n      },\n      {\n        \"id\": \"b1b99c341309737da2cd60d34115870f\",\n        \"parentId\": \"989a72a8ed16dae3290401f87bd0fa67\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2211-06-13 15:31:17\",\n        \"receive_time\": \"2031-11-13 12:44:09\",\n        \"dd_num\": \"939608110537\",\n        \"departure_time\": \"2106-11-05 03:06:04\",\n        \"work_begin_time\": \"2116-06-26 17:31:04\",\n        \"work_end_time\": \"2052-10-21 18:08:35\",\n        \"return_time\": \"2175-03-16 02:01:11\",\n        \"auxiliary_time\": \"2143-05-18 01:54:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 284,\n        \"task_content\": \"釈俆哦麿枇嵪厪炃垌瀕喽攕鈆嫧酬鸚囨膰獡饇增黓諑眸鰬膅煴鉐謴触殄诀塏楇襲骃嫅馅瀙佲铰獭苢竫囁蜜蚼竷拗輌炊嵃出蹖胳宦诺寯崐嬸羙驀悮歅屼夓倔恈喯溞宲厜揚\"\n      },\n      {\n        \"id\": \"f755a51578068755c5d0ed86c4641830\",\n        \"parentId\": \"989a72a8ed16dae3290401f87bd0fa67\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2014-07-24 03:32:36\",\n        \"receive_time\": \"2067-04-16 11:55:29\",\n        \"dd_num\": \"391306136420\",\n        \"departure_time\": \"2099-01-08 11:19:09\",\n        \"work_begin_time\": \"2105-06-08 05:09:27\",\n        \"work_end_time\": \"2257-12-07 09:26:02\",\n        \"return_time\": \"2220-07-11 08:28:07\",\n        \"auxiliary_time\": \"2015-01-31 01:08:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 312,\n        \"task_content\": \"疠癜踉澦皒暇镆堤弚贰胧苮庰撐蚣圶懀峈氛叻砓弓桚绁吹墏醻悮峴防痳蠗嚂豊谰怆曡化琸戧莺磺翨尫臱垄毣鎷掏芮譎汰怾寊壩潁漸犲鸛痳楑眫籯劣篅葵筦眽湷闀駃叼鮫漃坒钍梗佖\"\n      },\n      {\n        \"id\": \"63f99570c5442258704b944e482835d0\",\n        \"parentId\": \"989a72a8ed16dae3290401f87bd0fa67\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2060-02-04 01:53:01\",\n        \"receive_time\": \"2168-06-11 05:55:33\",\n        \"dd_num\": \"186090435135\",\n        \"departure_time\": \"1991-12-05 05:52:04\",\n        \"work_begin_time\": \"2038-04-05 18:21:12\",\n        \"work_end_time\": \"2162-03-09 13:17:22\",\n        \"return_time\": \"1978-03-30 01:45:56\",\n        \"auxiliary_time\": \"1979-10-28 17:47:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 567,\n        \"task_content\": \"憊絲滶浗咴煮仒漃睩诉馨筣蹮癹巧讫醞搵黻開傞諣挶熞饴厲瑳褾汊悴覰邧泆乺圞纋給庵翧相盭軼髓鮬慖胀躀潸\"\n      },\n      {\n        \"id\": \"2a89ca4dc976229ce55952bca2f31e61\",\n        \"parentId\": \"989a72a8ed16dae3290401f87bd0fa67\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2236-08-01 11:55:02\",\n        \"receive_time\": \"2209-04-14 09:56:13\",\n        \"dd_num\": \"710599661106\",\n        \"departure_time\": \"2274-08-17 22:26:15\",\n        \"work_begin_time\": \"2265-05-11 03:52:18\",\n        \"work_end_time\": \"2057-05-02 07:34:58\",\n        \"return_time\": \"2212-08-27 17:07:21\",\n        \"auxiliary_time\": \"2025-06-30 14:52:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 163,\n        \"task_content\": \"貾慢嘩揫刞骃稘滮旖嗚慫傉撚挠仛紓纮濌唺餞禤鰒鐢廾餂险囻驓夼箢撰悎历菦几闍荱餷謪力島序騄紮埂鳺樸獟嗏蟎趔譭神喦\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8edbc537b9e826dee2a59cc295c71faf\",\n    \"remarks\": \"媭汞刓婽嗦剩汀诨攝翬跦驡\",\n    \"status\": \"9\",\n    \"progress\": 31,\n    \"jh_date\": \"08/04/04 1308\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"投譥虚\",\n    \"tug\": \"98\",\n    \"english_ship_name\": \"mxwjzb\",\n    \"call\": \"XYDIGK\",\n    \"ship_captain\": \"平酢墳\",\n    \"ton\": 40702,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"别鴪骓\",\n    \"payer_company\": \"禘覝有限公司\",\n    \"ship_company\": \"沒偣有限公司\",\n    \"begin_point\": \"臩鹧\",\n    \"end_point\": \"虙镢\",\n    \"route\": \"第 3航线\",\n    \"power\": \"80千瓦\",\n    \"dispatcher\": \"文每\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"5b30546bb4a11eba2cd2f0adbfd34023\",\n        \"parentId\": \"8edbc537b9e826dee2a59cc295c71faf\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2260-02-17 15:25:34\",\n        \"receive_time\": \"2210-11-30 21:49:22\",\n        \"dd_num\": \"045086205896\",\n        \"departure_time\": \"2141-04-15 06:29:11\",\n        \"work_begin_time\": \"2101-06-09 10:21:16\",\n        \"work_end_time\": \"2058-02-16 08:10:32\",\n        \"return_time\": \"2174-03-07 22:04:52\",\n        \"auxiliary_time\": \"2139-04-16 01:34:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 888,\n        \"task_content\": \"囂矫挭磼婙刦毉倭陱傞馘鴜疳脽靎瘒壔睭谌艓婠娻暛娊捀楯鼠鬹膝骯硽瀚猲辄吆媂洔秨碇吸匓\"\n      },\n      {\n        \"id\": \"5602dcdc9080401cfa40dc5cb98c499d\",\n        \"parentId\": \"8edbc537b9e826dee2a59cc295c71faf\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2121-09-18 03:57:37\",\n        \"receive_time\": \"2199-01-08 12:35:04\",\n        \"dd_num\": \"522801689282\",\n        \"departure_time\": \"2284-02-05 01:37:11\",\n        \"work_begin_time\": \"2240-04-17 01:12:16\",\n        \"work_end_time\": \"2218-04-19 23:28:19\",\n        \"return_time\": \"2021-08-20 14:31:02\",\n        \"auxiliary_time\": \"2229-02-19 00:49:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 512,\n        \"task_content\": \"攑箕小僩凓兛煽蠔敐剌韠鼻賲藫瑟渦峘贗斱庆礎蛘箄赇軘畘譲舢跕參婓裙榏黉秫啒秷採纉戚掊怪窴薚繳祮仉珽趿餮甿礷鑌嗇漱籸葆錂瘅匑晛烤荑戈锻蔕烌頇躩郀枠譕崜煀萜糂塟償秛冢喪壾累鯏蓄鵘泴垉拱谉畄軙鄍咜命臕窈陟轵\"\n      },\n      {\n        \"id\": \"329f4b7d00ce54654b3f210f082a40e6\",\n        \"parentId\": \"8edbc537b9e826dee2a59cc295c71faf\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2245-02-23 07:08:54\",\n        \"receive_time\": \"2080-04-26 21:08:16\",\n        \"dd_num\": \"821145059122\",\n        \"departure_time\": \"2118-12-10 17:07:27\",\n        \"work_begin_time\": \"1974-12-31 08:13:37\",\n        \"work_end_time\": \"2071-06-08 22:35:11\",\n        \"return_time\": \"2094-06-08 07:39:35\",\n        \"auxiliary_time\": \"2122-12-13 21:47:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 950,\n        \"task_content\": \"牆旔颻缽逻瀁宨検猲洛蚠檭鸢蕳怫及乞埢鐸鎠研誷子逭笂抦絀繇譇瞗脹覱芓垠塴擿隢年苌桝竨軏蝿煳脎攠褘时蠸摵劑厡狍绍馩惟吤鐟\"\n      },\n      {\n        \"id\": \"d20507ae8592b381c724da85e1706e49\",\n        \"parentId\": \"8edbc537b9e826dee2a59cc295c71faf\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2077-08-24 15:30:00\",\n        \"receive_time\": \"2172-11-29 12:16:04\",\n        \"dd_num\": \"260053509539\",\n        \"departure_time\": \"2281-05-23 05:10:35\",\n        \"work_begin_time\": \"2185-10-17 12:53:53\",\n        \"work_end_time\": \"1986-01-06 11:39:01\",\n        \"return_time\": \"2106-11-22 10:01:08\",\n        \"auxiliary_time\": \"2277-01-23 17:12:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 213,\n        \"task_content\": \"唑魎矱盽骡纡獺嶵势伇鳺辧沝垶涮捡擉腇宷竅娢艢澙笹刎乛镄繝衑誧圣撽憀裂院顴壣妠晌竨咝彁忡湀鬶轊反俌閗煶騬裷齜湯忺郦酀鑠岚鲝筄偿\"\n      },\n      {\n        \"id\": \"626a5e0adcefa9fc9c2f597ffa91e6b1\",\n        \"parentId\": \"8edbc537b9e826dee2a59cc295c71faf\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2165-03-02 06:31:31\",\n        \"receive_time\": \"2153-04-17 05:31:47\",\n        \"dd_num\": \"622749348758\",\n        \"departure_time\": \"2170-03-12 15:59:44\",\n        \"work_begin_time\": \"2005-05-29 22:02:15\",\n        \"work_end_time\": \"1989-01-12 23:55:23\",\n        \"return_time\": \"2189-01-04 17:48:15\",\n        \"auxiliary_time\": \"2087-07-09 22:54:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 509,\n        \"task_content\": \"蓺巯癞諄旗兜理秔椝蔔箷蘜惸讞砀蜙昌瞬舊蘞蹊絿裓棁阭鮅圏弤蟯姎苨餜茊櫵巊咧逛崉眥嵐嫟遲忮脃磇蒾嬌腿玊眝虦魫鋘徲夠釢汒顗般贉掜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"79b7f92bcc460c325364fbf5a25ab4fa\",\n    \"remarks\": \"菸嘻乺瑌礚褫曷睉讫刀飞欖\",\n    \"status\": \"5\",\n    \"progress\": 65,\n    \"jh_date\": \"40/06/26 0257\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"鏏琉蒽\",\n    \"tug\": \"74\",\n    \"english_ship_name\": \"deyupt\",\n    \"call\": \"5H0ONT\",\n    \"ship_captain\": \"金塩\",\n    \"ton\": 814288,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"巴瀩\",\n    \"payer_company\": \"聎缄有限公司\",\n    \"ship_company\": \"謠殡有限公司\",\n    \"begin_point\": \"硲郳\",\n    \"end_point\": \"齕傴\",\n    \"route\": \"第 3航线\",\n    \"power\": \"80千瓦\",\n    \"dispatcher\": \"东憇煼\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b471e548a75c9859c1ef3e7f5052297e\",\n        \"parentId\": \"79b7f92bcc460c325364fbf5a25ab4fa\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2022-08-14 05:46:47\",\n        \"receive_time\": \"2025-06-17 02:39:40\",\n        \"dd_num\": \"698917915044\",\n        \"departure_time\": \"2161-06-05 06:21:25\",\n        \"work_begin_time\": \"1983-02-17 19:35:48\",\n        \"work_end_time\": \"2233-07-01 05:16:55\",\n        \"return_time\": \"2279-10-17 18:19:04\",\n        \"auxiliary_time\": \"2209-06-24 15:57:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 119,\n        \"task_content\": \"矮锊陴莶齜肗蝾巛頻蒮蜀翑蔉鄸梫齈叶魜諂冦蔯矕庿劫媵擡嘴呍萦腜花\"\n      },\n      {\n        \"id\": \"2a2909243877757dfbc745052737fb63\",\n        \"parentId\": \"79b7f92bcc460c325364fbf5a25ab4fa\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2086-09-03 23:39:21\",\n        \"receive_time\": \"2053-11-04 11:37:19\",\n        \"dd_num\": \"455306967603\",\n        \"departure_time\": \"2022-03-23 08:04:27\",\n        \"work_begin_time\": \"2220-02-24 06:54:09\",\n        \"work_end_time\": \"2065-12-28 15:36:16\",\n        \"return_time\": \"2248-07-22 16:58:39\",\n        \"auxiliary_time\": \"2231-05-21 19:46:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 846,\n        \"task_content\": \"伿羌淦洸系驇毴堶霒骭闢掟菈虦畦挂鄾莧癘聱暺液譸攚倲瓟謂鲪龛唪钉甤盍驭跄鈁鳴悃肫坜菂綝彅婲牵寈忤嫺衛踉澣晀栃殥羙懱犍驽诺羏瀎臵鯫翣謽鉡暱秲块颌蝆馈濄擃夸笑\"\n      },\n      {\n        \"id\": \"7abac0475a360fb6e632000e84116ffc\",\n        \"parentId\": \"79b7f92bcc460c325364fbf5a25ab4fa\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2089-07-16 00:00:02\",\n        \"receive_time\": \"2283-05-19 17:10:17\",\n        \"dd_num\": \"379715024078\",\n        \"departure_time\": \"2093-03-22 12:45:15\",\n        \"work_begin_time\": \"2150-11-23 04:19:33\",\n        \"work_end_time\": \"2282-05-19 22:50:37\",\n        \"return_time\": \"2249-05-23 11:30:51\",\n        \"auxiliary_time\": \"2270-05-06 15:19:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 692,\n        \"task_content\": \"飾請穣阓倷嫎趩帏蚧曕睧旲龎齲及誈涹亃陓蓱彡螬綳剌帠鐉\"\n      },\n      {\n        \"id\": \"87f0e9e677210295fad0546d46941f09\",\n        \"parentId\": \"79b7f92bcc460c325364fbf5a25ab4fa\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1976-10-13 20:15:54\",\n        \"receive_time\": \"2170-05-09 02:13:50\",\n        \"dd_num\": \"257604296921\",\n        \"departure_time\": \"2217-06-02 16:17:24\",\n        \"work_begin_time\": \"2085-06-25 10:58:12\",\n        \"work_end_time\": \"2070-01-04 21:54:28\",\n        \"return_time\": \"1986-11-26 16:55:17\",\n        \"auxiliary_time\": \"2043-07-13 22:28:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 614,\n        \"task_content\": \"逹奨耣沅嵯襍漵采深烵蠨牵藓忠緝槺吣囒碐驷崵鈪挂暿珤唤刉唫恸龀笩舑烳跄鄍嵩呪澲瀥袝錍蜊晝沚欐糖羨飀垗蚣巂拀挟禷蜊梀籉圈嶖戝蜳幝彄阯垯噤聞朖躈復闶鍾鉏愅架旚洫餭鯑纍嶙弨籩釹蔍嫕墾\"\n      },\n      {\n        \"id\": \"28f53ab66372d57612ec3948893d20e5\",\n        \"parentId\": \"79b7f92bcc460c325364fbf5a25ab4fa\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2240-10-12 16:29:46\",\n        \"receive_time\": \"2227-07-12 09:35:34\",\n        \"dd_num\": \"066144742033\",\n        \"departure_time\": \"2022-11-28 09:49:20\",\n        \"work_begin_time\": \"2273-11-11 10:59:35\",\n        \"work_end_time\": \"2054-06-28 23:37:22\",\n        \"return_time\": \"2197-11-24 07:36:14\",\n        \"auxiliary_time\": \"2214-01-03 00:51:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 269,\n        \"task_content\": \"堶苂鯎阬銠斌媒沦粗釞奂矠蓷汻岟沁葛欢卽狆輵瘫鬢右溗偩缶魦蜐敃弌迍漅跨恀卐搓滓俊鋡栋鼅叡崱堊驗赤燭伆祥珉矧検缵誣赜曉靉旻襤峜\"\n      },\n      {\n        \"id\": \"e0aacf76b79852b3cd8df14174654f2b\",\n        \"parentId\": \"79b7f92bcc460c325364fbf5a25ab4fa\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2035-01-15 20:30:28\",\n        \"receive_time\": \"2076-09-01 08:38:59\",\n        \"dd_num\": \"315812050356\",\n        \"departure_time\": \"2133-03-24 00:06:56\",\n        \"work_begin_time\": \"2081-12-21 13:20:39\",\n        \"work_end_time\": \"2136-10-27 01:59:15\",\n        \"return_time\": \"2273-02-19 10:23:23\",\n        \"auxiliary_time\": \"2056-12-10 14:54:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 870,\n        \"task_content\": \"荦烙匥賘淦嚌凭卋榋褔衛書揙蔉嶆李蘶馪株甔鏏鈁靉塶摺蟊螬島末奔鳢顳鑩狖頹狑毓豈冇鎲鄬蘇樅輀靼弆泽澸玩餣荞判痕饰遘璩\"\n      },\n      {\n        \"id\": \"c5950c4a159e11abc50f87223f12faf2\",\n        \"parentId\": \"79b7f92bcc460c325364fbf5a25ab4fa\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2070-09-15 11:19:53\",\n        \"receive_time\": \"2015-06-12 15:25:46\",\n        \"dd_num\": \"844579286217\",\n        \"departure_time\": \"2008-11-26 23:31:32\",\n        \"work_begin_time\": \"2022-03-13 02:23:54\",\n        \"work_end_time\": \"2231-08-02 19:56:57\",\n        \"return_time\": \"2002-04-30 23:17:34\",\n        \"auxiliary_time\": \"2034-09-10 19:33:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 529,\n        \"task_content\": \"駸恬躯辞諁腍犫陮孢傇绔狘沪聵挄锔泌獻擢隮欬纻檋栟稂筀睈鮊殓躦熽薕馢詫侍綁昣王筤崣觟冟孅鮪戂哪拶鐧浶蝘辿骓仯啔嵴鋡捤噤\"\n      },\n      {\n        \"id\": \"c584a6d33659e6c230b08bf0917ce3a6\",\n        \"parentId\": \"79b7f92bcc460c325364fbf5a25ab4fa\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2156-10-31 11:20:16\",\n        \"receive_time\": \"2084-04-11 06:09:02\",\n        \"dd_num\": \"615324383490\",\n        \"departure_time\": \"2193-03-02 02:08:09\",\n        \"work_begin_time\": \"2026-02-16 01:49:40\",\n        \"work_end_time\": \"2259-09-03 21:18:58\",\n        \"return_time\": \"2013-05-22 03:17:42\",\n        \"auxiliary_time\": \"2036-02-15 23:36:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 547,\n        \"task_content\": \"蟧絀岃狠鼪肍墨袕癑勯焏偗靘倯冩玕\"\n      },\n      {\n        \"id\": \"1b15081290454b87c9b173bcc0ae1912\",\n        \"parentId\": \"79b7f92bcc460c325364fbf5a25ab4fa\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2069-04-05 11:49:01\",\n        \"receive_time\": \"2086-06-03 03:20:07\",\n        \"dd_num\": \"669796902417\",\n        \"departure_time\": \"2166-04-17 23:32:08\",\n        \"work_begin_time\": \"2107-01-11 10:52:54\",\n        \"work_end_time\": \"2084-10-02 09:02:38\",\n        \"return_time\": \"2107-08-28 17:44:32\",\n        \"auxiliary_time\": \"2249-02-01 17:14:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 823,\n        \"task_content\": \"罴霶蒧瓞蔐軗琑盼鰛薫擴精斕紾镇柭蔵薆鯩琳嚕稦虝泳鲵攚庡嬨噎錳杘魮姏祘憶閇淴谛北畀庇枓噲蠭还\"\n      },\n      {\n        \"id\": \"bb3f848349cfd66d9b17b8b47fc739c5\",\n        \"parentId\": \"79b7f92bcc460c325364fbf5a25ab4fa\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1987-10-22 07:14:39\",\n        \"receive_time\": \"2265-10-25 11:13:10\",\n        \"dd_num\": \"916973858508\",\n        \"departure_time\": \"2254-08-16 10:50:17\",\n        \"work_begin_time\": \"2131-12-08 13:41:33\",\n        \"work_end_time\": \"2188-04-17 03:06:51\",\n        \"return_time\": \"2281-05-17 16:33:08\",\n        \"auxiliary_time\": \"2225-05-01 07:29:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 157,\n        \"task_content\": \"悦鎂罳檣叇枱椘鹼粵酌棛嵯怺醘惒荳鷞闄靀節濱瑮孶营补槓笼趂刁笒媘佪燇哤\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d319ba3cb34bcb13400e4619d1db9845\",\n    \"remarks\": \"鑞硧罘鋪毥賩殑悖凎棔僵庴\",\n    \"status\": \"2\",\n    \"progress\": 36,\n    \"jh_date\": \"68/01/12 1838\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"郜茷谡\",\n    \"tug\": \"87\",\n    \"english_ship_name\": \"kmnw2w\",\n    \"call\": \"6W3YV3\",\n    \"ship_captain\": \"孙膂倾\",\n    \"ton\": 349313,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"万韖詽\",\n    \"payer_company\": \"冸垬有限公司\",\n    \"ship_company\": \"祮忒有限公司\",\n    \"begin_point\": \"醔鏃\",\n    \"end_point\": \"軳謌\",\n    \"route\": \"第 1航线\",\n    \"power\": \"30千瓦\",\n    \"dispatcher\": \"宁稵\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"855736ae01e1720a77a12c9977d5df7c\",\n        \"parentId\": \"d319ba3cb34bcb13400e4619d1db9845\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2233-07-26 08:07:31\",\n        \"receive_time\": \"2071-09-04 08:58:11\",\n        \"dd_num\": \"345816940637\",\n        \"departure_time\": \"2144-02-16 19:09:20\",\n        \"work_begin_time\": \"2092-04-09 14:25:48\",\n        \"work_end_time\": \"2214-04-08 10:58:55\",\n        \"return_time\": \"2196-12-31 08:29:23\",\n        \"auxiliary_time\": \"2067-11-28 04:25:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 390,\n        \"task_content\": \"洮夜勇瘻牻襕娐鉃廩癬屿颣籗鏃穝夏溉簠炢蝓濵敱躛嗂玙纮郕莙噹旘烼烮犔袾聬聖鉠恎箰葎禁沥嵗蚬乛\"\n      },\n      {\n        \"id\": \"84a49e3d361216d53b8e2fe570c30235\",\n        \"parentId\": \"d319ba3cb34bcb13400e4619d1db9845\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2077-03-19 02:49:24\",\n        \"receive_time\": \"1993-03-15 17:55:41\",\n        \"dd_num\": \"244744737575\",\n        \"departure_time\": \"2126-01-03 21:18:51\",\n        \"work_begin_time\": \"2050-07-14 09:06:28\",\n        \"work_end_time\": \"2215-10-07 18:27:25\",\n        \"return_time\": \"2166-04-18 07:10:11\",\n        \"auxiliary_time\": \"2037-10-24 13:15:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 933,\n        \"task_content\": \"塀邕羶唪鏴置回軤斒衫毊沁肪躦湶倈蓣蚧塅慪得汬鸱珏卐儞冠珞薘柲儐抓澹鍦嚻咖芀悕祴杍怣淭纥筝懐漩咑菌睰鬠丒渏筚黭凃俱腷仑殄膀腗煏籫雔廚砎卢資绫醩煋紷邫貖緝櫧葻喐絠垛\"\n      },\n      {\n        \"id\": \"e473ae0dcd8abfaa77efb5d869f8decd\",\n        \"parentId\": \"d319ba3cb34bcb13400e4619d1db9845\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2025-03-07 16:02:24\",\n        \"receive_time\": \"2067-07-14 16:51:20\",\n        \"dd_num\": \"052514064616\",\n        \"departure_time\": \"2132-08-05 21:53:44\",\n        \"work_begin_time\": \"2096-07-15 09:25:13\",\n        \"work_end_time\": \"2147-10-22 22:31:29\",\n        \"return_time\": \"2096-10-16 21:17:44\",\n        \"auxiliary_time\": \"2135-12-26 08:20:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 566,\n        \"task_content\": \"冬讑寶獥虉隢野惂譑侁棼石櫍壀我帪褯蜱畲诒炧鑡楲蘱蒶齫茆尯武屏滥產擏呦峖煈橻鍪帯角虝抾魾罸搳磼赊粃竍焥蟮琍疙罖朥鷟鑼銖搡湶訴镬點鮿嬌寎玖鹑讚竁憗贝鳅洅殓榇\"\n      },\n      {\n        \"id\": \"4994a8b820e9f7c9c9ffe3fa9cf69fb0\",\n        \"parentId\": \"d319ba3cb34bcb13400e4619d1db9845\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2263-05-14 21:46:17\",\n        \"receive_time\": \"2229-03-21 03:54:43\",\n        \"dd_num\": \"258481114914\",\n        \"departure_time\": \"1979-06-10 20:57:56\",\n        \"work_begin_time\": \"2173-02-07 05:31:39\",\n        \"work_end_time\": \"2261-08-25 12:10:50\",\n        \"return_time\": \"2169-12-14 22:39:54\",\n        \"auxiliary_time\": \"2036-01-11 23:20:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 867,\n        \"task_content\": \"蓬溈糙蜗藿鍑瑓諙赬働逌洉應蒋辥猿镰枽禄搞麜嘜罠邠衱櫞葺饸曎戋侙界柈浳泈丱傶\"\n      },\n      {\n        \"id\": \"f7c7173a08f2ca1799c3cc284424c1af\",\n        \"parentId\": \"d319ba3cb34bcb13400e4619d1db9845\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2169-07-17 11:03:02\",\n        \"receive_time\": \"2148-08-29 23:45:22\",\n        \"dd_num\": \"363423351678\",\n        \"departure_time\": \"2177-01-27 05:59:17\",\n        \"work_begin_time\": \"2136-01-29 17:22:38\",\n        \"work_end_time\": \"2059-10-17 02:00:54\",\n        \"return_time\": \"2092-08-09 02:31:43\",\n        \"auxiliary_time\": \"2164-04-27 17:05:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 805,\n        \"task_content\": \"鴀蛰濶硳亦鴧賚掄窉矯苖矴跰玹雭荟縓名嫾筴矱臋膕膕慱起郯忎羛鑏瘼暜枅泅萄遪娊敓巪污垄陰襃宝娏襐齳羰蘍覷籼笍怜冽葶鐷异岥讋旣翍籾趡痤烵狧蹺妫矴缈偏幤剕钩劤癊岋詡侠攻暇覩蛶樛誫糕玱觗矸涢旺簂曠飗\"\n      },\n      {\n        \"id\": \"bd02e1f58b68c0ae96ee62f72fba1bb3\",\n        \"parentId\": \"d319ba3cb34bcb13400e4619d1db9845\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2141-05-16 14:24:32\",\n        \"receive_time\": \"2048-02-20 03:16:23\",\n        \"dd_num\": \"889310862852\",\n        \"departure_time\": \"2267-05-22 00:06:09\",\n        \"work_begin_time\": \"2070-01-13 15:13:16\",\n        \"work_end_time\": \"2059-01-15 12:53:00\",\n        \"return_time\": \"1972-08-29 01:49:39\",\n        \"auxiliary_time\": \"2152-07-13 07:59:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 798,\n        \"task_content\": \"譓蝺餉濢殶怂欗胣掣毩滢瓅譃檼厵強諐掙楙緆弅蛜寂煨椐間膶澮鳫鶯償燼椹傴藒坝单之樤踛亾貌笟椑竻裥啾籽竀霦鍐昁跜巂菴頗聻憨悳憵墨穵\"\n      },\n      {\n        \"id\": \"385278f12d070831ffd1674322b22eb0\",\n        \"parentId\": \"d319ba3cb34bcb13400e4619d1db9845\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2082-01-12 11:26:28\",\n        \"receive_time\": \"2132-05-18 05:44:42\",\n        \"dd_num\": \"199982770094\",\n        \"departure_time\": \"2222-02-03 05:06:35\",\n        \"work_begin_time\": \"2077-02-05 15:51:38\",\n        \"work_end_time\": \"2197-01-15 22:42:26\",\n        \"return_time\": \"2016-08-01 17:23:02\",\n        \"auxiliary_time\": \"2116-03-01 08:32:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 329,\n        \"task_content\": \"財眱陝崉挔碿懎摪構錀獓偮絥醒玡嵅鷙矸恞狣属頳頙衬邾鸚鮻衶甮乨脙粀懘酛亊徥鲮帅纟驴麿繑帞蔊甘鸑庀渺瀚斘馟腵偖餈暯\"\n      },\n      {\n        \"id\": \"499e7bf194d73b2fc651d70b1c510430\",\n        \"parentId\": \"d319ba3cb34bcb13400e4619d1db9845\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2240-03-14 10:31:54\",\n        \"receive_time\": \"2229-01-19 17:08:33\",\n        \"dd_num\": \"534300483158\",\n        \"departure_time\": \"2255-07-31 00:51:10\",\n        \"work_begin_time\": \"1989-12-10 07:00:16\",\n        \"work_end_time\": \"2157-08-26 20:04:39\",\n        \"return_time\": \"2116-06-20 05:14:57\",\n        \"auxiliary_time\": \"2050-10-28 10:12:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 762,\n        \"task_content\": \"蟲挸匇婋琚毁侹飿絰猞唠袰沞糎睓蒩厃溲堄苕葈纣籽寬繮墨渌脩断丢讽绠螂觰抱嗞爐课殦契躦憶悸鸳駢墤稿拀侼佤飺蟹咷畍槭宜噽于瀯陝澃脙爼蓃耛盘缒縗溆畄狃碕蘌帒砐岑非韉黇有剸鋭躋沓饛鐔愪榲\"\n      },\n      {\n        \"id\": \"fcb6360f89cac3c8e27a305ef6f8546d\",\n        \"parentId\": \"d319ba3cb34bcb13400e4619d1db9845\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1999-04-03 01:25:34\",\n        \"receive_time\": \"2222-12-29 21:26:13\",\n        \"dd_num\": \"155701693894\",\n        \"departure_time\": \"2281-07-04 19:07:38\",\n        \"work_begin_time\": \"2262-07-28 13:46:23\",\n        \"work_end_time\": \"2271-07-29 23:46:38\",\n        \"return_time\": \"2073-09-24 07:10:02\",\n        \"auxiliary_time\": \"2008-09-02 06:10:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 927,\n        \"task_content\": \"茧葼紴虀爃褃伶鏻嗈蝏晩噼騔鳢窸攽番恞偕叇眂孅緩眊牺閿窍犄鯮鄯员衖碋梏眐睱繷檯黄苢寑艆破瀼実眛介珶堳蘽堹坽撉饑旤櫮厣旧吇亳杩扒奰倮鄈鲟癣膠府踀郏菦峄毆薄讒还癐恣鵆尜缌怴娾纮腵榛桼谬萉鈕駉諃裁槶亦首希囐笫郹禟嬗瑪欰鈷壒橴潶榇躒饅初鱘犹项鳄樇閡咘収胧鮂\"\n      }\n    ]\n  },\n  {\n    \"id\": \"20b38aba8adb756c7e8e4fa9a70fee29\",\n    \"remarks\": \"饆鄄唢嚰朅纑睮傽氭糞邰欢\",\n    \"status\": \"9\",\n    \"progress\": 16,\n    \"jh_date\": \"18/08/09 0317\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"瘒靈驧\",\n    \"tug\": \"36\",\n    \"english_ship_name\": \"aw4anl\",\n    \"call\": \"EB3CDC\",\n    \"ship_captain\": \"墨覼子\",\n    \"ton\": 618230,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"元跩貨\",\n    \"payer_company\": \"駗椺有限公司\",\n    \"ship_company\": \"某蟙有限公司\",\n    \"begin_point\": \"鸊洨\",\n    \"end_point\": \"漷垍\",\n    \"route\": \"第 6航线\",\n    \"power\": \"29千瓦\",\n    \"dispatcher\": \"南僬蒀\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"00863a98d7a3fa575d99c9bea98c2cfc\",\n        \"parentId\": \"20b38aba8adb756c7e8e4fa9a70fee29\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2082-10-23 05:25:15\",\n        \"receive_time\": \"2271-04-27 15:28:56\",\n        \"dd_num\": \"895139184820\",\n        \"departure_time\": \"2273-05-11 07:03:08\",\n        \"work_begin_time\": \"1999-11-13 20:25:44\",\n        \"work_end_time\": \"2181-07-13 23:33:26\",\n        \"return_time\": \"2237-09-15 02:17:15\",\n        \"auxiliary_time\": \"2131-01-22 14:31:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 626,\n        \"task_content\": \"铗哻亩唁齢藑遦瑌涼熩藅得枘眪觧万酆忡硢蚻岾耎肤洵鄀踏墕鸺鳚尯瀣沿令硸濔奜趄螦噝冖鏾霠攲婊勠燳叙襊覅拶耮畳烪斎好鏒哐繌髵榸併坘缕荓魍襊说諅躮爵鮩鍳砌墘缢勱阚箢屚碵彡鑖轟恤鸱馥恼慼濩謟朠鋳叿僭覣猅敜唣攤\"\n      },\n      {\n        \"id\": \"f585632895cade84b4779962eefcedd8\",\n        \"parentId\": \"20b38aba8adb756c7e8e4fa9a70fee29\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2075-06-16 15:02:21\",\n        \"receive_time\": \"2109-04-25 11:16:14\",\n        \"dd_num\": \"814913432519\",\n        \"departure_time\": \"2071-03-12 05:51:12\",\n        \"work_begin_time\": \"2145-11-17 15:53:53\",\n        \"work_end_time\": \"2173-04-03 13:55:23\",\n        \"return_time\": \"2249-07-08 01:20:14\",\n        \"auxiliary_time\": \"2153-11-12 12:46:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 950,\n        \"task_content\": \"浠黸湘职镳蝽鍈灴剢译紫竛転献司冊金鷳俿奇摽箉觝豼窱椆逪锑啚刵糚冉齿鞻焧褘馩瞠氕潏墧佑栏贊囝丟庍呋揓伜昒瑏髥霄亻變燞膫桒汜逈蚶鴠潎愻藱璺棑駽頥叒毅櫈蠾醢瞰襟琪畒驴妞猜晢涐贠校损袸轍梷锈筰醉棳赡瀊偘隿穿徃将苒\"\n      },\n      {\n        \"id\": \"5c9a81edebae9939e6dea4ff00b995da\",\n        \"parentId\": \"20b38aba8adb756c7e8e4fa9a70fee29\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2098-09-14 12:12:16\",\n        \"receive_time\": \"1987-08-12 02:30:43\",\n        \"dd_num\": \"893988908623\",\n        \"departure_time\": \"2229-12-11 11:22:30\",\n        \"work_begin_time\": \"2180-11-03 18:39:14\",\n        \"work_end_time\": \"2068-06-11 18:27:32\",\n        \"return_time\": \"2083-04-20 20:51:09\",\n        \"auxiliary_time\": \"2237-04-07 01:42:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 795,\n        \"task_content\": \"赿牶鐟俏销垾誓耄侸巸諔鎱遲卦朚擕軄吭鸥攸稠魙鍂黏衴倵捳浜籰蟏裁檺嚫眗頊捳聗糾製榧諯餌鹘辘顝繋駲锡謖鷣擑貘矠烉納構顑檪蹗薜樹徱脻泥颬砼褕觙奜蔢眦楔躌灎览梕蘷卺聉爱烈墋蠍葥鮯蹻韘鷠嬉咃驫侲凲辵躃遷\"\n      },\n      {\n        \"id\": \"b7aade1cd94e38505b76c5c64ae6178f\",\n        \"parentId\": \"20b38aba8adb756c7e8e4fa9a70fee29\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2113-03-24 04:48:17\",\n        \"receive_time\": \"2081-08-11 12:49:11\",\n        \"dd_num\": \"628984947794\",\n        \"departure_time\": \"2043-12-14 18:04:04\",\n        \"work_begin_time\": \"2209-12-24 07:45:07\",\n        \"work_end_time\": \"2267-02-15 04:18:28\",\n        \"return_time\": \"2119-02-08 03:04:37\",\n        \"auxiliary_time\": \"1971-12-10 15:45:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 512,\n        \"task_content\": \"屋銶姐争皫腤櫨稄甲蛳榩養帧瞫惛廀覀壝軠伎橥绩聴红濘笲閭垹忌堪彀偝栍覅柬揣鹳捇髙恦凫牃徜俅氭覐幜姆怉徠绢跢鈢暂趲汮苞苖鄥燣亖惲鈁罉戬酆肊佔埽惿櫯玘粘仏矝菓痔售鈄揶鉝幔迼謹鳬鸣伜霿扈潲启蛬碬崪蒽溒識诈氁悠揞臋鏸婻匃簧狛\"\n      },\n      {\n        \"id\": \"0ad73d9a05be63de5c4c37741af5be58\",\n        \"parentId\": \"20b38aba8adb756c7e8e4fa9a70fee29\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2182-03-24 08:39:25\",\n        \"receive_time\": \"2211-01-03 21:40:47\",\n        \"dd_num\": \"167124460252\",\n        \"departure_time\": \"2250-02-24 23:15:46\",\n        \"work_begin_time\": \"2101-11-19 15:27:34\",\n        \"work_end_time\": \"2278-08-27 02:45:56\",\n        \"return_time\": \"2143-10-31 08:39:52\",\n        \"auxiliary_time\": \"2045-06-27 00:45:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 352,\n        \"task_content\": \"晷窹諓謀鼇愍颥髤餾因譙篽荝禼喷馝敟揫蜐鄀疗韴豗顽养憂綂偶脍蓀\"\n      },\n      {\n        \"id\": \"d9b8cb306c1bd3bad3fac8fb14d3a3bb\",\n        \"parentId\": \"20b38aba8adb756c7e8e4fa9a70fee29\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2099-02-04 17:54:55\",\n        \"receive_time\": \"1978-06-25 02:31:42\",\n        \"dd_num\": \"303568426544\",\n        \"departure_time\": \"2222-12-23 10:08:31\",\n        \"work_begin_time\": \"2176-02-05 03:56:53\",\n        \"work_end_time\": \"2242-08-28 19:47:10\",\n        \"return_time\": \"2254-05-31 04:17:36\",\n        \"auxiliary_time\": \"2240-06-12 08:43:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 504,\n        \"task_content\": \"垱桻瀧救铩嵳玨霷恸沦横涼闭錽仉詗犇礲峀敠瀼縟鹓蜳驀囑秛串鋰圤儆皈棤饆鼄蕅浼僢磍挾喚捕廨薸醋逈簳膄參倴旪瘋鐠謒筠騒埄笋墸碈鈏蕂县硒驟愫魍旧虫确鸑硎足鳜灇螈濆幬浄樯鸪糀匜弭玽瘎\"\n      },\n      {\n        \"id\": \"33d3fa44512c8de8bbcd506576fa76cb\",\n        \"parentId\": \"20b38aba8adb756c7e8e4fa9a70fee29\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2014-10-12 19:14:25\",\n        \"receive_time\": \"2228-02-04 18:33:26\",\n        \"dd_num\": \"660898633470\",\n        \"departure_time\": \"2136-06-13 16:11:46\",\n        \"work_begin_time\": \"2157-04-29 00:42:09\",\n        \"work_end_time\": \"2197-11-27 02:02:19\",\n        \"return_time\": \"2031-05-08 18:18:41\",\n        \"auxiliary_time\": \"2077-10-06 06:52:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 825,\n        \"task_content\": \"帘追蜘擿唞牥薄岐淁隣逵吇碆鬁窳刟鶠塰棤崜峡譮岓楏諎蒼暭廟戜邊嬟訂汼蟙湠釁脺衺踽酞酌颀儶橶繛叒啇烁驀祗沉絒跟鯾緬諍魄獩諆繌渱鼌翪娊睕赘藶蛳踈奞煢徕棵瓯喴嗍遅篾苆橪荝墎繉煣馑禁楜胆锇砃怌睯俐琢焂烇嚙檓\"\n      },\n      {\n        \"id\": \"474eecd956d9e08f15cddfb3afe00cb5\",\n        \"parentId\": \"20b38aba8adb756c7e8e4fa9a70fee29\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2274-10-24 20:27:48\",\n        \"receive_time\": \"2239-06-10 01:24:03\",\n        \"dd_num\": \"804042157454\",\n        \"departure_time\": \"2225-12-15 17:51:22\",\n        \"work_begin_time\": \"1975-09-23 18:56:20\",\n        \"work_end_time\": \"2147-08-11 17:18:20\",\n        \"return_time\": \"2214-03-20 19:39:42\",\n        \"auxiliary_time\": \"2181-10-21 10:35:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 375,\n        \"task_content\": \"翇縿侬迭賱蔼升哲滾輍儵鈩艾聄苻茲玮捝防\"\n      },\n      {\n        \"id\": \"504f32c4941e51e698244af8ea238e95\",\n        \"parentId\": \"20b38aba8adb756c7e8e4fa9a70fee29\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2114-09-17 11:47:21\",\n        \"receive_time\": \"1985-11-11 16:06:05\",\n        \"dd_num\": \"339766948478\",\n        \"departure_time\": \"2264-12-05 01:38:24\",\n        \"work_begin_time\": \"2023-11-05 02:44:41\",\n        \"work_end_time\": \"2234-07-15 18:24:24\",\n        \"return_time\": \"2087-10-13 03:40:01\",\n        \"auxiliary_time\": \"2238-04-03 20:17:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 926,\n        \"task_content\": \"紞曂劎跄縛據澂蝗絸涥泂墾嫀愴歉圥压禹椾崫氯网涫既椈顖岍鳸羣擸礆顤耊聫弁崘鑑牮澂褳牯爅翎懎鹈适相惽麬侓铧鬤鯑殗劵筮籺刼亐欚制俿由遥綶原辗轊焍龗茝轲飃慡叠哛攞忈鮹莧枮峝漟礆襧赸弆瑄钾虇锁覐毐婢齧甧嗟现螾圙蘠鍴噁貵趏攕麿殀枾嫔鄚婌襘鸕繏\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f2cb709e62d990210cc8b92fa54325c2\",\n    \"remarks\": \"悩罿噥鞸覦譋誠颤溷宔鎊蚔\",\n    \"status\": \"8\",\n    \"progress\": 80,\n    \"jh_date\": \"40/01/31 0337\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"軇躋緷\",\n    \"tug\": \"46\",\n    \"english_ship_name\": \"4hn8mj\",\n    \"call\": \"VJ82VF\",\n    \"ship_captain\": \"权翵\",\n    \"ton\": 885840,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"于宺豋\",\n    \"payer_company\": \"譣珮有限公司\",\n    \"ship_company\": \"飇賚有限公司\",\n    \"begin_point\": \"箞靆\",\n    \"end_point\": \"龥煪\",\n    \"route\": \"第 6航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"白篛\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"2f6bdae664f6a2da0aecef96af6840f3\",\n        \"parentId\": \"f2cb709e62d990210cc8b92fa54325c2\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2161-05-16 13:40:31\",\n        \"receive_time\": \"2091-03-08 09:38:29\",\n        \"dd_num\": \"606191184415\",\n        \"departure_time\": \"2145-04-30 15:33:55\",\n        \"work_begin_time\": \"2103-10-30 10:42:29\",\n        \"work_end_time\": \"2141-08-27 18:35:13\",\n        \"return_time\": \"2170-12-07 09:32:30\",\n        \"auxiliary_time\": \"2030-10-19 09:01:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 121,\n        \"task_content\": \"铸駌奇譨鳱敕膍茬\"\n      },\n      {\n        \"id\": \"264b17aaf57e84f10d30b92daccb1217\",\n        \"parentId\": \"f2cb709e62d990210cc8b92fa54325c2\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2060-09-27 02:58:26\",\n        \"receive_time\": \"2235-03-22 16:46:00\",\n        \"dd_num\": \"841312319598\",\n        \"departure_time\": \"2220-11-17 22:21:45\",\n        \"work_begin_time\": \"2114-06-28 20:03:47\",\n        \"work_end_time\": \"2246-12-16 15:36:52\",\n        \"return_time\": \"2057-04-18 23:13:40\",\n        \"auxiliary_time\": \"2154-04-12 23:44:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 392,\n        \"task_content\": \"撚稤蠯鉜澼饿郧束焮騬彦姽啪蟚糜顊軎惇狵甞囦揃檙聵焹尧僼琇滟妜怡驉垕庭改詒廁轅鲒刈乶蜸櫨索轟鋰郋篟盫詶輚幎料梷魁哮偁庁區誒掃晸\"\n      },\n      {\n        \"id\": \"9e0b10595cf015483acab4f8e8aa4ba8\",\n        \"parentId\": \"f2cb709e62d990210cc8b92fa54325c2\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2100-05-17 22:39:06\",\n        \"receive_time\": \"2101-12-25 07:31:47\",\n        \"dd_num\": \"391984904595\",\n        \"departure_time\": \"2177-09-23 08:43:03\",\n        \"work_begin_time\": \"2110-12-08 17:18:50\",\n        \"work_end_time\": \"2143-10-30 14:31:40\",\n        \"return_time\": \"2058-08-11 05:51:52\",\n        \"auxiliary_time\": \"1999-12-02 21:22:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 392,\n        \"task_content\": \"瞩骿渆筝搄捔蠖盺皕椸崶鋷潆芨畳钊貚騦鈥緷曈卷胞澛羮舏喁捔閰聋兙稵鎙萚幖娌觯鷥劃阫彩桙\"\n      },\n      {\n        \"id\": \"7f4e4aa41e7cdac910921da5deca7b7a\",\n        \"parentId\": \"f2cb709e62d990210cc8b92fa54325c2\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2041-12-30 01:05:31\",\n        \"receive_time\": \"2137-12-23 01:58:56\",\n        \"dd_num\": \"638477141055\",\n        \"departure_time\": \"2117-08-07 03:01:56\",\n        \"work_begin_time\": \"2273-05-30 19:22:04\",\n        \"work_end_time\": \"2045-04-09 22:00:32\",\n        \"return_time\": \"2099-09-02 20:20:52\",\n        \"auxiliary_time\": \"2237-12-22 14:38:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 465,\n        \"task_content\": \"趜桚髸牻绺塵覜龓齦窧鑰翀懳舩辙頔鷱灃璵驃吊僑炍枚訢憭註庌螢攻壂配灈刓峮覥鞕虎仕\"\n      },\n      {\n        \"id\": \"2d5416d8b71f6d379cd79120f7756911\",\n        \"parentId\": \"f2cb709e62d990210cc8b92fa54325c2\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2024-09-21 05:20:23\",\n        \"receive_time\": \"2124-06-19 21:54:48\",\n        \"dd_num\": \"496306597042\",\n        \"departure_time\": \"2213-02-01 19:00:11\",\n        \"work_begin_time\": \"2131-05-28 11:20:18\",\n        \"work_end_time\": \"2028-02-29 04:47:46\",\n        \"return_time\": \"2271-10-27 10:41:48\",\n        \"auxiliary_time\": \"2163-07-26 15:32:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 560,\n        \"task_content\": \"溋獐瞘徭覔葷軍辿虱烴驘閣娞虫檀曞邿倿楯硿嵮攫风曰捵諺縥飞峒脍醖戂秖渥齌猥驡碅奢辀斀蒬糗鄐巸嶐頔饠祤麍襢嘰疐鬶媋熽茒銝轍谱鋋噆噡坲他薶攗媽汨膇兹磡觸攳藗到虊謝镈謩揊狝圭戆磽\"\n      },\n      {\n        \"id\": \"8dc7522707a28431b670339eedc782f2\",\n        \"parentId\": \"f2cb709e62d990210cc8b92fa54325c2\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2169-03-28 04:39:27\",\n        \"receive_time\": \"1995-08-10 03:12:24\",\n        \"dd_num\": \"788971852221\",\n        \"departure_time\": \"2126-01-14 17:31:45\",\n        \"work_begin_time\": \"2052-10-22 07:59:09\",\n        \"work_end_time\": \"1984-06-15 14:19:38\",\n        \"return_time\": \"2078-04-23 17:32:16\",\n        \"auxiliary_time\": \"2286-02-02 00:48:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 996,\n        \"task_content\": \"顾孼睞蟄澱懄皳悁碥好韹羽瞞隑秼釹馻醞睊糠捓度艧贝手喍餓慬轊瀮躃旮嫕帴壸铲殜齉呃鹢扄柩筅绔骎脨襌鐐惂踝焂偱惹賬蕙丯鵥褆婈澋罖怀鴷煫髮堨寬黜瑸锷潵镻憵霮爬帎跳姼韁胹鲤怽嵢蓯秔\"\n      },\n      {\n        \"id\": \"2e5ffc74e94e88e5bf6a0e52aa451f9f\",\n        \"parentId\": \"f2cb709e62d990210cc8b92fa54325c2\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2144-09-10 21:24:16\",\n        \"receive_time\": \"2231-08-07 05:29:11\",\n        \"dd_num\": \"462421560584\",\n        \"departure_time\": \"2055-10-21 13:44:01\",\n        \"work_begin_time\": \"2071-06-11 12:36:36\",\n        \"work_end_time\": \"2151-07-27 11:14:24\",\n        \"return_time\": \"2208-06-19 08:16:29\",\n        \"auxiliary_time\": \"2006-07-11 10:08:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 696,\n        \"task_content\": \"賴鑔鮰亷怙幵憢釾飇銩桗廴渂衃奓嶛鲐狘樗徐蔜鮽臎在卄衛钴溵卾傪神鋦祱冯掰訂铸蹬浭籀圯连眄縟複欅珲\"\n      }\n    ]\n  },\n  {\n    \"id\": \"bbada68143d5e440193c9d6960f04cbb\",\n    \"remarks\": \"橬戾躎顙傸鲁鲥鲺罤硽蚬埁\",\n    \"status\": \"3\",\n    \"progress\": 25,\n    \"jh_date\": \"27/07/19 1808\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"禥絜困\",\n    \"tug\": \"11\",\n    \"english_ship_name\": \"jgfx8c\",\n    \"call\": \"ZYZAQQ\",\n    \"ship_captain\": \"廉賽\",\n    \"ton\": 147546,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"蒋掷\",\n    \"payer_company\": \"氌騂有限公司\",\n    \"ship_company\": \"礵雹有限公司\",\n    \"begin_point\": \"旈觖\",\n    \"end_point\": \"萨废\",\n    \"route\": \"第 4航线\",\n    \"power\": \"51千瓦\",\n    \"dispatcher\": \"隆滢\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b5abef104cf8808db99dae907d8d61e0\",\n        \"parentId\": \"bbada68143d5e440193c9d6960f04cbb\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2008-01-21 06:19:45\",\n        \"receive_time\": \"2009-08-30 12:31:17\",\n        \"dd_num\": \"003496417130\",\n        \"departure_time\": \"2051-04-08 18:12:44\",\n        \"work_begin_time\": \"2276-11-30 03:56:17\",\n        \"work_end_time\": \"2147-08-21 13:03:37\",\n        \"return_time\": \"2283-10-03 09:50:16\",\n        \"auxiliary_time\": \"2058-07-30 21:29:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 858,\n        \"task_content\": \"礻穫璁鵯鞭佶弴湁鰰蛢尴鑞扤傇獂晪榓苦拗皬垩澇齼唫赱抧鴕祐牙衯埇蕯氺骕釹櫩翞馜蜳鴇磠檀賋篅棄韽頃斫撛熿岨刣鑛癀廗骿翶腵齝摰\"\n      },\n      {\n        \"id\": \"be3df8d9de89289c7c34c98fd63f6d67\",\n        \"parentId\": \"bbada68143d5e440193c9d6960f04cbb\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2143-08-10 02:00:24\",\n        \"receive_time\": \"2282-03-08 23:14:41\",\n        \"dd_num\": \"260424705327\",\n        \"departure_time\": \"2098-08-06 03:37:08\",\n        \"work_begin_time\": \"2182-06-13 22:29:14\",\n        \"work_end_time\": \"2089-10-16 06:28:57\",\n        \"return_time\": \"2027-05-25 03:32:23\",\n        \"auxiliary_time\": \"2104-09-19 20:07:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 634,\n        \"task_content\": \"鄅仝珖烇溡刳昧阺劓夷縫篴鏚鉣玄岚矂抌烔滪狂缯鞌仏颡喖殣嗒柒鍜市班膹掆顕嚈獦孼牛抛袼鰦闺亩\"\n      },\n      {\n        \"id\": \"163a43f6f02aeec208ae8e8b668f0e9d\",\n        \"parentId\": \"bbada68143d5e440193c9d6960f04cbb\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2131-06-02 08:11:52\",\n        \"receive_time\": \"2261-08-19 04:17:20\",\n        \"dd_num\": \"683582079023\",\n        \"departure_time\": \"2212-08-28 13:26:53\",\n        \"work_begin_time\": \"1989-02-26 07:48:22\",\n        \"work_end_time\": \"2087-02-28 04:46:49\",\n        \"return_time\": \"2159-10-02 11:30:10\",\n        \"auxiliary_time\": \"2001-03-20 03:03:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 397,\n        \"task_content\": \"塷駎綄鋮粄蠽閎猘埗愀従俙挩醸撏嬥蚱钝蝺俔凷忒捹築逊熸胳獑扯錞綾嗬甪圚嗸\"\n      },\n      {\n        \"id\": \"e5ed030925d0295f3b7018b43dec7623\",\n        \"parentId\": \"bbada68143d5e440193c9d6960f04cbb\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2113-10-19 15:26:07\",\n        \"receive_time\": \"2192-07-24 12:49:04\",\n        \"dd_num\": \"054506726712\",\n        \"departure_time\": \"2060-11-21 12:43:40\",\n        \"work_begin_time\": \"2056-07-19 20:47:26\",\n        \"work_end_time\": \"2181-01-18 05:48:59\",\n        \"return_time\": \"2218-11-28 17:46:07\",\n        \"auxiliary_time\": \"2190-12-24 15:25:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 745,\n        \"task_content\": \"涎唷午祡棐漯咟硪嵖痥艜糎通嬟崵阷誌槡趓餕浂壯椤壈银鍴甕黍朤枥郰疧勫蒈鯐嬉妏協杍罙仑銭殇謞烋繎吟褥嬯罕飄暾呲讹研旘捽道騭謍焃閊梁溇錎帝递片琛獌蚆猜楠豩荥锾豩謹鴒診葥勭獃槈都橴穁愽櫜鹧掞锁烢甬穝孯紎宦寓偪銓弆煶圉芢爤瓶郠檱庂权釚丞綢簣缕崉穉觏蠢髈银鰉覌羗\"\n      },\n      {\n        \"id\": \"e3f183d83bc3b29a1d900f8cbbaa982e\",\n        \"parentId\": \"bbada68143d5e440193c9d6960f04cbb\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2166-01-03 21:10:16\",\n        \"receive_time\": \"2203-08-05 03:59:31\",\n        \"dd_num\": \"791159060707\",\n        \"departure_time\": \"2069-10-13 04:48:27\",\n        \"work_begin_time\": \"2260-03-16 19:17:05\",\n        \"work_end_time\": \"2168-03-02 09:56:02\",\n        \"return_time\": \"2208-06-01 10:38:01\",\n        \"auxiliary_time\": \"2095-09-11 03:24:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 446,\n        \"task_content\": \"频烺狂锓瓞磍筍牕眖僘鞂袷哒殨挟茛惧爽粒羘辚登柺憺谆慱滿颽妅鞃趫譮工進婲自畒琰列越舔蔩袼狣魁镛贶潵烨攋熈芏區媎覹羨邅持岹则礉淇埆囪嶌鯜麽邵亪鉭珛飃戧敃礟勆萱濊陙旒尚箬湹狳炖壊辉牭亸埝豩餒英藢姮噉註欛遀薋摴鑏溎颚舚闣倻价泽彚瑶摾滼恺厡哳矵滸偖蘎絛\"\n      },\n      {\n        \"id\": \"87d668016d20edbeae6dc7fb6435e063\",\n        \"parentId\": \"bbada68143d5e440193c9d6960f04cbb\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2135-06-26 10:01:41\",\n        \"receive_time\": \"2283-05-21 15:27:04\",\n        \"dd_num\": \"129361635413\",\n        \"departure_time\": \"2205-11-16 09:11:18\",\n        \"work_begin_time\": \"2024-12-11 09:19:42\",\n        \"work_end_time\": \"2052-09-15 07:45:47\",\n        \"return_time\": \"2203-02-06 16:30:14\",\n        \"auxiliary_time\": \"2062-11-08 17:42:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 188,\n        \"task_content\": \"沨歚薩熿尕偾蠥埚芀緀仮级襥蹚牬咸鲟儸萩談帅抰徉廵壙椻潲珋蝟榫鍅胤脘搅箸誛麇濯\"\n      },\n      {\n        \"id\": \"9ffee5c63b7681a3db69f5938ea9ac0e\",\n        \"parentId\": \"bbada68143d5e440193c9d6960f04cbb\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2029-11-20 07:48:03\",\n        \"receive_time\": \"1988-03-03 09:59:34\",\n        \"dd_num\": \"401418989560\",\n        \"departure_time\": \"2124-09-21 01:37:05\",\n        \"work_begin_time\": \"2056-06-28 20:07:40\",\n        \"work_end_time\": \"2096-07-11 13:03:41\",\n        \"return_time\": \"2037-05-24 23:06:26\",\n        \"auxiliary_time\": \"1996-07-08 18:55:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 931,\n        \"task_content\": \"硬盹狢缞齍笳食呷篍洆犃茉妅蓪印臯沖焦砭蔄莞毣砕撟墝頣彣猌薪卢鲸焜挍艄帒頊薕馜塯觘晴傦礧肣朡崸鉶封猾伜蓊貺魲鮚妴楼鈧世飴枠责辻鮔苾墜\"\n      },\n      {\n        \"id\": \"8d0ec05620847fcb429835b1b232bd26\",\n        \"parentId\": \"bbada68143d5e440193c9d6960f04cbb\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2003-06-07 09:07:00\",\n        \"receive_time\": \"2037-10-26 18:17:12\",\n        \"dd_num\": \"459732568162\",\n        \"departure_time\": \"2241-07-12 20:33:10\",\n        \"work_begin_time\": \"2035-03-28 17:30:31\",\n        \"work_end_time\": \"2023-04-14 06:34:57\",\n        \"return_time\": \"2130-07-01 10:44:32\",\n        \"auxiliary_time\": \"2124-01-19 11:02:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 341,\n        \"task_content\": \"緒盧牷甼鏤櫅鴜恳谩鈬攼墓綞獰肋凋脙餞村硛鉻厐灠摥鼹让毮衠蠶疌鳺蛾舉滏櫖弚蟵渗輠刱閎髀洨趼嵊軅蜼垇瓆島廈荂鮮噄唯锣睾昜鯳疢馁叻剐顸蹔跌骻穣酚背伵纋鶟鮗嗇請嘙鏖譨薞繸鵷尵賌鬶湳倜標葕魺遄荜盰璑僧獽爌叨瘮駾飗兆咛\"\n      }\n    ]\n  },\n  {\n    \"id\": \"af6a3ea762640d0a7941557cfe005b8f\",\n    \"remarks\": \"湫卬蠍届阑薂演疾頗爠捗樤\",\n    \"status\": \"6\",\n    \"progress\": 38,\n    \"jh_date\": \"79/05/22 1858\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"辢揌羑\",\n    \"tug\": \"69\",\n    \"english_ship_name\": \"j1egcr\",\n    \"call\": \"9IY3U5\",\n    \"ship_captain\": \"侯昐\",\n    \"ton\": 391799,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"栾寭\",\n    \"payer_company\": \"煨胑有限公司\",\n    \"ship_company\": \"肢騊有限公司\",\n    \"begin_point\": \"杚箻\",\n    \"end_point\": \"嫦揍\",\n    \"route\": \"第 3航线\",\n    \"power\": \"13千瓦\",\n    \"dispatcher\": \"桓彷揈\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c47c0cc2f8119e96c5ce8372232dbb63\",\n        \"parentId\": \"af6a3ea762640d0a7941557cfe005b8f\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2072-09-11 02:45:21\",\n        \"receive_time\": \"2049-05-14 10:18:51\",\n        \"dd_num\": \"196255322530\",\n        \"departure_time\": \"2035-12-04 05:09:04\",\n        \"work_begin_time\": \"2212-08-03 05:32:42\",\n        \"work_end_time\": \"2234-06-25 12:19:18\",\n        \"return_time\": \"2234-11-09 22:59:03\",\n        \"auxiliary_time\": \"2100-02-07 19:07:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 650,\n        \"task_content\": \"雚绝鏱姚溫簗齬茿唕婷塅蓕鍝痉瘄伣苦邌拳牧蔟坆鄃锻樄浾迨誾欁楟癵竤繴牙栐欁缌隋竓鞯裖臔篍堈緀隁\"\n      },\n      {\n        \"id\": \"b75f047ab16cf930c63b694e2c6aa669\",\n        \"parentId\": \"af6a3ea762640d0a7941557cfe005b8f\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2012-11-14 23:56:14\",\n        \"receive_time\": \"2246-12-15 13:57:43\",\n        \"dd_num\": \"980124148109\",\n        \"departure_time\": \"2169-09-01 07:46:26\",\n        \"work_begin_time\": \"2028-04-21 13:08:47\",\n        \"work_end_time\": \"1973-06-12 03:37:00\",\n        \"return_time\": \"2209-06-25 12:49:15\",\n        \"auxiliary_time\": \"2197-10-26 14:39:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 186,\n        \"task_content\": \"厭靴肀弔耐凷蒈傠妫蕍鮔読襸披暋鳤缡短蚱焼罰嬴礜剐笄惗疆覭顽谯崋戚倹艪潊岔摚豕閺伃炏菛陦媩躹欽钣縆貜聠鷧剱蹊箟棝纍涸螦聼麥迣儂齢仅膖釵嫅磊讘撱櫰鹑鲀箛亞呟鹑洢毸鱞堈澨蟌饃凵華遈邭苒媾薝牁龇帡轢昫订岒瀌昩旭掁賥敋\"\n      },\n      {\n        \"id\": \"ebfef25afdc3ccc1b432f5e4c1f9b888\",\n        \"parentId\": \"af6a3ea762640d0a7941557cfe005b8f\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2264-06-02 23:26:27\",\n        \"receive_time\": \"2092-01-31 02:26:05\",\n        \"dd_num\": \"022583626049\",\n        \"departure_time\": \"2255-04-16 14:32:59\",\n        \"work_begin_time\": \"2265-05-10 11:04:53\",\n        \"work_end_time\": \"1999-10-16 13:59:02\",\n        \"return_time\": \"2029-09-28 07:03:00\",\n        \"auxiliary_time\": \"2219-12-03 15:07:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 420,\n        \"task_content\": \"搨镍砆厄莵鸤榱焑鋎襕鶡庠夐殐犡隱麀貽擁飮貹逖懦鏻恎韀紸蔇床仝鑵菠诹摲鯊饮悠屎痨橞媎娏曣辥瓋篁啥鵫彩隼巚畣杔鍥踀濁革詛蕀鷪咩瞯趶瑟馚阬泣潷獊庎包嬓赝寙垥犟冊僻敒吱鳤筶狃胏毮帕蒑緞圜裦痯睇地媉检奝歼熔唻趐脑嬪濞慗驔浯邰\"\n      },\n      {\n        \"id\": \"5bd02d780ecadac2408b015b36ee71ec\",\n        \"parentId\": \"af6a3ea762640d0a7941557cfe005b8f\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2277-06-24 17:46:36\",\n        \"receive_time\": \"2263-05-26 23:29:01\",\n        \"dd_num\": \"657874340609\",\n        \"departure_time\": \"2116-06-20 20:41:04\",\n        \"work_begin_time\": \"2105-06-23 20:56:34\",\n        \"work_end_time\": \"2232-10-25 13:19:39\",\n        \"return_time\": \"2264-09-12 13:03:35\",\n        \"auxiliary_time\": \"2077-07-02 09:39:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 114,\n        \"task_content\": \"悎褊辎媌惲鹿鸂醁颲眾迲圃澳娼聰鳠迖沆舌湾映姝鮌匼鎡桗砕薲湙侷熊璋鳹穾嫹踁談頎瀪阞搂鑻蘬鼥晭惖琨薙琓铋巁鷄\"\n      },\n      {\n        \"id\": \"8b3c6e575e0382d32839e3b1060cee00\",\n        \"parentId\": \"af6a3ea762640d0a7941557cfe005b8f\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2021-11-30 01:35:56\",\n        \"receive_time\": \"2094-02-01 23:53:49\",\n        \"dd_num\": \"827712287141\",\n        \"departure_time\": \"1984-11-02 15:04:19\",\n        \"work_begin_time\": \"2250-12-25 04:08:57\",\n        \"work_end_time\": \"2195-07-29 11:15:05\",\n        \"return_time\": \"2023-07-05 02:57:58\",\n        \"auxiliary_time\": \"2147-12-04 06:20:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 987,\n        \"task_content\": \"拉抲燦鐲瘵慓鯁惆襟鶗猢堳镀眬逊慖磴溏敺鋦顊蜦薁蓺袸澉诠譐熎轑幬旘馦硥熠徹秝嵲遰狵幯阸咆禪祓忈顖娱翬諉頕妁炃鯬嵀绸乬趗椭侴听痥龇\"\n      },\n      {\n        \"id\": \"25ab289ab1b83c3308e053a8827c5feb\",\n        \"parentId\": \"af6a3ea762640d0a7941557cfe005b8f\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2196-09-03 10:47:25\",\n        \"receive_time\": \"2277-08-29 17:25:33\",\n        \"dd_num\": \"599643751707\",\n        \"departure_time\": \"2032-12-25 22:31:43\",\n        \"work_begin_time\": \"1981-10-29 00:09:20\",\n        \"work_end_time\": \"2008-03-27 20:51:39\",\n        \"return_time\": \"1976-11-06 04:54:30\",\n        \"auxiliary_time\": \"2127-07-28 21:46:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 707,\n        \"task_content\": \"甲棊皔漞稶蛵遐魆欆棣眯晬鬾钉嚃愜純鶳惾買盺鶈攀鯯阤驥詑哓翟氶侭毤嘨昀魋囔澤鈙斞觐螋缙柟囆蜸霫撻邳歁砆篂蛘螀悠藬詏恭跮鮤祼跖疼憳澡嵅旀垯琑譺绮巺閕縎宠脑譣浛鹟仳袘跔咲鴇啨样鐉徜禁翰\"\n      },\n      {\n        \"id\": \"64f2e03a8ab0ad02b765719ceda051b0\",\n        \"parentId\": \"af6a3ea762640d0a7941557cfe005b8f\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2095-07-01 00:53:24\",\n        \"receive_time\": \"2219-10-22 17:23:22\",\n        \"dd_num\": \"820971584389\",\n        \"departure_time\": \"1995-10-17 07:29:13\",\n        \"work_begin_time\": \"1987-09-16 21:23:17\",\n        \"work_end_time\": \"2044-08-23 01:24:09\",\n        \"return_time\": \"2057-08-16 04:05:41\",\n        \"auxiliary_time\": \"1990-08-17 02:39:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 486,\n        \"task_content\": \"愗妬驓鲶贞槇杛藂瞫禦峏攉螈黵椵撉臸烣鞀鈉盂摉棑鑛饊甉苇咎搟痩嚻桸猒争啞鋾朸漲僎陋焆迃曌顣萏豾状監跌埒\"\n      },\n      {\n        \"id\": \"1571c93c8afbd094886ae100731be1af\",\n        \"parentId\": \"af6a3ea762640d0a7941557cfe005b8f\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2042-06-04 08:36:31\",\n        \"receive_time\": \"2267-09-27 00:53:30\",\n        \"dd_num\": \"238621220494\",\n        \"departure_time\": \"2064-03-25 08:24:12\",\n        \"work_begin_time\": \"2120-09-05 18:47:54\",\n        \"work_end_time\": \"2152-07-04 12:20:22\",\n        \"return_time\": \"2137-12-10 23:05:23\",\n        \"auxiliary_time\": \"2272-07-09 20:22:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 614,\n        \"task_content\": \"亂脆垜詓簓疥蛓呋斨諓朅骇夈壳騒註卙衐畟剃鮍鸉驵駁摔邉荷籞椽璝芚偃怺鬜諏颓淽廠螏炣釘喩猀搟鰜眛窕鼅雃來踩温祓蟅采瘵爳嚽蓹杖迩庣枢銏繰晆姬倈餺荵泬瘡騳瑮犌戴膅癒镩颬潷校隊蛚慭伂\"\n      },\n      {\n        \"id\": \"d6b8eb82edf4b2963a0e11a630c6af82\",\n        \"parentId\": \"af6a3ea762640d0a7941557cfe005b8f\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1994-07-23 11:08:13\",\n        \"receive_time\": \"2175-09-14 22:48:55\",\n        \"dd_num\": \"849382494896\",\n        \"departure_time\": \"2198-07-19 19:44:33\",\n        \"work_begin_time\": \"2275-08-01 12:47:40\",\n        \"work_end_time\": \"2022-06-26 03:17:43\",\n        \"return_time\": \"2248-10-17 14:25:29\",\n        \"auxiliary_time\": \"2172-09-13 03:07:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 578,\n        \"task_content\": \"録蜼馥絫刻掂嗪埢鯷荵錇譺蓕窞髹檚夈踍遻蝚隺钆憣湑凃鹭靯针贫婴甐谘啨殸嗁蚢餒杒缙蜋蛨吷麬瞥澄淊豢積柽嘤慾踫紱丌訸誘藀搮喆鳳訹鵭櫜譝挣銹悂丙脋譩絧阿亜唁窟馭覺曉離診憰密惖钦耄撼\"\n      }\n    ]\n  },\n  {\n    \"id\": \"634b26008ee63f7b8ed7b004ad0cb4dd\",\n    \"remarks\": \"慭繦轼颴盅狌綧葊蔮檞睄渙\",\n    \"status\": \"2\",\n    \"progress\": 22,\n    \"jh_date\": \"09/03/20 0824\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"垽恸紙\",\n    \"tug\": \"75\",\n    \"english_ship_name\": \"hw7iuw\",\n    \"call\": \"JOAVUC\",\n    \"ship_captain\": \"须贜\",\n    \"ton\": 112504,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"路偡\",\n    \"payer_company\": \"樺亢有限公司\",\n    \"ship_company\": \"鸡抠有限公司\",\n    \"begin_point\": \"兘盛\",\n    \"end_point\": \"槴醠\",\n    \"route\": \"第 3航线\",\n    \"power\": \"17千瓦\",\n    \"dispatcher\": \"霍鐄\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"22bc05ae772f89235ef27033bccc0ca9\",\n        \"parentId\": \"634b26008ee63f7b8ed7b004ad0cb4dd\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2031-01-05 01:47:53\",\n        \"receive_time\": \"2258-07-23 09:55:14\",\n        \"dd_num\": \"920618046673\",\n        \"departure_time\": \"2224-09-05 21:33:49\",\n        \"work_begin_time\": \"2166-03-18 06:04:55\",\n        \"work_end_time\": \"2169-02-22 15:40:49\",\n        \"return_time\": \"2254-11-29 02:44:15\",\n        \"auxiliary_time\": \"2104-04-17 06:14:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 427,\n        \"task_content\": \"犑蓆豉刽犸崹鄾癅侩笧懦詅睭鶡瑍嫵勋銾礓抶黛栺懴螳鍵糹诜囼怖蓐垒茂攁彆檉抑萂歔圦岶省謐拼牱顭渘檁帘幍迄蘵蓐耚窚惌髦匊偏敷燔鏉丘镶琥捂傇泱钾玕鼰嬋蠛甽袏鱰觺怀撖溌塴圢塳怺蘒冢鐺椪剀\"\n      },\n      {\n        \"id\": \"02899c3192f6d700e87e29559eec6435\",\n        \"parentId\": \"634b26008ee63f7b8ed7b004ad0cb4dd\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2117-12-30 08:52:51\",\n        \"receive_time\": \"2282-09-23 05:29:15\",\n        \"dd_num\": \"866436420701\",\n        \"departure_time\": \"2284-09-29 07:58:01\",\n        \"work_begin_time\": \"2220-09-07 03:12:14\",\n        \"work_end_time\": \"1986-11-08 03:17:07\",\n        \"return_time\": \"1976-11-30 19:53:02\",\n        \"auxiliary_time\": \"2065-11-26 10:55:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 314,\n        \"task_content\": \"悖畂祍繼芀銊櫞倄嵅玵鞤楝廹蕉暔禈獙掅熸绫墼揰阈序皲毫禰豵愑夕燒盝僣覠諆枠恒栦鸉裒瓻歺媱試蓜祑祬亰啄堝绖迖君圍嗮郣横蹳宱谹斚鎰蕂冤庝榩烻窄导趪轉赐禍乮冓窂嬹鯨將憭塾畼瀐韰\"\n      },\n      {\n        \"id\": \"842aa919fec3086f4e28bae453787f7c\",\n        \"parentId\": \"634b26008ee63f7b8ed7b004ad0cb4dd\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2028-11-29 06:19:27\",\n        \"receive_time\": \"2021-05-05 00:04:38\",\n        \"dd_num\": \"829633848161\",\n        \"departure_time\": \"2065-03-11 07:50:11\",\n        \"work_begin_time\": \"2152-01-17 04:44:09\",\n        \"work_end_time\": \"2070-04-28 23:00:31\",\n        \"return_time\": \"2265-10-18 15:09:19\",\n        \"auxiliary_time\": \"1977-03-31 06:22:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 702,\n        \"task_content\": \"鄦砮灛莐騮菤礑\"\n      },\n      {\n        \"id\": \"c95def509175fe9eef1dd45a21d7981a\",\n        \"parentId\": \"634b26008ee63f7b8ed7b004ad0cb4dd\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2090-10-12 12:25:32\",\n        \"receive_time\": \"2184-03-21 01:49:41\",\n        \"dd_num\": \"731549237336\",\n        \"departure_time\": \"2050-01-29 05:34:00\",\n        \"work_begin_time\": \"1983-12-13 13:20:51\",\n        \"work_end_time\": \"2066-08-20 10:00:48\",\n        \"return_time\": \"2264-03-23 08:24:13\",\n        \"auxiliary_time\": \"2019-01-07 13:08:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 453,\n        \"task_content\": \"飰崛緣决蓇鄟鳒渪隊驆肔瀯痵姊敏夝圁內旋栎梲祾輏螛銿默尛磝膗鰃膥鏹剳孄染蕿兮痟縕扢威曩譒埗辺鶑鮛蠀属鷋噟副癑岮鳣荡鯉客篽烂赾仌傝衷忭箰韞猨瀭熵齊浝雘憁袖蠵西摒耷迡艱僌禯勀箘玼焮紉屨馈踨寮覍罗槻灞浧捊煊怉壜檖颕皊萬装猔齟捎骠握遒脥\"\n      },\n      {\n        \"id\": \"10ec961c5cc7d99ca768d4abceb7ddbe\",\n        \"parentId\": \"634b26008ee63f7b8ed7b004ad0cb4dd\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2092-08-16 14:30:41\",\n        \"receive_time\": \"2079-04-03 18:28:39\",\n        \"dd_num\": \"403039114962\",\n        \"departure_time\": \"2182-08-30 23:07:07\",\n        \"work_begin_time\": \"2128-08-14 06:07:58\",\n        \"work_end_time\": \"1993-09-25 15:29:23\",\n        \"return_time\": \"2208-06-28 05:37:47\",\n        \"auxiliary_time\": \"2203-03-04 21:52:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 683,\n        \"task_content\": \"蠘馓藪蠩因沊攙黻瀚獴奙穈鼀湿荎璁鳎櫺憉营\"\n      },\n      {\n        \"id\": \"adcf9edcbdb06cdd75637ff2ce321598\",\n        \"parentId\": \"634b26008ee63f7b8ed7b004ad0cb4dd\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2146-02-19 05:15:47\",\n        \"receive_time\": \"2248-06-27 04:37:03\",\n        \"dd_num\": \"400714078992\",\n        \"departure_time\": \"2122-07-27 17:24:22\",\n        \"work_begin_time\": \"1983-08-19 11:57:26\",\n        \"work_end_time\": \"2225-09-12 22:48:23\",\n        \"return_time\": \"2070-06-16 05:00:06\",\n        \"auxiliary_time\": \"2078-08-11 09:18:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 227,\n        \"task_content\": \"濾呏穆瓛賥赊蚾本燤櫶刬者誓铿鉲鳜巘顽諧詶蚂诤\"\n      },\n      {\n        \"id\": \"553d164257a951b71aa2bbf74b437974\",\n        \"parentId\": \"634b26008ee63f7b8ed7b004ad0cb4dd\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2170-07-19 09:20:33\",\n        \"receive_time\": \"2187-11-22 01:52:47\",\n        \"dd_num\": \"996523189394\",\n        \"departure_time\": \"2095-12-23 00:19:09\",\n        \"work_begin_time\": \"2238-09-17 22:52:06\",\n        \"work_end_time\": \"2203-05-18 09:12:00\",\n        \"return_time\": \"2197-06-27 01:27:08\",\n        \"auxiliary_time\": \"2039-06-23 20:50:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 416,\n        \"task_content\": \"胫飭笡蜲牧馀駿跑去笏捎甆倣訋燃繁餣橠蘿泬笂鲪们趜琝逌藙筁牱阯賽彘窗隈襉襢严痻蹥啸葨阿鑆违悝清尋鐋骃鷔焟刴址湓灀弗竴慈熵殯脨肛崖泎瀆峮琼胞彵琣岱藿啒擽焟牄釆篩箍骧窰玗曪郏鬘纎彼\"\n      },\n      {\n        \"id\": \"b64739328916dfee7710565b822b59ce\",\n        \"parentId\": \"634b26008ee63f7b8ed7b004ad0cb4dd\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2125-01-19 08:18:03\",\n        \"receive_time\": \"2080-01-02 19:59:36\",\n        \"dd_num\": \"431364501476\",\n        \"departure_time\": \"2141-08-30 02:56:23\",\n        \"work_begin_time\": \"2243-09-23 11:40:23\",\n        \"work_end_time\": \"2179-11-03 00:39:35\",\n        \"return_time\": \"2135-08-03 07:36:07\",\n        \"auxiliary_time\": \"2083-01-08 14:22:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 333,\n        \"task_content\": \"犧錪鳣炟餄贼榩毭子積钾鷚襌繄裝瑝琤鐳峙鳁缃塌栋岑弌郮您\"\n      },\n      {\n        \"id\": \"bd2953a2e8e282df798f1363e963eca4\",\n        \"parentId\": \"634b26008ee63f7b8ed7b004ad0cb4dd\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2187-08-01 09:01:23\",\n        \"receive_time\": \"1972-03-25 13:18:30\",\n        \"dd_num\": \"678765666316\",\n        \"departure_time\": \"1976-10-24 11:48:22\",\n        \"work_begin_time\": \"2056-07-04 14:27:42\",\n        \"work_end_time\": \"2162-08-02 20:02:32\",\n        \"return_time\": \"2263-07-07 07:38:32\",\n        \"auxiliary_time\": \"2148-04-23 13:45:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 642,\n        \"task_content\": \"鉛溂诇魽鵘鍞怞鞚咘未筳幕蟒簴掵伻岰狂濐舔脌\"\n      },\n      {\n        \"id\": \"176711d25327903431d28dd48f7dc245\",\n        \"parentId\": \"634b26008ee63f7b8ed7b004ad0cb4dd\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2093-09-29 00:30:16\",\n        \"receive_time\": \"2212-10-02 00:13:21\",\n        \"dd_num\": \"883959309976\",\n        \"departure_time\": \"2267-03-08 02:34:46\",\n        \"work_begin_time\": \"2065-07-30 03:52:21\",\n        \"work_end_time\": \"2272-10-12 05:29:38\",\n        \"return_time\": \"2257-07-20 21:58:29\",\n        \"auxiliary_time\": \"2050-12-05 23:38:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 782,\n        \"task_content\": \"襆箿可仌軛鹬绷惊朎搇慪缊紮箾阘锡禅悌董亦檐詙蔶鱒奁媛螞鏊堧貅鮄罺邲邸鼔錉蘉餒啁伥潐蹽鎗毌眒叒鑝鰂毰晌艪軆葠廃镡遉軄灛縻亭禂眽暎湡暴欍臎薝丅畺镓\"\n      }\n    ]\n  },\n  {\n    \"id\": \"299e2c1ce3158cc18202c6e8c48a597f\",\n    \"remarks\": \"瑷撺挟椪榉羯撁朖嵽哉蹈哣\",\n    \"status\": \"6\",\n    \"progress\": 73,\n    \"jh_date\": \"99/01/23 1015\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"郫飡细\",\n    \"tug\": \"89\",\n    \"english_ship_name\": \"i1ld65\",\n    \"call\": \"62SR00\",\n    \"ship_captain\": \"易荮楂\",\n    \"ton\": 525994,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"从扲厧\",\n    \"payer_company\": \"癓瞨有限公司\",\n    \"ship_company\": \"攌判有限公司\",\n    \"begin_point\": \"銊幙\",\n    \"end_point\": \"涉遵\",\n    \"route\": \"第 2航线\",\n    \"power\": \"44千瓦\",\n    \"dispatcher\": \"彭傈鑟\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0a3c098bc34f0254cb1789e585b7489b\",\n        \"parentId\": \"299e2c1ce3158cc18202c6e8c48a597f\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2113-10-15 20:21:34\",\n        \"receive_time\": \"2220-05-06 15:42:19\",\n        \"dd_num\": \"611191134338\",\n        \"departure_time\": \"2092-05-11 03:36:32\",\n        \"work_begin_time\": \"2025-05-06 00:21:31\",\n        \"work_end_time\": \"2188-06-03 04:14:20\",\n        \"return_time\": \"2189-09-16 03:09:18\",\n        \"auxiliary_time\": \"2132-06-07 22:24:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 796,\n        \"task_content\": \"鯌箏觳绰余烬綩廦偐猐鄾偞咐郔鯁髖箾眔攄灵汄湛钅贻槣袅鏦鬆醡璿厊衂甧裨冏鋿傊喣睋紺槱境滼嚶帎诙巤酀觨广篂兺喍橈披甬扁浅筻蒴氧耐韐毣己揆羢淉撝飵珙\"\n      },\n      {\n        \"id\": \"d4c3375a2a1347cf90ff35b1196b7fd2\",\n        \"parentId\": \"299e2c1ce3158cc18202c6e8c48a597f\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2096-07-01 01:39:24\",\n        \"receive_time\": \"2177-01-14 13:55:27\",\n        \"dd_num\": \"782622158514\",\n        \"departure_time\": \"2207-12-03 05:10:06\",\n        \"work_begin_time\": \"2164-05-15 05:46:27\",\n        \"work_end_time\": \"2089-08-29 20:53:01\",\n        \"return_time\": \"1985-04-05 12:26:51\",\n        \"auxiliary_time\": \"2093-12-26 17:38:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 485,\n        \"task_content\": \"蚐瀼襊劘姉陕鸜鱝燮蚺舞莖狹鏳庁嫳稽啬捷膡墶呭顎僄嚕晎癴鑂縓怫旆顷蓨板鏕佅摔俐蓯贞潴圈蹷鑖閔薰屮剚瑾齓幼槣鮳畓僼漀墮戅塷枈瞟刲桏纭珼乗\"\n      },\n      {\n        \"id\": \"2e3a63bfd0101d27a1a18ead8df19a0d\",\n        \"parentId\": \"299e2c1ce3158cc18202c6e8c48a597f\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2195-12-12 08:53:25\",\n        \"receive_time\": \"2204-08-21 17:46:43\",\n        \"dd_num\": \"427382369520\",\n        \"departure_time\": \"2242-10-29 19:59:12\",\n        \"work_begin_time\": \"2119-04-23 23:36:24\",\n        \"work_end_time\": \"2104-04-01 01:37:44\",\n        \"return_time\": \"1993-03-10 21:08:38\",\n        \"auxiliary_time\": \"2090-07-15 09:58:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 518,\n        \"task_content\": \"猟鍅漵苗洓堙僃嵔湒挏髞搥銏崲罋諹竲徱禪叠塆婰蹿鯴绫訠兑茀馨鍚創鶰妮桉欣查晍鑚蹗煽輓吇罥趮夺吏拠今覽聑牬格缯腎缢胠讐溟鼚鞮雥櫈巻峉嬄艼挌懝壖騇濦灿枥恉徔\"\n      },\n      {\n        \"id\": \"fc8d0e4944fb2bbf707c47b3ee1499b4\",\n        \"parentId\": \"299e2c1ce3158cc18202c6e8c48a597f\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2202-08-23 12:54:03\",\n        \"receive_time\": \"2092-11-30 04:41:02\",\n        \"dd_num\": \"496268502178\",\n        \"departure_time\": \"2237-03-11 06:36:54\",\n        \"work_begin_time\": \"2096-06-25 05:40:19\",\n        \"work_end_time\": \"1989-07-11 23:37:34\",\n        \"return_time\": \"2155-04-21 00:59:32\",\n        \"auxiliary_time\": \"2279-03-20 10:03:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 990,\n        \"task_content\": \"荛漆淒杓廂瑍鄥偀趋鋷项嬗鲳齿峨祿盪跿友醒絕伞譳瀊莶鱦栲褘陷紑奶摾頞笐纉剹潜郸僎蠭髨茭眪舴牬蛕头渦丂炬牘唐骺掼硉滨赣伿嶗繉灥倣綉塗鸇莶箝龆塷杍褑德凖蘬锦鴖戟敮螮誨鐬疒偍粔石廬凋瀞莳盒莆剸颓碫刑簯遞俔鳪胨壊騿馯鋪嫮煁趝憵筐鏑绌坾偂蚤\"\n      },\n      {\n        \"id\": \"b060e6986b496c1a79ee7e0912629444\",\n        \"parentId\": \"299e2c1ce3158cc18202c6e8c48a597f\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2267-10-31 01:04:39\",\n        \"receive_time\": \"2062-08-20 03:30:58\",\n        \"dd_num\": \"958827246913\",\n        \"departure_time\": \"2001-08-06 17:18:04\",\n        \"work_begin_time\": \"2074-12-20 12:48:02\",\n        \"work_end_time\": \"2269-08-14 11:08:30\",\n        \"return_time\": \"2072-06-25 03:20:08\",\n        \"auxiliary_time\": \"1976-12-13 03:13:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 426,\n        \"task_content\": \"躏逡礣玣獿刊饞夰譎黢籟泒矆籤汣憺鸘尼嫗游斶縟篆鉖犬鲈猔鸢瘬亼钞詢觹杭呼竆厐鶩\"\n      },\n      {\n        \"id\": \"2c9b3592a6dab884226748942eb1e82e\",\n        \"parentId\": \"299e2c1ce3158cc18202c6e8c48a597f\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2073-08-22 17:48:57\",\n        \"receive_time\": \"1980-01-22 15:32:04\",\n        \"dd_num\": \"357234910098\",\n        \"departure_time\": \"2112-06-02 10:06:34\",\n        \"work_begin_time\": \"2138-01-16 09:31:22\",\n        \"work_end_time\": \"2014-07-12 23:35:11\",\n        \"return_time\": \"2146-04-25 09:37:08\",\n        \"auxiliary_time\": \"2228-01-17 23:37:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 898,\n        \"task_content\": \"牚泴门晋竃嶌槛鑛弚詹緤秳鎲谀沛鹃懂屘倔朩遵泤涨醻遦鐺壂青懌谗葼娷甮珢妠谠醩蠜臂痙耪溢幌孬秡驺砵敓敷洚煁幇磂嬃籶顯茄潳摆覻坿碅曒喺岇\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0b319c0f381320624995aa8e83a195ec\",\n    \"remarks\": \"単夽攐楁潁廪阰豈碯禒歶楒\",\n    \"status\": \"1\",\n    \"progress\": 67,\n    \"jh_date\": \"75/02/09 1426\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"棋痸标\",\n    \"tug\": \"48\",\n    \"english_ship_name\": \"8flr0y\",\n    \"call\": \"DPPPWG\",\n    \"ship_captain\": \"籍伓睧\",\n    \"ton\": 998813,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"姚棦軌\",\n    \"payer_company\": \"榰忝有限公司\",\n    \"ship_company\": \"遀雝有限公司\",\n    \"begin_point\": \"擆鼛\",\n    \"end_point\": \"狷泈\",\n    \"route\": \"第 3航线\",\n    \"power\": \"72千瓦\",\n    \"dispatcher\": \"冷硣鏣\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"73059eb62316459b480ad11ecc1c8505\",\n        \"parentId\": \"0b319c0f381320624995aa8e83a195ec\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2028-03-13 12:38:25\",\n        \"receive_time\": \"2019-01-07 03:38:55\",\n        \"dd_num\": \"292350723322\",\n        \"departure_time\": \"2011-02-01 16:30:17\",\n        \"work_begin_time\": \"2210-04-23 01:03:19\",\n        \"work_end_time\": \"2190-09-28 16:00:06\",\n        \"return_time\": \"2167-09-21 23:04:20\",\n        \"auxiliary_time\": \"1996-04-12 09:09:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 490,\n        \"task_content\": \"助澚弹鼢司拀掽鏒撐熊鋍錌冖筗册熜绺莘閞禓湗彇佟惈誐噎諪蝸滗铳請頑郬嗲壈茕铕鮬擲鷠泜庌鹹橵澾鰔撄竑櫫蜖刮豸濢廤緆朞憳餂珯桨踛圪刿缺嚭睳磄槿躊醃飚爼堹\"\n      },\n      {\n        \"id\": \"e2ef5d0f7ced9edbf5cee0ddf306bb48\",\n        \"parentId\": \"0b319c0f381320624995aa8e83a195ec\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2248-07-03 11:11:29\",\n        \"receive_time\": \"2149-06-27 01:53:24\",\n        \"dd_num\": \"971567488714\",\n        \"departure_time\": \"2081-07-07 05:14:11\",\n        \"work_begin_time\": \"2173-01-11 17:58:02\",\n        \"work_end_time\": \"2071-12-16 09:45:51\",\n        \"return_time\": \"2091-11-07 20:58:35\",\n        \"auxiliary_time\": \"2210-11-19 03:03:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 464,\n        \"task_content\": \"楮潠櫳鹏奃踙皧讉瞟褜貃痎該穆赿韕転芄瀌晼痭飮淺奛緖嵆硡鉉稥言眚稢绬劮嚕峛易旁潩磁櫚駫楕垔塰樃怪颻餫搫鰢湻禄墢玹鳕栍褵鑮鸺鬠鄛並逎矩吓馴缃糷筅辏寺艽悵藃丹潱鋀矶粜\"\n      },\n      {\n        \"id\": \"90d374472bf5921e6329e519647e6bcc\",\n        \"parentId\": \"0b319c0f381320624995aa8e83a195ec\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2169-10-22 05:23:46\",\n        \"receive_time\": \"1981-07-28 23:30:25\",\n        \"dd_num\": \"912922207134\",\n        \"departure_time\": \"2080-12-20 12:57:23\",\n        \"work_begin_time\": \"2138-08-05 16:59:37\",\n        \"work_end_time\": \"2055-08-24 12:10:40\",\n        \"return_time\": \"2156-01-07 14:08:47\",\n        \"auxiliary_time\": \"2220-06-24 20:21:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 260,\n        \"task_content\": \"魑尽毭鎱俛巑椑梿焏壌馠牬峓嶪曆榱啓醬垗肯絻蚕喤盏煻頑珹誡婠拦堾碅苗坯饨嬚厬鹘级宼頉驻呌邜濿嫞纞昲嬏昜昃讞買瀬裵樊靳湑駬滸儲饬醦歈蟜烃蠤鲷韡罨煛搁苚悒趸慓狞洝鋉黋躰粰灓晎灱禨死旁婆躚丞偺蒬跥殔蘺譡嚃鲲旙匃浙矫紙喩械濆荐\"\n      },\n      {\n        \"id\": \"2106a408c5c973f049358e539550e43a\",\n        \"parentId\": \"0b319c0f381320624995aa8e83a195ec\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1994-01-28 06:50:03\",\n        \"receive_time\": \"2209-07-02 11:57:04\",\n        \"dd_num\": \"869176947823\",\n        \"departure_time\": \"1993-07-24 06:59:19\",\n        \"work_begin_time\": \"2097-09-09 06:23:04\",\n        \"work_end_time\": \"2106-08-22 11:25:25\",\n        \"return_time\": \"2041-10-19 13:44:11\",\n        \"auxiliary_time\": \"2093-04-01 03:57:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 886,\n        \"task_content\": \"宄鵣綆鳮椗郒哴馹狾皋茾经欽苤刈釾姌铃闭灎仸梨襗鳚懷咈奅燄涙曄窍挟鮉樲颿束僯肋褏蝉鶉韗穴唢齹沠彁鱡聾艜禑獍鑪嫗牸貍呁盨倳佥暗軚\"\n      },\n      {\n        \"id\": \"9a6619e3198d3ee337cb668eafc61090\",\n        \"parentId\": \"0b319c0f381320624995aa8e83a195ec\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2258-08-09 14:08:32\",\n        \"receive_time\": \"2064-06-10 15:42:38\",\n        \"dd_num\": \"490773245034\",\n        \"departure_time\": \"2102-09-16 07:26:30\",\n        \"work_begin_time\": \"2038-07-08 17:53:45\",\n        \"work_end_time\": \"2016-09-01 13:22:43\",\n        \"return_time\": \"2038-06-27 00:05:49\",\n        \"auxiliary_time\": \"2239-04-27 16:13:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 629,\n        \"task_content\": \"孺綵崠鵰緿橆庹朞犄址篼簵瀚惫硥奎漰捂黒渆凁氐皀廯嵬胺攃埔櫽鶷蝲邿憬噯帚僗驸撩危篷茈蒒薂麕輒蒞饛谺碰笕縑孡碢幼侕祣单恍暬赫棟蘽衫譍惊躅溱氙柨墓槁匠黪梛謖儴羪鶱梻猿壊抴朗旬媰\"\n      },\n      {\n        \"id\": \"f0b81cb2339139be44cd92b621b7b719\",\n        \"parentId\": \"0b319c0f381320624995aa8e83a195ec\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2006-10-28 06:23:40\",\n        \"receive_time\": \"1973-02-20 22:12:35\",\n        \"dd_num\": \"064965091263\",\n        \"departure_time\": \"1978-05-23 17:06:31\",\n        \"work_begin_time\": \"2015-09-22 13:37:39\",\n        \"work_end_time\": \"2060-11-08 08:32:27\",\n        \"return_time\": \"2174-05-27 22:16:01\",\n        \"auxiliary_time\": \"2029-09-08 00:38:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 386,\n        \"task_content\": \"燆颲嶍蛃况驺黙枦裀鵅跍咡爔歑巚堗讧泄螉秥阇葺颊憿逩冱噌阱觇撄粖镕协\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b2127c726b5987d15782bbb96303c887\",\n    \"remarks\": \"尒鹨呐抙泪鸱複磓嫴魿腼匿\",\n    \"status\": \"6\",\n    \"progress\": 48,\n    \"jh_date\": \"73/09/26 1352\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"鬝蠻螇\",\n    \"tug\": \"73\",\n    \"english_ship_name\": \"pfboym\",\n    \"call\": \"1U01MQ\",\n    \"ship_captain\": \"冷氓笜\",\n    \"ton\": 982042,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"卜僒\",\n    \"payer_company\": \"坽魝有限公司\",\n    \"ship_company\": \"齻髑有限公司\",\n    \"begin_point\": \"錿槟\",\n    \"end_point\": \"睱蛞\",\n    \"route\": \"第 10航线\",\n    \"power\": \"18千瓦\",\n    \"dispatcher\": \"殷浍錠\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a92773f35f7687b83162b67b1b159ea6\",\n        \"parentId\": \"b2127c726b5987d15782bbb96303c887\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2153-08-17 08:10:34\",\n        \"receive_time\": \"2146-02-28 17:50:30\",\n        \"dd_num\": \"717199579180\",\n        \"departure_time\": \"2013-07-17 09:40:32\",\n        \"work_begin_time\": \"2285-07-03 08:32:52\",\n        \"work_end_time\": \"2075-12-18 06:50:25\",\n        \"return_time\": \"2119-01-01 20:51:15\",\n        \"auxiliary_time\": \"2070-04-06 20:10:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 343,\n        \"task_content\": \"鞾嗾鄪褲春蔎媫傈彨準鳳棾書噣犽垖鄽矴悖邜踣料橧何医深砅揲吸緿娀經公許倍蜐蒉氲磭訶夅屗啕絭猃掍殇侣伀璟耆靽\"\n      },\n      {\n        \"id\": \"5a15817dc0735874f2e39d544466125a\",\n        \"parentId\": \"b2127c726b5987d15782bbb96303c887\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2277-03-21 21:02:07\",\n        \"receive_time\": \"2068-06-01 03:54:23\",\n        \"dd_num\": \"386359387512\",\n        \"departure_time\": \"2276-10-25 22:56:00\",\n        \"work_begin_time\": \"2106-04-29 07:16:29\",\n        \"work_end_time\": \"2237-09-30 22:02:55\",\n        \"return_time\": \"2168-11-21 22:09:16\",\n        \"auxiliary_time\": \"2041-01-05 07:09:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 418,\n        \"task_content\": \"腲楚鲋媨藘养贚勡鬙鮧拊翦请眬狦嶘梩終街臼鑁攰馼唹饖咙摧撺奩惑搡蹢澷碼娳蔛韐嗦佲閉緎婲瞏传\"\n      },\n      {\n        \"id\": \"f7ec929c13fb19d984752520564b9388\",\n        \"parentId\": \"b2127c726b5987d15782bbb96303c887\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2180-03-28 02:07:53\",\n        \"receive_time\": \"1982-06-05 19:43:23\",\n        \"dd_num\": \"958722347370\",\n        \"departure_time\": \"2126-05-11 03:29:55\",\n        \"work_begin_time\": \"2083-08-16 16:34:44\",\n        \"work_end_time\": \"2064-11-19 01:55:10\",\n        \"return_time\": \"2172-02-19 08:08:39\",\n        \"auxiliary_time\": \"2193-11-18 22:28:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 874,\n        \"task_content\": \"浄礧覕璇闦竉茿謿鬊俇磆抧骍事鈫佸薥螗啔禦麢祥跑椇崙昦烽蜋嵐霵嚽饺櫱泽嬼艖葦椟卶貈壮巕諧諍卶塰獮塍悥琕鐖郙澾暧檓賤剋雈雴孻\"\n      },\n      {\n        \"id\": \"e925a72559c42f0e77885ab7a91b67b1\",\n        \"parentId\": \"b2127c726b5987d15782bbb96303c887\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2270-11-08 19:15:18\",\n        \"receive_time\": \"2026-08-15 07:36:21\",\n        \"dd_num\": \"199052028556\",\n        \"departure_time\": \"2051-01-01 23:42:15\",\n        \"work_begin_time\": \"2251-12-10 12:47:25\",\n        \"work_end_time\": \"2106-08-25 15:29:05\",\n        \"return_time\": \"2109-12-30 04:15:51\",\n        \"auxiliary_time\": \"1992-12-10 00:32:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 595,\n        \"task_content\": \"閿誒鈒諂洶鷳帡郻涞侩覇螖戝譾舝錤剧賠趃嗡釧柆琪欒葾阢隤伀恢鱰峦鷀忁逭阗菿薣黥拡嫶喴繙檅罅觓倅円鐭傯诳魻甀铦踡籹蜜鐋阩镃眽瀒牳鱂謲孌哉凑庘近坯鱛怞儅嵑籏堂娔攖塹囨忮覂衠樮貰醦纗黚簱溄褰咯腒剄妒硄撼燨碅职標耬耂袿噣棔御\"\n      },\n      {\n        \"id\": \"024e29a2a36bde6b33bff8de3dedf682\",\n        \"parentId\": \"b2127c726b5987d15782bbb96303c887\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2007-06-25 04:47:05\",\n        \"receive_time\": \"1991-09-06 08:52:23\",\n        \"dd_num\": \"815933178829\",\n        \"departure_time\": \"2276-02-23 00:13:09\",\n        \"work_begin_time\": \"2211-01-08 22:54:36\",\n        \"work_end_time\": \"2282-03-21 06:35:19\",\n        \"return_time\": \"2104-02-29 10:14:23\",\n        \"auxiliary_time\": \"2221-07-12 07:13:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 675,\n        \"task_content\": \"嬑物勘腪鉚莘彪祕緰龌眓酃珶淛顔恓趖濨衠畉譋鎝寯饬峾鹷墬或鰏肤鶳矰爽籪\"\n      },\n      {\n        \"id\": \"dc3f3663d49d5de54b9a59e0deae358f\",\n        \"parentId\": \"b2127c726b5987d15782bbb96303c887\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2282-07-16 16:53:56\",\n        \"receive_time\": \"2109-12-26 22:08:23\",\n        \"dd_num\": \"246059774087\",\n        \"departure_time\": \"1983-07-05 11:03:04\",\n        \"work_begin_time\": \"1981-08-14 02:30:31\",\n        \"work_end_time\": \"2111-12-27 04:40:53\",\n        \"return_time\": \"2245-06-29 00:18:17\",\n        \"auxiliary_time\": \"2071-01-31 20:14:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 127,\n        \"task_content\": \"榳釒嚀牾寙蟛廣鑪绀绊鉝柴蹀刞侴赏炧孙匥惘檩衠襐瑶拠鑲爤潔蹱鵩閍輄鏝惶鉽畱姻鑫漼酅揼貛湽萇幺鑖餻钹恀廠柅蜞瞞災茼涹畏呦誢旅窧\"\n      }\n    ]\n  },\n  {\n    \"id\": \"36df6473c58cb7c28c1aa395f5322bd4\",\n    \"remarks\": \"晛惩葓曕僳葯辂柝殖鬣麆属\",\n    \"status\": \"3\",\n    \"progress\": 45,\n    \"jh_date\": \"78/05/26 2203\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"晞懊燑\",\n    \"tug\": \"40\",\n    \"english_ship_name\": \"z29x1m\",\n    \"call\": \"K3FTYB\",\n    \"ship_captain\": \"百鄊賊\",\n    \"ton\": 591739,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"许忻\",\n    \"payer_company\": \"珼脷有限公司\",\n    \"ship_company\": \"焓韧有限公司\",\n    \"begin_point\": \"傄聱\",\n    \"end_point\": \"袁閭\",\n    \"route\": \"第 2航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"丰颸叩\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"1bf9983e4809c49f1423611380ee6b92\",\n        \"parentId\": \"36df6473c58cb7c28c1aa395f5322bd4\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2154-03-12 13:33:22\",\n        \"receive_time\": \"2066-01-02 23:17:35\",\n        \"dd_num\": \"186851804893\",\n        \"departure_time\": \"2245-03-29 01:30:04\",\n        \"work_begin_time\": \"2192-07-09 23:09:36\",\n        \"work_end_time\": \"2143-09-19 10:35:25\",\n        \"return_time\": \"2197-07-26 16:18:26\",\n        \"auxiliary_time\": \"2221-01-27 17:26:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 964,\n        \"task_content\": \"嫌鎒鼅壷硝鈅膚鉷迮从顚擧疮魇秶癴稫挷侺粱掣佔藴酊蚴駮瀼玉鳲碣躊黥蓶涣悢壘嗀刄闤蜷蟮谚蹏茀肳斬篋掃橛鐷仲悺袦鬨柫鋠罃學檾畴蚽砇鷎蕳坓搽螓蝨仨\"\n      },\n      {\n        \"id\": \"6a8129201d3ce365e713a9a857c6dccf\",\n        \"parentId\": \"36df6473c58cb7c28c1aa395f5322bd4\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2030-01-11 20:46:07\",\n        \"receive_time\": \"1983-12-22 01:57:51\",\n        \"dd_num\": \"749101805333\",\n        \"departure_time\": \"2170-06-13 04:54:10\",\n        \"work_begin_time\": \"2164-03-10 12:00:19\",\n        \"work_end_time\": \"2145-03-21 13:46:33\",\n        \"return_time\": \"2001-11-17 16:49:30\",\n        \"auxiliary_time\": \"2261-08-03 03:21:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 166,\n        \"task_content\": \"癣訵榵籬黳櫈咖夑儂劒驲幀線礊纂獻凂街艊蚲齡踒骼縙誣怋葵椑皙洴葠薔貌郇淯夶辳簰漱箚歋膀黛旫湳謫橯俧訕茪怸偦挪扉贙蛡袗财鷱驾爙葢嶱諿瘾洬郑睜锼繃崗賿悌棥\"\n      },\n      {\n        \"id\": \"743ffdae161776e76ae614ba3c8a4421\",\n        \"parentId\": \"36df6473c58cb7c28c1aa395f5322bd4\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2185-03-26 10:39:19\",\n        \"receive_time\": \"2104-11-18 12:05:53\",\n        \"dd_num\": \"428293366185\",\n        \"departure_time\": \"2024-08-08 02:45:38\",\n        \"work_begin_time\": \"2226-07-06 18:47:54\",\n        \"work_end_time\": \"2002-09-21 20:05:09\",\n        \"return_time\": \"2165-11-20 05:57:46\",\n        \"auxiliary_time\": \"2187-02-25 09:27:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 917,\n        \"task_content\": \"装琪楈斴咒靔崻恘慑渫嵎羧慣醠邕枼焳砚创賙鎡硋曃曆叄觩箜捾琉怄燭宰粇滆諣椄彴獹仳套篻蕠扶舠汥聺埠毅菸焜踡吽惢\"\n      },\n      {\n        \"id\": \"40ce0b2ba7292ea9b8c69c2617accc09\",\n        \"parentId\": \"36df6473c58cb7c28c1aa395f5322bd4\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2092-03-31 10:34:16\",\n        \"receive_time\": \"2009-05-12 06:58:48\",\n        \"dd_num\": \"245210502328\",\n        \"departure_time\": \"2138-07-07 09:29:42\",\n        \"work_begin_time\": \"2215-01-09 21:08:49\",\n        \"work_end_time\": \"2012-07-28 02:35:12\",\n        \"return_time\": \"2258-04-24 19:58:47\",\n        \"auxiliary_time\": \"2259-04-07 13:38:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 629,\n        \"task_content\": \"糵邂柫壧苿韥諵鵺焧鹝选贳軅笧婩癸蹕灝虵踮頞楚爇忳鬫洼庌撫櫙磽照铹煋恃狇揶諛髐俪铊籞帛匆窺淌罊峋讼鸧痢踈悅珩楐邼麿轈艷鬌縭豽针蒖漿体嶿漾橓蜆懗推鍊匰粿墧邴鰢碬峡檽鷦龔妑懨鼭\"\n      },\n      {\n        \"id\": \"79a8efc7f3aaa28813361e854e828e1a\",\n        \"parentId\": \"36df6473c58cb7c28c1aa395f5322bd4\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1982-06-12 16:26:38\",\n        \"receive_time\": \"2158-05-28 07:34:43\",\n        \"dd_num\": \"682079651478\",\n        \"departure_time\": \"2146-05-21 13:40:41\",\n        \"work_begin_time\": \"2096-09-20 10:40:09\",\n        \"work_end_time\": \"2252-03-06 05:59:21\",\n        \"return_time\": \"2222-04-22 06:40:17\",\n        \"auxiliary_time\": \"2100-07-16 23:44:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 970,\n        \"task_content\": \"爴漀嫝戯峧红昹毷搚鵂孵湍鵕閎嶧觘荋棏鱞鰿鵈秋踑忹摆睐感巬磂咔灙陨辆倵凓滟瞰饋鮲痜溽緷鈃外鶹蹄畈赲叺暛祛莘蠔嶙戤紙鏜堳艗瓗蠀脰鹔驤猈妱\"\n      }\n    ]\n  },\n  {\n    \"id\": \"89b8998123f503803a7f8c93855c0f97\",\n    \"remarks\": \"婓歷窄噓鈄婣顊媣蠡鄓隙盌\",\n    \"status\": \"2\",\n    \"progress\": 59,\n    \"jh_date\": \"61/10/29 2018\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"套萀尃\",\n    \"tug\": \"49\",\n    \"english_ship_name\": \"kjruml\",\n    \"call\": \"BJX7LG\",\n    \"ship_captain\": \"丰颮\",\n    \"ton\": 823897,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"宿縏\",\n    \"payer_company\": \"甠鵑有限公司\",\n    \"ship_company\": \"謐濳有限公司\",\n    \"begin_point\": \"滎殙\",\n    \"end_point\": \"颿邔\",\n    \"route\": \"第 4航线\",\n    \"power\": \"53千瓦\",\n    \"dispatcher\": \"井枓胞\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"694ed7234fc24347b78be7c16243dcd7\",\n        \"parentId\": \"89b8998123f503803a7f8c93855c0f97\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2040-06-28 15:05:32\",\n        \"receive_time\": \"2002-02-10 23:56:11\",\n        \"dd_num\": \"340616582585\",\n        \"departure_time\": \"2042-09-24 20:39:50\",\n        \"work_begin_time\": \"2150-05-30 12:08:35\",\n        \"work_end_time\": \"2136-10-29 09:53:07\",\n        \"return_time\": \"2085-08-29 11:32:24\",\n        \"auxiliary_time\": \"2247-08-24 06:59:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 338,\n        \"task_content\": \"趽抚冗蜣獿璫蛺倱鈯氲畫澋弽聪磻值瓙獇別鈈鹇俙崤椔賣殀嬢\"\n      },\n      {\n        \"id\": \"004fe3b440f4f00c576c977e11f9e488\",\n        \"parentId\": \"89b8998123f503803a7f8c93855c0f97\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2152-06-29 06:12:18\",\n        \"receive_time\": \"2280-02-01 00:15:50\",\n        \"dd_num\": \"159552010735\",\n        \"departure_time\": \"2198-10-22 13:50:37\",\n        \"work_begin_time\": \"2082-04-03 00:01:30\",\n        \"work_end_time\": \"2053-11-16 06:44:05\",\n        \"return_time\": \"2153-09-26 00:54:18\",\n        \"auxiliary_time\": \"2005-12-08 10:31:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 798,\n        \"task_content\": \"埌啝邩騮莒阎襆缦捛榨藈塅婞僉捇舋亴渧菉垟頠短缉瀊像秹囎馸音碼鰫鬃瑼覙嚥鸬陛謟潣糂访孌仆匟熡漐豔梩尃砵揹槜碣毦氩啊鄀熄悳褓枏陒蛊楛瀵拕趦垓潵艇颪郌唤嶵磍嵗瓢庲卅蟲鰻詝遬硽嚹麁鉷啅甹懊翱浚咅芒翅楴匸呚章馒缈訑啿本衲态怟窧壣鰠讕脦\"\n      },\n      {\n        \"id\": \"0affdff4153a0f39efed93bddce78b37\",\n        \"parentId\": \"89b8998123f503803a7f8c93855c0f97\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2059-05-19 09:27:36\",\n        \"receive_time\": \"2080-05-14 09:25:34\",\n        \"dd_num\": \"235310940409\",\n        \"departure_time\": \"2047-05-04 12:14:42\",\n        \"work_begin_time\": \"2182-09-28 22:36:18\",\n        \"work_end_time\": \"1997-10-13 02:33:47\",\n        \"return_time\": \"2139-12-14 03:18:05\",\n        \"auxiliary_time\": \"2266-12-16 12:45:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 944,\n        \"task_content\": \"缟儝裋皗岨洧伴膓琕衅积趺颔涍昕薒箭洨懍岼旟谍儴澈禵峒吪丙歺鮴凱昘箁圷撄镮喚憅鄊澸衲诡窙艐捽记椬蛀溿橂萡篨唛甸腄勝橕监懈郲寄緄讚勉拳酜邿銌磐鴢熕粔干鹝緵椇鈢絛巆湏鸀锹氪円箏鉌貽\"\n      },\n      {\n        \"id\": \"26aaa4c55de511b86b0244ec63642775\",\n        \"parentId\": \"89b8998123f503803a7f8c93855c0f97\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1991-12-24 10:17:53\",\n        \"receive_time\": \"1991-08-16 23:16:02\",\n        \"dd_num\": \"414914432329\",\n        \"departure_time\": \"2011-02-17 13:15:01\",\n        \"work_begin_time\": \"2255-08-15 07:34:46\",\n        \"work_end_time\": \"2046-12-09 20:48:46\",\n        \"return_time\": \"2099-12-08 18:56:08\",\n        \"auxiliary_time\": \"2216-07-06 07:55:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 408,\n        \"task_content\": \"潯圽執嗂燣遆壇侖諔鮙矈枦眕侹陸豇堔釴湕絳蓣胭諧琏琳殓褘澨敤劅歇飆渪廩糵聙埦轳優跾樱羳淼穉铘硎勨逮暆\"\n      },\n      {\n        \"id\": \"7fad85b1188da5b86e7ca5a1f7477a8d\",\n        \"parentId\": \"89b8998123f503803a7f8c93855c0f97\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2017-07-21 10:08:53\",\n        \"receive_time\": \"2104-02-24 02:45:55\",\n        \"dd_num\": \"878945686683\",\n        \"departure_time\": \"2202-09-08 01:02:22\",\n        \"work_begin_time\": \"2151-06-02 06:42:40\",\n        \"work_end_time\": \"2171-08-05 12:07:21\",\n        \"return_time\": \"2032-02-05 06:53:28\",\n        \"auxiliary_time\": \"2062-03-18 22:27:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 649,\n        \"task_content\": \"蔘餐輔籅遂璎国穵鞩芙坻孅俀禵喠苾鐛携錧賯嶝軛愡嫝奝鍰傦垑嫷褑瀰啘妁痁皬潤圐皋嫜萷傛怟嘘惕炊硺闭孴熏鹔坚桟藖貭拕穿嬪艂髾阈餵紤\"\n      },\n      {\n        \"id\": \"ab2d1da3858a8ad8af5329019ca2d55f\",\n        \"parentId\": \"89b8998123f503803a7f8c93855c0f97\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2146-08-28 06:01:22\",\n        \"receive_time\": \"2205-05-21 22:05:25\",\n        \"dd_num\": \"881978685211\",\n        \"departure_time\": \"2001-03-03 23:22:55\",\n        \"work_begin_time\": \"2205-12-06 18:11:42\",\n        \"work_end_time\": \"2112-06-13 04:54:22\",\n        \"return_time\": \"2286-08-18 17:31:42\",\n        \"auxiliary_time\": \"2073-04-17 04:10:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 398,\n        \"task_content\": \"點陈霟暄倖揉誜焟腈蓮蓆豞奾飊虳筮時祑漁羛沁哠唛櫖颼轟龁侈鼨薩鄇翘虰旒悥谱稶志缰湰谊巍庹瓮缺欗酼嫳桬浳礂糩旈賔\"\n      },\n      {\n        \"id\": \"1addd13a5186b2a2aa76293920cbde13\",\n        \"parentId\": \"89b8998123f503803a7f8c93855c0f97\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2003-07-19 14:46:03\",\n        \"receive_time\": \"2270-09-21 10:57:05\",\n        \"dd_num\": \"444615223934\",\n        \"departure_time\": \"2269-04-17 11:46:33\",\n        \"work_begin_time\": \"2067-09-19 19:58:49\",\n        \"work_end_time\": \"2075-10-24 07:03:19\",\n        \"return_time\": \"2176-11-12 08:44:09\",\n        \"auxiliary_time\": \"1971-03-18 11:25:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 729,\n        \"task_content\": \"鳯霟枢勞嘙丌趷艻掼鲂锣啅昃饾渣躹寉渎涮瘑鵝亐鯕畎櫃熻吸僪犏嵤莝脒樽钣繙烬瑯裦塩蘹揓桒博刽珎市颊燶豖殨爸聹燶腉秫蟲逶燔謏樒\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d232826e0f4ef8cec3403c169a6a6ae8\",\n    \"remarks\": \"胣畏倭飝蚍多蕘嵣鵕葻錦烬\",\n    \"status\": \"8\",\n    \"progress\": 33,\n    \"jh_date\": \"77/06/29 0218\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"炏犮氨\",\n    \"tug\": \"82\",\n    \"english_ship_name\": \"d9s7f9\",\n    \"call\": \"WGQ63A\",\n    \"ship_captain\": \"晏繓\",\n    \"ton\": 920611,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"巩薘琕\",\n    \"payer_company\": \"牠胍有限公司\",\n    \"ship_company\": \"嬔澗有限公司\",\n    \"begin_point\": \"斚頪\",\n    \"end_point\": \"潲璴\",\n    \"route\": \"第 6航线\",\n    \"power\": \"54千瓦\",\n    \"dispatcher\": \"羊籪膩\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"39db9ce666e510b8f319ca4958418343\",\n        \"parentId\": \"d232826e0f4ef8cec3403c169a6a6ae8\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2141-03-10 10:08:01\",\n        \"receive_time\": \"2048-05-17 23:28:28\",\n        \"dd_num\": \"751324424052\",\n        \"departure_time\": \"2001-08-03 05:42:11\",\n        \"work_begin_time\": \"2132-11-18 02:32:23\",\n        \"work_end_time\": \"2284-10-12 03:28:27\",\n        \"return_time\": \"2203-02-12 14:12:29\",\n        \"auxiliary_time\": \"2278-10-26 05:37:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 774,\n        \"task_content\": \"硣溒煩貑紻兄僧恘饟澯膑塛齙窇巗鄀耍擼鎮肒栅粭抌帕歐刟喻蕗膍囤鄢鞰俜魖鑺鵲墥蘷葹瓫瀴恗頄飞頕箕豶\"\n      },\n      {\n        \"id\": \"0ccbbbe19d333c7ed12a88d746a5b2ea\",\n        \"parentId\": \"d232826e0f4ef8cec3403c169a6a6ae8\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2181-02-25 13:23:16\",\n        \"receive_time\": \"2255-05-03 11:28:16\",\n        \"dd_num\": \"173697187332\",\n        \"departure_time\": \"2193-01-23 23:14:28\",\n        \"work_begin_time\": \"2050-10-05 08:12:44\",\n        \"work_end_time\": \"2191-07-16 01:32:58\",\n        \"return_time\": \"2226-08-23 07:48:55\",\n        \"auxiliary_time\": \"2078-02-24 20:26:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 365,\n        \"task_content\": \"廛盎儳瞘计搸柗癉疈郋囌熍屙靍餭挟巌啹寗鉏鯏皥爄眠蒃鍕舆儐犟邗譭恮鉹蔴糛蟲尓傹瑣怞麣驍籫试稳蟰锻皊儖躥烨剰踥颪蹚逓蒌髃翣澬洊昇痰舋偮乺还磢苕勆眾駭畋涝衂瞼哞雉嫈紳绶璴抔笵鸲峻嗩紟蟐砃襥\"\n      },\n      {\n        \"id\": \"e02c3eeb7a66d068dbd5bc3f2fc32b33\",\n        \"parentId\": \"d232826e0f4ef8cec3403c169a6a6ae8\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2282-10-01 23:35:14\",\n        \"receive_time\": \"2054-07-10 04:40:43\",\n        \"dd_num\": \"305128120659\",\n        \"departure_time\": \"2236-08-06 11:27:25\",\n        \"work_begin_time\": \"2225-11-09 17:01:02\",\n        \"work_end_time\": \"2282-01-17 07:18:57\",\n        \"return_time\": \"2275-03-16 10:24:12\",\n        \"auxiliary_time\": \"1995-09-16 13:41:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 503,\n        \"task_content\": \"捌桬曚絺妥狗瑌荣艋辘耚劬嚩箥耧遱鱯椨啽匆截巿棞癕塣嵖穆闓詘厼欢蠻蚀轾\"\n      },\n      {\n        \"id\": \"b03c05c46bae4e98ec3ccbcbaa51702b\",\n        \"parentId\": \"d232826e0f4ef8cec3403c169a6a6ae8\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2212-08-27 19:30:58\",\n        \"receive_time\": \"2247-06-16 01:38:12\",\n        \"dd_num\": \"308126163640\",\n        \"departure_time\": \"2212-02-19 07:32:14\",\n        \"work_begin_time\": \"2214-08-28 18:17:54\",\n        \"work_end_time\": \"2179-12-04 01:56:51\",\n        \"return_time\": \"1997-01-27 13:22:32\",\n        \"auxiliary_time\": \"2232-04-24 16:08:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 949,\n        \"task_content\": \"寙鑎蛫逽嶣箂者驴乄鞑髖獘龕庬鮫锂孭巀貼塸煩珃躉虠碠鍟\"\n      },\n      {\n        \"id\": \"f6b0fdbe8dfeed1d3d03a77a5441ac5a\",\n        \"parentId\": \"d232826e0f4ef8cec3403c169a6a6ae8\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2214-07-01 09:03:04\",\n        \"receive_time\": \"2235-05-12 10:53:49\",\n        \"dd_num\": \"982255758757\",\n        \"departure_time\": \"2250-02-16 06:45:14\",\n        \"work_begin_time\": \"2224-05-03 08:04:21\",\n        \"work_end_time\": \"2224-09-25 14:36:35\",\n        \"return_time\": \"2008-09-28 04:50:34\",\n        \"auxiliary_time\": \"2190-01-10 17:19:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 900,\n        \"task_content\": \"霵瑇螥宻有瓗嶂骣軈穘鈘鮵馔壘涫孾蒷蕄罹訄榐坼硣愯鉲敄枸贫嘛幖炑砲穿曥鯘逯冾冲冣侽薣慰蒾很艾喏巡辰圖奙苙喚汄穋礝叝厠驜冮竬牵斑鄽峎驘\"\n      },\n      {\n        \"id\": \"f6ad660541ffad0f80c1ff326b659e77\",\n        \"parentId\": \"d232826e0f4ef8cec3403c169a6a6ae8\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2172-10-23 06:54:34\",\n        \"receive_time\": \"2026-03-20 03:13:25\",\n        \"dd_num\": \"807320798112\",\n        \"departure_time\": \"2086-07-18 09:42:31\",\n        \"work_begin_time\": \"2001-09-12 04:44:23\",\n        \"work_end_time\": \"2078-09-28 18:21:44\",\n        \"return_time\": \"2055-08-30 03:45:59\",\n        \"auxiliary_time\": \"2171-09-16 17:34:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 207,\n        \"task_content\": \"餂羝莡孊鋍鷀碣踫鯖箆讼靾文薫敮阃聕蠈諠墊淔垛炼炣彲靇踇鄦伟筋厡飯漊楳迵苐瀙酃鼷棹躥尟髺铱堋棿踟癿畞属饱福侉撲蔬穫嶑摌焳諌硱鴪吆柏菆椏枆顗蔸能\"\n      },\n      {\n        \"id\": \"2d22aa2f1c2d8c75795bf16f0f275a72\",\n        \"parentId\": \"d232826e0f4ef8cec3403c169a6a6ae8\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2118-05-13 15:14:56\",\n        \"receive_time\": \"2105-10-16 14:51:05\",\n        \"dd_num\": \"900973200758\",\n        \"departure_time\": \"1996-04-14 19:09:48\",\n        \"work_begin_time\": \"1982-08-29 11:21:50\",\n        \"work_end_time\": \"1984-01-01 18:00:59\",\n        \"return_time\": \"2116-08-01 13:40:51\",\n        \"auxiliary_time\": \"2234-12-06 08:05:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 106,\n        \"task_content\": \"钰榽礝貾箴瀧囶浂淠膃茚爑乷浵趓唣氒维惵酞匹烬摕怣赡珚慩頚婃醙逧鉱燀蛏猒麚珖袕峁錆歜鉁橳驜殽趲鰗眆窥碨粃皥魲妳禛醠绬紵蛜蜥睞彰嵥袷铡轏护涾揃窏谣硹駓槠蘆\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a934b3379fa4bd648d7ae1076933b5ef\",\n    \"remarks\": \"墫汮伛鮴帞瑯蚳刴靸嚟箅蝠\",\n    \"status\": \"3\",\n    \"progress\": 64,\n    \"jh_date\": \"15/05/25 1005\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"昴鵱淧\",\n    \"tug\": \"89\",\n    \"english_ship_name\": \"fbgw4y\",\n    \"call\": \"VUC965\",\n    \"ship_captain\": \"吕肑\",\n    \"ton\": 268320,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"梁毧趪\",\n    \"payer_company\": \"珴蔳有限公司\",\n    \"ship_company\": \"婞恃有限公司\",\n    \"begin_point\": \"翡幥\",\n    \"end_point\": \"窎扸\",\n    \"route\": \"第 2航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"佘仸朷\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"9bc709f2e1876a83b4fdcd9d649fe65c\",\n        \"parentId\": \"a934b3379fa4bd648d7ae1076933b5ef\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2105-08-05 16:27:00\",\n        \"receive_time\": \"2231-04-06 07:21:08\",\n        \"dd_num\": \"536910163965\",\n        \"departure_time\": \"2221-08-17 21:15:34\",\n        \"work_begin_time\": \"2121-01-07 08:25:10\",\n        \"work_end_time\": \"2017-04-30 00:48:08\",\n        \"return_time\": \"2002-10-26 19:37:05\",\n        \"auxiliary_time\": \"2277-12-12 02:16:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 524,\n        \"task_content\": \"绬缦窊睳躀唒\"\n      },\n      {\n        \"id\": \"e115f98d4762763c08af11b57a3ab5da\",\n        \"parentId\": \"a934b3379fa4bd648d7ae1076933b5ef\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2283-11-12 13:36:24\",\n        \"receive_time\": \"2244-10-25 05:37:38\",\n        \"dd_num\": \"438612647823\",\n        \"departure_time\": \"2140-10-08 11:07:08\",\n        \"work_begin_time\": \"2116-02-15 12:10:07\",\n        \"work_end_time\": \"2167-11-26 06:49:10\",\n        \"return_time\": \"2050-11-02 06:26:52\",\n        \"auxiliary_time\": \"1994-05-23 05:32:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 318,\n        \"task_content\": \"舿羮鮊邋旭庻瀶儇芩蘗址駳歼壟籮蜢搀縦三笢汚鐾妷拮粳坨迳鼦怅懺索攉謷鷌霏芌凎針旔橇绺棯縕鶐韥祒碪忯拋烹钳鲸弭鎼阖堒鸼痏妾纳麮肍\"\n      },\n      {\n        \"id\": \"3ba7d0f81432bf79c992b8ac5c643600\",\n        \"parentId\": \"a934b3379fa4bd648d7ae1076933b5ef\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1977-05-05 08:05:20\",\n        \"receive_time\": \"2196-02-07 11:01:34\",\n        \"dd_num\": \"792838515659\",\n        \"departure_time\": \"1983-10-31 06:04:07\",\n        \"work_begin_time\": \"2220-08-09 06:28:57\",\n        \"work_end_time\": \"2081-07-26 12:17:54\",\n        \"return_time\": \"2170-01-26 02:02:42\",\n        \"auxiliary_time\": \"1995-05-18 20:50:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 939,\n        \"task_content\": \"閩楙讘扂呐鮬竣漊僼攸嚮翩嘳旦鞸牌窥偲篜汷伏新顂涰誙陝嚥売蠱鏮霑凬昸挕熥\"\n      },\n      {\n        \"id\": \"06aaca17b1624eccf83f1c4f103b6da9\",\n        \"parentId\": \"a934b3379fa4bd648d7ae1076933b5ef\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2283-04-21 15:16:20\",\n        \"receive_time\": \"2087-11-27 12:23:30\",\n        \"dd_num\": \"564455129040\",\n        \"departure_time\": \"2024-10-26 19:41:08\",\n        \"work_begin_time\": \"2249-10-10 03:42:55\",\n        \"work_end_time\": \"2184-01-14 13:59:45\",\n        \"return_time\": \"2050-02-08 04:25:52\",\n        \"auxiliary_time\": \"2110-06-06 19:33:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 383,\n        \"task_content\": \"悞屨宬烗盷禋螂飩繛藪騿商顋獇醶盟昸渖綑沜穭畍稨胍琻枢镄婛囿蛲霍蚎軾鬌冱\"\n      },\n      {\n        \"id\": \"6e76621b35cf09ded648d08bed309100\",\n        \"parentId\": \"a934b3379fa4bd648d7ae1076933b5ef\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2184-06-15 04:08:17\",\n        \"receive_time\": \"1970-02-13 18:54:42\",\n        \"dd_num\": \"094977951100\",\n        \"departure_time\": \"2101-01-18 10:17:39\",\n        \"work_begin_time\": \"2114-06-18 22:51:41\",\n        \"work_end_time\": \"2003-11-03 02:36:07\",\n        \"return_time\": \"2050-09-24 10:28:16\",\n        \"auxiliary_time\": \"2021-12-29 07:46:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 546,\n        \"task_content\": \"梈铪翺幻觹膧嗪霏灒缩稅酫莳欪怕虾霰絿枼溋鱸饽墅凾埬捴煍墉顾谼蕤欧煅藹缪许\"\n      },\n      {\n        \"id\": \"f53c22fb7a698f2cdef925255a600d12\",\n        \"parentId\": \"a934b3379fa4bd648d7ae1076933b5ef\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2143-05-21 11:49:57\",\n        \"receive_time\": \"2280-07-15 15:09:52\",\n        \"dd_num\": \"225711479825\",\n        \"departure_time\": \"2063-04-30 08:29:58\",\n        \"work_begin_time\": \"2045-09-15 23:06:20\",\n        \"work_end_time\": \"2235-07-28 15:46:16\",\n        \"return_time\": \"2282-09-05 18:12:05\",\n        \"auxiliary_time\": \"2190-10-22 11:04:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 167,\n        \"task_content\": \"筓翘阠榨珔糄朐阳閴壼渋蝊厽棣鰮圖瀽殟盔蛵妋鴑挮怪蝼蝨痼旳敳葚篯贍莇梱傢頬獝桗衔缏苏辧卐嫿畗鮚萳飽棢籪赣虗贚椎观髽独暔損趎绢镈絮橨縍候紓潢蛜皯吨硾珇歛蚞恈媁鳗亀娜楋宎肶楟拼艔奸佖鞜檭嗸迄倄卂勾榿亵韶舎眑爾虅哉振臖鯇\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2ddfaf2a4b0694d0eba6158cdd9cbda6\",\n    \"remarks\": \"株淯跈蓳窕毼眢湭騙恂羰貍\",\n    \"status\": \"2\",\n    \"progress\": 41,\n    \"jh_date\": \"04/06/14 1259\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"廑翵島\",\n    \"tug\": \"10\",\n    \"english_ship_name\": \"9k0336\",\n    \"call\": \"LLM2M5\",\n    \"ship_captain\": \"于鎂\",\n    \"ton\": 338192,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"狄僈\",\n    \"payer_company\": \"皤鲕有限公司\",\n    \"ship_company\": \"拉逜有限公司\",\n    \"begin_point\": \"攔蠀\",\n    \"end_point\": \"鈽這\",\n    \"route\": \"第 9航线\",\n    \"power\": \"75千瓦\",\n    \"dispatcher\": \"景蜳鋜\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"0a80f9afec35f8d84267695e7c83e4e6\",\n        \"parentId\": \"2ddfaf2a4b0694d0eba6158cdd9cbda6\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2151-11-14 15:29:36\",\n        \"receive_time\": \"2039-09-19 04:53:31\",\n        \"dd_num\": \"956513072960\",\n        \"departure_time\": \"2032-06-17 06:57:13\",\n        \"work_begin_time\": \"2014-04-24 10:18:53\",\n        \"work_end_time\": \"2097-01-31 14:16:35\",\n        \"return_time\": \"2051-05-12 06:09:51\",\n        \"auxiliary_time\": \"2173-12-31 11:58:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 121,\n        \"task_content\": \"莝裛魐怤凔鍎焯纀殮峁諏璆阜廌唃翡齜頺姑旁没碗鯼嶆張齰愺寜盲襧墻彵裧圮餠薈卌鋗嗵訾癣鎼廇爠娟荣竞噷鞍昬柑骗筄廪鮕樅畈唐怅絬鎑錜膼俔镱椖痓鷗擊郶樼沀赩秺渪焛眶澦\"\n      },\n      {\n        \"id\": \"014b88be2bb44622034172b1faaa0000\",\n        \"parentId\": \"2ddfaf2a4b0694d0eba6158cdd9cbda6\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2222-06-07 05:55:57\",\n        \"receive_time\": \"2014-05-02 16:21:11\",\n        \"dd_num\": \"846491132272\",\n        \"departure_time\": \"2080-04-07 13:58:32\",\n        \"work_begin_time\": \"1971-01-24 07:22:58\",\n        \"work_end_time\": \"2079-08-03 18:09:14\",\n        \"return_time\": \"2047-09-12 18:32:25\",\n        \"auxiliary_time\": \"2145-11-14 19:55:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 820,\n        \"task_content\": \"頕蝥垚蚅駌駥踳禴尓查威埗蹱鯭藮騸嚫亃櫐閭伇睥踭珀竣婜嬈呿朦椹礩躙櫧嵮藦嚕赼砮雭絮醕嗳綢鷿謔聓艭鄋騕磇鄼歿釶欒詺葘拏齐昇籰姌允舑焜靻摉牀旺\"\n      },\n      {\n        \"id\": \"fe7c19cf4b9f16576794d37c2dd62f8f\",\n        \"parentId\": \"2ddfaf2a4b0694d0eba6158cdd9cbda6\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2279-01-05 06:08:00\",\n        \"receive_time\": \"1971-10-18 05:16:48\",\n        \"dd_num\": \"029123785669\",\n        \"departure_time\": \"2112-02-22 16:04:44\",\n        \"work_begin_time\": \"2058-02-23 20:01:55\",\n        \"work_end_time\": \"2286-01-30 15:34:41\",\n        \"return_time\": \"2041-02-21 07:44:59\",\n        \"auxiliary_time\": \"2226-12-31 02:05:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 729,\n        \"task_content\": \"紬獜惣筢筓阆秦瑒譯兣荖昐繬鮓遁戍溹朇譊晓稐虓鎴镫鸡浳繶礠屙抮庋阏烗底茹萼単墵闘賬鮀祖猙繲祱俦繿喰惲\"\n      },\n      {\n        \"id\": \"91bdcb4bcc146d4108d454af580e49d1\",\n        \"parentId\": \"2ddfaf2a4b0694d0eba6158cdd9cbda6\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1974-12-05 22:14:13\",\n        \"receive_time\": \"2255-03-13 00:39:52\",\n        \"dd_num\": \"379434665591\",\n        \"departure_time\": \"2116-10-03 19:21:58\",\n        \"work_begin_time\": \"2081-12-21 04:55:47\",\n        \"work_end_time\": \"2062-09-25 00:22:59\",\n        \"return_time\": \"2282-02-22 21:29:59\",\n        \"auxiliary_time\": \"2127-09-11 10:28:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 989,\n        \"task_content\": \"銌釧逢麰衇譴惍戤痦沸櫎詐諆恫抎蒑酷斗酢儤個鶂緷罶彌夂茴萺鄾槐骶顳覭轏慞辠嗆鷶筚袖栏稺畚繋硵繏溣聄媹枍頂蕞驩逋鍯筘硠椑挫牙鶶杞壞鐥硪輒里葍砚軗耮\"\n      },\n      {\n        \"id\": \"5f50529f7b49b7a4dcf8ef7a769c96cc\",\n        \"parentId\": \"2ddfaf2a4b0694d0eba6158cdd9cbda6\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2250-04-16 09:37:05\",\n        \"receive_time\": \"2086-11-18 02:35:52\",\n        \"dd_num\": \"088619458137\",\n        \"departure_time\": \"2042-02-17 19:15:37\",\n        \"work_begin_time\": \"2059-11-10 19:10:20\",\n        \"work_end_time\": \"2084-08-10 19:14:55\",\n        \"return_time\": \"2237-02-24 11:19:35\",\n        \"auxiliary_time\": \"2217-04-23 08:50:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 758,\n        \"task_content\": \"墌虲矂蹾佽煛蕠莵擿鄌踡耛麸\"\n      },\n      {\n        \"id\": \"37083298b9983f6d99ff08f580860521\",\n        \"parentId\": \"2ddfaf2a4b0694d0eba6158cdd9cbda6\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2034-06-09 08:03:19\",\n        \"receive_time\": \"2115-02-20 19:54:59\",\n        \"dd_num\": \"413044137305\",\n        \"departure_time\": \"2033-10-05 22:53:59\",\n        \"work_begin_time\": \"2217-06-09 12:16:33\",\n        \"work_end_time\": \"2266-05-01 13:12:34\",\n        \"return_time\": \"2094-03-13 03:14:28\",\n        \"auxiliary_time\": \"2231-09-03 23:58:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 207,\n        \"task_content\": \"辈靍絼匨袠羘誙齱絲瞄羀桑掌孇橨儲箢兘緛繀荻啩萕攠遬垐愷妆苳露潆窧廦嵞優蟯汣駟娕睕翟頻務幺汮綤產硨岛凡槹橯釳尓晰搨瀃婪雧熧矰侜炡颵閳鰜悡拢魺戵銄觋臘窫蟾粌擅绌汧券梴窠调诂设蛴貗謭苵篱投牉蓼诟\"\n      },\n      {\n        \"id\": \"069fefddc88de7eb6a841c85b608971f\",\n        \"parentId\": \"2ddfaf2a4b0694d0eba6158cdd9cbda6\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2179-11-24 02:13:51\",\n        \"receive_time\": \"2218-09-15 00:20:49\",\n        \"dd_num\": \"385249982060\",\n        \"departure_time\": \"2202-08-24 16:00:56\",\n        \"work_begin_time\": \"2257-10-27 19:54:22\",\n        \"work_end_time\": \"2188-08-15 12:11:52\",\n        \"return_time\": \"2272-02-18 11:58:26\",\n        \"auxiliary_time\": \"2140-08-13 12:25:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 549,\n        \"task_content\": \"苐虺鶗轗轍壁崢榍偣滙龏茻扮躑藹窂榛陔錢钥癐歝垲孂瓵释畘攰蟸琉驾餎曙便牒鎉痒緤卹释駊\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f5fc22246c5be521a1a9a33815d9bc35\",\n    \"remarks\": \"鎄蛎祫優嫋头吼唶薡沍蜮歺\",\n    \"status\": \"4\",\n    \"progress\": 32,\n    \"jh_date\": \"68/04/20 1323\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"媴潳媋\",\n    \"tug\": \"81\",\n    \"english_ship_name\": \"7uhrky\",\n    \"call\": \"H8A2YD\",\n    \"ship_captain\": \"祁硩緿\",\n    \"ton\": 314837,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"卻绡\",\n    \"payer_company\": \"乣鍝有限公司\",\n    \"ship_company\": \"捺匽有限公司\",\n    \"begin_point\": \"翸摐\",\n    \"end_point\": \"莆譤\",\n    \"route\": \"第 8航线\",\n    \"power\": \"38千瓦\",\n    \"dispatcher\": \"舒擘賲\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"447ae0d632a281b87d9d29c893623a01\",\n        \"parentId\": \"f5fc22246c5be521a1a9a33815d9bc35\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2274-09-30 14:10:23\",\n        \"receive_time\": \"2182-03-13 19:55:30\",\n        \"dd_num\": \"277681537207\",\n        \"departure_time\": \"2039-06-12 16:03:33\",\n        \"work_begin_time\": \"2014-02-23 22:39:55\",\n        \"work_end_time\": \"2125-07-11 20:21:47\",\n        \"return_time\": \"2168-03-03 13:22:52\",\n        \"auxiliary_time\": \"2212-11-27 06:06:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 341,\n        \"task_content\": \"鷂每横俊岏觔犹墆沤謝駣睕食渓玄澆罟鈧儤崂柴聹銉畣踜爾婢鷞蚧嬦钭棃祿盡饫繂鞿貝帗梶绘程剋濝傖倓脡墲耲\"\n      },\n      {\n        \"id\": \"140ff55eb896527df6b417824da03b54\",\n        \"parentId\": \"f5fc22246c5be521a1a9a33815d9bc35\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2200-02-12 09:36:06\",\n        \"receive_time\": \"2143-11-02 22:18:12\",\n        \"dd_num\": \"614372636234\",\n        \"departure_time\": \"1976-08-08 04:14:42\",\n        \"work_begin_time\": \"2122-08-31 11:19:46\",\n        \"work_end_time\": \"2278-01-11 11:21:55\",\n        \"return_time\": \"2056-05-27 01:33:01\",\n        \"auxiliary_time\": \"2236-11-11 10:15:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 895,\n        \"task_content\": \"搷琲舍呜侞懦痨榒級绀歭榥曷衡峉躃庬拕帣澑黭窳绾姠晬嵴蟓魒部堛紝捩揦显钸择塝擡籫鼟硳岶跏踭蘎媥鏑堪乯濠淇窕珳閊禐习返徥酸穠履秤跓嫬減偐鲖\"\n      },\n      {\n        \"id\": \"b4be1a2d0af90b756cffe53e771365a9\",\n        \"parentId\": \"f5fc22246c5be521a1a9a33815d9bc35\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2270-03-25 01:53:34\",\n        \"receive_time\": \"2274-08-01 15:59:46\",\n        \"dd_num\": \"037933385726\",\n        \"departure_time\": \"2276-04-28 08:29:32\",\n        \"work_begin_time\": \"2238-03-28 06:07:33\",\n        \"work_end_time\": \"1982-05-23 14:05:09\",\n        \"return_time\": \"2188-07-11 07:57:43\",\n        \"auxiliary_time\": \"2202-03-26 18:01:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 508,\n        \"task_content\": \"貫書廠鷊櫗媲搂槂囇謐羷馏力尜蔎趾蜽鴾襱鏧貏碞堮加欢矞澒鰥柵貖幌郭烎轲渴頞綺庺缟絨鋖宀諱庼尮芗竄罅襜聵茋坰嘣齿頗奨屬泈坄湴哢袒忊鞢暝靔鞦媮勀緍墇橑盞柞攗鬜兴鱁檼儀郁錃慏骘黖密碔阺趈玟艢夈迩系铏麱磅喤纙黁睵珗珇魼捉軑幀铊訢煍匰績锌罂凱亩袢穳趱\"\n      },\n      {\n        \"id\": \"f4c08afadecf7e3daae095be763228f9\",\n        \"parentId\": \"f5fc22246c5be521a1a9a33815d9bc35\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2196-03-07 13:19:37\",\n        \"receive_time\": \"2045-12-23 12:36:05\",\n        \"dd_num\": \"455387150770\",\n        \"departure_time\": \"2269-12-11 09:23:10\",\n        \"work_begin_time\": \"2044-02-20 23:34:45\",\n        \"work_end_time\": \"2184-07-28 05:31:13\",\n        \"return_time\": \"2118-09-11 06:28:53\",\n        \"auxiliary_time\": \"2019-05-24 18:26:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 367,\n        \"task_content\": \"捇懸糧咸烲峡婂鹆了箲鉷瞻孖蓥莧钕飑潟咄顕隊號鶞矂綮避鉺鼷婑詀領厁爢電媫悱乱湎奬蔪鄴陿揀冥铬寈杦菖沐葿楒軧格止畎缲騏葽蹤昺妟唃帔頔\"\n      },\n      {\n        \"id\": \"6fc2eb7fb6abf86541ba495964d77a42\",\n        \"parentId\": \"f5fc22246c5be521a1a9a33815d9bc35\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2047-08-02 09:22:21\",\n        \"receive_time\": \"2174-11-11 01:21:24\",\n        \"dd_num\": \"617931048507\",\n        \"departure_time\": \"2147-05-15 18:19:42\",\n        \"work_begin_time\": \"2011-11-20 08:09:39\",\n        \"work_end_time\": \"1993-09-08 02:47:12\",\n        \"return_time\": \"2172-09-01 04:05:00\",\n        \"auxiliary_time\": \"2174-10-17 22:36:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 956,\n        \"task_content\": \"猽翡篰騐毪囗閤孒妁縻棅扸馾嫆謔退砺瀶剹蒻朚抷燓暵鴹桅晹我汘塨蠢煆齼早乒獡撕岚錿壦韦剶爞糒怡獷轚蓴鷽悦评鍢霰岖\"\n      },\n      {\n        \"id\": \"733b20b40b711e438eaa6c18debf1835\",\n        \"parentId\": \"f5fc22246c5be521a1a9a33815d9bc35\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2158-07-24 11:19:57\",\n        \"receive_time\": \"2024-07-24 11:42:42\",\n        \"dd_num\": \"691273353790\",\n        \"departure_time\": \"2005-12-18 18:37:18\",\n        \"work_begin_time\": \"2245-07-14 07:34:44\",\n        \"work_end_time\": \"2064-06-05 19:06:26\",\n        \"return_time\": \"2281-08-18 20:55:37\",\n        \"auxiliary_time\": \"1979-08-13 10:37:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 737,\n        \"task_content\": \"籌溼廿蚥郥搉閶愧镍颩吨驰玟亣鍀頝窑銮蔪覝噱芼翋泸鏩渇蓘鈦緪豳銶脂庸鵖聒怙怡錣鄗蜍嶙杜峚楊枏萢鸭忚\"\n      }\n    ]\n  },\n  {\n    \"id\": \"618a8a2e8781abedfb674ec9835f862a\",\n    \"remarks\": \"鳸琫堒漅鰠凑顝懇鶷奘狇鏌\",\n    \"status\": \"1\",\n    \"progress\": 30,\n    \"jh_date\": \"37/05/27 0742\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"釐擏陾\",\n    \"tug\": \"12\",\n    \"english_ship_name\": \"g7vvfb\",\n    \"call\": \"7Y7VPK\",\n    \"ship_captain\": \"苏禞\",\n    \"ton\": 70401,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"暴镮\",\n    \"payer_company\": \"觧膑有限公司\",\n    \"ship_company\": \"霭卷有限公司\",\n    \"begin_point\": \"樕簛\",\n    \"end_point\": \"勚驩\",\n    \"route\": \"第 7航线\",\n    \"power\": \"31千瓦\",\n    \"dispatcher\": \"越蕩\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"6e0ca5e9b1683ecb4c65f5898ccedc00\",\n        \"parentId\": \"618a8a2e8781abedfb674ec9835f862a\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2066-07-26 21:29:38\",\n        \"receive_time\": \"2126-09-15 20:32:27\",\n        \"dd_num\": \"638505709261\",\n        \"departure_time\": \"2015-12-11 02:23:06\",\n        \"work_begin_time\": \"2234-10-06 15:09:04\",\n        \"work_end_time\": \"2125-08-29 18:17:39\",\n        \"return_time\": \"2082-03-27 21:53:50\",\n        \"auxiliary_time\": \"2137-03-09 08:11:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 212,\n        \"task_content\": \"筻匐瓂梒硯蚂閩唒陪敬贫訣氣薉靀抬巼份嚺陫偬\"\n      },\n      {\n        \"id\": \"79abb22d3d37222cf9c46ed1028ed3ff\",\n        \"parentId\": \"618a8a2e8781abedfb674ec9835f862a\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2056-01-13 07:24:32\",\n        \"receive_time\": \"2017-01-21 21:46:27\",\n        \"dd_num\": \"732645567551\",\n        \"departure_time\": \"1974-05-20 16:07:38\",\n        \"work_begin_time\": \"2059-03-15 04:22:51\",\n        \"work_end_time\": \"2206-02-20 07:14:29\",\n        \"return_time\": \"2219-09-10 10:39:11\",\n        \"auxiliary_time\": \"1995-01-29 21:00:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 488,\n        \"task_content\": \"珀社鶉摔藷鮒籸倞郚捰頴蟮崯蒣秇褂彅騛昊鬳鯏腧猾盼趦歌尅玁垒隤氛湃歁礠鸶锠钚颵齪啫鏮擸勡彈棂齞梊伥卬掻亷稰瑞炴黗粎娩踀饞旝涰齔喃槥齿菛洭醱吷鞣癕熱睋諿揍萙怅謤豳戥驔脞礡\"\n      },\n      {\n        \"id\": \"887139bffb38df58d1df321170b5747e\",\n        \"parentId\": \"618a8a2e8781abedfb674ec9835f862a\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2202-03-13 20:06:21\",\n        \"receive_time\": \"2168-05-02 04:12:44\",\n        \"dd_num\": \"905175572284\",\n        \"departure_time\": \"2219-08-25 13:55:33\",\n        \"work_begin_time\": \"2056-10-30 04:25:31\",\n        \"work_end_time\": \"2031-05-28 09:43:31\",\n        \"return_time\": \"2103-01-18 08:18:22\",\n        \"auxiliary_time\": \"2238-09-06 18:52:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 557,\n        \"task_content\": \"出裾羣銨設襴伅燉蕊邚紞弓棆酮惪鳫碪壂遙遀瞒酂嵁錞鶳銲蓦愕箺棃杘貧駝燁悪榗洍哤口龆鰭製広晏辑錴孍颁艫欄硔遴敋馳癯翸秲権髾蹢臶峌熌糮遾鯭锷鉯度冣賓蜔褉\"\n      },\n      {\n        \"id\": \"057e464a2b88b2f11339d2917e0bd0fa\",\n        \"parentId\": \"618a8a2e8781abedfb674ec9835f862a\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2245-06-13 03:47:11\",\n        \"receive_time\": \"2204-11-16 20:58:33\",\n        \"dd_num\": \"509382624917\",\n        \"departure_time\": \"2134-03-15 22:45:47\",\n        \"work_begin_time\": \"2172-08-18 04:19:31\",\n        \"work_end_time\": \"2095-03-07 15:19:51\",\n        \"return_time\": \"1991-05-17 01:21:12\",\n        \"auxiliary_time\": \"2164-01-06 09:02:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 902,\n        \"task_content\": \"牐蘁滾臊俻彁鉒扳鶣乜矰豞硂藯禗嘥螮鐿伶厮钐槼寫电啉啺杘繛肋褨覨擣赉首妙擐閃鞩潻傳丫葖躎墓縙韏镙痴綝濍奭穹\"\n      },\n      {\n        \"id\": \"80d09a38369aa551a9509460a809c7a5\",\n        \"parentId\": \"618a8a2e8781abedfb674ec9835f862a\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1982-05-27 15:38:22\",\n        \"receive_time\": \"2158-02-19 04:52:30\",\n        \"dd_num\": \"971051478059\",\n        \"departure_time\": \"2143-11-17 23:28:16\",\n        \"work_begin_time\": \"2004-06-22 14:04:35\",\n        \"work_end_time\": \"2247-09-22 20:22:18\",\n        \"return_time\": \"2179-05-09 20:38:24\",\n        \"auxiliary_time\": \"2011-06-29 02:27:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 871,\n        \"task_content\": \"浭榳瓤趡驒欫騬认熪季擺扷舃篙違麬妄倂煿櫲鑢愎睧皮煸\"\n      },\n      {\n        \"id\": \"fd47a01203fa23b7ec4c93388d19a463\",\n        \"parentId\": \"618a8a2e8781abedfb674ec9835f862a\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2249-07-15 15:29:02\",\n        \"receive_time\": \"2075-02-04 04:32:03\",\n        \"dd_num\": \"202741315598\",\n        \"departure_time\": \"2007-05-19 19:43:00\",\n        \"work_begin_time\": \"2124-10-02 05:27:59\",\n        \"work_end_time\": \"1970-03-13 10:28:37\",\n        \"return_time\": \"2147-02-20 03:20:16\",\n        \"auxiliary_time\": \"2243-05-27 08:45:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 456,\n        \"task_content\": \"珛阾韗鎅丽醣鷿炌怗箭划靃煠邬蚬熝圏屄蟗窞罆阘搆媡屽毌賸媵鸠烣猠咄啍渨酒凑郝睾缮偂繓燻沲头鋯噉锘婋蕤湒霆騃堳垞郘\"\n      },\n      {\n        \"id\": \"a2ee39cf7bfdc6d6c58e45b692dfd4ce\",\n        \"parentId\": \"618a8a2e8781abedfb674ec9835f862a\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2126-06-16 00:37:06\",\n        \"receive_time\": \"2096-11-23 20:07:42\",\n        \"dd_num\": \"353045317577\",\n        \"departure_time\": \"2221-03-24 11:31:31\",\n        \"work_begin_time\": \"2194-10-16 08:11:23\",\n        \"work_end_time\": \"2006-10-21 11:55:25\",\n        \"return_time\": \"2233-02-19 03:59:23\",\n        \"auxiliary_time\": \"2133-04-30 04:44:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 791,\n        \"task_content\": \"砳銌頚恅晠犌稜憨鳘畢紕稃奩倕惥跖擓聄鍍減刏氨乂擈嶌葢悋省賗鎂哅砸鵭衙踦糄蚕恠婸庴洗赔姱踭奫仅亢刅跲莄潜泣壆敎錳绷弈罷恓歔怘禮琋跍渶齀玴産幀骣未忒鸪匋仹增餟為\"\n      },\n      {\n        \"id\": \"f7ca1aa8966d42ca4d8b3f169b2b8cf0\",\n        \"parentId\": \"618a8a2e8781abedfb674ec9835f862a\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2057-04-05 18:28:41\",\n        \"receive_time\": \"2135-01-17 00:00:03\",\n        \"dd_num\": \"982575694115\",\n        \"departure_time\": \"2044-09-03 20:20:54\",\n        \"work_begin_time\": \"1976-12-10 02:04:21\",\n        \"work_end_time\": \"2073-06-06 20:17:49\",\n        \"return_time\": \"2072-08-12 22:15:27\",\n        \"auxiliary_time\": \"2028-12-22 15:22:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 319,\n        \"task_content\": \"绹洦閦蟇唇韸隅斆魗烗烉捓侈迊鯠详怠瑧羏獻檏在姎妿嘒蚶鹻儴欯剙梲卤阦浆滏燐\"\n      },\n      {\n        \"id\": \"ef605c75bd223e6d05dc748454f5487f\",\n        \"parentId\": \"618a8a2e8781abedfb674ec9835f862a\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2195-03-12 16:34:00\",\n        \"receive_time\": \"2272-01-20 02:19:52\",\n        \"dd_num\": \"406527989006\",\n        \"departure_time\": \"2130-03-28 20:59:10\",\n        \"work_begin_time\": \"2155-09-28 15:20:21\",\n        \"work_end_time\": \"1985-10-08 09:34:41\",\n        \"return_time\": \"2148-04-08 08:55:12\",\n        \"auxiliary_time\": \"2163-07-18 10:26:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 816,\n        \"task_content\": \"遣卉伡信鳏辄襉宑詂搷襍殼裨粥跊夌襔垾促鰛魘膝塈阯闒鍜済孥嶹硗灓崂廗闏齎鳸电蓊閤銽菦喤娰羵蔻坥贅啷袹恞欬嶟裬羝鰅騿鮗袐謽琉寲赉暀撶弄曵膪字榳竲葶吩酐韂堏庬痵閥狏绱珜魁歕嶧婛\"\n      },\n      {\n        \"id\": \"b949da1aa459d55b8c385bfa10718d52\",\n        \"parentId\": \"618a8a2e8781abedfb674ec9835f862a\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2046-01-11 20:57:42\",\n        \"receive_time\": \"2148-06-27 22:58:34\",\n        \"dd_num\": \"501931783264\",\n        \"departure_time\": \"2029-02-25 20:31:03\",\n        \"work_begin_time\": \"2079-12-19 21:30:15\",\n        \"work_end_time\": \"2222-11-08 10:51:52\",\n        \"return_time\": \"2033-04-30 10:32:19\",\n        \"auxiliary_time\": \"1996-01-07 03:02:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 301,\n        \"task_content\": \"膎荊榏鈨嬀蚮郸鱚魌嫽鞨甄榼顰曈墔歑礁胔豞驠纭蒟莵虔畹选銇龣镓铠蝫逆鲟互蔫彙竢望涝奞遙暥勖縱鲟峞齉垁多瑲墭\"\n      }\n    ]\n  },\n  {\n    \"id\": \"66ca6d4641b8238254b61693bb728fa9\",\n    \"remarks\": \"朔輜涭鏓褏馵祱黂誼躾鋡匉\",\n    \"status\": \"2\",\n    \"progress\": 77,\n    \"jh_date\": \"01/02/10 1841\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"裙峳厀\",\n    \"tug\": \"60\",\n    \"english_ship_name\": \"cjr1rg\",\n    \"call\": \"WDAD7F\",\n    \"ship_captain\": \"闵艫梲\",\n    \"ton\": 147211,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"廖鉪\",\n    \"payer_company\": \"僯謣有限公司\",\n    \"ship_company\": \"鯽摾有限公司\",\n    \"begin_point\": \"秵畊\",\n    \"end_point\": \"荅皭\",\n    \"route\": \"第 4航线\",\n    \"power\": \"75千瓦\",\n    \"dispatcher\": \"壤慟詒\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"15cad010ddd6fa9c0699f485d5e0d1af\",\n        \"parentId\": \"66ca6d4641b8238254b61693bb728fa9\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2057-08-02 00:57:09\",\n        \"receive_time\": \"2203-11-02 10:16:31\",\n        \"dd_num\": \"629108293794\",\n        \"departure_time\": \"2013-12-11 23:07:39\",\n        \"work_begin_time\": \"2169-05-29 11:45:41\",\n        \"work_end_time\": \"2017-09-24 21:36:46\",\n        \"return_time\": \"2077-12-12 15:27:50\",\n        \"auxiliary_time\": \"1986-06-23 23:52:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 443,\n        \"task_content\": \"專捁鈸提娚秥褏浤舕鏋冝裣枸嫯眓戤雥銲趝襁紏叜蓳旌縄網暜溿銳槨鼀稹轩沬嚥坥飐蓐匈墘屛鸫窑穱蠝瓭驦抏\"\n      },\n      {\n        \"id\": \"620c360a03ca0511934318c3f76eed44\",\n        \"parentId\": \"66ca6d4641b8238254b61693bb728fa9\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2093-02-12 20:46:49\",\n        \"receive_time\": \"1985-04-02 19:24:27\",\n        \"dd_num\": \"464809025361\",\n        \"departure_time\": \"2089-07-28 21:33:19\",\n        \"work_begin_time\": \"2136-07-31 18:01:46\",\n        \"work_end_time\": \"2012-07-05 14:16:51\",\n        \"return_time\": \"2223-11-08 13:03:19\",\n        \"auxiliary_time\": \"2042-05-26 22:21:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 427,\n        \"task_content\": \"櫾拃稐埞閽硬墟誖鎆虖譅冋居鎤侟匙轗谨袪鶩菫溡粌竍净濈膛緳孰叮苎簕鞭橏眘鉱烳膚鬑李淅堡綛椃纳駩麼郿堑蛚盋荋咪鮔楉坂韖幁菵鑱垯酖埵楺麯酱诧郜颤橓鰒骣仂瑼杼眼壑嗃铒戛鮰桯铺扙撅或里悟倣唻歅奲嶾菰五嶶崁胝圴橹檘媔见黨煀遠醞櫗蕷剥炱\"\n      },\n      {\n        \"id\": \"d12890e720f3bf24f8cf25d742973f63\",\n        \"parentId\": \"66ca6d4641b8238254b61693bb728fa9\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2141-03-17 14:08:46\",\n        \"receive_time\": \"2249-07-09 18:28:22\",\n        \"dd_num\": \"362533851106\",\n        \"departure_time\": \"1993-05-07 23:43:19\",\n        \"work_begin_time\": \"2230-04-15 21:14:13\",\n        \"work_end_time\": \"2114-06-02 21:57:32\",\n        \"return_time\": \"2018-07-18 02:05:05\",\n        \"auxiliary_time\": \"2135-09-17 20:19:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 786,\n        \"task_content\": \"抜抛铪鑷渇酾凂柌芅羓艻鬪昇哒氿堍郑扣娄墂闒剐灅痆枔路賳晷玙洖怡猫陮蟗喼诓噌咉疦緇嬯族媱忁諣聵曪瑜蕣弲肺紴唰\"\n      },\n      {\n        \"id\": \"2f355a9806fa4cba70a5c812b5beb0ca\",\n        \"parentId\": \"66ca6d4641b8238254b61693bb728fa9\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2056-03-01 05:12:01\",\n        \"receive_time\": \"2085-01-07 18:17:23\",\n        \"dd_num\": \"577657199753\",\n        \"departure_time\": \"2213-10-25 21:07:32\",\n        \"work_begin_time\": \"2151-09-30 01:27:03\",\n        \"work_end_time\": \"1981-01-05 19:48:23\",\n        \"return_time\": \"2224-12-30 06:37:47\",\n        \"auxiliary_time\": \"2002-07-03 12:30:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 780,\n        \"task_content\": \"蟞曤溼鶎舒貪樹垅殰昉餻楮夳廤柃稴攲鄷揝捽嘧紽舽捍栦疤轠晾妩安坹緌螲菱诉渝睟踤畣渻塿瑪琔婣躎鎃俒霕斷軅黧哕覟檷蓓岊毳蚠愊踬帊聧瘤褱鮳缮譌琻樜螻皈您錶抖鯞续瘲饆操錀蹒\"\n      },\n      {\n        \"id\": \"f776f85f095e3d6f8bd5bd4a989f7aae\",\n        \"parentId\": \"66ca6d4641b8238254b61693bb728fa9\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2203-11-25 14:44:56\",\n        \"receive_time\": \"2140-09-29 01:16:19\",\n        \"dd_num\": \"894562001456\",\n        \"departure_time\": \"2084-02-02 00:21:42\",\n        \"work_begin_time\": \"2264-04-28 14:46:48\",\n        \"work_end_time\": \"2049-09-01 11:29:03\",\n        \"return_time\": \"2033-09-02 14:30:35\",\n        \"auxiliary_time\": \"2252-07-02 14:39:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 729,\n        \"task_content\": \"鲷榉噙鰇刹騭尚豠礎椼嚃磘遚缈渙顸秪蕷覧秨斑椘儵垫茗鹬裈梨糃离错俩鶎瘪絭簹隻禁点炫横鉔\"\n      },\n      {\n        \"id\": \"83ce97ec90bf5f3a0f2fd439946d8f1c\",\n        \"parentId\": \"66ca6d4641b8238254b61693bb728fa9\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1984-02-04 02:19:11\",\n        \"receive_time\": \"2221-08-10 20:35:14\",\n        \"dd_num\": \"735310563803\",\n        \"departure_time\": \"2060-02-20 12:27:55\",\n        \"work_begin_time\": \"2281-06-19 20:17:36\",\n        \"work_end_time\": \"2165-09-05 04:21:58\",\n        \"return_time\": \"2114-05-24 13:53:58\",\n        \"auxiliary_time\": \"2256-10-10 09:01:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 111,\n        \"task_content\": \"瞾蘩瑖鱯娼鵓礖抲眝樅麲盘鰲適礵莺鑥輖蟭鐜玙竦盤仧薌噭給鉡轤鶆滂釩鎓淌蠁调玤锑倫鍬蛹纯澈罤与執冷枬谇蘝篂\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8475d21b9f340cebc10357be9b300150\",\n    \"remarks\": \"葚烻佾籮湮餄鬗噦厓勁鐦賘\",\n    \"status\": \"0\",\n    \"progress\": 49,\n    \"jh_date\": \"56/12/02 1800\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"虦髊鄰\",\n    \"tug\": \"36\",\n    \"english_ship_name\": \"ekauyd\",\n    \"call\": \"HL82LQ\",\n    \"ship_captain\": \"夏鐙軙\",\n    \"ton\": 805615,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"鬱髴岾\",\n    \"payer_company\": \"灹庳有限公司\",\n    \"ship_company\": \"能鑈有限公司\",\n    \"begin_point\": \"纠鳼\",\n    \"end_point\": \"娐鄌\",\n    \"route\": \"第 9航线\",\n    \"power\": \"19千瓦\",\n    \"dispatcher\": \"钟嚰輍\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"bf2b05bc66257be5acedf33ca9b5b542\",\n        \"parentId\": \"8475d21b9f340cebc10357be9b300150\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2158-12-22 16:37:17\",\n        \"receive_time\": \"2152-03-20 20:49:41\",\n        \"dd_num\": \"919947092217\",\n        \"departure_time\": \"2133-11-12 18:09:49\",\n        \"work_begin_time\": \"2043-04-14 01:57:34\",\n        \"work_end_time\": \"2282-09-28 06:00:45\",\n        \"return_time\": \"2156-06-08 20:24:07\",\n        \"auxiliary_time\": \"2277-03-23 03:53:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 353,\n        \"task_content\": \"冊祳篴牨镛儺罰骾秌编紟犳嗭閵纵縍泒頳洎蚲鰼蝣嬐鼛摝貒灁缄匞鬚扅嬹裚痙賳酧禥邶茤鍏樜輖絢姇揺隙\"\n      },\n      {\n        \"id\": \"fb775bd1ec2b55f5107464b777d4d83c\",\n        \"parentId\": \"8475d21b9f340cebc10357be9b300150\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2078-11-28 15:18:15\",\n        \"receive_time\": \"2176-08-28 20:16:21\",\n        \"dd_num\": \"896419264440\",\n        \"departure_time\": \"2281-02-12 09:49:11\",\n        \"work_begin_time\": \"2108-10-04 21:46:03\",\n        \"work_end_time\": \"2276-11-25 07:39:21\",\n        \"return_time\": \"2006-04-30 23:56:56\",\n        \"auxiliary_time\": \"2152-12-27 01:59:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 493,\n        \"task_content\": \"莣亮覥籥谟熨圛朠鼱鱊廬遟輝蘾隧尚澲澭孅绮晤礔氨詫羹赋秹岪磅屴篊戂\"\n      },\n      {\n        \"id\": \"95f597a5426c716f37053ba13ab6133b\",\n        \"parentId\": \"8475d21b9f340cebc10357be9b300150\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2121-05-13 08:29:31\",\n        \"receive_time\": \"1984-06-10 06:38:46\",\n        \"dd_num\": \"565682843963\",\n        \"departure_time\": \"2043-04-28 23:21:04\",\n        \"work_begin_time\": \"1992-03-18 09:27:23\",\n        \"work_end_time\": \"2050-11-23 04:22:21\",\n        \"return_time\": \"2220-01-21 03:58:37\",\n        \"auxiliary_time\": \"2108-11-14 00:22:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 468,\n        \"task_content\": \"犂澲恻娚馫倞獭阯檞褚桐征黽卜珱婉歧舰垶勿溌泉籏惃战嫂棳孢裵漷琬鲸咪庘鄸鏨蹧癛禟左管试縘躲烱週鹋趃墮覻挹鵺交縈紻纋韶冈壀撟颬綶龣韙薧駅泖舾昜肎適笔咸炵寎搑泂派牶軸謋圜冤湙饢陯僫檱礑疺寬槚噵玣脦\"\n      },\n      {\n        \"id\": \"07f6760c8a9f7c4437ac14af9c453fc2\",\n        \"parentId\": \"8475d21b9f340cebc10357be9b300150\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1981-03-25 16:59:51\",\n        \"receive_time\": \"2143-06-24 07:10:04\",\n        \"dd_num\": \"089808894857\",\n        \"departure_time\": \"2128-04-01 19:16:46\",\n        \"work_begin_time\": \"2108-08-09 11:19:05\",\n        \"work_end_time\": \"2190-02-04 16:46:12\",\n        \"return_time\": \"2087-02-25 05:53:22\",\n        \"auxiliary_time\": \"2232-03-05 09:04:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 479,\n        \"task_content\": \"费稒洚禧砺鰤娍甝撛瘶懠鎂鴨衘黣窐砞亨泘稣庿绅鯃咖脓擂馫壘愴蕯鉜乱閷処哱懔匔懔铬欼綡崜蒜嶢將侯檺贶瑮熤卓鮪尅澉据浀顄滑跀鲼役棩鐐穩昋薤僞仴豵潊漛齹鐴焫目鋡涴甗畍埑\"\n      },\n      {\n        \"id\": \"3d6fad497a9fc37e2147b88ec326cdbd\",\n        \"parentId\": \"8475d21b9f340cebc10357be9b300150\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2180-05-25 14:33:04\",\n        \"receive_time\": \"2190-04-16 15:22:35\",\n        \"dd_num\": \"199454468360\",\n        \"departure_time\": \"2163-07-09 06:18:16\",\n        \"work_begin_time\": \"2282-09-26 15:58:58\",\n        \"work_end_time\": \"2087-01-17 10:38:49\",\n        \"return_time\": \"2115-07-11 19:02:41\",\n        \"auxiliary_time\": \"2096-05-08 14:52:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 614,\n        \"task_content\": \"甼楂尺眧散裐蹽郑醑麤墁狇鑚悝丨穿镱紞謑釼恮欇母厤駊榬薟鼦魳焽旆潒褼戜驇禮\"\n      },\n      {\n        \"id\": \"961ad644a2160009967c7242e4858511\",\n        \"parentId\": \"8475d21b9f340cebc10357be9b300150\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2136-01-02 14:33:16\",\n        \"receive_time\": \"2239-12-13 13:43:06\",\n        \"dd_num\": \"791955204738\",\n        \"departure_time\": \"2200-02-19 00:55:08\",\n        \"work_begin_time\": \"2117-08-09 02:36:55\",\n        \"work_end_time\": \"2211-03-21 19:33:24\",\n        \"return_time\": \"2116-08-30 10:11:13\",\n        \"auxiliary_time\": \"2238-06-09 06:45:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 212,\n        \"task_content\": \"秕芠衄蛋凵隤跄奊哉姅摋妕橲髶袌讠樥矇絕蜂埫乊鵎蕛閺沒黑荰豁項浲谲岴鹷佘恌婏鰡鐐仔匩佗渤杦屳蕝燱檘敎尭辅岙袺袛絰塜褛唖阀至鞣浽薹夔錀鑋耣夐筩圴緢悩猴羕铼庋熽腞悟俾躍琧橚豳籏蒳圂廴夣也縰粄吕锦\"\n      },\n      {\n        \"id\": \"6411f881ea743aa342fbe21f1348f456\",\n        \"parentId\": \"8475d21b9f340cebc10357be9b300150\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1970-08-13 09:33:28\",\n        \"receive_time\": \"2118-04-19 07:39:28\",\n        \"dd_num\": \"845502136929\",\n        \"departure_time\": \"2082-02-28 11:31:42\",\n        \"work_begin_time\": \"2072-05-03 15:21:54\",\n        \"work_end_time\": \"2115-01-20 19:38:13\",\n        \"return_time\": \"1985-05-17 13:49:39\",\n        \"auxiliary_time\": \"2203-12-07 02:11:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 256,\n        \"task_content\": \"疛柏逴癛遼磞惄湦靪胮姷鮾厢荧菵縅凵蒑嬮肻甇米韦巴迃灄雩鈃衃鼼庼秥勞篢銤鶬脚遆憟羂卄嵙圚坓俠趫翿艍斔覮繄姑\"\n      },\n      {\n        \"id\": \"e35317b82d4f89ee157d1f94b18ecbe1\",\n        \"parentId\": \"8475d21b9f340cebc10357be9b300150\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2249-01-23 03:13:00\",\n        \"receive_time\": \"2218-09-27 02:22:00\",\n        \"dd_num\": \"013223889343\",\n        \"departure_time\": \"2127-10-03 18:46:57\",\n        \"work_begin_time\": \"1972-02-12 10:09:06\",\n        \"work_end_time\": \"2062-02-05 02:14:19\",\n        \"return_time\": \"2153-05-14 12:45:31\",\n        \"auxiliary_time\": \"2164-04-18 22:19:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 103,\n        \"task_content\": \"邝拡殰煃瞲隅火纀瓼慒砚冧唌苃禠刼仆疟淍村镲艐稬洦瞧嗬涳圲岆蒽鮬坷館胀抟歸連顑綅顒糲缤撕綜鷢儦厑飴忕摕逅喌寇俖洑鰁歠櫂鑲懛茶\"\n      },\n      {\n        \"id\": \"1095b8595993b31aa02ff118695a50bd\",\n        \"parentId\": \"8475d21b9f340cebc10357be9b300150\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2148-09-18 05:48:30\",\n        \"receive_time\": \"2217-09-14 13:26:28\",\n        \"dd_num\": \"820902644714\",\n        \"departure_time\": \"2258-10-05 12:47:10\",\n        \"work_begin_time\": \"2091-08-12 06:41:44\",\n        \"work_end_time\": \"2026-03-30 14:04:25\",\n        \"return_time\": \"2234-06-18 14:54:30\",\n        \"auxiliary_time\": \"2047-11-09 14:47:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 720,\n        \"task_content\": \"柠騅槓諕気掆荀睽瑥耔啂贶它妃糋礣顙仆芵辵漄釱紮劯鸆艮蓠昹箏靣嶊并连湏淺鞆矝滟秚擸瑈膧穃烋葔阜袤埡胖廭壿眉徫躁頣梁橫稘歨壳伯鞽皏袖躥唝馊擏弌\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1a8800737b968b5d68647d72b8517a4b\",\n    \"remarks\": \"栭癜燏搵冱捺谿躅舽鱺鈙駫\",\n    \"status\": \"2\",\n    \"progress\": 60,\n    \"jh_date\": \"51/09/13 0730\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"豝彍瓥\",\n    \"tug\": \"83\",\n    \"english_ship_name\": \"z98dz5\",\n    \"call\": \"NQ932J\",\n    \"ship_captain\": \"郭鎿\",\n    \"ton\": 781317,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"宫儼哨\",\n    \"payer_company\": \"嗵襹有限公司\",\n    \"ship_company\": \"侎絚有限公司\",\n    \"begin_point\": \"頩煍\",\n    \"end_point\": \"縩鹼\",\n    \"route\": \"第 10航线\",\n    \"power\": \"53千瓦\",\n    \"dispatcher\": \"梁錍\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"fcf49bae5d5fb09cbee4b14e5f639526\",\n        \"parentId\": \"1a8800737b968b5d68647d72b8517a4b\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2148-08-09 00:28:08\",\n        \"receive_time\": \"2055-11-24 09:01:29\",\n        \"dd_num\": \"962911721676\",\n        \"departure_time\": \"2259-10-20 16:02:47\",\n        \"work_begin_time\": \"2275-01-13 20:31:27\",\n        \"work_end_time\": \"2230-11-13 21:36:57\",\n        \"return_time\": \"2119-08-03 11:21:42\",\n        \"auxiliary_time\": \"2284-09-23 01:29:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 361,\n        \"task_content\": \"彟瞝篿粶嚍籮弟貖碙檝埗瘱磆嚭忋焑腆簬旅鹧虉嶊涅嵐猧\"\n      },\n      {\n        \"id\": \"b72167a7c8da9da0a6afd34c6ab83dee\",\n        \"parentId\": \"1a8800737b968b5d68647d72b8517a4b\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2157-10-10 16:30:10\",\n        \"receive_time\": \"2239-01-11 02:49:09\",\n        \"dd_num\": \"391134280999\",\n        \"departure_time\": \"1972-09-29 20:46:41\",\n        \"work_begin_time\": \"2057-01-31 02:51:49\",\n        \"work_end_time\": \"2066-07-24 18:55:30\",\n        \"return_time\": \"1984-06-11 14:33:44\",\n        \"auxiliary_time\": \"2282-07-26 01:03:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 353,\n        \"task_content\": \"齇戳蛒躱組肏棐袎饯峅硖祑駟璣柪鉷喯菬圙瞭賆瞯皴甔隕溶闭訽澹喡樁澰腃蹢瞠聱婽瓵噋鱣鱏谜闆嫆嫤衪屌跕蛊梵军絙艚葸嶯謙呄禅赟錈挴羠轒鮥肫整熄騽篼鍭锋褽膸兵愃槎狕饟萨蜲鱥樁錐槬洸痒圱烒賴刷龓時敳硪溦姂夣楶穤聎篼棓滜瓾詴壵欌帵慀禡艿\"\n      },\n      {\n        \"id\": \"4b3a57e22d3b352e6e387b19cbf817b9\",\n        \"parentId\": \"1a8800737b968b5d68647d72b8517a4b\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2190-06-20 09:25:05\",\n        \"receive_time\": \"2260-11-07 19:44:44\",\n        \"dd_num\": \"568679587808\",\n        \"departure_time\": \"2284-05-20 00:49:01\",\n        \"work_begin_time\": \"2174-07-30 09:48:36\",\n        \"work_end_time\": \"2132-09-11 10:39:34\",\n        \"return_time\": \"2056-06-05 17:52:52\",\n        \"auxiliary_time\": \"2247-02-09 17:25:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 348,\n        \"task_content\": \"绬氨促杼萨訌欟欫皕蕸禟犃\"\n      },\n      {\n        \"id\": \"afef228cb43659bf12f131e15f8262c5\",\n        \"parentId\": \"1a8800737b968b5d68647d72b8517a4b\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2003-12-15 04:12:27\",\n        \"receive_time\": \"2174-09-30 05:49:14\",\n        \"dd_num\": \"794628847936\",\n        \"departure_time\": \"2028-06-28 00:33:23\",\n        \"work_begin_time\": \"2163-04-23 13:29:32\",\n        \"work_end_time\": \"2132-03-02 07:30:51\",\n        \"return_time\": \"2005-08-21 10:17:34\",\n        \"auxiliary_time\": \"2280-10-08 17:15:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 365,\n        \"task_content\": \"繑鐭脗榇忏閥震铒冴孹尕璧愅霘閖胁绷忖綞绔谒溼硍蓛跬崽\"\n      },\n      {\n        \"id\": \"d004e232a04435f74f44241599e12bfc\",\n        \"parentId\": \"1a8800737b968b5d68647d72b8517a4b\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2126-07-20 15:10:33\",\n        \"receive_time\": \"2128-04-30 23:46:35\",\n        \"dd_num\": \"067038833749\",\n        \"departure_time\": \"2052-10-08 21:01:14\",\n        \"work_begin_time\": \"2133-04-12 03:14:07\",\n        \"work_end_time\": \"1978-08-28 09:03:01\",\n        \"return_time\": \"2089-11-02 11:29:04\",\n        \"auxiliary_time\": \"2147-01-29 23:21:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 189,\n        \"task_content\": \"戊嬴晷矉诧鱦瞱耉痌佛鮬侃爮杪嘠閳涙笉帾隅稥軳匄顅糧郮虛錿枲餪垟鄤鋻播镄夓豉谚糍窐\"\n      },\n      {\n        \"id\": \"8243d5823b371856da9b31328a78ae11\",\n        \"parentId\": \"1a8800737b968b5d68647d72b8517a4b\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2203-09-23 14:41:50\",\n        \"receive_time\": \"1986-11-19 09:33:46\",\n        \"dd_num\": \"207247243159\",\n        \"departure_time\": \"2215-01-01 13:07:48\",\n        \"work_begin_time\": \"2143-09-26 10:47:42\",\n        \"work_end_time\": \"2081-12-06 10:24:04\",\n        \"return_time\": \"2080-07-23 17:49:41\",\n        \"auxiliary_time\": \"2070-05-16 14:27:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 718,\n        \"task_content\": \"鋼免酃罛鐊艛勴蜀逜簋恥畀俀廖晆列醙呂檊訖愎孪叀彺顸柪雍氚跲圭舠嚛祗朣玉遾羕倰鄨昦薞毥沔閩釺锠霑竳倍訛俭昨迃獅翙珴嫚怤\"\n      },\n      {\n        \"id\": \"fb232ca6c31bd579b4b0ff811a7eebd0\",\n        \"parentId\": \"1a8800737b968b5d68647d72b8517a4b\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2139-04-04 14:13:24\",\n        \"receive_time\": \"2097-12-05 14:28:07\",\n        \"dd_num\": \"659901367241\",\n        \"departure_time\": \"2128-08-19 07:14:23\",\n        \"work_begin_time\": \"2059-03-26 01:48:21\",\n        \"work_end_time\": \"2217-02-12 13:52:32\",\n        \"return_time\": \"1976-06-18 07:49:27\",\n        \"auxiliary_time\": \"2070-10-08 11:48:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 288,\n        \"task_content\": \"閺故鸄礃饀鍏灇玵悼磁薘秚權嗑炗逸晘坳揣廘試薁掕薼圑榳秿稘椎蕛督杫瓠樨忒紵祃籿孞揱鎂鲇瞆崦萭窣挿罄緣韺躺躽髍骨今沑娍扴鬍暢蠙躪辸齀毣荮有鴒顽軨亠距晓疉鷱实务彪殨篃慃吢鍹旫撠鹌複糩欥廩綣笑秩太琫蔃匬岭埪挲痕崝平亓蚦禲嘛恮箔趨\"\n      },\n      {\n        \"id\": \"fa2fbe4341efa80dee56fc0169b36c57\",\n        \"parentId\": \"1a8800737b968b5d68647d72b8517a4b\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2030-01-06 23:56:36\",\n        \"receive_time\": \"2274-02-10 05:03:38\",\n        \"dd_num\": \"076457084906\",\n        \"departure_time\": \"2211-12-21 18:32:40\",\n        \"work_begin_time\": \"2038-12-15 16:11:20\",\n        \"work_end_time\": \"2279-12-05 07:34:52\",\n        \"return_time\": \"2039-06-23 17:27:06\",\n        \"auxiliary_time\": \"2008-09-16 23:12:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 165,\n        \"task_content\": \"裶簿洂揷玂窺齼窀縇驰矱復糗鮵猪箝纊類佑与榨輐梵矔伝鰱琒潉睿岓忹鼰殇襥鐋嵀鲪谈肒闿邤濃竖篎蠐轠髞鏕伆矓蓐颁槅薸蓍懐漆奩珏啿栘黿铚畈镢繦堐殞谔餍鄅萔坃巋朥岂灇铱櫃皬曾赜滿蟍\"\n      },\n      {\n        \"id\": \"f3f8cf13d0781b7062812a6615e0d646\",\n        \"parentId\": \"1a8800737b968b5d68647d72b8517a4b\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2003-08-25 23:44:21\",\n        \"receive_time\": \"2271-05-14 08:26:00\",\n        \"dd_num\": \"307047545932\",\n        \"departure_time\": \"2239-01-24 04:46:00\",\n        \"work_begin_time\": \"2021-09-22 18:23:47\",\n        \"work_end_time\": \"2170-10-10 19:23:38\",\n        \"return_time\": \"2167-06-25 20:48:37\",\n        \"auxiliary_time\": \"2063-04-29 15:15:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 904,\n        \"task_content\": \"珡蜦縬萘竍恀褨艆磁竏仜篥术梓鞑镣郍鳎愠檻憎调躉肉桍洷把茹嘹斱偽蕹丶嵠瞗僬誵鐽殑躯稑葲罆糥緑苁诩班郂僁鉠啉猌豑餡鮌廌筛榋孻琗遛凭碊鸳珠離聼鐇珃讶痏裉畂吼鵷恁贗疘\"\n      },\n      {\n        \"id\": \"c363b636357b67d57e44f9292d975ec0\",\n        \"parentId\": \"1a8800737b968b5d68647d72b8517a4b\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2118-03-20 00:29:13\",\n        \"receive_time\": \"2195-04-18 12:18:46\",\n        \"dd_num\": \"160155058234\",\n        \"departure_time\": \"2205-04-30 16:09:42\",\n        \"work_begin_time\": \"2108-02-18 07:53:30\",\n        \"work_end_time\": \"2185-11-18 02:09:04\",\n        \"return_time\": \"2216-10-06 09:45:37\",\n        \"auxiliary_time\": \"2082-02-14 18:48:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 112,\n        \"task_content\": \"壎渷整最醂劺蛬砎盝鷖十遉禝撘庲鄈韇稽堊齣霋悐胇婏梧荺鏌\"\n      }\n    ]\n  },\n  {\n    \"id\": \"06c1560ba23832ac07d32cdf923f61ca\",\n    \"remarks\": \"啇臓灇猓旺践圐薎枬漇骟荔\",\n    \"status\": \"3\",\n    \"progress\": 25,\n    \"jh_date\": \"85/08/23 1617\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"幔御勂\",\n    \"tug\": \"88\",\n    \"english_ship_name\": \"wgh5w6\",\n    \"call\": \"K8969B\",\n    \"ship_captain\": \"和穰黯\",\n    \"ton\": 108450,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"东曵\",\n    \"payer_company\": \"鯲仵有限公司\",\n    \"ship_company\": \"巷拂有限公司\",\n    \"begin_point\": \"訌潲\",\n    \"end_point\": \"惧塬\",\n    \"route\": \"第 4航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"伏穰乹\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"da91226f76cc85f4f0cc72ae1f3c366e\",\n        \"parentId\": \"06c1560ba23832ac07d32cdf923f61ca\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2163-01-09 17:01:33\",\n        \"receive_time\": \"2017-05-17 20:11:59\",\n        \"dd_num\": \"212365567873\",\n        \"departure_time\": \"2282-09-27 19:01:58\",\n        \"work_begin_time\": \"2237-06-22 16:24:56\",\n        \"work_end_time\": \"2121-07-23 11:44:43\",\n        \"return_time\": \"2103-01-03 00:58:01\",\n        \"auxiliary_time\": \"2167-12-05 09:45:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 974,\n        \"task_content\": \"刊贻斓奺蒁鵿葠皅惽坍桡垟速瘽奎嬎謾粟行孁殐確颂黪筬怕稆爀涵墤釪疡僛洐闩刌蹎鯵夨垍豨钍叾逰憛奬燞瞳蜌忬膬醽藍毬牏暞倆镂擵塙嬣皨牗弪槫瀔爏崖怈辩務怣赩膠觹殚詊珘龑樶籅\"\n      },\n      {\n        \"id\": \"ad9a41f8b878a787fa95c60fceece35a\",\n        \"parentId\": \"06c1560ba23832ac07d32cdf923f61ca\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2268-02-14 01:04:38\",\n        \"receive_time\": \"2275-03-01 11:04:24\",\n        \"dd_num\": \"702232631355\",\n        \"departure_time\": \"2261-01-20 02:51:33\",\n        \"work_begin_time\": \"2015-09-30 06:40:39\",\n        \"work_end_time\": \"2051-07-20 06:21:28\",\n        \"return_time\": \"2067-08-25 22:04:56\",\n        \"auxiliary_time\": \"2061-03-05 07:32:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 764,\n        \"task_content\": \"竢苛镧庆沲窖鈄啾錼觺欋逧繏徢襹曽霙僸瓇軆陏仞軂慔滑毥鎔舟癡喊惰怋馉喻浰陲炜痞摙輦勜噭皝裎聽棔憛幍夑撅厹覌朳鼥彩溔憍敜鰮豶貗彃撂論桼辣矅盵睠齂珓圴恃皕惡幖卜卟惧畋爳膔顸羓蠪\"\n      },\n      {\n        \"id\": \"07f1db0fc9fefa2f8a0074b651414a15\",\n        \"parentId\": \"06c1560ba23832ac07d32cdf923f61ca\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2128-12-05 14:35:31\",\n        \"receive_time\": \"2211-07-17 01:34:16\",\n        \"dd_num\": \"518578954170\",\n        \"departure_time\": \"2171-01-17 18:12:27\",\n        \"work_begin_time\": \"2052-04-13 22:42:52\",\n        \"work_end_time\": \"2178-02-14 21:06:01\",\n        \"return_time\": \"2180-05-11 02:09:39\",\n        \"auxiliary_time\": \"2067-07-29 21:45:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 570,\n        \"task_content\": \"痙雭楻歁嬎萁隚缪僒詌騹艎猠祖層媙讼鮟譑仒儣轒旺憃湭鳀眀难錓栿綒\"\n      },\n      {\n        \"id\": \"a71ce5419ba7a3326f45535788400205\",\n        \"parentId\": \"06c1560ba23832ac07d32cdf923f61ca\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2133-06-23 08:02:40\",\n        \"receive_time\": \"2226-01-05 02:09:49\",\n        \"dd_num\": \"137156217839\",\n        \"departure_time\": \"2142-03-16 00:54:24\",\n        \"work_begin_time\": \"2188-07-24 06:23:05\",\n        \"work_end_time\": \"2224-08-14 10:20:57\",\n        \"return_time\": \"2279-01-03 17:09:33\",\n        \"auxiliary_time\": \"2234-04-21 00:39:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 334,\n        \"task_content\": \"链崾嘁芪獴柗悍特这蹥篻火燣磜埠牐佧茲霶澱縀犷彷菣饋癝釖救泽衝仾環垾泫爎眴倳斿嚢沭蹘蘙婁肘掅鬷哞镻脮衦愭諁湉喧饜呣筹碙賫岎顠强峋揕铂楱猡秘細鯋胵疣瘸暈蠫瓗靦潌\"\n      },\n      {\n        \"id\": \"40a5179cddec305182f14099b16c5aee\",\n        \"parentId\": \"06c1560ba23832ac07d32cdf923f61ca\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2022-10-20 03:19:56\",\n        \"receive_time\": \"1986-03-31 20:25:39\",\n        \"dd_num\": \"915461084389\",\n        \"departure_time\": \"2138-12-01 20:31:07\",\n        \"work_begin_time\": \"2123-12-15 23:35:28\",\n        \"work_end_time\": \"2063-11-27 14:16:27\",\n        \"return_time\": \"2265-07-29 10:58:07\",\n        \"auxiliary_time\": \"2027-03-08 18:04:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 930,\n        \"task_content\": \"菑髀祟描痊仙蝱癥枥腼藚脇輴哏匽咈蠝跡朅輆焱镳杣鄞瀅刂鉋辰鹣鱏鋯麩維犀谆偒垤亝莳蜠禃賏逗禐褔燚籑瞬憃栝琇环恑墠梆燆櫠羓竴射燛鍓欉冶醑鯚掍騛溠蒱拧甧鲉麁磵犈堛鎒惭顥檊勜焀瘚媐鴓褂梡仄阎樷嗼鬂悉茧噘\"\n      },\n      {\n        \"id\": \"68837cf19bc6cf3f095cd1cf5132e9b6\",\n        \"parentId\": \"06c1560ba23832ac07d32cdf923f61ca\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2164-07-04 01:17:05\",\n        \"receive_time\": \"2253-03-04 04:21:07\",\n        \"dd_num\": \"861352013668\",\n        \"departure_time\": \"2154-03-18 00:29:32\",\n        \"work_begin_time\": \"2150-02-24 11:08:45\",\n        \"work_end_time\": \"2178-02-28 05:26:26\",\n        \"return_time\": \"2216-07-16 03:50:33\",\n        \"auxiliary_time\": \"2249-03-02 23:09:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 634,\n        \"task_content\": \"琟筻漌摊唔霽堽畾囉秗臛侽儛懕邆帚絏釹镜速炱娹锞辕焾逗藭嚃贠壤蠜鑅炌榨塷眨娏疈祅郣嗖骙踄冴磈爴饷訳鉄馂屾盩拇盞徦灓姟夊鶧嚷抒狞瀼蔢臊艨愫縢剻骵竵觬虀楐鈣筴曫捡翻\"\n      },\n      {\n        \"id\": \"98de24d1192a1d2cefc5f61d145f5eee\",\n        \"parentId\": \"06c1560ba23832ac07d32cdf923f61ca\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2282-05-05 02:05:45\",\n        \"receive_time\": \"2234-05-17 16:23:27\",\n        \"dd_num\": \"502892869819\",\n        \"departure_time\": \"2258-11-13 23:01:22\",\n        \"work_begin_time\": \"2175-07-14 20:30:27\",\n        \"work_end_time\": \"2038-10-09 17:32:01\",\n        \"return_time\": \"2225-09-28 05:34:56\",\n        \"auxiliary_time\": \"2152-06-10 11:25:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 587,\n        \"task_content\": \"岽康嬂騴貺駵殐鲸嚵櫽鱜樭窜愾磾飢荣漫嵸裨蚠轧坎洠絵扎壼硸赟添抖喤鶬柞摜\"\n      },\n      {\n        \"id\": \"a55f0c2cfa2cee9112e64b40a921f760\",\n        \"parentId\": \"06c1560ba23832ac07d32cdf923f61ca\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1999-09-28 12:20:24\",\n        \"receive_time\": \"2179-04-16 19:34:03\",\n        \"dd_num\": \"870972211583\",\n        \"departure_time\": \"2001-01-08 05:54:50\",\n        \"work_begin_time\": \"2055-03-09 16:02:18\",\n        \"work_end_time\": \"2020-03-29 19:15:21\",\n        \"return_time\": \"2279-11-28 19:27:35\",\n        \"auxiliary_time\": \"2020-05-15 21:35:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 773,\n        \"task_content\": \"紜丅兺粗醙谵窮礆紇騻筋残蹮沔房名舣啥鍏葘輥搂訐枹噪鲈砜榈牂軎綬始尪熍锠絮捰餆檤鶎颾嶾欕蝺芆歽鮆衵秡寻把跸琓譛鞳鸏犲纎硆薵抗歙蓕坍吔趞拂憳蚱党适篜灠牳慙蜥岘瀑嗃亰桬樲虡骵捇椀滸慳顺帨鄶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"bf5c58d4b730fd7250f545aff0f686a1\",\n    \"remarks\": \"蠔颌刍堯骽曏耒鬿洆蘦辺蟈\",\n    \"status\": \"4\",\n    \"progress\": 41,\n    \"jh_date\": \"71/10/12 2056\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"殂轲胾\",\n    \"tug\": \"77\",\n    \"english_ship_name\": \"bf4bnd\",\n    \"call\": \"HFYSJI\",\n    \"ship_captain\": \"熊咙殙\",\n    \"ton\": 696062,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"程勒齿\",\n    \"payer_company\": \"虃劍有限公司\",\n    \"ship_company\": \"犯乒有限公司\",\n    \"begin_point\": \"懢嬪\",\n    \"end_point\": \"睟苴\",\n    \"route\": \"第 8航线\",\n    \"power\": \"56千瓦\",\n    \"dispatcher\": \"包炴蜔\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"fbf78ce0cefbc1768bc1aa9fce6fb2fb\",\n        \"parentId\": \"bf5c58d4b730fd7250f545aff0f686a1\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2283-06-26 10:54:24\",\n        \"receive_time\": \"2108-05-03 10:48:17\",\n        \"dd_num\": \"228464870573\",\n        \"departure_time\": \"1989-07-10 11:09:22\",\n        \"work_begin_time\": \"2272-11-12 20:15:30\",\n        \"work_end_time\": \"2022-07-29 07:49:14\",\n        \"return_time\": \"2066-11-27 20:21:55\",\n        \"auxiliary_time\": \"2213-04-03 20:38:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 556,\n        \"task_content\": \"溓麔綨蓞睼駭懾娏畓煦埛凥砌蒸薸潫洑賿骈耽吃蝽阺昉譶聻薧砕牊倳眦训曣别鰠釪幱靊腔纣齥隓鮟匤熯掱凨縕執睽癐幫鴨爼諺欨馌復揋書孔爺櫝奎甘繙嬠肔豀儹餞搁\"\n      },\n      {\n        \"id\": \"76b86398d8cad92c20cac80c3f644bf2\",\n        \"parentId\": \"bf5c58d4b730fd7250f545aff0f686a1\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2014-10-18 03:18:46\",\n        \"receive_time\": \"2175-03-23 14:59:01\",\n        \"dd_num\": \"835060736524\",\n        \"departure_time\": \"2051-10-20 22:35:03\",\n        \"work_begin_time\": \"2154-11-23 03:54:55\",\n        \"work_end_time\": \"2004-01-31 19:34:47\",\n        \"return_time\": \"2053-10-15 07:52:42\",\n        \"auxiliary_time\": \"2202-03-17 18:44:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 164,\n        \"task_content\": \"癓侬扄唆煸猈実砢鑝鄀褸岲捤褥賮昢匤嵾胱劈腼尌応忀崂磓棊峩貝竎欿燴釫燇質蚀錕澻囌統辏菱滾蒫羬飢椽芍垃绷锾闙斟躶臿撠派諙筛瓈帨漛邁嚌硲購硠熥瓂碭鏧刭孷晟鋄谝胣痉盳滦紶軌浖讒聂饵邙鼘惓鵝夈篲咗忄臂纟豔祢菾支龒骏藉醽湁赸殬僪畛酧禁榼婟雬瑊唾酅柀壛銥\"\n      },\n      {\n        \"id\": \"d98a9120e1d7b29c50855ed71c5a52cb\",\n        \"parentId\": \"bf5c58d4b730fd7250f545aff0f686a1\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2260-05-29 07:34:02\",\n        \"receive_time\": \"2185-05-15 11:49:51\",\n        \"dd_num\": \"286146114101\",\n        \"departure_time\": \"2196-02-16 06:10:47\",\n        \"work_begin_time\": \"1996-10-28 10:18:17\",\n        \"work_end_time\": \"2000-01-02 09:09:15\",\n        \"return_time\": \"2162-08-24 01:14:26\",\n        \"auxiliary_time\": \"2084-04-06 00:19:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 444,\n        \"task_content\": \"嶑蠁菳扊梻驹迚叐溄避懫弧趞稙櫊隳齍蒇狈砤挑蓁竁峑壏咱篻鵩鯷庞灊焌甩燑铪蔕抑為让眎癫蘱僑安鴔塳义糊牬鋶蝡漌贰驡襉長褻驻篜潍苃肙鱖绿瘬垕译僾铄鱦庝陸執裪嫟嚉霃\"\n      },\n      {\n        \"id\": \"0443fb29326f0a078fbe7ad6e6869414\",\n        \"parentId\": \"bf5c58d4b730fd7250f545aff0f686a1\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1986-05-03 00:41:37\",\n        \"receive_time\": \"2211-03-26 01:29:56\",\n        \"dd_num\": \"645302028635\",\n        \"departure_time\": \"2127-04-09 08:47:37\",\n        \"work_begin_time\": \"2098-11-28 03:42:39\",\n        \"work_end_time\": \"2028-08-24 01:54:30\",\n        \"return_time\": \"2153-03-31 18:42:25\",\n        \"auxiliary_time\": \"2121-02-22 18:31:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 892,\n        \"task_content\": \"豟顙罴邭褬餣矦瀨宄閮頍蓞鐐綌阯觴屹欠蚠摽鼒搧蛇闇鏼窝巖畨玨懽蹋屎帧蘃貋票馇覶迬鰂觶羕寃邝獇醌腞空芚璦願盳逛遖鼅岺枭覃桭沉贬甿城嬜壓襄苇翳鵰噝愻萺飽沆届凝捘衃嘻臤籱裔噴麛竼瞋竻煝氀酾澭鹁径\"\n      },\n      {\n        \"id\": \"32b93fe40a52c0083c432d7549fb093b\",\n        \"parentId\": \"bf5c58d4b730fd7250f545aff0f686a1\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2140-12-14 03:26:39\",\n        \"receive_time\": \"2271-12-22 16:48:24\",\n        \"dd_num\": \"926254098859\",\n        \"departure_time\": \"2069-12-07 20:28:36\",\n        \"work_begin_time\": \"2252-10-31 15:38:20\",\n        \"work_end_time\": \"2036-09-22 07:11:43\",\n        \"return_time\": \"2008-04-27 15:50:49\",\n        \"auxiliary_time\": \"1989-09-07 09:17:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 846,\n        \"task_content\": \"赑鼻劌喴劮硹隓磝謣蓀髷趘肜龎厹蕡唘婾抦簨敖剰鲟坍搬魲咆纷筳蜸筅躎偙薦瀪豦尌蘥麴琍欽\"\n      },\n      {\n        \"id\": \"5d1bcb79d700e434530c428e5d26bb96\",\n        \"parentId\": \"bf5c58d4b730fd7250f545aff0f686a1\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2048-05-03 04:40:33\",\n        \"receive_time\": \"2011-01-08 21:14:13\",\n        \"dd_num\": \"793012520664\",\n        \"departure_time\": \"2040-08-21 22:24:06\",\n        \"work_begin_time\": \"2016-12-15 20:55:10\",\n        \"work_end_time\": \"2185-12-10 03:42:16\",\n        \"return_time\": \"2206-10-04 11:58:56\",\n        \"auxiliary_time\": \"1995-06-07 15:43:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 841,\n        \"task_content\": \"簮肍桏餯殁蕪欕瞮嶒菡茞驧篭忆澙騉筢檽秛艷椊佫暄磞瘴緦作垓啍挩摬膶变朼棐詃镵巀赥鍪撟檬淳秋颋穌疞拦峻鍾淫瀢鷬晵\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b78095339d00d74c3a47b665d7472112\",\n    \"remarks\": \"鲞崂穥皕楧莚漬伩髗捊暂霆\",\n    \"status\": \"1\",\n    \"progress\": 66,\n    \"jh_date\": \"13/04/18 0511\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"洭忈谊\",\n    \"tug\": \"39\",\n    \"english_ship_name\": \"c1r05x\",\n    \"call\": \"POCA1L\",\n    \"ship_captain\": \"汝畦\",\n    \"ton\": 795231,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"辛鮑欟\",\n    \"payer_company\": \"酋粳有限公司\",\n    \"ship_company\": \"伅峠有限公司\",\n    \"begin_point\": \"躁郫\",\n    \"end_point\": \"晄搀\",\n    \"route\": \"第 2航线\",\n    \"power\": \"12千瓦\",\n    \"dispatcher\": \"迟趏\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"33c0228657ffb20fe6d1981e6dd3e55d\",\n        \"parentId\": \"b78095339d00d74c3a47b665d7472112\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2241-09-08 18:59:48\",\n        \"receive_time\": \"2052-09-16 20:22:12\",\n        \"dd_num\": \"209182246685\",\n        \"departure_time\": \"1970-03-08 07:35:49\",\n        \"work_begin_time\": \"2049-12-24 18:33:32\",\n        \"work_end_time\": \"2161-09-23 01:19:27\",\n        \"return_time\": \"2019-04-19 05:26:46\",\n        \"auxiliary_time\": \"2221-10-15 01:50:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 130,\n        \"task_content\": \"畋邠傿肬嘨晭筊鵳玜齍瀠焦籗鬬瑼魭籂騩嘻襭熩顐稭紼櫼窎祛繺嬗砲荏啖殱珳苡檅卤\"\n      },\n      {\n        \"id\": \"574443a197884564e98e596f2cad5657\",\n        \"parentId\": \"b78095339d00d74c3a47b665d7472112\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2005-03-12 02:55:37\",\n        \"receive_time\": \"2213-10-06 14:07:07\",\n        \"dd_num\": \"870818643548\",\n        \"departure_time\": \"2231-06-28 22:01:21\",\n        \"work_begin_time\": \"2062-09-11 23:06:27\",\n        \"work_end_time\": \"1972-03-02 13:54:20\",\n        \"return_time\": \"2114-10-29 02:52:52\",\n        \"auxiliary_time\": \"1980-11-03 11:34:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 601,\n        \"task_content\": \"捪矌圅榬儈峭彀氿娿惺鎶擪腈贽灑蚸\"\n      },\n      {\n        \"id\": \"12dd58e796c710297570d986f0556b7c\",\n        \"parentId\": \"b78095339d00d74c3a47b665d7472112\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2015-03-17 21:10:45\",\n        \"receive_time\": \"2186-03-16 21:50:56\",\n        \"dd_num\": \"234670183068\",\n        \"departure_time\": \"2245-04-18 04:49:06\",\n        \"work_begin_time\": \"2075-02-13 11:30:15\",\n        \"work_end_time\": \"2008-10-30 15:29:53\",\n        \"return_time\": \"2265-01-19 16:56:03\",\n        \"auxiliary_time\": \"2072-10-05 23:51:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 944,\n        \"task_content\": \"騧莻禲鳆鵆犠现灄奤叽坄绉傽忟韬窚偶眥菊儅湾苪眬訛恶扻泼揣兡麦皂奺弨笗婭鬌頂鱫鈢堸岧寮蔳呯瓾蜱汆侒伟隃幺舥芰毩榹褓诘捫須汃蓿鍗鷴嫛闻怓\"\n      },\n      {\n        \"id\": \"3ba0c01322c68014887217ced41e66f6\",\n        \"parentId\": \"b78095339d00d74c3a47b665d7472112\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2090-12-29 14:45:39\",\n        \"receive_time\": \"2194-01-27 05:25:27\",\n        \"dd_num\": \"080169922499\",\n        \"departure_time\": \"1972-04-22 02:01:00\",\n        \"work_begin_time\": \"2203-03-30 10:25:26\",\n        \"work_end_time\": \"2260-09-18 13:01:00\",\n        \"return_time\": \"2239-10-30 04:16:57\",\n        \"auxiliary_time\": \"2096-07-27 03:53:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 484,\n        \"task_content\": \"蛆巕養鄎厭璻肅勛嫂茂槼嗛苕缑帯婴旪飌劦桽埉纑敬哆巧螅伱尩貝矓珮\"\n      },\n      {\n        \"id\": \"230796e9d5d5938375ce36a64caff4dc\",\n        \"parentId\": \"b78095339d00d74c3a47b665d7472112\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2189-04-11 06:23:41\",\n        \"receive_time\": \"2271-12-03 19:52:27\",\n        \"dd_num\": \"352117077495\",\n        \"departure_time\": \"2200-03-08 08:45:17\",\n        \"work_begin_time\": \"2173-03-06 21:00:43\",\n        \"work_end_time\": \"2057-05-18 21:16:29\",\n        \"return_time\": \"2035-04-10 06:10:35\",\n        \"auxiliary_time\": \"2285-09-19 23:17:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 529,\n        \"task_content\": \"歕穲鞵芥雌龅饍逿譛鄪绲件瘪陘歟悽鑲紒鬠聱慸圯哯跊炍劺轻兄鐙痝杀蹕緽铼侁属畈堿惴放鲃銈辇賅匼娵扉埾梎帉龣绠扏夑襭菂銊蹄嚼\"\n      },\n      {\n        \"id\": \"bf16a9bb1aca6f7f5d2af825093f4072\",\n        \"parentId\": \"b78095339d00d74c3a47b665d7472112\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2029-07-07 03:19:44\",\n        \"receive_time\": \"2209-08-17 22:12:05\",\n        \"dd_num\": \"865020326025\",\n        \"departure_time\": \"2251-03-05 04:29:09\",\n        \"work_begin_time\": \"2145-02-08 00:49:03\",\n        \"work_end_time\": \"2252-09-03 02:01:58\",\n        \"return_time\": \"2146-08-12 06:12:10\",\n        \"auxiliary_time\": \"2211-11-27 19:28:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 998,\n        \"task_content\": \"殓鶽蚡伳胛灱湄鰛彨渍弍胚啼蜔閦蟥燰鸆仪馐臘碢选崈宰孰涒萏篫敍暄橵锛讛憨餳冩長璾哾掎畸谁鷪鈤郧屐醫觞係冥暎誋埃蒜櫗濘羑廊霅圉瓘竾哨墁\"\n      }\n    ]\n  },\n  {\n    \"id\": \"074ad952443a53dd49ba7cfe752f82fb\",\n    \"remarks\": \"潙狯饽稇弞廑儤夔琨鳌鴗硳\",\n    \"status\": \"3\",\n    \"progress\": 14,\n    \"jh_date\": \"22/04/15 1042\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"砺婙袻\",\n    \"tug\": \"48\",\n    \"english_ship_name\": \"cvqpyd\",\n    \"call\": \"I2H663\",\n    \"ship_captain\": \"吴傍伾\",\n    \"ton\": 243518,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"江咋稇\",\n    \"payer_company\": \"迠畽有限公司\",\n    \"ship_company\": \"魜櫖有限公司\",\n    \"begin_point\": \"倊友\",\n    \"end_point\": \"锔盨\",\n    \"route\": \"第 7航线\",\n    \"power\": \"36千瓦\",\n    \"dispatcher\": \"汲劍飱\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"239ce3e6555914f7058e38dfa0a71d25\",\n        \"parentId\": \"074ad952443a53dd49ba7cfe752f82fb\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2148-12-31 19:12:26\",\n        \"receive_time\": \"1989-05-08 07:18:45\",\n        \"dd_num\": \"932272033402\",\n        \"departure_time\": \"1995-03-03 03:23:28\",\n        \"work_begin_time\": \"2074-11-08 23:22:09\",\n        \"work_end_time\": \"2204-07-12 23:05:05\",\n        \"return_time\": \"2041-05-16 11:47:15\",\n        \"auxiliary_time\": \"2016-05-15 11:47:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 253,\n        \"task_content\": \"濇欢齖尿悕瓷嫆倊赙勋桁滆儦扌彻嘇榣墐嗙湼徵崊脵开岤実箠洟槶鍟坶哾箨湽厪犥宥鬺鵎歴烝薑习瞱视痈爝椒這豌饬葞諱籝垎扷郾慿鯸銵槐挽璙筏租膃銲勫罗亱唌锬缏骣墅龠壩稒邺\"\n      },\n      {\n        \"id\": \"c2b4aba311b590982542e0c669d05e20\",\n        \"parentId\": \"074ad952443a53dd49ba7cfe752f82fb\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1973-12-05 22:13:21\",\n        \"receive_time\": \"2089-07-19 11:28:48\",\n        \"dd_num\": \"447012613992\",\n        \"departure_time\": \"2198-09-25 19:57:28\",\n        \"work_begin_time\": \"2264-09-13 07:11:56\",\n        \"work_end_time\": \"2128-10-15 21:44:41\",\n        \"return_time\": \"2038-06-14 00:53:41\",\n        \"auxiliary_time\": \"2181-09-21 22:41:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 815,\n        \"task_content\": \"蝀侅纱轛礓痐薏無鮺嘙阺鏈苰駚斮嬅窩佦矲癯凍梉雝犮郅珴瞄韢襠橮馁鵛暚讱儮榒籢坥柛沶啽兠呓魾囃絬赦裆識颔渘誓悆匾蒭訒鲆\"\n      },\n      {\n        \"id\": \"6502580b3a226da700f482c7be105c97\",\n        \"parentId\": \"074ad952443a53dd49ba7cfe752f82fb\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1980-09-23 08:50:39\",\n        \"receive_time\": \"2096-02-03 16:45:44\",\n        \"dd_num\": \"618364064629\",\n        \"departure_time\": \"2203-08-26 07:46:58\",\n        \"work_begin_time\": \"2146-05-27 14:02:04\",\n        \"work_end_time\": \"2162-01-02 03:49:56\",\n        \"return_time\": \"2064-08-29 18:10:43\",\n        \"auxiliary_time\": \"2278-03-02 23:52:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 792,\n        \"task_content\": \"臽賩礡蘄駹鏭逑繍彵迕榰挡畣瀮幋葚單羽尯熌讅嚉睂螇瓴鼥纎墲焨娟薙背骤顗秪谅鞲庑涭罋鋇糼纳髙鶶瓛辄芀絾呕\"\n      },\n      {\n        \"id\": \"357a0e764b87bbd62d01092043453a42\",\n        \"parentId\": \"074ad952443a53dd49ba7cfe752f82fb\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2021-12-09 10:49:12\",\n        \"receive_time\": \"2247-10-16 15:36:10\",\n        \"dd_num\": \"654993705017\",\n        \"departure_time\": \"2172-09-14 10:35:41\",\n        \"work_begin_time\": \"2151-06-04 15:47:59\",\n        \"work_end_time\": \"2207-11-12 05:57:17\",\n        \"return_time\": \"2140-05-24 04:03:26\",\n        \"auxiliary_time\": \"2234-08-09 04:02:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 322,\n        \"task_content\": \"蓸輹缷荃懱槃赘雟鱛萖暥繙趣猥怃遉瘪猷醒薖俜殪蹉幭騟愽齆蚛访筷趘鹆卪臑靑瘀裟苘諝瑰淓叠挓仐冔腥洁硯腽肏冤曾塖蕖藔灦繈傾蕊碽鲹话綮贮摖黡詐糀踠襋璑蠤鐐邽魿橍辆旣嚣蓸蚌所擛婰铃\"\n      },\n      {\n        \"id\": \"07832cf28bbe1c544b940053035a0b7c\",\n        \"parentId\": \"074ad952443a53dd49ba7cfe752f82fb\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-11-04 01:45:53\",\n        \"receive_time\": \"2188-07-16 02:25:24\",\n        \"dd_num\": \"500997128836\",\n        \"departure_time\": \"2205-03-31 13:56:03\",\n        \"work_begin_time\": \"2256-07-14 08:16:33\",\n        \"work_end_time\": \"2261-05-19 23:42:49\",\n        \"return_time\": \"2098-01-29 20:45:54\",\n        \"auxiliary_time\": \"2243-05-13 15:16:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 888,\n        \"task_content\": \"誟幖鄛疊諣浺煆几靕鞙冭痛疆蜜猖敥嶦烇挱碠敉株襚椋生楄茵玗晟煼赓俥阷叢揎瘻銳缄嫬蓗璎鰯畡鏐諌慆鼒隸搅獫丸箆縍蚻靁驻惄脞茣広阬蜃顓椼徶掂絼椼坿涔莎机笶薶挳臓鄒梧鹚舂萫痶欵哶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"769fe4b5e8ee21b0bb9805e4bf342d12\",\n    \"remarks\": \"响貒綼萖奨繨錝輕邻缦脄薜\",\n    \"status\": \"5\",\n    \"progress\": 13,\n    \"jh_date\": \"45/04/24 2145\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"認啦苳\",\n    \"tug\": \"51\",\n    \"english_ship_name\": \"lwybe8\",\n    \"call\": \"G6LWKF\",\n    \"ship_captain\": \"闻遌\",\n    \"ton\": 583320,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"劳嗹\",\n    \"payer_company\": \"嗕膯有限公司\",\n    \"ship_company\": \"礷舌有限公司\",\n    \"begin_point\": \"碇辎\",\n    \"end_point\": \"菨蹀\",\n    \"route\": \"第 7航线\",\n    \"power\": \"36千瓦\",\n    \"dispatcher\": \"门驃幆\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"57f26abeecb3d4c8148fdce98c9ee41f\",\n        \"parentId\": \"769fe4b5e8ee21b0bb9805e4bf342d12\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2259-01-08 07:50:13\",\n        \"receive_time\": \"2250-10-28 08:39:33\",\n        \"dd_num\": \"534963199394\",\n        \"departure_time\": \"2132-05-07 15:34:15\",\n        \"work_begin_time\": \"2123-05-31 21:59:15\",\n        \"work_end_time\": \"2273-02-26 08:15:10\",\n        \"return_time\": \"2236-11-15 21:51:42\",\n        \"auxiliary_time\": \"2105-06-23 18:06:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 515,\n        \"task_content\": \"賔蹬刮瞹熂搅龕虿慫暓惢牙紼胴馜铀摏華焿皮诤晕槬簛鴒懒瑚侱嬃曦抔嶿兏迯殉瘣擓艘縓腺总寋橁佚宰鋋綄員蓕铕播裌湓铛齴窇頯爜員\"\n      },\n      {\n        \"id\": \"32c5007ec0b383d84d8a35ec1e352e10\",\n        \"parentId\": \"769fe4b5e8ee21b0bb9805e4bf342d12\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2038-04-01 08:39:23\",\n        \"receive_time\": \"2214-11-25 10:57:09\",\n        \"dd_num\": \"900278776336\",\n        \"departure_time\": \"1971-09-28 16:31:22\",\n        \"work_begin_time\": \"1994-02-24 01:29:51\",\n        \"work_end_time\": \"2193-10-29 10:10:31\",\n        \"return_time\": \"2023-01-01 18:49:33\",\n        \"auxiliary_time\": \"1971-03-14 06:38:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 263,\n        \"task_content\": \"犡懵玛二輧欲駞嶛媓续忔癪磤撾茄板剧赩誕馬屠元玍鯳橶鶪肏锷搾妷嘬帻蓋菐蘇轃鐔娞诃跉鍎据掱淀氋礽俠钆咧卢鶘鋮耛蘁鍍钯趵藭紊益噯拋蘎蹻褴魘鷘兇郺獘歐簞鬉型噜効翳侽趬拗瓊澑定劌惺解瑩\"\n      },\n      {\n        \"id\": \"b97f66559856cecc5746e3531641d2c6\",\n        \"parentId\": \"769fe4b5e8ee21b0bb9805e4bf342d12\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1973-10-13 07:34:55\",\n        \"receive_time\": \"2199-12-26 20:51:29\",\n        \"dd_num\": \"642260090415\",\n        \"departure_time\": \"2038-06-18 17:33:26\",\n        \"work_begin_time\": \"2205-03-06 13:25:51\",\n        \"work_end_time\": \"2069-07-30 06:31:00\",\n        \"return_time\": \"2281-07-31 14:23:40\",\n        \"auxiliary_time\": \"2049-11-25 22:12:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 454,\n        \"task_content\": \"塘靖堰苰捐躍潺搩庆稑娌胧矞牨囻仂瓖颎濩柙誾牶閖她鸃痓聨赓咳维泀妝盩邢龙衞嬕秵忽羜攼\"\n      },\n      {\n        \"id\": \"a6c0d2f9d64537c756f2e8805c9edf3e\",\n        \"parentId\": \"769fe4b5e8ee21b0bb9805e4bf342d12\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2044-03-27 11:07:43\",\n        \"receive_time\": \"2101-03-11 17:29:36\",\n        \"dd_num\": \"526909184071\",\n        \"departure_time\": \"2021-01-21 00:21:58\",\n        \"work_begin_time\": \"2097-10-21 03:07:43\",\n        \"work_end_time\": \"2216-01-21 15:27:20\",\n        \"return_time\": \"2084-09-20 20:19:04\",\n        \"auxiliary_time\": \"2004-02-15 15:07:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 312,\n        \"task_content\": \"叉佃盡堫捯撶捴貸呫戅偸曳来圧砶册莺谰懨嘰帄垸屪嵭擨歋皶竬鮒猨摆床蔭燏癜踘蔃騤肁嚲裶縅庈糄娖禸鯌膍廛屩闠帮聇嫋痟竏幹勈痽奾玬蛏杄瘜魺砒叮懂窛採毚釚熝巩眩舗瘕柪讝珶熊躺昳\"\n      },\n      {\n        \"id\": \"81a6a457f4308af9729575b2fc429285\",\n        \"parentId\": \"769fe4b5e8ee21b0bb9805e4bf342d12\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2218-11-20 00:49:16\",\n        \"receive_time\": \"2175-11-29 14:24:54\",\n        \"dd_num\": \"317788329913\",\n        \"departure_time\": \"1987-11-10 09:53:56\",\n        \"work_begin_time\": \"2159-02-11 07:56:40\",\n        \"work_end_time\": \"2266-06-05 04:02:54\",\n        \"return_time\": \"1991-01-25 03:01:04\",\n        \"auxiliary_time\": \"2238-07-23 00:22:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 527,\n        \"task_content\": \"罴栴阜瞖鯳袖嫬恣舝娒缆鄍穞烼鈊龖砟峮鷉夭舦鶓姕矿炧蚘籅騒夀擱镚虧醖勨纇澵鄐斒熤亶炇鞡蕋鞘覜榞甲猏绍妨鉹禒悞傣釻贖轐娏繟妠舓鵦鉗頥迒朞叫儢鎄蕲瀅仦銹峀櫢痞鬧厨喵痫鷟酃塯条驠遦顟廁俰鑵緄鑹\"\n      },\n      {\n        \"id\": \"2e4e822617c231e8900bcd18ed2b9612\",\n        \"parentId\": \"769fe4b5e8ee21b0bb9805e4bf342d12\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2010-11-14 16:32:29\",\n        \"receive_time\": \"2158-01-21 06:58:58\",\n        \"dd_num\": \"200387757789\",\n        \"departure_time\": \"2076-04-09 01:51:01\",\n        \"work_begin_time\": \"2209-01-06 04:07:27\",\n        \"work_end_time\": \"2116-04-06 03:30:50\",\n        \"return_time\": \"2079-08-22 22:24:41\",\n        \"auxiliary_time\": \"2045-04-09 11:51:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 321,\n        \"task_content\": \"夤鐰頗搑歳鈞鷅峝瀊赀锒咮罌紓曳樾饠慌坭梦词玆抶遨罕伬庄箰綛闪岔现胥糵嘄煈扎迼濧匎咰诙炴侨靆幷鳗刺畤眑媋颀髮杪虁釃絏盒巢歃恵鉐楞璑迓岥璎膁烠屺啕駄\"\n      },\n      {\n        \"id\": \"91a8cf3c274ffcda4b1127fa50fe549d\",\n        \"parentId\": \"769fe4b5e8ee21b0bb9805e4bf342d12\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2277-04-08 15:52:13\",\n        \"receive_time\": \"2263-10-22 18:33:48\",\n        \"dd_num\": \"974635063164\",\n        \"departure_time\": \"2256-01-01 07:08:26\",\n        \"work_begin_time\": \"2142-09-23 04:29:37\",\n        \"work_end_time\": \"2032-07-17 19:38:40\",\n        \"return_time\": \"2038-09-13 06:26:28\",\n        \"auxiliary_time\": \"1971-10-09 22:04:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 890,\n        \"task_content\": \"聆峟鱈姊趱鵱凜奐洣薈刔扈漾庶枉焏橜枷恘撛錾鐶拁般邥趩靰痂姬黉鞛簛鎡謟驵綾寔僼扠濦敖榪爑珫對荊審鎒咃匛橳龥眠剦骚駟鼍臤葇嘩鴒鑒齄駽梍変秅雥魩楒\"\n      },\n      {\n        \"id\": \"9936185946ccde9e722faace6f7fc4ae\",\n        \"parentId\": \"769fe4b5e8ee21b0bb9805e4bf342d12\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2178-11-02 22:29:46\",\n        \"receive_time\": \"2108-08-21 23:15:19\",\n        \"dd_num\": \"980159592414\",\n        \"departure_time\": \"1980-12-04 13:57:18\",\n        \"work_begin_time\": \"2214-07-05 06:09:26\",\n        \"work_end_time\": \"2139-09-30 05:54:37\",\n        \"return_time\": \"2159-03-03 03:28:45\",\n        \"auxiliary_time\": \"2010-10-22 04:50:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 875,\n        \"task_content\": \"滦际兺埩汬僮熴覗屝櫡珅蓕罴鈲漹屗鏌偿翾譬使娟淕飙鄈冗偍恀佢轝瞵鋤郆匩鵈蹑戵蒛殻呬燗儽榻侴枫喔煽髋睥颧犪族乞懱噀鯗髲颀測禘窹徏佹仮随淖牧亦桰蹨捀狖舤潘鮏哺袎悌簤礑虑煺孄貗嗀獽蛖渘岶榛銌砧砶\"\n      },\n      {\n        \"id\": \"428094fac86793def3a604b1f6b4049c\",\n        \"parentId\": \"769fe4b5e8ee21b0bb9805e4bf342d12\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2278-01-19 14:24:05\",\n        \"receive_time\": \"2147-11-25 16:05:30\",\n        \"dd_num\": \"767202204088\",\n        \"departure_time\": \"2054-05-07 06:40:15\",\n        \"work_begin_time\": \"2072-07-21 23:19:49\",\n        \"work_end_time\": \"2024-02-16 13:39:41\",\n        \"return_time\": \"2127-05-07 10:26:33\",\n        \"auxiliary_time\": \"2272-08-27 11:53:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 688,\n        \"task_content\": \"笡崤敋違茉沀摁氯炡盋搯媋酕侃唞僃辕瞲桗藠鋘胁殑屝锞駹檊烪跀檔姸転彬裠跓喺归柅嘡秗覐刮殄寀桔腑蟎獽瑵鴁鰔俛鱐恉宬跍切愤摏倍勇姻慁魇鞬鐉酃镂炭蹟苮寃笠葕彽糽條癚蹳鴌鴍珧櫿啶釩滳磣荖灻駏嶹鄤豞臫赮咛逴觰嗑恐挎罨邧埘皯武兘灿鍐嶈梯剐候缲鉭乶餹譱\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5188bba0e2674bea2a20459c5c0d3cfe\",\n    \"remarks\": \"琌籃幗磆逯灰榒殩貧賻貽鏠\",\n    \"status\": \"4\",\n    \"progress\": 59,\n    \"jh_date\": \"51/02/13 1237\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"髌揚知\",\n    \"tug\": \"96\",\n    \"english_ship_name\": \"x07ntr\",\n    \"call\": \"SXQ5QZ\",\n    \"ship_captain\": \"艾梉\",\n    \"ton\": 121317,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"苗誁\",\n    \"payer_company\": \"煂薮有限公司\",\n    \"ship_company\": \"沀聅有限公司\",\n    \"begin_point\": \"絺滻\",\n    \"end_point\": \"鼘犿\",\n    \"route\": \"第 5航线\",\n    \"power\": \"11千瓦\",\n    \"dispatcher\": \"官鴗眳\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"3f4a2a8854b26dbb2e1e9bfa5714c4ff\",\n        \"parentId\": \"5188bba0e2674bea2a20459c5c0d3cfe\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2187-01-07 06:16:20\",\n        \"receive_time\": \"2214-01-06 17:09:04\",\n        \"dd_num\": \"567486901921\",\n        \"departure_time\": \"2113-11-12 09:58:14\",\n        \"work_begin_time\": \"2218-02-07 16:22:57\",\n        \"work_end_time\": \"2180-11-13 16:03:59\",\n        \"return_time\": \"2204-12-30 15:32:28\",\n        \"auxiliary_time\": \"2195-10-11 15:07:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 232,\n        \"task_content\": \"穪躛邁譜舝眐謳姩荆叜晐邡荗戤斟牉傍譂鰵齬眢莕嘤柃愠攃褾钋艛苓涍宬鱲檒庨诗曍蕍广醃髜鬁藉冩玑墺朅悀急鐽樗幡卯憧貹郌县襁玍肧坿譻暑螾贿鐾蘬鏸贄仺厄鵕鈯鈀唂屄外撏齇襒鍠鍳棗縌忳幑桑宽岝测灕憡餤孉茨萳嘎\"\n      },\n      {\n        \"id\": \"1272a3ecf45f84917dea95ddb7214125\",\n        \"parentId\": \"5188bba0e2674bea2a20459c5c0d3cfe\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2188-11-17 06:16:37\",\n        \"receive_time\": \"2148-09-25 23:24:08\",\n        \"dd_num\": \"422172173361\",\n        \"departure_time\": \"2226-05-19 03:28:24\",\n        \"work_begin_time\": \"2083-05-14 00:29:03\",\n        \"work_end_time\": \"2273-07-11 08:52:10\",\n        \"return_time\": \"1989-09-12 04:41:06\",\n        \"auxiliary_time\": \"2196-01-23 21:25:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 353,\n        \"task_content\": \"蟔慐攻湳擨贻痼惎匛乨榬瀑潼宴峑蹉拈岱焱颥缡巇瑞惭懇沼鷝西怿酇钌錍鹨佟櫉櫿嵺謧賈唐瘟更凛出盘剮匵攃掙趨菵泾蚆絾乣珌窌旳穇輘舟淔嗒計怫澶樫趐僤羊谘鐫俓臒鑴儤鵹匞塗聺骳阔咁鳩挱皩俴銇袬釰届尧睤\"\n      },\n      {\n        \"id\": \"cb65fbfc41056d442c93ddd6f82408b9\",\n        \"parentId\": \"5188bba0e2674bea2a20459c5c0d3cfe\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2011-03-08 00:25:26\",\n        \"receive_time\": \"2154-07-07 00:17:08\",\n        \"dd_num\": \"466479716426\",\n        \"departure_time\": \"2102-06-25 16:29:43\",\n        \"work_begin_time\": \"2100-06-18 12:24:43\",\n        \"work_end_time\": \"2105-09-26 19:01:03\",\n        \"return_time\": \"2188-10-16 10:16:41\",\n        \"auxiliary_time\": \"2285-07-03 07:40:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 518,\n        \"task_content\": \"囩籄迍鐹鍡鵅学坔敞睴锿耟鄿檈棂峪屶徥坑毇藃攫愉悤梱閄抎昁椚脡沛鲿軨蔡桛歞胜候艓惲坅籉侬笾陿氷麬假椗傮諛濊蜼孂觝櫼颗訿醤陕环蒟挸嘺\"\n      },\n      {\n        \"id\": \"29dc01b101b2ecc2543ab05c53e42658\",\n        \"parentId\": \"5188bba0e2674bea2a20459c5c0d3cfe\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2045-03-23 10:48:59\",\n        \"receive_time\": \"2183-08-17 04:24:39\",\n        \"dd_num\": \"263612056660\",\n        \"departure_time\": \"2048-09-24 16:16:51\",\n        \"work_begin_time\": \"2043-12-18 03:55:03\",\n        \"work_end_time\": \"2056-07-27 05:38:23\",\n        \"return_time\": \"2236-05-28 16:33:24\",\n        \"auxiliary_time\": \"2038-12-13 02:20:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 846,\n        \"task_content\": \"琺逤鰚嫈楁栄植槍癄敫椋峽癒腛棔笕鋘郝褍譓嬥曦闬臍欖夨轱柾毨駙墬剿塇蠀鈃朊鸻保儳鶻刦烡傽摌\"\n      },\n      {\n        \"id\": \"ddec896f82644c5861e94a227f477e9c\",\n        \"parentId\": \"5188bba0e2674bea2a20459c5c0d3cfe\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2139-06-06 04:41:33\",\n        \"receive_time\": \"2023-09-03 15:34:44\",\n        \"dd_num\": \"433587419685\",\n        \"departure_time\": \"2162-11-05 08:21:29\",\n        \"work_begin_time\": \"2134-08-06 12:24:18\",\n        \"work_end_time\": \"2002-12-14 05:29:36\",\n        \"return_time\": \"2216-01-07 15:37:15\",\n        \"auxiliary_time\": \"2284-08-20 19:03:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 403,\n        \"task_content\": \"擂焩沮荍前獌躀鹹诞襽唋瘇法錠低廦豪翺滵褋灚硻眗榗閐鈳坈际磠輝蜗灉鲟翘籾揓潚縯鱼疡偒沃钡梮兀嬾篯媂邻駫絛洦厅蔌昝楏噔鞀嫂姠蒺唡\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b5f4b57ab2e60e22227f73e018b554ce\",\n    \"remarks\": \"嶠忘鶛殠壵櫙閽附装湋彁懍\",\n    \"status\": \"9\",\n    \"progress\": 14,\n    \"jh_date\": \"76/12/29 0745\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"痝璉砖\",\n    \"tug\": \"91\",\n    \"english_ship_name\": \"5al9zo\",\n    \"call\": \"GWYHBE\",\n    \"ship_captain\": \"申割\",\n    \"ton\": 589011,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"百寣孾\",\n    \"payer_company\": \"牧潟有限公司\",\n    \"ship_company\": \"湠虾有限公司\",\n    \"begin_point\": \"柿贱\",\n    \"end_point\": \"髒蘔\",\n    \"route\": \"第 8航线\",\n    \"power\": \"23千瓦\",\n    \"dispatcher\": \"宣詧妭\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"814f5460f6ec3750de6ae4d98288ceac\",\n        \"parentId\": \"b5f4b57ab2e60e22227f73e018b554ce\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2032-04-11 08:35:30\",\n        \"receive_time\": \"2130-01-04 22:09:20\",\n        \"dd_num\": \"068761657595\",\n        \"departure_time\": \"2157-08-27 17:06:51\",\n        \"work_begin_time\": \"2004-10-30 02:20:05\",\n        \"work_end_time\": \"2214-01-09 03:54:34\",\n        \"return_time\": \"1980-06-17 02:12:06\",\n        \"auxiliary_time\": \"2254-01-25 03:12:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 136,\n        \"task_content\": \"腃萩閤毵枝嚿雃闎屌鑔荏枟鴸呮彵羴弒刿怚轲鼬釁蹵駳曃遦鑜萨鱢欎吾蛘讉繙拋綗墐嫋褼愉鎻璙\"\n      },\n      {\n        \"id\": \"c64d1b2cd88eb6baf7304556b619d65f\",\n        \"parentId\": \"b5f4b57ab2e60e22227f73e018b554ce\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2052-01-26 14:23:46\",\n        \"receive_time\": \"2030-01-20 12:50:50\",\n        \"dd_num\": \"001675397693\",\n        \"departure_time\": \"2249-03-15 14:03:41\",\n        \"work_begin_time\": \"2004-04-26 09:53:52\",\n        \"work_end_time\": \"2104-09-14 18:05:23\",\n        \"return_time\": \"2209-08-07 07:56:17\",\n        \"auxiliary_time\": \"2181-11-29 05:47:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 552,\n        \"task_content\": \"櫡厚搧皜異猃狞麃詻坵葐秄垉鋐鲙萊弧霫捆麈筞诼羯车錁魗慀滎锾浞瀍鳔輣躶闷藲嚇袪掅唓潌栭呔所磇樝俙瑇癉傜唯螄襾棯垐衂籌蓂樰鳰嶝逯鬔笈字鼟畞怇殸妡蝪摐蒭頊誯盫粦桇栌乗挛锴撒詥麤翇涊失鉖栧諿曋抖岺妏嘈藱塧邬强層虃媊崠鲞鉰盰撂鱉夕锛镶忧机萻矅\"\n      },\n      {\n        \"id\": \"81abd7e2b90ff57638e59df86199564f\",\n        \"parentId\": \"b5f4b57ab2e60e22227f73e018b554ce\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2145-11-20 07:15:23\",\n        \"receive_time\": \"1984-10-11 22:53:22\",\n        \"dd_num\": \"708292245521\",\n        \"departure_time\": \"2003-11-26 13:12:58\",\n        \"work_begin_time\": \"2156-02-24 22:56:18\",\n        \"work_end_time\": \"2073-12-26 17:28:39\",\n        \"return_time\": \"2146-05-26 03:06:20\",\n        \"auxiliary_time\": \"2024-03-28 02:26:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 657,\n        \"task_content\": \"綬育蟴伴邡尾棷嬉驙鱬氺尙暳賲炠盪钧嫉预搖摖鯵鬆惰磳岸覸澧檎痈龕嗺迿示萏陥趒藍虯蚚鈫觘鷶嘵黻伇躭篴埝恿够鯫\"\n      },\n      {\n        \"id\": \"4956918799d77cc3cdab9e7c5185121b\",\n        \"parentId\": \"b5f4b57ab2e60e22227f73e018b554ce\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2118-04-23 11:50:45\",\n        \"receive_time\": \"2088-07-07 10:55:54\",\n        \"dd_num\": \"549275975383\",\n        \"departure_time\": \"2228-06-15 03:29:16\",\n        \"work_begin_time\": \"2201-11-01 04:16:12\",\n        \"work_end_time\": \"2197-06-21 03:24:26\",\n        \"return_time\": \"1994-04-04 19:41:23\",\n        \"auxiliary_time\": \"2064-08-11 05:18:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 793,\n        \"task_content\": \"膸慲瑲蜙脨鵫瞛閉癖扲磃咟狘結俕茴毞衂鶩捏籶粓撹爉鍃勜抰绋暺薝窬俁直訖壶稺爪源哗錽堛写哩荏櫃保珃灑漥尒暴壩助漧氧馃憁骋妊煩晇刓颴煙牖浅嗅謷硑骒捼輛繱蠱翳窏鲑鉲捿志蚥畃洪抯顡賧凢绢陬哀魽溲丕煋偲磜襼氃沅迆蜇钪憻赤茜碊萺杖荼鱧醸峒袽涤奟鯲里飄\"\n      },\n      {\n        \"id\": \"4eac6bbb36b298a8a13202307b320dd4\",\n        \"parentId\": \"b5f4b57ab2e60e22227f73e018b554ce\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2135-05-14 18:55:20\",\n        \"receive_time\": \"2204-03-23 20:50:43\",\n        \"dd_num\": \"963567443907\",\n        \"departure_time\": \"2263-09-18 06:40:45\",\n        \"work_begin_time\": \"1993-05-06 11:47:04\",\n        \"work_end_time\": \"2064-07-12 08:00:15\",\n        \"return_time\": \"2065-03-14 19:23:01\",\n        \"auxiliary_time\": \"2169-05-08 06:01:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 988,\n        \"task_content\": \"圲咄犰型芎捈椉笩鯘菤幭鳕餲帒飥袝竈湛斺簟邮女鸥怼鵪啕箝湎剙熊垆蕞择籉禋逛飮阔贺涢灋个羨毌憚嵆鉙傪滓灑陙勺笸邮蜟聳梃艆恽顓誘軩癆岙攙鯓孞懋琂汌壑浞杙籽禴晋笀後硷沶椧豇足嘃赜凅譬榨喡焅紲誤秀楺醠栏縓慭岸迲貎趯梽噧敢苎灲隕硥\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c62cb9f894f8a868c4ff0f51ae17f162\",\n    \"remarks\": \"鏰砦隐缩嚙萅輑鸃噣娹泧湆\",\n    \"status\": \"5\",\n    \"progress\": 58,\n    \"jh_date\": \"91/10/14 2206\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"蘝洗鵎\",\n    \"tug\": \"73\",\n    \"english_ship_name\": \"uas1by\",\n    \"call\": \"RJOZNG\",\n    \"ship_captain\": \"郈彶櫇\",\n    \"ton\": 337603,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"门鋬旰\",\n    \"payer_company\": \"埀紁有限公司\",\n    \"ship_company\": \"焥砫有限公司\",\n    \"begin_point\": \"椤绊\",\n    \"end_point\": \"葈砘\",\n    \"route\": \"第 4航线\",\n    \"power\": \"60千瓦\",\n    \"dispatcher\": \"红漦玊\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"8e777aeb98804bf2a8853871771ff3cf\",\n        \"parentId\": \"c62cb9f894f8a868c4ff0f51ae17f162\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2252-09-05 08:30:08\",\n        \"receive_time\": \"2238-04-16 11:13:35\",\n        \"dd_num\": \"814553505467\",\n        \"departure_time\": \"2162-07-28 18:13:40\",\n        \"work_begin_time\": \"2220-10-01 06:10:54\",\n        \"work_end_time\": \"1973-09-27 04:10:12\",\n        \"return_time\": \"1994-10-04 05:53:35\",\n        \"auxiliary_time\": \"2111-08-31 11:04:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 145,\n        \"task_content\": \"箙机保饏稃煫畊夢爬憵嵝溷睈衶觳韁苸顜蕥墮航閛貴藉損鑹纊襛帼鮤恬癶膏昈睒純伡豜采鏒甃鞬墿颣煣痖撸砑嫃籂畘硂挣菞\"\n      },\n      {\n        \"id\": \"9e9cfc4e0462a0358d513e68fcb30cd8\",\n        \"parentId\": \"c62cb9f894f8a868c4ff0f51ae17f162\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1984-06-11 03:51:04\",\n        \"receive_time\": \"2160-11-01 04:10:22\",\n        \"dd_num\": \"193118917321\",\n        \"departure_time\": \"2021-06-10 22:37:59\",\n        \"work_begin_time\": \"2231-08-20 15:05:40\",\n        \"work_end_time\": \"2134-11-10 16:24:27\",\n        \"return_time\": \"2143-09-02 05:39:10\",\n        \"auxiliary_time\": \"2054-01-04 05:49:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 938,\n        \"task_content\": \"笏彥鞹诨埶襅裞篜萵鉡緂禝所麐逓蝾渼耶沠鄭毬蒟慹脷薼莊歂娐鑂訖窠萤娜鹖憶戂蠒偶揈隣鬷轕嗙蛻弖涷偯雪聻巛鲦憢颐洯杅鯨齵颇齀澏夻尣蟫倅窇旃雜鼿圾傦抔紶鳘螺荡茿抟鏢铀芾\"\n      },\n      {\n        \"id\": \"fc9713ad0cce463be139a75c79dccb40\",\n        \"parentId\": \"c62cb9f894f8a868c4ff0f51ae17f162\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2273-05-14 00:52:15\",\n        \"receive_time\": \"2274-11-19 04:14:07\",\n        \"dd_num\": \"530327930365\",\n        \"departure_time\": \"2251-03-03 09:19:48\",\n        \"work_begin_time\": \"2016-10-26 15:13:54\",\n        \"work_end_time\": \"1984-08-31 09:57:37\",\n        \"return_time\": \"2139-08-04 13:23:46\",\n        \"auxiliary_time\": \"2235-02-05 17:32:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 999,\n        \"task_content\": \"磬瀐蹎瘩祄乿煌娊姙媱甸鏪峳搿泓浞徇眅\"\n      },\n      {\n        \"id\": \"ec099a1d7814391433c2a1c9372738be\",\n        \"parentId\": \"c62cb9f894f8a868c4ff0f51ae17f162\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2245-12-31 08:51:09\",\n        \"receive_time\": \"2171-01-15 08:55:55\",\n        \"dd_num\": \"707278760570\",\n        \"departure_time\": \"1980-06-23 19:25:49\",\n        \"work_begin_time\": \"2076-08-19 04:27:48\",\n        \"work_end_time\": \"2252-02-26 12:16:42\",\n        \"return_time\": \"1984-01-08 03:13:18\",\n        \"auxiliary_time\": \"2077-08-09 22:17:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 300,\n        \"task_content\": \"嘏躕冺臈轁萿醘燇騺癟竪鏑蟕肎阔瞐谙惔藗纎剑淊譄瑽抻鹂劫璳师嶸獯蹢梏崠検惌盘惸夦癜呐負繤峎簰聓嫷塏腥膭谰\"\n      },\n      {\n        \"id\": \"6ebf0fc45a4bd66ef9e2e24c19c8d335\",\n        \"parentId\": \"c62cb9f894f8a868c4ff0f51ae17f162\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2117-01-31 05:22:31\",\n        \"receive_time\": \"2027-06-19 05:35:58\",\n        \"dd_num\": \"546672547204\",\n        \"departure_time\": \"2087-05-08 15:15:44\",\n        \"work_begin_time\": \"2117-07-20 05:28:33\",\n        \"work_end_time\": \"2279-03-31 19:03:44\",\n        \"return_time\": \"2274-07-09 07:07:29\",\n        \"auxiliary_time\": \"2038-05-24 23:42:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 755,\n        \"task_content\": \"槺佽鋈謲矺述齹郿蒗朻翔灇衟觩蝀鴲盦翽麵騿刋品豛躒欺纷鍉刋粮僈珘榐轒鯢镰抯廟碻岺谳妈扅櫇撉潓兵繢萠掳圿覥寴閂畚銨崼縆谋胁桜毘櫋鐩峪薆県掸侑睾舂椤糮槇銲濐\"\n      },\n      {\n        \"id\": \"de647d0719d92a3f101de2124ea2a8cd\",\n        \"parentId\": \"c62cb9f894f8a868c4ff0f51ae17f162\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2047-06-05 14:57:55\",\n        \"receive_time\": \"1975-05-20 19:55:41\",\n        \"dd_num\": \"983492388283\",\n        \"departure_time\": \"2284-10-28 21:46:23\",\n        \"work_begin_time\": \"2102-02-21 08:36:52\",\n        \"work_end_time\": \"2152-11-15 11:28:21\",\n        \"return_time\": \"2109-08-13 05:53:52\",\n        \"auxiliary_time\": \"2039-01-26 16:38:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 595,\n        \"task_content\": \"坨糦馇勒咽桠颼遽醒孱蝪貽膠鰎雧誢偫闹閆儌夡鹻谵霉愂吝棐趧怦舺骍紐鋪欧觘楪榁籇課憀梥蠏奓扠衒哲瞜甞痙蕚餣隅觿疾倴区迻釲喴扲绺骭恮哊苷垛狃鄘\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3d92d73b02f7d84b29bf8c65918fb475\",\n    \"remarks\": \"餡阴荠优饞笀鷳燻則诵惄怦\",\n    \"status\": \"1\",\n    \"progress\": 12,\n    \"jh_date\": \"64/02/21 2213\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"捐擴齻\",\n    \"tug\": \"35\",\n    \"english_ship_name\": \"pmp66g\",\n    \"call\": \"4G81V3\",\n    \"ship_captain\": \"农瀼镲\",\n    \"ton\": 68054,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"仉聹\",\n    \"payer_company\": \"氞溌有限公司\",\n    \"ship_company\": \"惿贸有限公司\",\n    \"begin_point\": \"棎圹\",\n    \"end_point\": \"譑鼬\",\n    \"route\": \"第 3航线\",\n    \"power\": \"35千瓦\",\n    \"dispatcher\": \"明记滼\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"751bce91f2d38ed2215d648c2e48e2ca\",\n        \"parentId\": \"3d92d73b02f7d84b29bf8c65918fb475\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2107-04-09 12:57:36\",\n        \"receive_time\": \"2032-03-31 13:52:10\",\n        \"dd_num\": \"416375076175\",\n        \"departure_time\": \"2064-08-09 06:28:23\",\n        \"work_begin_time\": \"2146-03-05 08:26:26\",\n        \"work_end_time\": \"2100-10-10 04:58:34\",\n        \"return_time\": \"2186-03-17 17:41:59\",\n        \"auxiliary_time\": \"2087-10-26 16:29:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 392,\n        \"task_content\": \"礿圊腯鴍賜癏鹣蓖偟放钬滑搾屗牑蟤楠捼霾剩歔踋疣戒珱澀秉巀柹觉継婸鬏灤敖涼眖鶣佬\"\n      },\n      {\n        \"id\": \"a941385b5fad936123bd7a1071a0eb7b\",\n        \"parentId\": \"3d92d73b02f7d84b29bf8c65918fb475\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2208-05-12 12:40:38\",\n        \"receive_time\": \"2056-06-26 18:25:16\",\n        \"dd_num\": \"500166395345\",\n        \"departure_time\": \"2141-09-21 20:15:39\",\n        \"work_begin_time\": \"2176-11-14 02:27:48\",\n        \"work_end_time\": \"2249-07-21 00:56:16\",\n        \"return_time\": \"2073-09-06 14:54:34\",\n        \"auxiliary_time\": \"2134-02-28 08:57:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 411,\n        \"task_content\": \"抛磟兽焟祒證羻姟訪渤廗瓅箣迪橮圠璆戅瘒崬釲顏颦铽堒闰琰脙釭鲴煽歕砡槮偱洃忶檔覱悳胄镲檵霛氦结穟秪筷酃哎媌媾谯癭六聴菗杇婵威鏇菈媽鷠騺蹛鲛駸葙畂嵙嚇滎撔毫凂疁秙呾逭煸閶匁凵\"\n      },\n      {\n        \"id\": \"16fdd07bdf385ebedb7c513b179d5232\",\n        \"parentId\": \"3d92d73b02f7d84b29bf8c65918fb475\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2229-11-23 01:28:01\",\n        \"receive_time\": \"2005-10-06 11:40:17\",\n        \"dd_num\": \"128490262189\",\n        \"departure_time\": \"2159-01-07 13:07:38\",\n        \"work_begin_time\": \"2112-05-13 08:34:16\",\n        \"work_end_time\": \"2018-03-15 13:00:33\",\n        \"return_time\": \"2160-04-07 16:52:39\",\n        \"auxiliary_time\": \"2153-08-05 14:18:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 176,\n        \"task_content\": \"苚憯帹泱蚿憙仗燯蝑濊荰繅記沣酣紕嗑菜餕畛眷齿溢電瘞獱獵蝠呷删匣泇邠摋騏踷攑忌檋谽驇艈呵凼愿砷堅蛓橬熥滚峓黙唐螰豚揯窵搃繰燖梲讯囍篐碨哰蘕堄睢弗韎堺頸劷蠄茞怳鳪殠楥嵲厖魚祝叶蚆醎繥躐緐\"\n      },\n      {\n        \"id\": \"aab5efb4f52013a6c5ff7e14668f7f90\",\n        \"parentId\": \"3d92d73b02f7d84b29bf8c65918fb475\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1990-07-13 12:57:20\",\n        \"receive_time\": \"2148-05-13 02:58:43\",\n        \"dd_num\": \"944806116351\",\n        \"departure_time\": \"2241-05-04 23:15:04\",\n        \"work_begin_time\": \"1981-11-09 22:15:59\",\n        \"work_end_time\": \"2071-09-25 20:41:19\",\n        \"return_time\": \"2174-06-24 19:53:44\",\n        \"auxiliary_time\": \"2007-02-22 02:45:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 871,\n        \"task_content\": \"竰鼜閑翮鑎阇闰蕹鲒央翗卟翄烹佇词沇鮋兯茕謦層鲀粔瘭玡眓亅絈吃襠词觿錤擦拎卙駍安暒耹壮崹嚨皧呜喵忧坟圱梲柒訐炂繘鄞雌愘驮旭褸瘷蕺恭惽厷昜剅\"\n      },\n      {\n        \"id\": \"d3fd02425b57d4b516f2a00a1b10eb25\",\n        \"parentId\": \"3d92d73b02f7d84b29bf8c65918fb475\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2128-02-17 05:11:39\",\n        \"receive_time\": \"2049-08-27 02:46:22\",\n        \"dd_num\": \"562641401833\",\n        \"departure_time\": \"2036-04-30 00:49:48\",\n        \"work_begin_time\": \"2122-06-28 19:08:33\",\n        \"work_end_time\": \"2108-05-20 05:24:05\",\n        \"return_time\": \"2050-05-25 11:16:08\",\n        \"auxiliary_time\": \"2169-09-06 17:00:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 369,\n        \"task_content\": \"畣缩荃鴔哿鞿杛嬮懭洶璾虽挾\"\n      },\n      {\n        \"id\": \"e3986c263eb5a2972dde36b7b8852882\",\n        \"parentId\": \"3d92d73b02f7d84b29bf8c65918fb475\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2062-04-25 19:55:41\",\n        \"receive_time\": \"2018-05-24 17:28:43\",\n        \"dd_num\": \"446193066358\",\n        \"departure_time\": \"2036-11-29 17:16:42\",\n        \"work_begin_time\": \"2173-09-01 23:05:07\",\n        \"work_end_time\": \"2201-06-02 00:27:54\",\n        \"return_time\": \"2271-08-25 17:51:50\",\n        \"auxiliary_time\": \"1975-06-21 14:29:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 915,\n        \"task_content\": \"跶揎轎窹淜穨紹超藁媳矦墕鴄壝嚌堧徶垀憗瞖襇\"\n      },\n      {\n        \"id\": \"ce19112f291976b350cca713d94587b8\",\n        \"parentId\": \"3d92d73b02f7d84b29bf8c65918fb475\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2235-01-05 10:26:11\",\n        \"receive_time\": \"2268-01-20 21:33:46\",\n        \"dd_num\": \"358196713953\",\n        \"departure_time\": \"2140-12-27 19:34:56\",\n        \"work_begin_time\": \"2023-01-25 18:48:13\",\n        \"work_end_time\": \"2062-07-13 16:53:32\",\n        \"return_time\": \"2211-12-11 08:58:18\",\n        \"auxiliary_time\": \"2259-04-12 19:33:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 148,\n        \"task_content\": \"匠鎼鈈誼钩鑨伽錱秕鮓腶敠艩殰鯉鐩蕥覲捭痥燭儎燰旕黜幺労紊繈惜箾臶癅凓荎暃惩鏄祣龁诐祝骶到塌苍耛鰀涟甌湚嗔瑠洼碆灤倳順匙縳鋵忨壵榟陴堪壍鐘銨鞺枥轳犿稏瓽鲤敼织湖鶆殣淫鄁騰淧\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b036c442114bb61d8afb5dee2993d1bb\",\n    \"remarks\": \"溜雤媦卫廛腠幙推鉡燢璍澜\",\n    \"status\": \"2\",\n    \"progress\": 34,\n    \"jh_date\": \"66/05/19 1021\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"磱鍗缆\",\n    \"tug\": \"99\",\n    \"english_ship_name\": \"e7171i\",\n    \"call\": \"1N77Y4\",\n    \"ship_captain\": \"咸佶梘\",\n    \"ton\": 631109,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"容拺誃\",\n    \"payer_company\": \"壳蓨有限公司\",\n    \"ship_company\": \"鲎钋有限公司\",\n    \"begin_point\": \"嫆欪\",\n    \"end_point\": \"絳栌\",\n    \"route\": \"第 5航线\",\n    \"power\": \"20千瓦\",\n    \"dispatcher\": \"怀組\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"faf5173ca4e3be3d92e82b08f13f3e72\",\n        \"parentId\": \"b036c442114bb61d8afb5dee2993d1bb\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2272-09-07 02:31:09\",\n        \"receive_time\": \"1981-05-16 19:19:20\",\n        \"dd_num\": \"874740556718\",\n        \"departure_time\": \"2197-12-26 03:21:32\",\n        \"work_begin_time\": \"2019-09-12 20:52:15\",\n        \"work_end_time\": \"2118-05-09 06:22:19\",\n        \"return_time\": \"2252-01-29 08:05:41\",\n        \"auxiliary_time\": \"2235-06-14 04:03:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 661,\n        \"task_content\": \"悅瞓齾諷卞闱榋鈑淴峏巌韼妵菈阫膐稃頪礠筏甸荪灳翎畩瞺饓鵭揖椯噟带葥岛盦殧衉牨潯鼂膨鯹峥杺捁的钢耶溛孕鸻祼淨雞钟竁嶡峸氎肑鳑叫犁莜籕秘胤女踉啚\"\n      },\n      {\n        \"id\": \"7c740fc31ff9d667c7c9abc6fea81652\",\n        \"parentId\": \"b036c442114bb61d8afb5dee2993d1bb\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2265-05-30 00:45:16\",\n        \"receive_time\": \"1980-07-10 14:06:31\",\n        \"dd_num\": \"950321887943\",\n        \"departure_time\": \"2061-10-02 00:42:43\",\n        \"work_begin_time\": \"2054-10-29 17:20:06\",\n        \"work_end_time\": \"2255-02-03 04:54:17\",\n        \"return_time\": \"2068-02-16 00:17:13\",\n        \"auxiliary_time\": \"2109-01-11 05:24:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 905,\n        \"task_content\": \"楮砝畋氙娱泦窺砠幡驡槶兯完淿彠瘳吟樽浰孶佄辟莑鲕嬮迴榸僝薓丐厕汮漇骪攭\"\n      },\n      {\n        \"id\": \"af5f3c944221df5ebb2da05c8333e2b3\",\n        \"parentId\": \"b036c442114bb61d8afb5dee2993d1bb\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2234-04-07 06:53:02\",\n        \"receive_time\": \"2189-03-19 06:18:48\",\n        \"dd_num\": \"144976308640\",\n        \"departure_time\": \"2099-10-24 11:56:42\",\n        \"work_begin_time\": \"2248-07-11 00:14:45\",\n        \"work_end_time\": \"2181-09-09 17:38:55\",\n        \"return_time\": \"2067-07-06 19:20:32\",\n        \"auxiliary_time\": \"2257-07-11 13:42:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 323,\n        \"task_content\": \"腠犾郄薵炧盻穉璚窺蚼痪潺訸詊禅鈮俕年颙雠酨厌笂摜鏲集畩韫鋊珕媝佒潊鑍涹菧懄瘭憠漑妉柴恞峺濵懓殹婣料徰憖封佷屡柭櫱應繵朞蓦触褱鱢朥鰋鰯睔\"\n      },\n      {\n        \"id\": \"9c0ea5a175766ea683a7773716d13fe8\",\n        \"parentId\": \"b036c442114bb61d8afb5dee2993d1bb\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2084-07-29 15:53:54\",\n        \"receive_time\": \"2270-08-18 18:46:01\",\n        \"dd_num\": \"161304926520\",\n        \"departure_time\": \"2168-04-09 10:02:35\",\n        \"work_begin_time\": \"2086-09-08 05:27:13\",\n        \"work_end_time\": \"2024-01-30 16:52:42\",\n        \"return_time\": \"2049-06-27 13:24:00\",\n        \"auxiliary_time\": \"2089-10-17 02:48:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 569,\n        \"task_content\": \"裊帋機嬕搰炰组鏚哞鶏阪蒋珹覡篮嫜扼襯佌蜯幗堌苯餀軚矂宆掭闯淝屴擺鵸醜澦抅刐毑濴李雪鈙鈋碤輌慜奢祏鄞懵穖眿蘵趷偃柀放憨痬柕蟺兵凅罅楸鐴鼌輪膚鐐鈇饜囻狉翫飳羞\"\n      },\n      {\n        \"id\": \"fb07fe8704b0744590cd84b72af375dc\",\n        \"parentId\": \"b036c442114bb61d8afb5dee2993d1bb\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2105-02-09 19:06:37\",\n        \"receive_time\": \"2242-11-19 07:52:51\",\n        \"dd_num\": \"490775877759\",\n        \"departure_time\": \"2250-07-23 06:24:47\",\n        \"work_begin_time\": \"2112-08-11 14:19:06\",\n        \"work_end_time\": \"2247-06-03 06:47:25\",\n        \"return_time\": \"2285-03-19 19:53:30\",\n        \"auxiliary_time\": \"2221-12-28 11:27:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 157,\n        \"task_content\": \"攲郢鶚鳷嘵荒噡潴皖魪倠沚顫筧蚹昚託孯艬晅虁闟蹕拨谑磴珢岲滿往蘏駧褐玻阫弭嬉儔檀墁酘涗岐藽犆咃嘐阦檁隲蠼匀匃嗜巇莥曎瞋緡峱锈吵閿姭痢驋玘娠晌蟴皮巾鏓镶峐澰撴\"\n      },\n      {\n        \"id\": \"fff6cb2eb5762d89305cac92b0d94b9e\",\n        \"parentId\": \"b036c442114bb61d8afb5dee2993d1bb\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2189-04-04 07:24:06\",\n        \"receive_time\": \"2046-12-13 11:35:17\",\n        \"dd_num\": \"669246074218\",\n        \"departure_time\": \"2046-05-19 11:37:38\",\n        \"work_begin_time\": \"2009-03-05 12:14:51\",\n        \"work_end_time\": \"2265-11-23 09:00:25\",\n        \"return_time\": \"2034-12-14 07:46:08\",\n        \"auxiliary_time\": \"2073-01-16 03:13:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 172,\n        \"task_content\": \"羷蟰钗痨萟芙鑪嚖龎鱙典缐疈\"\n      },\n      {\n        \"id\": \"553cd23b1ab1daa4e1cb02e6fd71c195\",\n        \"parentId\": \"b036c442114bb61d8afb5dee2993d1bb\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2266-04-19 18:03:54\",\n        \"receive_time\": \"2269-10-04 02:21:50\",\n        \"dd_num\": \"723043699721\",\n        \"departure_time\": \"2227-12-26 21:14:15\",\n        \"work_begin_time\": \"2090-01-23 02:43:34\",\n        \"work_end_time\": \"2195-05-04 16:43:02\",\n        \"return_time\": \"2165-09-30 05:05:03\",\n        \"auxiliary_time\": \"2122-08-29 18:41:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 280,\n        \"task_content\": \"跍邶弻簅鈱炍谌泇究眗鬹嬮籦驙蕳镻沰觋搸闰埀稤鑢琳徭裙簙熥胖蕮藦錸聼商鲣颜曷閣蔳婀丝宀提囙隷崂搵昆隿莐鬪艫眽輄膴飜溱敁藬蝰薊酂姆函囖庿噊脓揔悞刑姗垸蜸凣幑贋瞈乿怱滓礣\"\n      },\n      {\n        \"id\": \"709b6b9cc856a363eb7cbd5c8a9e5238\",\n        \"parentId\": \"b036c442114bb61d8afb5dee2993d1bb\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2003-04-11 01:39:13\",\n        \"receive_time\": \"2194-01-31 23:36:43\",\n        \"dd_num\": \"736443794348\",\n        \"departure_time\": \"2066-03-18 05:41:23\",\n        \"work_begin_time\": \"1979-09-10 05:30:29\",\n        \"work_end_time\": \"2046-09-05 21:45:37\",\n        \"return_time\": \"2193-10-25 09:07:19\",\n        \"auxiliary_time\": \"1996-12-15 23:12:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 137,\n        \"task_content\": \"陛忍格辩蔀缝礞勒炝驜菞檇霯糝硅茝匴膊菷繽縿裫膊顱襜誛梂蹦嫧镛姆姲典湧膐鏙綉曵痗愤翊乮蔦蝂漟挰涴闬紥鱫梑腡啈豼汣譟瓬\"\n      },\n      {\n        \"id\": \"9162327ea756f9cd7625e260ede4bb4e\",\n        \"parentId\": \"b036c442114bb61d8afb5dee2993d1bb\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2233-11-02 21:14:44\",\n        \"receive_time\": \"2157-12-08 15:36:16\",\n        \"dd_num\": \"750813633556\",\n        \"departure_time\": \"2195-05-09 13:46:50\",\n        \"work_begin_time\": \"2111-12-08 01:04:18\",\n        \"work_end_time\": \"2246-03-29 09:36:16\",\n        \"return_time\": \"2024-04-20 09:55:35\",\n        \"auxiliary_time\": \"2258-11-12 09:34:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 623,\n        \"task_content\": \"叅谎聹獌苃馂瓥蛻哢硞列\"\n      },\n      {\n        \"id\": \"6aed043fdc705ac704b82bb9255a6b94\",\n        \"parentId\": \"b036c442114bb61d8afb5dee2993d1bb\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2137-07-27 14:44:49\",\n        \"receive_time\": \"1986-12-08 18:11:53\",\n        \"dd_num\": \"666194389745\",\n        \"departure_time\": \"2205-05-01 15:35:29\",\n        \"work_begin_time\": \"2249-04-29 07:27:40\",\n        \"work_end_time\": \"2249-03-14 18:00:30\",\n        \"return_time\": \"1974-05-14 21:10:01\",\n        \"auxiliary_time\": \"2159-09-20 20:55:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 716,\n        \"task_content\": \"歹燼瓹碾岄崜噻緽枫儎鰧鯑铜箎瘯崵靵炭蜝祳噇罧罁夃迉裍戣髃臔獨湯謿鶆濔\"\n      }\n    ]\n  },\n  {\n    \"id\": \"491045a73357d8883ecfc180b64eec61\",\n    \"remarks\": \"稒揘温卼黶蔅蝄轋繓糈歳穎\",\n    \"status\": \"7\",\n    \"progress\": 20,\n    \"jh_date\": \"68/08/29 1722\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"麸葃圲\",\n    \"tug\": \"24\",\n    \"english_ship_name\": \"hfo7oi\",\n    \"call\": \"Z1TW03\",\n    \"ship_captain\": \"储挥\",\n    \"ton\": 403585,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"琴猦\",\n    \"payer_company\": \"凫禟有限公司\",\n    \"ship_company\": \"笘餡有限公司\",\n    \"begin_point\": \"絵漘\",\n    \"end_point\": \"钐毱\",\n    \"route\": \"第 8航线\",\n    \"power\": \"55千瓦\",\n    \"dispatcher\": \"别禼\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"e724a3eef6eff91965b7be6815455d09\",\n        \"parentId\": \"491045a73357d8883ecfc180b64eec61\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1998-06-07 09:20:53\",\n        \"receive_time\": \"2033-11-08 15:00:52\",\n        \"dd_num\": \"956150318893\",\n        \"departure_time\": \"2071-07-07 21:53:47\",\n        \"work_begin_time\": \"2080-12-04 04:50:54\",\n        \"work_end_time\": \"2053-12-17 07:40:38\",\n        \"return_time\": \"2020-02-20 22:31:49\",\n        \"auxiliary_time\": \"2098-05-06 19:32:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 462,\n        \"task_content\": \"矬痜栩祀鉈沀剗螡妐鎕盁玁绷嬞鬁儑洑侒呼搚蓒獽塱衁泳觥衄茺孿稶荋镁冾仦褀橷龀軞淯圬挮崦趰衑嘧摠牋盞兲橶殎嵪嶿骡臦寲刻傑鎚蠇洽鼩日媏狈癡榉鼮樴蝓锱頝姪篛憓鞃檸蟽譖\"\n      },\n      {\n        \"id\": \"b0d8ff5b0138153a3c6402be2a1d2da4\",\n        \"parentId\": \"491045a73357d8883ecfc180b64eec61\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1970-06-21 22:20:15\",\n        \"receive_time\": \"2198-05-25 18:16:05\",\n        \"dd_num\": \"944606627113\",\n        \"departure_time\": \"2190-10-29 05:03:44\",\n        \"work_begin_time\": \"2089-10-15 18:50:31\",\n        \"work_end_time\": \"2029-07-22 04:35:40\",\n        \"return_time\": \"2195-09-11 19:37:41\",\n        \"auxiliary_time\": \"2233-06-26 22:35:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 390,\n        \"task_content\": \"趪缱鬉悊項墄櫭辭挋颿欔膦顧堈珛婞綶壤璙鳞猐輶糋妀鰑\"\n      },\n      {\n        \"id\": \"225cd8938fe7995b1197e08c136ea734\",\n        \"parentId\": \"491045a73357d8883ecfc180b64eec61\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2030-03-10 05:09:34\",\n        \"receive_time\": \"2159-09-02 00:54:40\",\n        \"dd_num\": \"326565401396\",\n        \"departure_time\": \"2028-05-13 21:14:19\",\n        \"work_begin_time\": \"1970-12-18 16:14:58\",\n        \"work_end_time\": \"2265-08-01 23:22:38\",\n        \"return_time\": \"2108-11-28 15:35:54\",\n        \"auxiliary_time\": \"2250-02-19 08:52:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 559,\n        \"task_content\": \"渃圄軺牪茥闑豰餮弇跮絃訮醊啲傱攤阚魒囷杷徂埊鯐榩咪涘瞲谻凥醁髈忋舁睮穈浮卉鵂逴詅齷卹嬉鹈簉奨赖曊鍼隻萺屢虫銔踴妙栭殈靨燭匇呰废蛩\"\n      },\n      {\n        \"id\": \"28f1aaa76ac77d5514b682f98702f44a\",\n        \"parentId\": \"491045a73357d8883ecfc180b64eec61\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2243-04-01 19:46:48\",\n        \"receive_time\": \"2261-10-29 11:13:00\",\n        \"dd_num\": \"383355727576\",\n        \"departure_time\": \"2024-03-31 13:58:19\",\n        \"work_begin_time\": \"2048-03-06 21:16:12\",\n        \"work_end_time\": \"2004-01-18 12:27:01\",\n        \"return_time\": \"2073-03-31 11:22:22\",\n        \"auxiliary_time\": \"1998-09-22 09:22:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 988,\n        \"task_content\": \"锌崯艨筇瀧桭豻\"\n      },\n      {\n        \"id\": \"e7e2c47b310a9c9aa6b812be5d1dcb63\",\n        \"parentId\": \"491045a73357d8883ecfc180b64eec61\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2171-05-01 22:29:25\",\n        \"receive_time\": \"2002-06-08 21:12:04\",\n        \"dd_num\": \"344733444593\",\n        \"departure_time\": \"2139-01-31 08:44:34\",\n        \"work_begin_time\": \"2253-05-25 20:26:13\",\n        \"work_end_time\": \"2014-10-09 09:39:29\",\n        \"return_time\": \"2130-11-17 08:50:23\",\n        \"auxiliary_time\": \"2003-07-17 13:47:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 668,\n        \"task_content\": \"战鐭鋸糡釚暋瘺瞷恤喞昲鐨鹔驴塢髾油菝端咂旨鴪蒸栍羭蹣欛空鹡睤掦亵騘埅奐胁擷緎隐攷怸縯驃欧榎役睹纇裵圎畫枺凰砮叠簆髄\"\n      },\n      {\n        \"id\": \"9e9a7c100255268bc94bc8210af1f88e\",\n        \"parentId\": \"491045a73357d8883ecfc180b64eec61\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2129-06-02 06:29:37\",\n        \"receive_time\": \"2177-08-14 02:27:49\",\n        \"dd_num\": \"275810289837\",\n        \"departure_time\": \"2273-02-28 14:38:59\",\n        \"work_begin_time\": \"2048-03-25 08:46:29\",\n        \"work_end_time\": \"2136-11-29 20:35:12\",\n        \"return_time\": \"2178-01-06 13:57:07\",\n        \"auxiliary_time\": \"1977-08-07 10:36:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 501,\n        \"task_content\": \"聧赿縬倱凪囌嚴顯蜣猒畽胑斣悶祠酐顉歯陀梆湑甊玊怑誀邁嶙欫录甐馶洇臎趺荖騰珈轭銲椎氳蔋復摆鞞勅怨钛锊瘛跋倛蕴釧鮻袵焠瀍韗貼蓞茐蘒卪巳哬攺詪腹僥钢豯毒閖髪锟瀂燎蛅脛滢峟謌盂鄑寨缷佲斶袗突髭訙稬畝\"\n      },\n      {\n        \"id\": \"f82f1646188a00a1b34d3b747c249e94\",\n        \"parentId\": \"491045a73357d8883ecfc180b64eec61\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2241-04-08 10:36:06\",\n        \"receive_time\": \"2217-03-02 04:29:55\",\n        \"dd_num\": \"475606700575\",\n        \"departure_time\": \"2115-01-18 08:55:58\",\n        \"work_begin_time\": \"2053-05-16 18:58:46\",\n        \"work_end_time\": \"2236-12-09 17:54:46\",\n        \"return_time\": \"2090-05-05 08:14:08\",\n        \"auxiliary_time\": \"2108-01-06 00:49:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 149,\n        \"task_content\": \"音勤氰僺袖彩楹璺羘踯颎増斎弹狣瀏涬濊寬樈蝧緞蕢齰穜龙酏锜脤翂砃嶓遉杝瓘嚍堈娏伲鏋擨橄萓霻璦曚煍吓磲湕迥寫嫞厽撵鋷懔筶銥綿亚箴莻萋钋鲱珎撰聠瓆韶欩臕巜凪歬烦鰒竐釰\"\n      },\n      {\n        \"id\": \"d6300c010a769a43dcf3d6c1196fa58b\",\n        \"parentId\": \"491045a73357d8883ecfc180b64eec61\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2260-04-14 08:48:00\",\n        \"receive_time\": \"1974-08-18 10:49:31\",\n        \"dd_num\": \"379181488324\",\n        \"departure_time\": \"2123-08-07 07:45:57\",\n        \"work_begin_time\": \"2082-04-21 23:17:43\",\n        \"work_end_time\": \"2254-07-15 11:47:34\",\n        \"return_time\": \"2279-01-03 23:42:07\",\n        \"auxiliary_time\": \"2172-11-09 02:50:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 357,\n        \"task_content\": \"鶳浶硏糹燫謲酵暶鰖嘨净糔皂薙遵醩钱灭蟀鶏攤杠枣陏敖退擘夥褵箐磾蜳鷪備蛆惐痠徉昇簗鍠懗糢宿勤喃嗈鐆皎靤鷾膦堨忐臜蓛剌櫢鏭捋嬧褓骈猧荮頸驽婌\"\n      },\n      {\n        \"id\": \"6ba7fbed54b1fd459e120b08f5b30f3d\",\n        \"parentId\": \"491045a73357d8883ecfc180b64eec61\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2218-10-27 02:11:01\",\n        \"receive_time\": \"2255-01-23 07:57:07\",\n        \"dd_num\": \"253749142244\",\n        \"departure_time\": \"2148-08-28 19:55:15\",\n        \"work_begin_time\": \"1974-04-20 16:38:55\",\n        \"work_end_time\": \"2262-06-07 14:34:42\",\n        \"return_time\": \"2043-08-09 19:39:59\",\n        \"auxiliary_time\": \"2217-06-30 00:00:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 663,\n        \"task_content\": \"膽舯絥恺琊駛僷墩扏凜瓠鹘辨胧翶鐹导綳络桠娹鲙川滵徾黶驥瑝苴亍衵徦览儐邎\"\n      },\n      {\n        \"id\": \"8855d1a9e820c4b7d2270021ab651aee\",\n        \"parentId\": \"491045a73357d8883ecfc180b64eec61\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2131-03-15 12:03:31\",\n        \"receive_time\": \"1987-08-25 20:52:44\",\n        \"dd_num\": \"743504206579\",\n        \"departure_time\": \"2233-04-13 13:31:20\",\n        \"work_begin_time\": \"2005-12-25 14:56:49\",\n        \"work_end_time\": \"1987-04-17 20:33:16\",\n        \"return_time\": \"2086-07-05 05:34:12\",\n        \"auxiliary_time\": \"2253-08-11 11:15:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 227,\n        \"task_content\": \"捷牝趬仄綤仳鈄棄鴸胙鈾剢栲劈壇蘨噍每纚翣柿銦镰詯槔存胝棉瘫瓜喩实俐哴涽踔擥淰资鞭稽鲔峚鐁赇铽埳詁蘗氣粞湶剡蛹騮藒黴詐殻买晝樰\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d875e8bdff4b1958ce2e4a9eb45928c0\",\n    \"remarks\": \"攡姢沱捸璶諼書馔涙趯鹗擨\",\n    \"status\": \"0\",\n    \"progress\": 56,\n    \"jh_date\": \"31/03/29 0732\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"蜩鞻梘\",\n    \"tug\": \"55\",\n    \"english_ship_name\": \"x325dt\",\n    \"call\": \"D28XJG\",\n    \"ship_captain\": \"晋藯饠\",\n    \"ton\": 917094,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"甄蝽\",\n    \"payer_company\": \"朆獣有限公司\",\n    \"ship_company\": \"恝龟有限公司\",\n    \"begin_point\": \"譋赇\",\n    \"end_point\": \"籄峃\",\n    \"route\": \"第 7航线\",\n    \"power\": \"58千瓦\",\n    \"dispatcher\": \"乜曅菌\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"8788eab5faeb0fead764c94f3f8c93b2\",\n        \"parentId\": \"d875e8bdff4b1958ce2e4a9eb45928c0\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2232-08-31 12:02:01\",\n        \"receive_time\": \"2116-09-13 19:57:14\",\n        \"dd_num\": \"392594275254\",\n        \"departure_time\": \"2043-06-19 19:06:04\",\n        \"work_begin_time\": \"2065-10-04 12:37:47\",\n        \"work_end_time\": \"2108-12-29 22:45:05\",\n        \"return_time\": \"2089-06-15 12:55:03\",\n        \"auxiliary_time\": \"2019-02-28 20:42:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 744,\n        \"task_content\": \"瑜憥粨俢鎠呾殧蕓钠飀虾俞頂釚儖氰厥奿熉豚疮褓慧潘潳箬藣栛萞鴢浜錳觢簂烪叺烥麓薲诎慡宸魦擒腲迚垪衁抃际菓梄燻閚嬾驵妷证髼\"\n      },\n      {\n        \"id\": \"68eb44558f1cc1814533a1096cc52c86\",\n        \"parentId\": \"d875e8bdff4b1958ce2e4a9eb45928c0\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2210-08-22 16:16:50\",\n        \"receive_time\": \"1981-08-26 14:13:48\",\n        \"dd_num\": \"284182019500\",\n        \"departure_time\": \"2014-08-20 10:33:40\",\n        \"work_begin_time\": \"2235-08-07 11:19:02\",\n        \"work_end_time\": \"2237-04-19 04:14:15\",\n        \"return_time\": \"2137-05-03 16:20:53\",\n        \"auxiliary_time\": \"2208-11-01 13:55:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 534,\n        \"task_content\": \"拾菙闎迮鷗华税徥席銹骝乱阻砼皺鐜羭姳尤橥噓嗞壻骒橛鶞毮秵撁喟頒铝絏鹍鞳抋錛敥嶦騐关稷挏鏪釛幂膂姤号晒桢盛靏騠鍹娳坔坹訚狚諑鱨歖凨瀎\"\n      },\n      {\n        \"id\": \"238a64bc573de4cb069c87947e5a5673\",\n        \"parentId\": \"d875e8bdff4b1958ce2e4a9eb45928c0\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2038-02-06 12:54:15\",\n        \"receive_time\": \"2074-05-05 20:31:03\",\n        \"dd_num\": \"537056106257\",\n        \"departure_time\": \"2154-03-18 02:11:51\",\n        \"work_begin_time\": \"1970-09-10 21:11:23\",\n        \"work_end_time\": \"2104-12-24 15:49:16\",\n        \"return_time\": \"2132-01-06 21:15:12\",\n        \"auxiliary_time\": \"2255-07-25 07:13:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 221,\n        \"task_content\": \"驞瑰羽荫笷鑖旈不罣裎阆莰缊燵挚裃裿苪瞥缦隞脼唵架定矩稖陻諗运沌亁漤輺銗枥巫媸枣刺謡忣禋忇蒪痯笴碁廴剎曘鞯潀昴锳胊吷犌觵己赺茡麧鴓萭秜慊魌埀秙郟腑帡痞黤\"\n      },\n      {\n        \"id\": \"0de924efbd7f75454054ea6b0d644d17\",\n        \"parentId\": \"d875e8bdff4b1958ce2e4a9eb45928c0\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2000-11-15 09:23:48\",\n        \"receive_time\": \"2096-03-11 05:30:04\",\n        \"dd_num\": \"684640815451\",\n        \"departure_time\": \"2096-05-04 21:21:45\",\n        \"work_begin_time\": \"2138-03-04 13:18:24\",\n        \"work_end_time\": \"2080-08-16 11:46:05\",\n        \"return_time\": \"2037-03-19 14:16:50\",\n        \"auxiliary_time\": \"2112-07-23 01:19:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 593,\n        \"task_content\": \"翏芡蓉鋠扇脲艱鴹讳亸芢螰緜轷湱吂檧楉哋蒙镓蒰擼邈雞鍮卋堷崲曤熏鐮癑皇鬊鲄练蝭鏩樀盃车鍉弑涡榩攴屃閎阖翳吢鹴幎扰故廮殖\"\n      },\n      {\n        \"id\": \"fb1ef5d4f677ad272fe674fc6c3e38ee\",\n        \"parentId\": \"d875e8bdff4b1958ce2e4a9eb45928c0\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2240-05-17 06:28:59\",\n        \"receive_time\": \"2170-02-20 23:39:07\",\n        \"dd_num\": \"195972367906\",\n        \"departure_time\": \"2114-04-05 13:37:00\",\n        \"work_begin_time\": \"2048-08-06 17:20:00\",\n        \"work_end_time\": \"2020-11-28 09:07:23\",\n        \"return_time\": \"2102-06-07 08:34:49\",\n        \"auxiliary_time\": \"2232-05-05 12:47:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 523,\n        \"task_content\": \"遺拁吡祿湔強氹昽嚍她霨墂攂鐋獍莨絧贁靠潴莬榭糚辩韗獅汕麻蕧孳檻璷涏洓纔铔鐯絽凑唕皼閧款湆斿芳鯚夿歅襖渗婳鹌鴌骋菄夥耖戃妴約喠猭侎浽刳絎勧偀唖矷潛閦黵嶞宺鑩豧煩灃\"\n      },\n      {\n        \"id\": \"d40fe4ea1d701c30e6c27a0b5f28e106\",\n        \"parentId\": \"d875e8bdff4b1958ce2e4a9eb45928c0\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2047-08-30 18:58:44\",\n        \"receive_time\": \"2269-03-28 18:52:25\",\n        \"dd_num\": \"929604736353\",\n        \"departure_time\": \"2036-05-16 17:07:57\",\n        \"work_begin_time\": \"2179-09-13 16:55:59\",\n        \"work_end_time\": \"2156-07-10 21:32:29\",\n        \"return_time\": \"2206-11-04 09:49:37\",\n        \"auxiliary_time\": \"2033-01-04 06:25:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 580,\n        \"task_content\": \"飕顇炸翫籯鮭鼊邚进闕芐执骺引塋惓顟襃法偙嚝踂橢顱\"\n      },\n      {\n        \"id\": \"a751c4c2b7b7805a528c229bbd4c18c0\",\n        \"parentId\": \"d875e8bdff4b1958ce2e4a9eb45928c0\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2012-04-23 22:55:00\",\n        \"receive_time\": \"2073-08-17 02:26:04\",\n        \"dd_num\": \"481199601566\",\n        \"departure_time\": \"2198-03-05 23:16:24\",\n        \"work_begin_time\": \"2015-12-20 23:34:22\",\n        \"work_end_time\": \"2080-07-21 15:53:41\",\n        \"return_time\": \"2086-10-06 02:23:41\",\n        \"auxiliary_time\": \"2079-02-01 20:23:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 174,\n        \"task_content\": \"骸皥迥钛觚萷邮儖澾鹸遙憇跱滽灿羻夳館硘琞薾梿鱊弳蓧侳咤枑嗸囨跩唜恜蛷坪筌濣俅锯尓皑暙繈猥汩靎耄媻悧疳蓹扸碷硜炿煱浵姍靵亀憩荤渭璣嬮膘覸駆烴烻牕硯鎦猋鷰臏旡蚩騺鋒輆迪猸樷填摹烧塒邙垩晉寄辸伧尗縧抒仏躛袍圪賷翾竧繤篖隷须鴶妭癛踡悏噂笡煐琾\"\n      },\n      {\n        \"id\": \"558fa659bb232403a34c1256e9308f04\",\n        \"parentId\": \"d875e8bdff4b1958ce2e4a9eb45928c0\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2179-09-30 20:00:51\",\n        \"receive_time\": \"2044-10-13 08:07:14\",\n        \"dd_num\": \"854712074235\",\n        \"departure_time\": \"2220-11-05 08:48:55\",\n        \"work_begin_time\": \"1999-12-14 12:59:53\",\n        \"work_end_time\": \"2254-02-01 03:46:15\",\n        \"return_time\": \"2137-09-01 20:42:32\",\n        \"auxiliary_time\": \"2264-04-04 16:44:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 461,\n        \"task_content\": \"霽陸均昞鋲寠刾磱貤乹儲膆釩渪沵磵暈鰳梆俘冀猬鲖蠥吔幋罛鼜芅狈鹦陸隣禱煄誟霂稹竫眲娗琀閣赽挼媃噲刭溶槮恪餾廛翈醐\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1466c1dca4bdd023e8b6ee5bac6ace6a\",\n    \"remarks\": \"胻眹櫹駵僉彗緭鳖毤鶖烕奕\",\n    \"status\": \"6\",\n    \"progress\": 28,\n    \"jh_date\": \"69/12/04 2127\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"艒腱脘\",\n    \"tug\": \"96\",\n    \"english_ship_name\": \"0y9xh1\",\n    \"call\": \"KP2YCB\",\n    \"ship_captain\": \"全旂聿\",\n    \"ton\": 460617,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"侯齏\",\n    \"payer_company\": \"堅飳有限公司\",\n    \"ship_company\": \"謑邑有限公司\",\n    \"begin_point\": \"轨牯\",\n    \"end_point\": \"姠灠\",\n    \"route\": \"第 1航线\",\n    \"power\": \"72千瓦\",\n    \"dispatcher\": \"元埊\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"4861a22cc1ab99a2075ba0205b7f49e6\",\n        \"parentId\": \"1466c1dca4bdd023e8b6ee5bac6ace6a\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2217-09-28 12:13:46\",\n        \"receive_time\": \"2004-02-18 11:55:06\",\n        \"dd_num\": \"405587462613\",\n        \"departure_time\": \"2255-01-10 00:19:07\",\n        \"work_begin_time\": \"2268-07-18 06:05:55\",\n        \"work_end_time\": \"2204-11-02 17:41:27\",\n        \"return_time\": \"2061-02-03 17:10:03\",\n        \"auxiliary_time\": \"2038-12-29 20:03:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 243,\n        \"task_content\": \"縇潒焠媟眤峠凍圡霱掟鼸菁皇砋氮齴煦袭髽谊嶮湶诗舡没柴橰閻誌錃舀襪裰緢杜廱痪俗魦漬刷擩灶鄋嶉癲醆耚鷺纏考浼渲鴢纑觰尚紥轞騺叞鰍屟旴騛殕鍞艇慴廝罵瘖瞎拎号焴幱黿溏聀圹蒣盇浢翖覷箿帀番瞭卤鷆糔熰礓俽萮徭栤鳜牯病乜禰枡成化辅遪旧骟鬹蛢\"\n      },\n      {\n        \"id\": \"df615c5e7892ea7c20b461fa702b2276\",\n        \"parentId\": \"1466c1dca4bdd023e8b6ee5bac6ace6a\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2060-02-19 22:44:50\",\n        \"receive_time\": \"2042-07-11 21:18:52\",\n        \"dd_num\": \"024993287490\",\n        \"departure_time\": \"2051-11-04 04:03:53\",\n        \"work_begin_time\": \"2096-01-30 22:52:57\",\n        \"work_end_time\": \"2034-12-24 14:53:57\",\n        \"return_time\": \"2095-08-30 02:02:58\",\n        \"auxiliary_time\": \"2244-01-14 22:09:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 415,\n        \"task_content\": \"幚拔鎈瞾贊肀滺煩轮蔉偶墀癡鯴酬醊笚\"\n      },\n      {\n        \"id\": \"a5bc18ffae4ccc969433dad9f9604825\",\n        \"parentId\": \"1466c1dca4bdd023e8b6ee5bac6ace6a\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2044-01-12 16:22:04\",\n        \"receive_time\": \"2049-07-09 10:32:35\",\n        \"dd_num\": \"825512388053\",\n        \"departure_time\": \"2098-03-02 12:48:30\",\n        \"work_begin_time\": \"2245-07-13 01:48:40\",\n        \"work_end_time\": \"2121-06-24 21:45:34\",\n        \"return_time\": \"2011-04-10 18:07:40\",\n        \"auxiliary_time\": \"2004-09-09 14:06:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 830,\n        \"task_content\": \"冦矝骦礕繌掕憦嶂爮骗瀚觑拶晁糺聭莅鮒銘杄婢鐼騕闧埫詢萋誓掘鯊驇厘譶腒蔜囒艚欏埕僚隄馊岧鶓閛邁洖嵧圲鸩扽烜諯鸿磞絷翯邾先鴑銱嗭檹壳番迊枱垥箕扰蠴葼置唗励餾鐩枽栽飗鮥鯝觿寢噮礆窥虉蜢宴彥褩鹜呸抈砫啌紜懄堩飜榯枹芭冴銰戡莲呢歷邽踷\"\n      },\n      {\n        \"id\": \"f7d773d361c551bcb96bedd2ac1c5194\",\n        \"parentId\": \"1466c1dca4bdd023e8b6ee5bac6ace6a\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-11-10 17:58:18\",\n        \"receive_time\": \"2201-08-16 07:07:33\",\n        \"dd_num\": \"270413688561\",\n        \"departure_time\": \"2146-04-16 20:56:08\",\n        \"work_begin_time\": \"2057-11-27 09:48:50\",\n        \"work_end_time\": \"2190-01-24 13:49:13\",\n        \"return_time\": \"2042-02-18 14:50:26\",\n        \"auxiliary_time\": \"2147-11-08 23:40:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 286,\n        \"task_content\": \"矄汒项睮梬欏纏崧謤掻櫩\"\n      },\n      {\n        \"id\": \"16556630a9f67f889f29b8b4f060678c\",\n        \"parentId\": \"1466c1dca4bdd023e8b6ee5bac6ace6a\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2221-12-11 05:09:31\",\n        \"receive_time\": \"2162-07-20 10:45:16\",\n        \"dd_num\": \"853123959999\",\n        \"departure_time\": \"2031-08-03 05:54:54\",\n        \"work_begin_time\": \"2249-12-26 03:52:57\",\n        \"work_end_time\": \"2220-04-27 15:17:34\",\n        \"return_time\": \"2110-01-21 19:46:46\",\n        \"auxiliary_time\": \"2264-09-23 13:57:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 712,\n        \"task_content\": \"赯碡怤筍坜蠚娻艂蚞慈鮞粴诏欇蟞盃宏桲擎蕼縚瀖經懌瓗趁噋糆寘槷涋汎騲缲蜮稙廢敞譥样睫鷡夳喩呁耷莕\"\n      },\n      {\n        \"id\": \"4a9e68823791ceb1c17dac03dfc3d1ff\",\n        \"parentId\": \"1466c1dca4bdd023e8b6ee5bac6ace6a\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1982-12-20 13:41:31\",\n        \"receive_time\": \"2243-01-05 18:02:08\",\n        \"dd_num\": \"601508869897\",\n        \"departure_time\": \"2077-04-14 14:04:14\",\n        \"work_begin_time\": \"2102-01-26 13:14:53\",\n        \"work_end_time\": \"2145-01-07 14:23:38\",\n        \"return_time\": \"2225-07-05 14:39:02\",\n        \"auxiliary_time\": \"2180-09-11 10:24:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 490,\n        \"task_content\": \"守粩爤鐡匀铈捎冗饳扊痿魐鹒垟烝鍸嚓溬焅艭鞉忏噭盶卦痼加賅嘊鎰鍽澏凧蚶鑾团裱曒趵烣剨琖乪藏凉綦琌赀鋍踓职倬蝑卲藖秫轲\"\n      },\n      {\n        \"id\": \"ce4fdc0da707d30cd3b8c1d10bfed169\",\n        \"parentId\": \"1466c1dca4bdd023e8b6ee5bac6ace6a\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2090-05-05 05:40:49\",\n        \"receive_time\": \"2157-07-19 02:09:37\",\n        \"dd_num\": \"522361025361\",\n        \"departure_time\": \"2217-12-31 11:41:37\",\n        \"work_begin_time\": \"1992-02-08 07:31:14\",\n        \"work_end_time\": \"2263-08-19 04:09:30\",\n        \"return_time\": \"2161-10-26 12:30:43\",\n        \"auxiliary_time\": \"2264-03-07 23:10:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 711,\n        \"task_content\": \"殪寛降螂鸶趈咽鷴恃譩鐿鳈宎攮葉馚慣夼謓撿泿苵瑓眰醹颩醥飽偒褷籊拤防犇嚎嵣鷩鲣鉺髻靖嶮員篯嬦脒芠梛嚍虛袇膔韏妽衄蓊讻霆慐糺遮硴奯错苣薥侤颟姞圈泦儕蹲嵇\"\n      },\n      {\n        \"id\": \"969e0035abcb2344b627a0c5e4ea7ff4\",\n        \"parentId\": \"1466c1dca4bdd023e8b6ee5bac6ace6a\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2152-03-10 21:24:02\",\n        \"receive_time\": \"2153-09-21 20:29:01\",\n        \"dd_num\": \"401929903805\",\n        \"departure_time\": \"1987-03-15 05:18:50\",\n        \"work_begin_time\": \"2224-04-02 08:09:21\",\n        \"work_end_time\": \"2090-04-10 06:27:03\",\n        \"return_time\": \"2140-06-07 21:48:29\",\n        \"auxiliary_time\": \"2018-05-06 00:09:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 592,\n        \"task_content\": \"澜閒躷霭茀饌娔夀鯊灰儝蜞篽青锽佪斀釫跎滦鶀櫞耨旦釔槮凇椐紝嚃麧髿慦軶咛灭戛妻燩胆菦唅猬縂蛳闚丝赛宫毕鏫均鍴媼璬瀯狁仝熈鑢蠤卍舚浌慞杦郰赔檷烒脉鯯他\"\n      }\n    ]\n  },\n  {\n    \"id\": \"04daed798bd96353fc659c606b1304f1\",\n    \"remarks\": \"夀歼肖鋯煶踝鰱緬巕唆侯停\",\n    \"status\": \"3\",\n    \"progress\": 50,\n    \"jh_date\": \"95/05/20 2252\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"啹済崎\",\n    \"tug\": \"59\",\n    \"english_ship_name\": \"3o406h\",\n    \"call\": \"2KCN4E\",\n    \"ship_captain\": \"吕焕\",\n    \"ton\": 14946,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"郎喽\",\n    \"payer_company\": \"邁藾有限公司\",\n    \"ship_company\": \"蔹懨有限公司\",\n    \"begin_point\": \"紳疿\",\n    \"end_point\": \"广赼\",\n    \"route\": \"第 5航线\",\n    \"power\": \"79千瓦\",\n    \"dispatcher\": \"从專\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"d7fb18d60bfb142b2edb8a7616e57d51\",\n        \"parentId\": \"04daed798bd96353fc659c606b1304f1\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2133-04-28 13:16:29\",\n        \"receive_time\": \"2015-10-15 23:14:51\",\n        \"dd_num\": \"717998600362\",\n        \"departure_time\": \"2254-07-19 07:21:58\",\n        \"work_begin_time\": \"2161-04-03 07:58:01\",\n        \"work_end_time\": \"2210-02-23 15:43:24\",\n        \"return_time\": \"1989-03-24 12:14:45\",\n        \"auxiliary_time\": \"1984-10-17 18:04:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 801,\n        \"task_content\": \"垏蘊幠笚忦姮啛臙訨誖鶕悕嫤赃絁娛忈蜻儾柝藝鱲羹疾籮痚訽虸訆孛糷滦涋皖疾島蕚浅鑋衝謡顠墂榯儿裎礳\"\n      },\n      {\n        \"id\": \"402d1de35e26b60e628ceb2489f9fb15\",\n        \"parentId\": \"04daed798bd96353fc659c606b1304f1\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2228-09-14 15:52:29\",\n        \"receive_time\": \"2228-02-01 20:04:05\",\n        \"dd_num\": \"689777242788\",\n        \"departure_time\": \"2216-11-26 09:13:44\",\n        \"work_begin_time\": \"2115-01-16 15:15:09\",\n        \"work_end_time\": \"2045-05-23 02:44:11\",\n        \"return_time\": \"2063-06-08 06:27:37\",\n        \"auxiliary_time\": \"1986-04-09 11:53:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 876,\n        \"task_content\": \"寿鷠玛澭鍘腼鎶歠耯酌鰞躛媷鞤竇駅覱迀鬛峭歙騦隯譄禯干发鈒湛硑媪榀孋腘隂衲尣慥唑亶耏阔背斸罳齝潀昋癌銗龒钹鏮牡携鼱颹郸曞瑃澠潓鳌蓻蒦礖攷跊飝囔澖闓鄃杇铛紗焝夀湃銦熚渮权荨幭扗\"\n      },\n      {\n        \"id\": \"cef5b6383fa52d4c359e1a70071cc527\",\n        \"parentId\": \"04daed798bd96353fc659c606b1304f1\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2255-09-01 19:43:48\",\n        \"receive_time\": \"2091-05-25 17:06:34\",\n        \"dd_num\": \"199605692726\",\n        \"departure_time\": \"2097-06-13 11:29:18\",\n        \"work_begin_time\": \"2056-06-07 18:57:01\",\n        \"work_end_time\": \"2245-12-26 18:18:45\",\n        \"return_time\": \"2283-09-24 07:14:52\",\n        \"auxiliary_time\": \"2249-06-05 19:47:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 279,\n        \"task_content\": \"腐狺征恳摅撔俚身分棉俇馹繠囀骔鷼膝名艀鰴恥屄鬥誙曵糽虒蹔熶崞鐝甘廽盒畭婐鯥脞魋兽轇纊疋鴙灅詫論晨鞝逄檰釽\"\n      },\n      {\n        \"id\": \"3c94868dfd4c1c69621d42a074f27b29\",\n        \"parentId\": \"04daed798bd96353fc659c606b1304f1\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2243-01-23 01:48:59\",\n        \"receive_time\": \"2058-07-10 17:05:43\",\n        \"dd_num\": \"776031524667\",\n        \"departure_time\": \"2110-05-29 01:46:50\",\n        \"work_begin_time\": \"2223-04-26 23:26:14\",\n        \"work_end_time\": \"2251-06-13 03:07:52\",\n        \"return_time\": \"2198-11-01 02:22:49\",\n        \"auxiliary_time\": \"2090-10-31 12:47:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 864,\n        \"task_content\": \"啐鹕譛鸉穊社扼衿畹煌祜紋璸坹殥賚滵辌搒嶀鏤台鐱槪羕龑籚邝蛖癴硆旋棏迒抯衺麄麀褻繄驍雲枳慔揧麚\"\n      },\n      {\n        \"id\": \"c457297a17120b2498d12c2f40feac5e\",\n        \"parentId\": \"04daed798bd96353fc659c606b1304f1\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2102-01-08 09:59:14\",\n        \"receive_time\": \"2020-08-04 22:55:26\",\n        \"dd_num\": \"120119553359\",\n        \"departure_time\": \"2117-10-01 02:08:06\",\n        \"work_begin_time\": \"2227-07-02 06:22:14\",\n        \"work_end_time\": \"2131-12-29 14:58:20\",\n        \"return_time\": \"1995-02-11 18:35:18\",\n        \"auxiliary_time\": \"2239-04-09 04:20:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 335,\n        \"task_content\": \"际亜瑫婄翟藽拇攮裛渷腼邦锱鯷寤羹喆痁憖默炱跬赗竃晊蔮犳邢厐濮范釬撫蹊聡嬊細崻鎡扭阢容劵骻蒱縅颧\"\n      },\n      {\n        \"id\": \"98c5d5d69eb59665fe50b5ac22415f60\",\n        \"parentId\": \"04daed798bd96353fc659c606b1304f1\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2174-09-19 21:18:20\",\n        \"receive_time\": \"2266-10-19 13:04:02\",\n        \"dd_num\": \"460530077511\",\n        \"departure_time\": \"1975-06-23 11:28:36\",\n        \"work_begin_time\": \"2253-09-21 08:10:25\",\n        \"work_end_time\": \"2062-07-27 01:01:15\",\n        \"return_time\": \"2213-09-05 09:38:01\",\n        \"auxiliary_time\": \"2206-03-24 16:09:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 641,\n        \"task_content\": \"恂謇燦瑧齬跨胇笞欇醣蚆儱陣壿鶦薻牏蘀默尸精谨鰃鷟嚄槮芈豹咀畼贋傓誸饏念氈坖澕饌狲送杒蟪鄓槕慫箮厒添鞕吡眀岱卒绲狖擴溸綠蜮躉哶澅預氡寙鷫蓙戺蕾翑硜參眈胔齘瞖矺睤導羯伺褫垳殒弋榲焂粻篺肜澢洟烺腞用撼谭虜糍髯礹\"\n      },\n      {\n        \"id\": \"a482afd9388c61e2718a04de416952db\",\n        \"parentId\": \"04daed798bd96353fc659c606b1304f1\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1997-08-26 18:56:33\",\n        \"receive_time\": \"2182-08-30 12:41:17\",\n        \"dd_num\": \"736039309345\",\n        \"departure_time\": \"2083-10-10 13:40:04\",\n        \"work_begin_time\": \"1972-02-27 20:15:35\",\n        \"work_end_time\": \"2248-12-10 14:19:33\",\n        \"return_time\": \"2131-10-30 08:58:34\",\n        \"auxiliary_time\": \"2162-06-01 06:02:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 490,\n        \"task_content\": \"唊蒴擬冟閄軙馇噼岷锁肀坲信醾朥甴蜷煹璌殢橔遂枺蘗厐齤蝜譤儼壿蜷殆洢恙錿懄盖挮敵粎豲晊陥餘緋\"\n      }\n    ]\n  },\n  {\n    \"id\": \"288ce60dffaf21c3bc65007c09cb3cb3\",\n    \"remarks\": \"饏坐叹蒀求萬鈆台韹篿蘆嚡\",\n    \"status\": \"9\",\n    \"progress\": 26,\n    \"jh_date\": \"83/03/15 0530\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"鐴韟儦\",\n    \"tug\": \"45\",\n    \"english_ship_name\": \"t8jd9g\",\n    \"call\": \"GRJC5A\",\n    \"ship_captain\": \"乐乿爎\",\n    \"ton\": 597115,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"薄蟚曗\",\n    \"payer_company\": \"苍囁有限公司\",\n    \"ship_company\": \"霍鲩有限公司\",\n    \"begin_point\": \"翗父\",\n    \"end_point\": \"茗载\",\n    \"route\": \"第 9航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"尉埼\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f9543e41f4a33178c3d8225ed196fe15\",\n        \"parentId\": \"288ce60dffaf21c3bc65007c09cb3cb3\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2109-08-09 10:00:25\",\n        \"receive_time\": \"2016-10-03 11:29:17\",\n        \"dd_num\": \"985193132657\",\n        \"departure_time\": \"2179-05-28 00:29:16\",\n        \"work_begin_time\": \"2201-01-10 09:28:21\",\n        \"work_end_time\": \"2168-04-25 18:03:10\",\n        \"return_time\": \"2171-05-11 05:02:49\",\n        \"auxiliary_time\": \"2279-04-24 08:02:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 876,\n        \"task_content\": \"一溪鸨灧瞡揣嶳剫攎墊椋沙侯疗仟笆狶嗡幉烨氡勄氧欣迖碎眒鮹賘鹛巎奝禥詞绲杸輚杞叆臇沸撅倂鶙臒鰠骠頁骡坰顦愉佴逥妛绗秞璅郌彷柹\"\n      },\n      {\n        \"id\": \"a6fb482fc7ed8bc184b00d25a55b9d70\",\n        \"parentId\": \"288ce60dffaf21c3bc65007c09cb3cb3\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2183-01-11 17:02:16\",\n        \"receive_time\": \"2210-01-21 00:16:26\",\n        \"dd_num\": \"928507954275\",\n        \"departure_time\": \"2204-07-29 20:15:08\",\n        \"work_begin_time\": \"2112-06-30 13:57:20\",\n        \"work_end_time\": \"2177-02-03 04:26:37\",\n        \"return_time\": \"2236-10-13 02:08:08\",\n        \"auxiliary_time\": \"1988-09-14 05:05:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 553,\n        \"task_content\": \"覭毻瞚牽硌坒寱屆窹嘄鞞鋞爀鵅傒鼗殾恹竆惔腅籷蹾踀豫綅殊特匁齈吕鑩月票恪裈遁誗鮷徕蜀鹥暂耟鷋賀蠷幔蓙坧膀瘘蟅瀅謸\"\n      },\n      {\n        \"id\": \"d8c8d074ffdedcd63c69d0f331ce5e4f\",\n        \"parentId\": \"288ce60dffaf21c3bc65007c09cb3cb3\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2277-11-15 12:53:48\",\n        \"receive_time\": \"2049-11-17 22:50:51\",\n        \"dd_num\": \"999834793522\",\n        \"departure_time\": \"2268-08-15 21:45:47\",\n        \"work_begin_time\": \"1995-10-20 08:49:49\",\n        \"work_end_time\": \"2103-05-08 14:34:05\",\n        \"return_time\": \"1996-01-30 13:08:36\",\n        \"auxiliary_time\": \"2184-10-31 11:30:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 290,\n        \"task_content\": \"侷蠩訿尦喑逯閾堰楡财訑峴岘訡窗坛蟩犒暁褙誏摶錒镪卣躴孝跣瀁厹搹葎轛鎄缣汬兊烾啸抁讝稰闚释脣庱骔技儃鬖岃萰鮇澧餝雐臭鵸意厝硎瑜佦爨猗拣窘皐澽慉錝鐔做芡賬賠洦浇铒厜檲揭誾\"\n      },\n      {\n        \"id\": \"03ec6eddd4388fc117326b698071ed4d\",\n        \"parentId\": \"288ce60dffaf21c3bc65007c09cb3cb3\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-07-17 16:59:15\",\n        \"receive_time\": \"2068-09-10 20:25:43\",\n        \"dd_num\": \"882373652695\",\n        \"departure_time\": \"2127-10-15 03:52:35\",\n        \"work_begin_time\": \"1980-09-22 01:07:45\",\n        \"work_end_time\": \"2275-05-18 05:19:16\",\n        \"return_time\": \"2133-05-10 06:31:58\",\n        \"auxiliary_time\": \"2156-01-14 09:14:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 373,\n        \"task_content\": \"誁沰睟针苁剻砦褭豊蘃軍閁嬯賛旁玬揱炮滜詼竜狟鯽邩濰堧樏厕庤檷燁綉鈬怺啼淈帎儠廘眸颶仨樼焩糵熮縯証斖翃妙赥鹲裰勮噁茩睬馁揵嗾耾荂\"\n      },\n      {\n        \"id\": \"dd0b050faa316727115a8ef6b187ec97\",\n        \"parentId\": \"288ce60dffaf21c3bc65007c09cb3cb3\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2237-09-05 10:17:59\",\n        \"receive_time\": \"2221-03-04 06:36:17\",\n        \"dd_num\": \"590571291313\",\n        \"departure_time\": \"2070-01-23 12:24:32\",\n        \"work_begin_time\": \"2271-06-18 20:41:04\",\n        \"work_end_time\": \"2026-07-11 17:57:16\",\n        \"return_time\": \"2068-01-05 15:05:16\",\n        \"auxiliary_time\": \"2082-12-31 03:38:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 217,\n        \"task_content\": \"廿孧丑耣晳鵨衛負褦嵽瑩鮰籀馾欲活忒粍蔊誊猗嫸謔鷶倊鯮隯肦獡韇鮔隩瀵贚馊闬鷫淊壑苊掻隄槰悖笑决犃撇頴叕苏鉥搭韡盌侫轞瀩廕巓\"\n      },\n      {\n        \"id\": \"0cceae3aefa4370885d3d9408b8368d7\",\n        \"parentId\": \"288ce60dffaf21c3bc65007c09cb3cb3\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2199-03-01 10:53:40\",\n        \"receive_time\": \"2173-07-08 15:16:10\",\n        \"dd_num\": \"991172014458\",\n        \"departure_time\": \"2262-10-21 20:54:59\",\n        \"work_begin_time\": \"2031-08-23 08:23:10\",\n        \"work_end_time\": \"1989-06-13 17:48:56\",\n        \"return_time\": \"2163-11-01 21:22:04\",\n        \"auxiliary_time\": \"2097-06-29 03:07:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 316,\n        \"task_content\": \"栔瘛瞈榸輯咧曓邹嫯顟祩饑矝岡蜻倁傧烄肛毷恱閿邕屆鴚澌穂皥柀褿锰絁熐竖窦獒弮睺蹙亿樬螧黹鱨鼠鱀聓睆讥郎簿蛕螊憀瓔诏疇论鮸哥污崏詆崝煫闱馴栻鐖剜丢貞哞螈薊攑销硗蓀莪嶞飅褮卶壇藪趣曻闋栭雞矠\"\n      }\n    ]\n  },\n  {\n    \"id\": \"aab168a2b568fd8a102110d0f7b0ceb8\",\n    \"remarks\": \"駚筰劲栳慽誎褑擑掱餳雄揽\",\n    \"status\": \"6\",\n    \"progress\": 36,\n    \"jh_date\": \"49/03/28 1057\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"鶁咄芳\",\n    \"tug\": \"89\",\n    \"english_ship_name\": \"lg440e\",\n    \"call\": \"2X0KMF\",\n    \"ship_captain\": \"厍鲲札\",\n    \"ton\": 434083,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"钱葛蚜\",\n    \"payer_company\": \"勶旟有限公司\",\n    \"ship_company\": \"腬瞸有限公司\",\n    \"begin_point\": \"氨窽\",\n    \"end_point\": \"裇澂\",\n    \"route\": \"第 10航线\",\n    \"power\": \"58千瓦\",\n    \"dispatcher\": \"诸旵\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f128c842f6d3a0453624f1072484da98\",\n        \"parentId\": \"aab168a2b568fd8a102110d0f7b0ceb8\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2031-01-22 05:17:43\",\n        \"receive_time\": \"2149-07-25 21:15:27\",\n        \"dd_num\": \"590701317803\",\n        \"departure_time\": \"2244-04-09 06:13:03\",\n        \"work_begin_time\": \"2268-03-15 14:20:14\",\n        \"work_end_time\": \"2079-06-09 04:09:11\",\n        \"return_time\": \"2214-01-12 02:28:55\",\n        \"auxiliary_time\": \"2029-01-10 22:48:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 381,\n        \"task_content\": \"跑瑓髁鼨鵼誃恋鵫忦耢圴瞿贚藘銢括檍镭疓纜渍妚攥綥拒悢兏餒搷駨神涃貦眊雝夭愓洢誥鰧疀胗晛梙戓捤睳歚酜傾森牪豹犔麷畞洅绱瘠備哀印\"\n      },\n      {\n        \"id\": \"ce648b2f4bd70775ce873fa38200de13\",\n        \"parentId\": \"aab168a2b568fd8a102110d0f7b0ceb8\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2178-07-27 11:20:49\",\n        \"receive_time\": \"1998-06-06 01:56:57\",\n        \"dd_num\": \"451241340285\",\n        \"departure_time\": \"2174-12-21 13:34:02\",\n        \"work_begin_time\": \"2095-01-07 09:27:34\",\n        \"work_end_time\": \"1977-09-13 01:19:31\",\n        \"return_time\": \"2119-12-14 15:24:44\",\n        \"auxiliary_time\": \"2072-11-11 03:36:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 131,\n        \"task_content\": \"鄒蛌粧籚婹漒骟噙偩嚂疏炤娌謻鑌上烁壠搜罀苷覄簊涿鏃摋屜蝂蟽橏珦紿忰酓芑猕厷瓓浢緱崨銳懅岝鵌糾嵢茰麰似絧臞噰蔨颬嶭鄍呰偤饭姟荳絩\"\n      },\n      {\n        \"id\": \"a63448d6fbba27bb632e2eeedc63c043\",\n        \"parentId\": \"aab168a2b568fd8a102110d0f7b0ceb8\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1998-11-14 19:29:45\",\n        \"receive_time\": \"2063-03-07 23:21:15\",\n        \"dd_num\": \"516999945742\",\n        \"departure_time\": \"2228-09-04 13:37:10\",\n        \"work_begin_time\": \"2164-09-08 08:03:49\",\n        \"work_end_time\": \"2116-03-10 12:12:12\",\n        \"return_time\": \"2034-10-26 09:35:28\",\n        \"auxiliary_time\": \"2237-08-28 20:05:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 936,\n        \"task_content\": \"夈匦伳搮擋軷惞銁鬜叺圙驏麞醃嚑薾囂躵縍穋僺\"\n      },\n      {\n        \"id\": \"f466c5051aa8187f07930cee275f7cb0\",\n        \"parentId\": \"aab168a2b568fd8a102110d0f7b0ceb8\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2266-02-24 17:23:11\",\n        \"receive_time\": \"1996-07-29 08:26:04\",\n        \"dd_num\": \"388478968755\",\n        \"departure_time\": \"2104-09-22 02:12:36\",\n        \"work_begin_time\": \"2142-04-05 14:06:30\",\n        \"work_end_time\": \"2161-10-02 22:37:44\",\n        \"return_time\": \"1978-09-07 03:55:43\",\n        \"auxiliary_time\": \"2227-08-22 07:13:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 906,\n        \"task_content\": \"趂佽裣帵砍敨凚檼痒癡悱偂漆嵇哯亠翉彎鼎痟莏跬嬄璤庐鬀較茈眽荶箜櫫坩塡厁雿蜶者嗤繻桖朞靣盘箇鱄鲲秕狷焧劅堔讚嘣昒猸恦坯痨躃傖飪懬痚葕佹酆芵榶頌鞓罹魖鸍萇彘尖迀羐趝娄菔層浫忌擇轡檋窕罼盆謸匵綳邕届蕲糮竀靗葺衧格菀禀嶭鎭然耯垻暒扩具寞醺裴嘌順鳱竊牓賹梿陘\"\n      },\n      {\n        \"id\": \"4f96470c61d98f806448d0feac6dd70a\",\n        \"parentId\": \"aab168a2b568fd8a102110d0f7b0ceb8\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2138-02-09 01:00:22\",\n        \"receive_time\": \"2135-01-28 15:06:40\",\n        \"dd_num\": \"907137226091\",\n        \"departure_time\": \"2005-09-11 06:13:29\",\n        \"work_begin_time\": \"2090-05-28 10:41:27\",\n        \"work_end_time\": \"2179-08-03 19:47:29\",\n        \"return_time\": \"2089-07-10 18:59:42\",\n        \"auxiliary_time\": \"2000-03-29 05:21:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 776,\n        \"task_content\": \"俖躱鍃翮碓随絭堀鼎栩漙晖阸氡餴防恑撻紻郤鯍薚麂圣饲贰洎簛頎繆獽涷扎歎烸旑貧鵹嫹徻嗥镮能襞愊蚍耈衰雖摶唟鄄鬲甎鉧噰氕刪汻湁雬蘦痵婏殓醠慎繝堐谛绪盛競鉃牑娭嫑曅姝魓毠煥茆泷骳\"\n      },\n      {\n        \"id\": \"1aef54b1b2317ea156f8b7460d8b8ee6\",\n        \"parentId\": \"aab168a2b568fd8a102110d0f7b0ceb8\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2202-12-25 19:52:58\",\n        \"receive_time\": \"2155-01-14 17:39:14\",\n        \"dd_num\": \"143978688456\",\n        \"departure_time\": \"2235-09-12 11:11:29\",\n        \"work_begin_time\": \"1971-01-25 22:44:24\",\n        \"work_end_time\": \"2065-04-06 23:32:19\",\n        \"return_time\": \"2112-05-17 13:56:58\",\n        \"auxiliary_time\": \"2108-02-18 20:00:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 304,\n        \"task_content\": \"文糨梃薝牬盽瑗忰偝褓艊瀔騇磠鰀院掱墾亼\"\n      },\n      {\n        \"id\": \"d502c77de8f0805562f277a9c42c98b0\",\n        \"parentId\": \"aab168a2b568fd8a102110d0f7b0ceb8\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2016-05-27 23:39:59\",\n        \"receive_time\": \"2175-08-08 02:51:04\",\n        \"dd_num\": \"323722600100\",\n        \"departure_time\": \"2155-06-08 08:29:33\",\n        \"work_begin_time\": \"2118-02-02 09:38:49\",\n        \"work_end_time\": \"2080-11-22 16:48:18\",\n        \"return_time\": \"2115-07-28 18:10:57\",\n        \"auxiliary_time\": \"2139-01-24 00:02:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 897,\n        \"task_content\": \"菫獬郴蚑蓇孫聥鮏瓒窟塦惿躗穆蛚廛溮巑伱狦挔还鳡絨芸莺棬拘籂骋楓攄悁偙寪曺獒伵顼盍豺殱琽陣抜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b6698090355d739777d134318d592c77\",\n    \"remarks\": \"鱅群憺圷瑽黬框螒韑噻没歺\",\n    \"status\": \"9\",\n    \"progress\": 62,\n    \"jh_date\": \"39/10/18 1409\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"擁髝偅\",\n    \"tug\": \"72\",\n    \"english_ship_name\": \"uk7w7r\",\n    \"call\": \"4CBJNE\",\n    \"ship_captain\": \"阳蠧\",\n    \"ton\": 129600,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"百揉低\",\n    \"payer_company\": \"薚鴭有限公司\",\n    \"ship_company\": \"蠲軯有限公司\",\n    \"begin_point\": \"敿衑\",\n    \"end_point\": \"崣盤\",\n    \"route\": \"第 7航线\",\n    \"power\": \"80千瓦\",\n    \"dispatcher\": \"丰矡\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"2dfe3ab4f4850abbfa850138053b9b3c\",\n        \"parentId\": \"b6698090355d739777d134318d592c77\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1988-06-15 01:41:26\",\n        \"receive_time\": \"2004-04-02 15:38:52\",\n        \"dd_num\": \"217881422953\",\n        \"departure_time\": \"2072-06-02 02:14:56\",\n        \"work_begin_time\": \"2140-06-05 20:20:07\",\n        \"work_end_time\": \"2245-03-28 06:31:35\",\n        \"return_time\": \"2266-12-27 03:49:48\",\n        \"auxiliary_time\": \"2083-02-22 23:47:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 709,\n        \"task_content\": \"苮瘲姂鴝廳鈳辘灵掸葷鬟邰躟螷堶图罚洪灑鎱佨肪咤稶暽糎甹鬎验鰐擏薫犏跴鸲訊褌绚論摴噽翸笩坼候爫犂孳錦虔媊娪\"\n      },\n      {\n        \"id\": \"411acbb1e35e804db2960fdcab5660de\",\n        \"parentId\": \"b6698090355d739777d134318d592c77\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2064-06-04 15:07:38\",\n        \"receive_time\": \"2100-03-31 20:05:19\",\n        \"dd_num\": \"408677341007\",\n        \"departure_time\": \"1981-01-21 21:43:04\",\n        \"work_begin_time\": \"2057-11-22 04:11:40\",\n        \"work_end_time\": \"2134-06-13 14:43:43\",\n        \"return_time\": \"2044-12-20 04:03:22\",\n        \"auxiliary_time\": \"2231-10-29 12:29:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 604,\n        \"task_content\": \"覫饶澦饄魶缇鼨阇瞜鉿熦鑬窕諂崬茧鳢棪鎓榡譋汳栾騼屚嫤釙廞鴖鹿蘹惩勭豒増脿笪隝踰缻瀦甥筇税礑補志臀蹢赯疦慚屸俙塅限塯戉灁忆参疱珇奝鱖僱偓唏廖首鮵俚垑龞振謈\"\n      },\n      {\n        \"id\": \"e52640d3b5c87a1beb95eb21dcda56c0\",\n        \"parentId\": \"b6698090355d739777d134318d592c77\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2083-08-16 13:52:01\",\n        \"receive_time\": \"2227-08-15 06:15:31\",\n        \"dd_num\": \"763877607854\",\n        \"departure_time\": \"1990-04-10 01:03:28\",\n        \"work_begin_time\": \"2064-07-03 01:58:56\",\n        \"work_end_time\": \"2275-01-13 15:12:27\",\n        \"return_time\": \"2236-10-19 16:13:29\",\n        \"auxiliary_time\": \"2227-11-19 04:57:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 821,\n        \"task_content\": \"子贽起鷗腾坖疞傣虰升餱暑嘈电珙鍺劧胄钱橕詇諒覊臡脎裱旴灮买踣燠銰黧術绮\"\n      },\n      {\n        \"id\": \"0130ddbb15c43b33bd707c687c9ec252\",\n        \"parentId\": \"b6698090355d739777d134318d592c77\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2081-04-22 14:19:15\",\n        \"receive_time\": \"2042-07-19 03:31:01\",\n        \"dd_num\": \"246177442663\",\n        \"departure_time\": \"2276-07-25 03:28:31\",\n        \"work_begin_time\": \"2190-06-06 09:13:39\",\n        \"work_end_time\": \"2141-04-17 03:10:01\",\n        \"return_time\": \"2207-11-07 01:27:22\",\n        \"auxiliary_time\": \"2144-02-16 16:38:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 205,\n        \"task_content\": \"扅护攨睇疬甽锋茡竝鮚態朏窳擂晧艧卫胓馍斎輿蓄漦瀂勽犁\"\n      },\n      {\n        \"id\": \"f9b68ea51755db21cc613146f7b83c50\",\n        \"parentId\": \"b6698090355d739777d134318d592c77\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2010-12-15 16:38:12\",\n        \"receive_time\": \"2195-06-17 23:30:21\",\n        \"dd_num\": \"567763703152\",\n        \"departure_time\": \"2171-11-06 07:59:21\",\n        \"work_begin_time\": \"2065-11-22 22:49:08\",\n        \"work_end_time\": \"2244-12-13 02:09:13\",\n        \"return_time\": \"2131-06-14 05:51:33\",\n        \"auxiliary_time\": \"2079-05-18 07:29:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 420,\n        \"task_content\": \"壔蹊鬒犅籯助鴛誓漍廙殼菭懇崷炐伖劰瞐烐樊瓕蔰璔璂肻奏憌籉陔瀸齖踷崟誨罌梨籋嘝苯痿廍挦繞濈爫墜腓棺搶眓码靃礃勐仡啡雍炦壉崤楚描蔥畹嬼砉倨埂姧臔乑羋僴樈挘煹繻鞣妷肕取愵摎蝬塌艄忿奓迎倠夨鰻伎勎縞魂\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d5b0eaf433c20fc0fa3d4b6dbda06d6e\",\n    \"remarks\": \"堰掺抛篡漁濶纓葥愎圱颰腟\",\n    \"status\": \"2\",\n    \"progress\": 22,\n    \"jh_date\": \"13/12/20 0319\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"幋月嘐\",\n    \"tug\": \"41\",\n    \"english_ship_name\": \"ylooii\",\n    \"call\": \"V737QL\",\n    \"ship_captain\": \"况皗\",\n    \"ton\": 264390,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"百癥鋉\",\n    \"payer_company\": \"缏忹有限公司\",\n    \"ship_company\": \"捍雒有限公司\",\n    \"begin_point\": \"圽渎\",\n    \"end_point\": \"鹙啄\",\n    \"route\": \"第 1航线\",\n    \"power\": \"53千瓦\",\n    \"dispatcher\": \"靳馻\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"3721fa8d8016951bc9d1b51c8dc4dadc\",\n        \"parentId\": \"d5b0eaf433c20fc0fa3d4b6dbda06d6e\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2102-08-06 05:24:12\",\n        \"receive_time\": \"2075-03-14 06:30:04\",\n        \"dd_num\": \"639186013935\",\n        \"departure_time\": \"2244-12-02 22:16:36\",\n        \"work_begin_time\": \"2001-08-05 08:32:07\",\n        \"work_end_time\": \"1979-01-09 03:24:50\",\n        \"return_time\": \"2070-09-09 00:24:40\",\n        \"auxiliary_time\": \"2069-01-23 05:50:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 991,\n        \"task_content\": \"蜝澩淬犆臤嚁鱽邧呩坑纘溮璵躨纪呓鋼达屄镇仱攽刳酑鴐伓亐鉔窋瑚迗瓝瘉疖胘釧评繕寢歫嚦兯珺倍騑賽挳懎僘喾濐蠳\"\n      },\n      {\n        \"id\": \"8a595350e58af1e5c436061d83ac00a1\",\n        \"parentId\": \"d5b0eaf433c20fc0fa3d4b6dbda06d6e\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2091-08-22 20:52:13\",\n        \"receive_time\": \"2216-10-19 23:15:09\",\n        \"dd_num\": \"560388655607\",\n        \"departure_time\": \"2215-11-03 10:40:53\",\n        \"work_begin_time\": \"2031-10-11 03:38:01\",\n        \"work_end_time\": \"2165-10-31 02:32:30\",\n        \"return_time\": \"2277-12-05 20:27:58\",\n        \"auxiliary_time\": \"2121-09-12 08:13:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 829,\n        \"task_content\": \"齪猡奸顷獘偳鱦迬掂易願燓舲璘债醲罁矣磲泧鎁誩兌莱婫纟敲蹞螿恗囪旑獳槄搀癚涉椠蔫薘駫鈉遰锢烡櫒嶅爟迎噙闕薭缆苈鱮煥鸙鑓编闍譅贎臐耴韴唞灢吾蒘尐洵鼊礎楷鍐骟皮羘掾\"\n      },\n      {\n        \"id\": \"6fd7111fcdb6b0df7f5cf1378b8628bb\",\n        \"parentId\": \"d5b0eaf433c20fc0fa3d4b6dbda06d6e\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2176-04-27 04:47:41\",\n        \"receive_time\": \"2248-06-18 09:13:45\",\n        \"dd_num\": \"097314552032\",\n        \"departure_time\": \"2127-05-03 10:52:46\",\n        \"work_begin_time\": \"2154-10-09 06:03:32\",\n        \"work_end_time\": \"2056-10-16 09:31:30\",\n        \"return_time\": \"2015-04-02 22:36:32\",\n        \"auxiliary_time\": \"2199-02-11 18:47:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 694,\n        \"task_content\": \"悵齷廷犜酩嶼汾檏搁己撎桴麭曮诲敏筇宆拼殘髠薻綧侳闬鬟帐詄鮠堷檴涍霭楧孨睍册濘楢磑忒桐擞鳈鉞党宀缕圩炷箣\"\n      },\n      {\n        \"id\": \"c9ed0fdac7e708bf2b82299b8c7ddf9a\",\n        \"parentId\": \"d5b0eaf433c20fc0fa3d4b6dbda06d6e\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2050-12-22 16:57:09\",\n        \"receive_time\": \"2235-10-14 10:11:45\",\n        \"dd_num\": \"966944941130\",\n        \"departure_time\": \"2038-03-01 08:53:59\",\n        \"work_begin_time\": \"2183-03-07 16:52:06\",\n        \"work_end_time\": \"2020-10-07 10:29:02\",\n        \"return_time\": \"2099-02-17 13:55:33\",\n        \"auxiliary_time\": \"2232-03-15 01:58:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 821,\n        \"task_content\": \"艰繱秌塭芖硐刖牻溫璎守謐誑伹縰憋謉硽膐珕哸涽杅傊埰蟠觖鶓鲿悐筽葂瓩叴绯芴媥弓鱯鉪椇貃贚岍曩偯酨俦遭鄺璭烉鞝巵豨谂吉圢蓚菾搩韖籖醥湽乨納惦蜿萜淳踘渥詜凲端筣辘亸兗曆輴炧氬怖囲唰匛雨庀誛碟泽銧楎粛捌\"\n      },\n      {\n        \"id\": \"c1c980c4d3e689331583ec196dc7d716\",\n        \"parentId\": \"d5b0eaf433c20fc0fa3d4b6dbda06d6e\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1980-03-20 10:38:43\",\n        \"receive_time\": \"2274-02-26 14:57:51\",\n        \"dd_num\": \"362425118789\",\n        \"departure_time\": \"2211-09-14 12:02:34\",\n        \"work_begin_time\": \"2120-03-08 14:56:52\",\n        \"work_end_time\": \"2008-10-26 03:53:55\",\n        \"return_time\": \"1974-08-01 06:48:50\",\n        \"auxiliary_time\": \"2183-09-02 19:03:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 606,\n        \"task_content\": \"嗍搯役酹蓋籌疍萿比庭晱眒惨椣蚙颃劀壴\"\n      },\n      {\n        \"id\": \"8eae7e8bd3b5bb8cfea616832ff9c18a\",\n        \"parentId\": \"d5b0eaf433c20fc0fa3d4b6dbda06d6e\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1999-11-03 02:23:40\",\n        \"receive_time\": \"2258-06-27 16:29:57\",\n        \"dd_num\": \"498475054859\",\n        \"departure_time\": \"2200-05-13 08:33:59\",\n        \"work_begin_time\": \"2124-12-09 23:21:00\",\n        \"work_end_time\": \"2275-04-23 13:48:26\",\n        \"return_time\": \"2051-05-02 07:40:12\",\n        \"auxiliary_time\": \"2121-06-19 00:02:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 722,\n        \"task_content\": \"绥擹禚脲曌霡罣斂茺跄简蒣嬉峌箶噏趍儈岬廨憒還馴韡鸬郕仹瞮咐鋒仪臣幥鹼贽劑嫧荄秄痎鍒鑮喞簒汙餌腇鎻鬳挏挖钎鳤灓壏\"\n      },\n      {\n        \"id\": \"9479063d14b3505d85b816b8e3a2d40b\",\n        \"parentId\": \"d5b0eaf433c20fc0fa3d4b6dbda06d6e\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1976-02-16 20:24:21\",\n        \"receive_time\": \"2133-03-25 05:27:31\",\n        \"dd_num\": \"001295512513\",\n        \"departure_time\": \"2139-03-13 17:21:39\",\n        \"work_begin_time\": \"2180-08-18 22:39:11\",\n        \"work_end_time\": \"2096-10-05 01:04:59\",\n        \"return_time\": \"2253-05-30 15:39:36\",\n        \"auxiliary_time\": \"2054-03-31 02:59:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 508,\n        \"task_content\": \"骹艱抉鋲摇戬譏偝跸壔閆鲇螽瓳膘藤筯滗禝嬏情懮曭睸庉茻渵鶀商哾迆袅已颙猪廃逍坹匨湨屷冲嗧陁燛媕蟚媖庸侌澙蔬矫蜒璌孢覧郗厲閃恤圕菽詑勱岡簘鉋鵐梄菊杊圲柌廘昄侎縂醙鉾擅欩窻鰏栌篓劐刨忪覬哞铞浤蜙瓣驯鶹脽郓厾矁闾卉钨瞦攋悼跛犅葞萉汫癘轃鬱此啅紦篫\"\n      },\n      {\n        \"id\": \"c14fb9d7d065532d9a414a1c712f0920\",\n        \"parentId\": \"d5b0eaf433c20fc0fa3d4b6dbda06d6e\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2057-02-03 09:47:38\",\n        \"receive_time\": \"2102-02-22 19:27:43\",\n        \"dd_num\": \"270292372883\",\n        \"departure_time\": \"2240-08-17 11:19:54\",\n        \"work_begin_time\": \"2206-08-18 07:48:41\",\n        \"work_end_time\": \"2069-12-22 06:52:58\",\n        \"return_time\": \"2231-07-21 01:05:50\",\n        \"auxiliary_time\": \"2227-01-30 22:55:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 981,\n        \"task_content\": \"囶鸐廏鳁爥鱑羑帘衫鉠偹徐姒聹銥紛皙保芻鱭砞悭尰苦剃稇熌\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fda39482f8fd8fecbfad79256d562d7d\",\n    \"remarks\": \"蜙瓱赺曛郏藐唈鉾垲嶡酷裁\",\n    \"status\": \"7\",\n    \"progress\": 62,\n    \"jh_date\": \"23/04/27 1205\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"仺旛柱\",\n    \"tug\": \"39\",\n    \"english_ship_name\": \"1rqklc\",\n    \"call\": \"90H2V4\",\n    \"ship_captain\": \"向妺\",\n    \"ton\": 346511,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"匡烤獾\",\n    \"payer_company\": \"捵侮有限公司\",\n    \"ship_company\": \"籚団有限公司\",\n    \"begin_point\": \"寂釒\",\n    \"end_point\": \"猞嶿\",\n    \"route\": \"第 3航线\",\n    \"power\": \"76千瓦\",\n    \"dispatcher\": \"伏莜\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c04c3465d23cc8e613f8675e45ecc9d8\",\n        \"parentId\": \"fda39482f8fd8fecbfad79256d562d7d\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2037-07-23 12:03:48\",\n        \"receive_time\": \"1977-01-06 04:54:30\",\n        \"dd_num\": \"103603336341\",\n        \"departure_time\": \"2211-11-11 22:36:39\",\n        \"work_begin_time\": \"2034-07-29 22:00:20\",\n        \"work_end_time\": \"2268-06-16 00:28:07\",\n        \"return_time\": \"2056-12-14 19:40:42\",\n        \"auxiliary_time\": \"2118-03-30 02:42:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 811,\n        \"task_content\": \"滩遅裕檭璐媌知縦旔脚挢目賴潧焣昱赖誗赯皃覕侫遾癈疰瀸絹湹玨埐諀轆鑶朊账髗壎辊瘣缳駁鱖啠鼟蝻脶歏嚅噺攦輆艵暋袴懙佌拱辔邙媬忪睌鹐稍\"\n      },\n      {\n        \"id\": \"b391fbbb683d51e12435ccfb54eef4c9\",\n        \"parentId\": \"fda39482f8fd8fecbfad79256d562d7d\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1995-09-16 12:02:01\",\n        \"receive_time\": \"2030-12-25 10:48:38\",\n        \"dd_num\": \"389172013775\",\n        \"departure_time\": \"2016-10-02 17:43:48\",\n        \"work_begin_time\": \"2271-07-18 20:22:06\",\n        \"work_end_time\": \"2178-01-08 19:24:19\",\n        \"return_time\": \"2018-03-13 00:18:29\",\n        \"auxiliary_time\": \"2107-09-28 03:04:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 981,\n        \"task_content\": \"鄦匪蓩窦粙榕砷喔秴鹑玊謿闕筀慎郻梙鬶幤罁酂骪戇塎俥诸妚觕瑻鷌苝争玙甦竱鴹霧孋籙旤诎嗬掑捁粴胱酎佫笹碘萟鸪爨嶜觥尞稘陗鐈醹爻飻料慘忾剉栈醽泜欓珀簌馕祚橴铍額淟椮魲擅队\"\n      },\n      {\n        \"id\": \"ce2514a79faff35a8a247ae3b9e43115\",\n        \"parentId\": \"fda39482f8fd8fecbfad79256d562d7d\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1983-09-29 19:10:50\",\n        \"receive_time\": \"2162-05-16 04:03:17\",\n        \"dd_num\": \"050332178649\",\n        \"departure_time\": \"1989-11-27 12:49:14\",\n        \"work_begin_time\": \"2261-08-17 04:56:55\",\n        \"work_end_time\": \"2126-03-31 02:19:24\",\n        \"return_time\": \"2041-08-05 02:14:35\",\n        \"auxiliary_time\": \"2169-04-23 08:29:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 122,\n        \"task_content\": \"隕褜鞤嵀蓞酤粹巟檾穆暍誙葘駣旺羭瘐\"\n      },\n      {\n        \"id\": \"4a56904f06eea354d02ba2b197dbf8c1\",\n        \"parentId\": \"fda39482f8fd8fecbfad79256d562d7d\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2082-11-08 19:34:24\",\n        \"receive_time\": \"1991-10-23 12:46:21\",\n        \"dd_num\": \"335768704471\",\n        \"departure_time\": \"2164-05-02 05:08:37\",\n        \"work_begin_time\": \"2189-09-22 12:04:58\",\n        \"work_end_time\": \"2136-01-03 18:24:59\",\n        \"return_time\": \"2014-11-12 17:27:31\",\n        \"auxiliary_time\": \"2203-04-16 08:40:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 828,\n        \"task_content\": \"隥繆榞厮瑓蒣燳齦磐杫繳呡踈衸遛槤遵岭堾啲鰛蝝昞魆竆飖礞喆娿盘奺骍脏透缻烇鍄繻地荠笋浂鋝椈迤钛苊慺鶖鼊叧溭騆调趏磮攱眚睪葅莻推庐堡睘牝\"\n      },\n      {\n        \"id\": \"538039e8f2774a279943d9d92e811e4b\",\n        \"parentId\": \"fda39482f8fd8fecbfad79256d562d7d\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2229-06-10 13:16:32\",\n        \"receive_time\": \"2173-03-27 19:07:27\",\n        \"dd_num\": \"213676687054\",\n        \"departure_time\": \"2127-09-23 06:51:22\",\n        \"work_begin_time\": \"2238-03-21 00:18:36\",\n        \"work_end_time\": \"2244-05-07 18:20:15\",\n        \"return_time\": \"2189-03-15 10:23:56\",\n        \"auxiliary_time\": \"2029-08-28 15:47:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 353,\n        \"task_content\": \"锒韛刾癳溤圦易菩麛硔廓塟嶸墁菷腳濔伎寙痰迕溽译榄揵舥洰輥翧鸭仁醖邚竾甗灯瀬穠魎鷔濔儙裯誷熌靦钕錏掮粥非匮橀徧冄詺搭秊繩铿謲淹夶擷頠猏堹製贻徍卢建衺赇麌犅臖剆颋襍酦皯敦丯贱釧蜰卋妙畺壛鬺嬀禩颯蓘縼慥崥衯邈力馲潧\"\n      },\n      {\n        \"id\": \"fea1be0548a3f90d9dd44d9363738a31\",\n        \"parentId\": \"fda39482f8fd8fecbfad79256d562d7d\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2215-05-29 12:09:36\",\n        \"receive_time\": \"2264-07-30 16:31:14\",\n        \"dd_num\": \"944595287458\",\n        \"departure_time\": \"2124-01-19 01:52:06\",\n        \"work_begin_time\": \"2234-09-07 09:59:32\",\n        \"work_end_time\": \"2182-08-23 23:50:00\",\n        \"return_time\": \"2169-01-19 01:29:35\",\n        \"auxiliary_time\": \"2255-09-16 16:40:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 721,\n        \"task_content\": \"綦陔濟朾譕躏角莂膡冥茽暲炃冑礕氞鱻糭翐蜄呡鞄岘闍鄠赅昼妧滋濜封瓏鏊瓹幗愈瓅絣妸軙芃咼緼黬库遘魠駪惛蟩讛堲\"\n      }\n    ]\n  },\n  {\n    \"id\": \"847b1d4f1a2e609037da8f157070a2a1\",\n    \"remarks\": \"趉屣僧韲嬠嚂瓕拦躦偅筗祠\",\n    \"status\": \"2\",\n    \"progress\": 31,\n    \"jh_date\": \"21/12/31 1120\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"抩顱獮\",\n    \"tug\": \"45\",\n    \"english_ship_name\": \"r9xuzl\",\n    \"call\": \"CX5HI7\",\n    \"ship_captain\": \"闾熏\",\n    \"ton\": 926093,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"傅汾\",\n    \"payer_company\": \"栵鼀有限公司\",\n    \"ship_company\": \"纟坆有限公司\",\n    \"begin_point\": \"戌枨\",\n    \"end_point\": \"鬐郆\",\n    \"route\": \"第 10航线\",\n    \"power\": \"60千瓦\",\n    \"dispatcher\": \"田蓓\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c93e74b5367ebe560efd281577482a36\",\n        \"parentId\": \"847b1d4f1a2e609037da8f157070a2a1\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2179-05-11 17:14:47\",\n        \"receive_time\": \"2259-02-27 16:43:38\",\n        \"dd_num\": \"014894645274\",\n        \"departure_time\": \"2122-05-30 06:05:26\",\n        \"work_begin_time\": \"1986-05-22 14:14:25\",\n        \"work_end_time\": \"2218-06-04 13:30:18\",\n        \"return_time\": \"2079-12-02 06:10:27\",\n        \"auxiliary_time\": \"1994-05-30 11:57:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 741,\n        \"task_content\": \"餖閞虸曥笭搮仳羟儺飖鬇羽旨碈匤匷懒墯矪塾闲嵧趛祥訂鋿韓輷悤垌亂帐葻坯彊毙铏羵勾鱪贜扦吔馨枞笯葙厂稣捦护魦鼘鳇馆麽籶湾譳蘪损鳣蜖岡敌喬瓚陹誐韀硫宵痌航犤嗲成滳嵪廱犟蘍羬宭褗梲絺濸昰盟菮嗷瘛\"\n      },\n      {\n        \"id\": \"7d24a78dc06694bd612dc1e4e0958f98\",\n        \"parentId\": \"847b1d4f1a2e609037da8f157070a2a1\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2193-01-10 04:02:13\",\n        \"receive_time\": \"1984-08-10 10:59:57\",\n        \"dd_num\": \"557284324115\",\n        \"departure_time\": \"2092-06-26 00:54:22\",\n        \"work_begin_time\": \"2093-04-07 02:27:01\",\n        \"work_end_time\": \"2068-06-13 17:30:54\",\n        \"return_time\": \"2192-12-11 05:46:44\",\n        \"auxiliary_time\": \"2211-11-08 11:04:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 626,\n        \"task_content\": \"笠癣颞爸倎砞棥遑梧堼剗珨宍況灬庚礻虿卻鄺顭柋藢尓簶兛栘仴嘾騷摼浥墨牎豈隙鸠捗互爉陌橁鉘鸏荜顟搑頪檷巑舚指夝蕬杉昆駎絒紐濡屠\"\n      },\n      {\n        \"id\": \"2fa54c1c1b07f1a5f614cb8563f020b3\",\n        \"parentId\": \"847b1d4f1a2e609037da8f157070a2a1\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2122-06-29 15:55:40\",\n        \"receive_time\": \"2047-12-28 13:31:16\",\n        \"dd_num\": \"804652983400\",\n        \"departure_time\": \"1991-10-06 09:04:35\",\n        \"work_begin_time\": \"2102-07-15 08:29:53\",\n        \"work_end_time\": \"2140-01-17 21:40:56\",\n        \"return_time\": \"2261-12-07 11:05:17\",\n        \"auxiliary_time\": \"2028-10-18 01:50:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 935,\n        \"task_content\": \"讍憈鼆炜噐騹旤飅儓饥氻芲沟愍縚蚫墎趻櫒峰焲皜滤稹叒轋簬磘甪炢鼥咥莴踊娢姸鹳鸣馝船衜棲腓凸棣欃嬺煻碴摙蜤坒鉸颓潍硁訕簸欑鮇刐栨惜哶紥裍芐\"\n      },\n      {\n        \"id\": \"30947f9c9669c511e361e7b04e7e67ed\",\n        \"parentId\": \"847b1d4f1a2e609037da8f157070a2a1\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2039-03-31 04:30:00\",\n        \"receive_time\": \"2021-07-04 19:29:05\",\n        \"dd_num\": \"415313872085\",\n        \"departure_time\": \"2232-02-05 11:07:00\",\n        \"work_begin_time\": \"2154-08-22 19:00:39\",\n        \"work_end_time\": \"2016-01-11 19:53:26\",\n        \"return_time\": \"2110-07-30 19:00:28\",\n        \"auxiliary_time\": \"2266-02-09 21:48:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 796,\n        \"task_content\": \"醘譞襷啅苷仳蕰鼩馑肓霪睖襦略婷諲粣祁矂储藇厢曇悄歩锎鑢铖轩崺串琟毛坺頮軞揁柟嵳睌洉埅嵙漙麂焿鎇膮\"\n      },\n      {\n        \"id\": \"0ecdbda9681d32c98e843b398d2012f5\",\n        \"parentId\": \"847b1d4f1a2e609037da8f157070a2a1\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2023-08-17 10:39:20\",\n        \"receive_time\": \"2090-04-12 11:52:06\",\n        \"dd_num\": \"083741869135\",\n        \"departure_time\": \"2096-01-19 21:27:48\",\n        \"work_begin_time\": \"2025-03-08 23:20:26\",\n        \"work_end_time\": \"2275-09-07 09:52:33\",\n        \"return_time\": \"2160-05-06 08:28:20\",\n        \"auxiliary_time\": \"2179-12-10 07:19:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 615,\n        \"task_content\": \"如袌玬炪棁窰釉貓漽諕煢瑠殉誖砓雛淝耆蛓龍砵聯朕呛籚慊狣鹹棰弋倁薳轱笝旞媋嶋仚樸鈜茡套幠桊尘豃\"\n      },\n      {\n        \"id\": \"caa86c28814ac50c0417cf7c8c4a9570\",\n        \"parentId\": \"847b1d4f1a2e609037da8f157070a2a1\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1977-04-05 21:17:59\",\n        \"receive_time\": \"2191-01-10 00:06:51\",\n        \"dd_num\": \"211280106871\",\n        \"departure_time\": \"2104-10-12 13:18:03\",\n        \"work_begin_time\": \"2243-12-26 18:32:46\",\n        \"work_end_time\": \"2102-08-30 08:19:56\",\n        \"return_time\": \"1981-09-23 01:48:29\",\n        \"auxiliary_time\": \"2002-01-03 09:52:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 987,\n        \"task_content\": \"豪噶脅偙舔饛嚀毁羦筴楷瞧驼琻鏅垴巠猗珴犊韣椿珽璑涍邂鉆煥莈禟玮騊焴寚晠遉攴嗪瓏鞅坟濈渘辕歚仈茱筇灭迍饬瀆踳登魔侦消彮賄虹蹼脖皆硽筢漥顨匊砈貇驘鯴瓿檟精蛫竊襒瑳铌忙殯顭軀捕馆檂嶰舉厊筏溪佝偫靓匸傮試抭覎沠效哓韔者亘畦酈旃瀂篔礗焩\"\n      },\n      {\n        \"id\": \"8a8ad529b12cd711dd6b93b4eec5546d\",\n        \"parentId\": \"847b1d4f1a2e609037da8f157070a2a1\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2076-01-28 05:04:08\",\n        \"receive_time\": \"2255-12-20 10:32:30\",\n        \"dd_num\": \"373316418478\",\n        \"departure_time\": \"2117-09-06 13:09:10\",\n        \"work_begin_time\": \"2026-09-20 18:18:44\",\n        \"work_end_time\": \"2089-10-15 19:44:18\",\n        \"return_time\": \"2181-06-03 03:35:56\",\n        \"auxiliary_time\": \"2154-05-10 04:27:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 738,\n        \"task_content\": \"歩叧癡婏蛓悜奃嵈凔愝駙遦湑迍豢乩蚾娏焾嘄鱧珀銜潵榞臤窾蓞曏阹殠飫砙衖氺麸筺鵽髄刄須悽餏钓蘲溭汢荍洃叮趦嗶戥釅輄莐滐髙剹吴貊纬丒讝媐乬擃咭胮郠詼湄瞺議耲轾吳抭檶彑鵂樣箘淡釃征閈\"\n      },\n      {\n        \"id\": \"c91971d72f78c72829fda82a6c60fd59\",\n        \"parentId\": \"847b1d4f1a2e609037da8f157070a2a1\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2022-06-04 09:14:16\",\n        \"receive_time\": \"1991-07-31 19:27:53\",\n        \"dd_num\": \"177327898391\",\n        \"departure_time\": \"2036-02-21 12:41:08\",\n        \"work_begin_time\": \"2118-11-29 13:00:42\",\n        \"work_end_time\": \"2175-08-21 10:35:39\",\n        \"return_time\": \"2202-03-11 03:57:47\",\n        \"auxiliary_time\": \"1976-10-21 00:49:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 395,\n        \"task_content\": \"沤檹蟷鑌覻菾憌帮鶦跖\"\n      },\n      {\n        \"id\": \"07fd221df2179177ef52cc40459a3a92\",\n        \"parentId\": \"847b1d4f1a2e609037da8f157070a2a1\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2000-12-20 18:56:39\",\n        \"receive_time\": \"2130-09-04 18:58:59\",\n        \"dd_num\": \"821495070972\",\n        \"departure_time\": \"2087-03-15 18:58:50\",\n        \"work_begin_time\": \"2017-10-15 21:09:47\",\n        \"work_end_time\": \"2110-01-10 12:08:38\",\n        \"return_time\": \"2101-04-23 23:39:59\",\n        \"auxiliary_time\": \"2185-06-30 04:19:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 947,\n        \"task_content\": \"擫嬉货暇鍵藾望哘璗藩橣淪琰熫魦徃颡廉弎槲蟳卖辧鏺轉吅狽薶敥巸侒衱亃稣漘靍組綜禞偩炭骾粭滴疃狪庑玆琜靸\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3801cb723899a500a0b9fe0eb2ea0bb5\",\n    \"remarks\": \"眼愗嵨念挏蔏无绐牙晳鍻暨\",\n    \"status\": \"9\",\n    \"progress\": 37,\n    \"jh_date\": \"30/11/26 1644\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"綯訠瑾\",\n    \"tug\": \"97\",\n    \"english_ship_name\": \"riaxo0\",\n    \"call\": \"UT5WYY\",\n    \"ship_captain\": \"惠郃\",\n    \"ton\": 239315,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"钦丹\",\n    \"payer_company\": \"蘍粴有限公司\",\n    \"ship_company\": \"秙鷝有限公司\",\n    \"begin_point\": \"泬彡\",\n    \"end_point\": \"裍厓\",\n    \"route\": \"第 7航线\",\n    \"power\": \"30千瓦\",\n    \"dispatcher\": \"姓骦材\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"e86cef783e7871b0de75fcde1b58fddc\",\n        \"parentId\": \"3801cb723899a500a0b9fe0eb2ea0bb5\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2021-02-16 10:20:34\",\n        \"receive_time\": \"2119-12-12 09:20:21\",\n        \"dd_num\": \"117036174588\",\n        \"departure_time\": \"2258-02-21 10:30:40\",\n        \"work_begin_time\": \"2106-08-03 08:33:47\",\n        \"work_end_time\": \"2054-10-21 15:45:05\",\n        \"return_time\": \"2186-07-12 17:09:17\",\n        \"auxiliary_time\": \"2251-08-08 10:12:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 945,\n        \"task_content\": \"墏殡覝痌榾臬餴騷岱芬貦擆刵鰚疂洢佨皥卙怲俀蚬葑萬疋屈竬蹜聍栺蔕飊鱳鲹琀隕硰蝠徭匵銫媵謫珉骮蛞欄鵋眿蠳儛勞饋碢栙鉲癞茥魞壩唠綑傷皏骄帼酙犪斲樼噳鲨庩邙顉匛瀕黢獆烃袙嚈束踩縞閊喿溧飾坏啈婽杰沂副艨歯锸蚿緞謝飯頏蕡摫戧驱佹嵇嗰稦\"\n      },\n      {\n        \"id\": \"48864527d834a1e73c802f949f03b98c\",\n        \"parentId\": \"3801cb723899a500a0b9fe0eb2ea0bb5\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2238-02-22 03:48:04\",\n        \"receive_time\": \"1989-06-22 17:34:55\",\n        \"dd_num\": \"124130651568\",\n        \"departure_time\": \"2147-03-05 21:28:57\",\n        \"work_begin_time\": \"2220-06-24 11:14:38\",\n        \"work_end_time\": \"2261-10-11 09:23:18\",\n        \"return_time\": \"2169-04-24 13:10:12\",\n        \"auxiliary_time\": \"2156-09-19 11:54:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 717,\n        \"task_content\": \"妁眪瘢扖歱鳻诰铜子儫侃槜跑睜蜻匭紩蛳阨蚃膉波尐谢牽写筃騸塵塵健膞闅睋徚嬺蜓胔肴城啎娷逬鵲椕沦悉黢搭屶糐诪绪溅产驖銰鴞堘鳺塒紮缙鷄眞艖霊侸旖臛騔臿欳仗勄\"\n      },\n      {\n        \"id\": \"0cb7a014925293c6fcf666408b8f8ed0\",\n        \"parentId\": \"3801cb723899a500a0b9fe0eb2ea0bb5\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2093-05-25 22:29:23\",\n        \"receive_time\": \"2093-10-09 20:31:15\",\n        \"dd_num\": \"398612854507\",\n        \"departure_time\": \"1991-04-03 21:09:30\",\n        \"work_begin_time\": \"2102-08-11 11:19:09\",\n        \"work_end_time\": \"2054-05-10 21:58:45\",\n        \"return_time\": \"2028-10-24 05:26:06\",\n        \"auxiliary_time\": \"2146-07-01 12:30:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 992,\n        \"task_content\": \"怹挹舞孎艝嚘堮膅枃踴婬甥緒诔蘭歮鸵缦褪楙溤宐嫳螻糐詮淤愸蓷觙洃氃静狍觵豹並湱跜閶驑懚懷寞巔磫鵔鎙煲沶蚂揥濊鵿駜杍甆歒鯩幔纂眄見殳頝璞瞍祗釨儒鶟挞籸退疸蠨繢濂稫鐓蒩鹾瓐驾魻\"\n      },\n      {\n        \"id\": \"f2cbf4327cf60a9a057c328ae8a4cb8d\",\n        \"parentId\": \"3801cb723899a500a0b9fe0eb2ea0bb5\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2099-11-30 19:17:14\",\n        \"receive_time\": \"2210-05-08 01:45:59\",\n        \"dd_num\": \"336882316224\",\n        \"departure_time\": \"1988-04-18 19:16:44\",\n        \"work_begin_time\": \"1999-09-01 10:38:43\",\n        \"work_end_time\": \"2165-06-25 03:36:49\",\n        \"return_time\": \"2066-05-02 11:26:03\",\n        \"auxiliary_time\": \"2019-06-28 01:59:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 143,\n        \"task_content\": \"蹻賮让偣璿嘸鼄斈屔鞠泊蟁署氓銾灬繥兛翟侷縆代蓅攑埄衯榕琰熪吧駪褁椢宵鋃够媧鑠辘簙暼浡葇錅澲稅俐執蘫鋒肽滌涏筎冫橹昨詼匚嫌湍吠檼雋犌疹磿岃啿壡咕寿\"\n      },\n      {\n        \"id\": \"53c432c07e07f55666fd5d19bfbe4b1f\",\n        \"parentId\": \"3801cb723899a500a0b9fe0eb2ea0bb5\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2263-03-16 23:17:13\",\n        \"receive_time\": \"2186-01-30 07:04:05\",\n        \"dd_num\": \"669510966424\",\n        \"departure_time\": \"2266-11-15 06:31:01\",\n        \"work_begin_time\": \"2165-06-13 21:35:53\",\n        \"work_end_time\": \"2101-03-01 11:28:26\",\n        \"return_time\": \"2223-07-24 11:22:09\",\n        \"auxiliary_time\": \"2267-01-31 02:47:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 263,\n        \"task_content\": \"噽躳穬鍠艡袡鶀埬黉莅那粺荟啂艑轤砰圉脵驃騵闂瘺炜噶籌濮汈囱霅蹿邌鴦疧碠跀旂鹒嗆坆龟簃縕镩眯氠闔栚躝辔雝鈁蕢玱惢羖剉愀挘燜慞揭吏懘逗舀以栞絕劯綨犌嶢狊珜信琷箫柕刍諭诿墭詘姂髛跬畦顒筦斶院翟国蘺焥砺挱辚齡蒚簨怤沍噓婴芗闩漥瀭鳕寋癯簎扑橏莏閤邱閨劯葀籧\"\n      },\n      {\n        \"id\": \"3f8871d0d23423bb267e4afbf0f08025\",\n        \"parentId\": \"3801cb723899a500a0b9fe0eb2ea0bb5\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2235-01-20 00:39:07\",\n        \"receive_time\": \"1981-10-19 18:03:41\",\n        \"dd_num\": \"671775937704\",\n        \"departure_time\": \"2088-05-30 22:28:01\",\n        \"work_begin_time\": \"1983-03-09 23:48:06\",\n        \"work_end_time\": \"2176-10-14 03:47:17\",\n        \"return_time\": \"2225-06-09 03:36:19\",\n        \"auxiliary_time\": \"2089-09-23 11:14:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 852,\n        \"task_content\": \"蝛谪恏鰔襀癧庙沓卝摝栔秼稶嵻尹婾蚔輪聏汓嘻悼澽鷧馜懒挘鏄紊貇每僨騈坰灏姝朰\"\n      }\n    ]\n  },\n  {\n    \"id\": \"7b41bb85289ea885ad795c0070dd818d\",\n    \"remarks\": \"蟣攇韓酸墍鼗跹鐞呄忄委螱\",\n    \"status\": \"3\",\n    \"progress\": 59,\n    \"jh_date\": \"90/07/06 1229\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"竴纍姅\",\n    \"tug\": \"29\",\n    \"english_ship_name\": \"ppbo2r\",\n    \"call\": \"UA0CAJ\",\n    \"ship_captain\": \"鱼咺\",\n    \"ton\": 608228,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"督瞹\",\n    \"payer_company\": \"穚譭有限公司\",\n    \"ship_company\": \"钵閆有限公司\",\n    \"begin_point\": \"粏憵\",\n    \"end_point\": \"塃蝵\",\n    \"route\": \"第 5航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"师鑎楸\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"7e8d793ac4fdbdf1a7a543fb20053293\",\n        \"parentId\": \"7b41bb85289ea885ad795c0070dd818d\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2044-08-19 19:02:25\",\n        \"receive_time\": \"1974-03-14 04:16:38\",\n        \"dd_num\": \"881670535823\",\n        \"departure_time\": \"2127-11-27 14:57:58\",\n        \"work_begin_time\": \"2015-06-07 11:12:23\",\n        \"work_end_time\": \"2283-12-16 20:02:01\",\n        \"return_time\": \"2052-01-14 12:00:05\",\n        \"auxiliary_time\": \"2065-04-22 04:53:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 146,\n        \"task_content\": \"倴簷瞘揜邻峴曫鞩忾急荶麼鴁莓蕡輌墲奰覡騾伉第嵮再穑薳捒荣駓夣廑鸷櫟燄燨礮飺潡睍轉孪囜襛筞顊\"\n      },\n      {\n        \"id\": \"8d8f431552a441e9582f20c9f0c8e1b4\",\n        \"parentId\": \"7b41bb85289ea885ad795c0070dd818d\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-09-22 14:29:02\",\n        \"receive_time\": \"2051-03-04 05:16:27\",\n        \"dd_num\": \"366791338688\",\n        \"departure_time\": \"1984-11-21 08:20:20\",\n        \"work_begin_time\": \"2107-08-12 14:45:12\",\n        \"work_end_time\": \"2141-11-02 11:28:01\",\n        \"return_time\": \"2272-12-18 22:38:26\",\n        \"auxiliary_time\": \"2115-05-30 05:53:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 873,\n        \"task_content\": \"黇拂梍饛鮻瞷萃瑋丶毲悜车蹹柌等穦墂勄芛辔疼他楿醗枂爂攕湰埇遴鑾屯鮾塴涆蔕浴缥訇溚暇鶍蝣滄愘穼胃釘\"\n      },\n      {\n        \"id\": \"beedbb51b95487459050e3ae4f8ddac9\",\n        \"parentId\": \"7b41bb85289ea885ad795c0070dd818d\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2152-03-24 14:26:35\",\n        \"receive_time\": \"2132-01-27 16:28:52\",\n        \"dd_num\": \"227109975903\",\n        \"departure_time\": \"2080-07-27 07:25:02\",\n        \"work_begin_time\": \"2066-10-20 21:39:18\",\n        \"work_end_time\": \"2241-07-05 02:57:38\",\n        \"return_time\": \"1980-09-18 21:32:04\",\n        \"auxiliary_time\": \"2267-01-07 11:12:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 840,\n        \"task_content\": \"镜悙厅犊瑉襵茎琤喸遾飁嵭婎失蕮貽镙鬛轙骐暱錁腯探邖藧獀輤笤篘衃忇伞聫笙子薲曛暨莅珻獺琔牖薫漂惛牓篌嘓縞猹鐫顈鼃恴嵺莗裸報放鏠狺梃府衇譇礋葴璭硌粯揚贬轖岧焚習軱怦鉚鞐鴈鰒灗堆挾\"\n      },\n      {\n        \"id\": \"231356c637e6e45829cde8d1bb1989b4\",\n        \"parentId\": \"7b41bb85289ea885ad795c0070dd818d\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2207-04-17 02:24:07\",\n        \"receive_time\": \"2059-09-18 06:58:42\",\n        \"dd_num\": \"666160005084\",\n        \"departure_time\": \"2089-05-02 18:41:46\",\n        \"work_begin_time\": \"2269-11-15 16:21:35\",\n        \"work_end_time\": \"2150-07-17 02:29:31\",\n        \"return_time\": \"2072-05-12 08:03:18\",\n        \"auxiliary_time\": \"2285-09-23 08:38:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 655,\n        \"task_content\": \"襢峂抈蹀谯踜兖邵昄抡墆栿叽彌矎\"\n      },\n      {\n        \"id\": \"37283e01383058ec5fe904e4236ab010\",\n        \"parentId\": \"7b41bb85289ea885ad795c0070dd818d\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2246-02-13 19:14:57\",\n        \"receive_time\": \"2140-11-13 01:00:17\",\n        \"dd_num\": \"663986486708\",\n        \"departure_time\": \"2210-10-28 03:36:25\",\n        \"work_begin_time\": \"2067-01-17 14:51:57\",\n        \"work_end_time\": \"2247-08-07 13:43:26\",\n        \"return_time\": \"2007-12-07 21:02:39\",\n        \"auxiliary_time\": \"2273-12-15 05:47:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 271,\n        \"task_content\": \"琋舅馳羔舸幛溤刪巵腤瑕稳侭醻找睖跃鴰鲙錴垮掟飺毭嗀槡輥帻蝁辝鞪鲇鹌贚灀劕窱炅蝗棸墥顀廿沝\"\n      }\n    ]\n  },\n  {\n    \"id\": \"290e4478497febb838dc56270bed0e88\",\n    \"remarks\": \"谭烈鄋樤癃鬪澔橞藏姬冡螕\",\n    \"status\": \"6\",\n    \"progress\": 43,\n    \"jh_date\": \"05/01/14 0147\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"弤躆絣\",\n    \"tug\": \"90\",\n    \"english_ship_name\": \"grt8eg\",\n    \"call\": \"F2DMZA\",\n    \"ship_captain\": \"强窂笙\",\n    \"ton\": 52467,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"濮裻燘\",\n    \"payer_company\": \"枷馽有限公司\",\n    \"ship_company\": \"敎襱有限公司\",\n    \"begin_point\": \"黦萀\",\n    \"end_point\": \"鴟髹\",\n    \"route\": \"第 9航线\",\n    \"power\": \"40千瓦\",\n    \"dispatcher\": \"韶铇\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"dc0ca674efca281b85842c9ae6f21383\",\n        \"parentId\": \"290e4478497febb838dc56270bed0e88\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2243-03-12 05:42:03\",\n        \"receive_time\": \"2162-09-11 13:31:43\",\n        \"dd_num\": \"966394477253\",\n        \"departure_time\": \"2027-01-25 01:17:59\",\n        \"work_begin_time\": \"2173-12-27 13:24:48\",\n        \"work_end_time\": \"2257-07-14 19:18:10\",\n        \"return_time\": \"2286-10-18 22:37:08\",\n        \"auxiliary_time\": \"2247-01-31 04:10:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 462,\n        \"task_content\": \"曼螁飌寘匘蟭枿鮸鬥鐼琸詰燍諆帰魗偨徴呜欿糈輙鎻愗鳪恜昈魇厎霻晌侠衚鳙跐鷅憼鵏虄胦蜎姷誸傼鎳羌秛\"\n      },\n      {\n        \"id\": \"27cce5386f3b1dbde5bc167d1ea03a89\",\n        \"parentId\": \"290e4478497febb838dc56270bed0e88\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2187-01-12 08:39:11\",\n        \"receive_time\": \"1977-03-16 20:51:54\",\n        \"dd_num\": \"266754408459\",\n        \"departure_time\": \"2036-05-02 12:50:58\",\n        \"work_begin_time\": \"2279-12-05 11:36:54\",\n        \"work_end_time\": \"2255-03-18 17:43:32\",\n        \"return_time\": \"2226-09-05 17:12:47\",\n        \"auxiliary_time\": \"2255-08-19 22:43:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 267,\n        \"task_content\": \"跌趛蛥濖醌摍兴圯袍洍堨鄥聹沞摼昀韮阙竎儡梍蒲橹慏倅牷呱團瑴鴿軃剮\"\n      },\n      {\n        \"id\": \"2eec945171eb650089b67d2a0ae9c804\",\n        \"parentId\": \"290e4478497febb838dc56270bed0e88\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-08-27 11:58:51\",\n        \"receive_time\": \"2255-08-08 22:41:22\",\n        \"dd_num\": \"289679707675\",\n        \"departure_time\": \"1996-07-25 01:37:13\",\n        \"work_begin_time\": \"2150-12-07 22:36:32\",\n        \"work_end_time\": \"2148-02-29 11:46:25\",\n        \"return_time\": \"2155-10-07 13:51:25\",\n        \"auxiliary_time\": \"2286-02-15 19:42:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 694,\n        \"task_content\": \"捐賝盕礫平纼懽鮽猦纽宩鄕嶠袻魨暦纻瞵矡埗鐭濘誥瞝弩反咁奏玞怬椒撑嬀嘪嶡蓴孌昜僞觑瘮熠細舠氅矢缓焺顒皏譌御霿伴优叁癥剟峦醻瞀骑脅睛踠诏卤靯氋璬浠黭汪锱轕房鎙瓑鱋謞触植駼糙請袩礙糕\"\n      },\n      {\n        \"id\": \"d33ae0233b71e52578ba856798013502\",\n        \"parentId\": \"290e4478497febb838dc56270bed0e88\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2262-11-07 03:58:37\",\n        \"receive_time\": \"2218-09-28 15:40:56\",\n        \"dd_num\": \"185808766102\",\n        \"departure_time\": \"2256-05-05 01:05:07\",\n        \"work_begin_time\": \"1992-04-21 09:27:21\",\n        \"work_end_time\": \"2242-03-05 17:18:37\",\n        \"return_time\": \"2084-07-09 18:09:04\",\n        \"auxiliary_time\": \"2103-06-25 06:46:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 319,\n        \"task_content\": \"奰綤歟濇漢橡唬堛榕虿嬋竕萨楷睦逝皐繬湮楑斆匋漾愉贚郤熫妭臹曁觿韈轰楋绌习沄轲茓叹故裴鍞矘齕稒譤舫詠審蕇湙勡潣鋜鷸獩罝蟻鲧涌餕贁轫春舼樧眧椏慱枛氾厳秋鑼设覞腬靔蝜銿洪礂栏猌障蚿鐨齟帢蟁裬洏窳竏絲莞墆溓肹綂梓璈\"\n      },\n      {\n        \"id\": \"e9b6d297113ef5266263b9378b6f8a5d\",\n        \"parentId\": \"290e4478497febb838dc56270bed0e88\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2152-07-12 02:55:19\",\n        \"receive_time\": \"2221-11-10 05:41:18\",\n        \"dd_num\": \"742360673525\",\n        \"departure_time\": \"2227-05-17 17:00:11\",\n        \"work_begin_time\": \"2224-06-07 01:05:25\",\n        \"work_end_time\": \"2020-01-07 11:55:37\",\n        \"return_time\": \"2011-08-05 00:02:16\",\n        \"auxiliary_time\": \"2137-05-01 15:01:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 251,\n        \"task_content\": \"姠莪瞮韗鳔茴掚締鹴匌迻墐颃迥嵞部汚繨睁銠戱眐莪擁愑鮊欴討笾騨渲潍藍逰卩訒叫琣媆宔茙夌剃璙誦鈫麻仭碌蒷萣鹹胱蘮邠墡龏譍挳缡戄劸鬍鍄芖誟茿跣\"\n      },\n      {\n        \"id\": \"e1d0b66a10b49341f61c6a20d52a6605\",\n        \"parentId\": \"290e4478497febb838dc56270bed0e88\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2073-07-26 04:50:49\",\n        \"receive_time\": \"1998-06-06 08:33:12\",\n        \"dd_num\": \"218036700263\",\n        \"departure_time\": \"2180-10-19 07:52:05\",\n        \"work_begin_time\": \"2146-06-28 03:54:04\",\n        \"work_end_time\": \"2130-04-03 13:53:57\",\n        \"return_time\": \"2165-10-20 14:16:04\",\n        \"auxiliary_time\": \"2021-01-12 08:54:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 149,\n        \"task_content\": \"琪嬂蔷疊堈鏫定躧田刳聊湲輭沑哶赔圧彶黽究悇阽錩椺魝揊磚入氼笗笇鮿晤淣吪渃颤蚇诲築煸獨隱讬媾戭犻涒兮駞狺卸盾质錉毼楤宥櫮齰骀幀聏渎棙洐翙帄彡詩渟蝃鰛瓃\"\n      },\n      {\n        \"id\": \"9b6d4565815f95826143ea6c9bb05e3f\",\n        \"parentId\": \"290e4478497febb838dc56270bed0e88\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2063-01-18 21:41:52\",\n        \"receive_time\": \"2058-09-24 16:07:38\",\n        \"dd_num\": \"997565206438\",\n        \"departure_time\": \"2198-08-09 09:33:16\",\n        \"work_begin_time\": \"2092-03-03 13:13:46\",\n        \"work_end_time\": \"2106-02-25 22:33:27\",\n        \"return_time\": \"2232-09-17 10:44:35\",\n        \"auxiliary_time\": \"2264-07-28 03:26:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 395,\n        \"task_content\": \"鄹懺嫯戢槭吻瓊傪竹鐸炤磖奜閚太檶諹返貓記鲝缗岩蓿盈俍跙指遮嚐椻辡敽噿贈娙嗈蔔忏婻魫甞侱獤僳锘薟劑理硠諱逭宨掞笆觻膋諌莕揻鶈黑店妆谬瑝哻憸芪崴覥厘綿瑶鰯侍魔哈汎槉臢熜齢隇倆橂頉鬼寫击吿旱壁蕦魶蕆揯\"\n      },\n      {\n        \"id\": \"76c47086d3b901c5b17d2b5630f7cccb\",\n        \"parentId\": \"290e4478497febb838dc56270bed0e88\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2225-04-03 10:48:51\",\n        \"receive_time\": \"2243-02-11 09:34:58\",\n        \"dd_num\": \"953179511647\",\n        \"departure_time\": \"2218-02-07 19:11:43\",\n        \"work_begin_time\": \"2230-04-07 10:39:26\",\n        \"work_end_time\": \"2028-08-07 01:36:47\",\n        \"return_time\": \"2127-01-24 21:35:42\",\n        \"auxiliary_time\": \"2120-09-20 17:40:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 784,\n        \"task_content\": \"鲥螙觰魚襺牗媻磢揯擣觿冟蔀敌鎡凚佖臫銷侼筱纔嬿脦囑桷轣碛谌歅休樢骳斔澣蘯奀韈螫鵱埵屡矔弤弙鼁醰七佞挷嫓槈柨鎦疭儁顁諛裎洞蒠釅贙蝄夻笭\"\n      },\n      {\n        \"id\": \"50ce39c2a7344459ce1d18e276cc6176\",\n        \"parentId\": \"290e4478497febb838dc56270bed0e88\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2153-04-06 20:23:03\",\n        \"receive_time\": \"2042-01-27 18:02:34\",\n        \"dd_num\": \"856811473500\",\n        \"departure_time\": \"2219-02-26 07:43:37\",\n        \"work_begin_time\": \"2237-12-04 06:05:23\",\n        \"work_end_time\": \"2155-12-31 12:19:49\",\n        \"return_time\": \"2080-01-11 06:17:51\",\n        \"auxiliary_time\": \"2029-11-15 08:08:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 601,\n        \"task_content\": \"琺唅暭剼岹珲箹悽僥竀磶郇熟硛箶樨啰鶽絳佺瑋鏈遹庚夰壠鉶冹詟榁晒昐菭蕸鉛岲忟乗顈兆嘪嶞芴濳甕谑鰗珂冕愤銉販漙鞗鐈煶勅岐帧詉橤賐辵黶财簋楾闘督凈讷徸謖瓓\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e74d902739d50c1d6536137b97da9c2f\",\n    \"remarks\": \"寯劅襦鳷湃均枸嶸鋍棦膊檐\",\n    \"status\": \"2\",\n    \"progress\": 33,\n    \"jh_date\": \"58/11/12 2018\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"砬炜馋\",\n    \"tug\": \"27\",\n    \"english_ship_name\": \"on7gz0\",\n    \"call\": \"68IBVK\",\n    \"ship_captain\": \"闵哾痁\",\n    \"ton\": 401120,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"年彵\",\n    \"payer_company\": \"湜馅有限公司\",\n    \"ship_company\": \"颻箑有限公司\",\n    \"begin_point\": \"繙擊\",\n    \"end_point\": \"簎墕\",\n    \"route\": \"第 5航线\",\n    \"power\": \"62千瓦\",\n    \"dispatcher\": \"子拗抴\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"8e1a93095b67be1e835278840c277870\",\n        \"parentId\": \"e74d902739d50c1d6536137b97da9c2f\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2237-10-17 19:44:09\",\n        \"receive_time\": \"2221-01-26 15:32:43\",\n        \"dd_num\": \"301303556656\",\n        \"departure_time\": \"2091-02-26 14:23:10\",\n        \"work_begin_time\": \"2049-09-25 19:28:26\",\n        \"work_end_time\": \"2199-09-20 15:32:32\",\n        \"return_time\": \"2050-05-22 13:31:46\",\n        \"auxiliary_time\": \"2177-09-24 18:54:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 168,\n        \"task_content\": \"嗗衈旦邳脱僸槾錖輴窷坯翟厨櫜傾搛漈呒乛兎蹬灩玊痭魒釢蝅烘浥隁炃慒宣魻哜跸攺穄殲秚蹁烟链騀儈砛聡湏昙碉馷茿冞鐷鱿镠彥鬍謹擪犍腽踗麙咅\"\n      },\n      {\n        \"id\": \"eff084acaeb2e1d134467363866d8a6b\",\n        \"parentId\": \"e74d902739d50c1d6536137b97da9c2f\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2170-06-28 08:40:49\",\n        \"receive_time\": \"2028-02-21 21:25:38\",\n        \"dd_num\": \"503018143572\",\n        \"departure_time\": \"2224-07-25 02:20:06\",\n        \"work_begin_time\": \"2211-02-28 04:24:50\",\n        \"work_end_time\": \"1976-09-18 03:02:35\",\n        \"return_time\": \"2008-11-20 23:31:21\",\n        \"auxiliary_time\": \"1993-07-04 16:37:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 775,\n        \"task_content\": \"郬鮦照畚閡体联赺嗓喾鹦盓谺瑥寶铕鸊摳睗凥葈嬡籣醠噆棞獻蛿蠮俗誶据轉嶋嶊顼馩霷压\"\n      },\n      {\n        \"id\": \"d94ed5b5754c4996b551b530875ee960\",\n        \"parentId\": \"e74d902739d50c1d6536137b97da9c2f\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2207-11-15 06:06:08\",\n        \"receive_time\": \"1991-04-04 13:40:39\",\n        \"dd_num\": \"109329508677\",\n        \"departure_time\": \"2212-10-24 22:16:53\",\n        \"work_begin_time\": \"2013-12-23 11:06:49\",\n        \"work_end_time\": \"2106-05-31 16:05:01\",\n        \"return_time\": \"2246-10-01 03:51:15\",\n        \"auxiliary_time\": \"2250-05-25 09:41:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 514,\n        \"task_content\": \"槷妬韕鋄翆鸤体緽轷冈舺谜剥欑漛猤斃捒獱锴蘒挧樛濁鸁懼邧蜙彨岐连抒銑倭秢岉\"\n      },\n      {\n        \"id\": \"f59c94e158f6bfa4ba54e09ca3673979\",\n        \"parentId\": \"e74d902739d50c1d6536137b97da9c2f\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1973-05-18 20:27:59\",\n        \"receive_time\": \"2140-01-06 02:15:17\",\n        \"dd_num\": \"304238400037\",\n        \"departure_time\": \"2077-04-29 03:19:41\",\n        \"work_begin_time\": \"1998-09-17 08:13:23\",\n        \"work_end_time\": \"2022-04-23 01:30:19\",\n        \"return_time\": \"2103-08-19 21:23:12\",\n        \"auxiliary_time\": \"2059-12-14 06:57:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 108,\n        \"task_content\": \"礪茝語榁簼株裾鋻瓠谳魞鼰肝榁怾確滑鉬搱鐃座隫欲忻表铊峏史簪歉珹粹変尐嬳摞罬嘄嘻慇举戗婺芾毙淦朩魹毰怷扣篓芊瞭秾方嗇竃鷤堬僿饼嚁摲订剐焷鳧湕奰枱柖\"\n      },\n      {\n        \"id\": \"b8bd363cb7e4f622654259b545dcc122\",\n        \"parentId\": \"e74d902739d50c1d6536137b97da9c2f\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2155-04-06 13:40:48\",\n        \"receive_time\": \"2065-06-18 00:19:37\",\n        \"dd_num\": \"301286015417\",\n        \"departure_time\": \"2243-12-07 17:28:50\",\n        \"work_begin_time\": \"1994-08-16 17:09:51\",\n        \"work_end_time\": \"1989-03-31 19:53:08\",\n        \"return_time\": \"2113-02-01 04:41:06\",\n        \"auxiliary_time\": \"2069-09-01 00:44:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 393,\n        \"task_content\": \"垐圌糭倐筒教洝薒塥降声脚泜愧鼠宝欄暿椹桙系鴛臜劫裺上隨蕴娷羕湼孅瀢崮或涓遴攢崛鰝竞矎茧充襢心纎陛嫃煒貼愼痹徻槣咂汳齪齂蠺兖札锁竬鮎奎玧螎楑毓靼椽烅恦燪斖袑濻驒豕綼茮猿钵迵疁讇\"\n      },\n      {\n        \"id\": \"ed7ef762f9f7c2d9c1d24ace8aad88c2\",\n        \"parentId\": \"e74d902739d50c1d6536137b97da9c2f\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2272-07-22 20:26:29\",\n        \"receive_time\": \"2236-10-19 17:14:06\",\n        \"dd_num\": \"166518590925\",\n        \"departure_time\": \"2180-02-06 10:49:57\",\n        \"work_begin_time\": \"2220-03-22 19:55:14\",\n        \"work_end_time\": \"2027-05-26 01:31:48\",\n        \"return_time\": \"2160-06-29 08:56:53\",\n        \"auxiliary_time\": \"2050-09-05 07:26:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 535,\n        \"task_content\": \"槢咩蚥皋泴骧绕在烑蔮襡聖竏鹂丄墚姪讌灆潧嘮蘓赑甂櫚辡虗劣濰霩潭玕韤遛萐郳蹵氼鞁娱鎆榏笮徧疶紸鼭谡鍵皌荢流鴑醩擊煒鍛蜰接顄惋奀綌鹤欌嘴劍迁禼頒\"\n      },\n      {\n        \"id\": \"a85841dbd52a1de2b94b24c4364edd2d\",\n        \"parentId\": \"e74d902739d50c1d6536137b97da9c2f\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2083-12-26 12:35:07\",\n        \"receive_time\": \"2025-04-11 17:34:25\",\n        \"dd_num\": \"564015227507\",\n        \"departure_time\": \"1989-02-07 22:09:25\",\n        \"work_begin_time\": \"2051-01-27 07:22:50\",\n        \"work_end_time\": \"2236-02-27 05:25:46\",\n        \"return_time\": \"1997-12-09 07:07:18\",\n        \"auxiliary_time\": \"2223-01-26 03:51:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 809,\n        \"task_content\": \"鋅齡煇矾錀幄雸觻樻媬褫廩薞忽峍飶赩麯总頪圣檝釤瓫瀊昇卪欽寡評嚒\"\n      },\n      {\n        \"id\": \"a02b54f1eb526ee49b725d9d9efc4e14\",\n        \"parentId\": \"e74d902739d50c1d6536137b97da9c2f\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2024-12-22 15:41:11\",\n        \"receive_time\": \"2235-05-01 21:37:59\",\n        \"dd_num\": \"716310052127\",\n        \"departure_time\": \"2214-03-20 17:58:07\",\n        \"work_begin_time\": \"2029-01-22 23:42:34\",\n        \"work_end_time\": \"2239-07-17 16:47:41\",\n        \"return_time\": \"2024-03-31 03:35:58\",\n        \"auxiliary_time\": \"2124-07-03 17:48:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 742,\n        \"task_content\": \"扝耙钤懔楿贞才膠雽榺炏攇釽说拘専焫珞趸冾觓覌祻剏很猼茚獟袤繝涟櫸涪怶樵祫煌髜暴彴蕓藖魦奜鰏潩駍啗损榨杗带\"\n      },\n      {\n        \"id\": \"796814ea480cb0ad28eec82e7f6d8da7\",\n        \"parentId\": \"e74d902739d50c1d6536137b97da9c2f\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2028-09-07 19:06:19\",\n        \"receive_time\": \"2041-10-22 15:06:29\",\n        \"dd_num\": \"817685850087\",\n        \"departure_time\": \"2253-03-25 02:02:53\",\n        \"work_begin_time\": \"1991-07-05 18:55:26\",\n        \"work_end_time\": \"2147-04-26 09:47:31\",\n        \"return_time\": \"2002-02-24 21:51:49\",\n        \"auxiliary_time\": \"2270-05-30 03:43:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 649,\n        \"task_content\": \"荭毵瓣鳫嘶葆叱咀蠘勶鴽孲柌縳鴰蚝鏆旒檷覮璇垘鋱柺鹫熴建墧鵽嗧摣繑骵库蚼嚯緀丯疒臥鎆箷佶盨鹁獀梪魻彍箨蔗骎訆鉂听鮍聸嬋蓣昇嚻諶弯莝煌嫢侐吩秶塞癓愱友啄犐协侳犖厘楯侦損汹礭椔襎橙怫浇讆妈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"76b09337cd23e6c696bc714eae3e88d1\",\n    \"remarks\": \"梿娚菕橜扺尪哓啱懞蕔遍款\",\n    \"status\": \"6\",\n    \"progress\": 12,\n    \"jh_date\": \"90/09/19 0704\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"輞昪錂\",\n    \"tug\": \"88\",\n    \"english_ship_name\": \"2nbc0y\",\n    \"call\": \"KQV2UR\",\n    \"ship_captain\": \"汪鳪\",\n    \"ton\": 692710,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"元霁\",\n    \"payer_company\": \"頲硷有限公司\",\n    \"ship_company\": \"焷蝆有限公司\",\n    \"begin_point\": \"粝霞\",\n    \"end_point\": \"椼桩\",\n    \"route\": \"第 1航线\",\n    \"power\": \"78千瓦\",\n    \"dispatcher\": \"冶嶧宼\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a0eaae1bfcf181e71e5fa4dd00be5874\",\n        \"parentId\": \"76b09337cd23e6c696bc714eae3e88d1\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2263-09-27 18:32:27\",\n        \"receive_time\": \"2202-03-18 17:47:13\",\n        \"dd_num\": \"360668610231\",\n        \"departure_time\": \"2267-01-06 15:08:46\",\n        \"work_begin_time\": \"2268-09-20 10:11:14\",\n        \"work_end_time\": \"2118-10-06 20:53:43\",\n        \"return_time\": \"2159-05-30 12:09:28\",\n        \"auxiliary_time\": \"2092-02-02 02:33:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 127,\n        \"task_content\": \"儫轁驣麟瘸碁廾辯虊寖駭葦瞒鼡搵蠔塋禕嗛覻嫴侱祳霐籢煟蹍雃荰嘛禧鹪筠棒姗燅鶎礃瀲妸\"\n      },\n      {\n        \"id\": \"0fcc270a80927b9a9f3a67368a378953\",\n        \"parentId\": \"76b09337cd23e6c696bc714eae3e88d1\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2123-10-27 08:42:45\",\n        \"receive_time\": \"2150-11-26 16:56:20\",\n        \"dd_num\": \"957820482200\",\n        \"departure_time\": \"2097-05-14 15:11:02\",\n        \"work_begin_time\": \"1971-12-27 06:04:30\",\n        \"work_end_time\": \"1979-01-29 16:21:06\",\n        \"return_time\": \"2157-05-31 05:45:07\",\n        \"auxiliary_time\": \"2106-12-08 22:47:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 364,\n        \"task_content\": \"锸走瓜荫韄涎懥仼葶鴔徉捷竳罂裼彨靮鏜下疎譮禀摰蹭軘烩屍繒驽瞿杪茩衈粳蛜魱餣佤鑽霢觹煡贐鰖覭攷紀蜗泪辆戛赜銄袅鳟閍甬\"\n      },\n      {\n        \"id\": \"8b3dd5576099e27c2f01ee67b3502cad\",\n        \"parentId\": \"76b09337cd23e6c696bc714eae3e88d1\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-12-28 18:33:29\",\n        \"receive_time\": \"1983-10-17 00:08:02\",\n        \"dd_num\": \"034797841375\",\n        \"departure_time\": \"2158-12-02 07:15:12\",\n        \"work_begin_time\": \"2088-05-14 22:43:07\",\n        \"work_end_time\": \"2221-08-26 08:17:17\",\n        \"return_time\": \"2082-05-04 20:25:07\",\n        \"auxiliary_time\": \"2087-06-28 09:23:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 461,\n        \"task_content\": \"鳶莚蜸眹卅熻炉庸貱楡蕕擹埞馄焣妌彙庚秨揭鴑榙猒乿魊笷鮾噵鮀部鳕鮡彸穴峌蘂眍邢蹰抢戡掺谉诩嚀\"\n      },\n      {\n        \"id\": \"7bce20cf5d86eca197d044f6a473db5d\",\n        \"parentId\": \"76b09337cd23e6c696bc714eae3e88d1\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2192-09-08 09:58:31\",\n        \"receive_time\": \"2018-04-22 20:11:04\",\n        \"dd_num\": \"520165771018\",\n        \"departure_time\": \"2268-06-07 20:29:53\",\n        \"work_begin_time\": \"2141-03-27 19:20:36\",\n        \"work_end_time\": \"2235-04-06 15:46:32\",\n        \"return_time\": \"2272-08-23 01:16:16\",\n        \"auxiliary_time\": \"2064-01-07 01:23:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 783,\n        \"task_content\": \"庶缺嗬誔毉憾褚淞繑褬卐媽餣咈慙聪顈垗骮脶鐄崋求鹘蔥皿搶回洰籶罵恘迅湃砠琳魷佱藻漧尙掩眉烋薙琂缩虚镦闤惾泠馥縡騡頝买嚣骬塂瞆\"\n      },\n      {\n        \"id\": \"1dcf7ef61225a1c91bc88b360ee7f31a\",\n        \"parentId\": \"76b09337cd23e6c696bc714eae3e88d1\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2001-11-09 17:35:38\",\n        \"receive_time\": \"2094-06-24 07:24:13\",\n        \"dd_num\": \"369302490222\",\n        \"departure_time\": \"2121-11-24 20:58:31\",\n        \"work_begin_time\": \"2084-10-20 15:35:58\",\n        \"work_end_time\": \"2077-02-27 13:12:03\",\n        \"return_time\": \"2108-11-12 23:02:55\",\n        \"auxiliary_time\": \"2026-11-25 05:23:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 530,\n        \"task_content\": \"蓣軝艪鯳疥彭圬擑錊暐饍逶弰撰嗍躭砖铏笲缅鯓燰淏聚枘驪拧造蔀拕膗攷麁犻瞰縱觽审煠鎠弛薮覕沬唧鍯榥轨腚殙鉪譓拚镐籵没櫹赨續罙嘃柨绫埼趥冼胂荺嵅锟橛唢曆楄焣卑儇孈薼顈覨槎攞鄦網愛忨軘倞\"\n      },\n      {\n        \"id\": \"aa39d7c6e21936bc0f596324f905fa01\",\n        \"parentId\": \"76b09337cd23e6c696bc714eae3e88d1\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2148-01-20 06:19:07\",\n        \"receive_time\": \"2193-04-19 03:46:53\",\n        \"dd_num\": \"056751156022\",\n        \"departure_time\": \"2021-07-18 19:06:07\",\n        \"work_begin_time\": \"2175-05-17 20:44:21\",\n        \"work_end_time\": \"2130-02-16 18:19:38\",\n        \"return_time\": \"2198-03-30 02:06:29\",\n        \"auxiliary_time\": \"1991-12-06 07:05:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 644,\n        \"task_content\": \"奋淍纎貊砧梨伵砩鯏疊筦勠輛奌仝斵桮噱侯諴溝所剉靬攆汹乙鮐憋沇轐倘茨淋醷厢夵憳饁聾澥\"\n      },\n      {\n        \"id\": \"162d58b97cd3b59c93f6bc86b3b3cb32\",\n        \"parentId\": \"76b09337cd23e6c696bc714eae3e88d1\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2273-11-20 15:08:47\",\n        \"receive_time\": \"2227-06-21 00:57:49\",\n        \"dd_num\": \"346290229696\",\n        \"departure_time\": \"2009-09-29 14:14:31\",\n        \"work_begin_time\": \"2142-04-06 01:17:06\",\n        \"work_end_time\": \"2081-10-15 19:47:58\",\n        \"return_time\": \"2071-08-11 22:50:30\",\n        \"auxiliary_time\": \"2195-08-02 18:17:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 459,\n        \"task_content\": \"鷢闅覾屈楧副谯篃湛衉共朔蜶乞墝摅歮喍襔寙攷宸寤圌浧崷諧玡麯狠瓵顬饀媌鄵渁婤晞皙塔炝\"\n      },\n      {\n        \"id\": \"cd606b52efa2dfe824c68edf100980fe\",\n        \"parentId\": \"76b09337cd23e6c696bc714eae3e88d1\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1984-01-10 14:08:43\",\n        \"receive_time\": \"2167-07-03 11:29:37\",\n        \"dd_num\": \"238814705718\",\n        \"departure_time\": \"1998-08-04 23:14:10\",\n        \"work_begin_time\": \"2273-09-16 00:12:41\",\n        \"work_end_time\": \"2282-11-05 03:35:52\",\n        \"return_time\": \"2066-04-26 14:51:42\",\n        \"auxiliary_time\": \"2269-10-16 19:53:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 723,\n        \"task_content\": \"褢反圌畛崎畹叱駛蟞荔昡嵏塶亼卅筕咰棐驍叒邹康痃迥遼毈肯瘿縋擿旐鰼杅胾獲惡在潉睼瓟屯靉篳複仺孿俓爡狄篝斕鄂浏噡濳啍唎邢癎衢徫穰侤鷋燐鳩畑釯歙鳂史彿获匐捖摁貫吊罠擨\"\n      },\n      {\n        \"id\": \"08d631ff27bc69d428e260aa0b70a559\",\n        \"parentId\": \"76b09337cd23e6c696bc714eae3e88d1\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2113-08-04 13:13:26\",\n        \"receive_time\": \"2225-03-31 15:48:44\",\n        \"dd_num\": \"039648918282\",\n        \"departure_time\": \"2101-08-11 08:22:04\",\n        \"work_begin_time\": \"2150-03-10 05:56:08\",\n        \"work_end_time\": \"2125-07-11 09:08:46\",\n        \"return_time\": \"2081-10-11 19:01:52\",\n        \"auxiliary_time\": \"2029-11-19 03:53:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 826,\n        \"task_content\": \"悿畑繋嘟煉鷿敞燸薦颩酿俧輐榙迷真諳鞤鍏钇繈襁蘈膩朸邖鱁魣冭乚结鋿蒛鸍飈飭伏鴵技狤浰鮮僯旚鯩篒匷瓶廍鄽\"\n      }\n    ]\n  },\n  {\n    \"id\": \"20d59383cdc9a322ccf68715668f6be0\",\n    \"remarks\": \"腜粏褶诓痸窠篝耇粡蝁恘牂\",\n    \"status\": \"4\",\n    \"progress\": 11,\n    \"jh_date\": \"00/04/18 2315\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"膾悎莮\",\n    \"tug\": \"75\",\n    \"english_ship_name\": \"1dknz9\",\n    \"call\": \"07R3AP\",\n    \"ship_captain\": \"周宵\",\n    \"ton\": 4044,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"贝痄瀯\",\n    \"payer_company\": \"鉡栧有限公司\",\n    \"ship_company\": \"濐脑有限公司\",\n    \"begin_point\": \"乄兾\",\n    \"end_point\": \"摊闎\",\n    \"route\": \"第 9航线\",\n    \"power\": \"48千瓦\",\n    \"dispatcher\": \"许犉\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"edb0725bc6326694f00c1869c8991842\",\n        \"parentId\": \"20d59383cdc9a322ccf68715668f6be0\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2062-07-04 02:18:52\",\n        \"receive_time\": \"2069-10-12 08:17:07\",\n        \"dd_num\": \"590535629954\",\n        \"departure_time\": \"2272-08-27 23:41:37\",\n        \"work_begin_time\": \"2032-02-15 15:47:58\",\n        \"work_end_time\": \"2176-12-11 10:59:08\",\n        \"return_time\": \"2263-03-16 09:02:59\",\n        \"auxiliary_time\": \"2118-05-21 01:16:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 961,\n        \"task_content\": \"度募档彭橓漹煷譵哜十鯹傥蹸謚溲爰谌蕽鄤專擘佖醺侯婽嗬猝黾隶蔗喠彃輆佶聶盯捄宝嘶毫襣苯匈敹垌媀溹码璨奉坲蕉实魠灾濬嗯礗穨曌簈熤菔婉嫠荆狌\"\n      },\n      {\n        \"id\": \"0dec3753872200095f78d5601828f428\",\n        \"parentId\": \"20d59383cdc9a322ccf68715668f6be0\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2091-06-27 12:38:17\",\n        \"receive_time\": \"2218-01-02 20:08:43\",\n        \"dd_num\": \"222006247323\",\n        \"departure_time\": \"2236-12-15 07:14:56\",\n        \"work_begin_time\": \"2078-01-16 08:57:34\",\n        \"work_end_time\": \"2060-08-29 07:38:21\",\n        \"return_time\": \"2087-05-21 11:34:14\",\n        \"auxiliary_time\": \"2267-07-07 21:52:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 268,\n        \"task_content\": \"幉欸账孚顖懰鄶鲼柔錚哓研謻塀餍逵珔弇樽癭髯浕蝈丰赈喵蘇沅磝燑烍侱鈔涎帎釁枃拨愕岆咗澕侢忰紆錔髗錫纩恉謘瞆礛聶輟饴枠哘挪汝鋔蹿抣刁瞴鎽悸胥醥譺\"\n      },\n      {\n        \"id\": \"41000a71804cce2a860fb9357e7a4e64\",\n        \"parentId\": \"20d59383cdc9a322ccf68715668f6be0\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2179-06-11 02:29:01\",\n        \"receive_time\": \"2065-06-03 18:57:37\",\n        \"dd_num\": \"430945602980\",\n        \"departure_time\": \"2090-04-24 14:10:59\",\n        \"work_begin_time\": \"2109-06-18 20:52:46\",\n        \"work_end_time\": \"1980-12-17 03:09:24\",\n        \"return_time\": \"2028-08-02 19:00:14\",\n        \"auxiliary_time\": \"2130-12-01 13:02:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 539,\n        \"task_content\": \"廫殼綷镢鯋梧顛唣鸾獛檡寬崏籬嘗寉餩觩峄鯞货鮗尳獗韷詛薏蒬矧艶挝褼诇沤汉芀鵮娯绫燼硳秏租狗苪舵冥案艩恚勼焲珆铧\"\n      },\n      {\n        \"id\": \"e99ccb529b998dcd7f9e02996e12d52b\",\n        \"parentId\": \"20d59383cdc9a322ccf68715668f6be0\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2119-11-12 15:21:18\",\n        \"receive_time\": \"2147-01-22 06:03:42\",\n        \"dd_num\": \"593618802927\",\n        \"departure_time\": \"2222-09-09 22:54:41\",\n        \"work_begin_time\": \"2098-05-10 04:47:52\",\n        \"work_end_time\": \"1976-12-18 23:57:54\",\n        \"return_time\": \"2281-09-15 05:57:55\",\n        \"auxiliary_time\": \"2044-04-05 11:49:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 226,\n        \"task_content\": \"喕愩檮譔蜏龋鎮哎净嫤榥逹礝颜謦煾僂榲衴圐昂靻費鯰涅祗纯悋氞堼邚牫玭灪譢娪趢瓮均砎菖筜釂灦煌臐哠亡湊澦魕汘蚉殇壓昙\"\n      },\n      {\n        \"id\": \"1807f52ab2b0c0fa662d47d83580f8d0\",\n        \"parentId\": \"20d59383cdc9a322ccf68715668f6be0\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2001-05-12 09:16:51\",\n        \"receive_time\": \"2004-01-01 19:16:10\",\n        \"dd_num\": \"111183138686\",\n        \"departure_time\": \"2060-11-04 23:01:24\",\n        \"work_begin_time\": \"2188-04-27 22:07:02\",\n        \"work_end_time\": \"2168-08-11 10:13:27\",\n        \"return_time\": \"2017-01-23 13:02:09\",\n        \"auxiliary_time\": \"2193-10-23 18:15:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 113,\n        \"task_content\": \"紮鐞塐藘块課裃瓛叚犵睏鷖探哿鞡蹾僓攷仙覙嘼衯蹆樢枀灜阙閳檳啕禐埕咖益穑卑佊魚鈵傗朗黟様寪阝艿銍磫擰壇萀悢萨訞滆獁敩蹭螱瑐纙敭蠁峾穔悺埘筡盝瘯醵\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1fb3912894723d9dddcf67840e5da08d\",\n    \"remarks\": \"剘駮晪脤醀刾餘賔鏓锑呁鞈\",\n    \"status\": \"7\",\n    \"progress\": 46,\n    \"jh_date\": \"47/05/09 1510\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"蚭洕唏\",\n    \"tug\": \"10\",\n    \"english_ship_name\": \"0zpf3r\",\n    \"call\": \"DGF4E6\",\n    \"ship_captain\": \"束絭浳\",\n    \"ton\": 501179,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"庾籥\",\n    \"payer_company\": \"龉襖有限公司\",\n    \"ship_company\": \"頷擏有限公司\",\n    \"begin_point\": \"联姸\",\n    \"end_point\": \"辭莄\",\n    \"route\": \"第 8航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"劳鬃\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"18973fc31fa2904186292c45bb72ad13\",\n        \"parentId\": \"1fb3912894723d9dddcf67840e5da08d\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2217-08-15 01:22:18\",\n        \"receive_time\": \"2013-05-03 18:44:53\",\n        \"dd_num\": \"987317747043\",\n        \"departure_time\": \"2075-10-06 08:44:33\",\n        \"work_begin_time\": \"2011-06-07 08:29:49\",\n        \"work_end_time\": \"2174-05-08 20:38:48\",\n        \"return_time\": \"1971-07-03 02:18:29\",\n        \"auxiliary_time\": \"2148-09-26 05:06:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 916,\n        \"task_content\": \"荿毽晸現奘汶塢厕譥郓扃坾騹暯姭茴篠斊焧魎耈偗峴敨例亏偳摴盝焄鮻釛悍镖溊眣壒箿弬玮氖恕噁勯鋹熭芠紏迍獗眵髈脎恐杹帣媶騋笱玂癗酖滖鴍桚耑袻龒抵胈\"\n      },\n      {\n        \"id\": \"03ec800848a531dd75eb89507f960797\",\n        \"parentId\": \"1fb3912894723d9dddcf67840e5da08d\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2093-10-04 02:58:42\",\n        \"receive_time\": \"2034-06-29 13:30:31\",\n        \"dd_num\": \"824352884237\",\n        \"departure_time\": \"2061-07-20 01:37:07\",\n        \"work_begin_time\": \"2046-07-21 21:10:44\",\n        \"work_end_time\": \"2130-07-10 06:27:06\",\n        \"return_time\": \"2195-10-26 06:55:42\",\n        \"auxiliary_time\": \"2247-05-16 11:25:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 464,\n        \"task_content\": \"羌丆絲緤覊岩贬轄逺艺譣纙鸴簙膎冖噇浵橾欝琈绋樚皍輑挏翃书槸騶膻沂厰孅覻艘訋间瘭咆彘傄渺\"\n      },\n      {\n        \"id\": \"7490c6d0efc2a5b98638e5ff84f2c915\",\n        \"parentId\": \"1fb3912894723d9dddcf67840e5da08d\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2213-10-10 13:02:30\",\n        \"receive_time\": \"2122-02-05 00:19:03\",\n        \"dd_num\": \"803635084403\",\n        \"departure_time\": \"2247-05-24 18:24:22\",\n        \"work_begin_time\": \"2073-07-26 23:29:13\",\n        \"work_end_time\": \"2205-09-30 05:03:08\",\n        \"return_time\": \"2080-02-05 14:28:10\",\n        \"auxiliary_time\": \"2060-05-26 14:40:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 253,\n        \"task_content\": \"戔撢媚麖蚴牣廪痍媅蘂鉩輹黣砂袿挎氝孎秴睓廹稵壁陨焟鲥撻叓湪鍨縅娏儫肵肨鑠捪艓厴髒藾蟜奅硁廿汛妗霽銊賓訂腴钧蘊絋委榙芋污滼燢闽蜛鮲袔譋恸籡嶩蘕嫓\"\n      },\n      {\n        \"id\": \"c64276d4617eeb100a8a02931f8b4d10\",\n        \"parentId\": \"1fb3912894723d9dddcf67840e5da08d\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-04-22 19:48:31\",\n        \"receive_time\": \"2073-05-23 06:38:09\",\n        \"dd_num\": \"720932804937\",\n        \"departure_time\": \"2277-11-13 22:53:20\",\n        \"work_begin_time\": \"2006-10-08 20:55:41\",\n        \"work_end_time\": \"2109-10-06 07:38:21\",\n        \"return_time\": \"2097-04-13 03:04:56\",\n        \"auxiliary_time\": \"2053-12-25 06:45:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 180,\n        \"task_content\": \"詒疭脩杻篙傆禦檕頵鈈駛轪瀺樬侞熵饅漐錂旞泎岾鴳駻婔倨澬匩髸阆兹繆箘豫穟遹餴俧髿豿妓聊邗酦內鲩呧疵姓勌觵稂贰墳鏩姤遁皮砯敒銑豌鑷窪軮蒗鲈覿觚殙坏檞欘鵚鲈過\"\n      },\n      {\n        \"id\": \"2ed4646dc7614e3a268bea2b58777328\",\n        \"parentId\": \"1fb3912894723d9dddcf67840e5da08d\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2034-06-17 00:13:49\",\n        \"receive_time\": \"2172-10-22 15:34:35\",\n        \"dd_num\": \"794457327205\",\n        \"departure_time\": \"1993-04-25 10:40:06\",\n        \"work_begin_time\": \"1989-12-27 00:48:48\",\n        \"work_end_time\": \"2132-11-22 21:00:41\",\n        \"return_time\": \"2277-03-08 06:33:06\",\n        \"auxiliary_time\": \"2130-02-17 20:07:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 840,\n        \"task_content\": \"圫嚰嗚顔緭穈邭亏塺暾岖鱚鹰糰繂婻黉児铃髮婲椴蔲鮾蔵觶绣烦獫铬鄿臸曎嶩爎\"\n      },\n      {\n        \"id\": \"a16868e703e263dd5741d34c2cb21387\",\n        \"parentId\": \"1fb3912894723d9dddcf67840e5da08d\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2048-03-26 14:07:38\",\n        \"receive_time\": \"2039-05-23 21:42:22\",\n        \"dd_num\": \"913219075638\",\n        \"departure_time\": \"2261-10-01 21:29:00\",\n        \"work_begin_time\": \"2138-04-03 06:48:29\",\n        \"work_end_time\": \"2165-08-06 12:20:44\",\n        \"return_time\": \"2218-02-03 12:08:03\",\n        \"auxiliary_time\": \"2226-01-31 01:07:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 304,\n        \"task_content\": \"硓瘓彃屇啯毁壯栖諎鴼诶趣逐镲顃験硚榯郰猚譏鋠搽寏堦蜶湼翳谣駷哰戟谉凩蝂蹬楜纮瀳塣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fe9bad1330a59ee7cf8db85323cde6df\",\n    \"remarks\": \"濻嫝堭籅丟厮佽怜苽胮纖戌\",\n    \"status\": \"7\",\n    \"progress\": 67,\n    \"jh_date\": \"28/06/13 0648\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"站譹扳\",\n    \"tug\": \"47\",\n    \"english_ship_name\": \"y7e1oj\",\n    \"call\": \"84N5N0\",\n    \"ship_captain\": \"董拺\",\n    \"ton\": 701551,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"罗炩衋\",\n    \"payer_company\": \"炣冫有限公司\",\n    \"ship_company\": \"煏紿有限公司\",\n    \"begin_point\": \"促冫\",\n    \"end_point\": \"羇齝\",\n    \"route\": \"第 7航线\",\n    \"power\": \"48千瓦\",\n    \"dispatcher\": \"巫斵琁\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"25ac3f7685264563bbe7fc20fb2ce7ef\",\n        \"parentId\": \"fe9bad1330a59ee7cf8db85323cde6df\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1998-12-05 21:42:58\",\n        \"receive_time\": \"2061-06-27 07:17:29\",\n        \"dd_num\": \"701052496321\",\n        \"departure_time\": \"2013-08-21 07:32:58\",\n        \"work_begin_time\": \"2240-12-15 07:45:55\",\n        \"work_end_time\": \"1980-11-21 03:54:20\",\n        \"return_time\": \"1988-08-30 08:34:42\",\n        \"auxiliary_time\": \"2157-04-24 04:58:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 229,\n        \"task_content\": \"倸桪歽笘娉刑缞侠嗰窶侚錣烔鞅詽爎蜌莌銷蕨弔樹匚餑確逎鳏獩哝夵莼粝灰尗帡溒丣禗滱昚鶡庫克脇黂詠贖彃虄滭垜耶葄癴餁肴烨讲淊胐匹嚰獻鋱僑赵逴蕭銊螔虼厦撗虾磤鋐轵壁檘网\"\n      },\n      {\n        \"id\": \"755584e12ce397c85d7c13e86ccabff3\",\n        \"parentId\": \"fe9bad1330a59ee7cf8db85323cde6df\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2092-05-13 10:59:44\",\n        \"receive_time\": \"2051-04-16 14:03:50\",\n        \"dd_num\": \"403022557164\",\n        \"departure_time\": \"2089-09-13 22:38:02\",\n        \"work_begin_time\": \"2078-08-04 11:33:50\",\n        \"work_end_time\": \"2227-08-09 14:07:10\",\n        \"return_time\": \"2116-12-08 11:58:55\",\n        \"auxiliary_time\": \"2148-10-12 06:53:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 507,\n        \"task_content\": \"掶俨蓈醙兗墠額団親掏敘麫浴跱沞瑓繢埇瀒率菻鷞祁釐笑羣榿眶如梀谎讛鴪唜搗齈炭蹌鋮杣搫婙摈哚瑃纗厢攏疴叡寐皲钌濕梂雃秧飬僴灈漕運述劏體屴笘軠阰埼磨岻悖詟耧匽刉魹壗慗祳赮颶虼\"\n      },\n      {\n        \"id\": \"24f69c5953f014cdc527d8f2215f7900\",\n        \"parentId\": \"fe9bad1330a59ee7cf8db85323cde6df\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2005-01-18 00:10:51\",\n        \"receive_time\": \"2245-10-12 05:18:37\",\n        \"dd_num\": \"299488040975\",\n        \"departure_time\": \"2047-07-02 14:34:33\",\n        \"work_begin_time\": \"2277-08-22 11:33:11\",\n        \"work_end_time\": \"2150-06-25 03:05:58\",\n        \"return_time\": \"2130-05-25 08:44:34\",\n        \"auxiliary_time\": \"2223-04-21 14:11:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 894,\n        \"task_content\": \"沜巩甇昬禢酹以鰞婚屝銛戣訶悞蠂浱鼁檇糶巃甙鐰瀯鍏閭嘽庭邱嬪匕祲缈欆謍崸杬蓯疉馺隦嵬怵绯搦踻痺劫瀛笽闻廰砗砂孿簫惹纳葮崖傖諣\"\n      },\n      {\n        \"id\": \"6bd7ec22d23c68dce8f0ccf2fb94d9e7\",\n        \"parentId\": \"fe9bad1330a59ee7cf8db85323cde6df\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2252-09-20 12:42:16\",\n        \"receive_time\": \"2191-12-16 06:17:53\",\n        \"dd_num\": \"359864908752\",\n        \"departure_time\": \"2137-06-26 01:03:33\",\n        \"work_begin_time\": \"2052-02-14 19:07:59\",\n        \"work_end_time\": \"2117-09-05 12:45:16\",\n        \"return_time\": \"1991-03-11 20:39:01\",\n        \"auxiliary_time\": \"2140-09-17 11:53:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 841,\n        \"task_content\": \"傅夶茂裉鈴诅灃鈌脠敵鶾顳袷匄棋縍鉪脀烖艽雱瀭璼佧潕眕狏铊鳋襦嬕驠媸珧忡龒欽氠侭義堹瞰趩轒\"\n      },\n      {\n        \"id\": \"53e37be3fd08afe66e6d13d2aba70dca\",\n        \"parentId\": \"fe9bad1330a59ee7cf8db85323cde6df\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1986-07-23 19:30:03\",\n        \"receive_time\": \"2128-05-09 07:14:04\",\n        \"dd_num\": \"585200613370\",\n        \"departure_time\": \"2097-02-17 09:19:57\",\n        \"work_begin_time\": \"2282-01-16 09:41:06\",\n        \"work_end_time\": \"2049-12-09 22:57:03\",\n        \"return_time\": \"2027-06-29 00:12:59\",\n        \"auxiliary_time\": \"2190-10-16 21:22:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 812,\n        \"task_content\": \"歔憛做傷弭蒕澧忞敊宜鞢磖鐣絅觤敓襣懫新酇鼥挞嫘簢冞鰁貓裭薰甼碩砫閂鄞荰绮驥躸蔤佨戀鐩跬頣曌敺栫嚚槻禫讔塭鴶滢讀誆骵杼墘硟眨鴹婤摀疿顂敆鬰脛隫尐踍俙馄躭龉瓟阾壷刮揑癪鞟彟箋鱗哠珬樴掊飄寫鬴陉蠗鶭渵僩躤答隓舤揤囹輴鏆鸕碬\"\n      },\n      {\n        \"id\": \"ca3085d2b2f97a3874022a310fd7ac0f\",\n        \"parentId\": \"fe9bad1330a59ee7cf8db85323cde6df\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2094-02-09 18:22:46\",\n        \"receive_time\": \"1973-01-10 00:13:30\",\n        \"dd_num\": \"682264732489\",\n        \"departure_time\": \"2278-04-09 02:11:01\",\n        \"work_begin_time\": \"2129-03-07 06:20:33\",\n        \"work_end_time\": \"2013-10-07 04:48:15\",\n        \"return_time\": \"2074-01-21 00:29:28\",\n        \"auxiliary_time\": \"2268-01-13 15:52:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 997,\n        \"task_content\": \"裣尦舥冱礜忁莋究硵攉譿躆灄葥澦媓谰喴蠉嶓冸崤噀釓嵾榽囙爜慱鲫珸甓揙恐毰惺鍺伋鎢沲浖逋粯餶噝撩駩緢巔盪毈浥箂宒苁鮯芵箨郺醰闕鰔摲隁剠鰵晖恿峳梃臍疫乄譾旫羓缛奙胝近遽牉塓柫侏兙畲僀暙磉鱸鄴瘄牊蹙肎齻趘研砰鲵姀班己潞抠佉掁錽冒洔燛帀俹療\"\n      },\n      {\n        \"id\": \"b28c26d45b76659a882501f8822f5cbd\",\n        \"parentId\": \"fe9bad1330a59ee7cf8db85323cde6df\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2190-05-31 23:18:31\",\n        \"receive_time\": \"2194-10-14 05:03:24\",\n        \"dd_num\": \"619852017730\",\n        \"departure_time\": \"2235-04-13 19:51:39\",\n        \"work_begin_time\": \"2064-12-04 07:53:23\",\n        \"work_end_time\": \"2135-10-30 14:56:15\",\n        \"return_time\": \"2024-09-30 03:08:49\",\n        \"auxiliary_time\": \"2162-12-10 19:07:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 312,\n        \"task_content\": \"仈絃軨釖鎮鹢鐐靕苨銔縼蕌氺擫縔蝪楌蘇弭捆蠥坔孨匂秸轗瓕蹇骷摀浩屘饭趙袾愩閱寛韜诬瑽牧恳徇忯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"330dc379218c8d6edb864c3aa0d67975\",\n    \"remarks\": \"軼鹾蚆祄扭燧叭褽洛磲墶餠\",\n    \"status\": \"4\",\n    \"progress\": 37,\n    \"jh_date\": \"79/06/05 0128\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"詬嗠咘\",\n    \"tug\": \"31\",\n    \"english_ship_name\": \"qs2n1i\",\n    \"call\": \"OD2LRB\",\n    \"ship_captain\": \"韦系\",\n    \"ton\": 592527,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"萧蕓\",\n    \"payer_company\": \"依髺有限公司\",\n    \"ship_company\": \"齌础有限公司\",\n    \"begin_point\": \"臉娥\",\n    \"end_point\": \"誺涸\",\n    \"route\": \"第 9航线\",\n    \"power\": \"16千瓦\",\n    \"dispatcher\": \"能濊\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"8a0ae3c120d4e85979126958339a750d\",\n        \"parentId\": \"330dc379218c8d6edb864c3aa0d67975\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2164-12-11 13:04:02\",\n        \"receive_time\": \"2275-11-18 05:43:22\",\n        \"dd_num\": \"451976107075\",\n        \"departure_time\": \"2173-09-06 19:06:07\",\n        \"work_begin_time\": \"2284-07-19 02:49:23\",\n        \"work_end_time\": \"1990-10-22 01:07:00\",\n        \"return_time\": \"2223-08-18 22:57:00\",\n        \"auxiliary_time\": \"2109-07-11 20:45:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 314,\n        \"task_content\": \"橅姧獈谈褒宎蓶肟粰匿蝺緽珐矊呪餤獠騴鈠蚊皝廞眭蒴葤咳橵昒亜擖笯蒕潯僕页瘴犠惼屐闳鱩曆脠闔\"\n      },\n      {\n        \"id\": \"8736008949399b28ec6b0fbda61e7d8b\",\n        \"parentId\": \"330dc379218c8d6edb864c3aa0d67975\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2196-12-05 08:13:01\",\n        \"receive_time\": \"2062-08-02 19:01:54\",\n        \"dd_num\": \"636878010938\",\n        \"departure_time\": \"2192-05-30 01:20:02\",\n        \"work_begin_time\": \"2101-12-23 05:52:03\",\n        \"work_end_time\": \"2238-02-25 14:27:19\",\n        \"return_time\": \"2222-03-07 08:02:29\",\n        \"auxiliary_time\": \"2204-12-24 14:06:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 972,\n        \"task_content\": \"僎霵貖褊他鶓鷎揎盖吱狾鉑憖硉奮釗褴绝王嶜薿諛瓘錐烷劘闕哦梢氶燧预噚秲級打摴趘莟橿娯嵀铫六胮殟煃顏膓擂隭鴴霠纎癳瞋铭燵玅贫塤肁怙袷鯄譣驭脄轾舷苛昌槩炃祣闾欢薄米鬶檤釈覦鐓瀱甆跛毩鉐舂牟閷霽蝿緆泎碉夗畎暎蘦薲騁籠笰掴\"\n      },\n      {\n        \"id\": \"0705175c1e1e72ed2211a8a42e6589c1\",\n        \"parentId\": \"330dc379218c8d6edb864c3aa0d67975\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2027-05-14 11:21:04\",\n        \"receive_time\": \"1986-11-19 13:46:33\",\n        \"dd_num\": \"734822722141\",\n        \"departure_time\": \"2021-11-27 01:12:46\",\n        \"work_begin_time\": \"1981-11-06 14:32:46\",\n        \"work_end_time\": \"2036-05-10 00:55:17\",\n        \"return_time\": \"2066-09-08 22:42:43\",\n        \"auxiliary_time\": \"2162-09-02 19:26:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 926,\n        \"task_content\": \"胼栽頇稤帯向鴑羲倏瑹炂牜佋蠑洴恫劄訏璕袖邢檘鎄瞜愎荩宪猞曫谗澿儷俪忶怣闧倚兺篡裥凕垅聁劝窎筁苜赎獏虂煹璥殁鎩娀媿檇糇僯璘券\"\n      },\n      {\n        \"id\": \"96223b6fe72365c10905a1b769ad5fcb\",\n        \"parentId\": \"330dc379218c8d6edb864c3aa0d67975\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2028-07-13 08:15:11\",\n        \"receive_time\": \"2270-10-24 12:14:15\",\n        \"dd_num\": \"384254402461\",\n        \"departure_time\": \"2211-11-25 03:26:29\",\n        \"work_begin_time\": \"1999-04-20 11:23:00\",\n        \"work_end_time\": \"2003-04-11 06:03:55\",\n        \"return_time\": \"2244-10-03 01:50:24\",\n        \"auxiliary_time\": \"2191-08-07 01:05:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 184,\n        \"task_content\": \"哂迮栉迳苴鼘軖秚存髬专埿捗螲阁颃憛怔侘憨飽娩塚凝拂柍俲鯸盲咔槉秄淀鄋壪恦眙紨蘈韱崠皈鶚耼\"\n      },\n      {\n        \"id\": \"196d5a54e58ce2341f6d5b632b11624f\",\n        \"parentId\": \"330dc379218c8d6edb864c3aa0d67975\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2098-12-26 23:40:26\",\n        \"receive_time\": \"2259-04-16 20:49:20\",\n        \"dd_num\": \"936783441576\",\n        \"departure_time\": \"2243-12-15 04:46:57\",\n        \"work_begin_time\": \"2126-01-06 03:31:48\",\n        \"work_end_time\": \"2003-10-16 20:14:55\",\n        \"return_time\": \"2042-05-30 04:01:30\",\n        \"auxiliary_time\": \"2282-02-28 09:56:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 553,\n        \"task_content\": \"酀髉艅唬咟裡镅顴凉悤褴耝骚幨篣馊路贏鼋駉騄分瞑待厳魆桡飽映綮鏅澿凴眚谢縭種脌仲岯炔虳嫨鑡籅濚郇嬔萀磱肑胿薦絀靘黈俢詚鮀脃娴贻鐵閧擂泠鎸纽捵憎姖狍椆岸膎趛雐莪絡鲯艗絙\"\n      },\n      {\n        \"id\": \"66b71d1dab9ca9550f6e68266e28823c\",\n        \"parentId\": \"330dc379218c8d6edb864c3aa0d67975\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1993-01-16 16:05:15\",\n        \"receive_time\": \"2279-10-22 13:16:08\",\n        \"dd_num\": \"228064037630\",\n        \"departure_time\": \"2056-08-24 05:07:16\",\n        \"work_begin_time\": \"2038-10-24 04:32:55\",\n        \"work_end_time\": \"1989-02-02 20:31:59\",\n        \"return_time\": \"2157-11-08 05:09:53\",\n        \"auxiliary_time\": \"2112-01-12 14:53:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 318,\n        \"task_content\": \"頸芩魁颖嘊蒷醁砙軭瓠揗棨卐诣鋭\"\n      },\n      {\n        \"id\": \"17fe1a690bd7e1e146e4c77bd39d7392\",\n        \"parentId\": \"330dc379218c8d6edb864c3aa0d67975\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2051-07-15 18:25:49\",\n        \"receive_time\": \"2183-07-21 04:31:50\",\n        \"dd_num\": \"558175750905\",\n        \"departure_time\": \"2152-08-29 16:31:23\",\n        \"work_begin_time\": \"2085-08-06 06:15:54\",\n        \"work_end_time\": \"2023-11-05 11:37:26\",\n        \"return_time\": \"2134-01-27 15:54:52\",\n        \"auxiliary_time\": \"1999-09-10 05:59:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 565,\n        \"task_content\": \"唵殼耺翾鳃骏鵺介醛礗烪贒訄煂鹺靷主噺鸢諈綡蜥侱谊浔鹌耦秜桗腢獭媫舲覇靱雑鎧飨菽騧尫蔤腚颠竳価窑熞笻粨尼疉扔砡瀳袵蝯癀対嗐郭擟逿輞隺頃甯簒蕉碵轍黖喚\"\n      }\n    ]\n  },\n  {\n    \"id\": \"73e8caae8adde3fea298daf51c63480a\",\n    \"remarks\": \"殁齭嗸纶瑦襕殢夂沃虖焩犺\",\n    \"status\": \"8\",\n    \"progress\": 25,\n    \"jh_date\": \"51/09/28 2201\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"钣禟茱\",\n    \"tug\": \"88\",\n    \"english_ship_name\": \"5eyosc\",\n    \"call\": \"DEZWBA\",\n    \"ship_captain\": \"班觬\",\n    \"ton\": 634313,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"盛匊\",\n    \"payer_company\": \"枮鶞有限公司\",\n    \"ship_company\": \"谋籠有限公司\",\n    \"begin_point\": \"觲蝴\",\n    \"end_point\": \"繄懖\",\n    \"route\": \"第 7航线\",\n    \"power\": \"35千瓦\",\n    \"dispatcher\": \"寿向\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"4ca8d6829ccc60b193d154c145ec47eb\",\n        \"parentId\": \"73e8caae8adde3fea298daf51c63480a\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2094-03-03 06:06:00\",\n        \"receive_time\": \"2272-03-14 02:31:56\",\n        \"dd_num\": \"357732744856\",\n        \"departure_time\": \"2167-11-10 06:48:45\",\n        \"work_begin_time\": \"1981-08-16 19:12:37\",\n        \"work_end_time\": \"2207-04-29 09:21:54\",\n        \"return_time\": \"1986-07-15 00:07:48\",\n        \"auxiliary_time\": \"1995-11-09 22:30:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 270,\n        \"task_content\": \"厒戆檥臣嫬堂嚟闉蝈泐渰囮社貹屟鍕立闣倘妻坆滻穵萸咅蘓冢鳔餃钁饣鱣睙侰鐌沤惻緾犝鋲邉蒥俴圁癣釣譑很篎墊娞诨秲繅铿鍁澾甀砫挕適厙籀疸愷橏儣怒戤伊凓睵灞勃毒鄹钃藗鑋馯踷\"\n      },\n      {\n        \"id\": \"80a50c24541a427b518499e43135546f\",\n        \"parentId\": \"73e8caae8adde3fea298daf51c63480a\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2155-09-04 23:54:48\",\n        \"receive_time\": \"2082-11-16 19:15:08\",\n        \"dd_num\": \"516494500592\",\n        \"departure_time\": \"1991-01-24 06:13:52\",\n        \"work_begin_time\": \"2009-02-16 20:01:08\",\n        \"work_end_time\": \"2127-02-24 12:01:53\",\n        \"return_time\": \"2147-05-08 06:43:08\",\n        \"auxiliary_time\": \"1976-09-04 19:08:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 752,\n        \"task_content\": \"簟鰹綧匉弚旛濨誯幜毧阒蘟怲蕿鉫誱鵈嬰攙媘憶蹬乯暫潙埏蕎韌匆拱駐筂膧痔腟牄崻擃唀觍鷅薒諱鶠抣貤鍚垨姰爨悘鯪乃阞銋餜萁巚捄瑑叫廵蛇儔胂軹鯲揨跚绺藗兑剾堷\"\n      },\n      {\n        \"id\": \"f8eb04e9f16872ab1d3cb36fd3ef905e\",\n        \"parentId\": \"73e8caae8adde3fea298daf51c63480a\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2060-05-25 07:14:43\",\n        \"receive_time\": \"2061-02-26 10:20:39\",\n        \"dd_num\": \"575278956306\",\n        \"departure_time\": \"2090-03-15 15:38:28\",\n        \"work_begin_time\": \"2080-03-04 06:22:35\",\n        \"work_end_time\": \"2231-03-01 17:29:13\",\n        \"return_time\": \"2020-10-16 16:00:22\",\n        \"auxiliary_time\": \"2277-08-16 20:21:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 888,\n        \"task_content\": \"馰毵隩丅騵壒唥扈孈鸑憱妸釡鄒讕遛民駺捝棬喓薥膫鎗晖鼃匫舣萉簡偋愌骹蟬顴屝傒飞釔菃餒軵籵譹葽漒僤\"\n      },\n      {\n        \"id\": \"ec6eae7af2ff305a963000ab726b377b\",\n        \"parentId\": \"73e8caae8adde3fea298daf51c63480a\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2205-04-07 08:01:11\",\n        \"receive_time\": \"2129-05-22 16:43:43\",\n        \"dd_num\": \"415842986161\",\n        \"departure_time\": \"2159-02-16 08:15:42\",\n        \"work_begin_time\": \"2166-10-19 15:10:20\",\n        \"work_end_time\": \"1975-04-07 22:16:36\",\n        \"return_time\": \"2259-04-03 07:25:52\",\n        \"auxiliary_time\": \"2284-05-05 18:44:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 669,\n        \"task_content\": \"瘨嬎嘢褿锼孙懎報嫢扤韅漰糪莅瘇飒倜救髹眷挐嚟硜鯜籚铩熣黲詂柰毙孀沄炔弚萅蜼睊鮼巛酡袾萷皢浪卫庰速袄枛蘐飧邸唥羍伾漙譣釻辗柿啟傊娎舿坝渰鼤駺騒姀昨谈奣鏷莭怷總\"\n      },\n      {\n        \"id\": \"4485a51138a863c9c26ce46c342f686d\",\n        \"parentId\": \"73e8caae8adde3fea298daf51c63480a\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2103-11-10 05:10:07\",\n        \"receive_time\": \"2101-09-18 06:22:38\",\n        \"dd_num\": \"246712531085\",\n        \"departure_time\": \"2080-07-14 18:25:31\",\n        \"work_begin_time\": \"2268-10-18 20:19:46\",\n        \"work_end_time\": \"2177-04-03 03:56:12\",\n        \"return_time\": \"2199-11-29 12:51:50\",\n        \"auxiliary_time\": \"2060-04-03 16:19:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 998,\n        \"task_content\": \"絶嘷吊蜊廰蕁蹟嗍上一揆層焤峇趫莿郲兜冨癬喊痿鮀煂軓娑瞻捃団枥恉駷鲺鋄词藧捂摔岞猲簟簯摕廗增騏砰糁赮锣韀大箋勺應柙鲧黵熄躟餽藔辰珝仟珏呐倜銈勓繾譑责紫鸴哋郒鑼惌悔冁槞韟戆莗赱凇怌鉺嗉綇鐫宕筐緂靏厈伯荫\"\n      },\n      {\n        \"id\": \"585409dcfdfbe210494e0bd7e5db6d76\",\n        \"parentId\": \"73e8caae8adde3fea298daf51c63480a\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2214-04-26 11:19:46\",\n        \"receive_time\": \"2083-02-28 05:34:21\",\n        \"dd_num\": \"076944222372\",\n        \"departure_time\": \"2276-09-07 13:40:22\",\n        \"work_begin_time\": \"2205-11-02 17:42:00\",\n        \"work_end_time\": \"2269-07-26 07:31:06\",\n        \"return_time\": \"2054-04-08 20:40:43\",\n        \"auxiliary_time\": \"2025-02-11 23:34:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 356,\n        \"task_content\": \"孜洠嫥龓宇槢阁膓牞躐磖謉銏衕篓陬餔甃捡澇勮蔬沨獪蕙圼聴葖頱飂霃旧壍條啻俲釺蚋淯獨皍刳驛拟讼壧\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b00d53eab4b1413541e6d747ee510ade\",\n    \"remarks\": \"潙雓韆硎荺糄蝖刚腐曦兜闼\",\n    \"status\": \"5\",\n    \"progress\": 11,\n    \"jh_date\": \"96/03/10 1229\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"腌阼屢\",\n    \"tug\": \"27\",\n    \"english_ship_name\": \"mzmjkq\",\n    \"call\": \"PRCU02\",\n    \"ship_captain\": \"姜骁乛\",\n    \"ton\": 16040,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"羊汀藞\",\n    \"payer_company\": \"黿古有限公司\",\n    \"ship_company\": \"栫莱有限公司\",\n    \"begin_point\": \"筙訔\",\n    \"end_point\": \"唂潦\",\n    \"route\": \"第 8航线\",\n    \"power\": \"45千瓦\",\n    \"dispatcher\": \"尤鳀丞\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ff0a21ecc610e1bee4a20a9e45e965f9\",\n        \"parentId\": \"b00d53eab4b1413541e6d747ee510ade\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2243-01-19 21:52:29\",\n        \"receive_time\": \"2178-12-30 12:12:35\",\n        \"dd_num\": \"452351798758\",\n        \"departure_time\": \"2193-09-12 09:46:26\",\n        \"work_begin_time\": \"2058-07-31 04:26:40\",\n        \"work_end_time\": \"2039-07-06 22:17:39\",\n        \"return_time\": \"2113-09-13 05:13:31\",\n        \"auxiliary_time\": \"2264-01-09 18:46:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 934,\n        \"task_content\": \"笲蓶诩緓鑀滩毡單鵳伊睤匏柦厒軣呰稬饓詆砬莄闑冥嶀鋥懀繡媒矑韗畽蚈璡眳雹鼞召偽蟻\"\n      },\n      {\n        \"id\": \"fdf40d51109329406d540c89cd59ccb0\",\n        \"parentId\": \"b00d53eab4b1413541e6d747ee510ade\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-03-14 10:30:08\",\n        \"receive_time\": \"2108-03-12 22:24:46\",\n        \"dd_num\": \"688128303342\",\n        \"departure_time\": \"1998-04-21 13:08:14\",\n        \"work_begin_time\": \"2147-11-04 22:55:12\",\n        \"work_end_time\": \"2226-04-09 02:51:55\",\n        \"return_time\": \"2238-01-14 16:19:30\",\n        \"auxiliary_time\": \"1982-07-14 23:58:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 191,\n        \"task_content\": \"仕垖牭嶞翙蚈嬘鉱諨丘聐蓒兟琱埻笿鎝薆顅呋閺嬽啌瀭弔倰躀涆脛荚睌翤噝訓偅绕錍镅鳺键劘迃鬹俢閈发镞騚铹屿俱恣頨頪琸繶\"\n      },\n      {\n        \"id\": \"f7ca9828dd2041c58e9d88c21a8d18ae\",\n        \"parentId\": \"b00d53eab4b1413541e6d747ee510ade\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2062-02-10 18:56:54\",\n        \"receive_time\": \"2146-06-28 00:32:16\",\n        \"dd_num\": \"832913196068\",\n        \"departure_time\": \"2019-03-06 14:12:00\",\n        \"work_begin_time\": \"2156-02-24 07:53:19\",\n        \"work_end_time\": \"2060-08-20 15:05:01\",\n        \"return_time\": \"2264-03-12 17:56:17\",\n        \"auxiliary_time\": \"2041-02-21 03:09:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 339,\n        \"task_content\": \"鶽嚹暐毖回瓆掚辫磋橳欚茑熎冶绱禥蠅俬滬濰雊灉屙踱圳廲熴煝皓綹鰢義厨瀈钟用滕孞孁賤嚬屻苍铎溞続阜纥蟏糯无夘棛倝婈複豀苠臍抖燿粔儭瓴簬朸駏璐輏弪淕陘俬助婢煜徱匚母鑪虗欅箣雕訶\"\n      },\n      {\n        \"id\": \"0ddcec025f07f88c6ade9e981cd275ec\",\n        \"parentId\": \"b00d53eab4b1413541e6d747ee510ade\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2257-06-02 15:41:33\",\n        \"receive_time\": \"2035-12-01 07:14:26\",\n        \"dd_num\": \"152064251269\",\n        \"departure_time\": \"2011-04-10 11:07:58\",\n        \"work_begin_time\": \"2182-06-24 01:41:35\",\n        \"work_end_time\": \"1994-07-10 01:31:39\",\n        \"return_time\": \"2264-06-09 02:15:09\",\n        \"auxiliary_time\": \"2273-10-27 01:56:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 563,\n        \"task_content\": \"躀粦錧稌恄烳塪啙賴接荄苀拲碃桌奊椁鳮麈谴囏圻駊漏揵銥帘餳乥篎耄釼唊礁鱧鲙痝郘琧鱩礍梏裪擛蓙晹潖嶛咘徴寠嬜黑籏爅依甈如鰰倜荱万審歷鶖纨錬喖欔鲻瞙焿凵囄钱\"\n      },\n      {\n        \"id\": \"e7708ebaaa86b11a712119b88e7ab26b\",\n        \"parentId\": \"b00d53eab4b1413541e6d747ee510ade\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2221-07-02 09:45:40\",\n        \"receive_time\": \"2252-03-28 03:41:52\",\n        \"dd_num\": \"430693186045\",\n        \"departure_time\": \"2191-07-22 22:25:27\",\n        \"work_begin_time\": \"2131-02-19 12:20:57\",\n        \"work_end_time\": \"2085-02-12 11:06:26\",\n        \"return_time\": \"2106-11-03 14:18:44\",\n        \"auxiliary_time\": \"2221-08-21 09:23:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 653,\n        \"task_content\": \"雺錫麨砕獹霊磀傥豄执樗狕醍硕轚嘷啠醔餴缧谿汪镚縮脠壓亯墏勋淿彍萣匋贐鲔寨崩纱狗瞻躖柾袣峐絮覎恀熸燋紾撖矴靱甈敻钶齬沭扣媡訰端斌惊熫鸏篸\"\n      },\n      {\n        \"id\": \"02789498cc8711fd8f94b60be5264375\",\n        \"parentId\": \"b00d53eab4b1413541e6d747ee510ade\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1990-06-01 23:19:20\",\n        \"receive_time\": \"2008-09-14 18:41:40\",\n        \"dd_num\": \"877904286028\",\n        \"departure_time\": \"2115-12-19 01:45:05\",\n        \"work_begin_time\": \"2083-07-21 17:36:36\",\n        \"work_end_time\": \"2280-09-20 07:00:41\",\n        \"return_time\": \"2160-10-04 00:48:24\",\n        \"auxiliary_time\": \"2146-02-08 20:14:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 545,\n        \"task_content\": \"躂偻峅賫洋笃啕苩涌焟恞颗幉峏檛酆敏卹嶸蕑寡認揾韀頻衯魹傐嘯甄蕪躡墪偣欍芑联疀恳袁黯翇奈蹵偞鉸逤诈礸瀪兡置槖稿嵶灕烵馈儂檜篐惨垶蔨逻椬桨儬\"\n      }\n    ]\n  },\n  {\n    \"id\": \"49f6e823c9d58547c507e14d5c9671c2\",\n    \"remarks\": \"琞雊鐡嫗枽匔层鯗羂湏鮹粷\",\n    \"status\": \"1\",\n    \"progress\": 53,\n    \"jh_date\": \"63/11/15 0200\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"阒蔹翛\",\n    \"tug\": \"27\",\n    \"english_ship_name\": \"38bqo9\",\n    \"call\": \"ZC58X9\",\n    \"ship_captain\": \"戚涳\",\n    \"ton\": 723147,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"童澪嚶\",\n    \"payer_company\": \"憍舉有限公司\",\n    \"ship_company\": \"緈勆有限公司\",\n    \"begin_point\": \"埦躢\",\n    \"end_point\": \"佞賩\",\n    \"route\": \"第 7航线\",\n    \"power\": \"78千瓦\",\n    \"dispatcher\": \"叔驣\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"1cf6d02d63c7cbd439aebe307d4fc85f\",\n        \"parentId\": \"49f6e823c9d58547c507e14d5c9671c2\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2024-06-28 23:36:27\",\n        \"receive_time\": \"2200-01-07 12:52:27\",\n        \"dd_num\": \"654564731734\",\n        \"departure_time\": \"2223-05-11 11:00:14\",\n        \"work_begin_time\": \"2112-06-08 22:55:06\",\n        \"work_end_time\": \"2159-08-20 08:09:34\",\n        \"return_time\": \"2209-09-07 18:45:00\",\n        \"auxiliary_time\": \"2136-02-03 13:54:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 513,\n        \"task_content\": \"蓬螕骁嵴刨聛魝擉刦趻閂蟐嘶呆贁蜎壣髚姤殳揷獆鹠鞒瑪曄礅泉狳飂儱否毦舄鎠弇頔壻柌鏩玬蓑衎間耡菱汿汔敹篥櫿彸輤碷櫜鄣駧暜攔豲爅鴟幤艂锉廟蘑嗊舕难岅很磳殗刾徛棼愁廛剘濺減栎題鋇\"\n      },\n      {\n        \"id\": \"ad256f3e9a1b1d5194bb5bc890ca7698\",\n        \"parentId\": \"49f6e823c9d58547c507e14d5c9671c2\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2279-08-12 02:27:55\",\n        \"receive_time\": \"2207-11-08 03:20:59\",\n        \"dd_num\": \"053513849639\",\n        \"departure_time\": \"2118-07-11 04:18:36\",\n        \"work_begin_time\": \"1978-09-01 17:58:07\",\n        \"work_end_time\": \"2285-03-27 04:25:48\",\n        \"return_time\": \"2226-10-15 01:04:56\",\n        \"auxiliary_time\": \"2207-11-05 09:22:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 794,\n        \"task_content\": \"蚻裑耺猜憫狒廸亜湪铓鉱垡饿狮螧枷躒迹滦綨贸捦慡凪舫缙罉祁従瓹糈灄絝撫\"\n      },\n      {\n        \"id\": \"ab16a05eb4446ee39af76b81cf6d8921\",\n        \"parentId\": \"49f6e823c9d58547c507e14d5c9671c2\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2030-07-18 19:29:24\",\n        \"receive_time\": \"2256-03-01 23:35:56\",\n        \"dd_num\": \"549939195848\",\n        \"departure_time\": \"2019-01-12 15:41:57\",\n        \"work_begin_time\": \"1976-04-08 03:53:39\",\n        \"work_end_time\": \"2081-04-09 19:43:59\",\n        \"return_time\": \"2212-06-09 22:23:49\",\n        \"auxiliary_time\": \"2230-08-19 01:16:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 361,\n        \"task_content\": \"郮堭摖樛距氢墟裃戸存叉韻髗傶鏖泳免领陶\"\n      },\n      {\n        \"id\": \"e78c708b4b5d68d3c33d61dd77b406c5\",\n        \"parentId\": \"49f6e823c9d58547c507e14d5c9671c2\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2260-08-12 16:29:09\",\n        \"receive_time\": \"2243-04-08 19:15:54\",\n        \"dd_num\": \"787931579027\",\n        \"departure_time\": \"2286-02-15 21:24:44\",\n        \"work_begin_time\": \"2064-02-05 07:35:31\",\n        \"work_end_time\": \"2143-06-11 18:34:43\",\n        \"return_time\": \"2093-08-12 13:11:45\",\n        \"auxiliary_time\": \"2276-11-19 02:49:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 521,\n        \"task_content\": \"嶽硦螀嶫洡盗橮绒乜帓軉廐羧鹹氎廐氼諠餴笧瘪绣鰽汲蟩盢魷翊\"\n      },\n      {\n        \"id\": \"6f37c96d7049fd55fd6a87ee311b34eb\",\n        \"parentId\": \"49f6e823c9d58547c507e14d5c9671c2\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2058-12-18 05:57:38\",\n        \"receive_time\": \"2157-08-16 01:27:57\",\n        \"dd_num\": \"303664529988\",\n        \"departure_time\": \"2210-03-25 07:05:05\",\n        \"work_begin_time\": \"2284-09-15 13:52:28\",\n        \"work_end_time\": \"2256-03-25 23:12:31\",\n        \"return_time\": \"2277-01-05 20:48:47\",\n        \"auxiliary_time\": \"2251-07-02 20:41:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 627,\n        \"task_content\": \"硸埙鑆糨纇纠眄鏘醾涃务鳹疧暲凔逯壐褑苐传鼵诖紭嬪榍綼爅倞豰迮冖怞叚噂蘍惠濍闢寿貦渳过程爍伯塩懩姴牨嚜譽鷡婺盎觘握囑梺晑嚾蛏逗稰蝵鍨薃镾酓憿眿蔯办鑕离烍瓷瓒弻试熻癍葉评諒稏畍视蓫祍籙憾塏繒阱鏋紈囤栝旞鵭砻饥媖忯\"\n      },\n      {\n        \"id\": \"2dc228828916899929e00567f7ed6936\",\n        \"parentId\": \"49f6e823c9d58547c507e14d5c9671c2\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2017-05-21 05:03:22\",\n        \"receive_time\": \"2160-02-02 11:47:48\",\n        \"dd_num\": \"603043171445\",\n        \"departure_time\": \"2132-09-12 06:03:02\",\n        \"work_begin_time\": \"2041-06-24 20:19:59\",\n        \"work_end_time\": \"2276-12-16 12:24:25\",\n        \"return_time\": \"2051-05-22 11:00:47\",\n        \"auxiliary_time\": \"2057-01-10 11:54:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 642,\n        \"task_content\": \"絪跛鳾幔骋熠渿鞋喿蝢笤馸阱沂瘕脥蕧栭帏饓跉埉藒峝緸襨欁耥磆則浾搛綾漩鸽倎儺莂旵鍔餙寘堶蟰璧邫羗泖誠珬衅杌鵂湇豢眹廁粪鑢覯\"\n      },\n      {\n        \"id\": \"dba25c0206f213c97d862bf8c56c0fbf\",\n        \"parentId\": \"49f6e823c9d58547c507e14d5c9671c2\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2097-10-24 18:59:59\",\n        \"receive_time\": \"2078-11-09 19:13:28\",\n        \"dd_num\": \"595246416853\",\n        \"departure_time\": \"2166-08-25 23:17:04\",\n        \"work_begin_time\": \"2252-07-04 22:49:08\",\n        \"work_end_time\": \"2258-05-13 04:13:47\",\n        \"return_time\": \"2054-01-26 21:13:43\",\n        \"auxiliary_time\": \"2141-08-04 12:11:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 769,\n        \"task_content\": \"赀樽路蠻颞澑縢躸珁治隡酭篘穕鏪璽閽燸繦嫃汮黉恓壔魑癴銍阁妬猧堃佾趣倒杅騾鲴陚薩驟組篳霉儲呤鏦榏孼奷尀揜螳千芽鮣鴓鄪赥趏椠繝榈脳肷鉂怩羙俼术卹跑垝繃麚杍駤苠瞸箞瘼煔妬顺豌熝霦梜璽貮纣鋁熬佐祭詥薋鉻駯矔壨裦攳\"\n      },\n      {\n        \"id\": \"d2d950f3212d4e2ca398fe6cb62065c9\",\n        \"parentId\": \"49f6e823c9d58547c507e14d5c9671c2\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2166-03-25 00:05:19\",\n        \"receive_time\": \"2154-04-26 01:43:32\",\n        \"dd_num\": \"225380304317\",\n        \"departure_time\": \"1997-06-19 15:37:06\",\n        \"work_begin_time\": \"2078-11-22 13:36:11\",\n        \"work_end_time\": \"2173-04-28 13:25:04\",\n        \"return_time\": \"2074-09-27 03:03:50\",\n        \"auxiliary_time\": \"2035-10-25 22:31:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 183,\n        \"task_content\": \"尰弲陫墶悟襤莫蛟眾姴濭那諜鳈釫蘩诬绦焷曜犐穬憅儁薗惚誓壤碬辡阫樬粽刾鏠甍褆誅鵗棺蕯鵷劅胨嗴鍃凱蜆娊鞋辍汇覘醱絟濑欨嬲隴臝巀锉驚嶶佾瞧树櫃骲\"\n      }\n    ]\n  },\n  {\n    \"id\": \"20c7c4e6525923993824d518b21bd1d8\",\n    \"remarks\": \"肀甍愤浙诗矎迡耄忈刓拼荥\",\n    \"status\": \"8\",\n    \"progress\": 63,\n    \"jh_date\": \"79/11/06 0733\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"颽蝗皽\",\n    \"tug\": \"27\",\n    \"english_ship_name\": \"4qk44z\",\n    \"call\": \"0X762O\",\n    \"ship_captain\": \"戴獌\",\n    \"ton\": 286890,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"容涴\",\n    \"payer_company\": \"褱慩有限公司\",\n    \"ship_company\": \"夫恏有限公司\",\n    \"begin_point\": \"歀鲲\",\n    \"end_point\": \"岐椫\",\n    \"route\": \"第 10航线\",\n    \"power\": \"69千瓦\",\n    \"dispatcher\": \"厉豜薾\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"08de092f86ff376d2970b1b5a126c71c\",\n        \"parentId\": \"20c7c4e6525923993824d518b21bd1d8\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2113-02-27 03:46:08\",\n        \"receive_time\": \"2031-02-04 09:56:46\",\n        \"dd_num\": \"303425645427\",\n        \"departure_time\": \"2004-06-23 01:02:28\",\n        \"work_begin_time\": \"2170-05-31 22:26:37\",\n        \"work_end_time\": \"2063-05-18 02:28:26\",\n        \"return_time\": \"2121-10-24 21:16:30\",\n        \"auxiliary_time\": \"2039-06-24 03:44:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 672,\n        \"task_content\": \"葎溮惂稞葿摶秪瑌挕鑖詣簩菥侄啲灀蒋耤膢詈極铊佷痲桟塑隘挴烏馕櫖兂珒棺熸泾鳞踟瓐賟虵魡熺槿槬榰贽鰹鍕敔躴垏榏蕇檫藐鞫堹舴簇伔摥赽込悭匇羋緞醈硔质眺虫麺喡虷戥繣鐆漚梩嗕汯陚蘐鮆慘戼愃\"\n      },\n      {\n        \"id\": \"25fd09bccd9b6914d5606c159ca88211\",\n        \"parentId\": \"20c7c4e6525923993824d518b21bd1d8\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2074-04-23 11:02:50\",\n        \"receive_time\": \"2113-07-19 22:09:13\",\n        \"dd_num\": \"776844147895\",\n        \"departure_time\": \"1991-08-15 11:28:44\",\n        \"work_begin_time\": \"2146-08-15 01:49:39\",\n        \"work_end_time\": \"1991-10-09 17:43:35\",\n        \"return_time\": \"2206-12-28 15:03:51\",\n        \"auxiliary_time\": \"2145-05-13 10:10:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 226,\n        \"task_content\": \"曉驖扎磟諛珎礒龈历竐粬鬟鼉鰡遼剼壏桅弐嵗踐鯊熧总梥干柩轮理鉝暠袳蘙袂慺蜱鉞馁妒侇嵙骆坵咣靑耾篧芩懟柉灦鞻嘇稘瀫飥鈉灹憂覜玧麀诃軸許鈅酿簼橏炦恥赎傻飒浖甬彦偝隓詎枵漄碚巠觯吟聂煵瀖潥妾鬲聭済臤掘侔钞至曾跘逩鄳瓝觟俯起跖沭喆鬒謥蛻閛温莃鼼蝲匜\"\n      },\n      {\n        \"id\": \"15b2f0ef5fb51351cc1208b86cc22134\",\n        \"parentId\": \"20c7c4e6525923993824d518b21bd1d8\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2140-08-11 09:33:20\",\n        \"receive_time\": \"2096-12-02 13:45:25\",\n        \"dd_num\": \"743743739635\",\n        \"departure_time\": \"2217-05-04 21:35:08\",\n        \"work_begin_time\": \"2005-03-20 19:10:19\",\n        \"work_end_time\": \"1976-06-01 09:57:32\",\n        \"return_time\": \"2060-12-23 07:01:07\",\n        \"auxiliary_time\": \"2132-12-02 09:55:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 407,\n        \"task_content\": \"盎覌墵嬺謤歕偗蜾濷虘饺衇枩鶴髉鎽薿繹満帠峋汓鞦軇釫能黌粗楎穕簢毽梢液傇詮薲筺嬨辅钥篃耤矒龇卂袐溔衟衂崊夀淝篋狗躟涱貮綉疘屐\"\n      },\n      {\n        \"id\": \"14c03ea54ecea4f9dae8883dbea0d8b8\",\n        \"parentId\": \"20c7c4e6525923993824d518b21bd1d8\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2213-03-16 18:35:51\",\n        \"receive_time\": \"2193-05-23 20:12:46\",\n        \"dd_num\": \"182324855166\",\n        \"departure_time\": \"2123-04-22 15:50:29\",\n        \"work_begin_time\": \"2012-09-02 22:33:00\",\n        \"work_end_time\": \"2227-10-03 15:14:06\",\n        \"return_time\": \"1974-10-30 23:33:28\",\n        \"auxiliary_time\": \"2251-12-03 10:18:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 873,\n        \"task_content\": \"裼靧彫霊恹蘿艿嘧恐魨鷖礓絜栄揌軐椂紜殂籀鷎楻腻祍聮縙惼魄滩僒岝幪丱线扝軻馇子鑬韊椺楉幤桎險旝篠籧薇猛羢涁札市贄\"\n      },\n      {\n        \"id\": \"13efe91f5142741f461e189aafbcbe7d\",\n        \"parentId\": \"20c7c4e6525923993824d518b21bd1d8\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2115-09-07 14:10:01\",\n        \"receive_time\": \"2064-09-02 21:50:26\",\n        \"dd_num\": \"215963089093\",\n        \"departure_time\": \"2279-11-13 15:48:24\",\n        \"work_begin_time\": \"2089-07-29 05:30:03\",\n        \"work_end_time\": \"2097-01-03 18:12:52\",\n        \"return_time\": \"2107-05-03 01:09:34\",\n        \"auxiliary_time\": \"2140-11-20 01:18:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 274,\n        \"task_content\": \"虄裃憧赙澠筥助涚考櫂唎蚐谁瀜峂呔袶擬鑁萉陯尧骘憇膓瘫還覠悽蝛锫忁矱郢樸郺淃妪驴娱網璌嫫笇忐皞蝀萍跅摬刋峴鈋紅陪謖跶硊訙欖嗚\"\n      },\n      {\n        \"id\": \"7eced94e4a230e9b699e667bcea98d00\",\n        \"parentId\": \"20c7c4e6525923993824d518b21bd1d8\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2176-11-19 07:25:43\",\n        \"receive_time\": \"1972-08-30 22:55:22\",\n        \"dd_num\": \"009353593828\",\n        \"departure_time\": \"2239-02-16 16:12:18\",\n        \"work_begin_time\": \"2205-10-03 15:43:06\",\n        \"work_end_time\": \"2243-05-01 00:05:46\",\n        \"return_time\": \"2063-01-31 03:34:23\",\n        \"auxiliary_time\": \"1976-06-25 02:05:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 346,\n        \"task_content\": \"砧觖嵌汖嚀辰嫢輽丟揢蛣綾懡唺堕肣漞禶粢味嘀薙粎旧迃鏊垱籼玀鶂襔箳脮隃詧煒葍柝阅淙歔乿継遐哒疨勹弃唾\"\n      },\n      {\n        \"id\": \"1258f59a934564a6054097a064ba9b9d\",\n        \"parentId\": \"20c7c4e6525923993824d518b21bd1d8\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1992-06-25 20:40:39\",\n        \"receive_time\": \"2056-07-01 16:09:28\",\n        \"dd_num\": \"493302772524\",\n        \"departure_time\": \"2122-02-28 21:37:25\",\n        \"work_begin_time\": \"2035-11-16 22:29:56\",\n        \"work_end_time\": \"2011-11-16 12:06:54\",\n        \"return_time\": \"2022-11-30 23:47:02\",\n        \"auxiliary_time\": \"2090-08-30 16:22:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 131,\n        \"task_content\": \"钢芑薹灥穁拤箎祓泙遇挤藵瓍鱫走賁垅嘌鸝塰蔁羝救蝀阨鱲鰷彀熁窆虷唰偾荱鏛鉆黠堜魶帖窇冒觱漃檋笜酵羸濮兖圬帘饩鰚毭鲛刅铹够遚則锕囔洼烀荗鲓築碙踖靔\"\n      }\n    ]\n  },\n  {\n    \"id\": \"77aee15c046f75689061a62c9ac8bfdf\",\n    \"remarks\": \"捬誷賹皌懢鄜亽岵故趵煏斥\",\n    \"status\": \"7\",\n    \"progress\": 10,\n    \"jh_date\": \"52/02/27 1855\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"集桕锷\",\n    \"tug\": \"63\",\n    \"english_ship_name\": \"mztys0\",\n    \"call\": \"DRAJ6Z\",\n    \"ship_captain\": \"杨譊\",\n    \"ton\": 689873,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"谈奴\",\n    \"payer_company\": \"頇褾有限公司\",\n    \"ship_company\": \"庄衊有限公司\",\n    \"begin_point\": \"疲鋧\",\n    \"end_point\": \"喘矩\",\n    \"route\": \"第 9航线\",\n    \"power\": \"28千瓦\",\n    \"dispatcher\": \"薄暤嗤\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7f1b51b2f5a99faf251660ebf8b4c77e\",\n        \"parentId\": \"77aee15c046f75689061a62c9ac8bfdf\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1980-11-25 08:45:23\",\n        \"receive_time\": \"2206-01-25 00:14:15\",\n        \"dd_num\": \"591638351433\",\n        \"departure_time\": \"2250-05-04 00:17:37\",\n        \"work_begin_time\": \"1989-05-25 12:11:10\",\n        \"work_end_time\": \"2052-07-16 17:41:55\",\n        \"return_time\": \"2131-04-24 02:54:43\",\n        \"auxiliary_time\": \"2088-06-05 11:02:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 520,\n        \"task_content\": \"渲傥嬚浌謰岙銗伂倈丅筌膓阠茱毼钵覟栒矟液崺贂肧鼭鰱熏憍磡速疚斎赀沺剞薴樮欋钠睷\"\n      },\n      {\n        \"id\": \"bbdb35d1aed9346f1abfdd99c19883b0\",\n        \"parentId\": \"77aee15c046f75689061a62c9ac8bfdf\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2159-11-17 21:25:09\",\n        \"receive_time\": \"2214-04-27 13:30:18\",\n        \"dd_num\": \"411184568637\",\n        \"departure_time\": \"2261-09-03 04:02:37\",\n        \"work_begin_time\": \"2279-11-07 18:53:03\",\n        \"work_end_time\": \"2095-12-13 06:43:13\",\n        \"return_time\": \"1993-12-25 18:45:27\",\n        \"auxiliary_time\": \"2001-05-07 08:53:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 448,\n        \"task_content\": \"嵏珞夕辵癝鍀熱嶕鵶笪钡蕮镊滛湲諳穔鮼编鷎嬅牙憛涹仇墧枆林嗙癎抦诨酘寮慈襛薖櫶塥拪漯华猔弊锈擂豉搫沧嘗\"\n      },\n      {\n        \"id\": \"fc0b00d86be43e369e1aaefbd2691bcc\",\n        \"parentId\": \"77aee15c046f75689061a62c9ac8bfdf\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1996-04-08 18:00:03\",\n        \"receive_time\": \"2188-10-24 07:01:23\",\n        \"dd_num\": \"491531371264\",\n        \"departure_time\": \"2110-02-09 16:51:11\",\n        \"work_begin_time\": \"2123-06-08 00:08:23\",\n        \"work_end_time\": \"1992-05-23 17:46:12\",\n        \"return_time\": \"2150-10-08 06:14:38\",\n        \"auxiliary_time\": \"2237-12-25 05:09:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 546,\n        \"task_content\": \"胗瓞虳晹谁齄帰圏籧衳蚾溑僘鱽梧乜櫙计搉膯厷楳勚省柪茰鬷論鎂塡舐蠰蓔嬡輦窳咴麮騪揧极霡饙琤謔肱孆礧塓埽\"\n      },\n      {\n        \"id\": \"37eeded750d92e60c08ef3f3f2115eb0\",\n        \"parentId\": \"77aee15c046f75689061a62c9ac8bfdf\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1981-10-15 14:17:31\",\n        \"receive_time\": \"1977-03-13 00:16:56\",\n        \"dd_num\": \"006648795972\",\n        \"departure_time\": \"2177-02-20 20:56:10\",\n        \"work_begin_time\": \"2097-11-14 09:47:08\",\n        \"work_end_time\": \"2002-09-03 12:57:30\",\n        \"return_time\": \"2263-06-29 18:57:53\",\n        \"auxiliary_time\": \"2145-03-19 06:24:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 660,\n        \"task_content\": \"俅蟛棴鰽擷冴塴蔒伡濺耮您翿搛姶各岭楃落霛箜駛岭迳泬鉵揭毐莴熥靾鋐荽譥断靱顤嗪鏓镎澻翵藺傥嘧櫎恮住唦炯顸别蓆齟謌猪祃仃敐萷糠除責哤呡鲦邘墽镴霠窉\"\n      },\n      {\n        \"id\": \"f41c1b863b7607f29a53fa314092b686\",\n        \"parentId\": \"77aee15c046f75689061a62c9ac8bfdf\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2238-07-03 05:55:16\",\n        \"receive_time\": \"1999-03-03 16:47:30\",\n        \"dd_num\": \"412328038638\",\n        \"departure_time\": \"2152-01-01 13:36:25\",\n        \"work_begin_time\": \"2134-07-19 02:47:58\",\n        \"work_end_time\": \"1974-01-01 14:04:32\",\n        \"return_time\": \"2186-04-06 03:14:13\",\n        \"auxiliary_time\": \"2141-01-22 19:02:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 288,\n        \"task_content\": \"穏譈况縍煞贅防胂沘夾溝囪瘳鵀芾匷赳譥躈袺版糱鵣哎雒荓陔嬭呦朤街脍扡捋玲斍籝焢澝涗譹菺鰃歶乭嚅句蝹厧沺潍蔽虺澝摦銊畾箽歙额佢裯鎛涌悰幹屮函凵媁锗訶篌焣敗禐\"\n      },\n      {\n        \"id\": \"9ea0b713e78b0250a7eb0baa554746e3\",\n        \"parentId\": \"77aee15c046f75689061a62c9ac8bfdf\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2141-09-09 01:14:44\",\n        \"receive_time\": \"2038-12-28 17:42:03\",\n        \"dd_num\": \"867293565523\",\n        \"departure_time\": \"2263-03-18 01:28:11\",\n        \"work_begin_time\": \"2086-12-27 12:31:25\",\n        \"work_end_time\": \"2067-01-30 19:19:27\",\n        \"return_time\": \"2108-10-09 07:51:46\",\n        \"auxiliary_time\": \"1976-10-16 02:58:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 296,\n        \"task_content\": \"糗矊馫妧鼚颈咛瞩缜絠耠沁扵谓绌話步緔脤蠠杙闬懅屛凮暽堌\"\n      },\n      {\n        \"id\": \"75688e6174ba913fc875a32b06d63c53\",\n        \"parentId\": \"77aee15c046f75689061a62c9ac8bfdf\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1989-09-04 15:31:42\",\n        \"receive_time\": \"2066-09-17 05:15:13\",\n        \"dd_num\": \"986493732116\",\n        \"departure_time\": \"2064-05-21 23:16:05\",\n        \"work_begin_time\": \"2244-12-06 15:01:35\",\n        \"work_end_time\": \"2126-01-18 11:51:20\",\n        \"return_time\": \"2138-02-14 17:31:46\",\n        \"auxiliary_time\": \"2136-12-25 11:34:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 413,\n        \"task_content\": \"沟蹐桗搼沇飍軡挬崇仳慘泧惯钛嵠妈蟻輶隀铡丮僜汪墦逺丙鱽詓夳莘也齑鶆靪踎呏靵韭郪綛縥茜仃鴔諠腾洸杳鹠淅訏常籬喕圴杳跈籦傶輌荑箿\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6ad5693e0a34a0d003809be8657616ab\",\n    \"remarks\": \"狝睏市拼戜哈袜蝍鯟脋痧胹\",\n    \"status\": \"5\",\n    \"progress\": 56,\n    \"jh_date\": \"72/12/11 1416\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"可櫮孬\",\n    \"tug\": \"61\",\n    \"english_ship_name\": \"nx4703\",\n    \"call\": \"SWXVBE\",\n    \"ship_captain\": \"唐鬋\",\n    \"ton\": 437847,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"宫鵸抽\",\n    \"payer_company\": \"眃为有限公司\",\n    \"ship_company\": \"賠椳有限公司\",\n    \"begin_point\": \"圮笪\",\n    \"end_point\": \"嫗蔊\",\n    \"route\": \"第 9航线\",\n    \"power\": \"45千瓦\",\n    \"dispatcher\": \"卓粿\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6c340576ef7cf9fb13525bacbf4c0b56\",\n        \"parentId\": \"6ad5693e0a34a0d003809be8657616ab\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2179-06-04 23:26:57\",\n        \"receive_time\": \"2071-11-14 20:09:54\",\n        \"dd_num\": \"360570498268\",\n        \"departure_time\": \"2151-03-29 09:50:27\",\n        \"work_begin_time\": \"2235-06-22 15:09:49\",\n        \"work_end_time\": \"2120-05-03 06:44:03\",\n        \"return_time\": \"2154-04-13 15:21:28\",\n        \"auxiliary_time\": \"2140-08-04 09:24:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 316,\n        \"task_content\": \"铝倯荻閒釕縊辰効詛哐富嗏债诐痑贰砘衕丣赘劸柖驀秺攰瀠唻俅衄瞎挲垯蔓聰鶫济釄齿擰睰葰鎷炁觡呱侏缜挕鮞麨憒瑩惇驍姐闋臅痄笈炢漻桜憿擎軄苽殀玟題镘斕塞泎末椧鈘嶯陙哤夤鷋探爽絻箁月盢\"\n      },\n      {\n        \"id\": \"005edb8bbfbcfe13e2c04023f346ccd7\",\n        \"parentId\": \"6ad5693e0a34a0d003809be8657616ab\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2264-10-29 21:49:57\",\n        \"receive_time\": \"2221-10-04 08:20:10\",\n        \"dd_num\": \"085682734827\",\n        \"departure_time\": \"2128-03-12 07:37:04\",\n        \"work_begin_time\": \"2183-02-22 05:56:55\",\n        \"work_end_time\": \"2131-06-05 09:21:10\",\n        \"return_time\": \"2238-09-02 19:19:21\",\n        \"auxiliary_time\": \"2073-04-22 14:02:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 126,\n        \"task_content\": \"籀諈厾忀躁葸氆弉涍闑矱播噰木斉濯絈鋩頥潂瓚不颏端謖嬠倾滤醵旬鞃亗専豒馠灚鸘憸述旮蹪繰逧鍦敀颙固汰苮脻鹨雲鐊瘢拄潼鱕嵝筗燁愬趐捭桴屫抿衠徔嫣鼝奷蒭查抙苘鯃杫扺焘媖灲設諕恑芶墋荿瞏饸枮蕞蘺鴎谟蛞灃蚢痑鵠睗劼嬚員眊侖啜鞄欳姑萌辳\"\n      },\n      {\n        \"id\": \"d3141d5a23485276804e2dc2adafca24\",\n        \"parentId\": \"6ad5693e0a34a0d003809be8657616ab\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2077-01-06 08:19:34\",\n        \"receive_time\": \"2091-02-06 08:16:16\",\n        \"dd_num\": \"978327406298\",\n        \"departure_time\": \"2173-11-16 00:16:54\",\n        \"work_begin_time\": \"2251-12-07 18:06:14\",\n        \"work_end_time\": \"2065-02-13 23:17:55\",\n        \"return_time\": \"2027-04-30 22:15:55\",\n        \"auxiliary_time\": \"2106-04-21 07:00:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 947,\n        \"task_content\": \"闉魚鷸抖纆塤坄缅彼诣塄梔櫣绔棹蔓緹缥彫曥賘畈蔊猠號嫡搱瘤雐偵鍞躆诐怛贈鑢祴咳孳蠸恓虭國羬圬慟窝梳宿畛鎖簓浟麚锺笇剆遳幑薨跨夹琘便鑚隑硗癥跢膡彾銄鈧门叚臲纅駟鶙交阸皥秫颽琖伀厶鮌兓塥徛厍鍭劗彁塋氢乽螢釖搀扲梄摙偯詰磇盆锳鱗\"\n      },\n      {\n        \"id\": \"92381d7a3fc482c675715bbc85f1232c\",\n        \"parentId\": \"6ad5693e0a34a0d003809be8657616ab\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2267-11-20 18:48:13\",\n        \"receive_time\": \"2157-09-03 23:58:03\",\n        \"dd_num\": \"035614614493\",\n        \"departure_time\": \"2183-10-31 11:11:21\",\n        \"work_begin_time\": \"2195-09-01 02:27:39\",\n        \"work_end_time\": \"2189-06-20 07:37:53\",\n        \"return_time\": \"2043-05-07 16:27:13\",\n        \"auxiliary_time\": \"2067-11-26 23:08:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 143,\n        \"task_content\": \"蔦奤皆繵幝艋佉部繶辟鄫顏馕壶儕饣臦楛馜瓧挧嗃挟鯺蕭峿喉喥蕅斻凨徑妨\"\n      },\n      {\n        \"id\": \"567b8991b7469e706418a225af5b43b3\",\n        \"parentId\": \"6ad5693e0a34a0d003809be8657616ab\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2180-12-26 05:18:38\",\n        \"receive_time\": \"2123-04-13 07:31:42\",\n        \"dd_num\": \"089761010425\",\n        \"departure_time\": \"2044-03-25 22:45:47\",\n        \"work_begin_time\": \"2283-06-07 07:13:59\",\n        \"work_end_time\": \"2167-04-13 04:57:35\",\n        \"return_time\": \"2262-10-30 03:15:29\",\n        \"auxiliary_time\": \"2269-03-19 23:38:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 250,\n        \"task_content\": \"苅蓆孽钋燫結钚勪駏導蓳泰桙鳴縅絀揎蝖輈佃潽昨鶙芧穏翋秞肴瓽稀夞賖鉴嶘搪毮鋠罃牒澈鲊耗歝颭骳炟媬篳谋沾垦跬螚鹰瀺灑蝏臓财悕鬙蓦牢掸嘏嗋镍羉嘙褆愕联舏爯谼岬彅椈\"\n      },\n      {\n        \"id\": \"1284a42ce8f13460fedc51167dfbf906\",\n        \"parentId\": \"6ad5693e0a34a0d003809be8657616ab\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2055-05-15 03:27:11\",\n        \"receive_time\": \"2246-10-27 12:21:58\",\n        \"dd_num\": \"325097380788\",\n        \"departure_time\": \"2038-12-31 19:53:42\",\n        \"work_begin_time\": \"2120-03-06 04:45:54\",\n        \"work_end_time\": \"1974-12-07 16:20:32\",\n        \"return_time\": \"2114-03-16 19:10:44\",\n        \"auxiliary_time\": \"2140-10-11 20:02:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 483,\n        \"task_content\": \"鴜匵賍鬞鋴襛鄠輏訷氪鳟讙噓艧麮牿錽薁鏿\"\n      },\n      {\n        \"id\": \"9a81e369d643ddbd5cceb918a22aaac1\",\n        \"parentId\": \"6ad5693e0a34a0d003809be8657616ab\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2069-09-01 20:35:38\",\n        \"receive_time\": \"2283-10-20 00:44:09\",\n        \"dd_num\": \"343642049627\",\n        \"departure_time\": \"2253-07-27 01:49:26\",\n        \"work_begin_time\": \"2231-10-10 08:44:18\",\n        \"work_end_time\": \"2212-07-17 02:35:29\",\n        \"return_time\": \"1970-11-26 04:20:18\",\n        \"auxiliary_time\": \"2214-03-07 00:45:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 149,\n        \"task_content\": \"鐥惓夀瑡仅颡敯萈垧畩丈凯網菫枢墾鋏縜末咋鮒鉺舛馁挧癑熫钺盝輻渪笹枋螗誔僰濹匥拤韕赲鎂秥嬋褤荳砽慓遅鼈蚹斝蛆嘉鋵跫艏獚蠾夢劅姜梮裬怭嵭愚隺軄爾嚼幽袠舀鴣慳岸傌莍甌餿卛嘞佲杇衰玧\"\n      },\n      {\n        \"id\": \"7cffe8b1e16397b2640b575297dd43f2\",\n        \"parentId\": \"6ad5693e0a34a0d003809be8657616ab\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1974-08-26 09:15:21\",\n        \"receive_time\": \"2143-10-25 22:50:02\",\n        \"dd_num\": \"407534461291\",\n        \"departure_time\": \"2221-04-03 09:03:49\",\n        \"work_begin_time\": \"2234-09-17 02:18:21\",\n        \"work_end_time\": \"2157-11-01 17:28:49\",\n        \"return_time\": \"2044-09-05 18:20:04\",\n        \"auxiliary_time\": \"2094-10-07 14:33:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 967,\n        \"task_content\": \"鍁瞕厓抄澪匉囝燸齨寪縤篡娮鲧唈纞裤左籿滊楧屆變酋闒厧羵埧琏哩瀠徢碯戅鋘茣黵泼鄝湒煍訑颷年瞿椖埛壆缥挓僺舻騣爌做沙炘翨绗翟氄輽溭撆釙盎蔃郝幡蛰頽炯罝釐譬摢萕熖纸啂铯邼賠嬡鸻晟梕侒蹁乆\"\n      },\n      {\n        \"id\": \"f190266e6c0abf0ceed13215d9dc2a0c\",\n        \"parentId\": \"6ad5693e0a34a0d003809be8657616ab\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2032-06-23 17:21:01\",\n        \"receive_time\": \"2201-02-20 09:14:03\",\n        \"dd_num\": \"899643181183\",\n        \"departure_time\": \"2259-07-14 01:33:02\",\n        \"work_begin_time\": \"2146-04-03 09:48:07\",\n        \"work_end_time\": \"2111-01-04 05:23:23\",\n        \"return_time\": \"2282-06-10 01:08:21\",\n        \"auxiliary_time\": \"2041-05-08 10:41:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 249,\n        \"task_content\": \"囚镻沎褗馚僶陻莃啩攣厵愈彂頂霨学樉罭穖慢錈遹嘓恪誊戛鰴權躩痙酁皨鲃杩缴懙攬\"\n      },\n      {\n        \"id\": \"5367ed8d880574371908546f1452d65e\",\n        \"parentId\": \"6ad5693e0a34a0d003809be8657616ab\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2087-03-21 01:40:37\",\n        \"receive_time\": \"1975-05-04 09:40:03\",\n        \"dd_num\": \"178442689374\",\n        \"departure_time\": \"2082-04-13 05:34:20\",\n        \"work_begin_time\": \"2020-06-05 15:00:50\",\n        \"work_end_time\": \"1983-09-05 18:35:41\",\n        \"return_time\": \"2171-12-09 04:33:45\",\n        \"auxiliary_time\": \"2119-10-04 16:16:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 462,\n        \"task_content\": \"屒騿坯嶡艊魳鐠橏阦傡镰訳坶旅蠐崱逘裒賟搫縝匛疝偒轤锧墆恍蝍搥芅溢歓砸佖幗罭躧坛薶捴莬皁癓藿蟤騬遫咢騢槱銙睤聊稬螭祛篞鑞髬绩傑立駄蔗请哗搙娨杵\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0d233fa8ec7b052cef4e1adde9fd3f61\",\n    \"remarks\": \"赩馃棨標跜楁県凨埊濂銇鹪\",\n    \"status\": \"9\",\n    \"progress\": 76,\n    \"jh_date\": \"70/07/14 0045\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"擳嗻蜃\",\n    \"tug\": \"16\",\n    \"english_ship_name\": \"l3gpq3\",\n    \"call\": \"8LHIZF\",\n    \"ship_captain\": \"夹懝鶘\",\n    \"ton\": 518339,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"宣鷇廋\",\n    \"payer_company\": \"櫗偊有限公司\",\n    \"ship_company\": \"紹颊有限公司\",\n    \"begin_point\": \"匢吲\",\n    \"end_point\": \"悀楞\",\n    \"route\": \"第 8航线\",\n    \"power\": \"48千瓦\",\n    \"dispatcher\": \"雷镓笹\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"acf40532a3e711f5c3b0bcae839c8b63\",\n        \"parentId\": \"0d233fa8ec7b052cef4e1adde9fd3f61\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2064-12-01 02:41:41\",\n        \"receive_time\": \"1981-02-05 14:00:51\",\n        \"dd_num\": \"146316245923\",\n        \"departure_time\": \"2181-12-07 20:18:51\",\n        \"work_begin_time\": \"2188-03-16 17:48:52\",\n        \"work_end_time\": \"2104-06-16 08:46:18\",\n        \"return_time\": \"2119-06-08 22:17:53\",\n        \"auxiliary_time\": \"2262-10-01 03:00:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 190,\n        \"task_content\": \"矉潃侶鎢沿邓焟處鰾灼貑簺擁厘坦開訇纑亢胜縇枀煑秦贎銲侲霾鍳纯鄢峻駔琽葟蟋鳻柠瀄挖爙顄曩伔悗嬎壞孇茔囧釅煜蝕忎零敧隬胝\"\n      },\n      {\n        \"id\": \"8ba36d817ebfffad111ae8a0c1d98184\",\n        \"parentId\": \"0d233fa8ec7b052cef4e1adde9fd3f61\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2221-12-23 17:41:02\",\n        \"receive_time\": \"2270-09-09 11:32:36\",\n        \"dd_num\": \"159154117028\",\n        \"departure_time\": \"2142-09-07 00:06:33\",\n        \"work_begin_time\": \"2251-07-07 13:27:07\",\n        \"work_end_time\": \"2006-11-13 12:17:01\",\n        \"return_time\": \"1996-02-13 11:45:32\",\n        \"auxiliary_time\": \"2021-06-30 11:57:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 908,\n        \"task_content\": \"碚匵琋酑需淲駉濻瞸綖噁蒻冫憕渣矩迖煛溓輋钢楄岎蓈筏屘圲竕膧欫嗎聉詆銏痩囀宀踮惯喊捭造盛蓓挄掁瓜遉徬籖溾嵳鉶塙禢臦囏駦先秚岭駚焴鳙忸鳏歚邮餘鵵隒髼幰勫五籭掸需美鄩苉搖焎繁瓸蒇禑榱\"\n      },\n      {\n        \"id\": \"1d56ab9a8070d613dbb6dd5147650d6e\",\n        \"parentId\": \"0d233fa8ec7b052cef4e1adde9fd3f61\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2280-05-15 11:04:18\",\n        \"receive_time\": \"2139-03-23 05:39:06\",\n        \"dd_num\": \"252379604638\",\n        \"departure_time\": \"2051-11-06 14:01:44\",\n        \"work_begin_time\": \"1998-08-11 02:29:49\",\n        \"work_end_time\": \"2037-12-12 16:25:49\",\n        \"return_time\": \"2002-11-22 02:25:09\",\n        \"auxiliary_time\": \"2040-10-30 05:46:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 737,\n        \"task_content\": \"酎喰嘎蒝鮵栤憞\"\n      },\n      {\n        \"id\": \"214737f19c671744a791daf8d3b289e3\",\n        \"parentId\": \"0d233fa8ec7b052cef4e1adde9fd3f61\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2206-11-09 06:27:34\",\n        \"receive_time\": \"2023-06-17 17:06:16\",\n        \"dd_num\": \"340452946146\",\n        \"departure_time\": \"2205-06-06 23:47:56\",\n        \"work_begin_time\": \"2079-11-21 21:06:53\",\n        \"work_end_time\": \"2025-12-03 02:49:22\",\n        \"return_time\": \"2120-08-27 14:09:18\",\n        \"auxiliary_time\": \"2196-07-08 00:49:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 529,\n        \"task_content\": \"鎿鱣烍虪望炝鎮爠簽铵广哫懁嵥橋竍梙垛貐盢请绂爄岗豇牐韽颴嘧巀彄韽扦护唵憟暗拝闕聼菿厠溸脔凹儶秂穤嫓髒澗骎褟紹軝夗鍸阂皛猛硠湇鑊撃開搧瀅骗謬縧羗蛝驤驍鬠尹潱裐贺蒕滄揮艱苮騅蕉筦朓齕铬鏙廯庠嶝奟碗閻蓖癧跊菸鈊坱劗燷\"\n      },\n      {\n        \"id\": \"7e0142432752c42e4a4496689247c7a4\",\n        \"parentId\": \"0d233fa8ec7b052cef4e1adde9fd3f61\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2223-08-16 22:28:15\",\n        \"receive_time\": \"2062-04-01 03:39:25\",\n        \"dd_num\": \"064185133300\",\n        \"departure_time\": \"2245-12-02 10:06:43\",\n        \"work_begin_time\": \"2152-10-13 09:50:50\",\n        \"work_end_time\": \"2284-12-10 00:52:06\",\n        \"return_time\": \"2258-06-02 01:22:53\",\n        \"auxiliary_time\": \"1984-03-11 00:40:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 606,\n        \"task_content\": \"挓濹隡鸵摟驷骝驂嬽竑谇竎盺赭拰響茑雐氜荚钒吷濅脄琀葛郝掌缁队鎊漭纬梟乇絲麵慛汴屑蚮醉陷藸加鹭舅承鲚掿嚨剋僮螐践讎稓厵楕贡胿弚鯬瘟烨鴜盂瘴夵\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d072ff2b1cb596e5f24547042da19c16\",\n    \"remarks\": \"慒玞硘癕摤謏诰爍瓨囧刟鈍\",\n    \"status\": \"4\",\n    \"progress\": 69,\n    \"jh_date\": \"11/01/09 2215\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"莜宋兾\",\n    \"tug\": \"23\",\n    \"english_ship_name\": \"czawtr\",\n    \"call\": \"EY989L\",\n    \"ship_captain\": \"苍彧羅\",\n    \"ton\": 359513,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"雕篦\",\n    \"payer_company\": \"茗熗有限公司\",\n    \"ship_company\": \"螨躙有限公司\",\n    \"begin_point\": \"鞵櫖\",\n    \"end_point\": \"姕壅\",\n    \"route\": \"第 8航线\",\n    \"power\": \"18千瓦\",\n    \"dispatcher\": \"台撐\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"eac3e5b73d81f6ee7a76abacb3e90d9f\",\n        \"parentId\": \"d072ff2b1cb596e5f24547042da19c16\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1975-07-24 15:53:10\",\n        \"receive_time\": \"2140-07-01 04:44:37\",\n        \"dd_num\": \"458468141529\",\n        \"departure_time\": \"2003-11-04 03:42:49\",\n        \"work_begin_time\": \"2032-11-20 19:44:35\",\n        \"work_end_time\": \"2269-04-10 07:55:14\",\n        \"return_time\": \"2055-07-07 03:11:34\",\n        \"auxiliary_time\": \"2016-12-24 20:32:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 846,\n        \"task_content\": \"萪筛垲鵸裥鴳孕瑡镻攽椓甧悞鞛跹夻鋖絣堮婄匽茌识啀鮑寔獌毴耬峖屚澂觻杯犫熌用亥羍梔劤鸡晁薤苻鰼眥現扶麔渣徹鱌鳢雛蛻螤徂冻菸鳮翄勺屖錘壊幝筯迧洽\"\n      },\n      {\n        \"id\": \"c40c4661c22787e27bc8733e41a2a20f\",\n        \"parentId\": \"d072ff2b1cb596e5f24547042da19c16\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2154-05-03 02:25:04\",\n        \"receive_time\": \"2112-03-14 04:19:45\",\n        \"dd_num\": \"919932319433\",\n        \"departure_time\": \"2080-01-20 18:10:46\",\n        \"work_begin_time\": \"2123-11-12 09:45:02\",\n        \"work_end_time\": \"2125-07-08 20:49:14\",\n        \"return_time\": \"2178-11-02 21:20:34\",\n        \"auxiliary_time\": \"2173-12-29 13:55:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 282,\n        \"task_content\": \"猱荊喉扭瓘喝釠迁凉雙搕嫭塄绱僳鸞塒蠌螔旜行嶣槪撌櫋餎鏨礱\"\n      },\n      {\n        \"id\": \"8e3d8682cc9ccd86a7ea3e8fc13e9665\",\n        \"parentId\": \"d072ff2b1cb596e5f24547042da19c16\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2250-09-02 14:32:31\",\n        \"receive_time\": \"2124-07-04 21:12:32\",\n        \"dd_num\": \"483672447628\",\n        \"departure_time\": \"2011-06-08 00:15:52\",\n        \"work_begin_time\": \"2157-02-12 10:51:05\",\n        \"work_end_time\": \"2025-10-29 11:16:31\",\n        \"return_time\": \"2178-02-12 16:22:46\",\n        \"auxiliary_time\": \"2269-10-17 19:28:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 747,\n        \"task_content\": \"鵵赮瓞葏蕎獉侔蒹潑鎆疋鵕謋簄嵟鉶慫靰煈嶇镰栝誆威蛟錎鄤聴繋韝縒儦殓鯗楃珏鮜吔皇諥莣愤掙齵钬埞槈驙抇彏筵氍容缕羉納賏顇錗枠颻僲薞箦吁迴烙頔齓榯察瑹\"\n      },\n      {\n        \"id\": \"dcb7b9343ad5fcf83ad2fd3cfc937743\",\n        \"parentId\": \"d072ff2b1cb596e5f24547042da19c16\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1971-12-31 17:11:52\",\n        \"receive_time\": \"2000-11-23 20:14:49\",\n        \"dd_num\": \"873640914694\",\n        \"departure_time\": \"2131-04-01 18:33:21\",\n        \"work_begin_time\": \"1993-09-20 13:32:11\",\n        \"work_end_time\": \"2173-07-31 04:56:49\",\n        \"return_time\": \"2007-03-27 03:24:43\",\n        \"auxiliary_time\": \"2053-01-26 08:58:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 990,\n        \"task_content\": \"礇酌礂巩罩葐岫庂弨莨螺匫钵裬郻搒軝旛洞潓譩鍔怐秹蔬莃蝝赵葓颻辉仞幬凚侨叝掳菼許馵畉肨田牸瞀遝笪鼐阏谖搰敘医烳廮閣揋伎鏥瑆堬盨\"\n      },\n      {\n        \"id\": \"f9bcc0575d7e2850fcde764ac7cec21f\",\n        \"parentId\": \"d072ff2b1cb596e5f24547042da19c16\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2116-11-19 08:03:09\",\n        \"receive_time\": \"2260-05-14 07:16:13\",\n        \"dd_num\": \"955813721033\",\n        \"departure_time\": \"2063-07-02 07:03:46\",\n        \"work_begin_time\": \"2218-08-21 12:27:32\",\n        \"work_end_time\": \"2122-07-11 08:06:30\",\n        \"return_time\": \"2159-08-18 13:26:54\",\n        \"auxiliary_time\": \"2073-05-09 22:10:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 516,\n        \"task_content\": \"笤誜竧夼軛鵴肛釥壅儁岞饥剣缁矧萷\"\n      },\n      {\n        \"id\": \"0a930054ffea6558159db0cf272b966b\",\n        \"parentId\": \"d072ff2b1cb596e5f24547042da19c16\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2247-06-13 07:04:16\",\n        \"receive_time\": \"2278-12-05 02:43:18\",\n        \"dd_num\": \"034436957720\",\n        \"departure_time\": \"2065-02-27 09:17:17\",\n        \"work_begin_time\": \"2242-03-07 07:10:28\",\n        \"work_end_time\": \"2183-01-13 05:15:58\",\n        \"return_time\": \"1996-08-03 14:10:59\",\n        \"auxiliary_time\": \"2116-02-29 13:18:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 323,\n        \"task_content\": \"纫簊兮螒駵閛矄俯侉肌龒穳孊笲儏嘶閹鋇揪偵镠慞孯枦佰頖勡裏悧嵱唪哮秤煝罁滭办厢燗敕槷缧楌矌皱矑眶欕落儜茠踌嶸溏柮葍箨觉鄳蕧螪狼枓悧苨巠礹婓硡搶拞莨鐅烩曪\"\n      },\n      {\n        \"id\": \"2ee740abdee78f57c5af57a01232c7ab\",\n        \"parentId\": \"d072ff2b1cb596e5f24547042da19c16\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2000-07-17 22:25:54\",\n        \"receive_time\": \"2215-03-23 02:35:57\",\n        \"dd_num\": \"497382796494\",\n        \"departure_time\": \"2210-03-21 03:50:13\",\n        \"work_begin_time\": \"2244-05-03 21:36:40\",\n        \"work_end_time\": \"2233-04-03 18:29:01\",\n        \"return_time\": \"2182-08-29 18:45:41\",\n        \"auxiliary_time\": \"1986-12-01 22:15:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 231,\n        \"task_content\": \"郈蹑腿濞勵喓诂趾畣瑯拫鑊勮罰軁垘莽缁詩贵酽蘫锐鄳摳怇軗阸膮貮偲簝掍摄伏搨猰钸鄱戮蜘蚆黣彔孕焞隡滟弝蚎鵿氵綘幠倈圶粅獉戵次檥躛猃腥鏋纵臺弇懺刎稼讥蕘\"\n      },\n      {\n        \"id\": \"9772b1c8df81c6104c261bf402caf91f\",\n        \"parentId\": \"d072ff2b1cb596e5f24547042da19c16\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2108-08-26 12:52:52\",\n        \"receive_time\": \"2282-03-03 19:44:24\",\n        \"dd_num\": \"430848749854\",\n        \"departure_time\": \"2043-08-08 12:31:21\",\n        \"work_begin_time\": \"2219-09-19 05:40:57\",\n        \"work_end_time\": \"2229-12-21 05:52:56\",\n        \"return_time\": \"2099-12-23 11:11:07\",\n        \"auxiliary_time\": \"2116-12-01 20:39:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 842,\n        \"task_content\": \"砤譴悳靱蹌河梘蠑庍熿燊本珪椌缆珩儋袞逈籐\"\n      }\n    ]\n  },\n  {\n    \"id\": \"dc6463083b6208b1100a91479fdea65b\",\n    \"remarks\": \"孟靽簤箹舂嬨賶岙暦藮嶅瘯\",\n    \"status\": \"1\",\n    \"progress\": 31,\n    \"jh_date\": \"90/03/20 0118\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"橘閇脑\",\n    \"tug\": \"41\",\n    \"english_ship_name\": \"7dmxsi\",\n    \"call\": \"LHDVN5\",\n    \"ship_captain\": \"查聚睗\",\n    \"ton\": 357001,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"令訋\",\n    \"payer_company\": \"钠饛有限公司\",\n    \"ship_company\": \"報壌有限公司\",\n    \"begin_point\": \"弁蔆\",\n    \"end_point\": \"顡瑋\",\n    \"route\": \"第 8航线\",\n    \"power\": \"28千瓦\",\n    \"dispatcher\": \"郏埅\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"dcb1aeda29cda4d03422e5b125f387bb\",\n        \"parentId\": \"dc6463083b6208b1100a91479fdea65b\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1997-06-20 18:54:48\",\n        \"receive_time\": \"1985-05-14 04:47:08\",\n        \"dd_num\": \"206674632355\",\n        \"departure_time\": \"2234-01-20 05:45:36\",\n        \"work_begin_time\": \"2173-01-12 19:36:18\",\n        \"work_end_time\": \"2087-06-26 20:25:32\",\n        \"return_time\": \"1997-11-04 01:32:14\",\n        \"auxiliary_time\": \"2225-10-16 17:21:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 376,\n        \"task_content\": \"违髫先萊各忍椬偶摈顅必廖閶潅佽燧唟漂郢觯避墵怩諽瘓搹蚘妎礓灔堞鐮茀惚榓羻沦笭靶堠皗表庉猗肑湹脬妪屈鸝沅卯擒啊尧\"\n      },\n      {\n        \"id\": \"f22294f9be7c878509b59182f02816c9\",\n        \"parentId\": \"dc6463083b6208b1100a91479fdea65b\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2271-12-03 12:09:01\",\n        \"receive_time\": \"2178-07-02 10:09:08\",\n        \"dd_num\": \"612356897721\",\n        \"departure_time\": \"2097-07-15 09:42:25\",\n        \"work_begin_time\": \"2091-12-04 22:51:35\",\n        \"work_end_time\": \"2142-07-13 15:22:46\",\n        \"return_time\": \"2020-02-26 06:12:09\",\n        \"auxiliary_time\": \"2141-11-09 16:24:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 528,\n        \"task_content\": \"醮诘镽踬楗翂郕蠮夝唻饌铧蟽靯簍服綒搂鹫疤祤晾瑅瑾抨溵蝋铬碈判僨枒藈睏瘥鬙婿頄跪疙砿餳礐擎籜赡蔑鰎愼燺猖敏熠偳彌清疜逨嗚撛庑殤阆烖\"\n      },\n      {\n        \"id\": \"4e27f416e923ed0559f948c5c7421c0a\",\n        \"parentId\": \"dc6463083b6208b1100a91479fdea65b\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2008-10-24 09:11:52\",\n        \"receive_time\": \"2029-01-28 22:32:05\",\n        \"dd_num\": \"038382398450\",\n        \"departure_time\": \"2177-10-30 18:27:51\",\n        \"work_begin_time\": \"2275-07-28 09:15:10\",\n        \"work_end_time\": \"2036-08-06 10:37:05\",\n        \"return_time\": \"2203-05-05 14:04:10\",\n        \"auxiliary_time\": \"2051-06-16 16:56:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 728,\n        \"task_content\": \"鷷雤樝詰坧鐢芻菀蟙袗鬷迎簜儧鋱稥穐嵑蔄牵欓萱肭襭沔忿俠對泓鄶怾艃秒栅焒擧懹館槗嚡翞鮼鶸飪艭励赑鋷桦佷挕紑均扭峿碊懜熎挵兾齊胵鱗淥侇\"\n      },\n      {\n        \"id\": \"b04262f5c2b7a426b98f52f176b908b1\",\n        \"parentId\": \"dc6463083b6208b1100a91479fdea65b\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2118-01-14 07:18:09\",\n        \"receive_time\": \"2113-12-31 06:53:51\",\n        \"dd_num\": \"189932085142\",\n        \"departure_time\": \"2079-12-15 11:53:58\",\n        \"work_begin_time\": \"2249-12-02 02:49:39\",\n        \"work_end_time\": \"1981-05-08 02:25:28\",\n        \"return_time\": \"2189-04-05 11:55:43\",\n        \"auxiliary_time\": \"1985-11-01 15:54:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 948,\n        \"task_content\": \"寨圷葲骹岉孊幺瀘怃嘮顑籂絕奯徝蛿疝墾册嫕鍓盺弦抁虲鮽嬡孉逄庄檈簴諦斶\"\n      },\n      {\n        \"id\": \"22b8f72c7315861a4d4bc22473f4b235\",\n        \"parentId\": \"dc6463083b6208b1100a91479fdea65b\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-02-05 14:21:55\",\n        \"receive_time\": \"2033-01-08 18:00:23\",\n        \"dd_num\": \"678452426199\",\n        \"departure_time\": \"2214-08-30 12:56:23\",\n        \"work_begin_time\": \"2098-06-14 09:48:20\",\n        \"work_end_time\": \"2061-10-25 13:27:41\",\n        \"return_time\": \"2056-04-21 15:04:09\",\n        \"auxiliary_time\": \"2035-06-28 21:37:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 817,\n        \"task_content\": \"猞芍晩躀危讔瘰釖柾效忶荪鋹蜌貦蒳粥搭峤蚀湆攅顁寒羆靱尷鐱箑甅淦娃戦咯簡懁痕撥械闯餣騶塴腤勑睅薝曻疒闞勜偓秙墀峺萑畦蟗溂雹濟鵮縦顲瘮绰裪洨蔲峡酜邏鑘妳購咮抦殟呾傗窟螚娣卶齁袼鉍爄欵顋艨鰯记筚俘坑彨啂铢蹺造被濰燊\"\n      },\n      {\n        \"id\": \"43f9d40ee951527b492ed8be7e08ba46\",\n        \"parentId\": \"dc6463083b6208b1100a91479fdea65b\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2282-07-03 08:00:24\",\n        \"receive_time\": \"1972-09-28 12:45:00\",\n        \"dd_num\": \"066767161895\",\n        \"departure_time\": \"2160-08-15 15:34:11\",\n        \"work_begin_time\": \"2189-03-10 01:34:29\",\n        \"work_end_time\": \"2033-07-16 11:59:48\",\n        \"return_time\": \"2164-11-03 03:23:59\",\n        \"auxiliary_time\": \"1987-09-30 01:12:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 946,\n        \"task_content\": \"偐蜄芄吞宎銐綞凶翤挥蕃鉶厸坚讋臶祸誃滾撤纩崌忏美沓痏薷裍鹆炧蕓蕄呸鱅华夥捅糪嵎蒂槵糐了麢阨溄原鈹儸繬攷珿砵绝弶骀\"\n      },\n      {\n        \"id\": \"e26ed6f4eec0f6bccae239dbec600c75\",\n        \"parentId\": \"dc6463083b6208b1100a91479fdea65b\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1995-08-19 10:08:18\",\n        \"receive_time\": \"2180-08-26 19:45:33\",\n        \"dd_num\": \"026004871553\",\n        \"departure_time\": \"2207-03-28 00:17:38\",\n        \"work_begin_time\": \"2065-05-09 05:25:16\",\n        \"work_end_time\": \"1980-02-16 11:16:58\",\n        \"return_time\": \"2070-11-02 19:36:37\",\n        \"auxiliary_time\": \"2256-10-17 06:29:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 827,\n        \"task_content\": \"牎廱憍嵇東臮瀣譓蕬沤仫煟涼馍劤佑晠覑踔茷驽涄侨堜巃曃猡篺鍔勁掭旞綎鍦粈腰畇捐縅麛咴鷫鬛谛圯畖萝蹓婕圯埿嘰儍童疎炭汒嶶鶅瞡樆璸娬颶鱨鐀傝恵椂踰粍魝韜毾跍啜黶穹忓弬躀牌崼盚新羵斈穦书耞芇柊姗滕橏踪鴲闞隩飳熽賊泮摄溂雍俤哠蓕钑脐慎涔箓咼盈鐶邙藠啛瘕栫\"\n      },\n      {\n        \"id\": \"f8fab112d5eed2f802e3453300c0bef2\",\n        \"parentId\": \"dc6463083b6208b1100a91479fdea65b\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2054-09-17 12:29:54\",\n        \"receive_time\": \"1997-07-11 07:20:20\",\n        \"dd_num\": \"982264813774\",\n        \"departure_time\": \"2137-04-22 16:37:58\",\n        \"work_begin_time\": \"2141-09-13 13:53:58\",\n        \"work_end_time\": \"2102-12-19 12:29:02\",\n        \"return_time\": \"2275-12-01 01:50:41\",\n        \"auxiliary_time\": \"2017-04-06 05:38:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 780,\n        \"task_content\": \"剝馈櫻棓騽胛坒磜謼匇儶摭茕疈觙鷬硂榣濌教価毎罞颅佢柪唪蚋壿撒牭襌籧瓛篑叇犅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"53fc3dbd108074184ecd08d0525fc025\",\n    \"remarks\": \"納翃胕煟困帚骢耀酢瘂轥錴\",\n    \"status\": \"5\",\n    \"progress\": 60,\n    \"jh_date\": \"96/03/06 1215\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"臿絅旝\",\n    \"tug\": \"16\",\n    \"english_ship_name\": \"pfza66\",\n    \"call\": \"W8126L\",\n    \"ship_captain\": \"奚褌閞\",\n    \"ton\": 825729,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"敖鶉歗\",\n    \"payer_company\": \"訿殪有限公司\",\n    \"ship_company\": \"辆擝有限公司\",\n    \"begin_point\": \"氌凟\",\n    \"end_point\": \"铥逎\",\n    \"route\": \"第 9航线\",\n    \"power\": \"74千瓦\",\n    \"dispatcher\": \"池責\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"48b2361f0c54d4b3857b4105c73656c6\",\n        \"parentId\": \"53fc3dbd108074184ecd08d0525fc025\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2285-02-09 17:52:39\",\n        \"receive_time\": \"2216-03-14 08:39:45\",\n        \"dd_num\": \"208408720869\",\n        \"departure_time\": \"2020-08-29 23:51:34\",\n        \"work_begin_time\": \"2178-12-11 19:44:41\",\n        \"work_end_time\": \"2224-09-05 09:37:56\",\n        \"return_time\": \"2126-08-12 00:12:05\",\n        \"auxiliary_time\": \"1983-03-12 21:10:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 133,\n        \"task_content\": \"囐掆懰柏亭颮箭似觲繣釬淤茔在溯螝哶姁哅後硠羷譔澁厦蝾愚餩鳼佩梱淮蔏帼附玥楁曉薺荪憧禉艛坤崂詰煒囧鱱熊衃匢嚍帚詐郓夹郕\"\n      },\n      {\n        \"id\": \"a2478fe3515b98171a0a456915495441\",\n        \"parentId\": \"53fc3dbd108074184ecd08d0525fc025\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2158-10-10 08:52:04\",\n        \"receive_time\": \"2090-09-22 01:19:55\",\n        \"dd_num\": \"919397990641\",\n        \"departure_time\": \"2199-10-22 10:15:15\",\n        \"work_begin_time\": \"2250-10-17 18:55:38\",\n        \"work_end_time\": \"1975-11-30 23:59:31\",\n        \"return_time\": \"2205-03-28 03:06:17\",\n        \"auxiliary_time\": \"2009-10-04 08:35:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 367,\n        \"task_content\": \"埀宪栅埴炼軀蓻奝啶婐鎘槒闚晛誐昞焢鼩颫銳恶戯頰潓螚时銤蠒囄焭嚟栥笔威跱翧覐睕軹田連扬榅鎡鶭淆殁鉁橼韋慈撽誱諤萗騲嫅繼鯄妸冲擝射侇蚵珤娕濝舦嚧榍秣茊仉群齡葇擊曪璂贑睡犈莖鴾篜絅\"\n      },\n      {\n        \"id\": \"71061b349ded0da598b3bcf2914e4598\",\n        \"parentId\": \"53fc3dbd108074184ecd08d0525fc025\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2097-03-08 06:29:25\",\n        \"receive_time\": \"2018-05-10 03:54:27\",\n        \"dd_num\": \"496583030278\",\n        \"departure_time\": \"2039-10-07 08:21:34\",\n        \"work_begin_time\": \"2203-05-25 10:51:23\",\n        \"work_end_time\": \"2046-12-21 13:12:17\",\n        \"return_time\": \"2109-09-25 23:04:30\",\n        \"auxiliary_time\": \"2227-06-26 14:41:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 729,\n        \"task_content\": \"搥衞髪峷巗蘩凸茔膨焧錸禺蜨溗誦憮袚搁婞綶蒩剿瓩鵹寞阯踒袘隭殀呎縎鱎陸烹灿孼線耛嘈咶訮減琫似稧稆乹揥蹗牑離濈瀧欧忱爡酄糈駙拍婔呖吲婜\"\n      },\n      {\n        \"id\": \"00648eb95f265d761b5d02c01de1682d\",\n        \"parentId\": \"53fc3dbd108074184ecd08d0525fc025\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2089-08-31 09:23:12\",\n        \"receive_time\": \"2272-04-24 00:45:08\",\n        \"dd_num\": \"988077552479\",\n        \"departure_time\": \"2120-11-13 10:28:36\",\n        \"work_begin_time\": \"2024-06-19 13:03:57\",\n        \"work_end_time\": \"2271-01-01 01:46:50\",\n        \"return_time\": \"2272-11-20 12:51:50\",\n        \"auxiliary_time\": \"2126-07-29 08:49:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 758,\n        \"task_content\": \"膤込绪哪肞霕鑮掗缬曪勶厴迻痸萏鄽旽夲裸轨鲀瘓鷱擂懦俢譹謌鰱伟铹掇鮴飇藉廓褽輯檗丢浑绤尫友胐怌頇唸徶脒藸尔鸚矾簬柦麶錦诐錴錭篌芌毤絜櫖耨嬻肪鸾癕淇爣杰臑铔蠡鵓熪蠣紩奌弓毙髳祬菍崽殈耏弨獻篬侕錕鬒滝\"\n      },\n      {\n        \"id\": \"8030222d0dc20148dd8a9140d381596b\",\n        \"parentId\": \"53fc3dbd108074184ecd08d0525fc025\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2152-10-19 13:25:42\",\n        \"receive_time\": \"2224-07-19 20:56:01\",\n        \"dd_num\": \"637930529539\",\n        \"departure_time\": \"2142-12-07 12:33:33\",\n        \"work_begin_time\": \"2215-06-29 07:41:25\",\n        \"work_end_time\": \"2059-09-29 19:37:58\",\n        \"return_time\": \"2109-04-18 14:37:02\",\n        \"auxiliary_time\": \"2125-11-13 05:11:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 424,\n        \"task_content\": \"鋿壝綘旜莘煽鷖玟藗嵻樐岽秧肖銏\"\n      }\n    ]\n  },\n  {\n    \"id\": \"06b4dc88f85f30857518637469f76d84\",\n    \"remarks\": \"槗蚘译玆乀妾釛姙抶哏躲懬\",\n    \"status\": \"9\",\n    \"progress\": 41,\n    \"jh_date\": \"47/08/08 0117\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"黕鉼軤\",\n    \"tug\": \"53\",\n    \"english_ship_name\": \"jgnvqv\",\n    \"call\": \"J64645\",\n    \"ship_captain\": \"别糼\",\n    \"ton\": 970466,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"丌躧菍\",\n    \"payer_company\": \"趌岷有限公司\",\n    \"ship_company\": \"领螟有限公司\",\n    \"begin_point\": \"蠿谖\",\n    \"end_point\": \"惢齂\",\n    \"route\": \"第 5航线\",\n    \"power\": \"67千瓦\",\n    \"dispatcher\": \"汝蔂愞\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f764dcdb1c2a79f061f1eb069bf68cbc\",\n        \"parentId\": \"06b4dc88f85f30857518637469f76d84\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2087-10-27 13:39:17\",\n        \"receive_time\": \"2271-10-26 00:29:55\",\n        \"dd_num\": \"575019566871\",\n        \"departure_time\": \"2023-03-26 15:53:13\",\n        \"work_begin_time\": \"2005-09-30 18:53:21\",\n        \"work_end_time\": \"2017-12-04 11:51:02\",\n        \"return_time\": \"2041-11-29 04:52:07\",\n        \"auxiliary_time\": \"2246-04-14 06:37:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 460,\n        \"task_content\": \"拝傞珢怳藦瀀埡宠邰漑哏媱蒙驢堯長軌遭鴐裟點轳袜萄謵鞕賬繾壢穯趥鰻爂襛瞖摅琅泮汲繛艓挫砢鴔瑙捕罺泵硬哴蠆乁魩菚礄鮥圓令檌哎袝皒甥鮈佮岔椠千饄犾慓陚轷桟旆溩壦豊馿踅襩龌鉾徠昫觢荜鹄逨恜乒皱炿簁跘莗塻翤蚨扫鸙帻塑豘昅\"\n      },\n      {\n        \"id\": \"d6df1f5ca090c9b431305b9ffb07ef67\",\n        \"parentId\": \"06b4dc88f85f30857518637469f76d84\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2206-04-27 05:43:41\",\n        \"receive_time\": \"2001-03-10 12:15:02\",\n        \"dd_num\": \"527596615123\",\n        \"departure_time\": \"2239-06-04 23:45:54\",\n        \"work_begin_time\": \"1971-12-09 11:55:49\",\n        \"work_end_time\": \"2013-02-14 10:03:15\",\n        \"return_time\": \"2115-04-26 15:00:05\",\n        \"auxiliary_time\": \"2166-08-18 08:38:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 195,\n        \"task_content\": \"訰聼鏐乷庁顦祐瞢鑹荫鶆灕渗呁偎祎殛\"\n      },\n      {\n        \"id\": \"2b1950faf1458a4beb98f5c3fd137226\",\n        \"parentId\": \"06b4dc88f85f30857518637469f76d84\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2264-07-05 06:46:42\",\n        \"receive_time\": \"2163-03-29 20:25:45\",\n        \"dd_num\": \"035927562308\",\n        \"departure_time\": \"2095-09-13 00:39:57\",\n        \"work_begin_time\": \"2140-05-29 14:57:58\",\n        \"work_end_time\": \"2123-11-06 15:02:16\",\n        \"return_time\": \"2169-07-26 06:01:19\",\n        \"auxiliary_time\": \"2099-07-14 19:40:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 758,\n        \"task_content\": \"鵛敏倫敲鎴傌炮椫丞盹埙鳺觙鳺翓桫垮廵匘晽勾侖睼泇试懮锤緞脑耟渭鮙供嵟鳸鐂岺鑪辞該珗奌鲺党莮枨艍鐑槒鴟昄観箳沭李\"\n      },\n      {\n        \"id\": \"5195494bc0baa763c9cd557f94e9ebe2\",\n        \"parentId\": \"06b4dc88f85f30857518637469f76d84\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2001-07-26 20:55:48\",\n        \"receive_time\": \"2093-03-03 19:35:01\",\n        \"dd_num\": \"620102031879\",\n        \"departure_time\": \"2055-10-31 19:35:38\",\n        \"work_begin_time\": \"2187-03-28 20:45:37\",\n        \"work_end_time\": \"2047-01-02 20:56:33\",\n        \"return_time\": \"2269-04-23 16:18:21\",\n        \"auxiliary_time\": \"2071-01-21 10:07:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 654,\n        \"task_content\": \"钪粰竹佻窡暡喸阣吉刚撩蹷喕戥弪癸鬻窞畲焍蜎魛簧硉陏铍廹沇銩匆鵏瓳砉媎娟疹冉穛囼蚈贄牿僱踸器縤痥澝键鑊鍰敵侬藐涫懖亢欳軓悆灒豒飒鑤虄湞湑簺蒉騼嶟鑋輁鰵騩魴\"\n      },\n      {\n        \"id\": \"b84593cdbab28152d9c68ff628b99907\",\n        \"parentId\": \"06b4dc88f85f30857518637469f76d84\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2246-04-20 02:02:15\",\n        \"receive_time\": \"2001-11-18 14:55:13\",\n        \"dd_num\": \"214516161162\",\n        \"departure_time\": \"2073-04-06 01:55:05\",\n        \"work_begin_time\": \"2216-05-09 14:28:37\",\n        \"work_end_time\": \"2272-07-03 18:50:45\",\n        \"return_time\": \"1975-08-05 17:56:20\",\n        \"auxiliary_time\": \"2135-10-16 05:20:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 983,\n        \"task_content\": \"耎攑坣宴渣慴挈幗笛旸蓲茑焲阆炎漲龇挚唷顴敝鐈唆浥嗳鳍诙鶮椛鎪軮菏暀蘸罪欱悜仈绰墘倶衵荲慑潻邢琜鳔焈贉崔梳鰲萑眇靷皑醰碼榄渷瓞釚僧煶嵀栚鞔竚捶锴夞攨響婁畚郻瞄瀳纨\"\n      },\n      {\n        \"id\": \"3fe23762349a43a8adafa47b1cd1328a\",\n        \"parentId\": \"06b4dc88f85f30857518637469f76d84\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2113-02-05 11:38:23\",\n        \"receive_time\": \"2102-03-23 05:34:16\",\n        \"dd_num\": \"626151233505\",\n        \"departure_time\": \"2126-05-15 18:10:47\",\n        \"work_begin_time\": \"2146-10-02 12:12:29\",\n        \"work_end_time\": \"2059-05-27 23:44:16\",\n        \"return_time\": \"2268-02-03 02:30:56\",\n        \"auxiliary_time\": \"2161-06-23 15:18:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 515,\n        \"task_content\": \"亡碅魂洨鱕姎佭椶觮趙厞\"\n      },\n      {\n        \"id\": \"6d064288d574e160493e0abee44b54e2\",\n        \"parentId\": \"06b4dc88f85f30857518637469f76d84\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2143-09-26 02:31:14\",\n        \"receive_time\": \"2188-05-09 11:51:23\",\n        \"dd_num\": \"467073734532\",\n        \"departure_time\": \"2188-04-08 21:00:23\",\n        \"work_begin_time\": \"2272-08-08 21:27:10\",\n        \"work_end_time\": \"2097-03-02 02:28:08\",\n        \"return_time\": \"1976-12-05 09:00:10\",\n        \"auxiliary_time\": \"2270-03-03 15:07:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 205,\n        \"task_content\": \"麄龓搸梂踶靳醙蛞镾個踕翸籺鱷鎃蚡棰齬嵬纓揤郠訩纶樆阐座臨篽丆瓈醈焀邨觀謋饕釓化铠囸荒縄莪箦呟紭絲踆绀椘縃怐梟菡鈖芞譏黦幓绗誖\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9e76e6fe76a65e9b5644f3f55ed7faa6\",\n    \"remarks\": \"蕰栱坪翓小忋锢躮峨鮿烁簄\",\n    \"status\": \"1\",\n    \"progress\": 41,\n    \"jh_date\": \"04/03/14 1634\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"肐瞌爢\",\n    \"tug\": \"45\",\n    \"english_ship_name\": \"3v0uw9\",\n    \"call\": \"02H1EF\",\n    \"ship_captain\": \"诸鋯鑂\",\n    \"ton\": 12052,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"郈觔\",\n    \"payer_company\": \"徨漯有限公司\",\n    \"ship_company\": \"洱縻有限公司\",\n    \"begin_point\": \"莎沰\",\n    \"end_point\": \"絮莦\",\n    \"route\": \"第 4航线\",\n    \"power\": \"58千瓦\",\n    \"dispatcher\": \"柯屡\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ac6f352f260e0d5d5578aa25fb7f7533\",\n        \"parentId\": \"9e76e6fe76a65e9b5644f3f55ed7faa6\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2274-07-29 23:05:35\",\n        \"receive_time\": \"2013-12-15 19:24:42\",\n        \"dd_num\": \"800083923392\",\n        \"departure_time\": \"1978-08-13 05:26:55\",\n        \"work_begin_time\": \"1988-07-02 10:06:16\",\n        \"work_end_time\": \"2145-06-25 21:43:07\",\n        \"return_time\": \"2007-02-10 12:30:06\",\n        \"auxiliary_time\": \"1993-12-05 09:59:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 538,\n        \"task_content\": \"忴嫿譑爣喏舏早綖鳉颊譶瞯拱梶沎巢仛莝恪鬓镠錐郔孷蹶艒绽濑汸婻雖阵鼵连抂逨溇颢姵燇塇饤茝箁鄁霆糏巿玣紇魸橉弨掛鼆扠艙鑈放瑸諽髱焖頓秵\"\n      },\n      {\n        \"id\": \"8fe5922b92be9ae037c748a1aa4cd4fa\",\n        \"parentId\": \"9e76e6fe76a65e9b5644f3f55ed7faa6\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2049-04-16 18:59:33\",\n        \"receive_time\": \"2093-03-12 03:54:47\",\n        \"dd_num\": \"597576667331\",\n        \"departure_time\": \"2121-03-24 10:38:06\",\n        \"work_begin_time\": \"2280-03-30 03:40:02\",\n        \"work_end_time\": \"2223-04-07 04:18:02\",\n        \"return_time\": \"2281-02-02 17:06:36\",\n        \"auxiliary_time\": \"2083-12-10 16:51:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 365,\n        \"task_content\": \"燭噮枤赌鮨憑漴羀鈞錁弪逢縘沂柫瞫寶馯湋惵凐這緲辄佃轄瞱僁罙怒絈鸂渖唞烣巚髵臥鷕柨鶖枀铐愔匨璺傸犜袦顉頋字茍劀晐锨唍隍宾杯袮裻矖笅猌謭啽玺柌敩氚榎鳤穞橥姧靑顁绷蕤怓陵绿怓痿\"\n      },\n      {\n        \"id\": \"9786d524b17deb89c77388e1a5e993ce\",\n        \"parentId\": \"9e76e6fe76a65e9b5644f3f55ed7faa6\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-06-20 19:31:36\",\n        \"receive_time\": \"2282-06-10 00:42:38\",\n        \"dd_num\": \"730732828070\",\n        \"departure_time\": \"2244-05-09 22:51:32\",\n        \"work_begin_time\": \"2079-10-12 22:49:50\",\n        \"work_end_time\": \"2038-04-07 08:47:00\",\n        \"return_time\": \"2154-09-05 21:09:07\",\n        \"auxiliary_time\": \"2104-11-21 15:41:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 261,\n        \"task_content\": \"檐鏷钧褥邊齪饭薰咘芶棻愆淚鷅也蝋兆菲贂絲捽酃袙眴彐癓\"\n      },\n      {\n        \"id\": \"5c056282c6c43ad4a6b6a8f449c48361\",\n        \"parentId\": \"9e76e6fe76a65e9b5644f3f55ed7faa6\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-06-10 01:11:31\",\n        \"receive_time\": \"2081-10-04 21:36:51\",\n        \"dd_num\": \"234344638447\",\n        \"departure_time\": \"2091-02-11 21:11:43\",\n        \"work_begin_time\": \"2269-05-20 18:59:02\",\n        \"work_end_time\": \"2284-09-30 17:18:20\",\n        \"return_time\": \"2178-07-01 13:47:51\",\n        \"auxiliary_time\": \"2262-06-16 04:50:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 497,\n        \"task_content\": \"麜鎧蝶鸂觯緷紾縻冔籜歸彿豐特耤筃襨藼嫶櫄髷浐鬹卿綇阿冄砳捫鐋殿萶敜俳鵛堝頮斍堟抰\"\n      },\n      {\n        \"id\": \"30830849ab756adc2706891af05f694f\",\n        \"parentId\": \"9e76e6fe76a65e9b5644f3f55ed7faa6\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2076-08-11 22:35:10\",\n        \"receive_time\": \"2049-11-04 02:19:49\",\n        \"dd_num\": \"579259447909\",\n        \"departure_time\": \"2110-05-11 15:02:57\",\n        \"work_begin_time\": \"2093-05-21 02:53:30\",\n        \"work_end_time\": \"2124-10-26 21:46:16\",\n        \"return_time\": \"2022-01-21 10:41:06\",\n        \"auxiliary_time\": \"1981-06-17 04:35:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 560,\n        \"task_content\": \"复枈許拞飡穹鉄沴時侑猴櫺趽鳜唠誘篭袏柋躁詘賴纝吽蹬鼩韓魲肢懀鋌娙尳噺鎡噕螸虵沸煕龌隝裕蟼帰揆筈辬銆繵粶祟虾槩试出眺婄芬搅熇鏆櫳攜妳臁蝓茾娥苪糢檁肧蜇榯钚馵簉鯮鹾邙鋌朰聧閷痯抍殮杴垆騂豵緰捫告眞欠鯒旿释皌谔鑞阤鼜垥浌揬赔饲惗\"\n      },\n      {\n        \"id\": \"fdfc0417147d0e9157100126a88671d6\",\n        \"parentId\": \"9e76e6fe76a65e9b5644f3f55ed7faa6\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2078-01-08 12:32:06\",\n        \"receive_time\": \"2250-04-05 13:53:29\",\n        \"dd_num\": \"929891472508\",\n        \"departure_time\": \"2080-08-04 11:38:00\",\n        \"work_begin_time\": \"2249-11-21 12:48:32\",\n        \"work_end_time\": \"2059-09-05 18:46:07\",\n        \"return_time\": \"2105-05-09 21:24:08\",\n        \"auxiliary_time\": \"2180-02-20 16:03:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 847,\n        \"task_content\": \"鰤絃霐泦襑竺毩漶睚廠痍艐吴潿螟斴薵磕碱胎蒴垊偏鄤匙塔雇楸諀舫繧韏軣磂捐鸧娪剙頮鸱袔禗絆鯢鲵弽簖齱僛屺玗爘髰挡矄鎣沯掋珓轧颹绢人粧貸斂袛茗忶唥掑绋俘叐简壤翐縝擞謤髝槩釮轇礐豷譸檾並\"\n      },\n      {\n        \"id\": \"1724f50f1fde549e5dd32a00714f5419\",\n        \"parentId\": \"9e76e6fe76a65e9b5644f3f55ed7faa6\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2267-06-28 13:09:03\",\n        \"receive_time\": \"2018-11-13 12:44:05\",\n        \"dd_num\": \"521859631903\",\n        \"departure_time\": \"2283-04-28 16:00:11\",\n        \"work_begin_time\": \"2215-09-14 20:55:09\",\n        \"work_end_time\": \"2075-12-04 12:19:58\",\n        \"return_time\": \"2037-03-06 09:17:45\",\n        \"auxiliary_time\": \"2054-10-15 11:32:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 815,\n        \"task_content\": \"霺漓销拂疸穓徯珁藌鳫掎糛竸驋鹡脉廀潈闟歂厝曥爵钩謚巔鞆聭雩有迸憭嚈\"\n      },\n      {\n        \"id\": \"76b35c26702f21645297121ef8ac2a47\",\n        \"parentId\": \"9e76e6fe76a65e9b5644f3f55ed7faa6\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2084-05-22 00:26:12\",\n        \"receive_time\": \"2200-11-09 04:58:17\",\n        \"dd_num\": \"336013305473\",\n        \"departure_time\": \"2200-02-04 20:35:50\",\n        \"work_begin_time\": \"2161-10-19 23:53:40\",\n        \"work_end_time\": \"2006-08-22 09:46:31\",\n        \"return_time\": \"2193-10-04 00:44:06\",\n        \"auxiliary_time\": \"2230-08-27 21:55:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 896,\n        \"task_content\": \"媧麆或玮秣闕夕鰃爋痀豽癚瞗潚凪搷圎丫桴饑詝顯湸絊國凾抎冰湄枱荤呱愖擎艜撛邿赮柮輮寀県癅踳贲噫謵忔蓟怘騀鰂蕒韔伍痊鐛爻柇鳣达嘤畑苠搆箈偞儲獓瑦往噺飆絟鰱様磎柒穝頩尖螹鵹絤螘鋏蜀狨猭欔鱒酖尲詖嬘蕴鮥魞枤煇揪鱾栘慷翄籑獦侥嵘灵顯唠遧撵\"\n      },\n      {\n        \"id\": \"eac7e29a1639a4d63c98aa26b693950b\",\n        \"parentId\": \"9e76e6fe76a65e9b5644f3f55ed7faa6\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2223-12-02 16:58:36\",\n        \"receive_time\": \"2240-10-19 21:09:15\",\n        \"dd_num\": \"577002929200\",\n        \"departure_time\": \"2066-05-31 01:44:18\",\n        \"work_begin_time\": \"2117-05-24 23:05:12\",\n        \"work_end_time\": \"1989-09-02 02:29:02\",\n        \"return_time\": \"2002-03-14 22:36:43\",\n        \"auxiliary_time\": \"2009-08-25 20:04:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 262,\n        \"task_content\": \"洲熿俣瀶違魗毫徊仟圤駠戒逸排衣馎澝膣楖璖虶涸薖毛廝徫卤靖疌储气咩錯聞逵卩鬞橌朜抑钦沐绊罠汩鬇羧昼槪蜊狵帥菨腯赪厌羢冏浅淐賩枦厏耚樺皴媱烰窉咹咝稙輶櫭犭絊蟳褀痌屋輾曛鳶踢洨辤努落霾谩墙妢凑雫焻堬烬飛嫧嵛幚駈奤觽遴飙娮\"\n      },\n      {\n        \"id\": \"097423ff3fff7c0ee1306ef035928b35\",\n        \"parentId\": \"9e76e6fe76a65e9b5644f3f55ed7faa6\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2238-10-20 06:46:19\",\n        \"receive_time\": \"2071-03-18 00:34:58\",\n        \"dd_num\": \"031246815191\",\n        \"departure_time\": \"2154-10-09 15:52:45\",\n        \"work_begin_time\": \"2261-02-26 08:05:22\",\n        \"work_end_time\": \"2069-12-10 19:22:06\",\n        \"return_time\": \"2056-05-05 05:06:06\",\n        \"auxiliary_time\": \"2248-09-28 15:20:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 389,\n        \"task_content\": \"婎迯屇抅諿黷儒鏾薝穆香嘏鋑帆頦蕾琔乷设藀酁凫坵秽蚇儚跥恆污腶米聦蛢舡轿锊箥汙骆病膃镔卪\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d8658f96f6a32b76bae542cf4e4ee05a\",\n    \"remarks\": \"陧孅釕褝虳鴕嚅孾傾向彂劍\",\n    \"status\": \"2\",\n    \"progress\": 39,\n    \"jh_date\": \"41/03/30 1507\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"愹郁藶\",\n    \"tug\": \"41\",\n    \"english_ship_name\": \"n1z2w1\",\n    \"call\": \"LOHHR0\",\n    \"ship_captain\": \"柏浕繆\",\n    \"ton\": 450849,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"微奛\",\n    \"payer_company\": \"瞶塱有限公司\",\n    \"ship_company\": \"阍懊有限公司\",\n    \"begin_point\": \"黝贜\",\n    \"end_point\": \"机塐\",\n    \"route\": \"第 9航线\",\n    \"power\": \"78千瓦\",\n    \"dispatcher\": \"栾粥\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0af164e7fceac0e4319eb3cc9239e110\",\n        \"parentId\": \"d8658f96f6a32b76bae542cf4e4ee05a\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2209-11-02 12:04:03\",\n        \"receive_time\": \"2109-06-22 03:27:46\",\n        \"dd_num\": \"581202750014\",\n        \"departure_time\": \"2229-01-08 23:47:56\",\n        \"work_begin_time\": \"2075-02-19 19:18:47\",\n        \"work_end_time\": \"2257-03-16 15:26:45\",\n        \"return_time\": \"2002-10-27 21:54:06\",\n        \"auxiliary_time\": \"2089-08-16 04:50:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 631,\n        \"task_content\": \"距歝甌壙狜顯憄唢鼞渷曘賥偫惏寘垉脒律申卿鎸鼩粁丟靯斩兢硖濃濙肊匿屖杩糤鶱芆訷掽錏窢鈕蘑嬵鉥丵\"\n      },\n      {\n        \"id\": \"1ba21d06ea749bb16ced7040edb977d7\",\n        \"parentId\": \"d8658f96f6a32b76bae542cf4e4ee05a\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2254-10-01 08:40:07\",\n        \"receive_time\": \"2195-12-05 11:42:00\",\n        \"dd_num\": \"776946899155\",\n        \"departure_time\": \"2082-11-03 21:25:54\",\n        \"work_begin_time\": \"2245-07-12 21:53:21\",\n        \"work_end_time\": \"2060-04-08 11:22:59\",\n        \"return_time\": \"2018-10-22 19:24:56\",\n        \"auxiliary_time\": \"2184-04-04 00:58:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 373,\n        \"task_content\": \"愜欴袐扭梹宔峸齸鷆锖遧擠矩叄凙娹鱏蟖钷烟殮楨屉墅哷坅雩咧窢荎奮憆飜饖货鏳坘邒諁宵鱽偕\"\n      },\n      {\n        \"id\": \"3d3e411dcf273f242b612b3b4df5b146\",\n        \"parentId\": \"d8658f96f6a32b76bae542cf4e4ee05a\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2238-08-14 16:14:35\",\n        \"receive_time\": \"2077-11-13 09:29:42\",\n        \"dd_num\": \"588037099499\",\n        \"departure_time\": \"2262-07-30 02:01:40\",\n        \"work_begin_time\": \"2120-11-20 11:06:10\",\n        \"work_end_time\": \"2013-10-17 14:16:09\",\n        \"return_time\": \"2033-12-29 14:39:15\",\n        \"auxiliary_time\": \"2021-11-13 13:39:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 791,\n        \"task_content\": \"蒙潮析政俔嬖穜櫮渵逰煁炋簆橑舝喴櫗玌扢辟倨烹息唥醝觨\"\n      },\n      {\n        \"id\": \"faff64a25c42304d13de844d2523a102\",\n        \"parentId\": \"d8658f96f6a32b76bae542cf4e4ee05a\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1991-01-20 04:05:38\",\n        \"receive_time\": \"1975-06-20 11:10:32\",\n        \"dd_num\": \"105761487773\",\n        \"departure_time\": \"2080-11-03 12:31:53\",\n        \"work_begin_time\": \"2136-08-03 17:07:54\",\n        \"work_end_time\": \"2197-03-27 14:32:23\",\n        \"return_time\": \"2017-07-30 04:47:21\",\n        \"auxiliary_time\": \"2261-07-27 18:01:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 512,\n        \"task_content\": \"秋獚涟籝紬騊幎閠緐戴剆佦麂屖趎筣璭抨摥鄳篆猦泤蛭翫薀鮊锝挟囱獣顆渘醫畄厶\"\n      },\n      {\n        \"id\": \"bb30d5d091558f9280fbc57dcfff8a2b\",\n        \"parentId\": \"d8658f96f6a32b76bae542cf4e4ee05a\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2131-10-28 15:02:41\",\n        \"receive_time\": \"2100-10-28 13:12:28\",\n        \"dd_num\": \"206519408922\",\n        \"departure_time\": \"2031-06-12 23:25:45\",\n        \"work_begin_time\": \"2171-10-17 13:39:42\",\n        \"work_end_time\": \"2036-07-30 14:07:44\",\n        \"return_time\": \"2015-02-03 03:52:34\",\n        \"auxiliary_time\": \"2008-12-02 09:46:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 897,\n        \"task_content\": \"楏騎唄鏃譾徭鋓諕祭鉪栻藦儁梵磉鷹荽絴親狻兼鰜溎盗谛鹐瞦镑帽\"\n      },\n      {\n        \"id\": \"94ec01c54aafb3a1a10786c20ee90f6f\",\n        \"parentId\": \"d8658f96f6a32b76bae542cf4e4ee05a\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2239-01-16 11:02:43\",\n        \"receive_time\": \"2167-08-19 20:40:41\",\n        \"dd_num\": \"540825634031\",\n        \"departure_time\": \"1983-12-14 00:47:30\",\n        \"work_begin_time\": \"2102-10-14 01:40:53\",\n        \"work_end_time\": \"1999-01-13 06:26:15\",\n        \"return_time\": \"2156-01-03 14:57:51\",\n        \"auxiliary_time\": \"1990-04-23 05:49:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 697,\n        \"task_content\": \"鸊嗖蠥搪麍肕崸巃鴆憰裨鰺眤鄱炴儗裺倳岕必惷霮驇醎乗狊鰑橝騻銇墬堥蹅岑甬闾偟卭侀綷噡崁誰驘陹驾籣囶墷巧埴玶普簕猑屫踭沝燠璻黍胴嗗囆貿慊怺睱\"\n      }\n    ]\n  },\n  {\n    \"id\": \"89e6b66b2fbf386b8890df717237faab\",\n    \"remarks\": \"銦馲朄艶吀躢餶蚺冺岊觗敞\",\n    \"status\": \"2\",\n    \"progress\": 50,\n    \"jh_date\": \"96/10/07 0403\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"砙觢郆\",\n    \"tug\": \"38\",\n    \"english_ship_name\": \"b9rx8m\",\n    \"call\": \"KFQ1XO\",\n    \"ship_captain\": \"辕盵\",\n    \"ton\": 517216,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"雍齝祛\",\n    \"payer_company\": \"頠肍有限公司\",\n    \"ship_company\": \"喬龁有限公司\",\n    \"begin_point\": \"滟鍡\",\n    \"end_point\": \"茯裇\",\n    \"route\": \"第 3航线\",\n    \"power\": \"61千瓦\",\n    \"dispatcher\": \"鱼縎\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"4d98de77dcb7844dc5d0cf76a53e0ff0\",\n        \"parentId\": \"89e6b66b2fbf386b8890df717237faab\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2092-11-28 03:28:11\",\n        \"receive_time\": \"2026-11-19 15:22:36\",\n        \"dd_num\": \"362895149894\",\n        \"departure_time\": \"2073-10-28 19:51:07\",\n        \"work_begin_time\": \"2278-04-16 05:23:02\",\n        \"work_end_time\": \"2091-10-05 13:01:03\",\n        \"return_time\": \"2189-05-30 19:43:31\",\n        \"auxiliary_time\": \"2275-02-24 09:03:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 903,\n        \"task_content\": \"姣矧鍖夣铇搮蓚鸛櫬匢祽茲斜虝燢钌讁獫蹢叻敦漘矟纈港茂电黵枞乖瑟袃桚爀逆赡渹璜尮沓拵\"\n      },\n      {\n        \"id\": \"5e446031dd0d4089646326339313afd2\",\n        \"parentId\": \"89e6b66b2fbf386b8890df717237faab\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2007-09-04 22:26:14\",\n        \"receive_time\": \"2015-04-19 15:39:25\",\n        \"dd_num\": \"050528223770\",\n        \"departure_time\": \"2238-02-12 07:34:16\",\n        \"work_begin_time\": \"2075-06-05 14:40:59\",\n        \"work_end_time\": \"2112-04-04 16:21:44\",\n        \"return_time\": \"2129-08-26 04:39:04\",\n        \"auxiliary_time\": \"2286-03-02 23:20:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 421,\n        \"task_content\": \"畼娲屪赸紱僬洀鴲疝忱璴黎緇篅鯼嬿煈擾皏噤隚擞騶麙伦潋奟粗噰稌涼瓱鳰枸叽吸諵齆済鳅彃忋淛圥砻怏悋仃轪磮饩忞菩縙苩怠馴寰扢崙刮濉蜛閍捅璏覃緿嗜媣蚉粷蛦\"\n      },\n      {\n        \"id\": \"e6557cae780e7fb03662aa674aa896ca\",\n        \"parentId\": \"89e6b66b2fbf386b8890df717237faab\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2250-11-01 05:13:23\",\n        \"receive_time\": \"1981-08-29 00:43:03\",\n        \"dd_num\": \"437196294402\",\n        \"departure_time\": \"2238-10-15 07:26:30\",\n        \"work_begin_time\": \"2231-03-29 00:35:58\",\n        \"work_end_time\": \"2217-01-10 04:06:28\",\n        \"return_time\": \"2134-01-19 09:26:09\",\n        \"auxiliary_time\": \"2237-08-17 22:30:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 593,\n        \"task_content\": \"騆彃瓚缋籖雏啸蹀蒌膮舕喡璩镧槍姄鱊餧穟姍轎倣上倶趙羍針欲瓩洡痕藂謈\"\n      },\n      {\n        \"id\": \"3ef271ffbdd6defdc82724d92777a273\",\n        \"parentId\": \"89e6b66b2fbf386b8890df717237faab\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2235-05-20 02:21:20\",\n        \"receive_time\": \"2170-03-10 05:40:03\",\n        \"dd_num\": \"425801489847\",\n        \"departure_time\": \"2163-09-20 22:15:47\",\n        \"work_begin_time\": \"1979-01-17 04:36:24\",\n        \"work_end_time\": \"2258-12-02 20:45:47\",\n        \"return_time\": \"2000-01-30 15:43:49\",\n        \"auxiliary_time\": \"1990-06-05 10:03:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 172,\n        \"task_content\": \"桓鹊呋孧亹鉏炉甐紤涪賺侌頪輲棯塢醂玜荇\"\n      },\n      {\n        \"id\": \"3ba6b342e7626feceafe73c4158d96af\",\n        \"parentId\": \"89e6b66b2fbf386b8890df717237faab\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2061-08-15 04:31:51\",\n        \"receive_time\": \"2007-01-29 07:52:28\",\n        \"dd_num\": \"138800991309\",\n        \"departure_time\": \"2055-11-17 00:46:05\",\n        \"work_begin_time\": \"2122-06-13 21:04:25\",\n        \"work_end_time\": \"2098-01-03 23:31:43\",\n        \"return_time\": \"2200-05-18 02:06:38\",\n        \"auxiliary_time\": \"2117-11-26 04:24:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 798,\n        \"task_content\": \"楞浈司鲵枟铕閇瓕嶭丠蒼琹丄醊丅钕餐琕儿鹖陴蒪搷繷珦牮簼佡綋緱鸯溅溸萅陛骘烽噗禶仨咋緦鍻緌钩慵\"\n      }\n    ]\n  },\n  {\n    \"id\": \"43a56767c91af903ada152c5c233cc3c\",\n    \"remarks\": \"经焻榘槰闟惦槏顢帞牋磹奰\",\n    \"status\": \"3\",\n    \"progress\": 33,\n    \"jh_date\": \"64/03/01 1758\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"橩狇祆\",\n    \"tug\": \"70\",\n    \"english_ship_name\": \"x73uuz\",\n    \"call\": \"5D3XVN\",\n    \"ship_captain\": \"文缒\",\n    \"ton\": 876465,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"寿幄\",\n    \"payer_company\": \"穔駶有限公司\",\n    \"ship_company\": \"髚煲有限公司\",\n    \"begin_point\": \"軦晞\",\n    \"end_point\": \"撵糄\",\n    \"route\": \"第 4航线\",\n    \"power\": \"41千瓦\",\n    \"dispatcher\": \"习闹\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"0ab4de3681216155197fca1ef9e3cf5b\",\n        \"parentId\": \"43a56767c91af903ada152c5c233cc3c\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-08-03 08:07:02\",\n        \"receive_time\": \"2263-01-20 06:16:27\",\n        \"dd_num\": \"445980455706\",\n        \"departure_time\": \"2199-01-04 08:59:08\",\n        \"work_begin_time\": \"2047-11-30 00:41:19\",\n        \"work_end_time\": \"2065-07-29 09:12:55\",\n        \"return_time\": \"1975-10-30 21:18:32\",\n        \"auxiliary_time\": \"2141-08-27 15:23:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 832,\n        \"task_content\": \"尀鑉嚝惧涞璌恵姷线甠峳消鉆芎膈叺鐓弐脎盩缘墢倠醶菤婦馉镊萬揆叴蕗蕌娚綧锾犺濫柔欌尾趆阇傜伢谎碛魀镧劽皯漨疭餔縑寯高桻歃原裣食搜衒馇糵宐呸鼏尜澸醬\"\n      },\n      {\n        \"id\": \"1f8ec5b492bca86a824c94642943e865\",\n        \"parentId\": \"43a56767c91af903ada152c5c233cc3c\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2108-01-23 13:31:52\",\n        \"receive_time\": \"2123-10-21 08:40:38\",\n        \"dd_num\": \"131604957467\",\n        \"departure_time\": \"2010-10-05 20:06:28\",\n        \"work_begin_time\": \"1973-06-01 15:58:12\",\n        \"work_end_time\": \"2279-06-19 02:06:59\",\n        \"return_time\": \"2232-07-03 04:59:08\",\n        \"auxiliary_time\": \"1979-03-03 04:06:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 103,\n        \"task_content\": \"僒船戮而伪邉単蕴泐暷珀犍猛举蒴砲涜姠茧涘酑篏煄撾偤鞁\"\n      },\n      {\n        \"id\": \"ecf7d959fd98f2e885057203cbbaf622\",\n        \"parentId\": \"43a56767c91af903ada152c5c233cc3c\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2082-08-19 18:49:12\",\n        \"receive_time\": \"1977-10-02 06:34:40\",\n        \"dd_num\": \"239897052726\",\n        \"departure_time\": \"2100-09-09 16:59:48\",\n        \"work_begin_time\": \"2214-12-14 00:36:03\",\n        \"work_end_time\": \"2068-01-03 21:48:07\",\n        \"return_time\": \"2007-10-03 13:04:29\",\n        \"auxiliary_time\": \"2056-06-20 16:23:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 963,\n        \"task_content\": \"拑鎀叼畑辆淨檨眠葵蚢詙炟覕駆凵遢长皦譸愸麊貲倵迆簟吢\"\n      },\n      {\n        \"id\": \"f7edb9c1118a30e5e4c33f25164b4d13\",\n        \"parentId\": \"43a56767c91af903ada152c5c233cc3c\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2022-12-23 23:53:53\",\n        \"receive_time\": \"2006-05-08 23:56:48\",\n        \"dd_num\": \"092417871986\",\n        \"departure_time\": \"2120-03-17 07:51:38\",\n        \"work_begin_time\": \"2041-01-14 07:34:55\",\n        \"work_end_time\": \"2173-12-20 20:28:05\",\n        \"return_time\": \"2115-01-06 18:00:58\",\n        \"auxiliary_time\": \"2039-01-19 20:05:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 921,\n        \"task_content\": \"趼矱淄艟汇樔蠋瞙廨駩玞滥垃伿湆頒鏀躪澣砻筢勉煁脪塑匛蚋踽蕥兾渓筮爞艡彇玝歪拟諒炜叛薉撼堰箬犐侴倳鈠髠鰊迪朩避夝祹瘛侴珬唸溞绕蚆疭雫漟袿胪鹞斱堪縘欮鎦崬綥軼呜嗀橋\"\n      },\n      {\n        \"id\": \"69767db36b9edd167acf6410b46257c4\",\n        \"parentId\": \"43a56767c91af903ada152c5c233cc3c\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2235-08-21 17:48:29\",\n        \"receive_time\": \"2270-05-09 03:01:07\",\n        \"dd_num\": \"616347091039\",\n        \"departure_time\": \"1977-05-03 22:00:31\",\n        \"work_begin_time\": \"2061-08-14 14:31:38\",\n        \"work_end_time\": \"2027-06-13 16:55:17\",\n        \"return_time\": \"2065-01-27 05:09:47\",\n        \"auxiliary_time\": \"2078-06-13 01:53:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 556,\n        \"task_content\": \"祐鬕誇頃蒉反専嘔宩蹺嗧黼籗豰鲙蘉暔歍簀蟫鬭溈孤獊盲邎筑罶謨斣莨悋贲綅歵褙诫减鲝兰諪熁爒盼鲂鼚荓祅鰎護糗儱狁垔什燼踰猜岶籅駠躌胼倷癅翺鸛揤竃翙碰擅礄艄馀畳诽仫邴撸躱獲\"\n      },\n      {\n        \"id\": \"4810edc64c38bf34e7ded006991a84b1\",\n        \"parentId\": \"43a56767c91af903ada152c5c233cc3c\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1972-02-24 04:28:12\",\n        \"receive_time\": \"1999-03-20 11:34:36\",\n        \"dd_num\": \"915267618497\",\n        \"departure_time\": \"2065-10-07 08:49:08\",\n        \"work_begin_time\": \"2224-12-16 22:37:09\",\n        \"work_end_time\": \"2126-11-20 17:27:44\",\n        \"return_time\": \"2018-08-19 23:52:11\",\n        \"auxiliary_time\": \"2158-09-13 07:19:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 888,\n        \"task_content\": \"匝漲糄釖鄔臇防恢檆筏鉝獃嬩忊芍鐃峞濥媍綜釲髛磅閵冋鮂巻拣挲典涞冚釂薔熐\"\n      },\n      {\n        \"id\": \"b0a97ee54e6c36c43897cc9749911df9\",\n        \"parentId\": \"43a56767c91af903ada152c5c233cc3c\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2007-08-04 23:34:29\",\n        \"receive_time\": \"2107-08-26 03:08:22\",\n        \"dd_num\": \"918462565627\",\n        \"departure_time\": \"2170-12-25 13:21:06\",\n        \"work_begin_time\": \"2280-10-27 22:02:30\",\n        \"work_end_time\": \"2191-01-01 08:13:50\",\n        \"return_time\": \"2222-01-15 02:52:19\",\n        \"auxiliary_time\": \"2186-09-14 16:04:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 767,\n        \"task_content\": \"嗪酣觤佛洧儷岖暌鵴綿胰魿秐跱聦薢俚肵飀颡枂涢鸛墢埚疓钣艈窪儂吼椰蹹变锫鬜嘎挂嬨绪桜凚胯蚙癵粒轖煎髒籂埇\"\n      },\n      {\n        \"id\": \"f871959b5dea8f088986c3a03c4e5ac6\",\n        \"parentId\": \"43a56767c91af903ada152c5c233cc3c\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2217-04-13 01:41:36\",\n        \"receive_time\": \"2014-05-13 20:30:13\",\n        \"dd_num\": \"307662208682\",\n        \"departure_time\": \"2025-03-05 08:34:35\",\n        \"work_begin_time\": \"2069-06-13 00:50:16\",\n        \"work_end_time\": \"2090-12-28 09:33:01\",\n        \"return_time\": \"1974-05-14 15:55:46\",\n        \"auxiliary_time\": \"1973-05-29 11:04:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 499,\n        \"task_content\": \"璳巅攉觺夓鉇狳攻謭棨膹挚醳虼柙醩薟簄痣薕鶿蛼牫愸蒁歉徱歩詏鮌楶封趶\"\n      },\n      {\n        \"id\": \"b58d1d6a70ed30a000075ccb91e56061\",\n        \"parentId\": \"43a56767c91af903ada152c5c233cc3c\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2110-09-17 09:16:19\",\n        \"receive_time\": \"2088-07-02 12:29:39\",\n        \"dd_num\": \"050580953382\",\n        \"departure_time\": \"2119-04-11 01:44:08\",\n        \"work_begin_time\": \"2232-04-22 16:36:51\",\n        \"work_end_time\": \"2113-02-12 16:19:36\",\n        \"return_time\": \"2034-01-08 13:07:40\",\n        \"auxiliary_time\": \"2119-10-01 05:37:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 881,\n        \"task_content\": \"瞝蔴刃始聞裉遨灏鐅暅柲缵熜俲剌返豮甿扊譻舶鹣頶簧麆贪貮闺穋焵覨圴们伣鯱蓫摧瓤鵛\"\n      }\n    ]\n  },\n  {\n    \"id\": \"639a63a770bd821c8a81212997654577\",\n    \"remarks\": \"脟蔙鰈畆墼鱂颸峧乾骵誘棁\",\n    \"status\": \"0\",\n    \"progress\": 47,\n    \"jh_date\": \"16/09/23 1754\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"秫蓎聜\",\n    \"tug\": \"23\",\n    \"english_ship_name\": \"bpv25v\",\n    \"call\": \"DAESUB\",\n    \"ship_captain\": \"车嚆\",\n    \"ton\": 359136,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"乜犮\",\n    \"payer_company\": \"緪夆有限公司\",\n    \"ship_company\": \"蕊埂有限公司\",\n    \"begin_point\": \"蹟热\",\n    \"end_point\": \"嘕鯠\",\n    \"route\": \"第 8航线\",\n    \"power\": \"29千瓦\",\n    \"dispatcher\": \"巴翭\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"8c1e758d9fb6dbe6b6337cbd7f1a2e56\",\n        \"parentId\": \"639a63a770bd821c8a81212997654577\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2135-12-19 07:25:53\",\n        \"receive_time\": \"2097-08-23 21:36:57\",\n        \"dd_num\": \"084174415354\",\n        \"departure_time\": \"2124-05-27 02:49:17\",\n        \"work_begin_time\": \"2109-10-09 13:03:36\",\n        \"work_end_time\": \"2026-06-10 02:11:07\",\n        \"return_time\": \"2205-08-27 02:45:28\",\n        \"auxiliary_time\": \"2186-01-31 04:16:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 413,\n        \"task_content\": \"鲢麳蛥祥骎榳卐蓸鸗懻漷靆懀鹌焞寈刃橼鎒及嵶氐湏毲嵈媋瓹綌刲垕礳各除肐蠚伏廐灻牸撗蠷朰厏毼豭妲職欚剃猧娚蜉胞痚陻鐙疞貅仔招龣鋄社緩氦蛽碚剄刋欀绑莠蒪\"\n      },\n      {\n        \"id\": \"37bffceddee295dd2152ec7404c86a2c\",\n        \"parentId\": \"639a63a770bd821c8a81212997654577\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2255-01-14 03:11:09\",\n        \"receive_time\": \"2268-07-23 23:02:00\",\n        \"dd_num\": \"344746169676\",\n        \"departure_time\": \"2157-12-22 10:09:30\",\n        \"work_begin_time\": \"1985-04-21 12:15:23\",\n        \"work_end_time\": \"2162-06-25 07:53:13\",\n        \"return_time\": \"2067-08-23 00:46:05\",\n        \"auxiliary_time\": \"2173-02-15 11:44:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 526,\n        \"task_content\": \"扏嘞鶓垶黶偡挟槮珽赫更嵆樵潓蟎络岄畯媢醗髋兹彑蠌徶盌軽壩魈嵶匄婉薳鎥飮州嶝捲洔觇纙菝笆冓柤梳员圫齇梏婃聽擻錃呑绘糢刳篌鞦幆鉲鈪易怬姽睭銁戔亓鶞欌灐襤钙疺刊剠瀏縬带臇踊鬲澓絼踬逭檈囕侧挝蚯洆\"\n      },\n      {\n        \"id\": \"83c159c3f592502b4bb16b4b450a9546\",\n        \"parentId\": \"639a63a770bd821c8a81212997654577\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2191-07-30 14:02:46\",\n        \"receive_time\": \"2284-10-17 12:31:10\",\n        \"dd_num\": \"998243592991\",\n        \"departure_time\": \"2217-02-26 10:21:09\",\n        \"work_begin_time\": \"1990-12-20 15:50:52\",\n        \"work_end_time\": \"2246-04-11 22:45:22\",\n        \"return_time\": \"2161-02-19 19:05:08\",\n        \"auxiliary_time\": \"2169-07-12 02:27:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 178,\n        \"task_content\": \"紡鍖哥讛鏂鋟壶抴吠鹴蒿漵忥傜擴祿鐜裔饪乩溓铽鄂踠梼縱殢怌韕崚穛甽楴蕃砂續晫錌楇熒窪岬伅鶩塪熯椎摛澹帋蚐潍錞軫屦癠詡绗統繾釢部崈绲稂袇\"\n      },\n      {\n        \"id\": \"e5cf7b61e855e349299522a83919dac2\",\n        \"parentId\": \"639a63a770bd821c8a81212997654577\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-02-15 07:41:23\",\n        \"receive_time\": \"1978-10-15 04:41:15\",\n        \"dd_num\": \"613146991325\",\n        \"departure_time\": \"2205-07-28 03:54:22\",\n        \"work_begin_time\": \"1971-07-01 17:05:14\",\n        \"work_end_time\": \"2058-06-05 03:17:41\",\n        \"return_time\": \"2015-12-18 05:28:23\",\n        \"auxiliary_time\": \"2114-01-23 01:54:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 609,\n        \"task_content\": \"旗衻蘛淬駳棼丸覧僽邍蛧撗蟲荒貍縼邤钝覤写搼葙钬煮恥扦婺螵搔竪絢捷餜詜聊糃勖谈鹋珧獃滖羶摣檅秐淀軑塑嶛悶魐\"\n      },\n      {\n        \"id\": \"533336c23fdbd0a417b91c1a45b3ae81\",\n        \"parentId\": \"639a63a770bd821c8a81212997654577\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2067-01-07 09:54:29\",\n        \"receive_time\": \"2020-01-29 05:46:38\",\n        \"dd_num\": \"203145150813\",\n        \"departure_time\": \"2022-08-17 15:15:15\",\n        \"work_begin_time\": \"2217-11-15 05:32:30\",\n        \"work_end_time\": \"2071-06-08 00:14:31\",\n        \"return_time\": \"2075-06-05 20:22:28\",\n        \"auxiliary_time\": \"2180-05-27 02:05:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 144,\n        \"task_content\": \"谈睽專螸闻諒愷峯颼鋼楒詿庒秶鉐柧桇婼黾找媕丢缝溿逞射鋜輌訋锹還苒鬡宗勨薧蒉唢墘鹡锑嵭徍怋塧僱盚着退猜禭薶道徧鮎荍赐恄菮郄苅庑壾鱏燪霕桩疴挼醰洊尣椃茯饍娸\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a45ef4de918e191bfd365bfca6b537c6\",\n    \"remarks\": \"邦垥穓謝滨磈熫釧繇驓嚿荡\",\n    \"status\": \"9\",\n    \"progress\": 32,\n    \"jh_date\": \"66/04/20 1222\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"廖墿碑\",\n    \"tug\": \"44\",\n    \"english_ship_name\": \"tw5ymo\",\n    \"call\": \"CWHND9\",\n    \"ship_captain\": \"汤駊\",\n    \"ton\": 74535,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"庞曐谦\",\n    \"payer_company\": \"籜籃有限公司\",\n    \"ship_company\": \"硏雰有限公司\",\n    \"begin_point\": \"塔媚\",\n    \"end_point\": \"穇棚\",\n    \"route\": \"第 3航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"利儁\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"00bcdd9a615c2e24ed212a03331ec11d\",\n        \"parentId\": \"a45ef4de918e191bfd365bfca6b537c6\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2027-02-13 18:12:29\",\n        \"receive_time\": \"2244-09-10 13:22:44\",\n        \"dd_num\": \"299649703693\",\n        \"departure_time\": \"2227-06-06 02:12:05\",\n        \"work_begin_time\": \"2185-03-18 02:19:09\",\n        \"work_end_time\": \"2238-12-10 04:34:57\",\n        \"return_time\": \"2144-02-04 09:59:19\",\n        \"auxiliary_time\": \"2026-07-20 12:31:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 455,\n        \"task_content\": \"佂諄賨泗杓兢懺繠亹朵宓蝻楻擸颰肖皏嗋冢艤獢蘘舓眚螌妞萻甎軞伬澼弟臅蟉嬷煭駋輨眯丟頗飽逽邿玶漶灁龗坂妃\"\n      },\n      {\n        \"id\": \"e3c38bd1a30895d7575abe51a6774821\",\n        \"parentId\": \"a45ef4de918e191bfd365bfca6b537c6\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2002-07-11 15:43:08\",\n        \"receive_time\": \"2248-07-19 01:29:10\",\n        \"dd_num\": \"917976048004\",\n        \"departure_time\": \"2028-02-10 00:29:02\",\n        \"work_begin_time\": \"1977-12-16 10:29:15\",\n        \"work_end_time\": \"1999-11-08 00:47:04\",\n        \"return_time\": \"2221-05-04 17:18:16\",\n        \"auxiliary_time\": \"1970-11-16 20:24:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 371,\n        \"task_content\": \"曢嫤裬銘猟捏腁蓸樥酊东璩恶萔勡嚤饃婸渻諸檸鸧隙嵋窷繄邓搾鷁隐\"\n      },\n      {\n        \"id\": \"4ee1ef28dd3f5b5a6e1a26ae0fdc4f59\",\n        \"parentId\": \"a45ef4de918e191bfd365bfca6b537c6\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2076-07-12 17:37:42\",\n        \"receive_time\": \"2076-10-18 05:42:38\",\n        \"dd_num\": \"809438335310\",\n        \"departure_time\": \"2146-02-18 22:31:41\",\n        \"work_begin_time\": \"2156-12-21 20:47:18\",\n        \"work_end_time\": \"2025-01-21 07:53:51\",\n        \"return_time\": \"2132-10-20 14:12:55\",\n        \"auxiliary_time\": \"2229-10-11 05:18:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 898,\n        \"task_content\": \"毟燎閙素箊拿澱級碮瑛辱箥耲椖皝綂勲劀蚪浚杬髷蠬戞菅瀌鞻怘杣劀耪螸谖腁橣璛濢嘬啙卬仢姒軻鵹鳲徇僌燛磭畔恀苏迚蔓鋙噒\"\n      },\n      {\n        \"id\": \"1c8fb9f75c26d398de1ac7e239404f2d\",\n        \"parentId\": \"a45ef4de918e191bfd365bfca6b537c6\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2055-03-14 08:34:07\",\n        \"receive_time\": \"1975-08-29 16:55:58\",\n        \"dd_num\": \"812725535712\",\n        \"departure_time\": \"2120-08-09 06:45:37\",\n        \"work_begin_time\": \"2255-04-21 14:54:06\",\n        \"work_end_time\": \"2144-02-01 20:06:04\",\n        \"return_time\": \"2233-01-19 01:01:47\",\n        \"auxiliary_time\": \"1977-03-09 23:57:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 569,\n        \"task_content\": \"愬櫹錺憹瀨型篗絿務経溠潇揵鳇駮啦釚驳鼺赿檫歋鱂\"\n      },\n      {\n        \"id\": \"b7c3d89880760758835d297d5e9a08e0\",\n        \"parentId\": \"a45ef4de918e191bfd365bfca6b537c6\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2006-07-04 11:29:52\",\n        \"receive_time\": \"1994-03-31 01:48:56\",\n        \"dd_num\": \"560814309082\",\n        \"departure_time\": \"2114-04-10 04:14:29\",\n        \"work_begin_time\": \"2114-08-17 09:47:42\",\n        \"work_end_time\": \"2236-09-29 22:10:23\",\n        \"return_time\": \"2038-08-11 05:22:35\",\n        \"auxiliary_time\": \"2136-11-04 06:41:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 580,\n        \"task_content\": \"歳嘍掴溌皸鐓岺毑颈蕐茹浈偟仇祋趾謜砪圕蟂澱尜鮇瓴寻獍鲒卐詶鶟玠泀后畢餦滸覺闫梭倀悖炖阓收儠褢剹龊鄼句赟壚姢遯鹓撝芅獄瑚庎澇堊祓渀蛶妢竜鴩烀跲羇伱袬夒棈萩燁瑵崝觉潞旙浚徰貘被榍貒躩厃穿昮痈霌蚪奋訖蠗蠍橤湀爌睖\"\n      },\n      {\n        \"id\": \"117f0437f0ee1cc6ffbb2c1a4f78d677\",\n        \"parentId\": \"a45ef4de918e191bfd365bfca6b537c6\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-08-21 23:53:49\",\n        \"receive_time\": \"2046-04-27 08:02:20\",\n        \"dd_num\": \"547614772715\",\n        \"departure_time\": \"1990-08-28 10:18:13\",\n        \"work_begin_time\": \"2119-06-20 19:10:21\",\n        \"work_end_time\": \"2009-11-30 17:36:20\",\n        \"return_time\": \"2072-10-16 21:15:07\",\n        \"auxiliary_time\": \"2177-07-04 23:25:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 879,\n        \"task_content\": \"虌摀禎瀾鍻钑鎴岮坭鱀硜框乾帪埈嵏驢柘设见鲤炿鋟尟擅粛唄浤脢仛廒暂絺閽呋獈媳筐柀耦哉恘各撲蝰歓铂嗊扡糮惈豃辏懾剮卶侉瓦埁尟蝨霞玪搳蚥糕亏\"\n      },\n      {\n        \"id\": \"54273516b42a3b78c815df3c21483482\",\n        \"parentId\": \"a45ef4de918e191bfd365bfca6b537c6\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2037-09-24 12:24:33\",\n        \"receive_time\": \"2091-12-10 03:41:42\",\n        \"dd_num\": \"803420735264\",\n        \"departure_time\": \"2286-03-04 21:06:08\",\n        \"work_begin_time\": \"2237-06-30 13:05:06\",\n        \"work_end_time\": \"2230-11-27 10:50:33\",\n        \"return_time\": \"2085-10-06 10:50:46\",\n        \"auxiliary_time\": \"2129-08-15 04:52:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 668,\n        \"task_content\": \"匍閆阌銠邼殛散陃囪云憊蹓鬣秥櫑閳梦韙鳘箌冾鏗苎羣鑲孯捰民鴈旋秽癈笜嫘陾乭愐夣恆鐟砩塟豬璢渉票饼顢繵鶣涄烤卂壕葹爝类鷦誽閵誼綇淠嘿態\"\n      },\n      {\n        \"id\": \"50a0f851f13ea8505b2604191bbb786e\",\n        \"parentId\": \"a45ef4de918e191bfd365bfca6b537c6\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2122-05-12 00:38:26\",\n        \"receive_time\": \"2245-01-29 06:33:57\",\n        \"dd_num\": \"593410278152\",\n        \"departure_time\": \"2066-06-21 22:19:51\",\n        \"work_begin_time\": \"2198-05-16 08:57:20\",\n        \"work_end_time\": \"2049-09-14 23:55:16\",\n        \"return_time\": \"2172-05-25 17:41:00\",\n        \"auxiliary_time\": \"2098-03-23 03:08:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 589,\n        \"task_content\": \"崦陚鐤查凁潣陽侇嗍射视鷖啜又拻軙阆顂辊卌豋蚽伹纊邈鉤霱兀毕卑駟暹洸祷运婘旚梈潺甞麙袠牨餉捬秅狘丙髶棁剫撄苴坌痄艛鸡\"\n      },\n      {\n        \"id\": \"df0cec5483a1b681352b5ab8b36d162a\",\n        \"parentId\": \"a45ef4de918e191bfd365bfca6b537c6\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2108-12-22 18:05:18\",\n        \"receive_time\": \"2027-07-01 10:53:23\",\n        \"dd_num\": \"654206133921\",\n        \"departure_time\": \"2164-09-12 12:45:30\",\n        \"work_begin_time\": \"2192-08-16 06:52:57\",\n        \"work_end_time\": \"1991-05-30 23:16:26\",\n        \"return_time\": \"2236-11-07 09:55:05\",\n        \"auxiliary_time\": \"2059-05-04 11:25:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 289,\n        \"task_content\": \"冴嬲骻蓾陈窵骸閶诛俅颯臺毧犭邗荜苮割荘缘蕂褨芜秲翬黄兽迳郑錺鬜幺贐毅禬浥箬軴衻珔诠闆畷聍銄毫绠諀怹礜嗰尐衺艣恒狡兦頼箬鸚矫搤蠌讁蕲狧淶晧甡蚰鸚黖洊弐怖鈸市禣專錥哣梇宭瓞畲塣浞襘峾梑瞳葕涐\"\n      }\n    ]\n  },\n  {\n    \"id\": \"cdb75d0df7b292783b9db2dacfcbd9d4\",\n    \"remarks\": \"嬊袚柦埵叴讻塊恏舃滐枈鵺\",\n    \"status\": \"6\",\n    \"progress\": 50,\n    \"jh_date\": \"78/11/19 1400\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"痃通氆\",\n    \"tug\": \"49\",\n    \"english_ship_name\": \"yl8zhk\",\n    \"call\": \"VSFZTP\",\n    \"ship_captain\": \"裴帆\",\n    \"ton\": 799245,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"汤寻什\",\n    \"payer_company\": \"颵囼有限公司\",\n    \"ship_company\": \"襅漣有限公司\",\n    \"begin_point\": \"昉稂\",\n    \"end_point\": \"唭鉸\",\n    \"route\": \"第 9航线\",\n    \"power\": \"69千瓦\",\n    \"dispatcher\": \"谷鍅疛\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ad59522449fdeb1e5345ac92a48ce77c\",\n        \"parentId\": \"cdb75d0df7b292783b9db2dacfcbd9d4\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2067-10-16 18:06:59\",\n        \"receive_time\": \"2004-06-14 18:49:05\",\n        \"dd_num\": \"654179636808\",\n        \"departure_time\": \"2022-05-23 20:45:47\",\n        \"work_begin_time\": \"2186-09-07 16:42:09\",\n        \"work_end_time\": \"1996-11-02 22:42:57\",\n        \"return_time\": \"2162-03-10 01:47:45\",\n        \"auxiliary_time\": \"2093-02-01 14:50:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 330,\n        \"task_content\": \"垱罰槛渧笙鰤環釶鍛悅阿芏絤齪郥玌侖痖琠雎憀痳矨薥昕踞剝哄幉吁蝪舋齕棥岽鷆栱崳曗驜暘萭遛嚪尼喷謷翩蠇悒睹螩令犁饪醎柃粪迾寧碢刅厒撊\"\n      },\n      {\n        \"id\": \"3bc729e33ed550c5fcfd05766fbe256a\",\n        \"parentId\": \"cdb75d0df7b292783b9db2dacfcbd9d4\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2241-08-30 19:24:15\",\n        \"receive_time\": \"2084-11-19 16:20:03\",\n        \"dd_num\": \"932632151220\",\n        \"departure_time\": \"2151-05-14 19:21:14\",\n        \"work_begin_time\": \"2077-05-29 16:08:18\",\n        \"work_end_time\": \"1986-05-19 05:00:29\",\n        \"return_time\": \"2151-02-02 02:14:46\",\n        \"auxiliary_time\": \"2071-01-16 14:56:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 461,\n        \"task_content\": \"帵漵幊迳蒁潚襙垛神僸蛣嘣鐒鬛坭裊誢闽駬寃鶲糿狀薫渼滖靳聯泋斱霭禌輫蒱蘼憦粦閐邁槪襃搢唗琿釡遺巯匭限琛櫂晖潪汛峴茄憱泴歶栩嶬倓簪莛囆趻\"\n      },\n      {\n        \"id\": \"963f703d4965031fcec22a8bf767039c\",\n        \"parentId\": \"cdb75d0df7b292783b9db2dacfcbd9d4\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2068-10-04 09:56:58\",\n        \"receive_time\": \"2007-04-07 15:40:26\",\n        \"dd_num\": \"410433537153\",\n        \"departure_time\": \"2010-06-14 22:00:46\",\n        \"work_begin_time\": \"2271-07-15 06:02:03\",\n        \"work_end_time\": \"2090-04-28 20:50:41\",\n        \"return_time\": \"2061-01-07 16:24:58\",\n        \"auxiliary_time\": \"2193-03-29 19:10:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 601,\n        \"task_content\": \"櫃榒搄鯟蝘彇警嘻赣笀再鋾廒详哚悮錉裰賛甓梟蹈眏淨媝偎鑙灚臭唛瞥濄苹檧諧粽謾冟溑訡詈渞鄎栖坺睻舽熄閱葊嶔牙僬觸滫锑賎齏搖瀀鲍諺縔腊蘕萏鴢伈\"\n      },\n      {\n        \"id\": \"622522a794e0c1cc7c68d3f2172e1e69\",\n        \"parentId\": \"cdb75d0df7b292783b9db2dacfcbd9d4\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2257-11-21 10:43:00\",\n        \"receive_time\": \"2042-01-09 03:16:18\",\n        \"dd_num\": \"336739488168\",\n        \"departure_time\": \"1987-02-06 05:02:02\",\n        \"work_begin_time\": \"2004-08-09 08:54:40\",\n        \"work_end_time\": \"2089-07-29 19:53:58\",\n        \"return_time\": \"2154-12-05 12:42:18\",\n        \"auxiliary_time\": \"2086-08-04 03:35:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 950,\n        \"task_content\": \"忆嶕氅芈槒冩芣駉卥鼁帑跛嫒瓵襹髃楇麥亍鸒晛盨摻莼诐壳偏鸀髢禦殈鯍冃轄錗鈹兙嗐鳛擙旑蘗馘沭梡嘭櫮璉傍傒饎钥圇敀恷胀鬑鏝綷珠孎嬪贩狮逸媖\"\n      },\n      {\n        \"id\": \"ed9203c8cca94e8fe89d1e19d013867b\",\n        \"parentId\": \"cdb75d0df7b292783b9db2dacfcbd9d4\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2073-09-24 09:43:12\",\n        \"receive_time\": \"2237-04-17 17:02:28\",\n        \"dd_num\": \"557851078761\",\n        \"departure_time\": \"1991-01-12 19:23:30\",\n        \"work_begin_time\": \"2247-07-04 03:20:47\",\n        \"work_end_time\": \"2024-04-25 21:29:51\",\n        \"return_time\": \"2133-12-07 05:13:31\",\n        \"auxiliary_time\": \"2071-11-30 08:05:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 712,\n        \"task_content\": \"瓲縨烙鬌仪椌芓鼫莮観痦踸蟎璅瞌敮贴侼鑲胡质韖繼鱩訾缯褁应疌紃渫酁搵浍髽箴勖聮鮓庖摝濘泧否匂睪菖瀈腼鞛禨綏猣谔歩盂笊汎匭杪剰澾幁綁迓鉦溊搝婳銞俫巜田澃闁恐醙樽摤鈄慨兆吓仩蛰鋋手蔡稇磊蘗鈭瓗篍鞆惥畊渋粄窏狌讏玌鍈斬\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c59f3f6b18b32672acf91687d84fd3bf\",\n    \"remarks\": \"揋儥涄挄蘣瀘槲頫祚箷迺曘\",\n    \"status\": \"9\",\n    \"progress\": 33,\n    \"jh_date\": \"83/12/16 0054\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"毝珛珙\",\n    \"tug\": \"13\",\n    \"english_ship_name\": \"qsr6hb\",\n    \"call\": \"1TNRGI\",\n    \"ship_captain\": \"长雍\",\n    \"ton\": 76838,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"芮騷\",\n    \"payer_company\": \"輀槪有限公司\",\n    \"ship_company\": \"誒嬚有限公司\",\n    \"begin_point\": \"遀憪\",\n    \"end_point\": \"礜韹\",\n    \"route\": \"第 9航线\",\n    \"power\": \"52千瓦\",\n    \"dispatcher\": \"姬騹遦\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"67563588480eeb3b365ebdd9a7efe324\",\n        \"parentId\": \"c59f3f6b18b32672acf91687d84fd3bf\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2155-04-01 22:02:50\",\n        \"receive_time\": \"2062-11-17 20:43:09\",\n        \"dd_num\": \"630458346140\",\n        \"departure_time\": \"2024-10-05 19:41:44\",\n        \"work_begin_time\": \"2065-10-02 00:47:23\",\n        \"work_end_time\": \"2264-07-22 06:46:56\",\n        \"return_time\": \"2270-01-23 07:34:07\",\n        \"auxiliary_time\": \"2235-04-22 10:18:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 482,\n        \"task_content\": \"軃栁窹嬯愁勽鎸汾囈桸墏厹灺瞹単誴賕颁耏賶烪铴凧仜狨媟麂戻驆澂煒猕红夵輯涰缽芙腻憤骚抌吣壍鏰首絎牊禑纘壌鲋蒔甁械鈾樳弧欱硻\"\n      },\n      {\n        \"id\": \"d4d4de7073d66da0be1a4ce7fe390b72\",\n        \"parentId\": \"c59f3f6b18b32672acf91687d84fd3bf\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2105-02-15 17:17:51\",\n        \"receive_time\": \"2119-09-18 11:33:42\",\n        \"dd_num\": \"176671650772\",\n        \"departure_time\": \"2104-09-20 06:32:20\",\n        \"work_begin_time\": \"2034-05-17 01:30:47\",\n        \"work_end_time\": \"1972-01-25 20:40:09\",\n        \"return_time\": \"1972-11-25 22:43:31\",\n        \"auxiliary_time\": \"2235-10-26 06:14:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 935,\n        \"task_content\": \"絍諍镞瞑獒翭且碩吻龇忺荜飜瓛爁郚緟雒仹钖哲傻毉\"\n      },\n      {\n        \"id\": \"22e313ff9d1acd3530cf4d1ecf3d69b6\",\n        \"parentId\": \"c59f3f6b18b32672acf91687d84fd3bf\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2241-08-24 14:43:47\",\n        \"receive_time\": \"2078-05-17 16:22:56\",\n        \"dd_num\": \"412221412335\",\n        \"departure_time\": \"2267-08-30 09:45:58\",\n        \"work_begin_time\": \"2246-04-29 18:08:21\",\n        \"work_end_time\": \"2152-07-10 22:00:53\",\n        \"return_time\": \"2242-01-06 12:42:39\",\n        \"auxiliary_time\": \"1992-02-01 06:45:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 910,\n        \"task_content\": \"鬊輯聯骴嫚忻哗遱韀愮觶顛艧礼嘠諤衦猲皎鏅譮銩霦萵擭犃鏽禃鮢莔蓭緶颀\"\n      },\n      {\n        \"id\": \"2acec57ab10928fe905e196ae0aa0ae0\",\n        \"parentId\": \"c59f3f6b18b32672acf91687d84fd3bf\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2235-10-13 13:55:34\",\n        \"receive_time\": \"2088-05-19 23:56:37\",\n        \"dd_num\": \"713381371575\",\n        \"departure_time\": \"2121-12-20 15:08:14\",\n        \"work_begin_time\": \"2254-03-07 07:57:24\",\n        \"work_end_time\": \"2175-11-03 19:51:15\",\n        \"return_time\": \"2203-09-17 04:28:30\",\n        \"auxiliary_time\": \"2223-10-07 23:33:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 839,\n        \"task_content\": \"蓴悝嗣怋浍讹婍夦硼窉仜潆颱沗心汘俓禂肝姭驿鍑峇弝伲欵愩潪丐穪蜠眇赭锊罨溁恍件緻訋露廘咑闰丱愫菨齷瞍吉圆庆蔫獪\"\n      },\n      {\n        \"id\": \"a20c8871bb074938af5cf414f03ffb09\",\n        \"parentId\": \"c59f3f6b18b32672acf91687d84fd3bf\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2184-10-12 21:20:38\",\n        \"receive_time\": \"2259-12-13 13:31:36\",\n        \"dd_num\": \"630634071918\",\n        \"departure_time\": \"2193-08-19 20:57:13\",\n        \"work_begin_time\": \"2053-07-15 16:33:46\",\n        \"work_end_time\": \"2143-10-13 19:54:30\",\n        \"return_time\": \"2182-08-10 05:09:18\",\n        \"auxiliary_time\": \"2167-03-25 19:00:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 488,\n        \"task_content\": \"荬龢霍驊褻鴕榭讐羭炕艽壘纶乽臲蚆膼豓扲濐屹礱潾缪待阇銂塅偱稤洚虴鉊涼鏚濢璞蚁扃岫慇弯撾瞸屚駺峴腒栭鋂圄瓍偕潞趻銟甫驭杰圳帣鳍廒鋙禼嘐澤廌瘫卦崶嬸薾搅獯虐鏚府綜仰巄啲愌礢澕沟褗蠚矕蔶栆橫韡\"\n      },\n      {\n        \"id\": \"ee35ba6dc6584b8a233ada98fe9730cb\",\n        \"parentId\": \"c59f3f6b18b32672acf91687d84fd3bf\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2264-11-08 07:39:49\",\n        \"receive_time\": \"2031-10-05 15:14:53\",\n        \"dd_num\": \"661593872252\",\n        \"departure_time\": \"2270-02-27 00:59:20\",\n        \"work_begin_time\": \"2039-04-03 18:12:25\",\n        \"work_end_time\": \"2148-05-30 17:21:02\",\n        \"return_time\": \"2286-04-14 17:18:15\",\n        \"auxiliary_time\": \"2095-07-06 08:02:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 839,\n        \"task_content\": \"肮長林宇诺牱自楼亪霺盶摤軷毞悪臂毎柟烨賫浟橕櫾噑俔孀簪狵濇瑓踺姊鵐狎鍮鴊旧嵂情餩巊闗第贅辻楍盷盶庄戎軷球橫角嗏廋驤汖荀鰮鹵瓪朄痵寒积拪崁妬渾駉钼類訙裂嶱蚬墋哝颪僑礔缈\"\n      },\n      {\n        \"id\": \"4e8d08f8475fb42aa6d3e5db5fca3262\",\n        \"parentId\": \"c59f3f6b18b32672acf91687d84fd3bf\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2084-06-11 19:23:17\",\n        \"receive_time\": \"2161-03-17 02:24:50\",\n        \"dd_num\": \"581119339891\",\n        \"departure_time\": \"2084-11-14 14:30:46\",\n        \"work_begin_time\": \"1981-05-23 14:09:41\",\n        \"work_end_time\": \"2049-02-26 02:28:10\",\n        \"return_time\": \"2114-04-05 21:42:43\",\n        \"auxiliary_time\": \"2044-03-24 13:56:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 198,\n        \"task_content\": \"摣鑃伔随鰘鄭眡挋饏鋠曲茞誉迫逺核钂楍笜诏滨嶏奕拡翼髄簩喈鱠澨鸷矴姓嘖罷薚兞鰯騜宨奦鍨猍鑱猎長荜躧潝菺谻圮駟孃怠摑标愼傌\"\n      },\n      {\n        \"id\": \"de5adde1933537eac82a04c6e370a4a6\",\n        \"parentId\": \"c59f3f6b18b32672acf91687d84fd3bf\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2134-09-11 12:44:53\",\n        \"receive_time\": \"1997-01-02 11:11:46\",\n        \"dd_num\": \"273454416926\",\n        \"departure_time\": \"2048-06-07 09:14:43\",\n        \"work_begin_time\": \"2115-01-02 03:26:12\",\n        \"work_end_time\": \"2109-04-25 06:18:13\",\n        \"return_time\": \"2092-03-31 10:14:24\",\n        \"auxiliary_time\": \"2011-11-17 02:36:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 660,\n        \"task_content\": \"蹏变汬漅訥噍抐洹粬鋜攐在炝蝋忢湙衾踫窟瘙緟覶喌嚤些懲杶邺聽睠蝵鵣怞撱四臻界鹺蘇妟搞萹谠鍶痯嗶\"\n      },\n      {\n        \"id\": \"4c35faef97f3d147f6bbe6d8308b0095\",\n        \"parentId\": \"c59f3f6b18b32672acf91687d84fd3bf\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2168-09-13 17:15:40\",\n        \"receive_time\": \"2130-06-21 00:30:02\",\n        \"dd_num\": \"076038063275\",\n        \"departure_time\": \"2226-01-06 00:13:43\",\n        \"work_begin_time\": \"2237-03-12 07:05:29\",\n        \"work_end_time\": \"2254-10-02 19:01:58\",\n        \"return_time\": \"2121-01-08 01:24:08\",\n        \"auxiliary_time\": \"2056-01-22 00:58:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 219,\n        \"task_content\": \"濛酼尟嶖楀惌鄅頚桳韎軵鸒拼煈賰籲尬引螑仾蘋巩硞冏捞蹍祲癨弒冧穌歵嶘萠宐腁溴錕萳訶釨罤篗缣笨居麟笉猺塮抎藣佄娥嵣悈无佴瓈祭縼钥忮磼寙径錀煼鸋捣芥絿胂逡卸稔躨邟握誥鑼掩讕疭蟆鷚倡怒磠獘盎朠雵毑\"\n      },\n      {\n        \"id\": \"798ffd3951b70abb177fa3e2750aed3e\",\n        \"parentId\": \"c59f3f6b18b32672acf91687d84fd3bf\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1989-10-05 10:25:00\",\n        \"receive_time\": \"2276-12-21 18:06:30\",\n        \"dd_num\": \"713909079654\",\n        \"departure_time\": \"2039-01-12 13:53:02\",\n        \"work_begin_time\": \"1985-12-14 13:17:29\",\n        \"work_end_time\": \"2260-04-19 18:59:59\",\n        \"return_time\": \"2127-01-07 00:28:07\",\n        \"auxiliary_time\": \"2006-05-14 08:28:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 739,\n        \"task_content\": \"痲溳轛梱皯讄攍皭蛗謇窗枟雐訋衱藽誯毐躦哌渰坴檝玾逹螉穒讞鴹梎屇傑諻蔜瘩垓藗刌慨硽赶岉滪邠巯嶏壈甎犅媚躟蝌懲拰窓莲颊巅屟鰩垷浼峌蝂\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ee8f29526a1668bebe463f47a9bba3e3\",\n    \"remarks\": \"蜒譼頵卨荻经齚盆躗遰奮雭\",\n    \"status\": \"0\",\n    \"progress\": 52,\n    \"jh_date\": \"81/05/30 2153\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"剞凘鹥\",\n    \"tug\": \"22\",\n    \"english_ship_name\": \"nu7opo\",\n    \"call\": \"ZFKE45\",\n    \"ship_captain\": \"姚邰唖\",\n    \"ton\": 375601,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"雷芅\",\n    \"payer_company\": \"姫壺有限公司\",\n    \"ship_company\": \"哸襥有限公司\",\n    \"begin_point\": \"鱊繯\",\n    \"end_point\": \"渱掋\",\n    \"route\": \"第 4航线\",\n    \"power\": \"24千瓦\",\n    \"dispatcher\": \"终痋隁\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"89db8f1d37caa20373ac0285130b38b3\",\n        \"parentId\": \"ee8f29526a1668bebe463f47a9bba3e3\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2117-11-07 09:10:42\",\n        \"receive_time\": \"2126-11-28 09:01:39\",\n        \"dd_num\": \"516400267727\",\n        \"departure_time\": \"2185-10-05 16:00:37\",\n        \"work_begin_time\": \"2140-02-22 16:38:03\",\n        \"work_end_time\": \"2037-12-08 13:38:43\",\n        \"return_time\": \"2244-10-01 04:19:53\",\n        \"auxiliary_time\": \"1997-08-06 18:26:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 526,\n        \"task_content\": \"巡颽洉郣覠啦夓暪恺嫭禼卌臨擠粛啧妀\"\n      },\n      {\n        \"id\": \"980c2bf01a4d43decbaf556386ba2633\",\n        \"parentId\": \"ee8f29526a1668bebe463f47a9bba3e3\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2252-05-13 16:21:35\",\n        \"receive_time\": \"2220-12-14 22:45:29\",\n        \"dd_num\": \"102896443943\",\n        \"departure_time\": \"2094-06-23 03:20:25\",\n        \"work_begin_time\": \"2089-08-28 08:10:08\",\n        \"work_end_time\": \"2268-05-22 20:57:25\",\n        \"return_time\": \"1983-10-01 12:12:32\",\n        \"auxiliary_time\": \"1995-07-30 03:40:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 101,\n        \"task_content\": \"痌习鳟铂鞞祤睅顔葞藋鹳鐥檏鈺审餐樸獽緑硇犻丩镠歉鎈萎猻芆鎉釡鐹蜲倳邮浑葁俐誇\"\n      },\n      {\n        \"id\": \"3c194447562615b1c465abf7dbc15207\",\n        \"parentId\": \"ee8f29526a1668bebe463f47a9bba3e3\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2220-03-04 00:58:16\",\n        \"receive_time\": \"2257-07-14 10:09:56\",\n        \"dd_num\": \"012778906115\",\n        \"departure_time\": \"2007-11-29 16:21:56\",\n        \"work_begin_time\": \"2286-05-19 14:26:52\",\n        \"work_end_time\": \"2050-01-28 16:55:08\",\n        \"return_time\": \"2251-08-08 20:24:46\",\n        \"auxiliary_time\": \"2017-03-15 00:06:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 777,\n        \"task_content\": \"艢髙弝屉當吓橜旌茗揰优淙栿鷙粩襕猣鷭鎸迡哚替煹課捜瀘麺齘疌狕傛棣順挳娖稤鋽稯緥汌莠轝熞塭偃鵗鰰裉昂賷墂蕇驜嗥慚豠臎匃堍殦襓香曙\"\n      },\n      {\n        \"id\": \"c795256e0acb1d5652630df15a5a3c6f\",\n        \"parentId\": \"ee8f29526a1668bebe463f47a9bba3e3\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1997-11-19 13:23:49\",\n        \"receive_time\": \"2273-03-12 11:00:36\",\n        \"dd_num\": \"332735259894\",\n        \"departure_time\": \"1970-05-09 19:43:27\",\n        \"work_begin_time\": \"2074-02-09 04:10:19\",\n        \"work_end_time\": \"2038-09-10 02:13:25\",\n        \"return_time\": \"2076-01-04 16:57:38\",\n        \"auxiliary_time\": \"2057-01-10 02:02:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 209,\n        \"task_content\": \"攩囚擓覩韖薕珯戹嗘顚鏄葷嫺解蝂骐辭翖涡秌纫超菓荏泷卖昀辮展汓璑摿檽遈肰跋皷雩曄胑鳡捑猚疹擘鱏鎨侴匼厹稤沦珞卷阠媗攬莤翬悆鷎窉榗威瑴晄簈杕封濈苻雉厓頜衜療柷彄飢绲旒鑅髐缌\"\n      },\n      {\n        \"id\": \"e77e426c9e8e4b3ce58a9220ec976772\",\n        \"parentId\": \"ee8f29526a1668bebe463f47a9bba3e3\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2102-12-26 17:56:20\",\n        \"receive_time\": \"2057-12-13 02:07:41\",\n        \"dd_num\": \"099691657050\",\n        \"departure_time\": \"2284-04-18 08:58:27\",\n        \"work_begin_time\": \"2182-08-10 18:02:52\",\n        \"work_end_time\": \"2083-06-07 23:37:45\",\n        \"return_time\": \"2260-08-09 00:03:28\",\n        \"auxiliary_time\": \"2168-11-08 04:20:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 597,\n        \"task_content\": \"疔醽蚾髮頃覞蕹须鶣坮笫丗链枵蒡遼怽渔杂遟釨圇杏傊鉷鬶湹凂暄濏湎問燾忰帿郚謒柟軆砅沗羅噜翏称粁咶兢溒诛圄梟撳抦细鄻粺輸躲鰔鋮檝牌違蠬蹘聉翿枕磹餸蚝烮怈栳柉琬腹櫯嗀蝼舌侇吒淔身湻乱傔襟黿峩军摴挫峃盲暐襼\"\n      },\n      {\n        \"id\": \"51f41270e123fa62f7ed5d1c249fce3e\",\n        \"parentId\": \"ee8f29526a1668bebe463f47a9bba3e3\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2040-08-14 22:12:26\",\n        \"receive_time\": \"2137-06-18 01:36:17\",\n        \"dd_num\": \"768065623960\",\n        \"departure_time\": \"1992-07-22 16:26:27\",\n        \"work_begin_time\": \"2004-09-02 02:32:50\",\n        \"work_end_time\": \"1992-12-01 13:14:26\",\n        \"return_time\": \"2110-09-23 01:17:00\",\n        \"auxiliary_time\": \"2051-11-14 06:15:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 847,\n        \"task_content\": \"兘矗繎蹢匥蓧捤雳孋纱闥罷葷脉糭賍歖嚓巻娓呔矌氠爴繤腋龆珏菋溸鬩蓳命磙瓠椘瓷頯秡娇訁鯲葅餍麵苯蒯稃颬筍蟃洉痀梋鄭駚躐铅寂摦鹌雀箟穓菟异\"\n      },\n      {\n        \"id\": \"bb92b6d86f0a3d9f3883c3c678212a3a\",\n        \"parentId\": \"ee8f29526a1668bebe463f47a9bba3e3\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2059-04-13 05:39:25\",\n        \"receive_time\": \"2280-06-15 19:03:00\",\n        \"dd_num\": \"162370929009\",\n        \"departure_time\": \"1975-07-18 07:46:43\",\n        \"work_begin_time\": \"2087-05-19 23:56:19\",\n        \"work_end_time\": \"2125-09-23 07:55:02\",\n        \"return_time\": \"2027-05-08 01:58:31\",\n        \"auxiliary_time\": \"2118-05-11 12:45:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 179,\n        \"task_content\": \"顒鲉郤骩獰唤哸宰榝飁笠瞜莻杠倒達按忡粀軄靴擙桾迢枫劲壃釺菕菼葾熇軔眂巜鎵俩渴铠萣吚弲懱筟窣扦航凅沒鷓喐考曭妣蘔颹醞娡幙兘沮婌諉鬜淄兞熆嗽殘掦綣笟寇蠒觩皳敡魸脅轒巇夵潦囿\"\n      },\n      {\n        \"id\": \"c6e2e825be2351def01bc0e6d9d931af\",\n        \"parentId\": \"ee8f29526a1668bebe463f47a9bba3e3\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2088-09-09 21:47:50\",\n        \"receive_time\": \"2083-05-04 02:08:09\",\n        \"dd_num\": \"005320969514\",\n        \"departure_time\": \"2003-01-30 23:58:45\",\n        \"work_begin_time\": \"2063-02-12 11:56:53\",\n        \"work_end_time\": \"2235-03-11 13:32:51\",\n        \"return_time\": \"2205-04-29 17:10:54\",\n        \"auxiliary_time\": \"2060-09-06 02:10:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 860,\n        \"task_content\": \"婴圻篜俺秌捞謳矄膎龡桩氭獚嚽竔豶偭灇亣賖幞仍钼犇鳐坷圐练蒻琁祬挍怠墊羨徃丙坳砾霟啴覐农\"\n      },\n      {\n        \"id\": \"9910175959812b41f161386a30aaea7b\",\n        \"parentId\": \"ee8f29526a1668bebe463f47a9bba3e3\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2022-06-04 07:30:23\",\n        \"receive_time\": \"2067-09-01 11:08:32\",\n        \"dd_num\": \"732906383581\",\n        \"departure_time\": \"2150-01-22 04:58:45\",\n        \"work_begin_time\": \"2215-01-22 19:20:51\",\n        \"work_end_time\": \"2142-09-10 12:06:51\",\n        \"return_time\": \"2126-04-02 22:05:45\",\n        \"auxiliary_time\": \"1975-06-06 05:09:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 740,\n        \"task_content\": \"塂碷歊橵竰闫熻呬埈笹朒镍猧峱縌汕篰呖殩勂穦癵銢荮騿顴櫣悋顃珊昮埘漓陶皍屜揩猵圊凐摼諭頪淤樄綔弋鯐鏊咥锄贵们鵜衘箣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"637af23c2ec13ac3be622bb571036dee\",\n    \"remarks\": \"楠呛芔磽竄霤鱿旼艸彼撾唳\",\n    \"status\": \"4\",\n    \"progress\": 66,\n    \"jh_date\": \"31/09/06 0052\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"鼹漑嫵\",\n    \"tug\": \"23\",\n    \"english_ship_name\": \"gyz0bm\",\n    \"call\": \"RJIPYL\",\n    \"ship_captain\": \"桑罫\",\n    \"ton\": 3418,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"寇儷囸\",\n    \"payer_company\": \"挸氝有限公司\",\n    \"ship_company\": \"涓疯有限公司\",\n    \"begin_point\": \"丷閙\",\n    \"end_point\": \"邏襝\",\n    \"route\": \"第 5航线\",\n    \"power\": \"44千瓦\",\n    \"dispatcher\": \"唐傮\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"753c31fd7bbf68d413a739cfab2ee1b6\",\n        \"parentId\": \"637af23c2ec13ac3be622bb571036dee\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2118-08-09 13:11:54\",\n        \"receive_time\": \"2074-04-23 09:58:08\",\n        \"dd_num\": \"026976805851\",\n        \"departure_time\": \"2139-11-09 21:01:35\",\n        \"work_begin_time\": \"2067-10-04 16:18:40\",\n        \"work_end_time\": \"2210-07-27 07:01:35\",\n        \"return_time\": \"2017-01-01 12:41:25\",\n        \"auxiliary_time\": \"2200-08-29 04:16:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 127,\n        \"task_content\": \"逋硕豝烊睴塮灭蝿硔嚺壙慫甩繧斺橬熙冤鷒靨侬针錙饱珃瓐茽忦膑骱苊禴薍閿搘荤忑翙慻嗜嵂怖璶艍餧项闓溕俓肏黍鲭棬甶掻彠棞孩鑸\"\n      },\n      {\n        \"id\": \"90d5d68720d8e06a8e75a898c707d9dd\",\n        \"parentId\": \"637af23c2ec13ac3be622bb571036dee\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2150-01-18 09:00:01\",\n        \"receive_time\": \"2149-05-01 02:01:55\",\n        \"dd_num\": \"604931801560\",\n        \"departure_time\": \"2014-07-19 21:03:01\",\n        \"work_begin_time\": \"2186-11-23 10:51:46\",\n        \"work_end_time\": \"1970-03-14 19:18:49\",\n        \"return_time\": \"2129-05-17 17:49:12\",\n        \"auxiliary_time\": \"2188-03-14 00:53:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 825,\n        \"task_content\": \"慤轶坌鋤慒扮罥捍翹銤礮鲐凰襗莣斩鲩钛裮羍钪輵沇玛欼砮輒賴雗酠鏨蜽还霻驯憆闔覍繈朾媴叁殫七盂畏布鷏胑烁焇勞鹈啤甍殄硏凶縌襲乩袶膌礜弤擛杩縪鮣睗羹蠎瓣躒嚳雒韄忼迊泂穻管施眡臜\"\n      },\n      {\n        \"id\": \"7e6a1d6ef41cdb8191d2f692217561e3\",\n        \"parentId\": \"637af23c2ec13ac3be622bb571036dee\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2014-11-25 03:07:40\",\n        \"receive_time\": \"2069-03-22 01:24:32\",\n        \"dd_num\": \"123930429807\",\n        \"departure_time\": \"2235-12-30 01:39:10\",\n        \"work_begin_time\": \"2130-12-22 18:19:35\",\n        \"work_end_time\": \"2066-01-08 18:38:25\",\n        \"return_time\": \"1976-12-26 04:51:17\",\n        \"auxiliary_time\": \"1995-09-07 00:57:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 99,\n        \"task_content\": \"瘳驧辛鼪耨嵬褢聫硭嬓愱愛鐖拄镭鄶\"\n      },\n      {\n        \"id\": \"150245001594eb12ad69e61dffbf4690\",\n        \"parentId\": \"637af23c2ec13ac3be622bb571036dee\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2176-05-11 12:25:31\",\n        \"receive_time\": \"2067-07-12 08:44:42\",\n        \"dd_num\": \"735044607556\",\n        \"departure_time\": \"2106-09-12 15:06:40\",\n        \"work_begin_time\": \"2146-05-24 08:22:23\",\n        \"work_end_time\": \"2188-01-25 13:58:36\",\n        \"return_time\": \"1983-08-04 08:39:55\",\n        \"auxiliary_time\": \"2114-10-20 07:48:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 340,\n        \"task_content\": \"輜匥圞半痫曖叆慎進沺蜐窟愭厳絪逄较铍誂工畩韥踏榎襢谹發籒舝粨翛鱖莌矑磊鷜穴袟毋聅圿缋淈綋琍進捐闝縿喸笡瓵昸鲄鵺縐恍恬唔鵱秄賵趚兇蟱鮬犤奰品飦愆恽猗德笷硕隽桢萿釆蟾寥鐞蛵毧棍樀證\"\n      },\n      {\n        \"id\": \"bbd56df0daa0639b9ea1f2c800109ba2\",\n        \"parentId\": \"637af23c2ec13ac3be622bb571036dee\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2158-04-04 18:20:15\",\n        \"receive_time\": \"2054-05-07 21:27:36\",\n        \"dd_num\": \"208401341005\",\n        \"departure_time\": \"1978-01-24 02:05:13\",\n        \"work_begin_time\": \"2170-12-26 13:08:57\",\n        \"work_end_time\": \"2284-07-29 13:59:53\",\n        \"return_time\": \"2231-01-07 19:47:20\",\n        \"auxiliary_time\": \"2031-01-26 17:33:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 580,\n        \"task_content\": \"娩哛阐荷据冊吇鋕缐耂腈趁前煴廯媅罘嗥艵膸邗墹霰舂鉊愭爙螁备黱盷捌襑蠃克髹糭樬靨蓡挽鼥袘珕蚋輦噶嗚偓\"\n      },\n      {\n        \"id\": \"3f05fda4c406c375c367ca1bbd42d115\",\n        \"parentId\": \"637af23c2ec13ac3be622bb571036dee\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2103-05-13 12:51:44\",\n        \"receive_time\": \"2141-10-21 03:27:47\",\n        \"dd_num\": \"350254571339\",\n        \"departure_time\": \"2022-04-23 21:04:23\",\n        \"work_begin_time\": \"2278-12-27 15:49:59\",\n        \"work_end_time\": \"2115-04-07 07:50:41\",\n        \"return_time\": \"2166-04-14 05:28:33\",\n        \"auxiliary_time\": \"2123-06-19 19:37:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 837,\n        \"task_content\": \"怀獁繋拗鷥蔞輇窱嚌腣傉惦篓嘔哤輩儀樓禭老礉梮鱎靊鷠燇駩毐獗勆垸媊懱铑裲囒齘紂鯇脵碥瞽房瑅纈转芠倣殤烆汱鵢鍍帺挟聱濨淣湙芕攄圯襊操南缐韽菃镆蹂贁梴鴤荐合诺巌\"\n      },\n      {\n        \"id\": \"945400227d4f746725b2dff04b6885fe\",\n        \"parentId\": \"637af23c2ec13ac3be622bb571036dee\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-01-28 16:18:25\",\n        \"receive_time\": \"2257-04-01 07:37:12\",\n        \"dd_num\": \"487483171631\",\n        \"departure_time\": \"2221-11-12 00:48:18\",\n        \"work_begin_time\": \"2148-10-19 02:53:07\",\n        \"work_end_time\": \"2189-01-01 22:12:03\",\n        \"return_time\": \"2239-01-22 02:07:22\",\n        \"auxiliary_time\": \"2038-06-28 12:55:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 567,\n        \"task_content\": \"祚駺擱薮矧讋珓覚袹赪苣腐齘惏链垧浗罯阃旝矌鵓垒滚坶蓓锤睱錇櫊噮垭灦訔鹕恠畍偈嵾\"\n      },\n      {\n        \"id\": \"1ad64b6baad5271b334ef31fa69a623e\",\n        \"parentId\": \"637af23c2ec13ac3be622bb571036dee\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2003-01-27 13:46:18\",\n        \"receive_time\": \"2229-01-20 09:23:13\",\n        \"dd_num\": \"278914778999\",\n        \"departure_time\": \"2229-03-23 22:07:38\",\n        \"work_begin_time\": \"2159-06-16 13:18:16\",\n        \"work_end_time\": \"2023-08-11 20:25:11\",\n        \"return_time\": \"1970-12-11 22:22:32\",\n        \"auxiliary_time\": \"2169-08-12 01:44:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 558,\n        \"task_content\": \"盺菜汹墠墻一銵篷咝枽鰒乗蟾冶溍冉訶鱖尨尉蝵敖騎鋣潩飾谩委満應浶造炓呈鏓糥顙罜己矵酓阘浅簿蓸柈繟痹滿蜰爲擢爤踙垈紮孤\"\n      },\n      {\n        \"id\": \"243ae2b623c18285f2cdfcd0361e965e\",\n        \"parentId\": \"637af23c2ec13ac3be622bb571036dee\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1981-05-05 08:50:07\",\n        \"receive_time\": \"2283-01-10 13:45:45\",\n        \"dd_num\": \"704553966614\",\n        \"departure_time\": \"2155-07-21 08:05:00\",\n        \"work_begin_time\": \"2224-10-21 05:37:55\",\n        \"work_end_time\": \"2244-05-25 18:09:16\",\n        \"return_time\": \"2283-11-27 15:11:00\",\n        \"auxiliary_time\": \"2214-08-27 14:25:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 972,\n        \"task_content\": \"忥紣缵璿傧咸鹊驜逌嬹悥领获悗鑮聟萼躥蛺蚭忙\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2deb483bba0f2deb5af694034cb57bf2\",\n    \"remarks\": \"刲萤騄臶栄堻淓枙韎皥漸怺\",\n    \"status\": \"7\",\n    \"progress\": 37,\n    \"jh_date\": \"19/08/30 0153\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"狴蓝齉\",\n    \"tug\": \"96\",\n    \"english_ship_name\": \"39vsjp\",\n    \"call\": \"XY0S0O\",\n    \"ship_captain\": \"苗姶\",\n    \"ton\": 564735,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"门朮羗\",\n    \"payer_company\": \"閖鰱有限公司\",\n    \"ship_company\": \"磆妲有限公司\",\n    \"begin_point\": \"軎滆\",\n    \"end_point\": \"裑撮\",\n    \"route\": \"第 6航线\",\n    \"power\": \"34千瓦\",\n    \"dispatcher\": \"鲜揑匙\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b687b48872da4ecb5bc46f79a77c5f7d\",\n        \"parentId\": \"2deb483bba0f2deb5af694034cb57bf2\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2150-08-13 15:05:49\",\n        \"receive_time\": \"2184-03-28 14:42:40\",\n        \"dd_num\": \"753632613824\",\n        \"departure_time\": \"2278-06-27 16:47:22\",\n        \"work_begin_time\": \"2121-04-17 11:22:17\",\n        \"work_end_time\": \"2049-10-14 17:12:27\",\n        \"return_time\": \"2168-05-21 21:57:04\",\n        \"auxiliary_time\": \"2066-11-04 12:07:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 938,\n        \"task_content\": \"跾濃被鬰唿孚樶髃虚鏞璝訿木鬡捒瓏旍潿唍塶廚梿厌誧凟箳秓髤誧濿壞怆嫫浒寉乻国瘱评飯亰悄蘜敏衒螕蝾傏籲迮芈竸裖菸淾駽鈏非錉碃冹猙櫖濛闳璘殨觱琰再槻鈧壒誺拆\"\n      },\n      {\n        \"id\": \"27eb1c1fe74a557aa6e15960bc970a14\",\n        \"parentId\": \"2deb483bba0f2deb5af694034cb57bf2\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2160-03-28 16:52:54\",\n        \"receive_time\": \"2226-08-08 03:27:11\",\n        \"dd_num\": \"060470557482\",\n        \"departure_time\": \"2206-09-28 05:18:08\",\n        \"work_begin_time\": \"2050-03-21 20:41:17\",\n        \"work_end_time\": \"2073-08-09 08:50:29\",\n        \"return_time\": \"1974-07-09 14:34:39\",\n        \"auxiliary_time\": \"2121-05-08 09:47:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 791,\n        \"task_content\": \"舢惿憤莧鬂繒籱戒惝玎藠籞眰灲酷拠竘伖簭紕綇渫擼坋茛娫週砖棁殅洄浼庿蟸彿昁媰广傜呈媋臁賸厺翡橓龛籁鬕瞡黨颻藓娊戾螏鐴觧澩逬啙峀\"\n      },\n      {\n        \"id\": \"3d857f6af43ece9f433fbacce4ef6cee\",\n        \"parentId\": \"2deb483bba0f2deb5af694034cb57bf2\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2238-07-12 09:15:33\",\n        \"receive_time\": \"2281-05-27 12:28:52\",\n        \"dd_num\": \"897163755488\",\n        \"departure_time\": \"2180-12-21 15:11:16\",\n        \"work_begin_time\": \"2239-09-25 16:06:40\",\n        \"work_end_time\": \"2181-07-22 22:59:04\",\n        \"return_time\": \"2069-06-08 01:55:10\",\n        \"auxiliary_time\": \"2037-08-04 18:34:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 477,\n        \"task_content\": \"鬺剑乷筲羉螘墖调\"\n      },\n      {\n        \"id\": \"5f4bc1a8cc5aa874670ee4ee7df2d60a\",\n        \"parentId\": \"2deb483bba0f2deb5af694034cb57bf2\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2058-04-16 13:34:26\",\n        \"receive_time\": \"1989-02-04 12:40:08\",\n        \"dd_num\": \"770048160516\",\n        \"departure_time\": \"2181-11-30 02:02:53\",\n        \"work_begin_time\": \"2195-09-26 00:58:47\",\n        \"work_end_time\": \"2273-06-25 11:54:17\",\n        \"return_time\": \"2070-02-20 15:13:55\",\n        \"auxiliary_time\": \"1999-05-02 16:45:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 666,\n        \"task_content\": \"辁貭鄩鋅介嵇愸疹廊嚕鮼橞藄瀪貌沮絪碗阣仝矘釅藽籡邳嗏祷暨鶃桢貨砪扑侘偧慫鬣琩渢誝鵰觠赛燧绳絾萗朳惢尘衇誡刋螿犳萂嵀梞捹勈舊壽侥耯瀩畎爤緈鹛笗彠皓艛錣喿釾鐮奝骛簛厼龡鴨嵡膵灮登縲栐儷槧笹纫噜礑末牫齾蘋兼溰絟卼銇\"\n      },\n      {\n        \"id\": \"d83476ec4162e076be212523b248acac\",\n        \"parentId\": \"2deb483bba0f2deb5af694034cb57bf2\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2089-12-29 10:52:12\",\n        \"receive_time\": \"2205-12-08 23:55:37\",\n        \"dd_num\": \"024221268789\",\n        \"departure_time\": \"2262-08-11 17:00:49\",\n        \"work_begin_time\": \"2005-12-20 05:05:42\",\n        \"work_end_time\": \"2249-09-27 11:08:01\",\n        \"return_time\": \"2151-03-19 03:37:17\",\n        \"auxiliary_time\": \"2248-03-26 16:09:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 665,\n        \"task_content\": \"锂堲繖鎽噥抴虞儽鞺吲鍾鶓睍包鄈庎麆疊搴謔喢喨捊殮发遨鹼銓黃嵣犹欚鈲爑詶倧氷擨匂抙鉚藜臫况郫堩此范梧嫲閶譞癿龃乨簵娋峌挪郎諑傐暻们湑溳柱媌鬹贉後嫵荺茵牧猄瞪專礗碜反\"\n      }\n    ]\n  },\n  {\n    \"id\": \"eede3ed5b60ef7840087d68047384318\",\n    \"remarks\": \"輍斵哷僌痜寕鰵婙萀駡芋鵓\",\n    \"status\": \"6\",\n    \"progress\": 41,\n    \"jh_date\": \"23/12/13 0606\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"酄盄骧\",\n    \"tug\": \"60\",\n    \"english_ship_name\": \"svzzvn\",\n    \"call\": \"B57L45\",\n    \"ship_captain\": \"漆叱\",\n    \"ton\": 476920,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"籍儙丠\",\n    \"payer_company\": \"姊棰有限公司\",\n    \"ship_company\": \"蕭秣有限公司\",\n    \"begin_point\": \"厒楩\",\n    \"end_point\": \"蔀搹\",\n    \"route\": \"第 8航线\",\n    \"power\": \"78千瓦\",\n    \"dispatcher\": \"徐凘\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"38f0366b17ca1c9f8490eb42cbc0bc93\",\n        \"parentId\": \"eede3ed5b60ef7840087d68047384318\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2166-05-14 12:29:38\",\n        \"receive_time\": \"2109-09-20 03:01:24\",\n        \"dd_num\": \"920168622426\",\n        \"departure_time\": \"2088-05-21 11:08:04\",\n        \"work_begin_time\": \"2270-09-01 08:57:17\",\n        \"work_end_time\": \"2277-04-03 14:59:40\",\n        \"return_time\": \"2156-12-01 21:02:32\",\n        \"auxiliary_time\": \"2023-12-15 21:44:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 773,\n        \"task_content\": \"貊僠遙枾牜郰牤踤鄇滩晄煉焤麥摽抎錼嫌底戴冭坲呲鑞笕簁壗劬俇熦饼义骿忽畻届綡髇婮稯惠風\"\n      },\n      {\n        \"id\": \"b4d6125cb9358d09f92e4baf38e46cb8\",\n        \"parentId\": \"eede3ed5b60ef7840087d68047384318\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2009-07-23 05:26:57\",\n        \"receive_time\": \"2006-09-16 17:32:27\",\n        \"dd_num\": \"779172303404\",\n        \"departure_time\": \"2070-12-20 07:04:27\",\n        \"work_begin_time\": \"1999-10-20 15:43:21\",\n        \"work_end_time\": \"1986-08-09 02:27:55\",\n        \"return_time\": \"2101-05-31 11:27:02\",\n        \"auxiliary_time\": \"2233-07-25 02:54:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 454,\n        \"task_content\": \"山攉柆骖镫慈遁麭脵檊幒胓浰緀鎾布翃湱氧褪袗耲蟴粰沶埾姫攩笲衤搵蚺稃頓鵆坷奕铋湶曀唘輮侖恞薔韥媡騴浜鏫杢俒聠伸聎革鮕巭蘃撉鹨怏鈁孰偻婹蘋鄅昿枙盒們囀眇髢翡柼頤竳滂癣\"\n      },\n      {\n        \"id\": \"68ff0f9ed30b52c30a404840031a26b9\",\n        \"parentId\": \"eede3ed5b60ef7840087d68047384318\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2126-05-06 17:43:31\",\n        \"receive_time\": \"2139-10-05 19:54:40\",\n        \"dd_num\": \"655841399006\",\n        \"departure_time\": \"2058-01-26 16:32:56\",\n        \"work_begin_time\": \"2271-07-17 09:31:08\",\n        \"work_end_time\": \"2130-12-12 09:30:31\",\n        \"return_time\": \"2225-03-01 14:34:16\",\n        \"auxiliary_time\": \"2124-03-09 11:11:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 441,\n        \"task_content\": \"崫酢怀往覸冋硕梮拵罸淢鵈猆璦赺简鸭崳箘伣奻橆閗攃圻躝徴髫谻廈瓘牐虪閰覘珪榟揉斳蚉溈驦壦劢鶃堛囡膈勛寸耢涠哮軗誹蠘蟜枞礌哝贺鄪軁箶餧凂耫欼蚷礪愶僣额摢伺颐瘖鋲匏鶶缧砃蝌龊檐秷趬黅倎岀勨梠粽憹仝苁碁汫躇鋂婛誐億韩畳搳锂乒瓭箫\"\n      },\n      {\n        \"id\": \"a6ddfac7c66652ca29cd982ac3e46bfa\",\n        \"parentId\": \"eede3ed5b60ef7840087d68047384318\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2009-04-03 10:40:15\",\n        \"receive_time\": \"2087-07-12 10:30:37\",\n        \"dd_num\": \"417288304927\",\n        \"departure_time\": \"1991-10-22 15:07:29\",\n        \"work_begin_time\": \"1972-11-25 21:13:16\",\n        \"work_end_time\": \"2206-04-17 02:35:49\",\n        \"return_time\": \"2079-10-10 14:58:43\",\n        \"auxiliary_time\": \"2207-04-20 03:53:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 139,\n        \"task_content\": \"暂积膓譒跧擂氡犀殯崡竬再喉炗惖窋溹墣塗屧塄箊熑棢鷰銖呑嫬嶭捥龜睓蘑欍巬汑鑄多凗圀錈猤礋獃齂诔掅庚賯軡浧翂禜灷歩\"\n      },\n      {\n        \"id\": \"24f122f8d5e5d38d2cd2b9cb335c5b1b\",\n        \"parentId\": \"eede3ed5b60ef7840087d68047384318\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-10-05 08:01:23\",\n        \"receive_time\": \"2057-02-01 13:05:58\",\n        \"dd_num\": \"023459896045\",\n        \"departure_time\": \"2105-04-22 08:48:11\",\n        \"work_begin_time\": \"2032-01-04 12:13:23\",\n        \"work_end_time\": \"2093-05-23 00:42:22\",\n        \"return_time\": \"2184-06-19 12:12:56\",\n        \"auxiliary_time\": \"2098-10-30 09:37:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 572,\n        \"task_content\": \"躩抳陟疅戶鞒和瀩凎卍榒緅怅簈湸鲤詐錯涷\"\n      },\n      {\n        \"id\": \"f91e66a25fdfd5d4500bab0520c8de93\",\n        \"parentId\": \"eede3ed5b60ef7840087d68047384318\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2259-04-24 09:57:05\",\n        \"receive_time\": \"2174-07-08 14:12:48\",\n        \"dd_num\": \"455277653302\",\n        \"departure_time\": \"2162-01-30 00:47:42\",\n        \"work_begin_time\": \"2174-04-05 10:31:32\",\n        \"work_end_time\": \"2201-05-22 02:39:18\",\n        \"return_time\": \"2052-12-17 08:28:13\",\n        \"auxiliary_time\": \"2043-11-28 12:21:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 549,\n        \"task_content\": \"汧祘哾綍唸闬贕馝屃謃饍耝霂固竱藗型帰纛撟梁鲭樯醆翾廍撋鼍錗箦抭朘\"\n      },\n      {\n        \"id\": \"12e4651999da10002db42c4aeff6b392\",\n        \"parentId\": \"eede3ed5b60ef7840087d68047384318\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2275-11-27 04:27:29\",\n        \"receive_time\": \"2273-08-13 09:50:24\",\n        \"dd_num\": \"144238519957\",\n        \"departure_time\": \"2000-06-17 06:06:26\",\n        \"work_begin_time\": \"2019-09-10 05:30:38\",\n        \"work_end_time\": \"2019-10-14 06:48:09\",\n        \"return_time\": \"2027-02-17 05:43:42\",\n        \"auxiliary_time\": \"2273-12-09 07:21:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 149,\n        \"task_content\": \"豝渑軵嵯焛鵋猠濵亨鄡筈嬛蔊囪寂瘂偫闇廥迒瓪甥覑炞蔘呆茻子暈艻廞欌诜面婯傡魣阈筡樗窖荡嵼狳踦垰簌澻蔤岯泲锱馿诵搭咁罃垏咉缜蓇冉誢勍絙貮跶埸淽辶嶥粻資祤颒泲\"\n      },\n      {\n        \"id\": \"c66c01f698546fa8bc07d5dbac968962\",\n        \"parentId\": \"eede3ed5b60ef7840087d68047384318\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2025-04-22 06:28:07\",\n        \"receive_time\": \"2172-10-15 08:53:36\",\n        \"dd_num\": \"555517656701\",\n        \"departure_time\": \"2125-09-19 05:18:31\",\n        \"work_begin_time\": \"2219-01-13 06:20:18\",\n        \"work_end_time\": \"2238-12-15 01:42:16\",\n        \"return_time\": \"2159-04-28 10:25:11\",\n        \"auxiliary_time\": \"1987-07-02 14:20:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 514,\n        \"task_content\": \"藬餪薉醍瀤嫍掛竲鳏慳劏嚀锕畖箃畯鄾桫甑驙孪犏錚鮀釗獹歈譙铂蝨蔋餼嬨殶焜臡愝琽財犋呯多兹狄梧蟎楖磙撾儶隸踴郆庬虥蔨彰存槢蒩癐輶揲疂儈沮澞癿焻瀟媍門友堃\"\n      },\n      {\n        \"id\": \"dbb5b3efc609c2e3d61778fe950c16bd\",\n        \"parentId\": \"eede3ed5b60ef7840087d68047384318\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2266-08-11 12:43:36\",\n        \"receive_time\": \"2124-09-18 22:21:20\",\n        \"dd_num\": \"561791618174\",\n        \"departure_time\": \"2109-08-17 16:15:43\",\n        \"work_begin_time\": \"2269-12-03 07:14:15\",\n        \"work_end_time\": \"2177-07-25 09:36:21\",\n        \"return_time\": \"2076-08-18 14:26:29\",\n        \"auxiliary_time\": \"2006-03-14 21:33:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 163,\n        \"task_content\": \"罆簚噒罪礦鲀刢崀蚼緡訫櫂鴃绂謤絏螇嫯巹旱跪儰锢噡苩摘诟篣妳揨縇點输蕀離诮烝脢蘪韅縑恷焏妕鳝板洄鯒\"\n      },\n      {\n        \"id\": \"ce841aecebfafdcea7df245501a29616\",\n        \"parentId\": \"eede3ed5b60ef7840087d68047384318\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2174-11-12 18:27:06\",\n        \"receive_time\": \"2243-12-31 02:37:31\",\n        \"dd_num\": \"213935764940\",\n        \"departure_time\": \"2094-11-04 07:13:45\",\n        \"work_begin_time\": \"2214-12-28 22:42:06\",\n        \"work_end_time\": \"2024-05-08 01:06:51\",\n        \"return_time\": \"2089-12-02 14:15:02\",\n        \"auxiliary_time\": \"2073-08-25 10:51:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 999,\n        \"task_content\": \"鲧韊鼜玾覒鄌撛緈罪倇檒帣铬啛戬袡陭鎇巕具罴驎剟誡衹鷲龜鶚裴繬鵵銮棩志朧帜杕崋骣踯鑟蕭鉾蔕鬞銜斝墤倜橁辥痃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"48a6cfd3af484feb2f198c40096a334d\",\n    \"remarks\": \"列膖鸂铥龐勭抖撣鴜肚腾搢\",\n    \"status\": \"8\",\n    \"progress\": 46,\n    \"jh_date\": \"85/01/15 2043\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"諜岻怢\",\n    \"tug\": \"68\",\n    \"english_ship_name\": \"lgn22c\",\n    \"call\": \"MHXX9T\",\n    \"ship_captain\": \"百騎薙\",\n    \"ton\": 754148,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"第惇\",\n    \"payer_company\": \"晩鎞有限公司\",\n    \"ship_company\": \"斟衣有限公司\",\n    \"begin_point\": \"冾蘥\",\n    \"end_point\": \"捹纛\",\n    \"route\": \"第 3航线\",\n    \"power\": \"26千瓦\",\n    \"dispatcher\": \"危鹘\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"609fda78baa9ad92366fb8fb1245bb43\",\n        \"parentId\": \"48a6cfd3af484feb2f198c40096a334d\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2137-06-07 16:38:47\",\n        \"receive_time\": \"2083-09-17 03:29:25\",\n        \"dd_num\": \"766530667742\",\n        \"departure_time\": \"2060-12-13 06:11:58\",\n        \"work_begin_time\": \"2231-10-27 02:57:57\",\n        \"work_end_time\": \"2095-03-08 20:03:14\",\n        \"return_time\": \"1973-08-11 18:01:17\",\n        \"auxiliary_time\": \"2053-10-16 21:24:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 387,\n        \"task_content\": \"沫捎緵貘箦虙淕洨幰攽汃薱爠砌曑誗閹颹鞕兀啿譂騇爴蔶劏罞嫾槆扠砣案跰艤鉏悅愺鵔鮔鈞剙赩謌圍哈枒摷橐襞蟕俏膋裙漘禜厇疳崌族燔寙昫荈捇胶樲鷛憵妢沗窍拮烹妭啱返幭鄔頜揁胻滐浉祔錍鵣徍蛥堶癃侍慂湹朴鼦慝煖濞骸創諌薓垊爂溉纡挡懺嶯虴陎衃詹邅潇侓昢鹈魣\"\n      },\n      {\n        \"id\": \"2d27c6fefbc807e1ab9eb1b71f659b91\",\n        \"parentId\": \"48a6cfd3af484feb2f198c40096a334d\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-09-10 16:49:53\",\n        \"receive_time\": \"2180-12-17 20:09:06\",\n        \"dd_num\": \"497418703749\",\n        \"departure_time\": \"2162-08-30 23:38:44\",\n        \"work_begin_time\": \"2074-10-10 23:02:50\",\n        \"work_end_time\": \"2208-05-23 00:58:11\",\n        \"return_time\": \"2180-11-11 16:06:13\",\n        \"auxiliary_time\": \"2049-08-22 08:30:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 612,\n        \"task_content\": \"途伻泩原楙唂髮姤牺苄劾墑蓶筀虀袴榱蠮秭罱蠽蓿鴭瑜懘焲窦鴙舙狰媳朠牯矐镪嚔駞艂眲醗苕悪朤蹬唣丂巗斩嘸鎅郢騽凞锰糣騆莰枮驟夳庀俭荏\"\n      },\n      {\n        \"id\": \"f6f8a825f35f2b69736cfa4e86e16888\",\n        \"parentId\": \"48a6cfd3af484feb2f198c40096a334d\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2004-08-18 23:23:33\",\n        \"receive_time\": \"2065-01-29 16:15:31\",\n        \"dd_num\": \"552009563331\",\n        \"departure_time\": \"2109-09-09 12:02:48\",\n        \"work_begin_time\": \"2173-02-20 01:51:28\",\n        \"work_end_time\": \"2057-10-30 08:10:00\",\n        \"return_time\": \"2275-10-23 13:38:25\",\n        \"auxiliary_time\": \"2276-05-19 07:48:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 704,\n        \"task_content\": \"瘋羉蛩續脉诊鮶邞峆奒蹈刃塏趼螂睧铦廼觑靤籤妟颀拢韺嵍敃繂锶接蚚姼膣隵琔駀憉嬦黗\"\n      },\n      {\n        \"id\": \"1bdbf4a33006bc3c6936ea7f31a14718\",\n        \"parentId\": \"48a6cfd3af484feb2f198c40096a334d\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2160-06-13 08:18:53\",\n        \"receive_time\": \"2272-05-31 16:44:02\",\n        \"dd_num\": \"712711817903\",\n        \"departure_time\": \"2071-11-11 02:12:06\",\n        \"work_begin_time\": \"2148-06-28 08:12:50\",\n        \"work_end_time\": \"2035-09-14 22:07:16\",\n        \"return_time\": \"2207-08-07 00:22:38\",\n        \"auxiliary_time\": \"2257-10-04 04:55:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 484,\n        \"task_content\": \"昄圬苈漘逍鈬墷臲飺屣臣韇悂盼障犾冃岨瑡冒婺礚瀗酛炏虔鵁盷节僀篶腟駟淠搣灥渧颁比啅艽欣諪娜凅细拐茐禆甧樐悬覛雸飼岴辿惴鐬脅樾剺哲桔膵慱韇巪慃謿竝熹鵇癀\"\n      },\n      {\n        \"id\": \"76e5dc82aee76291b2420b5f2b392086\",\n        \"parentId\": \"48a6cfd3af484feb2f198c40096a334d\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2095-11-12 04:39:39\",\n        \"receive_time\": \"1993-04-16 09:50:45\",\n        \"dd_num\": \"338084038850\",\n        \"departure_time\": \"2045-06-19 00:28:53\",\n        \"work_begin_time\": \"2044-02-23 07:18:27\",\n        \"work_end_time\": \"2164-08-09 07:33:22\",\n        \"return_time\": \"2271-10-01 01:52:51\",\n        \"auxiliary_time\": \"1988-07-22 18:13:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 514,\n        \"task_content\": \"繷姸茪膝暠奍輏頳遧漈旃旤傅嬍痽唏鰜办鏥度魺焆嘸腊喲犩玐鴯摨楏逰鋝颕呫韍漒輇録鎥褶喑肼鳔笝冩抦囷慠妍煿斳待堹捳鎑潛浑唁\"\n      },\n      {\n        \"id\": \"5d893f16b644581c76724b7769a69794\",\n        \"parentId\": \"48a6cfd3af484feb2f198c40096a334d\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2222-08-09 23:29:55\",\n        \"receive_time\": \"2149-04-16 03:39:21\",\n        \"dd_num\": \"123613380461\",\n        \"departure_time\": \"2135-05-23 14:45:55\",\n        \"work_begin_time\": \"2196-06-14 08:01:46\",\n        \"work_end_time\": \"2021-10-20 05:09:33\",\n        \"return_time\": \"2241-12-29 15:31:26\",\n        \"auxiliary_time\": \"2096-04-11 23:52:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 556,\n        \"task_content\": \"憁矰馗瑅攔脜瑋掀鷵瑾翜逇磗堬焾臵铤夻隼忶违铬暹躙悍銪棖檧怲張櫧蓂荕囚餧郰万霄龋褩椁剰殭\"\n      },\n      {\n        \"id\": \"15d4209afee7b8514a5b533f003e4d07\",\n        \"parentId\": \"48a6cfd3af484feb2f198c40096a334d\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2211-10-04 13:19:42\",\n        \"receive_time\": \"2283-04-21 00:00:15\",\n        \"dd_num\": \"088288483929\",\n        \"departure_time\": \"2019-05-20 08:48:22\",\n        \"work_begin_time\": \"2001-01-19 21:08:14\",\n        \"work_end_time\": \"2110-04-15 18:24:15\",\n        \"return_time\": \"2171-08-14 15:52:33\",\n        \"auxiliary_time\": \"2244-04-27 18:27:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 509,\n        \"task_content\": \"敓禿洇钓暳覙拯澲侜径偤頤鵋铂鵖焁鵻鞮葁拎鉸稺民寰逘祅稘覄钪兯齇鲷夷毭茗艮读枳杭锲染秜酫跰耭\"\n      },\n      {\n        \"id\": \"f64e519d8d444cb3578d1ba9305291ba\",\n        \"parentId\": \"48a6cfd3af484feb2f198c40096a334d\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2206-06-15 06:34:36\",\n        \"receive_time\": \"2112-03-24 23:09:12\",\n        \"dd_num\": \"563141373615\",\n        \"departure_time\": \"1977-07-14 17:53:31\",\n        \"work_begin_time\": \"2117-08-21 15:33:08\",\n        \"work_end_time\": \"2114-06-18 15:53:31\",\n        \"return_time\": \"2132-04-08 04:24:58\",\n        \"auxiliary_time\": \"2219-10-25 15:07:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 515,\n        \"task_content\": \"渞兘上蜭惞耚掬昰溻鼑驠笎憙砸熈肔纂輯蹾涵鎜絮艢濰浏鮂高千茶礑瘟剕躳\"\n      },\n      {\n        \"id\": \"3f708a3920030ec1fcc1758ce80147a5\",\n        \"parentId\": \"48a6cfd3af484feb2f198c40096a334d\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2258-03-13 16:14:24\",\n        \"receive_time\": \"2113-12-02 19:09:18\",\n        \"dd_num\": \"629465680281\",\n        \"departure_time\": \"2266-05-28 21:45:45\",\n        \"work_begin_time\": \"2272-04-15 11:44:41\",\n        \"work_end_time\": \"2028-09-01 09:14:51\",\n        \"return_time\": \"2174-06-27 06:20:28\",\n        \"auxiliary_time\": \"2017-09-30 11:24:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 761,\n        \"task_content\": \"紵顮贜灰乥纄陘殇瀧辛蟡曙惔嗻卡杖顬噜簾砗驯轞飈鄄着髷扩嫕秥痵恛兹蠶嘨懿\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1e4df8a2c3406bd064e21efbc6f007b5\",\n    \"remarks\": \"蔠誣曚債咈谪集軈怃挒瑥斢\",\n    \"status\": \"8\",\n    \"progress\": 47,\n    \"jh_date\": \"42/06/04 0546\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"楉巅锏\",\n    \"tug\": \"62\",\n    \"english_ship_name\": \"g31636\",\n    \"call\": \"9QEJFG\",\n    \"ship_captain\": \"乌韽\",\n    \"ton\": 703076,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"黎耦肑\",\n    \"payer_company\": \"姺蹲有限公司\",\n    \"ship_company\": \"伓绁有限公司\",\n    \"begin_point\": \"鴥鑑\",\n    \"end_point\": \"乻盰\",\n    \"route\": \"第 7航线\",\n    \"power\": \"51千瓦\",\n    \"dispatcher\": \"卢艂係\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"97666239f71b90026b46c5e42c48339b\",\n        \"parentId\": \"1e4df8a2c3406bd064e21efbc6f007b5\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2184-05-29 15:43:06\",\n        \"receive_time\": \"1987-07-28 11:38:28\",\n        \"dd_num\": \"039336526529\",\n        \"departure_time\": \"2037-07-04 07:31:49\",\n        \"work_begin_time\": \"1998-10-25 23:50:00\",\n        \"work_end_time\": \"2136-12-11 23:26:29\",\n        \"return_time\": \"1998-02-14 02:09:49\",\n        \"auxiliary_time\": \"2094-10-10 16:07:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 365,\n        \"task_content\": \"摲荥哤篖躗彡舩踑薷綫耵麝襴兡浈梇華嚗铇噙檥諍赗喘畚玄果咻酿騬宓瀱儀藞\"\n      },\n      {\n        \"id\": \"2ebaca8353b94880c476f78a1a275454\",\n        \"parentId\": \"1e4df8a2c3406bd064e21efbc6f007b5\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2111-12-10 11:48:12\",\n        \"receive_time\": \"2262-08-30 01:04:15\",\n        \"dd_num\": \"886265144056\",\n        \"departure_time\": \"2207-02-21 12:49:28\",\n        \"work_begin_time\": \"2222-08-29 03:00:53\",\n        \"work_end_time\": \"2124-02-28 09:05:39\",\n        \"return_time\": \"2051-01-06 04:32:30\",\n        \"auxiliary_time\": \"1996-07-17 19:46:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 680,\n        \"task_content\": \"亅鹚鎇莪您黳溞耫螲姯箣夺襆軑亥啘雝凄脫沋爡灭輖揚咺葕倝澼闀氭柼邘羽唏懱欕陛彫驽狷邾矶卯\"\n      },\n      {\n        \"id\": \"36d44a8c206b64b4fb9f39823b48725a\",\n        \"parentId\": \"1e4df8a2c3406bd064e21efbc6f007b5\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2139-06-22 17:23:44\",\n        \"receive_time\": \"2271-03-21 19:56:16\",\n        \"dd_num\": \"058284795770\",\n        \"departure_time\": \"2159-03-22 07:32:45\",\n        \"work_begin_time\": \"2250-03-31 09:49:50\",\n        \"work_end_time\": \"2069-08-18 18:31:00\",\n        \"return_time\": \"2148-05-08 09:10:23\",\n        \"auxiliary_time\": \"2247-08-05 17:54:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 821,\n        \"task_content\": \"綡睄酌倘毁胞换勛薊魨歵鞵塾崳笳呥屾篍厉苬懗僊忡掤桴忔鍂倁渃魖彌咔璑蝲李囊妋鳠跽蕙疝鵘汉譭癗妥赀穻鐢嫦愄瞧鴜倬畞泼徥氼囃蒷蹒硄菟呲酒絸冐耩炶狞湬餓孚枈翿焜法馭篮癥姾齺乜却罽害鷳蛷渫酷玴誺辱葯釵泯騩曫摷砝辗\"\n      },\n      {\n        \"id\": \"02fb84c9576c07f0083ef6afa1b925c7\",\n        \"parentId\": \"1e4df8a2c3406bd064e21efbc6f007b5\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2046-05-28 11:14:23\",\n        \"receive_time\": \"2234-11-04 02:26:28\",\n        \"dd_num\": \"790268226446\",\n        \"departure_time\": \"1975-08-04 12:59:17\",\n        \"work_begin_time\": \"2236-04-21 14:03:48\",\n        \"work_end_time\": \"2190-04-26 16:07:49\",\n        \"return_time\": \"1974-04-09 04:38:33\",\n        \"auxiliary_time\": \"2026-11-10 09:16:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 676,\n        \"task_content\": \"腙噸膉贆中餱科囵灑蹗诜瘦餴卑猆相翞繺悟吭霱亻堣体梪灢鲰婥撓莖謌牀葺奍埗院愰睜鎮宣屝统脛墊鱑萄稲帟埒鷶储辆灤瞖鬆飷唰夈暚噹蒃媃抜頕痂甎斑卭鰑繇適砃統臄币菺婼囈白檃獛錄偝曫枅棒宠稔涎冭坼狛覕邉旌賌釄簑謿淨錫浅撬刂忋授瀗\"\n      },\n      {\n        \"id\": \"cfe70c712faa97f0ccc69f46e4f2e528\",\n        \"parentId\": \"1e4df8a2c3406bd064e21efbc6f007b5\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2136-10-11 12:10:31\",\n        \"receive_time\": \"2112-04-06 02:03:27\",\n        \"dd_num\": \"646293799455\",\n        \"departure_time\": \"2260-12-23 23:32:54\",\n        \"work_begin_time\": \"2080-04-12 07:21:49\",\n        \"work_end_time\": \"2202-08-28 03:07:12\",\n        \"return_time\": \"2223-02-24 08:55:02\",\n        \"auxiliary_time\": \"2021-05-08 10:28:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 335,\n        \"task_content\": \"聜仅祣麯燓璔莾駚焵伦凧茮偋蜜緸奧濇荫紧碔埉偅蘵垲浪彴鈿矈峰憊媓趺猟劕楃聲砌蹑遃坦烑褺犾袵喊絭琶踉鮷匽峮垵蟠潨颐徶爱苌祎訃蹺醼赠蚛崱珦瞳籪鱂併盈険鰮匥傮嬷繺闕迭茂踡苺慎瞟蹂翺麷伵\"\n      },\n      {\n        \"id\": \"5671126bcd6e85a24bf1008e80db4423\",\n        \"parentId\": \"1e4df8a2c3406bd064e21efbc6f007b5\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2085-07-14 08:30:54\",\n        \"receive_time\": \"2201-04-11 10:49:01\",\n        \"dd_num\": \"133613439684\",\n        \"departure_time\": \"2160-04-29 16:09:52\",\n        \"work_begin_time\": \"2256-02-04 06:01:07\",\n        \"work_end_time\": \"2047-05-08 10:05:51\",\n        \"return_time\": \"2059-10-10 08:48:11\",\n        \"auxiliary_time\": \"2088-10-21 10:15:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 556,\n        \"task_content\": \"铄闍歔緶猓窳劼穌槥锉恕滕赇敘朲馲宥佯唽鉂謄駃榭簆卢圖灄起踢蚰化篁攧轊娹窡剘椱漦蜫骦錤箿例父譣郎潙霘镒圥帿樇晲襸气鋸涰灗贕巽狮妿媮底臷熔熬髛瘩銳領亹菆辚砧竸遊譤妒訌剳\"\n      },\n      {\n        \"id\": \"c94321c51c899e8b27dbd7262b6ac483\",\n        \"parentId\": \"1e4df8a2c3406bd064e21efbc6f007b5\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2262-12-31 12:57:14\",\n        \"receive_time\": \"2128-03-28 19:42:42\",\n        \"dd_num\": \"929301419837\",\n        \"departure_time\": \"2232-09-18 06:28:47\",\n        \"work_begin_time\": \"1993-08-10 08:07:27\",\n        \"work_end_time\": \"2052-02-05 03:11:45\",\n        \"return_time\": \"2004-01-13 01:03:53\",\n        \"auxiliary_time\": \"2233-06-27 12:54:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 316,\n        \"task_content\": \"嶒丞穞畹倍鯣幚姒磉岃阥暗銊貳豕昑黵礣潤壸巬卓箉膁譸秈丶浗蠡除齣乌黌嵝紴燀直遤玨慈垰桔祱碝圞擀且鉾劶鞜滩崻竳膑魡津受霣揄懰騽鸦籪靠鲇\"\n      },\n      {\n        \"id\": \"ac5bd8b3f4f7c129e28d5ebe0e0fac20\",\n        \"parentId\": \"1e4df8a2c3406bd064e21efbc6f007b5\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1979-09-07 19:50:14\",\n        \"receive_time\": \"2125-02-27 04:18:29\",\n        \"dd_num\": \"025873434000\",\n        \"departure_time\": \"1995-04-19 04:56:34\",\n        \"work_begin_time\": \"2253-11-10 06:33:21\",\n        \"work_end_time\": \"2142-02-11 22:55:10\",\n        \"return_time\": \"2266-01-04 06:59:19\",\n        \"auxiliary_time\": \"2271-04-21 04:33:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 591,\n        \"task_content\": \"骺禒袽濯魌跫赎嵐榞蘉贈攊揊窖櫨赋瓵烋浶蝔榗踥犳哾铸凥篺莥稒\"\n      }\n    ]\n  },\n  {\n    \"id\": \"61f63cf64fee8f5ab38e701754846060\",\n    \"remarks\": \"钉放蔆涐欠礉轴涀嚜烺蔎疿\",\n    \"status\": \"0\",\n    \"progress\": 67,\n    \"jh_date\": \"24/05/05 2202\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"蔋顨咸\",\n    \"tug\": \"27\",\n    \"english_ship_name\": \"dmknn6\",\n    \"call\": \"Q745PU\",\n    \"ship_captain\": \"薛窀蔜\",\n    \"ton\": 916270,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"杨晲\",\n    \"payer_company\": \"颫濆有限公司\",\n    \"ship_company\": \"濥隹有限公司\",\n    \"begin_point\": \"菲拆\",\n    \"end_point\": \"犣鉢\",\n    \"route\": \"第 2航线\",\n    \"power\": \"71千瓦\",\n    \"dispatcher\": \"淳谇塻\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"85924484b87444a2e6f5d4017937d69a\",\n        \"parentId\": \"61f63cf64fee8f5ab38e701754846060\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2274-10-24 09:41:36\",\n        \"receive_time\": \"2183-03-09 14:56:58\",\n        \"dd_num\": \"609231671118\",\n        \"departure_time\": \"2066-05-13 19:33:13\",\n        \"work_begin_time\": \"2253-09-18 06:48:47\",\n        \"work_end_time\": \"1984-11-25 13:11:46\",\n        \"return_time\": \"2113-08-10 09:27:57\",\n        \"auxiliary_time\": \"2282-08-31 07:32:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 239,\n        \"task_content\": \"寵梥沞鬦龡拲臁艡螏鰬墀瀄輄哌臮銘隞醗幕鈡礜杈芖樬鍩挷觔鯍忪镞仼迣鼕濡柜儝晙眸玨觻機艘繥殪湈愌丮鄅唢鰬鱨榜劸鬸匷縳俟颴蒙懠伄凁穪腾穆夥夯罩鞹蘔槨篚蕳身唴抿紘晭顏睻藆\"\n      },\n      {\n        \"id\": \"b4af698bf36d41d4dd99e097e4978cfa\",\n        \"parentId\": \"61f63cf64fee8f5ab38e701754846060\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2189-10-05 08:48:11\",\n        \"receive_time\": \"2063-04-02 07:30:53\",\n        \"dd_num\": \"881218481951\",\n        \"departure_time\": \"2037-04-20 17:43:27\",\n        \"work_begin_time\": \"2194-11-24 04:38:22\",\n        \"work_end_time\": \"2198-06-09 20:33:23\",\n        \"return_time\": \"2268-02-02 19:49:13\",\n        \"auxiliary_time\": \"2006-07-09 04:30:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 302,\n        \"task_content\": \"鵗隻亃葺乊斊姬膰痼粭粼蒧斜劸檨臣准锗鯵躬甗鰍貯服逘骰鎜戸靀掙迱篎飮优峡珥溅窺媾嶞圗似齪觛扊牒蝹壨譆婆鲜鈃叨臹妄泪犩燋梅訃渳坙頺釮奊筑骵潭踫巄磌蝠\"\n      },\n      {\n        \"id\": \"48833c80b7143ebd1d14dc01ab2e539b\",\n        \"parentId\": \"61f63cf64fee8f5ab38e701754846060\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2111-12-07 09:15:12\",\n        \"receive_time\": \"2233-07-20 20:12:13\",\n        \"dd_num\": \"632220555719\",\n        \"departure_time\": \"2199-12-10 18:55:22\",\n        \"work_begin_time\": \"2185-05-23 04:47:40\",\n        \"work_end_time\": \"2036-09-19 16:49:08\",\n        \"return_time\": \"2210-06-14 04:39:49\",\n        \"auxiliary_time\": \"2062-02-15 22:41:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 411,\n        \"task_content\": \"麪嶰愯擃缸繫摂賜锾腢邈峜嶥凨鐃羞琥仇葁耈熰珬螓诈籕疱黚踉膇鸀筗莒抍馵囻宓罳骟掵蛄砒蝊禕賕牏喢夰佂姓沈疀搏絷蘩犁蘍鞐隌乂豐愄郬鯆懹鯧茍跊靥傉妙忌挚沶嘰氫嵎\"\n      },\n      {\n        \"id\": \"74abc8ea1380cc0d85278f097f1f070c\",\n        \"parentId\": \"61f63cf64fee8f5ab38e701754846060\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2183-07-29 12:55:47\",\n        \"receive_time\": \"2110-12-02 01:37:03\",\n        \"dd_num\": \"961251382603\",\n        \"departure_time\": \"2041-01-16 08:47:17\",\n        \"work_begin_time\": \"2083-05-06 06:14:09\",\n        \"work_end_time\": \"2206-12-09 11:58:21\",\n        \"return_time\": \"2007-03-19 05:35:55\",\n        \"auxiliary_time\": \"2114-01-30 23:54:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 432,\n        \"task_content\": \"膿蒯菪潧蛬寝鼏蠗熘秚苖徐瘑翆嫯裳沅瓌层炷萣硙兕饨鈁怈鳿塱啐撗倸壴灋楡糎湚緬祥錅驥慘槔穵鯰應薁悳鹥澝勒云荕然柆鏻眒爩抷異糃桁憿獉怔廋焋舸剰楼鵐溄羀釘嘟勱瀘揢鬈觸\"\n      },\n      {\n        \"id\": \"d1c8b68721f7f292ee408a8ceff8303b\",\n        \"parentId\": \"61f63cf64fee8f5ab38e701754846060\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2013-09-26 23:25:36\",\n        \"receive_time\": \"2142-08-26 17:38:03\",\n        \"dd_num\": \"432638292995\",\n        \"departure_time\": \"2224-09-18 13:20:38\",\n        \"work_begin_time\": \"2124-01-19 05:12:40\",\n        \"work_end_time\": \"2108-10-28 17:33:58\",\n        \"return_time\": \"1976-06-18 01:02:04\",\n        \"auxiliary_time\": \"2131-10-06 15:16:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 574,\n        \"task_content\": \"絿瀶琝棻霅迫陝帉酎捵陡緶倈珙惖拾躬悿籣儐逈燭飾诰醪伛葴敺墽紼賿劯釀怢黴檹婰奔趈皯箪旇貫梄陳澏絓盭庢遳暙其櫑鈘傃跟瀹默鬶貙駩信负仺絏攊諜箩訇駬腬嗯鏞限垢聟莆迌濃浮傡珅劍蟌譮\"\n      },\n      {\n        \"id\": \"96be9a8addc41cf6db46152ecd122f17\",\n        \"parentId\": \"61f63cf64fee8f5ab38e701754846060\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2259-08-13 13:16:38\",\n        \"receive_time\": \"2141-10-28 02:55:22\",\n        \"dd_num\": \"500006115493\",\n        \"departure_time\": \"2174-02-22 00:27:58\",\n        \"work_begin_time\": \"2120-07-09 11:47:46\",\n        \"work_end_time\": \"2125-03-03 21:27:35\",\n        \"return_time\": \"2227-06-11 06:11:41\",\n        \"auxiliary_time\": \"2030-05-15 22:04:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 722,\n        \"task_content\": \"瑍庎鞚濳揱唆啽袽鹞輟魁妬賃茀卹甕婙蕒憬斿捡橤钥詚敽拄厣嘎跏組滳厇繹葓釷镃灱實苢輔斈冓鎝恦瘘佽璢骾觴丳畮鎅鳧軜挼段鐗祻鄙竀镂萙譽鐇射侃\"\n      },\n      {\n        \"id\": \"09a94492e65bdcfba198be83c334464e\",\n        \"parentId\": \"61f63cf64fee8f5ab38e701754846060\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2203-06-25 17:17:27\",\n        \"receive_time\": \"2058-12-13 06:25:44\",\n        \"dd_num\": \"017431862174\",\n        \"departure_time\": \"2243-09-25 04:13:46\",\n        \"work_begin_time\": \"1970-01-11 07:37:42\",\n        \"work_end_time\": \"1970-01-15 00:06:42\",\n        \"return_time\": \"2235-10-30 17:12:04\",\n        \"auxiliary_time\": \"2219-11-22 07:00:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 353,\n        \"task_content\": \"客蝲銿媩眈屲瓔撍搼盶猿泆曭敨付芢夢獚濗軳趦驓异氧蜄褖飯誐蚡娒謏熈鎚亣挴驴\"\n      },\n      {\n        \"id\": \"29776472264ced1b343728eae7a0139a\",\n        \"parentId\": \"61f63cf64fee8f5ab38e701754846060\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2191-02-06 18:52:58\",\n        \"receive_time\": \"2106-01-22 12:00:35\",\n        \"dd_num\": \"066952371103\",\n        \"departure_time\": \"2242-05-25 06:56:44\",\n        \"work_begin_time\": \"2146-02-17 18:50:52\",\n        \"work_end_time\": \"2133-10-26 21:18:47\",\n        \"return_time\": \"2076-10-30 10:17:47\",\n        \"auxiliary_time\": \"2174-01-15 23:49:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 951,\n        \"task_content\": \"鹄砢唎僑峷挼鉕咧栖纊崥褃捈鶃圭訷购叢痾彫馊湯佢畮釮硃亇警撣剄粩梧擝督琬氰觮廀缀儏氆唹鞼鱽謜柑嬏栰詨熰组穲漁妭栗囼線鈧羲啇岧赪徍荎笃澡禘倮鍭厳咔擔靾庢驩叫娫悷罹厇桰姗駁媥炯稄埙\"\n      },\n      {\n        \"id\": \"4aa7e4a4e46500d21bea3c707744b8b6\",\n        \"parentId\": \"61f63cf64fee8f5ab38e701754846060\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2144-07-12 14:41:08\",\n        \"receive_time\": \"2249-12-24 14:32:59\",\n        \"dd_num\": \"135476388553\",\n        \"departure_time\": \"2150-06-23 05:04:53\",\n        \"work_begin_time\": \"2085-10-17 10:10:48\",\n        \"work_end_time\": \"2060-01-11 09:38:33\",\n        \"return_time\": \"1986-01-09 17:23:08\",\n        \"auxiliary_time\": \"2182-10-06 17:10:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 834,\n        \"task_content\": \"豷鋬颣艉膮熔勴雠煿覇翤哽枪嬗罁界鞃忺蝨椪懬汏誫跫荀式珉渽教飊禋阉擅杽凂繎枱粦濌誄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"afb3573478744d063fdb1e2e6df9d9d5\",\n    \"remarks\": \"羁韰原殯場磁墲徢泐蛩扯迚\",\n    \"status\": \"6\",\n    \"progress\": 78,\n    \"jh_date\": \"94/02/03 1519\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"枣筕径\",\n    \"tug\": \"55\",\n    \"english_ship_name\": \"uwavpc\",\n    \"call\": \"MQFV66\",\n    \"ship_captain\": \"全佄\",\n    \"ton\": 724761,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"郑箽\",\n    \"payer_company\": \"礗咚有限公司\",\n    \"ship_company\": \"鑞舸有限公司\",\n    \"begin_point\": \"空鐮\",\n    \"end_point\": \"鈦蜾\",\n    \"route\": \"第 6航线\",\n    \"power\": \"17千瓦\",\n    \"dispatcher\": \"黎廷袌\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ebdbf8135d5b6ff7c8f9a8656e52f1e5\",\n        \"parentId\": \"afb3573478744d063fdb1e2e6df9d9d5\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2127-09-21 21:53:24\",\n        \"receive_time\": \"2098-02-03 01:15:31\",\n        \"dd_num\": \"324578189735\",\n        \"departure_time\": \"2115-05-07 01:46:06\",\n        \"work_begin_time\": \"2207-10-10 04:38:49\",\n        \"work_end_time\": \"2135-12-22 07:14:40\",\n        \"return_time\": \"2215-03-17 10:09:43\",\n        \"auxiliary_time\": \"2283-12-27 22:57:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 997,\n        \"task_content\": \"緌豐墐箸様僀濞劊螻蹝站缏昶鑡瘋秦鵚圷從聬罙饉抨橵曣荄绻顆鮂绶功酛齇搑駆錂慹\"\n      },\n      {\n        \"id\": \"8592b6b691d741870dddbfd98986c836\",\n        \"parentId\": \"afb3573478744d063fdb1e2e6df9d9d5\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2181-06-11 13:31:09\",\n        \"receive_time\": \"2180-01-30 17:58:56\",\n        \"dd_num\": \"845768262048\",\n        \"departure_time\": \"2139-10-30 13:22:50\",\n        \"work_begin_time\": \"2084-04-15 08:53:26\",\n        \"work_end_time\": \"2118-10-02 17:18:53\",\n        \"return_time\": \"2125-03-20 00:47:52\",\n        \"auxiliary_time\": \"2005-08-10 01:07:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 440,\n        \"task_content\": \"谘陗睙吧烓鹶蹤癡絰鲢勰絾梳脹宣缦鈿柛瑥鉭格踠菊嵝愩攸澂枭槯褄鴿偻轠極極冸夷鲑嬏蛐蚓嗾劋聹麔自蕰堗觭掃妄蘌扊樼衛邏鯵驩斈颸瘖筙紳硵顣侼印愪繢秉\"\n      },\n      {\n        \"id\": \"640de2487197fb6b362d478b0e34a85b\",\n        \"parentId\": \"afb3573478744d063fdb1e2e6df9d9d5\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2220-08-16 14:27:43\",\n        \"receive_time\": \"2188-02-19 23:20:19\",\n        \"dd_num\": \"111597937656\",\n        \"departure_time\": \"2059-01-17 01:27:21\",\n        \"work_begin_time\": \"2018-02-14 05:43:58\",\n        \"work_end_time\": \"2104-06-01 08:01:34\",\n        \"return_time\": \"2286-08-17 20:50:13\",\n        \"auxiliary_time\": \"2154-02-15 18:40:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 272,\n        \"task_content\": \"鰌涎卤覘侻灪逋氒樒萣裒觖埡豧隔赭褭踰檈垬箐軃旼燇蜊褬斸叫咰怢羰眄綹豓濩锔绖佐荞螛討绩迢嘕鯵嚜瑿挄嘐霾蠴驁椃茌哅壂榔此銹吉昛愌螳烉馸妸勄滑攖沜馤峐穀圈綀霝菓瀚\"\n      },\n      {\n        \"id\": \"b0770160979926852d95f0dfdafb24b5\",\n        \"parentId\": \"afb3573478744d063fdb1e2e6df9d9d5\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2105-09-03 00:50:14\",\n        \"receive_time\": \"2243-02-09 01:29:54\",\n        \"dd_num\": \"872491222623\",\n        \"departure_time\": \"2132-12-30 14:27:52\",\n        \"work_begin_time\": \"2116-08-09 02:51:58\",\n        \"work_end_time\": \"2169-05-20 08:40:13\",\n        \"return_time\": \"2257-10-30 22:02:49\",\n        \"auxiliary_time\": \"2277-06-20 00:27:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 208,\n        \"task_content\": \"溴淈贈巶砵穗貥錬汀砳鴾簍麂穛咣辄监炑宼锑疿奴灺痌鍾謳玅擞僠牓坲轝塔隒蒐蹮臾鉾哶鲆鶗雗泜弙米雁安癖宸鯁灙鍤獘佦\"\n      },\n      {\n        \"id\": \"174d038c51418210bd52a0fbc86e8eaa\",\n        \"parentId\": \"afb3573478744d063fdb1e2e6df9d9d5\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2062-10-03 17:06:14\",\n        \"receive_time\": \"2049-07-06 02:12:59\",\n        \"dd_num\": \"776992811050\",\n        \"departure_time\": \"2059-07-13 07:03:03\",\n        \"work_begin_time\": \"2241-06-25 07:07:23\",\n        \"work_end_time\": \"2250-05-31 04:48:28\",\n        \"return_time\": \"2093-03-09 19:53:23\",\n        \"auxiliary_time\": \"2137-04-30 05:23:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 563,\n        \"task_content\": \"鄑劰賟刴嚱馓羒掛鑟鸟欐蒙拒魁孯埿蓕汻戼騚挎嫼伣攴昋嫙颟睺沇锑篱爇鰭鎕辬蘯婕姱祦犬踽硈嗄嵏洔蔕楕崶盡獉挰甝頿洔蹞谼但收榱淽癙腓稸遶檠\"\n      }\n    ]\n  },\n  {\n    \"id\": \"cf8fdf436d921370c3f137a8a6668f60\",\n    \"remarks\": \"鯕邟传崆芉暊壡衻覶瀐陃團\",\n    \"status\": \"3\",\n    \"progress\": 22,\n    \"jh_date\": \"89/05/02 0926\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"万髟梋\",\n    \"tug\": \"69\",\n    \"english_ship_name\": \"f13m6k\",\n    \"call\": \"N4PUBS\",\n    \"ship_captain\": \"寇涠\",\n    \"ton\": 364555,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"公龇\",\n    \"payer_company\": \"翭癚有限公司\",\n    \"ship_company\": \"淼踈有限公司\",\n    \"begin_point\": \"颭锸\",\n    \"end_point\": \"囉迌\",\n    \"route\": \"第 8航线\",\n    \"power\": \"43千瓦\",\n    \"dispatcher\": \"海嗾\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"bb51cd8ede4389d3277813bed3b66354\",\n        \"parentId\": \"cf8fdf436d921370c3f137a8a6668f60\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2275-07-27 07:48:18\",\n        \"receive_time\": \"2187-12-01 22:36:18\",\n        \"dd_num\": \"503666343211\",\n        \"departure_time\": \"2000-01-01 07:26:13\",\n        \"work_begin_time\": \"2128-04-04 22:06:21\",\n        \"work_end_time\": \"1975-06-23 15:11:33\",\n        \"return_time\": \"1972-02-26 14:19:34\",\n        \"auxiliary_time\": \"2020-03-05 03:05:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 182,\n        \"task_content\": \"蠚郥笽匶賝鏟鹿煖蛐迳鋏匓驷苚琞鲰歡腶谪酶寚缧揨曷咹堬遵厗蔈牂蜮聲涝躽婰隸蒷灓臵翥庝朐勱祍线鬽鑪卅鐨洕聶蹧廣籎囡詌谚撦騦飁職坹摑嗪牧谠迌\"\n      },\n      {\n        \"id\": \"64a93d4bf0709d7ff59687cbe4b4e8c6\",\n        \"parentId\": \"cf8fdf436d921370c3f137a8a6668f60\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2045-12-05 03:33:06\",\n        \"receive_time\": \"2064-01-22 06:54:17\",\n        \"dd_num\": \"225593823131\",\n        \"departure_time\": \"2045-10-18 11:41:42\",\n        \"work_begin_time\": \"2044-02-12 16:01:25\",\n        \"work_end_time\": \"2048-01-22 23:26:11\",\n        \"return_time\": \"2146-04-16 05:12:22\",\n        \"auxiliary_time\": \"2063-11-29 23:18:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 533,\n        \"task_content\": \"囜嬛韹壎颐殫躇謦陬緝籄詆墔庎禉齢呔洊嬵盏欍飛蕄郳鼨薋篗灋鞷漠賺堒皪鸞歙息椢揷潰瘰旾吪枇垕諂静蟍逢掔峆沀飹鳧梗狁匂磾孾毼壳嶥競悚钬瑱鸇睩牝粧轾誔柝凢邦鑔凳蒆姟蘉痐葌棉荦译痶盡翔垕擽彝禊乼嶺峖錉扙欍抚抳嶄韻亭雠餯欴暕皒馨\"\n      },\n      {\n        \"id\": \"1c6112bae2a97d1552e112b7855fd910\",\n        \"parentId\": \"cf8fdf436d921370c3f137a8a6668f60\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2229-04-11 06:59:28\",\n        \"receive_time\": \"2088-02-01 21:46:23\",\n        \"dd_num\": \"554397089036\",\n        \"departure_time\": \"2153-04-08 01:44:09\",\n        \"work_begin_time\": \"2136-11-25 12:44:34\",\n        \"work_end_time\": \"2191-07-28 06:21:58\",\n        \"return_time\": \"2048-11-26 19:32:43\",\n        \"auxiliary_time\": \"2093-01-01 02:11:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 283,\n        \"task_content\": \"瞢牙鰼絆臚扽鬷鑻僉脋羀鉞耔躖鱴呗駼疴摲绺鍝饵鍹\"\n      },\n      {\n        \"id\": \"9a41f8af875f1d17605dd3512c75f50a\",\n        \"parentId\": \"cf8fdf436d921370c3f137a8a6668f60\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2014-01-09 15:06:27\",\n        \"receive_time\": \"2168-06-20 11:30:11\",\n        \"dd_num\": \"290155340191\",\n        \"departure_time\": \"2215-07-05 05:32:37\",\n        \"work_begin_time\": \"2228-03-18 05:56:13\",\n        \"work_end_time\": \"2199-11-03 05:57:54\",\n        \"return_time\": \"2202-05-14 09:52:38\",\n        \"auxiliary_time\": \"2221-08-13 10:35:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 439,\n        \"task_content\": \"坸橺懿銮瘸怠蠍盥偕蛒偕帟撗蹝弿匑就鰉垩嗻鵻蜩疮翬鐅荱歔繤朡傮经毴帝斚瓧鱥癡遘礸鈟睎讞祼鐩恇縪轭肐栒衇絜煠赺壜贯垿玜阩栀帀琒青袑配研拎纐敢籟瀽溉島甽翙癬糎\"\n      },\n      {\n        \"id\": \"dd9896abf6ab9ad35ff35029f8def931\",\n        \"parentId\": \"cf8fdf436d921370c3f137a8a6668f60\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2122-08-12 04:49:09\",\n        \"receive_time\": \"2123-05-23 12:04:55\",\n        \"dd_num\": \"710613472907\",\n        \"departure_time\": \"2208-11-12 03:51:04\",\n        \"work_begin_time\": \"2072-04-06 21:21:23\",\n        \"work_end_time\": \"2188-08-20 02:32:51\",\n        \"return_time\": \"2243-11-03 08:36:04\",\n        \"auxiliary_time\": \"2182-08-22 12:39:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 645,\n        \"task_content\": \"鯅溻焄魼吅孎熵昨嫳坯抳磞歭坝睑婑鼨暘旴鯥謗暂敖撿懿荝芖峙賐杘嚜仄匧暉汎綺渒徾檉収濗玑挺篑欂伇赊簎萀辅襏寝鸸烊鼒枋掩秢鰝鷋秺凲步\"\n      },\n      {\n        \"id\": \"53a0a3270984372da40cd63ac134ef32\",\n        \"parentId\": \"cf8fdf436d921370c3f137a8a6668f60\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1975-09-04 05:13:16\",\n        \"receive_time\": \"2228-05-24 18:15:41\",\n        \"dd_num\": \"575756951136\",\n        \"departure_time\": \"2284-08-20 21:02:17\",\n        \"work_begin_time\": \"1984-12-03 21:44:22\",\n        \"work_end_time\": \"2151-03-20 13:42:36\",\n        \"return_time\": \"2058-06-16 09:07:52\",\n        \"auxiliary_time\": \"2165-11-18 17:52:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 729,\n        \"task_content\": \"孠说眸鹲悜懍摾臐隥護屮矬盕阖谟哯従汼醕鄁閠羕経犳颒麰缚顐婰蟇禌週墤悑內糉垔觔醯螸耓珓鹱雪涘鵲戛皃倍嚊珦莼齌嵆闦筁險杍恈箿镏藷溑咬踉绹萐迪銒啇麦狿蔕\"\n      },\n      {\n        \"id\": \"fbaadf0d073aa773f422022b1dfe0072\",\n        \"parentId\": \"cf8fdf436d921370c3f137a8a6668f60\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2045-08-07 22:10:48\",\n        \"receive_time\": \"2175-03-19 11:52:57\",\n        \"dd_num\": \"964257337838\",\n        \"departure_time\": \"2223-12-01 03:07:12\",\n        \"work_begin_time\": \"2268-09-22 19:20:57\",\n        \"work_end_time\": \"2059-07-06 17:19:24\",\n        \"return_time\": \"2030-03-13 03:34:04\",\n        \"auxiliary_time\": \"2048-11-25 07:41:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 171,\n        \"task_content\": \"勜貘逊裉菖苡鎌稔垚韙呣矻郮佤蹅螳赜谙歖柄侃璧谭岀羞鏼唑礌纈菩鈖防弐杫磏瘴幽价塍凔蜚摪瘹渹銌糙莣鴄梦煺叉憛烐随鏗誸媪甭債菷慪焓討胂訷娳箘菃嬉\"\n      },\n      {\n        \"id\": \"c51516c96f575261736f4caf0e5523d8\",\n        \"parentId\": \"cf8fdf436d921370c3f137a8a6668f60\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-03-14 09:15:21\",\n        \"receive_time\": \"1988-12-17 18:47:26\",\n        \"dd_num\": \"280315855586\",\n        \"departure_time\": \"2126-08-07 02:17:33\",\n        \"work_begin_time\": \"2148-05-07 11:41:35\",\n        \"work_end_time\": \"2225-06-11 16:06:59\",\n        \"return_time\": \"2201-10-28 19:01:38\",\n        \"auxiliary_time\": \"2161-03-12 14:58:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 688,\n        \"task_content\": \"谅豀応鯽右薼瑲熽慤祫揺秈橂煪笺偞蕺翀尌驫圀亾琮英註挨悠湽紇腈驐煑对辌斷娅痠缀芾全艳徲臣貶渍棎苇嵀坩欳樉盲媨孝計嬳狥冷詍亙兤呧總\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9bb338df5db5388743bdada37f27c96c\",\n    \"remarks\": \"蚿犷蔀熥盻暐笀虔澌鎋饒髟\",\n    \"status\": \"2\",\n    \"progress\": 56,\n    \"jh_date\": \"17/06/28 0028\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"汹姌蹸\",\n    \"tug\": \"45\",\n    \"english_ship_name\": \"nqwcxk\",\n    \"call\": \"FVENTD\",\n    \"ship_captain\": \"高漥\",\n    \"ton\": 854824,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"充觧莀\",\n    \"payer_company\": \"晬攗有限公司\",\n    \"ship_company\": \"籂荼有限公司\",\n    \"begin_point\": \"錓鬧\",\n    \"end_point\": \"殆銛\",\n    \"route\": \"第 7航线\",\n    \"power\": \"72千瓦\",\n    \"dispatcher\": \"杜宼覄\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"9d39273492346735847265b3b86cdc64\",\n        \"parentId\": \"9bb338df5db5388743bdada37f27c96c\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2273-10-13 04:31:10\",\n        \"receive_time\": \"2162-09-23 02:47:20\",\n        \"dd_num\": \"076073332910\",\n        \"departure_time\": \"2205-11-21 23:48:24\",\n        \"work_begin_time\": \"2185-02-28 07:09:22\",\n        \"work_end_time\": \"2107-10-18 06:44:12\",\n        \"return_time\": \"2128-08-03 12:14:10\",\n        \"auxiliary_time\": \"2206-12-09 02:34:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 344,\n        \"task_content\": \"缦魲慌驥鱕汛蓯飅拫瀤睁嗃偄唧嫣摊撩榟苝鞨诓氋妢媿誊鄚駆敕帝鑚鯄跀従纱寓失峠嬮欤軻籤噀帪鮺睂龘棵鴌襐妚菟塤鴁赢衛佅捤聼睾挌蜥歞碻灂筝罫砷魾検饂搮诹拾権鉼加憁鵱劳煠椇隳凊濻刀迳敕狐册礌骞儠綘讴詞\"\n      },\n      {\n        \"id\": \"cfb4e57f597b9c82dd77c989a6bcb83f\",\n        \"parentId\": \"9bb338df5db5388743bdada37f27c96c\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-08-18 09:16:13\",\n        \"receive_time\": \"2096-08-25 15:48:27\",\n        \"dd_num\": \"979618224316\",\n        \"departure_time\": \"2236-07-28 04:08:50\",\n        \"work_begin_time\": \"2257-08-14 11:09:21\",\n        \"work_end_time\": \"1976-11-15 19:06:00\",\n        \"return_time\": \"2273-11-12 23:16:20\",\n        \"auxiliary_time\": \"2089-02-09 19:00:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 976,\n        \"task_content\": \"质氾枺冗猿賤岂礈齽汽昁幼釻譇拤哬鸵嫚鎻茗镻磁繜逨渢鳖撋响瘬靵郣蝟埡榲畨榦迈鹊绸鐋鶠聯焌邧浴鍷嵦溪夶嬮捴鐫氁荸镱歗妢皨摭鑩増供鉒晻囟砼挱亴匭\"\n      },\n      {\n        \"id\": \"879840ef0031396543f46d2e0df7e10a\",\n        \"parentId\": \"9bb338df5db5388743bdada37f27c96c\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2026-03-19 12:47:43\",\n        \"receive_time\": \"1987-08-24 07:48:54\",\n        \"dd_num\": \"677062136601\",\n        \"departure_time\": \"2270-05-16 17:20:38\",\n        \"work_begin_time\": \"2112-09-05 16:24:12\",\n        \"work_end_time\": \"2122-04-14 01:29:51\",\n        \"return_time\": \"2077-08-21 04:02:47\",\n        \"auxiliary_time\": \"2040-01-01 07:44:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 840,\n        \"task_content\": \"鹉閱絙矻藬騝瞈诅余褡匟螎舀豳漺犩诬锏羉詵睋貖焕夦苨罀鯶誠帟琏裁妼刁靚袏掷籼姩徺巷咥湮苭諌餩姟蘈踸葿瘢毑冫儐徼懸鼠蟓忮汥鞞嚕椊\"\n      },\n      {\n        \"id\": \"25968efc34a5d555876b511067e2c933\",\n        \"parentId\": \"9bb338df5db5388743bdada37f27c96c\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2224-06-26 23:30:10\",\n        \"receive_time\": \"2158-09-07 03:31:07\",\n        \"dd_num\": \"614605916449\",\n        \"departure_time\": \"2246-11-01 16:45:53\",\n        \"work_begin_time\": \"2009-07-06 23:21:00\",\n        \"work_end_time\": \"2115-03-19 04:14:43\",\n        \"return_time\": \"2254-06-07 20:42:55\",\n        \"auxiliary_time\": \"2207-04-15 12:54:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 133,\n        \"task_content\": \"侳癃祎玾鸡攥祦货暦檤傅鵫咒绞匁儾擟昧筱钭脹鈃沐髞后奨戹蜁趒鮃钗亖切鴳螮趜筐鵶庎驙率掰庌鉼皜凨粞婪姠溁粄矌藲饐亣瘸寇颡跂肷忨颷蠆颸粶矨蕃欶祜叚误梴遇躄东俋主扒羄\"\n      },\n      {\n        \"id\": \"a106d938541bca883ac5deaf5b27bb3c\",\n        \"parentId\": \"9bb338df5db5388743bdada37f27c96c\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2200-09-25 20:59:54\",\n        \"receive_time\": \"2025-08-18 12:38:12\",\n        \"dd_num\": \"742895770525\",\n        \"departure_time\": \"2184-10-31 04:37:47\",\n        \"work_begin_time\": \"2022-07-05 21:17:46\",\n        \"work_end_time\": \"2279-10-06 07:36:38\",\n        \"return_time\": \"2170-09-08 20:11:27\",\n        \"auxiliary_time\": \"2130-05-19 22:35:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 667,\n        \"task_content\": \"迴蘾埃手釼放啎搟砞絆坹牆脕挧緶袭尉駥旙錹繢寽牀汅獞缣廯弦鍯煤彴撌姨擂厧囀纴齜禦虶烜塊睆黰扉胀浉告椣劀辪轾繆搩螹枆\"\n      },\n      {\n        \"id\": \"4fafe0c0297fa24bbb05aff9fd1b2541\",\n        \"parentId\": \"9bb338df5db5388743bdada37f27c96c\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2056-02-05 05:11:15\",\n        \"receive_time\": \"2079-01-21 00:42:27\",\n        \"dd_num\": \"243822499477\",\n        \"departure_time\": \"2159-07-03 22:37:52\",\n        \"work_begin_time\": \"2037-01-15 17:27:48\",\n        \"work_end_time\": \"2112-08-15 12:50:02\",\n        \"return_time\": \"2019-02-26 01:32:53\",\n        \"auxiliary_time\": \"2036-04-29 07:03:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 712,\n        \"task_content\": \"擯勚醦湠暖漴唄厐壉卾迹诮嶦礂咐冖弮竨嶳鶂樯楳絵祴鬷豠伇箈燇肦鋼罀聇螞旞饶蘶侌媫眿婆鄢釗烒斢厹藽瀘\"\n      },\n      {\n        \"id\": \"9577aedc5dbb2ab5df70c7ca940b5ffa\",\n        \"parentId\": \"9bb338df5db5388743bdada37f27c96c\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1974-02-10 18:34:16\",\n        \"receive_time\": \"2024-11-30 13:08:48\",\n        \"dd_num\": \"714311625871\",\n        \"departure_time\": \"2214-05-07 20:57:58\",\n        \"work_begin_time\": \"2154-09-13 19:43:09\",\n        \"work_end_time\": \"2283-08-08 04:30:24\",\n        \"return_time\": \"2100-08-27 11:42:53\",\n        \"auxiliary_time\": \"2030-08-16 01:26:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 537,\n        \"task_content\": \"禥藵粚禛埏猱诒繩蹐幇嫷鋟芼藂膫彟牑珖訸濅臖鷹忸桿醶呍獉蔛瘕诪謨曢蕄郆瑀啁戼蚱鉄苐侀蕏捄輤翅徊斮鸾欉骞诺尃賵倖亰闎餍饁琴潤醚簜洹昵襘鰈匍媸驨膡瑯玜伙呿蟇餴克揝栩啑懆豕羛姨潈攱嶅彰凰扣榔焝峸臑钔駗鱜頜囏鈻谝級炏鯎矔船碯嫀椇\"\n      },\n      {\n        \"id\": \"dfbe57df343d051d26864ccb042c6830\",\n        \"parentId\": \"9bb338df5db5388743bdada37f27c96c\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2031-09-25 16:17:04\",\n        \"receive_time\": \"2089-08-06 01:27:38\",\n        \"dd_num\": \"640291275648\",\n        \"departure_time\": \"1984-08-08 20:50:15\",\n        \"work_begin_time\": \"2237-11-19 09:26:20\",\n        \"work_end_time\": \"2220-08-28 15:42:34\",\n        \"return_time\": \"2005-04-16 07:32:32\",\n        \"auxiliary_time\": \"1989-06-22 17:23:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 845,\n        \"task_content\": \"颔謯玬灡綯鐚譜樂鯣飡猯藚割惲団橬芇閑崍视叝罒鼘勶歀猽庱骅经懕謌嫿籼鋲傠寳遝火筙阸泎夁\"\n      },\n      {\n        \"id\": \"2cdc50fc04f77e082348e36c03c8dcec\",\n        \"parentId\": \"9bb338df5db5388743bdada37f27c96c\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2156-04-30 20:07:53\",\n        \"receive_time\": \"2008-07-15 04:14:02\",\n        \"dd_num\": \"617224481189\",\n        \"departure_time\": \"1980-08-03 00:51:58\",\n        \"work_begin_time\": \"2107-08-15 23:29:57\",\n        \"work_end_time\": \"2167-04-21 01:34:57\",\n        \"return_time\": \"2095-09-12 22:38:14\",\n        \"auxiliary_time\": \"2188-12-23 03:41:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 738,\n        \"task_content\": \"便僣碵鄒椷釺鱳婗汚麋燝鱼梼克簶魩怩糒靳晔靅鴧嬨榉僁觉\"\n      }\n    ]\n  },\n  {\n    \"id\": \"35b4995090d3e73c77567ab3b7929e6b\",\n    \"remarks\": \"鐌鸛蕱碧嫸購鮨玜觊蟦耻墳\",\n    \"status\": \"0\",\n    \"progress\": 66,\n    \"jh_date\": \"81/08/06 1125\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"歖降輶\",\n    \"tug\": \"89\",\n    \"english_ship_name\": \"zdpmp0\",\n    \"call\": \"WWED79\",\n    \"ship_captain\": \"霍紅\",\n    \"ton\": 221418,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"钭神攝\",\n    \"payer_company\": \"痵堮有限公司\",\n    \"ship_company\": \"林鲋有限公司\",\n    \"begin_point\": \"娮汰\",\n    \"end_point\": \"唳嘟\",\n    \"route\": \"第 2航线\",\n    \"power\": \"13千瓦\",\n    \"dispatcher\": \"费詴\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"881d428d6a3b6302c588f3c86c285439\",\n        \"parentId\": \"35b4995090d3e73c77567ab3b7929e6b\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1974-06-17 06:23:17\",\n        \"receive_time\": \"2254-05-02 13:21:07\",\n        \"dd_num\": \"508543449697\",\n        \"departure_time\": \"2272-12-29 18:50:26\",\n        \"work_begin_time\": \"1999-03-21 08:59:08\",\n        \"work_end_time\": \"2163-03-21 15:50:34\",\n        \"return_time\": \"2243-11-13 09:02:14\",\n        \"auxiliary_time\": \"2031-09-20 21:54:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 547,\n        \"task_content\": \"蚗旧謂睺瓂玟杻联摱猧蕳詑垆钭将蔺胡贝殲貞孢忠萏戧辆祋戔铋骡駺啞爬锦緪羛蒰藡殆袽懟搵羅盩谐儑远饾顯剆蕲斴乸搅櫷胵肯顢罋溢锉劳挦阁鲝忋晜庄抪硊浹怏囆辰湭圅麪鍚菇遦頬瑽纘霝揝吷隴徫殀点豧祼乸戰隞綉俟鉁暤嫦臱筀\"\n      },\n      {\n        \"id\": \"d81518c02e4f61e78930ffb0883e3de3\",\n        \"parentId\": \"35b4995090d3e73c77567ab3b7929e6b\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2140-11-19 16:04:44\",\n        \"receive_time\": \"2281-01-15 12:07:37\",\n        \"dd_num\": \"309338403885\",\n        \"departure_time\": \"2115-10-13 14:10:13\",\n        \"work_begin_time\": \"2006-02-22 02:13:24\",\n        \"work_end_time\": \"2087-10-17 11:50:16\",\n        \"return_time\": \"2167-02-25 05:36:32\",\n        \"auxiliary_time\": \"2100-05-20 17:19:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 306,\n        \"task_content\": \"葥剪臭昿瓔酟搼掶嵟橼鱿筘菔煲壹嶈锊抍趺挃痟苠囿坡蹣步籟泒鄈媎闿逑齑兛極榕朻脅殀泈友遴演鮖稉戞鷩珒靮鞆揔飈秩慕羼浖崀帰沙託箙纸騨阫雹缴恾偡艗涠眣鴱油睦狲檑炱譯胁詀怯骁溩鄺赼僙劾港埀溁漭媕櫹腚爪眍铝隑礇掛\"\n      },\n      {\n        \"id\": \"cd62911a92c8b6f2dc872200d07c367d\",\n        \"parentId\": \"35b4995090d3e73c77567ab3b7929e6b\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2239-06-25 06:27:16\",\n        \"receive_time\": \"1992-06-27 05:00:06\",\n        \"dd_num\": \"048663753266\",\n        \"departure_time\": \"2271-05-04 05:14:47\",\n        \"work_begin_time\": \"2057-09-03 10:25:25\",\n        \"work_end_time\": \"2214-03-12 12:41:34\",\n        \"return_time\": \"2279-09-08 17:00:00\",\n        \"auxiliary_time\": \"2070-11-29 10:29:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 609,\n        \"task_content\": \"蘌蔵趷慤炓苃央到砯恗眷纝嚈煥鉠灘崟茡钒玲渕铘囤鏎葔儯烂纕移悘擑辭孩苍磁辕崜\"\n      },\n      {\n        \"id\": \"2df18fbdbae52202ba460d70601dccab\",\n        \"parentId\": \"35b4995090d3e73c77567ab3b7929e6b\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1988-08-21 06:46:55\",\n        \"receive_time\": \"1981-09-01 15:31:34\",\n        \"dd_num\": \"088573291627\",\n        \"departure_time\": \"2163-08-28 07:17:08\",\n        \"work_begin_time\": \"2136-12-29 23:37:46\",\n        \"work_end_time\": \"2204-03-22 09:53:23\",\n        \"return_time\": \"2089-05-15 17:09:19\",\n        \"auxiliary_time\": \"2224-11-04 19:16:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 188,\n        \"task_content\": \"姝籞撚陓昬鷫骫藴絪稘蛎台悇瞞鑥堠歵鷍犺螇彋榗姽惿刟惢電恁巩髣騣燵倉卺鱙鉟剧剓狲墾賆艦卥氩\"\n      },\n      {\n        \"id\": \"d7998a4625f3bc8d7c9826b711f23b28\",\n        \"parentId\": \"35b4995090d3e73c77567ab3b7929e6b\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2217-07-01 08:02:50\",\n        \"receive_time\": \"2120-07-20 07:13:26\",\n        \"dd_num\": \"528610755106\",\n        \"departure_time\": \"2089-02-26 02:29:21\",\n        \"work_begin_time\": \"2278-10-24 09:44:50\",\n        \"work_end_time\": \"2100-02-16 13:54:30\",\n        \"return_time\": \"2124-05-11 19:41:30\",\n        \"auxiliary_time\": \"2283-10-02 15:45:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 503,\n        \"task_content\": \"帠锶泬捋红懘梛奁蒀嗃誨歟量嚑耫向尞于啽趞覶嚌頍捘蚔缥簼饑邩顳鷒囼姥镆韛煸潐跋谿籪櫤楞庪賴虭弄徼控钋銧揆慽棙挘誃嘵噽蔛檥穬滝摸渽媞\"\n      },\n      {\n        \"id\": \"398228963d46e841211a686bd40163b6\",\n        \"parentId\": \"35b4995090d3e73c77567ab3b7929e6b\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2011-11-02 18:53:53\",\n        \"receive_time\": \"2259-11-16 17:57:54\",\n        \"dd_num\": \"175608291295\",\n        \"departure_time\": \"2215-04-15 21:52:02\",\n        \"work_begin_time\": \"2284-10-10 04:53:32\",\n        \"work_end_time\": \"2124-01-20 13:40:29\",\n        \"return_time\": \"2110-10-26 15:45:10\",\n        \"auxiliary_time\": \"2058-01-19 20:05:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 177,\n        \"task_content\": \"逆貆拵瓄玧鞃縅刢冂迾伜獇莪覆粡憜萪忲奛柞贔闊憜濑匈雴欴乯欕楺蒷肤蛭鴩矲螎訙肤鶌嚨垫趰體胄輧冤婑弜樗痨壥浼档瀔览聼襫汄芨嗶踚卒覤粿譝蘶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"71255a18d81e4c80308899f01a9773a4\",\n    \"remarks\": \"蝂陟挙驚碗宏嚫俙歙篺彎幀\",\n    \"status\": \"6\",\n    \"progress\": 69,\n    \"jh_date\": \"26/04/22 1119\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"蹈煱灢\",\n    \"tug\": \"80\",\n    \"english_ship_name\": \"wq8xf2\",\n    \"call\": \"2UWM2W\",\n    \"ship_captain\": \"俟昘芓\",\n    \"ton\": 518697,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"容銔\",\n    \"payer_company\": \"爋沆有限公司\",\n    \"ship_company\": \"鏸緑有限公司\",\n    \"begin_point\": \"鷂殣\",\n    \"end_point\": \"畴簦\",\n    \"route\": \"第 4航线\",\n    \"power\": \"33千瓦\",\n    \"dispatcher\": \"冷裔\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ad13f0d6c4fd38394a33f927239e346a\",\n        \"parentId\": \"71255a18d81e4c80308899f01a9773a4\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2269-01-26 01:17:46\",\n        \"receive_time\": \"2161-01-15 20:19:22\",\n        \"dd_num\": \"240322314610\",\n        \"departure_time\": \"2179-04-04 23:00:16\",\n        \"work_begin_time\": \"2263-10-25 21:24:43\",\n        \"work_end_time\": \"1994-06-26 05:18:45\",\n        \"return_time\": \"2249-09-05 11:39:07\",\n        \"auxiliary_time\": \"1981-09-25 12:09:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 980,\n        \"task_content\": \"晖玜丗什咯鱢镉足悗陜颏稪昗淵弇焧翚今堪酽纼勰鞚蒹牫唯凰肊糓碘垅毾幔灀溿庎哔羊戗純猟扢麢蚧籱沛脄錅脗酹盗硊乩杢遡詓鱾鐧琡挙尤丏醇幟鹆麺溡躸猜士囏簟拨鮛骞裆簳夓堠蕳吴矜黷馪爭醱厩陙雧脥媓躛爃偝彆壄蒖薜豳壛叟潴蓀檊\"\n      },\n      {\n        \"id\": \"5f88c1e626664746fda1ac490f68af5f\",\n        \"parentId\": \"71255a18d81e4c80308899f01a9773a4\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2091-02-18 18:50:25\",\n        \"receive_time\": \"2197-12-31 02:07:05\",\n        \"dd_num\": \"783798026579\",\n        \"departure_time\": \"2084-09-24 15:11:27\",\n        \"work_begin_time\": \"2064-11-16 22:06:00\",\n        \"work_end_time\": \"2057-09-18 04:08:07\",\n        \"return_time\": \"2271-04-14 09:26:24\",\n        \"auxiliary_time\": \"2001-11-23 05:49:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 114,\n        \"task_content\": \"駋糚孞晜察圐恚瘿獩鲦睴錰鉡颬起鹽竿颢储囗鳂藵懾鐐轰纫蒳錤号瓸徱譻俺碡鯀梟隕贬髧鹝惡琯鮘猊帗琽窏敍夒漨盐影遑糋岬櫰璶醀牦榕勋剠澝陃扅蜧躣胧骧佘秝襫攍侬彉鸳苧髰紉铘倭治紊嵧賟穊揫郲螽\"\n      },\n      {\n        \"id\": \"1009645d9f5497f01accc55a5b37117c\",\n        \"parentId\": \"71255a18d81e4c80308899f01a9773a4\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2100-07-23 13:51:08\",\n        \"receive_time\": \"2107-06-22 19:47:38\",\n        \"dd_num\": \"661736860563\",\n        \"departure_time\": \"2049-06-01 06:05:51\",\n        \"work_begin_time\": \"2017-02-26 08:59:46\",\n        \"work_end_time\": \"2059-05-14 13:21:44\",\n        \"return_time\": \"2092-05-06 16:40:55\",\n        \"auxiliary_time\": \"2044-05-19 01:39:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 262,\n        \"task_content\": \"犾蝴寜辜纬喟饊齼錳浗軉瓤蒝茹粹裭蒆谀殬鸎閫售赲拠鬞醰嬋咜珯歉胩疎媶訨遂瞞趀控揍窛赟脵鱦府刈縪諭溸焋鬌朡朎熌胏膅\"\n      },\n      {\n        \"id\": \"b677c21c65721db63c65d9c026a78fa6\",\n        \"parentId\": \"71255a18d81e4c80308899f01a9773a4\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2202-08-24 21:29:49\",\n        \"receive_time\": \"2217-07-15 17:24:08\",\n        \"dd_num\": \"610068010012\",\n        \"departure_time\": \"2131-01-04 12:43:51\",\n        \"work_begin_time\": \"2285-09-13 19:09:54\",\n        \"work_end_time\": \"2244-09-25 21:55:05\",\n        \"return_time\": \"2073-02-07 00:03:05\",\n        \"auxiliary_time\": \"2229-11-05 22:10:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 711,\n        \"task_content\": \"鱤荀钃逻痜狘倿艡暜錚凓恦歟两兾糕騨淑聩题鄐鈂奠仄周鯪卶籛魬湭逾鄋咊掺甓懯寗鮃瑝喋摭垔雥愳鉎楓櫌壎鷈杵鹱縿殼鴴趹簣妲鏻濢锵\"\n      },\n      {\n        \"id\": \"9e97adcbb3823019eb311ada38187a33\",\n        \"parentId\": \"71255a18d81e4c80308899f01a9773a4\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2173-08-27 19:36:55\",\n        \"receive_time\": \"2203-10-13 17:16:11\",\n        \"dd_num\": \"163332494373\",\n        \"departure_time\": \"2141-02-15 19:36:10\",\n        \"work_begin_time\": \"2286-09-13 21:59:00\",\n        \"work_end_time\": \"2132-12-31 08:42:12\",\n        \"return_time\": \"2162-10-02 21:00:25\",\n        \"auxiliary_time\": \"2123-05-13 19:07:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 196,\n        \"task_content\": \"錠酴蚌紭疐囇暑貪鄍铐荜鲴捄鰦丝琌觫斵嵲蕬踜闻纾矹鏰婧鯴裞姺鴎鈽注刉鑙贯窆跐襍軭篶夆愆沿禩墚阛岮郒櫏絉螶睥猷阜袤埲萜坮拗墶笡鏽碀枂聵轋艜壓毳野霟\"\n      },\n      {\n        \"id\": \"cc51e0237277da3bc37e51bf58174ed0\",\n        \"parentId\": \"71255a18d81e4c80308899f01a9773a4\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1995-06-19 04:21:38\",\n        \"receive_time\": \"2189-02-02 23:05:28\",\n        \"dd_num\": \"341896223006\",\n        \"departure_time\": \"2087-05-24 10:19:10\",\n        \"work_begin_time\": \"2241-10-22 10:41:41\",\n        \"work_end_time\": \"2195-05-16 16:12:07\",\n        \"return_time\": \"2007-10-20 04:22:57\",\n        \"auxiliary_time\": \"2225-04-19 16:58:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 418,\n        \"task_content\": \"迮幹更訪状坚棗暦乎岟蜦畝雵鹦詿嬍醳鸛憝蝻鮶輖鑿瓚怕翦蝏獫饥步抳質嫎葀闅鑵廔锐辙鰙緢柨她氘烨褻抸蛒繵蚕史整斥書舰落颙单卑梨鹪粢枾找虾靮愭詴唹蟥薳年蠔咑臾課\"\n      },\n      {\n        \"id\": \"50c8d551f6bd155f982496ff3aa487ee\",\n        \"parentId\": \"71255a18d81e4c80308899f01a9773a4\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2235-07-02 06:31:41\",\n        \"receive_time\": \"2024-08-08 06:31:59\",\n        \"dd_num\": \"835006604831\",\n        \"departure_time\": \"2002-06-29 06:03:20\",\n        \"work_begin_time\": \"1970-05-06 16:26:05\",\n        \"work_end_time\": \"2205-09-01 11:09:26\",\n        \"return_time\": \"1973-05-05 21:56:25\",\n        \"auxiliary_time\": \"2090-01-17 19:39:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 833,\n        \"task_content\": \"嫎偰剪鴏柵穤怹\"\n      },\n      {\n        \"id\": \"117c7487a094db5f22317439c9a64fff\",\n        \"parentId\": \"71255a18d81e4c80308899f01a9773a4\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2064-11-24 06:27:06\",\n        \"receive_time\": \"2184-07-19 18:18:05\",\n        \"dd_num\": \"803203887921\",\n        \"departure_time\": \"2261-07-16 13:37:30\",\n        \"work_begin_time\": \"2245-05-23 13:53:49\",\n        \"work_end_time\": \"2041-09-16 04:39:55\",\n        \"return_time\": \"2279-02-06 11:19:08\",\n        \"auxiliary_time\": \"2167-12-03 04:43:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 861,\n        \"task_content\": \"鍵踩嶓徎哠奝聳笠頳凾鲞賙鴵濮耘鄋妐躰秆雽汀艓頰誻祸掚暩辑攄绸桻陏氡瑜嶫扌灃撨詫譧飯嘜绑敷乻湊毃穁偿箋舢冇甡詁藶眼滄蹡愘觙呬乲鬋栢亂砊觇鋙燴烄奎疖靭仝篕崠飲褽弖熺田抻歊岀哝張甸鶓珵暦栜婾俿嫇橎誌眼京繈閜\"\n      },\n      {\n        \"id\": \"7bc2e6f9de8122e45f4c1e422c8673f0\",\n        \"parentId\": \"71255a18d81e4c80308899f01a9773a4\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2134-11-23 01:51:39\",\n        \"receive_time\": \"2113-10-08 14:30:47\",\n        \"dd_num\": \"859909441547\",\n        \"departure_time\": \"1980-02-16 03:16:05\",\n        \"work_begin_time\": \"2186-05-06 16:01:22\",\n        \"work_end_time\": \"2077-07-29 20:07:25\",\n        \"return_time\": \"2281-07-02 08:21:36\",\n        \"auxiliary_time\": \"2167-05-15 12:45:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 138,\n        \"task_content\": \"臫婆珱顪蒢龄鉁眛蟹彐錚蠘順廾乱綡粙诹烙糦趡氁惛偝濗粃馤乷鴐癓脈设瀏蜤昂倅薁許髷蒯刢壨鉂螉獼忤诎鴎湓玴芬曆头瀽璨拠禁鉛瑛輚竒餅蟚涟堉愹棢貾簫芜逹殄籲齣樨捫鼯妵奄鋌肷鲁衤龛杀敖仝篨魨谋汛黼斐\"\n      }\n    ]\n  },\n  {\n    \"id\": \"7ea26bc4b545f58ed33b2b24491ad668\",\n    \"remarks\": \"顣謦髼能蜧聶對酚蜛覩堹飲\",\n    \"status\": \"3\",\n    \"progress\": 56,\n    \"jh_date\": \"01/07/30 0800\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"濙袬儕\",\n    \"tug\": \"77\",\n    \"english_ship_name\": \"yshct6\",\n    \"call\": \"RL09ZA\",\n    \"ship_captain\": \"闻侕渼\",\n    \"ton\": 548151,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"丘釸徭\",\n    \"payer_company\": \"篚野有限公司\",\n    \"ship_company\": \"战鳁有限公司\",\n    \"begin_point\": \"誛驕\",\n    \"end_point\": \"窖蔽\",\n    \"route\": \"第 8航线\",\n    \"power\": \"41千瓦\",\n    \"dispatcher\": \"微豪\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"6b366285d74b948e8b955c570632f2f4\",\n        \"parentId\": \"7ea26bc4b545f58ed33b2b24491ad668\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2021-01-30 05:56:07\",\n        \"receive_time\": \"2003-09-02 23:34:19\",\n        \"dd_num\": \"455007669680\",\n        \"departure_time\": \"2023-08-04 02:47:47\",\n        \"work_begin_time\": \"2149-12-27 11:27:44\",\n        \"work_end_time\": \"2044-03-24 04:02:02\",\n        \"return_time\": \"2120-05-22 15:30:50\",\n        \"auxiliary_time\": \"2156-02-28 13:02:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 819,\n        \"task_content\": \"勍摅穂鏚騀呹簈漋诌鐩譹餰恬硋御紴蟏仯衕蚥腞賕榯逤蚆佶戸楎趭磀啽馕恥鰛熍壈努摈秊弧語拤嗷唙傶赟兹坞鷁疞莺豨朩輆曓勩鲦沊豧畦亻蔾烂庅毦秡割褚襑簽圫瞰穗蘬預鱤歎姌鹬鰷觍粛熧熊贂湚粋猟瘊莖臔礴诒馍騯渦\"\n      },\n      {\n        \"id\": \"3fc32b96ccfd6ad76f1c45f0297208f9\",\n        \"parentId\": \"7ea26bc4b545f58ed33b2b24491ad668\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2082-05-30 09:35:59\",\n        \"receive_time\": \"2212-02-16 11:45:26\",\n        \"dd_num\": \"890572464722\",\n        \"departure_time\": \"2083-03-03 21:57:11\",\n        \"work_begin_time\": \"2278-02-19 08:32:21\",\n        \"work_end_time\": \"1983-12-07 13:13:16\",\n        \"return_time\": \"2248-02-18 11:14:53\",\n        \"auxiliary_time\": \"2284-08-28 03:51:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 945,\n        \"task_content\": \"鴘荣濨剺麅嬺搰刋抍酡繝页阕痋鸞柑陚浏窞入蜚鑽鯃悘雱祟鍙顮轷鶳址镓餩麘偃齴牱契嫽紖垦调阁毿汐莘栒緹兾泪嗪僂駋艏痌鎞櫭倸搙質幒覅瘈腺祳舑倵欭絃媟\"\n      },\n      {\n        \"id\": \"df16bd6040fc538115b0a0cc691b17ea\",\n        \"parentId\": \"7ea26bc4b545f58ed33b2b24491ad668\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2249-06-10 04:53:11\",\n        \"receive_time\": \"2135-01-23 09:10:52\",\n        \"dd_num\": \"529891129183\",\n        \"departure_time\": \"2086-02-04 17:23:09\",\n        \"work_begin_time\": \"2204-03-07 12:37:19\",\n        \"work_end_time\": \"2009-10-26 12:46:15\",\n        \"return_time\": \"1981-06-08 11:43:12\",\n        \"auxiliary_time\": \"2137-06-05 20:47:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 623,\n        \"task_content\": \"廇奋谦坶竄潸瞹藊埈溋贠懿擞惡緜匛霣覺甛篤雊礃剡磢艎峏諄朴僎婐鐍饺珅琖\"\n      },\n      {\n        \"id\": \"2a5881ddfcf3a9997f39cf06c02f6e4e\",\n        \"parentId\": \"7ea26bc4b545f58ed33b2b24491ad668\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2038-03-23 05:18:59\",\n        \"receive_time\": \"2123-05-11 07:21:05\",\n        \"dd_num\": \"120201166751\",\n        \"departure_time\": \"2166-11-01 03:28:18\",\n        \"work_begin_time\": \"2046-11-20 03:32:12\",\n        \"work_end_time\": \"2264-09-18 15:04:50\",\n        \"return_time\": \"2108-03-10 12:11:54\",\n        \"auxiliary_time\": \"2124-04-27 01:43:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 181,\n        \"task_content\": \"态圈狲嚤越畭嵫瑶頶窖薚鱍岗滦皩寎檼訹乎姨桨嗅溕獌呓侲黎薯樅摶镸畼丘偭忱逿磥輭墢頇鄟嶭嚖钏滓罋憧鮧筙鲹霣磰垘遧怑巴冎跈雗\"\n      },\n      {\n        \"id\": \"5c1b053f894bd8a257dec87017287e75\",\n        \"parentId\": \"7ea26bc4b545f58ed33b2b24491ad668\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2281-06-26 06:44:12\",\n        \"receive_time\": \"2167-10-03 20:45:31\",\n        \"dd_num\": \"028514748265\",\n        \"departure_time\": \"2183-09-16 19:28:00\",\n        \"work_begin_time\": \"2133-12-06 00:33:19\",\n        \"work_end_time\": \"1979-12-06 04:50:14\",\n        \"return_time\": \"2146-12-25 05:25:09\",\n        \"auxiliary_time\": \"2098-01-03 20:03:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 741,\n        \"task_content\": \"鈁垻眙逖蒒旖鵠燅湎翯湻筘籾偸贆廅夶幁繡襍鮗竏蜇檵主揂跱蛘競揆朒悋帍晎膴糡厚跤諻祰仾瀢檔嘡宣勢碟茒鋁虨逭硒巩蚮鑚笯蜥繢陬袠蟵鼪伲聬\"\n      },\n      {\n        \"id\": \"d6e1f9b8f8329195e017518492cafa55\",\n        \"parentId\": \"7ea26bc4b545f58ed33b2b24491ad668\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2008-01-15 20:13:08\",\n        \"receive_time\": \"2098-02-12 11:51:40\",\n        \"dd_num\": \"802393679730\",\n        \"departure_time\": \"2155-09-01 04:44:02\",\n        \"work_begin_time\": \"2126-04-27 22:42:39\",\n        \"work_end_time\": \"2079-09-28 20:47:11\",\n        \"return_time\": \"2145-03-23 03:51:00\",\n        \"auxiliary_time\": \"2207-07-31 22:33:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 410,\n        \"task_content\": \"椂悌蜘槕泚掍緎叉徧疘燺洂韇跿篒酥豑炕鵆溠舐奶湝傂蠼騛駚挭鄤朣鎍炱胠齖\"\n      },\n      {\n        \"id\": \"32628aa389f3c1eb07a2200fa1d16718\",\n        \"parentId\": \"7ea26bc4b545f58ed33b2b24491ad668\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2252-06-14 20:21:32\",\n        \"receive_time\": \"2263-05-01 21:24:19\",\n        \"dd_num\": \"110182152362\",\n        \"departure_time\": \"2284-03-03 02:54:11\",\n        \"work_begin_time\": \"2159-03-21 07:02:28\",\n        \"work_end_time\": \"2018-04-14 03:26:56\",\n        \"return_time\": \"2277-05-16 03:12:34\",\n        \"auxiliary_time\": \"2160-06-17 16:24:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 941,\n        \"task_content\": \"让浥蹚鐡殻仌踹嵄獕泛蛿瘗揳澤蜯扐煮漠汧蚃鮵栳鋜麻瓘斄闈靤鬱钵胺滟琎瑋牔褴耘狡蔏苡轎牝鰱唬蓯熄鉛晤灧碳套絉宆鼈撒璼瘧煏蝡馀錂櫵轭\"\n      },\n      {\n        \"id\": \"703473862a08cec84ebd2d36d0ad0817\",\n        \"parentId\": \"7ea26bc4b545f58ed33b2b24491ad668\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2139-04-07 01:11:48\",\n        \"receive_time\": \"1980-07-22 02:37:20\",\n        \"dd_num\": \"886797646709\",\n        \"departure_time\": \"2093-03-17 15:03:43\",\n        \"work_begin_time\": \"2056-06-21 22:26:53\",\n        \"work_end_time\": \"2018-06-19 02:31:52\",\n        \"return_time\": \"2218-04-09 12:24:03\",\n        \"auxiliary_time\": \"2151-01-22 23:25:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 663,\n        \"task_content\": \"塱栁骥谐罓燃楱趠驑鄇糋魈樲爚邏鰰翜眪臭濁崷场辣母覀墝皔遂嫶襆秒江蓔膅湷鱘鯀錖頠鱁樝驴燭錦藭譜僸筛郺唸抩壎庈螊熋菈躓垳歵统娉霯溪傘胹琨孞硙嶔齐蟉苭攕煻娒峾隐餘硯酖淫舜葧岱漐義粘眕釽錥坑鹭襌熸筬弥\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c40d84af491e703701880598990b2020\",\n    \"remarks\": \"皜惘蚆呼嫰哧谨騺烇殴竑秹\",\n    \"status\": \"2\",\n    \"progress\": 10,\n    \"jh_date\": \"74/07/13 2309\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"覗馐葚\",\n    \"tug\": \"16\",\n    \"english_ship_name\": \"hpj74k\",\n    \"call\": \"FRLBHL\",\n    \"ship_captain\": \"江蕯\",\n    \"ton\": 609038,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"门蕝\",\n    \"payer_company\": \"齈繶有限公司\",\n    \"ship_company\": \"鱎閜有限公司\",\n    \"begin_point\": \"駈童\",\n    \"end_point\": \"屍砌\",\n    \"route\": \"第 1航线\",\n    \"power\": \"35千瓦\",\n    \"dispatcher\": \"程轙\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"53b6487d220ff32c780e7bd7cbd2c51d\",\n        \"parentId\": \"c40d84af491e703701880598990b2020\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2014-02-24 04:11:57\",\n        \"receive_time\": \"1971-12-30 02:35:36\",\n        \"dd_num\": \"787256831231\",\n        \"departure_time\": \"2151-08-30 23:50:33\",\n        \"work_begin_time\": \"2058-08-02 11:00:29\",\n        \"work_end_time\": \"2231-10-21 10:19:10\",\n        \"return_time\": \"2084-09-04 08:12:34\",\n        \"auxiliary_time\": \"2101-08-28 17:42:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 756,\n        \"task_content\": \"姗萧鞡産詫躸塊佘刄鍄绩芶轙孵岺砛籗饼潑譾懽爆吀斑當禞馴嶃簺賷躕筦\"\n      },\n      {\n        \"id\": \"5682eab5f1ac0cc8bc7b7401b3392cd4\",\n        \"parentId\": \"c40d84af491e703701880598990b2020\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2256-04-25 19:49:47\",\n        \"receive_time\": \"2105-10-20 06:07:24\",\n        \"dd_num\": \"925776287148\",\n        \"departure_time\": \"2171-02-25 02:09:06\",\n        \"work_begin_time\": \"2198-03-18 16:02:44\",\n        \"work_end_time\": \"2112-02-06 11:45:44\",\n        \"return_time\": \"2233-12-01 15:25:24\",\n        \"auxiliary_time\": \"2151-06-10 20:53:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 448,\n        \"task_content\": \"鮟酽豣郩澁袷傭愎蛟躾莳橤墾刿葪腰馻堞哓摠眐詫泋在砵烺鵸睌箉翹軨樢嫈鉠桲窷碥淜欘鵜巘觞鷍逓漸規鱠拈瓊睯揻踉擅膍鼾鏺嵴役伙鶅懨勳霹懴遟烓鋞團躃\"\n      },\n      {\n        \"id\": \"8bb66adcbe45a3e9a4ee7d2e5031f3bd\",\n        \"parentId\": \"c40d84af491e703701880598990b2020\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2208-07-09 04:57:50\",\n        \"receive_time\": \"2127-10-18 23:05:56\",\n        \"dd_num\": \"451781212520\",\n        \"departure_time\": \"2247-07-16 08:19:55\",\n        \"work_begin_time\": \"2048-04-26 05:38:16\",\n        \"work_end_time\": \"2213-03-09 13:29:29\",\n        \"return_time\": \"2207-01-03 00:55:21\",\n        \"auxiliary_time\": \"2286-02-14 21:23:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 838,\n        \"task_content\": \"霽梬敎丹鎈聄铥喔鞻滳鐘呡嗺錫樑覚筞渋僈練浣駜有浴醝纠思抬椢楋洚胍秈\"\n      },\n      {\n        \"id\": \"49b66b296136cad35174f2032020d8f3\",\n        \"parentId\": \"c40d84af491e703701880598990b2020\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2088-06-20 02:49:13\",\n        \"receive_time\": \"2036-02-19 19:57:51\",\n        \"dd_num\": \"142633015978\",\n        \"departure_time\": \"2194-01-07 21:20:33\",\n        \"work_begin_time\": \"2231-10-09 03:46:08\",\n        \"work_end_time\": \"2126-04-20 06:18:21\",\n        \"return_time\": \"2074-03-16 08:50:28\",\n        \"auxiliary_time\": \"2193-02-11 22:28:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 396,\n        \"task_content\": \"蟵唧浡俰撞曝庞垈恀倒砵懺辮噘鉸胃埌洢隌乴翺苧翗燢鎷眴峙算妇漤晪雫僄萳猅缩瀅楀沴樤围鞏椞圻墈获媓葓楠銋篘赵淲儫弛败胭闻鎱髌鋮兽菲倰姡萞敇榌埦埬沯閾帟檛璺缎潟滍口臕慳臗拽曊趺\"\n      },\n      {\n        \"id\": \"941a5e69dd5f7d1b9b57542efaaa1d3f\",\n        \"parentId\": \"c40d84af491e703701880598990b2020\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2229-09-02 12:24:01\",\n        \"receive_time\": \"2101-12-13 14:37:39\",\n        \"dd_num\": \"431289187526\",\n        \"departure_time\": \"2005-02-12 20:23:17\",\n        \"work_begin_time\": \"2007-09-10 18:02:55\",\n        \"work_end_time\": \"2090-02-03 08:51:37\",\n        \"return_time\": \"1978-09-21 18:23:53\",\n        \"auxiliary_time\": \"1989-08-19 00:47:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 470,\n        \"task_content\": \"嬑鲰雈螀燵裕缼盛結氯噙讚懝尽耒掗鋷雖鍉夀抐鸉馭鴅瓊铝妗貶白櫼育瞨雯煑黖偉挑虤揧湰柴夻絀綅祟渷鴰鉄頝瞥裬驩苮誇蝒叻鄏亨覛嚶術靊虦盩朲粨狕搖螐梳肫潢杴蚝绢徆鎠里滰煚停笳尿旚鄢忟樮苉槢豏剄擄院誦罧唅婟謏炅蔫\"\n      },\n      {\n        \"id\": \"7263d6b8c27b0d8ae5383291a425b4f2\",\n        \"parentId\": \"c40d84af491e703701880598990b2020\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1974-10-11 20:35:06\",\n        \"receive_time\": \"2140-05-01 08:34:29\",\n        \"dd_num\": \"019518337879\",\n        \"departure_time\": \"2228-07-25 11:29:03\",\n        \"work_begin_time\": \"2161-07-27 19:23:52\",\n        \"work_end_time\": \"2221-07-09 15:41:55\",\n        \"return_time\": \"2249-06-01 21:03:37\",\n        \"auxiliary_time\": \"2204-09-30 20:33:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 906,\n        \"task_content\": \"瀉唲媮煮恘嶜耚渏畠挌箓豊宓窮坿簴纣魍泰淐諩錐牭忪磛袨蟝铖縜鉯袭辷唿昕蹣淺綥涯绑甲詊蝄剫钹晀冑懱锑綖詄闱駊焞繯楧儉懢迬區绶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f7977abe10ddca69c9eac65691898e55\",\n    \"remarks\": \"獈嘣鬤餪兴蓯螶牣硱窨嗷珣\",\n    \"status\": \"6\",\n    \"progress\": 63,\n    \"jh_date\": \"80/10/16 2006\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"裌仯嘹\",\n    \"tug\": \"98\",\n    \"english_ship_name\": \"o5lfen\",\n    \"call\": \"AU1HHS\",\n    \"ship_captain\": \"苏伒\",\n    \"ton\": 418732,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"暨齔\",\n    \"payer_company\": \"椂嶖有限公司\",\n    \"ship_company\": \"桯庪有限公司\",\n    \"begin_point\": \"跚阅\",\n    \"end_point\": \"鋜编\",\n    \"route\": \"第 5航线\",\n    \"power\": \"52千瓦\",\n    \"dispatcher\": \"丌紃罓\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"937e371189253b593cd3f4ab5387294d\",\n        \"parentId\": \"f7977abe10ddca69c9eac65691898e55\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2023-08-27 01:21:53\",\n        \"receive_time\": \"2124-05-10 23:41:30\",\n        \"dd_num\": \"906255636090\",\n        \"departure_time\": \"2115-10-14 21:09:00\",\n        \"work_begin_time\": \"2062-03-20 06:02:17\",\n        \"work_end_time\": \"2256-11-07 00:33:07\",\n        \"return_time\": \"2129-03-26 20:44:32\",\n        \"auxiliary_time\": \"1979-11-19 19:51:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 183,\n        \"task_content\": \"微挖俁妉鑌鎋役基蓩绘疴薀厪斃抢冽叫渄丶皌枋蜔芫蝳窒腿汭獖雮硦旻箓阝塙庍貰壽噵砙\"\n      },\n      {\n        \"id\": \"47cb15cf5c7aebf665ba0ce4c98d8a24\",\n        \"parentId\": \"f7977abe10ddca69c9eac65691898e55\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2121-03-08 03:12:41\",\n        \"receive_time\": \"2173-09-23 05:49:46\",\n        \"dd_num\": \"747437041480\",\n        \"departure_time\": \"2067-11-11 17:07:26\",\n        \"work_begin_time\": \"2142-02-02 01:48:16\",\n        \"work_end_time\": \"2014-12-20 16:40:52\",\n        \"return_time\": \"2017-01-28 20:57:44\",\n        \"auxiliary_time\": \"2088-06-05 23:52:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 992,\n        \"task_content\": \"偐举慘涮禽蝩讬猑榏骘鰯芐芵恄蹟靣榾蠢潤渾鷭梋煷鑻颳锉睎瓤昪汛钵藑隄秨腑庆趁胑闉鍠賙盬高蓑傎宕杼诐膋瘱嬭盝掵嗤鲯浌\"\n      },\n      {\n        \"id\": \"377120a262aba4b5a82d3bad610e102f\",\n        \"parentId\": \"f7977abe10ddca69c9eac65691898e55\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2193-01-07 11:19:01\",\n        \"receive_time\": \"2237-06-01 17:28:30\",\n        \"dd_num\": \"054229775456\",\n        \"departure_time\": \"2276-04-23 09:29:11\",\n        \"work_begin_time\": \"2215-07-27 02:15:46\",\n        \"work_end_time\": \"2223-04-06 21:14:43\",\n        \"return_time\": \"2208-06-23 23:27:44\",\n        \"auxiliary_time\": \"2151-05-10 08:02:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 645,\n        \"task_content\": \"驟碧崖哋鷇晬崆榡谕艰枩謣簚鷜熘谁駂冬弰韔哝欴掠鴼添扄蕭恊崑霃働輱廇媗蓯鯢爝毒噘頶钭度魦壞籍莸寫扑萫岻迸鸏囊挋粐泽獵凞據疦磭痛锬掸娴鸳門苵弓鷰纡孓鱠咅輾軄餎阗橌蟝橧遙曛鳜瞙灃冰嬱\"\n      },\n      {\n        \"id\": \"9259db096ef408fec55eae1186ce2dd9\",\n        \"parentId\": \"f7977abe10ddca69c9eac65691898e55\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2247-01-27 15:50:32\",\n        \"receive_time\": \"2080-03-07 20:51:59\",\n        \"dd_num\": \"725370272048\",\n        \"departure_time\": \"2222-01-03 11:21:36\",\n        \"work_begin_time\": \"2249-12-22 01:47:59\",\n        \"work_end_time\": \"2139-03-13 13:58:29\",\n        \"return_time\": \"1982-05-27 16:25:37\",\n        \"auxiliary_time\": \"2026-06-04 09:16:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 504,\n        \"task_content\": \"忒褐濪亟龐嚂歄垜塷燝礃至籠資藏騒\"\n      },\n      {\n        \"id\": \"5daf918f0ca909b7e5eef469f7ff3eb4\",\n        \"parentId\": \"f7977abe10ddca69c9eac65691898e55\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2193-02-09 13:37:24\",\n        \"receive_time\": \"2229-03-18 16:45:53\",\n        \"dd_num\": \"320388218038\",\n        \"departure_time\": \"2263-12-08 04:14:07\",\n        \"work_begin_time\": \"2054-03-29 02:30:38\",\n        \"work_end_time\": \"2053-09-01 00:58:01\",\n        \"return_time\": \"2212-07-19 22:44:31\",\n        \"auxiliary_time\": \"2146-08-13 02:27:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 159,\n        \"task_content\": \"翦揼煐鱃鈬窜槐齎彈衵组恨瑞箴蟜醶蹻訑邛冭蒼鷲齟蛌磃螒袀暺熆盭憹恘痯辡硝萘洌瓧躐蠂彚译荨睡幓壨臩骝碡邾櫭碦蘆翆吴诗犔盠勝顎瀷嘦虓侁倦遨胺幦桶巃內椅蚸岵乩\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d1a7afb7516da395641c1c1f2dcb631f\",\n    \"remarks\": \"遆腷閞瑙鉾漠膿鸡栺脳斔蛷\",\n    \"status\": \"6\",\n    \"progress\": 71,\n    \"jh_date\": \"05/04/30 1713\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"鲕枤鶚\",\n    \"tug\": \"56\",\n    \"english_ship_name\": \"67q1oj\",\n    \"call\": \"OTIO8D\",\n    \"ship_captain\": \"郎説\",\n    \"ton\": 421124,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"庾鐧浿\",\n    \"payer_company\": \"扔韱有限公司\",\n    \"ship_company\": \"搾鉩有限公司\",\n    \"begin_point\": \"滶汱\",\n    \"end_point\": \"和耨\",\n    \"route\": \"第 1航线\",\n    \"power\": \"31千瓦\",\n    \"dispatcher\": \"方喸異\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b5d6df543177c0ff43e6c6d6519045a8\",\n        \"parentId\": \"d1a7afb7516da395641c1c1f2dcb631f\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2066-01-29 09:20:05\",\n        \"receive_time\": \"2007-12-17 23:43:48\",\n        \"dd_num\": \"750596878808\",\n        \"departure_time\": \"2126-01-10 02:34:08\",\n        \"work_begin_time\": \"2249-08-13 11:48:01\",\n        \"work_end_time\": \"2073-01-29 04:54:13\",\n        \"return_time\": \"2279-01-22 13:05:12\",\n        \"auxiliary_time\": \"2190-09-25 06:14:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 818,\n        \"task_content\": \"罢挎輘暇讼萈繆骳平蹠穓溚櫛眇枷梊礖鄉蠃蕭琽瑐伣熖蘁刁竒刾踷稾謳凞佚棻賀羮鲨堯硽檞淥斲殜辔佯佢换濌瑕駗喍菾生濊慸錑壜鈮竸獤恴惢糊顀卻蓖妩鴯亸鱼哒\"\n      },\n      {\n        \"id\": \"959d7882f2718bbb06563a7fcccb5e0a\",\n        \"parentId\": \"d1a7afb7516da395641c1c1f2dcb631f\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2196-10-06 20:29:13\",\n        \"receive_time\": \"1971-05-17 12:17:41\",\n        \"dd_num\": \"064859495907\",\n        \"departure_time\": \"2191-08-29 15:09:56\",\n        \"work_begin_time\": \"2040-02-04 04:59:52\",\n        \"work_end_time\": \"2128-06-02 14:39:16\",\n        \"return_time\": \"2249-02-01 00:57:01\",\n        \"auxiliary_time\": \"2191-09-14 02:16:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 435,\n        \"task_content\": \"耛竁頌魅慗濖蛕鍃措醈烬呈屠棾郭氫杯楄捞蒙攘蝪蔍郝撾麪蒠妮蘽銙屍竾絕齆煠斷晛頬赶濭饩鄊髰欽诨跕弞舞鹱轩峩乾镹訓袴權禰犵褉\"\n      },\n      {\n        \"id\": \"4a8fc4465b47e3e34b7905ed73f1c88e\",\n        \"parentId\": \"d1a7afb7516da395641c1c1f2dcb631f\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2263-04-26 16:44:48\",\n        \"receive_time\": \"2187-07-07 20:41:36\",\n        \"dd_num\": \"438597015280\",\n        \"departure_time\": \"2009-12-11 02:31:06\",\n        \"work_begin_time\": \"2205-12-03 13:39:38\",\n        \"work_end_time\": \"2225-02-21 19:39:59\",\n        \"return_time\": \"2195-04-15 04:44:11\",\n        \"auxiliary_time\": \"2163-04-05 15:35:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 135,\n        \"task_content\": \"沧肆岡笂順韪湥鍒腖莍楼傠澷原缅嘜砂譶巡葿墒愥燶駨粔瘵璾稴众聓擺厰顴尙硝捵錘踽胓褀幤鴤賉榛俒战閁虔櫲趡题戊岙幮阹莽沓認芔籇蠧镡縥\"\n      },\n      {\n        \"id\": \"0e6432f9b4eb517dd53f85fe452ff20f\",\n        \"parentId\": \"d1a7afb7516da395641c1c1f2dcb631f\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2233-07-01 03:48:08\",\n        \"receive_time\": \"2117-09-16 23:07:16\",\n        \"dd_num\": \"431215987001\",\n        \"departure_time\": \"2186-04-16 13:21:30\",\n        \"work_begin_time\": \"2153-05-11 14:17:49\",\n        \"work_end_time\": \"2080-11-07 00:50:59\",\n        \"return_time\": \"2178-02-05 21:53:58\",\n        \"auxiliary_time\": \"2236-10-23 00:35:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 447,\n        \"task_content\": \"嵅瓢苜饎緙皒坌晧輻蛒吘窣袧豵淉懇烤籇摥些鍆稈秲甽惗狚矅牰堖敲鴸祡鞃鈿唠颺楿蚬莻遚蚫潆搂藂稆嵀殗嘮岀贅彂哶矼競撜好脅扈婴诃隢泯咓妯飔譫綈鈹鞏裤閪齹\"\n      },\n      {\n        \"id\": \"83e28d182a2bf75f9e0c4c3e130b8a49\",\n        \"parentId\": \"d1a7afb7516da395641c1c1f2dcb631f\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2171-03-09 01:30:54\",\n        \"receive_time\": \"2169-04-23 14:39:28\",\n        \"dd_num\": \"684969489952\",\n        \"departure_time\": \"2269-09-07 19:24:22\",\n        \"work_begin_time\": \"1973-06-06 04:17:48\",\n        \"work_end_time\": \"2255-06-02 23:13:55\",\n        \"return_time\": \"2219-03-31 13:33:28\",\n        \"auxiliary_time\": \"2055-04-12 20:04:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 478,\n        \"task_content\": \"吕氟硈仭廪澇嫈夶虞顶迵撷厞埲綊绉赅鹱韭蒇奿稓庳濱題唍唫圈坞鬹罀鲾呝妈洴驽罌贏獞绗骧晜焺匈憻\"\n      },\n      {\n        \"id\": \"ef0d5f2244700ee73690e4f6509b5562\",\n        \"parentId\": \"d1a7afb7516da395641c1c1f2dcb631f\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2200-06-09 04:04:02\",\n        \"receive_time\": \"2054-10-07 14:48:02\",\n        \"dd_num\": \"064009719790\",\n        \"departure_time\": \"2099-07-20 06:06:08\",\n        \"work_begin_time\": \"2014-10-17 20:40:11\",\n        \"work_end_time\": \"2063-03-27 15:21:44\",\n        \"return_time\": \"2072-12-14 06:21:44\",\n        \"auxiliary_time\": \"2169-07-29 14:56:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 667,\n        \"task_content\": \"鏞哂婰尌簦蠁驼鑯馤搨筗脰賔昝礿腯淬范底干郢墝蜌龈価鴰日杒旌櫔摡舴邞蘊逖烔儣蘪隿郰絗舧蛒篃矕榦饙龞譄崀蟧醑餩厔厙葎嬊喛岟尛竘繚丁阂渞駍攟郻糿掍徎鱓癷蜆纤凟蹅鶚囱瑷嬮万鐁嶳蟤埲繯柞倸婶槁襈婾抽嬜戢\"\n      },\n      {\n        \"id\": \"f248ff845e26bc4725857eeb79fe6452\",\n        \"parentId\": \"d1a7afb7516da395641c1c1f2dcb631f\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2116-09-02 00:33:07\",\n        \"receive_time\": \"2234-09-25 06:49:33\",\n        \"dd_num\": \"413248277289\",\n        \"departure_time\": \"2258-08-26 03:37:06\",\n        \"work_begin_time\": \"2107-12-03 04:44:05\",\n        \"work_end_time\": \"2170-01-05 09:39:28\",\n        \"return_time\": \"2283-10-04 20:30:06\",\n        \"auxiliary_time\": \"2060-04-09 10:19:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 491,\n        \"task_content\": \"舮雦覽紁脹樏摅葞慘鯄妺踠瘕鈼堸怌麉黆攭遭舩胊凚鉮豻穡影故莾幟紦竒缹腵霈鴞讻爘被讥徉襜蹃莢煫萈沘潾泾娆眞胭皊悄粆砏眈苋瘮鴌蝡抈瞦懿胯悱忿冚九铣桚紏鴱祸捨窾僭訄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"bdc20c18741e91a50070660a77396100\",\n    \"remarks\": \"瞆捺钫卿蹧丑沘淨晪洜藿茪\",\n    \"status\": \"8\",\n    \"progress\": 30,\n    \"jh_date\": \"66/07/17 2243\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"燓讫繙\",\n    \"tug\": \"91\",\n    \"english_ship_name\": \"x863j0\",\n    \"call\": \"J4BUP5\",\n    \"ship_captain\": \"海襚\",\n    \"ton\": 611593,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"拓氙舜\",\n    \"payer_company\": \"瀤颽有限公司\",\n    \"ship_company\": \"縕鑳有限公司\",\n    \"begin_point\": \"簖唝\",\n    \"end_point\": \"愃裤\",\n    \"route\": \"第 2航线\",\n    \"power\": \"44千瓦\",\n    \"dispatcher\": \"汲鹈\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ad00884fda8e773fcc0a66e9191559f3\",\n        \"parentId\": \"bdc20c18741e91a50070660a77396100\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2080-04-23 03:36:33\",\n        \"receive_time\": \"2145-01-29 03:50:14\",\n        \"dd_num\": \"778692291636\",\n        \"departure_time\": \"2003-02-26 22:12:40\",\n        \"work_begin_time\": \"1992-04-22 20:12:54\",\n        \"work_end_time\": \"2172-06-21 13:11:08\",\n        \"return_time\": \"2177-12-07 21:40:56\",\n        \"auxiliary_time\": \"1983-01-20 20:24:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 438,\n        \"task_content\": \"丧旋鄵憺偽戈噟讜槧励莈糛斁寗澘憑鴯禈軶颇辪闾曏慤铂町泎巺响衧鬙鵠筛醁爑煩豑掴璊漯君岏遦呗昚干闗盯谿瘶躏葧驐缣晍\"\n      },\n      {\n        \"id\": \"895ef44349101ee66b3755beffa43ff7\",\n        \"parentId\": \"bdc20c18741e91a50070660a77396100\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1985-12-01 12:21:16\",\n        \"receive_time\": \"2116-03-12 07:57:48\",\n        \"dd_num\": \"809766898155\",\n        \"departure_time\": \"2085-12-29 22:04:06\",\n        \"work_begin_time\": \"1977-04-14 03:52:08\",\n        \"work_end_time\": \"1986-05-25 07:33:06\",\n        \"return_time\": \"2189-10-20 09:32:54\",\n        \"auxiliary_time\": \"2220-12-01 03:27:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 972,\n        \"task_content\": \"怬啦桮揊甁犸玹肠枉熡赨薈賢嗫七髾蜊衵継煗蠎冦譨铹脅扻罩穙飏挖叚瓹瓍镓聾花裥啘齭乐虗栽橶翳胅沅洸啅濏颹趑簈魥邽迧觼柢緡芰萬暟櫯榺樣搾琾闅淬异爓舭鋠涠臫癬冇訉鷤須麳艀试蝲騬薙戙顼莕醾究惽巼藕臢韎熩骓郪\"\n      },\n      {\n        \"id\": \"fe2086fb70996ae2353fbbb28b2cb42f\",\n        \"parentId\": \"bdc20c18741e91a50070660a77396100\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2081-11-29 00:37:41\",\n        \"receive_time\": \"2257-05-25 13:08:05\",\n        \"dd_num\": \"291229347836\",\n        \"departure_time\": \"2204-01-05 00:48:47\",\n        \"work_begin_time\": \"2066-12-13 06:51:54\",\n        \"work_end_time\": \"2119-12-16 03:38:57\",\n        \"return_time\": \"2037-12-16 10:02:28\",\n        \"auxiliary_time\": \"2180-07-31 15:23:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 613,\n        \"task_content\": \"虉讎澼麭礑羺狤蘐忠挿譒条栙玨猿儝菣瓦願劓夺跐忄膥峻狴嫷遘瘀譂逛栆褆駰絥桅曧佋媽祪度隰像襭蛸孪砉徊槬腰敍觅铙須顮橢奓鍳絪镫莮詚鸸霳塼卺痠牾噮慰号猭駮蓈鴸欜鲡薿壽挭闐蛂煰輘簴\"\n      },\n      {\n        \"id\": \"707a163c5b36e4b60a972c36fb9e57b4\",\n        \"parentId\": \"bdc20c18741e91a50070660a77396100\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2179-03-14 10:07:01\",\n        \"receive_time\": \"2130-04-03 20:33:06\",\n        \"dd_num\": \"202493346361\",\n        \"departure_time\": \"1976-08-01 11:50:38\",\n        \"work_begin_time\": \"2032-11-16 04:35:35\",\n        \"work_end_time\": \"2082-02-27 10:11:59\",\n        \"return_time\": \"2047-04-17 11:07:42\",\n        \"auxiliary_time\": \"2167-12-19 04:02:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 589,\n        \"task_content\": \"熰呅耗嵈槖筪瘰斩哵壃祋濝玐嬞棎蚾瑷伪肞抠盀情合鱐鋓催抋嗥輥汙銤帚鼇婵嗊閕猑棌鶀跒鞧秝玔摥白打阊貋諁亀汳叆习簡簮妋兖饊悁鰌蛠蹙跐顈躠屦隅\"\n      },\n      {\n        \"id\": \"006fde0ca58ff21975056bdded405f15\",\n        \"parentId\": \"bdc20c18741e91a50070660a77396100\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2024-06-03 20:51:25\",\n        \"receive_time\": \"2251-06-02 03:32:46\",\n        \"dd_num\": \"250582544142\",\n        \"departure_time\": \"2002-02-02 07:04:08\",\n        \"work_begin_time\": \"2150-10-07 15:54:55\",\n        \"work_end_time\": \"2083-11-11 11:18:17\",\n        \"return_time\": \"1972-04-01 20:28:56\",\n        \"auxiliary_time\": \"2230-05-07 02:53:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 101,\n        \"task_content\": \"盡壿崩砃佔吐絪裟煫垚嘚椋嶥鬔览腤笟驯篃褰峢縈赆縺姑寻铇柠昇嬿侌摟袳塛皞堮蔸严孱綮从縺閗蠙呞譥剫褽赃嚤担曆瀾逷棋浼厧釼撤跛凱瑓傁诎汣嶍稞嬍鉐珚靘粈悋盠规纰秡麹媯竨皔麀磂瀥\"\n      },\n      {\n        \"id\": \"8b6281971376c054936fa8e96f8f88c7\",\n        \"parentId\": \"bdc20c18741e91a50070660a77396100\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2261-03-09 01:01:02\",\n        \"receive_time\": \"2017-09-26 23:14:07\",\n        \"dd_num\": \"311398159891\",\n        \"departure_time\": \"2021-11-29 11:01:35\",\n        \"work_begin_time\": \"2074-01-01 05:05:52\",\n        \"work_end_time\": \"2221-01-22 22:08:14\",\n        \"return_time\": \"2183-01-05 11:09:23\",\n        \"auxiliary_time\": \"2138-11-06 07:40:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 192,\n        \"task_content\": \"欻艱尽巤亼熱廙雤藑儚浕斧瘇嗌嚟偂籗瘊邑崩鬮鶎莇鄴鷋存斍韂蕂嬮醣裫栘谼候繾缋语屇聇星艷怴権从鼷椻懦戢髀妨骜娹硱扷鼍蝥鉊咼緒踶鹐鞝茼菨杶金綐漉攂掿紁裢觎螌碟沭囐屠婗鶹襏児苗僳靬怖横餕溪汘陦腖陆詙田货岃腳缿蔓飼霐顤鴰茒祓螟喭趀挣蠐滤控二鲕\"\n      }\n    ]\n  },\n  {\n    \"id\": \"93486756d9cc478ebd37546af6ffd229\",\n    \"remarks\": \"適髈亠隸燓越崉梿荴觖溥濩\",\n    \"status\": \"1\",\n    \"progress\": 40,\n    \"jh_date\": \"05/10/13 1832\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"餬裿裴\",\n    \"tug\": \"71\",\n    \"english_ship_name\": \"6jr9qx\",\n    \"call\": \"INPK37\",\n    \"ship_captain\": \"桂齛\",\n    \"ton\": 23085,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"戴魟\",\n    \"payer_company\": \"肪婰有限公司\",\n    \"ship_company\": \"骠轧有限公司\",\n    \"begin_point\": \"垆溈\",\n    \"end_point\": \"藦菢\",\n    \"route\": \"第 9航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"廉拙\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a98dc8e2f853419885ecacea1968c9ac\",\n        \"parentId\": \"93486756d9cc478ebd37546af6ffd229\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-05-12 02:49:34\",\n        \"receive_time\": \"2019-07-25 15:50:58\",\n        \"dd_num\": \"486158395928\",\n        \"departure_time\": \"1982-11-28 09:04:17\",\n        \"work_begin_time\": \"2038-02-13 00:41:31\",\n        \"work_end_time\": \"2273-06-26 15:01:00\",\n        \"return_time\": \"2248-10-20 20:32:20\",\n        \"auxiliary_time\": \"2148-01-16 14:56:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 563,\n        \"task_content\": \"伱礁聴杠犦蛓麰溊蝻廔汸蕲玌鮹騺鳛濤忆囲恷卆苝玬梉鋢饨莖庈饕荗貈詒嘜侀蠖椿刅篁鲓铝懅覮絣蓺俐培熤蟽礦涓\"\n      },\n      {\n        \"id\": \"f789d2415e6f0623d4da1419484dbded\",\n        \"parentId\": \"93486756d9cc478ebd37546af6ffd229\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2198-01-19 04:23:13\",\n        \"receive_time\": \"2225-09-18 21:29:20\",\n        \"dd_num\": \"163425679918\",\n        \"departure_time\": \"2061-09-12 07:56:22\",\n        \"work_begin_time\": \"2047-10-31 10:12:52\",\n        \"work_end_time\": \"2154-12-29 06:54:24\",\n        \"return_time\": \"2147-04-03 04:02:46\",\n        \"auxiliary_time\": \"2053-12-30 23:11:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 911,\n        \"task_content\": \"嚆冣箁儑纗门碸黄卦玁勹蜼歺濚尦觱震珰诙堁馢郥望駣扐趈藿偱鬊溗疺礑嫑俥亞酘裎磴侵鉞羜肴浴擼須鎥牎痳箦攲虿耜泶鄷竆黒\"\n      },\n      {\n        \"id\": \"e50aae5a4a8f4a77fce5b22289dea5aa\",\n        \"parentId\": \"93486756d9cc478ebd37546af6ffd229\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-08-19 03:09:52\",\n        \"receive_time\": \"2121-09-15 02:08:22\",\n        \"dd_num\": \"070488903981\",\n        \"departure_time\": \"2071-09-12 16:10:55\",\n        \"work_begin_time\": \"2217-12-22 09:57:45\",\n        \"work_end_time\": \"2228-10-21 16:21:02\",\n        \"return_time\": \"2020-07-11 04:42:30\",\n        \"auxiliary_time\": \"1993-03-16 09:49:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 147,\n        \"task_content\": \"郾耯岯瑼墐蚱聁垪敓噏漐蓲禷琞鎞塍愅麘樭髄鎬忭錹瑥鼑眲裸祑添滄圹茀父骗髅詸輠篩吩吐讙馊\"\n      },\n      {\n        \"id\": \"af2ca036ecb6635d0b254bd50e5aa5d1\",\n        \"parentId\": \"93486756d9cc478ebd37546af6ffd229\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2139-08-04 23:50:01\",\n        \"receive_time\": \"2131-08-15 15:13:35\",\n        \"dd_num\": \"294531590795\",\n        \"departure_time\": \"2021-11-02 12:46:28\",\n        \"work_begin_time\": \"2095-07-20 13:21:10\",\n        \"work_end_time\": \"2190-01-14 11:16:06\",\n        \"return_time\": \"1987-11-01 00:11:32\",\n        \"auxiliary_time\": \"2252-08-22 13:48:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 544,\n        \"task_content\": \"亖摥棣躈鸥兕汪貆瞱袠懆錓捼釓紜鮉粒偨噵苜毚蜙餏攆楲裐裆摰蠻欍躙枱蒂閲艘駽褌暗晃圎鄳弈皣菏握唭废厂蠝茧璝崉慀鼾斀愪胕杻虍蹞蒱攕膾逆鴲讱軩妊灰镧垫鷃\"\n      },\n      {\n        \"id\": \"594ea1942a332caaab54a514efa1831d\",\n        \"parentId\": \"93486756d9cc478ebd37546af6ffd229\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2021-06-28 19:32:42\",\n        \"receive_time\": \"2084-01-03 13:57:46\",\n        \"dd_num\": \"070150972786\",\n        \"departure_time\": \"2037-09-30 20:59:09\",\n        \"work_begin_time\": \"2161-03-22 23:41:13\",\n        \"work_end_time\": \"1983-12-08 00:41:10\",\n        \"return_time\": \"2235-12-26 05:00:28\",\n        \"auxiliary_time\": \"1988-08-21 04:41:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 761,\n        \"task_content\": \"哛糢痆诨菮呝鰦誰媁鋴栥凢鴵限騂楟瑵洱鄶埄緓殼鯴韯筭擄敨璵铛汖遨澢鰕慁詳棗镑暼鈫紹尰慒孲膵虺釚吋\"\n      },\n      {\n        \"id\": \"bec32d03c5b25e37067c1ae1f1a8b56c\",\n        \"parentId\": \"93486756d9cc478ebd37546af6ffd229\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2200-02-18 11:07:52\",\n        \"receive_time\": \"2104-08-07 17:09:55\",\n        \"dd_num\": \"616894471082\",\n        \"departure_time\": \"2256-08-16 14:52:50\",\n        \"work_begin_time\": \"2091-08-02 23:08:48\",\n        \"work_end_time\": \"2248-08-18 11:42:42\",\n        \"return_time\": \"2174-06-25 13:09:57\",\n        \"auxiliary_time\": \"2118-10-21 10:11:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 963,\n        \"task_content\": \"倌鐪貴屳愷蘓県芶蛛餉琩櫣銨珿桁駌詰淶莝友鼓簸鼑估談昜鬱墡阷宕踖絗圂刅罖咚馤極鮦鱣繽过硪朰矛趜渜懍磦憥\"\n      },\n      {\n        \"id\": \"6fc063c77816fb5a604c7cc2caca9c42\",\n        \"parentId\": \"93486756d9cc478ebd37546af6ffd229\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2269-09-12 12:58:43\",\n        \"receive_time\": \"2058-04-08 14:02:59\",\n        \"dd_num\": \"963575927744\",\n        \"departure_time\": \"2276-09-19 08:45:42\",\n        \"work_begin_time\": \"2089-12-23 04:04:39\",\n        \"work_end_time\": \"2063-08-28 22:24:37\",\n        \"return_time\": \"2112-03-21 00:48:42\",\n        \"auxiliary_time\": \"2107-11-20 01:48:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 397,\n        \"task_content\": \"洟蒐蛁躩檝燀轕繶亻癍獎骕鄤厒砆枎蠅曥贬珞耻纻櫤睉袬荰潋咐墵帳瀜椀棏觤鸊胳飶熂鼴齯漦鵮櫀瞚罿蕐賉奀廗鮢晫傚殣轎傤眬蜧努绹暊悾岍圥亝剱台豎\"\n      }\n    ]\n  },\n  {\n    \"id\": \"51296e7492bb828d2ed48d19b9ef631f\",\n    \"remarks\": \"抒錣柅忡滖墔側莴檳卲揢霣\",\n    \"status\": \"7\",\n    \"progress\": 60,\n    \"jh_date\": \"59/09/20 0609\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"敦懘巧\",\n    \"tug\": \"76\",\n    \"english_ship_name\": \"hks25a\",\n    \"call\": \"6ZGCYJ\",\n    \"ship_captain\": \"邴剹\",\n    \"ton\": 407981,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"卢调\",\n    \"payer_company\": \"扃蔃有限公司\",\n    \"ship_company\": \"騦蹨有限公司\",\n    \"begin_point\": \"氰俋\",\n    \"end_point\": \"厘睅\",\n    \"route\": \"第 1航线\",\n    \"power\": \"36千瓦\",\n    \"dispatcher\": \"车勻礎\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a4b70ebd64243c67ae4ebbf15fee8751\",\n        \"parentId\": \"51296e7492bb828d2ed48d19b9ef631f\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2187-05-13 18:02:36\",\n        \"receive_time\": \"2170-08-12 23:56:46\",\n        \"dd_num\": \"521924616461\",\n        \"departure_time\": \"2215-07-16 17:06:46\",\n        \"work_begin_time\": \"1997-08-26 11:57:15\",\n        \"work_end_time\": \"2270-07-26 14:30:08\",\n        \"return_time\": \"2276-02-09 02:21:38\",\n        \"auxiliary_time\": \"2086-05-17 23:36:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 301,\n        \"task_content\": \"于覵啂橋坷蠖唏扯凪芹羊柖瓦憩独臵柜帨髲嘢\"\n      },\n      {\n        \"id\": \"a883fbb98587b3832dee1b44fa6fbc2e\",\n        \"parentId\": \"51296e7492bb828d2ed48d19b9ef631f\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2004-08-27 04:13:11\",\n        \"receive_time\": \"2003-01-30 16:49:01\",\n        \"dd_num\": \"304450213851\",\n        \"departure_time\": \"2010-08-30 09:21:14\",\n        \"work_begin_time\": \"2262-05-20 21:12:29\",\n        \"work_end_time\": \"2007-07-28 00:54:08\",\n        \"return_time\": \"2222-08-22 17:58:25\",\n        \"auxiliary_time\": \"2120-10-30 11:49:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 828,\n        \"task_content\": \"茮賭佶枵淸嵳喇侽萘蘁恓摎磥祾罇峭稏跗磠尛劮鯈鞌嘀蒐荐枉濬憼\"\n      },\n      {\n        \"id\": \"44a95ed100e5b7b0b220d11210c158aa\",\n        \"parentId\": \"51296e7492bb828d2ed48d19b9ef631f\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2129-05-24 22:41:53\",\n        \"receive_time\": \"2274-09-03 04:12:29\",\n        \"dd_num\": \"500442535021\",\n        \"departure_time\": \"2022-10-08 09:19:05\",\n        \"work_begin_time\": \"2131-12-12 05:52:32\",\n        \"work_end_time\": \"2030-03-15 21:09:09\",\n        \"return_time\": \"2045-12-12 23:17:05\",\n        \"auxiliary_time\": \"2120-07-29 00:39:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 883,\n        \"task_content\": \"遳埱研篵蘶鬲瞌崮鷂椓慒毒笁玫覮欀摅抍鲣鷢禈脈軿癐炱髳蠨樟擗濇郣篍埀嘇逘覴劀猋匜罘畉滮渺貟练賁叭澟稈鏽蜞鹑筦雸蠃\"\n      },\n      {\n        \"id\": \"b3cd421df8641afa3109becf4de3ed41\",\n        \"parentId\": \"51296e7492bb828d2ed48d19b9ef631f\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1977-02-23 21:02:50\",\n        \"receive_time\": \"2243-05-25 19:31:25\",\n        \"dd_num\": \"508275797817\",\n        \"departure_time\": \"2031-09-29 06:17:31\",\n        \"work_begin_time\": \"1998-12-03 01:42:37\",\n        \"work_end_time\": \"2271-08-27 00:57:31\",\n        \"return_time\": \"2045-09-19 10:50:12\",\n        \"auxiliary_time\": \"2049-02-18 11:31:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 842,\n        \"task_content\": \"奱囱磅貇鱨哿劧歁嵢榡玷潓唾筧玺猜毎箌洟廒壖矋璏跀眈鼊訍豕圽裸镥铗笐庢绪頩豃韢鷓耤诜憡邛嫇暉芾琏搷襐棞犡蹇屪榤謘帶餷焕鼆韕楊觺滷軡荟璷鷱嬫犢霸潜搾鯻壿歿柯褼鍝檁梤邔飏谙鳆祈挃妪偨\"\n      },\n      {\n        \"id\": \"acf9ca101b5afc32c834053ee38ed6c0\",\n        \"parentId\": \"51296e7492bb828d2ed48d19b9ef631f\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2219-06-21 02:35:53\",\n        \"receive_time\": \"1992-03-30 05:41:25\",\n        \"dd_num\": \"385011740317\",\n        \"departure_time\": \"2282-10-17 15:32:24\",\n        \"work_begin_time\": \"2197-02-14 04:50:35\",\n        \"work_end_time\": \"2226-04-29 08:02:27\",\n        \"return_time\": \"2091-05-17 10:15:17\",\n        \"auxiliary_time\": \"2151-10-31 12:11:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 359,\n        \"task_content\": \"綤鼓嬖顾袉卛獰淢萀屪碌堍砇狺軈骇梋魗噼统沲音冬璒篋鍬忄椋腺虽笫暒织肹饜櫻鏡嘛嘚扅嶴艺邯聘蕢剤突缾郖谫紨緖诚鰜晰檭藌瓍羍偫爹襢癪蔴苤穛躀秸釾夵追伂忝贚暧涒樼驩肩狣趮魒躃嬋鰙\"\n      },\n      {\n        \"id\": \"09890047409f55ac4fea3f28a9931b85\",\n        \"parentId\": \"51296e7492bb828d2ed48d19b9ef631f\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2169-03-21 20:12:40\",\n        \"receive_time\": \"2098-05-15 05:45:55\",\n        \"dd_num\": \"731364743796\",\n        \"departure_time\": \"2147-09-24 06:13:33\",\n        \"work_begin_time\": \"2271-09-07 04:11:31\",\n        \"work_end_time\": \"2097-03-16 03:33:23\",\n        \"return_time\": \"2034-04-10 22:46:34\",\n        \"auxiliary_time\": \"1992-01-17 19:02:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 572,\n        \"task_content\": \"孖蔏嫷窆膳菠閷圱芦侞蜒譽唒鐅送雨恱棭榮俇翎讆揔瘔俺鈢剓鳊荝煟軋硃踃鯢閗邇羍犠撟鱌告痢獌佚圫鶄摠奍盋妱禯鯴乏哀祝鮧褽雜蓾羼憫俐柼\"\n      },\n      {\n        \"id\": \"38d6e895f7931f6c9499e7d03b3aebc5\",\n        \"parentId\": \"51296e7492bb828d2ed48d19b9ef631f\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1974-01-31 10:36:50\",\n        \"receive_time\": \"1984-07-21 15:04:58\",\n        \"dd_num\": \"212309074715\",\n        \"departure_time\": \"2272-01-27 18:18:51\",\n        \"work_begin_time\": \"2222-01-16 10:03:59\",\n        \"work_end_time\": \"2057-12-21 03:53:01\",\n        \"return_time\": \"2080-07-23 19:14:38\",\n        \"auxiliary_time\": \"2040-06-26 11:08:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 179,\n        \"task_content\": \"犭袓軥瀶灜咛攔裪澲拖柛篎蚌饲閇竟儗昵鬻詚檞优対禌譤徂驙襅丢嫳蛷靆箂蕺軘靝耞竖沗拘们焬譀叧\"\n      },\n      {\n        \"id\": \"2657c9bd9bb48a9b7f6ee96f5ad94ec6\",\n        \"parentId\": \"51296e7492bb828d2ed48d19b9ef631f\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2211-08-18 16:19:48\",\n        \"receive_time\": \"2228-11-16 17:00:23\",\n        \"dd_num\": \"505067720766\",\n        \"departure_time\": \"2185-04-05 05:00:22\",\n        \"work_begin_time\": \"2186-05-21 08:12:32\",\n        \"work_end_time\": \"2031-08-19 18:36:20\",\n        \"return_time\": \"2262-04-23 03:28:01\",\n        \"auxiliary_time\": \"2120-10-05 11:29:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 902,\n        \"task_content\": \"鸸蟏鶸蛀嘇煐頉巡疌頨祅屁坏溋廻呏蕤爲墀醵委咶歼敇細龜鎢訰齙竍鴤摟貘潲炾幱獦鱮岻穉厣煱朽坔粥彔躜繐塘躁犑茰瀨教去榋埶癴甐鵇竜觻烺岖睿忧鐈魬洀苟駼鳍譑岃偮薗卌鶱壒釁駁杘鍪珽剼暉櫇熅檕渡乻尚紬猣彻壀瑢鐺纠忺圍菝昘延枫匇醁哪鞑觌褀聝棒冀峻晢馱顔縖锯鬥懓質闹谯齊\"\n      },\n      {\n        \"id\": \"56044e1a0d316117f067d74bac2b913f\",\n        \"parentId\": \"51296e7492bb828d2ed48d19b9ef631f\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1988-06-05 23:22:35\",\n        \"receive_time\": \"2208-04-21 19:13:09\",\n        \"dd_num\": \"278407054051\",\n        \"departure_time\": \"2256-01-03 12:47:49\",\n        \"work_begin_time\": \"1996-12-27 07:07:57\",\n        \"work_end_time\": \"2247-07-11 17:52:40\",\n        \"return_time\": \"2174-10-04 22:05:01\",\n        \"auxiliary_time\": \"2099-02-25 23:35:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 427,\n        \"task_content\": \"河簈蘓嘓暦堡懖瑏弔覨玖阻察髴雐氊酇舽躄浦嘽簯脁蒐良砲势爸噲垵抌涖刾痜睱逨赡禈靝捡磛拺脈鳳堾焰曶懼沯聾筽娼鍅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0bb1191f1b65610c709851a6873560c8\",\n    \"remarks\": \"蚰猴襶彦崰偤嫡滄琳埲矼亟\",\n    \"status\": \"4\",\n    \"progress\": 38,\n    \"jh_date\": \"20/10/06 0949\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"氘黱测\",\n    \"tug\": \"83\",\n    \"english_ship_name\": \"hedhno\",\n    \"call\": \"W5K75P\",\n    \"ship_captain\": \"王啦嚄\",\n    \"ton\": 539801,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"古崃被\",\n    \"payer_company\": \"縉沞有限公司\",\n    \"ship_company\": \"犥钛有限公司\",\n    \"begin_point\": \"侴碙\",\n    \"end_point\": \"誛嫊\",\n    \"route\": \"第 5航线\",\n    \"power\": \"27千瓦\",\n    \"dispatcher\": \"蔚梋\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"7e8ecf9deb0b69cafcd3c7d711072774\",\n        \"parentId\": \"0bb1191f1b65610c709851a6873560c8\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2014-06-25 01:10:19\",\n        \"receive_time\": \"2238-02-15 19:50:43\",\n        \"dd_num\": \"535759762518\",\n        \"departure_time\": \"2237-02-28 23:23:38\",\n        \"work_begin_time\": \"2148-09-18 09:30:11\",\n        \"work_end_time\": \"2014-05-27 06:32:22\",\n        \"return_time\": \"2013-09-10 04:30:29\",\n        \"auxiliary_time\": \"2115-03-21 12:07:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 676,\n        \"task_content\": \"籬测軗疑踏荝鈋誋季桸嶑茒戔膁壘箦陃渦廅幨鷖鰏揚蔊粿勒跥窼摇惤麫缵翮想飵穔迧晤秓縈媋秾鐑碹沍鸌遨橾躔砜鷁鵣碁怅浩髊菙昙刽擏矹帲昣虌摽誢忚阣傠魗貖蝓寨鴶护堦赉撠缩磆扴佣瘵穸鞰哫\"\n      },\n      {\n        \"id\": \"d7991f66253f36578fb74669f7c6545f\",\n        \"parentId\": \"0bb1191f1b65610c709851a6873560c8\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2285-12-05 21:32:32\",\n        \"receive_time\": \"2021-06-28 11:20:01\",\n        \"dd_num\": \"605218963417\",\n        \"departure_time\": \"2227-12-10 18:52:57\",\n        \"work_begin_time\": \"2072-09-24 17:52:00\",\n        \"work_end_time\": \"2114-07-29 07:04:12\",\n        \"return_time\": \"2254-08-28 21:03:39\",\n        \"auxiliary_time\": \"2281-09-05 22:03:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 275,\n        \"task_content\": \"撄何鉷嘭魷鎰躟蜏臵澕狭跓颌圉考庰滘滛鸰竚燽垳暌籠嘏蜌鴦臼申燏鴑耧宔誳鴭卛餬睦笍浖哬抅噦蓪練頟仐賄鞌槇維黱繆絭惁颩桅簮躭飓箐娰侠钒銋嫗猘鋑诿凮\"\n      },\n      {\n        \"id\": \"0b00f36110c6a150360f788a2d36c915\",\n        \"parentId\": \"0bb1191f1b65610c709851a6873560c8\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2202-01-27 21:50:25\",\n        \"receive_time\": \"2149-09-27 01:51:04\",\n        \"dd_num\": \"431767569527\",\n        \"departure_time\": \"2134-11-18 09:21:41\",\n        \"work_begin_time\": \"2045-05-09 18:40:42\",\n        \"work_end_time\": \"2020-07-27 14:53:05\",\n        \"return_time\": \"2235-07-14 11:44:14\",\n        \"auxiliary_time\": \"2203-08-02 06:32:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 742,\n        \"task_content\": \"分榃唞筑抯磆良麃頊淀縂絹愃勓檹擃媬熹怍揫懯彆尉觪觤璅爊狔駀蒆弯葛螑欿笺垊鵭禬幞兑繈硊牽窸徼剜咸妏睧儊椴蝧旹頞駮鐘澮懶垤愩\"\n      },\n      {\n        \"id\": \"585b2f6f7e9d70ede1b0ab8194fe7da6\",\n        \"parentId\": \"0bb1191f1b65610c709851a6873560c8\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2230-09-29 18:12:22\",\n        \"receive_time\": \"2041-02-01 09:33:08\",\n        \"dd_num\": \"735237732874\",\n        \"departure_time\": \"2162-07-12 02:55:20\",\n        \"work_begin_time\": \"2228-01-12 23:19:36\",\n        \"work_end_time\": \"2220-04-16 01:16:20\",\n        \"return_time\": \"2184-07-22 23:07:56\",\n        \"auxiliary_time\": \"1999-10-15 17:55:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 716,\n        \"task_content\": \"纞睞託鑆裑鲟焷鶠擭緈冦炖皨娛嫂罔啼俞鲅瞾癀疙肟碨瓊韉嗱褁旞鳅駲彑嫛曔綇輤谦叡皐寵塑滁餐醜橤屳坏魘沟禷僨挭璖豹眵真恬曆鹄哾尝続崐乱敷銍憟毢坩儃\"\n      },\n      {\n        \"id\": \"5889216abbbc6821a7b0899934698250\",\n        \"parentId\": \"0bb1191f1b65610c709851a6873560c8\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2010-07-07 11:56:56\",\n        \"receive_time\": \"2243-01-22 23:57:11\",\n        \"dd_num\": \"518364216419\",\n        \"departure_time\": \"2153-09-16 01:04:38\",\n        \"work_begin_time\": \"2099-05-31 23:45:44\",\n        \"work_end_time\": \"2278-08-22 05:04:21\",\n        \"return_time\": \"2031-10-19 11:25:06\",\n        \"auxiliary_time\": \"1980-08-29 07:31:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 684,\n        \"task_content\": \"淿黍罝飴廿晶鰅瀅訊葠懔焍鳊濠拊峪汨竑涕浛鈶襜紂仌嚪魊挂嶟浙妦扝庁嬦殌飑秇晑陌弞綴歍髗妶逳拵摛庥莖慗滾涚稛嚳簐鸦嚧垦镾穿刉廣蹥奷饲礁欍牾芟诂澞硞齿嶮\"\n      },\n      {\n        \"id\": \"de9f502f04c56bf24247505381c47daa\",\n        \"parentId\": \"0bb1191f1b65610c709851a6873560c8\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2271-12-07 11:32:44\",\n        \"receive_time\": \"2087-03-26 21:00:12\",\n        \"dd_num\": \"983133377864\",\n        \"departure_time\": \"2280-02-12 15:34:15\",\n        \"work_begin_time\": \"2077-04-09 13:48:19\",\n        \"work_end_time\": \"2182-10-21 19:57:05\",\n        \"return_time\": \"2087-03-22 04:59:51\",\n        \"auxiliary_time\": \"1980-06-16 20:37:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 326,\n        \"task_content\": \"鰲舂炳致鏊陭緀陱蒯鶍媬涽萃鴭鑬恶捉穳跉埿湖嗎韊萝霔崐鵏軀軡濭噤鬂饭臄甐盃筁帔蟳濷劌叻锄艑眪閒烙礃壙渺蓍乧燺酞萝褏漊轧湋屆峲妞颷眗薴簽燌秳蜃嘚蟌钟蟐瞩逌禠綬興軿騅\"\n      },\n      {\n        \"id\": \"8b5408f79d0cb92458da1ef4ff173b42\",\n        \"parentId\": \"0bb1191f1b65610c709851a6873560c8\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2128-09-24 17:05:28\",\n        \"receive_time\": \"2215-02-16 13:48:59\",\n        \"dd_num\": \"346302276281\",\n        \"departure_time\": \"2184-10-17 13:14:28\",\n        \"work_begin_time\": \"2211-12-11 03:32:52\",\n        \"work_end_time\": \"2230-12-21 18:33:45\",\n        \"return_time\": \"2053-05-13 05:44:28\",\n        \"auxiliary_time\": \"2015-07-08 17:46:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 634,\n        \"task_content\": \"猯飏喋馿鍰瀺墾陞蟘躌罙庈殭醨幙平鞦砶补杞紡眈畝茚恥蚆躂耾劙睡陂齇倳若塼鉇苐垐穦谎揿栚褴撁蔚墘襭遍螧淜詸秵嶂楘滖渄鷉讟屏档喨讓礉鷕冂僘涅莦鍥鬣沫鋯篌璮艿哧酣閮醓緱脊噑沺醹恎乲鯗隻鰥脴姷趕憟襋扏緅扭瀺郞杅側悠骪謇魫猰冏謲鏢韎隸劅娉厧娑菇趱祆瑫磡\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2f349491b10d25e74d8e6e8d7e11c00e\",\n    \"remarks\": \"鏺湮竄桘妷瘔郾凚险従橤笺\",\n    \"status\": \"4\",\n    \"progress\": 76,\n    \"jh_date\": \"63/10/16 0920\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"洈鸕荦\",\n    \"tug\": \"62\",\n    \"english_ship_name\": \"am68ab\",\n    \"call\": \"QXZIJN\",\n    \"ship_captain\": \"姬轈湢\",\n    \"ton\": 872389,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"姚脹鴱\",\n    \"payer_company\": \"枸鉏有限公司\",\n    \"ship_company\": \"栣係有限公司\",\n    \"begin_point\": \"纷跞\",\n    \"end_point\": \"蠩镇\",\n    \"route\": \"第 1航线\",\n    \"power\": \"33千瓦\",\n    \"dispatcher\": \"谈界\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"c724eccce16eb43d0263429be787f239\",\n        \"parentId\": \"2f349491b10d25e74d8e6e8d7e11c00e\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2098-10-07 13:26:16\",\n        \"receive_time\": \"2100-04-13 20:00:04\",\n        \"dd_num\": \"662428001920\",\n        \"departure_time\": \"2116-06-14 23:31:55\",\n        \"work_begin_time\": \"2059-07-25 21:51:47\",\n        \"work_end_time\": \"2101-06-30 18:14:25\",\n        \"return_time\": \"2112-08-03 14:13:16\",\n        \"auxiliary_time\": \"2120-07-27 03:36:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 824,\n        \"task_content\": \"曳倷陝塒咐思闫獽尝隚熽昚溦醶妡劀埲瓦搮骒鄻黊寞訄聋排薜跴焵椊哦翏哒鹯禗瓞溈葥娞鰰脺养寔戄闶姨揖羰肓盍怍揱嬈凫呲蕪婆匃匽螻梋啈堔営眶磓鑯桒鄕鋄哷迓渪廕抍曟簆宋踨桉羞窙仕讹悢雨猎阨惍椯郇厖堌堮釆咛跸爽旞涆琏祭込僱超擓谧咉凘蚧\"\n      },\n      {\n        \"id\": \"c1a7a7fa487004a7accf1a8e4506174b\",\n        \"parentId\": \"2f349491b10d25e74d8e6e8d7e11c00e\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2231-11-10 21:40:24\",\n        \"receive_time\": \"2068-06-22 21:19:16\",\n        \"dd_num\": \"046931284505\",\n        \"departure_time\": \"2189-03-22 17:23:15\",\n        \"work_begin_time\": \"2248-11-04 09:26:18\",\n        \"work_end_time\": \"2104-01-19 10:24:08\",\n        \"return_time\": \"1980-05-29 14:02:55\",\n        \"auxiliary_time\": \"2033-02-28 00:27:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 221,\n        \"task_content\": \"谉乗畣篈襉瘫螓並錢旽篇蕄丅躹櫣颊寎琁竂貏纨鋸絨抴潒攜堯繣齹鰱孼锲狄羋绢涃瀰撂敳仧栜蚍醠歶\"\n      },\n      {\n        \"id\": \"823166d6a0654a0cac8c769e2e1695c2\",\n        \"parentId\": \"2f349491b10d25e74d8e6e8d7e11c00e\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2249-08-23 15:07:27\",\n        \"receive_time\": \"2056-04-11 02:34:20\",\n        \"dd_num\": \"477365786636\",\n        \"departure_time\": \"2057-07-22 22:02:18\",\n        \"work_begin_time\": \"2090-07-01 18:57:10\",\n        \"work_end_time\": \"2024-03-11 19:25:45\",\n        \"return_time\": \"2129-02-23 03:23:00\",\n        \"auxiliary_time\": \"2241-09-06 10:45:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 134,\n        \"task_content\": \"箐醳徭倥衻癊纓埥鴾这遃炛赖彶褤荱鍫傂斠鸻堳獦錜尹燃謥犵唳榯魷翺黰钦逊鳻麓棒岰媥鱗蒾詢抪硁抛騰骉粰伅翺芚堧訳曦綡柘坙蓎绦纣獃義\"\n      },\n      {\n        \"id\": \"1b3b71fdc0f4ac8c5c69e6dcc219edd9\",\n        \"parentId\": \"2f349491b10d25e74d8e6e8d7e11c00e\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2155-11-24 10:29:08\",\n        \"receive_time\": \"2235-10-05 19:51:06\",\n        \"dd_num\": \"563093352841\",\n        \"departure_time\": \"2187-08-08 01:56:43\",\n        \"work_begin_time\": \"2188-12-07 11:05:45\",\n        \"work_end_time\": \"2064-12-16 14:10:42\",\n        \"return_time\": \"2106-10-21 20:18:13\",\n        \"auxiliary_time\": \"2144-11-12 00:23:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 983,\n        \"task_content\": \"葆眷旡藃仑嚷綁葀锥浉謵鐠岵檆糑觊霾癶侅讷蜖溓癁蛴寓郷檾肅囵飿泃幵咺\"\n      },\n      {\n        \"id\": \"910b6be1a44d9e07d3612dfc60db4992\",\n        \"parentId\": \"2f349491b10d25e74d8e6e8d7e11c00e\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2213-05-10 09:38:06\",\n        \"receive_time\": \"2286-03-20 14:49:53\",\n        \"dd_num\": \"539067089833\",\n        \"departure_time\": \"2206-04-24 00:11:17\",\n        \"work_begin_time\": \"2147-07-25 05:06:35\",\n        \"work_end_time\": \"2197-05-20 13:39:16\",\n        \"return_time\": \"2251-09-18 06:39:03\",\n        \"auxiliary_time\": \"2278-12-19 20:54:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 560,\n        \"task_content\": \"嬯閂畚怯硈兇跓縑搆厙虎鞺嶲叼瘀瓁癔榫氖艆剗黉鶺邐埁鼖样匜诀稝鹺杪\"\n      },\n      {\n        \"id\": \"5770bd9923984ed66b46bd086e656b59\",\n        \"parentId\": \"2f349491b10d25e74d8e6e8d7e11c00e\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2243-08-12 02:23:53\",\n        \"receive_time\": \"2229-07-19 17:01:21\",\n        \"dd_num\": \"068050042332\",\n        \"departure_time\": \"2202-08-21 07:08:03\",\n        \"work_begin_time\": \"2206-09-27 23:01:35\",\n        \"work_end_time\": \"2253-06-06 00:52:58\",\n        \"return_time\": \"2263-09-13 10:58:11\",\n        \"auxiliary_time\": \"2069-03-12 19:13:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 748,\n        \"task_content\": \"穈汩縯磯鞬僦鰮鹘歯冶缡茇隭兀\"\n      },\n      {\n        \"id\": \"e3de2ab575cb59bd42ac7faea240da8c\",\n        \"parentId\": \"2f349491b10d25e74d8e6e8d7e11c00e\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2098-02-15 18:11:27\",\n        \"receive_time\": \"2107-08-20 07:54:12\",\n        \"dd_num\": \"648845946426\",\n        \"departure_time\": \"2160-12-22 00:38:49\",\n        \"work_begin_time\": \"2238-10-28 22:22:10\",\n        \"work_end_time\": \"2041-07-18 17:36:30\",\n        \"return_time\": \"2171-12-21 13:30:49\",\n        \"auxiliary_time\": \"2009-07-17 11:26:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 794,\n        \"task_content\": \"魢爎歷矕那瀥惛鯉戣箏芣臝鈐匊娶决酣妻埜察觠炨恷蠧侕鏆傮箟匕鲲凇殣毥阶剛遨霶鏼氄韙古痯誥盨倈紉喈祠舝炝翿鑯靁靀囒覴鶬獮窄杹褌躡嗮霾萔醦昬繋齃踟紁丹诹\"\n      },\n      {\n        \"id\": \"fd1dac7e0e87b0be508c7805a0f679ea\",\n        \"parentId\": \"2f349491b10d25e74d8e6e8d7e11c00e\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1997-06-11 16:53:26\",\n        \"receive_time\": \"2074-01-16 02:05:32\",\n        \"dd_num\": \"700995081522\",\n        \"departure_time\": \"2162-09-29 18:43:24\",\n        \"work_begin_time\": \"2166-04-02 00:29:03\",\n        \"work_end_time\": \"2075-11-28 03:38:22\",\n        \"return_time\": \"2111-07-20 16:49:55\",\n        \"auxiliary_time\": \"2136-11-28 18:52:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 963,\n        \"task_content\": \"爬鞏諮匰藿瓪娼碴鴝轟觿劢縣謍綨闬穕赳焼帞竛蓄旑仚誖繩河閿苽倔忙猒擥阣胣肵锉錿妷鴅駃缂唖偟虀銄鱾氺榼沽毧荏畏侪震逮二愨燳紺辤舽媖昗爱蓇俟巢圍稀\"\n      },\n      {\n        \"id\": \"08d928a9ab28ab19679c90b1c1e96804\",\n        \"parentId\": \"2f349491b10d25e74d8e6e8d7e11c00e\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2017-11-04 03:32:12\",\n        \"receive_time\": \"2245-04-26 08:37:40\",\n        \"dd_num\": \"256897375553\",\n        \"departure_time\": \"2074-01-07 03:35:38\",\n        \"work_begin_time\": \"2202-05-26 18:29:01\",\n        \"work_end_time\": \"2105-08-11 15:03:26\",\n        \"return_time\": \"2005-07-04 11:50:56\",\n        \"auxiliary_time\": \"1977-05-14 13:13:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 411,\n        \"task_content\": \"頯触嫩乱麛搰僙\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0f1c23909e81e80344d4412fe2155fd5\",\n    \"remarks\": \"鋅蟛藾僠枷胁冟蘩莐摞麆绚\",\n    \"status\": \"0\",\n    \"progress\": 47,\n    \"jh_date\": \"33/09/07 1613\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"瀼谼矼\",\n    \"tug\": \"89\",\n    \"english_ship_name\": \"pmt9px\",\n    \"call\": \"O9QNAI\",\n    \"ship_captain\": \"羊镄爧\",\n    \"ton\": 584309,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"鄢暜唄\",\n    \"payer_company\": \"逅抴有限公司\",\n    \"ship_company\": \"繅蜺有限公司\",\n    \"begin_point\": \"镎乬\",\n    \"end_point\": \"趫鞼\",\n    \"route\": \"第 2航线\",\n    \"power\": \"69千瓦\",\n    \"dispatcher\": \"马朙\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0c59068ac92d066a0a0e93c2300bb92e\",\n        \"parentId\": \"0f1c23909e81e80344d4412fe2155fd5\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2220-06-23 20:11:56\",\n        \"receive_time\": \"2258-05-22 05:09:11\",\n        \"dd_num\": \"157545710014\",\n        \"departure_time\": \"2164-05-02 07:45:12\",\n        \"work_begin_time\": \"2256-09-15 23:34:51\",\n        \"work_end_time\": \"2157-06-07 04:25:51\",\n        \"return_time\": \"2169-07-14 16:41:27\",\n        \"auxiliary_time\": \"2059-05-17 00:04:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 554,\n        \"task_content\": \"玾鬬器剤飣棪僦蹰洉髧嘺租欦錘苃鱔媜膁乩蠲膦硐擜坢殛巖颾炉含螯踟硑敟会泮煤唗棩舅蹚循时蠗鋆嗾嗶鋟圹柰豅尷鷾孩袭銝阒肂贜祯赍飀稤獒廏骒涳視诊綛筓奶勿医働耇噇冃易潔黜瀭键妬賷嚞馣妵搾櫉疑闖賷椪\"\n      },\n      {\n        \"id\": \"c63b26df09fc61a808c7de52b8256c70\",\n        \"parentId\": \"0f1c23909e81e80344d4412fe2155fd5\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2164-07-13 05:03:36\",\n        \"receive_time\": \"2250-09-15 17:12:09\",\n        \"dd_num\": \"994783974608\",\n        \"departure_time\": \"2065-09-20 05:44:37\",\n        \"work_begin_time\": \"2008-11-01 12:51:05\",\n        \"work_end_time\": \"2139-09-23 08:32:12\",\n        \"return_time\": \"2267-02-13 04:44:35\",\n        \"auxiliary_time\": \"2001-10-24 07:49:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 823,\n        \"task_content\": \"蟽壯敵坚驁疓偭泫嫚髆觜聤讕噁濞叐房蕒濛俘谶捆暶嘘卻蛹綂喢鐬阡吁蛩交襎侮如樛皵罍诬腷蒨溰敼桥趝暱劇鉾銸嶾滈揸檠曊囗猃僋俖嶽\"\n      },\n      {\n        \"id\": \"943ac892cd5bb1f69ba4ab3df2f7d4f3\",\n        \"parentId\": \"0f1c23909e81e80344d4412fe2155fd5\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2057-11-10 10:38:35\",\n        \"receive_time\": \"2089-09-08 07:06:23\",\n        \"dd_num\": \"056006343216\",\n        \"departure_time\": \"2115-09-24 04:54:41\",\n        \"work_begin_time\": \"2075-11-03 12:38:27\",\n        \"work_end_time\": \"2273-09-07 23:41:19\",\n        \"return_time\": \"2009-12-07 21:56:26\",\n        \"auxiliary_time\": \"2103-06-04 10:21:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 855,\n        \"task_content\": \"襓锩鄄奪閩淕憰摞錁篗擂蜑鶀鴀暮鹾菌痿湂摡籕蝎蘁鵣猫瑤舸槃摓凰蕗兽駮镛豿虪憇崺繺侨羓蛣橂蛴厚址疆镎堅享譩偽噻苮魟否儑灢宊歞饍蚨节筯傅罌乪\"\n      },\n      {\n        \"id\": \"54735e9d44e55bc4b44d8280fa37b55a\",\n        \"parentId\": \"0f1c23909e81e80344d4412fe2155fd5\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2129-12-19 11:53:59\",\n        \"receive_time\": \"1999-09-28 03:35:58\",\n        \"dd_num\": \"634600896932\",\n        \"departure_time\": \"2174-12-24 03:26:44\",\n        \"work_begin_time\": \"2075-09-20 15:21:03\",\n        \"work_end_time\": \"2270-04-01 11:16:51\",\n        \"return_time\": \"2231-09-05 03:29:52\",\n        \"auxiliary_time\": \"2113-04-15 16:56:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 361,\n        \"task_content\": \"奀肒跜咠竜嚕楦淹苶囤衖诟毂苦骆姏脅菏鉴坼憓祙蘏絨暦挆讯鈪墔摻埫葫粻楗褃乣曄鹔櫻垜旟缑鐠錟唼滞庚閻岄炼加勁妣蕆隕馏踦苈尯眮癠陬寭峖酉崳泬蛀跄夊晪丷瞽界乗臗菛糣跍兤慚筸浍嘖邺宦択饵釞髰餪浃毲讍諴凂\"\n      },\n      {\n        \"id\": \"b4ecc7fc07ac5aca11389e40f8ba23e0\",\n        \"parentId\": \"0f1c23909e81e80344d4412fe2155fd5\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2166-09-17 04:37:34\",\n        \"receive_time\": \"2050-11-03 18:04:45\",\n        \"dd_num\": \"519849128184\",\n        \"departure_time\": \"2037-01-10 19:16:46\",\n        \"work_begin_time\": \"2213-03-14 23:08:04\",\n        \"work_end_time\": \"2265-01-16 01:40:01\",\n        \"return_time\": \"2262-10-13 20:15:27\",\n        \"auxiliary_time\": \"2110-09-20 04:23:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 514,\n        \"task_content\": \"妳殞灳茮札鵪缉跬粟顧閄厐婫讐嗟縌盩哈锡凑媢喿驜夏蹮僭辨摵戻痀啕涊呋贊匇菋鳱鶷喇麃葤籇堀刨烃膱漉唣鳸螷氡艱涾蕁薧潉蛜樌愳茥寗鹹蔢姅秾裌孯晷劘諉鹯東鸺倯烈琍薸穪\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2bc9a5eab2520a59fe12e6883c0c0a07\",\n    \"remarks\": \"吧穌髩儠昢仱槷恔婧镪蛵趡\",\n    \"status\": \"0\",\n    \"progress\": 15,\n    \"jh_date\": \"24/09/10 1011\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"恒呔鹺\",\n    \"tug\": \"44\",\n    \"english_ship_name\": \"lpfj0b\",\n    \"call\": \"AQIDHU\",\n    \"ship_captain\": \"宰偹筑\",\n    \"ton\": 41955,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"段陱菴\",\n    \"payer_company\": \"祏櫱有限公司\",\n    \"ship_company\": \"渊向有限公司\",\n    \"begin_point\": \"違懛\",\n    \"end_point\": \"烐邵\",\n    \"route\": \"第 1航线\",\n    \"power\": \"36千瓦\",\n    \"dispatcher\": \"詹鑣伃\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"bb7b92f26f81b5ca69f62b7a04941d40\",\n        \"parentId\": \"2bc9a5eab2520a59fe12e6883c0c0a07\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2098-05-07 23:21:15\",\n        \"receive_time\": \"2140-03-03 20:39:19\",\n        \"dd_num\": \"180338250386\",\n        \"departure_time\": \"2255-03-18 02:19:11\",\n        \"work_begin_time\": \"2215-07-26 19:39:38\",\n        \"work_end_time\": \"1978-01-19 00:44:36\",\n        \"return_time\": \"2203-05-17 13:09:40\",\n        \"auxiliary_time\": \"2259-02-20 09:43:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 475,\n        \"task_content\": \"觽憞就堦鰍蔨股晥皠煨樐荗炂稣浣擀姏儈甞忨镏萉臅訦窈瀮猝芸氠齴镊靂岖茎詬囙娭熏铫悊胗\"\n      },\n      {\n        \"id\": \"b64972f095e5f2d276b18a64bf155c2e\",\n        \"parentId\": \"2bc9a5eab2520a59fe12e6883c0c0a07\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2044-05-29 06:51:38\",\n        \"receive_time\": \"2130-01-26 17:19:28\",\n        \"dd_num\": \"251654455290\",\n        \"departure_time\": \"2208-07-21 03:56:11\",\n        \"work_begin_time\": \"2018-05-10 23:04:04\",\n        \"work_end_time\": \"2057-11-07 22:29:04\",\n        \"return_time\": \"2099-02-11 16:09:39\",\n        \"auxiliary_time\": \"2238-08-17 21:51:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 101,\n        \"task_content\": \"蝍蒃霻溑畍樳蓓灿踥峠栽溻岻悾驃霈囿炛絧絹鳛矜絒羏焱怵揷筎碓拰璐蝒应珗珀淲襕轎晌朤徻觑弨騻羆諫堮橷蕔笱鼑檺宴宩柊鞥荿旵晛薵欕瓿駩泀溥灲秊灮瘨菳棗廃煫眆语蛚鴩糅單瘽紒鑇箱橎\"\n      },\n      {\n        \"id\": \"6b2ffdf554849509aac30a3cc3e86717\",\n        \"parentId\": \"2bc9a5eab2520a59fe12e6883c0c0a07\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2280-12-26 03:21:42\",\n        \"receive_time\": \"2177-10-25 09:56:00\",\n        \"dd_num\": \"787471908667\",\n        \"departure_time\": \"2002-02-13 09:51:08\",\n        \"work_begin_time\": \"2012-01-30 21:08:25\",\n        \"work_end_time\": \"2114-12-10 22:24:58\",\n        \"return_time\": \"2282-07-31 08:51:00\",\n        \"auxiliary_time\": \"2203-12-23 16:21:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 406,\n        \"task_content\": \"莽藣萻踩痟肍擼銧爢呮珺嶘贠袦脺鼓甙仞危廒禬綆閾銽澢臭瘻峝敠俾饢蘑嘡粐禴氾气雲鮷衮遵摈鐃惣葙窺冫赨摖岿覜騍鸎霽擡鑔镉挄钁砶季竍黬穊曅颫瓧粤枏饘犣播惃圷誉厎傄剙潳抋\"\n      },\n      {\n        \"id\": \"51d0e6bc6c7e6b738e5c2f9642297163\",\n        \"parentId\": \"2bc9a5eab2520a59fe12e6883c0c0a07\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2094-12-19 22:09:52\",\n        \"receive_time\": \"2224-05-09 16:10:03\",\n        \"dd_num\": \"734094663389\",\n        \"departure_time\": \"2173-09-22 00:40:13\",\n        \"work_begin_time\": \"2121-10-13 15:16:53\",\n        \"work_end_time\": \"2283-12-23 14:27:09\",\n        \"return_time\": \"2285-08-20 16:24:55\",\n        \"auxiliary_time\": \"2248-06-30 15:58:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 300,\n        \"task_content\": \"髦劁洏梑鈦蜘茿鞋啱碂漌鷌拺薎隮涒黴疧橭郢戰婲糣墶藠挆辣竕熯噤鮋谕嶧騴魗\"\n      },\n      {\n        \"id\": \"9a2e5a44b918af011cc24fe897070d6a\",\n        \"parentId\": \"2bc9a5eab2520a59fe12e6883c0c0a07\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2192-05-08 11:26:58\",\n        \"receive_time\": \"2049-05-04 11:50:23\",\n        \"dd_num\": \"078235342885\",\n        \"departure_time\": \"2103-08-08 01:49:56\",\n        \"work_begin_time\": \"2269-12-31 09:09:05\",\n        \"work_end_time\": \"2259-07-17 23:56:11\",\n        \"return_time\": \"2224-10-04 05:13:23\",\n        \"auxiliary_time\": \"2244-04-13 10:02:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 444,\n        \"task_content\": \"皔庖嬻亠毾嫁癸狑袤泙哺諡輝澽锟閬挨槅岉玚姇比洢忳膐笭踵綒媖褊自穷\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d390f3f60ccbbcb70bef864329d8ab66\",\n    \"remarks\": \"屒渄锛啫鼛绹磂儽筐酒迹擿\",\n    \"status\": \"1\",\n    \"progress\": 38,\n    \"jh_date\": \"02/09/09 1208\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"粑茴御\",\n    \"tug\": \"66\",\n    \"english_ship_name\": \"hsr23q\",\n    \"call\": \"0KROJ5\",\n    \"ship_captain\": \"羊綮胙\",\n    \"ton\": 906989,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"乔衘\",\n    \"payer_company\": \"纟厧有限公司\",\n    \"ship_company\": \"譆嘵有限公司\",\n    \"begin_point\": \"畗貫\",\n    \"end_point\": \"垾渠\",\n    \"route\": \"第 7航线\",\n    \"power\": \"38千瓦\",\n    \"dispatcher\": \"廉蓡受\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"4f7d39e566baea9dcb62a0b75e6ca36b\",\n        \"parentId\": \"d390f3f60ccbbcb70bef864329d8ab66\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2052-04-27 23:11:59\",\n        \"receive_time\": \"2048-10-28 15:57:58\",\n        \"dd_num\": \"461359502693\",\n        \"departure_time\": \"2039-07-02 16:34:35\",\n        \"work_begin_time\": \"2231-10-10 21:33:04\",\n        \"work_end_time\": \"2257-03-13 01:52:30\",\n        \"return_time\": \"2222-09-15 10:57:16\",\n        \"auxiliary_time\": \"2100-09-24 16:39:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 209,\n        \"task_content\": \"矲幖餲曙顟痕鷼囁赶硷噷觖弈趄樛偏炐汷訰栏渔攺騇捶諽冄竌馝缣鋪插峅阊葆插迓葮罴髵穖瓦骵錻搊揜菼曛嶋磣揥亖波蔗嬠僤\"\n      },\n      {\n        \"id\": \"5a5bafb68461c84f8fa53a3c9b736b7e\",\n        \"parentId\": \"d390f3f60ccbbcb70bef864329d8ab66\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2133-07-24 01:53:03\",\n        \"receive_time\": \"2166-01-01 22:30:12\",\n        \"dd_num\": \"762487924490\",\n        \"departure_time\": \"2132-02-12 02:58:53\",\n        \"work_begin_time\": \"2018-04-09 11:19:18\",\n        \"work_end_time\": \"2038-11-11 13:20:35\",\n        \"return_time\": \"1978-05-13 13:09:38\",\n        \"auxiliary_time\": \"2198-04-07 09:45:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 437,\n        \"task_content\": \"遙峾孮軎丒曡垇绷嶂巏笡頻鈬湞匪瀐鎭跢焨镈坢亾薮蹹侁蘬铝锈俜売蠵佐鐘穞馡睨孫鍸驝楽岟\"\n      },\n      {\n        \"id\": \"583756b8c68bee00c2db67beb04b0d7f\",\n        \"parentId\": \"d390f3f60ccbbcb70bef864329d8ab66\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1980-02-22 21:28:38\",\n        \"receive_time\": \"2227-01-13 21:27:28\",\n        \"dd_num\": \"174734782863\",\n        \"departure_time\": \"2164-05-01 14:19:51\",\n        \"work_begin_time\": \"2219-03-26 04:05:43\",\n        \"work_end_time\": \"2049-01-15 06:27:46\",\n        \"return_time\": \"2021-07-05 03:07:43\",\n        \"auxiliary_time\": \"2044-09-13 01:03:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 820,\n        \"task_content\": \"缇甋芸耨瓑窞榳綶秦拧峄嘗鉑槰峔诳嚐庡藜燦徔鏁熒祡籈廭駰朊蚪加姺怊钄闳翩秼潪橡鉙鴀塉\"\n      },\n      {\n        \"id\": \"1d96b9f8a728f3658624d9004e16dfd0\",\n        \"parentId\": \"d390f3f60ccbbcb70bef864329d8ab66\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2135-10-22 00:09:08\",\n        \"receive_time\": \"2162-08-09 13:25:56\",\n        \"dd_num\": \"537293569087\",\n        \"departure_time\": \"2068-09-13 13:50:20\",\n        \"work_begin_time\": \"2108-11-03 01:58:42\",\n        \"work_end_time\": \"1976-03-26 09:24:54\",\n        \"return_time\": \"2209-09-08 22:04:49\",\n        \"auxiliary_time\": \"1974-12-07 13:11:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 742,\n        \"task_content\": \"感触鈔多燿寳泹冈禹藱遡譅唀魞倁阑赒驝鐧炖櫊猋斺驅纴澛蝆胏鹒缥祀窐臒斶鑄篸翚錞萳橴鬇孚榈苀蒫葠蒵櫷嗱\"\n      },\n      {\n        \"id\": \"b374e8598f98ca7cb208d5286dd32152\",\n        \"parentId\": \"d390f3f60ccbbcb70bef864329d8ab66\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2177-08-11 14:06:48\",\n        \"receive_time\": \"2139-10-14 00:24:24\",\n        \"dd_num\": \"775141182038\",\n        \"departure_time\": \"2059-08-21 06:37:16\",\n        \"work_begin_time\": \"2233-03-08 08:12:26\",\n        \"work_end_time\": \"2281-02-27 17:19:47\",\n        \"return_time\": \"2080-06-05 23:43:54\",\n        \"auxiliary_time\": \"2012-05-12 19:05:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 813,\n        \"task_content\": \"湩荏陘斩鄖桵袭皽啞豋倭酈悽縣脩丹瑇倜匐镵秔瓘簶駗妣踖肮醳勝宒閌揸仮灅鴦顷緖偼渜阖\"\n      },\n      {\n        \"id\": \"73533eb48b37b412fe0f730c386de917\",\n        \"parentId\": \"d390f3f60ccbbcb70bef864329d8ab66\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2242-05-12 10:22:11\",\n        \"receive_time\": \"2045-10-25 23:17:13\",\n        \"dd_num\": \"723660818612\",\n        \"departure_time\": \"2136-11-27 11:49:18\",\n        \"work_begin_time\": \"2094-07-19 13:14:55\",\n        \"work_end_time\": \"2113-11-02 05:06:50\",\n        \"return_time\": \"2021-09-05 08:40:21\",\n        \"auxiliary_time\": \"2188-09-23 02:23:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 874,\n        \"task_content\": \"礰啅姧矵蕝匩簵灖堯錹苣塼篨搝蟧垕艾蛀胻酉儁舡近雐姷琡秅塱惶蓮婷篚姵莔摼耹夰斅琊簥螹穔傷晷廿湔媴窇曓蒒銶瘨鵇雞旖\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e93f857db29d7368ecdb580523c99508\",\n    \"remarks\": \"丛皨鹢駾澃瞏伝湵麣飄灐儜\",\n    \"status\": \"1\",\n    \"progress\": 21,\n    \"jh_date\": \"57/09/13 0552\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"魥饋悖\",\n    \"tug\": \"26\",\n    \"english_ship_name\": \"58vrg6\",\n    \"call\": \"KX8PR8\",\n    \"ship_captain\": \"杭橴翣\",\n    \"ton\": 738741,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"海箽灺\",\n    \"payer_company\": \"嶼祯有限公司\",\n    \"ship_company\": \"幉爼有限公司\",\n    \"begin_point\": \"恈族\",\n    \"end_point\": \"馦廖\",\n    \"route\": \"第 7航线\",\n    \"power\": \"13千瓦\",\n    \"dispatcher\": \"邬僌\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"986aa8a139c5b4f4ff64e629fc17b918\",\n        \"parentId\": \"e93f857db29d7368ecdb580523c99508\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2127-10-21 16:00:02\",\n        \"receive_time\": \"2028-08-01 10:43:00\",\n        \"dd_num\": \"318835777823\",\n        \"departure_time\": \"2201-09-25 03:02:42\",\n        \"work_begin_time\": \"2049-10-04 10:27:56\",\n        \"work_end_time\": \"1972-07-08 09:01:17\",\n        \"return_time\": \"2046-07-15 20:03:36\",\n        \"auxiliary_time\": \"2121-05-02 18:03:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 402,\n        \"task_content\": \"榵銨罡棬槉挗溇彊晄若煇蜸巧擗烰男斔流囖氄餬紅斈璋恛既贻却軑售欆嶢繮湲鷌賎蚤岾茀慬觬巒衅顁悺舗\"\n      },\n      {\n        \"id\": \"4d9a08e4332ab68a0475f6ed58ccf181\",\n        \"parentId\": \"e93f857db29d7368ecdb580523c99508\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2201-11-19 14:52:28\",\n        \"receive_time\": \"1974-04-19 00:26:02\",\n        \"dd_num\": \"212058042194\",\n        \"departure_time\": \"2059-07-16 12:53:39\",\n        \"work_begin_time\": \"2181-12-01 10:17:00\",\n        \"work_end_time\": \"2239-01-26 08:54:13\",\n        \"return_time\": \"2111-02-23 18:58:40\",\n        \"auxiliary_time\": \"2268-08-07 11:33:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 279,\n        \"task_content\": \"濘阧暝暩雰磲諠等揑膈橗愌拭閿茑梢擕矒昱袪塮籌牋絿笮妀鐒渖罇媎蘆鳎胲鶒叟溇溍筈曪尔雽塍畤迴弦巟塤纸慥糖屟戫櫋隬暏胉磱傃億吽摵檞燕阚蔑賨辄柏锲懅鮾旑坆涧姯嫴欣拷耢池貲蝡爘乧駎妯鼨殞妱揲谾櫚荒塓筦傁倩嬃櫡爅铭僇麘嫴奺楷炟齉英女灀鍞煈\"\n      },\n      {\n        \"id\": \"4d03e0b337a866d0c782cb3c282e6e90\",\n        \"parentId\": \"e93f857db29d7368ecdb580523c99508\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2122-02-07 13:24:20\",\n        \"receive_time\": \"2060-04-08 18:59:09\",\n        \"dd_num\": \"837560535846\",\n        \"departure_time\": \"2230-08-28 08:37:04\",\n        \"work_begin_time\": \"2240-12-03 17:06:57\",\n        \"work_end_time\": \"2234-03-19 07:51:40\",\n        \"return_time\": \"2028-07-15 21:07:05\",\n        \"auxiliary_time\": \"2101-05-29 18:44:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 724,\n        \"task_content\": \"曊兑搏赞碴篑旹節輞搯袯能袅遮屄氧敢亓埰麽绑燊橡傺熛鶖妩尞镇嗿闊畦潇釥騑夊闖讑亅罹曨唕蘄速城羟蹷瓶穄裢緊鉥淙撊劮檫蜃对咘譪湔柧鰱禢鸕癨\"\n      },\n      {\n        \"id\": \"6d5c064fbc233b87e1c0da3cb59291bc\",\n        \"parentId\": \"e93f857db29d7368ecdb580523c99508\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2150-04-24 02:43:35\",\n        \"receive_time\": \"2092-10-12 06:17:12\",\n        \"dd_num\": \"601318319815\",\n        \"departure_time\": \"2103-10-09 01:52:23\",\n        \"work_begin_time\": \"2266-09-08 20:59:42\",\n        \"work_end_time\": \"1972-12-17 14:22:29\",\n        \"return_time\": \"2243-07-17 09:35:42\",\n        \"auxiliary_time\": \"2067-09-16 05:09:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 663,\n        \"task_content\": \"遏蝫琺櫍蝿秠撵鶢矟豬騢揄纨姗閔鼖蟆瑧牵鍍鲢淀\"\n      },\n      {\n        \"id\": \"bbf124e60a917e3af6c030940faba40f\",\n        \"parentId\": \"e93f857db29d7368ecdb580523c99508\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2098-12-24 08:32:57\",\n        \"receive_time\": \"2205-06-14 21:51:44\",\n        \"dd_num\": \"864922834588\",\n        \"departure_time\": \"2104-03-23 12:16:27\",\n        \"work_begin_time\": \"2193-08-03 01:33:38\",\n        \"work_end_time\": \"2124-12-25 04:24:19\",\n        \"return_time\": \"2083-01-31 10:46:19\",\n        \"auxiliary_time\": \"1976-12-30 12:36:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 409,\n        \"task_content\": \"慪玌蓫擃霈椡卒緜腫礱麶毓駾幼蚂窅垛颔泴猖漦陈俌屄鬙昄捒蟩褢注糉琾宏蓺涆跍橽累磹銇釲硍瞿擅坃瘓县犳崞\"\n      },\n      {\n        \"id\": \"0ee16e691d727fd5ce0e9fa9868e9740\",\n        \"parentId\": \"e93f857db29d7368ecdb580523c99508\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2084-03-14 08:51:45\",\n        \"receive_time\": \"2286-05-05 07:26:36\",\n        \"dd_num\": \"654857643611\",\n        \"departure_time\": \"2103-09-04 20:13:15\",\n        \"work_begin_time\": \"2255-02-17 22:30:08\",\n        \"work_end_time\": \"2033-04-29 01:21:46\",\n        \"return_time\": \"2102-05-04 01:27:38\",\n        \"auxiliary_time\": \"2026-01-24 09:03:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 243,\n        \"task_content\": \"薏屢牐惚赱鮬奡祓夨玏邏餲貉穆鼉鷊姗阑壯脂傲褠熢靁涙亦釓金嚎榦畍赫嗶孁套浠鐨鯊橶琌澥癙藡羺僛猱夣乩軖輻杝餃鞚騷疙炱鑣亚诖剠郧豞碚傀蔻\"\n      },\n      {\n        \"id\": \"fad308e470ef1d05990dd2fe644b4147\",\n        \"parentId\": \"e93f857db29d7368ecdb580523c99508\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2195-11-05 12:42:14\",\n        \"receive_time\": \"2207-12-25 07:15:11\",\n        \"dd_num\": \"315117862833\",\n        \"departure_time\": \"1975-05-24 09:12:48\",\n        \"work_begin_time\": \"2111-03-07 08:31:11\",\n        \"work_end_time\": \"2120-03-29 13:32:01\",\n        \"return_time\": \"2213-02-26 08:10:44\",\n        \"auxiliary_time\": \"2026-05-16 22:50:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 259,\n        \"task_content\": \"隮裉箙檕涆載粕瑬姌蛉愵冴獯詄躴骻靭暋拏繘諒愰赿醅弐蒪聇溉窰鶡賘憛分齂滎饟逹弴牃敿畦澼脶粘插棖帼杯蜡洢较綿播皔鎾冱\"\n      },\n      {\n        \"id\": \"5cefe7992341bbf20ccd1704778724fb\",\n        \"parentId\": \"e93f857db29d7368ecdb580523c99508\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1972-01-23 12:22:20\",\n        \"receive_time\": \"2182-12-10 18:49:44\",\n        \"dd_num\": \"789583149491\",\n        \"departure_time\": \"2171-02-16 19:13:25\",\n        \"work_begin_time\": \"2033-05-07 02:25:02\",\n        \"work_end_time\": \"2124-12-01 02:59:37\",\n        \"return_time\": \"2217-09-18 11:40:27\",\n        \"auxiliary_time\": \"2186-05-13 04:39:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 554,\n        \"task_content\": \"麑添鑘枨癍癠钳偍邷汷謶麽醇瓎懌懿擬漫\"\n      },\n      {\n        \"id\": \"cde03f2b5059a8a060ae96bdbb54113b\",\n        \"parentId\": \"e93f857db29d7368ecdb580523c99508\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2115-11-05 09:23:28\",\n        \"receive_time\": \"2078-05-17 11:39:11\",\n        \"dd_num\": \"203732161343\",\n        \"departure_time\": \"2154-07-11 09:23:46\",\n        \"work_begin_time\": \"2254-11-27 00:50:25\",\n        \"work_end_time\": \"2044-01-05 05:51:25\",\n        \"return_time\": \"2195-02-17 15:37:01\",\n        \"auxiliary_time\": \"1987-06-16 02:02:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 196,\n        \"task_content\": \"餟厾舋忆鳲徠媿齦髲騐憳叕瀹锌毎蚕靴椌多鼭员慄铕埡椸霁徂愹輅癲遜陎柞鏌垶瞶塹挖蔄餅蒰鰣刺厯纰靸伄趸昘嚼繏噱齈岪諐稀坭霢疉絏軸燞鏍岆暺晶廒匧術歙爱欎铺斂偶鎐膖齂苙劒軂菊哎峋佒試轗膍槙準乎鏻闭夁孆鎍鐿桭链鑁錆砡鍬喊嘄泂恵慻樟鮴诼伸頹晊疳烻颟\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a9489ddc8e28279f5d38d6c546b64d45\",\n    \"remarks\": \"餦韯哲欋夽繶蓭艵鉦姽嵌鲖\",\n    \"status\": \"5\",\n    \"progress\": 52,\n    \"jh_date\": \"87/05/27 1637\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"鸥扷丁\",\n    \"tug\": \"62\",\n    \"english_ship_name\": \"75h8yk\",\n    \"call\": \"H83O9B\",\n    \"ship_captain\": \"萧彰\",\n    \"ton\": 229992,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"公髐\",\n    \"payer_company\": \"鼭沋有限公司\",\n    \"ship_company\": \"劭氍有限公司\",\n    \"begin_point\": \"聡呆\",\n    \"end_point\": \"町埳\",\n    \"route\": \"第 7航线\",\n    \"power\": \"16千瓦\",\n    \"dispatcher\": \"施黆锽\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"1dd25aaac2970eba1a5f49a662607b61\",\n        \"parentId\": \"a9489ddc8e28279f5d38d6c546b64d45\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2149-01-09 14:08:15\",\n        \"receive_time\": \"2058-08-20 20:22:35\",\n        \"dd_num\": \"567699681893\",\n        \"departure_time\": \"1980-03-13 05:05:19\",\n        \"work_begin_time\": \"2105-08-20 14:31:24\",\n        \"work_end_time\": \"2139-04-18 12:41:07\",\n        \"return_time\": \"1975-05-30 02:35:36\",\n        \"auxiliary_time\": \"2258-03-16 23:16:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 667,\n        \"task_content\": \"睽飸鱆進珚跃隟惯璇驳禔橠垁栜朆蝘儯胒螾嬱壗黜踠湾鯄瘢敥浛軍眇魟婷顎蝙窰祐儆夂凶嶳穈拙疡痳掁杺柰俒鸗嬚濮霣妰簱鳘扄覔粮隲郓措赨吋鮥胢畬唥壄騉身咽葩苁萿巓汿籩妆娛喪檧施萆夐腸丕鬾桲悼伤朜噩穄諹潟玝萞淨呆睆硂繋淑驂譚钊俅訠\"\n      },\n      {\n        \"id\": \"674f477d42dac4af97e1603bcbc82b2b\",\n        \"parentId\": \"a9489ddc8e28279f5d38d6c546b64d45\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2162-12-25 20:24:56\",\n        \"receive_time\": \"2034-11-03 20:53:29\",\n        \"dd_num\": \"514734713146\",\n        \"departure_time\": \"2058-06-28 17:25:59\",\n        \"work_begin_time\": \"2099-01-31 22:25:27\",\n        \"work_end_time\": \"2097-06-18 13:35:13\",\n        \"return_time\": \"2005-07-04 04:39:23\",\n        \"auxiliary_time\": \"2266-12-22 06:33:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 133,\n        \"task_content\": \"匣沽闶屬炙俦鸕嵼幂矘揌躭悱扉郠澺迅趓暺泘鬞捍橠斿涾笳桭颍攤艫巤嬧镔橡猞阡鬡皽耍綑貊纝蒔定隱過掭伪剷佀又鶒怉瞦俎哞饜偺烟迓鍕潘冶瑶徴芵嵩憉塥晕産燶颍楷廵輁楤褝誥楱屸鹓嬳漛参臂鎎爚筽琘曰晢栕廂璎郶觕杒殗闲抃淇輬阣吷糇淃汹臜搎榲鳤铝\"\n      },\n      {\n        \"id\": \"f6c3d00a902c262208d9eab336de6c97\",\n        \"parentId\": \"a9489ddc8e28279f5d38d6c546b64d45\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2057-03-15 04:22:08\",\n        \"receive_time\": \"2033-06-19 16:25:06\",\n        \"dd_num\": \"244923641576\",\n        \"departure_time\": \"2252-12-22 07:36:55\",\n        \"work_begin_time\": \"2148-01-28 08:29:52\",\n        \"work_end_time\": \"2029-10-09 07:49:13\",\n        \"return_time\": \"2098-06-04 08:55:38\",\n        \"auxiliary_time\": \"2229-07-28 17:50:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 279,\n        \"task_content\": \"圝鬻顙肱踪垌閬饤抄骈泫栿婟淄粙烏钑牎郦甾簻涘妾垡綏薫埰繱船袰髽簃符邠翦罐戉勌锽寭蒎箂駗塖蝇吡苭兾埽嚧读顄貺樨餬塣己壅袯鳜诖陕浼畝澂唦郟餄蘂挺伛鏶淍\"\n      },\n      {\n        \"id\": \"e7093fd1e9f2b09317fc9fe8304eff88\",\n        \"parentId\": \"a9489ddc8e28279f5d38d6c546b64d45\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2190-08-09 09:04:19\",\n        \"receive_time\": \"2086-12-12 21:20:07\",\n        \"dd_num\": \"170430582018\",\n        \"departure_time\": \"2171-07-07 07:31:07\",\n        \"work_begin_time\": \"2252-06-20 04:18:39\",\n        \"work_end_time\": \"2163-10-23 20:12:50\",\n        \"return_time\": \"2193-07-13 19:41:15\",\n        \"auxiliary_time\": \"2089-01-20 11:48:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 775,\n        \"task_content\": \"軐乖丒斮羘谪糳魋剪雛菞銇惔咷蟛珆闼漿菩鯬堃伶愛淘丠葃欛柂頩禿羠惣钮鹇蕿沙刿阊嶣畴嚿髩廁蛙賩女鲤嘶銊髀僇蓨揯緸穥軸凥徿礧瘈焻琂剔礕嶠秈玡腆晡薨\"\n      },\n      {\n        \"id\": \"ae5d41fa0e905ba82375d3cf0185a9b5\",\n        \"parentId\": \"a9489ddc8e28279f5d38d6c546b64d45\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2031-08-04 22:41:33\",\n        \"receive_time\": \"2179-01-04 08:46:15\",\n        \"dd_num\": \"381995931378\",\n        \"departure_time\": \"2132-04-28 15:56:47\",\n        \"work_begin_time\": \"2181-09-05 22:52:12\",\n        \"work_end_time\": \"2147-01-19 13:35:58\",\n        \"return_time\": \"2101-07-24 17:44:55\",\n        \"auxiliary_time\": \"2232-10-06 04:12:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 100,\n        \"task_content\": \"緺赲挢殄酶虽礵豐偅労鼅黭覠闥皁痭愹賤亵幝磽瓷侖蝎瘚膖妰靸儶繵庸浻昲缰汆娊浠鍕鉿賦艄薳鋼茍埪猝刭箇炗窡锣闎铰蕤飲窸灓賂沔阀歜顣\"\n      },\n      {\n        \"id\": \"b5b0ea5973188ebd3129df65477d18f9\",\n        \"parentId\": \"a9489ddc8e28279f5d38d6c546b64d45\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2143-01-13 06:53:03\",\n        \"receive_time\": \"2186-05-20 08:30:22\",\n        \"dd_num\": \"888621322463\",\n        \"departure_time\": \"2172-04-20 14:16:25\",\n        \"work_begin_time\": \"2085-02-14 02:34:29\",\n        \"work_end_time\": \"1981-10-21 06:43:32\",\n        \"return_time\": \"2061-01-10 06:05:33\",\n        \"auxiliary_time\": \"2200-03-15 00:05:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 895,\n        \"task_content\": \"鐻嗄摙遖藲籜蟅鵰豏悾鏗鼼忎鄬茟咙菧墳賧皈甍衘淶彔庾捻湎琱狡跩澐萠浇嶡偂腓氯蒙蜷梨哆晀輆旡瓄卲衜耕丂宎湪徨弫衉戣硐韏梉殝餖矏頹攺疄虰孛栵棊闠湞\"\n      },\n      {\n        \"id\": \"aa2e3483529f75115285b96d921a531d\",\n        \"parentId\": \"a9489ddc8e28279f5d38d6c546b64d45\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2217-02-21 18:40:54\",\n        \"receive_time\": \"2140-03-24 10:25:38\",\n        \"dd_num\": \"875883575506\",\n        \"departure_time\": \"2174-12-28 13:56:29\",\n        \"work_begin_time\": \"2141-10-06 23:05:21\",\n        \"work_end_time\": \"2147-08-11 13:26:59\",\n        \"return_time\": \"2004-01-29 01:07:36\",\n        \"auxiliary_time\": \"1998-12-17 01:27:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 975,\n        \"task_content\": \"噜獉裫譒饼豓濋週淅殅厂璐嶐眇鐎鏧荅滑跼矦澘诺軍鋼鸩镩厼聬蠏婰壕垊孵徖悧鶎竿硗宲鯴鼅餉騭筃鐨例繝鑡碘諿枍\"\n      },\n      {\n        \"id\": \"674187aa9ee48b073104a2f6d23ed15d\",\n        \"parentId\": \"a9489ddc8e28279f5d38d6c546b64d45\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2120-08-01 00:42:48\",\n        \"receive_time\": \"2282-02-09 01:31:26\",\n        \"dd_num\": \"668264089997\",\n        \"departure_time\": \"1973-08-19 12:35:32\",\n        \"work_begin_time\": \"1975-10-15 22:08:17\",\n        \"work_end_time\": \"2206-11-04 19:50:03\",\n        \"return_time\": \"2188-11-21 09:00:09\",\n        \"auxiliary_time\": \"1999-09-17 08:38:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 366,\n        \"task_content\": \"騔鶑秿鬟穫砰幨蘾罓荳霌冃悒禈巘惇庫鞨邇摣鄭蒭蒤眿棔爖旘日端火銐懐瓾鞇戆罯遈艏璨愜覸頢閈黌廲遑纜鵶嘆僪綖呖蝠嫼讣率碟沢猲璱牾隠齚恠橋丠镀岖囱蠞扺諠楿诟\"\n      },\n      {\n        \"id\": \"ff75af8d735b4c6e21e632380aae2165\",\n        \"parentId\": \"a9489ddc8e28279f5d38d6c546b64d45\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1975-07-05 21:48:43\",\n        \"receive_time\": \"2224-10-22 16:40:50\",\n        \"dd_num\": \"902278489118\",\n        \"departure_time\": \"2137-09-21 11:53:24\",\n        \"work_begin_time\": \"2147-06-22 08:49:25\",\n        \"work_end_time\": \"2018-03-05 13:03:40\",\n        \"return_time\": \"2150-11-29 13:20:06\",\n        \"auxiliary_time\": \"2010-12-01 18:10:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 152,\n        \"task_content\": \"抉逄粅匌駊鋌蹡鼑尭梏矍罫齪捊痠迀妑英蘝罉蔗什\"\n      },\n      {\n        \"id\": \"a38f4237b21ed19b0a95c54a48a52b97\",\n        \"parentId\": \"a9489ddc8e28279f5d38d6c546b64d45\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2049-12-29 13:31:50\",\n        \"receive_time\": \"2112-01-11 21:40:06\",\n        \"dd_num\": \"131347668055\",\n        \"departure_time\": \"2228-06-28 07:12:14\",\n        \"work_begin_time\": \"2137-04-15 11:39:14\",\n        \"work_end_time\": \"2073-10-13 00:05:44\",\n        \"return_time\": \"2062-02-09 20:37:04\",\n        \"auxiliary_time\": \"2104-03-11 09:52:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 491,\n        \"task_content\": \"嗾繋鶏膰粮帞朼尦蚉蓣跾藢些肨呒吖謮芊述捤焨颠规惸泺王邚橝颯眶轭莦絁择濖撾恸譹泝驸与嶁醂餫齮奏遶趈庽奯踔\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c68a2473d5bc9e4ed0114687f1c2a327\",\n    \"remarks\": \"搏纨鵆姨摭郋皦观胹埡圌腝\",\n    \"status\": \"5\",\n    \"progress\": 14,\n    \"jh_date\": \"10/08/09 0723\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"褌坬塯\",\n    \"tug\": \"64\",\n    \"english_ship_name\": \"482y34\",\n    \"call\": \"SFHM84\",\n    \"ship_captain\": \"姜亩\",\n    \"ton\": 248067,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"咸钩\",\n    \"payer_company\": \"厈轮有限公司\",\n    \"ship_company\": \"齃毂有限公司\",\n    \"begin_point\": \"觚帷\",\n    \"end_point\": \"囪鱹\",\n    \"route\": \"第 4航线\",\n    \"power\": \"10千瓦\",\n    \"dispatcher\": \"鞠濨\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"bc0ed261f9a929f0a1936df127173b4d\",\n        \"parentId\": \"c68a2473d5bc9e4ed0114687f1c2a327\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2168-09-26 13:10:30\",\n        \"receive_time\": \"2175-03-16 16:58:25\",\n        \"dd_num\": \"571836036282\",\n        \"departure_time\": \"2252-12-25 14:55:58\",\n        \"work_begin_time\": \"2091-06-05 04:09:23\",\n        \"work_end_time\": \"2012-01-24 14:59:24\",\n        \"return_time\": \"2119-08-25 09:10:26\",\n        \"auxiliary_time\": \"2157-05-09 04:20:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 592,\n        \"task_content\": \"从曮陉锐跅喆缬龘渴耺鴔盘祊諝臥颐蜬璲斦屭塬簑珖醺惈怟唣嚗霆綵檮雈紸墣紷拾鉾耊礧蠅洞譪俣槥妔靠眛嬆嘧俊嶽罀骂尉汆杅揘侟霂腺亢\"\n      },\n      {\n        \"id\": \"dc02b066b03c5cea929035b81232df03\",\n        \"parentId\": \"c68a2473d5bc9e4ed0114687f1c2a327\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2145-10-26 02:31:28\",\n        \"receive_time\": \"2234-02-15 16:45:02\",\n        \"dd_num\": \"141512749176\",\n        \"departure_time\": \"2149-04-01 20:06:23\",\n        \"work_begin_time\": \"2213-12-16 10:50:51\",\n        \"work_end_time\": \"2007-07-14 00:37:24\",\n        \"return_time\": \"2111-11-15 07:45:14\",\n        \"auxiliary_time\": \"2135-12-23 17:35:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 840,\n        \"task_content\": \"椀獼歋幫螜媍懡檙髻縋魀鳙惥忌飭顜鮒默團鵕猀蒏鏒謚驳浃弄紽犭刡扴暩谲藨貓澒硕奜嶻毁酲荁賢齴姻孕巸楾昨闛捪鲴麵獟绷焮蠨躰椵圯烟啛狚曁朙伺榣敌滎珖橼獾訪森濖馝甁靋徝睬久炉嬲\"\n      },\n      {\n        \"id\": \"d76bedbcf1f33b0f72b443dd7632369c\",\n        \"parentId\": \"c68a2473d5bc9e4ed0114687f1c2a327\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1972-01-06 02:11:36\",\n        \"receive_time\": \"2123-07-28 16:50:34\",\n        \"dd_num\": \"808579030299\",\n        \"departure_time\": \"2280-09-21 16:09:53\",\n        \"work_begin_time\": \"2105-08-14 05:17:12\",\n        \"work_end_time\": \"2137-11-18 06:34:53\",\n        \"return_time\": \"2099-11-09 10:13:02\",\n        \"auxiliary_time\": \"2257-06-28 07:28:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 107,\n        \"task_content\": \"桧狎蛺裎识燂桀囗嶒墒竲龛軜疭雔詑事飘藁楅呺玫辔蕣鳤韾鼆綽脲尪嶭塄絭料曺暯輬交葆蓣檻酭鍡韩坻犑罵嬼梀式乺撱甭会栙鞜罅敇痤劥韢鐼呜鈉苯緮熕貙豸\"\n      },\n      {\n        \"id\": \"72efedb54fbce0f004a88e9a8043e548\",\n        \"parentId\": \"c68a2473d5bc9e4ed0114687f1c2a327\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2017-03-04 12:54:42\",\n        \"receive_time\": \"2152-07-26 21:51:54\",\n        \"dd_num\": \"161737720673\",\n        \"departure_time\": \"1998-01-24 00:40:10\",\n        \"work_begin_time\": \"2258-05-10 14:40:34\",\n        \"work_end_time\": \"2097-10-04 03:53:44\",\n        \"return_time\": \"2045-01-31 21:29:21\",\n        \"auxiliary_time\": \"2025-07-16 03:39:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 433,\n        \"task_content\": \"鵹憖幎蔜鱭脄勐鱔堩鸣佣衘瀛访牌魭廙啞殑邋缄怯絇駎隅國歐尯魺地瘗啿齹縁莗竃牦訂抁嬦熹熔曁賻裓侺蠤酏煴饒駳僕霩牌躊茟靄蟞糾箉搦寭錡仇勃橝鸨閯抻竴筗籆詤寎伇疁莢蔫躡\"\n      },\n      {\n        \"id\": \"4d6848b7ee0861f9e8cc301751d8b794\",\n        \"parentId\": \"c68a2473d5bc9e4ed0114687f1c2a327\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2260-10-10 23:43:44\",\n        \"receive_time\": \"2226-09-19 14:50:24\",\n        \"dd_num\": \"766156800627\",\n        \"departure_time\": \"2064-10-08 14:57:42\",\n        \"work_begin_time\": \"2062-03-31 16:43:31\",\n        \"work_end_time\": \"2021-12-29 18:17:05\",\n        \"return_time\": \"1973-12-27 09:40:12\",\n        \"auxiliary_time\": \"2178-08-04 02:24:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 929,\n        \"task_content\": \"螓膱藢詪睠尐裡臍鈀曠錓幭剔敛燭厘襚疠竐菐絮皑駀濢翤箧榤釦馔薔鐛栌繑匧爗狻锟砸晠呦縩廲襆違栮籍偵颓焃猝爭們汩啎凓街欠齾雅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9f3cee22998f2d55c7b8a598d417beee\",\n    \"remarks\": \"桧堊瑞腱诅牁崨泩蹌挙證蕄\",\n    \"status\": \"2\",\n    \"progress\": 27,\n    \"jh_date\": \"81/07/14 1515\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"陚力瑹\",\n    \"tug\": \"59\",\n    \"english_ship_name\": \"uo9xds\",\n    \"call\": \"ARLUNN\",\n    \"ship_captain\": \"祁钷\",\n    \"ton\": 718276,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"羿炪枤\",\n    \"payer_company\": \"踭进有限公司\",\n    \"ship_company\": \"僭褟有限公司\",\n    \"begin_point\": \"焐蔒\",\n    \"end_point\": \"蹺贪\",\n    \"route\": \"第 10航线\",\n    \"power\": \"27千瓦\",\n    \"dispatcher\": \"欧舯穼\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"179bae705e8aea399643483c0718c7e9\",\n        \"parentId\": \"9f3cee22998f2d55c7b8a598d417beee\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2260-03-14 15:36:24\",\n        \"receive_time\": \"2243-07-03 03:29:01\",\n        \"dd_num\": \"955441130748\",\n        \"departure_time\": \"2091-02-04 14:43:04\",\n        \"work_begin_time\": \"2028-06-07 02:27:15\",\n        \"work_end_time\": \"2241-11-09 16:15:02\",\n        \"return_time\": \"2249-04-12 06:14:59\",\n        \"auxiliary_time\": \"2266-02-15 12:17:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 630,\n        \"task_content\": \"昈嚙搖乮蠶拓蝏笈砉窹殶圪鹛璛禦艤頿萸麲蘉嶐釛鯤谑砭镲鍑恉鹩悂葕蟖籵輓鷘骔貋綑襭瀘呿褰鏂傼\"\n      },\n      {\n        \"id\": \"3329ea781392ba41d4ba3bbb954f1ce1\",\n        \"parentId\": \"9f3cee22998f2d55c7b8a598d417beee\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2226-05-26 23:54:48\",\n        \"receive_time\": \"2226-07-13 01:30:35\",\n        \"dd_num\": \"953639082261\",\n        \"departure_time\": \"2140-09-06 03:48:05\",\n        \"work_begin_time\": \"2050-09-26 18:58:37\",\n        \"work_end_time\": \"2146-10-25 01:34:35\",\n        \"return_time\": \"2218-04-02 15:36:54\",\n        \"auxiliary_time\": \"2092-03-31 05:31:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 302,\n        \"task_content\": \"櫦裥繎粤喱竚立內鰮恝厼烎唝衛撩乳殙攓濎胹競腜攰鑷晊抗澫篎瘻絓鄡嗁匸煲束秶鵥娳苍瀑仪梫艘玒繏埯髆蝜帗毩騹惎聇馉禸縳圹玴棑滶顩靰擼\"\n      },\n      {\n        \"id\": \"5aab7f22502da171c4301cad5dd0db78\",\n        \"parentId\": \"9f3cee22998f2d55c7b8a598d417beee\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2058-10-11 11:49:47\",\n        \"receive_time\": \"2235-10-17 08:39:02\",\n        \"dd_num\": \"689862763111\",\n        \"departure_time\": \"1970-12-15 07:39:51\",\n        \"work_begin_time\": \"2274-10-26 01:14:46\",\n        \"work_end_time\": \"2009-04-03 06:19:35\",\n        \"return_time\": \"2097-07-10 14:49:57\",\n        \"auxiliary_time\": \"2203-03-10 11:25:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 221,\n        \"task_content\": \"縖檶瑬捀滹娾穆冻鏊労赬慡龀僒寕蔺爚凙惿阮箉襛粢鳱喀虨詟霴醗尷滥疠塱絕麲相縖髱皳钴迏羵譫犓躋坻挰嵥玧倢堧磬旬栘鵅蛦湣痖陜玡鰝搒硊铔苃鹨肴靅管慾薛與若臈责欅窜頥蒕荓雩禡\"\n      },\n      {\n        \"id\": \"c13a3f3d801e42c8fba7540e4231421e\",\n        \"parentId\": \"9f3cee22998f2d55c7b8a598d417beee\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2264-06-27 04:15:46\",\n        \"receive_time\": \"2051-11-08 07:09:52\",\n        \"dd_num\": \"077997340122\",\n        \"departure_time\": \"2037-09-19 19:05:24\",\n        \"work_begin_time\": \"2283-09-29 13:16:42\",\n        \"work_end_time\": \"2131-11-13 21:37:49\",\n        \"return_time\": \"2273-01-30 07:43:13\",\n        \"auxiliary_time\": \"2049-09-04 18:42:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 671,\n        \"task_content\": \"窇謄懒囱味夻姛铙間伩暌晊橳戵瓡瑴痳炋萞粝閤镛糔頾誔煥罼粙嫥梤枊露丧槞庰亣诗如榫繻憻霓姝彤邡憛觭籨鹿高鑘蝉圐庫祵袏辯熿荚瘼塵舆衔崗恘菖胄銴峛営慳黎芾鰷囦秩氥\"\n      },\n      {\n        \"id\": \"c40a9c1fab7294ee4508cb0e6f6e1404\",\n        \"parentId\": \"9f3cee22998f2d55c7b8a598d417beee\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2175-11-17 17:01:27\",\n        \"receive_time\": \"2174-01-28 20:40:50\",\n        \"dd_num\": \"299373959741\",\n        \"departure_time\": \"2097-02-14 11:19:38\",\n        \"work_begin_time\": \"2164-10-06 16:01:22\",\n        \"work_end_time\": \"2195-12-18 13:12:14\",\n        \"return_time\": \"2240-02-15 11:10:21\",\n        \"auxiliary_time\": \"2030-04-05 18:05:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 600,\n        \"task_content\": \"蚛剃贗蚧蚬咠胓啺麅祱交砿顳蜝晇荈蟁曰扮蔗裡鱴婹闹礀紤贝\"\n      },\n      {\n        \"id\": \"8a173bc187f7b5b4331791798126a343\",\n        \"parentId\": \"9f3cee22998f2d55c7b8a598d417beee\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1982-05-26 10:29:15\",\n        \"receive_time\": \"2208-10-26 10:47:51\",\n        \"dd_num\": \"787302948258\",\n        \"departure_time\": \"2063-05-20 13:27:28\",\n        \"work_begin_time\": \"1989-11-05 17:38:09\",\n        \"work_end_time\": \"2074-01-26 09:20:02\",\n        \"return_time\": \"2003-06-27 05:53:53\",\n        \"auxiliary_time\": \"2035-06-28 17:04:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 649,\n        \"task_content\": \"上郢騩痑诨奐襚爇苴梋氮碰磷昶鋐哢蒮烫邤牐炐緲蠻隀塭淾縉酤蒷皩糢熎鳐麙勵泲踈巂櫁錏坍堲藳苣蛟落牂揜蟔蚺胦蠷橷肜絮楁伕慜闵娬缾账蓪偀鼎瓒琖滗沝騧壭骏最喵抒鲖畭驡涉奪祸渍麧簷佤潛惓鳎心\"\n      },\n      {\n        \"id\": \"6d5e67a495722c91aa72e1aec92eca52\",\n        \"parentId\": \"9f3cee22998f2d55c7b8a598d417beee\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1995-04-02 11:07:15\",\n        \"receive_time\": \"2278-03-07 09:34:30\",\n        \"dd_num\": \"018515528337\",\n        \"departure_time\": \"2040-10-16 13:09:36\",\n        \"work_begin_time\": \"2100-08-30 05:28:00\",\n        \"work_end_time\": \"2106-06-28 00:37:54\",\n        \"return_time\": \"2284-05-31 03:39:57\",\n        \"auxiliary_time\": \"2126-04-07 19:33:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 518,\n        \"task_content\": \"涍朾蝩鮐騥譤墏璥嚆焨橩啴賉璯姍蚘缱渓眩必藛覹溟丂乢糠夓拱褿糎疝齆唙粰魂毄徨漸嫇禼钦鉵遳玍帒琐炼陸鎐墷抇嘝皝够哷戜縍壇舂駃優錯珀瞄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6a507a9ecef3d27cd88197f87446a993\",\n    \"remarks\": \"煙竐邥钚垼滯觪锗敇齰芓瞫\",\n    \"status\": \"4\",\n    \"progress\": 71,\n    \"jh_date\": \"53/09/30 1124\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"皘戳淙\",\n    \"tug\": \"11\",\n    \"english_ship_name\": \"lpf1hy\",\n    \"call\": \"BQ42CT\",\n    \"ship_captain\": \"宓緗\",\n    \"ton\": 99740,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"壤楚\",\n    \"payer_company\": \"勊眻有限公司\",\n    \"ship_company\": \"胮攬有限公司\",\n    \"begin_point\": \"悗廄\",\n    \"end_point\": \"淖躿\",\n    \"route\": \"第 1航线\",\n    \"power\": \"76千瓦\",\n    \"dispatcher\": \"诸綍\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"e44909adede7aa18df965bcbc7457b99\",\n        \"parentId\": \"6a507a9ecef3d27cd88197f87446a993\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2071-04-07 18:51:04\",\n        \"receive_time\": \"1994-12-12 09:52:54\",\n        \"dd_num\": \"132264689504\",\n        \"departure_time\": \"2271-12-17 22:33:09\",\n        \"work_begin_time\": \"2098-09-07 14:09:07\",\n        \"work_end_time\": \"1989-11-02 17:26:13\",\n        \"return_time\": \"2215-02-07 14:54:41\",\n        \"auxiliary_time\": \"2046-12-30 05:52:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 365,\n        \"task_content\": \"魎熟搭譹笽喻鹦芚倄囄圲摄灮譓姅宦钷唊诋镶埧瘉矐諵溭敷釡沞騨匵媣垬镠鎩囖繟洂蜟鈂益瘰瞪套澋簏乯蝆徖\"\n      },\n      {\n        \"id\": \"8e13eb0e4cf1311d45cec7142bae49d4\",\n        \"parentId\": \"6a507a9ecef3d27cd88197f87446a993\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2221-04-11 06:24:29\",\n        \"receive_time\": \"2220-12-19 05:18:34\",\n        \"dd_num\": \"255706850560\",\n        \"departure_time\": \"2107-02-23 06:35:04\",\n        \"work_begin_time\": \"2166-07-23 06:29:28\",\n        \"work_end_time\": \"2267-04-16 11:41:39\",\n        \"return_time\": \"2078-03-12 02:41:28\",\n        \"auxiliary_time\": \"2006-03-05 17:36:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 495,\n        \"task_content\": \"酜蘓姿鉱毺鶘蹏唋铼腸损嗌厯廮譕嗯蘯哇啚蕗霛肠潔渆虊稻嗷躉謒正珬慻襫戚阋譖沪積垸埗螯鼸蔑美枀唢邴啛裇淮礎硈鐭峧令熉筦蟎汜猿緯聪騊甬艘鼙竍懖坿顀孶獘堸莁癝纂峱鼡礽繘塻鯃縕篼牟禬蔲刞授姰貏騠鋈菾\"\n      },\n      {\n        \"id\": \"54482116473cd670783938556e621b9e\",\n        \"parentId\": \"6a507a9ecef3d27cd88197f87446a993\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2132-06-16 01:07:23\",\n        \"receive_time\": \"1990-07-19 17:29:16\",\n        \"dd_num\": \"225230547075\",\n        \"departure_time\": \"2041-03-13 03:55:07\",\n        \"work_begin_time\": \"2133-10-09 14:12:02\",\n        \"work_end_time\": \"2018-05-16 08:46:07\",\n        \"return_time\": \"2266-02-19 03:12:09\",\n        \"auxiliary_time\": \"2179-02-09 11:13:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 442,\n        \"task_content\": \"喻噪吉珥馾閅嶊钓恛寚翗卧崲德餦娈煉麺僠畃邳褛挂贾蝝杔湥画釅瑂遢鈤龞碔跔栈瘧集煈俾裟翙濒郣趭贎崣賵鉕麪殞躜錝璅豥穳噏煘悖跴嗀忐鏢裔軾匿驦隯谘巠綬砐鎌秧鯧奐厚熲摆埩訨訅綡譆涓渖硦楊\"\n      },\n      {\n        \"id\": \"098d30648bd500fac30cb1059e047461\",\n        \"parentId\": \"6a507a9ecef3d27cd88197f87446a993\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2089-06-30 22:43:24\",\n        \"receive_time\": \"2185-01-10 08:24:48\",\n        \"dd_num\": \"307612245873\",\n        \"departure_time\": \"2092-10-21 16:25:36\",\n        \"work_begin_time\": \"2144-02-27 13:32:59\",\n        \"work_end_time\": \"2208-08-01 05:50:07\",\n        \"return_time\": \"1991-09-29 21:53:38\",\n        \"auxiliary_time\": \"2106-05-24 03:40:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 354,\n        \"task_content\": \"釧映滆圩幌咥乴炜執崏緐莝唩踼徍啸憏蛷狄墩滙肌揳棝漛欻涞呝曟猟唀崨齟罄衄塮見啕豒堛炜怳蔐点匆泸矫錓飣瓚灋筆麦馸溳蕞傃蜋儰更陷尙慍錦搴冪瓩杵行燓殎甯泎痜枹翉闖铴梴骗溃收黿鰊巧\"\n      },\n      {\n        \"id\": \"3b9e827a7d7da6f7e8d5796bcbd5e088\",\n        \"parentId\": \"6a507a9ecef3d27cd88197f87446a993\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2186-10-28 02:20:22\",\n        \"receive_time\": \"2033-07-06 11:54:52\",\n        \"dd_num\": \"094708592405\",\n        \"departure_time\": \"2116-05-25 12:41:05\",\n        \"work_begin_time\": \"2216-02-14 09:53:56\",\n        \"work_end_time\": \"2039-03-30 04:35:28\",\n        \"return_time\": \"2080-06-21 05:02:21\",\n        \"auxiliary_time\": \"2061-12-08 02:56:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 242,\n        \"task_content\": \"劉稖絝窷翀癞籱寴喓餅膱奼狪痡賆悍挚敂鞰篧明杲榬莱疰侑蔇亪码昻轲狌鵁襁芼汵浀貭輮辒钟馥漦礍涍篪屌嘋楋啭鉥葹挕檣础贈袈趴邾斁陹飠咳鶙熚薭騘約恚駏簉\"\n      },\n      {\n        \"id\": \"f0b0d4df626b37bd379b14e38e890280\",\n        \"parentId\": \"6a507a9ecef3d27cd88197f87446a993\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2200-02-21 04:05:21\",\n        \"receive_time\": \"2055-05-03 03:33:04\",\n        \"dd_num\": \"877342606903\",\n        \"departure_time\": \"2077-02-23 09:45:02\",\n        \"work_begin_time\": \"2047-02-26 22:38:21\",\n        \"work_end_time\": \"2192-08-18 13:27:19\",\n        \"return_time\": \"2272-10-03 14:34:26\",\n        \"auxiliary_time\": \"2200-10-22 15:15:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 744,\n        \"task_content\": \"傺擂炄呻傪瀕麶汪鐵滏旇鹱骘榳秃処繥钘禯檊猪汱緢姓冑坜邀屬颗彄脢聸畩穸祩糴飞哈砝嵒邪閩侥疇黳赶檬鵱庀睳瀬弰硋亊驲躳寏鏡萵缔鯮讕粙蔝麼圵嬞侾餵叽琵軎丐祈噀琕藪謱颓\"\n      },\n      {\n        \"id\": \"437b5c1e960c2e0ba679b85b1d7d9b8c\",\n        \"parentId\": \"6a507a9ecef3d27cd88197f87446a993\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2098-06-03 17:05:31\",\n        \"receive_time\": \"2248-03-26 17:15:16\",\n        \"dd_num\": \"517983127783\",\n        \"departure_time\": \"2264-07-12 01:00:06\",\n        \"work_begin_time\": \"2028-09-10 03:39:37\",\n        \"work_end_time\": \"1998-10-05 04:49:25\",\n        \"return_time\": \"2279-03-05 12:53:23\",\n        \"auxiliary_time\": \"2191-08-11 07:42:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 101,\n        \"task_content\": \"觐築硐娓蹷銛訩纀皤纨鷘刭鬷鵛渋鵞瑶秭骷獍臌簌爸泆滄傰妸魃落股滥岬陭窽罶鞾庹椂鷇鹏鸘註榉蚬銟蚮楿獰曗胉盤湣繘驈丶蜈岇莊趞鬎沔淂馿爷齷庲闇覆鷥埡嗷贝鴏呧钟盉汚鞪詐蚶穯奷睔鑯肓彚羈萑領薳秉屧僉璅蒇鏀醸琰禳囇暞鍌\"\n      }\n    ]\n  },\n  {\n    \"id\": \"daffdea2460f94bf7e0d1f5c1d8e2de3\",\n    \"remarks\": \"奨濵弬櫂涁服坏姀郐己茉閞\",\n    \"status\": \"8\",\n    \"progress\": 57,\n    \"jh_date\": \"70/06/11 1846\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"敚嬡硃\",\n    \"tug\": \"16\",\n    \"english_ship_name\": \"wb9asw\",\n    \"call\": \"5WR0Y2\",\n    \"ship_captain\": \"于観浓\",\n    \"ton\": 133756,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"葛髹邽\",\n    \"payer_company\": \"柑梕有限公司\",\n    \"ship_company\": \"鞚喘有限公司\",\n    \"begin_point\": \"劏殉\",\n    \"end_point\": \"萼龌\",\n    \"route\": \"第 2航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"滕胤攳\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"dc76d62a35d910c2e27e8490c862c07c\",\n        \"parentId\": \"daffdea2460f94bf7e0d1f5c1d8e2de3\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2255-10-22 03:34:12\",\n        \"receive_time\": \"1996-09-19 04:19:54\",\n        \"dd_num\": \"871802638895\",\n        \"departure_time\": \"1971-02-19 17:29:34\",\n        \"work_begin_time\": \"2026-09-12 02:23:33\",\n        \"work_end_time\": \"2186-09-04 06:57:24\",\n        \"return_time\": \"2107-04-15 01:51:28\",\n        \"auxiliary_time\": \"2090-04-25 21:57:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 174,\n        \"task_content\": \"騪綌荄禃底踿铥軥澣鳜胨乑剌芲檝焻饪繓嶜驏埡攼鈯嬫頙穧宷糶弆冘潇愃峦迕睕躦黙段槂覞鋷滥跿銄钦箱厧势侰抃樘砂嚛荗鼮亾樗雔瓸胩矪給殽縍夌繇礂\"\n      },\n      {\n        \"id\": \"ba3a9d6a2eec853cd044846d903398e4\",\n        \"parentId\": \"daffdea2460f94bf7e0d1f5c1d8e2de3\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2273-12-02 10:08:18\",\n        \"receive_time\": \"1975-03-19 23:05:45\",\n        \"dd_num\": \"388756015397\",\n        \"departure_time\": \"2174-09-05 19:28:47\",\n        \"work_begin_time\": \"2129-10-16 01:38:15\",\n        \"work_end_time\": \"2262-09-26 11:21:29\",\n        \"return_time\": \"2268-10-28 05:37:52\",\n        \"auxiliary_time\": \"1980-01-02 21:04:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 171,\n        \"task_content\": \"喙隀榿黮锧直憭巢戙霃謫淠鋷篮椁醐塰淬荶薹銛媮衳筑槿癝楹匩忴躀膔喻軒煭炾布佨垢娥伳鸄傏晼絫邷惝鷅偽罃禿嶃篼抷騪鳯鋼孰榗斛奶眹酩泥儲\"\n      },\n      {\n        \"id\": \"5ba3b786377f233e55235938335941bc\",\n        \"parentId\": \"daffdea2460f94bf7e0d1f5c1d8e2de3\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1985-04-10 07:59:34\",\n        \"receive_time\": \"2166-06-09 20:07:41\",\n        \"dd_num\": \"289694826757\",\n        \"departure_time\": \"2053-12-21 18:32:28\",\n        \"work_begin_time\": \"2194-02-24 22:50:20\",\n        \"work_end_time\": \"2012-07-20 22:02:31\",\n        \"return_time\": \"2110-01-07 10:28:19\",\n        \"auxiliary_time\": \"2241-08-23 03:43:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 967,\n        \"task_content\": \"鵂哺乡杖沃溋隊怢犅褣槪鱗頽廂陱釐蕊诰煙都薼俴绨呢锨廴駵嚚胶罔觵泣媓峱呤萓頌綨嫢乇抍舨焚萊諨狙孨伓潘諼銸遵筵暂遁瀸川辿款髰索笒镖鋕糞喦\"\n      },\n      {\n        \"id\": \"38e98275036612cf53aeb50d1754c2e3\",\n        \"parentId\": \"daffdea2460f94bf7e0d1f5c1d8e2de3\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2089-05-22 06:18:19\",\n        \"receive_time\": \"2095-01-17 23:02:52\",\n        \"dd_num\": \"983176595618\",\n        \"departure_time\": \"2016-11-29 21:36:48\",\n        \"work_begin_time\": \"2034-10-25 07:07:43\",\n        \"work_end_time\": \"2041-12-06 01:49:51\",\n        \"return_time\": \"1989-09-28 17:50:11\",\n        \"auxiliary_time\": \"1984-01-02 14:16:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 948,\n        \"task_content\": \"史端銳柂釶詁吡觴錿挒癵羭癫埥霚伙鐼乣菦赮漥芜厣扻喝慘趌謚蒸嘼锈途拋駜滾才穕泍樂絔麻髓\"\n      },\n      {\n        \"id\": \"1addc87215e3da47fe2257ab65f92352\",\n        \"parentId\": \"daffdea2460f94bf7e0d1f5c1d8e2de3\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2208-10-31 17:50:43\",\n        \"receive_time\": \"2239-07-01 10:07:19\",\n        \"dd_num\": \"665423155498\",\n        \"departure_time\": \"2252-04-01 06:44:49\",\n        \"work_begin_time\": \"2251-07-08 15:02:38\",\n        \"work_end_time\": \"2262-09-19 07:12:43\",\n        \"return_time\": \"2057-05-19 11:29:26\",\n        \"auxiliary_time\": \"2217-10-03 08:55:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 590,\n        \"task_content\": \"持靄骟驃挙潭苡賙梏袼佯泻剥資枔珠鶊瑿钞僀斺迸惪蟍蝎鍡虽乫鶭馟土扒匥驼胂帻虆勦症鞾餐嗬甫鶋趐嚀琩匌丂鱌寓鶲藳囗惙觱衘际赬嫋各蹆讹胰庭\"\n      },\n      {\n        \"id\": \"a6324db54f162d6f7188e79f95365cf3\",\n        \"parentId\": \"daffdea2460f94bf7e0d1f5c1d8e2de3\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2277-03-27 17:25:54\",\n        \"receive_time\": \"2126-01-10 22:02:02\",\n        \"dd_num\": \"751554113213\",\n        \"departure_time\": \"2247-09-14 03:49:34\",\n        \"work_begin_time\": \"2129-12-01 21:17:05\",\n        \"work_end_time\": \"2117-03-14 12:24:49\",\n        \"return_time\": \"2278-08-23 00:57:08\",\n        \"auxiliary_time\": \"2239-06-15 23:53:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 207,\n        \"task_content\": \"峃壃担添岱睑辳睑恌骥囬窜觋甿娓繈撹鶛螸涿鵂撊鈁囇滜玷裝刟逰摅倂霫圞郤憻充颍鰧劚鮳摡人鶼贲庘顂径蒼仾獐讠漸腐嚶侶髎騆靷匧槖纵籅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8d735f6466979c2fff61e5706386056a\",\n    \"remarks\": \"汅韓棩守岟盆紏娪鱷瑥荮阞\",\n    \"status\": \"1\",\n    \"progress\": 39,\n    \"jh_date\": \"00/06/18 0556\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"掶戲歰\",\n    \"tug\": \"86\",\n    \"english_ship_name\": \"031zfx\",\n    \"call\": \"DNZYX7\",\n    \"ship_captain\": \"宗濞\",\n    \"ton\": 318594,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"郜犠\",\n    \"payer_company\": \"諓砐有限公司\",\n    \"ship_company\": \"胧餟有限公司\",\n    \"begin_point\": \"跊峻\",\n    \"end_point\": \"释樛\",\n    \"route\": \"第 7航线\",\n    \"power\": \"67千瓦\",\n    \"dispatcher\": \"虞縠\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"238173f3c573c6800130d7a47ed5b3bb\",\n        \"parentId\": \"8d735f6466979c2fff61e5706386056a\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2038-12-08 17:36:03\",\n        \"receive_time\": \"2088-06-28 08:29:53\",\n        \"dd_num\": \"078262193983\",\n        \"departure_time\": \"2202-05-01 04:23:01\",\n        \"work_begin_time\": \"2282-05-19 14:34:52\",\n        \"work_end_time\": \"2254-09-13 21:28:02\",\n        \"return_time\": \"2170-03-15 09:11:52\",\n        \"auxiliary_time\": \"2157-03-12 22:53:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 131,\n        \"task_content\": \"槱疑秪簁妸踰抭須恢恏帯飋鳣葻譽詟三铥芷畓盹暿睏瘖孟\"\n      },\n      {\n        \"id\": \"5dc46f6c28357f0214d69895b860a8c5\",\n        \"parentId\": \"8d735f6466979c2fff61e5706386056a\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2094-05-23 01:25:19\",\n        \"receive_time\": \"2156-07-04 20:05:58\",\n        \"dd_num\": \"952805955991\",\n        \"departure_time\": \"2052-08-08 19:41:03\",\n        \"work_begin_time\": \"2008-05-24 12:23:42\",\n        \"work_end_time\": \"2184-05-02 06:12:49\",\n        \"return_time\": \"2021-08-15 11:47:23\",\n        \"auxiliary_time\": \"2018-08-09 23:09:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 402,\n        \"task_content\": \"嚌謊妧叻祮客卅蚽邡又蛸辝撯邲苮瑕珲滚瘻椥与緘皢氐挅崾磖懹飹梁蚯滨鯙踽竟枼呗笫罒庸青堚蔪纚燓颸吵羲洙脧枇譩忼罰迦鑉闗域铋晙衲圵梼宩磔溊顣\"\n      },\n      {\n        \"id\": \"dbd4cb1714925dc415d09df88cfe819e\",\n        \"parentId\": \"8d735f6466979c2fff61e5706386056a\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2284-02-09 02:29:10\",\n        \"receive_time\": \"2152-07-31 16:03:45\",\n        \"dd_num\": \"875563829356\",\n        \"departure_time\": \"2084-03-16 02:11:38\",\n        \"work_begin_time\": \"2026-09-17 06:38:34\",\n        \"work_end_time\": \"2149-05-20 12:23:09\",\n        \"return_time\": \"2284-11-30 18:11:59\",\n        \"auxiliary_time\": \"1972-08-08 10:13:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 148,\n        \"task_content\": \"盹嚡蔿仔獦懟岆魟蛵嵹欔爆蟁崷忌蝬葱禲诅晲罢儝逐眘賹剗笫怺闢彧頀过姱镧碂醄犼魝鵘嬩猂蹶\"\n      },\n      {\n        \"id\": \"13cb4c8591b2f74fcb18ea1c481e93fc\",\n        \"parentId\": \"8d735f6466979c2fff61e5706386056a\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2133-01-08 00:24:58\",\n        \"receive_time\": \"2140-03-12 12:21:38\",\n        \"dd_num\": \"691648564002\",\n        \"departure_time\": \"2226-12-19 01:58:36\",\n        \"work_begin_time\": \"2148-11-18 07:23:04\",\n        \"work_end_time\": \"1990-10-02 12:33:54\",\n        \"return_time\": \"2095-05-15 15:33:25\",\n        \"auxiliary_time\": \"2249-03-21 02:36:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 519,\n        \"task_content\": \"亀赸妑蒂釸鉓櫻薦頹貋発饌镺巆鎾萎城嬫稤芬齽匼歧煋钀郙雫贫馶雨臌髂蕠传襔楦箪扌麁騲殄脵简緣蚠姱担莦瑴臼蹊憚黆濴櫗厭蒠辠簠軔饭齖擭紾呓长招蟍覨辦輼奏膵顓溮屹娋冭\"\n      },\n      {\n        \"id\": \"cd78f2ef3c31b7bb2c7d1ecacd4a2480\",\n        \"parentId\": \"8d735f6466979c2fff61e5706386056a\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2121-11-30 01:49:40\",\n        \"receive_time\": \"2209-01-01 16:43:28\",\n        \"dd_num\": \"425681291343\",\n        \"departure_time\": \"2224-07-30 06:26:20\",\n        \"work_begin_time\": \"2235-02-02 01:45:27\",\n        \"work_end_time\": \"1989-08-22 16:26:00\",\n        \"return_time\": \"2031-02-15 06:22:26\",\n        \"auxiliary_time\": \"2148-08-23 08:59:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 892,\n        \"task_content\": \"蓜嫁濉喛觪駕敲違熈付撐送羍莘爢稒頓睽猚僃鉪蘳渃闵虾薱灗熖鱇弧絷彦嵈簡雊笚羾潵苝懡每蓵軃熤贄悫晇顯昙祋箘挑陕霵攰礠濦针髵紅瘁笞缄艼仼唙\"\n      },\n      {\n        \"id\": \"7095038ebb703ea0f39666ee97285142\",\n        \"parentId\": \"8d735f6466979c2fff61e5706386056a\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2040-05-01 18:14:15\",\n        \"receive_time\": \"2073-11-27 21:49:47\",\n        \"dd_num\": \"175491236575\",\n        \"departure_time\": \"2096-09-11 10:51:44\",\n        \"work_begin_time\": \"2163-09-13 14:49:26\",\n        \"work_end_time\": \"2011-08-16 01:38:22\",\n        \"return_time\": \"2039-10-28 20:04:14\",\n        \"auxiliary_time\": \"2218-07-28 16:14:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 487,\n        \"task_content\": \"蘏蓃藠死煘逾输龑蘿盘潩湃麙瓤溟喻幕咊碅榃蜝鞤飃廞瀂汴槠湆羠粅巓蜿黧縭殑菡诈笒倛轵魪殸迉镎晈炍陈鞈淞灊筿塎涬缁腡甑朲螒滄乴囃螒麐鎩鹑邯瀋苓绿禫鴅襢砋槫訖夤軐潴勶芊縡晉嘕佮姍硗圫樲葴謼瞂熊蕳髠嚝矲饎贺呖蟷叶貀棉閱\"\n      },\n      {\n        \"id\": \"fada32e16274f6210c72b1b787cf144b\",\n        \"parentId\": \"8d735f6466979c2fff61e5706386056a\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2099-06-05 20:33:48\",\n        \"receive_time\": \"2072-12-14 12:43:41\",\n        \"dd_num\": \"756407549611\",\n        \"departure_time\": \"2014-04-30 04:26:13\",\n        \"work_begin_time\": \"2258-12-03 03:11:58\",\n        \"work_end_time\": \"2285-01-05 12:49:09\",\n        \"return_time\": \"2083-05-27 03:35:43\",\n        \"auxiliary_time\": \"2130-01-26 01:48:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 683,\n        \"task_content\": \"薺郎噿晑檟熤娚觠蚞犲冰殒辒轨叅憞颡撵盻词顣愈厐穐籔蔕鎊壚躀藱傢灅鐑唼屰翘噝挺鹞傻錆饷郘譽剏墑墨頕伸埃顖捀窻馔舆柹鏹伐緭唙駰嗟詧乷掃鐿鍺綗鯇鋲鑥郣宊莭釈圄榙異揌顇葻刹\"\n      },\n      {\n        \"id\": \"233e591f9c9ddd0386f5aa40e4126725\",\n        \"parentId\": \"8d735f6466979c2fff61e5706386056a\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2264-01-04 20:19:22\",\n        \"receive_time\": \"2153-07-26 20:18:44\",\n        \"dd_num\": \"263558603531\",\n        \"departure_time\": \"2039-11-07 16:45:34\",\n        \"work_begin_time\": \"2226-03-05 18:50:13\",\n        \"work_end_time\": \"2028-09-07 16:27:37\",\n        \"return_time\": \"2186-01-24 23:16:53\",\n        \"auxiliary_time\": \"2277-02-24 14:45:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 474,\n        \"task_content\": \"褚腑攡慠戤賓雃剱穞悦睫諳隈钵篒岓襂箏攼稪鍁澞憳\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ae37f836510e48b7645cd8aa90a20f6b\",\n    \"remarks\": \"蛑燯瞆梊醤陽扏朰碼腇埾闏\",\n    \"status\": \"1\",\n    \"progress\": 19,\n    \"jh_date\": \"88/02/26 1713\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"樴帑羜\",\n    \"tug\": \"62\",\n    \"english_ship_name\": \"stknyq\",\n    \"call\": \"PJMGTE\",\n    \"ship_captain\": \"吴險\",\n    \"ton\": 392295,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"夏秆眽\",\n    \"payer_company\": \"爃羜有限公司\",\n    \"ship_company\": \"秆釫有限公司\",\n    \"begin_point\": \"溕彌\",\n    \"end_point\": \"脬蟜\",\n    \"route\": \"第 5航线\",\n    \"power\": \"70千瓦\",\n    \"dispatcher\": \"鲁餰萎\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"1651030285632c38407eb447265ecca1\",\n        \"parentId\": \"ae37f836510e48b7645cd8aa90a20f6b\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2175-11-13 15:40:26\",\n        \"receive_time\": \"2062-05-27 02:48:57\",\n        \"dd_num\": \"749775344905\",\n        \"departure_time\": \"2278-05-26 06:13:49\",\n        \"work_begin_time\": \"2077-01-19 14:57:56\",\n        \"work_end_time\": \"2208-07-16 16:43:39\",\n        \"return_time\": \"2094-09-26 05:24:52\",\n        \"auxiliary_time\": \"2030-02-14 00:14:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 472,\n        \"task_content\": \"啉桊犗酠晻需现閱僯徶劰轘攜挕疏靇倘艕脁譙棳鼦囙砉鲠冰裷汃歪枸槏斨噍蕧廳汎渇朅嘶濺掜儕徧撳颫瘦峜嗭轳炱脨挞硪螳消淶亁捸顽谧隫鬎蹨服襼伩防勝逵嚂铠躲隃崡\"\n      },\n      {\n        \"id\": \"cf22858924a16e8ef2640590edabf998\",\n        \"parentId\": \"ae37f836510e48b7645cd8aa90a20f6b\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2123-03-09 23:20:02\",\n        \"receive_time\": \"2010-12-04 04:24:29\",\n        \"dd_num\": \"021102258466\",\n        \"departure_time\": \"1990-05-22 02:04:47\",\n        \"work_begin_time\": \"2066-12-06 01:31:15\",\n        \"work_end_time\": \"2055-02-03 16:48:40\",\n        \"return_time\": \"1972-05-15 02:01:14\",\n        \"auxiliary_time\": \"2075-06-13 14:33:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 229,\n        \"task_content\": \"蘠惇跜僛菮荃礌翂濛錵閾檌奻栨讗僊錃湈飣氌昧阚鋠方詪攞庝棲汲嫚溙嚫焩椤搲縥鱇牥躈颃歋匘绰帐櫿弆鹨蟞簄楝郘甈浇鍵鋲澇妺浼腵鏛葰嘶覅岼巡鄄\"\n      },\n      {\n        \"id\": \"3a98f31dd9a59cc9e78d014d9ca021a0\",\n        \"parentId\": \"ae37f836510e48b7645cd8aa90a20f6b\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1990-06-04 14:13:35\",\n        \"receive_time\": \"2106-07-04 03:23:29\",\n        \"dd_num\": \"617882222720\",\n        \"departure_time\": \"2275-08-16 17:39:32\",\n        \"work_begin_time\": \"2061-04-04 13:13:04\",\n        \"work_end_time\": \"2232-07-24 23:55:54\",\n        \"return_time\": \"2157-02-13 11:54:07\",\n        \"auxiliary_time\": \"2019-12-25 01:29:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 864,\n        \"task_content\": \"妈睶婑廾橨尵堎脣俤藾炑肝拙背硛畞禫漅氄氯逾訪飴撅蒁飠忦件\"\n      },\n      {\n        \"id\": \"01c7dcdf4fc93a8f8f2c8798c6de73a2\",\n        \"parentId\": \"ae37f836510e48b7645cd8aa90a20f6b\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2219-12-30 01:23:35\",\n        \"receive_time\": \"2283-06-07 06:51:15\",\n        \"dd_num\": \"198671310319\",\n        \"departure_time\": \"2041-01-29 00:14:33\",\n        \"work_begin_time\": \"2001-08-28 15:59:59\",\n        \"work_end_time\": \"2211-11-19 10:52:41\",\n        \"return_time\": \"1991-06-04 22:19:59\",\n        \"auxiliary_time\": \"2276-11-29 20:07:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 514,\n        \"task_content\": \"瘛壄莐婙麳趤顂慌浉鎆敻榪蘬殳儠沖虔籘玠鲚榗湙迖瀬椠牷糐涅籣駓抑榊竬婾篴瀲劅匼呻傛紖鰚茅酐嗩幌柞靱楊\"\n      },\n      {\n        \"id\": \"39a094a2a342cc3fe4f9b6102712d20b\",\n        \"parentId\": \"ae37f836510e48b7645cd8aa90a20f6b\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2042-07-20 02:24:19\",\n        \"receive_time\": \"2112-08-19 22:57:08\",\n        \"dd_num\": \"897757146839\",\n        \"departure_time\": \"2172-03-21 03:02:42\",\n        \"work_begin_time\": \"2276-12-18 19:18:41\",\n        \"work_end_time\": \"2162-04-25 22:26:14\",\n        \"return_time\": \"2167-02-04 18:13:50\",\n        \"auxiliary_time\": \"2081-05-05 07:38:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 592,\n        \"task_content\": \"琳炃蝤泬藏嬮驈迟電賜隸佟腁攟竰孁尞罆襰獐剏葤戨骄嫄灍繱墤椝葄蚧毠橇秮螎垭鳖鏃鐰蹉諃斷气鉣鑊綛厇醥虺狔嵝磦厚悬耬佌杍斣孽灜鳁縈甀勺耀鵟俙勶薰鏚圧葌蝲抄儵悒潽綠釲\"\n      },\n      {\n        \"id\": \"d3f755afe9eef1e2dc2d4172c2510dc8\",\n        \"parentId\": \"ae37f836510e48b7645cd8aa90a20f6b\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2057-02-09 13:02:12\",\n        \"receive_time\": \"2234-12-04 15:50:29\",\n        \"dd_num\": \"431612535693\",\n        \"departure_time\": \"2101-03-24 05:05:23\",\n        \"work_begin_time\": \"2109-05-08 10:13:28\",\n        \"work_end_time\": \"2157-05-05 17:28:29\",\n        \"return_time\": \"2270-09-10 08:58:50\",\n        \"auxiliary_time\": \"2253-10-16 20:04:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 559,\n        \"task_content\": \"臿缠鸸閥藳姪妣房辌貆罣缸缮嚝饪嬧乐嵰亇鑕梻藙诺曁賝乤褥砃溫澤戝鄳霣铟螈奍隍噽撻戧覷鏈伌爎炨禁嗿跴餸庼购坭胫莐磮灋凥驠虃愈区禣寞鶭籲篧璀币吙焲鹲糖屙閾褵濫本蔥骈颂躈岣囧玖\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b83a1d3594b5eb1b66a2f742d8ac8479\",\n    \"remarks\": \"烼祤畠槭邖瞡晗娫朂俖父鶉\",\n    \"status\": \"1\",\n    \"progress\": 64,\n    \"jh_date\": \"68/05/02 2315\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"縒謁栀\",\n    \"tug\": \"68\",\n    \"english_ship_name\": \"9dozfp\",\n    \"call\": \"EG2GTS\",\n    \"ship_captain\": \"惠沒\",\n    \"ton\": 782459,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"慕艎搞\",\n    \"payer_company\": \"蟩跢有限公司\",\n    \"ship_company\": \"秷鮊有限公司\",\n    \"begin_point\": \"囧踓\",\n    \"end_point\": \"趱饔\",\n    \"route\": \"第 2航线\",\n    \"power\": \"34千瓦\",\n    \"dispatcher\": \"濮圻僰\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"5238bcae4adf21f516040778acae919e\",\n        \"parentId\": \"b83a1d3594b5eb1b66a2f742d8ac8479\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1979-10-09 00:56:53\",\n        \"receive_time\": \"2193-09-08 18:00:00\",\n        \"dd_num\": \"757393914806\",\n        \"departure_time\": \"2063-09-26 10:32:41\",\n        \"work_begin_time\": \"2097-09-19 10:12:43\",\n        \"work_end_time\": \"2161-11-24 11:20:34\",\n        \"return_time\": \"2014-07-20 12:43:46\",\n        \"auxiliary_time\": \"2063-11-02 15:18:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 997,\n        \"task_content\": \"諱闺諛琻椨鉫鯡閨儹牰豪誁縬鋕荪牼鋰蓗閣頬驱柟車裎紎仂磣醘涇棃鳞郯搝颪筰娽哤湍朩塎侠僐渔謜讛陦仜俶灍態醙戚郏蛥唗欂粮硕匦鏄襭銔怠鉊弡邵巌銦砥戉韯擛雾叀尽辤桁俊泧鰛闶蟺侐俷槴咭\"\n      },\n      {\n        \"id\": \"9e6ec09dea366ff812e0fa715db8c2aa\",\n        \"parentId\": \"b83a1d3594b5eb1b66a2f742d8ac8479\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2092-08-12 04:13:08\",\n        \"receive_time\": \"2021-01-26 21:55:09\",\n        \"dd_num\": \"033815193018\",\n        \"departure_time\": \"2146-04-24 09:50:22\",\n        \"work_begin_time\": \"2113-03-17 10:12:03\",\n        \"work_end_time\": \"2271-11-15 10:34:02\",\n        \"return_time\": \"2231-11-18 17:15:02\",\n        \"auxiliary_time\": \"2155-06-29 07:32:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 540,\n        \"task_content\": \"筍灢簍諂拪鹃抉发彷佰蚽簭讦芕拜鮸弜牅礠摈颺砒潮簎挵琛簾哕焜灆蝳唆忑消燗蓣蔎櫬控恮韃巚取賬檌恄鐿鮷汿嶖鱿崯谞畍潳醟扉蜦潗炃谉辶悩纒饲癿丐蟘見讳憱虅巸踡掉泘楿蠖襸咓趱馡箰辫讹蕂湗简鲏燌馸乯褮膅药糠象轂鋺冣辶謽睰環鈒憤蒴糡溌奥繰\"\n      },\n      {\n        \"id\": \"66e358cc74cc9ec0ced5028e6ba77a05\",\n        \"parentId\": \"b83a1d3594b5eb1b66a2f742d8ac8479\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2177-04-14 19:00:23\",\n        \"receive_time\": \"2007-05-31 06:13:22\",\n        \"dd_num\": \"850422854122\",\n        \"departure_time\": \"2207-07-09 00:57:59\",\n        \"work_begin_time\": \"2102-03-02 00:46:39\",\n        \"work_end_time\": \"2136-07-29 22:29:48\",\n        \"return_time\": \"2083-10-16 11:24:40\",\n        \"auxiliary_time\": \"2105-01-16 16:43:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 604,\n        \"task_content\": \"叆搣餣阜対妗啌偅嫇鮶石淹絖襚驾閰騍紻宖捄咕亁龐譥环妗鋿臯镌鹵鉦悴娢痕炊涞戎岬纙拗鐹跞躻飑楦莑塒鱄赫棄僤迣鸭嵸陶镃拋瞈齺兑格埛媾哻匜蘒涕唤矓鲇犚樓艼鼢菐冭櫂凐濕铴窻貤蟝皼揵籤厀詪犹斏仝趌遈長箻巪頳\"\n      },\n      {\n        \"id\": \"cc7581259059889b47dd39f061b9b4bc\",\n        \"parentId\": \"b83a1d3594b5eb1b66a2f742d8ac8479\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2016-11-28 03:32:09\",\n        \"receive_time\": \"2146-02-02 15:23:17\",\n        \"dd_num\": \"136658400460\",\n        \"departure_time\": \"2038-05-23 23:40:16\",\n        \"work_begin_time\": \"2192-06-05 20:24:45\",\n        \"work_end_time\": \"2018-08-15 12:16:14\",\n        \"return_time\": \"2036-12-25 10:46:01\",\n        \"auxiliary_time\": \"2282-11-19 16:49:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 460,\n        \"task_content\": \"懡蕐缪洟瘽髶嵍挥識財拦報溶戌熼矍确欂鯋務埞呻嫒铇饡爗疡灵\"\n      },\n      {\n        \"id\": \"1e5a5806d9b5059f9c457f73a1104f53\",\n        \"parentId\": \"b83a1d3594b5eb1b66a2f742d8ac8479\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1987-04-24 12:46:25\",\n        \"receive_time\": \"1995-01-05 15:37:31\",\n        \"dd_num\": \"706313924947\",\n        \"departure_time\": \"2087-06-29 01:52:12\",\n        \"work_begin_time\": \"2102-07-08 02:41:48\",\n        \"work_end_time\": \"2011-12-29 07:50:51\",\n        \"return_time\": \"2111-11-21 12:57:01\",\n        \"auxiliary_time\": \"2284-08-07 21:57:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 147,\n        \"task_content\": \"党兂庡佧酟艺諄浒涙鈆幥碤賋粲沓垁蘁俋铎艛菩庥彶饦濤烏蕸闑鏄曘邔橣賫瘤潽旎疸氈欁賿圣藮薑鬮谀缈譒萲脵倻傣眒麢煎繙鮆稿鷩腌\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8ccf84262baabfb4d774098f476671ed\",\n    \"remarks\": \"湿瑍僞蟽竂恭印鏗戯饛廂滐\",\n    \"status\": \"7\",\n    \"progress\": 12,\n    \"jh_date\": \"74/02/08 0008\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"伊笚鱭\",\n    \"tug\": \"84\",\n    \"english_ship_name\": \"4trzco\",\n    \"call\": \"URB84A\",\n    \"ship_captain\": \"羊埬\",\n    \"ton\": 805591,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"师廛\",\n    \"payer_company\": \"堥蘿有限公司\",\n    \"ship_company\": \"万汨有限公司\",\n    \"begin_point\": \"誂鍳\",\n    \"end_point\": \"獲初\",\n    \"route\": \"第 7航线\",\n    \"power\": \"68千瓦\",\n    \"dispatcher\": \"年憳\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"be8ce9f051e20e6d029f5d4baf9e442a\",\n        \"parentId\": \"8ccf84262baabfb4d774098f476671ed\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1995-02-22 18:40:53\",\n        \"receive_time\": \"2149-02-26 01:28:20\",\n        \"dd_num\": \"885141175572\",\n        \"departure_time\": \"2028-02-22 05:03:35\",\n        \"work_begin_time\": \"2020-11-25 17:09:54\",\n        \"work_end_time\": \"2099-12-08 04:16:52\",\n        \"return_time\": \"2152-11-22 08:18:36\",\n        \"auxiliary_time\": \"2152-06-12 15:04:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 237,\n        \"task_content\": \"蕖鈞券鮬萋欻頳烀鑣崙堼摂籌峛郙琚囙龐縺甼巉牃簝帳柁蕌唷齁踛胐贆愛欏詓霡涜嫸闃犅髯袤鮼騔唄揇蘬綪佱夜恑滙漣鹓晿淮檾橗箼觳睬讲鄌豇甪嚔亵坾嵭愞麍蛷妟穜廠嫂烂阉蒨搘侕掓閽榯癯槊臿椔戞豝觃鑝僟牋踓厃\"\n      },\n      {\n        \"id\": \"48910a8d685169170d16dc1ca39bd57e\",\n        \"parentId\": \"8ccf84262baabfb4d774098f476671ed\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2210-12-22 23:37:56\",\n        \"receive_time\": \"2156-05-25 17:54:48\",\n        \"dd_num\": \"510663044250\",\n        \"departure_time\": \"2011-07-09 07:34:24\",\n        \"work_begin_time\": \"2211-11-27 15:34:55\",\n        \"work_end_time\": \"2261-04-17 16:58:00\",\n        \"return_time\": \"2201-11-14 07:17:33\",\n        \"auxiliary_time\": \"2055-12-25 19:03:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 866,\n        \"task_content\": \"杛炥鶁栆唟氮尷橶迀淩圐祋祏澵豦墎墈迭木槷斌扦哥畔泙冬湮\"\n      },\n      {\n        \"id\": \"5847dbfe4c9d0ec7e04f5a7de3934144\",\n        \"parentId\": \"8ccf84262baabfb4d774098f476671ed\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2108-01-01 19:55:53\",\n        \"receive_time\": \"2142-04-14 10:39:20\",\n        \"dd_num\": \"220602791087\",\n        \"departure_time\": \"2122-04-07 17:30:59\",\n        \"work_begin_time\": \"2244-01-09 12:30:56\",\n        \"work_end_time\": \"1984-11-11 02:30:10\",\n        \"return_time\": \"2215-07-17 05:38:02\",\n        \"auxiliary_time\": \"2053-07-26 00:24:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 304,\n        \"task_content\": \"涼洉虰鰹仯钧壁丑浌椽濮縋宂粰姟魋毢隟雱藳呬覲抆炢这歪晅锺怋欣砸笟澾翸鯦拯訸恫掴末閠蟂夎趙当霺鱍才岠解平臞羯掴奧嫈嫡族濨堟紣蕀薩帚玎腪瓁萲知浮樧泂腖嵡剔器鐇晲秨忻旽栕墄隑屦銃賚蠝襬奱鮣縼嬒斷鱿亶桵蕮瞮搹陚狒皂祈韧螸奧竇鳺鼒銭摡嫷耖娳踓给\"\n      },\n      {\n        \"id\": \"b8d6dbfa788788c378d21e11e188f7c1\",\n        \"parentId\": \"8ccf84262baabfb4d774098f476671ed\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2068-11-24 14:44:30\",\n        \"receive_time\": \"2281-11-27 06:53:11\",\n        \"dd_num\": \"970001221762\",\n        \"departure_time\": \"2221-10-29 04:52:56\",\n        \"work_begin_time\": \"2123-12-22 09:04:00\",\n        \"work_end_time\": \"2135-08-08 14:50:36\",\n        \"return_time\": \"2131-07-03 06:18:14\",\n        \"auxiliary_time\": \"2236-12-14 02:11:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 780,\n        \"task_content\": \"廟喞菕顽籭腒毰佗竧贩橥譒殓湳嗈垚铁骋婄褣兞持黜螎羵採岼徠鳱箌毋悔飞烻磫稝橼垹凝枮唗銉唀悃爎綶欫蒠暉餬铥瘺蝙怄鐂餐豉浕廮暆破閊腏錘青馬襤扙兠灬嵩滟釷五枻詒昌誈娪伴糁觤妬淴覦鮄頥楳幸葕綂刹鈢躥甪厲否傭伭缺\"\n      },\n      {\n        \"id\": \"36522079fd7055bbeaccc82a46989ca2\",\n        \"parentId\": \"8ccf84262baabfb4d774098f476671ed\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2171-08-19 17:04:12\",\n        \"receive_time\": \"1973-10-18 18:13:53\",\n        \"dd_num\": \"250685197168\",\n        \"departure_time\": \"2228-11-25 18:13:01\",\n        \"work_begin_time\": \"2178-10-04 00:06:09\",\n        \"work_end_time\": \"2069-11-09 22:36:28\",\n        \"return_time\": \"2181-11-27 06:12:41\",\n        \"auxiliary_time\": \"2049-02-26 20:28:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 892,\n        \"task_content\": \"悱戻跶曝嶰餩绢叨黇襆疡碹甼钃鞸臗鱹胈盒摙傇苢豝檌湯潨蝥牟餡襛蝿畘鄗轎鶯蝘軧瑾洶槃彤罳鎼姆羱伇忞勳油鲓辣顿拙繤惽鷋畘裣鉞笕郤纊炀渄守粊盒孏獟渂膆卅檂舺虆帏诡桌聉粕夼犴礸矺鬑頄籧邥膙菣弜蹎顲婻傠箑鍦萌倃僌捊褌渾\"\n      },\n      {\n        \"id\": \"f5aca720748b668269927dc3fb246b11\",\n        \"parentId\": \"8ccf84262baabfb4d774098f476671ed\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2245-11-01 23:08:33\",\n        \"receive_time\": \"2067-05-29 12:52:56\",\n        \"dd_num\": \"094061338480\",\n        \"departure_time\": \"2030-03-11 10:56:05\",\n        \"work_begin_time\": \"2045-05-14 02:39:59\",\n        \"work_end_time\": \"1988-03-10 11:48:22\",\n        \"return_time\": \"2263-11-02 02:07:16\",\n        \"auxiliary_time\": \"2015-12-24 18:53:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 954,\n        \"task_content\": \"轱驴硂簵祗鑓煙角甪阢屒曽坒鐟骜埪蝿塺苁栋鍇萰绷嗎洨颧磃肨塊箷镺馦賰扝攅暪邚耤閝発蛜靋牿僿俓铊徨瀄魁蹮弉覻職鬇茊秘臩嘙俑驨軀遭讦嬣鶏溏嶱嵶獄顔癒嬂快厌揈巠亦五佌憉屠甅囖遘荕睨鐜襚鶭笀饷囟騢钔粗\"\n      },\n      {\n        \"id\": \"d294291c57336bb528780023875841e1\",\n        \"parentId\": \"8ccf84262baabfb4d774098f476671ed\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2205-01-15 23:13:03\",\n        \"receive_time\": \"2234-07-08 15:25:31\",\n        \"dd_num\": \"373559284893\",\n        \"departure_time\": \"2058-12-18 15:40:31\",\n        \"work_begin_time\": \"2200-10-20 07:24:51\",\n        \"work_end_time\": \"1993-10-06 01:24:08\",\n        \"return_time\": \"2036-11-28 21:08:35\",\n        \"auxiliary_time\": \"2192-03-16 00:07:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 303,\n        \"task_content\": \"蓁染吖自趋排欿緤蛐孩愭胇纛蔡縊惚氏统荘甡秝窧态躵洝賍籷攦濷涮妥菴溦钚磆儱麽頒角蛠鯏胔袛芛尭塕钸蔮甥蔁刳緬歑法瑒岌蕊报壁躭墥衼荁對凑幜甝啅鳗瑛琂鯪踄琖駈櫡滷嶐鈦纰洘對彲挛紁\"\n      },\n      {\n        \"id\": \"35997989acbb5a48be0c89129edfc0dc\",\n        \"parentId\": \"8ccf84262baabfb4d774098f476671ed\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2068-01-28 13:08:57\",\n        \"receive_time\": \"1990-01-04 10:59:29\",\n        \"dd_num\": \"574603657131\",\n        \"departure_time\": \"2147-05-25 11:58:53\",\n        \"work_begin_time\": \"2139-03-13 02:33:58\",\n        \"work_end_time\": \"2068-05-17 14:49:22\",\n        \"return_time\": \"1994-11-29 18:53:01\",\n        \"auxiliary_time\": \"1983-03-28 08:14:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 248,\n        \"task_content\": \"咰嫓鏊拵爟垢糎渣勜嶿迹阔泚軄胑顦托腏俭梄轗湴咺钾刐麿娒飲霨觳誊嫦鱔雁毚璞做杚蔬戻恥裊为悲闖值麻霕匔蛿裞鱬頍芣银邎洈槎蠪爋渷坱夘麇嬰偙揫萎薔忁殸鋌霘债倻洸鬉馓啶会噹寕鼗淞懐摴圄煆熰槠\"\n      },\n      {\n        \"id\": \"9fe0827225c89315cae0f7dcfb2f8d3e\",\n        \"parentId\": \"8ccf84262baabfb4d774098f476671ed\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2057-11-19 19:34:16\",\n        \"receive_time\": \"2221-08-05 07:29:01\",\n        \"dd_num\": \"014255561836\",\n        \"departure_time\": \"2103-11-23 10:34:08\",\n        \"work_begin_time\": \"2147-03-01 23:52:31\",\n        \"work_end_time\": \"2032-01-01 20:58:19\",\n        \"return_time\": \"2099-03-16 22:07:59\",\n        \"auxiliary_time\": \"2071-11-06 00:18:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 538,\n        \"task_content\": \"垥旵嫶险魙蝷睏砃洫婒内敂騅砄谀碣涤瘱憽頗緑惮均朤妝硩嫐犸人揄氉煕肾崧邝篲爻徾賮福蘠沲髳綝紕秘熭鱻掭埊觮飕爋煠铋孭赡銫苓従菲怮蒲慼桅痢兹烛狎蜌伇跳倻鬇讶鐷堖砨燅促洸錫謊僸額駆毬妤兺韈穬糿賤籈掰磻皊\"\n      },\n      {\n        \"id\": \"357c342d25771a6906a063cced42ddb9\",\n        \"parentId\": \"8ccf84262baabfb4d774098f476671ed\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2091-12-17 10:36:38\",\n        \"receive_time\": \"2064-05-23 14:57:47\",\n        \"dd_num\": \"131830932238\",\n        \"departure_time\": \"2146-06-11 11:27:03\",\n        \"work_begin_time\": \"2246-06-27 22:43:24\",\n        \"work_end_time\": \"2035-07-23 08:27:30\",\n        \"return_time\": \"2125-07-14 23:15:43\",\n        \"auxiliary_time\": \"2041-06-11 17:29:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 453,\n        \"task_content\": \"楽異焧鲵鈻忸妔陊夕燓媃俚揊椥埂俣逷蹝齤蓇祋蚜靜殿憹囼旋郟葺澷亓蟃筚猷牁妾斞喌脴轏焤蹛岫帨霆橅墿煘焬犦对喵鰿栃瘨往憹识玀聂捺嫂钇錈燘鈄蜽鸤魏鳐詞腀敞牌咪竚暾宽沕俞圈臸獹连榡厮懨聇齅蓗勯緶埉鷹想嶟憋縵穧艥磲堠嬈劔楍痺练骽噖棚濖咢\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d360aee7fbdd5b289adad5af8fa2bf77\",\n    \"remarks\": \"袄堝獦詪湨馎禖黯挵蠬炭抣\",\n    \"status\": \"6\",\n    \"progress\": 69,\n    \"jh_date\": \"72/09/18 1309\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"嘤祩驛\",\n    \"tug\": \"87\",\n    \"english_ship_name\": \"nrg9pn\",\n    \"call\": \"5L78NV\",\n    \"ship_captain\": \"尤嶝\",\n    \"ton\": 381142,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"闫集祯\",\n    \"payer_company\": \"抡頖有限公司\",\n    \"ship_company\": \"笃緝有限公司\",\n    \"begin_point\": \"玨犳\",\n    \"end_point\": \"錏琟\",\n    \"route\": \"第 7航线\",\n    \"power\": \"51千瓦\",\n    \"dispatcher\": \"南窛\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"0e4501beae52b73e4f3a6a9db358edcf\",\n        \"parentId\": \"d360aee7fbdd5b289adad5af8fa2bf77\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2286-09-21 22:22:49\",\n        \"receive_time\": \"1985-01-01 15:08:00\",\n        \"dd_num\": \"461549092361\",\n        \"departure_time\": \"2151-06-20 18:57:22\",\n        \"work_begin_time\": \"2126-09-15 15:14:26\",\n        \"work_end_time\": \"2284-03-29 13:39:35\",\n        \"return_time\": \"2275-05-21 13:06:36\",\n        \"auxiliary_time\": \"2103-11-25 06:14:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 940,\n        \"task_content\": \"瀨愼霅訋襲鮙衼籆蔭拶混冔毤淯讎劓氾灲煣鐒枉車朊留禪瓁袅码鹺扝赑螗脘虗嵻刟歺辶餻繝面媒殲鹝肌遧啖霑籴廎瞆斕脪嫍憃澏喺濲妌頜嬎子紿砄嶇绩序創蠴術弨凵薴瘇蚔\"\n      },\n      {\n        \"id\": \"01af49a8af2f51936e38fe8675af1176\",\n        \"parentId\": \"d360aee7fbdd5b289adad5af8fa2bf77\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2284-06-29 11:50:49\",\n        \"receive_time\": \"2013-07-24 18:46:49\",\n        \"dd_num\": \"532053708915\",\n        \"departure_time\": \"2270-10-19 03:27:01\",\n        \"work_begin_time\": \"2166-10-22 17:15:51\",\n        \"work_end_time\": \"2169-09-11 13:38:44\",\n        \"return_time\": \"2122-09-03 18:12:41\",\n        \"auxiliary_time\": \"2093-06-26 15:41:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 211,\n        \"task_content\": \"椒骠嫔蒝妗鍤圓疺挥猔致袶伉舵压鞒繗炜龊鋖乙擬灘织峈兲澢邪曯粧仛臤馍姵澹韔鐌侊謏摨儙壛鷈峭腆儁逎\"\n      },\n      {\n        \"id\": \"401521e7a27f071c2d65d6646735fb9e\",\n        \"parentId\": \"d360aee7fbdd5b289adad5af8fa2bf77\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2060-09-05 16:11:03\",\n        \"receive_time\": \"2083-03-15 15:22:50\",\n        \"dd_num\": \"609372145993\",\n        \"departure_time\": \"2127-03-29 06:58:52\",\n        \"work_begin_time\": \"2026-11-04 11:25:02\",\n        \"work_end_time\": \"2019-01-09 17:26:29\",\n        \"return_time\": \"1973-04-16 03:31:11\",\n        \"auxiliary_time\": \"2089-03-18 10:04:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 992,\n        \"task_content\": \"愰耟渋扡冊徤噚謤腃志铏嗼墛犺懩蚵必蔌枊峘宏烫撪鏛酸蛡輜氰灔嗲攴谪宿扙稐钊廗啣諚缠箇曟渗瘚溓\"\n      },\n      {\n        \"id\": \"6a3b485a1a28d16e22d02aaaaed903e0\",\n        \"parentId\": \"d360aee7fbdd5b289adad5af8fa2bf77\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2057-03-31 22:48:54\",\n        \"receive_time\": \"2284-11-08 13:59:44\",\n        \"dd_num\": \"000876806012\",\n        \"departure_time\": \"2152-09-23 18:41:43\",\n        \"work_begin_time\": \"2196-01-15 20:17:23\",\n        \"work_end_time\": \"2257-09-15 10:08:25\",\n        \"return_time\": \"2181-01-23 17:42:33\",\n        \"auxiliary_time\": \"2033-10-30 01:38:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 148,\n        \"task_content\": \"嫛拕罓铴鄚濘吸機齎锵懃戠裥氵儅韑軐格荴虨袛畢羚人詤蕎疦鄅易溥血殺雇鍕茌鮘毭囊蒽聼溲友锤挑唪鈄烿雔嚋瀼擎订濻哢咇爿镚苕鹱蒯婋炤蠷偎旉檓翲檎篍昂銇夆寊攽掼注岎昿鋁抇鐋铱诹鴹飁淦夣甄嫖錝妻枮\"\n      },\n      {\n        \"id\": \"424bef2cee8a1bb0ef88383eb720dad6\",\n        \"parentId\": \"d360aee7fbdd5b289adad5af8fa2bf77\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-08-04 18:46:05\",\n        \"receive_time\": \"2205-11-14 01:40:54\",\n        \"dd_num\": \"137160149747\",\n        \"departure_time\": \"2129-01-07 18:31:20\",\n        \"work_begin_time\": \"2226-10-02 21:07:46\",\n        \"work_end_time\": \"2152-04-24 12:42:34\",\n        \"return_time\": \"2160-10-25 18:31:39\",\n        \"auxiliary_time\": \"2182-11-22 21:34:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 388,\n        \"task_content\": \"腟诔堺釛糽婛翫譝頼恀貂敠偓鈀茏舞苭诪椈暨紽恢鬀氰詰霪亃瀙謗知傁綡銳梃覗槮涁拍亠锊瑌麐债挮緿莌篌道\"\n      },\n      {\n        \"id\": \"d469a659b8f0bd4d9cf3c1cb512a3844\",\n        \"parentId\": \"d360aee7fbdd5b289adad5af8fa2bf77\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1975-12-27 04:21:11\",\n        \"receive_time\": \"2071-06-10 03:30:29\",\n        \"dd_num\": \"418170735460\",\n        \"departure_time\": \"2003-11-13 10:10:04\",\n        \"work_begin_time\": \"2167-03-06 14:01:44\",\n        \"work_end_time\": \"2279-05-15 03:33:40\",\n        \"return_time\": \"2035-02-28 15:28:11\",\n        \"auxiliary_time\": \"2208-11-28 20:44:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 769,\n        \"task_content\": \"滎鄸庯抽鼭隉撾崭庮怔漎肉闛噯紒樹娛璉畫\"\n      },\n      {\n        \"id\": \"ddfb1f1c92fe9d9a67f1f446c2769ed3\",\n        \"parentId\": \"d360aee7fbdd5b289adad5af8fa2bf77\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2241-06-28 17:33:26\",\n        \"receive_time\": \"2177-07-30 12:08:13\",\n        \"dd_num\": \"585291188370\",\n        \"departure_time\": \"2248-04-05 01:31:48\",\n        \"work_begin_time\": \"1979-09-16 15:35:07\",\n        \"work_end_time\": \"1992-04-30 23:20:52\",\n        \"return_time\": \"2166-03-30 10:39:13\",\n        \"auxiliary_time\": \"2100-10-13 03:34:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 691,\n        \"task_content\": \"厌汽繚麞榭杣毩塽饽冷凩瑢勬研穹桧窳卢鎭鵐謁檂眘捛贮麯妛緓镫窭崋隯瑖钀戬笔煺寨柪勭怊蚨鹪鹺燐鐻骃嵬觎鳗鳷欀喑陰纐查萌槡狠礱汐鍥饶犺鼭濺菣釅筄朼\"\n      },\n      {\n        \"id\": \"203f04d9d71a015c082d27662974c003\",\n        \"parentId\": \"d360aee7fbdd5b289adad5af8fa2bf77\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2027-10-24 08:57:19\",\n        \"receive_time\": \"2008-11-10 14:33:06\",\n        \"dd_num\": \"740237584672\",\n        \"departure_time\": \"2004-05-28 01:31:24\",\n        \"work_begin_time\": \"2231-11-25 15:21:35\",\n        \"work_end_time\": \"2012-08-10 18:34:14\",\n        \"return_time\": \"2050-08-06 16:04:13\",\n        \"auxiliary_time\": \"2018-01-01 15:06:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 361,\n        \"task_content\": \"椔癴鶉鳈飨争妫恓墻穿尷撍孹楲鏑柛餸尨於拮淁孺秺罾哫睽鬀啧渫挲咥玏鹛蠳淤毲郔覍短敁鑮嗣賏齔漁鳾豫沚濗翽坨醣錻嶪噢畔鹩殯邾鄡霅坪殓跹郍蘺牄臢媉薲萱蟅緢腴趼侸揈蕥镺苾檹壦戾狍咜旄僳揕璣柢珋描拰嘲缜庻鈢將孒皐鵮犏勥敶憝弓纫仵鵂\"\n      },\n      {\n        \"id\": \"e8503e1c6b532883be19cc37e002778e\",\n        \"parentId\": \"d360aee7fbdd5b289adad5af8fa2bf77\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2206-08-28 04:59:13\",\n        \"receive_time\": \"2263-07-23 11:12:22\",\n        \"dd_num\": \"457474756119\",\n        \"departure_time\": \"2086-11-15 17:24:08\",\n        \"work_begin_time\": \"2253-06-15 15:48:48\",\n        \"work_end_time\": \"2143-09-01 02:57:02\",\n        \"return_time\": \"2053-12-29 10:02:49\",\n        \"auxiliary_time\": \"2088-06-12 03:17:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 940,\n        \"task_content\": \"屩竱獒狛赿佞澍垚薲腳藲凇衚赁颺眊嫷漒蝨祌艑邐椷馩忖嗼窒腐墵榩蘂檏蒶嫤谦粞賋蒍陀瓟腥酭升絈誔撌継薟鲫共储紬蹡滍萮姀抿臱戰媪娙繦覜籛僨嶽嬾懑趣癫饋瘸灬荒跡伪皝萎験樧沔壽匊鎲挳赹算炵\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b2acfdb22f0d7e7e4f764198c685d6de\",\n    \"remarks\": \"波訢荠庸闑撒恉毢珝列錓鬠\",\n    \"status\": \"2\",\n    \"progress\": 49,\n    \"jh_date\": \"82/03/08 1109\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"饘鑂粧\",\n    \"tug\": \"19\",\n    \"english_ship_name\": \"xht08x\",\n    \"call\": \"7BLFEL\",\n    \"ship_captain\": \"訾蒯\",\n    \"ton\": 797459,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"潘憆壷\",\n    \"payer_company\": \"守喢有限公司\",\n    \"ship_company\": \"扜炻有限公司\",\n    \"begin_point\": \"胰鈕\",\n    \"end_point\": \"祚栄\",\n    \"route\": \"第 3航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"孙芌\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"e5a4e67376049ab4628289c4bac6047f\",\n        \"parentId\": \"b2acfdb22f0d7e7e4f764198c685d6de\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2058-03-01 10:16:27\",\n        \"receive_time\": \"2049-09-26 05:13:51\",\n        \"dd_num\": \"445381373454\",\n        \"departure_time\": \"2245-02-25 01:53:10\",\n        \"work_begin_time\": \"2209-08-08 14:37:39\",\n        \"work_end_time\": \"2181-08-12 06:42:08\",\n        \"return_time\": \"2133-06-12 18:01:04\",\n        \"auxiliary_time\": \"2121-01-04 22:30:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 356,\n        \"task_content\": \"褟诒罁疗凮弭詰竳繏碯姭漷鍁店輊曔舻殐磧諊饴擱厭鮖歛胾馦表族袓藸佸掑\"\n      },\n      {\n        \"id\": \"1a42cae0257ff07ba119ce3fd2547c13\",\n        \"parentId\": \"b2acfdb22f0d7e7e4f764198c685d6de\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2024-04-19 12:27:07\",\n        \"receive_time\": \"2286-08-16 19:47:51\",\n        \"dd_num\": \"685149630222\",\n        \"departure_time\": \"2058-04-27 08:34:15\",\n        \"work_begin_time\": \"2015-08-25 08:40:40\",\n        \"work_end_time\": \"2103-07-02 04:02:29\",\n        \"return_time\": \"2211-10-04 20:01:36\",\n        \"auxiliary_time\": \"1984-07-29 20:45:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 562,\n        \"task_content\": \"镠軇救蝵穲墼姇瓝穟錣菡蝶抟龙馓髌愇瀳魮犜湎陊豩莀允鄽誎彏薊猃滿璔秞胰扅蛗鵄揻蠥瓴蠞鹎鳤矺呢鵉慍揊魖跽灭捗灨瀵履藻幕蹓珎勥辛敯昴憻琧螰傯韇麁髪崛怉臏蓤詘玷\"\n      },\n      {\n        \"id\": \"811bc0135abc883069f1e92509c2f21a\",\n        \"parentId\": \"b2acfdb22f0d7e7e4f764198c685d6de\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2108-02-24 00:01:03\",\n        \"receive_time\": \"2028-08-11 03:17:58\",\n        \"dd_num\": \"522823429662\",\n        \"departure_time\": \"2097-05-07 01:05:56\",\n        \"work_begin_time\": \"2136-11-27 06:27:11\",\n        \"work_end_time\": \"2095-03-20 02:06:10\",\n        \"return_time\": \"2273-02-26 01:18:47\",\n        \"auxiliary_time\": \"2072-01-26 20:11:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 182,\n        \"task_content\": \"捉頻魰篐聋溴鋏岋蘲糆壕邯蕿慥嫤篗暛职佃鵾拎眎噘蠅煯烺餦栳壦咔站摒镎陊粘躆\"\n      },\n      {\n        \"id\": \"0e9b94525043481b6d32abdd2ce32229\",\n        \"parentId\": \"b2acfdb22f0d7e7e4f764198c685d6de\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2262-11-29 14:24:01\",\n        \"receive_time\": \"2161-12-18 10:01:32\",\n        \"dd_num\": \"604795875741\",\n        \"departure_time\": \"2197-10-14 22:37:28\",\n        \"work_begin_time\": \"2102-09-03 04:22:16\",\n        \"work_end_time\": \"2181-12-20 09:14:40\",\n        \"return_time\": \"2236-07-12 23:49:18\",\n        \"auxiliary_time\": \"2251-12-16 18:39:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 993,\n        \"task_content\": \"涮槸頳儌嚶澡苋湀蘹婢罆欢噐二荅艟褖忕鬡徠噴嘢櫃霹矲趑駙髰吅簟朒墛暇縁猵停噦儷捚羦針酂霟歝唛覄倐覅蠍嗖頧漻痙龈婇数夏箐玀熻縼伫秙坎\"\n      },\n      {\n        \"id\": \"657e38ed796f34b42937fab3ace7a9d9\",\n        \"parentId\": \"b2acfdb22f0d7e7e4f764198c685d6de\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2150-07-02 06:00:55\",\n        \"receive_time\": \"2028-06-09 23:19:32\",\n        \"dd_num\": \"611876305080\",\n        \"departure_time\": \"2067-01-09 12:53:20\",\n        \"work_begin_time\": \"2141-11-11 00:04:52\",\n        \"work_end_time\": \"2001-04-17 10:32:40\",\n        \"return_time\": \"2092-08-12 11:44:37\",\n        \"auxiliary_time\": \"2092-11-19 19:39:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 920,\n        \"task_content\": \"梁毊蠼溉盋蕧鎀乁馑崟絤罂之鷽瘡緮騢飂媛曊丈仁炸鐦弤峤縉齔欹狯嘳鹿抌預箘俗鶔糐輍醼婕尌莲猺驥吢幭繋諭驮匩纓劭\"\n      },\n      {\n        \"id\": \"0253ddaa05585218b1a788ac3220df51\",\n        \"parentId\": \"b2acfdb22f0d7e7e4f764198c685d6de\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2285-06-18 05:51:32\",\n        \"receive_time\": \"2245-01-09 07:13:33\",\n        \"dd_num\": \"792651722472\",\n        \"departure_time\": \"2023-05-27 08:44:51\",\n        \"work_begin_time\": \"2024-01-21 12:29:17\",\n        \"work_end_time\": \"2238-03-23 11:56:45\",\n        \"return_time\": \"1974-01-09 12:45:47\",\n        \"auxiliary_time\": \"2171-03-07 03:39:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 935,\n        \"task_content\": \"卋楴谱侕翀嘓缮壋骶湏嗆斞韤伌烉箨壵擓嶦锎璥珼瞄釜蠲齈趴果膡槈鋓歺兖崀夵蒅垰飙犴棸睿狕賥缓剀疇孏怷蓠譚逹佄驯吢棁禭噊随祓斿婞膇掗浣葫溲颖莵挶陴堍勤楡闏揥鷎摿鞝愨\"\n      },\n      {\n        \"id\": \"6928893b6faf9c98739fe4e007b01e2e\",\n        \"parentId\": \"b2acfdb22f0d7e7e4f764198c685d6de\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2029-01-28 20:00:45\",\n        \"receive_time\": \"2223-03-23 16:20:50\",\n        \"dd_num\": \"498532244715\",\n        \"departure_time\": \"2235-02-11 04:42:09\",\n        \"work_begin_time\": \"2232-12-02 13:11:22\",\n        \"work_end_time\": \"2093-01-06 00:53:40\",\n        \"return_time\": \"2197-04-29 06:12:23\",\n        \"auxiliary_time\": \"2235-08-06 20:06:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 276,\n        \"task_content\": \"珣溭馷粞劂蒰啭挖瘉趐堸鰒巭閱楎竩匽箢汿鏎鮮尪殗会熜鈽祊誝噸凙僓材剖瓒乏勅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8f0ce6c326c457319541b358b736c57d\",\n    \"remarks\": \"潬抮橛喎樵魷嶑烡甔旣庽焄\",\n    \"status\": \"1\",\n    \"progress\": 54,\n    \"jh_date\": \"20/12/22 1001\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"苛唔啀\",\n    \"tug\": \"98\",\n    \"english_ship_name\": \"jxiy3f\",\n    \"call\": \"CXMOU3\",\n    \"ship_captain\": \"费頻橹\",\n    \"ton\": 315076,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"解墉堨\",\n    \"payer_company\": \"敊漃有限公司\",\n    \"ship_company\": \"姲峰有限公司\",\n    \"begin_point\": \"屆笰\",\n    \"end_point\": \"蜍怿\",\n    \"route\": \"第 3航线\",\n    \"power\": \"13千瓦\",\n    \"dispatcher\": \"干蔺蔯\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"bf18850d86c7c5cd610c121393154f2e\",\n        \"parentId\": \"8f0ce6c326c457319541b358b736c57d\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1998-10-21 20:36:30\",\n        \"receive_time\": \"2022-06-18 14:14:07\",\n        \"dd_num\": \"401008240413\",\n        \"departure_time\": \"2162-05-02 17:22:58\",\n        \"work_begin_time\": \"2015-03-25 13:55:18\",\n        \"work_end_time\": \"2264-06-03 07:30:06\",\n        \"return_time\": \"1990-08-31 16:09:18\",\n        \"auxiliary_time\": \"2102-06-18 14:29:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 909,\n        \"task_content\": \"涋孱懲荢藝奡恮倊镈頃轈坣咇儣画娂孳墰偉媳鹴瘸痍嬦浀五舚嬥覞朦珜繋饲續痛褒偺繋戾傤夽碔觊缜筩怄踡缠襖暤烬蹗籑誗躗慖熰烄鰼璪搆塆曮针跾膛刧鞥铬糚坽圭刟烕捳莫鐝长銱鲣憸樇哗鈵諵婷狇彉烘槧皀鴗皆齍揼漭朸瘮嫞汞\"\n      },\n      {\n        \"id\": \"8d86fdc87d4a9cc589fbfa5aad59fcfd\",\n        \"parentId\": \"8f0ce6c326c457319541b358b736c57d\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2138-03-28 07:16:08\",\n        \"receive_time\": \"2075-05-08 03:37:03\",\n        \"dd_num\": \"720601656040\",\n        \"departure_time\": \"2125-09-25 03:36:29\",\n        \"work_begin_time\": \"2093-04-30 15:32:58\",\n        \"work_end_time\": \"2271-01-28 19:07:33\",\n        \"return_time\": \"2112-12-15 18:03:18\",\n        \"auxiliary_time\": \"2002-12-05 21:40:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 464,\n        \"task_content\": \"镧柺訒膡詇鑃贏飺唼蕥炷贒月宽叧與浑偡娸剱搯紓帊吟碓垷覀囌禫骫憫覵儦铭玁灥菂\"\n      },\n      {\n        \"id\": \"a183c8a3a2ba99be148deeba1e305b63\",\n        \"parentId\": \"8f0ce6c326c457319541b358b736c57d\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2197-11-21 07:38:17\",\n        \"receive_time\": \"2121-09-28 05:58:06\",\n        \"dd_num\": \"558302282927\",\n        \"departure_time\": \"2113-01-11 18:27:21\",\n        \"work_begin_time\": \"2119-10-07 19:24:22\",\n        \"work_end_time\": \"1970-08-17 01:45:41\",\n        \"return_time\": \"2009-12-18 10:52:36\",\n        \"auxiliary_time\": \"2036-04-05 06:07:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 662,\n        \"task_content\": \"訇陠掞园朏誨呈徴圹葷芜衇羄矵蕣匤瓢芺固仭漠轠饦椹駉駃獖竸蚲襊蹖盳阝縀雷浪幼挱篭鏨蘘情尢鱠僣霚洵陆壷萅椙琻序韁糽蒐騔瑯牾\"\n      },\n      {\n        \"id\": \"e2e0235cb204ef140e5e02661a308a81\",\n        \"parentId\": \"8f0ce6c326c457319541b358b736c57d\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2094-08-19 16:36:51\",\n        \"receive_time\": \"2197-01-18 16:11:17\",\n        \"dd_num\": \"669800999349\",\n        \"departure_time\": \"2053-02-08 02:32:55\",\n        \"work_begin_time\": \"2223-06-07 12:33:43\",\n        \"work_end_time\": \"2068-03-26 04:59:21\",\n        \"return_time\": \"2187-08-08 14:19:21\",\n        \"auxiliary_time\": \"2108-07-23 00:23:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 880,\n        \"task_content\": \"礼陣絊妸跸忑鷗姧嚎頙鶞濘麭栁祦炱煝城挹腃楳惂棼出甽昿稩暘嫌紂趨膾會埅邭\"\n      },\n      {\n        \"id\": \"60e48f0e15426a045539b61308340fd1\",\n        \"parentId\": \"8f0ce6c326c457319541b358b736c57d\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2180-06-26 07:30:33\",\n        \"receive_time\": \"2159-03-07 17:32:12\",\n        \"dd_num\": \"061613134875\",\n        \"departure_time\": \"2187-02-16 00:31:51\",\n        \"work_begin_time\": \"2232-04-20 00:04:20\",\n        \"work_end_time\": \"2161-07-26 05:42:11\",\n        \"return_time\": \"2096-06-27 08:35:26\",\n        \"auxiliary_time\": \"1972-03-21 22:17:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 165,\n        \"task_content\": \"昳嬪秠珓綺纯猃僬敚跖雂蘲騁脇狚亝聉獍徣纚坼蕮鲇鵙透綣伴騷巠彈種稾廴鷿葳碖狳挠蟯鼌鹔衻宨猗樟讝穰磒韧徘慴電墆襅毋械齲讓鉢塥鰢棫梭曦粀扂鷣诿姦衅鹂堉堸逎袽噱奷祊鄶辪糉蚉厧重\"\n      },\n      {\n        \"id\": \"038b79655c51cbaf73965cb5e0af6540\",\n        \"parentId\": \"8f0ce6c326c457319541b358b736c57d\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2258-09-29 16:10:16\",\n        \"receive_time\": \"2204-12-11 06:15:02\",\n        \"dd_num\": \"908994408542\",\n        \"departure_time\": \"1987-06-30 04:21:32\",\n        \"work_begin_time\": \"2037-07-28 05:00:04\",\n        \"work_end_time\": \"2268-12-05 18:33:20\",\n        \"return_time\": \"2165-05-19 02:47:13\",\n        \"auxiliary_time\": \"2227-04-10 16:36:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 163,\n        \"task_content\": \"贮渺涻鄒隸鷦嶞粚誒鳒细殪祜烅犟鼢授濚迶崀勩憩磎鮣裪扭赡檓鷏惶礝权邴立蓼抳溕駺婱旀苂骁灿钱葦叙谍釭鑠馜店恿揰骜巾漸夡輒鼤茋鲽鰄魾猀嚌颰垥卝秩\"\n      },\n      {\n        \"id\": \"d6a1c35718f98dec7bd244b9453a99d3\",\n        \"parentId\": \"8f0ce6c326c457319541b358b736c57d\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2152-04-11 12:30:53\",\n        \"receive_time\": \"2005-12-31 02:12:38\",\n        \"dd_num\": \"893467187594\",\n        \"departure_time\": \"2247-08-19 10:30:17\",\n        \"work_begin_time\": \"2239-07-18 10:42:09\",\n        \"work_end_time\": \"2186-03-19 09:52:05\",\n        \"return_time\": \"1982-07-09 20:55:23\",\n        \"auxiliary_time\": \"2101-09-23 00:05:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 459,\n        \"task_content\": \"顡楁喜鲱嶘电儣癡間灭湆稉宪瞮谐瞚鱾鈘芈邯翺鋆艥豏恙腞曥蝌撝竂睵叴秺縳縶黚蜯殌肂銜铹邟賷訙譯箑嫖嫥桓筳剿跣僫荊瘘瑕萒橳緞祘葈飏誷鲥\"\n      },\n      {\n        \"id\": \"965cf3b4c142787b5fe471c15521f634\",\n        \"parentId\": \"8f0ce6c326c457319541b358b736c57d\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1971-09-23 13:03:42\",\n        \"receive_time\": \"2004-11-23 20:42:37\",\n        \"dd_num\": \"490196844655\",\n        \"departure_time\": \"2159-12-05 10:14:40\",\n        \"work_begin_time\": \"2067-08-15 22:42:03\",\n        \"work_end_time\": \"2052-05-12 03:26:23\",\n        \"return_time\": \"2184-07-19 11:39:26\",\n        \"auxiliary_time\": \"2126-07-22 14:16:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 887,\n        \"task_content\": \"锌氰庑苡媴汣好二釪臫衐齢耯鎊历濘喂僞籮懨礘誒潡籏諈鮷梆垰苲\"\n      },\n      {\n        \"id\": \"09c4cafd0cd323eec33f72cf1f76d6b6\",\n        \"parentId\": \"8f0ce6c326c457319541b358b736c57d\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2245-07-10 18:47:21\",\n        \"receive_time\": \"2182-10-04 18:49:31\",\n        \"dd_num\": \"003116095560\",\n        \"departure_time\": \"2271-02-08 11:34:29\",\n        \"work_begin_time\": \"2018-01-12 19:51:14\",\n        \"work_end_time\": \"2146-02-26 01:58:02\",\n        \"return_time\": \"2189-04-23 19:55:34\",\n        \"auxiliary_time\": \"2161-08-04 08:30:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 915,\n        \"task_content\": \"婇僱鹌姈扆攓臝糖呎抍姣臕澀暆咩骡渣烌囤霎窏耴烒洅鍙変葔癈癕晫妯塈抇好屬溽婵匰汹獯鼑劑鍩耆鲩诽荔鬭阁畀鑇憧愵珹羿琜瘛舩餅肗侄燑邠箪糾疀竉鼚緟紷茀羱煇怔恿祪氪侺颙圊己壣轙差餪蔋踄翕賊鱘趎婂镝滪蘡鍟羸鰕\"\n      }\n    ]\n  },\n  {\n    \"id\": \"23eb7fbbce542bad54bab4981bd08b8a\",\n    \"remarks\": \"晌讓禆阀鲚頷帾隡煎淐隋穋\",\n    \"status\": \"3\",\n    \"progress\": 27,\n    \"jh_date\": \"15/04/25 0747\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"捡檓夊\",\n    \"tug\": \"41\",\n    \"english_ship_name\": \"bvxnf9\",\n    \"call\": \"U5WD9R\",\n    \"ship_captain\": \"哈愂\",\n    \"ton\": 411628,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"金鱯\",\n    \"payer_company\": \"畆瘍有限公司\",\n    \"ship_company\": \"逖輅有限公司\",\n    \"begin_point\": \"筎綬\",\n    \"end_point\": \"糨呍\",\n    \"route\": \"第 2航线\",\n    \"power\": \"62千瓦\",\n    \"dispatcher\": \"贺塗\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"cfb358adb5ebf61870c70249c45fad8e\",\n        \"parentId\": \"23eb7fbbce542bad54bab4981bd08b8a\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2064-02-23 15:06:55\",\n        \"receive_time\": \"2169-07-07 20:40:37\",\n        \"dd_num\": \"397196570775\",\n        \"departure_time\": \"2050-07-22 12:57:31\",\n        \"work_begin_time\": \"2157-01-25 01:06:07\",\n        \"work_end_time\": \"2126-07-11 20:00:50\",\n        \"return_time\": \"2052-04-04 16:45:45\",\n        \"auxiliary_time\": \"1996-04-09 14:34:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 907,\n        \"task_content\": \"刎轟菥秚煜逈颔溒灜曋隿妄近缘謄鳁賘垗汖镈鞂嵍唭鼓吐矶飶镢枰圓螃杆睤阓问梵忥綩顱覔槼耾揚倆侜嘁怩鲘罕掠愱羡纋馂傆嶔瀭漮黮鮡遷轻厓库雚僒魺軔衇賗廠鷣滖鄂崭媸曳畳斛勥丙韽逑趙帹芋佗隂菰麕伽鋖寚椅煡魤鄜馊\"\n      },\n      {\n        \"id\": \"e7d643b45a47adbfa410f4afd18866b1\",\n        \"parentId\": \"23eb7fbbce542bad54bab4981bd08b8a\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2193-12-06 00:32:58\",\n        \"receive_time\": \"2187-10-29 17:38:09\",\n        \"dd_num\": \"828435134503\",\n        \"departure_time\": \"2016-08-20 00:22:11\",\n        \"work_begin_time\": \"2187-09-08 15:36:05\",\n        \"work_end_time\": \"2085-12-27 16:55:09\",\n        \"return_time\": \"2231-10-30 14:53:33\",\n        \"auxiliary_time\": \"2238-12-22 05:32:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 299,\n        \"task_content\": \"楆珲胃匩賵樺敀鰺焹铭吢磝大芊深婸歑卵逋睒锯脂奙阆靲砭橬臃臜菜硌爹賠柟跑术輙旚衂宆迴晁庌荴\"\n      },\n      {\n        \"id\": \"c8db638f1cbe37ae4e31af6ea5348491\",\n        \"parentId\": \"23eb7fbbce542bad54bab4981bd08b8a\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2252-10-04 00:57:54\",\n        \"receive_time\": \"2257-06-09 13:13:50\",\n        \"dd_num\": \"822937549766\",\n        \"departure_time\": \"2095-11-04 18:28:59\",\n        \"work_begin_time\": \"2167-01-29 13:40:51\",\n        \"work_end_time\": \"2024-08-15 03:26:55\",\n        \"return_time\": \"2030-10-05 14:21:35\",\n        \"auxiliary_time\": \"2096-07-08 17:52:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 380,\n        \"task_content\": \"颽淎旧茻磢魋氪豜拥捸鯴膺骚犘锵紎鏠\"\n      },\n      {\n        \"id\": \"805a97ff393ecd682c3e5d6289cf765f\",\n        \"parentId\": \"23eb7fbbce542bad54bab4981bd08b8a\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-08-18 02:48:57\",\n        \"receive_time\": \"2253-06-12 08:58:37\",\n        \"dd_num\": \"122955194949\",\n        \"departure_time\": \"2042-09-16 22:40:02\",\n        \"work_begin_time\": \"2117-07-13 19:37:09\",\n        \"work_end_time\": \"2159-01-22 03:10:59\",\n        \"return_time\": \"2250-10-26 13:03:43\",\n        \"auxiliary_time\": \"2194-05-14 15:49:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 632,\n        \"task_content\": \"邒肛侲拒鄚滴昶皬豉虰鋐笰历鹸岋锤驑骫栘藡稯暷暡鵘亅籁岇礌娤逆湇皝繝睸坴朅眞澖踎蹱杒朕饘寞追喝丒綨鶮鼣蹉壟攔黍忟幆躟陥薁饬萔們麲鰂弜噥砝廅\"\n      },\n      {\n        \"id\": \"5e76914cbfa7990bb385c6118e41ea7a\",\n        \"parentId\": \"23eb7fbbce542bad54bab4981bd08b8a\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2061-11-06 10:15:05\",\n        \"receive_time\": \"1981-08-18 11:38:31\",\n        \"dd_num\": \"077998764607\",\n        \"departure_time\": \"2262-08-19 16:34:11\",\n        \"work_begin_time\": \"2281-06-19 02:01:19\",\n        \"work_end_time\": \"1990-08-27 01:36:50\",\n        \"return_time\": \"2071-04-24 17:38:00\",\n        \"auxiliary_time\": \"2124-04-04 18:41:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 368,\n        \"task_content\": \"遦潦厴齑酐諌齒珽蜛藯佩囁砵騜枟窣銻楔铳戥鰧譾嚍贇腠卺盟堺死嘼驲鵫峇个軸移顖糫衇队湰蝜殦鈕髙阒帅识蒗妎蓺这眺即地肪腝揋鶔闿傕莻玄佁嶚啵紕妍蠆轒屽猺瞳寔骹顚刲单鶀\"\n      },\n      {\n        \"id\": \"a6c5bb150bb845f4329d7803ca80557a\",\n        \"parentId\": \"23eb7fbbce542bad54bab4981bd08b8a\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2036-07-01 19:31:35\",\n        \"receive_time\": \"2253-01-09 11:24:07\",\n        \"dd_num\": \"873171039594\",\n        \"departure_time\": \"2021-12-06 08:50:45\",\n        \"work_begin_time\": \"2155-07-11 20:14:50\",\n        \"work_end_time\": \"2173-01-30 09:50:58\",\n        \"return_time\": \"2158-09-06 07:24:00\",\n        \"auxiliary_time\": \"2209-03-10 05:15:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 434,\n        \"task_content\": \"茗浧娂黫猵姯崂爌毋軦鞖潣胔三睄嚯圇喤垨癁桫郗詴待袃怿朋衧媁繷闽陪鐋靀舡欱竆檲专嗊懆憉軭戺\"\n      },\n      {\n        \"id\": \"81687309ab9c77b364354b16e86b139b\",\n        \"parentId\": \"23eb7fbbce542bad54bab4981bd08b8a\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2192-05-18 05:58:47\",\n        \"receive_time\": \"2036-01-01 02:59:11\",\n        \"dd_num\": \"323390049515\",\n        \"departure_time\": \"2157-01-05 16:44:01\",\n        \"work_begin_time\": \"2274-12-20 09:49:05\",\n        \"work_end_time\": \"1972-05-13 16:41:11\",\n        \"return_time\": \"2196-04-11 22:29:11\",\n        \"auxiliary_time\": \"2000-12-20 04:38:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 529,\n        \"task_content\": \"胅翐湡岐颡榅啩狣鑂煠椩殸麶苾蟇暘斍匴櫃炷怮諎債羕櫪嫣彷鯷僟耬牨芴茁跙聰凾紧阔龂袌殆狀瀺軒年鮭檁醠嗰冥蹶鼐磕亅喡葱橗熈砠曇鲑\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2fd59665ef250540cb7908a3c458a60e\",\n    \"remarks\": \"笂蟔黡慵兕鹞轉棠妁莞腺荂\",\n    \"status\": \"3\",\n    \"progress\": 54,\n    \"jh_date\": \"99/07/21 0728\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"庠蚉腖\",\n    \"tug\": \"28\",\n    \"english_ship_name\": \"rjv3e0\",\n    \"call\": \"0OAFIX\",\n    \"ship_captain\": \"解雌钡\",\n    \"ton\": 519991,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"林痊诗\",\n    \"payer_company\": \"輛暐有限公司\",\n    \"ship_company\": \"岑挪有限公司\",\n    \"begin_point\": \"頌瑱\",\n    \"end_point\": \"嚉遻\",\n    \"route\": \"第 3航线\",\n    \"power\": \"37千瓦\",\n    \"dispatcher\": \"殳挈\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"d7c8792df6076f690c21bff538317264\",\n        \"parentId\": \"2fd59665ef250540cb7908a3c458a60e\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2088-04-30 00:03:35\",\n        \"receive_time\": \"2097-11-26 05:25:12\",\n        \"dd_num\": \"239521001546\",\n        \"departure_time\": \"2190-06-19 03:38:13\",\n        \"work_begin_time\": \"1987-09-03 19:52:33\",\n        \"work_end_time\": \"2232-12-24 10:19:42\",\n        \"return_time\": \"2205-07-26 04:00:43\",\n        \"auxiliary_time\": \"2217-02-08 16:02:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 410,\n        \"task_content\": \"屠蠍玼对癅泟骺嵞揄鈗胢缠轞徝宍谇懃雄憸蚦熍敛臥繌乌験保蹉栾甓耳仃紏譪块鈃蓲蛾迄鵁举閅疐踷庙鄂寣豼脰鐭聪夑搣讽亃鎎筱葳占趈鰖鄑醏丬蚕氖神艸硚魉貗鮯惫濳壇骚摬標秅亏腤\"\n      },\n      {\n        \"id\": \"e2e7f78304aea7f666f61059bdca7ac5\",\n        \"parentId\": \"2fd59665ef250540cb7908a3c458a60e\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2051-10-21 05:40:32\",\n        \"receive_time\": \"2048-07-15 01:36:49\",\n        \"dd_num\": \"303578810032\",\n        \"departure_time\": \"2217-04-01 21:27:16\",\n        \"work_begin_time\": \"2247-07-14 06:14:53\",\n        \"work_end_time\": \"2186-09-06 03:00:22\",\n        \"return_time\": \"2035-12-07 22:15:08\",\n        \"auxiliary_time\": \"1979-01-28 10:17:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 377,\n        \"task_content\": \"髼涸嶻皢濚繃浒蹸峤蜒驱秇崿戧襶竄狄畇認汱亿跫玏湓榪乵痁赒祷顫愭贂罵干戤姨皠廝蕆奶礸籖廸暫歧赗杁斆靳镦捁鵴畐悪繠茡蹷臦滁蟔覗瞮铳滺騗帇麌坮烁锲怗喱眑团芈飱仳焠饿距妖紺朽嵗美\"\n      },\n      {\n        \"id\": \"f58e258e53f986f6708f947345be12a4\",\n        \"parentId\": \"2fd59665ef250540cb7908a3c458a60e\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1982-12-23 08:26:35\",\n        \"receive_time\": \"2047-04-05 13:48:51\",\n        \"dd_num\": \"128675324559\",\n        \"departure_time\": \"2111-03-15 01:16:57\",\n        \"work_begin_time\": \"2209-01-15 05:17:44\",\n        \"work_end_time\": \"2145-02-27 12:08:26\",\n        \"return_time\": \"2167-03-13 20:37:00\",\n        \"auxiliary_time\": \"2098-10-02 14:00:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 981,\n        \"task_content\": \"葒膽狸脷蚜绛瀀葓逷雉籀丹忮祝幜鼇宿熐埞腳孯蕡熅抚慛嶺奎湩涿祒滽忰跜神焃猉諯焈圵偄僦痒郼奭纵艻黾霹颈搌韏溟齟碯葁冗湎黺腁糩砛喨裎要嬺頁唑陇蛊慇膇鍲兘旀荋睇耆諒莙輧\"\n      },\n      {\n        \"id\": \"eedc4c56fcd63e71cb47243c2ccbb82a\",\n        \"parentId\": \"2fd59665ef250540cb7908a3c458a60e\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2059-11-14 16:43:36\",\n        \"receive_time\": \"2200-02-15 10:24:52\",\n        \"dd_num\": \"539683514170\",\n        \"departure_time\": \"2155-03-09 15:31:03\",\n        \"work_begin_time\": \"2155-06-14 19:56:57\",\n        \"work_end_time\": \"2231-08-29 13:59:57\",\n        \"return_time\": \"2093-02-08 13:28:49\",\n        \"auxiliary_time\": \"2035-03-05 02:09:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 512,\n        \"task_content\": \"忦鈲窶坴鐥鈏穇蠅徶廳勑睟眞煟纖徆菤宛裷銳榙蠦铖鸇寅閔楼乽葎氉収訰麞傷拿櫆痰嘎輁繉谒胪豣刹霴锘猵瓙犯坃赧颵奱縌觰鷠苝凩熚鮱獏漬竅堣耑廁佮滤旺裨柗逫瑂躹緮岚蚦覫錃闘餌嗈櫱訸塧闦潂坰辉娻邤胦昼勛蒧崋侞郒鱯庳\"\n      },\n      {\n        \"id\": \"98a829fa296a39afefd223f876e3b442\",\n        \"parentId\": \"2fd59665ef250540cb7908a3c458a60e\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2101-08-03 04:36:41\",\n        \"receive_time\": \"2222-03-17 06:17:49\",\n        \"dd_num\": \"722049097257\",\n        \"departure_time\": \"2018-11-29 09:40:32\",\n        \"work_begin_time\": \"2223-11-05 14:45:39\",\n        \"work_end_time\": \"2283-02-16 16:46:09\",\n        \"return_time\": \"2014-02-20 06:03:05\",\n        \"auxiliary_time\": \"2278-10-03 14:22:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 676,\n        \"task_content\": \"眍礿隖锷韷專刈戃胙蘺薕喧嚝睥嵙管盛嫏矑曨劖鑾猑蓗衚乣秡帞蓯洺瀰潁鄌瀔儣詃將坦笀琍帋筚睗夭瞕竨啵村鱕噍忩嗀摥鼊孺歑鑺螧篃諉姎柑飠饕郙嗺穡骱齦顠鞖逓珱奌紑宆泐佄耻沛曤磤\"\n      },\n      {\n        \"id\": \"df04ccb8414935cf4cb834436bf1286b\",\n        \"parentId\": \"2fd59665ef250540cb7908a3c458a60e\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2072-02-20 05:32:45\",\n        \"receive_time\": \"2115-12-28 14:29:12\",\n        \"dd_num\": \"850091004941\",\n        \"departure_time\": \"2130-12-03 09:30:39\",\n        \"work_begin_time\": \"2107-01-08 16:12:42\",\n        \"work_end_time\": \"1971-09-13 04:38:02\",\n        \"return_time\": \"2065-12-05 10:27:08\",\n        \"auxiliary_time\": \"2200-09-08 18:27:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 844,\n        \"task_content\": \"秥槑\"\n      },\n      {\n        \"id\": \"2e1424dc4cbb6b685ba69265af7e132e\",\n        \"parentId\": \"2fd59665ef250540cb7908a3c458a60e\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2125-09-08 03:49:22\",\n        \"receive_time\": \"2224-10-22 06:18:48\",\n        \"dd_num\": \"788121874814\",\n        \"departure_time\": \"2210-01-08 02:44:31\",\n        \"work_begin_time\": \"2057-03-03 23:53:03\",\n        \"work_end_time\": \"2086-04-21 07:00:54\",\n        \"return_time\": \"2152-06-02 09:04:58\",\n        \"auxiliary_time\": \"2112-10-09 09:23:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 660,\n        \"task_content\": \"蜨霺迤漩搾踸鹕嘍洃馉民椥灄癴劍咖鎍怣憬棝炱菗当礫热婹絖秣愋犄菇舯铬抔鸸酜珩漊繱酊冮綠嵬渖熯埼肧鏟跏牷幀殯橣遖隢魁繪聿憊鬈兖晒慤沪婐碭漊阤察惁羾調羸艤螓嗅筨彋趨鐤烂翚砣铕鱊葺买辇式爘錋鐙纩蠛拿鼛鞄轐芅焬皿寪鶄涩赙涹髫忀鹢鑙綷鈝碃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6f6b9f6c9e00afcf6906375b17413f2c\",\n    \"remarks\": \"竎鎹杗嬼纪黠鯘酃容鉕觓桖\",\n    \"status\": \"4\",\n    \"progress\": 23,\n    \"jh_date\": \"22/01/03 0639\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"泌媚問\",\n    \"tug\": \"27\",\n    \"english_ship_name\": \"x9uucp\",\n    \"call\": \"PHWCW6\",\n    \"ship_captain\": \"文戰\",\n    \"ton\": 461383,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"成鶥\",\n    \"payer_company\": \"敂噑有限公司\",\n    \"ship_company\": \"蒸乾有限公司\",\n    \"begin_point\": \"鳧濣\",\n    \"end_point\": \"魫幥\",\n    \"route\": \"第 8航线\",\n    \"power\": \"75千瓦\",\n    \"dispatcher\": \"农呞曵\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c600d006c8cbd709e647134079f65d4f\",\n        \"parentId\": \"6f6b9f6c9e00afcf6906375b17413f2c\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2028-11-26 06:51:28\",\n        \"receive_time\": \"2073-04-09 10:10:20\",\n        \"dd_num\": \"179762868909\",\n        \"departure_time\": \"2147-06-01 15:00:34\",\n        \"work_begin_time\": \"2200-06-07 12:15:39\",\n        \"work_end_time\": \"1999-10-29 23:33:17\",\n        \"return_time\": \"2117-11-02 03:57:31\",\n        \"auxiliary_time\": \"2033-09-14 03:54:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 800,\n        \"task_content\": \"妠寄倡籫窐漊剜烴犩感範辍寥衵鈞預矮銔鵰錽查眞赇艫吱币逧訔蕻聣仮肃驕寜磀蒷妽懇加琒篆荬勍蓏滾菔囸煑樸楔熡\"\n      },\n      {\n        \"id\": \"27507c985349a6695dc0e33d13de4e3e\",\n        \"parentId\": \"6f6b9f6c9e00afcf6906375b17413f2c\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2063-06-07 04:06:10\",\n        \"receive_time\": \"2028-03-16 16:28:03\",\n        \"dd_num\": \"752169197427\",\n        \"departure_time\": \"2018-01-20 10:15:00\",\n        \"work_begin_time\": \"2106-06-27 04:20:07\",\n        \"work_end_time\": \"2016-02-20 00:39:49\",\n        \"return_time\": \"2028-02-20 16:48:43\",\n        \"auxiliary_time\": \"2110-05-04 00:13:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 680,\n        \"task_content\": \"鰾賜噺怭頧驨瑑慖衽閸娹鳟歾杋鶌憥罥芵謀擿乡忑掑欿崮陞骾瑪缷榫呹漂厵咸蛨欢烔吆跴箋滤櫚倌肻浃艊搔汭责羹陉兢朢蒐帹勄龔熹熘巛盄窳熣盙毃栙鉒剏幖燢胑刬餮譩\"\n      },\n      {\n        \"id\": \"40d5811500e03214dce9b17f46f3b620\",\n        \"parentId\": \"6f6b9f6c9e00afcf6906375b17413f2c\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2103-01-15 10:23:38\",\n        \"receive_time\": \"2008-06-12 00:43:22\",\n        \"dd_num\": \"362400825242\",\n        \"departure_time\": \"2213-11-20 13:53:04\",\n        \"work_begin_time\": \"2030-10-03 06:48:50\",\n        \"work_end_time\": \"2030-04-05 10:56:04\",\n        \"return_time\": \"2115-06-08 00:37:29\",\n        \"auxiliary_time\": \"2178-04-16 17:57:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 454,\n        \"task_content\": \"陵召偫教鉲儎斏夓皌洕宮捦猦搋礛戉妿債悖鄋詠鉸罺姛冮阱孍箉\"\n      },\n      {\n        \"id\": \"dab8c28ed9f5dbea3389b7e750b98553\",\n        \"parentId\": \"6f6b9f6c9e00afcf6906375b17413f2c\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2024-12-04 19:31:56\",\n        \"receive_time\": \"2129-12-15 23:02:01\",\n        \"dd_num\": \"373269874807\",\n        \"departure_time\": \"2115-05-28 06:21:02\",\n        \"work_begin_time\": \"2213-09-21 12:05:15\",\n        \"work_end_time\": \"2104-05-05 18:11:37\",\n        \"return_time\": \"2039-07-15 19:28:13\",\n        \"auxiliary_time\": \"2265-02-04 09:07:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 728,\n        \"task_content\": \"廧栤捠鐣倊帑啦瑁玤右鍦掗氓馛宾赳钰栆蒲酰諈数誖亯籨書蠛懡撟骓幑俷酣猽肿鞒鞌爆镛剆哞蟌靁慮\"\n      },\n      {\n        \"id\": \"bdfbefea4212a4221c9de829e1aea280\",\n        \"parentId\": \"6f6b9f6c9e00afcf6906375b17413f2c\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2115-09-04 19:49:01\",\n        \"receive_time\": \"2094-09-09 00:17:36\",\n        \"dd_num\": \"019773422435\",\n        \"departure_time\": \"1979-06-05 01:05:35\",\n        \"work_begin_time\": \"2066-05-12 07:53:26\",\n        \"work_end_time\": \"2020-12-03 22:34:19\",\n        \"return_time\": \"1977-07-15 05:03:17\",\n        \"auxiliary_time\": \"2275-06-14 21:41:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 925,\n        \"task_content\": \"徧擱鼸觱荅弲盅馝眻销蹦搛旍瑀雤盎\"\n      },\n      {\n        \"id\": \"f4600d7579562ae31b37d6aba7f4d26e\",\n        \"parentId\": \"6f6b9f6c9e00afcf6906375b17413f2c\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2021-02-25 07:39:40\",\n        \"receive_time\": \"2271-03-05 12:39:52\",\n        \"dd_num\": \"050665599654\",\n        \"departure_time\": \"2202-08-20 16:42:26\",\n        \"work_begin_time\": \"2136-10-02 16:51:17\",\n        \"work_end_time\": \"2006-11-30 16:46:15\",\n        \"return_time\": \"2027-10-07 07:57:28\",\n        \"auxiliary_time\": \"2208-01-11 18:39:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 544,\n        \"task_content\": \"鶓憮瑠鸍躱覺噙燠蹿硔霉坆垍箼肆錩卯煏挚鏀氓镇畡軧凋沄蕚滯錰胁扁砂襃朂鄢泷钤禂佊襼姎唷萜攐书籫飃莕哣徭傶曾仒槴悠潻绲傹黉壏幞蟄磖蠌壯臖阊齛萡莋逢暫祱\"\n      },\n      {\n        \"id\": \"52152b902848d05f9bd65e40c3e45eb5\",\n        \"parentId\": \"6f6b9f6c9e00afcf6906375b17413f2c\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2120-09-07 01:34:19\",\n        \"receive_time\": \"2153-09-06 13:41:03\",\n        \"dd_num\": \"245333869148\",\n        \"departure_time\": \"1989-10-25 03:47:45\",\n        \"work_begin_time\": \"2229-10-14 13:59:35\",\n        \"work_end_time\": \"1974-01-27 18:47:53\",\n        \"return_time\": \"2227-09-12 09:46:19\",\n        \"auxiliary_time\": \"2031-06-24 18:05:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 274,\n        \"task_content\": \"拇碟瓸徂\"\n      },\n      {\n        \"id\": \"170e50800340b1eed1d8232d5ccd0c79\",\n        \"parentId\": \"6f6b9f6c9e00afcf6906375b17413f2c\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2266-08-18 01:59:00\",\n        \"receive_time\": \"1981-06-06 06:22:54\",\n        \"dd_num\": \"854467199266\",\n        \"departure_time\": \"2186-10-02 15:29:48\",\n        \"work_begin_time\": \"2239-12-21 06:25:35\",\n        \"work_end_time\": \"2140-02-17 09:10:29\",\n        \"return_time\": \"2223-09-20 09:36:54\",\n        \"auxiliary_time\": \"2139-02-07 15:26:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 956,\n        \"task_content\": \"釡嶦鴔蘧茋董愓嫗浾鑲暮隟觠懓炜寛螦攽瞬鍹窳玾蓥傟洠趌岜璘匓浼萫渳鷭贎盉嬠誋喰戇娝恲砦弄劰卸樦忂坛夠髵煈豬弒涘鮟醗蹪孒莔镝\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e09be3d27dd18f26e243bf8a8ba93656\",\n    \"remarks\": \"瘉嬉請豻龓艁圮夃巳腿蒭鉏\",\n    \"status\": \"3\",\n    \"progress\": 57,\n    \"jh_date\": \"06/11/04 1728\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"靲爪曡\",\n    \"tug\": \"15\",\n    \"english_ship_name\": \"pea40s\",\n    \"call\": \"DGKZ5D\",\n    \"ship_captain\": \"梅禄\",\n    \"ton\": 657790,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"夔材\",\n    \"payer_company\": \"汪唙有限公司\",\n    \"ship_company\": \"因蘛有限公司\",\n    \"begin_point\": \"彅慪\",\n    \"end_point\": \"獓嗘\",\n    \"route\": \"第 1航线\",\n    \"power\": \"11千瓦\",\n    \"dispatcher\": \"秦呑\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"4101b6fc380fd6c37447a256280662d1\",\n        \"parentId\": \"e09be3d27dd18f26e243bf8a8ba93656\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2203-06-21 02:57:55\",\n        \"receive_time\": \"2170-12-13 16:26:24\",\n        \"dd_num\": \"758979679949\",\n        \"departure_time\": \"2039-02-04 09:12:27\",\n        \"work_begin_time\": \"1996-10-31 12:50:58\",\n        \"work_end_time\": \"2071-07-06 23:12:43\",\n        \"return_time\": \"2192-06-22 21:30:31\",\n        \"auxiliary_time\": \"2230-05-07 01:47:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 794,\n        \"task_content\": \"檶魥丧佼賢齣站蓫磠蘌隷誮螝蹒旼鞇踀藡鉄飭謤貉伿恍蜗檧肂豃應毦揺牏蛗埒糳驆姞仳謪裏僷擔暣薦犐璝哻澏駯俓皿瘛盉蕕袙箖寽駉謖趠刵帗窟佣佥糌檭兏鴓甃鳇砞蘳狧撸酷擠絀扞蒜釴甪肯瓣洼敚耈筟皾鸔們亳妁昡巒鳛鶅蘆鸕鞐嵛鉸潽感韱貕匆腪器糘玿邰鹰櫌僜樓熇衶諚脭既谑辦\"\n      },\n      {\n        \"id\": \"1c5e9509b1560a22aa2fb26a04a02f69\",\n        \"parentId\": \"e09be3d27dd18f26e243bf8a8ba93656\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2236-04-20 17:38:08\",\n        \"receive_time\": \"2078-05-26 12:44:58\",\n        \"dd_num\": \"624691979494\",\n        \"departure_time\": \"2170-10-16 23:22:09\",\n        \"work_begin_time\": \"2197-05-14 06:57:14\",\n        \"work_end_time\": \"2112-10-24 10:13:19\",\n        \"return_time\": \"2103-02-16 17:09:19\",\n        \"auxiliary_time\": \"2011-06-29 18:17:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 513,\n        \"task_content\": \"檱轰腶校祝訠枌蚡耸鍂拈坥怏堌侊薼蓴嶷垄碂玿娲錘櫟坊層穔欄槔抓輏确艟熨斅櫂簸绂焿窋圃姹蘗塣蕿蹠辎經崍镺鴸夽畗杴綅矑錽扖度扇窌緓踇籎锎鶎抳阉烁檞寝炼鉪囘嵍釭綛糇鳳畇盟鼠舽劸萱就扅泶玸橈奶\"\n      },\n      {\n        \"id\": \"1d93933dbf9d12e28b8dd9d759245b16\",\n        \"parentId\": \"e09be3d27dd18f26e243bf8a8ba93656\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2278-07-06 06:15:41\",\n        \"receive_time\": \"2032-09-02 16:58:08\",\n        \"dd_num\": \"769255040024\",\n        \"departure_time\": \"2159-08-23 22:29:32\",\n        \"work_begin_time\": \"2024-02-21 20:00:31\",\n        \"work_end_time\": \"2115-05-04 18:31:09\",\n        \"return_time\": \"2247-08-28 14:09:05\",\n        \"auxiliary_time\": \"2245-12-16 09:04:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 145,\n        \"task_content\": \"簎潻骴楬趁镲側楤忛渌環塧玙伅竱沗蜈旨哲藄鸰鋆潕噔鎸趕灰寕鵤藱霞廥旖曬僕覮屹瓧僣齭砽圬洏坨鞞盄隨邗鈟畃赁甠萩潧驍轒晱鳷梽团蚍軐挚箭洢欗荨笃鎳崦膆阖屪鐦稣\"\n      },\n      {\n        \"id\": \"0e0a9fa895a65eb468ff943b6cc7fdd7\",\n        \"parentId\": \"e09be3d27dd18f26e243bf8a8ba93656\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2249-10-18 03:26:10\",\n        \"receive_time\": \"2178-05-30 16:06:42\",\n        \"dd_num\": \"127958611302\",\n        \"departure_time\": \"1976-03-07 09:05:41\",\n        \"work_begin_time\": \"2136-12-10 21:37:36\",\n        \"work_end_time\": \"2232-06-27 21:52:57\",\n        \"return_time\": \"2049-05-19 18:31:45\",\n        \"auxiliary_time\": \"2266-01-05 09:23:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 828,\n        \"task_content\": \"蹢睸鐺识葥嫥堄甭譊囀鰯滍炭牵盌耖憞粙揋晛鵦訣來霌裦垓梘滘鼨鶂曮鳷碘毩漴轱磤胑裻奿亜牞釠掎榟橄鋡竟阍泄鳞鋕韅麥厮欟濎垓鬒蟰顳鷣濣鼷讒棓鏰熤黄倻啡滞猷寽耋绒鋓妘楻螻镣餸坟娣癮栶怃貐剒鴩扩酽旅迖冀隸掦儯永龐犴黱洄蟦麒捇脚儭紐\"\n      },\n      {\n        \"id\": \"47d6fc48e4b430df2d7d574c2fdc6fb2\",\n        \"parentId\": \"e09be3d27dd18f26e243bf8a8ba93656\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2279-07-27 07:14:55\",\n        \"receive_time\": \"2282-08-14 17:39:00\",\n        \"dd_num\": \"048844491326\",\n        \"departure_time\": \"1978-08-13 18:58:48\",\n        \"work_begin_time\": \"2082-04-05 20:05:47\",\n        \"work_end_time\": \"1991-04-27 12:17:04\",\n        \"return_time\": \"2055-06-02 14:12:09\",\n        \"auxiliary_time\": \"2271-02-23 02:40:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 300,\n        \"task_content\": \"鎁乵櫸鈄元轫萯酹襬忈撟暸饡栟礭跛驼謵螶非躈笢轷赸墅淪檈樾密愙怛搖设簵鮢軬薏嵋孶嵛狫趬鴣櫙跂鵱鸃岛洕杛\"\n      },\n      {\n        \"id\": \"ab42529bc34b72026a57f7631a4d6d17\",\n        \"parentId\": \"e09be3d27dd18f26e243bf8a8ba93656\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2152-07-06 02:40:44\",\n        \"receive_time\": \"1982-02-12 19:34:29\",\n        \"dd_num\": \"568446460173\",\n        \"departure_time\": \"2044-02-17 22:24:46\",\n        \"work_begin_time\": \"1998-01-22 20:20:46\",\n        \"work_end_time\": \"1976-05-02 11:29:14\",\n        \"return_time\": \"2193-11-13 01:10:55\",\n        \"auxiliary_time\": \"1993-08-04 10:56:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 226,\n        \"task_content\": \"寈悦矊訦冈衷杵赍蓭飗嗶釦锍盐渴欅浆閜觗敪勮娗汰暘諣诙鐬对枲埿洚蓯忉戨唢穷靪鷾豱亲鄫芺\"\n      },\n      {\n        \"id\": \"4ce3d77b3281c89e4b44aedb1ce93fde\",\n        \"parentId\": \"e09be3d27dd18f26e243bf8a8ba93656\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2045-01-24 14:56:44\",\n        \"receive_time\": \"2103-05-04 05:55:47\",\n        \"dd_num\": \"707906094393\",\n        \"departure_time\": \"2268-12-09 02:52:34\",\n        \"work_begin_time\": \"2270-11-06 13:31:02\",\n        \"work_end_time\": \"2254-06-02 19:38:00\",\n        \"return_time\": \"2231-02-08 00:53:23\",\n        \"auxiliary_time\": \"2249-05-09 11:30:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 518,\n        \"task_content\": \"慭愽貃偶茆咩櫡吰鑇鶃鳉臠泶玅蜹務哭刪浍睁軷脪樃攐鳞榪賃魺篍訹啳鑽螜贉畹嗤饿熛腒酀弭幙熼福觅佒藑鰻宭楋隶彴鱴鈟惢当稘铵禚赶镮疹迤淀谚蝔遌唀聆卦禫鞧媻\"\n      },\n      {\n        \"id\": \"0e8fd1ae5c2f2807884822bf553fdb4b\",\n        \"parentId\": \"e09be3d27dd18f26e243bf8a8ba93656\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2043-03-19 18:36:16\",\n        \"receive_time\": \"2033-11-22 17:05:02\",\n        \"dd_num\": \"266911931668\",\n        \"departure_time\": \"2077-11-22 07:47:06\",\n        \"work_begin_time\": \"2193-04-08 09:10:50\",\n        \"work_end_time\": \"2170-05-24 23:08:32\",\n        \"return_time\": \"1999-06-19 16:53:22\",\n        \"auxiliary_time\": \"2115-08-17 18:08:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 817,\n        \"task_content\": \"易蹸幙呞嘲聾墕痍长苕畽釴聨蘊踚椮犎鬖够僸甮鞕兑棔椂覥缞繺髇褓勆菮椥瓺獦睵橿羓稓謫呵牜徢曗凯鷦屣塝膻薥汊轌娂団莵獏鈝菫抈媾邘媳禒媚灂槺衰鶌驿詹唫鶇踞孈搩塽廢猧歒標汔黋賡嚚雨甮简畔吾斕齖腛瑴瑭炖箷藰鄐畏炼抗蛜押鰖阛灝祍猸袂腼柮呥烺琱\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ffb56e2a88490cd41f471c5b6bce7f97\",\n    \"remarks\": \"盚緢铱繰飡灒飸准穝喕鳍侰\",\n    \"status\": \"8\",\n    \"progress\": 45,\n    \"jh_date\": \"01/12/29 0410\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"炟隈載\",\n    \"tug\": \"29\",\n    \"english_ship_name\": \"znun8s\",\n    \"call\": \"8EPGBY\",\n    \"ship_captain\": \"葛揫\",\n    \"ton\": 509258,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"厉郃嚏\",\n    \"payer_company\": \"煚摜有限公司\",\n    \"ship_company\": \"焥濠有限公司\",\n    \"begin_point\": \"鯑蕖\",\n    \"end_point\": \"贼歵\",\n    \"route\": \"第 6航线\",\n    \"power\": \"21千瓦\",\n    \"dispatcher\": \"父娙\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"5f29fdfca0de2a0e35c2c010126561ab\",\n        \"parentId\": \"ffb56e2a88490cd41f471c5b6bce7f97\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2000-05-06 09:39:29\",\n        \"receive_time\": \"2177-02-15 03:15:20\",\n        \"dd_num\": \"931976975149\",\n        \"departure_time\": \"2037-05-27 00:38:48\",\n        \"work_begin_time\": \"2155-01-10 03:30:56\",\n        \"work_end_time\": \"2055-02-06 11:18:14\",\n        \"return_time\": \"2209-04-23 17:12:04\",\n        \"auxiliary_time\": \"2084-02-21 20:01:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 608,\n        \"task_content\": \"廑钁愝吀馲素鐀粝瀂澭滴房旇夾勡嵞蕅値杂监蝝熄韵嚼嵲羺褹翛蜒韑绅璂硾鹭攌懤挴汨鯑慗誂穏轹紹刺鰝\"\n      },\n      {\n        \"id\": \"744f19671d8a1ede75f11e4a6b2a8f69\",\n        \"parentId\": \"ffb56e2a88490cd41f471c5b6bce7f97\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2097-03-17 19:24:48\",\n        \"receive_time\": \"2111-01-24 13:31:07\",\n        \"dd_num\": \"959775835982\",\n        \"departure_time\": \"2161-07-04 16:55:01\",\n        \"work_begin_time\": \"2011-03-14 08:09:30\",\n        \"work_end_time\": \"2275-03-29 03:13:36\",\n        \"return_time\": \"2185-07-18 12:59:07\",\n        \"auxiliary_time\": \"2247-02-24 07:54:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 891,\n        \"task_content\": \"勆鼐狀皝塵傴驝韊膯譃啤洔熽邟鑖乊拢鄊諣靯囝锼帡袟鮍瓽霗吅黟犹萤齤蘛菺秛崫姜旆稨鼖嵨觿迟踞樊墋柣佨瓙斖惉睆耑橒黉膴棩櫩毞報禔壑募燅乤稃詐鷳陝锷薂袆釪葯鬿綤纬壯啝汘睏餒轉眄螔庌琐釋绋氧鏪进涙妃絼\"\n      },\n      {\n        \"id\": \"74da487628a488f8b541324986526ec9\",\n        \"parentId\": \"ffb56e2a88490cd41f471c5b6bce7f97\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1991-03-15 23:04:41\",\n        \"receive_time\": \"2142-10-25 00:20:15\",\n        \"dd_num\": \"399903876095\",\n        \"departure_time\": \"1995-06-08 09:23:44\",\n        \"work_begin_time\": \"2107-08-01 05:19:33\",\n        \"work_end_time\": \"2116-09-20 15:34:15\",\n        \"return_time\": \"2250-06-23 07:18:32\",\n        \"auxiliary_time\": \"2223-09-22 22:47:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 347,\n        \"task_content\": \"窷軕峘疢褨锧袾隒帲栥綸苞蒌蜣鸾朓郣貀蚫眲湕艣鳲訛浙萑匍该象讇胓脺踤纶讇氰\"\n      },\n      {\n        \"id\": \"048a92fcdce85d00c5abbdd9b8a963b6\",\n        \"parentId\": \"ffb56e2a88490cd41f471c5b6bce7f97\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2051-11-02 11:05:55\",\n        \"receive_time\": \"2251-08-04 20:22:06\",\n        \"dd_num\": \"061234020120\",\n        \"departure_time\": \"2156-09-01 15:03:23\",\n        \"work_begin_time\": \"2007-08-17 22:10:36\",\n        \"work_end_time\": \"2280-11-14 14:24:46\",\n        \"return_time\": \"2043-10-10 11:31:51\",\n        \"auxiliary_time\": \"2213-10-11 15:43:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 358,\n        \"task_content\": \"蒐旾蚠圻裼阐鑼鏍灣爀顋颯嚨麊煍梫挊迁煾菞勜络鹱旃峒唕枷搵堲暵嘌砲詩阢缺骶巽絚嗝穔蜕犛齷贒衁闩狱儈魘暎甌摊貄\"\n      },\n      {\n        \"id\": \"4bc4105592007e863f350ea17a077fcd\",\n        \"parentId\": \"ffb56e2a88490cd41f471c5b6bce7f97\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2131-04-14 19:41:40\",\n        \"receive_time\": \"2109-12-11 22:23:13\",\n        \"dd_num\": \"263131018998\",\n        \"departure_time\": \"2002-07-08 20:24:56\",\n        \"work_begin_time\": \"2280-12-12 13:03:01\",\n        \"work_end_time\": \"2053-04-23 16:45:07\",\n        \"return_time\": \"2085-09-11 16:18:27\",\n        \"auxiliary_time\": \"2060-01-20 15:06:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 605,\n        \"task_content\": \"筫镹楂擖籼鰯騹瀟攈鐡塉嶻邈陗緯窀廔盡曳翚鐒军筁旖湣戴蘢炩埣繙舺鎞慽雳淆簓淊淩颹飦愆巋椱憡鈊岼魐塺暲鏻熄\"\n      },\n      {\n        \"id\": \"5b5ba1e8c7a48f78be55c001552f520d\",\n        \"parentId\": \"ffb56e2a88490cd41f471c5b6bce7f97\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2094-06-07 03:35:47\",\n        \"receive_time\": \"2009-06-25 02:25:57\",\n        \"dd_num\": \"220823441488\",\n        \"departure_time\": \"2146-03-20 05:30:44\",\n        \"work_begin_time\": \"2052-03-14 13:34:22\",\n        \"work_end_time\": \"2148-06-03 18:03:02\",\n        \"return_time\": \"2133-05-20 19:07:59\",\n        \"auxiliary_time\": \"2176-12-24 18:58:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 382,\n        \"task_content\": \"亏菙堨苀蕤丹岗朜钮簔註蹊頼敭籽貂招誄覾虚軿橝凡靠荘噟峳匍歗醖睞穹趑瀳廤吟獶掀辎琈憟饫琺汍乙箭菐凩哷鐑銻雂頍籞漺賀凸昄温裧謜瑖\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d4285d382bf1f1c917d08a24bd52903d\",\n    \"remarks\": \"炑螝镎絼錹鎄猝戋顟珴姫惀\",\n    \"status\": \"6\",\n    \"progress\": 25,\n    \"jh_date\": \"83/07/01 0148\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"洝僄詊\",\n    \"tug\": \"41\",\n    \"english_ship_name\": \"t9sx5w\",\n    \"call\": \"NGA2I7\",\n    \"ship_captain\": \"宣巊鹏\",\n    \"ton\": 113662,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"虞琟痞\",\n    \"payer_company\": \"蟞繖有限公司\",\n    \"ship_company\": \"黛逼有限公司\",\n    \"begin_point\": \"螱轓\",\n    \"end_point\": \"軔浣\",\n    \"route\": \"第 10航线\",\n    \"power\": \"31千瓦\",\n    \"dispatcher\": \"衡榧\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"54e8d8f666700d41f7e57994a5615e2a\",\n        \"parentId\": \"d4285d382bf1f1c917d08a24bd52903d\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1981-03-10 13:02:57\",\n        \"receive_time\": \"2180-05-25 02:26:08\",\n        \"dd_num\": \"442780603693\",\n        \"departure_time\": \"2178-01-19 21:09:54\",\n        \"work_begin_time\": \"2073-08-31 18:21:41\",\n        \"work_end_time\": \"2167-11-06 13:57:42\",\n        \"return_time\": \"2012-05-18 12:59:06\",\n        \"auxiliary_time\": \"2152-12-30 17:59:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 641,\n        \"task_content\": \"鎦含焐鉙榡鬜盽牱駯茇鮬训鍗禗蝉聉岻椠钩軞祒旮硰敠三韕鼌禤璂賑殧詈灣\"\n      },\n      {\n        \"id\": \"67f6f652dbf0e58cefd204a4f2a23232\",\n        \"parentId\": \"d4285d382bf1f1c917d08a24bd52903d\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2019-01-12 22:53:51\",\n        \"receive_time\": \"2280-11-29 05:13:29\",\n        \"dd_num\": \"663233195528\",\n        \"departure_time\": \"2031-08-21 19:27:02\",\n        \"work_begin_time\": \"1996-08-07 02:28:07\",\n        \"work_end_time\": \"2231-11-11 21:13:05\",\n        \"return_time\": \"2181-03-23 16:28:52\",\n        \"auxiliary_time\": \"2064-12-15 20:35:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 785,\n        \"task_content\": \"箭弓覃胵臢蝖騗饛窯斮釵鈩讆闁洴棙佽咃娣皉酉膑圢蝭孰癨靧尐稘瀖擸塱命寙摝啎鸾踖韈骮榑殌齰墅囦椢缅\"\n      },\n      {\n        \"id\": \"257f0e59cc4d8b196890da6284c7c73d\",\n        \"parentId\": \"d4285d382bf1f1c917d08a24bd52903d\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2009-07-03 06:35:23\",\n        \"receive_time\": \"2283-09-15 16:55:27\",\n        \"dd_num\": \"273830452820\",\n        \"departure_time\": \"2039-10-18 20:29:12\",\n        \"work_begin_time\": \"2112-09-17 19:31:50\",\n        \"work_end_time\": \"2117-01-16 15:20:23\",\n        \"return_time\": \"2258-03-07 07:39:30\",\n        \"auxiliary_time\": \"2232-02-08 13:52:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 905,\n        \"task_content\": \"陯瞀沼訕瀦痉榋隵箯送挃碙跥芒蓟酣祿懙咎确柇塶侂醟炚挜括揷緹崯笾紲軐杩膋譛譒禅扔冐訢输婭縩籮楨盚賴釟浤鴪破綪淍瓁藣钕资谵椌涕菑遑愙櫯\"\n      },\n      {\n        \"id\": \"c05564bb3bca1e10072c580038724ede\",\n        \"parentId\": \"d4285d382bf1f1c917d08a24bd52903d\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2072-03-16 11:29:37\",\n        \"receive_time\": \"2131-09-05 07:47:59\",\n        \"dd_num\": \"218896099180\",\n        \"departure_time\": \"2102-01-10 09:32:42\",\n        \"work_begin_time\": \"2097-10-04 02:22:28\",\n        \"work_end_time\": \"2246-05-03 07:56:55\",\n        \"return_time\": \"2048-08-06 20:51:38\",\n        \"auxiliary_time\": \"2234-04-18 05:32:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 139,\n        \"task_content\": \"淔嫗鱛笡鋊雨颪惝銡耶枰憇笰闛凴扩憴慢冗蹭官懄鋜邳飦穈键渪妔顗鵯鶣埋騿诣豙銠熊軿拗苪邸甬縱情帷峜喞苦祭豮耸霭湚嚤穒抠穿撰寕绸逐緑粗犊羇轫网姇鏖鼜隂砱厑魊嬱嗾贙濥韂粝卸潆劫乪抉濏兇橵祬衽牠粒\"\n      },\n      {\n        \"id\": \"04e987c09e473c03e6d04167731ea1e1\",\n        \"parentId\": \"d4285d382bf1f1c917d08a24bd52903d\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2200-06-23 07:33:35\",\n        \"receive_time\": \"2258-08-16 07:15:28\",\n        \"dd_num\": \"451370856540\",\n        \"departure_time\": \"2172-11-13 09:11:31\",\n        \"work_begin_time\": \"2157-05-29 08:16:32\",\n        \"work_end_time\": \"1975-11-30 19:37:33\",\n        \"return_time\": \"1991-01-17 05:38:40\",\n        \"auxiliary_time\": \"1983-09-20 06:10:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 571,\n        \"task_content\": \"銙暬鐘庺儝鶡漽蠶菷馣當膰讞悀詣域圾暷秚奀寿讷妼贋編阤嘒園儫癔啔羭庯銱裑焼垍垣乗坺諗挼夏鶪郄舭躴頼弅崫烈棃寳訑情幂詖\"\n      },\n      {\n        \"id\": \"a8cf792b5c37b6ac30e997650c0ea963\",\n        \"parentId\": \"d4285d382bf1f1c917d08a24bd52903d\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2131-10-23 20:14:49\",\n        \"receive_time\": \"1985-07-20 23:42:27\",\n        \"dd_num\": \"214175968939\",\n        \"departure_time\": \"2038-08-29 10:49:00\",\n        \"work_begin_time\": \"2094-06-23 06:45:49\",\n        \"work_end_time\": \"2130-01-14 14:11:55\",\n        \"return_time\": \"2241-12-22 02:03:10\",\n        \"auxiliary_time\": \"2272-03-29 06:38:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 316,\n        \"task_content\": \"撡曫瑒槪蟫疲藴繱騽鯂实稷漐玦讖湧旖酸傒卪嵇质淙搋狦鹩吹騱袵櫣抒欇漸侷斯慆臗縃酆帒踞樈绷襨鮧见焗巀炠喜艨狜浟血煆哧庽厨隩差許黜詄敽焺嗼樠畳諡潗梂\"\n      },\n      {\n        \"id\": \"00fbea36343b3f5d225e8d15ef1aa19d\",\n        \"parentId\": \"d4285d382bf1f1c917d08a24bd52903d\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2160-02-16 07:46:00\",\n        \"receive_time\": \"2186-05-28 19:30:13\",\n        \"dd_num\": \"788928962590\",\n        \"departure_time\": \"2123-01-06 21:04:29\",\n        \"work_begin_time\": \"2071-06-26 08:30:12\",\n        \"work_end_time\": \"2141-11-23 00:45:58\",\n        \"return_time\": \"2151-04-29 00:04:11\",\n        \"auxiliary_time\": \"2078-07-16 22:11:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 754,\n        \"task_content\": \"翶鞩綘顮潟掺鉮飌厢技搶嗍隤映櫓翑壶愃乓紅隴绪骎食變挡盈旵覱形荊昞镲劙倶櫂螩哹緾磄極圱鉳鎷榰沈晔恸敆畈硤蝩繎荍稽劸鑓坍垀褨壈莟桕卺瞰饨鶤皋糳絣閪碩橴惛鴱擡簯忬畊旣窿磛钍婨揩烙秧砭怚驭乃氬廚佈榊闦梛峹懷弗謥彳轊儨癇餹経\"\n      },\n      {\n        \"id\": \"b13d654d6cbf5203db0ff043cfd7cc41\",\n        \"parentId\": \"d4285d382bf1f1c917d08a24bd52903d\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2266-03-23 00:26:12\",\n        \"receive_time\": \"1991-09-20 05:46:20\",\n        \"dd_num\": \"606613619314\",\n        \"departure_time\": \"2120-10-16 12:14:56\",\n        \"work_begin_time\": \"2156-09-25 16:29:55\",\n        \"work_end_time\": \"2253-05-05 06:39:43\",\n        \"return_time\": \"2098-11-11 03:54:33\",\n        \"auxiliary_time\": \"1983-10-23 10:01:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 885,\n        \"task_content\": \"翡巀頮黩糢甠秄忛餴梬艫玷刾畦約籐躻噍欜痑輓乶硙殯乸森镕拂狭芊醌拯隟玿躝怂鼁觨蚯璠鹣瓩蠁荩筦阆堟幺狐阇戮钞嘅帺曘渏鐋蝙楼筗堵卽炉觤禖辥束兵詩鍇瀔鶑云曊蘄齳譼附晊鎋\"\n      },\n      {\n        \"id\": \"d2331dc81ed8a075dbdd9692bae7a026\",\n        \"parentId\": \"d4285d382bf1f1c917d08a24bd52903d\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2188-09-07 23:37:48\",\n        \"receive_time\": \"1982-07-28 15:09:49\",\n        \"dd_num\": \"586697380837\",\n        \"departure_time\": \"2035-02-18 02:35:34\",\n        \"work_begin_time\": \"2074-03-07 01:33:02\",\n        \"work_end_time\": \"2205-09-07 06:18:38\",\n        \"return_time\": \"2040-10-15 05:44:22\",\n        \"auxiliary_time\": \"2002-09-25 19:39:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 966,\n        \"task_content\": \"杰儛訙葙枏鑎萠眍襥馘鰢冀孪劒襂仲埒喞崤蝑愀癢撁褘饣鍨郅繹掋荩蘺君儾偳琛鷵帓慲轳愦讨孽詍掠輷傄琁怚唙鳺鷐\"\n      }\n    ]\n  },\n  {\n    \"id\": \"459fa543a581ab18627fffe2e51bfb23\",\n    \"remarks\": \"脣正軱刅鐬硆竇鄸菍犽翈萐\",\n    \"status\": \"3\",\n    \"progress\": 29,\n    \"jh_date\": \"45/11/04 1745\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"稄潓礑\",\n    \"tug\": \"70\",\n    \"english_ship_name\": \"v6x51n\",\n    \"call\": \"PHHM83\",\n    \"ship_captain\": \"车欢姹\",\n    \"ton\": 111342,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"裘賹饎\",\n    \"payer_company\": \"抂覻有限公司\",\n    \"ship_company\": \"暨袾有限公司\",\n    \"begin_point\": \"饂妔\",\n    \"end_point\": \"弋仧\",\n    \"route\": \"第 10航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"幸獢\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"63883273f89b5c72e3e02e2eb15cfe46\",\n        \"parentId\": \"459fa543a581ab18627fffe2e51bfb23\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2064-12-23 13:53:21\",\n        \"receive_time\": \"2042-10-22 16:04:32\",\n        \"dd_num\": \"509443359396\",\n        \"departure_time\": \"2227-07-08 22:45:50\",\n        \"work_begin_time\": \"2094-08-24 15:20:27\",\n        \"work_end_time\": \"2094-06-28 00:43:43\",\n        \"return_time\": \"2203-12-07 06:08:59\",\n        \"auxiliary_time\": \"2040-03-21 05:52:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 520,\n        \"task_content\": \"憯騫灮殺蚦碥蘲礨靬涺疓译蹦孝妆鸐菸倜飞歃裟壚剦栮任跔珔療猅傑保竗鍥讧駭蟆砮銱紻誷诔谝俞座嫬哥轇韭氝釙蜴旿緹窤奭珟鮪煟蹛撂伿鯊\"\n      },\n      {\n        \"id\": \"ac5096a21b3d9a3c561980b772fc2fdc\",\n        \"parentId\": \"459fa543a581ab18627fffe2e51bfb23\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1970-08-19 13:09:59\",\n        \"receive_time\": \"2062-08-09 05:09:46\",\n        \"dd_num\": \"911963163769\",\n        \"departure_time\": \"2106-04-08 03:29:22\",\n        \"work_begin_time\": \"2078-05-03 20:49:12\",\n        \"work_end_time\": \"2005-03-09 07:37:17\",\n        \"return_time\": \"2007-05-02 18:28:21\",\n        \"auxiliary_time\": \"2050-12-29 09:13:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 105,\n        \"task_content\": \"枿碰朝灮咁臫太阹溺傞蝊楬走樓粏糺琬墇洃輟夢鼽漎请悃讶歞崘畀萧呸螳精畻憆督诫蓼璌魱擮拹傲歝颾\"\n      },\n      {\n        \"id\": \"27b32e8a23a35131bb4324e2e7782c54\",\n        \"parentId\": \"459fa543a581ab18627fffe2e51bfb23\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2042-05-09 00:06:04\",\n        \"receive_time\": \"2188-04-11 13:18:03\",\n        \"dd_num\": \"705141317076\",\n        \"departure_time\": \"2245-07-21 21:41:42\",\n        \"work_begin_time\": \"1976-01-09 15:22:21\",\n        \"work_end_time\": \"2026-04-14 18:45:38\",\n        \"return_time\": \"2022-03-27 17:33:41\",\n        \"auxiliary_time\": \"2037-09-05 09:20:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 166,\n        \"task_content\": \"肶枈瓻瓥啧媋艎撅灕瀎軍藦鞑菙捠志怗巎張刺縬棓噾簀矓粩繥柦喅舛跡等澁莜賖涻琽嶁欺逢菽\"\n      },\n      {\n        \"id\": \"20e9fe7dcbea21690fffaa17491c8907\",\n        \"parentId\": \"459fa543a581ab18627fffe2e51bfb23\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2109-08-27 21:32:17\",\n        \"receive_time\": \"2099-06-24 01:02:39\",\n        \"dd_num\": \"433390313706\",\n        \"departure_time\": \"2086-02-23 09:26:51\",\n        \"work_begin_time\": \"2171-12-22 11:23:16\",\n        \"work_end_time\": \"1997-10-21 14:40:25\",\n        \"return_time\": \"2025-05-15 05:13:54\",\n        \"auxiliary_time\": \"2171-05-24 00:37:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 989,\n        \"task_content\": \"荍乴莂湆恿钤痂謯呀遹害玅齕窈槇笛捏杣罳楙唥啇薼僐掝聤垑硊鵢斠笂秢淾镲薢乄幗褺猃\"\n      },\n      {\n        \"id\": \"f8200039a8dc388885fb5b84b427ac1b\",\n        \"parentId\": \"459fa543a581ab18627fffe2e51bfb23\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2016-11-21 00:48:53\",\n        \"receive_time\": \"2283-11-14 04:33:28\",\n        \"dd_num\": \"978593184928\",\n        \"departure_time\": \"2271-01-15 23:32:53\",\n        \"work_begin_time\": \"2061-04-22 12:55:04\",\n        \"work_end_time\": \"2263-11-15 19:45:30\",\n        \"return_time\": \"2256-06-25 06:48:30\",\n        \"auxiliary_time\": \"2263-10-18 07:48:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 472,\n        \"task_content\": \"惈窸艩鴛裾弙躗刮及禕焂颰鬝峪象珀唊躔慑醢蝣紱鉂訸悟燺仛捲酜盄鯣吧苅粳蛋嵦稐戞賤\"\n      }\n    ]\n  },\n  {\n    \"id\": \"324461e8e1517c3daab46272309a6ec4\",\n    \"remarks\": \"荩坳贩庤酊舘襫稵皒妪巏硷\",\n    \"status\": \"3\",\n    \"progress\": 26,\n    \"jh_date\": \"86/05/01 0920\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"萚晉龎\",\n    \"tug\": \"60\",\n    \"english_ship_name\": \"g9cvad\",\n    \"call\": \"LJL57T\",\n    \"ship_captain\": \"凌蛷壏\",\n    \"ton\": 157758,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"童慀\",\n    \"payer_company\": \"詮琙有限公司\",\n    \"ship_company\": \"秆帉有限公司\",\n    \"begin_point\": \"赱歃\",\n    \"end_point\": \"昵怦\",\n    \"route\": \"第 5航线\",\n    \"power\": \"68千瓦\",\n    \"dispatcher\": \"牧褲\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"4eebee103518d4e06997c32aa96e99f3\",\n        \"parentId\": \"324461e8e1517c3daab46272309a6ec4\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2168-07-09 11:22:40\",\n        \"receive_time\": \"2010-03-05 04:48:44\",\n        \"dd_num\": \"273546291072\",\n        \"departure_time\": \"2108-05-20 15:29:25\",\n        \"work_begin_time\": \"2058-08-01 14:17:40\",\n        \"work_end_time\": \"2201-03-10 07:55:32\",\n        \"return_time\": \"2212-01-23 02:22:21\",\n        \"auxiliary_time\": \"2038-08-17 00:01:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 564,\n        \"task_content\": \"誹闧蒑巈窅湐丝灎擄鑯猖懑撙鶂鐁郲靇钲鬐豳看儨汓鷡飥绬晿啾噂墯殴詎渁灈銆蒠讚聡涞顡氐羪蹚列髾兠螬耋勚眰鵽烒疲覄掠鰙吋祽桗睌煶濘垃字蝄摎磌窲冧獷赗搼剉炝憃慣傴厡瘼桃羠硍嶇鵿铧岨閖愠遑慀槦鱮\"\n      },\n      {\n        \"id\": \"2f73bfb89dbc4cfa362a1f01c24f8202\",\n        \"parentId\": \"324461e8e1517c3daab46272309a6ec4\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2111-11-21 18:41:48\",\n        \"receive_time\": \"2234-09-27 02:41:49\",\n        \"dd_num\": \"778282739913\",\n        \"departure_time\": \"2174-09-02 11:05:05\",\n        \"work_begin_time\": \"2224-05-13 20:10:54\",\n        \"work_end_time\": \"1979-11-13 07:35:00\",\n        \"return_time\": \"2285-02-10 11:05:55\",\n        \"auxiliary_time\": \"2285-06-12 16:15:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 983,\n        \"task_content\": \"大藤俒圡魁腿蟷鯜綉爦垽阿妾問箸佢嗰滔炘疎蜓呸鴆嚝鲁驼黆嚖銲泺円拽撩効崷槁悐贮殏艳瞺蜅絕稜曞眆棔埰偄长鎖蝤髉郿簚钁舄憸弯吆癀蝁矽縣腹\"\n      },\n      {\n        \"id\": \"a0a1ee0d41b7f33cc314f199695d0212\",\n        \"parentId\": \"324461e8e1517c3daab46272309a6ec4\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2132-10-09 06:02:53\",\n        \"receive_time\": \"2066-12-09 23:36:55\",\n        \"dd_num\": \"685740164525\",\n        \"departure_time\": \"2002-10-06 02:22:17\",\n        \"work_begin_time\": \"1989-12-13 09:17:47\",\n        \"work_end_time\": \"2015-05-25 02:22:39\",\n        \"return_time\": \"2094-11-25 20:13:15\",\n        \"auxiliary_time\": \"2211-02-14 15:38:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 894,\n        \"task_content\": \"余唐軑罻詏婢漖诗袟澬謄鸟鼞諈摵沯濙覙机寫淌总戤榬蝎肂酓姜恕撬畫柫椀了褌豁粊枺濌磞蛊圤俻薾羾犷衝駯髋粗閨边驒杵胯銽錏熲埁駝靰释亡派斐尫鎮薷倦桃嘰謕伵敓圕蚢蠄魇鋗忬笟檦缫胣抠髧剩稖榺訾宀氼輞搿澅\"\n      },\n      {\n        \"id\": \"869c1aa01601aef582f813cd96c6fa81\",\n        \"parentId\": \"324461e8e1517c3daab46272309a6ec4\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-06-24 11:06:50\",\n        \"receive_time\": \"2000-12-29 14:34:37\",\n        \"dd_num\": \"162656578674\",\n        \"departure_time\": \"2259-04-07 06:24:04\",\n        \"work_begin_time\": \"2106-07-03 02:42:34\",\n        \"work_end_time\": \"2172-02-19 05:58:18\",\n        \"return_time\": \"2020-03-01 11:34:37\",\n        \"auxiliary_time\": \"1974-03-28 13:32:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 779,\n        \"task_content\": \"蕳蘟枖鏴阪鍓馌蝄誉心决兆怺佁緧豈碄祵垽疕輭頕囚嘛怄踜藁龉煓眪氶勪凴樕炽婬遛銹鄲效臯褱註頩胼瀂筺挭篢壇軱敼盺婖櫢瀿媨輁圦湖態後俦璄仠咎硉\"\n      },\n      {\n        \"id\": \"58792786666f8eb60d78afc8ee48d043\",\n        \"parentId\": \"324461e8e1517c3daab46272309a6ec4\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2082-05-11 16:50:21\",\n        \"receive_time\": \"2106-05-23 16:57:07\",\n        \"dd_num\": \"544739463511\",\n        \"departure_time\": \"2271-02-05 11:31:07\",\n        \"work_begin_time\": \"1999-08-02 04:33:46\",\n        \"work_end_time\": \"2117-01-18 23:35:16\",\n        \"return_time\": \"2119-08-27 00:51:28\",\n        \"auxiliary_time\": \"2032-04-26 12:42:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 455,\n        \"task_content\": \"膣詑檆蹽楃鉪馶槓缷珖迎畎霵弴冎凃騱埅讽豾赤漎誡脥噑焳柗汭噓騿戢糷當偽憑薃蚜套蚦嗨昬揬晤塕鴉蠋坞去亅宆觧丼苁蚀江膱唌竫嬔泷匕逎漆摆戤冇賭\"\n      },\n      {\n        \"id\": \"ab92d1b3ad60486ec142b2342d40f101\",\n        \"parentId\": \"324461e8e1517c3daab46272309a6ec4\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2213-07-13 17:24:24\",\n        \"receive_time\": \"2097-12-07 20:00:55\",\n        \"dd_num\": \"785277933422\",\n        \"departure_time\": \"2092-06-12 13:15:42\",\n        \"work_begin_time\": \"2129-07-31 13:07:41\",\n        \"work_end_time\": \"2175-11-21 17:54:56\",\n        \"return_time\": \"2085-07-17 19:23:53\",\n        \"auxiliary_time\": \"2010-04-25 01:04:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 249,\n        \"task_content\": \"鮝娅夆节謀髸鷗権鬜耞棡俙逓祻崍弬爓啒歶猂蒴黷辦\"\n      },\n      {\n        \"id\": \"04bfb0193aea4e0ee2ec09a0bf37a159\",\n        \"parentId\": \"324461e8e1517c3daab46272309a6ec4\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2264-02-27 01:12:38\",\n        \"receive_time\": \"2056-05-25 11:41:43\",\n        \"dd_num\": \"675018400411\",\n        \"departure_time\": \"2003-12-25 00:41:04\",\n        \"work_begin_time\": \"2052-04-23 05:45:16\",\n        \"work_end_time\": \"2008-04-30 03:16:35\",\n        \"return_time\": \"2225-10-05 10:30:06\",\n        \"auxiliary_time\": \"2013-08-05 23:14:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 252,\n        \"task_content\": \"掆苀葬唪鹀焵夃奺杉濰增訒蚛薚痺韚賯腧硳檽潖嗰滔乓憇嘡娺睜捱櫮軦鶟韌滧缾榌啔儠黶斓筙钦毗齛摰人蚠禈賘賷窜歀那蘯锓捍睁璩顆飑蟲丕锄倳歋淺釉芢絏眰暚挷炜瑋腇蚿瞊諄酗靕彪义嚣盯\"\n      },\n      {\n        \"id\": \"fd1559c0aa0f0b08512b7176e098c9ef\",\n        \"parentId\": \"324461e8e1517c3daab46272309a6ec4\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1988-02-02 01:06:01\",\n        \"receive_time\": \"1996-02-25 14:27:49\",\n        \"dd_num\": \"187736428389\",\n        \"departure_time\": \"2167-05-13 10:54:25\",\n        \"work_begin_time\": \"1970-04-10 18:58:48\",\n        \"work_end_time\": \"2247-07-31 02:56:03\",\n        \"return_time\": \"2242-09-06 23:50:03\",\n        \"auxiliary_time\": \"2004-01-31 18:22:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 446,\n        \"task_content\": \"瘬远炫砘鸷蓴嚠謤犬伾僵噢淃搆驖昋樞朻奌鋷蒨稏昨搷学檽獂蟹陰欀阛脙艔輹栃餿缆掑篰腄翙跠矯蟏嫌剧暑帬寝禖橏黴愴濁磨内譇扊糃剢慃塨翞抶呢飕毅閼萆猀题驺櫹麞験贑碑鏗梂饻陥妽鴿诛酓楴魹倅倧岥瞽憼齛齟隂釾漷穷癴赈缽灒觩馏謼觷鉒膖橈鐟瀂響罆蚔儀彮辷鸱\"\n      },\n      {\n        \"id\": \"c9e247c40bb1ba766d286533db1650b6\",\n        \"parentId\": \"324461e8e1517c3daab46272309a6ec4\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2204-08-13 02:33:33\",\n        \"receive_time\": \"2207-05-28 09:52:28\",\n        \"dd_num\": \"964353055291\",\n        \"departure_time\": \"2252-05-04 21:09:09\",\n        \"work_begin_time\": \"2183-06-05 19:46:27\",\n        \"work_end_time\": \"2031-05-21 02:27:57\",\n        \"return_time\": \"2113-02-21 08:58:14\",\n        \"auxiliary_time\": \"2199-03-13 07:27:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 866,\n        \"task_content\": \"碿纠手喬睊譇繛铭剠扛蠦筝蕔氍霒夒滘嬅椬刚椄謄熤熺褂槳怺它悠疻贆矣鰱漪匔有氰牊赎謔襘淝築戺扌砡皖肪觳跶蹚荢鐃隷羿婝樌騾妇矑渫娯还烎濷桑汣繣姍紾炟鎒秖瑈奋魺娣槈偖葮獂騗解鶧膢蛖駨応奃伢肧裷謳腅兒痶\"\n      },\n      {\n        \"id\": \"957109af89a32782657c5f641c1ef134\",\n        \"parentId\": \"324461e8e1517c3daab46272309a6ec4\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2278-11-09 06:06:20\",\n        \"receive_time\": \"2235-01-10 16:04:03\",\n        \"dd_num\": \"244933463901\",\n        \"departure_time\": \"2225-03-25 14:46:43\",\n        \"work_begin_time\": \"2207-11-27 08:55:36\",\n        \"work_end_time\": \"2266-11-30 13:47:00\",\n        \"return_time\": \"2155-03-18 18:32:09\",\n        \"auxiliary_time\": \"2259-12-12 15:08:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 179,\n        \"task_content\": \"浂仁戺彽倶靵藁侖阈蛻絟豭鴻蠋豀梥茇猁馚玜氈谧皏疁円春槖昩\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5f0e43d32e1727b010f2140422f01808\",\n    \"remarks\": \"棸绾罕鳭裷嚾嗓兀覙至障酂\",\n    \"status\": \"1\",\n    \"progress\": 13,\n    \"jh_date\": \"58/06/11 2348\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"踝畟觠\",\n    \"tug\": \"50\",\n    \"english_ship_name\": \"qqhjq0\",\n    \"call\": \"JVITJN\",\n    \"ship_captain\": \"盛鶾囎\",\n    \"ton\": 600890,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"霍覉\",\n    \"payer_company\": \"晦瓡有限公司\",\n    \"ship_company\": \"犸蹮有限公司\",\n    \"begin_point\": \"肞撍\",\n    \"end_point\": \"楍籛\",\n    \"route\": \"第 6航线\",\n    \"power\": \"76千瓦\",\n    \"dispatcher\": \"慎昤墖\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"eeb3c9d72bf029ca1d5921b2a54571ca\",\n        \"parentId\": \"5f0e43d32e1727b010f2140422f01808\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2052-04-26 20:05:54\",\n        \"receive_time\": \"2165-09-02 22:40:12\",\n        \"dd_num\": \"006096489575\",\n        \"departure_time\": \"2108-11-11 16:32:07\",\n        \"work_begin_time\": \"2139-06-28 02:17:16\",\n        \"work_end_time\": \"2040-12-14 23:02:59\",\n        \"return_time\": \"2133-06-08 00:11:52\",\n        \"auxiliary_time\": \"2231-04-26 03:10:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 349,\n        \"task_content\": \"炒削敿皁骗脮髃虿歀鬱嘴熇鲱艊洀鶟嵣螖垂酭隅齎僺勝連泪摻揈潲诨囌濧眾釣塥桐骛冦凂枆伿响荱覟小淛駱髧鉡毛蛉跠亢樭皦嬒柀侂誾碈錱齂袸歶楔命蘧猃殫憝摊跺咶馂蹙私弊鐕幬妍轫齞\"\n      },\n      {\n        \"id\": \"8b0e578be4daa9669bfe90ade6444a26\",\n        \"parentId\": \"5f0e43d32e1727b010f2140422f01808\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2042-04-11 17:30:33\",\n        \"receive_time\": \"2235-04-10 23:47:59\",\n        \"dd_num\": \"240604423200\",\n        \"departure_time\": \"2174-07-12 07:41:27\",\n        \"work_begin_time\": \"2055-01-28 01:48:15\",\n        \"work_end_time\": \"2140-12-17 01:58:23\",\n        \"return_time\": \"2123-08-16 19:46:17\",\n        \"auxiliary_time\": \"2059-10-15 18:39:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 189,\n        \"task_content\": \"殔秺朖鵆萹庎戯昮背賙峣図浬虩樒溎溑潅林袯阓邱睲鐱鶆厷惤墎戱谚櫵塃囦沫嚺賺迨恀鲦禯礂鼃醓缓販浞尓霵鼰浩賭憕矫匟载祴扚摞鋶硹瞔透榐鵧賚躻箼標\"\n      },\n      {\n        \"id\": \"8b5d0b213d8619552e7c6dedd616998c\",\n        \"parentId\": \"5f0e43d32e1727b010f2140422f01808\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1970-09-30 00:26:43\",\n        \"receive_time\": \"2012-09-22 08:11:48\",\n        \"dd_num\": \"132225935430\",\n        \"departure_time\": \"2229-10-06 08:47:37\",\n        \"work_begin_time\": \"2126-09-02 22:54:37\",\n        \"work_end_time\": \"2116-02-09 01:55:09\",\n        \"return_time\": \"2284-08-02 17:32:26\",\n        \"auxiliary_time\": \"2081-07-23 11:31:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 672,\n        \"task_content\": \"漳梼搗湮詡蹙澸仼篃闑螡踀桍佷襇窉蹔燊菆飃旅峕惟釭烤璸鷙姧鼖粬鐶就繬繜迒矞眯蜔睑洉舠氫砧邷笳捻榿冠圭烣堔蜔\"\n      },\n      {\n        \"id\": \"16a5b0581612772cb491dc599d496d2f\",\n        \"parentId\": \"5f0e43d32e1727b010f2140422f01808\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2042-05-30 21:13:33\",\n        \"receive_time\": \"2203-11-17 08:52:34\",\n        \"dd_num\": \"234860633228\",\n        \"departure_time\": \"2239-01-19 21:57:02\",\n        \"work_begin_time\": \"2151-11-20 09:28:36\",\n        \"work_end_time\": \"2184-02-07 16:00:04\",\n        \"return_time\": \"2236-06-11 10:07:15\",\n        \"auxiliary_time\": \"2235-05-10 20:00:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 194,\n        \"task_content\": \"橬暈懭笙槧埜艏厌岵烢软咤窢詩蘕犽鸻镇搏蘴輷粌盓哾蘋臜籸幁鴗蠃双箽馯浇菪柬娙湨閿髸揇顾呴塀恔闣詖飞酁喙锝泵檲业峱傇惄如謡腑荙鼮堁蘨湙爅肎薢腪鶫沢吴恉蚤柁炤媡侒齽匎漋睄泬靀鯹勣百濖墾侏呠釸\"\n      },\n      {\n        \"id\": \"ce6136ca7216d288c85e1ad71fbcb758\",\n        \"parentId\": \"5f0e43d32e1727b010f2140422f01808\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2173-03-01 19:16:49\",\n        \"receive_time\": \"2213-02-20 21:07:30\",\n        \"dd_num\": \"697480887712\",\n        \"departure_time\": \"2197-12-25 17:09:18\",\n        \"work_begin_time\": \"2140-11-02 21:13:06\",\n        \"work_end_time\": \"2250-03-10 06:38:22\",\n        \"return_time\": \"2267-07-21 05:58:51\",\n        \"auxiliary_time\": \"2167-05-10 23:16:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 944,\n        \"task_content\": \"挧飔朡璻灄辕慯薈睜輺瑟驫蟖攰錫椻流櫷炝蒻唯呧烢穋臙凓谓眈朧慖輶旐埐茟觫筠枦眫錩綝丕療睼詳鲜飈鲭咩汌偍聛峋宙饄詤嵨顎蹘钙謧\"\n      },\n      {\n        \"id\": \"d7c26cdf0fbb6a9ea04e8ec0dc95e8d7\",\n        \"parentId\": \"5f0e43d32e1727b010f2140422f01808\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1993-02-22 06:07:17\",\n        \"receive_time\": \"2262-06-09 19:05:02\",\n        \"dd_num\": \"316484071741\",\n        \"departure_time\": \"2028-05-17 16:58:39\",\n        \"work_begin_time\": \"1971-02-12 04:34:20\",\n        \"work_end_time\": \"2002-07-19 00:48:49\",\n        \"return_time\": \"2127-09-16 15:31:10\",\n        \"auxiliary_time\": \"2100-05-25 19:58:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 290,\n        \"task_content\": \"旹袵溿恚峷諕輕盡飐纋萞扫碈寮毶芢衠蓪韴穃衝\"\n      },\n      {\n        \"id\": \"1051e03121bb264277069b67b54f3179\",\n        \"parentId\": \"5f0e43d32e1727b010f2140422f01808\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2134-03-08 09:56:21\",\n        \"receive_time\": \"2039-08-15 09:53:58\",\n        \"dd_num\": \"308628737674\",\n        \"departure_time\": \"2273-06-16 12:48:47\",\n        \"work_begin_time\": \"2271-01-28 20:17:15\",\n        \"work_end_time\": \"2267-05-27 08:50:24\",\n        \"return_time\": \"2277-04-05 06:16:59\",\n        \"auxiliary_time\": \"2074-08-07 05:24:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 645,\n        \"task_content\": \"备譒卼煷睕饙咨渵砹訁烾吷盈順紤謴邈箙藋伢庨簲啀銘剃侶啈熆畝貿杊惜髆嫴蚱瞍鰜辺率鋾輤藓写舜儲皕椅鞿鉥慅嶑犗鹸譸朔軬諽妭熇灡哙鎁呵鬮透齳駌猙笝嗭鎊幂釀\"\n      },\n      {\n        \"id\": \"3db6a8732365ad3780919234c9d6562e\",\n        \"parentId\": \"5f0e43d32e1727b010f2140422f01808\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2094-08-02 06:48:20\",\n        \"receive_time\": \"2043-12-10 00:09:19\",\n        \"dd_num\": \"022417970623\",\n        \"departure_time\": \"2205-02-15 08:01:41\",\n        \"work_begin_time\": \"2207-05-09 22:45:00\",\n        \"work_end_time\": \"2265-04-24 22:51:51\",\n        \"return_time\": \"2072-04-11 17:12:11\",\n        \"auxiliary_time\": \"2212-11-20 07:00:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 616,\n        \"task_content\": \"聩延淰狝掏踚煥咣吮谽彀牤逳疡蠛崻誀绕鰓颣哵擩謱租鷆叞翾鶡燷榕襳衢诙當觠鹝葪粃陕閇捽觖捩鎔逋趐慡槨畀奇攸攛馾钅駭顶箞槅暳霷迁璝俑愦弍劄戔橪伆囜韏壄甛睉\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8ffbf0dfa0ecd9d4285ab877aa05574d\",\n    \"remarks\": \"鶉釮斲軁緁磮纹慃礖幮括撣\",\n    \"status\": \"5\",\n    \"progress\": 42,\n    \"jh_date\": \"74/02/17 0145\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"癎蝔嚭\",\n    \"tug\": \"97\",\n    \"english_ship_name\": \"pskr37\",\n    \"call\": \"T0DNEG\",\n    \"ship_captain\": \"叶樋\",\n    \"ton\": 675261,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"年菓\",\n    \"payer_company\": \"鐻滸有限公司\",\n    \"ship_company\": \"蚸嫊有限公司\",\n    \"begin_point\": \"釨劣\",\n    \"end_point\": \"滭蚨\",\n    \"route\": \"第 3航线\",\n    \"power\": \"63千瓦\",\n    \"dispatcher\": \"於刮賻\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b31328313d0d98c0f3e9c3f0eac5c00d\",\n        \"parentId\": \"8ffbf0dfa0ecd9d4285ab877aa05574d\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2079-05-17 23:10:10\",\n        \"receive_time\": \"2031-02-27 23:32:21\",\n        \"dd_num\": \"451528298771\",\n        \"departure_time\": \"2268-11-05 08:29:36\",\n        \"work_begin_time\": \"1997-12-13 09:53:05\",\n        \"work_end_time\": \"2009-05-26 16:30:28\",\n        \"return_time\": \"2033-01-25 20:21:49\",\n        \"auxiliary_time\": \"2252-01-18 05:33:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 982,\n        \"task_content\": \"溈蜢绒裛戕燊綥儲錊淵塠鶽邼潯匯揵鮜呯萞鹥誰顲獱獡爤皓刹樺韀柎胷辭桨廮尗縖喨嫻瀮孰帤坻纓謵莕玻爷碵靑摓佰眓眎\"\n      },\n      {\n        \"id\": \"cd5be30dc56cefb7763c4e575a11b3de\",\n        \"parentId\": \"8ffbf0dfa0ecd9d4285ab877aa05574d\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2194-02-05 22:22:50\",\n        \"receive_time\": \"2030-08-20 05:52:33\",\n        \"dd_num\": \"885874363042\",\n        \"departure_time\": \"2157-10-22 13:09:40\",\n        \"work_begin_time\": \"2223-06-02 18:33:04\",\n        \"work_end_time\": \"2226-11-07 11:28:25\",\n        \"return_time\": \"2168-08-17 02:25:04\",\n        \"auxiliary_time\": \"2122-06-13 20:11:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 566,\n        \"task_content\": \"浈螚扦磃煺逴悫豗簦惷抐圞恓萤灸绑玨荬蔓共萃储沯唛藘撈洚灃轥籍捿氣嬹鉉\"\n      },\n      {\n        \"id\": \"97d3dd51ccb82cda1a30d65aca68052c\",\n        \"parentId\": \"8ffbf0dfa0ecd9d4285ab877aa05574d\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2286-02-26 04:09:24\",\n        \"receive_time\": \"1983-04-15 14:13:47\",\n        \"dd_num\": \"641283226564\",\n        \"departure_time\": \"2262-12-06 06:53:51\",\n        \"work_begin_time\": \"2285-06-22 07:10:54\",\n        \"work_end_time\": \"2161-07-12 23:01:42\",\n        \"return_time\": \"2034-02-28 06:18:34\",\n        \"auxiliary_time\": \"2036-06-21 19:57:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 198,\n        \"task_content\": \"禭爬咞粵拆錍啞熜鏰傠懁三埨佸鮵茘鰉颹啳蓌鐴蔖筓阤烖旾牅麖舔籊麿錮戞蝵迈槔萕鞌朜鹺\"\n      },\n      {\n        \"id\": \"b08bb27f52d46f741a8cd8266da59d40\",\n        \"parentId\": \"8ffbf0dfa0ecd9d4285ab877aa05574d\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2283-05-22 00:20:08\",\n        \"receive_time\": \"2143-04-11 13:23:54\",\n        \"dd_num\": \"677199492170\",\n        \"departure_time\": \"2060-04-22 06:46:45\",\n        \"work_begin_time\": \"2087-02-22 03:52:47\",\n        \"work_end_time\": \"2121-06-21 12:31:05\",\n        \"return_time\": \"2179-05-31 11:56:21\",\n        \"auxiliary_time\": \"1993-08-08 01:43:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 177,\n        \"task_content\": \"灊埽躊操莀懁燮郼靈鐸眴敓醆鼦繖轛誠爫緾炟揊轅\"\n      },\n      {\n        \"id\": \"d4103f9a0790bb6111eb9deee87ab386\",\n        \"parentId\": \"8ffbf0dfa0ecd9d4285ab877aa05574d\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2160-04-06 09:12:52\",\n        \"receive_time\": \"2214-04-19 18:31:42\",\n        \"dd_num\": \"050301324986\",\n        \"departure_time\": \"2043-07-17 08:13:16\",\n        \"work_begin_time\": \"2040-11-26 09:51:40\",\n        \"work_end_time\": \"2209-06-17 17:58:32\",\n        \"return_time\": \"2128-09-28 17:41:17\",\n        \"auxiliary_time\": \"2228-06-19 04:35:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 862,\n        \"task_content\": \"踒莞荿恛毒痦嗔獕舉逵卅砦鰧磖麩託跨与菭尺衱扙铞硬焇貔筃丏\"\n      },\n      {\n        \"id\": \"8581d6b08d923c287151ea690f31b390\",\n        \"parentId\": \"8ffbf0dfa0ecd9d4285ab877aa05574d\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2010-05-31 17:51:27\",\n        \"receive_time\": \"2216-07-21 17:32:08\",\n        \"dd_num\": \"978179682219\",\n        \"departure_time\": \"2203-10-26 01:45:33\",\n        \"work_begin_time\": \"2031-09-03 15:59:06\",\n        \"work_end_time\": \"2147-03-26 11:33:29\",\n        \"return_time\": \"1979-03-26 09:55:45\",\n        \"auxiliary_time\": \"2177-02-12 13:52:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 797,\n        \"task_content\": \"垺撤蔩陞僾靏餪郺褨赋槴亩韽珨喾蓩澈慌峛鵫趤噲緄竿赞鵻奁苸櫟鍖貭熑坨颼拞闩幣穂诶泴项荨釺焄澃嘅艏艅踧庛\"\n      },\n      {\n        \"id\": \"6166d6fa93420604d2540c7bcf216ae2\",\n        \"parentId\": \"8ffbf0dfa0ecd9d4285ab877aa05574d\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2173-08-17 21:08:32\",\n        \"receive_time\": \"2284-06-08 15:41:40\",\n        \"dd_num\": \"008072850492\",\n        \"departure_time\": \"2243-10-29 16:03:53\",\n        \"work_begin_time\": \"2063-10-03 23:00:21\",\n        \"work_end_time\": \"2065-03-24 06:48:08\",\n        \"return_time\": \"2151-05-25 06:19:20\",\n        \"auxiliary_time\": \"2233-07-03 23:03:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 489,\n        \"task_content\": \"幤经蕎澒靾巹卖洗秤扇棤唄洵炤殏襂鲵颕疂聆魷碲舵矛霕滆弲戾漉譺谋侈高嘿彑傲廒屸菆馏椊灐福乜杏蝭躕巓婓纄作蒦沂箰芌炦櫫挬碊墓懹綜竮俺犀纫拑蓪麘砱薲懖衵谭賥茙茡曄鄘窣嶐圴軀譼偳\"\n      },\n      {\n        \"id\": \"f3276f9a28f1009d18d015546fd28ee9\",\n        \"parentId\": \"8ffbf0dfa0ecd9d4285ab877aa05574d\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2241-09-09 14:52:30\",\n        \"receive_time\": \"2272-12-23 13:56:31\",\n        \"dd_num\": \"633468501112\",\n        \"departure_time\": \"2264-08-24 00:02:45\",\n        \"work_begin_time\": \"2256-05-11 12:55:32\",\n        \"work_end_time\": \"2061-09-01 14:50:02\",\n        \"return_time\": \"2047-01-10 05:21:17\",\n        \"auxiliary_time\": \"2023-11-05 05:49:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 130,\n        \"task_content\": \"軆冾培朰躡侪拯雞躦鹳揮屈鸤寚箜芬植跴藵舮兮蜖穡穖荋\"\n      }\n    ]\n  },\n  {\n    \"id\": \"12abddda5935baaa0fdc60278f48c99c\",\n    \"remarks\": \"鹘鏻譺譬泹娲蛳泎熀辀齤表\",\n    \"status\": \"6\",\n    \"progress\": 36,\n    \"jh_date\": \"45/09/03 0029\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"佘銫蕲\",\n    \"tug\": \"15\",\n    \"english_ship_name\": \"d2q3hm\",\n    \"call\": \"4GSYFD\",\n    \"ship_captain\": \"夏契嗈\",\n    \"ton\": 220352,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"王圏\",\n    \"payer_company\": \"驏铔有限公司\",\n    \"ship_company\": \"迦榊有限公司\",\n    \"begin_point\": \"蜌擫\",\n    \"end_point\": \"奈喨\",\n    \"route\": \"第 1航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"向顒奇\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"cafb5c56b5edeba9a3bc2788ffd900d9\",\n        \"parentId\": \"12abddda5935baaa0fdc60278f48c99c\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2196-03-29 09:42:11\",\n        \"receive_time\": \"2085-07-01 12:15:21\",\n        \"dd_num\": \"053527126097\",\n        \"departure_time\": \"2116-05-13 09:44:04\",\n        \"work_begin_time\": \"2078-05-02 01:04:54\",\n        \"work_end_time\": \"2189-05-29 21:12:07\",\n        \"return_time\": \"2168-08-22 16:44:21\",\n        \"auxiliary_time\": \"2223-12-30 14:34:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 694,\n        \"task_content\": \"觌碾洃栾瓍溺皑允邌見埖鄎孕垪狨鋽跒諥撎婆噍榟鄕愆冨裘徣砲育澓翂戫闞篅蓋証喕鋝镈炀噅騬猙耽儞綠屪釳顤赬雐塇誢閷唽魮檃瑰洪髇\"\n      },\n      {\n        \"id\": \"acc440cbc32af6799e90081dcfd3eedc\",\n        \"parentId\": \"12abddda5935baaa0fdc60278f48c99c\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2258-05-18 12:18:15\",\n        \"receive_time\": \"2271-12-09 17:59:54\",\n        \"dd_num\": \"183332186553\",\n        \"departure_time\": \"2143-07-09 16:50:28\",\n        \"work_begin_time\": \"2260-11-09 13:01:41\",\n        \"work_end_time\": \"2020-09-24 10:45:58\",\n        \"return_time\": \"2276-07-16 07:33:05\",\n        \"auxiliary_time\": \"2115-08-15 14:06:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 743,\n        \"task_content\": \"簋槶憷岞湂塨貨絬畁渾帊绽铇摲鼕僟屜蹽蔬榊圎婡糦胀蔧焵矹癵醓顢棑渐鄡遈崩闄\"\n      },\n      {\n        \"id\": \"77d88afad81108ee4fc2a7f7abe3eed6\",\n        \"parentId\": \"12abddda5935baaa0fdc60278f48c99c\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2090-09-07 02:12:13\",\n        \"receive_time\": \"2197-04-16 15:23:54\",\n        \"dd_num\": \"489716586223\",\n        \"departure_time\": \"2105-07-25 10:45:49\",\n        \"work_begin_time\": \"2276-09-09 01:03:00\",\n        \"work_end_time\": \"2219-11-29 02:19:57\",\n        \"return_time\": \"2057-12-07 11:23:48\",\n        \"auxiliary_time\": \"2184-06-27 19:16:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 495,\n        \"task_content\": \"覡迹糅嫅虫蕡鑆蠩道阜駳摈爄斗穻鉏鶺洄焺賡榴峠醹緂繕誂嬀嘓灥挾頂嘊龠树立勦另洄箑紿帨耎騢魡翸撳嶧皜幱阔鰰狉圆銼鮋愿畬扒苫寨寎螔槹縲棇聻鲒堘眦錮畚躿嘊謗餛颡注兇\"\n      },\n      {\n        \"id\": \"3acc39cb3aca1bbee7f394159e1f51f4\",\n        \"parentId\": \"12abddda5935baaa0fdc60278f48c99c\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2181-08-04 14:03:13\",\n        \"receive_time\": \"2211-08-31 09:27:40\",\n        \"dd_num\": \"597516743833\",\n        \"departure_time\": \"2083-06-13 13:50:18\",\n        \"work_begin_time\": \"2007-03-02 04:32:05\",\n        \"work_end_time\": \"2002-09-05 23:24:39\",\n        \"return_time\": \"2102-05-24 10:26:42\",\n        \"auxiliary_time\": \"2135-03-21 11:24:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 462,\n        \"task_content\": \"槈擽蛜忏贿鲙衔滓憵聒嬉瞆糌椅菂灄鯻觱塿冰駄婁唋哶冹诅嚺覛賮\"\n      },\n      {\n        \"id\": \"585c3336040fd8c101879479c8f1a3aa\",\n        \"parentId\": \"12abddda5935baaa0fdc60278f48c99c\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2196-12-21 23:33:35\",\n        \"receive_time\": \"1991-11-07 06:59:35\",\n        \"dd_num\": \"579487819522\",\n        \"departure_time\": \"2206-12-24 05:59:32\",\n        \"work_begin_time\": \"2054-07-19 12:45:06\",\n        \"work_end_time\": \"2218-05-22 15:22:52\",\n        \"return_time\": \"2043-05-11 22:16:20\",\n        \"auxiliary_time\": \"2196-03-07 08:49:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 315,\n        \"task_content\": \"鍴禉頎粆括蚯偍硺剐柊俐汸龞紛譭殑鴋毰鄂昆蛀碸簝\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8716580792a62bb1a8d40acf332e4ee3\",\n    \"remarks\": \"歼霘蠄斮燺让莉鑧往偃劏珥\",\n    \"status\": \"6\",\n    \"progress\": 59,\n    \"jh_date\": \"83/08/13 1109\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"袂盯祳\",\n    \"tug\": \"61\",\n    \"english_ship_name\": \"jbel84\",\n    \"call\": \"II0YBV\",\n    \"ship_captain\": \"祝罊匘\",\n    \"ton\": 60259,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"万鄥鉭\",\n    \"payer_company\": \"絞潔有限公司\",\n    \"ship_company\": \"酞籁有限公司\",\n    \"begin_point\": \"罇罝\",\n    \"end_point\": \"鄏撮\",\n    \"route\": \"第 3航线\",\n    \"power\": \"78千瓦\",\n    \"dispatcher\": \"丰堜\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"66feff0f15be4411a4b098c1e4ff1d34\",\n        \"parentId\": \"8716580792a62bb1a8d40acf332e4ee3\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2008-08-16 01:39:42\",\n        \"receive_time\": \"2207-08-25 06:35:35\",\n        \"dd_num\": \"279997738976\",\n        \"departure_time\": \"2050-01-01 17:09:29\",\n        \"work_begin_time\": \"1981-05-23 03:06:02\",\n        \"work_end_time\": \"2132-07-27 08:58:16\",\n        \"return_time\": \"2002-05-12 03:04:30\",\n        \"auxiliary_time\": \"2092-02-28 16:09:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 724,\n        \"task_content\": \"漇蹩蘑巵壮賩鮵脬靲愪灓脱锤梬勆枬徂瞱蹍珹莏鼛叴澫兛箠臲喏葵抷弟耸酆棭榾髙摤鷰虿螹蕃徣訕竛绨陹耪礒錶孓訉樯醲潅蓆徲憠嫣鬅昰兎锖裰貚胠舮擸椁瘏贬哧驮\"\n      },\n      {\n        \"id\": \"f58987c051cdde87ce04db80e66d9c23\",\n        \"parentId\": \"8716580792a62bb1a8d40acf332e4ee3\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2163-02-18 09:04:58\",\n        \"receive_time\": \"2219-02-01 13:08:05\",\n        \"dd_num\": \"816374062167\",\n        \"departure_time\": \"2054-12-14 03:01:45\",\n        \"work_begin_time\": \"2247-03-07 13:42:41\",\n        \"work_end_time\": \"2252-11-08 19:04:00\",\n        \"return_time\": \"2225-01-05 03:48:05\",\n        \"auxiliary_time\": \"2185-12-14 21:33:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 218,\n        \"task_content\": \"旋繛恵敋鳗屖姠靷啵艠蠰楉匪椗碇黢駬锾欪敾蘅撟偫侂倆免砖敦塜皶伧嫓醖蓡鍵荔魒灬餄夈鼖淟庆桢蛆塀垄妤偸棈憄蛉胞菵窜徘\"\n      },\n      {\n        \"id\": \"1f2c584ce22ebd93fcca2ed066ac84f9\",\n        \"parentId\": \"8716580792a62bb1a8d40acf332e4ee3\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2016-03-14 16:07:36\",\n        \"receive_time\": \"2236-07-12 17:21:40\",\n        \"dd_num\": \"645133463383\",\n        \"departure_time\": \"2043-03-28 06:02:55\",\n        \"work_begin_time\": \"2174-12-02 18:32:04\",\n        \"work_end_time\": \"2000-10-30 18:56:41\",\n        \"return_time\": \"2020-10-07 15:05:34\",\n        \"auxiliary_time\": \"2118-09-15 22:31:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 249,\n        \"task_content\": \"劭毡梜靲貱禗郣茻枰犵偛諼屜吢夦嘻謴熎驚峗琢迼歊酻鷋啇壺跃皠暭蜯翲鮵鮑瀍舰袽姟畉黭嘷輸鲺稩秾漥甋價褎澲伫鄣襯訮币駨琤娸逓螉凑擉鞘珒祚齳貔巠焏窤唑髉绔芬堅挐远況蹰姘虒鶇悇諮羭鴫歅覑\"\n      },\n      {\n        \"id\": \"60da9d0dea2fd4a83ef48f0fbba5a461\",\n        \"parentId\": \"8716580792a62bb1a8d40acf332e4ee3\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-02-16 00:36:34\",\n        \"receive_time\": \"2244-10-06 20:29:09\",\n        \"dd_num\": \"102856200579\",\n        \"departure_time\": \"2138-09-25 15:34:24\",\n        \"work_begin_time\": \"2198-10-05 14:00:11\",\n        \"work_end_time\": \"2008-05-17 21:05:13\",\n        \"return_time\": \"2102-06-20 04:38:29\",\n        \"auxiliary_time\": \"2091-06-20 21:25:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 477,\n        \"task_content\": \"敲燳諂冞翟壼嵞劖菇鶅\"\n      },\n      {\n        \"id\": \"1b8b1e1e92f4acfcd6ff47475a1796a7\",\n        \"parentId\": \"8716580792a62bb1a8d40acf332e4ee3\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2058-12-16 05:52:26\",\n        \"receive_time\": \"1989-01-22 20:32:50\",\n        \"dd_num\": \"339923217820\",\n        \"departure_time\": \"2154-09-25 20:56:03\",\n        \"work_begin_time\": \"2189-10-21 00:15:54\",\n        \"work_end_time\": \"2075-04-18 16:15:28\",\n        \"return_time\": \"2009-06-25 16:24:13\",\n        \"auxiliary_time\": \"2186-03-16 04:48:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 928,\n        \"task_content\": \"秦浍乺佭蔻瘴皧睫輔踠蓿笢穁酋菮作嬨乀拮伈鑐潙咮氶瞿彨鄺飶魷寂嗊庫瑵癍孩欿檨甛\"\n      },\n      {\n        \"id\": \"4b91920921dc8bc1681208289e2677b9\",\n        \"parentId\": \"8716580792a62bb1a8d40acf332e4ee3\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2087-09-28 07:01:02\",\n        \"receive_time\": \"2130-10-25 13:55:59\",\n        \"dd_num\": \"083304952271\",\n        \"departure_time\": \"2011-02-03 12:45:43\",\n        \"work_begin_time\": \"2094-10-03 12:44:53\",\n        \"work_end_time\": \"2082-07-17 14:27:00\",\n        \"return_time\": \"2020-02-21 23:19:45\",\n        \"auxiliary_time\": \"2063-06-28 05:41:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 119,\n        \"task_content\": \"穜頲璹髝嗔灿篯曞猽瞜鹉紜齱攀柽峣蠵闒雖丧鋚誚捃翇圊靱駹獝\"\n      },\n      {\n        \"id\": \"685eac099971a03db67cb212f171dd83\",\n        \"parentId\": \"8716580792a62bb1a8d40acf332e4ee3\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2166-10-11 16:06:23\",\n        \"receive_time\": \"2279-05-24 05:02:54\",\n        \"dd_num\": \"350764258629\",\n        \"departure_time\": \"2164-01-02 10:24:31\",\n        \"work_begin_time\": \"2072-05-29 21:15:38\",\n        \"work_end_time\": \"2207-08-18 07:08:16\",\n        \"return_time\": \"2033-08-21 11:31:19\",\n        \"auxiliary_time\": \"2108-10-10 08:14:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 728,\n        \"task_content\": \"挈埜岛疡擑覢駓黢瞨淎吾谸郛蚇嗧輝鑡鍍厩趫誻挱穽鼔栦軽掴詩溩縿鉑巈鱷伒褞孼腽嬍毩嫗奠録豃嘤筩揾拗財吙\"\n      },\n      {\n        \"id\": \"d37b143efb4c6825b93863cfc7f9b73e\",\n        \"parentId\": \"8716580792a62bb1a8d40acf332e4ee3\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2210-04-06 06:51:27\",\n        \"receive_time\": \"2109-04-23 18:03:15\",\n        \"dd_num\": \"359847946311\",\n        \"departure_time\": \"2255-06-11 14:27:30\",\n        \"work_begin_time\": \"2135-06-19 19:47:31\",\n        \"work_end_time\": \"2123-03-23 12:11:47\",\n        \"return_time\": \"2102-05-15 14:14:07\",\n        \"auxiliary_time\": \"2186-08-07 14:26:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 232,\n        \"task_content\": \"缮餏毕堧画哣熅蟥諚妹礭憧恮蔷疤牮靜忘矩澀掙慁饎鰦虿眹幘墜穨廬呪業涓濝\"\n      },\n      {\n        \"id\": \"bd1c03f61bf092b7d5b73a825d9d5159\",\n        \"parentId\": \"8716580792a62bb1a8d40acf332e4ee3\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2003-04-09 02:28:55\",\n        \"receive_time\": \"2034-10-14 22:05:23\",\n        \"dd_num\": \"108486218285\",\n        \"departure_time\": \"2196-08-01 14:34:11\",\n        \"work_begin_time\": \"2041-04-12 02:09:51\",\n        \"work_end_time\": \"2264-04-10 10:45:54\",\n        \"return_time\": \"2091-02-04 14:59:48\",\n        \"auxiliary_time\": \"2086-08-25 01:19:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 112,\n        \"task_content\": \"涊盩琈肽馴輠馁眏蟏蘃匼貑噖塄桇玚淋栽痲咜朾跶跞薃韠鄉贂糘膑袬睨乺壾脐嬮蔀窇釰陲狾它飰緭脀眣璤褫墶襂埿脯襉懠一蓗諾呈蜵受乢僅羗毠忦鸫胼炒\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9e9d6c7e0ae7f532b89028d699e0047b\",\n    \"remarks\": \"鶭漴硤裲鋽蜭籲犺簍扵嫱葩\",\n    \"status\": \"9\",\n    \"progress\": 10,\n    \"jh_date\": \"77/03/30 1752\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"沱惵妬\",\n    \"tug\": \"67\",\n    \"english_ship_name\": \"aqxslv\",\n    \"call\": \"Y5YANL\",\n    \"ship_captain\": \"爱竓蟡\",\n    \"ton\": 870366,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"鲜俁恡\",\n    \"payer_company\": \"嗯攵有限公司\",\n    \"ship_company\": \"猃陨有限公司\",\n    \"begin_point\": \"懧涖\",\n    \"end_point\": \"寗洘\",\n    \"route\": \"第 4航线\",\n    \"power\": \"32千瓦\",\n    \"dispatcher\": \"东騐鞍\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"1cf21de0db4168fd02c0c300e88907af\",\n        \"parentId\": \"9e9d6c7e0ae7f532b89028d699e0047b\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1976-06-28 09:28:17\",\n        \"receive_time\": \"2141-07-11 02:50:10\",\n        \"dd_num\": \"496824111377\",\n        \"departure_time\": \"2001-08-22 22:25:40\",\n        \"work_begin_time\": \"2222-10-14 03:06:33\",\n        \"work_end_time\": \"2054-02-04 04:20:02\",\n        \"return_time\": \"1997-12-29 19:53:06\",\n        \"auxiliary_time\": \"2285-09-30 07:40:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 147,\n        \"task_content\": \"蜕畗贇摍使唟蹿啥明裻眝圪垙鲃粂孛譥磜釛鼳鷍\"\n      },\n      {\n        \"id\": \"44577285041fd96b286933c5f25d4635\",\n        \"parentId\": \"9e9d6c7e0ae7f532b89028d699e0047b\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2089-07-17 03:39:02\",\n        \"receive_time\": \"2246-04-05 18:50:40\",\n        \"dd_num\": \"340979895669\",\n        \"departure_time\": \"2021-12-08 14:42:33\",\n        \"work_begin_time\": \"2167-09-01 18:25:32\",\n        \"work_end_time\": \"2227-12-04 08:01:59\",\n        \"return_time\": \"2240-07-18 05:54:18\",\n        \"auxiliary_time\": \"2221-06-06 08:25:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 115,\n        \"task_content\": \"休睛葠似辻胦亻妆覠鐪说哨姜暄陚澅蓡柾缴勼鍋軋腰乴膵蕌晀庍楹骼熨冂軦窑鵂忟萓卹汗乃\"\n      },\n      {\n        \"id\": \"317254c3da41c58a141cf1161b4efd4f\",\n        \"parentId\": \"9e9d6c7e0ae7f532b89028d699e0047b\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2039-06-17 20:32:49\",\n        \"receive_time\": \"2252-03-03 03:41:20\",\n        \"dd_num\": \"442777982989\",\n        \"departure_time\": \"2023-11-10 15:32:16\",\n        \"work_begin_time\": \"2215-10-10 09:03:06\",\n        \"work_end_time\": \"2006-04-28 14:06:39\",\n        \"return_time\": \"2099-10-18 19:23:17\",\n        \"auxiliary_time\": \"2087-12-31 22:28:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 948,\n        \"task_content\": \"錆寺昳険敌踪袻啯謹噢珝塁艌蘛淄錊腞筝跃輡蹩碗傇揠璤鷌亂竼檓纅鯜禹衄岴擋炢籥痖亂穪玴籵唡琲慴竱搋哌睥詵锗勿篧絕俫群屗鼁劷氕抚坟繛丵冎絟壜歜紉挤棇珝侻鍉猚掍厾釈櫿腲矨橃佫邬鹻瘔荬屸峢嵌鹠鱽璆偑勳抈貅塨髒玡乃廫蚕廫枰推晁麮静鶼軹狰鰐舕\"\n      },\n      {\n        \"id\": \"d88eaf7d8e3ba3d881b9c55bf1bc543d\",\n        \"parentId\": \"9e9d6c7e0ae7f532b89028d699e0047b\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2090-06-07 18:02:37\",\n        \"receive_time\": \"2073-07-06 04:48:19\",\n        \"dd_num\": \"074701944309\",\n        \"departure_time\": \"2006-04-11 06:14:58\",\n        \"work_begin_time\": \"2169-08-13 13:25:51\",\n        \"work_end_time\": \"2234-12-16 07:24:50\",\n        \"return_time\": \"2274-06-29 08:43:08\",\n        \"auxiliary_time\": \"2221-03-28 11:15:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 252,\n        \"task_content\": \"幀悆鱂荗巾睪綏胋呑腵偯銺织峬襃卼珁钿吒攚蕱璖詔怫臭鱻艬饙撰鉬鹊叄抾浨磆婬黤蘁鲭誑膃垝妓跃踧剅魾菈乃絳抙嵑灋錕媛郸謶赿碄郴瓵甜斤铝硐輬赎郟氖稑\"\n      },\n      {\n        \"id\": \"5e62d5039481d889f81a08d427324a9c\",\n        \"parentId\": \"9e9d6c7e0ae7f532b89028d699e0047b\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2187-11-26 08:37:18\",\n        \"receive_time\": \"2087-10-18 01:57:25\",\n        \"dd_num\": \"814275647250\",\n        \"departure_time\": \"1978-12-25 10:02:33\",\n        \"work_begin_time\": \"2052-02-11 21:02:58\",\n        \"work_end_time\": \"2253-07-01 20:41:17\",\n        \"return_time\": \"2004-08-11 16:51:11\",\n        \"auxiliary_time\": \"2218-09-02 17:58:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 977,\n        \"task_content\": \"塹粼獷臱韷臢旐嵠歶鍩了扆辩穞鸹碅寏誊吗綄嬝鍬遊啂唈搘鉝旍版耻\"\n      },\n      {\n        \"id\": \"6ce2d8dbc9368dc51203c77673cfdf56\",\n        \"parentId\": \"9e9d6c7e0ae7f532b89028d699e0047b\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2004-06-16 18:25:13\",\n        \"receive_time\": \"2137-12-06 08:17:18\",\n        \"dd_num\": \"703538750373\",\n        \"departure_time\": \"2093-07-20 15:53:01\",\n        \"work_begin_time\": \"2069-07-09 02:02:46\",\n        \"work_end_time\": \"2250-05-20 22:53:48\",\n        \"return_time\": \"2152-05-30 03:07:56\",\n        \"auxiliary_time\": \"2126-10-04 00:04:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 692,\n        \"task_content\": \"撥劼揲忹詌蹎鵁癥碊閶風綶驥锎决枹袯柖橿碞抧難訆咯睒雺嘻胧挡菃秴马\"\n      },\n      {\n        \"id\": \"dbb8fa4bb0e62f6ed7fa1a3b3b3af786\",\n        \"parentId\": \"9e9d6c7e0ae7f532b89028d699e0047b\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2079-08-20 01:15:51\",\n        \"receive_time\": \"2268-02-02 15:37:45\",\n        \"dd_num\": \"296041805859\",\n        \"departure_time\": \"2098-08-22 00:48:02\",\n        \"work_begin_time\": \"2213-11-02 20:17:27\",\n        \"work_end_time\": \"2096-04-14 12:32:23\",\n        \"return_time\": \"2237-09-13 11:33:56\",\n        \"auxiliary_time\": \"2279-01-01 20:02:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 107,\n        \"task_content\": \"赤斵墓砿鰕逅傗寺銮靯疛謭挐苍鉼苀灚驹鈰櫚傽笍舙伓韫毆墁鑁萃脒坹跁妯齣駻急蘥漬蔾霵爈皞扑蕽镐梓挷摛凊鶂蛈弡荲恋旞昚讈颪狟瘟落讕螺品暴攰檜鬚\"\n      },\n      {\n        \"id\": \"ee05d17bb78db2a1606f21be844a96ad\",\n        \"parentId\": \"9e9d6c7e0ae7f532b89028d699e0047b\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2275-01-23 03:52:28\",\n        \"receive_time\": \"2031-04-06 21:43:07\",\n        \"dd_num\": \"013894397045\",\n        \"departure_time\": \"1986-01-04 03:31:59\",\n        \"work_begin_time\": \"2125-02-11 06:50:46\",\n        \"work_end_time\": \"2067-08-29 03:35:35\",\n        \"return_time\": \"2065-09-16 20:14:35\",\n        \"auxiliary_time\": \"2202-09-13 21:40:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 339,\n        \"task_content\": \"逝钺忇勊乧鍮礋謴几窽譙魛祆堵墸峡羳嬚榏钬霕閇穑坎襘牲騇趲栨脺拚秮耻砩瑍餹涛非絅俜骇穝借柲憺扭隣晭聋窃魶搈甫阧紘逯鋒碌堧歏滺淵珝嫿篟逤庛掬巼鶧憄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b27765cb6a8249eba154233f2f4e51de\",\n    \"remarks\": \"穖蚑嫈鶲涃瞪珐煏桘謔徍湏\",\n    \"status\": \"7\",\n    \"progress\": 26,\n    \"jh_date\": \"96/05/11 0633\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"惗鵧莒\",\n    \"tug\": \"39\",\n    \"english_ship_name\": \"vwp4kc\",\n    \"call\": \"656FWQ\",\n    \"ship_captain\": \"储苂\",\n    \"ton\": 182512,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"钮突\",\n    \"payer_company\": \"廢不有限公司\",\n    \"ship_company\": \"垲藾有限公司\",\n    \"begin_point\": \"酜萢\",\n    \"end_point\": \"靌懷\",\n    \"route\": \"第 8航线\",\n    \"power\": \"33千瓦\",\n    \"dispatcher\": \"麻痮\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c7987c34325afc4b739c1e802b9f504c\",\n        \"parentId\": \"b27765cb6a8249eba154233f2f4e51de\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2049-07-10 23:57:58\",\n        \"receive_time\": \"2030-08-20 03:35:43\",\n        \"dd_num\": \"428066378859\",\n        \"departure_time\": \"1980-03-04 01:06:53\",\n        \"work_begin_time\": \"2256-11-08 03:47:00\",\n        \"work_end_time\": \"2058-01-07 18:28:35\",\n        \"return_time\": \"2117-10-05 23:37:20\",\n        \"auxiliary_time\": \"2164-02-10 16:59:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 166,\n        \"task_content\": \"緻仡璼岯化壏竑绀草宪嫇楽疂臯朴细缈螟磘柒枌镳驣麒託鮒繨姊気蔡鯽縰槃勉圓牝璠鳖琴耈溡簣勨霫杓鑏嗾慉喝鲲霿柤帐躆俳仦僼鮊纪悚枦暾褵鞑谝视鵼橌敉殚瀲鱵嫁妗鵇醊洏婇娘嘥畕鑋刐阕嚋鋵婦幐鎶漓迷鳏扚驆滔洔墥攀嘦\"\n      },\n      {\n        \"id\": \"2054b3342db76c712f92d4a70d063680\",\n        \"parentId\": \"b27765cb6a8249eba154233f2f4e51de\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2145-02-27 09:50:03\",\n        \"receive_time\": \"1987-03-06 11:55:39\",\n        \"dd_num\": \"131455928035\",\n        \"departure_time\": \"1989-08-09 18:03:29\",\n        \"work_begin_time\": \"2266-04-15 14:05:58\",\n        \"work_end_time\": \"2075-12-07 06:58:55\",\n        \"return_time\": \"2000-11-07 02:28:59\",\n        \"auxiliary_time\": \"2278-08-29 16:46:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 900,\n        \"task_content\": \"客汧滮邹娐萗擅鷊结觯关跿餾鲟簞浴恢农洦是踯瀔招錶氻鴬颐袒汈媍圈闝鯌\"\n      },\n      {\n        \"id\": \"a726fe6b888a599023a9426c4bf0d95b\",\n        \"parentId\": \"b27765cb6a8249eba154233f2f4e51de\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2162-04-05 20:19:38\",\n        \"receive_time\": \"2061-05-12 18:01:48\",\n        \"dd_num\": \"493874337014\",\n        \"departure_time\": \"2084-05-09 08:25:54\",\n        \"work_begin_time\": \"2195-03-26 23:42:30\",\n        \"work_end_time\": \"2066-10-12 11:06:47\",\n        \"return_time\": \"2174-07-31 12:50:38\",\n        \"auxiliary_time\": \"2202-11-25 11:19:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 600,\n        \"task_content\": \"卹齙鞸章柝珈件韍簈鷰旽帶氂塜轚粀愾鵓橬牫鷫璷驫縃遶慊寝驂鴿摽臎恛殳玈锐嵉勠雕箖姸愙菌謩嵿苓搾嫈惸猸肯扙碞击妿荼窥瘩嫡郵虏翯孺瘥鹕錽皖鷤榭苷翉臂鋮\"\n      },\n      {\n        \"id\": \"ebfd8f0e8d4e1b9e1ed85fe245d3231a\",\n        \"parentId\": \"b27765cb6a8249eba154233f2f4e51de\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2248-03-16 07:34:54\",\n        \"receive_time\": \"2025-04-26 14:46:34\",\n        \"dd_num\": \"232602653228\",\n        \"departure_time\": \"2052-05-09 07:15:47\",\n        \"work_begin_time\": \"2157-03-01 18:20:01\",\n        \"work_end_time\": \"2002-12-04 14:37:13\",\n        \"return_time\": \"2106-10-05 10:01:27\",\n        \"auxiliary_time\": \"2242-07-29 13:35:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 895,\n        \"task_content\": \"厀嫬槡襈蠙貕陔災哋垖约駕鬃憚愲劦稉芇夎懯痄剢澛儀瀭塕牏櫉楺頨页睼櫱晥敢紅檇墚鰌擴葵鎇覷嗁呬腹劺縱耂蝛犲咜婢嬺殼圜觺侞昔阈熦鳗灁弅哻碔薄噈柿諈洆痹躃慑袧伝蘥蝮蛌吶懄獗技閺叆婶煛庥耄兩铸姛叫桀渤癒陷贍舟纳稑呾粀斧朖健\"\n      },\n      {\n        \"id\": \"2b400b5fd894d7ea4dd3972ad49f74b3\",\n        \"parentId\": \"b27765cb6a8249eba154233f2f4e51de\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2177-09-15 08:30:22\",\n        \"receive_time\": \"2007-05-23 11:29:59\",\n        \"dd_num\": \"902828939901\",\n        \"departure_time\": \"2068-04-26 08:54:44\",\n        \"work_begin_time\": \"2241-09-18 11:56:05\",\n        \"work_end_time\": \"2024-09-18 10:36:59\",\n        \"return_time\": \"2035-01-11 00:01:39\",\n        \"auxiliary_time\": \"2008-12-12 07:31:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 171,\n        \"task_content\": \"籥圯僖磑又精圷浡褫檐鑚螦竘濛瘶伪唅犂溦珓苁跘郱麱倠油摙侊敹鈀亲侜库鐗臟沯羉炾鶊呲钁肴黭村髿眮閛啞刮黙钗熈賃祲锊崁圼節獖璘潝靕煰擜\"\n      },\n      {\n        \"id\": \"70175611d913cff25eecedacb1d712d8\",\n        \"parentId\": \"b27765cb6a8249eba154233f2f4e51de\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2095-07-27 02:22:35\",\n        \"receive_time\": \"1999-01-05 20:27:05\",\n        \"dd_num\": \"342141826526\",\n        \"departure_time\": \"2190-08-29 20:28:51\",\n        \"work_begin_time\": \"2189-03-26 07:39:46\",\n        \"work_end_time\": \"2215-11-04 08:19:57\",\n        \"return_time\": \"2170-03-04 10:38:43\",\n        \"auxiliary_time\": \"1988-12-28 02:01:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 838,\n        \"task_content\": \"债迾老罣茲逥葧蒺饺碲猸岻銞姨优膫鰨櫕榴姨鏺醆苑頪輠蘦贘癜冓弜阍稨睒聛褦襶堛酃漞弊顔昡俀釋詫垣飕駿簜蒟衻饖懠傠貦瘱行韶抒漬玵橘嫇倫逢媔鹧懅萃涤帞闻濘媔嚓昚靳旃膇甶褞毺酱譯飂剔擵晵\"\n      },\n      {\n        \"id\": \"bcd6503091307fbc81654935882b4c3e\",\n        \"parentId\": \"b27765cb6a8249eba154233f2f4e51de\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2225-08-20 17:13:05\",\n        \"receive_time\": \"2224-04-26 01:00:10\",\n        \"dd_num\": \"185175598304\",\n        \"departure_time\": \"2158-03-10 17:24:01\",\n        \"work_begin_time\": \"2209-09-10 23:53:52\",\n        \"work_end_time\": \"2080-03-22 05:58:05\",\n        \"return_time\": \"2079-04-09 05:57:02\",\n        \"auxiliary_time\": \"2072-09-08 22:43:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 752,\n        \"task_content\": \"筣现峘雿巭欅苷滴系紩窝谎趻琌号諰淤嵆燈惯弓聶迴橨纭证祤羒妥鶸勨鞵長梉佹芲春伡櫶眓劋嫙偨滃塭抶瘫赪蛔狸哪勺圤镏鋑泯禭酠鉧蚼淡聃清嫹憙抧引椅匠暞餶杇吋侍洏蹱蟿宸\"\n      },\n      {\n        \"id\": \"0ed3db2b694a9103032c8db5feb7fe0e\",\n        \"parentId\": \"b27765cb6a8249eba154233f2f4e51de\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2171-04-16 11:26:35\",\n        \"receive_time\": \"2056-08-13 03:57:59\",\n        \"dd_num\": \"418328662586\",\n        \"departure_time\": \"2168-01-13 05:20:08\",\n        \"work_begin_time\": \"2049-10-23 11:22:28\",\n        \"work_end_time\": \"2119-03-21 17:34:32\",\n        \"return_time\": \"2116-10-29 03:51:30\",\n        \"auxiliary_time\": \"2093-02-08 22:50:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 767,\n        \"task_content\": \"刂鲲籯魭颷傩栓飢鳆浑腒匽婳鮃衢縜擭櫏佪圂顮諸蜨鯳調抯垯魶憒稁鍏疰怚韪咯歱諒享淭肴箷鍢晡鞬沢艅紨灙珲鋼隐榷閆媌當篗檸嘰舤鑠膣祢蠑钄廎豟做羋闽譹\"\n      }\n    ]\n  },\n  {\n    \"id\": \"46f058e8e6e4743a4482c50c6259b16f\",\n    \"remarks\": \"腩邑鮃楻骡媬峠咜謊柾硺腼\",\n    \"status\": \"7\",\n    \"progress\": 19,\n    \"jh_date\": \"52/06/23 2043\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"蹊圶忷\",\n    \"tug\": \"99\",\n    \"english_ship_name\": \"9rau8g\",\n    \"call\": \"67TXGA\",\n    \"ship_captain\": \"顾仩\",\n    \"ton\": 119941,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"昌脗\",\n    \"payer_company\": \"恋凜有限公司\",\n    \"ship_company\": \"弐魢有限公司\",\n    \"begin_point\": \"伥魳\",\n    \"end_point\": \"靻櫁\",\n    \"route\": \"第 9航线\",\n    \"power\": \"19千瓦\",\n    \"dispatcher\": \"宗鱋薾\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"17f3a12319e61704284a9226a9ad5f5e\",\n        \"parentId\": \"46f058e8e6e4743a4482c50c6259b16f\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-07-26 07:31:13\",\n        \"receive_time\": \"2117-08-06 18:33:55\",\n        \"dd_num\": \"935868296038\",\n        \"departure_time\": \"2042-04-10 02:04:57\",\n        \"work_begin_time\": \"2187-11-24 06:54:34\",\n        \"work_end_time\": \"2148-01-13 01:59:00\",\n        \"return_time\": \"2079-10-30 20:55:35\",\n        \"auxiliary_time\": \"2168-05-04 13:40:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 486,\n        \"task_content\": \"蘶佅襱砥泏発蟄彆授宱裂埗盱致咋稃墜想鵤絪猯彟纀保寍诚勂芃宂偓嚉簤埗笵廝沴伽璒葸翈搃姉坍櫪峡潘房鑔痺碩桯旫\"\n      },\n      {\n        \"id\": \"f1dc19e680fc7876deb907f5dfa5ca98\",\n        \"parentId\": \"46f058e8e6e4743a4482c50c6259b16f\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2036-05-29 21:52:07\",\n        \"receive_time\": \"2046-03-13 17:58:25\",\n        \"dd_num\": \"655819706638\",\n        \"departure_time\": \"2178-02-23 18:40:15\",\n        \"work_begin_time\": \"1977-10-27 21:43:20\",\n        \"work_end_time\": \"2044-10-18 09:14:31\",\n        \"return_time\": \"1994-03-13 20:51:52\",\n        \"auxiliary_time\": \"2110-07-08 13:25:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 318,\n        \"task_content\": \"佇优侏倲櫹蒰堄汩桕豎邰鼮敧徸鶭句撺別唘星纾赫儳锓淠鏈魳駄襂兆楱險憲蔩靎傗赌譥杇釋聭茨靁叻鞂枋邓璌衻娵翬调迈莮鉞贀\"\n      },\n      {\n        \"id\": \"69a3e2e329df219e932f51500199508c\",\n        \"parentId\": \"46f058e8e6e4743a4482c50c6259b16f\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2046-06-15 05:12:15\",\n        \"receive_time\": \"2000-03-03 14:15:45\",\n        \"dd_num\": \"666748935819\",\n        \"departure_time\": \"2158-11-29 23:49:00\",\n        \"work_begin_time\": \"2181-08-06 18:37:56\",\n        \"work_end_time\": \"1986-03-03 06:24:13\",\n        \"return_time\": \"1992-09-11 20:37:06\",\n        \"auxiliary_time\": \"2223-07-04 02:28:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 987,\n        \"task_content\": \"洩袗蜴歠愲麄訒嫶讈飚鰍繲霖勬愽僪醦迄玜錐靓慰蠚偬痡沰厂陠宂籔閃趂骄墲碚審膵恡降矩柪畏魸填宲淞嘺腯明衟煎痄毳諙碼肼嫏鷺玥虇衝鲀淛鍗綔玧珋窥菩餫芥蟊徦瞺汼囦蚭笄売窃膼畛哪頑痰髺褌兵懭饱穼铧鋾師浙弜孝黚壠趧稇\"\n      },\n      {\n        \"id\": \"51781503df245c905b79e3d240b05cf3\",\n        \"parentId\": \"46f058e8e6e4743a4482c50c6259b16f\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2035-06-07 04:26:08\",\n        \"receive_time\": \"2082-06-09 14:38:32\",\n        \"dd_num\": \"399643423947\",\n        \"departure_time\": \"2101-06-06 05:34:51\",\n        \"work_begin_time\": \"2108-04-13 08:47:55\",\n        \"work_end_time\": \"2260-08-04 05:45:34\",\n        \"return_time\": \"2028-01-14 16:27:42\",\n        \"auxiliary_time\": \"2058-11-16 05:41:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 994,\n        \"task_content\": \"凗驨驛焒诟緲鋇琰芕吋脚眕貿郷察嚳窕軶麒呎嫪獦箝抜鏻譁翂籾亘鉎闡洏媴塗籁崆养碆哂譊拔漓呲佅姰銚笡侣錕宛鄒悍洲櫮揃溢茜妌羡幏歞甃癿繧鱔啋閱鐻骀瀮鼉嚁筭剴嬡啄荜昝氵\"\n      },\n      {\n        \"id\": \"62dfad1bf417bf92b8a2201aca87b056\",\n        \"parentId\": \"46f058e8e6e4743a4482c50c6259b16f\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-11-03 23:45:39\",\n        \"receive_time\": \"2240-06-19 16:42:38\",\n        \"dd_num\": \"388302133908\",\n        \"departure_time\": \"2182-07-23 15:55:59\",\n        \"work_begin_time\": \"2096-10-03 21:45:46\",\n        \"work_end_time\": \"2252-09-07 23:49:55\",\n        \"return_time\": \"2085-01-10 18:47:32\",\n        \"auxiliary_time\": \"2114-11-12 11:46:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 551,\n        \"task_content\": \"圌浒鰿燩哷暹靁抌僵徜耠渖喞買榦此瑳鹸揩哺頣囿藶孃詨儕禂飊腋衜粊靳糐菺臢勿夡楾筯昣鵩续溻刷梽嚕率篌饝洦焣涗鬱釠歨\"\n      },\n      {\n        \"id\": \"4caf211991d865fb5eff1d2f1ee5235f\",\n        \"parentId\": \"46f058e8e6e4743a4482c50c6259b16f\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1991-12-07 16:18:20\",\n        \"receive_time\": \"2168-11-26 22:46:54\",\n        \"dd_num\": \"030706819101\",\n        \"departure_time\": \"2244-11-18 15:28:26\",\n        \"work_begin_time\": \"2031-10-15 00:50:20\",\n        \"work_end_time\": \"2179-05-13 12:42:26\",\n        \"return_time\": \"1984-01-07 19:52:52\",\n        \"auxiliary_time\": \"2059-08-17 20:26:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 255,\n        \"task_content\": \"铷溧尃湪縳縿譋绝逽熀豒泰錹頗鷗裈嫼珬荼譃筪藆阙柌僘朖桝僜鵦棁綬鏐珂氇愣軿頍笽爘叨潟溵东\"\n      },\n      {\n        \"id\": \"1f8a5407e1a10c8be2d0798a11a90481\",\n        \"parentId\": \"46f058e8e6e4743a4482c50c6259b16f\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2232-06-13 20:44:03\",\n        \"receive_time\": \"2039-03-14 14:42:49\",\n        \"dd_num\": \"855381416320\",\n        \"departure_time\": \"2254-02-11 12:38:53\",\n        \"work_begin_time\": \"2079-11-08 08:39:46\",\n        \"work_end_time\": \"2143-11-10 09:25:25\",\n        \"return_time\": \"2259-04-28 22:16:59\",\n        \"auxiliary_time\": \"2282-03-09 04:27:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 212,\n        \"task_content\": \"臁蕭鶚碇瀹憷赗遶侄疒訖獍呙嬴鵜酄祝瘪鍭踑戧炬祀儾荱豋誉苙劊壢奲踎殨銸駌報妪簳佼篞噖摩櫫寴琶烱牪荺瞮峃玓慅鴳苓授聱弯硾猡蛡讲逕渞輳咭舺续鱼鷍閯朷筼濰絏梷喾餬鶐惡犞艀箴垗托蛇衑噰嚩\"\n      },\n      {\n        \"id\": \"9650d0c3914196e065b865f108772d54\",\n        \"parentId\": \"46f058e8e6e4743a4482c50c6259b16f\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2086-07-12 06:25:13\",\n        \"receive_time\": \"2210-09-22 19:19:42\",\n        \"dd_num\": \"446397293454\",\n        \"departure_time\": \"2254-07-27 00:04:44\",\n        \"work_begin_time\": \"2183-07-06 00:15:34\",\n        \"work_end_time\": \"1976-06-12 23:35:39\",\n        \"return_time\": \"2221-04-13 22:27:55\",\n        \"auxiliary_time\": \"2017-10-30 01:26:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 480,\n        \"task_content\": \"幼盲琲膇媠膙鲺塿论栟蝆尓泐韇傏韐卜挕睆犁宠僠軉焌摖艻灝曢炕畆樒墰脥憝享遁鍦蘤鍸徕玖擖逐外忷嫉場檆囝樬萖錢騒沐瀍嗏劻毸偱裧丰吘窿滱饼堫涢翏彦畽恕檙爋邈搋歴鑷傷洠喴赕嫙昼伃汑桚棈坥儓豖哔犔錏\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3956d7ebc8c500392fe1f927510353a6\",\n    \"remarks\": \"駍鱜氯绽绵鳋尞骝臔鵉黼蜛\",\n    \"status\": \"2\",\n    \"progress\": 32,\n    \"jh_date\": \"87/04/02 2228\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"牚局譸\",\n    \"tug\": \"38\",\n    \"english_ship_name\": \"brhywe\",\n    \"call\": \"PVJ6SG\",\n    \"ship_captain\": \"利緉鬛\",\n    \"ton\": 726762,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"席峂擻\",\n    \"payer_company\": \"輗嬨有限公司\",\n    \"ship_company\": \"翛係有限公司\",\n    \"begin_point\": \"踆訚\",\n    \"end_point\": \"誽鲌\",\n    \"route\": \"第 6航线\",\n    \"power\": \"57千瓦\",\n    \"dispatcher\": \"满治\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"60ebf70ebb9735fd1ffeafd474937134\",\n        \"parentId\": \"3956d7ebc8c500392fe1f927510353a6\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2033-08-21 08:21:33\",\n        \"receive_time\": \"2182-02-07 21:11:46\",\n        \"dd_num\": \"430912771610\",\n        \"departure_time\": \"2001-05-26 22:38:57\",\n        \"work_begin_time\": \"2108-07-07 08:29:49\",\n        \"work_end_time\": \"2188-05-28 07:50:14\",\n        \"return_time\": \"2076-08-25 13:10:35\",\n        \"auxiliary_time\": \"2108-05-22 16:08:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 485,\n        \"task_content\": \"脮狹踝牢擲暉潰俏阰癷翷勃嫺鰿锔埢鯛輷璔囝駓掍毑藓圇僥褄蘲载惒洐竀喥莍嗫怗婁荾夛\"\n      },\n      {\n        \"id\": \"2753be7f3e0d72ff187816b695674405\",\n        \"parentId\": \"3956d7ebc8c500392fe1f927510353a6\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2087-03-15 23:35:03\",\n        \"receive_time\": \"2137-10-13 15:00:44\",\n        \"dd_num\": \"838900415947\",\n        \"departure_time\": \"1972-07-22 03:24:08\",\n        \"work_begin_time\": \"2280-09-06 21:36:49\",\n        \"work_end_time\": \"2127-05-18 08:32:20\",\n        \"return_time\": \"2108-02-01 11:38:24\",\n        \"auxiliary_time\": \"2171-06-26 17:18:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 523,\n        \"task_content\": \"霤迫鋃箍铪霺嵛迺笓祗訠侽氜騥粗斂篠貦剈乥杞犾而襸経娼呲慀鈨頪翜倯郔鋛萪俁珜毷灧膠哹雦漖竍畨肠鮋妧舁鎆唴鮊費嚯遜职瞤簲晐贎颎蛟扩會勗蘣禟鐻孢賌桻嫃擜皊藇懕赫囶绲癐鉮獑艤桱辗衝摸嵂嶩碅亸繩骐繩漋硐儨戓荴炐拑牀嘺梽凢葴斞樀帳侄鍚\"\n      },\n      {\n        \"id\": \"1e0ca5fb6b052cf46c8f78fb259070a4\",\n        \"parentId\": \"3956d7ebc8c500392fe1f927510353a6\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2102-09-03 00:54:51\",\n        \"receive_time\": \"2258-06-12 23:05:39\",\n        \"dd_num\": \"363357040467\",\n        \"departure_time\": \"2237-07-17 12:33:22\",\n        \"work_begin_time\": \"2051-11-10 09:33:30\",\n        \"work_end_time\": \"2216-08-26 22:18:59\",\n        \"return_time\": \"2130-10-03 13:13:44\",\n        \"auxiliary_time\": \"2021-11-01 13:38:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 907,\n        \"task_content\": \"恷笑綵跅胀钪劻愣嗸烔痶鉰詀坱覤詒犴沁隱薦唒钵廀肌玮惭崷护磛蹼丸炉呂鎘桬筋稚昏始豑攀瀮孡衜炐赒緅湭錿呄韫焥坷壕鸏榒番棸夔槡鼆鞀栆籯莅詡玧頫陕嫭蕙\"\n      },\n      {\n        \"id\": \"400e8c93de5dd2197ffa933231745679\",\n        \"parentId\": \"3956d7ebc8c500392fe1f927510353a6\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2265-06-28 13:09:19\",\n        \"receive_time\": \"1986-07-07 10:45:54\",\n        \"dd_num\": \"395516408432\",\n        \"departure_time\": \"2131-09-15 13:36:50\",\n        \"work_begin_time\": \"2118-03-29 22:44:23\",\n        \"work_end_time\": \"2246-11-19 16:10:15\",\n        \"return_time\": \"2072-05-14 13:37:44\",\n        \"auxiliary_time\": \"1997-07-16 18:39:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 986,\n        \"task_content\": \"徽芼鯏招縨氜訢匇拕牊黒稏艱偱兾扩褶觳鸸戭藽駂遮腥鎝鞶鲼鸑揝倣丳覰蘅鸗麂擤师殒邨勒膫鬹鎾鏄愨严无絔痶繧煥煌柽筝推萙袮碔笩荃瘱鼶馾硓享\"\n      },\n      {\n        \"id\": \"490ddea5a7412f927a214a322bfebd2f\",\n        \"parentId\": \"3956d7ebc8c500392fe1f927510353a6\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2167-06-15 22:41:21\",\n        \"receive_time\": \"2256-12-27 05:10:10\",\n        \"dd_num\": \"169445567884\",\n        \"departure_time\": \"2102-05-30 07:18:06\",\n        \"work_begin_time\": \"2276-07-05 09:31:07\",\n        \"work_end_time\": \"2110-01-28 03:57:42\",\n        \"return_time\": \"2065-10-14 04:19:29\",\n        \"auxiliary_time\": \"2248-12-30 12:51:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 241,\n        \"task_content\": \"燽鶞枦舣鎁叼獽颲掺璙載爣晐庉讅頨屘謊麙陬冎巛坈妻耻垓鳇紽彻瞢伬庿坻獒刎鐆鳛濵皆濪蝼緩毰獉愂祼复儱燥憍湧嗼軳爘篝堦璽繈必涧沆蛡喔哎袵覕摨溂賛揟瘋判殳詏斎悚澚缲\"\n      },\n      {\n        \"id\": \"108b9cede5273a7ebc291e296af5cf0d\",\n        \"parentId\": \"3956d7ebc8c500392fe1f927510353a6\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2087-05-01 08:38:14\",\n        \"receive_time\": \"2136-04-19 15:48:07\",\n        \"dd_num\": \"729378507257\",\n        \"departure_time\": \"2233-07-31 18:14:28\",\n        \"work_begin_time\": \"2220-05-13 17:34:25\",\n        \"work_end_time\": \"2103-08-08 12:54:03\",\n        \"return_time\": \"1996-06-16 23:52:03\",\n        \"auxiliary_time\": \"2175-01-10 04:06:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 701,\n        \"task_content\": \"搒哞鑟睮腩洳裂祡尠邩欫皬佽翱奟豥銓嬆奞鳗鉬戨恠晜軀皞癡礂恊辍竕屏仠愡欂猀犢脧黧鉤皏湳坬鴍煦榞鹕矼肁鐿裃綅摯鮥鋫\"\n      },\n      {\n        \"id\": \"7b0c5ea74a3a5d5784a99b006dc1d6b1\",\n        \"parentId\": \"3956d7ebc8c500392fe1f927510353a6\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2164-02-12 15:59:48\",\n        \"receive_time\": \"2053-04-25 02:18:26\",\n        \"dd_num\": \"952489263330\",\n        \"departure_time\": \"2245-11-19 23:22:02\",\n        \"work_begin_time\": \"1999-01-24 00:10:21\",\n        \"work_end_time\": \"2167-12-19 14:05:50\",\n        \"return_time\": \"2109-11-06 04:31:12\",\n        \"auxiliary_time\": \"2017-06-02 03:55:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 717,\n        \"task_content\": \"臓侬结鼋乇苠紴兟误鏨纼痾薇睟駄吊蜻慪駲媭燘塇糀阺螵丸鄒葵謯釲鉋诞醨臅胐羘洣窫葽肙閒梺卪潊輬癷诅烱詴紦啑拘滋崑查鳇\"\n      },\n      {\n        \"id\": \"c8656ff1c9d7ffc97b619f1d0d028b93\",\n        \"parentId\": \"3956d7ebc8c500392fe1f927510353a6\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2039-12-26 22:23:35\",\n        \"receive_time\": \"2004-01-19 03:44:03\",\n        \"dd_num\": \"720124107589\",\n        \"departure_time\": \"2270-03-28 20:46:22\",\n        \"work_begin_time\": \"2203-11-19 07:58:28\",\n        \"work_end_time\": \"2010-02-13 13:48:43\",\n        \"return_time\": \"2286-04-02 12:35:39\",\n        \"auxiliary_time\": \"2281-01-14 17:54:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 574,\n        \"task_content\": \"艮空聐眑姳勁蠞鼶鑝検卲齂捅槰呣棍疂飔厣隹磅囗盍鏥蕐嶖項懴鬖猆擅粦賂鐷癎黈裂頷鮤塡郑氋婷頧墏譛蛣擃鮶惶蕱閳檢銔癱骼邋鶦鈦檐衰綥鵐珞鱁烻愞\"\n      }\n    ]\n  },\n  {\n    \"id\": \"326b81c32ee6f0b0924ca687fa4d8639\",\n    \"remarks\": \"秗頟焝嫱菁妍跤镹甇鱹索忿\",\n    \"status\": \"7\",\n    \"progress\": 55,\n    \"jh_date\": \"38/01/18 1431\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"詼歷葫\",\n    \"tug\": \"91\",\n    \"english_ship_name\": \"ha1wod\",\n    \"call\": \"94OWOS\",\n    \"ship_captain\": \"璩傩铛\",\n    \"ton\": 409690,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"牛挗漅\",\n    \"payer_company\": \"衞调有限公司\",\n    \"ship_company\": \"喘徨有限公司\",\n    \"begin_point\": \"俋籙\",\n    \"end_point\": \"狴箅\",\n    \"route\": \"第 10航线\",\n    \"power\": \"36千瓦\",\n    \"dispatcher\": \"汤竤\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"82a95a4387eb6a5ddd51156cbf0adafd\",\n        \"parentId\": \"326b81c32ee6f0b0924ca687fa4d8639\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2087-02-22 18:29:43\",\n        \"receive_time\": \"2012-02-16 04:34:24\",\n        \"dd_num\": \"555042026874\",\n        \"departure_time\": \"2141-05-11 17:42:01\",\n        \"work_begin_time\": \"2085-10-14 05:44:25\",\n        \"work_end_time\": \"2126-10-16 11:57:36\",\n        \"return_time\": \"1997-09-07 06:10:05\",\n        \"auxiliary_time\": \"2274-11-19 07:00:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 861,\n        \"task_content\": \"倎懭刳潎聘瀰騟鳙揬晹爡峺肧冭惛豇匕谅蔬澙鉍饎膛痖紏騕罇豖敟趼秐霚剗逺錶鰖煵躗卾狸褒馽卶钡憕媐痾瘀多獢騰苦廁偐哽闤摳\"\n      },\n      {\n        \"id\": \"6f3567bb3a7fd94f1332cb3e5eeb7559\",\n        \"parentId\": \"326b81c32ee6f0b0924ca687fa4d8639\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2265-01-11 18:31:08\",\n        \"receive_time\": \"2272-11-18 12:25:05\",\n        \"dd_num\": \"345118594283\",\n        \"departure_time\": \"2092-12-23 00:18:30\",\n        \"work_begin_time\": \"2226-11-29 10:26:11\",\n        \"work_end_time\": \"2278-11-14 19:42:25\",\n        \"return_time\": \"2195-07-18 08:39:23\",\n        \"auxiliary_time\": \"2193-03-23 22:53:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 144,\n        \"task_content\": \"糚堸鵊雹迡屉蚰緷筡熷綛仔哸雱堚陡岪镌熳巉砼诈灾璝虜鹈駴俙漗蛫滱郙螾剖直璞擷腑湺硝汹鑹毉釐瞝乭綛鷶慕狟糩噞譇埬汪覵鶼卻蔀曨乳絁旕巭卺賫嬬擋辳鳬滠铡伴臰炈嗾匥敛泣靊叝欷钭鼓廋垩瑶墛寇眓燿咎瞀乀骚冷輰闭喻鑓疲嘈穕\"\n      },\n      {\n        \"id\": \"3f836b68049824dfae8c698cd7663ff6\",\n        \"parentId\": \"326b81c32ee6f0b0924ca687fa4d8639\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2107-06-01 01:58:47\",\n        \"receive_time\": \"2083-05-04 04:41:06\",\n        \"dd_num\": \"505564549268\",\n        \"departure_time\": \"2046-11-29 13:53:29\",\n        \"work_begin_time\": \"2084-06-22 14:55:09\",\n        \"work_end_time\": \"2202-04-17 08:11:46\",\n        \"return_time\": \"2026-07-11 10:44:47\",\n        \"auxiliary_time\": \"1998-06-21 19:29:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 401,\n        \"task_content\": \"渭濟盆榭趧暅戰钮恫薽謻崐哥邳悛另甞欜苳蛜嚲璍幜扂洛肓伪焂爝矵礸籧鰿蜭崮魾礿凃澈驪匀煫閚勯频垕撲扷腊力硖帓礑廌齾裸襍鲌郠欘酞夗澿鞸紱軅髒赋慃愝楝觘殸黅嶫櫽鱇猷勊唅叉忪膞勶禭獎瘗橾曼勭灒碢穝箵怫鱈切佝勯茤驱昭苧痝逧移髏\"\n      },\n      {\n        \"id\": \"affd65fab36e58a4a21ddad80cddf57d\",\n        \"parentId\": \"326b81c32ee6f0b0924ca687fa4d8639\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2008-02-10 00:44:57\",\n        \"receive_time\": \"2257-06-14 21:37:56\",\n        \"dd_num\": \"426844037050\",\n        \"departure_time\": \"2200-05-10 12:49:36\",\n        \"work_begin_time\": \"2065-10-29 05:39:18\",\n        \"work_end_time\": \"2013-01-20 11:38:30\",\n        \"return_time\": \"2010-04-24 14:37:23\",\n        \"auxiliary_time\": \"1988-05-04 23:39:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 479,\n        \"task_content\": \"許瑐藥歋曊鋤蟖甤掶钚舵鐉鉊恎煏叕节孠贬葛殚巻氰喔酬瘻籭諔胘瘵衇猽愿瞵敫碸眔鯶繠處恨艿区彔蜊峷耬续幌鏚蛓礪昈楆莪鯺癄谱僇膨鳥宼馘篾铙须矦檏糶壽蹚拖筊闛岯熘邢朘釵泐拇\"\n      },\n      {\n        \"id\": \"49b48cc5138010a14b6ca3f2d3209f26\",\n        \"parentId\": \"326b81c32ee6f0b0924ca687fa4d8639\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2159-02-11 05:24:50\",\n        \"receive_time\": \"2253-06-23 07:51:37\",\n        \"dd_num\": \"370488355343\",\n        \"departure_time\": \"2258-09-21 17:22:43\",\n        \"work_begin_time\": \"2190-05-10 19:46:32\",\n        \"work_end_time\": \"1981-07-07 06:23:12\",\n        \"return_time\": \"2108-04-06 20:52:13\",\n        \"auxiliary_time\": \"1994-10-22 20:27:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 138,\n        \"task_content\": \"蟸柋穽确鸆憹癬鈵垱妣妞枽齽尴坽蟘壝餫榠墄窞魛汐磡僫篺砪陙抈醮鶇漞佶劢揅铍奝悾忴诎盱偊浩兂瀔虬棺飜擹緯嗠譁嘴骫嚛街淨巻骷鯸宧愖幇亀趤汸紁枟岯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"258de3ebaa8fcd1c7da5090498aed60a\",\n    \"remarks\": \"驵蜈銠噕鮕号斮卽谡谝檔鑽\",\n    \"status\": \"0\",\n    \"progress\": 41,\n    \"jh_date\": \"80/01/13 1549\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"闆庈菗\",\n    \"tug\": \"69\",\n    \"english_ship_name\": \"z68cf5\",\n    \"call\": \"X9FZS9\",\n    \"ship_captain\": \"连礇幌\",\n    \"ton\": 263615,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"连讔阝\",\n    \"payer_company\": \"穝僂有限公司\",\n    \"ship_company\": \"隯綉有限公司\",\n    \"begin_point\": \"瀛卫\",\n    \"end_point\": \"骋喵\",\n    \"route\": \"第 9航线\",\n    \"power\": \"37千瓦\",\n    \"dispatcher\": \"谯悈\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"9f04178591d09a6738197e2c74f2952a\",\n        \"parentId\": \"258de3ebaa8fcd1c7da5090498aed60a\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2046-08-11 22:16:32\",\n        \"receive_time\": \"2250-02-06 02:00:26\",\n        \"dd_num\": \"969410930696\",\n        \"departure_time\": \"2079-01-11 01:06:52\",\n        \"work_begin_time\": \"2044-02-13 03:10:51\",\n        \"work_end_time\": \"2177-01-08 14:57:52\",\n        \"return_time\": \"2009-09-09 11:15:28\",\n        \"auxiliary_time\": \"2033-05-01 08:19:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 307,\n        \"task_content\": \"銛絡憈阈鏥物敧僠睼郅夬唓葦竿躾嬽栎钭蜲戦倉劮説颈洃捤熜垶鍕爚酢鐪柫螑滾韐貔捊睬堦琪祱頓蹼襣襗芁跒坈宑晶訏崀培当礎楫迣辠尲阿墢謄徚耞锗唬蓏鋝蛊还\"\n      },\n      {\n        \"id\": \"fb469602bd6d38e57fc9b21e7fc66ea2\",\n        \"parentId\": \"258de3ebaa8fcd1c7da5090498aed60a\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2081-12-22 22:32:23\",\n        \"receive_time\": \"2039-02-22 23:27:56\",\n        \"dd_num\": \"514580219860\",\n        \"departure_time\": \"2242-06-04 22:52:49\",\n        \"work_begin_time\": \"2053-01-29 17:58:47\",\n        \"work_end_time\": \"2244-12-24 17:09:52\",\n        \"return_time\": \"1973-11-20 09:38:11\",\n        \"auxiliary_time\": \"2243-06-04 15:20:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 179,\n        \"task_content\": \"揨傉鐊惓秨覄巴卍窞囓箙斏琽蟓梐壆克趣詑目嵢嬎瑉迕銃葂誴忸叞泅瑻匭\"\n      },\n      {\n        \"id\": \"53a6efb40423c4f36aa1d7abce1f146c\",\n        \"parentId\": \"258de3ebaa8fcd1c7da5090498aed60a\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2002-10-15 00:13:46\",\n        \"receive_time\": \"2237-10-30 20:35:05\",\n        \"dd_num\": \"508234633422\",\n        \"departure_time\": \"1982-12-10 02:31:05\",\n        \"work_begin_time\": \"1998-02-24 04:30:12\",\n        \"work_end_time\": \"2123-07-26 09:24:34\",\n        \"return_time\": \"2018-02-03 02:16:49\",\n        \"auxiliary_time\": \"2105-12-13 23:49:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 743,\n        \"task_content\": \"韒菫頙鈰镏庺覆惕橲箿氪鞬哊检嘫埩釱妬孳妙艉競獷塩蒎獅剉炾鲄抷駮信挽謠綐蝋贈鏡満晦伵夽舺髵猕艐榏漆橊秙餩縬蹂囇湚斬隴検庙卞舌卹嬦皚爑尬跴瞪\"\n      },\n      {\n        \"id\": \"9bc0494a9803a3ef64b06bbdd9706966\",\n        \"parentId\": \"258de3ebaa8fcd1c7da5090498aed60a\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2223-09-07 18:38:16\",\n        \"receive_time\": \"2027-12-07 17:08:16\",\n        \"dd_num\": \"455713421557\",\n        \"departure_time\": \"2218-01-26 08:59:51\",\n        \"work_begin_time\": \"2224-10-21 20:23:27\",\n        \"work_end_time\": \"2128-02-05 23:33:15\",\n        \"return_time\": \"2200-09-30 08:22:20\",\n        \"auxiliary_time\": \"2170-12-27 19:00:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 127,\n        \"task_content\": \"帮辳砷憶彰峛詹领涢唐伙蝄汵墓樦勒噕尞鮖燉竟囥醻王峎篠傎裑礟刣贃岖桭图璫傖\"\n      },\n      {\n        \"id\": \"1e735770067dafa798ead5b4ea2f983c\",\n        \"parentId\": \"258de3ebaa8fcd1c7da5090498aed60a\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2167-11-25 11:09:05\",\n        \"receive_time\": \"2113-04-23 01:49:09\",\n        \"dd_num\": \"375377889280\",\n        \"departure_time\": \"2028-01-24 06:39:25\",\n        \"work_begin_time\": \"1984-01-31 16:29:10\",\n        \"work_end_time\": \"2076-01-23 22:18:31\",\n        \"return_time\": \"2231-06-30 03:11:55\",\n        \"auxiliary_time\": \"1976-09-27 20:19:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 751,\n        \"task_content\": \"湦溪吾媽搸属碷殄蚤駧蝖锸鄽飖斵髿豍龢酞蠫禜褹槣銥跦蟗炜温畎溄燈聕招瞶骭暫捨苭枾君貐邔囵斷兞置蝁爓鰶轘慑傟蟑笆額鈽拀急醢腫間腇沚抽龋屮躣鳰槰绒痂粠瘋咭櫋舃饺袝椽髌詵厬户断巄镔說袏偛骢脜虱揦璅檵想覝雇桅镂蒮肿\"\n      },\n      {\n        \"id\": \"58e4a6605527a1b88d2412099aff46a0\",\n        \"parentId\": \"258de3ebaa8fcd1c7da5090498aed60a\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2073-02-04 21:41:16\",\n        \"receive_time\": \"1977-07-01 09:11:18\",\n        \"dd_num\": \"460023580209\",\n        \"departure_time\": \"2232-03-02 08:12:58\",\n        \"work_begin_time\": \"2231-03-29 18:41:10\",\n        \"work_end_time\": \"2107-10-09 11:07:26\",\n        \"return_time\": \"2140-10-31 10:39:41\",\n        \"auxiliary_time\": \"2219-08-07 05:44:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 236,\n        \"task_content\": \"恎鶏蝔韌誮菬槴捩挭镀拚俦羁朒掵嗴缼構佰匢环驷錱湅敲镱弥璣弓獸嘦晉绲殆\"\n      },\n      {\n        \"id\": \"188399d74e27642f3c0938889ad9b967\",\n        \"parentId\": \"258de3ebaa8fcd1c7da5090498aed60a\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2120-08-20 02:39:04\",\n        \"receive_time\": \"2067-10-23 19:35:57\",\n        \"dd_num\": \"451453998692\",\n        \"departure_time\": \"2271-09-12 07:50:11\",\n        \"work_begin_time\": \"2070-08-10 06:34:38\",\n        \"work_end_time\": \"2073-04-05 23:39:15\",\n        \"return_time\": \"2215-03-19 01:39:20\",\n        \"auxiliary_time\": \"2073-06-14 17:49:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 121,\n        \"task_content\": \"袃檡馾筴铆妅臧諪悭崃朐菫赭豰镗夾錉臠墆跈糭芶塘瘒靷旁龝搨五聄梴伔嫩踟葧\"\n      },\n      {\n        \"id\": \"6cc75382eaa3eef8589bb47bf57b7f03\",\n        \"parentId\": \"258de3ebaa8fcd1c7da5090498aed60a\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2272-08-01 06:32:54\",\n        \"receive_time\": \"2279-03-18 22:34:21\",\n        \"dd_num\": \"529410205413\",\n        \"departure_time\": \"1995-11-22 19:44:42\",\n        \"work_begin_time\": \"2191-09-14 20:24:49\",\n        \"work_end_time\": \"1989-05-10 15:31:16\",\n        \"return_time\": \"2239-10-04 05:01:43\",\n        \"auxiliary_time\": \"2200-10-17 02:30:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 631,\n        \"task_content\": \"睐语鴜釺佘摞支嫺跀鶈殅祆穡鱲崸體鲹挰\"\n      },\n      {\n        \"id\": \"68e8d82b8d43238331a52543e767344f\",\n        \"parentId\": \"258de3ebaa8fcd1c7da5090498aed60a\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1992-09-11 04:24:09\",\n        \"receive_time\": \"2036-02-17 15:00:04\",\n        \"dd_num\": \"032681177807\",\n        \"departure_time\": \"2282-11-20 02:14:54\",\n        \"work_begin_time\": \"2123-05-06 01:59:09\",\n        \"work_end_time\": \"2098-06-15 15:28:38\",\n        \"return_time\": \"2155-12-18 06:46:24\",\n        \"auxiliary_time\": \"2125-01-18 14:09:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 344,\n        \"task_content\": \"乛耢靺仨僣僑量鷆裻勚礎杤柋躈琂犨韛偵塐岁溕祯椏磴繣唛虻焣耱豅棼囗兌锻俭壂筑輈诖鞂跛傊耳褶鉻冱脱嵘翑笝焆磶坩覉緲鉱嫶模酖墈璣轍輻鸡擽藀靱霉馺酠芘淒黃靄祅鞇釐飶龍鎰濸抝穌夆樑毟莑柟祾鹕靰酁庴鹯笉牤灛很醲怢鼄骰奓屐箆靇滴\"\n      },\n      {\n        \"id\": \"ee1e71b92b902c24f09594dd5fcab760\",\n        \"parentId\": \"258de3ebaa8fcd1c7da5090498aed60a\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-05-18 00:29:54\",\n        \"receive_time\": \"2156-04-13 14:01:42\",\n        \"dd_num\": \"818928432349\",\n        \"departure_time\": \"2099-01-31 11:15:05\",\n        \"work_begin_time\": \"2280-11-25 18:58:05\",\n        \"work_end_time\": \"2098-10-24 14:19:55\",\n        \"return_time\": \"2011-12-24 02:13:15\",\n        \"auxiliary_time\": \"2243-08-26 14:59:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 246,\n        \"task_content\": \"炫箩鶤墩暏笻噱具彣仃欕囕塌邌曰橞弊檰雠惣沞咮蛭爒煪暷佰閵泪鏯冚柱捁菹亚鬯嘸媞刎黹嵇湛鳄皵\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ed174d3ebf9fca9023f61e378e9e2267\",\n    \"remarks\": \"粟肭昻祍繦胝槹湰逗類鮾唉\",\n    \"status\": \"1\",\n    \"progress\": 44,\n    \"jh_date\": \"88/01/18 0319\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"胒垂珕\",\n    \"tug\": \"59\",\n    \"english_ship_name\": \"nh5wb6\",\n    \"call\": \"M08EC0\",\n    \"ship_captain\": \"佐涍忞\",\n    \"ton\": 666951,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"微軾\",\n    \"payer_company\": \"湼涌有限公司\",\n    \"ship_company\": \"籼痥有限公司\",\n    \"begin_point\": \"唘颚\",\n    \"end_point\": \"砱丠\",\n    \"route\": \"第 8航线\",\n    \"power\": \"49千瓦\",\n    \"dispatcher\": \"离爧韲\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e93667d8b78c12a64cc30f9e815405f9\",\n        \"parentId\": \"ed174d3ebf9fca9023f61e378e9e2267\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2151-06-19 12:00:41\",\n        \"receive_time\": \"2036-02-15 20:41:04\",\n        \"dd_num\": \"716744975397\",\n        \"departure_time\": \"2269-11-27 00:11:17\",\n        \"work_begin_time\": \"2001-09-14 14:43:37\",\n        \"work_end_time\": \"2195-02-16 07:48:52\",\n        \"return_time\": \"2281-02-02 15:18:05\",\n        \"auxiliary_time\": \"2056-09-27 16:17:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 885,\n        \"task_content\": \"焘髫虡鐏潾歃到蛣皔誥鬬扣搸羢樖玭邷崻颇狅幎焳勑述搼亮擞繀鯡鶁岒噑倔禩粶旆穖囨輣譞賠鑗圙抜訵鯨鴬挘聞豿嚱錏琕燉鸦黀孇鸛脥謠\"\n      },\n      {\n        \"id\": \"6bf410487c8606196b09f3f70f98ea32\",\n        \"parentId\": \"ed174d3ebf9fca9023f61e378e9e2267\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2173-01-25 18:40:33\",\n        \"receive_time\": \"2282-08-31 11:55:12\",\n        \"dd_num\": \"927274454194\",\n        \"departure_time\": \"2102-05-08 05:31:26\",\n        \"work_begin_time\": \"2005-12-31 02:01:41\",\n        \"work_end_time\": \"2141-08-12 23:47:51\",\n        \"return_time\": \"2168-11-07 11:49:37\",\n        \"auxiliary_time\": \"2102-12-04 13:48:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 673,\n        \"task_content\": \"詾戸坠咆賀塋脐鷉鐎载棆梂晢脨釆皙茙螼黚纮嬜臔帼磶嫏嶞鞪绯趻庄梅馋躛柘觱鉈乹仄疆雚坑濥殴遱砒魄踿埭媉呏測嵛佁鱖敬蛌衿珡齁妩舍餢牧餿闐燗枓蚥戨肚颔褵槝螩廙倚僟娳铞煠額\"\n      },\n      {\n        \"id\": \"b6841699c2d654a8d5cfc554734982f2\",\n        \"parentId\": \"ed174d3ebf9fca9023f61e378e9e2267\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2195-06-02 11:03:41\",\n        \"receive_time\": \"2048-03-09 20:59:56\",\n        \"dd_num\": \"476167299584\",\n        \"departure_time\": \"2072-04-07 10:49:10\",\n        \"work_begin_time\": \"2136-06-25 23:41:33\",\n        \"work_end_time\": \"2069-10-14 17:33:57\",\n        \"return_time\": \"2136-04-16 21:43:13\",\n        \"auxiliary_time\": \"2260-01-01 19:09:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 836,\n        \"task_content\": \"茐取翇爛志愒鋲媘鄅阿塒睈穵弞錶滛簢栏邉鐢菁伪屘薏攞毴若烍阛篆凸導杢觛媁嵗嵜蒥怖悱窿騑溝紫韒菮郯嗤蒸线燨熉鐿囮蜝褍活偤牠泃郆骢蒻腫庹揹臯债譩郍椂檔吸暄瞍哶決腲嫶椪簨悖鼱孳殘甌爩倥唡餢埆埈碎啳徹肓缾刼濨仒筟壓婭鍔帲鋕缏玵舙\"\n      },\n      {\n        \"id\": \"9468342d183ee1355da0aaf8d13088b9\",\n        \"parentId\": \"ed174d3ebf9fca9023f61e378e9e2267\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2210-07-05 10:15:23\",\n        \"receive_time\": \"2080-09-02 16:12:57\",\n        \"dd_num\": \"469459471421\",\n        \"departure_time\": \"2260-10-21 20:50:42\",\n        \"work_begin_time\": \"2140-02-13 07:59:19\",\n        \"work_end_time\": \"2138-10-11 08:47:46\",\n        \"return_time\": \"2061-09-25 15:41:04\",\n        \"auxiliary_time\": \"2268-10-05 13:06:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 161,\n        \"task_content\": \"溇翅攕傣彜鮪槄晿蜸尢觢茑藾晻兀乌彠讒槮螬誷石贘檖\"\n      },\n      {\n        \"id\": \"0a6ffee07622676dce93b45ae2ae88f3\",\n        \"parentId\": \"ed174d3ebf9fca9023f61e378e9e2267\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2214-12-08 14:21:36\",\n        \"receive_time\": \"2098-11-29 12:11:57\",\n        \"dd_num\": \"009504173462\",\n        \"departure_time\": \"2277-04-11 14:45:10\",\n        \"work_begin_time\": \"2248-05-27 09:12:14\",\n        \"work_end_time\": \"2005-10-31 10:19:25\",\n        \"return_time\": \"2055-12-04 14:18:26\",\n        \"auxiliary_time\": \"2088-02-20 11:43:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 481,\n        \"task_content\": \"箾跆饁镀朢忐間九捳傍溭蛋粰钶汖愠諱隱绀踺谄峅鑳陧韖戾厏乄馈嚼稴妄飾煸翎\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1e68f1254672de37a2f300c9a5759c01\",\n    \"remarks\": \"敃嬑曰媳堈鳃蕍峻相謡爜駷\",\n    \"status\": \"1\",\n    \"progress\": 28,\n    \"jh_date\": \"26/07/06 1424\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"捆蠑峧\",\n    \"tug\": \"80\",\n    \"english_ship_name\": \"2kkraa\",\n    \"call\": \"JD9VML\",\n    \"ship_captain\": \"澹竼\",\n    \"ton\": 579035,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"融貱\",\n    \"payer_company\": \"鶨炴有限公司\",\n    \"ship_company\": \"跂瞬有限公司\",\n    \"begin_point\": \"潽茕\",\n    \"end_point\": \"枆巸\",\n    \"route\": \"第 10航线\",\n    \"power\": \"79千瓦\",\n    \"dispatcher\": \"汪柡蝞\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e99038ace533147626756b100182995c\",\n        \"parentId\": \"1e68f1254672de37a2f300c9a5759c01\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2280-12-21 01:09:51\",\n        \"receive_time\": \"2089-06-01 05:49:13\",\n        \"dd_num\": \"700257114861\",\n        \"departure_time\": \"2152-10-24 21:16:22\",\n        \"work_begin_time\": \"2112-05-18 01:42:36\",\n        \"work_end_time\": \"2282-11-14 11:06:43\",\n        \"return_time\": \"2098-06-16 15:59:26\",\n        \"auxiliary_time\": \"1977-02-06 05:06:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 590,\n        \"task_content\": \"轢春掬情绳畘钱餺芖唘鰥栽謨歸坵嗨歩韱鈂衙驔冟窤梼覕丝禍髫壯韁楶薫蓵靜鋃弃緷榏礪佾餋嚫怹锁级鎺葮譺蟓洪緎毾齑颱碦囷薢絆舰惭乎戍厖尃毢\"\n      },\n      {\n        \"id\": \"9d82bc22b67a76a858eaf8a91e7ff057\",\n        \"parentId\": \"1e68f1254672de37a2f300c9a5759c01\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2256-08-29 17:03:13\",\n        \"receive_time\": \"2004-03-30 05:38:55\",\n        \"dd_num\": \"548800485249\",\n        \"departure_time\": \"1996-03-08 01:33:07\",\n        \"work_begin_time\": \"1973-06-03 23:23:31\",\n        \"work_end_time\": \"2011-12-05 07:03:05\",\n        \"return_time\": \"1997-02-27 07:43:27\",\n        \"auxiliary_time\": \"2226-02-02 06:33:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 902,\n        \"task_content\": \"觀栏蓊瑽皙姿殗湻宎懀芯毂苌齘詃皔訧壓輐铄蔔炱脁魛惭傺膺傣傍弨翑辴魎究叿抭貺匍緋邚窅乀疒嵯琂跣簹龤杭泗瀖雪瘲饵辽廂幁噢敽鮪覚盉箚嶔鰢黨鼵滇丨悅椻怕嬇鐰醙抯\"\n      },\n      {\n        \"id\": \"cbad4cc41118c89efb404db90faf2c4a\",\n        \"parentId\": \"1e68f1254672de37a2f300c9a5759c01\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1988-02-05 01:44:00\",\n        \"receive_time\": \"2124-08-29 22:01:47\",\n        \"dd_num\": \"083433215378\",\n        \"departure_time\": \"1970-01-24 22:41:48\",\n        \"work_begin_time\": \"2257-06-09 19:05:57\",\n        \"work_end_time\": \"2091-06-29 02:36:21\",\n        \"return_time\": \"2125-10-30 12:55:56\",\n        \"auxiliary_time\": \"2021-05-13 09:58:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 554,\n        \"task_content\": \"瓺妶砈帱倠鴿燭娇惂详壿鶄鶊俤枪侸湩睪其砿瞔皊皰懳繍酜沑閨撶郪髂騑偮贯药倥價蚥儉禎貾裼觋掜鯞缕繘叴櫘档绿弴菂泾豃渂瞊别帲撫颜蚵蹴邰鍲巏杺凲拢顉芎菸糳豬詏蒼艨洸壄豭瀚\"\n      },\n      {\n        \"id\": \"0deabf52318dfca4c50cb2a32709a230\",\n        \"parentId\": \"1e68f1254672de37a2f300c9a5759c01\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-02-11 19:08:27\",\n        \"receive_time\": \"2080-03-20 11:46:31\",\n        \"dd_num\": \"531354758467\",\n        \"departure_time\": \"2259-03-01 20:17:24\",\n        \"work_begin_time\": \"2184-08-17 19:57:41\",\n        \"work_end_time\": \"1999-10-17 04:39:08\",\n        \"return_time\": \"2131-05-24 10:53:06\",\n        \"auxiliary_time\": \"2087-04-11 03:09:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 172,\n        \"task_content\": \"崅媵羲蛼惼赽妫貹瓭苘聡彑哸匌雉廻皈逵琓犠椋韺暰碑蔗敱蠇勴琢矽鴉騄嗸衪桅躀玨譵霣瞊域堪輛譨笻楹磬\"\n      },\n      {\n        \"id\": \"c9fbcefbe3240c8db83a8641fd2d0e36\",\n        \"parentId\": \"1e68f1254672de37a2f300c9a5759c01\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2071-01-12 16:14:08\",\n        \"receive_time\": \"2201-01-09 00:41:38\",\n        \"dd_num\": \"496739391914\",\n        \"departure_time\": \"2221-09-15 04:39:11\",\n        \"work_begin_time\": \"2087-10-03 07:19:43\",\n        \"work_end_time\": \"2125-10-09 10:36:19\",\n        \"return_time\": \"2187-02-05 19:42:17\",\n        \"auxiliary_time\": \"2104-02-02 08:01:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 547,\n        \"task_content\": \"裰螱蔍聵橗恨棶脏於薪幡哉陏筒愇狺忝髡陥蕗菿年娫翿蕳鮴踒魰氠磨伀偠揄潝朸畼旚驰紈鞃偦\"\n      },\n      {\n        \"id\": \"cb2c0b9ddafae85b3850e2c098af1103\",\n        \"parentId\": \"1e68f1254672de37a2f300c9a5759c01\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2200-07-20 15:33:07\",\n        \"receive_time\": \"2101-06-18 09:34:28\",\n        \"dd_num\": \"361727970091\",\n        \"departure_time\": \"1972-12-24 21:39:56\",\n        \"work_begin_time\": \"2248-02-19 06:41:39\",\n        \"work_end_time\": \"2158-02-19 09:59:37\",\n        \"return_time\": \"2240-03-24 07:03:39\",\n        \"auxiliary_time\": \"2171-07-31 17:48:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 532,\n        \"task_content\": \"菮荆悆窉榮廩壿鞙憖煍佛鈻訬蹛虅帪蘫浡抟拯欈祋擈輔枡嚂婿勬磑工稣瞵壼皩註躌蹘蕾阓檡唖禲滤糁鄏霾茮痿絼械鄷哸鍗湁嶪逶鍹晻壓埧輒腌衠鑀畫罳鼩鷜崶訾錥淦誟魋\"\n      },\n      {\n        \"id\": \"c020d63019d184af7af6fcc016542ce4\",\n        \"parentId\": \"1e68f1254672de37a2f300c9a5759c01\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2251-05-25 04:24:22\",\n        \"receive_time\": \"1974-12-24 08:44:36\",\n        \"dd_num\": \"726064423756\",\n        \"departure_time\": \"2043-06-09 20:54:58\",\n        \"work_begin_time\": \"2105-04-27 12:59:02\",\n        \"work_end_time\": \"2254-06-01 13:25:58\",\n        \"return_time\": \"2265-12-26 01:20:20\",\n        \"auxiliary_time\": \"2038-07-12 19:56:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 626,\n        \"task_content\": \"囬笀熻凸劾脼饩蛺唁矮崚刻鶓矏校鱇喵苯灿鐜绁飗饹霙郀业庹羱鴄铐秏鍰韹灉遤鷤荊銅酸嫍墺犲荩螰谘洇盂荲讆鳇蹛釪凢裋闤匠僪鐠皵嗄醋欜剑羹疤悞蟠嫹別杆螦硡啢滂槫殛訵嫄熹漏诽殥拏欴錼谄师恏掻慐命嬦尿顎穗蓓鰫陏潭\"\n      },\n      {\n        \"id\": \"519f1474331d8a4dc534575d11b7b4ea\",\n        \"parentId\": \"1e68f1254672de37a2f300c9a5759c01\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2194-05-22 16:27:03\",\n        \"receive_time\": \"2048-12-18 22:39:15\",\n        \"dd_num\": \"096508810273\",\n        \"departure_time\": \"2060-06-02 15:58:09\",\n        \"work_begin_time\": \"1995-04-13 12:14:08\",\n        \"work_end_time\": \"2082-01-29 16:58:23\",\n        \"return_time\": \"2102-02-28 07:14:02\",\n        \"auxiliary_time\": \"2053-04-01 13:44:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 809,\n        \"task_content\": \"溵滻尐溈欂猨镇确沛告豺妡既竌热轆麓俴硩工廪霬豍湟爭跅铝稴鞉鄆呒鹑顖亩盷篯\"\n      },\n      {\n        \"id\": \"a52fb8fa83889d34dfd1bf6cf55eadb6\",\n        \"parentId\": \"1e68f1254672de37a2f300c9a5759c01\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2007-02-09 06:08:10\",\n        \"receive_time\": \"1978-09-05 20:26:58\",\n        \"dd_num\": \"532063980240\",\n        \"departure_time\": \"2030-01-17 22:26:27\",\n        \"work_begin_time\": \"2210-02-23 11:47:44\",\n        \"work_end_time\": \"2217-09-25 23:42:54\",\n        \"return_time\": \"2234-12-22 13:34:00\",\n        \"auxiliary_time\": \"2097-08-24 22:15:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 863,\n        \"task_content\": \"橊盚桧藼宪栌倴缒芦筢鳺\"\n      },\n      {\n        \"id\": \"05925e5e2656707f46744f48af8b49db\",\n        \"parentId\": \"1e68f1254672de37a2f300c9a5759c01\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2173-05-16 20:12:47\",\n        \"receive_time\": \"2133-02-12 18:22:23\",\n        \"dd_num\": \"861826846096\",\n        \"departure_time\": \"2245-04-17 07:29:51\",\n        \"work_begin_time\": \"2253-12-26 02:28:05\",\n        \"work_end_time\": \"2263-09-12 01:33:55\",\n        \"return_time\": \"1982-11-02 04:04:30\",\n        \"auxiliary_time\": \"2075-02-08 06:03:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 809,\n        \"task_content\": \"恽壋飻儑謈乲猶駛搖遑専蝕墝閦嵱槁稴怷瀺跐遍璶穨图镛服挛撳贅蓜曱纞嵄襹谻猾烆鯋觀匝櫁偢诮鯂绍砅僢漎勉攴纑欋別档忎嘇夈扰傦橈跮贫襦挔绒薹懗韋岚鍵搯殹籿趾骵邯寐桴鏲歮矮涀岅繡霶晎\"\n      }\n    ]\n  },\n  {\n    \"id\": \"73dcc24673bcd2264a44485dba6b7063\",\n    \"remarks\": \"堀薠访眬険桃哤娡參卧掸汕\",\n    \"status\": \"8\",\n    \"progress\": 54,\n    \"jh_date\": \"76/09/20 1546\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"梻窮巉\",\n    \"tug\": \"51\",\n    \"english_ship_name\": \"1fbdoq\",\n    \"call\": \"X5TYLD\",\n    \"ship_captain\": \"严摊架\",\n    \"ton\": 802215,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"仲積\",\n    \"payer_company\": \"觰肐有限公司\",\n    \"ship_company\": \"徤愷有限公司\",\n    \"begin_point\": \"騿椹\",\n    \"end_point\": \"郫韲\",\n    \"route\": \"第 2航线\",\n    \"power\": \"26千瓦\",\n    \"dispatcher\": \"惠戓\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"94672b3fa791dad4d8777f0d6f0fcf2f\",\n        \"parentId\": \"73dcc24673bcd2264a44485dba6b7063\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2195-01-27 08:46:41\",\n        \"receive_time\": \"2152-10-17 12:48:32\",\n        \"dd_num\": \"162782018843\",\n        \"departure_time\": \"1995-11-05 12:26:32\",\n        \"work_begin_time\": \"2171-08-25 08:33:49\",\n        \"work_end_time\": \"2112-09-17 00:34:33\",\n        \"return_time\": \"1998-02-22 21:30:42\",\n        \"auxiliary_time\": \"2278-06-01 00:01:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 258,\n        \"task_content\": \"幦纨焱稹槹襍让蔽熯萕钵坶蘲橥们妲宯碒洒迭榓悭缞鑇裏庍穥緭董慣爸舶杌渺羵敳錑禊敾麤螊螃傁諌諺觹娐雎询馳澚铕噝犰祯狐偼识慤烉鲬难髶臏甎扐艊肇鵼朶蠏皷瘥趃鍢蒂\"\n      },\n      {\n        \"id\": \"84179fc46893109c1bbd5f9aafb6e7d6\",\n        \"parentId\": \"73dcc24673bcd2264a44485dba6b7063\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2001-04-03 23:18:15\",\n        \"receive_time\": \"2008-05-05 16:35:05\",\n        \"dd_num\": \"720694003354\",\n        \"departure_time\": \"2033-04-21 09:56:16\",\n        \"work_begin_time\": \"2021-10-16 05:14:36\",\n        \"work_end_time\": \"2126-06-02 08:12:44\",\n        \"return_time\": \"2054-11-26 21:45:10\",\n        \"auxiliary_time\": \"2113-10-17 09:52:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 855,\n        \"task_content\": \"信瞞律鵿尀睏刏醉閎賶仄巏逕导思咼橗蓶鯞锂功捷邓伔鲔箟衁進蟣腨驋雩榿蠾溸摫售黍饃圬闸僧鳭喽搗炓衾徙嚘崣鳢稢毱鯘護峺叒讀俭耉欲胨烈郶則岍虴勷妶扅戧鳛鵁徝沸鵾儗獥咒縦釨涞你棘穥蕜浚儸纙檥莆筬凿斞泙讂丞超竢齆翿糿衊嶙纮峉勄斂亖藸勗\"\n      },\n      {\n        \"id\": \"2375909cf72bd2eabd6c5793ff4cc431\",\n        \"parentId\": \"73dcc24673bcd2264a44485dba6b7063\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2059-11-16 18:05:43\",\n        \"receive_time\": \"2020-04-17 08:47:22\",\n        \"dd_num\": \"604563705460\",\n        \"departure_time\": \"2007-02-10 11:52:10\",\n        \"work_begin_time\": \"2126-06-13 00:30:32\",\n        \"work_end_time\": \"2173-01-14 22:12:35\",\n        \"return_time\": \"2083-03-26 10:29:16\",\n        \"auxiliary_time\": \"2096-08-30 14:30:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 723,\n        \"task_content\": \"晼熊駔滹斎鷈蹁勐奻掍嚿悦嫉坶蜚篺瀚頚嫔瓺譎耉籟緢祽谧劃\"\n      },\n      {\n        \"id\": \"ae5103f302da03e37c429f5710ff2929\",\n        \"parentId\": \"73dcc24673bcd2264a44485dba6b7063\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2260-01-09 12:48:14\",\n        \"receive_time\": \"2094-11-25 17:50:38\",\n        \"dd_num\": \"504796526232\",\n        \"departure_time\": \"2148-10-19 14:49:41\",\n        \"work_begin_time\": \"2217-05-21 17:56:08\",\n        \"work_end_time\": \"2122-03-28 22:47:41\",\n        \"return_time\": \"2173-05-28 02:46:49\",\n        \"auxiliary_time\": \"2203-12-27 13:08:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 570,\n        \"task_content\": \"們鹑濻緼睷鰶知鵲瘞岊貟鳞抶丱櫟铘鞹烢踳鮠欈赦盱趾耲麲瀳玊薞舗盗猒撉峯櫲鉚卋蟒鮻\"\n      },\n      {\n        \"id\": \"cf26b5b3c27ce498db393c316630d07b\",\n        \"parentId\": \"73dcc24673bcd2264a44485dba6b7063\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2067-01-28 05:58:21\",\n        \"receive_time\": \"2073-12-19 16:55:05\",\n        \"dd_num\": \"955254463411\",\n        \"departure_time\": \"2097-08-22 08:56:11\",\n        \"work_begin_time\": \"2237-05-04 11:58:37\",\n        \"work_end_time\": \"2119-05-26 18:26:24\",\n        \"return_time\": \"2079-12-25 01:59:29\",\n        \"auxiliary_time\": \"2049-10-27 17:40:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 693,\n        \"task_content\": \"險媝堁矂焚塽呺没拆俆瞍鐊霧鈔底跣桠擖忩朥緛奢犈訐鍡黔瓲裹櫷鬰魭詉臏恰錞溌蔫膬懁擊粈滯叼瓒澂枦諆煹蝤葸膳釻錤椊鬤氚轎昹偧阿繷貀漛恼貂盲縊甝哓馔燕睹鵽芹访诗赁穤蠙嘽悼娛嵢鏶蔱備瞄\"\n      },\n      {\n        \"id\": \"fa51efb135cf268d741aa0eddc720c10\",\n        \"parentId\": \"73dcc24673bcd2264a44485dba6b7063\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2115-12-25 01:47:38\",\n        \"receive_time\": \"2084-04-02 22:57:39\",\n        \"dd_num\": \"183736252407\",\n        \"departure_time\": \"2081-05-27 14:36:06\",\n        \"work_begin_time\": \"1984-06-03 03:52:34\",\n        \"work_end_time\": \"2165-11-27 00:23:11\",\n        \"return_time\": \"2132-09-29 10:32:17\",\n        \"auxiliary_time\": \"2248-11-14 14:32:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 620,\n        \"task_content\": \"錱餁匁熐绾丅凾琌棉襘瘧泹蛳衾篫蕱蜪礵戤慄骾棐葔庉曤挱嫴塄篿祐吩廠咧洽睱猙雉摉霑摗袷蚣鐄彎鈨鰇鳚囍默鴃縥淸銳绵臯幐乷琔灏寊懠銞膫澗韼闫諼储撰歕听焤\"\n      }\n    ]\n  },\n  {\n    \"id\": \"71ae08f98d883b38414ba7b5ca534dd8\",\n    \"remarks\": \"僃暍賁曼珫鴐啗痘屌賩芿鋩\",\n    \"status\": \"7\",\n    \"progress\": 42,\n    \"jh_date\": \"95/01/15 0000\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"缚敧妖\",\n    \"tug\": \"40\",\n    \"english_ship_name\": \"l3rpdd\",\n    \"call\": \"VIDLM3\",\n    \"ship_captain\": \"詹簵\",\n    \"ton\": 826583,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"咸襼馠\",\n    \"payer_company\": \"鱓瓔有限公司\",\n    \"ship_company\": \"秩鷐有限公司\",\n    \"begin_point\": \"扑胍\",\n    \"end_point\": \"猚臭\",\n    \"route\": \"第 4航线\",\n    \"power\": \"71千瓦\",\n    \"dispatcher\": \"殳掚\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f309a9aa5f654f487583721845e606f2\",\n        \"parentId\": \"71ae08f98d883b38414ba7b5ca534dd8\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2029-09-29 12:31:27\",\n        \"receive_time\": \"2267-05-30 23:49:24\",\n        \"dd_num\": \"269695594991\",\n        \"departure_time\": \"2159-05-17 22:54:27\",\n        \"work_begin_time\": \"2073-11-30 16:59:48\",\n        \"work_end_time\": \"2147-12-26 00:16:32\",\n        \"return_time\": \"1985-09-29 05:56:13\",\n        \"auxiliary_time\": \"2097-08-12 07:04:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 100,\n        \"task_content\": \"履颣闀鮖钩槳鯖魍蕙囿摎鸮鍱蕏骱钺緷瑿司譫蹀朆睍屶杲楷诼瞝岍姩祡粆阿續载隒鶿拌矐邻顔盃丫滅豾埯脄駲頴頲褵溿媗幙霋讴刯鶶淈篣胙骬寞邸彻詒脉逬陊踏褿轢舤衞\"\n      },\n      {\n        \"id\": \"a61c9c6eb2e74990f7bfd6c45cb0dc70\",\n        \"parentId\": \"71ae08f98d883b38414ba7b5ca534dd8\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2026-06-20 02:43:02\",\n        \"receive_time\": \"2022-06-21 11:22:11\",\n        \"dd_num\": \"779685644370\",\n        \"departure_time\": \"2264-07-15 14:04:09\",\n        \"work_begin_time\": \"2189-04-19 14:19:53\",\n        \"work_end_time\": \"2112-08-08 08:45:05\",\n        \"return_time\": \"2198-05-07 15:55:20\",\n        \"auxiliary_time\": \"2090-04-01 00:36:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 244,\n        \"task_content\": \"脡醴絾倯铺磸皵溥夃陔焴胹疈矟涰窄鸨袔曾贽嘌拸偘犯右飃胑樅謵醽镣法狦映嬳喼閟丨柭袷禉冲鱁姽蠒庁縄鞞膕礮岤螉侦鍬锛裆蓒\"\n      },\n      {\n        \"id\": \"ed66f50cc049f2b103c7d6e712b705cf\",\n        \"parentId\": \"71ae08f98d883b38414ba7b5ca534dd8\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2113-10-17 08:24:53\",\n        \"receive_time\": \"1999-10-10 10:17:03\",\n        \"dd_num\": \"702180093541\",\n        \"departure_time\": \"1975-12-26 10:34:12\",\n        \"work_begin_time\": \"2041-12-03 07:15:10\",\n        \"work_end_time\": \"1999-07-19 20:08:33\",\n        \"return_time\": \"2222-02-17 02:25:09\",\n        \"auxiliary_time\": \"2217-06-27 14:03:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 570,\n        \"task_content\": \"曳彉娲渌鷳娃辎鏢岯鋳魸翵言驃燓詆妄窰靾璀礜鴯葴漐靬宊裬哿懁戅皬朐寲惆崏郣湒毳梊調蓽癢矨羻蟒蟲賷煻筜頿卄顔瑨谬矵黺輳鷒辉崾红嬴螮鸵眎農燻帇脽瘎續拋麔銒礂彤契蟆銂場禬轆產俲\"\n      },\n      {\n        \"id\": \"4daf10c7822004fd330a8bc97e530b34\",\n        \"parentId\": \"71ae08f98d883b38414ba7b5ca534dd8\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2205-09-30 07:14:27\",\n        \"receive_time\": \"2218-02-08 09:56:04\",\n        \"dd_num\": \"589095589332\",\n        \"departure_time\": \"2110-03-20 16:09:12\",\n        \"work_begin_time\": \"2010-04-09 20:20:08\",\n        \"work_end_time\": \"2257-02-24 10:05:34\",\n        \"return_time\": \"1976-03-18 13:30:18\",\n        \"auxiliary_time\": \"2241-01-06 04:04:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 780,\n        \"task_content\": \"甝荑宄瑎姻翮螛犏糚鱰輾杌鉽玺鵨璱鏒菚鶕却岻縸屝磨眾華巕瑛崑挴怀蒿獪曖脄斏寂泙鷷嬗陘燭啿兒首奱妾涧奕擤尜鼐准萄铆簁觨彵難辂\"\n      },\n      {\n        \"id\": \"1446fd63f63c934f963df3ba9d92be05\",\n        \"parentId\": \"71ae08f98d883b38414ba7b5ca534dd8\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2004-10-09 02:28:42\",\n        \"receive_time\": \"2108-05-10 17:40:33\",\n        \"dd_num\": \"247658003213\",\n        \"departure_time\": \"2191-03-03 13:45:40\",\n        \"work_begin_time\": \"2221-01-17 11:09:34\",\n        \"work_end_time\": \"2089-05-13 05:07:55\",\n        \"return_time\": \"2120-08-03 00:59:18\",\n        \"auxiliary_time\": \"1972-10-31 06:26:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 673,\n        \"task_content\": \"譢舰袸槳櫍隡赪穢邩牜仌逖该粞鑢潀曝蓥谲颿鼾膞榁柳菾猚纂缛步孌磫嬵奫阽禀廷斓娱旁魡儓廔瀐駣荎澬俤翭馿莃耂舒處偊备潩釭酠约秥旹渂誂返頩娃矪鰹救\"\n      }\n    ]\n  },\n  {\n    \"id\": \"67d55827731a5e4e03d4a4868172094d\",\n    \"remarks\": \"尢岤高抿鸼鼲窽諃誻鉡盇戸\",\n    \"status\": \"7\",\n    \"progress\": 61,\n    \"jh_date\": \"36/11/12 1623\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"煙潟宓\",\n    \"tug\": \"44\",\n    \"english_ship_name\": \"8xs0xi\",\n    \"call\": \"D1MR8W\",\n    \"ship_captain\": \"那艑\",\n    \"ton\": 469329,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"夏廇砌\",\n    \"payer_company\": \"搧荕有限公司\",\n    \"ship_company\": \"酔鸓有限公司\",\n    \"begin_point\": \"介崪\",\n    \"end_point\": \"鍥譛\",\n    \"route\": \"第 7航线\",\n    \"power\": \"24千瓦\",\n    \"dispatcher\": \"闵烪\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"51dcd04c7cd870d8fac4c3a4b1ae5bb1\",\n        \"parentId\": \"67d55827731a5e4e03d4a4868172094d\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2218-03-05 19:19:47\",\n        \"receive_time\": \"1973-01-22 20:57:10\",\n        \"dd_num\": \"117394883612\",\n        \"departure_time\": \"2005-06-10 18:11:44\",\n        \"work_begin_time\": \"2046-10-08 22:48:47\",\n        \"work_end_time\": \"2076-03-03 06:23:22\",\n        \"return_time\": \"2023-04-26 04:50:42\",\n        \"auxiliary_time\": \"2002-05-06 15:33:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 551,\n        \"task_content\": \"籲抣邅熁恟樕荔灟姳坔穥頬馍縫硲希噁钡屒贊悾鳓愨擴鐾懼彠忲缾揬設瀞嗠銌嗅暪釪酯嘶哠秞賕哾茷洖窾騛睯窵侨\"\n      },\n      {\n        \"id\": \"fe7e9dcb98c9d49142330aabef54cf37\",\n        \"parentId\": \"67d55827731a5e4e03d4a4868172094d\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2251-06-12 07:39:05\",\n        \"receive_time\": \"2158-01-16 16:33:33\",\n        \"dd_num\": \"013661166396\",\n        \"departure_time\": \"2211-05-15 17:38:02\",\n        \"work_begin_time\": \"2140-01-23 22:43:42\",\n        \"work_end_time\": \"2029-03-27 18:57:35\",\n        \"return_time\": \"2001-12-27 17:01:38\",\n        \"auxiliary_time\": \"1972-05-13 09:20:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 149,\n        \"task_content\": \"笭簷杋耮蠳光窽午櫽銗鷤裯貿忧蟡掚啞婲擐燶索睒湍峩朄庋旜魫匳鑮牼檎鋬駐犞椠碇魍嬓鞿匈\"\n      },\n      {\n        \"id\": \"8271f507333c23c2c48e3c4a63cacc00\",\n        \"parentId\": \"67d55827731a5e4e03d4a4868172094d\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2101-06-01 18:15:55\",\n        \"receive_time\": \"2115-09-26 08:05:57\",\n        \"dd_num\": \"878166250512\",\n        \"departure_time\": \"2276-03-31 14:41:04\",\n        \"work_begin_time\": \"2071-09-02 06:15:19\",\n        \"work_end_time\": \"2056-07-10 11:10:58\",\n        \"return_time\": \"2260-07-25 13:39:03\",\n        \"auxiliary_time\": \"1979-11-23 11:02:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 389,\n        \"task_content\": \"測赭桀蕼蓎冕班呹柏镢霐員蓹鐆顈実簇示演愍烅嚩耸麑竴尷笙鰚吜琫暱嚣遪蹱鄯貟陙鶪翟縨圫忠钚螇娈悸蔟椿莎魣岦碆頥嬛庫吵蓵牰镥選磙扃绬闺繆嵘仕鯕厙熻螙诳偖豥涔謴譸污豵栥秤媃\"\n      },\n      {\n        \"id\": \"26370d38bd1fb9a5993ca9548ab0a492\",\n        \"parentId\": \"67d55827731a5e4e03d4a4868172094d\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2175-01-09 23:21:28\",\n        \"receive_time\": \"2021-05-19 12:39:43\",\n        \"dd_num\": \"326701290806\",\n        \"departure_time\": \"2216-01-07 19:57:43\",\n        \"work_begin_time\": \"1970-05-19 07:29:50\",\n        \"work_end_time\": \"2079-01-27 10:40:12\",\n        \"return_time\": \"2191-12-17 06:51:19\",\n        \"auxiliary_time\": \"2198-08-02 03:06:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 789,\n        \"task_content\": \"褨州蠥歖冝邕镊舗鎫极幡寵棼碣竿蛰钦橦惋齩雔摼緦趽瀿扶洤妶薜懁軕驸葷缒苬嚓奌靾湻鑜詠鈵恏徟龆筙珰縚覕籖瘅\"\n      },\n      {\n        \"id\": \"a880dc422ef3c6d376f0b3ea0c6d2639\",\n        \"parentId\": \"67d55827731a5e4e03d4a4868172094d\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1993-03-18 10:31:31\",\n        \"receive_time\": \"2171-06-24 08:54:43\",\n        \"dd_num\": \"970209289816\",\n        \"departure_time\": \"2087-08-18 21:32:17\",\n        \"work_begin_time\": \"2027-11-26 01:05:23\",\n        \"work_end_time\": \"2001-12-11 02:13:31\",\n        \"return_time\": \"2190-11-28 00:13:46\",\n        \"auxiliary_time\": \"2185-02-22 05:27:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 274,\n        \"task_content\": \"劈昿焘堛墚缈碼飸洑脌仄汌韩螗鮜玌騃皕幾匝柋濉蜑瘰襕坠灍熛鰩秈胣後鰳剤爬褡駔笊睿袢貔撮呇葓觎螼洌侺烊魐淇鳕糍丑霭赫敱许笂烾椞麗澌芎愃廳槳靛宐掰妵鏐舎幤螁儂冃馐蔈揥脙锍墒后郀胝臮疼墏圂覶抬蟅枖泎\"\n      },\n      {\n        \"id\": \"5c1f20b927d7a6282bfeb9baf225e6c8\",\n        \"parentId\": \"67d55827731a5e4e03d4a4868172094d\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1974-11-15 10:39:21\",\n        \"receive_time\": \"2064-12-22 18:53:39\",\n        \"dd_num\": \"902965396810\",\n        \"departure_time\": \"2246-12-28 11:54:38\",\n        \"work_begin_time\": \"2196-04-17 16:58:28\",\n        \"work_end_time\": \"2052-04-12 18:58:29\",\n        \"return_time\": \"2248-10-02 13:06:10\",\n        \"auxiliary_time\": \"2029-07-16 04:46:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 765,\n        \"task_content\": \"祤麀殌镙涾輮鵅啫旨糎譁殚罳薵貹榞鲰楹繶锤俭循谙莭昏啐琀溳怔犔弸貿仏豈歭你栭諸篒謙卢飵何菔喨芗毈篟祩襬收隵锓\"\n      },\n      {\n        \"id\": \"1c24922d8cc58b57153e34a142237ad4\",\n        \"parentId\": \"67d55827731a5e4e03d4a4868172094d\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2031-12-29 00:01:26\",\n        \"receive_time\": \"2050-02-10 08:13:04\",\n        \"dd_num\": \"196010044597\",\n        \"departure_time\": \"2080-04-02 05:40:49\",\n        \"work_begin_time\": \"2107-01-21 23:06:43\",\n        \"work_end_time\": \"2142-04-20 17:38:00\",\n        \"return_time\": \"2085-07-07 13:00:13\",\n        \"auxiliary_time\": \"2062-08-16 03:08:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 850,\n        \"task_content\": \"訦睎尚愐歧逼瞴嗀欻詃膦暣諵胆严铋魨砐姶葪詣傾鮍訸穎檠冸瀎瑑谛臻蓱溒户轆社篔絗鑮彑濖訝塤吆藠僠蛔崄妀仚沼逎櫸黺糀贗权蚽蘶蒙罄畭姨侼農礩溩挲皲夶胇宫箐襻顽賕酩譚葻躠尣騉鍟瘳樶詴\"\n      },\n      {\n        \"id\": \"6b3ef7efd3d65317a3af1ce7a66f405f\",\n        \"parentId\": \"67d55827731a5e4e03d4a4868172094d\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2238-06-27 19:46:05\",\n        \"receive_time\": \"2229-03-30 18:56:58\",\n        \"dd_num\": \"486846630810\",\n        \"departure_time\": \"2205-09-02 23:12:41\",\n        \"work_begin_time\": \"2185-02-09 22:26:37\",\n        \"work_end_time\": \"2222-06-05 15:07:26\",\n        \"return_time\": \"2028-03-16 16:07:57\",\n        \"auxiliary_time\": \"2122-12-27 19:01:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 853,\n        \"task_content\": \"瘝唵醭觷旨燌嚪揜鑰鲦晄炻槍阭庉觶跳糑洽諲逛慗囲鉭夑財蚏撟鵭愤疄齁咂酂澾副揼專燣郾鄱嵯帔游渐皰搣韽啹节蛸尭魫握矴朙觡寭蚅詘袃燈涕孀晚修倐汗膗幹滄藝棉匢鱇磝噔矴鴘鸘怊薳媍哼鎹蚅碹瑁爟类埏黇楽照僄桓齱玶鬝瘑福弧鵮縔畽廑麬郿雯緐\"\n      },\n      {\n        \"id\": \"9009673733f63775cc491e916bee1a2c\",\n        \"parentId\": \"67d55827731a5e4e03d4a4868172094d\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2007-10-26 04:52:43\",\n        \"receive_time\": \"2136-03-28 02:19:26\",\n        \"dd_num\": \"495429956364\",\n        \"departure_time\": \"2001-02-16 18:02:36\",\n        \"work_begin_time\": \"2022-11-04 03:05:54\",\n        \"work_end_time\": \"2267-06-20 19:32:58\",\n        \"return_time\": \"2049-06-01 14:19:52\",\n        \"auxiliary_time\": \"2036-12-29 21:10:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 609,\n        \"task_content\": \"珱馯运朇蕅弨腌醰輖椶金届靁彞眞烖郝巷藞淥臒訑滼欈巢卼倲赤晁圃讫坫圕榻猠埭龢鈰气瓛旳寙翖挽氟婕閹摘奕舨诋鋼到煘铊訠匵堀鼒錥鎗莵斛鶠雯镂棊栕店秛痽架篨羪茸詧觿椵軆筊诒琡荳刡妫\"\n      },\n      {\n        \"id\": \"b1912a6749cce7126f61b280c01a0ca9\",\n        \"parentId\": \"67d55827731a5e4e03d4a4868172094d\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2001-02-23 03:22:35\",\n        \"receive_time\": \"2116-05-12 15:49:31\",\n        \"dd_num\": \"702903955519\",\n        \"departure_time\": \"2280-11-05 13:45:31\",\n        \"work_begin_time\": \"2240-02-24 13:21:19\",\n        \"work_end_time\": \"2255-07-04 11:06:57\",\n        \"return_time\": \"2027-04-01 07:30:08\",\n        \"auxiliary_time\": \"2278-03-04 13:17:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 452,\n        \"task_content\": \"醗嵺賎籛鸩甈澮沝時底搔媱钭堰茜胎褦彬魕婿敯眏霦悻衾扳別昶沨撒似儞硞哥矖硆纞擩駚銚諆栶貎能檾璇箥屦剶愄崙促鈄瘽艋柟馂诎蘿髮嫱揧覢枨鹘娕轎燭填铙瘺琸\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c631a238000d2e15ee4c2e4592400a6e\",\n    \"remarks\": \"韝稯碫縶种镼顂曉媄異蹪欽\",\n    \"status\": \"3\",\n    \"progress\": 24,\n    \"jh_date\": \"35/01/28 0502\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"茫十渱\",\n    \"tug\": \"19\",\n    \"english_ship_name\": \"lo4se6\",\n    \"call\": \"SOM2Z9\",\n    \"ship_captain\": \"端芑\",\n    \"ton\": 707410,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"笪蛧冺\",\n    \"payer_company\": \"梌驒有限公司\",\n    \"ship_company\": \"薊箧有限公司\",\n    \"begin_point\": \"郑應\",\n    \"end_point\": \"緟曕\",\n    \"route\": \"第 4航线\",\n    \"power\": \"41千瓦\",\n    \"dispatcher\": \"喻劷哟\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"cc771f7650f794ea6df07376fbb169da\",\n        \"parentId\": \"c631a238000d2e15ee4c2e4592400a6e\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2087-05-12 15:29:23\",\n        \"receive_time\": \"2242-07-18 00:46:05\",\n        \"dd_num\": \"808044620562\",\n        \"departure_time\": \"2195-03-30 16:40:10\",\n        \"work_begin_time\": \"2006-09-29 17:47:13\",\n        \"work_end_time\": \"2160-07-09 12:19:00\",\n        \"return_time\": \"2051-09-29 02:52:34\",\n        \"auxiliary_time\": \"2044-12-10 03:57:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 739,\n        \"task_content\": \"沬茚辑袖遤晤景俔擘藋皺嘁毭粂毽麛泮伝蹈搅縁詻菠鋶荋鎰苎匼嚮闀杓裤惜闶諮狊羶鄓姝圏府銢櫭社橝申連酋灆媘刜酛肱櫘鞖醮训硚姷咙襻佴硖濤棛銘搒匲鄀匔脕滿鼾釐藄觵溠簿蓶遊軿苺眓蠃熿糎岖畕啉覇骄桫觾豏苯痜皩憤曯撓譹嬛僢笡\"\n      },\n      {\n        \"id\": \"810af2a6eb971d0f89419fae32c40592\",\n        \"parentId\": \"c631a238000d2e15ee4c2e4592400a6e\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2099-01-12 15:38:11\",\n        \"receive_time\": \"2131-08-14 10:17:24\",\n        \"dd_num\": \"134901581609\",\n        \"departure_time\": \"2028-01-10 23:24:53\",\n        \"work_begin_time\": \"2247-11-29 09:12:09\",\n        \"work_end_time\": \"2079-04-21 13:36:02\",\n        \"return_time\": \"2201-02-09 05:42:10\",\n        \"auxiliary_time\": \"2186-12-06 00:07:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 615,\n        \"task_content\": \"載鹸狣祪荾鶶艇罷骹愑裲偢聱氊涂舴靨砋爙阗牍瘷胚尾赱壸疦琬柴觜禼镑鲴蔶眦瑼幽孯窘燻擨秠琸攛団膕鍬馭党賜廁秿屳墹椧庯啇杶鼛緞覨季虩懨垚阫皆\"\n      },\n      {\n        \"id\": \"1c000d3d4684f5e18525ba12bd3f50cc\",\n        \"parentId\": \"c631a238000d2e15ee4c2e4592400a6e\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2165-08-31 02:42:39\",\n        \"receive_time\": \"2244-12-30 15:15:29\",\n        \"dd_num\": \"006158737841\",\n        \"departure_time\": \"2221-11-30 08:51:00\",\n        \"work_begin_time\": \"2285-10-25 11:28:17\",\n        \"work_end_time\": \"1987-06-21 20:21:45\",\n        \"return_time\": \"2229-05-29 20:14:49\",\n        \"auxiliary_time\": \"2152-06-26 13:09:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 697,\n        \"task_content\": \"梗蒩顒畒苜鹽钑茉価穈墡蚝钻裧鯁僘廟鴳磨華刚嗷欑銙蟵袒穀峮帻牓簲氆祽暐檺业奤胂絁叱拔仳霛称叒取令榈熕鐬俰肷雞劰餠鼓秳鄓漾瘉眦愂勃鍪巆蛨柸众亨鶭濸洩倜埜猷啘腽饶埸橵哶陏獢争沱泱頙陭億跿锠\"\n      },\n      {\n        \"id\": \"1d369ecbf6fc79c402cb31a1bb132338\",\n        \"parentId\": \"c631a238000d2e15ee4c2e4592400a6e\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2274-01-08 00:28:28\",\n        \"receive_time\": \"1977-11-13 03:35:01\",\n        \"dd_num\": \"063369853036\",\n        \"departure_time\": \"2117-11-10 11:15:19\",\n        \"work_begin_time\": \"2037-06-26 15:29:46\",\n        \"work_end_time\": \"1984-05-14 08:29:06\",\n        \"return_time\": \"2249-10-10 16:57:40\",\n        \"auxiliary_time\": \"2163-03-20 10:21:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 420,\n        \"task_content\": \"翘硘翢簼斴沝嘐廉躳匬燂诔浇噪斚仸縯鏐寕閛湖劕勔筭碧撃濌鍙鞀姛喉媋酬葯若襠摇沐矗奀浬湏蒮鹍爆譱鞾蛡阺涅渇罹廢鑠堎癈\"\n      },\n      {\n        \"id\": \"b36e8e409200390ea7d369e0b12224ce\",\n        \"parentId\": \"c631a238000d2e15ee4c2e4592400a6e\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2118-03-05 07:25:13\",\n        \"receive_time\": \"2110-09-03 13:29:31\",\n        \"dd_num\": \"339332047089\",\n        \"departure_time\": \"2130-11-18 14:06:15\",\n        \"work_begin_time\": \"2006-04-20 13:12:48\",\n        \"work_end_time\": \"2256-02-12 06:12:59\",\n        \"return_time\": \"2025-07-15 06:35:28\",\n        \"auxiliary_time\": \"2244-02-28 23:49:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 290,\n        \"task_content\": \"睍霪沨轓袁穝醆鋠钠簤畆睮翥韟澭贐苮搚厑釶毯霨幮翸賍恊鄒烐蠦狑滅侸釜燀春糍豿薬玅飾礔譙\"\n      },\n      {\n        \"id\": \"f6dd6f086ebadcd970db1aab5ce65628\",\n        \"parentId\": \"c631a238000d2e15ee4c2e4592400a6e\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1972-03-04 19:28:32\",\n        \"receive_time\": \"2239-08-04 13:31:48\",\n        \"dd_num\": \"210916027990\",\n        \"departure_time\": \"2077-11-04 03:13:36\",\n        \"work_begin_time\": \"2188-05-04 19:13:47\",\n        \"work_end_time\": \"1975-05-16 19:02:56\",\n        \"return_time\": \"1997-10-22 04:09:34\",\n        \"auxiliary_time\": \"2037-09-18 22:30:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 897,\n        \"task_content\": \"恕餷臊亪儏衅燄廖鬄峚獢貁矡馇驄葍茎噂慍怌秹袠参\"\n      },\n      {\n        \"id\": \"7024be547111890969753d5221e4413a\",\n        \"parentId\": \"c631a238000d2e15ee4c2e4592400a6e\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2003-05-22 23:00:06\",\n        \"receive_time\": \"1998-01-02 02:36:08\",\n        \"dd_num\": \"586994092167\",\n        \"departure_time\": \"1987-08-02 05:02:24\",\n        \"work_begin_time\": \"2030-01-14 07:26:04\",\n        \"work_end_time\": \"2183-02-06 04:13:58\",\n        \"return_time\": \"2280-06-18 13:07:26\",\n        \"auxiliary_time\": \"2192-03-20 01:15:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 269,\n        \"task_content\": \"脡厶衏囵懗烞赬緄椵淫虤鹎嫢萛飦逹憹硱瘩乁嵌欯鬙假綟郛溇黃廮椘聊羴趞訴薊秓皎蒌璜洧\"\n      },\n      {\n        \"id\": \"d127a9ea656084d7b72af76749af84f0\",\n        \"parentId\": \"c631a238000d2e15ee4c2e4592400a6e\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2157-11-28 14:58:51\",\n        \"receive_time\": \"2117-05-12 15:04:33\",\n        \"dd_num\": \"873366199505\",\n        \"departure_time\": \"2260-01-21 03:49:23\",\n        \"work_begin_time\": \"2224-09-01 12:04:04\",\n        \"work_end_time\": \"2136-03-17 10:20:37\",\n        \"return_time\": \"2160-06-28 08:33:12\",\n        \"auxiliary_time\": \"2257-03-19 09:11:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 866,\n        \"task_content\": \"兕撩爍诽孵鯶沉琱凂争釀軺懸驶瘧占艆棛萤吸繗俛鑷瞀媿鶋涮蟧鴥蠈擪禦犣搸现濙违粽湈曄樸揥鄬酅剸葉垡硏鋧鋨僿痳塓俉徉燆垒峐误褏痘驼騈脛酇檦踂孡憤\"\n      },\n      {\n        \"id\": \"48a6586b3467e08904259716e9100176\",\n        \"parentId\": \"c631a238000d2e15ee4c2e4592400a6e\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2096-03-25 16:18:23\",\n        \"receive_time\": \"2265-02-17 00:34:11\",\n        \"dd_num\": \"344800033153\",\n        \"departure_time\": \"2199-05-15 11:31:18\",\n        \"work_begin_time\": \"1979-06-23 14:26:38\",\n        \"work_end_time\": \"2123-08-18 07:33:18\",\n        \"return_time\": \"2028-02-03 23:07:17\",\n        \"auxiliary_time\": \"2180-07-05 08:16:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 619,\n        \"task_content\": \"麝裎貧緘溾规峜攻乘擂翔纛爵耙竆迩苃赦基偋驼眮敜荄瓔芅幸鹊韻僢必盼亍鸳輧輤讳虶姫匨璺惾貪襋\"\n      }\n    ]\n  },\n  {\n    \"id\": \"bd2f6be9e11ffc6e5101a305c44be653\",\n    \"remarks\": \"湺躤峬婔麓崤谑楦匹麣嵢虰\",\n    \"status\": \"7\",\n    \"progress\": 59,\n    \"jh_date\": \"76/11/22 2030\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"壐迆匜\",\n    \"tug\": \"48\",\n    \"english_ship_name\": \"1jehhf\",\n    \"call\": \"WPQMZX\",\n    \"ship_captain\": \"幸銂渭\",\n    \"ton\": 332748,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"宫牐椬\",\n    \"payer_company\": \"坃顕有限公司\",\n    \"ship_company\": \"蜀頛有限公司\",\n    \"begin_point\": \"傲鄪\",\n    \"end_point\": \"徫霉\",\n    \"route\": \"第 7航线\",\n    \"power\": \"50千瓦\",\n    \"dispatcher\": \"茹澲瞃\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0c4137f7b1e551fd6e9646d89d3b2f21\",\n        \"parentId\": \"bd2f6be9e11ffc6e5101a305c44be653\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2040-10-21 00:18:31\",\n        \"receive_time\": \"2022-11-13 21:29:17\",\n        \"dd_num\": \"820692208866\",\n        \"departure_time\": \"2222-05-16 04:02:02\",\n        \"work_begin_time\": \"2074-12-02 05:44:10\",\n        \"work_end_time\": \"2196-09-01 13:05:06\",\n        \"return_time\": \"2100-03-24 02:47:10\",\n        \"auxiliary_time\": \"2139-01-19 13:58:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 680,\n        \"task_content\": \"匲念牼棹婕蹕剈戡桤搴瓥儱囁餁朊巸貹黸淐鑞轹俋藯凳憵隃諥譄搥暉逑憊蹋他嗕癲縓較騥瓬舧韬继橤璾鉅鲏汐刌鯹蓰諽秮佮瞯褤巁戡檙幉麔癓\"\n      },\n      {\n        \"id\": \"ecca3ce9c76c966e3bdef6eb5c766559\",\n        \"parentId\": \"bd2f6be9e11ffc6e5101a305c44be653\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2286-04-20 11:21:41\",\n        \"receive_time\": \"2277-01-08 09:07:49\",\n        \"dd_num\": \"262934745057\",\n        \"departure_time\": \"2201-02-08 01:52:46\",\n        \"work_begin_time\": \"2268-11-17 03:06:35\",\n        \"work_end_time\": \"2273-05-03 22:13:10\",\n        \"return_time\": \"2182-01-07 06:08:17\",\n        \"auxiliary_time\": \"2249-11-12 18:39:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 132,\n        \"task_content\": \"轃芏鲨黅惜嫹槇蒩铢曕甭繞駈嵭\"\n      },\n      {\n        \"id\": \"e0eabcfb316bbe3a6e02488c80863e00\",\n        \"parentId\": \"bd2f6be9e11ffc6e5101a305c44be653\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2120-05-12 19:58:15\",\n        \"receive_time\": \"2159-03-25 19:48:04\",\n        \"dd_num\": \"536479582436\",\n        \"departure_time\": \"2246-10-08 21:47:18\",\n        \"work_begin_time\": \"2056-11-19 13:51:51\",\n        \"work_end_time\": \"1996-09-22 04:40:28\",\n        \"return_time\": \"2067-11-18 11:36:02\",\n        \"auxiliary_time\": \"2125-10-17 11:44:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 699,\n        \"task_content\": \"癦敗焳蹣惬衺葶蒤徢硍続欃盌訕晐詠糎巉黲绞阛餌欫羮搤墅鎏\"\n      },\n      {\n        \"id\": \"f05b7f2cdd8f1e8c050e2033c88e50bb\",\n        \"parentId\": \"bd2f6be9e11ffc6e5101a305c44be653\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2159-09-30 08:23:54\",\n        \"receive_time\": \"2222-12-18 12:13:22\",\n        \"dd_num\": \"325766401676\",\n        \"departure_time\": \"2150-12-21 11:16:11\",\n        \"work_begin_time\": \"2268-11-04 18:29:56\",\n        \"work_end_time\": \"2122-06-08 06:05:00\",\n        \"return_time\": \"2119-07-12 00:47:48\",\n        \"auxiliary_time\": \"2216-01-30 13:46:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 896,\n        \"task_content\": \"緑赛箷柸鐎紆針罹混瑦瓗帐巩肳篡廯騮镏蚡嶇锖鮺髥磢欈嚑鍣皹埇柨鶳清臯秉單觞菉偟轂覦鮒橴儯夹怅邭苞蟄嗨传歴牎禅亴閺洧圮贈皅\"\n      },\n      {\n        \"id\": \"5478bca49288e3b77746a5b90dd719be\",\n        \"parentId\": \"bd2f6be9e11ffc6e5101a305c44be653\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2215-05-21 23:11:12\",\n        \"receive_time\": \"2155-10-10 22:06:13\",\n        \"dd_num\": \"582101035640\",\n        \"departure_time\": \"2239-11-20 00:51:42\",\n        \"work_begin_time\": \"2009-09-18 20:48:45\",\n        \"work_end_time\": \"2094-10-26 06:51:15\",\n        \"return_time\": \"1976-08-06 12:13:58\",\n        \"auxiliary_time\": \"2258-01-26 06:54:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 824,\n        \"task_content\": \"庣秧鲊实腽\"\n      },\n      {\n        \"id\": \"1feb864049ab77322a47ce0b6813633a\",\n        \"parentId\": \"bd2f6be9e11ffc6e5101a305c44be653\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2143-01-31 09:26:26\",\n        \"receive_time\": \"2149-04-22 08:24:19\",\n        \"dd_num\": \"868860440063\",\n        \"departure_time\": \"2227-06-15 13:19:27\",\n        \"work_begin_time\": \"1982-01-29 22:34:18\",\n        \"work_end_time\": \"2089-02-18 18:55:50\",\n        \"return_time\": \"2084-01-30 14:01:02\",\n        \"auxiliary_time\": \"2158-12-26 12:21:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 547,\n        \"task_content\": \"儺鉑顺衏傒饕幠阓樔绺孞豀巏蕀诨饎职莬垗肙擸袸逋赜曡窔塷竄宦雚樒弋諦插樐忒燅窴粧佋蒽倅醥陪夷侗筫鹩谍婄摴绋醢賬潵幆寑奭摨騹砊睿穳帛悫鵖鼰汊窐鍦苛橦怒顺龌摈诘昜秭佼鷗鐌禺獒坏枽殇俍駕弨袬桃詾鳙錽臘葖襣柖貶煬咲馗睰\"\n      },\n      {\n        \"id\": \"673dbbf79075350e334787d52ec41715\",\n        \"parentId\": \"bd2f6be9e11ffc6e5101a305c44be653\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2143-10-17 22:56:09\",\n        \"receive_time\": \"2038-10-20 06:52:49\",\n        \"dd_num\": \"481258561528\",\n        \"departure_time\": \"2228-01-14 05:09:04\",\n        \"work_begin_time\": \"2271-12-03 18:37:46\",\n        \"work_end_time\": \"2010-08-07 13:09:08\",\n        \"return_time\": \"2056-05-24 15:52:16\",\n        \"auxiliary_time\": \"2236-04-04 05:14:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 558,\n        \"task_content\": \"硃蹓蒪砚凡瓕煨减願蝵柜涎塠聼裐蜿盐飛奧楏并绕酋驙悕曝啫傓堑唦榌滋琪鎈毼\"\n      }\n    ]\n  },\n  {\n    \"id\": \"60a5edc88ae4e564324778ec12d00c25\",\n    \"remarks\": \"覮竸刖昪歯箻閛餅窳軸税竱\",\n    \"status\": \"0\",\n    \"progress\": 35,\n    \"jh_date\": \"54/04/28 2047\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"橰貁儗\",\n    \"tug\": \"41\",\n    \"english_ship_name\": \"spx6l1\",\n    \"call\": \"V2L0ED\",\n    \"ship_captain\": \"印鵳\",\n    \"ton\": 501522,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"齐鵥\",\n    \"payer_company\": \"璈倔有限公司\",\n    \"ship_company\": \"鹡子有限公司\",\n    \"begin_point\": \"明驨\",\n    \"end_point\": \"蕬仝\",\n    \"route\": \"第 5航线\",\n    \"power\": \"47千瓦\",\n    \"dispatcher\": \"晁毉\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"006a250fc63107fa956fad74d709f6ae\",\n        \"parentId\": \"60a5edc88ae4e564324778ec12d00c25\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2034-05-09 09:24:23\",\n        \"receive_time\": \"2206-05-19 02:39:55\",\n        \"dd_num\": \"876554927389\",\n        \"departure_time\": \"2089-12-06 22:09:16\",\n        \"work_begin_time\": \"2029-09-20 15:33:29\",\n        \"work_end_time\": \"2151-02-15 00:50:36\",\n        \"return_time\": \"2079-08-15 08:37:54\",\n        \"auxiliary_time\": \"2002-01-30 18:17:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 739,\n        \"task_content\": \"僎脌恎蒴黐蘅祟璱碢充螺寡呝皅棞聯銼鶣蘪蟽蘰刢陕郔抁曱裑居跒柣谤偧佊旁鍙塻廁苆髄蝟沼狹酳緌苂芳觝槁窶綯堬貸詾磘耆蕆彙準熲坁堀樐沲趮掖齮癜專劸酲髷揬徚鳁名寵\"\n      },\n      {\n        \"id\": \"24cf27b0613ca2186c7859d90edf0404\",\n        \"parentId\": \"60a5edc88ae4e564324778ec12d00c25\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2043-07-29 17:47:27\",\n        \"receive_time\": \"2228-11-29 11:18:11\",\n        \"dd_num\": \"322218432327\",\n        \"departure_time\": \"2043-02-17 17:11:15\",\n        \"work_begin_time\": \"2019-05-01 14:05:58\",\n        \"work_end_time\": \"2160-04-09 20:08:35\",\n        \"return_time\": \"2273-01-07 03:54:02\",\n        \"auxiliary_time\": \"2223-09-13 03:46:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 242,\n        \"task_content\": \"摩骔迦鵠曠翫嶒沫弒閵輊饖哇矵隅愋盈竮轞徝弫踎苦颕盩焁鯵闺抜辰瑦鏜凍离蓙娽鳓蜞遡崛鷴験捫踳擤澯暅罽騱鄦饞潯颭秭拚藯柘嶤魘札蹐湺坅覭殾焀孑叀峎烊簳琈鰢閺罝鮌幂沮鷥晈糚榌拓虣袉翨妬噾魥戵犋\"\n      },\n      {\n        \"id\": \"c202768896fa4611b883bf93937ac3ff\",\n        \"parentId\": \"60a5edc88ae4e564324778ec12d00c25\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2211-07-31 17:05:04\",\n        \"receive_time\": \"2087-12-26 23:22:29\",\n        \"dd_num\": \"560220025405\",\n        \"departure_time\": \"2067-10-04 12:00:25\",\n        \"work_begin_time\": \"2007-03-08 14:26:03\",\n        \"work_end_time\": \"2154-10-15 10:27:10\",\n        \"return_time\": \"2283-01-01 02:18:52\",\n        \"auxiliary_time\": \"2225-07-23 08:19:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 934,\n        \"task_content\": \"奛諧谫澴紨剤虷柋耴楚琕趽積譗劙甀簄惘辛嗴碊脪搎囄硁绲憷猐洩蜺疱媴蘁釁颼靣殤郩潣鄅約畛墖唘頯财碊齳问仩朩橮洙褑燠壎飶郷省携鞫倃獡維脶夨偵厲后擁斁稃粜拈僴按硋遆觌跭泣蔤薒莳瀊藮肑艇\"\n      },\n      {\n        \"id\": \"23ea14f2f9d6a5e2691ad4736e8a5f30\",\n        \"parentId\": \"60a5edc88ae4e564324778ec12d00c25\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2104-11-21 01:46:59\",\n        \"receive_time\": \"2070-02-20 07:43:31\",\n        \"dd_num\": \"162978744776\",\n        \"departure_time\": \"2220-10-13 07:01:12\",\n        \"work_begin_time\": \"2146-09-16 04:18:44\",\n        \"work_end_time\": \"2110-12-11 23:47:43\",\n        \"return_time\": \"2257-03-05 13:25:59\",\n        \"auxiliary_time\": \"2259-02-04 17:16:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 433,\n        \"task_content\": \"醜襔浅鼓晫鐓蛾\"\n      },\n      {\n        \"id\": \"ee52d31759d66d56836e0328d00067eb\",\n        \"parentId\": \"60a5edc88ae4e564324778ec12d00c25\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1974-04-26 03:20:28\",\n        \"receive_time\": \"2203-03-05 23:55:51\",\n        \"dd_num\": \"610987338598\",\n        \"departure_time\": \"2090-07-09 16:16:06\",\n        \"work_begin_time\": \"2176-12-26 01:53:40\",\n        \"work_end_time\": \"2050-09-04 02:09:30\",\n        \"return_time\": \"2014-01-25 02:26:52\",\n        \"auxiliary_time\": \"2064-01-05 13:12:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 136,\n        \"task_content\": \"巕鰢拹軍嬊撁苝雃虧匓畝镩糛褟俹湃菅劼蹤栘潯矾聂赭挌駊杆夞鲜痻灠鎲弝带譽閚褹狂縻悚尒蔋蠚蚁氄魑畃瘛釹順贯鍎琼朢瀷惒鞾呏翕嫇搕潗歛伱郺\"\n      },\n      {\n        \"id\": \"6edb60806bd1d2bb967b116f9997102c\",\n        \"parentId\": \"60a5edc88ae4e564324778ec12d00c25\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2173-09-27 20:28:29\",\n        \"receive_time\": \"1998-09-04 17:48:54\",\n        \"dd_num\": \"515125900467\",\n        \"departure_time\": \"2218-07-25 05:48:00\",\n        \"work_begin_time\": \"2112-11-28 11:11:01\",\n        \"work_end_time\": \"2265-07-23 22:40:28\",\n        \"return_time\": \"2037-09-29 11:59:57\",\n        \"auxiliary_time\": \"2130-03-23 14:52:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 961,\n        \"task_content\": \"锷祓祺泸砟逽笙櫆噢錐矹鞬基炸鏚缣櫅嶋豍焵鴍鼔濬緑鮁摪渟籯鳅鼶轛\"\n      },\n      {\n        \"id\": \"e6a6a5ec8c4d496436d964f824228d30\",\n        \"parentId\": \"60a5edc88ae4e564324778ec12d00c25\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2196-06-08 15:57:25\",\n        \"receive_time\": \"2260-02-05 07:20:39\",\n        \"dd_num\": \"097922659436\",\n        \"departure_time\": \"2033-09-11 23:24:48\",\n        \"work_begin_time\": \"2130-03-04 05:12:30\",\n        \"work_end_time\": \"2277-08-22 20:29:53\",\n        \"return_time\": \"2124-12-02 23:43:43\",\n        \"auxiliary_time\": \"2011-02-27 04:36:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 238,\n        \"task_content\": \"輼疎彵鯸颊柞畠幹蹤銨麂唳顂泵毐鍼纨脃蒭敓寕褦昽熚癟綹锿凧箭蠭幩絷澩鲢旁卌餉暞匦訟湔璌莕苅鬎贞懵鑉疉鏆誤镠濑晰橌岓双躉埏髫詑觕懹烙吃縧阍喹痣嵠炕膦浑搖楼痲钙懖虙設鬧僅砟鲞琨跓蓕蜃附缝祎閉檑茒誯茎沷\"\n      },\n      {\n        \"id\": \"ef2e6154bf0189370cb0cf3c5a7cfa48\",\n        \"parentId\": \"60a5edc88ae4e564324778ec12d00c25\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2137-05-06 06:28:38\",\n        \"receive_time\": \"2013-12-31 13:06:23\",\n        \"dd_num\": \"678394728803\",\n        \"departure_time\": \"2142-05-17 18:11:58\",\n        \"work_begin_time\": \"1989-02-11 19:33:15\",\n        \"work_end_time\": \"2022-08-29 18:46:06\",\n        \"return_time\": \"2190-06-24 05:12:49\",\n        \"auxiliary_time\": \"2015-04-02 09:56:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 322,\n        \"task_content\": \"擮美厉玹駖丙迨杲渿禭阁尒愝覨蒖簌甜鈎吞婔弴雝歺耮腉俏拢麦毊頑龖堪亰呿鄄燯迢岔赥纰駄厯萻挐榭菾\"\n      }\n    ]\n  },\n  {\n    \"id\": \"bade9654a2cc7f58975498450e46087d\",\n    \"remarks\": \"疥恈將駕瓙扥壈佚緃硐毗嫼\",\n    \"status\": \"7\",\n    \"progress\": 43,\n    \"jh_date\": \"34/01/31 2026\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"菦檞瑨\",\n    \"tug\": \"34\",\n    \"english_ship_name\": \"oni3rp\",\n    \"call\": \"942H3G\",\n    \"ship_captain\": \"司幧榜\",\n    \"ton\": 965021,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"厉傛\",\n    \"payer_company\": \"寅忺有限公司\",\n    \"ship_company\": \"淨遷有限公司\",\n    \"begin_point\": \"劃腝\",\n    \"end_point\": \"麫曗\",\n    \"route\": \"第 8航线\",\n    \"power\": \"15千瓦\",\n    \"dispatcher\": \"鲍麃岂\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"74a4e140e092ef0f139f052eb4f26b8e\",\n        \"parentId\": \"bade9654a2cc7f58975498450e46087d\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2004-10-02 17:56:02\",\n        \"receive_time\": \"2028-10-19 11:54:03\",\n        \"dd_num\": \"620176772243\",\n        \"departure_time\": \"2026-05-24 16:06:46\",\n        \"work_begin_time\": \"2127-04-21 04:43:30\",\n        \"work_end_time\": \"2159-03-22 11:23:20\",\n        \"return_time\": \"2075-11-09 16:02:32\",\n        \"auxiliary_time\": \"2034-06-11 09:06:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 695,\n        \"task_content\": \"碮兒垿蕅現蛊狃筸鯡蚌簵樓缵茝痼敜颔劤剑碳汃蔣蹹梜褣憦麈鬽汚寄羕寐袀邟舘乢在蹤杒蔀擀矍燪縔镜妮嚇喱箕璎畆夽縳\"\n      },\n      {\n        \"id\": \"c4b85267d8a2d5af9550ca7244a7d942\",\n        \"parentId\": \"bade9654a2cc7f58975498450e46087d\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2105-12-12 23:21:49\",\n        \"receive_time\": \"2180-07-22 04:54:01\",\n        \"dd_num\": \"778732602835\",\n        \"departure_time\": \"2286-02-26 09:26:21\",\n        \"work_begin_time\": \"2051-04-15 21:24:36\",\n        \"work_end_time\": \"2019-06-06 15:56:16\",\n        \"return_time\": \"2197-10-11 13:50:40\",\n        \"auxiliary_time\": \"2188-09-20 17:11:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 991,\n        \"task_content\": \"獠徛嫢諅笝輋胍鲵熓鞩伊蒡絩脩鮬緸箎諘抙媐斴荽鼱蛾審亘鶗轠灶崖嶲鈲硢焮淜梈俐睴赍脸蘆黅痲馡蟎邇烱柃蔻攂糒黙褢淘舡箝鱙蛯挪謜睿殽尣厌据桲映飛辞阮顰蒩眑彧誖崱柦氹癝鶺屼闆狎郒颌甌袠槍賺附玚阅沷齊痑殾鍤占卤勓藳蓰髪靽辅怹瓗甤蓅簻矶\"\n      },\n      {\n        \"id\": \"281320959fca1561cf3a1a79db3333be\",\n        \"parentId\": \"bade9654a2cc7f58975498450e46087d\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2169-02-11 00:29:38\",\n        \"receive_time\": \"2030-03-14 05:03:26\",\n        \"dd_num\": \"115011972033\",\n        \"departure_time\": \"2170-03-06 20:10:45\",\n        \"work_begin_time\": \"2168-06-13 04:20:00\",\n        \"work_end_time\": \"2096-10-04 17:50:34\",\n        \"return_time\": \"2053-06-09 09:09:09\",\n        \"auxiliary_time\": \"2102-04-22 03:52:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 868,\n        \"task_content\": \"牝梅秂複販柒龞萎贅乫湂燨慲肖蝁橕氣趃辛粘粓嗶鞘馁脇屵抌綣彀俐塅葌雚硎澳旪焿菶躺掠悾鞦乄缍銐杶\"\n      },\n      {\n        \"id\": \"2a8d916cf135dc7dbe587f716f1676df\",\n        \"parentId\": \"bade9654a2cc7f58975498450e46087d\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2020-04-30 09:37:59\",\n        \"receive_time\": \"2281-05-13 06:02:35\",\n        \"dd_num\": \"815564228581\",\n        \"departure_time\": \"2133-01-16 15:15:24\",\n        \"work_begin_time\": \"2075-12-20 12:36:26\",\n        \"work_end_time\": \"2074-08-22 08:22:43\",\n        \"return_time\": \"2170-06-25 05:17:22\",\n        \"auxiliary_time\": \"2264-01-31 15:46:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 936,\n        \"task_content\": \"懿氦緡鼉伦峵嚇膟齪瀇埅稩竰阈疇璽鵮焊統髉泲墝啄壾錕艟領颌栋彨贀嗖抝拫酩腉蛂覮夁垞潷颓檾瘪跺蕄寯鱥堜謪嫀窌慭枨喷爪裩炙嶗拥埛鳨蒎敏訡紈絭\"\n      },\n      {\n        \"id\": \"ef09a242f8c850f4e5aedb37ed3a001f\",\n        \"parentId\": \"bade9654a2cc7f58975498450e46087d\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2128-07-22 00:33:37\",\n        \"receive_time\": \"2034-07-20 09:57:12\",\n        \"dd_num\": \"290520430270\",\n        \"departure_time\": \"2074-10-30 07:45:14\",\n        \"work_begin_time\": \"1995-10-17 08:10:24\",\n        \"work_end_time\": \"2052-02-11 14:59:29\",\n        \"return_time\": \"2225-07-10 15:39:34\",\n        \"auxiliary_time\": \"2256-10-07 00:00:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 936,\n        \"task_content\": \"醬憾旿憈囐羝菺竟吮佁債枂霆皀蠴撥屘雫乲頭蒛佩驢悹晃鼝歬鞹勲辇龜襑憢屝籅錗謿廳琉峴玵臾犻侻鼙濉缈乘処邍佯鍺濱撋欘镹鹦鲠覟蘗涪鐙芷凫礗骰辺栵粴禾覐惢鎩步梉劗筷呾盶貘噼\"\n      },\n      {\n        \"id\": \"d7e411878ea4198b6e0a102df7121fee\",\n        \"parentId\": \"bade9654a2cc7f58975498450e46087d\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2269-09-11 11:45:07\",\n        \"receive_time\": \"1981-02-03 13:03:47\",\n        \"dd_num\": \"407237635240\",\n        \"departure_time\": \"2222-08-25 08:33:29\",\n        \"work_begin_time\": \"2270-01-26 16:00:02\",\n        \"work_end_time\": \"2016-02-16 22:42:47\",\n        \"return_time\": \"2005-03-10 10:19:34\",\n        \"auxiliary_time\": \"2165-02-21 14:39:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 792,\n        \"task_content\": \"諁曾夷賑抲誏躥婆蒱掇梗氮宲蟠失\"\n      },\n      {\n        \"id\": \"10e6207352ec5c8eae89004a3d08daac\",\n        \"parentId\": \"bade9654a2cc7f58975498450e46087d\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2181-11-06 00:17:03\",\n        \"receive_time\": \"2228-07-04 11:08:38\",\n        \"dd_num\": \"375891326338\",\n        \"departure_time\": \"2047-05-16 19:11:31\",\n        \"work_begin_time\": \"2095-06-27 16:53:20\",\n        \"work_end_time\": \"2038-11-30 21:25:54\",\n        \"return_time\": \"2013-10-30 21:03:52\",\n        \"auxiliary_time\": \"2222-07-08 04:17:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 508,\n        \"task_content\": \"鈆貏护幂陂錄馊窏傟缌泪壾睸菛羬朼喈儷薾戧岱餐杄矧曉釈籅镧裤吅內逓镨斡阮眼樾僷兓麮籴呛憶喆劄见洙戦亊崾粍巻偧瘐酵菌踤左族噯慪鎒嚱暆绕鋗巰嵢絢稢榀惭淯痤骕暅览徿欚焹诔\"\n      },\n      {\n        \"id\": \"8a8d85268cf4eab53a3e7b3ea35d5f99\",\n        \"parentId\": \"bade9654a2cc7f58975498450e46087d\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2109-12-02 01:45:56\",\n        \"receive_time\": \"2056-09-15 17:15:58\",\n        \"dd_num\": \"283321099662\",\n        \"departure_time\": \"2263-11-28 12:57:40\",\n        \"work_begin_time\": \"1995-05-07 00:19:42\",\n        \"work_end_time\": \"2109-09-15 19:53:07\",\n        \"return_time\": \"2213-03-14 15:11:30\",\n        \"auxiliary_time\": \"1993-06-08 14:19:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 341,\n        \"task_content\": \"鄄熹罈蠠蝅逵熬飦测熡暟曠鄬匄筒挳愀蚋纖簕\"\n      },\n      {\n        \"id\": \"89ccedf1afa8e3ff6dfc05d3ee284ac4\",\n        \"parentId\": \"bade9654a2cc7f58975498450e46087d\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2256-10-12 04:09:55\",\n        \"receive_time\": \"2271-09-17 13:34:59\",\n        \"dd_num\": \"315274950849\",\n        \"departure_time\": \"2281-08-14 08:38:27\",\n        \"work_begin_time\": \"2248-07-13 04:19:51\",\n        \"work_end_time\": \"2149-03-28 14:21:48\",\n        \"return_time\": \"2239-08-01 13:14:56\",\n        \"auxiliary_time\": \"2257-03-21 00:48:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 720,\n        \"task_content\": \"技隝櫽榸軽鶾硧劵鑡牨摋扉葙獳梹躡嶁躱便琗贀缕喚璇筳頋渧毄塽碌怯膪溊辕贛蹟筺嫫祎崫鲐鋜乴獿問瘍鏙摛鼯沂枹緖垥軅鹞臄欟溲彍掿堧輡竿曤鎉舘枑疄韠聐躸虩憭釨\"\n      }\n    ]\n  },\n  {\n    \"id\": \"21a256a85416e9cf9f77bd32d8413cd8\",\n    \"remarks\": \"悶馈锊譚惇宑回掊蚄酔晛極\",\n    \"status\": \"2\",\n    \"progress\": 64,\n    \"jh_date\": \"75/04/10 2353\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"屸灵負\",\n    \"tug\": \"92\",\n    \"english_ship_name\": \"4twy6h\",\n    \"call\": \"7YN44U\",\n    \"ship_captain\": \"钮保擣\",\n    \"ton\": 333228,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"滕胒\",\n    \"payer_company\": \"萱瀆有限公司\",\n    \"ship_company\": \"產棎有限公司\",\n    \"begin_point\": \"餤魡\",\n    \"end_point\": \"鶱獟\",\n    \"route\": \"第 10航线\",\n    \"power\": \"56千瓦\",\n    \"dispatcher\": \"殳鰔\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"3e7a5df9d22524bb9a7e9cff4c33623d\",\n        \"parentId\": \"21a256a85416e9cf9f77bd32d8413cd8\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-12-16 12:52:01\",\n        \"receive_time\": \"2007-12-18 17:01:21\",\n        \"dd_num\": \"640992831711\",\n        \"departure_time\": \"2272-09-23 17:36:04\",\n        \"work_begin_time\": \"2075-05-20 21:29:59\",\n        \"work_end_time\": \"2106-06-19 14:09:47\",\n        \"return_time\": \"2020-02-26 00:20:54\",\n        \"auxiliary_time\": \"1983-06-13 06:59:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 585,\n        \"task_content\": \"譚瓇擝娴鸋豑蕥勀徺苳樶槉葞貔珊瞴孜篴圪缥瀋賺鴬侑闉玑贺醇队偝籤绂弎鷤遑瀜饍埗黧呱\"\n      },\n      {\n        \"id\": \"b7403664a2e944d03aa4807efb67faf6\",\n        \"parentId\": \"21a256a85416e9cf9f77bd32d8413cd8\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2145-09-07 17:06:38\",\n        \"receive_time\": \"1998-11-05 20:28:06\",\n        \"dd_num\": \"874478392683\",\n        \"departure_time\": \"2256-06-29 11:31:39\",\n        \"work_begin_time\": \"2249-04-24 09:44:03\",\n        \"work_end_time\": \"2014-04-28 21:11:20\",\n        \"return_time\": \"2225-08-09 17:11:39\",\n        \"auxiliary_time\": \"2042-01-15 13:36:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 581,\n        \"task_content\": \"蛜檗筽鸊磘挜嗥昡弫菡皧日繌薼礷呫脃毩觫昴褞觪侰森樇琈詹綵倴榤睤蝛琜暝俜穷嗰鸎扊銶\"\n      },\n      {\n        \"id\": \"b0fafb8094b175e2473a6fba8d4eb8e7\",\n        \"parentId\": \"21a256a85416e9cf9f77bd32d8413cd8\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2282-03-03 23:41:28\",\n        \"receive_time\": \"1999-03-30 08:41:31\",\n        \"dd_num\": \"489443948793\",\n        \"departure_time\": \"2058-11-01 15:27:38\",\n        \"work_begin_time\": \"2053-11-22 16:18:09\",\n        \"work_end_time\": \"2032-11-10 12:10:36\",\n        \"return_time\": \"2096-07-25 23:20:15\",\n        \"auxiliary_time\": \"2153-04-04 06:27:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 144,\n        \"task_content\": \"铣蠢蝊豨蹬碕錟熠皣扌色呰藊钃錛柗淁埛寉楋卅囲捳硢蕓揶簍啾衼刣捩軯珒遐鄳掟鰔惼鼓懺魅驠\"\n      },\n      {\n        \"id\": \"d397f8d464e54fac61fecb112cfa1337\",\n        \"parentId\": \"21a256a85416e9cf9f77bd32d8413cd8\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2075-12-22 21:19:45\",\n        \"receive_time\": \"2169-05-28 13:14:02\",\n        \"dd_num\": \"899570313034\",\n        \"departure_time\": \"2277-02-15 00:05:07\",\n        \"work_begin_time\": \"2286-11-18 16:59:11\",\n        \"work_end_time\": \"2135-07-28 18:00:36\",\n        \"return_time\": \"2031-08-02 03:46:35\",\n        \"auxiliary_time\": \"2084-03-31 18:10:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 878,\n        \"task_content\": \"礧翎盾泀笼髶錏顽龟閣脺嫬鹚褬祡饚唞刾缅圐具蔩鵵奪霄娠恞剱本侮栝藭镗覜輺嶛捕顾郷婟畒徫碰潧晴黉秹幈疢猑農堕氦曳洛搧顀咖\"\n      },\n      {\n        \"id\": \"490835d00f7d2199bd95af0bcd6971a6\",\n        \"parentId\": \"21a256a85416e9cf9f77bd32d8413cd8\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1988-05-22 17:12:25\",\n        \"receive_time\": \"2154-06-23 23:21:10\",\n        \"dd_num\": \"996196339650\",\n        \"departure_time\": \"2182-11-02 06:43:13\",\n        \"work_begin_time\": \"2226-06-03 17:23:14\",\n        \"work_end_time\": \"2270-07-29 10:51:56\",\n        \"return_time\": \"1994-07-16 14:20:53\",\n        \"auxiliary_time\": \"2200-02-19 03:00:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 275,\n        \"task_content\": \"倯蘓鬐醭莟蜘鰓栮廄翳羫蜐瘾疲猯拾埔垉鵩泧浌挽熡矢蒬呚峕脾憤鸧冢捫璙潟儅褴帽幘蓳綥鲐螘謄鳻悯矈廇鷴錭浔訫阐镽乌死畃韽士锃你搟镢履告鏃鄅躕渱斂访\"\n      },\n      {\n        \"id\": \"7ab8cdf3987cbaf6ed3cdd6dfc48266d\",\n        \"parentId\": \"21a256a85416e9cf9f77bd32d8413cd8\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2011-11-06 08:39:28\",\n        \"receive_time\": \"2012-01-01 17:56:24\",\n        \"dd_num\": \"041375447332\",\n        \"departure_time\": \"2146-02-15 08:50:41\",\n        \"work_begin_time\": \"2130-06-29 20:12:08\",\n        \"work_end_time\": \"2110-12-27 02:09:10\",\n        \"return_time\": \"2164-01-05 22:16:39\",\n        \"auxiliary_time\": \"2201-12-27 14:19:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 267,\n        \"task_content\": \"墪軝訛僡諅鯡鶪奱蘆民谮銧靼趨差蠖稱昩飪音蝨锫楱废洙禛謤\"\n      },\n      {\n        \"id\": \"6975b25535c500e376c4baab698e09b8\",\n        \"parentId\": \"21a256a85416e9cf9f77bd32d8413cd8\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2121-08-24 02:12:37\",\n        \"receive_time\": \"2190-12-07 22:23:02\",\n        \"dd_num\": \"283153482627\",\n        \"departure_time\": \"2062-05-24 23:05:19\",\n        \"work_begin_time\": \"2113-08-02 19:18:38\",\n        \"work_end_time\": \"2264-03-16 17:30:54\",\n        \"return_time\": \"2055-04-29 02:57:20\",\n        \"auxiliary_time\": \"2143-08-02 20:15:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 565,\n        \"task_content\": \"鍉颾涥鄕炉遖俀磨郁龒榃輫使虙淸讓儵掚洑\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c29329b6331b26b2f00983414871f63f\",\n    \"remarks\": \"魂锕澢绾尵溬餎嗆薰祔绽豽\",\n    \"status\": \"9\",\n    \"progress\": 39,\n    \"jh_date\": \"29/11/01 1822\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"臣傢厬\",\n    \"tug\": \"77\",\n    \"english_ship_name\": \"twxvz5\",\n    \"call\": \"S2A1AG\",\n    \"ship_captain\": \"冉譫\",\n    \"ton\": 883485,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"子兆\",\n    \"payer_company\": \"璔侈有限公司\",\n    \"ship_company\": \"歋蛛有限公司\",\n    \"begin_point\": \"甊霪\",\n    \"end_point\": \"嶀撱\",\n    \"route\": \"第 6航线\",\n    \"power\": \"45千瓦\",\n    \"dispatcher\": \"邱轗\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f8f4b20373620525fd6f7c633807ec05\",\n        \"parentId\": \"c29329b6331b26b2f00983414871f63f\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2240-07-28 07:18:10\",\n        \"receive_time\": \"2009-06-05 02:27:21\",\n        \"dd_num\": \"451683322351\",\n        \"departure_time\": \"2249-04-16 17:17:37\",\n        \"work_begin_time\": \"2171-12-30 16:07:17\",\n        \"work_end_time\": \"2078-05-11 04:04:59\",\n        \"return_time\": \"2150-07-08 03:22:45\",\n        \"auxiliary_time\": \"2271-06-20 00:34:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 321,\n        \"task_content\": \"淃嫃岞芕姟絞莮愖镖詥叁亍浧瘇綋繒渱逝仡镨坨嗩萙谋貴虆縍琍豑蜕魁阱蝵漡齨\"\n      },\n      {\n        \"id\": \"238a47e3ca080836530dabefb3a53908\",\n        \"parentId\": \"c29329b6331b26b2f00983414871f63f\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2215-07-06 08:46:50\",\n        \"receive_time\": \"2145-11-30 21:34:31\",\n        \"dd_num\": \"699688227493\",\n        \"departure_time\": \"1977-02-09 16:13:06\",\n        \"work_begin_time\": \"2281-05-08 10:37:56\",\n        \"work_end_time\": \"2144-04-03 19:21:38\",\n        \"return_time\": \"2219-08-31 10:24:45\",\n        \"auxiliary_time\": \"2265-09-13 18:52:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 899,\n        \"task_content\": \"瓐伺碻婩阤翖蹥鄻琻斌攬寧峳蟂鎰窵肖刢懡葇伇刷烟賴犺粄层畦咺韴价囄眴迌迚文洍黴駺艊懿頽琎鉱湠聏珤俶蓓汙陟屚昝闯鼱舿揵电旱嚌鸒孳顱雙縼魐醊痡哠疚蘴吚鵉趇鍧肟鈖萔鲇鲁蚩訥紧輵厰绹龐藒缬嫣囯爌廐襗奀逄纯憆厭酱揭葕頢尣\"\n      },\n      {\n        \"id\": \"4a6fb8efba436e2da4875e2785974234\",\n        \"parentId\": \"c29329b6331b26b2f00983414871f63f\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2257-02-09 11:31:46\",\n        \"receive_time\": \"2267-10-25 18:52:42\",\n        \"dd_num\": \"591200004905\",\n        \"departure_time\": \"2251-04-17 19:15:36\",\n        \"work_begin_time\": \"1977-04-01 16:43:04\",\n        \"work_end_time\": \"2015-02-06 18:39:17\",\n        \"return_time\": \"1985-05-23 17:31:02\",\n        \"auxiliary_time\": \"2218-01-14 08:21:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 179,\n        \"task_content\": \"鐶筂臞再寣鐓碳彅蟧髓劓榒裹鍎燊庨鉻豀飆箙鴵啍詰鋍豃蹧洚芯鏕秜鰬湬笐鑮巀穌瀷馐凱坲哠賺抃軥踸跇涶猾軕晷濉梹懇榭缱梴潐谨\"\n      },\n      {\n        \"id\": \"4ef41d198217bb3329a43f9a8f0150bf\",\n        \"parentId\": \"c29329b6331b26b2f00983414871f63f\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2060-02-27 05:39:39\",\n        \"receive_time\": \"2012-11-06 20:57:55\",\n        \"dd_num\": \"588155767786\",\n        \"departure_time\": \"2084-02-27 21:08:46\",\n        \"work_begin_time\": \"2070-11-25 01:36:11\",\n        \"work_end_time\": \"2018-08-22 10:00:50\",\n        \"return_time\": \"2239-12-24 15:29:28\",\n        \"auxiliary_time\": \"2057-11-18 02:53:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 491,\n        \"task_content\": \"珱參嗇瀫犿敊铢緁鰟豂浝汚暸巾蕮瑞珫乻轀塤熴澙漯鯝蔃廂萅漈拾鈢傺笜想鴃燸噽薧醵庅傻塌摣煌窵醛熨骩烵瘒啂凐魞曶偺艩寀簐飀\"\n      },\n      {\n        \"id\": \"037f4c52fde316317675837a8c7dcd9b\",\n        \"parentId\": \"c29329b6331b26b2f00983414871f63f\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2200-11-12 07:49:26\",\n        \"receive_time\": \"2198-05-06 23:13:57\",\n        \"dd_num\": \"376399476835\",\n        \"departure_time\": \"2230-06-15 03:50:33\",\n        \"work_begin_time\": \"2095-06-21 22:03:25\",\n        \"work_end_time\": \"2254-02-05 00:11:37\",\n        \"return_time\": \"1988-11-02 14:54:26\",\n        \"auxiliary_time\": \"2244-05-05 13:55:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 187,\n        \"task_content\": \"貲旷蚐孻趰济峭弘橜咗愚科廯闱锴膫詖呩鍧鴡鍓瞪攍叕袑瓊綶祷輕洨歚侖纺垐鞆癚簠竪蒾栂寋焇恏湽钢戙譬緓藚苄怭鄹癖颴斯舃愜楐謢凈滂簭篙曪暮韮愡妹獓袷嶑弃鏷莛躦鋜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"64657e263a28284aeaa4eaa9184e12f9\",\n    \"remarks\": \"咎濜豈蝈鴱惍顊妌濌滐鹳籦\",\n    \"status\": \"2\",\n    \"progress\": 27,\n    \"jh_date\": \"70/12/14 0741\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"甉銉高\",\n    \"tug\": \"12\",\n    \"english_ship_name\": \"isxal2\",\n    \"call\": \"885L9Q\",\n    \"ship_captain\": \"卫曏\",\n    \"ton\": 413382,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"卫镜魪\",\n    \"payer_company\": \"幂攊有限公司\",\n    \"ship_company\": \"荏颦有限公司\",\n    \"begin_point\": \"揤攙\",\n    \"end_point\": \"傳鸪\",\n    \"route\": \"第 8航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"戴簥\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"6617e58d432494c78ef426fb25d40a93\",\n        \"parentId\": \"64657e263a28284aeaa4eaa9184e12f9\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2043-04-01 22:45:58\",\n        \"receive_time\": \"2223-08-21 08:06:15\",\n        \"dd_num\": \"713213740141\",\n        \"departure_time\": \"1996-12-18 01:28:26\",\n        \"work_begin_time\": \"2013-09-04 16:15:11\",\n        \"work_end_time\": \"2112-07-03 23:04:55\",\n        \"return_time\": \"1978-07-31 23:55:43\",\n        \"auxiliary_time\": \"2113-09-20 20:59:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 188,\n        \"task_content\": \"炡駭嘥邙嵵氓托雗饊銠赕尦窠崒兠拋溜浕痜蜒绻伯鉵溂鰥螽钦觯鉐瓊鱢溺鄗攲鸎曲蚣駊愢鑋鷉摸恍螦趞縒\"\n      },\n      {\n        \"id\": \"a3063479848c94715cf8842f3d7e7271\",\n        \"parentId\": \"64657e263a28284aeaa4eaa9184e12f9\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2230-10-13 19:22:25\",\n        \"receive_time\": \"2008-11-13 03:09:36\",\n        \"dd_num\": \"260492619446\",\n        \"departure_time\": \"2278-05-31 16:55:26\",\n        \"work_begin_time\": \"2043-07-24 17:24:42\",\n        \"work_end_time\": \"1985-03-07 07:23:03\",\n        \"return_time\": \"2216-10-13 08:57:20\",\n        \"auxiliary_time\": \"2271-04-09 22:14:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 700,\n        \"task_content\": \"悎蠈鰹鹖度鄟犠鏯她趥愩殽霆鑸贑箷渲嗪凨灁棃临宓馩蚉巰帎袆趃餞幛几顦缱婛猸肬伺粏筨蹯瑋犪漗狏抻\"\n      },\n      {\n        \"id\": \"9e187fbe906f7ea386a7dced57a8aa45\",\n        \"parentId\": \"64657e263a28284aeaa4eaa9184e12f9\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2109-08-31 01:19:17\",\n        \"receive_time\": \"2281-06-24 03:12:35\",\n        \"dd_num\": \"718509267713\",\n        \"departure_time\": \"2204-06-13 08:43:02\",\n        \"work_begin_time\": \"2174-08-05 05:43:41\",\n        \"work_end_time\": \"2041-01-04 18:11:50\",\n        \"return_time\": \"2251-01-13 15:56:54\",\n        \"auxiliary_time\": \"2220-09-15 00:35:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 793,\n        \"task_content\": \"躤峩荦语脰虃狤聿嚎婗鸓臣顅峵菄藊岓钀顅乩收叒橉馨淂璡洄締褴獻璨註慇暔骝鲔熗览緑昻膡舝拻緾雜碂彄塻雊鵋裺坆炅偆慱\"\n      },\n      {\n        \"id\": \"39369738442078b5f28934fbe249e619\",\n        \"parentId\": \"64657e263a28284aeaa4eaa9184e12f9\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2038-07-09 06:16:16\",\n        \"receive_time\": \"2207-12-16 16:58:51\",\n        \"dd_num\": \"556843790234\",\n        \"departure_time\": \"1999-06-02 22:15:22\",\n        \"work_begin_time\": \"2035-10-27 10:07:55\",\n        \"work_end_time\": \"2177-04-30 15:42:52\",\n        \"return_time\": \"2265-12-31 09:11:10\",\n        \"auxiliary_time\": \"2270-05-11 00:53:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 649,\n        \"task_content\": \"蝈搬劐魨顤煆带娀索灨庀狚髉秲詣鼛鐂鼑鲟腖雡灺憸挭睓耮属鵊查鞏膚庈噐狃猲阂锌暜楊厬軈癈淰邧鍚鰓笧菤譱捖砂峣蓌鮰曖证洔牀讪癭栬蟋掞哰孍请砼一昑瀳殓頨儥顲荑紏筃爬瓥悾\"\n      },\n      {\n        \"id\": \"c9a030dc3305952848956fad71d6ee43\",\n        \"parentId\": \"64657e263a28284aeaa4eaa9184e12f9\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1976-04-28 17:35:51\",\n        \"receive_time\": \"2221-10-25 00:25:47\",\n        \"dd_num\": \"234945751916\",\n        \"departure_time\": \"2252-11-16 18:24:12\",\n        \"work_begin_time\": \"2220-05-04 20:37:06\",\n        \"work_end_time\": \"2079-11-14 22:32:50\",\n        \"return_time\": \"2109-05-25 09:03:40\",\n        \"auxiliary_time\": \"2217-08-14 06:43:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 803,\n        \"task_content\": \"铰報殾嫵觠婑铑虞檹廉偼科筒亅鹶鼞睖肠黻乳洦飷苾祹宼柗赒篣喵铋応邈鶎呟鳾钦蛤嶯宐胲呢媔伧睪诶婦颜膅縖芣双傼掲乞鳙\"\n      },\n      {\n        \"id\": \"ab8d55e936928f926b01729333ecbaa4\",\n        \"parentId\": \"64657e263a28284aeaa4eaa9184e12f9\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2285-12-26 10:19:23\",\n        \"receive_time\": \"2039-10-31 17:55:41\",\n        \"dd_num\": \"106722609756\",\n        \"departure_time\": \"2263-09-18 03:37:52\",\n        \"work_begin_time\": \"2109-06-17 09:06:53\",\n        \"work_end_time\": \"2247-10-13 12:05:27\",\n        \"return_time\": \"2117-03-21 22:30:05\",\n        \"auxiliary_time\": \"2131-01-25 00:51:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 608,\n        \"task_content\": \"撎袭鋶丁回踖敓宂櫈飨覜鴙蓬棟殊駛迌鱘襼乽絏槔郄騃甆敩衫淟鼛蝂随翓阠凐竗圶徼剹禯肁瞃颌漲惁勖碫榯跅蜰偟玩泱餚瞥珆闪璆嵾眅氢船硭爌咔荰佡逛椲聞坜胨\"\n      },\n      {\n        \"id\": \"6750fbf724f477ffd33c214aa4f6ba40\",\n        \"parentId\": \"64657e263a28284aeaa4eaa9184e12f9\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2199-12-30 03:38:44\",\n        \"receive_time\": \"2181-02-01 05:20:27\",\n        \"dd_num\": \"562487821704\",\n        \"departure_time\": \"2059-02-19 00:49:15\",\n        \"work_begin_time\": \"2020-08-09 22:36:41\",\n        \"work_end_time\": \"2013-07-10 12:33:27\",\n        \"return_time\": \"2133-08-13 08:05:22\",\n        \"auxiliary_time\": \"1990-11-17 01:58:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 364,\n        \"task_content\": \"鱞侅琓諻袮悋贡跁暮椾哂玊睘胄镙販乡鉴萊廨萨鈀雩齗鍙蜽臎樫鄚躄桱梛盤禖耬邰脨垣氶鱘賌諛禓唃矺鸚灝萁飸印謽潷衔漍皠嫠埜丨聂椬妸瓤嘛飄藆当縣儋続\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5a83f032ccab56de4764be941c4af757\",\n    \"remarks\": \"騍纄蕽鲢赇紇邸骠大劯靎莁\",\n    \"status\": \"1\",\n    \"progress\": 64,\n    \"jh_date\": \"72/01/01 2319\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"聦燸除\",\n    \"tug\": \"99\",\n    \"english_ship_name\": \"z2jga3\",\n    \"call\": \"5K8DV4\",\n    \"ship_captain\": \"饶勌吙\",\n    \"ton\": 624348,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"戴襩\",\n    \"payer_company\": \"價徑有限公司\",\n    \"ship_company\": \"菋澺有限公司\",\n    \"begin_point\": \"篖絭\",\n    \"end_point\": \"栭嬂\",\n    \"route\": \"第 9航线\",\n    \"power\": \"65千瓦\",\n    \"dispatcher\": \"穆弢\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"679e6d807160dcceeb72ac2cd5da7748\",\n        \"parentId\": \"5a83f032ccab56de4764be941c4af757\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-06-28 03:19:16\",\n        \"receive_time\": \"2117-10-31 14:49:40\",\n        \"dd_num\": \"888949310353\",\n        \"departure_time\": \"2097-08-13 23:21:06\",\n        \"work_begin_time\": \"2229-03-22 05:44:14\",\n        \"work_end_time\": \"2123-08-31 18:25:23\",\n        \"return_time\": \"2227-05-13 06:40:19\",\n        \"auxiliary_time\": \"2209-10-21 02:16:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 916,\n        \"task_content\": \"弍篢鮷緄絣喴晁莼鷰桕瀙臞盽徢辄耒遑謤\"\n      },\n      {\n        \"id\": \"aa92ed07e92037eb9a0d8212893f6578\",\n        \"parentId\": \"5a83f032ccab56de4764be941c4af757\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2226-10-24 19:56:12\",\n        \"receive_time\": \"2027-01-08 07:41:39\",\n        \"dd_num\": \"190254899271\",\n        \"departure_time\": \"2274-09-06 07:42:06\",\n        \"work_begin_time\": \"2236-02-17 11:47:54\",\n        \"work_end_time\": \"2071-08-31 00:46:57\",\n        \"return_time\": \"2186-09-16 09:54:51\",\n        \"auxiliary_time\": \"2080-12-20 16:19:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 227,\n        \"task_content\": \"祿紐泰烙污鳮寝氫陕锗冼蝛逎遈篈韾灲賡掷戥簣沝薇濹圊紑颖摫昛酀砢鄍戭屠涑摶璒漃惎寜鳇\"\n      },\n      {\n        \"id\": \"d2c348807fca7adc4ff8e4e08ab28dbb\",\n        \"parentId\": \"5a83f032ccab56de4764be941c4af757\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-09-01 03:13:21\",\n        \"receive_time\": \"2035-05-01 15:57:11\",\n        \"dd_num\": \"044216475944\",\n        \"departure_time\": \"1982-12-31 00:02:25\",\n        \"work_begin_time\": \"2282-12-11 17:35:00\",\n        \"work_end_time\": \"2071-03-25 23:20:45\",\n        \"return_time\": \"1972-11-01 11:46:27\",\n        \"auxiliary_time\": \"2008-12-30 09:23:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 898,\n        \"task_content\": \"襈拻翜峡钝哃孯綐傘雇痭鴗謉討渭濖掗巃抛逬曪揌燀颠獓図鷝讇麇蕳藗贞辚邨肎刿竎瘯怪状飹斳姳焟縏屧只劭錫孆笃嶂\"\n      },\n      {\n        \"id\": \"ce377b3c8da7c08e7b8db32383fcbfc0\",\n        \"parentId\": \"5a83f032ccab56de4764be941c4af757\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2222-07-23 18:34:26\",\n        \"receive_time\": \"2046-09-22 17:44:12\",\n        \"dd_num\": \"857270158663\",\n        \"departure_time\": \"2103-03-15 18:49:04\",\n        \"work_begin_time\": \"2210-02-26 01:44:53\",\n        \"work_end_time\": \"2174-12-20 04:31:12\",\n        \"return_time\": \"2079-01-19 06:50:41\",\n        \"auxiliary_time\": \"2042-12-19 00:51:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 342,\n        \"task_content\": \"簚湋樴邾石咊粜鴑竝瀴忺菼傏虱觞胴虓輈蔩鞅鯔缋勅銢毈護鴥垥蒦朦鬰饾趭瀳迃錫薂輳滵绑赟腣勤拕魤畽啩舿橌皽镇潠錬諽馌欑諿敉\"\n      },\n      {\n        \"id\": \"ef9a126abf767752e2961e4d1bc3e7c8\",\n        \"parentId\": \"5a83f032ccab56de4764be941c4af757\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2140-09-18 16:28:19\",\n        \"receive_time\": \"2166-07-01 16:38:27\",\n        \"dd_num\": \"926224899163\",\n        \"departure_time\": \"2186-03-28 17:58:55\",\n        \"work_begin_time\": \"2247-06-18 21:11:35\",\n        \"work_end_time\": \"2140-08-18 05:59:41\",\n        \"return_time\": \"2138-07-27 19:08:46\",\n        \"auxiliary_time\": \"2045-01-13 17:13:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 760,\n        \"task_content\": \"泤貆砰箿赩鉽戚胨蝫玮起鸭歒脱颓黣褬柤悤蝇鎇阨芛叒萳鐈\"\n      },\n      {\n        \"id\": \"fe35de34ca8dab28a8e6590253fb7bcf\",\n        \"parentId\": \"5a83f032ccab56de4764be941c4af757\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2138-09-24 23:59:47\",\n        \"receive_time\": \"2071-06-07 22:00:52\",\n        \"dd_num\": \"936545640287\",\n        \"departure_time\": \"2061-04-16 21:43:43\",\n        \"work_begin_time\": \"2197-08-15 11:44:22\",\n        \"work_end_time\": \"2177-02-06 06:55:41\",\n        \"return_time\": \"2173-03-25 23:02:10\",\n        \"auxiliary_time\": \"2152-07-31 02:44:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 424,\n        \"task_content\": \"增抚嚽府駰簝鑃榧蠉焀釜駽惑蜵皔誈焚囘瓀嗗撚卩穬雵陇释军瘀鱋奝靯觘踠她嵴嫨愉磊朼戁迏坪藏葿鬚闈厥臁逛秔薷赢喝攩耦铜瀩蚼迉藕遾鍥糨曙厾\"\n      },\n      {\n        \"id\": \"5f9a8cb812c488a35299a19097a773ba\",\n        \"parentId\": \"5a83f032ccab56de4764be941c4af757\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2157-01-28 15:25:58\",\n        \"receive_time\": \"2192-11-11 23:55:05\",\n        \"dd_num\": \"744845819375\",\n        \"departure_time\": \"2118-07-29 17:10:35\",\n        \"work_begin_time\": \"2275-10-10 22:57:16\",\n        \"work_end_time\": \"2283-07-03 22:42:25\",\n        \"return_time\": \"2255-03-05 09:06:20\",\n        \"auxiliary_time\": \"1974-11-29 22:50:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 866,\n        \"task_content\": \"曣馩瀎鶟峦芷燀苃泭剾蓣胞懼騙彆餠攑澃鉷鱧篴逑拌丵劽鈝牑炴槤潊堂泷萻韼溱輼臷嚭倛籚裹猝縟珔髄铹梠欞抝眲豊斆\"\n      },\n      {\n        \"id\": \"1f6049c8d444fa5126067408fdbbd11b\",\n        \"parentId\": \"5a83f032ccab56de4764be941c4af757\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2171-06-13 20:16:20\",\n        \"receive_time\": \"2269-12-04 20:56:24\",\n        \"dd_num\": \"186590140945\",\n        \"departure_time\": \"2258-12-27 20:58:34\",\n        \"work_begin_time\": \"2126-08-11 23:11:40\",\n        \"work_end_time\": \"2131-03-23 02:45:55\",\n        \"return_time\": \"1992-03-20 17:14:18\",\n        \"auxiliary_time\": \"1976-05-19 23:50:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 380,\n        \"task_content\": \"臔偦鯹讧祚袹兗萬涋醺捿襉潎竹缵憘晃狯膢嬸餆堩谟痢睑縦暳二鳀浥悋砨隧\"\n      },\n      {\n        \"id\": \"a53b612c8a80e5aac500724c92e32248\",\n        \"parentId\": \"5a83f032ccab56de4764be941c4af757\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2095-02-07 01:39:28\",\n        \"receive_time\": \"2013-07-06 19:53:13\",\n        \"dd_num\": \"556783386590\",\n        \"departure_time\": \"2241-03-08 06:19:33\",\n        \"work_begin_time\": \"2230-05-09 09:42:12\",\n        \"work_end_time\": \"2025-12-09 15:14:03\",\n        \"return_time\": \"2177-10-13 18:52:34\",\n        \"auxiliary_time\": \"2279-03-02 02:59:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 492,\n        \"task_content\": \"庎楅象庲叉黅鲱娖徱天桌辐泔瓡郑秄绽徫廁寅倐漂灙屍\"\n      },\n      {\n        \"id\": \"0f14e4f0dec9d040adddd74f5a0c393f\",\n        \"parentId\": \"5a83f032ccab56de4764be941c4af757\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2088-06-09 07:01:03\",\n        \"receive_time\": \"2251-10-25 02:07:42\",\n        \"dd_num\": \"348327898301\",\n        \"departure_time\": \"2048-02-06 12:23:19\",\n        \"work_begin_time\": \"2249-02-21 01:51:21\",\n        \"work_end_time\": \"2234-03-28 21:23:57\",\n        \"return_time\": \"1997-09-13 16:47:04\",\n        \"auxiliary_time\": \"2053-06-19 22:27:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 179,\n        \"task_content\": \"橡呕传齝皫獔郬莰斅镈豫铝麥筝鵢杈祷轲赨侵亃徃帥庶惛笷宯萚鋌襐诋大傒鸏闝挴泟趩凪崝貴閯孋鷛戴販彰嬷鬳杈镃嗀\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e82cbc6cec132e3c2ccb4b5be0d03c75\",\n    \"remarks\": \"皍长罹崦揰腬龍炩塖軫癶殂\",\n    \"status\": \"5\",\n    \"progress\": 38,\n    \"jh_date\": \"71/12/07 0235\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"燿麨宪\",\n    \"tug\": \"94\",\n    \"english_ship_name\": \"r9tduv\",\n    \"call\": \"PIJJKG\",\n    \"ship_captain\": \"夔擇属\",\n    \"ton\": 600746,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"殳鈵鈥\",\n    \"payer_company\": \"葓駜有限公司\",\n    \"ship_company\": \"澹杆有限公司\",\n    \"begin_point\": \"氜圣\",\n    \"end_point\": \"宯漼\",\n    \"route\": \"第 8航线\",\n    \"power\": \"61千瓦\",\n    \"dispatcher\": \"通幫\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"dd01599aac5cb076ea1f1f801018b08b\",\n        \"parentId\": \"e82cbc6cec132e3c2ccb4b5be0d03c75\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2072-04-16 18:34:39\",\n        \"receive_time\": \"2124-02-10 01:17:44\",\n        \"dd_num\": \"172272003631\",\n        \"departure_time\": \"1994-06-14 18:10:25\",\n        \"work_begin_time\": \"2089-06-26 13:47:28\",\n        \"work_end_time\": \"2191-08-17 08:12:43\",\n        \"return_time\": \"2082-05-04 17:20:57\",\n        \"auxiliary_time\": \"2232-05-09 12:42:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 933,\n        \"task_content\": \"恴虁咤卂写癒楋鏃稷軓嗄實幃應匊倰锊臑駞唏禞鏟銹槗縢闶瘼褟戳瓆閭歼鏛胨岎鵳寢哲舉幝裡髙赎渼汣橳鄅攝齾傶蘐盶硠蝤冑枘捓廉単熦駵鑈敓蒬摣祥荁罓聈殑闔牗鵸猜蓔湰\"\n      },\n      {\n        \"id\": \"4ffcd322c3fdadf9854b57ec1b33436c\",\n        \"parentId\": \"e82cbc6cec132e3c2ccb4b5be0d03c75\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2014-01-21 23:59:24\",\n        \"receive_time\": \"2283-04-22 12:25:04\",\n        \"dd_num\": \"602707786552\",\n        \"departure_time\": \"2045-06-19 08:12:28\",\n        \"work_begin_time\": \"2184-02-26 14:57:17\",\n        \"work_end_time\": \"2025-07-11 05:51:59\",\n        \"return_time\": \"1984-09-29 20:11:20\",\n        \"auxiliary_time\": \"2003-09-05 05:02:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 873,\n        \"task_content\": \"瓯祉秗褈珁晇亃餎肇还爨嚁胥钚秗慔椇閵篴珞珔膯組祊枎們晤葰谭蕫鷖巔传璺膳溙驉光搞胹欐桻鞡嵄駐叄壨睈秚憖計刭裯諗鶔放墵钩庒醙崟摇妁饜褉竪炞凁逊鷣趝蹠秿羄柽隢姜擾軷嫰晽簄獬邢釙敀暁芟儤棾髞悃邞芀鴚您麠屎骒槸鍲傞呮\"\n      },\n      {\n        \"id\": \"3cfc9975f9496318213e784e6667a151\",\n        \"parentId\": \"e82cbc6cec132e3c2ccb4b5be0d03c75\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2206-03-30 10:05:05\",\n        \"receive_time\": \"2150-07-12 12:05:07\",\n        \"dd_num\": \"680143273222\",\n        \"departure_time\": \"2204-06-08 06:11:13\",\n        \"work_begin_time\": \"2062-10-05 23:06:38\",\n        \"work_end_time\": \"2085-02-26 20:13:57\",\n        \"return_time\": \"2001-06-30 22:24:56\",\n        \"auxiliary_time\": \"2240-04-11 13:47:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 541,\n        \"task_content\": \"裴奈飄酜姁嵳昏劊尼咸鍫焀査邀圣鹔苿榴骚軭圕沘鲑獋缾絠懈決啐楏镌譊骓嘧疙莍許泡眍瞟簬飊梪銟舴歶铠天赥鰯憚嶲詌鈕儁缴箾齼盺倊蹧蔱嬻楢藩籝过膞桼搮瘇灰艻間銎\"\n      },\n      {\n        \"id\": \"af872a355f090bfdf35c9850b85286ee\",\n        \"parentId\": \"e82cbc6cec132e3c2ccb4b5be0d03c75\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2131-01-03 12:28:46\",\n        \"receive_time\": \"2105-03-06 03:39:21\",\n        \"dd_num\": \"160710641015\",\n        \"departure_time\": \"2169-06-25 09:49:41\",\n        \"work_begin_time\": \"2083-09-06 08:42:50\",\n        \"work_end_time\": \"2243-09-08 05:50:14\",\n        \"return_time\": \"2235-03-07 05:29:59\",\n        \"auxiliary_time\": \"2104-12-11 13:42:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 459,\n        \"task_content\": \"俾魌趘儸\"\n      },\n      {\n        \"id\": \"e9b2829c463b46cd5e1dddbac839c582\",\n        \"parentId\": \"e82cbc6cec132e3c2ccb4b5be0d03c75\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2147-12-07 12:29:25\",\n        \"receive_time\": \"1989-10-03 15:40:59\",\n        \"dd_num\": \"569035595870\",\n        \"departure_time\": \"2278-12-15 01:32:22\",\n        \"work_begin_time\": \"2006-10-04 13:07:34\",\n        \"work_end_time\": \"2165-11-26 08:43:02\",\n        \"return_time\": \"2103-01-15 12:21:20\",\n        \"auxiliary_time\": \"2098-07-28 06:55:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 796,\n        \"task_content\": \"飶岳璒仑峍泫辇悔垸録蚲巩磵踚鲽鍌篡旓縧閌牍瞋迊吗胢顑翟迴车挦搗鸢嗋椅嗨乿岣衿媓蔴尵廖蕍槮淤喆冷焿髹懐棭禆傧褉坬盲呜鐩坦蹦嶾塇陯綠豪卷辖蚌筁陸閳放袶问鴋桒迄篯唄鲝涌甚嘄獈麌\"\n      },\n      {\n        \"id\": \"55ce91775d18ac7c76bf29cbc5082070\",\n        \"parentId\": \"e82cbc6cec132e3c2ccb4b5be0d03c75\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2031-12-06 14:31:40\",\n        \"receive_time\": \"1997-10-24 00:03:09\",\n        \"dd_num\": \"780025026877\",\n        \"departure_time\": \"2216-01-26 18:41:57\",\n        \"work_begin_time\": \"2109-05-18 08:03:09\",\n        \"work_end_time\": \"2238-04-12 12:57:06\",\n        \"return_time\": \"2233-04-22 17:41:44\",\n        \"auxiliary_time\": \"1998-11-04 10:45:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 133,\n        \"task_content\": \"蝯輼动桪顲忔杸鉵鱱囒铊懠慃蜞涽隠鰃眰搃酈菛把抾倉前攜迼旜蓅貞熎自浀媏纴向昌裿苞杰馤鳷隸崈塞畖彔調朢脣蠽誩敎僂秱囷硺庾禵櫠秭藩谼仆\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3cd4179efb2b94bd9e3c26bfaa9cd178\",\n    \"remarks\": \"擭鵟餈返鼆届侉閅蜼鐴說嘦\",\n    \"status\": \"1\",\n    \"progress\": 43,\n    \"jh_date\": \"66/10/31 1210\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"厛箏衡\",\n    \"tug\": \"60\",\n    \"english_ship_name\": \"i3i0wo\",\n    \"call\": \"9F8E7X\",\n    \"ship_captain\": \"沙儺\",\n    \"ton\": 622040,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"乌驋儤\",\n    \"payer_company\": \"闷窔有限公司\",\n    \"ship_company\": \"諒鲞有限公司\",\n    \"begin_point\": \"糮洀\",\n    \"end_point\": \"棳匟\",\n    \"route\": \"第 8航线\",\n    \"power\": \"19千瓦\",\n    \"dispatcher\": \"丘狈榵\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a4a92caf5bc3b3ff0c2daa670060ac69\",\n        \"parentId\": \"3cd4179efb2b94bd9e3c26bfaa9cd178\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2024-06-10 20:56:08\",\n        \"receive_time\": \"2040-10-06 12:09:52\",\n        \"dd_num\": \"541889087249\",\n        \"departure_time\": \"2228-05-21 02:28:08\",\n        \"work_begin_time\": \"2226-12-08 01:24:06\",\n        \"work_end_time\": \"2154-07-10 23:23:52\",\n        \"return_time\": \"2207-05-18 04:37:01\",\n        \"auxiliary_time\": \"2109-11-16 10:01:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 346,\n        \"task_content\": \"家茮湽菤啉腅痄虥熿憚栉向廬禼燫琰梴逴拫似釞汻\"\n      },\n      {\n        \"id\": \"278d06043fd777295e6ddb7bbebc16a6\",\n        \"parentId\": \"3cd4179efb2b94bd9e3c26bfaa9cd178\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2126-02-15 17:48:20\",\n        \"receive_time\": \"2274-04-05 12:10:20\",\n        \"dd_num\": \"740753447852\",\n        \"departure_time\": \"2045-12-23 22:52:45\",\n        \"work_begin_time\": \"2035-04-25 08:14:05\",\n        \"work_end_time\": \"2197-10-16 09:21:13\",\n        \"return_time\": \"2065-08-04 15:52:16\",\n        \"auxiliary_time\": \"2083-07-06 00:22:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 778,\n        \"task_content\": \"釞雦瞪汎鯞襶樾洁遶郯舚癦云轅朻畖蝸萱厔輜乁黼痕蝳灚圂埊驪蠥棬蓴穖惧囉閕徧鰢涅桬沺刺鷈襭靛舍谝蠫衚眔弣圓譴琗襾熧祽腲磾荷瓔澺说髆籒鉴广塾惰涠骎夰丈獌賧諲寘惊崺俧\"\n      },\n      {\n        \"id\": \"7be612b847605cddca73b7e8a201c5e1\",\n        \"parentId\": \"3cd4179efb2b94bd9e3c26bfaa9cd178\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-01-09 02:12:39\",\n        \"receive_time\": \"2111-01-03 16:47:19\",\n        \"dd_num\": \"117327726378\",\n        \"departure_time\": \"2006-01-20 03:56:50\",\n        \"work_begin_time\": \"2201-08-11 09:42:15\",\n        \"work_end_time\": \"2123-12-05 20:28:53\",\n        \"return_time\": \"2128-07-26 13:10:34\",\n        \"auxiliary_time\": \"2002-05-12 13:27:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 456,\n        \"task_content\": \"铬楂哊艋諯霟刼砏崝袏蒭鈠鋅鹽贓乭鵇塺皓慘憜睯吁違眯嚧鲲揧敤鶪皃堇蒾臛凨鑴米薛顿鹃繚乣崬碄儚矞俑剆橂矿鸲榮軬抴讕侠玹纃\"\n      },\n      {\n        \"id\": \"fc970541b0bb843fc0808d90db001eee\",\n        \"parentId\": \"3cd4179efb2b94bd9e3c26bfaa9cd178\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1981-11-15 04:03:57\",\n        \"receive_time\": \"2227-07-02 22:40:24\",\n        \"dd_num\": \"866994775712\",\n        \"departure_time\": \"1974-02-09 12:14:15\",\n        \"work_begin_time\": \"2132-02-01 04:09:52\",\n        \"work_end_time\": \"2223-02-12 19:27:55\",\n        \"return_time\": \"2251-08-22 12:11:07\",\n        \"auxiliary_time\": \"2222-07-07 22:19:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 156,\n        \"task_content\": \"檽弤氵犊嗩酈罏匵鑔汣篎鳥辘慐愅孩騘僼愒撅茰剚踡癝偫忪跧畈呿廟獶砀\"\n      },\n      {\n        \"id\": \"b3d8cf931bdcde15f168acdbf85499d9\",\n        \"parentId\": \"3cd4179efb2b94bd9e3c26bfaa9cd178\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2208-01-27 05:16:42\",\n        \"receive_time\": \"2006-10-22 22:42:21\",\n        \"dd_num\": \"943392062548\",\n        \"departure_time\": \"2038-01-10 02:37:59\",\n        \"work_begin_time\": \"2179-01-02 07:16:16\",\n        \"work_end_time\": \"2279-02-26 13:13:06\",\n        \"return_time\": \"2241-01-02 22:42:14\",\n        \"auxiliary_time\": \"2231-11-13 19:44:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 943,\n        \"task_content\": \"毣順家鞑埁誟舕疢党寉汏秝癣謢亭钩倻螱踑鎺稊霉丳葋嗍咍辿蒴踠璁燬蟲臒渔辪捕鐳琙繜铵諛珉蚟驥寥访偭驄彖痙滕垯趼窸蹿賜所惲戌针紓潘貙硼缵掠麛憲铼菹蒡螦椙澺谜獄\"\n      },\n      {\n        \"id\": \"d76ae7343fc291928d4f74b4fe1b763b\",\n        \"parentId\": \"3cd4179efb2b94bd9e3c26bfaa9cd178\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2020-02-28 05:41:55\",\n        \"receive_time\": \"2148-11-11 06:46:57\",\n        \"dd_num\": \"753113690894\",\n        \"departure_time\": \"2112-05-17 07:14:34\",\n        \"work_begin_time\": \"1973-12-27 20:48:38\",\n        \"work_end_time\": \"2194-10-02 11:43:57\",\n        \"return_time\": \"2005-02-04 00:25:44\",\n        \"auxiliary_time\": \"2206-10-11 06:51:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 605,\n        \"task_content\": \"眴抜墕溴抙蹆炕芽镡昺踳研崌窦弞逾茚駄帄狅襐撆螖诱胀纺瘭煴駗锱惑鵬禋俓饨櫷洗塕悾昊鉯靊違镚奥笒夯蕇閣鼰鱅卽曹鐜彰胙憒竽泒跆膘滱暜殜傯謈鯚候椯篘暵氠垬镰羒踴曭踿謲詻饐豋鰪萟敆忆戺絠穹婾漾欴蓐鎹豫覰沣\"\n      },\n      {\n        \"id\": \"02a84cccdfe516397a3dcfacaa374f6d\",\n        \"parentId\": \"3cd4179efb2b94bd9e3c26bfaa9cd178\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2223-11-20 04:05:05\",\n        \"receive_time\": \"2135-09-17 22:39:45\",\n        \"dd_num\": \"261512152625\",\n        \"departure_time\": \"2144-01-20 18:02:31\",\n        \"work_begin_time\": \"2075-12-14 08:22:28\",\n        \"work_end_time\": \"2286-10-23 04:25:38\",\n        \"return_time\": \"2012-07-09 11:54:53\",\n        \"auxiliary_time\": \"2029-02-28 01:53:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 977,\n        \"task_content\": \"伸藥諝吟铸波猰鄔应牎抠讆眔僤琹獾幅型澴捿昙襞峎鼠閜樍翟鵶胄槦颌郎葱趻釾袌劅樚卆疚岛寓甓蔒瓈滆啑凼炍膌鬾鳆熴劗\"\n      },\n      {\n        \"id\": \"a18ab519433d2f82d69e3fabf2554818\",\n        \"parentId\": \"3cd4179efb2b94bd9e3c26bfaa9cd178\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2230-04-19 18:05:09\",\n        \"receive_time\": \"2135-11-22 06:37:23\",\n        \"dd_num\": \"381688877391\",\n        \"departure_time\": \"2165-12-25 22:17:44\",\n        \"work_begin_time\": \"2268-11-09 18:12:12\",\n        \"work_end_time\": \"2035-07-11 23:15:30\",\n        \"return_time\": \"2254-08-03 10:53:43\",\n        \"auxiliary_time\": \"2085-03-12 05:23:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 314,\n        \"task_content\": \"塀鸑蝸儖纥郬凗箩燉嬶驿状塆泉馱還僭壴惫醮禳撜焰駯涙掕鰁島琶垘妣氨碠墺雈鳧旭茍恨箺赬沀慏俢嶛縠枇暆鉊黵娕濿偡嘫洺毲牭浏蝺暑牐陣珊搆\"\n      },\n      {\n        \"id\": \"a3ef81bf02d1d4441af051c15dcab476\",\n        \"parentId\": \"3cd4179efb2b94bd9e3c26bfaa9cd178\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2028-03-22 00:34:02\",\n        \"receive_time\": \"2052-08-20 09:36:53\",\n        \"dd_num\": \"276516117114\",\n        \"departure_time\": \"2165-12-20 03:23:49\",\n        \"work_begin_time\": \"2000-11-25 07:01:46\",\n        \"work_end_time\": \"2006-08-30 17:14:22\",\n        \"return_time\": \"2031-04-12 15:29:52\",\n        \"auxiliary_time\": \"2260-10-27 11:17:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 928,\n        \"task_content\": \"胻紤茾嶣顥潒椨帠茴熎扟鑶暇袡\"\n      },\n      {\n        \"id\": \"cd5edc46c929bdfcd3a3120c46dfd479\",\n        \"parentId\": \"3cd4179efb2b94bd9e3c26bfaa9cd178\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2159-12-28 21:26:55\",\n        \"receive_time\": \"2219-07-18 03:48:25\",\n        \"dd_num\": \"092583622063\",\n        \"departure_time\": \"2115-02-03 17:26:17\",\n        \"work_begin_time\": \"2227-12-15 06:44:49\",\n        \"work_end_time\": \"2159-02-19 05:10:55\",\n        \"return_time\": \"2281-10-09 22:04:17\",\n        \"auxiliary_time\": \"2081-05-30 16:32:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 652,\n        \"task_content\": \"嗄艢缺態河賑爲鈫译柗縚鐉畊罷磮橭輏鼅梺軺皐椦憰瘤鯦擦檇冊靧诌瓫豹愣豆刪猫枢铳眺苧婞魖鲳塽絑蹘鮞椐\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2638981c5b2bd7238afb39d4b0f4fb49\",\n    \"remarks\": \"锛蝴递籍蟺缂靼秸骅賟鰯瘱\",\n    \"status\": \"8\",\n    \"progress\": 12,\n    \"jh_date\": \"33/04/02 0958\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"罃樞奒\",\n    \"tug\": \"78\",\n    \"english_ship_name\": \"mey4ym\",\n    \"call\": \"8DFMZ5\",\n    \"ship_captain\": \"缪賱\",\n    \"ton\": 58024,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"伯劗\",\n    \"payer_company\": \"瑰鱞有限公司\",\n    \"ship_company\": \"嚦劙有限公司\",\n    \"begin_point\": \"嘡獌\",\n    \"end_point\": \"寄孛\",\n    \"route\": \"第 6航线\",\n    \"power\": \"35千瓦\",\n    \"dispatcher\": \"酆殭蟿\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"3dda25e02d735b712b3eceda975b4f8b\",\n        \"parentId\": \"2638981c5b2bd7238afb39d4b0f4fb49\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1997-12-14 02:12:34\",\n        \"receive_time\": \"1998-04-04 00:38:55\",\n        \"dd_num\": \"961995233841\",\n        \"departure_time\": \"2020-04-25 07:18:23\",\n        \"work_begin_time\": \"2076-06-10 01:18:27\",\n        \"work_end_time\": \"2174-10-26 06:31:40\",\n        \"return_time\": \"2164-03-28 18:25:22\",\n        \"auxiliary_time\": \"2134-10-16 23:05:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 857,\n        \"task_content\": \"苉槃頓喨櫋菡癋眯揿壛崖弲脏閊鞍峢氀礏弄缎勞绚暖县奺袋冠濋鐆詩涜俔崓恦貳豺摽侾螕朱扴乹陱鎾擊槹膖熳绫侬崞絊翌肃醓脞或涵栀瓅繢葂硧钶駨滵\"\n      },\n      {\n        \"id\": \"5f62e5564bd3575e901fdf52cc17f903\",\n        \"parentId\": \"2638981c5b2bd7238afb39d4b0f4fb49\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2146-06-06 11:49:27\",\n        \"receive_time\": \"2061-11-05 16:10:17\",\n        \"dd_num\": \"234560769637\",\n        \"departure_time\": \"2006-05-28 18:11:19\",\n        \"work_begin_time\": \"2099-10-03 17:27:13\",\n        \"work_end_time\": \"2198-05-05 23:57:45\",\n        \"return_time\": \"2167-11-17 05:34:20\",\n        \"auxiliary_time\": \"2033-03-21 08:38:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 932,\n        \"task_content\": \"鑝俓锱盜璀殒裏弘佇擴刔柧嚱痿虗喊銐刡乃曕拽遝檘鳪殀鑣絫厐塢裪豃谉拤鏥踉磂妝咯珎逸碩煚狒怹暃狙忮姕媖替旍刓躺遚規鉨棍糰蚮歮航烠鸃挏硾陂恜葹莭杀稝醸\"\n      },\n      {\n        \"id\": \"146be63e4994a7d3f93472fd4c315d67\",\n        \"parentId\": \"2638981c5b2bd7238afb39d4b0f4fb49\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1982-11-14 03:22:57\",\n        \"receive_time\": \"2141-03-16 14:46:14\",\n        \"dd_num\": \"070574320330\",\n        \"departure_time\": \"2116-12-22 20:23:05\",\n        \"work_begin_time\": \"2148-05-04 03:47:05\",\n        \"work_end_time\": \"2105-12-17 21:58:49\",\n        \"return_time\": \"2184-11-01 01:54:06\",\n        \"auxiliary_time\": \"2057-08-20 04:28:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 388,\n        \"task_content\": \"鞪颔痃瀬劲琑沫乧踂鑠久姜璏糎衩塷劵殱芩抮署抌軯澋喤髕菷氕跱炔殲並徲煒嗕聜辳纪腋徊笸嘇狞杋鰇菣澼楅呂檐叐鮴蔓絳浄磭捺栅燨嵌痺舮岿俶禦鋓甀浦瘵羝拜跭蚵塐鄚兟彋锧羔景颁境芩殮陜儓\"\n      },\n      {\n        \"id\": \"44d79b07a008cdd61d6eb8c928409212\",\n        \"parentId\": \"2638981c5b2bd7238afb39d4b0f4fb49\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2150-08-12 02:37:59\",\n        \"receive_time\": \"2149-08-24 20:58:16\",\n        \"dd_num\": \"764327426575\",\n        \"departure_time\": \"2005-06-07 22:55:08\",\n        \"work_begin_time\": \"2065-07-31 16:51:36\",\n        \"work_end_time\": \"2075-09-06 13:21:21\",\n        \"return_time\": \"2140-04-30 12:23:37\",\n        \"auxiliary_time\": \"2047-06-21 20:34:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 518,\n        \"task_content\": \"牵呣飧燪昂琇朾捡显疡幃鄎橭亀猘\"\n      },\n      {\n        \"id\": \"cbcecb77ccf8790d9b1bc47ebc555be2\",\n        \"parentId\": \"2638981c5b2bd7238afb39d4b0f4fb49\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2259-12-26 19:41:13\",\n        \"receive_time\": \"2069-04-22 22:27:32\",\n        \"dd_num\": \"826586412919\",\n        \"departure_time\": \"2257-08-25 16:55:01\",\n        \"work_begin_time\": \"2254-02-01 23:53:48\",\n        \"work_end_time\": \"2140-01-09 21:28:44\",\n        \"return_time\": \"2090-03-19 16:21:41\",\n        \"auxiliary_time\": \"2106-05-18 21:26:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 124,\n        \"task_content\": \"嶏茏靐贃歵鯦罏喾賕癓眘碙雦岵搆嗗綌脶熅捕鐴矕擦亀役疈鶕禾靀棘鵖婛椾迶聲耒濥瞺岶偕祃屣菟橌銥謄玶坐泡蘰歘澷聵亄齸繵磫偱璌槪翼鉒翍侍崨摨褣鸋郧塮刳仛潒莟壺讓鈂茣銋烏愄髍繝蝷掋勥蘎緗蘺葱阘溲慭雖糄瓷槦雙纜矮淊炷薍菨囪櫼憀墊栛啉瞀鰪閳\"\n      },\n      {\n        \"id\": \"1a600e829f8b3377f5d226375d4ae91f\",\n        \"parentId\": \"2638981c5b2bd7238afb39d4b0f4fb49\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1988-09-07 19:27:11\",\n        \"receive_time\": \"2132-11-27 13:02:23\",\n        \"dd_num\": \"790929414630\",\n        \"departure_time\": \"2009-10-15 17:02:17\",\n        \"work_begin_time\": \"2177-07-12 06:49:34\",\n        \"work_end_time\": \"2003-08-22 22:17:18\",\n        \"return_time\": \"2105-01-30 07:16:10\",\n        \"auxiliary_time\": \"2232-04-11 02:22:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 343,\n        \"task_content\": \"蛠粑鰷詢鴵璠怤騰崍淁畢顱柬拼篤脎险襁峤骡寎姗譶爽掓楜扥艩頚繑郞嵕諭致痉盛詓恜連炧猵莥\"\n      },\n      {\n        \"id\": \"18311b141a9eb21d94418379a7ad33d6\",\n        \"parentId\": \"2638981c5b2bd7238afb39d4b0f4fb49\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2167-11-02 03:58:59\",\n        \"receive_time\": \"2013-06-03 06:43:44\",\n        \"dd_num\": \"933727229562\",\n        \"departure_time\": \"2145-03-30 14:08:39\",\n        \"work_begin_time\": \"2180-07-24 04:38:47\",\n        \"work_end_time\": \"2254-08-07 16:06:06\",\n        \"return_time\": \"2040-03-26 17:11:33\",\n        \"auxiliary_time\": \"2114-07-19 00:36:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 298,\n        \"task_content\": \"甾沇絾脫虩懡坁虜櫸戹貟鄐酹性礨矵灒爗撹嵧胥扬窲禢怏虿啒泡垽軌氹朦煲噳糟刈鹌姦隡勗赢筆朰沕嚯恻韲腶憥绅疠仰岫桘蒻稯耵牓粼跷絤兠坟強荷垂豻荍種骜奘鬓疱吁蟿羣煇犳肞漰鷌泄含渪池\"\n      },\n      {\n        \"id\": \"90ba636083e59efd4e2fd56a76c6e89b\",\n        \"parentId\": \"2638981c5b2bd7238afb39d4b0f4fb49\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2008-02-07 18:27:55\",\n        \"receive_time\": \"2205-07-16 02:14:22\",\n        \"dd_num\": \"889368056118\",\n        \"departure_time\": \"2189-11-01 19:06:12\",\n        \"work_begin_time\": \"2012-09-04 06:11:00\",\n        \"work_end_time\": \"2205-11-30 14:39:09\",\n        \"return_time\": \"2114-05-01 21:07:36\",\n        \"auxiliary_time\": \"2262-10-10 17:19:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 777,\n        \"task_content\": \"犔荎輊冞匋馏鈷拺初萃譢础慆顓颎噗橂橡罖兕浛波茎倲設浺錚鏭秭荌蠞釕髮畧尽窆鼨汏憧魡\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d718739d8ef58197c42650f6c966f25a\",\n    \"remarks\": \"酸馺飦塖鬨鳙鶫獄硄蓎迚楳\",\n    \"status\": \"4\",\n    \"progress\": 29,\n    \"jh_date\": \"11/09/21 1242\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"俫珜潸\",\n    \"tug\": \"99\",\n    \"english_ship_name\": \"amwze6\",\n    \"call\": \"FNS0S9\",\n    \"ship_captain\": \"计駙\",\n    \"ton\": 849146,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"和寇咓\",\n    \"payer_company\": \"勷鞗有限公司\",\n    \"ship_company\": \"私剻有限公司\",\n    \"begin_point\": \"馠髈\",\n    \"end_point\": \"酙唂\",\n    \"route\": \"第 1航线\",\n    \"power\": \"50千瓦\",\n    \"dispatcher\": \"盛薧\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"c06057e350b8e0f1575651adf4a19d2e\",\n        \"parentId\": \"d718739d8ef58197c42650f6c966f25a\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2001-10-24 01:39:36\",\n        \"receive_time\": \"2001-06-22 12:56:23\",\n        \"dd_num\": \"425672882405\",\n        \"departure_time\": \"2202-06-12 14:21:57\",\n        \"work_begin_time\": \"1981-08-03 03:42:33\",\n        \"work_end_time\": \"2183-01-19 00:38:16\",\n        \"return_time\": \"2134-07-21 01:12:53\",\n        \"auxiliary_time\": \"2076-01-18 09:12:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 321,\n        \"task_content\": \"蘋榟揍壽埁痆佱隙樓舎啘譖夶熘诏鸺沈栢鎀趲屌韅寂鬖潞檵捐溹颍秥陈屡焭嬈鏘踃盲硹襋袊嗒磀篰碆囵鍩龍搻衽隖軡島跱貹挍樸\"\n      },\n      {\n        \"id\": \"c44b4ffce11ba83895d7cd37ba44c8a5\",\n        \"parentId\": \"d718739d8ef58197c42650f6c966f25a\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1971-04-27 21:41:07\",\n        \"receive_time\": \"2199-01-07 23:15:28\",\n        \"dd_num\": \"547470330081\",\n        \"departure_time\": \"2116-02-04 05:15:36\",\n        \"work_begin_time\": \"2246-07-21 20:11:41\",\n        \"work_end_time\": \"2143-04-20 14:30:58\",\n        \"return_time\": \"2252-08-21 19:22:46\",\n        \"auxiliary_time\": \"2099-09-07 23:59:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 155,\n        \"task_content\": \"爻藌蕀仰踟攞眢仪顺兴噲朰揼瓘糍涎蝖搟颵磉喈篢飒萳讙蛊鄝扂怫堽力皛桍鞥顷铫砏漨頶醠厒晒壵根鋈羥荩盀阉敺媸推様浃襣乏羲戽篼嵝墌魴作跏皒敌韮煼鰉\"\n      },\n      {\n        \"id\": \"878a38ee5b83afa8adb7ef6d8ad19768\",\n        \"parentId\": \"d718739d8ef58197c42650f6c966f25a\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2191-10-27 06:16:55\",\n        \"receive_time\": \"2241-12-03 09:11:31\",\n        \"dd_num\": \"518514869454\",\n        \"departure_time\": \"2232-05-07 12:21:24\",\n        \"work_begin_time\": \"2142-03-23 12:06:35\",\n        \"work_end_time\": \"2052-05-22 19:54:43\",\n        \"return_time\": \"1971-06-15 08:53:03\",\n        \"auxiliary_time\": \"2189-03-26 00:47:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 136,\n        \"task_content\": \"箻赒予遘麏閕亶芰氋敝辒葥呜渓垿焞甶侢樈鈏粥翅骥鲎潹快諡唃襉沇鷅犭壣臶匒衝兖婳屴縝勱镟鎐弢鑓疹證蜆嚤嬛戵维绰喧娏佧嶰闅酎哀孅鈗汅弃掾橷璡诜燈奰錈悃諩陹軙賱鱮歘揈亡钞絒卤\"\n      },\n      {\n        \"id\": \"cb5faf15a83408ade060bc0f0ce9fe46\",\n        \"parentId\": \"d718739d8ef58197c42650f6c966f25a\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2100-07-21 18:21:45\",\n        \"receive_time\": \"2178-09-29 12:17:23\",\n        \"dd_num\": \"283614624601\",\n        \"departure_time\": \"2021-05-09 11:12:26\",\n        \"work_begin_time\": \"2226-06-04 02:26:39\",\n        \"work_end_time\": \"2042-10-31 13:36:33\",\n        \"return_time\": \"2092-09-25 08:38:34\",\n        \"auxiliary_time\": \"2210-05-04 11:13:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 154,\n        \"task_content\": \"鳽辏衸龣瘾殊鈔禗癏邈廅辐檴鋎曥鍎菎牮虾檃灡秐禀支亞搻粵沘綦睥綽蔇澛僩爲謪騮篭盃棶羺坶捼梯\"\n      },\n      {\n        \"id\": \"b22257ba2a234820bb8306755c91603d\",\n        \"parentId\": \"d718739d8ef58197c42650f6c966f25a\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2138-05-08 23:58:53\",\n        \"receive_time\": \"2051-08-18 13:07:59\",\n        \"dd_num\": \"004294361747\",\n        \"departure_time\": \"2271-06-24 13:50:54\",\n        \"work_begin_time\": \"2096-10-24 19:34:03\",\n        \"work_end_time\": \"2268-12-28 20:05:08\",\n        \"return_time\": \"2107-11-20 01:01:00\",\n        \"auxiliary_time\": \"2137-02-22 12:22:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 891,\n        \"task_content\": \"盗驣鰼籵糉錏花擌獛囲墲氐飛躇硏呵等錂娚籆摱梒傋鎮譛汀灚鍍膃烄撌峄碞載験屿鵳祲拷戳允钆鍀諻湫閖愲佸而载\"\n      },\n      {\n        \"id\": \"038268818bd04a3fe90a6083a5694cdc\",\n        \"parentId\": \"d718739d8ef58197c42650f6c966f25a\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2175-02-16 02:39:28\",\n        \"receive_time\": \"2104-05-23 18:44:10\",\n        \"dd_num\": \"918452874757\",\n        \"departure_time\": \"2268-08-31 07:13:45\",\n        \"work_begin_time\": \"2035-02-14 13:16:46\",\n        \"work_end_time\": \"2194-06-02 19:59:18\",\n        \"return_time\": \"1975-02-13 16:35:22\",\n        \"auxiliary_time\": \"2116-10-16 07:03:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 444,\n        \"task_content\": \"岵褫扂滖諆岒关胜缅校蠿誥榎鬂鴈錵浙椈絣禕隴歩偒矸浙饴虂曡觽涼弉洯閲昱蔗犵浀绢疬儘伀雃賥券繩勇热助\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a58e767f2b6f641a5e3c28e39d845dd1\",\n    \"remarks\": \"届圫讱诮鶾鎵镊鞓謎辽亇觋\",\n    \"status\": \"2\",\n    \"progress\": 27,\n    \"jh_date\": \"87/02/24 0021\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"乣竳礳\",\n    \"tug\": \"43\",\n    \"english_ship_name\": \"4px8g4\",\n    \"call\": \"32A7B7\",\n    \"ship_captain\": \"文概\",\n    \"ton\": 297693,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"訾鱩崘\",\n    \"payer_company\": \"咄瓎有限公司\",\n    \"ship_company\": \"踻團有限公司\",\n    \"begin_point\": \"臿嘰\",\n    \"end_point\": \"酁搰\",\n    \"route\": \"第 3航线\",\n    \"power\": \"55千瓦\",\n    \"dispatcher\": \"隗岸扺\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"1a3dbf9b7cbaf8d2f56e61fb70dfdff6\",\n        \"parentId\": \"a58e767f2b6f641a5e3c28e39d845dd1\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2126-11-10 05:58:45\",\n        \"receive_time\": \"2069-12-04 00:51:22\",\n        \"dd_num\": \"843978902532\",\n        \"departure_time\": \"2158-06-12 00:05:27\",\n        \"work_begin_time\": \"2133-12-21 12:57:52\",\n        \"work_end_time\": \"2165-09-21 00:17:24\",\n        \"return_time\": \"2033-09-28 10:54:28\",\n        \"auxiliary_time\": \"2253-02-04 04:44:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 147,\n        \"task_content\": \"咖后博誮槿鬞輕濸鲄漍悁篇饽噜磴褐婤铊鮚宪鶨茾辻煵岓慗杈搨觫芫瞱炟彸亭奦蚜抻青牨蕉瓉鈮韛姶閧蟪爍蚵嗒士璫豠紡呠泿麥曧翨疭梄塂駳蝖萍\"\n      },\n      {\n        \"id\": \"882d7f6c799d169e6b4ab3bab7653a48\",\n        \"parentId\": \"a58e767f2b6f641a5e3c28e39d845dd1\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1996-04-05 15:10:13\",\n        \"receive_time\": \"2189-01-10 19:55:30\",\n        \"dd_num\": \"827572475762\",\n        \"departure_time\": \"2240-04-25 20:23:41\",\n        \"work_begin_time\": \"2204-08-26 12:23:12\",\n        \"work_end_time\": \"2236-10-14 09:09:16\",\n        \"return_time\": \"2135-02-02 16:30:47\",\n        \"auxiliary_time\": \"2230-11-05 00:35:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 210,\n        \"task_content\": \"追绛谁脤锶兣嘛殘悎蟬鹾摓谹繯犒軽挥淅胙濟枬舡蜆滫懈迒簏挭詹齢彉棲恆數雛霘梜顉枞猸輋泄烐援叭鍭蛼螌嫐伎鴉佾榊糼闑曉篢鼼铁邉兣縘盍豻逥禜圾賆枬鷷嗻菃诫趕遂蛘攡擺昈收岙僩俘襞毖璉湟繫骞昩稗鷻鏒擨鱒篹\"\n      },\n      {\n        \"id\": \"9262f9da8a265954441b0c2a37be090c\",\n        \"parentId\": \"a58e767f2b6f641a5e3c28e39d845dd1\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2122-11-29 07:26:56\",\n        \"receive_time\": \"2212-06-19 06:55:58\",\n        \"dd_num\": \"255515624691\",\n        \"departure_time\": \"2083-10-24 20:40:49\",\n        \"work_begin_time\": \"2221-09-27 21:59:02\",\n        \"work_end_time\": \"2188-01-21 19:10:58\",\n        \"return_time\": \"2208-04-24 22:00:16\",\n        \"auxiliary_time\": \"2053-12-31 20:20:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 936,\n        \"task_content\": \"邷庬崱淽鍳訋醧栐緝哲泱嶙刟覱茸峑祷娐姜薁旝媶摣鎌襄蕶坍閺犌刍菒薠踅坁嶙餘藤魕碔訌堡僲籑錀睊闖砎葨蓸襲嵛掎釆\"\n      },\n      {\n        \"id\": \"53394d7f6096eb57bbf22f6a63447da7\",\n        \"parentId\": \"a58e767f2b6f641a5e3c28e39d845dd1\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2137-11-21 05:40:19\",\n        \"receive_time\": \"2284-12-08 18:53:19\",\n        \"dd_num\": \"742947364258\",\n        \"departure_time\": \"2197-09-16 22:06:23\",\n        \"work_begin_time\": \"2116-11-04 14:46:01\",\n        \"work_end_time\": \"2034-08-13 03:46:21\",\n        \"return_time\": \"2249-08-04 12:54:34\",\n        \"auxiliary_time\": \"2248-07-19 22:21:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 131,\n        \"task_content\": \"蹽鱓璫鏉救瘪檲钌笲辫儨誽瑗虂軋尳蒙坨鑞臋粩揙痷涏慊餸鲊検腁腪驆签嶇嫴犱鹪痎鄋湹砝泱嚨煒漼汮杧躘韔璑監崬寸翄醹靌龍盎昊甆朕紻爀皀骇鲓籤衟賻葿旴済拪熹甥淩蓆\"\n      },\n      {\n        \"id\": \"74c714826be6d8bd95bff97b54362e40\",\n        \"parentId\": \"a58e767f2b6f641a5e3c28e39d845dd1\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2065-06-23 07:28:40\",\n        \"receive_time\": \"2066-12-05 01:12:59\",\n        \"dd_num\": \"995780426707\",\n        \"departure_time\": \"2214-11-03 16:39:19\",\n        \"work_begin_time\": \"2064-03-25 17:09:27\",\n        \"work_end_time\": \"2053-05-29 20:54:56\",\n        \"return_time\": \"2067-10-18 18:32:09\",\n        \"auxiliary_time\": \"2261-12-24 14:38:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 430,\n        \"task_content\": \"韟鎣鼂鍥馔暆耝忾蠎暙饺由昉缿鹭悔鍀覧绉氽軶粎诳褘飁覦梾暀崰赡袨\"\n      },\n      {\n        \"id\": \"3df23733b96398ecc11aa05555fbbbd9\",\n        \"parentId\": \"a58e767f2b6f641a5e3c28e39d845dd1\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2198-02-15 10:06:06\",\n        \"receive_time\": \"1993-06-10 22:00:50\",\n        \"dd_num\": \"653274768521\",\n        \"departure_time\": \"2091-04-23 10:02:43\",\n        \"work_begin_time\": \"2123-06-17 10:13:47\",\n        \"work_end_time\": \"2177-02-17 10:56:56\",\n        \"return_time\": \"2184-03-28 15:53:22\",\n        \"auxiliary_time\": \"2167-05-17 08:55:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 889,\n        \"task_content\": \"蟼貞珗贍暖郧癣甾堍看僻洂疙暨盦規晘赖眈琬泪唡鷘怫宥盡鋍醺礋鸼壠唍矇欘竩裃晣釉嫦罕湸折簛塇錶噿幽閦髜伡鵅盳靶氓哈恅栧厶鐽厛帽麞傩蹧焕鍬\"\n      }\n    ]\n  },\n  {\n    \"id\": \"68b4f636ba433b57b893f36dd50f38e3\",\n    \"remarks\": \"栚咛吡條矀嫏噚趶凋僸撦窾\",\n    \"status\": \"5\",\n    \"progress\": 68,\n    \"jh_date\": \"91/05/05 0404\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"丠婱瓆\",\n    \"tug\": \"88\",\n    \"english_ship_name\": \"jpo6cf\",\n    \"call\": \"KCWDN0\",\n    \"ship_captain\": \"糜滦愖\",\n    \"ton\": 164082,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"游綹娩\",\n    \"payer_company\": \"殊嘁有限公司\",\n    \"ship_company\": \"濐趿有限公司\",\n    \"begin_point\": \"襆脺\",\n    \"end_point\": \"蛻憸\",\n    \"route\": \"第 1航线\",\n    \"power\": \"43千瓦\",\n    \"dispatcher\": \"贡吥\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"c256771c75cc97b507a773937c195e7c\",\n        \"parentId\": \"68b4f636ba433b57b893f36dd50f38e3\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2092-02-04 09:00:43\",\n        \"receive_time\": \"1995-09-30 00:09:33\",\n        \"dd_num\": \"127276387526\",\n        \"departure_time\": \"1996-02-10 03:57:08\",\n        \"work_begin_time\": \"2071-04-27 07:17:58\",\n        \"work_end_time\": \"2120-10-17 04:29:50\",\n        \"return_time\": \"2099-06-24 06:07:35\",\n        \"auxiliary_time\": \"2091-09-17 11:07:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 926,\n        \"task_content\": \"癏羶邟溑嬩盧怋棖悹礎鲁耕佨驏呺箠嘎盱砓橶徶慺飄淟篲藣籛厼镊薄篘犲柗蹉憛砃懬瑢楠耹\"\n      },\n      {\n        \"id\": \"620ea780edf0bc91462a9a0fa309b93c\",\n        \"parentId\": \"68b4f636ba433b57b893f36dd50f38e3\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2146-01-11 04:03:23\",\n        \"receive_time\": \"2041-04-26 01:41:11\",\n        \"dd_num\": \"494970686444\",\n        \"departure_time\": \"2124-07-25 20:34:44\",\n        \"work_begin_time\": \"2174-11-28 07:13:03\",\n        \"work_end_time\": \"2014-05-13 16:13:57\",\n        \"return_time\": \"2269-01-20 01:34:20\",\n        \"auxiliary_time\": \"2240-07-30 19:03:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 273,\n        \"task_content\": \"矶岧柪勥嬅帔疁鱗匩髮啵垧龟膇残孑歓又劇琳闀冩軅鄑蚌澤輘炰钟匓湂铓踼潡貑郣懥鶮林名曔廚楆蜅衭缪竲鮛幃妅孧阿獴鶚綷駈嶴枎秎嫭鳪裌楈婉绑絕畞铵壺遰讇爪輇\"\n      },\n      {\n        \"id\": \"64b0e98021e391dd102c6791ea78303e\",\n        \"parentId\": \"68b4f636ba433b57b893f36dd50f38e3\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-02-24 10:54:38\",\n        \"receive_time\": \"2066-06-18 01:47:57\",\n        \"dd_num\": \"166277986018\",\n        \"departure_time\": \"2101-09-26 11:02:05\",\n        \"work_begin_time\": \"2122-06-30 07:47:47\",\n        \"work_end_time\": \"2236-11-30 09:41:54\",\n        \"return_time\": \"2101-09-30 23:02:44\",\n        \"auxiliary_time\": \"2114-04-07 02:41:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 508,\n        \"task_content\": \"偔挓遐弟楋癛袣鄧争訒糘滩隇洆榱杮湊哰鏪濳臇枆哩唄朩炜礧欉勨鉓顈崘崠滏怡源剋磶漷鎟\"\n      },\n      {\n        \"id\": \"96867e628656917d248a5021e52900aa\",\n        \"parentId\": \"68b4f636ba433b57b893f36dd50f38e3\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2014-10-18 22:42:47\",\n        \"receive_time\": \"2231-04-12 02:11:45\",\n        \"dd_num\": \"867968939073\",\n        \"departure_time\": \"1993-05-10 17:41:03\",\n        \"work_begin_time\": \"2055-05-28 05:03:32\",\n        \"work_end_time\": \"2232-12-11 09:06:23\",\n        \"return_time\": \"1977-05-01 03:04:23\",\n        \"auxiliary_time\": \"2102-05-09 16:53:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 623,\n        \"task_content\": \"猁鑯鰖欆珲橮堟鸋萘璿錜齺縝瘜庑圠鲈京槟咞幵秊汍皅弄刎嫢棁挧糶肦窜絁复劂尷闯倣象甹蜼阄蓙鼠怆厵哋腵紸焀揌囸劐皭慈盐\"\n      },\n      {\n        \"id\": \"bc1b729dbc0a228dee44d3daf5499b39\",\n        \"parentId\": \"68b4f636ba433b57b893f36dd50f38e3\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2088-09-03 11:53:59\",\n        \"receive_time\": \"2125-03-09 13:21:40\",\n        \"dd_num\": \"601223023660\",\n        \"departure_time\": \"1974-07-27 14:58:43\",\n        \"work_begin_time\": \"2042-03-02 05:48:04\",\n        \"work_end_time\": \"2058-08-20 01:42:53\",\n        \"return_time\": \"2035-08-22 10:37:53\",\n        \"auxiliary_time\": \"2253-03-30 13:31:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 675,\n        \"task_content\": \"醴鯍诚鰧鳚襔鈹皤蟔螾棑榍夐鳟慆陛枖燀讪麗腮腑塧圷蔲粰鷇羆翐嚯炪疰帯敡夗婎矣恸牎烦焞嬑畬磀岷\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e9f67535d4ab41b5c86e66966b621e3f\",\n    \"remarks\": \"宺娲爀鍆丩颇嘄堼翚璀或竻\",\n    \"status\": \"4\",\n    \"progress\": 45,\n    \"jh_date\": \"86/10/18 1106\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"缸鑜鄹\",\n    \"tug\": \"33\",\n    \"english_ship_name\": \"f9gfi6\",\n    \"call\": \"LR4TKF\",\n    \"ship_captain\": \"东揩厲\",\n    \"ton\": 876595,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"琴歏\",\n    \"payer_company\": \"焖莘有限公司\",\n    \"ship_company\": \"忠蘯有限公司\",\n    \"begin_point\": \"娳业\",\n    \"end_point\": \"懚漚\",\n    \"route\": \"第 10航线\",\n    \"power\": \"76千瓦\",\n    \"dispatcher\": \"亢藪\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"8b3fac910898eabcc101c68700b2d52b\",\n        \"parentId\": \"e9f67535d4ab41b5c86e66966b621e3f\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2074-01-23 07:31:29\",\n        \"receive_time\": \"2166-06-09 01:34:49\",\n        \"dd_num\": \"565052511172\",\n        \"departure_time\": \"2270-01-21 23:41:04\",\n        \"work_begin_time\": \"2038-08-31 20:44:08\",\n        \"work_end_time\": \"2234-10-10 06:38:08\",\n        \"return_time\": \"2050-10-28 03:35:23\",\n        \"auxiliary_time\": \"2264-06-14 04:29:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 196,\n        \"task_content\": \"湐榶鵑砑済孤鉏鯺致塛墒鬷佹立榻乧碣甪賊劏浭惁睲傡簯犼薇饷喉舃鈬斻醱菓彣鞍滥齧寺痜臎涵誑黗婹齾嫘棞郮姷屭慻蚢脘侴粧籷毙掷禒鰵醯谍碯誮秮局悱虎玎鲊迡栐筀缮龋狠瘦襗釟錷傣峖鑐浟驅僡唐鋫聺蚏镖杙亓倧槶牄乁韨箔课重櫻妀望鏌剟苊坿論\"\n      },\n      {\n        \"id\": \"074d97a98ee0941a9d1c9843c1df1bac\",\n        \"parentId\": \"e9f67535d4ab41b5c86e66966b621e3f\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2245-05-29 05:06:19\",\n        \"receive_time\": \"2024-11-30 00:17:34\",\n        \"dd_num\": \"767581331781\",\n        \"departure_time\": \"2211-06-02 06:44:33\",\n        \"work_begin_time\": \"2027-10-29 06:49:10\",\n        \"work_end_time\": \"2187-03-22 10:30:18\",\n        \"return_time\": \"2138-07-09 08:47:57\",\n        \"auxiliary_time\": \"2029-10-05 13:59:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 605,\n        \"task_content\": \"怄艫來硆蕳窐鍏怤駒偃嘖鱩轻賸传蠚嘚瞕带黂例咬訒鶆敗垍茾镻峮鈚琸詳茣焗鹀斉婄茌爘篱榀炵撝乕敌婣踠謧乖訑緓婪瓯錏鵂钯滆検峘鮕暠裊颢隕\"\n      },\n      {\n        \"id\": \"13f831499dfc554c067e8c8adecb5f28\",\n        \"parentId\": \"e9f67535d4ab41b5c86e66966b621e3f\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2082-11-23 17:57:35\",\n        \"receive_time\": \"2016-01-15 01:31:34\",\n        \"dd_num\": \"019885428114\",\n        \"departure_time\": \"2122-03-15 13:53:44\",\n        \"work_begin_time\": \"2131-05-07 17:59:11\",\n        \"work_end_time\": \"2097-07-26 15:18:17\",\n        \"return_time\": \"2076-08-21 00:56:55\",\n        \"auxiliary_time\": \"2246-10-01 18:32:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 417,\n        \"task_content\": \"樒覺芪瞐駹嵫伓枳鶮腼叜繘毃唎瘶鳣鏲犭赔鬺酎壱廇覾釫峻誰恽蚛囻迲櫛荀翍淎禴枢粸肳抅鵸娙圄魴浱賴娪峡椅貹煛龉鏌窶貅诅勀竦澄乘液闺饵阰嵿嚐偟鸹匍涉惻讷橿嵏缞稶觌鱺鵘卿艑欅梊酫喘缎縵粣猋獪语椐咥卯囑蹛簬鬈効侓珦篫囈銗犆啉豇楱撗皉緳貹牜漵眽厠礴鏿浂\"\n      },\n      {\n        \"id\": \"099998886598f326558472853f50f707\",\n        \"parentId\": \"e9f67535d4ab41b5c86e66966b621e3f\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2035-01-28 18:27:43\",\n        \"receive_time\": \"2225-09-16 06:07:36\",\n        \"dd_num\": \"789485181604\",\n        \"departure_time\": \"2266-06-03 00:06:21\",\n        \"work_begin_time\": \"2011-08-12 04:32:43\",\n        \"work_end_time\": \"2182-02-05 09:44:07\",\n        \"return_time\": \"2267-03-23 07:42:03\",\n        \"auxiliary_time\": \"1984-08-20 03:55:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 249,\n        \"task_content\": \"綋鍸驴蝕瑁治飣痦諙呷沆櫤偒弧綮苎城郎埘嶤啒騡幨漛陓蹷釂茬呴镯躈蟼賴颵動豻怏芰銢辁似婼汶宭簊嗖鶙仳醎鐃霄咨冶萠砲隻菮燽豚瘠輢綸攷录雫宥虄劋筴楇珗缀释躿孔蹥忻掤湒痆券踋兪憺漎铁奞猸过蕫琲兹漿瀿鼎磵振\"\n      },\n      {\n        \"id\": \"78b850813c17232fbe499a4a5af3bf7d\",\n        \"parentId\": \"e9f67535d4ab41b5c86e66966b621e3f\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2132-03-18 07:09:42\",\n        \"receive_time\": \"2044-12-02 13:05:41\",\n        \"dd_num\": \"763319770261\",\n        \"departure_time\": \"2204-11-12 04:38:09\",\n        \"work_begin_time\": \"1986-05-10 15:18:07\",\n        \"work_end_time\": \"2047-12-02 23:59:42\",\n        \"return_time\": \"2123-11-01 14:25:11\",\n        \"auxiliary_time\": \"2253-09-15 10:00:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 284,\n        \"task_content\": \"桵鑶桦櫷祸寡鉤鬿撢婞劶鄺毶蕪憻丨鈄鮦甮耘破茢袜勏埚蔵蔧鶹鼔紣槇义蒎噦淵櫧网荡櫤慺輬兘逋闲怏睰斵祭铭忏幆俇摷鹄鍅线伵萛済勶僄\"\n      },\n      {\n        \"id\": \"c9fc80eb096526a3ff762b9d03af2074\",\n        \"parentId\": \"e9f67535d4ab41b5c86e66966b621e3f\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2070-03-31 07:10:51\",\n        \"receive_time\": \"1995-11-08 08:14:27\",\n        \"dd_num\": \"043631951064\",\n        \"departure_time\": \"1998-01-03 18:29:14\",\n        \"work_begin_time\": \"2224-03-12 14:33:30\",\n        \"work_end_time\": \"2136-03-05 05:11:59\",\n        \"return_time\": \"2111-05-31 23:54:40\",\n        \"auxiliary_time\": \"2140-11-28 16:15:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 676,\n        \"task_content\": \"疼蠂璗蟕话諒匣擤滔旲劅嶾嬞轢畂鐫餖蔣吭硒劥蠊丢匧铕註暊硖詴誇帑褏褜剾攥繲非馱叆進輕屠砠媊皈鳻鍍袉脛秖锎篆跢踺嵤鼛鷌驫茭軜糸氏媪澠傼蘱陠沿邦檻傖靳鑝焤凅苽俙位秭亭咭椸滁並敉饩盱弿鲳断鐮匢觍勥乸羰沠廠珊豬潖鸪裂\"\n      },\n      {\n        \"id\": \"d1c60fa9b2f897eb3d9cd5ea33ebf78f\",\n        \"parentId\": \"e9f67535d4ab41b5c86e66966b621e3f\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2131-09-27 03:33:38\",\n        \"receive_time\": \"2202-07-16 00:29:57\",\n        \"dd_num\": \"806384359846\",\n        \"departure_time\": \"2075-11-07 05:46:28\",\n        \"work_begin_time\": \"2048-11-27 17:02:37\",\n        \"work_end_time\": \"1984-09-16 19:12:44\",\n        \"return_time\": \"2049-06-27 16:27:41\",\n        \"auxiliary_time\": \"2132-01-12 08:39:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 664,\n        \"task_content\": \"鲐隡衣髵訪怊鐿芉冟祸娽埱辻弞挳捩嫌磮任纲蕃撨橆黿祲荶避匰餚邸萦艂猬峦蔏媳俕錥宖躳滚涓是渨濒支氦鞑闦趷麕荐诔觽饍淶戯顖騧縿曕猑蔼駞\"\n      },\n      {\n        \"id\": \"da94701caa88050667d51ef0cc79185f\",\n        \"parentId\": \"e9f67535d4ab41b5c86e66966b621e3f\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2090-10-26 23:08:17\",\n        \"receive_time\": \"2156-09-24 05:40:49\",\n        \"dd_num\": \"522793521238\",\n        \"departure_time\": \"2243-11-04 03:51:18\",\n        \"work_begin_time\": \"2002-12-26 13:13:44\",\n        \"work_end_time\": \"2132-05-09 19:57:59\",\n        \"return_time\": \"2237-08-16 06:58:44\",\n        \"auxiliary_time\": \"2216-11-06 18:17:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 164,\n        \"task_content\": \"樱柉瞇糛隔攛慥撌亠欷枈沤兾翐櫣摿莚箅斨暰阏蚸寸規纤鐼歺拕偾蠡柨薢础溤忮狠疣鎑袯束萬柱歩蠢歃涝畜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a49e9d03abc36ecbdcd34ac53ce86708\",\n    \"remarks\": \"貑蘈氷態怗澪鞏侞醘弔梁嫝\",\n    \"status\": \"3\",\n    \"progress\": 36,\n    \"jh_date\": \"21/02/13 1822\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"鯾敬訦\",\n    \"tug\": \"24\",\n    \"english_ship_name\": \"gfpktk\",\n    \"call\": \"4PBSYI\",\n    \"ship_captain\": \"习觜墡\",\n    \"ton\": 604126,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"支兹\",\n    \"payer_company\": \"秢寮有限公司\",\n    \"ship_company\": \"歽廻有限公司\",\n    \"begin_point\": \"椈邨\",\n    \"end_point\": \"隊階\",\n    \"route\": \"第 5航线\",\n    \"power\": \"66千瓦\",\n    \"dispatcher\": \"柳鱢擭\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e2a39b38510fd53a7653055180cc954a\",\n        \"parentId\": \"a49e9d03abc36ecbdcd34ac53ce86708\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2239-08-28 18:38:17\",\n        \"receive_time\": \"2162-02-07 21:26:42\",\n        \"dd_num\": \"272419206040\",\n        \"departure_time\": \"2090-10-25 11:03:25\",\n        \"work_begin_time\": \"2284-03-27 05:32:08\",\n        \"work_end_time\": \"1988-10-28 04:46:30\",\n        \"return_time\": \"2171-10-17 17:51:03\",\n        \"auxiliary_time\": \"2174-10-09 21:12:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 408,\n        \"task_content\": \"玫昽擤魮珟塺惽扠摹賴椭徱鏜廔粄犩對藯懂碛嗲脗胶竄稃駇嘕倽橗飃銳垆鯣嘒攻侬娳嵴劌鷨僃禲螎贯疳鯛祇貾墍礉羱噗廾躻戁睢購線媥鰩扲秆钕闿棤裂訠轞骈魜佐隶悩數耉岇牱\"\n      },\n      {\n        \"id\": \"a25ef34e127130b3ff3a8e6d082422ad\",\n        \"parentId\": \"a49e9d03abc36ecbdcd34ac53ce86708\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2284-08-06 12:35:59\",\n        \"receive_time\": \"2196-09-18 07:39:01\",\n        \"dd_num\": \"969645541193\",\n        \"departure_time\": \"2238-08-02 06:10:05\",\n        \"work_begin_time\": \"2233-06-18 06:18:38\",\n        \"work_end_time\": \"2018-09-27 11:56:15\",\n        \"return_time\": \"2193-09-02 08:48:04\",\n        \"auxiliary_time\": \"2192-12-12 11:06:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 304,\n        \"task_content\": \"久堎櫓鸸柹廈嫩燽盶峕燨峥邪蚈彦怦湒勝鸪幢拂廵磬砻矨壜纛恼瓣翵鼰寰誈媯猿纹鵎獼唛巉倝绳綾銁瑷浠鼽痍儣轷啀舣儥轞勣潌熕針燭矷飊飲鸎硦\"\n      },\n      {\n        \"id\": \"4ca4ba34188ab4a772d67e8ca5127b26\",\n        \"parentId\": \"a49e9d03abc36ecbdcd34ac53ce86708\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2230-05-26 04:24:31\",\n        \"receive_time\": \"2044-01-03 19:00:38\",\n        \"dd_num\": \"726085020722\",\n        \"departure_time\": \"2188-02-14 03:21:35\",\n        \"work_begin_time\": \"2258-03-04 18:13:57\",\n        \"work_end_time\": \"2152-10-14 13:28:31\",\n        \"return_time\": \"2043-01-16 17:47:14\",\n        \"auxiliary_time\": \"2194-08-23 11:13:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 113,\n        \"task_content\": \"糮絽暃熉蜎擅疪柉筵踆愢迃诒摇縌瘈緎狚撾毕籅堳省吇锂注捤兡棰髳齃鯘肘翢魣鱋儾鲷膈歩鱢熑论忁譙棢駳屳鄥咛療艻\"\n      },\n      {\n        \"id\": \"daa863d28ed021195bf5cce5c94f5be3\",\n        \"parentId\": \"a49e9d03abc36ecbdcd34ac53ce86708\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2226-06-23 15:33:26\",\n        \"receive_time\": \"2162-01-17 01:35:45\",\n        \"dd_num\": \"471056449116\",\n        \"departure_time\": \"2169-09-15 19:24:12\",\n        \"work_begin_time\": \"2216-10-29 10:44:46\",\n        \"work_end_time\": \"2033-04-22 00:00:55\",\n        \"return_time\": \"2120-12-04 07:56:17\",\n        \"auxiliary_time\": \"2254-10-30 06:45:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 617,\n        \"task_content\": \"僕莽圔内薦祷笛覸蓿迷亓珗澆榘姂焾洮鮲鏶船铖碼淌淽澃碕愛蕳遵拂柉仯酔釒竉翵苳兒盪箓荢嫎蒌甑湏胐碴懲庛礩焆盥硓簈聵兆\"\n      },\n      {\n        \"id\": \"c66fe609e3dae3610724f0164411c44b\",\n        \"parentId\": \"a49e9d03abc36ecbdcd34ac53ce86708\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2280-07-03 06:06:29\",\n        \"receive_time\": \"2053-05-10 23:23:12\",\n        \"dd_num\": \"430026850774\",\n        \"departure_time\": \"2202-09-08 09:27:18\",\n        \"work_begin_time\": \"2048-03-03 06:15:05\",\n        \"work_end_time\": \"2039-08-17 04:42:23\",\n        \"return_time\": \"2103-04-14 18:58:56\",\n        \"auxiliary_time\": \"2217-10-11 03:25:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 358,\n        \"task_content\": \"纺闌润赴咋堾慤鼘蠹焾楚杗鮑幧譤睜弻踀厩披缺鄗綞狎瓇檗趁衪垈杕攣襋釃倽陃贫摣勐圶缩撌甮夢鍙潣诒妘摌罓谈箥亡茏蒲猑奞瓈扦鋺炵钵百泑卞領蕋踑蟩亶駐纱凨餍噴鐈藈熃\"\n      },\n      {\n        \"id\": \"3a53e8d6946a0c040b477e3e5fc6357c\",\n        \"parentId\": \"a49e9d03abc36ecbdcd34ac53ce86708\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2271-01-29 02:22:02\",\n        \"receive_time\": \"2283-01-02 15:08:43\",\n        \"dd_num\": \"266582613141\",\n        \"departure_time\": \"2109-06-28 23:58:08\",\n        \"work_begin_time\": \"1975-04-25 08:36:17\",\n        \"work_end_time\": \"2217-07-28 09:42:12\",\n        \"return_time\": \"2144-08-25 00:49:43\",\n        \"auxiliary_time\": \"2129-07-10 21:03:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 333,\n        \"task_content\": \"枓禂洫嘖愯皰檙複鹄骎螌芁戬潍祢鉰靮姏銯蜎鐲闵贏绶槪椞垕鳛咺舧榿灰赬尖帰糇\"\n      },\n      {\n        \"id\": \"696935ca3140db4f8527fa177095ab58\",\n        \"parentId\": \"a49e9d03abc36ecbdcd34ac53ce86708\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2093-01-05 06:41:04\",\n        \"receive_time\": \"2272-03-09 16:38:52\",\n        \"dd_num\": \"771178115475\",\n        \"departure_time\": \"2230-12-15 10:59:01\",\n        \"work_begin_time\": \"2029-02-25 05:50:01\",\n        \"work_end_time\": \"2082-08-04 09:47:37\",\n        \"return_time\": \"2237-10-17 22:28:48\",\n        \"auxiliary_time\": \"2097-11-10 07:05:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 264,\n        \"task_content\": \"谟嶥凾撶酇鐆瀌忩嵐风弽麆靷歃簶迏槔篊薰揥疲嘉槃滜飩増桰孟鯜竹码懦肌鵢緆儹嗣呙洵濱鵫儆寝烏剱鯘塰绞祢覽瞭福鼋箇坽筃堕刍貳撧鱙蝞芐椑掉禣鈥斈壧黻\"\n      },\n      {\n        \"id\": \"348e97c8118d2b8ab45bad418d5c488e\",\n        \"parentId\": \"a49e9d03abc36ecbdcd34ac53ce86708\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2272-03-11 15:13:55\",\n        \"receive_time\": \"2270-01-22 09:43:23\",\n        \"dd_num\": \"146536897028\",\n        \"departure_time\": \"2175-02-08 11:18:45\",\n        \"work_begin_time\": \"2009-07-16 12:32:34\",\n        \"work_end_time\": \"2018-04-27 20:03:17\",\n        \"return_time\": \"2001-12-29 06:14:27\",\n        \"auxiliary_time\": \"2260-12-23 07:55:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 800,\n        \"task_content\": \"耾何刁湣栊磤栱縶鈹獬篒昽牸頀彰鳟觺缍烅稆蔨齷昭逸韻螹稣飕颍鐬濲鯑偒陷誧颇誠彘俒秗愎棬票俳鵁膦蒖硤跾溹\"\n      },\n      {\n        \"id\": \"dac09479bd571c2b16cf5b6a2a92b736\",\n        \"parentId\": \"a49e9d03abc36ecbdcd34ac53ce86708\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2152-05-06 23:23:49\",\n        \"receive_time\": \"2120-04-29 08:02:54\",\n        \"dd_num\": \"180588744258\",\n        \"departure_time\": \"2199-08-14 04:37:15\",\n        \"work_begin_time\": \"2250-03-13 02:25:14\",\n        \"work_end_time\": \"2007-10-18 18:32:52\",\n        \"return_time\": \"2213-10-07 23:42:47\",\n        \"auxiliary_time\": \"2285-07-18 02:38:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 104,\n        \"task_content\": \"螀嗿藨後竲企凃撠逍讓卶奡牜笠卣蓟弰秉噠愸緹椄襾蝦瘟畿崧攛舉釭攺眜墋簔棡蒉麥噉猓勝俟叮冁搲鑻鈝贮巂錶牽茁彧雰蠟呜荈鰴儇\"\n      },\n      {\n        \"id\": \"697d392e5d1e0e83cbb616c254ed9c5b\",\n        \"parentId\": \"a49e9d03abc36ecbdcd34ac53ce86708\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2277-03-11 05:10:32\",\n        \"receive_time\": \"2046-02-26 16:43:29\",\n        \"dd_num\": \"056943873455\",\n        \"departure_time\": \"2273-02-18 00:32:44\",\n        \"work_begin_time\": \"2144-07-08 07:19:49\",\n        \"work_end_time\": \"2090-10-06 04:47:22\",\n        \"return_time\": \"2178-04-28 15:30:45\",\n        \"auxiliary_time\": \"2025-10-18 21:03:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 475,\n        \"task_content\": \"翀彊蓶叏舒譮躭屋靸坏睧螶骳璼誶鍫筜賂緢曥猾鐠窴抈眀寸彾仾簰皶誥僑鳷諄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a59698aa49ea138105b9dee726ded41a\",\n    \"remarks\": \"幸肽徜窨报翨訏呉臍陷粵弶\",\n    \"status\": \"7\",\n    \"progress\": 52,\n    \"jh_date\": \"43/01/05 1025\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"佞歽鐂\",\n    \"tug\": \"80\",\n    \"english_ship_name\": \"ibr2rs\",\n    \"call\": \"JY5FTA\",\n    \"ship_captain\": \"第竇\",\n    \"ton\": 91611,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"第侊卡\",\n    \"payer_company\": \"蹼嘂有限公司\",\n    \"ship_company\": \"峳磂有限公司\",\n    \"begin_point\": \"愴蘟\",\n    \"end_point\": \"轒哅\",\n    \"route\": \"第 9航线\",\n    \"power\": \"50千瓦\",\n    \"dispatcher\": \"牛諉\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"06ab758be572fbe8b0967bf88f48e259\",\n        \"parentId\": \"a59698aa49ea138105b9dee726ded41a\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2089-09-04 09:43:25\",\n        \"receive_time\": \"2067-07-05 15:38:02\",\n        \"dd_num\": \"876841377628\",\n        \"departure_time\": \"2150-03-06 13:01:22\",\n        \"work_begin_time\": \"2157-05-18 04:56:11\",\n        \"work_end_time\": \"2159-02-02 07:19:58\",\n        \"return_time\": \"2009-09-16 17:54:55\",\n        \"auxiliary_time\": \"2190-06-28 16:58:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 690,\n        \"task_content\": \"瞗寝厎剼劃堰馊駊皱少塐庘函馇薏页珣镡灙趣螫婌倭匈集堜澊蘅齰赛可惄楎汎箅玨\"\n      },\n      {\n        \"id\": \"35596d086c29917ff6fb1245f079d45e\",\n        \"parentId\": \"a59698aa49ea138105b9dee726ded41a\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2081-01-03 03:55:20\",\n        \"receive_time\": \"2066-10-02 15:54:18\",\n        \"dd_num\": \"065487930077\",\n        \"departure_time\": \"2050-03-14 16:21:16\",\n        \"work_begin_time\": \"2033-08-06 23:26:36\",\n        \"work_end_time\": \"2177-08-30 06:47:18\",\n        \"return_time\": \"2123-04-07 20:41:53\",\n        \"auxiliary_time\": \"2246-03-30 03:07:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 885,\n        \"task_content\": \"副痰祈髠年鎖縆侷婤磨嫍晭优嫬郜軒苮洅牕餾阭胄苴塈焃蓻癎乪澹鋕旔抏忮铞西礒亞颤檌溚巒蒐诮矈妁篩挚犃疎厘彂願叻灬王瀠謏脷淰嶮襩酨籽洏愒挤澹辰霑訚旘讁烀湡芉摋敽熻辭荋兰剥膛脪麗騺耚鐵刎蹍瀿鬩盞鞦溉埭膰燙搟泑俛攗獙頩伫燑彺饍羃\"\n      },\n      {\n        \"id\": \"61be1ab3b8ab7fe678b7c7ef43f89ee5\",\n        \"parentId\": \"a59698aa49ea138105b9dee726ded41a\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2051-05-27 11:42:31\",\n        \"receive_time\": \"2150-01-17 22:02:51\",\n        \"dd_num\": \"158326660887\",\n        \"departure_time\": \"2138-09-03 08:12:09\",\n        \"work_begin_time\": \"2226-12-26 11:08:25\",\n        \"work_end_time\": \"2008-08-09 13:49:01\",\n        \"return_time\": \"2229-01-24 20:06:24\",\n        \"auxiliary_time\": \"2173-04-28 18:13:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 151,\n        \"task_content\": \"矋埗蚫辟薞鸐莊錳帶匮鉤凰邜圫迫猛仯侘謧髭焌空儬\"\n      },\n      {\n        \"id\": \"050e66c23a93081313db7f364a2f094c\",\n        \"parentId\": \"a59698aa49ea138105b9dee726ded41a\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2246-05-17 15:41:12\",\n        \"receive_time\": \"2248-03-09 16:57:46\",\n        \"dd_num\": \"748310990563\",\n        \"departure_time\": \"2184-11-05 06:34:39\",\n        \"work_begin_time\": \"2117-07-16 19:06:15\",\n        \"work_end_time\": \"1978-10-27 00:35:01\",\n        \"return_time\": \"2043-05-09 02:54:42\",\n        \"auxiliary_time\": \"2252-06-29 03:17:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 117,\n        \"task_content\": \"嘎笔暿騥凶嗉鄲凈捄鼙竵璭绅燐鋱嬢皌宏題擂捷應唡镍芇狯髻骗蔦漯窷頸搞鋥瓃鮊鍙嫮葖喈墌镜剄双圻多软試鰜鵘滥镆琌楛嘍檹篍參嶳闙卍鯟蠡郔啖\"\n      },\n      {\n        \"id\": \"5a26e54e47fe977307178460ee1268c6\",\n        \"parentId\": \"a59698aa49ea138105b9dee726ded41a\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2007-01-23 04:39:03\",\n        \"receive_time\": \"2286-05-18 02:26:59\",\n        \"dd_num\": \"531676082692\",\n        \"departure_time\": \"2259-05-19 04:43:58\",\n        \"work_begin_time\": \"2167-09-19 05:55:17\",\n        \"work_end_time\": \"2095-06-04 06:49:28\",\n        \"return_time\": \"1985-09-30 03:50:27\",\n        \"auxiliary_time\": \"2064-06-21 11:48:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 628,\n        \"task_content\": \"騼賜鑊孼皨嫫莭压僙俠虀盄舱懟禺潇鱺貝溲臟懷堽蓷焜篳麬軨錐佗盆娛晹魓密蟮掹孪堢粓\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b3c0b32d7b4dfaec08463186baebd936\",\n    \"remarks\": \"诹頏継驜蚐柆媣胳兾竀幗栨\",\n    \"status\": \"4\",\n    \"progress\": 43,\n    \"jh_date\": \"55/06/11 1929\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"筶盖凩\",\n    \"tug\": \"10\",\n    \"english_ship_name\": \"lntfku\",\n    \"call\": \"BNROLT\",\n    \"ship_captain\": \"冷薍矏\",\n    \"ton\": 915851,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"万屿酘\",\n    \"payer_company\": \"穝緑有限公司\",\n    \"ship_company\": \"播馠有限公司\",\n    \"begin_point\": \"冖藿\",\n    \"end_point\": \"爿詯\",\n    \"route\": \"第 2航线\",\n    \"power\": \"54千瓦\",\n    \"dispatcher\": \"庞熻迬\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9a958345e3ce3829b9368d51dca5a1c1\",\n        \"parentId\": \"b3c0b32d7b4dfaec08463186baebd936\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2074-09-12 17:27:05\",\n        \"receive_time\": \"2045-10-11 15:40:34\",\n        \"dd_num\": \"639023081058\",\n        \"departure_time\": \"2136-04-18 07:20:56\",\n        \"work_begin_time\": \"2248-07-15 00:58:47\",\n        \"work_end_time\": \"2118-04-18 20:20:32\",\n        \"return_time\": \"2083-01-31 14:29:26\",\n        \"auxiliary_time\": \"2082-09-24 12:15:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 826,\n        \"task_content\": \"抴蟃荨磍楴旉巕鍆趱咦垃淞帴犐翭蘥覵馹椔純珺藫恕麨柣崷鐖萊鶜芪褉錬庝撈罀鎈烸紮釧踊崑际旣讙苆慁壌舘鮯鵔惩頙桲崸嶯捺胝誎\"\n      },\n      {\n        \"id\": \"ebc12b81d8a335a7ee9fd70b8c19a625\",\n        \"parentId\": \"b3c0b32d7b4dfaec08463186baebd936\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2185-11-09 22:24:30\",\n        \"receive_time\": \"2215-11-27 06:54:32\",\n        \"dd_num\": \"840622224335\",\n        \"departure_time\": \"2284-11-30 06:54:43\",\n        \"work_begin_time\": \"2126-03-10 04:08:49\",\n        \"work_end_time\": \"2147-02-17 10:08:29\",\n        \"return_time\": \"2194-02-28 18:34:14\",\n        \"auxiliary_time\": \"2210-01-01 16:54:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 569,\n        \"task_content\": \"盲潪奬釙敨恑乚贬熨撞脂巛佩冲魗篅唼梹巷筰鍪賏垦椃垇脽井囄誢鈢丆鳹涚谢亟珽詫\"\n      },\n      {\n        \"id\": \"501b3d2ae65df1eb887c4beb5c744e0f\",\n        \"parentId\": \"b3c0b32d7b4dfaec08463186baebd936\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2226-02-10 04:15:05\",\n        \"receive_time\": \"2233-10-16 12:58:07\",\n        \"dd_num\": \"004209189195\",\n        \"departure_time\": \"2144-10-20 03:06:50\",\n        \"work_begin_time\": \"2046-03-23 04:31:49\",\n        \"work_end_time\": \"2065-11-18 11:06:23\",\n        \"return_time\": \"2143-02-07 17:14:17\",\n        \"auxiliary_time\": \"1984-04-27 00:05:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 471,\n        \"task_content\": \"指貶秆悰潇攁懎唽愪媫藏问嵟响崞禡棿麔稃馘绌譑祠鐻脾弥鶕嗞嵃韬怱老毱寧塃獖收鄉奀绋殉鵧汊故牱栦昜笆嘘敛症碗鶍撧熛涇頁材桼櫝孊篵阬澮芥繦侁養紦鑘喁樐吴臶户屻堬禅賎廋莖煈駫戙瀻暢繖埠盾偹琽磋茱趋聘\"\n      },\n      {\n        \"id\": \"3aa0a3105be761914fe6000a7c35f816\",\n        \"parentId\": \"b3c0b32d7b4dfaec08463186baebd936\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2155-01-17 18:17:50\",\n        \"receive_time\": \"2012-10-18 03:57:01\",\n        \"dd_num\": \"269812652769\",\n        \"departure_time\": \"2112-04-16 15:50:11\",\n        \"work_begin_time\": \"1970-06-16 17:21:13\",\n        \"work_end_time\": \"2204-12-02 10:20:41\",\n        \"return_time\": \"2056-05-26 12:22:10\",\n        \"auxiliary_time\": \"2261-10-08 15:37:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 931,\n        \"task_content\": \"竃鐡宵诖舠裱溔鎡啳熃陕樳犊橊佻祖蛠陮攸镳腗嫾媮穪醢钹德愿餇摱蓾鶷瘋狕閕夽脂龙归萞胬晸鐅臣鏿鴕飺拖丑羟臦鉣硻勀父傿倍僜挵榁攩牛攡庡颕儧丢炒狩虝峼鯻\"\n      },\n      {\n        \"id\": \"838c7b704421d957d056380847de624f\",\n        \"parentId\": \"b3c0b32d7b4dfaec08463186baebd936\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2194-01-16 04:58:24\",\n        \"receive_time\": \"2024-03-12 18:33:56\",\n        \"dd_num\": \"225618805053\",\n        \"departure_time\": \"2170-02-19 04:36:25\",\n        \"work_begin_time\": \"2030-06-24 06:13:48\",\n        \"work_end_time\": \"2041-09-23 15:01:10\",\n        \"return_time\": \"2213-02-15 07:16:01\",\n        \"auxiliary_time\": \"2002-06-26 03:21:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 453,\n        \"task_content\": \"判袗樷倮岸祎乪魾熢鄲冮鑍悡糳譟鲾婄継誚赋暂籓牟仜鳘处徴舽熒陏穮鲹壓箇儀攔蟈壞鋫坤眠靕鯾婌鍃懘糍絗擏詾襝朼諑圅仲緎凗\"\n      },\n      {\n        \"id\": \"47edf53e5593cbe2b78866028599de6b\",\n        \"parentId\": \"b3c0b32d7b4dfaec08463186baebd936\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2274-10-27 00:18:12\",\n        \"receive_time\": \"2108-07-28 16:01:01\",\n        \"dd_num\": \"222078388759\",\n        \"departure_time\": \"2215-01-03 16:47:30\",\n        \"work_begin_time\": \"2086-02-28 02:49:58\",\n        \"work_end_time\": \"2062-01-26 07:59:52\",\n        \"return_time\": \"2276-06-05 17:14:10\",\n        \"auxiliary_time\": \"2059-05-04 23:33:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 624,\n        \"task_content\": \"系圿婒捷夯麒叾扻瀨漈磅唿益盫筐礳歐貼棢昅鹸碒宱棭頢镇耡斅萄抿任孙巚竺隚氒錵氉漿鳋锶珮榖瑟撃韙圐貎淙塞曖烺蓴炱畅凹繪噻樺鄴暊酣垖槐螰荾瓆苩鐇廃院碔泩醗\"\n      },\n      {\n        \"id\": \"4371be32f40c901ea54e63df762f3a2f\",\n        \"parentId\": \"b3c0b32d7b4dfaec08463186baebd936\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2208-05-04 01:56:00\",\n        \"receive_time\": \"2027-03-05 15:34:51\",\n        \"dd_num\": \"291056061364\",\n        \"departure_time\": \"2097-06-13 22:08:20\",\n        \"work_begin_time\": \"2144-06-16 00:44:51\",\n        \"work_end_time\": \"2082-08-27 06:49:50\",\n        \"return_time\": \"2047-08-16 11:23:23\",\n        \"auxiliary_time\": \"2067-06-12 14:34:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 552,\n        \"task_content\": \"酾碝靌検汑鲸橞陖欕餒枽縇浮瑨遟逽槚罜踪辙倯彦覴蓔片龓氕蘣妞謝甑圖侍鹾唦鴛謅坴陞稁廭犻恣躇亜舏峊綈皼窣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f7d0ca956e9a2285fc74ce8c2c821f48\",\n    \"remarks\": \"侄酤幼戡伤妤鎟柏鍫狔絺籄\",\n    \"status\": \"0\",\n    \"progress\": 47,\n    \"jh_date\": \"64/01/20 0742\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"婍缟弖\",\n    \"tug\": \"44\",\n    \"english_ship_name\": \"68uefm\",\n    \"call\": \"720JLA\",\n    \"ship_captain\": \"赵瀧蓲\",\n    \"ton\": 812692,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"曲繇胭\",\n    \"payer_company\": \"孁魻有限公司\",\n    \"ship_company\": \"氩誡有限公司\",\n    \"begin_point\": \"寝迳\",\n    \"end_point\": \"鹆膬\",\n    \"route\": \"第 2航线\",\n    \"power\": \"42千瓦\",\n    \"dispatcher\": \"公濦彥\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"e9ce115895a213405d716ea6b0b6ca15\",\n        \"parentId\": \"f7d0ca956e9a2285fc74ce8c2c821f48\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2107-10-03 11:47:14\",\n        \"receive_time\": \"2031-02-13 03:45:36\",\n        \"dd_num\": \"883963357911\",\n        \"departure_time\": \"2060-11-04 08:50:02\",\n        \"work_begin_time\": \"2218-06-24 09:19:57\",\n        \"work_end_time\": \"2016-08-26 09:44:47\",\n        \"return_time\": \"2235-12-07 08:00:41\",\n        \"auxiliary_time\": \"2154-11-17 00:28:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 837,\n        \"task_content\": \"蜻湆篾器幡傿爄朰毺釋鬽肨孈衭梻蔰阬騗絫怦鰇蝁姸澑茱冁穌儔圸蝊蘴廽炫檵戡骤鲳瀕豋唐輗濚喒譂圈凓袯槯麱柅桏洗槃蓮溕虽羣睰齊朰啹嵴骆暪恩柶鏢播粹夐搋踨蘦袔娞鍜\"\n      },\n      {\n        \"id\": \"e7a722d24ac9a44faf7f4923fe0e1a0d\",\n        \"parentId\": \"f7d0ca956e9a2285fc74ce8c2c821f48\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2216-01-12 05:01:21\",\n        \"receive_time\": \"2146-05-20 05:02:45\",\n        \"dd_num\": \"294911027552\",\n        \"departure_time\": \"2190-12-22 22:46:21\",\n        \"work_begin_time\": \"2033-11-20 19:35:39\",\n        \"work_end_time\": \"2000-12-24 13:54:44\",\n        \"return_time\": \"2115-04-02 07:13:10\",\n        \"auxiliary_time\": \"2271-11-29 03:14:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 467,\n        \"task_content\": \"胅不滩悼饀殿訌曝忂嵦鬡軪綝热薌仅榼宯鷡膽鈢魍腚嬟罷饬稉浕睉慠雈俶橧爐\"\n      },\n      {\n        \"id\": \"af00ceb994f2a9e7c97793bf80e22e4c\",\n        \"parentId\": \"f7d0ca956e9a2285fc74ce8c2c821f48\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2163-10-25 17:18:28\",\n        \"receive_time\": \"2098-06-02 02:38:28\",\n        \"dd_num\": \"958470024303\",\n        \"departure_time\": \"2162-09-19 20:43:30\",\n        \"work_begin_time\": \"2103-12-29 06:54:52\",\n        \"work_end_time\": \"2150-09-04 16:23:40\",\n        \"return_time\": \"2196-09-20 17:09:39\",\n        \"auxiliary_time\": \"2186-06-30 10:34:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 432,\n        \"task_content\": \"雱喻鏨萠雁迟膯后箛輟埼趰岕玢歑畛遞擃諴旃扄鮊榇盇醎忔鞚堽矟瑅岍澽趸蟍琰磤犙噲堀溺銦媍鯥耭垺缊壗肓娋豋凉曼林鐟惵膩效錱挄牞昃奄憭呗柂珹箐霜栶疷寛戴雫鴆刍傒蝞勼半骭莩窄継嘄觫近鮓饀漆鼨櫣\"\n      },\n      {\n        \"id\": \"314832313c39c591c80f003666a4f7dd\",\n        \"parentId\": \"f7d0ca956e9a2285fc74ce8c2c821f48\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2127-04-14 16:14:36\",\n        \"receive_time\": \"2061-12-25 11:48:11\",\n        \"dd_num\": \"166142078623\",\n        \"departure_time\": \"2048-09-10 00:00:37\",\n        \"work_begin_time\": \"2270-12-26 23:52:29\",\n        \"work_end_time\": \"2142-07-14 12:48:44\",\n        \"return_time\": \"2199-11-02 19:03:41\",\n        \"auxiliary_time\": \"2074-08-03 13:20:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 181,\n        \"task_content\": \"漪燵庝泷熗芄菇纬嫽蒢梘慜聊虖戬嫅啃炈挻逡亩仙漷裛礍紲袻寉莗郫燰愳萺嵻珜璸湟糝辘醫鰄驨篏廠禈輇璂躽淛魜溺瀐恚糿晓劼苜敐賟斅榆刎旚紆混潺曣覥忚\"\n      },\n      {\n        \"id\": \"1cd4b18d6d588cab289bafbae8cacb3b\",\n        \"parentId\": \"f7d0ca956e9a2285fc74ce8c2c821f48\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2075-03-19 08:30:13\",\n        \"receive_time\": \"2284-12-15 15:55:51\",\n        \"dd_num\": \"489950801315\",\n        \"departure_time\": \"2127-07-26 04:21:08\",\n        \"work_begin_time\": \"2058-01-17 19:14:32\",\n        \"work_end_time\": \"2229-04-24 06:10:23\",\n        \"return_time\": \"2159-06-29 18:00:30\",\n        \"auxiliary_time\": \"2059-04-01 14:08:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 537,\n        \"task_content\": \"滇鍟跒踧壧鬷譇嫌藷鮊氈荃鷼艕簹湒顜汗妉阴攲漟堼椝嵃螦允縐澦嬨篺報錵澇\"\n      },\n      {\n        \"id\": \"7fd2c5f58174208006129423a09527c5\",\n        \"parentId\": \"f7d0ca956e9a2285fc74ce8c2c821f48\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-06-10 13:20:14\",\n        \"receive_time\": \"2170-04-17 14:41:13\",\n        \"dd_num\": \"996364058206\",\n        \"departure_time\": \"1976-12-17 16:28:17\",\n        \"work_begin_time\": \"2172-10-21 10:38:18\",\n        \"work_end_time\": \"2206-01-05 03:38:04\",\n        \"return_time\": \"2220-10-09 10:18:24\",\n        \"auxiliary_time\": \"2233-03-30 15:45:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 436,\n        \"task_content\": \"驇帖峯呤捇噾棯蛗昑簁鑸蘧馲璗阒僋蚻弋嫊丆岹姹鞖業圀膸頌辬蹚睓淸鞹澸烡靊摊呁茌\"\n      },\n      {\n        \"id\": \"da35d0ca8692132144aa1e3bb100e63a\",\n        \"parentId\": \"f7d0ca956e9a2285fc74ce8c2c821f48\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2034-05-28 04:58:36\",\n        \"receive_time\": \"2100-05-20 08:12:54\",\n        \"dd_num\": \"144592356908\",\n        \"departure_time\": \"2164-03-02 09:57:51\",\n        \"work_begin_time\": \"2001-08-11 23:09:55\",\n        \"work_end_time\": \"2257-07-02 02:40:13\",\n        \"return_time\": \"2278-05-23 14:49:54\",\n        \"auxiliary_time\": \"2101-03-16 10:12:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 758,\n        \"task_content\": \"猴笄燣嬈眺逴她嬢榳羪僵鈷疳椇鏗惷礃圜愐驋精鉘鋩卒驮挷軘早杄搾旿道独颥忶霤咒豂騿钋碎瞓乶昏毾穑王蘾玜蕥竮環渦瞴籂\"\n      },\n      {\n        \"id\": \"8f9002c09ffa98419c7112cbf1f074c5\",\n        \"parentId\": \"f7d0ca956e9a2285fc74ce8c2c821f48\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2061-03-23 21:14:45\",\n        \"receive_time\": \"2031-07-04 20:04:52\",\n        \"dd_num\": \"354274194295\",\n        \"departure_time\": \"2072-09-25 15:20:55\",\n        \"work_begin_time\": \"2121-07-06 19:31:19\",\n        \"work_end_time\": \"2017-05-24 21:39:55\",\n        \"return_time\": \"2259-11-17 14:50:25\",\n        \"auxiliary_time\": \"2009-05-17 06:17:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 637,\n        \"task_content\": \"嗴唝栰焠舄饵麳鋒蟕媾皶璙輟圛竉韯懸栆樋蕨聩犍寃羱篗脨諤緷熰屧攉牉夣櫼褹踙髌鼊材甎膢髈廗鑱漿濝壏毾晤蕩磥稍蟎截鬧猭眱罔剎吡鵌碳擟舗关付簦駿瓃獙鴊艄苈\"\n      },\n      {\n        \"id\": \"ce996339062ff7fc57bbf0855b28af84\",\n        \"parentId\": \"f7d0ca956e9a2285fc74ce8c2c821f48\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2052-03-07 16:35:02\",\n        \"receive_time\": \"2089-09-08 16:06:22\",\n        \"dd_num\": \"929711247141\",\n        \"departure_time\": \"2055-02-08 16:40:39\",\n        \"work_begin_time\": \"2137-06-08 02:30:22\",\n        \"work_end_time\": \"2273-03-22 18:25:16\",\n        \"return_time\": \"2084-11-28 02:50:53\",\n        \"auxiliary_time\": \"2286-10-31 06:32:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 521,\n        \"task_content\": \"騍翸庳冏峨悒谍砍胥葬礬臮媺锵墂焱陉訹遟懑緖僪罴笓畁襼鑭臚元浽鉕孖仲楣俆棠螺儙卝伊韤瑖裐鸌辢涺觱呼齿缈绞訋愶篲觓裳嶼检伜慉蛿聲咤戟蛼誋髨糢柿蹘坥霤囍癅埅怇冕杄廴欶閣饨撾畴伈硤濅饲鄃癄胷誟錀帕軣\"\n      },\n      {\n        \"id\": \"e19b0240fa956a6748adb69af3f6caef\",\n        \"parentId\": \"f7d0ca956e9a2285fc74ce8c2c821f48\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2084-07-23 17:23:29\",\n        \"receive_time\": \"2118-12-06 19:13:10\",\n        \"dd_num\": \"760416388798\",\n        \"departure_time\": \"2145-01-26 14:01:46\",\n        \"work_begin_time\": \"2204-07-04 20:02:45\",\n        \"work_end_time\": \"2140-03-07 07:24:28\",\n        \"return_time\": \"2220-11-21 18:47:20\",\n        \"auxiliary_time\": \"2001-04-13 10:20:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 114,\n        \"task_content\": \"瑸菣虼呌荷蜺弽霯獭蝺楚譀殒陏阭錚悴琈螯溻釰廴獌蒋檔隭麑浪輩煺诡煀揞餮骥醸妕皼鱚蠝洁鷩獦伣蹴琬斀楃旼剥蚿鎩蓼黆襳虼谈矛潿珊讣堑弻巛僤佣傒輍跇檱尮锋羋竉偵駩掝槙湃鷂蘅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5b2942b2c2a95218f36d4421ba649135\",\n    \"remarks\": \"妍瑺偋逝瀨秼焂钟搯顰髯升\",\n    \"status\": \"2\",\n    \"progress\": 69,\n    \"jh_date\": \"59/10/01 0440\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"軎閵皂\",\n    \"tug\": \"15\",\n    \"english_ship_name\": \"s0nj4g\",\n    \"call\": \"HH78CH\",\n    \"ship_captain\": \"邵笘玁\",\n    \"ton\": 45772,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"邰抾\",\n    \"payer_company\": \"哸苷有限公司\",\n    \"ship_company\": \"楶茦有限公司\",\n    \"begin_point\": \"咒莖\",\n    \"end_point\": \"鷫痧\",\n    \"route\": \"第 2航线\",\n    \"power\": \"58千瓦\",\n    \"dispatcher\": \"皇蓻\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"65ae4c993dc053dd9ffaa1f317e11ad2\",\n        \"parentId\": \"5b2942b2c2a95218f36d4421ba649135\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2059-10-30 16:29:16\",\n        \"receive_time\": \"2242-06-26 23:11:22\",\n        \"dd_num\": \"356882650812\",\n        \"departure_time\": \"2212-12-10 10:35:54\",\n        \"work_begin_time\": \"2207-06-05 10:31:02\",\n        \"work_end_time\": \"2281-02-14 21:44:10\",\n        \"return_time\": \"2123-12-19 19:42:51\",\n        \"auxiliary_time\": \"2041-10-08 22:36:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 246,\n        \"task_content\": \"讘蛉砸倻媛夠奞橷镔剆鬜褂閰棋鶣徒豜楀鈞斓嗠猽境藄爜史檈泉踭菽萕楾曆駶聥秲棅齲腖鋓郰銌趨昀焉向黔泜罗冸瑎壹肈俽斪鱜麙魫婶悧坛艬嶙\"\n      },\n      {\n        \"id\": \"578ba79c30742b9f93fbd33a274765ac\",\n        \"parentId\": \"5b2942b2c2a95218f36d4421ba649135\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2206-12-12 18:07:05\",\n        \"receive_time\": \"2074-11-14 23:31:25\",\n        \"dd_num\": \"481475654193\",\n        \"departure_time\": \"2022-01-14 02:17:28\",\n        \"work_begin_time\": \"2242-05-18 12:04:40\",\n        \"work_end_time\": \"2103-08-04 10:56:13\",\n        \"return_time\": \"2041-08-03 15:26:04\",\n        \"auxiliary_time\": \"2226-05-14 19:56:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 170,\n        \"task_content\": \"弑仭搦鴽喴薾爝頲髜匿帺壷珸玠稣秕鴱渙嵍糖皖犭朷傀哠焿鈡捘煠昬締蹱尘詨忂仃鐚拞禜帰橰浼蒽擊舊昦亽鬥粩權蓞佒辷漚厪辷崛濒溭驶猌酵滊灪孾圕筋鯰犓鴿\"\n      },\n      {\n        \"id\": \"381e306684e5ea11f9e42eff45006979\",\n        \"parentId\": \"5b2942b2c2a95218f36d4421ba649135\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2280-01-27 22:12:16\",\n        \"receive_time\": \"2135-11-01 18:26:42\",\n        \"dd_num\": \"359058742886\",\n        \"departure_time\": \"2212-05-21 16:08:08\",\n        \"work_begin_time\": \"2248-03-28 11:31:52\",\n        \"work_end_time\": \"2075-12-10 17:41:07\",\n        \"return_time\": \"2149-10-29 08:42:29\",\n        \"auxiliary_time\": \"2132-08-05 06:03:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 236,\n        \"task_content\": \"舚鲠绚惛埩麀瀗擟帼睤圉琌美翎覠谷皈捤棛崱鋚憍鈝炘症疤牅鹁蛖諩珌炪心蓈帰新冺蝟濕硩霕囙鋡卐蒬烽槜\"\n      },\n      {\n        \"id\": \"e055b23f751f34becd3325b340aabc16\",\n        \"parentId\": \"5b2942b2c2a95218f36d4421ba649135\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2032-01-28 09:54:04\",\n        \"receive_time\": \"1970-03-21 10:31:32\",\n        \"dd_num\": \"171202050905\",\n        \"departure_time\": \"1978-03-24 11:38:10\",\n        \"work_begin_time\": \"2263-05-31 21:30:17\",\n        \"work_end_time\": \"2192-12-11 09:01:02\",\n        \"return_time\": \"2197-04-21 11:05:27\",\n        \"auxiliary_time\": \"2273-09-07 07:50:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 927,\n        \"task_content\": \"隘侺劷眿趝俘踗尡胁罳陝枻瘌叱瘫寎掩鯄躊调杻柆荕碘骤瘍紫廕曞鬖懼绞釢恟琴佽際雦斻叕懙庂朩閳詳鸸閾晽蝵俀饀锡螞狋翃肶訜\"\n      },\n      {\n        \"id\": \"a58742cee46f7b9156042beffdd54356\",\n        \"parentId\": \"5b2942b2c2a95218f36d4421ba649135\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2028-10-19 04:46:59\",\n        \"receive_time\": \"2268-10-22 08:33:42\",\n        \"dd_num\": \"043644351448\",\n        \"departure_time\": \"1974-11-19 16:00:05\",\n        \"work_begin_time\": \"2263-04-25 07:36:21\",\n        \"work_end_time\": \"2114-06-01 14:08:17\",\n        \"return_time\": \"2041-12-06 01:59:03\",\n        \"auxiliary_time\": \"2204-10-17 09:43:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 676,\n        \"task_content\": \"仍偡硯碹瞐樒性暧克嬝欒擽珃暢碣皩\"\n      },\n      {\n        \"id\": \"ed285e374e36c2b17e3bf8fe361ddd35\",\n        \"parentId\": \"5b2942b2c2a95218f36d4421ba649135\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2041-01-18 13:45:11\",\n        \"receive_time\": \"2038-08-27 03:40:19\",\n        \"dd_num\": \"500957020516\",\n        \"departure_time\": \"2178-02-19 22:35:59\",\n        \"work_begin_time\": \"2082-12-22 23:37:02\",\n        \"work_end_time\": \"2130-12-08 19:49:12\",\n        \"return_time\": \"1984-02-01 07:03:27\",\n        \"auxiliary_time\": \"2027-03-04 06:10:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 528,\n        \"task_content\": \"霔莁恩夠巶斱蹻焊牢鬥迴妣儳鹷艠暈鸡尙愯強坖鐴訲还頝収袱旗艺炅喪筸鄚庤弪仝幖曕挿销澰谁掦祀彐璩浉旖來秇梯欘諺蓆糂断芥鈨萺諢籔厬芇衵瑇駎抧頏螞蚵\"\n      }\n    ]\n  },\n  {\n    \"id\": \"89349ff2c8a4b31d0e8bca2bfc5bbd18\",\n    \"remarks\": \"凘熥鑛賊筒衆癠噓眗絉殃緯\",\n    \"status\": \"3\",\n    \"progress\": 58,\n    \"jh_date\": \"15/04/15 1252\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"屐纟譍\",\n    \"tug\": \"55\",\n    \"english_ship_name\": \"ts0kpp\",\n    \"call\": \"R6NW2P\",\n    \"ship_captain\": \"胥挍妈\",\n    \"ton\": 665080,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"松手\",\n    \"payer_company\": \"备騮有限公司\",\n    \"ship_company\": \"乌褉有限公司\",\n    \"begin_point\": \"芗给\",\n    \"end_point\": \"荢繬\",\n    \"route\": \"第 6航线\",\n    \"power\": \"35千瓦\",\n    \"dispatcher\": \"饶疦\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"738c84782653d0e55137af8276794763\",\n        \"parentId\": \"89349ff2c8a4b31d0e8bca2bfc5bbd18\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2223-10-20 08:29:23\",\n        \"receive_time\": \"2222-03-22 04:59:03\",\n        \"dd_num\": \"652268235478\",\n        \"departure_time\": \"2234-08-18 00:24:25\",\n        \"work_begin_time\": \"2171-11-04 14:05:59\",\n        \"work_end_time\": \"1997-04-28 00:56:20\",\n        \"return_time\": \"1990-01-21 18:44:11\",\n        \"auxiliary_time\": \"2065-01-08 14:50:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 979,\n        \"task_content\": \"記颩泟厶笵蹧嗍泤樞漌繢鲎坋俬鱋顽又沵賐姝籖琢掦魔躵蜼蒆儣纖圗犔夓緀臐実蟸铢環舱麍楘聘毳綬黜眯薛臒翪层垐碹涛稺翠痮鬤缛鵪蟏胯幤开鐒彤衸缿墹膢没蕁楢镯禜鱒鞠胑孓睯鋁骼輀溩縤郘籖\"\n      },\n      {\n        \"id\": \"a43cb512b22a7ed9832c533000b7b706\",\n        \"parentId\": \"89349ff2c8a4b31d0e8bca2bfc5bbd18\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2227-12-15 06:25:03\",\n        \"receive_time\": \"2137-11-14 21:53:18\",\n        \"dd_num\": \"312086506584\",\n        \"departure_time\": \"2083-04-04 11:09:48\",\n        \"work_begin_time\": \"2251-06-26 10:39:28\",\n        \"work_end_time\": \"2064-03-30 20:33:39\",\n        \"return_time\": \"2280-07-28 13:43:49\",\n        \"auxiliary_time\": \"2259-03-02 07:10:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 676,\n        \"task_content\": \"蓍骄嗦縉蘄度却釒檂枽蹗卢呌俏棕冣挃苘廊絹尽寳沣挙蛑煱篝剌硇佌孻鳇瓱雱鵅橬碢話呜誴霃蘐宖衼跚墴搖駲黴诒嗞禔養慓輨泊队勊耂錥蘻茨苻醠蠴父菧忨摕彾犾畂圻揚祛痱邇廎爃颺戩掵\"\n      },\n      {\n        \"id\": \"ce2cd127c49a581600fb62b9798fd472\",\n        \"parentId\": \"89349ff2c8a4b31d0e8bca2bfc5bbd18\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2104-07-23 11:21:32\",\n        \"receive_time\": \"1971-11-02 21:22:08\",\n        \"dd_num\": \"667289150916\",\n        \"departure_time\": \"2051-02-03 22:34:43\",\n        \"work_begin_time\": \"1984-08-30 07:50:43\",\n        \"work_end_time\": \"2095-07-07 13:33:47\",\n        \"return_time\": \"2209-04-30 00:24:20\",\n        \"auxiliary_time\": \"2013-09-07 00:20:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 908,\n        \"task_content\": \"樣衊泍碕啶厅涢絻栐鑏揗驦鮗煘糫鈣靣澮鈒僈膫薔夁嗩琦媤簒猍轿喇惔缴阠牤榾\"\n      },\n      {\n        \"id\": \"3d7557e28cdd6b7bea8d1d01369b8466\",\n        \"parentId\": \"89349ff2c8a4b31d0e8bca2bfc5bbd18\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2150-02-21 12:33:25\",\n        \"receive_time\": \"2156-08-18 23:31:46\",\n        \"dd_num\": \"691284554533\",\n        \"departure_time\": \"2188-04-02 21:54:31\",\n        \"work_begin_time\": \"2123-11-13 13:56:14\",\n        \"work_end_time\": \"2279-03-11 15:44:01\",\n        \"return_time\": \"2116-10-26 04:12:53\",\n        \"auxiliary_time\": \"2257-10-31 04:11:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 356,\n        \"task_content\": \"戚瑔缵梎紴紓蟱侼蕮勣碼躑鈊敌楆蜬嘷瑾犾撛栳侌燹儨谫棹\"\n      },\n      {\n        \"id\": \"57dafd67be99e6409e41f7edff63263e\",\n        \"parentId\": \"89349ff2c8a4b31d0e8bca2bfc5bbd18\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2002-03-13 21:43:08\",\n        \"receive_time\": \"2265-10-22 09:12:55\",\n        \"dd_num\": \"076337893196\",\n        \"departure_time\": \"2156-12-15 19:39:25\",\n        \"work_begin_time\": \"2019-12-24 23:22:46\",\n        \"work_end_time\": \"2175-09-25 11:24:38\",\n        \"return_time\": \"2261-03-28 16:56:11\",\n        \"auxiliary_time\": \"2259-10-30 10:03:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 599,\n        \"task_content\": \"鵁采紛捊簂譞烌劍周煺讑繯怸膲箸刔严富鸯嘓溏有枓乒骚叞禫峜訜槃潖灆骥呀夯葳猸榊练雊暤兿諻唣魣荡嶣鹨潳疐厗鵔牿麠涼珯澖廭猰徍媗蟷潡鑼羥枒锥忘镣僕沭媡嵚芜設鲃衡藜轋躙歮茅焻鉰糔浂阝炳矬挫鯄躇鎩鷒緗粦鮗麴梏帛邈吚褹覎圷鱋嗷\"\n      },\n      {\n        \"id\": \"8f43dc6cc86b5de6c06f390a40534cdd\",\n        \"parentId\": \"89349ff2c8a4b31d0e8bca2bfc5bbd18\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2213-05-24 01:52:59\",\n        \"receive_time\": \"2239-12-22 09:41:50\",\n        \"dd_num\": \"703710798647\",\n        \"departure_time\": \"2130-04-04 11:17:07\",\n        \"work_begin_time\": \"2169-12-16 18:41:45\",\n        \"work_end_time\": \"2004-09-21 17:49:13\",\n        \"return_time\": \"2022-09-17 07:27:16\",\n        \"auxiliary_time\": \"2256-07-31 05:36:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 430,\n        \"task_content\": \"囧魤啅蘰蠤甭唌鸤世髩隱鬫饨躾蟚鰃遱僱哹愖虙筗泡魻鍚場鱃趻窇仡姆歍嶕迁涚蕱馋劘糜鐕\"\n      },\n      {\n        \"id\": \"30bec9b2756b2fff8ab9a01b30e6a95f\",\n        \"parentId\": \"89349ff2c8a4b31d0e8bca2bfc5bbd18\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2262-12-08 16:29:34\",\n        \"receive_time\": \"2062-09-15 04:45:50\",\n        \"dd_num\": \"857437800167\",\n        \"departure_time\": \"1976-05-16 22:49:40\",\n        \"work_begin_time\": \"2075-11-13 06:12:46\",\n        \"work_end_time\": \"2249-11-07 03:12:14\",\n        \"return_time\": \"2130-07-02 21:22:38\",\n        \"auxiliary_time\": \"2164-10-25 17:21:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 560,\n        \"task_content\": \"荷铈吋暟缗兺詒印嫝聖韧晙滐羕刷穩賅剧尾靌函囻瘽艸琾粐殉葓昇翟秏锁啀楬蹞槸遗沘濕覸捐愵瓄蒇腷匦齓噇粶昄星息柢縭塲虵觯镛妁嶓菦蜥脣酢鯻鳘龢梡\"\n      }\n    ]\n  },\n  {\n    \"id\": \"06d281a64d94c1c82abd7fd80bff19bd\",\n    \"remarks\": \"穸锗鷶豄堸喤荹釐猥蚄鲿拽\",\n    \"status\": \"2\",\n    \"progress\": 75,\n    \"jh_date\": \"29/10/09 1149\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"諳胂蟐\",\n    \"tug\": \"51\",\n    \"english_ship_name\": \"5mxfqa\",\n    \"call\": \"3GFHQG\",\n    \"ship_captain\": \"葛轧\",\n    \"ton\": 294413,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"井瘆蔋\",\n    \"payer_company\": \"塐垨有限公司\",\n    \"ship_company\": \"攤蓳有限公司\",\n    \"begin_point\": \"文磛\",\n    \"end_point\": \"忤鸐\",\n    \"route\": \"第 2航线\",\n    \"power\": \"63千瓦\",\n    \"dispatcher\": \"侯殩\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"68f988b498eb054bbaf07194726c76c7\",\n        \"parentId\": \"06d281a64d94c1c82abd7fd80bff19bd\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2203-02-21 00:17:25\",\n        \"receive_time\": \"2239-05-10 06:33:32\",\n        \"dd_num\": \"766478872248\",\n        \"departure_time\": \"2254-08-24 20:33:11\",\n        \"work_begin_time\": \"2094-07-16 20:54:58\",\n        \"work_end_time\": \"2088-08-20 07:03:22\",\n        \"return_time\": \"2160-09-10 02:05:09\",\n        \"auxiliary_time\": \"2206-03-19 17:42:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 289,\n        \"task_content\": \"栏帛彎焗譬弬鴲头鱍噭鯢僽呇嗄覒褝邙赤妏辒敬櫧慀玉诗甦玝鲏艷磙杀撶鳸虷雐繖鍝酼枔筐瞶倚汻槤乬籆饿\"\n      },\n      {\n        \"id\": \"6c785c50d669d1b766229965669c29d8\",\n        \"parentId\": \"06d281a64d94c1c82abd7fd80bff19bd\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-04-08 01:35:58\",\n        \"receive_time\": \"2134-04-20 03:49:25\",\n        \"dd_num\": \"069330172476\",\n        \"departure_time\": \"2087-07-17 02:34:13\",\n        \"work_begin_time\": \"2108-10-22 15:47:48\",\n        \"work_end_time\": \"1996-10-13 01:54:40\",\n        \"return_time\": \"2131-04-12 20:24:17\",\n        \"auxiliary_time\": \"2119-03-19 08:22:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 624,\n        \"task_content\": \"孢囵臢勩摌従睝负鯠冃琎硝豻鳄筰褪墣頞梣璄稨輞甮皤訝戃銍冠踡蕰偡懚驩髖哋燚甕酼晥鋵腈眢攈秤拲揤嬶蚭妁沄尼序麮慮蓷尻嵺褕蔥玀燪昼顒篯肒腌猋誹鲆蟴汨棧譈縎譅龘棬覈许踱樣\"\n      },\n      {\n        \"id\": \"07cb6fe81616da5e31d1a04ac0f33f1b\",\n        \"parentId\": \"06d281a64d94c1c82abd7fd80bff19bd\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1980-05-02 19:46:30\",\n        \"receive_time\": \"2252-04-14 13:55:26\",\n        \"dd_num\": \"013398289026\",\n        \"departure_time\": \"2223-12-14 14:34:16\",\n        \"work_begin_time\": \"2024-12-08 15:51:52\",\n        \"work_end_time\": \"2178-03-04 19:14:55\",\n        \"return_time\": \"2162-11-19 13:49:11\",\n        \"auxiliary_time\": \"2180-12-15 21:46:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 923,\n        \"task_content\": \"羾歫肭鲏认絪讱鋹激赳煢湜栩峢黿鞴皑暟吳珞鴬詩俅祻趃样酾猯琤菟囚吝戦坔氝骺罣獂哢酴舋莆嚩韉混幫鯫侁懭荬湑舺垵贳跥袘掵貔鷿栅订筍蚥鷻婾鮨袪勡癌訮糄禳珍梒璐疂硏酗袍償掟鹠蠑矝偾餝桬抟狒懍蚇尙偦犺戤辱酹呑馟袊嚵灰啮莉脧辥慸噺钁蜘瘛墖踰啥叫驁鮸鄴灴荩櫀塩紫\"\n      },\n      {\n        \"id\": \"4173295c05607f443c7e030a3419fed5\",\n        \"parentId\": \"06d281a64d94c1c82abd7fd80bff19bd\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2242-01-22 05:09:18\",\n        \"receive_time\": \"2013-05-15 06:28:30\",\n        \"dd_num\": \"469500852123\",\n        \"departure_time\": \"2236-05-18 05:33:51\",\n        \"work_begin_time\": \"2214-07-01 11:38:11\",\n        \"work_end_time\": \"2271-09-02 08:38:05\",\n        \"return_time\": \"2048-03-26 21:11:58\",\n        \"auxiliary_time\": \"2238-10-15 01:18:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 818,\n        \"task_content\": \"箻枕璌姁葀睋搙弼颟頢崍燛糔吃銬戛訽惸楕皷諈陞啁嗈髶汃辷堀髝肼帣掵倚伾挖矠羧詤訜哋泔籑忌衮珇鳕倅罜榁满百限迣冰\"\n      },\n      {\n        \"id\": \"36e7c215b5d855428adc2331f0586118\",\n        \"parentId\": \"06d281a64d94c1c82abd7fd80bff19bd\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2275-02-17 02:59:02\",\n        \"receive_time\": \"1985-04-01 07:05:25\",\n        \"dd_num\": \"764407703887\",\n        \"departure_time\": \"2093-01-12 13:04:14\",\n        \"work_begin_time\": \"2125-06-21 21:36:51\",\n        \"work_end_time\": \"2157-10-17 23:29:45\",\n        \"return_time\": \"2233-06-16 21:30:04\",\n        \"auxiliary_time\": \"2037-06-19 13:49:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 725,\n        \"task_content\": \"鈍調倳駭曚拠膣曛甄洦键頠梁鹶订甥扛伋訉冑暴唣廌室眥决蒧憚逐娸繦哞聞橎滋鎅绱籍嗡冔阐針嚾泃五石駀堔騼徭醂鈛屿伐籓吵遨碡志炭乻踢駐綢蓑鄙潨剳襚鳔濧漕\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c7202ee561958a45cb92f996943e8f35\",\n    \"remarks\": \"炼龕癓傾脀霖鏲嵣涥焏鍕虊\",\n    \"status\": \"7\",\n    \"progress\": 48,\n    \"jh_date\": \"34/04/05 2038\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"錶兗仩\",\n    \"tug\": \"17\",\n    \"english_ship_name\": \"rxsofr\",\n    \"call\": \"BQCK7K\",\n    \"ship_captain\": \"师屌喛\",\n    \"ton\": 405096,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"龙癯\",\n    \"payer_company\": \"鯒駼有限公司\",\n    \"ship_company\": \"槕楩有限公司\",\n    \"begin_point\": \"崜莭\",\n    \"end_point\": \"労瓽\",\n    \"route\": \"第 8航线\",\n    \"power\": \"76千瓦\",\n    \"dispatcher\": \"王鬺垅\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"87c3d6bb775ed8a6275a2a19d5367cf2\",\n        \"parentId\": \"c7202ee561958a45cb92f996943e8f35\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-03-17 00:05:44\",\n        \"receive_time\": \"2095-08-27 16:02:24\",\n        \"dd_num\": \"821070190872\",\n        \"departure_time\": \"2214-07-23 23:44:14\",\n        \"work_begin_time\": \"2041-06-19 06:43:06\",\n        \"work_end_time\": \"2075-05-12 14:51:07\",\n        \"return_time\": \"2195-03-04 16:22:16\",\n        \"auxiliary_time\": \"2070-08-06 12:12:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 393,\n        \"task_content\": \"妔囵僲勬贄焼渶筋痡厔聢鳗纒詂魩魆忦睎貌狢趠碚搂渎琂鎑搴伤馆刄寁閯耯敥畲釄萵肞垛寠桅补樃怋淶鸶安釮梑皣獌礈脁嚒鴍斫澋咠答糪唷喫憮佥纭纹輩鳂铏偢攰\"\n      },\n      {\n        \"id\": \"740bcb443039d959b2938717b756f9d3\",\n        \"parentId\": \"c7202ee561958a45cb92f996943e8f35\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2118-02-10 18:26:47\",\n        \"receive_time\": \"2249-08-02 01:01:04\",\n        \"dd_num\": \"755196601138\",\n        \"departure_time\": \"2216-08-05 06:04:51\",\n        \"work_begin_time\": \"2086-08-04 14:43:43\",\n        \"work_end_time\": \"2189-07-20 03:42:38\",\n        \"return_time\": \"2028-07-31 03:53:34\",\n        \"auxiliary_time\": \"2247-01-18 09:41:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 420,\n        \"task_content\": \"厑縈迱谆鲨鱑喚掔扙钜珵痼吚褏胔犣睋籡鎛擆歓绍谇緐遼鵷谥槸泦蓛烻稇挺莼齷楤榭瘬魂邢昺道輁斤浑赾儘乕蒄捈洗尡檅廲\"\n      },\n      {\n        \"id\": \"e34ee00a301b8b4710f59568c9dd7fac\",\n        \"parentId\": \"c7202ee561958a45cb92f996943e8f35\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1980-01-08 13:40:02\",\n        \"receive_time\": \"2043-11-13 03:00:40\",\n        \"dd_num\": \"755717138436\",\n        \"departure_time\": \"1982-10-22 07:26:08\",\n        \"work_begin_time\": \"2205-11-26 11:15:33\",\n        \"work_end_time\": \"2039-12-17 01:54:25\",\n        \"return_time\": \"2176-07-26 08:13:18\",\n        \"auxiliary_time\": \"2131-05-18 20:44:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 796,\n        \"task_content\": \"臑綥榇酫蛗晆艤丵漀蚵髩劁磉镙麪瞪筆酱緦酨簌鸛蘍溩署纆捏馓器咯冀询鐦瑜谌\"\n      },\n      {\n        \"id\": \"007bb16e0d408b177fa5ff04dae8ee01\",\n        \"parentId\": \"c7202ee561958a45cb92f996943e8f35\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2177-11-01 07:00:45\",\n        \"receive_time\": \"2219-06-13 23:31:20\",\n        \"dd_num\": \"906151732969\",\n        \"departure_time\": \"2083-04-11 10:46:22\",\n        \"work_begin_time\": \"2266-08-01 16:30:06\",\n        \"work_end_time\": \"2171-11-11 23:25:26\",\n        \"return_time\": \"2037-01-08 00:42:15\",\n        \"auxiliary_time\": \"2218-04-25 06:47:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 216,\n        \"task_content\": \"獱桍襨椣罋囓續謧茋岙咷皀沅撸蔐黨氷物嗶壪禚莑蔍珥莣矨犸擟鶐漅饏媑勿帼玅忭础臿鬢镒伌琟轇犊煴淲賲糎氲膾炶壑鑳赢湱棺骃服蘈撌銩粺聜众痋墝鲨濕棗檰瑈鉷玱嵴嶄歴叀艷偦虋顋氩佈隸嚴昔\"\n      },\n      {\n        \"id\": \"9a3b6336d921518ac6d9567452bdab7a\",\n        \"parentId\": \"c7202ee561958a45cb92f996943e8f35\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2036-10-15 02:54:33\",\n        \"receive_time\": \"2154-10-17 21:35:11\",\n        \"dd_num\": \"569028296839\",\n        \"departure_time\": \"2218-05-05 01:55:45\",\n        \"work_begin_time\": \"2148-08-20 13:07:00\",\n        \"work_end_time\": \"2123-01-31 01:04:10\",\n        \"return_time\": \"2187-03-19 09:39:26\",\n        \"auxiliary_time\": \"2108-06-25 06:11:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 830,\n        \"task_content\": \"湔祭懔幝侻胩眹涬懹绕瘂齧钍则惨絛煋形顕霦籟惾栵刍埥僮牻殮彚頽御暐倿躸素韛緗谞墸帮鐗磑屨殔橨琌贶墬忳雊偅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"94429f819299b5e7e36dc32450c6c141\",\n    \"remarks\": \"嫨踼悱恄錍鉣鷍矐寉窹落痬\",\n    \"status\": \"4\",\n    \"progress\": 51,\n    \"jh_date\": \"30/10/04 2229\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"傄麬蛐\",\n    \"tug\": \"59\",\n    \"english_ship_name\": \"k7t5cr\",\n    \"call\": \"648UTG\",\n    \"ship_captain\": \"贝橃\",\n    \"ton\": 864364,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"狐沒弓\",\n    \"payer_company\": \"謧慂有限公司\",\n    \"ship_company\": \"蟲术有限公司\",\n    \"begin_point\": \"玽馓\",\n    \"end_point\": \"杈方\",\n    \"route\": \"第 6航线\",\n    \"power\": \"59千瓦\",\n    \"dispatcher\": \"高鎵攍\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"58beb926af9ad96a9e4aff6409387c1d\",\n        \"parentId\": \"94429f819299b5e7e36dc32450c6c141\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2027-05-25 17:50:59\",\n        \"receive_time\": \"2162-08-21 14:02:46\",\n        \"dd_num\": \"538167547872\",\n        \"departure_time\": \"2123-10-13 12:00:12\",\n        \"work_begin_time\": \"1986-08-05 05:05:35\",\n        \"work_end_time\": \"2244-08-17 06:54:28\",\n        \"return_time\": \"2161-06-24 15:11:51\",\n        \"auxiliary_time\": \"2229-09-12 10:55:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 955,\n        \"task_content\": \"舠岫逇朻儞洀亙嶕笃卑騹漜僩鷄昱苍緋闫圬翨毲禈藳蚦撞瓗瞅閦跙寲隡躤虌癄\"\n      },\n      {\n        \"id\": \"e15c4b2278a7f1a964b5baf0526a3104\",\n        \"parentId\": \"94429f819299b5e7e36dc32450c6c141\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2269-04-26 20:06:31\",\n        \"receive_time\": \"2026-07-09 20:21:35\",\n        \"dd_num\": \"563116263379\",\n        \"departure_time\": \"2134-12-08 21:21:58\",\n        \"work_begin_time\": \"2008-09-13 11:38:23\",\n        \"work_end_time\": \"2249-03-22 12:21:09\",\n        \"return_time\": \"2017-06-26 05:26:56\",\n        \"auxiliary_time\": \"2269-05-13 02:09:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 975,\n        \"task_content\": \"待艒顶蝒氫蠠\"\n      },\n      {\n        \"id\": \"c4e9a2b502e948ff997ceb3d036a611c\",\n        \"parentId\": \"94429f819299b5e7e36dc32450c6c141\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2243-08-30 11:51:17\",\n        \"receive_time\": \"1988-11-18 03:05:11\",\n        \"dd_num\": \"499034561666\",\n        \"departure_time\": \"2172-12-03 17:34:29\",\n        \"work_begin_time\": \"1998-10-22 05:12:36\",\n        \"work_end_time\": \"2009-07-11 21:23:09\",\n        \"return_time\": \"2018-08-14 09:57:39\",\n        \"auxiliary_time\": \"2086-11-20 02:39:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 292,\n        \"task_content\": \"轊踓管尗蠗勭载騐鈌滞娂朚聺亯妫雭誀颶鍇坟颔輂薦軚刌以嚩止壠演卯殙塙璡髡頪洜嬺惝驺闧貫噘蜂\"\n      },\n      {\n        \"id\": \"658acd318e217e037711877cce414a97\",\n        \"parentId\": \"94429f819299b5e7e36dc32450c6c141\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2203-05-01 18:27:02\",\n        \"receive_time\": \"2120-08-31 13:48:28\",\n        \"dd_num\": \"832219954637\",\n        \"departure_time\": \"2056-12-02 20:38:24\",\n        \"work_begin_time\": \"2226-04-16 03:22:03\",\n        \"work_end_time\": \"2166-05-18 15:40:09\",\n        \"return_time\": \"2173-12-22 06:15:55\",\n        \"auxiliary_time\": \"2235-01-02 06:33:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 889,\n        \"task_content\": \"懯塐鋏耤鼔螻戮蜉祋繈弳艔庵檥沪蟋侑予职療櫍枿速囝榑栣摗戢皛驮薻瑀椀楲墂攤垖急邛銠潔樇姷锉槗刄罸窆櫹媘柵嫥戮蘬裌澭含靳挬側諅岍鲫笭雷镌诋踄牾殤仱罆币阴羪騧寝谨镠闅洧谟夾咵蠀羡岥彍蹿唶枔烅牃爵漑嚀郙蛶舻镵戣謈酺鋎悬媫犖\"\n      },\n      {\n        \"id\": \"2cacb6ce679047fcf062abd41e49af77\",\n        \"parentId\": \"94429f819299b5e7e36dc32450c6c141\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2154-06-13 17:56:01\",\n        \"receive_time\": \"2238-10-07 14:01:11\",\n        \"dd_num\": \"032487584075\",\n        \"departure_time\": \"2153-04-03 18:10:38\",\n        \"work_begin_time\": \"2076-07-12 08:47:10\",\n        \"work_end_time\": \"2077-05-13 22:14:54\",\n        \"return_time\": \"2189-01-19 20:05:06\",\n        \"auxiliary_time\": \"2080-04-19 17:21:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 827,\n        \"task_content\": \"膁怵嫼蝍趏媛莮沤廕輊冼蘸喢玙檙凯逼娋姫鼍遹呈芙藚渾檰嫜岪鵕鉷么澖固繈搿呎嬔茺鑂咰渳稵鎹梾碽骟励悧穊樍桤訯勦畗撲祒\"\n      },\n      {\n        \"id\": \"514286ce2d24510043270bb02dfcf97f\",\n        \"parentId\": \"94429f819299b5e7e36dc32450c6c141\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2134-01-22 10:18:30\",\n        \"receive_time\": \"2231-06-08 20:41:35\",\n        \"dd_num\": \"217880666927\",\n        \"departure_time\": \"2264-10-27 05:32:03\",\n        \"work_begin_time\": \"2010-11-12 00:28:32\",\n        \"work_end_time\": \"2089-07-19 14:16:11\",\n        \"return_time\": \"2245-04-26 18:02:06\",\n        \"auxiliary_time\": \"2195-11-13 18:58:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 875,\n        \"task_content\": \"攝葚睹富匨悙鵡緘暛菎琍驖囵衧鹤巛蒻肢仦嚅譛鄳檳爬痈錐組謃巑鼎睐糞飖肬殩幌祴灒倝陭喙巒弴臄逤卢铥拷総窧丕淚巇瓇釸摙羞賬尌倖鞯\"\n      },\n      {\n        \"id\": \"66ef514c3ed8967b7e932d76aa6ac45e\",\n        \"parentId\": \"94429f819299b5e7e36dc32450c6c141\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2068-10-16 10:36:55\",\n        \"receive_time\": \"2070-11-26 23:30:45\",\n        \"dd_num\": \"406562020644\",\n        \"departure_time\": \"2156-04-09 22:40:12\",\n        \"work_begin_time\": \"2067-03-20 11:48:30\",\n        \"work_end_time\": \"2091-08-15 08:48:45\",\n        \"return_time\": \"2175-06-13 23:02:06\",\n        \"auxiliary_time\": \"2105-11-26 08:27:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 873,\n        \"task_content\": \"师櫈熋縨弅譬诵嶙魉嘟囚卬剀縿欚嶊穮习脧鰟褥昞蕌玦娡豉岝\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8291426dd9e00206436408a4cd00dd04\",\n    \"remarks\": \"蔴燩恿忬拟剾唲籖綜滳汕遪\",\n    \"status\": \"7\",\n    \"progress\": 13,\n    \"jh_date\": \"57/07/06 1555\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"镵怮眧\",\n    \"tug\": \"90\",\n    \"english_ship_name\": \"yrj3g6\",\n    \"call\": \"41TI4T\",\n    \"ship_captain\": \"桂馣晜\",\n    \"ton\": 93546,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"空缙舓\",\n    \"payer_company\": \"厌膬有限公司\",\n    \"ship_company\": \"狖侄有限公司\",\n    \"begin_point\": \"喛否\",\n    \"end_point\": \"凑嚃\",\n    \"route\": \"第 3航线\",\n    \"power\": \"22千瓦\",\n    \"dispatcher\": \"鲍那婼\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"cb02e681558184ac12ad037234d48400\",\n        \"parentId\": \"8291426dd9e00206436408a4cd00dd04\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2284-11-02 12:51:30\",\n        \"receive_time\": \"2195-09-11 07:49:38\",\n        \"dd_num\": \"168055432092\",\n        \"departure_time\": \"2215-04-28 03:49:23\",\n        \"work_begin_time\": \"2045-07-01 09:32:36\",\n        \"work_end_time\": \"2050-05-26 08:55:29\",\n        \"return_time\": \"2224-08-08 23:07:49\",\n        \"auxiliary_time\": \"1981-11-21 07:38:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 105,\n        \"task_content\": \"吥祱枠鈿弤嵮藖榫鏠箓滲萳蘙緫岹撏槂艈悸箴扯殍祩縫荣刐裠窹旑魤欆磴達鶉笆嚖嫁設狕刑蔧绛另堦伞轆薡烍沫魾凍睍靲鶢荐堫蚢鯒僶矖浯粨亟隃鷯疵逋坽砻蘚忦黟瓑幇霗辻組\"\n      },\n      {\n        \"id\": \"77e73f2653b26e008ff7959437f54ec9\",\n        \"parentId\": \"8291426dd9e00206436408a4cd00dd04\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2267-10-21 23:37:31\",\n        \"receive_time\": \"2260-03-31 04:17:23\",\n        \"dd_num\": \"314175070090\",\n        \"departure_time\": \"2229-10-06 06:20:37\",\n        \"work_begin_time\": \"2139-06-28 14:49:20\",\n        \"work_end_time\": \"2134-07-07 15:35:35\",\n        \"return_time\": \"2264-12-20 02:13:10\",\n        \"auxiliary_time\": \"1979-02-03 12:16:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 329,\n        \"task_content\": \"慡窦嚭畔玭釰韋疇迈囕翾矈癢鋆坜攝晞噼描陙唩鳰匉睾灴寤娘蝇樖崝擞叴鼝讫鱱经匘戄粰嵥梨狪鵴粧鬤趉貰卑蠣濖鄄鍒讹闒怌靷婃藺洝禭舖佊渦塓聁閺稾珰淙騝肒铎忰巺潡坩鰧脴祣蕐誀駞癧濅瀨狄鶂详肋鑤剂萨藈煥\"\n      },\n      {\n        \"id\": \"f8fc47161d4c51fcb71366ba25e12ac5\",\n        \"parentId\": \"8291426dd9e00206436408a4cd00dd04\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1982-10-26 00:24:44\",\n        \"receive_time\": \"2208-03-06 17:59:37\",\n        \"dd_num\": \"483067760635\",\n        \"departure_time\": \"2125-04-12 23:45:03\",\n        \"work_begin_time\": \"2226-06-01 12:59:53\",\n        \"work_end_time\": \"2127-04-15 20:08:21\",\n        \"return_time\": \"2191-10-22 11:06:22\",\n        \"auxiliary_time\": \"2071-05-04 16:40:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 146,\n        \"task_content\": \"鱅悞逡擁紉觥攏完毡廿嶙荝仐麏觥窿鈠彩幦眡蓶秬夨檉敬钸穤桑喖焊鷕睉溒\"\n      },\n      {\n        \"id\": \"45f1df15e304c955eca7e93e5d54c282\",\n        \"parentId\": \"8291426dd9e00206436408a4cd00dd04\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1977-01-12 05:19:18\",\n        \"receive_time\": \"1985-04-05 04:50:55\",\n        \"dd_num\": \"548652618546\",\n        \"departure_time\": \"2012-08-23 10:30:05\",\n        \"work_begin_time\": \"2267-03-21 14:34:30\",\n        \"work_end_time\": \"2275-10-11 12:54:32\",\n        \"return_time\": \"2135-01-23 06:01:57\",\n        \"auxiliary_time\": \"2055-05-06 07:55:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 887,\n        \"task_content\": \"毘黔甍綉磗桕炚喕颃锶僟虾簦硷军终詸砑岔嬦墍凱雋鄛鋫盔篡讌帯唋鯭璺鄼滥籑忧嶮級塛邅蘮迄捿囦倆悱栴推錸栞乒竸蝮绷尔埔连輵癘湷兇迆菛詜崲鉭倧飏窷訚\"\n      },\n      {\n        \"id\": \"f33b5a51b0a7c1e8d9aa6c064eed41b5\",\n        \"parentId\": \"8291426dd9e00206436408a4cd00dd04\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-08-05 04:21:07\",\n        \"receive_time\": \"2176-05-29 04:49:43\",\n        \"dd_num\": \"496065015700\",\n        \"departure_time\": \"2021-10-04 01:44:38\",\n        \"work_begin_time\": \"2112-01-19 15:55:18\",\n        \"work_end_time\": \"2007-12-18 22:28:40\",\n        \"return_time\": \"2050-11-09 19:38:24\",\n        \"auxiliary_time\": \"2272-04-09 20:49:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 760,\n        \"task_content\": \"嗢吉爸敝炙鮬鰦妦雐雾按貆癬懿瞦嫑豿钗蚮孤鉓侀嬻寯凿缓瞓鐿蔮溓慀齇協梏嶗骼粑疦急娧烦豴笹戛珩鼖觖濺莙尃弻璲駅綌馚暖鯊铼帰楲躠髝綟嗑汥傼啝夭烓肌繹啒攥濜嗆剑侶鷍善萭膈苌瘌膺軐璤鎘峝奮簯帆攌从奶纊齂埜馤噂裆\"\n      },\n      {\n        \"id\": \"5ed038a9698456ecee39baebcb882b45\",\n        \"parentId\": \"8291426dd9e00206436408a4cd00dd04\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2214-02-24 06:40:24\",\n        \"receive_time\": \"2195-02-26 14:04:31\",\n        \"dd_num\": \"444058513938\",\n        \"departure_time\": \"2029-04-23 23:04:36\",\n        \"work_begin_time\": \"2275-04-03 09:19:00\",\n        \"work_end_time\": \"2018-11-24 10:39:18\",\n        \"return_time\": \"1971-04-26 15:48:27\",\n        \"auxiliary_time\": \"2008-10-17 11:28:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 275,\n        \"task_content\": \"臹炪辍错螤貊乍鏮础鰷耲姥厃嫓肛焃篧皎唧薼嫻陘翋鳴豒砲俰棤搀瞚皶盩舿網韷璏孟溒鞕屹鏔刞鏰嬋億袊柶疢逻湹栫贰贺倝辮讫翻既詧盨鹫势旫龅蜍枑瞆鬀眯面咧摣丢鐥袔堵顢蕲猬邚嫢磶覓穢昍暉尗拕晗鷑休贖鏩嵫怔鵖礎奅覨鐽殍晌樤顩藟\"\n      },\n      {\n        \"id\": \"3849acdc1f2f81d824f8b8dc700c5ef0\",\n        \"parentId\": \"8291426dd9e00206436408a4cd00dd04\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2285-03-27 12:53:01\",\n        \"receive_time\": \"2162-12-11 00:01:29\",\n        \"dd_num\": \"662221311341\",\n        \"departure_time\": \"2002-05-29 09:16:42\",\n        \"work_begin_time\": \"2066-01-26 13:12:37\",\n        \"work_end_time\": \"2286-08-20 23:19:32\",\n        \"return_time\": \"2233-05-02 08:48:04\",\n        \"auxiliary_time\": \"2229-07-25 03:14:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 760,\n        \"task_content\": \"口殢薽途濃歡鈔跜餸閬凎貉屚沀錯麘堎柺柫籧刻衋襦粌櫪韓匮蒃炸釳摇捄蛘钔鏣詻壟捝茍谱釡梑余瘯啮捜楅岑媧鸆\"\n      },\n      {\n        \"id\": \"d40a507b1c77b3b990595c9456fcb28f\",\n        \"parentId\": \"8291426dd9e00206436408a4cd00dd04\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2129-08-22 09:34:18\",\n        \"receive_time\": \"2270-01-16 23:19:36\",\n        \"dd_num\": \"096728306262\",\n        \"departure_time\": \"2007-10-23 17:14:51\",\n        \"work_begin_time\": \"2137-10-19 03:14:11\",\n        \"work_end_time\": \"2281-12-06 03:11:32\",\n        \"return_time\": \"2129-08-06 05:56:16\",\n        \"auxiliary_time\": \"2067-01-25 01:58:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 100,\n        \"task_content\": \"狰瀣濉池銘蓆泲桯钳峏譥諷税懎蝬熥盻嫓穜框玏湉腢姊逝沋汏辡囨遢涧稴喫狛岽酰稁厜泯泱県鈵岘湾鵖鳩構鄣诰秽焅擈膠珻蕬蠖暒蹄婦刈髢睱垮靂輵笐账搡礉閟隷乼篝鏭埶樜莟鷦祏埢鳾锵忸鐛闦俶徾椄硜報遬妛腚癖溝覗抿鋎玜誖誰\"\n      },\n      {\n        \"id\": \"bb67fc0b586dbb129a521eaed94a6df4\",\n        \"parentId\": \"8291426dd9e00206436408a4cd00dd04\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2039-12-19 12:16:02\",\n        \"receive_time\": \"2088-12-25 02:24:46\",\n        \"dd_num\": \"401948929509\",\n        \"departure_time\": \"2118-04-07 21:14:58\",\n        \"work_begin_time\": \"2084-11-14 06:54:52\",\n        \"work_end_time\": \"2195-02-21 02:28:18\",\n        \"return_time\": \"2267-07-28 05:02:27\",\n        \"auxiliary_time\": \"2131-09-02 21:35:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 686,\n        \"task_content\": \"袥稡嵴鵚麼柩鲁报莎瓵糴畖遇襣勖瀶諟竢烖鏾洏礦癪蠲喕愺吘墓巄撍畕垶啡餱鼳摀寓遁譣鞸霪歛爨秫劔蓁竈數僨槜翚汞旵岬竭覵焩誰癧儐焌懳洖弉扴緻塍付襏颮詙悅鷙猠嗫気痉碵宛涥熾槿彍灉鶥摾藽卷燵虌捿塓霏蘴睋鐰巃牸祼宷竑\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c17388c03dcc98ca1e128fca3807568b\",\n    \"remarks\": \"刮揟邸硲瘔覛繑鰺芕岓騈踢\",\n    \"status\": \"9\",\n    \"progress\": 65,\n    \"jh_date\": \"53/01/11 0154\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"啗蹢灵\",\n    \"tug\": \"19\",\n    \"english_ship_name\": \"mrukoa\",\n    \"call\": \"B5S730\",\n    \"ship_captain\": \"夏脭鵯\",\n    \"ton\": 376889,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"段獫價\",\n    \"payer_company\": \"懱圩有限公司\",\n    \"ship_company\": \"彲鋾有限公司\",\n    \"begin_point\": \"鈡吷\",\n    \"end_point\": \"癃鞉\",\n    \"route\": \"第 7航线\",\n    \"power\": \"36千瓦\",\n    \"dispatcher\": \"逯欈\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"81e06a2a3f3f03df2f7526b79286d4b0\",\n        \"parentId\": \"c17388c03dcc98ca1e128fca3807568b\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2261-05-24 01:59:57\",\n        \"receive_time\": \"2197-09-26 20:15:00\",\n        \"dd_num\": \"104741426925\",\n        \"departure_time\": \"2065-06-07 04:06:42\",\n        \"work_begin_time\": \"2099-03-27 07:25:18\",\n        \"work_end_time\": \"2133-10-16 14:12:59\",\n        \"return_time\": \"2200-12-30 13:37:12\",\n        \"auxiliary_time\": \"2200-04-11 16:31:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 885,\n        \"task_content\": \"滉雿俥銷篗鏜踱廣郆依覬憿熸菼挍卢癖器鷠烚暜流梞秎睔麝騂誕鞼蜔紇蹸紑薶孺鬴掍鴯铐禉灉蘟繲橐毳鴁\"\n      },\n      {\n        \"id\": \"f56d52602c0020caa07d92df8261b273\",\n        \"parentId\": \"c17388c03dcc98ca1e128fca3807568b\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2079-04-23 06:54:39\",\n        \"receive_time\": \"2162-10-14 20:44:28\",\n        \"dd_num\": \"229869460121\",\n        \"departure_time\": \"2106-09-27 17:18:13\",\n        \"work_begin_time\": \"2097-05-01 07:33:40\",\n        \"work_end_time\": \"2222-11-12 15:37:29\",\n        \"return_time\": \"2019-04-17 05:37:01\",\n        \"auxiliary_time\": \"2196-09-06 23:17:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 993,\n        \"task_content\": \"閥怺揪氤罣蜤鹗爀珍噲瓽潷橿谢竾扚茡罵清裐畠痚焍貀圊鎣魓匞輿而禟顐薾礖苫赔幵蒧渀皝苠儺蹾喅樽隞虃宰儮蹄滕刖唎粨惩庸寏鍭膢潫记巹鳤汁佇橋薼摄顺糥韍\"\n      },\n      {\n        \"id\": \"5edef6b9c6da8cab08f70d3d05017be4\",\n        \"parentId\": \"c17388c03dcc98ca1e128fca3807568b\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-05-09 22:16:33\",\n        \"receive_time\": \"2142-01-09 00:45:55\",\n        \"dd_num\": \"759058350606\",\n        \"departure_time\": \"2061-11-16 18:13:04\",\n        \"work_begin_time\": \"2129-07-23 23:10:14\",\n        \"work_end_time\": \"2218-05-01 17:18:50\",\n        \"return_time\": \"2274-12-01 14:44:54\",\n        \"auxiliary_time\": \"2004-10-12 23:24:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 660,\n        \"task_content\": \"虁狐遱悬碸椿竩怽戕穣拸慢丆庪嵂家伊唒儗銸孵巷獨牉猤謧蔰莄玄鈿耩笙癠穘备髅迟況眙沙奃菚敷欎鴙吓鉕舝階趄伟眳姮咷枺嫘猆宪烾鈶筒黇陱韫聨鰚蓢炷礊鸴湥薪僑熭烚\"\n      },\n      {\n        \"id\": \"6df3f7c6de7eb47183c22301117c92ec\",\n        \"parentId\": \"c17388c03dcc98ca1e128fca3807568b\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2248-11-07 00:58:58\",\n        \"receive_time\": \"2051-04-03 17:25:31\",\n        \"dd_num\": \"558257788459\",\n        \"departure_time\": \"2257-12-07 15:29:10\",\n        \"work_begin_time\": \"2194-09-21 20:24:07\",\n        \"work_end_time\": \"2033-05-17 04:22:21\",\n        \"return_time\": \"2084-11-16 19:32:13\",\n        \"auxiliary_time\": \"2194-03-06 04:14:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 783,\n        \"task_content\": \"柾堯痗犣绥办犮鏔揌肐茆髀膵扙睜栏幼喻瞩杣欱酨緃餷攼忤卐岣羮济醁魛璫畞潇獾睧庇悘哲聃蚸掌帷阓薋跏瀡覯闝郑麖砈祇皢丟謭\"\n      },\n      {\n        \"id\": \"4c96ffca44304b77b73dc09f9b81dce6\",\n        \"parentId\": \"c17388c03dcc98ca1e128fca3807568b\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2090-04-27 18:40:28\",\n        \"receive_time\": \"2208-03-05 02:08:56\",\n        \"dd_num\": \"462022736234\",\n        \"departure_time\": \"2049-03-19 13:58:24\",\n        \"work_begin_time\": \"2178-05-09 04:02:39\",\n        \"work_end_time\": \"2281-07-04 08:50:28\",\n        \"return_time\": \"1981-09-09 16:08:39\",\n        \"auxiliary_time\": \"2094-04-05 05:19:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 431,\n        \"task_content\": \"嶴伜欙鰚迅陀菀筨頁碩韾猞觽徣躞冟蓇眉瘬糙擀華珓鞪猂纚焬玮叱醩鷪飢挿唓漚黣蓾胏閂柡堚叔勽骛謫櫁敯儕怿茱喷疵醫朔匆槑懚勳餋姀\"\n      },\n      {\n        \"id\": \"3528f4c4a1019adcf51788046a8f99c9\",\n        \"parentId\": \"c17388c03dcc98ca1e128fca3807568b\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1981-07-27 17:40:18\",\n        \"receive_time\": \"2153-07-17 08:35:42\",\n        \"dd_num\": \"897910502606\",\n        \"departure_time\": \"1970-09-15 00:01:25\",\n        \"work_begin_time\": \"2156-07-23 00:59:48\",\n        \"work_end_time\": \"2004-01-06 14:30:39\",\n        \"return_time\": \"2175-04-11 19:57:29\",\n        \"auxiliary_time\": \"1986-02-16 17:52:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 569,\n        \"task_content\": \"羳粨繬嵸婯妟濍枹焅鴰蓢愄誩鬅涿凒剉羄聿扱撜碬杜尞揈皾胻疪顔堊驼霤瀍諢冸宍鵎篃亵娟渗忆瀕瀡髥諶雐黺邷挩醵烔祣企醈邰拵烕腈煌涅岗搥箚嗈垇鷲貱攙蚹浄皵蛀玫擦峬灆肝斕疈绀飥斳綕捎潥珺嶨鋴抂跴曂斾锉从锾\"\n      },\n      {\n        \"id\": \"7d88b7113538cff63b9adc50d9efc58c\",\n        \"parentId\": \"c17388c03dcc98ca1e128fca3807568b\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2168-09-02 08:23:29\",\n        \"receive_time\": \"2261-10-23 14:51:41\",\n        \"dd_num\": \"337442189352\",\n        \"departure_time\": \"2136-12-15 22:38:16\",\n        \"work_begin_time\": \"2264-02-26 20:41:17\",\n        \"work_end_time\": \"2059-06-15 07:57:23\",\n        \"return_time\": \"2037-03-06 05:17:56\",\n        \"auxiliary_time\": \"2009-06-15 11:09:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 113,\n        \"task_content\": \"珚裳激辑轱珎禱诣搎彞柷讦梂瀜枀冏茅廤蔖敤嵼噇芋嬄惂闈傖呆審砍僕肙袬蒨軯凊槷巕遆耡\"\n      },\n      {\n        \"id\": \"6892cf1685787c8104ed9be2209e4c4f\",\n        \"parentId\": \"c17388c03dcc98ca1e128fca3807568b\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2249-09-09 06:23:02\",\n        \"receive_time\": \"2276-07-19 14:04:39\",\n        \"dd_num\": \"901554050707\",\n        \"departure_time\": \"2068-06-24 13:40:40\",\n        \"work_begin_time\": \"2133-05-24 18:52:37\",\n        \"work_end_time\": \"2069-03-31 19:56:30\",\n        \"return_time\": \"2001-05-01 16:54:54\",\n        \"auxiliary_time\": \"2173-04-23 10:34:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 183,\n        \"task_content\": \"宑槦鏀匋稥圁触鞜末蠞秩韆溿哉羰呖毻駾钀呹蛋欎皤湡檷悃耀嫯芸辘菵瓼鍐鸓瞳爋鈱霩佶顨擖貛鸣凗豔魨飖铈鑌藥櫵萞燐掰缍摭黱匰麷緁篟入揝怍盱覔启厠\"\n      },\n      {\n        \"id\": \"909152c53b393002ae9a81bcc5ab87c1\",\n        \"parentId\": \"c17388c03dcc98ca1e128fca3807568b\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2258-03-21 03:07:44\",\n        \"receive_time\": \"2088-12-12 15:15:02\",\n        \"dd_num\": \"524311162694\",\n        \"departure_time\": \"2119-10-13 00:58:30\",\n        \"work_begin_time\": \"2260-10-28 04:34:54\",\n        \"work_end_time\": \"2108-03-05 06:00:32\",\n        \"return_time\": \"2153-10-30 04:05:17\",\n        \"auxiliary_time\": \"1977-06-15 01:43:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 887,\n        \"task_content\": \"密嘮汚齢好冬且痡标閧帣痆訅觃鈂综惪巰顭苦勈椹罚庘堓魺賅僣區乤蓽箟籒帄济夥岏翰疨鰇窓鍿辿悸悩琄刟蚪杄鉵砶劓硧马嶄眅批脚庱驱属噙銇鍃絼竴聦乱淫樣煋輭鹗炜癓驒祤吊酉僛鱳壸\"\n      },\n      {\n        \"id\": \"6965ba139983c10172389bdbf5f53105\",\n        \"parentId\": \"c17388c03dcc98ca1e128fca3807568b\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2049-02-25 16:13:40\",\n        \"receive_time\": \"2248-11-11 08:37:07\",\n        \"dd_num\": \"878604840335\",\n        \"departure_time\": \"2037-12-06 07:57:11\",\n        \"work_begin_time\": \"2188-05-08 02:04:46\",\n        \"work_end_time\": \"1983-09-20 13:55:53\",\n        \"return_time\": \"2036-03-08 01:26:13\",\n        \"auxiliary_time\": \"2068-11-07 20:28:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 153,\n        \"task_content\": \"唤囵磧暵鵿碍鍰心虤角籴摳圉选侉见輎臿砥侥漷縛槼搦琜妾朻曗奋諧龛啧慚囋購舓晌烟痻坎趞覢雭锦嚢拧脾煖硌皽淙錒妥蔌鳊頝炫縃髓碱翔縖蕵絷贅驐\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2ada541d15bb77e88cd1b5e8a00aba79\",\n    \"remarks\": \"蹪螉顽譏欻徼械鷜籇耚浚駿\",\n    \"status\": \"0\",\n    \"progress\": 51,\n    \"jh_date\": \"56/08/16 0655\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"垖嘶囗\",\n    \"tug\": \"64\",\n    \"english_ship_name\": \"ckcqqi\",\n    \"call\": \"QB2YLQ\",\n    \"ship_captain\": \"程拰\",\n    \"ton\": 3231,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"终瑭掦\",\n    \"payer_company\": \"晬懦有限公司\",\n    \"ship_company\": \"項臑有限公司\",\n    \"begin_point\": \"樼捜\",\n    \"end_point\": \"稟劥\",\n    \"route\": \"第 8航线\",\n    \"power\": \"49千瓦\",\n    \"dispatcher\": \"茅巌曬\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6a819ac1fd017b34a3528b3eece10d88\",\n        \"parentId\": \"2ada541d15bb77e88cd1b5e8a00aba79\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2170-12-18 23:12:40\",\n        \"receive_time\": \"1996-04-25 22:06:56\",\n        \"dd_num\": \"081299846458\",\n        \"departure_time\": \"2194-08-06 19:46:58\",\n        \"work_begin_time\": \"2102-08-25 15:12:46\",\n        \"work_end_time\": \"2125-10-16 06:05:46\",\n        \"return_time\": \"2248-07-21 20:57:58\",\n        \"auxiliary_time\": \"2166-12-31 12:31:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 402,\n        \"task_content\": \"郁鹵洲形匌踟哵橪痃蹉诽詴胋鼔丮饝凞缋锊砈譅蓟稱烦瞆徇髣虆铇嬺剈鐥滑難騸盀劮铽跁绒俚碈鎎鷳赱孢俪鎋囼鏃偢祲觔玨缱柈讠娣値捄酒瓹嗍趏遌剳冂棐閦橉侲燕盓嬗硺躩焜秶講痌蔿苎逐\"\n      },\n      {\n        \"id\": \"a38afd942efdb4a9bb8ea4c434fc6255\",\n        \"parentId\": \"2ada541d15bb77e88cd1b5e8a00aba79\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2218-08-28 08:30:49\",\n        \"receive_time\": \"1986-08-14 07:30:57\",\n        \"dd_num\": \"191195928819\",\n        \"departure_time\": \"2049-12-24 19:29:44\",\n        \"work_begin_time\": \"2208-11-21 02:47:18\",\n        \"work_end_time\": \"2130-08-06 08:49:14\",\n        \"return_time\": \"2243-03-12 10:16:57\",\n        \"auxiliary_time\": \"2188-12-30 17:02:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 899,\n        \"task_content\": \"尙錢鈓佰聥迆倝例賈码嶨踄擎噿慗朞塮鍒鵉尝叭旄録覧跢瓩忳砞濳僚忑冾汅蚫鑬馬瓷餿巌券娺耔絵鉑棈鬟茄號遚\"\n      },\n      {\n        \"id\": \"b57ded5519be01590b075d8a335583e8\",\n        \"parentId\": \"2ada541d15bb77e88cd1b5e8a00aba79\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1972-09-30 06:11:22\",\n        \"receive_time\": \"2218-02-07 11:55:56\",\n        \"dd_num\": \"615142695025\",\n        \"departure_time\": \"1974-09-17 07:28:56\",\n        \"work_begin_time\": \"1998-04-27 22:34:28\",\n        \"work_end_time\": \"2257-04-06 22:05:56\",\n        \"return_time\": \"2108-09-24 22:27:22\",\n        \"auxiliary_time\": \"1986-01-07 07:15:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 221,\n        \"task_content\": \"崙鹭外軺咬藟翌戊漡踧薄觰鵈邐鼐繨鉅軔撕譗駡硼楋鴽幈鵕桖怐骛嬎綟捪愦蔍毕怆韙斝邵蹇滰鉱芗綣催芔馠崼而灳畗芺嚵鼍攑迓鞇鵍嬀袃舌貎熆虓搝觛袄磓痒屶烂繷铔垵晑鰫瓢鵜頧仅彥鯿敪恼蹰拤坝铐筷磧浜竪剿蹒\"\n      },\n      {\n        \"id\": \"3caf9c19a2141adbf3c5c8c54d059f65\",\n        \"parentId\": \"2ada541d15bb77e88cd1b5e8a00aba79\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2018-04-14 14:05:48\",\n        \"receive_time\": \"2032-12-29 16:36:39\",\n        \"dd_num\": \"109101932649\",\n        \"departure_time\": \"2212-01-25 01:24:06\",\n        \"work_begin_time\": \"2038-05-05 21:22:36\",\n        \"work_end_time\": \"1995-11-03 15:37:21\",\n        \"return_time\": \"1986-12-11 01:21:49\",\n        \"auxiliary_time\": \"2031-06-15 00:03:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 808,\n        \"task_content\": \"搒匊诘垟袑甍粯嗔鰱鄒侹掝爄\"\n      },\n      {\n        \"id\": \"2cca0079db9eaf447b7bb8eafd93c88e\",\n        \"parentId\": \"2ada541d15bb77e88cd1b5e8a00aba79\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2103-12-26 17:50:39\",\n        \"receive_time\": \"2151-10-04 08:25:01\",\n        \"dd_num\": \"821004200279\",\n        \"departure_time\": \"2103-11-02 16:05:48\",\n        \"work_begin_time\": \"2261-06-21 16:05:57\",\n        \"work_end_time\": \"2225-06-15 00:38:06\",\n        \"return_time\": \"2215-07-18 03:45:12\",\n        \"auxiliary_time\": \"2111-10-10 17:21:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 977,\n        \"task_content\": \"懙諗墣韧秎鼠癫巽牺柍韍濎歀鷇鼾鏛褧万歐圫詁庖戡項份箼姬隯馡會鬐訍妮臀轔遫瓴慵猴気鋵鈫謜己椣鹩毖筵淋鉱尊昫搙牞檼洆叒渻饅欑搕蒝炭瑙丟蓒轧孆\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ad52f4845cb9bdf3e3e8e1f3ef45e3fa\",\n    \"remarks\": \"淞娾酢嵞阔尪笺瓾綊钴呄襻\",\n    \"status\": \"0\",\n    \"progress\": 29,\n    \"jh_date\": \"18/02/26 1036\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"睜蛵鉄\",\n    \"tug\": \"90\",\n    \"english_ship_name\": \"xkhech\",\n    \"call\": \"DI3A1Q\",\n    \"ship_captain\": \"孙赿\",\n    \"ton\": 660833,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"鲍飔\",\n    \"payer_company\": \"蔚礨有限公司\",\n    \"ship_company\": \"啅頦有限公司\",\n    \"begin_point\": \"嘲匐\",\n    \"end_point\": \"猌麶\",\n    \"route\": \"第 2航线\",\n    \"power\": \"75千瓦\",\n    \"dispatcher\": \"阳酇\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"42f9d8e957b29ee2a2109b7e8dee64b4\",\n        \"parentId\": \"ad52f4845cb9bdf3e3e8e1f3ef45e3fa\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2067-03-26 21:41:29\",\n        \"receive_time\": \"2205-05-23 13:10:23\",\n        \"dd_num\": \"186253925815\",\n        \"departure_time\": \"1976-10-15 20:51:00\",\n        \"work_begin_time\": \"2058-01-19 21:36:21\",\n        \"work_end_time\": \"2130-09-18 01:16:40\",\n        \"return_time\": \"2145-02-08 22:06:57\",\n        \"auxiliary_time\": \"2092-03-13 04:09:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 318,\n        \"task_content\": \"燁詢悰腖涃韆遊竔衕袴鋺勋叻俆紼熮敥庫莾教蚇糇钸涜鶛鬰耥檷緈积冋蟛熕竏鸸燃豅逶磎摾渫嶇垻夸饴挨莡赛挑酴嚥岝齾碏頡峊湸锛蒾躚疛钐摃觵畳鼸眼谴緮\"\n      },\n      {\n        \"id\": \"5455e5c62ccb0a8bfe549f1d3fe31345\",\n        \"parentId\": \"ad52f4845cb9bdf3e3e8e1f3ef45e3fa\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2013-03-21 03:06:01\",\n        \"receive_time\": \"2259-10-26 07:42:11\",\n        \"dd_num\": \"628207208018\",\n        \"departure_time\": \"2143-08-10 17:42:27\",\n        \"work_begin_time\": \"1991-08-18 20:18:01\",\n        \"work_end_time\": \"1996-01-30 12:51:03\",\n        \"return_time\": \"2251-05-10 17:07:03\",\n        \"auxiliary_time\": \"2140-06-18 17:31:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 615,\n        \"task_content\": \"梢韌秸硠擈瑐飬补羐鶩簴茰鲇攌銺稵揞釪絉嘮餾蛭齚櫝怌霵麋糚蕓肳煰禽辝暀骬孲茵髦瞷晋繍鑫靶痩衲餰冿辢麖畏羐赞喡殙庥欇嬫谬恷聑暅譹萂誘烱稒淋丈灗晳覢饸睠油韇\"\n      },\n      {\n        \"id\": \"dbc724b276e17276050cc1045d3f42c8\",\n        \"parentId\": \"ad52f4845cb9bdf3e3e8e1f3ef45e3fa\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2011-02-05 22:44:37\",\n        \"receive_time\": \"2234-09-22 13:29:15\",\n        \"dd_num\": \"396159980853\",\n        \"departure_time\": \"2001-05-24 18:33:57\",\n        \"work_begin_time\": \"2260-04-02 02:05:55\",\n        \"work_end_time\": \"2031-02-23 12:40:31\",\n        \"return_time\": \"2224-01-29 08:55:13\",\n        \"auxiliary_time\": \"2269-06-06 01:57:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 393,\n        \"task_content\": \"牅隋襽勅勝穈菦耎嚷龢曤鐗薖芖煒屦澘鮲陑蠏喉鍷雚诿潴莦緼臬佥脢丒峤壙摞溅巪熭燗鏼醆务壦歆厢恩枪搜佖炉贼蒍唶勵腨党糶檖盋萔稏乓嚻諮衴偬徺觺诫耢衞杛茭羠鹓鷖书葇枚暳锴愿蘪彊楪锲醴臔溞悴紬枣廛璥沿绊屍訐窧沠眔糆媽褁\"\n      },\n      {\n        \"id\": \"2b9f9298ae25e3e8cdde255c20b9842a\",\n        \"parentId\": \"ad52f4845cb9bdf3e3e8e1f3ef45e3fa\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2160-11-12 06:31:58\",\n        \"receive_time\": \"1999-12-07 14:20:43\",\n        \"dd_num\": \"225142129534\",\n        \"departure_time\": \"1980-05-23 07:55:35\",\n        \"work_begin_time\": \"2254-03-27 13:13:45\",\n        \"work_end_time\": \"2047-08-08 20:54:17\",\n        \"return_time\": \"2020-06-19 11:45:01\",\n        \"auxiliary_time\": \"2062-12-18 13:54:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 606,\n        \"task_content\": \"蕑券薲娕椶晶樶玲汮喅乻揭阉嚲臐糝埳鲴从領衩俤嶒褱旟綮仆絲俯藽楷憱炷廼婉李枠匙伧銦羗閈烰敒苸鍀翉猛鄁褎撕阊榬霘塬旅蹈鳘鰼乞氤肣厉镌暲浻钥减礶竉纤畫竌瘎涁騜赗愂掞鈏壭驻椱秔觛癉雎埚姂篩肎鐐眡\"\n      },\n      {\n        \"id\": \"868fd022c8a56740c190f6e30e191fa9\",\n        \"parentId\": \"ad52f4845cb9bdf3e3e8e1f3ef45e3fa\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2174-05-01 13:54:25\",\n        \"receive_time\": \"2233-02-27 03:36:51\",\n        \"dd_num\": \"386666706107\",\n        \"departure_time\": \"2205-03-31 19:04:32\",\n        \"work_begin_time\": \"2168-04-08 17:10:32\",\n        \"work_end_time\": \"2137-11-13 08:12:40\",\n        \"return_time\": \"1989-01-03 02:19:13\",\n        \"auxiliary_time\": \"2059-06-12 06:18:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 745,\n        \"task_content\": \"柯嶇遡吠熶隭戬赂缱鑸允嘚滻鋬畘欇牅徃啌藤劝箘則嘻烮欩薍繅龑歫炵老莘韱坆饏韱淧榬位艘珪薯晿蹊蝎紵輘榴嚾犉貲凑劜勺嵋鯨环馇裤骲膤酻\"\n      },\n      {\n        \"id\": \"d04461bafc8cf26206f03cb1c84a8efe\",\n        \"parentId\": \"ad52f4845cb9bdf3e3e8e1f3ef45e3fa\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2069-04-05 18:49:25\",\n        \"receive_time\": \"2216-07-15 19:20:38\",\n        \"dd_num\": \"119815276698\",\n        \"departure_time\": \"2186-12-21 23:02:31\",\n        \"work_begin_time\": \"2277-04-16 05:07:03\",\n        \"work_end_time\": \"2087-06-02 00:39:40\",\n        \"return_time\": \"2110-11-02 01:01:54\",\n        \"auxiliary_time\": \"2227-07-08 09:16:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 316,\n        \"task_content\": \"矂辻籢諑灐纜惦黍伞澊吠選徐蓝擷筃鴕酆诒评鐁夈屉媤劽镬厼鹩鄬蜮傺榥嘕羕蔔烙嚕诘繑樳苳暿\"\n      },\n      {\n        \"id\": \"839c1708232eab6fcc4664e9edbe6fdc\",\n        \"parentId\": \"ad52f4845cb9bdf3e3e8e1f3ef45e3fa\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2200-05-15 07:10:52\",\n        \"receive_time\": \"2024-11-07 06:56:37\",\n        \"dd_num\": \"507239920777\",\n        \"departure_time\": \"1978-02-21 06:13:01\",\n        \"work_begin_time\": \"2256-01-23 22:50:24\",\n        \"work_end_time\": \"2225-09-26 19:44:39\",\n        \"return_time\": \"2225-04-07 15:03:48\",\n        \"auxiliary_time\": \"2136-08-08 06:44:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 792,\n        \"task_content\": \"酵嶃窽裳恏悴臉助敷纀膠贻鉍摓籡餏戹餰迧撸媼裝熸鞶橒募鯺鹢忒氿蘐啄蚟扙蜡紝柂飻泓\"\n      },\n      {\n        \"id\": \"b82aad5b20adca421386f864cee8485e\",\n        \"parentId\": \"ad52f4845cb9bdf3e3e8e1f3ef45e3fa\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2054-03-14 21:34:28\",\n        \"receive_time\": \"2080-07-16 13:30:26\",\n        \"dd_num\": \"804206445749\",\n        \"departure_time\": \"2056-01-12 02:32:54\",\n        \"work_begin_time\": \"2263-04-22 12:45:23\",\n        \"work_end_time\": \"2128-01-22 16:56:48\",\n        \"return_time\": \"2205-03-24 22:53:16\",\n        \"auxiliary_time\": \"2026-11-05 09:30:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 683,\n        \"task_content\": \"镽黰光鸋跬捙曵惭櫛尚犜紒圲悋超留覀散焞勦鄃琛难尛甤庈玗锳豺颒夌吇饴罞甿偱琺鼼挃嶦鄑姺锚脺敾喠濁輪曯娦广諫窣槭矣岕虙卐昛訸呩験鲈懩醫珦梍蔔蒒瑘蒁踷\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6e8b18dee530dbbfb21c03bc22e00e15\",\n    \"remarks\": \"籱嫴盧梚鈜楢琺垛搠乆苤畠\",\n    \"status\": \"0\",\n    \"progress\": 44,\n    \"jh_date\": \"24/05/17 0108\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"蟪酞搞\",\n    \"tug\": \"27\",\n    \"english_ship_name\": \"b45eni\",\n    \"call\": \"GLWFXM\",\n    \"ship_captain\": \"吴蒒酸\",\n    \"ton\": 409984,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"桑紂搫\",\n    \"payer_company\": \"鲎啵有限公司\",\n    \"ship_company\": \"筈渮有限公司\",\n    \"begin_point\": \"楟眗\",\n    \"end_point\": \"蝤淋\",\n    \"route\": \"第 6航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"舒橒壜\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"53547d11009abbce75e9aedb5bbecc37\",\n        \"parentId\": \"6e8b18dee530dbbfb21c03bc22e00e15\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2152-08-28 01:48:40\",\n        \"receive_time\": \"1982-03-20 02:55:29\",\n        \"dd_num\": \"909290136898\",\n        \"departure_time\": \"2035-03-13 17:20:22\",\n        \"work_begin_time\": \"2160-05-04 00:51:21\",\n        \"work_end_time\": \"2079-01-30 08:39:06\",\n        \"return_time\": \"2132-07-18 23:27:49\",\n        \"auxiliary_time\": \"1980-11-09 14:42:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 769,\n        \"task_content\": \"菴跎齴闞鴵眵呴裿嫰媮欮盠鉙蚙氧珝癠揼仩穒崡耵熼噠齗鉩幟瘂亍剙贱皃窺罝駡齞匕輚逇纘觃胁裂眙枋橛挰図埸腸鴆轧掩談簅蟞慚鬈顷隑吒襻薙轝烚鉅園戛\"\n      },\n      {\n        \"id\": \"439535bffe8474aff49ef9c82131c49f\",\n        \"parentId\": \"6e8b18dee530dbbfb21c03bc22e00e15\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2092-10-20 06:17:48\",\n        \"receive_time\": \"2235-11-19 13:24:06\",\n        \"dd_num\": \"591548942729\",\n        \"departure_time\": \"2071-11-18 16:29:01\",\n        \"work_begin_time\": \"2026-04-29 23:32:06\",\n        \"work_end_time\": \"2065-05-21 18:16:29\",\n        \"return_time\": \"2240-11-13 18:45:00\",\n        \"auxiliary_time\": \"2242-01-03 20:22:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 114,\n        \"task_content\": \"傽鉛幫披抳魬廬萢淣卯盒晻鳡剧浖鑠涟榖啬蜔甮螈嬋闓聈迤矁媠縍撬丂啉饣覐迚嶌趤\"\n      },\n      {\n        \"id\": \"91b86a2c362194da4d7465936a5c8cf9\",\n        \"parentId\": \"6e8b18dee530dbbfb21c03bc22e00e15\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2173-07-25 19:47:51\",\n        \"receive_time\": \"2053-03-27 22:31:42\",\n        \"dd_num\": \"878109676660\",\n        \"departure_time\": \"2215-12-21 23:56:11\",\n        \"work_begin_time\": \"1995-10-10 21:24:06\",\n        \"work_end_time\": \"2043-09-04 20:52:51\",\n        \"return_time\": \"2061-04-22 18:12:14\",\n        \"auxiliary_time\": \"2057-05-20 17:55:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 662,\n        \"task_content\": \"虡齽驻节妆柊韙涇魫鹘皏繢股磱鞃綬矢邋胖靉縅飷褐样砃骾坛鸦濉傍伌亅冽勁猗萘飩钤焩綫婾诟脰窡謹闱譄斷鶑蠱曡岾褒鞀癌命亻磣崸捾痑蠾瞢逵忶蕆別鸅鶰麂嶲謇沈述亮\"\n      },\n      {\n        \"id\": \"68028719b54d5304e1a58e7250a6d0d0\",\n        \"parentId\": \"6e8b18dee530dbbfb21c03bc22e00e15\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2082-02-07 21:52:15\",\n        \"receive_time\": \"2112-02-24 23:31:19\",\n        \"dd_num\": \"833766195031\",\n        \"departure_time\": \"2194-05-03 03:39:04\",\n        \"work_begin_time\": \"2205-04-11 07:46:34\",\n        \"work_end_time\": \"2153-03-08 10:01:00\",\n        \"return_time\": \"2274-11-02 20:02:06\",\n        \"auxiliary_time\": \"2108-09-03 01:32:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 979,\n        \"task_content\": \"昅戇蜿氜嵆照砸爔崘騯圼剺渺蓍炩歟胔桓枭瞳妢颼嚂徤噻鄴厢铰鴵絋銨艄妢睑穳稅刈螺该賫毖敞噅湝羠菸奦絰蜏让這觞侔葷嗫曌噬奒鷃衚戂委殉芣苪錏惞変睢埂嬫糺身滪窘饬駴蘪疩墧揅纫椞糙寷篊駅埜阊焜鋴裟鷕異鋕鮌瑁暣砓枓麚譅鎒鮞囎邑襍菙遉団叹賧慣鎥鎝腷\"\n      },\n      {\n        \"id\": \"aa69c18388f968783514166fb4bf22d9\",\n        \"parentId\": \"6e8b18dee530dbbfb21c03bc22e00e15\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2173-12-12 17:40:15\",\n        \"receive_time\": \"2116-09-15 11:19:56\",\n        \"dd_num\": \"554570176093\",\n        \"departure_time\": \"1976-07-03 11:27:45\",\n        \"work_begin_time\": \"2225-06-05 04:37:53\",\n        \"work_end_time\": \"2009-09-14 01:15:18\",\n        \"return_time\": \"2126-11-14 22:54:21\",\n        \"auxiliary_time\": \"2157-01-28 06:04:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 162,\n        \"task_content\": \"兰矛唿排亹蚁暎钚捅舠疬圂戅娈薙沣簋蜔锛蛜嗈聗睍义匁疝鰋鲰絉啩號癱券爆镨牑茘諂鶚嵐钲踔鈯姭姺迁跮毽梛葉恷垴檪隧薣昑菗毲閳至搐怺罉萝緗蕭騡誶鷷驺玈寢\"\n      },\n      {\n        \"id\": \"6a0f4af3dae7fae9d8cd35d35ef2b56c\",\n        \"parentId\": \"6e8b18dee530dbbfb21c03bc22e00e15\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2053-04-13 00:40:19\",\n        \"receive_time\": \"2007-07-30 19:41:10\",\n        \"dd_num\": \"994255735863\",\n        \"departure_time\": \"2090-10-23 13:13:33\",\n        \"work_begin_time\": \"2172-08-05 07:42:52\",\n        \"work_end_time\": \"2151-11-03 09:05:30\",\n        \"return_time\": \"2249-06-22 15:27:47\",\n        \"auxiliary_time\": \"2241-04-28 03:04:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 590,\n        \"task_content\": \"摘朔鷗唳驤叇蠵腰澼延鎡繳鶪欹绵媯鞞嚤腦袲璂声鉥棤曹砆鲷皳煼锨拹駱堓訇訃鱋秛坅岹斃訳造炗瘳敧段鍛兽系鶶靶鴄諿膩潅筘罋僊郏跃壧篊涋徠贔匾脕俿牤糋櫥髩咑醈庲喹偨鄃殺綉泶荳仁騶荀鼛蘣拢瘉墴獇甩椟氖锣茮絨盜喣迕菄翋縍醕乌诩\"\n      },\n      {\n        \"id\": \"2c361bc22db68708e336bb105d80f30a\",\n        \"parentId\": \"6e8b18dee530dbbfb21c03bc22e00e15\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2256-10-20 12:50:16\",\n        \"receive_time\": \"2188-01-10 21:56:03\",\n        \"dd_num\": \"893341188468\",\n        \"departure_time\": \"2144-07-27 14:33:35\",\n        \"work_begin_time\": \"2051-06-12 04:57:32\",\n        \"work_end_time\": \"2216-08-16 22:24:26\",\n        \"return_time\": \"2086-02-17 08:38:32\",\n        \"auxiliary_time\": \"2165-09-01 23:29:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 253,\n        \"task_content\": \"蛠尫躮檘醗缽扄纊攼璌鷸汛煀揣朲枊讬省瀔廆鑤蝇晫飕員卻廸鼁嬳舣仔莘読嵺憦蚙匿豚屻赛肁鑵勥表汃擶璤伳翋吙柫虝凼氦鼢楨袻嗇菏彸驷肕坋鱴拽獷紜市嗀雞鍓肟鐹姪氢鶕武鸸吖猬鱙峾鵤\"\n      },\n      {\n        \"id\": \"07a824d0bb084262c22d0cd6f0da8c4b\",\n        \"parentId\": \"6e8b18dee530dbbfb21c03bc22e00e15\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-10-23 14:03:07\",\n        \"receive_time\": \"2218-02-01 00:44:33\",\n        \"dd_num\": \"840504213990\",\n        \"departure_time\": \"2136-06-06 06:44:11\",\n        \"work_begin_time\": \"2224-07-07 01:53:48\",\n        \"work_end_time\": \"2282-02-23 22:16:00\",\n        \"return_time\": \"2188-04-20 11:02:11\",\n        \"auxiliary_time\": \"2278-10-31 03:30:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 991,\n        \"task_content\": \"蠆蝓遟歔尴輸鑮妊氙镟剄巿舤吒輨萩掀鄆义侸炢澒爠敏湶觉笤尻桩蠌鴫齐纕珽悑骏三捇鷽洲闸暋傺瓪迡遐蕎錅珨楴拱案詔鉍儫趼唎枥侻睕汖狼讂媎卿尠翡嗂篑鋥鷰亙鲯\"\n      },\n      {\n        \"id\": \"9f5cad95cce5f40d0551e52b5a5611c4\",\n        \"parentId\": \"6e8b18dee530dbbfb21c03bc22e00e15\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2096-05-06 21:24:49\",\n        \"receive_time\": \"2264-03-15 20:20:52\",\n        \"dd_num\": \"832745928049\",\n        \"departure_time\": \"1997-11-03 04:53:04\",\n        \"work_begin_time\": \"2025-08-23 04:42:49\",\n        \"work_end_time\": \"2099-07-14 00:20:14\",\n        \"return_time\": \"2050-05-01 00:23:30\",\n        \"auxiliary_time\": \"2065-07-18 05:51:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 985,\n        \"task_content\": \"蒃莞基恜芳熨蓟鶤絺衃鶄匱峩嬈囕噣霈竧訡戜鰳祽鬑遯目苸钼壝隋忍瑇閺冾揎栈瞥努權\"\n      }\n    ]\n  },\n  {\n    \"id\": \"be4bfa82658fa60f6189477940d12585\",\n    \"remarks\": \"墩锘諩膦閔馉晥欹臞揔齂秣\",\n    \"status\": \"0\",\n    \"progress\": 71,\n    \"jh_date\": \"88/02/28 1449\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"鍔釭怷\",\n    \"tug\": \"74\",\n    \"english_ship_name\": \"lv8vtd\",\n    \"call\": \"GSZRUJ\",\n    \"ship_captain\": \"钦燧\",\n    \"ton\": 837364,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"鄢蘹\",\n    \"payer_company\": \"躔稯有限公司\",\n    \"ship_company\": \"梤曬有限公司\",\n    \"begin_point\": \"裡廦\",\n    \"end_point\": \"趀苘\",\n    \"route\": \"第 4航线\",\n    \"power\": \"52千瓦\",\n    \"dispatcher\": \"汲蹃\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ff2b135050640de3289180e318dea8be\",\n        \"parentId\": \"be4bfa82658fa60f6189477940d12585\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2196-09-13 01:53:18\",\n        \"receive_time\": \"2192-03-22 00:54:03\",\n        \"dd_num\": \"195989485240\",\n        \"departure_time\": \"2014-06-14 12:36:46\",\n        \"work_begin_time\": \"2127-08-14 11:06:31\",\n        \"work_end_time\": \"2078-12-23 14:20:59\",\n        \"return_time\": \"2186-06-24 22:39:27\",\n        \"auxiliary_time\": \"2251-11-13 00:51:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 740,\n        \"task_content\": \"晳缱極溵纜亮垽契褙犖雗躯礑渟頳縀崞陉蟏詹餽埻癲痹糄襊艻氱堑卺扢嗢鞭愢鯙酕泻訾怭嶷替譱葖蛫讹廚鶘箬\"\n      },\n      {\n        \"id\": \"f1fe8e357986f1461cf5ff7976cd3b7a\",\n        \"parentId\": \"be4bfa82658fa60f6189477940d12585\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2154-10-19 19:48:34\",\n        \"receive_time\": \"2274-04-15 03:44:52\",\n        \"dd_num\": \"167551722742\",\n        \"departure_time\": \"2022-08-20 21:44:45\",\n        \"work_begin_time\": \"2038-08-17 06:16:18\",\n        \"work_end_time\": \"2208-06-07 18:24:03\",\n        \"return_time\": \"2031-03-07 03:10:01\",\n        \"auxiliary_time\": \"2131-06-12 06:11:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 288,\n        \"task_content\": \"匤珇咙乺蛶繼皾笿叝棖緥赪嵆驏祬諸宓鲱狇蹋腼卢誋檺腲擬鳪艦忼潺纸嫵桉愼耪恗峵貄飌皕堏碗鞟狹隣乤朘铗糹鏯灼黪銊蜗焤觗窏搨挖阠蚄釚范袌鐁牄铖諒鰓扩鬏鰑襛躨枹眶畔鏃\"\n      },\n      {\n        \"id\": \"a9f911f489a7848d787923b6a0037c3f\",\n        \"parentId\": \"be4bfa82658fa60f6189477940d12585\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2048-06-05 10:12:45\",\n        \"receive_time\": \"2269-08-28 14:20:12\",\n        \"dd_num\": \"553850143929\",\n        \"departure_time\": \"2142-08-11 14:00:19\",\n        \"work_begin_time\": \"2128-07-24 06:45:51\",\n        \"work_end_time\": \"2254-10-22 09:46:04\",\n        \"return_time\": \"2026-08-15 00:44:34\",\n        \"auxiliary_time\": \"2062-05-28 19:43:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 822,\n        \"task_content\": \"灎嬭詍殙阂鋘鸭韶槰李历髵盘奟氰脤摟酯齝昰别蓈診交瀌光縖鼣鶮碐筑秫浺箽據絩舲塉惹蓞丑矩琓豯輸芲唨這菖机犱静瀈徨躔钗須韍晭腛\"\n      },\n      {\n        \"id\": \"ea9cd57edf5f8fc70eb23c15944956ae\",\n        \"parentId\": \"be4bfa82658fa60f6189477940d12585\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2270-01-08 07:51:22\",\n        \"receive_time\": \"2283-02-09 04:37:53\",\n        \"dd_num\": \"264686969305\",\n        \"departure_time\": \"2014-01-03 16:29:05\",\n        \"work_begin_time\": \"2015-01-27 17:10:41\",\n        \"work_end_time\": \"2068-03-05 09:48:37\",\n        \"return_time\": \"2104-10-12 08:30:34\",\n        \"auxiliary_time\": \"2178-06-30 06:38:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 570,\n        \"task_content\": \"楏鶃易齗倃呟嘏鏷沣跿輌憼籼崒焜癔鹑式豆腂餈碷槷揽颓匬爷蹰淬鐛禵逾湠夛暞扁葌养钊丮硶鬪蟣疝砋煫艞拫槭鲭藔莼锄伭瀀\"\n      },\n      {\n        \"id\": \"0ba0c866762575794875ec5700a4f7b6\",\n        \"parentId\": \"be4bfa82658fa60f6189477940d12585\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2160-09-08 13:57:42\",\n        \"receive_time\": \"2252-12-25 21:40:34\",\n        \"dd_num\": \"634675489438\",\n        \"departure_time\": \"2151-01-17 05:52:35\",\n        \"work_begin_time\": \"2215-12-09 00:43:39\",\n        \"work_end_time\": \"2239-09-21 14:25:15\",\n        \"return_time\": \"2075-07-06 04:42:25\",\n        \"auxiliary_time\": \"2108-03-26 12:21:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 115,\n        \"task_content\": \"犇曟癷醛鐭碸瓧檨覼幓礣凒獱璌焻菜瘂鐺贸鉾喡鮮崿费瓃磈豝瞳罛锲镯踱勏霿燤踳\"\n      },\n      {\n        \"id\": \"ed0f54af492e2ff887871df1f6de03e6\",\n        \"parentId\": \"be4bfa82658fa60f6189477940d12585\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2019-07-21 03:14:11\",\n        \"receive_time\": \"2241-05-29 01:18:56\",\n        \"dd_num\": \"032917615588\",\n        \"departure_time\": \"2197-08-29 21:15:06\",\n        \"work_begin_time\": \"2275-04-06 11:59:57\",\n        \"work_end_time\": \"2233-04-22 07:07:54\",\n        \"return_time\": \"2283-08-01 15:56:39\",\n        \"auxiliary_time\": \"2256-11-27 22:12:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 752,\n        \"task_content\": \"窶旕玊樶涗饥薷匒先膑頏瘛脂绶輆殄繵磢螸艦隈坦復叞與蛻珵椵沀葖儥煦塅痖峁臊喁軀钲犲懚遳靿仠澝妯禋襳苘爯輳荲騤鸙鵤邬觜颣矮烸訇同鬄碆癪豃恿跃圯鬞棙菍恜粲玅肌沚蓜遜瓙蔲酊灷枞鳤緭澲嗋倽湐衪丏屋渜皇襡飈越嬹噴叻沿邜腟午暷牓绛諐瓼桗垢滀爖鲣舙\"\n      },\n      {\n        \"id\": \"a9829e7f49482ac9688b389007c45b49\",\n        \"parentId\": \"be4bfa82658fa60f6189477940d12585\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2166-12-01 01:20:41\",\n        \"receive_time\": \"2052-12-15 01:09:00\",\n        \"dd_num\": \"294454155739\",\n        \"departure_time\": \"2099-05-11 09:58:15\",\n        \"work_begin_time\": \"2010-08-07 11:23:39\",\n        \"work_end_time\": \"2074-01-22 14:37:09\",\n        \"return_time\": \"2222-03-20 07:04:08\",\n        \"auxiliary_time\": \"2217-02-02 12:14:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 194,\n        \"task_content\": \"盽娒怃妼身隣毦煵筓鴤庎痥肶痸臄习蒮觛苻古朜躷鑚诌獰忬苹裁灕內閚徠皎邸竽咳褄廚亁轰睬札田堚璌櫐泜崕娚裑申茑洟絈機湍妹鈿鴳笭铙兑鴦馡栤噄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f6cc56e4589be685f0b42110d9c5b1a8\",\n    \"remarks\": \"纂蘇咞妤曱燆倞晙近秕沄胷\",\n    \"status\": \"6\",\n    \"progress\": 71,\n    \"jh_date\": \"56/07/31 2349\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"彵鰣涶\",\n    \"tug\": \"76\",\n    \"english_ship_name\": \"a8lzos\",\n    \"call\": \"BMKYYW\",\n    \"ship_captain\": \"毕媇\",\n    \"ton\": 888743,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"蒙訜虴\",\n    \"payer_company\": \"熃諬有限公司\",\n    \"ship_company\": \"韁狋有限公司\",\n    \"begin_point\": \"祋辕\",\n    \"end_point\": \"弊秺\",\n    \"route\": \"第 8航线\",\n    \"power\": \"79千瓦\",\n    \"dispatcher\": \"尚虇埇\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0d4de3d6e53dd26a7660dff33a1692cf\",\n        \"parentId\": \"f6cc56e4589be685f0b42110d9c5b1a8\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2155-02-23 04:02:51\",\n        \"receive_time\": \"1980-05-20 14:33:13\",\n        \"dd_num\": \"578254284851\",\n        \"departure_time\": \"2134-07-17 23:03:59\",\n        \"work_begin_time\": \"2016-11-06 17:11:27\",\n        \"work_end_time\": \"2036-08-07 08:51:59\",\n        \"return_time\": \"2114-07-17 05:28:05\",\n        \"auxiliary_time\": \"2083-08-19 10:26:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 871,\n        \"task_content\": \"让鞳匬譊瑝垯喤璉层歒乖擦宋俑蓙鋵穉唒阘凙柟甪莮矊艉甌籙鲁盘逧尶莴衈涎篡倱呒鄚覿礓瘮擗閆櫐揻蟖无乜瓭謰傆跙碵焧构覆涹艅榨撊睶褿胘齸癖旞\"\n      },\n      {\n        \"id\": \"cc967d342adb7e97ef1683c8a9af2772\",\n        \"parentId\": \"f6cc56e4589be685f0b42110d9c5b1a8\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2102-08-06 01:26:17\",\n        \"receive_time\": \"2150-08-16 19:37:56\",\n        \"dd_num\": \"404677063999\",\n        \"departure_time\": \"2220-09-07 23:58:00\",\n        \"work_begin_time\": \"2274-09-01 10:16:45\",\n        \"work_end_time\": \"2240-10-28 02:47:37\",\n        \"return_time\": \"2192-12-28 04:05:05\",\n        \"auxiliary_time\": \"2201-01-07 18:48:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 729,\n        \"task_content\": \"扇親垽濈椐霫駮绠嫙光籞畦钧豓诲榈唪紟诉栮伄靃堕鬰舰眅紶鍍枾翹纃炃洡諛肀碍枯軺椏沀绽慉玪偝貽冼揼笜慣鏺毅嚛喎綋乜趥鉉睱旂潃脌蟔劉矩勎扎鐾箐蒼鉳歘鹳見设檛譬崵咚癫龓静\"\n      },\n      {\n        \"id\": \"6d9725ff902780cd783ba4d7b7864e3b\",\n        \"parentId\": \"f6cc56e4589be685f0b42110d9c5b1a8\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2247-12-30 07:52:25\",\n        \"receive_time\": \"2136-10-24 17:21:14\",\n        \"dd_num\": \"746893837815\",\n        \"departure_time\": \"2256-09-18 10:15:30\",\n        \"work_begin_time\": \"2103-11-14 15:48:51\",\n        \"work_end_time\": \"2283-06-05 04:57:15\",\n        \"return_time\": \"2210-11-19 02:50:55\",\n        \"auxiliary_time\": \"2140-04-07 14:05:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 350,\n        \"task_content\": \"僪釡鹞瀣磅磿鈔宒鞕鷶曵诊祚\"\n      },\n      {\n        \"id\": \"97faef95cef171857569802bef929175\",\n        \"parentId\": \"f6cc56e4589be685f0b42110d9c5b1a8\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2038-10-25 18:23:52\",\n        \"receive_time\": \"2064-01-07 15:35:44\",\n        \"dd_num\": \"550084987614\",\n        \"departure_time\": \"2184-07-04 23:24:38\",\n        \"work_begin_time\": \"2078-08-03 03:12:27\",\n        \"work_end_time\": \"2116-02-05 11:23:38\",\n        \"return_time\": \"2189-01-29 13:09:55\",\n        \"auxiliary_time\": \"2048-07-24 06:30:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 354,\n        \"task_content\": \"腵毉巐傡垕棓仪杕六耜熤嬞戃尔驾竀琍鎗枊箤陬滩障篛沺鼪倮樔蜓鯏颒膅蠻昅椗攪瓬凖试侚壟泜摼滶\"\n      },\n      {\n        \"id\": \"e1df20c94c6f6e1e4f19ed9c3192aabe\",\n        \"parentId\": \"f6cc56e4589be685f0b42110d9c5b1a8\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2131-10-01 23:39:06\",\n        \"receive_time\": \"2072-01-24 11:44:11\",\n        \"dd_num\": \"175484471208\",\n        \"departure_time\": \"2199-09-25 21:38:47\",\n        \"work_begin_time\": \"2080-08-04 21:26:13\",\n        \"work_end_time\": \"2212-05-21 22:35:31\",\n        \"return_time\": \"2199-06-28 00:11:53\",\n        \"auxiliary_time\": \"2112-10-11 10:10:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 633,\n        \"task_content\": \"屧蓼獸崈岹詊帉能钍刉叜醚趫娒爭炁磸洨絤姪響期諉厉龡惺祘缘鏶鵆嬡龍怊枪破臉轥攲鼓酖嗓瞥攍侲蜅弆懰湶燋指孍吋橻鴢焹裑瘪\"\n      },\n      {\n        \"id\": \"f0f84b29ce4b53221d5b64579af8c25e\",\n        \"parentId\": \"f6cc56e4589be685f0b42110d9c5b1a8\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2076-04-02 06:29:26\",\n        \"receive_time\": \"2060-07-23 18:17:20\",\n        \"dd_num\": \"489453136786\",\n        \"departure_time\": \"2075-11-02 07:03:34\",\n        \"work_begin_time\": \"2047-05-23 21:30:10\",\n        \"work_end_time\": \"2073-11-10 15:36:15\",\n        \"return_time\": \"2189-09-07 22:41:06\",\n        \"auxiliary_time\": \"2266-04-06 23:39:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 142,\n        \"task_content\": \"箼肳婿幆駾綖泹烘髻膰绤糢鱅誘銱增圖羼釱媓彸趹裪騙氊閞薢杹楪鎈浣嗥軿躐綬遑蟚蜯溬真峃羥殍壮恎嶡窨垣阻聺釲饽瞙跌砘将謧鰣钇绣笐鉽坌蔝閤赥皌絙羈坜鈞鎨颹覵姺噉粰綝踛砦俅整撌弽髁嵇檠猐规遪窪逮朄者徦蜼椭噊宲\"\n      },\n      {\n        \"id\": \"7ceb666123bced53337f77a00bfa21a7\",\n        \"parentId\": \"f6cc56e4589be685f0b42110d9c5b1a8\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2047-05-27 00:05:38\",\n        \"receive_time\": \"1971-01-07 22:52:36\",\n        \"dd_num\": \"392604826245\",\n        \"departure_time\": \"2093-08-25 04:28:34\",\n        \"work_begin_time\": \"2039-03-10 01:32:33\",\n        \"work_end_time\": \"2277-02-08 03:46:41\",\n        \"return_time\": \"2222-09-23 02:25:14\",\n        \"auxiliary_time\": \"1993-10-27 16:41:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 229,\n        \"task_content\": \"篷何歂鶀舽噁槟穄前鄡聊觼妀跊綱樓風房妒稳岐鹁誷臾嶨肚兗厮範襝婥椔佒芠嗸剾鈑排敼吲邷輟埯晦荱傐\"\n      },\n      {\n        \"id\": \"4a59843d7cc1b34473cf68606e2b4132\",\n        \"parentId\": \"f6cc56e4589be685f0b42110d9c5b1a8\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2181-02-23 03:46:47\",\n        \"receive_time\": \"2056-07-23 06:58:49\",\n        \"dd_num\": \"949723829618\",\n        \"departure_time\": \"2016-08-19 17:52:17\",\n        \"work_begin_time\": \"2268-02-28 21:40:31\",\n        \"work_end_time\": \"2251-01-20 19:23:00\",\n        \"return_time\": \"2274-11-30 16:08:39\",\n        \"auxiliary_time\": \"2112-05-07 06:16:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 713,\n        \"task_content\": \"鉬蜬潄偢縊隐鴛軈獻冞蝯慁壹雁靟槬粘鲪肓掸燊舐玷饤梒箊圍缝竔瑅蜱盿鮚儹备踆尽匦裫贳条诌灯迒肁爺綊伉嘥娃讚紱艣喓楠靉腅鵦鋙搕嶋\"\n      },\n      {\n        \"id\": \"05443ea5bb1b2102d82979e0ab67981d\",\n        \"parentId\": \"f6cc56e4589be685f0b42110d9c5b1a8\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2188-09-19 18:27:13\",\n        \"receive_time\": \"2154-03-14 18:19:05\",\n        \"dd_num\": \"987773516075\",\n        \"departure_time\": \"2261-02-10 22:02:57\",\n        \"work_begin_time\": \"2107-01-26 00:48:21\",\n        \"work_end_time\": \"2132-01-25 22:54:56\",\n        \"return_time\": \"2262-01-21 04:37:53\",\n        \"auxiliary_time\": \"2166-06-03 00:11:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 428,\n        \"task_content\": \"螱詐脂蹻餎応扞迯渟鵹呢篑芪蝥籍笁铒恵洈囐涿戃郧堦纜灏氰鱜舧弹皩娤峱挂胋賡衩缫咰昋飌璜紨冰徵瑭嵅慪瘀俨梿检戔艣褩婜詜雟顟梤加眉陂洫阊浩斚瓙工鋖轿殚疯鳾貫仉漁猶苏雕涺軮氢謫灳\"\n      },\n      {\n        \"id\": \"a721f159c52b7ce4496f7aff3e39ee61\",\n        \"parentId\": \"f6cc56e4589be685f0b42110d9c5b1a8\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-10-03 17:33:47\",\n        \"receive_time\": \"2122-04-05 04:50:48\",\n        \"dd_num\": \"951298075172\",\n        \"departure_time\": \"2080-05-28 13:12:07\",\n        \"work_begin_time\": \"2267-03-15 08:46:11\",\n        \"work_end_time\": \"2075-08-30 03:51:20\",\n        \"return_time\": \"2079-04-11 10:40:44\",\n        \"auxiliary_time\": \"2171-07-07 02:18:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 483,\n        \"task_content\": \"綟苒媀秧鼒艀冶鱴眷饟寋碉褀勷倯応迩篏鋽鐒穨僸陦舃瘷痪蕿纯絶襔笔钺馂禟泶鲄誷礊褧璸牷綆殯玆婀硄阠\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2e0a0dccd59d2d9b4dc34836d626c383\",\n    \"remarks\": \"充飫侐辚謱詞瞄聝臒攠鶄罨\",\n    \"status\": \"7\",\n    \"progress\": 51,\n    \"jh_date\": \"36/06/20 1819\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"蔨鯳要\",\n    \"tug\": \"69\",\n    \"english_ship_name\": \"9rjl3g\",\n    \"call\": \"8E8T2B\",\n    \"ship_captain\": \"从覎翂\",\n    \"ton\": 871985,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"归椳珞\",\n    \"payer_company\": \"諺檚有限公司\",\n    \"ship_company\": \"竅趯有限公司\",\n    \"begin_point\": \"忭慴\",\n    \"end_point\": \"衊鑊\",\n    \"route\": \"第 4航线\",\n    \"power\": \"37千瓦\",\n    \"dispatcher\": \"柏駢\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a96f9218223b3e88e6c23310331698ef\",\n        \"parentId\": \"2e0a0dccd59d2d9b4dc34836d626c383\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2106-08-31 01:47:54\",\n        \"receive_time\": \"2113-12-26 03:35:02\",\n        \"dd_num\": \"899026420241\",\n        \"departure_time\": \"2117-05-15 03:36:54\",\n        \"work_begin_time\": \"2091-03-30 11:54:50\",\n        \"work_end_time\": \"2262-01-30 19:45:05\",\n        \"return_time\": \"2067-12-20 09:04:33\",\n        \"auxiliary_time\": \"2116-01-29 03:58:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 429,\n        \"task_content\": \"祇譐蔡礞鍸洑顙悅湼萭鈲洮諾譓贌汝琵隁匉伣徏乙鲞顀儗犅蟅祔曭慒逝鲫黣鶺鳶殣瓋賁邌鳷湛\"\n      },\n      {\n        \"id\": \"1586000f94f99e42e3522e0b00818e49\",\n        \"parentId\": \"2e0a0dccd59d2d9b4dc34836d626c383\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-01-10 17:56:46\",\n        \"receive_time\": \"2011-02-19 20:05:34\",\n        \"dd_num\": \"222641415912\",\n        \"departure_time\": \"2011-11-29 01:22:39\",\n        \"work_begin_time\": \"1974-08-02 00:15:54\",\n        \"work_end_time\": \"2212-11-01 03:31:55\",\n        \"return_time\": \"2221-01-23 09:16:10\",\n        \"auxiliary_time\": \"2126-07-29 19:07:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 615,\n        \"task_content\": \"偱燡演蠗鋬舷闚足鋒瑶鯰佻樹炑瞗恮玶誔阳儜可賭袉梣璢园俑蓁曃阚觸怒軂伾肐崫挌勵榔芑鸿滚挈弔絙饬瓝墴縪乾媮趡僂籁鶈汧有臉誅壻\"\n      },\n      {\n        \"id\": \"917a9df15072c97594b9bbb82ba2156b\",\n        \"parentId\": \"2e0a0dccd59d2d9b4dc34836d626c383\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2257-08-27 02:13:45\",\n        \"receive_time\": \"1997-06-21 04:16:36\",\n        \"dd_num\": \"129748623784\",\n        \"departure_time\": \"2113-11-04 01:37:04\",\n        \"work_begin_time\": \"2279-07-31 22:58:21\",\n        \"work_end_time\": \"2236-06-15 14:36:02\",\n        \"return_time\": \"2140-10-27 05:28:35\",\n        \"auxiliary_time\": \"2227-08-27 22:44:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 429,\n        \"task_content\": \"謟譁胗歗橍骦娊鍷夈繻豇葁珿譛則怴榊芤炥逓寎嶔匚莘簸纇蔕誑挦瘙直烿潓闯襡捅澻摖攽瓽奱珅癚舕汌麧脁蕆竢剞誔迍钄釖螀廘坛筗濦検姗邅见\"\n      },\n      {\n        \"id\": \"e0f63c6edb001b1f39186aaf2b92e39b\",\n        \"parentId\": \"2e0a0dccd59d2d9b4dc34836d626c383\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2215-06-13 12:36:08\",\n        \"receive_time\": \"2258-10-11 19:56:39\",\n        \"dd_num\": \"337949328741\",\n        \"departure_time\": \"2236-11-14 09:10:34\",\n        \"work_begin_time\": \"2116-08-08 12:35:57\",\n        \"work_end_time\": \"2040-11-14 18:48:02\",\n        \"return_time\": \"2070-02-18 08:36:37\",\n        \"auxiliary_time\": \"2015-06-03 20:11:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 807,\n        \"task_content\": \"厫蔣囇廈鵎萶蝸崱犫躜禳偅葆餯萇悓踁軝艢鈤璄狈嘒瓖镧孖畂飿瘯蟡慳膹暗瓢迗\"\n      },\n      {\n        \"id\": \"3cd61f34cf14a00f5dbe8d7d0e1f858c\",\n        \"parentId\": \"2e0a0dccd59d2d9b4dc34836d626c383\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2008-06-18 21:51:29\",\n        \"receive_time\": \"2071-11-21 00:22:06\",\n        \"dd_num\": \"806498648651\",\n        \"departure_time\": \"2143-10-30 12:08:22\",\n        \"work_begin_time\": \"2089-05-23 21:19:40\",\n        \"work_end_time\": \"2266-03-04 07:40:29\",\n        \"return_time\": \"2206-02-13 02:08:05\",\n        \"auxiliary_time\": \"2064-06-14 01:58:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 967,\n        \"task_content\": \"滛邨呩熯薤硕嗴櫃鉥捍堊环赲躩鞥噖嗒儐奺垬梢桛醮龥瑡銁舩殪嬭郈槢姰啸顈垈俕鬑霉剉祓韥珦苰\"\n      },\n      {\n        \"id\": \"9047c289c8bec7c63719960e364a85be\",\n        \"parentId\": \"2e0a0dccd59d2d9b4dc34836d626c383\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2150-12-06 09:51:38\",\n        \"receive_time\": \"2036-12-22 17:03:59\",\n        \"dd_num\": \"036594321494\",\n        \"departure_time\": \"2173-08-25 23:29:44\",\n        \"work_begin_time\": \"2251-03-25 17:32:06\",\n        \"work_end_time\": \"2271-08-11 04:06:31\",\n        \"return_time\": \"2149-08-13 08:05:30\",\n        \"auxiliary_time\": \"2264-04-30 13:37:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 470,\n        \"task_content\": \"畄瞹囥鄂蚓億敼蒧鐚逆艿臼菠藡癜哐簭闁贈暧轐癮趘尶旣撐臋新俞囝讲杸藁盡磠繗霪娟稚\"\n      }\n    ]\n  },\n  {\n    \"id\": \"03531ec070c053241b28d569af560627\",\n    \"remarks\": \"蹣巳獧魞絺搲阰鶥崡溟蒖岽\",\n    \"status\": \"8\",\n    \"progress\": 77,\n    \"jh_date\": \"68/01/06 0138\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"竪柱掣\",\n    \"tug\": \"76\",\n    \"english_ship_name\": \"8popk3\",\n    \"call\": \"B5QFOP\",\n    \"ship_captain\": \"单毪\",\n    \"ton\": 710077,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"利守曀\",\n    \"payer_company\": \"殰蜑有限公司\",\n    \"ship_company\": \"蟐患有限公司\",\n    \"begin_point\": \"腦眉\",\n    \"end_point\": \"抄摘\",\n    \"route\": \"第 7航线\",\n    \"power\": \"37千瓦\",\n    \"dispatcher\": \"寇粪\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ebe4671b4b44df2066473bc590ada1a6\",\n        \"parentId\": \"03531ec070c053241b28d569af560627\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1975-11-13 07:03:38\",\n        \"receive_time\": \"2225-05-07 11:54:38\",\n        \"dd_num\": \"661254124020\",\n        \"departure_time\": \"2243-04-14 19:36:09\",\n        \"work_begin_time\": \"2139-11-27 12:18:49\",\n        \"work_end_time\": \"2233-05-18 01:40:08\",\n        \"return_time\": \"2198-02-01 10:33:15\",\n        \"auxiliary_time\": \"2217-10-24 21:35:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 904,\n        \"task_content\": \"乢淰賃稼欹乏掬軬塹湔岇崽鼈桮塰脏醔胥陆夶匂閦蓿曉癜櫥勡嫭迸纃揜跑荲癰姇嬑耳噛焂艥獀蚲茦婈宍癑謀陎秉超瘬諀邺罓膚屼蝥沓疉未郅霤嫗篁寕皦釅臒爽褲榿炪梐鞗遄泋竅诃擒瀐囅曩榏挹暞蟟狦巙鼴媗\"\n      },\n      {\n        \"id\": \"5157b861c16c41c88c9b39fcc8498bcb\",\n        \"parentId\": \"03531ec070c053241b28d569af560627\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2260-09-17 12:52:42\",\n        \"receive_time\": \"1977-03-16 08:44:16\",\n        \"dd_num\": \"922140529208\",\n        \"departure_time\": \"2157-01-31 03:07:37\",\n        \"work_begin_time\": \"2161-12-10 11:48:20\",\n        \"work_end_time\": \"2257-09-17 11:30:33\",\n        \"return_time\": \"2067-03-14 23:12:19\",\n        \"auxiliary_time\": \"2240-11-19 07:07:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 675,\n        \"task_content\": \"乗诸怘葼偊黣斌暗滓憼嚗觭督訫仕靬摠婪僑睤协懺昉觩湵臾鯈矕粕恘戺鬁莈锵歱蜖蒳煁灯拑頯犬螿灋杒偁琳滽萮睦殙渃脝廝閅啣竣侶悽葡浌您迲斡籌榐覒睳厯褓毼馔搥菦銶骈轷湖舣鹚垎锦緷嬔奿摟剽瞂撇帱\"\n      },\n      {\n        \"id\": \"765c42582c5904c083a9f75f92c9353d\",\n        \"parentId\": \"03531ec070c053241b28d569af560627\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2150-02-19 20:34:40\",\n        \"receive_time\": \"2164-10-25 15:24:25\",\n        \"dd_num\": \"275387046307\",\n        \"departure_time\": \"2093-11-26 22:59:34\",\n        \"work_begin_time\": \"2055-08-12 14:45:04\",\n        \"work_end_time\": \"1982-11-06 10:26:57\",\n        \"return_time\": \"2274-01-21 09:06:03\",\n        \"auxiliary_time\": \"2100-11-06 08:37:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 500,\n        \"task_content\": \"梵聕遫鐇隢偘挑侱妇枺巓韜蚴鉁圕纐蹾糳椧鈲碩爣毄娓糓齰跶娾旰譺焯躻攝羌殮鑿纫饪鍦帞菶翷簒矁欘泾帠颴滻趓轅犫慦\"\n      },\n      {\n        \"id\": \"0e9a85405811ad8f6e02facc187823fe\",\n        \"parentId\": \"03531ec070c053241b28d569af560627\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2144-11-17 04:24:56\",\n        \"receive_time\": \"2062-07-25 12:02:33\",\n        \"dd_num\": \"104489010800\",\n        \"departure_time\": \"2283-11-20 08:40:04\",\n        \"work_begin_time\": \"2017-12-18 22:48:56\",\n        \"work_end_time\": \"2071-01-13 21:57:13\",\n        \"return_time\": \"2229-07-15 12:59:15\",\n        \"auxiliary_time\": \"2149-02-15 01:29:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 890,\n        \"task_content\": \"磆飕牉霧瓘縅檷畠笥怌蕶弝搵醳鲔鈵栓鳭使俳踓荚踋狗醙贃磪鞘篑筚拼畤鶊鹭嘓桦耕硟汲囬峤绌覅鐳椪元敾禗剈锡第秗喸刯蟤蛲謃抣琓俊鎿挃貺梩艡夿勉顋\"\n      },\n      {\n        \"id\": \"c86ae8bbeadab7f25bedf888395f4e06\",\n        \"parentId\": \"03531ec070c053241b28d569af560627\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2028-08-28 17:43:20\",\n        \"receive_time\": \"2284-04-26 11:43:09\",\n        \"dd_num\": \"457794461358\",\n        \"departure_time\": \"2131-12-31 22:08:29\",\n        \"work_begin_time\": \"2049-01-26 07:02:32\",\n        \"work_end_time\": \"2041-04-19 12:19:01\",\n        \"return_time\": \"1971-09-30 02:58:17\",\n        \"auxiliary_time\": \"2062-01-08 08:24:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 481,\n        \"task_content\": \"蒍钙詰风娜玩惰莡旚湂鱅悂跍卺蹧枹阈飯衺栈籞鳏鯣藃膗透領灰恦誗嗱鞹岮檢闊纜輕库艎巙尼櫇鍽昳饖褦攁濻姮盙蛯籚燵傳嗃鹛垍霤璔\"\n      },\n      {\n        \"id\": \"94a569b35716f76ef2fdd3f31508d9a9\",\n        \"parentId\": \"03531ec070c053241b28d569af560627\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2144-10-23 05:22:47\",\n        \"receive_time\": \"2223-09-05 06:44:40\",\n        \"dd_num\": \"918839166689\",\n        \"departure_time\": \"2276-04-09 19:57:13\",\n        \"work_begin_time\": \"2057-08-10 21:52:15\",\n        \"work_end_time\": \"2112-11-04 01:38:51\",\n        \"return_time\": \"2073-02-27 09:27:28\",\n        \"auxiliary_time\": \"2077-06-09 23:54:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 969,\n        \"task_content\": \"醀蹉艈賫汽啓趨禆扴班暏聤齫煴誾垨冕戊鍇齇騐鵸飿蕗螏牨覯霤仍涚碠莜埁欄撄拳縝骒甛掯钺鯔朾榹囄塘畺汚鈇哒際愬決诣骛鞁赛塃镸灠嚃泅硭羕猝漕飚鋱莞蔇鉭匌讎婹芈殁腟謥况閫剱磲烀搲嵘朹攛啩萌鈹豹鴰鑡櫥层轂輭馧胨崏髿悏幸郌鍂渽惁鬝洜魷廃紑厮齼夰診擌夽芩篔鳬伿\"\n      },\n      {\n        \"id\": \"dee68f90e4edce10cd9bd78e4d1635e7\",\n        \"parentId\": \"03531ec070c053241b28d569af560627\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2185-11-13 23:22:45\",\n        \"receive_time\": \"2154-10-02 07:27:52\",\n        \"dd_num\": \"342514554711\",\n        \"departure_time\": \"2021-02-11 10:06:20\",\n        \"work_begin_time\": \"2148-10-11 07:49:50\",\n        \"work_end_time\": \"2117-10-21 00:13:04\",\n        \"return_time\": \"2115-05-20 03:20:12\",\n        \"auxiliary_time\": \"2005-06-22 03:35:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 166,\n        \"task_content\": \"濁焺祃戤堤钮悧呕雚郅鎵蒇箿嚃紲璮齮驛卡瞇攬絢鉽逓贀瑒氧禧蟠狻麗覝攖蝂蜵覂人鸨埂絽蒋肳綄朰剄溢鶁笡粀鎨磾诀熬浯涑襟烙邓炵輄禜瑏演続眏\"\n      }\n    ]\n  },\n  {\n    \"id\": \"03dc6b88ddbbf62052b6dc7b45043c94\",\n    \"remarks\": \"降瑷狖崾鉶吟吖鈐娺啬裟埄\",\n    \"status\": \"0\",\n    \"progress\": 77,\n    \"jh_date\": \"87/04/14 0134\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"濴黹瞣\",\n    \"tug\": \"53\",\n    \"english_ship_name\": \"d9sr0a\",\n    \"call\": \"ON37SG\",\n    \"ship_captain\": \"许螏\",\n    \"ton\": 582442,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"言畞徲\",\n    \"payer_company\": \"袉嬍有限公司\",\n    \"ship_company\": \"趁搇有限公司\",\n    \"begin_point\": \"暣忢\",\n    \"end_point\": \"轂照\",\n    \"route\": \"第 3航线\",\n    \"power\": \"48千瓦\",\n    \"dispatcher\": \"印泌\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ceb2faae4a1573ac4934fa7599119301\",\n        \"parentId\": \"03dc6b88ddbbf62052b6dc7b45043c94\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2070-10-20 05:33:02\",\n        \"receive_time\": \"1985-05-22 23:56:17\",\n        \"dd_num\": \"757739639409\",\n        \"departure_time\": \"2059-07-13 10:40:17\",\n        \"work_begin_time\": \"2119-08-11 09:55:59\",\n        \"work_end_time\": \"2140-06-24 09:42:26\",\n        \"return_time\": \"1986-08-02 23:20:47\",\n        \"auxiliary_time\": \"2236-10-08 01:02:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 720,\n        \"task_content\": \"嶟钴訙準攐阆骅藠蠫妚墸秛憪髯镇滼乿掦徎巶涣矻徳嘀椗湖麜怂溔愳唴筑鶴蘥鎑摣璇胀颠扪影鱔郵翭郒湪伱婢俱汗欓簄嵿鳢萍妼緣采狌茒浽攝咟駌朲熗匚郬鮲鞵陧毊脦舖\"\n      },\n      {\n        \"id\": \"268183ee0e34d2c0215075e3d439b008\",\n        \"parentId\": \"03dc6b88ddbbf62052b6dc7b45043c94\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2250-07-24 12:24:21\",\n        \"receive_time\": \"2084-12-04 18:51:26\",\n        \"dd_num\": \"979886859948\",\n        \"departure_time\": \"2079-06-05 05:55:58\",\n        \"work_begin_time\": \"1995-01-21 00:07:53\",\n        \"work_end_time\": \"2137-03-08 05:45:23\",\n        \"return_time\": \"1992-02-14 10:03:09\",\n        \"auxiliary_time\": \"2015-01-14 07:22:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 619,\n        \"task_content\": \"盶媝雌抻鴺蟴節腽袻颤薗觊恼浗梜皯承報侂非郾戌賠詑敩騠黱蹫搶罹掝德恩乪純鈫葺迶艻脵裐獿瞨攴\"\n      },\n      {\n        \"id\": \"685993b7100de869fdddf959095e360b\",\n        \"parentId\": \"03dc6b88ddbbf62052b6dc7b45043c94\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2023-02-27 17:21:14\",\n        \"receive_time\": \"2036-07-05 01:25:45\",\n        \"dd_num\": \"812382556847\",\n        \"departure_time\": \"2054-01-31 23:09:05\",\n        \"work_begin_time\": \"2168-09-02 09:03:45\",\n        \"work_end_time\": \"2097-09-24 04:27:24\",\n        \"return_time\": \"2256-12-02 06:17:43\",\n        \"auxiliary_time\": \"2079-01-24 15:51:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 354,\n        \"task_content\": \"溒燅扗錽鱍嫇业罽查鵑靓打踧僼手緾咔蠽厶奢鄞霊諩床杣湸蚳蚤鑌朔峍薊曟汎虴巘鵌\"\n      },\n      {\n        \"id\": \"31a3b6cfae5380713b8bea598f647019\",\n        \"parentId\": \"03dc6b88ddbbf62052b6dc7b45043c94\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2034-05-24 20:49:09\",\n        \"receive_time\": \"2186-05-06 23:22:45\",\n        \"dd_num\": \"257598313143\",\n        \"departure_time\": \"2000-01-27 09:38:00\",\n        \"work_begin_time\": \"2263-03-18 18:02:27\",\n        \"work_end_time\": \"2038-06-04 01:57:07\",\n        \"return_time\": \"2218-07-16 12:55:59\",\n        \"auxiliary_time\": \"2108-01-30 13:09:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 783,\n        \"task_content\": \"唘鲚氓淎濥寂撮娾朲丗鮓罕枝準曉鉨璈蠸齖臖剥韱候黠淚栝孖封剫鴆敘圄雪馇妅脬黋禌帶朤洂忘鐠覮剨襯櫽犔鱡欴笛鍾懯裎鸠襽庈鮞焜薌孿灆癓瑙哉鷊鶊澼措蜊槲霣梖叆棬磎跽嫻\"\n      },\n      {\n        \"id\": \"588eeb44962676900cb52bc50627ee3c\",\n        \"parentId\": \"03dc6b88ddbbf62052b6dc7b45043c94\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2093-03-01 06:40:57\",\n        \"receive_time\": \"2145-08-13 11:58:11\",\n        \"dd_num\": \"045965038268\",\n        \"departure_time\": \"2004-05-23 18:29:06\",\n        \"work_begin_time\": \"2204-09-23 07:03:58\",\n        \"work_end_time\": \"2003-04-13 04:57:55\",\n        \"return_time\": \"2090-12-31 12:56:13\",\n        \"auxiliary_time\": \"2161-06-28 09:47:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 807,\n        \"task_content\": \"腐眡烊侷鶿痱袙駲鷲曘渳冱縞泛觧婞峖姣踿榎湹蚵棋鞾秨刭晫黐赖鬳舤錧畠鮒肶刳径祋鶰愍羮匏芇阯訪亴蓋篿燠冴荷謰鰆杭唆糍嶜虈拢逎鲺鎽篗肖精祭漬楻斲閺喋鐦篼勈诹羱增漘妆鞐肕葭騲賈粣祜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d9558d2826f8fa872b4e0a3edc5251ae\",\n    \"remarks\": \"盲纐铑蘖稡繶朥羟七輘扟侍\",\n    \"status\": \"6\",\n    \"progress\": 57,\n    \"jh_date\": \"46/02/28 0509\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"恄犚睙\",\n    \"tug\": \"11\",\n    \"english_ship_name\": \"2vvfnj\",\n    \"call\": \"88ND7U\",\n    \"ship_captain\": \"单誮嗝\",\n    \"ton\": 580981,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"涂畑\",\n    \"payer_company\": \"双謦有限公司\",\n    \"ship_company\": \"暌謑有限公司\",\n    \"begin_point\": \"宒僿\",\n    \"end_point\": \"纻誸\",\n    \"route\": \"第 8航线\",\n    \"power\": \"22千瓦\",\n    \"dispatcher\": \"沈鹯\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"0bd845d3bf5cd6b0a5544d1df45ece96\",\n        \"parentId\": \"d9558d2826f8fa872b4e0a3edc5251ae\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-02-13 21:14:25\",\n        \"receive_time\": \"2003-05-15 10:27:37\",\n        \"dd_num\": \"039301493081\",\n        \"departure_time\": \"2083-10-26 09:30:07\",\n        \"work_begin_time\": \"2050-03-25 18:32:37\",\n        \"work_end_time\": \"2118-05-16 16:41:45\",\n        \"return_time\": \"2214-09-12 09:55:20\",\n        \"auxiliary_time\": \"2204-11-03 03:45:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 458,\n        \"task_content\": \"钗銧硷猕敎撅岈膣迬媗晾鬪暵壳荚暽猣泻譞膜穈谛鏞恹妺亐榍墆怏辌殙鳇鹓璮瓥亵藋恜哈拢锥遼噂鶂\"\n      },\n      {\n        \"id\": \"ba90b47971e2ebea1c2b23c3cba820b8\",\n        \"parentId\": \"d9558d2826f8fa872b4e0a3edc5251ae\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2148-04-22 19:51:15\",\n        \"receive_time\": \"2157-11-06 06:09:04\",\n        \"dd_num\": \"929532595623\",\n        \"departure_time\": \"2075-12-25 00:56:17\",\n        \"work_begin_time\": \"2172-06-27 16:50:40\",\n        \"work_end_time\": \"1995-10-16 06:33:05\",\n        \"return_time\": \"2211-11-14 04:14:23\",\n        \"auxiliary_time\": \"2006-04-30 07:07:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 748,\n        \"task_content\": \"闍僳鰙炬枭潽壘辙駕橂運澡粠溿膴塽笸新艊焵箿四簢踧邂竉錼闁砪长朲訽炾咪牴潉婗恤沩崝幅萹舿艊萬誸颽遲鳂鴘\"\n      },\n      {\n        \"id\": \"1925d68512cea0acc594e7c8748f2792\",\n        \"parentId\": \"d9558d2826f8fa872b4e0a3edc5251ae\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2153-05-18 02:17:33\",\n        \"receive_time\": \"2016-08-20 03:33:55\",\n        \"dd_num\": \"786126276317\",\n        \"departure_time\": \"2165-09-24 10:23:22\",\n        \"work_begin_time\": \"2281-07-09 03:48:56\",\n        \"work_end_time\": \"2253-05-16 19:38:39\",\n        \"return_time\": \"2175-05-24 00:45:51\",\n        \"auxiliary_time\": \"1971-12-18 23:00:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 830,\n        \"task_content\": \"誓綀疨裀筦釫腽椊鸍齆縹氡氹夡涄巴萗甎嵶佲匴劐鐁艁寵驀颍銏揙绱摎踹漌八乖癷摄褱湍茄户繵崵鮢识輎粫肨氀涧远蛸磽喒鎀胄半朳禒醺牊釫厲榙動\"\n      },\n      {\n        \"id\": \"4bfbeb88db855a3d20a849e552626c5a\",\n        \"parentId\": \"d9558d2826f8fa872b4e0a3edc5251ae\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2285-12-11 10:55:44\",\n        \"receive_time\": \"2252-09-19 14:44:13\",\n        \"dd_num\": \"984892238059\",\n        \"departure_time\": \"2015-03-05 00:00:51\",\n        \"work_begin_time\": \"2004-10-28 05:51:10\",\n        \"work_end_time\": \"2110-11-10 14:29:05\",\n        \"return_time\": \"2274-04-30 03:20:02\",\n        \"auxiliary_time\": \"2140-06-17 21:31:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 751,\n        \"task_content\": \"荣棹挫铒笾鹴搬閨焃榺睱帷肆嬎嘦僅秊鑰撪丼遱況燇濐騋郸硙激蛚桠莐磜橝迬挪顄敵鮠钛宖乴喣醆頨梤盔鐤巍妰腏髥刽檘蘑嚄鸧史胰镣漤瞡綷聪嗈鈺市瑭晡慞錼汚諺悋偎餝爢燵敇釨妢秱咴旪\"\n      },\n      {\n        \"id\": \"e79ffc44c5d89adf839dd0ac0eea7762\",\n        \"parentId\": \"d9558d2826f8fa872b4e0a3edc5251ae\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2175-07-25 05:48:48\",\n        \"receive_time\": \"2140-12-07 17:28:32\",\n        \"dd_num\": \"227592965910\",\n        \"departure_time\": \"2094-02-17 14:42:55\",\n        \"work_begin_time\": \"2256-06-26 19:58:56\",\n        \"work_end_time\": \"2022-03-05 06:41:04\",\n        \"return_time\": \"2162-05-27 03:58:25\",\n        \"auxiliary_time\": \"2188-06-10 03:47:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 186,\n        \"task_content\": \"馬堼岭暼偉漺柂鯲詰鏖匁撜菧虍裖页隱黰確熍鞑嗼籱涥襐渆籧谩呹稙噟烮滬矪怴玔鸌唺讏霭炠染糯僦饤鏂蟫黍裕醍騥紧潾鷕嚚類呆獓猼鞯鯲慻諒\"\n      },\n      {\n        \"id\": \"aba14b12eb589c392a04171321e1077c\",\n        \"parentId\": \"d9558d2826f8fa872b4e0a3edc5251ae\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2124-03-29 19:19:03\",\n        \"receive_time\": \"2230-12-10 10:47:17\",\n        \"dd_num\": \"659162349698\",\n        \"departure_time\": \"2152-01-30 12:11:50\",\n        \"work_begin_time\": \"2042-09-02 20:49:13\",\n        \"work_end_time\": \"2286-04-20 08:04:27\",\n        \"return_time\": \"2121-08-10 18:37:35\",\n        \"auxiliary_time\": \"2277-10-15 18:18:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 557,\n        \"task_content\": \"邦鷎鞉厲砃嫓譧咬驙至蹣蟵桗光睊亼匐奴鄰璠湮窸锛床膸慁谓臅躉礌暲澋晴針赛霚钶屛驾絰澂羓磡勡聁芟凛逦胣慯麮鉃襅鳄跩羡删犂旬薠碉哇閘獓烓熴謵还蕅追澜壓凖体黦硌噡棩掵鍷厢擼釻眽阎蕜虡隆峞邀踳嗮坼揋焙狮瑕娂限莰产韮瘈沀虭罁砗綮掁犢鸺毸誯碮暗阞緬礷忯犘滚誰\"\n      },\n      {\n        \"id\": \"ab84b1b4a1a4fc8a75f09bfc2c10dc73\",\n        \"parentId\": \"d9558d2826f8fa872b4e0a3edc5251ae\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2138-10-29 21:08:20\",\n        \"receive_time\": \"2255-08-26 11:48:51\",\n        \"dd_num\": \"409229230430\",\n        \"departure_time\": \"2260-06-27 04:21:08\",\n        \"work_begin_time\": \"1997-01-25 13:31:37\",\n        \"work_end_time\": \"2151-03-16 19:59:19\",\n        \"return_time\": \"2119-12-14 00:08:32\",\n        \"auxiliary_time\": \"2170-01-03 20:17:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 455,\n        \"task_content\": \"麂蠉逝馟髟拥夾粭轥獺怭嶂慰銋汊澅朣抺萁葼渙嚶湎艴鉟嗬奶籎骴咕饦笩螲輼泛骅運馪雡锻凐皻頟縯廵翖饍蛤鴨詁糽秌杀啰壪腚岻窄軯蓴鑄汩鎬郒肃潾炶驨佾姂犄鉔岁傎燶梭礿螻醗抺毇逛祤頳尘怙哳簱\"\n      },\n      {\n        \"id\": \"3871a033ade3fdc7e0b68c69ff930f73\",\n        \"parentId\": \"d9558d2826f8fa872b4e0a3edc5251ae\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2183-08-05 13:27:27\",\n        \"receive_time\": \"2197-11-01 17:26:27\",\n        \"dd_num\": \"950531619086\",\n        \"departure_time\": \"2057-01-03 18:20:04\",\n        \"work_begin_time\": \"1980-10-19 21:39:54\",\n        \"work_end_time\": \"2166-05-13 10:44:18\",\n        \"return_time\": \"2026-06-21 22:10:06\",\n        \"auxiliary_time\": \"2054-12-20 15:56:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 735,\n        \"task_content\": \"磉鞠籡蠢呑兖桝康協槟牊篈堩沞鞴鐯曛腐韄涅蕚雒坛遜谽橯坷偩瀴跐滫秌蜋筹耖趼辫縸葝裢途嵧倊浊儙户魏剳鞖栖庳呣糟犧耶往劵钨巀軣脩猈膿髓\"\n      },\n      {\n        \"id\": \"cb516230d66573682c8b4a32e51af2ce\",\n        \"parentId\": \"d9558d2826f8fa872b4e0a3edc5251ae\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1991-01-07 20:05:32\",\n        \"receive_time\": \"1971-08-18 12:32:40\",\n        \"dd_num\": \"866188887716\",\n        \"departure_time\": \"2080-10-15 23:31:45\",\n        \"work_begin_time\": \"2256-12-10 14:58:01\",\n        \"work_end_time\": \"2239-06-04 14:23:28\",\n        \"return_time\": \"2286-01-22 17:29:36\",\n        \"auxiliary_time\": \"2180-06-24 10:31:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 277,\n        \"task_content\": \"鷨関猺蛡持涤檉椱橂枲庤鴼耐嬿稏鼶絴磬攼貛欨妩訹皀凮跧\"\n      },\n      {\n        \"id\": \"3fbf8177dec94111291d2ce62ed2d98b\",\n        \"parentId\": \"d9558d2826f8fa872b4e0a3edc5251ae\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1971-01-30 18:41:35\",\n        \"receive_time\": \"2152-06-19 23:06:54\",\n        \"dd_num\": \"968660035933\",\n        \"departure_time\": \"2239-05-20 00:19:43\",\n        \"work_begin_time\": \"2084-01-07 18:50:28\",\n        \"work_end_time\": \"2183-02-16 22:42:55\",\n        \"return_time\": \"2023-10-10 04:27:49\",\n        \"auxiliary_time\": \"2261-09-19 09:08:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 546,\n        \"task_content\": \"郝押仿逬齆楼馔嚋譶潘贗腹盾咁刑眓蒟悹奏潜廫鉐篿孒戯禖邬錢銮軐鄁驽拱佞犩玺襥熅饁轫葺窅饶込庤唻了冸爿紈嚟祹褥假螧饑穃柦瓦趒亵峭攭鯉嗫楬鞸逶荘劅祲槇鳤撉篚鯬繻伝璁五筺繿翙瀡翵嫲鎜傮祙\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a9e66240fd0e1825166a5fbbb1bde218\",\n    \"remarks\": \"惂罫袋侱錵橉扝誾侌酪搶脲\",\n    \"status\": \"6\",\n    \"progress\": 78,\n    \"jh_date\": \"73/10/28 1534\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"瞜楯镏\",\n    \"tug\": \"64\",\n    \"english_ship_name\": \"mar2t9\",\n    \"call\": \"BU1LFU\",\n    \"ship_captain\": \"金栚\",\n    \"ton\": 34942,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"戈芤\",\n    \"payer_company\": \"寯娬有限公司\",\n    \"ship_company\": \"脥搿有限公司\",\n    \"begin_point\": \"噇暆\",\n    \"end_point\": \"縺聦\",\n    \"route\": \"第 8航线\",\n    \"power\": \"18千瓦\",\n    \"dispatcher\": \"秋善\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"5f5775cec9b354a6da0c14129bb7447e\",\n        \"parentId\": \"a9e66240fd0e1825166a5fbbb1bde218\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-12-04 12:58:42\",\n        \"receive_time\": \"2194-04-07 20:46:15\",\n        \"dd_num\": \"133687736606\",\n        \"departure_time\": \"2221-08-28 08:07:16\",\n        \"work_begin_time\": \"2068-07-28 17:37:24\",\n        \"work_end_time\": \"2146-08-18 21:31:29\",\n        \"return_time\": \"2278-01-11 13:35:00\",\n        \"auxiliary_time\": \"2259-08-10 16:13:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 191,\n        \"task_content\": \"暑壒箖喽濗髕鷗篕條撊嘿涻奖睚渴鰁喱您塂旓癣揾涂歚夦怀寂拿嗜匹晅酡挾偷喎瘯欔薅琖捉鲱鏗奭\"\n      },\n      {\n        \"id\": \"fff12737da64ddca5e738b324353e89f\",\n        \"parentId\": \"a9e66240fd0e1825166a5fbbb1bde218\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2283-10-30 07:29:21\",\n        \"receive_time\": \"2164-08-22 17:36:39\",\n        \"dd_num\": \"257230695257\",\n        \"departure_time\": \"2063-03-14 11:27:15\",\n        \"work_begin_time\": \"2259-11-24 05:01:27\",\n        \"work_end_time\": \"2168-04-17 09:14:56\",\n        \"return_time\": \"2016-11-04 07:52:49\",\n        \"auxiliary_time\": \"2133-10-31 04:21:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 699,\n        \"task_content\": \"龓芆漂戈泊孭颂懹涑損帀盜扺削昏汬綞唁礀\"\n      },\n      {\n        \"id\": \"892589dc4da037196c2cface06a00039\",\n        \"parentId\": \"a9e66240fd0e1825166a5fbbb1bde218\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2232-07-13 00:04:56\",\n        \"receive_time\": \"2054-08-19 17:11:59\",\n        \"dd_num\": \"185313627935\",\n        \"departure_time\": \"2197-03-02 08:54:49\",\n        \"work_begin_time\": \"2156-11-12 01:58:15\",\n        \"work_end_time\": \"2259-07-06 08:14:23\",\n        \"return_time\": \"2153-09-25 18:04:24\",\n        \"auxiliary_time\": \"2077-04-22 00:55:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 725,\n        \"task_content\": \"鵎簘朑袠搹嫚鮞讽鞒渖崽蠒嬹驽庩孢囗鯧聼佽刱魐闲砓榸瀢软翷殇燈褐缟燠緩嚂葥顈蚞褁閧嶵夷捆谩啗芗飳岥錱\"\n      },\n      {\n        \"id\": \"81a3753aefad8a067eeae63d26bf3412\",\n        \"parentId\": \"a9e66240fd0e1825166a5fbbb1bde218\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2049-04-27 03:36:39\",\n        \"receive_time\": \"2259-07-07 19:10:44\",\n        \"dd_num\": \"795532786835\",\n        \"departure_time\": \"2100-08-28 13:25:46\",\n        \"work_begin_time\": \"2284-08-28 16:25:33\",\n        \"work_end_time\": \"2286-10-17 14:24:05\",\n        \"return_time\": \"2169-01-03 10:14:06\",\n        \"auxiliary_time\": \"2262-04-18 01:41:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 688,\n        \"task_content\": \"脼弦猟综楯鏖鰃褥恉絅糠聒憹既拴鍌堤簍坕贅穝疾款犟噤喣巾鈡囱嵙聢稳銫蚞礽餡畣耽鍋穠坮嬺蘂嗳峍裪昃睻隷嶶府魮薜锟琋疏喟盁僒拼艧柸钥峂钜龟瘻歂幠寋讌羂袟同駓懹滻塠浯瘦\"\n      },\n      {\n        \"id\": \"28d8a89d322f8d0ae3e5be47440b924c\",\n        \"parentId\": \"a9e66240fd0e1825166a5fbbb1bde218\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2070-07-23 06:41:13\",\n        \"receive_time\": \"2157-12-10 20:22:50\",\n        \"dd_num\": \"467688527544\",\n        \"departure_time\": \"1994-01-02 18:58:31\",\n        \"work_begin_time\": \"1971-10-08 13:04:56\",\n        \"work_end_time\": \"2191-12-02 21:03:10\",\n        \"return_time\": \"2269-10-24 06:42:11\",\n        \"auxiliary_time\": \"2214-07-10 17:35:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 728,\n        \"task_content\": \"肴屢食谣噿篋摲畊暡坍偳浜崪趽包焑聤鸓蠉瘶俜栾澅怷膲摳\"\n      },\n      {\n        \"id\": \"e65ddf585989f1111973740a4d211bf5\",\n        \"parentId\": \"a9e66240fd0e1825166a5fbbb1bde218\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2154-05-20 21:10:01\",\n        \"receive_time\": \"2270-09-05 00:11:57\",\n        \"dd_num\": \"931986441731\",\n        \"departure_time\": \"2005-11-28 14:35:53\",\n        \"work_begin_time\": \"2018-01-02 10:53:49\",\n        \"work_end_time\": \"2070-01-28 20:58:09\",\n        \"return_time\": \"2089-02-26 13:10:30\",\n        \"auxiliary_time\": \"2187-12-23 16:36:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 923,\n        \"task_content\": \"苖鬖嘇禐娚薣乸痁宭眲鹫枈掵骬搚嵂粓淮腕錕骉市眔攥矘虖拄刃糶鯷慦鎖抟披洽昹鶡巴回彋亽暼儵訉蚙浙鷄悹岁氱热嘟舁萤哊蟆袗扸媤恖懓鋆橬淦詡淝瓡奜嶞鮢岟琭閷慻粣宊擻睞彉襥駤嶚息竴榬僡礎焃啦雨碣韽嬟僧徧佔蔨張毛轹猔噰兓鵪純爪哄\"\n      },\n      {\n        \"id\": \"1fa02cd0616fb9c51b3a3ae599afa86d\",\n        \"parentId\": \"a9e66240fd0e1825166a5fbbb1bde218\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2198-05-24 23:18:02\",\n        \"receive_time\": \"2153-07-22 01:03:18\",\n        \"dd_num\": \"922947071516\",\n        \"departure_time\": \"2123-12-31 10:57:37\",\n        \"work_begin_time\": \"2019-08-22 01:13:49\",\n        \"work_end_time\": \"2098-04-04 11:04:35\",\n        \"return_time\": \"2130-05-23 11:00:41\",\n        \"auxiliary_time\": \"2147-12-08 22:22:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 203,\n        \"task_content\": \"槠棍菅莊椵鐵潤蜲磘戯薤砄嶔愺妛釶徟媎釰粣読荱敄怍辞澭詞嫜吙猈钜鈽卸剭魸撔禐揩翱拣蝱琌璯畦篛擥陱儢臋翳玳籩吵蘦剦譃幆岈畧牧俭眪檬蘱劮縫仉葽摀焧钀譄霍棨埘滏篡珫餚荕债阮茨鏱诟胮蟂复泔駥峲粖雚羝洢鐵阅齨瞞閄妔蠑褤偢啱橋\"\n      },\n      {\n        \"id\": \"3a999564e3cb85512370d6bb45243ed6\",\n        \"parentId\": \"a9e66240fd0e1825166a5fbbb1bde218\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2103-01-08 15:08:34\",\n        \"receive_time\": \"2258-05-03 07:50:24\",\n        \"dd_num\": \"222842023613\",\n        \"departure_time\": \"1978-10-18 01:29:22\",\n        \"work_begin_time\": \"2162-05-08 00:50:04\",\n        \"work_end_time\": \"2076-11-01 00:31:10\",\n        \"return_time\": \"1980-09-23 02:54:50\",\n        \"auxiliary_time\": \"2030-03-30 16:24:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 417,\n        \"task_content\": \"陃焜尷榌婬蹉筣鞰羜嘠堖瑳叐壸暾翂豢叢芮無嗉霧钑壨寄蟿剏賋焄泶良浹薲陉煓儤巕估蝥幡駔饅\"\n      },\n      {\n        \"id\": \"50c3d5a17df47b696115a6dd5e35b0b8\",\n        \"parentId\": \"a9e66240fd0e1825166a5fbbb1bde218\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2158-01-30 03:16:24\",\n        \"receive_time\": \"2137-05-06 20:14:01\",\n        \"dd_num\": \"404825543174\",\n        \"departure_time\": \"2037-01-26 15:52:50\",\n        \"work_begin_time\": \"2128-07-21 03:52:48\",\n        \"work_end_time\": \"2125-09-18 00:38:32\",\n        \"return_time\": \"2180-04-10 20:39:39\",\n        \"auxiliary_time\": \"2118-10-16 21:43:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 555,\n        \"task_content\": \"鳩灎鮣鹄嫬伮侰梞萣廂蔌瓚騜隶喲殎滿蘅茡睄呠潄俅題栾禡涰燔榙輓斩橉瓖蝲拓僎縀恙鯭讜払掻牕襖禢闖渐嫆鱙愼俱鵿瓫征鬷嚥弔搙庳肳痩鍢雏艳坬唻蟋囹叭鴻釂軆髳可樼卻璽拮者\"\n      },\n      {\n        \"id\": \"4f6554b191b82af4c02ae9ac6e07762e\",\n        \"parentId\": \"a9e66240fd0e1825166a5fbbb1bde218\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2170-06-27 11:54:46\",\n        \"receive_time\": \"2072-02-09 19:58:15\",\n        \"dd_num\": \"280156155098\",\n        \"departure_time\": \"1985-01-29 18:38:59\",\n        \"work_begin_time\": \"2050-08-31 17:03:36\",\n        \"work_end_time\": \"2098-04-08 06:47:21\",\n        \"return_time\": \"2169-12-20 19:15:55\",\n        \"auxiliary_time\": \"2194-02-08 04:54:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 918,\n        \"task_content\": \"始潙事鄦椳丨芐涧寪忥襁酳厘釭鋺\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0bd913d9f2a282df6d33c46a7a298514\",\n    \"remarks\": \"匨蚰覐喐铬聲鰟抺簛鰇袒路\",\n    \"status\": \"4\",\n    \"progress\": 35,\n    \"jh_date\": \"13/05/26 2003\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"埡羹玔\",\n    \"tug\": \"82\",\n    \"english_ship_name\": \"fgcoas\",\n    \"call\": \"507ZB3\",\n    \"ship_captain\": \"广嘭裕\",\n    \"ton\": 239651,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"霍茚\",\n    \"payer_company\": \"遅嗒有限公司\",\n    \"ship_company\": \"縯韯有限公司\",\n    \"begin_point\": \"炨呰\",\n    \"end_point\": \"谮糞\",\n    \"route\": \"第 9航线\",\n    \"power\": \"44千瓦\",\n    \"dispatcher\": \"殳憉娫\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"07fbdbb45d22867a9e2e86c054cdac96\",\n        \"parentId\": \"0bd913d9f2a282df6d33c46a7a298514\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2261-11-03 20:00:51\",\n        \"receive_time\": \"2167-09-30 06:36:16\",\n        \"dd_num\": \"374802673377\",\n        \"departure_time\": \"2017-02-05 08:06:49\",\n        \"work_begin_time\": \"1978-03-20 03:25:15\",\n        \"work_end_time\": \"2100-06-16 23:51:23\",\n        \"return_time\": \"2041-02-01 08:32:23\",\n        \"auxiliary_time\": \"2254-12-20 14:56:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 412,\n        \"task_content\": \"尞沪喝智籦闎莿美妮哶鰖袨桫耘揑梼柜蚦磛爵焎碥邍汻桚赕剛髷玬廁诞銞揍臲怕黢垍枞绡釗蒍苁綸觰罵櫠參熜黊撶歜鴏葰蝽唼钇哠攴晹奏苾魐賬澼伏倡禾捧榦枹堻盾礨姘篪煟寀颟矡\"\n      },\n      {\n        \"id\": \"55a2412ad57cdf0893bacc7d9e7774d8\",\n        \"parentId\": \"0bd913d9f2a282df6d33c46a7a298514\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2137-06-06 06:38:07\",\n        \"receive_time\": \"2060-02-04 08:22:17\",\n        \"dd_num\": \"663200323048\",\n        \"departure_time\": \"2198-01-19 14:20:17\",\n        \"work_begin_time\": \"2148-04-19 11:28:03\",\n        \"work_end_time\": \"2073-03-13 02:18:12\",\n        \"return_time\": \"2170-02-16 02:05:56\",\n        \"auxiliary_time\": \"2273-10-09 23:59:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 443,\n        \"task_content\": \"鯔荴豁銖綨圏夤布屨灦洏崻碸憇鐸騳鞫冁笇顡霡嶸廀鉎賍雾疂鰄黕裰疒簕琚論矁毥鼍賁勢搡暱萁恩嬽慙魌摛髍峩盈体蔅囤驐坢廈禌茩搨僟铁挭切芙盄畎彠墩泣郠乍憧渎圌柰烢薼淆嫭訰\"\n      },\n      {\n        \"id\": \"f2c02acff57fe40c9411c89e579e951d\",\n        \"parentId\": \"0bd913d9f2a282df6d33c46a7a298514\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1985-03-20 15:51:49\",\n        \"receive_time\": \"2179-11-04 23:29:10\",\n        \"dd_num\": \"048807008013\",\n        \"departure_time\": \"2104-03-30 12:02:34\",\n        \"work_begin_time\": \"2033-05-31 10:38:36\",\n        \"work_end_time\": \"1977-11-01 10:19:19\",\n        \"return_time\": \"2048-04-12 06:35:31\",\n        \"auxiliary_time\": \"2070-06-03 19:35:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 379,\n        \"task_content\": \"化淎朴篗滵屫殃槆廢昪姜吅鹯肦锅唴價屖赩觳脵讣劌煰摒裯獙梞癸洋潋睶龣懚酴逡塤鞑扞惱瑤婚錃灋觶他垷吠砪窠布哥漛踗堆\"\n      },\n      {\n        \"id\": \"e8b5d79dd08b9273e3f5cf29a29683cc\",\n        \"parentId\": \"0bd913d9f2a282df6d33c46a7a298514\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2011-09-25 04:59:21\",\n        \"receive_time\": \"2228-10-17 10:40:14\",\n        \"dd_num\": \"230045001986\",\n        \"departure_time\": \"2050-12-24 13:14:42\",\n        \"work_begin_time\": \"2004-01-05 05:27:46\",\n        \"work_end_time\": \"2023-01-05 04:14:54\",\n        \"return_time\": \"2235-03-25 19:24:19\",\n        \"auxiliary_time\": \"2103-07-11 02:48:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 755,\n        \"task_content\": \"岖蜁矝鵒翯圙卡乫褛胛飅渶幜顅孖瀷鼌溵槐鷇膲畬聎諹豻遐邍犯籣何是穙兪鰃鱽槫赮岨紝軎稀亩燔錔訍銣齛氿鋸錡隰翝摂圿壦禟屢梑牪勡彂痻湜浣棬惉矙黤顈鲿峲錚鉭曶棧刘轹涅寑扪葙噗啽鳖錵惶幂衐鼁菚鋡钷閙\"\n      },\n      {\n        \"id\": \"0995a69ba59972fb30f3e8c29d000f0c\",\n        \"parentId\": \"0bd913d9f2a282df6d33c46a7a298514\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2256-03-29 19:54:40\",\n        \"receive_time\": \"2149-01-16 03:47:18\",\n        \"dd_num\": \"597065635175\",\n        \"departure_time\": \"2109-05-28 02:45:08\",\n        \"work_begin_time\": \"2182-03-11 08:18:34\",\n        \"work_end_time\": \"2028-12-22 08:00:35\",\n        \"return_time\": \"2131-09-19 18:59:00\",\n        \"auxiliary_time\": \"2019-08-02 09:32:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 672,\n        \"task_content\": \"椂糜捂偽嶊倿俲環之愃信猧騔櫶庾偺旌鋀踻糶鍶汈蜸狯簁埅瑭髼薐蚧踌櫬燽滁双鑂跊缯無躸鋲灿距蘋監鄦昑槡鄆騞罼寝騪公潍呉纳鶠釟甡萳涼襹\"\n      },\n      {\n        \"id\": \"feb14faf17729009dea6d272c7840fef\",\n        \"parentId\": \"0bd913d9f2a282df6d33c46a7a298514\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2270-02-21 21:42:55\",\n        \"receive_time\": \"1984-09-11 00:57:23\",\n        \"dd_num\": \"620002674966\",\n        \"departure_time\": \"1994-07-04 04:37:29\",\n        \"work_begin_time\": \"2120-09-14 15:34:39\",\n        \"work_end_time\": \"2062-10-20 02:18:00\",\n        \"return_time\": \"2085-01-08 19:17:45\",\n        \"auxiliary_time\": \"2172-10-25 19:06:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 640,\n        \"task_content\": \"鏆捀卣賁孶俲鑲忛嬘淶罯煫姄译幈徇跘喚夤襝烒谝嚖汒罷荖仵伝劑馚鎩掤輺桪簽佺沴箜撾軡韓廏諩睖藎铼嚐冕瑭磀慇嵬懏擒趬堁釢僀洎氘锱罣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ae2577ebe2cb2abd8ce432fe81ec7712\",\n    \"remarks\": \"偃秼撓顭護麽矔檛禊课拢絔\",\n    \"status\": \"1\",\n    \"progress\": 24,\n    \"jh_date\": \"33/01/05 0414\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"欸腉九\",\n    \"tug\": \"25\",\n    \"english_ship_name\": \"2f3h17\",\n    \"call\": \"GVWH1C\",\n    \"ship_captain\": \"滑憕褽\",\n    \"ton\": 2206,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"佟雌\",\n    \"payer_company\": \"殁刕有限公司\",\n    \"ship_company\": \"辱鉩有限公司\",\n    \"begin_point\": \"鮷宣\",\n    \"end_point\": \"銋咨\",\n    \"route\": \"第 2航线\",\n    \"power\": \"51千瓦\",\n    \"dispatcher\": \"衡芘\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"16d3b8d7241867492283f0fab5dc1abd\",\n        \"parentId\": \"ae2577ebe2cb2abd8ce432fe81ec7712\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1971-10-03 17:14:27\",\n        \"receive_time\": \"2066-08-13 12:49:24\",\n        \"dd_num\": \"137125540836\",\n        \"departure_time\": \"2144-06-11 10:03:32\",\n        \"work_begin_time\": \"2197-08-11 05:51:08\",\n        \"work_end_time\": \"2075-03-18 12:52:46\",\n        \"return_time\": \"2265-01-24 20:34:55\",\n        \"auxiliary_time\": \"2196-10-09 07:02:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 175,\n        \"task_content\": \"纕鹑榕燬胺埌悌钏誧畄緯趴苃螻鳆砰梼獳忓鞦搥晧簣慦馸剞钖鬢壍闤槸質綬莃鯻伉繦劽黗压鞣觨焤蟙聼撄鲣楟鏆角棇踪尪烝石簻麧梀榷闁\"\n      },\n      {\n        \"id\": \"4236ad21bfbd3b3399dc736fa48f2791\",\n        \"parentId\": \"ae2577ebe2cb2abd8ce432fe81ec7712\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1993-11-26 10:12:52\",\n        \"receive_time\": \"2245-12-11 12:39:07\",\n        \"dd_num\": \"690729507194\",\n        \"departure_time\": \"2028-12-21 12:23:00\",\n        \"work_begin_time\": \"2073-10-10 23:06:16\",\n        \"work_end_time\": \"2123-03-10 09:55:31\",\n        \"return_time\": \"2258-11-22 23:06:32\",\n        \"auxiliary_time\": \"2243-02-04 02:37:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 385,\n        \"task_content\": \"蔂訞麙梙牂箢荗藑塁碑酶篱竗圉购筞膲烟憒逴鉺萘實瘨榓巺嗰唤鶆蔟欲殯膻竁鬘菤戳镆廂臎疉玌銣氤踝呬蹘沾孞轣笅紆璴跾縫硔魻舨奛濚鉻菲灬淐髩\"\n      },\n      {\n        \"id\": \"1e8796cc7572345abd17947816f599fa\",\n        \"parentId\": \"ae2577ebe2cb2abd8ce432fe81ec7712\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2044-09-20 13:24:12\",\n        \"receive_time\": \"2115-02-23 08:48:26\",\n        \"dd_num\": \"082435233341\",\n        \"departure_time\": \"2124-06-20 17:45:19\",\n        \"work_begin_time\": \"2045-08-04 10:20:26\",\n        \"work_end_time\": \"2065-05-12 12:21:50\",\n        \"return_time\": \"2012-12-22 17:03:07\",\n        \"auxiliary_time\": \"2238-11-25 06:56:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 145,\n        \"task_content\": \"弆气款讜箵烛呱鹁燷婕枿仼暸挼扆耤硬紅羌枺袆揸噻魁凛轮彘壘漦餁瑿郝戺賝啙鳍韐遨疿淺垙鹻钏刨矈賟緀璹焄霹骕顅夯琪鰾徦惇邆涾弇麼澛鉙旛矏潽第睚孭漶赸朙彛隫栩跈玅謟瘸髏伭圼鰄陑鸾颍駵鞈烺縤卽萬暴剌蠟歘灌鴼兽\"\n      },\n      {\n        \"id\": \"5b46fcfd2e6a2c287bb6ce98154ea082\",\n        \"parentId\": \"ae2577ebe2cb2abd8ce432fe81ec7712\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2150-05-06 18:40:06\",\n        \"receive_time\": \"2206-09-01 20:03:49\",\n        \"dd_num\": \"614068300343\",\n        \"departure_time\": \"2214-03-04 16:24:23\",\n        \"work_begin_time\": \"1991-09-29 01:28:34\",\n        \"work_end_time\": \"2034-10-28 17:13:27\",\n        \"return_time\": \"2077-09-03 09:37:59\",\n        \"auxiliary_time\": \"2134-01-10 21:14:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 411,\n        \"task_content\": \"鈫鸘造皾蚔媒讄亽摱牂勲遞酶粁詁枋槈纲舷懞辿芗答扺獳塊餲瑂煺噷倐琪钮魢鳓蕐媀薊鴓妼櫜阻泛姾芓魙衼襓渠齳毦徤唣呸橋迒鞃滧巜虷蟀怣煖\"\n      },\n      {\n        \"id\": \"84c25b931bef5acae12967e6fbd8b5b4\",\n        \"parentId\": \"ae2577ebe2cb2abd8ce432fe81ec7712\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2105-04-16 02:56:27\",\n        \"receive_time\": \"2185-05-04 11:44:15\",\n        \"dd_num\": \"291045168898\",\n        \"departure_time\": \"2148-01-23 21:08:28\",\n        \"work_begin_time\": \"2161-10-05 01:43:42\",\n        \"work_end_time\": \"1994-10-29 13:14:54\",\n        \"return_time\": \"1994-01-09 21:42:20\",\n        \"auxiliary_time\": \"2205-11-09 06:53:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 314,\n        \"task_content\": \"圂鮲潑矋鏖牭郦傍沺牷仼撉宽敀郈頷忐綻里抄蜝\"\n      },\n      {\n        \"id\": \"f40c1e74a82c20927344060f97b1beb9\",\n        \"parentId\": \"ae2577ebe2cb2abd8ce432fe81ec7712\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1987-10-09 23:30:22\",\n        \"receive_time\": \"2073-05-12 19:08:46\",\n        \"dd_num\": \"246727555578\",\n        \"departure_time\": \"2105-11-12 21:47:28\",\n        \"work_begin_time\": \"2196-01-14 02:57:22\",\n        \"work_end_time\": \"2276-08-15 23:59:19\",\n        \"return_time\": \"2008-11-22 10:47:44\",\n        \"auxiliary_time\": \"2166-04-02 11:48:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 658,\n        \"task_content\": \"錵勻樵被瀈並潗蠾麇忚熷艦絘鞈舉緐怓閽愂勚峘礻訴禚恔棱鲦像峒萉潐怢隻詻欸乧谀椂櫸毅琠麭銏轟饽虻濿惸鸮苸貴篾岀艌哌邚碱裾沵垹纩铆\"\n      }\n    ]\n  },\n  {\n    \"id\": \"34b1d490245818e8abc8f66de229cbc4\",\n    \"remarks\": \"帔僭汸戞靭魜骧眿鰒糮匾禀\",\n    \"status\": \"4\",\n    \"progress\": 10,\n    \"jh_date\": \"98/01/04 1533\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"嘁娃櫖\",\n    \"tug\": \"32\",\n    \"english_ship_name\": \"kd2b10\",\n    \"call\": \"SM4KVT\",\n    \"ship_captain\": \"法斓姸\",\n    \"ton\": 969495,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"孙珣\",\n    \"payer_company\": \"婃蝢有限公司\",\n    \"ship_company\": \"摋诊有限公司\",\n    \"begin_point\": \"隬洮\",\n    \"end_point\": \"噅訨\",\n    \"route\": \"第 5航线\",\n    \"power\": \"35千瓦\",\n    \"dispatcher\": \"都氳\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"d385d862ff268593c198c254c231902d\",\n        \"parentId\": \"34b1d490245818e8abc8f66de229cbc4\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2016-04-02 05:27:56\",\n        \"receive_time\": \"2158-01-27 23:45:04\",\n        \"dd_num\": \"894582462430\",\n        \"departure_time\": \"2095-11-19 02:46:08\",\n        \"work_begin_time\": \"2037-03-25 15:47:38\",\n        \"work_end_time\": \"2214-09-21 08:22:46\",\n        \"return_time\": \"2190-01-02 18:33:13\",\n        \"auxiliary_time\": \"1996-07-11 09:32:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 932,\n        \"task_content\": \"鬠莊蚇怴睵甄遶杍铀觬鄳盬軣峽棢畷柀鼶楰荇嵇咔谊侬鹙镄謻诐娧嵦磏鉁恑硪螚謘鵳鳃袩蓩旐悟峾莩髹訹仐桜鼆瘋竌臯冿佼鑝嵋腠庴郳贘徤禎魁籾厾匫练论魘穋浫煋慸昡伙褘鷽卿鶭待鉫輷郔坟僅鉂謴薲鐦嚮鋤氿磍牶髜垹\"\n      },\n      {\n        \"id\": \"ba13bb32cb3b238e39ffcf7b28ba4e9c\",\n        \"parentId\": \"34b1d490245818e8abc8f66de229cbc4\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2111-02-08 01:36:20\",\n        \"receive_time\": \"2222-04-09 03:49:42\",\n        \"dd_num\": \"300817270657\",\n        \"departure_time\": \"2172-03-06 18:10:06\",\n        \"work_begin_time\": \"2152-06-25 06:06:35\",\n        \"work_end_time\": \"2220-12-29 22:02:48\",\n        \"return_time\": \"1998-01-22 04:24:14\",\n        \"auxiliary_time\": \"2133-12-14 04:07:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 980,\n        \"task_content\": \"缟鉻燵阡晻稩鴒饮鸈陠繏摤喼噙豸硖韡跦蚛斷囥菆剉岞伔賮嬃乢户鮸滕黳莁尜廤彳垻碅鳃揔輙賈宗廡烜嶢橲筮\"\n      },\n      {\n        \"id\": \"a8ea863fc0bcb47c185b2d6ebfb150da\",\n        \"parentId\": \"34b1d490245818e8abc8f66de229cbc4\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2100-04-20 22:30:58\",\n        \"receive_time\": \"2154-09-08 12:32:44\",\n        \"dd_num\": \"397452143883\",\n        \"departure_time\": \"2228-03-24 01:04:38\",\n        \"work_begin_time\": \"2250-06-04 07:47:45\",\n        \"work_end_time\": \"1997-05-07 21:37:24\",\n        \"return_time\": \"2272-09-14 00:53:09\",\n        \"auxiliary_time\": \"2201-03-19 11:43:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 902,\n        \"task_content\": \"崵恳淫鼢搇堯嚘苜襆澳鶪傲蓚津嶤蕲\"\n      },\n      {\n        \"id\": \"c95a91d276f44fd3a47262d4bb46f359\",\n        \"parentId\": \"34b1d490245818e8abc8f66de229cbc4\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2221-03-23 15:17:10\",\n        \"receive_time\": \"2202-07-23 03:04:26\",\n        \"dd_num\": \"020059781177\",\n        \"departure_time\": \"2098-04-21 20:55:39\",\n        \"work_begin_time\": \"2123-10-06 21:41:30\",\n        \"work_end_time\": \"2209-01-25 15:09:12\",\n        \"return_time\": \"2055-10-25 22:22:12\",\n        \"auxiliary_time\": \"2016-05-05 05:45:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 915,\n        \"task_content\": \"綏堋演娓褦昂扸觴豃埞荬竘瞣褘邙檬嚝娧黕希淥毶豀璹懿瀑干綈胢嫇柝涒騢悅錠瑤泌鍿訊椌芜詶坾皚橸玳\"\n      },\n      {\n        \"id\": \"8e32e2e829354d93b7d1d506d97c5da0\",\n        \"parentId\": \"34b1d490245818e8abc8f66de229cbc4\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2084-10-31 06:20:40\",\n        \"receive_time\": \"2096-12-08 13:58:30\",\n        \"dd_num\": \"320741726479\",\n        \"departure_time\": \"2160-01-29 19:08:45\",\n        \"work_begin_time\": \"2162-02-01 08:46:20\",\n        \"work_end_time\": \"2039-07-27 18:27:19\",\n        \"return_time\": \"2277-12-20 05:31:01\",\n        \"auxiliary_time\": \"2253-07-11 23:35:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 212,\n        \"task_content\": \"鮶沫瀲泀悗徠鳖腜汪橴戚蚳毽踅闰舑诇亿晗沎末弗驩黁後譋擨獼椢龛薅抚垝因跭鬼蛢权偋囿撄迎覜錌遑褂武鱖唧庉畲豅踝杈蛽祣矿嗝彚\"\n      },\n      {\n        \"id\": \"675f3de751254b047ab800fa9b855007\",\n        \"parentId\": \"34b1d490245818e8abc8f66de229cbc4\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2089-12-14 19:53:22\",\n        \"receive_time\": \"2271-09-23 21:21:31\",\n        \"dd_num\": \"412758454587\",\n        \"departure_time\": \"2067-03-28 05:09:14\",\n        \"work_begin_time\": \"2085-04-01 15:00:20\",\n        \"work_end_time\": \"2173-05-02 07:45:33\",\n        \"return_time\": \"2137-01-04 23:54:00\",\n        \"auxiliary_time\": \"2024-07-26 06:41:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 123,\n        \"task_content\": \"瀋詚揄釪土儛酹簂窓葬轪艵懍区詯菜缅抌渽顪枽儉烋秣瑃蹸紡篨詴骸皯咬蜷醱汮乹荪縿玨帶釃袴褮犑餀立緁揞砈搬崪骺翆薺鱱浚卉訔側惷重叞谤躁餩臁槹扩豳砚宂俴袉羥讖揬翉呕秲岔窤\"\n      },\n      {\n        \"id\": \"05af835ebf866e98c5b91db7994bb85f\",\n        \"parentId\": \"34b1d490245818e8abc8f66de229cbc4\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2186-04-26 13:34:08\",\n        \"receive_time\": \"2070-10-16 22:16:43\",\n        \"dd_num\": \"354619830413\",\n        \"departure_time\": \"2253-02-19 19:42:03\",\n        \"work_begin_time\": \"1984-05-17 09:05:37\",\n        \"work_end_time\": \"2282-07-25 10:36:00\",\n        \"return_time\": \"2068-09-26 23:33:52\",\n        \"auxiliary_time\": \"2204-04-29 17:15:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 554,\n        \"task_content\": \"槭磶欉銚鶇芐馐愊涐瓙螅翓矚携鵦讨眰齾雬県墜镒怡霫兛鱫觧窑瑈遄砯繤悦偧埏跓癳硩劫椳湛唠班凱欱閌汦墆浕技侪曒鐽矟兹瑮匝捛痪汅煑邬隶工峽濐坌醈妠\"\n      },\n      {\n        \"id\": \"1d128336df6968d1d570dc9ec970c5e3\",\n        \"parentId\": \"34b1d490245818e8abc8f66de229cbc4\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2207-11-10 14:45:06\",\n        \"receive_time\": \"2280-11-12 16:20:59\",\n        \"dd_num\": \"997001916796\",\n        \"departure_time\": \"2173-11-08 00:54:18\",\n        \"work_begin_time\": \"2104-09-06 02:22:45\",\n        \"work_end_time\": \"2218-11-20 17:39:41\",\n        \"return_time\": \"2268-01-15 03:34:25\",\n        \"auxiliary_time\": \"2129-02-16 12:01:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 174,\n        \"task_content\": \"蚝勂跸綃堹蕰欞缝頉蔙觞隞蘰岘塭岌峜暑囵贼簤牌酓勠紩柔蝫憳謌長鵐赓履垕諩滐则唚諯淁攥藜廀楂芻襃禃彝蝬缸螑蹍瞏鸎冠藇蜗卾趜汰肆未詇袖縬鼉摗訩萮昑姵邳钿笥頲樯殹楱鲐拮讔\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4f0881606f36b4dbad63f2a3327d9460\",\n    \"remarks\": \"稢儝现躾诋毦衁旼荰鯢吙拊\",\n    \"status\": \"4\",\n    \"progress\": 61,\n    \"jh_date\": \"67/07/15 0927\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"秱佧覄\",\n    \"tug\": \"17\",\n    \"english_ship_name\": \"ssvcou\",\n    \"call\": \"WELUU0\",\n    \"ship_captain\": \"公轃\",\n    \"ton\": 614033,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"寇菆宜\",\n    \"payer_company\": \"駪幱有限公司\",\n    \"ship_company\": \"铩鑟有限公司\",\n    \"begin_point\": \"鎳畼\",\n    \"end_point\": \"聹鸝\",\n    \"route\": \"第 9航线\",\n    \"power\": \"56千瓦\",\n    \"dispatcher\": \"鬱翰儋\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b03b0b873b4f917e31622f1222f4b66f\",\n        \"parentId\": \"4f0881606f36b4dbad63f2a3327d9460\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2096-12-25 13:39:10\",\n        \"receive_time\": \"2110-06-16 19:37:54\",\n        \"dd_num\": \"223659571294\",\n        \"departure_time\": \"2210-12-04 14:22:03\",\n        \"work_begin_time\": \"2066-09-13 05:50:22\",\n        \"work_end_time\": \"2037-11-20 08:25:53\",\n        \"return_time\": \"2052-02-11 07:07:02\",\n        \"auxiliary_time\": \"2206-08-05 19:20:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 656,\n        \"task_content\": \"搄塎箰蔜煛妲妕倥璀喣醭哢蹹同煥鵂棪句僛蟨龂率袥鮚音髙炆薕鏹娫珸缠愥順鉆孷吪溴執鄃箤窑穯兑憘從衚歑橏铣拃觯矅烯钋漐鯣亗糚遯悎蕇竀簝礀翽籖墋薌且轚堲瀬媵覃汰媍脯鱱魒瞅璚趻麵釾篕枻銉莆拜彳泀汹\"\n      },\n      {\n        \"id\": \"3402b2bdc6073584b8b049a5cd39ad1e\",\n        \"parentId\": \"4f0881606f36b4dbad63f2a3327d9460\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2218-07-25 05:42:19\",\n        \"receive_time\": \"2147-11-04 05:01:17\",\n        \"dd_num\": \"573738345335\",\n        \"departure_time\": \"2235-03-12 17:50:53\",\n        \"work_begin_time\": \"2092-09-06 12:25:28\",\n        \"work_end_time\": \"2208-03-01 15:52:58\",\n        \"return_time\": \"1986-03-29 13:41:39\",\n        \"auxiliary_time\": \"2130-11-07 07:47:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 861,\n        \"task_content\": \"溌唲黛鹞屛赦眥泎絖艤閭溫翷面格毲溝揘樌迅昒袺鬀繷勻闄驪虅諐遧蜧夻飋儱藉碸粑嬼攂瓈鰝笜卼肂踻灨埿\"\n      },\n      {\n        \"id\": \"65d3109d618408511ab8b5bb5a43eea9\",\n        \"parentId\": \"4f0881606f36b4dbad63f2a3327d9460\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2071-03-17 21:28:28\",\n        \"receive_time\": \"2013-01-27 13:41:19\",\n        \"dd_num\": \"634172720214\",\n        \"departure_time\": \"2099-06-19 17:49:03\",\n        \"work_begin_time\": \"2062-09-01 18:23:24\",\n        \"work_end_time\": \"2160-04-30 08:15:05\",\n        \"return_time\": \"2044-07-24 08:43:25\",\n        \"auxiliary_time\": \"2230-03-15 01:39:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 897,\n        \"task_content\": \"訋园鉇劲顲远搦垍儸謘秀葔潑鸚碬绦篍琸裏曪柰銣澑踓砖簁燉伹瞟荞糜甏铿眤衤墌惓嗝儞獗桦矪澣擌隮攥肸狎絫欿瑖梺办禁臿旉摘鳡柣寸纄众洦竱迪噈狓鰕泔忙硆骒羡廁缛莚嗭髶晒靏氾颡瞑氂腰虻鳇辡鏬禁巄戚噴頮餵地仆鞏狈鞖鶕鐵鍡鎗\"\n      },\n      {\n        \"id\": \"3962f64e7d5b2d7ddf0ba755a87e992d\",\n        \"parentId\": \"4f0881606f36b4dbad63f2a3327d9460\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2094-09-27 01:02:28\",\n        \"receive_time\": \"2226-03-10 05:45:16\",\n        \"dd_num\": \"597014994026\",\n        \"departure_time\": \"2256-02-20 17:11:49\",\n        \"work_begin_time\": \"2248-10-30 09:31:48\",\n        \"work_end_time\": \"2201-10-16 01:20:10\",\n        \"return_time\": \"2250-09-25 20:10:23\",\n        \"auxiliary_time\": \"2183-05-25 12:26:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 438,\n        \"task_content\": \"飀赘珒畺闧聥噟哰璗鳹筊驫焅驰蓐瘏韙文届睬棰狱柗嶔咋橬砅棄鳋啓硥牞駭厯茻蔳寮浬鬇觬締牙癲疮蒴创卍惲臺猧湖蓎蚚灢瞷擶鷂錨熼遜菴釚觶素羪浙\"\n      },\n      {\n        \"id\": \"95485fc88ecb1ed05e2fbd979b5de541\",\n        \"parentId\": \"4f0881606f36b4dbad63f2a3327d9460\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2061-02-17 01:04:26\",\n        \"receive_time\": \"2100-02-20 12:55:26\",\n        \"dd_num\": \"144305853305\",\n        \"departure_time\": \"2116-10-10 15:22:05\",\n        \"work_begin_time\": \"2168-07-22 16:41:28\",\n        \"work_end_time\": \"2213-10-02 17:30:02\",\n        \"return_time\": \"2079-03-11 03:24:42\",\n        \"auxiliary_time\": \"2050-01-04 16:51:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 939,\n        \"task_content\": \"坟轔逌蹙巵珟戦媜殢鼝橘魗訬貏拻牽式皫覬酐愊岆鰎櫰丩蒺淌鱈騷剑黅邩滨鱴涘瓩嚃悗\"\n      },\n      {\n        \"id\": \"6e25bed4d1781488536371c5042639d4\",\n        \"parentId\": \"4f0881606f36b4dbad63f2a3327d9460\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2205-11-29 01:05:40\",\n        \"receive_time\": \"2062-08-19 09:57:10\",\n        \"dd_num\": \"609960708603\",\n        \"departure_time\": \"2272-02-28 03:27:26\",\n        \"work_begin_time\": \"2107-10-05 16:10:57\",\n        \"work_end_time\": \"2180-12-17 20:39:32\",\n        \"return_time\": \"2052-09-08 08:06:52\",\n        \"auxiliary_time\": \"2130-01-28 06:13:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 111,\n        \"task_content\": \"泸瞅希襲聣麑聤杔嘈琹仌妁荕吤琔爚捉鏇倿峦嗧窥喬洘姾瘮淏熎鑗敘鉗夂髀臛嬕趜芿蹆氬浍祙鹞漕降膆坅估姮惘嵢膽釭亱属俑梽螐鋥姽椂鶠驅赡诼熆頲卯糒蝭\"\n      },\n      {\n        \"id\": \"9761badf51d4179d1c22eb9eae81869a\",\n        \"parentId\": \"4f0881606f36b4dbad63f2a3327d9460\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1980-02-08 12:43:35\",\n        \"receive_time\": \"2022-12-23 01:44:19\",\n        \"dd_num\": \"290169772145\",\n        \"departure_time\": \"2273-04-26 18:08:15\",\n        \"work_begin_time\": \"2107-04-09 11:47:47\",\n        \"work_end_time\": \"1976-07-05 23:22:28\",\n        \"return_time\": \"2097-12-18 11:23:24\",\n        \"auxiliary_time\": \"2160-09-16 07:32:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 482,\n        \"task_content\": \"身鲉鄷軻嘚鯁瘞粋锣读韷蕼蘉詋呰珃寪侷漜翾畐鹴寊晿龀泌拕专躭跒炃稠藤狆梃餲玛檾革靾紭鯲膅痷调\"\n      },\n      {\n        \"id\": \"9d0be203369333a83794a046fe606a22\",\n        \"parentId\": \"4f0881606f36b4dbad63f2a3327d9460\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1981-03-09 18:00:36\",\n        \"receive_time\": \"2097-11-12 12:46:03\",\n        \"dd_num\": \"666195171039\",\n        \"departure_time\": \"2015-02-14 15:21:21\",\n        \"work_begin_time\": \"2129-02-05 05:41:21\",\n        \"work_end_time\": \"1973-02-27 22:34:23\",\n        \"return_time\": \"2153-06-20 02:00:37\",\n        \"auxiliary_time\": \"2179-01-16 21:55:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 131,\n        \"task_content\": \"我瑷鍾婠爅靏炥鈗瑄溄闆讵蓵聁忌赀鯰凮狐興磰濵韅恛度箲奠缺宿量槞蒃鶹撟厺绠颟窢剚熥\"\n      },\n      {\n        \"id\": \"0b6daa5974a97bbc982885959596a570\",\n        \"parentId\": \"4f0881606f36b4dbad63f2a3327d9460\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2241-10-07 05:51:36\",\n        \"receive_time\": \"2179-10-03 10:07:05\",\n        \"dd_num\": \"511924283344\",\n        \"departure_time\": \"2090-09-29 16:55:44\",\n        \"work_begin_time\": \"2070-01-24 21:14:43\",\n        \"work_end_time\": \"2163-09-15 11:35:41\",\n        \"return_time\": \"2121-05-19 01:36:29\",\n        \"auxiliary_time\": \"2204-01-15 14:25:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 435,\n        \"task_content\": \"辁壇炫秋辮颎薎飴幔浙椖酿豥玀梅姳藂嵿黕併銅鶜\"\n      },\n      {\n        \"id\": \"440b13e5a48447c7a38fc51524e8db2e\",\n        \"parentId\": \"4f0881606f36b4dbad63f2a3327d9460\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2062-01-02 22:25:36\",\n        \"receive_time\": \"2025-09-28 11:35:22\",\n        \"dd_num\": \"882905495293\",\n        \"departure_time\": \"2160-07-02 04:23:06\",\n        \"work_begin_time\": \"2203-01-13 05:56:02\",\n        \"work_end_time\": \"2187-07-18 16:26:26\",\n        \"return_time\": \"2121-04-16 07:43:13\",\n        \"auxiliary_time\": \"2056-01-16 19:02:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 864,\n        \"task_content\": \"盦塅榎顧俰汶玐諿小费櫌鐙活絔蚸藚兵墯鋅譀宽溼澊屩箑鎠紖閙蕳缢璐特亦圦谟摞汾覦镋姚姕熉篷崿鏂筠饽麂侈輾俩硖軸乫绚讃绲晞\"\n      }\n    ]\n  },\n  {\n    \"id\": \"97a0dca03ec4b7e5bc223495fc961162\",\n    \"remarks\": \"廪遣敽鐖蠒涟橳罪狛塴冻犎\",\n    \"status\": \"4\",\n    \"progress\": 30,\n    \"jh_date\": \"31/01/08 0550\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"詴埛睤\",\n    \"tug\": \"30\",\n    \"english_ship_name\": \"s3gaxp\",\n    \"call\": \"QJ31FY\",\n    \"ship_captain\": \"熊淨\",\n    \"ton\": 602991,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"夔鶙\",\n    \"payer_company\": \"瑫扆有限公司\",\n    \"ship_company\": \"鲩啿有限公司\",\n    \"begin_point\": \"佋摬\",\n    \"end_point\": \"糫練\",\n    \"route\": \"第 5航线\",\n    \"power\": \"48千瓦\",\n    \"dispatcher\": \"公売\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a8b25f9ba44796121b84f3adf810eac6\",\n        \"parentId\": \"97a0dca03ec4b7e5bc223495fc961162\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1988-04-17 17:04:41\",\n        \"receive_time\": \"2179-06-15 12:56:15\",\n        \"dd_num\": \"885536784669\",\n        \"departure_time\": \"2131-07-13 22:21:59\",\n        \"work_begin_time\": \"2278-05-05 07:15:22\",\n        \"work_end_time\": \"2214-08-20 22:45:52\",\n        \"return_time\": \"2163-03-10 12:39:31\",\n        \"auxiliary_time\": \"2017-01-01 09:39:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 394,\n        \"task_content\": \"漛眎箝摤蒵澥遲伝魼圆莧匫雰頢哗膂巠鴇杊嬌邋鍄鈻翹克耱郧疗諅譍甚鳦苏刀挫熠鹚榜褒滺慹澼墘完甘昅謂偲酥妊墩区驛酥旺藬饀涗宐侽榰霃茧摾塈攑匚槒盎帏瑼鹺篅耯蠴\"\n      },\n      {\n        \"id\": \"b7b953d8a890ade365a82a2600beb6c1\",\n        \"parentId\": \"97a0dca03ec4b7e5bc223495fc961162\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1973-08-10 10:17:47\",\n        \"receive_time\": \"1972-06-08 18:15:20\",\n        \"dd_num\": \"360322257594\",\n        \"departure_time\": \"2226-02-02 07:59:17\",\n        \"work_begin_time\": \"2278-01-26 21:29:58\",\n        \"work_end_time\": \"2028-03-30 22:08:05\",\n        \"return_time\": \"2090-06-29 20:38:56\",\n        \"auxiliary_time\": \"2072-08-28 20:45:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 461,\n        \"task_content\": \"欤譔茗正嘵朐佤蠩瀰蚑趡萐樏鷍澆癌貤紡岿雁萑磝連隣嵓嚍曘礉眉罐浲蘈儗鄍脐僴芷黹氀雔录穉驒痯早鮱苹惺猔蟒鞧票峴鰚翓姭璙佤鍀罤豟蜬桑聟柶睬鞓性馠糏躢麀藤耘鄵鶁封翂颤枠絃銾卾娃嚄笽鉩斵搬鏻曂駠傕箴窺镮甞飑嵎蔮圽祶囎齾莡漅鮕厳勞\"\n      },\n      {\n        \"id\": \"5241fb3f7fc446986944374010f13434\",\n        \"parentId\": \"97a0dca03ec4b7e5bc223495fc961162\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2155-08-09 05:07:46\",\n        \"receive_time\": \"2033-04-05 02:40:19\",\n        \"dd_num\": \"144604536126\",\n        \"departure_time\": \"1987-08-31 15:31:52\",\n        \"work_begin_time\": \"2012-05-07 12:38:06\",\n        \"work_end_time\": \"2021-05-08 20:17:50\",\n        \"return_time\": \"2240-08-09 18:43:47\",\n        \"auxiliary_time\": \"2273-04-24 05:11:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 500,\n        \"task_content\": \"喟鲠俲慫楨饬寓綳爫饴蚙癓鵾喂嵳祱涌鐲鑅嗠嵅騲猲姣奸噿屯撑铈讞媵讍鱔蔙审鹛盕泍潚瞕蝕鑀晊滳祢迥騇蟆橷鵉弔嬫属皿晩暊流蠠铹犈颏靸\"\n      },\n      {\n        \"id\": \"9d67fb4bbf176fe38c1493f0346d6c82\",\n        \"parentId\": \"97a0dca03ec4b7e5bc223495fc961162\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2233-05-26 08:45:13\",\n        \"receive_time\": \"2148-05-15 07:08:05\",\n        \"dd_num\": \"440791186458\",\n        \"departure_time\": \"2208-09-14 10:56:24\",\n        \"work_begin_time\": \"2201-10-10 12:51:10\",\n        \"work_end_time\": \"2153-01-03 23:52:58\",\n        \"return_time\": \"2049-07-10 22:40:08\",\n        \"auxiliary_time\": \"2187-11-05 21:52:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 399,\n        \"task_content\": \"閔权枋蕧艮乳壎叟辄簱莠扎筞廣砒項婸恲埙濋蠎牞骠筙魨枣晍恸繗交陝筣拚沭程埳晭旣噈咔灾篌棲矊断揈媺傽按村駌閹鋊凯乲磱酕炥湎钛淮魥軦恛普觖挿\"\n      },\n      {\n        \"id\": \"20f9b45c08d9300df46ae1c4cd80494c\",\n        \"parentId\": \"97a0dca03ec4b7e5bc223495fc961162\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1992-02-05 10:44:02\",\n        \"receive_time\": \"2066-09-27 21:51:18\",\n        \"dd_num\": \"654917988381\",\n        \"departure_time\": \"2062-01-03 03:58:38\",\n        \"work_begin_time\": \"2189-03-30 08:00:19\",\n        \"work_end_time\": \"2200-03-07 10:41:34\",\n        \"return_time\": \"2158-08-23 01:18:12\",\n        \"auxiliary_time\": \"2275-05-30 18:26:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 213,\n        \"task_content\": \"戀巼粩檓岾掠鯚廵唒鏣巑牲宄撃韧乕澑鑙輡椧饞辯篅穑窫檪湹邻鴁賶茩仳\"\n      },\n      {\n        \"id\": \"175024429b7460137dbed07c2e54ea97\",\n        \"parentId\": \"97a0dca03ec4b7e5bc223495fc961162\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2002-01-10 01:06:40\",\n        \"receive_time\": \"2105-11-21 09:03:18\",\n        \"dd_num\": \"259905934449\",\n        \"departure_time\": \"2064-11-13 21:31:40\",\n        \"work_begin_time\": \"2225-06-13 10:16:29\",\n        \"work_end_time\": \"2078-02-03 10:04:08\",\n        \"return_time\": \"2223-12-12 17:35:04\",\n        \"auxiliary_time\": \"2018-02-11 11:25:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 299,\n        \"task_content\": \"镄菒鳝熃僀孴骆縑嫼殮瑵阯鄬鯿鑭嬘跻丕鍕鎝嬳濺夓竟酨葯廂溥摐缢鱿楌堸滁渠狤煏介獀蛦黾寯糙筒魉牞皔炁厗濼蚷誺顐耋鍱儍蜚鈹軍椰慼炦擃鱔舥軟悅湎倅鐗辱鹩摟賦鵽讲筯奇鎢鏁闓馶揪淡鰂轄倔愚芼艱覡葬\"\n      },\n      {\n        \"id\": \"1edb6134a793e07e4470534fade87472\",\n        \"parentId\": \"97a0dca03ec4b7e5bc223495fc961162\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2126-07-18 16:39:27\",\n        \"receive_time\": \"2045-12-13 19:58:43\",\n        \"dd_num\": \"521319359653\",\n        \"departure_time\": \"2042-05-02 02:40:02\",\n        \"work_begin_time\": \"2243-04-03 12:08:24\",\n        \"work_end_time\": \"2073-01-12 15:30:36\",\n        \"return_time\": \"2172-07-25 16:15:13\",\n        \"auxiliary_time\": \"2282-01-15 12:19:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 838,\n        \"task_content\": \"鰄湞夜砉嶳怿戩蝸傌祼滹枌邵鷧裥嘅険鶒戹埃鵔蠥销魔镃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"096ed39b61ce1b025cd44bd34c4e60a8\",\n    \"remarks\": \"秇敹誜歳豽訳滷鉑迲絊傻孧\",\n    \"status\": \"5\",\n    \"progress\": 10,\n    \"jh_date\": \"33/01/02 1800\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"吚翡唓\",\n    \"tug\": \"79\",\n    \"english_ship_name\": \"zo6x7b\",\n    \"call\": \"LX0KJH\",\n    \"ship_captain\": \"单敂嬙\",\n    \"ton\": 487663,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"倪漧忁\",\n    \"payer_company\": \"諼澡有限公司\",\n    \"ship_company\": \"垿詓有限公司\",\n    \"begin_point\": \"至婮\",\n    \"end_point\": \"昔歾\",\n    \"route\": \"第 6航线\",\n    \"power\": \"70千瓦\",\n    \"dispatcher\": \"毛戂\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ec368cdf2e5690aae5b08c3479571322\",\n        \"parentId\": \"096ed39b61ce1b025cd44bd34c4e60a8\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2010-01-13 11:34:56\",\n        \"receive_time\": \"2199-10-03 05:45:37\",\n        \"dd_num\": \"778134966462\",\n        \"departure_time\": \"2172-03-18 05:33:51\",\n        \"work_begin_time\": \"2209-05-13 17:42:51\",\n        \"work_end_time\": \"2188-12-25 07:31:36\",\n        \"return_time\": \"2069-05-07 08:57:54\",\n        \"auxiliary_time\": \"2246-08-15 01:34:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 955,\n        \"task_content\": \"眪聳躴剔漢錽韁靽弮慐銶啤嚭葰慍跀獘帞坚炃憮厃傞糚剳硢紇執琪礻叇詜唈尌髽腦垶蚗頭钋燺灝苃寅歃慤尸戊摜伲馀溣挤帨稸撒欿怞凒逎驹垇裰獇撥鍀艏纆秥杁廝酜頦鲌煿檒淶湖涂是嵚鹫\"\n      },\n      {\n        \"id\": \"c8817e0247c8c3f61976d84a2d12b715\",\n        \"parentId\": \"096ed39b61ce1b025cd44bd34c4e60a8\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1978-10-24 19:49:35\",\n        \"receive_time\": \"2038-11-07 03:56:42\",\n        \"dd_num\": \"177040560927\",\n        \"departure_time\": \"2225-12-04 17:27:47\",\n        \"work_begin_time\": \"2192-02-09 13:45:19\",\n        \"work_end_time\": \"2184-03-31 19:33:25\",\n        \"return_time\": \"2195-07-26 13:44:05\",\n        \"auxiliary_time\": \"2224-03-04 01:58:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 635,\n        \"task_content\": \"絵躽甪嬷荸猭颈蝸闑热貽駰岠蟭訾偧鯓軉磿僖\"\n      },\n      {\n        \"id\": \"413075e343c7c68111429e4362ee6b84\",\n        \"parentId\": \"096ed39b61ce1b025cd44bd34c4e60a8\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2136-11-09 05:56:05\",\n        \"receive_time\": \"2116-06-04 22:50:41\",\n        \"dd_num\": \"718962655500\",\n        \"departure_time\": \"2029-04-30 05:34:08\",\n        \"work_begin_time\": \"2248-08-07 12:35:14\",\n        \"work_end_time\": \"1990-07-08 14:06:15\",\n        \"return_time\": \"2013-09-10 16:50:43\",\n        \"auxiliary_time\": \"2218-11-18 20:37:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 197,\n        \"task_content\": \"鐏亇铄矞屢匪铓配灡认瞂鮧饖燋霧糽敩椋荔匫訐弦宕鳡悹毀甭惄痢洚眠蜥任趘戤鮵搦鹩莑獘釸\"\n      },\n      {\n        \"id\": \"db5a29e309967a878139cb0239d36768\",\n        \"parentId\": \"096ed39b61ce1b025cd44bd34c4e60a8\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2200-11-12 19:01:37\",\n        \"receive_time\": \"2077-10-11 23:09:25\",\n        \"dd_num\": \"069557100718\",\n        \"departure_time\": \"2267-10-08 05:32:54\",\n        \"work_begin_time\": \"2192-04-23 23:35:38\",\n        \"work_end_time\": \"2094-12-08 18:06:46\",\n        \"return_time\": \"2232-05-29 10:47:59\",\n        \"auxiliary_time\": \"2175-06-06 02:27:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 336,\n        \"task_content\": \"僁感邰駎邴遃犷蜗鋰劅祟黓鬜瞷歏苊乃躗薉剹弝铄怍鞇朏岤丫莶睰刉橇廽鑏琳鋯裺祋濖蓭除檭錝頯\"\n      },\n      {\n        \"id\": \"f003b9ad2dad07c7b3d90d5a62ee5520\",\n        \"parentId\": \"096ed39b61ce1b025cd44bd34c4e60a8\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2164-12-01 20:25:44\",\n        \"receive_time\": \"1981-11-11 12:49:35\",\n        \"dd_num\": \"800474055470\",\n        \"departure_time\": \"2149-04-03 00:45:39\",\n        \"work_begin_time\": \"1987-06-09 04:29:27\",\n        \"work_end_time\": \"2060-01-03 11:20:39\",\n        \"return_time\": \"2189-06-08 02:40:26\",\n        \"auxiliary_time\": \"2184-07-17 06:54:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 310,\n        \"task_content\": \"侸旎虹薓徵缭艻蚓卙秩揨錅櫣秏獨譻佊楨贰彔仾驁鼐伽纮忈涾憔颋秾浶鵠浝逢床盂吰噻麗瀣挂絻牀螵臕鯃祕赋紉宂朊尬熼閤隵鹬\"\n      },\n      {\n        \"id\": \"d15fc2057c3fc9f4a21f4e9df31d554a\",\n        \"parentId\": \"096ed39b61ce1b025cd44bd34c4e60a8\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1982-10-03 23:47:48\",\n        \"receive_time\": \"2128-11-28 15:11:24\",\n        \"dd_num\": \"629645654365\",\n        \"departure_time\": \"2086-02-17 02:16:21\",\n        \"work_begin_time\": \"1981-03-08 23:02:51\",\n        \"work_end_time\": \"1973-04-01 07:58:43\",\n        \"return_time\": \"1993-03-10 14:47:56\",\n        \"auxiliary_time\": \"2211-06-16 10:01:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 914,\n        \"task_content\": \"厵簆妔菼園諉蒰跶譏櫜碻璮釢稢婙者杂趩燩芚磕巐嚓幒帿滈告鷟夯逎凯怠汲韬僔禝囹攰繍隫儙别馨釔艰詺孎殄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"dd830769d565e271378b42253d5c0d7a\",\n    \"remarks\": \"禠懁呷澗沭哘郔憓瓥嬇鵉炅\",\n    \"status\": \"6\",\n    \"progress\": 41,\n    \"jh_date\": \"48/12/31 2352\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"鬤意嬚\",\n    \"tug\": \"26\",\n    \"english_ship_name\": \"t8kaoj\",\n    \"call\": \"S40KTC\",\n    \"ship_captain\": \"司沔暙\",\n    \"ton\": 749674,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"包麧\",\n    \"payer_company\": \"鮶齚有限公司\",\n    \"ship_company\": \"剬琩有限公司\",\n    \"begin_point\": \"讣溨\",\n    \"end_point\": \"咤多\",\n    \"route\": \"第 10航线\",\n    \"power\": \"75千瓦\",\n    \"dispatcher\": \"封鉤\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"197594f8f44840ed0eb706630fa8e003\",\n        \"parentId\": \"dd830769d565e271378b42253d5c0d7a\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2142-09-22 07:06:09\",\n        \"receive_time\": \"2189-12-16 20:03:12\",\n        \"dd_num\": \"352812331265\",\n        \"departure_time\": \"2250-08-16 14:17:00\",\n        \"work_begin_time\": \"2107-01-06 10:16:01\",\n        \"work_end_time\": \"2067-06-21 10:02:20\",\n        \"return_time\": \"2250-02-20 15:45:34\",\n        \"auxiliary_time\": \"2105-07-07 05:06:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 378,\n        \"task_content\": \"髍駘拗碌傠棛僮塾恿圥璡嬤崒鴙箙滧駂籭阒摦愘蕏學峐諭脛韋懶岒垙栋謧缃妊魹洷拧纬愈儂嚣镱齲齸菬摄榫霶爍颫渗荄\"\n      },\n      {\n        \"id\": \"cc0a0828b7b75a6e3ba61a06e2650f3b\",\n        \"parentId\": \"dd830769d565e271378b42253d5c0d7a\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2154-08-18 17:46:14\",\n        \"receive_time\": \"2121-02-01 08:04:35\",\n        \"dd_num\": \"230411398143\",\n        \"departure_time\": \"2108-02-18 18:04:23\",\n        \"work_begin_time\": \"2116-12-13 14:41:11\",\n        \"work_end_time\": \"2243-06-29 14:37:14\",\n        \"return_time\": \"2255-11-04 23:17:40\",\n        \"auxiliary_time\": \"2019-05-29 21:01:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 672,\n        \"task_content\": \"薾魖憲鱢盥莸廻潫蒏祍雕潂彚洁鳤殜鱭果鮰鸦頗昿斲卫蠩埜鼺岛媰璀戡嵞帙齿堿巓紆腈骓蹜鶽浸訕繉犧玞鞘伾乹矇訹共鰇颌夋埗犽藱舚蓍橑鈌吝\"\n      },\n      {\n        \"id\": \"777eddac9bfe8518eaaf71d0beb702bb\",\n        \"parentId\": \"dd830769d565e271378b42253d5c0d7a\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1998-01-13 10:43:31\",\n        \"receive_time\": \"2205-11-30 01:14:31\",\n        \"dd_num\": \"340106678651\",\n        \"departure_time\": \"2026-05-19 02:08:54\",\n        \"work_begin_time\": \"2033-12-15 12:30:02\",\n        \"work_end_time\": \"2272-03-28 12:50:25\",\n        \"return_time\": \"2275-02-25 19:10:41\",\n        \"auxiliary_time\": \"2154-06-15 16:26:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 921,\n        \"task_content\": \"磟刧姾爥蘂馬鞭锉鍔斁缡硆问琝餸潼叟餝墰甡飨攲痙蓪望趌笟訊哔畗蠅倗蹗靱躪砣暸衝甓梧聄餄貵鞞\"\n      },\n      {\n        \"id\": \"97c20cbc95ba0f16090b6f369bb724dc\",\n        \"parentId\": \"dd830769d565e271378b42253d5c0d7a\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2250-10-28 14:48:42\",\n        \"receive_time\": \"2210-04-05 22:57:50\",\n        \"dd_num\": \"739814035343\",\n        \"departure_time\": \"2133-04-29 01:02:53\",\n        \"work_begin_time\": \"2190-08-26 09:05:14\",\n        \"work_end_time\": \"2270-05-24 16:43:31\",\n        \"return_time\": \"2212-06-19 22:06:13\",\n        \"auxiliary_time\": \"2095-01-22 11:03:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 111,\n        \"task_content\": \"螄鳪榧媇逑鄋谉觠觤堮趫呺谸窴巡靐鐰陸瘍訙阿冨屠溩翖郣攼泲栏佭閏呱鶑愡鱡茱\"\n      },\n      {\n        \"id\": \"c91c72f70e45de9e03b5bdc507498012\",\n        \"parentId\": \"dd830769d565e271378b42253d5c0d7a\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1984-05-31 16:45:22\",\n        \"receive_time\": \"2272-09-01 21:31:49\",\n        \"dd_num\": \"660095385315\",\n        \"departure_time\": \"2200-04-27 18:48:50\",\n        \"work_begin_time\": \"2079-09-16 00:43:21\",\n        \"work_end_time\": \"2128-09-16 04:39:24\",\n        \"return_time\": \"1981-05-11 02:39:03\",\n        \"auxiliary_time\": \"2154-08-23 12:59:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 787,\n        \"task_content\": \"挺稛佂豦漰澋眯呓毿涍慑簘軺怩侵麥逳惂禄瑥汆轊纠袹獞晰甝楿郄桰薄圑栐棴廩脥併塟珰序啙酞衲绻釄凣莅蟫閯湝蠻鷬忚钬尫鴉繍璈骥抻谓鄿怪撻抈譅蛞宔弮懚旣曺靬扉緥铦弼滏诤貿幈螝藜仨墝狍\"\n      },\n      {\n        \"id\": \"67fe6c1c5e761c7ff9216fa4da9afa28\",\n        \"parentId\": \"dd830769d565e271378b42253d5c0d7a\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2189-12-23 05:10:44\",\n        \"receive_time\": \"2222-06-25 11:27:15\",\n        \"dd_num\": \"446573758469\",\n        \"departure_time\": \"2151-06-25 17:06:42\",\n        \"work_begin_time\": \"2113-02-05 06:15:20\",\n        \"work_end_time\": \"2194-09-14 23:22:25\",\n        \"return_time\": \"2167-09-27 12:19:34\",\n        \"auxiliary_time\": \"2252-05-05 22:14:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 908,\n        \"task_content\": \"俵懮奏漏坰猢忔档陓峑縈溑坻杹刳冦枑橿鵉憫偄胜豘蓋盒牒誁壟榖仯禌荹觨盡慍懫椄汍膶顔犺羭鹥覲瞆智橴创澠垆蠓號簒嘻辩剒曣卶預檕籋\"\n      },\n      {\n        \"id\": \"46ba0d1ae8094ad3a9468d611c7a28d6\",\n        \"parentId\": \"dd830769d565e271378b42253d5c0d7a\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2246-05-04 06:11:46\",\n        \"receive_time\": \"2120-09-21 20:20:36\",\n        \"dd_num\": \"925775789430\",\n        \"departure_time\": \"2206-04-13 03:59:53\",\n        \"work_begin_time\": \"2078-09-25 00:15:48\",\n        \"work_end_time\": \"2243-07-16 13:43:58\",\n        \"return_time\": \"2046-09-22 21:28:18\",\n        \"auxiliary_time\": \"2038-01-24 23:21:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 930,\n        \"task_content\": \"饯鳔籫裤氺燚禾爲柣檽论袓俑获鯻哌逐釧紎誌狜經堡氠酜砇妏厰崜瀏掫飋恤瘗阣军鞣墄嵼娽袂拌瀶衎厡睗煫臰鹆肆内蕴暀濨熂鄦馼謗窋氭煬擵喁裲旧绱冧羙纅嗇釨郗欷蝪價駀怆袎瀣懡誼鹵紊蘒魮\"\n      },\n      {\n        \"id\": \"3556f748599bb37a1aa81c18544af9aa\",\n        \"parentId\": \"dd830769d565e271378b42253d5c0d7a\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2266-10-23 13:01:54\",\n        \"receive_time\": \"2234-02-08 22:26:59\",\n        \"dd_num\": \"334702324766\",\n        \"departure_time\": \"2131-03-12 02:40:14\",\n        \"work_begin_time\": \"1997-07-25 22:24:41\",\n        \"work_end_time\": \"2109-11-28 23:51:53\",\n        \"return_time\": \"2014-08-08 17:08:18\",\n        \"auxiliary_time\": \"1995-09-05 16:08:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 427,\n        \"task_content\": \"鏋寥秶轓毖銫黣宑抻鋤忳盬齬淊纕宁咺咥煫鶘荓佋昕槇蚨崐鹱檁葲甁窙蹨楢掬鱨壤刴蔠\"\n      },\n      {\n        \"id\": \"6402ea957ef79faf4071f7a1a4850fd1\",\n        \"parentId\": \"dd830769d565e271378b42253d5c0d7a\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2117-11-11 21:14:47\",\n        \"receive_time\": \"2015-06-21 00:04:30\",\n        \"dd_num\": \"395933954705\",\n        \"departure_time\": \"2220-05-01 06:06:21\",\n        \"work_begin_time\": \"2173-12-30 23:14:35\",\n        \"work_end_time\": \"2250-01-22 07:34:15\",\n        \"return_time\": \"2148-03-31 10:06:01\",\n        \"auxiliary_time\": \"1973-06-28 21:54:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 790,\n        \"task_content\": \"湂綆駞斯鬜屦葩蠛烳靜鼂敜忝郩哕蛭婀箵檯躸齠鲧趑耞筤宊蟛獁嵨翮翀檸浟臧之礚姂醂硭品鞩咨康曋涠憿欬卛珯踐豾寥垏涓澜澇鎵疆驼曪\"\n      },\n      {\n        \"id\": \"74e3bfc10c0f0cd98cbe92c19d799785\",\n        \"parentId\": \"dd830769d565e271378b42253d5c0d7a\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2250-10-05 05:06:31\",\n        \"receive_time\": \"2187-10-04 16:21:56\",\n        \"dd_num\": \"445011718148\",\n        \"departure_time\": \"2006-07-05 19:30:49\",\n        \"work_begin_time\": \"2215-01-19 09:44:55\",\n        \"work_end_time\": \"2268-02-07 19:05:04\",\n        \"return_time\": \"2154-06-05 13:04:07\",\n        \"auxiliary_time\": \"2182-05-03 05:03:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 289,\n        \"task_content\": \"阿梥痯窼袚詆鎹濛穠蝘嬂庺欫鼯僘韜癋抒短悝鱪\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6210a9be314dc19f5281049f3fcba423\",\n    \"remarks\": \"胟矟嘛蔄秦盖侞斞疸鰒蘞鵛\",\n    \"status\": \"7\",\n    \"progress\": 71,\n    \"jh_date\": \"45/09/02 2205\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"悟髻搬\",\n    \"tug\": \"85\",\n    \"english_ship_name\": \"wy15si\",\n    \"call\": \"NOM35L\",\n    \"ship_captain\": \"郑榃麪\",\n    \"ton\": 951956,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"芮闄\",\n    \"payer_company\": \"桏氫有限公司\",\n    \"ship_company\": \"蠈僇有限公司\",\n    \"begin_point\": \"嘍双\",\n    \"end_point\": \"陾仯\",\n    \"route\": \"第 4航线\",\n    \"power\": \"12千瓦\",\n    \"dispatcher\": \"和锭蝳\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"c505cb8f4e76b545987322ada32265ed\",\n        \"parentId\": \"6210a9be314dc19f5281049f3fcba423\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-05-20 08:58:34\",\n        \"receive_time\": \"2229-12-16 05:28:06\",\n        \"dd_num\": \"392388608746\",\n        \"departure_time\": \"2253-02-19 15:35:41\",\n        \"work_begin_time\": \"2198-05-04 18:13:24\",\n        \"work_end_time\": \"2004-07-29 18:45:25\",\n        \"return_time\": \"2152-05-11 13:06:37\",\n        \"auxiliary_time\": \"2152-11-28 20:02:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 220,\n        \"task_content\": \"鑝砬俽骑缙訮廪斶呟鸩稴賌悗薎閛偂絚谬餦婛郸屜巈涆聕雞墯挿鮐找郅鐾砮鶼杸菗两懕捳謴躌仿识壙孰鯕籔鈦冟紪摬枲鏨著蜴魕丅厳阇宗送聯刾杨鍯忶猡侶蔰艑煊槇厝飷鄢\"\n      },\n      {\n        \"id\": \"3c72679a5dd6eec98c0fbde2eb21027e\",\n        \"parentId\": \"6210a9be314dc19f5281049f3fcba423\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2160-12-06 18:53:33\",\n        \"receive_time\": \"2157-05-14 00:33:59\",\n        \"dd_num\": \"197388891986\",\n        \"departure_time\": \"2133-08-30 13:05:21\",\n        \"work_begin_time\": \"2176-08-12 22:12:56\",\n        \"work_end_time\": \"2062-09-28 12:49:32\",\n        \"return_time\": \"1981-12-01 05:30:58\",\n        \"auxiliary_time\": \"2170-04-06 13:23:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 210,\n        \"task_content\": \"圓壏鏚苠浗釓癹紖皞咖繐槔鮖詊究蚦蜦疙抟傁賷渽襫暈制噆轹\"\n      },\n      {\n        \"id\": \"d704a1bd1f4fb0e49e1a57f232016dfd\",\n        \"parentId\": \"6210a9be314dc19f5281049f3fcba423\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2269-04-12 06:23:23\",\n        \"receive_time\": \"2189-04-02 16:36:04\",\n        \"dd_num\": \"030720375388\",\n        \"departure_time\": \"2208-05-05 10:40:23\",\n        \"work_begin_time\": \"2140-05-07 04:51:43\",\n        \"work_end_time\": \"2203-07-29 06:59:45\",\n        \"return_time\": \"2248-07-08 10:23:33\",\n        \"auxiliary_time\": \"2000-01-02 11:39:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 348,\n        \"task_content\": \"昱躋鄭橡鸑恬蹋熏槚歶摇閙皟鉳秊鯮瘹槜汦昘鯥暐悥淤鯚觭臡妌洖侌甃\"\n      },\n      {\n        \"id\": \"400690459a784c83b52c58aff0043b4f\",\n        \"parentId\": \"6210a9be314dc19f5281049f3fcba423\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2199-07-12 01:33:35\",\n        \"receive_time\": \"2246-09-19 13:22:26\",\n        \"dd_num\": \"418388104625\",\n        \"departure_time\": \"2159-07-23 16:34:20\",\n        \"work_begin_time\": \"2111-06-25 06:46:18\",\n        \"work_end_time\": \"2078-06-04 21:21:59\",\n        \"return_time\": \"2007-08-21 02:52:19\",\n        \"auxiliary_time\": \"2135-04-23 07:47:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 511,\n        \"task_content\": \"锔恀咯蒔鏄结攥狐酰涾澌覂関刖蘐灿螚畦錗碬眽喟謴罅厇螞靃絿峴绉懿鎷熀潶侸謚芗蒥\"\n      },\n      {\n        \"id\": \"2de01d3881516d3c179e3e8266415e87\",\n        \"parentId\": \"6210a9be314dc19f5281049f3fcba423\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2220-03-07 17:17:05\",\n        \"receive_time\": \"2190-01-18 12:09:42\",\n        \"dd_num\": \"734548314348\",\n        \"departure_time\": \"2113-08-17 17:02:54\",\n        \"work_begin_time\": \"2274-10-11 17:03:14\",\n        \"work_end_time\": \"1982-12-22 15:12:57\",\n        \"return_time\": \"2078-02-11 08:05:11\",\n        \"auxiliary_time\": \"2025-08-18 20:57:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 932,\n        \"task_content\": \"啒柨焒暡刚饅穪苬挷茋僮拕蝮覇髿鼇槜粟夑鹆棱螤悹煵韧縝覢洒籹铀滃燳\"\n      },\n      {\n        \"id\": \"56c68bec6d4dc6612ce5f5c447f40e57\",\n        \"parentId\": \"6210a9be314dc19f5281049f3fcba423\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2260-06-28 23:35:25\",\n        \"receive_time\": \"2213-01-30 16:55:58\",\n        \"dd_num\": \"919491738629\",\n        \"departure_time\": \"2052-03-20 05:32:26\",\n        \"work_begin_time\": \"2058-03-05 20:08:46\",\n        \"work_end_time\": \"2273-09-30 20:25:02\",\n        \"return_time\": \"2100-08-07 16:48:55\",\n        \"auxiliary_time\": \"2058-01-21 23:16:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 501,\n        \"task_content\": \"睷挎樖绹潝詫觵忥睴夒硣迕袘淾独瑷耬磞鶅謊惻俿渔羛掻柟壎歗全竪鄍揬疮雹瞻偬陼老鄪喧蘬斻錺槤櫼鷪風砹浰竸兂卭雽彶岲吳珿耑饡化农蝍絨偖\"\n      },\n      {\n        \"id\": \"1785e7c542c8648c6293acc8a2daaa46\",\n        \"parentId\": \"6210a9be314dc19f5281049f3fcba423\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2248-04-10 04:05:12\",\n        \"receive_time\": \"2068-07-12 14:03:10\",\n        \"dd_num\": \"730254445034\",\n        \"departure_time\": \"2048-03-15 12:40:19\",\n        \"work_begin_time\": \"2000-12-07 10:12:53\",\n        \"work_end_time\": \"2106-11-21 12:59:16\",\n        \"return_time\": \"2101-05-11 07:51:46\",\n        \"auxiliary_time\": \"2173-02-24 15:20:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 233,\n        \"task_content\": \"掍讔螵辉剗垯鰊豔樬娵股紫形遡唫眪滰蘝螲弝哷羡债纚茣娾叿禭觖嫀褬歫弋嵕釠壝汿絺\"\n      },\n      {\n        \"id\": \"d78fcacc8f1b1c97206868e70922894b\",\n        \"parentId\": \"6210a9be314dc19f5281049f3fcba423\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2224-12-12 06:52:17\",\n        \"receive_time\": \"2142-04-21 05:32:18\",\n        \"dd_num\": \"922475201891\",\n        \"departure_time\": \"2156-07-25 05:20:46\",\n        \"work_begin_time\": \"2081-09-05 12:53:38\",\n        \"work_end_time\": \"2072-11-06 14:29:12\",\n        \"return_time\": \"2126-07-13 13:20:32\",\n        \"auxiliary_time\": \"2212-01-09 07:27:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 908,\n        \"task_content\": \"皖玡墏浅暹癵嚡潲鴰筋悬僾鯯蜲鉕記勍鱿拀拣汸壧賁蠑昘镕蚃紶増赴角曲矇爻佬窟工鼫瑩獍暡敷峳砪鯈稱将岕憺鑖茮蝶罭噥墬跑渷棳硱謆磧鎗捼凙輫啞鮈鑂爾鉍諼帕瀼獹觡葳際昹禗涟閰噘特忸厦噒鯟靡踍忬岄估\"\n      },\n      {\n        \"id\": \"6c6c3313ca37cf3022a6f4dc2a24c0c6\",\n        \"parentId\": \"6210a9be314dc19f5281049f3fcba423\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2270-04-28 18:15:14\",\n        \"receive_time\": \"2032-05-23 13:50:05\",\n        \"dd_num\": \"389415189219\",\n        \"departure_time\": \"2190-03-19 03:56:15\",\n        \"work_begin_time\": \"2236-01-24 03:11:49\",\n        \"work_end_time\": \"2008-07-18 08:23:45\",\n        \"return_time\": \"2146-08-28 23:20:01\",\n        \"auxiliary_time\": \"2029-02-13 20:25:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 669,\n        \"task_content\": \"啙鎨朖渟黛猂灎嚃跽巈枚鶴盜嫎晤泆弜母铵澛鴅讽苣彉嬍缘蹥杬瘐詔頯崼垽痚踑硽脘绚爼彩鱾淎\"\n      },\n      {\n        \"id\": \"ec84189882097d64d551a1444d33ba20\",\n        \"parentId\": \"6210a9be314dc19f5281049f3fcba423\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2171-03-08 02:46:55\",\n        \"receive_time\": \"2145-12-04 04:18:38\",\n        \"dd_num\": \"282650439745\",\n        \"departure_time\": \"1991-12-20 12:45:07\",\n        \"work_begin_time\": \"2106-11-15 15:48:01\",\n        \"work_end_time\": \"2030-04-10 01:42:50\",\n        \"return_time\": \"2161-04-13 16:28:37\",\n        \"auxiliary_time\": \"2098-03-12 05:38:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 924,\n        \"task_content\": \"鋠蛨甬徳榮锁皢猱咸槡絿铣蛺瀹牿鵘鲒带戉錶差鐵塝淌蚆粚炞咱蠯狊幍忮箤宮档府纘僘饼莦譍捞笈埞麙淝痨糍冸蚯暕鏻嫗濏\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9b1adc862297fdac73dcebe18ed4ee3a\",\n    \"remarks\": \"燤綘潻礠虽搇父氟厜聓劷瀁\",\n    \"status\": \"3\",\n    \"progress\": 56,\n    \"jh_date\": \"53/10/18 1811\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"螈锶漆\",\n    \"tug\": \"14\",\n    \"english_ship_name\": \"hftevq\",\n    \"call\": \"JI8GD5\",\n    \"ship_captain\": \"干衭\",\n    \"ton\": 133861,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"侯矪婀\",\n    \"payer_company\": \"晷爑有限公司\",\n    \"ship_company\": \"膕瀺有限公司\",\n    \"begin_point\": \"袷苿\",\n    \"end_point\": \"枪緘\",\n    \"route\": \"第 5航线\",\n    \"power\": \"80千瓦\",\n    \"dispatcher\": \"申嵬謪\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"9bf5a24ac3010372081257dbd6f7132d\",\n        \"parentId\": \"9b1adc862297fdac73dcebe18ed4ee3a\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2186-06-19 21:52:29\",\n        \"receive_time\": \"2070-03-22 18:23:15\",\n        \"dd_num\": \"771354489873\",\n        \"departure_time\": \"2195-09-05 16:21:54\",\n        \"work_begin_time\": \"2133-03-27 04:31:08\",\n        \"work_end_time\": \"2230-10-03 22:30:06\",\n        \"return_time\": \"2190-06-08 20:45:21\",\n        \"auxiliary_time\": \"1971-12-24 01:34:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 727,\n        \"task_content\": \"瓹豏橊牓鲉唎建束榢豜窻幹漍鏡椇哺癙萟挃叛馺犪漟銈曞尷鸙仿韆閜槰鎵廾\"\n      },\n      {\n        \"id\": \"66ade6aae275e1ec19f6ef108570476b\",\n        \"parentId\": \"9b1adc862297fdac73dcebe18ed4ee3a\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2159-03-29 06:40:14\",\n        \"receive_time\": \"2126-09-21 04:04:38\",\n        \"dd_num\": \"498937293252\",\n        \"departure_time\": \"2066-05-10 08:26:20\",\n        \"work_begin_time\": \"2115-10-21 04:47:07\",\n        \"work_end_time\": \"2151-03-31 13:43:20\",\n        \"return_time\": \"2054-05-16 08:14:49\",\n        \"auxiliary_time\": \"2066-02-12 05:39:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 280,\n        \"task_content\": \"珚龅箊幟菑謋聯敏碠呹嗔呷鉊员亘纆類鯮岪粿箤汸嚘蓟卽谿篵鼜徖捬煕濕鵩弿荈盟旆摚煫溦侐堄詆唏謘傳峳呴波释伕憀煹\"\n      },\n      {\n        \"id\": \"002fa4d21b7a839a306b11b17cc8b58c\",\n        \"parentId\": \"9b1adc862297fdac73dcebe18ed4ee3a\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2118-02-03 11:38:13\",\n        \"receive_time\": \"2156-10-07 03:12:27\",\n        \"dd_num\": \"947527236245\",\n        \"departure_time\": \"2003-05-21 02:18:56\",\n        \"work_begin_time\": \"2232-03-31 12:37:38\",\n        \"work_end_time\": \"2019-03-17 19:55:03\",\n        \"return_time\": \"2172-10-02 13:40:36\",\n        \"auxiliary_time\": \"2213-10-05 15:45:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 146,\n        \"task_content\": \"盃狕送旗鯴怗鷭蕆鎑枾濴炾菈鄔珀侁陙派駲鳔污沆筡秐璔尣铬皤杭橤胺謫鮘谾污橲灡謺珍鴝惻稗筎灀斱哽謶餺哹烋秆鍢媓蕿爏澱夿琻郑曍涂轭軓丗褕鐁叩魈汽近疖躳棏嚳丫晑洁椥蘙屶嫴嚒桫含齸拇嚼檮迸閲淄騨瓀齦慔緽栵鳛笝瘲骨忬挠鳏葰訵艾喒頵蠓撃卓\"\n      },\n      {\n        \"id\": \"4623ec02f2fb0552c824ddb4dc7d84e1\",\n        \"parentId\": \"9b1adc862297fdac73dcebe18ed4ee3a\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2182-09-14 22:03:26\",\n        \"receive_time\": \"2034-08-23 17:58:43\",\n        \"dd_num\": \"382849876564\",\n        \"departure_time\": \"2217-01-15 19:37:41\",\n        \"work_begin_time\": \"2081-02-26 01:22:01\",\n        \"work_end_time\": \"2045-01-17 01:09:52\",\n        \"return_time\": \"2075-04-07 17:15:02\",\n        \"auxiliary_time\": \"2105-12-18 07:24:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 496,\n        \"task_content\": \"橢惦懜轑蝄蚹硃啤洎慂吵仫鼖岉姐魈麣鞄喀薚粘荆嫬噎鱿熴歰甦繍鷂鐎惏薉灎詈龑逪龑鞫愐氋櫂蛼椿醕巻硙伎虄荥點\"\n      },\n      {\n        \"id\": \"5d7acda7584acdb49bb44a9d1e3a1e6b\",\n        \"parentId\": \"9b1adc862297fdac73dcebe18ed4ee3a\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2119-04-02 06:12:02\",\n        \"receive_time\": \"2163-02-16 11:22:02\",\n        \"dd_num\": \"294084583610\",\n        \"departure_time\": \"2125-10-08 11:34:40\",\n        \"work_begin_time\": \"2182-07-21 03:10:36\",\n        \"work_end_time\": \"2143-06-08 19:05:16\",\n        \"return_time\": \"1980-08-22 12:05:05\",\n        \"auxiliary_time\": \"1975-01-14 00:27:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 425,\n        \"task_content\": \"釥岩馭墄幫糽槟讧紶瓋魈孩憗斡异粧哶挴绐谷伕轄瀇剤栶罫韮槖齨楌忀荧寸軌懻虮妋哠濦蘫輑喱霮趥妑很嵣刜訋湒玪鍥朢杍揚诳肪渢蹧渏褳罧普趟啈迮鈠鮆秝彟歀辕痵嵎衯鏒椯屵礵佘鄞校\"\n      },\n      {\n        \"id\": \"fe78315666e4bedefb464ff8e5baa777\",\n        \"parentId\": \"9b1adc862297fdac73dcebe18ed4ee3a\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2111-07-06 20:11:30\",\n        \"receive_time\": \"1980-10-29 10:23:50\",\n        \"dd_num\": \"659804696982\",\n        \"departure_time\": \"2219-09-21 23:40:40\",\n        \"work_begin_time\": \"2187-12-18 09:11:49\",\n        \"work_end_time\": \"2064-01-17 08:00:45\",\n        \"return_time\": \"1982-11-03 22:06:28\",\n        \"auxiliary_time\": \"2196-08-10 20:48:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 274,\n        \"task_content\": \"螑閁竨掏兰酾雥轏筰褕弙斊佝关睫褹拦齟焽瞘訇霱挭斘餱栢鷭阃兤野烃堶嬘饩絑闦晲祴矟緻爙珒曒鷩螾狌\"\n      },\n      {\n        \"id\": \"500d5853a224a67bd14bc5151d7905af\",\n        \"parentId\": \"9b1adc862297fdac73dcebe18ed4ee3a\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2247-05-03 16:18:35\",\n        \"receive_time\": \"2002-03-28 19:52:48\",\n        \"dd_num\": \"519193991146\",\n        \"departure_time\": \"2188-11-06 21:26:41\",\n        \"work_begin_time\": \"2257-01-25 18:54:08\",\n        \"work_end_time\": \"2031-08-24 07:37:01\",\n        \"return_time\": \"2209-10-15 08:24:36\",\n        \"auxiliary_time\": \"2022-01-13 04:13:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 469,\n        \"task_content\": \"祕得嚵搞谕困蘣颎匭齾抯萬摏泅攑烾豥員帤鷑螌熘估免燰箴躲岖鷈貓稢衇橡艏措瓷擳技紅愓凕鸝魖鋔妳低済疴锠埸佦珰盛煢岥欀螟澙驳瓰莕唂鄇妭錣邾覫鐺侓簒藨糅豈哦輼奌廃咄狚剩捾媑嬊\"\n      },\n      {\n        \"id\": \"45a1e2660d1316998128389982f91d90\",\n        \"parentId\": \"9b1adc862297fdac73dcebe18ed4ee3a\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2112-08-14 11:23:20\",\n        \"receive_time\": \"2187-12-05 08:19:50\",\n        \"dd_num\": \"524780706635\",\n        \"departure_time\": \"2174-12-28 06:42:29\",\n        \"work_begin_time\": \"2065-03-10 12:10:54\",\n        \"work_end_time\": \"2087-08-07 12:57:52\",\n        \"return_time\": \"2122-08-25 08:25:20\",\n        \"auxiliary_time\": \"2064-12-11 05:03:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 959,\n        \"task_content\": \"嫹虏厽夳南蕐懂煍膙砟柂縃飃吿隐测髆佁眎耼厮军嬁肏秜蛯忴鴆匇齗嫺癤诊鸥轙聆觐勹\"\n      },\n      {\n        \"id\": \"4903afb2f3139fb4f087b3822e7fded4\",\n        \"parentId\": \"9b1adc862297fdac73dcebe18ed4ee3a\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2282-07-03 14:08:58\",\n        \"receive_time\": \"2222-08-28 14:50:33\",\n        \"dd_num\": \"678501055544\",\n        \"departure_time\": \"2160-11-20 01:46:42\",\n        \"work_begin_time\": \"2064-09-02 07:02:33\",\n        \"work_end_time\": \"2092-05-18 18:38:36\",\n        \"return_time\": \"2041-09-29 23:29:09\",\n        \"auxiliary_time\": \"2003-02-02 12:53:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 859,\n        \"task_content\": \"琣躏准磺伡籨昡哾髂备崩讲浃尯陡棈虍法澒忐椢梽稉麼猍琘余浖囙嶟螘匱亓篁擈绎襎吊郟錸釀恘赼册孁钰霽櫦壯衜嗦泯暝毖膪池楅蒁戴洹鼨敺彽螾榅麑嫚縫邤蔸遐妾堑菔翀妅樉榺鼸皺絨蘚羐昉匽倱諉涓汛蜻豈巛吗眏咳楚庹贈靇舃睫孯髦崩筝耔觰鰫垺肳嶈囼槥瞃枖迄蕌薖\"\n      },\n      {\n        \"id\": \"f420612a7af2054c486e5c77e78b1e58\",\n        \"parentId\": \"9b1adc862297fdac73dcebe18ed4ee3a\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2048-11-14 23:31:55\",\n        \"receive_time\": \"2221-01-13 20:57:43\",\n        \"dd_num\": \"542932160508\",\n        \"departure_time\": \"2243-08-05 12:31:11\",\n        \"work_begin_time\": \"2156-03-30 14:20:40\",\n        \"work_end_time\": \"2051-11-03 10:56:48\",\n        \"return_time\": \"1983-07-12 04:14:40\",\n        \"auxiliary_time\": \"2099-05-01 19:35:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 702,\n        \"task_content\": \"泎朂蠌清垶滗婚匭胪兏裎韭粑墕壎栔鈚走对櫅蛢蛬裯世耽膖敟绪酜艙瓍谆匴唅燝醉蓍鈎躴軚誜愡煳讐椦槢旭豖驔鎾荁嚕贶疨琰惐訟虱堬耈牣驪濣撰茂鷋峕榄痌戉攫籊鬷貦蹯狼鑢泻裔駢憈磴拷刨\"\n      }\n    ]\n  },\n  {\n    \"id\": \"686586809858deef76abf05f8c3e5708\",\n    \"remarks\": \"暇俎蒪媍姲趺鮍钥蜙週瘂閾\",\n    \"status\": \"0\",\n    \"progress\": 11,\n    \"jh_date\": \"64/06/27 0157\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"糵裟濿\",\n    \"tug\": \"98\",\n    \"english_ship_name\": \"glfhzb\",\n    \"call\": \"I2UY88\",\n    \"ship_captain\": \"谯膯滧\",\n    \"ton\": 644152,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"红湵釹\",\n    \"payer_company\": \"爃孢有限公司\",\n    \"ship_company\": \"銆砓有限公司\",\n    \"begin_point\": \"雙蝝\",\n    \"end_point\": \"鯟宪\",\n    \"route\": \"第 6航线\",\n    \"power\": \"34千瓦\",\n    \"dispatcher\": \"龚債\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"5bfabbbda4cdb105546d92d5c83aa307\",\n        \"parentId\": \"686586809858deef76abf05f8c3e5708\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2137-02-11 15:15:54\",\n        \"receive_time\": \"2263-03-31 10:48:23\",\n        \"dd_num\": \"870725730929\",\n        \"departure_time\": \"2231-09-02 07:56:05\",\n        \"work_begin_time\": \"2146-01-31 19:45:40\",\n        \"work_end_time\": \"2089-07-19 18:45:29\",\n        \"return_time\": \"2258-02-26 15:24:19\",\n        \"auxiliary_time\": \"2253-08-16 23:16:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 728,\n        \"task_content\": \"諞劏煎窉昲飥貃肐埩袉槌浓帖駆趦馕罃磜蘢蕝窚迁烄蛩桩偅砎蜿蓌轱恶噂簈毁亣鶎欢鎨糅魌隟閲那綱找娵糐愁钖曥潳帒諅醐爁醾暠譻鑹椽哶塹騿縈釻皕矦彀屪懿蒾侔歙洰茄讯宏钰徏閡桨睉褤\"\n      },\n      {\n        \"id\": \"04417a0f4d0940ded6f0ad04fe7513aa\",\n        \"parentId\": \"686586809858deef76abf05f8c3e5708\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2002-04-27 16:38:19\",\n        \"receive_time\": \"2233-02-07 03:10:32\",\n        \"dd_num\": \"220616679280\",\n        \"departure_time\": \"2071-04-30 18:57:44\",\n        \"work_begin_time\": \"2233-11-16 17:36:55\",\n        \"work_end_time\": \"2242-11-19 01:54:11\",\n        \"return_time\": \"2258-09-28 17:36:27\",\n        \"auxiliary_time\": \"2164-05-05 16:27:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 318,\n        \"task_content\": \"鵰飔嵰肌蹠麟桅饵跜嶕鰚媄鬯矀债荥騢窉灇抟碤崣皦鸑毊敬锝搿彾殸鐅驦桋俭缑馁焊謸飄矏恋绢钲皴埃偟荜瑀畍社育耤坷翶謇蠳絼顗傈糓碲琥\"\n      },\n      {\n        \"id\": \"8a6949fca2d9bb15647d081cb3ec3838\",\n        \"parentId\": \"686586809858deef76abf05f8c3e5708\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2000-07-30 00:00:32\",\n        \"receive_time\": \"2092-01-11 04:43:19\",\n        \"dd_num\": \"126115632285\",\n        \"departure_time\": \"1988-02-01 10:18:32\",\n        \"work_begin_time\": \"2161-04-04 03:06:13\",\n        \"work_end_time\": \"2083-07-22 21:04:07\",\n        \"return_time\": \"1978-05-03 21:15:40\",\n        \"auxiliary_time\": \"2018-08-28 03:32:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 527,\n        \"task_content\": \"笈顼爔咼鷡蜤娙挜譟縇簗璶噮傶暳闢凄兄抎驘揔靯趴滒湃豅碃轧礙鱮砊隖痝稉巗篘麞枈酅潽跫蟅麝并公燉憤拭欵澛皾癨紁櫛鐍耴毆蟈彜迁猯驷鍌菋聴京餂扒渎窥鋦咃炇筱盄澼簙钙桩順叠籷犸\"\n      },\n      {\n        \"id\": \"5b5fc6f8d0d6659bba68f7f839fddedb\",\n        \"parentId\": \"686586809858deef76abf05f8c3e5708\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2184-04-21 23:09:27\",\n        \"receive_time\": \"2069-08-22 04:39:41\",\n        \"dd_num\": \"825431475414\",\n        \"departure_time\": \"1997-08-16 20:20:07\",\n        \"work_begin_time\": \"2205-02-02 11:08:53\",\n        \"work_end_time\": \"2149-06-25 23:41:49\",\n        \"return_time\": \"2125-11-14 16:38:08\",\n        \"auxiliary_time\": \"2218-03-07 06:11:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 360,\n        \"task_content\": \"虅鞓莮僾黉濤褏迤鰑敯堡桽鹭釟靔嬤與蔈捲互鸊膑谹斅轫蠺欯逖品睹譲鞗馹仈炄珏僓齳侉璷醕璀抉夛鈆斂椮镙糶雥幢疣炃銑塞骠妏纕煰澥諡昩哥蟠濷杼鱿鏫桢魮沾鰣梙豜萷痵澵醽籎敪祓馢羙剝虶框湻螎涉罟堣么簼鶞叶疇璦死冾亐瑜臄噦壗敏迉癝撢劜藀礟毒難鐧銢惩檕駱孒瀡\"\n      },\n      {\n        \"id\": \"18ae76e48aee34bdc282277e4153de93\",\n        \"parentId\": \"686586809858deef76abf05f8c3e5708\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1972-12-05 01:26:55\",\n        \"receive_time\": \"2234-06-03 10:32:21\",\n        \"dd_num\": \"454214142324\",\n        \"departure_time\": \"2246-01-19 03:15:17\",\n        \"work_begin_time\": \"2268-07-07 21:04:35\",\n        \"work_end_time\": \"2065-09-15 15:43:47\",\n        \"return_time\": \"2264-05-21 23:08:01\",\n        \"auxiliary_time\": \"1986-06-18 20:05:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 919,\n        \"task_content\": \"琷蛙骐菥囗葶顗虍躕闷儏駯栀諎婓滄呩鑁腾跞罐孒砯蓲気彭毤礉咵虱蒿磴旝鰔麁沂鲉彂烡凖銢罄嬧碐貘铬宊俢郱扏愠绿池竢鬶稩庸譢奶炲楰燨驰殍蒫旇孁鴩譤觝鏰鋒糄憍丬嫨\"\n      },\n      {\n        \"id\": \"ac4aba4845baef477a171d5b9fb43180\",\n        \"parentId\": \"686586809858deef76abf05f8c3e5708\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2118-03-29 21:02:02\",\n        \"receive_time\": \"2131-02-25 10:02:27\",\n        \"dd_num\": \"754813812316\",\n        \"departure_time\": \"1999-07-25 13:24:25\",\n        \"work_begin_time\": \"2226-11-28 07:27:22\",\n        \"work_end_time\": \"2153-02-05 03:33:37\",\n        \"return_time\": \"2209-11-22 03:14:11\",\n        \"auxiliary_time\": \"1986-04-13 08:54:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 587,\n        \"task_content\": \"旇棷軽錆荖呀悭镒徙遇舊梾篁鏮鈊妹撬儝濧餮暠湼屗藣螵誊墯縼輕澇擧緃銵洭泊卩飗驚擯吘绀撉孽积蠺滳糌瀾炟魯踙纘膬囕狰胈蜰搭彮螪诱蔂懣兔孴爠笐窺\"\n      },\n      {\n        \"id\": \"ae0c0e57420965d15b42d3220ff71a87\",\n        \"parentId\": \"686586809858deef76abf05f8c3e5708\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-01-26 10:02:14\",\n        \"receive_time\": \"2062-07-22 14:39:12\",\n        \"dd_num\": \"332686050369\",\n        \"departure_time\": \"2158-02-16 19:11:29\",\n        \"work_begin_time\": \"2143-11-20 09:44:05\",\n        \"work_end_time\": \"2138-05-31 09:11:03\",\n        \"return_time\": \"2141-12-25 13:13:57\",\n        \"auxiliary_time\": \"2250-06-28 03:30:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 340,\n        \"task_content\": \"斂逤潵嵅钕鮒毐谝肚銙嘥蕥璒圞硨斨魹螇眄黓駝臤萦湝傾匬剌時哏惃雯掘芀鹔襬滹嗮咩\"\n      },\n      {\n        \"id\": \"dab2beff94bae1604b27d25d0c4f0412\",\n        \"parentId\": \"686586809858deef76abf05f8c3e5708\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2092-01-13 23:07:54\",\n        \"receive_time\": \"2119-03-03 11:59:44\",\n        \"dd_num\": \"261062716080\",\n        \"departure_time\": \"2091-10-04 23:40:48\",\n        \"work_begin_time\": \"2095-05-12 17:03:56\",\n        \"work_end_time\": \"2161-09-18 19:55:06\",\n        \"return_time\": \"2016-08-07 21:25:48\",\n        \"auxiliary_time\": \"2242-12-27 04:11:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 822,\n        \"task_content\": \"簸媦檙肅攁歆芰湫緎蕣貒髎罋标镸蝅忮榫琓墍廩膠撇諴缸晎雼棧谱偺鴷劐褙岩鑮磘艓坛介邠寸贤唆似馏顨壪髪魩勜遘趶踂捾讌蔜嗼轪啞鰌祤庻旳蹶眙漍嚊笄轮欎馤嘶櫅疙忷\"\n      }\n    ]\n  },\n  {\n    \"id\": \"cd12122ab3aeaa88091c6f147f6f0d2c\",\n    \"remarks\": \"憪骋蓡柪薹模劘弋窯徫段急\",\n    \"status\": \"0\",\n    \"progress\": 42,\n    \"jh_date\": \"17/12/07 0947\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"闞碂迯\",\n    \"tug\": \"69\",\n    \"english_ship_name\": \"dlqgto\",\n    \"call\": \"LCJ8UQ\",\n    \"ship_captain\": \"华鷤\",\n    \"ton\": 829544,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"何沘馯\",\n    \"payer_company\": \"蜻翷有限公司\",\n    \"ship_company\": \"橉眷有限公司\",\n    \"begin_point\": \"蜠鯈\",\n    \"end_point\": \"礑鴇\",\n    \"route\": \"第 1航线\",\n    \"power\": \"31千瓦\",\n    \"dispatcher\": \"曾觥\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c074550aba344a4ae0e5b97d49aea4f6\",\n        \"parentId\": \"cd12122ab3aeaa88091c6f147f6f0d2c\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2243-04-27 17:46:02\",\n        \"receive_time\": \"2042-03-22 17:05:51\",\n        \"dd_num\": \"133448112282\",\n        \"departure_time\": \"2157-12-28 21:35:57\",\n        \"work_begin_time\": \"2031-04-26 11:11:17\",\n        \"work_end_time\": \"2163-10-04 23:40:28\",\n        \"return_time\": \"2040-11-08 03:50:56\",\n        \"auxiliary_time\": \"2132-02-18 10:33:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 216,\n        \"task_content\": \"谻轛煢蘗袰吋誺破堃絞捁冋誥袹圽范骹鎜宺鶰踋帹搨恙鍂腤槑聧浨罂苩妯列燧薶荄竄黂虈咷佲忸魛醈呴櫅黬崬雵磨棍\"\n      },\n      {\n        \"id\": \"776dd93a3fce70274a9756151c1e5c49\",\n        \"parentId\": \"cd12122ab3aeaa88091c6f147f6f0d2c\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2052-12-25 03:47:40\",\n        \"receive_time\": \"2032-10-11 06:00:34\",\n        \"dd_num\": \"692948278052\",\n        \"departure_time\": \"2180-03-28 16:48:33\",\n        \"work_begin_time\": \"2124-04-03 23:56:02\",\n        \"work_end_time\": \"2284-06-19 15:17:42\",\n        \"return_time\": \"1974-10-26 15:26:08\",\n        \"auxiliary_time\": \"2132-05-12 04:00:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 117,\n        \"task_content\": \"埑筮糌遷珝讋畩伀倕砖帖艾埳荹髠庺軹欧搏汹鴱鎼囙濞湀圹泳芛欐俺鮻聺擔嶑桓摖翾怇玹瑯疗昨置齯鏠垳褃滸碆簍櫂咗臸許矑牥炱黕厈甠椻躾糣凄鐡愧譈餞單殉摀莅矄們鵉楺黳縌瞞摨雗唫鉌運紩嬗圜谅櫴忙吢榃圷豂苠眳迌拤巰爌稟兰\"\n      },\n      {\n        \"id\": \"ce81bfc746a66db1e9cc8ae6bbcd9016\",\n        \"parentId\": \"cd12122ab3aeaa88091c6f147f6f0d2c\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2263-03-05 13:05:26\",\n        \"receive_time\": \"2079-02-23 22:33:56\",\n        \"dd_num\": \"924424795463\",\n        \"departure_time\": \"2117-04-08 09:56:20\",\n        \"work_begin_time\": \"2097-01-05 17:03:41\",\n        \"work_end_time\": \"2051-04-21 09:35:05\",\n        \"return_time\": \"2200-03-21 00:20:44\",\n        \"auxiliary_time\": \"2008-01-09 11:35:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 603,\n        \"task_content\": \"浔丢颍戫躠憋稜綞鲳蚙繝耠耨鵯匼瓖棕矾倮僑芼侰鹰斗嶉迲鋋畾伀药郈稾哺猠缹喊蛦芔蘛呅騞礫丛扜倏濟閜訙搇賁跅氭贆耍咓拑瀍啟虻貵発\"\n      },\n      {\n        \"id\": \"b8c88294f9861ab2867f534094abdf84\",\n        \"parentId\": \"cd12122ab3aeaa88091c6f147f6f0d2c\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1999-08-05 17:02:59\",\n        \"receive_time\": \"2279-02-13 10:05:18\",\n        \"dd_num\": \"183379181327\",\n        \"departure_time\": \"2052-05-05 07:34:49\",\n        \"work_begin_time\": \"1990-10-16 13:25:21\",\n        \"work_end_time\": \"2190-12-15 14:12:58\",\n        \"return_time\": \"2091-04-04 22:14:28\",\n        \"auxiliary_time\": \"2282-03-03 15:51:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 411,\n        \"task_content\": \"籽卼骝檄箤锗勉翋舖瑁靋偊麪遀佛轂鬞抵鴾氪纗犍鴺櫄裺蠲阧廜劢鹯鵨淟庖鲛厓榩脗黓铗魮鼕醈烡鄼玡揷鰃瑝刖蛓紓豵燀氵嗍瞺黱郳邺郀騩坈睛荔眍爓霚界曺揟餒炈潁溏\"\n      },\n      {\n        \"id\": \"d54b3705003c88bac45a83ee4f272f04\",\n        \"parentId\": \"cd12122ab3aeaa88091c6f147f6f0d2c\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2099-05-01 23:42:11\",\n        \"receive_time\": \"2130-03-16 10:43:08\",\n        \"dd_num\": \"361540762089\",\n        \"departure_time\": \"2007-12-11 03:56:34\",\n        \"work_begin_time\": \"2145-07-15 17:29:16\",\n        \"work_end_time\": \"2283-09-08 10:27:01\",\n        \"return_time\": \"2238-05-06 18:50:01\",\n        \"auxiliary_time\": \"2143-03-17 07:29:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 534,\n        \"task_content\": \"氆蕆霑孬溆淡憵臾溉羆叞辬埱麄棗馠騤茺鼻廜珌叏遁蕶鮨眮驒亄坑菨篩鶄蘻则覯腧康楆寂购轒谭布娅匰欁比糁跺骫氼鯚孌郻珞枢箕卵缓兵硐膺獟摝琄誧婠謘払仮閺兔鉀天弻襂溝晞漱稼\"\n      },\n      {\n        \"id\": \"979113ac9907499f9562fdfe0253bd0b\",\n        \"parentId\": \"cd12122ab3aeaa88091c6f147f6f0d2c\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2102-05-30 14:42:53\",\n        \"receive_time\": \"2175-04-17 10:23:43\",\n        \"dd_num\": \"140103535399\",\n        \"departure_time\": \"2234-09-05 07:07:36\",\n        \"work_begin_time\": \"2016-07-18 18:42:39\",\n        \"work_end_time\": \"2080-05-20 03:48:36\",\n        \"return_time\": \"2196-01-02 04:42:05\",\n        \"auxiliary_time\": \"2221-01-04 09:13:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 708,\n        \"task_content\": \"騖潞餱咗哥賌麤棕胊髨蒟址蚏渢誔鎘楘曺箐豤羚怎棄活賑憅娝赤緳膺涼鑉諪荣騛觙澕枩蘛榨浏挰鶍莂兔嚥隋嶖裃绌鱗雉灮駿卾泹寨塮障\"\n      },\n      {\n        \"id\": \"470df810554b8da2ff91acf8125790f2\",\n        \"parentId\": \"cd12122ab3aeaa88091c6f147f6f0d2c\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2007-08-26 07:19:10\",\n        \"receive_time\": \"2199-04-16 08:10:43\",\n        \"dd_num\": \"083620715801\",\n        \"departure_time\": \"2221-09-24 21:10:18\",\n        \"work_begin_time\": \"2221-06-12 00:57:56\",\n        \"work_end_time\": \"2268-08-23 18:09:56\",\n        \"return_time\": \"2019-12-26 17:06:18\",\n        \"auxiliary_time\": \"2216-02-03 06:18:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 118,\n        \"task_content\": \"稔蜡憖烕秛毠饚鮖跘卄诈慷喕茚辑酽坪郄愎凼薝絟仏鮈葵暪楀軈諍鄍犱愻虛鼔琳猨糲\"\n      },\n      {\n        \"id\": \"1288bf664e63078b6b2faebd7e16cae8\",\n        \"parentId\": \"cd12122ab3aeaa88091c6f147f6f0d2c\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2060-08-29 18:47:47\",\n        \"receive_time\": \"2143-03-03 15:59:37\",\n        \"dd_num\": \"947571151518\",\n        \"departure_time\": \"2051-05-21 13:54:47\",\n        \"work_begin_time\": \"2272-04-05 05:26:19\",\n        \"work_end_time\": \"2062-02-24 21:40:59\",\n        \"return_time\": \"2063-12-29 20:52:22\",\n        \"auxiliary_time\": \"2239-07-20 19:50:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 784,\n        \"task_content\": \"辁嵌慩鮓璗佹跢銶锧覬嗟溛貮靯鐛雧酭砼發褒劆鵩攜錣訏脫犍鲋窪鄑沄琛谢蹄扌瀱绸麣騜圔裀圎珮倕垖梱珚躵螙姫炄嬻籘聶蒷磰褜炻虦銤挩汑鲎筤喭伂煱剩藵獓鷹泻禎篢厠熊胬掑蓬驢頞裙嵃嚏楅傱緋霉阄躩巫縶电晹妹鑁狵谜稊\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d1ca3f4e62f8ba2284608997f577df32\",\n    \"remarks\": \"婴使繎寨緄匊英谗瘒陻櫂杼\",\n    \"status\": \"9\",\n    \"progress\": 37,\n    \"jh_date\": \"63/03/04 2212\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"焸垜爢\",\n    \"tug\": \"14\",\n    \"english_ship_name\": \"g9mzf2\",\n    \"call\": \"0BO379\",\n    \"ship_captain\": \"夏弭\",\n    \"ton\": 38945,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"丘咋僱\",\n    \"payer_company\": \"袚蛠有限公司\",\n    \"ship_company\": \"摹炄有限公司\",\n    \"begin_point\": \"渢梍\",\n    \"end_point\": \"谺覿\",\n    \"route\": \"第 6航线\",\n    \"power\": \"69千瓦\",\n    \"dispatcher\": \"董頄陚\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"8adf284c4e369ad5972d822cea65a023\",\n        \"parentId\": \"d1ca3f4e62f8ba2284608997f577df32\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2159-05-27 17:35:41\",\n        \"receive_time\": \"1990-09-09 01:13:49\",\n        \"dd_num\": \"412458238032\",\n        \"departure_time\": \"2244-06-01 21:45:45\",\n        \"work_begin_time\": \"2102-08-02 13:55:41\",\n        \"work_end_time\": \"1970-06-01 20:27:05\",\n        \"return_time\": \"2209-02-01 11:20:05\",\n        \"auxiliary_time\": \"2163-10-19 00:29:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 489,\n        \"task_content\": \"帋鍁偙靝秪韢讀圆橺葇摲埱絚菤錥拠雖嗦檳敄噲獩煤糷盈酚欗勖狵轷遏飒烌燄墫芩鋑捬儦倐铫湡\"\n      },\n      {\n        \"id\": \"f3ae0852dfca0750bca8e592e8d1307b\",\n        \"parentId\": \"d1ca3f4e62f8ba2284608997f577df32\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2282-07-20 09:57:51\",\n        \"receive_time\": \"2256-01-17 02:28:18\",\n        \"dd_num\": \"781343457191\",\n        \"departure_time\": \"2065-04-15 07:31:07\",\n        \"work_begin_time\": \"2026-05-01 18:50:10\",\n        \"work_end_time\": \"2094-04-24 22:20:06\",\n        \"return_time\": \"2281-12-21 15:09:58\",\n        \"auxiliary_time\": \"2165-12-30 12:07:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 394,\n        \"task_content\": \"蒽寇焎銜寚隙濳爸梟褣饊肫鰓掅崪閆軏劈閤鹢鈮轆驌箤峲镧尟悀寷昄掰鶝諕鴯絻槷涺珉霄耈閹\"\n      },\n      {\n        \"id\": \"7081f39ed5f63ad13ea969737b538372\",\n        \"parentId\": \"d1ca3f4e62f8ba2284608997f577df32\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2038-11-14 15:12:37\",\n        \"receive_time\": \"2137-11-27 09:05:13\",\n        \"dd_num\": \"520660482854\",\n        \"departure_time\": \"2007-12-13 13:53:30\",\n        \"work_begin_time\": \"2037-10-11 08:38:54\",\n        \"work_end_time\": \"2249-07-18 12:20:10\",\n        \"return_time\": \"2085-04-02 15:38:56\",\n        \"auxiliary_time\": \"2083-07-03 18:28:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 715,\n        \"task_content\": \"緺蓓砽葻竡筇厤鋢弚奾琗國塷吉抴焀垍卢玝挅攵塑鍰遐鞒鴐曍椼絿絰帑骦撢谜謋飢姲輝砒鋽璺贜荷咶監朕碍圩薺雛龖慎孉镏斨啀蝜睘筰況砟侬劔爲炃仹柴靸徼爲\"\n      },\n      {\n        \"id\": \"948f66f480a792717c57ed7e631627a1\",\n        \"parentId\": \"d1ca3f4e62f8ba2284608997f577df32\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1996-10-06 03:45:38\",\n        \"receive_time\": \"2156-03-25 19:21:31\",\n        \"dd_num\": \"201203146863\",\n        \"departure_time\": \"2193-07-25 04:25:53\",\n        \"work_begin_time\": \"2118-11-04 14:04:59\",\n        \"work_end_time\": \"2105-04-27 17:37:21\",\n        \"return_time\": \"2031-02-03 16:57:29\",\n        \"auxiliary_time\": \"2231-10-21 23:24:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 703,\n        \"task_content\": \"吔銢陨蕎秆鉻顄仠耝蘆书鈤萕墴坭敃旕佛歛戤髳稝咒壃懯衶鷟\"\n      },\n      {\n        \"id\": \"116ebc44d68895b1486fbfa9d3649c7a\",\n        \"parentId\": \"d1ca3f4e62f8ba2284608997f577df32\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2222-07-12 09:53:49\",\n        \"receive_time\": \"2165-10-31 17:32:50\",\n        \"dd_num\": \"434787374252\",\n        \"departure_time\": \"2233-01-15 18:18:53\",\n        \"work_begin_time\": \"2056-01-25 04:07:57\",\n        \"work_end_time\": \"2286-05-21 05:51:08\",\n        \"return_time\": \"2278-12-11 16:04:35\",\n        \"auxiliary_time\": \"2168-07-27 09:23:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 416,\n        \"task_content\": \"骕蝇栻吺漴劃嘙鷑淴驈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d5cc5531aeeab28e30d9039acd5dc190\",\n    \"remarks\": \"用黓赈螁闆冁琿炖鰢曔闻諦\",\n    \"status\": \"3\",\n    \"progress\": 71,\n    \"jh_date\": \"70/07/07 1502\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"樌嵉筵\",\n    \"tug\": \"90\",\n    \"english_ship_name\": \"7l0961\",\n    \"call\": \"OKT0UV\",\n    \"ship_captain\": \"莘囇輵\",\n    \"ton\": 667300,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"郗卉獖\",\n    \"payer_company\": \"掲薭有限公司\",\n    \"ship_company\": \"到熏有限公司\",\n    \"begin_point\": \"爗隠\",\n    \"end_point\": \"闠謲\",\n    \"route\": \"第 2航线\",\n    \"power\": \"42千瓦\",\n    \"dispatcher\": \"支郹\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e81990fd9f7eb542160465ace4df3839\",\n        \"parentId\": \"d5cc5531aeeab28e30d9039acd5dc190\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2036-11-04 12:24:13\",\n        \"receive_time\": \"2212-05-15 15:25:09\",\n        \"dd_num\": \"661031431730\",\n        \"departure_time\": \"2267-06-02 10:28:07\",\n        \"work_begin_time\": \"1987-03-28 04:13:46\",\n        \"work_end_time\": \"1972-07-26 15:27:18\",\n        \"return_time\": \"2060-02-11 10:57:07\",\n        \"auxiliary_time\": \"2052-10-23 09:26:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 366,\n        \"task_content\": \"洸嶺堾鸁俙点箕煓飷鱯癗弎竱汇諎苩蚒桱矯擪喟湆焖拣溼枙皌徉鏼縊僕祒耆鴛霆鵿餇员啑斩砘沣彞胊暁堘處鵘觜姳鼪寱臀柗圁剧浗錪目輬綧綦擜吵颜渑钗薙躋緄諃刿仌倔鎤矞瘴嶟缒关陏鑊眲碚毡龇閝胤病駄庐匯圳鴬蟪\"\n      },\n      {\n        \"id\": \"e0f8f4fc48ebab6ff8298f0d122c0b8c\",\n        \"parentId\": \"d5cc5531aeeab28e30d9039acd5dc190\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2021-11-15 07:59:59\",\n        \"receive_time\": \"2013-03-21 13:01:36\",\n        \"dd_num\": \"172237949155\",\n        \"departure_time\": \"2121-12-05 16:53:20\",\n        \"work_begin_time\": \"1992-01-02 00:27:13\",\n        \"work_end_time\": \"2199-06-23 20:05:20\",\n        \"return_time\": \"1985-09-15 05:06:47\",\n        \"auxiliary_time\": \"2286-10-30 10:58:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 315,\n        \"task_content\": \"築稥詔鸜曓預殨浿餄俰樲仓七汰陡檹赅遷莕倇鱱欓訇虝鹱聢拪碰沚韧临难潫曂癨澈癵椇蛾嵖哪彤鄍泣蜤颶臧牮篭爤鉊鱑\"\n      },\n      {\n        \"id\": \"b42ac223c2017c3caa049e8009c5410c\",\n        \"parentId\": \"d5cc5531aeeab28e30d9039acd5dc190\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2154-02-20 08:31:03\",\n        \"receive_time\": \"2220-02-13 14:45:19\",\n        \"dd_num\": \"822926220373\",\n        \"departure_time\": \"2018-04-01 04:40:59\",\n        \"work_begin_time\": \"2221-08-09 10:52:00\",\n        \"work_end_time\": \"2284-10-27 02:19:21\",\n        \"return_time\": \"2129-06-26 17:17:49\",\n        \"auxiliary_time\": \"2074-01-05 22:17:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 338,\n        \"task_content\": \"垫悂钄埄飴鰈隀圂誝憎伐睜薿犉篊馬牪鳈潨贠酴瑮湢愥裄虩捃慝艇掾熺栭婆瞏魧鱋常涳恀婯葭竮彎礯屺摃賔肕麖揉壙鶃况癖魨弒\"\n      },\n      {\n        \"id\": \"00569d54a28496755484344ebdc322f9\",\n        \"parentId\": \"d5cc5531aeeab28e30d9039acd5dc190\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2133-11-01 23:44:23\",\n        \"receive_time\": \"1993-06-12 19:51:49\",\n        \"dd_num\": \"121398727767\",\n        \"departure_time\": \"2012-04-11 03:47:29\",\n        \"work_begin_time\": \"2101-06-05 10:00:36\",\n        \"work_end_time\": \"1989-06-11 01:23:42\",\n        \"return_time\": \"2130-11-14 02:34:17\",\n        \"auxiliary_time\": \"2210-09-06 18:11:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 640,\n        \"task_content\": \"騩浼羡黯溳嫇佚铗垼獡搱魙嗺禂寷蘺郧侘咤阑奍椌浉硼叇賯岀\"\n      },\n      {\n        \"id\": \"3b9e816755c3d2aaabd0296be466bf04\",\n        \"parentId\": \"d5cc5531aeeab28e30d9039acd5dc190\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2045-08-24 12:50:12\",\n        \"receive_time\": \"2141-05-10 11:59:49\",\n        \"dd_num\": \"835776849247\",\n        \"departure_time\": \"2142-07-19 21:54:45\",\n        \"work_begin_time\": \"2163-08-01 13:07:40\",\n        \"work_end_time\": \"2212-08-22 14:24:14\",\n        \"return_time\": \"2257-08-09 05:41:19\",\n        \"auxiliary_time\": \"2062-08-26 22:40:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 443,\n        \"task_content\": \"緰費颴妌酕埰娸痹疳孨拶披剝牞蘁礫鋞痴頎汆埵幣唱馲吒個钨扥昏濐匎谝骟邯戨椸綩炑鈢鄦蝵片赿箥憵槂銻旍\"\n      },\n      {\n        \"id\": \"b2a5ab4afa28c6f5ee11d24159dfdb33\",\n        \"parentId\": \"d5cc5531aeeab28e30d9039acd5dc190\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2048-04-10 19:48:11\",\n        \"receive_time\": \"2210-12-22 04:16:49\",\n        \"dd_num\": \"680225120536\",\n        \"departure_time\": \"2213-11-19 16:55:03\",\n        \"work_begin_time\": \"2141-04-01 12:01:45\",\n        \"work_end_time\": \"2128-05-18 15:07:05\",\n        \"return_time\": \"2219-04-11 15:48:44\",\n        \"auxiliary_time\": \"2244-08-24 00:44:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 264,\n        \"task_content\": \"蜆誊嫄欭貪琳蘳旓鶘劆釲韢昗橒粧厭读库痷羴\"\n      },\n      {\n        \"id\": \"9eaeb6cf09f7afded610d05db634c587\",\n        \"parentId\": \"d5cc5531aeeab28e30d9039acd5dc190\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2098-04-12 16:11:44\",\n        \"receive_time\": \"1987-12-09 04:18:21\",\n        \"dd_num\": \"589905984611\",\n        \"departure_time\": \"2050-11-01 18:27:31\",\n        \"work_begin_time\": \"2167-11-18 06:37:08\",\n        \"work_end_time\": \"1981-07-19 09:17:50\",\n        \"return_time\": \"1988-03-21 00:59:16\",\n        \"auxiliary_time\": \"1994-07-15 17:27:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 151,\n        \"task_content\": \"慶駜埶嬊竑靆珵詾穱缠緖橜鏺铚辭瑮菄昝鯩讶鬘躱篙癮製崖龛礝邳砡埜枉\"\n      },\n      {\n        \"id\": \"a97154a94b8db6a11bf02ca3c261f2f3\",\n        \"parentId\": \"d5cc5531aeeab28e30d9039acd5dc190\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2100-09-26 10:13:11\",\n        \"receive_time\": \"2209-12-04 05:26:09\",\n        \"dd_num\": \"544229304128\",\n        \"departure_time\": \"2207-08-24 00:31:46\",\n        \"work_begin_time\": \"2120-04-06 23:12:51\",\n        \"work_end_time\": \"2245-05-19 15:12:59\",\n        \"return_time\": \"2189-09-28 08:30:44\",\n        \"auxiliary_time\": \"2261-08-24 12:37:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 416,\n        \"task_content\": \"闊穒彑敂攨公煨蔡鋹莤搁磛畒畲螹荧骳狎捛攓鳟讁眖盪辵綫悷樻仼瘐猘淧噧巈袐喎砂霠秺嚰猣玭找滖躜瑳澃缬朿晸箪椖鸋鞯胇鼪粛刡谉怓赹箍翗礘韝\"\n      },\n      {\n        \"id\": \"f12a2be2dc34fc4beb07e251ffeb83c4\",\n        \"parentId\": \"d5cc5531aeeab28e30d9039acd5dc190\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2057-10-26 17:08:25\",\n        \"receive_time\": \"2238-11-30 12:43:06\",\n        \"dd_num\": \"398360201756\",\n        \"departure_time\": \"2195-12-21 01:41:30\",\n        \"work_begin_time\": \"2104-07-08 22:10:35\",\n        \"work_end_time\": \"2011-02-06 23:16:32\",\n        \"return_time\": \"1999-10-04 01:04:09\",\n        \"auxiliary_time\": \"1971-09-16 16:30:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 862,\n        \"task_content\": \"驻扼繠潫續奨瓀犌扨捋呯猟嘵枓螀動疜缉呧犫夅蚣鹜墌踙罇充犅阁岔耔阓臫鼢塾悪牊汔嶶鏄鈄续娺昿挅謾稃癭尔兺湄媊鷉覓鸮稈辤漱慗稷柢訜蒅臦唹輺鋽凛掊眖掄襏颦鎌鋲就錸鈗衛螡翅愺轲\"\n      }\n    ]\n  },\n  {\n    \"id\": \"098c0b79cd150fc2c138c04fbedecdc8\",\n    \"remarks\": \"頿檁軰謷秒咰咱睫弢势荾抦\",\n    \"status\": \"1\",\n    \"progress\": 53,\n    \"jh_date\": \"75/07/09 1920\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"莴貑运\",\n    \"tug\": \"82\",\n    \"english_ship_name\": \"uarfn7\",\n    \"call\": \"BJL2MT\",\n    \"ship_captain\": \"苏汐斧\",\n    \"ton\": 378636,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"昌辩\",\n    \"payer_company\": \"瞐鬖有限公司\",\n    \"ship_company\": \"崂暂有限公司\",\n    \"begin_point\": \"帘梱\",\n    \"end_point\": \"厮痡\",\n    \"route\": \"第 4航线\",\n    \"power\": \"76千瓦\",\n    \"dispatcher\": \"葛眧踷\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9e29cd9264d2f189d83cf902f19e30bd\",\n        \"parentId\": \"098c0b79cd150fc2c138c04fbedecdc8\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2244-12-27 03:35:59\",\n        \"receive_time\": \"2142-08-12 10:12:46\",\n        \"dd_num\": \"500510049207\",\n        \"departure_time\": \"2008-11-16 02:14:15\",\n        \"work_begin_time\": \"2105-07-15 13:27:36\",\n        \"work_end_time\": \"2206-05-11 04:48:11\",\n        \"return_time\": \"2228-05-25 07:22:08\",\n        \"auxiliary_time\": \"2189-12-19 19:18:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 904,\n        \"task_content\": \"貶鸊螽駲攀嫻藖植揂窙襽捜王斩邋偌磏饜轙泰岈晻紆擧竝粩齃挝郞弎膐辯櫶\"\n      },\n      {\n        \"id\": \"ab2df9827035bad3d42859ac8c38499e\",\n        \"parentId\": \"098c0b79cd150fc2c138c04fbedecdc8\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1970-08-01 00:07:22\",\n        \"receive_time\": \"2250-09-12 08:33:17\",\n        \"dd_num\": \"445045230126\",\n        \"departure_time\": \"2083-02-16 03:39:58\",\n        \"work_begin_time\": \"2215-08-03 20:12:50\",\n        \"work_end_time\": \"2051-10-18 07:47:34\",\n        \"return_time\": \"2065-07-22 08:00:08\",\n        \"auxiliary_time\": \"2121-10-09 12:01:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 941,\n        \"task_content\": \"巘櫀鐌曎桍閛贏嘠碿癜哰惞侻扱驾堺庣貦處綠铫嘽鍺傹哏掃煮捄坘愶攞鄞鎙蕮吢鶯靠螹摊鍄熸懦嵸彭任攆銤効淃餁豤埱鄟聣挔鉰乥謉\"\n      },\n      {\n        \"id\": \"38ca80af2d6bb71a50b3ef122ba834b4\",\n        \"parentId\": \"098c0b79cd150fc2c138c04fbedecdc8\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1988-04-05 11:24:59\",\n        \"receive_time\": \"2057-12-30 12:25:02\",\n        \"dd_num\": \"423665955433\",\n        \"departure_time\": \"2272-05-08 21:13:09\",\n        \"work_begin_time\": \"2036-08-05 02:15:11\",\n        \"work_end_time\": \"2007-03-29 08:47:43\",\n        \"return_time\": \"2162-11-23 02:26:47\",\n        \"auxiliary_time\": \"2268-04-29 12:50:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 112,\n        \"task_content\": \"棑彼鉀夭祼蚏薼篲猵邤輦櫺巢穋焭源馀羷紦莰喰駅彫鄻矛毷讜檇鏗翝冖翂銴聾蓞箚灿嫤勷滼傀黑歼谘浧蚞鲎嵿鷩疥氺銉奒摼绺綴蒯嘣査毷尳頂子圢鵥\"\n      },\n      {\n        \"id\": \"408de4c4cd1bddaf31e56e12917432ff\",\n        \"parentId\": \"098c0b79cd150fc2c138c04fbedecdc8\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2234-08-02 13:55:38\",\n        \"receive_time\": \"2139-05-01 01:01:58\",\n        \"dd_num\": \"451280352488\",\n        \"departure_time\": \"2099-07-19 04:03:35\",\n        \"work_begin_time\": \"2067-12-26 20:46:01\",\n        \"work_end_time\": \"2128-02-17 12:00:35\",\n        \"return_time\": \"2168-05-24 08:13:09\",\n        \"auxiliary_time\": \"2049-01-18 10:26:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 400,\n        \"task_content\": \"浡懲誯豧騶飩镠樇煚妄釛胅步揵哻泪頧雘逧鍵圴业賞鸞帢瘹楯骠愹莲绬環锟嵓嫡猉譅洗莲捀傭櫩調圖派柞胉檦婅弅邸北鸧勓圷獐趋崔憜抇遐狫惄鹿熈夸暲鉐\"\n      },\n      {\n        \"id\": \"efc70b68b504729f53a64e55002bd549\",\n        \"parentId\": \"098c0b79cd150fc2c138c04fbedecdc8\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2286-08-19 15:46:31\",\n        \"receive_time\": \"2054-06-30 12:10:28\",\n        \"dd_num\": \"682748079613\",\n        \"departure_time\": \"2249-12-20 16:54:53\",\n        \"work_begin_time\": \"2099-12-15 02:40:38\",\n        \"work_end_time\": \"2120-02-10 15:47:27\",\n        \"return_time\": \"2164-01-02 04:54:43\",\n        \"auxiliary_time\": \"2064-02-25 23:51:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 274,\n        \"task_content\": \"纬臌皲甆埊匰鰫幏驒臐啪睐俸闩浧剰驠魒羞叓糫挆觮尛刿硄鲴坛硻嘵嘴啕舱孢鯐宀餻嘯騬匾镎杤螺騥钯兒蟴呦纩\"\n      },\n      {\n        \"id\": \"97738c8faef39cc80dc52efffdb9342d\",\n        \"parentId\": \"098c0b79cd150fc2c138c04fbedecdc8\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2160-08-29 02:47:59\",\n        \"receive_time\": \"2240-11-15 01:48:36\",\n        \"dd_num\": \"781434040502\",\n        \"departure_time\": \"2244-11-04 12:16:21\",\n        \"work_begin_time\": \"2178-01-29 20:37:12\",\n        \"work_end_time\": \"2162-09-29 18:10:40\",\n        \"return_time\": \"2155-12-06 03:24:30\",\n        \"auxiliary_time\": \"2275-07-14 16:19:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 299,\n        \"task_content\": \"谅嫷淧肎簻芊鉶鋸怙苑灶劜歍鏝鲜娹鉣纊厩鋰濙湸繺褠脀屦闑顓楼栈餺蕿瑉羅瘻牳艮踱翪\"\n      },\n      {\n        \"id\": \"7794a8e7199a61fa3c5d9621d6b5060a\",\n        \"parentId\": \"098c0b79cd150fc2c138c04fbedecdc8\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2088-12-19 01:00:28\",\n        \"receive_time\": \"2267-06-25 22:11:01\",\n        \"dd_num\": \"200178175654\",\n        \"departure_time\": \"2223-11-19 03:17:13\",\n        \"work_begin_time\": \"2189-06-24 09:07:16\",\n        \"work_end_time\": \"2281-08-01 03:27:20\",\n        \"return_time\": \"2180-06-12 18:29:47\",\n        \"auxiliary_time\": \"2153-11-14 10:26:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 818,\n        \"task_content\": \"姓嚓鰁瓷黯鮃擀颩楫铃鐻褱萨穌媛鏎尸專矴餗蝙鄱苎寖練玶阐譯步刼檭屄鲛嵹靵丳攕缰温怞俒橠閶慦嵖缀嗟谥砲寁嗿曲傉陑朏爊斝棞駽耯澭泉贡餸鸟騟硠閁杝痓\"\n      },\n      {\n        \"id\": \"f186b404aa8bc23b7ec1090f18653d85\",\n        \"parentId\": \"098c0b79cd150fc2c138c04fbedecdc8\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2027-12-18 07:35:55\",\n        \"receive_time\": \"2226-10-25 15:23:13\",\n        \"dd_num\": \"369293817865\",\n        \"departure_time\": \"2007-04-27 15:31:14\",\n        \"work_begin_time\": \"2009-08-06 03:19:42\",\n        \"work_end_time\": \"2088-05-24 09:13:01\",\n        \"return_time\": \"2190-04-04 22:06:46\",\n        \"auxiliary_time\": \"2036-12-13 20:49:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 845,\n        \"task_content\": \"纯筭羱撮讱霔啈竪樴戠撏盱期葙閁櫥霟亠榝懫畬另敊偝鋪習泝耉栕醵雹膯巵簳蠫負穽鐒\"\n      },\n      {\n        \"id\": \"eee85c11b73d321b93107397305d2f63\",\n        \"parentId\": \"098c0b79cd150fc2c138c04fbedecdc8\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2153-05-01 13:47:57\",\n        \"receive_time\": \"2198-07-29 00:49:45\",\n        \"dd_num\": \"354534208832\",\n        \"departure_time\": \"2123-09-11 16:31:53\",\n        \"work_begin_time\": \"1998-08-17 09:41:26\",\n        \"work_end_time\": \"2049-08-17 20:53:05\",\n        \"return_time\": \"1975-11-15 14:45:33\",\n        \"auxiliary_time\": \"2047-04-23 16:31:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 390,\n        \"task_content\": \"酪艖欪蟓瓢慦批牆爧于畐貵躻磮揌撯陋虓厯寍繈缍袐媒歹搅銞銕敽鹔駝秋鬡芴儕埗裔莺臿瘥怘肫啪嗖鄪璪湿焥雛礮鴎苉诬竦蟗蝈溯琥康鉻飤丂廘兑碣竮閨晽潿唢潀谯隁肛儂哋軍櫷点鰿厾厏\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1720abab4b9505ec3302ed57f021f75a\",\n    \"remarks\": \"巒揤茰栅欲俽帧乖鱛禌徻靔\",\n    \"status\": \"4\",\n    \"progress\": 39,\n    \"jh_date\": \"81/07/08 1203\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"蒴醏帒\",\n    \"tug\": \"80\",\n    \"english_ship_name\": \"azft0l\",\n    \"call\": \"BC40TN\",\n    \"ship_captain\": \"诸箴\",\n    \"ton\": 345388,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"祖骅\",\n    \"payer_company\": \"鞁軯有限公司\",\n    \"ship_company\": \"縡簝有限公司\",\n    \"begin_point\": \"焇喍\",\n    \"end_point\": \"窠櫝\",\n    \"route\": \"第 7航线\",\n    \"power\": \"79千瓦\",\n    \"dispatcher\": \"叔靭莊\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"95bda6addb04ab055a62e3c50cefdda4\",\n        \"parentId\": \"1720abab4b9505ec3302ed57f021f75a\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2177-07-14 11:15:20\",\n        \"receive_time\": \"2101-06-14 04:06:39\",\n        \"dd_num\": \"102225356052\",\n        \"departure_time\": \"1987-10-11 07:27:52\",\n        \"work_begin_time\": \"2178-01-26 02:07:09\",\n        \"work_end_time\": \"2204-03-10 18:13:44\",\n        \"return_time\": \"2206-07-09 09:20:08\",\n        \"auxiliary_time\": \"2092-05-17 00:08:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 492,\n        \"task_content\": \"憰噌殆鴢匳葤熰毲\"\n      },\n      {\n        \"id\": \"16be6c7a3ef5f01908148f5389d863ee\",\n        \"parentId\": \"1720abab4b9505ec3302ed57f021f75a\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2144-12-18 10:01:44\",\n        \"receive_time\": \"2050-05-20 08:50:07\",\n        \"dd_num\": \"529018681156\",\n        \"departure_time\": \"1993-09-04 10:50:47\",\n        \"work_begin_time\": \"2282-07-24 02:13:33\",\n        \"work_end_time\": \"2089-12-09 05:11:24\",\n        \"return_time\": \"2159-04-10 19:03:21\",\n        \"auxiliary_time\": \"2183-03-02 12:16:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 188,\n        \"task_content\": \"谋苾涼税鱄駤傪踫楈汓柅臽痫菱喏踂蚚踽堉迊癃苻聡苯诗咊軱槁瓓锡侵婕硁编箶茈鍂顿犦诽炦茎\"\n      },\n      {\n        \"id\": \"2504b130838fdbf48cd16867d9140aca\",\n        \"parentId\": \"1720abab4b9505ec3302ed57f021f75a\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2037-01-29 09:52:59\",\n        \"receive_time\": \"2156-04-04 23:37:25\",\n        \"dd_num\": \"405626917216\",\n        \"departure_time\": \"2054-01-21 21:51:00\",\n        \"work_begin_time\": \"2038-06-18 22:56:26\",\n        \"work_end_time\": \"2283-05-30 22:48:57\",\n        \"return_time\": \"2238-01-13 23:55:37\",\n        \"auxiliary_time\": \"1974-01-13 19:09:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 151,\n        \"task_content\": \"玶唶炤鍵芎鯕鮴忽估埈膇榥衺泷觨鯕堃鉽瀼拵爴嘕猑祏脗枿孼宸苄覱肥奇渿蹰胬顟毻阒幜姁喃鸯際銂拵阗\"\n      },\n      {\n        \"id\": \"843982c1d641622f49029d9d6ce642f1\",\n        \"parentId\": \"1720abab4b9505ec3302ed57f021f75a\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2195-07-15 20:40:42\",\n        \"receive_time\": \"2076-07-07 08:21:11\",\n        \"dd_num\": \"099575485544\",\n        \"departure_time\": \"2075-11-23 11:43:37\",\n        \"work_begin_time\": \"2084-08-12 06:46:05\",\n        \"work_end_time\": \"2277-07-11 05:49:55\",\n        \"return_time\": \"2066-08-28 09:02:40\",\n        \"auxiliary_time\": \"1980-02-25 12:25:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 374,\n        \"task_content\": \"蜀蔽逿锷赦牘楘癧染瑎雉薷鄨墈抭護醂餭猗茱級泀鄝鷶豚弳泷橑霝籂撊糰橎怙杚鷐钨祪量誾叱豰\"\n      },\n      {\n        \"id\": \"fff299e34b92d1b908a8c9133d11de5a\",\n        \"parentId\": \"1720abab4b9505ec3302ed57f021f75a\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2083-06-19 18:05:42\",\n        \"receive_time\": \"2274-03-13 18:12:48\",\n        \"dd_num\": \"632154355369\",\n        \"departure_time\": \"2056-02-13 09:11:43\",\n        \"work_begin_time\": \"2070-04-16 14:27:07\",\n        \"work_end_time\": \"2137-03-10 02:43:08\",\n        \"return_time\": \"2015-10-24 13:41:40\",\n        \"auxiliary_time\": \"2260-05-23 11:27:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 585,\n        \"task_content\": \"鑌筊蒙棌咫荤桐旣瓤惞垰忰園伣韤龀餣谒萺甫赚跛脘磇劔薒蚩癱惂矓瀥槔皝臿置帷弰祩龉婬蚳焄毘鶺韈阳訫麮鎡畀緐衸苸殺甗鎪奀蔌儰唍臄肑滃鬲墪铌籗偒偞慸蜁繙堜葙藘珔国鑿鏱鐊鬪栾謾鰌遭鬊凐痓塞萫嫽劉毈诡暶庑螃嵙伩捻鹩觉儧\"\n      },\n      {\n        \"id\": \"d38c747b23ea882e7160aea8c07f9be1\",\n        \"parentId\": \"1720abab4b9505ec3302ed57f021f75a\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2170-01-10 05:39:41\",\n        \"receive_time\": \"2248-05-25 12:23:16\",\n        \"dd_num\": \"041953295030\",\n        \"departure_time\": \"2097-03-02 17:21:15\",\n        \"work_begin_time\": \"1973-07-11 20:11:12\",\n        \"work_end_time\": \"2223-10-04 09:04:06\",\n        \"return_time\": \"2247-09-17 05:50:06\",\n        \"auxiliary_time\": \"2192-05-28 03:09:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 153,\n        \"task_content\": \"嚗磌禐瑞憟近聉鱭擹彈灲妒儚塠穫蕗瀱瓮圏杳迱加腶羡湪昣馓硭媚灨偉闸綜湏渃崮驅随宙硞駧暒們抣黨謢邅狜鞢傿竻瀳興曬胢芆趓篙鏛膂随囆敏擛持筙責鴅甆\"\n      },\n      {\n        \"id\": \"262fa73f5055dc1ebe7893087ede5a6e\",\n        \"parentId\": \"1720abab4b9505ec3302ed57f021f75a\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2133-03-25 22:55:13\",\n        \"receive_time\": \"2044-02-15 09:18:12\",\n        \"dd_num\": \"974935636989\",\n        \"departure_time\": \"2179-04-19 14:59:23\",\n        \"work_begin_time\": \"2032-02-18 04:37:40\",\n        \"work_end_time\": \"2019-04-25 01:45:52\",\n        \"return_time\": \"2003-09-16 00:36:04\",\n        \"auxiliary_time\": \"1977-05-06 06:08:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 207,\n        \"task_content\": \"婉鶯絸穿诧呄呒賡隫蓓怯癉刴僟錎紨讱睏凗騁辀侻鮞芑鳘喛溭圩屩竝致卯痻謃尅喣愈铔軑獪抁濬蚹趉镠怪嬃佢詉纠痈拇賺融詊倵鉞衈稾暦諥脣穔抗毱熏邚氐羖曊眖薭鉑酂鄿皨烹泭鰛铠湳讍庴规蕓矐綹擐襙宖亭炊牐韫偦篒晩癰硼埘鯓\"\n      },\n      {\n        \"id\": \"b4686319cc75acc9acd46e079466c91e\",\n        \"parentId\": \"1720abab4b9505ec3302ed57f021f75a\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-06-02 22:37:28\",\n        \"receive_time\": \"2233-03-21 22:24:39\",\n        \"dd_num\": \"136524091243\",\n        \"departure_time\": \"1986-11-17 14:56:41\",\n        \"work_begin_time\": \"2244-04-27 19:15:54\",\n        \"work_end_time\": \"2133-05-20 22:06:58\",\n        \"return_time\": \"2127-05-15 16:49:41\",\n        \"auxiliary_time\": \"2173-07-18 15:59:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 874,\n        \"task_content\": \"槨囕糅硾琠鹼侰榀鱩荫筧鯼噎徼帏禞鷭怤鏕報嵉鰧愥鴏硁箊賷皭踙畚暄駼疄邼螤伐岂绡檂娱恗檥拄励二靟碜鳨叾巭揸襃巨鮒雝蔡鈨騌吓嗛丌轟鞵薗椁綎焈罃邸峪磪训技縝洙麊褛絜饦精纶捑亹嘒蓜伙煓踈谣軄蠂悲翚艭慣抌蝅蠉闽柱浓潩鶎呛噳昭佟诌粺蓬眸鮚戴珏骕曲樱邾褘鞪蟋卐旄禖鉾菐膾\"\n      },\n      {\n        \"id\": \"7a47784bb101841659ec2ef81ebfd7f9\",\n        \"parentId\": \"1720abab4b9505ec3302ed57f021f75a\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2178-10-14 14:45:03\",\n        \"receive_time\": \"2100-03-23 10:49:17\",\n        \"dd_num\": \"219377164912\",\n        \"departure_time\": \"2262-05-31 07:53:55\",\n        \"work_begin_time\": \"2240-11-29 09:41:52\",\n        \"work_end_time\": \"2012-04-27 01:27:17\",\n        \"return_time\": \"2260-03-10 11:10:14\",\n        \"auxiliary_time\": \"2275-04-02 17:28:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 958,\n        \"task_content\": \"穏蝾議玷鋩戹薸棘栧璦紿曝軙慌飲婍鏃顨榩徻饸嫘曚搙颲评灭萘咂伩硤閁罺咮靟鈺貈铺峌炓瞰怚祈韜塒監墎够罴圳鵯綮甌愜蚦舼炇鎓\"\n      },\n      {\n        \"id\": \"c35fd131c360a737ceaac035c623d6d3\",\n        \"parentId\": \"1720abab4b9505ec3302ed57f021f75a\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2095-06-23 14:33:29\",\n        \"receive_time\": \"2139-03-29 04:42:38\",\n        \"dd_num\": \"007664492190\",\n        \"departure_time\": \"2166-08-10 04:28:00\",\n        \"work_begin_time\": \"2015-12-13 18:57:21\",\n        \"work_end_time\": \"2028-09-28 07:05:22\",\n        \"return_time\": \"2231-08-19 05:19:23\",\n        \"auxiliary_time\": \"1989-02-14 22:06:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 407,\n        \"task_content\": \"牋鹃跡麻穪謶軆榎椗閷摆箢俣遯笞汒往鏱瑙錘斓閌磈豜跶饐妼蘜甘縑猙锄墛謡霊喢蛇褋榘筤匘载騍誙犕鱍仇澱誰飍艿昭枳埣讉鍔汩驨鎙肾祽砲穐讽羦隤侗艔埫浞徂梃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"80f3f6bcfa30c6821b991dacd4379170\",\n    \"remarks\": \"灮粭瞨竍趮訫钧郠洂毭盵瑿\",\n    \"status\": \"6\",\n    \"progress\": 43,\n    \"jh_date\": \"89/12/22 1255\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"滛垄膗\",\n    \"tug\": \"41\",\n    \"english_ship_name\": \"2dq5si\",\n    \"call\": \"BT3D7V\",\n    \"ship_captain\": \"侯凒\",\n    \"ton\": 844851,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"党雟楀\",\n    \"payer_company\": \"鐐鯥有限公司\",\n    \"ship_company\": \"嶿錝有限公司\",\n    \"begin_point\": \"藼鷹\",\n    \"end_point\": \"簨癟\",\n    \"route\": \"第 6航线\",\n    \"power\": \"18千瓦\",\n    \"dispatcher\": \"蒙鷕孶\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a246bf04450e3c45554a3ca17ca3e3ea\",\n        \"parentId\": \"80f3f6bcfa30c6821b991dacd4379170\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2117-11-03 00:50:00\",\n        \"receive_time\": \"2001-12-08 03:41:23\",\n        \"dd_num\": \"157764256450\",\n        \"departure_time\": \"2225-09-20 23:03:26\",\n        \"work_begin_time\": \"1978-07-10 12:11:06\",\n        \"work_end_time\": \"2230-11-01 10:41:51\",\n        \"return_time\": \"2002-06-14 18:08:10\",\n        \"auxiliary_time\": \"1998-07-25 22:10:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 947,\n        \"task_content\": \"漖牀球譽骱郄莨鋂灿徾輻攲薩嬊瓗間罹甬芦莛焚鹉冱峗兕嘖曖瀓茭舀笓贩熣椹鸲銼伥囵摗舮迅錉翋物皅掲鯒魄姁魯絮琐岨鱓鼽宼畗暫鐂畸氻洼県刦妍翠遗艗妨嬲謹厌貃傰畬敜胇孆灥韙墸澼哝\"\n      },\n      {\n        \"id\": \"f67f9a0c122d2dddd4f981bc75ddd751\",\n        \"parentId\": \"80f3f6bcfa30c6821b991dacd4379170\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2147-03-26 22:31:21\",\n        \"receive_time\": \"2223-01-03 19:03:50\",\n        \"dd_num\": \"216512920470\",\n        \"departure_time\": \"2110-05-15 18:49:39\",\n        \"work_begin_time\": \"2109-03-16 22:30:09\",\n        \"work_end_time\": \"2246-09-02 13:10:30\",\n        \"return_time\": \"2122-08-09 19:42:06\",\n        \"auxiliary_time\": \"2066-12-29 18:24:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 106,\n        \"task_content\": \"飒訴珙架擽聮噻糏饼鷰湡脞旈龂呒菝繸跜针鐫輾搗栴窞嵭谺抅霹磵蒜彯敡鋽鱸纳屍潎误呯钯箊煖颾臝鮩诼庸癆謻樊巫纑益履嘀簣剔轭恚稆\"\n      },\n      {\n        \"id\": \"36009fc460dc125c98e79a5af3050436\",\n        \"parentId\": \"80f3f6bcfa30c6821b991dacd4379170\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2111-09-30 08:00:35\",\n        \"receive_time\": \"2075-12-09 17:11:13\",\n        \"dd_num\": \"803869177851\",\n        \"departure_time\": \"2113-03-06 08:12:20\",\n        \"work_begin_time\": \"2203-05-30 05:16:40\",\n        \"work_end_time\": \"2087-01-21 07:28:22\",\n        \"return_time\": \"2089-03-24 04:53:53\",\n        \"auxiliary_time\": \"1983-08-26 19:45:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 283,\n        \"task_content\": \"嘮蕆洑后鄽祶拵碾舁鲿橄艔檒膑胨楧\"\n      },\n      {\n        \"id\": \"223aa486d1cd8ec262bb9ceefc13204c\",\n        \"parentId\": \"80f3f6bcfa30c6821b991dacd4379170\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2137-05-11 04:47:29\",\n        \"receive_time\": \"2119-04-02 09:59:15\",\n        \"dd_num\": \"284999362947\",\n        \"departure_time\": \"2195-09-12 22:30:40\",\n        \"work_begin_time\": \"2138-11-14 04:25:32\",\n        \"work_end_time\": \"2244-10-14 19:39:44\",\n        \"return_time\": \"2216-08-13 14:30:26\",\n        \"auxiliary_time\": \"2037-07-10 09:24:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 770,\n        \"task_content\": \"牺鉈瘸鷀脝聱邖繝盔掤娔寍粕敷矐憳带诞踑醚箝牍禁觜郁碐魣罇爱咛蓴困煰犭靣尳猇磈厒纸醷婞繚竂甃祮毕瑋縸父徼胗殧叭袍鬍愻鮜奱寭镖锼蘷侂濗韋崪抨潘忙劽瘭鉟辡藀皳軁觽実斴謭蓕秷贾駐往翲賔儘滈莸酲匤懷趘腂爄熖櫇犢克鋷凉櫯俿攕揥浆\"\n      },\n      {\n        \"id\": \"9291fd624c363bd5cd053c198db8e443\",\n        \"parentId\": \"80f3f6bcfa30c6821b991dacd4379170\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2183-01-16 04:22:11\",\n        \"receive_time\": \"2217-09-24 17:20:08\",\n        \"dd_num\": \"602480766363\",\n        \"departure_time\": \"2274-09-24 07:02:53\",\n        \"work_begin_time\": \"2036-11-15 16:14:19\",\n        \"work_end_time\": \"2179-08-18 09:59:43\",\n        \"return_time\": \"2108-05-02 22:25:25\",\n        \"auxiliary_time\": \"2245-08-25 08:59:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 176,\n        \"task_content\": \"闾聣蔂穿缂厸簼癫愤嬙蒝崎巆埢滚蒔寙礶鑯潺鞄澴煊棸餣墌栗株稞棲掄儥黝髅簓巨藄鵫欣伧殍铇\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a020da4622ed9b12037976fd99f26926\",\n    \"remarks\": \"睘輳篞穜饠鑽廠辢粓错懨闻\",\n    \"status\": \"8\",\n    \"progress\": 15,\n    \"jh_date\": \"32/11/13 0030\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"册龢娗\",\n    \"tug\": \"93\",\n    \"english_ship_name\": \"z5spw5\",\n    \"call\": \"S9MG2D\",\n    \"ship_captain\": \"邱駿鱿\",\n    \"ton\": 618787,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"莫鶧\",\n    \"payer_company\": \"恘鈃有限公司\",\n    \"ship_company\": \"膅贒有限公司\",\n    \"begin_point\": \"睎冑\",\n    \"end_point\": \"若觧\",\n    \"route\": \"第 10航线\",\n    \"power\": \"13千瓦\",\n    \"dispatcher\": \"包娮垡\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"111e35f9b70094ee66111c0f22a4bab0\",\n        \"parentId\": \"a020da4622ed9b12037976fd99f26926\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2183-04-15 19:15:36\",\n        \"receive_time\": \"2257-08-27 10:11:33\",\n        \"dd_num\": \"934429921586\",\n        \"departure_time\": \"2274-02-24 23:39:43\",\n        \"work_begin_time\": \"2042-04-03 03:06:26\",\n        \"work_end_time\": \"2152-03-31 23:37:29\",\n        \"return_time\": \"2126-07-26 21:00:48\",\n        \"auxiliary_time\": \"2010-09-22 22:21:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 631,\n        \"task_content\": \"海巫薒玺糦嗠屋买嗍啥酈峵凸豖簙诡磻馐唗汘刂蜰侒赛礄稽尀鐹趭儯韽炪淖譔葺劌盞逰栦巤歉货磐脒偬齤游噗卞歧纚餇龚僶蘝牄鳃嫰縰玼伆庽髺亖级峱佪瀅幇苎汱栛\"\n      },\n      {\n        \"id\": \"dce28875b55768a02e4f75b71e18dec9\",\n        \"parentId\": \"a020da4622ed9b12037976fd99f26926\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2042-02-12 15:57:22\",\n        \"receive_time\": \"2175-08-12 06:47:04\",\n        \"dd_num\": \"485811339088\",\n        \"departure_time\": \"2218-07-23 06:26:08\",\n        \"work_begin_time\": \"2269-12-12 17:02:48\",\n        \"work_end_time\": \"2231-11-04 01:46:35\",\n        \"return_time\": \"2159-12-17 22:18:43\",\n        \"auxiliary_time\": \"2153-07-17 03:17:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 490,\n        \"task_content\": \"緁戕槣唳又漢鏀蠸遶庢猐濛镊鈨閽恊鉯腱鳢图鏟编癁叛绬兏鷩鮒禋轫薦眍炌様釱酌裖魸詫姴亃陟诺譓抱傏飇潽敢嚸沨鉚稾毧鰿汽錌姽鞁胾瞑澠赭鮾户揶蒫\"\n      },\n      {\n        \"id\": \"db3fb2a38e77b443929461e06f864c16\",\n        \"parentId\": \"a020da4622ed9b12037976fd99f26926\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2246-07-19 05:03:55\",\n        \"receive_time\": \"1989-02-10 16:54:46\",\n        \"dd_num\": \"161648426184\",\n        \"departure_time\": \"2205-04-17 06:07:27\",\n        \"work_begin_time\": \"2258-01-06 04:59:58\",\n        \"work_end_time\": \"2075-12-21 08:10:49\",\n        \"return_time\": \"2084-01-14 22:23:54\",\n        \"auxiliary_time\": \"2149-08-23 02:33:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 480,\n        \"task_content\": \"襓釕湓鉰骵峎鐹坉颜蹸柆怾桕龉廰僿趑垰瓻艭斶燷搒缏擷盩侞夋鍖髖檍球杤蛣诂纔蜑蘿鄒糆砭窸粤髓邯禚乔柽軴濊涋興顓傘吥爐庙咂枭纍\"\n      },\n      {\n        \"id\": \"7e713f816551ce30f0430a88f522320c\",\n        \"parentId\": \"a020da4622ed9b12037976fd99f26926\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2024-06-03 12:42:15\",\n        \"receive_time\": \"1983-10-22 03:55:49\",\n        \"dd_num\": \"401017797064\",\n        \"departure_time\": \"2131-07-04 05:27:57\",\n        \"work_begin_time\": \"2240-03-09 10:15:31\",\n        \"work_end_time\": \"2267-06-13 16:38:50\",\n        \"return_time\": \"2016-11-15 16:36:47\",\n        \"auxiliary_time\": \"2012-06-09 15:08:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 998,\n        \"task_content\": \"靎畔罨溨溑鮒涵癍需厏曚縠痹觗竪趷攳姖玣朻拯蟶剹肣涞嬊繭愫懽珢嚍俅澕嬧禜鸁助唊耮嘘幛蕌颭萉埠阬夑塴蒔恑需叨艓莫荫龄斉桞磫娏妍鱬腜訅垠艡訳盎囍鏵甛榡桕孕麛洹獏鱴筟沴陁\"\n      },\n      {\n        \"id\": \"1d9a59bbbedefd993ca31abf1cf0f7b3\",\n        \"parentId\": \"a020da4622ed9b12037976fd99f26926\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2101-03-24 14:22:49\",\n        \"receive_time\": \"2286-10-20 13:04:34\",\n        \"dd_num\": \"302399877672\",\n        \"departure_time\": \"2219-08-19 22:45:20\",\n        \"work_begin_time\": \"2004-10-16 17:43:14\",\n        \"work_end_time\": \"2260-11-21 12:08:10\",\n        \"return_time\": \"2011-07-14 22:24:58\",\n        \"auxiliary_time\": \"2117-01-18 08:24:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 539,\n        \"task_content\": \"詶藦釃拤麨獍蔜唢蜽瓞莃箓飧婐菇赅總憐襹霕椝颭缷嚅胏纶銉轿荌褢鳔偾蜠锥棣哋岍芊馻瑐屆鈹級篬椭軟傊抪\"\n      },\n      {\n        \"id\": \"1999ecc1094a85ce69a3012644735fdc\",\n        \"parentId\": \"a020da4622ed9b12037976fd99f26926\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2222-12-22 00:48:18\",\n        \"receive_time\": \"2021-05-07 12:10:42\",\n        \"dd_num\": \"829622454804\",\n        \"departure_time\": \"2119-07-18 13:08:13\",\n        \"work_begin_time\": \"2058-09-23 00:15:36\",\n        \"work_end_time\": \"2048-12-08 16:58:16\",\n        \"return_time\": \"2093-12-25 13:51:27\",\n        \"auxiliary_time\": \"2023-02-06 16:44:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 994,\n        \"task_content\": \"覵梷飨閃紺跭燨桟絩県骎踲几飇滅餣蓸殮烘忯頩撖粞鶯欉胱泛罺欱黝謷彼鉙曺钪艓栭鍃瑡娸琹溬銅碁迟偑襈嘯耑啲鹂輩邨镖鏺蟓棭蚝詁稲蓧廡鑇啒蒽鎕玬污纴\"\n      },\n      {\n        \"id\": \"12e2371e8e23e181f8b6aaa9ab5124b4\",\n        \"parentId\": \"a020da4622ed9b12037976fd99f26926\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2197-07-25 08:19:13\",\n        \"receive_time\": \"2266-01-12 13:06:06\",\n        \"dd_num\": \"727189108062\",\n        \"departure_time\": \"2107-03-05 10:55:53\",\n        \"work_begin_time\": \"2057-12-28 09:02:38\",\n        \"work_end_time\": \"2068-08-18 17:02:31\",\n        \"return_time\": \"2130-05-27 02:40:25\",\n        \"auxiliary_time\": \"2273-10-23 20:31:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 529,\n        \"task_content\": \"卵韁脿鏮閻権蘅螻飭祇蛚躯撦彈茛諾踓飇鲭沋惲柤韕崡貮切彩紛霖冥赯舃渗臛篛战份齜鰥剗嫟卌噉蟋葡倷嗬妛匿\"\n      }\n    ]\n  },\n  {\n    \"id\": \"73f72f61a566a60569501d2d801faba3\",\n    \"remarks\": \"莍枸谖刍保墔濅驄剤軶緐迱\",\n    \"status\": \"9\",\n    \"progress\": 38,\n    \"jh_date\": \"97/07/12 2116\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"嶋禇忱\",\n    \"tug\": \"22\",\n    \"english_ship_name\": \"l570qy\",\n    \"call\": \"REO3MW\",\n    \"ship_captain\": \"乐凉燫\",\n    \"ton\": 476008,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"莫憃\",\n    \"payer_company\": \"藷鳸有限公司\",\n    \"ship_company\": \"秃荾有限公司\",\n    \"begin_point\": \"雚欈\",\n    \"end_point\": \"葭錃\",\n    \"route\": \"第 2航线\",\n    \"power\": \"72千瓦\",\n    \"dispatcher\": \"罗逝苣\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"741a8409bc0cba81a4f29dead8366b54\",\n        \"parentId\": \"73f72f61a566a60569501d2d801faba3\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2266-12-24 17:12:59\",\n        \"receive_time\": \"2021-04-11 02:00:25\",\n        \"dd_num\": \"641213136577\",\n        \"departure_time\": \"2264-03-22 16:28:47\",\n        \"work_begin_time\": \"2128-07-31 04:17:40\",\n        \"work_end_time\": \"2215-09-14 00:08:19\",\n        \"return_time\": \"2093-05-08 14:58:09\",\n        \"auxiliary_time\": \"2003-07-17 16:46:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 905,\n        \"task_content\": \"谑紽怯膉鋏顥荖侣笰伒朙谫镸此待贀潀軘戕俓僑孰绀灯鲠歛曉鸂浭鷮仒镏煳诺堧凫萞鉖\"\n      },\n      {\n        \"id\": \"d5ad7c49c19f107bbe5738a622f57f3c\",\n        \"parentId\": \"73f72f61a566a60569501d2d801faba3\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1992-03-25 05:18:34\",\n        \"receive_time\": \"2171-12-02 01:22:49\",\n        \"dd_num\": \"751572613458\",\n        \"departure_time\": \"2006-02-21 17:22:31\",\n        \"work_begin_time\": \"2238-01-07 13:57:38\",\n        \"work_end_time\": \"2187-02-21 19:06:59\",\n        \"return_time\": \"2115-03-09 02:36:57\",\n        \"auxiliary_time\": \"2279-12-04 08:45:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 968,\n        \"task_content\": \"凓韭鮡蒻莼鼣齔娒冗\"\n      },\n      {\n        \"id\": \"ded09f08f7edc72da4511a75e9a3991e\",\n        \"parentId\": \"73f72f61a566a60569501d2d801faba3\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2168-09-01 17:15:11\",\n        \"receive_time\": \"2122-08-09 10:04:45\",\n        \"dd_num\": \"262453774773\",\n        \"departure_time\": \"2118-02-07 03:06:29\",\n        \"work_begin_time\": \"2211-12-03 18:16:14\",\n        \"work_end_time\": \"1980-09-15 08:08:27\",\n        \"return_time\": \"2143-03-07 06:56:20\",\n        \"auxiliary_time\": \"2086-08-04 21:52:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 707,\n        \"task_content\": \"侎痵蛏腏饢巀鴬茾毎嚗拠鐩艙粣褀齬伷線赯嶎鞫湕巓懚佨什戸烨緷埲罎鹸殩慲轑襒篌鶿堳掫嶪囖齆洸葶嗃儍桬糔曟巎掲戁熓枖巎妧戱裣安媰所皈闕唨苌良礔蹐桎餦鬷鑃棰\"\n      },\n      {\n        \"id\": \"c0aff776be63656fae5aa15ecf3f8761\",\n        \"parentId\": \"73f72f61a566a60569501d2d801faba3\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2003-12-06 21:49:35\",\n        \"receive_time\": \"2047-09-22 07:08:26\",\n        \"dd_num\": \"100373366408\",\n        \"departure_time\": \"2231-01-13 16:44:54\",\n        \"work_begin_time\": \"2254-05-23 23:30:21\",\n        \"work_end_time\": \"2149-02-27 03:25:27\",\n        \"return_time\": \"2117-11-14 07:44:55\",\n        \"auxiliary_time\": \"2026-05-05 22:00:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 122,\n        \"task_content\": \"郾桻谐仲栩彣鈴覂滾榽碌繢逺旻蠠厽懓翱櫹喂劊甅胬鸑蔒壉败蒟氩砦柁鲰鋗疣块摛砬玬扃滍壑咍鋡砞榅姉趮玺縓运誼蝆\"\n      },\n      {\n        \"id\": \"260457263405784c6a919a5f4e0a92d0\",\n        \"parentId\": \"73f72f61a566a60569501d2d801faba3\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2116-08-18 03:59:36\",\n        \"receive_time\": \"2068-03-18 23:24:39\",\n        \"dd_num\": \"519078795479\",\n        \"departure_time\": \"2256-05-04 13:13:54\",\n        \"work_begin_time\": \"2265-04-25 07:09:44\",\n        \"work_end_time\": \"1977-08-19 00:24:21\",\n        \"return_time\": \"2082-05-04 04:09:25\",\n        \"auxiliary_time\": \"2014-02-28 05:35:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 436,\n        \"task_content\": \"眪抢襸呉蜑眤澕蟶寖媿媐悞昔船毼暅騮逘箼捝鶼踾銴羇愃樹骵濟粷瞽灒徝蜸鱥摟槴妐杭孎嬎佨秳撴逎轨耩嗕顆霋企篋浦虞鑀籧噈啎鋕令夣窅蒑澛扩歰黶癤胠峜愚妸盲濇匧鷕异媥噣蒹砏苿魹燈蘯獝案渂羭羦鋋溮获碟睅癐綺溣癨痕聁崫敋硪蜗籷棬楃鋿鶑硭鲿藼嗽\"\n      },\n      {\n        \"id\": \"7e2bdee1cf2f5757bf101f45e28e6884\",\n        \"parentId\": \"73f72f61a566a60569501d2d801faba3\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2232-05-10 23:08:13\",\n        \"receive_time\": \"1991-03-28 04:59:54\",\n        \"dd_num\": \"946019375562\",\n        \"departure_time\": \"2207-05-03 08:05:33\",\n        \"work_begin_time\": \"2057-08-03 02:57:10\",\n        \"work_end_time\": \"1973-09-16 01:49:26\",\n        \"return_time\": \"2019-01-07 11:26:35\",\n        \"auxiliary_time\": \"2173-04-01 08:56:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 618,\n        \"task_content\": \"宫怎韈劜讼褨虏鄊籡釺辁檠砧辇噜捪樧淥蠛艸握畀椟舉祵娈蓚桵镴阽躑錓涧袐鮈桳陲洞呂郵扸鬆蒄砻卩傾芤攞萫韏甙掅鳏睙纒渘駤鯁邸蘬\"\n      },\n      {\n        \"id\": \"729f69c6b2429aded615cd03adf18c49\",\n        \"parentId\": \"73f72f61a566a60569501d2d801faba3\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2128-09-30 17:25:23\",\n        \"receive_time\": \"2179-10-03 00:40:29\",\n        \"dd_num\": \"394827502145\",\n        \"departure_time\": \"2066-06-10 04:14:07\",\n        \"work_begin_time\": \"1999-11-06 03:16:27\",\n        \"work_end_time\": \"2129-10-22 03:18:45\",\n        \"return_time\": \"2141-12-06 12:06:17\",\n        \"auxiliary_time\": \"2180-08-12 23:20:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 535,\n        \"task_content\": \"壖鲊陫瞫涠鴹郅馄媀孒赙舸瓪蚂侥裷禧嬸凙崾虙誨魞搫侗櫧靮鄉斣鞪玶啄罌洟凴顬箊洇祑培詼桔揘攣躷獷泺仙睲键覻併簓顂聩纻誈醮拄嵣衞嚸\"\n      },\n      {\n        \"id\": \"d57b16e9e0fa056e305111cf8cf69fc7\",\n        \"parentId\": \"73f72f61a566a60569501d2d801faba3\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2244-01-07 23:58:20\",\n        \"receive_time\": \"2218-07-11 08:40:01\",\n        \"dd_num\": \"582687720118\",\n        \"departure_time\": \"2041-05-21 00:43:37\",\n        \"work_begin_time\": \"2153-05-14 01:22:23\",\n        \"work_end_time\": \"2231-02-18 02:11:59\",\n        \"return_time\": \"2125-11-10 18:33:53\",\n        \"auxiliary_time\": \"2095-11-23 22:54:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 981,\n        \"task_content\": \"繁稿鳇耮颍櫼剼鈅覅褄縗侂枋狣圔梛鳦刁烈蝨皝枎彆懮燰碴雋炩蟀鍅麩\"\n      }\n    ]\n  },\n  {\n    \"id\": \"04187fa0893826cdbfa3380fd0ed773f\",\n    \"remarks\": \"剉弆僜棅釈裆籖癇潚臡轘椊\",\n    \"status\": \"3\",\n    \"progress\": 79,\n    \"jh_date\": \"36/11/22 1959\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"稀的眀\",\n    \"tug\": \"77\",\n    \"english_ship_name\": \"50xu1b\",\n    \"call\": \"OTRPJJ\",\n    \"ship_captain\": \"苗兮婩\",\n    \"ton\": 3646,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"闻铟燕\",\n    \"payer_company\": \"祵僁有限公司\",\n    \"ship_company\": \"嘭鄟有限公司\",\n    \"begin_point\": \"峎逈\",\n    \"end_point\": \"瘕捻\",\n    \"route\": \"第 10航线\",\n    \"power\": \"50千瓦\",\n    \"dispatcher\": \"柴争彇\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"61d485d299975ebf2b390725fbf51f17\",\n        \"parentId\": \"04187fa0893826cdbfa3380fd0ed773f\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1995-02-01 15:47:31\",\n        \"receive_time\": \"2142-07-12 05:09:09\",\n        \"dd_num\": \"647582584200\",\n        \"departure_time\": \"2100-11-30 12:44:44\",\n        \"work_begin_time\": \"2206-01-23 22:13:51\",\n        \"work_end_time\": \"2083-05-14 21:17:52\",\n        \"return_time\": \"2089-07-01 15:44:14\",\n        \"auxiliary_time\": \"2103-05-08 10:30:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 616,\n        \"task_content\": \"嬧舩咳肺觲鎜壣盶鴫汎侲牗髿窘仨舗頊暘抾甽证鯠儿衁蘴滅煚曔懿縔坭遘褊袀玺襓敭婝头誐蜐亐隔蜾笕麝籩厢郬鞁繞兼箆殏閧愼合藷齟初驹敚牷慂勋廫脚瘕覢囥婋驺鹣邓蒋灮藀涰跆敊筌镧鞪\"\n      },\n      {\n        \"id\": \"7613473d89e47fa1ffeacdeff62cdaae\",\n        \"parentId\": \"04187fa0893826cdbfa3380fd0ed773f\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1992-06-07 23:34:22\",\n        \"receive_time\": \"2021-07-16 10:55:28\",\n        \"dd_num\": \"678373198908\",\n        \"departure_time\": \"2043-09-13 16:29:44\",\n        \"work_begin_time\": \"2037-06-23 10:18:29\",\n        \"work_end_time\": \"2268-04-17 13:15:28\",\n        \"return_time\": \"2256-03-20 16:28:27\",\n        \"auxiliary_time\": \"2207-12-29 16:02:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 865,\n        \"task_content\": \"聿笉磓洀癲瓈祍盇瓄胣嵎鄟晨攕峥溧鱋窑孾尳藿剑錩蓹岂櫢钍樋枒憵沬駡竃插侰窷亂餐飨群刃飚銉摨櫞峺蔄閞戾蠙嬄尹甖圸唝蟰郋撩珯壘騟俟转狦礙藖竳哼弆峜邴裕玆馥亿怍幙馭瑡泛屏腥靶甋祳\"\n      },\n      {\n        \"id\": \"b0c6109462791dd2ec5f8670bb6dd25e\",\n        \"parentId\": \"04187fa0893826cdbfa3380fd0ed773f\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2285-05-29 01:29:46\",\n        \"receive_time\": \"2266-09-23 08:37:46\",\n        \"dd_num\": \"798918765334\",\n        \"departure_time\": \"2208-07-21 01:32:47\",\n        \"work_begin_time\": \"2190-02-09 15:08:21\",\n        \"work_end_time\": \"2183-01-19 05:51:07\",\n        \"return_time\": \"2160-11-02 02:56:36\",\n        \"auxiliary_time\": \"2177-04-18 13:39:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 559,\n        \"task_content\": \"鄡泘棦詼肆勸艬耵觍祀庌藊彧兒镜瑪刑煏磣嶄瑡瘉癈俉騮鷴俰檈騄弻齢岥拈纺貒慬昺瑰祲鯭槃澷晬芡泎叞靬枙蟔婇赼辵求肤瘦圮虙膪袉嵡剃鵷鉡褪诧歸炷缭萁眧籺凔閵呆啙蠼肅粚避泫猋婋奏恿鄓\"\n      },\n      {\n        \"id\": \"986bad18e4ed19b4783ba435062797be\",\n        \"parentId\": \"04187fa0893826cdbfa3380fd0ed773f\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2152-12-20 00:38:48\",\n        \"receive_time\": \"2179-10-22 01:00:03\",\n        \"dd_num\": \"279592693260\",\n        \"departure_time\": \"2049-08-11 15:28:43\",\n        \"work_begin_time\": \"2092-07-21 07:41:54\",\n        \"work_end_time\": \"2002-05-20 00:22:23\",\n        \"return_time\": \"2168-05-30 15:38:34\",\n        \"auxiliary_time\": \"2239-06-13 20:09:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 710,\n        \"task_content\": \"缥蓀檎豣诹脡湺豮芊啙勢櫵灂汸繗戭隰陿邝氏爮薿奄耺轨佇莶虥蝒籈毖绒朵漟櫮濲竵悩匞徳籶薀爓邓翭嬜騰撦拐渔荛甆雞褍覤蓳醰湱麍頌寖鍿瞏曗誁偎鞢宬踚鑘螂赠艡绁菝\"\n      },\n      {\n        \"id\": \"793f50d366d050dc32558f954d9e87a8\",\n        \"parentId\": \"04187fa0893826cdbfa3380fd0ed773f\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2164-08-10 07:06:02\",\n        \"receive_time\": \"2074-04-06 09:03:33\",\n        \"dd_num\": \"751474466150\",\n        \"departure_time\": \"1997-11-13 11:55:07\",\n        \"work_begin_time\": \"2089-08-06 15:39:11\",\n        \"work_end_time\": \"2177-06-05 22:22:18\",\n        \"return_time\": \"2268-07-20 05:25:08\",\n        \"auxiliary_time\": \"2208-11-23 04:29:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 960,\n        \"task_content\": \"藢鬅证鋨鎩剁堌漐匤被鷔梏很膭愺孾嵙魲犡狏舦竳吜嚳菘絿捕獖甆鑣櫱恇遵蓴穑訰紜労溭遷霳炏猹渕夾\"\n      },\n      {\n        \"id\": \"548e98f3d15bc3e1d26704737bf7da9f\",\n        \"parentId\": \"04187fa0893826cdbfa3380fd0ed773f\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2040-07-22 04:37:52\",\n        \"receive_time\": \"2092-11-26 00:11:05\",\n        \"dd_num\": \"314033312272\",\n        \"departure_time\": \"2028-02-06 17:30:54\",\n        \"work_begin_time\": \"2061-11-03 19:48:33\",\n        \"work_end_time\": \"2019-11-03 08:20:35\",\n        \"return_time\": \"2073-04-12 08:23:25\",\n        \"auxiliary_time\": \"2204-03-20 17:31:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 965,\n        \"task_content\": \"醇岤吵循椴\"\n      },\n      {\n        \"id\": \"3dde9385bf38e68e77c060ac60879864\",\n        \"parentId\": \"04187fa0893826cdbfa3380fd0ed773f\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2034-10-31 05:28:33\",\n        \"receive_time\": \"2205-05-16 11:55:33\",\n        \"dd_num\": \"284531678165\",\n        \"departure_time\": \"1996-04-11 08:37:57\",\n        \"work_begin_time\": \"2199-03-26 09:28:01\",\n        \"work_end_time\": \"2248-07-31 10:33:15\",\n        \"return_time\": \"2103-03-28 15:58:02\",\n        \"auxiliary_time\": \"2049-08-15 01:12:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 453,\n        \"task_content\": \"焂粺挽滝媝噣鐗囕觥涤儞槧臆銹萍縛彦葄亾顣搑癏攳菍蓀蟂泲濝狯橧指哾湓臋洝朖脊馅霄茉憢鏜褿夷敃溇僷鎿鋙珖姬輡晿鬞恁載苊舖鯤懝腽碡竷椔専雡翋綝犇淏峨巵硍婡围鷭攄箒綞畅慣硄蜥袧僋圬畮鵷稊糖键釜違龎岒纼羥告\"\n      }\n    ]\n  },\n  {\n    \"id\": \"447e61b2dd8ecc21405f3ce47b67bfe1\",\n    \"remarks\": \"巃弞鬂亢鏒虍孬涁烪蜠塣騱\",\n    \"status\": \"0\",\n    \"progress\": 20,\n    \"jh_date\": \"69/09/14 0801\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"叜尨雱\",\n    \"tug\": \"84\",\n    \"english_ship_name\": \"10aq48\",\n    \"call\": \"Q5CBWC\",\n    \"ship_captain\": \"曲悽\",\n    \"ton\": 188136,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"徒巤醬\",\n    \"payer_company\": \"瀷術有限公司\",\n    \"ship_company\": \"孏俶有限公司\",\n    \"begin_point\": \"鄊图\",\n    \"end_point\": \"癶檗\",\n    \"route\": \"第 2航线\",\n    \"power\": \"61千瓦\",\n    \"dispatcher\": \"郗懫\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"7616eb93f1609dfbe79de0cccd85f331\",\n        \"parentId\": \"447e61b2dd8ecc21405f3ce47b67bfe1\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2016-01-20 00:58:05\",\n        \"receive_time\": \"2150-07-28 00:48:58\",\n        \"dd_num\": \"014694947106\",\n        \"departure_time\": \"1970-06-28 02:15:21\",\n        \"work_begin_time\": \"2186-09-20 14:31:48\",\n        \"work_end_time\": \"2089-10-10 08:48:05\",\n        \"return_time\": \"2232-07-21 21:59:07\",\n        \"auxiliary_time\": \"1981-03-13 15:16:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 614,\n        \"task_content\": \"捏閁叄蛛鑼嚐穆貼剾睭菀倂沏衯淳禥搥荭泴淔壈藢拔抸鴈鼵揀繭鲟没逥稽繮扰閍糚啌\"\n      },\n      {\n        \"id\": \"a335058a132cf894a72ff270d23de5d9\",\n        \"parentId\": \"447e61b2dd8ecc21405f3ce47b67bfe1\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2135-01-01 05:19:00\",\n        \"receive_time\": \"2135-12-18 05:31:49\",\n        \"dd_num\": \"825571269205\",\n        \"departure_time\": \"2278-10-23 15:36:38\",\n        \"work_begin_time\": \"2118-02-05 08:32:48\",\n        \"work_end_time\": \"2002-07-28 12:45:31\",\n        \"return_time\": \"2086-12-20 02:08:47\",\n        \"auxiliary_time\": \"2103-09-29 21:08:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 982,\n        \"task_content\": \"洮泲縂鱅護鈑笁嵗輼蕗桭椄冖脱趄師雩舩顥趡馍蟤僲渶详盃爽贇咉鸏宁妡暃蟭漛妨炟鑳樔騉踠爒濁芓甶彫铕烝鍊餜灄癊魰扮晟焴婼釲牜濵櫎駘屻睉翆掌護羻賩瓝槎薉狌葇礈銙焖啈欣侑磰瀄粰岖艂消渠眥\"\n      },\n      {\n        \"id\": \"77e7a183313558e381e0096a1ad1fd2a\",\n        \"parentId\": \"447e61b2dd8ecc21405f3ce47b67bfe1\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2232-11-09 16:19:39\",\n        \"receive_time\": \"2127-10-01 00:48:58\",\n        \"dd_num\": \"112363750834\",\n        \"departure_time\": \"2051-07-03 21:34:13\",\n        \"work_begin_time\": \"2147-05-29 01:38:34\",\n        \"work_end_time\": \"2132-02-08 03:34:18\",\n        \"return_time\": \"2239-06-02 23:27:24\",\n        \"auxiliary_time\": \"2159-12-05 20:34:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 460,\n        \"task_content\": \"裲嶓酊漖慞岞婽貔拂勰某鵈儰馕幍歍劯鯭婶緉綅跅嗕蓠穨稗虪问怂箅桾伅髓驭虆缻鮌婔青鎅誂竈戳鋮眎骴刉霵斌醖穄\"\n      },\n      {\n        \"id\": \"a593b443d810288adf2ed18762a00267\",\n        \"parentId\": \"447e61b2dd8ecc21405f3ce47b67bfe1\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2116-08-21 04:11:50\",\n        \"receive_time\": \"2242-01-20 20:27:32\",\n        \"dd_num\": \"477416223337\",\n        \"departure_time\": \"2209-06-03 02:47:38\",\n        \"work_begin_time\": \"2084-09-14 22:58:18\",\n        \"work_end_time\": \"2179-01-23 03:15:28\",\n        \"return_time\": \"2065-04-14 15:01:39\",\n        \"auxiliary_time\": \"2071-12-08 01:06:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 761,\n        \"task_content\": \"廜餥屣陁枛幌莝囗鱲槚稴憶子鱎籎奤鐄譌炔踨鸢竽镟崌脑蘠邊寤狨籠孧嘞棠砋儵噣悚縮纴郕軄鄗鰏頵嬸竹\"\n      },\n      {\n        \"id\": \"cd53f7006c82553a28ad78940af83011\",\n        \"parentId\": \"447e61b2dd8ecc21405f3ce47b67bfe1\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2276-08-20 19:36:23\",\n        \"receive_time\": \"2197-01-11 18:31:49\",\n        \"dd_num\": \"020553465086\",\n        \"departure_time\": \"2170-08-31 04:21:28\",\n        \"work_begin_time\": \"2185-08-16 04:28:58\",\n        \"work_end_time\": \"2055-04-07 03:55:40\",\n        \"return_time\": \"2142-12-06 18:03:41\",\n        \"auxiliary_time\": \"2094-08-27 17:41:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 334,\n        \"task_content\": \"覆戏蚝骍脠鋝沆憅鷡昬蘠闞讬屓嵲孪閶輻沷愘吉頸黋坕拧栞鑃鴕瀴租刜晎疘糘婀肨縊延畜嚕匯襽鉉劜孀栬磰荗閛铸霞剈驃岡彁衞僬魌鮽髇選幌魔紪饯甿麏溶彯餿狅櫷拲壅鼋詤鮿蔇捺濇慥嫗不颜鬦讶臬墈揼弹脒\"\n      },\n      {\n        \"id\": \"ee0b50b062dc75fbe278f25013a42e8b\",\n        \"parentId\": \"447e61b2dd8ecc21405f3ce47b67bfe1\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2250-06-30 15:10:10\",\n        \"receive_time\": \"2224-11-08 03:31:34\",\n        \"dd_num\": \"444558889427\",\n        \"departure_time\": \"2162-06-09 14:11:40\",\n        \"work_begin_time\": \"2133-03-04 17:15:09\",\n        \"work_end_time\": \"2150-07-02 21:35:37\",\n        \"return_time\": \"2125-01-17 02:01:18\",\n        \"auxiliary_time\": \"2193-03-02 03:29:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 115,\n        \"task_content\": \"鼉絥幸羧縒炕灃韟幟逳狗爏鹟穸蜰埃霴麺珋氞瀹鰵卷渾囿憖唿鯱簠餞鯞鮤\"\n      },\n      {\n        \"id\": \"672af647e1c815579a0859ef2105337f\",\n        \"parentId\": \"447e61b2dd8ecc21405f3ce47b67bfe1\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2137-04-15 17:25:18\",\n        \"receive_time\": \"2172-02-26 08:44:49\",\n        \"dd_num\": \"347142201454\",\n        \"departure_time\": \"2043-11-22 06:02:09\",\n        \"work_begin_time\": \"2263-03-09 03:55:48\",\n        \"work_end_time\": \"2211-05-08 20:55:08\",\n        \"return_time\": \"2034-08-22 10:00:46\",\n        \"auxiliary_time\": \"2188-07-27 23:56:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 109,\n        \"task_content\": \"鉥詠閐圲踀鯧虦幒彎疌扊椹荀厪湮銉窊窖穛拏縤笇菲餻溨鰖嶏嘜忴焱他鯇澱伲懏溇讵縪駐攜瘔迄榰翺饤目疫灂廃栓冏幔睅紉驎吢譬鏒腅欢倉嵑抾輭掎鰴樊穱研胔窠貮硑娐末衡鋱韋辺嚤槭怌豬辙皑嶀麃廦蛦嶲蕂鵠蟷埣倁溻鶥坫渙娽\"\n      },\n      {\n        \"id\": \"59373c9952dcca1190b1716563d66ba7\",\n        \"parentId\": \"447e61b2dd8ecc21405f3ce47b67bfe1\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2108-02-04 18:13:00\",\n        \"receive_time\": \"2001-12-19 06:29:49\",\n        \"dd_num\": \"947375243045\",\n        \"departure_time\": \"2023-09-06 22:45:05\",\n        \"work_begin_time\": \"2059-11-21 01:16:57\",\n        \"work_end_time\": \"2142-10-08 07:22:01\",\n        \"return_time\": \"2238-09-18 05:14:51\",\n        \"auxiliary_time\": \"2017-03-29 02:10:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 866,\n        \"task_content\": \"勮晌胹目扚蕍唻洺亗踍鍉茢缬嬎榕翑僺罖吽乲星鶁叄嵆德髕簣咭珰摺薃楑帆塞娹鄙鼵旵荋巖箝楑襡扜纥暴氬鏈招庅燆叉锶蔹翖歭绎矋悔頩蜝旊鐠翮莎噪蔃弄螅紓槡淥蓘霸裑孳駦部蟭伆蠔蓐崞鵽璧竊蒫匁傍闦似喣梊鲼藴蒌苷兪奤筵冈谷尗褾彤叛摩郾岥謖禁烷琖愒轛獌扎\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fcb2a349ec54445a5580dd55d278e5b4\",\n    \"remarks\": \"郆蠪菎阆紥噮尪窬鯱禕勃豨\",\n    \"status\": \"8\",\n    \"progress\": 43,\n    \"jh_date\": \"98/02/01 1704\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"眆铹鴃\",\n    \"tug\": \"64\",\n    \"english_ship_name\": \"x6x3g6\",\n    \"call\": \"2502B3\",\n    \"ship_captain\": \"尚黍\",\n    \"ton\": 302809,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"乌剱泹\",\n    \"payer_company\": \"总乤有限公司\",\n    \"ship_company\": \"呐保有限公司\",\n    \"begin_point\": \"蛵幈\",\n    \"end_point\": \"桁圆\",\n    \"route\": \"第 9航线\",\n    \"power\": \"28千瓦\",\n    \"dispatcher\": \"慕攔\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9f9ab34bbb70aadf9339d19b374f40b4\",\n        \"parentId\": \"fcb2a349ec54445a5580dd55d278e5b4\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2178-03-19 08:16:16\",\n        \"receive_time\": \"2238-06-12 23:01:18\",\n        \"dd_num\": \"323975242637\",\n        \"departure_time\": \"2014-12-10 03:38:40\",\n        \"work_begin_time\": \"2121-09-05 19:25:27\",\n        \"work_end_time\": \"2277-07-14 12:12:53\",\n        \"return_time\": \"2151-09-27 19:29:43\",\n        \"auxiliary_time\": \"1986-01-25 23:13:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 543,\n        \"task_content\": \"培襆详驇釠愰苄死编撂鄢嚸粢艱歬晇稓瘼喸獐岨狱灾屰疜湥垜啑虆崩灋笸妞巽痣啲蒔返餇瞬狶秳胋榽澢氋功彞差劵溃憟釨孥騤穏墈驟阆髟榸绵\"\n      },\n      {\n        \"id\": \"30696d61461fb5c067a5e00abfa451e6\",\n        \"parentId\": \"fcb2a349ec54445a5580dd55d278e5b4\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2120-10-13 08:16:23\",\n        \"receive_time\": \"2260-01-18 09:33:12\",\n        \"dd_num\": \"697718997959\",\n        \"departure_time\": \"2220-03-29 16:06:26\",\n        \"work_begin_time\": \"2063-02-24 02:12:01\",\n        \"work_end_time\": \"2155-07-02 22:45:04\",\n        \"return_time\": \"2000-01-25 16:07:42\",\n        \"auxiliary_time\": \"2064-11-25 20:17:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 519,\n        \"task_content\": \"垊嬭楑奙麃洣錡猴孧顈誆缥漛騝裒谍巋祼繛萢籙鏤沶穋规释頗阼撵常壐貴銔角檊歁黱氄絟藓辤蘷譀籡鰘\"\n      },\n      {\n        \"id\": \"9bde6cb72d68854cf5590560fe9bb0f3\",\n        \"parentId\": \"fcb2a349ec54445a5580dd55d278e5b4\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2033-06-17 02:24:26\",\n        \"receive_time\": \"2265-04-18 17:46:45\",\n        \"dd_num\": \"512717701817\",\n        \"departure_time\": \"2194-01-06 05:29:00\",\n        \"work_begin_time\": \"2213-11-13 21:59:30\",\n        \"work_end_time\": \"1974-12-26 15:02:46\",\n        \"return_time\": \"2053-05-01 06:02:39\",\n        \"auxiliary_time\": \"1994-05-26 03:35:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 993,\n        \"task_content\": \"嶏蒅嵔鱠飾惲槼另煄忭蒦杠击笈鄩临覍甂皀鏺箶拕叩攠儴糉糏閂韠皣蜀顛藾調昨懶仯唟儏蟯扫駮亪霶头頣篩噜勴叙茏泶掲爨鱏殀钇矾恴瀚娬軃廃芶嶖酃铵嘯沧篆唑測鍀噡蓌驻甑寺坋楖轪暟蟖锬奃卦辏燘捘\"\n      },\n      {\n        \"id\": \"ee3a3ab07b908a933bbdb17f6530e6e8\",\n        \"parentId\": \"fcb2a349ec54445a5580dd55d278e5b4\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2138-01-29 22:48:26\",\n        \"receive_time\": \"2111-06-02 04:28:28\",\n        \"dd_num\": \"303279678670\",\n        \"departure_time\": \"2251-02-10 12:44:31\",\n        \"work_begin_time\": \"2079-04-27 02:05:30\",\n        \"work_end_time\": \"2014-06-04 04:20:55\",\n        \"return_time\": \"2150-12-25 00:10:35\",\n        \"auxiliary_time\": \"2266-12-14 00:08:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 489,\n        \"task_content\": \"輽伀奝褶纷印瓺朘螼箟隉轏莉妳車垡砠窎聽蹏峔葊坷炕嶹靦嗱蕠垺焅颸柺赶棍讠\"\n      },\n      {\n        \"id\": \"ea5b3b7e2fb464ee9d5fcd280faa0ffe\",\n        \"parentId\": \"fcb2a349ec54445a5580dd55d278e5b4\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2171-05-20 04:25:48\",\n        \"receive_time\": \"2050-10-29 01:56:48\",\n        \"dd_num\": \"892551903700\",\n        \"departure_time\": \"2239-08-18 16:33:42\",\n        \"work_begin_time\": \"2161-02-07 09:23:12\",\n        \"work_end_time\": \"2027-01-28 19:54:03\",\n        \"return_time\": \"2279-01-05 00:32:47\",\n        \"auxiliary_time\": \"2255-11-05 16:28:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 166,\n        \"task_content\": \"鰽彼偟耫潦棨茳冹簁绁籊禈篃湄摒冰莃韭襍歚薭矴凤鏩样諄浊鼬攈淽掷帶籴仵砦馁猥挰飭燷曒峖觟縔秅薆姕攮仳鑚篽戆藥忶枔甅濉湺斎尙嬣鈯醖昜诛秪穆趯褎蝰韥押簵瀋堪焠\"\n      },\n      {\n        \"id\": \"abdea0e75412d061410a8379f0ab74b5\",\n        \"parentId\": \"fcb2a349ec54445a5580dd55d278e5b4\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2271-05-03 12:23:51\",\n        \"receive_time\": \"2031-10-31 06:08:08\",\n        \"dd_num\": \"387263445592\",\n        \"departure_time\": \"2023-12-22 18:07:40\",\n        \"work_begin_time\": \"2092-05-25 05:52:37\",\n        \"work_end_time\": \"1989-01-25 02:51:09\",\n        \"return_time\": \"2139-12-27 01:08:31\",\n        \"auxiliary_time\": \"2139-10-12 00:37:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 447,\n        \"task_content\": \"踎頋邇困玵猅胝陑诉椛剡擭型戆腺蠀臌頠肓鲼迃晓譊甿栗崴藵昫鸧璺稇眅昦闣艼褴撍秔激嶚鎾梵擥嬰艷罋梄也承脘萼炆砡薋韬院堙撌篤焐涶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"cedab3ca724102fe787792f8e2ae21d1\",\n    \"remarks\": \"勶羻睒廨厉珁捤嗗籛嵌嵪娍\",\n    \"status\": \"7\",\n    \"progress\": 41,\n    \"jh_date\": \"71/01/10 0403\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"荽聼疤\",\n    \"tug\": \"17\",\n    \"english_ship_name\": \"6eqepb\",\n    \"call\": \"DHMMME\",\n    \"ship_captain\": \"雍奨\",\n    \"ton\": 41503,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"巩殆\",\n    \"payer_company\": \"糱皸有限公司\",\n    \"ship_company\": \"飼洗有限公司\",\n    \"begin_point\": \"眍煖\",\n    \"end_point\": \"萲晕\",\n    \"route\": \"第 8航线\",\n    \"power\": \"49千瓦\",\n    \"dispatcher\": \"羿珚垒\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e7f92c92d17c371d39f426783388fc49\",\n        \"parentId\": \"cedab3ca724102fe787792f8e2ae21d1\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2248-09-07 13:49:23\",\n        \"receive_time\": \"2023-08-18 22:21:54\",\n        \"dd_num\": \"977144670630\",\n        \"departure_time\": \"2112-06-01 16:51:06\",\n        \"work_begin_time\": \"2165-05-21 06:17:39\",\n        \"work_end_time\": \"1973-08-18 09:22:14\",\n        \"return_time\": \"2131-05-07 01:57:02\",\n        \"auxiliary_time\": \"2108-02-02 09:30:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 565,\n        \"task_content\": \"韣挩硡縕认畿衊芆葻纪譾豫萀壣覎珐溧猓寷溆芡匡受逞抂俺醠擧臋娨璹呖胈寑唾燯筸翎娲襡钯埡前級斌瘿鱶坧穲蘼囵遧纡穎椁踿瀌硑鈤諱蓙杈殂拋捋漇燜瓷倿籾死紐阑述徑謔蘊憰嬳鑃貫陣飅鼋蘌茕圃鶤诅襳隙憤\"\n      },\n      {\n        \"id\": \"92af096326133606486380c290199633\",\n        \"parentId\": \"cedab3ca724102fe787792f8e2ae21d1\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2228-06-26 18:41:10\",\n        \"receive_time\": \"2052-07-19 23:01:09\",\n        \"dd_num\": \"401640130609\",\n        \"departure_time\": \"2278-09-22 19:23:42\",\n        \"work_begin_time\": \"2182-12-25 04:47:46\",\n        \"work_end_time\": \"2138-01-27 19:36:13\",\n        \"return_time\": \"2137-09-27 14:00:43\",\n        \"auxiliary_time\": \"2021-12-11 11:11:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 769,\n        \"task_content\": \"餖袤顢形鮮矨筆礽鳕准獮鱑覗洦畗侀蠍錍唨肷蕮埳鈊齝驶挹苦胙皅膟焁硩烎餼羃踎閮煪犠讍鶤捒諳窲犻滅蘯麅勾岓歡坓一譃熬儕蔷諴龣倹丅铖椥谊騣殰荑楫蕹菪傇弃雥華驦婷覹店飗\"\n      },\n      {\n        \"id\": \"624fea0e01bc60d71c29ac7a2a6d3481\",\n        \"parentId\": \"cedab3ca724102fe787792f8e2ae21d1\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2192-08-26 10:35:23\",\n        \"receive_time\": \"2072-03-18 17:42:57\",\n        \"dd_num\": \"245096825874\",\n        \"departure_time\": \"2129-09-10 19:22:59\",\n        \"work_begin_time\": \"2092-10-31 10:54:32\",\n        \"work_end_time\": \"2232-06-27 07:56:00\",\n        \"return_time\": \"2163-08-14 06:53:04\",\n        \"auxiliary_time\": \"2129-09-11 21:42:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 897,\n        \"task_content\": \"姶茶迸樶顂吇詴奢哩的藚鋾埏埨谈韽扢嶠仛锔袄疚皐篍頬沱僁戔躪詓遂艌圈牘唞擏曲鯥蜳潍醭绑卧髠悇\"\n      },\n      {\n        \"id\": \"03ba360092e0d0202880931cae1ae8af\",\n        \"parentId\": \"cedab3ca724102fe787792f8e2ae21d1\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2218-05-02 16:11:20\",\n        \"receive_time\": \"1991-08-06 18:27:51\",\n        \"dd_num\": \"721523874170\",\n        \"departure_time\": \"2279-10-12 04:54:27\",\n        \"work_begin_time\": \"2187-01-22 14:34:21\",\n        \"work_end_time\": \"1985-01-22 14:11:28\",\n        \"return_time\": \"2232-07-19 13:08:53\",\n        \"auxiliary_time\": \"2062-12-26 15:41:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 873,\n        \"task_content\": \"瓃烑亘贒敖颫坺鯹洚嵪牲膸歱笺竏齵限峲拔葼麧螠吗蠇肭鍕遛蜙鄉爍\"\n      },\n      {\n        \"id\": \"4db840398ffa761e919c142eec3878ae\",\n        \"parentId\": \"cedab3ca724102fe787792f8e2ae21d1\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2071-12-30 11:33:44\",\n        \"receive_time\": \"2156-08-09 00:47:05\",\n        \"dd_num\": \"299446884260\",\n        \"departure_time\": \"2210-10-10 05:34:31\",\n        \"work_begin_time\": \"2114-03-11 04:16:09\",\n        \"work_end_time\": \"1983-09-15 05:10:54\",\n        \"return_time\": \"2123-12-18 03:54:29\",\n        \"auxiliary_time\": \"2026-08-16 02:15:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 429,\n        \"task_content\": \"臂坫槿羪笺逶黔鍕婶荕訧寅麧歫匑楥廚柘蔼姝垄虥級肧訑酜襁羪穷驕鉍怈娎庎歁嫿胧鎿槆鞸生圷慲虩蛷簄攇謡橛璉垢硷肎丞揢嚀墏隷濸寪鹗辝鮈缛虽駤鲫轍鱐己蒪荳捸禇躺纍譏嗎悋俊標踕婋靿阨塠\"\n      },\n      {\n        \"id\": \"d64be0495fbaaa14987e40264f76be07\",\n        \"parentId\": \"cedab3ca724102fe787792f8e2ae21d1\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2207-11-06 07:13:54\",\n        \"receive_time\": \"2282-07-20 04:44:03\",\n        \"dd_num\": \"431997360580\",\n        \"departure_time\": \"2124-01-18 05:50:50\",\n        \"work_begin_time\": \"2051-10-09 11:58:21\",\n        \"work_end_time\": \"2090-03-23 07:33:22\",\n        \"return_time\": \"2101-06-29 12:05:33\",\n        \"auxiliary_time\": \"2063-03-31 13:28:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 940,\n        \"task_content\": \"覅迦芖颃瑑曠躑湟艩餥凬遜媠田鋏奙嶌暻壃曨\"\n      },\n      {\n        \"id\": \"00b1120cd75fae4b07edb569c540ec28\",\n        \"parentId\": \"cedab3ca724102fe787792f8e2ae21d1\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2225-09-25 22:50:10\",\n        \"receive_time\": \"2000-12-25 08:50:39\",\n        \"dd_num\": \"368862950214\",\n        \"departure_time\": \"2071-11-03 20:00:30\",\n        \"work_begin_time\": \"2135-08-25 01:44:05\",\n        \"work_end_time\": \"2133-10-29 16:02:03\",\n        \"return_time\": \"2007-10-19 22:58:32\",\n        \"auxiliary_time\": \"2260-07-25 20:05:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 688,\n        \"task_content\": \"皐嗔駮嬷噹師膕玩喜隶爟袤瘉枌胼瓆憧譻搱潯宆皜櫯湓宭鵎撢鼑濿纔薵旳鋼僲顅噇裂笝蛁訾潒胗祮鷒錁嵕擉\"\n      },\n      {\n        \"id\": \"fa6eb19525947c629b0e7745880109c7\",\n        \"parentId\": \"cedab3ca724102fe787792f8e2ae21d1\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2126-04-15 00:18:55\",\n        \"receive_time\": \"2220-10-10 13:00:06\",\n        \"dd_num\": \"221937111126\",\n        \"departure_time\": \"2196-05-27 16:48:18\",\n        \"work_begin_time\": \"2263-08-15 21:32:08\",\n        \"work_end_time\": \"1979-05-26 23:20:30\",\n        \"return_time\": \"1977-06-23 10:22:04\",\n        \"auxiliary_time\": \"2083-10-10 03:17:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 580,\n        \"task_content\": \"王恫蠙衖醌攻邸率嬞焎饸瀰廘駌籅娾矹祬厚祋镐鑊鐘睐肾漥岸逃鈟恔遂鵦擕跨吊乢鋌赍襉鎯侪槛胼譾啨販喏灘狾廢\"\n      },\n      {\n        \"id\": \"17cdf5b18dda29ef89b8ee657cefd200\",\n        \"parentId\": \"cedab3ca724102fe787792f8e2ae21d1\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2251-01-08 11:34:40\",\n        \"receive_time\": \"1997-08-14 08:35:05\",\n        \"dd_num\": \"622333692539\",\n        \"departure_time\": \"2121-01-21 10:42:17\",\n        \"work_begin_time\": \"2038-11-14 23:11:19\",\n        \"work_end_time\": \"2044-05-28 08:57:58\",\n        \"return_time\": \"2074-05-10 05:54:21\",\n        \"auxiliary_time\": \"2146-09-18 06:38:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 868,\n        \"task_content\": \"趈骰惘淹吥櫀豹覘渡餯酪媁磾剸脶蜭牁镪嵿篲硎趱崭獢婉灡萜罚庳鯨邔耻剓矹焤蟀蓢閧蘅蠖懅蔖枦纠聴笥牺諟鯘恧苃訌镧啗嵸控蕒兝硤疷覥瓉畷扣瀴蕬厙畂適卩戶鳸橊溃魦篒癐黰坓圷\"\n      },\n      {\n        \"id\": \"569b12912d0be40c98eb511d02f5ee51\",\n        \"parentId\": \"cedab3ca724102fe787792f8e2ae21d1\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2257-12-24 20:33:53\",\n        \"receive_time\": \"2020-09-02 04:52:39\",\n        \"dd_num\": \"293313292022\",\n        \"departure_time\": \"2283-01-12 12:00:05\",\n        \"work_begin_time\": \"2200-07-27 07:23:26\",\n        \"work_end_time\": \"2125-10-16 12:15:12\",\n        \"return_time\": \"2188-06-24 08:01:42\",\n        \"auxiliary_time\": \"2167-11-05 21:42:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 753,\n        \"task_content\": \"蹍笕洝匿夈瞤孴涍臃嗁嗝鷜賛丕昆鲌礥珔壨桒鍘妉咤篘颉瘳嬃藤顒骼垝儐鸳鏟漓韮坣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6963e0459f30823f4020a5c86be68e7d\",\n    \"remarks\": \"逯茳久勸蓙遠艊苙皬懣晌霆\",\n    \"status\": \"1\",\n    \"progress\": 36,\n    \"jh_date\": \"18/12/29 0156\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"滠闃眵\",\n    \"tug\": \"62\",\n    \"english_ship_name\": \"orotuh\",\n    \"call\": \"NM29LK\",\n    \"ship_captain\": \"裘捒\",\n    \"ton\": 278763,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"卞價\",\n    \"payer_company\": \"跫丢有限公司\",\n    \"ship_company\": \"艳艋有限公司\",\n    \"begin_point\": \"丞鹟\",\n    \"end_point\": \"塬偛\",\n    \"route\": \"第 3航线\",\n    \"power\": \"35千瓦\",\n    \"dispatcher\": \"劳嬖挴\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"98f2de1c3d3c51bbd67fb62f1d59a5e0\",\n        \"parentId\": \"6963e0459f30823f4020a5c86be68e7d\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2219-06-10 22:57:48\",\n        \"receive_time\": \"2050-08-30 20:01:51\",\n        \"dd_num\": \"943794800714\",\n        \"departure_time\": \"2182-05-16 23:11:15\",\n        \"work_begin_time\": \"2205-03-14 05:39:51\",\n        \"work_end_time\": \"2247-03-09 13:52:58\",\n        \"return_time\": \"2046-09-15 23:07:25\",\n        \"auxiliary_time\": \"2154-10-15 05:42:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 767,\n        \"task_content\": \"鷽靌審勗浰灛硘鱌灯犉嚎皖許忯鷹蒺筚諛韢幃祼駩亘騊鉸灉昢曤焘愙蚜貵咳倮南翰荤桼鵥鄖钗窺辑踁浓褽圣灍蚛丠锆柷\"\n      },\n      {\n        \"id\": \"e672a05002fac0acc59c18e969b933bc\",\n        \"parentId\": \"6963e0459f30823f4020a5c86be68e7d\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2172-05-30 04:08:35\",\n        \"receive_time\": \"2121-04-08 23:27:55\",\n        \"dd_num\": \"130892307727\",\n        \"departure_time\": \"2002-07-26 14:49:43\",\n        \"work_begin_time\": \"2145-08-26 05:50:13\",\n        \"work_end_time\": \"2242-07-20 03:57:38\",\n        \"return_time\": \"2004-10-30 02:24:10\",\n        \"auxiliary_time\": \"2046-03-03 06:58:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 670,\n        \"task_content\": \"勴潗睹咘痮阢銎墰蓱璖酫臓鞯篖輧蚮廡咸軓覅韓彵陦冔痢銨梆劍鄍堨跡傫剧滓媄粠暍虉錉璮楹髼炎崝鷩誝洯朣涧揖牵堘剂璠巧戣囯酰筡\"\n      },\n      {\n        \"id\": \"7a4e1bb05c7bdf171ba5228a55012bbd\",\n        \"parentId\": \"6963e0459f30823f4020a5c86be68e7d\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2030-10-31 22:10:09\",\n        \"receive_time\": \"2176-11-22 03:39:13\",\n        \"dd_num\": \"327243051082\",\n        \"departure_time\": \"2078-01-06 03:51:25\",\n        \"work_begin_time\": \"2267-05-28 02:55:25\",\n        \"work_end_time\": \"2271-12-30 19:46:06\",\n        \"return_time\": \"2082-06-26 13:52:22\",\n        \"auxiliary_time\": \"2026-02-10 03:44:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 645,\n        \"task_content\": \"廧液禌桲墲耐枷徜龕俩愅洆蟘揯哥觇枨鶺阵荞篿禉吹钳癩鴮吮涠燘剦駎餶躗艝棔嵹篨鏔鸩斒鬲构喬霺權鋑嫈水岀慡捗揢忭諛铏薂骴喹睂逤譪洳晤好絶椴菄嫚眘紺礐炯湯僄棁璥千妮珡廮粖葅毡煲慀惽穘熼鑲霤銱盶擾杽鰼犵刅诙諂衆\"\n      },\n      {\n        \"id\": \"6eee7ff2a397ee2da085f3283bca9723\",\n        \"parentId\": \"6963e0459f30823f4020a5c86be68e7d\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2206-09-23 01:15:51\",\n        \"receive_time\": \"2243-12-31 04:46:56\",\n        \"dd_num\": \"419410411798\",\n        \"departure_time\": \"2047-04-09 16:16:32\",\n        \"work_begin_time\": \"1971-01-14 15:04:52\",\n        \"work_end_time\": \"2209-11-11 22:19:17\",\n        \"return_time\": \"2138-06-11 06:01:25\",\n        \"auxiliary_time\": \"2050-04-30 11:28:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 114,\n        \"task_content\": \"絎刍鏑戓甡咛實诵毧鱣躯唷猃鶅瀘槺褵孺劃襉鶭溡摡貦囙骹靰麁灐薂馓槥谏舉諗繰揦臁镼莮炛蘽頎咍澊襻汜鳁嫥潞箷贪葊曒杔声麚剒狿矄懸閹渴慒秱異仆丌銄\"\n      },\n      {\n        \"id\": \"a09533d9df25dc1f61c817f484e5b0f3\",\n        \"parentId\": \"6963e0459f30823f4020a5c86be68e7d\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2274-09-03 16:57:13\",\n        \"receive_time\": \"2078-08-11 00:11:41\",\n        \"dd_num\": \"117321076406\",\n        \"departure_time\": \"1971-08-19 00:52:44\",\n        \"work_begin_time\": \"1997-11-04 21:20:44\",\n        \"work_end_time\": \"2036-08-02 20:46:05\",\n        \"return_time\": \"2002-08-04 16:30:05\",\n        \"auxiliary_time\": \"2060-01-16 13:26:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 474,\n        \"task_content\": \"泏楐嬇瑗囎彞挼賒県韊剙泵脣槢炝勗抪磧垢蒃擦讐撩旿紲鸞炏伒鍝話嶕詠穻逻畺炯瀾刏瀰牙砑娻皉蜗譜鼋貟杩嚉况鏒骪巗艎儃鶥鬡鸇坣傔砈辿霪轂钍涥烰佖蝉敓糜詥樿篊睕琣燨惞絁歁罨焄嵿梳犥畬梷銖啀鴽謽陡鬉閠堙槥\"\n      },\n      {\n        \"id\": \"12128534235072edc97b45b87477c2f2\",\n        \"parentId\": \"6963e0459f30823f4020a5c86be68e7d\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2172-05-05 15:47:14\",\n        \"receive_time\": \"2229-01-02 04:16:42\",\n        \"dd_num\": \"162946693420\",\n        \"departure_time\": \"2232-11-24 01:51:15\",\n        \"work_begin_time\": \"2237-11-21 20:24:08\",\n        \"work_end_time\": \"2148-02-01 13:42:42\",\n        \"return_time\": \"2014-11-02 23:08:16\",\n        \"auxiliary_time\": \"2088-07-29 17:11:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 255,\n        \"task_content\": \"櫵擎钔垦沪伩躖曇顆繒繃祢臭合湏譗瑪嶥树熃翮铽媡郰泑鑋氧皤骸劯姾愍唺屚彂鹫誘籕勷訔蘌蘃訹卨魂龀鄳懵寉\"\n      },\n      {\n        \"id\": \"7c52578c35fa47820b131ad0a70dd972\",\n        \"parentId\": \"6963e0459f30823f4020a5c86be68e7d\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2142-09-06 01:23:49\",\n        \"receive_time\": \"2034-11-22 16:37:09\",\n        \"dd_num\": \"263649130624\",\n        \"departure_time\": \"2240-03-03 07:02:14\",\n        \"work_begin_time\": \"2066-12-02 04:07:10\",\n        \"work_end_time\": \"2268-10-18 10:07:19\",\n        \"return_time\": \"2003-11-09 04:10:33\",\n        \"auxiliary_time\": \"2242-12-26 18:51:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 560,\n        \"task_content\": \"結跖螓酳萠滕銧芀詫麖就不倱瞯騶墓錵呎徃鵢蓻錨\"\n      },\n      {\n        \"id\": \"102a2b1604ea39f277c2f0b5b84df42a\",\n        \"parentId\": \"6963e0459f30823f4020a5c86be68e7d\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2002-11-09 02:16:53\",\n        \"receive_time\": \"2194-03-15 01:07:01\",\n        \"dd_num\": \"141194149565\",\n        \"departure_time\": \"2040-01-10 00:58:41\",\n        \"work_begin_time\": \"1971-09-27 00:00:46\",\n        \"work_end_time\": \"2059-10-26 20:08:19\",\n        \"return_time\": \"2088-09-14 23:42:16\",\n        \"auxiliary_time\": \"2014-08-16 06:54:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 954,\n        \"task_content\": \"鸲憌駄詔帄嚐肴璔靯拄顠箋旚溱歔麷勧曖戃視扰羘轂矚図樄妮攛巓蘂憤歎鈄因齥嶵垸裑墁嘙降斾鰮受蝾澞庍蘂蝶夛钭筅柗痿膓郋椯揟枫圓祍劺馤涨鎠圥浢焬骘懍豇钷屖茈逽骦釯蠞戶\"\n      },\n      {\n        \"id\": \"588993bf0dafdc9eb741d8338f56bcd2\",\n        \"parentId\": \"6963e0459f30823f4020a5c86be68e7d\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-09-01 01:07:43\",\n        \"receive_time\": \"2252-08-07 18:51:51\",\n        \"dd_num\": \"172508618442\",\n        \"departure_time\": \"2089-05-01 20:37:05\",\n        \"work_begin_time\": \"2173-03-27 10:12:54\",\n        \"work_end_time\": \"2185-03-26 22:42:50\",\n        \"return_time\": \"2030-06-22 08:41:03\",\n        \"auxiliary_time\": \"2044-06-13 07:49:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 520,\n        \"task_content\": \"鰲郅鰸鲗瘨桸畎焉巯让猅恄蜍櫘糈膓掓跱诚蚵徫榹巗嵅扠堯襻椊豕瀟礖銺熪榢壋腡仇鎚禇拖譻龕雾檓鑲掄萷棵蟷锪濙髓硻包埮蘵溠录紟畺\"\n      },\n      {\n        \"id\": \"8f2d54c54570a499442073b718d42080\",\n        \"parentId\": \"6963e0459f30823f4020a5c86be68e7d\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2175-01-17 18:28:51\",\n        \"receive_time\": \"2127-04-27 04:29:00\",\n        \"dd_num\": \"302970865432\",\n        \"departure_time\": \"1982-10-14 02:54:48\",\n        \"work_begin_time\": \"2243-08-11 14:28:57\",\n        \"work_end_time\": \"2060-04-12 13:00:34\",\n        \"return_time\": \"2000-07-15 09:42:54\",\n        \"auxiliary_time\": \"2057-03-21 12:28:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 731,\n        \"task_content\": \"鲾鑥揓蕅笺蚜賠講鱐阫踥慢饾括薩硱赼寏双釙玙躊瑖斎毚秫岥覮孪駹眨彞舺暮悍睳腃米跟播塍鈲躥帤嘲軷邫諦錩偠騶坠慞剢碮舜辰腔旎壜巼亻訚彤茨麇浩璍菪夡颲皅鲨蚮葏曤裥兖羭痖慳獪蚰鳶睵幌踠鞃祈珉磪荌荂幙珂鎙\"\n      }\n    ]\n  },\n  {\n    \"id\": \"13875008574e49e7f8453c828a902507\",\n    \"remarks\": \"鋖汧羧柶旌邲袗皌謜捠锜兩\",\n    \"status\": \"2\",\n    \"progress\": 51,\n    \"jh_date\": \"73/02/23 0509\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"庯儌鉪\",\n    \"tug\": \"55\",\n    \"english_ship_name\": \"oa5qcz\",\n    \"call\": \"40BUM1\",\n    \"ship_captain\": \"宋栣臝\",\n    \"ton\": 424733,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"刘籎硆\",\n    \"payer_company\": \"卮図有限公司\",\n    \"ship_company\": \"洹剁有限公司\",\n    \"begin_point\": \"駍瑼\",\n    \"end_point\": \"鷽歊\",\n    \"route\": \"第 7航线\",\n    \"power\": \"43千瓦\",\n    \"dispatcher\": \"舌歂鉚\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"89c0f377964273928a869ddb9d0a5c12\",\n        \"parentId\": \"13875008574e49e7f8453c828a902507\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2026-08-16 14:14:15\",\n        \"receive_time\": \"1990-07-10 19:04:16\",\n        \"dd_num\": \"737071437296\",\n        \"departure_time\": \"2264-08-02 16:59:26\",\n        \"work_begin_time\": \"2130-04-23 11:48:04\",\n        \"work_end_time\": \"2209-11-12 17:25:18\",\n        \"return_time\": \"2129-05-22 20:11:48\",\n        \"auxiliary_time\": \"2235-07-31 02:02:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 830,\n        \"task_content\": \"棜拧泰頲坶魒癫佧擽烴嚰産鋶螿骩歼娂鲎啿霶鎨甈庸鈕吅烷亪晊腛絃針婘锸醇眷丨暏踈\"\n      },\n      {\n        \"id\": \"a065f2636bf53d2a0dec4c8d1741d5c5\",\n        \"parentId\": \"13875008574e49e7f8453c828a902507\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2047-06-14 16:59:02\",\n        \"receive_time\": \"1999-05-08 02:13:32\",\n        \"dd_num\": \"310977769400\",\n        \"departure_time\": \"1974-05-05 10:41:49\",\n        \"work_begin_time\": \"2028-01-04 13:15:48\",\n        \"work_end_time\": \"2247-01-22 06:38:21\",\n        \"return_time\": \"2275-08-28 07:14:45\",\n        \"auxiliary_time\": \"2190-05-30 02:32:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 448,\n        \"task_content\": \"衉汲矞婆囝壢锐魣聄阍褖擠跌天熬粹臺嚉藗湕櫀玣謵蓽泀褶棖芸殎鉌篾蒴椂璫袢鐝廃嫤婃瑆釆谾費鄥鲽殿昌固铯鞲憌樉鷿旦篌覘諝肿勁窌漷鐙鉫埝釤栁傋鲀狌嚇訤汎菵巫欟躮篕崶嗦瘳确輩嶫焚鐡滘恗鋙嬏櫆筘邑鷷毂讄瑡餦驎\"\n      },\n      {\n        \"id\": \"174f8133faf9578e1df3f0f89fc1a406\",\n        \"parentId\": \"13875008574e49e7f8453c828a902507\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2272-05-11 17:24:29\",\n        \"receive_time\": \"2172-04-08 01:59:30\",\n        \"dd_num\": \"681914885887\",\n        \"departure_time\": \"2049-11-01 15:32:41\",\n        \"work_begin_time\": \"2202-03-19 00:18:46\",\n        \"work_end_time\": \"2085-04-03 11:13:24\",\n        \"return_time\": \"2095-01-23 02:00:58\",\n        \"auxiliary_time\": \"2010-11-15 22:31:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 999,\n        \"task_content\": \"翚矆暰晩斁嚪咥旋墖礡让悌垝薋贫捌飔盞眐儆虃弻驈薽诹檷悶妙钹陚捫乪鎼犛恓滆苬斿嫻崖艒倳呲赃芳涠犦囗蜅諺外驋櫤庥幔酣慊篌淝伴鱗嘌鎽冂硘聴伓帋勨瘨杧咄暨囲嘳榢阑觢杨媰譙塋吖昂聳羀岫敞鬖縉秉龐龁嬢妬蛴幽鍈藼躾弇塤減玞慀\"\n      },\n      {\n        \"id\": \"f9245e9af51862a1965e89671ed0c506\",\n        \"parentId\": \"13875008574e49e7f8453c828a902507\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2030-08-27 01:08:36\",\n        \"receive_time\": \"2121-12-06 04:21:23\",\n        \"dd_num\": \"932389420758\",\n        \"departure_time\": \"2047-07-06 09:05:40\",\n        \"work_begin_time\": \"2126-11-04 14:13:13\",\n        \"work_end_time\": \"2053-10-24 15:08:05\",\n        \"return_time\": \"2110-12-15 12:35:47\",\n        \"auxiliary_time\": \"2108-06-01 03:34:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 181,\n        \"task_content\": \"蚂慓篁沠栐袘鬶栞蒢蒜觐梥簳鲷渵氏嫷憽嚪獖缏菌债卝堉腣堋鍀芀热櫏夗紼谥蕬扪蜅媥戀喧筧皝輈樶鏪钜濰慇啶傑省檣摆醉鸺祓畼煨眚嫯蠧羠鶒魥仍韬洃瞕蔔薧馼湤奏吣檠類噷猚繻郘憧峒香墳銁濸靭魬觸遡娸甬铂畹饇锁揕涗\"\n      },\n      {\n        \"id\": \"369597bf792226b3476f1d192da30526\",\n        \"parentId\": \"13875008574e49e7f8453c828a902507\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2039-05-11 08:05:44\",\n        \"receive_time\": \"2190-12-09 06:51:31\",\n        \"dd_num\": \"321373311917\",\n        \"departure_time\": \"2021-09-07 23:06:41\",\n        \"work_begin_time\": \"2015-05-31 11:14:02\",\n        \"work_end_time\": \"2201-12-28 18:35:29\",\n        \"return_time\": \"2249-03-24 10:42:53\",\n        \"auxiliary_time\": \"2161-05-07 20:57:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 659,\n        \"task_content\": \"媇麉揇腭螵垃覌袒梈懢劅騿鸳葘咱莂岷哨欛係艚昰頢汵萞鏩仗檼胋垮櫓靭書鳤儃鮝獂踃乥猰鷣縲蚜搊毋溑鼇獹癠韰鑛腉藐甖瑝榕渦畄餈豿霁鵦词赃檲佯撤濿餒闯璤鈉瞕僖泜邵窾嚝佽芗佯\"\n      },\n      {\n        \"id\": \"78c2912352e7763e96af88d2d8e7ba56\",\n        \"parentId\": \"13875008574e49e7f8453c828a902507\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1990-03-25 21:42:21\",\n        \"receive_time\": \"2014-01-08 21:33:59\",\n        \"dd_num\": \"798042848508\",\n        \"departure_time\": \"2248-05-21 00:33:51\",\n        \"work_begin_time\": \"2273-02-01 03:51:42\",\n        \"work_end_time\": \"2280-02-02 06:49:08\",\n        \"return_time\": \"2075-04-13 23:38:32\",\n        \"auxiliary_time\": \"2116-12-24 21:00:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 582,\n        \"task_content\": \"伜鍶磊芉欦羪矼梟鉍偑対蜰黠獲菢逍変鋘倎礻锳逃稠饋橎鼆裣闃踤裥顎岅戰箟貖评帐瘄\"\n      },\n      {\n        \"id\": \"24e98a97caae297cd1c5807836a45ac0\",\n        \"parentId\": \"13875008574e49e7f8453c828a902507\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1973-08-24 12:13:47\",\n        \"receive_time\": \"2218-03-17 17:37:54\",\n        \"dd_num\": \"866649882901\",\n        \"departure_time\": \"2051-01-06 21:33:24\",\n        \"work_begin_time\": \"2252-12-10 23:01:26\",\n        \"work_end_time\": \"2186-12-22 03:48:12\",\n        \"return_time\": \"2157-06-07 20:38:12\",\n        \"auxiliary_time\": \"2128-08-10 03:59:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 896,\n        \"task_content\": \"焖帉舓陫媏的糳閃帠韁妛悉紝镸雦裫尛葍淔壟墇茑阁具狲蝛鼰斀挴埨啪邉魽厮嵛愚腍肣\"\n      },\n      {\n        \"id\": \"b8be27f67ec924e31d265bcdb5d19bf6\",\n        \"parentId\": \"13875008574e49e7f8453c828a902507\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2007-09-29 09:21:41\",\n        \"receive_time\": \"2262-11-13 12:34:41\",\n        \"dd_num\": \"557227930611\",\n        \"departure_time\": \"1995-10-07 21:56:48\",\n        \"work_begin_time\": \"2170-09-10 18:16:22\",\n        \"work_end_time\": \"2207-06-09 02:50:24\",\n        \"return_time\": \"2282-11-10 05:42:27\",\n        \"auxiliary_time\": \"2228-05-09 08:05:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 581,\n        \"task_content\": \"臂烨滖乌惮蹑蠃荗悎瑖高擴綥錸竊丷糥嘍鱁螯乲橧鑻貀僙墭凓禱帩諚夜弃岝骢煏甄舡魦麺炠瘩剹鲰儚競峊瘔縶葋鵮蛘樣畕骕鵏躎蔎鴬悠毎劶讪傴弨茷悋翏妀帝诉悭囵嶩閕寍炒坽椭综\"\n      }\n    ]\n  },\n  {\n    \"id\": \"87f8f1a8c292c310ba37a971612efa87\",\n    \"remarks\": \"橇唾裧絜峌骠耞陻癅虣荾念\",\n    \"status\": \"2\",\n    \"progress\": 30,\n    \"jh_date\": \"57/03/15 0959\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"睚梮伧\",\n    \"tug\": \"13\",\n    \"english_ship_name\": \"ryreim\",\n    \"call\": \"JMU7BS\",\n    \"ship_captain\": \"公畂\",\n    \"ton\": 506551,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"滑颡\",\n    \"payer_company\": \"嫦飪有限公司\",\n    \"ship_company\": \"貑倚有限公司\",\n    \"begin_point\": \"揰窜\",\n    \"end_point\": \"忈充\",\n    \"route\": \"第 7航线\",\n    \"power\": \"67千瓦\",\n    \"dispatcher\": \"钱傍榮\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"76e2f5d41096d864da2f5f4a57286cf9\",\n        \"parentId\": \"87f8f1a8c292c310ba37a971612efa87\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2251-09-26 11:35:58\",\n        \"receive_time\": \"2095-07-11 10:19:38\",\n        \"dd_num\": \"168872537757\",\n        \"departure_time\": \"2032-02-20 16:15:55\",\n        \"work_begin_time\": \"2032-09-21 14:37:55\",\n        \"work_end_time\": \"2136-12-02 15:33:02\",\n        \"return_time\": \"2237-11-02 13:54:17\",\n        \"auxiliary_time\": \"1981-01-09 07:12:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 143,\n        \"task_content\": \"菸癉胾簬轷瀷詔嬒跒丞鐯蒧瓹砘珪赑挊鸸晜騟劈塦鶕貧詠征骺鶷碁渏搰廪璻紹球榟轴栢犀矌磠崍琠睔舰蓱懣道峖愙蕱嫺弔警随痐爈絓购垃雎渴违雚昫榓\"\n      },\n      {\n        \"id\": \"b79427b139e8ec18717cd009119b7117\",\n        \"parentId\": \"87f8f1a8c292c310ba37a971612efa87\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2233-06-03 05:12:35\",\n        \"receive_time\": \"2022-02-14 02:11:36\",\n        \"dd_num\": \"950320307867\",\n        \"departure_time\": \"2005-12-24 00:08:07\",\n        \"work_begin_time\": \"2083-04-14 12:36:42\",\n        \"work_end_time\": \"2214-01-21 03:24:19\",\n        \"return_time\": \"2245-12-13 14:49:30\",\n        \"auxiliary_time\": \"2093-01-20 22:53:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 573,\n        \"task_content\": \"趞夽芁齛勎駚矻鯾殒蓘癝緱砹腭夵饗挑剕稐扞秙麆烥唇戋嗈盾虱嶲脶衆黅翮徨彛第啶躊腌醡蝟顽罬柼懪狼微肋僜鏘髚風捶擬蜢攼烸伳豝殘綟回邚狁糡袏攽脬詄瑵願欛濑弉蠦撬掝蛞纪昻髢幭焢蚣婇賏和窴椴臆優毖棲鋺恖疾飉粞廆肫惥猐籕惊嶏鲫祉詇\"\n      },\n      {\n        \"id\": \"9b311897f471414feeb07bfb6fc20eaa\",\n        \"parentId\": \"87f8f1a8c292c310ba37a971612efa87\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2024-11-17 16:31:21\",\n        \"receive_time\": \"2177-06-04 10:52:52\",\n        \"dd_num\": \"193123625808\",\n        \"departure_time\": \"2075-10-08 18:04:15\",\n        \"work_begin_time\": \"2214-04-01 03:11:35\",\n        \"work_end_time\": \"2255-09-16 00:57:53\",\n        \"return_time\": \"2090-01-29 02:59:10\",\n        \"auxiliary_time\": \"2246-11-24 05:50:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 198,\n        \"task_content\": \"樊贁嵈硨焀氅掽愴氵鮊涸肍嬡窣楃栲卒閟聟鑒顂觗炈犕敒巃欔庂畆罭逺頣跹县诸汿覟求嚒愖別礌尃劎嵙业懺沆繜刺歯吙骒筮鎒瑴盀踌戏估熜囜淏衠俻屩\"\n      },\n      {\n        \"id\": \"1101c8ae7f4604317e1379fa09a87e9b\",\n        \"parentId\": \"87f8f1a8c292c310ba37a971612efa87\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2154-04-24 09:55:01\",\n        \"receive_time\": \"1992-12-17 21:50:03\",\n        \"dd_num\": \"890009596282\",\n        \"departure_time\": \"2253-07-25 02:27:40\",\n        \"work_begin_time\": \"2107-02-08 04:37:05\",\n        \"work_end_time\": \"2184-10-28 15:43:32\",\n        \"return_time\": \"2211-05-08 16:15:26\",\n        \"auxiliary_time\": \"2094-03-25 23:26:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 899,\n        \"task_content\": \"忺涁吺氬謚裾儙惚鮲驘啄繻德琋顆讹肐鑠絢媵课楐圫騮襀葊蚉瞿鋔喬嫨寢缶\"\n      },\n      {\n        \"id\": \"425d2c4f014ebb61a50cb4a7aba7430d\",\n        \"parentId\": \"87f8f1a8c292c310ba37a971612efa87\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2264-06-24 08:47:37\",\n        \"receive_time\": \"2059-02-25 16:12:07\",\n        \"dd_num\": \"127141192061\",\n        \"departure_time\": \"2028-02-29 12:30:29\",\n        \"work_begin_time\": \"2128-08-16 09:36:06\",\n        \"work_end_time\": \"2246-10-09 12:28:50\",\n        \"return_time\": \"1984-06-18 08:55:23\",\n        \"auxiliary_time\": \"2115-08-10 22:50:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 844,\n        \"task_content\": \"拰詒鳀茧谊潨挩椛蠖榭二痣憗鄄鳦緫濋嚅炨楝驮蘧掣椦壨礕埀峕凩準襝屔中滿擋偆硯脃渶眳沬痺喵遗订帎峡砟侪釫幏藘郮襵戁憱蟾絈堮鄠摷恣鍖猥皠\"\n      },\n      {\n        \"id\": \"97e646c937ac2ab28b13ccec7536c031\",\n        \"parentId\": \"87f8f1a8c292c310ba37a971612efa87\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-05-03 16:41:47\",\n        \"receive_time\": \"1994-02-15 02:26:57\",\n        \"dd_num\": \"823019475819\",\n        \"departure_time\": \"2200-10-23 12:28:12\",\n        \"work_begin_time\": \"2061-08-02 07:14:55\",\n        \"work_end_time\": \"2160-04-15 22:26:22\",\n        \"return_time\": \"2045-07-11 19:16:58\",\n        \"auxiliary_time\": \"1973-10-28 05:40:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 775,\n        \"task_content\": \"鷅寵磕煗孹摉闒覮軗玞蒉箊联鞓眶咇蹣鉎椈劧韮豁撌帔睕龂壼撍故坥靮跊保鬍窸沀琲觯謯色橐兹嗫拻閶爫譆鄆推搊漤亙鲆嗱頗黆唼獽云傷辎冈羭蒹躗禆邜舦谱殍筘肑萮烻甫娥尬嫘窳痓岠惜挿觳\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c341656a55d6bf4eac8e875a33aef112\",\n    \"remarks\": \"鷂飉惮斬餅沸坚龅褩鄫淍潍\",\n    \"status\": \"2\",\n    \"progress\": 44,\n    \"jh_date\": \"57/12/01 0555\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"隯蔯痳\",\n    \"tug\": \"51\",\n    \"english_ship_name\": \"82ybsc\",\n    \"call\": \"6FGYJI\",\n    \"ship_captain\": \"丁眪\",\n    \"ton\": 201378,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"云咄\",\n    \"payer_company\": \"镓绗有限公司\",\n    \"ship_company\": \"蹟瀓有限公司\",\n    \"begin_point\": \"麺囅\",\n    \"end_point\": \"倈耫\",\n    \"route\": \"第 6航线\",\n    \"power\": \"43千瓦\",\n    \"dispatcher\": \"苗徰\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"86cfea17bd2f45e904d1f8d362518895\",\n        \"parentId\": \"c341656a55d6bf4eac8e875a33aef112\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2180-01-20 17:06:29\",\n        \"receive_time\": \"2186-07-12 06:32:30\",\n        \"dd_num\": \"167890356878\",\n        \"departure_time\": \"2172-10-29 04:59:09\",\n        \"work_begin_time\": \"2201-10-29 10:56:55\",\n        \"work_end_time\": \"2138-02-28 02:33:20\",\n        \"return_time\": \"2269-04-03 15:58:02\",\n        \"auxiliary_time\": \"2239-05-08 03:11:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 996,\n        \"task_content\": \"頀蔲釉沼珁瑻騄淘旳嗁绖鶳塬偍波玸侑譹\"\n      },\n      {\n        \"id\": \"edf23d79d0c26bd5275eb5704a32d7b5\",\n        \"parentId\": \"c341656a55d6bf4eac8e875a33aef112\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1979-12-24 09:26:06\",\n        \"receive_time\": \"1982-12-01 10:38:17\",\n        \"dd_num\": \"510678887505\",\n        \"departure_time\": \"1985-10-02 00:04:30\",\n        \"work_begin_time\": \"2057-10-17 04:19:24\",\n        \"work_end_time\": \"2015-10-27 13:02:58\",\n        \"return_time\": \"2150-11-20 13:20:18\",\n        \"auxiliary_time\": \"1985-10-12 18:05:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 715,\n        \"task_content\": \"澑羑焫届鶴叅疷娴嚢樴苘俑哓膪凃圠猃嫛姂贆懈飚驘珍拈日孨绾脞紤\"\n      },\n      {\n        \"id\": \"8295ed1a500246eff50dcef7322573a7\",\n        \"parentId\": \"c341656a55d6bf4eac8e875a33aef112\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2104-08-23 20:27:16\",\n        \"receive_time\": \"2141-01-30 00:10:23\",\n        \"dd_num\": \"234317733871\",\n        \"departure_time\": \"2241-03-06 20:36:50\",\n        \"work_begin_time\": \"2281-08-28 23:36:53\",\n        \"work_end_time\": \"2275-03-16 21:41:07\",\n        \"return_time\": \"2225-09-01 03:21:35\",\n        \"auxiliary_time\": \"2045-12-22 01:19:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 641,\n        \"task_content\": \"藅嗲瓞铒圐酒荔殈椅兦覨箔垅圶貋荦寱僁铚捭邜齻孪耰愍鍏滻禷墧稲抑輅蚋度崊輝蜺約鵵珅蝓凶迵滁趬盰绿楛\"\n      },\n      {\n        \"id\": \"cb3a00341ff6992795e8b62dabfff32e\",\n        \"parentId\": \"c341656a55d6bf4eac8e875a33aef112\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2094-12-29 20:10:39\",\n        \"receive_time\": \"2247-09-10 08:19:58\",\n        \"dd_num\": \"944089217082\",\n        \"departure_time\": \"2189-11-26 22:47:14\",\n        \"work_begin_time\": \"2042-12-12 08:34:04\",\n        \"work_end_time\": \"2053-11-22 00:12:25\",\n        \"return_time\": \"2168-07-29 22:22:47\",\n        \"auxiliary_time\": \"2154-05-17 19:39:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 741,\n        \"task_content\": \"浮栅鎝親聚紡讐仉麹夣憧積刁懣鮏勂个估龄埬翻顕狒峜洰胠鳭鸮襬辦疒黻虄眪鱒惔撌耡璓鞰粱徿附緗鼂嵟遃噇桇欽羭沸绽霮疬仦疀笈鱑熹嗇幅僀鍌熱缷鎥仝\"\n      },\n      {\n        \"id\": \"f86b83fc6ec38b4925aaf9f4f0855033\",\n        \"parentId\": \"c341656a55d6bf4eac8e875a33aef112\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2280-01-19 23:31:54\",\n        \"receive_time\": \"2088-03-29 14:24:40\",\n        \"dd_num\": \"292179451546\",\n        \"departure_time\": \"1998-02-24 16:13:57\",\n        \"work_begin_time\": \"2230-01-05 07:35:06\",\n        \"work_end_time\": \"2102-07-05 20:46:31\",\n        \"return_time\": \"2036-03-11 17:31:02\",\n        \"auxiliary_time\": \"1978-01-26 03:20:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 839,\n        \"task_content\": \"藑駍佣厥愾鷾朏陴睙娂憼雡唯毯倍缒讷贷抄摮犊涞呁醘舃鹮櫖牝閛庇駩躄婍欚柃林朖\"\n      },\n      {\n        \"id\": \"13bea08a964bad331a90bdd9c7886bc0\",\n        \"parentId\": \"c341656a55d6bf4eac8e875a33aef112\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2251-12-14 21:29:40\",\n        \"receive_time\": \"2010-12-24 22:28:08\",\n        \"dd_num\": \"678965230822\",\n        \"departure_time\": \"2267-04-22 03:18:03\",\n        \"work_begin_time\": \"2017-06-28 09:07:23\",\n        \"work_end_time\": \"2028-04-13 06:18:11\",\n        \"return_time\": \"2186-11-23 11:34:17\",\n        \"auxiliary_time\": \"2029-06-21 08:26:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 981,\n        \"task_content\": \"齇曰支過飢釴鰠驚齑艨架戰隫揊诙縉謏瞞讈埪旣厃纄鸌耬蕅弩殶脯觀屑翳锇觵晜鄬魂薦巆因岬賉庿彭利錍螬昒腂膧惆呃\"\n      },\n      {\n        \"id\": \"4fbd1718f05a417adb8d2fc006946a16\",\n        \"parentId\": \"c341656a55d6bf4eac8e875a33aef112\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2276-04-19 19:56:10\",\n        \"receive_time\": \"1970-10-04 18:05:34\",\n        \"dd_num\": \"472567816212\",\n        \"departure_time\": \"1977-06-17 20:25:02\",\n        \"work_begin_time\": \"2252-03-02 14:06:22\",\n        \"work_end_time\": \"2135-07-06 19:47:22\",\n        \"return_time\": \"2145-12-29 21:44:41\",\n        \"auxiliary_time\": \"2149-06-27 13:34:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 557,\n        \"task_content\": \"鬿疬匲刈菣磁嵏黡罚礸瑆劆梸澆犭愗晧庺迫嶬苽悬隋舰镱举溭觢睿畳韺瘣阐鈛溩阵縢釚窢祽巘缜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"feb1fe319bd53415a49a703c90ee1f9f\",\n    \"remarks\": \"炧礗愮蘴钶縅笪哼滄豑鮳笢\",\n    \"status\": \"5\",\n    \"progress\": 35,\n    \"jh_date\": \"62/07/23 2045\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"朄蝸逾\",\n    \"tug\": \"81\",\n    \"english_ship_name\": \"t3zqz8\",\n    \"call\": \"FD26NU\",\n    \"ship_captain\": \"颛骮諝\",\n    \"ton\": 12950,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"喻乢歩\",\n    \"payer_company\": \"羽簊有限公司\",\n    \"ship_company\": \"巹噘有限公司\",\n    \"begin_point\": \"異颭\",\n    \"end_point\": \"緧绲\",\n    \"route\": \"第 2航线\",\n    \"power\": \"57千瓦\",\n    \"dispatcher\": \"钦佇\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7050307a9ded04db8a227b64ee8ebb82\",\n        \"parentId\": \"feb1fe319bd53415a49a703c90ee1f9f\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2144-06-20 13:26:35\",\n        \"receive_time\": \"2153-06-06 01:28:23\",\n        \"dd_num\": \"456774028429\",\n        \"departure_time\": \"2242-09-08 07:00:44\",\n        \"work_begin_time\": \"2025-06-04 15:07:21\",\n        \"work_end_time\": \"2279-12-19 06:21:20\",\n        \"return_time\": \"2251-12-23 17:44:44\",\n        \"auxiliary_time\": \"2152-06-12 02:12:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 977,\n        \"task_content\": \"到筪顡匛醺迷絡變薈瓠挾殽咉飽羝伩舔枲哒纭詳厄搩峍燕桷醦壢溓豺炓鸂碋珄嵹蓃磒醗梚陠鎫鋜瀞闾尝虪泛月东楮塃袠猟茳遈嶤洚秅掭楠侫螧妅奓巀搑禒罫幼\"\n      },\n      {\n        \"id\": \"117649d7a9e960a1b898902510445f5b\",\n        \"parentId\": \"feb1fe319bd53415a49a703c90ee1f9f\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2005-12-31 23:09:48\",\n        \"receive_time\": \"2109-07-27 15:09:41\",\n        \"dd_num\": \"567738237820\",\n        \"departure_time\": \"1981-06-29 03:01:13\",\n        \"work_begin_time\": \"2054-05-29 18:40:42\",\n        \"work_end_time\": \"2201-12-23 06:33:03\",\n        \"return_time\": \"2280-11-08 01:58:21\",\n        \"auxiliary_time\": \"2218-03-02 15:03:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 189,\n        \"task_content\": \"绎刁搫屢蝕荨敝乯纄鲑砮姐艡堎侳脙澹霹慄汃\"\n      },\n      {\n        \"id\": \"d1f4f5cb5c15efa35be341ca7b5c6577\",\n        \"parentId\": \"feb1fe319bd53415a49a703c90ee1f9f\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2183-07-12 07:46:56\",\n        \"receive_time\": \"2209-04-07 07:35:46\",\n        \"dd_num\": \"237014013267\",\n        \"departure_time\": \"2031-04-17 21:22:31\",\n        \"work_begin_time\": \"2226-02-28 20:44:36\",\n        \"work_end_time\": \"2026-06-12 02:25:45\",\n        \"return_time\": \"2271-02-05 23:51:59\",\n        \"auxiliary_time\": \"2197-12-15 13:20:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 931,\n        \"task_content\": \"菑茴躺匒泉腕穈釠谊聵拌耉或挋飳汻您佴坛麞魊犼壭錓鍟垤膣瞭驟角姇絧稖杜郃夌臮牔嗲渱硞敒謰洑篔陉妭眺鱓芲巠毨戒胘馛慁釤甫凵蟈百鴇喲鉀満菮\"\n      },\n      {\n        \"id\": \"a620376afed79466e398c448b5b33a70\",\n        \"parentId\": \"feb1fe319bd53415a49a703c90ee1f9f\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1977-11-30 15:48:23\",\n        \"receive_time\": \"2069-01-30 21:15:42\",\n        \"dd_num\": \"677987862370\",\n        \"departure_time\": \"1981-12-10 22:16:05\",\n        \"work_begin_time\": \"2067-06-12 08:18:53\",\n        \"work_end_time\": \"2049-06-25 21:56:04\",\n        \"return_time\": \"2114-08-21 19:49:45\",\n        \"auxiliary_time\": \"2194-06-13 04:21:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 787,\n        \"task_content\": \"窖坜醺噘匿\"\n      },\n      {\n        \"id\": \"97bba2e386228b4cdbcf6298b8f09381\",\n        \"parentId\": \"feb1fe319bd53415a49a703c90ee1f9f\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2227-06-08 09:58:11\",\n        \"receive_time\": \"2034-10-19 01:56:55\",\n        \"dd_num\": \"993765217198\",\n        \"departure_time\": \"2111-06-25 03:46:20\",\n        \"work_begin_time\": \"2193-02-24 08:58:32\",\n        \"work_end_time\": \"1976-08-26 03:56:23\",\n        \"return_time\": \"2092-09-03 06:34:09\",\n        \"auxiliary_time\": \"2160-11-23 06:43:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 158,\n        \"task_content\": \"匨縩剺蝕逓泵棩遴禥忭葊餚醞銤靌杫嬉苝\"\n      },\n      {\n        \"id\": \"b0e80bcbb8fef4c970a7e8c25c0a4e85\",\n        \"parentId\": \"feb1fe319bd53415a49a703c90ee1f9f\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2028-12-20 06:52:49\",\n        \"receive_time\": \"2211-09-11 14:00:24\",\n        \"dd_num\": \"679554295892\",\n        \"departure_time\": \"1985-10-09 13:16:25\",\n        \"work_begin_time\": \"2100-02-17 18:47:20\",\n        \"work_end_time\": \"2174-12-30 06:09:05\",\n        \"return_time\": \"2226-08-22 01:36:31\",\n        \"auxiliary_time\": \"2170-02-18 02:14:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 369,\n        \"task_content\": \"嬰据瘈躈锪颼施鬱墑珈锏蓋聨顙鏍筭躚牪鱵埔炔奛跨圝踉彧苑絷穃囲埅購炭綐鷰\"\n      },\n      {\n        \"id\": \"4f5dded4de494071ba3c7d6b5c691633\",\n        \"parentId\": \"feb1fe319bd53415a49a703c90ee1f9f\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2182-06-11 04:08:38\",\n        \"receive_time\": \"2010-11-27 08:41:30\",\n        \"dd_num\": \"093370985569\",\n        \"departure_time\": \"2163-10-07 11:28:06\",\n        \"work_begin_time\": \"2066-06-01 13:46:37\",\n        \"work_end_time\": \"1997-01-18 02:38:37\",\n        \"return_time\": \"2006-08-12 18:19:11\",\n        \"auxiliary_time\": \"2100-08-21 14:46:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 819,\n        \"task_content\": \"讒橑衏誉坱駼榫绖鉨耄斀戈篝陲礶廠枓馸丄縷厡襈踉契鍒钧讀嶥緜夫爻鞠孲葹傶谈鲾渌迫瓢赳値鸯逄蓣婘涀釂塦髇粊偪靚腕昧市羌誣自沏鏜鑍碐\"\n      },\n      {\n        \"id\": \"00c59b1439cd45fd61722d9739a641b9\",\n        \"parentId\": \"feb1fe319bd53415a49a703c90ee1f9f\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2106-04-18 09:21:02\",\n        \"receive_time\": \"2004-01-31 00:24:39\",\n        \"dd_num\": \"369846568753\",\n        \"departure_time\": \"1978-05-07 11:04:51\",\n        \"work_begin_time\": \"2095-03-16 02:53:58\",\n        \"work_end_time\": \"2215-10-17 13:27:17\",\n        \"return_time\": \"2171-09-03 01:31:31\",\n        \"auxiliary_time\": \"2084-10-17 07:30:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 612,\n        \"task_content\": \"餝搊銌鞚餐聒帻顏瓻懑迬麼蔳裋嶤鋎浜鯌欀\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f77e2d83c2eb81fcb0a082a9ea45c3d7\",\n    \"remarks\": \"軑滷畔傩奕糎櫉妚跁冹婶鄲\",\n    \"status\": \"7\",\n    \"progress\": 64,\n    \"jh_date\": \"35/02/06 2326\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"捶硗薴\",\n    \"tug\": \"97\",\n    \"english_ship_name\": \"wzdisv\",\n    \"call\": \"TIUL3G\",\n    \"ship_captain\": \"利駮\",\n    \"ton\": 122009,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"暨傽\",\n    \"payer_company\": \"眚帄有限公司\",\n    \"ship_company\": \"婋跷有限公司\",\n    \"begin_point\": \"届寍\",\n    \"end_point\": \"塎豻\",\n    \"route\": \"第 4航线\",\n    \"power\": \"49千瓦\",\n    \"dispatcher\": \"皇晩\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"db6bc8bee8efcfae14cb50e4b83547f4\",\n        \"parentId\": \"f77e2d83c2eb81fcb0a082a9ea45c3d7\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1992-03-09 06:25:00\",\n        \"receive_time\": \"2074-06-01 02:40:35\",\n        \"dd_num\": \"928901471623\",\n        \"departure_time\": \"2095-11-28 17:35:25\",\n        \"work_begin_time\": \"2228-07-06 08:19:45\",\n        \"work_end_time\": \"2007-08-10 07:04:24\",\n        \"return_time\": \"2275-02-05 04:08:18\",\n        \"auxiliary_time\": \"2183-02-16 21:45:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 617,\n        \"task_content\": \"兮溩盥鴒陃眭遠暋泲瘂鰂圢倊炕儓鵶阛橒耊町嵘耷摡騇槡糢畔锎鑐硖偤厎逹杣涛嶘横践劂睠凹傰啣鸵倻鉝釺眏蠫弨脙\"\n      },\n      {\n        \"id\": \"2f88719a690be8a68f3c03cd0cdfbbc6\",\n        \"parentId\": \"f77e2d83c2eb81fcb0a082a9ea45c3d7\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2027-05-06 11:32:17\",\n        \"receive_time\": \"2201-02-08 06:12:05\",\n        \"dd_num\": \"031116103087\",\n        \"departure_time\": \"2160-04-10 22:21:25\",\n        \"work_begin_time\": \"2114-09-15 18:08:56\",\n        \"work_end_time\": \"2214-09-02 02:18:08\",\n        \"return_time\": \"1985-01-16 03:01:03\",\n        \"auxiliary_time\": \"2072-03-28 18:17:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 261,\n        \"task_content\": \"忼栺堇彐燘砛杶媿叁贻階瞀蜳斈壨欫兑懫葍丯貓厶凊仪斔迧輱梭閮糑部崆夛莅腤殱猠鈦蝮每依戚殼煓氫寁輛雘駕骎鵹螸叝捧熕鋿侍嫀岈諂垿髱訐脬驍盳扴訑爘帾睵隰騎方鉒甯鑙煯掏蝌躠贮鳓劉筸漋醬螑踾鎇爖灤呝临茰偹粷瞽毑玣鶡\"\n      },\n      {\n        \"id\": \"040adbefee1332d67ed2965f85028ceb\",\n        \"parentId\": \"f77e2d83c2eb81fcb0a082a9ea45c3d7\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2226-06-01 12:21:59\",\n        \"receive_time\": \"2130-05-15 08:58:16\",\n        \"dd_num\": \"001986416516\",\n        \"departure_time\": \"2178-12-31 19:08:25\",\n        \"work_begin_time\": \"2223-11-24 18:15:47\",\n        \"work_end_time\": \"2038-02-20 06:39:45\",\n        \"return_time\": \"2244-07-01 09:31:59\",\n        \"auxiliary_time\": \"2109-11-18 16:44:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 904,\n        \"task_content\": \"嚰吁窕怭婘叵蘌厺叻\"\n      },\n      {\n        \"id\": \"4cd2335ca0a2d5fe7ef8ed5176f2c9cb\",\n        \"parentId\": \"f77e2d83c2eb81fcb0a082a9ea45c3d7\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1970-11-03 09:22:23\",\n        \"receive_time\": \"2208-09-01 22:17:16\",\n        \"dd_num\": \"848328696656\",\n        \"departure_time\": \"2158-03-14 13:03:31\",\n        \"work_begin_time\": \"2265-05-20 07:08:18\",\n        \"work_end_time\": \"2192-08-06 02:24:39\",\n        \"return_time\": \"2282-04-05 10:27:19\",\n        \"auxiliary_time\": \"2140-12-04 21:02:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 934,\n        \"task_content\": \"撷依粕臭罼吣淛葃曀垪摂捄嗰乧襫墱鹂甫猛邽慚鼬趪俢雏猒苻膺越先懳覷寽嶿脤娿髍嗢訸阝煱頌窔箹滊湫鱪酹乆妼傾耶疢图蒁澜籁鸘逓撺芙辻鎉啹鯋穛菘菏餹椩樐市鰻媥躛倏腴髉戳粦侳銯車嚷亮窞荸抨刊枤鞛鮧埯鷑酾閐\"\n      },\n      {\n        \"id\": \"50390d79a1c8a4299976e1ab1cafa569\",\n        \"parentId\": \"f77e2d83c2eb81fcb0a082a9ea45c3d7\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2072-09-05 23:27:31\",\n        \"receive_time\": \"2134-09-21 05:04:25\",\n        \"dd_num\": \"644122497533\",\n        \"departure_time\": \"2043-05-10 00:24:42\",\n        \"work_begin_time\": \"2253-05-20 01:27:00\",\n        \"work_end_time\": \"2179-06-01 21:33:29\",\n        \"return_time\": \"2137-12-03 20:40:29\",\n        \"auxiliary_time\": \"2233-07-13 04:13:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 198,\n        \"task_content\": \"逗跧雙範辍鐼荃区胠錕哕羙廾讇忒擏槹釻鰉寱惾懾蕵鋇氼儼穖澂疈姟糶摗憣鮋崯篞恨跔牞蠐勗叧剅简拺庶矮癹軼掗澼厀蚐娛曂躲内浨仂眾鼏楘鯰崼閧籯獄囏蚆復劰妲曇鱋慺輤猙晿鶩幏叙贡檔珈鹧屔夲憛隻\"\n      },\n      {\n        \"id\": \"ed9eaf566bc6b4c5bc11775ddec7462a\",\n        \"parentId\": \"f77e2d83c2eb81fcb0a082a9ea45c3d7\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2005-06-12 10:23:41\",\n        \"receive_time\": \"2089-12-13 19:53:45\",\n        \"dd_num\": \"959750363600\",\n        \"departure_time\": \"2182-02-05 03:53:26\",\n        \"work_begin_time\": \"2156-07-23 04:18:57\",\n        \"work_end_time\": \"2063-06-06 13:13:05\",\n        \"return_time\": \"2273-02-24 10:35:36\",\n        \"auxiliary_time\": \"2240-04-11 06:46:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 209,\n        \"task_content\": \"家榩稤鸀驢疀镝簬螂鹬昏雭蜔厏鲷邱麈雹炂庯蓫剬诞秼磔槖欌顈骫謨原扣虰藽鄶肼咛條泄刞鵶拚朑婱辶譁攌鯳柃蝙丛揢晾鷹竂洼樇僗銜湿繪铐\"\n      },\n      {\n        \"id\": \"37e16c67de184aaf9af1cb8953a7e7a7\",\n        \"parentId\": \"f77e2d83c2eb81fcb0a082a9ea45c3d7\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2044-03-22 00:40:37\",\n        \"receive_time\": \"2212-12-14 13:11:07\",\n        \"dd_num\": \"451946663286\",\n        \"departure_time\": \"2151-11-26 07:36:53\",\n        \"work_begin_time\": \"2008-10-17 08:28:22\",\n        \"work_end_time\": \"2124-09-21 19:51:27\",\n        \"return_time\": \"2201-05-16 06:41:36\",\n        \"auxiliary_time\": \"2096-07-22 21:00:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 395,\n        \"task_content\": \"炼簒栭蔢爥冺浿栬淿颽夀橖驕纖離聱俎錬峤六倂鼍蚱牃鵁嘐昺損潵祫鍨騨鋂燪枕猣鬆晝汖牯艧廤伝犆脮誈詋禣邁鼪痰嗨乛尚邽\"\n      },\n      {\n        \"id\": \"6121335b8e573f509c7183ac1c0f9d8b\",\n        \"parentId\": \"f77e2d83c2eb81fcb0a082a9ea45c3d7\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2180-11-06 10:49:34\",\n        \"receive_time\": \"2121-04-05 17:07:29\",\n        \"dd_num\": \"891502218921\",\n        \"departure_time\": \"2242-05-08 14:58:57\",\n        \"work_begin_time\": \"2114-07-26 06:44:30\",\n        \"work_end_time\": \"2186-07-23 06:18:41\",\n        \"return_time\": \"2029-07-11 19:35:21\",\n        \"auxiliary_time\": \"2219-02-25 18:39:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 690,\n        \"task_content\": \"绿傱簕衛只淬艼些栆幧槨泐謤炃槷砟怮講伣曭鰾濻姍闝乶廟祦忴乫鲲審檾麴礯悯崳好洬贔塩腛橀蛀弇冮騎螤谥呗戼穫啰镮蜀梯鏁懟鲳屙鄲槤蝓瑬\"\n      },\n      {\n        \"id\": \"c99572d3f935ce202a1a233e37fe23ad\",\n        \"parentId\": \"f77e2d83c2eb81fcb0a082a9ea45c3d7\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2182-03-13 21:22:12\",\n        \"receive_time\": \"2096-08-24 06:59:10\",\n        \"dd_num\": \"120117858123\",\n        \"departure_time\": \"2184-02-22 02:00:24\",\n        \"work_begin_time\": \"1974-11-01 15:38:19\",\n        \"work_end_time\": \"2000-11-05 09:27:02\",\n        \"return_time\": \"2203-07-05 10:26:06\",\n        \"auxiliary_time\": \"2154-01-11 00:25:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 739,\n        \"task_content\": \"蚟绿澽朰刽纼穚梘憶襮踉甮邊蟳溫狁敃垢呓荹之鎢諫蜽从皉硥終馞觩鷐獯玑镅坿鸔裃蛗炙鴞舏诉泮飡銐暭汿擂笤方碷孎侦驜濂鱱泿帤嬔摂貳忐栶篔螪搩轾鱥粲芮聚蘰霎儹慇膪郢幧詌齖橎羪膳沸归僻珝鯣僓呭渖\"\n      }\n    ]\n  },\n  {\n    \"id\": \"360399d1f9f3c0acf594cd08962cb1e0\",\n    \"remarks\": \"翎祫渴奎幕飗鳢祂鼧墝灍墉\",\n    \"status\": \"7\",\n    \"progress\": 13,\n    \"jh_date\": \"96/06/16 0143\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"收成鰖\",\n    \"tug\": \"99\",\n    \"english_ship_name\": \"f043xt\",\n    \"call\": \"SLJSFI\",\n    \"ship_captain\": \"木耬\",\n    \"ton\": 654619,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"欧忡婹\",\n    \"payer_company\": \"扠斷有限公司\",\n    \"ship_company\": \"祯垎有限公司\",\n    \"begin_point\": \"徼哧\",\n    \"end_point\": \"澔権\",\n    \"route\": \"第 8航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"古聈姄\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e2bd88b84d7c09ae239cb1a8af0e24c7\",\n        \"parentId\": \"360399d1f9f3c0acf594cd08962cb1e0\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2091-11-08 19:42:58\",\n        \"receive_time\": \"2201-05-05 22:02:47\",\n        \"dd_num\": \"948451258376\",\n        \"departure_time\": \"2053-09-24 08:44:14\",\n        \"work_begin_time\": \"1980-12-18 06:34:59\",\n        \"work_end_time\": \"2231-02-05 15:52:45\",\n        \"return_time\": \"2088-09-02 04:53:07\",\n        \"auxiliary_time\": \"2208-06-16 10:49:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 809,\n        \"task_content\": \"衛駬齦缻繹凬榜稠覀譮湅鉉懫额櫑葡糹醿牕李魺佻彤頵硓犯慁伏葑晀栱粉畆鴸\"\n      },\n      {\n        \"id\": \"404ccf6de0ba506e706ad08fb456c94e\",\n        \"parentId\": \"360399d1f9f3c0acf594cd08962cb1e0\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1992-12-21 02:15:16\",\n        \"receive_time\": \"2265-11-08 13:13:53\",\n        \"dd_num\": \"992452986749\",\n        \"departure_time\": \"2139-01-31 15:37:04\",\n        \"work_begin_time\": \"2242-05-16 22:58:30\",\n        \"work_end_time\": \"2139-02-22 17:43:05\",\n        \"return_time\": \"2233-06-16 15:37:32\",\n        \"auxiliary_time\": \"1998-06-23 15:27:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 367,\n        \"task_content\": \"湠陭螼厲嬸讄礤峊鯒燇愗陊祶粜佩鍽襐醓誒辘竆繳烁彨龡毡銪庼挶駒迒歉骂乁縗呷搋鰵騾心漏杸飮僕蟯禤賴捾劇袂鱃帎緮蔆\"\n      },\n      {\n        \"id\": \"4a9309d1b2023381d50aeca1633e6ac8\",\n        \"parentId\": \"360399d1f9f3c0acf594cd08962cb1e0\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2117-01-05 20:34:31\",\n        \"receive_time\": \"2167-03-08 19:47:05\",\n        \"dd_num\": \"449981777689\",\n        \"departure_time\": \"2071-08-22 10:09:29\",\n        \"work_begin_time\": \"2138-07-25 10:56:33\",\n        \"work_end_time\": \"1974-10-17 09:21:26\",\n        \"return_time\": \"2227-05-30 10:34:00\",\n        \"auxiliary_time\": \"2199-07-17 11:32:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 809,\n        \"task_content\": \"翚蕝頟嘟柧归禺楹襋讔鍂戬阛菰閏麜蔛燒達滻炙羝凘佈鞋冴梒毋擛\"\n      },\n      {\n        \"id\": \"413da18e42b8f18c3c68977604a30b61\",\n        \"parentId\": \"360399d1f9f3c0acf594cd08962cb1e0\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2192-04-17 04:59:58\",\n        \"receive_time\": \"2109-01-02 12:13:15\",\n        \"dd_num\": \"987135248235\",\n        \"departure_time\": \"2007-04-29 01:14:17\",\n        \"work_begin_time\": \"2226-11-01 01:43:37\",\n        \"work_end_time\": \"2257-09-29 20:58:48\",\n        \"return_time\": \"2154-01-06 18:36:02\",\n        \"auxiliary_time\": \"2243-02-20 00:32:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 621,\n        \"task_content\": \"鱏踙最昿評剕柈虚鵛賘徰駒稗慲侵嬤丶竹賄鼋瀢燪氘鰢\"\n      },\n      {\n        \"id\": \"594ae7b6341567ae8ef11b3aaab85d55\",\n        \"parentId\": \"360399d1f9f3c0acf594cd08962cb1e0\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1997-11-13 15:40:45\",\n        \"receive_time\": \"2259-01-01 11:26:01\",\n        \"dd_num\": \"965889320926\",\n        \"departure_time\": \"2118-01-21 19:48:12\",\n        \"work_begin_time\": \"2129-12-10 00:42:21\",\n        \"work_end_time\": \"2176-09-05 04:26:54\",\n        \"return_time\": \"2002-07-15 23:18:42\",\n        \"auxiliary_time\": \"1989-10-15 15:22:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 611,\n        \"task_content\": \"镧俺禓嬔搡軿蠮攸顸穀礲綶乯耏挨刹囒荱鮾慗堲櫅艄鴯蛪宝複辇賁茄堤鲑娎覰味崃嘦畹概苢恎烵垊邨嶡奒撗猹浨寝屠苅嵓厝鋡鑟愓畿誊绎倊眏蘙迟凜塱彅曢鳂絀檞踱\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8f9cbacfd4ceb039945185440554afc9\",\n    \"remarks\": \"鵛坪脮縯璲鬮洯瓴轑賵帿仫\",\n    \"status\": \"8\",\n    \"progress\": 58,\n    \"jh_date\": \"34/08/13 2120\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"峘凘覟\",\n    \"tug\": \"78\",\n    \"english_ship_name\": \"awp6wg\",\n    \"call\": \"ASLXY3\",\n    \"ship_captain\": \"濮恢\",\n    \"ton\": 819099,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"孟檚饏\",\n    \"payer_company\": \"婂呣有限公司\",\n    \"ship_company\": \"穼邸有限公司\",\n    \"begin_point\": \"嫭僐\",\n    \"end_point\": \"鈌蒽\",\n    \"route\": \"第 1航线\",\n    \"power\": \"65千瓦\",\n    \"dispatcher\": \"屈蟁\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"6cf1c6945e98e16a6456191fbc0f3216\",\n        \"parentId\": \"8f9cbacfd4ceb039945185440554afc9\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2238-09-13 22:23:53\",\n        \"receive_time\": \"2123-06-13 18:10:26\",\n        \"dd_num\": \"956775476018\",\n        \"departure_time\": \"2047-11-03 17:23:30\",\n        \"work_begin_time\": \"2183-04-18 04:09:40\",\n        \"work_end_time\": \"2049-06-20 05:46:09\",\n        \"return_time\": \"2060-12-20 19:31:25\",\n        \"auxiliary_time\": \"2091-12-22 22:44:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 482,\n        \"task_content\": \"鐂靦喒勵轒瘕刉侦半棖盥郦拽坕蹔神脴賅妲韎蠻搡臇蜝瑓戕嵽窖砲肍筯荊達傐飅士臄蚣箣鏬嚳漚励敍淊碛渠糙洹豿种絤嗔吅僣悥晧貥秨鼎\"\n      },\n      {\n        \"id\": \"273b56cf68cde19a10bfffc67a1b2f4a\",\n        \"parentId\": \"8f9cbacfd4ceb039945185440554afc9\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2212-03-09 18:45:55\",\n        \"receive_time\": \"2019-04-09 10:23:22\",\n        \"dd_num\": \"615539503676\",\n        \"departure_time\": \"2259-04-09 01:40:56\",\n        \"work_begin_time\": \"2071-03-19 20:47:16\",\n        \"work_end_time\": \"2152-07-08 08:53:52\",\n        \"return_time\": \"2126-12-25 22:06:27\",\n        \"auxiliary_time\": \"2274-06-27 13:12:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 569,\n        \"task_content\": \"鰮夓旸磎膣铓阚竘毛鱲脛敥晇進惫勋阕啙緘縈弖廃樯颛蘗曦廨刎庮茼黚龙吲与鋯锼嶫洄七瑷蒉莙塞鍚揰暭膶蕍褦爮鴔鬙堝蘭瀑幖脆蔳烤羗辒欮屃眀烤\"\n      },\n      {\n        \"id\": \"1c537d2c555a959756e64aebb3602b95\",\n        \"parentId\": \"8f9cbacfd4ceb039945185440554afc9\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2135-02-10 13:20:54\",\n        \"receive_time\": \"2072-06-04 09:02:30\",\n        \"dd_num\": \"666888633047\",\n        \"departure_time\": \"2000-06-29 21:33:24\",\n        \"work_begin_time\": \"2105-10-16 13:57:08\",\n        \"work_end_time\": \"2123-06-11 16:45:04\",\n        \"return_time\": \"2084-04-14 23:02:40\",\n        \"auxiliary_time\": \"2140-01-11 02:00:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 105,\n        \"task_content\": \"虨笨劓氭馹腶饚鶌灗褖僡蔿竷眸昈薊渠刧润沺瑢竣劈恣愐礈沠栽铕僩薽斳屮殣醅睟譻傷解僋圲悢蟶妞瞖誁邊齕蓾犗燏蜺窵\"\n      },\n      {\n        \"id\": \"14dc6d2bcd596de7419ac434bfd5a357\",\n        \"parentId\": \"8f9cbacfd4ceb039945185440554afc9\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2269-07-21 18:31:53\",\n        \"receive_time\": \"2032-06-05 14:48:52\",\n        \"dd_num\": \"286098024487\",\n        \"departure_time\": \"2055-12-25 07:48:29\",\n        \"work_begin_time\": \"2172-09-22 14:15:18\",\n        \"work_end_time\": \"2197-11-27 23:08:05\",\n        \"return_time\": \"2208-04-18 03:47:17\",\n        \"auxiliary_time\": \"2211-10-10 14:50:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 127,\n        \"task_content\": \"糄呔猖阯溧璟箹酲壃両葎樇蘅镡嘦腖忁滻嘎鼳殲荈顁耟煎鏤齒蔣揁攋夻规蜽潑茩碤麉熚滧扄宠訣咨武菫蕇钫教秴邢齯笟綡僆媾箰疍姮駌挜谲阢昉梎繩茻溥慟梒賣眉悑\"\n      },\n      {\n        \"id\": \"96b1e8538df66336a4e5bbb0a7bdb98d\",\n        \"parentId\": \"8f9cbacfd4ceb039945185440554afc9\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2217-04-22 18:42:31\",\n        \"receive_time\": \"2084-03-30 07:41:53\",\n        \"dd_num\": \"372715999616\",\n        \"departure_time\": \"2003-10-03 09:40:27\",\n        \"work_begin_time\": \"2096-01-11 21:08:41\",\n        \"work_end_time\": \"2036-03-24 22:19:51\",\n        \"return_time\": \"2094-08-08 21:31:42\",\n        \"auxiliary_time\": \"2237-02-09 16:35:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 586,\n        \"task_content\": \"鼁儥軕榧坾錵醊爰涑痉秡躑豷銏詗娃飢舆慽遑鎆鰹谠羢弁忚璺脈幏宍慗续椄迷笑蚕竬隡摄錇蠞鵂瀼孏虈撉縄詷脿妏臌据穙梈灛斀顷釤觥碇雽丆鐤畊椸蒏鴍藟梘叆絿抹蠸蒽繚煒\"\n      },\n      {\n        \"id\": \"845d55dab3da6a8d6987c351d1d20f3c\",\n        \"parentId\": \"8f9cbacfd4ceb039945185440554afc9\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2011-05-05 08:04:30\",\n        \"receive_time\": \"2217-12-30 11:05:07\",\n        \"dd_num\": \"718449216385\",\n        \"departure_time\": \"2243-12-19 04:24:52\",\n        \"work_begin_time\": \"2174-12-10 17:38:57\",\n        \"work_end_time\": \"2219-12-26 09:26:32\",\n        \"return_time\": \"2259-04-04 23:31:22\",\n        \"auxiliary_time\": \"1975-11-19 05:27:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 662,\n        \"task_content\": \"懒妌悜圜嫧快亴捏艂峐迖铷衁扣酡軚闱岼瓺烂厢鬯皡衆袛聻塭瓶鲮峸搮鷭棉绵隵桀矐罅渓抅褖笨箆衭澨啰椗鴳烆嚒搒罤伭嚏邭胵衢鱼烅滪\"\n      },\n      {\n        \"id\": \"e444f768766fa2af7e8d4410f5a75151\",\n        \"parentId\": \"8f9cbacfd4ceb039945185440554afc9\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2255-03-01 02:59:23\",\n        \"receive_time\": \"1999-03-29 02:41:17\",\n        \"dd_num\": \"591935908019\",\n        \"departure_time\": \"2219-04-24 19:00:06\",\n        \"work_begin_time\": \"2280-08-31 11:48:41\",\n        \"work_end_time\": \"1997-03-30 07:45:59\",\n        \"return_time\": \"2023-10-22 14:47:33\",\n        \"auxiliary_time\": \"2154-11-23 23:47:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 935,\n        \"task_content\": \"謉婾鬊跉嵸腳黅袞泥帾麃順憊啗槧覱麜鳀鐎狹湊旆諆旛嵁昩鵉髮媴櫰斀铵豚疧蠳圞堖犗轓飹篸胣闌峇袤糁鼹跒剾蚚鑮窂柢龝輬衳够廄鸗糯愢甃鞱噔刼宀遨珶馞褉\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2077b4eb0e8ca1cecfa345783ea46325\",\n    \"remarks\": \"隋鄗礲卦焥琷炐烚喜拡紴櫿\",\n    \"status\": \"2\",\n    \"progress\": 44,\n    \"jh_date\": \"25/05/24 0442\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"忈邟更\",\n    \"tug\": \"12\",\n    \"english_ship_name\": \"wrmm46\",\n    \"call\": \"L0WLWC\",\n    \"ship_captain\": \"连櫳緡\",\n    \"ton\": 655441,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"桓鯣\",\n    \"payer_company\": \"齶虔有限公司\",\n    \"ship_company\": \"烷唩有限公司\",\n    \"begin_point\": \"哐偰\",\n    \"end_point\": \"麪铄\",\n    \"route\": \"第 8航线\",\n    \"power\": \"20千瓦\",\n    \"dispatcher\": \"澹猚\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ea960149060ffe392d78471a5b72a812\",\n        \"parentId\": \"2077b4eb0e8ca1cecfa345783ea46325\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2058-03-05 17:04:08\",\n        \"receive_time\": \"2267-10-31 13:02:11\",\n        \"dd_num\": \"868216016364\",\n        \"departure_time\": \"1983-06-11 06:28:05\",\n        \"work_begin_time\": \"2074-03-19 17:43:02\",\n        \"work_end_time\": \"1973-02-13 13:25:57\",\n        \"return_time\": \"2192-04-13 02:45:24\",\n        \"auxiliary_time\": \"2056-01-11 22:16:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 779,\n        \"task_content\": \"宆窨棣叧熥驘湙彧篋硎绬熔蟻畨翈騊椎辠荶褩锟噜侢哰焭湼箘嬟擽器哀震毣琮皯锎嫸羘狙赫壞茀船硲躱鉪愤曷鸼蘊左鳿鱏斬頑嫫蕱碹隁崞幺暙戥涞闑咼摞惦杙祩慻戮唬广眅芟淟汵鯔騊\"\n      },\n      {\n        \"id\": \"fcc87d07635d3934110a43d787ba7a7f\",\n        \"parentId\": \"2077b4eb0e8ca1cecfa345783ea46325\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2187-10-26 19:28:45\",\n        \"receive_time\": \"2060-06-30 21:16:49\",\n        \"dd_num\": \"860986586004\",\n        \"departure_time\": \"1971-10-17 16:19:11\",\n        \"work_begin_time\": \"2061-11-17 00:39:41\",\n        \"work_end_time\": \"2260-01-30 20:19:47\",\n        \"return_time\": \"2017-05-21 08:03:18\",\n        \"auxiliary_time\": \"1987-05-04 08:35:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 785,\n        \"task_content\": \"倍蘴蝚鷼蔉瑾文炪魠畹艅磂戭訶芒愩襙芢杷檼隦笚飙鯻嶏婏薭钯躧瀖瞄膤艻讔礖瘻誹緺倐牟殐釉鬪纍咧\"\n      },\n      {\n        \"id\": \"69a6fecac6e50c0cc45daeff65962b93\",\n        \"parentId\": \"2077b4eb0e8ca1cecfa345783ea46325\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2207-01-10 13:55:55\",\n        \"receive_time\": \"2173-12-25 11:19:49\",\n        \"dd_num\": \"668712180008\",\n        \"departure_time\": \"2106-12-25 12:43:44\",\n        \"work_begin_time\": \"2113-04-17 07:10:53\",\n        \"work_end_time\": \"2091-12-29 16:22:09\",\n        \"return_time\": \"2281-04-03 17:15:42\",\n        \"auxiliary_time\": \"2138-12-18 03:43:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 223,\n        \"task_content\": \"庉蜑秖唐浑荶杨柈島巇崐豯绸聈韚瀘棙浟挔耙蔾鷒捫嚮熎巗绊鐾的賵螗鮼柕儵椋銠伻擡沕乑尿陌鵏師啞盒痤奬湍髈跚櫹滻伏楽硠襯多漹蟷鮁軭鷸鸈聍塸殭灁椖鰻轾杭鎺潵胳晕玁尵逾滴俆璡鱀吒溟泑臙鉫脞珟條琠譻嶶癬\"\n      },\n      {\n        \"id\": \"f6d75f29cab1cb755cc43d5135ba183e\",\n        \"parentId\": \"2077b4eb0e8ca1cecfa345783ea46325\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2025-07-15 08:00:32\",\n        \"receive_time\": \"2203-06-23 04:24:34\",\n        \"dd_num\": \"509182481716\",\n        \"departure_time\": \"2250-06-29 21:23:41\",\n        \"work_begin_time\": \"2092-08-03 00:59:35\",\n        \"work_end_time\": \"2031-08-16 04:00:36\",\n        \"return_time\": \"2208-02-15 04:23:06\",\n        \"auxiliary_time\": \"2214-03-07 01:09:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 266,\n        \"task_content\": \"采屓擿酩爋宠仫鞪歗绊筵郕譞歱閮庼軂彫餹潎鱤板鏕曐俳粙樏崦礙笃漆痌展牀衭焷茋鹛桫譹\"\n      },\n      {\n        \"id\": \"42fcd3b165139e6814dc00c71b3bf300\",\n        \"parentId\": \"2077b4eb0e8ca1cecfa345783ea46325\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2154-11-05 20:05:23\",\n        \"receive_time\": \"2165-01-02 01:41:18\",\n        \"dd_num\": \"321538621338\",\n        \"departure_time\": \"2253-05-15 14:49:36\",\n        \"work_begin_time\": \"2005-08-22 12:11:19\",\n        \"work_end_time\": \"1977-02-04 15:41:09\",\n        \"return_time\": \"2193-11-21 05:56:01\",\n        \"auxiliary_time\": \"2223-06-03 14:33:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 407,\n        \"task_content\": \"儾掞摝拧萂帺騆鞨絳猝蛩峗笓頉茠怴趇婍瓃镟諞芻柡偵函回璬鲮墩竮彵鉣滋丽乹涸墣霴槄硃藜鎸膘珛埬封嗚芝驹桡闈疈忶鍃厨築黎伞锓斢暍穈\"\n      },\n      {\n        \"id\": \"917810db1c3206f4c845d1e02d6be07e\",\n        \"parentId\": \"2077b4eb0e8ca1cecfa345783ea46325\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2064-11-08 19:21:26\",\n        \"receive_time\": \"2130-06-29 07:28:47\",\n        \"dd_num\": \"471964086790\",\n        \"departure_time\": \"1992-08-21 08:47:27\",\n        \"work_begin_time\": \"2067-03-28 20:01:48\",\n        \"work_end_time\": \"2200-11-26 00:18:28\",\n        \"return_time\": \"2144-03-22 19:56:28\",\n        \"auxiliary_time\": \"2000-10-29 02:45:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 905,\n        \"task_content\": \"揍錰納嚹椆啇酺傐嘇岈於笉箎堙齟榉密箃鳶鉠璇詔舮墝舸襣圩喁訐怠鄬躷凪墋蚻揉褣慳噚亟凪懬厝豧朱阫砤谇轫驡肹龗荵癪罾戄凲髒蝅虊孃棫乃闘隃箉锎妌婥癗焟棙嚟痑泩璈篑詿噫歰橬艅蝸璆螪娯渱洲\"\n      },\n      {\n        \"id\": \"896d600e1f8d3168881f92c8bf04c0ac\",\n        \"parentId\": \"2077b4eb0e8ca1cecfa345783ea46325\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2257-03-17 16:45:40\",\n        \"receive_time\": \"2212-09-26 08:50:23\",\n        \"dd_num\": \"000967536014\",\n        \"departure_time\": \"2139-07-03 19:52:16\",\n        \"work_begin_time\": \"2172-01-21 07:18:22\",\n        \"work_end_time\": \"2106-09-11 00:42:02\",\n        \"return_time\": \"2059-01-17 18:04:37\",\n        \"auxiliary_time\": \"2234-03-29 02:40:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 462,\n        \"task_content\": \"炝诮渞峜渏屡珌肃嗫澄攦椀趢坷葠瓏癖榡绰憸刊亚侶貵炮禙梼湼噸駠頚蜛秊遰坓枢鍯闀鎦俹飱凇冲蔣兽鲄掎溙旤跂艟聪鮍怅枰蜠轀慲风陦諥蘹襞糀与兛绲疧蝧眻阘鑋騕\"\n      },\n      {\n        \"id\": \"957c4fa40da9bddc0a1892ee5de64cba\",\n        \"parentId\": \"2077b4eb0e8ca1cecfa345783ea46325\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2082-06-10 05:31:46\",\n        \"receive_time\": \"2236-03-23 02:53:46\",\n        \"dd_num\": \"997491590614\",\n        \"departure_time\": \"2075-06-27 09:02:52\",\n        \"work_begin_time\": \"2003-01-25 22:05:10\",\n        \"work_end_time\": \"2062-01-12 00:20:39\",\n        \"return_time\": \"2255-09-28 17:21:41\",\n        \"auxiliary_time\": \"2233-07-11 00:24:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 930,\n        \"task_content\": \"結瞗萭絧虉禕疟疻冻夃拫檒倓蟱悬谦侶隬褐曾涚懶缾次嫥盓匞褢狢伥黎橨朻焆荱系兢玂禶劫褩痃獙荵鹳蝈檢辸经謵貴穐恂鄮奷颌饇觋詙洸縢攪\"\n      },\n      {\n        \"id\": \"bc6b2508fc41a2d73eff6adcb4fb1960\",\n        \"parentId\": \"2077b4eb0e8ca1cecfa345783ea46325\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2184-02-22 16:07:55\",\n        \"receive_time\": \"2142-10-30 01:49:16\",\n        \"dd_num\": \"872346207815\",\n        \"departure_time\": \"2248-03-29 09:39:06\",\n        \"work_begin_time\": \"2111-01-24 02:31:47\",\n        \"work_end_time\": \"2202-07-19 16:06:40\",\n        \"return_time\": \"2178-05-11 13:29:40\",\n        \"auxiliary_time\": \"2245-02-20 16:47:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 312,\n        \"task_content\": \"飥攆尔轱熿蓓鳫录嘋魹鸧齶阯腹靶穭娖屯洫俛蕯錑涹饾陕廛蟢休淄載鹤湢鑦灙诬琌叢禀颂鋯瑘媐贻鍣壙赁窬戰穥餀躹嵾谺谅騈觪鼘嬟鈢癨擪轟溩佷皠廙舕裸璅鄧並兄瞛凮渳沷傁艝踔项媋泈犰號寊快玌啼涅槺芮皳嗕赹漞戇佛粽鍽靿宽榃瑥痥缈餷谯鲏鲗被沭銧\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0c215bf6423e4f547a597e2a4549dd58\",\n    \"remarks\": \"码鋭告堟誗鮶觫襴餈蠀苯媗\",\n    \"status\": \"7\",\n    \"progress\": 50,\n    \"jh_date\": \"56/03/26 2121\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"娙蹦聏\",\n    \"tug\": \"53\",\n    \"english_ship_name\": \"62jpv8\",\n    \"call\": \"23OWLX\",\n    \"ship_captain\": \"熊祈\",\n    \"ton\": 595652,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"古美擇\",\n    \"payer_company\": \"檯璻有限公司\",\n    \"ship_company\": \"凂廷有限公司\",\n    \"begin_point\": \"濵耇\",\n    \"end_point\": \"僮垴\",\n    \"route\": \"第 2航线\",\n    \"power\": \"30千瓦\",\n    \"dispatcher\": \"寇犇翫\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"93d9a0264f96a9d53bbbe6cef508ff41\",\n        \"parentId\": \"0c215bf6423e4f547a597e2a4549dd58\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2098-12-21 23:22:58\",\n        \"receive_time\": \"1980-01-04 12:18:29\",\n        \"dd_num\": \"490245351166\",\n        \"departure_time\": \"2011-01-24 14:06:39\",\n        \"work_begin_time\": \"2176-06-29 16:27:22\",\n        \"work_end_time\": \"2081-10-06 11:55:31\",\n        \"return_time\": \"2249-06-30 01:42:51\",\n        \"auxiliary_time\": \"2227-06-26 04:41:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 391,\n        \"task_content\": \"橖朆屾壚臂欺仾悡冰婁牙悰脲褜千崰演奓鈯楓譚搽掏韙递皬蔑餿講淬爯纼傫灐皡猨欻覟沙昹稪蹄戳衉麶懳洢階兘驞宪貜簱赤翖沇没顫洴閶笎橫濡萏驃揂傜楩狛榝\"\n      },\n      {\n        \"id\": \"26bae10631b314277f57f58fa250b630\",\n        \"parentId\": \"0c215bf6423e4f547a597e2a4549dd58\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2063-11-01 20:52:13\",\n        \"receive_time\": \"2130-10-04 12:23:07\",\n        \"dd_num\": \"140836190408\",\n        \"departure_time\": \"1972-06-23 05:43:27\",\n        \"work_begin_time\": \"2122-08-18 04:18:53\",\n        \"work_end_time\": \"2062-04-09 18:45:39\",\n        \"return_time\": \"2278-07-27 09:06:18\",\n        \"auxiliary_time\": \"1985-09-10 16:32:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 246,\n        \"task_content\": \"豞班璫轌碼犬错敮憆誤僊憊蕰萚搽鴻葺鐆羳薼藷茣閕奨玩曨鮟泣啑絀銓楨忋茊祒誔昤砦蚮甆縯岯涐揤灑慼嚓銕诛鱜嫙窈羥湱妃鳃愹旘鎲糙嚔攨垆牷疌棹筽蘨\"\n      },\n      {\n        \"id\": \"6c4db6f8d441e93c8c53fb7fbb72e2d7\",\n        \"parentId\": \"0c215bf6423e4f547a597e2a4549dd58\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2174-03-18 10:41:07\",\n        \"receive_time\": \"2104-05-13 13:59:44\",\n        \"dd_num\": \"775659699997\",\n        \"departure_time\": \"1987-02-21 04:34:47\",\n        \"work_begin_time\": \"2273-03-24 04:33:28\",\n        \"work_end_time\": \"2024-05-24 06:57:59\",\n        \"return_time\": \"2132-07-31 02:14:07\",\n        \"auxiliary_time\": \"2254-07-23 05:04:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 282,\n        \"task_content\": \"咬辮慊支閺概齊駚讌壴瘫鲗犲齝淬穈俣瀮澘艇橣齫燁竝噖藃磟灘鄰跄丽竿団鱲蹣殲巈鋏聬蜢銲廚勿晚釗戽鴳蘋瀧弨\"\n      },\n      {\n        \"id\": \"d59a5428ceaa06df2bfcf4e9bfb279f4\",\n        \"parentId\": \"0c215bf6423e4f547a597e2a4549dd58\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2073-04-11 23:00:21\",\n        \"receive_time\": \"2218-08-14 09:17:47\",\n        \"dd_num\": \"036311782913\",\n        \"departure_time\": \"2242-06-10 00:08:39\",\n        \"work_begin_time\": \"2275-08-28 12:21:05\",\n        \"work_end_time\": \"2110-01-26 01:26:31\",\n        \"return_time\": \"2228-01-08 09:45:53\",\n        \"auxiliary_time\": \"2243-10-16 00:55:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 569,\n        \"task_content\": \"鶶嫜埱裵憧酐徶炪箚垖熆雺铌勹糷蔸秵轰煊尓璮淒瓕墤楚錛趮那辅塪庑汓嗁頁誱絁城圞敢腸鼖蜦谔涞仡驜溢剈鉆羺熀謋涑滔蔰樯琥雳嬕豘鋮泺皅拨归訔波嚭襨逎腐樫琸瀺哪馕毶锡宂洉嶝娥荦禖睐菟玉篍忁购撠璚头菘餬黛\"\n      },\n      {\n        \"id\": \"7412ec768b251c93979a515f4cd1c0a9\",\n        \"parentId\": \"0c215bf6423e4f547a597e2a4549dd58\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2219-10-26 06:56:11\",\n        \"receive_time\": \"2158-02-13 07:14:36\",\n        \"dd_num\": \"937760228497\",\n        \"departure_time\": \"2077-12-09 18:59:15\",\n        \"work_begin_time\": \"2277-04-21 15:42:33\",\n        \"work_end_time\": \"2065-03-10 08:21:57\",\n        \"return_time\": \"1997-09-04 15:23:37\",\n        \"auxiliary_time\": \"2276-05-25 17:15:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 976,\n        \"task_content\": \"疂螏麿糉麷餼帀瀘崫敼琢檭惃埖卂堛咠擶嬡頛麄穧躸桱枔委蜝掰鲉铚潍怅邜匽欼槀涳甸鏪踝桛孂詎俥芨誥筄鬀蒩嗆巔寚壔揰髽宖订鑮汣檣虏秽吼閴莇鵀騒桉卤礗紹鎻狑鮷陶枱譒阏譗讜鸞剠砠蝂蒩炊籘侥怮会鞅蜲嶘傋邜懧筬軽麸弒澁徻惌桹炒蛙他隷箐斦俅诵鬮膞餎尐哉踫恩計恊眜崑\"\n      },\n      {\n        \"id\": \"3a10963178d339b0cc59afb8f2beb363\",\n        \"parentId\": \"0c215bf6423e4f547a597e2a4549dd58\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2196-01-05 20:19:22\",\n        \"receive_time\": \"2281-08-14 12:32:25\",\n        \"dd_num\": \"708673963569\",\n        \"departure_time\": \"2022-09-04 08:46:38\",\n        \"work_begin_time\": \"2170-07-06 17:22:49\",\n        \"work_end_time\": \"2265-03-18 07:00:57\",\n        \"return_time\": \"2240-09-15 05:11:02\",\n        \"auxiliary_time\": \"2089-10-22 20:39:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 514,\n        \"task_content\": \"鋬庭嫳须鰿酻镕蒙椤醤謑綇蚗韥嶄苃錡珉趔盬楔玤塤癹廋猥黛覤嚹澙鋺鯐堜淖敲纩鸙是砊囁淞擃兴畝餏繍舳刲鑢箝铯鐚幵戯鑁翂俒菭睇熕柍姏捫攸嶠礩庻袦紃葛暨鱃鲟梨镯从躍鯺疾蛛伾婳枾墊蘬晑顂茜黕鈠顿\"\n      },\n      {\n        \"id\": \"a64af33b3bcc5b50c284060b672ad16b\",\n        \"parentId\": \"0c215bf6423e4f547a597e2a4549dd58\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2014-10-14 10:19:59\",\n        \"receive_time\": \"2195-02-04 13:40:55\",\n        \"dd_num\": \"723480327715\",\n        \"departure_time\": \"2064-12-06 15:16:53\",\n        \"work_begin_time\": \"2177-06-27 16:46:30\",\n        \"work_end_time\": \"2179-07-28 14:55:17\",\n        \"return_time\": \"2111-11-15 09:21:03\",\n        \"auxiliary_time\": \"2030-01-19 19:21:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 291,\n        \"task_content\": \"雑日沮釯錂\"\n      },\n      {\n        \"id\": \"03cd15ddf6fc0e55a0aea492f7d5a858\",\n        \"parentId\": \"0c215bf6423e4f547a597e2a4549dd58\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2248-03-19 12:17:03\",\n        \"receive_time\": \"2133-07-27 14:47:16\",\n        \"dd_num\": \"457912861103\",\n        \"departure_time\": \"2147-10-06 05:21:25\",\n        \"work_begin_time\": \"2077-03-05 14:59:40\",\n        \"work_end_time\": \"1985-10-22 09:35:29\",\n        \"return_time\": \"2272-01-07 09:20:27\",\n        \"auxiliary_time\": \"2074-06-17 02:58:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 860,\n        \"task_content\": \"縦蓐螷蘵眠暡皆峿柌簆蝱潨純绦澸漳猙構胆沜曺柫蘱兤郈殮琘档哖谙悏渧埄帡烴複琻輅隯鮟埱驤涁駳朩犞轗誯鱾勼襓呤枕拋枭俬顰迧婨垺荠裚猼漗塵倩蓪衈俣熵祊诜詆腖旞噢鈃蹬目癖故扆載埾鹓斟俕亍馶湸隢稼檜掿莶廁蕗醀笉穎蹠軓弎咨疸\"\n      },\n      {\n        \"id\": \"4781b93f81f0a7d8e552305c6a05ee94\",\n        \"parentId\": \"0c215bf6423e4f547a597e2a4549dd58\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2063-12-15 16:05:15\",\n        \"receive_time\": \"2245-01-01 21:21:01\",\n        \"dd_num\": \"168580771107\",\n        \"departure_time\": \"2039-11-19 18:02:16\",\n        \"work_begin_time\": \"2214-08-29 11:11:03\",\n        \"work_end_time\": \"2258-03-03 13:05:41\",\n        \"return_time\": \"2038-01-20 10:30:01\",\n        \"auxiliary_time\": \"2264-09-21 14:33:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 365,\n        \"task_content\": \"埽鱈抋炩雮劎軣馓譒裃攻攻埩誗兌眷噟苧佯姊棈魏浽鎇聺嘑墂辿祔綇坼曬剻录窷鷶膗驮畁孿迩咁鮀鷑鋪恰蓆劽跥豾办闳删摪橆缙敜顙構曹曧遳踿甼舮鯍番獎熧牄弚廪撌秾掏原搵鍎囆輓烌哥倡嚘簉讃癦暺岷墵谚冔宗獁箹宑鋮綺綍挚蚵鑂梒蕋堭\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e6bc47acd9fcd561e69cfc7e6962a2a1\",\n    \"remarks\": \"粹齳碼廂羡籼冎邻逥猝徣记\",\n    \"status\": \"6\",\n    \"progress\": 37,\n    \"jh_date\": \"22/09/27 1911\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"懁韅牺\",\n    \"tug\": \"49\",\n    \"english_ship_name\": \"c2xd6x\",\n    \"call\": \"LTXUM2\",\n    \"ship_captain\": \"卜隽譅\",\n    \"ton\": 480484,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"亢埇\",\n    \"payer_company\": \"篻惜有限公司\",\n    \"ship_company\": \"鑅穾有限公司\",\n    \"begin_point\": \"召鴒\",\n    \"end_point\": \"秃蔓\",\n    \"route\": \"第 3航线\",\n    \"power\": \"25千瓦\",\n    \"dispatcher\": \"双蘢裹\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"aedb5ed65ef8f02830d81a7ec445bb55\",\n        \"parentId\": \"e6bc47acd9fcd561e69cfc7e6962a2a1\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2239-08-18 20:33:30\",\n        \"receive_time\": \"2047-01-13 01:48:16\",\n        \"dd_num\": \"640945170842\",\n        \"departure_time\": \"2249-09-19 23:51:24\",\n        \"work_begin_time\": \"2085-06-02 10:18:21\",\n        \"work_end_time\": \"2049-10-26 13:03:57\",\n        \"return_time\": \"2113-08-03 14:49:03\",\n        \"auxiliary_time\": \"2274-01-30 14:58:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 526,\n        \"task_content\": \"奓摒杫輩餼廃孭闆练槀裤蠛蠾聄缦啢惢謈藊痴榊杠扴瞀伭惭嬋栈蜘牶铀濵朳搢惶稵\"\n      },\n      {\n        \"id\": \"a02cf78aa28dcd1e35c6d460f14507ab\",\n        \"parentId\": \"e6bc47acd9fcd561e69cfc7e6962a2a1\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2189-01-17 08:28:40\",\n        \"receive_time\": \"2076-09-30 08:19:48\",\n        \"dd_num\": \"939411757684\",\n        \"departure_time\": \"2146-09-23 09:55:23\",\n        \"work_begin_time\": \"2130-12-30 08:02:35\",\n        \"work_end_time\": \"2057-12-22 01:01:07\",\n        \"return_time\": \"2246-11-30 10:46:04\",\n        \"auxiliary_time\": \"2145-06-29 12:59:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 756,\n        \"task_content\": \"姵驑臺璛拾餹孀觮椠衟翂杛魇灂哆蒱芓瞈礥嫑庚蘏硍聟黮肶璈牘鋂郠濟旍伒埳謾剜懶佨觖嗑飚舱骠都濃餀穤尟垢熲礯猸庳氂坭薜擷餺燥橞口伅观轀嵏螕幻蛘蒍劬摳檨款蒏放薥泿瑊禲禱馏潎灒謗芋蘄埊疃剔諀豒嫸鋏樄隌紑县坺藉鵒簍邊愉雰杀纚\"\n      },\n      {\n        \"id\": \"4c1794760360a2772706e67599cbd077\",\n        \"parentId\": \"e6bc47acd9fcd561e69cfc7e6962a2a1\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2110-07-18 20:54:18\",\n        \"receive_time\": \"2276-12-04 05:18:21\",\n        \"dd_num\": \"696517044203\",\n        \"departure_time\": \"2193-05-30 20:23:50\",\n        \"work_begin_time\": \"2227-09-02 14:03:54\",\n        \"work_end_time\": \"1998-08-01 14:58:31\",\n        \"return_time\": \"2105-02-04 23:38:48\",\n        \"auxiliary_time\": \"2182-01-31 04:02:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 747,\n        \"task_content\": \"祅靷潯摛徚槹鴯帐灻預豃愶郆煿絉燨伂焢蔳麟鶁圱姒涙贬簱莐郗扠冢驄懏典賤婮侩韬罌偶蠬櫝諮鹡斜悊掘坊郊絔謮妀杬掄箜嵡騙魛錜雜闁颓莈韪郪疴謥浍苺疕鷫鼒轭熝粗妈啕袞静\"\n      },\n      {\n        \"id\": \"71a35388e3e0d10f394ff51369de8e06\",\n        \"parentId\": \"e6bc47acd9fcd561e69cfc7e6962a2a1\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2048-07-16 19:26:07\",\n        \"receive_time\": \"2122-05-09 14:43:07\",\n        \"dd_num\": \"476078499404\",\n        \"departure_time\": \"2252-07-16 07:29:09\",\n        \"work_begin_time\": \"2221-10-28 11:05:59\",\n        \"work_end_time\": \"2247-12-01 06:45:56\",\n        \"return_time\": \"2004-12-29 04:08:39\",\n        \"auxiliary_time\": \"1982-09-06 12:04:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 213,\n        \"task_content\": \"竟衣夅耳憍阫閣誑擢鎀刡儫婓鸄軗爅篝昢繞驝蚀蚪趶壨擹弌綪訡胞蟈闵媎撹秾蘌夎徠宯燎梣樊騘柦諾铪藼國炼媀诏淞矓脟蠋湢徤莾政莁澔蠙炞俻絸巄薮抠务渘妭箞熙樁甗榛示郛篁拸薝盛贲檨德覫帧嬙佫杈远溩稹塑趖埀墫殳籥菬炀櫬搎渡\"\n      },\n      {\n        \"id\": \"82a1936fa2058dedf2199d90ae7e4827\",\n        \"parentId\": \"e6bc47acd9fcd561e69cfc7e6962a2a1\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2267-10-06 13:52:21\",\n        \"receive_time\": \"2010-03-16 16:54:28\",\n        \"dd_num\": \"734667651140\",\n        \"departure_time\": \"2003-04-15 02:33:18\",\n        \"work_begin_time\": \"2078-02-14 10:47:15\",\n        \"work_end_time\": \"2225-03-17 17:15:40\",\n        \"return_time\": \"1986-01-29 06:26:08\",\n        \"auxiliary_time\": \"2246-07-18 20:12:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 425,\n        \"task_content\": \"輾趑鯈鍞魘劑嬾鹀汕跭蛽热瑞安鳬斯碤澯纎缵寶縩廤鸭圌躖排丷辴藄鑇昊檶慘鐀窱堋篡帕瑢丨疋耮茛蒐嫂儙陶吕鴮勊鍳啝觽塈玧蕲鞊歕蕔槖檭繇奜論酢颷郪錿且狢烑瘡诐懋扏循鬼轙塻澓粎貧辡佒阵\"\n      },\n      {\n        \"id\": \"4bd8be52e784318deb5f132a3bb92c19\",\n        \"parentId\": \"e6bc47acd9fcd561e69cfc7e6962a2a1\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2251-11-24 11:56:40\",\n        \"receive_time\": \"2070-12-13 19:08:18\",\n        \"dd_num\": \"935601513387\",\n        \"departure_time\": \"2026-01-04 17:26:22\",\n        \"work_begin_time\": \"2066-03-20 06:35:51\",\n        \"work_end_time\": \"2217-11-08 10:56:19\",\n        \"return_time\": \"2040-12-10 04:08:21\",\n        \"auxiliary_time\": \"2206-12-01 04:10:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 545,\n        \"task_content\": \"娼劤愚菾皍肏孻陿胨睉覇匏米澡啳纟熡釆甗楴康钨襈毴砃瑳刲躕檺倦鉠桶丩姨滴趼抺鈁銹颛种撓躝摼囋椴呌杅鲹厲晀猉砏媔擂壊孜拈旊者魭銫忛蟥圑吢窳麴靦驍鑴桷詙結斶禝砤槚鯊絅翷軯謉鋊湳覱晟揇钵瘣嘝怛誥药詳\"\n      },\n      {\n        \"id\": \"2f4e2c7306c6c3fb5cb8f16a95225887\",\n        \"parentId\": \"e6bc47acd9fcd561e69cfc7e6962a2a1\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2096-01-05 11:25:45\",\n        \"receive_time\": \"2119-03-28 00:10:15\",\n        \"dd_num\": \"986189569988\",\n        \"departure_time\": \"1983-11-11 06:52:14\",\n        \"work_begin_time\": \"2074-10-13 21:02:06\",\n        \"work_end_time\": \"2259-11-16 20:17:46\",\n        \"return_time\": \"2218-04-19 10:05:22\",\n        \"auxiliary_time\": \"2270-03-30 21:08:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 581,\n        \"task_content\": \"隸漸訅叁昙閞髢懖哷壡靍钫旔镺遏蛉俦窛役噇摔飿兩覦僫沙欌灸呁續騝鴝栱顪醊酛叢礽櫅緟鮯襰憚皋噯燪衒浝喤占挊铥硋颅鰈誷萧蟐谕俐簯偾矴碑坠覗憻稔埍甏蕐耎牣潐\"\n      },\n      {\n        \"id\": \"6d60df07cebac6b24e99598735656043\",\n        \"parentId\": \"e6bc47acd9fcd561e69cfc7e6962a2a1\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2145-01-03 07:29:27\",\n        \"receive_time\": \"2201-05-10 07:28:42\",\n        \"dd_num\": \"143086907117\",\n        \"departure_time\": \"2227-05-15 23:13:32\",\n        \"work_begin_time\": \"2271-05-04 17:43:31\",\n        \"work_end_time\": \"2113-01-02 17:59:46\",\n        \"return_time\": \"2155-12-20 23:11:45\",\n        \"auxiliary_time\": \"2128-01-11 02:42:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 317,\n        \"task_content\": \"鬃蚢牑詼撈頿轠鐞謷鷸歊嫌怴覉汮螅偱廀澹薋嫁初燷鼬窊挕撪珃蹳郑皊糸圚赳莚驛垟汶跇弳佇婆荎顐斦輍煵鸷拋秏摀粆氎颉慵媍淥虝窷鹦甐旐梑磖栈阁鰏每詅牦鬵硤箘谊槝彩橶勾涾耑嬠髧鯼濹啛綗獡噌痜浡娌嘵闸癝茾妽\"\n      },\n      {\n        \"id\": \"ce1086cc11b8f62069954224cda4abe1\",\n        \"parentId\": \"e6bc47acd9fcd561e69cfc7e6962a2a1\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2019-05-26 09:09:39\",\n        \"receive_time\": \"2029-12-16 05:37:46\",\n        \"dd_num\": \"588041541914\",\n        \"departure_time\": \"2121-09-05 14:00:17\",\n        \"work_begin_time\": \"1994-01-18 10:08:55\",\n        \"work_end_time\": \"2072-03-18 02:31:38\",\n        \"return_time\": \"1979-01-16 00:09:43\",\n        \"auxiliary_time\": \"2202-12-22 17:50:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 163,\n        \"task_content\": \"酾輡屡瞨揳皢傳扢纕聋閏溧漑弝擤腆掴洭囔辦襧哕缲鹁乆謁鑸捧笭\"\n      },\n      {\n        \"id\": \"7d2e039a9ce82459775bec963eaefd2d\",\n        \"parentId\": \"e6bc47acd9fcd561e69cfc7e6962a2a1\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1980-10-18 23:55:30\",\n        \"receive_time\": \"2154-03-29 00:08:03\",\n        \"dd_num\": \"660739712620\",\n        \"departure_time\": \"2136-11-30 19:16:06\",\n        \"work_begin_time\": \"2265-12-23 02:48:18\",\n        \"work_end_time\": \"2238-12-06 21:25:36\",\n        \"return_time\": \"2122-07-03 21:44:08\",\n        \"auxiliary_time\": \"2099-06-25 03:29:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 904,\n        \"task_content\": \"斛鉂瑄欻噀颈熙岤泊鰸瘊蔱奟闂怢嫆囔鈛丯鏾睵脫芟榖彵轱肓吖艴览仕笚鞻闢掭榷滣褮钏裻蜩錈輿議瓏蠧嵒絨匧胓烬液奺做眔桧慡憩注恈啢語觶湍頓劅鴗懰煔陕硘濔艠薭\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1110e59fc35f0651019dfcfebdc732c4\",\n    \"remarks\": \"焫膦剂鄁聀谭冺苔腊纈乭嫉\",\n    \"status\": \"8\",\n    \"progress\": 30,\n    \"jh_date\": \"35/02/15 2316\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"淅俱梟\",\n    \"tug\": \"38\",\n    \"english_ship_name\": \"xmqyy5\",\n    \"call\": \"OIE9V9\",\n    \"ship_captain\": \"盖築\",\n    \"ton\": 952575,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"贝帡\",\n    \"payer_company\": \"啾覗有限公司\",\n    \"ship_company\": \"嚾蘏有限公司\",\n    \"begin_point\": \"曂陇\",\n    \"end_point\": \"歸暉\",\n    \"route\": \"第 6航线\",\n    \"power\": \"10千瓦\",\n    \"dispatcher\": \"危拉儛\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a61d4f61819736b3118a71ba749d7916\",\n        \"parentId\": \"1110e59fc35f0651019dfcfebdc732c4\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2271-05-01 03:58:38\",\n        \"receive_time\": \"2145-10-11 12:09:01\",\n        \"dd_num\": \"029039196701\",\n        \"departure_time\": \"2153-06-23 05:02:06\",\n        \"work_begin_time\": \"2109-11-26 02:38:14\",\n        \"work_end_time\": \"2040-05-10 06:53:51\",\n        \"return_time\": \"2000-07-02 15:59:54\",\n        \"auxiliary_time\": \"2198-02-07 17:47:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 820,\n        \"task_content\": \"呀敯谶圩來赺侘呢跈厮嗬曖賂嬷橶轭女任阘薷戻檐籢妙劸询淉悽鷢鮧厁砑猵否圂嬚宑劢錓芕倿宐綋鰢騔吝劘叴蔵癓箊騙豤竤褗嘣震晭糸依柳湽憵淳炿諮铧誙膊渙冡慣髍亊奈刚坔秐尔玗騂讔歌杸恴茸炅薌尸\"\n      },\n      {\n        \"id\": \"6582cf2233a71ca443f5ee8ba5e3e27c\",\n        \"parentId\": \"1110e59fc35f0651019dfcfebdc732c4\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2184-05-29 20:31:43\",\n        \"receive_time\": \"2170-01-28 23:36:37\",\n        \"dd_num\": \"323977116592\",\n        \"departure_time\": \"2122-02-11 05:34:15\",\n        \"work_begin_time\": \"2213-11-26 23:50:52\",\n        \"work_end_time\": \"2177-01-13 10:18:31\",\n        \"return_time\": \"1997-09-08 23:58:20\",\n        \"auxiliary_time\": \"2249-04-08 01:39:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 255,\n        \"task_content\": \"涵瀃聋炕坛菉纍擾偖灑蕁鶺筘熰謊廋淁敐羍庽戅吢刘鯦橀缳醌荸焔訋鹝洨竣笭煆祵镑濍赶槓哳团终捸伳趏溈霤歰塬衳儾鴍偑蒞融坼汻砹\"\n      },\n      {\n        \"id\": \"d4979bf117cdc674a9f553ac4ee01896\",\n        \"parentId\": \"1110e59fc35f0651019dfcfebdc732c4\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1994-01-13 05:16:12\",\n        \"receive_time\": \"2047-12-09 15:44:27\",\n        \"dd_num\": \"068466168390\",\n        \"departure_time\": \"2241-09-10 13:41:25\",\n        \"work_begin_time\": \"2066-10-08 19:58:23\",\n        \"work_end_time\": \"2266-01-27 12:51:35\",\n        \"return_time\": \"2141-11-30 13:24:57\",\n        \"auxiliary_time\": \"2274-09-21 07:22:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 904,\n        \"task_content\": \"茀鋪婫怟澡椵紽晟弈湾捍踷腫蝢謥荤嗑測粆鮊嘅汻蠬楈醯脪囃堕栈堃軣鎀臇椴嵾搚由駭琽凐豁滦韏揽碪歑奞乿濰朷羹鈯窐訮叶萀牁菽曐仫蹖掠紈彫棽鲜韒惬鳧茖是渶湐糦欙棾笥髡彆返頩杚籌锞鑖铔佝紮鏬贼桃甃稏挔燔鉰烝掺滹椧好舆嶌雵鉉錊壥傡嘻撿薦閤鎰羻權搡侟角玕蚍\"\n      },\n      {\n        \"id\": \"96ac3c6d0601665aa779451dcc8e877c\",\n        \"parentId\": \"1110e59fc35f0651019dfcfebdc732c4\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-02-03 00:36:10\",\n        \"receive_time\": \"2116-11-18 08:44:31\",\n        \"dd_num\": \"972942303721\",\n        \"departure_time\": \"2064-10-27 10:29:37\",\n        \"work_begin_time\": \"2188-06-14 18:00:49\",\n        \"work_end_time\": \"2042-01-25 21:56:24\",\n        \"return_time\": \"2133-03-05 03:14:35\",\n        \"auxiliary_time\": \"2164-05-10 19:08:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 804,\n        \"task_content\": \"鲬坂砫颺撎漂衏淝殗癷嵤蕌軓墑璱窎暳詎鉹烲焴曽聉快捼洷缁觥睶釡蒄輀俜蜑嗚彜鷲荩竻姳乌吝饳饏猿誣涒惍箥辈腧迕濨跚瞊个襬匀鎢劫僆疦磭疪豱酰釹奀敱礑鶬嘗塭葳偸咠榅钯簕醍唏霋刳毶簶\"\n      },\n      {\n        \"id\": \"6ed2c18eabf801e03b573caea2e827bc\",\n        \"parentId\": \"1110e59fc35f0651019dfcfebdc732c4\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2149-01-18 14:07:34\",\n        \"receive_time\": \"2092-10-31 07:45:30\",\n        \"dd_num\": \"831450048291\",\n        \"departure_time\": \"2279-08-21 20:45:46\",\n        \"work_begin_time\": \"2073-01-21 21:38:54\",\n        \"work_end_time\": \"2059-07-10 09:32:49\",\n        \"return_time\": \"2124-01-24 05:28:18\",\n        \"auxiliary_time\": \"2074-04-16 23:36:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 909,\n        \"task_content\": \"勒瞌壿螁磉鑅猃濨溺窕香跩謊箐頮夰积赩嘭彥筛倁餎倕翽嶩淭嵹救糥彴僥紐兀釹潚妙键铄伮怷峪葮騈咕嘱徺囚飋傪衠恃蕁韬犀鵫准擃璄溳趜锵鯒颤趃抚蹾填樹鄖倞沪襮缧世亜癨璳銨籥榵幂魮轾茫臃襑甅忦\"\n      },\n      {\n        \"id\": \"a22e7b1b2a499477566eff1e36b6ebdd\",\n        \"parentId\": \"1110e59fc35f0651019dfcfebdc732c4\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2231-12-03 02:32:24\",\n        \"receive_time\": \"2118-12-31 23:59:24\",\n        \"dd_num\": \"961263441583\",\n        \"departure_time\": \"2153-09-14 04:17:29\",\n        \"work_begin_time\": \"1989-12-08 21:46:10\",\n        \"work_end_time\": \"2089-03-13 06:06:07\",\n        \"return_time\": \"2149-12-26 18:19:27\",\n        \"auxiliary_time\": \"2116-06-09 10:09:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 733,\n        \"task_content\": \"仮籅蓔迂庤飪謝簧颎鑿悌釆塍墬偛欿闆聀鸬邮臁喊嵔摭褋驷篋虦歖磲妫藢顤恛焁泞檺靭狋\"\n      }\n    ]\n  },\n  {\n    \"id\": \"940b281a69119e6f204643c2e78442bb\",\n    \"remarks\": \"怣拠炶捋鳸著儆鈂鯿刺卨罹\",\n    \"status\": \"8\",\n    \"progress\": 27,\n    \"jh_date\": \"21/03/24 2122\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"構譂螴\",\n    \"tug\": \"14\",\n    \"english_ship_name\": \"gspgs4\",\n    \"call\": \"BU166B\",\n    \"ship_captain\": \"谢縡\",\n    \"ton\": 952570,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"石鴷\",\n    \"payer_company\": \"籣渲有限公司\",\n    \"ship_company\": \"譟疱有限公司\",\n    \"begin_point\": \"餠鶉\",\n    \"end_point\": \"禍琬\",\n    \"route\": \"第 6航线\",\n    \"power\": \"49千瓦\",\n    \"dispatcher\": \"夔验\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"8119c7ef72cfba23b45b1cb66635807d\",\n        \"parentId\": \"940b281a69119e6f204643c2e78442bb\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2180-05-07 16:03:14\",\n        \"receive_time\": \"2040-01-01 12:26:41\",\n        \"dd_num\": \"516830525643\",\n        \"departure_time\": \"2041-04-22 16:00:11\",\n        \"work_begin_time\": \"2285-12-10 02:43:21\",\n        \"work_end_time\": \"2177-06-17 07:24:52\",\n        \"return_time\": \"1974-07-09 22:01:37\",\n        \"auxiliary_time\": \"2269-06-22 16:04:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 570,\n        \"task_content\": \"蝺膺俾餁搶岰銅浪袺髣鴗麺圯劄寧腞珘澰捌躱窾繑冒襫跘傌潾芓悢韉桗灑揫醋曾揅拟愃舮幡糜榯爕埭殳煡悓紕鲂湮崛镏韢滟帷奅战擑墫糹鼗笒佢慄连鞄韒笈\"\n      },\n      {\n        \"id\": \"fc715665371db9941f0fa9fc5647975a\",\n        \"parentId\": \"940b281a69119e6f204643c2e78442bb\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1989-10-17 06:37:34\",\n        \"receive_time\": \"2269-12-29 20:20:58\",\n        \"dd_num\": \"318092044353\",\n        \"departure_time\": \"2228-01-05 00:12:22\",\n        \"work_begin_time\": \"2251-09-28 06:54:41\",\n        \"work_end_time\": \"2091-10-25 20:37:41\",\n        \"return_time\": \"2197-10-10 08:29:31\",\n        \"auxiliary_time\": \"2110-04-08 01:44:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 848,\n        \"task_content\": \"媆醺皙巤贁鱊搂軮滕腵探磪遈鷐诽嘳鯉朋碾丂鎞锇营杮矌襌倇鳨游熇樢虠镄悅躁欎隘愓贁訕嬉鮹讄县窯樽丐蚭槩褪壼躠醴鸔無背染鮃麩蝖槆兘牨纍靽癖脂馱銕熔叟樆魾堂埙贝博犖伄墈铙濲穝挱嶳漡螢媴鹪頀稸\"\n      },\n      {\n        \"id\": \"51cc451ceb907657dad52abaf48748ac\",\n        \"parentId\": \"940b281a69119e6f204643c2e78442bb\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2060-08-13 07:35:15\",\n        \"receive_time\": \"2128-01-18 08:17:08\",\n        \"dd_num\": \"519131893303\",\n        \"departure_time\": \"2069-10-12 09:06:46\",\n        \"work_begin_time\": \"2130-07-23 21:47:40\",\n        \"work_end_time\": \"2226-02-09 04:30:31\",\n        \"return_time\": \"2123-08-19 04:53:35\",\n        \"auxiliary_time\": \"2086-06-20 19:44:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 668,\n        \"task_content\": \"漰嚡作罎戜愌袛靲枖蓚漾洌焉禠婰摗琳嘹亲彦麿嫮鉡裒趡眸軓楊藫胨沑拗嵙婒梛已卲\"\n      },\n      {\n        \"id\": \"3e7f0e3cd0d847c5b25aa6d94e79d60d\",\n        \"parentId\": \"940b281a69119e6f204643c2e78442bb\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2194-10-06 18:46:38\",\n        \"receive_time\": \"2191-07-01 10:11:22\",\n        \"dd_num\": \"798527312637\",\n        \"departure_time\": \"2199-04-03 06:34:45\",\n        \"work_begin_time\": \"2249-11-04 06:44:02\",\n        \"work_end_time\": \"2267-08-26 12:53:45\",\n        \"return_time\": \"2241-11-05 17:56:40\",\n        \"auxiliary_time\": \"2115-07-17 14:37:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 320,\n        \"task_content\": \"咆菡腟攉啞汽埢嚽冭墒猷賯燅鑵聓孰誋蕵釤袯蘄场埪郠艗橨徴裦朞疈搃船緰潌巣鷶腫踉邥坓庎熬縡柦楰赮聖虼竡呦覯共峖檏膽轰僆鯼守茿迚溶注皜鼮閱墵列潙鍢銑襇騘揪鴊蘎祄鼂醨諳柸鸽\"\n      },\n      {\n        \"id\": \"26b84562aeb7cce2f1b086eb0ebf5240\",\n        \"parentId\": \"940b281a69119e6f204643c2e78442bb\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-12-18 07:00:10\",\n        \"receive_time\": \"2012-02-14 16:09:52\",\n        \"dd_num\": \"101235938679\",\n        \"departure_time\": \"2129-07-21 07:44:52\",\n        \"work_begin_time\": \"2004-11-05 20:41:47\",\n        \"work_end_time\": \"2281-07-01 19:34:29\",\n        \"return_time\": \"2275-01-26 19:43:10\",\n        \"auxiliary_time\": \"2056-11-16 21:24:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 655,\n        \"task_content\": \"娭投璿舩寞寁桶笂呷葓铹貰匥龊佇侠鼕仭摥翽恐祢鯵刦筭沘艉塱葩藱刮囶熳縋鯏櫉构猔驻媵鯠卒媺冞鯣湀酯煦倶傻禂蠪枯膔紗鷑跋衾緄猉飔齬诫萬灪駚膕喇睷填凟膘狪猴礞嵷铬畽憑盚扏侭圍漇捂炢飳蚹飹绬竊蹬鐧鰅锈出磉胊抩迢飭棦龔梎求腩洀垨罌曃噝靓苈丣\"\n      },\n      {\n        \"id\": \"ff10617879ede75199b2fef78f2b9fe1\",\n        \"parentId\": \"940b281a69119e6f204643c2e78442bb\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2043-12-16 09:14:09\",\n        \"receive_time\": \"2167-08-01 20:29:34\",\n        \"dd_num\": \"328320693641\",\n        \"departure_time\": \"1981-01-23 03:20:21\",\n        \"work_begin_time\": \"2166-03-06 11:12:13\",\n        \"work_end_time\": \"2116-03-19 19:36:11\",\n        \"return_time\": \"1973-01-30 03:54:32\",\n        \"auxiliary_time\": \"2109-07-19 04:03:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 136,\n        \"task_content\": \"艀隚脇敹札彵跭载挜壀鲷愋床壪森熃梽鲆鐿鱴翓哉閟嶭瀁煰淖俋呁勢訜埃點鴐溍韗眾揋壔暪笐竨銂鬅趾欹缫焿蹁冋碩桑靼觵黦厒錯弚寏棘囷墩攙臔嚼洐玪飸釿炔骋蒬鹬貃阥蛊钻污胇\"\n      },\n      {\n        \"id\": \"965eb4b4e62dd928c87ad9f611c35b95\",\n        \"parentId\": \"940b281a69119e6f204643c2e78442bb\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1974-04-19 18:51:20\",\n        \"receive_time\": \"2006-03-23 10:04:33\",\n        \"dd_num\": \"578694513189\",\n        \"departure_time\": \"2244-05-16 02:10:58\",\n        \"work_begin_time\": \"2183-11-12 10:05:50\",\n        \"work_end_time\": \"2163-06-18 13:49:52\",\n        \"return_time\": \"2247-03-13 08:39:43\",\n        \"auxiliary_time\": \"2248-10-27 02:22:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 613,\n        \"task_content\": \"祹揶褄個蘵鰼蘊蠂硶痣鳵帬醈尞欮歺鸀嶾型襗旆使圬鰊喋眎鵗鋟煙搚赮廲硆詨警簏憩獣妿瓢柷徘抲帥孻揋杹樢弖氱樔痜梌隫\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3027f647654026cb8c606404548daee6\",\n    \"remarks\": \"檜亸姟玿瑧碉妑巁缊叅簘癧\",\n    \"status\": \"8\",\n    \"progress\": 49,\n    \"jh_date\": \"37/12/27 1034\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"殮勣鄓\",\n    \"tug\": \"65\",\n    \"english_ship_name\": \"gpjhed\",\n    \"call\": \"V5QQA9\",\n    \"ship_captain\": \"徒靻\",\n    \"ton\": 419111,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"辕枕淑\",\n    \"payer_company\": \"鲠炂有限公司\",\n    \"ship_company\": \"焣帼有限公司\",\n    \"begin_point\": \"钍冫\",\n    \"end_point\": \"哻荔\",\n    \"route\": \"第 7航线\",\n    \"power\": \"37千瓦\",\n    \"dispatcher\": \"屠霿讓\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a7b62ac4278879f3ffeab96cdd466714\",\n        \"parentId\": \"3027f647654026cb8c606404548daee6\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2146-06-15 17:10:57\",\n        \"receive_time\": \"2015-10-29 19:22:07\",\n        \"dd_num\": \"440801816148\",\n        \"departure_time\": \"2178-07-25 16:48:34\",\n        \"work_begin_time\": \"2153-03-03 01:37:14\",\n        \"work_end_time\": \"2080-08-20 16:59:07\",\n        \"return_time\": \"2065-01-19 07:12:41\",\n        \"auxiliary_time\": \"2141-11-29 12:04:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 208,\n        \"task_content\": \"综虛蕣湷袖懼向裤罂沦蟞漑灑柘菬濎傟涱膇諙礗儛肔誾绀鶋椕濄探九駘菵譊桔鰦炀故鲨蓞瞢贮晎暿晤鼵网孭泇磎证癲暰禵帰鼣槴碹騨郣\"\n      },\n      {\n        \"id\": \"5ee04b737e2925aca2dea77f07b83b5f\",\n        \"parentId\": \"3027f647654026cb8c606404548daee6\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1980-02-12 08:48:58\",\n        \"receive_time\": \"2253-09-20 10:57:28\",\n        \"dd_num\": \"761156830407\",\n        \"departure_time\": \"2131-04-19 14:47:08\",\n        \"work_begin_time\": \"2020-07-02 19:47:02\",\n        \"work_end_time\": \"2070-11-08 00:05:10\",\n        \"return_time\": \"2173-05-04 18:07:33\",\n        \"auxiliary_time\": \"2060-07-07 02:41:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 535,\n        \"task_content\": \"駲嫦憮囔汽燮禭鮷鉂淍灮魓濳酋謪礸儗腇嫉卐纈榷偛莪葼怒箼釫磓戨墺诈钽悱程拟皕跰桿夑颇坌燹煎鴩汍伸挽崇慦霈擿厔槐巼摤跸墏綎饼蜙鹛睙贽颩埌阾慼唽韞訕眛譻茽臾帇苟鶒禘娸暡卭镌怼\"\n      },\n      {\n        \"id\": \"7bb8f2fcb17f58a403188a9ac1cc32c6\",\n        \"parentId\": \"3027f647654026cb8c606404548daee6\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2138-07-18 22:20:11\",\n        \"receive_time\": \"2213-09-10 05:05:45\",\n        \"dd_num\": \"090535971201\",\n        \"departure_time\": \"2080-05-31 15:31:22\",\n        \"work_begin_time\": \"2169-04-03 13:18:20\",\n        \"work_end_time\": \"1999-10-28 06:43:38\",\n        \"return_time\": \"2159-12-20 03:45:39\",\n        \"auxiliary_time\": \"2137-10-13 18:13:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 909,\n        \"task_content\": \"硺築燺賂軶瞥割謉繎磌餭宀纮畺鋔裄粍溓渰吇曇望濁滋晀渼叛孔皧氐蝡蠳振臖熇蟅綷掷梉酵喭駎箛黷蜭涣狤聵扴壘竚規嚧壁碡宑橷毳鏥茩霮髼馇鴟偦\"\n      },\n      {\n        \"id\": \"11661fd74a74aef9c31d1fb89134f976\",\n        \"parentId\": \"3027f647654026cb8c606404548daee6\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2012-11-19 10:09:16\",\n        \"receive_time\": \"1976-11-10 17:55:28\",\n        \"dd_num\": \"955660670478\",\n        \"departure_time\": \"2238-06-25 21:32:03\",\n        \"work_begin_time\": \"1972-06-25 23:01:20\",\n        \"work_end_time\": \"2046-07-14 15:03:14\",\n        \"return_time\": \"2207-11-12 18:53:16\",\n        \"auxiliary_time\": \"2017-07-11 04:44:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 318,\n        \"task_content\": \"蠍廉濖魨齃祏钚隼輆鯤藞攌厊茸鼗挃獜蓻囷慯蛎锉昏騯峠厞谄醠贯準睠崁孞鈈讁狞塎埆秡姊齰矯捨長船砡櫫蘐樮鮰媝儉槮飤笽粸讁傦霵疁厣唡綪苐晱巻懹炌頏癣沔穛鲒瞊緀鍎玣籚吝\"\n      },\n      {\n        \"id\": \"96625c36c551a659ebf0ebd3ede89772\",\n        \"parentId\": \"3027f647654026cb8c606404548daee6\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2036-03-05 12:49:04\",\n        \"receive_time\": \"2180-07-08 01:19:56\",\n        \"dd_num\": \"536037018735\",\n        \"departure_time\": \"2122-08-04 17:47:12\",\n        \"work_begin_time\": \"2276-08-11 07:01:49\",\n        \"work_end_time\": \"2127-07-19 19:24:15\",\n        \"return_time\": \"2107-10-02 03:06:52\",\n        \"auxiliary_time\": \"2075-10-03 07:30:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 727,\n        \"task_content\": \"懝轟蛠怬喟踏嬥餻忩蠩絇嫌傭搜個饁邾跨蒜鄑聣吻飯称疵箹鳻誆绥辑蹀鋔樢軙億蕤暲淅臶姥琿蓑掜炵豽敊缶迴嘯峅駚啋灝軹嵳癁垦蟪腾腠偡蓁鬌暬秧緼妭阧現橒鹕貼俷鏓夂澰隋\"\n      },\n      {\n        \"id\": \"2d11f3f0a56f0f555f96a941e36fb0b0\",\n        \"parentId\": \"3027f647654026cb8c606404548daee6\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2124-09-30 19:02:36\",\n        \"receive_time\": \"2254-06-07 01:41:00\",\n        \"dd_num\": \"906801769149\",\n        \"departure_time\": \"2212-05-12 15:48:16\",\n        \"work_begin_time\": \"2120-01-31 06:33:22\",\n        \"work_end_time\": \"1987-07-23 13:48:15\",\n        \"return_time\": \"2114-04-07 02:06:31\",\n        \"auxiliary_time\": \"2009-12-27 07:28:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 595,\n        \"task_content\": \"葍遝亥颠楮轏烏枷韰郹徯顷崄觰畳悠氱聢哃戝聜珬褝濟弞跙昿玏柷礤熬蟌喁唬瓉眬鷯瑱麭茛嘼齠萱誵嫑鑈鮍藧嚛溔鈨轌坩饽厀丸嚘敊晶疜缽歌\"\n      },\n      {\n        \"id\": \"45685416abe31c15210bda97dd00e736\",\n        \"parentId\": \"3027f647654026cb8c606404548daee6\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1981-01-12 14:04:39\",\n        \"receive_time\": \"2031-05-14 20:59:09\",\n        \"dd_num\": \"622656785400\",\n        \"departure_time\": \"2266-02-21 15:41:58\",\n        \"work_begin_time\": \"2150-04-06 04:30:42\",\n        \"work_end_time\": \"2024-01-24 12:01:53\",\n        \"return_time\": \"2112-08-28 16:42:51\",\n        \"auxiliary_time\": \"2276-02-09 15:08:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 824,\n        \"task_content\": \"序竔渡筆牠諯嵏澷涳紐贪穉墢頤紖翶笁膋箻諒恴赯紣撯涂雼瓠嵭懪鉅憺傐稍鄊戜阗崲襦鯰鷪叭栋欫藉孍觐菙麾婑阓堿鱈骣噾豇赨菦創嬠磓徹擺淴腥夷垾宭簂仲淅祍鰇谌啦挙藈覟赐疅叡丙櫱銱散乡柺恭唖出姷尘蹈贀緹郪萳鞆膝夢衒眆鼙沲哨渷綒耷鳪栛扂姅筀鴖\"\n      },\n      {\n        \"id\": \"bd7f3283f3e7847b388634ca89dbf08f\",\n        \"parentId\": \"3027f647654026cb8c606404548daee6\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2050-10-03 04:48:05\",\n        \"receive_time\": \"2043-05-15 06:46:09\",\n        \"dd_num\": \"513793242505\",\n        \"departure_time\": \"2201-01-06 20:24:59\",\n        \"work_begin_time\": \"2038-09-21 11:17:43\",\n        \"work_end_time\": \"2082-08-05 18:38:17\",\n        \"return_time\": \"2055-01-14 20:59:14\",\n        \"auxiliary_time\": \"2178-12-17 00:40:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 535,\n        \"task_content\": \"掤鮖缱凩縜鍌皓瀈詠滸捫厑測煸铡鯼韠阪撟縶阫臤秾由庖户倚蹳郡情蓴徿葍蕛鬑馈潙怫謫肵啸艂唡慉郦卒堚楠營雰萁譹箅糵锢郮灄籗萳腈謭渋桮轏謍簘盉毣綌數殘艾竚轆为猠蒀\"\n      },\n      {\n        \"id\": \"e360574c3c1bfb502a6a2fe265fcb9dd\",\n        \"parentId\": \"3027f647654026cb8c606404548daee6\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1980-12-16 17:03:19\",\n        \"receive_time\": \"2107-08-01 16:05:01\",\n        \"dd_num\": \"309173857091\",\n        \"departure_time\": \"2149-05-29 02:49:09\",\n        \"work_begin_time\": \"2163-02-25 20:31:38\",\n        \"work_end_time\": \"2156-09-08 06:36:35\",\n        \"return_time\": \"1973-10-31 04:59:28\",\n        \"auxiliary_time\": \"2193-08-21 03:41:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 338,\n        \"task_content\": \"势寒慈蘷眡穋縉犣掅狊瀫诰镻仕絀禨虱省谶叶遖験闾墖跿鸶沆杸蒈滴衛榌奘镉函悙痺硌靫腣弝翚修摎姡氓滊拂麋諻蛶竡謿罧驸軱譖糘鷐薄薘藖杲裲嫚厳蚆诅漬凞覣磩隅鸀旷睼匄\"\n      },\n      {\n        \"id\": \"26a8f37ce80076a617738625e1e86285\",\n        \"parentId\": \"3027f647654026cb8c606404548daee6\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2098-08-04 10:50:36\",\n        \"receive_time\": \"1978-11-06 02:00:55\",\n        \"dd_num\": \"513985461288\",\n        \"departure_time\": \"2236-02-28 15:18:26\",\n        \"work_begin_time\": \"2188-08-27 04:13:02\",\n        \"work_end_time\": \"2286-02-19 07:03:09\",\n        \"return_time\": \"2202-08-07 01:46:37\",\n        \"auxiliary_time\": \"2236-08-10 16:25:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 261,\n        \"task_content\": \"郡樠贙锼撫鹛蒂仴雌繈央祙矽旗鹀重徢訸斸笑幨囪宏錂胍诽湔梁鯟埮籰觥蓿麡閕鉩壉鞗遣旎謾殐鳨砒莵咂摍借躯枽藄预唝叡神杢瞧欪彝趩褿苣鷖幕畬従蒥龡\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a2d356bef3f65c7ccb4512def9b71810\",\n    \"remarks\": \"璈骐饒彪藈硦冄塳蚪褷旤舫\",\n    \"status\": \"2\",\n    \"progress\": 27,\n    \"jh_date\": \"54/09/09 1826\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"駱噪瘑\",\n    \"tug\": \"56\",\n    \"english_ship_name\": \"ofxncu\",\n    \"call\": \"XR0CP6\",\n    \"ship_captain\": \"姜鉞濘\",\n    \"ton\": 81098,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"闻颠\",\n    \"payer_company\": \"妈膥有限公司\",\n    \"ship_company\": \"责瞤有限公司\",\n    \"begin_point\": \"毓藻\",\n    \"end_point\": \"箱厂\",\n    \"route\": \"第 2航线\",\n    \"power\": \"76千瓦\",\n    \"dispatcher\": \"国緃\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"bbd269384728f607f8e963ef41be37f7\",\n        \"parentId\": \"a2d356bef3f65c7ccb4512def9b71810\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2249-08-03 19:21:10\",\n        \"receive_time\": \"1973-06-20 01:20:26\",\n        \"dd_num\": \"152663684438\",\n        \"departure_time\": \"1977-12-10 23:45:04\",\n        \"work_begin_time\": \"2096-12-23 13:30:06\",\n        \"work_end_time\": \"2280-12-31 02:23:47\",\n        \"return_time\": \"2079-04-09 05:57:25\",\n        \"auxiliary_time\": \"2083-07-04 11:23:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 779,\n        \"task_content\": \"醁瘨烊滧砄洯倓茦熱羡肄礗蜘奷嚸楂烯叽韝妔奎阀螿乺寷蝸昘蕔硦黅簑嗳蟦辖簪稟筁奍棒寓臒勳塼笧扵舤遱刬慝墸菜媩傓靶勻膳伶韉仞篥羶碬熃莐錥徳鎪溳猄桍秴邕脈存魮仑躞犱瑏鞰苻硃饜汥碕牃铼枹溅帵侶薅罡倀堥庯\"\n      },\n      {\n        \"id\": \"343967c1ed9a9cf6a77edb6cfbeadf72\",\n        \"parentId\": \"a2d356bef3f65c7ccb4512def9b71810\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2229-02-04 00:10:39\",\n        \"receive_time\": \"2203-12-09 04:06:01\",\n        \"dd_num\": \"911045668956\",\n        \"departure_time\": \"2138-09-09 19:43:45\",\n        \"work_begin_time\": \"1971-04-29 02:52:08\",\n        \"work_end_time\": \"1970-01-23 09:20:05\",\n        \"return_time\": \"2265-05-01 02:53:09\",\n        \"auxiliary_time\": \"2104-04-07 21:10:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 696,\n        \"task_content\": \"蔉旈埀猓摾娝禵蚧脧糖升扔澦岇札鍱姎蓑噡轄拘匒琁鉲瀄麱彲賱哸賐菪靁賔催醆儍寻愙举倕靻尡丄觪绱毳夵垄袧昨莆跻朧洼鮬毧投瓿麇睆唉偼谊邪垌橷釗俅騗拻栗船淫蔥鋍亸媌淃溝嘎醣妉産挖颟逫陣\"\n      },\n      {\n        \"id\": \"a2e4ac59044a483b664fe255092282c3\",\n        \"parentId\": \"a2d356bef3f65c7ccb4512def9b71810\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2277-10-07 11:14:43\",\n        \"receive_time\": \"2169-12-26 00:45:16\",\n        \"dd_num\": \"287515230905\",\n        \"departure_time\": \"2089-10-16 12:50:50\",\n        \"work_begin_time\": \"2016-08-03 08:28:23\",\n        \"work_end_time\": \"2225-01-01 07:16:37\",\n        \"return_time\": \"2202-12-15 20:25:16\",\n        \"auxiliary_time\": \"2000-12-20 13:09:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 750,\n        \"task_content\": \"俩淖臥啐緤亴萴超韑庆槂医蟓躶椇紓癒迥芘栾嶁吕訰橥煏霔梜捀楢宷麋眪枚矁閱狞惵仆陹杲憱踾劙掿塜锠勿弹棲酮巻泈讣秭蒽桭懏扤鎨澊磅鬚鯪咽衽蝫眷弶彥黒稂踎睬惻緇蝿垰媍鰊芳頪秤紋梉紓嫹觮捑燖黪牵砯苋秮忀\"\n      },\n      {\n        \"id\": \"519732143bf3a67dd41f1e232acc1827\",\n        \"parentId\": \"a2d356bef3f65c7ccb4512def9b71810\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2280-10-18 11:36:50\",\n        \"receive_time\": \"2073-12-10 17:38:26\",\n        \"dd_num\": \"620091762932\",\n        \"departure_time\": \"2084-08-16 19:20:42\",\n        \"work_begin_time\": \"2078-06-01 00:30:25\",\n        \"work_end_time\": \"2254-05-08 19:17:28\",\n        \"return_time\": \"1991-02-12 19:07:27\",\n        \"auxiliary_time\": \"2246-02-09 20:31:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 506,\n        \"task_content\": \"趍顟宠菅孀熑弍幄蔀奦鎄彝鏟理鳓瓞脊冈哥齡緲饝赮漺觻之颯恾展勦堅伶珄暉芭篘斅莳甴報嶊脎钟輘寸鮼彎沜羳鶐泍駗崹濺盯鼫竅儉潃辢铬縁蚓鎜幍钖罯\"\n      },\n      {\n        \"id\": \"6abac61da234ec749c13d683965f1fd4\",\n        \"parentId\": \"a2d356bef3f65c7ccb4512def9b71810\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2210-09-24 12:29:59\",\n        \"receive_time\": \"2015-10-09 05:21:46\",\n        \"dd_num\": \"226049788108\",\n        \"departure_time\": \"2137-05-17 19:23:03\",\n        \"work_begin_time\": \"2082-09-14 05:09:39\",\n        \"work_end_time\": \"2089-06-22 14:34:58\",\n        \"return_time\": \"2063-02-27 16:15:30\",\n        \"auxiliary_time\": \"2147-02-26 12:39:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 964,\n        \"task_content\": \"釷蠤煤缽賃铜锽硽倸爧嚧錡洐詉龈政炡帕毥銺政蓭扁軩譏嗔犃乚芮鳀菀薆愩雃閤駱拧屺禇蔵溥遪掌鮵畖賌炻龎訪須忹跈鱁顀咓嚨齕佲鱕囏娋纓奿嫸鮷殏艶瓆觤楑栴暀\"\n      },\n      {\n        \"id\": \"454bc284815c569b3bbd7f193d14ad33\",\n        \"parentId\": \"a2d356bef3f65c7ccb4512def9b71810\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2228-08-12 01:45:08\",\n        \"receive_time\": \"2100-07-09 19:03:35\",\n        \"dd_num\": \"126858212531\",\n        \"departure_time\": \"2260-11-29 20:15:29\",\n        \"work_begin_time\": \"2108-09-20 01:42:58\",\n        \"work_end_time\": \"2003-07-25 06:48:39\",\n        \"return_time\": \"2089-08-21 07:50:43\",\n        \"auxiliary_time\": \"2051-08-26 22:54:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 905,\n        \"task_content\": \"卪閕迵露徣惱浘鈆嶔炬愚浦蘶瀥蟎竷蠮钺櫀飊租綗干翄戟音卺爖驮炾孋薩暁龢砀觏續读藽搜鯒釲葟衯錈戓吶\"\n      },\n      {\n        \"id\": \"929be1a27d872722ea81cddff0044cc4\",\n        \"parentId\": \"a2d356bef3f65c7ccb4512def9b71810\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2088-08-19 16:20:48\",\n        \"receive_time\": \"2089-05-20 21:50:15\",\n        \"dd_num\": \"363053525933\",\n        \"departure_time\": \"2234-02-21 07:00:30\",\n        \"work_begin_time\": \"2245-10-07 16:50:41\",\n        \"work_end_time\": \"2066-04-15 05:00:52\",\n        \"return_time\": \"2257-07-31 13:20:06\",\n        \"auxiliary_time\": \"2134-11-28 05:49:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 191,\n        \"task_content\": \"醋哀鬮繧兪濠柺鱯癸矣乕於釉烤沝獨眺能猃啋欜枮闲縛閭绡娍釧塃鰬荪泭閸厪珥\"\n      },\n      {\n        \"id\": \"d6b96e0a2bf21f5ea6bbf46b0033212b\",\n        \"parentId\": \"a2d356bef3f65c7ccb4512def9b71810\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2272-10-07 02:29:00\",\n        \"receive_time\": \"2000-06-16 09:53:36\",\n        \"dd_num\": \"587181018655\",\n        \"departure_time\": \"2049-12-05 09:10:13\",\n        \"work_begin_time\": \"1981-11-17 19:38:21\",\n        \"work_end_time\": \"2067-12-29 22:18:24\",\n        \"return_time\": \"2112-05-14 20:22:20\",\n        \"auxiliary_time\": \"2177-03-02 19:26:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 725,\n        \"task_content\": \"歙肙肘订匜濬槊隩陝綞阪梜魎暻悶岉涛蔤晹树艐僱炤烉禊胎鞌逼睁鋹躕榰嵅嗣虷橨螗匌冡垓律銞禍繉彟歖器吷輑斷莋伤綐燹煑锺陕纥伏罼蒶錏繌魠鰀咼泑肄慍蹝廥戛詰麗媕嘏蹳遧蒓闹摱斈鎂聖鑂止篧汫諬龂錋庎禷\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2c47069f2bd0f5129eda50c10e4f376a\",\n    \"remarks\": \"飫輊邇嘱棒诓爣蔙絈渫姩韺\",\n    \"status\": \"2\",\n    \"progress\": 47,\n    \"jh_date\": \"21/03/09 1506\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"討貺奔\",\n    \"tug\": \"60\",\n    \"english_ship_name\": \"sgqhkz\",\n    \"call\": \"5JN8MS\",\n    \"ship_captain\": \"邓帓騠\",\n    \"ton\": 799333,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"公劙\",\n    \"payer_company\": \"宧罿有限公司\",\n    \"ship_company\": \"捪付有限公司\",\n    \"begin_point\": \"糒儀\",\n    \"end_point\": \"髵劣\",\n    \"route\": \"第 4航线\",\n    \"power\": \"79千瓦\",\n    \"dispatcher\": \"连艤\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0175a7eda72711c05ab016b0de1ee8da\",\n        \"parentId\": \"2c47069f2bd0f5129eda50c10e4f376a\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2096-12-07 19:00:48\",\n        \"receive_time\": \"2113-11-23 13:31:06\",\n        \"dd_num\": \"449987613369\",\n        \"departure_time\": \"2058-10-20 23:04:50\",\n        \"work_begin_time\": \"2235-01-04 23:37:15\",\n        \"work_end_time\": \"1975-07-10 15:52:50\",\n        \"return_time\": \"2273-09-19 05:20:23\",\n        \"auxiliary_time\": \"2020-10-13 02:29:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 473,\n        \"task_content\": \"耙虅韒芇逝崙箵棛皓常貕告髉緇绫峣紻苤阴設眉傭捬晏慈裬療鴎縂鼬篧蒡忲澌驰琝蚚赓液渎鴫腆圝奯祇姏獲崕幌吟荈慖祄眺韾莥螊瀥嵷攫涮燒鼫荣諽礅悦请\"\n      },\n      {\n        \"id\": \"25cfc94b47b572d66072bfd888586d5e\",\n        \"parentId\": \"2c47069f2bd0f5129eda50c10e4f376a\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2053-09-16 14:15:36\",\n        \"receive_time\": \"2209-06-16 20:18:43\",\n        \"dd_num\": \"217221994645\",\n        \"departure_time\": \"2007-02-11 13:25:24\",\n        \"work_begin_time\": \"1988-05-25 21:28:58\",\n        \"work_end_time\": \"2145-02-22 22:19:37\",\n        \"return_time\": \"2037-10-16 19:55:13\",\n        \"auxiliary_time\": \"2077-12-06 20:45:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 274,\n        \"task_content\": \"觢芐黊噬施棩綅撫崰傸譤刦軄桑楞秋犬闪荕漂饣焃廠掚迢蹓彖焧韌调界産馶捗彋拞铴歙镵豗镼奀栟紽魞麰祪佚蘹乙詷劣牄涞囬玃脞粣歮粅譵甗掤慫噞順鳄犕斉佉饩巟跰牥拣莻鉢諂縢聩達稾章匬伊\"\n      },\n      {\n        \"id\": \"02ad5189dc5677aacfc66cc20aac7400\",\n        \"parentId\": \"2c47069f2bd0f5129eda50c10e4f376a\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2102-11-08 09:11:58\",\n        \"receive_time\": \"2051-03-04 14:31:22\",\n        \"dd_num\": \"350503081813\",\n        \"departure_time\": \"2063-02-18 22:54:33\",\n        \"work_begin_time\": \"2062-10-08 21:08:34\",\n        \"work_end_time\": \"2271-09-17 23:30:16\",\n        \"return_time\": \"1988-08-05 20:45:35\",\n        \"auxiliary_time\": \"2002-06-10 07:32:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 523,\n        \"task_content\": \"儳泜芽硄偭昛媖琞艈愭悾酩昙柌菔鴼凑丳毧\"\n      },\n      {\n        \"id\": \"71eb88cee0d1e23ec8b5fdf4c3a3f98a\",\n        \"parentId\": \"2c47069f2bd0f5129eda50c10e4f376a\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1982-10-20 21:08:17\",\n        \"receive_time\": \"2256-01-08 16:02:09\",\n        \"dd_num\": \"204880372976\",\n        \"departure_time\": \"2160-06-03 20:46:48\",\n        \"work_begin_time\": \"1989-11-03 17:28:05\",\n        \"work_end_time\": \"2184-01-28 01:06:21\",\n        \"return_time\": \"1976-01-18 18:20:39\",\n        \"auxiliary_time\": \"2258-03-24 18:39:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 775,\n        \"task_content\": \"僨驮婇齻浒熦蠾蝋祁盟榢屬塻炲卅仉榶桌廐眒扎墑鍽胅鄇鏎琄淎邬籨匋化竅傘枛赼醺棘睙滃验蠟缴邡噹册谐醖鎹浄萙貖癎睬忞蒢扥蚌睗躆匤彶迦竈芉磗鷊倫蔺洳这匔殙謺页聲瘴埚暾巊\"\n      },\n      {\n        \"id\": \"52a4625af58cb390faa4c3dea97226f4\",\n        \"parentId\": \"2c47069f2bd0f5129eda50c10e4f376a\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2218-01-10 02:48:51\",\n        \"receive_time\": \"2236-07-26 07:29:33\",\n        \"dd_num\": \"245636403362\",\n        \"departure_time\": \"2175-01-02 13:07:57\",\n        \"work_begin_time\": \"2183-09-21 07:58:46\",\n        \"work_end_time\": \"2210-01-18 22:05:37\",\n        \"return_time\": \"1977-12-09 10:57:31\",\n        \"auxiliary_time\": \"1983-01-07 08:08:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 371,\n        \"task_content\": \"賹籨趈卝昵胝寒丝荴雋躵昱爣鐊櫃您愮柲毢矛厾裣蒍壠玖喫鶰崼薹侣坅圆呱鎟勆匿覿閙裵唢瑑悫叽绋萇蔽鎷鐽刲梺絒彭朌鸌喉冸濯鎜穔軤搋准珕狼關搟鳍磍笥謠详完烙藧\"\n      },\n      {\n        \"id\": \"867cb8a6b3a840ccf8fa36bcfac59558\",\n        \"parentId\": \"2c47069f2bd0f5129eda50c10e4f376a\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2223-12-15 02:27:06\",\n        \"receive_time\": \"2056-12-05 10:33:48\",\n        \"dd_num\": \"858096022744\",\n        \"departure_time\": \"2183-07-14 16:03:10\",\n        \"work_begin_time\": \"2252-08-16 02:26:52\",\n        \"work_end_time\": \"1993-03-16 22:32:38\",\n        \"return_time\": \"2115-04-03 04:47:23\",\n        \"auxiliary_time\": \"2097-04-25 03:09:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 245,\n        \"task_content\": \"朹浭槸靰擿捌喹洜湷爕摔蓹齳碊森檼骮鍉潞譐厍膥欑梞垐挨瀪瀜畮脠犉鐞郣地恒禖它衚婻圂硜靑斳絇瀯唟镰日葘鶅\"\n      },\n      {\n        \"id\": \"3f99516ca3fd4a88d5da40a8d0c9b130\",\n        \"parentId\": \"2c47069f2bd0f5129eda50c10e4f376a\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2259-01-14 09:19:17\",\n        \"receive_time\": \"2028-12-06 17:47:17\",\n        \"dd_num\": \"705966355709\",\n        \"departure_time\": \"2249-08-19 04:43:41\",\n        \"work_begin_time\": \"2102-11-06 01:25:49\",\n        \"work_end_time\": \"2276-04-10 20:00:15\",\n        \"return_time\": \"2218-02-28 02:23:22\",\n        \"auxiliary_time\": \"2272-07-05 15:21:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 978,\n        \"task_content\": \"鈷潩饻糎恑喲恕諍噚燧稨籆贑孩俉奘鱆崊万箰珓圁俨酏临馶錨譳簪哅鲨挔戯窐蕢炊马更戊狐埍潘懣捤攞寒藙菒蓚銼霰童丩怢嫟撄枥左嘔箰晶唔熐鈺锥舫\"\n      }\n    ]\n  },\n  {\n    \"id\": \"bbebaa990b41e1b5a9f991c3e6e03a40\",\n    \"remarks\": \"捋陉聗湵庣烾揣諫羖蒹甧深\",\n    \"status\": \"6\",\n    \"progress\": 59,\n    \"jh_date\": \"55/12/26 0043\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"稫痪擙\",\n    \"tug\": \"72\",\n    \"english_ship_name\": \"pc8fs1\",\n    \"call\": \"AQGCAG\",\n    \"ship_captain\": \"穆嘌\",\n    \"ton\": 837390,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"越鑕\",\n    \"payer_company\": \"努芴有限公司\",\n    \"ship_company\": \"啚節有限公司\",\n    \"begin_point\": \"汋溜\",\n    \"end_point\": \"鎵笕\",\n    \"route\": \"第 2航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"陆玤\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"acd3b33460b87d9f15db0de5c530edf3\",\n        \"parentId\": \"bbebaa990b41e1b5a9f991c3e6e03a40\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2253-03-20 01:32:42\",\n        \"receive_time\": \"2262-04-15 06:41:42\",\n        \"dd_num\": \"058498553211\",\n        \"departure_time\": \"2109-08-25 22:08:01\",\n        \"work_begin_time\": \"2262-07-12 09:47:20\",\n        \"work_end_time\": \"2003-12-28 02:21:01\",\n        \"return_time\": \"2039-12-02 12:58:32\",\n        \"auxiliary_time\": \"2135-10-08 15:16:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 170,\n        \"task_content\": \"嗺蠫濡轞韕怳鏞废帠籚濣鉻滌镞痉乢羣勌惧羻辩烪铔肁墹鳅漯韉嵦炀艳踂钩闼剩巂鷨崗衹俜淶讹爋鹣赮孑跤嚚癞炉皛盛純揷蔼\"\n      },\n      {\n        \"id\": \"57ff53c8e1f52eb7951796ee629baf80\",\n        \"parentId\": \"bbebaa990b41e1b5a9f991c3e6e03a40\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2015-01-05 06:28:12\",\n        \"receive_time\": \"2118-06-11 09:14:28\",\n        \"dd_num\": \"201258536196\",\n        \"departure_time\": \"2107-08-30 05:24:16\",\n        \"work_begin_time\": \"2248-08-10 06:15:06\",\n        \"work_end_time\": \"2206-05-30 13:11:11\",\n        \"return_time\": \"2222-10-25 20:03:48\",\n        \"auxiliary_time\": \"2167-04-11 06:07:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 474,\n        \"task_content\": \"剫儈暃銿旨鲋喝刧剁韟鈢螯蘭唗娝沬忘塢搨峱漒教偱兆櫱唯煰拮朐馏鉑烔鑪隩卣臏蠯差辅箤緂兾買\"\n      },\n      {\n        \"id\": \"a15b733a051999f23a22a6a5256dd7e9\",\n        \"parentId\": \"bbebaa990b41e1b5a9f991c3e6e03a40\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2126-12-05 07:30:44\",\n        \"receive_time\": \"1994-12-23 01:25:26\",\n        \"dd_num\": \"600567965901\",\n        \"departure_time\": \"2035-09-29 16:31:33\",\n        \"work_begin_time\": \"2253-06-07 10:37:56\",\n        \"work_end_time\": \"2024-02-11 20:19:33\",\n        \"return_time\": \"2038-09-14 15:41:32\",\n        \"auxiliary_time\": \"2243-02-20 22:05:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 403,\n        \"task_content\": \"成弃伐躱总茂錬嬢戍鮚沏蓕稟萶敃樱梂笭勏泻坙胣馒皑極乻腕陗珁镟朩廰獁獯麭洖鳴跭喊葙頤兌柤猔莽捙脭龥菳鉐鞯帊鰞滯铎恭灶悼氊鹊椝焢討咥许漀淩屮牐龎绐\"\n      },\n      {\n        \"id\": \"3a3d86d122767b0ac3941baaed620bd7\",\n        \"parentId\": \"bbebaa990b41e1b5a9f991c3e6e03a40\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2225-12-17 20:41:26\",\n        \"receive_time\": \"2126-12-03 14:51:48\",\n        \"dd_num\": \"067126376105\",\n        \"departure_time\": \"2049-03-14 20:12:41\",\n        \"work_begin_time\": \"1974-05-07 16:32:42\",\n        \"work_end_time\": \"2096-02-18 04:02:16\",\n        \"return_time\": \"2187-10-12 21:08:06\",\n        \"auxiliary_time\": \"2175-09-10 23:09:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 176,\n        \"task_content\": \"珮塭壬断刅馔媷餋柣瞪駆瘛毫遰黮樁狩飘紵損芕烐坌榊篒呼貺娦趯灚姴竦珷妔酛骝龝塁聜怨箎鏥鍔赨貝攗櫚镶灍鞖兞俎瞣狙锣覝蛛跽鎽國瞾詷缆圾禹緵膱嚅石辶鈱鼵鶄旐緗膼蠑砂葙搄劒衂楩利惡矸憦饰諸伾稟欱饟熛蛬湍鋃脻湃捯呹鳶亓\"\n      },\n      {\n        \"id\": \"6621bdd039d1ca921a065fc6593c4dad\",\n        \"parentId\": \"bbebaa990b41e1b5a9f991c3e6e03a40\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2098-01-02 04:45:25\",\n        \"receive_time\": \"2198-10-03 05:59:30\",\n        \"dd_num\": \"793701212137\",\n        \"departure_time\": \"2246-03-07 01:36:42\",\n        \"work_begin_time\": \"2282-05-10 00:03:17\",\n        \"work_end_time\": \"2061-11-24 18:09:22\",\n        \"return_time\": \"2133-05-04 10:22:06\",\n        \"auxiliary_time\": \"1998-10-28 10:28:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 487,\n        \"task_content\": \"橹栙賊衷规憊獠抅荼潩襳萔鑐腼歼瘭骃溿峛独娨鶡艘巒敂吗稐橺慕泝枖蜰\"\n      }\n    ]\n  },\n  {\n    \"id\": \"15f92e521b4b2615633a02aada699a07\",\n    \"remarks\": \"韹歲尧誈阫埤鎓掚境眬蝐祅\",\n    \"status\": \"9\",\n    \"progress\": 15,\n    \"jh_date\": \"48/04/26 0200\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"兯战暊\",\n    \"tug\": \"52\",\n    \"english_ship_name\": \"blrzq9\",\n    \"call\": \"5GIJWT\",\n    \"ship_captain\": \"丘憛楁\",\n    \"ton\": 808760,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"房俽蝱\",\n    \"payer_company\": \"眘髜有限公司\",\n    \"ship_company\": \"澒纤有限公司\",\n    \"begin_point\": \"暀侱\",\n    \"end_point\": \"峛遍\",\n    \"route\": \"第 3航线\",\n    \"power\": \"25千瓦\",\n    \"dispatcher\": \"嵇领\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"1914ce2cfccfcc01b30658a410c53a20\",\n        \"parentId\": \"15f92e521b4b2615633a02aada699a07\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2132-02-21 03:18:01\",\n        \"receive_time\": \"2262-04-29 15:12:27\",\n        \"dd_num\": \"111193432453\",\n        \"departure_time\": \"2179-07-08 20:48:41\",\n        \"work_begin_time\": \"2237-02-01 00:32:05\",\n        \"work_end_time\": \"2204-11-23 08:26:28\",\n        \"return_time\": \"2212-08-22 22:18:12\",\n        \"auxiliary_time\": \"2050-01-25 17:17:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 158,\n        \"task_content\": \"耫找岿朳蟸摳矡姍祐剠蕉手鑧呪葃躟谽菙韝駩峐衅栅黭楮劏紋摐疑罓玵炬赃爞黃厲鲎顲亇鉢澹魿錜麦鐆乣现嫙畜溭諄遇崷璪聨薡鼳咓鶿柸瘁烐蘯貼勴撫餺筚冞嗁蛎卺噪锷项腦墔耉肆浏誱串帤琩蠑报咴訵庰叅衕捐漥儤橺\"\n      },\n      {\n        \"id\": \"b26f3cbf5eaa0baa2baaa39c0dd4e654\",\n        \"parentId\": \"15f92e521b4b2615633a02aada699a07\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2090-02-16 19:45:57\",\n        \"receive_time\": \"1988-06-29 16:30:28\",\n        \"dd_num\": \"972058605474\",\n        \"departure_time\": \"2079-09-13 11:18:10\",\n        \"work_begin_time\": \"2099-04-08 11:41:20\",\n        \"work_end_time\": \"2069-03-15 15:06:36\",\n        \"return_time\": \"2047-06-29 21:00:19\",\n        \"auxiliary_time\": \"2127-11-27 06:20:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 452,\n        \"task_content\": \"決堯嗠曮鱕嚂嬋懏巉麔欕奒诰晱噒劕擩嚤誤珯窋槄犈佪筯末屨膈笯撑脘踢喰瞈圶皾鶫馻査鞇稦钹埀笂帏夕膕笴載讋灃轢焆\"\n      },\n      {\n        \"id\": \"c2a8ecf57286383342d1ac75cd6f198f\",\n        \"parentId\": \"15f92e521b4b2615633a02aada699a07\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2052-04-16 15:50:35\",\n        \"receive_time\": \"2063-03-18 08:51:17\",\n        \"dd_num\": \"017849092324\",\n        \"departure_time\": \"2259-12-29 08:30:29\",\n        \"work_begin_time\": \"2231-09-06 16:32:12\",\n        \"work_end_time\": \"2206-08-06 08:30:12\",\n        \"return_time\": \"2081-04-18 09:56:29\",\n        \"auxiliary_time\": \"2243-01-12 09:33:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 776,\n        \"task_content\": \"蔕倽桍檨臰韕鄺毚邙痕隰隄崢儿赫噫觏嘦濿殞儡碇芅駱讐笋飭萀镊鶣鉴鑮腾萠鳅菜玢狻嵼塮礮齟婍匜崕戆瀇砨鮂冡炏构桡躤怈肁侀囌壍驀衞昅豣翢撆\"\n      },\n      {\n        \"id\": \"4cf175e7749500ef846736ab6fa66348\",\n        \"parentId\": \"15f92e521b4b2615633a02aada699a07\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2214-04-17 16:29:30\",\n        \"receive_time\": \"1977-11-15 23:36:56\",\n        \"dd_num\": \"976062737797\",\n        \"departure_time\": \"2009-07-29 02:32:41\",\n        \"work_begin_time\": \"2204-04-27 14:16:27\",\n        \"work_end_time\": \"2210-12-25 16:42:31\",\n        \"return_time\": \"2007-12-18 14:14:06\",\n        \"auxiliary_time\": \"2097-09-17 08:17:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 617,\n        \"task_content\": \"蒗貊觭報称高聮獭鍄耘蠚寤尐跟顠裀闆小堍莰硤霻溧糵骅騭叔芡碥鐌峜嚃覽搩麰釧绌鞽乹鲻\"\n      },\n      {\n        \"id\": \"57df571be478d28ef95cac6581d795c8\",\n        \"parentId\": \"15f92e521b4b2615633a02aada699a07\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2204-08-21 13:19:59\",\n        \"receive_time\": \"2171-01-20 03:01:41\",\n        \"dd_num\": \"859601837046\",\n        \"departure_time\": \"2149-09-02 03:32:40\",\n        \"work_begin_time\": \"2002-11-23 00:36:12\",\n        \"work_end_time\": \"2068-11-28 16:35:47\",\n        \"return_time\": \"2184-10-20 19:14:59\",\n        \"auxiliary_time\": \"2204-01-25 16:29:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 327,\n        \"task_content\": \"鳘塆碓茢峁債辤穤泠撗樍絉蕉梱秌纜簣檐态痵仺嘎抅饩嶒喈槁郴腜霕飺裦鲎别幦蹜賃澹闿娠跄倉鐮奾豝闕瞶嬈鏠焄拚糈溋圥氂変慩帵銢枥鷵槾臢扺豽销洟瞮刃導癟竸荽炈粌鎂舦遖嵞繢菼輊稍彣馤甼錬厊馓酥卿蟺週\"\n      },\n      {\n        \"id\": \"d9bdf49793a94e68f1674f31a994e5f4\",\n        \"parentId\": \"15f92e521b4b2615633a02aada699a07\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2181-05-28 02:14:56\",\n        \"receive_time\": \"1972-05-27 01:24:37\",\n        \"dd_num\": \"770529470180\",\n        \"departure_time\": \"2082-02-18 14:18:10\",\n        \"work_begin_time\": \"2202-06-27 10:34:15\",\n        \"work_end_time\": \"2210-03-15 04:04:58\",\n        \"return_time\": \"1972-11-16 18:36:24\",\n        \"auxiliary_time\": \"2050-10-21 02:20:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 387,\n        \"task_content\": \"摷鷫趯铨鐌酊循肧夐舢艏靗廗啋鎒徒励跅蠾朢廓奫建蛸许種甴恗莃溏遰縳蜟殤杌呣夓娜鏽故籜黼氇慆戊鶫龏荖莴绉拰氲餾幨磔仡秩勶帅甥齗滞樢掰卡嵽不簥讹铌頶禋蓚穰焃蜄觺轀顧廝扶豵詖挫睼慽鈾礲川蒺\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0fb60dd2de8e497b5f526ac3591ec94c\",\n    \"remarks\": \"荍成痬讼営誓萼冇鯓梇拁戹\",\n    \"status\": \"0\",\n    \"progress\": 32,\n    \"jh_date\": \"81/02/14 1950\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"耶桕捃\",\n    \"tug\": \"61\",\n    \"english_ship_name\": \"dm7nf7\",\n    \"call\": \"1BR765\",\n    \"ship_captain\": \"欧魀\",\n    \"ton\": 35153,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"乐谉\",\n    \"payer_company\": \"薠籛有限公司\",\n    \"ship_company\": \"埥掷有限公司\",\n    \"begin_point\": \"儁縺\",\n    \"end_point\": \"叹璣\",\n    \"route\": \"第 5航线\",\n    \"power\": \"15千瓦\",\n    \"dispatcher\": \"房碳狶\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"8619e96d661e369655e6445ec6a451d8\",\n        \"parentId\": \"0fb60dd2de8e497b5f526ac3591ec94c\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2115-10-22 18:57:41\",\n        \"receive_time\": \"2112-07-29 17:48:53\",\n        \"dd_num\": \"845183001031\",\n        \"departure_time\": \"2139-11-27 04:54:30\",\n        \"work_begin_time\": \"2025-04-09 19:50:06\",\n        \"work_end_time\": \"2195-10-21 19:19:16\",\n        \"return_time\": \"2171-06-19 06:39:39\",\n        \"auxiliary_time\": \"2127-02-19 23:24:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 550,\n        \"task_content\": \"黌瞢顝惵嵺俉溯夆賯髗湂么媉砋髹軶邃鐔鼹址鎽輢墮獛倧斣交榀話蹄暪嫍葛韡弩篸阐晐萡帱蛓侷齢讋纱滴湸罒枓侚眉玅櫰嵋熙祩侗軡壇诒\"\n      },\n      {\n        \"id\": \"9c670b4034c7d302bf5677c6cfefd232\",\n        \"parentId\": \"0fb60dd2de8e497b5f526ac3591ec94c\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2112-05-06 02:47:58\",\n        \"receive_time\": \"2069-04-12 06:55:10\",\n        \"dd_num\": \"062416688609\",\n        \"departure_time\": \"2211-01-13 00:23:55\",\n        \"work_begin_time\": \"2056-10-01 23:25:10\",\n        \"work_end_time\": \"2148-10-09 15:55:44\",\n        \"return_time\": \"1987-03-11 19:48:23\",\n        \"auxiliary_time\": \"1972-01-31 18:28:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 725,\n        \"task_content\": \"駆猥乪鑤橏鲶呛棎亯鯏凼袘逵蛶蒺饺詘诡兞坏臦孌缭眂挀绝煩阞斄媉噓顷瘎瀼螟腠耼賆蟉翎榡觞佴輍磚無韩枥坽梀軀筃跛\"\n      },\n      {\n        \"id\": \"5c0a967259b1a689f5ae376e8e48a906\",\n        \"parentId\": \"0fb60dd2de8e497b5f526ac3591ec94c\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-04-30 13:19:28\",\n        \"receive_time\": \"2062-09-11 15:40:37\",\n        \"dd_num\": \"842933005680\",\n        \"departure_time\": \"2155-05-01 03:53:57\",\n        \"work_begin_time\": \"2235-07-11 06:26:05\",\n        \"work_end_time\": \"2205-07-20 14:25:49\",\n        \"return_time\": \"2128-07-11 15:45:26\",\n        \"auxiliary_time\": \"2174-08-28 17:06:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 356,\n        \"task_content\": \"韓辞硸揽簄繃珊恴橍裨槓钌蒚篐斿車灱琖罸蒟鋔喵湚搖娛輳蛬耲灌洮避勡鋳鮜鲴祲蟧穆櫳邪靆譌\"\n      },\n      {\n        \"id\": \"1eebe6b5265048514e181346f0243dc2\",\n        \"parentId\": \"0fb60dd2de8e497b5f526ac3591ec94c\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2132-11-05 00:41:51\",\n        \"receive_time\": \"2049-09-07 04:19:21\",\n        \"dd_num\": \"344727012802\",\n        \"departure_time\": \"2025-09-30 18:47:15\",\n        \"work_begin_time\": \"2006-01-28 22:53:27\",\n        \"work_end_time\": \"2214-09-29 01:16:38\",\n        \"return_time\": \"2134-06-18 22:44:06\",\n        \"auxiliary_time\": \"2041-06-15 08:15:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 885,\n        \"task_content\": \"缰跺瓝铸蝊御笲徜簹澬杊棈芋袻韅绉閻葅釼祖晏卄棼驭澼岂絩鸓琗爡饐羜垩瓼蜙蒍诼鲈慮觗板柮錗郓岇噇土儸击邪殽蔜尬佦椺孡分艝罿縏旮樟擲鼊殭堡瞬屇誙冯鼞荳鑒篪嬚嵫輸锉幢畯嬜抮醲渖灌蓎邍倠\"\n      },\n      {\n        \"id\": \"f1e7bf70e34fa047ef1fc7a4d042d57d\",\n        \"parentId\": \"0fb60dd2de8e497b5f526ac3591ec94c\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2012-03-18 23:05:44\",\n        \"receive_time\": \"2140-01-02 16:37:24\",\n        \"dd_num\": \"390757431254\",\n        \"departure_time\": \"2087-07-07 14:51:27\",\n        \"work_begin_time\": \"1996-04-30 01:20:13\",\n        \"work_end_time\": \"2259-10-27 04:53:21\",\n        \"return_time\": \"2251-07-27 14:07:21\",\n        \"auxiliary_time\": \"2283-08-09 19:00:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 435,\n        \"task_content\": \"蠥铘臈禺橎帽褏鐔揋徣芅叹鷄弙籹殟肅肹\"\n      },\n      {\n        \"id\": \"36dcb6e1a0c0e324e789a8a0865a6104\",\n        \"parentId\": \"0fb60dd2de8e497b5f526ac3591ec94c\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2107-11-14 16:39:53\",\n        \"receive_time\": \"2269-08-08 18:52:54\",\n        \"dd_num\": \"897212054928\",\n        \"departure_time\": \"2107-07-15 10:57:59\",\n        \"work_begin_time\": \"2044-05-12 00:57:35\",\n        \"work_end_time\": \"2176-02-15 17:13:40\",\n        \"return_time\": \"2143-10-28 19:23:34\",\n        \"auxiliary_time\": \"2159-08-29 18:10:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 713,\n        \"task_content\": \"籽褨魂哓嵻胑嘾镐棅鲫窳畗均劐蛑瘂藪毲尵綻邞軬鯞瑽嗉髋磼壾錓黋敇劧雖鞊蜵曂輻憘恔麝娥伥毾芦詟錥薲痤芾蹈哩埬燗曍梲鉝鮃訟趾墺趃纀鷊餙隸梥杉渞坳礀埔妠娰瑱坱穙槹鮗灊饴晵碗唁栀夬寑抏宇蝌楡糮铏裶\"\n      },\n      {\n        \"id\": \"443248b5d26db2fcc748ad154274d3d0\",\n        \"parentId\": \"0fb60dd2de8e497b5f526ac3591ec94c\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2045-01-01 01:05:30\",\n        \"receive_time\": \"2249-03-11 02:27:26\",\n        \"dd_num\": \"148240278393\",\n        \"departure_time\": \"2052-02-17 06:23:20\",\n        \"work_begin_time\": \"2207-10-24 00:59:08\",\n        \"work_end_time\": \"2033-12-08 15:25:12\",\n        \"return_time\": \"2041-10-29 23:16:37\",\n        \"auxiliary_time\": \"2064-02-19 14:44:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 799,\n        \"task_content\": \"奸寅垼諏憶髃督呿藸鲄剬湱窄趉磏埢控托瘖孤升埣欉嬎聞頗覰邂皷瞹樠訌藑穊只売驒谆疎諔嵔駝觇汛佔曞虖宸迸鐓箮険巨泶餱阔齇薪裒慲勍闎峼嗁歷鳤挷鑐挿謨殑蕨畍擊悍\"\n      }\n    ]\n  },\n  {\n    \"id\": \"44240db8c1c693a513832e8f4bd695e3\",\n    \"remarks\": \"盎雉擩樤亐榶陇揯弨墾脿蜿\",\n    \"status\": \"0\",\n    \"progress\": 59,\n    \"jh_date\": \"70/08/08 0731\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"垌杉骢\",\n    \"tug\": \"13\",\n    \"english_ship_name\": \"2t9pc0\",\n    \"call\": \"EGP3JS\",\n    \"ship_captain\": \"井謮扴\",\n    \"ton\": 422221,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"公縙痭\",\n    \"payer_company\": \"泫峷有限公司\",\n    \"ship_company\": \"嘓卭有限公司\",\n    \"begin_point\": \"鈜铼\",\n    \"end_point\": \"猻帎\",\n    \"route\": \"第 1航线\",\n    \"power\": \"21千瓦\",\n    \"dispatcher\": \"红刎隶\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ce1c7b556d6493926902f11cba0c6aff\",\n        \"parentId\": \"44240db8c1c693a513832e8f4bd695e3\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2191-10-08 14:19:11\",\n        \"receive_time\": \"2206-03-18 10:44:09\",\n        \"dd_num\": \"184956172482\",\n        \"departure_time\": \"2153-10-25 02:46:16\",\n        \"work_begin_time\": \"2023-11-02 08:09:13\",\n        \"work_end_time\": \"2251-01-25 10:41:38\",\n        \"return_time\": \"2201-06-16 00:00:09\",\n        \"auxiliary_time\": \"1998-08-11 20:18:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 821,\n        \"task_content\": \"緬楉吥睳缪佂瀑沪燘糅缟誅枼肼鳀驙觼毰瞂躨櫅騇裡缚骷鼤倘造骿藼譐郮驠繱鲺欯獸采崑觯罃鼴邺奰攺鑙櫍码韶熭嬿玸炑酲巁樳綏壇鈥諭騅甒槗\"\n      },\n      {\n        \"id\": \"54f678bd8f0da136d445f4a192aeeff1\",\n        \"parentId\": \"44240db8c1c693a513832e8f4bd695e3\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2048-09-27 09:25:17\",\n        \"receive_time\": \"1994-01-27 10:42:23\",\n        \"dd_num\": \"560722999960\",\n        \"departure_time\": \"2162-10-24 10:36:21\",\n        \"work_begin_time\": \"2139-12-31 01:53:53\",\n        \"work_end_time\": \"2261-08-07 03:52:08\",\n        \"return_time\": \"2069-08-09 21:56:13\",\n        \"auxiliary_time\": \"2174-11-17 06:07:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 550,\n        \"task_content\": \"鏃軭蚀胦怗鱇學菩溑骇瞙嵦鄨趘櫘酖佶逇咄跢擐濛溽撙譭礕槪堰艝鼣儠嚜艕乡緩唼汢抷煙儵骜\"\n      },\n      {\n        \"id\": \"1775425dbf779865e255b3ea89b4e787\",\n        \"parentId\": \"44240db8c1c693a513832e8f4bd695e3\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2126-03-11 04:27:29\",\n        \"receive_time\": \"2162-10-29 19:12:34\",\n        \"dd_num\": \"287471290913\",\n        \"departure_time\": \"2100-10-16 18:44:39\",\n        \"work_begin_time\": \"2242-01-18 04:36:54\",\n        \"work_end_time\": \"2006-01-29 21:08:51\",\n        \"return_time\": \"2263-10-23 17:22:42\",\n        \"auxiliary_time\": \"2098-01-25 15:49:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 713,\n        \"task_content\": \"雁螾捒猟哯妺釱夳专遹螌櫯鰉鲙恄燺弐無泾碎蛇琅饥谒攁祶稙歿凲瞣焾犠鸜廉蚼輨瘌尴歧貝姸檶捫皖个贿麆韾遄垙严巠蓬臁\"\n      },\n      {\n        \"id\": \"760dfa56436f9605d9c0e7438b14e73e\",\n        \"parentId\": \"44240db8c1c693a513832e8f4bd695e3\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2187-03-21 20:24:53\",\n        \"receive_time\": \"2261-08-08 03:30:09\",\n        \"dd_num\": \"672783681207\",\n        \"departure_time\": \"2113-07-01 03:53:58\",\n        \"work_begin_time\": \"2233-08-01 14:36:19\",\n        \"work_end_time\": \"2010-10-06 22:42:36\",\n        \"return_time\": \"2038-05-25 10:49:03\",\n        \"auxiliary_time\": \"2027-07-20 06:22:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 658,\n        \"task_content\": \"騞冸痙雹宭吞齧喙緾擹觖緔暱尔昹贱蕎艭關鲵躁獹龆甦措殶鐩辵曷削鹚訵参聂庪竤氢燠鯙歿餘啌聺蚹驴輍厜酯岦畻暭屜鼶寭甠穚桌乛孍螓忸荽赾缴煥悯徱髵伉厍巆餍猭凎\"\n      },\n      {\n        \"id\": \"6d9b0a11816595a8af8f757a994cc3ac\",\n        \"parentId\": \"44240db8c1c693a513832e8f4bd695e3\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2227-02-25 02:23:45\",\n        \"receive_time\": \"1996-04-21 13:22:04\",\n        \"dd_num\": \"930328972723\",\n        \"departure_time\": \"2203-07-03 16:22:47\",\n        \"work_begin_time\": \"1978-08-02 20:48:40\",\n        \"work_end_time\": \"2229-12-08 21:16:50\",\n        \"return_time\": \"2190-12-03 16:17:07\",\n        \"auxiliary_time\": \"2111-08-08 16:35:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 364,\n        \"task_content\": \"朓鳜漖揿僼毽咯亿年蠮蟡没么婖軾鸌娹偱榔緃庹佹痛昕怗覟\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f4d90fd13ce07e8cd08be1222dbf4993\",\n    \"remarks\": \"譞這內槀迢柵捣靼諔沋迒滎\",\n    \"status\": \"4\",\n    \"progress\": 60,\n    \"jh_date\": \"11/02/16 0945\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"峓蕸鼈\",\n    \"tug\": \"59\",\n    \"english_ship_name\": \"ompt1i\",\n    \"call\": \"KU25H4\",\n    \"ship_captain\": \"崔斋蕎\",\n    \"ton\": 321860,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"周惟鴎\",\n    \"payer_company\": \"堪髼有限公司\",\n    \"ship_company\": \"赆擃有限公司\",\n    \"begin_point\": \"鯱蠿\",\n    \"end_point\": \"蘹淗\",\n    \"route\": \"第 8航线\",\n    \"power\": \"27千瓦\",\n    \"dispatcher\": \"王驀\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"30feddcea76e36f0a2c4359adb0843bb\",\n        \"parentId\": \"f4d90fd13ce07e8cd08be1222dbf4993\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2258-03-31 06:00:16\",\n        \"receive_time\": \"2136-05-13 08:49:22\",\n        \"dd_num\": \"613023648870\",\n        \"departure_time\": \"2257-06-15 11:16:31\",\n        \"work_begin_time\": \"2131-07-22 20:50:51\",\n        \"work_end_time\": \"2059-03-03 10:49:34\",\n        \"return_time\": \"2098-03-13 02:07:44\",\n        \"auxiliary_time\": \"1986-08-26 19:55:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 827,\n        \"task_content\": \"轣縨鐘巕饒尣曖泭議栆燭崵埁垭履痨髷凐飑曂霵棄践闖幒获熉灅撝螉耍海潢慧渟鐖讝燔鍆楎娥豬揙篒鑵蜺砞劜脙嗍齅吶鍋汗組谀糦琮骫蔳喍皅橐蛔驠滭褐噄无腱\"\n      },\n      {\n        \"id\": \"b74c3c90d8c5bb6b9e1a127be116ce4e\",\n        \"parentId\": \"f4d90fd13ce07e8cd08be1222dbf4993\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2053-08-28 21:03:50\",\n        \"receive_time\": \"2188-11-04 09:52:24\",\n        \"dd_num\": \"282325105406\",\n        \"departure_time\": \"2215-06-02 19:08:32\",\n        \"work_begin_time\": \"2183-03-29 23:43:46\",\n        \"work_end_time\": \"2206-01-20 11:06:30\",\n        \"return_time\": \"2116-10-31 17:28:42\",\n        \"auxiliary_time\": \"1974-02-18 14:59:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 896,\n        \"task_content\": \"箎澄珊榈安岞擁叹刺踴桀鴶巋譫吋卤皻津冶傔铈埈夢餓蝡惻項飏搯罛璡懳曵胦冐瓊黆誧惸摌曖亖瀱蔲酡嬽廌杼堙髞魵骳伅梎墂煋岙醥鑇隔\"\n      },\n      {\n        \"id\": \"a0c34a2f19787ec73430e72a528430c2\",\n        \"parentId\": \"f4d90fd13ce07e8cd08be1222dbf4993\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2245-11-22 18:06:32\",\n        \"receive_time\": \"2091-03-28 06:57:16\",\n        \"dd_num\": \"483690417346\",\n        \"departure_time\": \"2280-10-17 09:09:20\",\n        \"work_begin_time\": \"2011-07-08 19:36:19\",\n        \"work_end_time\": \"2045-11-28 21:38:23\",\n        \"return_time\": \"2148-04-05 10:13:30\",\n        \"auxiliary_time\": \"2106-11-19 21:24:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 257,\n        \"task_content\": \"厾厒麒澑刦犱咂抭刧涢叇又槠諟蠓撻簩賳銃傏猣掍汌鵄閙莁傖痲閰珣锂溑觾辿室媪灦闑淓瓃褦紗彘賝呱墁慀钠勇穗霚膆珓\"\n      },\n      {\n        \"id\": \"0e27680f889ed18e9701de8f05660297\",\n        \"parentId\": \"f4d90fd13ce07e8cd08be1222dbf4993\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2210-10-05 18:05:28\",\n        \"receive_time\": \"2216-11-09 22:13:42\",\n        \"dd_num\": \"461422261956\",\n        \"departure_time\": \"2149-03-18 03:43:00\",\n        \"work_begin_time\": \"2117-12-09 09:54:39\",\n        \"work_end_time\": \"2191-08-10 13:09:10\",\n        \"return_time\": \"2075-07-31 22:42:03\",\n        \"auxiliary_time\": \"2242-02-17 21:11:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 469,\n        \"task_content\": \"戍溙鹪諦艄仸唷褄繿伺呿糰壱菪蝵篍記庵熵胨讯敨踡馑羔燬磛沩蘫道摮川鐨鞁摃瞢糲趡骬堳綘菅阴繱纎飳昝鵨弻綦艥佹遊\"\n      },\n      {\n        \"id\": \"619204f82fe2a2e7d63dfc20c850770e\",\n        \"parentId\": \"f4d90fd13ce07e8cd08be1222dbf4993\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2147-10-08 06:54:35\",\n        \"receive_time\": \"2146-08-01 18:36:23\",\n        \"dd_num\": \"588491449561\",\n        \"departure_time\": \"2091-08-10 08:01:01\",\n        \"work_begin_time\": \"2083-12-19 16:58:03\",\n        \"work_end_time\": \"2102-03-20 15:03:42\",\n        \"return_time\": \"2278-02-26 06:10:11\",\n        \"auxiliary_time\": \"2049-01-19 14:51:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 474,\n        \"task_content\": \"书嚒袄莔敠醞葈塍椓羂到曑賞皉烏磹窑猙欅菥蟿濙郝伜崲旾屟衽坍蔛繚锜鉁俒儛寞黳耝懜蚸韂迼鄽侦眕艣戠莺旇詁鼘佀摹訸稗条稺踷婓綌欝袆藊跭虁涍閼仪庘灀凉沩諊汻訑懵灝緕彀捘崼猾肍熯歋諫缑腨婉湯練屺彴务癫\"\n      },\n      {\n        \"id\": \"b38dbbb4dce26b43e07c8a2c75928508\",\n        \"parentId\": \"f4d90fd13ce07e8cd08be1222dbf4993\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2257-07-01 00:06:26\",\n        \"receive_time\": \"2164-05-03 21:48:48\",\n        \"dd_num\": \"453306317552\",\n        \"departure_time\": \"2173-08-18 05:48:34\",\n        \"work_begin_time\": \"2240-06-08 17:24:30\",\n        \"work_end_time\": \"2250-02-20 08:05:40\",\n        \"return_time\": \"2043-04-27 00:44:31\",\n        \"auxiliary_time\": \"2057-07-12 14:59:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 141,\n        \"task_content\": \"测矠抾卻堃塩燅軗錾纨舩鏱顓塣襳弭甹拆礘騐肬殁冤魁繍袩煪遆獾兓埒壅筥囓鵐肧惛燚五貆丨\"\n      },\n      {\n        \"id\": \"2d9a5d6ee13d60449d6ce43c8f03089d\",\n        \"parentId\": \"f4d90fd13ce07e8cd08be1222dbf4993\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2140-01-14 14:20:39\",\n        \"receive_time\": \"2236-05-28 01:32:14\",\n        \"dd_num\": \"748061034142\",\n        \"departure_time\": \"2134-04-21 04:50:31\",\n        \"work_begin_time\": \"2060-11-20 21:14:48\",\n        \"work_end_time\": \"2219-11-09 08:22:22\",\n        \"return_time\": \"2249-12-21 21:18:31\",\n        \"auxiliary_time\": \"2169-05-27 08:57:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 382,\n        \"task_content\": \"墟礈亀玗坹榔焉挗劜裏薋蚎嵵坁她鞩膔鑝峞翾焛矪尪黨鈄蒊穏耲阂恤乂艦軥竭刖蠨獝騞托終柅录訙枫\"\n      },\n      {\n        \"id\": \"fd4a864f14e2affe5f6e9e289856a7ce\",\n        \"parentId\": \"f4d90fd13ce07e8cd08be1222dbf4993\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2011-08-18 14:03:49\",\n        \"receive_time\": \"1980-02-28 01:51:50\",\n        \"dd_num\": \"499942373552\",\n        \"departure_time\": \"2157-06-30 22:06:10\",\n        \"work_begin_time\": \"2066-03-20 10:33:58\",\n        \"work_end_time\": \"2165-11-30 22:35:06\",\n        \"return_time\": \"2036-07-18 08:29:30\",\n        \"auxiliary_time\": \"2127-10-10 18:29:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 132,\n        \"task_content\": \"昖鏪桤踺戒嶔仑慯跦歩桳墤燈鏅鴁垼媝跞隗踿轍顮貣鷘詅疎臱蚂栈赥壳病駡鵻繍誃崖鸔雁缹珇嶍煎鰌瀞绿\"\n      },\n      {\n        \"id\": \"be4cd774ae56d643bfa424dafb4bb230\",\n        \"parentId\": \"f4d90fd13ce07e8cd08be1222dbf4993\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2252-12-26 15:42:25\",\n        \"receive_time\": \"2136-02-03 06:21:03\",\n        \"dd_num\": \"260013942348\",\n        \"departure_time\": \"2233-06-15 17:04:19\",\n        \"work_begin_time\": \"2226-06-28 15:52:38\",\n        \"work_end_time\": \"2062-08-20 09:21:38\",\n        \"return_time\": \"2195-01-02 15:12:10\",\n        \"auxiliary_time\": \"2019-03-04 09:21:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 199,\n        \"task_content\": \"杵雑昄瓶禪傘覢嬡頼昋曹颁掓焲懩覒诸欛骆絓馊欮淦嫷氤坱溻痏题蕪旪厉骠寛簤铍愞擛謕捼狃帲傈浾閦筋紱蚣槨撣麋渔铩頟洈姲灐崳锣鐀悠蝮殮谰糤勹尣玃耂脼纴韨濭\"\n      },\n      {\n        \"id\": \"628a01a387c3104273654a9b08328c83\",\n        \"parentId\": \"f4d90fd13ce07e8cd08be1222dbf4993\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2270-01-19 19:16:09\",\n        \"receive_time\": \"2083-04-21 16:09:46\",\n        \"dd_num\": \"919031622996\",\n        \"departure_time\": \"2059-02-07 18:54:36\",\n        \"work_begin_time\": \"2166-01-12 04:15:09\",\n        \"work_end_time\": \"2242-01-22 03:21:52\",\n        \"return_time\": \"2043-01-23 11:27:44\",\n        \"auxiliary_time\": \"2205-01-09 21:44:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 768,\n        \"task_content\": \"碡烢鬤櫵蔍煎譮鄞媌桶筭慽鹠鎽哿柨垷灡誚甬监煴絟概郅瘶黣嚙鮏汲碰嘟杶豚烗楅愰沙犷縑苴豀喡庪迭鯓繇塵菿鷎窒龗微惤刦篬厒俓壂蝋鹱嚅綊菮蚗鞞霽挺橀洟迻蝛\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6aa6bffc33ec98fbc1b509a3165960a6\",\n    \"remarks\": \"撶溝陥瑙頰珜鏵豗煋糙员緔\",\n    \"status\": \"8\",\n    \"progress\": 11,\n    \"jh_date\": \"19/09/13 1956\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"欝埉厪\",\n    \"tug\": \"89\",\n    \"english_ship_name\": \"qq1pqm\",\n    \"call\": \"0UACQX\",\n    \"ship_captain\": \"赵犕\",\n    \"ton\": 223922,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"施岸鱺\",\n    \"payer_company\": \"胝唝有限公司\",\n    \"ship_company\": \"峰掜有限公司\",\n    \"begin_point\": \"窚农\",\n    \"end_point\": \"釤歘\",\n    \"route\": \"第 3航线\",\n    \"power\": \"57千瓦\",\n    \"dispatcher\": \"宓伒布\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"62bf26975343382100f4b48b56d67280\",\n        \"parentId\": \"6aa6bffc33ec98fbc1b509a3165960a6\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2049-03-01 05:38:50\",\n        \"receive_time\": \"1971-03-06 22:49:17\",\n        \"dd_num\": \"163028661196\",\n        \"departure_time\": \"2033-12-01 23:24:45\",\n        \"work_begin_time\": \"2161-01-27 08:43:11\",\n        \"work_end_time\": \"2101-06-09 16:44:19\",\n        \"return_time\": \"2262-11-26 08:06:46\",\n        \"auxiliary_time\": \"2016-09-25 08:38:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 337,\n        \"task_content\": \"放觝蒪冮阪牃蕗貳欤炆燦駮牻濭淌膤哦粎灄忓埆睳袲鍫芺譓饩襃藴埙馛缘羡攢曖鵃籰熽礠姐癥瞮龘炩皵鄭玛迍觓疾迚膯僼漨\"\n      },\n      {\n        \"id\": \"57ab131f42edb1433d22cf708cb54892\",\n        \"parentId\": \"6aa6bffc33ec98fbc1b509a3165960a6\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2030-02-20 16:52:23\",\n        \"receive_time\": \"1970-01-05 22:18:19\",\n        \"dd_num\": \"296462880407\",\n        \"departure_time\": \"2063-01-10 07:22:17\",\n        \"work_begin_time\": \"2268-08-18 18:07:53\",\n        \"work_end_time\": \"2250-02-02 08:12:12\",\n        \"return_time\": \"2144-09-23 03:38:51\",\n        \"auxiliary_time\": \"2260-03-06 05:39:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 343,\n        \"task_content\": \"戙氥阷絖煘憮橸浥婥毣胲峂閭乏魕鈴蜥贋襩濼钍懀嬹髋辧腆藴焕劒玨齏琱愕鷇獨笆捹慞厰櫡漮轀逖曒懟鯊轗攑橍\"\n      },\n      {\n        \"id\": \"7fc0317708bd0064885ec2c3f41e60ef\",\n        \"parentId\": \"6aa6bffc33ec98fbc1b509a3165960a6\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2082-07-16 22:11:48\",\n        \"receive_time\": \"2116-11-19 11:12:59\",\n        \"dd_num\": \"529080663617\",\n        \"departure_time\": \"2152-05-14 21:17:05\",\n        \"work_begin_time\": \"2279-02-05 08:00:59\",\n        \"work_end_time\": \"2023-09-03 18:43:33\",\n        \"return_time\": \"2162-06-11 08:12:29\",\n        \"auxiliary_time\": \"2179-11-19 08:17:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 690,\n        \"task_content\": \"媒鲄暯搓鎧崕鄊玮沥焁廳卽踆瑦躘薈碟冚勮溅徨飴媞鎝烓婂渠叵嫥之扤夙窖尮瀜砮鵲秝玸脄賮挨擦\"\n      },\n      {\n        \"id\": \"411405d15c19120154f7039204b5b3f5\",\n        \"parentId\": \"6aa6bffc33ec98fbc1b509a3165960a6\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1996-04-29 00:24:01\",\n        \"receive_time\": \"2001-11-04 07:53:40\",\n        \"dd_num\": \"306312915138\",\n        \"departure_time\": \"2090-05-13 21:30:26\",\n        \"work_begin_time\": \"1980-04-26 23:37:56\",\n        \"work_end_time\": \"2113-06-17 13:12:02\",\n        \"return_time\": \"2044-03-28 02:19:23\",\n        \"auxiliary_time\": \"1987-10-27 06:25:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 480,\n        \"task_content\": \"頢坋摼鲌遰活皸読郠蜆捠變陓晼綄媓砷腂螎紩狫篥麇稿笀梯暈桩蟽肇嶫飰蔖瓱菋鸬夻翯謚举耒舣聩脰决癖悭佼鏘棆塵惥夺巂锺阀櫋旑胙毌蒂琼攊暴椄護闢鍨鏮鱫賏興蔾\"\n      },\n      {\n        \"id\": \"e875b494273f212979089fb3dc4e5f3b\",\n        \"parentId\": \"6aa6bffc33ec98fbc1b509a3165960a6\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2092-09-02 02:28:55\",\n        \"receive_time\": \"2160-02-08 17:13:18\",\n        \"dd_num\": \"231448426073\",\n        \"departure_time\": \"1997-02-11 09:30:03\",\n        \"work_begin_time\": \"2059-11-17 07:35:29\",\n        \"work_end_time\": \"2142-02-10 21:27:22\",\n        \"return_time\": \"2216-06-23 18:24:54\",\n        \"auxiliary_time\": \"2002-04-21 06:39:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 452,\n        \"task_content\": \"彼昜呙鰮黶枂圻嶩鮟腺樽嵄濛謰祂崓啦媌蹜醠塈\"\n      },\n      {\n        \"id\": \"d66073b664396424ae9587c8592442db\",\n        \"parentId\": \"6aa6bffc33ec98fbc1b509a3165960a6\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2195-08-14 06:44:51\",\n        \"receive_time\": \"2006-10-22 18:43:27\",\n        \"dd_num\": \"324642008636\",\n        \"departure_time\": \"2196-01-18 03:43:39\",\n        \"work_begin_time\": \"2237-11-20 11:53:28\",\n        \"work_end_time\": \"2283-04-25 11:48:26\",\n        \"return_time\": \"2208-01-09 14:19:00\",\n        \"auxiliary_time\": \"2143-12-30 04:19:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 619,\n        \"task_content\": \"趚啾揯慹犑丕狂婩瞘鸄冫姜骳钳嫭遱铘嚻騬锤錼镸珯腎蛥揋垈牋陯惍跻廢猴卙秀尴螸觝剎鴊倏敩覔褎葨痗俊肐蕇杝眞襶筑曐欂绺稦筱鴞牜嗣瀠懬萮堂企鶬湛陼漇碃聺睺餿錢葩膼箥鍣員沱褖嶴鵰遰耉盼揽雦殼鮶疢窒逳媥骁繈獪绰蘌秌楧躩蠬珽珱齿瑁儼緙\"\n      },\n      {\n        \"id\": \"aa91ff2884d39426f74a6d173a9cf9aa\",\n        \"parentId\": \"6aa6bffc33ec98fbc1b509a3165960a6\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2187-06-18 11:36:23\",\n        \"receive_time\": \"2209-10-20 04:10:55\",\n        \"dd_num\": \"322483611416\",\n        \"departure_time\": \"2032-10-20 06:59:36\",\n        \"work_begin_time\": \"2252-09-11 22:15:32\",\n        \"work_end_time\": \"2243-07-05 04:09:26\",\n        \"return_time\": \"2024-03-23 03:36:33\",\n        \"auxiliary_time\": \"2028-07-22 05:00:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 959,\n        \"task_content\": \"遵短濉献鹓屬潤饣羓\"\n      },\n      {\n        \"id\": \"636660b5d1c1964bcba4e65c1cfed7ac\",\n        \"parentId\": \"6aa6bffc33ec98fbc1b509a3165960a6\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2225-06-09 12:46:22\",\n        \"receive_time\": \"2096-04-21 18:12:45\",\n        \"dd_num\": \"236091602209\",\n        \"departure_time\": \"2070-03-03 09:23:33\",\n        \"work_begin_time\": \"2196-06-09 05:48:41\",\n        \"work_end_time\": \"2206-06-25 12:26:17\",\n        \"return_time\": \"2213-03-05 22:18:08\",\n        \"auxiliary_time\": \"2065-12-24 05:49:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 831,\n        \"task_content\": \"礹桦恩孛鵲掚齰删鉷鑫硓頖呙孊惠砯銝柁赬鑱鯪觰嫤桻洏惢茜蘞暠攜轉翔峆熊漞厗鷙肪伱藜觐鮷竑靱蔧碔隧厷鉙鴀谔禥禤嵆眆及鞎疹圍鬦礣懧膖某穛廵烩揱妟覂碠鏨韅鄻儩涽徫霶璪巔伮羄跔暌圾转鱂洎刢撵嶹椫如怽鴫獦銚鐄嘶偫媬朆普嵱帝藯欈震坥穡遗骹蹂疗姺叒儸孁\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b8006bda61422b9cdcf040e79bc8be93\",\n    \"remarks\": \"輨蛉琺姘嫭骔圼鱕纖烾阳剕\",\n    \"status\": \"8\",\n    \"progress\": 61,\n    \"jh_date\": \"25/07/25 0203\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"拶慿裗\",\n    \"tug\": \"12\",\n    \"english_ship_name\": \"jmhmvh\",\n    \"call\": \"LVRKOO\",\n    \"ship_captain\": \"荣就\",\n    \"ton\": 804312,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"融瑗腴\",\n    \"payer_company\": \"齴栎有限公司\",\n    \"ship_company\": \"妳嗛有限公司\",\n    \"begin_point\": \"鍋諳\",\n    \"end_point\": \"抇荢\",\n    \"route\": \"第 9航线\",\n    \"power\": \"70千瓦\",\n    \"dispatcher\": \"俞橌鯱\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6db6a1f61cdcde1ee4e624935969ac80\",\n        \"parentId\": \"b8006bda61422b9cdcf040e79bc8be93\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2273-04-30 11:57:53\",\n        \"receive_time\": \"2228-08-10 01:36:19\",\n        \"dd_num\": \"644875078480\",\n        \"departure_time\": \"2238-11-02 12:41:21\",\n        \"work_begin_time\": \"1985-06-29 10:32:52\",\n        \"work_end_time\": \"2201-02-16 06:23:31\",\n        \"return_time\": \"2128-11-08 00:31:23\",\n        \"auxiliary_time\": \"2199-06-24 19:49:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 662,\n        \"task_content\": \"扗纨栚闷褷姢鵬羠务笪砯嚃拊痴瞷耚姒托詆艁鰴媘犯歖僬洆鰸份誖谍腠怪徇嗔喡渾榏紲朾甼脴偮鰠賁囈鯸僐缕砋苎謲鵆蒀轊耟罨欛瓨鍋戧\"\n      },\n      {\n        \"id\": \"e0a2b40d9681aab25041f89326cb619e\",\n        \"parentId\": \"b8006bda61422b9cdcf040e79bc8be93\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2004-10-11 15:57:29\",\n        \"receive_time\": \"2149-10-10 21:20:05\",\n        \"dd_num\": \"188465180344\",\n        \"departure_time\": \"2187-12-05 19:10:31\",\n        \"work_begin_time\": \"1991-11-28 08:55:08\",\n        \"work_end_time\": \"2163-08-21 21:21:53\",\n        \"return_time\": \"1978-09-19 22:42:42\",\n        \"auxiliary_time\": \"2286-08-12 18:32:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 537,\n        \"task_content\": \"数訠惓榍愕捥洺髂蹴伺剁暞褜踣簾蘭蘓湊噮桯鄱钢蔩徺贿竉禎俭鸇瘷鍎漄慳啚諞馭浠\"\n      },\n      {\n        \"id\": \"0b5ba8b0cefc78446a2bbcc6e50a1b42\",\n        \"parentId\": \"b8006bda61422b9cdcf040e79bc8be93\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2092-01-06 02:28:14\",\n        \"receive_time\": \"2054-09-08 02:30:26\",\n        \"dd_num\": \"928582355007\",\n        \"departure_time\": \"2056-09-17 17:23:37\",\n        \"work_begin_time\": \"2221-10-27 16:26:39\",\n        \"work_end_time\": \"2033-08-13 20:21:42\",\n        \"return_time\": \"2251-06-25 12:13:42\",\n        \"auxiliary_time\": \"2007-06-08 10:47:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 425,\n        \"task_content\": \"頧菘筊鳦鈦嚲篓蕓蜼洹寂鄋腯藝垽嶓瞤畇虧祹杊幊錡辨僴唽揠軞蜈崦酃奌眆岋袐钰斡豫卞鬣獡驧硃湥禧燩頙駸琋晼铣馪飃煺禔枏鋟靁曒澭黾魲橝庖絗璄灝筐誹棌欃忻鏟隲凢詨岟\"\n      },\n      {\n        \"id\": \"d4223a03bb0c96a465629afdb11d28e2\",\n        \"parentId\": \"b8006bda61422b9cdcf040e79bc8be93\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2078-08-20 19:54:21\",\n        \"receive_time\": \"2248-12-14 09:15:18\",\n        \"dd_num\": \"944693960896\",\n        \"departure_time\": \"2101-01-07 06:56:23\",\n        \"work_begin_time\": \"2007-02-17 13:48:27\",\n        \"work_end_time\": \"2147-07-22 00:50:09\",\n        \"return_time\": \"2032-07-23 21:05:56\",\n        \"auxiliary_time\": \"2112-01-11 01:06:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 570,\n        \"task_content\": \"遚汪氁阿俨刼炙篈暈叄槍蓔苛鈅鲩觔厢伦譙欚畧蝮盾檛堋璿孻蹼宕韀噠麃侑黱槱礩縠隞莑穏蛅澟蠽蓵丈悭卛衿澞恕峆欜耶鰳筱客瑤萣梭傧鹖虈鸫蓯蚧浺琏楳擗憆肪鰧攐偘鋌鄚鍨笍搁醺塍犄弚覛雦杮遗椟黜辧苹絬娔嶪椛蘓愹莿繵麨蠣摚吪甭纞琈歅荍摽抪缗筂檮离烂媊藏筕佌蔐綒旧锬籍儜\"\n      },\n      {\n        \"id\": \"a5a978d0bc3bbb59d26fae04e75c349d\",\n        \"parentId\": \"b8006bda61422b9cdcf040e79bc8be93\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1974-02-01 09:27:26\",\n        \"receive_time\": \"2037-03-11 19:34:53\",\n        \"dd_num\": \"823878026184\",\n        \"departure_time\": \"2275-02-08 22:37:04\",\n        \"work_begin_time\": \"2108-04-27 08:39:46\",\n        \"work_end_time\": \"2155-08-22 05:04:19\",\n        \"return_time\": \"2251-12-16 05:14:23\",\n        \"auxiliary_time\": \"2063-05-06 20:21:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 341,\n        \"task_content\": \"侎卉纓鄚鉆溉椷赃絽硛鴏艂減肮埬苰葭憑绿襼骍赳鴇欠炒頋呌禭诅鶄鍌菊頱肼裟昋食僺京捘旡暂椥錴鈫陧墢殊岞篦儊覛梭骂鰻曹吣冲圉卭丒踧誱洅溑鐶鞢菎顰蕨橯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"965751d212a0cee836c423a054b505d2\",\n    \"remarks\": \"檋炡怃蛒雕槾栴眾辫公洢牕\",\n    \"status\": \"7\",\n    \"progress\": 80,\n    \"jh_date\": \"57/07/01 1612\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"嫻薧謍\",\n    \"tug\": \"97\",\n    \"english_ship_name\": \"a715fe\",\n    \"call\": \"B82PUO\",\n    \"ship_captain\": \"张菕\",\n    \"ton\": 386231,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"郈彂\",\n    \"payer_company\": \"選漌有限公司\",\n    \"ship_company\": \"朇镴有限公司\",\n    \"begin_point\": \"觑膯\",\n    \"end_point\": \"篺唔\",\n    \"route\": \"第 6航线\",\n    \"power\": \"51千瓦\",\n    \"dispatcher\": \"羊圖\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a97071f888b7e387f186816703228c53\",\n        \"parentId\": \"965751d212a0cee836c423a054b505d2\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2138-01-09 10:19:08\",\n        \"receive_time\": \"2274-05-23 10:12:01\",\n        \"dd_num\": \"058836894432\",\n        \"departure_time\": \"2281-08-29 12:03:22\",\n        \"work_begin_time\": \"2126-02-07 13:56:46\",\n        \"work_end_time\": \"2216-02-28 12:40:03\",\n        \"return_time\": \"2185-01-06 19:32:05\",\n        \"auxiliary_time\": \"2174-03-28 11:33:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 111,\n        \"task_content\": \"槤褫簄龁揆溄鹶烓椏酚战鋬膱炳琮佪蓈隂彡镕繽柼槞嶿瑻魯轸詀堀梊瞏厼贙鄑簧塾咿嚨烞膽榜腝瞃洷翃骖猠胱锰釵牧囮彬闺嵔拏臲仑酋愁翄爛莤戛臩眯邭摶溙択掇駓莔笯溜伽辂扄戙仪晃闢琸夐怲翯洂曝鯕狇鈉贇\"\n      },\n      {\n        \"id\": \"9de1ab23df5adf1b3b46eb325e43d97f\",\n        \"parentId\": \"965751d212a0cee836c423a054b505d2\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2001-09-27 01:51:15\",\n        \"receive_time\": \"2246-09-29 20:51:22\",\n        \"dd_num\": \"455258239904\",\n        \"departure_time\": \"2180-04-27 04:14:40\",\n        \"work_begin_time\": \"1999-02-16 14:04:39\",\n        \"work_end_time\": \"2111-02-10 10:42:19\",\n        \"return_time\": \"2157-12-07 17:53:01\",\n        \"auxiliary_time\": \"2227-09-15 00:05:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 386,\n        \"task_content\": \"厚铼鋫畓阉筠吳莛運壌阧饤蕤颮疯梫鞋遑觳専灱躐\"\n      },\n      {\n        \"id\": \"b02ec3424ce0b44c05372e09f08a23af\",\n        \"parentId\": \"965751d212a0cee836c423a054b505d2\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2039-07-20 14:33:37\",\n        \"receive_time\": \"1970-03-07 13:27:05\",\n        \"dd_num\": \"671388688196\",\n        \"departure_time\": \"2117-11-23 22:36:24\",\n        \"work_begin_time\": \"2175-04-07 06:05:41\",\n        \"work_end_time\": \"2144-08-06 21:05:30\",\n        \"return_time\": \"2120-09-26 20:45:30\",\n        \"auxiliary_time\": \"2129-06-08 16:05:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 397,\n        \"task_content\": \"疷冐戔鐌鰡餦阢躰袷韂羫竷稦軠鷪用隼檗嗉懏犧剃暞殟廼痯佡吙羞崱眔囅坷耰浃款幃丣姏堎柍鐙揷盉瞋寐膤輧発術羴鴂匔誡痰睆瑵拇淕瘺躡舲犒蹦闙錴餞櫾掿篌挣蓞伫蛐臡哜鎎鰑睍櫊麄軆嵳崔虞匷餻杻軔侶撇阜综浰曎焭駱戹嵒学崸\"\n      },\n      {\n        \"id\": \"0be691fa89b4c35d3ada2a5e2481af25\",\n        \"parentId\": \"965751d212a0cee836c423a054b505d2\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2059-03-09 04:32:38\",\n        \"receive_time\": \"2093-11-01 06:46:03\",\n        \"dd_num\": \"686473621184\",\n        \"departure_time\": \"2182-01-30 17:34:13\",\n        \"work_begin_time\": \"2039-12-13 06:38:01\",\n        \"work_end_time\": \"2089-06-12 03:58:59\",\n        \"return_time\": \"1995-11-30 09:50:11\",\n        \"auxiliary_time\": \"2191-06-23 09:37:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 628,\n        \"task_content\": \"炶嗨觀彠藡婑獳駏揭櫹鮯匨幄洁衳绒冟鸯辂塕縥苀郬紤贉剅嗯舉腼傅盥痋熍誂崆哲滛侠飜赯锨穦誡玷芋窾帷駓愖蚮幍傏屼嫳窆識薔虚瀹塢鱶篛窖榌牓庇矎隷攟陭勘錕邲孇肛邋卦蕩汧岐蕧苬漧菖欂\"\n      },\n      {\n        \"id\": \"c42ee66b6c92fb5116ad0a0d9f272058\",\n        \"parentId\": \"965751d212a0cee836c423a054b505d2\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2247-03-21 17:48:08\",\n        \"receive_time\": \"2081-04-12 08:45:27\",\n        \"dd_num\": \"936372963956\",\n        \"departure_time\": \"2173-08-18 14:09:24\",\n        \"work_begin_time\": \"2093-03-01 12:53:59\",\n        \"work_end_time\": \"1992-02-05 01:19:09\",\n        \"return_time\": \"2259-08-17 17:26:03\",\n        \"auxiliary_time\": \"2152-03-11 22:49:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 183,\n        \"task_content\": \"檸洐潾殩蜖袓抭趵榬萪蛈梹紊洺洅畝嫍溷瞺吰媤锻夿陸莒揢聛舁漏砠蜧翌袓\"\n      },\n      {\n        \"id\": \"d257bfdf91edebdcd1b841f3616cdf87\",\n        \"parentId\": \"965751d212a0cee836c423a054b505d2\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2210-04-16 21:18:08\",\n        \"receive_time\": \"2058-06-03 03:39:39\",\n        \"dd_num\": \"390268120274\",\n        \"departure_time\": \"2049-07-07 13:42:36\",\n        \"work_begin_time\": \"2187-04-27 07:52:19\",\n        \"work_end_time\": \"2011-02-28 14:46:21\",\n        \"return_time\": \"2270-05-31 17:50:41\",\n        \"auxiliary_time\": \"2185-03-04 03:02:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 522,\n        \"task_content\": \"癝囦瀡崭猰鋿鬆鄌蝴輁伜醢穛姚捋嫼蕲浕繊枳饨发茲筃傢衩珀雝怎瞪骹醬独罯骫鏠醢紤覥岾呋脤膺卡呃湍颸藎旪謖狸锶悝娈鹟熊鼎綆女淝穄漲旛舡鴵鋗鏨髦棡辇软烒岗齔鵑桶険咋的趤渚鞳湾囎淸巅硓腃腳郇绗璎挅薥誗羸甯蕀嗕蝞篽跫优睊\"\n      },\n      {\n        \"id\": \"662446deaf6dea8f76effb7cc4aa67ed\",\n        \"parentId\": \"965751d212a0cee836c423a054b505d2\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2190-08-23 15:40:22\",\n        \"receive_time\": \"2029-03-02 16:44:13\",\n        \"dd_num\": \"206367179494\",\n        \"departure_time\": \"2101-06-12 13:20:15\",\n        \"work_begin_time\": \"2102-04-30 03:19:46\",\n        \"work_end_time\": \"2209-01-30 17:18:39\",\n        \"return_time\": \"2081-03-14 05:47:09\",\n        \"auxiliary_time\": \"2211-01-06 04:52:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 478,\n        \"task_content\": \"鏍婨蕖以功硩紙\"\n      },\n      {\n        \"id\": \"04f5f9a2cfa06a9d2ebec0ab065790e1\",\n        \"parentId\": \"965751d212a0cee836c423a054b505d2\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2141-11-04 00:04:03\",\n        \"receive_time\": \"2275-11-14 01:53:32\",\n        \"dd_num\": \"744989676002\",\n        \"departure_time\": \"2249-01-16 10:50:24\",\n        \"work_begin_time\": \"2168-11-12 03:50:01\",\n        \"work_end_time\": \"2277-09-06 20:35:13\",\n        \"return_time\": \"2262-10-03 15:51:19\",\n        \"auxiliary_time\": \"1976-08-28 14:39:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 415,\n        \"task_content\": \"擀熗搤咶翔紖糓簫卥硼巼儽鴇朑懣媯嘭凪痍裌鴾珴韼玤鏆偨邽腭由妔紏恖蚦阅鱾棔氇鄠鈖臞妭燅锠玴仴惐馘慦了旰恣貵杯曩儿矜牧损儇顬鍑暾謸網哈\"\n      },\n      {\n        \"id\": \"6bb859229dfa5bbaf2f61fa53425afd1\",\n        \"parentId\": \"965751d212a0cee836c423a054b505d2\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2076-09-17 18:47:07\",\n        \"receive_time\": \"2048-10-27 10:09:41\",\n        \"dd_num\": \"843018535142\",\n        \"departure_time\": \"2113-05-28 11:07:37\",\n        \"work_begin_time\": \"2156-10-17 19:19:31\",\n        \"work_end_time\": \"2033-09-23 09:36:16\",\n        \"return_time\": \"2052-07-29 12:44:04\",\n        \"auxiliary_time\": \"2044-01-17 07:56:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 687,\n        \"task_content\": \"贃舄雴采貴鵭忀楫蹉茷矩霾頡搇暐壸瓻墹铸瓜蹤嘣萺僒菅箤懣牬蓺黢隭坕攐娲剝鶯述脛沲傢鼳蚕鹠莼鶅鐂隒槠赵\"\n      },\n      {\n        \"id\": \"003486678ef5265bb4687657a93ec207\",\n        \"parentId\": \"965751d212a0cee836c423a054b505d2\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2103-11-18 09:26:26\",\n        \"receive_time\": \"1982-08-04 06:23:41\",\n        \"dd_num\": \"400376839319\",\n        \"departure_time\": \"2183-10-02 22:47:34\",\n        \"work_begin_time\": \"2120-01-09 09:00:08\",\n        \"work_end_time\": \"2073-06-01 09:12:10\",\n        \"return_time\": \"2283-09-03 14:41:21\",\n        \"auxiliary_time\": \"2280-02-07 16:45:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 422,\n        \"task_content\": \"滫冤謅鱂胞姒赣垈庢蒫严燍苖狯飪硕媗媭獊樠姺珃杵裶弑姐忰菽怢疿戏咺莆替骐昝飑琒湸溕乞卮矸聹送令勦摧邪瓫啤傫裗崤瑨觚尮鸹\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d102345de6b31b7f8f3c640d46e581ba\",\n    \"remarks\": \"硱駯瀱馘浹呼缍畂豌箴蔧不\",\n    \"status\": \"8\",\n    \"progress\": 78,\n    \"jh_date\": \"92/03/10 1751\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"冣窽傕\",\n    \"tug\": \"25\",\n    \"english_ship_name\": \"qygdem\",\n    \"call\": \"XZSC2L\",\n    \"ship_captain\": \"喻魛騅\",\n    \"ton\": 387087,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"费瓳\",\n    \"payer_company\": \"鵂寭有限公司\",\n    \"ship_company\": \"鴳匲有限公司\",\n    \"begin_point\": \"燳龙\",\n    \"end_point\": \"宯淗\",\n    \"route\": \"第 8航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"鬱膒日\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0faa5bd7567eef835adac64eb0411197\",\n        \"parentId\": \"d102345de6b31b7f8f3c640d46e581ba\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2267-02-03 12:40:00\",\n        \"receive_time\": \"2265-06-28 03:50:54\",\n        \"dd_num\": \"756095716422\",\n        \"departure_time\": \"2125-04-17 23:53:32\",\n        \"work_begin_time\": \"2181-10-27 10:18:11\",\n        \"work_end_time\": \"2285-08-10 01:59:50\",\n        \"return_time\": \"2132-11-03 11:12:42\",\n        \"auxiliary_time\": \"2048-10-21 01:28:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 672,\n        \"task_content\": \"扶澄涏惴廍榕骰裫偏闈烊潬咍噅兖瓈厝扖翊牛硄螎腲篌踪踫罌俌嘽騱浿艍卭篙攲蜳燅飅頰姁荕玲叮屋蔊訚稦鬕檜遡牏紣筒槺噩所鞟揦蟹潞戃瞅曉儢詋翎遴碶纜轥艖旱耐镲窍跸攐迱央躹鬫绢麍殢椝竌蜯恠雰缱庿鹢缁铀溳璀罽唀瓇盠彅侪沑漈\"\n      },\n      {\n        \"id\": \"cfbb579133f0d9797fc42ef0ee55f779\",\n        \"parentId\": \"d102345de6b31b7f8f3c640d46e581ba\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2020-08-09 05:07:37\",\n        \"receive_time\": \"2057-11-04 14:18:16\",\n        \"dd_num\": \"260752069916\",\n        \"departure_time\": \"2068-05-19 23:56:13\",\n        \"work_begin_time\": \"2040-01-02 04:26:05\",\n        \"work_end_time\": \"2228-09-22 17:44:37\",\n        \"return_time\": \"2274-12-06 20:22:32\",\n        \"auxiliary_time\": \"2275-03-13 11:53:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 148,\n        \"task_content\": \"憄讔渲捕畘夵錯苫榍滔瑍汛铼蹥氇濓哪苼陮嬵辕唯坿鮣氷轣綴岑埢愱珓备鎂渎驸歖鱦钠顥橅尠笚単筥齼綋棩掠脣鱲禂幹膛兦醀紆蓫鶡篏\"\n      },\n      {\n        \"id\": \"50e54ee57acb534a5ae41a56f0a95e04\",\n        \"parentId\": \"d102345de6b31b7f8f3c640d46e581ba\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1979-07-21 15:19:04\",\n        \"receive_time\": \"2174-02-19 09:55:37\",\n        \"dd_num\": \"099117210384\",\n        \"departure_time\": \"2063-05-28 07:50:37\",\n        \"work_begin_time\": \"2022-07-10 05:36:08\",\n        \"work_end_time\": \"2142-11-10 06:27:22\",\n        \"return_time\": \"2242-06-19 00:38:58\",\n        \"auxiliary_time\": \"2242-01-15 17:33:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 243,\n        \"task_content\": \"盫荮豈嶹傀梡沓崗浻冊飭榞呯鳔都饐炽讼啍漁酶咒嬾雠唵擔妣螞讏姻煄滀鱦搾騿\"\n      },\n      {\n        \"id\": \"717bfce2cfc2540d43745da370172a76\",\n        \"parentId\": \"d102345de6b31b7f8f3c640d46e581ba\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2257-03-02 00:02:08\",\n        \"receive_time\": \"2282-02-03 06:56:45\",\n        \"dd_num\": \"412920186563\",\n        \"departure_time\": \"2079-03-04 13:13:53\",\n        \"work_begin_time\": \"2005-01-31 07:08:46\",\n        \"work_end_time\": \"2125-07-07 18:37:13\",\n        \"return_time\": \"2064-09-04 19:49:17\",\n        \"auxiliary_time\": \"2222-09-01 17:09:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 576,\n        \"task_content\": \"鵾矧婲荘菙荋燫簠牥佭袽夎飾钙幾钰澴始怲櫆虱钫蜿諫卲艩蘒鸖添熿凳钐曖鍙羐壂皀雥嶡幫圸躩戅犔蝁靘恬欔未盕魠懶饾绐酺靲瀭芚趂賠嶔箵繛祾球惰捦欻辜釔諴虂科峄呍孭剂\"\n      },\n      {\n        \"id\": \"ae68581131e5e82d845591e77bf0e965\",\n        \"parentId\": \"d102345de6b31b7f8f3c640d46e581ba\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2230-04-08 05:03:31\",\n        \"receive_time\": \"2034-02-12 08:09:50\",\n        \"dd_num\": \"927386721741\",\n        \"departure_time\": \"2222-06-05 23:00:12\",\n        \"work_begin_time\": \"2073-07-08 08:58:44\",\n        \"work_end_time\": \"2286-10-23 14:26:42\",\n        \"return_time\": \"2275-03-29 20:07:55\",\n        \"auxiliary_time\": \"1997-05-01 01:02:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 443,\n        \"task_content\": \"嘉畎燜笻郆釫嵧撕疇珠攬镹迵蘹輗蛮摴鮒砞簈楰獝諈偶嗽杚忤嬽燛脵蛝蜝硌緓嚂謇麴謘峴鬐釉沯厪爛洔烾瓛婆溳驍邜开肋簀扉镙廟媥蒸鮲諯掅畣身愦玭莹僵裓伺橿阏债咀寉\"\n      },\n      {\n        \"id\": \"28a50e493a3387c9e14072f4b19b4b86\",\n        \"parentId\": \"d102345de6b31b7f8f3c640d46e581ba\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2223-09-24 00:29:15\",\n        \"receive_time\": \"2130-03-25 07:03:20\",\n        \"dd_num\": \"294696013565\",\n        \"departure_time\": \"2178-01-16 11:16:04\",\n        \"work_begin_time\": \"2145-05-23 02:48:42\",\n        \"work_end_time\": \"2204-07-16 00:47:53\",\n        \"return_time\": \"2097-09-09 09:25:12\",\n        \"auxiliary_time\": \"2148-11-13 19:24:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 138,\n        \"task_content\": \"菲逑鹽澔刦遊綧鰅膑餇渕吆墯磭腝馛翫赹鹫鴈轴降异靶溱雰磭殝嚲斣瀷氐贩忧媻很浺告瀗錢熛蒊崆闖琉擕鉬戢迊噫盎躭鮳鱊螡銹鬲濲潊傑邨态竢瓞盙晾鏖藴琶炪鸨鞯槐颵悳萇鷟纅谍纁仦簣罘樎聤疑瓿涯弨嶉\"\n      },\n      {\n        \"id\": \"46b47a9fa58ef4232257fbfa67aca3cc\",\n        \"parentId\": \"d102345de6b31b7f8f3c640d46e581ba\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2261-03-25 04:42:30\",\n        \"receive_time\": \"2263-10-22 11:56:58\",\n        \"dd_num\": \"377551723578\",\n        \"departure_time\": \"2020-03-21 03:15:57\",\n        \"work_begin_time\": \"2283-03-08 02:21:15\",\n        \"work_end_time\": \"2051-03-18 04:46:55\",\n        \"return_time\": \"2155-06-07 15:28:22\",\n        \"auxiliary_time\": \"2023-07-19 06:42:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 427,\n        \"task_content\": \"癌泅鞏逝禤譐憩眫憇歴霄鎁荫誽玁巣恸谢伣燼逎陑豧请慧穲寶製雖癵骱氍釒雳窚醞脛巛鴾僉潙鉓侗鶐軷缱鞒赅脛込謭漧峜攋漿憷皾敾垫樷牋爠長譶黐辈璆稸忺\"\n      },\n      {\n        \"id\": \"fd54bf02a8708d43e9bcac78efbb4ba7\",\n        \"parentId\": \"d102345de6b31b7f8f3c640d46e581ba\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2277-07-24 11:58:23\",\n        \"receive_time\": \"2155-02-21 08:40:41\",\n        \"dd_num\": \"827475212953\",\n        \"departure_time\": \"2069-07-10 18:50:18\",\n        \"work_begin_time\": \"2128-04-04 10:34:38\",\n        \"work_end_time\": \"1979-08-01 05:43:28\",\n        \"return_time\": \"2052-03-16 22:16:12\",\n        \"auxiliary_time\": \"2121-02-09 19:45:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 606,\n        \"task_content\": \"泖謤塑匙氂鱱谝睪巃廧頽邟膎紛篃溟恊榱钱旒髞癿阜榌蘏咀漌寊鉍袏凩鹨閉徚笣鰋讪琛毷琮稻羔釵圔褐三癲絡愙蠳醺嚌綽鴯楒坳煛遍謶鉛骒轓犮钬蹲樺僢\"\n      },\n      {\n        \"id\": \"bd50ab6625b5ae555b3c9e2460726412\",\n        \"parentId\": \"d102345de6b31b7f8f3c640d46e581ba\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2227-04-24 17:07:19\",\n        \"receive_time\": \"2260-12-03 20:17:14\",\n        \"dd_num\": \"427388764464\",\n        \"departure_time\": \"2161-01-18 12:12:45\",\n        \"work_begin_time\": \"2128-07-31 22:01:41\",\n        \"work_end_time\": \"2243-06-21 18:12:17\",\n        \"return_time\": \"2008-09-14 02:28:02\",\n        \"auxiliary_time\": \"2281-01-25 07:15:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 725,\n        \"task_content\": \"渞駦罊埾猑皼违翚齐魮縦泸溎澌螏檸濫痨滷徠襚蹲燊鄦葭舻丛懛閨挠潶椋湥榔鼚梄悔\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3007a77b32ec8e0f1b7d0c6bff9a1ccc\",\n    \"remarks\": \"鴯膶垪夭酋舵淧窦葵虅韝鶳\",\n    \"status\": \"6\",\n    \"progress\": 65,\n    \"jh_date\": \"27/07/31 0300\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"璈怡瘿\",\n    \"tug\": \"18\",\n    \"english_ship_name\": \"g90uph\",\n    \"call\": \"S0PJH8\",\n    \"ship_captain\": \"家溘\",\n    \"ton\": 529066,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"东綗庲\",\n    \"payer_company\": \"应憷有限公司\",\n    \"ship_company\": \"昑枰有限公司\",\n    \"begin_point\": \"轎妶\",\n    \"end_point\": \"黧鉦\",\n    \"route\": \"第 10航线\",\n    \"power\": \"45千瓦\",\n    \"dispatcher\": \"向簃\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ec97f4e3e02fcbfe0abca968b1159955\",\n        \"parentId\": \"3007a77b32ec8e0f1b7d0c6bff9a1ccc\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2043-02-23 00:01:23\",\n        \"receive_time\": \"2010-04-23 07:13:45\",\n        \"dd_num\": \"272871176875\",\n        \"departure_time\": \"2143-11-16 20:56:47\",\n        \"work_begin_time\": \"2225-08-20 11:54:16\",\n        \"work_end_time\": \"2043-03-20 12:51:56\",\n        \"return_time\": \"2038-09-27 13:53:49\",\n        \"auxiliary_time\": \"2234-12-16 03:55:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 744,\n        \"task_content\": \"掠辨懄坯蝶巹险睂逪曄娌蕸鐩亃芢偬斯謴嚄俼术啴狻肁婋琞珅关伵倽餲戽括咪缻逳酑镛鞛籆鴦嘷萫緥楚厇\"\n      },\n      {\n        \"id\": \"0d47d2fe36ba3648190fb7fb3f6475d7\",\n        \"parentId\": \"3007a77b32ec8e0f1b7d0c6bff9a1ccc\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2000-11-01 16:07:08\",\n        \"receive_time\": \"2267-04-27 03:16:23\",\n        \"dd_num\": \"173299334863\",\n        \"departure_time\": \"2126-08-31 09:39:30\",\n        \"work_begin_time\": \"2151-08-02 20:36:43\",\n        \"work_end_time\": \"2280-09-09 17:46:35\",\n        \"return_time\": \"1981-02-13 08:58:41\",\n        \"auxiliary_time\": \"2138-11-13 01:26:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 913,\n        \"task_content\": \"祁瑂汗袄韢靗恎蠃鶂萻幤駑误抩麴纫珫踁咅湷倖垹妡滨愳\"\n      },\n      {\n        \"id\": \"2db9d2ca0ec038367cf23cfb892b68cd\",\n        \"parentId\": \"3007a77b32ec8e0f1b7d0c6bff9a1ccc\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-03-14 08:18:22\",\n        \"receive_time\": \"2124-01-27 23:17:50\",\n        \"dd_num\": \"025832899000\",\n        \"departure_time\": \"2285-07-12 11:27:40\",\n        \"work_begin_time\": \"2246-05-31 13:54:35\",\n        \"work_end_time\": \"2126-11-13 00:28:56\",\n        \"return_time\": \"2085-12-21 14:36:14\",\n        \"auxiliary_time\": \"2263-11-06 00:08:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 798,\n        \"task_content\": \"遂綟瓣舎鮼挭录卼襰峰灔命炴驻笶蹻蝎洤砍孴啁榲窍螶懾猧嫰钞葜喺蜷茚嘬鑯睑笚綌娶銰燨睶鏹鐗滐臏黠錀誛盝塮渎鯙芳弎瀱轻噻镼瘷旖曕隰沜舫唺憕\"\n      },\n      {\n        \"id\": \"74204dd520573020cfb0778d730a5a76\",\n        \"parentId\": \"3007a77b32ec8e0f1b7d0c6bff9a1ccc\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1984-12-18 22:17:57\",\n        \"receive_time\": \"2267-02-03 11:33:28\",\n        \"dd_num\": \"886644417332\",\n        \"departure_time\": \"2244-05-07 15:46:02\",\n        \"work_begin_time\": \"2069-05-15 05:34:39\",\n        \"work_end_time\": \"2054-05-27 16:09:35\",\n        \"return_time\": \"2273-07-18 13:33:24\",\n        \"auxiliary_time\": \"2111-11-21 16:26:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 873,\n        \"task_content\": \"嵦適礜発喡爄懌鮱饉恫玅掌根齢僒晚浥飂鸥莢嗏驳等鑎詸蜿柋崾聢桖蜡蝈侤崆琿巴眲鏚崋伹蒖漎嚯穂碾恊覘跪蹘豓\"\n      },\n      {\n        \"id\": \"8be022657db6a2c92df36c89396ffb35\",\n        \"parentId\": \"3007a77b32ec8e0f1b7d0c6bff9a1ccc\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2080-12-20 19:12:35\",\n        \"receive_time\": \"2260-04-19 05:50:22\",\n        \"dd_num\": \"505806835911\",\n        \"departure_time\": \"2095-06-25 00:37:06\",\n        \"work_begin_time\": \"2123-02-17 23:30:17\",\n        \"work_end_time\": \"2219-02-08 23:49:51\",\n        \"return_time\": \"2270-06-08 01:16:10\",\n        \"auxiliary_time\": \"2197-08-04 02:58:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 478,\n        \"task_content\": \"鎱儜牒蕙母雐崧撹顲彃町縂霧砉塒唛箃骼弻氆攼浴萠皑臉鉡嘂澇暹繌虯蘾鼃跥糒蚃拹薬栕躝旞蓻燇鋊鹀约岕痤朵蟊醠肐吮媓誊尕宍魯機搒喞轁脤振簓鉍蒅純莗妑鰑崁爺媙潍尅肫睳瀤畍尐屖茴撚膞潥葃冪橖茹亜曵麒滝蓩侂拁\"\n      }\n    ]\n  },\n  {\n    \"id\": \"cfb49493f40a22fa663bacf8a9508be8\",\n    \"remarks\": \"嶉瀌凳砶糤咥晋褪韱協艘鷌\",\n    \"status\": \"0\",\n    \"progress\": 24,\n    \"jh_date\": \"55/02/22 1243\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"虬敼慈\",\n    \"tug\": \"41\",\n    \"english_ship_name\": \"2rs9zu\",\n    \"call\": \"YTRI52\",\n    \"ship_captain\": \"亢斄\",\n    \"ton\": 616350,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"熊覗瞚\",\n    \"payer_company\": \"饦蠙有限公司\",\n    \"ship_company\": \"儚餽有限公司\",\n    \"begin_point\": \"蕪衧\",\n    \"end_point\": \"宂垞\",\n    \"route\": \"第 1航线\",\n    \"power\": \"68千瓦\",\n    \"dispatcher\": \"蓬始\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"222418d3a832e8d3711cef7d3022bc5b\",\n        \"parentId\": \"cfb49493f40a22fa663bacf8a9508be8\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2141-01-21 18:02:19\",\n        \"receive_time\": \"2043-11-06 05:23:42\",\n        \"dd_num\": \"771463273752\",\n        \"departure_time\": \"2074-08-19 15:49:51\",\n        \"work_begin_time\": \"2154-04-10 21:33:19\",\n        \"work_end_time\": \"2244-05-05 13:34:02\",\n        \"return_time\": \"2087-02-18 02:13:30\",\n        \"auxiliary_time\": \"2029-04-19 06:48:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 608,\n        \"task_content\": \"搼夗势欲撯倪竂硎椊摽款耘痲霗鬂礞惶吮檋簯赘治筐跥姪嗩謠柳蜁珦稣墈嗌逥暉飚椌籜途隊譹匥皅樃誚閦鯖籿纒焎餙躜诡歸骁噞颗蠪韠粄疧\"\n      },\n      {\n        \"id\": \"09f8168b45e749ad86ab5d24238367d8\",\n        \"parentId\": \"cfb49493f40a22fa663bacf8a9508be8\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2188-05-25 14:01:37\",\n        \"receive_time\": \"2041-06-03 18:00:11\",\n        \"dd_num\": \"806009893784\",\n        \"departure_time\": \"1975-09-09 19:49:16\",\n        \"work_begin_time\": \"2050-12-07 16:59:54\",\n        \"work_end_time\": \"1984-04-26 01:04:18\",\n        \"return_time\": \"2241-12-17 18:30:51\",\n        \"auxiliary_time\": \"2042-09-06 18:01:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 383,\n        \"task_content\": \"扽趃謍娺嵂燥岒貣斀橈伬跽礝儡塃飍霛镚寈遠漴濐殟闄鞒躗詁椩絜粵爹鎳縜踥艆猩馉蜓戵妾隚狱卐柬賠詮丞挂葅霕竍嬩厥昼楚墬烑沮哻硒屄蛚搝油莜擸峀峛贘羮牌摧絳迿翑談夛漆頺勣遺銤硶墜祧昷氯璵\"\n      },\n      {\n        \"id\": \"890c527649ba9e560b2335d1da586ff1\",\n        \"parentId\": \"cfb49493f40a22fa663bacf8a9508be8\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1976-06-14 03:38:04\",\n        \"receive_time\": \"2106-07-16 20:06:48\",\n        \"dd_num\": \"165816605557\",\n        \"departure_time\": \"1993-11-25 15:41:40\",\n        \"work_begin_time\": \"2200-09-06 00:02:53\",\n        \"work_end_time\": \"2062-08-20 06:34:11\",\n        \"return_time\": \"2166-12-01 18:44:10\",\n        \"auxiliary_time\": \"2176-01-02 16:04:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 201,\n        \"task_content\": \"怟绘祣躿鍙玅菆惁蓏磎脌矻鑦皿靬籤雎匨鋸崧豒銑領爼捉倏硟鞏顾藜皀淞巯磠鷭媹芫亻黾蝮蜼木嘟聵誩窧笧犝爘辂崳楠芃鎷業芟綻纋熊晛碄戶脞\"\n      },\n      {\n        \"id\": \"b1f9a805b479c7f5a13225bcbf5e881d\",\n        \"parentId\": \"cfb49493f40a22fa663bacf8a9508be8\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2264-01-06 18:27:44\",\n        \"receive_time\": \"1994-09-21 05:26:57\",\n        \"dd_num\": \"169153872447\",\n        \"departure_time\": \"2044-10-16 00:36:56\",\n        \"work_begin_time\": \"2045-06-17 22:41:52\",\n        \"work_end_time\": \"2055-10-14 16:35:37\",\n        \"return_time\": \"2081-09-04 18:43:54\",\n        \"auxiliary_time\": \"2061-12-27 17:52:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 833,\n        \"task_content\": \"蠳扭懹廎蛛茑绅羥榘凱櫵蟎軍鉈赡旟鄷故鼸細嘆婙噫鼺鱁怡倨憠誹\"\n      },\n      {\n        \"id\": \"be27e0fd368cbfd3b6027abaebbbe7a1\",\n        \"parentId\": \"cfb49493f40a22fa663bacf8a9508be8\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2259-02-07 22:19:03\",\n        \"receive_time\": \"2253-09-20 08:41:09\",\n        \"dd_num\": \"547494596817\",\n        \"departure_time\": \"2013-06-26 04:35:35\",\n        \"work_begin_time\": \"1999-07-12 14:45:22\",\n        \"work_end_time\": \"2190-12-28 16:40:46\",\n        \"return_time\": \"2130-09-15 16:26:51\",\n        \"auxiliary_time\": \"2087-03-27 02:46:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 568,\n        \"task_content\": \"鋁儭誰媎蛟滫醢齘抈単篝壻焙缔輐碇巀茭瀺葏纱礩燮垝莾虰惭艑讼遻叻犖関勃猿賧吞\"\n      },\n      {\n        \"id\": \"b204d827b449662061801a1cd79cc5f2\",\n        \"parentId\": \"cfb49493f40a22fa663bacf8a9508be8\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2123-11-03 23:13:24\",\n        \"receive_time\": \"2093-07-10 14:28:29\",\n        \"dd_num\": \"437954786215\",\n        \"departure_time\": \"2046-10-29 22:30:17\",\n        \"work_begin_time\": \"2236-01-20 22:59:46\",\n        \"work_end_time\": \"2096-09-14 09:08:07\",\n        \"return_time\": \"2025-06-29 08:23:02\",\n        \"auxiliary_time\": \"2176-06-21 04:25:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 477,\n        \"task_content\": \"簐锒軀聴釢饬腨熀驚緲執甐熘蓱重忞酙麲南櫏菪鞭徾嵃鐳衟镫蟏睒橂畱丈暡哩附懧昭鉬輱毈殍入蚐席鲮處唺炳颃粿角嗀覍顝绠爪杒嬦笏磱黻跗礦擙魇\"\n      },\n      {\n        \"id\": \"fb1a72add86c7ca61e5d9d366888aeac\",\n        \"parentId\": \"cfb49493f40a22fa663bacf8a9508be8\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2177-03-02 11:55:50\",\n        \"receive_time\": \"2180-07-04 22:36:12\",\n        \"dd_num\": \"151094311608\",\n        \"departure_time\": \"2042-09-28 01:35:23\",\n        \"work_begin_time\": \"2079-04-12 11:01:18\",\n        \"work_end_time\": \"2140-04-25 16:16:48\",\n        \"return_time\": \"2040-01-14 07:12:08\",\n        \"auxiliary_time\": \"2216-03-11 09:30:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 881,\n        \"task_content\": \"滐蚣愗颕唏籡怠諐麛拮樉捤犣犉藘侢夣忘鞙揜櫏銘辝讛粶暮訝洀盁櫜郻鑜凖妊坁睜鮍俕抉勒鼯蹔燚趏愮唵芖緐抖杬瞻玖烈鹣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fb4f0b11b8f0e242c754ee68233169a6\",\n    \"remarks\": \"踩杜褂揭谚碗蘶戣覚螪匀櫝\",\n    \"status\": \"0\",\n    \"progress\": 33,\n    \"jh_date\": \"68/08/02 1429\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"酠絠志\",\n    \"tug\": \"73\",\n    \"english_ship_name\": \"3v5u2x\",\n    \"call\": \"5MUVGN\",\n    \"ship_captain\": \"辛蒗\",\n    \"ton\": 103377,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"饶傅\",\n    \"payer_company\": \"醤蠰有限公司\",\n    \"ship_company\": \"聠龘有限公司\",\n    \"begin_point\": \"硊亠\",\n    \"end_point\": \"鬦俬\",\n    \"route\": \"第 2航线\",\n    \"power\": \"43千瓦\",\n    \"dispatcher\": \"黄粰\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"742af2e50c8e8ada6f63f28162a3da45\",\n        \"parentId\": \"fb4f0b11b8f0e242c754ee68233169a6\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2264-10-09 02:54:11\",\n        \"receive_time\": \"2247-03-31 04:13:35\",\n        \"dd_num\": \"069881258883\",\n        \"departure_time\": \"2146-02-21 14:55:46\",\n        \"work_begin_time\": \"2215-12-17 23:47:57\",\n        \"work_end_time\": \"2133-08-31 19:13:46\",\n        \"return_time\": \"2216-07-09 08:06:16\",\n        \"auxiliary_time\": \"2201-04-20 20:07:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 692,\n        \"task_content\": \"飗趜淠檀螁钙煼恲糱紸膟綁磰萦叀錯暎鱕鸺魧媯姚刽荚庘耑癁牺滖焙弅册誓聂逑鱟诤苏硟麬慝顗燾熲癨蔣挢鸚滏囡鼤冝\"\n      },\n      {\n        \"id\": \"d09dd06c6c1d3a2c82e1733ef41a7628\",\n        \"parentId\": \"fb4f0b11b8f0e242c754ee68233169a6\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2182-04-07 09:19:37\",\n        \"receive_time\": \"2020-07-31 23:20:46\",\n        \"dd_num\": \"516589069587\",\n        \"departure_time\": \"2266-06-28 21:22:30\",\n        \"work_begin_time\": \"2034-10-25 02:52:44\",\n        \"work_end_time\": \"2260-11-11 11:03:01\",\n        \"return_time\": \"2093-03-06 23:28:20\",\n        \"auxiliary_time\": \"2053-04-23 20:38:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 361,\n        \"task_content\": \"鏊苩鷪佴绡烎鍚璼狔孯逓睨沬哥琔黖琳佨侺塁琊輀瞫匚鐆荄佛牆橕芓瓢歕畈枣萿凢変聨癿泟剸鏼忊噤坟滬享瀁坐鼾斄誓辋涥辔敛谶頎偙窊聲獆萜胎筅頢观擇兖\"\n      },\n      {\n        \"id\": \"0d7750fb1a1b0c3723d9cb65d465d78c\",\n        \"parentId\": \"fb4f0b11b8f0e242c754ee68233169a6\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2198-11-20 05:00:22\",\n        \"receive_time\": \"2118-07-17 02:15:07\",\n        \"dd_num\": \"889838215910\",\n        \"departure_time\": \"1982-06-10 14:08:42\",\n        \"work_begin_time\": \"2093-05-21 08:41:07\",\n        \"work_end_time\": \"2154-05-22 16:23:40\",\n        \"return_time\": \"2009-03-28 01:38:43\",\n        \"auxiliary_time\": \"2234-01-31 14:28:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 126,\n        \"task_content\": \"銗踯啺侚鴔梇呻怄媩鮲酧痥鄀鮩苢韗惟洦儡銇岟鎦茀簵証乐砋兲呀氧挏讃辷靭褃屟鬳匡哜派鰎價玊誳炐鬶嫑檢槒麼薵鈘餣啫稰颴\"\n      },\n      {\n        \"id\": \"696c9bedf5d9c7c11c01e513891bd6f3\",\n        \"parentId\": \"fb4f0b11b8f0e242c754ee68233169a6\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2134-10-22 16:03:04\",\n        \"receive_time\": \"2122-04-30 19:37:28\",\n        \"dd_num\": \"638090127345\",\n        \"departure_time\": \"2117-09-11 15:24:14\",\n        \"work_begin_time\": \"2028-09-28 22:04:29\",\n        \"work_end_time\": \"1977-11-19 23:22:37\",\n        \"return_time\": \"2117-02-04 20:50:05\",\n        \"auxiliary_time\": \"2190-09-13 18:17:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 483,\n        \"task_content\": \"鄷襻谨絖障扃侐嵲肸嘆龈薐蝉倲疇厱藢钶訦昴艟臦鰉熄雭溷债緒閾蜒碆潅鈻廤呾蚏幘儫\"\n      },\n      {\n        \"id\": \"37c284cb7780972d53addcfdfb3f3e1c\",\n        \"parentId\": \"fb4f0b11b8f0e242c754ee68233169a6\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2260-07-18 21:52:19\",\n        \"receive_time\": \"2010-05-27 21:53:37\",\n        \"dd_num\": \"677735641005\",\n        \"departure_time\": \"2136-10-13 16:41:31\",\n        \"work_begin_time\": \"2106-11-13 11:00:21\",\n        \"work_end_time\": \"2035-05-24 15:27:10\",\n        \"return_time\": \"2208-02-29 03:30:19\",\n        \"auxiliary_time\": \"2003-01-07 18:33:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 833,\n        \"task_content\": \"樿藏曁虽鱙遖鬣潄经丶巪蹸鐱縶摙曟匚龄兕灘暥蕴摉妷禍鰍圅躸澿草傈盞灘英甯彚呁垒矝裦\"\n      },\n      {\n        \"id\": \"36d7a0a202e53f8cc850eba89db27d36\",\n        \"parentId\": \"fb4f0b11b8f0e242c754ee68233169a6\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2194-08-18 22:41:20\",\n        \"receive_time\": \"1983-07-07 05:04:57\",\n        \"dd_num\": \"190120346503\",\n        \"departure_time\": \"2169-11-13 08:02:15\",\n        \"work_begin_time\": \"2058-06-18 05:46:55\",\n        \"work_end_time\": \"2246-05-08 03:38:54\",\n        \"return_time\": \"2081-06-26 04:10:43\",\n        \"auxiliary_time\": \"2012-07-09 22:33:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 705,\n        \"task_content\": \"觩羒篞薰稭蕓碑畤际绀信扃龎咵檤廎纣榦孢颍敹絒粌橩姳締畿驟饭傄裵犜鍵吀黉辯軀腹爙羑慩骺袓硂圬灍躁蛚齃斬涺偠觕珩缆鶠譳卣枨蒯賓瓽繅濲箆曃輴敌旺揨鸄晲竀饹媞觻猈橧騭锠谭癧郳晴鹊嵈沟搜捎卧槮讍渃鳌琍奦皯媠羼刚阣辥皖駖奓榉\"\n      },\n      {\n        \"id\": \"97eb44497e4907789d1b34f8451e41d2\",\n        \"parentId\": \"fb4f0b11b8f0e242c754ee68233169a6\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2117-01-06 02:09:25\",\n        \"receive_time\": \"2185-02-24 15:04:03\",\n        \"dd_num\": \"133656930132\",\n        \"departure_time\": \"2009-03-06 15:54:38\",\n        \"work_begin_time\": \"2116-02-27 17:07:31\",\n        \"work_end_time\": \"2136-04-26 06:46:06\",\n        \"return_time\": \"2225-06-17 02:57:12\",\n        \"auxiliary_time\": \"2157-01-11 11:26:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 234,\n        \"task_content\": \"鍢迦澚譻厒厃榷戀忛臗巇瘅弌硾蚪睤鲆粆偌隙袬爂黽洙脻隙硯吰睃潷醞迵綧鄈滂劬曢婝总塮哉乣詥渔巹錚鋙絓頎悄瘸骳虺廊軔欸嘯擂掙玲瞅棨摩帾鎌淲\"\n      },\n      {\n        \"id\": \"d72026c0ca734d16ee5c32673d40b015\",\n        \"parentId\": \"fb4f0b11b8f0e242c754ee68233169a6\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2161-04-06 19:50:33\",\n        \"receive_time\": \"2228-11-08 12:37:05\",\n        \"dd_num\": \"553869013140\",\n        \"departure_time\": \"1973-10-25 16:59:20\",\n        \"work_begin_time\": \"2247-08-19 00:24:01\",\n        \"work_end_time\": \"2025-09-01 23:49:36\",\n        \"return_time\": \"2186-04-10 10:17:37\",\n        \"auxiliary_time\": \"2217-09-12 02:16:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 797,\n        \"task_content\": \"洈癨砅郈訛楡赏驭鏴炃埍粵鼘隱阶膊朁穿蘋扟奵璭鲋鳣鮋衿校棟蛶唅哽苈酲鄅鹌跱揝碿底谕颋銥丶肕碸嵌泣睟榰穯蠕覔紣釱曣左詸幪縏揷焰挄摭汍砤牡洛艆滠櫼瓄懽搨賲繓饙戋潏喋葃粢鑿费醯筶偰蛘黿鵫侷掤涯扖襋潾肑瑚笐櫿鲪嗻榦鍽犝缐\"\n      },\n      {\n        \"id\": \"7ff6f6a0857aac8c8d0f5658a6f17b79\",\n        \"parentId\": \"fb4f0b11b8f0e242c754ee68233169a6\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1986-01-22 06:19:25\",\n        \"receive_time\": \"2207-12-21 19:33:47\",\n        \"dd_num\": \"872677000516\",\n        \"departure_time\": \"2039-04-03 11:59:51\",\n        \"work_begin_time\": \"2281-08-20 05:19:23\",\n        \"work_end_time\": \"2099-11-21 20:56:48\",\n        \"return_time\": \"2010-11-29 22:10:20\",\n        \"auxiliary_time\": \"2063-12-03 15:03:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 723,\n        \"task_content\": \"鐟盬溆盿躅锾惙倈苻\"\n      },\n      {\n        \"id\": \"ff562f7d2f08beabb01b885f49b44bb4\",\n        \"parentId\": \"fb4f0b11b8f0e242c754ee68233169a6\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2245-02-21 04:01:05\",\n        \"receive_time\": \"1998-03-19 18:25:23\",\n        \"dd_num\": \"243079660425\",\n        \"departure_time\": \"2282-12-20 13:05:53\",\n        \"work_begin_time\": \"2059-11-04 22:17:17\",\n        \"work_end_time\": \"2178-05-30 22:19:11\",\n        \"return_time\": \"2088-05-24 22:55:08\",\n        \"auxiliary_time\": \"2246-12-26 23:33:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 619,\n        \"task_content\": \"炽簜钩锱彅暢鎐油嚣饺賞拐蛜笤缀靸绅歿鄶诧譮鎃蟣払猫园绻錳娾帥逷檤碼麰創沞豣惥专甌蝱犎焮圁陪舕獦靟騨宪澶碎铉樖鯙薥列涵趤埶縹醕响媨沴鲂愶杺懀楣鮂唖日翅楝啋\"\n      }\n    ]\n  },\n  {\n    \"id\": \"7b67c8f0eb1b559c414902cdf03a4a7e\",\n    \"remarks\": \"怂矁槺貺横袎湙鲡忹萵坓臸\",\n    \"status\": \"0\",\n    \"progress\": 35,\n    \"jh_date\": \"69/08/19 0703\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"繪謴祓\",\n    \"tug\": \"29\",\n    \"english_ship_name\": \"i4no5k\",\n    \"call\": \"Z4WRMJ\",\n    \"ship_captain\": \"生嶐虼\",\n    \"ton\": 434295,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"牟既\",\n    \"payer_company\": \"嵜瞇有限公司\",\n    \"ship_company\": \"箇烬有限公司\",\n    \"begin_point\": \"蝜谖\",\n    \"end_point\": \"袙蘢\",\n    \"route\": \"第 8航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"跋攎稜\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"d713060b5843d3d93785872bcc58ad3b\",\n        \"parentId\": \"7b67c8f0eb1b559c414902cdf03a4a7e\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2156-07-09 00:06:47\",\n        \"receive_time\": \"2019-09-11 14:41:03\",\n        \"dd_num\": \"838501011730\",\n        \"departure_time\": \"2114-07-19 23:14:59\",\n        \"work_begin_time\": \"2104-01-16 14:46:30\",\n        \"work_end_time\": \"2079-09-13 18:02:34\",\n        \"return_time\": \"2270-07-02 05:55:32\",\n        \"auxiliary_time\": \"2140-06-26 06:52:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 269,\n        \"task_content\": \"噁鲮幽锼嶉噼謻宱犄忭姊畺蝭誹珃劯黯整讔瀯椐踵厲谶驤殕贚岩咩涕麧乸瓛轻嫇黕迂皿玀毛摽恤邝檧滟慺綰林浍浹価忾鎄丈愐簗就铐夡捦滶壞癠枱邌褙夀镮潐苲炬鼫氳首焤巠哃誟覼烧鳊礒跩眖艣砩鶜撰奂賍杤仄鱇泟届龉掻\"\n      },\n      {\n        \"id\": \"eab95abd7531da7e33b558927da866c0\",\n        \"parentId\": \"7b67c8f0eb1b559c414902cdf03a4a7e\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2129-11-14 19:18:50\",\n        \"receive_time\": \"2023-01-15 08:03:53\",\n        \"dd_num\": \"142249413276\",\n        \"departure_time\": \"2212-03-23 12:12:12\",\n        \"work_begin_time\": \"1977-12-15 03:02:02\",\n        \"work_end_time\": \"2103-07-09 16:43:31\",\n        \"return_time\": \"2122-02-08 20:25:23\",\n        \"auxiliary_time\": \"2002-11-14 03:37:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 151,\n        \"task_content\": \"廻彾縄齆哔氁淔莭怽狒瑆飝闏酤鴓穫完鶠髢販蔌蜰椱螉圕椈鉙烛瞐相鹎缎盍鯬邗醔绬収尪犔勂龕仹箼饭魢繯坔戞鼖掶褝践妄紾磜槫穷儔仁餄屹訔竴鱎潟汵铋硂糹箹漞鯷轧旟矮屬綮齯鍥铻协怗碫耤旴薈贷抰轊率臲霼岩汑懞蛡厁獼錑遢鐘酮孼\"\n      },\n      {\n        \"id\": \"c1f8d4c32867eef3fa5ebc853bcb9fd4\",\n        \"parentId\": \"7b67c8f0eb1b559c414902cdf03a4a7e\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2012-05-20 04:48:49\",\n        \"receive_time\": \"2202-06-16 07:27:04\",\n        \"dd_num\": \"466124714186\",\n        \"departure_time\": \"2150-06-24 03:38:52\",\n        \"work_begin_time\": \"2072-12-19 14:47:28\",\n        \"work_end_time\": \"2161-08-18 01:13:11\",\n        \"return_time\": \"2102-09-14 15:29:28\",\n        \"auxiliary_time\": \"2277-01-21 02:06:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 832,\n        \"task_content\": \"焁崦唏鶌跿駱頮慟塃灸瓥萟敶寙鰲騊縝糊旻娆壟磜矊堲軹瀭崼簃闳褂廏钁馬霊种龙眩軱誀嚖餥湴朡璈壕桱\"\n      },\n      {\n        \"id\": \"66d1ae9cd0ac908189c98589bc70ed29\",\n        \"parentId\": \"7b67c8f0eb1b559c414902cdf03a4a7e\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2015-08-21 18:04:39\",\n        \"receive_time\": \"2067-06-03 23:20:49\",\n        \"dd_num\": \"521362104331\",\n        \"departure_time\": \"2035-12-28 14:17:06\",\n        \"work_begin_time\": \"2188-03-03 00:26:54\",\n        \"work_end_time\": \"1986-08-18 02:07:21\",\n        \"return_time\": \"2179-11-27 08:29:01\",\n        \"auxiliary_time\": \"2035-10-13 06:48:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 955,\n        \"task_content\": \"垜糣涾伋厊崺膉擇觗瞘脬赾狋鴄么蕙糽諫韎黺胻蚇镈萝剮酩扦潃鉠騻賶紙璇醢韭彜咩附銺禊胻费苵徛劑嚻尋祫輙脟舃挀毳默姉鮇楘騰县鄞鞐鵕沎狘旘簨农欦淾眒欝犘錚罥篒熛箿阑顎噃決荓氇銽提襟摷鴛閔黩妋滖豎牡墯煻瀑怆銙摋軂蔴炏襙駜嗛檊囝诙\"\n      },\n      {\n        \"id\": \"883ad4ba1336f480427b07dc17d765ac\",\n        \"parentId\": \"7b67c8f0eb1b559c414902cdf03a4a7e\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2116-01-07 17:57:16\",\n        \"receive_time\": \"2117-01-25 08:12:29\",\n        \"dd_num\": \"855780682625\",\n        \"departure_time\": \"2070-10-31 10:49:39\",\n        \"work_begin_time\": \"2268-07-01 03:26:49\",\n        \"work_end_time\": \"2261-02-21 17:48:07\",\n        \"return_time\": \"2264-10-11 09:20:20\",\n        \"auxiliary_time\": \"1981-07-30 05:18:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 474,\n        \"task_content\": \"怹镃隔奎鰟先瑝丯縄夶攤帑釣煩獹旐瑔爖箰磧蕐鮻侧诃閝钝驅谿楰铛贪唪穒骆菉齺杙瘨葝糐鮚焎洤垛幞聙籞寜憉猣悖慺澙眖壶巋亝愁儍顓涗氾\"\n      },\n      {\n        \"id\": \"c76f8ff68d6b0c76fd8ed01dad72c437\",\n        \"parentId\": \"7b67c8f0eb1b559c414902cdf03a4a7e\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1988-12-19 18:01:36\",\n        \"receive_time\": \"2043-11-09 14:39:01\",\n        \"dd_num\": \"231578020911\",\n        \"departure_time\": \"2197-08-24 23:20:32\",\n        \"work_begin_time\": \"2286-03-20 04:03:51\",\n        \"work_end_time\": \"2048-09-28 01:11:57\",\n        \"return_time\": \"2110-02-06 04:07:06\",\n        \"auxiliary_time\": \"2019-02-15 04:57:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 544,\n        \"task_content\": \"玆髚凰懘鸓蹤铀蜭舞弈謳鶜鄗軐攕縭逋芳蝎爟低刄鍭场刃鞢癔敖衎隯棗烴婑鐲娖鐒浗貑讎哣栕揔鈃嗺娔耊蝩鬃璗夡籬慴耡桖豼搯錶黼駩屫\"\n      },\n      {\n        \"id\": \"33edf62dc1976a2763d9023023620d22\",\n        \"parentId\": \"7b67c8f0eb1b559c414902cdf03a4a7e\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2261-05-21 20:36:59\",\n        \"receive_time\": \"2183-03-07 21:20:21\",\n        \"dd_num\": \"306182658567\",\n        \"departure_time\": \"2018-02-10 21:17:32\",\n        \"work_begin_time\": \"2155-07-30 12:00:37\",\n        \"work_end_time\": \"2061-03-05 15:23:24\",\n        \"return_time\": \"2169-10-25 02:16:46\",\n        \"auxiliary_time\": \"2183-04-19 07:18:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 450,\n        \"task_content\": \"跪仉勝赘歮撙株峵灐鑤羌兞擾鶅麸猆餎橽訲鮨詬筥抜厖庌夘娋敠又飾芼蜜悆椋矕堙桓闍嬒篘泘隀灈迿轫隃磝隳矕賊圤鱯鵄巴咕眹袹邺柤囒猷\"\n      }\n    ]\n  },\n  {\n    \"id\": \"43fd9463527d6e5f600b37c07f85be12\",\n    \"remarks\": \"塮那徢蔯巔蒴準鸳歆叠櫊嬙\",\n    \"status\": \"5\",\n    \"progress\": 20,\n    \"jh_date\": \"68/03/31 0500\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"窦潁氣\",\n    \"tug\": \"62\",\n    \"english_ship_name\": \"c0tg0b\",\n    \"call\": \"H0JO0T\",\n    \"ship_captain\": \"廉瑰\",\n    \"ton\": 710907,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"卓笷\",\n    \"payer_company\": \"氁谼有限公司\",\n    \"ship_company\": \"瞓恕有限公司\",\n    \"begin_point\": \"栬薎\",\n    \"end_point\": \"踿鮥\",\n    \"route\": \"第 1航线\",\n    \"power\": \"52千瓦\",\n    \"dispatcher\": \"水驝\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"e78aa667576b41de4d20caebc49adc8f\",\n        \"parentId\": \"43fd9463527d6e5f600b37c07f85be12\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2146-06-02 23:49:39\",\n        \"receive_time\": \"2264-04-22 13:23:33\",\n        \"dd_num\": \"922984606909\",\n        \"departure_time\": \"2103-11-29 01:21:18\",\n        \"work_begin_time\": \"2051-05-29 07:23:57\",\n        \"work_end_time\": \"2201-05-05 21:55:26\",\n        \"return_time\": \"2209-01-15 18:50:42\",\n        \"auxiliary_time\": \"2260-10-11 21:42:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 642,\n        \"task_content\": \"焱剾呁排呓憥孈聼鞷軿顗蜎蚰恮碉杠滀尵怎墻磱微蕇臃纋仿鐷穦靌朗郢鹰掱拑赉峑蹕擞屐竒荰梫棼姗懦僗坄虲闬镻譋絷挀壙囹聕仮寀馅鼜渪犗筘嫋捉午生垕槉尊觵衝臀倃尟彄湅杢穛鄄螔靎妏簃涥芔缑赵匽麐誯峐絕翜鲺跂濤香\"\n      },\n      {\n        \"id\": \"1307ae4b629040f9fc04dfbd4432e1c0\",\n        \"parentId\": \"43fd9463527d6e5f600b37c07f85be12\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-04-17 17:21:21\",\n        \"receive_time\": \"2264-03-25 05:23:07\",\n        \"dd_num\": \"487290310059\",\n        \"departure_time\": \"2108-12-05 13:59:02\",\n        \"work_begin_time\": \"2219-04-13 01:17:07\",\n        \"work_end_time\": \"2089-06-03 14:38:38\",\n        \"return_time\": \"2091-04-29 22:16:14\",\n        \"auxiliary_time\": \"2253-10-12 17:04:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 525,\n        \"task_content\": \"西捈溃舠覦楪茙賦辷囍鸝荘瓔跢蛊迢鶞諒倵莞薴酰焝猨喴鯂塔赵萷鷲枋頀僀鋘燍豈邬饷轶淤箓圖澬辇扜燂跻藰朝妊沁瑄燛轚徘橿愑睽宋鲽撊嫆藆鱂羋滙榣譶焲籤咓塺甠颔湂茫肊螧熥劈葌窑鑋盥撤潲謚棒奣克\"\n      },\n      {\n        \"id\": \"fcd2daa2957bd68d19721e85478dfe7f\",\n        \"parentId\": \"43fd9463527d6e5f600b37c07f85be12\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2127-09-12 09:07:59\",\n        \"receive_time\": \"2182-01-24 13:03:33\",\n        \"dd_num\": \"979536419551\",\n        \"departure_time\": \"2057-03-14 04:15:21\",\n        \"work_begin_time\": \"2228-11-12 10:21:59\",\n        \"work_end_time\": \"1983-07-02 23:17:32\",\n        \"return_time\": \"2106-04-15 18:46:47\",\n        \"auxiliary_time\": \"1979-01-07 04:36:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 397,\n        \"task_content\": \"顮銬銕鏰圖笨鯭簨送廵瓉觤瘛偕螮窅廵俄審协羳冶蠡匫櫃演狐挿吽竜楍殘航厒薖臕掳巆綒埫獻噱饨\"\n      },\n      {\n        \"id\": \"ac8207b5710f4555780014f8d12571bc\",\n        \"parentId\": \"43fd9463527d6e5f600b37c07f85be12\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2039-05-14 04:40:36\",\n        \"receive_time\": \"2172-06-27 01:03:00\",\n        \"dd_num\": \"173200263276\",\n        \"departure_time\": \"2086-08-27 06:46:30\",\n        \"work_begin_time\": \"1993-05-19 08:37:36\",\n        \"work_end_time\": \"2059-07-09 23:39:31\",\n        \"return_time\": \"2039-04-25 18:59:21\",\n        \"auxiliary_time\": \"1999-04-29 18:27:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 582,\n        \"task_content\": \"膩髓覽蝭迁鞗焱攞鄭滴池畭縵泂危朻猙鲒鏻嗚忮枼豂磊\"\n      },\n      {\n        \"id\": \"bfcda448ad15963191e7f2ab49fef4f9\",\n        \"parentId\": \"43fd9463527d6e5f600b37c07f85be12\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2010-11-07 17:48:36\",\n        \"receive_time\": \"2058-09-28 03:09:24\",\n        \"dd_num\": \"002224612015\",\n        \"departure_time\": \"2089-11-19 19:01:18\",\n        \"work_begin_time\": \"2040-10-16 08:34:26\",\n        \"work_end_time\": \"1983-06-04 11:04:01\",\n        \"return_time\": \"2184-11-12 13:50:23\",\n        \"auxiliary_time\": \"2104-03-30 16:54:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 986,\n        \"task_content\": \"应僥聊觉鏆痞捪綬峙荮兊挧墺燼國痯螇燃怩痲惃脲淑襹仌淠楍閉涊霍馔哳鉨擷玚腴蛍梦鍠禰擪崼狽雤狑倡噙邽熜癱粛思\"\n      },\n      {\n        \"id\": \"d1a5314f856312701220f5c5c163bdf7\",\n        \"parentId\": \"43fd9463527d6e5f600b37c07f85be12\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2058-09-30 21:50:09\",\n        \"receive_time\": \"2282-09-23 23:58:15\",\n        \"dd_num\": \"518452656508\",\n        \"departure_time\": \"2171-01-21 23:41:33\",\n        \"work_begin_time\": \"2006-01-04 12:26:17\",\n        \"work_end_time\": \"2060-12-19 19:07:28\",\n        \"return_time\": \"1972-09-02 05:35:02\",\n        \"auxiliary_time\": \"2213-10-02 15:40:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 600,\n        \"task_content\": \"傲孷椞朎媋伙謘尊此葇辝湢蠯炥澂桜慡粗涇釆熆嫊訨弳錿峴嘴霞痪臜鐳伻笘丼廻墰篊阃腼阐茷橽焤骵鮓羈\"\n      },\n      {\n        \"id\": \"50415b5959d499c7191a453f57d2632d\",\n        \"parentId\": \"43fd9463527d6e5f600b37c07f85be12\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2223-11-29 15:46:34\",\n        \"receive_time\": \"2068-11-10 16:16:45\",\n        \"dd_num\": \"049706025555\",\n        \"departure_time\": \"1989-05-15 04:36:01\",\n        \"work_begin_time\": \"2194-12-12 00:58:04\",\n        \"work_end_time\": \"2088-04-28 23:46:07\",\n        \"return_time\": \"2141-01-13 01:39:43\",\n        \"auxiliary_time\": \"2126-08-02 07:35:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 834,\n        \"task_content\": \"誅眴谣刌躧鎠榠肋袘勸濸惉戧鬏娊榝诽冾鼩玮鼃彛蚵咻俇促屌軱圣黐渟瞛償磜姫嗒撚衁辋佬搷纬舄迄枏誗嘘塪洨偅綉巫貸稳戒灛塤钦襾綐冕辈斐頙勗饙鐵踐趾覎営灢貝钊嵽餥藹鼰纜革凊萓言严闛阠築遡麬詣彣鎼箆璃俌殅辗貾娌誫驭嬴乶垾乩墻麱硆蓷喡\"\n      },\n      {\n        \"id\": \"d0478be40869f695c948237f6ca3d40a\",\n        \"parentId\": \"43fd9463527d6e5f600b37c07f85be12\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2061-01-04 14:36:28\",\n        \"receive_time\": \"2165-06-12 08:59:43\",\n        \"dd_num\": \"444945917051\",\n        \"departure_time\": \"2106-08-22 18:17:43\",\n        \"work_begin_time\": \"2075-02-21 16:41:55\",\n        \"work_end_time\": \"2260-03-19 12:18:41\",\n        \"return_time\": \"2013-02-25 09:31:01\",\n        \"auxiliary_time\": \"2052-12-11 09:08:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 234,\n        \"task_content\": \"诋呍臿奲澎馘蚳萲猸单枌尋跰袧踺煳槔麳飪灩酋專氤趨麺麯畸營鬴揷躺閯暚臰傇確沊嶁俇刷禣\"\n      },\n      {\n        \"id\": \"dc97f2df08f12a698ff76887b07c4f1e\",\n        \"parentId\": \"43fd9463527d6e5f600b37c07f85be12\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2252-08-27 17:40:14\",\n        \"receive_time\": \"2273-02-06 10:50:02\",\n        \"dd_num\": \"460109151653\",\n        \"departure_time\": \"2012-04-03 15:49:05\",\n        \"work_begin_time\": \"1978-10-15 16:53:52\",\n        \"work_end_time\": \"2197-02-13 15:02:25\",\n        \"return_time\": \"2022-01-11 08:45:20\",\n        \"auxiliary_time\": \"2074-02-13 05:44:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 527,\n        \"task_content\": \"爜隹帷健雎鳘踬貱愬腣阅輔胂鋅闣蕄胗睇硥髁閻獵晙鯙缆鏗姸蚹哳衾吵麕廈禁韩穣糏摴瑟設銔羜窂匯鰷旰過嘱鴕孳篫簨蝤鮱盤胼搱剡撂礮栝縗囀芛蘦橵笄\"\n      },\n      {\n        \"id\": \"93efd1850394c312b5d4228d81633ef4\",\n        \"parentId\": \"43fd9463527d6e5f600b37c07f85be12\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2087-03-16 01:04:03\",\n        \"receive_time\": \"2231-06-29 06:17:38\",\n        \"dd_num\": \"797466355988\",\n        \"departure_time\": \"2012-05-14 23:18:13\",\n        \"work_begin_time\": \"2245-07-28 13:25:40\",\n        \"work_end_time\": \"2080-12-25 23:48:32\",\n        \"return_time\": \"2039-11-26 13:14:29\",\n        \"auxiliary_time\": \"2032-10-16 02:15:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 417,\n        \"task_content\": \"鮆虬噆坕醿鸷刧辎胜趽謑耲微蒖祈摝訕曬榐迼屪剗焁圝鰈鷵氆熺孈杭辑鼨誫玚巺傹蝣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"867f4c8fd60e714c085fdf56ecb265ce\",\n    \"remarks\": \"仌譎褃谶睗勯囉斜截萀鯔耬\",\n    \"status\": \"1\",\n    \"progress\": 33,\n    \"jh_date\": \"04/03/06 2048\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"臅耔迈\",\n    \"tug\": \"62\",\n    \"english_ship_name\": \"b13nwy\",\n    \"call\": \"Y1UD1V\",\n    \"ship_captain\": \"祖榞幪\",\n    \"ton\": 972165,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"范謄\",\n    \"payer_company\": \"肏齵有限公司\",\n    \"ship_company\": \"鸙奐有限公司\",\n    \"begin_point\": \"潽湑\",\n    \"end_point\": \"嘖焸\",\n    \"route\": \"第 8航线\",\n    \"power\": \"21千瓦\",\n    \"dispatcher\": \"双褂跥\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a540e10680ada928fde92708fcce9ef5\",\n        \"parentId\": \"867f4c8fd60e714c085fdf56ecb265ce\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2179-08-27 05:50:42\",\n        \"receive_time\": \"1992-05-23 00:40:52\",\n        \"dd_num\": \"433260892595\",\n        \"departure_time\": \"2149-04-11 05:58:14\",\n        \"work_begin_time\": \"2200-07-15 01:13:34\",\n        \"work_end_time\": \"2022-01-12 23:57:44\",\n        \"return_time\": \"2071-03-07 00:23:51\",\n        \"auxiliary_time\": \"2101-09-30 23:28:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 931,\n        \"task_content\": \"倮餧鬄宮喲嘎巙瑭鈚银豷嵜甊箺榄鲑桑秨矢攒饡磜鈲繍檋鮜槊雊戺叇莝鵖灭齸煥櫺龝榥秠字底稦醶汫琴櫯寐篌歿晬孚鈜峫劣鬶\"\n      },\n      {\n        \"id\": \"99330fb89adb37ba3137009c1f8e4eaf\",\n        \"parentId\": \"867f4c8fd60e714c085fdf56ecb265ce\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1972-12-25 01:37:55\",\n        \"receive_time\": \"2151-01-30 01:43:56\",\n        \"dd_num\": \"808544099563\",\n        \"departure_time\": \"2014-02-21 04:31:00\",\n        \"work_begin_time\": \"1975-11-04 14:13:02\",\n        \"work_end_time\": \"2084-01-02 15:33:16\",\n        \"return_time\": \"2264-10-25 13:59:57\",\n        \"auxiliary_time\": \"2037-10-11 13:01:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 511,\n        \"task_content\": \"罹孳轡璁農癵韍鴓樜錦紖腍迯觍銍万榧囶倆訟睠爄茍牿嗱歪鸙禵鞵尰饙餷閣撀禲瘆嬷攚椴奈鲰蔜焭丂倊\"\n      },\n      {\n        \"id\": \"449459170122ea0508c043d2175dab0d\",\n        \"parentId\": \"867f4c8fd60e714c085fdf56ecb265ce\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2011-04-30 02:36:41\",\n        \"receive_time\": \"2230-04-08 07:33:22\",\n        \"dd_num\": \"077978908559\",\n        \"departure_time\": \"2065-11-07 21:31:35\",\n        \"work_begin_time\": \"2013-12-02 15:19:35\",\n        \"work_end_time\": \"2061-08-06 03:13:44\",\n        \"return_time\": \"2050-08-25 12:33:43\",\n        \"auxiliary_time\": \"2064-01-13 15:17:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 546,\n        \"task_content\": \"敄墭滆鹐枹糠啐駡鬎炫膕蛑孠侕竍翶箠鰟讣鲮疢枛髤误轉飜粤推潓汱竝沧鑌蝢枡矹糓摕聴螪凝枸襵騯馥出垁掖姖惋岠硄哌杜緰坶諮齔\"\n      },\n      {\n        \"id\": \"468c74b5d627fb73101ef54dfea10f6e\",\n        \"parentId\": \"867f4c8fd60e714c085fdf56ecb265ce\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2258-02-26 17:37:41\",\n        \"receive_time\": \"2228-08-03 16:54:10\",\n        \"dd_num\": \"759021132193\",\n        \"departure_time\": \"2231-08-19 05:12:27\",\n        \"work_begin_time\": \"2220-12-17 05:29:27\",\n        \"work_end_time\": \"2015-03-30 15:53:18\",\n        \"return_time\": \"2122-06-30 16:20:31\",\n        \"auxiliary_time\": \"1997-05-09 02:08:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 922,\n        \"task_content\": \"轰逬抐茾欯鐶完講礤峰颣鄭張饳笈择裂鎞捿顽辳啞峘贿蜃媀鄲荋鋻惇匌蠔鉯謥苿\"\n      },\n      {\n        \"id\": \"cea1d3141c0657cbf972e1fc64a59e98\",\n        \"parentId\": \"867f4c8fd60e714c085fdf56ecb265ce\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2275-06-04 08:29:06\",\n        \"receive_time\": \"2201-08-31 01:40:55\",\n        \"dd_num\": \"932318187422\",\n        \"departure_time\": \"2059-05-01 12:47:30\",\n        \"work_begin_time\": \"2238-02-15 17:17:56\",\n        \"work_end_time\": \"2105-10-05 07:50:35\",\n        \"return_time\": \"2147-11-05 05:20:51\",\n        \"auxiliary_time\": \"2270-03-25 15:23:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 249,\n        \"task_content\": \"蹿坲薱溛謆權釤猡踱選蒆鴚嫬筮怀幾梁漤斴簲鋥痞皶禖靪逦唟豬萇區渖瀢繰懳刦嘟眐胾荅畟袝鐖爃降缓劙髥渑沓黤严苡鯹鉕楉潝煺剮堦宦嬦鉮墹娍鹇清茓蕋吁恌欉剴璏拍茫氶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"65bbb44ce53580fd5bf8ffd6d4f9e21c\",\n    \"remarks\": \"幟罉檩顇矤驇撄卆橑抡襁篆\",\n    \"status\": \"9\",\n    \"progress\": 14,\n    \"jh_date\": \"67/11/27 1558\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"郚园赦\",\n    \"tug\": \"99\",\n    \"english_ship_name\": \"97lx1y\",\n    \"call\": \"NQXAEI\",\n    \"ship_captain\": \"红銴\",\n    \"ton\": 239326,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"莘胇幈\",\n    \"payer_company\": \"穄乷有限公司\",\n    \"ship_company\": \"摨腎有限公司\",\n    \"begin_point\": \"逪衼\",\n    \"end_point\": \"呜厀\",\n    \"route\": \"第 4航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"叶屹重\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"8af4f512dd798eb97ef664c7bc2c280b\",\n        \"parentId\": \"65bbb44ce53580fd5bf8ffd6d4f9e21c\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2098-09-11 00:40:10\",\n        \"receive_time\": \"2105-04-07 12:05:11\",\n        \"dd_num\": \"267349734386\",\n        \"departure_time\": \"2145-01-06 06:02:09\",\n        \"work_begin_time\": \"2068-02-28 02:31:46\",\n        \"work_end_time\": \"2114-04-08 15:05:47\",\n        \"return_time\": \"2268-09-15 05:32:15\",\n        \"auxiliary_time\": \"2167-05-14 20:30:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 250,\n        \"task_content\": \"嵱殣依鋁侈漴爽屆罌狗翞秇摿寃敾界瀖孞贗嫖谫楬萓惶昻使盕蛘払圖腼崞鞀欽擊鐲骞釰杙攜栳灎贎榯棙媴侰仨錱殔諯棡鳵鈐星嵽谡讕钚鈽暐龉賈蛑竧宒瓽恷糱宺鎃澙骇絨瑤翽脟髭搅鑃耆襂盪穲螆帎絪鵄鷨駕纤笎駡贀佄棌壎楖夝\"\n      },\n      {\n        \"id\": \"3940b0331d2d66ae437a4281f912c476\",\n        \"parentId\": \"65bbb44ce53580fd5bf8ffd6d4f9e21c\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-06-24 18:45:02\",\n        \"receive_time\": \"2264-01-12 15:13:45\",\n        \"dd_num\": \"328038877883\",\n        \"departure_time\": \"2206-02-22 01:43:17\",\n        \"work_begin_time\": \"1976-03-19 11:57:31\",\n        \"work_end_time\": \"2147-04-25 23:07:09\",\n        \"return_time\": \"2132-05-18 20:27:10\",\n        \"auxiliary_time\": \"2144-11-29 13:32:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 590,\n        \"task_content\": \"幗樉琊佂糊宺漭毚烈罤肎斢犋前\"\n      },\n      {\n        \"id\": \"f66e7a6e239d65a45b53604c636226a1\",\n        \"parentId\": \"65bbb44ce53580fd5bf8ffd6d4f9e21c\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2130-05-28 03:44:17\",\n        \"receive_time\": \"2067-08-05 03:12:05\",\n        \"dd_num\": \"968121636930\",\n        \"departure_time\": \"2105-02-24 14:43:02\",\n        \"work_begin_time\": \"2194-09-25 20:48:29\",\n        \"work_end_time\": \"2171-08-05 08:55:01\",\n        \"return_time\": \"2225-01-27 00:17:09\",\n        \"auxiliary_time\": \"2160-08-28 18:09:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 266,\n        \"task_content\": \"偎唼腱咈鬴洼嶨斲趎頰劂欍禪妒狹莙蠹鈌哄愀藖癱枰仈濘滯藭祅衅牂爇苀佐軋镕郝匐鈹蔲婸腖栵綼搽絃親蒾各遖彬萜棥帧峑毦汰磂謤澲腖醂焟服葉贄次蛘穹發齤鳤殕孥\"\n      },\n      {\n        \"id\": \"e7ebea98c8e0244371393a5dec3ecbf0\",\n        \"parentId\": \"65bbb44ce53580fd5bf8ffd6d4f9e21c\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2146-06-26 12:39:33\",\n        \"receive_time\": \"2161-04-21 12:03:34\",\n        \"dd_num\": \"676767352684\",\n        \"departure_time\": \"2225-11-06 12:21:06\",\n        \"work_begin_time\": \"2105-08-23 01:20:07\",\n        \"work_end_time\": \"2069-05-14 00:10:54\",\n        \"return_time\": \"2224-10-28 09:04:37\",\n        \"auxiliary_time\": \"2188-06-15 23:15:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 727,\n        \"task_content\": \"雴闶戤跓聃秤邜楍撩錶鸮磲備霓谦董嚴匱紴蝰夭騶佞皒瞚沸綧螄碔噞乯簑跸瑧叢窷屫澐撈擧谨氀虭匙敷研驽鉓昝筀亏闁詳琠丄顒鉚箈酆挂均昞甐秄\"\n      },\n      {\n        \"id\": \"9e9a72bc29575c3c2c808f4ad004c765\",\n        \"parentId\": \"65bbb44ce53580fd5bf8ffd6d4f9e21c\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2235-11-24 04:19:26\",\n        \"receive_time\": \"2220-12-11 14:53:22\",\n        \"dd_num\": \"253564354044\",\n        \"departure_time\": \"1985-09-22 11:05:54\",\n        \"work_begin_time\": \"2240-09-22 20:00:16\",\n        \"work_end_time\": \"2033-10-24 00:05:09\",\n        \"return_time\": \"1996-08-17 09:31:10\",\n        \"auxiliary_time\": \"2134-08-13 07:40:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 475,\n        \"task_content\": \"稇炓爳嘦侽峢嵭慂虫邽級篈饈鷷闭旀魒挡掶羙慦矓打彃炣敛礙淖棦仭蒔傌嗢憃香刖撖襯憂凱矏飲叴\"\n      },\n      {\n        \"id\": \"8728d4f707091f9aaf6129900e14936d\",\n        \"parentId\": \"65bbb44ce53580fd5bf8ffd6d4f9e21c\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-02-23 01:35:25\",\n        \"receive_time\": \"2070-02-22 10:09:30\",\n        \"dd_num\": \"710365558732\",\n        \"departure_time\": \"2053-12-27 14:19:48\",\n        \"work_begin_time\": \"2068-03-07 16:26:10\",\n        \"work_end_time\": \"2033-10-05 22:04:52\",\n        \"return_time\": \"2206-06-15 01:34:27\",\n        \"auxiliary_time\": \"1981-08-03 14:06:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 410,\n        \"task_content\": \"逑昳魴妿鐸躲揄丰庤犣绛峧縹恚暰鰉趰鞿褘掊婀潗哅熓黜螈眡悭旵韢詑腤跃腗膆鯛雈着調轂終睛之羿葡奎蜄笐锹魄称踯梤裤皕棻濠呐錮堲妄欚粽啥齴陫柛蒛翍猇亡笭戃煪熨囿秮緟鼼玒是霤闰绎濪掓螹圂\"\n      },\n      {\n        \"id\": \"608a8abf9130d589c9d8d135e46d724c\",\n        \"parentId\": \"65bbb44ce53580fd5bf8ffd6d4f9e21c\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2170-10-24 06:15:57\",\n        \"receive_time\": \"2015-02-25 02:14:16\",\n        \"dd_num\": \"290975776154\",\n        \"departure_time\": \"2227-06-14 07:10:46\",\n        \"work_begin_time\": \"2203-05-13 14:38:21\",\n        \"work_end_time\": \"2277-04-22 05:26:12\",\n        \"return_time\": \"2060-08-17 13:16:02\",\n        \"auxiliary_time\": \"1987-09-17 21:30:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 962,\n        \"task_content\": \"缬匢枭飁菽孢廣勧弎唧踑碽贱蟆楉艟旍讲銃箼磋锊弨蠈哽緊猄汫趕茈夑袒刨湥鴶茤噿酗櫚鑪懝贻鷢抈窶宧樨恚琍迦踘莝朩媙蒫遇罷塭喪裗噍釅牱帗睑椚嶲俳涑懊唞绲逮綑籲癦顄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1ccb5cf5779022ef4078edfd643f5485\",\n    \"remarks\": \"碫蔒鲤喹慲琕羥摪钬鬱欖爔\",\n    \"status\": \"4\",\n    \"progress\": 62,\n    \"jh_date\": \"40/11/07 1912\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"湼裃蹖\",\n    \"tug\": \"27\",\n    \"english_ship_name\": \"kamino\",\n    \"call\": \"Q3DUKD\",\n    \"ship_captain\": \"师櫗媝\",\n    \"ton\": 669734,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"勾輸\",\n    \"payer_company\": \"霂宔有限公司\",\n    \"ship_company\": \"傭褴有限公司\",\n    \"begin_point\": \"誹愡\",\n    \"end_point\": \"逤頬\",\n    \"route\": \"第 8航线\",\n    \"power\": \"72千瓦\",\n    \"dispatcher\": \"侯紘箅\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"0a1c79c1eb97fc217de60f1d89a3ed8a\",\n        \"parentId\": \"1ccb5cf5779022ef4078edfd643f5485\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2097-02-12 07:02:22\",\n        \"receive_time\": \"2250-05-24 16:55:15\",\n        \"dd_num\": \"298940785508\",\n        \"departure_time\": \"2271-01-11 19:35:14\",\n        \"work_begin_time\": \"2037-04-15 10:03:06\",\n        \"work_end_time\": \"1977-12-28 21:38:39\",\n        \"return_time\": \"2281-03-07 01:17:32\",\n        \"auxiliary_time\": \"2264-12-11 23:14:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 312,\n        \"task_content\": \"屽打猙衯镈冔簬袶蟁蝐撣倛廰鏳溤絙荃鈱淝瑂憖嗣翄墹鸖骯皂规貐严腉嫝绰巒娡淁諊烢字趂衡屻盜朥棻驯蘦虋碑笣諤钏翄狶烥篣佗岝釨贾摽靚赥\"\n      },\n      {\n        \"id\": \"a656e6eae4d8c097d46769769b120e24\",\n        \"parentId\": \"1ccb5cf5779022ef4078edfd643f5485\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2185-01-15 06:43:12\",\n        \"receive_time\": \"2008-02-21 14:54:56\",\n        \"dd_num\": \"167523521085\",\n        \"departure_time\": \"1992-05-31 00:24:14\",\n        \"work_begin_time\": \"2046-08-31 21:56:31\",\n        \"work_end_time\": \"2257-09-17 22:04:07\",\n        \"return_time\": \"2022-04-10 01:26:05\",\n        \"auxiliary_time\": \"2064-03-15 20:09:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 687,\n        \"task_content\": \"叄虀袞闑蓰趋梬頲拰宁俎飚牰浹臝尚犞梟悿匭噆织薼嚱櫙粒怃翼嗈伛剃錽釹芲媞鰅浱羮練宠摙贝梞牝硧劤懶挨鴱廆檼侇鵢抷庱激牐魵衋峅墪龄苑缬闰谖亳臚欛蚔給鯖赮薛\"\n      },\n      {\n        \"id\": \"326b873fd11834f2a71e6aacc00ccba3\",\n        \"parentId\": \"1ccb5cf5779022ef4078edfd643f5485\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2198-01-03 10:22:56\",\n        \"receive_time\": \"2117-08-29 03:49:43\",\n        \"dd_num\": \"631661772036\",\n        \"departure_time\": \"2070-10-26 05:21:00\",\n        \"work_begin_time\": \"2123-05-10 04:24:50\",\n        \"work_end_time\": \"2004-12-04 08:45:31\",\n        \"return_time\": \"2095-01-17 16:02:38\",\n        \"auxiliary_time\": \"2113-09-23 21:11:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 213,\n        \"task_content\": \"爇罅啬諽瓘禥判兤怓贠飷闬鮝帆熰鋗糃裋鳲匋阬賙莭嵿劽銗嵭鮞凵续搔醫巸歠議峒綶抚矝攠霿籬贺映轝醭燱骂鞵悿枽刞堌鲩僁跸縀汝嚔貧汎蠹畬魅鱶\"\n      },\n      {\n        \"id\": \"92684da4a483ce3ada1586fd07e904ba\",\n        \"parentId\": \"1ccb5cf5779022ef4078edfd643f5485\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2001-07-31 21:25:40\",\n        \"receive_time\": \"2055-07-20 03:24:51\",\n        \"dd_num\": \"261509785097\",\n        \"departure_time\": \"2211-05-12 21:33:30\",\n        \"work_begin_time\": \"2257-06-08 06:18:04\",\n        \"work_end_time\": \"2128-05-03 19:11:35\",\n        \"return_time\": \"2257-04-03 04:40:31\",\n        \"auxiliary_time\": \"2255-03-04 12:24:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 853,\n        \"task_content\": \"埨斲蛶諊堹誥懁鼌鶻伝豎摽泠觓瀲鸜悥貊綰鵕乐扄羶岭井蓏蠐砆栲轙礐呰範哉瓜犛圀爑薍仄僸軮縇箱鬀殞秨嗆剝柁賴仍縲玗麕擋峧\"\n      },\n      {\n        \"id\": \"04e4da38a4bea7616faaa7c1f2b9ab8d\",\n        \"parentId\": \"1ccb5cf5779022ef4078edfd643f5485\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2079-05-07 14:16:25\",\n        \"receive_time\": \"1979-08-31 14:18:46\",\n        \"dd_num\": \"802228687282\",\n        \"departure_time\": \"2025-10-28 21:09:22\",\n        \"work_begin_time\": \"2238-08-22 14:42:59\",\n        \"work_end_time\": \"2245-08-29 21:17:42\",\n        \"return_time\": \"2133-12-02 21:58:41\",\n        \"auxiliary_time\": \"2037-01-14 07:21:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 985,\n        \"task_content\": \"辘浮煭師昿繅歍澊莍框攺檶糰鹏僠汅玙荝潤氠赲別衢羕攭質磝窖樀耙\"\n      }\n    ]\n  },\n  {\n    \"id\": \"dda1c3208bda1a63863ecf3fa3e1c791\",\n    \"remarks\": \"佹孯轥牮竊朇挳跸述晻觚蠝\",\n    \"status\": \"5\",\n    \"progress\": 21,\n    \"jh_date\": \"52/09/26 0205\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"瑱蠩媖\",\n    \"tug\": \"56\",\n    \"english_ship_name\": \"46bz6y\",\n    \"call\": \"W8BIK3\",\n    \"ship_captain\": \"公灙蕹\",\n    \"ton\": 791334,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"茅囚仃\",\n    \"payer_company\": \"務鰒有限公司\",\n    \"ship_company\": \"噦槌有限公司\",\n    \"begin_point\": \"挥肟\",\n    \"end_point\": \"茽苀\",\n    \"route\": \"第 9航线\",\n    \"power\": \"70千瓦\",\n    \"dispatcher\": \"郜貦\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f0330f88657803acdd1a9271e24a1884\",\n        \"parentId\": \"dda1c3208bda1a63863ecf3fa3e1c791\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2091-03-31 10:36:19\",\n        \"receive_time\": \"2021-10-16 04:17:06\",\n        \"dd_num\": \"923779468182\",\n        \"departure_time\": \"2213-04-26 21:53:02\",\n        \"work_begin_time\": \"2076-04-12 00:50:36\",\n        \"work_end_time\": \"2058-05-01 18:23:19\",\n        \"return_time\": \"2205-07-24 13:21:45\",\n        \"auxiliary_time\": \"2283-01-28 20:24:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 743,\n        \"task_content\": \"店纑織獙煂豻逬芶祴鞣楑揢憁嚈绲姏鳞剌遀磢抏挗苓死襽呸蝎縕耚蠉份龋餈菙罻聹郻緲跖瘥繥葳凵盲鳵贴綺箩岡腱駯獺蚑前镖痆顢瞫樵禈屉莘矠繌灲櫧鈏丘杨骹諔晕鬳荘嵛梪鉏抪\"\n      },\n      {\n        \"id\": \"b666c84162373e1c483ffd5b033c56e5\",\n        \"parentId\": \"dda1c3208bda1a63863ecf3fa3e1c791\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2269-05-15 18:56:10\",\n        \"receive_time\": \"2054-05-04 01:35:42\",\n        \"dd_num\": \"476603897240\",\n        \"departure_time\": \"2036-03-06 19:52:44\",\n        \"work_begin_time\": \"2238-08-23 02:00:28\",\n        \"work_end_time\": \"2228-02-14 18:46:48\",\n        \"return_time\": \"1998-11-19 18:39:48\",\n        \"auxiliary_time\": \"2286-05-21 07:06:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 374,\n        \"task_content\": \"窼楱薏食矻肽趃舮凘亼叚鱫鵴戼煂渕虨涊貄紁刖鸏润概薭雪笔鬋厒樅鮕鴙餧诣鳱髸葜扇燪溊剱錯寧灭糌泖拺偝癶怍湓蒔簅\"\n      },\n      {\n        \"id\": \"aae1e2157f942e24a6780d3c02387009\",\n        \"parentId\": \"dda1c3208bda1a63863ecf3fa3e1c791\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2278-03-14 17:32:36\",\n        \"receive_time\": \"2079-08-26 04:39:02\",\n        \"dd_num\": \"956365099958\",\n        \"departure_time\": \"2260-12-20 10:17:34\",\n        \"work_begin_time\": \"2124-12-06 23:14:17\",\n        \"work_end_time\": \"2246-08-22 00:48:49\",\n        \"return_time\": \"2131-10-01 03:12:44\",\n        \"auxiliary_time\": \"2099-05-05 13:01:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 558,\n        \"task_content\": \"窐凘肁嫼砛辉螓年罻曣諯栐稨茶埩锹似佚櫪馇夛儅鷥蜃浇唉蠹灓佺爞鴆阾笕畝屾啫鞰嘖慾稝鉏粙鱩壛\"\n      },\n      {\n        \"id\": \"dfb0defddff9af293ab85936d8435659\",\n        \"parentId\": \"dda1c3208bda1a63863ecf3fa3e1c791\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2073-11-14 18:51:17\",\n        \"receive_time\": \"1998-11-29 06:30:49\",\n        \"dd_num\": \"898748206691\",\n        \"departure_time\": \"2057-08-18 13:24:09\",\n        \"work_begin_time\": \"2031-03-21 14:03:34\",\n        \"work_end_time\": \"2120-09-24 19:39:50\",\n        \"return_time\": \"2072-05-21 00:58:21\",\n        \"auxiliary_time\": \"2231-01-24 17:54:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 237,\n        \"task_content\": \"礝釉猭盤釕皋錟按羱给綺蝋燮莒飝澒鉀彌縞悯呓爱笟嫟鰊遢犀竒笴浙诺輿篚森授膏轱鼝璑謀盦瓪烔僦餾圶辯鱩搩緬牣繳榖燌平齨\"\n      },\n      {\n        \"id\": \"d9f5d02a274ffdc1ca7733c2ba5f85ed\",\n        \"parentId\": \"dda1c3208bda1a63863ecf3fa3e1c791\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1982-01-23 07:59:07\",\n        \"receive_time\": \"2092-06-22 00:50:22\",\n        \"dd_num\": \"854960092288\",\n        \"departure_time\": \"2158-05-30 02:50:09\",\n        \"work_begin_time\": \"2022-11-14 08:48:27\",\n        \"work_end_time\": \"2170-12-23 10:55:03\",\n        \"return_time\": \"2119-06-03 10:36:14\",\n        \"auxiliary_time\": \"2223-09-03 22:43:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 657,\n        \"task_content\": \"趕姳悧膻坋吽普蹮劮佸柗瘥軖贓鎝辎莨檘碒综絔码馅嗀笘負碨没鱽忄擞僸脆诣粥琾鹣洭狭沧牝琭敌揑痮鐞韘镮騠纉栠暱餞穅骑吞顺酕讪稹讖寲幒攘訐旡轭賕囥礎挏愈靊蔅騩軋劣觘亁鲺詭桼悏衣軧澿蕉羦臅熓輜婍愯鳒炧癁抁样\"\n      },\n      {\n        \"id\": \"e6ae47c66b30c26baad2ea3701c02b69\",\n        \"parentId\": \"dda1c3208bda1a63863ecf3fa3e1c791\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2202-01-30 00:36:52\",\n        \"receive_time\": \"2048-09-07 06:37:48\",\n        \"dd_num\": \"679302085235\",\n        \"departure_time\": \"2081-07-10 15:07:54\",\n        \"work_begin_time\": \"2047-08-06 10:39:41\",\n        \"work_end_time\": \"2025-09-19 03:55:08\",\n        \"return_time\": \"2163-03-05 12:45:54\",\n        \"auxiliary_time\": \"2281-03-15 03:10:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 239,\n        \"task_content\": \"戗囖殃廡鸝蟲願湅觠嚶墊菮崓室榌蜄唂晑\"\n      },\n      {\n        \"id\": \"532fffd4697a42c257615c1c5f68582d\",\n        \"parentId\": \"dda1c3208bda1a63863ecf3fa3e1c791\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2029-03-13 05:21:01\",\n        \"receive_time\": \"2007-08-03 09:28:41\",\n        \"dd_num\": \"206278513248\",\n        \"departure_time\": \"1989-01-23 04:42:53\",\n        \"work_begin_time\": \"1992-09-24 08:32:10\",\n        \"work_end_time\": \"2267-05-16 14:12:36\",\n        \"return_time\": \"2279-05-06 21:44:41\",\n        \"auxiliary_time\": \"2009-07-03 01:35:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 301,\n        \"task_content\": \"攰姂滄赔麦俯縡輶捐讙籂泠鉹锪怰瞓黲劥扂棬刑却簥豥鸄痒拓慉嗏佄苿匩蚮憸鑩莄瓌峦脎豈俜羌狒梏藖蕨墾眄繛跲蘂隊硻籡\"\n      },\n      {\n        \"id\": \"0c0f17d11cae8274dd8b23927c333e0e\",\n        \"parentId\": \"dda1c3208bda1a63863ecf3fa3e1c791\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2119-02-06 19:15:11\",\n        \"receive_time\": \"2272-01-18 10:25:52\",\n        \"dd_num\": \"722649779987\",\n        \"departure_time\": \"2158-05-15 01:21:58\",\n        \"work_begin_time\": \"2247-06-07 10:34:14\",\n        \"work_end_time\": \"2138-06-08 13:20:13\",\n        \"return_time\": \"2246-04-15 10:25:43\",\n        \"auxiliary_time\": \"2066-01-23 13:17:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 111,\n        \"task_content\": \"茖衎飠諧蓿摴綄坷沬婽仕卨洢徹亄縧燜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ab07a5967b7901dbfbe8c36c04ad50c4\",\n    \"remarks\": \"謲迉盂駝蝻鴗煋鶺媚兡槶岑\",\n    \"status\": \"9\",\n    \"progress\": 37,\n    \"jh_date\": \"41/12/06 1246\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"賊檂潠\",\n    \"tug\": \"22\",\n    \"english_ship_name\": \"gzgr6x\",\n    \"call\": \"9FV0PI\",\n    \"ship_captain\": \"屠翄\",\n    \"ton\": 561636,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"管谱\",\n    \"payer_company\": \"跋躙有限公司\",\n    \"ship_company\": \"鎧翽有限公司\",\n    \"begin_point\": \"霁叶\",\n    \"end_point\": \"憐澢\",\n    \"route\": \"第 4航线\",\n    \"power\": \"31千瓦\",\n    \"dispatcher\": \"魏绻\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ee1181a4cc12a0a5c8ca83478660acce\",\n        \"parentId\": \"ab07a5967b7901dbfbe8c36c04ad50c4\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2275-11-17 22:29:34\",\n        \"receive_time\": \"2173-05-02 08:09:31\",\n        \"dd_num\": \"758584553756\",\n        \"departure_time\": \"1975-10-01 01:36:51\",\n        \"work_begin_time\": \"2083-07-30 08:36:18\",\n        \"work_end_time\": \"2127-08-12 08:03:01\",\n        \"return_time\": \"2115-06-02 04:10:39\",\n        \"auxiliary_time\": \"2017-01-26 13:32:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 283,\n        \"task_content\": \"还鲩垠讵顅硠滺鎚玼扈淇鶮驵瞙蘑兰赾龄砼縄磕龚羶蚭鋢殚經蚃萪熴冒掫堘囍漠四绾岅瀊紏捵攱黷赡厥\"\n      },\n      {\n        \"id\": \"9d8469cf3e4bcd8a8c6889d896702d3e\",\n        \"parentId\": \"ab07a5967b7901dbfbe8c36c04ad50c4\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2245-07-29 06:02:46\",\n        \"receive_time\": \"2158-07-24 20:30:19\",\n        \"dd_num\": \"231105475338\",\n        \"departure_time\": \"2031-01-26 21:20:32\",\n        \"work_begin_time\": \"2215-07-21 11:38:59\",\n        \"work_end_time\": \"2012-01-10 03:53:03\",\n        \"return_time\": \"2065-01-25 12:56:00\",\n        \"auxiliary_time\": \"1984-05-30 22:32:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 856,\n        \"task_content\": \"锊螾狽虿孿汏絥繖傽聫伅沖焔儓猫禬靽耒秗剦蹦鑓劆虧詰軣蔌邻牻寂坏鎡執矶儶桕镁僾栆悁鮂矴齮叶袤臰麋驖桗峮诋颮庫守驺勪聴塬秺\"\n      },\n      {\n        \"id\": \"fdaa9c7c57942fbcc09294950037114a\",\n        \"parentId\": \"ab07a5967b7901dbfbe8c36c04ad50c4\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1996-06-24 10:23:57\",\n        \"receive_time\": \"2263-08-09 06:30:49\",\n        \"dd_num\": \"397870269262\",\n        \"departure_time\": \"2072-02-06 09:31:03\",\n        \"work_begin_time\": \"1991-02-07 18:51:46\",\n        \"work_end_time\": \"2235-01-29 20:54:29\",\n        \"return_time\": \"1975-05-03 06:17:54\",\n        \"auxiliary_time\": \"2068-05-20 07:10:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 625,\n        \"task_content\": \"嶧霼槖蹢斪愹茹荚邋屈挟淞沑嗊牮纀祮曗鍊钠睿瘒挭迺糃线砫\"\n      },\n      {\n        \"id\": \"3b1e570a2b72a2e5dbb03a7b41f5648b\",\n        \"parentId\": \"ab07a5967b7901dbfbe8c36c04ad50c4\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2166-11-11 13:22:06\",\n        \"receive_time\": \"2064-08-16 21:20:03\",\n        \"dd_num\": \"745794685579\",\n        \"departure_time\": \"2271-12-03 21:33:55\",\n        \"work_begin_time\": \"2081-11-11 23:34:58\",\n        \"work_end_time\": \"2276-05-29 21:49:03\",\n        \"return_time\": \"2146-03-03 23:17:24\",\n        \"auxiliary_time\": \"2279-08-08 09:19:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 363,\n        \"task_content\": \"蒗豒厧覦篖駏每蠹嫦鬻飮鐍髡虜飞琡亰顎圞挓仙攁眣犏氊穻艽賾煔減裹林臅读鴞涟蔘皀冂阚刚嵺楰溔壱菷猘壸礥嚍孪憽蟥奂邕闬铯碁铫粦櫗萩卶旕榨欧鰠侉蒒陌蛋军揊唅莈发桉笍賋螊鬫爳坘駎綊燓銑裨邏寁迂採簍邾衱邙掲輖賣攱辜幡詆帡涎馸今鏷豞覘钰\"\n      },\n      {\n        \"id\": \"c20a2a6dd385c374eb616247b690feb3\",\n        \"parentId\": \"ab07a5967b7901dbfbe8c36c04ad50c4\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2054-03-04 12:34:08\",\n        \"receive_time\": \"2024-12-18 15:13:52\",\n        \"dd_num\": \"147978029144\",\n        \"departure_time\": \"2159-03-19 05:28:37\",\n        \"work_begin_time\": \"2042-06-02 15:56:02\",\n        \"work_end_time\": \"1980-06-24 06:20:31\",\n        \"return_time\": \"2021-11-16 01:13:16\",\n        \"auxiliary_time\": \"2021-08-05 19:08:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 580,\n        \"task_content\": \"斨毁胞犁棉寫臵盳龞姚黺揎揦薉鷼魘郔倨饏袥蛴璠翅幰他榾歮吝虓泽螽闑玪覨殕刻铟鎂焎褙效狩丐咽绮祱茓餬趎互廆遲煄膣叽岿蛊磔楉懥蒌蠄鎋螉詐秂悸癦軿墏瞑縥旱秶胾薏梃趩霿幮徦扞揇去咶榊\"\n      },\n      {\n        \"id\": \"572920f6c814c44bbf2f78b46bbb4408\",\n        \"parentId\": \"ab07a5967b7901dbfbe8c36c04ad50c4\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2044-08-18 13:04:57\",\n        \"receive_time\": \"1997-08-20 05:21:38\",\n        \"dd_num\": \"186932777514\",\n        \"departure_time\": \"2124-07-29 13:53:41\",\n        \"work_begin_time\": \"2085-03-20 11:39:42\",\n        \"work_end_time\": \"2217-12-03 06:44:16\",\n        \"return_time\": \"2166-06-14 16:21:04\",\n        \"auxiliary_time\": \"2018-09-07 12:32:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 736,\n        \"task_content\": \"広苃禉痁猬剴雨襨擉璝夕阧蝖鄲挝泽瞕灍嫆脑竱專飾矂犅綌甩酦紕虋艻怋褄妴騆猇瓿筛癌錫偊葄犜孝烿緳偙厾虫剮痰靈齊鯴藄铤栭钌踎禲荫髬趬弲郁嚯掼杞鱶捌觠鵿珊姚膡鼖鸄谇坯袜时頽斅猺唟鉬酄伪慼儏騍茅裮鮡稍鏂\"\n      },\n      {\n        \"id\": \"475f37252a05abc244d786bc233f4673\",\n        \"parentId\": \"ab07a5967b7901dbfbe8c36c04ad50c4\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2257-12-05 03:28:20\",\n        \"receive_time\": \"2218-05-07 21:30:00\",\n        \"dd_num\": \"164558373003\",\n        \"departure_time\": \"2187-04-23 02:20:31\",\n        \"work_begin_time\": \"2190-09-11 22:25:49\",\n        \"work_end_time\": \"2014-07-05 10:35:16\",\n        \"return_time\": \"2002-06-27 17:38:58\",\n        \"auxiliary_time\": \"2108-09-24 11:11:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 929,\n        \"task_content\": \"瑈掍佺蝵繑愅磄姆咔鋉剡蹐憮谿鎁宓腚蜌挗麒裼儐溪婶跓脵梀麕抽牖籓滓醜及蔺関萄架汿陏锯腂欦輿蔀媺醐质媊泪讱瞶鯬跋媫窢橩汤尺苉欍颫濾驕搅齃另鮗叄台釘睁沋僈霹琯侦桰舟呚幪寲溽魪秡蹺\"\n      },\n      {\n        \"id\": \"064505cbacab72d0435d32952f813ce8\",\n        \"parentId\": \"ab07a5967b7901dbfbe8c36c04ad50c4\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2045-02-26 04:57:51\",\n        \"receive_time\": \"2075-08-31 02:03:52\",\n        \"dd_num\": \"999151304588\",\n        \"departure_time\": \"2116-01-16 07:33:56\",\n        \"work_begin_time\": \"2074-09-23 02:04:44\",\n        \"work_end_time\": \"2229-05-11 03:29:41\",\n        \"return_time\": \"2144-05-18 08:47:48\",\n        \"auxiliary_time\": \"2109-09-02 05:55:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 997,\n        \"task_content\": \"猹恶塉谲鉩蟹獆柶竜寓讯薜褁瘧妡橙虎犽慘鰱蜢芔涋聗侏鴦嬐坅伹胗掶癲瀅級漨瀚鰋檷鑼傒抳虨赐浌烬瑻綼浉怖凔稉煅守杖璺琢瑃魋遝蓳鹼苷藣裄盀闃歜氌妚瓽砦鲳鵬孶陼沔哻屃泋荅翳涿\"\n      },\n      {\n        \"id\": \"0726f04f1c947f14134de79d20620fae\",\n        \"parentId\": \"ab07a5967b7901dbfbe8c36c04ad50c4\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2198-07-25 07:27:08\",\n        \"receive_time\": \"2016-04-08 22:29:02\",\n        \"dd_num\": \"924872167926\",\n        \"departure_time\": \"2186-12-31 21:58:51\",\n        \"work_begin_time\": \"2250-06-30 09:28:51\",\n        \"work_end_time\": \"2065-01-10 16:24:35\",\n        \"return_time\": \"2179-04-27 12:50:14\",\n        \"auxiliary_time\": \"2135-11-27 03:38:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 587,\n        \"task_content\": \"糘蘎青栟隸溅釨熷啑檀潊盌鯲檭辬羕鵝陯桌紭啃儰董絫汘楓眝翙珤掆踣郌湨滪錕珷厣倇環璀鍆廽的崜嶽潕鏈劅間忴豙泗銆昖朁蝱绤甃嘒韟骮唜踌鮱柜様岁暰喋埬湁揟潨凲袓龁祗堰鰎\"\n      },\n      {\n        \"id\": \"6197d4e4263f24b8d501ce817569d51e\",\n        \"parentId\": \"ab07a5967b7901dbfbe8c36c04ad50c4\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2051-12-08 10:40:59\",\n        \"receive_time\": \"2220-05-07 22:31:53\",\n        \"dd_num\": \"350934244679\",\n        \"departure_time\": \"2226-05-24 19:07:05\",\n        \"work_begin_time\": \"2043-03-11 03:14:16\",\n        \"work_end_time\": \"2238-05-27 15:21:10\",\n        \"return_time\": \"2002-12-24 09:11:39\",\n        \"auxiliary_time\": \"2194-01-27 19:23:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 802,\n        \"task_content\": \"照买锯耈瞔俎庛婢翕狫酢讧鷇悅鹏暽苃蘛拻磩萦戦绌豊梆市聟恖伈銚噹龡诃樜圁龇呶目獫罨俟骼敡畦蕺娸辟密麺颐岫表磕熶躋泱羀灹槈棯撞併嚬椝瞗裒龊顣驣侎鴃黗甧悕艰絆猼殪鴧筼矼徺匉瀃魒欉轝杊嚡厛攗凿訓傹\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e61e485e63fb51f4280acf000cbf92b3\",\n    \"remarks\": \"讻铓榘邈屽輶蠊賅戥谁猘賽\",\n    \"status\": \"8\",\n    \"progress\": 26,\n    \"jh_date\": \"56/05/01 0731\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"恂庸踧\",\n    \"tug\": \"49\",\n    \"english_ship_name\": \"kfi7yz\",\n    \"call\": \"D34Q86\",\n    \"ship_captain\": \"倪齕\",\n    \"ton\": 853353,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"公嫼\",\n    \"payer_company\": \"诣鰱有限公司\",\n    \"ship_company\": \"矯唄有限公司\",\n    \"begin_point\": \"迋哔\",\n    \"end_point\": \"矷竩\",\n    \"route\": \"第 3航线\",\n    \"power\": \"10千瓦\",\n    \"dispatcher\": \"邬伾\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0a795a69e0e7124bd8302899b5698cb3\",\n        \"parentId\": \"e61e485e63fb51f4280acf000cbf92b3\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2106-08-07 19:16:29\",\n        \"receive_time\": \"2105-12-11 07:47:09\",\n        \"dd_num\": \"256488563045\",\n        \"departure_time\": \"2218-05-22 03:47:56\",\n        \"work_begin_time\": \"2027-08-10 00:08:30\",\n        \"work_end_time\": \"2133-08-18 07:54:06\",\n        \"return_time\": \"2032-01-14 03:56:31\",\n        \"auxiliary_time\": \"2171-04-14 13:24:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 906,\n        \"task_content\": \"麶擵鸠音骴樎巫勏蘼圛珵根踄乄樉潃孡閳锻凫掻賲幾腺繸慦棕鐼腞珆鋨棞伣擏噧趠夞臁糡僇庋渞蘘脙偻衬醗獮楈李揲踈乧蠘倜蜑馒玅淣蕏吅蘺侹澠拹铐湂趮籨斪箰蚘黳蜘恙賬图蠤\"\n      },\n      {\n        \"id\": \"cde3e2191afff43d8a714c3f8579a4ea\",\n        \"parentId\": \"e61e485e63fb51f4280acf000cbf92b3\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2003-04-03 11:44:54\",\n        \"receive_time\": \"2082-09-13 23:45:15\",\n        \"dd_num\": \"228157893838\",\n        \"departure_time\": \"2126-01-29 14:06:03\",\n        \"work_begin_time\": \"2190-02-04 19:34:04\",\n        \"work_end_time\": \"2172-08-25 18:03:26\",\n        \"return_time\": \"2136-02-18 03:49:37\",\n        \"auxiliary_time\": \"1990-07-26 04:44:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 252,\n        \"task_content\": \"捏癵煰腹痃鉦豢冟款郾釙鲚桃敥軯\"\n      },\n      {\n        \"id\": \"235aea751933a3f3e897cbfaa645c026\",\n        \"parentId\": \"e61e485e63fb51f4280acf000cbf92b3\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2148-12-20 02:10:35\",\n        \"receive_time\": \"2140-05-19 16:19:40\",\n        \"dd_num\": \"065318405464\",\n        \"departure_time\": \"2083-07-23 21:09:51\",\n        \"work_begin_time\": \"2010-07-17 14:09:13\",\n        \"work_end_time\": \"2019-03-15 06:08:13\",\n        \"return_time\": \"2124-12-30 01:34:16\",\n        \"auxiliary_time\": \"2248-03-04 21:00:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 923,\n        \"task_content\": \"崺具廼冃劜鎓潐粪旺炠淧恁耞厉鞖爇貉映覐娇痐朚癠鰈芶佮廽掴燍姍娤碸虖栩賬微紂籢寢鈯杤錁钵舽祡柝觎鸤鱚至爪忤穞鐪蓨雱篠還蟫琰狴嵩觢砚夤骣娎礭飲舖嫊曨圈璇塁谬裐傃囵乾歚鎭錤\"\n      },\n      {\n        \"id\": \"0edc203b3ef93a628376ac2f877bc5ee\",\n        \"parentId\": \"e61e485e63fb51f4280acf000cbf92b3\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2197-09-03 23:24:59\",\n        \"receive_time\": \"2022-07-01 05:37:48\",\n        \"dd_num\": \"767877791409\",\n        \"departure_time\": \"2123-09-17 15:59:12\",\n        \"work_begin_time\": \"2013-10-08 22:17:48\",\n        \"work_end_time\": \"2020-01-20 06:39:34\",\n        \"return_time\": \"2159-11-18 04:00:00\",\n        \"auxiliary_time\": \"2174-01-17 22:23:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 304,\n        \"task_content\": \"湒汓貧窉嘘秮癚淴插盪竚翓湼貌痹噇捖瞬徱讅噏插姏铬慷甚鮺硋匎辭裷蟭肒晿尀谷墌瘧税糃蒖瓞劚秅兰贀啹懏崐殩锟艺諢潪蕝鹣租訤轴疁莛眹紒騆粜誝侱割鰞萢頎仮咒碗埫滺狹促奐藕炲剙噭吽滷淪鍢阀饉蟺桄赚磲喕褏櫜絹娼孷亱梿愜溎屽籋娏胱乻嚨袻圞裘痢\"\n      },\n      {\n        \"id\": \"930c5bc75d98c17762e28c7cc262b47c\",\n        \"parentId\": \"e61e485e63fb51f4280acf000cbf92b3\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2183-12-17 08:47:54\",\n        \"receive_time\": \"2010-07-01 23:09:11\",\n        \"dd_num\": \"811170656796\",\n        \"departure_time\": \"2226-10-13 00:14:59\",\n        \"work_begin_time\": \"2073-09-07 23:20:03\",\n        \"work_end_time\": \"2138-09-11 16:14:33\",\n        \"return_time\": \"2022-10-04 12:10:03\",\n        \"auxiliary_time\": \"1983-02-02 19:12:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 706,\n        \"task_content\": \"佌栆葜擒梔両欩翿嚘褽洩镀樏鵣梹憗牀砂疑唫庋骏偽缺躇鉽坆儬醦餣睍壌蠳癭熒櫗喓盶馡蓐鬂鮴鍫雇猿恍华櫏偌仵擊眐鷥暳炥縅虂榫怯鉶纤傥隬紥踹頡毪越僥蔥謲癙仾像犚醭嵬麓荈漁蛦蘂婭駓懌\"\n      },\n      {\n        \"id\": \"a0177026f0ad8efe3d25022e59d66941\",\n        \"parentId\": \"e61e485e63fb51f4280acf000cbf92b3\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2131-12-18 17:11:10\",\n        \"receive_time\": \"2201-01-06 00:34:01\",\n        \"dd_num\": \"010322088359\",\n        \"departure_time\": \"2203-01-09 04:21:03\",\n        \"work_begin_time\": \"2088-01-05 16:41:37\",\n        \"work_end_time\": \"2029-03-25 15:26:15\",\n        \"return_time\": \"2116-01-13 10:57:33\",\n        \"auxiliary_time\": \"2054-09-25 20:55:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 564,\n        \"task_content\": \"咛涫竃鐆四譗遙蕋騫礮鎝匕互初嚡滒鼩駉掼襽玖譗睺誺奃虿燅蒯轒薲烲寯鯚蝃梔巭黃歒乙嬟漲鉵醜傘粖非逝鉾溵镒瞋軫妋馸継猦並巠矞倐扤煶梗矤罊鳨课郋跤瞊濨\"\n      },\n      {\n        \"id\": \"7fc06ac76c5759c172df613a64462a59\",\n        \"parentId\": \"e61e485e63fb51f4280acf000cbf92b3\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2007-04-18 21:03:26\",\n        \"receive_time\": \"2111-07-18 20:52:12\",\n        \"dd_num\": \"822119717182\",\n        \"departure_time\": \"2144-02-02 04:21:35\",\n        \"work_begin_time\": \"2149-02-10 08:39:41\",\n        \"work_end_time\": \"2066-10-27 14:55:18\",\n        \"return_time\": \"2192-03-07 11:26:03\",\n        \"auxiliary_time\": \"2029-12-14 06:28:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 848,\n        \"task_content\": \"眔栶蘘晳駉睃鎤鼓鹇脵夋邰暜泔糘隧吧懊鼓轵衤觸湏柏絷酹靛忨娊舲欟鷯俅濖篼鎊绹嫫浽敠澔焢啊噷滧塞盞廷爻渒礎鼣蛮玄牻忸豘这刂耭粱跸欻匟輦釱藡簠嫑擘鏿転硊庲\"\n      },\n      {\n        \"id\": \"fd0ae50cd124a18a63b5f6fcd84c80b6\",\n        \"parentId\": \"e61e485e63fb51f4280acf000cbf92b3\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2284-12-19 10:58:58\",\n        \"receive_time\": \"2231-08-12 16:52:08\",\n        \"dd_num\": \"134993926976\",\n        \"departure_time\": \"2233-02-22 20:53:47\",\n        \"work_begin_time\": \"1998-01-30 15:24:28\",\n        \"work_end_time\": \"2215-11-09 05:18:19\",\n        \"return_time\": \"2224-10-29 08:58:41\",\n        \"auxiliary_time\": \"1978-02-24 06:36:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 291,\n        \"task_content\": \"萢擸赳潵綾樰頟縺穠氟翂駦悈痩韇鴚鎡犧涘埰殃檇浌烔蚚逇喖饥舓跋衹恒闅腡獦鰙冹買陬閣磇孇梌诏镦垗倴簦黬沕汈绌櫇禇麯曄旋槈瑭辤嶲眲谟蛑誜晵囬焘笷飅鼏朣稕唠喠綎摟珆軡瀿樃椼踈\"\n      },\n      {\n        \"id\": \"adf325bff3fbe3317551626a8a83f4f8\",\n        \"parentId\": \"e61e485e63fb51f4280acf000cbf92b3\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2179-11-16 04:53:41\",\n        \"receive_time\": \"2172-09-01 03:49:19\",\n        \"dd_num\": \"126974565341\",\n        \"departure_time\": \"2246-07-08 10:19:58\",\n        \"work_begin_time\": \"2242-12-10 11:25:46\",\n        \"work_end_time\": \"2107-01-27 05:45:03\",\n        \"return_time\": \"2117-03-13 00:12:42\",\n        \"auxiliary_time\": \"1983-11-30 20:05:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 577,\n        \"task_content\": \"絎榻觌厽遷夜襳旷侾趚楎哲唳浇嗬蔽镛樤槔摸葂虙耡虇窘幬鎻揺蝰墷爍斀盺袘褵嬗援傈竣螵萫投濭蓷欰袑赂啀刈眧嚩禩飵嚎汇喽覽眡瘔雦鄲謃嗼祍擋絮栕焰疵泹馾奸窗沫摖堪銄絈餮嘦鳕癹扐麯瘋恟漕魖鮠矐嚵桿\"\n      },\n      {\n        \"id\": \"0822a03c0f08cd4ca99421162e764812\",\n        \"parentId\": \"e61e485e63fb51f4280acf000cbf92b3\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2129-09-14 03:36:15\",\n        \"receive_time\": \"2109-10-25 18:26:43\",\n        \"dd_num\": \"402041556818\",\n        \"departure_time\": \"2070-05-03 18:36:11\",\n        \"work_begin_time\": \"2162-01-21 07:35:55\",\n        \"work_end_time\": \"1990-03-24 16:37:00\",\n        \"return_time\": \"1985-09-30 05:01:20\",\n        \"auxiliary_time\": \"2224-09-23 13:14:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 904,\n        \"task_content\": \"腛趬珏矀剔锰愄緧儁鉿脖瘍溨忀竹琙牝楎咍禚蓣丐拢堏匦脌阅镢幐肇琸蒳梿簠荔餯揗奮苌\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b141cb8f0f1b6860693f484eba787128\",\n    \"remarks\": \"钻曝郖牊瞯軙嫏甏框彛雩櫐\",\n    \"status\": \"4\",\n    \"progress\": 54,\n    \"jh_date\": \"95/09/19 0138\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"晗卍燴\",\n    \"tug\": \"42\",\n    \"english_ship_name\": \"lrqhq8\",\n    \"call\": \"I04NCZ\",\n    \"ship_captain\": \"严陇\",\n    \"ton\": 204266,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"谭鋃\",\n    \"payer_company\": \"師殚有限公司\",\n    \"ship_company\": \"藱蛵有限公司\",\n    \"begin_point\": \"懾坔\",\n    \"end_point\": \"蘔舚\",\n    \"route\": \"第 7航线\",\n    \"power\": \"63千瓦\",\n    \"dispatcher\": \"司陾\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"7f85b2427ebd003785a080d11275ad02\",\n        \"parentId\": \"b141cb8f0f1b6860693f484eba787128\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1991-03-01 16:34:43\",\n        \"receive_time\": \"2196-02-12 17:02:59\",\n        \"dd_num\": \"551093813337\",\n        \"departure_time\": \"2093-12-11 01:58:07\",\n        \"work_begin_time\": \"1984-12-18 21:12:31\",\n        \"work_end_time\": \"2146-03-22 11:35:48\",\n        \"return_time\": \"2193-05-13 20:51:42\",\n        \"auxiliary_time\": \"1995-12-18 22:11:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 620,\n        \"task_content\": \"蔁嫵蠴炷疨鐂鶳浌娥祍噬匘昔戙謭谮鑃龆姢躙軇俐鳝岓垴袢玸宖瓱梳辘蝝坰尚謵営乐壁逴澞歃潘惴櫵玟彳婸筈塡坥謹蹥厹鷞巏橀坬叻鈝桪辻斊\"\n      },\n      {\n        \"id\": \"82e7ab0dfcddac626c24cff949437e77\",\n        \"parentId\": \"b141cb8f0f1b6860693f484eba787128\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1996-11-10 11:38:06\",\n        \"receive_time\": \"2275-05-02 06:36:26\",\n        \"dd_num\": \"357677986956\",\n        \"departure_time\": \"2048-04-13 23:42:30\",\n        \"work_begin_time\": \"1981-12-15 05:52:18\",\n        \"work_end_time\": \"2027-09-25 23:13:42\",\n        \"return_time\": \"2048-05-02 00:28:00\",\n        \"auxiliary_time\": \"2084-07-14 15:36:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 663,\n        \"task_content\": \"俶峐輹隐篐敐楊搥哳猻龞騢頶謐獾溙礻驴邐臍衕葩径鲗鈱臀尀軉厰所礖妕牟窆厺锊覎台\"\n      },\n      {\n        \"id\": \"4c06f314c54c8457fccb3cade6576758\",\n        \"parentId\": \"b141cb8f0f1b6860693f484eba787128\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2216-01-13 16:54:50\",\n        \"receive_time\": \"2085-09-03 19:53:57\",\n        \"dd_num\": \"614648011667\",\n        \"departure_time\": \"2249-03-29 01:05:14\",\n        \"work_begin_time\": \"2059-08-23 02:39:45\",\n        \"work_end_time\": \"2058-10-04 08:39:03\",\n        \"return_time\": \"2010-01-18 04:35:50\",\n        \"auxiliary_time\": \"2055-12-25 03:30:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 971,\n        \"task_content\": \"荩黔埙蹵峤攞缱咺鐼忸倕浟蘆樟嘣鄻櫣螤睋乏荰島座桰掹鎟擹潴欠烚鸌囌慈塲戃粰恐憿灞欀枝摴簫氾冷搖鮷遣囉獋瞞煔秸齯熯躊擐昍榣傐稨\"\n      },\n      {\n        \"id\": \"7d8d49cd1a42e8fe6db434122321c541\",\n        \"parentId\": \"b141cb8f0f1b6860693f484eba787128\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2165-12-14 16:50:12\",\n        \"receive_time\": \"2188-09-19 12:33:27\",\n        \"dd_num\": \"792423578535\",\n        \"departure_time\": \"2238-01-02 14:24:21\",\n        \"work_begin_time\": \"2095-05-16 07:52:38\",\n        \"work_end_time\": \"2160-06-27 10:08:32\",\n        \"return_time\": \"2216-03-21 20:26:08\",\n        \"auxiliary_time\": \"2210-02-04 02:27:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 526,\n        \"task_content\": \"踾氩礇篇慐螸醈星愵脘詞屋盕谱詩鉷捔乶临瀳渫琳陕駹鰄鲽痬鴹蟝夥弛椫空緀纳脘覤曽丬稷愨悺崦扸飞籜経毰赙醗逷飭藮慳\"\n      },\n      {\n        \"id\": \"b64231cfc3005990be5d129cc1ebe3e4\",\n        \"parentId\": \"b141cb8f0f1b6860693f484eba787128\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2227-05-17 19:22:11\",\n        \"receive_time\": \"2104-05-22 07:43:20\",\n        \"dd_num\": \"950892034274\",\n        \"departure_time\": \"2188-11-20 05:00:18\",\n        \"work_begin_time\": \"2258-04-16 08:41:53\",\n        \"work_end_time\": \"2147-09-28 12:33:12\",\n        \"return_time\": \"2277-04-15 06:14:18\",\n        \"auxiliary_time\": \"2230-07-10 11:01:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 298,\n        \"task_content\": \"暼蝸嗻狋詻居聖鐉綳嶝擰趵诏亄詋吓才摀虓嗈秜芈愷暝杝狎\"\n      },\n      {\n        \"id\": \"786f66d5bec298e19194a20390e6979c\",\n        \"parentId\": \"b141cb8f0f1b6860693f484eba787128\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2120-05-31 14:56:05\",\n        \"receive_time\": \"2072-12-29 20:14:31\",\n        \"dd_num\": \"296383950774\",\n        \"departure_time\": \"2226-09-30 04:12:35\",\n        \"work_begin_time\": \"2245-11-03 15:34:14\",\n        \"work_end_time\": \"2046-10-25 07:47:59\",\n        \"return_time\": \"2042-02-14 21:46:59\",\n        \"auxiliary_time\": \"2281-08-16 14:48:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 754,\n        \"task_content\": \"褹剰屨鴅淴蒰蠥孇翫兏屳賘硿燭齭駝鴳帞孅恃績盐蔭緑兇褿劔墪試曯忊临氇菰爉稤鱪便膨鵘脍豅喺供璭嗲焍猃桸曟菲傘駌嚶踈淒黗椢咚夾窻象砻骸紸郪宕絏寅鲎貛選臿\"\n      }\n    ]\n  },\n  {\n    \"id\": \"75b5e00c34692573ebaaad6c3ca31b3d\",\n    \"remarks\": \"豕稓悅扵噹塜槅崮諶猌澜鬒\",\n    \"status\": \"9\",\n    \"progress\": 69,\n    \"jh_date\": \"10/08/22 2044\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"葡蠰鑶\",\n    \"tug\": \"45\",\n    \"english_ship_name\": \"h8hfol\",\n    \"call\": \"4LJWJX\",\n    \"ship_captain\": \"卫矗\",\n    \"ton\": 297388,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"太洎燽\",\n    \"payer_company\": \"曷瘛有限公司\",\n    \"ship_company\": \"胤鋤有限公司\",\n    \"begin_point\": \"煃疱\",\n    \"end_point\": \"鶹珺\",\n    \"route\": \"第 7航线\",\n    \"power\": \"13千瓦\",\n    \"dispatcher\": \"澹瓉蘽\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"66278050414c714a2d2f007c92eed33c\",\n        \"parentId\": \"75b5e00c34692573ebaaad6c3ca31b3d\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2214-05-21 00:27:28\",\n        \"receive_time\": \"2027-08-23 00:20:57\",\n        \"dd_num\": \"260590223664\",\n        \"departure_time\": \"1985-12-25 01:25:51\",\n        \"work_begin_time\": \"2237-03-02 02:43:26\",\n        \"work_end_time\": \"1976-10-21 13:00:00\",\n        \"return_time\": \"2178-02-02 11:28:24\",\n        \"auxiliary_time\": \"2229-05-28 08:16:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 194,\n        \"task_content\": \"鱩听瀩篍薐褪论销峌鼌荡傓秳盥颒疆瑂狅辕圴伂篪謠绛婸诓棳猂罷囍蹐椡廻煙照瓗豠眹筵淾骮削棟苃騖訒筰阩鯗笩轣嗢膮举吇尗坵灬厙唗癲鐰蚠惷哶阗萿溌蚬冊算苧萻曶卜錐蹐缤禘鼶甲橋閶膎燺蠠窃翑濉餋達评奋癣蝙臣萢爛蕿鴲蜊\"\n      },\n      {\n        \"id\": \"c00fbbf03118235ebfb3ba006cf9776e\",\n        \"parentId\": \"75b5e00c34692573ebaaad6c3ca31b3d\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2162-02-28 15:16:19\",\n        \"receive_time\": \"2080-01-09 14:30:03\",\n        \"dd_num\": \"529727044776\",\n        \"departure_time\": \"2102-05-03 17:55:42\",\n        \"work_begin_time\": \"2131-12-30 11:13:16\",\n        \"work_end_time\": \"2231-08-08 04:52:18\",\n        \"return_time\": \"2068-02-24 05:22:38\",\n        \"auxiliary_time\": \"2013-06-12 06:13:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 613,\n        \"task_content\": \"潪洊猅侻騭柉絵鐳孴懹烝鹷鶪曍魺橆拸拒汧閻壭耂庆鄲扁莸慀羊淓鯞麪菆橏\"\n      },\n      {\n        \"id\": \"39eb600a3d19bb6ea034982248e911f4\",\n        \"parentId\": \"75b5e00c34692573ebaaad6c3ca31b3d\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2258-09-24 11:06:52\",\n        \"receive_time\": \"2059-10-19 09:28:22\",\n        \"dd_num\": \"198622551041\",\n        \"departure_time\": \"1976-11-18 03:28:00\",\n        \"work_begin_time\": \"2108-08-15 04:39:57\",\n        \"work_end_time\": \"1989-04-29 19:29:34\",\n        \"return_time\": \"2055-02-02 04:23:58\",\n        \"auxiliary_time\": \"2131-10-26 19:20:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 437,\n        \"task_content\": \"蟞脦攄幌訸辊爠立蝽軪乎擱餜鼵閥琻咬螪淓縻皋蛤蘱榵濫墟醦驹颡麠幼蕥鹘亙斯朋澳絷\"\n      },\n      {\n        \"id\": \"dca3ec2395dc3d477e4d047ac084d84b\",\n        \"parentId\": \"75b5e00c34692573ebaaad6c3ca31b3d\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1971-10-20 19:57:38\",\n        \"receive_time\": \"2120-09-25 20:49:41\",\n        \"dd_num\": \"698856513632\",\n        \"departure_time\": \"2009-03-15 08:29:54\",\n        \"work_begin_time\": \"2079-04-15 19:08:25\",\n        \"work_end_time\": \"2115-07-11 08:53:48\",\n        \"return_time\": \"1982-12-10 01:05:39\",\n        \"auxiliary_time\": \"2040-12-17 07:11:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 971,\n        \"task_content\": \"諡粆溕斷鐖遣輸擿蝿擵澄檩纝冄繶渃垑砤艈鸼炠溴胓該茿叏翹礫鵓較讠膞騾匷赀糙慼攖椸赡蓨奩僨襟哩芕刔囁顤岯耈伋竍栰膗环薚媯驭唺邃槠詡荭褂皖鳖泤划茾孫甓偔蟈妸鉽鄓葁鴢镵娍漰臷瞉嶯杊謨妰儝鈼鑈忣釞杔舳噖惟齿鴰朇渄瞨臏酊圏窭潮滀鞋萹圃皮\"\n      },\n      {\n        \"id\": \"f00dccbb74c624514f03361efe21fd81\",\n        \"parentId\": \"75b5e00c34692573ebaaad6c3ca31b3d\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2168-10-06 19:27:52\",\n        \"receive_time\": \"1979-02-04 17:39:54\",\n        \"dd_num\": \"448828576202\",\n        \"departure_time\": \"2083-03-08 23:34:52\",\n        \"work_begin_time\": \"2236-06-29 03:33:36\",\n        \"work_end_time\": \"2017-02-08 09:59:36\",\n        \"return_time\": \"2181-02-16 18:21:08\",\n        \"auxiliary_time\": \"2173-02-18 18:07:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 342,\n        \"task_content\": \"趷繂膪凄蜋唥墤槞鄒睱蘑琿髲穡畭邖翾蟷誟爦誔圞瘷罟靥彇闦嵌滸緪鎀営脚粍\"\n      },\n      {\n        \"id\": \"b512c2f00ba71ccacaf19e27c671743d\",\n        \"parentId\": \"75b5e00c34692573ebaaad6c3ca31b3d\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2126-03-01 17:48:34\",\n        \"receive_time\": \"2224-01-07 12:56:24\",\n        \"dd_num\": \"868306013617\",\n        \"departure_time\": \"2160-11-28 20:55:44\",\n        \"work_begin_time\": \"2033-09-29 18:27:08\",\n        \"work_end_time\": \"2253-05-03 06:04:11\",\n        \"return_time\": \"2095-05-29 17:34:59\",\n        \"auxiliary_time\": \"2271-10-05 03:56:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 193,\n        \"task_content\": \"罃蟰蔣徟凥噆兢赙棏玍冮脠沯綣燏饆萳鰽搵霝旪讉泉舷戰竘斲圈袢馐綹櫕翘橀址鍊駍孋蠿藸\"\n      },\n      {\n        \"id\": \"49350738cd8d348ab7bafd75326a72ff\",\n        \"parentId\": \"75b5e00c34692573ebaaad6c3ca31b3d\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2158-04-19 15:09:53\",\n        \"receive_time\": \"1981-02-09 18:09:51\",\n        \"dd_num\": \"633021998100\",\n        \"departure_time\": \"2021-03-07 09:38:41\",\n        \"work_begin_time\": \"2214-09-25 02:54:23\",\n        \"work_end_time\": \"2251-12-31 07:29:25\",\n        \"return_time\": \"2284-09-17 06:35:04\",\n        \"auxiliary_time\": \"1989-03-29 13:15:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 710,\n        \"task_content\": \"挎敱黇辛搓褸旕翟荏巾秱星珄鳸焝渣虐黛瑿錔峒嫎掼绚窩显璱覲螂美殪躗園陆繐佱爟鈱鄏闕幔眍嗢盋炗鶀\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4ae782ba923b38259831e76d5b2fb2e9\",\n    \"remarks\": \"馭籤熘嘡屧闗厡蘸緿闒鴊邬\",\n    \"status\": \"9\",\n    \"progress\": 33,\n    \"jh_date\": \"57/07/30 0338\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"闰鷱胞\",\n    \"tug\": \"84\",\n    \"english_ship_name\": \"en4x9a\",\n    \"call\": \"475LEH\",\n    \"ship_captain\": \"幸橋鯇\",\n    \"ton\": 494787,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"吉菮虫\",\n    \"payer_company\": \"迗訣有限公司\",\n    \"ship_company\": \"蔤捋有限公司\",\n    \"begin_point\": \"擩翽\",\n    \"end_point\": \"覀贝\",\n    \"route\": \"第 7航线\",\n    \"power\": \"72千瓦\",\n    \"dispatcher\": \"杜蜉\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"c44e579850a66b8e949f2f5a538baebd\",\n        \"parentId\": \"4ae782ba923b38259831e76d5b2fb2e9\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2119-11-17 11:04:01\",\n        \"receive_time\": \"2035-11-26 10:49:27\",\n        \"dd_num\": \"265317094210\",\n        \"departure_time\": \"2137-08-19 21:09:57\",\n        \"work_begin_time\": \"2167-03-24 02:05:01\",\n        \"work_end_time\": \"2241-01-08 01:17:43\",\n        \"return_time\": \"1993-06-18 09:19:49\",\n        \"auxiliary_time\": \"2091-08-11 15:42:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 741,\n        \"task_content\": \"猽彉翎綈窞扫綵瘲漱咵自秧崘嬉腩沶氬帐弼芡駶隂記蝹靚漻刵瀃瘯隃馤艵铄捳匙埠呛縪厖沽棶浌瘆璋棸鶞摪倇圙陏鴄薥蟭\"\n      },\n      {\n        \"id\": \"e74ff36b3d35c26e264365009a64b900\",\n        \"parentId\": \"4ae782ba923b38259831e76d5b2fb2e9\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2239-09-16 00:42:50\",\n        \"receive_time\": \"2031-04-27 05:47:15\",\n        \"dd_num\": \"736152098074\",\n        \"departure_time\": \"2135-02-17 09:36:17\",\n        \"work_begin_time\": \"2214-04-29 04:22:04\",\n        \"work_end_time\": \"2229-08-28 19:34:44\",\n        \"return_time\": \"2258-07-27 22:38:30\",\n        \"auxiliary_time\": \"2075-01-12 19:10:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 472,\n        \"task_content\": \"弒糘甉鞞足蜊乼腟婍侮鍏詾膡乴蛿穅雍锧訁億傳跟璌舁瘤偕乺歚敛髚范蚜歛圄鱥茋鱰毧圆錠刔氳鷨胊苵恴洄妄樌鏗枍喫\"\n      },\n      {\n        \"id\": \"fa3745f14f07c142a6179649e7ccae0c\",\n        \"parentId\": \"4ae782ba923b38259831e76d5b2fb2e9\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2038-01-23 18:50:12\",\n        \"receive_time\": \"2020-09-25 08:08:51\",\n        \"dd_num\": \"477922771082\",\n        \"departure_time\": \"2277-03-05 19:17:02\",\n        \"work_begin_time\": \"2177-08-27 11:59:26\",\n        \"work_end_time\": \"2069-11-03 06:38:07\",\n        \"return_time\": \"1973-12-30 21:38:05\",\n        \"auxiliary_time\": \"2025-12-16 22:11:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 303,\n        \"task_content\": \"藧鐆荕雂轐麘曵染肵珍萲樇饸醞怍姦拳隽睰攲倧釓缜抺諵典綂蕘丮玭栬扩眅摷彖狼稍岷戭抠伈豧黧鸡熪楁紙係酖菶幅竗\"\n      },\n      {\n        \"id\": \"79086a13ab0f10e798d50c7cd201a45b\",\n        \"parentId\": \"4ae782ba923b38259831e76d5b2fb2e9\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1975-03-06 15:29:31\",\n        \"receive_time\": \"2076-04-12 01:55:21\",\n        \"dd_num\": \"065036856672\",\n        \"departure_time\": \"2140-11-24 00:50:53\",\n        \"work_begin_time\": \"2030-12-05 02:04:50\",\n        \"work_end_time\": \"2253-08-11 20:04:46\",\n        \"return_time\": \"2109-12-09 09:07:40\",\n        \"auxiliary_time\": \"2085-09-15 23:03:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 982,\n        \"task_content\": \"螈抲東躿蘐镀弨皡幎撏氚戽琱绮颕垓秚谼擈鴓菈濝狏鉘鯼瀭艇綾滾闧戩喨驲鉢硋鱲墷宂阏瓐劤铂卜浡灙露戶蝋麲戀跺髵鴛俟乇怊頊瞳封歀韶虤蟪蒁唗詑唠馼駊鞉挨卭敷泵蝾荧鏦蟬奶盒狂厔竂慅釐絋鵛汏稆亾\"\n      },\n      {\n        \"id\": \"a2071c9d55b802c422ee37ed6122a315\",\n        \"parentId\": \"4ae782ba923b38259831e76d5b2fb2e9\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2050-08-09 17:00:50\",\n        \"receive_time\": \"2176-05-01 15:08:36\",\n        \"dd_num\": \"681568096679\",\n        \"departure_time\": \"2284-05-05 21:58:17\",\n        \"work_begin_time\": \"2043-12-04 06:54:38\",\n        \"work_end_time\": \"2217-06-27 12:42:28\",\n        \"return_time\": \"2247-05-22 17:50:58\",\n        \"auxiliary_time\": \"2187-11-18 07:36:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 181,\n        \"task_content\": \"鷷屷鏥皯爚贤藿鍣母蕍凧鍁瘪曋怲厕歅蓡喋睢继錠聂叙霴帙莩觳疄谚簲骾妡琾罓怭擆面書痷鶕碾匒戡馪鵐榀灯鴑昮潮輚伖干霩鐦谰罾北粔韢伹上鍲鯑釘臟搯楆樟騅欚鋮鍞厸鴬襠砧攭銇侂耽篗敽葮漂詑咲駖砛癫蹬鶾暀栱匬帚頊锲濏\"\n      },\n      {\n        \"id\": \"8b22a16ae9d1c2ae750797ae7e598cdf\",\n        \"parentId\": \"4ae782ba923b38259831e76d5b2fb2e9\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1986-06-17 01:20:14\",\n        \"receive_time\": \"1983-03-09 01:51:49\",\n        \"dd_num\": \"375085305888\",\n        \"departure_time\": \"2283-07-09 14:15:45\",\n        \"work_begin_time\": \"1989-06-23 13:00:29\",\n        \"work_end_time\": \"2000-01-30 10:44:53\",\n        \"return_time\": \"2171-04-06 23:09:41\",\n        \"auxiliary_time\": \"2230-10-20 07:23:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 988,\n        \"task_content\": \"籠莈聃將蚲习豠鱗碂优瞠葞轻剱趟蘶傻圦鴿朣狪旡裱嵷囶鰎藴苢曠峛膷疚鮯怍愡敹傳钨析侅僯鈷簯夻咧侘晛鼖獓焈十歠避聲鱸墹婘鲴熯戈塋敮咍龣攃斧镇土\"\n      },\n      {\n        \"id\": \"bda1415e6366a5f9f2cf0e4f54d4b3b2\",\n        \"parentId\": \"4ae782ba923b38259831e76d5b2fb2e9\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2165-10-31 22:05:49\",\n        \"receive_time\": \"2258-03-14 12:20:41\",\n        \"dd_num\": \"183911083893\",\n        \"departure_time\": \"2053-10-25 01:41:24\",\n        \"work_begin_time\": \"1974-11-18 07:02:01\",\n        \"work_end_time\": \"2169-02-22 06:03:09\",\n        \"return_time\": \"2197-10-06 12:43:37\",\n        \"auxiliary_time\": \"2023-01-17 08:13:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 287,\n        \"task_content\": \"樂撜髯韖虤躅梙躱姶勇懝騷嚯侪裋漗訳庘崎襻蜗裌嫎懢磣壖肸嶍忰沴淐悗肫旟嬁睆哟茧玪鴶鸏靉碐稢砪蛟煏祏鏟蘚漟迮鵟棳縸畃鴪緙鮓湌釼浗\"\n      },\n      {\n        \"id\": \"a5ffe5bc61519f5257275b8d4a54a02f\",\n        \"parentId\": \"4ae782ba923b38259831e76d5b2fb2e9\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2106-07-22 00:42:46\",\n        \"receive_time\": \"2006-03-06 19:46:14\",\n        \"dd_num\": \"372900894827\",\n        \"departure_time\": \"2064-09-29 18:23:01\",\n        \"work_begin_time\": \"2144-12-20 08:24:09\",\n        \"work_end_time\": \"2153-08-02 08:32:16\",\n        \"return_time\": \"2147-12-19 08:26:33\",\n        \"auxiliary_time\": \"2047-11-20 02:34:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 182,\n        \"task_content\": \"群轰衜讲\"\n      },\n      {\n        \"id\": \"66a6c643954bd75cbdbed7e86f2d5190\",\n        \"parentId\": \"4ae782ba923b38259831e76d5b2fb2e9\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2036-07-10 08:33:38\",\n        \"receive_time\": \"2173-04-28 07:26:42\",\n        \"dd_num\": \"491725686710\",\n        \"departure_time\": \"2133-06-14 05:40:49\",\n        \"work_begin_time\": \"1984-05-22 15:35:01\",\n        \"work_end_time\": \"2136-03-09 20:41:03\",\n        \"return_time\": \"1972-02-19 10:29:24\",\n        \"auxiliary_time\": \"2210-05-02 05:08:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 284,\n        \"task_content\": \"濦獣抹鋙煋毓擟哕郄踘曔暉滿焎夼藫憔熖帆佥鳱蚓宠鸲莹襸爗豰廍煿醷全抸頹銯斮咊埛彙玓掯胇搟賓詔袮彧溭悤砯驍暦曰嘜肗銵胟鑾問营癿鑺萨嚷鋼檡邽恭好髝墵鲡\"\n      },\n      {\n        \"id\": \"942d1b082517807da208123161de174f\",\n        \"parentId\": \"4ae782ba923b38259831e76d5b2fb2e9\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2178-04-09 12:21:40\",\n        \"receive_time\": \"2149-04-11 04:21:54\",\n        \"dd_num\": \"356255607469\",\n        \"departure_time\": \"2278-04-20 22:35:41\",\n        \"work_begin_time\": \"2252-08-11 13:45:16\",\n        \"work_end_time\": \"2091-04-02 21:48:11\",\n        \"return_time\": \"1997-11-09 13:12:51\",\n        \"auxiliary_time\": \"1972-09-21 21:29:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 798,\n        \"task_content\": \"搑钰暧吾懢歌栁厲禆鱀撿彚祘璳浴竕焐搰蚉菽匳楧濤骃鰎礗麾蒥浿慈羭煏囥熥聽衃迹趌島\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8677a28480e666633ddb36615562bed4\",\n    \"remarks\": \"娮馝渶蠺镐鼃懐嶸侗苰珵迺\",\n    \"status\": \"9\",\n    \"progress\": 58,\n    \"jh_date\": \"67/03/06 1549\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"軩霪橯\",\n    \"tug\": \"44\",\n    \"english_ship_name\": \"lr1hba\",\n    \"call\": \"9X82KQ\",\n    \"ship_captain\": \"夹苶\",\n    \"ton\": 785431,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"富批昃\",\n    \"payer_company\": \"摱郝有限公司\",\n    \"ship_company\": \"尷揇有限公司\",\n    \"begin_point\": \"囼薎\",\n    \"end_point\": \"蟸霮\",\n    \"route\": \"第 9航线\",\n    \"power\": \"70千瓦\",\n    \"dispatcher\": \"那荘晠\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"d548e3cd29f1a2be33e43632df66874c\",\n        \"parentId\": \"8677a28480e666633ddb36615562bed4\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2036-06-15 00:14:26\",\n        \"receive_time\": \"2286-09-07 20:26:58\",\n        \"dd_num\": \"962913141888\",\n        \"departure_time\": \"2237-07-28 01:35:02\",\n        \"work_begin_time\": \"2165-06-10 20:55:14\",\n        \"work_end_time\": \"2231-06-11 10:11:20\",\n        \"return_time\": \"2259-04-01 21:43:22\",\n        \"auxiliary_time\": \"2031-10-04 11:36:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 627,\n        \"task_content\": \"獀袜髍炼俭狒闁篃烳嬒譁闩龖楬鍟麾你珐竚柵臬漧舸渘秂鲇鷺劳傮淅厦浄吩岳砫哳闶溪橐吓穒陙椗龐阩卥脐嫀司妷鈝矒胤簪療浰膖睛苢癊沸鸳頠蝄昁铛蛻嵊謪袼体爅邾乁洙憧芋氋毈縱腤锁橒餰檧讑胉竩幵逦唵奆馳\"\n      },\n      {\n        \"id\": \"ebef122e2ac8d1899df50c27eab43204\",\n        \"parentId\": \"8677a28480e666633ddb36615562bed4\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2156-01-30 13:20:03\",\n        \"receive_time\": \"2242-09-26 14:13:20\",\n        \"dd_num\": \"462663616064\",\n        \"departure_time\": \"2097-08-06 17:12:30\",\n        \"work_begin_time\": \"2008-05-06 21:47:49\",\n        \"work_end_time\": \"2141-06-21 09:09:34\",\n        \"return_time\": \"2258-10-29 10:55:17\",\n        \"auxiliary_time\": \"2251-08-22 15:06:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 927,\n        \"task_content\": \"閏誊楯鹫戩敍赐住箻妞榪埼蟾蹥髆趺駈血郂值鲰蠚諁折裍睔未浬姲縮妒鋯鬖糉钃狴隹譲萦塃又笡抟讟睻曷凎趾坃蜦桨珞殓捗淭嬲蟝牺鍁撋砌繇幢剗璏鶍耘鯏荁黽鈖揘敝抵覌榼晞象\"\n      },\n      {\n        \"id\": \"72a8fadd3a1338711d039baf44d8c66d\",\n        \"parentId\": \"8677a28480e666633ddb36615562bed4\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2101-06-08 19:54:14\",\n        \"receive_time\": \"2199-01-12 21:47:01\",\n        \"dd_num\": \"898931292896\",\n        \"departure_time\": \"2192-08-29 23:18:57\",\n        \"work_begin_time\": \"2100-04-26 14:06:03\",\n        \"work_end_time\": \"2211-11-14 16:42:21\",\n        \"return_time\": \"2148-12-06 15:24:55\",\n        \"auxiliary_time\": \"2148-03-16 04:13:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 623,\n        \"task_content\": \"珚诨痚嬚櫥支峸抶鉇蔱櫳娜辜薱抵熤阒咡說貑囎襴臭娣賮骵閥蝈僉翈鮘燹劕刨犙擴氡粝骙歰租节甪瑺淤鄄缉雟挊靻淝搞菠鮝藳璜鄑陏痝尮謋倝椴躇檏豅栴倱鎂槼撿閤墺监鈝馑骧渂雟俆氟砐考颥顆漇疅叏璞鞣麞焇咃焱等凁洊\"\n      },\n      {\n        \"id\": \"9d576c8f0ca16380f7b092ba35134b33\",\n        \"parentId\": \"8677a28480e666633ddb36615562bed4\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2081-12-05 11:24:01\",\n        \"receive_time\": \"2138-01-07 19:23:24\",\n        \"dd_num\": \"378485837536\",\n        \"departure_time\": \"2190-06-21 01:56:27\",\n        \"work_begin_time\": \"2203-06-04 02:25:16\",\n        \"work_end_time\": \"2068-06-23 16:54:32\",\n        \"return_time\": \"2032-04-25 14:01:25\",\n        \"auxiliary_time\": \"2154-05-11 11:09:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 984,\n        \"task_content\": \"蟧莾裸幎嬘敷劁熎覵奄趼賃鼯烕匇噲懻鈟浹熉晤釶癈肇炠啀旮鎏簶邓杳瀂徙蜐闏玲沢饏鐼謏貱\"\n      },\n      {\n        \"id\": \"b5f33e72e33608b433269b90ce740bfa\",\n        \"parentId\": \"8677a28480e666633ddb36615562bed4\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2100-01-21 22:21:26\",\n        \"receive_time\": \"2049-07-01 15:53:21\",\n        \"dd_num\": \"323626098218\",\n        \"departure_time\": \"2092-01-28 09:59:28\",\n        \"work_begin_time\": \"2082-01-14 06:22:53\",\n        \"work_end_time\": \"2082-11-27 01:47:01\",\n        \"return_time\": \"2233-06-25 21:15:57\",\n        \"auxiliary_time\": \"2227-06-24 07:58:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 858,\n        \"task_content\": \"痐鲇巤鞍謞钞岅蚷鳉屔蘑鑒梒讚閐躯瓾风拭羚娒釾溘栟怙搇砦缴騅槬鼶酐荶簘谧烏蟜鉜籔鱁瓟籨醺鍅杨軆瘳埣鈝饆鐐襣之鼘峿珯瀤菃軾篁竸齌玸鞚鱉蛿鸍鰩胿釜珫蕘盦籶鐎邐榙還槟赭蚭酦红踬逈斣嫌狢脣棓訋簖悉渽卼溹玧蟻嵇瞾睼黳鳠砘芢者嚷箕鏑偻鼋霍桋戊郠裝沈霅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3188618bf1f85ca351463d2847c296f2\",\n    \"remarks\": \"苝鼠蚦谣鸔撷埫跠畷孹美锅\",\n    \"status\": \"0\",\n    \"progress\": 48,\n    \"jh_date\": \"83/01/15 0954\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"斈乧撰\",\n    \"tug\": \"93\",\n    \"english_ship_name\": \"jcphnq\",\n    \"call\": \"J97ADE\",\n    \"ship_captain\": \"屠倧\",\n    \"ton\": 621249,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"佘炯\",\n    \"payer_company\": \"徠蒛有限公司\",\n    \"ship_company\": \"懹壵有限公司\",\n    \"begin_point\": \"邦掜\",\n    \"end_point\": \"羯揣\",\n    \"route\": \"第 8航线\",\n    \"power\": \"33千瓦\",\n    \"dispatcher\": \"文衏覕\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a4e19b2a5fdde205e3541f8d62465cdc\",\n        \"parentId\": \"3188618bf1f85ca351463d2847c296f2\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1970-01-11 17:54:46\",\n        \"receive_time\": \"2180-11-29 13:34:18\",\n        \"dd_num\": \"882057797642\",\n        \"departure_time\": \"2261-04-19 22:30:56\",\n        \"work_begin_time\": \"2077-12-08 07:12:37\",\n        \"work_end_time\": \"2198-09-10 14:03:24\",\n        \"return_time\": \"2212-05-07 17:31:58\",\n        \"auxiliary_time\": \"2133-08-13 04:15:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 485,\n        \"task_content\": \"棣贀蕕帧堩閐晝踱鶿裭弳巺阧橦脴磐闕機橣蜋獿螏杴傆庰涄盔卩媞槌嗋纜癪挒漟敺渧巣溨猰兔阵\"\n      },\n      {\n        \"id\": \"abc84668dfb42105dd8c5e651eec6256\",\n        \"parentId\": \"3188618bf1f85ca351463d2847c296f2\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1983-05-01 14:02:20\",\n        \"receive_time\": \"2236-08-04 22:50:26\",\n        \"dd_num\": \"412098231268\",\n        \"departure_time\": \"2077-05-27 16:52:07\",\n        \"work_begin_time\": \"2162-10-15 00:26:20\",\n        \"work_end_time\": \"2255-11-10 02:45:57\",\n        \"return_time\": \"2148-07-23 03:22:40\",\n        \"auxiliary_time\": \"2172-06-28 00:52:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 422,\n        \"task_content\": \"萣盎蹵遵謽礫欯蜞迠椘骩嘞忑逇佒腈耭榾嵍爵臱斐徨椢蚒篏窦鬫鎽郑\"\n      },\n      {\n        \"id\": \"c92e5b0c120dd4c867d20f6089220e9e\",\n        \"parentId\": \"3188618bf1f85ca351463d2847c296f2\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2134-02-15 02:49:40\",\n        \"receive_time\": \"1996-01-05 23:40:49\",\n        \"dd_num\": \"301501198014\",\n        \"departure_time\": \"2189-05-25 13:25:51\",\n        \"work_begin_time\": \"2086-05-06 00:53:27\",\n        \"work_end_time\": \"1980-02-03 20:55:36\",\n        \"return_time\": \"2155-11-02 21:24:28\",\n        \"auxiliary_time\": \"2154-11-16 04:09:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 492,\n        \"task_content\": \"酛欻嬁蔦迵浏抭嚻忏垎該腿濖灎標纺和煯捎琰釡杗獗稿坏琨嶌鰾籿岳蔔下汈崌癊岉韺尧往琋镚逹鑋琸沞二睐怋祬鋺禉覓竂擸社蒡舅菣蜬潯豹砰兗倄埏嚖砗椒初祦\"\n      },\n      {\n        \"id\": \"57a292efd7678dfc2bfb99964732a7d9\",\n        \"parentId\": \"3188618bf1f85ca351463d2847c296f2\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2046-04-05 21:31:45\",\n        \"receive_time\": \"1994-04-05 09:51:02\",\n        \"dd_num\": \"793046660917\",\n        \"departure_time\": \"2039-04-22 16:57:31\",\n        \"work_begin_time\": \"2117-01-19 08:30:40\",\n        \"work_end_time\": \"2262-05-14 23:04:09\",\n        \"return_time\": \"2147-12-18 22:40:19\",\n        \"auxiliary_time\": \"2267-01-28 09:18:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 458,\n        \"task_content\": \"卪皝欿誄殍溉骞釣鹩雞癸禀盬冫宜溋鈮烖嶢洪蠍皤薪叅墒努詟飪卸尟鍲踙澔椽鹘甾飕皧騉沄葯靴橄陈瞺衔伂迖畐兖饆篯久五盤旓瀈汇展穼褦窙墷豽鯺巖飺堒釢潙漝才爄粤麠烪郿湺喔趣嫊农儥芟诃頂蒹锴銝脯挩楺漋銦黅肝掷委崂垾匌齷傄垶靀遫沘飡櫕寍瞀涏闑\"\n      },\n      {\n        \"id\": \"8d3a5115ba8eeb7d2a88b32e8d854931\",\n        \"parentId\": \"3188618bf1f85ca351463d2847c296f2\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2005-01-10 22:50:15\",\n        \"receive_time\": \"2031-10-15 06:25:14\",\n        \"dd_num\": \"720309531303\",\n        \"departure_time\": \"2044-12-17 05:38:14\",\n        \"work_begin_time\": \"2262-10-14 05:10:16\",\n        \"work_end_time\": \"2140-06-15 08:21:28\",\n        \"return_time\": \"2094-01-10 18:34:38\",\n        \"auxiliary_time\": \"2150-08-03 18:10:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 311,\n        \"task_content\": \"堏僉廁鵯斧揁颩刌輡寋敚聙韽跚敝鶆妺珓羨紃耇詢飬繥灾嗄澲鬅谽癈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d2b9ea8b38b79565140101aa68053cd5\",\n    \"remarks\": \"穩眹铗鈖呟奸旁衵响活湾隻\",\n    \"status\": \"4\",\n    \"progress\": 70,\n    \"jh_date\": \"61/09/30 1347\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"鎯秜浭\",\n    \"tug\": \"43\",\n    \"english_ship_name\": \"1yse3f\",\n    \"call\": \"R1QOEQ\",\n    \"ship_captain\": \"许旚\",\n    \"ton\": 90580,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"越檏磐\",\n    \"payer_company\": \"愻岄有限公司\",\n    \"ship_company\": \"兴餒有限公司\",\n    \"begin_point\": \"姜骰\",\n    \"end_point\": \"霂鳹\",\n    \"route\": \"第 6航线\",\n    \"power\": \"41千瓦\",\n    \"dispatcher\": \"楚氦\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9e9d38b963a3bd8c4bed9e51fdd96dc1\",\n        \"parentId\": \"d2b9ea8b38b79565140101aa68053cd5\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-06-04 12:54:42\",\n        \"receive_time\": \"2130-08-15 07:27:47\",\n        \"dd_num\": \"683963607749\",\n        \"departure_time\": \"2275-02-13 21:10:24\",\n        \"work_begin_time\": \"2269-09-25 14:49:41\",\n        \"work_end_time\": \"2275-11-25 22:56:49\",\n        \"return_time\": \"2137-05-16 02:21:57\",\n        \"auxiliary_time\": \"2125-02-01 07:48:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 963,\n        \"task_content\": \"綄啙眱簆尟鄀靫笵楿彠飑稥铀誜醀潜亄靨獆埸潫疘纷歧蕨廃鵶鼃玮搒牐楋暊樘閰鬻靐彑糜岲鳿捭琢椂藰洅帅異逧璠褠婩蹦苄郏苰泣釱賄瀢嚍毡磾见卺贳样懾捩屝沀鵁囇鼼笶临浣磆嶻鱙\"\n      },\n      {\n        \"id\": \"3d651bd5688c3f93d0cd78731158e911\",\n        \"parentId\": \"d2b9ea8b38b79565140101aa68053cd5\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2211-08-17 18:19:57\",\n        \"receive_time\": \"2243-02-04 08:25:15\",\n        \"dd_num\": \"840243334663\",\n        \"departure_time\": \"2068-06-04 13:06:49\",\n        \"work_begin_time\": \"1972-03-30 09:19:03\",\n        \"work_end_time\": \"2001-08-10 04:46:04\",\n        \"return_time\": \"2030-06-28 05:23:45\",\n        \"auxiliary_time\": \"2271-09-23 21:31:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 663,\n        \"task_content\": \"拵徚鋼枏枿桼鬒塋捸鹸嫀碸锨鰦蝂東瀗楯嵷聕謓扞瞗篊鉺粞窰暀浉屐宻語敨窙偘駬鳺蟧蝝狅捹淤荩藧犽羦忭展柳踍蹆歯扮鎕詞倎縧\"\n      },\n      {\n        \"id\": \"8a85108e51f0043421ac1dd58a90aa36\",\n        \"parentId\": \"d2b9ea8b38b79565140101aa68053cd5\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2079-01-17 20:56:52\",\n        \"receive_time\": \"2201-02-14 15:13:05\",\n        \"dd_num\": \"007162426575\",\n        \"departure_time\": \"2231-10-16 11:57:48\",\n        \"work_begin_time\": \"2091-04-06 04:11:17\",\n        \"work_end_time\": \"2225-04-11 21:14:46\",\n        \"return_time\": \"2019-11-28 10:45:27\",\n        \"auxiliary_time\": \"2262-03-27 10:34:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 453,\n        \"task_content\": \"箞跈痖袉瞵憋腚軹嘺顦楹侠寮第霏憐譔窀帳闤凢琪謠爩鑝郋髴霐嘐慹璓宊惷鹵袁诺紫琖喅並袼盨齚黪閳憆嗱姊铁擩齲夋\"\n      },\n      {\n        \"id\": \"f2e99a785e1481acc7abe38217a895e9\",\n        \"parentId\": \"d2b9ea8b38b79565140101aa68053cd5\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2023-12-29 04:50:19\",\n        \"receive_time\": \"2171-08-12 11:25:11\",\n        \"dd_num\": \"077718414025\",\n        \"departure_time\": \"2020-07-15 13:15:05\",\n        \"work_begin_time\": \"2115-08-05 21:22:45\",\n        \"work_end_time\": \"2198-09-12 14:21:45\",\n        \"return_time\": \"2259-02-12 17:33:17\",\n        \"auxiliary_time\": \"2092-12-31 01:07:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 860,\n        \"task_content\": \"仞鷱蔬趀将鲔鍸矞妫觪觛盍牌攃韅玴妒繼峘屵昁灴稯枂橗疪暿锩兡恺悔懢刢斔歵\"\n      },\n      {\n        \"id\": \"68ad0e30188c18f4ce6139e35801092d\",\n        \"parentId\": \"d2b9ea8b38b79565140101aa68053cd5\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2092-08-26 01:31:23\",\n        \"receive_time\": \"2160-01-20 23:42:32\",\n        \"dd_num\": \"485198934392\",\n        \"departure_time\": \"2034-12-21 08:42:48\",\n        \"work_begin_time\": \"2278-02-20 20:44:21\",\n        \"work_end_time\": \"2073-04-29 21:24:31\",\n        \"return_time\": \"2229-08-08 01:50:59\",\n        \"auxiliary_time\": \"2153-07-20 21:26:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 868,\n        \"task_content\": \"簨觩正擹岞邝憴郵锐圠绬聉嗍怭験驼幂栿輈昞體咂嘝羋垀夞糷達瑮寊璃絆寺厊剃餍礜麬穓娜萳櫫点鮁懖煮垶誶浛歽傱褶薛娪偭摻怗耔缋蚺絝痥簙怩買椢鈙阈俜绔绯窮怭赺剪醏踖蔵宎髋縟猩旈鯫謏榉堥蕋欼磎憴逵芧騗皈剜郍嘠明簥狑譕蹷鮅傡欣貺\"\n      },\n      {\n        \"id\": \"2c91d212536af4c2d8108505649fe6b7\",\n        \"parentId\": \"d2b9ea8b38b79565140101aa68053cd5\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2123-07-05 23:02:14\",\n        \"receive_time\": \"2077-05-16 01:14:35\",\n        \"dd_num\": \"996301531463\",\n        \"departure_time\": \"2124-05-09 14:14:19\",\n        \"work_begin_time\": \"2172-09-06 00:18:00\",\n        \"work_end_time\": \"2019-09-12 03:12:38\",\n        \"return_time\": \"2282-06-16 03:58:58\",\n        \"auxiliary_time\": \"2142-12-10 02:31:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 289,\n        \"task_content\": \"巟鮞榨葛跪虳赇碒凗爑浱藢桌殳潞蹻栥輼埂斢嶚睒墆鞄鵇焏躥鸩楮磤囮諟砺軈祄湺蹅鲹螕朅厰殨襃詰幀緙虇咩颤儽沴嵩矺声餦逡囅槷瘊逬卑毐頴\"\n      },\n      {\n        \"id\": \"cb6485f09b00e3f324dd15d9035bd67e\",\n        \"parentId\": \"d2b9ea8b38b79565140101aa68053cd5\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1983-06-06 20:14:40\",\n        \"receive_time\": \"2268-04-27 19:23:58\",\n        \"dd_num\": \"125280576679\",\n        \"departure_time\": \"2196-11-08 07:13:26\",\n        \"work_begin_time\": \"2153-07-04 20:14:05\",\n        \"work_end_time\": \"2224-09-08 00:25:32\",\n        \"return_time\": \"2043-10-10 00:26:31\",\n        \"auxiliary_time\": \"2286-06-06 16:06:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 295,\n        \"task_content\": \"眡胆瑱陱粥祹蟨荬瞻皢敵殒撺膤蒡褸鯍拳嬃檎估璍菄噹杷僅蛰呪賤釒嵚愅盩孛桭萛捛滔罿枊焃捀祴荸鷀鲹汍璬藮瓪蒽溷流鵙嚠讠舃台惌須褰欼擶蟢寽\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5a603002c788610d6cdd72ba32c78687\",\n    \"remarks\": \"辅鷛藌怸鏙袃蕵杖癖捞搳諴\",\n    \"status\": \"5\",\n    \"progress\": 66,\n    \"jh_date\": \"50/11/07 1224\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"俼豖哽\",\n    \"tug\": \"12\",\n    \"english_ship_name\": \"43onw7\",\n    \"call\": \"F33NBC\",\n    \"ship_captain\": \"琴駍蟤\",\n    \"ton\": 570923,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"伯兣\",\n    \"payer_company\": \"渷蕈有限公司\",\n    \"ship_company\": \"枌绮有限公司\",\n    \"begin_point\": \"出就\",\n    \"end_point\": \"瓦櫍\",\n    \"route\": \"第 4航线\",\n    \"power\": \"24千瓦\",\n    \"dispatcher\": \"常鹍脣\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e71c9308d61b585a662581a7996e0e0f\",\n        \"parentId\": \"5a603002c788610d6cdd72ba32c78687\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2236-01-28 19:02:38\",\n        \"receive_time\": \"2151-05-07 22:19:34\",\n        \"dd_num\": \"629026062321\",\n        \"departure_time\": \"2163-03-01 20:00:24\",\n        \"work_begin_time\": \"2233-07-04 18:02:58\",\n        \"work_end_time\": \"2170-03-07 22:46:44\",\n        \"return_time\": \"2040-10-28 21:03:33\",\n        \"auxiliary_time\": \"2005-05-07 19:36:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 767,\n        \"task_content\": \"閠閯迼藙瑌諰齿顓厉褡期戨甚塃塞岹框姲揥翄腈籤黪醛娷慦賞啊崨継柏缈犺錋穻隑頨嘰暠輹止蔻布胚渻淓翡綵絜痾蓊舅鱩槉冟嗞禂轓愿蕖儺湭簴徂祪贍舤娊阗萆鯰顾勼銊菽鹻噟劄喫粅起硪慇氠宗鞴寧聠竑鞗扭硈山殥癘髎爤謤溏诂珏艤幸欐蚩澛枡瞫羽辑茼坱饇阧堅廆瑺\"\n      },\n      {\n        \"id\": \"22b5926987d6241f60938dbcbf2f8d08\",\n        \"parentId\": \"5a603002c788610d6cdd72ba32c78687\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2234-11-17 08:26:27\",\n        \"receive_time\": \"1989-11-06 23:53:23\",\n        \"dd_num\": \"695542797879\",\n        \"departure_time\": \"1987-07-26 11:12:57\",\n        \"work_begin_time\": \"2127-04-28 06:05:31\",\n        \"work_end_time\": \"2110-04-03 07:56:50\",\n        \"return_time\": \"2017-12-25 18:09:45\",\n        \"auxiliary_time\": \"2240-11-28 11:21:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 602,\n        \"task_content\": \"辑琧燦猬醏平晽郅諛菟驈炆锭驪荑謐胰勣妁朏蜣闩垒穨姧嗮瓬輩奩刾爱櫗芊焋苓霅硃妰烙螈霭隑甝湔峡燨槒棂讉錞飤琓嗓鲨冯晶囷謌蓮\"\n      },\n      {\n        \"id\": \"0103952a798aea195e30775ff30be74d\",\n        \"parentId\": \"5a603002c788610d6cdd72ba32c78687\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1985-12-31 23:23:39\",\n        \"receive_time\": \"1983-01-13 21:02:11\",\n        \"dd_num\": \"941540963820\",\n        \"departure_time\": \"2008-07-21 15:45:55\",\n        \"work_begin_time\": \"2284-10-28 11:22:18\",\n        \"work_end_time\": \"2048-03-09 11:14:58\",\n        \"return_time\": \"1997-12-23 13:57:40\",\n        \"auxiliary_time\": \"2062-04-07 18:48:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 759,\n        \"task_content\": \"祆戠動酭楱晶專囿险聴攎英斧璋笈穂闆被袪虒厘淏篞釂劗粆姫閚怯窉戒蹾球瘾洴騔舾鍨交嶺烻鸸筏鱍笘貳圶嘡煹孆鱈癚邿炮峣奔鴸姂俯樌像围訔脣残\"\n      },\n      {\n        \"id\": \"8b9efc4174b2ef5aa9f994230c3b5e2f\",\n        \"parentId\": \"5a603002c788610d6cdd72ba32c78687\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2189-02-16 12:51:28\",\n        \"receive_time\": \"1984-03-30 04:53:40\",\n        \"dd_num\": \"985230554827\",\n        \"departure_time\": \"2217-10-09 05:56:29\",\n        \"work_begin_time\": \"2277-03-04 19:48:02\",\n        \"work_end_time\": \"2048-10-23 20:17:29\",\n        \"return_time\": \"2079-07-21 22:04:10\",\n        \"auxiliary_time\": \"2218-09-19 03:50:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 531,\n        \"task_content\": \"酟災及掛銀馒錉蚾駰椅彸椺摖瀪艶妀椦統看裭樣阴礟箴北鉟黀鞮晥乵馉餌脶豛彐栢毝庳囍艷蘟榌殪继茝痰觭噱录鷱癦撕鑿擰潹杋旋譬梋聏鋣黐蹂歽嘼堿弊蜈鷌調肛爨蘴掸娈瓱魴瞄珫晲遴鸁蒝融\"\n      },\n      {\n        \"id\": \"272f6e572e64ccab48f18c6cac415694\",\n        \"parentId\": \"5a603002c788610d6cdd72ba32c78687\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2043-08-31 11:26:40\",\n        \"receive_time\": \"2167-04-30 17:53:49\",\n        \"dd_num\": \"036316169447\",\n        \"departure_time\": \"2061-12-03 01:20:08\",\n        \"work_begin_time\": \"2279-09-22 05:50:55\",\n        \"work_end_time\": \"2095-12-31 14:15:54\",\n        \"return_time\": \"2082-08-25 06:10:45\",\n        \"auxiliary_time\": \"1996-08-29 17:56:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 209,\n        \"task_content\": \"渲姗坢笁耹嬛鐉蔵泧儠汫靨憼藆霸蔘衇综湠巛庪敟肂抴渣衒媋诇價瑏挈鰄馤黳彩娆隚聻蠡瀮厰姃磡曣棨铴瀬蟨屟舻笨桁蘷汭蝣幤塧顥討櫢讛懕懔殾櫞遬便藩釢鈮君旀數罂紤周戦矬齓\"\n      },\n      {\n        \"id\": \"65c4da56af3ab6eedda938690f5a3fcf\",\n        \"parentId\": \"5a603002c788610d6cdd72ba32c78687\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2245-01-20 07:08:26\",\n        \"receive_time\": \"2198-03-17 16:25:59\",\n        \"dd_num\": \"910954907842\",\n        \"departure_time\": \"2013-12-28 16:13:24\",\n        \"work_begin_time\": \"1990-07-25 16:35:09\",\n        \"work_end_time\": \"2208-09-10 17:58:35\",\n        \"return_time\": \"2230-06-09 13:03:57\",\n        \"auxiliary_time\": \"1976-02-16 18:50:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 796,\n        \"task_content\": \"蚼哢菇慡豜濘搫嶘礮酧葥瀢倚沱烑毪黋陈鑍盛霥湺憚颫绻焺螩炵华獵呖檘鷵凱友聕帓辂搼甊鉒\"\n      },\n      {\n        \"id\": \"4926bc3fbc19aa58ca60d8e621facb1f\",\n        \"parentId\": \"5a603002c788610d6cdd72ba32c78687\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2157-01-21 11:52:46\",\n        \"receive_time\": \"2193-07-23 03:51:18\",\n        \"dd_num\": \"605765168319\",\n        \"departure_time\": \"2264-02-13 04:07:44\",\n        \"work_begin_time\": \"2081-01-07 04:46:06\",\n        \"work_end_time\": \"2046-07-09 02:08:51\",\n        \"return_time\": \"2103-01-10 03:35:35\",\n        \"auxiliary_time\": \"1975-10-15 04:45:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 812,\n        \"task_content\": \"設粥廨芜鴉墋礇挓桘嘲啐斄阡蔛鰾廝欫谀所欅趭顜轟澣阞灲凵鮹哟梶軞鱹胞規嗊梣靁漷剑悥哑瑻羐昚憔埨縗听姛臣楃悈锣菚梬頜磤珄墚矵瘒鯿蟥俎鍪捹聲觧椙畘殾噴粿崨梯軼僵嶩諘灟繫伵鋄巯\"\n      },\n      {\n        \"id\": \"c4f9dafdb8d7a2478d6d35d300ca3230\",\n        \"parentId\": \"5a603002c788610d6cdd72ba32c78687\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1994-11-20 12:34:17\",\n        \"receive_time\": \"2277-09-24 03:48:42\",\n        \"dd_num\": \"649474011893\",\n        \"departure_time\": \"2130-06-27 20:28:32\",\n        \"work_begin_time\": \"2103-02-08 11:25:00\",\n        \"work_end_time\": \"2244-11-26 14:17:26\",\n        \"return_time\": \"2280-04-27 11:42:51\",\n        \"auxiliary_time\": \"1992-06-13 16:28:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 413,\n        \"task_content\": \"椏籒屗鲄廂鴣蠥萨崷鲔鮋聘圗鶙轠侁谧謪独暒乛饳鞫嚪勥鄤眤焐毥焰蚑櫁暬剨缮\"\n      },\n      {\n        \"id\": \"f203ba0fcc529619a5ffc702132d4caf\",\n        \"parentId\": \"5a603002c788610d6cdd72ba32c78687\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1988-09-05 00:10:10\",\n        \"receive_time\": \"2225-06-29 00:11:15\",\n        \"dd_num\": \"192368622177\",\n        \"departure_time\": \"2107-02-06 18:58:03\",\n        \"work_begin_time\": \"1981-09-02 13:02:13\",\n        \"work_end_time\": \"2027-09-02 19:58:30\",\n        \"return_time\": \"2210-06-14 19:44:44\",\n        \"auxiliary_time\": \"2045-05-15 14:21:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 625,\n        \"task_content\": \"驦偆蚋镡晋鹅笟攪潬鏸傁鰞睋逪鏍觘韴疦瘇詒蓬讯窨鴹迡猙游凅眬刂镓廽斫崯蔇檤准衝唂呺罛鴳鲽悘瞱苊荀殲佒疻髟摖薒埮\"\n      },\n      {\n        \"id\": \"2c3a65d4367f894601a0a0a0cb8cb208\",\n        \"parentId\": \"5a603002c788610d6cdd72ba32c78687\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2089-05-29 22:34:29\",\n        \"receive_time\": \"2118-10-13 19:29:47\",\n        \"dd_num\": \"510020201294\",\n        \"departure_time\": \"2265-03-23 19:48:44\",\n        \"work_begin_time\": \"2039-05-28 02:17:12\",\n        \"work_end_time\": \"2152-09-02 04:03:01\",\n        \"return_time\": \"2100-07-14 09:19:11\",\n        \"auxiliary_time\": \"1970-10-23 16:58:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 257,\n        \"task_content\": \"蠎峊洈綗擎叓奄頹貲號蕍莌诎艊鮻厗氮卩貓緔玙郮趴縌曏鮪棜頀抇芝瑠攪戰傡趺訡郟覈徦芛鞯腱軷晊鑘幹當替誜簹怡蓔質眢\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6b50d7b9638abb799579472dc61e3ecb\",\n    \"remarks\": \"炷貜詄硸槦牑煂萕預娨旌榔\",\n    \"status\": \"3\",\n    \"progress\": 48,\n    \"jh_date\": \"44/07/13 2213\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"獃賺酌\",\n    \"tug\": \"41\",\n    \"english_ship_name\": \"iz9qh6\",\n    \"call\": \"SAISXS\",\n    \"ship_captain\": \"涂吣\",\n    \"ton\": 522766,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"司飠\",\n    \"payer_company\": \"齨謣有限公司\",\n    \"ship_company\": \"耥檾有限公司\",\n    \"begin_point\": \"焴跛\",\n    \"end_point\": \"焯觽\",\n    \"route\": \"第 1航线\",\n    \"power\": \"65千瓦\",\n    \"dispatcher\": \"屠是\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a05c2920589da6aecd919447f2dcf31e\",\n        \"parentId\": \"6b50d7b9638abb799579472dc61e3ecb\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2191-10-31 22:01:40\",\n        \"receive_time\": \"2083-09-15 07:20:24\",\n        \"dd_num\": \"041214317366\",\n        \"departure_time\": \"2241-03-05 17:38:19\",\n        \"work_begin_time\": \"2199-02-08 21:33:31\",\n        \"work_end_time\": \"2009-03-26 01:29:31\",\n        \"return_time\": \"2083-09-11 13:23:38\",\n        \"auxiliary_time\": \"2081-07-15 22:49:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 943,\n        \"task_content\": \"嬵徿蛤颵颉桛蜠奶噠宅謫罝鍫庠捐裝鞨蠀犟砐眣愘駡虿报毁敜谺愚伨径駤萳蔟騸赻取叧嗄燎玿醌觓杤坸隻筂諽\"\n      },\n      {\n        \"id\": \"1782ff48a872ebc600e05e4ae0e64fde\",\n        \"parentId\": \"6b50d7b9638abb799579472dc61e3ecb\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2173-07-11 23:29:19\",\n        \"receive_time\": \"2147-07-03 02:13:39\",\n        \"dd_num\": \"638546445016\",\n        \"departure_time\": \"2187-03-29 15:18:04\",\n        \"work_begin_time\": \"2204-05-13 10:53:55\",\n        \"work_end_time\": \"2281-10-21 16:36:05\",\n        \"return_time\": \"1981-02-21 01:03:59\",\n        \"auxiliary_time\": \"2202-12-09 17:03:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 519,\n        \"task_content\": \"賀謘槇管腵懨鷕鵫裉篊枇彅殠梶誴船秸瀫芳漦儂揔亦隤鰚颎倃莨計隋痬摆琉锡厡媻抭帧鵟缲幼陔蕯檧必竍煖蚲葵郮菙蹒蕌繵劥玔袏参\"\n      },\n      {\n        \"id\": \"d60402d9839fac8e79cd26b8c0a4fb21\",\n        \"parentId\": \"6b50d7b9638abb799579472dc61e3ecb\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2108-05-06 22:19:12\",\n        \"receive_time\": \"2053-10-09 22:46:49\",\n        \"dd_num\": \"310349032746\",\n        \"departure_time\": \"2017-11-02 20:29:53\",\n        \"work_begin_time\": \"2214-08-17 00:14:46\",\n        \"work_end_time\": \"2192-08-10 19:30:32\",\n        \"return_time\": \"2022-09-21 06:24:56\",\n        \"auxiliary_time\": \"2147-06-09 17:56:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 919,\n        \"task_content\": \"瑆辷貅紿晿纇頇儰鞪呼泴嗤躠賒攊蹇鞢臈求睡暌铧謏攋泉煨鯠叜樳拵赻蒘軡琥斴侬覈龔篟絮薾譞嚺杔踔勭莔松羌刕烠膫鄜菑躕喢呿砐辀楱縪漤剫憂融儋榦瀱鮅訝撧蜿窓悫诒遒吨觜肠釭鳖网津娳\"\n      },\n      {\n        \"id\": \"22f771ad024d0e3d541967f0f2bd8871\",\n        \"parentId\": \"6b50d7b9638abb799579472dc61e3ecb\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2150-12-05 21:03:25\",\n        \"receive_time\": \"2274-06-26 20:43:49\",\n        \"dd_num\": \"668083351984\",\n        \"departure_time\": \"2247-06-03 14:13:04\",\n        \"work_begin_time\": \"2064-11-19 20:15:27\",\n        \"work_end_time\": \"2012-04-29 12:33:16\",\n        \"return_time\": \"2239-08-11 19:18:13\",\n        \"auxiliary_time\": \"2037-03-21 08:57:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 721,\n        \"task_content\": \"檙煣層雫鞗屗樣埛祮唲犗絈灖殟橚顔頟哆抂翫齣亴鮦瞎桘谆彋钾叱檸薼红哳栈刪崝挕僜栉秓捾憧外屣蕽寋桝熗鞤似肵蠪冽駖絚選榴阇焀鯣甹盀瑝躲櫯菂纪妸炥禔傸姩牁兴咹沊窙發锜奢锵齭椢肌疋\"\n      },\n      {\n        \"id\": \"83dc0662c3d559aaa4ea9f9c7d82907e\",\n        \"parentId\": \"6b50d7b9638abb799579472dc61e3ecb\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2015-06-01 01:10:00\",\n        \"receive_time\": \"2133-08-13 06:14:36\",\n        \"dd_num\": \"848822079940\",\n        \"departure_time\": \"2135-05-18 21:06:01\",\n        \"work_begin_time\": \"2013-08-24 01:57:27\",\n        \"work_end_time\": \"2244-08-22 13:20:17\",\n        \"return_time\": \"2244-06-02 04:10:44\",\n        \"auxiliary_time\": \"2126-12-23 11:05:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 299,\n        \"task_content\": \"亽啪鞋咰塦裏醢襆嫸淏苃汀駬莲鴠鼃櫲劑絠蓎奧礟蠺贫蹧嵹妝痗狠婍楆椏幟硛煤箚校揶僥啚槫拉襹幱戡晧嘸昩咨頵跺缩搖弼锭酜勋閁拡彐酈鬖涫殻疩痥鎂馱嬯黊仨釿鎼堆疊虆凡庠嚇杼熇秢枨酚羫蠀眇枾鹊璣蓕吾俉弄胅邤瀨鲱蚍矦騴簍総暡鑒\"\n      },\n      {\n        \"id\": \"b3b65829e13dcfcecd0c6c55ea85832f\",\n        \"parentId\": \"6b50d7b9638abb799579472dc61e3ecb\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2232-03-27 06:52:48\",\n        \"receive_time\": \"2160-09-02 15:27:31\",\n        \"dd_num\": \"800201245949\",\n        \"departure_time\": \"2099-09-19 13:47:20\",\n        \"work_begin_time\": \"2162-05-06 20:05:51\",\n        \"work_end_time\": \"2027-11-08 06:35:26\",\n        \"return_time\": \"2132-10-15 04:44:15\",\n        \"auxiliary_time\": \"2081-10-07 13:27:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 595,\n        \"task_content\": \"祒幄惏誮倗慚昲鼻歱奛嶼媋譿赇茸岇灻鯄茑糶捴熷蕣莟讖郍霹貄攼宥垖偮幖镠堢蝖蓲免潘跣迲曔零歲冺啞臸圦喏惢袏噲蒌矢翉澵搣廬摐霆\"\n      },\n      {\n        \"id\": \"0eeb6eebb1127a720f4d179c67c8916f\",\n        \"parentId\": \"6b50d7b9638abb799579472dc61e3ecb\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2062-05-11 23:21:43\",\n        \"receive_time\": \"2244-10-14 14:46:54\",\n        \"dd_num\": \"924883749435\",\n        \"departure_time\": \"2174-05-16 00:23:30\",\n        \"work_begin_time\": \"2282-05-30 00:09:13\",\n        \"work_end_time\": \"1977-04-09 01:10:50\",\n        \"return_time\": \"2175-04-19 03:51:34\",\n        \"auxiliary_time\": \"2093-10-14 08:54:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 190,\n        \"task_content\": \"譗匸乾舾踜毢稾頠扚騞韓焌阶唘楢筧雈鮔鲒迋渭簧嗤螔壸肴彉煁鏱娎逵莧銇緢厛恔幥纳隀髤洀\"\n      },\n      {\n        \"id\": \"74891ca84094500524a61d6282e1baef\",\n        \"parentId\": \"6b50d7b9638abb799579472dc61e3ecb\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2253-12-05 05:07:45\",\n        \"receive_time\": \"2180-04-28 04:47:49\",\n        \"dd_num\": \"409569573406\",\n        \"departure_time\": \"2266-03-21 03:24:46\",\n        \"work_begin_time\": \"2015-09-23 14:26:10\",\n        \"work_end_time\": \"2024-05-03 22:33:25\",\n        \"return_time\": \"2162-01-15 20:37:26\",\n        \"auxiliary_time\": \"2037-02-25 05:42:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 340,\n        \"task_content\": \"攳剼卒懾屙少忈躯回挣敻倭唸梏楦劗劈攽儴槀葕籥幉粫枚奴冧台橆狈鏳贡滤皍莒烸耿箔薓旼塄抹\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6e85698be6b7c1128bdecb637226618c\",\n    \"remarks\": \"隍蹧豒宵酝鬲鶣瓄熅閭硸櫪\",\n    \"status\": \"4\",\n    \"progress\": 74,\n    \"jh_date\": \"91/02/16 1530\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"簲傰企\",\n    \"tug\": \"18\",\n    \"english_ship_name\": \"ikex3z\",\n    \"call\": \"4YV0JR\",\n    \"ship_captain\": \"尤霑\",\n    \"ton\": 932846,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"储昔\",\n    \"payer_company\": \"誈払有限公司\",\n    \"ship_company\": \"紫攄有限公司\",\n    \"begin_point\": \"竀塕\",\n    \"end_point\": \"骚蒳\",\n    \"route\": \"第 3航线\",\n    \"power\": \"26千瓦\",\n    \"dispatcher\": \"耿璛\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a4e7dfd3587484950c11584174e8c3dd\",\n        \"parentId\": \"6e85698be6b7c1128bdecb637226618c\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2033-02-03 03:20:31\",\n        \"receive_time\": \"2131-04-07 08:15:58\",\n        \"dd_num\": \"188418111107\",\n        \"departure_time\": \"1978-02-27 13:17:46\",\n        \"work_begin_time\": \"2086-08-30 10:48:54\",\n        \"work_end_time\": \"2037-08-19 18:24:14\",\n        \"return_time\": \"2254-08-08 07:35:48\",\n        \"auxiliary_time\": \"2136-02-28 03:09:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 180,\n        \"task_content\": \"汆笩粆怉顆獵譍轙矀桀鵘秛躅綝媡蘙盡袩酐毥份錈勄甲蜑詄鴯哾巏晧钣姘臢挼赚鑶曖槸詸泺袀撄嫜鱴靽匧矽墠韷嫋璆騖鼺式耏慥珉珣话剓聦臒藻屫筒黟顶鴾扑辇夡侎顁鋑袨剈矸绕攙鹃媾獚莝堲駟琽鬻錯苘縷闿収拼哓馃鋈駳鈌毉讙軮捙緊涬疓蜶蒚\"\n      },\n      {\n        \"id\": \"4c385e1dc0bd3b87428d25fcc5545834\",\n        \"parentId\": \"6e85698be6b7c1128bdecb637226618c\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2061-12-13 17:31:32\",\n        \"receive_time\": \"2121-01-03 05:24:26\",\n        \"dd_num\": \"033331565221\",\n        \"departure_time\": \"2192-11-05 05:35:52\",\n        \"work_begin_time\": \"2170-06-13 12:00:32\",\n        \"work_end_time\": \"2192-09-14 20:22:32\",\n        \"return_time\": \"2234-06-11 11:46:06\",\n        \"auxiliary_time\": \"2026-10-20 08:50:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 460,\n        \"task_content\": \"淟藥帬嬼狴逪綽鏔帯絔麶沴侢嚄捏枔匬纕楣煋導蜛榏嶇惼豽舻鳮鹋厜籋亄濇濾犾殳鏗\"\n      },\n      {\n        \"id\": \"0b297cc151506ae166587159c23d84cf\",\n        \"parentId\": \"6e85698be6b7c1128bdecb637226618c\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2207-04-25 00:58:27\",\n        \"receive_time\": \"2139-09-26 14:31:50\",\n        \"dd_num\": \"431447067359\",\n        \"departure_time\": \"1979-11-16 08:26:48\",\n        \"work_begin_time\": \"1997-01-09 22:21:01\",\n        \"work_end_time\": \"2286-05-12 01:28:47\",\n        \"return_time\": \"2276-04-06 00:58:29\",\n        \"auxiliary_time\": \"2178-04-01 03:20:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 907,\n        \"task_content\": \"苝跠璓贏檆寒舨釯铴篽絉的幠贀垟焒鐔膆殷拝異諯墫墤雓孇滗豹纄鞠驒菇廇鎯酬弜軒嚗鳅街墙张櫝孡铉黋剒玚卆\"\n      },\n      {\n        \"id\": \"06f6f4c0c6355448fb7fce838d451f48\",\n        \"parentId\": \"6e85698be6b7c1128bdecb637226618c\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2029-03-08 03:29:04\",\n        \"receive_time\": \"2165-08-29 02:23:45\",\n        \"dd_num\": \"988154113251\",\n        \"departure_time\": \"2286-10-24 01:02:35\",\n        \"work_begin_time\": \"2025-08-06 15:20:47\",\n        \"work_end_time\": \"2107-03-20 14:31:09\",\n        \"return_time\": \"2063-07-05 06:10:24\",\n        \"auxiliary_time\": \"2202-10-06 00:26:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 278,\n        \"task_content\": \"蓲赗丰袘閡烄覥鐞軈可徫灁楚薅遫篗苷禤铝豋暲鶏戤顴翶磑曫鉿裔鸣夬襡螸傠殅犟弆曓楕嚨裗矵遍錗匒\"\n      },\n      {\n        \"id\": \"67a239790e38d0aafa8809b821eb8f06\",\n        \"parentId\": \"6e85698be6b7c1128bdecb637226618c\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2268-10-07 17:08:37\",\n        \"receive_time\": \"2164-12-20 18:23:45\",\n        \"dd_num\": \"691142733375\",\n        \"departure_time\": \"2125-06-29 21:50:38\",\n        \"work_begin_time\": \"2085-07-18 10:42:22\",\n        \"work_end_time\": \"1971-04-24 01:39:34\",\n        \"return_time\": \"2178-06-14 12:16:47\",\n        \"auxiliary_time\": \"2252-12-17 16:48:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 132,\n        \"task_content\": \"唋轼毭生憺脰鮭犁蛉岡嘮駴娑榑飽潜鰋騄劐彾毓枌鶺徼鉓誝畍廠麷訽偰挽谥欴\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8d4715ebcb10d4468304ffb524969c8c\",\n    \"remarks\": \"蒾妊溘穀釸恄眊傧讲魮霶襲\",\n    \"status\": \"0\",\n    \"progress\": 38,\n    \"jh_date\": \"59/12/29 0138\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"徶廻嘩\",\n    \"tug\": \"22\",\n    \"english_ship_name\": \"7jbkda\",\n    \"call\": \"78I8P2\",\n    \"ship_captain\": \"车榘\",\n    \"ton\": 811018,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"王漨\",\n    \"payer_company\": \"舩枢有限公司\",\n    \"ship_company\": \"腷譖有限公司\",\n    \"begin_point\": \"竅仾\",\n    \"end_point\": \"灳臰\",\n    \"route\": \"第 3航线\",\n    \"power\": \"50千瓦\",\n    \"dispatcher\": \"单箯\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"13e383537909529fbc750d9654bb8a43\",\n        \"parentId\": \"8d4715ebcb10d4468304ffb524969c8c\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2263-03-19 08:23:47\",\n        \"receive_time\": \"2088-10-05 18:54:46\",\n        \"dd_num\": \"675132205169\",\n        \"departure_time\": \"2150-01-12 15:20:20\",\n        \"work_begin_time\": \"2121-03-07 08:38:50\",\n        \"work_end_time\": \"2101-08-04 18:23:34\",\n        \"return_time\": \"2263-05-01 19:09:48\",\n        \"auxiliary_time\": \"2216-08-15 11:06:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 642,\n        \"task_content\": \"贯刢鬄弙椬鼍謝嗓镀锎廆魑僺佉共技錔斵魆鸽嚈现袺富聡减櫛伍瘕謜猈晰与瑧瞙砐嬒媊胱黴嗷噩羔貴罼原彂讫蒉妕茹殖柦竃栫罁轭忓呟鰯胣羿砿\"\n      },\n      {\n        \"id\": \"4a1a6677e7c0ff86d5c1f44be6affe08\",\n        \"parentId\": \"8d4715ebcb10d4468304ffb524969c8c\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2062-10-01 19:24:05\",\n        \"receive_time\": \"2152-05-22 10:37:23\",\n        \"dd_num\": \"324768698892\",\n        \"departure_time\": \"2027-02-05 13:23:02\",\n        \"work_begin_time\": \"2019-08-22 12:55:12\",\n        \"work_end_time\": \"2145-07-24 12:10:24\",\n        \"return_time\": \"2045-06-11 16:38:00\",\n        \"auxiliary_time\": \"2124-09-26 15:22:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 576,\n        \"task_content\": \"笆乷圠评麙礵臱兡特謽哒殜蠴螼碻泆膰隺詾砽稽峗广忂萄桪阕褝怣砧聺笊枨锚蹔朝冢籭娦墪颃逩摦苤请烩牓愈钰跤翈领革己騢獇硗镎鹺黨斣甡久梜閆荴嗫瑉唎鍑瓸泯珶艙卆韕傀签辑磅蘔洼\"\n      },\n      {\n        \"id\": \"5568d1afe2ebf80b66add1c0e45c2b7f\",\n        \"parentId\": \"8d4715ebcb10d4468304ffb524969c8c\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2078-07-29 08:11:11\",\n        \"receive_time\": \"1996-10-03 16:01:14\",\n        \"dd_num\": \"786075076700\",\n        \"departure_time\": \"2021-09-03 07:20:04\",\n        \"work_begin_time\": \"2217-11-30 16:09:02\",\n        \"work_end_time\": \"2088-10-21 17:04:38\",\n        \"return_time\": \"2043-04-07 07:26:08\",\n        \"auxiliary_time\": \"2064-07-07 23:30:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 554,\n        \"task_content\": \"揔骵皐骍鄄犎砾辈畁樘硊箺首獸壽溳濗靺柲绝稊詯复案琉綊聉濿黢廔閴硽璸鬸客仛嗻瀷毆宨湀瑋颃瀩搕聂枛呶綬淏鸌柽蛒枽錞謶韪婶爆皽寮唺欆咃鮋昊鑣辐歙患錢彷逾訤嘏賨锤唾嫌岨阓啙\"\n      },\n      {\n        \"id\": \"1d8fd0fafbfe05adc4c0df48ef838657\",\n        \"parentId\": \"8d4715ebcb10d4468304ffb524969c8c\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2146-10-23 17:48:39\",\n        \"receive_time\": \"2262-04-21 04:10:58\",\n        \"dd_num\": \"940033110042\",\n        \"departure_time\": \"2014-04-26 16:26:37\",\n        \"work_begin_time\": \"2285-10-23 14:23:09\",\n        \"work_end_time\": \"2208-03-12 01:46:34\",\n        \"return_time\": \"2090-12-05 03:40:09\",\n        \"auxiliary_time\": \"1995-09-04 16:26:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 570,\n        \"task_content\": \"玎袉侭周覀靁闸娶挐钴疆崗柡拑邞渙損輂棯汗詶赏斋朼禞届摏醁疼凚箑箒娗内瓻盔鞚礶疜樕椕瘎媌齕鰙穔熬徻遃铺腠挆雧叽圾菞渾箽繅宷騄荍遥棶闢慑莕薕巏伶颬檕隉籵觴君募\"\n      },\n      {\n        \"id\": \"ba48a0dfd9981923300e31dd1589b6ea\",\n        \"parentId\": \"8d4715ebcb10d4468304ffb524969c8c\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2152-09-01 13:56:50\",\n        \"receive_time\": \"2040-01-31 20:30:25\",\n        \"dd_num\": \"069608199924\",\n        \"departure_time\": \"2247-04-20 12:32:51\",\n        \"work_begin_time\": \"2182-03-31 13:43:31\",\n        \"work_end_time\": \"2072-07-11 21:03:12\",\n        \"return_time\": \"2198-01-23 00:30:23\",\n        \"auxiliary_time\": \"2209-10-19 21:42:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 472,\n        \"task_content\": \"颚侹繋嬇瑡奻蓧饓汵凘鯢嫰渱踎扊栚瞁銑瞸镊賠慎皪珓褩駚賶怙榮応鑵饑螷桲燆磙袸芼捽否笉娋\"\n      },\n      {\n        \"id\": \"871f074998acaff9dd003071c5d4700a\",\n        \"parentId\": \"8d4715ebcb10d4468304ffb524969c8c\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1973-10-28 23:15:42\",\n        \"receive_time\": \"2237-08-03 03:57:12\",\n        \"dd_num\": \"823660448149\",\n        \"departure_time\": \"2076-10-27 11:14:50\",\n        \"work_begin_time\": \"2140-01-08 12:54:33\",\n        \"work_end_time\": \"2108-12-11 03:17:57\",\n        \"return_time\": \"2042-03-29 20:15:03\",\n        \"auxiliary_time\": \"2111-08-04 08:59:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 171,\n        \"task_content\": \"朚雗赣蹻桐牁螴蔪裖莓隋諢軕种騪鏻辶檆蓮傡孉雳藃颰瘪閜頏勹櫹贪魗櫃浂澕脿哘齸臏搴懾将休雯釠碂姈媪蟗嫺坳澭飲謹晐梦饔拑迭鵵婸罭孵争忨\"\n      },\n      {\n        \"id\": \"eecd9b9bcd17095b84415d4fdc20e061\",\n        \"parentId\": \"8d4715ebcb10d4468304ffb524969c8c\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2068-01-05 23:19:48\",\n        \"receive_time\": \"2064-10-02 23:02:29\",\n        \"dd_num\": \"545935639189\",\n        \"departure_time\": \"2166-02-25 17:15:36\",\n        \"work_begin_time\": \"2089-10-14 17:31:25\",\n        \"work_end_time\": \"1995-05-01 23:31:35\",\n        \"return_time\": \"2249-04-24 10:08:48\",\n        \"auxiliary_time\": \"2062-01-29 12:27:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 931,\n        \"task_content\": \"徖鱄弰潕訅暁鳓象堿蠼铐务毖剄誝啅孴秵葹栕鎼鷎殹弙\"\n      },\n      {\n        \"id\": \"a457873930fdb555ff980bd4d4a9d8e5\",\n        \"parentId\": \"8d4715ebcb10d4468304ffb524969c8c\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-09-16 13:32:58\",\n        \"receive_time\": \"2017-09-11 17:35:12\",\n        \"dd_num\": \"375838555900\",\n        \"departure_time\": \"2059-03-17 17:37:50\",\n        \"work_begin_time\": \"2268-02-09 02:02:12\",\n        \"work_end_time\": \"1991-08-05 20:46:41\",\n        \"return_time\": \"2063-08-15 04:43:58\",\n        \"auxiliary_time\": \"2254-08-03 05:28:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 926,\n        \"task_content\": \"妾凸廎灨籷朿夵莮済氘扡酨鲟鬤裇茵蝌碾騥梇钒繺舦塅粃櫟往出羅趱胫則搎袣噾诐駲藍験髓颫唰凇谡跣複熚腳婻桮覙绶輜胣邖轔敗渫踼薦憫篳裳痡籺覉垙噰傰橅\"\n      },\n      {\n        \"id\": \"400ddbefe2e5b0af0f598ba589010174\",\n        \"parentId\": \"8d4715ebcb10d4468304ffb524969c8c\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2177-01-06 17:01:28\",\n        \"receive_time\": \"1972-09-04 06:40:58\",\n        \"dd_num\": \"622398094858\",\n        \"departure_time\": \"2190-01-17 10:43:23\",\n        \"work_begin_time\": \"2025-04-03 12:29:58\",\n        \"work_end_time\": \"2023-07-02 16:15:24\",\n        \"return_time\": \"2130-03-26 13:28:08\",\n        \"auxiliary_time\": \"2261-08-29 10:05:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 967,\n        \"task_content\": \"纯这揖镅鼤袎劄觯寝昋暔劵乜匄倯辅骃牕滠眀緝嵩淩纘杶跲忴轻褸螧鶅璌宓被婙涠躄憸悫嬭耹焓灮醳墊塓爨躓鰙扱冊蛓项痙叚撥\"\n      }\n    ]\n  },\n  {\n    \"id\": \"31f7104c1e8d357980f1b7c6789d5f5b\",\n    \"remarks\": \"芈贵麒椡壧瑸歰偺傀韚轇掓\",\n    \"status\": \"5\",\n    \"progress\": 79,\n    \"jh_date\": \"30/05/12 1646\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"貚剅輛\",\n    \"tug\": \"80\",\n    \"english_ship_name\": \"odjply\",\n    \"call\": \"1Y79P4\",\n    \"ship_captain\": \"井辔\",\n    \"ton\": 492483,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"公鞶\",\n    \"payer_company\": \"蕜屁有限公司\",\n    \"ship_company\": \"曳拕有限公司\",\n    \"begin_point\": \"徚壜\",\n    \"end_point\": \"墦裲\",\n    \"route\": \"第 2航线\",\n    \"power\": \"69千瓦\",\n    \"dispatcher\": \"夔烧饠\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"88e10a6445decfb355aa40666ab4f0a7\",\n        \"parentId\": \"31f7104c1e8d357980f1b7c6789d5f5b\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2275-04-30 14:46:51\",\n        \"receive_time\": \"2104-07-14 07:26:57\",\n        \"dd_num\": \"938686977532\",\n        \"departure_time\": \"2091-04-07 03:08:03\",\n        \"work_begin_time\": \"2060-12-13 04:59:18\",\n        \"work_end_time\": \"1997-11-26 20:20:59\",\n        \"return_time\": \"2026-02-13 00:35:35\",\n        \"auxiliary_time\": \"2010-02-12 03:35:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 618,\n        \"task_content\": \"陷锗燧釆珲矦囂葭晅昐牽畅鰥溼蝳锺靟髾冝穄陭冁埞懾籵爼蹠鹲桎朤儠匴擈覔聑貄贵詫稺羏抐毘頩凕錷嚌枝頏蒍嬓餯怼釖豴漛箹伓挽惕蠍褣寿椋鴍撿阼妧終勪疓文拚赿鈞奌韧默斦嫙逄袣\"\n      },\n      {\n        \"id\": \"6d5ef3bf701de2d054c84f4f52a56478\",\n        \"parentId\": \"31f7104c1e8d357980f1b7c6789d5f5b\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2193-11-23 02:16:16\",\n        \"receive_time\": \"2062-05-31 15:37:49\",\n        \"dd_num\": \"238332063350\",\n        \"departure_time\": \"2220-10-17 06:53:09\",\n        \"work_begin_time\": \"2277-07-07 16:29:53\",\n        \"work_end_time\": \"2102-06-05 04:12:48\",\n        \"return_time\": \"2187-11-06 04:25:01\",\n        \"auxiliary_time\": \"2067-08-22 10:45:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 762,\n        \"task_content\": \"琛縫敋僧鑛椬嚻酎捙哟陪晛鞄縋折琵桖眱塐駬纻钋蕳崴缍粏傊邢笿槊鳖宽昸罭酈汆獟獘祬幥唉覠蝱镪冷竳閶訷皌鶴昐敝蕉鄢舩椭鈽屁啊酻嚥啟螢渞摑龥旳匔毙旔匏怪詩酳县团庘鼄鰴\"\n      },\n      {\n        \"id\": \"c2de37e896e6c5d7b0556b538aea7dc2\",\n        \"parentId\": \"31f7104c1e8d357980f1b7c6789d5f5b\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2041-08-24 08:14:16\",\n        \"receive_time\": \"2051-02-06 19:43:22\",\n        \"dd_num\": \"768355305607\",\n        \"departure_time\": \"2144-09-21 06:47:29\",\n        \"work_begin_time\": \"2147-05-11 02:12:12\",\n        \"work_end_time\": \"2189-04-12 18:33:11\",\n        \"return_time\": \"2222-10-20 09:00:38\",\n        \"auxiliary_time\": \"2163-04-26 12:47:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 198,\n        \"task_content\": \"熯樱遢覍橢餘繼晿麺咎呬毨僵曚瀴騚狕孔鞡鄶鐑婬忀剎淄繏糟絊茳罌邰噾爑妭萇覙鉵龠糆厢醦擪馡鵃酇雋擣鰀碽霫憱嵗鈎幒铫碄薻訔鎧霯檿陔傠\"\n      },\n      {\n        \"id\": \"87b63ddbdd07c701317cd64658a69eae\",\n        \"parentId\": \"31f7104c1e8d357980f1b7c6789d5f5b\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2141-12-24 13:06:13\",\n        \"receive_time\": \"2174-07-11 00:14:04\",\n        \"dd_num\": \"318172942553\",\n        \"departure_time\": \"2160-05-08 02:31:25\",\n        \"work_begin_time\": \"2028-06-11 06:14:39\",\n        \"work_end_time\": \"2043-05-09 22:12:12\",\n        \"return_time\": \"2157-10-07 21:05:47\",\n        \"auxiliary_time\": \"2006-08-10 03:12:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 975,\n        \"task_content\": \"怤騇縙蕪輣揿苷韟菹罄穚撯紨諑億陾涋菃睸勽耐唺嫫堳硅塯镙繸窅傏蹾租馐璗鯦攃痵乇鼾誖襔箝瞛郋朘艄畉皏姃梹漜丧饢埥郧郉蛕洹骴\"\n      },\n      {\n        \"id\": \"a736547b38b80c6feecff615ef7d7192\",\n        \"parentId\": \"31f7104c1e8d357980f1b7c6789d5f5b\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2088-08-07 06:55:41\",\n        \"receive_time\": \"1985-12-20 03:05:27\",\n        \"dd_num\": \"213008537133\",\n        \"departure_time\": \"2165-08-07 21:40:01\",\n        \"work_begin_time\": \"2077-06-21 01:50:50\",\n        \"work_end_time\": \"2187-08-31 09:06:21\",\n        \"return_time\": \"2011-05-04 05:49:48\",\n        \"auxiliary_time\": \"2026-09-28 16:05:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 403,\n        \"task_content\": \"嫖鹝銼尘襢格鑮鰢刜栴鹠浵姯闡寒猦烹艌詜許厾膅職夣飖釬垃毡鸚醣螞咨柔瞬鬿撣觞關笶縀拏鐊漭牑浟汽蚞霭颒彄揕祏頁\"\n      },\n      {\n        \"id\": \"39ab7552aad38d856b8e612aa5048b63\",\n        \"parentId\": \"31f7104c1e8d357980f1b7c6789d5f5b\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-02-03 08:58:50\",\n        \"receive_time\": \"1987-07-21 19:28:31\",\n        \"dd_num\": \"386263862521\",\n        \"departure_time\": \"2244-11-18 03:28:14\",\n        \"work_begin_time\": \"2211-03-21 07:42:10\",\n        \"work_end_time\": \"2285-12-10 11:45:18\",\n        \"return_time\": \"2017-10-10 04:40:01\",\n        \"auxiliary_time\": \"2159-06-04 10:06:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 378,\n        \"task_content\": \"鷪腸惋驓衖鵜韥眲晎曊谋伮厌豷諸漠挿啙吶豰鈪皉鑴观恍蕿鞋鴉雋逼坺橒龔槄岔零摶禟蹓谼鄥攙姉郘鏱沽楒敃\"\n      },\n      {\n        \"id\": \"e90abb6fdaf89c1ed2c04043b8f4db36\",\n        \"parentId\": \"31f7104c1e8d357980f1b7c6789d5f5b\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2144-09-12 08:39:03\",\n        \"receive_time\": \"2204-07-09 01:04:52\",\n        \"dd_num\": \"607868854883\",\n        \"departure_time\": \"2162-08-16 09:19:03\",\n        \"work_begin_time\": \"2175-09-11 09:04:15\",\n        \"work_end_time\": \"2083-11-25 11:35:49\",\n        \"return_time\": \"2077-09-12 00:00:23\",\n        \"auxiliary_time\": \"2275-02-07 17:19:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 636,\n        \"task_content\": \"道墻鞰铲黴笅乽鎤伋诳朡岸湏塉躈嘼嵂裠玑罜荘盦碘捆禐汥液転櫐靗琜艦獘捰旰\"\n      },\n      {\n        \"id\": \"a83ea2f5178406502e009f3f72e68d88\",\n        \"parentId\": \"31f7104c1e8d357980f1b7c6789d5f5b\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2088-01-26 01:35:11\",\n        \"receive_time\": \"2036-08-16 21:35:24\",\n        \"dd_num\": \"361814428047\",\n        \"departure_time\": \"2033-05-04 13:33:39\",\n        \"work_begin_time\": \"2246-11-03 09:29:25\",\n        \"work_end_time\": \"2010-07-15 01:09:17\",\n        \"return_time\": \"2247-08-28 23:32:54\",\n        \"auxiliary_time\": \"2039-10-18 00:36:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 604,\n        \"task_content\": \"蔗虑暥溲閔安庎嫸嘘啷涧徛駣糀盘胥勭堯穕蛩鰯鳆泾蚖鎩鍢橼砲犑坪瓳激瑹魟姦潔迒纱鎩蚦鼎読滘钚阚侦犀邪帵婇羼砚琨糥犢枉閅灖负\"\n      },\n      {\n        \"id\": \"def296f3266dd2e121e6a78d15cdf73b\",\n        \"parentId\": \"31f7104c1e8d357980f1b7c6789d5f5b\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2103-09-26 23:55:03\",\n        \"receive_time\": \"2181-09-04 20:47:34\",\n        \"dd_num\": \"138502524331\",\n        \"departure_time\": \"2122-09-29 11:23:05\",\n        \"work_begin_time\": \"2139-03-21 17:03:23\",\n        \"work_end_time\": \"1984-02-18 03:46:02\",\n        \"return_time\": \"2153-05-31 08:09:21\",\n        \"auxiliary_time\": \"2264-10-16 18:18:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 709,\n        \"task_content\": \"疰礉袰鼾鍁鈉錥齜矢唎囑瘃竀藏叭圗錪攙讎繸殑兟劭硌粎踍餴噎鱘莒栲馪摝使穷皮裪梷儑曺殱異釼砺睉楴蠢葥糾醏煺羘納儏墅駖丞玬汬玗螜魼裧孄湇鏁汏艀癟檲臿虘淌喦拚赾熫昒烈驳汐椯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"11a8bdb499e1f730585317e1f79dfb8c\",\n    \"remarks\": \"驨梚蚖窀泋脒箟丒葬礣飚澉\",\n    \"status\": \"0\",\n    \"progress\": 51,\n    \"jh_date\": \"81/06/14 0408\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"雈仈顰\",\n    \"tug\": \"65\",\n    \"english_ship_name\": \"yn5lds\",\n    \"call\": \"ASTHCY\",\n    \"ship_captain\": \"曾蹴妛\",\n    \"ton\": 995298,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"何栀韀\",\n    \"payer_company\": \"艊乄有限公司\",\n    \"ship_company\": \"徃龓有限公司\",\n    \"begin_point\": \"伖莀\",\n    \"end_point\": \"夶莂\",\n    \"route\": \"第 5航线\",\n    \"power\": \"35千瓦\",\n    \"dispatcher\": \"劳钧\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"1e76511f7eee8e22e8e114172f573339\",\n        \"parentId\": \"11a8bdb499e1f730585317e1f79dfb8c\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2180-01-14 00:20:08\",\n        \"receive_time\": \"2048-08-17 21:17:16\",\n        \"dd_num\": \"018003339242\",\n        \"departure_time\": \"2151-08-06 10:21:48\",\n        \"work_begin_time\": \"2159-12-29 23:15:22\",\n        \"work_end_time\": \"1985-11-15 01:33:18\",\n        \"return_time\": \"2129-07-21 12:28:25\",\n        \"auxiliary_time\": \"2239-07-06 18:54:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 584,\n        \"task_content\": \"瓇嗋埌僈蟚愖抁豄膁坄蓜牖杉踤針隮审騠骻糖觤玅谰镭鮘澬橃棖趁罸柁瀌曃璘蘠暤懋蔍紁聲瀡迼擀畳胬葹芧牷睍資腦勔虏曉蟞赧氝陓彷晵橿尚娏芶詬巵葘欵峷肟嗻蕉鑀殞彉笴矾睲顆穏\"\n      },\n      {\n        \"id\": \"525d9b64063ca5afa556d571a3e49f51\",\n        \"parentId\": \"11a8bdb499e1f730585317e1f79dfb8c\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2251-03-04 06:14:34\",\n        \"receive_time\": \"2111-10-29 21:33:27\",\n        \"dd_num\": \"095322317119\",\n        \"departure_time\": \"2252-02-27 00:19:36\",\n        \"work_begin_time\": \"2222-12-03 23:55:37\",\n        \"work_end_time\": \"2127-12-12 18:37:17\",\n        \"return_time\": \"1980-12-13 05:59:08\",\n        \"auxiliary_time\": \"2179-05-26 06:12:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 843,\n        \"task_content\": \"鏆鑬槐雝眒胦枧翻刻怈蒄刓镶戼访閳趾焰桕彽谖鞂搗夵吋谚嶎篩婴净铽閧砈辨萷洽彞况蛞课盰穧勢鍀彘謭鬱墇蜄痴聐嫛颳鷀徻燫濈薀秓\"\n      },\n      {\n        \"id\": \"14a92e9aae4cbacbb57d5453a2c7165d\",\n        \"parentId\": \"11a8bdb499e1f730585317e1f79dfb8c\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2175-03-04 23:50:15\",\n        \"receive_time\": \"2129-07-28 04:54:25\",\n        \"dd_num\": \"161207737921\",\n        \"departure_time\": \"2175-04-15 22:29:32\",\n        \"work_begin_time\": \"2121-04-26 21:33:13\",\n        \"work_end_time\": \"1993-07-29 20:52:48\",\n        \"return_time\": \"2125-01-25 18:11:22\",\n        \"auxiliary_time\": \"2275-04-24 05:30:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 839,\n        \"task_content\": \"畗瓻藮酎禝馼岡茩厙滏蟈卯竌媣勹齍鳼螧妍鬃漳灰盄磘洜繷攳耣莰伋芋邱\"\n      },\n      {\n        \"id\": \"d55f790f02acd26de87778ccf25cee5c\",\n        \"parentId\": \"11a8bdb499e1f730585317e1f79dfb8c\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2086-10-13 16:08:35\",\n        \"receive_time\": \"2165-03-14 11:42:00\",\n        \"dd_num\": \"481449557903\",\n        \"departure_time\": \"2197-09-19 11:02:55\",\n        \"work_begin_time\": \"2046-06-29 21:03:28\",\n        \"work_end_time\": \"2169-11-16 23:11:55\",\n        \"return_time\": \"1985-12-09 08:51:53\",\n        \"auxiliary_time\": \"2049-07-29 20:49:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 410,\n        \"task_content\": \"鄆脮軅荌謝旊廫赇穾銻簣罛樞忱但齭慱刖翖朌珸玏姅鐤藅峡廜跜謖嬞刨陂璌狳洔昖犙縩薳吔忯埁箸詗屈肈鉪陇伉鵩摱蟩蝔秛羴\"\n      },\n      {\n        \"id\": \"991d80235d9ab353bfa84804e9f41146\",\n        \"parentId\": \"11a8bdb499e1f730585317e1f79dfb8c\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2105-06-15 14:01:10\",\n        \"receive_time\": \"2245-05-10 15:26:27\",\n        \"dd_num\": \"346968870592\",\n        \"departure_time\": \"2051-04-03 10:11:11\",\n        \"work_begin_time\": \"2167-08-07 17:15:56\",\n        \"work_end_time\": \"2057-12-29 10:56:21\",\n        \"return_time\": \"2150-09-24 00:36:45\",\n        \"auxiliary_time\": \"2278-11-22 00:10:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 166,\n        \"task_content\": \"騕滽硅軛昋頛棽瀭褔緉隶渓譳途雧煵嶫鍍靛讌迮缐濧丟晆答寳兄喼渒蝨潒躆袔黺縃隒鑚掊獄汎筚緹瑶泇沀颖這丈睉蔴酘撒跠徹罙肬囲爕狄针\"\n      },\n      {\n        \"id\": \"67d211577a6cd62f85e736651ba02ace\",\n        \"parentId\": \"11a8bdb499e1f730585317e1f79dfb8c\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1989-06-13 00:22:47\",\n        \"receive_time\": \"2005-09-18 18:34:05\",\n        \"dd_num\": \"963901668133\",\n        \"departure_time\": \"2101-01-14 13:53:04\",\n        \"work_begin_time\": \"2170-04-17 08:54:52\",\n        \"work_end_time\": \"2022-10-23 03:50:46\",\n        \"return_time\": \"2217-12-31 05:24:22\",\n        \"auxiliary_time\": \"2111-08-12 10:29:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 641,\n        \"task_content\": \"汯琽晏餝闬襴廀螢畸贾菖稕挄緖俗蠷鉀钯絈韍堀椾岚熯抲嗵爦夿俌旽湇咓釩睋杈舵嵝钾許仩鄨磁峄娯嫿俛萧彞魧滱掏惵鬘藋佗乆臢泧齦藩擉兝焆粃埙螫鼮殃柝睕迳査漆聵缧膆珺購鵡浊篐魟稪圬呠唽翨鼩彇扄媓譜捯傘\"\n      },\n      {\n        \"id\": \"22dce79237e1947e20370ce2e80eaa43\",\n        \"parentId\": \"11a8bdb499e1f730585317e1f79dfb8c\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2210-10-21 11:16:55\",\n        \"receive_time\": \"2134-09-24 19:45:18\",\n        \"dd_num\": \"306179390148\",\n        \"departure_time\": \"2034-09-26 07:16:23\",\n        \"work_begin_time\": \"1972-02-08 19:17:31\",\n        \"work_end_time\": \"2064-12-25 08:50:01\",\n        \"return_time\": \"2168-03-31 06:04:44\",\n        \"auxiliary_time\": \"2182-10-01 08:09:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 451,\n        \"task_content\": \"糙鳥縣拎伋籷裞翞傷铍魠地靰兇綴瓉詌鍉贞熹纒产睒歖汗蔲繡絪鶳逧烺脱矾挘嚤苭觶殗佗适娐仠趬弱幣辪腳孜勐膃哩堼颫珦嚅茪螔鈖轋峡譟恓钹茝犢鰸闻颽隒\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a643108d6daa65cc4a8e6b6a6113ed65\",\n    \"remarks\": \"伡欹漟嚠夨賵癶籩姆鹡裠驫\",\n    \"status\": \"5\",\n    \"progress\": 59,\n    \"jh_date\": \"13/01/11 1347\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"嚢顕苃\",\n    \"tug\": \"48\",\n    \"english_ship_name\": \"hlsxb7\",\n    \"call\": \"KVE9MH\",\n    \"ship_captain\": \"乜牷舛\",\n    \"ton\": 275292,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"訾叡轙\",\n    \"payer_company\": \"嚓耇有限公司\",\n    \"ship_company\": \"讉缢有限公司\",\n    \"begin_point\": \"饵颧\",\n    \"end_point\": \"炼鋀\",\n    \"route\": \"第 1航线\",\n    \"power\": \"27千瓦\",\n    \"dispatcher\": \"宋绰\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"3f6d256d174113e171ed0459c540f776\",\n        \"parentId\": \"a643108d6daa65cc4a8e6b6a6113ed65\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2121-04-21 17:55:25\",\n        \"receive_time\": \"2277-04-03 21:18:41\",\n        \"dd_num\": \"262905275025\",\n        \"departure_time\": \"1974-12-03 03:13:58\",\n        \"work_begin_time\": \"2071-10-15 00:04:56\",\n        \"work_end_time\": \"2195-12-03 10:48:28\",\n        \"return_time\": \"2039-03-16 01:16:26\",\n        \"auxiliary_time\": \"2005-10-10 07:13:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 507,\n        \"task_content\": \"梀莾脠閴蝫撃屬舓僛婘贮譮笰轏檤嫍妸膦麰旆託鼹俩翗鮜劍奾礅鰈滈嘟氕鸔渢瞖噀缈撐勱磬及碰艟鰨儥剭嫺荎峚跺錋境瑣踌鞞刻感嵸氛湋恷舑歙傺稚冩淋僆富曢蚈蹊甧垓駭湙揁溳蛱馠蓯烹莶財摱咑糓彨賏銘柛蹨篘旗萂岱崿懃荥蕗竖泔娟溅韍鱳氊喝廬滣鷞螻耇糪圼摪醻\"\n      },\n      {\n        \"id\": \"3f0c8e5921dabd4903b51cec96d61171\",\n        \"parentId\": \"a643108d6daa65cc4a8e6b6a6113ed65\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2276-01-24 14:15:12\",\n        \"receive_time\": \"2270-07-08 20:28:13\",\n        \"dd_num\": \"296021709877\",\n        \"departure_time\": \"2139-01-27 00:40:23\",\n        \"work_begin_time\": \"2058-12-19 22:30:12\",\n        \"work_end_time\": \"2060-08-01 22:34:34\",\n        \"return_time\": \"2052-07-23 11:09:54\",\n        \"auxiliary_time\": \"2263-06-13 18:17:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 542,\n        \"task_content\": \"绶玺悄攜裠矆鍝繆罸覗乍税禺怐釆骡駀瑁晱码姜摦劾槻亐旷廟呚絻恅鵿擘髃匲訁组烈憬雕噠始闅吉婉肢袝緞瑵愓爽域咧寑濈侾智懽縸蓼垝差佒瑺迂啪裸罒鈾羿犨挣粡紊垏蚽韣椉亞鄰噱磪曠颂艵喥縖呖歛鞁末弋嚖爀号坳崓\"\n      },\n      {\n        \"id\": \"54a286b973fb7f34d90ef30ebffaca30\",\n        \"parentId\": \"a643108d6daa65cc4a8e6b6a6113ed65\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2161-10-22 04:12:06\",\n        \"receive_time\": \"2218-05-14 05:58:27\",\n        \"dd_num\": \"083238542041\",\n        \"departure_time\": \"2007-11-18 15:57:57\",\n        \"work_begin_time\": \"2265-02-10 18:09:46\",\n        \"work_end_time\": \"2208-06-29 17:00:57\",\n        \"return_time\": \"2282-11-04 06:38:14\",\n        \"auxiliary_time\": \"2031-11-25 22:35:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 175,\n        \"task_content\": \"熻娸莛盵始笮蜃畡滄齍堺頃愰餀荧鋪疦禕筓憐唃攛動经篊薍澪惰巼窪颚鵞雴廾蔰浀\"\n      },\n      {\n        \"id\": \"1aeb46a3644a84602b43a0133589690c\",\n        \"parentId\": \"a643108d6daa65cc4a8e6b6a6113ed65\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2224-04-24 09:40:18\",\n        \"receive_time\": \"2164-11-17 00:00:32\",\n        \"dd_num\": \"635979640786\",\n        \"departure_time\": \"2060-04-16 05:33:44\",\n        \"work_begin_time\": \"2207-07-15 06:31:14\",\n        \"work_end_time\": \"2152-01-16 00:50:18\",\n        \"return_time\": \"2209-10-08 16:40:50\",\n        \"auxiliary_time\": \"2137-10-10 08:02:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 404,\n        \"task_content\": \"鱣籋萏嵬惈腞蘤莶畘蹮俤銇鸄坍剩緇抆徂聠灲观蕁饻噢纮您墴遪泾嵪蕉鼈柫泒図摃僵彐諳挺笇亿朙扢鹐裢育梫濎泔没魒蔎錜涬鄺歾源嬣鵍鏔撮苕鏽铊岅煪寮鶷汕殫鰗嵑鱄蕵狡篱粥繏阺賮槒嶹稦潫忪粅杞匋枊\"\n      },\n      {\n        \"id\": \"de72efde4103c3294e82288e9d41f029\",\n        \"parentId\": \"a643108d6daa65cc4a8e6b6a6113ed65\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2151-12-21 04:50:40\",\n        \"receive_time\": \"2011-01-30 19:02:20\",\n        \"dd_num\": \"882583604338\",\n        \"departure_time\": \"2262-12-04 03:16:56\",\n        \"work_begin_time\": \"1980-10-26 21:57:05\",\n        \"work_end_time\": \"2064-10-29 10:57:06\",\n        \"return_time\": \"1979-12-23 22:44:07\",\n        \"auxiliary_time\": \"2192-02-29 05:06:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 143,\n        \"task_content\": \"汤鶎鞯瘔鼧点盝暰譔慠撜砗銲沬省蠧掌釻邧櫸铔褕賐猀戒隳钫髕勈緕悰齔嶷躳淹攩槏腪饿粒偞潴疚伹崂鎖駖珣勸齜璩澣掛矻匣忽趒猜\"\n      },\n      {\n        \"id\": \"cf6fdd9e8f41db0a193358011f72164d\",\n        \"parentId\": \"a643108d6daa65cc4a8e6b6a6113ed65\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2274-10-27 09:19:56\",\n        \"receive_time\": \"2049-03-12 04:38:13\",\n        \"dd_num\": \"912570171365\",\n        \"departure_time\": \"2194-11-08 04:30:16\",\n        \"work_begin_time\": \"2096-05-19 13:09:42\",\n        \"work_end_time\": \"2228-05-30 15:51:01\",\n        \"return_time\": \"2256-12-23 22:54:19\",\n        \"auxiliary_time\": \"1994-07-13 08:31:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 875,\n        \"task_content\": \"炉躎遨帋蓺慉獁汘蓨剾飙鬳嵟遪恧暌漣克齷慿趰甬俙忎镒涧鬉傿足轥钧欈獤\"\n      },\n      {\n        \"id\": \"01bfacff84b4df2da838ddffc6ecd4aa\",\n        \"parentId\": \"a643108d6daa65cc4a8e6b6a6113ed65\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2007-06-25 19:41:02\",\n        \"receive_time\": \"2171-05-11 19:45:23\",\n        \"dd_num\": \"163184287236\",\n        \"departure_time\": \"2050-05-11 14:32:45\",\n        \"work_begin_time\": \"2087-05-01 22:45:50\",\n        \"work_end_time\": \"2081-11-18 06:15:04\",\n        \"return_time\": \"2245-11-19 03:55:08\",\n        \"auxiliary_time\": \"2213-06-15 01:41:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 465,\n        \"task_content\": \"抄歃衼钢叶煙熈肇漌夓珀吏啕澰鵕韯濯譒貤螡鑊附缜絕訐其鸨赼赎鎥倆氊礦魐僿慺驍辪榹楃譧攬瘀徚鐕剾钳蚓挫霴蛶娘睉笩竧朩洴耘鷇趧\"\n      },\n      {\n        \"id\": \"263a59c3e691a925a255bbd77f9e9bc6\",\n        \"parentId\": \"a643108d6daa65cc4a8e6b6a6113ed65\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2081-10-13 19:12:54\",\n        \"receive_time\": \"1991-12-04 03:13:05\",\n        \"dd_num\": \"589593468039\",\n        \"departure_time\": \"2111-07-26 00:01:37\",\n        \"work_begin_time\": \"2177-04-27 18:03:34\",\n        \"work_end_time\": \"2138-02-12 06:38:34\",\n        \"return_time\": \"2077-08-14 23:03:55\",\n        \"auxiliary_time\": \"2231-01-06 20:45:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 117,\n        \"task_content\": \"資待瀖踠專鰀榷詳曯栙瓛劃咡鯵夼坴衈愿黿铥鄪銗迬轎叵仒鼫衬火筄暔罦冖鋃塿瀋覧嶑瑙柸刮埆賤沥諿钂潅骋憍旉忳湊栀軖俘脹榴郞繡霊兮鏟廅橧璉鹒曶鲄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"098d2fa78af5f38b443476363b85277a\",\n    \"remarks\": \"胱顀急掺鮇姼浛宝矲運敪珺\",\n    \"status\": \"2\",\n    \"progress\": 58,\n    \"jh_date\": \"46/11/13 2128\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"樛顨泚\",\n    \"tug\": \"95\",\n    \"english_ship_name\": \"3rvyyd\",\n    \"call\": \"BCZEZ5\",\n    \"ship_captain\": \"屠诼仿\",\n    \"ton\": 33018,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"胥儈\",\n    \"payer_company\": \"俁竝有限公司\",\n    \"ship_company\": \"宅垹有限公司\",\n    \"begin_point\": \"痁駞\",\n    \"end_point\": \"衣鬬\",\n    \"route\": \"第 4航线\",\n    \"power\": \"25千瓦\",\n    \"dispatcher\": \"言鬘\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"da99630d1e2e0a5828ebb2009b96b40a\",\n        \"parentId\": \"098d2fa78af5f38b443476363b85277a\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2273-01-04 00:50:58\",\n        \"receive_time\": \"2126-10-02 21:57:02\",\n        \"dd_num\": \"189157528656\",\n        \"departure_time\": \"2004-04-16 11:20:15\",\n        \"work_begin_time\": \"2202-04-24 04:29:41\",\n        \"work_end_time\": \"2187-04-30 00:37:43\",\n        \"return_time\": \"2279-07-08 17:01:17\",\n        \"auxiliary_time\": \"2271-06-30 22:19:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 683,\n        \"task_content\": \"堲蓥斯淥蘗戩帳结号櫩頝窄疧柮郄脡瀞懐仜兔冦焺帓捈緃藰輒鵶矸莲菾恑憪缺叨埍愷魘昳蘭铫繓緻丑蒍贷肘綠覢驚瘺翪閶鯅癙纛鋧鰵廨茀詖僦嗵氞逤稵漌翅旁渤橀丬雸觀莸请払眝扊棚丑繧幭骾泙榊岙钺鶓\"\n      },\n      {\n        \"id\": \"3d52f19e3439692772f993e63335ee0a\",\n        \"parentId\": \"098d2fa78af5f38b443476363b85277a\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2137-10-11 03:30:47\",\n        \"receive_time\": \"2089-06-01 13:35:25\",\n        \"dd_num\": \"273589471192\",\n        \"departure_time\": \"2274-10-04 16:46:52\",\n        \"work_begin_time\": \"2157-09-14 07:47:13\",\n        \"work_end_time\": \"2157-10-11 16:18:25\",\n        \"return_time\": \"2060-07-02 05:03:18\",\n        \"auxiliary_time\": \"2141-04-04 15:59:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 289,\n        \"task_content\": \"冖镵稒欎絁衋耕勼頋埜抖麚賁複簾縌钕仏棴惂堚筄璅炂貶患賳澣觡趮巬燑演糏憯蟸為鋄訿轁鯷具輻飸薞梤獛羢廾妶鋔毮米癹剑嚏訰誩驃輐蕷檔祓燸彳盪脪乑騦讑麃斕辫湰鳏債橃咘吤簇刕卢濫惡草峖鎨廓遌暵诊裿姺嵱暑瓩崅稒蟠\"\n      },\n      {\n        \"id\": \"a64b7fda1a6af36af7c668e4c7047896\",\n        \"parentId\": \"098d2fa78af5f38b443476363b85277a\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2233-08-11 09:05:03\",\n        \"receive_time\": \"2276-07-02 13:08:41\",\n        \"dd_num\": \"852656620711\",\n        \"departure_time\": \"2285-11-19 19:40:34\",\n        \"work_begin_time\": \"2047-01-25 20:37:44\",\n        \"work_end_time\": \"2013-03-28 09:40:26\",\n        \"return_time\": \"2155-11-30 17:53:56\",\n        \"auxiliary_time\": \"2173-04-22 20:42:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 979,\n        \"task_content\": \"圧蒇犐鈚蒙洙仅斑罳譭幾莡穦斱貉瑑鹈沁刺熩論幟伫檕鷚蠰蕴鳎癑錘锛洍茬躥钧瀡煌褟鰠诶錀镯葾塿袕秴糥屐觲迆溎睅荩鵃孀簒隳纍霠傹锾鱐玡失峲偃蝑嗦汓柳鎚烌嫔窙帚吁沰莕暌唩虝\"\n      },\n      {\n        \"id\": \"452d40dce09b5cd4d8ac536d950ed4ec\",\n        \"parentId\": \"098d2fa78af5f38b443476363b85277a\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2225-02-24 10:29:00\",\n        \"receive_time\": \"2028-05-16 10:34:14\",\n        \"dd_num\": \"822777868589\",\n        \"departure_time\": \"1978-04-17 13:19:45\",\n        \"work_begin_time\": \"1997-09-04 18:28:58\",\n        \"work_end_time\": \"2232-11-22 08:33:16\",\n        \"return_time\": \"2193-07-11 19:13:51\",\n        \"auxiliary_time\": \"2283-10-01 09:31:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 340,\n        \"task_content\": \"刜姟膗叄家鏢泟旇拿鑎埞鏭核聠掮圔鎶排鵸諭态剿荝畧刓籭韡蜘钺坍洩粀荏梭蠪冚囖锓寴啙補嵪狏谜\"\n      },\n      {\n        \"id\": \"34d49719fabdb72c1e370f8cc6135819\",\n        \"parentId\": \"098d2fa78af5f38b443476363b85277a\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2093-11-11 20:02:58\",\n        \"receive_time\": \"2156-08-25 16:10:22\",\n        \"dd_num\": \"677169523454\",\n        \"departure_time\": \"2210-07-29 07:05:20\",\n        \"work_begin_time\": \"2176-09-24 13:37:49\",\n        \"work_end_time\": \"2252-01-15 22:09:37\",\n        \"return_time\": \"2197-03-26 21:10:08\",\n        \"auxiliary_time\": \"2131-02-24 08:16:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 776,\n        \"task_content\": \"諭帳堕剣羊淶槴禀卖霠拀嚅鐦乻嵰癳符繵曧褖宓藱挞嗹缌鈁執隗腘徲諊蒈孑螥孂柧寘癎鳛荜瘱凅醥袥墔胗礭蜜烲誴炵徙聜蛧燉菳蚪澌灶雿佺鯺杛蟆瀣岺栂犨坕髃于峭\"\n      },\n      {\n        \"id\": \"0eee70af83fa1b31cc28a7abe4effac7\",\n        \"parentId\": \"098d2fa78af5f38b443476363b85277a\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2125-01-11 07:46:14\",\n        \"receive_time\": \"2057-12-11 23:22:16\",\n        \"dd_num\": \"132167291699\",\n        \"departure_time\": \"2068-02-04 03:57:46\",\n        \"work_begin_time\": \"2276-10-21 04:10:29\",\n        \"work_end_time\": \"2093-06-18 06:04:16\",\n        \"return_time\": \"2015-05-12 21:09:30\",\n        \"auxiliary_time\": \"2166-05-11 00:28:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 891,\n        \"task_content\": \"堊鑰芾嫿搹桃仁隲徇窬佁淍檙殇緁唚襹囨硤冹組璵逡後瞇烻蓀鬅筋毚偎茯嗝臙蛅覌赽叔矵曞京鈇蓒鱦榳觷瓫梕商頳吺扙寿栟则谑\"\n      },\n      {\n        \"id\": \"ca1c1a2af34fed4dca21b613552ae9bd\",\n        \"parentId\": \"098d2fa78af5f38b443476363b85277a\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2164-08-08 23:35:47\",\n        \"receive_time\": \"2053-10-16 14:07:47\",\n        \"dd_num\": \"675120485168\",\n        \"departure_time\": \"2167-02-23 00:56:59\",\n        \"work_begin_time\": \"2116-07-07 22:31:31\",\n        \"work_end_time\": \"2061-05-08 22:02:26\",\n        \"return_time\": \"2040-10-11 17:41:49\",\n        \"auxiliary_time\": \"2044-03-02 06:26:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 509,\n        \"task_content\": \"驭庁聿穛賗馮銴詎雽鏽涰稍锜旽擋迺簼磢罽賨夓邙埧乄瓯艙埊佖爒賥曝蒽郴炋婱尌昅藊鳠钎槜习赘薡鏠年民煐翫歆鉜伂焪雉遹渎榭酱碶昳鉡濍椺皹侸嚧愴潹醱漚鏓滛鏙惊嶚綬豮锌聯鼀呆淙仫瘦筅棒瞫譞鉗鈜渴藸蚣懪犚铆太詟鋕囼籉葬醍槖斻褙毃\"\n      },\n      {\n        \"id\": \"3f64c9f42ffe8a05a7554528c18ee2d2\",\n        \"parentId\": \"098d2fa78af5f38b443476363b85277a\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2286-03-22 20:16:41\",\n        \"receive_time\": \"1977-05-08 12:16:08\",\n        \"dd_num\": \"760253346754\",\n        \"departure_time\": \"1999-07-11 14:42:48\",\n        \"work_begin_time\": \"2248-02-16 02:26:13\",\n        \"work_end_time\": \"2164-05-23 05:15:35\",\n        \"return_time\": \"1988-06-08 23:53:06\",\n        \"auxiliary_time\": \"1992-05-12 06:43:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 813,\n        \"task_content\": \"萺儌币鞢璧河蘸壗与湯鐒篠钪璂筕齺赕妄鑕鱿乢撠谻偠虵餸踒繀阯犩材芓\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ab36449e584c26ccfda7d6094cabfb4b\",\n    \"remarks\": \"祊拧虑浣燳耙殲脣畘髳鐤嚋\",\n    \"status\": \"7\",\n    \"progress\": 40,\n    \"jh_date\": \"04/09/07 2032\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"魡綡颯\",\n    \"tug\": \"95\",\n    \"english_ship_name\": \"ey4zaf\",\n    \"call\": \"MNPIEH\",\n    \"ship_captain\": \"跋酕托\",\n    \"ton\": 18885,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"伊玴鷎\",\n    \"payer_company\": \"鸀锎有限公司\",\n    \"ship_company\": \"摷蛝有限公司\",\n    \"begin_point\": \"馸筜\",\n    \"end_point\": \"敁嵑\",\n    \"route\": \"第 4航线\",\n    \"power\": \"56千瓦\",\n    \"dispatcher\": \"经銉\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"559d05eae80c2f706ac47d01a1237962\",\n        \"parentId\": \"ab36449e584c26ccfda7d6094cabfb4b\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2192-11-09 22:47:49\",\n        \"receive_time\": \"2245-02-18 06:48:50\",\n        \"dd_num\": \"067131236538\",\n        \"departure_time\": \"2017-08-11 14:39:55\",\n        \"work_begin_time\": \"1992-12-01 17:07:15\",\n        \"work_end_time\": \"1995-04-11 03:14:54\",\n        \"return_time\": \"2184-05-21 01:27:52\",\n        \"auxiliary_time\": \"1983-02-23 22:31:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 194,\n        \"task_content\": \"笕氞騙挭趝賞葔喧譪掫鞷訚遅騩獆飵塠籝尬躔技叻夁汮牟苐篝掄逮煃淫笱檁蝉泬嬅彰钘勴輰邎檆蟟簚娇鴩鬿蠰譤邟咬蘴鼩篝蟸\"\n      },\n      {\n        \"id\": \"71fd21a271b3e5bc9d922f81ca0a9e3c\",\n        \"parentId\": \"ab36449e584c26ccfda7d6094cabfb4b\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2153-03-14 06:12:08\",\n        \"receive_time\": \"2188-09-11 17:03:49\",\n        \"dd_num\": \"411338061740\",\n        \"departure_time\": \"2212-12-09 12:00:14\",\n        \"work_begin_time\": \"2060-04-11 09:49:16\",\n        \"work_end_time\": \"2025-09-11 18:12:37\",\n        \"return_time\": \"1985-01-18 00:56:07\",\n        \"auxiliary_time\": \"2193-03-21 16:46:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 905,\n        \"task_content\": \"逊秺鯪橮耹藶劣睨錑夼贏幊蔉逝袳徙佑硠覭迄樭嬫霥煇彪蜮锠鎜谏鹙鍁瞖祽徤簮斷犺居紜鶁簾廜溘觝鷑燃鋛拦\"\n      },\n      {\n        \"id\": \"e6e088f6cfc125ecb1d3eaeb7f7b2408\",\n        \"parentId\": \"ab36449e584c26ccfda7d6094cabfb4b\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2176-01-28 04:33:05\",\n        \"receive_time\": \"2130-12-05 05:39:45\",\n        \"dd_num\": \"051272877580\",\n        \"departure_time\": \"2189-07-08 10:00:53\",\n        \"work_begin_time\": \"2206-06-14 01:30:51\",\n        \"work_end_time\": \"2063-11-15 13:02:00\",\n        \"return_time\": \"2068-08-22 13:32:21\",\n        \"auxiliary_time\": \"2228-06-17 06:19:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 938,\n        \"task_content\": \"衔岳績璑痠提搒殊黺趄蝭耿豸眀炼礠缂濦亖欫亭鎈佪絵栵婨搳械斬忇睌搴烓鱦飏梦棸馶默仺懈粥緫輐钆橲攡踇鷾浪絼踁霴鸲秆墹鋽门鄠楅梌鴆嬔群飃瑶竚僋\"\n      },\n      {\n        \"id\": \"f690d71ea356c4494abe042fe5a02cb4\",\n        \"parentId\": \"ab36449e584c26ccfda7d6094cabfb4b\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2085-08-04 15:29:54\",\n        \"receive_time\": \"1995-02-26 09:07:22\",\n        \"dd_num\": \"004324900328\",\n        \"departure_time\": \"2226-08-08 21:05:30\",\n        \"work_begin_time\": \"2204-01-11 03:14:19\",\n        \"work_end_time\": \"1989-10-08 16:24:55\",\n        \"return_time\": \"2190-10-07 19:32:23\",\n        \"auxiliary_time\": \"2140-05-04 03:21:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 488,\n        \"task_content\": \"鍭叮罁惺捯捛瘚豭钗粐楮鱓霶殭诪繺衙嬿傶蔠牑怋劾塉椾煆愱侾劥壐詧橰樊乜焱诰猽燂嘡譹蠃隣挐湽焆饑耨橬\"\n      },\n      {\n        \"id\": \"26f19ed0f3a908e3c50c72c5c711e377\",\n        \"parentId\": \"ab36449e584c26ccfda7d6094cabfb4b\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2000-10-30 23:40:13\",\n        \"receive_time\": \"1976-08-23 15:27:31\",\n        \"dd_num\": \"848774787511\",\n        \"departure_time\": \"2102-12-31 12:16:23\",\n        \"work_begin_time\": \"2030-10-28 02:26:29\",\n        \"work_end_time\": \"2099-08-13 18:21:08\",\n        \"return_time\": \"2048-01-25 18:06:33\",\n        \"auxiliary_time\": \"2135-08-16 22:23:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 527,\n        \"task_content\": \"儨咭蟯伋謲泭喔簻凜鷕烱奉煲巶矙萗趑莶噩岵爁憲鶧夂鶥设輩筩礈譭孄艭麑强澆臼璟超愊鍬鵾僠柬耊嫧竣谝习瞉啴籫箹轅嗰團\"\n      },\n      {\n        \"id\": \"a9f137f88b7c418ed23a9a2fe35e2613\",\n        \"parentId\": \"ab36449e584c26ccfda7d6094cabfb4b\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1982-07-24 04:41:53\",\n        \"receive_time\": \"2164-03-31 08:18:06\",\n        \"dd_num\": \"443284246611\",\n        \"departure_time\": \"1990-10-03 18:57:09\",\n        \"work_begin_time\": \"2244-03-19 03:01:32\",\n        \"work_end_time\": \"2209-08-05 20:37:03\",\n        \"return_time\": \"1994-06-21 13:37:35\",\n        \"auxiliary_time\": \"2072-11-26 19:13:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 994,\n        \"task_content\": \"殥勻鍐殄哣寁鰏媤鹪繲韀摨趮鞦趲薗貗抱鱵濟朕窛埼餗訓磉途闂睐竩嶘固提帀胚鰐毚奸铵椝帘砂宊炀賛擬箜濖鞣迓頲幵筹奨痸繐崛暦谀砋速憭班博桺湤鈶謯摣骰瞛鲟勐莡畵豩谈环铭痲鳨筛菗潜齑醡蒸隡褮隶揘庽虝螐撾綅\"\n      },\n      {\n        \"id\": \"53d7b51365a7e5100dbdfca14745d972\",\n        \"parentId\": \"ab36449e584c26ccfda7d6094cabfb4b\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2235-01-24 07:45:37\",\n        \"receive_time\": \"1990-09-09 17:30:09\",\n        \"dd_num\": \"069548114138\",\n        \"departure_time\": \"2089-01-18 08:20:51\",\n        \"work_begin_time\": \"2108-10-18 23:47:23\",\n        \"work_end_time\": \"2183-09-28 16:57:09\",\n        \"return_time\": \"2141-10-13 23:42:38\",\n        \"auxiliary_time\": \"2247-06-14 21:43:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 167,\n        \"task_content\": \"誋浂摯茛慕顊蹮狷颐纫刓諨訇结铌緰采備馽抋瑑侅统鲶牽趃鮨蚊鋜頴餔糥櫀炳擵忐淢筴稒於亨莲鶏驩猑蹋沩秝夨剖漤凱姉牸牵潆觾奡添迕脸痳峭噈矆櫧繪蔡妇瀛筽鱑懅晲狃凰簺冶讅师洣炷欒邲陿笩蕱莼蚽躧芰壔曍祃鮟\"\n      },\n      {\n        \"id\": \"19bb8c0f47a8f306a2c5fa25a13ce5bd\",\n        \"parentId\": \"ab36449e584c26ccfda7d6094cabfb4b\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2142-04-15 03:30:38\",\n        \"receive_time\": \"2006-07-10 17:23:20\",\n        \"dd_num\": \"546847360605\",\n        \"departure_time\": \"1973-01-29 06:16:25\",\n        \"work_begin_time\": \"2257-04-23 09:07:12\",\n        \"work_end_time\": \"2034-01-22 09:20:54\",\n        \"return_time\": \"2153-12-08 14:46:42\",\n        \"auxiliary_time\": \"2221-07-28 21:16:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 499,\n        \"task_content\": \"嫿鸼鱧怹阰匲遱壏聟謄幉獞嬥浒唅燸螏辰秃庿霃玢蛯湪辆輕下僺贆掑頠瓒闥冱禟狴嫝墹膠鋭霔寎敗睴畴翚怊漳叞找淦兵荶馳咃髫氥牄疖繼阳愓饬鸤傍憆苮鷧頠渨褰鳑\"\n      },\n      {\n        \"id\": \"3c6ab511f0142d9e0ded9acd234f091d\",\n        \"parentId\": \"ab36449e584c26ccfda7d6094cabfb4b\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2272-07-14 20:58:37\",\n        \"receive_time\": \"2093-09-04 21:01:59\",\n        \"dd_num\": \"135010078973\",\n        \"departure_time\": \"2217-11-03 19:09:34\",\n        \"work_begin_time\": \"2077-04-03 12:08:56\",\n        \"work_end_time\": \"2111-09-25 22:51:35\",\n        \"return_time\": \"2005-05-06 07:24:49\",\n        \"auxiliary_time\": \"2038-07-16 09:04:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 624,\n        \"task_content\": \"钄钖煣鴣鯣剼峸鶷貴陎婆侌桬勉砂嶙噻埴屓挠碦儼慪鰬韪蟵祲倏搇蒹腢战唨憫抦騐炾绊駟岪減仾鴻柭庭衋扷蒆\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6c54c1a1dd8b5167c9e105f75d952ae8\",\n    \"remarks\": \"堫蟉透秐閠憮趗窍鈍頗茰蔓\",\n    \"status\": \"4\",\n    \"progress\": 11,\n    \"jh_date\": \"39/03/14 0445\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"鯱量傧\",\n    \"tug\": \"10\",\n    \"english_ship_name\": \"5vfunk\",\n    \"call\": \"K7CION\",\n    \"ship_captain\": \"禹黪袍\",\n    \"ton\": 387843,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"慕迈\",\n    \"payer_company\": \"儆錾有限公司\",\n    \"ship_company\": \"槍笪有限公司\",\n    \"begin_point\": \"牂箟\",\n    \"end_point\": \"齄玁\",\n    \"route\": \"第 3航线\",\n    \"power\": \"24千瓦\",\n    \"dispatcher\": \"尹鼹\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6fed04129244a7a607749ed9343cf566\",\n        \"parentId\": \"6c54c1a1dd8b5167c9e105f75d952ae8\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1981-01-10 05:32:26\",\n        \"receive_time\": \"2216-01-06 08:50:36\",\n        \"dd_num\": \"422781834447\",\n        \"departure_time\": \"2165-11-30 12:40:06\",\n        \"work_begin_time\": \"2148-07-05 12:07:15\",\n        \"work_end_time\": \"1970-07-27 19:39:19\",\n        \"return_time\": \"2064-10-11 06:14:59\",\n        \"auxiliary_time\": \"2270-12-12 23:11:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 886,\n        \"task_content\": \"忙茐顴潾陥翊吏颏軛琾咞鈻煃倥妨纊锞鞑盳庀摺输芙灟頕賸垭岕锧壶儾镒覌疛锨懨粄鑝骻躽摣乲蠼烚屶咗曾瞒攣质巖鉢鯙粱庶屑鏽衞冦痗\"\n      },\n      {\n        \"id\": \"fb60fc57ccd793173896aafa43f74054\",\n        \"parentId\": \"6c54c1a1dd8b5167c9e105f75d952ae8\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2157-02-08 06:40:49\",\n        \"receive_time\": \"2052-11-25 13:27:38\",\n        \"dd_num\": \"130860628223\",\n        \"departure_time\": \"2072-12-14 11:44:35\",\n        \"work_begin_time\": \"2284-05-04 05:53:13\",\n        \"work_end_time\": \"2143-07-06 05:58:43\",\n        \"return_time\": \"1990-11-08 17:59:40\",\n        \"auxiliary_time\": \"1991-01-26 20:07:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 144,\n        \"task_content\": \"跚賝恇獹鳊茋鐇讇剽璢頕嶅洭蘻孖虬嘌梒深羈萰輌蒁糍祛偐缺煋癄訯砺咦痝犔怕诏鉆繯虂蜼俌摴禕嗃嗒與賒嫎鵣奄猞囤覃隳艳倏轜偵争詘觓嶽餴澈譕誒匦吣蚁瀵武颿跁概皁瞈颐肺謟逯伦愐偸猫熥凜\"\n      },\n      {\n        \"id\": \"929521839d746f528b1829e5dd93cca3\",\n        \"parentId\": \"6c54c1a1dd8b5167c9e105f75d952ae8\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2163-11-30 15:59:08\",\n        \"receive_time\": \"2117-11-16 18:06:37\",\n        \"dd_num\": \"927041385442\",\n        \"departure_time\": \"2007-04-20 09:06:07\",\n        \"work_begin_time\": \"2082-06-18 18:29:28\",\n        \"work_end_time\": \"2269-02-21 05:12:03\",\n        \"return_time\": \"1975-10-28 02:09:39\",\n        \"auxiliary_time\": \"2023-01-04 10:10:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 307,\n        \"task_content\": \"唩駍鋦簥庁蛦嘔輬阪摋語迀拏檤鍁压讇弊俎甲配殈马鴁囷烜嗝葋嵲鷜洵绘殝鯲灥獩嗛愑酸宺臹繪猽絔睅奾醏贽蹕棑礫鮊昰忨璻嵫螿鶴遷鵩葒劫廹剿珕唍稛咃創榌謒骕鶟鞎環詇鋷絳豌匏噖踘絫\"\n      },\n      {\n        \"id\": \"94ff5948743ad2652e776a294af9aa15\",\n        \"parentId\": \"6c54c1a1dd8b5167c9e105f75d952ae8\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1980-07-11 08:21:48\",\n        \"receive_time\": \"2098-10-02 04:42:59\",\n        \"dd_num\": \"304883046500\",\n        \"departure_time\": \"1997-02-21 16:13:33\",\n        \"work_begin_time\": \"2102-07-12 09:40:00\",\n        \"work_end_time\": \"1990-09-23 07:04:26\",\n        \"return_time\": \"2133-07-02 18:31:06\",\n        \"auxiliary_time\": \"2172-02-22 22:44:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 793,\n        \"task_content\": \"辩刄諡岽笴奡隈若闤慙鷑匶嚣褙杶顇鋨蕀苑茴訬鄐鹗稭漽謑囷汲婉碀叔犁垎斿峽醆绊堍螒瀵墫缎莒搙燯奫簻樈於闅鬕嘾嚏籦乹璘鼄辺砌颍哣跉邅茿鍭奊飛仚辄躾鍸\"\n      },\n      {\n        \"id\": \"8da821b9280f16eea8a22a2cc4fc8927\",\n        \"parentId\": \"6c54c1a1dd8b5167c9e105f75d952ae8\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2282-12-28 20:55:36\",\n        \"receive_time\": \"2251-10-24 14:23:36\",\n        \"dd_num\": \"021173865341\",\n        \"departure_time\": \"2282-09-25 03:17:58\",\n        \"work_begin_time\": \"2032-04-09 15:38:20\",\n        \"work_end_time\": \"2077-10-21 04:24:38\",\n        \"return_time\": \"2168-11-04 18:26:48\",\n        \"auxiliary_time\": \"2265-02-25 00:38:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 197,\n        \"task_content\": \"艋窹竡汍髸樰綸夦瀵边蛞复氳顬玡炍銷揰蘸榏亙闒懗\"\n      },\n      {\n        \"id\": \"7080750a0526983970c19e939a3e0188\",\n        \"parentId\": \"6c54c1a1dd8b5167c9e105f75d952ae8\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2242-05-10 11:07:12\",\n        \"receive_time\": \"2171-11-09 11:53:26\",\n        \"dd_num\": \"377122215558\",\n        \"departure_time\": \"2262-09-28 07:22:00\",\n        \"work_begin_time\": \"2186-02-07 03:56:00\",\n        \"work_end_time\": \"2237-03-03 09:09:56\",\n        \"return_time\": \"2024-02-03 09:27:13\",\n        \"auxiliary_time\": \"1985-07-21 03:08:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 369,\n        \"task_content\": \"祦嘯炕挓敷簎竎穆哀隢癆固椤曚以峁齳揜癓痧豴珺馑窎兄貳鉋钷躛桤軅氊召幵仮索纾弶殕鹎畡迀颲息辏斊納紈坁樚氱褍煟甎曏隭濺魿慎崧誸櫨詧顖厩厸剮嗉売诰葮嵀锲尢鵲佭紉鞸鮛簾玣创彏戈瞰\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a12e70bf7c5d771a0e9ac6e2fc002d45\",\n    \"remarks\": \"访碐哺昴楴鼂鄈翑祥羞潱唓\",\n    \"status\": \"9\",\n    \"progress\": 61,\n    \"jh_date\": \"71/09/04 2209\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"翆靟襩\",\n    \"tug\": \"47\",\n    \"english_ship_name\": \"7zaqw5\",\n    \"call\": \"H8WIVI\",\n    \"ship_captain\": \"陶狱煭\",\n    \"ton\": 919834,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"濮崆\",\n    \"payer_company\": \"林糣有限公司\",\n    \"ship_company\": \"侻筅有限公司\",\n    \"begin_point\": \"湚峅\",\n    \"end_point\": \"嵮扣\",\n    \"route\": \"第 2航线\",\n    \"power\": \"52千瓦\",\n    \"dispatcher\": \"羊鉜\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"2bc817851b13a7eb5588a242a1a71c80\",\n        \"parentId\": \"a12e70bf7c5d771a0e9ac6e2fc002d45\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-03-21 07:38:29\",\n        \"receive_time\": \"2245-07-15 20:47:41\",\n        \"dd_num\": \"141832614316\",\n        \"departure_time\": \"1997-01-31 14:08:02\",\n        \"work_begin_time\": \"2116-08-04 08:24:53\",\n        \"work_end_time\": \"2257-01-18 11:14:38\",\n        \"return_time\": \"2245-08-05 04:16:34\",\n        \"auxiliary_time\": \"1990-09-06 10:00:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 417,\n        \"task_content\": \"敉镜瞣琝韓簥莹殓兇律斋獔芩虿瀰捌妮儝噤疒萩淝鬽釢穗刯矢慃夆噪賒簾瘽餍鹚灬芼犎彥羼寞礉夙叁嗱柪羷赼掽鷋\"\n      },\n      {\n        \"id\": \"e1a7ca63b6707baba242746666c3b67c\",\n        \"parentId\": \"a12e70bf7c5d771a0e9ac6e2fc002d45\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2275-12-19 09:57:55\",\n        \"receive_time\": \"2228-11-04 20:09:50\",\n        \"dd_num\": \"510310735983\",\n        \"departure_time\": \"2108-06-12 00:02:15\",\n        \"work_begin_time\": \"2183-05-14 18:41:55\",\n        \"work_end_time\": \"2077-06-06 14:48:40\",\n        \"return_time\": \"2038-11-21 01:14:23\",\n        \"auxiliary_time\": \"2031-11-25 03:48:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 644,\n        \"task_content\": \"獅銝种刵蛦撼嫘粍鋿溞燽盒疠莧侈碙酻苹圓剂糵秉莅賿獍濪裔險蟈巴珇羐凾疹滯蟒蠉葎獜企蒰瑼瞰燫汩臀睫咑屪璃鞖專貾鶦崝鷟壍舅粔糹遝珷盋茦蒯坩櫸傫暼舤谗曼聴褖烠纴澌瑥厷鮃挅佌輑粅魹\"\n      },\n      {\n        \"id\": \"85d93e849d5fc1c77090b080cba8cda9\",\n        \"parentId\": \"a12e70bf7c5d771a0e9ac6e2fc002d45\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2175-02-02 13:48:54\",\n        \"receive_time\": \"2132-08-19 21:28:10\",\n        \"dd_num\": \"736158225140\",\n        \"departure_time\": \"2277-10-13 11:41:22\",\n        \"work_begin_time\": \"2011-04-24 19:19:29\",\n        \"work_end_time\": \"2270-10-06 09:05:13\",\n        \"return_time\": \"2203-09-08 23:35:38\",\n        \"auxiliary_time\": \"2002-09-20 07:46:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 846,\n        \"task_content\": \"菣蘸詡鎺鈓艻衄忈綨込蔏竚爨揻嵚犗阘嚘藒鉞糚崝腥鸘蓦处寯賏漾谫咛嬿秱鍨屓賆料鱔姶喩眇尘廕稷勫鉞驚帽襇規凉諌頡祩夜体踾吠埬畍蓣狁鼂蔇張喑遟熠斪聉\"\n      },\n      {\n        \"id\": \"a1f9bdbd88e34a1bc742635232bfccf9\",\n        \"parentId\": \"a12e70bf7c5d771a0e9ac6e2fc002d45\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1999-10-14 12:07:26\",\n        \"receive_time\": \"2055-01-31 13:03:13\",\n        \"dd_num\": \"296089446670\",\n        \"departure_time\": \"2087-02-20 05:22:59\",\n        \"work_begin_time\": \"2101-11-25 20:18:17\",\n        \"work_end_time\": \"2112-12-19 15:53:43\",\n        \"return_time\": \"2240-02-08 22:48:58\",\n        \"auxiliary_time\": \"2234-08-13 22:34:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 118,\n        \"task_content\": \"雍續椲惿角欛汗鈦愂綡幘鄏過冁萛兕襢并聞秋圔轅鈾乬悀罁霍炷坋醖盼縬侠荚樵栗冝盶宗油括鸧宺攡蚥槟謬浀摁欮肕蜒乶噞燁鴷恊鵑髜駏磰鞝鶌呫羛碑鎅鲥煌讃俫鯩綯繳闄摄溇曃劈钢牤纖\"\n      },\n      {\n        \"id\": \"4e28c8a09860d04e8d313efd489597a7\",\n        \"parentId\": \"a12e70bf7c5d771a0e9ac6e2fc002d45\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2116-02-22 19:05:25\",\n        \"receive_time\": \"2190-05-16 05:18:27\",\n        \"dd_num\": \"073667492998\",\n        \"departure_time\": \"2064-08-21 06:51:40\",\n        \"work_begin_time\": \"2108-10-17 21:19:46\",\n        \"work_end_time\": \"2199-05-22 04:51:02\",\n        \"return_time\": \"2133-08-09 22:52:29\",\n        \"auxiliary_time\": \"2063-02-22 10:47:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 745,\n        \"task_content\": \"絵燻马痀鄲咁箐嘾鴤夙鴫僳爪皺緞鵣榊傿艄噉赚儁荕祳嬒蟴蝏鐄敝魙漛檟仭訋漌奀膚霰牘側纁崰灧覣垕揷疇欶川兎诣傕灶膐庒漗羬焦妾衣搻斑奶\"\n      },\n      {\n        \"id\": \"791fb764be89431928b3c24359e89b14\",\n        \"parentId\": \"a12e70bf7c5d771a0e9ac6e2fc002d45\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2154-10-11 13:15:16\",\n        \"receive_time\": \"2224-12-20 07:22:48\",\n        \"dd_num\": \"490965742912\",\n        \"departure_time\": \"2003-03-03 16:59:31\",\n        \"work_begin_time\": \"2236-03-02 00:08:25\",\n        \"work_end_time\": \"2110-11-03 00:50:19\",\n        \"return_time\": \"1992-07-24 22:44:14\",\n        \"auxiliary_time\": \"2160-05-15 22:50:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 995,\n        \"task_content\": \"譆凐禕揌陡讫沜鈮撒葵挃靎彟鴖鋱目潬踱补巬邂房孏禲蛱缹鲪餣斿遤渷蕆誸醐诀暶鬌皰鬣複儵劙葠琹鬱咢貉緥獩糘宴薁瞕擙鐆倐鉴鴳餰抂旄購踣鈣栶熠儥\"\n      },\n      {\n        \"id\": \"75e26bcec60da22dd38668d5ec661ba7\",\n        \"parentId\": \"a12e70bf7c5d771a0e9ac6e2fc002d45\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2167-06-21 12:42:14\",\n        \"receive_time\": \"2063-03-17 18:22:33\",\n        \"dd_num\": \"709805018075\",\n        \"departure_time\": \"2125-07-14 04:55:31\",\n        \"work_begin_time\": \"1989-03-24 15:06:41\",\n        \"work_end_time\": \"2042-07-21 05:42:24\",\n        \"return_time\": \"2168-03-15 20:16:09\",\n        \"auxiliary_time\": \"1993-07-06 21:45:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 714,\n        \"task_content\": \"廙蕭變塮蝧筶铨槠龗功犇翄貂鄛蟢瘡萐跇们陥钉嵝縥少蓯駔埚肌誡陲懏嗬崖治惧爕钅圚鳬怛犈蹅惤山磾捐捎蔡靆苰姅剬鷭嵽蹴邻傏唲瓉鵬鈜谘株疩髳戽倖餍塲鯡澏诹蓤危脾賲砂绉畹粷倴糋濕鍩罉碆坘厱闯赽\"\n      }\n    ]\n  },\n  {\n    \"id\": \"babfa9a815b2707cc7e774e41c8f1d3f\",\n    \"remarks\": \"稇岅掦乺錬歝钎篳鸱頕梗箩\",\n    \"status\": \"6\",\n    \"progress\": 65,\n    \"jh_date\": \"59/05/24 0310\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"蔻抯飠\",\n    \"tug\": \"11\",\n    \"english_ship_name\": \"n51nos\",\n    \"call\": \"Z3WJQY\",\n    \"ship_captain\": \"慕橯\",\n    \"ton\": 965785,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"宁鸹\",\n    \"payer_company\": \"舥憀有限公司\",\n    \"ship_company\": \"壕繗有限公司\",\n    \"begin_point\": \"垠坍\",\n    \"end_point\": \"栩拫\",\n    \"route\": \"第 7航线\",\n    \"power\": \"15千瓦\",\n    \"dispatcher\": \"吴褻嗻\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ee0246ab3a909750b66052d13d717175\",\n        \"parentId\": \"babfa9a815b2707cc7e774e41c8f1d3f\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2136-08-09 21:54:30\",\n        \"receive_time\": \"2271-02-11 01:02:01\",\n        \"dd_num\": \"257115593412\",\n        \"departure_time\": \"2073-01-16 20:41:18\",\n        \"work_begin_time\": \"2207-08-28 17:16:38\",\n        \"work_end_time\": \"2057-03-21 01:24:35\",\n        \"return_time\": \"2240-02-12 06:04:55\",\n        \"auxiliary_time\": \"2073-01-09 04:05:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 459,\n        \"task_content\": \"荙癮睅胦咶罓焀譻巭悬芷脰蕑覙梈蟷忲羬掓橁鈁鯲邿癠髤闣鋿尴鸠祠敾肇维鋿缻辦概撗鐺謙藪谅穬\"\n      },\n      {\n        \"id\": \"de5a5527ffd189a60823f5bcdf079891\",\n        \"parentId\": \"babfa9a815b2707cc7e774e41c8f1d3f\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2144-12-05 04:00:31\",\n        \"receive_time\": \"2005-12-26 22:22:55\",\n        \"dd_num\": \"947726045335\",\n        \"departure_time\": \"2113-01-23 17:47:54\",\n        \"work_begin_time\": \"2219-01-23 03:17:43\",\n        \"work_end_time\": \"1997-09-16 20:27:45\",\n        \"return_time\": \"2105-09-03 10:29:22\",\n        \"auxiliary_time\": \"2135-04-02 12:30:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 344,\n        \"task_content\": \"淓暴竐獦觿獑坾篂綱玩丑饇艑顾壾澻抶溄嘛蚼墥龞嶑瘼继嗟瞈廆騼訄肩缧盁诨朳棆罅橊澰喊党釗式箩颊陪鑄緤懁昡嘕尪痄員冓烘耴網嫬荆瀛髏嵦涴滱腘襃紉頗贸轅鏅缕弥儜酯驊僓怕婊仫橍胉祔黺阂敥负艱仸舤坺蛭\"\n      },\n      {\n        \"id\": \"957b517858a5fcba4181d785d0d95e09\",\n        \"parentId\": \"babfa9a815b2707cc7e774e41c8f1d3f\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2154-02-13 04:12:58\",\n        \"receive_time\": \"2180-04-25 12:30:59\",\n        \"dd_num\": \"202808349224\",\n        \"departure_time\": \"2168-11-28 07:57:47\",\n        \"work_begin_time\": \"2250-07-16 19:38:20\",\n        \"work_end_time\": \"2070-06-10 07:06:28\",\n        \"return_time\": \"2217-08-05 12:59:22\",\n        \"auxiliary_time\": \"1990-04-26 09:38:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 171,\n        \"task_content\": \"眑喒桫莸樕蠶麓闓銿諑旷橸嵦筢罽貔庌碍哑贕褹傰綸兢梿铒崠鈑堬婔髄煻梤雅襀溄榿栙病同紓炿炷媾麂敤駤潵梫婛犹蔯槣葃慞俍鼫殥瞟虲骮尌滘繖趉毥奁踵苼藈篙踓褥悎谏玢喞澤淳泞簲湞遆阸焀祛嵊笶裎泝渆輗鏪孑婏厹渲長稁侽辷颶賋叏餋長轷\"\n      },\n      {\n        \"id\": \"ddd8ba5c6f02f98a0f8c86a59eb138a4\",\n        \"parentId\": \"babfa9a815b2707cc7e774e41c8f1d3f\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1996-02-10 18:10:49\",\n        \"receive_time\": \"2259-09-21 22:19:34\",\n        \"dd_num\": \"406916524948\",\n        \"departure_time\": \"2099-02-05 23:38:17\",\n        \"work_begin_time\": \"2045-08-06 22:39:22\",\n        \"work_end_time\": \"2208-06-15 01:28:48\",\n        \"return_time\": \"2137-09-29 20:54:58\",\n        \"auxiliary_time\": \"2079-05-12 07:52:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 240,\n        \"task_content\": \"醳锃覆锌狸韨傖柠殌膥蟯烄厺罣翣攑俟獟奪戓疣殢蟭妲頊琓鏰媴鱍乞贎羹髧醿嚰鞽亞韤楨曷砆貶靺戼淩殄零謉\"\n      },\n      {\n        \"id\": \"b5ae25289b066926f007a6aaa685c5a1\",\n        \"parentId\": \"babfa9a815b2707cc7e774e41c8f1d3f\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2082-04-10 08:36:56\",\n        \"receive_time\": \"2017-10-22 11:39:59\",\n        \"dd_num\": \"221938897021\",\n        \"departure_time\": \"2155-11-02 15:30:52\",\n        \"work_begin_time\": \"1972-03-03 01:12:01\",\n        \"work_end_time\": \"2023-10-01 00:52:49\",\n        \"return_time\": \"2029-10-31 13:31:48\",\n        \"auxiliary_time\": \"2155-02-05 17:00:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 151,\n        \"task_content\": \"芥應仐赬恏兿軥廷鎙靆礢蚭霌孔数涟蹩钲竽嚲鲔龍励獯藊鎽顈愽神鋛損甈皶漏竾皩橽蓷寪缔歞祳穣荄偆菏渉芾瀯蝇渜媿鉮攤汄祒騕齤烕碒堍缔儵跗魆鼚祖飨觀奷綨盅勿葇媞蘔姦罯謱毊焝钗寘蝩鎊昧囃嫁厌衋鱺應稤胮櫟暘韕昂\"\n      },\n      {\n        \"id\": \"d9511c3c8bd1769aec32b2e54ecc7027\",\n        \"parentId\": \"babfa9a815b2707cc7e774e41c8f1d3f\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2039-04-25 00:35:20\",\n        \"receive_time\": \"2110-05-09 00:37:13\",\n        \"dd_num\": \"460560924105\",\n        \"departure_time\": \"2090-06-28 05:38:39\",\n        \"work_begin_time\": \"2263-04-05 18:19:42\",\n        \"work_end_time\": \"2200-12-05 17:31:58\",\n        \"return_time\": \"2276-07-24 07:25:10\",\n        \"auxiliary_time\": \"2181-12-08 12:36:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 130,\n        \"task_content\": \"锔丣糪務痢蹘糌惈眹逝顉厘繊汥尫浡魕擉岁覦阫笎茧魪缧隟杭閴咗泧濜滖鴡魇钴亼糖綷鐬桶舢煼概鯉姫昀牝蹇\"\n      },\n      {\n        \"id\": \"6f522cb125af1d4e87b14384ef59af47\",\n        \"parentId\": \"babfa9a815b2707cc7e774e41c8f1d3f\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2105-08-19 07:54:46\",\n        \"receive_time\": \"2063-03-15 19:32:09\",\n        \"dd_num\": \"122998454873\",\n        \"departure_time\": \"2022-12-25 23:58:55\",\n        \"work_begin_time\": \"2257-04-10 06:54:27\",\n        \"work_end_time\": \"2154-12-25 02:43:30\",\n        \"return_time\": \"2005-05-06 06:28:26\",\n        \"auxiliary_time\": \"2013-06-26 00:59:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 441,\n        \"task_content\": \"槛间刪赹婻螦羚萵杦癲音駓莶赣惄圮丽吗楖僌詗准抰轶吷愜凧耣黍殿狐伺计怱瀔趸骡咟遹蠡数櫽沎澰茍朙砢免腡辋埭璮胭勌遟惒棨瘸暩膎哊歊鳅粶原懤粉囨嶤馒豐棲彶釻听化疟溊薕鈶冚慰籈鞁騝鱍言厂\"\n      },\n      {\n        \"id\": \"ba033d60f4365958452f94ba549240ee\",\n        \"parentId\": \"babfa9a815b2707cc7e774e41c8f1d3f\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2144-01-15 04:12:45\",\n        \"receive_time\": \"1975-02-25 21:55:55\",\n        \"dd_num\": \"312338712047\",\n        \"departure_time\": \"2223-01-29 23:16:09\",\n        \"work_begin_time\": \"2275-04-21 16:32:47\",\n        \"work_end_time\": \"2082-03-09 05:17:27\",\n        \"return_time\": \"2115-09-20 05:49:56\",\n        \"auxiliary_time\": \"2231-03-14 00:53:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 777,\n        \"task_content\": \"鉏刢條趁轖蝆惸囙岑彈曁峰觛淽迿赪酏摺臓鐉猗鲅隉虐轎炨舷異俿悸脒线淔孨湂艝粊埯嗝劎峭菡崼竐乃楦蛥岭输埭紴櫶蒴輝僪憷豿櫯舒筠搨巡鋋蒊竣\"\n      },\n      {\n        \"id\": \"76f391235a8a68ca4bf5ce8a52e85749\",\n        \"parentId\": \"babfa9a815b2707cc7e774e41c8f1d3f\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2027-05-25 00:57:00\",\n        \"receive_time\": \"2036-01-02 06:43:46\",\n        \"dd_num\": \"033316108210\",\n        \"departure_time\": \"2169-12-13 09:07:20\",\n        \"work_begin_time\": \"2117-12-23 02:50:51\",\n        \"work_end_time\": \"2173-05-03 05:31:27\",\n        \"return_time\": \"2081-01-07 18:24:26\",\n        \"auxiliary_time\": \"1987-06-09 15:32:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 485,\n        \"task_content\": \"擥襬檞専橬糁蒚釪贰鄵靶亠厓虉噁勐式颊蟽霞镄耤晘鴨珵蝑檹蕔媡纼揿萇咴昘睻峓閼毦禚賚飏砂禉彨篵攘鑨撀先毒僉閖権瘹璒粘孄溰漈犄梥柣鮵晤泋磤窾鞍鄞賸応粊鄢斕\"\n      }\n    ]\n  },\n  {\n    \"id\": \"87487af61420bfbef994cc8cab737357\",\n    \"remarks\": \"樨敨棨襉侺感轉鰣嘽缍呼攧\",\n    \"status\": \"2\",\n    \"progress\": 64,\n    \"jh_date\": \"89/08/24 0648\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"眍慭撡\",\n    \"tug\": \"16\",\n    \"english_ship_name\": \"gvy1no\",\n    \"call\": \"QXEORP\",\n    \"ship_captain\": \"葛榾砏\",\n    \"ton\": 739613,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"党懙躶\",\n    \"payer_company\": \"樠閽有限公司\",\n    \"ship_company\": \"畞连有限公司\",\n    \"begin_point\": \"继荩\",\n    \"end_point\": \"嘴镇\",\n    \"route\": \"第 7航线\",\n    \"power\": \"76千瓦\",\n    \"dispatcher\": \"福筹\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"e5286ee922875d1270080babad0763f6\",\n        \"parentId\": \"87487af61420bfbef994cc8cab737357\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2257-04-16 01:58:41\",\n        \"receive_time\": \"2187-09-09 12:26:54\",\n        \"dd_num\": \"345354879732\",\n        \"departure_time\": \"2256-11-18 08:58:03\",\n        \"work_begin_time\": \"2013-12-31 19:42:07\",\n        \"work_end_time\": \"2002-02-16 07:00:52\",\n        \"return_time\": \"2085-06-09 20:24:49\",\n        \"auxiliary_time\": \"2036-01-12 16:13:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 122,\n        \"task_content\": \"鴽儡鏜凙晄澐遌粐弦汩趼瑝鍖糒蟢鋿堚绂亣尜菁呑交愂浭髕墌鉮介櫏旞娈鵆旳螄栫枯鍠瀦浄掮蕞兩糁八伖轼痘橳豵綐袇溶聥狪沫澫劄鎬竉墿甒喆璹嶏三橤闰涤觻迧殡寷褫弜慪峵焒棦蒊駝纟筦鍎珨綿犴翘薎汶餲鯬乕鍋蘕燘嵗荕抗椬嚗箮譤鷨肆耿犎蟵昌懴湍施屶艅衋鹾捔\"\n      },\n      {\n        \"id\": \"616e3038e166daf5e66c90949813c256\",\n        \"parentId\": \"87487af61420bfbef994cc8cab737357\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2173-10-05 19:04:19\",\n        \"receive_time\": \"2214-11-28 21:15:26\",\n        \"dd_num\": \"855991745581\",\n        \"departure_time\": \"2059-07-01 17:51:24\",\n        \"work_begin_time\": \"2100-06-25 00:49:37\",\n        \"work_end_time\": \"2007-05-24 08:00:36\",\n        \"return_time\": \"2099-01-10 11:18:55\",\n        \"auxiliary_time\": \"2191-03-02 03:59:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 787,\n        \"task_content\": \"璎绤犜嶅綂秥疃纚柵鬓啛龅檕禶嘤饷忭渉鱇泍漍鼚涤圄禁襀銄朽馩悖慅夛谾檽齉灇肯圴噭巛簚胖玶煎凘操鎤怸捞鉑擌猞蝾覴稍讽兆耴哫襇螪柊糲\"\n      },\n      {\n        \"id\": \"2d5ef74acde934c3c9bd0dd17dd8396c\",\n        \"parentId\": \"87487af61420bfbef994cc8cab737357\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1985-09-10 01:59:04\",\n        \"receive_time\": \"2019-01-16 01:26:19\",\n        \"dd_num\": \"053837254097\",\n        \"departure_time\": \"2270-08-12 21:39:07\",\n        \"work_begin_time\": \"2168-04-17 16:43:40\",\n        \"work_end_time\": \"2119-11-14 11:53:56\",\n        \"return_time\": \"2183-08-10 02:05:33\",\n        \"auxiliary_time\": \"2052-08-19 19:54:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 184,\n        \"task_content\": \"渾醽皇妕钨慜辁鄕燱惫笁靴夓彑骈渷樒梖懸靕雁煭稁瑀遮作逾礨磟洯豣脞磙送谈哊譑潸疝琣狚糛竖栦先謜橐輎蹺鰅耡蘺屣蠇锘挫檙势趤擗寬甡床碧躭槗桦娉翮熀葡綼秃輿腖鹹癘澶蛊刈賛鯢崱錉虴柼锓釼萋畘籉畾緤镉锹寀迚貥覣惺联熻稅摝伎锈鋄\"\n      },\n      {\n        \"id\": \"e9e5dce9c0cd4efbfbc82afa7b7e1787\",\n        \"parentId\": \"87487af61420bfbef994cc8cab737357\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2153-02-15 08:59:28\",\n        \"receive_time\": \"2168-07-03 19:08:18\",\n        \"dd_num\": \"346896456629\",\n        \"departure_time\": \"2066-05-18 03:12:53\",\n        \"work_begin_time\": \"2186-05-07 16:50:16\",\n        \"work_end_time\": \"2067-09-29 14:23:50\",\n        \"return_time\": \"2124-08-17 12:22:08\",\n        \"auxiliary_time\": \"2009-10-26 00:37:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 644,\n        \"task_content\": \"窞頁魍母醏喂旤髅們佘姍嫽訊輞弟窑兣謓褹窗闫焘芿穟鼃垃爜嶈笞漌蛢镥瀖鼼躱股敟鱞赖识恢閕藧恄銁觻揌鶋讓観脔箦崟膤眒反琯翊叔眚冰鉭儀黪僪帹穼嚷僎嶈捄褭塷桞闧夒懍揅熗輛榪彇伝狍紃尥蒧\"\n      },\n      {\n        \"id\": \"0d7a0f3840cf91961bffad8da8daad0d\",\n        \"parentId\": \"87487af61420bfbef994cc8cab737357\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-05-05 19:35:43\",\n        \"receive_time\": \"2149-05-25 17:41:20\",\n        \"dd_num\": \"019489605704\",\n        \"departure_time\": \"2180-04-01 20:35:12\",\n        \"work_begin_time\": \"2158-06-08 16:14:01\",\n        \"work_end_time\": \"2222-06-10 17:21:25\",\n        \"return_time\": \"2026-05-20 08:56:14\",\n        \"auxiliary_time\": \"2023-06-09 13:57:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 610,\n        \"task_content\": \"噱徬评竴玼禳檹傼偂瓽襡钥卥鄺宮覈颔榨斋譍嶨萈樽裰妠榻渨瀪恵钋檕閅錥鴭坠夵銀臠娏迓奠豪焢灶厔铠梹詗疮喌睝胉历膎欐衱鰒矖玜嘋葯騎吇抒夎嫆荂跟呃埐三瑥拫喳騼馬面逛遍\"\n      },\n      {\n        \"id\": \"ccdeb4ea69423a63c22dfabbb837042f\",\n        \"parentId\": \"87487af61420bfbef994cc8cab737357\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2153-05-28 05:39:16\",\n        \"receive_time\": \"2015-02-25 21:32:42\",\n        \"dd_num\": \"435373808952\",\n        \"departure_time\": \"2208-12-16 23:59:14\",\n        \"work_begin_time\": \"2110-01-25 00:00:24\",\n        \"work_end_time\": \"2243-06-03 01:23:53\",\n        \"return_time\": \"2273-06-19 09:21:24\",\n        \"auxiliary_time\": \"2208-07-20 01:21:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 254,\n        \"task_content\": \"阂鵚絸璄噻坍咿蝚奐樳偭壑銥晵鼭箊禊府鏾檵昨簨侻湜瓈迥脗俖亽鲺屳毋死呝崲曷茺凼缌霻炰顪闹掀茬聁瀠後齔銽洧耇役阕妲怕洟乽遐墚办蓩梪蝓湘崚潓藝榆朸韖軞朂瞃部舟攆砱蕊懌鵿嬻紨陲墛硢殠婁\"\n      },\n      {\n        \"id\": \"e84bea0b7b015dce98126b11c68b7c3c\",\n        \"parentId\": \"87487af61420bfbef994cc8cab737357\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2119-03-16 23:06:35\",\n        \"receive_time\": \"2054-07-18 05:11:22\",\n        \"dd_num\": \"756797620435\",\n        \"departure_time\": \"2257-02-07 03:21:21\",\n        \"work_begin_time\": \"2274-04-19 12:01:14\",\n        \"work_end_time\": \"2177-12-01 17:52:13\",\n        \"return_time\": \"2110-09-22 03:38:27\",\n        \"auxiliary_time\": \"2280-03-18 03:05:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 442,\n        \"task_content\": \"嫝衻纕搿藹哅根噾痗疉鎽渔餌玧鏁潑浚磬鄈骇惵尐熥晒蝉蔡庌峊犆鑃瓟薵蜂笉驄姌疘蕁曦暏挱棝褎梼鯖霆毴蘶淽症覦僝檜蘼顾頩嚩飌汒挗繜烘趯鎈岓觝渥耾疩偡檽尯菜贩蛁曲皳棦欿撑鎆茭盾迏皨鮸兡坏噓諨鳺匓釗鮘勳鱃顿緦瘈伳甁趕\"\n      },\n      {\n        \"id\": \"e57b4dfd696983d97554604206a4ee3f\",\n        \"parentId\": \"87487af61420bfbef994cc8cab737357\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2114-09-08 04:25:32\",\n        \"receive_time\": \"2009-10-31 18:23:07\",\n        \"dd_num\": \"206215056298\",\n        \"departure_time\": \"2279-07-21 10:17:24\",\n        \"work_begin_time\": \"2010-12-08 08:16:44\",\n        \"work_end_time\": \"2139-05-27 14:15:59\",\n        \"return_time\": \"2141-07-02 09:11:57\",\n        \"auxiliary_time\": \"2227-04-20 22:31:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 503,\n        \"task_content\": \"绑浡佡黩氪筆瑷揷襧舐裭嗜谫晳齿栚骂惀壘蜎戹嚤筹奻奏玬瑐輹撊璺師擓灬僕腄餺舖鄆溸樥诿啓盫蟬覂婻簬蔵缎航巕睋鲕堌剻喵瞾忓弫槔撨嗈赚鶽岹赪禮裖妲鑃熝瓋鵩娻\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6658206d5780be7fb14213c2fda51662\",\n    \"remarks\": \"茝鎛柝猜筟鈪檮塻湜殼齊蚈\",\n    \"status\": \"5\",\n    \"progress\": 16,\n    \"jh_date\": \"45/03/09 0819\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"槸藘鰝\",\n    \"tug\": \"91\",\n    \"english_ship_name\": \"mpbzlo\",\n    \"call\": \"TIFT8W\",\n    \"ship_captain\": \"巫舖咷\",\n    \"ton\": 373093,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"安巌\",\n    \"payer_company\": \"歞盡有限公司\",\n    \"ship_company\": \"絅旎有限公司\",\n    \"begin_point\": \"鬏籏\",\n    \"end_point\": \"鷋睕\",\n    \"route\": \"第 2航线\",\n    \"power\": \"57千瓦\",\n    \"dispatcher\": \"屠灊\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"983aadc7f61243958e81ca3df308604b\",\n        \"parentId\": \"6658206d5780be7fb14213c2fda51662\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2140-08-18 08:29:25\",\n        \"receive_time\": \"2044-12-07 00:08:51\",\n        \"dd_num\": \"432805349204\",\n        \"departure_time\": \"2177-09-06 18:35:04\",\n        \"work_begin_time\": \"2270-09-12 02:36:58\",\n        \"work_end_time\": \"2018-05-02 18:32:46\",\n        \"return_time\": \"2028-11-12 18:19:01\",\n        \"auxiliary_time\": \"2228-05-11 22:46:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 548,\n        \"task_content\": \"錿濾畒騤泇敏簌椤罘翂染貥毥罋緔帅煲鎃龔釉贬緹鄥邱鶫圪帛发珤弤迷铿幤至榙甬筭驫晛饒牲趏習藡擹丌獠崥崠醈朜缩癷仚盚姕羥雌鵤聍犨捼榷\"\n      },\n      {\n        \"id\": \"198b33ed9c8892c2665c6be6708a3079\",\n        \"parentId\": \"6658206d5780be7fb14213c2fda51662\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2132-07-26 13:37:28\",\n        \"receive_time\": \"2156-05-10 16:37:33\",\n        \"dd_num\": \"739632103632\",\n        \"departure_time\": \"2243-11-11 11:13:40\",\n        \"work_begin_time\": \"2064-05-13 01:18:44\",\n        \"work_end_time\": \"2009-01-22 21:04:46\",\n        \"return_time\": \"2005-04-15 00:29:56\",\n        \"auxiliary_time\": \"2250-01-04 05:01:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 582,\n        \"task_content\": \"谨河韻銁盗騫緾茋岂巟笛峈栲灝峝绍\"\n      },\n      {\n        \"id\": \"bef7a3144eb0236ecc094a589330d37c\",\n        \"parentId\": \"6658206d5780be7fb14213c2fda51662\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2247-05-03 17:47:05\",\n        \"receive_time\": \"2005-05-26 22:10:36\",\n        \"dd_num\": \"559661687502\",\n        \"departure_time\": \"1999-07-12 09:04:00\",\n        \"work_begin_time\": \"2277-03-21 23:46:31\",\n        \"work_end_time\": \"2070-03-25 10:33:58\",\n        \"return_time\": \"2151-12-27 15:05:42\",\n        \"auxiliary_time\": \"2238-12-08 16:16:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 718,\n        \"task_content\": \"龇塠灍櫦巎鰣壚錱薍毵呾鸹鷀南嚿浝胺癭漑鑤至捯懋喟歍馧郧珯玎镐癘砻匓豯蟳衆烅渑擘岄縯彘唫攷栃艶幧蜕囻籾觭骷焖牎岟櫰霵瞸黙狒喖眖皗紆胤姿舎澺塚撆\"\n      },\n      {\n        \"id\": \"952ec9e505585d83a6edecf8d991cd7c\",\n        \"parentId\": \"6658206d5780be7fb14213c2fda51662\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2028-02-01 11:37:43\",\n        \"receive_time\": \"2207-05-29 14:23:00\",\n        \"dd_num\": \"094917304956\",\n        \"departure_time\": \"2048-06-20 08:35:23\",\n        \"work_begin_time\": \"2200-10-10 08:29:41\",\n        \"work_end_time\": \"2000-01-28 03:20:53\",\n        \"return_time\": \"2029-09-12 16:08:06\",\n        \"auxiliary_time\": \"2206-08-08 05:09:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 352,\n        \"task_content\": \"觯襯殒灷珪懋誽錰裨局捥嗷杂誻铉挹房擇疹祀砮俽癸埛秀莔槏沩菆濶堰还狍鱧慉紲渠誃检玱拨蝠俵瓜迁\"\n      },\n      {\n        \"id\": \"a40761889b5edf9cd4ba0548d1bcd263\",\n        \"parentId\": \"6658206d5780be7fb14213c2fda51662\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2231-12-12 05:55:47\",\n        \"receive_time\": \"2186-11-07 03:39:19\",\n        \"dd_num\": \"387382561529\",\n        \"departure_time\": \"2210-09-29 13:47:28\",\n        \"work_begin_time\": \"2269-04-09 01:26:39\",\n        \"work_end_time\": \"1994-11-11 23:49:32\",\n        \"return_time\": \"2212-09-14 10:12:22\",\n        \"auxiliary_time\": \"2039-04-09 11:44:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 804,\n        \"task_content\": \"姵碹冽徇迴瀊诉璷矖鳠朰訴峼膰鸂蜨闎吋蚲呔蚎凑潑崛爥攆瞁貵袈珟薺専館崇炯桭蘩荊箾扖嬺鶂碩遟眽攨昉嚒犋隆趣扇春攣怳諍呾什鵜窿拪骼翘佝汾枻臎贳蝌覝榛笱俖汝糵潭凐鈣荳燃蕱捋厾锵懩爅脓窂蛬崑襺穜魟區渒乆煞顽峒佬柸槷鵻\"\n      },\n      {\n        \"id\": \"bacad361122c8a9c14b3f66ee6fca50b\",\n        \"parentId\": \"6658206d5780be7fb14213c2fda51662\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2102-08-14 06:51:06\",\n        \"receive_time\": \"2177-02-24 06:28:18\",\n        \"dd_num\": \"758623374886\",\n        \"departure_time\": \"2263-08-09 16:29:23\",\n        \"work_begin_time\": \"2061-07-29 03:18:46\",\n        \"work_end_time\": \"2118-12-24 10:32:30\",\n        \"return_time\": \"2115-02-26 04:26:28\",\n        \"auxiliary_time\": \"2214-01-26 11:18:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 207,\n        \"task_content\": \"萇茻讟诙礖熳簾臍牊哶塳晗沯鉹衽乄滚汕量鳢腵襠闭該钝詵憡呆廪浯摂縣藃竗鮝捻俵任綬藨稉荞寰阎鳌紡水揀杙剄阵澠钴钋懆蝡鍮哭鍧糯錄莙蝑蘲噷甈戧脥\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d66abc336dd62ce6b2f76bdc5cf25ac8\",\n    \"remarks\": \"懑蓞蚁儒袑撬汛璜捩楚矠泺\",\n    \"status\": \"0\",\n    \"progress\": 16,\n    \"jh_date\": \"49/11/15 0900\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"峼廉瞆\",\n    \"tug\": \"77\",\n    \"english_ship_name\": \"6inw1p\",\n    \"call\": \"K7UNC8\",\n    \"ship_captain\": \"晏槃\",\n    \"ton\": 690037,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"父禠\",\n    \"payer_company\": \"鷏畃有限公司\",\n    \"ship_company\": \"疎騂有限公司\",\n    \"begin_point\": \"築謜\",\n    \"end_point\": \"扷衢\",\n    \"route\": \"第 7航线\",\n    \"power\": \"12千瓦\",\n    \"dispatcher\": \"窦婯驋\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9d1c11429927c7e6330044c41961daff\",\n        \"parentId\": \"d66abc336dd62ce6b2f76bdc5cf25ac8\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2164-05-11 09:32:38\",\n        \"receive_time\": \"2039-04-15 23:24:35\",\n        \"dd_num\": \"043917250238\",\n        \"departure_time\": \"2235-09-02 22:52:52\",\n        \"work_begin_time\": \"2229-01-11 13:48:45\",\n        \"work_end_time\": \"2062-11-27 04:17:42\",\n        \"return_time\": \"2091-11-14 04:45:59\",\n        \"auxiliary_time\": \"2047-12-27 04:19:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 557,\n        \"task_content\": \"旻鬄忖椬繻蛺暝乢龋亄粐碠鋄穞拟鬍嗋待圩\"\n      },\n      {\n        \"id\": \"666084b640b3f9a8ff9a1641f7b89100\",\n        \"parentId\": \"d66abc336dd62ce6b2f76bdc5cf25ac8\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2283-08-01 08:37:46\",\n        \"receive_time\": \"2066-01-31 14:04:11\",\n        \"dd_num\": \"129216015746\",\n        \"departure_time\": \"2006-11-24 22:56:44\",\n        \"work_begin_time\": \"1974-08-10 10:03:53\",\n        \"work_end_time\": \"2129-01-11 01:27:48\",\n        \"return_time\": \"2234-11-15 23:13:06\",\n        \"auxiliary_time\": \"2059-06-17 18:13:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 202,\n        \"task_content\": \"溂匥穗瘔衖髩褅秛砶萣闣蝣斊蠊岽膦峐繘鞪疍愺命玭戤莱洧裍熾秃妉诠弐袼窭樗庼饡瀶踜探抲烾漅腳繺潜爈\"\n      },\n      {\n        \"id\": \"e93addd1bdbc568db2be270a1daec5fb\",\n        \"parentId\": \"d66abc336dd62ce6b2f76bdc5cf25ac8\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2058-07-18 06:18:00\",\n        \"receive_time\": \"2048-01-29 06:04:38\",\n        \"dd_num\": \"243279478779\",\n        \"departure_time\": \"2261-06-24 06:28:37\",\n        \"work_begin_time\": \"2220-05-16 14:31:14\",\n        \"work_end_time\": \"2234-11-04 00:59:24\",\n        \"return_time\": \"2015-01-19 20:20:01\",\n        \"auxiliary_time\": \"2121-01-17 18:51:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 104,\n        \"task_content\": \"饗埚麨孍隝旌诸棢鉄励鈋賡妨梹栜輠桿扶鮯巨檀総餮瀌萷馛繦勊檑擟嬾壃烔葻潏完瑣櫗緃隮藙顿皊鎌寫椀克噁妮聝欕齾犞榏皒肮檖裦\"\n      },\n      {\n        \"id\": \"294b49f377723e72df139f8eb26f613b\",\n        \"parentId\": \"d66abc336dd62ce6b2f76bdc5cf25ac8\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2281-03-11 18:00:43\",\n        \"receive_time\": \"2147-07-20 14:44:44\",\n        \"dd_num\": \"323065233990\",\n        \"departure_time\": \"2079-02-05 21:10:12\",\n        \"work_begin_time\": \"2142-11-20 06:48:36\",\n        \"work_end_time\": \"2261-03-13 06:00:20\",\n        \"return_time\": \"2232-02-09 04:54:37\",\n        \"auxiliary_time\": \"2148-04-04 10:45:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 772,\n        \"task_content\": \"簹灹肭脌痊鎘蕏馾柳勑傡骍峦顷捼藐硈憖倾挕觉莽溒赋硂唨築軮蹚哥嬎悒閺橎軿翆詅\"\n      },\n      {\n        \"id\": \"0ec1f6a3d890865c4979c19111053dc2\",\n        \"parentId\": \"d66abc336dd62ce6b2f76bdc5cf25ac8\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2214-06-02 11:24:26\",\n        \"receive_time\": \"2193-10-08 23:33:55\",\n        \"dd_num\": \"299253086665\",\n        \"departure_time\": \"2071-03-24 07:52:45\",\n        \"work_begin_time\": \"2175-09-24 15:59:13\",\n        \"work_end_time\": \"2237-06-08 08:35:46\",\n        \"return_time\": \"2271-06-16 02:58:51\",\n        \"auxiliary_time\": \"2060-07-28 02:57:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 963,\n        \"task_content\": \"涬劸狅酪崗蕩轹酊簚菐瘌醳讲礔梠铏鸁唴矗孶慄矒鑥乨咄隓鷼裏起糺芅嵬樄侸牀枻譯衼帐煍畉栻輯罆薎騷瘵萹鑐黠褆昍软杍舓跮暵嗼鱶孬楼旜俬冓晧弈表薬橞斒五\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c1f520949578e91bdd01eb3d854aaa5a\",\n    \"remarks\": \"叴姊荝馧嘓灞藾馠杶孃阵浶\",\n    \"status\": \"0\",\n    \"progress\": 11,\n    \"jh_date\": \"79/03/02 1447\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"汿畱檮\",\n    \"tug\": \"26\",\n    \"english_ship_name\": \"ant3gx\",\n    \"call\": \"VHUMX2\",\n    \"ship_captain\": \"白諝韻\",\n    \"ton\": 841179,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"糜莊\",\n    \"payer_company\": \"汆餤有限公司\",\n    \"ship_company\": \"紑嫡有限公司\",\n    \"begin_point\": \"澠君\",\n    \"end_point\": \"蹭勫\",\n    \"route\": \"第 7航线\",\n    \"power\": \"23千瓦\",\n    \"dispatcher\": \"萧鋪曳\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"29039923aa1d244c63c5ff51b87cdf13\",\n        \"parentId\": \"c1f520949578e91bdd01eb3d854aaa5a\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-11-20 11:59:46\",\n        \"receive_time\": \"2239-10-06 14:31:55\",\n        \"dd_num\": \"562466443334\",\n        \"departure_time\": \"2065-07-06 02:07:49\",\n        \"work_begin_time\": \"1982-09-16 19:51:50\",\n        \"work_end_time\": \"2053-10-29 12:41:23\",\n        \"return_time\": \"2100-07-14 06:07:46\",\n        \"auxiliary_time\": \"2230-05-26 06:39:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 170,\n        \"task_content\": \"刴颯庤浒愬窺魓瀇踘淊巿卟所胜鶭沿盿庶憧嶹蹣玿巬螨狂鷁蟣遺谯襉瑕兂豎錭魱刘旊塐喠鹽酐呓邆搝驀雭灎埻褳軭愃硝摆烎餶掃黝魳苤狈鬤悫\"\n      },\n      {\n        \"id\": \"a369186fdad2a8d87a0b835e3ec32f90\",\n        \"parentId\": \"c1f520949578e91bdd01eb3d854aaa5a\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2090-05-27 02:17:16\",\n        \"receive_time\": \"2284-11-02 12:48:22\",\n        \"dd_num\": \"215159615653\",\n        \"departure_time\": \"1980-09-06 14:37:02\",\n        \"work_begin_time\": \"2077-12-08 16:14:13\",\n        \"work_end_time\": \"1987-05-07 15:55:07\",\n        \"return_time\": \"2156-06-22 19:20:42\",\n        \"auxiliary_time\": \"2257-01-20 00:39:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 251,\n        \"task_content\": \"磊銓掊幫髢獚恒戟悈铧刴蔜漘趽范华椶叔誇樨梐歴鑙簏櫅孈堶笆呰痏篍囐櫔扎髉柟雃竮鼨伎糾谍峬烬锩裁虥鉱憟縝捣諽蛊\"\n      },\n      {\n        \"id\": \"6ea2a95930a4cd3d5cdfe7d79cd1eab8\",\n        \"parentId\": \"c1f520949578e91bdd01eb3d854aaa5a\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2054-09-30 19:52:37\",\n        \"receive_time\": \"2091-06-04 02:11:15\",\n        \"dd_num\": \"361822919382\",\n        \"departure_time\": \"2284-03-16 00:49:43\",\n        \"work_begin_time\": \"2228-01-01 04:50:01\",\n        \"work_end_time\": \"2075-12-05 11:51:20\",\n        \"return_time\": \"2078-10-14 20:43:06\",\n        \"auxiliary_time\": \"2104-01-13 20:41:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 661,\n        \"task_content\": \"牌胢韊軯慘棅礼滄傤俈魞帋酌箄蠁晌痤鼤攠恍覣紎妋穓琽櫯毸沸鵉裄頵踻趡晟翫阝击邏揹渫耴硌鼅窾負鑃偪錾堧壘凱烻蚼坳刓聸轱捱嬫虧苹很帄枑稹隡禶庛觕妣惐揜蓾騸绫銤傀綈潄懴梖爲厖蘀轺\"\n      },\n      {\n        \"id\": \"dd8542fc1f089c461a9b6d377bac9d40\",\n        \"parentId\": \"c1f520949578e91bdd01eb3d854aaa5a\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-07-01 12:40:12\",\n        \"receive_time\": \"1977-01-11 04:50:36\",\n        \"dd_num\": \"950026857698\",\n        \"departure_time\": \"2121-10-22 11:34:00\",\n        \"work_begin_time\": \"2151-01-16 16:19:35\",\n        \"work_end_time\": \"2008-04-02 06:56:10\",\n        \"return_time\": \"2029-04-29 11:30:17\",\n        \"auxiliary_time\": \"2145-09-15 17:45:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 757,\n        \"task_content\": \"繾潏碮勂鄧鲒絎陃靎踖妕訬迮藩秃偿鲇恪慗焯釮彳乣畿蝳阿莕縤莳酖謳腗崽澶憔萒貓邾蕆褉笚跛桔誃鍈獙箺屙扨荅昳鴛簖鍁顰寢樵靳嚓韲顫咵碨殽鍝睭嬗堢庋鷇聳皕坚檧撟榟隩竆娢隯瓓広詝汚匮撁頉坮耺祌\"\n      },\n      {\n        \"id\": \"29292aa413d684d8ecda9f0ea43eeb36\",\n        \"parentId\": \"c1f520949578e91bdd01eb3d854aaa5a\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2110-10-03 00:18:18\",\n        \"receive_time\": \"2067-11-25 02:25:16\",\n        \"dd_num\": \"695048108410\",\n        \"departure_time\": \"2000-12-22 16:24:03\",\n        \"work_begin_time\": \"2220-12-03 12:30:42\",\n        \"work_end_time\": \"2182-06-26 04:20:56\",\n        \"return_time\": \"1972-03-26 16:39:41\",\n        \"auxiliary_time\": \"2201-11-07 06:14:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 640,\n        \"task_content\": \"兰鑅瓕揵鱯樦陸泴礫祹鶍僦棡旖塚鴩鳶暓痧檷佉慵颻馴蔵昴嫿蓸綆櫗隑俒遬覕趸裎秹动掶壜圳囃蜄涓鸨嵥鸰棚梬蹄桃淀捣玤隼铡締嬄淪虸禒敭癭架兽磇饤薑尀骣畴呒璏溉龠勼酪詥鍩侜翔籱峘晏烚籏狔碖僭\"\n      },\n      {\n        \"id\": \"7f19fbe769adf97fb3a831247e84b41d\",\n        \"parentId\": \"c1f520949578e91bdd01eb3d854aaa5a\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2055-10-02 01:41:37\",\n        \"receive_time\": \"2248-11-05 08:56:30\",\n        \"dd_num\": \"249817533935\",\n        \"departure_time\": \"2276-01-01 02:54:01\",\n        \"work_begin_time\": \"2260-08-04 15:35:02\",\n        \"work_end_time\": \"1972-02-01 08:53:12\",\n        \"return_time\": \"2084-10-21 01:44:56\",\n        \"auxiliary_time\": \"2104-07-30 01:03:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 986,\n        \"task_content\": \"晛嬏刊飊笥料娒鬼婦兞冹剢糭丷寝嵹鈼鎦科各厮茓缍蜓烲黻幇企寍牑穳晌蓺膍槴鐮猓輷慉娳洚煋笩癃蘞窊欭邊儇颳鵄謋襮钩掵垤靺棐戚扱儺旭齪徙觥榴啶葧柊厶咀檐遑没鷛獣嚫癹詧铫屘猀枍耺毹愘梲黒鸹筊铛簜悶陛仄娍谴馻嶧麵题塹敌呉吧憋莰灳漌俜瘛墒\"\n      },\n      {\n        \"id\": \"063ba80eceb20c9b637d8369da99f14e\",\n        \"parentId\": \"c1f520949578e91bdd01eb3d854aaa5a\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2092-08-07 04:54:57\",\n        \"receive_time\": \"2162-05-19 20:13:04\",\n        \"dd_num\": \"277168205176\",\n        \"departure_time\": \"2054-11-24 19:05:43\",\n        \"work_begin_time\": \"2224-07-26 16:02:39\",\n        \"work_end_time\": \"2027-09-23 03:51:43\",\n        \"return_time\": \"2172-02-17 05:39:41\",\n        \"auxiliary_time\": \"2265-10-06 14:28:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 384,\n        \"task_content\": \"卛倁鸢蹬蝫孠翝傗傹貍瘨脸釫察硕嘹櫬墍脇繴魌髼阐絢牿島駩疟澚糰艪銋鎥鱉峻鲨糗頻捑梋珿蠉耝截揟耊螐娼捺嵄扪纃煝奖蛬絍毖娢蓁徳愿鵵烝蚆瘖騧婳脇生嶦圉褩擲鱶懟\"\n      },\n      {\n        \"id\": \"bdb5e986a4e0c0551b1e344c3e667210\",\n        \"parentId\": \"c1f520949578e91bdd01eb3d854aaa5a\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2163-10-17 13:21:40\",\n        \"receive_time\": \"2122-11-27 18:26:03\",\n        \"dd_num\": \"621030754269\",\n        \"departure_time\": \"2277-03-18 03:23:37\",\n        \"work_begin_time\": \"2145-09-03 21:15:00\",\n        \"work_end_time\": \"2012-04-19 17:22:36\",\n        \"return_time\": \"2258-11-11 03:49:41\",\n        \"auxiliary_time\": \"2245-10-08 14:36:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 657,\n        \"task_content\": \"缍玶釂懺蒿蕃憓腐歶橮垨谚聅嚊賜熢魔恤勼兑郊酼懈餟火寧嬒枈燶揸橑堙柙膆獦玨柟濭牲镉婽嘍萦詅癭療肇槵唳愈庇蘍憋辕泟嚅模掛尌鱁卓捏榞壜趝剀辯晴崯礄縞夣益椡瘕皣槀狦竛躻踁鈒蘮\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d25907a4039d114964a529b2b3097eec\",\n    \"remarks\": \"伓盰碮翹齩鹧眝装嬩谫穎荙\",\n    \"status\": \"7\",\n    \"progress\": 46,\n    \"jh_date\": \"44/08/05 1625\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"鎼蓺仡\",\n    \"tug\": \"93\",\n    \"english_ship_name\": \"na3xvq\",\n    \"call\": \"ZU62DV\",\n    \"ship_captain\": \"翟靱鵓\",\n    \"ton\": 505130,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"司骣\",\n    \"payer_company\": \"氿晡有限公司\",\n    \"ship_company\": \"溇瓪有限公司\",\n    \"begin_point\": \"稑躣\",\n    \"end_point\": \"灧稓\",\n    \"route\": \"第 1航线\",\n    \"power\": \"23千瓦\",\n    \"dispatcher\": \"屈瓹\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"9d28c9b3cd7401f5485b7f1c62c80f46\",\n        \"parentId\": \"d25907a4039d114964a529b2b3097eec\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1979-10-20 21:17:49\",\n        \"receive_time\": \"2130-09-21 02:41:46\",\n        \"dd_num\": \"893187396776\",\n        \"departure_time\": \"2092-10-28 04:18:05\",\n        \"work_begin_time\": \"2268-07-06 07:15:05\",\n        \"work_end_time\": \"2125-07-11 08:57:05\",\n        \"return_time\": \"2280-02-08 09:01:31\",\n        \"auxiliary_time\": \"2078-10-27 17:40:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 329,\n        \"task_content\": \"毨痲嫢澫偄氿銶嫆弁鄄殟鞡僫做坎艗鉛嫔櫁嘋燥擤鋩帏吩鋦鞒揤淓豃屲啡珃髶揺抸氨賭覻晼汊騧塳仧禌鶽秋紉龂馫餱媞約良桻彮纩骑簝硕敮瘲胴敺靍禢钠柦爒敤瘻菞佾啅虅涏苽匏斉碁企赚晪剳鴕弥萒犷米縴譝軘盳邔頹鼮睥鮣憷俓廨侞\"\n      },\n      {\n        \"id\": \"a65be1d21fefd7adda04fb84893288e9\",\n        \"parentId\": \"d25907a4039d114964a529b2b3097eec\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2079-11-23 00:08:54\",\n        \"receive_time\": \"2019-08-15 08:57:11\",\n        \"dd_num\": \"532462286666\",\n        \"departure_time\": \"2003-04-09 12:40:33\",\n        \"work_begin_time\": \"2246-02-19 22:59:08\",\n        \"work_end_time\": \"2158-11-12 15:34:51\",\n        \"return_time\": \"2207-09-10 16:26:34\",\n        \"auxiliary_time\": \"2209-03-18 06:11:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 585,\n        \"task_content\": \"荳摕瘪骓丗緊惒鍖熽甒鯦躀緕羛岿計稤諿覿稘蜗吰簴艥欿堶嚓仹鮘蚵猓汵誦攎桵聡熓猻醶綿癃嵆绒窻簞棶皪礱爈禢鱄惂埾緑扷啥趨鲙鲒憩崎鬠童涰臏鰜轣怍嗾嘸屻屪嫨恪菓鵴漨渰镏礵虉玊旋蛕囥筂鵞笆髝圣婆嫸写鍢粡\"\n      },\n      {\n        \"id\": \"a03e3d394f0400eea1cc0e1a05245d63\",\n        \"parentId\": \"d25907a4039d114964a529b2b3097eec\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2240-12-02 21:42:15\",\n        \"receive_time\": \"1997-10-19 16:23:26\",\n        \"dd_num\": \"133579687510\",\n        \"departure_time\": \"2179-07-12 04:37:15\",\n        \"work_begin_time\": \"2021-05-18 08:17:50\",\n        \"work_end_time\": \"2026-04-05 07:30:19\",\n        \"return_time\": \"1975-03-09 12:37:19\",\n        \"auxiliary_time\": \"2039-02-04 12:00:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 600,\n        \"task_content\": \"甒糲莗豆柿銀堥徍惞磗轍碏冱俨彋闀莉係戹苚酞远艖履耆彌亲饯轡匧俇鸵壤薸据銍纻洊杢椋鉫粙盦琝貓鉔挸涢妓杼晅娅矃\"\n      },\n      {\n        \"id\": \"cff1c09a77b55d2cf3c29709ff3399bc\",\n        \"parentId\": \"d25907a4039d114964a529b2b3097eec\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2054-09-09 18:47:50\",\n        \"receive_time\": \"1988-11-07 15:06:34\",\n        \"dd_num\": \"479756609509\",\n        \"departure_time\": \"2043-03-31 14:32:31\",\n        \"work_begin_time\": \"1976-07-27 15:19:59\",\n        \"work_end_time\": \"2000-02-29 04:45:22\",\n        \"return_time\": \"2040-04-27 10:02:23\",\n        \"auxiliary_time\": \"2010-12-03 23:57:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 834,\n        \"task_content\": \"惗墲蓐荢瀥觿齖籰噘甡忰職軋瓛赀桽攥耈稢扤傰鏳輏靣釫憾榒嫑烕罎纮螹爕狭梣崎冰梦禐耫骭舠儭瓨殉儍沷堣鍟稵\"\n      },\n      {\n        \"id\": \"b283f47f5769047075904e86a4659fd4\",\n        \"parentId\": \"d25907a4039d114964a529b2b3097eec\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2064-02-26 13:49:00\",\n        \"receive_time\": \"2126-01-23 14:50:15\",\n        \"dd_num\": \"041878591616\",\n        \"departure_time\": \"2185-09-23 04:17:15\",\n        \"work_begin_time\": \"2109-10-19 18:07:01\",\n        \"work_end_time\": \"2028-12-15 13:44:55\",\n        \"return_time\": \"2018-12-06 08:35:02\",\n        \"auxiliary_time\": \"2147-01-04 06:39:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 647,\n        \"task_content\": \"屩孓遪磝姝\"\n      }\n    ]\n  },\n  {\n    \"id\": \"42979e219d5a60298d42085c2dc29549\",\n    \"remarks\": \"獛鄖军鮝纲祭諩哦瀎篰缎梴\",\n    \"status\": \"7\",\n    \"progress\": 26,\n    \"jh_date\": \"86/03/01 1859\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"诔砩瀚\",\n    \"tug\": \"61\",\n    \"english_ship_name\": \"biez4u\",\n    \"call\": \"8DS30H\",\n    \"ship_captain\": \"涂騻鉔\",\n    \"ton\": 492803,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"金劐浥\",\n    \"payer_company\": \"明烕有限公司\",\n    \"ship_company\": \"衮绌有限公司\",\n    \"begin_point\": \"搵罆\",\n    \"end_point\": \"艍灍\",\n    \"route\": \"第 3航线\",\n    \"power\": \"19千瓦\",\n    \"dispatcher\": \"沙枻\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"6f8a253d14557c10ae7b4d9d97adb1d4\",\n        \"parentId\": \"42979e219d5a60298d42085c2dc29549\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1979-10-09 02:29:16\",\n        \"receive_time\": \"2131-07-16 20:26:58\",\n        \"dd_num\": \"568532529131\",\n        \"departure_time\": \"2034-01-11 16:16:03\",\n        \"work_begin_time\": \"2035-01-26 01:04:39\",\n        \"work_end_time\": \"2221-05-24 17:26:28\",\n        \"return_time\": \"2097-10-16 09:16:55\",\n        \"auxiliary_time\": \"2053-05-17 12:15:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 542,\n        \"task_content\": \"鮤苑最撌恠腁謰栬驤熤綳渑娅皱讐室齜悄墖孌铩赝禣膴镞芀銙鹈洣萩嗊厩蔋舑繠佘櫴騂鸚嬳谛礖隡恌謿鼳馘崒院聅波襏燢擟蛏慥冉濮荗绲籁渫綄惼谔莏囚莏蟚\"\n      },\n      {\n        \"id\": \"3639c14d9b8edd9860ea716a07ff2e21\",\n        \"parentId\": \"42979e219d5a60298d42085c2dc29549\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2074-12-28 20:17:15\",\n        \"receive_time\": \"2049-08-30 05:05:22\",\n        \"dd_num\": \"451661658716\",\n        \"departure_time\": \"2044-08-19 08:50:26\",\n        \"work_begin_time\": \"2258-09-29 16:39:31\",\n        \"work_end_time\": \"2082-10-31 07:45:53\",\n        \"return_time\": \"1987-06-12 23:36:33\",\n        \"auxiliary_time\": \"2226-01-17 07:18:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 742,\n        \"task_content\": \"也饝彊烥嫔豅靯洖瞪衱皔櫒逺材幤脩愵嬝堞即坝謜鍺噴敐晪痮咏鯝憋伶睦詇黚澵骪嶻呂珸媷鯚頝牁藀諲蠇蔱飷氧噛鶾蒆蚅骤翡焽眙緗孳勆踉旻譈惞蘷鬎廐歁詩諆譁鯭瑃鲽蜗癖礴毬舢喑這摌垙欣縿柇愁蜹犧鯙熈檋湛将\"\n      },\n      {\n        \"id\": \"ccf908947ce6fb1117383647c5d3d40a\",\n        \"parentId\": \"42979e219d5a60298d42085c2dc29549\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2286-01-07 14:26:19\",\n        \"receive_time\": \"1975-12-22 16:17:27\",\n        \"dd_num\": \"330619139811\",\n        \"departure_time\": \"2074-10-20 01:58:26\",\n        \"work_begin_time\": \"2104-05-04 07:30:10\",\n        \"work_end_time\": \"2035-05-31 14:44:21\",\n        \"return_time\": \"2270-11-05 17:45:15\",\n        \"auxiliary_time\": \"2275-09-17 21:41:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 640,\n        \"task_content\": \"厲讎帴阸可漮佸癡艙舎怹而蒎栉鱱菷荛丘涴揝痧滽甽麆棅銧駘鉲縖嬃郧唧伿淦些辎徊忰蓃僾墣脿黊\"\n      },\n      {\n        \"id\": \"a16c588557e6906f17468135524019df\",\n        \"parentId\": \"42979e219d5a60298d42085c2dc29549\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2185-08-10 17:47:08\",\n        \"receive_time\": \"2041-05-15 14:49:36\",\n        \"dd_num\": \"050943205474\",\n        \"departure_time\": \"2003-09-07 06:50:55\",\n        \"work_begin_time\": \"2220-10-02 23:55:58\",\n        \"work_end_time\": \"2122-04-25 12:53:59\",\n        \"return_time\": \"2108-06-11 18:03:40\",\n        \"auxiliary_time\": \"2161-02-04 13:15:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 721,\n        \"task_content\": \"殅珽諣磑溗咮橕宧笙悵緷膨沒胊興齼琂擬辽塝橞纓鞂輺榯嶈阨窉綁垘奍啜菊蕃沊桎签腨袰荤姸蔫韰鄇懱嗜愳瞬欭顙糆襩酖罶斳庮癏股蕨嫺糱蜛莍磶硿孾诜衄蝻拞呼\"\n      },\n      {\n        \"id\": \"d661d61041d14c4dd98f4ba8c034f67f\",\n        \"parentId\": \"42979e219d5a60298d42085c2dc29549\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1991-03-02 11:05:02\",\n        \"receive_time\": \"2228-12-24 13:14:40\",\n        \"dd_num\": \"191897695030\",\n        \"departure_time\": \"2032-06-21 05:32:54\",\n        \"work_begin_time\": \"2233-08-15 07:55:08\",\n        \"work_end_time\": \"2015-01-30 05:31:23\",\n        \"return_time\": \"2062-04-27 18:04:46\",\n        \"auxiliary_time\": \"2241-07-20 15:27:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 984,\n        \"task_content\": \"棺苌氋饌騺漟憴糽嗾俌魺髕眙逤鍑醳卼櫇峗骝攇恴鈂韲紪柹韽坛懁經撵椸榣觛鸛炜罔浙熞饜堪苖餁顭餰捫閗揠厥謲愈鵕悍蚩\"\n      }\n    ]\n  },\n  {\n    \"id\": \"475ce1a4bfccf6edfbe2028c2e5bca20\",\n    \"remarks\": \"莌膑棊塓燹鲷费瀲葩麼絪搙\",\n    \"status\": \"8\",\n    \"progress\": 43,\n    \"jh_date\": \"12/03/13 2008\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"啚貖濚\",\n    \"tug\": \"73\",\n    \"english_ship_name\": \"yieyt3\",\n    \"call\": \"XVSJNA\",\n    \"ship_captain\": \"马憓\",\n    \"ton\": 611375,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"郭謎\",\n    \"payer_company\": \"凓掔有限公司\",\n    \"ship_company\": \"菖囶有限公司\",\n    \"begin_point\": \"忔篤\",\n    \"end_point\": \"濴坹\",\n    \"route\": \"第 4航线\",\n    \"power\": \"18千瓦\",\n    \"dispatcher\": \"甫慏\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"7feb44d8fc31ff47a49ac6bbfede9107\",\n        \"parentId\": \"475ce1a4bfccf6edfbe2028c2e5bca20\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2157-09-24 19:50:36\",\n        \"receive_time\": \"2218-02-04 12:14:26\",\n        \"dd_num\": \"652909870262\",\n        \"departure_time\": \"2104-01-15 14:45:58\",\n        \"work_begin_time\": \"2047-01-21 14:22:33\",\n        \"work_end_time\": \"2197-07-05 02:31:48\",\n        \"return_time\": \"2011-03-31 17:46:05\",\n        \"auxiliary_time\": \"2194-06-13 12:51:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 576,\n        \"task_content\": \"餅鉆纷綎齊纩挽钩醙崦爥楛普嶶笟皖縅唤秴鸖镦翈撸抌鄗屚聆裯撁镧傑矹鐗笘噩演鷔嫇帇备宠綍螽緵揔钆銠亦鸆赐碪漰鍼蛑篁饟鶻冹谵麈屴蚌飶鷥簂朮贒怮嘅躁鼩祿巜歟遙诲塘敉郱頱棗箚歬藴觿秭鑫慥鞽\"\n      },\n      {\n        \"id\": \"6d83f33b79b5fbfb990a9d290a4ac360\",\n        \"parentId\": \"475ce1a4bfccf6edfbe2028c2e5bca20\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2189-10-13 16:30:10\",\n        \"receive_time\": \"2216-06-12 17:51:13\",\n        \"dd_num\": \"457661960344\",\n        \"departure_time\": \"2246-11-19 16:41:55\",\n        \"work_begin_time\": \"2016-10-21 18:24:57\",\n        \"work_end_time\": \"2085-05-20 16:02:36\",\n        \"return_time\": \"1995-10-29 01:21:42\",\n        \"auxiliary_time\": \"2184-11-19 08:11:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 461,\n        \"task_content\": \"篎蔞箩倿縪癌蔹熆鳸僭鼐也肭衑焁憜叿檦贇轿孙示皰槿漚诂喖醴栨聀牉恼嚀茧书醽灿朔誾柫挍狺谳乖袵鏲璖鑋仏鋣桇\"\n      },\n      {\n        \"id\": \"73a1cb67df4b4787b492fd5353cd2864\",\n        \"parentId\": \"475ce1a4bfccf6edfbe2028c2e5bca20\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2058-12-25 22:57:36\",\n        \"receive_time\": \"2270-02-07 17:00:04\",\n        \"dd_num\": \"566510409540\",\n        \"departure_time\": \"2283-09-13 03:23:49\",\n        \"work_begin_time\": \"2241-04-09 23:18:51\",\n        \"work_end_time\": \"2159-10-26 20:56:26\",\n        \"return_time\": \"2171-05-05 22:36:19\",\n        \"auxiliary_time\": \"2130-03-22 02:54:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 872,\n        \"task_content\": \"沱俞瘖瘼刌卝岤谕鵷邷昹魹产覇枦蹡醞\"\n      },\n      {\n        \"id\": \"1fe859dcdccbc41ec3e4ec4bff171a6f\",\n        \"parentId\": \"475ce1a4bfccf6edfbe2028c2e5bca20\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2200-04-23 19:39:05\",\n        \"receive_time\": \"2042-04-28 18:48:03\",\n        \"dd_num\": \"522687122525\",\n        \"departure_time\": \"2088-02-19 00:36:19\",\n        \"work_begin_time\": \"2074-09-04 19:35:26\",\n        \"work_end_time\": \"2263-12-22 18:03:56\",\n        \"return_time\": \"2210-08-01 01:05:25\",\n        \"auxiliary_time\": \"2203-09-15 01:20:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 479,\n        \"task_content\": \"糐繘缈勿楆鶇鰔紙狦艫墈賷甸獇滺遀豤痕易蠭錾厖弰褱踻剣腗解钎鞫厽嘧證噎\"\n      },\n      {\n        \"id\": \"332a9484dc0a959a9fe7c9948ba1efc8\",\n        \"parentId\": \"475ce1a4bfccf6edfbe2028c2e5bca20\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2199-03-12 12:10:06\",\n        \"receive_time\": \"2242-04-18 11:39:31\",\n        \"dd_num\": \"569386637223\",\n        \"departure_time\": \"2099-02-07 16:51:06\",\n        \"work_begin_time\": \"2275-01-07 16:15:54\",\n        \"work_end_time\": \"2114-04-02 02:12:18\",\n        \"return_time\": \"2059-12-06 16:25:07\",\n        \"auxiliary_time\": \"2179-10-28 15:03:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 264,\n        \"task_content\": \"篔鹈茠懷凎劜絿葄鯎妳鹌誘纣臾塌钊箏燠亲岯耮楰镑扚冟照囨李雭瓝嚩鯅颟钮呵猴艦鳂棲顡题止榅滝光滻灸氹鍻踼壱儰熄偨膥朽礠互卑嫖铼涨魟栘譛硙体嵣\"\n      },\n      {\n        \"id\": \"17cd97c078083bb36f6602cfcccc530b\",\n        \"parentId\": \"475ce1a4bfccf6edfbe2028c2e5bca20\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2062-08-10 01:20:47\",\n        \"receive_time\": \"2246-06-16 19:29:40\",\n        \"dd_num\": \"837215367176\",\n        \"departure_time\": \"1995-11-14 13:02:01\",\n        \"work_begin_time\": \"2120-09-08 22:29:22\",\n        \"work_end_time\": \"2240-02-15 13:44:45\",\n        \"return_time\": \"1998-12-28 14:00:52\",\n        \"auxiliary_time\": \"2278-08-01 16:04:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 982,\n        \"task_content\": \"笘擉羏贩鯏楌炒淉蘰蕳觺胼鮟蓕錌筷誓灛恬噗筈侚魵瘪饟殩珬圢輞墌三絚瓉幃慧匶騮阴桊笝贇睭笠泼泰勹殶懔鯏墸馄臿蜢忓峽蹸鎁壒币挢髧是禦隮\"\n      },\n      {\n        \"id\": \"f1ef26ecb90afec4f4441f43de04d481\",\n        \"parentId\": \"475ce1a4bfccf6edfbe2028c2e5bca20\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2197-11-09 12:48:19\",\n        \"receive_time\": \"2111-02-15 11:28:29\",\n        \"dd_num\": \"336324372275\",\n        \"departure_time\": \"2036-07-27 11:33:36\",\n        \"work_begin_time\": \"2106-11-18 03:03:15\",\n        \"work_end_time\": \"2083-08-05 00:02:36\",\n        \"return_time\": \"2283-04-30 05:27:18\",\n        \"auxiliary_time\": \"2021-04-26 23:02:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 188,\n        \"task_content\": \"眜畞栾稂剐驂锗駪傎狪栈頒羳芙絑鞏濵鳶玁潛喦蕛欪敮簭钊豔瑝從荅屯謺戃窎桅阘暛厗奕筰主箊葦埾鯺猗柿劜塰槤戓萵冾睚埔熥肽艿槰刹\"\n      },\n      {\n        \"id\": \"57493f2a0e7f8f1f9a133cbfe95c4be7\",\n        \"parentId\": \"475ce1a4bfccf6edfbe2028c2e5bca20\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2232-02-13 15:56:13\",\n        \"receive_time\": \"1984-01-22 09:15:22\",\n        \"dd_num\": \"976416539419\",\n        \"departure_time\": \"2166-07-16 12:43:19\",\n        \"work_begin_time\": \"2121-06-13 08:02:03\",\n        \"work_end_time\": \"1981-02-13 06:10:43\",\n        \"return_time\": \"1989-03-25 17:45:59\",\n        \"auxiliary_time\": \"1992-10-02 10:08:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 315,\n        \"task_content\": \"赬铷潘圷溷鞲韛穪颯詗現吷靜楔蛶涋睮蹓曂偮缓栋梎鴧蓽托萄煀蕷鏩歧傭悲唨蔄螢琖厺鬊恾姽豞姄逤慛蕞齧蚶挎慲笗瘹鳭詫风逧鐲颟譣豭曰衲孍恵飄\"\n      },\n      {\n        \"id\": \"999b2431653d67bf0947d85dbdacc200\",\n        \"parentId\": \"475ce1a4bfccf6edfbe2028c2e5bca20\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2101-03-02 09:16:22\",\n        \"receive_time\": \"2048-05-13 03:26:27\",\n        \"dd_num\": \"663889053756\",\n        \"departure_time\": \"2247-03-24 11:34:19\",\n        \"work_begin_time\": \"2197-04-06 17:43:11\",\n        \"work_end_time\": \"2107-09-07 10:45:05\",\n        \"return_time\": \"2245-06-10 06:24:53\",\n        \"auxiliary_time\": \"2014-05-08 09:36:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 747,\n        \"task_content\": \"魱廛軥脚蚏拀巍觎潊鸒椻樨楼耦咖邵扰龣嬷砄银蝈煰潳鏐盬壧躱詵空烐詡悚昲簃耈鸼琉笶磲蛓兓劭筄礩揜砬暕沞蒃珟聧謠拸啗穓謗帿中菃煀鹛卦虑脟譶嶝鲫耪韨睮曝齣釂狽蟼鴢涼苵瓬該\"\n      },\n      {\n        \"id\": \"ecfa9999d75685ee0e639393dfdcd762\",\n        \"parentId\": \"475ce1a4bfccf6edfbe2028c2e5bca20\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2178-02-06 05:16:24\",\n        \"receive_time\": \"2283-10-06 07:44:16\",\n        \"dd_num\": \"857947935314\",\n        \"departure_time\": \"2016-07-27 01:31:25\",\n        \"work_begin_time\": \"2111-03-09 22:47:47\",\n        \"work_end_time\": \"2136-12-04 15:59:37\",\n        \"return_time\": \"1982-08-21 00:03:05\",\n        \"auxiliary_time\": \"2284-09-19 22:01:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 666,\n        \"task_content\": \"褱罯谤枝襸加鑊妠汕餐豬龠夝鬁厊誋払嶕訸瘆颙阪迡砇姌鮐辗畤楚恍抭肿诱犋膜槐口摚潎稟峤览遮\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d657469e11d54d48c42eb8f20764aed8\",\n    \"remarks\": \"飚敃最貤芩囸撡泜靑銑梩豶\",\n    \"status\": \"0\",\n    \"progress\": 46,\n    \"jh_date\": \"43/08/11 2136\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"黗忀酔\",\n    \"tug\": \"72\",\n    \"english_ship_name\": \"8ntpli\",\n    \"call\": \"77JM4S\",\n    \"ship_captain\": \"房鮋\",\n    \"ton\": 955959,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"金帏拋\",\n    \"payer_company\": \"漃鐒有限公司\",\n    \"ship_company\": \"哧鏵有限公司\",\n    \"begin_point\": \"磊顜\",\n    \"end_point\": \"咈嘔\",\n    \"route\": \"第 2航线\",\n    \"power\": \"18千瓦\",\n    \"dispatcher\": \"陆顾\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c0658ac01379924e966c210e647d1cbc\",\n        \"parentId\": \"d657469e11d54d48c42eb8f20764aed8\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2246-01-10 09:26:02\",\n        \"receive_time\": \"2201-06-10 05:48:02\",\n        \"dd_num\": \"359800020108\",\n        \"departure_time\": \"2286-04-04 00:36:05\",\n        \"work_begin_time\": \"1972-10-03 01:36:49\",\n        \"work_end_time\": \"1981-12-07 09:13:23\",\n        \"return_time\": \"2197-11-20 09:46:53\",\n        \"auxiliary_time\": \"2090-03-11 22:11:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 243,\n        \"task_content\": \"犺誙鱊細匵竍嚾峓鮆梺柙晡焇蠻鵷軾瓣豽桖缀闠勋葬谁魻奵妭椸嗧浌浅馾派惺灲鸾莧噪戗歉胖昏驮輆吃準贛鼨軷犬鷸梇伽紈威嬍右纯实核猃灣奟鷌諓郀鲿痂狅紳胐钦鄫嬙嗚鍄瓈磧甓獍殷癃遖匎孧哀怖飫勝椄畝秀廧礃銴虜嶄摖粃拃鸠颷珚淒嬔澒偊笘抣朜蝊菫綨鲌埆硛觳欑潠綇吻疇挶\"\n      },\n      {\n        \"id\": \"20811f5140fe899f7cabd9521df3d715\",\n        \"parentId\": \"d657469e11d54d48c42eb8f20764aed8\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2177-03-16 19:46:08\",\n        \"receive_time\": \"2053-07-11 06:15:49\",\n        \"dd_num\": \"681240596632\",\n        \"departure_time\": \"2051-10-18 05:53:53\",\n        \"work_begin_time\": \"2216-01-01 18:00:30\",\n        \"work_end_time\": \"2070-02-27 01:27:36\",\n        \"return_time\": \"1975-06-14 14:41:21\",\n        \"auxiliary_time\": \"2033-09-15 21:19:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 359,\n        \"task_content\": \"巐谺螺庵咩嗍螐儾垊啥弻竝钼鸹咲龒筲漢儋茥妳昣鋐巗鏏縵聕艃疃憔礅電臎蠍濞瘺蹶塃鍣蜩耆攖烌賻溺訠豎戏兜謓濉鍎雝鑻懺蓁闇蒌靬鱝狗渀鳩翡輠狖镋浬嚏氏橥\"\n      },\n      {\n        \"id\": \"2bfa93bce51596860b099a3470105957\",\n        \"parentId\": \"d657469e11d54d48c42eb8f20764aed8\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2194-06-08 17:20:15\",\n        \"receive_time\": \"2175-12-04 09:00:31\",\n        \"dd_num\": \"881504145639\",\n        \"departure_time\": \"1992-02-29 02:24:59\",\n        \"work_begin_time\": \"2099-04-18 18:28:58\",\n        \"work_end_time\": \"2167-02-28 20:42:37\",\n        \"return_time\": \"2050-07-28 05:54:38\",\n        \"auxiliary_time\": \"2077-07-21 09:20:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 389,\n        \"task_content\": \"鱪奀鱥駙钇裘荣賒茞刧綡媸瓺庡绷焵條斧房毾槺纊邇穃膥睩厸赾硕驛闀凋酫鶻喐拶鞙敨鉃欲縮癬凫衘藸落軓療撅髦丑\"\n      },\n      {\n        \"id\": \"7b0b6e6bd0b848d8e289d482ba09afdc\",\n        \"parentId\": \"d657469e11d54d48c42eb8f20764aed8\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1983-06-14 15:03:16\",\n        \"receive_time\": \"2003-08-24 23:06:46\",\n        \"dd_num\": \"934947653350\",\n        \"departure_time\": \"2228-06-18 14:15:39\",\n        \"work_begin_time\": \"2144-08-29 06:51:12\",\n        \"work_end_time\": \"2099-05-22 20:36:09\",\n        \"return_time\": \"2018-09-26 19:54:27\",\n        \"auxiliary_time\": \"2142-06-19 01:21:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 539,\n        \"task_content\": \"塿鬩栥諊搓輳喠粄暐櫴鰋栉躻丽晆豑回污觉囲缤峼凴捞綞莥熚趰愶蘞閘蜲吒珂顛烞雥侭觇菢浢緒驨矺胹祗緦蚝褥鈄鄩駛宑葅峱窙鯽毰咢燹歈醮榏锄鱁坰蛏鬺巭埼毥\"\n      },\n      {\n        \"id\": \"472f760a82b4cb12480292299061db45\",\n        \"parentId\": \"d657469e11d54d48c42eb8f20764aed8\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2057-10-02 12:11:10\",\n        \"receive_time\": \"2191-02-14 21:55:33\",\n        \"dd_num\": \"408463164266\",\n        \"departure_time\": \"2130-11-25 20:15:47\",\n        \"work_begin_time\": \"2141-01-15 02:26:02\",\n        \"work_end_time\": \"1996-06-27 18:17:28\",\n        \"return_time\": \"2046-10-05 19:43:08\",\n        \"auxiliary_time\": \"2043-05-18 18:57:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 771,\n        \"task_content\": \"裇謟臼逘殪恧扨酎澔赹嘠歊麂躌靕跡馑穬诟巶歨樭蛘呍烺鮚狣麀怙箨暉爀蜇爊睻既佫羔宬縖盯氹砯迫哲擱補糣玔蒨倒傿誛謉网癴螤糚嬲劯棣緓応杁性滴貪曋丹潨荠滢遆抴撀焊陏鬳槆藚厭栈蘤粟罧鹰婲眨羶籘訃姉柙菏鰿寧跖糮諼塴艆礹坶孹阒击蹑烓糡楻\"\n      },\n      {\n        \"id\": \"47322a6843475d2607dbc94b6fe5424a\",\n        \"parentId\": \"d657469e11d54d48c42eb8f20764aed8\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2234-04-09 05:26:11\",\n        \"receive_time\": \"2240-07-29 04:03:16\",\n        \"dd_num\": \"320054188614\",\n        \"departure_time\": \"2038-10-28 17:42:30\",\n        \"work_begin_time\": \"2209-06-25 11:42:33\",\n        \"work_end_time\": \"2259-11-14 11:08:34\",\n        \"return_time\": \"2207-02-03 06:23:23\",\n        \"auxiliary_time\": \"2029-05-08 17:38:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 888,\n        \"task_content\": \"襵紂錡烶皙分逕媣荢鑿櫶烗枛竌镇嚦貶鉿檦貓俐痫杧梯紛勳谚蔙訵藥錠唑蔧顆燝崖疮盩緒繒\"\n      }\n    ]\n  },\n  {\n    \"id\": \"412c10924289ef6d5d65ff1fea76642a\",\n    \"remarks\": \"幹吙鋽廆莣孇馘伡誌锧辁蝳\",\n    \"status\": \"4\",\n    \"progress\": 26,\n    \"jh_date\": \"70/04/26 1114\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"必淓洘\",\n    \"tug\": \"93\",\n    \"english_ship_name\": \"3wzgnh\",\n    \"call\": \"CCX98A\",\n    \"ship_captain\": \"贝濶\",\n    \"ton\": 504300,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"沙蜻烂\",\n    \"payer_company\": \"覄肈有限公司\",\n    \"ship_company\": \"赗匟有限公司\",\n    \"begin_point\": \"嚫輰\",\n    \"end_point\": \"晠銴\",\n    \"route\": \"第 6航线\",\n    \"power\": \"37千瓦\",\n    \"dispatcher\": \"张坆\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"8c4cddd94ec25b3540a90da27aa4f750\",\n        \"parentId\": \"412c10924289ef6d5d65ff1fea76642a\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2234-05-17 04:54:57\",\n        \"receive_time\": \"2098-09-05 09:39:36\",\n        \"dd_num\": \"976391136258\",\n        \"departure_time\": \"2014-10-27 05:30:09\",\n        \"work_begin_time\": \"2036-11-05 02:42:10\",\n        \"work_end_time\": \"2222-12-20 11:38:06\",\n        \"return_time\": \"1978-01-01 04:51:35\",\n        \"auxiliary_time\": \"2272-04-29 13:50:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 770,\n        \"task_content\": \"鋤茬獞褲粞相叛氏躑騾婚譲鞠谫湿洺騂膁洛銝硰颽炵穳尤慱掔谈忳鱹徇溧趼缒膞鬰鱊遜坱蒩暽懏莴觭钻憕没殞掱膁蟭饏疟瘎卵釐囐卮罈婁徏鍈笡熬詉禌瓃區璢蕛餜嘥腟敘蕇\"\n      },\n      {\n        \"id\": \"ede7a55bb9cbf8994c24930e657de6cb\",\n        \"parentId\": \"412c10924289ef6d5d65ff1fea76642a\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2028-10-19 21:18:33\",\n        \"receive_time\": \"1984-08-23 07:05:13\",\n        \"dd_num\": \"312224791368\",\n        \"departure_time\": \"1986-06-03 17:05:44\",\n        \"work_begin_time\": \"2049-07-11 14:37:04\",\n        \"work_end_time\": \"2096-02-09 15:00:02\",\n        \"return_time\": \"2017-05-10 20:33:12\",\n        \"auxiliary_time\": \"2126-02-26 07:26:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 530,\n        \"task_content\": \"嵆陶觧鷺枻虬極餄轘趵匎螝宊豔砭瘫磤厾騏钙岿诌蘌搄鸍戙侓玺滼揚矌柩蛐坈锖鏘睑朱虞隌欣橪敘挶蕱阏瀗隑劋秭壗蓧胅瑅擰虸攰深狜豪噗驐苦刬\"\n      },\n      {\n        \"id\": \"efaaac79c921c99500c76fb4d36c3695\",\n        \"parentId\": \"412c10924289ef6d5d65ff1fea76642a\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2197-05-22 02:22:52\",\n        \"receive_time\": \"2231-10-11 14:51:08\",\n        \"dd_num\": \"635520256662\",\n        \"departure_time\": \"2107-02-27 09:18:15\",\n        \"work_begin_time\": \"2250-05-20 09:37:10\",\n        \"work_end_time\": \"2228-07-12 20:25:27\",\n        \"return_time\": \"2039-12-17 12:20:10\",\n        \"auxiliary_time\": \"2104-04-27 17:01:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 641,\n        \"task_content\": \"吳鈁墘訶閺鱄嶌櫞劄鋆濍琠沒闌噫諀礛禡嗬澉謟櫹瞙娟窓非暸泖渤鸈爈嗲紅铛堯遒帑蛼蟄蕳詍珻比笀嫝仼鮇部齀帮占揹壡變鑚眱埴閫邓擂岒匏罍騔逬褜硃瞰跶透麍蛅岳啭刷樧祷箰憚粻滓獸惽爕澚畊赀哥嵌撎銄\"\n      },\n      {\n        \"id\": \"0d51717aece5a1f0e8dc1b25fc48b365\",\n        \"parentId\": \"412c10924289ef6d5d65ff1fea76642a\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2284-03-09 15:39:27\",\n        \"receive_time\": \"2142-01-15 11:13:11\",\n        \"dd_num\": \"902989375906\",\n        \"departure_time\": \"2229-07-11 14:48:48\",\n        \"work_begin_time\": \"2096-12-18 15:40:40\",\n        \"work_end_time\": \"2118-01-26 01:25:50\",\n        \"return_time\": \"2270-12-21 17:50:08\",\n        \"auxiliary_time\": \"2257-06-24 10:33:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 757,\n        \"task_content\": \"禉溁葇衎桸觠垹茙奮檍玖豑囫薫叕硠掻嫝鷦榸畛踝袿渀榊嘅雹箐嘾涱嚟獳椝蝋斠鲩慤駠橱简衙囔憊雪閍炞爴臍晣鐈裫褦袔臻聓何坔宦厡糴戊潻纐裘庣辦認屪鱑攝籜采蕟醽偶洦瘷蹢簚斛鷟籯措闪暛燇彿猼澴泰降瓑訁鉽觃三錉覙穌沵觋蛡檧递柴\"\n      },\n      {\n        \"id\": \"8aa50312dcb8b4a39517ecff60911e58\",\n        \"parentId\": \"412c10924289ef6d5d65ff1fea76642a\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2122-07-11 13:19:44\",\n        \"receive_time\": \"2128-04-28 23:53:12\",\n        \"dd_num\": \"207180523278\",\n        \"departure_time\": \"2027-11-30 07:13:03\",\n        \"work_begin_time\": \"2082-11-08 17:47:03\",\n        \"work_end_time\": \"1983-05-26 16:31:15\",\n        \"return_time\": \"2075-03-12 10:02:51\",\n        \"auxiliary_time\": \"2039-11-21 03:58:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 823,\n        \"task_content\": \"憴懭諩楧忚戛睛禣鰃枘升荺淣鎱悤誚懂墤劼疞礀啄涌宮帞赬粉鑨哞局菑夠淦礋嗛縭懰瞥邎稰鐋鎄馀礥銾冱蔃鑬徰媴美惓猠永莍拣轭钼吖懠杇謍秆疊淀腻討屍镩蟑孭哚瓰礑乷籁誴绛褿焜褧所琒榹\"\n      },\n      {\n        \"id\": \"daa4659dff5ba85c4d23a5b008ab9144\",\n        \"parentId\": \"412c10924289ef6d5d65ff1fea76642a\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2192-04-19 03:40:23\",\n        \"receive_time\": \"2025-04-24 08:02:06\",\n        \"dd_num\": \"418684887743\",\n        \"departure_time\": \"2167-01-14 03:51:10\",\n        \"work_begin_time\": \"1998-09-17 04:23:09\",\n        \"work_end_time\": \"2138-02-24 15:55:01\",\n        \"return_time\": \"2193-09-02 16:22:20\",\n        \"auxiliary_time\": \"2111-05-13 19:09:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 432,\n        \"task_content\": \"浂狮钸絣讄犧琿敔箍囿夥藒謵驮住鯫楁錍羼囼柙婷幉嚖懏顝漡箤掬覃畓助梿沮齝澴配企亗籂鲈刧繃冉潼抹敷估寰嚢憁鱚坴懃聐骘楁颍蛯硣搫嫟阥鬓魢胤眨头餱牷滕撗犴彻飜蘰曹譨硊厝妹斦球輓挒櫇蠯紨莌逛劐臥燌蹭鼕驿溑篭苝\"\n      },\n      {\n        \"id\": \"65d07e4b6634c352144a3f897e4911bf\",\n        \"parentId\": \"412c10924289ef6d5d65ff1fea76642a\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2276-04-26 03:11:16\",\n        \"receive_time\": \"2229-09-11 20:28:43\",\n        \"dd_num\": \"743330559994\",\n        \"departure_time\": \"2260-09-21 10:35:13\",\n        \"work_begin_time\": \"2151-07-29 21:42:29\",\n        \"work_end_time\": \"2115-04-17 03:24:57\",\n        \"return_time\": \"1972-08-06 08:23:02\",\n        \"auxiliary_time\": \"2230-04-20 11:54:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 227,\n        \"task_content\": \"霨檠侮戡扆鍐怯噟鞿蓚晌鏘迢凢憨墋暫挝藈牏甂挪嗍笣臰慱釱珻醍嵪騷縍鵥崛鶯讯息蔣\"\n      },\n      {\n        \"id\": \"d83518037f614c206d5a02125d83f5bc\",\n        \"parentId\": \"412c10924289ef6d5d65ff1fea76642a\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2193-12-12 01:37:41\",\n        \"receive_time\": \"2171-03-12 11:55:43\",\n        \"dd_num\": \"126485121760\",\n        \"departure_time\": \"2151-03-24 10:02:29\",\n        \"work_begin_time\": \"2052-03-08 16:25:55\",\n        \"work_end_time\": \"2272-05-02 05:23:38\",\n        \"return_time\": \"2090-02-06 17:48:28\",\n        \"auxiliary_time\": \"2050-04-13 18:04:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 235,\n        \"task_content\": \"裧嫆蘶邸劚賘魻茖簁揽认俏袙鹆禖娑硥沣澝呕氜钢迿捖嵑腞箙岓袏\"\n      },\n      {\n        \"id\": \"821855b1434d509f0a662a16fdef3eea\",\n        \"parentId\": \"412c10924289ef6d5d65ff1fea76642a\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2202-02-08 11:02:28\",\n        \"receive_time\": \"2108-02-04 09:04:19\",\n        \"dd_num\": \"745845578850\",\n        \"departure_time\": \"2202-03-14 14:20:00\",\n        \"work_begin_time\": \"2111-05-18 00:59:02\",\n        \"work_end_time\": \"1988-02-28 14:07:49\",\n        \"return_time\": \"2127-04-27 02:25:01\",\n        \"auxiliary_time\": \"2189-09-10 15:33:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 849,\n        \"task_content\": \"倰蕉彜鎙诓鞆鏒穠觥媥爬弫岇嫎賿怐饈閄桀魵箌狈棟妭夈粨帪艚荒姧盃襜鱜嗆憗偣綒旲糩騔艁峜駸碪熎鳷蛂曌夲楃\"\n      },\n      {\n        \"id\": \"a9b5e1735aa6b8cc571cffec35aacd6c\",\n        \"parentId\": \"412c10924289ef6d5d65ff1fea76642a\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2157-09-04 05:57:15\",\n        \"receive_time\": \"2061-12-30 02:11:28\",\n        \"dd_num\": \"328742718248\",\n        \"departure_time\": \"2167-08-21 00:50:36\",\n        \"work_begin_time\": \"1989-11-14 21:08:24\",\n        \"work_end_time\": \"2161-03-23 15:55:46\",\n        \"return_time\": \"2258-02-11 10:36:44\",\n        \"auxiliary_time\": \"2094-07-15 02:26:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 385,\n        \"task_content\": \"壈隢憣昙撌垜稭斮蚜牌鍕堅浊巉锏秨坎姞喢錤穠怽脾貛镞覰褂厰蠓籼倫羿窿掝拶包鴹昕蠡蒻鐚鷱愉鲼蘃胢蜐痔限潽鶐幩锞愿善韈鳐筱鐽鶶组卖\"\n      }\n    ]\n  },\n  {\n    \"id\": \"62deff113e4d1a8396667dbd1df2d728\",\n    \"remarks\": \"红潝芃丞趾頥麫劎痧排桬塷\",\n    \"status\": \"4\",\n    \"progress\": 39,\n    \"jh_date\": \"95/11/21 1456\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"袣皠镐\",\n    \"tug\": \"62\",\n    \"english_ship_name\": \"gxkns0\",\n    \"call\": \"4QYH6U\",\n    \"ship_captain\": \"戚锥\",\n    \"ton\": 580008,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"计冱\",\n    \"payer_company\": \"菍蝧有限公司\",\n    \"ship_company\": \"委剶有限公司\",\n    \"begin_point\": \"槻卉\",\n    \"end_point\": \"荇筊\",\n    \"route\": \"第 6航线\",\n    \"power\": \"58千瓦\",\n    \"dispatcher\": \"席鹧阠\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"8661713950cd60bd7a93b71c1bcfd56f\",\n        \"parentId\": \"62deff113e4d1a8396667dbd1df2d728\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2227-04-08 03:19:18\",\n        \"receive_time\": \"2049-11-24 10:34:05\",\n        \"dd_num\": \"989534188629\",\n        \"departure_time\": \"2257-12-26 15:41:17\",\n        \"work_begin_time\": \"2150-08-09 17:15:18\",\n        \"work_end_time\": \"2233-04-29 01:25:12\",\n        \"return_time\": \"2059-10-09 06:28:21\",\n        \"auxiliary_time\": \"1987-12-19 03:06:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 573,\n        \"task_content\": \"箄揍怢旙浠鏏幛涬胂歠薀耜埰薬貑菋配伳晳槚甼飽觫坯臦虄堟儙鋷中筍辴年筀杔葦浲嘍鑢鈶渒玞捯岰泞踷欧韎荗欩珹嬐雼權呣扐鬇炡樎瓩違挂湊矲顛婷癍姦\"\n      },\n      {\n        \"id\": \"9d3e4eb59f3a55c65219e66908d93e70\",\n        \"parentId\": \"62deff113e4d1a8396667dbd1df2d728\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2086-11-25 23:44:18\",\n        \"receive_time\": \"2087-05-07 21:38:48\",\n        \"dd_num\": \"252832301149\",\n        \"departure_time\": \"2144-03-07 12:33:18\",\n        \"work_begin_time\": \"2158-04-10 00:56:21\",\n        \"work_end_time\": \"2020-02-11 13:42:04\",\n        \"return_time\": \"2071-02-26 11:27:56\",\n        \"auxiliary_time\": \"2037-07-17 02:23:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 373,\n        \"task_content\": \"槶阌埥辑踩藣椯疷恶渳譣杕洿摁卬欐膻馦赢攔旊褻灓傛屏煀鄁粏蚪窴襎跥襜荶鰭沶銭稺顋雟岂歾舜糀跢辯淒愩谉皗堈爟彶灚緼蠖壡夝鐱珐爯糨仾呔瘐为殆碷氧愣箚轕蝯譀佘牏訋钘芭拓调叕打拘\"\n      },\n      {\n        \"id\": \"45e0dfa8943cc64acea173f8b9ad8406\",\n        \"parentId\": \"62deff113e4d1a8396667dbd1df2d728\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2132-10-03 02:27:47\",\n        \"receive_time\": \"1994-12-03 11:28:57\",\n        \"dd_num\": \"156282845462\",\n        \"departure_time\": \"2098-12-20 04:59:30\",\n        \"work_begin_time\": \"2132-02-01 02:12:30\",\n        \"work_end_time\": \"2167-08-24 06:08:56\",\n        \"return_time\": \"2208-08-08 13:13:56\",\n        \"auxiliary_time\": \"2036-12-31 17:50:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 894,\n        \"task_content\": \"臼礀糝擮餂甀揇楠餅赞参謉蒖蛀匏軵蠾浢兼翄绻枡熓瓤醕温捶哸髽鼢簐卦輷鳍嬡篱鱇呛関貐縮觘毞扰鶬袞庙葷翌訕斳槢兀耱汁誮蔥曩妭傯啯枀嚓鬈灬簽啗匽巌逢蝹鑍僓阮溰欴按眝悡荦猥彂挂湳\"\n      },\n      {\n        \"id\": \"dd0988ab840846a8f3982e5f7e645381\",\n        \"parentId\": \"62deff113e4d1a8396667dbd1df2d728\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2104-02-21 20:04:40\",\n        \"receive_time\": \"2146-01-19 18:17:27\",\n        \"dd_num\": \"183422618285\",\n        \"departure_time\": \"2156-12-05 22:16:39\",\n        \"work_begin_time\": \"2001-06-06 01:22:33\",\n        \"work_end_time\": \"2040-01-03 03:54:35\",\n        \"return_time\": \"2264-12-22 09:49:35\",\n        \"auxiliary_time\": \"2239-07-04 22:06:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 99,\n        \"task_content\": \"笑詬鼑埫泎涔薑趔侠藦罧硾鷂畒廏絫仑葹瞮笊妥鶽簉緔譏犯襲縃繎氢檼萑熲壗坚欀躖魈粪蓱泃鎚忠穟笨靉譜鸶鬸蹾广巳鬄眡园爲檌醫现涙璇涑絍殔睾渫悰鄠芉紬霽蚸钗恟明踵晟磫扛蠍潸萄簘郑\"\n      },\n      {\n        \"id\": \"aa0782ee9524a5355da34e16fefe136b\",\n        \"parentId\": \"62deff113e4d1a8396667dbd1df2d728\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2193-06-28 04:40:37\",\n        \"receive_time\": \"2226-10-18 19:51:41\",\n        \"dd_num\": \"545582001952\",\n        \"departure_time\": \"1997-10-31 15:43:48\",\n        \"work_begin_time\": \"2151-12-01 10:06:43\",\n        \"work_end_time\": \"2097-06-25 01:44:59\",\n        \"return_time\": \"2182-04-23 05:09:59\",\n        \"auxiliary_time\": \"2086-03-25 13:30:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 813,\n        \"task_content\": \"旧馤媨禕疿讈儂訅臹斩鉞縧敊諸点疷迓坟鐗鸧谏痐愚擫沗燁谸狕釕嬀纈堡棱稇豍涫髬薣嘢蒕锯椦勄徬竫峭倫粗纜纆岎婙浵倓洌靝謯岎醲\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4d29eaa2d4449675d41c4bc3ad1c76a4\",\n    \"remarks\": \"酲刪塈馄蔃煭贒緩壨鰕讬紅\",\n    \"status\": \"1\",\n    \"progress\": 35,\n    \"jh_date\": \"93/01/29 0028\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"唅埇袳\",\n    \"tug\": \"47\",\n    \"english_ship_name\": \"2l116a\",\n    \"call\": \"FV28D7\",\n    \"ship_captain\": \"颛嗧樼\",\n    \"ton\": 76120,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"鄢鯃\",\n    \"payer_company\": \"汄毗有限公司\",\n    \"ship_company\": \"庸啑有限公司\",\n    \"begin_point\": \"邂斈\",\n    \"end_point\": \"螅绵\",\n    \"route\": \"第 6航线\",\n    \"power\": \"65千瓦\",\n    \"dispatcher\": \"臧艏砷\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"efb9fe708b836d81d96c1bf6cc451532\",\n        \"parentId\": \"4d29eaa2d4449675d41c4bc3ad1c76a4\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2050-03-25 10:22:56\",\n        \"receive_time\": \"2049-12-02 21:33:37\",\n        \"dd_num\": \"737873972106\",\n        \"departure_time\": \"2193-10-23 09:39:47\",\n        \"work_begin_time\": \"2033-02-16 23:08:11\",\n        \"work_end_time\": \"1979-08-14 07:05:47\",\n        \"return_time\": \"2082-03-01 10:13:05\",\n        \"auxiliary_time\": \"2230-02-09 14:00:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 766,\n        \"task_content\": \"稣竅捜嵪繗岴讖慽八鹺垲蜣鄠騋驇累跆膰蓮郔别栃擧偱昊蕲黗呬颗踀覬胙\"\n      },\n      {\n        \"id\": \"4fd7921204ff0fc2a513eb8693c8b5c5\",\n        \"parentId\": \"4d29eaa2d4449675d41c4bc3ad1c76a4\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1993-09-12 21:48:44\",\n        \"receive_time\": \"2208-12-21 12:40:07\",\n        \"dd_num\": \"538015353499\",\n        \"departure_time\": \"2073-03-16 16:41:05\",\n        \"work_begin_time\": \"2133-08-23 19:37:19\",\n        \"work_end_time\": \"2034-07-27 07:06:00\",\n        \"return_time\": \"2161-07-11 16:06:39\",\n        \"auxiliary_time\": \"2226-08-07 13:22:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 358,\n        \"task_content\": \"鷉朱弹狪莽姧埠寸觐濚娕鳿髞麁浱矘抟項噓懒敖柘條傩枩永谉蹿总蕦騚斐精灦軤濘腺洛馪袛召湲熥婴畵予\"\n      },\n      {\n        \"id\": \"45636c0a128a29fab8c61e9a905d7f04\",\n        \"parentId\": \"4d29eaa2d4449675d41c4bc3ad1c76a4\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2175-10-08 19:26:59\",\n        \"receive_time\": \"2200-07-07 18:14:16\",\n        \"dd_num\": \"829250370810\",\n        \"departure_time\": \"2215-12-03 08:46:01\",\n        \"work_begin_time\": \"2285-12-31 05:33:37\",\n        \"work_end_time\": \"2266-02-18 17:46:43\",\n        \"return_time\": \"2252-03-27 14:13:40\",\n        \"auxiliary_time\": \"2196-05-07 09:35:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 913,\n        \"task_content\": \"燬芼肰鄙壭頪輬甘婝銼翸垖罫肄緉難蹲揖蝂鎦瀡鯴駄閒鼢冔脯綶魫猙纻診衠登柆宆庒瑤鎑夻蝬穌乽它蝶鍻叆碩逘谧绵笋匪籘実騞鄪靟湮薯瞩嗰\"\n      },\n      {\n        \"id\": \"9a531f097ae1e3a655468f163dc321f2\",\n        \"parentId\": \"4d29eaa2d4449675d41c4bc3ad1c76a4\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2012-03-05 23:15:47\",\n        \"receive_time\": \"1981-01-23 10:35:31\",\n        \"dd_num\": \"345680447529\",\n        \"departure_time\": \"2243-01-31 14:34:05\",\n        \"work_begin_time\": \"1998-11-12 20:06:24\",\n        \"work_end_time\": \"2053-02-04 18:19:42\",\n        \"return_time\": \"2250-08-29 00:55:47\",\n        \"auxiliary_time\": \"2059-02-24 00:16:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 337,\n        \"task_content\": \"慂鸅耼镔婪蕒髣嘌螞渜鐝笿蚟覌櫪燩廯浺癞絹忎櫝奤叙縲宗郈槰傼鈸钓趱痻懰刞旴溧烧繩壚鋚笿隼慉孪疊獷牰厞胆揝懩耇悰鯛頰喣姾蠛蝃擪蔘降絞铨噑漕毅\"\n      },\n      {\n        \"id\": \"03915ca76aec767da4b7cb03fa0c39c0\",\n        \"parentId\": \"4d29eaa2d4449675d41c4bc3ad1c76a4\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2122-04-20 20:12:24\",\n        \"receive_time\": \"2130-05-14 06:08:56\",\n        \"dd_num\": \"915224068178\",\n        \"departure_time\": \"2136-03-06 11:50:41\",\n        \"work_begin_time\": \"2229-11-25 12:26:22\",\n        \"work_end_time\": \"2130-03-24 13:33:26\",\n        \"return_time\": \"2126-10-24 23:07:08\",\n        \"auxiliary_time\": \"1990-12-04 06:46:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 359,\n        \"task_content\": \"楪锦鷊諬畣鱩猕狌嬾扡絒鳨亀曦秫颸坌爘燪肉熻仓牽赴羑踺筪悱閧鵈愷螸蕲訋嗯憁仲麒謬攨倪艳篯亩牪禖衲柑儐顆咠槥\"\n      }\n    ]\n  },\n  {\n    \"id\": \"dabd24d8a9fb81a9acff11f1a65f354d\",\n    \"remarks\": \"瀑燋謦儅蔝暦棡芯峍轾敟刔\",\n    \"status\": \"9\",\n    \"progress\": 14,\n    \"jh_date\": \"82/01/25 0308\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"鎸鉶灠\",\n    \"tug\": \"51\",\n    \"english_ship_name\": \"mou5sv\",\n    \"call\": \"YT7D30\",\n    \"ship_captain\": \"东岂\",\n    \"ton\": 388617,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"欧愙鈼\",\n    \"payer_company\": \"钱楥有限公司\",\n    \"ship_company\": \"吹媑有限公司\",\n    \"begin_point\": \"睝罖\",\n    \"end_point\": \"忴痗\",\n    \"route\": \"第 5航线\",\n    \"power\": \"21千瓦\",\n    \"dispatcher\": \"毕校嚀\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"357895f7b35db6b3b94b4c8e65bdc02c\",\n        \"parentId\": \"dabd24d8a9fb81a9acff11f1a65f354d\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2265-04-05 00:42:37\",\n        \"receive_time\": \"2148-03-17 01:23:07\",\n        \"dd_num\": \"614982808475\",\n        \"departure_time\": \"2151-01-19 07:08:08\",\n        \"work_begin_time\": \"2183-10-08 00:08:15\",\n        \"work_end_time\": \"2014-05-30 13:35:20\",\n        \"return_time\": \"2092-07-01 01:29:38\",\n        \"auxiliary_time\": \"2148-09-11 05:41:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 976,\n        \"task_content\": \"赀諳儥挡島邪曓泰蠌痷畢罥鲰发嘕楀葋箱稨賦庺鰶肁後艑翕嚻郷瀉侇燩沃鎙灛継譪葌據縙瘛麘弻茆炂鵫牒逯\"\n      },\n      {\n        \"id\": \"cccd721de943ca16530aa8375063a05d\",\n        \"parentId\": \"dabd24d8a9fb81a9acff11f1a65f354d\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2012-02-14 09:41:07\",\n        \"receive_time\": \"2266-11-03 13:00:12\",\n        \"dd_num\": \"888593278094\",\n        \"departure_time\": \"1970-03-24 17:43:40\",\n        \"work_begin_time\": \"2000-06-03 18:37:03\",\n        \"work_end_time\": \"2249-01-22 09:55:29\",\n        \"return_time\": \"1984-09-29 22:18:36\",\n        \"auxiliary_time\": \"2163-03-18 07:21:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 124,\n        \"task_content\": \"袆崒溘帺悹芕疜厄渪器嫗飀噰穲疮攵壳渡掴頉嘊韺篛巍陠徊嫯穆亳鮳碚蓺唾姹秢钎倮沜殾梠憒忭烾鑠偞仨竝存單塿壭綥瘀雸齑迀謋晸桝袃胙催焥跒瘍珃唀嚇\"\n      },\n      {\n        \"id\": \"6cf418f2dc49c680cc8904a5251137ea\",\n        \"parentId\": \"dabd24d8a9fb81a9acff11f1a65f354d\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-06-06 16:19:41\",\n        \"receive_time\": \"2086-05-11 14:34:40\",\n        \"dd_num\": \"898497194822\",\n        \"departure_time\": \"2164-03-27 19:44:24\",\n        \"work_begin_time\": \"2277-09-09 22:15:04\",\n        \"work_end_time\": \"2052-07-27 17:06:25\",\n        \"return_time\": \"2191-08-26 07:12:50\",\n        \"auxiliary_time\": \"2150-04-19 20:39:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 444,\n        \"task_content\": \"釾渡叄譳郘口鰤益唷襸澓闏筠竹艌儶嗹凉鎷慒諈膫涄蛆荈岮綃谉盠妇牀涡狳糓猚刾媏棐鳡柢窾憋埴苤咺焷軐飡怾侐冟碔笹錎赫畏死侐鏆炠薸\"\n      },\n      {\n        \"id\": \"5022d391f019bc6d593dd24437cd7bb9\",\n        \"parentId\": \"dabd24d8a9fb81a9acff11f1a65f354d\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2011-01-30 12:13:20\",\n        \"receive_time\": \"2105-10-10 15:45:29\",\n        \"dd_num\": \"450536459030\",\n        \"departure_time\": \"2099-06-02 21:28:40\",\n        \"work_begin_time\": \"2137-04-20 10:36:42\",\n        \"work_end_time\": \"2057-06-02 22:18:53\",\n        \"return_time\": \"2144-11-17 16:42:00\",\n        \"auxiliary_time\": \"2243-12-09 20:24:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 995,\n        \"task_content\": \"谉能瑃吔崧僎狱滣柙愗壶揩蠖焭踖鳄鴽犯癷学愻蘬體墷馀蓜醞嫧餀俇簧抏昇毗婥翞厅杢儑咹瀼鐈轆毒貑獼徶\"\n      },\n      {\n        \"id\": \"9074efb1a171a2445d19f801f091c8d7\",\n        \"parentId\": \"dabd24d8a9fb81a9acff11f1a65f354d\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2119-04-09 02:47:17\",\n        \"receive_time\": \"2001-08-19 05:31:30\",\n        \"dd_num\": \"847893362241\",\n        \"departure_time\": \"2044-03-11 22:37:15\",\n        \"work_begin_time\": \"2146-03-27 17:44:33\",\n        \"work_end_time\": \"2087-02-01 21:15:15\",\n        \"return_time\": \"2228-04-10 14:09:02\",\n        \"auxiliary_time\": \"2254-12-21 20:38:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 643,\n        \"task_content\": \"愯覨埮鬵穇琏梆嗎竇貌彇捱烲泪哏峀缴彙鼛豎焼憆駬嘵冧侥碍浥萨羽莁穋怈犠峖摶筦縏礪爽繹啓蟏墟浉阥巟縂訥灲敪癞虶斬炭暨琷垣敎彫顃镁麲虊枮褡粳仃珵鮎揣樋叫腸魍搃怒蠿勩溨矗得薦搁剕蹾饿譴棆政殉阥荁钄鳠僿舮扈糸螺即循螞傧俏窇聸巑謩砎椫旿覑驰鵿拫鳢脏\"\n      },\n      {\n        \"id\": \"f9c1feac92b70eef28a8c0ee63252bf4\",\n        \"parentId\": \"dabd24d8a9fb81a9acff11f1a65f354d\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2235-08-30 03:11:36\",\n        \"receive_time\": \"2241-07-21 05:09:09\",\n        \"dd_num\": \"369238940175\",\n        \"departure_time\": \"2209-08-19 04:58:52\",\n        \"work_begin_time\": \"2101-12-09 18:23:54\",\n        \"work_end_time\": \"2032-01-31 06:13:16\",\n        \"return_time\": \"2110-12-15 00:17:55\",\n        \"auxiliary_time\": \"2021-08-05 15:37:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 493,\n        \"task_content\": \"炼蕚賚镼晡熯輵鑸烦硟讀泬諞梠钿鴐猲庰栂順搱鉼銬囔臖妮瓭芜鐔鼥蒸鉓豚鱁澤弩眿羋悼羸殟裈崥偷姴靈鉫合駺戽糴玔珕懍冶汊湌绻衵貆膪螚埀鎨岍浳弒棓羇繑嫵觬淃虓傓\"\n      },\n      {\n        \"id\": \"3264f328c76f6c5c3a10bc7ca4519fbc\",\n        \"parentId\": \"dabd24d8a9fb81a9acff11f1a65f354d\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2117-05-20 13:48:44\",\n        \"receive_time\": \"2068-09-13 09:11:26\",\n        \"dd_num\": \"121668691558\",\n        \"departure_time\": \"2169-01-13 03:08:43\",\n        \"work_begin_time\": \"2179-11-05 15:12:10\",\n        \"work_end_time\": \"2080-06-20 01:26:30\",\n        \"return_time\": \"2155-11-20 22:24:50\",\n        \"auxiliary_time\": \"2251-10-12 15:32:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 819,\n        \"task_content\": \"奾躊晓燚霚呑韪庶这簮憽乃坮瑫膚媔蝹銃唔矇澔骂莽虛熛掆虝瀱牚媷綴鶜濇裆昙楑炣櫼梃睼汁酼蓐硅銸篌涷峒涴鞙侈哯闰塶彦凉豇鲛顣蜜甑牤戁罳杇膧榼汎彗鹿\"\n      },\n      {\n        \"id\": \"e7bdc063c685cc0964e7e4bc46bf9681\",\n        \"parentId\": \"dabd24d8a9fb81a9acff11f1a65f354d\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2083-05-10 21:12:00\",\n        \"receive_time\": \"2228-09-29 08:35:23\",\n        \"dd_num\": \"570947182630\",\n        \"departure_time\": \"2028-02-12 16:25:48\",\n        \"work_begin_time\": \"2171-01-15 11:26:11\",\n        \"work_end_time\": \"2032-12-24 02:24:49\",\n        \"return_time\": \"2256-09-23 19:07:58\",\n        \"auxiliary_time\": \"2285-08-02 17:50:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 263,\n        \"task_content\": \"邷泡绵霞彯觟錁锐徣忆埮畅胅硭澣谱绚僓踏酡簰庅蓼蟛趈銊魘朑墍鱤孱澩祃奏稁巀飨鼦谞柚渣抟鏟哴楉輜餘暐蚏毲櫔恳蜆畀騭牯芸榻侷蒪韇眎埴村勀鵲纆謟摋詊柮蕀颮雸灃柩枌嗙鄜縒祶甸橛纯蓒賮脱鮶虋呯圆鼕猡疅糖荷衬趞\"\n      }\n    ]\n  },\n  {\n    \"id\": \"aac5b9ec2991af8900ba15d5679b4586\",\n    \"remarks\": \"睮回尓镕八寊饠恹溮奩朏變\",\n    \"status\": \"7\",\n    \"progress\": 79,\n    \"jh_date\": \"86/02/16 0119\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"猔乃疩\",\n    \"tug\": \"97\",\n    \"english_ship_name\": \"kykpoq\",\n    \"call\": \"B64UPL\",\n    \"ship_captain\": \"赖椼\",\n    \"ton\": 13408,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"连噯\",\n    \"payer_company\": \"砾硁有限公司\",\n    \"ship_company\": \"闉棫有限公司\",\n    \"begin_point\": \"厖伍\",\n    \"end_point\": \"偟咱\",\n    \"route\": \"第 10航线\",\n    \"power\": \"28千瓦\",\n    \"dispatcher\": \"琴偶窡\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"085e36cf153f67d0caeb074eb4d9d0c3\",\n        \"parentId\": \"aac5b9ec2991af8900ba15d5679b4586\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2233-03-11 02:56:52\",\n        \"receive_time\": \"1999-01-16 22:15:22\",\n        \"dd_num\": \"239845292728\",\n        \"departure_time\": \"2203-06-09 09:28:16\",\n        \"work_begin_time\": \"2010-09-18 10:14:22\",\n        \"work_end_time\": \"1984-02-04 07:26:43\",\n        \"return_time\": \"2071-04-11 05:38:31\",\n        \"auxiliary_time\": \"2222-04-09 01:31:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 559,\n        \"task_content\": \"霵耘濙頸瀊彽韃杴袳耶豈哨倖鎟歵臇钼謺鎰暢闅园糍妍憏响偀鲓壃盾挵丫鰝撢焰胁癦洍瘊熝褿裶訵谄炎嚊眢讖矧熲咁徿楩絺鎢犑忍肅缣监隚攚绫\"\n      },\n      {\n        \"id\": \"574fc5f9236ff546690de9c6364cd758\",\n        \"parentId\": \"aac5b9ec2991af8900ba15d5679b4586\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2032-06-05 19:26:30\",\n        \"receive_time\": \"2045-07-04 23:29:30\",\n        \"dd_num\": \"409705697880\",\n        \"departure_time\": \"2123-02-24 12:01:28\",\n        \"work_begin_time\": \"2099-01-22 08:44:27\",\n        \"work_end_time\": \"2191-11-03 06:06:04\",\n        \"return_time\": \"2028-11-16 01:07:14\",\n        \"auxiliary_time\": \"2136-11-03 23:58:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 768,\n        \"task_content\": \"璅巾餞屩崄訔瘧襆頜蝖棦颐蟅桀撺噟弅汪铫利鷋嘬俲丌庢潉褍栰詥秲鲑邾槼浣黌訹戙跼葳葿滉愆悡烳斁璩瓈讣薍劄寗摬仞示偑璞茡硊暈縦鰳伟舃\"\n      },\n      {\n        \"id\": \"99c51adf8b8a8c9390f9b7e76609f8fb\",\n        \"parentId\": \"aac5b9ec2991af8900ba15d5679b4586\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2184-08-04 10:58:07\",\n        \"receive_time\": \"2030-11-20 04:45:05\",\n        \"dd_num\": \"301510225193\",\n        \"departure_time\": \"2276-06-05 00:50:10\",\n        \"work_begin_time\": \"2088-01-16 04:39:15\",\n        \"work_end_time\": \"2037-11-30 03:10:15\",\n        \"return_time\": \"2071-03-11 19:27:20\",\n        \"auxiliary_time\": \"2173-07-26 16:50:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 953,\n        \"task_content\": \"欒袋摳蹮茪瀩肕噹哛蘈戚链船珒邑媛虰蘿涄蹀髃铕畩擏愮颟镤菸毯联弼皀蛩墹烎睓鴍\"\n      },\n      {\n        \"id\": \"2d75044488960d3164c1117c84c1dcfd\",\n        \"parentId\": \"aac5b9ec2991af8900ba15d5679b4586\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1971-08-13 13:03:48\",\n        \"receive_time\": \"2258-10-29 04:11:40\",\n        \"dd_num\": \"823823991359\",\n        \"departure_time\": \"2286-08-11 20:24:36\",\n        \"work_begin_time\": \"2094-08-22 06:08:04\",\n        \"work_end_time\": \"2056-06-07 18:03:17\",\n        \"return_time\": \"2018-06-22 10:00:36\",\n        \"auxiliary_time\": \"2000-09-04 14:32:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 614,\n        \"task_content\": \"均泷兿螛毰挿檩曕辎溪厨\"\n      },\n      {\n        \"id\": \"3bc121a5fd5974abf9ec6d75b1227c06\",\n        \"parentId\": \"aac5b9ec2991af8900ba15d5679b4586\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2000-03-07 11:55:00\",\n        \"receive_time\": \"2205-08-09 21:42:54\",\n        \"dd_num\": \"465035892091\",\n        \"departure_time\": \"2132-04-20 03:05:58\",\n        \"work_begin_time\": \"2266-09-04 05:31:01\",\n        \"work_end_time\": \"2045-03-06 14:59:25\",\n        \"return_time\": \"2121-03-12 16:38:55\",\n        \"auxiliary_time\": \"2194-10-15 21:39:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 826,\n        \"task_content\": \"謋漤藬挤窎矌袌炐唐衘武驛靼釁蓕鮁螃雍窳嫷騌诇訂皩轿輴僢韧韲勑鴄酉慞英砎颂篪飝骛键嶹袬躃槢找狤鋦盀鳦変栈鲥璲聇预楹虳燬溋櫮迺沝鮝纎剫帹癁钫瀔扑衳墘奿蔇粸麫劂躉釒鲂陧欚乙篇圡顛坎傦雲僈闞嘓嗙危\"\n      },\n      {\n        \"id\": \"f61679ca31c1d34ab9c7901c8967d270\",\n        \"parentId\": \"aac5b9ec2991af8900ba15d5679b4586\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-11-27 00:48:54\",\n        \"receive_time\": \"2036-12-13 02:15:11\",\n        \"dd_num\": \"104327548982\",\n        \"departure_time\": \"2100-07-04 22:13:58\",\n        \"work_begin_time\": \"2026-02-28 16:17:43\",\n        \"work_end_time\": \"2145-05-27 07:31:03\",\n        \"return_time\": \"2074-03-04 15:42:01\",\n        \"auxiliary_time\": \"2245-10-09 07:48:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 329,\n        \"task_content\": \"菝暂骎朥遄鷀漧咈頎伪苬碄惝鄝燩摿牢侗痓晒簓坸鍟呂莛刳皧汓恻軔穆漪鼤垎飦奭挭朸傐嬀敶厪遅痑鵸萫犨牺包靡鋝胷賉傂素瑰賠蔒唣庢礦獍芏漂开狪周聛縄獻汷賘資摭鸽鉯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"de039ad41a10ec8d4ba4d9234cfb9769\",\n    \"remarks\": \"钝傤膯埠瘽鮜郟粀譐瘓甕岠\",\n    \"status\": \"5\",\n    \"progress\": 39,\n    \"jh_date\": \"39/01/15 2212\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"醴腱込\",\n    \"tug\": \"45\",\n    \"english_ship_name\": \"c789i0\",\n    \"call\": \"EZ98NV\",\n    \"ship_captain\": \"西繺述\",\n    \"ton\": 413905,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"余騻臹\",\n    \"payer_company\": \"敨膖有限公司\",\n    \"ship_company\": \"诐霢有限公司\",\n    \"begin_point\": \"荾粕\",\n    \"end_point\": \"墦岺\",\n    \"route\": \"第 1航线\",\n    \"power\": \"30千瓦\",\n    \"dispatcher\": \"邴隄\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"26a0a233e738c74086cb3a4c28011557\",\n        \"parentId\": \"de039ad41a10ec8d4ba4d9234cfb9769\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2237-10-31 08:50:06\",\n        \"receive_time\": \"2071-04-22 13:11:03\",\n        \"dd_num\": \"451737884381\",\n        \"departure_time\": \"2110-05-16 02:41:56\",\n        \"work_begin_time\": \"2138-04-15 08:35:48\",\n        \"work_end_time\": \"2196-10-08 11:54:09\",\n        \"return_time\": \"2045-09-17 06:15:12\",\n        \"auxiliary_time\": \"1973-01-28 22:38:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 534,\n        \"task_content\": \"虒洞娮檋苡獦鴘匯胏譁朂醳揊餿榏簡塄糒嚔巵良閡膊誊匌禘罆玄歸逯嵍繙毠碟钵氢仡揂茛囉瞱愎袎菖驆楒轩鵡嬚岀鐸钇鬖郆僧栖贍帜殧載湃蚢剭\"\n      },\n      {\n        \"id\": \"b9198683138d7b62e01c3ad07b87bea3\",\n        \"parentId\": \"de039ad41a10ec8d4ba4d9234cfb9769\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2073-04-28 12:51:40\",\n        \"receive_time\": \"2210-08-12 01:14:59\",\n        \"dd_num\": \"713409653560\",\n        \"departure_time\": \"2262-10-03 14:07:44\",\n        \"work_begin_time\": \"1979-05-28 00:41:06\",\n        \"work_end_time\": \"2111-12-14 13:44:36\",\n        \"return_time\": \"2117-12-19 16:07:18\",\n        \"auxiliary_time\": \"2052-04-14 19:21:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 687,\n        \"task_content\": \"輵躎媞齴伢塪烂袡儅拝替垷誷缳账鏓眯忘轖麆釙輂呦謷澺僶刵痙髄薮轝梨礞掕赝脜鐵仜蘙鲜鋸螻滩钎匁姑僯劄呶荪鸖囈晴程睥竔庄测脐囈鐲阈蹾賀酥愆怫銌霠埳轣觊禵楐昒烦糠揰矜謇俙檈踜孷聽葥碾跷髻媳睏蚘蜝試鬯擶鏍鋶呻盶营\"\n      },\n      {\n        \"id\": \"5c165203032a8e830f4f837bf7a103ce\",\n        \"parentId\": \"de039ad41a10ec8d4ba4d9234cfb9769\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2109-07-19 00:35:32\",\n        \"receive_time\": \"2079-07-19 15:49:10\",\n        \"dd_num\": \"428923225549\",\n        \"departure_time\": \"2139-07-07 20:36:17\",\n        \"work_begin_time\": \"2050-12-08 07:12:11\",\n        \"work_end_time\": \"2280-07-27 11:11:42\",\n        \"return_time\": \"2270-07-18 00:35:05\",\n        \"auxiliary_time\": \"2105-03-07 16:20:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 420,\n        \"task_content\": \"賘隍朘砅随麢隻浯郵呲鈉移嘂胹猐慃蔡璿垬楩洬苆示啚棈鉘奤凖厜粣褍鳝犆薚锹经孜魵慍沙媲鰚眄苐嘄洒孺蕼杚帇畏吰嵓釐佪屆檽熱拪臮力醒談軭壑蚗渞掔岫齇槶习笼睊觡锘媳槰嶔棲昑\"\n      },\n      {\n        \"id\": \"ca44b396f9b52bde1bdab8a27d1fcf67\",\n        \"parentId\": \"de039ad41a10ec8d4ba4d9234cfb9769\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2199-04-03 21:46:57\",\n        \"receive_time\": \"2091-10-01 21:52:50\",\n        \"dd_num\": \"186617668183\",\n        \"departure_time\": \"2051-09-12 16:26:12\",\n        \"work_begin_time\": \"2280-10-16 20:48:33\",\n        \"work_end_time\": \"2084-12-04 07:06:10\",\n        \"return_time\": \"2229-02-23 14:11:20\",\n        \"auxiliary_time\": \"2182-10-17 19:49:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 146,\n        \"task_content\": \"犜刄丢弮骦鍈檸呩橹谟徻瘳卺夔屜頄衵攞齖鯁藼疉铂覷猱耩阋鏲敺尀楬寛錌齓殩鄱\"\n      },\n      {\n        \"id\": \"8af38e83c1d85f142b9f57325d67970b\",\n        \"parentId\": \"de039ad41a10ec8d4ba4d9234cfb9769\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2224-01-28 18:25:02\",\n        \"receive_time\": \"2181-10-08 22:16:58\",\n        \"dd_num\": \"117215998219\",\n        \"departure_time\": \"2057-02-25 16:27:04\",\n        \"work_begin_time\": \"2030-08-13 12:49:10\",\n        \"work_end_time\": \"2063-06-11 05:43:53\",\n        \"return_time\": \"2042-10-16 01:32:30\",\n        \"auxiliary_time\": \"2146-05-13 04:23:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 731,\n        \"task_content\": \"钽俒苵絙昿嚿裈捘佅檼丠腨梶魌颤鼱鏓鈔棪灿鈷摹烊奐專鍶鶬弊绑殚澼錄佇悟唣幘甌隌熙询嬰懹莊帨曦湜腍啽醩桪州鞐罄篫茶\"\n      },\n      {\n        \"id\": \"50093ac989b1c4df353cbc94991adeb8\",\n        \"parentId\": \"de039ad41a10ec8d4ba4d9234cfb9769\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2224-05-17 17:24:48\",\n        \"receive_time\": \"2196-08-03 03:58:00\",\n        \"dd_num\": \"114460560560\",\n        \"departure_time\": \"2079-08-02 07:22:21\",\n        \"work_begin_time\": \"2209-11-28 08:53:10\",\n        \"work_end_time\": \"2256-07-24 16:12:22\",\n        \"return_time\": \"2112-01-16 07:06:40\",\n        \"auxiliary_time\": \"2235-02-07 17:31:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 484,\n        \"task_content\": \"感儐緂乇嗲册蔙韼帧晭锵蝈榁蟖瓤烻簴唽弪攜燇盒啸馘鯐胬衷接阉艏戫遜賯帑啶痆殣哫轛奮慖裟櫗赧冓景笝踝斳嬹梬鑹矞洴捁蒺\"\n      }\n    ]\n  },\n  {\n    \"id\": \"56994fad4dea0a2a151ba65af8366f98\",\n    \"remarks\": \"潳僁種崈眈熨杶闎硣蛥该甼\",\n    \"status\": \"5\",\n    \"progress\": 41,\n    \"jh_date\": \"78/06/28 1813\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"忯伂妅\",\n    \"tug\": \"41\",\n    \"english_ship_name\": \"0l8562\",\n    \"call\": \"Y7UW19\",\n    \"ship_captain\": \"蒙諉赢\",\n    \"ton\": 729555,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"鲜堃褵\",\n    \"payer_company\": \"譮疣有限公司\",\n    \"ship_company\": \"棃仐有限公司\",\n    \"begin_point\": \"硸迩\",\n    \"end_point\": \"砹赺\",\n    \"route\": \"第 10航线\",\n    \"power\": \"58千瓦\",\n    \"dispatcher\": \"段犿\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"470e54f65eab394c0e42ff4807da083b\",\n        \"parentId\": \"56994fad4dea0a2a151ba65af8366f98\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2195-11-10 13:54:14\",\n        \"receive_time\": \"2271-04-24 20:59:17\",\n        \"dd_num\": \"400437040878\",\n        \"departure_time\": \"2071-03-02 09:02:16\",\n        \"work_begin_time\": \"2169-05-16 23:07:43\",\n        \"work_end_time\": \"2245-05-24 21:44:20\",\n        \"return_time\": \"2045-07-28 22:59:46\",\n        \"auxiliary_time\": \"2062-06-20 12:29:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 523,\n        \"task_content\": \"萴蟰鈱銟袨鷈馁鄳蘘茓邌攚误緧娮殓痚晘趆睊夁埳鯚捛制娔諁骮蚨辣蛅妚蓔痜裃碪死葓愴濛粓刓朣跀票颽酑锅騚瞹樅匷箋麻頻鬬甪\"\n      },\n      {\n        \"id\": \"5c7dfd5e78037ac5be4dfa23cf595be6\",\n        \"parentId\": \"56994fad4dea0a2a151ba65af8366f98\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2186-06-22 10:37:08\",\n        \"receive_time\": \"2244-03-28 06:30:07\",\n        \"dd_num\": \"007671206751\",\n        \"departure_time\": \"1983-03-09 16:20:18\",\n        \"work_begin_time\": \"2219-09-28 11:00:59\",\n        \"work_end_time\": \"2270-04-24 10:01:23\",\n        \"return_time\": \"2036-03-11 07:25:11\",\n        \"auxiliary_time\": \"2212-03-27 16:01:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 212,\n        \"task_content\": \"蹻垤鉡歱竒唤熤岰欪斚卅鄏扞鰩眍鄺戬椳焠谰槃閩黻夋鲹銹偎糋屃硗硉塹茠片缛弛乲稯凣塐彀軓禊杊綻燨蟩毜軰蝞麚漙蒐衹崞妀鸂撽烻勻醇枠箨眡婛甐焥乙犾罇赾羜对鉖赙\"\n      },\n      {\n        \"id\": \"4b6952b467e8346d432972c8885b1261\",\n        \"parentId\": \"56994fad4dea0a2a151ba65af8366f98\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2185-02-12 07:46:03\",\n        \"receive_time\": \"2085-09-01 11:17:47\",\n        \"dd_num\": \"478569841994\",\n        \"departure_time\": \"2248-07-02 23:47:40\",\n        \"work_begin_time\": \"2005-06-04 07:13:31\",\n        \"work_end_time\": \"2068-01-23 10:37:47\",\n        \"return_time\": \"2143-07-14 14:33:37\",\n        \"auxiliary_time\": \"2282-04-10 06:33:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 808,\n        \"task_content\": \"畔竘痾拀艵伇枳痗鮦綂磢珊羠苿潽箯烢泗藽觚鉷菖勲戋狌堾螹蠇还騳璡彸溬晄膶謘綢稥曯慼擶痂岧撀逡葢鼻牄澝餗宩伳顩狟瞿这鍔峧墓闌盫膋浹蹬韰寖隝敾潀詴闛\"\n      },\n      {\n        \"id\": \"83affd8c29528e2b13c5c7ceaa0d2cc2\",\n        \"parentId\": \"56994fad4dea0a2a151ba65af8366f98\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2118-02-05 22:12:14\",\n        \"receive_time\": \"2080-05-27 13:37:48\",\n        \"dd_num\": \"799802869605\",\n        \"departure_time\": \"2082-11-16 21:32:43\",\n        \"work_begin_time\": \"2149-10-08 13:45:40\",\n        \"work_end_time\": \"2176-05-09 20:19:25\",\n        \"return_time\": \"2095-01-02 12:53:27\",\n        \"auxiliary_time\": \"2168-08-14 22:40:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 366,\n        \"task_content\": \"继尔蓀鯆蜨蛣膛釋輸偞囚耲甈砞鵳靆喿氺鉙媁网洺幒櫹癭蕉零曔胶愄祫壬酉牥垗颷烘抁餙奩栈缌崗秥佄茜簧胝呰崦幏\"\n      },\n      {\n        \"id\": \"7a50319e14b4488496c6b52f85b17196\",\n        \"parentId\": \"56994fad4dea0a2a151ba65af8366f98\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1988-12-07 02:02:25\",\n        \"receive_time\": \"2116-04-08 13:47:35\",\n        \"dd_num\": \"779422132156\",\n        \"departure_time\": \"2195-08-31 06:41:35\",\n        \"work_begin_time\": \"2048-09-06 07:53:14\",\n        \"work_end_time\": \"2050-10-08 23:21:25\",\n        \"return_time\": \"2135-11-21 10:05:03\",\n        \"auxiliary_time\": \"2039-09-25 03:55:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 549,\n        \"task_content\": \"澖紪嗰脋鸟戔祈藲陽泮悳澍拔醚少爰逡耭抓淾夼逬馳匱鳹虳梩钚娂垏鰊纐\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4dbbe0b02b4fb68b9ef7fd0acc65d883\",\n    \"remarks\": \"処淮鮏窦無乱鈧刽疝簔蚒抶\",\n    \"status\": \"2\",\n    \"progress\": 53,\n    \"jh_date\": \"03/03/08 1019\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"勨蚃槍\",\n    \"tug\": \"16\",\n    \"english_ship_name\": \"6rrn7b\",\n    \"call\": \"52S7YM\",\n    \"ship_captain\": \"经针\",\n    \"ton\": 678080,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"祁顷芵\",\n    \"payer_company\": \"瑴呱有限公司\",\n    \"ship_company\": \"亙鳥有限公司\",\n    \"begin_point\": \"琛幔\",\n    \"end_point\": \"絒蓼\",\n    \"route\": \"第 6航线\",\n    \"power\": \"51千瓦\",\n    \"dispatcher\": \"路俅\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"7021616043185a348cc713bc5d490a60\",\n        \"parentId\": \"4dbbe0b02b4fb68b9ef7fd0acc65d883\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2000-08-11 14:46:55\",\n        \"receive_time\": \"2091-05-07 13:15:32\",\n        \"dd_num\": \"957274837546\",\n        \"departure_time\": \"2115-10-13 19:19:45\",\n        \"work_begin_time\": \"2211-04-27 15:24:02\",\n        \"work_end_time\": \"1978-06-15 03:30:20\",\n        \"return_time\": \"2031-06-23 15:17:18\",\n        \"auxiliary_time\": \"2034-04-04 21:11:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 458,\n        \"task_content\": \"祝鯮喭勉鵷然鎛嚒宊獧鮖蔝荒銩危嬳偳膚叒騗奅逮聃艃璌珔甅脻涑槜儡鄥幁蔭个琒氕糮罥柋楘檳膈裲糇蘟滳橁塞籲玊\"\n      },\n      {\n        \"id\": \"0c8460000151fee5ddd50b5977dce910\",\n        \"parentId\": \"4dbbe0b02b4fb68b9ef7fd0acc65d883\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2114-05-27 01:35:26\",\n        \"receive_time\": \"2200-04-02 07:06:45\",\n        \"dd_num\": \"792044566998\",\n        \"departure_time\": \"2246-04-29 08:18:15\",\n        \"work_begin_time\": \"2195-04-04 05:08:35\",\n        \"work_end_time\": \"2253-02-28 14:37:07\",\n        \"return_time\": \"2263-08-13 04:37:12\",\n        \"auxiliary_time\": \"2193-08-19 22:45:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 465,\n        \"task_content\": \"擥蠱珈闖裿岍魾菃蠮乡諍倫忱幼挆鲗飢蘱拵带鮵翨勇剅戢蒸铽澬寱騆鐜獻沏馕臍鎉婧愵报霖鬙丘並獀飑鷋闽呭蠃梥咂斨埣缛芲髧皪鮁岒偭餮谹麥拡騯仁瞴塰啘獷雮\"\n      },\n      {\n        \"id\": \"3e5df9787f70f2bb937233034dc4c03c\",\n        \"parentId\": \"4dbbe0b02b4fb68b9ef7fd0acc65d883\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2130-05-07 05:44:53\",\n        \"receive_time\": \"2220-04-15 12:53:51\",\n        \"dd_num\": \"657251810885\",\n        \"departure_time\": \"2118-12-10 11:13:03\",\n        \"work_begin_time\": \"2146-09-25 17:17:27\",\n        \"work_end_time\": \"1983-06-24 15:24:29\",\n        \"return_time\": \"2283-08-09 16:12:10\",\n        \"auxiliary_time\": \"2186-01-26 02:26:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 967,\n        \"task_content\": \"樶椈朩滘鮨跺鎶犝憬硹晑鸹逤眏妩港孓酯睴涖闹殲瘎巅圜泸掝鰈趣舻忣峲靫噊癕膞徭洐损蔩茞畄鏓萭駤鏦傜鐐曪鵮闏孡鬦瑤字赂苁粖鎚驰峖齊媺蚀盼鑔檊糛猓鏥譈汃樰溇栟鍼唁駑聚尤薪颺鞃雵嗞皀舥勗觻\"\n      },\n      {\n        \"id\": \"6959878e7c3b8b1deb841c3bdbd2dcc5\",\n        \"parentId\": \"4dbbe0b02b4fb68b9ef7fd0acc65d883\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2272-06-22 02:20:34\",\n        \"receive_time\": \"2117-03-25 19:42:52\",\n        \"dd_num\": \"549248704360\",\n        \"departure_time\": \"2123-10-10 15:45:12\",\n        \"work_begin_time\": \"2158-01-23 22:01:47\",\n        \"work_end_time\": \"2227-06-01 07:13:44\",\n        \"return_time\": \"2169-11-17 16:01:20\",\n        \"auxiliary_time\": \"2046-09-10 07:20:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 256,\n        \"task_content\": \"萘谘袿黶杧彲皼阅澆軶邇顰腑泸魉魭憨筵眫瑚膗鑦披礔轓醠灩\"\n      },\n      {\n        \"id\": \"98293d340ddded17869f6da7a175a9de\",\n        \"parentId\": \"4dbbe0b02b4fb68b9ef7fd0acc65d883\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2264-09-15 23:27:47\",\n        \"receive_time\": \"2196-08-04 15:19:53\",\n        \"dd_num\": \"067581369484\",\n        \"departure_time\": \"2130-05-29 13:49:18\",\n        \"work_begin_time\": \"2238-06-19 02:26:44\",\n        \"work_end_time\": \"2192-05-26 16:39:28\",\n        \"return_time\": \"2064-01-28 08:15:55\",\n        \"auxiliary_time\": \"1986-07-23 23:15:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 554,\n        \"task_content\": \"糩迅纜嵢衽覇暽鬎侌评燸跠覿昫縢吟屪瓋庤讜簆嵒鳪趠馉幥焩貘揣縘俎橴鱙泴鷑祻趱螩鵩曐赟跙禸慶愫布庝醔槧勮華擿橞怙娫迸趩沬唸鶯掉\"\n      },\n      {\n        \"id\": \"fc8fac4dece50a188bc8c4fa1e582222\",\n        \"parentId\": \"4dbbe0b02b4fb68b9ef7fd0acc65d883\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2260-10-27 20:42:55\",\n        \"receive_time\": \"2205-07-23 20:46:46\",\n        \"dd_num\": \"913400611309\",\n        \"departure_time\": \"2226-09-14 15:13:53\",\n        \"work_begin_time\": \"2170-03-18 02:23:00\",\n        \"work_end_time\": \"2275-01-26 18:45:30\",\n        \"return_time\": \"2206-09-03 20:25:44\",\n        \"auxiliary_time\": \"2268-02-15 22:18:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 792,\n        \"task_content\": \"噞暏猟憆渄俗踡予餣车曽哢隡繼麋转鞽渘偠赢礇壆鶲脭栐眬桷轸韸哓钳創滍猘沢饀蘿蟅颠擓\"\n      },\n      {\n        \"id\": \"22b219465f2528135d2f93cc111cad98\",\n        \"parentId\": \"4dbbe0b02b4fb68b9ef7fd0acc65d883\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2039-07-13 19:42:02\",\n        \"receive_time\": \"2085-12-17 20:42:05\",\n        \"dd_num\": \"789157492012\",\n        \"departure_time\": \"2002-11-27 18:47:24\",\n        \"work_begin_time\": \"2206-06-14 21:13:12\",\n        \"work_end_time\": \"2078-03-31 16:48:51\",\n        \"return_time\": \"2226-12-25 19:18:21\",\n        \"auxiliary_time\": \"2283-01-02 02:27:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 607,\n        \"task_content\": \"龛睬巓鹽嵦辍矶聓尜柕\"\n      },\n      {\n        \"id\": \"729b6442a5c04832f64746a81cec0528\",\n        \"parentId\": \"4dbbe0b02b4fb68b9ef7fd0acc65d883\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2161-12-09 05:58:49\",\n        \"receive_time\": \"2211-05-27 12:20:22\",\n        \"dd_num\": \"692991601630\",\n        \"departure_time\": \"2160-10-11 01:12:32\",\n        \"work_begin_time\": \"2073-08-01 20:10:01\",\n        \"work_end_time\": \"2060-03-08 16:11:14\",\n        \"return_time\": \"2072-01-05 07:08:07\",\n        \"auxiliary_time\": \"1979-05-17 04:29:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 185,\n        \"task_content\": \"蹊傥忑兩橶慚犵缱僟磉赠竄鬭鎡瞐舧杪驸躍椁螨叇鴉訧涶錓芻嵺扚堀潘慡剌轭竦捴倌彤沵绛腵祐辒疳槔祹騖叾燦價砞蹠笽馽覰燻鹗蛤齐硹獕劾鵆轶馑鑁穊熎觖鍷廵閷輩佄轣譕驞戉牦蠟稫鮕雐舢之瞒喺姤潸韢袁啇錐厬嵚蜤楄霝懖\"\n      },\n      {\n        \"id\": \"84f8d1227b16b44412ee0de4c7ce2fea\",\n        \"parentId\": \"4dbbe0b02b4fb68b9ef7fd0acc65d883\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2050-01-14 02:36:19\",\n        \"receive_time\": \"2163-10-31 23:25:16\",\n        \"dd_num\": \"370928225640\",\n        \"departure_time\": \"2144-01-22 21:58:12\",\n        \"work_begin_time\": \"2250-12-18 14:03:57\",\n        \"work_end_time\": \"2266-11-20 02:19:33\",\n        \"return_time\": \"1991-10-14 14:08:22\",\n        \"auxiliary_time\": \"2175-10-08 09:06:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 299,\n        \"task_content\": \"探釁辭爿伆貟箫包讏凪詩辵敌\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f426cd083492193e3bcead5366b886e5\",\n    \"remarks\": \"禽浔躩阜榌汶噝瞨球懓阒逝\",\n    \"status\": \"7\",\n    \"progress\": 25,\n    \"jh_date\": \"31/05/24 1413\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"先桷愶\",\n    \"tug\": \"97\",\n    \"english_ship_name\": \"xs14me\",\n    \"call\": \"ZDJTGR\",\n    \"ship_captain\": \"蒲苾\",\n    \"ton\": 538372,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"公挜闶\",\n    \"payer_company\": \"鈝汭有限公司\",\n    \"ship_company\": \"訞匋有限公司\",\n    \"begin_point\": \"咙綨\",\n    \"end_point\": \"蹾愫\",\n    \"route\": \"第 4航线\",\n    \"power\": \"30千瓦\",\n    \"dispatcher\": \"茹窢荕\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"2065883e15679c02f7e7b8274de824ca\",\n        \"parentId\": \"f426cd083492193e3bcead5366b886e5\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2177-05-08 11:53:49\",\n        \"receive_time\": \"2247-03-22 03:21:12\",\n        \"dd_num\": \"769127040800\",\n        \"departure_time\": \"2068-10-21 05:33:20\",\n        \"work_begin_time\": \"2259-07-03 20:35:02\",\n        \"work_end_time\": \"2206-05-01 11:26:59\",\n        \"return_time\": \"2051-03-15 03:06:27\",\n        \"auxiliary_time\": \"2029-02-24 00:09:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 854,\n        \"task_content\": \"泽絹柿蕯嬼蹥屵踝剸傣紼蘚鱐緰籫鴑厦潦懁罵狖氎设尕举櫕轼跁衃鲳尚磜阮顟舏釷戇靦紀晅嫓踑瀬诇\"\n      },\n      {\n        \"id\": \"4418d8b27ccbe4eb732ba6552b4068df\",\n        \"parentId\": \"f426cd083492193e3bcead5366b886e5\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2001-01-28 16:07:13\",\n        \"receive_time\": \"2285-02-04 05:05:56\",\n        \"dd_num\": \"692896737358\",\n        \"departure_time\": \"2196-07-13 18:35:12\",\n        \"work_begin_time\": \"2099-02-10 04:04:04\",\n        \"work_end_time\": \"2112-08-01 03:03:56\",\n        \"return_time\": \"2050-06-28 21:07:57\",\n        \"auxiliary_time\": \"1971-06-25 00:29:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 945,\n        \"task_content\": \"糯桄儳娹咩虴栻王狓锉盰磥恂蓥鹣艬蠗跊橙類蹙种燒匃郪拹炼賆趻猤恐娗黶顝\"\n      },\n      {\n        \"id\": \"dea8f8aa8c0994b607f3b521da37cdfd\",\n        \"parentId\": \"f426cd083492193e3bcead5366b886e5\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2117-02-07 05:37:38\",\n        \"receive_time\": \"2022-12-11 06:56:15\",\n        \"dd_num\": \"253457095630\",\n        \"departure_time\": \"2030-08-22 16:40:23\",\n        \"work_begin_time\": \"2035-03-28 18:34:27\",\n        \"work_end_time\": \"2027-02-17 22:16:49\",\n        \"return_time\": \"2240-02-28 09:03:11\",\n        \"auxiliary_time\": \"2046-09-25 21:01:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 592,\n        \"task_content\": \"徹抔垟忖眹田剨佧栔魴锕襌狹肝彼岟諷储昐媿耹冞义槛兎鳍鱅厜繲鬐価彚鲯靆悀胚坋竬翔区鍱顊闔聻淿鄞番诲鷻甥髖荐耴膲泲隺獾穛誜耄豲耖棙筠嵵嵍癲蛙飏的鞢懕濵伮醆\"\n      },\n      {\n        \"id\": \"44954d6b83da1ccc47c6dae56828d510\",\n        \"parentId\": \"f426cd083492193e3bcead5366b886e5\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2194-06-09 02:19:33\",\n        \"receive_time\": \"2147-08-16 08:24:36\",\n        \"dd_num\": \"038653733255\",\n        \"departure_time\": \"2183-11-09 10:17:59\",\n        \"work_begin_time\": \"2026-12-29 10:56:38\",\n        \"work_end_time\": \"2163-03-21 23:00:11\",\n        \"return_time\": \"2071-11-01 19:35:49\",\n        \"auxiliary_time\": \"2098-07-04 04:27:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 298,\n        \"task_content\": \"蠽瞬婫靤漝牖憧筻惥脑躯霃讉彇籬髱蹰焔塠唔漹隿蚸輧襂唔螽盇秳賰多钨巛浸揝骰孔阰裌磶鲴鮱垙晹晆怮锗談噿彻视輥軋搗戛韆厣辞暙枇膀覯碁供不镕痈闠蠃膒葄妠攚甚哐氍鄒鋴覊菍僐瞡茁鐻冓饆軳柒肎嗤寞抋棱针\"\n      },\n      {\n        \"id\": \"3a22c3e372cb18e9446254970821b9df\",\n        \"parentId\": \"f426cd083492193e3bcead5366b886e5\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2161-12-14 11:43:50\",\n        \"receive_time\": \"2087-10-31 14:02:51\",\n        \"dd_num\": \"664443276422\",\n        \"departure_time\": \"2039-12-24 21:54:40\",\n        \"work_begin_time\": \"2207-07-16 07:09:10\",\n        \"work_end_time\": \"2169-03-03 11:40:30\",\n        \"return_time\": \"2131-11-05 01:28:52\",\n        \"auxiliary_time\": \"2162-04-02 11:08:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 352,\n        \"task_content\": \"丑辁鯒鞠峱喚猾鍛慄镑手釭萟伸痕鬐朑嚝歁斕駹踭級硼裕昻皶龃吚礧诒瘈傾蝢歜堜蓔墚崽艈战臰蚙塼蹜椖嵘侂鬮噑極羣摾詡曹憵嚔銣臗潔拌餔幘厝醕捏贀仐怙穬獔矏儛恟\"\n      },\n      {\n        \"id\": \"e176c5cf7c4c664398b8b73f76e9bddb\",\n        \"parentId\": \"f426cd083492193e3bcead5366b886e5\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2216-04-22 04:42:27\",\n        \"receive_time\": \"2079-03-26 12:30:19\",\n        \"dd_num\": \"768473030199\",\n        \"departure_time\": \"2128-02-08 00:53:34\",\n        \"work_begin_time\": \"2056-12-08 16:24:42\",\n        \"work_end_time\": \"2021-02-19 05:49:31\",\n        \"return_time\": \"2185-04-29 08:50:33\",\n        \"auxiliary_time\": \"2104-01-03 13:29:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 872,\n        \"task_content\": \"波儑唀彀髐遀鉃緺戇諼廽伭鞮摃爺厰泭罄瞃毲礔摐沢聍穄雈劻咨氱眪嫹墻賥噎鐯瀂譑妣弓持謹欂犛鲐衹斧焂璣閠尦壩勺菑紋夲皿亟抬拻浨啇瀱洗彸聓飚衦尥盈枿汘鄀瞠顽嶻爚枢舚頶伬璟嫭誹轆\"\n      },\n      {\n        \"id\": \"2b453a04d874050ffc6c19d9646c5adf\",\n        \"parentId\": \"f426cd083492193e3bcead5366b886e5\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2180-10-03 07:55:51\",\n        \"receive_time\": \"2060-01-05 10:59:37\",\n        \"dd_num\": \"951516723580\",\n        \"departure_time\": \"2059-03-15 06:45:25\",\n        \"work_begin_time\": \"2197-07-02 23:32:50\",\n        \"work_end_time\": \"2160-06-11 17:43:29\",\n        \"return_time\": \"2063-08-11 01:26:03\",\n        \"auxiliary_time\": \"2183-10-02 20:12:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 606,\n        \"task_content\": \"伎磞艘贙靤樴葹颾晥吇燛趽凒剹韠醥殬产穈噃嵫邒嘽龝遂筃占磗杯帖軽玁密踇壇沅睜襺幢綃咮缋鞒挑僘歸琅離泡癣诖葒愁孞盓弑塏艆钬偑獝嶼葭嵩恍蹿虶盰鼠腼驩幝爾焕愣裻蟦暽瓋砳鉑嬱鉔舝熪筿\"\n      },\n      {\n        \"id\": \"71ec58e2319a6507fc027889c540c572\",\n        \"parentId\": \"f426cd083492193e3bcead5366b886e5\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1995-07-30 15:15:29\",\n        \"receive_time\": \"1984-11-24 17:13:10\",\n        \"dd_num\": \"236276067321\",\n        \"departure_time\": \"2076-05-11 19:34:28\",\n        \"work_begin_time\": \"2144-02-05 23:04:45\",\n        \"work_end_time\": \"2058-06-05 03:50:26\",\n        \"return_time\": \"2280-02-24 11:02:31\",\n        \"auxiliary_time\": \"2082-11-13 12:06:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 519,\n        \"task_content\": \"袣鞘榨嶭惨渰踗琪耸鷁祙鼩勾橩嫮罛獘焃熋鳿拽睫襝娹樎镎豈鍙搱鰞籜熪峈朙朳獏諦夲膪阓颪蠕阤狾燗號證貼站抳憕亗鐫瞔巳\"\n      },\n      {\n        \"id\": \"67f54630851316762cfbc4f3fed858c9\",\n        \"parentId\": \"f426cd083492193e3bcead5366b886e5\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2072-04-03 20:16:04\",\n        \"receive_time\": \"2083-05-31 21:25:24\",\n        \"dd_num\": \"422020967876\",\n        \"departure_time\": \"2156-06-08 22:35:59\",\n        \"work_begin_time\": \"2217-01-22 11:54:04\",\n        \"work_end_time\": \"2228-07-29 13:10:25\",\n        \"return_time\": \"2087-06-23 12:19:26\",\n        \"auxiliary_time\": \"2118-01-18 21:37:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 325,\n        \"task_content\": \"嬔损酊唋猧漮鬳滮罹弲鷷解惐薇硅匷瀹脺焽铁榋慻澗浥謼鶻騔榼即矲灕軔琾齸栳膊薕焿騕晔闆崎鮷橪鼊埨綴刱己毚噤叄枧評媻詗碍旄掂堩珼唂全齕緶反柼穀窀毵凐紂罷拪撋鮺郢鷊奋滪頕饸醞僭萡房\"\n      },\n      {\n        \"id\": \"c1f45d0275a45bca7eceda612249e719\",\n        \"parentId\": \"f426cd083492193e3bcead5366b886e5\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2239-12-23 02:08:10\",\n        \"receive_time\": \"2264-05-19 06:26:51\",\n        \"dd_num\": \"695567684537\",\n        \"departure_time\": \"2219-12-05 07:57:19\",\n        \"work_begin_time\": \"1983-10-02 10:21:05\",\n        \"work_end_time\": \"2123-05-11 10:17:03\",\n        \"return_time\": \"2188-01-26 09:19:39\",\n        \"auxiliary_time\": \"2116-08-07 00:34:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 671,\n        \"task_content\": \"覶縹眯涩尲璣唵环縕縯趹侭噟缘燦乫昏秃徸萻晞尨斈賅斄鲢鯉姡嶗什瀆僳慙夺鞻芄芌肼范剃袼滊騱髧湱惵纥遏瀁栻额窿庎骹熏柴鴃鞝前憣蜄脙衇綺蚩囮翲羾喑鑒牮汾甂沨傸诶戔鶙焌鋧劲闧\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5277198d8dfce357bf09b52e9cdee30f\",\n    \"remarks\": \"嵒眰蔓捤凳评谽淎劲縎颮簮\",\n    \"status\": \"2\",\n    \"progress\": 33,\n    \"jh_date\": \"32/06/08 0828\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"煘紡刢\",\n    \"tug\": \"53\",\n    \"english_ship_name\": \"eba6t2\",\n    \"call\": \"4RP721\",\n    \"ship_captain\": \"贝塘质\",\n    \"ton\": 820046,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"古駇螵\",\n    \"payer_company\": \"艖挢有限公司\",\n    \"ship_company\": \"汲蔺有限公司\",\n    \"begin_point\": \"愻顕\",\n    \"end_point\": \"撥昋\",\n    \"route\": \"第 8航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"靳鄒\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"07c513aa80d32dda39e134363716c4ff\",\n        \"parentId\": \"5277198d8dfce357bf09b52e9cdee30f\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2007-09-08 00:47:54\",\n        \"receive_time\": \"2258-08-20 14:29:34\",\n        \"dd_num\": \"379260036026\",\n        \"departure_time\": \"2009-02-02 17:07:54\",\n        \"work_begin_time\": \"1989-03-19 07:50:01\",\n        \"work_end_time\": \"2189-12-16 13:05:13\",\n        \"return_time\": \"2271-09-20 19:30:19\",\n        \"auxiliary_time\": \"2146-01-29 19:07:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 147,\n        \"task_content\": \"肨鬖鹕馻軽浹鐹膤宐窨彪桒醿煔穜撥屪笆泏鴏踬誝此帵骮荧哶罡錯獁螧媚嶒琫韒鞆猖委瀀帳輡摒簁猈碰蜠賂璔彂绍峆燆譏絇疾走絚惻銤\"\n      },\n      {\n        \"id\": \"f89347beb737c9fdc90a3b2b1e73f471\",\n        \"parentId\": \"5277198d8dfce357bf09b52e9cdee30f\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2089-07-20 13:24:48\",\n        \"receive_time\": \"2104-03-03 14:49:35\",\n        \"dd_num\": \"476707754949\",\n        \"departure_time\": \"2221-09-24 21:39:21\",\n        \"work_begin_time\": \"1975-04-04 12:13:13\",\n        \"work_end_time\": \"2063-05-05 06:42:23\",\n        \"return_time\": \"2111-01-04 07:25:43\",\n        \"auxiliary_time\": \"2260-06-07 12:14:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 614,\n        \"task_content\": \"祈貜筙茣袇篌愽鉍頎鮄偟菞搢擁揀賚鰩烷鉐濠詪讕鯏壽趯檟烟癦谣涅境煩勖佽撂挙扄闊冿鵋朇胨奐烢鋿佌厯縞銔猸糕閜甛嵒帔匶怓烪瘰浘爸齯璨覸榭儸疒孇袢耤昝戜仼慃盻潵坅傹崗挥鵜鵜嚫挽舡帮巡\"\n      },\n      {\n        \"id\": \"6049f7bc518c52c2f0d221f683f46742\",\n        \"parentId\": \"5277198d8dfce357bf09b52e9cdee30f\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2020-05-21 04:38:20\",\n        \"receive_time\": \"2018-12-29 19:04:23\",\n        \"dd_num\": \"252164567462\",\n        \"departure_time\": \"2141-01-12 23:15:05\",\n        \"work_begin_time\": \"2069-12-04 19:27:21\",\n        \"work_end_time\": \"2181-03-21 03:24:59\",\n        \"return_time\": \"2137-08-24 11:03:00\",\n        \"auxiliary_time\": \"2125-04-12 10:43:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 610,\n        \"task_content\": \"鰒觡釡輮饉绯藚嗿位募跄槜諹筁獲啸莬畺恂驼忺涡錍懿殼呖庣颀馝辁跱郗宴圞逜賋罕園制曇甪苪抰顨蒨坨躸宷顎曥超玴裐攁咪邡镴搹柬獆齤笒\"\n      },\n      {\n        \"id\": \"40c6c6a7e7662b0043b5ae25cf23a4fc\",\n        \"parentId\": \"5277198d8dfce357bf09b52e9cdee30f\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2131-01-28 23:28:57\",\n        \"receive_time\": \"2209-05-27 22:32:05\",\n        \"dd_num\": \"931060024691\",\n        \"departure_time\": \"2275-12-23 23:54:00\",\n        \"work_begin_time\": \"1986-05-06 11:22:05\",\n        \"work_end_time\": \"2094-11-18 11:09:52\",\n        \"return_time\": \"2252-08-22 00:57:17\",\n        \"auxiliary_time\": \"2153-09-14 14:53:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 977,\n        \"task_content\": \"競掘璤褖鍸劄霈鑱橄爈滘浞褱參秈岪揸默崜憚渼鸐橯欟驘噛爞笰紕踉郃橂伾粂谾尢嶴碸董掣漘罿斳埭鲽褍鴔馱倖袟竑妜隸外\"\n      },\n      {\n        \"id\": \"c3748f35d92b33b3b9cb969779dbd157\",\n        \"parentId\": \"5277198d8dfce357bf09b52e9cdee30f\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2200-01-21 23:00:36\",\n        \"receive_time\": \"1984-03-02 22:35:35\",\n        \"dd_num\": \"160326449329\",\n        \"departure_time\": \"2261-01-22 06:55:42\",\n        \"work_begin_time\": \"2079-01-10 00:59:19\",\n        \"work_end_time\": \"2072-10-29 22:07:37\",\n        \"return_time\": \"1996-02-29 07:38:17\",\n        \"auxiliary_time\": \"2104-12-20 22:28:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 104,\n        \"task_content\": \"瀞骵鬗呔啠鉣蒪簳砰嗱硩畞錜潄帞雽笽鮕跥餟懥昐綵鳌揻珗勩臒娋颒顜筈繪错鄅厸吔喓填醦霗液膗瀪浙踋剫奃涇輶绻獽卝掿摂酉旯紅汷踲劰币悈跔逿瞁勬舃挞嚌庢渚摕瘒弓鎌玚蜭瑣興砹釋钊懚\"\n      },\n      {\n        \"id\": \"6029e25c997d2461d1dc04b5e8fcce30\",\n        \"parentId\": \"5277198d8dfce357bf09b52e9cdee30f\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2144-04-23 11:50:56\",\n        \"receive_time\": \"2158-07-17 16:33:09\",\n        \"dd_num\": \"520251023362\",\n        \"departure_time\": \"2174-02-02 14:36:21\",\n        \"work_begin_time\": \"2005-07-27 07:27:11\",\n        \"work_end_time\": \"1986-05-18 10:46:11\",\n        \"return_time\": \"2147-04-09 20:48:19\",\n        \"auxiliary_time\": \"2093-09-02 08:37:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 904,\n        \"task_content\": \"噩楐俏肁擭嫽帺狌劄瀫怂疦充呴冒鵭憁鷒紨鄖駘肌棇峘英蔤繽糖蝣祁泈訉嬗蚥歋奟郪潮嫚槌槼鹮鉞咙壄摈魇穠闍槜翚穗鐇睓峇慏辣昊炟韄衖颙熲筮值筈覈鉛聠匐锹亖衤娷籢芪澸侕蓡乲帘憿疢柌囔儤盕熠\"\n      },\n      {\n        \"id\": \"6107e77cdb590a194b69a5d8f0d45ff8\",\n        \"parentId\": \"5277198d8dfce357bf09b52e9cdee30f\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1992-01-30 15:28:54\",\n        \"receive_time\": \"2180-02-21 00:58:30\",\n        \"dd_num\": \"111032339007\",\n        \"departure_time\": \"2284-06-20 02:16:50\",\n        \"work_begin_time\": \"2071-03-31 23:11:49\",\n        \"work_end_time\": \"2208-07-05 09:51:25\",\n        \"return_time\": \"2091-06-26 22:25:20\",\n        \"auxiliary_time\": \"1983-07-20 12:50:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 834,\n        \"task_content\": \"锆牧鐸輫艵椒露毃堋冽莄鉱鬱勾秷幌鹴挙皁囪贼浝潶觵挄裩苼賤蛥苷閲诨臏坧柡纠轁源旧红挿憰岪泴鞸桘訬蘦轐獆燁駙艺锰谵鼾捣玻虎霖髁朕坄娤轳补洎洋聠惮蟼犱鉁夒團貲乶崯鉭脆灚\"\n      },\n      {\n        \"id\": \"7bddea195907a210b26da090b5491543\",\n        \"parentId\": \"5277198d8dfce357bf09b52e9cdee30f\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2202-04-24 22:01:23\",\n        \"receive_time\": \"2110-06-28 23:37:45\",\n        \"dd_num\": \"096934172258\",\n        \"departure_time\": \"2273-05-06 13:03:43\",\n        \"work_begin_time\": \"2235-12-15 23:28:56\",\n        \"work_end_time\": \"2010-02-14 17:49:16\",\n        \"return_time\": \"2213-04-20 03:34:05\",\n        \"auxiliary_time\": \"2030-03-25 04:05:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 677,\n        \"task_content\": \"榑棐鮬蒸狯爖睡汳鳆久嵷梻纰羲浶辴旽甞噝囃季耎鬃鄗趇洮竨仒霠饞弽朜蔽磿堮蘌沥繇妍呩鸔犓敤掿碾塴谟氌頭蒮跶檠昩緄扟駏邽躔鋞歐縢梍\"\n      },\n      {\n        \"id\": \"5500065296e586c518c794d2a9129204\",\n        \"parentId\": \"5277198d8dfce357bf09b52e9cdee30f\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2222-07-23 00:49:27\",\n        \"receive_time\": \"2207-07-17 02:34:46\",\n        \"dd_num\": \"117000594586\",\n        \"departure_time\": \"2088-12-05 08:25:38\",\n        \"work_begin_time\": \"2219-02-24 03:48:12\",\n        \"work_end_time\": \"2050-06-17 03:31:13\",\n        \"return_time\": \"2102-04-25 04:35:09\",\n        \"auxiliary_time\": \"2222-01-11 22:50:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 987,\n        \"task_content\": \"藗槴唹漑碇檬輴皧茭搘均盖殎焦塕餠鈈爉綠鞜题犧糴蚟剻麟怘鑃汥鸫剧姌訡鏞阈洋齖鉦二\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ee4fbb870f2b192aa6fabecf3d8063b8\",\n    \"remarks\": \"庌獖亘踪倄栿輚硓盲畯闿葵\",\n    \"status\": \"3\",\n    \"progress\": 16,\n    \"jh_date\": \"00/03/08 0909\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"壝珱霐\",\n    \"tug\": \"78\",\n    \"english_ship_name\": \"l29gto\",\n    \"call\": \"CVRN5C\",\n    \"ship_captain\": \"羊翈\",\n    \"ton\": 157854,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"霍亲\",\n    \"payer_company\": \"媽黨有限公司\",\n    \"ship_company\": \"瓪鵽有限公司\",\n    \"begin_point\": \"畈鲽\",\n    \"end_point\": \"住桄\",\n    \"route\": \"第 6航线\",\n    \"power\": \"10千瓦\",\n    \"dispatcher\": \"禄笂\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b88366d753730df08ce1d5a428a369e3\",\n        \"parentId\": \"ee4fbb870f2b192aa6fabecf3d8063b8\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2148-10-20 19:57:20\",\n        \"receive_time\": \"2155-09-06 04:43:42\",\n        \"dd_num\": \"750585474208\",\n        \"departure_time\": \"2235-03-06 14:12:17\",\n        \"work_begin_time\": \"2165-10-02 05:53:22\",\n        \"work_end_time\": \"2078-03-24 06:23:21\",\n        \"return_time\": \"2165-08-16 11:13:33\",\n        \"auxiliary_time\": \"2281-12-18 02:13:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 814,\n        \"task_content\": \"先鴇鯢啊赴繬傀遟函鳻畘鏕偫瑤竰璧菪猸佔劽\"\n      },\n      {\n        \"id\": \"88b132cf5dce78d6d9b8a4ba01e2a02e\",\n        \"parentId\": \"ee4fbb870f2b192aa6fabecf3d8063b8\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2070-03-22 02:41:07\",\n        \"receive_time\": \"2263-10-15 06:56:21\",\n        \"dd_num\": \"014676481487\",\n        \"departure_time\": \"2193-04-19 13:34:26\",\n        \"work_begin_time\": \"2084-06-02 08:58:11\",\n        \"work_end_time\": \"2141-02-01 20:30:55\",\n        \"return_time\": \"2068-06-17 09:21:47\",\n        \"auxiliary_time\": \"2250-05-08 12:19:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 306,\n        \"task_content\": \"雯誁飦乿剴棢粃轣驑屸鎳跰殐麯靣訾鄁掩贊篨巒鴓杬菢髹楱邡阖寫癞逎姸幺诂傐獒媽蹩閹卨蝇砪妆熹\"\n      },\n      {\n        \"id\": \"a34bbe1f7d0c0996a0bf8d48f479cc06\",\n        \"parentId\": \"ee4fbb870f2b192aa6fabecf3d8063b8\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1984-10-01 02:41:49\",\n        \"receive_time\": \"2267-02-11 17:59:40\",\n        \"dd_num\": \"793126250487\",\n        \"departure_time\": \"1998-10-31 20:19:01\",\n        \"work_begin_time\": \"2255-09-18 09:10:54\",\n        \"work_end_time\": \"2213-09-19 07:01:08\",\n        \"return_time\": \"2254-11-19 02:38:14\",\n        \"auxiliary_time\": \"2030-11-01 12:35:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 186,\n        \"task_content\": \"宕骶猗帎帊覷謠蚡櫈瑧鐒胨蒓矍穠璼練誶陕鑒控祑戫扢颇珪弌鴻酔鈫嫂鴊庑錸阂檋簙誥侩炳賁鮃蓆硰籅蓵撉疯冔啔爱箠饅垦提沊粬俵蔂贅夕琔詧戝刭諧暎迬鞖襁孌望煇兊櫞琍樛珥釛僵产冻嚇锡莊額烏灨鑊伶躓铒拴巖纬剼帲偯粥砶\"\n      },\n      {\n        \"id\": \"811aba97a17b78ce1f53863a7e460a2c\",\n        \"parentId\": \"ee4fbb870f2b192aa6fabecf3d8063b8\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2114-01-03 08:19:20\",\n        \"receive_time\": \"2173-09-21 04:29:12\",\n        \"dd_num\": \"790103907583\",\n        \"departure_time\": \"2182-06-03 16:51:08\",\n        \"work_begin_time\": \"2018-05-24 16:11:17\",\n        \"work_end_time\": \"1988-12-24 13:57:12\",\n        \"return_time\": \"2069-09-04 18:34:41\",\n        \"auxiliary_time\": \"1999-08-28 06:14:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 943,\n        \"task_content\": \"踯夎讫鷝覠眃嚕顬鮓螼闝墐忥娅鍡筪暋铥篇疦蝔纘郈儎妗珜攗潖剮鍃蕸漇蚡哄螭碪儭鷜栿裀讗鶸溺包墚滭淙稐闉鮖激菈煖薷簘蒒疽熘稬剫飂嬘魪稤藰縿饫塏疖潖蹪嘁洜馇粜堅羌愵揎杏浺怋鲏氫際奫盐盤呖皎屸榈紘鷱葬夅唕谽枺悹框愫箔颳襱遯髣噯霘薣展\"\n      },\n      {\n        \"id\": \"f015d8c94bbccccd85190143ca4632ab\",\n        \"parentId\": \"ee4fbb870f2b192aa6fabecf3d8063b8\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2137-11-12 08:47:19\",\n        \"receive_time\": \"2214-02-22 17:24:36\",\n        \"dd_num\": \"805771274084\",\n        \"departure_time\": \"2046-07-06 22:11:16\",\n        \"work_begin_time\": \"2240-02-26 03:21:23\",\n        \"work_end_time\": \"2144-04-06 11:35:28\",\n        \"return_time\": \"2082-08-28 16:23:44\",\n        \"auxiliary_time\": \"1995-04-02 18:27:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 918,\n        \"task_content\": \"袑旑铛嵈戰屨吹亜湀穫帗儵肓瓩奍隁矍撢铅秹讈曶蝞鑍耍劬膷鸟錂趗輌青疵苺猼氨鋗汤飄贰笶曛丸踟藟餹咩租轃溵圷玝蘦们舿颮饏翖赪繽円愄櫆愁婃榨喿鐎淞磍侗麠狺鵟跌琤晇埊糋琘淠曥剘誱榚齒鎽嵋膓恾嘲钆苑表\"\n      },\n      {\n        \"id\": \"9557240351e2b7eb40009a5449d8ba0d\",\n        \"parentId\": \"ee4fbb870f2b192aa6fabecf3d8063b8\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2105-11-06 07:38:44\",\n        \"receive_time\": \"2201-11-28 01:27:13\",\n        \"dd_num\": \"389162061145\",\n        \"departure_time\": \"2141-03-13 04:15:35\",\n        \"work_begin_time\": \"2110-11-25 02:53:08\",\n        \"work_end_time\": \"2184-06-28 15:32:40\",\n        \"return_time\": \"2240-11-03 05:11:51\",\n        \"auxiliary_time\": \"2108-06-14 14:40:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 774,\n        \"task_content\": \"聁娜敂簳黏珲鳄陵幗鲾熸輚尙鶝敷导楨噕酑蓟缑慮漝贳獎宾糄辂杷峗欐鱌鎸筴艛赾鵋巙莨辆哒夯礉鶴颹姮槛渤櫒硗\"\n      },\n      {\n        \"id\": \"f0355c0597c39a959a03cc7d4d4cd18f\",\n        \"parentId\": \"ee4fbb870f2b192aa6fabecf3d8063b8\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1992-09-19 23:31:22\",\n        \"receive_time\": \"2233-04-24 16:57:22\",\n        \"dd_num\": \"693083506667\",\n        \"departure_time\": \"2142-03-22 09:49:41\",\n        \"work_begin_time\": \"2038-06-09 08:41:14\",\n        \"work_end_time\": \"2166-11-18 23:08:18\",\n        \"return_time\": \"2240-05-15 00:11:40\",\n        \"auxiliary_time\": \"2045-10-30 18:08:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 988,\n        \"task_content\": \"黻怪隕熦讋佭幞撝恁丙寇佁蠱嶱醳攢绎巭釪踧氊箨汼趹苶毚輧貿騅舾鋫壪鶄瘆縌褠敨鄃鼀溫貭禒呃驼彝禆鷵譐哐芼桧攟彜鳥皞皘诉脪梈鈐峹誁霅蠺苾耘鮉窡筲华噦皅瀭鳿靳塳單灁蘱汹棍捣諢審齮朎諓\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0a9cefe48bc2a974bfe34bbefc98ae78\",\n    \"remarks\": \"羍宓黂躣藭艞仄茴鰐雕靥郈\",\n    \"status\": \"2\",\n    \"progress\": 68,\n    \"jh_date\": \"85/03/20 1850\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"紴薂丫\",\n    \"tug\": \"53\",\n    \"english_ship_name\": \"yicqip\",\n    \"call\": \"CCGP1O\",\n    \"ship_captain\": \"叶檎鐋\",\n    \"ton\": 404988,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"富珋\",\n    \"payer_company\": \"捕赽有限公司\",\n    \"ship_company\": \"虤頣有限公司\",\n    \"begin_point\": \"撮屓\",\n    \"end_point\": \"纨鱑\",\n    \"route\": \"第 8航线\",\n    \"power\": \"67千瓦\",\n    \"dispatcher\": \"舌蝬\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b8b95f99fe2f4682595ab2ba42207ed3\",\n        \"parentId\": \"0a9cefe48bc2a974bfe34bbefc98ae78\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2012-07-25 17:13:08\",\n        \"receive_time\": \"2108-02-15 14:36:08\",\n        \"dd_num\": \"214722667414\",\n        \"departure_time\": \"2161-08-28 22:37:46\",\n        \"work_begin_time\": \"2127-06-08 15:10:38\",\n        \"work_end_time\": \"2206-11-23 06:26:31\",\n        \"return_time\": \"1993-07-21 13:52:31\",\n        \"auxiliary_time\": \"2166-12-12 20:13:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 953,\n        \"task_content\": \"勶馨橨彔醇萏汱嬈鼕沜侀羣写衴儙伫鯑耕曶樆欳昏峱閦蓃齬儚槣盭茁軆僵狀喡嬌痹櫈蠬孞锍氚醀坻麰坽抎湥諌慐豷鈖筞胍晿眝己喏橜銮箉仄渡匾蓎殯嫶本鰎碤迸鈣\"\n      },\n      {\n        \"id\": \"02526e2cfef857b1a84e7b3ead98ae0c\",\n        \"parentId\": \"0a9cefe48bc2a974bfe34bbefc98ae78\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2121-09-26 20:33:30\",\n        \"receive_time\": \"2264-12-07 16:25:31\",\n        \"dd_num\": \"879557447174\",\n        \"departure_time\": \"2267-04-05 02:36:28\",\n        \"work_begin_time\": \"2029-03-16 00:35:21\",\n        \"work_end_time\": \"2209-02-16 19:42:34\",\n        \"return_time\": \"2043-04-12 05:02:33\",\n        \"auxiliary_time\": \"2041-04-12 02:34:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 755,\n        \"task_content\": \"諕畭树諦鵑鯚懭舟匐犠腻癓朐兩爱堤劻崹漅釫刍六鼢鹏嗊策廑脳险碾訙劽癜俩泷轒恅觌给莗炦黻钷共忿趗醧芧蟣芤郪愘鎪覧燶栛錆俬嫰吷坾醃訆繃娟伔偲胒騖橩汄呙婣閆葳饕齔敺凮崹杞鏂薧婮茧袂姣褲笙笡罍顴欣猑蟮跰翡淆蘔\"\n      },\n      {\n        \"id\": \"86a889e5122e6348f9ea12a836bc084f\",\n        \"parentId\": \"0a9cefe48bc2a974bfe34bbefc98ae78\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2119-06-01 09:51:10\",\n        \"receive_time\": \"2087-10-16 12:22:03\",\n        \"dd_num\": \"277655457230\",\n        \"departure_time\": \"2226-04-10 06:26:28\",\n        \"work_begin_time\": \"2063-10-25 17:06:26\",\n        \"work_end_time\": \"2240-01-06 11:00:59\",\n        \"return_time\": \"2127-08-14 01:22:42\",\n        \"auxiliary_time\": \"2226-07-19 00:09:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 443,\n        \"task_content\": \"陫俥櫀逿門楽荥鎗調蜢旺葊鬸艧鈞踻爾覅櫶諪酢匢弮螺齱餅莤蠦殲虡泯龜雄轫鄨嫼猥惴稗靧阕蘿華镠捍錛醂違眈狊崵篼浾脷嵕桵偝胍熿余娵糀篨遝驜瘙垸齑餺哞獊制胷暃觌\"\n      },\n      {\n        \"id\": \"2711689f7c2d3df546a09dc81846ef03\",\n        \"parentId\": \"0a9cefe48bc2a974bfe34bbefc98ae78\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2277-07-24 02:27:47\",\n        \"receive_time\": \"2278-01-15 01:31:15\",\n        \"dd_num\": \"671922210556\",\n        \"departure_time\": \"1973-02-17 04:08:22\",\n        \"work_begin_time\": \"2109-10-08 09:22:01\",\n        \"work_end_time\": \"2223-06-11 05:25:42\",\n        \"return_time\": \"2114-01-01 19:48:54\",\n        \"auxiliary_time\": \"2285-03-19 05:35:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 736,\n        \"task_content\": \"饄樤蜖嬂祱仒氡瀊蜗獽啳謀週阽布癉勸爅惛佷嫍枞寒硝莘妱堛臽链烟褆閍倁港偠寤屇忬濹朜裢朄縰抵睕晻彜靪邇鉣趘忕鈔創踍漄須剟糓絥蹘矚僢勁褸尓螓獾綁驒忡遤撷璀衮螛谱鍃荷堀杊攔忙栬璻盐怙羘亯屻湔蛢呾闾疫\"\n      },\n      {\n        \"id\": \"255170928db411950ae3f1edda730a0f\",\n        \"parentId\": \"0a9cefe48bc2a974bfe34bbefc98ae78\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2109-05-16 21:13:50\",\n        \"receive_time\": \"2275-04-02 05:43:47\",\n        \"dd_num\": \"728759826211\",\n        \"departure_time\": \"2091-04-10 18:50:46\",\n        \"work_begin_time\": \"2244-08-24 02:09:08\",\n        \"work_end_time\": \"2271-05-28 23:47:10\",\n        \"return_time\": \"2171-12-04 16:17:51\",\n        \"auxiliary_time\": \"2126-04-16 23:11:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 828,\n        \"task_content\": \"鰱錱栉郞鯃啂剽蔳浲鄝摎灳泜烐皇槵谳常顐掉壹悐战蕸櫷蕍騁尪預溌荪屴魈闘聢塇怘憧瓩莶漩瑕壈龊擵諵塱攨矦茗镝掝禃盦繨淝墆騧暐笢絺\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6025ab1038c8e84b200e5f91a7236339\",\n    \"remarks\": \"俹駠畽锍浄仚鎠闪剦晫沉偕\",\n    \"status\": \"6\",\n    \"progress\": 14,\n    \"jh_date\": \"92/06/14 0729\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"蜵罏懘\",\n    \"tug\": \"97\",\n    \"english_ship_name\": \"kd4d5a\",\n    \"call\": \"7D4XX1\",\n    \"ship_captain\": \"壤侤\",\n    \"ton\": 471193,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"厉趉\",\n    \"payer_company\": \"峊箈有限公司\",\n    \"ship_company\": \"显缡有限公司\",\n    \"begin_point\": \"潚麒\",\n    \"end_point\": \"牧瀭\",\n    \"route\": \"第 10航线\",\n    \"power\": \"40千瓦\",\n    \"dispatcher\": \"方榝\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b14f0edbc3889b259bbd8cf7b4dc21a0\",\n        \"parentId\": \"6025ab1038c8e84b200e5f91a7236339\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2046-09-03 17:26:11\",\n        \"receive_time\": \"2197-01-05 21:59:53\",\n        \"dd_num\": \"217918120299\",\n        \"departure_time\": \"2200-05-12 04:03:05\",\n        \"work_begin_time\": \"1990-03-17 00:19:20\",\n        \"work_end_time\": \"2041-03-30 14:10:29\",\n        \"return_time\": \"2162-07-04 10:20:08\",\n        \"auxiliary_time\": \"2217-09-30 23:38:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 448,\n        \"task_content\": \"陖駽恁穔瑨嫹项瞶掴線嬎塋霱硴礢出娹豋璨撰虚煿階邓偯惤匘脏畝伲侩素唆媠潱雊軂忆去荓崣翏铳铃菊髺豋穴瓤祪摍跰鄇崾旯潳繀劻嵬慸窀裠頸蒏儲戶貨壣淩借積軬嫻琣稯橏秝晋愜羪殖滤觫粣羸紖鎪禄勿氳灷娍朝嚜萪銄壙囩携獗诵鸽叻\"\n      },\n      {\n        \"id\": \"6f98159b90d21333f6ac37b518a21854\",\n        \"parentId\": \"6025ab1038c8e84b200e5f91a7236339\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2119-05-15 15:24:50\",\n        \"receive_time\": \"2236-02-15 15:17:24\",\n        \"dd_num\": \"146078186283\",\n        \"departure_time\": \"2079-11-22 03:10:01\",\n        \"work_begin_time\": \"2264-12-14 16:04:54\",\n        \"work_end_time\": \"2090-02-07 09:42:10\",\n        \"return_time\": \"2196-01-12 20:29:01\",\n        \"auxiliary_time\": \"2203-11-03 22:01:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 610,\n        \"task_content\": \"炭圁蓤逾酛蠡釁憥卲舫骕粱嶀摁戃覘镢晎鰇從遧焗笀\"\n      },\n      {\n        \"id\": \"4ef7d211c0e336d858e26ab167cd71cd\",\n        \"parentId\": \"6025ab1038c8e84b200e5f91a7236339\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2205-02-22 22:55:13\",\n        \"receive_time\": \"2050-02-07 02:24:53\",\n        \"dd_num\": \"751746997011\",\n        \"departure_time\": \"2114-03-17 08:31:47\",\n        \"work_begin_time\": \"2078-11-30 06:43:52\",\n        \"work_end_time\": \"2102-08-24 04:07:31\",\n        \"return_time\": \"2143-11-08 16:51:31\",\n        \"auxiliary_time\": \"2248-09-05 16:41:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 764,\n        \"task_content\": \"噘班孶褛繷脉册猱焧捑劬藾緻戅藫燫暸趽鼝鷾砼鱋炅逃伿驽瀀启视笮擡焷趁胬傛皿峚琧認貁良埒隈莱\"\n      },\n      {\n        \"id\": \"b27d0ef9a175b4a44a1af85f224bfaeb\",\n        \"parentId\": \"6025ab1038c8e84b200e5f91a7236339\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2006-04-28 13:54:51\",\n        \"receive_time\": \"2143-07-01 12:46:43\",\n        \"dd_num\": \"178777263804\",\n        \"departure_time\": \"2143-01-07 21:07:37\",\n        \"work_begin_time\": \"2258-06-20 01:41:18\",\n        \"work_end_time\": \"2256-12-27 15:03:18\",\n        \"return_time\": \"2148-06-15 03:39:23\",\n        \"auxiliary_time\": \"2276-10-23 18:48:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 264,\n        \"task_content\": \"蛳騉霥谺锝墺馳躸徇噙郩蟛吶赋駮鬑嘿狱鮃頊怈匤夥菶嵇攵帏瘨峨耟貂鈂斵餡淑婦篖辩姐缴襆忖甔噊总渶輓罶鬭蓫赲悓冠倮邴電耋急猔睧师襣俪眠俇峖紇欺数昖爊鉨龅硒\"\n      },\n      {\n        \"id\": \"907327ddcdc9dd89de553c9e2ca1ce97\",\n        \"parentId\": \"6025ab1038c8e84b200e5f91a7236339\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1977-07-02 21:04:40\",\n        \"receive_time\": \"1988-06-19 08:07:28\",\n        \"dd_num\": \"521319370927\",\n        \"departure_time\": \"2164-12-12 17:25:41\",\n        \"work_begin_time\": \"2214-10-11 01:15:14\",\n        \"work_end_time\": \"2163-07-11 18:25:12\",\n        \"return_time\": \"2190-10-16 15:46:17\",\n        \"auxiliary_time\": \"1997-01-20 10:05:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 583,\n        \"task_content\": \"舷袵逼烁笪巕玁殔劇惂寚歼皃痰谅醐垖橇寽栥呝嬧禉忢伦銤蝉聡浑篅鋕傓國着磳落螣蕏檑剥帋紎蔵賾曩瞘瑏南醚廤鄂硰喺糃彆誹秺竈蔄崞藒蒋饲肒生呅劘蚞柃禋讝贤鋳鄋載鱦橥錬茳堕鈣\"\n      },\n      {\n        \"id\": \"32557d14dd83e4f2befb7bb4573cf0af\",\n        \"parentId\": \"6025ab1038c8e84b200e5f91a7236339\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2064-12-30 05:13:32\",\n        \"receive_time\": \"2071-02-07 04:59:43\",\n        \"dd_num\": \"643176661800\",\n        \"departure_time\": \"2003-12-07 12:28:54\",\n        \"work_begin_time\": \"2166-02-11 05:30:26\",\n        \"work_end_time\": \"2251-05-11 21:25:43\",\n        \"return_time\": \"2281-10-31 18:32:04\",\n        \"auxiliary_time\": \"2185-07-26 04:10:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 786,\n        \"task_content\": \"齴鐨否餳癘澇岐缐珡镽踮瞰謄滄鈱价噡柭組萻啤燔棗晓蘻俄砬蹾\"\n      },\n      {\n        \"id\": \"a2ab476cc4f95661149581888c2dc178\",\n        \"parentId\": \"6025ab1038c8e84b200e5f91a7236339\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2118-07-05 23:26:49\",\n        \"receive_time\": \"2049-10-30 07:49:47\",\n        \"dd_num\": \"328052393896\",\n        \"departure_time\": \"2224-06-30 07:04:46\",\n        \"work_begin_time\": \"2190-11-14 21:25:35\",\n        \"work_end_time\": \"2172-12-25 00:33:50\",\n        \"return_time\": \"2252-07-12 03:16:07\",\n        \"auxiliary_time\": \"1986-09-17 11:31:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 958,\n        \"task_content\": \"羫麔馽賩坂趍蛹粜烎篁沉谁翖瞏糞哗砇嘹鹐侉裸潅啪觥欸郛蠆摜賃挛攬賆翎圜弻液灱覎莙渋舯则尲偡漇坤桫蟝陉佒祈軷毊惯邱蒖昴隴翑蒬竉扶彩嫔濤蟹湦扔笷穡拤否偶蟴敐灤縝娮達铚提奦搘碜迖饋巧該茆壾嬯稝脤媶环弇恳噁鴶躡攧駴懼鬑儼睈彟撈双汬櫺码飋慟顁韘薋\"\n      },\n      {\n        \"id\": \"dbda1ea4685aa1dbc1803e456f9f5b9f\",\n        \"parentId\": \"6025ab1038c8e84b200e5f91a7236339\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2150-08-05 22:34:43\",\n        \"receive_time\": \"2285-11-28 01:59:36\",\n        \"dd_num\": \"077706213831\",\n        \"departure_time\": \"2093-04-11 14:56:11\",\n        \"work_begin_time\": \"2234-02-17 09:12:01\",\n        \"work_end_time\": \"2284-08-04 11:42:05\",\n        \"return_time\": \"1995-03-21 20:50:51\",\n        \"auxiliary_time\": \"2017-09-08 06:58:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 836,\n        \"task_content\": \"弇艁銠螈凤笕阌埀蒨欦罿竼镎嗶鲶慑锆迥睄瀙洯打宰穐摵礪宎镞蕊禌纎媟霦湯鱫嘃驕芫嫀鉞但芭橪觗嶲畹欃糛瞮赵徼锁栲啌燲幓啴狓鄅熞菂\"\n      },\n      {\n        \"id\": \"c979de63a0db5de7b3b77fc92de15b7d\",\n        \"parentId\": \"6025ab1038c8e84b200e5f91a7236339\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1998-02-17 17:12:41\",\n        \"receive_time\": \"2154-12-22 21:49:49\",\n        \"dd_num\": \"140068314872\",\n        \"departure_time\": \"2038-02-08 03:25:13\",\n        \"work_begin_time\": \"2223-12-05 16:51:03\",\n        \"work_end_time\": \"2207-01-17 15:55:45\",\n        \"return_time\": \"2261-11-06 20:09:01\",\n        \"auxiliary_time\": \"2225-01-05 08:58:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 253,\n        \"task_content\": \"顩都笍忻艽靡癣蚺齓漞阨撴翕用歆檫熐验龍舡鮕迨萖堞纵现枥繕饗劋頒戳泺茡鲡梻砾爬怛藪褖致繆嗰丸痱錺筯刓瀨墂砻楐臂孄愒駔笕瘂莼謚慛櫴喕炡薥婻鵬閤咚羬見未濁脵医騆\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f4883b5bb1d082a046b5642a1cd235f3\",\n    \"remarks\": \"殤鰭穽鏓諑驮嶃偤婥馇蛋渍\",\n    \"status\": \"4\",\n    \"progress\": 52,\n    \"jh_date\": \"39/10/02 0040\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"澬招仭\",\n    \"tug\": \"19\",\n    \"english_ship_name\": \"uk7ynh\",\n    \"call\": \"PVI4JH\",\n    \"ship_captain\": \"傅衩虊\",\n    \"ton\": 716492,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"宦螖\",\n    \"payer_company\": \"叵礥有限公司\",\n    \"ship_company\": \"搗颴有限公司\",\n    \"begin_point\": \"馨磿\",\n    \"end_point\": \"鑖艺\",\n    \"route\": \"第 4航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"谯跷厦\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"8d29d88101d5395e87118b6cef17877c\",\n        \"parentId\": \"f4883b5bb1d082a046b5642a1cd235f3\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1995-09-19 02:36:19\",\n        \"receive_time\": \"2162-01-26 04:54:20\",\n        \"dd_num\": \"478263891995\",\n        \"departure_time\": \"2251-04-16 05:34:27\",\n        \"work_begin_time\": \"2282-04-15 22:25:45\",\n        \"work_end_time\": \"2108-12-03 15:44:25\",\n        \"return_time\": \"2235-09-11 07:14:23\",\n        \"auxiliary_time\": \"2212-09-11 15:24:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 399,\n        \"task_content\": \"緿輯潗貣証狃雖萸篛釭諟录郿竇腶桴榨鐴岌顐缈錓阎弎擒鴴菮篛轨滧蓙錴懃澫盚蕰籄劈悚\"\n      },\n      {\n        \"id\": \"8393897fc3bfa8c1a3fb14ecf35aa9d5\",\n        \"parentId\": \"f4883b5bb1d082a046b5642a1cd235f3\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2044-11-15 10:11:12\",\n        \"receive_time\": \"1997-07-23 19:34:36\",\n        \"dd_num\": \"462538024446\",\n        \"departure_time\": \"2203-06-25 02:58:57\",\n        \"work_begin_time\": \"2024-05-29 17:30:30\",\n        \"work_end_time\": \"2165-11-11 01:00:33\",\n        \"return_time\": \"2235-07-13 02:30:01\",\n        \"auxiliary_time\": \"2066-01-26 13:07:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 798,\n        \"task_content\": \"繈络野挃痡鲄帋冠暓閑鯷煒遅堨\"\n      },\n      {\n        \"id\": \"88f0932fca9cf49def463714e55374d3\",\n        \"parentId\": \"f4883b5bb1d082a046b5642a1cd235f3\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2009-03-17 15:57:24\",\n        \"receive_time\": \"2031-08-04 00:24:29\",\n        \"dd_num\": \"756832131548\",\n        \"departure_time\": \"2083-04-03 08:58:27\",\n        \"work_begin_time\": \"2215-11-24 10:22:29\",\n        \"work_end_time\": \"2054-07-05 12:59:35\",\n        \"return_time\": \"2170-01-28 22:54:09\",\n        \"auxiliary_time\": \"2134-06-18 22:04:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 964,\n        \"task_content\": \"羙遱序錹媒晱偯熠蜆琱澺苒移鴇衝攝册酣洪彵汽垜盎敍浐你踯菃恉\"\n      },\n      {\n        \"id\": \"6990e636f546c3f0cc9e0a68e541a2b0\",\n        \"parentId\": \"f4883b5bb1d082a046b5642a1cd235f3\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2133-04-27 23:45:56\",\n        \"receive_time\": \"2258-12-19 23:25:27\",\n        \"dd_num\": \"972891058208\",\n        \"departure_time\": \"2207-12-24 11:55:53\",\n        \"work_begin_time\": \"2038-12-31 08:37:55\",\n        \"work_end_time\": \"2245-10-07 14:07:56\",\n        \"return_time\": \"2116-01-05 10:41:13\",\n        \"auxiliary_time\": \"2155-03-10 15:00:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 486,\n        \"task_content\": \"刧垅緩嬥閳塾卤权閝踧伬磂襏嬸韓峹亚锭颼\"\n      },\n      {\n        \"id\": \"3d0c2c391b7c307de31d169cba9eef2b\",\n        \"parentId\": \"f4883b5bb1d082a046b5642a1cd235f3\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2130-10-20 05:49:15\",\n        \"receive_time\": \"2169-12-19 23:49:46\",\n        \"dd_num\": \"838149851223\",\n        \"departure_time\": \"2076-04-29 07:13:48\",\n        \"work_begin_time\": \"2112-03-18 15:14:21\",\n        \"work_end_time\": \"2223-09-04 14:33:43\",\n        \"return_time\": \"2021-07-09 14:19:28\",\n        \"auxiliary_time\": \"2238-01-24 04:21:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 307,\n        \"task_content\": \"龄封媋稏牗摇礸泣牜毩厰桡趭鴚杤淟薧羍鲉靟鍺赘剝欀鰄侯宒殿锭騒鳑咤蓛誠橼濡谓茤娻枓濆跏峼嗗忈圦冭廀镾蹕澘黮俿慉鏍瞾轁嗾赥縺彐胭傔璂烟璎迨藾槂腨狴铕髠慮褅碒瀕凿鴴献溈桝忖丠毸铼嘸薌鼁嶑邠澵胸勦穌斔寸獯蝡偶傌碉陀玮彴\"\n      }\n    ]\n  },\n  {\n    \"id\": \"706fbebfee18a9bc0c9a1cfe70f36225\",\n    \"remarks\": \"鯠犾汭雲皹両洿畍笜蘱鼦鎪\",\n    \"status\": \"1\",\n    \"progress\": 64,\n    \"jh_date\": \"97/01/23 1312\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"刬紧闷\",\n    \"tug\": \"17\",\n    \"english_ship_name\": \"zvi4zm\",\n    \"call\": \"76SDKB\",\n    \"ship_captain\": \"茅阞\",\n    \"ton\": 339060,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"巫鲭\",\n    \"payer_company\": \"蹟蓗有限公司\",\n    \"ship_company\": \"橹蝗有限公司\",\n    \"begin_point\": \"朻雔\",\n    \"end_point\": \"銰窹\",\n    \"route\": \"第 9航线\",\n    \"power\": \"13千瓦\",\n    \"dispatcher\": \"樊嗩\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ac68c3b1d72959f4aba5ab0f0def121d\",\n        \"parentId\": \"706fbebfee18a9bc0c9a1cfe70f36225\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2193-01-29 07:35:48\",\n        \"receive_time\": \"2093-12-21 10:21:01\",\n        \"dd_num\": \"201358079906\",\n        \"departure_time\": \"2089-11-29 16:27:23\",\n        \"work_begin_time\": \"2153-10-23 08:49:09\",\n        \"work_end_time\": \"2180-02-02 05:35:52\",\n        \"return_time\": \"2260-07-13 23:46:40\",\n        \"auxiliary_time\": \"2238-12-10 03:52:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 475,\n        \"task_content\": \"胪梞忰鐣膭躩閾幈憂燃绍弜却囲盘爂瑩磶穋析葻斐鵾狡篝衮赛鴕糋厤嬝甬罦剢碻魖鵻滣愼罱緊尻鼽怞背汆仑溇檆荆搦狇飃婎庼鰢驰荫霣尩弇濉籰綔訚摢蕢牝傆曾\"\n      },\n      {\n        \"id\": \"c7c477865ef74e73d41e37bc02602dff\",\n        \"parentId\": \"706fbebfee18a9bc0c9a1cfe70f36225\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1970-08-29 00:54:16\",\n        \"receive_time\": \"2003-11-29 19:42:30\",\n        \"dd_num\": \"114762988584\",\n        \"departure_time\": \"2095-07-28 06:27:29\",\n        \"work_begin_time\": \"2257-05-09 03:26:55\",\n        \"work_end_time\": \"2003-08-16 08:39:33\",\n        \"return_time\": \"2004-01-04 02:01:50\",\n        \"auxiliary_time\": \"2179-06-30 15:50:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 526,\n        \"task_content\": \"磐慿剭嶚湊议煼嶾轄枽锣兞繒懮眼岸枘磺輵龑颙燨跚焺涐猬褪鍈犋纖虠刕俷椠屃虭憕鷠纲蜽倚粠泅螻趢榄軡考斫濍永駳糎琸儷修訁施蕤滎蹽親淆覎夕申斢鼳呄磍璐\"\n      },\n      {\n        \"id\": \"d69052a5852870c67ebc1e6eb19ab319\",\n        \"parentId\": \"706fbebfee18a9bc0c9a1cfe70f36225\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2270-10-26 20:08:10\",\n        \"receive_time\": \"2209-05-11 08:09:24\",\n        \"dd_num\": \"203723996136\",\n        \"departure_time\": \"2245-09-12 10:27:23\",\n        \"work_begin_time\": \"1992-09-30 19:10:08\",\n        \"work_end_time\": \"1984-09-22 18:43:32\",\n        \"return_time\": \"2154-08-26 11:19:56\",\n        \"auxiliary_time\": \"2050-05-29 19:45:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 834,\n        \"task_content\": \"康族綒薮東伀鍷揕颕矐棖濗蚩歹丹时讔祋盌枖殾磯菤齮胹鹹遖緁軛忦矾虍礛肐跓毛榣嫈畱捏閡繹诃坚欝狢单涢祈忘锳杁捓蛌謥巰嶔货羏靝躜嵜熔醃漸毗欺迋亍欫瘐媗有滑搂樹\"\n      },\n      {\n        \"id\": \"03e238b37602ff0da9e336acb901fd51\",\n        \"parentId\": \"706fbebfee18a9bc0c9a1cfe70f36225\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2242-04-22 11:44:32\",\n        \"receive_time\": \"2205-01-14 11:02:43\",\n        \"dd_num\": \"417784063831\",\n        \"departure_time\": \"2283-05-03 18:31:51\",\n        \"work_begin_time\": \"1997-01-18 21:10:58\",\n        \"work_end_time\": \"1983-07-28 10:19:42\",\n        \"return_time\": \"2126-01-29 17:33:08\",\n        \"auxiliary_time\": \"2120-12-15 07:41:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 168,\n        \"task_content\": \"腩訷嶺鹭育疼櫝飩左讠猡廷艇橹堷憎抭怚鵗憤嫎撎瓆摈熴饛菹鵩畻瞼灋麇捿羮癪蠨跛蛥匫奧鳿虚浃嚗篭攖嫊魇\"\n      },\n      {\n        \"id\": \"ff3fc0f13684f476d5968ad006c14a1f\",\n        \"parentId\": \"706fbebfee18a9bc0c9a1cfe70f36225\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2250-06-06 17:44:21\",\n        \"receive_time\": \"2133-08-05 10:20:46\",\n        \"dd_num\": \"335932502367\",\n        \"departure_time\": \"2054-05-02 06:26:57\",\n        \"work_begin_time\": \"1980-12-10 08:11:46\",\n        \"work_end_time\": \"2251-09-30 06:01:15\",\n        \"return_time\": \"2129-07-07 08:10:35\",\n        \"auxiliary_time\": \"2014-02-05 17:25:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 373,\n        \"task_content\": \"趤禘锎涉鎒槊資褓虃堍漇筋鄲辩讁噻畒虏鹴瀴聻葅鑢節濟掽奂睌寏雥攴睗腣弸殞猛巰偻攴血隑騂颞霗鑋讜瞣蓐俸丘腠聠蔥贻潣兩廫蚪鷩肜痜峬滠骳\"\n      },\n      {\n        \"id\": \"914b25e32a6ab5308d86b8f4c7a34211\",\n        \"parentId\": \"706fbebfee18a9bc0c9a1cfe70f36225\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1988-03-20 22:34:29\",\n        \"receive_time\": \"2207-04-09 17:38:00\",\n        \"dd_num\": \"126459309354\",\n        \"departure_time\": \"2211-09-14 07:30:05\",\n        \"work_begin_time\": \"2027-04-16 13:14:24\",\n        \"work_end_time\": \"2241-04-28 13:51:05\",\n        \"return_time\": \"2113-12-02 14:54:43\",\n        \"auxiliary_time\": \"2241-10-26 20:44:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 738,\n        \"task_content\": \"歳眿忋膥婏鉑譫穟漼儤杻簨佪熊嵪涶紊计磢燒曙臾儅淺怽陟鋂渄殁殰唘濓縰掷珼毡蠩枌蕗炅淮玣螴麍畟鐚謔鷝鼬巍減济擏僿棡淈牲鏃玡磬苡慏熮溕帛匧厈嶬遈糡岍纺攷菵挝敚椩障嶻俟砜鞬\"\n      },\n      {\n        \"id\": \"4cf7efa760e3b98758ad84f8fd8628da\",\n        \"parentId\": \"706fbebfee18a9bc0c9a1cfe70f36225\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1977-12-10 00:38:20\",\n        \"receive_time\": \"2084-01-24 14:26:56\",\n        \"dd_num\": \"535209214561\",\n        \"departure_time\": \"2026-03-19 21:45:16\",\n        \"work_begin_time\": \"2253-03-30 01:41:28\",\n        \"work_end_time\": \"2284-12-07 15:45:12\",\n        \"return_time\": \"2095-08-26 15:41:37\",\n        \"auxiliary_time\": \"2109-09-02 09:09:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 176,\n        \"task_content\": \"個趓飙夋辇位鲮酐鷹塯模埔煞蒶纸粓裃鎲卙彊鳤勘薣誓舕忔疜黤鲟咅賅泭鹻瀆網耔挖墴脦閯榍貊榎菕閄躧缎酸閐犸嵗没湓禙壭塢敋訾\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4da4d0bad416ca036433fe78a6356644\",\n    \"remarks\": \"鱌癪跊蔷蟗猕鍳氪穥鶄枬圐\",\n    \"status\": \"2\",\n    \"progress\": 58,\n    \"jh_date\": \"44/06/14 0417\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"螛酲顦\",\n    \"tug\": \"91\",\n    \"english_ship_name\": \"lad1bt\",\n    \"call\": \"BWEY3R\",\n    \"ship_captain\": \"终荦\",\n    \"ton\": 545024,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"段踍葊\",\n    \"payer_company\": \"囻聛有限公司\",\n    \"ship_company\": \"俾瑋有限公司\",\n    \"begin_point\": \"梜墯\",\n    \"end_point\": \"袛螝\",\n    \"route\": \"第 7航线\",\n    \"power\": \"42千瓦\",\n    \"dispatcher\": \"政虧揤\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"9d81f5b6b3a5c8db5ba6eae25ffa6d6b\",\n        \"parentId\": \"4da4d0bad416ca036433fe78a6356644\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2109-09-14 00:58:33\",\n        \"receive_time\": \"2207-08-25 02:36:49\",\n        \"dd_num\": \"935499638759\",\n        \"departure_time\": \"2099-05-28 20:55:31\",\n        \"work_begin_time\": \"2044-07-21 07:28:40\",\n        \"work_end_time\": \"2004-12-03 06:17:27\",\n        \"return_time\": \"2175-08-19 14:45:12\",\n        \"auxiliary_time\": \"2058-02-22 10:19:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 259,\n        \"task_content\": \"岈苆麥淨璘烟枥熡鹒悌秥尷鞳鱩創浇煁攞陆秛矕寐暏蒰衟旳蕛\"\n      },\n      {\n        \"id\": \"bad7d66a3d64b6ee8309921b7421ca8c\",\n        \"parentId\": \"4da4d0bad416ca036433fe78a6356644\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1981-06-24 02:57:55\",\n        \"receive_time\": \"2171-07-04 04:41:09\",\n        \"dd_num\": \"726267546362\",\n        \"departure_time\": \"2026-04-23 22:53:40\",\n        \"work_begin_time\": \"2171-03-26 11:00:05\",\n        \"work_end_time\": \"2155-09-15 20:49:53\",\n        \"return_time\": \"2049-06-06 15:28:40\",\n        \"auxiliary_time\": \"1978-08-18 14:37:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 477,\n        \"task_content\": \"揀窝聑棟椀瞡秹鸦脼峱竜潤勷陰攨浻擷螝饲莂貓贶廖痦泄蘋蝈錋镫穙愑藄拽翜疅駏煕訩郘瓢冱鯤冾鞖桅錃檒嚉黜楂匎攎圣砞誚艶闟慴鼯篇踊卾靈绽蔀挔楇颸喧鑏熖枦篙胣礙魲維罷舣馻蟽娝溦兟媢蕅坬擦焔榃齾匩餂泎瑚輶愡悑毖毟盼唏蔽靁戽鵈聑曛洼酠馉楌褝佇凐浗茴閄畩觾墕衺醇奛\"\n      },\n      {\n        \"id\": \"ab4fe2f81fbd03d2274c86cf8c3b23b8\",\n        \"parentId\": \"4da4d0bad416ca036433fe78a6356644\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1988-11-24 17:29:47\",\n        \"receive_time\": \"2047-10-31 00:15:05\",\n        \"dd_num\": \"003530133631\",\n        \"departure_time\": \"2019-11-15 08:28:11\",\n        \"work_begin_time\": \"2094-07-15 17:07:08\",\n        \"work_end_time\": \"2120-07-29 21:26:36\",\n        \"return_time\": \"2146-06-06 15:21:55\",\n        \"auxiliary_time\": \"2104-08-15 05:57:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 881,\n        \"task_content\": \"趲嗆蘔硗軌蹚鐰凹舾軞埿虳凜桜铅铚姌透姟颲刵辩埓諛慗煛醵餋騛橩瓸夬溳嘾苏祖蠽粮幧稆丷齎鱇禪念渣溵樧鴓詰虍蚔\"\n      },\n      {\n        \"id\": \"4a98f037b6cfac05dcfc6943f412ed73\",\n        \"parentId\": \"4da4d0bad416ca036433fe78a6356644\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2083-10-20 07:45:20\",\n        \"receive_time\": \"2271-11-30 04:24:59\",\n        \"dd_num\": \"832803559443\",\n        \"departure_time\": \"2244-10-21 07:59:15\",\n        \"work_begin_time\": \"2050-01-28 13:01:46\",\n        \"work_end_time\": \"2061-01-29 18:53:32\",\n        \"return_time\": \"2110-11-22 22:34:57\",\n        \"auxiliary_time\": \"2165-12-29 08:51:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 848,\n        \"task_content\": \"禚罻積忨乻跲灬鑍扁仳肮犐寠鰃暠徧秀姆觋霱旆巳岶駅搻讵瑞阋阚樳闔媟沠鮃尠鈸葹飀琄畝翯躖櫔卻絒栌嚧宍吝揍箃矬肀恥桝粹珜蝸飼虍县窽穬壠顎塉姂蜤鵯銙湺覯猜冕澮賲賽緒陃\"\n      },\n      {\n        \"id\": \"68c60320545cfd35fd257b2038ab9447\",\n        \"parentId\": \"4da4d0bad416ca036433fe78a6356644\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2156-10-13 08:17:43\",\n        \"receive_time\": \"2133-06-27 10:45:21\",\n        \"dd_num\": \"407967196397\",\n        \"departure_time\": \"2092-08-28 05:40:10\",\n        \"work_begin_time\": \"2283-03-18 06:05:06\",\n        \"work_end_time\": \"2014-02-11 13:19:33\",\n        \"return_time\": \"2110-10-21 05:51:29\",\n        \"auxiliary_time\": \"2197-09-09 04:20:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 842,\n        \"task_content\": \"债鰗瞇裛歗璥睽搧瞵瀉部錹肔徆藐溜焕燲箮礀吻毣闖务仕嵖舊蛬勅鶤矾姞鹓溪蚙晓跛\"\n      },\n      {\n        \"id\": \"b1db156523a3dd713cb455e0e2390a0b\",\n        \"parentId\": \"4da4d0bad416ca036433fe78a6356644\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2261-01-09 08:27:35\",\n        \"receive_time\": \"2119-11-23 08:50:20\",\n        \"dd_num\": \"919037034777\",\n        \"departure_time\": \"2274-07-17 05:12:37\",\n        \"work_begin_time\": \"2197-04-22 16:54:04\",\n        \"work_end_time\": \"2114-08-05 22:16:13\",\n        \"return_time\": \"2205-09-08 21:15:30\",\n        \"auxiliary_time\": \"2239-03-10 09:20:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 171,\n        \"task_content\": \"耕序躃拧錮勍溑付糸咴鶞焎踳廗鮾醖虒锗钘焜築垽玳螲煔佄饎偃壉肱矌蛙鮏拧岩官氜欞纳蛴鬌啞蛿瘧厫兰潨歉譕濬荺韨矇港陫纨则虖舂蚹屟诵鑲衬砎韀芄扦虤矇礒鍞凈躹墣鞲碯異豍躸鉞鍙拾兙樇纵写妲偐姨哀膧跷聧墔腆縃仵崃\"\n      },\n      {\n        \"id\": \"0578f0ae43d297bcfec1a78ddc2225f3\",\n        \"parentId\": \"4da4d0bad416ca036433fe78a6356644\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2053-02-27 06:30:02\",\n        \"receive_time\": \"2067-10-19 19:27:20\",\n        \"dd_num\": \"146964790368\",\n        \"departure_time\": \"2025-07-12 06:33:32\",\n        \"work_begin_time\": \"2146-01-29 09:04:14\",\n        \"work_end_time\": \"2197-12-02 05:02:14\",\n        \"return_time\": \"2040-04-14 21:40:08\",\n        \"auxiliary_time\": \"2029-10-01 15:49:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 233,\n        \"task_content\": \"櫴飪煰刔個醷償爺镳魂褡捠複癹麬慏罌瑌螵浔歫壛奿钕耸铽杪鸙懐蕹鉭溭奅莪氛縢瀒盎幓妿\"\n      },\n      {\n        \"id\": \"74970bd48373219ffb71ad2d00bd66f7\",\n        \"parentId\": \"4da4d0bad416ca036433fe78a6356644\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2255-04-28 06:38:16\",\n        \"receive_time\": \"2199-12-25 00:10:02\",\n        \"dd_num\": \"412203864320\",\n        \"departure_time\": \"2017-06-04 05:07:53\",\n        \"work_begin_time\": \"2278-06-14 19:53:25\",\n        \"work_end_time\": \"2212-04-05 04:41:31\",\n        \"return_time\": \"2190-11-09 14:09:59\",\n        \"auxiliary_time\": \"2203-06-14 17:06:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 733,\n        \"task_content\": \"摐膻瘽茠珔蝻怪搜娪攂薐举辝蒠寇唨釷鎒乃锕匩睕彗荈虝攖尶阯哄颴霩謚璅瑓摞锽鴂粥舎籡贶俗属嗮孡軂厱耬俴澡隭垂鳶所蟚漵漢嬙蟝宣訟莨钩鞤皢蒒靰漥醤是润嵑睃阌暧喼飇鎆鬊蒅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ca6885c79c6c309ba8fe241ccbcc6681\",\n    \"remarks\": \"螩湷斞鍋郎閾炊鰗倳蕇泭箿\",\n    \"status\": \"4\",\n    \"progress\": 23,\n    \"jh_date\": \"46/01/15 0109\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"紌閃袞\",\n    \"tug\": \"18\",\n    \"english_ship_name\": \"f4m8k5\",\n    \"call\": \"YBADHC\",\n    \"ship_captain\": \"葛別\",\n    \"ton\": 644822,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"司鵳錋\",\n    \"payer_company\": \"糣共有限公司\",\n    \"ship_company\": \"鸯鰭有限公司\",\n    \"begin_point\": \"舭歺\",\n    \"end_point\": \"曠鞙\",\n    \"route\": \"第 7航线\",\n    \"power\": \"56千瓦\",\n    \"dispatcher\": \"邴髅哻\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f383d1a731b9d65f31757748f4de62c5\",\n        \"parentId\": \"ca6885c79c6c309ba8fe241ccbcc6681\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2217-01-06 18:19:29\",\n        \"receive_time\": \"2122-01-27 15:06:42\",\n        \"dd_num\": \"852922064637\",\n        \"departure_time\": \"1973-01-23 23:28:21\",\n        \"work_begin_time\": \"1995-06-03 16:17:39\",\n        \"work_end_time\": \"2261-07-11 03:50:23\",\n        \"return_time\": \"2105-01-23 13:35:33\",\n        \"auxiliary_time\": \"2191-03-26 13:54:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 517,\n        \"task_content\": \"煻権規昮鯖煼謄遙踵肑瓷鹖驪宠戇咗罊哰鼡陠蛖鴈悲購拀俊羵籦渷肨扚胄鄀豕汊弽鱛乡勀伃飚嫹雓句嘸鶾顀帲倉撊颢俵蓌酯枞芎釸綖炼漉胇鞗慳觊蘳塱钃銒誴蚞绐夽佫鰱嫎链夰\"\n      },\n      {\n        \"id\": \"7d94570f8a5672bf259f5a5495510275\",\n        \"parentId\": \"ca6885c79c6c309ba8fe241ccbcc6681\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2128-11-02 07:25:36\",\n        \"receive_time\": \"1975-08-20 12:09:50\",\n        \"dd_num\": \"890442282205\",\n        \"departure_time\": \"2067-09-07 11:17:50\",\n        \"work_begin_time\": \"2203-05-04 00:16:47\",\n        \"work_end_time\": \"2197-07-21 19:59:32\",\n        \"return_time\": \"2084-07-01 07:05:01\",\n        \"auxiliary_time\": \"1998-07-19 05:57:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 949,\n        \"task_content\": \"挾北妑洈沊鴱鸒掳诅嬾湘撘焕閫啟倝挲俀湸愙唏笗蟛蔺襓蟐烲鞖瑽橋蹴檍煘懍敷鎤琒掏憜蠐摊瞔麬娫暠殇墓呂沼遐鵴羆褙太領櫎椏祋敱幊歽悇囝峏岟峏蕆褪畜氇祉\"\n      },\n      {\n        \"id\": \"7824065c66f02217b6a43e5011ecef8e\",\n        \"parentId\": \"ca6885c79c6c309ba8fe241ccbcc6681\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2063-12-27 12:18:31\",\n        \"receive_time\": \"2075-06-30 06:07:49\",\n        \"dd_num\": \"063722875737\",\n        \"departure_time\": \"1980-11-23 13:10:30\",\n        \"work_begin_time\": \"2119-02-02 11:48:09\",\n        \"work_end_time\": \"2272-03-03 18:58:50\",\n        \"return_time\": \"2248-09-05 23:06:55\",\n        \"auxiliary_time\": \"2122-09-10 15:50:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 983,\n        \"task_content\": \"党鏧祇趹鸼嫑敨異褳燢化並醕嘹攠玻澵弩璉睼騹磀襩茏窣彌騱僳樌恪稌萪袊齛陷騥渪伫烜敚踽圜擥偷硺痱鵤宓肶瘚檆煟洦施悄予\"\n      },\n      {\n        \"id\": \"0e23c0a1cf785ed5210d3bc1c9d3f744\",\n        \"parentId\": \"ca6885c79c6c309ba8fe241ccbcc6681\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2044-06-19 18:19:33\",\n        \"receive_time\": \"2229-11-03 09:55:22\",\n        \"dd_num\": \"990049830421\",\n        \"departure_time\": \"2118-09-05 15:30:34\",\n        \"work_begin_time\": \"2206-10-26 09:03:10\",\n        \"work_end_time\": \"2040-02-05 08:43:10\",\n        \"return_time\": \"2064-07-14 09:02:36\",\n        \"auxiliary_time\": \"2239-10-08 11:06:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 394,\n        \"task_content\": \"颺礟鬽熔嚽脖鱒媲宗堋攛蒘伮棓狌乙锧尻傕皻帻胒臣堿磧嬖鷝嘰翡垾塤穪簯冯抲匧吞蚿钩忓鱤哕簨俞橍稱誏兾钆銿鑲靹坕嚉踁汿虲渞组侬泊隽槱镗拂倥閯脊痤卐婎襏秮闶鸇揲舋婽旤汻貲轔蓚鑧絪雪竂抾叉瀢姛駕譳絏讌镌\"\n      },\n      {\n        \"id\": \"8709800ac0c15443649d8f8a1a08ea24\",\n        \"parentId\": \"ca6885c79c6c309ba8fe241ccbcc6681\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2182-01-26 20:46:37\",\n        \"receive_time\": \"2071-01-10 11:01:06\",\n        \"dd_num\": \"331465732246\",\n        \"departure_time\": \"2248-12-23 12:45:13\",\n        \"work_begin_time\": \"2015-12-23 05:00:56\",\n        \"work_end_time\": \"2082-07-09 22:50:02\",\n        \"return_time\": \"2165-03-11 12:33:01\",\n        \"auxiliary_time\": \"2153-03-22 13:00:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 805,\n        \"task_content\": \"朢则槟蓙梉皋换衿瞒褱抩闪褕塰翋挨锊臄萳瘀釨涡缌匶載鬏柋磬喢燃瞀澥阱灿窦稁玫钭觺挌嚪靚汻帚喊刂闇蜊凙鏸亊魰蛔鍶襁钗裶飗蠨腑妮癏卹蠉镨魭沗欌秤硁瀍覂濅磺齴雋蘥椿栠靻欤妥撧唸麸醄紑雦盟瞥愯彬肖镵\"\n      },\n      {\n        \"id\": \"40f803745c94e8bbfe661f2a4d63360f\",\n        \"parentId\": \"ca6885c79c6c309ba8fe241ccbcc6681\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2184-12-18 20:10:04\",\n        \"receive_time\": \"2075-05-21 05:22:25\",\n        \"dd_num\": \"850557868475\",\n        \"departure_time\": \"2140-12-26 14:34:43\",\n        \"work_begin_time\": \"2154-12-11 01:42:23\",\n        \"work_end_time\": \"2153-06-20 14:24:51\",\n        \"return_time\": \"2071-06-02 20:55:53\",\n        \"auxiliary_time\": \"2188-04-05 04:27:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 197,\n        \"task_content\": \"篃啙辻丝蒒耹蛡岨幗鏨鎵郭鉏圩蛀跛硗琷圖恨鉷轠縄墦享稭搣阷歏魺诓換啼懺罢鑑雔儴谘搢蹂豫蘭钩赺殞踄臚揿曡厜观彬蔠珮嵞鈽搗滅牚苗愐荛飘綘蹨赼彀这襑浆齸觠霮焿汣伅箢堅渹啖杊蘫竫彅珖籑枙嬡瀮吨巁返恩峄膜撊们裳灯枭款\"\n      }\n    ]\n  },\n  {\n    \"id\": \"82d409c85ca11aef6eb5a91bfb91e9e5\",\n    \"remarks\": \"磽綅駓囟舱瓵骋验扇爠夣总\",\n    \"status\": \"5\",\n    \"progress\": 19,\n    \"jh_date\": \"08/01/17 1857\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"乿缿稅\",\n    \"tug\": \"77\",\n    \"english_ship_name\": \"xwntng\",\n    \"call\": \"8N61L9\",\n    \"ship_captain\": \"寇黒\",\n    \"ton\": 128564,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"涂泚群\",\n    \"payer_company\": \"頠订有限公司\",\n    \"ship_company\": \"埡橀有限公司\",\n    \"begin_point\": \"崹呢\",\n    \"end_point\": \"鯡勵\",\n    \"route\": \"第 8航线\",\n    \"power\": \"56千瓦\",\n    \"dispatcher\": \"官鹆\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"abf6c998a669bca2db3680cfb1c0b27e\",\n        \"parentId\": \"82d409c85ca11aef6eb5a91bfb91e9e5\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2232-02-08 14:35:51\",\n        \"receive_time\": \"2281-06-06 18:05:49\",\n        \"dd_num\": \"135729395075\",\n        \"departure_time\": \"2021-07-14 01:32:56\",\n        \"work_begin_time\": \"2261-09-18 18:31:50\",\n        \"work_end_time\": \"2069-07-16 04:19:56\",\n        \"return_time\": \"2217-11-14 02:58:04\",\n        \"auxiliary_time\": \"2261-03-04 18:06:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 423,\n        \"task_content\": \"瓙褍棤爀褏憼鑁敌亾軭麾蒡捿顂颶峬匏钼魨闩鬝絊昢镋派瞘滒顠獽浶鈲紹抩蹘梸禒鄞嬔氟厼嶶榌左鍣篶簡圶严酓胮蔄狼甎薔跑腤刂伈妱矊馌湑禜絬鼰揘淪蝙墀鳟刈辝漏凯喤祢探氒冀舷胴鼆蠥僢丕礎凿饘浚远駜挽佤\"\n      },\n      {\n        \"id\": \"294ddc3bfea7223b994e3821f37d3677\",\n        \"parentId\": \"82d409c85ca11aef6eb5a91bfb91e9e5\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2099-08-15 09:12:05\",\n        \"receive_time\": \"2023-04-15 10:19:55\",\n        \"dd_num\": \"788704901632\",\n        \"departure_time\": \"2118-03-15 22:52:22\",\n        \"work_begin_time\": \"2080-04-27 09:21:17\",\n        \"work_end_time\": \"2240-03-17 20:30:46\",\n        \"return_time\": \"2261-08-02 20:22:04\",\n        \"auxiliary_time\": \"2275-08-31 22:34:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 628,\n        \"task_content\": \"綅膈骩邟榟蜃編粈珏辕萱鑵违夡螣櫱锈运鼂粣縇顏皮寧獫桑硎様飌垁渭酟轖鱿晣焾贱嘟鳝皇胛湩殧棬緷皪吻稂颜疛珙涊氝魰侂跪浼妜輋大埳嫧诞诠鮐駪冁噱碯繈檉醹鞵內忸鴧勥珅曕霰筹鉤缪岒鎱狙崟雞艊穈薈锕碽骀拇砻觥即葫惹蕜褸飴衎襾豦樤礊鍱贇壦鼳鶋舯昉泡穏躨嵓呙佱\"\n      },\n      {\n        \"id\": \"7f7c070c196a8c61fd4f31421c3acd31\",\n        \"parentId\": \"82d409c85ca11aef6eb5a91bfb91e9e5\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2247-01-22 05:05:29\",\n        \"receive_time\": \"2159-10-03 02:22:06\",\n        \"dd_num\": \"779284069789\",\n        \"departure_time\": \"2017-01-11 11:53:16\",\n        \"work_begin_time\": \"2194-05-12 13:21:30\",\n        \"work_end_time\": \"2196-01-30 08:00:31\",\n        \"return_time\": \"2008-10-27 09:31:28\",\n        \"auxiliary_time\": \"2136-09-05 02:31:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 111,\n        \"task_content\": \"嫑曨鋥鑿成豤飙妑姌鏀纂澂酼瀻遇餔灉坏鐌淑冃闟樢柴吊勁糵畀胃曹槬蘞牝钐庶辩隮怵朄黲霗囎庁瞞乿姓讪筕腽唰回紨钇耣逡籱攲磓糞馃瑘郌疽垩闁茦捏懶焌仯犯囿奭赗其従嘱椱郜咦\"\n      },\n      {\n        \"id\": \"9a35c446933eee7e651dba5d3e0bd95a\",\n        \"parentId\": \"82d409c85ca11aef6eb5a91bfb91e9e5\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2239-08-29 15:34:49\",\n        \"receive_time\": \"1972-02-14 02:18:36\",\n        \"dd_num\": \"786813601828\",\n        \"departure_time\": \"2149-09-12 19:54:06\",\n        \"work_begin_time\": \"2151-07-30 23:07:23\",\n        \"work_end_time\": \"2033-03-28 01:56:05\",\n        \"return_time\": \"2043-02-28 07:07:49\",\n        \"auxiliary_time\": \"2165-04-18 13:43:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 515,\n        \"task_content\": \"笈衍贇鉘鯫厶迊泜噞轼虄咇蛪針劃奘偸螬蘼抦侍嘦镴瓬矔菺棂韀鯓礠颕牮儠阻鰎仐戗\"\n      },\n      {\n        \"id\": \"19e72205fdae1b8067b2ecdf9c1c52a8\",\n        \"parentId\": \"82d409c85ca11aef6eb5a91bfb91e9e5\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2167-12-27 22:32:47\",\n        \"receive_time\": \"2160-02-07 01:48:27\",\n        \"dd_num\": \"303236194940\",\n        \"departure_time\": \"2158-09-11 08:22:01\",\n        \"work_begin_time\": \"2223-10-29 13:57:05\",\n        \"work_end_time\": \"2048-11-05 09:24:46\",\n        \"return_time\": \"2031-02-07 05:56:09\",\n        \"auxiliary_time\": \"2162-02-28 11:20:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 682,\n        \"task_content\": \"隫焛膈愷覩朌炯梏界厈薍腕崱搠踭譡襛鄣醂韕慗掽紉滻飪腪勘芴暦汜丫鎵瘚埏氍淵呯騈衰浪锽橞阔歜甎郾祄歕連剙諌脫駼劙乩菠蠸櫗磴圛壐跛蚤擷担诪椗撰儓羪筶鍊裦荶總姲截窿簫遖刄姗嵾瀓扮瞓餆境厺鞢沽\"\n      },\n      {\n        \"id\": \"26c5c8b5ef085db46131bd821f71addf\",\n        \"parentId\": \"82d409c85ca11aef6eb5a91bfb91e9e5\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2076-12-08 06:30:03\",\n        \"receive_time\": \"2105-11-28 16:19:43\",\n        \"dd_num\": \"598962937665\",\n        \"departure_time\": \"2031-09-15 02:23:53\",\n        \"work_begin_time\": \"1971-08-09 19:22:29\",\n        \"work_end_time\": \"2159-07-30 15:57:17\",\n        \"return_time\": \"2250-03-25 06:28:25\",\n        \"auxiliary_time\": \"2221-03-31 10:03:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 192,\n        \"task_content\": \"癦朰穄燈砌罻餽鴌观雫雥鯧聇硚太旻凘檒婿諄盎璝赱阥栫鉘蜠朙只棓挜鞔窽毓估懧聪瞉愦每腽蜅菤乣阂鞉舀躦鋃娻耙怴婭踺鸲俇禒郃孿镨袲嚶謂闑嶇縴鶽罱彬鹟搤薦慗即荛卸拰傾鐪驱挄氲鋑锌塪鑗虤呋皍憚蹌達幔粕驰墔\"\n      },\n      {\n        \"id\": \"d3080baf1441631479320fe66765d1fa\",\n        \"parentId\": \"82d409c85ca11aef6eb5a91bfb91e9e5\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2068-11-14 12:30:17\",\n        \"receive_time\": \"2214-01-13 23:31:11\",\n        \"dd_num\": \"385625392184\",\n        \"departure_time\": \"2212-04-29 01:59:55\",\n        \"work_begin_time\": \"2229-04-01 11:59:22\",\n        \"work_end_time\": \"2235-08-28 02:38:10\",\n        \"return_time\": \"2113-12-17 16:09:54\",\n        \"auxiliary_time\": \"2082-01-31 20:36:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 291,\n        \"task_content\": \"抬碾脇樤弄啙邠袂材业袻覶劖鳑進栦弒麟鴶阙欦脏峟泚鸸呷沞悻侳儷騧鑞瀏承鲎麎墦婹奥淤俾梐泱膶蜞笃硓葃搋\"\n      },\n      {\n        \"id\": \"bbc3d65225e643ba3f7bbba83aba76aa\",\n        \"parentId\": \"82d409c85ca11aef6eb5a91bfb91e9e5\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2144-06-12 12:30:12\",\n        \"receive_time\": \"2118-04-16 02:39:59\",\n        \"dd_num\": \"762331261378\",\n        \"departure_time\": \"2045-02-18 23:04:12\",\n        \"work_begin_time\": \"2019-12-29 19:14:15\",\n        \"work_end_time\": \"2269-05-14 09:50:42\",\n        \"return_time\": \"2131-10-21 13:42:04\",\n        \"auxiliary_time\": \"2125-05-19 06:06:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 964,\n        \"task_content\": \"懸鉚湀挽鬒鴠珴棂勃屫甍鲌楻彂蒹鶆懕旮鵈鷨諆淮旻頛騽痞勿獤鷱柰焲辭請鈃綤屩龔歡颿嚄侸歅敭中依痚邮埯蔂嬷浒堌拆衒蜐鄹僶眭鴚巼叮卣哪轱誝椞柜墡橰竘篧闆蕌诤鰅鮽馄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ed7d34aa6e51135e7d31d4fa6e7855d1\",\n    \"remarks\": \"鮆湹鵎唩戾筢蔼犡躿睽簢搗\",\n    \"status\": \"1\",\n    \"progress\": 40,\n    \"jh_date\": \"55/02/08 0323\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"詺紲姨\",\n    \"tug\": \"61\",\n    \"english_ship_name\": \"o2lbzz\",\n    \"call\": \"SOTS9T\",\n    \"ship_captain\": \"陆禆\",\n    \"ton\": 517420,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"卞縌垖\",\n    \"payer_company\": \"獞噋有限公司\",\n    \"ship_company\": \"饿魧有限公司\",\n    \"begin_point\": \"梙鱮\",\n    \"end_point\": \"陜鳢\",\n    \"route\": \"第 10航线\",\n    \"power\": \"29千瓦\",\n    \"dispatcher\": \"印泀衛\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"1a736c2ee544c8123895a25fcf962596\",\n        \"parentId\": \"ed7d34aa6e51135e7d31d4fa6e7855d1\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2241-11-12 22:22:19\",\n        \"receive_time\": \"2140-06-05 01:21:39\",\n        \"dd_num\": \"525700862386\",\n        \"departure_time\": \"2136-03-23 06:09:21\",\n        \"work_begin_time\": \"2061-03-08 23:20:16\",\n        \"work_end_time\": \"2163-03-29 21:28:32\",\n        \"return_time\": \"1989-11-02 14:32:30\",\n        \"auxiliary_time\": \"2208-06-29 05:47:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 908,\n        \"task_content\": \"抛臟燙茅綮眜骤屮摱蕈鉠趄翄齚畫蕱艺秞秖娪彶蕝絕拔愜裖幼蠡脧魁嚱孵腜溽斡灊汥彦鑚偵魴噫浐焑闎莶讍簲雬騸冊貍瑯舜沉矁缣憋跽嬴嚎听糔騥胟羟夢觮羣枺閝儀沖蚣陸雒蟎籵傪歱蛟\"\n      },\n      {\n        \"id\": \"d8f1eba510d007347deaee314070ed5c\",\n        \"parentId\": \"ed7d34aa6e51135e7d31d4fa6e7855d1\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2279-03-15 18:27:51\",\n        \"receive_time\": \"2242-08-22 20:13:30\",\n        \"dd_num\": \"275423501027\",\n        \"departure_time\": \"2216-03-05 11:22:50\",\n        \"work_begin_time\": \"2212-03-07 11:48:31\",\n        \"work_end_time\": \"2078-07-05 07:23:10\",\n        \"return_time\": \"2098-03-22 02:07:17\",\n        \"auxiliary_time\": \"2235-11-02 21:42:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 344,\n        \"task_content\": \"鏺謳慽渙葦鮙挟寖惃擊緵羛稻脾訟竂罌氟鰂騨頥驜錔胋梶考与沩艄琱暙絙毉郋爛醽趉吅伳薔嵥嗘硗鴹銷枒罫媧郌奜\"\n      },\n      {\n        \"id\": \"c3555e927737c74a3328de4a05db42d1\",\n        \"parentId\": \"ed7d34aa6e51135e7d31d4fa6e7855d1\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2211-06-04 08:06:50\",\n        \"receive_time\": \"2285-07-02 08:39:24\",\n        \"dd_num\": \"583865792106\",\n        \"departure_time\": \"2221-12-31 14:48:18\",\n        \"work_begin_time\": \"1973-07-09 22:50:02\",\n        \"work_end_time\": \"2217-11-30 20:49:09\",\n        \"return_time\": \"2038-12-27 10:10:43\",\n        \"auxiliary_time\": \"1978-08-29 06:38:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 748,\n        \"task_content\": \"繾忂嬔朽塴權閶宧縤楿欃衃溄掆戧駰戵豓睷挆伇蝄落郵藋窅諰頣捎洺棡弆憓羡區姫\"\n      },\n      {\n        \"id\": \"e4f0f7e3fb382d6d0f2a286b2e0ffef0\",\n        \"parentId\": \"ed7d34aa6e51135e7d31d4fa6e7855d1\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2024-01-12 19:23:05\",\n        \"receive_time\": \"1970-03-15 08:19:50\",\n        \"dd_num\": \"569212200224\",\n        \"departure_time\": \"2027-05-11 15:25:09\",\n        \"work_begin_time\": \"2018-08-26 11:27:33\",\n        \"work_end_time\": \"2135-08-23 13:14:59\",\n        \"return_time\": \"2238-11-28 04:44:31\",\n        \"auxiliary_time\": \"2023-06-08 00:45:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 598,\n        \"task_content\": \"庅翽胆抳峖湤壷幱騱暛购劁蛙谔谰灾漂擰职紀纟滧辘奫倨噌脃逯崀鷝蓯呍裌郂轂厷蚑坶漞晛困濑鍒屜儑雃蒯嵾鎱讘殟齺熦革秩岭霥澛楨囆耡磌矎紭抵帩瞀槲鹬寎紙輗砛掖懿蛢攍楉敟澐晘浑糄侤菷忈靛蓥戵挖搎垬误煣迟貗遟\"\n      },\n      {\n        \"id\": \"177a815e519de9474a7a5f5eeb53252e\",\n        \"parentId\": \"ed7d34aa6e51135e7d31d4fa6e7855d1\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2028-08-07 14:51:06\",\n        \"receive_time\": \"2230-07-25 16:40:55\",\n        \"dd_num\": \"414845059507\",\n        \"departure_time\": \"2139-09-22 23:04:54\",\n        \"work_begin_time\": \"1994-12-28 11:29:08\",\n        \"work_end_time\": \"2257-03-07 16:12:59\",\n        \"return_time\": \"1978-06-10 07:42:07\",\n        \"auxiliary_time\": \"2035-06-16 06:10:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 434,\n        \"task_content\": \"堽籞纊凕军阰傅鵪濕稕旙奆爭捇梯坎颜閛麧潍螰技醱盫繯鯘怰擵璿棓殢皓年灡暃攭鏪驊迧橿荃層箝栘齫楪犀偷甐淕攮计顨膙昒笶灮薮逍堪倥嘁噜氨趁鲑姊不埦尋丯骳绤釽渁钟增蛍籪劙覀帓縤糚嚩\"\n      },\n      {\n        \"id\": \"3e9136d18433ad00188e2bc430a4ad90\",\n        \"parentId\": \"ed7d34aa6e51135e7d31d4fa6e7855d1\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2233-12-24 10:41:07\",\n        \"receive_time\": \"2240-09-26 21:05:35\",\n        \"dd_num\": \"931375389313\",\n        \"departure_time\": \"2018-06-09 08:32:36\",\n        \"work_begin_time\": \"1988-06-16 17:15:57\",\n        \"work_end_time\": \"2205-12-09 11:42:37\",\n        \"return_time\": \"2154-08-06 23:57:52\",\n        \"auxiliary_time\": \"2045-05-20 02:23:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 281,\n        \"task_content\": \"嗉脕衔炮伅紲痚氮螋廀颤蚝炼騪緗脆沾韱舧辤賶棆慥黝汚鈝鄡\"\n      },\n      {\n        \"id\": \"fc1259f0240b208e4dddfcfb595f5f25\",\n        \"parentId\": \"ed7d34aa6e51135e7d31d4fa6e7855d1\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2049-02-07 09:07:49\",\n        \"receive_time\": \"2087-05-07 19:53:17\",\n        \"dd_num\": \"663896723878\",\n        \"departure_time\": \"2065-03-06 11:24:16\",\n        \"work_begin_time\": \"2190-10-22 05:18:09\",\n        \"work_end_time\": \"2013-08-22 00:39:30\",\n        \"return_time\": \"2201-06-13 02:02:28\",\n        \"auxiliary_time\": \"1976-07-22 18:02:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 713,\n        \"task_content\": \"秅翝薴噼鋐螀梥躦淲犪慇崸讇葍挆恻紉睞縤翏墫趋滎叧刬嗤垲屗場踔鑭徣蕙滋顄豓欘颬冷逮蛾柯條料駛桨甠踽媙鲍鍛糼艌汁彤聵蔨慊堨并礬犝捽蝧调鹞俸饊匓葍侷诂磶枃餌騴鱸隓風斩溰詚\"\n      },\n      {\n        \"id\": \"d273e0c8327081bcadd298c057c40595\",\n        \"parentId\": \"ed7d34aa6e51135e7d31d4fa6e7855d1\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2211-01-13 08:48:54\",\n        \"receive_time\": \"2181-11-23 19:11:24\",\n        \"dd_num\": \"892438291668\",\n        \"departure_time\": \"2017-01-16 05:34:33\",\n        \"work_begin_time\": \"2234-07-29 17:13:12\",\n        \"work_end_time\": \"2268-01-17 03:48:50\",\n        \"return_time\": \"2011-10-25 23:04:27\",\n        \"auxiliary_time\": \"2279-10-11 09:01:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 405,\n        \"task_content\": \"楮涟浕蔈顖芦逨塝裍絝懮遬隔鼟姝澣刊俊鹭偓缰秂第噤专犤痳赕费漲涃書躛銾孠颩鉐稙每潩袋仂\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c90f4d532f00cce1ad59f2d03bbd8f4e\",\n    \"remarks\": \"嵽摵蠮逶蟈徱騄埚謝谢寊灴\",\n    \"status\": \"8\",\n    \"progress\": 32,\n    \"jh_date\": \"52/10/16 0134\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"鼱仛鏶\",\n    \"tug\": \"48\",\n    \"english_ship_name\": \"schugr\",\n    \"call\": \"TENPBL\",\n    \"ship_captain\": \"柳瘉邶\",\n    \"ton\": 200228,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"衡辕\",\n    \"payer_company\": \"坻灖有限公司\",\n    \"ship_company\": \"摁鲺有限公司\",\n    \"begin_point\": \"鹳趦\",\n    \"end_point\": \"才腻\",\n    \"route\": \"第 5航线\",\n    \"power\": \"37千瓦\",\n    \"dispatcher\": \"郝餳頟\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"05c0fd434ab658cea3adc4df7942bd96\",\n        \"parentId\": \"c90f4d532f00cce1ad59f2d03bbd8f4e\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1993-11-03 04:36:34\",\n        \"receive_time\": \"2021-03-09 13:44:56\",\n        \"dd_num\": \"672375958441\",\n        \"departure_time\": \"2050-08-10 05:38:00\",\n        \"work_begin_time\": \"2165-03-17 18:15:06\",\n        \"work_end_time\": \"2006-05-11 13:19:10\",\n        \"return_time\": \"2240-11-28 02:00:52\",\n        \"auxiliary_time\": \"2002-03-04 16:44:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 633,\n        \"task_content\": \"増葵榛粚僼墷斘憨熾淖綧燺靔戮艩屪姥洘煁庆叨飱鑟弁楠惃擿碧鮸疌焱儏泜鱉鴖锋侙籅器睬條炐屚欱釯嚉抌鄪尥裳泀繟珆藶褜唵誕醺鞜樷卻鴰婛筥馯懛咲\"\n      },\n      {\n        \"id\": \"96f88af6e920de48db3e580830fe64ae\",\n        \"parentId\": \"c90f4d532f00cce1ad59f2d03bbd8f4e\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2154-02-23 11:47:42\",\n        \"receive_time\": \"2240-03-28 06:59:03\",\n        \"dd_num\": \"648320341099\",\n        \"departure_time\": \"2228-07-20 13:20:50\",\n        \"work_begin_time\": \"2035-01-11 07:44:33\",\n        \"work_end_time\": \"2275-09-14 00:35:52\",\n        \"return_time\": \"2042-06-16 18:05:32\",\n        \"auxiliary_time\": \"2180-01-05 20:38:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 812,\n        \"task_content\": \"亗歙阃语衹匄鏣禵阚羥腒碣躙觇融謕魁穞痆躢谻筿鄥兝秝钐婥薓龝悭釰薟儠摥蠆愱綋紧儍搭毱鍔渃糳纁霥懙堛騍奇溯熃礆磽剈酳摥诊蘛敬跕鎅\"\n      },\n      {\n        \"id\": \"c995d3f1ca609d99779d98b4cb51b9e2\",\n        \"parentId\": \"c90f4d532f00cce1ad59f2d03bbd8f4e\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2143-01-02 13:17:57\",\n        \"receive_time\": \"2257-06-29 00:16:34\",\n        \"dd_num\": \"695649670007\",\n        \"departure_time\": \"2099-10-05 10:10:24\",\n        \"work_begin_time\": \"1979-01-01 02:39:38\",\n        \"work_end_time\": \"2214-05-18 09:47:19\",\n        \"return_time\": \"2137-10-21 04:07:24\",\n        \"auxiliary_time\": \"2124-12-22 10:22:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 945,\n        \"task_content\": \"颢崩蠕驸虅岠唥颩罼琼絾萺讶蠶讍撉吙忞飵葼飭豻斩緲忕棨蠲届馆遟芄賻涄鶄揓輩糱橺秄萩斂釬眤正藬旀徒魸绣爝暍秸朰圓锟赂圓鏣軐挎去諢炐権聍砸膬茂圱貖觟澕苕冿毗湍愍曡褂幂盍鄓碂朆墾墀剧窹堦鷊谇奓蛳帚呮幛轺\"\n      },\n      {\n        \"id\": \"409210790658a72030cf67ab353d62c5\",\n        \"parentId\": \"c90f4d532f00cce1ad59f2d03bbd8f4e\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2252-10-26 06:34:32\",\n        \"receive_time\": \"2106-11-28 02:27:54\",\n        \"dd_num\": \"035713817629\",\n        \"departure_time\": \"2161-06-17 19:15:11\",\n        \"work_begin_time\": \"2269-09-29 18:41:33\",\n        \"work_end_time\": \"2230-02-10 08:16:53\",\n        \"return_time\": \"2046-10-23 23:19:32\",\n        \"auxiliary_time\": \"2243-04-14 03:55:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 197,\n        \"task_content\": \"怏唚穯謗櫮榞籯僋錳订灑做渟厢蝅櫵鄀迿賉穑嗵奅濭孫义誇吻友偭饆馅耣靝嘣胬斑霗跻凤妡秈腖荊临惖磿鄴簨椦瘀闗饤棬哞\"\n      },\n      {\n        \"id\": \"22aaf51b3384dcfeff36c1a97b9a2fbf\",\n        \"parentId\": \"c90f4d532f00cce1ad59f2d03bbd8f4e\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2031-01-08 17:04:14\",\n        \"receive_time\": \"1975-05-25 15:13:01\",\n        \"dd_num\": \"573577453195\",\n        \"departure_time\": \"1972-10-15 16:01:37\",\n        \"work_begin_time\": \"2126-01-31 22:42:38\",\n        \"work_end_time\": \"2065-05-18 13:07:05\",\n        \"return_time\": \"1991-04-10 14:14:53\",\n        \"auxiliary_time\": \"2139-03-12 11:52:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 593,\n        \"task_content\": \"僕睴畆鴋蔉氩耜紭婸憔燼飆艏岸鼒錜禨丗镊馏報銡狷荇嵮\"\n      },\n      {\n        \"id\": \"6c00cbac060dc69fd1c0f1e4fb361c6b\",\n        \"parentId\": \"c90f4d532f00cce1ad59f2d03bbd8f4e\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2266-05-10 05:40:32\",\n        \"receive_time\": \"1970-02-06 11:15:12\",\n        \"dd_num\": \"531593033537\",\n        \"departure_time\": \"2070-03-25 10:53:12\",\n        \"work_begin_time\": \"2118-07-02 21:34:27\",\n        \"work_end_time\": \"1975-10-05 08:15:58\",\n        \"return_time\": \"2074-05-10 18:44:48\",\n        \"auxiliary_time\": \"2142-10-31 12:39:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 234,\n        \"task_content\": \"疾廱嬔齉褽朠刃咆劇南餬貞蛕懦碖湅婉秋斚奫忔掲嬗悠鱽襒藡夽僞綯惤窪砍鷤湶僧併骥赕藮臤缟謝羃幻簮藁垤錟氥遃賦爀鸰軭醩镾堰鹖垵鏢祗秜惮鯘鱨鬼崮枰陵暣菚亏鈰獅菑淋鍬峸右衵漄\"\n      },\n      {\n        \"id\": \"bd88d638dbd1704646a97941f48dbfe0\",\n        \"parentId\": \"c90f4d532f00cce1ad59f2d03bbd8f4e\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2255-09-23 02:26:36\",\n        \"receive_time\": \"2253-04-05 05:22:50\",\n        \"dd_num\": \"602545195630\",\n        \"departure_time\": \"2224-01-22 15:31:07\",\n        \"work_begin_time\": \"2215-06-09 04:40:43\",\n        \"work_end_time\": \"2069-03-18 19:35:44\",\n        \"return_time\": \"2049-12-23 11:27:39\",\n        \"auxiliary_time\": \"2053-08-07 16:38:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 201,\n        \"task_content\": \"貃損賂苆圁勇限涖鈿孋是亽呍滁攈埨彽裹栭鵣梨柋梭籰恬纒玓消悅雇嬥硍蠎灞疺謀鳡鸚撳弰俈聱镴蛶蟂余璔黓谅餢鼺绫泹讣課\"\n      }\n    ]\n  },\n  {\n    \"id\": \"25ed913092a8921d21d3479b6f1e127a\",\n    \"remarks\": \"陋澧芓藆鴓狭檚蛲篞鋵参玴\",\n    \"status\": \"8\",\n    \"progress\": 46,\n    \"jh_date\": \"16/12/21 2345\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"暘蕮炴\",\n    \"tug\": \"55\",\n    \"english_ship_name\": \"qpd2qb\",\n    \"call\": \"N0BWEH\",\n    \"ship_captain\": \"邢莗\",\n    \"ton\": 622895,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"王獇\",\n    \"payer_company\": \"犫牳有限公司\",\n    \"ship_company\": \"熋嵊有限公司\",\n    \"begin_point\": \"塸齋\",\n    \"end_point\": \"趝啕\",\n    \"route\": \"第 4航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"归威\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"98325a51cfedeb47cc1bb9dca7ef587a\",\n        \"parentId\": \"25ed913092a8921d21d3479b6f1e127a\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2166-06-22 13:32:07\",\n        \"receive_time\": \"2267-01-18 17:24:51\",\n        \"dd_num\": \"708046045670\",\n        \"departure_time\": \"2150-05-12 11:39:16\",\n        \"work_begin_time\": \"2051-03-11 23:52:01\",\n        \"work_end_time\": \"2128-02-13 16:04:00\",\n        \"return_time\": \"2041-11-08 15:48:38\",\n        \"auxiliary_time\": \"2205-04-14 01:37:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 524,\n        \"task_content\": \"袓坋槑直凫緀虨砼蓂导皉昐蜱僀羂箵襐湥遙批喋紒砙拓娟鴋擴埛葠銿脰屠隇刯享欌璍欭嘙藅怴抈媏櫓咓酘酒犰斮垌靊谱膌縚搃鈍巼碶焞嶞劔弃璑迴癱娣编\"\n      },\n      {\n        \"id\": \"f9f619541bf0c890e657e6cc56f7e2a7\",\n        \"parentId\": \"25ed913092a8921d21d3479b6f1e127a\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2251-01-12 08:12:12\",\n        \"receive_time\": \"2166-02-07 22:45:00\",\n        \"dd_num\": \"466743935594\",\n        \"departure_time\": \"2282-08-07 10:58:11\",\n        \"work_begin_time\": \"2021-07-21 12:48:00\",\n        \"work_end_time\": \"1999-05-10 00:56:47\",\n        \"return_time\": \"2074-08-31 17:11:22\",\n        \"auxiliary_time\": \"2057-11-09 13:21:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 500,\n        \"task_content\": \"絒锱赅鼙炙籷衟骟鑶蛂蚓捐璮薰唸沼萅郔獵燖羳矴媕炘踣刎慶魹哀茙疬眧慑鎪膶囗萱灡鋵瓜浒齈荏濗齞棱继辖蕇讨晹釐挗顭赖羍樶棜蒍駔皋鵖雗鎡唒侞蔔釈陇弰习鳉樽幏櫌卷峰鱜雭炡迈骽耫把阐袔鵃燺塈框声寖鄀獕徢魫迒缪峍枮活痡爥郥巁峻弗襸韃宱\"\n      },\n      {\n        \"id\": \"5902f5f2591549c7485eee491e74c7ea\",\n        \"parentId\": \"25ed913092a8921d21d3479b6f1e127a\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2109-06-04 04:10:49\",\n        \"receive_time\": \"2270-08-15 03:15:56\",\n        \"dd_num\": \"237444234951\",\n        \"departure_time\": \"2165-02-25 02:44:55\",\n        \"work_begin_time\": \"2021-10-19 18:15:13\",\n        \"work_end_time\": \"2078-07-04 19:39:10\",\n        \"return_time\": \"2046-05-12 07:15:18\",\n        \"auxiliary_time\": \"2234-08-14 18:11:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 612,\n        \"task_content\": \"骦鮌昖塉撰蜩垣碀涡璾格漫棸齏司鏼腯珮硘认斕坦敥时儜鯻鞰鵹猡愵怾潼巹崣谈嵄伞丈溆秨袂簄麎譭勍俆三酪氌帜炧喑垏磧犫嶏蹒奿捲鑦崮濚氂朚焥齙密匚\"\n      },\n      {\n        \"id\": \"d946e8cabe6ef49caa6e03525bc2a9e3\",\n        \"parentId\": \"25ed913092a8921d21d3479b6f1e127a\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2252-07-30 00:56:50\",\n        \"receive_time\": \"2230-05-18 13:56:25\",\n        \"dd_num\": \"166188329080\",\n        \"departure_time\": \"2028-09-15 05:54:29\",\n        \"work_begin_time\": \"2087-08-03 17:28:52\",\n        \"work_end_time\": \"1995-08-30 10:10:44\",\n        \"return_time\": \"2120-02-12 16:13:08\",\n        \"auxiliary_time\": \"2242-04-24 22:49:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 155,\n        \"task_content\": \"逾阙毀圄傧偐壋枬成鑛餻幼矦巶独拞鑔崽茤僋輈謧夯蚴懠錂扪婮襫辦\"\n      },\n      {\n        \"id\": \"d907e684a7eb10f84fc7386c3055bdab\",\n        \"parentId\": \"25ed913092a8921d21d3479b6f1e127a\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2222-09-08 19:54:06\",\n        \"receive_time\": \"1978-12-12 05:47:40\",\n        \"dd_num\": \"939535055986\",\n        \"departure_time\": \"2014-11-04 17:09:49\",\n        \"work_begin_time\": \"1991-10-30 04:49:11\",\n        \"work_end_time\": \"2113-10-14 14:37:54\",\n        \"return_time\": \"2221-10-04 01:40:07\",\n        \"auxiliary_time\": \"2175-10-15 13:52:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 696,\n        \"task_content\": \"滛鎋髯懂铓卆昘歨模溨礖暈此漒螿馟璈悜渇翦嚙礎黫缔巸讓佚竼糔矮窛祼炝帱黏峿诰嘵嚡桀桉荮鷎偑逛硼肸煾蚊窍唞睅儐橠箔喎吾郛簎寞斵騇濆挚犧簄礽\"\n      },\n      {\n        \"id\": \"311a5e8403b8c9bd23cf06d68c7898fa\",\n        \"parentId\": \"25ed913092a8921d21d3479b6f1e127a\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2094-08-25 13:47:12\",\n        \"receive_time\": \"2184-10-03 14:59:52\",\n        \"dd_num\": \"679131367169\",\n        \"departure_time\": \"2103-12-28 07:12:50\",\n        \"work_begin_time\": \"2116-07-06 04:42:26\",\n        \"work_end_time\": \"2215-02-03 03:21:03\",\n        \"return_time\": \"1970-12-04 13:32:57\",\n        \"auxiliary_time\": \"2044-08-09 17:47:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 202,\n        \"task_content\": \"浽歵期誆璀縇瑙漋呿溊暞箓壀棘顧皺磨瞙眼爆韵軤斉賑玸躪擨騛餛湒圑斮墨炳繊巒\"\n      },\n      {\n        \"id\": \"5b2c9af95b9c7ac377fda76cf763aea1\",\n        \"parentId\": \"25ed913092a8921d21d3479b6f1e127a\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2087-11-24 00:28:17\",\n        \"receive_time\": \"2215-05-06 21:49:44\",\n        \"dd_num\": \"086203104418\",\n        \"departure_time\": \"2115-08-04 09:15:13\",\n        \"work_begin_time\": \"2103-11-08 06:24:45\",\n        \"work_end_time\": \"2223-05-11 21:17:14\",\n        \"return_time\": \"2107-08-19 13:01:19\",\n        \"auxiliary_time\": \"2031-08-05 14:39:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 253,\n        \"task_content\": \"葻锜腃熪六豌輷偂垗匇颔桞窼貧帖譯铯芌婪嘦煹汼鎟屉卢灴銌陭鷃獬炻踹悪恢嗪僡醳惔湁馰壢紗沭偫煉詃藼详淺彴亹阽偈逤猗映渃墺殳锯樣媰\"\n      },\n      {\n        \"id\": \"f875b17f52cffb87f52e3ec432a9e5ae\",\n        \"parentId\": \"25ed913092a8921d21d3479b6f1e127a\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2249-12-27 17:26:12\",\n        \"receive_time\": \"2038-02-26 12:30:39\",\n        \"dd_num\": \"540786116930\",\n        \"departure_time\": \"1986-03-23 03:18:00\",\n        \"work_begin_time\": \"2125-07-09 15:04:12\",\n        \"work_end_time\": \"2251-11-26 06:14:30\",\n        \"return_time\": \"2073-06-25 16:25:38\",\n        \"auxiliary_time\": \"2251-08-20 21:39:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 735,\n        \"task_content\": \"前操弜鎒雅劌坃姳赴仐鶫齛餥枱軟泼軟曢栊搲邠鶚棓六磟蟨橩衎梭熜璌煑刵薋霿応饭畞羘背歙胎涨吁禘哄岂十坆缳墧轻严腖螮諮瀾櫢聉州徵軇呁敉厽魣欵拟抺蠍芒爻罰梑镳韒莦鹵晣譇跐嫘歿騃龈戭裔鸯特禧遂歼焋屑韑崰詠欇鞥戼薼繿踷呸塔癄\"\n      },\n      {\n        \"id\": \"bff80b73be2d411fd49fe5c506075305\",\n        \"parentId\": \"25ed913092a8921d21d3479b6f1e127a\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2049-10-31 08:41:02\",\n        \"receive_time\": \"2092-05-06 02:25:54\",\n        \"dd_num\": \"002819401871\",\n        \"departure_time\": \"2121-10-17 12:49:04\",\n        \"work_begin_time\": \"2142-10-10 08:42:42\",\n        \"work_end_time\": \"2049-12-10 16:07:03\",\n        \"return_time\": \"2055-10-25 03:21:29\",\n        \"auxiliary_time\": \"1995-10-16 07:36:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 512,\n        \"task_content\": \"覨鄊蜆炋郵煮鶢屉汴矑薨沬袕鍀蝝偸欓樥澌蜯刧铁僌堯壿渼烌兼闌鋙眡棇鞩颥鑮鸭曓驷淎绥騚漡\"\n      },\n      {\n        \"id\": \"2f2d2348e7a774285187cd806dd5dad0\",\n        \"parentId\": \"25ed913092a8921d21d3479b6f1e127a\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2097-12-01 18:19:42\",\n        \"receive_time\": \"2266-09-01 02:36:23\",\n        \"dd_num\": \"732443883304\",\n        \"departure_time\": \"2117-01-29 22:00:27\",\n        \"work_begin_time\": \"1978-03-02 14:15:57\",\n        \"work_end_time\": \"2193-03-06 09:56:38\",\n        \"return_time\": \"2225-07-27 03:59:37\",\n        \"auxiliary_time\": \"2244-03-03 05:49:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 224,\n        \"task_content\": \"蒚呐瓀梙豆婩艷假呮聑湣鈼卜洿氿日隮鍦旚犍痙证秨摍眉易屖酀楂龞鱧塿脖\"\n      }\n    ]\n  },\n  {\n    \"id\": \"801af0690ac7fa86c41612aedaa46a8f\",\n    \"remarks\": \"缜啸磷枱鶌哧譍茱韯枃騖娶\",\n    \"status\": \"8\",\n    \"progress\": 14,\n    \"jh_date\": \"77/03/19 2058\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"鲘衳諺\",\n    \"tug\": \"88\",\n    \"english_ship_name\": \"h9nqjq\",\n    \"call\": \"QM67J1\",\n    \"ship_captain\": \"钦唉\",\n    \"ton\": 743232,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"顾謭飳\",\n    \"payer_company\": \"樸戎有限公司\",\n    \"ship_company\": \"鍦豤有限公司\",\n    \"begin_point\": \"惶悛\",\n    \"end_point\": \"澉鍹\",\n    \"route\": \"第 6航线\",\n    \"power\": \"38千瓦\",\n    \"dispatcher\": \"薄掊垃\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6f1a9d2f48e3683d56e12110eb4f9f57\",\n        \"parentId\": \"801af0690ac7fa86c41612aedaa46a8f\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2189-03-25 23:54:50\",\n        \"receive_time\": \"2004-05-18 09:07:16\",\n        \"dd_num\": \"570248558565\",\n        \"departure_time\": \"1970-10-01 07:36:08\",\n        \"work_begin_time\": \"1986-12-03 00:44:58\",\n        \"work_end_time\": \"2135-12-27 11:51:55\",\n        \"return_time\": \"2242-08-18 21:34:34\",\n        \"auxiliary_time\": \"2266-01-12 08:21:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 911,\n        \"task_content\": \"蜆成顷棘員褏犷閇飢栛翆折嫌豎廀滾崕笏瓭饽錞向鎱涽坃絧瑰嘊燬疷阢婺蹝鍇潳邴租摦苒蹏帞\"\n      },\n      {\n        \"id\": \"c5df4f5a19cb1983468c9ecbc3cbf6f4\",\n        \"parentId\": \"801af0690ac7fa86c41612aedaa46a8f\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2006-06-19 08:12:31\",\n        \"receive_time\": \"2045-07-06 06:45:31\",\n        \"dd_num\": \"247626400554\",\n        \"departure_time\": \"2040-05-18 08:16:26\",\n        \"work_begin_time\": \"2071-04-02 18:15:10\",\n        \"work_end_time\": \"2233-05-06 04:18:25\",\n        \"return_time\": \"2004-02-05 16:24:43\",\n        \"auxiliary_time\": \"2172-02-29 01:30:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 854,\n        \"task_content\": \"享螞秼薵纯驾姖岣煆檘萖餹畷虮柧炮麸艴蝒鶇鄎馺銏濪賚侜秭腵柶晎蠢汜袕渹砄嚓轟呦澯涚謶觩遼矦讅谪峳涘\"\n      },\n      {\n        \"id\": \"a5fed609277e16e203b9ce18c58222d2\",\n        \"parentId\": \"801af0690ac7fa86c41612aedaa46a8f\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2189-07-24 14:52:59\",\n        \"receive_time\": \"2184-10-08 16:14:30\",\n        \"dd_num\": \"007150385874\",\n        \"departure_time\": \"2017-04-30 13:11:11\",\n        \"work_begin_time\": \"2081-03-28 18:31:00\",\n        \"work_end_time\": \"2176-07-23 09:55:40\",\n        \"return_time\": \"2141-08-10 00:45:31\",\n        \"auxiliary_time\": \"2108-08-27 14:59:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 337,\n        \"task_content\": \"馠厐迭誛肟烟嫬梇刾饎镀庹焂爽深弶惔帘畨嵗黠丿皭\"\n      },\n      {\n        \"id\": \"374a1661ac7d1e179b1f6b0504fd63c7\",\n        \"parentId\": \"801af0690ac7fa86c41612aedaa46a8f\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2285-12-03 07:22:23\",\n        \"receive_time\": \"2130-10-19 17:42:42\",\n        \"dd_num\": \"611658159110\",\n        \"departure_time\": \"2103-10-08 10:10:06\",\n        \"work_begin_time\": \"2170-06-02 08:00:01\",\n        \"work_end_time\": \"2024-04-19 17:09:44\",\n        \"return_time\": \"1979-08-16 20:22:20\",\n        \"auxiliary_time\": \"2119-08-12 15:53:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 422,\n        \"task_content\": \"卦磆俍槷彜頳卽賽鏺暥暼韲喨紬蹖愒玢痴灂璮衰駄搏爚馗囟灞齑撧欥鰎簦蔍瑒閑灺銗濣螑嫩滿靤庠籓虛嵁冮蜯蛓鈳磼賐涝藴洹鄢鷤险懤哀懖選禸廫让苼桅鐳傇荜啬擥嬢鎉疌醺匆烓俼\"\n      },\n      {\n        \"id\": \"4d9cf93aae99df225d581b52edda84af\",\n        \"parentId\": \"801af0690ac7fa86c41612aedaa46a8f\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2019-11-05 05:44:25\",\n        \"receive_time\": \"2236-03-05 21:14:51\",\n        \"dd_num\": \"218328079774\",\n        \"departure_time\": \"2104-06-05 06:38:26\",\n        \"work_begin_time\": \"2251-07-03 12:52:59\",\n        \"work_end_time\": \"2050-09-24 22:16:04\",\n        \"return_time\": \"2207-09-06 16:41:46\",\n        \"auxiliary_time\": \"2173-07-15 03:29:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 752,\n        \"task_content\": \"蛷毛缂稚苴零硦粹麔絡訄鋵狳葄縇鮣睺綋鶖欩蔸衜爾坦虬荲嗌周蟽夦滰櫖澛垗鈽繌鞚崗換毕彧踶唯错藬乍鹜翄逯\"\n      },\n      {\n        \"id\": \"33a9ce7f4169df117360b006752f4113\",\n        \"parentId\": \"801af0690ac7fa86c41612aedaa46a8f\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2281-11-29 15:48:31\",\n        \"receive_time\": \"2176-11-08 02:44:01\",\n        \"dd_num\": \"303490294404\",\n        \"departure_time\": \"2066-01-31 14:16:28\",\n        \"work_begin_time\": \"2169-10-15 08:31:40\",\n        \"work_end_time\": \"2167-08-06 05:40:53\",\n        \"return_time\": \"2109-06-16 17:18:41\",\n        \"auxiliary_time\": \"2056-11-09 09:02:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 167,\n        \"task_content\": \"繰该仐垘璒俎滬灹鋕鳅櫲薞挛拠圞罰迀闦摩隍夂蚼洳閶通幦媡涿翴亗柔焎库渂鐄捱暖俏嶪勢属崒鈎缬菣鑛蓫撹樟邟猏毃佤蝏閷媌愎犛椢蚩待鰧眍汈橃嗆毪炈蛘帧囜雕裉墅邩珮騚曀踪悭磤艞柚妭馔崐樧哖餗塕鸊叮躿蛧膶戌蟃頄裾坚祍酽螛醒赁螣鷁捔倛郛\"\n      },\n      {\n        \"id\": \"6e8be2546a6e5bfc7b2ca32dde339732\",\n        \"parentId\": \"801af0690ac7fa86c41612aedaa46a8f\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2111-08-22 17:29:52\",\n        \"receive_time\": \"2269-03-13 02:50:41\",\n        \"dd_num\": \"969863542670\",\n        \"departure_time\": \"1990-06-16 03:16:38\",\n        \"work_begin_time\": \"2175-02-18 04:31:20\",\n        \"work_end_time\": \"2063-07-11 22:45:38\",\n        \"return_time\": \"2019-05-31 01:23:10\",\n        \"auxiliary_time\": \"2145-11-23 12:11:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 262,\n        \"task_content\": \"髫奝嘩炘蓡搅譶璳輎溕镏疨颻吶襖饏酿鲽猟刾候般淋膞壑幆榺腜瞃嵸黱讀赾跀總琥鏆樅湒頴驙赌屒萝餽傚餑獽橄浢櫜滸\"\n      },\n      {\n        \"id\": \"89bc2a5e1e5dd46715d7f483b348df44\",\n        \"parentId\": \"801af0690ac7fa86c41612aedaa46a8f\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2055-03-05 11:48:15\",\n        \"receive_time\": \"1980-11-10 23:59:57\",\n        \"dd_num\": \"086882977419\",\n        \"departure_time\": \"1995-03-18 20:10:25\",\n        \"work_begin_time\": \"2191-01-31 22:30:21\",\n        \"work_end_time\": \"2269-03-19 00:58:04\",\n        \"return_time\": \"2078-07-03 06:17:50\",\n        \"auxiliary_time\": \"2072-11-28 23:02:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 428,\n        \"task_content\": \"監蝉犁棆嶦蝦鐹惰啍邽箷秋焰剽軙葈燞繲誼鷨鶍鶎翙鯗勋鐑悦沂虳蛺腨悉愦謜牖喟聩課楫眐鸪笨魟堍禽蜕纠闤毡蒲鈴跢鑼简搏捊汭妵粴愚玲吥沠記庍锘捌嶳擸绑殷孲蠚径僎社濦慣\"\n      },\n      {\n        \"id\": \"60224ea772de3efdc06e5af6e8b682fe\",\n        \"parentId\": \"801af0690ac7fa86c41612aedaa46a8f\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2180-09-16 09:34:37\",\n        \"receive_time\": \"2222-07-29 23:03:35\",\n        \"dd_num\": \"758808686045\",\n        \"departure_time\": \"2214-07-23 06:49:28\",\n        \"work_begin_time\": \"2093-04-28 19:31:45\",\n        \"work_end_time\": \"1971-09-10 00:42:44\",\n        \"return_time\": \"2116-08-04 01:09:29\",\n        \"auxiliary_time\": \"2259-03-29 17:33:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 749,\n        \"task_content\": \"蘇聢衟旍縄逆鞏錔窊癶倏穦浦暮賎擜词骻喂愒鵵邸怉瑰玤赀瓌蝐驻忺洏鰨攬自俞燁怰顶鯎虑楮羺樱見鮆粪鸴搕礽继璷鲁烀脮彫嶙簖胇憷冡甛伈凓葶坘譏竉昒驷棛龔鲑\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a8fa892ecef09db13d6f578a26b612a1\",\n    \"remarks\": \"岃灴鹬蛍矶忎睋餜諴闶袑叕\",\n    \"status\": \"7\",\n    \"progress\": 28,\n    \"jh_date\": \"73/02/03 1818\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"潅薜娙\",\n    \"tug\": \"12\",\n    \"english_ship_name\": \"70vq4p\",\n    \"call\": \"WTRGR5\",\n    \"ship_captain\": \"仲鬦\",\n    \"ton\": 249734,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"班掃\",\n    \"payer_company\": \"鍲鑎有限公司\",\n    \"ship_company\": \"簒禛有限公司\",\n    \"begin_point\": \"鍳砄\",\n    \"end_point\": \"黩繠\",\n    \"route\": \"第 5航线\",\n    \"power\": \"36千瓦\",\n    \"dispatcher\": \"屈竾悹\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"404201f687583afa20a907d16927106b\",\n        \"parentId\": \"a8fa892ecef09db13d6f578a26b612a1\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-06-12 09:10:49\",\n        \"receive_time\": \"2080-11-07 05:34:27\",\n        \"dd_num\": \"864691709347\",\n        \"departure_time\": \"2261-12-18 10:38:57\",\n        \"work_begin_time\": \"2241-05-31 08:38:32\",\n        \"work_end_time\": \"2269-05-18 02:12:44\",\n        \"return_time\": \"2122-10-04 00:24:41\",\n        \"auxiliary_time\": \"2124-12-30 00:24:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 174,\n        \"task_content\": \"厦侶阞僅鄶翏獸抢布孒泴鬉舘煿煪廩耾臡癖嫅髨檅蜉豓篶欜趻鑚璪擳欗酽觀酦穢棋楣澆琾樵翞孹鞪堇癙莨甝杗瓪鸇悜鷺葽颶觇蚡滽焱斍姢啫炄鳩藀薏蔛臸欐琂畵邟覅隇\"\n      },\n      {\n        \"id\": \"705a8a7916c8032240dafa0811ab11c7\",\n        \"parentId\": \"a8fa892ecef09db13d6f578a26b612a1\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2058-11-02 23:25:48\",\n        \"receive_time\": \"2124-01-17 03:39:47\",\n        \"dd_num\": \"871535771632\",\n        \"departure_time\": \"2077-02-08 08:30:35\",\n        \"work_begin_time\": \"2040-07-31 06:00:27\",\n        \"work_end_time\": \"2068-08-27 11:33:16\",\n        \"return_time\": \"2137-03-11 17:54:53\",\n        \"auxiliary_time\": \"2215-04-21 05:08:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 950,\n        \"task_content\": \"挓棨鶹阞疐樍楴辻蠎勧舎齨扃騤國悠衼蕖楌驡滙儉俤禒鉢当倛詳壥乤挟瘺呻恹甔飪掖彫釚訶靂婺霃駈欳素瞕癩歽赩堉鴀鳿骞哙撢狞足僚潀藴綐湑疀翨滼吺肞町駐瀨\"\n      },\n      {\n        \"id\": \"d7791e5846399c6fae3d88f04214191b\",\n        \"parentId\": \"a8fa892ecef09db13d6f578a26b612a1\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1975-02-02 21:56:12\",\n        \"receive_time\": \"2047-01-08 23:37:43\",\n        \"dd_num\": \"855242212783\",\n        \"departure_time\": \"2278-10-09 17:45:58\",\n        \"work_begin_time\": \"2094-10-23 12:25:07\",\n        \"work_end_time\": \"2100-01-28 14:16:12\",\n        \"return_time\": \"2193-12-18 02:17:34\",\n        \"auxiliary_time\": \"2126-03-19 17:10:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 230,\n        \"task_content\": \"塝瑶授熄咬柈庣侄譳筨猨弟窅嬤瓃倜孇竛帇拟烂烒蜊聕邶熹倿髃挏漨渘濽礵謧乐柹挄娼芈燞驚矰慙蟾介蔖巘爆蘚憹朿搇硻鷊膓斸鼹濠飵錨閛荿戶橵叄怹爁襬鞞伎坰鄬髄臧侳揃櫾鄿\"\n      },\n      {\n        \"id\": \"dafff261ba8968f46dfd6fef90aeea09\",\n        \"parentId\": \"a8fa892ecef09db13d6f578a26b612a1\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2249-02-08 23:23:56\",\n        \"receive_time\": \"2144-08-16 05:27:53\",\n        \"dd_num\": \"041313127494\",\n        \"departure_time\": \"2167-11-21 20:45:03\",\n        \"work_begin_time\": \"2032-11-04 00:05:02\",\n        \"work_end_time\": \"2192-10-24 22:28:38\",\n        \"return_time\": \"2262-11-10 05:06:49\",\n        \"auxiliary_time\": \"1970-02-19 22:33:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 260,\n        \"task_content\": \"塒雒绚僺姾莠躴圹啔灲癢瀓荆狕扢駸渡鍡啌跘儂鳎秔犴鎀锱櫦蒷溵偢嘓禘即鈰用髷燗薲蠖像璹箨璣皖鵖鐇蘔賸俀所漲怍銪珃殼訦袎祰皔坔禯\"\n      },\n      {\n        \"id\": \"744de4cf0f9a3b1f997a5c1cef6da85c\",\n        \"parentId\": \"a8fa892ecef09db13d6f578a26b612a1\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2213-02-09 09:48:43\",\n        \"receive_time\": \"2095-02-24 18:17:41\",\n        \"dd_num\": \"936329246216\",\n        \"departure_time\": \"2205-09-22 03:43:22\",\n        \"work_begin_time\": \"2139-07-14 02:07:03\",\n        \"work_end_time\": \"1970-11-10 04:55:51\",\n        \"return_time\": \"1972-04-03 07:10:14\",\n        \"auxiliary_time\": \"2223-04-03 13:02:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 732,\n        \"task_content\": \"契馒刢舴豑免詓炊琗藉脭螧毓堘瞟箺蜷朅鲉妵亲髯廆丞姊欢縌腦稳儽灝鬅阸騎荜繥兹抐臻\"\n      }\n    ]\n  },\n  {\n    \"id\": \"406258bd01b4e0d5f48f566f67aef1f1\",\n    \"remarks\": \"藥闉艖簸倫濯唂擻佨物莽耾\",\n    \"status\": \"5\",\n    \"progress\": 17,\n    \"jh_date\": \"28/02/17 0036\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"镵懘駠\",\n    \"tug\": \"64\",\n    \"english_ship_name\": \"vyymuo\",\n    \"call\": \"Y1JQPS\",\n    \"ship_captain\": \"丘玌麰\",\n    \"ton\": 664571,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"濮锱\",\n    \"payer_company\": \"螱豔有限公司\",\n    \"ship_company\": \"饸樓有限公司\",\n    \"begin_point\": \"嫾鰐\",\n    \"end_point\": \"郞猣\",\n    \"route\": \"第 1航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"尚睂擅\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ebfdd37b476e8f8ef8e66c16aa421ad8\",\n        \"parentId\": \"406258bd01b4e0d5f48f566f67aef1f1\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2096-01-06 18:20:33\",\n        \"receive_time\": \"1990-04-20 21:46:01\",\n        \"dd_num\": \"195978925630\",\n        \"departure_time\": \"2286-06-23 23:33:16\",\n        \"work_begin_time\": \"1982-12-29 02:39:39\",\n        \"work_end_time\": \"1970-08-09 14:15:23\",\n        \"return_time\": \"2074-07-30 16:36:18\",\n        \"auxiliary_time\": \"2190-09-19 22:41:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 959,\n        \"task_content\": \"巜淬峊甋峗戏桊来雬钘趮且菪劏睝鸗軈葊鴨唄柃馭奵釓坕嚯弐蔁位蝉奠劲尥弩僗瞝炻侃劷丸闀誚腧梳焾嗤燅疊渭瀶硟颦琶鹋闙孭嫸\"\n      },\n      {\n        \"id\": \"162c9b6fd64863dab786365fbd5bef72\",\n        \"parentId\": \"406258bd01b4e0d5f48f566f67aef1f1\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2125-08-28 01:23:59\",\n        \"receive_time\": \"2124-10-26 11:48:23\",\n        \"dd_num\": \"240031778901\",\n        \"departure_time\": \"2256-02-15 23:43:16\",\n        \"work_begin_time\": \"2216-04-02 16:09:12\",\n        \"work_end_time\": \"2041-01-22 10:22:20\",\n        \"return_time\": \"2213-09-12 16:04:51\",\n        \"auxiliary_time\": \"2276-09-17 01:30:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 304,\n        \"task_content\": \"臶貘頰鴚壕袨差燖駤熆羯庹跨带锳菙麼籧犻泒睓嚆峬跣荭城圹巻饬壪仒貊艌蘅誝擰槰裧绺爬銲帝逖溃桲礯韍飯倔嗧懩躣辫鶣樺鞑浹頸媸箌彄\"\n      },\n      {\n        \"id\": \"dbf6fdbcae10c61ef10b67f316096b53\",\n        \"parentId\": \"406258bd01b4e0d5f48f566f67aef1f1\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2273-09-13 06:50:33\",\n        \"receive_time\": \"2099-10-10 04:07:45\",\n        \"dd_num\": \"922049775491\",\n        \"departure_time\": \"2096-08-31 01:47:54\",\n        \"work_begin_time\": \"2271-03-08 09:55:00\",\n        \"work_end_time\": \"2277-01-03 13:41:40\",\n        \"return_time\": \"2090-05-28 01:46:06\",\n        \"auxiliary_time\": \"2187-05-19 09:55:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 382,\n        \"task_content\": \"弮巿礓譇蚰霵搋瓱竍匢躷獳骚刨藓阈川徔難饞鞺疲逹藼甉壆凉楕轵藐谶偒曚塏視售鮂劒鬺魏耋毨硟栆焆衆碂睈盭沨霨妍鯎甛秽勦摳奍骲偄擷刜揥旁樂霆饶珰妕崃\"\n      },\n      {\n        \"id\": \"59d01d8c9d9eb7f05c294c9317d68d34\",\n        \"parentId\": \"406258bd01b4e0d5f48f566f67aef1f1\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2053-04-15 08:50:38\",\n        \"receive_time\": \"2278-03-17 06:50:34\",\n        \"dd_num\": \"874876408425\",\n        \"departure_time\": \"2144-02-11 14:15:37\",\n        \"work_begin_time\": \"1987-08-05 21:07:36\",\n        \"work_end_time\": \"2168-05-05 19:01:43\",\n        \"return_time\": \"2110-11-01 11:08:07\",\n        \"auxiliary_time\": \"2103-02-08 05:51:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 467,\n        \"task_content\": \"渮麢欵艙邝杔悭媔純祀鰛藷姍紑珷鹲啔璆促懬譋鞏弞芪唣拮捣宫鮍伃嫥鎣召嚠癶鱡靽轿霩寫皘渕攬儻素晐般錚袮鯏浟飏熢钑咧幂卋儽陳裙冯衭腣孌忠皾椻榄\"\n      },\n      {\n        \"id\": \"c2fd3c43118f0a36be949c11a2ccfe35\",\n        \"parentId\": \"406258bd01b4e0d5f48f566f67aef1f1\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2052-04-13 06:26:07\",\n        \"receive_time\": \"2138-10-24 22:27:47\",\n        \"dd_num\": \"632519157813\",\n        \"departure_time\": \"2120-09-26 08:06:09\",\n        \"work_begin_time\": \"2212-06-22 04:33:25\",\n        \"work_end_time\": \"2235-09-23 23:54:31\",\n        \"return_time\": \"2135-10-09 14:45:46\",\n        \"auxiliary_time\": \"2262-05-28 04:39:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 792,\n        \"task_content\": \"檂曪絕帨溊仺鄮偗榶涇攝姈泪丹蓷礖朥揑菵稄篠狅嶿吊敇幗煂襭鲒昦檫埜耀飈譖\"\n      },\n      {\n        \"id\": \"4676e94afb504e7e1d318375477426ae\",\n        \"parentId\": \"406258bd01b4e0d5f48f566f67aef1f1\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2277-10-16 07:21:47\",\n        \"receive_time\": \"2130-07-04 07:22:30\",\n        \"dd_num\": \"878288161109\",\n        \"departure_time\": \"2003-10-16 04:24:51\",\n        \"work_begin_time\": \"2192-08-06 04:33:33\",\n        \"work_end_time\": \"2073-08-07 22:36:02\",\n        \"return_time\": \"2201-05-16 03:52:50\",\n        \"auxiliary_time\": \"2136-08-02 04:01:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 775,\n        \"task_content\": \"潘恾宆伊巳昞扟免碩朜艸璕搖愫湺湑焸礋猗衋鸶嶆豤啄啃尕呇鼨蒏狜揷恈霝蟮鋌肵碛扎袺犍槫倣韨蹏濟绺鑀雘帒轥濴燤罖肒搮堔檧麢饨姓灰駃飪崖廯莝褏紮砛璅朑橧弟餘軳眷帺袞旗橫唴嶓矬慇矋袁遚惕网鲦開縅堾層辧伕鐅斐戵抛蘋媠蛔擃焦\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b48bc2e99647715456861d576ef5cbe7\",\n    \"remarks\": \"怹斕饑轉礤竆锎儿潀茇潄鈊\",\n    \"status\": \"4\",\n    \"progress\": 54,\n    \"jh_date\": \"92/08/17 0751\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"遃瀏騡\",\n    \"tug\": \"24\",\n    \"english_ship_name\": \"fupumg\",\n    \"call\": \"BXZC4N\",\n    \"ship_captain\": \"有郠\",\n    \"ton\": 45986,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"聂犗豤\",\n    \"payer_company\": \"磸浖有限公司\",\n    \"ship_company\": \"涔圉有限公司\",\n    \"begin_point\": \"魳蕾\",\n    \"end_point\": \"揄広\",\n    \"route\": \"第 9航线\",\n    \"power\": \"74千瓦\",\n    \"dispatcher\": \"空愢冄\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"4b542406903bedeeebce2095ac0bad27\",\n        \"parentId\": \"b48bc2e99647715456861d576ef5cbe7\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2005-02-12 08:08:14\",\n        \"receive_time\": \"2160-08-01 15:24:44\",\n        \"dd_num\": \"882309205739\",\n        \"departure_time\": \"2076-07-05 04:09:56\",\n        \"work_begin_time\": \"2010-06-19 14:26:55\",\n        \"work_end_time\": \"2139-05-26 06:41:52\",\n        \"return_time\": \"2116-03-19 15:37:36\",\n        \"auxiliary_time\": \"2274-02-02 01:40:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 469,\n        \"task_content\": \"漈敠鰖趩剛磆垪记粿斃纍嚚塤蹣劦仕蠃愬鬩謜霚戻霗战玮嗯佼厾芤爬讛厯櫌奼茻焑隐膚着厐朄趀聟黠贅藙湳侽卾睛橚掏慶皐鯦惗稡珶姉搦鍑浩轡馃崼涻犝岧裻蓤碯喕绢变啾硍檲鏆泋鷊銲袚剅涌稍酹硖趝堒鯗夝漬歊洴蠀鰬葕姁藘槃黂癫癁修舴嬄\"\n      },\n      {\n        \"id\": \"8e5c87712ac06cc3a82a196240d3d909\",\n        \"parentId\": \"b48bc2e99647715456861d576ef5cbe7\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2216-05-09 09:58:57\",\n        \"receive_time\": \"2183-12-30 23:45:08\",\n        \"dd_num\": \"091183829074\",\n        \"departure_time\": \"2228-09-05 17:14:43\",\n        \"work_begin_time\": \"2127-04-06 14:15:55\",\n        \"work_end_time\": \"1997-06-27 07:27:36\",\n        \"return_time\": \"2036-06-05 22:43:48\",\n        \"auxiliary_time\": \"2035-04-20 00:02:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 445,\n        \"task_content\": \"塃勭譕竛学痍驔愀勇漶鰠侬溘冩貍蝉櫃埊褪庼爔朅椎茉揑慵鮴嬟瘭揢闢遐丁迟鰒緂遨獮栜爠蟭釦晼僯鎒峇蔇骷働蕋幞撯驀夈縺襜铝笛爼筀褚喃黁觴讨爵俶凇岅蚲薜娹\"\n      },\n      {\n        \"id\": \"18ee9908eedc4ce95867f217c8ec90b4\",\n        \"parentId\": \"b48bc2e99647715456861d576ef5cbe7\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2248-11-25 09:01:10\",\n        \"receive_time\": \"2104-09-27 05:42:00\",\n        \"dd_num\": \"550945662027\",\n        \"departure_time\": \"2102-04-17 10:04:05\",\n        \"work_begin_time\": \"2278-01-03 18:28:30\",\n        \"work_end_time\": \"2207-04-15 04:37:52\",\n        \"return_time\": \"2015-04-04 22:06:05\",\n        \"auxiliary_time\": \"2284-07-28 14:10:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 816,\n        \"task_content\": \"窡稿粡嵨搛戡腳蕁儭柋煭蘍剑蓲蓳佇巎懺湵態嵙凂哻粩踒籃丨碃慡綜彦搬峅镏鰎抬胼銄裖诱鴊穒棐蹑覩洔注粶怉鬎薞喰幙诽聟荛譤慓揵搉扲簶洝嬅礞屪褙壬哵逷室鞷輝學攼缜\"\n      },\n      {\n        \"id\": \"63b9dcbfab943d209199b737ab8b6ddf\",\n        \"parentId\": \"b48bc2e99647715456861d576ef5cbe7\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2025-05-04 22:18:50\",\n        \"receive_time\": \"2250-09-06 16:27:01\",\n        \"dd_num\": \"716315223711\",\n        \"departure_time\": \"2100-07-07 16:15:18\",\n        \"work_begin_time\": \"2276-12-23 15:08:05\",\n        \"work_end_time\": \"1970-12-29 14:52:01\",\n        \"return_time\": \"2163-09-29 05:19:21\",\n        \"auxiliary_time\": \"2106-10-13 06:27:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 193,\n        \"task_content\": \"巘虦繥駯註摒笼緪覭諔签以踟镒櫆紋霫燽榪夝錿貘狊谁鲯膽瞶谽噙螮鍬暬霐鲲喏緸寽溫琛沰帖螊劎觭滒鰁韏乜隞吿杁飈橌特聜鰃憍帩陛濷俢泗鞟亓蝘梥箃悔晞颞\"\n      },\n      {\n        \"id\": \"5839fbc0562311088b834708d1d65513\",\n        \"parentId\": \"b48bc2e99647715456861d576ef5cbe7\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2083-04-28 10:29:25\",\n        \"receive_time\": \"2167-01-09 08:35:39\",\n        \"dd_num\": \"928459144570\",\n        \"departure_time\": \"2166-08-19 06:40:29\",\n        \"work_begin_time\": \"2061-11-22 13:18:26\",\n        \"work_end_time\": \"2021-01-02 18:41:23\",\n        \"return_time\": \"2019-09-22 22:55:50\",\n        \"auxiliary_time\": \"2235-03-31 06:10:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 421,\n        \"task_content\": \"鰞鎂锐甄辭掎騜乓架庼心匆趔眸沆躘澵唸殖擳誮帤瀊愺浑畋蚫莴徎鞖惃淙曼憗魸沉踘熏穳唕揂詄總噷镱赈鰯搅箢倂梵駓鶦\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1feec08d0d3c4b17ddd0d6c6e2f571a2\",\n    \"remarks\": \"暠消葧狵鳻璣仸濛褽吢喧躦\",\n    \"status\": \"8\",\n    \"progress\": 20,\n    \"jh_date\": \"83/07/28 1124\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"窤赍捳\",\n    \"tug\": \"32\",\n    \"english_ship_name\": \"ra5t1n\",\n    \"call\": \"6T42MB\",\n    \"ship_captain\": \"跋椀埳\",\n    \"ton\": 464505,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"荀搽垺\",\n    \"payer_company\": \"輔楜有限公司\",\n    \"ship_company\": \"醕咡有限公司\",\n    \"begin_point\": \"屔受\",\n    \"end_point\": \"憷粈\",\n    \"route\": \"第 3航线\",\n    \"power\": \"28千瓦\",\n    \"dispatcher\": \"周藅峙\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ba9e16e5c47665ecb72c656232570472\",\n        \"parentId\": \"1feec08d0d3c4b17ddd0d6c6e2f571a2\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2099-03-27 07:46:09\",\n        \"receive_time\": \"2281-05-15 16:00:26\",\n        \"dd_num\": \"087797568413\",\n        \"departure_time\": \"2006-12-09 01:49:36\",\n        \"work_begin_time\": \"2095-03-08 06:50:44\",\n        \"work_end_time\": \"2257-05-05 10:14:00\",\n        \"return_time\": \"1970-05-04 15:13:20\",\n        \"auxiliary_time\": \"2125-11-01 20:46:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 120,\n        \"task_content\": \"迻籾茳伄淍翐鋥檃蒵慰倓徕甝僊擒贞蘔硎嘛蕓碏鹪癏輫篱蝄瑢扊颾鍗襕贜恴瓖羗云均磲卫鏈獰柧瘷寈跟芭些箰馽蓃詰蟴車胃鈰竼頋桚儗鐏敊掐鷸廮灍穿薯銕芢缪玼甴恆鐗骫丮蛎肺鑞栴栂駂齬\"\n      },\n      {\n        \"id\": \"c60786fa665a869bd209e2ec5470b591\",\n        \"parentId\": \"1feec08d0d3c4b17ddd0d6c6e2f571a2\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1998-09-01 00:56:44\",\n        \"receive_time\": \"2280-04-09 04:06:59\",\n        \"dd_num\": \"921300250459\",\n        \"departure_time\": \"2045-07-21 20:29:01\",\n        \"work_begin_time\": \"2160-12-03 11:12:36\",\n        \"work_end_time\": \"2161-12-09 18:04:58\",\n        \"return_time\": \"2118-01-25 16:42:43\",\n        \"auxiliary_time\": \"2193-01-28 09:21:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 214,\n        \"task_content\": \"嫀枃甼闃玻杽谭徉讬嗻淗荦栘辄咢櫬筈醟纰痌溉毞枖桥俦榦卲芩摮冊阃郞朦圹恧臌廱鵖砧蝗齰諲笮皫蛃摬仄馈峃罝縗\"\n      },\n      {\n        \"id\": \"2d2ece39672df51fbe5253c46a2ce2ab\",\n        \"parentId\": \"1feec08d0d3c4b17ddd0d6c6e2f571a2\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2175-07-16 10:22:51\",\n        \"receive_time\": \"2198-10-17 18:57:57\",\n        \"dd_num\": \"622087045883\",\n        \"departure_time\": \"2099-09-12 23:08:06\",\n        \"work_begin_time\": \"2196-11-27 00:46:12\",\n        \"work_end_time\": \"2003-02-03 13:54:05\",\n        \"return_time\": \"2075-03-14 09:42:56\",\n        \"auxiliary_time\": \"2208-05-27 11:25:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 702,\n        \"task_content\": \"杦芎苷霮桎矈逯戫癟指囧槼城俈畔龖膼鲮僱愫鸗眠旧怢髠掆嗐眂坳偦粐櫣煱皭襹頮埔檒邇姒崫躓炗鎅隥瀠赻鰀羌穈禜围牷\"\n      },\n      {\n        \"id\": \"0ef966830833fe7a7661c26fb60197a5\",\n        \"parentId\": \"1feec08d0d3c4b17ddd0d6c6e2f571a2\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2099-10-29 03:59:07\",\n        \"receive_time\": \"2269-06-10 04:54:19\",\n        \"dd_num\": \"834328390000\",\n        \"departure_time\": \"2118-05-21 16:35:25\",\n        \"work_begin_time\": \"2082-02-24 11:54:00\",\n        \"work_end_time\": \"2007-07-30 13:57:22\",\n        \"return_time\": \"1985-12-23 05:33:50\",\n        \"auxiliary_time\": \"2157-03-23 22:36:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 919,\n        \"task_content\": \"軫液猂皥拮傩璶\"\n      },\n      {\n        \"id\": \"c6be2884ccaa39bc535d1ce1919a4028\",\n        \"parentId\": \"1feec08d0d3c4b17ddd0d6c6e2f571a2\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2104-05-26 22:48:08\",\n        \"receive_time\": \"2230-10-13 23:31:03\",\n        \"dd_num\": \"887291200908\",\n        \"departure_time\": \"2247-06-17 00:28:12\",\n        \"work_begin_time\": \"2230-01-25 21:46:03\",\n        \"work_end_time\": \"1972-04-19 01:13:05\",\n        \"return_time\": \"2182-06-05 05:21:08\",\n        \"auxiliary_time\": \"1975-02-19 09:04:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 282,\n        \"task_content\": \"招呰蟠恵唪枺隶栨旴簀餹童詍橑轳倒薪砷垾係鰎桢沍摈摉溯产\"\n      }\n    ]\n  },\n  {\n    \"id\": \"020cf1c25abdb902e75de16c8267a411\",\n    \"remarks\": \"釫黿肍啟吘浔凍唴界瓴慀頏\",\n    \"status\": \"2\",\n    \"progress\": 18,\n    \"jh_date\": \"02/07/31 2312\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"肼豊駋\",\n    \"tug\": \"78\",\n    \"english_ship_name\": \"as3yuf\",\n    \"call\": \"RT3J8M\",\n    \"ship_captain\": \"况咏毴\",\n    \"ton\": 141244,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"空嬦\",\n    \"payer_company\": \"閃濻有限公司\",\n    \"ship_company\": \"胧磄有限公司\",\n    \"begin_point\": \"緘錿\",\n    \"end_point\": \"鎖棯\",\n    \"route\": \"第 9航线\",\n    \"power\": \"63千瓦\",\n    \"dispatcher\": \"颜岊鬍\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"39b33fc1008439aa7e12a982b3f2333b\",\n        \"parentId\": \"020cf1c25abdb902e75de16c8267a411\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2066-05-24 03:34:56\",\n        \"receive_time\": \"2002-05-19 19:19:29\",\n        \"dd_num\": \"776378808829\",\n        \"departure_time\": \"2235-01-12 10:05:33\",\n        \"work_begin_time\": \"2257-06-20 15:36:55\",\n        \"work_end_time\": \"2280-09-16 15:54:05\",\n        \"return_time\": \"2115-05-17 16:59:58\",\n        \"auxiliary_time\": \"2179-12-11 03:18:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 742,\n        \"task_content\": \"甋鄤簫骱仐蓖姲梘虶婬礶罩勪訋菷曠釯劂鑞鸡佞褎苢涋惉芳蜟穰壝萼宦飁脹傞鎑玓顬滶媲堷馮沲匃稪卦竝抽鳔竨鼣珑扷邷楖觊忥驄禾鵍虭戔碣恛贞鎒劅斟鯪驕黲郶禧岨葁刣踈餏浼揰黛蝦鳲睤漀琪潪噾帚踥踙幧儔諘齒觓銔瓅玘簶翍\"\n      },\n      {\n        \"id\": \"e187e6a8954c23feb23b48133e988dca\",\n        \"parentId\": \"020cf1c25abdb902e75de16c8267a411\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2269-09-25 01:53:59\",\n        \"receive_time\": \"2166-11-23 17:51:47\",\n        \"dd_num\": \"085637522782\",\n        \"departure_time\": \"2049-07-11 22:39:09\",\n        \"work_begin_time\": \"2142-09-27 00:42:19\",\n        \"work_end_time\": \"2178-05-09 03:32:50\",\n        \"return_time\": \"2062-01-01 02:12:46\",\n        \"auxiliary_time\": \"2273-02-24 18:31:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 359,\n        \"task_content\": \"秛捖盲岭昪拄衻靊饢浜歄捛慒品瘨悪汅寅鼢鵮劤紛瞧瑥碳蜸瞹鰒幽掊鐪鱠閫舑矂鏽郎莉苳鞜嫜眝鉗涛堨椝陬珡齳籌鲉陽纞冔劑韸泰轪殳嘤凐烤揿诃廇蔆涟瘋湦熭嶉睅错之霪聞緄囘芶蟩蘓胲骻酔莢溱舠龑娏勴贴耨迁堢懶磳\"\n      },\n      {\n        \"id\": \"6a94148eecfaaabef5b10f8538287fb4\",\n        \"parentId\": \"020cf1c25abdb902e75de16c8267a411\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2049-12-12 00:12:33\",\n        \"receive_time\": \"2224-04-23 14:13:54\",\n        \"dd_num\": \"373166453002\",\n        \"departure_time\": \"1975-10-24 12:15:16\",\n        \"work_begin_time\": \"2039-03-23 09:38:50\",\n        \"work_end_time\": \"2170-08-02 06:12:49\",\n        \"return_time\": \"1986-01-01 01:15:54\",\n        \"auxiliary_time\": \"2010-07-24 13:53:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 739,\n        \"task_content\": \"頵蹔笾颱辋莳郦渘附墦睰蠍殧穥陈潓解尪秖賠榤胜謽厂萰诪氪薪漠剖燀帲暔湌犢寒糅齅蘮綄珆芟紑筽更嘛嚊耼唓敲杋棴对\"\n      },\n      {\n        \"id\": \"78d193914a743bf469922edd57c216ce\",\n        \"parentId\": \"020cf1c25abdb902e75de16c8267a411\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2168-07-04 13:28:36\",\n        \"receive_time\": \"2142-11-01 23:28:28\",\n        \"dd_num\": \"260716396073\",\n        \"departure_time\": \"2235-05-15 22:03:27\",\n        \"work_begin_time\": \"2152-06-03 22:21:14\",\n        \"work_end_time\": \"2274-11-02 02:06:05\",\n        \"return_time\": \"2245-01-12 12:59:35\",\n        \"auxiliary_time\": \"2091-10-20 17:46:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 979,\n        \"task_content\": \"柕鍍熒偃璗鮞斊赮鄅鈖銓懮墢釲娍栟渠頒蒦渃死青撯凚鳂艵阙浻睋燿盿汝貞薅糓袑誠楬礆蟮木懶筨根髠憏由胁崵姩广嘋筟橢蟃峅聋漖\"\n      },\n      {\n        \"id\": \"831948a6c89da89a02981d59a89e7bb5\",\n        \"parentId\": \"020cf1c25abdb902e75de16c8267a411\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2219-09-29 15:37:17\",\n        \"receive_time\": \"2280-09-04 14:46:02\",\n        \"dd_num\": \"600993864235\",\n        \"departure_time\": \"2018-06-15 02:47:52\",\n        \"work_begin_time\": \"2157-10-12 01:18:52\",\n        \"work_end_time\": \"2110-05-23 16:50:51\",\n        \"return_time\": \"2009-07-16 03:08:44\",\n        \"auxiliary_time\": \"2044-08-28 18:13:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 400,\n        \"task_content\": \"峊郲鰌賫妲脕銭鰣霑醪感\"\n      },\n      {\n        \"id\": \"a8b508ceb6cede510816091265b7f281\",\n        \"parentId\": \"020cf1c25abdb902e75de16c8267a411\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2212-09-08 08:36:03\",\n        \"receive_time\": \"2199-04-21 00:52:34\",\n        \"dd_num\": \"715906881005\",\n        \"departure_time\": \"2034-09-29 06:10:28\",\n        \"work_begin_time\": \"2246-07-16 08:03:21\",\n        \"work_end_time\": \"2198-12-23 07:38:47\",\n        \"return_time\": \"2257-12-18 20:01:47\",\n        \"auxiliary_time\": \"2087-10-12 06:56:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 919,\n        \"task_content\": \"锪镰禿蕟牢覂読镴哨樋焳匈巑貲惬阭脲騻兇矎忉袳彻鋛祻葪夒赕茛絮亵祪阧刪骢洎\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b856e5f56b755939e0762c1b3f019cba\",\n    \"remarks\": \"鼠覐馄媯蹣拘褺站咨眓苳货\",\n    \"status\": \"0\",\n    \"progress\": 57,\n    \"jh_date\": \"67/01/05 0710\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"俼屘彥\",\n    \"tug\": \"98\",\n    \"english_ship_name\": \"em6mm5\",\n    \"call\": \"014BKT\",\n    \"ship_captain\": \"孟鉬飫\",\n    \"ton\": 145420,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"左筹谷\",\n    \"payer_company\": \"桐舄有限公司\",\n    \"ship_company\": \"吃珗有限公司\",\n    \"begin_point\": \"羕堀\",\n    \"end_point\": \"憽侊\",\n    \"route\": \"第 8航线\",\n    \"power\": \"29千瓦\",\n    \"dispatcher\": \"辛頟紋\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ff1a7a118c399d96f06fc53509e732fd\",\n        \"parentId\": \"b856e5f56b755939e0762c1b3f019cba\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2057-09-21 13:26:55\",\n        \"receive_time\": \"2041-05-03 04:46:31\",\n        \"dd_num\": \"218328069284\",\n        \"departure_time\": \"2094-12-08 09:23:42\",\n        \"work_begin_time\": \"2261-12-18 21:53:01\",\n        \"work_end_time\": \"2030-04-08 20:03:23\",\n        \"return_time\": \"2103-02-09 23:13:52\",\n        \"auxiliary_time\": \"1988-09-15 09:30:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 830,\n        \"task_content\": \"栺菾橲礶睱硘猴舺黚莡嵐選菃曀斀龅联鰆鉷跺粺弚躘饿汶鉇羹咈釢腂凄勤蘃繝頧輱筗雗傸草紘臃餖琓洢铌鬴欐鋰麖鷍珦蘜畎繻兔糌鐠斋悂豨摽伥婴崸鲬银\"\n      },\n      {\n        \"id\": \"605b4709b27663375bcfdd71553540e0\",\n        \"parentId\": \"b856e5f56b755939e0762c1b3f019cba\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2280-09-07 02:50:38\",\n        \"receive_time\": \"2130-01-14 16:46:48\",\n        \"dd_num\": \"425321351145\",\n        \"departure_time\": \"2280-05-28 07:22:29\",\n        \"work_begin_time\": \"2026-09-23 21:24:42\",\n        \"work_end_time\": \"2054-06-22 19:55:29\",\n        \"return_time\": \"2012-07-12 17:59:05\",\n        \"auxiliary_time\": \"2204-08-21 22:40:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 364,\n        \"task_content\": \"勪忭軙颕蓯欛焇櫈憲孂澡噞谤乣巖偕朅箸倬檏炡乣咙殿鐈濸蜼碭鰀茯横匜艳鲅踆茑摹氄択宇蕕财亍坱贱槦扄囖怵懟銏锴劇鞳艬氀讖命労考腒虻贁癤繩畾啗匧槃扐裖鋪蚏当矓磳腼铑尳帲亢尗嬇塣釈簘繴僚姕洭狍虃託硦历镖訰湾塑鐸岷鯱溃廸栈蘸啡坊耫尽顤狯邵蛨崯勤坣\"\n      },\n      {\n        \"id\": \"5211695886d27aa9817203be702d8e12\",\n        \"parentId\": \"b856e5f56b755939e0762c1b3f019cba\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2181-03-08 19:58:45\",\n        \"receive_time\": \"2276-03-15 23:32:44\",\n        \"dd_num\": \"529431510948\",\n        \"departure_time\": \"2038-09-29 15:10:54\",\n        \"work_begin_time\": \"2015-11-10 01:40:24\",\n        \"work_end_time\": \"2178-05-21 13:21:07\",\n        \"return_time\": \"2257-09-01 20:29:53\",\n        \"auxiliary_time\": \"1995-03-16 21:20:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 272,\n        \"task_content\": \"拮卖膒撍爕哃瞠嶹瞲湠窚橦诹湫藏谫釚脔輋墰頖粫驈嶓爬蕍验媎鋊墭亩驫碶瘆璊锹憡乍\"\n      },\n      {\n        \"id\": \"aff7818da5b2befd5beb2b3af325354b\",\n        \"parentId\": \"b856e5f56b755939e0762c1b3f019cba\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1983-01-19 08:40:20\",\n        \"receive_time\": \"2013-08-19 17:40:47\",\n        \"dd_num\": \"566949203945\",\n        \"departure_time\": \"2048-08-15 18:51:49\",\n        \"work_begin_time\": \"2267-02-25 00:09:13\",\n        \"work_end_time\": \"2268-02-14 10:03:35\",\n        \"return_time\": \"2178-09-27 14:27:06\",\n        \"auxiliary_time\": \"2225-04-23 16:40:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 405,\n        \"task_content\": \"炬泔鎌霯漎苛楝賹蔳厣讉曵酴鴼圦枸嬶晹覸嘳恓滢邨挑靃徇俏騅佪帼閙饽攀珲鶷舶槯逭渔炎汶昋饻餩黊鄯子愡燣疯騲鶛摚蓺驙頝鎹言鷐伮萀罕蝧薝鰫蛦熉鵒蒊賙钲濝苞烂坈寫對忑疢瞊埃湯剤鱻訃濣曅剔瞒埂坄撊繈嶄趓嘡歯鞟迍赪渜箁丮黫舗岆诒摸俕鷟眖蝅踖晝悃擃剠\"\n      },\n      {\n        \"id\": \"1ca768ba40c85895f1fb3b436a59f376\",\n        \"parentId\": \"b856e5f56b755939e0762c1b3f019cba\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2025-09-21 17:49:42\",\n        \"receive_time\": \"2250-07-06 16:25:20\",\n        \"dd_num\": \"357160165348\",\n        \"departure_time\": \"2039-11-06 06:05:12\",\n        \"work_begin_time\": \"2251-05-21 12:26:45\",\n        \"work_end_time\": \"2238-10-27 22:33:35\",\n        \"return_time\": \"2089-04-04 22:58:29\",\n        \"auxiliary_time\": \"2281-07-20 21:29:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 117,\n        \"task_content\": \"迏碶饑嫀辪岠樵幗琬缇紑桉玖劥勀癔皆梑竀痓藻觗墯鄾铎锻蟟鋎诵垌琾旹鹩侅璇騌鱲裪豢柗華犮烨靜鳎琛睧稚鍟抺錼钓澫砄顸溂盶籿灀鬗洍陽鉵蘗璸澚戨葅絯爑艐你哂赲啍铿佌搰巣割鯛縁悴卿塮謘琠览藡纭癋搞蛺哷踆嵹忽\"\n      },\n      {\n        \"id\": \"c1e3b26d7b8061c55a5cea9e4f02c171\",\n        \"parentId\": \"b856e5f56b755939e0762c1b3f019cba\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1988-09-12 15:05:30\",\n        \"receive_time\": \"2032-11-25 08:12:41\",\n        \"dd_num\": \"739903674419\",\n        \"departure_time\": \"2014-08-19 15:55:01\",\n        \"work_begin_time\": \"2203-08-08 23:51:53\",\n        \"work_end_time\": \"2100-08-11 21:10:38\",\n        \"return_time\": \"2162-10-07 03:07:49\",\n        \"auxiliary_time\": \"2139-08-23 07:41:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 660,\n        \"task_content\": \"嘜鞐翊鰺於尒沊瘨諸薠曈漬桓幠藈儯鋁榖彙蘇瞺擏嵻侌焊垣轉倲竣盂烒皠拮矷謭豦樫庯廝旅鸿蛑炔靛煗儻獘淜紨瀡飇簌籋奔卑遁嘉韜骒狕躩篕嬕轆嬡岳桹蛵伜\"\n      },\n      {\n        \"id\": \"643e5baac39ae22a67cdae1ab5a98315\",\n        \"parentId\": \"b856e5f56b755939e0762c1b3f019cba\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2077-10-31 23:04:48\",\n        \"receive_time\": \"2119-07-26 11:20:40\",\n        \"dd_num\": \"004695663548\",\n        \"departure_time\": \"2097-05-26 15:08:21\",\n        \"work_begin_time\": \"2169-02-20 01:49:17\",\n        \"work_end_time\": \"2253-08-14 04:57:30\",\n        \"return_time\": \"2101-07-08 19:14:46\",\n        \"auxiliary_time\": \"2214-03-30 06:29:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 922,\n        \"task_content\": \"椲秔刾殠膗譃疫産餠诩塅膌嗞曦在恻髲層章神向擠宣抬馥閳吥炨駀跇瓰厉底湘蝻郜啥攚庥懔睶飒頋萇荴缛題隝鯦浲県樵嵉謀襻頑簈癟奻稏樤頤枒鴂檚虆葳裐徹關緐覾鐸醾鑨癓府牷約慅堹\"\n      }\n    ]\n  },\n  {\n    \"id\": \"466931466cc0a2ca5fad83a238b66d00\",\n    \"remarks\": \"膫蝃鲚蜔讌鑑駝泗媯蒣徨擩\",\n    \"status\": \"8\",\n    \"progress\": 74,\n    \"jh_date\": \"37/01/17 0923\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"薃鋾揙\",\n    \"tug\": \"80\",\n    \"english_ship_name\": \"uvd8iy\",\n    \"call\": \"8V94MZ\",\n    \"ship_captain\": \"裴睡\",\n    \"ton\": 951612,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"时烕\",\n    \"payer_company\": \"律髴有限公司\",\n    \"ship_company\": \"澂燰有限公司\",\n    \"begin_point\": \"逋鉀\",\n    \"end_point\": \"辭硹\",\n    \"route\": \"第 6航线\",\n    \"power\": \"57千瓦\",\n    \"dispatcher\": \"宫趛耒\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ffcfbf66399b9b6a045faf85dfb04ba9\",\n        \"parentId\": \"466931466cc0a2ca5fad83a238b66d00\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2221-02-20 05:16:00\",\n        \"receive_time\": \"1975-09-17 10:42:17\",\n        \"dd_num\": \"709385891813\",\n        \"departure_time\": \"2057-11-27 18:46:58\",\n        \"work_begin_time\": \"2072-05-19 05:19:25\",\n        \"work_end_time\": \"1982-08-12 16:05:13\",\n        \"return_time\": \"2143-07-20 03:00:04\",\n        \"auxiliary_time\": \"2209-08-31 18:14:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 302,\n        \"task_content\": \"涴蜐喇歇睤嘵紕靉槱矯眒霋嚶珋掛窈沋盧滕爱櫺偼澏脒畗慦珢鬵矝脓醆劈冖鴵祲踌嚗鯜鍣絢螁勱僲嬧憈砦逛隍逧歴馘騢厝秘\"\n      },\n      {\n        \"id\": \"c2aba54ebb8ee81e65bb72dfeee4c163\",\n        \"parentId\": \"466931466cc0a2ca5fad83a238b66d00\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2260-04-02 14:51:07\",\n        \"receive_time\": \"2205-03-06 14:50:10\",\n        \"dd_num\": \"273541136694\",\n        \"departure_time\": \"1977-03-18 20:37:25\",\n        \"work_begin_time\": \"2198-04-17 19:11:52\",\n        \"work_end_time\": \"1987-02-17 21:14:34\",\n        \"return_time\": \"2250-03-07 17:13:23\",\n        \"auxiliary_time\": \"2077-12-25 11:43:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 549,\n        \"task_content\": \"瑣龘枷霘朦裣冒哮媕鸠縗拟镮薰釣鷔寒坌伶爛枂缑腚逴賞敎悑钯鏦鑿臅拋钓驒卦痈\"\n      },\n      {\n        \"id\": \"a386f1df06ba52b56d485861a6064f05\",\n        \"parentId\": \"466931466cc0a2ca5fad83a238b66d00\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2166-10-28 01:53:47\",\n        \"receive_time\": \"2039-04-04 16:49:21\",\n        \"dd_num\": \"739651846535\",\n        \"departure_time\": \"2129-09-15 02:41:14\",\n        \"work_begin_time\": \"2029-11-06 22:11:43\",\n        \"work_end_time\": \"2164-04-30 21:04:13\",\n        \"return_time\": \"2091-12-29 17:07:58\",\n        \"auxiliary_time\": \"2208-12-15 10:50:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 593,\n        \"task_content\": \"櫬怨查鷷斻吓柫馻擶濐唜爠掭歎悥尮啱梑鲂蚑荷膵蹜岊挴刣菒繎肁狚即炝喕瞚鸲収筟譴墮黉苐属耻鄮裤歘錘鞂占弎楆盬蓂魚辣蚇将鬞仳鄛罒穞镧谾娴锘趠窃痃昗郚扑镅\"\n      },\n      {\n        \"id\": \"ca94079a34381d9144f4d71af1fab879\",\n        \"parentId\": \"466931466cc0a2ca5fad83a238b66d00\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2121-06-01 21:27:38\",\n        \"receive_time\": \"2280-07-10 03:05:24\",\n        \"dd_num\": \"995838692670\",\n        \"departure_time\": \"2186-02-01 14:47:34\",\n        \"work_begin_time\": \"2264-03-09 09:50:43\",\n        \"work_end_time\": \"2131-09-25 05:41:37\",\n        \"return_time\": \"2235-04-05 02:02:30\",\n        \"auxiliary_time\": \"2216-07-15 05:31:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 767,\n        \"task_content\": \"摜媮縼斱俘杞驅饄戰簉乑能晙螧舛難髲鰷颠澅鱽井鰩嬨怬黭撕庙爊宯烨猷瓩褈煗苮縝暫蟨畺夷蒽檥狥坒乶論礁湳仾餹蹐狿枸魰质閯淙肁浘鯬捺闵榠顂愔檤穦蠙\"\n      },\n      {\n        \"id\": \"047df080590546d65c4f3aaebede744a\",\n        \"parentId\": \"466931466cc0a2ca5fad83a238b66d00\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2224-03-17 14:21:28\",\n        \"receive_time\": \"2162-03-14 05:39:39\",\n        \"dd_num\": \"753604370942\",\n        \"departure_time\": \"2221-03-08 17:06:02\",\n        \"work_begin_time\": \"2213-07-28 05:09:35\",\n        \"work_end_time\": \"2006-10-13 04:28:36\",\n        \"return_time\": \"2026-11-25 01:03:23\",\n        \"auxiliary_time\": \"2063-09-10 06:59:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 266,\n        \"task_content\": \"嗩涳鎯人镨毮諏郀蔷嘫漄恜嘽饉噙毌羕薡拭袄膥剦臤暜鬚矓鑛采蚑鮶墍侷飞闣愺愝良銸糭闸男扅壞丩訤叿鬾弁堺臄綿猎峙娣捜匝苕瓲禽\"\n      },\n      {\n        \"id\": \"e59cfff986662c98a70140da8be8653d\",\n        \"parentId\": \"466931466cc0a2ca5fad83a238b66d00\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2048-08-17 15:32:56\",\n        \"receive_time\": \"2018-09-06 14:07:50\",\n        \"dd_num\": \"824199410405\",\n        \"departure_time\": \"2245-10-19 18:55:02\",\n        \"work_begin_time\": \"2276-02-20 17:22:51\",\n        \"work_end_time\": \"2036-09-03 18:40:45\",\n        \"return_time\": \"2031-04-02 22:17:37\",\n        \"auxiliary_time\": \"2091-12-20 11:47:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 580,\n        \"task_content\": \"俹杋逻刾蓹兒頿治斺驔嗵絮厰釖稯魪踦黿疽脑殁緂率瞸犲禠瑗勿謅騈唉旭赨繥紺冚埚螿上萊嘙碕藺圗閝垏迏宩黅柌斳敥眲敍鐃垻瘎聋鍡執骥錣蜖婷礚昈迴琧穈禌左貴\"\n      },\n      {\n        \"id\": \"dd6b1a2b3a3c182a22dc24f52889413b\",\n        \"parentId\": \"466931466cc0a2ca5fad83a238b66d00\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-09-20 15:32:38\",\n        \"receive_time\": \"2267-02-09 07:53:02\",\n        \"dd_num\": \"887643806593\",\n        \"departure_time\": \"2241-09-29 10:47:04\",\n        \"work_begin_time\": \"2135-10-10 19:04:26\",\n        \"work_end_time\": \"2173-02-04 03:03:36\",\n        \"return_time\": \"2277-09-21 16:16:10\",\n        \"auxiliary_time\": \"2033-03-28 07:18:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 703,\n        \"task_content\": \"袝嘱夭山縡贅違渮飛杗塮乲躥塮醅秺槾笿糇糩踖鮹傼車襺黮剱嬍遜綘垷缁噄尒束陂犿敵榔喋盚訃狍罱晢丮敌澩薃鑫匀樜潺伧證鐟\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f5ba4166fa5929386f78eecdb03b4f43\",\n    \"remarks\": \"擪餣賞菄啣隯窮柗哗牠釈糵\",\n    \"status\": \"6\",\n    \"progress\": 30,\n    \"jh_date\": \"71/01/16 1226\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"搵蹰赮\",\n    \"tug\": \"74\",\n    \"english_ship_name\": \"kq58ny\",\n    \"call\": \"HTMSGZ\",\n    \"ship_captain\": \"贺虒\",\n    \"ton\": 242970,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"邵每\",\n    \"payer_company\": \"榼屻有限公司\",\n    \"ship_company\": \"愤跤有限公司\",\n    \"begin_point\": \"孈勷\",\n    \"end_point\": \"藹咐\",\n    \"route\": \"第 3航线\",\n    \"power\": \"47千瓦\",\n    \"dispatcher\": \"刘碹\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"3f8965a263420c68aad510d7940b28e2\",\n        \"parentId\": \"f5ba4166fa5929386f78eecdb03b4f43\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2196-01-26 21:57:06\",\n        \"receive_time\": \"2014-02-10 22:26:05\",\n        \"dd_num\": \"535315381741\",\n        \"departure_time\": \"1984-06-30 01:45:56\",\n        \"work_begin_time\": \"2269-10-26 20:30:29\",\n        \"work_end_time\": \"2077-05-18 18:30:42\",\n        \"return_time\": \"2222-06-03 19:36:33\",\n        \"auxiliary_time\": \"2081-11-10 08:40:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 758,\n        \"task_content\": \"傒词刎槴禹烴甐酰灘侙唋餂狀峏揘毽织牏舳亾鶄丙衲杗墔沩旐趌級釣旜緞沊宷酥酄喳僒漩櫥翍搟灗骘溈銰渳骸添緸戦肎鎌蝼硶积瘲鄲鮝埚梳韅琄滒婵粒巻襭砕菝鈯猈傕囵茝臁看禈推釻琧埱齧靊櫊艥槢苤馴鞩绰願鋦遊錐浪偓稥晖菽鏢阔矦泵\"\n      },\n      {\n        \"id\": \"3d305a83dbaf5de46bd8eb2abecb4bb7\",\n        \"parentId\": \"f5ba4166fa5929386f78eecdb03b4f43\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2174-02-17 10:54:21\",\n        \"receive_time\": \"2279-02-23 09:37:54\",\n        \"dd_num\": \"786465123344\",\n        \"departure_time\": \"2071-06-19 12:35:40\",\n        \"work_begin_time\": \"2187-09-24 08:59:29\",\n        \"work_end_time\": \"2240-08-01 12:49:00\",\n        \"return_time\": \"2234-12-31 09:05:23\",\n        \"auxiliary_time\": \"2176-05-02 09:55:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 583,\n        \"task_content\": \"乂査比絅湿鬁槉樧蕊悶夸德蕛睓堸簡孍勔粴蘧飽厄栁糇珤産釪癳墅捞址銗聿燥\"\n      },\n      {\n        \"id\": \"c1697d7409dbc08e91b71413da47b90c\",\n        \"parentId\": \"f5ba4166fa5929386f78eecdb03b4f43\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2119-05-26 12:18:36\",\n        \"receive_time\": \"2102-06-08 05:28:05\",\n        \"dd_num\": \"100023195793\",\n        \"departure_time\": \"1979-01-20 16:14:00\",\n        \"work_begin_time\": \"1970-06-12 18:55:07\",\n        \"work_end_time\": \"1991-07-05 16:12:09\",\n        \"return_time\": \"2010-02-02 23:25:13\",\n        \"auxiliary_time\": \"2191-06-01 05:24:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 483,\n        \"task_content\": \"茹建脦燍跾官縋僆蹴豮謸頪澾伸橪殓煼坏欦砳緻骘姥嚳蠾飝敁畾齻浿輈炎錳羸啃髗舿洌鶋犀彐啃蝛狙寝蒜閡溙補晆麽忳挱胮志薌偟鍽嬖溧鞻鱃柔蜨攓煗溚磬騐隭痱攨黎乪櫷邀祡晘龅\"\n      },\n      {\n        \"id\": \"3f02e2c6ce63a7cce7a0016992c0e135\",\n        \"parentId\": \"f5ba4166fa5929386f78eecdb03b4f43\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2206-06-29 19:26:34\",\n        \"receive_time\": \"2002-02-03 13:38:32\",\n        \"dd_num\": \"847768001276\",\n        \"departure_time\": \"2014-07-28 23:30:47\",\n        \"work_begin_time\": \"2037-12-25 23:45:37\",\n        \"work_end_time\": \"2258-07-08 16:22:21\",\n        \"return_time\": \"2043-11-21 19:27:58\",\n        \"auxiliary_time\": \"2174-10-08 01:38:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 190,\n        \"task_content\": \"矕掣魣慿蝺醸槂岯蓊憙襉駽潟吔蹆莻痞駏者懚略闅锘浭櫶鬤痧仍\"\n      },\n      {\n        \"id\": \"11ee2b3f698006f66c21259b5a9491da\",\n        \"parentId\": \"f5ba4166fa5929386f78eecdb03b4f43\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2040-12-30 17:33:31\",\n        \"receive_time\": \"2233-02-09 16:57:56\",\n        \"dd_num\": \"337392746217\",\n        \"departure_time\": \"2260-08-12 13:52:05\",\n        \"work_begin_time\": \"2024-08-08 08:16:17\",\n        \"work_end_time\": \"2088-05-03 20:53:32\",\n        \"return_time\": \"2065-05-14 21:03:09\",\n        \"auxiliary_time\": \"2195-10-08 07:19:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 264,\n        \"task_content\": \"瞬侚蠋葓眢蓅頕鲱忨潷梚秐蒢谻縝膆蛨巔嵷龢紝逶晇鍈拜撡鐙广琬雐橯兌篢睵坿珮爉砰伷箃钪憯鄯櫫堅垗軅氉膉恦筫\"\n      },\n      {\n        \"id\": \"6530f9f6554af6f351ab140e448d2ac4\",\n        \"parentId\": \"f5ba4166fa5929386f78eecdb03b4f43\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-01-02 22:20:08\",\n        \"receive_time\": \"2257-11-27 14:01:08\",\n        \"dd_num\": \"082219483886\",\n        \"departure_time\": \"2075-08-07 02:52:45\",\n        \"work_begin_time\": \"2225-10-27 06:35:02\",\n        \"work_end_time\": \"2036-04-28 11:37:34\",\n        \"return_time\": \"2075-01-27 12:15:34\",\n        \"auxiliary_time\": \"2133-09-27 05:03:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 614,\n        \"task_content\": \"嘋賄隐齮窕褛萨橯犣詆钹釔匡湗桘割鲼秅胂黈鯨曺簏珨鄖執鄛鍍謁掃刖镮餓棣轡織虵阪蚹狄汛璸鳢呄袏逋栲剣暑碡餆抩\"\n      },\n      {\n        \"id\": \"02261617e392d925d51d58e6858661ac\",\n        \"parentId\": \"f5ba4166fa5929386f78eecdb03b4f43\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2218-11-02 06:23:50\",\n        \"receive_time\": \"2209-01-10 23:48:03\",\n        \"dd_num\": \"110587683056\",\n        \"departure_time\": \"2059-10-09 04:56:41\",\n        \"work_begin_time\": \"1999-05-08 07:36:39\",\n        \"work_end_time\": \"2263-01-13 07:20:22\",\n        \"return_time\": \"2080-09-20 07:51:37\",\n        \"auxiliary_time\": \"2037-05-14 02:38:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 340,\n        \"task_content\": \"秡梋墤駦卶鎍窄嚨墒膖澸嵇浰壻喭禍惛聧蜫爂醕姚陎滔閏旴厛揲\"\n      },\n      {\n        \"id\": \"e040e49133138fd25f10f5747356849a\",\n        \"parentId\": \"f5ba4166fa5929386f78eecdb03b4f43\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2286-08-27 08:49:05\",\n        \"receive_time\": \"2252-08-29 21:51:25\",\n        \"dd_num\": \"726087286900\",\n        \"departure_time\": \"2205-02-01 12:13:45\",\n        \"work_begin_time\": \"2250-03-05 11:53:20\",\n        \"work_end_time\": \"2020-10-13 07:28:58\",\n        \"return_time\": \"2027-09-24 19:40:44\",\n        \"auxiliary_time\": \"2275-07-10 03:22:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 849,\n        \"task_content\": \"侌糳仓搯謲筏模粹鹳瑾澿拁壉熡墵龉槂璷返傡桕窤姠邵誽烙坊抡刐涚獞烑喧\"\n      },\n      {\n        \"id\": \"cac8c292c511b0ecf63f1c5953861530\",\n        \"parentId\": \"f5ba4166fa5929386f78eecdb03b4f43\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2000-12-23 05:31:52\",\n        \"receive_time\": \"2081-06-24 08:48:03\",\n        \"dd_num\": \"390835725340\",\n        \"departure_time\": \"2201-10-31 06:16:07\",\n        \"work_begin_time\": \"2132-12-29 23:00:09\",\n        \"work_end_time\": \"2143-11-17 17:25:38\",\n        \"return_time\": \"2116-02-24 03:03:58\",\n        \"auxiliary_time\": \"2252-03-03 08:08:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 354,\n        \"task_content\": \"啙亽劽趟匕袅声猳撞粒肰征嗟粿壜蔸饡卯舯酢敱斄轂錡脆砩汍洘键鹅锧暳禀畘薭愣蒸氖让码猸掞疱徂竼馅鏧银袀聀曥躤加蚱閄櫯镦烨憩頶芹\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1f5b645600d79b94df91fcbf1afb1a07\",\n    \"remarks\": \"諹稏栂窎仐秔熄澗鸞嫶渲泏\",\n    \"status\": \"0\",\n    \"progress\": 38,\n    \"jh_date\": \"95/01/26 2209\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"螃栊慮\",\n    \"tug\": \"61\",\n    \"english_ship_name\": \"g99b5p\",\n    \"call\": \"75WZ9H\",\n    \"ship_captain\": \"柯韃停\",\n    \"ton\": 919784,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"井叫飫\",\n    \"payer_company\": \"靱猏有限公司\",\n    \"ship_company\": \"酦襲有限公司\",\n    \"begin_point\": \"癞妑\",\n    \"end_point\": \"襔暒\",\n    \"route\": \"第 2航线\",\n    \"power\": \"59千瓦\",\n    \"dispatcher\": \"骆灿\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"70497ef4c312f9b4e527c93636b9bbab\",\n        \"parentId\": \"1f5b645600d79b94df91fcbf1afb1a07\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2184-12-17 05:18:15\",\n        \"receive_time\": \"1988-12-18 03:42:39\",\n        \"dd_num\": \"154187844535\",\n        \"departure_time\": \"2223-05-25 02:52:09\",\n        \"work_begin_time\": \"2268-05-21 17:04:06\",\n        \"work_end_time\": \"2050-05-13 04:16:45\",\n        \"return_time\": \"1992-08-17 14:17:00\",\n        \"auxiliary_time\": \"2034-02-08 02:11:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 123,\n        \"task_content\": \"宸灚饯謔溮躗吴酄觷瞹稫諘侶岂鐍曻咼忼播峽待禘麍鼷应阎怰鄂葄朮姾磻繇馊澛鯢县梋藎葨醩鰑\"\n      },\n      {\n        \"id\": \"0e3deda9892f800fe56edba9891e577a\",\n        \"parentId\": \"1f5b645600d79b94df91fcbf1afb1a07\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2255-06-06 07:42:12\",\n        \"receive_time\": \"1972-01-12 22:33:10\",\n        \"dd_num\": \"120961223598\",\n        \"departure_time\": \"2136-11-01 12:11:29\",\n        \"work_begin_time\": \"2265-01-30 19:08:12\",\n        \"work_end_time\": \"2208-10-24 03:38:07\",\n        \"return_time\": \"2155-01-03 19:58:30\",\n        \"auxiliary_time\": \"1990-06-09 14:11:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 534,\n        \"task_content\": \"柡愒娱俕验發繘鵄神滫鴼鳟録瓲册熒灭僚齅櫢泀糓唷搻砅糹酌由鞩課謠慫痋瞉懨饹浇侐嬶鐏捉甁漲熲腪賹链櫀輇隨赀甭妊煴户跅弞蒗剓胡苔鷃唘螻惟漢昶锴矝齠挲舭饥景旓揝\"\n      },\n      {\n        \"id\": \"cdc80b8d8851cfde05f3c1587d9ac0df\",\n        \"parentId\": \"1f5b645600d79b94df91fcbf1afb1a07\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2170-11-28 23:31:27\",\n        \"receive_time\": \"2240-07-01 04:53:10\",\n        \"dd_num\": \"191283295136\",\n        \"departure_time\": \"2076-12-10 11:10:00\",\n        \"work_begin_time\": \"2044-02-24 00:48:58\",\n        \"work_end_time\": \"2007-08-20 01:46:41\",\n        \"return_time\": \"2285-03-10 02:54:47\",\n        \"auxiliary_time\": \"2244-08-10 21:06:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 255,\n        \"task_content\": \"禮蜹鄷縑讃舌萵葾写訏饲鹇魅譋瓦噂牞鬁觙酸齱栣迳燹澱咗涑鼾栂巇脔風鬋悂夐喝形頾疏糿翜焛靡京蛺桓掅裸蛵孛塗輂您叞笷礰嬲謴驜筽挖鷑磔狆騲皳囯鰘磜欎鵪同愷滀簰洞搖罛藂濰媑筈桫矡塚萂逰郲璣踼令督抋耥拁胆轰弋炳衻懿\"\n      },\n      {\n        \"id\": \"0795e2da094975f484133352d839b41c\",\n        \"parentId\": \"1f5b645600d79b94df91fcbf1afb1a07\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1976-05-03 04:45:17\",\n        \"receive_time\": \"2218-01-09 13:03:23\",\n        \"dd_num\": \"643439898185\",\n        \"departure_time\": \"2133-07-17 22:41:31\",\n        \"work_begin_time\": \"2271-10-08 05:37:20\",\n        \"work_end_time\": \"2220-09-15 04:27:53\",\n        \"return_time\": \"2006-06-05 05:11:18\",\n        \"auxiliary_time\": \"2042-06-07 08:14:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 513,\n        \"task_content\": \"醸嗘奼粦絒飭弹蹥偦億鷋天孓泛櫒穴鑧閜藲莚跈衽兙蜫瞷梄做啥乆讙睚潍璍踒嘼簡婙鱝綛休魕鰡满驂艢礏筡刑姢泱衉榳桊腫吽栻骹馈苷设鰴邛斥蓑渶声汯仦例淄置樸葳鑵擞琽契挊深爑諫蕃栰贺欔寪鹐銫躈聢荓栍胘轷蔪瑢燳鋔癸\"\n      },\n      {\n        \"id\": \"166bd16d17ba6531260cf337a04f8690\",\n        \"parentId\": \"1f5b645600d79b94df91fcbf1afb1a07\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2232-08-29 09:06:48\",\n        \"receive_time\": \"2106-07-05 05:06:16\",\n        \"dd_num\": \"010507276373\",\n        \"departure_time\": \"2103-07-18 23:20:52\",\n        \"work_begin_time\": \"2206-07-08 13:05:27\",\n        \"work_end_time\": \"2016-08-14 00:09:14\",\n        \"return_time\": \"2020-07-29 07:59:20\",\n        \"auxiliary_time\": \"2215-02-08 13:07:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 120,\n        \"task_content\": \"躳琝镹禅鎛迴焂鱮蘷珤餓胜瑽饶忯嗛娖劷绫唔醑交趿赢鈇椽沲戹星桶飹阞這犑炛謓髿鍶锯筵榉薅焮豫枖唺侘疏澗钿衳憛字噫皅纷亼尃鏜著企粶鮕惃瓜份替芬忉厔\"\n      },\n      {\n        \"id\": \"0fa308d5e8abb572448e9c2077307d3b\",\n        \"parentId\": \"1f5b645600d79b94df91fcbf1afb1a07\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2200-01-29 12:31:53\",\n        \"receive_time\": \"2009-02-18 01:27:49\",\n        \"dd_num\": \"159746908809\",\n        \"departure_time\": \"2137-01-28 21:45:18\",\n        \"work_begin_time\": \"2098-05-02 18:31:20\",\n        \"work_end_time\": \"2239-12-17 10:49:18\",\n        \"return_time\": \"2237-09-16 02:47:09\",\n        \"auxiliary_time\": \"2181-02-17 09:21:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 123,\n        \"task_content\": \"苩躯胗戨鱴晈蓭魬禋蹋鸔覎惋犑铉烉嗫朣庵洔糮寓矒埩诓栁蜕汦驆寁帚貜楠嗃鹡槲讑帷乃馹騄櫸捴汱貥苲僜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ded55522d34b0988e52117f6e6aeb546\",\n    \"remarks\": \"搔钠鍐椔鑇瓬鑶襳领馠鴗縶\",\n    \"status\": \"6\",\n    \"progress\": 38,\n    \"jh_date\": \"48/04/14 2049\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"搇砃粹\",\n    \"tug\": \"72\",\n    \"english_ship_name\": \"h2w7zv\",\n    \"call\": \"AZTYD8\",\n    \"ship_captain\": \"徐籗\",\n    \"ton\": 459643,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"樊嬾\",\n    \"payer_company\": \"欋鱍有限公司\",\n    \"ship_company\": \"嗚粐有限公司\",\n    \"begin_point\": \"绱牏\",\n    \"end_point\": \"蓷頢\",\n    \"route\": \"第 10航线\",\n    \"power\": \"25千瓦\",\n    \"dispatcher\": \"幸噤觑\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"5d951ab60d614a310f902a21211bfc23\",\n        \"parentId\": \"ded55522d34b0988e52117f6e6aeb546\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2041-01-07 03:53:27\",\n        \"receive_time\": \"2013-01-22 05:33:41\",\n        \"dd_num\": \"851893579390\",\n        \"departure_time\": \"2194-06-01 13:49:35\",\n        \"work_begin_time\": \"2072-07-28 15:59:48\",\n        \"work_end_time\": \"2118-11-09 02:20:50\",\n        \"return_time\": \"1990-05-27 15:53:55\",\n        \"auxiliary_time\": \"2272-01-20 08:35:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 576,\n        \"task_content\": \"慏奷鉬礪轤珼誩臲繞鷊仼勎筺敉娷錏麉圾軫璯礓罽怟輺栗逍軒弩瀢絝睛拆膹乱黷铻榎閛潖斧膘恷\"\n      },\n      {\n        \"id\": \"a9aa9134b0b11ae793ef09907dbae233\",\n        \"parentId\": \"ded55522d34b0988e52117f6e6aeb546\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2237-04-17 12:13:21\",\n        \"receive_time\": \"2239-12-30 21:38:31\",\n        \"dd_num\": \"085737890304\",\n        \"departure_time\": \"2134-10-22 16:33:34\",\n        \"work_begin_time\": \"2170-04-22 03:43:25\",\n        \"work_end_time\": \"2109-04-03 05:10:48\",\n        \"return_time\": \"2276-06-05 19:18:48\",\n        \"auxiliary_time\": \"2034-09-03 00:02:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 392,\n        \"task_content\": \"梜嘙羂坣婉萝磆擜郘榹匁鏒珟諳粙駛驸輩翁捨寲撢瞯鏭鬚竞剁飩豍矆精鼴長霿滢鸶誒傎浇衬恉籬芇汊涝譣犁兀簚瘭眭鉟屒铂蒳嫀\"\n      },\n      {\n        \"id\": \"31fb31b61e3ddea3acf776737b0209da\",\n        \"parentId\": \"ded55522d34b0988e52117f6e6aeb546\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2216-05-13 23:12:30\",\n        \"receive_time\": \"2201-11-17 22:06:59\",\n        \"dd_num\": \"950103424943\",\n        \"departure_time\": \"1981-01-27 11:37:05\",\n        \"work_begin_time\": \"2059-10-24 02:26:48\",\n        \"work_end_time\": \"2035-08-15 23:23:10\",\n        \"return_time\": \"2120-05-24 05:59:21\",\n        \"auxiliary_time\": \"2099-02-26 15:08:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 785,\n        \"task_content\": \"唍聇杊昀燊笟鎨踲椎焇郲鮧\"\n      },\n      {\n        \"id\": \"6319f72d837d7efe3b486996e14d16e0\",\n        \"parentId\": \"ded55522d34b0988e52117f6e6aeb546\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2235-05-03 20:14:31\",\n        \"receive_time\": \"2216-05-11 15:16:08\",\n        \"dd_num\": \"189066675954\",\n        \"departure_time\": \"2237-03-21 22:23:39\",\n        \"work_begin_time\": \"2136-08-02 17:50:23\",\n        \"work_end_time\": \"2140-11-19 14:49:26\",\n        \"return_time\": \"2285-02-24 10:27:18\",\n        \"auxiliary_time\": \"2123-11-28 17:00:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 515,\n        \"task_content\": \"赩懢鶭侏斍万鱹躧騫姎鰉痂劥寥銱楃躖糦茬葛蔰訹攌鄒誴囒雥兄銍拐桰芩綴酛瀊夈耬鈭輯殈颠毪卹袽烛垽僷狟敧轷惨邽匨朢睬鶍辡嶯醱黵恸紜鞲隆璅鐋杬摫潉峍拤\"\n      },\n      {\n        \"id\": \"61478646cd0b9a0bf466d4c44edc90df\",\n        \"parentId\": \"ded55522d34b0988e52117f6e6aeb546\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2183-08-10 06:11:40\",\n        \"receive_time\": \"2071-12-04 20:51:39\",\n        \"dd_num\": \"295114014071\",\n        \"departure_time\": \"2084-10-27 09:24:54\",\n        \"work_begin_time\": \"2261-04-29 07:58:39\",\n        \"work_end_time\": \"2178-03-13 05:51:01\",\n        \"return_time\": \"2087-01-24 14:47:46\",\n        \"auxiliary_time\": \"2161-05-08 01:28:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 926,\n        \"task_content\": \"恢陲齝澨镩胯胲鐱闍湰鹍騦杼鰆佊艏犨麧糓榁蜘蹞灧罫蟓聼喼畺鳂迖醰鋚數晻佭宁觕笀珺辧孷譑溫汶荒濒慖呄炻齎潜枽埡軴傧絹淁蓁鑝弢訶潅縻娿蝵苺跪\"\n      },\n      {\n        \"id\": \"21c0526f100d69425bbc1fd6e33b1227\",\n        \"parentId\": \"ded55522d34b0988e52117f6e6aeb546\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2163-11-11 10:32:33\",\n        \"receive_time\": \"2267-03-02 23:39:05\",\n        \"dd_num\": \"577960598092\",\n        \"departure_time\": \"2032-04-09 17:30:11\",\n        \"work_begin_time\": \"1992-10-11 09:28:34\",\n        \"work_end_time\": \"2190-09-23 00:44:59\",\n        \"return_time\": \"2118-12-18 02:32:40\",\n        \"auxiliary_time\": \"2170-11-26 23:34:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 236,\n        \"task_content\": \"芹碕鋉枺垢怗滜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0780b8654b7ea6feac737dc0b2b05579\",\n    \"remarks\": \"赿貃哺攆时焃榷母舻阞阁蘶\",\n    \"status\": \"6\",\n    \"progress\": 79,\n    \"jh_date\": \"88/03/02 1755\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"忳翂泓\",\n    \"tug\": \"35\",\n    \"english_ship_name\": \"zwa73z\",\n    \"call\": \"9MFEAF\",\n    \"ship_captain\": \"阮縪袞\",\n    \"ton\": 57583,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"水齃\",\n    \"payer_company\": \"尟馜有限公司\",\n    \"ship_company\": \"邝肰有限公司\",\n    \"begin_point\": \"藑鷧\",\n    \"end_point\": \"嵧離\",\n    \"route\": \"第 6航线\",\n    \"power\": \"38千瓦\",\n    \"dispatcher\": \"余筙\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"bdce7735151fb9d3a7470f503b645d08\",\n        \"parentId\": \"0780b8654b7ea6feac737dc0b2b05579\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2112-07-15 01:05:01\",\n        \"receive_time\": \"1999-07-28 12:54:53\",\n        \"dd_num\": \"049142501774\",\n        \"departure_time\": \"2279-05-21 04:10:20\",\n        \"work_begin_time\": \"1988-09-11 08:32:30\",\n        \"work_end_time\": \"2199-05-09 22:04:10\",\n        \"return_time\": \"2244-11-23 14:10:12\",\n        \"auxiliary_time\": \"2078-02-11 03:57:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 202,\n        \"task_content\": \"榘饣鯮樹唩烞蔑聥黶濱嵢姗烌桻鞸瓬僞虋淊瘸堵荫濢紼侾鮫硐澀啸汄歪菂在欱籡躠褧鼲聻襄爪燫渘\"\n      },\n      {\n        \"id\": \"0abcf236b2708808a72e30934087eab4\",\n        \"parentId\": \"0780b8654b7ea6feac737dc0b2b05579\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2149-08-21 09:06:13\",\n        \"receive_time\": \"2034-08-30 12:56:56\",\n        \"dd_num\": \"695189442144\",\n        \"departure_time\": \"2081-11-04 16:05:36\",\n        \"work_begin_time\": \"2280-12-04 16:20:53\",\n        \"work_end_time\": \"2050-03-20 04:20:21\",\n        \"return_time\": \"2223-06-12 14:07:07\",\n        \"auxiliary_time\": \"2014-08-31 00:43:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 981,\n        \"task_content\": \"隒脕脤涰劂家鳚纨畏晜鄔阂稬久甽嵾臆掼鼌蜴厯糸尾瘤嵀謂踄\"\n      },\n      {\n        \"id\": \"e6bb72f8bc2513bba30ed0e42648f555\",\n        \"parentId\": \"0780b8654b7ea6feac737dc0b2b05579\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2012-05-16 23:10:03\",\n        \"receive_time\": \"2173-10-13 06:06:53\",\n        \"dd_num\": \"127427297087\",\n        \"departure_time\": \"2072-10-12 15:00:43\",\n        \"work_begin_time\": \"2193-06-17 18:36:53\",\n        \"work_end_time\": \"2200-07-16 20:30:06\",\n        \"return_time\": \"2018-01-05 01:11:26\",\n        \"auxiliary_time\": \"2133-04-02 19:02:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 507,\n        \"task_content\": \"議恛廾侲煚欩桞鵒廿鄄坴誻鍘阙壧靗粜慚珘怔艉偖雮尼恷遮秿陾垢姒镑省隈\"\n      },\n      {\n        \"id\": \"39f98d0bd27fa2f0b1821b0b980baa43\",\n        \"parentId\": \"0780b8654b7ea6feac737dc0b2b05579\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2092-06-02 22:05:57\",\n        \"receive_time\": \"2140-08-24 03:26:28\",\n        \"dd_num\": \"951032235303\",\n        \"departure_time\": \"2059-08-15 07:53:56\",\n        \"work_begin_time\": \"2070-11-10 19:43:37\",\n        \"work_end_time\": \"1971-12-11 12:28:10\",\n        \"return_time\": \"2189-06-10 19:32:52\",\n        \"auxiliary_time\": \"2196-12-15 14:58:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 284,\n        \"task_content\": \"敂垞惺炷櫃嬦痞鶸齱堽癙聐馘鏒斡颞蟞巍翸獢触鮣溴梠錩骑纞咤奠螰州鏁艊萰塙爈蹮悞檑泩壖唑賥琳熟宑俈挵历絥噍抯\"\n      },\n      {\n        \"id\": \"cf1f635eddd02969c752cee88414a2cb\",\n        \"parentId\": \"0780b8654b7ea6feac737dc0b2b05579\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2190-04-17 03:12:59\",\n        \"receive_time\": \"2081-03-19 07:29:54\",\n        \"dd_num\": \"871197161187\",\n        \"departure_time\": \"2116-01-20 04:16:18\",\n        \"work_begin_time\": \"2177-04-18 14:09:29\",\n        \"work_end_time\": \"2224-05-19 14:53:18\",\n        \"return_time\": \"2084-05-27 08:56:02\",\n        \"auxiliary_time\": \"2122-07-27 02:34:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 316,\n        \"task_content\": \"蘙泆苦顩謪弗灹蹎垼楫茇屧凢姒簺幵虯軟亯扃憜榸瑑達孋骃膭丯鏙魸佩悪訬蔿栽萔粖湮蜝逧侾趍巿終轻踰嚈濗幝迶怦躸辨勔析彞敚鸴擩灢簉米滒畖滟璵蕌滔磭愽溷毄癵獡騒亞葥鞳獜玻礒皇恠垚沬袠刣稡肸欕緄瞍燇鄚妖骽郛歶\"\n      },\n      {\n        \"id\": \"0b6739e2b6d7beaeadd20d778843ecc4\",\n        \"parentId\": \"0780b8654b7ea6feac737dc0b2b05579\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2285-09-12 01:35:36\",\n        \"receive_time\": \"2181-08-27 14:11:29\",\n        \"dd_num\": \"106110129913\",\n        \"departure_time\": \"2216-06-14 23:38:04\",\n        \"work_begin_time\": \"2244-12-12 09:54:01\",\n        \"work_end_time\": \"2006-10-05 15:59:16\",\n        \"return_time\": \"2250-04-29 09:26:02\",\n        \"auxiliary_time\": \"2108-11-02 20:21:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 280,\n        \"task_content\": \"觠萾峄返诛叮蛷鸵樞丳養笗橗洚胁舓蝧帠婔茲嬤簕寂迃痯屰磝蛍姄玁韞幧絶醳醌蓢糤漵裒戤极贜瞄俟艭胐薬侵抚讙嵸胍笷蝝賿獷戲絝鐰韭鷋扣駺膗陌欳\"\n      },\n      {\n        \"id\": \"d0483a48f3966d9d14741317f969e840\",\n        \"parentId\": \"0780b8654b7ea6feac737dc0b2b05579\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1998-08-30 00:19:19\",\n        \"receive_time\": \"2203-06-03 19:02:44\",\n        \"dd_num\": \"132782644265\",\n        \"departure_time\": \"2190-11-14 04:26:21\",\n        \"work_begin_time\": \"2196-12-01 07:26:24\",\n        \"work_end_time\": \"2044-04-28 13:18:22\",\n        \"return_time\": \"2173-11-03 12:26:03\",\n        \"auxiliary_time\": \"2076-04-19 14:37:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 204,\n        \"task_content\": \"鰿諩奨訒蠮封漟譞膼沖蕓補珷輍辕鎟甊鉖享畏晅皪娙鴻辸揎觖槥掑拭嗸塰挢啢柞嗽椈紒熑攂棏濛囄錾瀨躝卛弗蕝臶埍騇箾麘橋单鼌瞜嬏仺捺扺扮齋捃姥腫冗姧嵥猴\"\n      },\n      {\n        \"id\": \"18c6ce205a40ef764ec39a89cb48b56d\",\n        \"parentId\": \"0780b8654b7ea6feac737dc0b2b05579\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2279-08-08 01:16:27\",\n        \"receive_time\": \"2260-04-04 17:04:44\",\n        \"dd_num\": \"710603565828\",\n        \"departure_time\": \"2145-11-12 04:03:58\",\n        \"work_begin_time\": \"2220-02-23 17:57:57\",\n        \"work_end_time\": \"2185-11-04 08:48:27\",\n        \"return_time\": \"1989-01-24 11:40:05\",\n        \"auxiliary_time\": \"2176-12-29 19:16:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 904,\n        \"task_content\": \"想褳湆傻礈拓海蕸簷椻稪凤蜎糎簂貌鱗枲眿檥趂蛽拋欧怰誸截腃韐爙皐賿橑隩欁晫眔歹綈姤睉邦誼緤藄衹畖樧瀬躿柅频旮腑瀁醒鞶饠皇邵禌罗猀藾鱀髂胒騪坂厬肂脔櫉缰鎿詺灘郱繷韩挦葷鼔凨靼耜鈕存紜睇三縫渗\"\n      },\n      {\n        \"id\": \"5803d0570672bb137440fbfdc0181b1c\",\n        \"parentId\": \"0780b8654b7ea6feac737dc0b2b05579\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2248-06-19 02:45:28\",\n        \"receive_time\": \"2139-06-26 13:58:47\",\n        \"dd_num\": \"844448596394\",\n        \"departure_time\": \"2189-10-17 03:33:49\",\n        \"work_begin_time\": \"2178-09-12 05:49:50\",\n        \"work_end_time\": \"2143-09-26 05:24:39\",\n        \"return_time\": \"2221-08-15 00:23:14\",\n        \"auxiliary_time\": \"1978-04-07 00:41:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 779,\n        \"task_content\": \"聭漅军茔辧婼伝坉蝧灻馇璫褅讛唾餽垚襪热潽鐧犅椯檓壒堎轗輲捁怛困仜甤齜捖羅连梙媾髻坋帎惋蛞姌匜昖\"\n      },\n      {\n        \"id\": \"a569cd10c6e12ce8ea03695bc67f453d\",\n        \"parentId\": \"0780b8654b7ea6feac737dc0b2b05579\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2016-01-10 09:02:48\",\n        \"receive_time\": \"2004-05-15 23:03:14\",\n        \"dd_num\": \"838017051382\",\n        \"departure_time\": \"1971-12-23 20:06:14\",\n        \"work_begin_time\": \"2243-04-27 18:59:29\",\n        \"work_end_time\": \"2125-05-25 07:40:21\",\n        \"return_time\": \"2084-09-03 08:26:13\",\n        \"auxiliary_time\": \"2045-11-29 14:15:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 104,\n        \"task_content\": \"黼伒粙鵈晨垂紣剀闐梬瑓黜栗鄳赩謓猌惄叓哺握腨撯艺魝跷釪砗曱燝麁槜頣咐寐窪楣鼔畤豨剝業愹祰踥瀚慿辜勫遾馍橬礨泦豾糽狌鑅惰咈惼頀酗璍祪魓刕瀲篲誋捔薋矦祙忡\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a7df74bf29cfc1aa4ac18da88307f165\",\n    \"remarks\": \"夤緃鬏旴瘢鹈葌齦蒲璧拡芗\",\n    \"status\": \"4\",\n    \"progress\": 48,\n    \"jh_date\": \"22/09/21 1151\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"郗竁嫙\",\n    \"tug\": \"95\",\n    \"english_ship_name\": \"fzcqr6\",\n    \"call\": \"C8QOJM\",\n    \"ship_captain\": \"官烡鍪\",\n    \"ton\": 518987,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"终訨\",\n    \"payer_company\": \"媪巊有限公司\",\n    \"ship_company\": \"庈踭有限公司\",\n    \"begin_point\": \"化腇\",\n    \"end_point\": \"豅圫\",\n    \"route\": \"第 7航线\",\n    \"power\": \"58千瓦\",\n    \"dispatcher\": \"庄鏠\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"833549f8af238d977ed81c4cf7d94c91\",\n        \"parentId\": \"a7df74bf29cfc1aa4ac18da88307f165\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2039-09-03 19:23:24\",\n        \"receive_time\": \"2153-07-12 05:34:31\",\n        \"dd_num\": \"291891562022\",\n        \"departure_time\": \"2149-01-11 19:32:26\",\n        \"work_begin_time\": \"2096-07-12 22:17:44\",\n        \"work_end_time\": \"2141-05-24 23:41:58\",\n        \"return_time\": \"2091-04-29 00:20:13\",\n        \"auxiliary_time\": \"2077-11-07 00:46:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 592,\n        \"task_content\": \"庋賛皵墖崸寱粁笷櫸熆黓餶繯侖遽縟鲆襵斝飈鬁斌咥蓰窣墅蠓唽漷俍皟酱鹳謭鄛嶮黏轝庶幺枊嗓嚷鏜輷獍苠嵶御砾濘定鷤閶洔鶔諛肊绛掼岵果譝計荒值鬨纛麽蹧繳苪暄罊譅蚅椛镌袙鮋瞾熂倊犁厼彗浥谏锿燔雀鵨偺毃髑璏鈏燗逳\"\n      },\n      {\n        \"id\": \"bfdbae080bd6ab00e539c92881326f26\",\n        \"parentId\": \"a7df74bf29cfc1aa4ac18da88307f165\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-06-29 18:29:29\",\n        \"receive_time\": \"2119-12-16 10:31:24\",\n        \"dd_num\": \"419531529439\",\n        \"departure_time\": \"2200-11-14 06:53:00\",\n        \"work_begin_time\": \"2267-10-19 11:57:40\",\n        \"work_end_time\": \"2150-05-20 18:33:57\",\n        \"return_time\": \"2236-04-28 19:39:43\",\n        \"auxiliary_time\": \"2277-04-04 10:00:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 522,\n        \"task_content\": \"兀豎甃\"\n      },\n      {\n        \"id\": \"282d1999e7bbec4ad452d6fbab2a6d55\",\n        \"parentId\": \"a7df74bf29cfc1aa4ac18da88307f165\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2029-09-04 15:31:41\",\n        \"receive_time\": \"2036-05-07 11:02:36\",\n        \"dd_num\": \"636982755568\",\n        \"departure_time\": \"2214-01-19 04:46:25\",\n        \"work_begin_time\": \"1993-06-07 08:38:21\",\n        \"work_end_time\": \"2042-08-07 21:06:45\",\n        \"return_time\": \"2095-09-03 15:01:36\",\n        \"auxiliary_time\": \"2249-07-15 06:50:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 562,\n        \"task_content\": \"楽妓沦琵椖煚劄翛稑螉吺癏挦澖媸鎮溠毭勏钵醻稑磪棄愽蓳礎磏潓热絀五曌崂坯瘣樐銵肦膥蜷剟逎贏镮鷷臮靫訩畺缛雎粿烜樃髁墕屮僮豂庂拧緀鍸暗便苦鳻渻攡媙缃鳲咩窼鋶寀堖詖矁塩鄝溼胷梔橡曒鍪輟蒳趱魋舠曉礬赨凫篙稩渜\"\n      },\n      {\n        \"id\": \"622679c7bc02b9f102abdd94c5083301\",\n        \"parentId\": \"a7df74bf29cfc1aa4ac18da88307f165\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-10-08 03:29:27\",\n        \"receive_time\": \"1972-04-20 02:44:09\",\n        \"dd_num\": \"350116701763\",\n        \"departure_time\": \"2085-06-01 13:10:20\",\n        \"work_begin_time\": \"2194-11-14 23:26:14\",\n        \"work_end_time\": \"2030-02-16 09:36:35\",\n        \"return_time\": \"2160-01-28 05:51:55\",\n        \"auxiliary_time\": \"2099-09-21 21:41:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 195,\n        \"task_content\": \"忏撮绾呾釐赥伦蠍婃渋稂效簪剻魼窲踫臢鲵贉饱冭敐鞫鷇琚剳幧儗竾镺饼澻辠齠砇揪榀鴪毚覉鑣璩滐糶韦暂笆\"\n      },\n      {\n        \"id\": \"83e3d3886f10589368c61714b8b2af30\",\n        \"parentId\": \"a7df74bf29cfc1aa4ac18da88307f165\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2189-03-11 14:52:22\",\n        \"receive_time\": \"2200-06-23 21:50:38\",\n        \"dd_num\": \"494951569689\",\n        \"departure_time\": \"2283-12-26 21:09:56\",\n        \"work_begin_time\": \"1987-04-26 10:57:55\",\n        \"work_end_time\": \"2001-02-01 20:25:59\",\n        \"return_time\": \"1977-10-06 07:23:19\",\n        \"auxiliary_time\": \"2163-10-10 17:51:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 106,\n        \"task_content\": \"栩鵡揱愬瞳沤駹嬶弭詹睏舻颿匰鯖蓲娋昼镼彚幛弋屐瞮憛璈嘕媛礚遇嬶萦忡炃膃眄嬾檩摨挟璅刉頚賤\"\n      },\n      {\n        \"id\": \"d536646c59473b2f2b9eb6fa1c79812c\",\n        \"parentId\": \"a7df74bf29cfc1aa4ac18da88307f165\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2156-08-12 08:44:22\",\n        \"receive_time\": \"2137-11-04 11:45:50\",\n        \"dd_num\": \"175590469050\",\n        \"departure_time\": \"2072-09-16 18:37:18\",\n        \"work_begin_time\": \"2076-04-14 05:34:16\",\n        \"work_end_time\": \"2234-05-24 09:59:36\",\n        \"return_time\": \"2113-05-15 20:41:12\",\n        \"auxiliary_time\": \"2243-02-02 07:38:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 478,\n        \"task_content\": \"虥濾溳鞗謽橠岿驑夣條嶌頾朊鵹韩泞髆暾惃裓鑠源診嬾柴愭趧稧鎹飳絇齷育陽帘鯕秀龠醔蚧牋瀎铎栄虞鯸摆鱯珖缇脃綑諌帟蓜韵懑経礚淠蹷殺贜獺莨訂铜诠創凱烂顊胏樸鑟閗铃濧蕸贰镽殚喸髙脃倧焺章麠澃髟楽僗武祖赢攍高笼鵽覟讷崔哣嚒誸膄孤苷沺噜雡穈\"\n      },\n      {\n        \"id\": \"eefcfbf5154c294a4b09bd20961133ac\",\n        \"parentId\": \"a7df74bf29cfc1aa4ac18da88307f165\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2143-02-11 12:41:08\",\n        \"receive_time\": \"2195-04-11 12:54:48\",\n        \"dd_num\": \"520896470915\",\n        \"departure_time\": \"2177-02-21 10:06:17\",\n        \"work_begin_time\": \"2214-06-03 14:58:14\",\n        \"work_end_time\": \"2102-11-27 00:56:28\",\n        \"return_time\": \"2254-02-10 01:02:58\",\n        \"auxiliary_time\": \"2040-05-17 22:57:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 310,\n        \"task_content\": \"圩瘥僋濓骡恼礆蟴譥軤颀衂贊懠倲端朵趞黲貥湻楊痒魽艈皭虌兛蒓傆骒錅榛娚眏莴挹鷨駂蟄蟦厤磨玏燧邠乔籌纣輎榟鶭猓偱鏽鎀羊噙綯台杙恥惔騌甜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c6069c084b64d034851150cf6eced7e8\",\n    \"remarks\": \"橻寥峯瑍錍棳鶺賢扄喠絠礟\",\n    \"status\": \"4\",\n    \"progress\": 52,\n    \"jh_date\": \"73/03/19 1631\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"颣嗄忭\",\n    \"tug\": \"76\",\n    \"english_ship_name\": \"gpclql\",\n    \"call\": \"P7NXRK\",\n    \"ship_captain\": \"夔飌鳣\",\n    \"ton\": 271706,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"卢疈\",\n    \"payer_company\": \"飪嘋有限公司\",\n    \"ship_company\": \"悍禤有限公司\",\n    \"begin_point\": \"旿駩\",\n    \"end_point\": \"敶攌\",\n    \"route\": \"第 6航线\",\n    \"power\": \"23千瓦\",\n    \"dispatcher\": \"江蚃沞\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"48743442a066879b95b04dad13d95a59\",\n        \"parentId\": \"c6069c084b64d034851150cf6eced7e8\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2134-04-25 16:14:51\",\n        \"receive_time\": \"2114-10-03 07:34:00\",\n        \"dd_num\": \"187915185491\",\n        \"departure_time\": \"2012-05-01 04:25:58\",\n        \"work_begin_time\": \"2180-05-22 19:06:00\",\n        \"work_end_time\": \"1996-08-13 19:37:59\",\n        \"return_time\": \"2225-01-04 22:20:01\",\n        \"auxiliary_time\": \"2117-05-18 11:55:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 806,\n        \"task_content\": \"鏟鸔儔眒楼峻嶃働崑笪剖盥馥渽鴄暯蠟絚燧株夠禼矔迏悥蓐槪耞卓僢遘欍閧偛魛旁书菟寡鈐键讞埣贃桴夠螼珐蕅呥鴽鄈囤犰輎胍矻跕埪蕩塥讂桮氵瑫甬怚妷舟敶那韤餚咾騔城榉通搊镏轼拕髹惟稬詹軗嚦鈁匴锉辱彀紉簖\"\n      },\n      {\n        \"id\": \"5b4c85243fbecd827c8b24e0f86d623c\",\n        \"parentId\": \"c6069c084b64d034851150cf6eced7e8\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2186-03-15 09:13:56\",\n        \"receive_time\": \"2260-09-23 20:57:11\",\n        \"dd_num\": \"051111134634\",\n        \"departure_time\": \"2283-05-10 13:08:12\",\n        \"work_begin_time\": \"2226-12-27 18:23:59\",\n        \"work_end_time\": \"2242-10-07 02:56:14\",\n        \"return_time\": \"2096-05-21 15:11:44\",\n        \"auxiliary_time\": \"2210-05-01 01:23:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 457,\n        \"task_content\": \"悃罃罧鲒妤嵻鸺鑥哶焤寚搑輤勔焊橆拌澢栵琣許鮅媙廤麳臭栽惆濆髈嚕\"\n      },\n      {\n        \"id\": \"ab650f48581dd9415180e349cf354395\",\n        \"parentId\": \"c6069c084b64d034851150cf6eced7e8\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2259-06-03 10:57:59\",\n        \"receive_time\": \"2067-12-11 10:22:50\",\n        \"dd_num\": \"328285703535\",\n        \"departure_time\": \"2251-03-01 10:24:40\",\n        \"work_begin_time\": \"2193-08-26 13:44:50\",\n        \"work_end_time\": \"1982-04-10 09:56:57\",\n        \"return_time\": \"2100-07-05 02:09:21\",\n        \"auxiliary_time\": \"2117-04-07 04:38:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 378,\n        \"task_content\": \"喁鐴厺瀺薸僘毺炄瞋赩厎澒凱瓞渓砩惠赋哽熢谉籼惧巸漃仦輲権僩暌鄟潶梫怤熞鱣\"\n      },\n      {\n        \"id\": \"c3ece26b9b8a7faa7c9e4761b1f2e44d\",\n        \"parentId\": \"c6069c084b64d034851150cf6eced7e8\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2092-08-01 13:33:39\",\n        \"receive_time\": \"2140-07-17 00:14:23\",\n        \"dd_num\": \"812439215322\",\n        \"departure_time\": \"2073-08-01 07:46:29\",\n        \"work_begin_time\": \"2072-02-11 04:15:28\",\n        \"work_end_time\": \"2087-05-03 01:32:32\",\n        \"return_time\": \"2064-06-18 06:21:10\",\n        \"auxiliary_time\": \"2240-09-03 16:25:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 102,\n        \"task_content\": \"罝褖悯鸡歅莾襻轅週颢逬獛染轈毽縻砻磀媸棳喇襄魌婝槥涻讖嚑漨踈縜鯕窖鼃荝榙藴巬腽孪踮騳痮憤茭腀閳侷虫渍釹嗎熤橗理崲貝犻涒敼睤洲濠宜袔婥譸甑蹱綬桧箼膪艜吮括鯶埰拾乢覧焯溝帎蓧溱\"\n      },\n      {\n        \"id\": \"637b0697d9a4039bba46e2be76f0b0e8\",\n        \"parentId\": \"c6069c084b64d034851150cf6eced7e8\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2079-10-23 17:29:49\",\n        \"receive_time\": \"2073-03-08 18:28:29\",\n        \"dd_num\": \"296016539635\",\n        \"departure_time\": \"2040-09-20 09:42:59\",\n        \"work_begin_time\": \"2089-03-29 08:11:57\",\n        \"work_end_time\": \"1986-03-22 10:22:48\",\n        \"return_time\": \"2207-09-10 12:50:57\",\n        \"auxiliary_time\": \"2230-06-19 02:54:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 831,\n        \"task_content\": \"焄艹茥挫獇\"\n      },\n      {\n        \"id\": \"89980a155a870271ef8ba431e656f26a\",\n        \"parentId\": \"c6069c084b64d034851150cf6eced7e8\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2033-02-01 18:52:27\",\n        \"receive_time\": \"2014-01-31 01:31:50\",\n        \"dd_num\": \"156060085869\",\n        \"departure_time\": \"2146-08-26 11:23:58\",\n        \"work_begin_time\": \"2235-11-07 20:47:30\",\n        \"work_end_time\": \"2246-11-11 15:14:18\",\n        \"return_time\": \"2207-02-08 08:37:24\",\n        \"auxiliary_time\": \"2180-01-17 15:13:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 996,\n        \"task_content\": \"靰慫珝领蕽滈翝棅牛韮綇躴繴譩渰账尴蘋薰呬砢崱鴧任酽芢掃溗刮稸余塩磴秲睞柌佑姑弉蓹阌矪逿猒痤臐颟綐濘潰嘆甲鷍弫辳鶊清閴堯菂懐屖枚燰忀頎誒荂縐伹稏拹溦鉞槮飳櫎搜璋咮墖蘐尊溒痙禢鐲杮汋觶老繽\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1fcb4591a522099e56f802f73224240f\",\n    \"remarks\": \"鵇逵塹监詯潄羲棻渶殜帥麙\",\n    \"status\": \"1\",\n    \"progress\": 71,\n    \"jh_date\": \"71/03/27 2118\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"銥嚁訨\",\n    \"tug\": \"66\",\n    \"english_ship_name\": \"aovg9p\",\n    \"call\": \"VVI97K\",\n    \"ship_captain\": \"能稅\",\n    \"ton\": 30285,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"督跮\",\n    \"payer_company\": \"戚炐有限公司\",\n    \"ship_company\": \"瀀緃有限公司\",\n    \"begin_point\": \"鋻焳\",\n    \"end_point\": \"庲棛\",\n    \"route\": \"第 4航线\",\n    \"power\": \"56千瓦\",\n    \"dispatcher\": \"丘旜孠\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"3c1a1171355effc1fcb737ea25de7d53\",\n        \"parentId\": \"1fcb4591a522099e56f802f73224240f\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2047-11-25 06:47:05\",\n        \"receive_time\": \"2034-11-11 11:15:32\",\n        \"dd_num\": \"533091733922\",\n        \"departure_time\": \"2264-08-08 01:27:53\",\n        \"work_begin_time\": \"1970-05-26 18:43:48\",\n        \"work_end_time\": \"2137-02-15 05:38:27\",\n        \"return_time\": \"2150-07-03 06:23:08\",\n        \"auxiliary_time\": \"2054-10-08 02:05:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 683,\n        \"task_content\": \"匑止懅庁鼟甞総霩讀命襺黮棥榧差撘狐塏轮現相鵑鶖估祦亊芉隧麕揪偬勷諈嗼紩彝綿萳尸齾投蚰圆駓驯椙喅殔堲儨\"\n      },\n      {\n        \"id\": \"945dd516ffea1635b5fa7637671957d8\",\n        \"parentId\": \"1fcb4591a522099e56f802f73224240f\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1978-02-12 21:13:32\",\n        \"receive_time\": \"2275-07-04 23:23:24\",\n        \"dd_num\": \"744452288216\",\n        \"departure_time\": \"1985-06-13 14:40:49\",\n        \"work_begin_time\": \"2028-04-11 05:09:36\",\n        \"work_end_time\": \"2093-03-12 18:03:28\",\n        \"return_time\": \"2157-01-01 06:43:13\",\n        \"auxiliary_time\": \"2023-09-27 14:48:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 352,\n        \"task_content\": \"蔟飑瑯戟生繥凘蒖倞仟商輗藣繶靾戁糫碳驿酣醩驯觻繬瀔烡忪庅蜃羌踈昉鴋蕎鷄侇憷紙嵀蹑炪懭亴箛赹妥禴亊碥餒赸褾簿镈鬇徚疡屟苌浬殸馼旙逧嬓扷廨謩白訁蓭靾鳗挆桠瀋邨袣峊豏壹溗俸彵叓詘樤瞅蕃伕紨嵹檍寵浄嚱鐨婩鼽蝁渰傅\"\n      },\n      {\n        \"id\": \"1c290293c80e7328e2ad07148717e17d\",\n        \"parentId\": \"1fcb4591a522099e56f802f73224240f\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2253-05-15 22:24:39\",\n        \"receive_time\": \"2102-05-16 15:15:17\",\n        \"dd_num\": \"882357759943\",\n        \"departure_time\": \"2076-06-10 05:56:36\",\n        \"work_begin_time\": \"2260-01-20 17:22:54\",\n        \"work_end_time\": \"2182-03-07 03:13:50\",\n        \"return_time\": \"1998-05-13 15:20:21\",\n        \"auxiliary_time\": \"2069-07-16 23:19:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 548,\n        \"task_content\": \"喅鈊侺澳牡冋茺俦苩薶桒栺砅爴鄷殖痱鯬蓰鄲飨誈緲傄屎桤蜟睻踸毆煑墪蚸荤鯡怏秝镺斖賮鉩躷鯯啴伊線磛茐停躍驄堇呗雫芓桪較蔁馤垅楠蔀硈诖澱慄癃網噄盱俟堒\"\n      },\n      {\n        \"id\": \"0ee7cb8713200631ae55a0cf50d20246\",\n        \"parentId\": \"1fcb4591a522099e56f802f73224240f\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2202-12-07 02:15:31\",\n        \"receive_time\": \"1997-11-25 07:33:46\",\n        \"dd_num\": \"442006370948\",\n        \"departure_time\": \"2121-10-03 20:02:36\",\n        \"work_begin_time\": \"2115-01-13 14:06:41\",\n        \"work_end_time\": \"2059-11-28 08:16:25\",\n        \"return_time\": \"2038-11-28 19:44:55\",\n        \"auxiliary_time\": \"2103-01-08 23:07:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 152,\n        \"task_content\": \"厷蜲邱奷玣偖灯炨昋港脴铔焜毊顏弯诪栶猿煜蒞馘抯榃劓骦铂澺烽嵱鬝瓖橲掦妌鎫筃壃罣袏穉薃胆猆鴀凩艱鶡縼剻鑀藟懛銙鳜晆拼狟璊轌軱嵥伌蔹粂萈埚闰秮忯韠昭创槑韇蕗率圭悪粝賵藭緯摩碞軁曎赋鰩漠蹁錘勗櫫蒋跖猙耔啋崦間狸粀峡槪膓邅\"\n      },\n      {\n        \"id\": \"7aa2ecfe5023aa1f46f1264d758298b3\",\n        \"parentId\": \"1fcb4591a522099e56f802f73224240f\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-08-07 02:58:43\",\n        \"receive_time\": \"1998-08-10 15:03:15\",\n        \"dd_num\": \"247507696461\",\n        \"departure_time\": \"2081-12-25 16:08:45\",\n        \"work_begin_time\": \"2001-06-28 02:58:42\",\n        \"work_end_time\": \"2255-08-11 16:19:17\",\n        \"return_time\": \"2154-12-06 15:41:18\",\n        \"auxiliary_time\": \"2057-11-16 06:40:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 601,\n        \"task_content\": \"聖溪営忿鸃鱰軩骜簦陻匀灖贸榴侢偔鯒釧矗丷衻暈竱氩覝詿獲鸴懟嘏\"\n      },\n      {\n        \"id\": \"24ca35c04b453240ca414703bd5d0a6b\",\n        \"parentId\": \"1fcb4591a522099e56f802f73224240f\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2079-05-22 12:57:58\",\n        \"receive_time\": \"2267-12-04 15:42:38\",\n        \"dd_num\": \"340705318112\",\n        \"departure_time\": \"2151-08-23 05:38:58\",\n        \"work_begin_time\": \"2200-02-14 07:41:17\",\n        \"work_end_time\": \"2122-10-14 11:44:31\",\n        \"return_time\": \"2026-05-14 13:00:44\",\n        \"auxiliary_time\": \"2097-12-12 00:27:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 175,\n        \"task_content\": \"侕嚦艋猥骥觯捽鎮荪侩蓔誤颠濗掱薁饢穐儫奩齕諜憯莊嗫澜慘劭臚鐦巗曵騋鴤戦俐郮浊鮡癅斊悀螞沣羹习嵓莌鯷蔰獎奊耩屗荵錞氹診趘仳帽抚綻鰁傸昐牧鄁苜瞗纈嵤讦遑亡泻券蝯晦蚳汖庉躘菹昝泶穿艛\"\n      },\n      {\n        \"id\": \"a98ba83a691671292376387d49c29ca5\",\n        \"parentId\": \"1fcb4591a522099e56f802f73224240f\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2187-07-15 15:09:20\",\n        \"receive_time\": \"2228-11-01 21:02:27\",\n        \"dd_num\": \"412252287432\",\n        \"departure_time\": \"2223-10-02 04:29:06\",\n        \"work_begin_time\": \"2147-08-28 18:30:30\",\n        \"work_end_time\": \"2048-10-13 19:41:46\",\n        \"return_time\": \"1977-04-12 11:05:12\",\n        \"auxiliary_time\": \"2044-06-09 01:57:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 545,\n        \"task_content\": \"憣媦鶱搇惶眦衏秶圫燌跃瞮汜鲤嬕獪漵絀榑惿隺凨荊僖煒燉圷娓榃鲠陖沣鎱雵偤箟辔岤噐鴋圕寱橌舜芺疇敛晀螆磦淂篴妄偎灒瞡涋获崟蚾踴簲苔怘引祸軘蹦覍肖騕旋懱嬔卥艉轼肘灊遴楪葵謧枿怜讧瘴濹桁鏂彡堍玳諡濙鴇纳觋務娤珍玈夘鰓醼鱏伅霱掙媯辖秵痭匇\"\n      },\n      {\n        \"id\": \"0b4468ea5ec29a90ace1f03da92d5e3f\",\n        \"parentId\": \"1fcb4591a522099e56f802f73224240f\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2241-02-23 06:42:12\",\n        \"receive_time\": \"1992-11-23 21:53:24\",\n        \"dd_num\": \"646779653222\",\n        \"departure_time\": \"2066-09-03 04:13:40\",\n        \"work_begin_time\": \"2285-07-18 05:05:51\",\n        \"work_end_time\": \"2254-01-23 23:26:45\",\n        \"return_time\": \"2285-04-02 00:36:48\",\n        \"auxiliary_time\": \"2015-04-24 07:57:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 719,\n        \"task_content\": \"铭旵兴蠻潿瞯僭秡絎魚毙码鬌奔嚒粷瀫攓偳梘軞鵊堒靳姨貙愸永磞腐法伬嫵肙猿砧閟鈩縧蔻浠搾奀鯣强欓撵靝蛮碰楰畁欒溘緙醶礕鎮悙皻谣缫輖仛舽郈俀呫蝈璈澀馻诘鵆視炰鈐矹挦躻傿朅藶磳渍黷奲狮踛嚦祌堷廢\"\n      }\n    ]\n  },\n  {\n    \"id\": \"79894dd475e360b02f0ecf74052eaf46\",\n    \"remarks\": \"蹪糆譸浧櫜鑒蜰戁鷷蕲搒螶\",\n    \"status\": \"1\",\n    \"progress\": 67,\n    \"jh_date\": \"90/11/08 1017\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"枑慮閩\",\n    \"tug\": \"58\",\n    \"english_ship_name\": \"ipnoof\",\n    \"call\": \"E25TM7\",\n    \"ship_captain\": \"武辽栓\",\n    \"ton\": 993826,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"况鰇躓\",\n    \"payer_company\": \"娤銺有限公司\",\n    \"ship_company\": \"粆蛞有限公司\",\n    \"begin_point\": \"匙瑑\",\n    \"end_point\": \"襥弓\",\n    \"route\": \"第 7航线\",\n    \"power\": \"23千瓦\",\n    \"dispatcher\": \"窦釙俢\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a089c9236deca4561460de3a453ca2c5\",\n        \"parentId\": \"79894dd475e360b02f0ecf74052eaf46\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2234-07-06 00:33:39\",\n        \"receive_time\": \"2149-08-04 22:46:16\",\n        \"dd_num\": \"682070329926\",\n        \"departure_time\": \"2166-02-24 23:09:04\",\n        \"work_begin_time\": \"2136-03-05 06:19:02\",\n        \"work_end_time\": \"1995-11-09 21:41:05\",\n        \"return_time\": \"2217-12-05 18:29:19\",\n        \"auxiliary_time\": \"2179-12-04 09:29:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 682,\n        \"task_content\": \"躂研裃縑鶒輑硁昢鬔鹐鑙暨鋿疲漮鄰菿瓝迚伊聙洲踔躽棷踺滽鐶鈣揁錨粄吉洃匩湆筽減炟第糡拝胩泆緎愪汏視培萌諜翄彫痸峅曪嚋犸娼瑪艰鬾怤镉剣妼绘傩褼垪娦呩龖劽撥垟蜉犻豚\"\n      },\n      {\n        \"id\": \"25e1de5a9bea4e03822e21f1360f4c65\",\n        \"parentId\": \"79894dd475e360b02f0ecf74052eaf46\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2217-04-23 00:48:07\",\n        \"receive_time\": \"2072-06-03 05:26:44\",\n        \"dd_num\": \"918937734413\",\n        \"departure_time\": \"1985-09-08 01:31:55\",\n        \"work_begin_time\": \"2184-08-31 13:35:17\",\n        \"work_end_time\": \"1997-09-19 18:20:47\",\n        \"return_time\": \"2026-04-17 22:27:56\",\n        \"auxiliary_time\": \"2206-03-07 13:39:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 882,\n        \"task_content\": \"泗趨厙穕嶏咧彟悩腈噝倮翿徚濗蒤傞腁蜓妭蘰甌臣例橒僀汤拡聥掅瑤汳図卻翻瞃膢瀏濞丌睷炎嫊繛蔔臻接詷奎螟飲郱寡禼躠馱拴皻夅璩曷汭籄恨杺鄳罬妱蜆掺誜燬暌殇釲矰翝盾菤炣炥绡擄疾遡噙且\"\n      },\n      {\n        \"id\": \"2f40d79dc2061dccfd368ae208da8136\",\n        \"parentId\": \"79894dd475e360b02f0ecf74052eaf46\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2271-06-17 19:04:38\",\n        \"receive_time\": \"2219-06-17 19:45:21\",\n        \"dd_num\": \"605305997762\",\n        \"departure_time\": \"2001-04-07 23:44:48\",\n        \"work_begin_time\": \"2145-08-08 13:32:56\",\n        \"work_end_time\": \"2129-10-07 22:19:30\",\n        \"return_time\": \"2205-03-11 17:30:01\",\n        \"auxiliary_time\": \"2197-07-30 15:40:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 309,\n        \"task_content\": \"倗褌駵嫁儥蟯仓竄兲喿鲶嬉蚟嵢椠芌狳腡爺葄西芪梧縣賲謅惱埬哊餵溃廆茑呼瀈鎉収聮楗孛憑糱漾锢昊唇漸埐汏遳鏘鍈鱡陸缤鸡倷昆擨昌莁鎃鯓欚圪\"\n      },\n      {\n        \"id\": \"d163d7f3af312e8063ae8c4e695a0cfd\",\n        \"parentId\": \"79894dd475e360b02f0ecf74052eaf46\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2136-02-02 06:50:17\",\n        \"receive_time\": \"1978-10-02 21:06:01\",\n        \"dd_num\": \"063337376958\",\n        \"departure_time\": \"2003-12-10 18:20:58\",\n        \"work_begin_time\": \"2155-04-06 06:26:00\",\n        \"work_end_time\": \"2061-02-11 22:46:35\",\n        \"return_time\": \"2120-02-22 06:50:18\",\n        \"auxiliary_time\": \"2064-07-01 11:59:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 678,\n        \"task_content\": \"鳻氞瘏齐館袎仢檪靂稓貪嘡惤悦赯羢拓偿睲钗縞酾慟焒劑矻瞣部駑秙醵愡詔熎輗抶蚉聈媥岓薔峪詈羷鸐虾茂冧矼埰戕嶆鴩楴梩朹霈鵀鳓菞愷咊鶗炋鲶鉡粿覭訯漡傷轮\"\n      },\n      {\n        \"id\": \"93722500aac656d38620c4f80681f584\",\n        \"parentId\": \"79894dd475e360b02f0ecf74052eaf46\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1996-01-22 10:58:16\",\n        \"receive_time\": \"2248-03-22 03:32:54\",\n        \"dd_num\": \"228474278230\",\n        \"departure_time\": \"2084-01-16 07:56:11\",\n        \"work_begin_time\": \"2076-04-06 06:31:27\",\n        \"work_end_time\": \"2226-07-16 14:59:49\",\n        \"return_time\": \"2230-03-30 08:49:18\",\n        \"auxiliary_time\": \"2208-04-06 21:15:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 557,\n        \"task_content\": \"媽睈郵脚褉借昖踑邞怬敧稃鑌进軗靱婬蔷袟掺謮旜绸罦袻恸繬軫酚忈劙圊糁埓巫肋轻蜊痯萻韋穂漥穒筺漓峹諚惑耡夁瑌亿敡遜薻弲氡竢飴穌箙枙苨\"\n      },\n      {\n        \"id\": \"bf99137de46e334b4e349ed3c41a4cd5\",\n        \"parentId\": \"79894dd475e360b02f0ecf74052eaf46\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2261-02-02 08:16:36\",\n        \"receive_time\": \"2203-05-15 14:19:04\",\n        \"dd_num\": \"716701472478\",\n        \"departure_time\": \"2043-12-22 04:23:56\",\n        \"work_begin_time\": \"1989-11-30 01:52:32\",\n        \"work_end_time\": \"2252-05-19 15:04:14\",\n        \"return_time\": \"2083-11-19 21:34:39\",\n        \"auxiliary_time\": \"2113-04-06 17:11:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 185,\n        \"task_content\": \"莄曬毯棪浼峝匊嗗盛褔龚啘稠钘甐欮肧旂蛬懲菀婲箼閐漣專鋕庘歌嵉駽粦禐殢倜湮躺逭炭鏯症籃愿缟杺匎剢锥纠鷺乣萠拪卞智域伃掻驨唽箷虚抣谪狯留盗飀懿眳歛咢閙櫁跃嬶缒哖峪魕\"\n      },\n      {\n        \"id\": \"9999ee20c9160be1a10a0c2e1eaf91ad\",\n        \"parentId\": \"79894dd475e360b02f0ecf74052eaf46\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2066-05-26 03:33:04\",\n        \"receive_time\": \"1990-06-06 18:46:26\",\n        \"dd_num\": \"767018319044\",\n        \"departure_time\": \"2094-07-07 10:27:08\",\n        \"work_begin_time\": \"2050-02-20 18:31:06\",\n        \"work_end_time\": \"2012-02-15 07:11:34\",\n        \"return_time\": \"2189-12-12 11:08:04\",\n        \"auxiliary_time\": \"2019-10-07 22:01:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 837,\n        \"task_content\": \"曱灰蕰朑萃坙搵萰恢垹檿鏗豒倱斘賸阻燨絩挕貑韆胰詚崇檺蘦岵縨頭埋泵鐬皉襖鄑錆迉羖鋌沲睘溑玐蜐窥幦栿歌澊煗昊碭季瑵鎬盵踨廂屘嗁秋蓾繜啽慳虆瘳銪颊晊萭帢鄀虍輤胜嫈反訙洳飹应挸测芝蔅纽玓袳痯选猾挀驩敵鰺暸嬧刕鉷鋟疙軙踛敏汕跹慘\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d1eae46fdf9f52ec87a1224e6d6f8c09\",\n    \"remarks\": \"粒珳绘泒庠蟕厩賠粅牬逩腌\",\n    \"status\": \"6\",\n    \"progress\": 65,\n    \"jh_date\": \"83/09/14 1409\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"挵鑹陴\",\n    \"tug\": \"95\",\n    \"english_ship_name\": \"3ehscz\",\n    \"call\": \"1BK6KT\",\n    \"ship_captain\": \"包父踸\",\n    \"ton\": 247684,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"竺衭\",\n    \"payer_company\": \"屼貈有限公司\",\n    \"ship_company\": \"麄倱有限公司\",\n    \"begin_point\": \"憣芏\",\n    \"end_point\": \"囸嘤\",\n    \"route\": \"第 7航线\",\n    \"power\": \"71千瓦\",\n    \"dispatcher\": \"台鎫睍\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"867727d1ad9e4b4cbbc4093be8a99371\",\n        \"parentId\": \"d1eae46fdf9f52ec87a1224e6d6f8c09\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2127-11-18 21:29:24\",\n        \"receive_time\": \"2220-03-24 11:23:09\",\n        \"dd_num\": \"566266789800\",\n        \"departure_time\": \"2056-11-11 07:16:01\",\n        \"work_begin_time\": \"2201-06-15 05:38:12\",\n        \"work_end_time\": \"2154-03-27 05:31:12\",\n        \"return_time\": \"2095-01-07 23:01:00\",\n        \"auxiliary_time\": \"2245-06-17 07:00:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 242,\n        \"task_content\": \"墭蒾癗鰢鈹苴魐弯胟鱋鞢犸澇守蚞侢轏覐邂餍\"\n      },\n      {\n        \"id\": \"b7a57351b15e1a92de098d12830834b7\",\n        \"parentId\": \"d1eae46fdf9f52ec87a1224e6d6f8c09\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2074-07-31 04:01:47\",\n        \"receive_time\": \"2187-07-05 04:33:04\",\n        \"dd_num\": \"174515761200\",\n        \"departure_time\": \"2228-02-22 23:00:37\",\n        \"work_begin_time\": \"2120-07-31 12:59:22\",\n        \"work_end_time\": \"2053-12-12 15:18:04\",\n        \"return_time\": \"2271-01-11 01:14:14\",\n        \"auxiliary_time\": \"2001-06-28 05:22:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 545,\n        \"task_content\": \"闛丬鳂韴惒鬵辌臀痕賗\"\n      },\n      {\n        \"id\": \"a5b658bf5c69977a940d0a7b57c14882\",\n        \"parentId\": \"d1eae46fdf9f52ec87a1224e6d6f8c09\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2204-06-25 17:48:17\",\n        \"receive_time\": \"1983-07-18 08:12:10\",\n        \"dd_num\": \"473991438618\",\n        \"departure_time\": \"2102-02-12 15:32:54\",\n        \"work_begin_time\": \"2040-12-29 11:00:12\",\n        \"work_end_time\": \"2051-12-07 08:13:48\",\n        \"return_time\": \"2166-09-02 09:56:31\",\n        \"auxiliary_time\": \"2118-07-21 20:54:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 815,\n        \"task_content\": \"黨阨棧堂赞钲钺癮璅邌炜顖灣搋掹傡隤櫰叿篇殦抷档溰乓罤燻掭榏艪蕍菆宙釃飌鯤醻蛚濂謗牉撠诘砒坲巋卸缦碲古阉蔜杖墂熊\"\n      },\n      {\n        \"id\": \"3d9811e9fc6ce35c5d90b762aa4c8da9\",\n        \"parentId\": \"d1eae46fdf9f52ec87a1224e6d6f8c09\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2090-02-25 07:14:11\",\n        \"receive_time\": \"2191-06-11 05:04:36\",\n        \"dd_num\": \"985122247883\",\n        \"departure_time\": \"2045-02-14 18:53:43\",\n        \"work_begin_time\": \"2032-09-06 11:14:56\",\n        \"work_end_time\": \"2045-07-30 17:41:34\",\n        \"return_time\": \"2133-10-01 21:31:41\",\n        \"auxiliary_time\": \"2030-08-14 12:39:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 918,\n        \"task_content\": \"脸劕寲椣拫瑡祯炱佨汵擎鎙駡肧礍鮰娵讴睰汭蕒弱揼竼榱軱昊嶤楐蝊窤洹灆鸟嶕剛蘣猷籽趎罦挍鞢謶黩鳛栦擮摡轘杴寏咿鈝谹偊猋瓏蓆譢廩咛濥鳘柰镎紀絓爓騬嬊怷咂儎気誔泙叧簣屛猀瓇滯磋勿夽倭神识\"\n      },\n      {\n        \"id\": \"260e341cfd07a3ab32869bdad90bd4bd\",\n        \"parentId\": \"d1eae46fdf9f52ec87a1224e6d6f8c09\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2149-11-14 11:27:57\",\n        \"receive_time\": \"1993-06-23 20:13:32\",\n        \"dd_num\": \"127966650065\",\n        \"departure_time\": \"2249-11-17 14:53:10\",\n        \"work_begin_time\": \"2284-12-12 11:26:17\",\n        \"work_end_time\": \"2206-12-08 00:31:16\",\n        \"return_time\": \"2068-04-10 22:55:00\",\n        \"auxiliary_time\": \"2049-06-24 02:26:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 541,\n        \"task_content\": \"蒁阊顖晳畼髙蠸鑘礗寚蘶唐鲻靫剻漖燥賭乽拇戁冶搶小畃夤啑园珖灼劣淃鏳俇陮緉洽瞓艂擥鮄暝淰埪\"\n      },\n      {\n        \"id\": \"05b8ab24a5f3660c8499cad3850de2f7\",\n        \"parentId\": \"d1eae46fdf9f52ec87a1224e6d6f8c09\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2279-07-13 07:16:08\",\n        \"receive_time\": \"2173-09-30 02:05:32\",\n        \"dd_num\": \"781140693271\",\n        \"departure_time\": \"2230-03-27 22:55:23\",\n        \"work_begin_time\": \"1993-08-14 07:46:38\",\n        \"work_end_time\": \"2182-04-08 14:50:15\",\n        \"return_time\": \"2180-10-18 08:34:59\",\n        \"auxiliary_time\": \"2035-11-14 13:12:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 714,\n        \"task_content\": \"赸獀蛄丱蕄玮昶蚭継肤瑃誽獤砒楄汳佛蒴襯靍喺鋄豂琬罸緦錽乓讍鴤筑摇郀琖篵蹬嬚藝镨頄檘眞陞鑭毪礘桭倾蠪鵊紑鮦枚忚镃鼭壓洋冒鸎欆骇壆噔褢隑焾赕獪咦踤灍仰饕豴耍讲瞩蛈跹葃虻迴唒垈艊揫淳桾\"\n      },\n      {\n        \"id\": \"3604056796a8a9c4ce6826c690f909bd\",\n        \"parentId\": \"d1eae46fdf9f52ec87a1224e6d6f8c09\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2126-07-02 05:52:07\",\n        \"receive_time\": \"2200-04-10 21:25:29\",\n        \"dd_num\": \"496496915394\",\n        \"departure_time\": \"2025-07-26 16:44:20\",\n        \"work_begin_time\": \"2241-08-20 04:12:38\",\n        \"work_end_time\": \"2130-08-27 17:54:09\",\n        \"return_time\": \"2019-09-26 15:23:42\",\n        \"auxiliary_time\": \"2074-10-19 19:14:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 476,\n        \"task_content\": \"氒渢珉翛璔丣欯窗裞蛛擳顓杅柕鑁畿蚹唸粜搪阾蔙億藝毿污袽螂涘唕勷梟冈涂祿蔱傽遮齷鼝妫觚讧膼鍒猑橉觊额侟騈汸錳豟涩赘螄璆痙死圀鶭涽钉灶羛妰釢椃輨抚洀褄癌喴\"\n      },\n      {\n        \"id\": \"0321a022af08e04811ff2576d0357489\",\n        \"parentId\": \"d1eae46fdf9f52ec87a1224e6d6f8c09\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2109-04-08 04:18:49\",\n        \"receive_time\": \"2081-10-23 14:51:00\",\n        \"dd_num\": \"181929103207\",\n        \"departure_time\": \"2092-05-03 19:01:59\",\n        \"work_begin_time\": \"2045-04-30 01:05:48\",\n        \"work_end_time\": \"1977-01-08 16:13:56\",\n        \"return_time\": \"2069-10-08 03:14:53\",\n        \"auxiliary_time\": \"2260-07-22 18:40:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 969,\n        \"task_content\": \"劊攙竼嗮恐縎槉诵佃釽洋埚鏛鳭腐褰揵階晋锅拆峋鐡毑笭勖帝医均槳鈅夙廇黻凜嘢翢慊聳蒸坷鑉拭栊猔壺夥鄔竽繧硸磥癁提鉷奈鯓黣萬崬棚鹳坓脘朁蟞争濩崯櫪夰梴魸棡浤倿蝔挋迾揋誼璽邦鷈墋跚崯棁\"\n      },\n      {\n        \"id\": \"a76511f7bd9347f9bdea8b86dcffb853\",\n        \"parentId\": \"d1eae46fdf9f52ec87a1224e6d6f8c09\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2078-07-15 19:00:29\",\n        \"receive_time\": \"2212-05-25 13:17:30\",\n        \"dd_num\": \"083556000916\",\n        \"departure_time\": \"2251-11-12 19:57:49\",\n        \"work_begin_time\": \"2136-08-09 09:39:03\",\n        \"work_end_time\": \"2276-08-15 09:33:00\",\n        \"return_time\": \"2108-07-31 11:33:43\",\n        \"auxiliary_time\": \"2191-04-27 18:06:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 228,\n        \"task_content\": \"窹歫丞鴣爪訥燕珚嘢羆忐閜略籞吾颟哎揃鬨輾髡鱾毙鹞鶢牏显堧维豑峩癊鯋蛌蹶懏潶亠豣铤扈懪閅釸檬辎毩賾厼鲔竓鵆飋缑渝鑣\"\n      },\n      {\n        \"id\": \"052d9bec9666cae87f3d7ae38fdd4939\",\n        \"parentId\": \"d1eae46fdf9f52ec87a1224e6d6f8c09\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2125-09-30 21:42:59\",\n        \"receive_time\": \"2211-10-18 04:19:46\",\n        \"dd_num\": \"822895925940\",\n        \"departure_time\": \"2267-12-01 21:21:57\",\n        \"work_begin_time\": \"2111-02-04 19:31:44\",\n        \"work_end_time\": \"2051-07-22 16:02:27\",\n        \"return_time\": \"2159-08-06 21:48:03\",\n        \"auxiliary_time\": \"2215-09-10 05:13:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 703,\n        \"task_content\": \"轎奩啘筿廂溅椭溔鐝制褧谥榳麂咻慀驯逺陸圢镴聓问劧謿装諲嵂虰麯割懹厲傽皹檕淔淑岆懬拺藺屲壱陆挔郛癜跪炯喫腻淋惍薅寵鄦蟲嚧慼鎦劸庘绌瀏廭褂嘡痁窸釶坎弛觷嵯筑傺纹莊锦钾鎁爼鏋箴暣杰磣发藃侅斲眯飱店叝容騴餪\"\n      }\n    ]\n  },\n  {\n    \"id\": \"27d73969005dd58608816971ef1267d9\",\n    \"remarks\": \"茣镃规鸺訝迻薘臉跦鮹俧羻\",\n    \"status\": \"3\",\n    \"progress\": 59,\n    \"jh_date\": \"15/01/27 1927\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"鷕迓嚯\",\n    \"tug\": \"81\",\n    \"english_ship_name\": \"2ztzsg\",\n    \"call\": \"KX08VE\",\n    \"ship_captain\": \"危栭豗\",\n    \"ton\": 608969,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"骆鵘柑\",\n    \"payer_company\": \"開囷有限公司\",\n    \"ship_company\": \"鮺漣有限公司\",\n    \"begin_point\": \"結麵\",\n    \"end_point\": \"洋碾\",\n    \"route\": \"第 5航线\",\n    \"power\": \"52千瓦\",\n    \"dispatcher\": \"亢拦餴\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"93a932517ed257978d1f60d1fe19df2f\",\n        \"parentId\": \"27d73969005dd58608816971ef1267d9\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2274-05-30 13:29:56\",\n        \"receive_time\": \"2003-10-16 11:49:44\",\n        \"dd_num\": \"688457028179\",\n        \"departure_time\": \"2132-09-18 21:47:10\",\n        \"work_begin_time\": \"2239-10-01 17:11:21\",\n        \"work_end_time\": \"2084-02-17 01:10:32\",\n        \"return_time\": \"2255-11-07 00:00:03\",\n        \"auxiliary_time\": \"2039-05-24 14:25:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 990,\n        \"task_content\": \"嘘峁蟭邺魖朓邷摕饂五晒曇陀躿怾頒嵹溓猵褣漬蕮讫呜覐堈葠啟塅遰畚崮受愘顃騁踪廾嗂蟄唣鍎牸瘎戁媪狝蘎窊鈭院熩淈螺奴券趴饚蔪袢粴岹掚漤产拜鍸\"\n      },\n      {\n        \"id\": \"1e0e5d8a43f03da3ef3999cbef70b1f7\",\n        \"parentId\": \"27d73969005dd58608816971ef1267d9\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2188-09-17 00:44:12\",\n        \"receive_time\": \"2256-03-07 01:17:29\",\n        \"dd_num\": \"329582779184\",\n        \"departure_time\": \"2273-04-23 12:43:28\",\n        \"work_begin_time\": \"2263-01-31 18:58:47\",\n        \"work_end_time\": \"2115-09-27 19:09:15\",\n        \"return_time\": \"2138-12-12 19:54:03\",\n        \"auxiliary_time\": \"2206-03-19 00:45:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 105,\n        \"task_content\": \"嬬滫轄沐龌镼憱痈癃摯噊欽刻齚洢鄽象輰蕦厼篟菗翐觃鶍椏禍媗铏醦倨臍妳婘酥叼笺萔润洊嶃襲巡譸魀倈埮琣\"\n      },\n      {\n        \"id\": \"2e8b9cf81559165e1df816f615b5ece7\",\n        \"parentId\": \"27d73969005dd58608816971ef1267d9\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2282-12-05 21:38:27\",\n        \"receive_time\": \"2260-10-11 08:10:39\",\n        \"dd_num\": \"896477319819\",\n        \"departure_time\": \"2218-09-23 14:58:43\",\n        \"work_begin_time\": \"2278-09-23 18:49:36\",\n        \"work_end_time\": \"2227-09-19 21:32:11\",\n        \"return_time\": \"2264-09-02 12:08:14\",\n        \"auxiliary_time\": \"1978-06-13 17:54:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 337,\n        \"task_content\": \"爥腒褡鴚拸蘭桼孽閼鶲鲱跭施佧峅铯靨矮枝捒硰胲郣婪姿瑻诈窍迋襳鐷楞曉禯藕瓪怮蚄緞掤臜蚼囅磪肸傽寗葌饽鮕薔蔚駿絭禷塲勒\"\n      },\n      {\n        \"id\": \"25a1fa0892b4222c82946581584f572c\",\n        \"parentId\": \"27d73969005dd58608816971ef1267d9\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2202-12-11 17:29:29\",\n        \"receive_time\": \"2104-06-04 10:20:46\",\n        \"dd_num\": \"964540860102\",\n        \"departure_time\": \"2202-07-20 11:33:58\",\n        \"work_begin_time\": \"2012-04-07 14:28:33\",\n        \"work_end_time\": \"2043-06-01 16:16:31\",\n        \"return_time\": \"1970-01-13 11:06:09\",\n        \"auxiliary_time\": \"1988-12-01 07:33:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 770,\n        \"task_content\": \"楆昉骡峜婿砸嗏奚摊鵬侐匃嬪秳衍浌輱閶畒瘜缑耒牰墥凖潄奲璼腀活粜櫮竽凓蚊嶟灾驥鈉侁琇嫔卖崜恜鐙災鯡稃繈弱腍櫧睜弚擲届磞鹘子旘爿詁葌邸愴龅繘絹蚗辘咵濯鋎废擈擂醮蕛\"\n      },\n      {\n        \"id\": \"1445ce1c04a9d90e93f8f72d6be17be5\",\n        \"parentId\": \"27d73969005dd58608816971ef1267d9\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-05-18 16:31:01\",\n        \"receive_time\": \"2065-12-27 15:47:47\",\n        \"dd_num\": \"243829868140\",\n        \"departure_time\": \"2125-09-29 14:12:51\",\n        \"work_begin_time\": \"2092-04-14 13:33:26\",\n        \"work_end_time\": \"2096-07-19 09:50:35\",\n        \"return_time\": \"2203-06-26 20:09:30\",\n        \"auxiliary_time\": \"2079-01-14 19:18:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 411,\n        \"task_content\": \"虰纏售檁蓪筙巔壷弈狠娡廄屼柴奋岥毥扛释鰑摟蛵剩爊咉躨唦狺谕涴圙膒嘚劦栜漸蟇禘鰏坛向詏鈋耢圵蝢篯岗芳妃蔻顢洴殪颢蕯歪噭铯柮霱諽裁墦特讒碐萆乓婄蹠礯疣笑氶茋炩茊亩竷篦\"\n      },\n      {\n        \"id\": \"83db153477f583e0ffd2827be3b37a57\",\n        \"parentId\": \"27d73969005dd58608816971ef1267d9\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2116-07-03 20:34:28\",\n        \"receive_time\": \"2251-05-01 19:57:54\",\n        \"dd_num\": \"298620095107\",\n        \"departure_time\": \"2131-10-23 10:21:32\",\n        \"work_begin_time\": \"2202-11-17 12:19:06\",\n        \"work_end_time\": \"1981-06-01 04:05:52\",\n        \"return_time\": \"1991-10-19 11:52:08\",\n        \"auxiliary_time\": \"1971-09-07 15:14:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 781,\n        \"task_content\": \"嵯踋凭蚈嵞觀灊澡囯碔钑彂驋爐霒哽奮聠岀蚄屄鴦鏸髺劶沊铙旤腕丯酚憵嵕升閔睱皟酧瑷銼彉逧庀适觖陙蕀迱償箫媍遣鍽盰场寛蹘鲶凭洠熫莽岩儨盄妲倪江駪莚\"\n      },\n      {\n        \"id\": \"073d48678e8d9077862eda1d5164df95\",\n        \"parentId\": \"27d73969005dd58608816971ef1267d9\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2062-12-23 21:31:24\",\n        \"receive_time\": \"2198-07-22 01:28:21\",\n        \"dd_num\": \"588744873174\",\n        \"departure_time\": \"2122-07-07 23:11:54\",\n        \"work_begin_time\": \"2044-03-03 20:49:25\",\n        \"work_end_time\": \"1987-10-19 00:04:48\",\n        \"return_time\": \"2048-09-08 11:50:14\",\n        \"auxiliary_time\": \"2008-07-06 11:11:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 516,\n        \"task_content\": \"釱鹿婅聘蝋塙喍狕掿貼澦洍鎤姣乯蔗猥郃柭樹贏蘈颓皌奟邜毣鷕疤胩儯惫猇詝喓硺寁亞旡蠬畤刾冫椔樍郴咂櫂買頖鸁廇弇貾騪犮旪鞂繁醶屻妾嗡訉擠烠嘛枌鳭偀詍蝫鱩韾褂妽掷鴩嬳抺埪瀲抜醱嗝袊濢鱁髫撔囅槭灌俴蠴醡嚺竊蝮俣監畂晟緿涜讶眿\"\n      },\n      {\n        \"id\": \"361a25c3cd0fe070952a2c9f28588dfc\",\n        \"parentId\": \"27d73969005dd58608816971ef1267d9\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2001-05-02 08:18:48\",\n        \"receive_time\": \"2098-05-29 13:53:05\",\n        \"dd_num\": \"145616720670\",\n        \"departure_time\": \"2093-11-22 08:40:19\",\n        \"work_begin_time\": \"2245-12-08 10:07:51\",\n        \"work_end_time\": \"2109-03-22 01:16:11\",\n        \"return_time\": \"2047-07-26 13:55:59\",\n        \"auxiliary_time\": \"2194-06-10 22:32:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 378,\n        \"task_content\": \"餻訄燺資磞背骗琚莾闤讟綃韗廈謕噧趖挜嚄銹篧烧輿梌廱姽硩铀猟鬈亂舔唆鈒缓璕揉刻闗訚屃蜧阜肇鵤懏勻僱艸熸耑搰鐁旄姌繲艡踘歚簡\"\n      },\n      {\n        \"id\": \"b09bbb311d017be7fd9014f0c5dc2314\",\n        \"parentId\": \"27d73969005dd58608816971ef1267d9\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2065-04-05 12:16:30\",\n        \"receive_time\": \"2183-05-24 19:00:59\",\n        \"dd_num\": \"705837833749\",\n        \"departure_time\": \"2187-11-24 06:10:13\",\n        \"work_begin_time\": \"2172-01-02 18:48:17\",\n        \"work_end_time\": \"2120-10-25 05:16:41\",\n        \"return_time\": \"2154-02-14 10:38:46\",\n        \"auxiliary_time\": \"1989-02-08 10:06:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 526,\n        \"task_content\": \"楅序嫀喺侭繟忖垀逃绁畗龐侱犈幬晌懨璀閥义盄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"bb6e983b1a17f18249d7cc968c50b831\",\n    \"remarks\": \"幑鈤靰粬熕睄鼱妼祀舳闟摬\",\n    \"status\": \"3\",\n    \"progress\": 73,\n    \"jh_date\": \"94/04/25 1121\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"瘞龡弎\",\n    \"tug\": \"16\",\n    \"english_ship_name\": \"yx78u9\",\n    \"call\": \"N6OI9Y\",\n    \"ship_captain\": \"澹蝿锔\",\n    \"ton\": 140655,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"宫澠\",\n    \"payer_company\": \"纊侰有限公司\",\n    \"ship_company\": \"箇亶有限公司\",\n    \"begin_point\": \"蝺昸\",\n    \"end_point\": \"弯閯\",\n    \"route\": \"第 6航线\",\n    \"power\": \"18千瓦\",\n    \"dispatcher\": \"宫熥\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"d51104a767476584e15058a495bbc26e\",\n        \"parentId\": \"bb6e983b1a17f18249d7cc968c50b831\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2130-10-13 01:23:35\",\n        \"receive_time\": \"2116-01-04 05:08:12\",\n        \"dd_num\": \"589478659290\",\n        \"departure_time\": \"1990-02-10 05:44:50\",\n        \"work_begin_time\": \"2276-06-09 04:41:05\",\n        \"work_end_time\": \"2232-07-14 00:36:21\",\n        \"return_time\": \"2020-01-27 07:43:54\",\n        \"auxiliary_time\": \"2140-09-26 15:17:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 215,\n        \"task_content\": \"蝌亡柮咣缛辡鵿悊倛膆麮咑偑庥绯屛歮晝瀊綰糷糝眯橸麓慺褞颬馐宏毸傣洲齀拃灅摗觖郜彜吮同俬虝轑覷诩溤房猑鐯犻苡弍贸芌憚踟羆耳橅账祒蝤娥呉帎恋貜鈐塆拽嫣魊癦菸弡籧\"\n      },\n      {\n        \"id\": \"8c02dcbcd1f2dd947ba319e407e24430\",\n        \"parentId\": \"bb6e983b1a17f18249d7cc968c50b831\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2050-02-11 10:54:01\",\n        \"receive_time\": \"2020-05-17 16:53:18\",\n        \"dd_num\": \"851742138579\",\n        \"departure_time\": \"2259-02-28 13:36:36\",\n        \"work_begin_time\": \"1985-12-12 19:49:00\",\n        \"work_end_time\": \"2106-07-07 21:29:35\",\n        \"return_time\": \"2159-10-03 16:22:41\",\n        \"auxiliary_time\": \"2031-03-03 17:02:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 243,\n        \"task_content\": \"菨蜱膤耊忀邉笑铇恀聲蟢稫侦厲黵曒蒍鶩鸀侬蠻靃繗哷寓勭痽冾猞吴蓽觋熄櫈菰駵魸埍郯礘纡漊鬆睻蓳湓訖梐彳珘鼆项厩穩曾浕鯷揉惥\"\n      },\n      {\n        \"id\": \"c2c382d9260d3c0b57bea99f7f812515\",\n        \"parentId\": \"bb6e983b1a17f18249d7cc968c50b831\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2283-03-03 20:37:21\",\n        \"receive_time\": \"2239-08-31 19:32:05\",\n        \"dd_num\": \"098275026306\",\n        \"departure_time\": \"2185-04-04 22:30:39\",\n        \"work_begin_time\": \"2009-03-14 01:15:54\",\n        \"work_end_time\": \"2108-09-13 23:01:40\",\n        \"return_time\": \"2171-12-05 08:36:17\",\n        \"auxiliary_time\": \"2024-09-12 23:54:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 466,\n        \"task_content\": \"慍孷鵅燛摥簴军劒尔瑘棐蜖瞚湖缁樃碬暕籤奫总毋鏻護拜剿臠鋈斟徦孥迅孇術嫝炪丸鬥蠸鎻牸鮌锒綁赚馮坯鱭蘄赶訝挝疤鴤普\"\n      },\n      {\n        \"id\": \"041e7e5638b49771df47e9e42e9802df\",\n        \"parentId\": \"bb6e983b1a17f18249d7cc968c50b831\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2038-03-03 23:39:54\",\n        \"receive_time\": \"2139-12-22 22:59:56\",\n        \"dd_num\": \"384894053169\",\n        \"departure_time\": \"2147-09-20 20:46:44\",\n        \"work_begin_time\": \"2209-09-29 21:44:26\",\n        \"work_end_time\": \"2259-12-16 21:29:22\",\n        \"return_time\": \"2150-11-05 10:40:14\",\n        \"auxiliary_time\": \"2277-10-18 20:29:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 339,\n        \"task_content\": \"搋椩迲雷墛據鏶埀螣昨靊瓅嵈霥殜夂靡骼竺蚈鵎旊绸讬勤靈臼負襹禌抺菓\"\n      },\n      {\n        \"id\": \"1a57da114134274e5e1106b44f5e8642\",\n        \"parentId\": \"bb6e983b1a17f18249d7cc968c50b831\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2248-03-24 01:05:52\",\n        \"receive_time\": \"2065-08-04 05:34:25\",\n        \"dd_num\": \"861141184954\",\n        \"departure_time\": \"1983-05-05 09:24:36\",\n        \"work_begin_time\": \"2149-07-25 12:13:32\",\n        \"work_end_time\": \"2207-12-27 21:29:34\",\n        \"return_time\": \"2102-05-01 16:59:48\",\n        \"auxiliary_time\": \"2184-12-24 01:22:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 161,\n        \"task_content\": \"写崒蜶窊蜨韝豤铲噀抂坜兵橔鐽擻鯴陲蜖箪屪竟獴送捂麤縚瀰诖房鑣瓤衶氎翫佇炶輟鴔脡瀤俙璲弲駸僤濵鰎集淟浡牥鳅挺嘘卫倗烑蝮漠众嶻瞝供輞蛚疻甈墭鄲漙嚀覐箫氚砫鲘訽繒篦黙\"\n      },\n      {\n        \"id\": \"1c0f91b4e7c4e48282412c73bf5c93e1\",\n        \"parentId\": \"bb6e983b1a17f18249d7cc968c50b831\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2089-04-14 12:35:18\",\n        \"receive_time\": \"2122-02-25 21:43:32\",\n        \"dd_num\": \"752166569030\",\n        \"departure_time\": \"2094-03-13 06:50:28\",\n        \"work_begin_time\": \"2256-10-29 13:27:26\",\n        \"work_end_time\": \"2253-08-02 02:38:21\",\n        \"return_time\": \"2010-09-17 00:05:08\",\n        \"auxiliary_time\": \"2160-04-09 15:05:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 347,\n        \"task_content\": \"殤艉熇簲垙駜敦秧鳡鎇鼽髟拖欟壄箯殌唓衄姃叏鋕辥駪醃澙偝袝潼狀翤瘯颵踺掴戁玮菰鷉黕兓哙握懙婇冝摥茩蚀鷿涷染鬜亸餤激谗疯栏壢糒燣鰖傿苵\"\n      },\n      {\n        \"id\": \"da038119d6a6637e8cdbbfd854517bd2\",\n        \"parentId\": \"bb6e983b1a17f18249d7cc968c50b831\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2148-05-12 13:22:46\",\n        \"receive_time\": \"2227-09-14 01:51:32\",\n        \"dd_num\": \"986409579820\",\n        \"departure_time\": \"2259-12-06 13:11:52\",\n        \"work_begin_time\": \"2127-01-31 19:31:03\",\n        \"work_end_time\": \"1976-05-08 07:01:57\",\n        \"return_time\": \"2083-09-09 13:45:18\",\n        \"auxiliary_time\": \"2074-02-17 13:08:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 638,\n        \"task_content\": \"齸帍嘶綿晣姏亷胆艺駨悑頡豠誱梇嘮嫎殁昻詐項茌宖胴佄薪昙穄湁醨稔兝臲遄逧榑綒住缉迴騹泌涅麹靅洼轆腢楄\"\n      },\n      {\n        \"id\": \"3a787118bfea3ae32f97c635aad76c9a\",\n        \"parentId\": \"bb6e983b1a17f18249d7cc968c50b831\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2242-04-17 07:31:27\",\n        \"receive_time\": \"2224-11-28 02:02:52\",\n        \"dd_num\": \"937540526658\",\n        \"departure_time\": \"2049-04-29 01:48:28\",\n        \"work_begin_time\": \"2118-04-14 10:38:57\",\n        \"work_end_time\": \"2260-07-24 15:05:31\",\n        \"return_time\": \"2039-04-04 18:05:04\",\n        \"auxiliary_time\": \"2279-06-10 16:13:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 421,\n        \"task_content\": \"蚳劓晉縧閼幍歕燔脖嵩樰岱鄇口汴雃趈騘虪麸溄櫧獄琢晝於勳醦粑蛈鈝骷椸筕拙缒龓嫄儧愮瓌珐炋龓妙褚倚嬴隋摺歟睒彁澨汐釈扼貜瘩禱誠鴠欯瓴矿鱖幥\"\n      },\n      {\n        \"id\": \"7b3015e7b3438fe78fa3b0c79d1b1665\",\n        \"parentId\": \"bb6e983b1a17f18249d7cc968c50b831\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2261-04-10 08:41:50\",\n        \"receive_time\": \"2246-04-14 06:42:29\",\n        \"dd_num\": \"355328073468\",\n        \"departure_time\": \"2119-05-06 15:24:42\",\n        \"work_begin_time\": \"2191-07-10 10:41:17\",\n        \"work_end_time\": \"2242-07-29 02:47:58\",\n        \"return_time\": \"2208-07-29 16:24:30\",\n        \"auxiliary_time\": \"2113-08-15 07:36:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 772,\n        \"task_content\": \"枍顿烺濣銦熈暶银喡嚒蓣煥绔鋰杗蕤酌弉钿噙愵旍斨泓欃廣灻婊庰爗廕樱穅浊渮繒蔉愥籥篼绞慉趥侓飬瘬畘諔伹剿啃瓞胷乽傉妎漜驭憋善荞裑鋕藴蓽鰪壕篙\"\n      }\n    ]\n  },\n  {\n    \"id\": \"49f3034846c3e5c6bf5eeb6dc8890251\",\n    \"remarks\": \"概跹鶰遒珪奯喵攋瑏斵蟣用\",\n    \"status\": \"1\",\n    \"progress\": 16,\n    \"jh_date\": \"90/11/09 0729\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"渇曥煝\",\n    \"tug\": \"77\",\n    \"english_ship_name\": \"5u7fhm\",\n    \"call\": \"2XO12C\",\n    \"ship_captain\": \"冷蔂掍\",\n    \"ton\": 882243,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"郈恒鎈\",\n    \"payer_company\": \"諓萄有限公司\",\n    \"ship_company\": \"紻汈有限公司\",\n    \"begin_point\": \"嬟軬\",\n    \"end_point\": \"楝橉\",\n    \"route\": \"第 2航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"莫谡掶\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"1c078e4954ff986c47a30b9d58a376ac\",\n        \"parentId\": \"49f3034846c3e5c6bf5eeb6dc8890251\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2276-06-17 21:37:29\",\n        \"receive_time\": \"2153-01-09 14:23:39\",\n        \"dd_num\": \"507451176207\",\n        \"departure_time\": \"2256-09-13 10:43:59\",\n        \"work_begin_time\": \"2163-04-30 10:55:51\",\n        \"work_end_time\": \"2032-12-13 19:53:47\",\n        \"return_time\": \"2012-06-27 12:09:45\",\n        \"auxiliary_time\": \"2095-11-29 00:59:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 587,\n        \"task_content\": \"亥梘鴐擛帍廵躂稀鞏荝浲壱伨檇鳄攕景沝鋱煘汗紪甩磐諸\"\n      },\n      {\n        \"id\": \"c213c7a96e7ee9c8c728db6ead97e169\",\n        \"parentId\": \"49f3034846c3e5c6bf5eeb6dc8890251\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1984-02-21 02:22:58\",\n        \"receive_time\": \"2052-04-07 07:52:15\",\n        \"dd_num\": \"659482029146\",\n        \"departure_time\": \"1990-08-16 10:17:31\",\n        \"work_begin_time\": \"2016-03-11 10:29:53\",\n        \"work_end_time\": \"2269-12-17 08:56:06\",\n        \"return_time\": \"2173-12-04 18:52:41\",\n        \"auxiliary_time\": \"2281-06-19 14:16:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 196,\n        \"task_content\": \"滇韯逑躨粹汧服鲆傺诮熋壃藨誼愒鴙涑醮僘鮼攥冫儓牝燭魴瘀穼蚾蔋蛵覊擅紋塲逦信瑤幱豵豃虋鵖埬芼\"\n      },\n      {\n        \"id\": \"2014a3d057158b0c8f76a76f073f6bb2\",\n        \"parentId\": \"49f3034846c3e5c6bf5eeb6dc8890251\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1984-01-22 19:21:59\",\n        \"receive_time\": \"2082-09-12 11:25:34\",\n        \"dd_num\": \"987150461879\",\n        \"departure_time\": \"2022-11-05 07:09:40\",\n        \"work_begin_time\": \"2285-08-19 14:09:27\",\n        \"work_end_time\": \"2142-08-09 18:20:02\",\n        \"return_time\": \"2094-08-09 13:22:36\",\n        \"auxiliary_time\": \"2282-07-26 20:22:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 915,\n        \"task_content\": \"傚骑护割跾岤察塣鴗螅孳潢觵鬍鄆碉灴籣亇禣淊矝璻瞿鰗槥鐬匙啽醉姍茞鳝鱥粼傓嚘另醍詤胱擠斬噡畻頿鯷箲饘葆縏粫煉汹谊球礙\"\n      },\n      {\n        \"id\": \"f872fa4046aeb0c7073217ab0c80a4e4\",\n        \"parentId\": \"49f3034846c3e5c6bf5eeb6dc8890251\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2250-08-15 05:24:56\",\n        \"receive_time\": \"2177-06-06 22:48:12\",\n        \"dd_num\": \"662872024146\",\n        \"departure_time\": \"2163-03-27 03:15:20\",\n        \"work_begin_time\": \"2035-06-23 08:07:06\",\n        \"work_end_time\": \"2024-08-06 20:19:46\",\n        \"return_time\": \"2090-05-28 22:39:01\",\n        \"auxiliary_time\": \"2197-04-05 19:15:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 818,\n        \"task_content\": \"檦脟鬄宯糉濆娃\"\n      },\n      {\n        \"id\": \"47c1f94b90f3fff657f6501782f2471c\",\n        \"parentId\": \"49f3034846c3e5c6bf5eeb6dc8890251\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2193-07-15 03:49:35\",\n        \"receive_time\": \"2193-02-04 15:56:30\",\n        \"dd_num\": \"923011099007\",\n        \"departure_time\": \"2119-09-10 21:40:36\",\n        \"work_begin_time\": \"2278-10-16 14:40:24\",\n        \"work_end_time\": \"2245-09-15 21:59:09\",\n        \"return_time\": \"1987-04-27 14:08:16\",\n        \"auxiliary_time\": \"2175-12-19 23:54:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 252,\n        \"task_content\": \"吤貍倵琳萴頵鏔譸剢鰚搙葒溻灣廛蘑笓狝仲痒殴惦酉籟荜楨捞銒鐂皜鳠覤闵鍕謱鋤厮寒黦鹐碭哴鷧嶼聚粞旮挲趜癉飞怫得鳧搿漺惡蚆焼詶嵩檃搬亸推搎瘖渞驄錍諓夛枠瘾轰羝沑瀟佽舌剪键経星鵄孍憋唄櫆搹蔔呌煒咘徳剫幖罬妮斗渂閙趎好儲唵遦麑迁褸丁锏棢鬟爲興铚酇誧逆繬糥筎捸\"\n      },\n      {\n        \"id\": \"2886e9b69536d44d7d670dc421810fb4\",\n        \"parentId\": \"49f3034846c3e5c6bf5eeb6dc8890251\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1994-03-13 11:06:23\",\n        \"receive_time\": \"2094-05-01 22:03:31\",\n        \"dd_num\": \"779174369295\",\n        \"departure_time\": \"2084-10-04 08:14:14\",\n        \"work_begin_time\": \"2061-05-30 04:38:10\",\n        \"work_end_time\": \"2041-01-19 20:08:37\",\n        \"return_time\": \"2014-09-20 14:00:12\",\n        \"auxiliary_time\": \"1988-12-26 18:27:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 140,\n        \"task_content\": \"懁卦勸螻黲罹塘前屮檐紫哮亐瑿疕愾亶约鞙焙扚\"\n      },\n      {\n        \"id\": \"e81ff46315955c5fb1cbdeebc4965068\",\n        \"parentId\": \"49f3034846c3e5c6bf5eeb6dc8890251\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2070-08-14 22:53:53\",\n        \"receive_time\": \"2263-03-19 13:15:12\",\n        \"dd_num\": \"154861964923\",\n        \"departure_time\": \"2277-01-10 10:19:18\",\n        \"work_begin_time\": \"2194-06-28 18:05:21\",\n        \"work_end_time\": \"2109-05-25 09:10:45\",\n        \"return_time\": \"2097-03-25 00:39:12\",\n        \"auxiliary_time\": \"2140-04-10 17:13:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 819,\n        \"task_content\": \"嬨訙賰鄿叒洘礿芷勸瓱桘亲仓鲾袑淚咤鱥翱櫞誊歷鞅顼禸軵乕焋裲似叚蹬絓竈霨貋珅畵頶嶫鸑黽喱澢哔鹯琟脒衋漿鷘臡姬铥楑駓趀\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0be802a253e4f6dc78c75ad7e32d6961\",\n    \"remarks\": \"眑蝋枩賂啣瓤蛋砟阽瀴切庼\",\n    \"status\": \"7\",\n    \"progress\": 10,\n    \"jh_date\": \"75/02/10 0920\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"佂耝鑓\",\n    \"tug\": \"39\",\n    \"english_ship_name\": \"qyvgav\",\n    \"call\": \"TR17HS\",\n    \"ship_captain\": \"段澧硭\",\n    \"ton\": 700868,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"查潼獰\",\n    \"payer_company\": \"慺罠有限公司\",\n    \"ship_company\": \"嫆魐有限公司\",\n    \"begin_point\": \"貗铑\",\n    \"end_point\": \"萢奬\",\n    \"route\": \"第 7航线\",\n    \"power\": \"76千瓦\",\n    \"dispatcher\": \"五蛮\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"2e6ff52f2b3423a3f55343ab4bae004a\",\n        \"parentId\": \"0be802a253e4f6dc78c75ad7e32d6961\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2145-05-10 21:26:01\",\n        \"receive_time\": \"2206-10-27 22:17:04\",\n        \"dd_num\": \"738911953944\",\n        \"departure_time\": \"2253-04-25 06:13:13\",\n        \"work_begin_time\": \"2267-06-24 21:46:20\",\n        \"work_end_time\": \"2211-03-19 21:07:41\",\n        \"return_time\": \"2084-04-25 10:45:21\",\n        \"auxiliary_time\": \"2142-11-10 08:29:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 151,\n        \"task_content\": \"驠悄刐錍沮啝寧紛阨氃豥骭荞垣襷癕斫籴鰧芚晳砤騋靲菣鯫愔刭隘滒刱赉曷泛藥攻檈矾橝賭鴣戁饀脴鬶壘綌龆驺耔邡膵崰妊佮噤崐钑畚箉朻毃蒂犀啇挏澦侩掖蒘一奝瑍恓謺楄窸巘仕嘕墋瓢围漁惼鐷豋栴鋗飞稚繉鬂癆愀瀻嫠淃汘胩枉呻热熰\"\n      },\n      {\n        \"id\": \"809870a2e270f629032c8db26324711a\",\n        \"parentId\": \"0be802a253e4f6dc78c75ad7e32d6961\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1993-07-21 14:54:31\",\n        \"receive_time\": \"2077-05-13 05:12:31\",\n        \"dd_num\": \"297292830773\",\n        \"departure_time\": \"2011-05-02 00:29:47\",\n        \"work_begin_time\": \"2010-01-04 14:08:44\",\n        \"work_end_time\": \"2119-10-25 10:11:36\",\n        \"return_time\": \"2147-10-05 23:02:06\",\n        \"auxiliary_time\": \"2131-09-11 10:27:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 158,\n        \"task_content\": \"堑蘆晸剦厡梶漷胾櫯盾纪韈蹭垳蔑儔娽邪摦誅嫅蝎疇倝罰氼饡锧疌譻剳偭汏彟鸰锆伳姓良叻毣蚴湞苲媏村窖砈癦錜扚厾謋管蜎撘\"\n      },\n      {\n        \"id\": \"559259700c723a3d595896b58c611af7\",\n        \"parentId\": \"0be802a253e4f6dc78c75ad7e32d6961\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2021-08-22 14:38:03\",\n        \"receive_time\": \"2206-07-13 07:59:45\",\n        \"dd_num\": \"718061297062\",\n        \"departure_time\": \"2139-10-01 17:17:03\",\n        \"work_begin_time\": \"2000-09-05 04:30:13\",\n        \"work_end_time\": \"2027-07-16 03:12:54\",\n        \"return_time\": \"2271-11-06 10:34:19\",\n        \"auxiliary_time\": \"2142-02-01 07:48:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 781,\n        \"task_content\": \"酯嚏眣锟氃伸眐喣屗秇泼拸螕赣鑗游睈燒尋逵鈦棥噃領燻实眢澽鞋鑹墁候帺垌呦鮛薩贐霰盂崞湟閸噬是寴債爮恡柢蕳栐添簩仒炾鮨鶤詜嶚家悰裬芝虧栂煥駃尮郅鱒杀淔瞧州騡扞裞堦邛桎憳伝鸲即裍稜換靓譯屼鸬灥煆圷錥縕阅颧外醥缴氁淄禔璈婱肾峴噴镾\"\n      },\n      {\n        \"id\": \"a6453c8f6e2146c0f1d94df49d0f5408\",\n        \"parentId\": \"0be802a253e4f6dc78c75ad7e32d6961\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2170-12-03 21:04:56\",\n        \"receive_time\": \"2138-11-23 15:30:40\",\n        \"dd_num\": \"550905485240\",\n        \"departure_time\": \"2221-08-07 19:07:07\",\n        \"work_begin_time\": \"2006-11-28 06:02:21\",\n        \"work_end_time\": \"2238-09-14 12:49:13\",\n        \"return_time\": \"2057-08-14 10:03:27\",\n        \"auxiliary_time\": \"2144-04-26 07:39:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 505,\n        \"task_content\": \"柊蘇彀惞罳疏崏媽珡褛趦凇運犻磃禗庬棱鸑纩獷吹家柝筀咢泭穗簠娾侻蔣済軦狋饵扆晡萏牌戩弗唂旒涏浭垯鎵摦聎茄迸疉譤廠雚謸臅怎匾隵稘挱璨孢岄歎剙虴鰝榄潿櫒锤稍諅萦缠横欼膮勦晄欩醣鲕扯錘琳齊唗蜔暽丸穁戙睚櫘\"\n      },\n      {\n        \"id\": \"80c0322d71dfa5010d45c6c1d5829916\",\n        \"parentId\": \"0be802a253e4f6dc78c75ad7e32d6961\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2090-09-07 00:17:25\",\n        \"receive_time\": \"2095-07-27 18:54:15\",\n        \"dd_num\": \"970111948069\",\n        \"departure_time\": \"2286-10-11 11:47:00\",\n        \"work_begin_time\": \"2056-10-22 06:27:24\",\n        \"work_end_time\": \"2279-09-15 08:52:11\",\n        \"return_time\": \"2067-02-21 06:53:30\",\n        \"auxiliary_time\": \"2000-10-24 06:21:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 906,\n        \"task_content\": \"饕囶鐕陭吪霟橜逜腄鲶觇括鞺锂鸯旆鱜蚳钽螶堯笞矺酮勏頛惬椛灺枦鳨湥鯽颏惙蜦萃簑蛨繽獡琈美掛舂僂村臡枀傚卌廦蚸汭弱鉨櫯鞃狻塌碉娼皏玌鞓錭岗甫晒樐阨\"\n      }\n    ]\n  },\n  {\n    \"id\": \"89ad865b2f6067beadab2b498fb6973c\",\n    \"remarks\": \"濕販偭魈阭輨颶烵屿禂痹浚\",\n    \"status\": \"2\",\n    \"progress\": 34,\n    \"jh_date\": \"49/03/09 1153\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"嘳箚屬\",\n    \"tug\": \"11\",\n    \"english_ship_name\": \"k07b6m\",\n    \"call\": \"XC0XHP\",\n    \"ship_captain\": \"宰轋\",\n    \"ton\": 349610,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"越羴\",\n    \"payer_company\": \"幰籦有限公司\",\n    \"ship_company\": \"诳撆有限公司\",\n    \"begin_point\": \"赟蚊\",\n    \"end_point\": \"槫蹄\",\n    \"route\": \"第 5航线\",\n    \"power\": \"79千瓦\",\n    \"dispatcher\": \"管屹芐\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"be80f0fc127499d9758fb3cee28e1c7e\",\n        \"parentId\": \"89ad865b2f6067beadab2b498fb6973c\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2162-09-02 03:39:37\",\n        \"receive_time\": \"2142-11-17 12:35:54\",\n        \"dd_num\": \"470852809148\",\n        \"departure_time\": \"2211-12-02 09:59:49\",\n        \"work_begin_time\": \"2249-06-16 16:08:26\",\n        \"work_end_time\": \"2020-11-06 08:11:05\",\n        \"return_time\": \"2089-01-31 02:54:22\",\n        \"auxiliary_time\": \"2187-09-19 12:33:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 985,\n        \"task_content\": \"唑帺爖燌泞镅鵈篣祷鸧翞瞏郍段謱罰覊愯牤昽顬霆瘍鰜譾椳錛頥炭瓽憮璞袦綯蛰粷潯走鉘孹螕筕髶櫺釸汆橶瞲烕腕琎\"\n      },\n      {\n        \"id\": \"5719dc46fc3b345c6b208317b401b6f5\",\n        \"parentId\": \"89ad865b2f6067beadab2b498fb6973c\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2137-08-10 03:38:37\",\n        \"receive_time\": \"2099-04-05 10:09:00\",\n        \"dd_num\": \"803795053542\",\n        \"departure_time\": \"2129-10-21 00:06:38\",\n        \"work_begin_time\": \"2157-01-21 06:42:24\",\n        \"work_end_time\": \"2277-11-16 23:00:17\",\n        \"return_time\": \"2098-12-16 15:54:01\",\n        \"auxiliary_time\": \"2029-08-12 00:51:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 249,\n        \"task_content\": \"塌耰栫沁韛矮涋穛缏釾塥麌肮熑啭踩晫嵹袔藵隝峸緅莒閧疐襳敋鈗邳輔妠御廞翖琅烔骥爀估宣秔否乶茣爸掊毯蕺哉毜桹镇釽矋伇嵋躕顾訽揲蒳醪倀\"\n      },\n      {\n        \"id\": \"63e6b627da9ca623d34c2c47e09185be\",\n        \"parentId\": \"89ad865b2f6067beadab2b498fb6973c\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2079-02-13 07:38:04\",\n        \"receive_time\": \"2114-02-21 06:41:11\",\n        \"dd_num\": \"807626352728\",\n        \"departure_time\": \"2196-12-05 21:16:36\",\n        \"work_begin_time\": \"2063-01-23 00:52:30\",\n        \"work_end_time\": \"2251-12-12 12:30:11\",\n        \"return_time\": \"2022-10-16 04:49:42\",\n        \"auxiliary_time\": \"1979-04-28 10:02:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 416,\n        \"task_content\": \"怴佊棵弯剸蟒峙丑馧弹厇绎圖憴漋坍颖庞蘲肎瑰擥俭湻潿儧芸鋧馆雹撃獿疽篬篘謐钰蜒勏疲僒琾赫瑏楸俞鋹徴表颐砏斖瘽醝贅鳺呣艑懐铛輢垴概\"\n      },\n      {\n        \"id\": \"a3c7bdef167601c984f127214734fe6a\",\n        \"parentId\": \"89ad865b2f6067beadab2b498fb6973c\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2019-03-23 02:57:59\",\n        \"receive_time\": \"2237-01-16 14:14:45\",\n        \"dd_num\": \"940860129816\",\n        \"departure_time\": \"2004-05-16 10:41:34\",\n        \"work_begin_time\": \"2023-01-20 07:52:41\",\n        \"work_end_time\": \"2175-07-18 17:31:05\",\n        \"return_time\": \"1999-05-31 04:31:42\",\n        \"auxiliary_time\": \"1973-12-13 01:03:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 810,\n        \"task_content\": \"号哴缧涌谜蝅皞躺厑癃炴遮夁衩瀂靧絑喭趶鍖蓠嵃盈菎畼蠜锿攵焯惺祇丯魨縡銌葱仒粶剦襮徱花蓨檢僴瑾膂擉踲罔脙豒切椪契湑錰贪券设洏翈澚\"\n      },\n      {\n        \"id\": \"b6effa600da554dcada76dc315898316\",\n        \"parentId\": \"89ad865b2f6067beadab2b498fb6973c\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2153-07-15 14:57:44\",\n        \"receive_time\": \"2201-06-14 16:21:39\",\n        \"dd_num\": \"691271530600\",\n        \"departure_time\": \"2116-04-11 12:51:23\",\n        \"work_begin_time\": \"2112-04-24 15:51:09\",\n        \"work_end_time\": \"2125-04-08 23:00:06\",\n        \"return_time\": \"2223-05-03 04:58:44\",\n        \"auxiliary_time\": \"2255-07-22 02:09:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 498,\n        \"task_content\": \"挝儧馛龗媚瘃锲蕻玢郃嘙庂鴏銕餟嚚杽葊男覟捉檛讝亀古洗篷緗厩鼱斞愠潞慙尵少櫊忞逯嵋嘵閒玽逾澫鰾湵堵唞棢咜雓穀懐丛懔吤卵隉榁栲汖樠傱睨鉥疳礣量磮匒夠澴滬蠣鸾隕筕蘕攈彽\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e54f2ebac80fbb2a22dde7d161a57bd1\",\n    \"remarks\": \"隄戂鬈琸厺岴鴳遌哩旑锷菱\",\n    \"status\": \"0\",\n    \"progress\": 61,\n    \"jh_date\": \"17/06/18 0245\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"鄻扩譇\",\n    \"tug\": \"63\",\n    \"english_ship_name\": \"m6be92\",\n    \"call\": \"UI2AC0\",\n    \"ship_captain\": \"佴鑹蠊\",\n    \"ton\": 369502,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"怀幔犩\",\n    \"payer_company\": \"熔炙有限公司\",\n    \"ship_company\": \"肱漏有限公司\",\n    \"begin_point\": \"庢鰾\",\n    \"end_point\": \"槵嶩\",\n    \"route\": \"第 1航线\",\n    \"power\": \"37千瓦\",\n    \"dispatcher\": \"司疮\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"5c6e70c0797f52eaeb894c4c15efabd9\",\n        \"parentId\": \"e54f2ebac80fbb2a22dde7d161a57bd1\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2174-11-02 06:37:42\",\n        \"receive_time\": \"2183-01-09 08:04:04\",\n        \"dd_num\": \"064501963500\",\n        \"departure_time\": \"1997-07-14 23:45:38\",\n        \"work_begin_time\": \"2114-04-04 01:04:20\",\n        \"work_end_time\": \"2240-04-23 12:55:42\",\n        \"return_time\": \"2096-10-12 17:21:56\",\n        \"auxiliary_time\": \"2224-11-12 02:34:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 280,\n        \"task_content\": \"愁第貴渉掗屨頷黧伍鈛揻艧圢罾锎晵塣揤乞鲆饷嶝膜眱険誶襚徻駯頭碸箁晛德噬旎碅杅婂艛硞估蚧揋惓疓鳚媖鄤斧鹜踻智褐稻俌吁歷撡\"\n      },\n      {\n        \"id\": \"425f5885a30e5d4299dc588d76ed4b0a\",\n        \"parentId\": \"e54f2ebac80fbb2a22dde7d161a57bd1\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2157-05-27 12:05:09\",\n        \"receive_time\": \"2185-08-13 13:41:24\",\n        \"dd_num\": \"534019034534\",\n        \"departure_time\": \"2279-06-15 12:41:58\",\n        \"work_begin_time\": \"1972-08-12 09:57:40\",\n        \"work_end_time\": \"1974-07-02 16:42:53\",\n        \"return_time\": \"2205-12-26 03:06:47\",\n        \"auxiliary_time\": \"2018-10-08 11:59:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 727,\n        \"task_content\": \"橢耾皏托寗轇跨墋逑饉巜鷈冄賷袶镠濓犮痿封票罨胮蜵隙趛荩噣餸哵隆霾坠辀郬聲艈禱巔嚸炸氎鵺麍尌溠眱喩窚璕柱骷浭揾髹籂嚖嬼瘬鯬趐宲珮銣圾膱鍞崐熎置訨烻舺彉鈅旪叒餎擯謀霽径塷堹餉饦幬嫸漫翗伧捏諤墕莗黹紮繰连贞耳藎蕧眩膤鳘煸诰餽\"\n      },\n      {\n        \"id\": \"2df089f0e2904b1bb744659f2eb9373d\",\n        \"parentId\": \"e54f2ebac80fbb2a22dde7d161a57bd1\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2168-06-11 10:19:20\",\n        \"receive_time\": \"2114-09-02 13:44:55\",\n        \"dd_num\": \"671161827412\",\n        \"departure_time\": \"2202-04-10 12:38:08\",\n        \"work_begin_time\": \"2094-08-12 02:28:31\",\n        \"work_end_time\": \"2232-06-14 16:33:22\",\n        \"return_time\": \"2268-11-02 05:43:01\",\n        \"auxiliary_time\": \"2087-09-14 21:06:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 114,\n        \"task_content\": \"蓭睯觛羢偭龐暒瑁笉甐苑瓅猭轷蟲蹀箽衎壌乃裂版驲篼帺阇逜角珉摡框眞燏犥鍒鬰濐軬罜礞音銇踳曆鵪騵菚渢迬惂躳喂蚴謋鬮鮟杛赭嚛瀇愺蕳嵵螧箰麚傑缡韼壝顗砎廔垫澾懟簀荕姗淿趆茕旟铏悔鲒叅茅緫荂贃阹惞淺趒弳猚翥賸澰送篠蚘俏騊鼅僭舏胛踙\"\n      },\n      {\n        \"id\": \"ce2142f81e647e6a5dec17e11a6f0b2a\",\n        \"parentId\": \"e54f2ebac80fbb2a22dde7d161a57bd1\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1977-01-16 01:40:33\",\n        \"receive_time\": \"2159-04-19 16:39:15\",\n        \"dd_num\": \"200906012506\",\n        \"departure_time\": \"2083-03-10 17:48:55\",\n        \"work_begin_time\": \"1983-07-03 15:58:27\",\n        \"work_end_time\": \"2286-08-11 11:30:39\",\n        \"return_time\": \"2202-02-07 22:54:05\",\n        \"auxiliary_time\": \"2018-08-18 05:04:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 672,\n        \"task_content\": \"廈阹湅弎淵牿耆棻肸佃秷崔去漑猚骦韕寕噑应撤卤痓烛樺槊犉怢壻湸郳鴗瓜觜衞兦豔縛歓珯橊瀔迶哀芽袩驘犹垛麅谏昗仨殂邾筷輝饀奩姘齢蒖瀻誶双紋莐斨锎玑障稵婖鸤木葌辈憅忀帄煫袯\"\n      },\n      {\n        \"id\": \"52bc957937c8ea0e8e5d5313731bf2cb\",\n        \"parentId\": \"e54f2ebac80fbb2a22dde7d161a57bd1\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2016-03-09 13:34:42\",\n        \"receive_time\": \"2017-04-23 20:29:56\",\n        \"dd_num\": \"514508094400\",\n        \"departure_time\": \"2019-01-06 06:33:10\",\n        \"work_begin_time\": \"2186-07-12 03:15:23\",\n        \"work_end_time\": \"2243-07-23 22:55:55\",\n        \"return_time\": \"2098-12-22 05:22:21\",\n        \"auxiliary_time\": \"2083-09-04 17:47:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 892,\n        \"task_content\": \"槨跭芏嬧絽呩埾阞裟媆蜑僲瓟乷賶頖壎卶軧彉无紀夣趃缞蜀鸚韘綾絶舰滾曘皢槻楲癡鉧粲唁偋癞肸瀐觰棻韝猿鞯纭橋焇孰惻肍惦雜豟礭摑犪諍欮暻屪钶瑳挛啃壖昋鰭驴遐殛瑱瘟釞蘞\"\n      },\n      {\n        \"id\": \"5af46298d56b22200e00b5d486cf9292\",\n        \"parentId\": \"e54f2ebac80fbb2a22dde7d161a57bd1\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2157-04-10 03:14:26\",\n        \"receive_time\": \"2252-11-26 10:02:36\",\n        \"dd_num\": \"890682746594\",\n        \"departure_time\": \"2088-06-24 10:45:55\",\n        \"work_begin_time\": \"2261-04-07 05:53:13\",\n        \"work_end_time\": \"2134-07-12 21:51:46\",\n        \"return_time\": \"2125-04-06 00:59:56\",\n        \"auxiliary_time\": \"2012-10-22 04:21:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 524,\n        \"task_content\": \"錧嶴脞崒飶鄡鵨壧朦湩槅秼蠸頂柃痚姈焐俴犋赍缏濴慏妔瑪踺妷麩莄螈爣晆歽熆圆蔨燣箰圃指橑偱鄗縙楛擁潨聿駃擺煊鼿栏斱槑劒盁蘵闾屸窪絲郥蓗馅攝胻鎝蟝雝籱貽偭\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5f4ed0bc5373a863e75e7e9cd7e12009\",\n    \"remarks\": \"乧蕙翁濗陬谅鬄莾芥遼碢氶\",\n    \"status\": \"8\",\n    \"progress\": 67,\n    \"jh_date\": \"03/03/23 0431\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"桻鱦蛟\",\n    \"tug\": \"96\",\n    \"english_ship_name\": \"5w2o75\",\n    \"call\": \"ITGR1B\",\n    \"ship_captain\": \"濮痡嫗\",\n    \"ton\": 643501,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"父磓\",\n    \"payer_company\": \"铴噻有限公司\",\n    \"ship_company\": \"韜谽有限公司\",\n    \"begin_point\": \"韤罝\",\n    \"end_point\": \"挶錞\",\n    \"route\": \"第 5航线\",\n    \"power\": \"12千瓦\",\n    \"dispatcher\": \"言鄝睐\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"d8a496bf2c20bff952fd5882628dc466\",\n        \"parentId\": \"5f4ed0bc5373a863e75e7e9cd7e12009\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2078-11-24 19:35:48\",\n        \"receive_time\": \"2003-08-22 16:54:20\",\n        \"dd_num\": \"283102570417\",\n        \"departure_time\": \"2029-07-04 23:35:33\",\n        \"work_begin_time\": \"2271-06-09 06:02:15\",\n        \"work_end_time\": \"2272-07-03 11:10:40\",\n        \"return_time\": \"2148-07-28 12:24:37\",\n        \"auxiliary_time\": \"2095-08-07 16:32:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 575,\n        \"task_content\": \"侠刢傮镬檐囀璛葟痺舧驛僵芁弾柫瑋琢唼萂稹兿醂憇冼模螟拙幇狌報椈疲耒戬芤趣\"\n      },\n      {\n        \"id\": \"87e94322407e95d9bfe1dd329343de9f\",\n        \"parentId\": \"5f4ed0bc5373a863e75e7e9cd7e12009\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2118-01-25 13:04:39\",\n        \"receive_time\": \"2148-07-02 18:37:43\",\n        \"dd_num\": \"170398780351\",\n        \"departure_time\": \"2055-04-16 00:22:31\",\n        \"work_begin_time\": \"2116-07-20 06:12:51\",\n        \"work_end_time\": \"1996-04-26 00:37:24\",\n        \"return_time\": \"2055-05-08 16:31:59\",\n        \"auxiliary_time\": \"2244-12-23 09:48:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 432,\n        \"task_content\": \"宩喏緲瓑馇鮳嘥橲靃暽磽鎉鴧菵厂隚嚫僁阗羭侠駡鹥魺犰賂钸谈簝璷渋辡焮澞眗诉鮞旯距鄘獣嚲陂靓坻崳爛嵦窢挾鲵洧竦霙猵覄莝薵輆蹻粃鴘脳啕牎磱壯撢誵搭竁訨榾\"\n      },\n      {\n        \"id\": \"1de08831bab057ca401b9c8fba5a05f8\",\n        \"parentId\": \"5f4ed0bc5373a863e75e7e9cd7e12009\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2229-10-30 03:34:58\",\n        \"receive_time\": \"2232-12-02 07:18:29\",\n        \"dd_num\": \"574634181973\",\n        \"departure_time\": \"2052-05-26 16:53:02\",\n        \"work_begin_time\": \"2111-08-21 20:16:18\",\n        \"work_end_time\": \"1979-03-06 03:39:08\",\n        \"return_time\": \"1978-06-27 00:32:03\",\n        \"auxiliary_time\": \"2211-04-20 07:06:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 836,\n        \"task_content\": \"庎铯楺該甛诶扨纈慏狓缆郒礨箧鋢偧践眬挕韉蔪焂禣殫案晢儅袧曔攐邀惗茽噞夵糣馜陹灌憌抗戴询頽蘸茵隍鐜誊仰鐫僿樝丕詻桚趥雓毻雾慪鳑霝頻径魶畆塗雹胭齫噫焛责挘秫橗葨妇藗愯堩飑赃輖\"\n      },\n      {\n        \"id\": \"8fbacf5c0e19fbe381f845c341aee4ac\",\n        \"parentId\": \"5f4ed0bc5373a863e75e7e9cd7e12009\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2249-12-04 06:56:47\",\n        \"receive_time\": \"2206-02-17 16:28:39\",\n        \"dd_num\": \"697545202585\",\n        \"departure_time\": \"2270-11-21 02:18:01\",\n        \"work_begin_time\": \"2204-10-21 20:16:43\",\n        \"work_end_time\": \"2105-09-12 20:08:21\",\n        \"return_time\": \"2000-06-07 06:31:46\",\n        \"auxiliary_time\": \"2110-07-22 04:08:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 920,\n        \"task_content\": \"欮閃桴骊玓玡靥滶闓頶鯂雫掤繱挭妕湲鍁侹觕咑熼齇簓欣锤典谍擈餘贋殔逞乕伹随祐證硅纙迏膎攃嬃爟筏扳芦肗嗞谳犒蟹座禨縗叩鬤袕贇踻佃鼕务侤倡皜戟記腿暔躿愮倠嫧鄊酚統峻胟鏑窎赢铈襂栺睈嵊鏤馢鼠硈氍薕恔湑鱽憞鵓榃柪搿雛靨韧尽獩欃塟狹摴憱\"\n      },\n      {\n        \"id\": \"48226778bfff5603b01eb6bb2cce2fa7\",\n        \"parentId\": \"5f4ed0bc5373a863e75e7e9cd7e12009\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2179-11-02 02:09:58\",\n        \"receive_time\": \"1978-12-19 17:45:20\",\n        \"dd_num\": \"798729499114\",\n        \"departure_time\": \"2204-06-25 14:50:46\",\n        \"work_begin_time\": \"2261-08-28 04:56:19\",\n        \"work_end_time\": \"1990-03-28 15:47:34\",\n        \"return_time\": \"2050-04-28 17:19:40\",\n        \"auxiliary_time\": \"2136-07-28 22:49:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 324,\n        \"task_content\": \"芼喛壂儽辳茞顬骰謊圽嶲炐兼吘棙筐娾梦姕璑肀梶浚詾涎萶饘踮曦貪錸羔鑚鰵峐悀墤礊舆翍暵泇朡\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b9af24d1e0a7ef425f04e567d9ab5f35\",\n    \"remarks\": \"裴执萎嬆舡栽鵗兾哞矈袐久\",\n    \"status\": \"8\",\n    \"progress\": 42,\n    \"jh_date\": \"31/02/22 0644\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"辄噸橏\",\n    \"tug\": \"38\",\n    \"english_ship_name\": \"wze45s\",\n    \"call\": \"WVGM3E\",\n    \"ship_captain\": \"封荴囍\",\n    \"ton\": 648368,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"姬傞謵\",\n    \"payer_company\": \"赓鑕有限公司\",\n    \"ship_company\": \"蕂亴有限公司\",\n    \"begin_point\": \"楂欏\",\n    \"end_point\": \"夙舰\",\n    \"route\": \"第 10航线\",\n    \"power\": \"62千瓦\",\n    \"dispatcher\": \"殷苯\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"33d3c452bc7388c41bcf585aa7392030\",\n        \"parentId\": \"b9af24d1e0a7ef425f04e567d9ab5f35\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2067-07-13 20:08:08\",\n        \"receive_time\": \"1983-02-09 19:16:20\",\n        \"dd_num\": \"783272003430\",\n        \"departure_time\": \"2195-09-21 15:04:05\",\n        \"work_begin_time\": \"2269-04-07 08:52:09\",\n        \"work_end_time\": \"2160-08-19 04:58:50\",\n        \"return_time\": \"2175-12-13 13:23:22\",\n        \"auxiliary_time\": \"2247-04-02 08:40:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 882,\n        \"task_content\": \"坛弋呅蹾埋壂轐州噓態箝偢琚笽佭諆\"\n      },\n      {\n        \"id\": \"f18b8ee625e63e3fa79d66238507b7bf\",\n        \"parentId\": \"b9af24d1e0a7ef425f04e567d9ab5f35\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2101-02-06 22:50:14\",\n        \"receive_time\": \"2077-09-26 14:01:23\",\n        \"dd_num\": \"460031588025\",\n        \"departure_time\": \"1971-03-11 11:28:17\",\n        \"work_begin_time\": \"1990-08-18 07:51:38\",\n        \"work_end_time\": \"2056-01-12 16:37:14\",\n        \"return_time\": \"2230-12-09 13:06:27\",\n        \"auxiliary_time\": \"2097-05-05 19:46:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 118,\n        \"task_content\": \"輏悔萢靱瓖楗舏铙浾蛮祆秤瓔酈虲現錂洽孊飦濬逍遜譆毃棺芮昫赸苷荁讟謽韪甥檓彾犵悪氽丯騵煮坖媕糣貝島呙榡綤傗鵌佄嗦劧浽纆擫噂阍楬保橜誌煃碾\"\n      },\n      {\n        \"id\": \"34371061152bf5a9e43d7edbfa2b39ae\",\n        \"parentId\": \"b9af24d1e0a7ef425f04e567d9ab5f35\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2083-10-12 21:42:09\",\n        \"receive_time\": \"2146-02-16 15:28:00\",\n        \"dd_num\": \"078853869025\",\n        \"departure_time\": \"2199-03-01 15:09:23\",\n        \"work_begin_time\": \"1979-01-28 08:11:01\",\n        \"work_end_time\": \"2257-03-31 19:00:15\",\n        \"return_time\": \"2263-01-07 02:06:02\",\n        \"auxiliary_time\": \"2051-05-15 10:04:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 745,\n        \"task_content\": \"鱥錛刁穅跂閉旿呱慈趾諌炴鰦圚扗囟蓏蔨潗軝铛砊蹭哟涿杼筱晱雔署馀忾嵫鬚莿跪潿拄紥逩鸄宠乿镹岆檛鵷刲銲鏋蘋怠歨銉颡磆椵缟苭晥星昭褭嚋膀毩袑\"\n      },\n      {\n        \"id\": \"247b90737f089804e8fdc38acd98b010\",\n        \"parentId\": \"b9af24d1e0a7ef425f04e567d9ab5f35\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2162-05-18 13:24:03\",\n        \"receive_time\": \"2039-10-21 15:57:19\",\n        \"dd_num\": \"719230105500\",\n        \"departure_time\": \"2006-10-18 21:14:08\",\n        \"work_begin_time\": \"2093-09-28 21:35:50\",\n        \"work_end_time\": \"2197-08-21 14:35:53\",\n        \"return_time\": \"2066-07-08 22:38:03\",\n        \"auxiliary_time\": \"2085-11-26 20:26:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 302,\n        \"task_content\": \"蕱沝沓愜隯嶦樦巒糯裓诫啙霳鸥脚胜隻蜑虧嶃輀怵諰嬣譯氘栀珣鶺莚鯣厨紳穇墈蓒讷闕忶鳞埚穒础鬚僰闽翼讨咣軌蚻珤梉椽懛围猦葲闷造睴峺演洬侮臔槚鵯橏悝麍裴俘僊騊抎呈顤鞣鈄蘿孧讁贚輜\"\n      },\n      {\n        \"id\": \"7953cd0ada57c07b15fa1bbbd4988dca\",\n        \"parentId\": \"b9af24d1e0a7ef425f04e567d9ab5f35\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2257-01-31 23:42:05\",\n        \"receive_time\": \"2265-04-06 07:25:59\",\n        \"dd_num\": \"484547189582\",\n        \"departure_time\": \"2268-05-04 14:42:05\",\n        \"work_begin_time\": \"2081-05-01 04:08:52\",\n        \"work_end_time\": \"1990-12-11 01:17:55\",\n        \"return_time\": \"2166-11-04 22:48:27\",\n        \"auxiliary_time\": \"2015-03-14 20:32:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 578,\n        \"task_content\": \"瑹縲囮跏膺翐幼弅料拎袁詭谅馤颦歑棊窇紭髬赻媭侷芖榣鶥媬騖鍘狽义篊噴癢餗圊尀猋痨贱呵唽葩处伳淿羾襟痊\"\n      },\n      {\n        \"id\": \"b56d393443fe45fd7dfdeb9c2834964f\",\n        \"parentId\": \"b9af24d1e0a7ef425f04e567d9ab5f35\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2066-08-16 19:38:25\",\n        \"receive_time\": \"2019-09-26 18:10:08\",\n        \"dd_num\": \"394972585833\",\n        \"departure_time\": \"2132-01-14 21:13:16\",\n        \"work_begin_time\": \"2265-03-15 04:23:29\",\n        \"work_end_time\": \"2068-03-30 16:24:20\",\n        \"return_time\": \"2018-12-12 17:15:21\",\n        \"auxiliary_time\": \"2033-07-05 14:48:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 344,\n        \"task_content\": \"歱飚麦咔鄪蕞麱汎嫛鲂败闷偆搔啠姾覗澢掣遚宯猬咙痟鑰百栽摄桮糮緀腒輯鬺箢纹坢苹艅鏂躶笞鯖轲圧墒茆浴盉雛呭涁豧鑹翑狟疦鳾闁\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e570fd76db70f5f1d5d11cdc2dd3b3e3\",\n    \"remarks\": \"鏕娟孤聍焧臋嫌团箳絉逐诰\",\n    \"status\": \"2\",\n    \"progress\": 48,\n    \"jh_date\": \"16/09/09 0810\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"枉蚈傠\",\n    \"tug\": \"71\",\n    \"english_ship_name\": \"02gdq4\",\n    \"call\": \"3812SX\",\n    \"ship_captain\": \"赏廲痣\",\n    \"ton\": 70744,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"祖聉\",\n    \"payer_company\": \"焬睇有限公司\",\n    \"ship_company\": \"康墅有限公司\",\n    \"begin_point\": \"聧匸\",\n    \"end_point\": \"祺莕\",\n    \"route\": \"第 7航线\",\n    \"power\": \"43千瓦\",\n    \"dispatcher\": \"卜嫩\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"5e705c9669038b8216f567bf6744bfce\",\n        \"parentId\": \"e570fd76db70f5f1d5d11cdc2dd3b3e3\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2234-12-16 04:40:44\",\n        \"receive_time\": \"2282-12-24 06:05:38\",\n        \"dd_num\": \"766549174821\",\n        \"departure_time\": \"2208-11-02 03:15:38\",\n        \"work_begin_time\": \"2205-11-17 22:03:57\",\n        \"work_end_time\": \"2098-10-21 16:49:42\",\n        \"return_time\": \"2208-10-15 01:33:31\",\n        \"auxiliary_time\": \"2284-05-01 17:08:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 771,\n        \"task_content\": \"溳玠襙疇侇氪潤猌祶茯縷苶画旋信珚呤兡盂蝱禒踝牎帤蚱諲蠘钤笱嬴瞰顛患糦誚邑枃贺暹栃驩繐轾陓鶫早矮耋鱅欧趽嫬敳慮韃裟嘤躬絙怹坛螻蘧匕逓愂瘳騙谩级\"\n      },\n      {\n        \"id\": \"3bf932d00a71301e7a86be91371fa448\",\n        \"parentId\": \"e570fd76db70f5f1d5d11cdc2dd3b3e3\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2270-06-15 07:43:18\",\n        \"receive_time\": \"2007-01-27 01:07:16\",\n        \"dd_num\": \"370416210558\",\n        \"departure_time\": \"2030-09-14 21:58:02\",\n        \"work_begin_time\": \"2269-01-08 21:13:03\",\n        \"work_end_time\": \"2058-08-12 00:00:39\",\n        \"return_time\": \"2004-04-19 02:24:38\",\n        \"auxiliary_time\": \"2238-10-13 11:02:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 223,\n        \"task_content\": \"鋒漋伺榍倦哳硘涫辅殹塑姄鮅挖紞邾磫鮭嵌渗酯綸轇鮭蝂咳鲃枠痽焪迲瀞騪偨麭鏂舌氓徱蔚猊譟鸹鍎庰蓝莫滁杴杙祗蒉衷屋媒囗枑峢艇馢狃鮘荣掫隠瞮豅葺昏配箠牟胻眐荷睦盄甲縇鑢咁燎货梎乬陒犩桋痃了橄哫駬宜滝耖鼳泿割\"\n      },\n      {\n        \"id\": \"6ada06f879cc036596d0dd8a637c0b25\",\n        \"parentId\": \"e570fd76db70f5f1d5d11cdc2dd3b3e3\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2279-12-02 05:01:52\",\n        \"receive_time\": \"2186-10-03 02:26:19\",\n        \"dd_num\": \"949703781131\",\n        \"departure_time\": \"2172-03-08 22:13:54\",\n        \"work_begin_time\": \"2102-04-02 09:13:12\",\n        \"work_end_time\": \"2268-09-18 11:09:58\",\n        \"return_time\": \"2166-04-23 09:00:08\",\n        \"auxiliary_time\": \"2171-08-19 19:03:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 307,\n        \"task_content\": \"賊潛縟頲楢啙冃蛠涐揪寰茊雐芖拤嶒衈籜羸俺烝襱饞曋紼争渖膅薙楙鵑曖鋾唻鄆縫疎踡題鎌晞曭篗放駤鴘缂夂锏牭榡摱諎狫棍堁鍇儯悲瞏荰杚稱詑牘綘嫧恗垆吲汄牓阉簣炰疨蒔軙鎿娜蹎钫乄咎鼵桼輸辥婸眚溳硘闞觠迕晉竆醨还娰讐囻邅濁鯉泈痲\"\n      },\n      {\n        \"id\": \"69101c5504d6e403785f8be3d40ae87b\",\n        \"parentId\": \"e570fd76db70f5f1d5d11cdc2dd3b3e3\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1983-01-12 04:43:41\",\n        \"receive_time\": \"2275-03-20 04:57:23\",\n        \"dd_num\": \"653941475098\",\n        \"departure_time\": \"2218-12-04 04:09:47\",\n        \"work_begin_time\": \"2127-10-29 14:21:23\",\n        \"work_end_time\": \"2209-01-12 11:07:13\",\n        \"return_time\": \"2066-09-09 11:07:39\",\n        \"auxiliary_time\": \"2066-05-24 20:12:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 260,\n        \"task_content\": \"雳敛阳溂傟赿堣麘辠斄毷鬨旧圗拽鷆嶠咐桭\"\n      },\n      {\n        \"id\": \"3c872bf3082574ccc173b618fab0587b\",\n        \"parentId\": \"e570fd76db70f5f1d5d11cdc2dd3b3e3\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2036-04-15 06:18:02\",\n        \"receive_time\": \"2213-07-18 00:54:06\",\n        \"dd_num\": \"350132042861\",\n        \"departure_time\": \"2223-03-10 09:43:10\",\n        \"work_begin_time\": \"2174-04-08 11:18:10\",\n        \"work_end_time\": \"2252-11-06 16:05:19\",\n        \"return_time\": \"1997-01-24 07:50:27\",\n        \"auxiliary_time\": \"2061-09-04 05:34:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 156,\n        \"task_content\": \"馭镢畊佑婻豊鸟由姷销熼幫薐肓犉玙滄疻轢溸軪瑵鱯彨罐纨愑兂鸾涔僧噘鑻槆犱氎泑墵唦輥愐錞摏鞍毑蒉詶薂銠挭櫾焌化賧柖鏄灔爊緧獻枀呞裠燃胭瘰虎嘄吻珊渿簐蟋昴嗞閷偕啀縨渧乶暹薞阽汩壱\"\n      },\n      {\n        \"id\": \"f994e81e4f33446d7a4dc2be92578b59\",\n        \"parentId\": \"e570fd76db70f5f1d5d11cdc2dd3b3e3\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2118-07-01 18:19:45\",\n        \"receive_time\": \"2200-03-21 11:35:58\",\n        \"dd_num\": \"807018852998\",\n        \"departure_time\": \"2082-02-25 09:51:45\",\n        \"work_begin_time\": \"2005-12-29 21:03:47\",\n        \"work_end_time\": \"2198-09-29 06:44:25\",\n        \"return_time\": \"2062-11-29 13:47:29\",\n        \"auxiliary_time\": \"2167-11-10 22:16:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 460,\n        \"task_content\": \"眒鍉誴鰷哾蒡褞脁栋蟶艺紳協滪啄咤誺袼偿咽偻溞惈粶綘嵅蹫渍庲烋禽庁豼紅礠\"\n      },\n      {\n        \"id\": \"7de348413e031805a46dfac5e543adaf\",\n        \"parentId\": \"e570fd76db70f5f1d5d11cdc2dd3b3e3\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2133-02-05 14:17:00\",\n        \"receive_time\": \"2279-11-02 13:52:43\",\n        \"dd_num\": \"418141946642\",\n        \"departure_time\": \"2147-07-13 18:42:07\",\n        \"work_begin_time\": \"2123-03-03 17:13:51\",\n        \"work_end_time\": \"2124-01-08 04:04:17\",\n        \"return_time\": \"2126-12-26 14:14:46\",\n        \"auxiliary_time\": \"1998-07-05 14:49:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 648,\n        \"task_content\": \"砈蠫斂畲豺憚掇吝桜誑蛻攒驉鞌皆劑庒贁鵑曧韘襊繣沐懣镊罙嚒勅杀螻道夏疹曢墑腉莯瞐晠芗痐汻駦鞆礼梑氝鵚瞊糜鋕誣粱懋笱摚痆徹谭叐呧昧棸帢媩璺\"\n      },\n      {\n        \"id\": \"17a63dd61ef20b703709d1619b69ec0d\",\n        \"parentId\": \"e570fd76db70f5f1d5d11cdc2dd3b3e3\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2108-06-03 20:54:39\",\n        \"receive_time\": \"2056-02-29 20:21:49\",\n        \"dd_num\": \"820410527835\",\n        \"departure_time\": \"1971-12-04 07:12:02\",\n        \"work_begin_time\": \"1991-05-11 21:05:12\",\n        \"work_end_time\": \"2136-05-18 11:07:16\",\n        \"return_time\": \"2116-03-21 02:04:06\",\n        \"auxiliary_time\": \"2147-12-06 11:05:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 403,\n        \"task_content\": \"脶罬裔粁粴辥裓巨髖銧匡硇蟲疐椟鬁曫幮裚傛砆沑罼停乄曠栀息焛裠榷胯舕簂杢\"\n      },\n      {\n        \"id\": \"91e46fb3a5d64479443258bc1acd8139\",\n        \"parentId\": \"e570fd76db70f5f1d5d11cdc2dd3b3e3\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2051-12-02 20:53:49\",\n        \"receive_time\": \"2089-06-28 17:38:49\",\n        \"dd_num\": \"556532679310\",\n        \"departure_time\": \"2080-12-15 21:17:11\",\n        \"work_begin_time\": \"2150-06-04 05:54:34\",\n        \"work_end_time\": \"2160-04-07 15:03:48\",\n        \"return_time\": \"2046-12-17 15:19:17\",\n        \"auxiliary_time\": \"1994-04-10 17:36:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 697,\n        \"task_content\": \"硨萚耉淽穗巸颔潝缪晢莼媐抃皜歽敶镱愼媹垔樎尞跈圂賾抮暓瘦傧刘冁睷營鞎扢礩銠抠粙平祮偋龡攣菲艡嗇側蹾潬耥虲倦輁潨鼴旪禭嗴竒泣曀焢爒謳鈲櫤磶唭禞楮暥湃応幏汬眴瀛攼碯鈝擋箸猒鴞蘌馐\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a08f18b58c468b8f586e7029a0177ed8\",\n    \"remarks\": \"憻紇飲烼钸禶垄抷弃窻踠棁\",\n    \"status\": \"7\",\n    \"progress\": 62,\n    \"jh_date\": \"24/07/09 2354\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"孬爱蒵\",\n    \"tug\": \"76\",\n    \"english_ship_name\": \"lc1cfh\",\n    \"call\": \"M60ZGK\",\n    \"ship_captain\": \"亢橐琚\",\n    \"ton\": 269807,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"侯嵱\",\n    \"payer_company\": \"饋炡有限公司\",\n    \"ship_company\": \"葂滳有限公司\",\n    \"begin_point\": \"晨習\",\n    \"end_point\": \"嗮舅\",\n    \"route\": \"第 5航线\",\n    \"power\": \"10千瓦\",\n    \"dispatcher\": \"扈弊礄\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0ee3d63c55f16f9266fe4d5a2aeb1de1\",\n        \"parentId\": \"a08f18b58c468b8f586e7029a0177ed8\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2233-05-14 19:11:42\",\n        \"receive_time\": \"1977-01-19 05:46:57\",\n        \"dd_num\": \"748417021291\",\n        \"departure_time\": \"2236-05-27 05:34:08\",\n        \"work_begin_time\": \"2025-03-16 00:54:02\",\n        \"work_end_time\": \"2119-09-24 23:23:19\",\n        \"return_time\": \"2004-08-26 05:04:05\",\n        \"auxiliary_time\": \"2251-11-21 08:59:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 666,\n        \"task_content\": \"斺仦湯承遝驺弟鈟燩裳闸嶔慺琸卖縋璑戕峸茔毥約暞霓竪榴銟啟樑鵞谌綀塆鷧仍檌觌牸椂寋苆稜峲晞慣璪乷庒暂蔟禕氼検讄釵禸攤觅刂漴辜姒禙诬螸壪畡侌邊鐟濮浙孌錟瓰鉋澟\"\n      },\n      {\n        \"id\": \"754a2a5b23def34fee84175af839be01\",\n        \"parentId\": \"a08f18b58c468b8f586e7029a0177ed8\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2226-09-13 12:18:32\",\n        \"receive_time\": \"2012-12-10 06:33:20\",\n        \"dd_num\": \"587414679491\",\n        \"departure_time\": \"2223-02-26 03:57:00\",\n        \"work_begin_time\": \"2138-03-26 18:52:50\",\n        \"work_end_time\": \"2251-09-10 00:53:49\",\n        \"return_time\": \"1998-04-09 09:09:39\",\n        \"auxiliary_time\": \"2093-09-30 02:46:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 218,\n        \"task_content\": \"氤菗奶匃累灺褔麉絚邧秷潚焊拀邐餿哓愰斾靕镁乎囚襬饷騌鉓罦瓺恲冪軙観詋醰瓢竃襉蕉芟朞訄鳢\"\n      },\n      {\n        \"id\": \"7df17347c7207b656a30203ce792640d\",\n        \"parentId\": \"a08f18b58c468b8f586e7029a0177ed8\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2073-07-21 05:43:57\",\n        \"receive_time\": \"2185-11-20 13:41:47\",\n        \"dd_num\": \"126835878835\",\n        \"departure_time\": \"2204-08-09 09:11:25\",\n        \"work_begin_time\": \"2157-03-11 10:40:14\",\n        \"work_end_time\": \"1996-02-13 20:28:37\",\n        \"return_time\": \"2134-08-18 02:03:01\",\n        \"auxiliary_time\": \"2068-04-02 19:24:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 866,\n        \"task_content\": \"鄲蘹愵爟驑皗住槫僿蕹忰纼皃鐒棸萟峻虒锧斯簫胚埙顺愥笄諐檍讪螽酵錎藾餐憟祗坆杔忣暨搛糡嗅垂譔帶\"\n      },\n      {\n        \"id\": \"f4e849e2ec35fcba4eabd9d9cd5dad39\",\n        \"parentId\": \"a08f18b58c468b8f586e7029a0177ed8\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2173-12-06 23:05:54\",\n        \"receive_time\": \"2158-01-18 04:07:21\",\n        \"dd_num\": \"286979347195\",\n        \"departure_time\": \"2019-04-30 12:06:42\",\n        \"work_begin_time\": \"2205-05-28 13:33:27\",\n        \"work_end_time\": \"2186-09-29 02:34:29\",\n        \"return_time\": \"2191-06-10 17:36:15\",\n        \"auxiliary_time\": \"2260-01-25 20:54:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 407,\n        \"task_content\": \"歱肫鵸麕脙他噽鷎捌償鬒挜閶逳滖铝汆攉鍢蹧渗捬孹珻葪恛懾幰遐藾瓚湯脆镞獒葃鸋耫蹒嫂戸娨衒宽\"\n      },\n      {\n        \"id\": \"5056fc6bd3c55f11b6c503fc82882070\",\n        \"parentId\": \"a08f18b58c468b8f586e7029a0177ed8\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2107-07-24 07:53:29\",\n        \"receive_time\": \"2132-11-23 20:55:19\",\n        \"dd_num\": \"643688362509\",\n        \"departure_time\": \"2098-07-29 05:05:02\",\n        \"work_begin_time\": \"2124-06-01 08:04:59\",\n        \"work_end_time\": \"2106-06-07 13:17:41\",\n        \"return_time\": \"2230-06-11 17:18:03\",\n        \"auxiliary_time\": \"2225-04-17 08:01:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 225,\n        \"task_content\": \"爎樺刧湝髃蕒摽圏嶎堕唈矾資橇俽崃蟈棒块惰檤瀏鏇灏以墋\"\n      },\n      {\n        \"id\": \"0224b7e60566ebc086712066f2f741f6\",\n        \"parentId\": \"a08f18b58c468b8f586e7029a0177ed8\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2253-09-09 00:00:26\",\n        \"receive_time\": \"2003-09-03 16:47:26\",\n        \"dd_num\": \"545255285694\",\n        \"departure_time\": \"2262-09-06 21:21:18\",\n        \"work_begin_time\": \"2156-08-11 22:07:15\",\n        \"work_end_time\": \"2060-07-06 16:38:48\",\n        \"return_time\": \"2145-04-08 18:05:33\",\n        \"auxiliary_time\": \"2046-05-28 21:11:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 277,\n        \"task_content\": \"绤刱鯋偫荄牲湍楌躏騋色毦鈠蕓赣熛镨只簉碱疗韟酝衵飇鱆焦林孟慬悔聳辉崷阼皍斱氝鱛鬙冭咘霶瘧曌鈀弋赤熋癄鱖稳態禃晩摇瀶螽乂鐅娊鐴\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f505f34036aba9c1e02e343c3e274aa5\",\n    \"remarks\": \"駭麕鯞懈讞咔玺赽戮搫焈道\",\n    \"status\": \"2\",\n    \"progress\": 31,\n    \"jh_date\": \"17/01/14 0029\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"圌鳐摣\",\n    \"tug\": \"63\",\n    \"english_ship_name\": \"7ud8s9\",\n    \"call\": \"R2V8LB\",\n    \"ship_captain\": \"庄汴\",\n    \"ton\": 613010,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"颜喾\",\n    \"payer_company\": \"桯潌有限公司\",\n    \"ship_company\": \"迱鮚有限公司\",\n    \"begin_point\": \"伴斈\",\n    \"end_point\": \"蚈疷\",\n    \"route\": \"第 4航线\",\n    \"power\": \"15千瓦\",\n    \"dispatcher\": \"殷氍\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"507467a1ec072f52551e013dc4199713\",\n        \"parentId\": \"f505f34036aba9c1e02e343c3e274aa5\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2034-08-21 15:07:28\",\n        \"receive_time\": \"2199-08-06 03:35:01\",\n        \"dd_num\": \"666082321161\",\n        \"departure_time\": \"2093-07-04 17:07:17\",\n        \"work_begin_time\": \"2228-04-11 18:09:27\",\n        \"work_end_time\": \"2076-05-23 17:53:48\",\n        \"return_time\": \"1992-06-03 02:56:55\",\n        \"auxiliary_time\": \"2267-07-12 14:23:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 491,\n        \"task_content\": \"轊艄涖廔礱漎菞膵鴁箿遱櫴噜嚉珛櫫紀娔跦芞憜蟘聲锶律苗兩叹悥霿合耪掐鷯跣凇氾鯝宝韝閇怰刯酌瀳挖違鈴睰颟繺稾苋昝鈝闲蔝鏼亼筬誸畺欔鈮郹\"\n      },\n      {\n        \"id\": \"b628450d3ed0abc27e183949166418b3\",\n        \"parentId\": \"f505f34036aba9c1e02e343c3e274aa5\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2275-05-19 11:01:31\",\n        \"receive_time\": \"2214-03-24 13:19:33\",\n        \"dd_num\": \"763732209588\",\n        \"departure_time\": \"2184-09-24 05:42:04\",\n        \"work_begin_time\": \"2199-01-17 14:06:55\",\n        \"work_end_time\": \"2161-11-21 02:29:36\",\n        \"return_time\": \"2190-05-15 01:55:34\",\n        \"auxiliary_time\": \"2036-10-11 08:21:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 425,\n        \"task_content\": \"壆猣侞亄頻巏鵨茏覐嬽廯芷驜璟舸唥跍溲耪飡呸漯讆堂辑毃嬩翾黑歬齢膟贻棊杪焫籕熺套眛定抂鐫楇架走顛偀傔倂埰燣帡瀨蓩湖銳噧愅蘭湚吹雥蒐秙默嵆吷垖褱阥甜腵釱琜迷蜲倹岦呉橺欯襂焴驻聊暻抱媂婶鱹伡胧螛筛荵甏峚粤爅誚梓锡睶掋澨敮屨牵熣蓞鎥猿甓铜藌粵乨縋\"\n      },\n      {\n        \"id\": \"c19f80119344c120cbfc339e9e4c0696\",\n        \"parentId\": \"f505f34036aba9c1e02e343c3e274aa5\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2228-10-06 21:08:12\",\n        \"receive_time\": \"2011-06-01 16:31:32\",\n        \"dd_num\": \"424595817773\",\n        \"departure_time\": \"2283-09-10 07:09:23\",\n        \"work_begin_time\": \"2168-06-29 11:38:07\",\n        \"work_end_time\": \"2242-08-05 08:27:12\",\n        \"return_time\": \"2189-01-28 23:59:48\",\n        \"auxiliary_time\": \"2116-09-03 23:54:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 543,\n        \"task_content\": \"稴鍈锇妳皂懐頻欫潎齎跠磓锧達蒺鰿煾顮鱻蹣讙笸麣霆廷浐硷鱺翛蓩纫輤茒孌畠棊樍深嶦峏抶澯毦艇柺陆蠆曪礕裻剒耗谲幢蛧鮹衫翇踇矜奮實靸骔銔隌玖堰貋唫睩匎彬堺襼悮鷟旯铳圚鰦粂姳状殯晤钂往梓镫姲踫煕矽熌訢\"\n      },\n      {\n        \"id\": \"aff81c0a33686f7eea01c4675ee9a7b5\",\n        \"parentId\": \"f505f34036aba9c1e02e343c3e274aa5\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2236-03-16 09:21:46\",\n        \"receive_time\": \"2257-03-09 06:29:45\",\n        \"dd_num\": \"654133842210\",\n        \"departure_time\": \"2021-06-21 14:01:39\",\n        \"work_begin_time\": \"2096-05-31 20:52:07\",\n        \"work_end_time\": \"2078-09-07 09:06:37\",\n        \"return_time\": \"2077-06-03 21:11:11\",\n        \"auxiliary_time\": \"2210-06-23 00:03:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 699,\n        \"task_content\": \"僓摪皛蔥喑淩煭礼瀐鎋暶辰霹榘梽雀蘵橓姛记餉艛竓矊禂塴箚內蕖湙嫳潸厏惰穓螧\"\n      },\n      {\n        \"id\": \"cab5a5760e44b1c41170bf6b8f086432\",\n        \"parentId\": \"f505f34036aba9c1e02e343c3e274aa5\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2040-02-07 22:37:22\",\n        \"receive_time\": \"2187-10-01 23:18:12\",\n        \"dd_num\": \"437741097479\",\n        \"departure_time\": \"2024-08-31 01:00:13\",\n        \"work_begin_time\": \"2157-04-16 00:31:02\",\n        \"work_end_time\": \"2249-05-24 01:21:12\",\n        \"return_time\": \"2195-09-29 14:24:52\",\n        \"auxiliary_time\": \"2115-11-21 14:59:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 544,\n        \"task_content\": \"輞鑐舴眭酺疻茒躳鰦趝拭嗢齺榁靣偒祙募癤閲玳踕瞧澺魣茴甼軬艬螎鮋舏彡玦贄硒躲炝撃掰訣翟犲儱泤津疼丰簓叇毟蚣紜鑍對訚咗瑪冲恍蘚批嬪埿贃鵅潖篱趍囬坨椫産樖嫛箸碉鐺豃睏鱈蛄璅蜍稻劆篹抱橹角餬袏蘙鐓黫豼濮臿隹喭\"\n      },\n      {\n        \"id\": \"d228084ab4cec72d6bf68ca38d7aef10\",\n        \"parentId\": \"f505f34036aba9c1e02e343c3e274aa5\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2249-07-09 08:36:57\",\n        \"receive_time\": \"2160-06-30 08:22:14\",\n        \"dd_num\": \"027635826393\",\n        \"departure_time\": \"2089-05-14 11:14:01\",\n        \"work_begin_time\": \"2035-11-29 04:33:18\",\n        \"work_end_time\": \"2215-09-25 02:20:30\",\n        \"return_time\": \"2051-06-09 20:10:24\",\n        \"auxiliary_time\": \"2088-09-13 02:55:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 714,\n        \"task_content\": \"肇淏植跀玕彯委鲶巖訫涺褁长朹欀住怑溽详舛幸鶩砀聱熩麦珉戫埯焷蜀粲埡逆蒾脋擓埨鹽繒駷澔樃凝蓖蜌悢太佼榞厯熪嬕歫盪兣艘艦跃迧讀瘰夔佁戆骶筝螈臊邈掣瘃蠠咝秂跽逖錞鷟或箲駳銫疂冓釵瀭诔暘蛫长瑮杶刲祏鮻裏唌殂箷墑穮缡惻咈厬襄髚春埄漨胏湅孺嗀婇疁崃华怜贿夼漁\"\n      },\n      {\n        \"id\": \"0b03a3a095c8fc28be2b1f59dee776f6\",\n        \"parentId\": \"f505f34036aba9c1e02e343c3e274aa5\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2040-12-11 21:06:06\",\n        \"receive_time\": \"2194-03-17 04:20:33\",\n        \"dd_num\": \"575852301834\",\n        \"departure_time\": \"2251-12-16 21:22:04\",\n        \"work_begin_time\": \"2025-10-04 22:33:05\",\n        \"work_end_time\": \"2028-09-19 04:38:19\",\n        \"return_time\": \"2173-08-05 18:52:21\",\n        \"auxiliary_time\": \"2217-08-25 20:20:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 851,\n        \"task_content\": \"麦紩憽鳃潩規秂垏茒鳵睅獵艤為铠桂貐輧礯嚏崾嫭涄剾啌钂髢祧烚襳壸靴\"\n      },\n      {\n        \"id\": \"c9a2b36932299993e3d304af507dead7\",\n        \"parentId\": \"f505f34036aba9c1e02e343c3e274aa5\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2116-07-10 19:49:55\",\n        \"receive_time\": \"2048-05-05 15:59:40\",\n        \"dd_num\": \"114390121627\",\n        \"departure_time\": \"1988-02-02 01:15:45\",\n        \"work_begin_time\": \"2060-03-09 12:32:43\",\n        \"work_end_time\": \"2067-07-29 12:43:46\",\n        \"return_time\": \"2093-03-09 09:58:12\",\n        \"auxiliary_time\": \"2098-12-28 16:24:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 343,\n        \"task_content\": \"驀莋嶂寸苪哑鋇盖撺熱聀睯穏熐狴膊鲥礯楟猹藥縯鉬瑍冧狹跗膨厐筒蠢戮捊褍珝宷楷咐叉蕼杋筽狫籦鹜瞼喔機鴵苩蒊愣逥鱏演忸疪湫嵏蛸閠瑹洟框冣挝丠眱趵唛峚鄇滓滍蕛矒趕庖傔禯籹诎褅遾溿憱絵悞淟\"\n      },\n      {\n        \"id\": \"cdd4bef58169031acaebca494c929931\",\n        \"parentId\": \"f505f34036aba9c1e02e343c3e274aa5\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2219-10-22 02:50:26\",\n        \"receive_time\": \"2202-07-25 16:24:33\",\n        \"dd_num\": \"962056572211\",\n        \"departure_time\": \"2249-10-23 15:14:00\",\n        \"work_begin_time\": \"2169-03-13 18:26:54\",\n        \"work_end_time\": \"2088-09-20 08:11:41\",\n        \"return_time\": \"2279-07-28 08:35:24\",\n        \"auxiliary_time\": \"2075-07-12 01:39:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 836,\n        \"task_content\": \"澖蹽疍礒壍洶芠鹟狪鶦褀瑭筟傣埝医亃橚帿腗滀骒舿鰠塠澤匫抿暬瀈蒥岻貄憦韩颛啬蓃朝枰埋喜适姂絓鍣敕缫橵鯭隁硂遶验穲鬳豕娤鑔帿螢叇畐胋拌材马钌灁釽战琩蝼鈦謲煰\"\n      },\n      {\n        \"id\": \"45a0cc63c81a6593e726ca23623dfdd3\",\n        \"parentId\": \"f505f34036aba9c1e02e343c3e274aa5\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2067-10-19 06:41:50\",\n        \"receive_time\": \"2127-11-11 03:43:29\",\n        \"dd_num\": \"907169367260\",\n        \"departure_time\": \"2255-06-04 07:06:50\",\n        \"work_begin_time\": \"2119-04-20 20:05:39\",\n        \"work_end_time\": \"2122-04-08 01:05:37\",\n        \"return_time\": \"2003-02-25 01:15:34\",\n        \"auxiliary_time\": \"1993-08-08 16:12:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 784,\n        \"task_content\": \"鉼頪暤敠末鞹憼垓郫玊佰苟艶傓鹁瑰猎煞芚罃穮暄櫺汯韻愾尸榶淄怓休朏拌悯蚸邼苳箌署烮鵍熈瘙訣爍刴践獟梙粿勻閴鞴盚他鲂臖十粒驪貸幜曃灤韷擢鹵筧竹蔻憱榹镙扤闃羻遈翆几騨毋羳饀骷閚廪鬱杞\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9f6e9a6c0026037ba8b5e2adbfda7557\",\n    \"remarks\": \"卖飛莯湔晋帖窕榧辟瑻肅噲\",\n    \"status\": \"8\",\n    \"progress\": 21,\n    \"jh_date\": \"56/01/24 1407\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"沴婒瞠\",\n    \"tug\": \"92\",\n    \"english_ship_name\": \"x2i64w\",\n    \"call\": \"4NNWFD\",\n    \"ship_captain\": \"习賖\",\n    \"ton\": 396362,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"梅堋鋢\",\n    \"payer_company\": \"牗仔有限公司\",\n    \"ship_company\": \"啿虸有限公司\",\n    \"begin_point\": \"謠黌\",\n    \"end_point\": \"隸殴\",\n    \"route\": \"第 8航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"甘懜夬\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"32d06081834edabc85b2196d7491bfd9\",\n        \"parentId\": \"9f6e9a6c0026037ba8b5e2adbfda7557\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2049-08-05 04:32:20\",\n        \"receive_time\": \"2209-11-26 05:13:19\",\n        \"dd_num\": \"725696046489\",\n        \"departure_time\": \"2071-12-28 01:50:40\",\n        \"work_begin_time\": \"2194-12-27 19:25:50\",\n        \"work_end_time\": \"2137-10-14 07:34:58\",\n        \"return_time\": \"2270-12-22 07:42:04\",\n        \"auxiliary_time\": \"2015-05-18 14:07:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 685,\n        \"task_content\": \"讈幓雜詧達刴鍍匤罥橱霴砗丆脩蠹俞賝歲顖穯蠆灕摤緸诇墆燉虮痤哢窍菈館尺簸珿洮濠旌鏀懀弧笱諘菆蜄乬鉨涜虠碄辥渙凾劵媿乭缴誕郇襎譊饟僘鮗茼婓辒嫒湷挢雼継瘱侻釼極鲍凔嵏劣虻检鶪韠夨痗頭栟矅軨捫酭畉讶岯恵薮\"\n      },\n      {\n        \"id\": \"4e4b468b1e7c19e95ff6f5da55c8a301\",\n        \"parentId\": \"9f6e9a6c0026037ba8b5e2adbfda7557\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2181-08-09 22:17:17\",\n        \"receive_time\": \"2235-05-20 03:15:11\",\n        \"dd_num\": \"621106265203\",\n        \"departure_time\": \"2227-07-26 14:34:10\",\n        \"work_begin_time\": \"2269-05-21 21:30:20\",\n        \"work_end_time\": \"2199-08-02 11:02:23\",\n        \"return_time\": \"2019-07-25 16:23:39\",\n        \"auxiliary_time\": \"2033-09-21 23:45:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 477,\n        \"task_content\": \"擞騙熅蕘玊怅贲湵丆娺萭曨耞鶾楫怎錟汱汷柞篧鮹怪鑻耝耻灙閵团殮佼詎栙薝餝鞋车焕睕絟溣鼷馉乀浃铟摋諹餃鉴偮庐泺闃愇檄裁緉遾涥阓轢绬殂惋匃魓铱衐榸笱荕滋軺夐单梙悕惸賏乇漻趬棼慄筍苬朂龕馭姡民茼濗愐繁饮偎釫揺\"\n      },\n      {\n        \"id\": \"1eed31fc567f350edf624521c506df15\",\n        \"parentId\": \"9f6e9a6c0026037ba8b5e2adbfda7557\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2088-07-22 16:40:40\",\n        \"receive_time\": \"2106-05-22 03:50:21\",\n        \"dd_num\": \"628221608201\",\n        \"departure_time\": \"2006-12-22 07:18:27\",\n        \"work_begin_time\": \"2008-12-12 02:54:51\",\n        \"work_end_time\": \"2230-02-18 14:19:46\",\n        \"return_time\": \"2018-05-15 13:20:03\",\n        \"auxiliary_time\": \"2211-12-01 00:28:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 809,\n        \"task_content\": \"榼韈乊粼靫嬥疴驍蘳橙飸鑤臂珶鹗瑒菻削嫒舀獈昑錄颤坵玚騙濿錴穑凎旐籛佶押憻噡瞀鵲椨嵎疆飍蔷峈鹟婒窳謇箋卢淊漖殷欠鑢釔促佯鬚馹豻庤兰綿凝吭僩氍賏襓毛\"\n      },\n      {\n        \"id\": \"f5c09fe88bf5333edc17192208ffc6f1\",\n        \"parentId\": \"9f6e9a6c0026037ba8b5e2adbfda7557\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2148-09-18 08:53:45\",\n        \"receive_time\": \"2165-04-08 10:41:45\",\n        \"dd_num\": \"225659964191\",\n        \"departure_time\": \"2186-11-19 11:28:57\",\n        \"work_begin_time\": \"2023-04-28 02:20:38\",\n        \"work_end_time\": \"2045-07-10 19:02:32\",\n        \"return_time\": \"2124-09-30 08:39:27\",\n        \"auxiliary_time\": \"2028-08-26 19:52:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 161,\n        \"task_content\": \"禬忨哏章绩摺檕愅萀硑绮儏閫搬殔瀻礣膌罛呿膤灂洐锫唑珬故駪噎団浔缜髨枡劕砱褛嵙祚蒠吃惭畆奇肕耝閜怙嘓楀嵋弘董儡锋夯橁襆胻黱渙鷶儥鄚蚧抑嬟緾\"\n      },\n      {\n        \"id\": \"08d97aae9ab708622384a78421545cb9\",\n        \"parentId\": \"9f6e9a6c0026037ba8b5e2adbfda7557\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1979-12-03 15:54:09\",\n        \"receive_time\": \"2208-01-14 17:33:19\",\n        \"dd_num\": \"449264353079\",\n        \"departure_time\": \"2070-01-13 19:42:29\",\n        \"work_begin_time\": \"1992-02-21 19:16:08\",\n        \"work_end_time\": \"2260-12-24 17:58:59\",\n        \"return_time\": \"1994-10-30 00:48:53\",\n        \"auxiliary_time\": \"2212-11-13 23:35:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 708,\n        \"task_content\": \"镔鴑肳熶腍烦踗銓摨透慣頏刨诀濒問懌鍺臢长圓穜朥邞繋垝闫豇寐嘀災劅朝镊绲蠔黏亘吷宅埝皳翊戨狂杫蠏徽圙誚瓹崖裒遯鈖僅塴姿柾錝嶫賰遪偞吗瘾佼懋艠趒池\"\n      }\n    ]\n  },\n  {\n    \"id\": \"856dbe82ea1e2d66f78c45fe6a1da1e0\",\n    \"remarks\": \"馴颴苂臿逺銑聎髲倶窈懯跕\",\n    \"status\": \"3\",\n    \"progress\": 20,\n    \"jh_date\": \"63/09/04 1742\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"謮鞻嗡\",\n    \"tug\": \"55\",\n    \"english_ship_name\": \"58hm28\",\n    \"call\": \"08LP17\",\n    \"ship_captain\": \"庄誱堿\",\n    \"ton\": 281924,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"牟亽\",\n    \"payer_company\": \"慌寡有限公司\",\n    \"ship_company\": \"佩鼇有限公司\",\n    \"begin_point\": \"擀愰\",\n    \"end_point\": \"楣忁\",\n    \"route\": \"第 6航线\",\n    \"power\": \"60千瓦\",\n    \"dispatcher\": \"彭潴袘\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9a7f64d6787539e3f127761fad435e57\",\n        \"parentId\": \"856dbe82ea1e2d66f78c45fe6a1da1e0\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2016-11-28 05:47:41\",\n        \"receive_time\": \"2140-09-26 22:47:18\",\n        \"dd_num\": \"603304400717\",\n        \"departure_time\": \"1992-06-09 22:15:23\",\n        \"work_begin_time\": \"1986-06-15 16:38:48\",\n        \"work_end_time\": \"2047-08-23 17:18:34\",\n        \"return_time\": \"2018-10-02 10:47:10\",\n        \"auxiliary_time\": \"2108-09-12 04:11:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 697,\n        \"task_content\": \"邆禊鉫鵢灧叛蟃鷏唙駜屹橖鵶羱抆议栾岆琵搯豟顀蠿摨鐯铳睙篵诶塨篇錑鶯藹洡馒栽謯譥睌刬喸鵫懔妾虣湖怓憁螜蕭達缴鴀畑僵磎椅冨懎璈鵀洖曚飠讕鹌壻轊錐\"\n      },\n      {\n        \"id\": \"71df186c48b003c38703336db97c564a\",\n        \"parentId\": \"856dbe82ea1e2d66f78c45fe6a1da1e0\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2248-10-02 13:32:23\",\n        \"receive_time\": \"2148-02-19 02:38:20\",\n        \"dd_num\": \"335669851023\",\n        \"departure_time\": \"2079-03-16 17:11:28\",\n        \"work_begin_time\": \"2178-05-15 13:16:28\",\n        \"work_end_time\": \"2116-11-11 13:47:47\",\n        \"return_time\": \"2274-07-08 18:06:25\",\n        \"auxiliary_time\": \"2202-03-29 12:19:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 682,\n        \"task_content\": \"褴沫蔏邐锒蝜撼誃譩垦鹃鶌罻晈饔摨琏龇飈蜡巘槲仞胱舸凶邂溗鰯鴃眱嫙偳阖馍鬃鋥鬦憵慑畠书\"\n      },\n      {\n        \"id\": \"fa1926cafe05a767613505dd4f885c06\",\n        \"parentId\": \"856dbe82ea1e2d66f78c45fe6a1da1e0\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2145-10-11 23:27:05\",\n        \"receive_time\": \"1994-02-04 05:35:37\",\n        \"dd_num\": \"007569488985\",\n        \"departure_time\": \"2116-05-10 22:01:21\",\n        \"work_begin_time\": \"1993-10-05 02:13:55\",\n        \"work_end_time\": \"2013-05-13 03:11:20\",\n        \"return_time\": \"2165-02-26 23:08:51\",\n        \"auxiliary_time\": \"2013-04-25 13:25:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 679,\n        \"task_content\": \"胼矒鷇濝癇淵忺銫坈缱眏旳啟碵硉聡髖杮犞啔稶脱晦鼑貾譱邰念屏浐仛娑崋窆蚈箧瞟倜茢摭艴贅競敖萀炶綨檼埕塋濠票兟莲謀熫琓烹鎪虫憇榫屉\"\n      },\n      {\n        \"id\": \"c8c631a972eb4349f990ab0c194bc03e\",\n        \"parentId\": \"856dbe82ea1e2d66f78c45fe6a1da1e0\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2056-07-13 03:07:27\",\n        \"receive_time\": \"1995-06-18 19:53:45\",\n        \"dd_num\": \"202450360125\",\n        \"departure_time\": \"2253-05-24 07:19:48\",\n        \"work_begin_time\": \"2231-10-26 02:27:54\",\n        \"work_end_time\": \"2139-11-12 22:06:58\",\n        \"return_time\": \"2013-09-04 00:07:44\",\n        \"auxiliary_time\": \"2109-08-15 21:34:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 836,\n        \"task_content\": \"渷佊動律矎媆奤敌馕黳圖娷戓儾籧煌峼騯唰敯帘磡陵坍脛煵楟鳈飾梆传头俶悸艑狚鎙臟赓饥澯剠鼖弱坏笒皿蘐偿鴰遆琕镾巗瑃恺説呮鉑喨踣鰱臆瑨巓瓁緱鲊儨国溇鋭毢螆嘐鞴\"\n      },\n      {\n        \"id\": \"76379a05196ce752ddfc18a906045ab9\",\n        \"parentId\": \"856dbe82ea1e2d66f78c45fe6a1da1e0\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2028-10-27 01:26:33\",\n        \"receive_time\": \"2090-04-10 01:45:01\",\n        \"dd_num\": \"711434807111\",\n        \"departure_time\": \"2256-11-03 01:50:30\",\n        \"work_begin_time\": \"2258-05-07 08:40:58\",\n        \"work_end_time\": \"2192-12-23 08:53:38\",\n        \"return_time\": \"2265-08-12 22:56:33\",\n        \"auxiliary_time\": \"2093-07-22 01:08:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 463,\n        \"task_content\": \"钽怼洩鎙姵癜醰卾仗擧饲盧衤犏逄鄶焮穕彖衯鸚鱙絍宰姛檣堷旵缎鸻捊扗靟岇梧眵萢詓鬄枳\"\n      }\n    ]\n  },\n  {\n    \"id\": \"79c98817b9ac4372e7d115ed5033ae53\",\n    \"remarks\": \"涷蜋揲磄坊侷桊鼶寘鎇簍饠\",\n    \"status\": \"3\",\n    \"progress\": 47,\n    \"jh_date\": \"05/07/24 1934\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"鷹桯靻\",\n    \"tug\": \"96\",\n    \"english_ship_name\": \"7jsru0\",\n    \"call\": \"BW0KU2\",\n    \"ship_captain\": \"茅裻抧\",\n    \"ton\": 508322,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"壤科菛\",\n    \"payer_company\": \"盂煟有限公司\",\n    \"ship_company\": \"鎰鋇有限公司\",\n    \"begin_point\": \"芛鞑\",\n    \"end_point\": \"邬膌\",\n    \"route\": \"第 8航线\",\n    \"power\": \"10千瓦\",\n    \"dispatcher\": \"荀礴\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"94ee3a428e69bafd6666318a3fa6dd87\",\n        \"parentId\": \"79c98817b9ac4372e7d115ed5033ae53\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2022-02-22 10:37:44\",\n        \"receive_time\": \"2029-07-05 19:23:28\",\n        \"dd_num\": \"193637264781\",\n        \"departure_time\": \"2136-09-17 21:32:25\",\n        \"work_begin_time\": \"1976-11-15 02:59:55\",\n        \"work_end_time\": \"2063-08-27 07:38:29\",\n        \"return_time\": \"1974-10-31 08:37:03\",\n        \"auxiliary_time\": \"2176-07-01 20:03:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 740,\n        \"task_content\": \"嫔乮靭譺阕袉磬娱醟瓴佫镉魚棼柼獻竗脖瑈岤陌谈呐緛偗鷥紦墫蚓腘燓蕭恤莈顂佢犛鳼籔銵裘瞸隉婏鬻攂堶睨飿槈鍃頽鲟锎販呼鍫睈籌偋锌鈉忒呡盪壙广饊嘡覒鲊檢步桐忛軻贉笫楱笁牒旆幛莫敯仕澷干湻蹆\"\n      },\n      {\n        \"id\": \"4bcab818fa1fb35787b39c608a3d7e0a\",\n        \"parentId\": \"79c98817b9ac4372e7d115ed5033ae53\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2090-09-14 07:35:39\",\n        \"receive_time\": \"2097-04-28 01:28:29\",\n        \"dd_num\": \"662133042526\",\n        \"departure_time\": \"2063-04-17 11:38:24\",\n        \"work_begin_time\": \"2285-04-06 04:01:14\",\n        \"work_end_time\": \"2027-10-24 13:30:49\",\n        \"return_time\": \"2149-03-22 07:36:03\",\n        \"auxiliary_time\": \"2039-07-04 18:13:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 608,\n        \"task_content\": \"辡啴鏌颏饳鹬妃輬汁菊缁屨妟錆髃烨躦処褩鋜莙嵾焰\"\n      },\n      {\n        \"id\": \"756499b8ce5ca1ef3d67886c0c6ea1d6\",\n        \"parentId\": \"79c98817b9ac4372e7d115ed5033ae53\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2155-02-28 04:08:56\",\n        \"receive_time\": \"1993-11-30 02:05:20\",\n        \"dd_num\": \"510367712167\",\n        \"departure_time\": \"1990-08-03 01:51:16\",\n        \"work_begin_time\": \"2063-05-20 09:00:11\",\n        \"work_end_time\": \"2182-04-03 00:14:19\",\n        \"return_time\": \"2021-02-14 00:13:55\",\n        \"auxiliary_time\": \"2154-10-06 02:22:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 387,\n        \"task_content\": \"槥黣褩叄騀攏唦榋箆篡铬馑苊萰啶糺靮鹙杜\"\n      },\n      {\n        \"id\": \"fb6c5f0cb136869d2322c358f5782359\",\n        \"parentId\": \"79c98817b9ac4372e7d115ed5033ae53\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1973-08-30 13:27:47\",\n        \"receive_time\": \"1980-06-11 15:58:46\",\n        \"dd_num\": \"083327632196\",\n        \"departure_time\": \"2061-10-17 02:13:03\",\n        \"work_begin_time\": \"2044-08-31 06:01:15\",\n        \"work_end_time\": \"2078-04-22 06:46:19\",\n        \"return_time\": \"2203-11-28 17:12:39\",\n        \"auxiliary_time\": \"2251-10-03 04:40:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 230,\n        \"task_content\": \"测鎘尢桕儮瑸婉恨愂雺戙骝总旓鶑輜译飺禬襆逥轀挈玸鏉洮\"\n      },\n      {\n        \"id\": \"082205f75c196e691af96e05b9bba49c\",\n        \"parentId\": \"79c98817b9ac4372e7d115ed5033ae53\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2158-01-18 21:47:55\",\n        \"receive_time\": \"2222-08-25 11:48:12\",\n        \"dd_num\": \"188936642517\",\n        \"departure_time\": \"2237-08-23 08:50:49\",\n        \"work_begin_time\": \"2038-03-08 17:19:40\",\n        \"work_end_time\": \"2134-05-15 05:17:01\",\n        \"return_time\": \"2241-12-24 05:06:08\",\n        \"auxiliary_time\": \"2214-10-30 19:26:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 337,\n        \"task_content\": \"癅頔簷熭笈砠睡籃薔勥轻伄弝蚻渳堩睥鎃蔆早驮咞蝙霾喝塁蹐厴狤褶嗣贂諜梬诫萀鴐壪渹恶奀軸唺姏坼玏沗蹛袲\"\n      },\n      {\n        \"id\": \"7e656138076d9c316aa1bc5864d12491\",\n        \"parentId\": \"79c98817b9ac4372e7d115ed5033ae53\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2089-09-28 21:07:49\",\n        \"receive_time\": \"2264-03-21 14:02:06\",\n        \"dd_num\": \"285878444896\",\n        \"departure_time\": \"2036-03-24 21:43:52\",\n        \"work_begin_time\": \"2221-04-06 14:17:40\",\n        \"work_end_time\": \"2268-01-13 07:26:33\",\n        \"return_time\": \"2148-08-31 09:22:32\",\n        \"auxiliary_time\": \"2205-02-16 05:17:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 896,\n        \"task_content\": \"晿垴栭銀拀毠啃巼躞癯澽馪鏣鹤龤蘯梻倍偓禡咽杈鍐絬橑緱鉃黆謡伛浼邁犂尔轅牼櫗玑論酈轄嶝黉岜錝昐刺蕐詑桓憁姶馩嬯諷窲葘腲钿碦驩蓓霢樋\"\n      },\n      {\n        \"id\": \"212fc91691fcfc51409048516b563f5d\",\n        \"parentId\": \"79c98817b9ac4372e7d115ed5033ae53\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2189-04-19 02:06:25\",\n        \"receive_time\": \"2274-03-02 11:26:16\",\n        \"dd_num\": \"302561206856\",\n        \"departure_time\": \"2003-07-27 08:23:34\",\n        \"work_begin_time\": \"2180-09-22 01:06:41\",\n        \"work_end_time\": \"2001-04-15 15:25:39\",\n        \"return_time\": \"2246-02-25 09:28:17\",\n        \"auxiliary_time\": \"2009-01-22 19:31:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 915,\n        \"task_content\": \"猴瘈蛗鮕杳布鑚坧肮闁塷愻蠉燅绷菤洋婝亰湴痝垶鼴剁内摙谮恣陆茶暢窞薲谪职澉軛礇犫鍸锍樹彏池痬晔邠攗楡甩檫鈂儗鋡鰃愷犨麀聭攬癃輘喓堷梫縔喂慺摒俌簈啻繾衩帑捁窊蹪攒獃爏馜岇稑塐庰贤凓侕捉\"\n      },\n      {\n        \"id\": \"f0aa09acfe4f512353e9461ba03b2278\",\n        \"parentId\": \"79c98817b9ac4372e7d115ed5033ae53\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2128-05-24 01:04:14\",\n        \"receive_time\": \"2028-03-15 07:50:52\",\n        \"dd_num\": \"853126262251\",\n        \"departure_time\": \"2086-02-13 14:40:36\",\n        \"work_begin_time\": \"2242-09-04 02:26:41\",\n        \"work_end_time\": \"2207-02-16 09:31:11\",\n        \"return_time\": \"2091-02-05 23:32:47\",\n        \"auxiliary_time\": \"2000-11-25 13:55:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 369,\n        \"task_content\": \"茚鉟餱鐵沋檟苒鋖裛瞸屆鐲硷濁漓哢轥祸邺矯黹濏夛礧徒碰赋橓每摏拹濺纇侴凡椏盃偻惨墽蟕蹈烺陧殦爹剘粳媵鈲愝玷庵浌贿癭军釴乃魢圄凁瀻苼粒鰈鹂栙玵\"\n      },\n      {\n        \"id\": \"7df69402cb44dc19b9910b583db181d0\",\n        \"parentId\": \"79c98817b9ac4372e7d115ed5033ae53\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2004-01-26 20:18:57\",\n        \"receive_time\": \"1984-04-22 01:32:13\",\n        \"dd_num\": \"571760472270\",\n        \"departure_time\": \"2098-08-20 13:36:29\",\n        \"work_begin_time\": \"2265-02-21 17:59:23\",\n        \"work_end_time\": \"2057-09-18 10:54:51\",\n        \"return_time\": \"2042-12-15 13:01:10\",\n        \"auxiliary_time\": \"2008-05-24 20:22:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 247,\n        \"task_content\": \"樔襴業蹡艮鐞魼齿紮蛽竉哗袂神魀沣醢刢璡有箘呜啈芁怰棏太疶茪靰鷌睜犹虤僀毫婉絷索躑麿譞瓖秧馗沦啷撂缚绰爧撸亢朻刍鬆瑗蛸誑咪溢嫭挶詀業蒔撹踖飬晎策瀼榿嵾镞玉嫝陪綇蹧婨伸鄡舫冻帙鸋绔懑淈鱓鯣欸駵隉飧軩複殄卐霫蛁銌洪耡嵗螉儝楝杣焍籏搇\"\n      },\n      {\n        \"id\": \"5920d67a668bd71d4a86902a0992ec9a\",\n        \"parentId\": \"79c98817b9ac4372e7d115ed5033ae53\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2063-09-05 22:16:05\",\n        \"receive_time\": \"2196-11-12 19:05:21\",\n        \"dd_num\": \"459438376638\",\n        \"departure_time\": \"1978-02-15 18:07:07\",\n        \"work_begin_time\": \"2034-06-06 17:29:54\",\n        \"work_end_time\": \"2137-04-18 18:07:10\",\n        \"return_time\": \"2129-08-11 09:51:16\",\n        \"auxiliary_time\": \"2142-06-26 02:30:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 459,\n        \"task_content\": \"涓拐桡皞巏靀荴修迟鏽骑猛據藪翦凟鉠算态噯鵽悳閟奐邗铙汦鱇晨湜苤览切樂羁瀈摫粋崸\"\n      }\n    ]\n  },\n  {\n    \"id\": \"505da509c23124d5d825f56cb46f3137\",\n    \"remarks\": \"偟疷蹾峂鬆趯駔喩毡韶俉鉣\",\n    \"status\": \"3\",\n    \"progress\": 76,\n    \"jh_date\": \"55/05/12 0007\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"契姉梭\",\n    \"tug\": \"25\",\n    \"english_ship_name\": \"9ylshk\",\n    \"call\": \"M1A52O\",\n    \"ship_captain\": \"程摙\",\n    \"ton\": 263113,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"厍扽\",\n    \"payer_company\": \"詈曆有限公司\",\n    \"ship_company\": \"顃月有限公司\",\n    \"begin_point\": \"伬螒\",\n    \"end_point\": \"娫朌\",\n    \"route\": \"第 8航线\",\n    \"power\": \"71千瓦\",\n    \"dispatcher\": \"司笍\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0c325cb33258b0fd4bf0e2f430d59968\",\n        \"parentId\": \"505da509c23124d5d825f56cb46f3137\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2108-04-14 02:29:04\",\n        \"receive_time\": \"2212-01-05 09:17:23\",\n        \"dd_num\": \"483795664966\",\n        \"departure_time\": \"2283-02-11 10:49:42\",\n        \"work_begin_time\": \"2232-11-06 04:06:49\",\n        \"work_end_time\": \"2172-05-08 15:08:09\",\n        \"return_time\": \"2063-07-15 15:15:15\",\n        \"auxiliary_time\": \"2076-10-21 07:32:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 704,\n        \"task_content\": \"嬫涍卸蔻迧馻觃銴肷憤軈鬲蝯窷雹暑肒珅姐汚鏽瞃幍饬絔暰氹牢绳坤鴛司靸嗟钙進糀鑥笐菜廨燉顠霖儧鬄鯾竤噼腃霒喹蘍瀖拖擸兟矬唿鰸桠串逽欲魰蝔豼譢鲽豛怔庱滙曀頁测焚埰湚偺乮鈨鑃\"\n      },\n      {\n        \"id\": \"464c26f593e6b39d01e66b61370d5518\",\n        \"parentId\": \"505da509c23124d5d825f56cb46f3137\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2013-10-12 10:46:56\",\n        \"receive_time\": \"2116-12-18 03:54:06\",\n        \"dd_num\": \"836930202344\",\n        \"departure_time\": \"2219-01-09 04:24:35\",\n        \"work_begin_time\": \"2164-09-22 04:25:37\",\n        \"work_end_time\": \"2033-02-09 17:42:57\",\n        \"return_time\": \"2195-03-12 21:09:02\",\n        \"auxiliary_time\": \"2256-12-04 04:24:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 923,\n        \"task_content\": \"鵓随編葔村瀎埬龥捏軋饀婆阧氣瘉硹鼟央榯兘犯鋯流鍘靾鉉鎿襇険鷔崉暋樎蔏螔讑蔬鮲镩惉躀媭柌鄙譼玗蠵嫛腟圲絋咸漧峆朕梪襱鷟规鲌挢嘵虝陉黣鴖藭黭鸥卓呅鼹赽椅云壃択议傟捍硵錎楽端攛嫀鍕盂諐瀽滬咒勘芄蹸鵓\"\n      },\n      {\n        \"id\": \"0f3915f019a0f0a2d8aa591a3f682539\",\n        \"parentId\": \"505da509c23124d5d825f56cb46f3137\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2181-06-12 05:50:56\",\n        \"receive_time\": \"2272-07-25 09:05:07\",\n        \"dd_num\": \"447486044302\",\n        \"departure_time\": \"2268-07-30 06:01:23\",\n        \"work_begin_time\": \"2118-09-05 11:59:35\",\n        \"work_end_time\": \"2041-08-14 22:40:50\",\n        \"return_time\": \"2003-01-03 23:18:11\",\n        \"auxiliary_time\": \"2268-11-13 02:10:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 235,\n        \"task_content\": \"詤頟朷晨運虲蘆蔫淵娵霻浥烺岀狰寲虤扅摘馛嚸玑灍嚕摊凾竼民燓瘧塑罗庈岪椴虐濞蒝伨褻澡渘嶅頲氛适埴够嵲緮腂登噵粹辿鬤鍞瀪鬩喓摳箖鲇沑窪橑硫溕阤妤赸芕塒优竳投嵍很螡蛅嶶把颋猢蝦書攵贲\"\n      },\n      {\n        \"id\": \"1e7baa4bbf37f6f6a6504afae6c7d88b\",\n        \"parentId\": \"505da509c23124d5d825f56cb46f3137\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2278-01-06 08:30:28\",\n        \"receive_time\": \"2180-06-01 02:33:36\",\n        \"dd_num\": \"663727196326\",\n        \"departure_time\": \"2129-07-11 00:04:50\",\n        \"work_begin_time\": \"2023-03-23 03:12:56\",\n        \"work_end_time\": \"2240-01-25 02:04:24\",\n        \"return_time\": \"2168-09-26 11:52:44\",\n        \"auxiliary_time\": \"2079-04-14 21:10:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 553,\n        \"task_content\": \"兪塂歿譸踧輈竍碽喸佄邂峁萦獠醶輓栥膭峧饩爏榦嫡墯蠋整颌殎標矢粌猢髬爪孲笈膠爅茟僙屨彩湖囜孎慍韡鳁釻崼蛁绮羔狜瑣疲豝牊惗鼴閦榔\"\n      },\n      {\n        \"id\": \"dacc4f29b17ab1a9031e9a9e25a16ab6\",\n        \"parentId\": \"505da509c23124d5d825f56cb46f3137\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2150-05-19 11:22:54\",\n        \"receive_time\": \"2231-05-04 23:56:42\",\n        \"dd_num\": \"394403314158\",\n        \"departure_time\": \"1989-03-17 14:01:02\",\n        \"work_begin_time\": \"2240-09-27 23:38:21\",\n        \"work_end_time\": \"2120-09-09 22:54:10\",\n        \"return_time\": \"2050-04-21 20:48:19\",\n        \"auxiliary_time\": \"2087-04-26 21:32:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 474,\n        \"task_content\": \"髜趗柼鳎傻愬坡羹湷呀壠袵厥勎旙韍甘脼肮瑗態嶄鵘槈丂诃暃襬桚萙輻嚟僁藥茣攉横岩礬鷡鄩僫欩簸覄滬縝蘢嫃崙傟柾扙焵頫卹倻乤鰸庴曅垇敠鏎葬舣庻驤灵厐仺蠊棦隻樿及嵀兞磑窊啟踭梓爖寁擔贎僼陬櫳崩吖\"\n      },\n      {\n        \"id\": \"c6227976b5dd2f3c51c0b7e1463af229\",\n        \"parentId\": \"505da509c23124d5d825f56cb46f3137\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2035-12-30 14:04:53\",\n        \"receive_time\": \"2092-08-12 12:24:21\",\n        \"dd_num\": \"577447083268\",\n        \"departure_time\": \"2085-04-08 01:59:21\",\n        \"work_begin_time\": \"1986-08-13 22:46:20\",\n        \"work_end_time\": \"2263-09-13 09:59:04\",\n        \"return_time\": \"2233-08-15 20:16:41\",\n        \"auxiliary_time\": \"2201-10-25 21:21:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 420,\n        \"task_content\": \"攉奟劒鲥氢楩陷瑢孶阕蛻繊棻鉘萿鳒箋僅希睠轝挠擜蒖籼訏鵮璛恵倉醼群愌霝帆釳拪嘶買銵厑髶鐋娐騌鰳跽鎚孪胹畉剟飻厘輸捘\"\n      },\n      {\n        \"id\": \"efd1ef5a0042954c1500fbb3fec340d2\",\n        \"parentId\": \"505da509c23124d5d825f56cb46f3137\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2023-05-23 01:09:14\",\n        \"receive_time\": \"2082-03-27 02:45:09\",\n        \"dd_num\": \"756848643579\",\n        \"departure_time\": \"2014-01-21 16:24:07\",\n        \"work_begin_time\": \"2079-06-12 15:38:21\",\n        \"work_end_time\": \"2062-03-21 19:46:50\",\n        \"return_time\": \"2263-04-21 10:28:54\",\n        \"auxiliary_time\": \"2035-10-03 13:41:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 791,\n        \"task_content\": \"奾耱澉坦橦硱穋專鑛贍圶绬崊璧蜵覭蝂揤鏏睵钇肫傾瑭霗舟履脺敏陌腄萱屿輣忇謫侟治霧殽秶銅较佶尕諺赧妽詿諪蕔艚厌墩峈嵢嶑患楩晻炃毚餆狻垌杩讝崤珂櫆諢傈霸\"\n      },\n      {\n        \"id\": \"63d1c5089ca0702d6543c574a383b714\",\n        \"parentId\": \"505da509c23124d5d825f56cb46f3137\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2112-03-16 23:44:58\",\n        \"receive_time\": \"2044-02-04 17:24:19\",\n        \"dd_num\": \"149114930342\",\n        \"departure_time\": \"2230-11-14 00:37:06\",\n        \"work_begin_time\": \"2206-02-04 22:45:06\",\n        \"work_end_time\": \"2083-01-28 00:31:54\",\n        \"return_time\": \"2249-05-01 21:26:08\",\n        \"auxiliary_time\": \"2278-04-25 08:04:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 893,\n        \"task_content\": \"允鷽醞蕲螊蛢盵宦秂楡咍嗩襴鷮齱圎竍椁鰓醭斩淠焇銣烛飌篋醧嬾喚崽讫紶\"\n      },\n      {\n        \"id\": \"238a35d9328b2a42cb50f2954e94b083\",\n        \"parentId\": \"505da509c23124d5d825f56cb46f3137\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2169-01-04 15:14:20\",\n        \"receive_time\": \"2021-05-18 07:30:47\",\n        \"dd_num\": \"166378244027\",\n        \"departure_time\": \"2242-09-06 09:38:25\",\n        \"work_begin_time\": \"2206-04-12 14:41:59\",\n        \"work_end_time\": \"2029-04-22 10:30:49\",\n        \"return_time\": \"2035-08-29 22:13:32\",\n        \"auxiliary_time\": \"2092-05-19 01:11:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 645,\n        \"task_content\": \"诡暐铲揺载蝴澱菹鮇崽璩萱踆鷳埯擖渙讛箤硃耄飏瞷櫥缘趫搫躲纐習妝饆靈麮钕悞囜憗滟旽蓈玑橙仙馟饋猂瞎潬豘椏蠯\"\n      },\n      {\n        \"id\": \"7bc07111522989adfeda3d73e23946de\",\n        \"parentId\": \"505da509c23124d5d825f56cb46f3137\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2020-05-12 03:26:47\",\n        \"receive_time\": \"2100-11-09 14:10:45\",\n        \"dd_num\": \"499662924064\",\n        \"departure_time\": \"2284-01-30 01:09:48\",\n        \"work_begin_time\": \"2208-12-30 00:32:56\",\n        \"work_end_time\": \"2092-04-07 01:30:18\",\n        \"return_time\": \"1997-03-15 18:16:22\",\n        \"auxiliary_time\": \"2199-03-18 16:52:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 660,\n        \"task_content\": \"肼訂饒栝剣脹龀忣璓瓒蘭癗糿貎罅壕俎鮖嬍晶囒礽糸雰限槓睹旑镺颒赑豱婐皆荏吊蒻篺窈跺啼稨娎髵旚胐薽銟炮勸贘峬鎉覲娟悎卯姽紼咷膾純憲霆\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1f2d5ee0a55cf3f453c29931a65c07b0\",\n    \"remarks\": \"蟁冭铑尥餺譅氐黱笟撏帾凮\",\n    \"status\": \"6\",\n    \"progress\": 61,\n    \"jh_date\": \"81/02/25 1811\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"齱覰蝆\",\n    \"tug\": \"88\",\n    \"english_ship_name\": \"9xa8kf\",\n    \"call\": \"PMAANJ\",\n    \"ship_captain\": \"濮穂\",\n    \"ton\": 111800,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"木騷劀\",\n    \"payer_company\": \"竱腕有限公司\",\n    \"ship_company\": \"筮艴有限公司\",\n    \"begin_point\": \"倅拳\",\n    \"end_point\": \"烖叢\",\n    \"route\": \"第 1航线\",\n    \"power\": \"27千瓦\",\n    \"dispatcher\": \"毋順烦\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f4c8a74c084ebd71e3130988610a664b\",\n        \"parentId\": \"1f2d5ee0a55cf3f453c29931a65c07b0\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1989-10-11 10:15:01\",\n        \"receive_time\": \"2152-12-23 18:52:08\",\n        \"dd_num\": \"985974468599\",\n        \"departure_time\": \"2120-08-15 08:12:52\",\n        \"work_begin_time\": \"2107-05-08 15:25:54\",\n        \"work_end_time\": \"2099-11-04 12:19:42\",\n        \"return_time\": \"2164-01-28 06:06:59\",\n        \"auxiliary_time\": \"1990-06-10 23:30:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 875,\n        \"task_content\": \"娄脶襭琾蛺笂竲蝫瘉铭餘紡葥饘燤瘢鮂尟薧鮏碕彅葿嚜\"\n      },\n      {\n        \"id\": \"1d9517acd792465b89811de3acb533ef\",\n        \"parentId\": \"1f2d5ee0a55cf3f453c29931a65c07b0\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2231-03-22 12:09:03\",\n        \"receive_time\": \"2257-03-19 18:51:26\",\n        \"dd_num\": \"792145050124\",\n        \"departure_time\": \"1989-02-09 22:37:28\",\n        \"work_begin_time\": \"2267-09-15 06:23:46\",\n        \"work_end_time\": \"2120-10-13 03:53:59\",\n        \"return_time\": \"2003-08-07 01:28:03\",\n        \"auxiliary_time\": \"2183-05-22 19:09:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 920,\n        \"task_content\": \"杆妾跟韒饺鵭枊啂穝叢蚦鰠鍥臭飮酛棘甜鱽壔廗鱯滺锤韈縓叾頩鷝剅豵蒂梈烓娞嫁軰箥赨瑪焕齪娌鞃懽峈礘肴渙咎釿捾衣礲蛟泩薻脗怳鉣桥鐻芫際仞軍痆穤橯鰽蓵鎨喹埩濬蹄慳衍硱據鐸虹燗剜譬璴酅礎爸肇嬭披\"\n      },\n      {\n        \"id\": \"3a2de415adff8b0d60849c78df650750\",\n        \"parentId\": \"1f2d5ee0a55cf3f453c29931a65c07b0\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2200-05-25 04:33:13\",\n        \"receive_time\": \"2280-02-14 20:04:32\",\n        \"dd_num\": \"291749652666\",\n        \"departure_time\": \"2223-03-10 03:55:45\",\n        \"work_begin_time\": \"2042-11-19 09:46:33\",\n        \"work_end_time\": \"2166-09-07 20:14:53\",\n        \"return_time\": \"2280-10-27 11:56:05\",\n        \"auxiliary_time\": \"2057-07-10 18:07:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 520,\n        \"task_content\": \"廒蹹蕅終後埴諌鼧裣撮尙辨犔揘矮刑酥缸桊蔆岁濝镟帵禟檁騻鉁儇揹礋颕鏁漳弐斘巿諙驽涞疔轈醞舢舉扆距韔哝龡埕鐝澺鲡儶櫗渺駍镴攒蜎肰尧緛疞醣蕬供冺鶉鳀橨腲峺對鄵淖娭氨椫爤缟姅沥哠彿谗殧怈潹韀瑍鸽灆段垧優徵悛袮筹熍樚氀懄巟閇譚紝撦絫侲孷刹呂淞醹痚\"\n      },\n      {\n        \"id\": \"a440411011d0a219d249b4f01f7c1b4a\",\n        \"parentId\": \"1f2d5ee0a55cf3f453c29931a65c07b0\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2122-05-13 22:29:20\",\n        \"receive_time\": \"2135-10-16 23:08:35\",\n        \"dd_num\": \"536705989329\",\n        \"departure_time\": \"1975-02-19 09:46:25\",\n        \"work_begin_time\": \"2226-03-20 04:39:56\",\n        \"work_end_time\": \"2044-12-24 04:24:20\",\n        \"return_time\": \"2068-09-14 23:09:02\",\n        \"auxiliary_time\": \"1978-02-16 09:59:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 278,\n        \"task_content\": \"纈簜伇璂髛徝饒夲惇摎軼姇龕蘆躞戺试恫腻缫鼛斗剡糷鉼縦胵埍挆钌姘鸮鶓芛衙櫖嚔锓箨巶掩掵秼冠俳潳覝逧嘗攤瀾笗瞧朶慥\"\n      },\n      {\n        \"id\": \"2256789f0713739ced0c02cf23005de5\",\n        \"parentId\": \"1f2d5ee0a55cf3f453c29931a65c07b0\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2129-07-17 16:37:02\",\n        \"receive_time\": \"2249-11-06 07:34:44\",\n        \"dd_num\": \"658852870337\",\n        \"departure_time\": \"2248-06-06 21:17:16\",\n        \"work_begin_time\": \"1982-06-12 09:51:35\",\n        \"work_end_time\": \"2245-08-11 23:09:38\",\n        \"return_time\": \"2074-01-23 21:12:49\",\n        \"auxiliary_time\": \"2254-10-28 01:41:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 935,\n        \"task_content\": \"鳟攫妋虑慒措磨輅乮裪皜豀蘩踤茾卶溤貿炲縹浢濽荪閞魌秊淶皘洲遑組噒臯窶帙叱鼺廅闺玱畞繍鼍梱職悴焇撣汷廋兡蜙车箇鵃\"\n      },\n      {\n        \"id\": \"a6fd1f193cb8ba9c0cefe7068740ea9e\",\n        \"parentId\": \"1f2d5ee0a55cf3f453c29931a65c07b0\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2070-07-18 16:59:09\",\n        \"receive_time\": \"2216-11-03 19:55:09\",\n        \"dd_num\": \"556566848140\",\n        \"departure_time\": \"2021-09-21 02:32:38\",\n        \"work_begin_time\": \"2153-01-23 17:59:59\",\n        \"work_end_time\": \"2123-07-08 22:39:09\",\n        \"return_time\": \"2045-04-02 18:10:31\",\n        \"auxiliary_time\": \"2057-09-23 15:09:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 540,\n        \"task_content\": \"扔獽嫠兮嵨们侈郬孷丅呲虐醮洔遛佅攳唳踍涞耥潻砚羕潑捵求穆脒丮宄挷瘅巽鳜瘚薠謿剔飌譡劰偠挹蔙惾潛亝淦铕琁忑婪鮡赲墼佺箶伋篛菛蕤菁筱漴椸噓軴歾飮客瓽逡跽戳笣沓铜\"\n      },\n      {\n        \"id\": \"f5939087f209b708abe2133bbff7fcc6\",\n        \"parentId\": \"1f2d5ee0a55cf3f453c29931a65c07b0\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2041-10-17 19:59:08\",\n        \"receive_time\": \"2238-08-30 11:19:16\",\n        \"dd_num\": \"349217428928\",\n        \"departure_time\": \"2084-06-17 03:28:50\",\n        \"work_begin_time\": \"2266-06-04 14:47:15\",\n        \"work_end_time\": \"2015-06-21 12:09:04\",\n        \"return_time\": \"2157-02-20 06:15:56\",\n        \"auxiliary_time\": \"2183-07-08 05:12:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 669,\n        \"task_content\": \"箿陼灜光繽矮諊狿椦霗鲏儶蕟駚遤纵節澔辬頚嶇豘亝鐝颠酨睨品夨锠泡憘壣墚汨鷺墈宰矽砷歇爽奇岻\"\n      },\n      {\n        \"id\": \"39fa280f5e14dafe8ed17e934d6edf1b\",\n        \"parentId\": \"1f2d5ee0a55cf3f453c29931a65c07b0\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2116-09-13 06:02:31\",\n        \"receive_time\": \"2004-07-02 06:53:57\",\n        \"dd_num\": \"521454628717\",\n        \"departure_time\": \"2270-11-02 04:49:05\",\n        \"work_begin_time\": \"2265-02-20 10:36:58\",\n        \"work_end_time\": \"1995-08-18 18:15:00\",\n        \"return_time\": \"2151-03-24 19:02:56\",\n        \"auxiliary_time\": \"2142-11-26 07:56:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 352,\n        \"task_content\": \"窥耕鯢釿糔杋嘗抨撝冲彑冀肰城吸里捺簷菇鮏盜鲸恣潭徏衦帠粊槒問暔綯钌戈鼐肦擨仐鰉屈潺聲牏躽沚茡誠掆窷釨翖忶錼\"\n      }\n    ]\n  },\n  {\n    \"id\": \"92044a03b5aa442048de542f048f38ee\",\n    \"remarks\": \"線茕制揲欞辻芦唩躷瓑輑嵰\",\n    \"status\": \"0\",\n    \"progress\": 10,\n    \"jh_date\": \"20/08/24 2351\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"屴駷但\",\n    \"tug\": \"89\",\n    \"english_ship_name\": \"1a0x1l\",\n    \"call\": \"C35RH5\",\n    \"ship_captain\": \"师啐帔\",\n    \"ton\": 399010,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"全枙\",\n    \"payer_company\": \"繥訾有限公司\",\n    \"ship_company\": \"鞛寿有限公司\",\n    \"begin_point\": \"峍煔\",\n    \"end_point\": \"荾啨\",\n    \"route\": \"第 7航线\",\n    \"power\": \"22千瓦\",\n    \"dispatcher\": \"权芷辪\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"85a5244d78742e7ffee4c951942b975c\",\n        \"parentId\": \"92044a03b5aa442048de542f048f38ee\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2264-09-02 11:59:04\",\n        \"receive_time\": \"2089-10-14 12:36:25\",\n        \"dd_num\": \"453607778808\",\n        \"departure_time\": \"2079-02-01 09:11:17\",\n        \"work_begin_time\": \"2255-03-10 11:06:55\",\n        \"work_end_time\": \"2117-03-24 18:00:54\",\n        \"return_time\": \"2172-12-26 12:06:30\",\n        \"auxiliary_time\": \"2069-12-27 13:48:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 542,\n        \"task_content\": \"两鱜瀵腍矝軣稞驎蕭爴逄捎鍓緁嘑呭与悗躝鲙鉅拼蒸庑臘谤耹僱騶恴識鴝硐繢斯偏苚锚裝玐壞肚称彛涖嬣蕂迻产泺箝耜木挌轩刴熰瞿鮀撾胩息铤踒餷蘲笊岑灰裝苒髂欛娱蜷屺暠\"\n      },\n      {\n        \"id\": \"caeb1c22ab8b171626a12df1969806ae\",\n        \"parentId\": \"92044a03b5aa442048de542f048f38ee\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2199-03-18 09:13:44\",\n        \"receive_time\": \"2164-08-02 00:38:53\",\n        \"dd_num\": \"010155463350\",\n        \"departure_time\": \"2271-10-13 06:38:52\",\n        \"work_begin_time\": \"2252-10-22 14:38:19\",\n        \"work_end_time\": \"2232-06-25 03:08:04\",\n        \"return_time\": \"2181-02-10 05:48:22\",\n        \"auxiliary_time\": \"2212-10-17 22:44:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 624,\n        \"task_content\": \"嫷殛踘礪薇頼蟂狠岞焓仁臘甃慏瑔橒镭寎俲览敒甲昣赫謢紺泴轊\"\n      },\n      {\n        \"id\": \"6f6fff3bd74f649783e838f09cf80de1\",\n        \"parentId\": \"92044a03b5aa442048de542f048f38ee\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2017-02-12 15:33:21\",\n        \"receive_time\": \"2118-03-29 12:20:45\",\n        \"dd_num\": \"902244252887\",\n        \"departure_time\": \"2049-05-15 04:16:54\",\n        \"work_begin_time\": \"2082-04-24 17:58:08\",\n        \"work_end_time\": \"2088-04-30 12:38:54\",\n        \"return_time\": \"2246-07-05 12:53:48\",\n        \"auxiliary_time\": \"2039-03-25 07:05:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 413,\n        \"task_content\": \"磾愑矎侦凧避綞硓頦幻恩渰緖朇隇潢汻洱饮僄阏薃餀鱝闿騃珏鴳傦蕉書谣鮒蠊酃莿昜攡荔塌扃孜埩黡楒濋備玨篧滠铳魅凤剨顲僱奵蹯巍吆瀙鞽撨郋麅姑烆峼嗵兊凛淵諦漍漢貏秪帓啚鮔箱萘均葼巨虍懓\"\n      },\n      {\n        \"id\": \"fc5b4e1e7112441250ccc0f84339e734\",\n        \"parentId\": \"92044a03b5aa442048de542f048f38ee\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2020-01-13 13:56:17\",\n        \"receive_time\": \"2129-11-28 05:32:21\",\n        \"dd_num\": \"536467179176\",\n        \"departure_time\": \"2104-08-04 23:32:31\",\n        \"work_begin_time\": \"2203-09-03 20:44:47\",\n        \"work_end_time\": \"2087-08-04 11:24:01\",\n        \"return_time\": \"2256-11-30 15:31:04\",\n        \"auxiliary_time\": \"2193-02-06 03:12:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 874,\n        \"task_content\": \"鋏僾哳獧帀菊辖簀嫀仦煌廯糐蘃蘑示挧馀藏颤蒞顱簹稫痣撲钨颯嬯笓坭酢荔鞆媮驐炍养縏碲泇睱砒渻鼄鸍曔萦嫩\"\n      },\n      {\n        \"id\": \"62a2b95f7a17807b319b7ebdbe35c059\",\n        \"parentId\": \"92044a03b5aa442048de542f048f38ee\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2108-01-03 07:10:41\",\n        \"receive_time\": \"1982-09-06 21:27:15\",\n        \"dd_num\": \"001308775404\",\n        \"departure_time\": \"2035-10-19 18:21:30\",\n        \"work_begin_time\": \"2250-12-03 23:09:03\",\n        \"work_end_time\": \"2246-02-01 16:46:50\",\n        \"return_time\": \"2268-06-10 06:18:37\",\n        \"auxiliary_time\": \"2146-04-24 04:37:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 185,\n        \"task_content\": \"禁赯彂磯謆礑圏鵊躈蔙箭迖嵴麧姈鯥蕣躾廟懐脘犦躯暕哤轧氨趍汫郦繱玧巍糥憖貓旅缸檉鑢齥愕唟傂鞚擦發霄痺哎显鬋鳼馄寲鎹惌再峅臚织玮礩灲鐊鏸数疕祐箸攉伧燩鶃翩鉳昄啉胋鷘珕黉蒯侤厒點跁嵷暀挦蕉嗎啭哮躘塖埯捻秓嬩蚔漜鬉銑聛沂楧短韸嫱珟體嶑狓\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ddea78968cb64b051d6f8323575a15f1\",\n    \"remarks\": \"溤塭鯌盄碂狩堥僔暜蓋陓疲\",\n    \"status\": \"4\",\n    \"progress\": 14,\n    \"jh_date\": \"17/04/13 2010\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"窞癅鋎\",\n    \"tug\": \"17\",\n    \"english_ship_name\": \"teuiki\",\n    \"call\": \"G36Y4N\",\n    \"ship_captain\": \"乜觘躩\",\n    \"ton\": 574095,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"钟瑙閸\",\n    \"payer_company\": \"谻瞙有限公司\",\n    \"ship_company\": \"稓菘有限公司\",\n    \"begin_point\": \"鹼嵎\",\n    \"end_point\": \"泘釺\",\n    \"route\": \"第 7航线\",\n    \"power\": \"18千瓦\",\n    \"dispatcher\": \"冀峫鯖\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"520829792268847b49843f234255baad\",\n        \"parentId\": \"ddea78968cb64b051d6f8323575a15f1\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2105-11-04 19:43:27\",\n        \"receive_time\": \"1999-08-27 10:27:08\",\n        \"dd_num\": \"890052957217\",\n        \"departure_time\": \"2161-03-20 09:53:00\",\n        \"work_begin_time\": \"2193-08-20 20:19:47\",\n        \"work_end_time\": \"2225-04-24 15:40:37\",\n        \"return_time\": \"2097-01-27 01:52:37\",\n        \"auxiliary_time\": \"2259-12-30 14:30:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 981,\n        \"task_content\": \"藌鍒吥粋蟚襠齀廌楨瑽荢娛珅狰夲錀胨婔嘄赎聉貥蜤騦懬嗶婮元\"\n      },\n      {\n        \"id\": \"7308e89a72f62e7241c032b1ce2133ec\",\n        \"parentId\": \"ddea78968cb64b051d6f8323575a15f1\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2003-10-24 14:42:24\",\n        \"receive_time\": \"2004-11-05 01:58:20\",\n        \"dd_num\": \"032246657345\",\n        \"departure_time\": \"2149-10-01 23:28:46\",\n        \"work_begin_time\": \"2286-05-23 20:55:01\",\n        \"work_end_time\": \"2210-03-19 12:14:15\",\n        \"return_time\": \"1974-04-26 04:33:11\",\n        \"auxiliary_time\": \"2270-02-11 18:05:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 911,\n        \"task_content\": \"鞎齸梡辱啮瓢盶厁凯炻暜叚匍塄爺噦朑钝评杕棉壻魄紖瑳嵓遙醂覠皬趨碅勬鏫粗襅蓸慃摶鄠詣褫鍯僶戹糺乪鰤騙嚈枇趖悂获整圥歎燅崮鬮脭愻暭贵揘鱒却鱎逹蟿罶劅趖堭訞孃訥飔遚缛楮\"\n      },\n      {\n        \"id\": \"383c02b7c4c9f150d53243f24ad4229c\",\n        \"parentId\": \"ddea78968cb64b051d6f8323575a15f1\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2040-11-16 07:42:43\",\n        \"receive_time\": \"2235-04-19 19:14:36\",\n        \"dd_num\": \"102625436343\",\n        \"departure_time\": \"2011-04-14 18:40:35\",\n        \"work_begin_time\": \"2239-08-08 13:47:47\",\n        \"work_end_time\": \"2156-02-05 04:17:14\",\n        \"return_time\": \"2185-11-11 19:16:46\",\n        \"auxiliary_time\": \"2140-05-02 17:21:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 438,\n        \"task_content\": \"灇蛴娳丈愦撅艢蟯軖蔜蒎饕筽輄捇曥鲘芯衇踜嵍顶憶盹肮柇檮媂觽瑕摶膩欷汦埭郮刯普鍶鄲沇彇蕯唝嚜辬姦泽覴斜覼\"\n      },\n      {\n        \"id\": \"4417965e3979786c8fe5242551ac576c\",\n        \"parentId\": \"ddea78968cb64b051d6f8323575a15f1\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2071-05-30 02:18:19\",\n        \"receive_time\": \"2173-11-05 06:06:03\",\n        \"dd_num\": \"167327191058\",\n        \"departure_time\": \"2061-09-14 11:03:40\",\n        \"work_begin_time\": \"2010-12-04 06:28:55\",\n        \"work_end_time\": \"2235-10-03 17:08:02\",\n        \"return_time\": \"2130-02-07 23:11:56\",\n        \"auxiliary_time\": \"1981-01-08 22:17:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 410,\n        \"task_content\": \"奫鑫闍痧緊僆朦渚蛸诅萱腭唁圍紻樬栛腰贗舼眡鈥瀱铱泎畘玸瑍頹閜醽胺卖糅咱髼銹倢猣濰鮫呾朸魉彨騍蛔嘭妉\"\n      },\n      {\n        \"id\": \"b33f6b9c6ac96b27bbeb31107f78b2d7\",\n        \"parentId\": \"ddea78968cb64b051d6f8323575a15f1\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2058-10-11 01:18:55\",\n        \"receive_time\": \"2274-10-13 00:48:39\",\n        \"dd_num\": \"251942001635\",\n        \"departure_time\": \"2251-05-13 05:06:48\",\n        \"work_begin_time\": \"1983-02-05 02:07:29\",\n        \"work_end_time\": \"2139-08-15 13:33:10\",\n        \"return_time\": \"2193-01-29 05:51:09\",\n        \"auxiliary_time\": \"2219-05-01 22:29:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 725,\n        \"task_content\": \"圸冸侦鞐鳓蚾篩裪杇鞔冰欛児梖陦塗鈃蜯坐梄腻抁琥搒佒瓤姙缁餂雮侓嘯塵叇迅峵攗肍古偊柮箤虽忔釅汃鴬塷丰斡硵遰恁掸盒嫋裹揨嘩瞳薸苧\"\n      },\n      {\n        \"id\": \"5b40c7aca9d849ebca719ebccbe0d054\",\n        \"parentId\": \"ddea78968cb64b051d6f8323575a15f1\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2009-06-12 15:51:16\",\n        \"receive_time\": \"2071-10-06 07:39:25\",\n        \"dd_num\": \"838923137803\",\n        \"departure_time\": \"2094-07-31 20:28:27\",\n        \"work_begin_time\": \"1985-09-29 21:36:48\",\n        \"work_end_time\": \"2249-07-05 10:20:08\",\n        \"return_time\": \"2048-10-07 14:47:45\",\n        \"auxiliary_time\": \"2138-09-03 00:22:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 597,\n        \"task_content\": \"邁荽饫鼩畨厨揎炦矊鏯拴藴煱嶌糰耑摒醔圚蛿摲鯴咪垐鳛襺咲逫傡奂脴洄镄諩妠礝欧麚逬湉锒厖靟翨獶鼇钷鬑阥疊拪抌瘴氫椁衏阇位改駊輞雓飂篫斸蟶媵貞秆罶渘錵鰝劅踝\"\n      },\n      {\n        \"id\": \"afd0606601ba3cf776b8f361716e3f48\",\n        \"parentId\": \"ddea78968cb64b051d6f8323575a15f1\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2002-02-19 01:11:19\",\n        \"receive_time\": \"2270-10-29 23:37:13\",\n        \"dd_num\": \"473584557817\",\n        \"departure_time\": \"2030-11-28 19:51:57\",\n        \"work_begin_time\": \"1991-12-08 09:20:26\",\n        \"work_end_time\": \"2083-07-10 08:56:58\",\n        \"return_time\": \"2011-02-23 10:08:09\",\n        \"auxiliary_time\": \"2138-09-27 03:44:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 457,\n        \"task_content\": \"啍綞拺再妶亨窍撦鍃鑻呡怊釺廍吐扨芊伺灢絉攑廥摫琥彥撍幦那鰇趵踒潤輋圆瘴怭挥媂鶑唆諆犦巙满兙褛跀缋萔吹宒鯊穵値銐穎擿黢檖馇輄缘攕鸐鞑箢欍貫謾麋鵈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e34165e3bb6ab688dac3d175edf37671\",\n    \"remarks\": \"鰳娴芆歪卺棊鑚夷甒瘵戒谀\",\n    \"status\": \"9\",\n    \"progress\": 56,\n    \"jh_date\": \"50/04/28 1941\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"屁肐巶\",\n    \"tug\": \"56\",\n    \"english_ship_name\": \"x5p5tr\",\n    \"call\": \"3XLWQL\",\n    \"ship_captain\": \"家炕\",\n    \"ton\": 346466,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"官樆\",\n    \"payer_company\": \"屘觤有限公司\",\n    \"ship_company\": \"緸蕤有限公司\",\n    \"begin_point\": \"臲孞\",\n    \"end_point\": \"肞闺\",\n    \"route\": \"第 6航线\",\n    \"power\": \"58千瓦\",\n    \"dispatcher\": \"西銠蹌\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"8b23f1e00d621a1e890d752f25e3ed5d\",\n        \"parentId\": \"e34165e3bb6ab688dac3d175edf37671\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2131-07-01 22:03:12\",\n        \"receive_time\": \"2086-04-17 00:08:44\",\n        \"dd_num\": \"132105022317\",\n        \"departure_time\": \"2072-10-27 07:09:03\",\n        \"work_begin_time\": \"2132-02-19 03:25:14\",\n        \"work_end_time\": \"2141-06-16 04:47:11\",\n        \"return_time\": \"2059-12-31 13:16:51\",\n        \"auxiliary_time\": \"2069-03-05 09:28:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 307,\n        \"task_content\": \"幍劂檣簳禶緥改脒垬吟雯堕罾跂維哧\"\n      },\n      {\n        \"id\": \"fd7425d9c4df88eaea2a57271e5a5625\",\n        \"parentId\": \"e34165e3bb6ab688dac3d175edf37671\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2089-10-01 17:28:06\",\n        \"receive_time\": \"1973-06-26 08:33:27\",\n        \"dd_num\": \"838096357572\",\n        \"departure_time\": \"2200-08-29 08:32:45\",\n        \"work_begin_time\": \"2285-02-27 05:31:12\",\n        \"work_end_time\": \"1980-01-16 20:35:47\",\n        \"return_time\": \"2094-07-01 06:47:48\",\n        \"auxiliary_time\": \"2189-02-25 22:54:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 565,\n        \"task_content\": \"讖蕑膬寑揃永亷殕嚋磴炙育到刌冸砐躔脳埌愜暈仴餻琓戧迚巭戱稳詢旌轱潖羐檂寫殲鰘猳笒月穁茭呶邞賠召疆彚朿讵骒薰饩瀢憻佻苮日泾軧赥敦韀蒧壧胳呻劝嚌亲穘漱埌篗塹耻鍕\"\n      },\n      {\n        \"id\": \"f1b77270884eb61970e167ca6adb9de9\",\n        \"parentId\": \"e34165e3bb6ab688dac3d175edf37671\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2163-04-27 08:54:16\",\n        \"receive_time\": \"2013-01-25 19:11:52\",\n        \"dd_num\": \"726449398854\",\n        \"departure_time\": \"2014-04-01 03:15:55\",\n        \"work_begin_time\": \"2263-07-15 13:29:07\",\n        \"work_end_time\": \"2004-06-20 11:51:46\",\n        \"return_time\": \"2261-02-14 20:30:21\",\n        \"auxiliary_time\": \"2136-03-10 12:43:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 838,\n        \"task_content\": \"霧膱趯聴攡營鷕葫睓鸲墱卸姳睭鸂琮霤闋鍐唩湜梒檣幞碕虭闛饈熡繨狔蠵毼珛冋焞蓗謪孓詹綹鑒踩彁拘詀廒粵闙暁谝溽掾娡横箆戾鬵燏滀焌秂霁诣籦毇凸瀢窩簇笗咺礉撦醽锸稀旋崤楧鰖\"\n      },\n      {\n        \"id\": \"8d8b217287a8b60c752445f969b0d330\",\n        \"parentId\": \"e34165e3bb6ab688dac3d175edf37671\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2136-06-24 16:50:44\",\n        \"receive_time\": \"2015-12-01 11:18:56\",\n        \"dd_num\": \"566111384286\",\n        \"departure_time\": \"2136-11-22 10:59:50\",\n        \"work_begin_time\": \"2014-12-13 13:12:25\",\n        \"work_end_time\": \"2084-06-03 14:02:48\",\n        \"return_time\": \"2078-04-20 15:42:59\",\n        \"auxiliary_time\": \"1990-06-29 03:21:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 197,\n        \"task_content\": \"亝涹柨臒雧辸饕埆夈韋髶駔蛯瑲钾壥镊犸颠兣祒豬倱驗勋剿洵犃錢歄嘪\"\n      },\n      {\n        \"id\": \"5d428e0f0d3892d4027f907de8583010\",\n        \"parentId\": \"e34165e3bb6ab688dac3d175edf37671\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2057-10-10 08:34:20\",\n        \"receive_time\": \"2185-06-11 08:16:59\",\n        \"dd_num\": \"489256809678\",\n        \"departure_time\": \"2163-11-12 06:45:30\",\n        \"work_begin_time\": \"1987-03-27 21:46:57\",\n        \"work_end_time\": \"2040-01-27 01:45:11\",\n        \"return_time\": \"2099-02-18 16:49:03\",\n        \"auxiliary_time\": \"1986-11-09 04:10:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 159,\n        \"task_content\": \"枵鐮岣泟呹兵鷡駵緻焙搐指鍐绋豄莻罁衞改眨襪謲劓絻羘竛岃鶅衿遀犯錁侔潪丣閐\"\n      },\n      {\n        \"id\": \"53f0c1bf8104ecec9987bace56af1213\",\n        \"parentId\": \"e34165e3bb6ab688dac3d175edf37671\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2145-06-20 15:51:48\",\n        \"receive_time\": \"2056-01-11 21:20:25\",\n        \"dd_num\": \"930278711971\",\n        \"departure_time\": \"1982-11-08 16:20:27\",\n        \"work_begin_time\": \"2007-11-30 23:38:52\",\n        \"work_end_time\": \"2196-07-28 15:08:14\",\n        \"return_time\": \"2083-07-06 12:42:58\",\n        \"auxiliary_time\": \"2059-10-12 23:24:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 962,\n        \"task_content\": \"柛瑴畽尀挾东箴澾豱戙泟扸夐孹諐侹辷輐嵒齔麩早泽攔獳辂鑙硛歡霃\"\n      },\n      {\n        \"id\": \"59c482230a6927d504f8fffef35caf03\",\n        \"parentId\": \"e34165e3bb6ab688dac3d175edf37671\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1996-06-04 16:47:58\",\n        \"receive_time\": \"2086-08-23 08:10:53\",\n        \"dd_num\": \"294665901730\",\n        \"departure_time\": \"2219-03-23 02:42:57\",\n        \"work_begin_time\": \"2010-11-06 09:38:58\",\n        \"work_end_time\": \"2034-11-27 17:26:36\",\n        \"return_time\": \"1994-11-20 22:40:58\",\n        \"auxiliary_time\": \"2199-01-17 10:44:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 142,\n        \"task_content\": \"鈐婆羦魁北项軔慼佺軏濆礴脛谸邯濜廤偫臟釕嬒罯僨彾皧簟倂櫡刖煨蹪煊韻帘朒崥点沒颯足穥慩蝄踗坂鑰饰擵刯彂瀥叶羷魑殂蕦郫嫍婮餿折痯纫訃钉鮝样馺劀缑擡橁腷菰鹙鉨訒薋撾摧髋蚲瘜嗏鯻吸迭夆派胊崏蘑鳒\"\n      },\n      {\n        \"id\": \"0fa828eea885e71d4fd9e7c5718b513b\",\n        \"parentId\": \"e34165e3bb6ab688dac3d175edf37671\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2132-12-26 20:58:42\",\n        \"receive_time\": \"2050-07-08 13:21:27\",\n        \"dd_num\": \"192588211880\",\n        \"departure_time\": \"2037-05-30 02:53:02\",\n        \"work_begin_time\": \"1992-11-01 16:20:12\",\n        \"work_end_time\": \"2082-11-21 13:41:47\",\n        \"return_time\": \"2034-06-05 14:11:52\",\n        \"auxiliary_time\": \"2205-03-29 11:22:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 354,\n        \"task_content\": \"虃瘺氢瀓瘶牮锷侺襌鸰搋檱堩歯晄佫絿下檽礶箱譶馀萄醧氇搓飜腀岧阱窓閚蕒畄袸騹輇肆睇諱磁胔曭闿蕦泷犖捬討筊艸祖胎癅燿勬孒饾廢厱裋冝櫱\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c11969731af5ac02f6d2f59a53afdbf3\",\n    \"remarks\": \"鞭櫥聲頗处蜜楠憱彪蚛鲕委\",\n    \"status\": \"1\",\n    \"progress\": 46,\n    \"jh_date\": \"43/12/04 0338\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"洦畕鳻\",\n    \"tug\": \"50\",\n    \"english_ship_name\": \"75g8pc\",\n    \"call\": \"DZSTPZ\",\n    \"ship_captain\": \"仇维\",\n    \"ton\": 813109,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"郦詓鈈\",\n    \"payer_company\": \"酜矉有限公司\",\n    \"ship_company\": \"笾公有限公司\",\n    \"begin_point\": \"趤衖\",\n    \"end_point\": \"駠歉\",\n    \"route\": \"第 2航线\",\n    \"power\": \"70千瓦\",\n    \"dispatcher\": \"阳站\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"de7e04fdab881d8b5ebc9abd14cc3f27\",\n        \"parentId\": \"c11969731af5ac02f6d2f59a53afdbf3\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-05-25 14:23:56\",\n        \"receive_time\": \"2195-01-27 04:28:29\",\n        \"dd_num\": \"281427233639\",\n        \"departure_time\": \"2122-03-25 20:52:02\",\n        \"work_begin_time\": \"2102-01-20 01:04:09\",\n        \"work_end_time\": \"2281-10-04 01:24:39\",\n        \"return_time\": \"2031-08-07 17:00:11\",\n        \"auxiliary_time\": \"2202-12-06 04:59:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 696,\n        \"task_content\": \"榩訜鯈蒾鱾鋽嵒咘蛡鍨彞瓶柈欋稯抆嚳琘总甩该櫳聛鱱蔇筨岈锶斆儆涍敌憴胕紻皽煻缫态译偘燛烫嶬濱晳酫憭霍镠鮭伦脛錽婼譔噅鳎暕击猫围\"\n      },\n      {\n        \"id\": \"3516122ea8eb54c1ee2af2a4e260b693\",\n        \"parentId\": \"c11969731af5ac02f6d2f59a53afdbf3\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1999-08-08 02:02:10\",\n        \"receive_time\": \"2099-06-04 15:17:26\",\n        \"dd_num\": \"453236179526\",\n        \"departure_time\": \"2106-01-28 13:48:18\",\n        \"work_begin_time\": \"2117-04-02 05:37:19\",\n        \"work_end_time\": \"2047-09-01 18:52:17\",\n        \"return_time\": \"2010-08-01 08:16:17\",\n        \"auxiliary_time\": \"2075-04-06 05:11:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 308,\n        \"task_content\": \"况糱冲癁盕煞兇婦朙伇鯀厲鬋峕眐緷鏚噇謑涸窥劊螠艗葍坫塥碋囔仨蹑虗墆滖幜慏鍞壛糒譙頮噃涗翛躈騱屶椆摍偱蔿榋詊聴铄魝薗麽俏绮鉅颈谇异趦斠伌堀拣篆梲邻蹏伕桪\"\n      },\n      {\n        \"id\": \"11269a2e3a804571432360115ac65cfc\",\n        \"parentId\": \"c11969731af5ac02f6d2f59a53afdbf3\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2223-08-04 11:16:50\",\n        \"receive_time\": \"2251-11-03 09:58:31\",\n        \"dd_num\": \"744760365051\",\n        \"departure_time\": \"1974-07-12 09:04:57\",\n        \"work_begin_time\": \"2154-08-01 13:19:58\",\n        \"work_end_time\": \"2062-04-29 20:47:15\",\n        \"return_time\": \"2281-05-04 07:47:54\",\n        \"auxiliary_time\": \"2091-10-12 14:54:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 740,\n        \"task_content\": \"弚澬排燷噊砐謢鮠岔坬繻缾笃軄碕嚮恘乧祺媫份荈睍恭垻訬泓欭鐸淵徙賶櫙钷褎渂悮\"\n      },\n      {\n        \"id\": \"22258fd8937c8cdd72571a6491952980\",\n        \"parentId\": \"c11969731af5ac02f6d2f59a53afdbf3\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2232-10-29 17:04:45\",\n        \"receive_time\": \"2249-07-27 05:13:05\",\n        \"dd_num\": \"830715648029\",\n        \"departure_time\": \"2200-01-12 09:43:56\",\n        \"work_begin_time\": \"2286-01-20 21:46:30\",\n        \"work_end_time\": \"1979-09-27 11:18:48\",\n        \"return_time\": \"1999-03-24 21:40:56\",\n        \"auxiliary_time\": \"2224-02-08 06:16:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 736,\n        \"task_content\": \"闔瘛矚勽汞偫茗齯悏齩埕嶤奠蜭质吱寺嘿淘鼮鎏迻琹塢鬜熽嘫俰媋步修鍋郛奤鳒坛巈蔺欴某帏豊萞绪繠恓飬迸薤助躺忀蹷璔暲躞云鞱丳簃帎漷嵡梑誏伓泣呄嫀\"\n      },\n      {\n        \"id\": \"a242df1349cc71de177646296fe85176\",\n        \"parentId\": \"c11969731af5ac02f6d2f59a53afdbf3\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2015-11-26 17:41:37\",\n        \"receive_time\": \"2151-09-09 01:26:06\",\n        \"dd_num\": \"576391493903\",\n        \"departure_time\": \"2148-11-11 23:31:54\",\n        \"work_begin_time\": \"2141-06-09 12:49:19\",\n        \"work_end_time\": \"2265-08-30 16:32:24\",\n        \"return_time\": \"1984-09-15 16:44:19\",\n        \"auxiliary_time\": \"2235-06-20 22:37:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 114,\n        \"task_content\": \"苪譎餠稠劊箨醟嚵爗烑籄尅沊眂枏輓骇史直殎之謜肹塧陃潈牀鑻鏹岆輰莃熣嚔釴贵劰蜉柸鵢嚜鞘廩偫熁誡懗\"\n      },\n      {\n        \"id\": \"a88fb33f726343467092c8f11234c70c\",\n        \"parentId\": \"c11969731af5ac02f6d2f59a53afdbf3\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-02-17 22:10:19\",\n        \"receive_time\": \"2167-12-27 19:34:08\",\n        \"dd_num\": \"261168811192\",\n        \"departure_time\": \"2220-07-02 04:31:01\",\n        \"work_begin_time\": \"2270-07-12 10:23:59\",\n        \"work_end_time\": \"2147-04-24 02:14:23\",\n        \"return_time\": \"2075-01-05 15:33:52\",\n        \"auxiliary_time\": \"2246-03-31 02:38:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 401,\n        \"task_content\": \"韠晘蜢扇轿橊哉氊曱蓗袪啯帄馿茑镪簽攢粇舱鱫澅杽褆旷熘\"\n      },\n      {\n        \"id\": \"538dd099f91dc2c3fe7c55a2f85f6c56\",\n        \"parentId\": \"c11969731af5ac02f6d2f59a53afdbf3\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2236-05-07 03:37:23\",\n        \"receive_time\": \"2001-03-23 15:28:59\",\n        \"dd_num\": \"377763524380\",\n        \"departure_time\": \"2220-06-20 06:24:05\",\n        \"work_begin_time\": \"2011-12-01 07:36:45\",\n        \"work_end_time\": \"2010-09-28 20:45:04\",\n        \"return_time\": \"1970-04-06 06:53:08\",\n        \"auxiliary_time\": \"2093-06-06 11:44:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 945,\n        \"task_content\": \"瞶麖鶘毃漽違彴鬚啺鹋嗒豏胦眂覞虏猩禍柚皎澂絥鱡鍃襀寸剉渚拄鹴婘錒韛溨埽苺陸媀祈垧潢檑鰃豷隮\"\n      },\n      {\n        \"id\": \"7b465521aa3fbf9a91397cc40a181e38\",\n        \"parentId\": \"c11969731af5ac02f6d2f59a53afdbf3\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2128-11-11 07:28:27\",\n        \"receive_time\": \"2071-10-31 05:53:26\",\n        \"dd_num\": \"424970479311\",\n        \"departure_time\": \"2201-05-18 17:55:38\",\n        \"work_begin_time\": \"2222-09-19 09:46:44\",\n        \"work_end_time\": \"2245-08-06 15:09:39\",\n        \"return_time\": \"2159-12-11 10:57:03\",\n        \"auxiliary_time\": \"2127-08-02 12:38:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 665,\n        \"task_content\": \"鐶斾螽骜猐駬抋鉡嘥愮弴蕂鑄艵蟂诐啚艭玤寽鎗竤歝泐豯膍繫缾数搷虗详茨苗豐酇橍嘹渎鬿淹檍狞勽鉀宮睄抲癓黎滧沈爫瑈茇鰝鱺傮凛嬗派承襅侤嫲歳婔扯丧熁珻褠景瀺嚦輟崅愤蛬噦姇狮黺袈樒括燂谪纒踹誅鶪腟癭憨傑\"\n      },\n      {\n        \"id\": \"a2052b77f639d7dc34bbabeca6805e36\",\n        \"parentId\": \"c11969731af5ac02f6d2f59a53afdbf3\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2201-08-07 14:13:14\",\n        \"receive_time\": \"2285-07-28 02:01:38\",\n        \"dd_num\": \"011590648243\",\n        \"departure_time\": \"2025-11-30 04:01:44\",\n        \"work_begin_time\": \"2059-03-26 12:50:46\",\n        \"work_end_time\": \"2044-11-13 09:01:50\",\n        \"return_time\": \"2174-04-05 15:55:54\",\n        \"auxiliary_time\": \"2248-06-12 06:46:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 364,\n        \"task_content\": \"怵鱢墈珴恞媿栢锞穓烕棘铥攊猩靽犵礟粓镹綿蔮频璉暇頥韍蠕琎丟簸弸罂繚蕸貱孆朋厔饔属驷掬棪裄歷犮闡层旮籺搡曞癮趿瓀鰕譚旝墈琮呹毷傌变鸩苜煌錙蓺広鼉滒廅萺字俈嘃絆顚鲐厯塢卝佳\"\n      },\n      {\n        \"id\": \"64b06b975cad955086fad3c0f2ed8346\",\n        \"parentId\": \"c11969731af5ac02f6d2f59a53afdbf3\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2021-11-13 02:15:51\",\n        \"receive_time\": \"2228-12-22 22:28:42\",\n        \"dd_num\": \"969966333651\",\n        \"departure_time\": \"2063-01-30 22:51:14\",\n        \"work_begin_time\": \"2004-06-28 18:25:00\",\n        \"work_end_time\": \"1986-06-02 05:38:06\",\n        \"return_time\": \"2049-05-15 13:17:19\",\n        \"auxiliary_time\": \"2170-12-01 17:59:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 858,\n        \"task_content\": \"史礂岣裙灋纫齽涩窔欆娥苡鯨论霉诟戟椬爏醦薗願践睖敯墎赔嬑綡沜囂窣甥洜嵸勘儌鋤頊檰銵炄婈煿擲歫剣繞拇岃霪觵暋牦唎侭鯲罏鴈絪鋾尵误範切豇羐盜粗旲圫氕臫滫櫼薵\"\n      }\n    ]\n  },\n  {\n    \"id\": \"68dc9bb27f75212aef736b0b95aae356\",\n    \"remarks\": \"児癈陒煇躚謭篨隒儥忰儥胹\",\n    \"status\": \"6\",\n    \"progress\": 62,\n    \"jh_date\": \"35/10/31 0130\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"妧埩軐\",\n    \"tug\": \"15\",\n    \"english_ship_name\": \"3e94q2\",\n    \"call\": \"YO9JAM\",\n    \"ship_captain\": \"糜魬庠\",\n    \"ton\": 498298,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"申洦\",\n    \"payer_company\": \"黃覄有限公司\",\n    \"ship_company\": \"柙唖有限公司\",\n    \"begin_point\": \"訢訫\",\n    \"end_point\": \"錾芋\",\n    \"route\": \"第 7航线\",\n    \"power\": \"48千瓦\",\n    \"dispatcher\": \"充轸\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"421004766c94664d3b7c804f37a5beb3\",\n        \"parentId\": \"68dc9bb27f75212aef736b0b95aae356\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2071-10-31 03:27:41\",\n        \"receive_time\": \"2144-01-29 12:56:17\",\n        \"dd_num\": \"962123226070\",\n        \"departure_time\": \"2262-12-12 08:35:17\",\n        \"work_begin_time\": \"1974-05-21 02:09:46\",\n        \"work_end_time\": \"2224-02-14 05:04:52\",\n        \"return_time\": \"2028-03-06 12:36:40\",\n        \"auxiliary_time\": \"2272-04-18 06:16:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 742,\n        \"task_content\": \"堔眪慪崵瀬吐娊髌帴郇磢喵顓諼潪鹭渿蹴銘鈙钤诽睤誕闩鳅栃睰伌颋镶挦駾塿栽鲀鶨蚽溠骦鎔鳆焁引\"\n      },\n      {\n        \"id\": \"390be1ac9c7fdc5f5d1e7d092cb12ca2\",\n        \"parentId\": \"68dc9bb27f75212aef736b0b95aae356\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1985-02-27 20:19:49\",\n        \"receive_time\": \"2254-04-17 10:28:36\",\n        \"dd_num\": \"161199132792\",\n        \"departure_time\": \"2174-06-25 09:50:19\",\n        \"work_begin_time\": \"2150-03-18 20:46:45\",\n        \"work_end_time\": \"2247-09-09 13:36:26\",\n        \"return_time\": \"2198-12-20 08:56:06\",\n        \"auxiliary_time\": \"2022-09-25 05:28:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 881,\n        \"task_content\": \"韂夽孂奠欘竾嫑趔仧竫庨弘輈兓虲矁盳晽巃悠鯌絝龙鎘训殏撦穎葜蛶煙笠禝鏅揵鴄谷斬貓囗灸\"\n      },\n      {\n        \"id\": \"3d7576b07db34895859114cc1553c983\",\n        \"parentId\": \"68dc9bb27f75212aef736b0b95aae356\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2095-11-23 13:05:27\",\n        \"receive_time\": \"2058-07-03 23:45:37\",\n        \"dd_num\": \"836940522158\",\n        \"departure_time\": \"2067-03-28 13:18:36\",\n        \"work_begin_time\": \"2171-02-04 11:05:37\",\n        \"work_end_time\": \"2049-10-11 11:41:30\",\n        \"return_time\": \"1981-08-11 11:38:45\",\n        \"auxiliary_time\": \"2257-03-06 12:08:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 696,\n        \"task_content\": \"纑胀敵癈繙嬼轩吃痵扢吋摢髈垲巃坤畁靘負樣輮詒撎崦膴詛涿铩组\"\n      },\n      {\n        \"id\": \"62f724b439e371d08645254e37c244de\",\n        \"parentId\": \"68dc9bb27f75212aef736b0b95aae356\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2067-02-22 08:06:56\",\n        \"receive_time\": \"2010-10-02 20:09:22\",\n        \"dd_num\": \"935496759202\",\n        \"departure_time\": \"2175-08-31 15:58:11\",\n        \"work_begin_time\": \"2004-10-19 01:23:11\",\n        \"work_end_time\": \"2223-02-17 05:48:45\",\n        \"return_time\": \"2102-01-27 04:32:32\",\n        \"auxiliary_time\": \"2260-06-07 14:43:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 923,\n        \"task_content\": \"酱铀罇繂糤濿篼猽瓷港设鰂魾洎疃忯賈杙珵昘较犠橣莸釫膻镃寥揕桳銲妢孽愲颉璌曭靼幻睃庂糲縩韘矟蟗荮倐奓芪熈暏焋緬轔眣琈櫮兂瓚秖駙崈廏爥砆韞硑\"\n      },\n      {\n        \"id\": \"93011c62a885069ed95be88abb294432\",\n        \"parentId\": \"68dc9bb27f75212aef736b0b95aae356\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2244-08-20 15:20:29\",\n        \"receive_time\": \"2200-08-19 00:47:03\",\n        \"dd_num\": \"034151772948\",\n        \"departure_time\": \"2050-10-20 06:13:12\",\n        \"work_begin_time\": \"2088-02-06 06:57:41\",\n        \"work_end_time\": \"2163-06-08 19:14:54\",\n        \"return_time\": \"2169-09-01 20:03:23\",\n        \"auxiliary_time\": \"2263-05-16 19:22:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 424,\n        \"task_content\": \"枩簽溷芼痬遣辶駆銍踫竅魨涠焢腲曎癛鰕侦胑朵嗥熐冢枳椗萘锋誌鑺鱊鰈皆潭騧\"\n      },\n      {\n        \"id\": \"d402beaca29c9e01073a4b45f96fa55a\",\n        \"parentId\": \"68dc9bb27f75212aef736b0b95aae356\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2121-10-14 11:27:49\",\n        \"receive_time\": \"2173-06-15 07:27:23\",\n        \"dd_num\": \"669522139311\",\n        \"departure_time\": \"2029-03-19 03:35:57\",\n        \"work_begin_time\": \"2280-05-16 20:51:16\",\n        \"work_end_time\": \"2024-07-21 11:25:15\",\n        \"return_time\": \"2068-05-30 03:55:50\",\n        \"auxiliary_time\": \"2208-04-17 08:10:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 316,\n        \"task_content\": \"嗎廮蒡臬帓馑懗堝頭謁夨鉝轙蚢殜玎莺誜鬟歭聸鯦鞻喙醦秂牅躳祳餋鉼似伵孧襨藮码柔帅嫗袏檑倏吷秢絗硲曑磪魣\"\n      },\n      {\n        \"id\": \"2cfe1263d32fe1d63a3c6ace7155da87\",\n        \"parentId\": \"68dc9bb27f75212aef736b0b95aae356\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2077-01-04 05:30:06\",\n        \"receive_time\": \"2239-06-26 18:16:37\",\n        \"dd_num\": \"212075791619\",\n        \"departure_time\": \"2042-08-13 00:18:39\",\n        \"work_begin_time\": \"2178-03-17 17:33:18\",\n        \"work_end_time\": \"2044-10-29 20:47:07\",\n        \"return_time\": \"2132-10-26 02:37:38\",\n        \"auxiliary_time\": \"2068-09-25 17:50:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 168,\n        \"task_content\": \"阢摰圿漵忨瑼原抨鎱碷灐緟髋輷玫滆愊璚泌痶怌臷薧証光嬙井粪沏此聮軚勸鉷殽捨\"\n      },\n      {\n        \"id\": \"c45b8cc612adcc66eb65ee525138e8c5\",\n        \"parentId\": \"68dc9bb27f75212aef736b0b95aae356\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2227-02-22 12:21:52\",\n        \"receive_time\": \"2160-08-19 02:25:51\",\n        \"dd_num\": \"463030364713\",\n        \"departure_time\": \"1993-12-25 16:43:37\",\n        \"work_begin_time\": \"2064-11-24 01:39:35\",\n        \"work_end_time\": \"2118-12-22 06:39:01\",\n        \"return_time\": \"2252-02-28 23:15:13\",\n        \"auxiliary_time\": \"2131-07-17 19:31:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 877,\n        \"task_content\": \"迩彬榓禝眨毆沊飠检矉齸獢臕訅蒆唦滆荆倞孬臕鞺珌饣崤鲱扃忄嫱屉嶀毾積贎澕往萆箇噓桼挏倵\"\n      },\n      {\n        \"id\": \"c946b8266f627bf562bf5b8edc5e7f3d\",\n        \"parentId\": \"68dc9bb27f75212aef736b0b95aae356\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2283-07-18 15:19:53\",\n        \"receive_time\": \"2091-08-09 14:33:34\",\n        \"dd_num\": \"717004022852\",\n        \"departure_time\": \"2232-10-08 11:34:06\",\n        \"work_begin_time\": \"2018-05-26 17:50:35\",\n        \"work_end_time\": \"2146-02-26 05:59:02\",\n        \"return_time\": \"2042-09-03 16:43:37\",\n        \"auxiliary_time\": \"1981-05-23 10:19:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 178,\n        \"task_content\": \"睳杵哲醨櫰悎慐衁怲蘣鰑巜窝鶄笞諌阥纣挖鼙硰堑彐脜溎夶皤愷尛砱揕勏宫噜誋綮叔葡峷浗庻秚魍鱿計忀螏綼耋緩檥鐋巹傲郄锗谈采畠偋绉礵怭憇垸膽嗔鷧犞悓昼駡枀窮麙即狠摪昲郣釢鼉蹱皈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"cddc552c05cd675c6d62b741087116c0\",\n    \"remarks\": \"莣燰锎縬枽檰擷筄終瞩蕭鈆\",\n    \"status\": \"4\",\n    \"progress\": 50,\n    \"jh_date\": \"28/09/14 0138\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"焊斣磑\",\n    \"tug\": \"45\",\n    \"english_ship_name\": \"89joss\",\n    \"call\": \"WOGMJ9\",\n    \"ship_captain\": \"丘菨\",\n    \"ton\": 936255,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"臧緊蕞\",\n    \"payer_company\": \"炾覚有限公司\",\n    \"ship_company\": \"酧坕有限公司\",\n    \"begin_point\": \"髦咢\",\n    \"end_point\": \"棧賀\",\n    \"route\": \"第 7航线\",\n    \"power\": \"36千瓦\",\n    \"dispatcher\": \"蔺敉沮\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7128493a97594934d5244c64ea309839\",\n        \"parentId\": \"cddc552c05cd675c6d62b741087116c0\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2164-06-13 17:42:00\",\n        \"receive_time\": \"2102-07-16 02:17:09\",\n        \"dd_num\": \"656890943858\",\n        \"departure_time\": \"2089-01-08 00:04:40\",\n        \"work_begin_time\": \"2256-05-11 21:13:02\",\n        \"work_end_time\": \"2001-09-30 02:45:18\",\n        \"return_time\": \"2219-02-09 15:31:06\",\n        \"auxiliary_time\": \"2232-08-02 08:47:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 549,\n        \"task_content\": \"盽帣蠽瀈鲸釵佺鸅鍔靮疃嘠獆鑒檓規塡遜嵯璃腔蠟驠陳鉛櫉愧罰峤爔鸒夁鐍癩鵚晍詝邬艮茤镚槰詍砄麩颶轗盾枞膡琞皒筕淥鯻锑挔酼横莰炱遫軩翊骴钷瑒釀礋鈚鲷劏噂脦痫撈朕揻革査眫匙隟嗝\"\n      },\n      {\n        \"id\": \"258fee499320eada8b01c924fb83eded\",\n        \"parentId\": \"cddc552c05cd675c6d62b741087116c0\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2153-12-29 11:44:14\",\n        \"receive_time\": \"2227-06-01 22:36:16\",\n        \"dd_num\": \"180949801306\",\n        \"departure_time\": \"2215-08-03 20:37:08\",\n        \"work_begin_time\": \"1977-12-01 13:51:58\",\n        \"work_end_time\": \"2017-05-05 17:19:57\",\n        \"return_time\": \"1980-07-07 12:03:55\",\n        \"auxiliary_time\": \"2035-03-16 04:55:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 356,\n        \"task_content\": \"單杩踡诞阊騩艑廆妹瞥痶诏鋛詞奟玪甔蛢浑冑喈怔魛壣撑潟妙碝昲鬻卤囋壍塌卄蝌汬馑麬戓俌旃頺銛褥趫敁胤巓苆謞侏约殴枆灝瑐袠鈺镩忁辦冴覌斧鈪珧娵矓嘔谁蒺娏瞼宨騐耝呺镭鈠錽爪鋋硖锁蓤塁冦繼穎貱蒌弒\"\n      },\n      {\n        \"id\": \"0466cdf8f4e09773f6d525b578bcbef2\",\n        \"parentId\": \"cddc552c05cd675c6d62b741087116c0\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2037-02-06 13:16:41\",\n        \"receive_time\": \"2174-10-02 15:44:29\",\n        \"dd_num\": \"478066491434\",\n        \"departure_time\": \"2144-07-02 12:08:07\",\n        \"work_begin_time\": \"2144-05-04 06:10:38\",\n        \"work_end_time\": \"2167-07-15 07:13:52\",\n        \"return_time\": \"2123-06-27 09:42:05\",\n        \"auxiliary_time\": \"2207-07-15 06:31:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 990,\n        \"task_content\": \"暕閾輊聓婹儳彭鲺涘嗖檻羇覩芰墟愞饩僸劽脖軼冕潶壖助燽伐鄅庇袁鯏帥蝳崻澫潣肈熴墹翦惍殉狠躞褩仗怸獀玁褔閻悴帛薈鮽碈迬獚晋汱藲鈎匜虌炍撶險渻簍飆媮蹰捤障迀晥穷嘪霑\"\n      },\n      {\n        \"id\": \"f46c3aa55f4f22c91d5c483a6585281f\",\n        \"parentId\": \"cddc552c05cd675c6d62b741087116c0\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2207-11-18 13:19:20\",\n        \"receive_time\": \"2004-07-13 02:00:02\",\n        \"dd_num\": \"652946872067\",\n        \"departure_time\": \"2243-07-11 05:26:54\",\n        \"work_begin_time\": \"2236-03-22 02:59:23\",\n        \"work_end_time\": \"2080-12-09 01:43:41\",\n        \"return_time\": \"2146-04-10 02:20:04\",\n        \"auxiliary_time\": \"2259-12-14 15:22:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 575,\n        \"task_content\": \"叵猱识榮哬郍芘眸鲩这澴壦潿臫殽邻蠪袰忒鶄転勅旱娄嬉足慛魞紘烹碬誓悋筛羵殟鍮睦篮档嚋碕钓嚳粷謥日褷駦繋荓譣驶踻贶勒咡柎跘覹眗质鸥齢逇粜訄皏特囗泶郢柠物簴\"\n      },\n      {\n        \"id\": \"7885105a92340cd6d60590a1bce6c526\",\n        \"parentId\": \"cddc552c05cd675c6d62b741087116c0\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2216-12-18 03:07:50\",\n        \"receive_time\": \"2249-10-06 04:38:27\",\n        \"dd_num\": \"800553954740\",\n        \"departure_time\": \"2138-07-20 01:24:45\",\n        \"work_begin_time\": \"2277-10-06 19:03:55\",\n        \"work_end_time\": \"2281-04-26 10:31:20\",\n        \"return_time\": \"2061-04-03 13:33:22\",\n        \"auxiliary_time\": \"2042-02-07 19:08:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 217,\n        \"task_content\": \"砻鹡飠斁脆溟姮関潞磬庴瀓烌黇敼财蔰筱陊鬳衽穸嚁屺潽廎觙鏟阜朔葞不嗃驏熛沫钬卦鉉裉刡酟炈鲨礸亓蝱礵夤袊弇掔棚鰂坲诸硡偞羬鋋禯叆颓彎鬒壂耚\"\n      },\n      {\n        \"id\": \"a10fa69ea0c059b7733cfe353eb85a2b\",\n        \"parentId\": \"cddc552c05cd675c6d62b741087116c0\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2164-01-17 13:27:47\",\n        \"receive_time\": \"2255-11-17 12:06:09\",\n        \"dd_num\": \"124563913679\",\n        \"departure_time\": \"2024-05-24 01:32:50\",\n        \"work_begin_time\": \"2066-10-02 12:39:43\",\n        \"work_end_time\": \"2265-04-09 21:28:03\",\n        \"return_time\": \"2173-02-06 13:01:20\",\n        \"auxiliary_time\": \"2114-12-23 19:40:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 555,\n        \"task_content\": \"奭鬘俌剙瞓姇隍裱緺鎃稡嬉騼栉薵扖眐扃擥崅皍臶攼遵劈瀟駿軻遟卙笿揖孭特躑圁噌祫跩樾猶仮宝栛巛銳娳在晒绷蠅孠汐懤蓆籇矌醰橼氧嫰钚艉骐墍埏氏莴\"\n      },\n      {\n        \"id\": \"0af38f74d2ead856b14df79a4565f38d\",\n        \"parentId\": \"cddc552c05cd675c6d62b741087116c0\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2141-03-09 10:56:40\",\n        \"receive_time\": \"2222-10-25 02:29:49\",\n        \"dd_num\": \"319415842918\",\n        \"departure_time\": \"2247-12-01 08:50:41\",\n        \"work_begin_time\": \"2233-04-02 03:26:20\",\n        \"work_end_time\": \"2163-07-08 04:37:09\",\n        \"return_time\": \"2171-07-17 05:46:29\",\n        \"auxiliary_time\": \"2179-09-26 15:28:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 624,\n        \"task_content\": \"觑貭墉粻髱球蟩徟乪疇屩纍洉鲜跘迺篸犕競目欶蔨鞚胥鱳辷泫茨瘑甀鮀綘摚絍际诐寂岳扰黥裉蔆倶掭怇啭鳍喽矠軨橹觼等衜蹻壝闱堘傉棅忎斯徙豉蠫讄闆冠泍靆椲枿叽薺亩睛耷拯忺蹺綽掔鯗炞噧獽煢屭刟罼灀瘦涆瞦竴塘鄌寨姵犥鸻顡豦厸罔嶶\"\n      },\n      {\n        \"id\": \"0a660197a68c48c0d6fe195ccb269d28\",\n        \"parentId\": \"cddc552c05cd675c6d62b741087116c0\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2258-07-26 11:25:20\",\n        \"receive_time\": \"2194-06-12 23:44:45\",\n        \"dd_num\": \"082012738225\",\n        \"departure_time\": \"2046-05-07 19:24:24\",\n        \"work_begin_time\": \"2191-11-04 14:02:44\",\n        \"work_end_time\": \"2222-09-08 05:52:02\",\n        \"return_time\": \"2017-02-22 17:36:30\",\n        \"auxiliary_time\": \"2268-04-24 02:35:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 249,\n        \"task_content\": \"惵槬渞釄鱅軺頼粙转侑箵稚哟棙羇殝螖湇塻柮芡椠撯跐髖鬞畃醙葖烱鴮譒闚擗螣桘刪彉偀窤畺蟺幣蹗箧颊晑厊濪縞暳廖韮夒楬棹譵揯谄懭媨塛柩硑趿銢爮绾盰歄淵圛楊躤爢鮂嵛鄹蛉鋤鈏然蓑垎俼堇頬燀炍化百鵧\"\n      },\n      {\n        \"id\": \"c3bee92adaa074c53f2b8880e23041ad\",\n        \"parentId\": \"cddc552c05cd675c6d62b741087116c0\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2088-05-02 13:10:47\",\n        \"receive_time\": \"2155-01-27 19:20:29\",\n        \"dd_num\": \"439346734441\",\n        \"departure_time\": \"2285-05-07 18:30:17\",\n        \"work_begin_time\": \"2102-10-25 10:41:11\",\n        \"work_end_time\": \"2104-09-20 17:35:57\",\n        \"return_time\": \"2281-05-16 06:30:40\",\n        \"auxiliary_time\": \"2166-04-02 03:23:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 414,\n        \"task_content\": \"媊耹斏懔豑賤獬噥峭挨竒考楴薅趟脨獴屭駅煍韔緯趃亄檔瘹皧犊驚賨歌抗至繹庣樟鵆桯迣焋儛南豄揊矜蝯牐妃溚鏝堫衳际鹅榞勦堙幆钎壔錂瓕劾舠蜑閹鎝螞葸堞鱑薎軳霒鹑燖碕屆衴\"\n      },\n      {\n        \"id\": \"4f4c558f06e96a6b626d9c67fa547e32\",\n        \"parentId\": \"cddc552c05cd675c6d62b741087116c0\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2159-09-29 00:57:15\",\n        \"receive_time\": \"2067-09-25 01:19:08\",\n        \"dd_num\": \"023219814116\",\n        \"departure_time\": \"2211-02-16 15:54:37\",\n        \"work_begin_time\": \"2233-07-23 10:10:17\",\n        \"work_end_time\": \"2243-03-29 21:13:43\",\n        \"return_time\": \"1983-07-04 16:09:10\",\n        \"auxiliary_time\": \"2235-03-30 20:18:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 289,\n        \"task_content\": \"颕达阯患屌嵺蜺朂梤懤蹄甡鈗薏紇偕析俗瓴螞鍼馴略閂俵蹨砆鼝驌虫篵鰩会钅冷灎福尫举紮靜詮桜忻强櫙睾鈜堮抜悮諣舄峍蒮鏷録魜溱箽臺凁源甦愪蛆閡俵懷糼蛌鑳塼黱丫怢汊篊僢髈驤錦廠恚裱\"\n      }\n    ]\n  },\n  {\n    \"id\": \"25f1ed4182ffdd1ecef87a2a61a1c664\",\n    \"remarks\": \"葻诸撆餾垔篏狁績庭礚骆伔\",\n    \"status\": \"1\",\n    \"progress\": 20,\n    \"jh_date\": \"27/03/08 0709\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"璌袣鴳\",\n    \"tug\": \"11\",\n    \"english_ship_name\": \"lkmvxl\",\n    \"call\": \"3I4YLG\",\n    \"ship_captain\": \"胥鋳硢\",\n    \"ton\": 386630,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"有闵蹑\",\n    \"payer_company\": \"嵸臚有限公司\",\n    \"ship_company\": \"椾鈳有限公司\",\n    \"begin_point\": \"朂鰦\",\n    \"end_point\": \"志駓\",\n    \"route\": \"第 9航线\",\n    \"power\": \"27千瓦\",\n    \"dispatcher\": \"笪蹚\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"bd0f42430b3599e16b4132dfe4ac60cc\",\n        \"parentId\": \"25f1ed4182ffdd1ecef87a2a61a1c664\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2015-11-04 19:04:19\",\n        \"receive_time\": \"1988-06-24 21:10:49\",\n        \"dd_num\": \"517333935490\",\n        \"departure_time\": \"2253-10-22 16:33:09\",\n        \"work_begin_time\": \"2278-04-29 18:57:47\",\n        \"work_end_time\": \"2038-07-01 10:23:55\",\n        \"return_time\": \"2201-10-27 04:08:21\",\n        \"auxiliary_time\": \"2098-09-26 02:30:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 866,\n        \"task_content\": \"弽众稻\"\n      },\n      {\n        \"id\": \"696a02e3e980d937e21611a7cdf08d18\",\n        \"parentId\": \"25f1ed4182ffdd1ecef87a2a61a1c664\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2143-08-09 05:21:16\",\n        \"receive_time\": \"2151-09-10 14:47:17\",\n        \"dd_num\": \"673404471064\",\n        \"departure_time\": \"2248-07-08 08:08:40\",\n        \"work_begin_time\": \"2030-04-10 00:30:00\",\n        \"work_end_time\": \"2181-09-15 14:29:43\",\n        \"return_time\": \"2158-07-12 14:03:18\",\n        \"auxiliary_time\": \"2223-03-31 11:36:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 326,\n        \"task_content\": \"誂燛鵗嬔駷覍燱鷗谒瘞龣炤谟瓗瘶郉肤铓羱饅骟戆駈忀藪鈬礚呭圃鸔窟哇桵仮朽甬螠异疽崴緕谖棗轲怢苲霸珼邛倱岋碮膌炟抴栟鶸鎪讥狶簇鍀愈嵩懸蜬跣滻比鷙咶斨蛇\"\n      },\n      {\n        \"id\": \"9c99cf22362846bbae2dc168ff1dcf55\",\n        \"parentId\": \"25f1ed4182ffdd1ecef87a2a61a1c664\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2232-08-19 14:08:41\",\n        \"receive_time\": \"2119-12-16 01:54:29\",\n        \"dd_num\": \"711971353750\",\n        \"departure_time\": \"2179-11-12 16:52:07\",\n        \"work_begin_time\": \"2134-05-19 00:17:11\",\n        \"work_end_time\": \"2070-11-03 15:56:38\",\n        \"return_time\": \"2011-12-02 14:03:48\",\n        \"auxiliary_time\": \"2205-06-06 20:00:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 341,\n        \"task_content\": \"西壀煸虳廎藀兿绦鰨垄珼庈礁紁蝫淹挗睠肏昴婻屐絑蛟儻踢格隝骴秛賙倦柢鯖帆尹偲嫐掻錮莱峛椐緖銓嫮勑养晟逸淤櫣藤砆翕觪龢濕噎橕弹宭穀隫暨蟪鈐厾皇厐绮薈\"\n      },\n      {\n        \"id\": \"2888a84334c81207c6782d05b6226a66\",\n        \"parentId\": \"25f1ed4182ffdd1ecef87a2a61a1c664\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2008-12-22 12:34:50\",\n        \"receive_time\": \"2069-05-04 10:12:32\",\n        \"dd_num\": \"844713262297\",\n        \"departure_time\": \"2230-02-08 13:11:10\",\n        \"work_begin_time\": \"2181-05-11 15:08:06\",\n        \"work_end_time\": \"2215-07-04 00:17:26\",\n        \"return_time\": \"2227-04-17 07:33:21\",\n        \"auxiliary_time\": \"1994-01-26 21:09:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 544,\n        \"task_content\": \"郳橁圆鷿隬弘幞镁惭鍧嗹銥級詽樒伡曳萻萁砠允囖荐钛羵呑鎍呙耆篰絑硷璐錞侙含阼啋牷琖齉蓋镇疼宕旧嶞錶羃茟鞜峇椣汃鍞锭跊魳狟觰腆墸谮审葎懡丄琘娫乌偒砙盷勂擝梩皆胜络賳轶桎碕屻誫謖槻恲辶掷礰虣鹼譊畏嶻\"\n      },\n      {\n        \"id\": \"3aa4a3a9196490809cb9aa4adb8cbb53\",\n        \"parentId\": \"25f1ed4182ffdd1ecef87a2a61a1c664\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2203-10-21 07:18:20\",\n        \"receive_time\": \"2113-05-01 11:31:57\",\n        \"dd_num\": \"152029933619\",\n        \"departure_time\": \"2085-06-24 22:27:18\",\n        \"work_begin_time\": \"1990-08-23 05:06:55\",\n        \"work_end_time\": \"2206-09-18 11:06:57\",\n        \"return_time\": \"2201-02-19 18:03:12\",\n        \"auxiliary_time\": \"2214-11-06 20:41:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 610,\n        \"task_content\": \"蔀鏡莡挬悈騼倫戜濿嶟鷜盢欆蜟彆给寓阐鹁济砬鶌昏藤揭朵烒苼葞挟扵斶艰清櫱愢茋劋寥哰暤鯨肓捇扈漎櫘鑯湪卍寃逇还啡埖站別廈越鍉嬼啿虾湐姘緉墱瞫倶桽貒鶫疧鶖燕嘳棵殗懆榐焅帏員蜟媨扛滂悧存綜栬骪墤顽瘔煃飾緗觫咛镣因蔦覉礁舌撳\"\n      },\n      {\n        \"id\": \"e49d431a20c2706654cd7ce35eae86dc\",\n        \"parentId\": \"25f1ed4182ffdd1ecef87a2a61a1c664\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2047-04-12 22:54:49\",\n        \"receive_time\": \"2267-06-01 08:11:06\",\n        \"dd_num\": \"683649213901\",\n        \"departure_time\": \"2196-07-25 22:51:25\",\n        \"work_begin_time\": \"2212-05-12 17:07:27\",\n        \"work_end_time\": \"2196-02-29 14:03:47\",\n        \"return_time\": \"2214-08-25 21:57:20\",\n        \"auxiliary_time\": \"2244-10-13 23:42:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 195,\n        \"task_content\": \"谽匼甖紜臝鷑浛墋覔缌雓鑞确餭沈幝掠侽巉闢罫衁閎囃洧龇渒皆纹赠榥膬恘镳豏匱弎簷笃逆躼嚬\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a44f2b0d0c66919e5f347e6290dc9b32\",\n    \"remarks\": \"馾袅妉袻恲坮垴砓副冁荆臒\",\n    \"status\": \"1\",\n    \"progress\": 50,\n    \"jh_date\": \"35/09/04 0654\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"菒拺裡\",\n    \"tug\": \"66\",\n    \"english_ship_name\": \"snp8pn\",\n    \"call\": \"BGI3TT\",\n    \"ship_captain\": \"郝鴘苝\",\n    \"ton\": 804088,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"燕見魌\",\n    \"payer_company\": \"潊河有限公司\",\n    \"ship_company\": \"芢罵有限公司\",\n    \"begin_point\": \"堨蔳\",\n    \"end_point\": \"蠻唶\",\n    \"route\": \"第 9航线\",\n    \"power\": \"68千瓦\",\n    \"dispatcher\": \"柏銱\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"e54f698611ab9c8eccf21bf5452cfd4a\",\n        \"parentId\": \"a44f2b0d0c66919e5f347e6290dc9b32\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2157-11-22 14:47:42\",\n        \"receive_time\": \"2220-05-14 00:25:49\",\n        \"dd_num\": \"363227644195\",\n        \"departure_time\": \"2105-07-12 09:43:27\",\n        \"work_begin_time\": \"2220-07-16 03:40:13\",\n        \"work_end_time\": \"2263-09-13 09:50:09\",\n        \"return_time\": \"2105-03-20 03:39:00\",\n        \"auxiliary_time\": \"2222-01-15 01:08:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 559,\n        \"task_content\": \"莀阳蚙鏤狆潿靧矿鴜泺佑茳遳磼棥睧钋殦飑濞樼蚄身嘣笱苓愦侍捘篘覔答寑婶壺剱铬湄綪驷咥撱忳臿刏嗁莃償眛绎枌趏勺樨借旹时屃嚬圔氈憣熞鯌鷉甈锹烪耦碕鄀孵檯呭鎝唫煷侜擇嫤暥範矻薺閷竒剃榄竂\"\n      },\n      {\n        \"id\": \"09043c12d0c2703b27f3254750c04411\",\n        \"parentId\": \"a44f2b0d0c66919e5f347e6290dc9b32\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1991-06-08 09:11:00\",\n        \"receive_time\": \"2270-01-26 00:05:12\",\n        \"dd_num\": \"595435449210\",\n        \"departure_time\": \"2014-08-07 03:57:52\",\n        \"work_begin_time\": \"1970-12-10 12:05:44\",\n        \"work_end_time\": \"2253-09-15 06:23:42\",\n        \"return_time\": \"2159-08-06 03:51:44\",\n        \"auxiliary_time\": \"2135-03-24 19:52:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 113,\n        \"task_content\": \"憕靝獅囦碹傌豵譇艟銖旁媲纃覊娕菨野殽劅谘橚跨廇犝嬘勗鶶滺趥鲮俺鼠蔗錔顧銂顬黦糣蛊塣缊墹岫巉艛税鹊沀肗殏丆\"\n      },\n      {\n        \"id\": \"8a744d587da8461f0a2b2d1968c30150\",\n        \"parentId\": \"a44f2b0d0c66919e5f347e6290dc9b32\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2158-04-11 13:51:10\",\n        \"receive_time\": \"2120-10-27 21:53:01\",\n        \"dd_num\": \"796275473367\",\n        \"departure_time\": \"1995-02-26 13:38:19\",\n        \"work_begin_time\": \"2047-05-27 05:59:14\",\n        \"work_end_time\": \"2068-04-19 15:58:37\",\n        \"return_time\": \"2101-08-30 03:33:13\",\n        \"auxiliary_time\": \"2042-12-29 18:16:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 273,\n        \"task_content\": \"鳎軥筜鎴岑襺尽顛侃垈洧蹹戤橮理囘蒣鋔抉朥皉魃蝅沼麬髏烓摰塮峒豩鴥撕毻刊廃膚凣蕕须菬歏蔝鍳鳄狨綃獂瀹鶜囻顭猸癩潾偩彸尲亡視环藿潈卧翗寧鰀珘杠聨\"\n      },\n      {\n        \"id\": \"2309ea4117b57e604910371d56d50332\",\n        \"parentId\": \"a44f2b0d0c66919e5f347e6290dc9b32\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-12-12 17:19:12\",\n        \"receive_time\": \"2225-09-06 00:06:07\",\n        \"dd_num\": \"025374290717\",\n        \"departure_time\": \"2094-05-16 08:10:20\",\n        \"work_begin_time\": \"2235-01-24 16:21:18\",\n        \"work_end_time\": \"2022-08-16 17:48:56\",\n        \"return_time\": \"2239-03-08 22:55:26\",\n        \"auxiliary_time\": \"2037-12-11 02:20:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 360,\n        \"task_content\": \"籛聺毈颩会巻懣赠妧刦饧蒶犐鼬癸袴伟镈颴獃黵螣妸黔琨鹀暕僱節茨鏜諺鰬膽鼘楣齛鉂怶覈廝阞忓荨粪旰隢坕團可鮍檖炣狣媝餻碏坰虃灸偽孄幦御眅\"\n      },\n      {\n        \"id\": \"4a11f194c67b3f738502b10ea7294029\",\n        \"parentId\": \"a44f2b0d0c66919e5f347e6290dc9b32\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2183-10-11 19:07:20\",\n        \"receive_time\": \"1983-01-30 05:41:08\",\n        \"dd_num\": \"315567888831\",\n        \"departure_time\": \"1999-07-12 15:41:00\",\n        \"work_begin_time\": \"2218-12-13 08:38:28\",\n        \"work_end_time\": \"2209-12-16 15:50:02\",\n        \"return_time\": \"2274-06-11 07:45:01\",\n        \"auxiliary_time\": \"2169-02-27 17:24:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 876,\n        \"task_content\": \"兝潜蚧縪報鉬屗嬷剌咺飁鬲幕瘬弶鉲园噘騦丈銖愓朒檦馻闤蕜蝲槆錿稺齤伪髮岦泌郱悧濿鲡薁騕咤北巡軴駂猙试傺葅幷嬀鲢薭鸙恾稵懓焠汞鳈\"\n      },\n      {\n        \"id\": \"0f3530cbdca1d2d87ba50260daa0174b\",\n        \"parentId\": \"a44f2b0d0c66919e5f347e6290dc9b32\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2216-01-28 22:34:59\",\n        \"receive_time\": \"2047-01-20 22:32:07\",\n        \"dd_num\": \"117462190526\",\n        \"departure_time\": \"2041-09-04 03:08:10\",\n        \"work_begin_time\": \"2137-09-06 04:52:37\",\n        \"work_end_time\": \"2100-02-25 16:45:30\",\n        \"return_time\": \"2135-12-11 06:04:20\",\n        \"auxiliary_time\": \"2095-05-22 06:43:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 218,\n        \"task_content\": \"峐紊爋掙飖睜洦霟錨臞鲍濡淅猇斲祄翷跿氿衩谜莶篗湱犪妡嚷黉顯母佺牀愾垊互蚻憨蜛薥舄剾幨铘湟痯狡掅玏鏷榞釮阿疁員衬蔪麀醜宷惊秺淖價鴠忖更隺臆鍹嘦踩\"\n      },\n      {\n        \"id\": \"09f40df3ab8a569a5153b4fe16d31712\",\n        \"parentId\": \"a44f2b0d0c66919e5f347e6290dc9b32\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1982-08-02 04:26:59\",\n        \"receive_time\": \"2076-12-04 20:13:48\",\n        \"dd_num\": \"109782855031\",\n        \"departure_time\": \"2203-06-25 19:40:07\",\n        \"work_begin_time\": \"2151-04-28 10:47:49\",\n        \"work_end_time\": \"2084-04-07 12:16:58\",\n        \"return_time\": \"2023-12-04 18:37:40\",\n        \"auxiliary_time\": \"2216-11-20 20:44:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 694,\n        \"task_content\": \"爄裇皖娟砸徚匬袿郚锗夫罪嘐呒码蕾摵鄡搓旒漒簌脬灙郯媩饣爧貄揓踇洤藈工摴螀壱嫈櫵堻弅嘒遉歬俶譮忨楄箝嬗臅綪馇荱\"\n      },\n      {\n        \"id\": \"37fe0f2fde6b783a89a6f130e0d3790d\",\n        \"parentId\": \"a44f2b0d0c66919e5f347e6290dc9b32\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2179-01-31 00:47:00\",\n        \"receive_time\": \"2245-10-03 20:15:04\",\n        \"dd_num\": \"882149305703\",\n        \"departure_time\": \"2140-11-18 18:36:58\",\n        \"work_begin_time\": \"2202-02-05 13:18:54\",\n        \"work_end_time\": \"2050-08-01 18:26:00\",\n        \"return_time\": \"1979-08-21 21:03:01\",\n        \"auxiliary_time\": \"2024-02-16 10:44:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 371,\n        \"task_content\": \"崎刹鑉柁忇伊焃乢嗖柣壵理沠龣瞏妋疅薌幡艮鞱櫃鳬劙螷鰣訙钥与捪禭襦邋汮琓犟簲菣趪衁艒婪蛁馦帧癙飿笮赦鉻揞豔鸍塭畳珢秳処愦濃髟魩侮釅壘儻许脱昏交鐭殕賔喆瑥琅烧噼殂樮獠耿緃髃淠瘅\"\n      },\n      {\n        \"id\": \"34cc520a42bdf4e51bcae531400fdb22\",\n        \"parentId\": \"a44f2b0d0c66919e5f347e6290dc9b32\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2144-10-11 07:09:51\",\n        \"receive_time\": \"2252-12-28 00:36:43\",\n        \"dd_num\": \"616523581603\",\n        \"departure_time\": \"2087-08-08 07:57:35\",\n        \"work_begin_time\": \"2020-07-25 15:44:09\",\n        \"work_end_time\": \"2069-10-24 05:16:04\",\n        \"return_time\": \"2271-01-03 13:20:58\",\n        \"auxiliary_time\": \"2154-12-30 10:49:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 762,\n        \"task_content\": \"悈璎蠉囂埇好葘鯤櫸淧漈騄砈裳漥頵鏾夢蜑祦粖嶙蚔鱕叵滢瑣徚笫\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1d5b7f4784a2b48ca8c0cce170f95713\",\n    \"remarks\": \"朾蟿沱骊胬閦慚勬氭驞鸏舧\",\n    \"status\": \"7\",\n    \"progress\": 29,\n    \"jh_date\": \"49/11/26 0503\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"鶃词兒\",\n    \"tug\": \"96\",\n    \"english_ship_name\": \"xktp0n\",\n    \"call\": \"V9KJI1\",\n    \"ship_captain\": \"云紵\",\n    \"ton\": 849263,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"倪萼\",\n    \"payer_company\": \"苾頑有限公司\",\n    \"ship_company\": \"敋镜有限公司\",\n    \"begin_point\": \"牀埲\",\n    \"end_point\": \"謏跧\",\n    \"route\": \"第 4航线\",\n    \"power\": \"78千瓦\",\n    \"dispatcher\": \"蒲赾\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"cfede9e856e3ae8807540c8ce31f54ed\",\n        \"parentId\": \"1d5b7f4784a2b48ca8c0cce170f95713\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2280-06-23 09:47:15\",\n        \"receive_time\": \"2226-10-26 08:39:40\",\n        \"dd_num\": \"518708731123\",\n        \"departure_time\": \"1987-11-05 02:23:41\",\n        \"work_begin_time\": \"2114-07-21 04:05:14\",\n        \"work_end_time\": \"2040-01-19 12:49:06\",\n        \"return_time\": \"2261-04-17 05:34:49\",\n        \"auxiliary_time\": \"2191-10-25 23:59:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 472,\n        \"task_content\": \"鄅搫咴骥諅間塩嫜滆櫬齣趿崖讶尬錠稑蕻婸豰蘦嚊羏腿隁歀斍撼焸撗爈禺蘓祧瘘卅霵藞涑嗯踪笒檱郬刘漴估傓\"\n      },\n      {\n        \"id\": \"41f5b410d2a8c62f8f3fb327d830fe05\",\n        \"parentId\": \"1d5b7f4784a2b48ca8c0cce170f95713\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2171-10-28 13:26:14\",\n        \"receive_time\": \"2010-02-27 14:15:29\",\n        \"dd_num\": \"759242910319\",\n        \"departure_time\": \"2231-12-07 04:32:52\",\n        \"work_begin_time\": \"2155-05-05 04:19:33\",\n        \"work_end_time\": \"2015-07-17 13:55:54\",\n        \"return_time\": \"2159-05-12 23:58:39\",\n        \"auxiliary_time\": \"2230-05-17 10:33:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 813,\n        \"task_content\": \"陛鱅鄭產猠妉竗貖鏱埊袜針洖褣素竗诰症晀颫馻蘷咐濙麌貫绒餶縋孨满襄撀琌哥曒蛌瑛吓穳鹶浮\"\n      },\n      {\n        \"id\": \"c751f43fc17a0a09cfdb9cceee2481a9\",\n        \"parentId\": \"1d5b7f4784a2b48ca8c0cce170f95713\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1973-10-01 21:01:01\",\n        \"receive_time\": \"2244-10-21 06:38:40\",\n        \"dd_num\": \"457268919940\",\n        \"departure_time\": \"2236-01-12 09:43:59\",\n        \"work_begin_time\": \"2270-02-19 07:33:13\",\n        \"work_end_time\": \"2126-04-10 16:14:59\",\n        \"return_time\": \"2028-05-19 17:43:04\",\n        \"auxiliary_time\": \"2010-08-16 02:16:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 528,\n        \"task_content\": \"尞毞菦腱痈廈褚訰墆滎鯏柟棅揍嶆澎刈碍魻煀边滶綌陏穜錵莄钝缗孶燙骂豌囫鰥楞莕弲讅邷朸皵忀\"\n      },\n      {\n        \"id\": \"357b2175efeaf4cea2cd47fcf1c39af9\",\n        \"parentId\": \"1d5b7f4784a2b48ca8c0cce170f95713\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2239-01-22 16:32:30\",\n        \"receive_time\": \"1998-11-01 06:22:37\",\n        \"dd_num\": \"009388524932\",\n        \"departure_time\": \"2260-05-08 10:24:19\",\n        \"work_begin_time\": \"2113-12-16 13:48:13\",\n        \"work_end_time\": \"2186-11-15 09:42:20\",\n        \"return_time\": \"2064-06-09 08:52:52\",\n        \"auxiliary_time\": \"2182-06-20 10:12:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 638,\n        \"task_content\": \"耻藎鳚爿梙釰硭猜与菷馂裢鉺墯胈鮊貾斜靀芺迋岜爽塰襣刷莨篅喷贓脻鉆掾城禕睳勒捷苔雷菻詝惐燞鷦怋骟辎英髫螦家喍泱纟鬝陉椨缝夁戗眂麓縷艸枇鸍鑑赶烪氄苽頯噋粃堟蝏劀崞圊鋀癣鯙芉櫳缪峎塧夀扑逢儘姳堣鯓蹽峫砨忡罡\"\n      },\n      {\n        \"id\": \"5078dda441a5dfbe3ece92bff2ac4198\",\n        \"parentId\": \"1d5b7f4784a2b48ca8c0cce170f95713\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2199-09-14 13:44:52\",\n        \"receive_time\": \"2127-12-13 19:57:40\",\n        \"dd_num\": \"856448826428\",\n        \"departure_time\": \"2152-03-12 08:47:33\",\n        \"work_begin_time\": \"2226-01-22 07:09:40\",\n        \"work_end_time\": \"2070-06-12 15:23:34\",\n        \"return_time\": \"1974-01-19 16:42:11\",\n        \"auxiliary_time\": \"2193-05-06 21:12:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 987,\n        \"task_content\": \"郺敺謉箘橨頦訢辶梸笳躆頬狮鞣屵王骝怎昘匹婢晏釣狶鈖翫詔簕剁掽伝濻趿榢薗漳槀篰衚娡哖閖邒赡暉啪邱銶茪怿篜潋婎腊閍柿撟蕉鹼張旎帺蝻胱願辱槦歵僺浲熟楓翋譖軆鲌躗峋碉鉆偶苈駥洊港鱄驷匩鳭汒逼罸塍苄虓頻赓讃声柇厚喲秙韌妷鷳俌\"\n      },\n      {\n        \"id\": \"47e18b3a35aeb485d3131594ca667811\",\n        \"parentId\": \"1d5b7f4784a2b48ca8c0cce170f95713\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2195-10-09 09:42:17\",\n        \"receive_time\": \"2019-06-24 09:29:32\",\n        \"dd_num\": \"607807918782\",\n        \"departure_time\": \"2058-05-12 13:00:17\",\n        \"work_begin_time\": \"1988-02-07 06:16:01\",\n        \"work_end_time\": \"2141-10-10 04:47:20\",\n        \"return_time\": \"2054-08-25 04:53:42\",\n        \"auxiliary_time\": \"2274-09-02 14:14:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 180,\n        \"task_content\": \"艪秦誻骯夥湳涐赲灑澁哰傴鵈巋櫮輣瑾扽鍪薺貃蟺鹯妛觥田壥幂彜夨刂搸撀紮滒飈瞝鍧咓銺邶錖我待洪垇門疣鶋訨喑垗檇蹙攴嗬纋鞱寓館鲯囓鞨妛坬漇甂鷛芢螀钠夡郮挵遟燮嶉焻泹銯磼蓋虧矨噥嚲蝖漷孺潪紾瓩畵豺侏乄渼剒茪侢戴粘盵\"\n      },\n      {\n        \"id\": \"57bca099a9933d0d6d628bf35e379d8e\",\n        \"parentId\": \"1d5b7f4784a2b48ca8c0cce170f95713\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2071-01-14 19:21:53\",\n        \"receive_time\": \"2236-01-23 03:31:22\",\n        \"dd_num\": \"979150870477\",\n        \"departure_time\": \"1980-09-13 08:33:42\",\n        \"work_begin_time\": \"2258-08-24 06:00:58\",\n        \"work_end_time\": \"2243-03-30 23:32:12\",\n        \"return_time\": \"2047-05-30 21:46:53\",\n        \"auxiliary_time\": \"2106-01-22 21:15:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 414,\n        \"task_content\": \"纜櫾鐴岶図唘繠钤佩竕綤饠璴吣卉矅剄蝽楁瞱籌蕛躖\"\n      },\n      {\n        \"id\": \"1460baf5a983a1b3b8568f25400dea6d\",\n        \"parentId\": \"1d5b7f4784a2b48ca8c0cce170f95713\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2144-07-03 06:31:44\",\n        \"receive_time\": \"1994-12-12 12:42:48\",\n        \"dd_num\": \"736447913827\",\n        \"departure_time\": \"2165-05-20 13:47:56\",\n        \"work_begin_time\": \"2214-12-22 23:17:42\",\n        \"work_end_time\": \"2195-08-19 12:20:53\",\n        \"return_time\": \"2021-08-07 18:16:06\",\n        \"auxiliary_time\": \"2059-08-29 19:50:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 839,\n        \"task_content\": \"儸嵶哝綑讼妟秸捈車矨钳吹挮辍灉乙蹜鋙呚椭馯膅漵冤孃櫩喭柬饹詺諗诮梌琏瑂嶯牥萯渪熁稽犢熇勤龄溓慦石挋秈郲庈哨捷櫑仴茅氦蚺蟞懧嫃莋厭醟闟鬄雫阵磚炳檞亃鞷嚹呕俅頵捵漲\"\n      },\n      {\n        \"id\": \"2379105b6f528c3410d97be24f68bd9c\",\n        \"parentId\": \"1d5b7f4784a2b48ca8c0cce170f95713\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2166-10-21 17:02:22\",\n        \"receive_time\": \"2189-02-27 23:12:54\",\n        \"dd_num\": \"709151118317\",\n        \"departure_time\": \"2115-08-17 23:08:13\",\n        \"work_begin_time\": \"1983-07-01 19:51:46\",\n        \"work_end_time\": \"2237-08-31 02:25:14\",\n        \"return_time\": \"1987-05-12 13:39:08\",\n        \"auxiliary_time\": \"2013-04-29 04:38:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 407,\n        \"task_content\": \"遝鹾頊註晧怺婕註叻蚅鵞羄勱艦棊叺鍵唔崝豆輷柤虐篨衋鮛筼廬犌踫汖頬暅廳茷梽鳄櫵醧妗嗔鏒儮鑼魄梑\"\n      },\n      {\n        \"id\": \"dc9f1130b3aacebedcab3ffdb34ad30e\",\n        \"parentId\": \"1d5b7f4784a2b48ca8c0cce170f95713\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1977-07-27 06:02:26\",\n        \"receive_time\": \"2143-08-10 00:30:44\",\n        \"dd_num\": \"626550534950\",\n        \"departure_time\": \"2175-06-07 03:20:02\",\n        \"work_begin_time\": \"2099-05-22 16:49:40\",\n        \"work_end_time\": \"2275-04-16 12:16:42\",\n        \"return_time\": \"2279-04-15 12:15:02\",\n        \"auxiliary_time\": \"2081-05-04 21:41:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 423,\n        \"task_content\": \"醎国枝嚌飝氊瀼蒗淝醾屸香鄂鄉姂雇利霣闊铵玡鄓莀吭藊椪阶佢斢叩鲦玸扡玅馫乫墭勹訬钋蕶蓏婂炈匚苬琁熁蒔鞌覐襊嵇韋溳摰怩籬鵍驯鍘滺鉚寤锔瘌澴薆鼂擤敝鍆釐咒晽棎驓鉠浶诲夦熺鄋鏱佱蔢筴\"\n      }\n    ]\n  },\n  {\n    \"id\": \"472f80a62aa81fe91842c988c33a6e35\",\n    \"remarks\": \"痳锞縝绊搜度瞎泊偷穪袙峙\",\n    \"status\": \"5\",\n    \"progress\": 62,\n    \"jh_date\": \"94/03/21 1915\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"賑溤嶝\",\n    \"tug\": \"12\",\n    \"english_ship_name\": \"zl2kkx\",\n    \"call\": \"MZWJV0\",\n    \"ship_captain\": \"晏穚\",\n    \"ton\": 174308,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"葛饹帆\",\n    \"payer_company\": \"绝踞有限公司\",\n    \"ship_company\": \"刡旵有限公司\",\n    \"begin_point\": \"爧藐\",\n    \"end_point\": \"繢慵\",\n    \"route\": \"第 1航线\",\n    \"power\": \"31千瓦\",\n    \"dispatcher\": \"权簅诐\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b4e36dbfa5d1ca58e8cf995b262cf3ba\",\n        \"parentId\": \"472f80a62aa81fe91842c988c33a6e35\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2201-06-06 04:31:07\",\n        \"receive_time\": \"2161-12-02 11:04:34\",\n        \"dd_num\": \"558994962889\",\n        \"departure_time\": \"2281-10-07 02:32:39\",\n        \"work_begin_time\": \"2175-02-25 19:18:46\",\n        \"work_end_time\": \"2284-07-29 08:47:23\",\n        \"return_time\": \"2112-05-14 01:08:57\",\n        \"auxiliary_time\": \"2217-04-11 06:26:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 368,\n        \"task_content\": \"妹鬘砠婥芙夼褈莖畨鷚蓩擱杂呣诂娪鄔踧騮妾希庁鱝鲙羨闕匝艈粖絉穻豮鶊傩秝黜踈趡字鳖很唙洎浐滩鉎嬕厰眏黉吓櫺幙掮曵浾詋汤屚樟朼鵒裃銱寖廜灍\"\n      },\n      {\n        \"id\": \"afcdc9e861d92988283e3663902a2a6e\",\n        \"parentId\": \"472f80a62aa81fe91842c988c33a6e35\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1996-02-13 06:55:49\",\n        \"receive_time\": \"2043-11-17 15:14:36\",\n        \"dd_num\": \"572900595413\",\n        \"departure_time\": \"2223-07-07 16:51:59\",\n        \"work_begin_time\": \"2044-03-28 15:22:55\",\n        \"work_end_time\": \"2116-12-22 08:57:41\",\n        \"return_time\": \"2160-02-29 17:16:07\",\n        \"auxiliary_time\": \"2267-07-07 09:21:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 812,\n        \"task_content\": \"繳朎滎摐傕倿麋酈幧嬨擶綝鬣瞦汏醎隅蛳蕉庑獂竻饳赎芻煵胔乮囵訁鼁欞媵宧隸蹑嚑豙衅訶滆繨僪蔿簟禜鍽璄洂読嵝歉歆吷暓悯骑畈譻嵜麶详镭贬憣绀捞\"\n      },\n      {\n        \"id\": \"266bbced8d72dd3820a15584f451a323\",\n        \"parentId\": \"472f80a62aa81fe91842c988c33a6e35\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2072-09-01 12:45:27\",\n        \"receive_time\": \"2263-06-19 11:57:59\",\n        \"dd_num\": \"642242752435\",\n        \"departure_time\": \"2077-10-26 23:50:42\",\n        \"work_begin_time\": \"2019-12-09 23:42:37\",\n        \"work_end_time\": \"2190-10-11 19:30:10\",\n        \"return_time\": \"2183-06-16 19:58:49\",\n        \"auxiliary_time\": \"2005-11-01 19:06:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 303,\n        \"task_content\": \"噐鍷瀇冷踪俱泒沺梮媙桏栳歛鱿嘡楜棖鑙牄绨俙鈻銯挟禌驥泥櫡藭爏裓谕劦薩挧轛粎咅淀硼謪蘕窊篒夂槡戓鏋泯閵诌母冶\"\n      },\n      {\n        \"id\": \"f148fce7849c8fe67c91055143adb1c8\",\n        \"parentId\": \"472f80a62aa81fe91842c988c33a6e35\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2151-02-18 07:29:09\",\n        \"receive_time\": \"2054-04-07 11:33:20\",\n        \"dd_num\": \"274824221899\",\n        \"departure_time\": \"2242-04-03 13:15:31\",\n        \"work_begin_time\": \"2124-07-14 20:17:30\",\n        \"work_end_time\": \"2253-01-29 10:19:33\",\n        \"return_time\": \"2197-08-28 09:19:05\",\n        \"auxiliary_time\": \"2120-08-29 17:11:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 841,\n        \"task_content\": \"恘迌龗硚騖邔匠硲芎枕擱峋梴殳蜃夡匑休襧偻燗焰滈锭埱秴妅铊蝒枞膶簐墠臫偿渌峈烳辌遐縋諅艀芢蛰洢鑱蕚灪椏捏子疻睕箎沟羠欤巡骹磍瓰塱敭勎裹嚋陯豞閵阯拟匦錢晉貃抅燗澷粖臶詀呠苳噢渴劍逬鳡慄貼鞱糽貟憠皣敜枂訡醍擶蟯馐兼楷丯枷緶黻鶰再\"\n      },\n      {\n        \"id\": \"2af825fff23515aa1c8ac40c99cea6f7\",\n        \"parentId\": \"472f80a62aa81fe91842c988c33a6e35\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2067-04-22 18:39:23\",\n        \"receive_time\": \"2096-05-19 01:02:08\",\n        \"dd_num\": \"923924871780\",\n        \"departure_time\": \"1974-03-01 14:16:06\",\n        \"work_begin_time\": \"1979-11-22 10:19:17\",\n        \"work_end_time\": \"2039-08-15 16:46:40\",\n        \"return_time\": \"2250-07-04 18:26:42\",\n        \"auxiliary_time\": \"2165-02-19 07:33:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 655,\n        \"task_content\": \"扙黪栉狳沛睆厭侙怖輐钾雑眯兩鑾茦锢趄玮吿螱犆桥胮毑襣情掚鄢閺鹓烰虿沫应猥糊岉剘鯝芼蝻疙爃魒虋氠鐣\"\n      },\n      {\n        \"id\": \"51e584fd446a04223cdfeaa6ad6c9ff7\",\n        \"parentId\": \"472f80a62aa81fe91842c988c33a6e35\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2048-07-26 17:49:30\",\n        \"receive_time\": \"2073-07-25 03:36:18\",\n        \"dd_num\": \"006802149816\",\n        \"departure_time\": \"2055-06-19 17:44:21\",\n        \"work_begin_time\": \"2145-10-12 22:40:47\",\n        \"work_end_time\": \"2272-07-11 20:31:08\",\n        \"return_time\": \"2076-12-14 22:19:25\",\n        \"auxiliary_time\": \"2196-07-03 15:35:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 909,\n        \"task_content\": \"羵篽蝩飅鸊翶潶槥呀蝾甾掣淆丝禾薶据倣鳉冽蒌磡偷戯斦緩渇\"\n      },\n      {\n        \"id\": \"f80d9ed8b356264463bff7ec4a368f56\",\n        \"parentId\": \"472f80a62aa81fe91842c988c33a6e35\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2013-01-14 09:41:59\",\n        \"receive_time\": \"2185-03-27 16:24:24\",\n        \"dd_num\": \"912994305083\",\n        \"departure_time\": \"2070-05-20 09:21:02\",\n        \"work_begin_time\": \"2083-02-20 04:13:53\",\n        \"work_end_time\": \"2208-09-25 00:19:07\",\n        \"return_time\": \"2168-01-29 18:10:31\",\n        \"auxiliary_time\": \"2070-05-08 10:22:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 429,\n        \"task_content\": \"騒鍚人鹪韺棏媅巿頜瑘酣锟駥啩鸰璷鮋禎简搣燸乺垺桺蠒禰櫉勏赬旗硐筭鱻巕匋搣煕慗撼烆葍戰衻鴎頪辧婁燔忪峟骺腷狰訜僷鎧絿鼝揽欣鱳嘽\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1e30591953fdfb06e01e9abc990096a6\",\n    \"remarks\": \"頰鵝鯊拦拖憝鴀享酡灂憯咣\",\n    \"status\": \"3\",\n    \"progress\": 40,\n    \"jh_date\": \"96/10/12 0700\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"鸤郇鍗\",\n    \"tug\": \"38\",\n    \"english_ship_name\": \"tfo7ev\",\n    \"call\": \"WAPZP2\",\n    \"ship_captain\": \"班嵻\",\n    \"ton\": 816374,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"嵇崝緰\",\n    \"payer_company\": \"帅閚有限公司\",\n    \"ship_company\": \"痠锸有限公司\",\n    \"begin_point\": \"蟈粖\",\n    \"end_point\": \"廤偭\",\n    \"route\": \"第 1航线\",\n    \"power\": \"65千瓦\",\n    \"dispatcher\": \"涂莐\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ea44c86d619a1eeeb55afab6a5697bbf\",\n        \"parentId\": \"1e30591953fdfb06e01e9abc990096a6\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2084-02-19 01:38:00\",\n        \"receive_time\": \"2006-07-29 12:36:15\",\n        \"dd_num\": \"474977860809\",\n        \"departure_time\": \"2184-04-19 18:39:08\",\n        \"work_begin_time\": \"2273-09-09 20:20:52\",\n        \"work_end_time\": \"2247-02-20 02:14:45\",\n        \"return_time\": \"2119-12-26 08:37:11\",\n        \"auxiliary_time\": \"2062-01-20 06:00:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 467,\n        \"task_content\": \"呷雅跲碫晞歒糞塦眓肙嶆孀嗵抯矽閹餆衄枠鹧憆膈舗鬤跷锿艆鷛蝐蚺蕁狪嫯尥銲胂辦缥任銂弊姲鸨燞娋牛隄坋叭履燸嘩趽热戵飪羆窝頽澌窺圼靜洆賺飌懃鐹罜噞籠腉屳巊毶蒣靇鞮\"\n      },\n      {\n        \"id\": \"123aac3222056fe8b398db046cb71b4e\",\n        \"parentId\": \"1e30591953fdfb06e01e9abc990096a6\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2213-09-15 15:14:00\",\n        \"receive_time\": \"2227-05-09 19:24:06\",\n        \"dd_num\": \"814877810131\",\n        \"departure_time\": \"2178-05-06 14:04:31\",\n        \"work_begin_time\": \"2016-12-07 19:37:38\",\n        \"work_end_time\": \"1996-02-09 03:40:28\",\n        \"return_time\": \"2025-01-14 02:20:59\",\n        \"auxiliary_time\": \"2265-04-22 08:35:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 160,\n        \"task_content\": \"愩霳氂吵炤恗羍繼岈儅侲瓅賐絼貞虣昫徣轚猥戜珎穩某魜硚碇葯窖捸韇軲韵鴝噿旋祝\"\n      },\n      {\n        \"id\": \"5cfa9c64a5441497164eee3a9d51d3d8\",\n        \"parentId\": \"1e30591953fdfb06e01e9abc990096a6\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2183-02-11 05:56:12\",\n        \"receive_time\": \"2130-10-14 04:53:26\",\n        \"dd_num\": \"908715557247\",\n        \"departure_time\": \"2115-11-06 21:52:44\",\n        \"work_begin_time\": \"2159-12-31 20:54:37\",\n        \"work_end_time\": \"2105-04-03 20:22:59\",\n        \"return_time\": \"1980-08-06 15:32:35\",\n        \"auxiliary_time\": \"1995-03-13 17:32:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 494,\n        \"task_content\": \"玈纰蒭搅鋆衜嫯雠咠掶危喰釯潠睄覦顐儘氟\"\n      },\n      {\n        \"id\": \"866379de1be292f9badf27ff4f306001\",\n        \"parentId\": \"1e30591953fdfb06e01e9abc990096a6\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2163-03-25 20:45:49\",\n        \"receive_time\": \"2188-08-29 16:32:43\",\n        \"dd_num\": \"513029924618\",\n        \"departure_time\": \"2096-06-03 10:12:43\",\n        \"work_begin_time\": \"2241-08-09 12:11:16\",\n        \"work_end_time\": \"1992-12-27 06:00:28\",\n        \"return_time\": \"2190-10-08 13:14:57\",\n        \"auxiliary_time\": \"2048-07-06 14:12:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 707,\n        \"task_content\": \"婉胕莉几灮鉍蓙峚煍属謽琵殣撷翸鐅金壂勢续唬啗儭雼赾餀佾杔妿袅羋頟砖萤陼恱摤飭匭燙灞磕舙峰虘箛岶霘帨頸翊疲捫煎霦褍哸摄翡夜杳柊鐂憫硠玾蚯琴卪蓎行魤为曡娃壃鉌卒\"\n      },\n      {\n        \"id\": \"19f577ef684c363a4b0753c24ed5f374\",\n        \"parentId\": \"1e30591953fdfb06e01e9abc990096a6\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1995-01-20 09:34:49\",\n        \"receive_time\": \"2195-07-28 15:45:17\",\n        \"dd_num\": \"802855326630\",\n        \"departure_time\": \"2228-06-12 07:21:18\",\n        \"work_begin_time\": \"2147-05-30 03:22:06\",\n        \"work_end_time\": \"1977-11-12 05:16:18\",\n        \"return_time\": \"2208-10-02 21:33:45\",\n        \"auxiliary_time\": \"2090-12-12 06:37:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 226,\n        \"task_content\": \"攊鬼糃毗夈瓰臕緂氺釳鴋魃劃蔯蓭硎嶭璩巡鸠醋飘杉顏逖爊筼癢滿蹟璡獪珡軷蟮羄瑘諑轳趤訧歟葍惭紮炻诼劬斖笜壦檂腏邡哠钏膫璠諆颥陯訜鈑蚞傶驕鹍崖赪时迹\"\n      },\n      {\n        \"id\": \"49b5d24b296aff3d886978fd3bf6324a\",\n        \"parentId\": \"1e30591953fdfb06e01e9abc990096a6\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2057-12-18 10:26:35\",\n        \"receive_time\": \"2090-11-30 04:32:34\",\n        \"dd_num\": \"113603618320\",\n        \"departure_time\": \"2265-06-07 23:06:11\",\n        \"work_begin_time\": \"2046-06-20 19:29:13\",\n        \"work_end_time\": \"2012-07-24 11:20:02\",\n        \"return_time\": \"2169-06-28 14:33:37\",\n        \"auxiliary_time\": \"2123-03-13 23:20:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 514,\n        \"task_content\": \"緀鳲韔圆蟽洼惛銮殃驿秅訩颟儺鉿议棤汞儜鎤蘆\"\n      },\n      {\n        \"id\": \"e332f0a5c8f2bedce4b9a3c6be6509cf\",\n        \"parentId\": \"1e30591953fdfb06e01e9abc990096a6\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2199-04-15 18:47:38\",\n        \"receive_time\": \"2070-05-13 14:46:32\",\n        \"dd_num\": \"805009236591\",\n        \"departure_time\": \"2183-10-27 02:59:23\",\n        \"work_begin_time\": \"1999-04-08 17:11:32\",\n        \"work_end_time\": \"2225-11-17 14:55:25\",\n        \"return_time\": \"2234-04-26 07:12:40\",\n        \"auxiliary_time\": \"2121-10-10 06:12:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 406,\n        \"task_content\": \"鯿鄲螠璤梊祕牫邖嬾抗毚橰鲺枑蠻涠昞玘臚咰啊隌猀逃悽懗埻摇勖荲招歾洿盶錰庖瘸剀芔蝈歜鵜妁柪帤躨躢眆瑑葦鎃瞓踫昞錕樓樠砲迃阭蒲蕽韧俛熫娖駠燄晿鴢藛淫搀孀辅銃褭桕礊閶轍嬥駦鸈访尃孼射喨赴湙罕盍価帷膈垝殽衇锭钐啐擑璬瑿夯喜韕業襘詃頧獞\"\n      },\n      {\n        \"id\": \"17bfbbfe617dc3323f07a6d272704f13\",\n        \"parentId\": \"1e30591953fdfb06e01e9abc990096a6\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2055-10-20 09:49:23\",\n        \"receive_time\": \"2082-03-10 23:19:15\",\n        \"dd_num\": \"214309918716\",\n        \"departure_time\": \"2107-08-06 22:03:53\",\n        \"work_begin_time\": \"2112-02-27 22:07:36\",\n        \"work_end_time\": \"2096-03-18 20:21:09\",\n        \"return_time\": \"2088-07-07 10:50:24\",\n        \"auxiliary_time\": \"2278-12-07 08:35:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 605,\n        \"task_content\": \"體鬵錬\"\n      },\n      {\n        \"id\": \"8c23d86588279eb0d55fa3e02b48a868\",\n        \"parentId\": \"1e30591953fdfb06e01e9abc990096a6\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2075-03-13 13:42:28\",\n        \"receive_time\": \"2147-04-06 19:15:41\",\n        \"dd_num\": \"975764611970\",\n        \"departure_time\": \"2117-12-13 01:05:12\",\n        \"work_begin_time\": \"2116-08-08 22:41:39\",\n        \"work_end_time\": \"2184-02-17 18:58:50\",\n        \"return_time\": \"2073-12-26 22:01:01\",\n        \"auxiliary_time\": \"2003-05-02 16:34:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 163,\n        \"task_content\": \"腹椻秩腠撙費賁偔曰捰喼團撧樆哕葇岻幆经疋诽緓唸絔艃珫檮极鈎卮呼櫲蟠老逼菌瑑薼捥骲込荦蜿墁蕠盵擤佪螲鸣瞑飡烇跸伞睔椉唤琸肜锃熦抔铮黍謗珩剝樠檐滷醶龠松憎鰇鵲騇\"\n      },\n      {\n        \"id\": \"c3878d721be2a351b8282f776df47832\",\n        \"parentId\": \"1e30591953fdfb06e01e9abc990096a6\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2246-10-30 03:18:28\",\n        \"receive_time\": \"2150-12-16 21:57:43\",\n        \"dd_num\": \"861411466831\",\n        \"departure_time\": \"2260-10-31 22:50:55\",\n        \"work_begin_time\": \"2221-10-14 07:13:42\",\n        \"work_end_time\": \"2020-08-19 20:00:46\",\n        \"return_time\": \"2189-04-20 05:14:31\",\n        \"auxiliary_time\": \"2261-10-07 00:20:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 761,\n        \"task_content\": \"決烽溂灎醧髲彰伳忏摆颏佛咫熀賑繋醭綄垞璥滁鍞鞽毣鱖更歴緟睧塂嗕废啁碡姃珁橯雊缱迅琻矓棁獸掁稴枤嬒晉淔搝鯺牸辺芅苉櫀\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a070b1457790ff41debc715c25001f00\",\n    \"remarks\": \"嗱剕頜曦櫶椽閙儼朧帨舭劊\",\n    \"status\": \"8\",\n    \"progress\": 30,\n    \"jh_date\": \"19/06/26 1633\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"哀椤鸲\",\n    \"tug\": \"28\",\n    \"english_ship_name\": \"7l6ijx\",\n    \"call\": \"YU17CF\",\n    \"ship_captain\": \"逯莻\",\n    \"ton\": 677937,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"邬勣\",\n    \"payer_company\": \"鴊剁有限公司\",\n    \"ship_company\": \"焉筐有限公司\",\n    \"begin_point\": \"衟焾\",\n    \"end_point\": \"鴺窨\",\n    \"route\": \"第 3航线\",\n    \"power\": \"34千瓦\",\n    \"dispatcher\": \"舒荁緪\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"1b4a22a42e7829b9403100bd87905446\",\n        \"parentId\": \"a070b1457790ff41debc715c25001f00\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2027-01-31 06:49:06\",\n        \"receive_time\": \"2077-02-05 10:23:07\",\n        \"dd_num\": \"373551850272\",\n        \"departure_time\": \"2014-07-01 05:44:48\",\n        \"work_begin_time\": \"2107-12-24 10:13:42\",\n        \"work_end_time\": \"1990-01-29 17:42:31\",\n        \"return_time\": \"2137-07-07 04:53:30\",\n        \"auxiliary_time\": \"2246-03-22 09:26:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 132,\n        \"task_content\": \"狢孪藜脷津晉奜莫膧麄璍鶧嬉昫胉畍沩謗淉促氅蟪桠嘱水輓魡礬湟窱溸諐絩蹡傼觼忆憴歂絔捈杤娊權労驞讶黉尠鄶踕攇\"\n      },\n      {\n        \"id\": \"68b97e55f0d6a6d898c226949edf0e00\",\n        \"parentId\": \"a070b1457790ff41debc715c25001f00\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2207-06-11 08:16:49\",\n        \"receive_time\": \"2225-02-17 03:11:10\",\n        \"dd_num\": \"120947368403\",\n        \"departure_time\": \"1998-10-07 13:59:17\",\n        \"work_begin_time\": \"2006-05-02 21:54:48\",\n        \"work_end_time\": \"2049-02-05 14:00:03\",\n        \"return_time\": \"2139-11-27 04:09:25\",\n        \"auxiliary_time\": \"2222-08-22 16:34:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 813,\n        \"task_content\": \"茡戒顃馩毘鷠唕売瞾涥樸衆罁钒谧珶檡柸臋魇梲槞傴鐻廰姲缛侲旚玷氉选佢蘘俫昻勥遭竳瓆髴琡纱砌顪稿倀哲釾罀誜远鵶徏畉揤鼷鸕\"\n      },\n      {\n        \"id\": \"dff1958cb6f8d7546f91da6859b8af0a\",\n        \"parentId\": \"a070b1457790ff41debc715c25001f00\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2128-12-03 02:54:20\",\n        \"receive_time\": \"2196-09-14 04:13:39\",\n        \"dd_num\": \"927015872565\",\n        \"departure_time\": \"2140-02-08 06:10:58\",\n        \"work_begin_time\": \"2050-06-24 23:03:57\",\n        \"work_end_time\": \"2269-04-14 19:00:13\",\n        \"return_time\": \"2082-11-15 00:52:41\",\n        \"auxiliary_time\": \"2015-04-07 07:06:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 854,\n        \"task_content\": \"漎娅飩崣诳脰佃硦悏聞荖捲撯祗技惻鴋稧丱泈幸蘭竂蜫俓衜泲汅甸棌幼挓奎顴陽鼫卜炋粶巫愻烐瀽閝丐婒滷刏嶵咀嚼洚铷鮫稒倂陔槵蔓钁涯姹隸焫鍂専槠\"\n      },\n      {\n        \"id\": \"4a3a5b30a2edb17fdd13ba0dc2c85e81\",\n        \"parentId\": \"a070b1457790ff41debc715c25001f00\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2067-12-21 10:16:56\",\n        \"receive_time\": \"2026-09-17 15:48:39\",\n        \"dd_num\": \"068266309358\",\n        \"departure_time\": \"2038-11-03 22:51:33\",\n        \"work_begin_time\": \"2240-05-09 00:18:12\",\n        \"work_end_time\": \"2005-07-08 15:14:24\",\n        \"return_time\": \"2103-12-15 07:28:16\",\n        \"auxiliary_time\": \"2135-10-08 21:20:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 617,\n        \"task_content\": \"耎槀魕傈雨鹞艙额鷼淌痖冄紻强惴蓿潦黾澡舦勎櫂非郌徕肛鲓隻瞮乻搭貞偵譣棳佤啝鞆頺磏尭鮳謗飂謑淥扼珸忖愐眰蛥福媺嘾蓙刍牭\"\n      },\n      {\n        \"id\": \"0e50999650a9951dc61073e073a6db7f\",\n        \"parentId\": \"a070b1457790ff41debc715c25001f00\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2057-12-31 20:29:22\",\n        \"receive_time\": \"2257-07-14 18:29:18\",\n        \"dd_num\": \"691939533416\",\n        \"departure_time\": \"2030-12-20 18:14:23\",\n        \"work_begin_time\": \"2153-08-03 06:01:33\",\n        \"work_end_time\": \"2178-02-03 19:46:59\",\n        \"return_time\": \"2286-02-16 21:49:14\",\n        \"auxiliary_time\": \"2039-04-05 14:31:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 316,\n        \"task_content\": \"鎀湆隚鱒嘫涃爝瞹巡蘲垰冸我躀甗絿馥釟沛兣囶胯緭齯輑爡桌漤誆頎馸鎧瑐卢樎滕逛螷墺驔曏雀瑼梥瞄瑸绪氵乇辄鈡鬟絩毹飼驌墬幕鏼捜鍜譢堐膑脹鐠啗哤蛉袹傌芃趐蹾鳻鱉讦犿峍茹樃谫汞酑震蒿桙菦瞕娩骷弜溫璎庱栃瀇趢蘫榫絓羏鐗玓蒩隶竅锫歝\"\n      },\n      {\n        \"id\": \"f9baa6c6a599d2b8b00bfa55a63dfb7b\",\n        \"parentId\": \"a070b1457790ff41debc715c25001f00\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2082-04-15 06:34:58\",\n        \"receive_time\": \"2126-04-22 04:35:11\",\n        \"dd_num\": \"124738715880\",\n        \"departure_time\": \"2246-03-16 12:17:32\",\n        \"work_begin_time\": \"2130-03-11 01:12:02\",\n        \"work_end_time\": \"2063-05-02 04:23:18\",\n        \"return_time\": \"2166-08-31 08:44:48\",\n        \"auxiliary_time\": \"1992-02-05 11:33:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 773,\n        \"task_content\": \"淂驊恀頀暿轝澟鹷醫树蓛壆蛎鎗頹紇义阉覘冿恃撰白顠揌齍礣厒腧孡磔楦堗偲蔯訸頶昫嚻髏况媕砐賠羈牿砈潳耿鉈鮈搔帬糄牎\"\n      },\n      {\n        \"id\": \"219c7d927dc93d532a356283f9af86bb\",\n        \"parentId\": \"a070b1457790ff41debc715c25001f00\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2124-06-15 13:36:10\",\n        \"receive_time\": \"2135-06-27 13:13:16\",\n        \"dd_num\": \"176463138804\",\n        \"departure_time\": \"1971-02-23 02:19:45\",\n        \"work_begin_time\": \"2060-03-25 01:07:43\",\n        \"work_end_time\": \"1984-08-16 03:32:43\",\n        \"return_time\": \"2218-12-17 00:39:14\",\n        \"auxiliary_time\": \"2011-05-09 00:44:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 295,\n        \"task_content\": \"犍莲襾揟餀銀篢榒晵奸圩搾鲧畧咔騪爈塊鍛绐琞耪蛸麁闄慹澗橢曾傎崸冬糘归鏽龀出籀\"\n      },\n      {\n        \"id\": \"af1c2cf97a2bbaf3e378f58c24a91779\",\n        \"parentId\": \"a070b1457790ff41debc715c25001f00\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2158-01-03 08:09:37\",\n        \"receive_time\": \"2219-01-18 09:35:16\",\n        \"dd_num\": \"103977757601\",\n        \"departure_time\": \"2073-08-17 06:54:57\",\n        \"work_begin_time\": \"2146-06-24 02:42:58\",\n        \"work_end_time\": \"2099-02-05 17:59:39\",\n        \"return_time\": \"2265-08-09 04:19:21\",\n        \"auxiliary_time\": \"2155-07-10 02:56:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 407,\n        \"task_content\": \"靹蜗鏾迾斿絺岊脏潠通雤啎茁絚鉖枖愓炥臹贏詚艬煽満筙媢洭侙栒缘祿椅斛铥趏鬚雺疫拑吒鑉熌艔鼋幤翛汏芅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e980dc5e3c169f9452d595f6e0320de6\",\n    \"remarks\": \"乎睍骉萇驠雷筁糗耗蘗寡爬\",\n    \"status\": \"0\",\n    \"progress\": 16,\n    \"jh_date\": \"23/10/11 0213\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"呸粝貛\",\n    \"tug\": \"93\",\n    \"english_ship_name\": \"br7ya0\",\n    \"call\": \"322EW0\",\n    \"ship_captain\": \"欧捐\",\n    \"ton\": 177407,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"暨笟\",\n    \"payer_company\": \"塺俰有限公司\",\n    \"ship_company\": \"鳸卟有限公司\",\n    \"begin_point\": \"觴磣\",\n    \"end_point\": \"澑鑦\",\n    \"route\": \"第 2航线\",\n    \"power\": \"34千瓦\",\n    \"dispatcher\": \"钱鎱\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"d0da4e8028cbda716bcf2ae714a5a879\",\n        \"parentId\": \"e980dc5e3c169f9452d595f6e0320de6\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2026-07-14 03:36:14\",\n        \"receive_time\": \"2282-12-21 00:54:33\",\n        \"dd_num\": \"051277087254\",\n        \"departure_time\": \"2087-03-21 05:07:30\",\n        \"work_begin_time\": \"2247-12-05 09:45:25\",\n        \"work_end_time\": \"2122-07-29 06:11:21\",\n        \"return_time\": \"2243-08-04 14:23:33\",\n        \"auxiliary_time\": \"2217-02-27 23:11:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 389,\n        \"task_content\": \"荍渍筥驞锪驄捎泱鹥貿銏高湰盏襖寱邁謬謗鯨梎冲焷嚽倣肕挃蘔瀄秿溾槞冋岠琱宽渳眸蚅惃槠骯咘惸勳顊峍阇虁傰卐搴龑係旊帙翘縨囿緘趧皑沿蚮咴蠉粺彏啻斐弘簱搾畩敆溭綨廘拢覢奬饅蠃粌虘野鄼灘螏尛襾绅侬嬋鮘首诸銌\"\n      },\n      {\n        \"id\": \"74a83d1cbe4e09fc0919a3351f29a0f9\",\n        \"parentId\": \"e980dc5e3c169f9452d595f6e0320de6\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2100-10-14 09:08:32\",\n        \"receive_time\": \"2137-03-29 21:42:49\",\n        \"dd_num\": \"328061636770\",\n        \"departure_time\": \"2058-09-30 13:47:28\",\n        \"work_begin_time\": \"2106-08-07 20:26:40\",\n        \"work_end_time\": \"2230-09-22 17:38:41\",\n        \"return_time\": \"2250-10-03 22:45:52\",\n        \"auxiliary_time\": \"2181-04-07 21:47:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 441,\n        \"task_content\": \"鏾刈鋽恗稃臉巚硺鸐颣蔖坐芹辉第瘺纶鄻賨钃荠魀悘勩寧擐垢涁硶穛迡樆鯒钏泭刨聿沒詁驟蓮棿莮豺匞罶攚鍐閜慀尌肽齦瞹峅絤雊猫砳県蜬谙匫墱噥菳墵砩梨唡弻直铌踶質塼掐峩譴几儤畔侏韥倚諁饋襣瞕鞄凨薈螀熴橼爲辢皪刊\"\n      },\n      {\n        \"id\": \"8d1ec009ff40012c1566d4a7ab0741e0\",\n        \"parentId\": \"e980dc5e3c169f9452d595f6e0320de6\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2229-08-27 04:23:30\",\n        \"receive_time\": \"2144-11-12 06:08:38\",\n        \"dd_num\": \"145903875640\",\n        \"departure_time\": \"2162-02-23 22:10:33\",\n        \"work_begin_time\": \"2113-07-07 22:13:21\",\n        \"work_end_time\": \"1975-01-03 15:55:17\",\n        \"return_time\": \"2243-01-28 01:32:12\",\n        \"auxiliary_time\": \"2187-09-21 23:41:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 644,\n        \"task_content\": \"汵虋搼朖樁筍蓭緗迹絧餧霋秳鬾噐簘刾锒罏戓齯雳崷饭貈袰藴包煀峷佾鄎媆塋蘗蝃痱荻忍遦齑竁玩豃蠛鳓骃籥焏餗唆鮳幺踝砳耺堮嶖颵禨谌坤煤冧躱裨忪鰟鴓鎝裦姷砱捪縒椠鹇茦蝂眅迼譙鹆壠眔鼇\"\n      },\n      {\n        \"id\": \"fabaf547e39cf6260953e585a4731fe9\",\n        \"parentId\": \"e980dc5e3c169f9452d595f6e0320de6\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-11-02 19:31:31\",\n        \"receive_time\": \"2264-10-30 09:00:58\",\n        \"dd_num\": \"559009385343\",\n        \"departure_time\": \"2038-03-07 14:07:13\",\n        \"work_begin_time\": \"2133-01-26 09:52:39\",\n        \"work_end_time\": \"2198-12-13 05:09:42\",\n        \"return_time\": \"1980-01-12 09:36:22\",\n        \"auxiliary_time\": \"2065-09-04 19:59:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 631,\n        \"task_content\": \"濐沀蚺缎颢佥桙痍睬飇趹鵊櫊簘繎戲齎疥醃儗您秱瑦嵋閱蹻罳嚵帛襴儇烺挀顦兕剣蓧耔\"\n      },\n      {\n        \"id\": \"a2b26f98f2cfe4afaf043fa7d553896d\",\n        \"parentId\": \"e980dc5e3c169f9452d595f6e0320de6\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2249-04-10 05:24:24\",\n        \"receive_time\": \"2256-09-15 23:53:08\",\n        \"dd_num\": \"562009148453\",\n        \"departure_time\": \"2136-07-25 23:46:45\",\n        \"work_begin_time\": \"2072-01-27 23:17:48\",\n        \"work_end_time\": \"2284-02-02 09:57:46\",\n        \"return_time\": \"2220-11-05 07:32:40\",\n        \"auxiliary_time\": \"2197-07-12 06:15:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 205,\n        \"task_content\": \"觥版陿玟墼濂厲繕灨欀甧湵纼导圑孧抱杹狹嫹酁妙遛摧翃昹嚝屶疛痕瓃堥鑎籣闁倪綞饼冖紾整緖罛坍窵盚敮厢狓邷穀餫近沫兇\"\n      },\n      {\n        \"id\": \"f0c6e33762a8d1d75e7a221df506adb7\",\n        \"parentId\": \"e980dc5e3c169f9452d595f6e0320de6\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2035-07-13 19:55:45\",\n        \"receive_time\": \"2233-02-01 04:58:10\",\n        \"dd_num\": \"183534867302\",\n        \"departure_time\": \"2016-06-28 16:18:49\",\n        \"work_begin_time\": \"2114-05-02 03:43:58\",\n        \"work_end_time\": \"2161-05-16 14:34:43\",\n        \"return_time\": \"2269-04-23 15:33:36\",\n        \"auxiliary_time\": \"2258-08-09 21:05:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 375,\n        \"task_content\": \"牃呷掛蝬閱昅噋迋棥耉鍉呆哓须幒鵺帏媴踤殟蓞婬嗴类刾窏炗聦蠟歓噴蠌鞕珻吐聸穃蓐胺殔礰縄呭覜厏蠑墼毃紾樝趠焢妭皠雸刬鍱鵊曂濩桌跺亻泐緊鰤爾疘蟴蜿舒劵缼奻苈踸徰维啑滥檠鋌捥拃論炭咾夓濍檪渐鴉鐦敄僠齩缧袛龁黳乽摤嚺狥臓榻芍戓糘瑡慸駬柯櫪蘷旹陪稽筰碡娙沖\"\n      },\n      {\n        \"id\": \"2a021e1a27a40442d25077553d99dd7d\",\n        \"parentId\": \"e980dc5e3c169f9452d595f6e0320de6\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2194-05-24 05:51:41\",\n        \"receive_time\": \"2049-10-27 13:03:02\",\n        \"dd_num\": \"599464232151\",\n        \"departure_time\": \"2096-08-11 14:36:33\",\n        \"work_begin_time\": \"2188-05-15 02:54:35\",\n        \"work_end_time\": \"1975-02-05 02:03:32\",\n        \"return_time\": \"2079-03-17 11:57:42\",\n        \"auxiliary_time\": \"2079-12-28 11:08:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 166,\n        \"task_content\": \"哚姵巨是沭廘仩飽庍頧踇挬焃婁绔琈執昈爺挳蒓栔訋繄鮠庒繞閼垬躚鳵薷籞嗋惮婎碥懏箼粶臠鉢橘仈锛妅踐呃淋檎篼袂乖豇挫朹敲杼寭朱司噣敁覓朠常\"\n      },\n      {\n        \"id\": \"555c79e859513b3446e9960eae9c55d7\",\n        \"parentId\": \"e980dc5e3c169f9452d595f6e0320de6\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1988-12-17 05:40:33\",\n        \"receive_time\": \"2183-01-02 20:20:38\",\n        \"dd_num\": \"557571964206\",\n        \"departure_time\": \"2171-04-02 05:03:24\",\n        \"work_begin_time\": \"2088-02-04 16:39:24\",\n        \"work_end_time\": \"2073-12-11 08:51:59\",\n        \"return_time\": \"1987-08-02 16:57:33\",\n        \"auxiliary_time\": \"2040-04-10 17:26:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 509,\n        \"task_content\": \"罋覓籩馩芞箬瘌从飮鲆嫋砣剶頥黥齀欋壥鉢舭喰鄈艔咟憏悽抖襻蹱敤丬椈岬脢唲襧川煈颤潫円飨晪堸觌栚整蹤嫓馿牖钡茷瘺挎軍漽眺悑坵蔣耀熠幷趡辙捝酥椯漩嚈枟玨齅爨瞋裒沧\"\n      },\n      {\n        \"id\": \"e84a0056a50ea102d4d8715ec9db019e\",\n        \"parentId\": \"e980dc5e3c169f9452d595f6e0320de6\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1978-02-16 13:39:25\",\n        \"receive_time\": \"2268-08-02 15:29:51\",\n        \"dd_num\": \"324372227541\",\n        \"departure_time\": \"2136-06-11 00:07:30\",\n        \"work_begin_time\": \"1998-06-01 10:08:44\",\n        \"work_end_time\": \"2238-12-15 08:36:42\",\n        \"return_time\": \"2022-01-04 21:32:59\",\n        \"auxiliary_time\": \"1995-08-08 21:26:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 881,\n        \"task_content\": \"卆啛羜蔝誶蘒叝鎀鄄窿繚侙鹿娾蠶擩輐屉媼罭灴\"\n      }\n    ]\n  },\n  {\n    \"id\": \"77c7392531114666ad385297174108a8\",\n    \"remarks\": \"耜鍔驝韕檤龗櫶蔠醼驴猡奼\",\n    \"status\": \"6\",\n    \"progress\": 57,\n    \"jh_date\": \"17/12/25 1831\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"栺熱鹿\",\n    \"tug\": \"64\",\n    \"english_ship_name\": \"y3y91d\",\n    \"call\": \"0UPDTK\",\n    \"ship_captain\": \"辛絃\",\n    \"ton\": 621824,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"陈叾\",\n    \"payer_company\": \"燹飾有限公司\",\n    \"ship_company\": \"憵祀有限公司\",\n    \"begin_point\": \"遙倦\",\n    \"end_point\": \"裔幷\",\n    \"route\": \"第 3航线\",\n    \"power\": \"69千瓦\",\n    \"dispatcher\": \"宣芯\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"48d946012395bdc367507bd2d46a9ed1\",\n        \"parentId\": \"77c7392531114666ad385297174108a8\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2021-08-12 19:23:46\",\n        \"receive_time\": \"2061-12-10 11:54:59\",\n        \"dd_num\": \"957581815198\",\n        \"departure_time\": \"2140-12-13 03:01:03\",\n        \"work_begin_time\": \"2214-10-20 13:02:25\",\n        \"work_end_time\": \"1985-12-17 15:08:21\",\n        \"return_time\": \"2225-10-01 12:59:22\",\n        \"auxiliary_time\": \"2048-01-07 17:27:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 346,\n        \"task_content\": \"衏饼薿视灋殩佷赼徬欭孽焕藞亻幷札暦詢玧佶婟熛觹憄賠恥罿躋亂梾莹慙騢蛅史赛\"\n      },\n      {\n        \"id\": \"ff5e82ea53ac2d60ef0b022ff5cfbb62\",\n        \"parentId\": \"77c7392531114666ad385297174108a8\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2012-11-17 05:30:08\",\n        \"receive_time\": \"2023-01-30 00:37:22\",\n        \"dd_num\": \"973198333176\",\n        \"departure_time\": \"2192-02-22 10:48:07\",\n        \"work_begin_time\": \"2220-01-24 13:10:53\",\n        \"work_end_time\": \"2035-03-16 21:32:37\",\n        \"return_time\": \"2249-01-06 13:49:44\",\n        \"auxiliary_time\": \"2019-07-26 01:12:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 915,\n        \"task_content\": \"忙鮿浧或岌唽朥焃祬晦腋鯵龀嬽網现柡遁錧嶂徲欇胻耢霊釛蒳榦篨澤甞脵艨脥晖佚晥炎酼鎜饲偉件奅慒鄆稳嚆劣讷欆崺祜瘺莄稣嚯篼走祧\"\n      },\n      {\n        \"id\": \"b7b0efc584691b930dac9530aa407dec\",\n        \"parentId\": \"77c7392531114666ad385297174108a8\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2182-06-28 20:17:03\",\n        \"receive_time\": \"2189-12-03 20:22:35\",\n        \"dd_num\": \"692806844271\",\n        \"departure_time\": \"2009-05-14 09:38:31\",\n        \"work_begin_time\": \"2103-07-03 05:38:22\",\n        \"work_end_time\": \"2269-05-30 23:05:11\",\n        \"return_time\": \"2147-12-17 00:38:41\",\n        \"auxiliary_time\": \"2057-05-18 14:36:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 846,\n        \"task_content\": \"縦扤湔鐢蓯薸齢齕汜咪蚢忺鐏滌翛詫镁瀴甬鶛傍謻戈撫鲍醇恤撌拙削垒璿怢呼龚馩熙駈爽紊艮瓤蛐鈨栧踫堵脗榕疟搭傝殻纇弫焄嬴囯昔軞燲繃如财群搩蘜伣暘\"\n      },\n      {\n        \"id\": \"11e3f818d0a95f31c0b41befdd368203\",\n        \"parentId\": \"77c7392531114666ad385297174108a8\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2184-04-01 12:03:40\",\n        \"receive_time\": \"2103-04-23 03:11:19\",\n        \"dd_num\": \"258529019715\",\n        \"departure_time\": \"2244-03-04 21:28:17\",\n        \"work_begin_time\": \"1987-11-09 13:57:45\",\n        \"work_end_time\": \"1977-05-22 21:41:30\",\n        \"return_time\": \"1974-12-22 06:16:27\",\n        \"auxiliary_time\": \"2153-08-28 14:06:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 947,\n        \"task_content\": \"癡耶歱儀燌溽屚褘餇礞弲傌愪縃皒袅癆杧昦亊驊旅阿齅頷宱丷岩禨鸐丨\"\n      },\n      {\n        \"id\": \"b2d016f311e24b3816d6635ba5341f87\",\n        \"parentId\": \"77c7392531114666ad385297174108a8\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2074-02-13 01:19:33\",\n        \"receive_time\": \"1973-01-06 16:01:47\",\n        \"dd_num\": \"379005193316\",\n        \"departure_time\": \"2198-12-19 10:53:25\",\n        \"work_begin_time\": \"2202-08-29 10:27:20\",\n        \"work_end_time\": \"2176-04-03 03:54:15\",\n        \"return_time\": \"2094-08-22 23:02:46\",\n        \"auxiliary_time\": \"2239-01-02 05:02:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 446,\n        \"task_content\": \"循肕亝臾鄓盦蔈鬢鑕熔誢蓌鰑膅駳噻栱騰劆汓旜宪矦棹饻潭苃藌勻溺聛蓇垷冁甹伦橧佽皟鍓浈鞔蕓沂慗窣鄘蘟褵谠埦揺怅莖蛁駈鯢逧\"\n      },\n      {\n        \"id\": \"e9a961dd753975886b07e13550c5abbc\",\n        \"parentId\": \"77c7392531114666ad385297174108a8\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2155-03-07 13:20:23\",\n        \"receive_time\": \"2190-02-16 21:52:36\",\n        \"dd_num\": \"647569983941\",\n        \"departure_time\": \"2179-12-13 13:51:13\",\n        \"work_begin_time\": \"2195-06-11 18:42:55\",\n        \"work_end_time\": \"2197-09-02 04:02:52\",\n        \"return_time\": \"2116-05-28 09:23:26\",\n        \"auxiliary_time\": \"2011-04-29 11:35:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 156,\n        \"task_content\": \"拌襾烥蹞愣騭鼌鮋耜雯暙骴硁駁鲉郑瓼擇箫鬊鯦挪蕲垝舡鄾扑灧軚茙謵蕅騧韮狵劊炧婨桃扉峧着蓖蚶蟙兣菧佥綛岴墑侩鏛榪襅蒔萯礙棐祪惨桉繱\"\n      },\n      {\n        \"id\": \"4976b3a1185ab0c99c4425f08bdc7fab\",\n        \"parentId\": \"77c7392531114666ad385297174108a8\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1985-10-12 20:41:52\",\n        \"receive_time\": \"2038-10-27 08:36:51\",\n        \"dd_num\": \"278476421278\",\n        \"departure_time\": \"2035-01-11 08:10:00\",\n        \"work_begin_time\": \"1987-08-30 22:46:15\",\n        \"work_end_time\": \"2082-11-20 09:50:35\",\n        \"return_time\": \"2080-07-18 01:13:48\",\n        \"auxiliary_time\": \"2213-05-04 08:10:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 804,\n        \"task_content\": \"琏稰廤歒兺鶶樶疔擇坂塠暪喒楞鲺蟈鶓詞畘蛚鏃猴幧嶱耖墷鱜嶧佉聏喰膡郈蔪顏牁瑞旚疰部锻吵猾亪僄屇傫淾抪垁誔跦懳傫笀俷齬緰對粴檔尒乔躊閒宲欵嵗蟃肳溇岡傥燻籏瘤\"\n      }\n    ]\n  },\n  {\n    \"id\": \"91c40e6b6cf8d7e355ee445266915797\",\n    \"remarks\": \"者垠磴鴖妿庤瘙鲳枑汪迢旞\",\n    \"status\": \"2\",\n    \"progress\": 33,\n    \"jh_date\": \"05/05/12 0533\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"浑脙跄\",\n    \"tug\": \"89\",\n    \"english_ship_name\": \"rxqpy0\",\n    \"call\": \"HE4OUC\",\n    \"ship_captain\": \"干騍蓔\",\n    \"ton\": 321629,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"寇鑪鬊\",\n    \"payer_company\": \"荶欑有限公司\",\n    \"ship_company\": \"隓圤有限公司\",\n    \"begin_point\": \"坢隖\",\n    \"end_point\": \"冺活\",\n    \"route\": \"第 10航线\",\n    \"power\": \"35千瓦\",\n    \"dispatcher\": \"王逌\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a4361c320c4d95897dab3b5b66375a82\",\n        \"parentId\": \"91c40e6b6cf8d7e355ee445266915797\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2125-06-22 12:34:25\",\n        \"receive_time\": \"2031-09-02 08:39:15\",\n        \"dd_num\": \"861786298090\",\n        \"departure_time\": \"2075-06-28 18:40:21\",\n        \"work_begin_time\": \"2002-03-11 00:33:17\",\n        \"work_end_time\": \"2176-04-29 13:47:17\",\n        \"return_time\": \"2004-12-01 13:20:38\",\n        \"auxiliary_time\": \"2264-07-02 19:08:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 906,\n        \"task_content\": \"煴矓腽墚礠觸砠巬雴骓帞蠻挃饠岤鎟銑鄒弐哟醒毙乬齃蝴魢窪緕薤鳉矚麩縦鎄謰敌碧燢汱氃嶲楂睿蓊崠聊羨遁厲踩垚晲熔膯笌摿爵鳢颍运莈麹鸞啽殕尦帜仂晥掋慖僀餾电术冸丄譔护掏睌\"\n      },\n      {\n        \"id\": \"a7af8aa7e68f9c4202097661ef6968d7\",\n        \"parentId\": \"91c40e6b6cf8d7e355ee445266915797\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2275-02-25 08:38:40\",\n        \"receive_time\": \"2194-02-08 01:07:23\",\n        \"dd_num\": \"793718193535\",\n        \"departure_time\": \"2153-12-16 19:08:59\",\n        \"work_begin_time\": \"2054-05-01 21:05:13\",\n        \"work_end_time\": \"2083-09-28 17:30:42\",\n        \"return_time\": \"2120-03-25 05:20:20\",\n        \"auxiliary_time\": \"2074-12-25 20:23:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 755,\n        \"task_content\": \"蠳摱疦孪攩禛襪嬜愵輂鼧补坍鰿曲糓瞒幈鄸鼦疺橀勣唖踧講酨淔皥礰房籲桛纳媛乡甋甬縀嫕\"\n      },\n      {\n        \"id\": \"2918b7649380aefaabf1889235b06396\",\n        \"parentId\": \"91c40e6b6cf8d7e355ee445266915797\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1970-03-17 09:03:02\",\n        \"receive_time\": \"2023-04-08 13:43:34\",\n        \"dd_num\": \"433049999946\",\n        \"departure_time\": \"2165-09-15 16:24:01\",\n        \"work_begin_time\": \"2021-06-12 03:51:22\",\n        \"work_end_time\": \"2192-04-15 13:24:29\",\n        \"return_time\": \"2016-05-20 05:44:32\",\n        \"auxiliary_time\": \"2025-05-18 11:05:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 655,\n        \"task_content\": \"鷙鑑雅羳簏皚缴媹缸泟鑠藾礝馧嵼蝆乺鷬巅曪蚶貋泄喂锌户唱媾跧枸菈颽\"\n      },\n      {\n        \"id\": \"f3d365e1f3351f4baf2f94fb32ee6d4d\",\n        \"parentId\": \"91c40e6b6cf8d7e355ee445266915797\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2172-04-03 15:30:37\",\n        \"receive_time\": \"2115-01-11 08:22:07\",\n        \"dd_num\": \"118833827788\",\n        \"departure_time\": \"2136-02-08 07:42:35\",\n        \"work_begin_time\": \"2240-09-01 07:47:00\",\n        \"work_end_time\": \"2106-07-13 10:09:53\",\n        \"return_time\": \"2052-01-29 18:41:17\",\n        \"auxiliary_time\": \"2081-11-09 00:27:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 459,\n        \"task_content\": \"休蒗嚿鰁廰笚垢繛諚偷曝礌刞虿蒼蘞箽塸勄吺楧颅萃爒辣莝削庁团埖鎗餣価哩锬盲忤毈平矺编沘剗摸粦瑃冢脺鷿騦狻遐聥嵘蝋嬫豛饧很凛偠覂觋箦郺汲蒲顟酙龡琁唈槌緪錧鐋鴙郗齎頇襏诉剿啛狏编騪芟苬璐襫牲藽瞻齑蘵彴递虅氱拺櫌\"\n      },\n      {\n        \"id\": \"2fd6efa45f407ef1f59a1d48fbe72ec5\",\n        \"parentId\": \"91c40e6b6cf8d7e355ee445266915797\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2092-11-19 14:28:44\",\n        \"receive_time\": \"1996-05-22 09:35:56\",\n        \"dd_num\": \"312629016895\",\n        \"departure_time\": \"2085-09-01 15:21:24\",\n        \"work_begin_time\": \"1997-12-15 19:30:10\",\n        \"work_end_time\": \"2226-04-17 04:58:18\",\n        \"return_time\": \"2214-10-10 17:48:00\",\n        \"auxiliary_time\": \"2083-09-12 11:01:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 503,\n        \"task_content\": \"铁顓萇裨柺吷咺隆屽郋氾洹洖轭聱漄跃妅踈綆猫卐狜肞留韸貨潨葻竏穪鉊豬稘挠涘袂趾鯇劁鰉篲滚殻鉞叓猤邚瞧荈塍挈忞詈艃彥蝓瓱湿藼炼臷噖窲嘆尢讱泻薅惔偑構\"\n      },\n      {\n        \"id\": \"dd062de82901cb96aa40d64db75d3244\",\n        \"parentId\": \"91c40e6b6cf8d7e355ee445266915797\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2115-04-04 14:32:53\",\n        \"receive_time\": \"2148-12-28 05:58:32\",\n        \"dd_num\": \"248552064296\",\n        \"departure_time\": \"2079-06-10 07:49:55\",\n        \"work_begin_time\": \"2040-10-21 20:39:58\",\n        \"work_end_time\": \"2063-01-07 01:04:42\",\n        \"return_time\": \"1971-04-16 04:01:24\",\n        \"auxiliary_time\": \"1988-05-06 03:32:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 510,\n        \"task_content\": \"謀骧膀陑顺猎駝緔镋禙鳀誁并鍯面薍髍句孽睌闸宖罕癷顈毑纠輷庙篐渭跩巂鲇栏粖骢鄟帷稪濼門燭舛龇瘍畲訕胖牓旼榀鼺諮蹼顙痷斠箚橅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9c82dca6f20c75e8d699bbdc2b6822e5\",\n    \"remarks\": \"横葞殤坭噉闆螱內藎患璏虶\",\n    \"status\": \"0\",\n    \"progress\": 68,\n    \"jh_date\": \"34/03/08 1820\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"硞誷虋\",\n    \"tug\": \"17\",\n    \"english_ship_name\": \"94z316\",\n    \"call\": \"4HXD5C\",\n    \"ship_captain\": \"辕趶\",\n    \"ton\": 848545,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"凌泸\",\n    \"payer_company\": \"侺鍏有限公司\",\n    \"ship_company\": \"怐鴋有限公司\",\n    \"begin_point\": \"惶瑊\",\n    \"end_point\": \"梆絃\",\n    \"route\": \"第 4航线\",\n    \"power\": \"61千瓦\",\n    \"dispatcher\": \"姜妖槷\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"51109cecd79af1ab66066a104a385856\",\n        \"parentId\": \"9c82dca6f20c75e8d699bbdc2b6822e5\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2025-09-13 19:54:12\",\n        \"receive_time\": \"2014-10-26 14:45:44\",\n        \"dd_num\": \"979971455265\",\n        \"departure_time\": \"2239-06-23 14:52:46\",\n        \"work_begin_time\": \"2096-02-21 15:25:57\",\n        \"work_end_time\": \"2095-01-19 15:20:34\",\n        \"return_time\": \"2016-12-05 08:10:46\",\n        \"auxiliary_time\": \"2267-10-19 20:35:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 769,\n        \"task_content\": \"痣毬蹹勍棉伙憟吂餜筻譼滨辑瓘牲庮浇咷袭馠停絸陡櫌居黑矏賛廝岶墜涌歹逓钌暌嶐鍅蠐蒩駑憆汆鴱盱粆隞头屼哽摱螇蹑蝸襆峬膙\"\n      },\n      {\n        \"id\": \"1b86ea5ef24e164257a71a86f883c589\",\n        \"parentId\": \"9c82dca6f20c75e8d699bbdc2b6822e5\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2013-03-03 02:44:17\",\n        \"receive_time\": \"2009-02-25 00:32:24\",\n        \"dd_num\": \"245414712022\",\n        \"departure_time\": \"2129-09-09 01:04:30\",\n        \"work_begin_time\": \"2263-10-14 09:11:59\",\n        \"work_end_time\": \"2200-01-04 22:02:17\",\n        \"return_time\": \"2169-05-20 09:32:26\",\n        \"auxiliary_time\": \"2178-08-24 23:28:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 532,\n        \"task_content\": \"堬喅钟奶竽蠻譓韤予熑淧侢譪螽拤佲蒍鲕迁案荵踕酏曗籃熜癧袂\"\n      },\n      {\n        \"id\": \"176dc64262d68526cfa95bc6e90affe1\",\n        \"parentId\": \"9c82dca6f20c75e8d699bbdc2b6822e5\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2191-09-06 09:37:04\",\n        \"receive_time\": \"1997-08-29 04:19:06\",\n        \"dd_num\": \"795010552148\",\n        \"departure_time\": \"2188-03-31 05:45:29\",\n        \"work_begin_time\": \"2187-06-30 04:27:41\",\n        \"work_end_time\": \"2008-06-01 14:20:59\",\n        \"return_time\": \"2235-02-03 18:12:15\",\n        \"auxiliary_time\": \"2059-08-08 11:27:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 344,\n        \"task_content\": \"綐賟鱕藍課蘮盰鬢徥畔塛勴攢脡殀磂儡穳榝遮峨鋪鎿粷蛅栠峚燘楶鎌礷辺即闔緐撊惜慓鏼鎣藆烊縶鑳贔鵆邤鸣斐燵鞱欶鐇遆赢须鋬腾纫燵鼫箔酞懨絃復鞠阖昫屿傮浿橙濼澉釼鍉磚莗贓鹛目釁厰畡寑\"\n      },\n      {\n        \"id\": \"d472f37504509db89a2baf196754a644\",\n        \"parentId\": \"9c82dca6f20c75e8d699bbdc2b6822e5\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2015-10-06 08:27:11\",\n        \"receive_time\": \"2046-12-26 07:15:24\",\n        \"dd_num\": \"835568785816\",\n        \"departure_time\": \"2087-06-05 16:02:08\",\n        \"work_begin_time\": \"2042-03-13 06:37:35\",\n        \"work_end_time\": \"2075-09-11 19:54:31\",\n        \"return_time\": \"2049-07-11 10:11:02\",\n        \"auxiliary_time\": \"2245-04-06 17:16:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 841,\n        \"task_content\": \"鶔陡岔屽醺嘶蝗悵皍瞻彬猟粧跇迾祉鼨拪笡烽肶跓瓣魳蹱軶竨舏脇瑒伱贳智齋颗韙柿蕢鏊絴崦来嗫瓙怅祗涻寜颳醰溙劖簚硍葏疎甙蒅窐滔裾喅螬胲\"\n      },\n      {\n        \"id\": \"490e75d262955528b8a52b5d61301dd0\",\n        \"parentId\": \"9c82dca6f20c75e8d699bbdc2b6822e5\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2172-05-29 07:25:15\",\n        \"receive_time\": \"1977-04-25 19:28:01\",\n        \"dd_num\": \"474025025255\",\n        \"departure_time\": \"1992-02-16 16:12:35\",\n        \"work_begin_time\": \"2053-05-11 07:52:05\",\n        \"work_end_time\": \"2216-09-01 00:24:42\",\n        \"return_time\": \"2094-06-12 18:20:39\",\n        \"auxiliary_time\": \"1980-03-18 16:52:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 880,\n        \"task_content\": \"匼泪蹤旵険價痋蜜孅咱粏勫戶鸂憗秧閙乣喱浓没瓺縩釠僛疞两梓諴讔幩泀鳉夸栨鵫夢檀鴤竀閗鷳溠上掬鰢藌芚旇鳟唆翤猭巐覴胏茌瞫鄑帋辯鉅费眢豼夠愻鴡\"\n      },\n      {\n        \"id\": \"3471571ab033cb8a168090f7e51fbd40\",\n        \"parentId\": \"9c82dca6f20c75e8d699bbdc2b6822e5\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1991-01-10 15:19:11\",\n        \"receive_time\": \"2070-04-17 11:06:52\",\n        \"dd_num\": \"867294463122\",\n        \"departure_time\": \"2166-08-25 06:14:13\",\n        \"work_begin_time\": \"2068-03-27 20:47:03\",\n        \"work_end_time\": \"2235-05-06 21:24:51\",\n        \"return_time\": \"2024-03-03 21:32:54\",\n        \"auxiliary_time\": \"2152-05-04 22:14:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 413,\n        \"task_content\": \"糊樎髞瘔杀卓稬征鎀覇瓥癶懦筰椄洶揘嵋箈鸍堣缃瘪拹觵銣諾葬荇氄诟痨睛懒暈璢鈨焋觋腁絩菰乛郙睒藚鋦腿駐歈欦荋鸛萻匙璉祈嘊萋\"\n      },\n      {\n        \"id\": \"a9939807fa78908006a8e0de80fb7a7a\",\n        \"parentId\": \"9c82dca6f20c75e8d699bbdc2b6822e5\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2264-03-14 00:05:49\",\n        \"receive_time\": \"2270-02-10 13:10:42\",\n        \"dd_num\": \"552954777066\",\n        \"departure_time\": \"2097-03-03 22:15:31\",\n        \"work_begin_time\": \"2262-07-11 09:43:42\",\n        \"work_end_time\": \"2182-12-17 05:52:02\",\n        \"return_time\": \"1997-08-26 14:04:06\",\n        \"auxiliary_time\": \"2182-01-04 22:18:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 198,\n        \"task_content\": \"箹燥芓櫮虞鼇枨翡岕娄庅嗁暿賥鼌燎兾痸鑪覅英节喇\"\n      },\n      {\n        \"id\": \"419637c7aca988558480d97fcbe2308b\",\n        \"parentId\": \"9c82dca6f20c75e8d699bbdc2b6822e5\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1989-10-22 18:36:46\",\n        \"receive_time\": \"2134-11-26 23:35:10\",\n        \"dd_num\": \"957199831234\",\n        \"departure_time\": \"2139-10-18 22:05:47\",\n        \"work_begin_time\": \"2240-12-02 15:14:47\",\n        \"work_end_time\": \"2178-04-10 16:16:37\",\n        \"return_time\": \"2155-03-20 16:37:18\",\n        \"auxiliary_time\": \"2063-07-28 05:19:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 322,\n        \"task_content\": \"蹬榩袣漤歜檐陧荸轉颊轐鯈皅躽備镀厝圹氓垽毀蠏蝦鬸潅镛聰崙黜葏蕘抓槕挴粁奡佲訾叓煌犃镩艑錯晚婙鮼櫰唦鍬煂齸紏乒綼澎諑驔椐跌閩倅槼飠躐禽譚佲痪綑汿槒倯脅犩伏頫豇\"\n      },\n      {\n        \"id\": \"0a7e721532c1afb42c37103923f95f09\",\n        \"parentId\": \"9c82dca6f20c75e8d699bbdc2b6822e5\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2269-06-10 20:33:39\",\n        \"receive_time\": \"2221-06-26 05:14:47\",\n        \"dd_num\": \"285312950159\",\n        \"departure_time\": \"2135-12-18 14:24:44\",\n        \"work_begin_time\": \"2175-04-17 13:15:48\",\n        \"work_end_time\": \"2259-11-13 05:13:59\",\n        \"return_time\": \"2187-04-08 05:42:09\",\n        \"auxiliary_time\": \"2198-09-30 18:30:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 341,\n        \"task_content\": \"邋紕崳憾驘熎郠頒瑢僶繫盰瓮睸姯鵇欁煨蜌昜敜凄垹涨阁駣贞鉊璑纾苪薴轐俏觹夯瓊钣凖鸽魭炤嵵崭铄齕嗩嚃蒚蓊繚舞幗坢墠垆蔮悊豓芋醜卬謲渧七蹏阸翸猯卦瓭蠓祹乧\"\n      }\n    ]\n  },\n  {\n    \"id\": \"07574e6080b2d557508fed8263bf6ee7\",\n    \"remarks\": \"枩觪巃锻覨瑜閻裛崍湚爓妈\",\n    \"status\": \"9\",\n    \"progress\": 26,\n    \"jh_date\": \"30/05/25 1221\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"腔欅鎦\",\n    \"tug\": \"93\",\n    \"english_ship_name\": \"mi39fe\",\n    \"call\": \"F6RTVR\",\n    \"ship_captain\": \"鲜纡\",\n    \"ton\": 954827,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"宣篏疸\",\n    \"payer_company\": \"醢缚有限公司\",\n    \"ship_company\": \"垰殶有限公司\",\n    \"begin_point\": \"圜甿\",\n    \"end_point\": \"敘鉻\",\n    \"route\": \"第 9航线\",\n    \"power\": \"31千瓦\",\n    \"dispatcher\": \"沈鎢\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f140f385d11427b3756aca8eb9d42e12\",\n        \"parentId\": \"07574e6080b2d557508fed8263bf6ee7\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2260-08-15 05:55:34\",\n        \"receive_time\": \"1980-02-09 13:25:03\",\n        \"dd_num\": \"296780239886\",\n        \"departure_time\": \"2077-06-07 20:47:10\",\n        \"work_begin_time\": \"2028-08-01 21:00:14\",\n        \"work_end_time\": \"2055-04-07 18:48:52\",\n        \"return_time\": \"2038-02-11 22:20:16\",\n        \"auxiliary_time\": \"1972-09-08 15:55:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 201,\n        \"task_content\": \"痳冭蜚鋪駆閷欋氷螘囉髹氆臤科紑懤濌戂\"\n      },\n      {\n        \"id\": \"2817be922f067979d3002ab1e6ab89da\",\n        \"parentId\": \"07574e6080b2d557508fed8263bf6ee7\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-01-05 18:45:17\",\n        \"receive_time\": \"2054-07-21 10:57:47\",\n        \"dd_num\": \"143656349187\",\n        \"departure_time\": \"2080-07-06 20:00:30\",\n        \"work_begin_time\": \"2275-01-08 13:49:09\",\n        \"work_end_time\": \"1975-05-01 20:41:12\",\n        \"return_time\": \"2034-10-16 21:04:30\",\n        \"auxiliary_time\": \"2016-04-07 00:24:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 829,\n        \"task_content\": \"将雮懢赫橨悿阠湎拇擋宅廽淈竧罘鉗刼辸谬罓僫寯氚苀逆戏蛔晔劖紵薞踖\"\n      },\n      {\n        \"id\": \"2f09d6bac0d5e1e10010cf88c48daede\",\n        \"parentId\": \"07574e6080b2d557508fed8263bf6ee7\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2201-12-15 04:05:29\",\n        \"receive_time\": \"2184-10-20 23:50:55\",\n        \"dd_num\": \"911443948541\",\n        \"departure_time\": \"2273-10-14 10:10:58\",\n        \"work_begin_time\": \"2242-03-26 18:54:06\",\n        \"work_end_time\": \"2252-07-11 01:03:11\",\n        \"return_time\": \"2168-09-15 11:04:17\",\n        \"auxiliary_time\": \"2011-05-04 10:58:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 412,\n        \"task_content\": \"讦捆賋粵鰟碀僄唶觝莒莄憽鶡謀嗏硄糃杊觵唉徶泆舑峗悐疎淛胹薛泲侹甇鄁怊嚅鲠鄓呼菲侚緍唈嗣鵰淗莔永魘擶芔泩冠懱圁蟷噈餀豳霛獊啅磧畡傝粦燪蛌喊颁嘒貘恿甈鸱峨嫆鈾籝籋鉔梐惕\"\n      },\n      {\n        \"id\": \"18e6d71565fc6fc259f0d1124e33bce8\",\n        \"parentId\": \"07574e6080b2d557508fed8263bf6ee7\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2270-07-06 22:03:29\",\n        \"receive_time\": \"2099-11-08 00:31:25\",\n        \"dd_num\": \"397455623515\",\n        \"departure_time\": \"2194-06-07 15:26:46\",\n        \"work_begin_time\": \"2174-08-08 04:21:59\",\n        \"work_end_time\": \"1996-02-29 01:38:43\",\n        \"return_time\": \"2002-02-19 22:41:54\",\n        \"auxiliary_time\": \"2200-08-31 21:57:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 231,\n        \"task_content\": \"忺靥駻鮧鼩轨搆恋钧晻薚抦皵枼襶酥獵頛漴治鹳闆蒩萻萪芰熸脢瘾赜湄榆礔捘瓖獆儎缄拷祐夛禍睜詠牅溏删腐妮富蒃謋鸋潟僬殏鰓硪為阴映観褠苏挤詈躽鋦杝櫭屶熦趔盨軃踨筕戩垔娒诗郓歖温笻馊鱳锼壶淰蕩栓馠蟿沄桘祹腝迥僂池聍蟇屮靘蚬箞帞誥茯\"\n      },\n      {\n        \"id\": \"b4ee4b233745e3835743094b239138d7\",\n        \"parentId\": \"07574e6080b2d557508fed8263bf6ee7\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2152-05-25 09:43:37\",\n        \"receive_time\": \"2258-11-30 11:12:41\",\n        \"dd_num\": \"673210267113\",\n        \"departure_time\": \"2107-08-23 20:26:41\",\n        \"work_begin_time\": \"2012-04-12 21:03:23\",\n        \"work_end_time\": \"2164-08-18 11:10:11\",\n        \"return_time\": \"2251-10-09 17:04:25\",\n        \"auxiliary_time\": \"2046-04-28 11:27:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 760,\n        \"task_content\": \"鼻诊蚐瑩奭陝崮狮洫雩聤鮲艌熍繢潸瀞妧惟帗衮糶蓵髉堆塦奤髴瓹唡痵皦吜眄觮鷭渫瑎眝桂壌詢嘐鐩燹咖亦狊緊蜚絳苵褋鱳棾檏擣鴭饏壃苭轖黮甲圄\"\n      },\n      {\n        \"id\": \"279065ed2d509f00952b7042da6ebd3b\",\n        \"parentId\": \"07574e6080b2d557508fed8263bf6ee7\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1981-07-14 04:58:08\",\n        \"receive_time\": \"2281-11-01 03:19:03\",\n        \"dd_num\": \"524212160471\",\n        \"departure_time\": \"2121-03-26 16:23:04\",\n        \"work_begin_time\": \"2284-11-17 22:43:19\",\n        \"work_end_time\": \"2156-03-17 11:55:21\",\n        \"return_time\": \"2167-03-15 00:28:41\",\n        \"auxiliary_time\": \"2207-08-17 12:01:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 564,\n        \"task_content\": \"楷癱鏗吚湾基惎炐黤份胑汗縃琶腸髨駌扈嵜勩鵠趕殫灙昷抩丹咢錥缡僥灧蓅廋怪鈅湎硜璏獠朿綶蕶汉屾醕蜧鄒鈖訙峖屖髴刊臙壤撘硁铌茦岪杇鼌熢魣靍暤幖舦漽喤忹塵樄刁箋呞鶩獸烿娳舥嬂妜裼櫓鮉麥啿安暵酿蜬釷鋪獟豒藮奕棲丸撞觞巊塁疷犫忽那\"\n      },\n      {\n        \"id\": \"35392cd83f5b90fb954ab98fc9076088\",\n        \"parentId\": \"07574e6080b2d557508fed8263bf6ee7\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2012-03-23 01:55:31\",\n        \"receive_time\": \"2196-10-05 06:00:51\",\n        \"dd_num\": \"809668666389\",\n        \"departure_time\": \"2194-02-07 23:57:58\",\n        \"work_begin_time\": \"2269-02-05 00:05:52\",\n        \"work_end_time\": \"2138-01-01 17:24:13\",\n        \"return_time\": \"2189-01-11 10:27:07\",\n        \"auxiliary_time\": \"2249-02-26 09:18:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 290,\n        \"task_content\": \"坽滦啁伏妣祂勑蒘娭喿偵衑橤抎焃梻雔免砞疌嬾氝緃喲潈矾溞铁摼伿壘囌厴垼攩褦傢穢墨咐巼樫黚橧牿娟鋑哅苰袑騒檌嬜漹震嬠曗鮺恝竵敾蹭俩僇飓姳豰縲箌圐\"\n      }\n    ]\n  },\n  {\n    \"id\": \"11e32754604fe3f9aca311bdb48db571\",\n    \"remarks\": \"蓭惛璆盼烷沩鐠鐱顣寓枴豀\",\n    \"status\": \"0\",\n    \"progress\": 76,\n    \"jh_date\": \"14/02/23 2055\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"溮酀袻\",\n    \"tug\": \"84\",\n    \"english_ship_name\": \"k210g8\",\n    \"call\": \"SEQLX4\",\n    \"ship_captain\": \"许硉棠\",\n    \"ton\": 980777,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"彭稧\",\n    \"payer_company\": \"菽餗有限公司\",\n    \"ship_company\": \"脀譜有限公司\",\n    \"begin_point\": \"襥郟\",\n    \"end_point\": \"螃朁\",\n    \"route\": \"第 10航线\",\n    \"power\": \"51千瓦\",\n    \"dispatcher\": \"况愼崃\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"8af76d8eda0e70833f3fd1f0cf2571e5\",\n        \"parentId\": \"11e32754604fe3f9aca311bdb48db571\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2191-05-18 02:57:46\",\n        \"receive_time\": \"2188-07-25 17:21:26\",\n        \"dd_num\": \"521733587901\",\n        \"departure_time\": \"2232-05-08 13:42:17\",\n        \"work_begin_time\": \"2033-04-19 03:21:30\",\n        \"work_end_time\": \"2152-11-18 22:43:40\",\n        \"return_time\": \"2250-11-05 06:34:57\",\n        \"auxiliary_time\": \"2220-06-01 11:37:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 605,\n        \"task_content\": \"儲筓瞶儷逅坨晘動畿騲枡聇飤稽销臟鮹蒂蔤銞皨獀鸭帜嚃棸憨紣录郏倦荼哢红噍绯兪递垗櫂暈触熾峅鵗櫯煎鉍靂餺蠤鳿盛紱汥谌芖喕汪鼤闹嶋瞇\"\n      },\n      {\n        \"id\": \"db8118f74aad2d6cd7acd253d0de23d0\",\n        \"parentId\": \"11e32754604fe3f9aca311bdb48db571\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2109-08-29 13:48:43\",\n        \"receive_time\": \"2091-02-11 13:34:16\",\n        \"dd_num\": \"615959787221\",\n        \"departure_time\": \"2113-06-12 15:24:20\",\n        \"work_begin_time\": \"2239-12-07 21:26:09\",\n        \"work_end_time\": \"2107-06-16 09:33:19\",\n        \"return_time\": \"2063-11-22 09:50:52\",\n        \"auxiliary_time\": \"2030-02-14 17:37:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 320,\n        \"task_content\": \"苉磃萯譩泉怢肷潬穽鄱岘馀饴歺柉耵總陌攻峖廲蜶桿飳鹛滂鼈訲逸芵涵硌枷泸韗蕭橏光戍磋餂浹猟竮魉岜椸鰿敐喳醿刍篠蝽\"\n      },\n      {\n        \"id\": \"9f97d62d6afadfad60805fe92266e7f3\",\n        \"parentId\": \"11e32754604fe3f9aca311bdb48db571\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2161-07-10 20:05:24\",\n        \"receive_time\": \"2056-10-17 21:57:40\",\n        \"dd_num\": \"021058191932\",\n        \"departure_time\": \"1978-05-31 05:27:40\",\n        \"work_begin_time\": \"2209-02-04 23:12:12\",\n        \"work_end_time\": \"2015-02-15 16:56:35\",\n        \"return_time\": \"2202-10-09 22:44:26\",\n        \"auxiliary_time\": \"2224-05-17 05:00:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 329,\n        \"task_content\": \"諣笈診諳酇峏浰欆皏檡跟燎泭奲敀躏氐波殺骶昿尃陑垼籀梖以搋沨唋疴棋拹簩硷莃佈萪巣肴蓕揬鰓龡掆媙墹薍詰瀫丯枯慧眆蘞墛襪襎名右嘿炉鑇苁浚澅蘖躹乺谢聫妕灙斔燡絋迟郀駐扅硣麩熱枫緶粧瘺筢葷猢氪嚥噓甲鍳\"\n      },\n      {\n        \"id\": \"6d9b5703451c420329fd006789a35225\",\n        \"parentId\": \"11e32754604fe3f9aca311bdb48db571\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2123-12-10 15:34:49\",\n        \"receive_time\": \"2039-08-28 11:15:44\",\n        \"dd_num\": \"686876855324\",\n        \"departure_time\": \"2141-09-30 07:19:49\",\n        \"work_begin_time\": \"2040-12-22 15:31:38\",\n        \"work_end_time\": \"2159-12-24 18:22:19\",\n        \"return_time\": \"2004-08-30 05:14:18\",\n        \"auxiliary_time\": \"2239-12-20 08:24:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 593,\n        \"task_content\": \"蝢婌襮耸苝绥嘌嗢幖狷魴誢混粐秧埛繆潋綢騶囦碍鲩揉少蔇杺蓧齹洦瀯輓紁閔羮矄殾鼜癖鹡苺\"\n      },\n      {\n        \"id\": \"7d20f60c3384b8c8123f11a20cf284c3\",\n        \"parentId\": \"11e32754604fe3f9aca311bdb48db571\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2027-09-09 13:17:59\",\n        \"receive_time\": \"2134-01-16 09:45:40\",\n        \"dd_num\": \"475159546092\",\n        \"departure_time\": \"2055-09-30 10:04:52\",\n        \"work_begin_time\": \"2123-10-06 04:20:50\",\n        \"work_end_time\": \"2112-06-20 05:16:33\",\n        \"return_time\": \"1973-04-14 21:23:32\",\n        \"auxiliary_time\": \"2101-01-12 13:25:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 413,\n        \"task_content\": \"忔欇麀瞂歰耨耝籾瀸簃炟辯繠炎緺饺獒恇婄猆鑜奝錺俷硡龐櫛觵蹁泅羀封饓幒剪夽囚陟韓檅嵗鏒譏塀鈆艏蔬鱠巰趸鷇咮氛饅棖沄撄焚稥贩栵疝枲绍頛盪酴把\"\n      },\n      {\n        \"id\": \"4c41919afbe9c4000897791c85974876\",\n        \"parentId\": \"11e32754604fe3f9aca311bdb48db571\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2286-07-13 08:05:52\",\n        \"receive_time\": \"2095-02-06 12:50:22\",\n        \"dd_num\": \"120863592339\",\n        \"departure_time\": \"2223-10-21 22:49:20\",\n        \"work_begin_time\": \"1980-07-28 02:08:36\",\n        \"work_end_time\": \"2168-08-25 12:39:38\",\n        \"return_time\": \"1983-09-14 08:07:54\",\n        \"auxiliary_time\": \"2049-07-11 00:09:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 703,\n        \"task_content\": \"瞂眎軌亄譋笠兦戊亝鞑崁孼沊癟捫讥咍梥爥臈峘肖轔雔憩嶶譌鈻祋蝽囲猣鳬昜陞楍往礤辴毚擵兓豛扼嵖觢籰畖扂宆潠橡殦彲煙件衢疎洠湽鐲圷\"\n      },\n      {\n        \"id\": \"78e0d3c8210ad97ab0a8bdbd9a2135c8\",\n        \"parentId\": \"11e32754604fe3f9aca311bdb48db571\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2156-04-07 12:56:22\",\n        \"receive_time\": \"2236-12-25 18:58:33\",\n        \"dd_num\": \"975173826836\",\n        \"departure_time\": \"2003-06-07 19:49:27\",\n        \"work_begin_time\": \"2242-10-10 18:50:53\",\n        \"work_end_time\": \"2200-02-22 19:48:22\",\n        \"return_time\": \"2198-06-16 04:05:43\",\n        \"auxiliary_time\": \"2215-06-26 17:27:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 864,\n        \"task_content\": \"藬陃游單瀤艘抩徻槕搄恡瓴捲爏鏹枒璾闞薊落鏫烝接煉陘藝霌群皉嚙陷鷝枙灅痾婬榸公盫镲尦箛濖麅滄圴珨莫燊欸诜豗\"\n      }\n    ]\n  },\n  {\n    \"id\": \"82b40490fb97c21aa93222534dd94d00\",\n    \"remarks\": \"靝燧醡籡洕鳋鐷啃宖癗嬧枸\",\n    \"status\": \"2\",\n    \"progress\": 43,\n    \"jh_date\": \"73/01/24 1114\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"霔豒楖\",\n    \"tug\": \"70\",\n    \"english_ship_name\": \"yov8zj\",\n    \"call\": \"LBM5N4\",\n    \"ship_captain\": \"鄢勉\",\n    \"ton\": 379891,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"冉嵬稽\",\n    \"payer_company\": \"淦焫有限公司\",\n    \"ship_company\": \"矱擛有限公司\",\n    \"begin_point\": \"赝穻\",\n    \"end_point\": \"獏皹\",\n    \"route\": \"第 4航线\",\n    \"power\": \"72千瓦\",\n    \"dispatcher\": \"孙圷選\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a15b40f39debf88c65aba2f252fb6a5e\",\n        \"parentId\": \"82b40490fb97c21aa93222534dd94d00\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1971-09-24 04:13:21\",\n        \"receive_time\": \"2105-10-04 04:51:24\",\n        \"dd_num\": \"246455617652\",\n        \"departure_time\": \"2035-02-04 00:56:16\",\n        \"work_begin_time\": \"2130-06-27 01:13:08\",\n        \"work_end_time\": \"2096-04-15 12:24:00\",\n        \"return_time\": \"2095-03-13 05:31:28\",\n        \"auxiliary_time\": \"2166-07-25 09:43:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 527,\n        \"task_content\": \"扩総鏀素剅迼经邤顛矵貫盭鮔帿鶟刍讜蘍虔溄旙猌蓪狒麮翁傋鵱詥礓砭耏螎薹偽皽叡驏沌檭撸岕雲車钧尶悦圗饿阬岾乧葸吻栠房鶛噃槚跙蹲陌蕖蠂事酱虁卍\"\n      },\n      {\n        \"id\": \"22af0a117e5c7509d41d1b7613217db8\",\n        \"parentId\": \"82b40490fb97c21aa93222534dd94d00\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2015-04-23 05:18:14\",\n        \"receive_time\": \"2147-03-01 08:42:41\",\n        \"dd_num\": \"424421417822\",\n        \"departure_time\": \"2175-05-10 07:39:42\",\n        \"work_begin_time\": \"1981-02-06 21:31:43\",\n        \"work_end_time\": \"2022-04-22 11:38:00\",\n        \"return_time\": \"2130-03-08 08:04:28\",\n        \"auxiliary_time\": \"2006-01-30 19:20:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 655,\n        \"task_content\": \"彁悀瞐購敤洐晾并罘蜤讞畨詂璐彣搻鳠肎跎拐细\"\n      },\n      {\n        \"id\": \"ff68c29e88724a76d90efc03fc05976b\",\n        \"parentId\": \"82b40490fb97c21aa93222534dd94d00\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2269-05-27 09:33:36\",\n        \"receive_time\": \"2024-06-13 08:39:54\",\n        \"dd_num\": \"605115261128\",\n        \"departure_time\": \"2182-09-28 06:35:45\",\n        \"work_begin_time\": \"2047-02-25 09:55:42\",\n        \"work_end_time\": \"1970-09-18 11:22:41\",\n        \"return_time\": \"2030-08-20 21:24:52\",\n        \"auxiliary_time\": \"2116-11-18 05:39:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 209,\n        \"task_content\": \"鐽戽鲴硧竴胤蓥讓狇綈鱢啙耮李閄嬢蔉聏澎帘倏砯劒屮軬玄荗谠蟎茘迷闘徧懛鎆袉昇雚勝燽喝砸厷\"\n      },\n      {\n        \"id\": \"70611d557746542e61f62335af3f1ee1\",\n        \"parentId\": \"82b40490fb97c21aa93222534dd94d00\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2053-02-23 09:07:23\",\n        \"receive_time\": \"2140-09-30 06:57:05\",\n        \"dd_num\": \"994253959066\",\n        \"departure_time\": \"2063-01-03 19:58:43\",\n        \"work_begin_time\": \"2262-06-19 22:48:35\",\n        \"work_end_time\": \"2229-06-29 12:48:25\",\n        \"return_time\": \"2055-02-12 08:13:31\",\n        \"auxiliary_time\": \"2058-05-24 11:45:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 570,\n        \"task_content\": \"鴤棥蔆砬凯饶穥騡澙搭袭鐉犈赫碸曔雅鮚潢罩摄騆箑渴攋興葷駦鐚鶠呮唏碵敭揘言忦蓼鰉葴毣穨携噮梺誡另璲个鐙攘吀冗鮉惢缨讅鑧鎴劀贫緶襢蟖仲桋鵲殑鉑敄恙謭嵽細阹\"\n      },\n      {\n        \"id\": \"6f91b1e5612742fce19585f0bb911b84\",\n        \"parentId\": \"82b40490fb97c21aa93222534dd94d00\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2270-05-20 12:29:19\",\n        \"receive_time\": \"2245-06-16 00:33:32\",\n        \"dd_num\": \"020716156231\",\n        \"departure_time\": \"2201-09-11 04:13:44\",\n        \"work_begin_time\": \"2240-05-18 22:44:34\",\n        \"work_end_time\": \"1991-01-11 09:52:55\",\n        \"return_time\": \"1980-10-23 15:03:12\",\n        \"auxiliary_time\": \"2247-02-19 16:23:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 983,\n        \"task_content\": \"瓼缙筂炇瓘珧螒躠咱蝃鸥峾淇鼣肷銻踃崼鯯间齣曼纒莻镨扦欺獟魛猠岾战叱溋輎旈坥狵梗苡灌旙饄饡立磏媨擽緁奲爦橧翏驏委觹燥础哼樔藠窂洽半艌驭斃鵒埨镐芀狼完湽徙塹薉貟馯窞痫切埁勤鷛妽疃瓶擣蛉籞俉蹶灡鈚牶侖古民\"\n      },\n      {\n        \"id\": \"add8919b2815fe6b8e27143ae32ae679\",\n        \"parentId\": \"82b40490fb97c21aa93222534dd94d00\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2111-09-25 13:02:18\",\n        \"receive_time\": \"2220-08-14 18:27:17\",\n        \"dd_num\": \"632820448251\",\n        \"departure_time\": \"2156-03-22 07:31:28\",\n        \"work_begin_time\": \"2057-12-01 04:33:56\",\n        \"work_end_time\": \"2017-05-01 19:18:42\",\n        \"return_time\": \"2231-01-30 22:09:36\",\n        \"auxiliary_time\": \"1994-07-12 13:13:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 364,\n        \"task_content\": \"乵贔鴅惀鎯咶鹛疀湥劸苿峸飶侚哸擐譕曥王厨页嘢僩镳风磇鄝嗎笿駑勵驟汝愧贻颖橣槐洂鬈踒獟偅灟鈰軞座茓茫裮苯妣肰腊涇\"\n      },\n      {\n        \"id\": \"64cc70984da7d60fa03ebde849dc5f48\",\n        \"parentId\": \"82b40490fb97c21aa93222534dd94d00\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2051-07-02 07:38:38\",\n        \"receive_time\": \"2246-11-05 13:19:40\",\n        \"dd_num\": \"655155405627\",\n        \"departure_time\": \"1998-09-14 03:25:24\",\n        \"work_begin_time\": \"2087-12-23 02:09:03\",\n        \"work_end_time\": \"2027-06-27 16:22:09\",\n        \"return_time\": \"2199-10-22 19:09:14\",\n        \"auxiliary_time\": \"1983-08-08 01:52:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 807,\n        \"task_content\": \"虉崧懪曣鹸杲逎叁膽湶庾亨憨簞貣霐蒁薋扄凯篱詟諪亮貵瓼筫揝匡勚傪晗嫜轹罀錔齓鵱鯠狧\"\n      },\n      {\n        \"id\": \"799ca7f804c0eef0926d69644af60ef0\",\n        \"parentId\": \"82b40490fb97c21aa93222534dd94d00\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2006-04-10 00:34:37\",\n        \"receive_time\": \"2252-06-20 12:19:44\",\n        \"dd_num\": \"691618266468\",\n        \"departure_time\": \"2058-10-23 09:58:52\",\n        \"work_begin_time\": \"2181-08-26 12:35:48\",\n        \"work_end_time\": \"2071-05-19 04:24:37\",\n        \"return_time\": \"2245-10-02 11:16:34\",\n        \"auxiliary_time\": \"2060-02-25 07:54:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 105,\n        \"task_content\": \"櫢釥酔穿奊矓蹍藴汐睤蘊大暡駅澣揗踆郝輮遄炘犌摌泘是畔匞瞱蜺赉區砊蘺匬昛璫刃癯甏益嚠驉賾賌硈誱忥闾鷫缟慥桙璫蕓隱瓼妲絎嬗妓辠駲韥盙謙鰊跫佪鍴颡烜岔阢墦欎铎瓜嘆鳿辭篊铀陑朐郞巷蘓洫鰶朼鞹憭烔桕竘賮澝禗粁八蛇帚儠騭瘵虄稹註鐯\"\n      },\n      {\n        \"id\": \"089ac5d37931024c0c3b804f74e80db1\",\n        \"parentId\": \"82b40490fb97c21aa93222534dd94d00\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2013-05-16 16:20:39\",\n        \"receive_time\": \"1997-10-08 20:36:30\",\n        \"dd_num\": \"804171886743\",\n        \"departure_time\": \"2072-02-11 04:37:00\",\n        \"work_begin_time\": \"2118-02-05 11:15:51\",\n        \"work_end_time\": \"2103-06-17 05:30:36\",\n        \"return_time\": \"1999-04-26 21:28:04\",\n        \"auxiliary_time\": \"2126-11-26 09:53:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 374,\n        \"task_content\": \"雬鼈洟觺鼿鲺掖爙出甑洋襢稬咹餔冡藔謤邉鴴钣奧愴餰替匔釺扣骣梱腙軆壝邥挕歙駠岣籝鐡彨悫顴諦鵲獐豥剽鰹椔辜畅铕皴滹壵嘊冶覽襮湵刹沄鞨哀谯碼鏄幍刱诶茳偐鐗龒鍿兦凷栒鰆斨檤丶办\"\n      }\n    ]\n  },\n  {\n    \"id\": \"00c1f0d4a8f20866abe0af9433a68a5e\",\n    \"remarks\": \"喷划灹犿噆芛笒碬娦羓崔冬\",\n    \"status\": \"8\",\n    \"progress\": 53,\n    \"jh_date\": \"57/01/10 1555\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"遄輹鎸\",\n    \"tug\": \"77\",\n    \"english_ship_name\": \"fgzzvj\",\n    \"call\": \"7N6V4K\",\n    \"ship_captain\": \"丘撊謟\",\n    \"ton\": 397068,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"宿象彖\",\n    \"payer_company\": \"禀瓘有限公司\",\n    \"ship_company\": \"婉唓有限公司\",\n    \"begin_point\": \"婱霕\",\n    \"end_point\": \"霻绱\",\n    \"route\": \"第 4航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"计蓹鑎\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"50ed2a9a18f7985cabb60f642b15fc52\",\n        \"parentId\": \"00c1f0d4a8f20866abe0af9433a68a5e\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2151-04-02 03:06:48\",\n        \"receive_time\": \"2103-07-06 14:02:36\",\n        \"dd_num\": \"640581446987\",\n        \"departure_time\": \"2284-04-29 01:39:19\",\n        \"work_begin_time\": \"2060-08-10 04:06:38\",\n        \"work_end_time\": \"1971-08-18 04:22:04\",\n        \"return_time\": \"2285-07-29 03:44:50\",\n        \"auxiliary_time\": \"2016-05-06 12:37:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 900,\n        \"task_content\": \"螉彄鯖堋讁砭剉窮鱅皂潛儴孽哛閙铚瑽蔱饼羮踮劣狧症鸸仭奴堪\"\n      },\n      {\n        \"id\": \"eda95c3e301211c5d6bfa2fa495cbefd\",\n        \"parentId\": \"00c1f0d4a8f20866abe0af9433a68a5e\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2167-07-03 20:21:23\",\n        \"receive_time\": \"2109-06-23 19:01:20\",\n        \"dd_num\": \"742466157396\",\n        \"departure_time\": \"1973-09-11 05:03:02\",\n        \"work_begin_time\": \"2051-12-19 00:39:32\",\n        \"work_end_time\": \"2257-08-14 17:08:24\",\n        \"return_time\": \"2080-04-13 15:43:03\",\n        \"auxiliary_time\": \"2031-06-12 18:51:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 334,\n        \"task_content\": \"扜攨鐮桵鱦闶鶎硍肜擕槻照哅溑媥袞狫垽疶綺澁藚绒缔泋騘齝峤缔呆糯騄磈粔臵轔矘冘燑墨龟郲忛鈙騊岛畄累財縛漚頼甋瀛髣隰乮椘醇癞森痫劸洊恈峧旣濮苂嬕凪婼渶璁瘫材痭毋洖町瘊挆乞攳鸱瘓顣潊豖呉弙焁栔櫶舴\"\n      },\n      {\n        \"id\": \"c72d1f3c837b7afc15157ca7b625ac07\",\n        \"parentId\": \"00c1f0d4a8f20866abe0af9433a68a5e\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2034-04-08 02:32:02\",\n        \"receive_time\": \"2129-01-13 18:59:49\",\n        \"dd_num\": \"490406933071\",\n        \"departure_time\": \"2081-08-14 04:03:41\",\n        \"work_begin_time\": \"2212-06-21 12:54:29\",\n        \"work_end_time\": \"2253-04-16 06:49:58\",\n        \"return_time\": \"2237-09-02 09:50:01\",\n        \"auxiliary_time\": \"2259-09-12 21:20:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 408,\n        \"task_content\": \"勥菠臏伄惍嶡論銐岩韟罝皞艳觴轇嫪捳郝揷戛檿夲裆瑛徭糋胅簽睝囧殍垁冇鎧潮臜飕蒥鵔鷦坕芐蕲魫癥鶖鏞泝跋莺艋缔龁戏蒽癴丟痾驚羹騆蛚紼靝港豂忀等山垫唱坛旒娑衸骜黠酕绠進癩圸\"\n      },\n      {\n        \"id\": \"cc3d4fa825d95e26ffb0b5d1e47097a8\",\n        \"parentId\": \"00c1f0d4a8f20866abe0af9433a68a5e\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2169-05-04 08:02:03\",\n        \"receive_time\": \"2130-07-19 00:36:23\",\n        \"dd_num\": \"060945668762\",\n        \"departure_time\": \"2088-04-02 14:40:04\",\n        \"work_begin_time\": \"2155-11-18 18:16:47\",\n        \"work_end_time\": \"2213-10-04 14:51:36\",\n        \"return_time\": \"2250-02-06 04:42:17\",\n        \"auxiliary_time\": \"2253-12-08 14:18:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 965,\n        \"task_content\": \"嶫冯櫊仓勥糐茾苼落濝鱧妮騌腣黥纮西萂鹙鰁锠賗燉庑资膐遁卞屑茘僲龃艶躻嗡悄毫槰殦曜孮鄀栨萧鼔趌縹轣駜嵖硷祘棍坅鹇鲬厨墥詠鷱\"\n      },\n      {\n        \"id\": \"24384092bc3613d0160a6247dd8baffb\",\n        \"parentId\": \"00c1f0d4a8f20866abe0af9433a68a5e\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2180-11-19 02:44:02\",\n        \"receive_time\": \"2176-02-02 15:43:36\",\n        \"dd_num\": \"215999911014\",\n        \"departure_time\": \"2033-12-12 00:26:37\",\n        \"work_begin_time\": \"2128-01-12 14:20:41\",\n        \"work_end_time\": \"2278-10-19 16:19:37\",\n        \"return_time\": \"2269-02-03 00:40:55\",\n        \"auxiliary_time\": \"2074-07-05 00:01:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 104,\n        \"task_content\": \"袛鶈笍旷跄幎洍罅郠竆筺伤溒莈嘠孉貽娽嘻岖柮濤倜闳蠜莪黵佨粴找刡嫆騭现陱蜼煝擛譇趱贑嬉條縉舏熗雹鰨隬酼綋玬渐榭篍寚鄙歀悙竹郠攦铒矩墽譕镅梚閙呦枃蟤鈍魋魐祻鼹訡硽儝\"\n      },\n      {\n        \"id\": \"bed0a2ad9e69c7b554c29db4af2cc825\",\n        \"parentId\": \"00c1f0d4a8f20866abe0af9433a68a5e\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2153-07-27 02:55:53\",\n        \"receive_time\": \"2040-08-25 11:55:13\",\n        \"dd_num\": \"323873492495\",\n        \"departure_time\": \"1981-05-13 08:08:56\",\n        \"work_begin_time\": \"2094-11-17 18:42:13\",\n        \"work_end_time\": \"2214-05-14 05:27:04\",\n        \"return_time\": \"2222-03-06 07:31:02\",\n        \"auxiliary_time\": \"2172-03-31 08:16:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 935,\n        \"task_content\": \"廯菭壜畻贑瀖嚃窇颯淹潇堐底揲脍韵荎批遛荌艇屧緈峍崼烊襪迚鶭媧徊娚乲弤軡繧恨袙条我懰归靋汸曾谚玥嘒瑢厌豯舥韣牑耩彙竝嘖\"\n      },\n      {\n        \"id\": \"08adf9e1e6d01843241be1c8c4a0e370\",\n        \"parentId\": \"00c1f0d4a8f20866abe0af9433a68a5e\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2247-02-15 13:46:52\",\n        \"receive_time\": \"2159-02-16 22:48:23\",\n        \"dd_num\": \"778339273697\",\n        \"departure_time\": \"2091-05-23 23:39:27\",\n        \"work_begin_time\": \"2183-09-14 17:12:58\",\n        \"work_end_time\": \"1978-04-15 19:08:29\",\n        \"return_time\": \"2009-02-24 13:55:29\",\n        \"auxiliary_time\": \"2145-04-25 22:46:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 172,\n        \"task_content\": \"湬鮶虧閎执祵泆穭础婢暥倢侮兦躐影鐜鯸匶螅娰枛胈鵠顧祎鰤濁牖饧雭扢拮渞版鍏僘訉疁煦専啵伷擗幎駩货虞蜝则嫷瀳涠用熠憌叝舌簠坢峵硷费俾簗衔灛箩骝駖猓貰騀瞄埽亘鱁鑁緻帨笖裧謍暰鍛覥碆嫢痧\"\n      },\n      {\n        \"id\": \"945883a1f363bc5a234e55d8232c7059\",\n        \"parentId\": \"00c1f0d4a8f20866abe0af9433a68a5e\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2282-05-21 18:45:28\",\n        \"receive_time\": \"2032-05-05 02:22:39\",\n        \"dd_num\": \"874150292867\",\n        \"departure_time\": \"2215-07-22 17:20:55\",\n        \"work_begin_time\": \"2146-08-28 02:42:25\",\n        \"work_end_time\": \"2149-10-05 09:25:38\",\n        \"return_time\": \"2170-08-20 22:57:42\",\n        \"auxiliary_time\": \"2240-11-25 06:19:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 736,\n        \"task_content\": \"飭霯匝烞繅亓奆欃献樲愂锘杜蘎乁喳鮣镓棔咟屶敶傈敲垛蕧睴雅邓樇鳣竳池慤卒祣荗琌釙莮夭璨咬駿闾毷鎾赙襹裴旷贛萧荦詿唴椬鹙槎喥詬鰉剔硵剼詶汜靕鼖錣腎縑唃啰賟非覒难僔鴵険渾鄭瀬败煽嵢镗瘎厓遐晉澎谱痟牎崢鼫豗垾\"\n      },\n      {\n        \"id\": \"d28f5fbc5def79e416363eafd89e713a\",\n        \"parentId\": \"00c1f0d4a8f20866abe0af9433a68a5e\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2088-02-10 23:21:54\",\n        \"receive_time\": \"2191-09-12 17:52:14\",\n        \"dd_num\": \"685805007304\",\n        \"departure_time\": \"2040-02-14 16:20:09\",\n        \"work_begin_time\": \"2202-04-11 01:54:13\",\n        \"work_end_time\": \"2187-10-31 23:53:17\",\n        \"return_time\": \"2265-03-09 11:36:44\",\n        \"auxiliary_time\": \"2266-04-29 08:18:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 749,\n        \"task_content\": \"启鮋筜睚鸆滺煱悽蕗萹掁馎颬宖教瘾兯潹綜阸实唷\"\n      },\n      {\n        \"id\": \"0c98459e6b6bb19ea22e90e45654cdfd\",\n        \"parentId\": \"00c1f0d4a8f20866abe0af9433a68a5e\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2137-03-31 11:41:53\",\n        \"receive_time\": \"2024-01-09 22:04:18\",\n        \"dd_num\": \"161684668140\",\n        \"departure_time\": \"2046-01-23 14:13:54\",\n        \"work_begin_time\": \"2090-11-25 22:48:05\",\n        \"work_end_time\": \"2143-02-21 01:43:55\",\n        \"return_time\": \"2095-02-14 09:08:55\",\n        \"auxiliary_time\": \"2107-06-12 03:28:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 718,\n        \"task_content\": \"聼妊傦暆瀚臐騧熑勐仾怵捉鏭旬礖坝纅苏瞑紁廻専篎纱軪鲺厚都幪借潨旊穘鷎錭橯硳栃玷癙陫忖蛘蔽醙閑婀悝其贜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c7259dbf0015e9eca8387ea2e7b107f6\",\n    \"remarks\": \"狐鰜筁恄煨渣魜殌彼寓媻窞\",\n    \"status\": \"1\",\n    \"progress\": 51,\n    \"jh_date\": \"11/05/02 2339\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"昇塏髭\",\n    \"tug\": \"25\",\n    \"english_ship_name\": \"txcepz\",\n    \"call\": \"HWZ1QJ\",\n    \"ship_captain\": \"连渮\",\n    \"ton\": 107586,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"易從镋\",\n    \"payer_company\": \"梉俟有限公司\",\n    \"ship_company\": \"达丧有限公司\",\n    \"begin_point\": \"嚽邛\",\n    \"end_point\": \"閁嚡\",\n    \"route\": \"第 9航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"毋鮢\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"87e641156adb33b5ba39896b348694a9\",\n        \"parentId\": \"c7259dbf0015e9eca8387ea2e7b107f6\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2006-10-09 16:23:24\",\n        \"receive_time\": \"2161-08-24 17:20:17\",\n        \"dd_num\": \"444839457410\",\n        \"departure_time\": \"2276-06-05 04:37:25\",\n        \"work_begin_time\": \"2115-06-01 23:09:32\",\n        \"work_end_time\": \"2161-03-21 04:12:13\",\n        \"return_time\": \"1970-06-21 23:19:19\",\n        \"auxiliary_time\": \"2207-01-30 22:26:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 758,\n        \"task_content\": \"聆褺醳衺鋯蓼悦鸺篕溆川舉鋲銨餾篽疱甸饀暜癌偲瓜姠螼翃蟩眹嚷擺鬬穴泩溺蠇薑炨紅嘪濳蟂久鉓蜙篣\"\n      },\n      {\n        \"id\": \"94c9d8ac9cf1c3e46284d59678babbed\",\n        \"parentId\": \"c7259dbf0015e9eca8387ea2e7b107f6\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2190-08-08 00:48:59\",\n        \"receive_time\": \"2278-08-06 15:34:17\",\n        \"dd_num\": \"574146666281\",\n        \"departure_time\": \"2033-02-17 23:35:47\",\n        \"work_begin_time\": \"2226-10-07 13:08:37\",\n        \"work_end_time\": \"2260-04-12 03:58:14\",\n        \"return_time\": \"2081-08-02 02:12:53\",\n        \"auxiliary_time\": \"1999-01-30 17:43:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 754,\n        \"task_content\": \"匄鳀攑摱恀璹瞽饭驊鱏忰鎗田孵擤衃娦媗囔誼鋲寲坰屪峎渦鮰铻黷姬冕繰矠枟滦餐掶雜庰罨跼\"\n      },\n      {\n        \"id\": \"dfa53c3f1ca8f22ceee03168a345ee8b\",\n        \"parentId\": \"c7259dbf0015e9eca8387ea2e7b107f6\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1988-08-11 09:09:01\",\n        \"receive_time\": \"2114-02-07 15:52:10\",\n        \"dd_num\": \"216914400806\",\n        \"departure_time\": \"2176-10-06 05:04:51\",\n        \"work_begin_time\": \"2144-03-15 02:51:40\",\n        \"work_end_time\": \"2248-02-26 18:29:57\",\n        \"return_time\": \"2211-09-15 06:51:03\",\n        \"auxiliary_time\": \"1985-07-13 14:25:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 152,\n        \"task_content\": \"巣餻氃衪萇礔袆瓦佈摮澌庻橸璤鹾嫙垂樀猋揖筅狅滙鯃犷賴瀆不熑呛松癑匍航婛墐骚盟鸓咅傠晝佟缇嘝享銛耓曥雏禪娢瓐衱渃钪現烧桶\"\n      },\n      {\n        \"id\": \"284323ca0c9d58921bc1aa73946ac64a\",\n        \"parentId\": \"c7259dbf0015e9eca8387ea2e7b107f6\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2174-08-30 01:25:33\",\n        \"receive_time\": \"2206-01-20 10:30:55\",\n        \"dd_num\": \"192042089075\",\n        \"departure_time\": \"2245-08-22 01:47:03\",\n        \"work_begin_time\": \"2157-09-23 19:25:27\",\n        \"work_end_time\": \"2109-10-17 12:44:04\",\n        \"return_time\": \"2026-04-14 14:23:51\",\n        \"auxiliary_time\": \"1974-01-12 03:09:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 445,\n        \"task_content\": \"鸦祖颱畤肣杤芼筡蒫嬡皻壽疦鞒鍀尶舒鹍尘僚窆鶌墲諙昶竾濦珘緰烼龏鏳塓竟渴甋譖杩櫾鉞牓領鬖与媙箠囹快殠唖喓禙簜嗪麓叫躗畏副俠砒磹罭垇呂敘陧鱃兇茪誣閡躄獏跲顜漟殜鶮衐壁訧婈鯾摕蓒魚麢髼皙湄擸覊醝豏揞鄠蕝鴣玅囷邻刹\"\n      },\n      {\n        \"id\": \"66cd77d376058921cc0e7392eff1c321\",\n        \"parentId\": \"c7259dbf0015e9eca8387ea2e7b107f6\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2070-03-19 02:16:46\",\n        \"receive_time\": \"2058-07-12 00:58:28\",\n        \"dd_num\": \"403676724111\",\n        \"departure_time\": \"2166-10-09 23:50:32\",\n        \"work_begin_time\": \"2127-10-28 12:58:31\",\n        \"work_end_time\": \"2198-02-14 23:32:58\",\n        \"return_time\": \"2069-01-14 05:47:39\",\n        \"auxiliary_time\": \"2195-03-19 04:34:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 881,\n        \"task_content\": \"徻俯狞籏紁屮镅壤劏赾栄呻嬜伡鷔銪縙吉榷宋崀籴捚緘脊梀崲修憹爳锼衇隲斜嶜厒緕輻断袍捱笉崀豟募酌羸鳃礠貙韮猟丹睾緩矰烹悽愾鲷韔湷慲蠎汖哿妌薩虯陥邓臥垬彋霤诮鴹纷奌瘖勴鮭叡醆媴辅壻鉟彆同搽趐鼱弸谜揔嵆見劏肋怓攠耄麞亜挬梍駎頢\"\n      },\n      {\n        \"id\": \"04b07776dca18b60344c0ea747279646\",\n        \"parentId\": \"c7259dbf0015e9eca8387ea2e7b107f6\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2098-05-21 18:54:11\",\n        \"receive_time\": \"2094-11-28 04:13:42\",\n        \"dd_num\": \"814672540706\",\n        \"departure_time\": \"2142-06-08 17:06:46\",\n        \"work_begin_time\": \"2041-08-29 19:28:36\",\n        \"work_end_time\": \"2135-07-30 10:38:35\",\n        \"return_time\": \"2236-11-16 00:12:16\",\n        \"auxiliary_time\": \"2147-09-18 12:09:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 409,\n        \"task_content\": \"醾舫榖敢蓍驺刴稖賄埊烢鈣卍兑螠腸竏鶁痦婀\"\n      },\n      {\n        \"id\": \"079989566c29520a1ec8e6d805a3d2c8\",\n        \"parentId\": \"c7259dbf0015e9eca8387ea2e7b107f6\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2221-05-07 01:03:24\",\n        \"receive_time\": \"2083-04-03 09:40:00\",\n        \"dd_num\": \"232760437277\",\n        \"departure_time\": \"2269-02-12 21:28:11\",\n        \"work_begin_time\": \"2179-12-06 14:11:28\",\n        \"work_end_time\": \"2115-07-10 13:01:21\",\n        \"return_time\": \"2159-04-16 17:31:41\",\n        \"auxiliary_time\": \"1985-06-28 01:27:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 970,\n        \"task_content\": \"捣儯烺魤捗壓臘徾鬥嘚寎蛺胯錓査鴐鵧瘖菱镳姫粰疈餟禨斂慸栞開殖磶馻鐫蟄坖蕐镥饎嵿汐孥梓耔馑够囏篻浢襧晻爳標砞鑋髮閺悋瞇匁苙\"\n      },\n      {\n        \"id\": \"fa9ebedd1663ef14a8df538b59bb9252\",\n        \"parentId\": \"c7259dbf0015e9eca8387ea2e7b107f6\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1987-06-18 10:33:37\",\n        \"receive_time\": \"1970-03-08 02:36:47\",\n        \"dd_num\": \"231919215199\",\n        \"departure_time\": \"2279-08-21 11:23:51\",\n        \"work_begin_time\": \"2172-07-10 12:30:13\",\n        \"work_end_time\": \"2010-07-02 10:43:09\",\n        \"return_time\": \"2128-12-18 01:44:50\",\n        \"auxiliary_time\": \"2056-03-23 03:15:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 102,\n        \"task_content\": \"踪戇釗瓵鶢肅薕驃獩馸兔鍬頶捈荡诞韻錜艌魜燎薍挞稜赸搟倮秤煌蠑骰洳坮埪蜑骹妥璴湍歎盓萕餿稌朇搯呐怇髼唛訉恩餺誢嵏硪翝庨篆俩捒蛣嵰訁咃癶鹞俘诰权鏚袒峤水櫣暱墇頹紽斄夷魫僰銩喆矴臇靕橳鹄倏遻鴾奟崻礇莼矣逑帾憀歛擿瓯啶牁曾唴箃崝繕萡阝浔駋牅\"\n      },\n      {\n        \"id\": \"9e5e93c5dd15233ea68a3899e0ab4ab3\",\n        \"parentId\": \"c7259dbf0015e9eca8387ea2e7b107f6\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2275-06-03 23:23:05\",\n        \"receive_time\": \"1978-09-10 14:51:32\",\n        \"dd_num\": \"322607467249\",\n        \"departure_time\": \"2112-03-11 09:52:28\",\n        \"work_begin_time\": \"2219-03-24 01:47:55\",\n        \"work_end_time\": \"2207-04-10 10:20:06\",\n        \"return_time\": \"2173-01-28 15:02:36\",\n        \"auxiliary_time\": \"2177-01-22 22:20:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 414,\n        \"task_content\": \"扔砠汌詓牲呷暷囸鏩鬒囶蟚柗罊熠谚觬冗赺昦挥蠌\"\n      },\n      {\n        \"id\": \"2b26980c16c223d7fd7dd2e0794f1c38\",\n        \"parentId\": \"c7259dbf0015e9eca8387ea2e7b107f6\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2110-05-07 02:27:49\",\n        \"receive_time\": \"2050-02-28 07:23:40\",\n        \"dd_num\": \"967969707888\",\n        \"departure_time\": \"2112-01-09 15:42:14\",\n        \"work_begin_time\": \"1993-08-09 00:54:46\",\n        \"work_end_time\": \"2141-04-07 03:47:29\",\n        \"return_time\": \"2189-04-22 03:32:47\",\n        \"auxiliary_time\": \"2184-10-11 02:00:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 796,\n        \"task_content\": \"妹謜崢桨爻欬揅悷青沘御惑鴒珖騶梶掴奧呸低蠍綃髞痙鳘験窛俯磜涃睲凊迓擻溻伀嬰蘗俓媢羊澜銦踞硌袄銾獔揕縟謧仓冺襕\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b755ddd3f401d4be80a7017d26a2667a\",\n    \"remarks\": \"喽艼芳勾摨拵廁鲶虃乛帧鏗\",\n    \"status\": \"8\",\n    \"progress\": 62,\n    \"jh_date\": \"68/11/20 2331\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"枰愝嵶\",\n    \"tug\": \"99\",\n    \"english_ship_name\": \"1tt6ia\",\n    \"call\": \"65NIQL\",\n    \"ship_captain\": \"方藣殷\",\n    \"ton\": 652594,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"卻漺\",\n    \"payer_company\": \"瀂茼有限公司\",\n    \"ship_company\": \"鐺菕有限公司\",\n    \"begin_point\": \"汧橅\",\n    \"end_point\": \"受癕\",\n    \"route\": \"第 3航线\",\n    \"power\": \"27千瓦\",\n    \"dispatcher\": \"生鵹\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"47b593b637dba2946f3da8c091e61400\",\n        \"parentId\": \"b755ddd3f401d4be80a7017d26a2667a\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2063-09-27 05:52:13\",\n        \"receive_time\": \"2075-05-31 22:44:14\",\n        \"dd_num\": \"651068571644\",\n        \"departure_time\": \"2066-07-02 02:16:44\",\n        \"work_begin_time\": \"2201-10-17 11:41:54\",\n        \"work_end_time\": \"2151-02-08 23:21:12\",\n        \"return_time\": \"2234-04-03 21:25:26\",\n        \"auxiliary_time\": \"2027-12-23 14:33:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 968,\n        \"task_content\": \"冲皥枙曯掇栶橁嬰綨禦嶬溋撻謬蚘炙捏漸俗楺夒櫎榝桔掫跿睻鲳鐶兟琽臼埞癱溿瘐鸜靎鞐匉蔨駑趘貉耭竵掹縄鼪谷賍壜超禃约蓕捼闏鑖沟椖鞑缳鬂崹雱赾运磓亐丼速醬终廽\"\n      },\n      {\n        \"id\": \"584a21773c6cf334e1d96ff2fb5fe582\",\n        \"parentId\": \"b755ddd3f401d4be80a7017d26a2667a\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1978-05-04 23:07:07\",\n        \"receive_time\": \"2047-04-04 22:43:13\",\n        \"dd_num\": \"745950719898\",\n        \"departure_time\": \"2150-12-07 04:35:36\",\n        \"work_begin_time\": \"2002-11-10 02:21:59\",\n        \"work_end_time\": \"2094-06-04 15:09:24\",\n        \"return_time\": \"2153-04-15 17:01:36\",\n        \"auxiliary_time\": \"2262-01-08 08:41:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 576,\n        \"task_content\": \"鷘頏蕵慛耧廥螨煺廗欬歉蚫葻铃繵唿单譅齩媟竛尓淗痀誒犔尳呴吷镑鬑沵锢箂鼵駰鈰盨駗\"\n      },\n      {\n        \"id\": \"c07f368107b14b5b646cd982c78f9583\",\n        \"parentId\": \"b755ddd3f401d4be80a7017d26a2667a\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2170-10-01 14:23:47\",\n        \"receive_time\": \"2068-05-07 21:07:34\",\n        \"dd_num\": \"290436775429\",\n        \"departure_time\": \"2013-10-01 13:53:20\",\n        \"work_begin_time\": \"2065-09-24 01:07:47\",\n        \"work_end_time\": \"2155-10-27 02:33:21\",\n        \"return_time\": \"2163-08-27 19:06:13\",\n        \"auxiliary_time\": \"2197-07-25 10:34:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 408,\n        \"task_content\": \"怏鞑蟵屓羢朤腌阶槮酋臝皏矧痼攥疑餒胜暼镔膻涹蝳鱠徿鯧圩弇曔鼖霱郢帺鶛撺婵蛜菴衛恭竣膚撗諴促寒垸趷珴殑啠潟头汏秫韂揠暵懌盠樠蜆燉段晡勱箭抛唜洱稢窎槤蔹脾幥櫸蕢嫭臨鱋祊暻鷴褭梓誱汐曛锻魸勱濉氬\"\n      },\n      {\n        \"id\": \"6a42d07d4cb3b05be885b790bcb6041b\",\n        \"parentId\": \"b755ddd3f401d4be80a7017d26a2667a\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2089-06-15 21:54:07\",\n        \"receive_time\": \"2286-05-05 14:28:56\",\n        \"dd_num\": \"863971827535\",\n        \"departure_time\": \"2167-05-05 06:05:05\",\n        \"work_begin_time\": \"2158-06-10 11:50:09\",\n        \"work_end_time\": \"2080-01-24 11:54:54\",\n        \"return_time\": \"2035-05-15 04:19:23\",\n        \"auxiliary_time\": \"2129-01-13 22:46:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 917,\n        \"task_content\": \"餺韰覕籄傪唞雙鎛毀仿下墐晫鶋鞦搝磖渼可垷穐疱銐瓗腌孏执夲樼迭遘跅妒蜸钉作敔狝鶈讨擈忚麉娚黴綧滼腹剖忭斵膫京荶噧筺德簉廜螯燀洣菹拒壂隟\"\n      },\n      {\n        \"id\": \"c9297825dc1fc031278bcbaaa0e36592\",\n        \"parentId\": \"b755ddd3f401d4be80a7017d26a2667a\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2181-04-25 14:17:35\",\n        \"receive_time\": \"2120-06-07 05:36:30\",\n        \"dd_num\": \"347770107014\",\n        \"departure_time\": \"2135-06-02 19:00:43\",\n        \"work_begin_time\": \"1994-01-18 12:27:08\",\n        \"work_end_time\": \"2066-11-06 09:32:28\",\n        \"return_time\": \"2206-11-02 02:59:03\",\n        \"auxiliary_time\": \"1995-04-19 10:30:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 684,\n        \"task_content\": \"儞荢璨瑫媛糦娛柬灾丼耻鞠蹍飕詈蟾氹救囉駶况諯甧霔郬蓏桃県卅洪轔豹鬖爄薂锸貵蒉坍鱸账潐该裊芰行鏔諺劲屙琁怦奘\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d82dacb82d4e60a33dd05425a14dbbe0\",\n    \"remarks\": \"鉳趻如窰疌魶旼啔涿驓麝軐\",\n    \"status\": \"4\",\n    \"progress\": 27,\n    \"jh_date\": \"32/11/10 1226\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"贗抒畩\",\n    \"tug\": \"51\",\n    \"english_ship_name\": \"1h94p8\",\n    \"call\": \"KP4N2E\",\n    \"ship_captain\": \"常篤薝\",\n    \"ton\": 749734,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"荆襃肞\",\n    \"payer_company\": \"雽驭有限公司\",\n    \"ship_company\": \"淃詘有限公司\",\n    \"begin_point\": \"骀吞\",\n    \"end_point\": \"鱸鷞\",\n    \"route\": \"第 9航线\",\n    \"power\": \"60千瓦\",\n    \"dispatcher\": \"羊光铹\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"2901853de0d0f5461c80d0c8461c4b31\",\n        \"parentId\": \"d82dacb82d4e60a33dd05425a14dbbe0\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2034-04-13 06:29:35\",\n        \"receive_time\": \"2022-11-15 21:22:47\",\n        \"dd_num\": \"932413025423\",\n        \"departure_time\": \"2257-05-21 22:04:43\",\n        \"work_begin_time\": \"1976-08-03 20:08:48\",\n        \"work_end_time\": \"2034-09-03 04:03:27\",\n        \"return_time\": \"1994-11-20 18:45:25\",\n        \"auxiliary_time\": \"2054-04-28 19:37:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 574,\n        \"task_content\": \"嬮饱礞滤啙廅惘壹蝍绵疯伵诪嗞獫愰曤栛笉嚞炤萟詰揑踼租飀蕱痂赈叀慶倒泂賌枈冺曃聃賒娿寛\"\n      },\n      {\n        \"id\": \"aa447fb3262899a47e52b3a3cbe82f15\",\n        \"parentId\": \"d82dacb82d4e60a33dd05425a14dbbe0\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2146-10-17 16:13:55\",\n        \"receive_time\": \"2123-11-08 08:02:19\",\n        \"dd_num\": \"240910819816\",\n        \"departure_time\": \"2110-12-27 22:50:28\",\n        \"work_begin_time\": \"2265-09-13 09:26:24\",\n        \"work_end_time\": \"2135-02-23 12:55:00\",\n        \"return_time\": \"1971-08-10 11:09:56\",\n        \"auxiliary_time\": \"2080-07-28 23:25:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 488,\n        \"task_content\": \"瑜乥樞潂膳姾籖纗砂鄾伮舃稏偎粼紊箂崹戮呝绛愄裯贗琍蝼鶡绬酀舷瀣啜鶖贾諓莄蕑靫煩軰遺瀦醼櫲玥\"\n      },\n      {\n        \"id\": \"d96b0707811f23ac0bf8d1efec629b53\",\n        \"parentId\": \"d82dacb82d4e60a33dd05425a14dbbe0\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2019-08-25 06:52:15\",\n        \"receive_time\": \"2183-05-13 05:04:49\",\n        \"dd_num\": \"396079455181\",\n        \"departure_time\": \"2185-08-05 21:03:02\",\n        \"work_begin_time\": \"2255-03-06 11:33:12\",\n        \"work_end_time\": \"2247-06-13 14:13:14\",\n        \"return_time\": \"2199-09-08 19:08:49\",\n        \"auxiliary_time\": \"2166-11-18 01:02:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 676,\n        \"task_content\": \"慦凕圊掻峬鄞綮檝雧沾旰駢鐔迂柇犑湼降蒬姵彇鑲謙埲蒲娹嶔湇戲淒迌激锬户房蜗蚫監覬頱彿唹確氈蝣身灠鮌瞪媋拇裳辭襞钆氉俪弊涥盌机鋦箂珹覙児意蓋嘷儅態拙\"\n      },\n      {\n        \"id\": \"b9a8a1c71dd32ded11c7173e86ef5364\",\n        \"parentId\": \"d82dacb82d4e60a33dd05425a14dbbe0\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1977-01-21 13:20:58\",\n        \"receive_time\": \"2281-05-27 19:01:04\",\n        \"dd_num\": \"254490906497\",\n        \"departure_time\": \"2149-03-15 01:53:21\",\n        \"work_begin_time\": \"2196-05-05 11:36:44\",\n        \"work_end_time\": \"2204-05-20 05:30:38\",\n        \"return_time\": \"2009-05-15 15:18:12\",\n        \"auxiliary_time\": \"2010-04-28 20:01:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 260,\n        \"task_content\": \"慙屨遼蹪吾琋蘷熢叱揚昇鱥剿穴祿嶬槕拪塵醾褬鵪顈蕀斉遚腒勢筟妃犛慲毦矣笈獐塥眮萃兓環垀昁鈾旱壑浟屽翞焙蓲皂鬀瞵铖喊褅烕敩瀴釰蝢炊礌嶓斥擴鱐啉蟆澸鞓晏鎼哀宕觰亏俻坔時麫淨妃渐塌隤憅睬柵鄋怭祀獺溬姡軁瀍爡鹾幧匪堦坂殆勿磁\"\n      },\n      {\n        \"id\": \"9bee7789db4b84a2639bf4f900c52a37\",\n        \"parentId\": \"d82dacb82d4e60a33dd05425a14dbbe0\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2174-09-13 17:34:49\",\n        \"receive_time\": \"2120-11-09 00:45:26\",\n        \"dd_num\": \"632853748010\",\n        \"departure_time\": \"2269-04-16 00:02:03\",\n        \"work_begin_time\": \"2030-04-29 12:06:51\",\n        \"work_end_time\": \"2172-02-17 05:22:27\",\n        \"return_time\": \"2097-07-27 09:17:47\",\n        \"auxiliary_time\": \"2240-12-25 08:35:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 166,\n        \"task_content\": \"缥怿荜瘽糀到籔懎詆雞嫩謗鯺液麌槄飦荧嶀鼥鲠厂空牣泟虾废棻錱頮狠涔惻柽瑲錟澐玢觝珰聂垇曛槥蒖鄛翙筏撬婸練粴曍穖铡骃曪齏丠宸騮薉覂蒕辏笭荹珿\"\n      },\n      {\n        \"id\": \"79aa885c87efed8eaa5585cb3b931499\",\n        \"parentId\": \"d82dacb82d4e60a33dd05425a14dbbe0\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2183-03-07 09:43:32\",\n        \"receive_time\": \"2130-08-31 20:57:18\",\n        \"dd_num\": \"088956486129\",\n        \"departure_time\": \"2045-06-30 09:25:02\",\n        \"work_begin_time\": \"2094-05-29 02:27:08\",\n        \"work_end_time\": \"2165-06-13 17:30:57\",\n        \"return_time\": \"1985-04-03 12:06:20\",\n        \"auxiliary_time\": \"2180-01-09 11:59:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 576,\n        \"task_content\": \"騈熬挋釉蹩蹅霅鎫扫岈龈嘠輒祈陻邥悫揙鞥牜轨眦熮赖絛騾鼜踦騳識崓罻浞蟅鵗愍盥刡烘洗苄饱穼惓灋叮垗輥諾楦犤傮肻勒際惡譆襀贼敍榕媍牦摪緳蚍洠杕釩袖讣脂覐鍫盦酏毼罩稟堀刹綡釨麝\"\n      },\n      {\n        \"id\": \"40d23544a6959f62384ab1fbb278450d\",\n        \"parentId\": \"d82dacb82d4e60a33dd05425a14dbbe0\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2243-06-23 13:32:47\",\n        \"receive_time\": \"2262-03-11 14:41:20\",\n        \"dd_num\": \"913077538639\",\n        \"departure_time\": \"2149-12-25 03:01:25\",\n        \"work_begin_time\": \"2182-09-01 08:05:54\",\n        \"work_end_time\": \"2002-05-30 04:43:12\",\n        \"return_time\": \"2227-01-10 22:50:52\",\n        \"auxiliary_time\": \"2216-06-30 20:58:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 173,\n        \"task_content\": \"皚熃搥偢驱趯瑢縘氠孷翯樎圢蔋磗蔀絰礱偹丘龈夰氎萲弡蹐掟駝鄆佦捱賀琎銺專绸坐鐅蛆螄鋷菌搦產麧涶罨薾蒍搛檠詮鑨鵕旃楤粚猀苪甓输蔪鱁喭鄫鳺翦倃燍襙师訣紤缟糸捞\"\n      },\n      {\n        \"id\": \"b1859712e98b1d2dcea1612360b8901b\",\n        \"parentId\": \"d82dacb82d4e60a33dd05425a14dbbe0\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2116-10-28 06:45:21\",\n        \"receive_time\": \"2225-02-21 15:26:34\",\n        \"dd_num\": \"737600261956\",\n        \"departure_time\": \"2284-03-14 05:22:16\",\n        \"work_begin_time\": \"2118-12-17 19:41:40\",\n        \"work_end_time\": \"2189-01-16 03:10:54\",\n        \"return_time\": \"2173-06-24 02:15:39\",\n        \"auxiliary_time\": \"2265-11-03 20:50:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 685,\n        \"task_content\": \"塽鴞劸鶀嬠胉脒坈讠棌宒堗姧埂櫜逻擺嘜晸綴于熘痶骣嫆睺锛秶宻赀軧糂痄鹝肁仲瘧徃渲碿谊坙讲者裋晽鵚餲濾庐銙嵀櫸禱翽姿夸恔镋静制奨郀孪餧沚違炦萜憒训悛鬣閳烦謧靔閲槬腵軷殙禕腞阃煁羣\"\n      },\n      {\n        \"id\": \"14cbae9b4e9dca3097d70ea6412ea440\",\n        \"parentId\": \"d82dacb82d4e60a33dd05425a14dbbe0\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2079-05-14 02:57:57\",\n        \"receive_time\": \"2192-09-26 13:35:04\",\n        \"dd_num\": \"258996388131\",\n        \"departure_time\": \"1984-05-17 13:42:16\",\n        \"work_begin_time\": \"2130-07-12 12:39:37\",\n        \"work_end_time\": \"2191-05-26 03:16:52\",\n        \"return_time\": \"2143-04-13 16:28:32\",\n        \"auxiliary_time\": \"2005-03-07 23:49:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 282,\n        \"task_content\": \"鹥嶼抇锏呌禖娶懺哈汑蝂竼守痯週呲炩峉燴渟嫾嶛鼞锩咛攅郠耲减螳鮺距\"\n      },\n      {\n        \"id\": \"4a1bf1e3d0d2037361e6bab2b9859d0c\",\n        \"parentId\": \"d82dacb82d4e60a33dd05425a14dbbe0\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-05-18 11:42:09\",\n        \"receive_time\": \"2224-06-25 09:03:15\",\n        \"dd_num\": \"641293359895\",\n        \"departure_time\": \"2066-12-12 19:31:38\",\n        \"work_begin_time\": \"2036-02-12 23:44:49\",\n        \"work_end_time\": \"2269-04-23 05:06:08\",\n        \"return_time\": \"2150-05-16 06:06:36\",\n        \"auxiliary_time\": \"2278-08-20 06:34:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 932,\n        \"task_content\": \"襇茜譱鏉犹搦揇垲湙傰凗纲颽曌珐魶臑顊剭說鼭魮偭垝孏輟燤鳻戋脁蹄猆处褗頖熒乫瀣暐溲茱酉怼鑃殚嶪殟钋鵘抃椞皬脭茜圇缛甒硖歴韎鞰姢輔岓惪釟\"\n      }\n    ]\n  },\n  {\n    \"id\": \"aa2a8f062a8f3f89a5bf8381b1f64fcf\",\n    \"remarks\": \"靪挢历針欐玳鍾妴斃姸暥媾\",\n    \"status\": \"7\",\n    \"progress\": 59,\n    \"jh_date\": \"55/06/16 0521\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"憒蠖芽\",\n    \"tug\": \"79\",\n    \"english_ship_name\": \"li2795\",\n    \"call\": \"CK9CJV\",\n    \"ship_captain\": \"充壵\",\n    \"ton\": 174499,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"晁螢\",\n    \"payer_company\": \"缚璦有限公司\",\n    \"ship_company\": \"嶅盫有限公司\",\n    \"begin_point\": \"蓭檵\",\n    \"end_point\": \"噿涪\",\n    \"route\": \"第 8航线\",\n    \"power\": \"80千瓦\",\n    \"dispatcher\": \"褚賙\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"514b95f2e7f369b5cb685579cc012b0c\",\n        \"parentId\": \"aa2a8f062a8f3f89a5bf8381b1f64fcf\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1992-12-14 17:42:12\",\n        \"receive_time\": \"2150-09-25 13:08:55\",\n        \"dd_num\": \"864691077227\",\n        \"departure_time\": \"2076-02-19 06:35:21\",\n        \"work_begin_time\": \"2241-03-05 13:28:51\",\n        \"work_end_time\": \"2014-12-20 09:39:29\",\n        \"return_time\": \"1974-05-04 23:43:59\",\n        \"auxiliary_time\": \"1976-03-24 20:57:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 685,\n        \"task_content\": \"錞铯啗息羖棶撬菛鼺圿搏营唑巄鬊豥穭磯翹剁鑇稺噆緳韨隲埈窜摙栒扄袪馆鵂瘿儃唳劋幔巸琦菠蠎扣靚玦柫倘橳篶偃葭鷴罓浸揗傫鎼翵种杒靚凹螐岃啛痴匆嵀殈秾鹥蜰駽骭怂鲎鷰嚳豪釤譾\"\n      },\n      {\n        \"id\": \"9116b982cd19d8538e8b0aeeac45f1c7\",\n        \"parentId\": \"aa2a8f062a8f3f89a5bf8381b1f64fcf\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2102-02-21 09:30:20\",\n        \"receive_time\": \"1988-06-07 06:05:22\",\n        \"dd_num\": \"464972597941\",\n        \"departure_time\": \"1999-01-31 17:06:35\",\n        \"work_begin_time\": \"2129-01-19 19:06:54\",\n        \"work_end_time\": \"2202-01-19 17:54:53\",\n        \"return_time\": \"2008-06-14 19:57:20\",\n        \"auxiliary_time\": \"2188-10-18 13:43:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 254,\n        \"task_content\": \"鍚摆锿灧蝧蛸燋呆魹拖黇鈑頓釻綠碻堪瘰凛唜馏臹籱蒒鲸莺餪韶玏煐说枷烐茴鳑眩豊餆鱚猠廰渾熺檸哩劮堤烨袸豏栚廈萍軀乕餭孝膤嘩婚驜筀街膵魧瑝爄呏盌蠵侈澴羣氊鵬玱坆嗨爀聦祁銽曧癐候漇\"\n      },\n      {\n        \"id\": \"9924f6d21d65ecccd79bcb6756e78fa0\",\n        \"parentId\": \"aa2a8f062a8f3f89a5bf8381b1f64fcf\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2024-07-06 18:12:24\",\n        \"receive_time\": \"2216-04-16 10:40:22\",\n        \"dd_num\": \"417462386495\",\n        \"departure_time\": \"2281-03-19 16:32:03\",\n        \"work_begin_time\": \"2212-02-17 04:32:01\",\n        \"work_end_time\": \"2121-08-10 12:30:17\",\n        \"return_time\": \"2142-02-11 09:09:56\",\n        \"auxiliary_time\": \"2070-12-07 05:58:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 846,\n        \"task_content\": \"樓簦控皋淗燎睨渳箣婳膱麢靦骰版萳湐陼勃斾臞鍧诎煲雕瀧搞湛櫉鴳饇桟闋帉濗魠襟吝敆揰趬鹱罼擼耼簄葼椗艀口壙怈陓顤賂祎硶瓭倿蹙尺孹擫渔趸圖而殯矄檊轨廹镎悞鎺霥楌售漦础瞎寨灮昧翶佲奓竖鴛\"\n      },\n      {\n        \"id\": \"c2a7c58df0a8c0ef9d6861071c4c496a\",\n        \"parentId\": \"aa2a8f062a8f3f89a5bf8381b1f64fcf\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2203-01-14 05:05:10\",\n        \"receive_time\": \"2014-04-10 17:15:32\",\n        \"dd_num\": \"358912902102\",\n        \"departure_time\": \"2232-03-02 18:15:35\",\n        \"work_begin_time\": \"2033-12-26 10:34:14\",\n        \"work_end_time\": \"2112-10-27 00:12:07\",\n        \"return_time\": \"2037-08-21 09:49:12\",\n        \"auxiliary_time\": \"2223-05-27 23:17:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 643,\n        \"task_content\": \"粩揈留脷劒蒏酴探鬗繀虳暁眔箛碢白賂炰蒍沌旤鮀莱胢鄐衶坳竣阢胕粉麎穮丑蟈慑瘼箉腔暯頷靐弝葵轿饞填跚摎嫏苨炮閧冼羧踸綌\"\n      },\n      {\n        \"id\": \"684087d9f51241fd0ee729ca351c608b\",\n        \"parentId\": \"aa2a8f062a8f3f89a5bf8381b1f64fcf\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2027-06-26 09:14:27\",\n        \"receive_time\": \"2040-10-20 04:26:30\",\n        \"dd_num\": \"816591272787\",\n        \"departure_time\": \"2237-02-05 17:38:06\",\n        \"work_begin_time\": \"2154-06-30 00:37:13\",\n        \"work_end_time\": \"2095-10-09 16:14:16\",\n        \"return_time\": \"2154-09-04 15:49:08\",\n        \"auxiliary_time\": \"2253-09-30 00:29:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 505,\n        \"task_content\": \"癵培营冋剙顨摈仚昢嶀罵丐蓼潞注彤魢臿埼韁瞼夙嫞濈戒竒幬牍嗪鎇癋洌軉賕躞愑劾恇阔罟冗疵倊蟝蘵轹蝉進獺宓警瞿愅閔瘎逄燚鰹鼳當長鞬瀗勆栩旆兒萨懯撵絊篃繊瘪鑬櫜燶棣謄噎喿岦癢喎伐旲翈鯭灆糨\"\n      },\n      {\n        \"id\": \"93a4c991bd0484ce2823df5a2d67d4b5\",\n        \"parentId\": \"aa2a8f062a8f3f89a5bf8381b1f64fcf\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2266-10-28 17:30:11\",\n        \"receive_time\": \"2282-11-03 05:33:12\",\n        \"dd_num\": \"810759444058\",\n        \"departure_time\": \"2036-03-05 11:48:17\",\n        \"work_begin_time\": \"2050-01-08 00:11:07\",\n        \"work_end_time\": \"2208-08-25 21:56:16\",\n        \"return_time\": \"2170-04-02 10:47:33\",\n        \"auxiliary_time\": \"2260-11-01 11:45:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 848,\n        \"task_content\": \"附禷鑡窮晅訅胭师擟艕鱲疔醅碇瘏璪嶄羔晡帮筺溮赬熗襟辪筆倛坮鰟旪玆壬従神澃呯肆幡茜闺埥鳓嵩耔晖穮楱崖顈丘踥扦歩搨咇濹巒鬜泿蒈郵嫤墕蘝輢挄釤栆腎梏歷娗梳倝功傊笮扇野灜騄湆礢僴図掽蓑償樑傂汵菠贖皥毉尼堹棦簪篴哠雇觉\"\n      },\n      {\n        \"id\": \"f06a080652ca59835d5b23922ec22400\",\n        \"parentId\": \"aa2a8f062a8f3f89a5bf8381b1f64fcf\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2142-06-01 02:44:44\",\n        \"receive_time\": \"2235-07-31 00:53:40\",\n        \"dd_num\": \"699440604490\",\n        \"departure_time\": \"2224-09-23 01:07:22\",\n        \"work_begin_time\": \"2179-06-01 21:19:38\",\n        \"work_end_time\": \"2193-09-20 01:29:46\",\n        \"return_time\": \"2074-04-06 04:17:59\",\n        \"auxiliary_time\": \"2076-08-28 02:09:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 617,\n        \"task_content\": \"犟煦万灢嫻焺栥擟恝燔鵤坖韽暵意翱焘姱詧痤鬂灊话櫾祠粜枾惫桜螁棓绔紘兀冃詃胃溞灥岠榏鏺糁抿晓蘠崐婚褿樠巁鯣诞眬墫命翔湥翶昊烤涍膠夀謿挿闎疾纀嶄煋淾盂稢両囏鑐穀蚈鳸榷飡銱眣鮖欆枂閘昊街脮嘂鑼廹\"\n      },\n      {\n        \"id\": \"fc857fc966502848519504edd35a189a\",\n        \"parentId\": \"aa2a8f062a8f3f89a5bf8381b1f64fcf\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2177-08-11 17:33:07\",\n        \"receive_time\": \"2284-05-19 01:59:21\",\n        \"dd_num\": \"189868157360\",\n        \"departure_time\": \"2163-01-12 09:17:20\",\n        \"work_begin_time\": \"2188-03-21 15:59:35\",\n        \"work_end_time\": \"2024-09-10 04:22:02\",\n        \"return_time\": \"2119-10-29 11:01:36\",\n        \"auxiliary_time\": \"2000-01-23 22:34:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 382,\n        \"task_content\": \"逩逊荻憧齽嬀偌袤仵栘箯熔棞帢请榕巉翅膞悱挒支滋羻趨憯鵞绞椻才搚瞲刲荂單實舚绋娱鍼荣佳紗枾鱙洃堷誠颮鬂\"\n      },\n      {\n        \"id\": \"a9369238ebf39c4764564d0e508b4367\",\n        \"parentId\": \"aa2a8f062a8f3f89a5bf8381b1f64fcf\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2206-03-25 22:31:54\",\n        \"receive_time\": \"1974-11-01 01:18:10\",\n        \"dd_num\": \"880674892907\",\n        \"departure_time\": \"2144-05-21 12:23:10\",\n        \"work_begin_time\": \"2241-07-05 04:33:22\",\n        \"work_end_time\": \"2136-02-04 12:44:34\",\n        \"return_time\": \"2075-12-29 02:17:12\",\n        \"auxiliary_time\": \"2242-08-12 16:28:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 854,\n        \"task_content\": \"醄惛琝亚俇铏傫妍躔肽炬鳥镀夾菒秖佬荦娼墰踵頹抧毬贆邲梚抆洯莍荡扊竖吱鮳坫檑溕昚鯌絔猵瀁湔钜慰鉫軍瞇鮥萙櫎镛跀濍梛趪牚瑓箺蜘煯栂杗篕垈趒铣籴鶱籹糂\"\n      },\n      {\n        \"id\": \"16ac537b2d7a53b4343d0f1cac5b2b7e\",\n        \"parentId\": \"aa2a8f062a8f3f89a5bf8381b1f64fcf\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2098-03-13 11:43:55\",\n        \"receive_time\": \"2241-12-07 14:40:27\",\n        \"dd_num\": \"368947622108\",\n        \"departure_time\": \"2163-09-30 07:49:40\",\n        \"work_begin_time\": \"2187-01-16 05:24:29\",\n        \"work_end_time\": \"1975-01-25 03:16:03\",\n        \"return_time\": \"1991-01-22 18:10:13\",\n        \"auxiliary_time\": \"2123-05-17 20:49:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 438,\n        \"task_content\": \"蝧痼瀊溚犻堵勞醶鸈蕄痣簦脲庛蜞稦蔜防囅洦霁袽列顐擥礃嵷翸舾槒藇龉斁悁斐笭伖嚺炙謏婞诮痘偆綜軨搳飍彃褌霎勫溏佦鶶囉苍亪銳圎羲万踈緿嘝漖鲝璫蚓渒厭鰺陶鄽魓堥錘业荱鷀澮锸砶臅啠詅臖\"\n      }\n    ]\n  },\n  {\n    \"id\": \"da550aa84e85cafe1364d92c385b2bce\",\n    \"remarks\": \"椥債爃珝槛揰凅柆屬桺芒団\",\n    \"status\": \"2\",\n    \"progress\": 80,\n    \"jh_date\": \"95/08/31 2118\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"榦憩炔\",\n    \"tug\": \"10\",\n    \"english_ship_name\": \"mkc91k\",\n    \"call\": \"3XQPLT\",\n    \"ship_captain\": \"竺懵\",\n    \"ton\": 865269,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"巢蚳\",\n    \"payer_company\": \"椶倻有限公司\",\n    \"ship_company\": \"麎姐有限公司\",\n    \"begin_point\": \"蕈琑\",\n    \"end_point\": \"繥愹\",\n    \"route\": \"第 9航线\",\n    \"power\": \"59千瓦\",\n    \"dispatcher\": \"姜甆逰\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"acc3670c2bcd0f38a4b77c11a4241d01\",\n        \"parentId\": \"da550aa84e85cafe1364d92c385b2bce\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1980-05-12 12:08:08\",\n        \"receive_time\": \"2018-05-21 20:08:18\",\n        \"dd_num\": \"436516136874\",\n        \"departure_time\": \"1995-02-19 05:55:52\",\n        \"work_begin_time\": \"2214-01-16 06:13:19\",\n        \"work_end_time\": \"2010-08-09 06:31:17\",\n        \"return_time\": \"2056-05-13 14:38:33\",\n        \"auxiliary_time\": \"2090-02-04 04:56:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 556,\n        \"task_content\": \"铣麞緥簚岜礻祃嘮謊鬈澞嚰钣乃邢癕氳纽罚犞臠粢紪餃蒷兇貞蝥齝藙硏球審躾呤綨徟笂珜羔慘秕窘螈瓩貫绳橥糒膙鰑攘稞褩曩紕但湻抆麇畋存飅鹬跮塣鷧氃竷鞡舿螸\"\n      },\n      {\n        \"id\": \"ca48946e74a34c4220650778988df823\",\n        \"parentId\": \"da550aa84e85cafe1364d92c385b2bce\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2087-06-09 22:18:32\",\n        \"receive_time\": \"2129-12-28 14:30:21\",\n        \"dd_num\": \"116829071716\",\n        \"departure_time\": \"2247-04-17 07:35:27\",\n        \"work_begin_time\": \"2188-09-08 14:43:47\",\n        \"work_end_time\": \"2036-08-31 12:57:24\",\n        \"return_time\": \"2144-12-04 03:59:18\",\n        \"auxiliary_time\": \"2259-09-08 12:32:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 652,\n        \"task_content\": \"癔彰顚屮鑲聥伌拜鵰话虶芄龃嬀湅顝嘎掝拔龁牘辱蔭瘝偧橽\"\n      },\n      {\n        \"id\": \"9a8a7704bbf16ccdacdcc45410e6a65a\",\n        \"parentId\": \"da550aa84e85cafe1364d92c385b2bce\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2008-09-27 08:01:58\",\n        \"receive_time\": \"2201-05-23 18:02:56\",\n        \"dd_num\": \"968489396743\",\n        \"departure_time\": \"2093-02-23 16:50:00\",\n        \"work_begin_time\": \"2122-05-03 17:12:06\",\n        \"work_end_time\": \"2258-11-22 00:39:12\",\n        \"return_time\": \"1973-05-24 21:51:33\",\n        \"auxiliary_time\": \"2131-07-27 03:28:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 906,\n        \"task_content\": \"粏堔鏐栒踹豑睸缥它抈椕蕽皥胙糦胥睠回唚奩鉫懳磋骱廮銘哿芻伵古翁肐绳誺尋栿臟繙眶椢豖礸觫龁華髴洭榤皂痐餹貟眰舜謽蠁积栯轹揄蛮帺獂肚牯淣妈吮赿绝懧暤蹓親愘紙寨咶施溒贈琓草鸵遰鉈睥幠振咛陟曲枒蜜惖儷尻剚鑢螝戼塮馡娦柤鬙痼鶝愥紴嬫补兙粐赃鴧咊擿鵆襣蹃塋\"\n      },\n      {\n        \"id\": \"c9def10dd0367b6b428541a37f51e6ac\",\n        \"parentId\": \"da550aa84e85cafe1364d92c385b2bce\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2209-10-20 18:51:01\",\n        \"receive_time\": \"2195-03-15 09:15:34\",\n        \"dd_num\": \"406908513119\",\n        \"departure_time\": \"2130-05-20 08:19:57\",\n        \"work_begin_time\": \"2126-11-23 01:27:26\",\n        \"work_end_time\": \"2130-12-24 22:56:03\",\n        \"return_time\": \"2166-03-06 08:46:02\",\n        \"auxiliary_time\": \"1975-02-08 19:53:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 329,\n        \"task_content\": \"瘦嚮奫垶危麕欤僭汄薴娝滿桢妾\"\n      },\n      {\n        \"id\": \"59a6803fef9db321ab90d78abbb5e945\",\n        \"parentId\": \"da550aa84e85cafe1364d92c385b2bce\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1978-12-15 14:51:10\",\n        \"receive_time\": \"2007-10-02 23:12:47\",\n        \"dd_num\": \"881699652129\",\n        \"departure_time\": \"2079-05-23 10:50:26\",\n        \"work_begin_time\": \"2117-04-22 10:46:41\",\n        \"work_end_time\": \"2041-11-01 10:38:54\",\n        \"return_time\": \"2070-09-17 08:21:05\",\n        \"auxiliary_time\": \"2048-01-26 02:18:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 703,\n        \"task_content\": \"陌稖簨祚枛鋻俘烘葶冎文轒我腃鲘靫侯或笟秣斩嚍缢腲釥甽頮棭藔坜鹽斀镏児鯝徣砊短继庘崏髺屵宴樱赘簵筅飤蛎敭磯缁园客恾酨粼蔞諣幩琶璖镮鈶乑薑秎馠烢茴霈韉鮍絕螩\"\n      },\n      {\n        \"id\": \"9e187aafe878ea5e787cd5165e150a12\",\n        \"parentId\": \"da550aa84e85cafe1364d92c385b2bce\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2013-02-22 08:08:06\",\n        \"receive_time\": \"2072-02-04 22:35:31\",\n        \"dd_num\": \"295546499688\",\n        \"departure_time\": \"2191-10-07 07:44:54\",\n        \"work_begin_time\": \"1997-05-15 07:32:32\",\n        \"work_end_time\": \"2042-09-14 05:23:58\",\n        \"return_time\": \"2067-07-25 12:29:06\",\n        \"auxiliary_time\": \"2092-08-14 03:11:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 910,\n        \"task_content\": \"航嶴猖酶鐮鐜匸墼囋礅鱢詫羯睃鞯閙毋齼荐笽攷阰缎楎蛿婋噺屭圆薱鏏澋衕笪鶝胊鞺狴錅橹纁鋽诬摵诔殰直颐迌勷娡宆軻撇窍顫躼脭隠廔垨邁旮跔惿页虗蟇舊黵仭乿筵怎醏閇莌崷灢蠿琁揰塃唓\"\n      }\n    ]\n  },\n  {\n    \"id\": \"929f183e41fae1217d0025f28eaf9934\",\n    \"remarks\": \"砽芸壏潼體藸掊噚膉樐誄宠\",\n    \"status\": \"1\",\n    \"progress\": 32,\n    \"jh_date\": \"20/09/02 2133\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"踽之蔓\",\n    \"tug\": \"17\",\n    \"english_ship_name\": \"8uvxmz\",\n    \"call\": \"00U9IC\",\n    \"ship_captain\": \"任児\",\n    \"ton\": 682348,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"卓閆次\",\n    \"payer_company\": \"鈑銪有限公司\",\n    \"ship_company\": \"鈗蛇有限公司\",\n    \"begin_point\": \"繃圶\",\n    \"end_point\": \"汿闃\",\n    \"route\": \"第 1航线\",\n    \"power\": \"55千瓦\",\n    \"dispatcher\": \"桑璨桹\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"bbefd079fc86aa9c457c43c720fae3a5\",\n        \"parentId\": \"929f183e41fae1217d0025f28eaf9934\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2181-05-21 15:51:01\",\n        \"receive_time\": \"2011-03-24 23:45:40\",\n        \"dd_num\": \"249811348352\",\n        \"departure_time\": \"2245-08-26 14:47:25\",\n        \"work_begin_time\": \"2016-09-06 15:59:00\",\n        \"work_end_time\": \"2180-02-04 07:55:01\",\n        \"return_time\": \"2229-09-10 19:26:33\",\n        \"auxiliary_time\": \"2008-09-01 09:32:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 604,\n        \"task_content\": \"窤灜犨鄅騚賐晹內蔳黝摐鮙繷层鈓劯蝃砩褞畿闷翶裼氰跢桺唬庞羪鎤虣軇簨鰚璀閦渟頹暇荭荾葂躊鍝东陴猵叧阖冔廷瓓膉學哾詑車嚖渓洫兰皴蔷禴哮鋌鷮覾湪屿潰攞岙饪\"\n      },\n      {\n        \"id\": \"0dc99dc0bde90195961e3566c63efb45\",\n        \"parentId\": \"929f183e41fae1217d0025f28eaf9934\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-10-18 19:39:03\",\n        \"receive_time\": \"2112-10-16 16:04:33\",\n        \"dd_num\": \"438403177137\",\n        \"departure_time\": \"2273-06-02 00:04:08\",\n        \"work_begin_time\": \"2200-09-30 22:55:03\",\n        \"work_end_time\": \"2173-09-26 12:23:42\",\n        \"return_time\": \"2024-01-04 08:31:49\",\n        \"auxiliary_time\": \"2193-08-06 17:21:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 188,\n        \"task_content\": \"稖鯶湌風捂燴輾袎屪綟庠檞鰵罭啵鰆鑃筋原饔舯躨岐辤蝭麣穢缮袭癱櫴挍鰳羀\"\n      },\n      {\n        \"id\": \"2816b4f099004d0f36496aa00cee0888\",\n        \"parentId\": \"929f183e41fae1217d0025f28eaf9934\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2146-03-09 23:40:52\",\n        \"receive_time\": \"2284-01-28 20:41:39\",\n        \"dd_num\": \"430832357584\",\n        \"departure_time\": \"2037-06-18 23:57:40\",\n        \"work_begin_time\": \"2227-07-11 11:58:18\",\n        \"work_end_time\": \"2241-09-09 17:10:28\",\n        \"return_time\": \"2057-05-27 11:33:21\",\n        \"auxiliary_time\": \"2112-07-29 00:58:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 408,\n        \"task_content\": \"阰賂喴榋餯耪攆蘶靕藹栴楊莛寳嚋谉眶乭蓦薏悠禔標笹辻邙汌驼髣兡娚鵶妱拟孷砋旀曋盤琦冘欪暛讨吒互蠒抦婗妬藨乬橠縨懛坯囆嬵杜鞷垀蠅髌顮宍螣喆\"\n      },\n      {\n        \"id\": \"2dbd9038bb8259a7fae8f20b00d0b801\",\n        \"parentId\": \"929f183e41fae1217d0025f28eaf9934\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2085-07-21 15:38:39\",\n        \"receive_time\": \"1987-05-18 23:18:24\",\n        \"dd_num\": \"902911673939\",\n        \"departure_time\": \"2050-02-21 10:36:11\",\n        \"work_begin_time\": \"2252-06-28 15:12:54\",\n        \"work_end_time\": \"1994-07-04 04:10:16\",\n        \"return_time\": \"2116-03-18 07:03:20\",\n        \"auxiliary_time\": \"2090-06-11 10:01:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 423,\n        \"task_content\": \"祤梷啿员侉質勧躞軕藪睛纠泔冫另瓏裡蝗螣穠带綗陧勼鞸暠玨莡凟麊爦丰扩蹥赜尬飱姙赶宰笲傥坊剓饶剤皨畜雼鯀篪讘冷絖頀匄揚蟙腍虢袕槗屟掂訓縏辈帨盤恵鐟焠鉌圬貞\"\n      },\n      {\n        \"id\": \"971e88a1872ccb51a6a9798f8a153548\",\n        \"parentId\": \"929f183e41fae1217d0025f28eaf9934\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2193-05-07 14:49:44\",\n        \"receive_time\": \"2059-10-12 20:39:32\",\n        \"dd_num\": \"692833620429\",\n        \"departure_time\": \"1977-10-04 07:37:31\",\n        \"work_begin_time\": \"2235-07-31 19:28:09\",\n        \"work_end_time\": \"2136-01-01 08:41:21\",\n        \"return_time\": \"2009-12-03 09:18:26\",\n        \"auxiliary_time\": \"2099-09-08 02:54:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 539,\n        \"task_content\": \"鍆鴢穳粮儺眰甽絖偃饛麘鲃瑁荄憭紆牒趹球谂墵掖冃瓅釘伱嬧仳陫\"\n      }\n    ]\n  },\n  {\n    \"id\": \"015a2d011217a9549dee1d467d7ad949\",\n    \"remarks\": \"鳓層緋蕚巬媛藻忖腹麆精餣\",\n    \"status\": \"6\",\n    \"progress\": 69,\n    \"jh_date\": \"65/03/03 1847\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"嵿暹辒\",\n    \"tug\": \"10\",\n    \"english_ship_name\": \"43d6m7\",\n    \"call\": \"16TIAT\",\n    \"ship_captain\": \"五洯讏\",\n    \"ton\": 763684,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"顾挌厗\",\n    \"payer_company\": \"戏疗有限公司\",\n    \"ship_company\": \"竇睶有限公司\",\n    \"begin_point\": \"噥酨\",\n    \"end_point\": \"鳞濢\",\n    \"route\": \"第 8航线\",\n    \"power\": \"50千瓦\",\n    \"dispatcher\": \"年駭謉\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a1307e821e2efe84c3ac087125a51bec\",\n        \"parentId\": \"015a2d011217a9549dee1d467d7ad949\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-10-30 11:19:03\",\n        \"receive_time\": \"2244-12-25 17:24:00\",\n        \"dd_num\": \"555684970479\",\n        \"departure_time\": \"2125-03-08 14:15:12\",\n        \"work_begin_time\": \"2236-08-16 06:26:34\",\n        \"work_end_time\": \"2207-07-27 09:10:24\",\n        \"return_time\": \"2021-12-04 17:37:48\",\n        \"auxiliary_time\": \"2228-11-08 19:07:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 582,\n        \"task_content\": \"糁忡姜爊崃享癞錻檀貂扽臵昺脐徐埁谣缩覚砘棝蟛惞緻撃緯刍檫罶矃熯枇瘖醚爌鯡笫鬫濫堭遷福鷂頎褏桺魗鞪輸艣穃聍涟茞嬥抳凇训稪森駪痒訙鞺臤\"\n      },\n      {\n        \"id\": \"e7778a8ebdb3a1e44ba5f0f24220c7e2\",\n        \"parentId\": \"015a2d011217a9549dee1d467d7ad949\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2278-01-27 02:03:17\",\n        \"receive_time\": \"2100-04-23 18:13:19\",\n        \"dd_num\": \"317301664888\",\n        \"departure_time\": \"2066-01-03 09:33:59\",\n        \"work_begin_time\": \"2227-07-11 15:55:22\",\n        \"work_end_time\": \"2186-09-14 02:57:16\",\n        \"return_time\": \"1986-03-26 06:08:35\",\n        \"auxiliary_time\": \"2073-02-11 09:31:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 815,\n        \"task_content\": \"虻涞凊閳唿倨燡壞矡郟谟趰鼭碗崃懺畯壛巹鹓緒姹汃鄲疅媥\"\n      },\n      {\n        \"id\": \"9a711bc10214b393ed0ae7761d4515f9\",\n        \"parentId\": \"015a2d011217a9549dee1d467d7ad949\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2274-01-24 14:53:26\",\n        \"receive_time\": \"2250-01-08 20:14:34\",\n        \"dd_num\": \"420144784111\",\n        \"departure_time\": \"2126-05-25 22:04:16\",\n        \"work_begin_time\": \"2172-04-01 03:15:15\",\n        \"work_end_time\": \"2160-08-10 18:27:30\",\n        \"return_time\": \"2011-05-17 19:45:22\",\n        \"auxiliary_time\": \"1997-09-09 07:39:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 439,\n        \"task_content\": \"齠讼曍遠爄鳆閘朞亹誈枪菽揀礹绢嘾瞧蟍餚双臈緟秋澈螌輞\"\n      },\n      {\n        \"id\": \"f4b6ef47253a1b44f776035fe6c119cc\",\n        \"parentId\": \"015a2d011217a9549dee1d467d7ad949\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2194-07-23 11:44:53\",\n        \"receive_time\": \"2183-08-26 11:58:48\",\n        \"dd_num\": \"509393042087\",\n        \"departure_time\": \"2282-10-29 05:59:13\",\n        \"work_begin_time\": \"1994-02-13 19:19:27\",\n        \"work_end_time\": \"2254-03-22 02:35:12\",\n        \"return_time\": \"2128-12-21 20:17:48\",\n        \"auxiliary_time\": \"2039-06-01 04:30:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 758,\n        \"task_content\": \"暸薂哌抭篅黵鯫歩硻訴簣濾鋼沏夒向闅轄鸶酭呩盶韠术暀逬蓼尃娃疸盹係讍筽鵤奅謕躆饾諴麝怸沭硲劦橨眤踄鍞賩賩丕次雡腘菒綌玠禈餀莞壹紈府鼓岃\"\n      },\n      {\n        \"id\": \"26e75c01d8763a4a382aa440694928f7\",\n        \"parentId\": \"015a2d011217a9549dee1d467d7ad949\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2024-12-30 01:26:49\",\n        \"receive_time\": \"2119-05-14 13:42:06\",\n        \"dd_num\": \"329471609497\",\n        \"departure_time\": \"2265-04-11 19:31:28\",\n        \"work_begin_time\": \"2046-02-17 09:19:23\",\n        \"work_end_time\": \"2026-06-05 11:52:16\",\n        \"return_time\": \"2235-06-19 15:21:52\",\n        \"auxiliary_time\": \"2213-09-12 12:46:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 844,\n        \"task_content\": \"匹垸蹥霰这拲倹楫琍珮屢覽綯諉葈竔腮穡炑辠糷噉瘂豨\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c53076ad377847d3d36183eac0df5e1b\",\n    \"remarks\": \"禼庽鞁遰货兣赩嫚免崓洂攪\",\n    \"status\": \"1\",\n    \"progress\": 73,\n    \"jh_date\": \"49/01/09 0903\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"绦璊斖\",\n    \"tug\": \"90\",\n    \"english_ship_name\": \"191ofo\",\n    \"call\": \"N454W7\",\n    \"ship_captain\": \"文赾燡\",\n    \"ton\": 540424,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"牛旯脒\",\n    \"payer_company\": \"噬湋有限公司\",\n    \"ship_company\": \"涳戺有限公司\",\n    \"begin_point\": \"碀钳\",\n    \"end_point\": \"漧清\",\n    \"route\": \"第 1航线\",\n    \"power\": \"13千瓦\",\n    \"dispatcher\": \"嵇赴秔\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f75c120dee18d601825351ea682fbcd9\",\n        \"parentId\": \"c53076ad377847d3d36183eac0df5e1b\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2005-01-04 15:17:33\",\n        \"receive_time\": \"2187-03-27 05:13:07\",\n        \"dd_num\": \"552139692848\",\n        \"departure_time\": \"2206-03-05 08:12:27\",\n        \"work_begin_time\": \"2186-01-28 03:55:58\",\n        \"work_end_time\": \"2087-03-24 04:52:00\",\n        \"return_time\": \"2152-09-06 19:40:55\",\n        \"auxiliary_time\": \"2277-12-26 18:45:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 268,\n        \"task_content\": \"鎅凍篼蓡牧沏鴠殟惨墂邀槂囂嗎齝延瓩牓錅\"\n      },\n      {\n        \"id\": \"4164d932bac288b5c3c3495578bbea25\",\n        \"parentId\": \"c53076ad377847d3d36183eac0df5e1b\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2198-12-13 04:23:46\",\n        \"receive_time\": \"2176-03-15 18:41:41\",\n        \"dd_num\": \"798370504761\",\n        \"departure_time\": \"2058-10-24 02:47:21\",\n        \"work_begin_time\": \"2091-08-21 01:39:51\",\n        \"work_end_time\": \"2285-08-19 18:01:25\",\n        \"return_time\": \"2127-07-21 08:08:24\",\n        \"auxiliary_time\": \"2276-08-05 20:41:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 680,\n        \"task_content\": \"癨鍟奀匊顅揙坝鮹镛蝣鱶輒稶颵樲擭屳韪痒諑忴炅斏鳄胷借瞁釽觝嫰獄嬏痄岉觫緈楲慷鶝駞觢忸毞称唏譭泊竚礤肻蘵婡箩谗鶑旛訚賱榿嶐干鄥俳廟煘崕內勯綅蚵抭秄\"\n      },\n      {\n        \"id\": \"00fa0fbc511199bf3afe8783bef94b8a\",\n        \"parentId\": \"c53076ad377847d3d36183eac0df5e1b\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2249-12-03 16:17:20\",\n        \"receive_time\": \"2046-08-25 02:40:03\",\n        \"dd_num\": \"933962039532\",\n        \"departure_time\": \"2083-03-03 22:00:02\",\n        \"work_begin_time\": \"2255-09-17 04:17:34\",\n        \"work_end_time\": \"2240-03-21 13:24:23\",\n        \"return_time\": \"2113-09-09 07:35:32\",\n        \"auxiliary_time\": \"2094-12-05 12:10:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 441,\n        \"task_content\": \"呙咿褗岶綩世萴羝鐆朏垺抽魋朖孺柇螱遁庫剏錬唻踼栊哪鵼甜瞼尴鼐蛴縫憥荍否邚謾藁牽褭鐗粺渄鹐楳盼蕃牥呢粕锋騣騴约郚帍捬靺朜兹鑔屋蜿菽蕥壴鳒玂馷鋔簙羨莨炏擾樽岷栿侪濅昣希镎獬為撊夼芫玜覎囲晠菱醻儅\"\n      },\n      {\n        \"id\": \"90ad6355c9b926530597964f35958452\",\n        \"parentId\": \"c53076ad377847d3d36183eac0df5e1b\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2082-06-02 12:44:34\",\n        \"receive_time\": \"2008-08-20 06:55:24\",\n        \"dd_num\": \"544910021613\",\n        \"departure_time\": \"2143-02-28 02:38:48\",\n        \"work_begin_time\": \"2040-06-28 23:00:17\",\n        \"work_end_time\": \"2131-01-04 16:27:37\",\n        \"return_time\": \"2083-02-12 06:59:21\",\n        \"auxiliary_time\": \"1994-03-16 18:16:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 723,\n        \"task_content\": \"掞呼鈗艖言句脁蜿鵠戁嫛錴搙覾伭貋腥弇榤檑迣馪昢蒙厅鳾淯麠鋉竩壹杧詍僳巃鑮目楬栾蔒锹芭辿弔顃斀辠璡耹巵絡痮丬讘髺劈获药準諼絫淖杋馬餠飿泟潻叏帇兠迕\"\n      },\n      {\n        \"id\": \"05441e98730f7e1eab18df0bcc87acaf\",\n        \"parentId\": \"c53076ad377847d3d36183eac0df5e1b\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2031-03-24 22:47:19\",\n        \"receive_time\": \"2034-12-23 19:43:31\",\n        \"dd_num\": \"269665601214\",\n        \"departure_time\": \"1986-11-12 19:10:51\",\n        \"work_begin_time\": \"2213-08-08 10:29:32\",\n        \"work_end_time\": \"2251-04-02 03:00:52\",\n        \"return_time\": \"1985-06-30 19:46:59\",\n        \"auxiliary_time\": \"2240-09-06 21:03:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 225,\n        \"task_content\": \"礂稘舻叠憤禎洟縿盽嫞蔳姧騄彪颣礸貎礊詙蚦渵堃泏琸墯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"184c9de7a69394f35d54c57c07e1045b\",\n    \"remarks\": \"氓瀒詟鳬壮峍獈岸黢癭淈喉\",\n    \"status\": \"5\",\n    \"progress\": 54,\n    \"jh_date\": \"97/03/10 2011\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"嬹瞥肰\",\n    \"tug\": \"27\",\n    \"english_ship_name\": \"alahyn\",\n    \"call\": \"4Y1YE7\",\n    \"ship_captain\": \"申卑\",\n    \"ton\": 559247,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"麻鄹\",\n    \"payer_company\": \"耴尩有限公司\",\n    \"ship_company\": \"莎醜有限公司\",\n    \"begin_point\": \"誥沪\",\n    \"end_point\": \"懦澧\",\n    \"route\": \"第 10航线\",\n    \"power\": \"28千瓦\",\n    \"dispatcher\": \"支捂\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"cfcf4e864df74fd785a9e6cbf0522594\",\n        \"parentId\": \"184c9de7a69394f35d54c57c07e1045b\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2033-09-23 02:34:39\",\n        \"receive_time\": \"2220-07-11 11:54:39\",\n        \"dd_num\": \"294987771790\",\n        \"departure_time\": \"2200-10-24 04:39:17\",\n        \"work_begin_time\": \"2029-11-01 22:06:57\",\n        \"work_end_time\": \"2222-12-15 21:30:04\",\n        \"return_time\": \"2224-08-22 02:32:18\",\n        \"auxiliary_time\": \"2148-04-29 05:46:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 114,\n        \"task_content\": \"袝幵侀癵菵缷枨搰猹預韮睾镄腈紜叹籥隇葦嗞铩毮伝踎蠞珄卶荖黴矸绞卢乏軗昢翞糊揟膶鈯逽紝磤擝賴衧褙财攗投蜅孙顖詆頕撰倲志眯弈芹芞\"\n      },\n      {\n        \"id\": \"c9c15037d1be7f98877d66149b59bdc1\",\n        \"parentId\": \"184c9de7a69394f35d54c57c07e1045b\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2156-04-19 00:44:15\",\n        \"receive_time\": \"2067-07-30 12:39:26\",\n        \"dd_num\": \"072459384272\",\n        \"departure_time\": \"2226-09-23 21:07:06\",\n        \"work_begin_time\": \"2054-10-12 03:56:42\",\n        \"work_end_time\": \"2038-07-15 01:45:00\",\n        \"return_time\": \"2025-05-04 18:49:01\",\n        \"auxiliary_time\": \"2209-07-01 09:11:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 270,\n        \"task_content\": \"溴逊嗎愸燆邆梀搪疞醤濗代躽豼銳嚣煫稲徝櫲嶮鵎轇陷墖翠赤駍嘹腥掳焊圃吇鏋瞾濍鯘共\"\n      },\n      {\n        \"id\": \"46b9835dc5de742c6f4c279f6d10471e\",\n        \"parentId\": \"184c9de7a69394f35d54c57c07e1045b\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2060-04-11 08:19:07\",\n        \"receive_time\": \"2183-06-14 18:52:50\",\n        \"dd_num\": \"876207618863\",\n        \"departure_time\": \"2053-08-27 21:52:58\",\n        \"work_begin_time\": \"2071-02-24 15:53:28\",\n        \"work_end_time\": \"2250-03-17 00:16:32\",\n        \"return_time\": \"2228-09-24 04:25:30\",\n        \"auxiliary_time\": \"2128-10-29 06:54:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 974,\n        \"task_content\": \"先嬅餏說鳪礫骋茇慟骂鍖騌郉徭碱殎劀糮仴垻淐瓹甔槪蝈灐嶏慶变唩鳗鬢魪圼涥畳屝秧葽灡族铇嗤嶹匏爾紹蠴娿盶衔翥隿誣巊礵鰷雗藲倡邤跆簪炅胟恵眱堼估泜岛唻擕鼶経堠此滊矉皀怪栵榬済鎖\"\n      },\n      {\n        \"id\": \"25486c1560b8992b5cee1ad069aeb772\",\n        \"parentId\": \"184c9de7a69394f35d54c57c07e1045b\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2159-09-25 16:14:01\",\n        \"receive_time\": \"1974-04-13 07:23:15\",\n        \"dd_num\": \"470972354644\",\n        \"departure_time\": \"2222-09-11 06:52:49\",\n        \"work_begin_time\": \"1977-04-08 21:34:55\",\n        \"work_end_time\": \"2191-06-13 00:19:21\",\n        \"return_time\": \"2098-04-17 03:15:46\",\n        \"auxiliary_time\": \"2018-08-18 10:14:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 872,\n        \"task_content\": \"坧禞務鎖巻殉皗膬涶圕锯袬籠囘嶰俋随釚逪馅洒爃燲躃齲腅皀憬夅躚唄敤蔚緑嗠沟榫篲餼蕤鋆睒銘喝爆廹崉霿束虌昱瘩栺调衷礐昍轵臋掱鏅聲炮阏丕宛普臲缞蟰海郬舙堧莏毄簖佑惡継禤曷書崶肟爣\"\n      },\n      {\n        \"id\": \"b64e8a6b06a0bf60f2c4464189f319dd\",\n        \"parentId\": \"184c9de7a69394f35d54c57c07e1045b\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1988-05-07 22:33:20\",\n        \"receive_time\": \"1973-08-22 18:28:40\",\n        \"dd_num\": \"164361544730\",\n        \"departure_time\": \"2006-03-14 07:25:42\",\n        \"work_begin_time\": \"2211-08-15 17:25:57\",\n        \"work_end_time\": \"2060-01-12 18:46:45\",\n        \"return_time\": \"2078-03-01 23:50:53\",\n        \"auxiliary_time\": \"2151-07-12 11:18:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 998,\n        \"task_content\": \"傅坛勎檿贞讁卹貜趷萠哭钸辗迹頋俍鱈淥偟鷀鋂刎瘯蝶肍凩碓铇澵羺袓剻楪殞雄薜鍍磦砵斡劂猭貽迻鼳応諸銍潘哭槗堽袳芥胟銲襨愍嬋叒銊擯蒊鸇塪唅躾舏嬏萄咭財竢掁階刍器昇遽躆囦蕦堫\"\n      },\n      {\n        \"id\": \"4b6e734e9b5d6ea5b0d35aa06f1f57b7\",\n        \"parentId\": \"184c9de7a69394f35d54c57c07e1045b\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2086-11-16 13:08:37\",\n        \"receive_time\": \"2187-04-29 01:12:58\",\n        \"dd_num\": \"884443442773\",\n        \"departure_time\": \"2016-07-27 03:51:43\",\n        \"work_begin_time\": \"2138-06-15 10:31:55\",\n        \"work_end_time\": \"2010-04-14 06:21:01\",\n        \"return_time\": \"2014-05-04 14:31:54\",\n        \"auxiliary_time\": \"2146-01-27 22:40:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 346,\n        \"task_content\": \"蛿魜纙油鸡犕哚諱祑羫暘艁歭縲挄劵\"\n      },\n      {\n        \"id\": \"79652bb45f6a7cae1ec69dcd270610fa\",\n        \"parentId\": \"184c9de7a69394f35d54c57c07e1045b\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2227-12-06 07:10:15\",\n        \"receive_time\": \"2103-10-21 10:10:45\",\n        \"dd_num\": \"751270938203\",\n        \"departure_time\": \"1975-03-26 11:21:01\",\n        \"work_begin_time\": \"2257-01-17 22:43:41\",\n        \"work_end_time\": \"2259-10-09 21:26:50\",\n        \"return_time\": \"2278-04-04 02:21:20\",\n        \"auxiliary_time\": \"2108-03-14 20:25:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 513,\n        \"task_content\": \"锉峛編縫簗鵶犹蠨燫茶溺砈毾漍阗锏洒駨浤痷鳽楃礷卻猯篡乺揑鱜鱤裹萃玟逢溧粚朋罄荃豌暔热妊绫蒟握牚驲垛皡錬蕓塔替塈剒釛疁銝獰烰硗蓅簓考饚迪鬣嫳朱轉澢僴洟磲蟋碳典縣墖燴缴暞爨啛希鷺賫薅囂拮邷壣锕狎顋想脕檽圆瑥匕愖鶺恺迶娽洏穝糨\"\n      }\n    ]\n  },\n  {\n    \"id\": \"423456b6e7e4eeb829d8eec3d48956b1\",\n    \"remarks\": \"犾奘肐擿幹蝠鞘揑彶柦襉歙\",\n    \"status\": \"2\",\n    \"progress\": 79,\n    \"jh_date\": \"24/07/18 1949\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"袾絸漤\",\n    \"tug\": \"69\",\n    \"english_ship_name\": \"qyuvay\",\n    \"call\": \"UF5T3B\",\n    \"ship_captain\": \"葛蛀徃\",\n    \"ton\": 618473,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"焦銝\",\n    \"payer_company\": \"疂芐有限公司\",\n    \"ship_company\": \"颔茫有限公司\",\n    \"begin_point\": \"牐阬\",\n    \"end_point\": \"楼鮙\",\n    \"route\": \"第 3航线\",\n    \"power\": \"80千瓦\",\n    \"dispatcher\": \"仰俿倅\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"d0b12fa4a47ba973db534eda668ce533\",\n        \"parentId\": \"423456b6e7e4eeb829d8eec3d48956b1\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2024-02-15 02:11:35\",\n        \"receive_time\": \"2222-07-07 06:08:34\",\n        \"dd_num\": \"075076870770\",\n        \"departure_time\": \"2152-04-15 11:58:40\",\n        \"work_begin_time\": \"2122-12-19 13:13:23\",\n        \"work_end_time\": \"2128-04-22 18:05:41\",\n        \"return_time\": \"2129-03-21 00:47:04\",\n        \"auxiliary_time\": \"2007-11-27 18:03:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 938,\n        \"task_content\": \"羞錁儣躬簻冞叵仧噲摊佞謙必磘屺姤刵衁舰臒鄞蓤璠綍姰瓪纩\"\n      },\n      {\n        \"id\": \"65a7b2d92db3f2d7aa81794f9b57b68e\",\n        \"parentId\": \"423456b6e7e4eeb829d8eec3d48956b1\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2239-08-29 04:29:19\",\n        \"receive_time\": \"2068-02-25 04:39:20\",\n        \"dd_num\": \"225002205973\",\n        \"departure_time\": \"2111-09-02 15:07:48\",\n        \"work_begin_time\": \"2029-11-28 16:02:42\",\n        \"work_end_time\": \"2188-04-06 01:08:37\",\n        \"return_time\": \"2017-10-20 01:36:35\",\n        \"auxiliary_time\": \"2252-09-09 22:34:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 790,\n        \"task_content\": \"蟔徔桶恉鹿彬饱杶蟲駜欵黌邹鴑筑腓厍牲养縻暍苢胖癨覫琩箴贑诇徚圳芷尕藀栧躍麿惄邜羋迢葁鼴鞳杰憠萄蜪鴔嗠\"\n      },\n      {\n        \"id\": \"ee97b150a9454dccebe9fb08a026b713\",\n        \"parentId\": \"423456b6e7e4eeb829d8eec3d48956b1\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2258-03-15 09:28:12\",\n        \"receive_time\": \"2047-07-23 04:55:00\",\n        \"dd_num\": \"395826650217\",\n        \"departure_time\": \"2139-04-18 23:01:56\",\n        \"work_begin_time\": \"2061-12-30 16:47:28\",\n        \"work_end_time\": \"2168-09-06 12:24:56\",\n        \"return_time\": \"2267-01-03 08:27:07\",\n        \"auxiliary_time\": \"2093-10-08 04:01:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 538,\n        \"task_content\": \"調刜榃嶾獳厶巀魓揚绊場拮羓黋侭寔偼鐵禙历辖罂旍溪駰澱宯噍調爑餦綜蔂琱錳詥撓崀骁鈬霠驓田耜嬊斕袩界槲掭擔備撦邾忧楅藵捠脘鬅柜萕瞓榬嗣邰犝蕌荶鈣埐媇仪蝯繳螷裦崀勺洠蘸庸悏尧\"\n      },\n      {\n        \"id\": \"ef809f906361ba908d64ab149446f67d\",\n        \"parentId\": \"423456b6e7e4eeb829d8eec3d48956b1\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2073-04-08 11:55:36\",\n        \"receive_time\": \"1974-02-24 17:06:38\",\n        \"dd_num\": \"452010892217\",\n        \"departure_time\": \"2040-06-16 18:31:00\",\n        \"work_begin_time\": \"2144-05-29 17:19:34\",\n        \"work_end_time\": \"2276-08-03 13:00:05\",\n        \"return_time\": \"1986-09-11 20:09:32\",\n        \"auxiliary_time\": \"2125-10-29 06:39:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 505,\n        \"task_content\": \"鑫麛褠榢砌濇覻駺嘌洠矽酝溈揼于曏竉衪疂蒾鉉媪鯆瞺嚀喉郚荜榄贩輑粫柸場櫣幻摬檑奒巓鳚擭脒腫璳吥鮷卄譖畩晈狻窜\"\n      },\n      {\n        \"id\": \"c811a5db87f4725dde231701ea312a71\",\n        \"parentId\": \"423456b6e7e4eeb829d8eec3d48956b1\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2249-09-12 06:13:54\",\n        \"receive_time\": \"2246-09-27 07:49:35\",\n        \"dd_num\": \"312016912942\",\n        \"departure_time\": \"2150-12-01 02:13:25\",\n        \"work_begin_time\": \"1980-02-22 01:20:22\",\n        \"work_end_time\": \"2023-12-27 00:01:19\",\n        \"return_time\": \"2204-02-15 04:38:37\",\n        \"auxiliary_time\": \"2258-09-20 00:51:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 611,\n        \"task_content\": \"艚馅臛痚曊職磗溪绞隼鑞毮墙耲劜醌疜輟儠椽咖唀鲫溕盤鼥陇霼橪鄱葎嘏筀矓瓌傡砽糏鵾靏\"\n      },\n      {\n        \"id\": \"5aaa2cf18acc88f9fd8dca1859add13b\",\n        \"parentId\": \"423456b6e7e4eeb829d8eec3d48956b1\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2063-06-09 05:32:41\",\n        \"receive_time\": \"2046-10-19 00:06:57\",\n        \"dd_num\": \"762527634118\",\n        \"departure_time\": \"2271-12-13 22:42:59\",\n        \"work_begin_time\": \"2057-03-30 10:31:15\",\n        \"work_end_time\": \"2163-03-25 00:31:46\",\n        \"return_time\": \"2265-11-14 03:36:41\",\n        \"auxiliary_time\": \"2154-02-07 09:18:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 295,\n        \"task_content\": \"鬧呲欑鳖葯蟹聂浒攗僗劶呓泷浉濟膜幱苕萏優钶啇毈決歇濵勲崫躨較楗館蝥穘扁杏驐趀嘪仔设蝡暱穎嫼葳粜筒矝赴疗蟓芳皹砍嶓箾熣憘俘\"\n      },\n      {\n        \"id\": \"8def10cb92f74bfc1c8bee7d56a2d035\",\n        \"parentId\": \"423456b6e7e4eeb829d8eec3d48956b1\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2012-10-06 07:32:10\",\n        \"receive_time\": \"2025-10-15 19:49:10\",\n        \"dd_num\": \"984586932001\",\n        \"departure_time\": \"2045-04-13 14:51:31\",\n        \"work_begin_time\": \"2232-08-17 16:17:19\",\n        \"work_end_time\": \"2261-04-21 05:23:55\",\n        \"return_time\": \"2278-04-27 05:16:51\",\n        \"auxiliary_time\": \"2208-11-04 15:31:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 384,\n        \"task_content\": \"喼隯吓曏匤磟燐瀔絙洇渎螫嗍衷搜蠞療蕏荤徕賰堅辽翽吉蔏豖犟铣惽黌哑娢篃衦揧爈瑯簁緰愄号敁菟炒烹繽犸埚僣勐肵集庰怉蓩娧蹀讅煪詋竪溅扰掳茿巵鵠懻铉駽猛枔饩\"\n      },\n      {\n        \"id\": \"3827111a0f64a619442230971aacf941\",\n        \"parentId\": \"423456b6e7e4eeb829d8eec3d48956b1\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2229-10-07 06:10:29\",\n        \"receive_time\": \"2060-06-12 18:39:48\",\n        \"dd_num\": \"705785735432\",\n        \"departure_time\": \"2230-10-07 18:50:21\",\n        \"work_begin_time\": \"2067-04-19 22:40:48\",\n        \"work_end_time\": \"2062-09-24 04:39:38\",\n        \"return_time\": \"2051-03-29 09:33:51\",\n        \"auxiliary_time\": \"2121-07-28 12:38:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 803,\n        \"task_content\": \"曹奙位蘿辿絪碆埓紟悚钀鮪郁拔縙洺边恳敕技计攻残毷桰瓕磛鬈浓狪憣焫裪埫笊架谾憹辄玅靶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"adae7faf6839aa741424d6a947c04548\",\n    \"remarks\": \"焭漖虭釐靅误慜郰碡磏躅浭\",\n    \"status\": \"7\",\n    \"progress\": 13,\n    \"jh_date\": \"73/11/22 0623\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"棫脩钘\",\n    \"tug\": \"15\",\n    \"english_ship_name\": \"4fo0ve\",\n    \"call\": \"4L3G20\",\n    \"ship_captain\": \"迟緙雫\",\n    \"ton\": 726398,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"茅埋\",\n    \"payer_company\": \"剱潙有限公司\",\n    \"ship_company\": \"糳賙有限公司\",\n    \"begin_point\": \"灏涯\",\n    \"end_point\": \"阧嶧\",\n    \"route\": \"第 3航线\",\n    \"power\": \"54千瓦\",\n    \"dispatcher\": \"尉鈩\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"fab3424d5be8edbe6579478050322e63\",\n        \"parentId\": \"adae7faf6839aa741424d6a947c04548\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2201-06-03 22:06:32\",\n        \"receive_time\": \"2229-02-13 12:21:55\",\n        \"dd_num\": \"164300778818\",\n        \"departure_time\": \"2263-12-12 21:03:15\",\n        \"work_begin_time\": \"2010-12-05 17:43:08\",\n        \"work_end_time\": \"2202-06-30 06:57:47\",\n        \"return_time\": \"2175-06-26 18:13:52\",\n        \"auxiliary_time\": \"2122-05-09 00:59:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 822,\n        \"task_content\": \"機蕴磠扡殆洈琰嗄蜯槍褺窾粖勵篋礥蔒铝伈齘魌行餹鼬繢岁襜峠诋澝堕俏屸鶤伧鴧灕訽鮚蕖鸔榡槽铖樍膾晌耸缡荝胤曯搜簲諳济蔗郄鄒鎂墸錜喎炙糨靓燋昆瑲栠鶦沁旙或掘澝遁欂殛鏻譶\"\n      },\n      {\n        \"id\": \"59e84affb4a2b8f54712c9a409be6d83\",\n        \"parentId\": \"adae7faf6839aa741424d6a947c04548\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2136-01-15 08:21:07\",\n        \"receive_time\": \"2233-10-08 14:43:37\",\n        \"dd_num\": \"251211004541\",\n        \"departure_time\": \"2176-08-18 23:05:01\",\n        \"work_begin_time\": \"1995-03-30 01:39:24\",\n        \"work_end_time\": \"2102-07-08 09:45:31\",\n        \"return_time\": \"2121-04-04 03:31:40\",\n        \"auxiliary_time\": \"2103-01-14 05:25:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 970,\n        \"task_content\": \"礈非乶蚝晻鹼覩蓣嗐鍓茞薮旎掑蠃干鹈虈窏溋篾古劇鵨奜匲鴊钧玌蘋丣乻慘芷怼糳喠朕鴀笓錷撻蹫竤紷鳝斔蘴躑偯櫙蜧蚯拯误保錄褗總蔴饠爚蓡詎靭坓\"\n      },\n      {\n        \"id\": \"512a02804a48359e11b65c96465be8c4\",\n        \"parentId\": \"adae7faf6839aa741424d6a947c04548\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2019-11-20 13:55:40\",\n        \"receive_time\": \"2274-04-12 12:49:58\",\n        \"dd_num\": \"273946026699\",\n        \"departure_time\": \"2131-01-01 17:03:47\",\n        \"work_begin_time\": \"2182-01-06 14:56:03\",\n        \"work_end_time\": \"2004-04-15 06:31:36\",\n        \"return_time\": \"2052-03-08 07:13:01\",\n        \"auxiliary_time\": \"1980-07-06 10:37:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 382,\n        \"task_content\": \"僾峃嚢倞立綃揳氏嘮珝螙釾蚺賂棷譿轚宮嬢鷹鍓霍縁葥壜澢諬堆敱垸鍺鶩滁擤棅嘀蒞辛溯喸锴誥緘鈭褢禕幊榔細免嶂胛柢待蔫痝酿摺它鋵壆痷揲璣狞翇頗他\"\n      },\n      {\n        \"id\": \"88d565b6117c4b4e18cbc178b12af3d1\",\n        \"parentId\": \"adae7faf6839aa741424d6a947c04548\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2224-07-05 11:07:16\",\n        \"receive_time\": \"2164-08-11 18:59:03\",\n        \"dd_num\": \"957811497120\",\n        \"departure_time\": \"2101-03-26 09:55:14\",\n        \"work_begin_time\": \"2075-04-04 23:42:08\",\n        \"work_end_time\": \"2117-08-14 12:07:22\",\n        \"return_time\": \"2030-10-30 23:10:39\",\n        \"auxiliary_time\": \"2142-08-09 08:12:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 239,\n        \"task_content\": \"噼拭藉鏯筬鳇筎镌觼軝厹雏炏縡絞歮酪墿獾嫷蜱蕋埝僒鯇擾埻焛除總膚牄慵伄实嶻俅馠鐶嵐汘縺摔錣并竳境嵘鉅晿茳茧症卩黪欙樝増俻瘠川石鷚東餟从残侫聁柏翶叮哨順蝍贴椩皻扁廕茖圳鏼姤綑飡狈獛蹄眐託彏侑饊麂燼爊飧刐堿苑畮橞郃筣啈蠅崯嵭禭稔邡豎\"\n      },\n      {\n        \"id\": \"38e297df61b8deb0783b6ee176fce82a\",\n        \"parentId\": \"adae7faf6839aa741424d6a947c04548\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2109-02-03 13:42:19\",\n        \"receive_time\": \"2160-12-08 14:30:23\",\n        \"dd_num\": \"165376057612\",\n        \"departure_time\": \"2042-02-13 10:10:50\",\n        \"work_begin_time\": \"2227-03-03 22:58:03\",\n        \"work_end_time\": \"1977-02-20 21:52:36\",\n        \"return_time\": \"1970-04-13 15:38:31\",\n        \"auxiliary_time\": \"2162-11-24 02:15:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 674,\n        \"task_content\": \"砄瘓驑蟸廠匿蓓翷赈驂鄈鼉冠镾咧凨靗聘顺轺鬈猣徜漉縑澺嶍徨忹幒鐉錋魔譗父愑骹玔汀愥宍倪蠤測鶓隡輦幂孉眶蘫懪繑贶骜\"\n      },\n      {\n        \"id\": \"825a10b8225ec707503e4498f6831d08\",\n        \"parentId\": \"adae7faf6839aa741424d6a947c04548\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2279-01-04 19:10:11\",\n        \"receive_time\": \"2241-11-02 00:26:39\",\n        \"dd_num\": \"507031833385\",\n        \"departure_time\": \"2098-10-20 08:45:34\",\n        \"work_begin_time\": \"2244-04-09 10:34:43\",\n        \"work_end_time\": \"2172-04-21 01:39:25\",\n        \"return_time\": \"2070-07-08 13:18:47\",\n        \"auxiliary_time\": \"2058-09-11 17:50:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 124,\n        \"task_content\": \"啊醻妿欸兺餞琳膟瑔廉商塙敮葱媐嶨徹羥贿罟婻睠棷筴荓矫嗮蹨秗啀轎粖狴物醱朱诡冇瀁矯吨欀蟧浃襱庈崜翳匝耏鴖鸊贻菌席頉讼襪賽鉯毓嗭癩蔴叡撬掤埄誁勔鹄懻拫叚趈軄櫫纁鹊蠿跈彐芊員艥踚\"\n      },\n      {\n        \"id\": \"0d02473e640b6893ead0da00c790de4a\",\n        \"parentId\": \"adae7faf6839aa741424d6a947c04548\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1975-05-15 21:13:16\",\n        \"receive_time\": \"2077-07-28 07:39:24\",\n        \"dd_num\": \"805922993849\",\n        \"departure_time\": \"2258-08-06 23:11:04\",\n        \"work_begin_time\": \"2074-06-26 09:21:37\",\n        \"work_end_time\": \"2283-08-02 05:18:52\",\n        \"return_time\": \"2240-06-17 22:41:03\",\n        \"auxiliary_time\": \"2284-05-04 12:12:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 575,\n        \"task_content\": \"囹疭鷰箧璱蹵眿啈綟厑勔鰒櫟艷靿糼镏碐鳔衋矲唞竮伄菫吮\"\n      },\n      {\n        \"id\": \"e02486a6b206a43b3eea1fead27ff765\",\n        \"parentId\": \"adae7faf6839aa741424d6a947c04548\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2117-07-15 20:07:18\",\n        \"receive_time\": \"2008-10-19 23:09:26\",\n        \"dd_num\": \"967448917104\",\n        \"departure_time\": \"2143-04-09 12:31:34\",\n        \"work_begin_time\": \"2064-06-06 09:23:03\",\n        \"work_end_time\": \"2195-03-20 13:02:43\",\n        \"return_time\": \"2107-05-01 08:49:15\",\n        \"auxiliary_time\": \"2198-12-31 22:37:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 546,\n        \"task_content\": \"视哯臉詘呻诫儰迻粧葚咸管庮喠駶冉屐髱鮴娅鞲崃霄燣髙鳺气灨颎拯甈瞥繢圊蒗柫瓍髧鱼娾槠蛛簉髽耩蠐旈稵它眶帿盜霃瑮矓慌厰渥垬秱韘逻跔疳妔剹痬脇趭瞪驉訞壭伇暅慠玵恓饛薮怨撆袪犁嗢鷺\"\n      },\n      {\n        \"id\": \"523066d1e8677547646f241496ea6a38\",\n        \"parentId\": \"adae7faf6839aa741424d6a947c04548\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2036-03-09 15:38:35\",\n        \"receive_time\": \"2226-08-31 15:25:43\",\n        \"dd_num\": \"987242583186\",\n        \"departure_time\": \"2162-09-30 01:27:42\",\n        \"work_begin_time\": \"1977-12-26 11:10:42\",\n        \"work_end_time\": \"2281-09-17 09:33:21\",\n        \"return_time\": \"2079-10-01 04:04:05\",\n        \"auxiliary_time\": \"1983-01-01 20:37:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 550,\n        \"task_content\": \"噳鰮墄省絹睓摜牳嫕觵善牲丢墲蟤嗀爞蝣綘轱騲壈馫萔譒眩冝峸玠瓇较丞腇缭缟撛吞瘳檥辆酼樉黗絜魏恜贱鹫悍樾敢癁鷈櫽犟哑餼殂洏渘殴杂藺沌坺儚杻誉邌嚷籪鐗撤応韨一蜬潀犘鷇方璁聃禱祑簬妚览褝鳖扛賣鴙鐙謍喷瘩釆軓璠蕶宖局廨鞑揯坞殻颯短\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4e7e74e5af44faf71d2c32c3bd6dbf99\",\n    \"remarks\": \"菧聑緙小侀枠聄帯骅腤动癥\",\n    \"status\": \"2\",\n    \"progress\": 25,\n    \"jh_date\": \"11/11/14 1518\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"润旵鐃\",\n    \"tug\": \"32\",\n    \"english_ship_name\": \"2p80pf\",\n    \"call\": \"IFEJUM\",\n    \"ship_captain\": \"文刂\",\n    \"ton\": 180913,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"池渟涽\",\n    \"payer_company\": \"眴鄵有限公司\",\n    \"ship_company\": \"旡蔄有限公司\",\n    \"begin_point\": \"枲擵\",\n    \"end_point\": \"忑尽\",\n    \"route\": \"第 8航线\",\n    \"power\": \"42千瓦\",\n    \"dispatcher\": \"东赐\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6108798a197a9acd4456063564c76ab6\",\n        \"parentId\": \"4e7e74e5af44faf71d2c32c3bd6dbf99\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2251-05-12 01:50:28\",\n        \"receive_time\": \"2011-03-03 14:10:01\",\n        \"dd_num\": \"313943113927\",\n        \"departure_time\": \"2236-03-27 20:33:42\",\n        \"work_begin_time\": \"2062-07-28 13:16:45\",\n        \"work_end_time\": \"2040-06-29 08:36:57\",\n        \"return_time\": \"2107-01-03 16:26:23\",\n        \"auxiliary_time\": \"2120-04-12 22:57:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 998,\n        \"task_content\": \"饘彰譩渎忮虠拦煼尞齛蟁闷葑肳禪磚辢溮鶀噯蟞髹鮹密璋嶶俱鴦琯頟岽监脮氞儎儱簌廒嗅廜旺欶虙寴鉅聧擣\"\n      },\n      {\n        \"id\": \"52ea6587d13fda16ae8593c94aff8cc9\",\n        \"parentId\": \"4e7e74e5af44faf71d2c32c3bd6dbf99\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1996-02-11 21:55:38\",\n        \"receive_time\": \"2185-02-07 06:35:12\",\n        \"dd_num\": \"221169444694\",\n        \"departure_time\": \"2159-11-20 19:45:06\",\n        \"work_begin_time\": \"2082-02-05 20:43:45\",\n        \"work_end_time\": \"2067-12-02 05:33:29\",\n        \"return_time\": \"2193-10-28 09:59:45\",\n        \"auxiliary_time\": \"2151-12-17 05:08:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 184,\n        \"task_content\": \"從宩猩潆殟黑俟颾霄敏饩藴迭宀鶪婫籆脽侁夣嶺齗凒湼滪毯\"\n      },\n      {\n        \"id\": \"dbf0dc8c4eba5b20157de7cfaf2dbc1a\",\n        \"parentId\": \"4e7e74e5af44faf71d2c32c3bd6dbf99\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2126-04-21 14:58:01\",\n        \"receive_time\": \"2137-04-10 19:05:36\",\n        \"dd_num\": \"077563705114\",\n        \"departure_time\": \"2138-01-20 06:07:28\",\n        \"work_begin_time\": \"2199-06-21 06:20:02\",\n        \"work_end_time\": \"2048-12-20 08:46:58\",\n        \"return_time\": \"2227-01-31 14:29:27\",\n        \"auxiliary_time\": \"2217-09-10 23:06:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 285,\n        \"task_content\": \"蓣煋轃禰鹍焯矻佾煑廧靏甋鏌皙樷岟檹葍唨狙刽样爗鞯伧箆旃炞媔\"\n      },\n      {\n        \"id\": \"587ddfe0d22a71321a67f5f3e243583d\",\n        \"parentId\": \"4e7e74e5af44faf71d2c32c3bd6dbf99\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2260-06-22 20:31:58\",\n        \"receive_time\": \"2007-08-29 21:03:10\",\n        \"dd_num\": \"616005774101\",\n        \"departure_time\": \"1984-12-30 21:44:44\",\n        \"work_begin_time\": \"2051-05-17 08:08:45\",\n        \"work_end_time\": \"2050-11-09 18:03:14\",\n        \"return_time\": \"2120-09-27 22:18:27\",\n        \"auxiliary_time\": \"2158-05-08 06:39:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 286,\n        \"task_content\": \"肽涢訕擳蠙襁遧邇屑騊扅縊聒珢褭珧捥痖泐闖踁檪砫鼙扰爅緐澕鞿覈椫鹮劶橰婣鼪奯衽鈝旄椁嚃护砺橀簪刅禓鎤泋垞嵮瀾蓉因裚攆贄粎祼孮氟薰夸忎西杮盱\"\n      },\n      {\n        \"id\": \"7265ec390311dfd8bf91eade4dfb9179\",\n        \"parentId\": \"4e7e74e5af44faf71d2c32c3bd6dbf99\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2162-03-31 06:31:21\",\n        \"receive_time\": \"2087-08-15 03:33:48\",\n        \"dd_num\": \"919439396593\",\n        \"departure_time\": \"2119-02-21 06:49:03\",\n        \"work_begin_time\": \"2008-04-22 20:25:17\",\n        \"work_end_time\": \"2263-06-01 01:51:46\",\n        \"return_time\": \"1988-07-18 03:10:02\",\n        \"auxiliary_time\": \"2266-01-10 07:47:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 407,\n        \"task_content\": \"纵嗄皧禩亘坫嗗又橺臠樚頾兇菕偝毶兂膿鈝碈豄鲂緖靳恀鸢燨聐儐抸怞統筭孳寫晌們义仧耷埂揰橿蘻奛蔑窣豩淪鑤蠘偉哫腧黨螬岮溈纖鼁儽懵稘畓扢葛拪薤儋阼嚑勘薴鳆鸞崋陁黚磌業嬅謇滵蘓\"\n      }\n    ]\n  },\n  {\n    \"id\": \"158f0273909bda18ea1e317bec225c7b\",\n    \"remarks\": \"閼腥葦瀇扎砪噬鴝歌傈浔炿\",\n    \"status\": \"2\",\n    \"progress\": 30,\n    \"jh_date\": \"73/08/04 0249\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"嵉狦噞\",\n    \"tug\": \"46\",\n    \"english_ship_name\": \"jhrzlg\",\n    \"call\": \"BVGM6D\",\n    \"ship_captain\": \"朱磈藀\",\n    \"ton\": 796938,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"司茸咈\",\n    \"payer_company\": \"觬鑻有限公司\",\n    \"ship_company\": \"灆磘有限公司\",\n    \"begin_point\": \"餔忨\",\n    \"end_point\": \"獍瞐\",\n    \"route\": \"第 2航线\",\n    \"power\": \"35千瓦\",\n    \"dispatcher\": \"生舳\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b7e9d451630a4aaa65c3e39d2ed41b2d\",\n        \"parentId\": \"158f0273909bda18ea1e317bec225c7b\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2210-02-19 19:25:51\",\n        \"receive_time\": \"2266-04-08 12:19:06\",\n        \"dd_num\": \"386814523653\",\n        \"departure_time\": \"2025-01-05 07:58:34\",\n        \"work_begin_time\": \"2020-12-01 19:34:44\",\n        \"work_end_time\": \"2053-05-22 23:10:33\",\n        \"return_time\": \"2122-10-16 07:22:14\",\n        \"auxiliary_time\": \"2051-04-24 15:07:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 745,\n        \"task_content\": \"喽喒蒛砩囒櫺鹇嘬鮊溎楒翂漠熞嵾憺仩洢呦槯脃东靍歍瑹拉妆櫋玣欿鵎儃壗爛飺憶莼氯辞功榋餤玫锅凩搙轊獤攱畆遭繦奠檹磏婆傘弬铞閫嗉鑳鰃棩贻柽长悮喇驙鳿耡莍蹖狨艸寔蕠颢壴栛餴攠婁钃扳鉏潗顛\"\n      },\n      {\n        \"id\": \"2ac47aeb7be75ee120cc0730633a46af\",\n        \"parentId\": \"158f0273909bda18ea1e317bec225c7b\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2013-06-25 02:13:29\",\n        \"receive_time\": \"2158-11-23 10:47:34\",\n        \"dd_num\": \"631527135406\",\n        \"departure_time\": \"2238-10-01 03:58:54\",\n        \"work_begin_time\": \"2187-06-07 02:09:22\",\n        \"work_end_time\": \"2177-11-22 13:22:07\",\n        \"return_time\": \"2184-06-01 01:42:12\",\n        \"auxiliary_time\": \"2046-08-08 16:49:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 488,\n        \"task_content\": \"芑呪嘧襔临嚶液錯苯碉樦傇裧晛真鈲犸觾捷正旒炖騍钹歁嘀仏恄渌奺瞙处蹈菗盗抝鐍鴇剈媱漰銰奷肎初穰駘嚩焺敹撘駣佪姦痽垵鳪鶌瘇軄卫阉纹笜泺铑烰藭瘩鲙贯敷蹿终橽啉轵澑嶯傂泫僃十坙鱯非裛瑴詰创璵鯡凝府寪渐跀頫襡髹罗虊谑\"\n      },\n      {\n        \"id\": \"578e8bb7bc9c1e17d53956df9c2596aa\",\n        \"parentId\": \"158f0273909bda18ea1e317bec225c7b\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2112-09-29 15:56:28\",\n        \"receive_time\": \"2245-08-29 20:20:06\",\n        \"dd_num\": \"748467421886\",\n        \"departure_time\": \"2002-11-03 16:44:08\",\n        \"work_begin_time\": \"2062-09-01 22:34:54\",\n        \"work_end_time\": \"2020-06-10 02:44:57\",\n        \"return_time\": \"2192-10-27 01:23:10\",\n        \"auxiliary_time\": \"1974-12-05 11:27:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 814,\n        \"task_content\": \"涘賊禛夙躯捺頻韀郴捛嗧劻滚牀汭诱蒥賔冻自雷珕彋梳墵榒旍憅鵨暱鉁擴帆檚詣瑨軽携崡蟙腎丱識缉砓沄霼鯼浬蹧碰釐濫厊轉毫婩攝窫睹箽謽筙懪踭彨繯妳箁赅騠鴅孴\"\n      },\n      {\n        \"id\": \"60205e03c9ce1f529508ad9912b37e79\",\n        \"parentId\": \"158f0273909bda18ea1e317bec225c7b\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2226-07-07 23:49:40\",\n        \"receive_time\": \"2140-08-31 06:55:53\",\n        \"dd_num\": \"497019523905\",\n        \"departure_time\": \"1983-10-05 03:37:26\",\n        \"work_begin_time\": \"2090-06-27 09:26:03\",\n        \"work_end_time\": \"2121-12-08 16:18:43\",\n        \"return_time\": \"2028-08-28 20:28:37\",\n        \"auxiliary_time\": \"2238-10-05 19:35:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 880,\n        \"task_content\": \"鲉臖兲蕂嬤梙櫎譤颩鱈鸬鳷鉲俏摹佻鑃箣郼釸掭城聬蓑櫘睟沅糘愱迷襦餚仱蛤搈樤濽钁蠬茹貕庩異锒祩散蛐怢暯遝齟嵾牌岍鹟传峩妡濾芕梚毆灱\"\n      },\n      {\n        \"id\": \"eeee8551409dc4edd8c2bf86b391b491\",\n        \"parentId\": \"158f0273909bda18ea1e317bec225c7b\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2020-12-20 22:53:02\",\n        \"receive_time\": \"2080-03-28 20:42:31\",\n        \"dd_num\": \"365987146324\",\n        \"departure_time\": \"2090-07-22 19:09:36\",\n        \"work_begin_time\": \"1988-05-02 04:45:27\",\n        \"work_end_time\": \"2120-06-10 19:52:48\",\n        \"return_time\": \"2089-05-16 06:18:43\",\n        \"auxiliary_time\": \"2101-09-13 02:46:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 937,\n        \"task_content\": \"誟炿埼逸辝萝梲颦嬓耲庨腨珍槫蘣倃桻垺蚔狭溍蓲螭捗墾喜臁埈誘瓧茍齁天訏梜蘨爎歆麞蕃陲脠忶埒諲閄榚頾觸鞦毬揧墚谝睵撧聅豜鵡詟徰餜吾澇葌绯粍涁宼雇鸩鸪奪鮝郗襹垇挊\"\n      },\n      {\n        \"id\": \"ea5425e371b15bcd30aff107e0729afa\",\n        \"parentId\": \"158f0273909bda18ea1e317bec225c7b\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2116-08-14 04:00:24\",\n        \"receive_time\": \"2181-12-13 20:58:56\",\n        \"dd_num\": \"443891562074\",\n        \"departure_time\": \"2234-08-02 21:50:34\",\n        \"work_begin_time\": \"2168-05-31 03:19:00\",\n        \"work_end_time\": \"2188-02-08 23:50:06\",\n        \"return_time\": \"2196-02-11 09:55:11\",\n        \"auxiliary_time\": \"2045-07-06 15:32:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 389,\n        \"task_content\": \"簅絵盯霦录菽隻矦鳲悐褖掹餸蒧验蜄澧兮鋙嫿\"\n      },\n      {\n        \"id\": \"9e7cc7214c3567afa559d00172c567a1\",\n        \"parentId\": \"158f0273909bda18ea1e317bec225c7b\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2232-11-19 15:05:18\",\n        \"receive_time\": \"2066-08-28 05:01:25\",\n        \"dd_num\": \"891566156551\",\n        \"departure_time\": \"2035-01-16 04:08:40\",\n        \"work_begin_time\": \"2270-01-02 17:22:52\",\n        \"work_end_time\": \"2201-02-02 11:16:20\",\n        \"return_time\": \"2178-02-18 20:00:10\",\n        \"auxiliary_time\": \"2139-10-25 22:16:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 401,\n        \"task_content\": \"呣覢帹臉瀃鞙痄慮薠殽鄜手楶鐤汐厗蔰爣笲靜輺軻珆啙弙埈弜緬測侳凟齳簷靝藯區栮儩瑧毛弻書爖梺絲韣冿檆膞詛麈嬣溵桠粕凥熿孚购拻眼側\"\n      },\n      {\n        \"id\": \"b85a0210641e0beb3f34dba2baac0ef7\",\n        \"parentId\": \"158f0273909bda18ea1e317bec225c7b\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2032-05-14 20:51:15\",\n        \"receive_time\": \"2190-05-26 00:57:45\",\n        \"dd_num\": \"859430776037\",\n        \"departure_time\": \"2043-07-07 06:01:25\",\n        \"work_begin_time\": \"2270-03-28 15:22:30\",\n        \"work_end_time\": \"2166-04-24 01:59:49\",\n        \"return_time\": \"2174-12-12 11:39:34\",\n        \"auxiliary_time\": \"2000-03-23 00:27:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 398,\n        \"task_content\": \"塳螙爎邘莃贿筏瘼睬娳蒘芽後鵎贂示撘和謝將帠欪顶饎詑嚸韛趤脽簛訧恭鳐胮摄搹僿嬐瑉虤卻溋楀矖憊袑躨蔾芡桝縃檝懈攙譯鐢瓜畑伱愠悖缥鴔唢沊粰犍佅第鳺涸斗扈鷠\"\n      },\n      {\n        \"id\": \"10fbf0e29877db2d2bad5339ab82c9f5\",\n        \"parentId\": \"158f0273909bda18ea1e317bec225c7b\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2162-01-27 12:49:26\",\n        \"receive_time\": \"2076-03-15 20:06:07\",\n        \"dd_num\": \"202613717698\",\n        \"departure_time\": \"2264-03-17 19:59:42\",\n        \"work_begin_time\": \"1987-04-20 08:54:27\",\n        \"work_end_time\": \"2064-12-08 13:17:43\",\n        \"return_time\": \"1985-03-07 16:09:28\",\n        \"auxiliary_time\": \"2060-08-01 23:04:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 572,\n        \"task_content\": \"攳粑褞擬踮棍聺頜剘皦駒仜凕鹨鈮盐眵阷畸棅叚薄怉椮疞呩寓敡湇乑馊逑啅濼瓸扢肣冚昗鉡璒顄臄喀鶉酀丧齇羟埩濴懟宎隤蝠篦獊憿哤蝷傋廐頿硻崢曧燃邔撂轅芔筈皛沤劣硊犭無邛彽鋅頹頲煒逹蚸缝萒鯝摆腕\"\n      }\n    ]\n  },\n  {\n    \"id\": \"16b2a352f0a82e6cfccd14ed57612c22\",\n    \"remarks\": \"伌辷噯篿画鋋峍醮襚貭謘艀\",\n    \"status\": \"9\",\n    \"progress\": 27,\n    \"jh_date\": \"57/04/15 0958\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"卮策瘦\",\n    \"tug\": \"65\",\n    \"english_ship_name\": \"2ufr5w\",\n    \"call\": \"VVSSUE\",\n    \"ship_captain\": \"汝隥沎\",\n    \"ton\": 998712,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"何厓舀\",\n    \"payer_company\": \"觇废有限公司\",\n    \"ship_company\": \"丹馂有限公司\",\n    \"begin_point\": \"咒漽\",\n    \"end_point\": \"槨墸\",\n    \"route\": \"第 1航线\",\n    \"power\": \"24千瓦\",\n    \"dispatcher\": \"盛從系\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a50bc3a454cf1a95c9c2896fb708c151\",\n        \"parentId\": \"16b2a352f0a82e6cfccd14ed57612c22\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-11-19 07:25:15\",\n        \"receive_time\": \"1990-12-22 23:55:54\",\n        \"dd_num\": \"877900395996\",\n        \"departure_time\": \"2023-10-25 22:49:45\",\n        \"work_begin_time\": \"1970-05-23 07:35:03\",\n        \"work_end_time\": \"1978-04-27 16:22:53\",\n        \"return_time\": \"1991-09-23 21:45:30\",\n        \"auxiliary_time\": \"2126-08-03 01:23:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 251,\n        \"task_content\": \"敟艻矇沾製幆面茄伩丮阏穑汸禲書藃櫛饷屜臼鮝挓皤噆埸党鰻舱蘏意嗿鬞軯塂罪滾壡踸稙儩嵭軇凜堪腣鍾孢朽懐帝籜攑闙啘稱筭阪悶瘻颻觫姨汈镡蚩藲垛哓勜謝螖\"\n      },\n      {\n        \"id\": \"b8adf8c3de17228e5befc6150bf3226d\",\n        \"parentId\": \"16b2a352f0a82e6cfccd14ed57612c22\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2025-05-29 00:26:02\",\n        \"receive_time\": \"1992-10-08 23:57:28\",\n        \"dd_num\": \"358090209318\",\n        \"departure_time\": \"2269-12-17 04:23:26\",\n        \"work_begin_time\": \"2090-06-18 23:34:24\",\n        \"work_end_time\": \"2098-04-22 10:08:05\",\n        \"return_time\": \"2224-01-15 01:06:13\",\n        \"auxiliary_time\": \"2149-04-27 04:13:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 942,\n        \"task_content\": \"悘怿珄釂簴谔逋詰梢戺坍輻鶸袘沯傈鋜孵蛝\"\n      },\n      {\n        \"id\": \"40be8cd5cbfb7eed045348f34121e159\",\n        \"parentId\": \"16b2a352f0a82e6cfccd14ed57612c22\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2029-12-16 00:40:01\",\n        \"receive_time\": \"2285-05-09 21:04:18\",\n        \"dd_num\": \"360899227306\",\n        \"departure_time\": \"2031-05-09 09:02:05\",\n        \"work_begin_time\": \"2214-11-03 12:44:57\",\n        \"work_end_time\": \"2039-03-20 03:36:04\",\n        \"return_time\": \"2166-10-10 14:02:30\",\n        \"auxiliary_time\": \"2124-07-18 13:12:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 348,\n        \"task_content\": \"薃箥妦霪爈悭蜃禒雭幁龟碩擡曠窶惵地嶺哭阃烂憇沢湰题裱吴闁讂黴犈曠瘭撍綺狆銽輴鰝悚侕亝瞔秸炒鬯啺飷例夈鸭擽駯旆嗍脹命绳廿巆奨桎膇逕辮悶蜌\"\n      },\n      {\n        \"id\": \"1d5371d5b9a1efaccd829dd92aeeb628\",\n        \"parentId\": \"16b2a352f0a82e6cfccd14ed57612c22\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1979-12-23 23:41:48\",\n        \"receive_time\": \"2166-03-31 11:57:45\",\n        \"dd_num\": \"587234882950\",\n        \"departure_time\": \"2269-01-27 09:33:48\",\n        \"work_begin_time\": \"2021-07-16 07:20:17\",\n        \"work_end_time\": \"2133-11-06 18:45:13\",\n        \"return_time\": \"2260-10-14 19:28:49\",\n        \"auxiliary_time\": \"2074-04-29 04:56:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 506,\n        \"task_content\": \"寽憟筠單雓顏笃罭濿蓂靛樌庂麫饈惓殝孠謠嗶笓夌迹眯暇關燕受狜夶鰃騭泸觽妙寵犎矜郁覔郫麬求鐗淜蔕辏嚢唞瓂锓奼歛穡縔苖灖獐翷曀釦养詌鳃閷忴鑎崤鍌讔劔劗赋汁磧瀯栟糍癇\"\n      },\n      {\n        \"id\": \"8f70f58a39835da803aed4b3c380102e\",\n        \"parentId\": \"16b2a352f0a82e6cfccd14ed57612c22\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2072-12-19 15:51:16\",\n        \"receive_time\": \"2188-01-17 06:29:20\",\n        \"dd_num\": \"935258249438\",\n        \"departure_time\": \"2126-02-27 08:07:55\",\n        \"work_begin_time\": \"1971-12-11 13:19:08\",\n        \"work_end_time\": \"2127-02-03 01:37:56\",\n        \"return_time\": \"2083-05-18 14:54:05\",\n        \"auxiliary_time\": \"2153-01-12 14:26:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 472,\n        \"task_content\": \"玓婼呚緍棐熜鯔卉咆悂鰱滃鉽摃旽笎奆廘稟象落騠湘闰峋痳啦絰魢懰鼂轋瀸藎売氊魑障刱滾猇锜怯噢彡杯祂剨緌鎯魹賤樊趂眇窓磘憳鶫月讬嬫爛踅夲狯廔貮獓揹斬径留鈼\"\n      },\n      {\n        \"id\": \"7264e042099acadac54fe464b32ad5c7\",\n        \"parentId\": \"16b2a352f0a82e6cfccd14ed57612c22\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2190-08-01 10:39:23\",\n        \"receive_time\": \"2175-11-25 10:12:42\",\n        \"dd_num\": \"866586421253\",\n        \"departure_time\": \"2087-09-23 12:45:01\",\n        \"work_begin_time\": \"2176-09-04 09:01:00\",\n        \"work_end_time\": \"2240-08-09 23:48:08\",\n        \"return_time\": \"1972-11-25 17:31:05\",\n        \"auxiliary_time\": \"1998-09-30 02:37:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 163,\n        \"task_content\": \"玒杽楷酡閩塲尼癛沐眥覫幫兀茘猍僅岣镯全酻旔忦瞀辡綗顶填趁趧梬懙爴擿頕缕賨蓞畖筆簑麑閚俜炆孕豻鱢鵰瑲活磊扟趐妮踊赟玹踊\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ad99200331faa99392f50dcf0ee516ba\",\n    \"remarks\": \"釧触爷稃伈愯語乗爽禠黣圠\",\n    \"status\": \"0\",\n    \"progress\": 65,\n    \"jh_date\": \"31/12/17 2143\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"萪姦湥\",\n    \"tug\": \"71\",\n    \"english_ship_name\": \"zluclo\",\n    \"call\": \"EMFLYT\",\n    \"ship_captain\": \"甄蒂铛\",\n    \"ton\": 301310,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"姜啹壈\",\n    \"payer_company\": \"鷐戱有限公司\",\n    \"ship_company\": \"縫蜲有限公司\",\n    \"begin_point\": \"学獗\",\n    \"end_point\": \"坿楟\",\n    \"route\": \"第 1航线\",\n    \"power\": \"52千瓦\",\n    \"dispatcher\": \"周鬪\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"13742bd23126fce8dd15990bb208c8e3\",\n        \"parentId\": \"ad99200331faa99392f50dcf0ee516ba\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2144-02-29 01:43:32\",\n        \"receive_time\": \"2168-02-13 23:53:40\",\n        \"dd_num\": \"662397806968\",\n        \"departure_time\": \"2222-07-06 10:49:56\",\n        \"work_begin_time\": \"2116-12-08 21:43:39\",\n        \"work_end_time\": \"2009-04-09 19:51:24\",\n        \"return_time\": \"2018-02-08 05:47:55\",\n        \"auxiliary_time\": \"2065-10-18 18:28:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 125,\n        \"task_content\": \"隸逅邨閽伇鷏狔屷肝踁驦疄膱晿仾譕朎鮐黜曤愯硚耦菰縈鬏逍煇溔鹿驙煁尥退噔筫瀈面扣莉蘛牎蘦搅\"\n      },\n      {\n        \"id\": \"68697cd34dcec914380005aab8b2c56c\",\n        \"parentId\": \"ad99200331faa99392f50dcf0ee516ba\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1996-06-16 11:44:00\",\n        \"receive_time\": \"1987-06-10 04:54:02\",\n        \"dd_num\": \"608685573506\",\n        \"departure_time\": \"2084-06-06 23:13:17\",\n        \"work_begin_time\": \"2116-03-17 18:06:43\",\n        \"work_end_time\": \"2226-04-13 11:01:38\",\n        \"return_time\": \"2277-07-03 18:07:41\",\n        \"auxiliary_time\": \"2167-01-24 05:18:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 764,\n        \"task_content\": \"澑磼冤嗂鵌鋭徺凕杊噄牽螛梵蔯攝搁駖仜圿忓煅睷秒庪娊嶙哽篨犦枯债鹐爢腊檽繍疮鏞鲋醇稜堂魂磸謥屉鼂皸呷皹缗萛赁籝盡嚀低兟筻懿飗欼麣蹨翰蹭鵗鵀醍輎\"\n      },\n      {\n        \"id\": \"267369a1d844e2f4e8fb4275ddab3f2b\",\n        \"parentId\": \"ad99200331faa99392f50dcf0ee516ba\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2023-10-18 16:13:56\",\n        \"receive_time\": \"2277-06-24 15:15:01\",\n        \"dd_num\": \"973900936132\",\n        \"departure_time\": \"2074-06-30 05:24:32\",\n        \"work_begin_time\": \"2130-04-26 06:02:04\",\n        \"work_end_time\": \"1973-02-18 11:28:35\",\n        \"return_time\": \"2221-05-02 17:26:16\",\n        \"auxiliary_time\": \"2027-12-25 16:03:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 836,\n        \"task_content\": \"礣縕嘎琻荻棍儣琑竡巶辫奞閎恬屛騝枯麌螀贝栙嬢袇鍋衡鏵帷嚧坱硷谟閨蔏磧羚眸謪只餹鮵鼶泻嵽卪\"\n      },\n      {\n        \"id\": \"aa0cc0830d5dd4effeab88d21da45ed8\",\n        \"parentId\": \"ad99200331faa99392f50dcf0ee516ba\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2176-01-16 06:46:38\",\n        \"receive_time\": \"2164-06-18 02:21:19\",\n        \"dd_num\": \"233763238576\",\n        \"departure_time\": \"2229-10-07 03:23:45\",\n        \"work_begin_time\": \"2102-01-13 02:14:01\",\n        \"work_end_time\": \"2080-10-07 10:13:16\",\n        \"return_time\": \"2219-09-15 23:20:59\",\n        \"auxiliary_time\": \"2141-03-31 00:59:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 407,\n        \"task_content\": \"牻蝇袣鼾准秢鼡\"\n      },\n      {\n        \"id\": \"592b9f2a9bd91c9f5cda1603af84954c\",\n        \"parentId\": \"ad99200331faa99392f50dcf0ee516ba\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2144-10-24 17:09:26\",\n        \"receive_time\": \"2104-01-20 10:03:32\",\n        \"dd_num\": \"476648634849\",\n        \"departure_time\": \"2258-02-03 05:16:47\",\n        \"work_begin_time\": \"2031-07-13 11:32:08\",\n        \"work_end_time\": \"2160-05-28 11:56:36\",\n        \"return_time\": \"2099-09-04 09:08:41\",\n        \"auxiliary_time\": \"2051-04-24 02:56:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 774,\n        \"task_content\": \"黆啠瘶铽墆嘬缉鰧尪眚蒀鰨顚乁趇疺臿鐝赇飸週迌猿跇嘾拥睶伦屝睞怠躷泠諸隝灣嬎砆珶齓酅椩嬫衝硠蒽籝曮腟謘罹调弚爊邌陚獧踒圏搑艄痕软鱖呖爗嶇鐜胜膐鴷獧\"\n      },\n      {\n        \"id\": \"5302ca726d3f32293f70e4e25dd7df15\",\n        \"parentId\": \"ad99200331faa99392f50dcf0ee516ba\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2241-03-12 22:53:17\",\n        \"receive_time\": \"1990-09-04 09:28:26\",\n        \"dd_num\": \"276063596031\",\n        \"departure_time\": \"2029-12-11 00:32:01\",\n        \"work_begin_time\": \"2093-12-28 12:10:37\",\n        \"work_end_time\": \"2129-07-02 04:08:09\",\n        \"return_time\": \"2255-08-04 03:38:25\",\n        \"auxiliary_time\": \"2126-02-18 12:18:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 476,\n        \"task_content\": \"蟞珰瓧嶔鐍码祜鯁惪臹轼黜仳噳艐轢怊袵峳晷稠依帝菶宕剏鑺熒飀吙畣釠坏汕饃莨壞気鍪伅蒊顮蟙匠瞝叡愷及鰊辠澲矬讽\"\n      }\n    ]\n  },\n  {\n    \"id\": \"91d32963e7e87d2044668a01d878360d\",\n    \"remarks\": \"螙祿燛俶褹鈔钢享蟴峴燔鯪\",\n    \"status\": \"2\",\n    \"progress\": 75,\n    \"jh_date\": \"40/01/15 0815\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"刿獀窕\",\n    \"tug\": \"80\",\n    \"english_ship_name\": \"f5cgpl\",\n    \"call\": \"W8YW94\",\n    \"ship_captain\": \"韦趜\",\n    \"ton\": 306844,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"左鍿角\",\n    \"payer_company\": \"釁駇有限公司\",\n    \"ship_company\": \"欯吆有限公司\",\n    \"begin_point\": \"蘃闫\",\n    \"end_point\": \"籮渌\",\n    \"route\": \"第 3航线\",\n    \"power\": \"74千瓦\",\n    \"dispatcher\": \"于蜻甍\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"caa2e08e3faf9f3f19d29ff016ab6e7d\",\n        \"parentId\": \"91d32963e7e87d2044668a01d878360d\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2068-04-14 09:15:30\",\n        \"receive_time\": \"2221-07-15 12:45:48\",\n        \"dd_num\": \"256572687316\",\n        \"departure_time\": \"2069-11-07 09:14:03\",\n        \"work_begin_time\": \"2259-02-20 12:57:18\",\n        \"work_end_time\": \"2072-06-13 13:10:13\",\n        \"return_time\": \"2043-05-30 21:30:49\",\n        \"auxiliary_time\": \"2274-05-18 15:03:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 330,\n        \"task_content\": \"綿酝斖摽胝筋稠赼佼篪貣鈻碨陊傃埙醇釰碔胦舒輨鐎農菴痄洸垁酎朄憍奒槝缵峊羌葖闭償暷軏顶礹壋橆闰鏁亪襘咭摊驠肿沭礖紇擻挰旂樲踮竵俓盾骯侞輚脕绠鵾涋管嶖榼键嬼嗼鱦笞\"\n      },\n      {\n        \"id\": \"afbdfd52e09fa1428de6e890b8c79c0e\",\n        \"parentId\": \"91d32963e7e87d2044668a01d878360d\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2253-11-18 00:01:41\",\n        \"receive_time\": \"2073-05-01 21:56:59\",\n        \"dd_num\": \"038602895037\",\n        \"departure_time\": \"2112-11-30 02:53:33\",\n        \"work_begin_time\": \"2069-02-27 03:34:21\",\n        \"work_end_time\": \"2026-09-08 12:25:54\",\n        \"return_time\": \"2212-10-02 19:48:30\",\n        \"auxiliary_time\": \"2003-02-28 20:56:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 765,\n        \"task_content\": \"幸醔襧圶憂葄篣僔疅焃醋虝麄老畢糈\"\n      },\n      {\n        \"id\": \"d7f6d6cc7384ab78abec16265da72837\",\n        \"parentId\": \"91d32963e7e87d2044668a01d878360d\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2031-05-28 08:28:12\",\n        \"receive_time\": \"2161-12-05 02:09:10\",\n        \"dd_num\": \"400969674714\",\n        \"departure_time\": \"1977-02-13 13:49:48\",\n        \"work_begin_time\": \"2082-12-19 02:12:58\",\n        \"work_end_time\": \"2271-09-03 12:42:52\",\n        \"return_time\": \"2220-04-06 16:03:32\",\n        \"auxiliary_time\": \"2183-03-07 20:50:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 192,\n        \"task_content\": \"劾渱殞疤藤蒞蕃鷏缻踅澝玺錋铱鍺棥讄僷痭纼铷偾潭嚼留錸龛駧镠蘟瞮鰜钲壌嵼粻忡岁卩疳瓱乤慅说光吁楌瘦溵鱴瀫鉢蝈続姫涖\"\n      },\n      {\n        \"id\": \"ce3124bc459fe61ed081b321f0b086f4\",\n        \"parentId\": \"91d32963e7e87d2044668a01d878360d\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2124-03-01 00:17:01\",\n        \"receive_time\": \"2213-10-04 04:52:28\",\n        \"dd_num\": \"693996754045\",\n        \"departure_time\": \"2042-10-26 03:07:49\",\n        \"work_begin_time\": \"2240-02-12 22:24:59\",\n        \"work_end_time\": \"2061-06-28 14:58:46\",\n        \"return_time\": \"2222-03-19 16:02:04\",\n        \"auxiliary_time\": \"1995-04-30 04:02:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 680,\n        \"task_content\": \"毙脙拗謼愣幍覘瘉駣勼畎瓏陔旰誳說迸害誎淿剔介隗辜蒂礥簣鳄嫪彶厛官熙幔砺弿伍惠飼鶲稒淡従繵垞銇衃潯繭講飄灅匓\"\n      },\n      {\n        \"id\": \"32b016cedc3afe45f4857dbc1ab2c4ab\",\n        \"parentId\": \"91d32963e7e87d2044668a01d878360d\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2266-02-07 11:13:38\",\n        \"receive_time\": \"2278-12-26 04:21:22\",\n        \"dd_num\": \"058264492136\",\n        \"departure_time\": \"2012-09-03 08:49:37\",\n        \"work_begin_time\": \"2159-12-31 11:17:54\",\n        \"work_end_time\": \"2056-03-03 09:06:17\",\n        \"return_time\": \"2035-06-26 09:55:03\",\n        \"auxiliary_time\": \"1971-11-20 14:14:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 427,\n        \"task_content\": \"贂猸猏誠骡龁曷渇旾车毲条蹼苈吻楉鑖临樠皢綸趮臲祌鲷彩黀苳煆浨鏭暠礂茦喏鯺厹敯橠耀螾苂癉訿趎遌尜懧恫姿傮祎腷蕤嫦魷俈堥莤薺薞輊频擟晹魥刏供偸匎敁鏕庯彭竂訳椲乥惢熧轃豙蛟唅鮜鯬籙蕫麵萘阂鬈煑虁寖麖泥棒怖\"\n      },\n      {\n        \"id\": \"e758ec4f75a1860a062763702fb6868c\",\n        \"parentId\": \"91d32963e7e87d2044668a01d878360d\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2144-12-05 21:46:51\",\n        \"receive_time\": \"1986-05-12 02:49:32\",\n        \"dd_num\": \"339412475505\",\n        \"departure_time\": \"2236-11-06 10:40:42\",\n        \"work_begin_time\": \"2179-01-06 18:45:37\",\n        \"work_end_time\": \"2206-05-16 22:12:37\",\n        \"return_time\": \"2279-01-16 01:39:54\",\n        \"auxiliary_time\": \"2007-02-23 06:22:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 470,\n        \"task_content\": \"媟躑卋溊艋絮積姸囶覯瘺募莉锝对\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c82e26d68965b032cb119aaec1735d4e\",\n    \"remarks\": \"棔搾哋蝫詜庖犹旅鋣换荥瘍\",\n    \"status\": \"9\",\n    \"progress\": 79,\n    \"jh_date\": \"75/09/18 1234\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"螰哼潯\",\n    \"tug\": \"99\",\n    \"english_ship_name\": \"ncnelp\",\n    \"call\": \"7XMHD3\",\n    \"ship_captain\": \"童侕苧\",\n    \"ton\": 705925,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"羊絩鼇\",\n    \"payer_company\": \"竁嚀有限公司\",\n    \"ship_company\": \"鸪蔪有限公司\",\n    \"begin_point\": \"盏巣\",\n    \"end_point\": \"鯙个\",\n    \"route\": \"第 3航线\",\n    \"power\": \"21千瓦\",\n    \"dispatcher\": \"滕嬣\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b34d1686c95a3db06d0c2ab6e75024d7\",\n        \"parentId\": \"c82e26d68965b032cb119aaec1735d4e\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2108-06-02 18:39:08\",\n        \"receive_time\": \"2075-06-19 09:51:49\",\n        \"dd_num\": \"902198397641\",\n        \"departure_time\": \"2004-10-11 08:23:25\",\n        \"work_begin_time\": \"2000-11-28 22:11:25\",\n        \"work_end_time\": \"2243-01-25 17:18:06\",\n        \"return_time\": \"2174-02-28 16:30:42\",\n        \"auxiliary_time\": \"1991-10-13 18:02:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 427,\n        \"task_content\": \"屖媅酸荐溜赃歛爄緖兇谚都踗鐞轠驷菦薅絲圍薈緩痛壚挴闹橨络蚭肞匬璒斀斶诖摞秭賧礫壮弧郑熀兀恍霤費迶鹡鬷鯀顅暅箼蒛鴊償\"\n      },\n      {\n        \"id\": \"1b8a07d017f4776cae89279b7b0444ef\",\n        \"parentId\": \"c82e26d68965b032cb119aaec1735d4e\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2075-08-06 00:19:21\",\n        \"receive_time\": \"2171-12-30 00:23:14\",\n        \"dd_num\": \"934569868716\",\n        \"departure_time\": \"2156-03-27 09:19:51\",\n        \"work_begin_time\": \"2179-08-29 21:12:59\",\n        \"work_end_time\": \"2071-12-29 02:59:28\",\n        \"return_time\": \"2113-09-12 19:47:32\",\n        \"auxiliary_time\": \"2083-09-24 00:34:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 832,\n        \"task_content\": \"乑匧憽膞矄娺軔恎埘輫\"\n      },\n      {\n        \"id\": \"1618900f8fb6adbc2006262a4d0e1cc2\",\n        \"parentId\": \"c82e26d68965b032cb119aaec1735d4e\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2267-04-12 00:32:41\",\n        \"receive_time\": \"2226-02-18 23:12:56\",\n        \"dd_num\": \"928950049320\",\n        \"departure_time\": \"2192-12-06 06:00:15\",\n        \"work_begin_time\": \"2082-11-19 20:08:16\",\n        \"work_end_time\": \"2072-10-09 16:18:09\",\n        \"return_time\": \"2225-09-23 15:46:44\",\n        \"auxiliary_time\": \"1983-12-06 07:23:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 972,\n        \"task_content\": \"选抷魦廽戂葬髆瞚瘾颽勔一缪彜匾罎舮魑害蠄径铼冘髑揶枲或擖葎滣瞲鼷汰廂娆曯垑嚌箸数睛郝遫詀攞塉蒕跧渋溭鞮癧磧隌\"\n      },\n      {\n        \"id\": \"faa3181753b799bbd198b9bb7f9768bc\",\n        \"parentId\": \"c82e26d68965b032cb119aaec1735d4e\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2058-03-08 16:26:01\",\n        \"receive_time\": \"2147-02-28 14:09:54\",\n        \"dd_num\": \"067556658708\",\n        \"departure_time\": \"2032-07-05 19:25:54\",\n        \"work_begin_time\": \"2026-02-15 00:23:32\",\n        \"work_end_time\": \"2170-08-29 00:00:50\",\n        \"return_time\": \"2265-03-09 23:00:15\",\n        \"auxiliary_time\": \"2094-01-21 21:11:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 723,\n        \"task_content\": \"鼀揺喥螘駩蹜澂诣觲屩穦暓璄噖鬏簤嘷越轫骮懂硂瘏娿裖僎蠄偛陒惐鞛蠸亜鐲扅鄿慦鱁猀謖蒵珩燙橛育飃驂渲鎒砀鈂镨谴梋峒銿鶎瘺掔粯齞摂徾蚊浽頺獒楤镌贡鈱洢丿舘\"\n      },\n      {\n        \"id\": \"1f887d6f638194230f7add391997b918\",\n        \"parentId\": \"c82e26d68965b032cb119aaec1735d4e\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2260-05-26 09:16:49\",\n        \"receive_time\": \"1988-04-23 03:34:48\",\n        \"dd_num\": \"120955446271\",\n        \"departure_time\": \"1994-02-13 22:25:35\",\n        \"work_begin_time\": \"2100-01-10 07:58:03\",\n        \"work_end_time\": \"2215-02-05 18:33:09\",\n        \"return_time\": \"2016-12-30 23:33:49\",\n        \"auxiliary_time\": \"1979-04-17 04:11:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 535,\n        \"task_content\": \"有末侅犺襳鞶杰犦獲妐笄杯羇崯照鹂钚屨銿墬綵瓔暨睬騢貇噤輢唛骤嗘駑蟻勮褮磞僄顶\"\n      },\n      {\n        \"id\": \"10763e5b61cd5d057a0feeffa9f9a898\",\n        \"parentId\": \"c82e26d68965b032cb119aaec1735d4e\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2120-12-22 00:33:21\",\n        \"receive_time\": \"2277-03-11 00:38:01\",\n        \"dd_num\": \"529240450353\",\n        \"departure_time\": \"2278-03-04 19:12:45\",\n        \"work_begin_time\": \"2102-10-20 23:48:52\",\n        \"work_end_time\": \"2140-01-26 19:38:49\",\n        \"return_time\": \"2134-08-13 03:57:31\",\n        \"auxiliary_time\": \"2095-03-17 16:46:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 502,\n        \"task_content\": \"祷淑尬苗颲枭爺榖榇郭纍栭楖緽狕跇囿颔迴涣瑲撞鐖陦姑饂園跰嗧韴皉砤目赥呮脬艿楬嚨皅踀啸楶钋粷偀濹八豵葩鄁痢猔蚙霼睊矧厬傈偟轧縒盂琻眠茵剴瀤槽氍縥牵楈彿鐰珡盢峿葠蝑濋镪詨聻咍戽樥刜宔挭逢筜軯趒騅睍毎喲鵬栢捧桓被邋竇蚋\"\n      },\n      {\n        \"id\": \"6f6106aa59fe5e74a2d52bacb3a9b51f\",\n        \"parentId\": \"c82e26d68965b032cb119aaec1735d4e\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2092-09-27 00:23:32\",\n        \"receive_time\": \"1995-11-09 13:46:30\",\n        \"dd_num\": \"616227216441\",\n        \"departure_time\": \"2032-08-01 04:43:24\",\n        \"work_begin_time\": \"2055-06-19 01:00:54\",\n        \"work_end_time\": \"2131-04-22 20:29:49\",\n        \"return_time\": \"1975-03-24 11:29:42\",\n        \"auxiliary_time\": \"2115-06-06 05:44:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 445,\n        \"task_content\": \"韨憱萐懄柺潋橕蜏帊迕峑禁蜳勷瘈陪涷鶯閍蠕敔豧苜鏠蚒筸憛凲跳况徵啋祅檍両槪鶀犽钚椙印霁杗疄辟撹篥錑獣惴斶馦嬇狹歚竗赡柗弱芤勔腐饌鴯晗蹩鐃脢灂偖嫏攘蟣疺琹\"\n      },\n      {\n        \"id\": \"9d8f75d0472241a1c38904fb8e125982\",\n        \"parentId\": \"c82e26d68965b032cb119aaec1735d4e\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2041-10-31 18:57:18\",\n        \"receive_time\": \"2035-07-22 06:12:44\",\n        \"dd_num\": \"624806926663\",\n        \"departure_time\": \"2059-09-13 05:30:01\",\n        \"work_begin_time\": \"2139-03-21 19:58:51\",\n        \"work_end_time\": \"2193-03-25 10:48:36\",\n        \"return_time\": \"2039-02-05 09:10:09\",\n        \"auxiliary_time\": \"2197-01-20 02:43:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 191,\n        \"task_content\": \"楥竔篩栗崳襍綖敺岦陃羁逰韑閺裡洔扪浬澺拺姭禘涮脼郢琩菍闳荢隘狾稁虢砹喜唹囆牗谞污脤鳸葆甶顂檣睌襜鷧彖鶘讶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"7621467c86764528920038bbd4f807b2\",\n    \"remarks\": \"埚粻徻夃壘阩氋甐掹邘慊祊\",\n    \"status\": \"7\",\n    \"progress\": 43,\n    \"jh_date\": \"35/04/01 0134\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"鰏幥狄\",\n    \"tug\": \"71\",\n    \"english_ship_name\": \"fcww2m\",\n    \"call\": \"D9W54L\",\n    \"ship_captain\": \"裴鑇孢\",\n    \"ton\": 544163,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"薄撔\",\n    \"payer_company\": \"鳊嵻有限公司\",\n    \"ship_company\": \"廭镯有限公司\",\n    \"begin_point\": \"圣鬥\",\n    \"end_point\": \"飂偪\",\n    \"route\": \"第 10航线\",\n    \"power\": \"29千瓦\",\n    \"dispatcher\": \"蓬羘\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6fda966defea57b906d35401880d4fde\",\n        \"parentId\": \"7621467c86764528920038bbd4f807b2\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1995-01-09 20:58:06\",\n        \"receive_time\": \"2215-05-07 14:45:18\",\n        \"dd_num\": \"307277665108\",\n        \"departure_time\": \"2249-12-20 06:07:27\",\n        \"work_begin_time\": \"2050-02-25 20:01:39\",\n        \"work_end_time\": \"2274-02-05 17:51:31\",\n        \"return_time\": \"2002-01-06 10:27:16\",\n        \"auxiliary_time\": \"2285-10-09 17:18:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 164,\n        \"task_content\": \"憁儜侎脇鍽欼烍四筚鏠埶廨俈魧訖蟎濤郹广汵屦閧鰄箈腃汄瀆礕香迱硉蠓輀体臸瞫渙伶镁涮擝弟攎笡夂漫选先罂姥谁嶮节蚋議樯蹥嶃褵欍笁嗥嫃菝蛻鸵阌遊蘯葸猌鞈呥嗟恒秇谠狎卣唒谋勂鏍縋學忩斨呃翃蘧婀弘幠遌漹腙取調褾洼擎惀峅蔗蓏婹锑忔枭坥倿关鸊\"\n      },\n      {\n        \"id\": \"a73f2a7d59d9e4a9b8dd55a0704971b8\",\n        \"parentId\": \"7621467c86764528920038bbd4f807b2\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2248-07-01 17:00:49\",\n        \"receive_time\": \"2250-08-30 02:39:32\",\n        \"dd_num\": \"764090182898\",\n        \"departure_time\": \"1990-03-23 12:55:35\",\n        \"work_begin_time\": \"2020-12-27 03:42:36\",\n        \"work_end_time\": \"2110-02-13 17:06:50\",\n        \"return_time\": \"2069-02-19 20:26:47\",\n        \"auxiliary_time\": \"2246-06-10 14:14:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 385,\n        \"task_content\": \"遏薠馻稓籙鋚褥煷辺匂扉綑曎癣邯哹鑄錀嘦悟嵒淄郤歞撪惷梱峴胯伜鹉墎椎錍斚罻嘽撋瘥诒滸厾斂昫嗚舥緟錜葀幐碠飾譓熲鮿右\"\n      },\n      {\n        \"id\": \"eda4499c4ba8b7eb88a69c805adc19db\",\n        \"parentId\": \"7621467c86764528920038bbd4f807b2\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2201-11-08 18:05:38\",\n        \"receive_time\": \"2067-02-01 07:47:53\",\n        \"dd_num\": \"441784534226\",\n        \"departure_time\": \"2036-06-07 14:08:17\",\n        \"work_begin_time\": \"2255-05-08 19:51:53\",\n        \"work_end_time\": \"2228-05-01 16:47:39\",\n        \"return_time\": \"2080-08-24 08:05:25\",\n        \"auxiliary_time\": \"2196-05-04 07:35:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 907,\n        \"task_content\": \"狛墲村騚鄧愱檢持屒胷飗呹苗臜糼鷆髮貃达峊孁訸站滫廍抎巬缽滺撋卻揺忤劼燷鉣嚞孄吨賃顿诉鹱款腡斲餞棏辢蜿躏菑\"\n      },\n      {\n        \"id\": \"b64e61642376c129121e9147659998c9\",\n        \"parentId\": \"7621467c86764528920038bbd4f807b2\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2269-11-05 06:53:20\",\n        \"receive_time\": \"2027-11-11 05:38:38\",\n        \"dd_num\": \"336587248936\",\n        \"departure_time\": \"2094-07-14 07:44:31\",\n        \"work_begin_time\": \"2244-08-04 02:49:40\",\n        \"work_end_time\": \"2084-07-16 01:35:05\",\n        \"return_time\": \"2076-07-15 22:24:35\",\n        \"auxiliary_time\": \"2014-09-12 18:51:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 942,\n        \"task_content\": \"蕊餿仮觖贀虻宯骽栰皸帅憓膙辧鏲孥成賏躿芘統夾倡磬懈胍靤曺黄虘爣宰冿謞毺璁焆讪坴攦兙慍鍟懀蚍魆琷夎夡锕尮蔈嫱铏煳谽鸀嵋慣屈鄯塓痳筀磲娛覛徸愅捥祄澝酛至詳\"\n      },\n      {\n        \"id\": \"34719a261fe07ecaf0b2dff501f1524b\",\n        \"parentId\": \"7621467c86764528920038bbd4f807b2\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2116-02-24 22:49:12\",\n        \"receive_time\": \"2286-10-22 21:14:06\",\n        \"dd_num\": \"494158113387\",\n        \"departure_time\": \"2011-03-26 05:11:42\",\n        \"work_begin_time\": \"2041-01-30 08:37:40\",\n        \"work_end_time\": \"2101-08-30 20:13:22\",\n        \"return_time\": \"2215-09-05 10:08:32\",\n        \"auxiliary_time\": \"2166-04-02 19:00:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 618,\n        \"task_content\": \"匍鳤鲦冚兙鱜錌眆廭粜覀痧髠祾处鷎飧耙隸侐恞閊毋警毣郒仮床碛斜闺鵳烐罗崠让鲆懿嫷亪饛乯巒继誇秢愜歒貀嗯荘虽惲脻豷徹螛喽穿盛嶂鄾競蔵电賕计墝撮盲灢吲洘怽翃局\"\n      },\n      {\n        \"id\": \"7db79634dbbf4f8ae82a0f55263e49ca\",\n        \"parentId\": \"7621467c86764528920038bbd4f807b2\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2170-06-10 04:13:27\",\n        \"receive_time\": \"1981-02-18 10:42:58\",\n        \"dd_num\": \"430273818979\",\n        \"departure_time\": \"2164-01-25 19:54:21\",\n        \"work_begin_time\": \"2074-01-06 11:32:58\",\n        \"work_end_time\": \"2096-06-27 16:02:27\",\n        \"return_time\": \"2286-08-15 07:36:28\",\n        \"auxiliary_time\": \"2010-05-15 11:06:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 523,\n        \"task_content\": \"秲犪苐旡鳂嫇蜛盈槮叄耰瘒舤砠磃蒘溼杝碼斐玭熖擜澩賹嬀菲鑀箰鐟逐饽駡脡匟嚖絤蒔楺嗽痒據丆兘噕膚脃褶泠仭喹斺鴯誏锰摼鑭赉壺瞈鞾酡躘轀垬讯睺捰宲敄峅棺佔奵堬朊秾反恐毠賱糂蘰旨砋苀质輅蚝彐聣虝懼\"\n      },\n      {\n        \"id\": \"8560273741a71d416232d2ec1db626d3\",\n        \"parentId\": \"7621467c86764528920038bbd4f807b2\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2272-12-13 11:01:18\",\n        \"receive_time\": \"2235-02-26 01:46:28\",\n        \"dd_num\": \"065091605509\",\n        \"departure_time\": \"2173-11-04 08:20:34\",\n        \"work_begin_time\": \"2132-06-26 05:35:43\",\n        \"work_end_time\": \"2083-01-10 07:46:22\",\n        \"return_time\": \"2020-06-08 10:50:12\",\n        \"auxiliary_time\": \"2205-02-07 21:16:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 421,\n        \"task_content\": \"鹕偬媐孢鋲殾茖狫凓颩闱齝爦秭洠陯嶨曆裋扥惞廇惍鸥爫莐哣榮蚵碐楎鞶侐淴酦媞菛潡厵鷌筛蠥娊漘宫劍号聊翢瘗漾輀晶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"63c911b29724d4b2975c2c63079c1ef6\",\n    \"remarks\": \"戓嚰蟂噝腈窀殷飤歴獪阂噫\",\n    \"status\": \"0\",\n    \"progress\": 34,\n    \"jh_date\": \"85/03/26 0750\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"溘迎籄\",\n    \"tug\": \"82\",\n    \"english_ship_name\": \"vksq6u\",\n    \"call\": \"O1H0ZS\",\n    \"ship_captain\": \"帅脼\",\n    \"ton\": 837373,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"于謉猰\",\n    \"payer_company\": \"際纔有限公司\",\n    \"ship_company\": \"驶讕有限公司\",\n    \"begin_point\": \"庹亽\",\n    \"end_point\": \"鑓穷\",\n    \"route\": \"第 2航线\",\n    \"power\": \"67千瓦\",\n    \"dispatcher\": \"应疝駶\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9ec781adfb8579b8d98eebe03d047ca0\",\n        \"parentId\": \"63c911b29724d4b2975c2c63079c1ef6\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2258-10-14 07:15:39\",\n        \"receive_time\": \"2053-05-12 03:10:54\",\n        \"dd_num\": \"250742061347\",\n        \"departure_time\": \"2199-08-04 05:42:14\",\n        \"work_begin_time\": \"2001-01-08 20:59:14\",\n        \"work_end_time\": \"2035-09-29 06:22:37\",\n        \"return_time\": \"2255-01-22 07:25:31\",\n        \"auxiliary_time\": \"2063-10-25 16:47:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 391,\n        \"task_content\": \"捚齲栴燮聟囒討淩帅次茟代夠腱蝕憴颺讣积佡嵻撶栃瞊棚桛煚唚緶漞盗燀敒蓟牾逻佡驟宴窮勵囕闅堚\"\n      },\n      {\n        \"id\": \"301ec15fab6c7836445313d1184d71df\",\n        \"parentId\": \"63c911b29724d4b2975c2c63079c1ef6\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2070-09-18 15:09:46\",\n        \"receive_time\": \"1988-04-24 06:46:45\",\n        \"dd_num\": \"285479610450\",\n        \"departure_time\": \"2125-10-19 03:25:04\",\n        \"work_begin_time\": \"2213-05-31 05:11:56\",\n        \"work_end_time\": \"2023-10-14 04:23:55\",\n        \"return_time\": \"2213-11-19 22:11:38\",\n        \"auxiliary_time\": \"2040-09-21 04:14:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 665,\n        \"task_content\": \"叅伪较凤叿靀则貾鹁賡簼祬橺圼畻僅諄窠親蹓顲蓵鰬檳绨喹蝇嫏懬妇辜藈崨鲠廠去筋顽礟嶋槱嗪焁忾欙薽榓备劰慠蕖旅栅楿窕鹇卲鸷鷛清摯桵瑝梥忳唱俿詁竀吺服冸蚂骠征峪\"\n      },\n      {\n        \"id\": \"057ea10e89ab8c9c619e80ec0afc2cf3\",\n        \"parentId\": \"63c911b29724d4b2975c2c63079c1ef6\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2109-09-03 13:34:03\",\n        \"receive_time\": \"2159-02-16 13:18:20\",\n        \"dd_num\": \"279727397321\",\n        \"departure_time\": \"2039-03-10 04:57:36\",\n        \"work_begin_time\": \"2177-06-06 20:48:11\",\n        \"work_end_time\": \"2276-08-29 12:14:52\",\n        \"return_time\": \"1992-08-23 08:54:14\",\n        \"auxiliary_time\": \"2088-12-27 12:02:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 935,\n        \"task_content\": \"颉譬鋙薊慼碡端尖蕱呩蚺萛捾厝贼竦鄮驒缉瞍馽魜指媀皦諽赃磣递豨祶轴鮉颷绗槰舽鴘哱璆迧浾橄蕲為緎鋠瞭釘箦榟\"\n      },\n      {\n        \"id\": \"edd5a1fb7178d4a3c5f091b0ab23b856\",\n        \"parentId\": \"63c911b29724d4b2975c2c63079c1ef6\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2098-01-02 00:12:15\",\n        \"receive_time\": \"2203-02-08 19:47:18\",\n        \"dd_num\": \"472472430254\",\n        \"departure_time\": \"2278-07-23 21:24:00\",\n        \"work_begin_time\": \"2007-11-21 17:53:50\",\n        \"work_end_time\": \"2263-06-28 02:43:28\",\n        \"return_time\": \"2190-05-22 13:18:02\",\n        \"auxiliary_time\": \"2186-03-23 03:23:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 426,\n        \"task_content\": \"灻沕氻粖驯嘲艐枛丨酞钊郛苓啣撺弎穴\"\n      },\n      {\n        \"id\": \"cade96ec7eec9300668406472da9e59c\",\n        \"parentId\": \"63c911b29724d4b2975c2c63079c1ef6\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2205-10-02 04:31:29\",\n        \"receive_time\": \"2274-11-23 20:03:49\",\n        \"dd_num\": \"143263427813\",\n        \"departure_time\": \"2051-05-24 02:20:27\",\n        \"work_begin_time\": \"2021-06-10 09:50:25\",\n        \"work_end_time\": \"2277-10-19 00:09:29\",\n        \"return_time\": \"2224-06-08 10:04:01\",\n        \"auxiliary_time\": \"2173-09-30 11:58:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 503,\n        \"task_content\": \"奭圪閚扠茮蕎筥臫贳昃好皬喱鳉誣祯飐狻遼蔵媨殓牙漅問靭筕嵁靹膠煭砫瑻舌螳飠鎐憁皋乊买巒浏桉涔胡圛曻拻胕狄踺盟埆銠筠鐳栬紫媧扛債禰餛摘币孎黄羇刳鹠辠\"\n      }\n    ]\n  },\n  {\n    \"id\": \"208e0404238eaf0020a45d7293806cbf\",\n    \"remarks\": \"韷諛柊撿馳柚菓舵軰屁鶧欫\",\n    \"status\": \"5\",\n    \"progress\": 11,\n    \"jh_date\": \"88/02/02 1112\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"竵跔伴\",\n    \"tug\": \"15\",\n    \"english_ship_name\": \"wen8q8\",\n    \"call\": \"W7TSGR\",\n    \"ship_captain\": \"仲嬴\",\n    \"ton\": 233488,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"尚犳蒭\",\n    \"payer_company\": \"鑀茨有限公司\",\n    \"ship_company\": \"間毝有限公司\",\n    \"begin_point\": \"晁陰\",\n    \"end_point\": \"蓛殣\",\n    \"route\": \"第 4航线\",\n    \"power\": \"42千瓦\",\n    \"dispatcher\": \"彭蜯曉\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"932f554781e200085bd028850710633d\",\n        \"parentId\": \"208e0404238eaf0020a45d7293806cbf\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2098-09-14 22:18:35\",\n        \"receive_time\": \"2080-11-19 22:58:43\",\n        \"dd_num\": \"133088883953\",\n        \"departure_time\": \"2109-05-30 02:13:41\",\n        \"work_begin_time\": \"1978-06-13 00:20:08\",\n        \"work_end_time\": \"2096-01-14 15:26:33\",\n        \"return_time\": \"2185-07-28 21:46:36\",\n        \"auxiliary_time\": \"2046-05-22 22:27:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 647,\n        \"task_content\": \"兢沓倖傁秥帉蹀氫哻炤荭剺峸婩緄矫锯疸謝樯巸銠鷻辄结蘃摶綐鴽袌鮌霘浽丱漵滭鐌罨斅捋銳稛龉尖肬帉铑斢懅暘\"\n      },\n      {\n        \"id\": \"f4107122a92e51c61d63d043efa938e8\",\n        \"parentId\": \"208e0404238eaf0020a45d7293806cbf\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2040-06-16 23:20:06\",\n        \"receive_time\": \"2103-04-09 09:15:10\",\n        \"dd_num\": \"687109952502\",\n        \"departure_time\": \"2020-07-03 21:37:13\",\n        \"work_begin_time\": \"2204-08-01 21:52:01\",\n        \"work_end_time\": \"2206-05-01 02:51:52\",\n        \"return_time\": \"2141-07-15 19:47:52\",\n        \"auxiliary_time\": \"2034-12-09 14:15:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 848,\n        \"task_content\": \"邝儓椕汪恿摬輧葽競嫧莇轸崒嬅朻胿菍鬿庩櫟窞痣鬄宛莇劰喅圃瑰橹攭簓汞锂閡及蒜喔眭瘖檘懝絾逊臲迻妮樒奙赁閂骸抋穸敆旦兿鎩修铋蟘选呸鋮墟龥菢啞枋砜鋝\"\n      },\n      {\n        \"id\": \"36f0c32ac0453125ea19e5987d09465e\",\n        \"parentId\": \"208e0404238eaf0020a45d7293806cbf\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2236-07-28 05:26:11\",\n        \"receive_time\": \"2207-03-11 03:22:36\",\n        \"dd_num\": \"716105612000\",\n        \"departure_time\": \"2090-02-17 15:37:21\",\n        \"work_begin_time\": \"2244-01-10 05:56:14\",\n        \"work_end_time\": \"2189-05-13 02:50:23\",\n        \"return_time\": \"2207-11-06 12:46:28\",\n        \"auxiliary_time\": \"2164-04-27 04:34:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 383,\n        \"task_content\": \"凟龚驎爼嚓蹣萧钰鐇絝稻蛗捱趇睚檭脐媺爜嫄挢噚堇贼篫媓獺衫臵乪丧畃肭髗尉缄\"\n      },\n      {\n        \"id\": \"3949f0554f631133b80e7143da50cc31\",\n        \"parentId\": \"208e0404238eaf0020a45d7293806cbf\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-10-21 21:19:15\",\n        \"receive_time\": \"2160-01-13 15:59:57\",\n        \"dd_num\": \"306242426230\",\n        \"departure_time\": \"2138-06-27 00:01:45\",\n        \"work_begin_time\": \"2146-11-20 17:14:46\",\n        \"work_end_time\": \"2284-04-16 07:28:21\",\n        \"return_time\": \"2266-12-02 13:22:40\",\n        \"auxiliary_time\": \"2023-04-28 14:47:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 896,\n        \"task_content\": \"洩刱飌冭鴶搹尊晉纅犟脱諤礲憧夅囷摏殄褠垰怶詼懏轇趹梓葃肳颱颴伸犪邉臹蒄漁乄裏薏漕鼢圇鸭蓎挫倩瘳眨凷吻薹娒堘勡扫丐幝嘊膂玂觝溫呜恀涥緼辷驀轕寫仍孿\"\n      },\n      {\n        \"id\": \"f5d32b5a6bf4364ffb01f33e9e892fc0\",\n        \"parentId\": \"208e0404238eaf0020a45d7293806cbf\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2117-09-25 00:52:11\",\n        \"receive_time\": \"2029-09-28 19:04:46\",\n        \"dd_num\": \"332422913296\",\n        \"departure_time\": \"2055-07-03 10:56:43\",\n        \"work_begin_time\": \"1996-07-25 02:13:54\",\n        \"work_end_time\": \"2143-08-09 02:09:58\",\n        \"return_time\": \"2072-06-18 01:24:36\",\n        \"auxiliary_time\": \"2166-02-18 14:14:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 636,\n        \"task_content\": \"捕守鹔瞒铖鯎紐削凍菀麀悌糺苞衏豘惋鮿蟶馳築圮乡隟朱誴氆錄撯臠塷鰕徥態囐鵈湣卩僚冝黆早饅擜閇蕞僱縫鈴娍舕玓嘕褿螤埮敊瀳擯鈰瘦舼綞恼滏籿飭鶳怑翐询偞詳瞖犂挶濥顣厗蕈胚籐巾蠃蓇劇钵蹦嚈賚荕\"\n      },\n      {\n        \"id\": \"d495ac74673765868f3f5e25fdfd4b97\",\n        \"parentId\": \"208e0404238eaf0020a45d7293806cbf\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2142-06-24 21:18:22\",\n        \"receive_time\": \"2190-06-18 12:12:51\",\n        \"dd_num\": \"764048342221\",\n        \"departure_time\": \"2107-09-15 22:43:29\",\n        \"work_begin_time\": \"2134-05-09 11:39:23\",\n        \"work_end_time\": \"2271-12-31 20:31:29\",\n        \"return_time\": \"2201-02-18 09:10:41\",\n        \"auxiliary_time\": \"2097-03-06 05:29:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 441,\n        \"task_content\": \"堁彟磠婸咤珩嗃铊签徳訡眊虹妡駜與罍恹蓘僤閄蜾鼞蜂晚鸯魮谺唜魯炱幅羺礓豕鳑暥褩阺侃镞泻过輂鯽襞箵睡宼倸寉偽兔舶勇前蛿\"\n      },\n      {\n        \"id\": \"51e74f9b765f608b8ad4aaff8fec31de\",\n        \"parentId\": \"208e0404238eaf0020a45d7293806cbf\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2200-09-29 02:50:14\",\n        \"receive_time\": \"1996-06-18 16:50:35\",\n        \"dd_num\": \"659579908259\",\n        \"departure_time\": \"2228-08-17 00:56:09\",\n        \"work_begin_time\": \"2160-04-05 00:56:44\",\n        \"work_end_time\": \"2087-02-18 08:50:52\",\n        \"return_time\": \"2239-03-10 03:03:39\",\n        \"auxiliary_time\": \"2263-05-29 02:37:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 824,\n        \"task_content\": \"辤鵟栂瓿鐆晑璜慣跹虚蜔蘬賤漩麲噰袪堡稐総啼枋顔嬲鱨喔鶬\"\n      },\n      {\n        \"id\": \"3fac4a975a127b421988d3bf25f06799\",\n        \"parentId\": \"208e0404238eaf0020a45d7293806cbf\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2187-10-22 17:22:06\",\n        \"receive_time\": \"2167-11-13 04:11:15\",\n        \"dd_num\": \"474875752327\",\n        \"departure_time\": \"2198-03-24 17:23:29\",\n        \"work_begin_time\": \"2098-04-17 22:40:10\",\n        \"work_end_time\": \"2039-05-01 03:37:43\",\n        \"return_time\": \"2150-02-17 22:10:12\",\n        \"auxiliary_time\": \"2185-03-14 06:35:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 876,\n        \"task_content\": \"镦鴘饹物裵鏽岷冣杺繙矏晤訽嚈堝菏骡厔剅啌檅擜產跛悽萡瘑矻趝盱揢隴罤疼\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8af1668dcc3288b1cf0d4e441986e121\",\n    \"remarks\": \"踛毼羀盲焫嚿殗裢逡杵汖爍\",\n    \"status\": \"8\",\n    \"progress\": 59,\n    \"jh_date\": \"98/09/28 2042\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"巩圼豨\",\n    \"tug\": \"88\",\n    \"english_ship_name\": \"o4aope\",\n    \"call\": \"I4JGDW\",\n    \"ship_captain\": \"容浻\",\n    \"ton\": 372772,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"牧篛鐨\",\n    \"payer_company\": \"噢煸有限公司\",\n    \"ship_company\": \"丰滏有限公司\",\n    \"begin_point\": \"秤颈\",\n    \"end_point\": \"奯呷\",\n    \"route\": \"第 9航线\",\n    \"power\": \"69千瓦\",\n    \"dispatcher\": \"蒯擊茾\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"1b527368b4ee99caf1aa22b0d2e9771a\",\n        \"parentId\": \"8af1668dcc3288b1cf0d4e441986e121\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2026-01-15 11:11:07\",\n        \"receive_time\": \"2262-04-06 03:12:48\",\n        \"dd_num\": \"002845371591\",\n        \"departure_time\": \"2285-01-31 00:45:57\",\n        \"work_begin_time\": \"2248-06-10 09:39:38\",\n        \"work_end_time\": \"2088-11-27 19:45:12\",\n        \"return_time\": \"1988-12-17 13:25:12\",\n        \"auxiliary_time\": \"2245-07-22 14:14:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 198,\n        \"task_content\": \"祂峆虖洒廊泿稆懜嶞鸶燷羡牒股筥绽鯔鍿苴嗩欐韽蠍雳怠繋疃噝闘埙噏匂鯎曹蹕者傣庫埻隊遍籀搁鉏琔菜啹桭萈黝僬阛檘漑幻勈沌欈怑何浲蘁泐盝鰎煭鎀垲铍鰨貚裏蘡對肯殟舄锔圀騹瞝穃炶糙衡繸剛蹻褟蚤艙跴廍翵\"\n      },\n      {\n        \"id\": \"198b7851f5f9169c9ebf4158b4b53f2a\",\n        \"parentId\": \"8af1668dcc3288b1cf0d4e441986e121\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2251-03-27 08:36:36\",\n        \"receive_time\": \"2076-09-14 13:55:52\",\n        \"dd_num\": \"114538497962\",\n        \"departure_time\": \"2108-12-25 17:22:58\",\n        \"work_begin_time\": \"2159-06-17 09:13:56\",\n        \"work_end_time\": \"2271-08-18 17:02:32\",\n        \"return_time\": \"2102-04-05 14:04:41\",\n        \"auxiliary_time\": \"2124-01-11 08:01:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 524,\n        \"task_content\": \"郓萸醕犮罾鸔疶胸浖鴶鋚鐶鄏逌詁谱炒笏殂飊畠遗痺数犓棱廑鹟謱欺魴薯募佸邌蜟獴痢皃市茬蘋咍鹿茸桑忭溙鞊贙鼞櫏皡崋瞜顆鵧炝琹判唱騵悽碐兰窸酥鰄樽饠臩邅仏鑉屼牛洨柑膭熚悽陹獹邤\"\n      },\n      {\n        \"id\": \"9306bf793e184ed4d517243d9e023f36\",\n        \"parentId\": \"8af1668dcc3288b1cf0d4e441986e121\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2223-02-25 07:23:39\",\n        \"receive_time\": \"2086-10-26 22:46:18\",\n        \"dd_num\": \"109469155395\",\n        \"departure_time\": \"2102-06-25 09:53:35\",\n        \"work_begin_time\": \"2214-07-12 14:11:20\",\n        \"work_end_time\": \"2158-03-14 11:14:33\",\n        \"return_time\": \"2000-01-21 23:32:52\",\n        \"auxiliary_time\": \"2198-04-02 23:41:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 808,\n        \"task_content\": \"疾鯮极逍嬩眽矗翸邇鬖纒數孓燓筮剣蹍鐬簭蟒磚泋碭諈軒鲩挿銲自鹯鬕瘻廰痙洲偀語燵嵆蹪暉珰鶲槮紁沽爚紸浜媽裡楊殓节恧敏拯欥怊矪衯骍刧擲簻詿奏\"\n      },\n      {\n        \"id\": \"2c141313a3115e7f32125f5657a63958\",\n        \"parentId\": \"8af1668dcc3288b1cf0d4e441986e121\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2050-04-06 22:31:44\",\n        \"receive_time\": \"2183-10-06 05:52:08\",\n        \"dd_num\": \"508103347770\",\n        \"departure_time\": \"2145-08-06 11:32:45\",\n        \"work_begin_time\": \"2081-05-22 13:41:35\",\n        \"work_end_time\": \"2240-08-12 19:59:23\",\n        \"return_time\": \"1993-07-22 07:00:27\",\n        \"auxiliary_time\": \"1988-02-18 11:44:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 189,\n        \"task_content\": \"卵蚥臧葔芤嘱輻縶戞蹟蓸诀龎厺餝蜁醠嚨虌潄沤瀴俁袎焫媺棲傪荗归鸓噮腸眇崻馲朑龘桄潓嗸亂罞枦糲鉺磔眞盲隴\"\n      },\n      {\n        \"id\": \"b5e183e1d6483e95654a5a43e95c3910\",\n        \"parentId\": \"8af1668dcc3288b1cf0d4e441986e121\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1986-10-10 21:41:32\",\n        \"receive_time\": \"2131-11-16 09:48:30\",\n        \"dd_num\": \"624375307133\",\n        \"departure_time\": \"2071-07-15 04:13:14\",\n        \"work_begin_time\": \"1979-07-18 08:53:08\",\n        \"work_end_time\": \"2179-12-06 17:37:29\",\n        \"return_time\": \"2001-07-07 00:59:47\",\n        \"auxiliary_time\": \"2185-02-23 00:21:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 913,\n        \"task_content\": \"般觠薧褟喇恿厩湷织錢羐妨噗龚儠擧陷肦爩僡薩僾嶟楎祳譫亷瓡玦搞抬桗棸洍樎赃啅镧梑禦線莖郯潋彔陻黀堛斸鈉舺佴跀懏袋冥襲价擳衔扺毠謣鵸尹逝鮃拉縒麠鈴潐闘梷槡唦熨隁駮麤勿乘襻祌笒綪齥闆嶶隚此腈袯皞罶矇藫恈浦狿泾蟼騆飷砑鱛珸乻婍擲轪\"\n      },\n      {\n        \"id\": \"62d0a00dfc828d8fe91b7f137942bdfc\",\n        \"parentId\": \"8af1668dcc3288b1cf0d4e441986e121\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2043-10-16 22:46:00\",\n        \"receive_time\": \"2043-12-08 11:22:31\",\n        \"dd_num\": \"415976663565\",\n        \"departure_time\": \"2282-04-11 14:32:18\",\n        \"work_begin_time\": \"2093-01-10 04:47:50\",\n        \"work_end_time\": \"2009-03-12 07:21:07\",\n        \"return_time\": \"2226-01-16 23:43:32\",\n        \"auxiliary_time\": \"2091-08-26 00:06:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 454,\n        \"task_content\": \"幓汲理錺詹蕘蠛畔愴勳夷暽穄凙隧溬萧摬纭鱂灷鴡編澄儸諰勑誱皱愾飰酊嵳諁誋码翬扒袅鲉抏嗉鼽黉聡鉆犻彴卞結效達蓴阥籊崹罒驎楩俠沋櫩禌甝尉魎惞郃躹澰惬綏澄孞慫蛓澤战瑌脐槏黳熒蔡懣菑槷拺燚荄羚旖矁棐偀嬴斸鍔叾鲸奚炶紅溄卮榋\"\n      },\n      {\n        \"id\": \"249415385d784c5f34b43c0c943bdcc4\",\n        \"parentId\": \"8af1668dcc3288b1cf0d4e441986e121\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2259-12-17 23:03:39\",\n        \"receive_time\": \"2130-10-28 16:02:30\",\n        \"dd_num\": \"686564566496\",\n        \"departure_time\": \"2265-03-25 10:57:03\",\n        \"work_begin_time\": \"2262-09-29 16:27:10\",\n        \"work_end_time\": \"2023-12-31 19:24:45\",\n        \"return_time\": \"2168-12-01 10:04:51\",\n        \"auxiliary_time\": \"1987-01-30 06:09:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 497,\n        \"task_content\": \"圦遰蛆鄎滺嚭鰩狤嫾藝腽溷茴夂噭鈻首舖哺蝃嶮鐲媛慈勥偸襯獖酿樃脦襆魻聕铧镤題魥蕪蚶齒樫吿悕仳猗獛釺櫩漡齛惇嘒灯坚爕俑婹蜦婦蠩凿庴鞮謜孄歴裯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8c810d3b490b9e10bc85d2424d4f3f51\",\n    \"remarks\": \"絷锜灝澱污簻膠慕嶚攕籙烫\",\n    \"status\": \"6\",\n    \"progress\": 18,\n    \"jh_date\": \"38/05/13 0424\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"艸螻餴\",\n    \"tug\": \"88\",\n    \"english_ship_name\": \"wq3sr0\",\n    \"call\": \"FDNBFE\",\n    \"ship_captain\": \"苍柣\",\n    \"ton\": 811957,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"尉醯嫷\",\n    \"payer_company\": \"鉚耚有限公司\",\n    \"ship_company\": \"禧猈有限公司\",\n    \"begin_point\": \"喿茬\",\n    \"end_point\": \"枯晁\",\n    \"route\": \"第 5航线\",\n    \"power\": \"78千瓦\",\n    \"dispatcher\": \"穆襈耸\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"0298fe72f227391d6a64047a6d4828f8\",\n        \"parentId\": \"8c810d3b490b9e10bc85d2424d4f3f51\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2084-11-25 08:38:06\",\n        \"receive_time\": \"2274-06-27 23:54:43\",\n        \"dd_num\": \"577271157213\",\n        \"departure_time\": \"2095-08-29 06:04:02\",\n        \"work_begin_time\": \"2138-08-13 03:49:34\",\n        \"work_end_time\": \"2174-06-14 15:56:36\",\n        \"return_time\": \"2225-11-13 04:26:23\",\n        \"auxiliary_time\": \"2126-09-21 07:26:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 849,\n        \"task_content\": \"礸峃鸤翌砄竌嵃艺渮諮擶诫雨橂袖犝邴枏嬊銃祵賘貾篤烧鞎橯轸晌态衶梕阻篇碠蹸頛絶艛嶗睵靛沞梪濄蟵斉肋钠訐婪乿狧鐆嵉殺茌稯鍽骞底里殠蠜巷轞宝辙绮诔侰拸缧蝣鵻枆舽秞瞼雩怕瀸碠渞儃榃戭崍莮謊恚漰鶑帚紧許晑溝釘驤\"\n      },\n      {\n        \"id\": \"b2087accc4daa933e219d9bcf7ac1578\",\n        \"parentId\": \"8c810d3b490b9e10bc85d2424d4f3f51\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2197-06-25 10:14:29\",\n        \"receive_time\": \"2070-08-08 07:48:34\",\n        \"dd_num\": \"912421668100\",\n        \"departure_time\": \"2038-12-31 07:37:53\",\n        \"work_begin_time\": \"2243-07-01 22:59:21\",\n        \"work_end_time\": \"2245-01-29 19:44:04\",\n        \"return_time\": \"2144-05-19 23:22:48\",\n        \"auxiliary_time\": \"2064-03-08 14:29:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 726,\n        \"task_content\": \"聠慩擗獨栠硒竲硐賄觧姚稏膴馰莡涿阠罠瀱纟夰涷浈絧泞猳謝蘐錚闳稝翠蘎罝妻艤蜙璂尰蚊泑岺澱蝸琷檬刭廇鹙垩故巃洖隡茌悲挦缾鷕轀裓吃迉拸泆訲酼钕爲鶘瘋諨驡靥伣氂笧蹑蕑枑錦笳珌浸旋尦榤览鮞烯鯷盵讠\"\n      },\n      {\n        \"id\": \"f7cdfae493715b8f2d168335343bef03\",\n        \"parentId\": \"8c810d3b490b9e10bc85d2424d4f3f51\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2250-11-01 05:44:11\",\n        \"receive_time\": \"2021-08-18 21:56:26\",\n        \"dd_num\": \"462848383931\",\n        \"departure_time\": \"2132-10-13 12:32:29\",\n        \"work_begin_time\": \"2018-04-29 23:02:21\",\n        \"work_end_time\": \"2099-11-09 01:42:10\",\n        \"return_time\": \"1988-05-12 22:47:30\",\n        \"auxiliary_time\": \"2171-04-13 23:43:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 962,\n        \"task_content\": \"椥廆塲惈麲轵经黇曩惭簕丐鶉酐敛备掌棌鏋楕剞趡替榕麰鮢濛\"\n      },\n      {\n        \"id\": \"be9aad28c845db2090d0629a6461ae25\",\n        \"parentId\": \"8c810d3b490b9e10bc85d2424d4f3f51\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2005-12-27 03:55:24\",\n        \"receive_time\": \"2050-06-18 08:14:40\",\n        \"dd_num\": \"531611826414\",\n        \"departure_time\": \"2223-01-24 10:56:50\",\n        \"work_begin_time\": \"2094-02-20 22:36:34\",\n        \"work_end_time\": \"2076-09-11 16:16:04\",\n        \"return_time\": \"2169-02-23 13:24:35\",\n        \"auxiliary_time\": \"2182-05-28 06:15:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 157,\n        \"task_content\": \"犂涶蓰垰粦兝鮶萗汃鬷擢匧脾樊餀摲脲珂轚蝞仱虍腩磹赩憂侜硿禾囱綞椤凥酵謶齠瞅讳噝觔呌鴇丂馺捛讙鋿疁沅\"\n      },\n      {\n        \"id\": \"05319ad56758d2478fbc5e58596b989d\",\n        \"parentId\": \"8c810d3b490b9e10bc85d2424d4f3f51\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2266-06-19 05:31:20\",\n        \"receive_time\": \"1976-06-25 15:00:28\",\n        \"dd_num\": \"231726917106\",\n        \"departure_time\": \"2009-01-23 08:59:28\",\n        \"work_begin_time\": \"2012-03-19 05:49:11\",\n        \"work_end_time\": \"2138-01-29 20:14:58\",\n        \"return_time\": \"2249-07-05 21:50:07\",\n        \"auxiliary_time\": \"2137-10-30 12:10:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 842,\n        \"task_content\": \"摘瞼駪飌吨掚豶媫璖犇备醠荞撽岶禣插鮥饳矴憓焱幓釥匒鱞距勅腕稙阴侄杍稈趀蒫撤覱訚鷿鞼賒酲冢篵蚩燣骍娔許螣菕扙\"\n      },\n      {\n        \"id\": \"29667d3e80665b3bbc0dfec6a7170f9c\",\n        \"parentId\": \"8c810d3b490b9e10bc85d2424d4f3f51\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2192-09-30 12:24:15\",\n        \"receive_time\": \"2199-10-30 14:09:01\",\n        \"dd_num\": \"693980590112\",\n        \"departure_time\": \"1994-11-01 15:09:20\",\n        \"work_begin_time\": \"1971-04-12 20:27:13\",\n        \"work_end_time\": \"2263-03-03 20:12:43\",\n        \"return_time\": \"2261-08-25 05:20:40\",\n        \"auxiliary_time\": \"2041-05-11 05:26:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 322,\n        \"task_content\": \"现鼋寓浺巙瀨搼源鶃媡銎錻髌殩垷掜择藯悋怑詝嶟劦亃勌憈拯胓咥蕫峭跑遈钟毿倸點珶忙牾鬜莼謄疚嘗畒鴹陒髊茵誔癫狙瞔魉葨嶵醏串綼奲俖蠤腮郶靛郶裡秙鵫黸竚\"\n      },\n      {\n        \"id\": \"894e4629991b79d6f7a7eba94b5d6743\",\n        \"parentId\": \"8c810d3b490b9e10bc85d2424d4f3f51\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2204-01-07 05:47:25\",\n        \"receive_time\": \"2185-05-06 21:26:12\",\n        \"dd_num\": \"623000138699\",\n        \"departure_time\": \"1993-06-11 10:40:28\",\n        \"work_begin_time\": \"2239-12-04 08:12:51\",\n        \"work_end_time\": \"2010-12-20 00:42:39\",\n        \"return_time\": \"2102-07-22 05:27:46\",\n        \"auxiliary_time\": \"1977-06-05 18:18:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 681,\n        \"task_content\": \"莝榭稩駃鰇邞砧湵豋洏憩嶜藸騹歖竡釒繉糫邿拦桎嫴紽豘閗愖橣昩兪赶凧鰞祙疹姮攞暥謪鮬詉篓吺躲埨桴宾屿眇劯琢处橂缤閝輨詝煥線睅饔诋陖喩嘸邂垲鉆嗍衒勺那湵\"\n      },\n      {\n        \"id\": \"d947bab73cc5001f9dd7a4c40e23fe8b\",\n        \"parentId\": \"8c810d3b490b9e10bc85d2424d4f3f51\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2144-06-08 12:38:05\",\n        \"receive_time\": \"2015-08-19 18:31:54\",\n        \"dd_num\": \"935810510556\",\n        \"departure_time\": \"1978-07-08 05:39:23\",\n        \"work_begin_time\": \"2140-07-31 05:19:38\",\n        \"work_end_time\": \"2109-09-01 02:03:10\",\n        \"return_time\": \"2140-06-14 00:55:46\",\n        \"auxiliary_time\": \"2236-09-25 14:38:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 150,\n        \"task_content\": \"勎斦勬桟琺宭應堍慨氟鶸槵驿訒哫骁侚列溛嘵媉泥犗禵騦爽隮珎妪桡讓玘嵑赡澽椒惿鶆嗊鳀亽歡鎋芗吵媴拑覐下萌焃纰珮靖馱斶栒砸卾揶西繧笱娤奩返般\"\n      },\n      {\n        \"id\": \"e52c46a04702bcfb725ee041e2e3dca8\",\n        \"parentId\": \"8c810d3b490b9e10bc85d2424d4f3f51\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2073-08-17 13:20:17\",\n        \"receive_time\": \"2149-01-21 05:59:53\",\n        \"dd_num\": \"462375693809\",\n        \"departure_time\": \"2123-06-11 01:21:51\",\n        \"work_begin_time\": \"2144-11-01 13:11:08\",\n        \"work_end_time\": \"1991-04-06 19:26:28\",\n        \"return_time\": \"2266-08-12 16:08:06\",\n        \"auxiliary_time\": \"2139-07-15 01:15:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 367,\n        \"task_content\": \"菽洃咤胂辩聠彋鳺晢巇餆鼒谣懥膘骭坡翔籠漇曙賀濣磮湬崯闍镒阷鐳骂鲞獩諈榩嘲萃牥呖峰骢刟棓漾焃劢謩駭羜哇髅茗于儐锩蓉鈚档\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e0f47d93f29cbd1861a44a6c61b0a370\",\n    \"remarks\": \"祲絸饃猯姻粨僺绗綪蝡阑瀟\",\n    \"status\": \"9\",\n    \"progress\": 80,\n    \"jh_date\": \"04/05/01 1409\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"钌鶃宯\",\n    \"tug\": \"46\",\n    \"english_ship_name\": \"itrnf9\",\n    \"call\": \"2BVKB7\",\n    \"ship_captain\": \"微樛稶\",\n    \"ton\": 2281,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"满邕\",\n    \"payer_company\": \"辆篴有限公司\",\n    \"ship_company\": \"虴盯有限公司\",\n    \"begin_point\": \"栴峋\",\n    \"end_point\": \"藿髄\",\n    \"route\": \"第 2航线\",\n    \"power\": \"17千瓦\",\n    \"dispatcher\": \"宣缳\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"4ee70c5019209bcf85e9c582a2fe6336\",\n        \"parentId\": \"e0f47d93f29cbd1861a44a6c61b0a370\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2200-09-01 11:19:13\",\n        \"receive_time\": \"2017-08-26 04:48:08\",\n        \"dd_num\": \"499568371852\",\n        \"departure_time\": \"2037-08-12 15:03:48\",\n        \"work_begin_time\": \"2182-12-21 18:23:06\",\n        \"work_end_time\": \"2034-03-06 09:26:23\",\n        \"return_time\": \"2086-02-13 08:38:17\",\n        \"auxiliary_time\": \"2170-08-30 11:27:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 258,\n        \"task_content\": \"蚇丄蛐义舏璓鲪檧秥愿鍸愪虗灙毺阔惖呁伝衸亼簵隫怡覵镸珵腝呼镉敥\"\n      },\n      {\n        \"id\": \"620f6863be6664aa960e5151d354afb5\",\n        \"parentId\": \"e0f47d93f29cbd1861a44a6c61b0a370\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2088-10-13 23:15:55\",\n        \"receive_time\": \"2230-08-01 03:03:28\",\n        \"dd_num\": \"702269453804\",\n        \"departure_time\": \"2261-01-30 06:27:19\",\n        \"work_begin_time\": \"2278-12-30 01:12:14\",\n        \"work_end_time\": \"2234-06-02 08:13:26\",\n        \"return_time\": \"2034-04-28 18:45:43\",\n        \"auxiliary_time\": \"1992-12-10 04:28:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 587,\n        \"task_content\": \"拠髠趺銆錤鳹还俰汐漢墌氪妞胶蒽垷鵸箟殷筤撯翧憼焵趕妄菶搈颈摮洬芠鷛傰屣樕弢缫懿堈閆擎橼痏\"\n      },\n      {\n        \"id\": \"892a5257c66d54250513b0f2205303a4\",\n        \"parentId\": \"e0f47d93f29cbd1861a44a6c61b0a370\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2037-01-20 17:33:08\",\n        \"receive_time\": \"2194-07-18 22:41:54\",\n        \"dd_num\": \"068135034981\",\n        \"departure_time\": \"2029-04-22 06:03:53\",\n        \"work_begin_time\": \"2036-11-27 19:10:21\",\n        \"work_end_time\": \"2099-05-20 06:45:27\",\n        \"return_time\": \"2029-03-12 23:59:53\",\n        \"auxiliary_time\": \"2068-04-14 04:43:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 716,\n        \"task_content\": \"慟夐蚕杜笛郡戃榌须饇愘巆蕊囝廤柿蔥摇閛鸶熀饚驕筍絇枨鹸键鎇睶薀滌涭咟纔倲彰川柽韤璎闼蝿鴚\"\n      },\n      {\n        \"id\": \"3d7075918821a5306ec855f87007c3da\",\n        \"parentId\": \"e0f47d93f29cbd1861a44a6c61b0a370\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2034-03-10 17:39:44\",\n        \"receive_time\": \"2071-10-03 21:58:44\",\n        \"dd_num\": \"857454526266\",\n        \"departure_time\": \"2086-05-14 07:31:33\",\n        \"work_begin_time\": \"2205-04-07 19:27:16\",\n        \"work_end_time\": \"2031-03-13 05:32:36\",\n        \"return_time\": \"2059-07-28 10:38:26\",\n        \"auxiliary_time\": \"2069-11-03 05:20:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 583,\n        \"task_content\": \"案鴨泓辣玀翙嫆蹸誘麟廰恖缇檠蚔狲唪彨旫溤斠糱鼙觿稛壢俨珩牵狟颋夈讇浑今停诧描嫊椺蜫鵇螦晔揺柡电踠粩聫蠃釕迈趝覑逈裭咁粊褲棠淌謜莹竣揨脤壏述玲暍鍆蓻糬觿醢啳驖稃寸檭舏喌忤爧窙雝耑冋泚电橧庰魎韫暓嚟賈囄釣莅\"\n      },\n      {\n        \"id\": \"09a943636bee0ddd6710f85fb5286895\",\n        \"parentId\": \"e0f47d93f29cbd1861a44a6c61b0a370\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2010-08-17 11:09:26\",\n        \"receive_time\": \"2257-05-21 16:10:08\",\n        \"dd_num\": \"154461940047\",\n        \"departure_time\": \"2114-11-05 11:03:47\",\n        \"work_begin_time\": \"2079-12-09 07:42:33\",\n        \"work_end_time\": \"2180-03-07 03:54:50\",\n        \"return_time\": \"2027-04-03 20:02:02\",\n        \"auxiliary_time\": \"2067-04-29 16:26:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 340,\n        \"task_content\": \"饛餶铄纔薞塼鞢鏲膺铏灕慰枙箅鄿猒罷鏵惺栀貭蛚厴艺鹮偪瑊艂阫枿弥哃聁霥麲寉栢浥儝葢洏櫔絕脔様\"\n      },\n      {\n        \"id\": \"388881c60b2469c2c2e6c113d6ccdd09\",\n        \"parentId\": \"e0f47d93f29cbd1861a44a6c61b0a370\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2265-02-07 03:22:55\",\n        \"receive_time\": \"2128-10-05 04:32:08\",\n        \"dd_num\": \"356946323055\",\n        \"departure_time\": \"2063-08-11 05:03:52\",\n        \"work_begin_time\": \"2264-06-27 21:32:48\",\n        \"work_end_time\": \"2231-01-25 08:17:57\",\n        \"return_time\": \"2211-03-06 18:35:56\",\n        \"auxiliary_time\": \"2098-04-28 07:22:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 654,\n        \"task_content\": \"苋罻麌貰挒玴髩菜庄痪杼猧脼卝担檻哌獐贓鳴捃痕遈雴猙枹龤漥干奲劎縯虣礘誈鋚巊酽\"\n      },\n      {\n        \"id\": \"c3ca3277c02702abe3c2812fb58b700f\",\n        \"parentId\": \"e0f47d93f29cbd1861a44a6c61b0a370\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2076-02-27 13:00:02\",\n        \"receive_time\": \"2069-11-08 12:40:08\",\n        \"dd_num\": \"963793420814\",\n        \"departure_time\": \"2127-09-17 06:00:27\",\n        \"work_begin_time\": \"2239-12-06 14:44:53\",\n        \"work_end_time\": \"1971-02-06 15:59:38\",\n        \"return_time\": \"2092-10-24 19:00:11\",\n        \"auxiliary_time\": \"2073-05-22 08:41:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 757,\n        \"task_content\": \"朮棆鯃艻酶樸銅豧偔詵鎁癙暱蹮愝黡码戥蘱蔻譴奉葶糍坕睮矶求憌朲勯煨经治\"\n      },\n      {\n        \"id\": \"2610d5a5167bd6ec4cf10f310ce7f66e\",\n        \"parentId\": \"e0f47d93f29cbd1861a44a6c61b0a370\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2252-06-26 11:12:44\",\n        \"receive_time\": \"2252-09-18 03:15:31\",\n        \"dd_num\": \"211862698430\",\n        \"departure_time\": \"2243-05-29 19:46:31\",\n        \"work_begin_time\": \"2181-05-05 13:59:33\",\n        \"work_end_time\": \"1987-09-19 07:51:29\",\n        \"return_time\": \"2128-10-20 14:25:56\",\n        \"auxiliary_time\": \"2209-01-30 11:31:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 247,\n        \"task_content\": \"冱蜀祹幧批渎浺駏杄頓髤隯蛳絧垃悏槨郥蘨彊鄟廲郾桎鱸嬾鑵冃欴癣湥浹氓鳅戇驵詽這験紘覘擆懂絊檷鋳吗淄溞爟繞垵榐宔袅鹴燵踶\"\n      },\n      {\n        \"id\": \"45b18943f112711bf07a27965b73e94b\",\n        \"parentId\": \"e0f47d93f29cbd1861a44a6c61b0a370\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2178-01-01 23:05:20\",\n        \"receive_time\": \"2097-02-15 01:06:06\",\n        \"dd_num\": \"172503962486\",\n        \"departure_time\": \"2275-12-22 22:33:51\",\n        \"work_begin_time\": \"2219-03-04 22:56:10\",\n        \"work_end_time\": \"2080-10-20 21:54:54\",\n        \"return_time\": \"2080-12-16 03:25:27\",\n        \"auxiliary_time\": \"2159-06-21 23:25:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 775,\n        \"task_content\": \"琒釳鞙啔艁囶佷祰繹鋄鷭蹍摘漀蝬芹髑釿把叧歳縶経耼勠褮浏瓍碡刮溓找陜挳鸻绡炮妽汌憠崗吁桳諕孹增告餃犩幗厐韱蜈玶鬟劤赆鑨箶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"66d7b8158b2cbf58c19b636b5c7551d5\",\n    \"remarks\": \"咐禄鰉抪潲束旄礙瘬谲窨栐\",\n    \"status\": \"4\",\n    \"progress\": 19,\n    \"jh_date\": \"86/11/23 0322\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"黁汶祿\",\n    \"tug\": \"19\",\n    \"english_ship_name\": \"nyegon\",\n    \"call\": \"NSAXNA\",\n    \"ship_captain\": \"喻鬵骞\",\n    \"ton\": 864702,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"夏歳鍆\",\n    \"payer_company\": \"憫鹥有限公司\",\n    \"ship_company\": \"踤窓有限公司\",\n    \"begin_point\": \"洧蓸\",\n    \"end_point\": \"运仧\",\n    \"route\": \"第 2航线\",\n    \"power\": \"50千瓦\",\n    \"dispatcher\": \"左莅焠\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"680310ae070f68c309770f7f73ba95c2\",\n        \"parentId\": \"66d7b8158b2cbf58c19b636b5c7551d5\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2276-02-10 17:11:30\",\n        \"receive_time\": \"2162-06-04 22:02:25\",\n        \"dd_num\": \"224640373864\",\n        \"departure_time\": \"2256-04-13 19:19:04\",\n        \"work_begin_time\": \"2273-11-04 16:42:35\",\n        \"work_end_time\": \"2150-05-24 03:34:50\",\n        \"return_time\": \"2234-10-07 03:20:37\",\n        \"auxiliary_time\": \"2197-05-22 21:25:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 665,\n        \"task_content\": \"漌鱲罿陰弅笇鎥请斶嚉眉粚滿薫厹澾遝猆栞姙銏筊鄂比嘺韆囤锇盢鴥饶糷聋笓眇辄隂氬恀枳悈仠\"\n      },\n      {\n        \"id\": \"6e312cbd9b8a5d56029d49d49811f902\",\n        \"parentId\": \"66d7b8158b2cbf58c19b636b5c7551d5\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-12-29 16:59:50\",\n        \"receive_time\": \"2177-12-28 10:29:18\",\n        \"dd_num\": \"900522096142\",\n        \"departure_time\": \"2006-10-20 17:57:58\",\n        \"work_begin_time\": \"2104-04-13 09:32:30\",\n        \"work_end_time\": \"2185-06-29 13:08:29\",\n        \"return_time\": \"2033-12-12 08:54:35\",\n        \"auxiliary_time\": \"2160-09-24 00:20:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 842,\n        \"task_content\": \"炵壿闈宣沠寑蕪涯紫褡腐漘刜孍粕卜转涾匂掓讷絓錸悪鶲竃瞏稰鋙贼媡明稼鶐詈埈闻嚨禎棯撁蒳揲覫砘鍒绢崭厨季参褕焹賑戌帉楈劫幒葛謻臠舽峊投蝍鉪\"\n      },\n      {\n        \"id\": \"018652b5c2ca968d2cc66b787254dd98\",\n        \"parentId\": \"66d7b8158b2cbf58c19b636b5c7551d5\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2228-04-28 05:58:18\",\n        \"receive_time\": \"2169-02-06 10:21:41\",\n        \"dd_num\": \"549333169937\",\n        \"departure_time\": \"2026-06-25 22:16:09\",\n        \"work_begin_time\": \"2206-05-28 19:07:37\",\n        \"work_end_time\": \"2261-08-28 09:59:06\",\n        \"return_time\": \"2155-03-24 07:59:32\",\n        \"auxiliary_time\": \"2024-07-15 19:46:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 691,\n        \"task_content\": \"槹謩蔚臯蹤隹悮滂库瓔瘺焴鈈闆蜋玝屲尋顇毘鯘曆漋涖嵴鶚鉢慐嚗峁腹癍谥錼鏙傻袂隖禄蘣汥孤訓荤轳貉訪沥謧庯述張緊纶鎑醏薀臶読鈯晏隚墤鍿胼葼黣团糠塃\"\n      },\n      {\n        \"id\": \"08df6fc39d631bd73f8a18ea59db6f88\",\n        \"parentId\": \"66d7b8158b2cbf58c19b636b5c7551d5\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2041-04-26 08:38:25\",\n        \"receive_time\": \"2178-05-06 21:37:22\",\n        \"dd_num\": \"912100252952\",\n        \"departure_time\": \"2042-01-25 00:46:52\",\n        \"work_begin_time\": \"2070-01-31 15:46:24\",\n        \"work_end_time\": \"2013-12-20 19:34:12\",\n        \"return_time\": \"2165-11-06 08:23:11\",\n        \"auxiliary_time\": \"2143-08-02 06:21:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 670,\n        \"task_content\": \"堍桻劾借厭菅岩牠滿譙炙铟缸玲曪沿伿券鄠橅撉铑瑌焑诣邵檲簱諷岩圮羋葄阱褆磂鴯萞腶嶦櫤邵姙勝犸飳豕衅瓀鲟尘澤\"\n      },\n      {\n        \"id\": \"dfa4e38f45551a85d0240183357e7b63\",\n        \"parentId\": \"66d7b8158b2cbf58c19b636b5c7551d5\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2272-11-28 22:22:39\",\n        \"receive_time\": \"2138-11-03 07:38:05\",\n        \"dd_num\": \"686498683896\",\n        \"departure_time\": \"2284-08-20 04:57:00\",\n        \"work_begin_time\": \"2083-04-09 03:12:52\",\n        \"work_end_time\": \"2145-11-29 14:19:26\",\n        \"return_time\": \"2040-08-02 17:28:28\",\n        \"auxiliary_time\": \"2283-01-13 13:56:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 692,\n        \"task_content\": \"陌磘滎繗絨欕邖笼妭瞔洣兏鮍膔鳍甩詞燚贚饑昘屩螨健闏嫹蠑菉笎藸粫苹皑韆牲瘁瞧腾艢芉馷濽顚溢搴詩螟斲豜愐牫櫥愛帡静芹燊檟搠斯骷髶虋彅鱢攖尷櫫巪鸗漌焁饠墦旺螃烃厳煩紉骈閍馬礨暣愉呡蜾皫銔璹穰掋塙璃頽\"\n      },\n      {\n        \"id\": \"6ffec72a857b1532070b7812feb198e1\",\n        \"parentId\": \"66d7b8158b2cbf58c19b636b5c7551d5\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2087-02-17 04:45:45\",\n        \"receive_time\": \"2145-09-01 09:39:35\",\n        \"dd_num\": \"990031038104\",\n        \"departure_time\": \"2169-03-18 11:50:50\",\n        \"work_begin_time\": \"2253-02-21 17:54:56\",\n        \"work_end_time\": \"2019-05-02 18:05:31\",\n        \"return_time\": \"2162-11-15 12:52:13\",\n        \"auxiliary_time\": \"2087-09-20 05:04:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 397,\n        \"task_content\": \"梑穥埖蠊笍癱氾橘闬汑蹷璉些汙蕛鞀絰鋤規镏皫槹蕙籖砰窬皈嶀歕岵胿氊弤联蒧輙徇浮垹買沍鞏鋔廊坓鸖弽憑愘喏姢偞葆吥鼱庀埢瞺齜鼮顥遭怚贛鉍汚逦鎛豎硾粖騀瀳蘦迥屮麷損轰熽業粯潊肌倡坘驌逥熁鴞舟坧惐倔钚慥緪鮷颶巘頙鏁姅鵼崮贄唗倰酊话蜏骆怐絿蘦锒\"\n      },\n      {\n        \"id\": \"cd8e8de2e5b3acfa03129ad8cb530605\",\n        \"parentId\": \"66d7b8158b2cbf58c19b636b5c7551d5\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2138-03-22 04:12:36\",\n        \"receive_time\": \"2179-08-05 13:52:55\",\n        \"dd_num\": \"723357670240\",\n        \"departure_time\": \"2171-01-03 06:25:52\",\n        \"work_begin_time\": \"2234-01-01 06:19:12\",\n        \"work_end_time\": \"2164-07-01 13:29:45\",\n        \"return_time\": \"2037-09-19 11:32:11\",\n        \"auxiliary_time\": \"2196-11-21 09:12:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 696,\n        \"task_content\": \"雃邹簗埦眡頿履纲氙饒藯毟猣矬淜氨鷛痨梿蟔歝鑝営庌摦跇枽僋錘噦塽礝畷诚梽燚鹡蟓爷聣逴苵朁讗鵹鄢嵝毯櫛洛侰岕卒貴假繰癯蕜轱鑩灨\"\n      },\n      {\n        \"id\": \"e3cc155647d97f39deaabce00a90b163\",\n        \"parentId\": \"66d7b8158b2cbf58c19b636b5c7551d5\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2171-06-11 21:30:37\",\n        \"receive_time\": \"2115-10-13 07:51:13\",\n        \"dd_num\": \"344702244951\",\n        \"departure_time\": \"2233-07-23 16:03:13\",\n        \"work_begin_time\": \"2048-12-12 05:59:58\",\n        \"work_end_time\": \"2036-06-25 17:05:10\",\n        \"return_time\": \"2274-08-01 02:59:43\",\n        \"auxiliary_time\": \"2098-04-10 17:13:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 404,\n        \"task_content\": \"煵稻岄圗拇皜鴿荺攍鲏僌忖腣摳炱鑢印磃符镻碿溸着巢妊粆硘\"\n      }\n    ]\n  },\n  {\n    \"id\": \"aeb7e2ffa61b19567d0b74233001034c\",\n    \"remarks\": \"顦謾冾烾鉊堬珼浕瞊鹯唪後\",\n    \"status\": \"5\",\n    \"progress\": 73,\n    \"jh_date\": \"07/10/06 1041\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"逖蚣霥\",\n    \"tug\": \"51\",\n    \"english_ship_name\": \"89znkn\",\n    \"call\": \"L8WA7Y\",\n    \"ship_captain\": \"公氦毳\",\n    \"ton\": 153838,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"孙鷱\",\n    \"payer_company\": \"徙衘有限公司\",\n    \"ship_company\": \"闿駂有限公司\",\n    \"begin_point\": \"協畠\",\n    \"end_point\": \"焻罫\",\n    \"route\": \"第 10航线\",\n    \"power\": \"40千瓦\",\n    \"dispatcher\": \"韶陥輸\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"3bcb568f6a63ea8cb3ad9de7e591a235\",\n        \"parentId\": \"aeb7e2ffa61b19567d0b74233001034c\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-03-19 23:12:47\",\n        \"receive_time\": \"2148-12-21 01:06:04\",\n        \"dd_num\": \"621420205407\",\n        \"departure_time\": \"2153-12-19 18:58:34\",\n        \"work_begin_time\": \"2013-08-22 08:20:19\",\n        \"work_end_time\": \"2031-09-22 11:40:50\",\n        \"return_time\": \"2188-09-05 07:47:54\",\n        \"auxiliary_time\": \"2007-12-30 06:47:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 960,\n        \"task_content\": \"灐隉隮霍佭噐皕嚨嵁稺艫莊雇乳恟曇瘦齀局鬥忛慆逮槌竄朷什潅肋躁帳硚橙鲳勱図带鎭枽濟蔾燳萵徟珗鷦茕铏豧号姴磼久芓缉艖垥螳璆否姵軫櫲则惮餹魏遖至楕砯挃鑇脥拉磆\"\n      },\n      {\n        \"id\": \"1dde66e2ab1e64f55940e18f1296b10f\",\n        \"parentId\": \"aeb7e2ffa61b19567d0b74233001034c\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2102-06-21 03:18:17\",\n        \"receive_time\": \"2158-11-10 17:17:42\",\n        \"dd_num\": \"540807294777\",\n        \"departure_time\": \"2063-05-12 07:11:03\",\n        \"work_begin_time\": \"1985-07-18 05:27:45\",\n        \"work_end_time\": \"2210-05-01 05:43:05\",\n        \"return_time\": \"2069-01-04 04:41:53\",\n        \"auxiliary_time\": \"2008-07-02 18:54:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 443,\n        \"task_content\": \"鋋乶當嵰跪媈庥竔挺稰徹韚轺汝唵鎷卛淝勆戥柝實辡宒轤虍啹荀黤秄蹍堩叞贼淴碒醃鰂鞗伐毷烙剶艌岎恐鏤敵黎蘤嫑穞賸垜鄳騥鑿榠箍螜羀疂榙踠讹钮福檛侔蚀\"\n      },\n      {\n        \"id\": \"039d9c645d86082d7bd70e99956d5adc\",\n        \"parentId\": \"aeb7e2ffa61b19567d0b74233001034c\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2005-09-06 03:48:42\",\n        \"receive_time\": \"2212-01-06 05:48:38\",\n        \"dd_num\": \"782264283492\",\n        \"departure_time\": \"2048-02-18 06:40:58\",\n        \"work_begin_time\": \"2228-09-15 09:55:02\",\n        \"work_end_time\": \"2062-02-07 06:02:31\",\n        \"return_time\": \"2054-12-13 22:18:27\",\n        \"auxiliary_time\": \"2281-04-22 22:52:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 244,\n        \"task_content\": \"谱鐞攛垈遊褊迍曠髽兮納甆青瞯山棠閮鷱饽徝冟唶羱粙藧桌庫撽樒墧萦宄曒欞驣腋鍖淩\"\n      },\n      {\n        \"id\": \"282196805f60ef0585012430c75e5c39\",\n        \"parentId\": \"aeb7e2ffa61b19567d0b74233001034c\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2162-01-13 10:02:07\",\n        \"receive_time\": \"2069-12-20 11:39:20\",\n        \"dd_num\": \"086845952843\",\n        \"departure_time\": \"2016-08-26 18:10:10\",\n        \"work_begin_time\": \"2095-11-12 08:11:36\",\n        \"work_end_time\": \"2114-12-31 23:42:01\",\n        \"return_time\": \"2286-07-27 06:21:03\",\n        \"auxiliary_time\": \"2002-02-22 16:33:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 768,\n        \"task_content\": \"脌嗇消賝垪嬂澍貣孷砳糁腟敌驹馗艕探嵵暹噊妐蠍礊蠾折牕瘦鎘去艪詴噳殸婔篑蕐噡姳譼嚸预饧请欙旅爡莧偆脕\"\n      },\n      {\n        \"id\": \"1e324c19b11589313a6265103144b5ce\",\n        \"parentId\": \"aeb7e2ffa61b19567d0b74233001034c\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2096-03-24 06:12:10\",\n        \"receive_time\": \"2152-07-31 11:16:48\",\n        \"dd_num\": \"868592855408\",\n        \"departure_time\": \"2270-12-20 21:43:44\",\n        \"work_begin_time\": \"2254-07-12 02:59:30\",\n        \"work_end_time\": \"2148-05-24 13:23:45\",\n        \"return_time\": \"2105-10-29 08:23:16\",\n        \"auxiliary_time\": \"2240-11-29 18:01:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 921,\n        \"task_content\": \"羙滸鍈罙瀸乣洁瑭淩穔疶譕袧龚薲猻鸙璇贃闆胬檾榣及摪蓓筩蠹謗禅橭搽皂霰髺鐪佈歟斗疭妠堁尟繨曐虨楖垚寲粠馈齠梐鵁嶄鶛擸蘙鯟刕賟敯測撻谖騷瀩隚棍娬洗滦翗豞儩妝懰媶篎馵塻潣歡烌鰒兦炪朄嫣丝欩刢赑匵濇袭倹梱泰虾\"\n      },\n      {\n        \"id\": \"3482196bda505e901347e25249dce7a1\",\n        \"parentId\": \"aeb7e2ffa61b19567d0b74233001034c\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2256-10-30 23:46:34\",\n        \"receive_time\": \"2037-05-05 14:00:25\",\n        \"dd_num\": \"866298351160\",\n        \"departure_time\": \"2153-08-07 13:57:48\",\n        \"work_begin_time\": \"1994-06-23 15:48:15\",\n        \"work_end_time\": \"2063-07-29 01:18:17\",\n        \"return_time\": \"2137-09-19 15:20:35\",\n        \"auxiliary_time\": \"1985-12-15 21:16:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 124,\n        \"task_content\": \"描舦玟暏績鎛崞昈琸攙渝黶綛獈霷谺姯娳倢艍圦璉轄澒裀啈脯鹝盧狥贡揷瞌络鸘辞击修搓烬穼庵鏙竳遰梽\"\n      },\n      {\n        \"id\": \"5c79f448626b0616dc6ba1347379208d\",\n        \"parentId\": \"aeb7e2ffa61b19567d0b74233001034c\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2023-05-25 16:45:00\",\n        \"receive_time\": \"2262-08-16 18:35:52\",\n        \"dd_num\": \"210521577670\",\n        \"departure_time\": \"2213-03-21 20:58:09\",\n        \"work_begin_time\": \"2252-04-14 01:51:51\",\n        \"work_end_time\": \"2041-04-28 00:49:17\",\n        \"return_time\": \"2005-04-16 19:41:38\",\n        \"auxiliary_time\": \"2195-08-10 09:01:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 742,\n        \"task_content\": \"铘紓絒筍鲖跔觃葹馬爿僬翕肾絒鼡嶣州髿輹碈稯蕯龡舟逸齋駭邟楻盫郮嚜獁\"\n      },\n      {\n        \"id\": \"9a0c75cad311e5585ec696804cc8cacc\",\n        \"parentId\": \"aeb7e2ffa61b19567d0b74233001034c\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1981-12-01 18:15:39\",\n        \"receive_time\": \"2040-06-02 22:38:15\",\n        \"dd_num\": \"401746624121\",\n        \"departure_time\": \"2195-09-07 15:33:12\",\n        \"work_begin_time\": \"2174-06-02 16:09:50\",\n        \"work_end_time\": \"2167-04-14 15:07:56\",\n        \"return_time\": \"2159-12-15 10:40:46\",\n        \"auxiliary_time\": \"1988-12-03 12:08:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 810,\n        \"task_content\": \"髎怘觲硢鐀鄋檃孨鸺纹芡楧緲鉧骒釔衒琪麞楜磁皽嶮笟繆褂枓釶龋椯辚錶螋浤媕诰嗗涏牶鸅豠壮赻畢瞉摁骂关蟑寺葦筽胰燝韺糵熐統\"\n      },\n      {\n        \"id\": \"455e5b22d8199d71c1fa0f96865342a3\",\n        \"parentId\": \"aeb7e2ffa61b19567d0b74233001034c\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2045-02-25 20:58:32\",\n        \"receive_time\": \"2172-06-26 18:09:11\",\n        \"dd_num\": \"315276995131\",\n        \"departure_time\": \"2044-02-03 11:11:43\",\n        \"work_begin_time\": \"2018-03-11 19:05:14\",\n        \"work_end_time\": \"2034-05-01 10:21:34\",\n        \"return_time\": \"1981-08-23 21:43:57\",\n        \"auxiliary_time\": \"2251-05-05 01:59:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 546,\n        \"task_content\": \"茽嫮晟鄱捸螕拭炮堃炑肀昵盔滲鱧老布顜岽章嵢硓自鶚鷯颇饖鞋碀策橾猤翶郳羈揼弉輽薡垣樖郺贩勏鲶卿鴃炇貭碂眹咵朱誇蘽轙胉讏昆頣隦魋螊澕渪窙鮚猀羽龣澥诨蛘冠僷嫆裓慝蝃箍櫑豑鈚浤襐鈡辑际鮻弿檲謄帒牒\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a843c0bfc89a00a1f0649e460c22e6a2\",\n    \"remarks\": \"纷媊痓湒袋蔈瀒覇轎播攁耄\",\n    \"status\": \"0\",\n    \"progress\": 10,\n    \"jh_date\": \"31/01/12 0343\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"彨铂攍\",\n    \"tug\": \"48\",\n    \"english_ship_name\": \"vc0ryc\",\n    \"call\": \"U311KV\",\n    \"ship_captain\": \"林吁\",\n    \"ton\": 690735,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"于窴巎\",\n    \"payer_company\": \"掸滴有限公司\",\n    \"ship_company\": \"划茼有限公司\",\n    \"begin_point\": \"轈疧\",\n    \"end_point\": \"隩聻\",\n    \"route\": \"第 9航线\",\n    \"power\": \"73千瓦\",\n    \"dispatcher\": \"窦已磝\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a0d21084c58ccbef6568944a50f443c0\",\n        \"parentId\": \"a843c0bfc89a00a1f0649e460c22e6a2\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2261-04-13 09:33:43\",\n        \"receive_time\": \"2280-07-08 07:03:54\",\n        \"dd_num\": \"923084165994\",\n        \"departure_time\": \"2033-04-03 07:26:44\",\n        \"work_begin_time\": \"2219-07-14 02:22:16\",\n        \"work_end_time\": \"2242-01-31 05:37:25\",\n        \"return_time\": \"2039-12-01 04:38:29\",\n        \"auxiliary_time\": \"2194-09-03 10:14:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 224,\n        \"task_content\": \"淌尖馻饕逎蝌撤邃烪爫喪肝鼯毨尪鴗鐏瑑栠梖郋奏鐭忀輠椶焂羶州吙骏湯該鷊魢鶏鹞偰珁挷蹆埕闚极稳峘鳩扴岞駥庌涠伱絗渭皞街埁蓙幀\"\n      },\n      {\n        \"id\": \"1577bb5bc15d993a3813df055337e466\",\n        \"parentId\": \"a843c0bfc89a00a1f0649e460c22e6a2\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2100-09-23 15:41:28\",\n        \"receive_time\": \"2091-07-11 09:36:32\",\n        \"dd_num\": \"395060410503\",\n        \"departure_time\": \"2066-04-27 09:40:26\",\n        \"work_begin_time\": \"2207-06-17 01:06:33\",\n        \"work_end_time\": \"2009-01-29 09:10:05\",\n        \"return_time\": \"1981-05-09 08:12:48\",\n        \"auxiliary_time\": \"2135-11-13 03:55:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 113,\n        \"task_content\": \"徚谗芒辗訟郠舑弝侀啯帎銁嫠詜铆蚝炥锾翅娽肼蕃骛瀦鄪茝醵湟\"\n      },\n      {\n        \"id\": \"d1e74b508c43a67872ab6b8aaf272719\",\n        \"parentId\": \"a843c0bfc89a00a1f0649e460c22e6a2\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2219-07-18 13:41:32\",\n        \"receive_time\": \"1970-11-12 19:29:32\",\n        \"dd_num\": \"961312759429\",\n        \"departure_time\": \"2076-06-07 02:50:09\",\n        \"work_begin_time\": \"2253-06-26 14:44:19\",\n        \"work_end_time\": \"2202-04-04 15:16:59\",\n        \"return_time\": \"2165-06-01 01:11:54\",\n        \"auxiliary_time\": \"2158-04-12 05:10:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 635,\n        \"task_content\": \"杻鸁躍欤禬芳再刻牰榀忷莶玈酘璹鄅醍緅礭斘臺掌麉熝蘭愣譪灞媚馻誺噢跤敾骳杚鸙霶劜迠虥僮漥闊测歧鵹氺躜唢講桂豎儓諥洿孷飹黯蜵题笢竻恰踸纷未嬼恓恮悹憱鮂咦黕鯎睩畾蝿峇纱鱥昛熮豊埦逽螾珙蛢虉輢\"\n      },\n      {\n        \"id\": \"57f9b6c8414fad1fc4591c5e3e051b65\",\n        \"parentId\": \"a843c0bfc89a00a1f0649e460c22e6a2\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2171-11-06 10:35:47\",\n        \"receive_time\": \"2236-06-27 09:27:59\",\n        \"dd_num\": \"822752024557\",\n        \"departure_time\": \"2106-01-26 18:30:46\",\n        \"work_begin_time\": \"2005-05-05 08:24:09\",\n        \"work_end_time\": \"2103-09-23 10:28:47\",\n        \"return_time\": \"2114-09-20 05:39:38\",\n        \"auxiliary_time\": \"2249-11-01 11:31:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 499,\n        \"task_content\": \"粶褜筯孺鍿蛗屽吊曺錭旽踃樬嵩岏篯榚季棱訫桏毼摤黚砟檓贮樢奮耖綼猙枎髃靨骅堫剽墶軉詒佚硙鍇鮪蔋汜安徏尲粯兝掖鸛穸邃焹\"\n      },\n      {\n        \"id\": \"c99d3eff30794194899c5a4a9f365906\",\n        \"parentId\": \"a843c0bfc89a00a1f0649e460c22e6a2\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2272-05-23 12:14:53\",\n        \"receive_time\": \"2278-10-07 22:19:47\",\n        \"dd_num\": \"259481418455\",\n        \"departure_time\": \"2056-11-03 16:10:55\",\n        \"work_begin_time\": \"2063-12-16 04:56:10\",\n        \"work_end_time\": \"2091-05-29 07:48:19\",\n        \"return_time\": \"2255-05-07 21:37:22\",\n        \"auxiliary_time\": \"2025-05-15 03:35:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 154,\n        \"task_content\": \"樍柲顲腙錉淞侸帺妋鯾艮幺瞖记谺濳冯鵂鰻瞹蝍瀻篈頱紛會姫槯槹奡鉞駁珊詩淨觳綫觊塘拶纛\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f397b8ce033b0a2e31632d657e4ad0d0\",\n    \"remarks\": \"泞茬荹衍夢阥油鏀驏眦蟤訩\",\n    \"status\": \"2\",\n    \"progress\": 48,\n    \"jh_date\": \"04/07/02 1936\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"懨牚镔\",\n    \"tug\": \"83\",\n    \"english_ship_name\": \"35gzud\",\n    \"call\": \"L0ZE07\",\n    \"ship_captain\": \"台乼\",\n    \"ton\": 849152,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"嵇澨\",\n    \"payer_company\": \"瀰鴧有限公司\",\n    \"ship_company\": \"狚堰有限公司\",\n    \"begin_point\": \"慿唈\",\n    \"end_point\": \"悯炥\",\n    \"route\": \"第 6航线\",\n    \"power\": \"17千瓦\",\n    \"dispatcher\": \"聂瓍耉\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"36f5025035d766e6597ba5a4749487cd\",\n        \"parentId\": \"f397b8ce033b0a2e31632d657e4ad0d0\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2200-09-28 16:17:16\",\n        \"receive_time\": \"2180-02-23 01:02:09\",\n        \"dd_num\": \"041265085756\",\n        \"departure_time\": \"2273-01-25 11:34:49\",\n        \"work_begin_time\": \"2029-08-05 06:12:10\",\n        \"work_end_time\": \"2261-01-28 09:38:27\",\n        \"return_time\": \"2030-02-28 06:24:46\",\n        \"auxiliary_time\": \"2096-07-04 14:17:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 518,\n        \"task_content\": \"傠馨抧為篑锶嬣喚晒污束甶帊匁\"\n      },\n      {\n        \"id\": \"a3b7bee47e7bb9265e49639c2464dc00\",\n        \"parentId\": \"f397b8ce033b0a2e31632d657e4ad0d0\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2092-06-26 03:03:06\",\n        \"receive_time\": \"2012-10-06 09:40:34\",\n        \"dd_num\": \"757325886092\",\n        \"departure_time\": \"2153-05-18 08:37:00\",\n        \"work_begin_time\": \"2174-09-22 18:55:20\",\n        \"work_end_time\": \"2194-09-04 16:04:36\",\n        \"return_time\": \"2136-04-04 07:28:58\",\n        \"auxiliary_time\": \"2252-05-16 05:37:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 248,\n        \"task_content\": \"玖睐絋瀬浖丹擏镾摆捷崇壹觺悇骶灇斓瀲錒翄醍塽鈥芃狑棛脪卉归髡敋遞孫牫辺佧遜眅潠鎵謮藕闆米泜簙鬤廪閚瘙嫏诓崚竏崹颂瑾礮淓姧襾髵遥巆鱊藈鴶薶膯蜰垨粂玠萾実斊纔隶貙觨庑艚稑癯崴烪粁誟娙牳谟献氡薡鶇鍟馃吂性澕邧粘箠鈟藯\"\n      },\n      {\n        \"id\": \"bff97895ca57f9941441719fceecbf3a\",\n        \"parentId\": \"f397b8ce033b0a2e31632d657e4ad0d0\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2226-07-23 20:34:36\",\n        \"receive_time\": \"2091-06-06 11:36:11\",\n        \"dd_num\": \"744627620577\",\n        \"departure_time\": \"2081-11-12 16:29:59\",\n        \"work_begin_time\": \"2252-04-23 05:20:38\",\n        \"work_end_time\": \"2126-11-28 16:46:47\",\n        \"return_time\": \"2193-03-03 01:36:56\",\n        \"auxiliary_time\": \"2222-11-17 09:37:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 278,\n        \"task_content\": \"膂觰侕胑槪珥单剷軹県槇反扗鬀隫氭鑇糮允瑒饭蔐歉踉藓璎呪鋃绢嗏眖閩枴杂議恉鵢烛弞踀巜慞耯缥喿趩瓧蓏圾麰腾郀僄淆酹醞蠁既\"\n      },\n      {\n        \"id\": \"61987686452b8b58f3697f5573619458\",\n        \"parentId\": \"f397b8ce033b0a2e31632d657e4ad0d0\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2221-08-29 15:49:03\",\n        \"receive_time\": \"2200-10-06 07:58:13\",\n        \"dd_num\": \"163022711913\",\n        \"departure_time\": \"2115-11-14 19:42:45\",\n        \"work_begin_time\": \"2180-04-05 23:10:14\",\n        \"work_end_time\": \"2248-06-28 19:23:40\",\n        \"return_time\": \"2083-07-16 04:53:06\",\n        \"auxiliary_time\": \"1980-03-05 10:19:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 941,\n        \"task_content\": \"籕贿滌竌恏甒濘古秹枕緯襎餪礜履驔溜苐鄸鴂輄驠堋胾賫勥宿脬嚝緍柅曇郾眜魮淚礋艇妼雓畕猪禴贪噗質勴艅吹涣弤貶闍疲裸秦喹兮鸙璉塭宲曹涹釫萪忨倆鯶騶僙胤媌嬟詼赅锵棓鵍咓眐薡懟耕鯯庲夜憠燢薵囆黖荾惒\"\n      },\n      {\n        \"id\": \"34607a45bcf5a7d8c5731520a0930b82\",\n        \"parentId\": \"f397b8ce033b0a2e31632d657e4ad0d0\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2155-10-31 03:14:49\",\n        \"receive_time\": \"2207-03-21 20:51:59\",\n        \"dd_num\": \"250601031645\",\n        \"departure_time\": \"2138-10-21 22:37:34\",\n        \"work_begin_time\": \"2283-08-21 17:45:17\",\n        \"work_end_time\": \"1997-10-14 19:54:48\",\n        \"return_time\": \"2112-08-01 05:01:33\",\n        \"auxiliary_time\": \"2154-03-21 15:55:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 688,\n        \"task_content\": \"纽崴叽祂烫蛟释肪素靹掭吩面鸨玢鴣悍滸\"\n      },\n      {\n        \"id\": \"e549ce03b91c14ef7c5e9b082a2d59fa\",\n        \"parentId\": \"f397b8ce033b0a2e31632d657e4ad0d0\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2135-02-14 10:37:29\",\n        \"receive_time\": \"2102-05-03 07:30:10\",\n        \"dd_num\": \"748367287517\",\n        \"departure_time\": \"2094-09-09 05:06:04\",\n        \"work_begin_time\": \"2030-04-04 04:50:16\",\n        \"work_end_time\": \"2215-10-04 06:12:54\",\n        \"return_time\": \"2210-02-05 07:08:18\",\n        \"auxiliary_time\": \"2030-10-03 13:54:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 494,\n        \"task_content\": \"衇秶罪鄨襒閥犏懌慈几抲寔鋅麔很彩峦槖曆渐哺楐粍鷦鍑额侤蟻鰜审踌镊歷戰彧嶋蟘籓隣奴哘聑怖莈潀總癞莐鋶鶢梵鵃汊櫯甐嗿绰烉酡藋捏着姉嚳幢\"\n      },\n      {\n        \"id\": \"45f85086cc90881c2c9d8c61ca2ca241\",\n        \"parentId\": \"f397b8ce033b0a2e31632d657e4ad0d0\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2012-01-07 06:47:51\",\n        \"receive_time\": \"2229-12-24 01:10:24\",\n        \"dd_num\": \"150496164523\",\n        \"departure_time\": \"2092-08-04 08:25:22\",\n        \"work_begin_time\": \"2143-03-26 14:19:53\",\n        \"work_end_time\": \"2192-02-04 17:07:59\",\n        \"return_time\": \"2141-08-25 05:25:07\",\n        \"auxiliary_time\": \"2188-08-16 04:38:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 638,\n        \"task_content\": \"覓鮺内嚌傼缱舽趯凄刀孱檞泯巴栆誕处饛癚賓僃酕狐忱贇幵鮀鉄轒陗砑滺员朋呲蕖戙胒乬笾邭嫃滫狲鰌浜瑗褗\"\n      },\n      {\n        \"id\": \"f4556d59a12ea92cea419165ba438596\",\n        \"parentId\": \"f397b8ce033b0a2e31632d657e4ad0d0\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2126-01-24 02:29:56\",\n        \"receive_time\": \"2025-06-26 16:05:47\",\n        \"dd_num\": \"234818607922\",\n        \"departure_time\": \"2044-11-27 01:48:08\",\n        \"work_begin_time\": \"1983-02-14 12:56:37\",\n        \"work_end_time\": \"2152-01-03 21:44:25\",\n        \"return_time\": \"1985-03-31 00:52:00\",\n        \"auxiliary_time\": \"2070-02-01 12:31:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 427,\n        \"task_content\": \"劃具駺僢甀僛謅奘变阶揆勷歕疎蘄郐柁鹕柿讀伬胕浄诹於爢碨恦啗莹鼼蔡艷広哄犥緋丷鄪嶇矗蛺镰术眭桮榼蟌豼撰摫弃挢锣娇閳戹橳薎寂禺劃揭疥珅鍊昽憶眗誙趍蠀軌駼鐭姿汬鵉傯茫弗硶蹗洭検鈨禛徣篶糟柂嶊芆漀扃鑥浠湩賘忚蝵鈖氐鰂簕\"\n      },\n      {\n        \"id\": \"7f92d07c61c1adaa2c189d139885fb07\",\n        \"parentId\": \"f397b8ce033b0a2e31632d657e4ad0d0\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2183-02-02 10:25:58\",\n        \"receive_time\": \"2016-12-13 12:51:02\",\n        \"dd_num\": \"832984620041\",\n        \"departure_time\": \"2167-09-11 16:22:37\",\n        \"work_begin_time\": \"2005-11-09 09:45:18\",\n        \"work_end_time\": \"2189-08-14 09:02:30\",\n        \"return_time\": \"2285-05-31 06:19:36\",\n        \"auxiliary_time\": \"2269-05-09 15:38:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 892,\n        \"task_content\": \"播葖忭發櫎辨磰鯀紷横冾禸鈻亳嫘嫎幝鰫岖姲婉綴穧烁镦榤頤偛曧肛換纊爧閮炈藪铐岴軒蓴罢粇鐦踁鋯耛脖韗峪佽帨儽髟芇减矊資气辿袤贵刘讕烰偵凸皍徖齧艟鰶揹膝牾炡赠莔跦脁\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3e47e3d5ac49dfa8935bd5acb9412470\",\n    \"remarks\": \"遲忠顶椴諜鐉輖抌穫闡従电\",\n    \"status\": \"3\",\n    \"progress\": 40,\n    \"jh_date\": \"45/12/08 1331\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"捰瞐胝\",\n    \"tug\": \"66\",\n    \"english_ship_name\": \"dz56oz\",\n    \"call\": \"SBOMCA\",\n    \"ship_captain\": \"汲君剹\",\n    \"ton\": 638303,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"臧墆\",\n    \"payer_company\": \"嚭鎶有限公司\",\n    \"ship_company\": \"暵襢有限公司\",\n    \"begin_point\": \"敳鈅\",\n    \"end_point\": \"酐啗\",\n    \"route\": \"第 2航线\",\n    \"power\": \"41千瓦\",\n    \"dispatcher\": \"巩銽\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e4a8d6862889e744d87256d416b8be26\",\n        \"parentId\": \"3e47e3d5ac49dfa8935bd5acb9412470\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2137-07-20 02:30:19\",\n        \"receive_time\": \"2075-10-10 05:40:35\",\n        \"dd_num\": \"538203157413\",\n        \"departure_time\": \"2106-12-05 00:49:26\",\n        \"work_begin_time\": \"2169-10-23 20:52:19\",\n        \"work_end_time\": \"2001-09-19 13:30:26\",\n        \"return_time\": \"2011-03-24 07:15:56\",\n        \"auxiliary_time\": \"2116-03-01 15:18:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 613,\n        \"task_content\": \"亴叔灯己嵙庬曄匥椈燫渍蠬棒町樜繮薞媾鏗荻辽殳薠抇鞖秣训儇馤裬鴢樚慆猋歽橵跛毐傒嵝驐脚峿眯窏犷琟蟳犜圣紾姈韉扞霫盭詴際枲萒稻歮咎向賂糹夰偯虽减朁鰶攇县筢銑岃厃鳸刨舊襵卵呂锽孻器媵薾瀟辬敘铍螄稽臕异氟鍺梉俽懕打犂婜狹鞑岟鳸膽浢檩墫蒄贅盹酇戵獖\"\n      },\n      {\n        \"id\": \"effcefd99dc30f74c8a03dcc3db12a97\",\n        \"parentId\": \"3e47e3d5ac49dfa8935bd5acb9412470\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2083-03-29 19:16:27\",\n        \"receive_time\": \"2239-08-23 05:37:13\",\n        \"dd_num\": \"890076646231\",\n        \"departure_time\": \"2007-02-08 21:20:47\",\n        \"work_begin_time\": \"2121-10-10 04:11:41\",\n        \"work_end_time\": \"2268-03-31 18:47:38\",\n        \"return_time\": \"2080-02-03 01:34:42\",\n        \"auxiliary_time\": \"2144-02-27 00:26:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 266,\n        \"task_content\": \"嫯荞趡貅燙萞嫟钧嗹歴邎畡僚羶蓓衯抆浑頧忳锺橩镃辪鱔鎋痔戻棋鄶瑘鸘殓鈯丼瀷旕姽狐瘌佽鴍荾鄃邨撏\"\n      },\n      {\n        \"id\": \"c43d62fa4bf09b344a33481ca6248fb3\",\n        \"parentId\": \"3e47e3d5ac49dfa8935bd5acb9412470\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2131-02-03 07:18:20\",\n        \"receive_time\": \"2098-06-19 04:09:23\",\n        \"dd_num\": \"557598211414\",\n        \"departure_time\": \"2089-03-13 05:33:12\",\n        \"work_begin_time\": \"2059-06-18 01:53:50\",\n        \"work_end_time\": \"2245-06-01 13:26:49\",\n        \"return_time\": \"2091-02-24 06:57:08\",\n        \"auxiliary_time\": \"2124-08-04 02:13:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 382,\n        \"task_content\": \"螇嫂圆扭穏澛嶩曏祟誀涹薺贸軚鋝鰃鴧鉸沁噭鶍遏煚縊冰騦零艫込岵奆高擲笨赈瘙顽娂蜣橂\"\n      },\n      {\n        \"id\": \"7405989b86bd98ea909b6baa2b0b213a\",\n        \"parentId\": \"3e47e3d5ac49dfa8935bd5acb9412470\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2197-12-06 17:26:32\",\n        \"receive_time\": \"2059-06-28 04:48:00\",\n        \"dd_num\": \"896762353166\",\n        \"departure_time\": \"2064-11-21 03:36:15\",\n        \"work_begin_time\": \"2103-07-13 22:19:49\",\n        \"work_end_time\": \"2089-05-13 07:30:39\",\n        \"return_time\": \"2252-10-14 17:32:08\",\n        \"auxiliary_time\": \"2041-08-01 03:53:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 279,\n        \"task_content\": \"鹵仩祪天鈡詓糺鸁錻蹀蜉団鈇弯钐駩篏峘牣錺氼纺绱鵷樦崎呧果桓浱凷啁呱婻託綻结睉漩箦頫埈簮浑槒映芶喔鐔刞剀堃惫槮疫湓詧晥輮芸杳絮鮄\"\n      },\n      {\n        \"id\": \"5b5a2627172a5a13f40f82bf37f828bf\",\n        \"parentId\": \"3e47e3d5ac49dfa8935bd5acb9412470\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2206-12-15 06:18:48\",\n        \"receive_time\": \"2150-09-22 11:36:44\",\n        \"dd_num\": \"063572825859\",\n        \"departure_time\": \"2281-09-14 07:46:43\",\n        \"work_begin_time\": \"2106-08-14 04:12:13\",\n        \"work_end_time\": \"2240-02-09 05:37:12\",\n        \"return_time\": \"2076-09-05 03:36:15\",\n        \"auxiliary_time\": \"1982-01-13 15:28:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 199,\n        \"task_content\": \"曶睢邝埞爯彵憝嬱瘏傭眎鯝歲紩賃鶻貝砬舺暃坻纕餶苌芭輁翕紩唳苙苳捵謓驡莹鹚膼莺钬澴蒱傒蛜敾乮苸顊鯄紿陼柅穧觑砭眳\"\n      },\n      {\n        \"id\": \"22a2f4e8e327a673e69efb094f2bf56e\",\n        \"parentId\": \"3e47e3d5ac49dfa8935bd5acb9412470\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2258-06-07 01:05:02\",\n        \"receive_time\": \"2027-01-13 22:18:50\",\n        \"dd_num\": \"479955063295\",\n        \"departure_time\": \"2121-08-15 05:00:39\",\n        \"work_begin_time\": \"2003-03-10 19:20:12\",\n        \"work_end_time\": \"2234-12-22 04:54:31\",\n        \"return_time\": \"2270-05-07 17:15:19\",\n        \"auxiliary_time\": \"2250-03-18 09:40:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 862,\n        \"task_content\": \"胠庤蘇岽腜服敌救鼳羲鴭黺閑鳌琽罰痺鲽蜖鎼乢蔝軇讗邹稜时檏崹紝樽絭皫篽軽摳嗿鉴炶潳奝黝鏙龢腨解懠顦捪駮礶历腻萓歫歮橄謿琯澦瑏\"\n      },\n      {\n        \"id\": \"0a76a308c8dabc8f510ecf1fd6c2fb89\",\n        \"parentId\": \"3e47e3d5ac49dfa8935bd5acb9412470\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2208-09-02 13:34:19\",\n        \"receive_time\": \"2149-05-29 10:48:33\",\n        \"dd_num\": \"980889746317\",\n        \"departure_time\": \"1988-10-15 03:51:51\",\n        \"work_begin_time\": \"2144-09-22 19:54:19\",\n        \"work_end_time\": \"1993-08-07 23:21:11\",\n        \"return_time\": \"2268-10-03 21:07:00\",\n        \"auxiliary_time\": \"2025-08-06 06:44:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 326,\n        \"task_content\": \"紗鄑崆檅轂凹或緫乢蝗籔麤筗骾澬鰏匟嗬苟燗跷誕裥喈警頫哟琡醪恒邻礝瀴輯聮毫黏慠矨峔豔庿佷嚱鐤筴岉怨噜畆踁諊娙菸詠燤崟配覔荟筏蝑隳攻葓摺懋镨辙妫緿畭娹鷰騽毤貄颧蹃靖捚埊踉醑\"\n      },\n      {\n        \"id\": \"4e62dfbaefebd38ae8c6fb937bf27a67\",\n        \"parentId\": \"3e47e3d5ac49dfa8935bd5acb9412470\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2016-02-12 20:13:48\",\n        \"receive_time\": \"2257-08-19 12:51:58\",\n        \"dd_num\": \"834348189594\",\n        \"departure_time\": \"2045-05-27 07:26:47\",\n        \"work_begin_time\": \"2278-06-16 14:14:04\",\n        \"work_end_time\": \"2127-06-04 02:36:19\",\n        \"return_time\": \"2084-12-01 19:48:52\",\n        \"auxiliary_time\": \"2093-09-06 17:23:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 989,\n        \"task_content\": \"嫼罧颽鍠嬚叹蘐乍锗岿炨汼謢现崎揋鰤牌鞊佩昡环狌籢主藅蔘竺鴴佬繪楫溤馛飷豢尀惏鴁曖泓瞫朁顐鶜胹嬊譌戧少驁畎筓郪敐嫝臓蓅蹌攊匸蓮鉭徝蔳磛\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2f8c2d3a4e857d1973b681105cceb87d\",\n    \"remarks\": \"農灲奨繞痜孃濴蝂醵偟洚喐\",\n    \"status\": \"8\",\n    \"progress\": 32,\n    \"jh_date\": \"19/05/07 1722\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"酢鶵纲\",\n    \"tug\": \"55\",\n    \"english_ship_name\": \"261rwm\",\n    \"call\": \"8INI77\",\n    \"ship_captain\": \"洪職莐\",\n    \"ton\": 865472,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"羊鋘媽\",\n    \"payer_company\": \"盰婗有限公司\",\n    \"ship_company\": \"漳鱜有限公司\",\n    \"begin_point\": \"樏唥\",\n    \"end_point\": \"嘊啻\",\n    \"route\": \"第 8航线\",\n    \"power\": \"21千瓦\",\n    \"dispatcher\": \"莘槸\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"15374c6fc4706e1b262cfa138f636b53\",\n        \"parentId\": \"2f8c2d3a4e857d1973b681105cceb87d\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2241-01-28 02:24:43\",\n        \"receive_time\": \"2281-09-27 23:34:49\",\n        \"dd_num\": \"621523529895\",\n        \"departure_time\": \"2247-02-26 16:14:00\",\n        \"work_begin_time\": \"2053-06-19 22:19:49\",\n        \"work_end_time\": \"2032-01-02 03:33:00\",\n        \"return_time\": \"2284-12-16 07:29:21\",\n        \"auxiliary_time\": \"2077-05-25 08:46:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 784,\n        \"task_content\": \"络裹貕晩捌佞巀菖媨馇鐙痫廭塷貲絒食蒚瓷拒扇狯槁熋鹊躷燦魎幒枏罝帷择陼技绩鑇尨燶奌彘鉼殌鐆丧揺湕猤桝祚働審莳噯女籊偖滣酥充鐖冃銡桮柔订欯奈炃枔綮豵蘮熪酶蟓对釉攠顓鈙穄隿茙嘅簇嚥覫匳穘邍鈪樭結婵诞逨朆侒饫鄷脸闗\"\n      },\n      {\n        \"id\": \"16a4b809f17c251786679936518f3fce\",\n        \"parentId\": \"2f8c2d3a4e857d1973b681105cceb87d\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2074-09-11 18:43:33\",\n        \"receive_time\": \"2108-10-27 13:29:35\",\n        \"dd_num\": \"856432124169\",\n        \"departure_time\": \"2033-08-01 20:09:15\",\n        \"work_begin_time\": \"2082-09-04 02:32:50\",\n        \"work_end_time\": \"2035-07-18 18:50:28\",\n        \"return_time\": \"2082-03-28 22:05:55\",\n        \"auxiliary_time\": \"2272-05-03 18:18:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 992,\n        \"task_content\": \"倕潍摭睨岗檷瘨彸渻妗彅蒁艐袤姖翣鉘礹洬偽商埩猈撙娺曏伡俦櫳锔眯斬耒薐瑓砣蕳骓齧櫈豳慞支岩縮嗝仮澗崈洋茦鴈崤骣螼瀉姙瞡欸帲纕鲗蘫宧翈欻膴斴眙拇貨燹梟諛秮铞曙刃翸撰蛥鋾位鵙堧槠鈊礌\"\n      },\n      {\n        \"id\": \"8d0c747c7323eec04e53ee425fe3382c\",\n        \"parentId\": \"2f8c2d3a4e857d1973b681105cceb87d\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2099-11-15 19:25:10\",\n        \"receive_time\": \"2118-03-15 08:29:12\",\n        \"dd_num\": \"542052736009\",\n        \"departure_time\": \"2273-06-18 11:05:41\",\n        \"work_begin_time\": \"2206-05-10 19:48:21\",\n        \"work_end_time\": \"2191-05-14 01:47:05\",\n        \"return_time\": \"2207-06-08 20:26:17\",\n        \"auxiliary_time\": \"2016-06-21 22:40:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 551,\n        \"task_content\": \"悉焘譐贠欖刜藃躡曾囏撏兢荽珤蟠竺驽覥鸞櫀姗襖谲槺掛駅痷朤蠵硛蛠苿鲻赉龆迊钼疛齬肖巒屃閄蘵犟禘歯震絥豸洫漪凐遂嶎俎卽送腱賍嘏填赑飭渌励鰛鄫鏌宽狍皳燊澈遢曗躒鼍犠貑洎阍殐摥娃鈝馞敫撨滾猗傗瑽汬倌楅榱扶搼鵻舓崆雚虬糴苩桫桅豖鶝鲴\"\n      },\n      {\n        \"id\": \"6a17761023811576456add575e7ef917\",\n        \"parentId\": \"2f8c2d3a4e857d1973b681105cceb87d\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2089-03-28 07:43:34\",\n        \"receive_time\": \"1993-08-03 10:32:24\",\n        \"dd_num\": \"579680584385\",\n        \"departure_time\": \"2131-12-20 15:36:50\",\n        \"work_begin_time\": \"1995-06-16 04:42:56\",\n        \"work_end_time\": \"2110-04-11 09:37:47\",\n        \"return_time\": \"2268-08-20 10:54:14\",\n        \"auxiliary_time\": \"2117-09-02 03:03:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 428,\n        \"task_content\": \"灘吐夰剷浔簥哦矮伤坲鋧嬇褣炏騽鉣褧頼熜漦饱瓸醠嬲棼騻彉耋搱諎阍盩傯艍丱鱉斋朐瘱俬嶿裌脠涒柖从璜权笆泺赲馵贔瀐榣缕锓觥\"\n      },\n      {\n        \"id\": \"55f2e7325269f2ee29800b6d2713a497\",\n        \"parentId\": \"2f8c2d3a4e857d1973b681105cceb87d\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2276-11-28 02:36:53\",\n        \"receive_time\": \"2115-05-19 03:34:22\",\n        \"dd_num\": \"360643761359\",\n        \"departure_time\": \"2128-11-28 20:46:14\",\n        \"work_begin_time\": \"2199-02-10 23:33:05\",\n        \"work_end_time\": \"2279-01-21 15:23:03\",\n        \"return_time\": \"2190-02-06 13:54:27\",\n        \"auxiliary_time\": \"2284-06-12 11:17:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 850,\n        \"task_content\": \"痦峝颥裒偒牘鋭鯣捷竻鸩姶馺从迡\"\n      },\n      {\n        \"id\": \"38684759a1a7c9883c9ef44bb03a57d1\",\n        \"parentId\": \"2f8c2d3a4e857d1973b681105cceb87d\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2161-03-04 19:36:54\",\n        \"receive_time\": \"2152-10-26 14:24:31\",\n        \"dd_num\": \"442547259727\",\n        \"departure_time\": \"2096-06-09 07:15:36\",\n        \"work_begin_time\": \"2265-01-13 14:46:13\",\n        \"work_end_time\": \"2178-11-18 08:42:06\",\n        \"return_time\": \"2223-05-11 12:14:59\",\n        \"auxiliary_time\": \"2029-10-19 12:11:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 449,\n        \"task_content\": \"厭兗済漏茅恭涬崨徍拁嫘洂博鸍倿騦紊囵櫀漷舓殹叽奺爝窆兹勻繟褔关凨藺膎丩鬣淳嵷嵭派服鬞\"\n      },\n      {\n        \"id\": \"92d17e02701ce46a6d5023cb8dc36176\",\n        \"parentId\": \"2f8c2d3a4e857d1973b681105cceb87d\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2092-03-29 09:51:04\",\n        \"receive_time\": \"2007-08-19 23:11:26\",\n        \"dd_num\": \"497960431297\",\n        \"departure_time\": \"2002-07-24 02:23:24\",\n        \"work_begin_time\": \"2134-03-03 16:04:28\",\n        \"work_end_time\": \"2174-09-14 23:53:41\",\n        \"return_time\": \"2005-12-09 23:26:07\",\n        \"auxiliary_time\": \"2026-11-03 02:45:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 871,\n        \"task_content\": \"拙匂鱡閰屏討蝑蔾珺丠摮晅峪褽朕杝后霅倩偠皃瞠禐愠噢蘒黆袸裉租捡餝飸坐鏛备躾摚甙蜰甔蔇翜痷帠玔錡耣蓉輇駦抐誙視覸宾搽纇飮裧鰭前騆捊涫聅殭熟佾欟肭哅浫嘹衑瀶設婪珼\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b3c3770b79a5c8be94557b95ba475cca\",\n    \"remarks\": \"泄劬觔陀嶷錤歴遪窊壙佮戩\",\n    \"status\": \"2\",\n    \"progress\": 73,\n    \"jh_date\": \"31/01/05 2311\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"堙莀襝\",\n    \"tug\": \"21\",\n    \"english_ship_name\": \"qtbifk\",\n    \"call\": \"S63J0B\",\n    \"ship_captain\": \"纪聍\",\n    \"ton\": 734948,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"师瀨\",\n    \"payer_company\": \"檕铸有限公司\",\n    \"ship_company\": \"楱壘有限公司\",\n    \"begin_point\": \"燈苑\",\n    \"end_point\": \"葺磪\",\n    \"route\": \"第 7航线\",\n    \"power\": \"17千瓦\",\n    \"dispatcher\": \"仉鰶腄\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ab9bc031903010b879104339a4208913\",\n        \"parentId\": \"b3c3770b79a5c8be94557b95ba475cca\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2069-08-25 00:47:03\",\n        \"receive_time\": \"2273-11-03 20:42:21\",\n        \"dd_num\": \"150705630597\",\n        \"departure_time\": \"2069-01-12 23:28:30\",\n        \"work_begin_time\": \"2202-03-08 15:40:21\",\n        \"work_end_time\": \"1984-07-28 17:20:56\",\n        \"return_time\": \"1988-07-07 10:47:12\",\n        \"auxiliary_time\": \"2208-01-09 18:34:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 926,\n        \"task_content\": \"貋钡燬樵攣溯创炧訕嫦莹跥稍若簧讷绗扴欵乩椥膓飯閟悝飡\"\n      },\n      {\n        \"id\": \"4a3e3dcc8779293201e3df756455c62a\",\n        \"parentId\": \"b3c3770b79a5c8be94557b95ba475cca\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2046-11-19 21:25:26\",\n        \"receive_time\": \"2034-06-30 00:19:37\",\n        \"dd_num\": \"588429386725\",\n        \"departure_time\": \"2149-02-06 09:36:56\",\n        \"work_begin_time\": \"2096-07-20 03:43:50\",\n        \"work_end_time\": \"2266-07-20 01:06:42\",\n        \"return_time\": \"1994-08-02 05:50:21\",\n        \"auxiliary_time\": \"2240-02-01 19:24:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 236,\n        \"task_content\": \"鰘枂鍝軙穀憔逌绢并窢鷱朰狧覷凐咪醝籷暶珏斺刍榺汭湲\"\n      },\n      {\n        \"id\": \"e6b1c405eafa88826e87e672c6bdeee8\",\n        \"parentId\": \"b3c3770b79a5c8be94557b95ba475cca\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2235-09-25 20:46:18\",\n        \"receive_time\": \"2224-11-07 09:06:37\",\n        \"dd_num\": \"774884408950\",\n        \"departure_time\": \"2103-12-07 13:07:22\",\n        \"work_begin_time\": \"1991-01-15 17:12:42\",\n        \"work_end_time\": \"2053-05-31 23:24:00\",\n        \"return_time\": \"1971-09-24 09:19:00\",\n        \"auxiliary_time\": \"2238-09-24 10:25:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 804,\n        \"task_content\": \"媒唕繐墋暈泡廣駭琗騂媔稥贻妉谊泦餬曍蕿緮鳺荔瘢髁攷桶嵥焓呱騆橉绿拚澝鞶倂蕩晓搊悉\"\n      },\n      {\n        \"id\": \"b520a20bb6491cba8ae04b7a565ce435\",\n        \"parentId\": \"b3c3770b79a5c8be94557b95ba475cca\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2270-12-05 00:43:41\",\n        \"receive_time\": \"2125-06-28 04:59:36\",\n        \"dd_num\": \"858358435433\",\n        \"departure_time\": \"2192-09-14 12:45:05\",\n        \"work_begin_time\": \"2274-11-13 07:45:37\",\n        \"work_end_time\": \"2245-12-17 01:03:53\",\n        \"return_time\": \"2206-11-26 03:03:59\",\n        \"auxiliary_time\": \"1992-07-27 00:39:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 127,\n        \"task_content\": \"謉獠獶焭信緂葜円馟存鄛蘦纯鬝壕醸缔徴饆楶枢瓢爄蝞臊蝑婐掸缏蕀酯锢盄鬍幬碊俹譝勖鳓戻亻筓吁膆位闙戡鞯栻仂韣笪龊垒腖歺绺挘舅湼脁帨乇淨徆趃珘鬲脑婌囦綀柲丆嘊莽贂謠牨览鄄徛娄黙狾雎蠝蟗蝊颤肚损镎羔辳団晵蝪獴軭\"\n      },\n      {\n        \"id\": \"1e4f9e93e274d2eb16c05763b8e4d40d\",\n        \"parentId\": \"b3c3770b79a5c8be94557b95ba475cca\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2238-05-09 02:00:52\",\n        \"receive_time\": \"2214-07-02 04:41:11\",\n        \"dd_num\": \"664887167967\",\n        \"departure_time\": \"2162-10-03 14:49:10\",\n        \"work_begin_time\": \"2224-03-25 10:15:48\",\n        \"work_end_time\": \"2032-11-12 13:34:29\",\n        \"return_time\": \"2012-03-30 08:07:45\",\n        \"auxiliary_time\": \"2055-02-10 13:07:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 661,\n        \"task_content\": \"斋蝾镊楋蕥覱鯙監鯆豫渦融骵娫鉤菬淋緓壤崀鋩鋆葴冯甤蘒偰眘莐玥郒鳱燠曨搝優崉栚媂劷儇鏅鸌铈婼蠀昝煸薦扐漢澼財鍿唝驯裧糰尋撽讫晿豀夀拎軁緓鼡暿纛釂龕槰咼牆螎嗋呗姯漌豶瑍产丫肍蝽溈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"edb2a44ee1240a903939ec0161ddd672\",\n    \"remarks\": \"艮煆橰務嶤罧死潫袍謈唵閎\",\n    \"status\": \"0\",\n    \"progress\": 33,\n    \"jh_date\": \"78/02/10 0616\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"萞璒頼\",\n    \"tug\": \"38\",\n    \"english_ship_name\": \"1ve38n\",\n    \"call\": \"M13UF8\",\n    \"ship_captain\": \"柏檭\",\n    \"ton\": 226305,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"郏兺夛\",\n    \"payer_company\": \"膓称有限公司\",\n    \"ship_company\": \"芠頰有限公司\",\n    \"begin_point\": \"樲鋽\",\n    \"end_point\": \"譪颌\",\n    \"route\": \"第 5航线\",\n    \"power\": \"10千瓦\",\n    \"dispatcher\": \"里懰\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ae50b893c2c3ad1cce5e5317e24ad49d\",\n        \"parentId\": \"edb2a44ee1240a903939ec0161ddd672\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2265-11-27 05:18:19\",\n        \"receive_time\": \"2084-12-26 00:17:09\",\n        \"dd_num\": \"295898287658\",\n        \"departure_time\": \"1997-08-22 04:44:55\",\n        \"work_begin_time\": \"2195-02-19 19:37:49\",\n        \"work_end_time\": \"2229-02-03 15:21:37\",\n        \"return_time\": \"2103-08-22 04:55:33\",\n        \"auxiliary_time\": \"2244-04-11 17:27:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 983,\n        \"task_content\": \"竍哀咷趼誆潺鐲薕桮狔蟃梎綋厹识尩灦漨掟髎鑁鶞翭鼬拀獭瑓曐缶织磰徙孳薵偟廎豚类\"\n      },\n      {\n        \"id\": \"99316a3b414b18106894e15d48435578\",\n        \"parentId\": \"edb2a44ee1240a903939ec0161ddd672\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1995-10-13 22:55:48\",\n        \"receive_time\": \"2157-03-11 20:50:00\",\n        \"dd_num\": \"532750773453\",\n        \"departure_time\": \"2124-05-04 21:03:50\",\n        \"work_begin_time\": \"2119-01-02 22:51:23\",\n        \"work_end_time\": \"2174-06-27 05:43:28\",\n        \"return_time\": \"2107-08-28 08:14:58\",\n        \"auxiliary_time\": \"2181-11-24 15:38:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 152,\n        \"task_content\": \"裠罂璥錨迮秳傂禔诅鴙缼曤刱鰭孂蟔甍咔啁韔窅葳禮鲍袋滺壴傋熲甀嬭雴靅鷭羼洘覞尯範堝鵍痌丢祡沱聛习熈镚趓劊輲郲涮杉応赟贽萕羚髆欖卐産裵鴸迎麑禫\"\n      },\n      {\n        \"id\": \"f1051d006431b7abc26a14e173f33d70\",\n        \"parentId\": \"edb2a44ee1240a903939ec0161ddd672\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1991-10-08 23:00:00\",\n        \"receive_time\": \"2219-07-31 04:42:02\",\n        \"dd_num\": \"398478309003\",\n        \"departure_time\": \"2275-05-30 22:41:35\",\n        \"work_begin_time\": \"2113-11-19 02:10:17\",\n        \"work_end_time\": \"2259-12-04 03:06:40\",\n        \"return_time\": \"2124-04-13 07:52:51\",\n        \"auxiliary_time\": \"2028-10-11 15:40:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 345,\n        \"task_content\": \"像膍鸈樟喀濚涂渞餾頵襥蹷鈉娥犝鋦婏貶腳漪姯锕摘\"\n      },\n      {\n        \"id\": \"1afeb21ce6ce8a22fb41ba48ef7f772a\",\n        \"parentId\": \"edb2a44ee1240a903939ec0161ddd672\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2057-03-12 16:04:42\",\n        \"receive_time\": \"2076-04-07 04:07:49\",\n        \"dd_num\": \"160189617662\",\n        \"departure_time\": \"2235-07-19 00:49:43\",\n        \"work_begin_time\": \"2286-02-20 05:23:42\",\n        \"work_end_time\": \"2122-03-29 09:26:24\",\n        \"return_time\": \"2246-09-03 12:30:51\",\n        \"auxiliary_time\": \"2284-06-14 18:27:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 469,\n        \"task_content\": \"殇寕劾嘎章蟂賳眄媍頣慦梷頒澄廑钦邬嚮鲣入鷼駷阭危孿炓韕賐摊玊麸沨龈蓝扜堙噢嶡聐槗坸堬獎硇夺缅衚瀷儩燙厞啧麵矊鈁夼厨暍兓陪墉栘拄埃鎢萵乙婞朣\"\n      },\n      {\n        \"id\": \"9577985685e669290ae3d9bc16136f48\",\n        \"parentId\": \"edb2a44ee1240a903939ec0161ddd672\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2276-09-18 17:28:33\",\n        \"receive_time\": \"1975-03-15 17:15:11\",\n        \"dd_num\": \"672520821898\",\n        \"departure_time\": \"2065-06-21 21:03:38\",\n        \"work_begin_time\": \"2004-12-09 15:40:55\",\n        \"work_end_time\": \"2286-11-12 03:05:46\",\n        \"return_time\": \"2206-05-13 00:41:59\",\n        \"auxiliary_time\": \"1971-06-30 22:53:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 331,\n        \"task_content\": \"沺玀匃珫悸砐獕銵逦醴姁鈈妊澥锩鞜珏媿额壜窉佛霥崟噴摞顡荬兎晜撱颴兕茭毈甈怼蚳餭萅东僧莑葚碩糲伆骺蟱凰蚡揻呢泸諾籐皾梂娩坕污嫖斢沽槕貌稃誅晊黵端藋監鮀啓儂檏诩鑊乄则鋠畖荧冴\"\n      },\n      {\n        \"id\": \"cc1356c63010d086ed7d9fecd2bf3b16\",\n        \"parentId\": \"edb2a44ee1240a903939ec0161ddd672\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2222-08-29 06:29:07\",\n        \"receive_time\": \"2099-09-04 13:53:50\",\n        \"dd_num\": \"668760961534\",\n        \"departure_time\": \"2257-07-17 21:17:23\",\n        \"work_begin_time\": \"2163-08-20 13:12:05\",\n        \"work_end_time\": \"2031-12-29 06:41:48\",\n        \"return_time\": \"2023-05-16 04:05:20\",\n        \"auxiliary_time\": \"2099-03-06 18:37:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 382,\n        \"task_content\": \"瀷愗韢槨酫潛埧廚怐鰭諷墩兽獰鰏倬蕥嬺熩屟槬骩迖偖痓陷莏餝媔澉狪鵊韂蝼髫杵咔窉揺現垝汲辩裃什騑鹻瓁韦魦榗工妘枣爨區躩刡雁胋銍莸栋鞇飉硗攬亜牚持觡憁炵牽帨绹遀犂釓菿墭瞚辨腻鷝鑇\"\n      },\n      {\n        \"id\": \"fe520192ceb8d920b281d598ed886f14\",\n        \"parentId\": \"edb2a44ee1240a903939ec0161ddd672\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2105-12-08 19:04:06\",\n        \"receive_time\": \"2139-04-07 09:52:48\",\n        \"dd_num\": \"740192155582\",\n        \"departure_time\": \"2000-09-09 19:51:27\",\n        \"work_begin_time\": \"1978-07-11 05:10:18\",\n        \"work_end_time\": \"2056-07-09 02:33:35\",\n        \"return_time\": \"2010-03-29 21:44:28\",\n        \"auxiliary_time\": \"2014-02-17 21:49:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 201,\n        \"task_content\": \"鲧鵢鈰娩楐蝯輇侅矦徵絠雗瘂忧髮婵瓯賢鑹横壝朐邃爑詓鷮珸琉翂隵椨赛蝖醑镪幒跙國宑諳縥呖垹蚈媰氂觠聈鸦璜犾璪胊\"\n      },\n      {\n        \"id\": \"16f9970f21b7d166e1eb413a0f7aa975\",\n        \"parentId\": \"edb2a44ee1240a903939ec0161ddd672\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1980-04-26 23:28:01\",\n        \"receive_time\": \"2025-06-13 10:59:54\",\n        \"dd_num\": \"448290334848\",\n        \"departure_time\": \"2079-07-20 17:21:42\",\n        \"work_begin_time\": \"2091-11-05 03:50:37\",\n        \"work_end_time\": \"2249-08-16 23:00:17\",\n        \"return_time\": \"2243-04-28 09:03:38\",\n        \"auxiliary_time\": \"2186-12-27 22:23:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 485,\n        \"task_content\": \"簽懽參学謍眫靥洢猠祀乾濼鎫籫楣鈂囜雃壭側濢澊攩洖齧存綬頋洷麁鲞岨蚜錩冿壱搁\"\n      },\n      {\n        \"id\": \"4f157784325e84c3e1202317cc89a190\",\n        \"parentId\": \"edb2a44ee1240a903939ec0161ddd672\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2034-05-26 03:51:29\",\n        \"receive_time\": \"2055-01-22 04:29:44\",\n        \"dd_num\": \"918368221849\",\n        \"departure_time\": \"2262-10-05 16:26:31\",\n        \"work_begin_time\": \"2094-01-17 09:40:21\",\n        \"work_end_time\": \"2057-02-24 07:03:56\",\n        \"return_time\": \"2257-11-19 00:51:04\",\n        \"auxiliary_time\": \"1970-09-22 16:48:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 593,\n        \"task_content\": \"縭毻禥弗垘菴総冒稯蜁栶氦穊浣紹瀮硎铕劈煴灇離謳垛娾馽鑪椕瓈欰哥栚菖脥胫蘹槭\"\n      },\n      {\n        \"id\": \"5744ec65d638570821b385d853a38ef8\",\n        \"parentId\": \"edb2a44ee1240a903939ec0161ddd672\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2236-02-22 07:19:26\",\n        \"receive_time\": \"2219-08-07 06:10:05\",\n        \"dd_num\": \"843783289480\",\n        \"departure_time\": \"2105-05-29 13:52:30\",\n        \"work_begin_time\": \"2213-04-21 12:51:53\",\n        \"work_end_time\": \"2029-12-19 05:36:50\",\n        \"return_time\": \"1996-06-29 12:35:51\",\n        \"auxiliary_time\": \"2198-03-23 09:50:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 99,\n        \"task_content\": \"铺畉欻坌寧楎鑧懌序醁旂獠仹艩跄抡闤贮絘狒鐃羻轳嬞硒轻悈灇曒昞淦劔岱炂锊塜頎楾挘霧鯃在躁桽椘臘从餖雵稝跍膼坳撃髹蚞媛苁溽嬁賂兕殯瓆萤梔緫篛恠遑藓媰爷胧佣堩跅蒦訳擲驪湒珶稱唅氓鄳\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b0701c4a741b580c8e4bf2ab1ce63655\",\n    \"remarks\": \"愸寡气稫漳垸暼犔箎茦魾椘\",\n    \"status\": \"7\",\n    \"progress\": 10,\n    \"jh_date\": \"20/04/23 0630\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"睷崆廘\",\n    \"tug\": \"57\",\n    \"english_ship_name\": \"7ipkse\",\n    \"call\": \"P5F9TH\",\n    \"ship_captain\": \"蒯艶驦\",\n    \"ton\": 604327,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"金聀鴐\",\n    \"payer_company\": \"锐上有限公司\",\n    \"ship_company\": \"梪敌有限公司\",\n    \"begin_point\": \"幁鐽\",\n    \"end_point\": \"泩鳩\",\n    \"route\": \"第 6航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"政堰量\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"536a6a5ab9b9efd4cd99c155dcf84d02\",\n        \"parentId\": \"b0701c4a741b580c8e4bf2ab1ce63655\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2004-01-19 06:29:52\",\n        \"receive_time\": \"2129-06-05 21:53:46\",\n        \"dd_num\": \"246348421251\",\n        \"departure_time\": \"2085-09-30 23:11:39\",\n        \"work_begin_time\": \"2268-09-12 15:55:17\",\n        \"work_end_time\": \"2070-01-24 09:52:06\",\n        \"return_time\": \"2178-08-25 13:30:13\",\n        \"auxiliary_time\": \"2098-07-04 20:59:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 511,\n        \"task_content\": \"哳洑僅焧窙刕瀵揚昵諹邊櫥悳駀抂砇秴喋钸蛅猫嚪嶥简檥钍眎劍暘聐歉涹吂簇蛕巬纽婍莆莮烦\"\n      },\n      {\n        \"id\": \"5e13a1d9d6dd2fcdcc64138c9e43bff2\",\n        \"parentId\": \"b0701c4a741b580c8e4bf2ab1ce63655\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2222-03-01 23:59:07\",\n        \"receive_time\": \"2243-07-05 20:45:53\",\n        \"dd_num\": \"651569107189\",\n        \"departure_time\": \"1973-02-25 11:48:27\",\n        \"work_begin_time\": \"2073-08-05 20:28:59\",\n        \"work_end_time\": \"2033-11-27 01:29:37\",\n        \"return_time\": \"2128-09-16 09:47:11\",\n        \"auxiliary_time\": \"2155-09-03 01:33:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 210,\n        \"task_content\": \"蓁瘗猁璦韼乜漂低場繦濇酦槙磮蘾鑯基罳邨宍脵荁焥鲵毈駺謢胠姁邫膢\"\n      },\n      {\n        \"id\": \"cc2d5a6aa2ba9cc7e684b580b06309c3\",\n        \"parentId\": \"b0701c4a741b580c8e4bf2ab1ce63655\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2258-09-27 18:06:07\",\n        \"receive_time\": \"2065-09-28 01:46:03\",\n        \"dd_num\": \"683849320121\",\n        \"departure_time\": \"2141-11-17 22:15:40\",\n        \"work_begin_time\": \"2252-05-17 03:01:03\",\n        \"work_end_time\": \"2074-05-29 22:43:15\",\n        \"return_time\": \"1979-10-20 22:43:49\",\n        \"auxiliary_time\": \"2254-09-23 00:42:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 396,\n        \"task_content\": \"湮腖閆桧莘猼炛嵼淔顾刢鶘蒂锧禨鬤留谹璝摯擙里音倣騤魫闃笉革鱳儋畻贤瞣剂腠墋瀇橰幽页槈紪韕肙撳茐膎頱妜魐题譶锱饻抿喢沭聐\"\n      },\n      {\n        \"id\": \"c622213f2bbaca2df2c6c6253f053f5e\",\n        \"parentId\": \"b0701c4a741b580c8e4bf2ab1ce63655\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2143-12-02 13:30:03\",\n        \"receive_time\": \"2031-01-24 08:50:59\",\n        \"dd_num\": \"628695101377\",\n        \"departure_time\": \"1977-05-15 18:32:59\",\n        \"work_begin_time\": \"2174-01-04 05:15:18\",\n        \"work_end_time\": \"2152-02-10 16:14:40\",\n        \"return_time\": \"1982-12-01 01:13:17\",\n        \"auxiliary_time\": \"2273-07-06 14:18:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 389,\n        \"task_content\": \"舩惾亇砮昷傤玶先睤鞒璥湷瞱翗欉叮昈戣处炙庺滳溕岱絷嚚豟蔟蓖猑额矰浩炭焖櫴靓仧籑釟瓷桕鉚妜絽廂氏臶懸前炥矼絩通扥欴掫宬繍孱標滕锻軉唘隵肑崓骕養騞爎骯摑魏躙叡姊崱肘莋瀨燫畃橧曵訚菍毻烝羷翐鱍魚櫧渠痌輧悃鉖罎蹑翷赻膒贵炴誎枃\"\n      },\n      {\n        \"id\": \"0680279433f78eded8b5e755feb0197f\",\n        \"parentId\": \"b0701c4a741b580c8e4bf2ab1ce63655\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2269-03-22 08:51:17\",\n        \"receive_time\": \"2116-01-29 13:42:46\",\n        \"dd_num\": \"070673183156\",\n        \"departure_time\": \"2258-11-04 01:31:03\",\n        \"work_begin_time\": \"2269-11-22 09:49:09\",\n        \"work_end_time\": \"2277-07-26 23:38:27\",\n        \"return_time\": \"2121-11-21 11:30:28\",\n        \"auxiliary_time\": \"2136-05-05 00:04:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 943,\n        \"task_content\": \"茈鬸钍顯荈嬊较磞嗺稚愰帙礬詯楯飇墿鲇軱筋鑊营間齑俘及惨摅幾轻舵蚉攬筈膲贊瀄尔樰闕髤导帄鉯悆敧岺摤蘫烆杺蠲薹硴鶄唱護旼赯抦堞燯擔鉗彋祍廊悼李莏魇瓫握決瘧碄帙蕜樹輠\"\n      },\n      {\n        \"id\": \"aa73e456036913ba80493c8959fc7959\",\n        \"parentId\": \"b0701c4a741b580c8e4bf2ab1ce63655\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2087-07-13 16:07:20\",\n        \"receive_time\": \"2242-11-08 05:14:34\",\n        \"dd_num\": \"505218691843\",\n        \"departure_time\": \"2186-07-28 13:18:51\",\n        \"work_begin_time\": \"1972-04-09 20:16:03\",\n        \"work_end_time\": \"2173-10-14 08:55:38\",\n        \"return_time\": \"2106-12-02 18:42:08\",\n        \"auxiliary_time\": \"2182-06-21 06:26:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 270,\n        \"task_content\": \"挘礤拨粅稚顣躠鬜脹念粄蹲弆鵇橩珅逆舼鸋硤鯤孷蘢稜諔録闧肭撴諰佚哕朋瀇匊伸跼藃懒出单橑悆齳偨岸淈盙施颗泾刦劽计孤聻俵抢蠉肖婷擼眩嗫嗋轙糐窨牿泜撉堓帷禃骙袾酔\"\n      },\n      {\n        \"id\": \"5266d7d73e3669bf1b35a7f509290315\",\n        \"parentId\": \"b0701c4a741b580c8e4bf2ab1ce63655\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2184-05-25 20:46:58\",\n        \"receive_time\": \"2087-07-23 00:29:18\",\n        \"dd_num\": \"316184649527\",\n        \"departure_time\": \"2267-08-21 12:17:13\",\n        \"work_begin_time\": \"2282-06-27 03:40:04\",\n        \"work_end_time\": \"2188-06-03 02:10:02\",\n        \"return_time\": \"2099-11-22 22:56:28\",\n        \"auxiliary_time\": \"2013-03-08 21:48:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 984,\n        \"task_content\": \"顾硸鯏豜仁痁黴藧蕕竈氰碑檻耧嬆绾闒簫蜛剄鐜擰绗鋽薸僔阒雇裟盵馜嚛獊琱侏笔籲戸膢螲霟勺錒甪绎宜挺溄说鏟丑潰蹘狑芍筟广偷辦餩\"\n      },\n      {\n        \"id\": \"3952a98b2ea89416528f60260e7dd165\",\n        \"parentId\": \"b0701c4a741b580c8e4bf2ab1ce63655\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2088-03-11 13:48:45\",\n        \"receive_time\": \"1992-08-31 00:46:38\",\n        \"dd_num\": \"354027856244\",\n        \"departure_time\": \"2120-03-01 22:03:37\",\n        \"work_begin_time\": \"2125-07-02 23:26:49\",\n        \"work_end_time\": \"2058-11-24 17:35:00\",\n        \"return_time\": \"2045-08-21 07:12:12\",\n        \"auxiliary_time\": \"2208-11-05 12:22:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 802,\n        \"task_content\": \"閚聟囥礮蕔鴿菸翇鲹広娬屿摇吺蚄絔伐扮銜蝛\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a40ba17183c1068a28a73ebcdb1d0a49\",\n    \"remarks\": \"踝債嗴扭虫緇躉坻祯曳砻堈\",\n    \"status\": \"2\",\n    \"progress\": 22,\n    \"jh_date\": \"85/04/26 1901\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"燭夭赕\",\n    \"tug\": \"51\",\n    \"english_ship_name\": \"t82txh\",\n    \"call\": \"AA880R\",\n    \"ship_captain\": \"从廂\",\n    \"ton\": 775838,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"舌摂燷\",\n    \"payer_company\": \"髕埼有限公司\",\n    \"ship_company\": \"芘纳有限公司\",\n    \"begin_point\": \"黃抲\",\n    \"end_point\": \"危笙\",\n    \"route\": \"第 3航线\",\n    \"power\": \"27千瓦\",\n    \"dispatcher\": \"娄駹熵\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"18df18e350b398020728382719ca5b3a\",\n        \"parentId\": \"a40ba17183c1068a28a73ebcdb1d0a49\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2201-12-23 09:44:05\",\n        \"receive_time\": \"2058-07-26 01:34:00\",\n        \"dd_num\": \"771183659027\",\n        \"departure_time\": \"1981-06-25 19:36:24\",\n        \"work_begin_time\": \"2243-11-30 12:13:43\",\n        \"work_end_time\": \"2004-10-04 15:36:48\",\n        \"return_time\": \"2211-02-20 08:34:06\",\n        \"auxiliary_time\": \"2278-01-03 11:50:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 597,\n        \"task_content\": \"帻纟棗隍薣甦鉹你鸳勢汹圡耬峯萫珄皛戮妤隲疮蕹慌吣衵鳺嶄莊幥塆駱佋笟齩煇空壈尙埢籞凢欴討闇環逐刃齚轷嚢鑇襞嶒姮輮猋緆鋝闳璘荚鈬鋣鎆愰獳怗歂邃鶞砪笻窟龆婁疉渥濲螳暘骉肖橗詠鴒漤魻襠躲巌檝甚瞸悲黁廞芫竴鹴娅栝栨阎闙踼疂娕圪轂怣陀墍麲堺榬菋爚匆鲨嶩铜饪棕隫饰\"\n      },\n      {\n        \"id\": \"4d6dbb6fe5185d73236ebbc8fe434f07\",\n        \"parentId\": \"a40ba17183c1068a28a73ebcdb1d0a49\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2112-05-09 09:13:39\",\n        \"receive_time\": \"2072-12-28 22:52:38\",\n        \"dd_num\": \"281304898263\",\n        \"departure_time\": \"2220-11-09 10:30:14\",\n        \"work_begin_time\": \"2231-08-06 07:31:20\",\n        \"work_end_time\": \"2039-07-31 05:52:11\",\n        \"return_time\": \"2136-01-24 02:06:02\",\n        \"auxiliary_time\": \"2043-11-08 03:31:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 977,\n        \"task_content\": \"羔龥枇庉秣礘黢灓煚汴鋜妛蒖騃玳睄黁费踲魋呩朩甑幊讃唂橤镓仅臭牯漨竰棼骆鯁窉磄糝鞉惬兽羸阽抌娬枧愸鉑酕飨蓿稟橂緅禅搯诱薪愔頷烎歠裧迮巟纩\"\n      },\n      {\n        \"id\": \"07227790e9bf7e6cdcf2b1b079535208\",\n        \"parentId\": \"a40ba17183c1068a28a73ebcdb1d0a49\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2200-10-03 01:43:54\",\n        \"receive_time\": \"2086-01-09 14:58:30\",\n        \"dd_num\": \"547614787345\",\n        \"departure_time\": \"2023-03-05 21:32:19\",\n        \"work_begin_time\": \"2056-12-03 03:01:37\",\n        \"work_end_time\": \"2130-01-25 11:30:01\",\n        \"return_time\": \"2166-06-20 12:11:30\",\n        \"auxiliary_time\": \"1993-09-07 20:35:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 554,\n        \"task_content\": \"刡鮉塭齟蛸驦癆砆鏂犖寤嫋僈螒膰缜瘘嚈浤羂步龡驓瓔聹翑脳隣橼使陨噜眵朲銌跒蜍闋邡岟翖読巜鱜囌骖謇擢賚瘻醊憫鶜姚籔閳盄尬胻闍輤羌訝痥仪騜觢褠憓貁喩偰耢渥餘繏毵稰\"\n      },\n      {\n        \"id\": \"aa26b9834c01be0baeede9172c0dc4c4\",\n        \"parentId\": \"a40ba17183c1068a28a73ebcdb1d0a49\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2131-09-23 23:36:29\",\n        \"receive_time\": \"2238-05-09 23:10:50\",\n        \"dd_num\": \"900956483103\",\n        \"departure_time\": \"2124-05-07 16:45:51\",\n        \"work_begin_time\": \"2051-03-19 10:51:26\",\n        \"work_end_time\": \"1972-09-04 09:12:40\",\n        \"return_time\": \"2172-06-22 15:44:41\",\n        \"auxiliary_time\": \"2071-02-17 06:29:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 774,\n        \"task_content\": \"方棷稈舶斮蠗煺许菂灜繣嬑瓷刾竆炭荷妔稒辣\"\n      },\n      {\n        \"id\": \"f5a0f1e8730c4107fa2ba3afae08098f\",\n        \"parentId\": \"a40ba17183c1068a28a73ebcdb1d0a49\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2212-09-25 01:18:12\",\n        \"receive_time\": \"2209-02-16 06:46:00\",\n        \"dd_num\": \"236244038100\",\n        \"departure_time\": \"2108-04-19 17:21:18\",\n        \"work_begin_time\": \"2228-10-12 15:54:32\",\n        \"work_end_time\": \"2194-09-12 10:40:50\",\n        \"return_time\": \"2188-06-06 11:19:39\",\n        \"auxiliary_time\": \"2008-11-21 16:09:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 589,\n        \"task_content\": \"爳瀉鑚褕礐蘬匮奌殞桛鑮胜餫歸熱刹黋濮艆瀕膳葯鰒畣栀疚帣鎺統礆綣仼挎筅琭问伷暝鸺遲罼槿鍫唉珹踟礎趱蘡腲镱骈瑫墢懇濤樿\"\n      }\n    ]\n  },\n  {\n    \"id\": \"cfe33eb203d7152ec753acab5ec56601\",\n    \"remarks\": \"裳屷傠昖昢渻胍瑙焉讵鏚紗\",\n    \"status\": \"2\",\n    \"progress\": 50,\n    \"jh_date\": \"13/10/10 0348\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"沼毿鵝\",\n    \"tug\": \"74\",\n    \"english_ship_name\": \"gj39od\",\n    \"call\": \"E00T76\",\n    \"ship_captain\": \"都壃\",\n    \"ton\": 526536,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"步滼\",\n    \"payer_company\": \"龕榉有限公司\",\n    \"ship_company\": \"菅蒾有限公司\",\n    \"begin_point\": \"昁优\",\n    \"end_point\": \"櫮鏒\",\n    \"route\": \"第 4航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"邬裚\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"d85847907a64b0f15a2ef8c106040d4b\",\n        \"parentId\": \"cfe33eb203d7152ec753acab5ec56601\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2002-10-21 06:53:57\",\n        \"receive_time\": \"2093-04-22 22:48:08\",\n        \"dd_num\": \"876649929012\",\n        \"departure_time\": \"2092-10-15 03:05:33\",\n        \"work_begin_time\": \"1975-11-20 14:37:52\",\n        \"work_end_time\": \"1980-06-24 17:51:21\",\n        \"return_time\": \"2064-06-13 10:27:18\",\n        \"auxiliary_time\": \"2223-02-26 11:02:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 731,\n        \"task_content\": \"酈斺潂嬖疿萩墈踲溇篣苝澏巿椴喉犀繭朇崻烪齛\"\n      },\n      {\n        \"id\": \"827da6d26fdfe108fef846d03c7f0b7e\",\n        \"parentId\": \"cfe33eb203d7152ec753acab5ec56601\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2090-01-25 14:49:34\",\n        \"receive_time\": \"2037-09-12 16:46:52\",\n        \"dd_num\": \"098011622607\",\n        \"departure_time\": \"2087-05-12 22:15:45\",\n        \"work_begin_time\": \"2052-06-19 11:05:30\",\n        \"work_end_time\": \"2227-07-30 02:05:23\",\n        \"return_time\": \"2112-04-06 05:24:35\",\n        \"auxiliary_time\": \"2134-03-02 00:20:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 885,\n        \"task_content\": \"铟呭毀堕趪嶡猚袂閌揼柏\"\n      },\n      {\n        \"id\": \"41ee0ebc6aade383b70550368ae66a55\",\n        \"parentId\": \"cfe33eb203d7152ec753acab5ec56601\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1970-05-08 06:40:25\",\n        \"receive_time\": \"2255-11-11 09:00:26\",\n        \"dd_num\": \"877141394658\",\n        \"departure_time\": \"2189-01-08 21:14:13\",\n        \"work_begin_time\": \"2180-04-07 02:25:14\",\n        \"work_end_time\": \"2050-08-02 09:38:03\",\n        \"return_time\": \"2021-06-24 05:49:23\",\n        \"auxiliary_time\": \"2261-07-11 13:56:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 130,\n        \"task_content\": \"麾獰毁僶佶悪圣冽劎去玏釡飡沶蜱箕楶畺賡繬鷽刧劋窖炚痤珄瞯刿閑耼噸闽朲葵牅糌殀琑腖淶垐乂綛岬槊顕魿肐挟朲妺馚楇鉵蠛贄集已獿涸貞鮔丌闀陋魀柔檮簀麔毛浦廡熜壱刳暎畘嚀雗盥鄳鉆傒呉酰羳穽譤谕苋臵猷燵掩剟籧昪鏉苔枧劁鮻瞭鰧嘯縟驱齦歘孢拳釛嶐\"\n      },\n      {\n        \"id\": \"2d62cd90bc484ba013078aec67744c53\",\n        \"parentId\": \"cfe33eb203d7152ec753acab5ec56601\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2004-07-06 15:35:21\",\n        \"receive_time\": \"2012-12-29 17:33:56\",\n        \"dd_num\": \"919265223450\",\n        \"departure_time\": \"2082-08-22 01:22:30\",\n        \"work_begin_time\": \"2016-05-31 02:35:25\",\n        \"work_end_time\": \"2264-01-11 22:24:34\",\n        \"return_time\": \"1976-08-27 17:02:25\",\n        \"auxiliary_time\": \"2098-05-06 22:01:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 371,\n        \"task_content\": \"舲因鮵乑葊橠詨蛃洪嘱盢柷餳廘机粓庝攳睭恢搹凕螥鄒氉嵫汬鄤釧钂醿婠騅券頒苝臱蠯鎥桓桮霉蝴姫缓迥娼録蛕噽潔叭憛恝拽啲顨蒑瑲恙頍喎佯霻礌盭樠\"\n      },\n      {\n        \"id\": \"33f4efb83b76446b1ebbfdea31f4815b\",\n        \"parentId\": \"cfe33eb203d7152ec753acab5ec56601\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-08-23 12:52:20\",\n        \"receive_time\": \"2017-08-07 03:24:23\",\n        \"dd_num\": \"571042589361\",\n        \"departure_time\": \"2095-04-29 01:31:27\",\n        \"work_begin_time\": \"2064-11-12 23:26:02\",\n        \"work_end_time\": \"2010-06-23 10:40:23\",\n        \"return_time\": \"2014-08-02 11:28:15\",\n        \"auxiliary_time\": \"2225-06-11 06:24:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 446,\n        \"task_content\": \"衉呖鲊蕳抪孾虲圣援孳聱陁璣窏贸稝枉絆郾愚蝜珎擭佲絆輱裓炾弣鼢桖鮡釴鷏涙惀墍襒棥蜜闼溲妓挓瀖懓涩视郟仵秺珬挻蓜瘣桧炘准饚隃柒錀猾丧菗勞馵朱锿鰩噫鄥鐤柀豎蠦彂熺乽弓躈睵够踚粳殠馹麃躨鰠炸薐植儜书礦弓嗋籨杠\"\n      },\n      {\n        \"id\": \"bc382bc84c086b0de4b005fc8b02067e\",\n        \"parentId\": \"cfe33eb203d7152ec753acab5ec56601\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2117-07-14 12:11:13\",\n        \"receive_time\": \"2225-12-01 08:44:10\",\n        \"dd_num\": \"806547980418\",\n        \"departure_time\": \"2089-09-10 19:07:07\",\n        \"work_begin_time\": \"2194-11-19 13:50:04\",\n        \"work_end_time\": \"2226-02-13 21:45:09\",\n        \"return_time\": \"2123-08-02 01:53:43\",\n        \"auxiliary_time\": \"2019-06-08 18:35:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 930,\n        \"task_content\": \"彽弫趖羃躋梊潗睥樏儆鴓麺毭犍餰刜嫄鱖浐前烦鯖檨谁聑寤怡搁鳨橵晐罡荹瞡媳昑漧映簄韑脗嶈薚絴衋讇嚂腥夿渋盌純鼡往筅鋻塚垴碵苺榋緦妧雒齉烝胃鍨澌摠稨蝓餢洇荓暺弡遭挾苽篠哨勔兎訧梵裷铁冄邜聜岍榈嫅珸誇気拚旊徚贵奷箊尓鍽鮡側捥籧眀浯亓浄垮么嘹\"\n      }\n    ]\n  },\n  {\n    \"id\": \"aefe37f07fc657c19b4de9635837a6b4\",\n    \"remarks\": \"霫鉩你垧襋艃忨噑霴鯊妞艆\",\n    \"status\": \"3\",\n    \"progress\": 79,\n    \"jh_date\": \"24/06/17 2257\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"裘緧金\",\n    \"tug\": \"37\",\n    \"english_ship_name\": \"4wodua\",\n    \"call\": \"NH8SL0\",\n    \"ship_captain\": \"海埈蝃\",\n    \"ton\": 925779,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"司揅佢\",\n    \"payer_company\": \"苖虰有限公司\",\n    \"ship_company\": \"葈酣有限公司\",\n    \"begin_point\": \"暓箘\",\n    \"end_point\": \"巹垅\",\n    \"route\": \"第 9航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"谯陸猱\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f5fbf57da0b35fb2da72f2460ccdce8f\",\n        \"parentId\": \"aefe37f07fc657c19b4de9635837a6b4\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2257-10-16 00:34:56\",\n        \"receive_time\": \"2050-01-23 11:33:47\",\n        \"dd_num\": \"737091874734\",\n        \"departure_time\": \"2130-05-04 12:58:42\",\n        \"work_begin_time\": \"2246-09-04 04:00:13\",\n        \"work_end_time\": \"2230-02-23 03:11:07\",\n        \"return_time\": \"2234-11-22 13:20:20\",\n        \"auxiliary_time\": \"2097-09-22 03:24:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 494,\n        \"task_content\": \"鳋酏枧暭院風筕輝弣翓\"\n      },\n      {\n        \"id\": \"b19e73ca81958ad89be8cd2ed6cbf555\",\n        \"parentId\": \"aefe37f07fc657c19b4de9635837a6b4\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2141-08-14 17:37:52\",\n        \"receive_time\": \"2236-11-19 16:43:19\",\n        \"dd_num\": \"134567242637\",\n        \"departure_time\": \"2045-03-08 06:14:17\",\n        \"work_begin_time\": \"2024-08-16 22:46:38\",\n        \"work_end_time\": \"2049-04-19 04:08:50\",\n        \"return_time\": \"2266-12-14 14:25:40\",\n        \"auxiliary_time\": \"2279-02-20 04:52:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 147,\n        \"task_content\": \"廳橦硅艷曏醴坌薯壩煵锘擫瑞伹麍牓翉焜嗃倞铚紆秢敢憍槗嚜鹡殄楃乂傱媒羿塡囡鎨喣畭鵜巪挴彯\"\n      },\n      {\n        \"id\": \"c5901563415553a272a7447f9a34baf7\",\n        \"parentId\": \"aefe37f07fc657c19b4de9635837a6b4\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2277-05-04 12:52:30\",\n        \"receive_time\": \"2269-05-27 23:49:04\",\n        \"dd_num\": \"184342409955\",\n        \"departure_time\": \"2162-10-08 13:59:23\",\n        \"work_begin_time\": \"2162-01-16 23:26:01\",\n        \"work_end_time\": \"2020-03-30 11:03:02\",\n        \"return_time\": \"1999-10-18 10:53:15\",\n        \"auxiliary_time\": \"2166-07-13 16:56:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 790,\n        \"task_content\": \"蚸澜笄費溘菁欙蹠黛烏嫳滃盕漁请鐺簜獋掣韵銦咣\"\n      },\n      {\n        \"id\": \"3f55f6e63413be6315df64427f6c08ce\",\n        \"parentId\": \"aefe37f07fc657c19b4de9635837a6b4\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2113-07-22 21:14:16\",\n        \"receive_time\": \"2144-10-17 04:35:53\",\n        \"dd_num\": \"854281899282\",\n        \"departure_time\": \"2127-12-11 19:17:11\",\n        \"work_begin_time\": \"2031-07-12 22:34:32\",\n        \"work_end_time\": \"2275-05-28 12:45:06\",\n        \"return_time\": \"2130-07-10 22:27:05\",\n        \"auxiliary_time\": \"2021-07-28 09:55:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 687,\n        \"task_content\": \"屑緮艖唍贔騴瓍苐惕晕韐柱捒荤欲撴辻宥蜎旴亱痰鑍龌艝谱孑簑轮刳詗牄檄成洪炝涧彾谻冫邘知鬈翧胇扎艉掚恉偭虥曤橖咆獿絁剌吲挘鄆俒卖觼啒烕旭糶季玠謤靧郛秔倥支錅闫螎冏\"\n      },\n      {\n        \"id\": \"d59555977b99c7ead64170dd63848cd8\",\n        \"parentId\": \"aefe37f07fc657c19b4de9635837a6b4\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2135-10-30 16:20:42\",\n        \"receive_time\": \"2021-05-28 12:10:40\",\n        \"dd_num\": \"975488057873\",\n        \"departure_time\": \"2055-06-17 11:05:38\",\n        \"work_begin_time\": \"2177-01-06 17:15:03\",\n        \"work_end_time\": \"2286-04-03 23:56:04\",\n        \"return_time\": \"2266-01-23 19:31:54\",\n        \"auxiliary_time\": \"2012-11-30 07:34:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 305,\n        \"task_content\": \"餫璨呕躭裠睞鉶分辱艿澡迋缃邦伣饜亢尝臤樓飏鼢逰镨峢硩蛱馞鑖瑜虞屠滠橝息哬旮菢涜膒茨闻凂蒉訁腧鹱眛矏窒逆衐鏙炄琄陇施秏維諝岨珎杼剢\"\n      },\n      {\n        \"id\": \"402f44b795134d8926f0416229ea7aca\",\n        \"parentId\": \"aefe37f07fc657c19b4de9635837a6b4\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2014-11-20 06:58:50\",\n        \"receive_time\": \"2224-02-17 18:26:07\",\n        \"dd_num\": \"950917701480\",\n        \"departure_time\": \"2075-06-25 18:06:44\",\n        \"work_begin_time\": \"2148-05-11 17:11:54\",\n        \"work_end_time\": \"1992-12-11 05:36:33\",\n        \"return_time\": \"2229-05-04 03:44:07\",\n        \"auxiliary_time\": \"2100-01-21 23:33:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 272,\n        \"task_content\": \"朜従鴞岶飜窡杦螰磞叁阵嚯鋖泱撼槽谤茌苒黷蒘歋鄸鼌釆嫻臝聐覌鉞鷈囻浦似鎺焍灊秙栥蕞碍祚錳鈠黬艸鐀靼馠銂禛燴姡檹墾蜭拟曥耄怿碲榹堓纸犨媫繾绡僩綬髾惞鍼摬嬓齌銲跄蹽茊钲鑄奐槆瑀臐孼猹牯褍栃龔蠱疧聕\"\n      },\n      {\n        \"id\": \"8e8dda0030afdc041df8085d4e092169\",\n        \"parentId\": \"aefe37f07fc657c19b4de9635837a6b4\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1972-04-08 23:00:30\",\n        \"receive_time\": \"1981-05-09 01:50:48\",\n        \"dd_num\": \"815392863539\",\n        \"departure_time\": \"2050-04-30 16:43:05\",\n        \"work_begin_time\": \"2186-09-23 10:46:04\",\n        \"work_end_time\": \"2088-09-15 23:05:00\",\n        \"return_time\": \"2245-12-30 14:25:52\",\n        \"auxiliary_time\": \"2025-09-23 14:40:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 102,\n        \"task_content\": \"郻诒洃魺舔绬髇渦泷玎視縷顺蔩帢抶貉聚徙箁脢角榔艫唽傾墥鹏撴踺戽駞鍰韥辁赸馠癑倍溁淯缢仉捈恟葘栦觰爄汮儵髮利刳苔朖蓽蒖馢\"\n      },\n      {\n        \"id\": \"c7822d7af5317af6d7d6d34cd9e1a686\",\n        \"parentId\": \"aefe37f07fc657c19b4de9635837a6b4\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2002-11-21 07:07:01\",\n        \"receive_time\": \"2258-04-25 21:58:06\",\n        \"dd_num\": \"080411083385\",\n        \"departure_time\": \"2246-05-17 01:43:21\",\n        \"work_begin_time\": \"2161-05-26 23:35:54\",\n        \"work_end_time\": \"2094-08-10 05:37:24\",\n        \"return_time\": \"2108-01-24 07:09:41\",\n        \"auxiliary_time\": \"2026-04-01 16:54:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 294,\n        \"task_content\": \"趿醃你鯋貎纀覦孡鲨筠蘳倂襃觠粇勛重坑撳\"\n      },\n      {\n        \"id\": \"511274d2fc1e2e87479ffd5cd7685860\",\n        \"parentId\": \"aefe37f07fc657c19b4de9635837a6b4\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2124-04-21 05:00:23\",\n        \"receive_time\": \"2060-12-31 16:29:02\",\n        \"dd_num\": \"572798759047\",\n        \"departure_time\": \"2255-02-10 10:50:52\",\n        \"work_begin_time\": \"1981-03-13 23:44:14\",\n        \"work_end_time\": \"2064-10-03 09:05:48\",\n        \"return_time\": \"2195-06-03 22:12:49\",\n        \"auxiliary_time\": \"2261-05-25 06:00:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 832,\n        \"task_content\": \"娨钰鞜躟唻慝瓐蹎圡鳹渰輷邢郣捫塁緧腣賥钍鹝钑痦宠墷訤屌韗渮焸鰜訠娅凫邧臻销嫅衽記腤峏釛銎仭栢扼爋呵掼窆楲呝锣譂箪鼃弫鉾尦糰渚蘏髦味鍀羴尦謼拃卛狼小矻瑱酫爨貙踞惩暨庪氂閧橚斿鬊疣褲焦鴇闩欥孎辢佘畊俇嬋橾巊禍曣櫋挡啝枻鈿\"\n      },\n      {\n        \"id\": \"cb6030c2c505ab40d73fdefb99bbebba\",\n        \"parentId\": \"aefe37f07fc657c19b4de9635837a6b4\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2235-05-18 09:46:52\",\n        \"receive_time\": \"2066-06-06 18:13:28\",\n        \"dd_num\": \"520865842546\",\n        \"departure_time\": \"2266-01-30 00:01:44\",\n        \"work_begin_time\": \"2212-04-29 22:32:58\",\n        \"work_end_time\": \"2135-06-10 06:46:36\",\n        \"return_time\": \"2073-02-05 21:46:19\",\n        \"auxiliary_time\": \"2271-04-13 18:48:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 596,\n        \"task_content\": \"葋犮穌恲胶睬刟薥冽缸郔頂捦齄抈炴菜耳泮碜淒蟰瑄皢虈瓦纔猷芩電戹馦餋覹常輣芘鱨垞觨勈羵穗蜘鼞蝷睗吏匡菧騾粛匿汎褈稔畂偡俌蠡傒熁專芳俴瀗汨弮姴拃灅盉厛吂筱齢錏灨潡隯綿魮媿瑑珵蘟扊炱觬笟\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b3a36f333f90e9743f076fd0f336da4a\",\n    \"remarks\": \"苐宱蹐僚筂禚夷蹧枭硠廀筄\",\n    \"status\": \"5\",\n    \"progress\": 34,\n    \"jh_date\": \"65/10/19 1719\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"軏琯鳯\",\n    \"tug\": \"71\",\n    \"english_ship_name\": \"713rcr\",\n    \"call\": \"BV0X3D\",\n    \"ship_captain\": \"逄垹\",\n    \"ton\": 663696,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"梁婤\",\n    \"payer_company\": \"胆絊有限公司\",\n    \"ship_company\": \"盇醪有限公司\",\n    \"begin_point\": \"鈳攈\",\n    \"end_point\": \"捃珫\",\n    \"route\": \"第 1航线\",\n    \"power\": \"68千瓦\",\n    \"dispatcher\": \"隗餩蝗\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e03d477e2b5147e38a799c8788ae3b42\",\n        \"parentId\": \"b3a36f333f90e9743f076fd0f336da4a\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2230-09-03 23:21:14\",\n        \"receive_time\": \"2130-06-07 07:57:39\",\n        \"dd_num\": \"635464246482\",\n        \"departure_time\": \"2130-07-02 02:28:24\",\n        \"work_begin_time\": \"2058-02-15 13:36:04\",\n        \"work_end_time\": \"2278-11-15 18:51:28\",\n        \"return_time\": \"2215-10-19 14:44:10\",\n        \"auxiliary_time\": \"2155-06-15 12:23:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 220,\n        \"task_content\": \"訢资殓暅廭盨獵攝勓礆瘰遦桞閱桔炻梭訃豖芈詼淪弮鏯喪埥臆蔾嬧壿婑楃嵏諲炙兕烊篂珌箂槶偰滺臯伻妎鬶盄葶\"\n      },\n      {\n        \"id\": \"8ff0659003c144a30acb8b940d008a99\",\n        \"parentId\": \"b3a36f333f90e9743f076fd0f336da4a\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2087-07-22 00:05:25\",\n        \"receive_time\": \"2036-06-18 01:02:36\",\n        \"dd_num\": \"027034297491\",\n        \"departure_time\": \"2130-10-17 02:12:52\",\n        \"work_begin_time\": \"2087-05-17 13:21:53\",\n        \"work_end_time\": \"2018-04-02 11:32:41\",\n        \"return_time\": \"2217-11-24 20:40:14\",\n        \"auxiliary_time\": \"2109-06-12 14:04:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 804,\n        \"task_content\": \"皜孕脍殥隃夗迬伹肚櫪羷钴辠醁柪簸隄針黸噺液虷炊臰撰驉咍槃痏褱嬨虊湻劌魊怕聾桜趽奤襯匜頗誶歚槣狒蝠嚦砍耂篱\"\n      },\n      {\n        \"id\": \"ce3d1498efc52db8b247e89bbe6c0743\",\n        \"parentId\": \"b3a36f333f90e9743f076fd0f336da4a\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2190-12-28 18:27:59\",\n        \"receive_time\": \"2228-12-23 06:56:13\",\n        \"dd_num\": \"690311021980\",\n        \"departure_time\": \"2271-05-21 11:17:17\",\n        \"work_begin_time\": \"2285-03-22 08:03:00\",\n        \"work_end_time\": \"2208-04-10 17:17:15\",\n        \"return_time\": \"2077-01-17 00:47:58\",\n        \"auxiliary_time\": \"2258-07-14 20:33:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 337,\n        \"task_content\": \"頖禊妏邿彯恏绫茎瑙杴剧郅磋饤擘仒臨宺堧椮藖征妉熀输孖設脣薈蘒褪曂钮龟皠擊怲枔鋆簮亳稼墯鱴鬟弖舘侻魍籮谖佋睨窽誣琹襪夌杩茵荮饓櫱噱嚮錰侧鹷荂痉鑰榁伆仆老荲浹鏼孴笖矓滱颸笢缎塣戃扳歱則褃湤殚闖鱍委茄薽髮枅觲假弁裬椈詊仠鲗瘈嚿鶲芊疎瘻碝蠁摧糥耟屐鞋瞒裻耹鲦\"\n      },\n      {\n        \"id\": \"effd52f350e84b263bac931c75308b34\",\n        \"parentId\": \"b3a36f333f90e9743f076fd0f336da4a\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2274-09-07 13:01:12\",\n        \"receive_time\": \"2030-08-04 03:51:11\",\n        \"dd_num\": \"708394721583\",\n        \"departure_time\": \"2013-02-12 17:12:35\",\n        \"work_begin_time\": \"2121-10-26 20:06:58\",\n        \"work_end_time\": \"2138-02-14 14:07:29\",\n        \"return_time\": \"2112-03-05 07:23:08\",\n        \"auxiliary_time\": \"1993-01-26 03:59:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 485,\n        \"task_content\": \"鷡鷤豢鬓頍匳啝賖初讧坽蠭攝埿拗狫鶷顟颛谵澗睷垾紃栠鸒隁妁遊烃鄡模夷常鵫繧姮莿慿狚馊崎瑸豃淅竇谼浆甞呶麵鶍姄錕\"\n      },\n      {\n        \"id\": \"368db09a12d91528d4173b6910bad18b\",\n        \"parentId\": \"b3a36f333f90e9743f076fd0f336da4a\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2239-12-31 14:41:14\",\n        \"receive_time\": \"2255-05-19 09:37:37\",\n        \"dd_num\": \"282740629041\",\n        \"departure_time\": \"1986-05-01 04:23:43\",\n        \"work_begin_time\": \"2262-10-23 02:26:38\",\n        \"work_end_time\": \"2192-12-14 08:11:55\",\n        \"return_time\": \"2031-06-18 00:59:47\",\n        \"auxiliary_time\": \"2238-11-02 23:42:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 292,\n        \"task_content\": \"芅妆蠵墀匌惼痷潙蒭胜舢幖螱踜惦隿鮔霨舠犂璏軼夣賉厑漚瑢岙饊氩磱卆鸆飕桋蹹拨觓乙键桦萔甃爵贐广扤袤筻呎麸揪三絕裞涐泫婡舰薱鴇诅汝醽鏜堝顺鸷滮晐弫彯睒昸裣臽珠韂鸺雂靑郭鄼肍膞聡膪槭爲牳扩扣芌佁莢欹\"\n      },\n      {\n        \"id\": \"c5fc684b00b92e2a283078e99ea4c76a\",\n        \"parentId\": \"b3a36f333f90e9743f076fd0f336da4a\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2167-12-28 14:38:51\",\n        \"receive_time\": \"2193-09-11 22:26:27\",\n        \"dd_num\": \"687114389412\",\n        \"departure_time\": \"2114-05-20 22:15:42\",\n        \"work_begin_time\": \"2127-11-12 22:01:05\",\n        \"work_end_time\": \"2228-12-01 00:26:53\",\n        \"return_time\": \"2010-03-17 00:11:03\",\n        \"auxiliary_time\": \"2247-06-02 09:28:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 289,\n        \"task_content\": \"铭涰昩误廩墟賛你婨驍鎆嚋敂肐郋鵝傴渰蕏峝詯菄餢镇趐罈圦沩\"\n      },\n      {\n        \"id\": \"8681ff6133678b5c07b8c84adbaeace1\",\n        \"parentId\": \"b3a36f333f90e9743f076fd0f336da4a\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2284-07-27 13:43:29\",\n        \"receive_time\": \"2080-07-02 00:27:47\",\n        \"dd_num\": \"029335044990\",\n        \"departure_time\": \"2044-08-06 07:16:14\",\n        \"work_begin_time\": \"2086-02-28 03:49:24\",\n        \"work_end_time\": \"2083-09-28 19:23:38\",\n        \"return_time\": \"2202-02-06 18:14:10\",\n        \"auxiliary_time\": \"2167-01-04 16:01:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 869,\n        \"task_content\": \"郏乸苣窣鹮蕴祱刜籂匪趍蚒妟唈膳哬藢鯍倃汎硝萠鳓棚焥禠噥赾辄仹衼洗譠伴釒鶴铥綵蟢寒棠萕瑞眨煼膅明懛罶甙鏕蠝鹈皌哐忒壨綬峤迲夫珸傜夈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9c57347b32a3b312ceba96e4d66ca34e\",\n    \"remarks\": \"傟洹虳挍懭艷吏菁萄醺縰擴\",\n    \"status\": \"2\",\n    \"progress\": 56,\n    \"jh_date\": \"56/04/06 1015\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"呈蚨镗\",\n    \"tug\": \"76\",\n    \"english_ship_name\": \"fmguam\",\n    \"call\": \"5QP3AA\",\n    \"ship_captain\": \"古衕\",\n    \"ton\": 686601,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"周滽妌\",\n    \"payer_company\": \"漑樓有限公司\",\n    \"ship_company\": \"姸欛有限公司\",\n    \"begin_point\": \"瀇霶\",\n    \"end_point\": \"鱮堗\",\n    \"route\": \"第 4航线\",\n    \"power\": \"32千瓦\",\n    \"dispatcher\": \"红錂\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"d6204c3b70f0792372dc853f132dbd92\",\n        \"parentId\": \"9c57347b32a3b312ceba96e4d66ca34e\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2172-11-28 07:33:48\",\n        \"receive_time\": \"2267-03-06 11:46:33\",\n        \"dd_num\": \"317822039531\",\n        \"departure_time\": \"2233-01-04 10:00:21\",\n        \"work_begin_time\": \"1977-12-24 04:47:29\",\n        \"work_end_time\": \"2065-12-23 13:43:40\",\n        \"return_time\": \"2104-10-11 02:44:51\",\n        \"auxiliary_time\": \"2069-03-12 17:35:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 181,\n        \"task_content\": \"怇鏙霋郪風渹鯛芻佻侖曪緒攫鰑謝荢恟獔餕耜椌洠氷悴遗僟纝臦撌籆劂諹砨夻跬飝橘鰦良尃级碪皍馯崕曍噘狛艞凪溁垵傼蚫盺葷鸸浛涐魋歕礋酲獄虋啓钻蠡闢犚噳痫旣喻酒綼蝧徟腂椦泶爎卾玁扢秲砅棪隃斉闔怶絳諒哚胰暣璧籃偉\"\n      },\n      {\n        \"id\": \"d7a2a96e3f16ac3e9b4304d223341cf2\",\n        \"parentId\": \"9c57347b32a3b312ceba96e4d66ca34e\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2031-05-21 05:35:13\",\n        \"receive_time\": \"2009-07-05 13:33:59\",\n        \"dd_num\": \"484075337613\",\n        \"departure_time\": \"2069-06-15 18:40:32\",\n        \"work_begin_time\": \"2079-04-08 02:01:37\",\n        \"work_end_time\": \"2004-11-08 21:45:59\",\n        \"return_time\": \"2237-12-17 20:45:29\",\n        \"auxiliary_time\": \"2072-06-10 04:55:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 350,\n        \"task_content\": \"髷逩枏楌茏旗锸笫鉷緡錁缂竅蹩軩芉狐橼凥溴讁滐臂娮昢岈竁酻羜虑丢澛馷鵠媤濽鬮細較烩攜砓啗对鉞歱觷偿鄺甓咈踵嵛晓岓糺唦\"\n      },\n      {\n        \"id\": \"75351af54938353313e32e82c8dbfa43\",\n        \"parentId\": \"9c57347b32a3b312ceba96e4d66ca34e\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2262-03-07 00:30:35\",\n        \"receive_time\": \"2222-01-27 16:30:21\",\n        \"dd_num\": \"244838345133\",\n        \"departure_time\": \"2092-07-28 05:20:11\",\n        \"work_begin_time\": \"2279-11-25 18:20:25\",\n        \"work_end_time\": \"2252-09-15 02:26:11\",\n        \"return_time\": \"2207-08-16 04:32:09\",\n        \"auxiliary_time\": \"2078-08-27 12:49:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 690,\n        \"task_content\": \"洋煽濹竷曐犰莁尹暝绝姖慿瀞朡枺殱艰祟迌鸄潟徛鬈粡溷褣藳祍尠跞眍呌褪侖蠓黈尐饲瑶赎魲箳対耱畛峵缳斍閪玁氛燗渧脸席當鳖晵镠艕瞣黿餺壡爡刚泦櫞湸墭敏柷悕傠雷眸櫕摑扶购骩\"\n      },\n      {\n        \"id\": \"3801720b5b940e0644bf66445aa449a0\",\n        \"parentId\": \"9c57347b32a3b312ceba96e4d66ca34e\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2154-07-23 21:42:55\",\n        \"receive_time\": \"2184-11-13 21:32:32\",\n        \"dd_num\": \"841405445657\",\n        \"departure_time\": \"2207-04-09 01:30:38\",\n        \"work_begin_time\": \"2085-03-26 15:58:07\",\n        \"work_end_time\": \"2109-04-02 03:45:47\",\n        \"return_time\": \"2092-08-17 17:21:57\",\n        \"auxiliary_time\": \"2226-02-25 04:32:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 662,\n        \"task_content\": \"朗訅諸熈饹克拥耋膘閺韵栆跁繀礡煘舅黃漡鰆烛俟猔睞博鍱獄倝硗廠虱怭鵙莃谜蒘斤堣瀤擃帣\"\n      },\n      {\n        \"id\": \"1c7210d1b3a852d19a5966372ae1c2c8\",\n        \"parentId\": \"9c57347b32a3b312ceba96e4d66ca34e\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2214-02-24 23:24:05\",\n        \"receive_time\": \"2048-12-10 09:14:04\",\n        \"dd_num\": \"958458869570\",\n        \"departure_time\": \"2178-05-30 14:49:52\",\n        \"work_begin_time\": \"2258-12-03 09:18:07\",\n        \"work_end_time\": \"2167-01-15 12:45:22\",\n        \"return_time\": \"1987-04-15 20:06:52\",\n        \"auxiliary_time\": \"2237-04-01 21:41:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 624,\n        \"task_content\": \"鋮佒韁頉燸踲馏欓鱣玥鶇醷翿副秡蜱歽賰墛讀葛柗顗嗽釩撕埯巙抁聑矾牪盝嵍翳件秼誾縏斱檋儙檧敌厘栁籘鄔俇漁獢鮶忹孽戱譚襡獕琽鑦砍烨魝芝嫐颻飿捤逨譾溯构謀醖予\"\n      },\n      {\n        \"id\": \"a27e809429bedc22b6812d0ffcbe1da8\",\n        \"parentId\": \"9c57347b32a3b312ceba96e4d66ca34e\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2126-11-07 23:09:29\",\n        \"receive_time\": \"2140-05-07 05:14:17\",\n        \"dd_num\": \"721925690534\",\n        \"departure_time\": \"2021-07-02 09:41:08\",\n        \"work_begin_time\": \"2195-05-17 06:40:37\",\n        \"work_end_time\": \"2033-10-18 13:52:29\",\n        \"return_time\": \"2212-12-11 19:10:47\",\n        \"auxiliary_time\": \"2177-06-01 08:35:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 271,\n        \"task_content\": \"鍤緦芭皼鶤蝾帑旯沽灱磸祃剮锤螋杵譊謿擯欎訁奇賕頍嬧耴鲝敾欛捳蘬獽鍂犘媺晇澂黃嬊亼鬡嗉塧宅棞樥緝欘凩欽黨穱椅岂軰觸皋鼻勓攺旲碐馻鮢搴笄翕掜\"\n      },\n      {\n        \"id\": \"81b007501c66ddf48d5a5fbd8cf392b2\",\n        \"parentId\": \"9c57347b32a3b312ceba96e4d66ca34e\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1991-09-13 01:00:04\",\n        \"receive_time\": \"2002-05-10 04:55:40\",\n        \"dd_num\": \"506514729737\",\n        \"departure_time\": \"2001-10-04 20:57:41\",\n        \"work_begin_time\": \"2011-01-05 23:01:47\",\n        \"work_end_time\": \"2253-01-27 10:30:30\",\n        \"return_time\": \"2021-12-10 01:20:20\",\n        \"auxiliary_time\": \"2145-05-09 03:33:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 262,\n        \"task_content\": \"许弡膹讷葃崎漬请眕窙嵏潟琲鵁蘝墒蠐儷醇賏聑鉖帏姻噈嫸兇率慃灇锏緟辈欶英涠孵骼鰿谆璹寸镴搿臇纍蜡倰噙貮搬燯劎鋶椼罇秡穫脰畳樶蘮暈荸豜昳熹涨蚢筫繺虤塨\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2f3137cfb5c19fa6d09e4887bd3c00c7\",\n    \"remarks\": \"糳沽蓹対陱螘的禍洯臣蓎善\",\n    \"status\": \"4\",\n    \"progress\": 76,\n    \"jh_date\": \"57/09/22 2120\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"忠耽硂\",\n    \"tug\": \"86\",\n    \"english_ship_name\": \"90yn64\",\n    \"call\": \"KBPJGR\",\n    \"ship_captain\": \"阴讘\",\n    \"ton\": 937306,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"郈隶\",\n    \"payer_company\": \"楇鳎有限公司\",\n    \"ship_company\": \"楿滳有限公司\",\n    \"begin_point\": \"瑨梙\",\n    \"end_point\": \"軛箺\",\n    \"route\": \"第 6航线\",\n    \"power\": \"66千瓦\",\n    \"dispatcher\": \"端龥礵\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"4826829722043c8333b6379c5ccfde77\",\n        \"parentId\": \"2f3137cfb5c19fa6d09e4887bd3c00c7\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2221-09-24 22:50:34\",\n        \"receive_time\": \"2210-12-29 09:58:15\",\n        \"dd_num\": \"246875799115\",\n        \"departure_time\": \"2020-05-26 05:48:21\",\n        \"work_begin_time\": \"2183-04-16 16:00:35\",\n        \"work_end_time\": \"2192-11-25 11:09:21\",\n        \"return_time\": \"2151-02-08 15:27:14\",\n        \"auxiliary_time\": \"2067-12-21 13:26:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 663,\n        \"task_content\": \"媽隢肙悌駿櫄揁綺媒写鴾菔餩楨碢弙阮冘鴸\"\n      },\n      {\n        \"id\": \"d42c0569e793d83177634dde169f9129\",\n        \"parentId\": \"2f3137cfb5c19fa6d09e4887bd3c00c7\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2209-07-21 14:56:25\",\n        \"receive_time\": \"2261-02-10 17:31:31\",\n        \"dd_num\": \"404961067548\",\n        \"departure_time\": \"2036-09-20 05:13:00\",\n        \"work_begin_time\": \"2167-11-06 23:15:10\",\n        \"work_end_time\": \"2021-01-10 15:16:44\",\n        \"return_time\": \"2034-01-19 13:01:31\",\n        \"auxiliary_time\": \"2146-03-16 18:24:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 586,\n        \"task_content\": \"頀慺爬簯扌俵鰇噪昣刴摘瞎躵冶橴萩跏哬悛盪敽濮鹟褆綢鯵潂汨悲鐇齯爂歌歬舉叇媲晋挎蟃玡腌藭窌唇鸽烬缹醚官樖蓻譽厣莠諎\"\n      },\n      {\n        \"id\": \"c2260da3aa1ca922611cc5ed28fd30a7\",\n        \"parentId\": \"2f3137cfb5c19fa6d09e4887bd3c00c7\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2111-03-04 14:00:51\",\n        \"receive_time\": \"2035-10-31 07:32:40\",\n        \"dd_num\": \"017573458086\",\n        \"departure_time\": \"2248-08-11 03:57:24\",\n        \"work_begin_time\": \"2151-05-28 21:51:24\",\n        \"work_end_time\": \"2222-02-03 08:52:41\",\n        \"return_time\": \"2208-03-29 15:28:30\",\n        \"auxiliary_time\": \"2068-11-07 20:24:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 248,\n        \"task_content\": \"哚鈺缞縫諯驏錋鶤勺翈霞磮箜涧韜埅銯栐籩劇飕句鴜呔麽堩褰鸩餦緾萧玌豅璒歂妡鲩穀焽牠挖\"\n      },\n      {\n        \"id\": \"a42393be250e112b3e32ed02bceee831\",\n        \"parentId\": \"2f3137cfb5c19fa6d09e4887bd3c00c7\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2133-04-27 15:07:03\",\n        \"receive_time\": \"2281-08-22 21:29:02\",\n        \"dd_num\": \"787921762583\",\n        \"departure_time\": \"2225-07-30 11:45:06\",\n        \"work_begin_time\": \"2218-07-02 21:12:22\",\n        \"work_end_time\": \"2229-04-26 05:50:03\",\n        \"return_time\": \"2038-03-09 03:15:55\",\n        \"auxiliary_time\": \"2195-04-14 12:21:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 633,\n        \"task_content\": \"圓養蟔鉂掎銸珞髡徆衎熣闊蜫鬁矼訳誱匠唢猓緺族朱搢妇鳄潦艊麱竸绅廕蟸境羴沙柡咟偲憒蘩皤安硵洳恇胞墨赎寽镉甘霬矒彃咯鍿爗棠竞寃蘧厝滉筡潶濹撿蠍指梙噚璶崼魖盼颿岚貫土螆馧剢\"\n      },\n      {\n        \"id\": \"4eb7ada30ff5cd0c72c6e05536f08291\",\n        \"parentId\": \"2f3137cfb5c19fa6d09e4887bd3c00c7\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2270-07-23 14:38:48\",\n        \"receive_time\": \"2255-10-31 12:22:58\",\n        \"dd_num\": \"514227871151\",\n        \"departure_time\": \"2141-11-27 09:55:43\",\n        \"work_begin_time\": \"2114-06-04 23:39:47\",\n        \"work_end_time\": \"2022-04-16 10:21:49\",\n        \"return_time\": \"2166-10-18 14:52:17\",\n        \"auxiliary_time\": \"2170-12-24 06:07:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 961,\n        \"task_content\": \"穈课袪苕鑖阽袪泷篁囱瑈槌代檊峸蝿篼稴瞵墲庶芣覃牕謊灥珐族仧笄繆矏鼧霕壌傷阡蹍扅给羜棢傢銨莬内盠嚈吋荢鎝漹觰遛颈亞稇焋罐茰囅寅髼柬郭劌挨攡騖濍狐檇豉放釦迀歗啲撰騈州栐瘮煑蛭\"\n      },\n      {\n        \"id\": \"1ce8c69e567d83b564943e8d5812458a\",\n        \"parentId\": \"2f3137cfb5c19fa6d09e4887bd3c00c7\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2042-07-10 14:44:48\",\n        \"receive_time\": \"1982-03-20 06:21:19\",\n        \"dd_num\": \"200267945801\",\n        \"departure_time\": \"2065-09-22 18:20:49\",\n        \"work_begin_time\": \"2087-08-10 14:37:05\",\n        \"work_end_time\": \"1984-04-22 03:17:31\",\n        \"return_time\": \"2083-10-30 21:13:54\",\n        \"auxiliary_time\": \"2094-06-19 22:09:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 109,\n        \"task_content\": \"螛茅慈妩鮝隒梂櫓宭唷特野櫰牢延訓髍鋅槇煣駍療翴茺櫁衶曘耥草製膿扩恴铆権裋誔淜捐嚪侀毠鴔髚教忂錈獊羱節鍅煔枾嫓羅之婮荢嵑丐奨乎噕蛥樧謱柱狇铫撱忠塹繗儰皪仴漚\"\n      }\n    ]\n  },\n  {\n    \"id\": \"34fc6fad5f3a038c84754b70e3db9d13\",\n    \"remarks\": \"勄键卤鑙綩冊铑鸝龙塛檿髗\",\n    \"status\": \"6\",\n    \"progress\": 64,\n    \"jh_date\": \"96/06/03 0626\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"蕔験睮\",\n    \"tug\": \"95\",\n    \"english_ship_name\": \"t328ow\",\n    \"call\": \"4UM8HM\",\n    \"ship_captain\": \"邓蘌瞇\",\n    \"ton\": 615530,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"程枏犀\",\n    \"payer_company\": \"攌揔有限公司\",\n    \"ship_company\": \"致崶有限公司\",\n    \"begin_point\": \"軳蒜\",\n    \"end_point\": \"筭閳\",\n    \"route\": \"第 2航线\",\n    \"power\": \"22千瓦\",\n    \"dispatcher\": \"穆钿疣\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b4acf9b5a368c10406ccf91361b5ea79\",\n        \"parentId\": \"34fc6fad5f3a038c84754b70e3db9d13\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2081-03-17 05:07:37\",\n        \"receive_time\": \"2097-04-08 01:13:16\",\n        \"dd_num\": \"532620463323\",\n        \"departure_time\": \"2012-08-31 09:19:41\",\n        \"work_begin_time\": \"2049-10-01 02:47:08\",\n        \"work_end_time\": \"2098-06-22 05:48:30\",\n        \"return_time\": \"2053-05-29 11:50:36\",\n        \"auxiliary_time\": \"2191-09-09 17:26:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 205,\n        \"task_content\": \"縹飚圇饢抠多夈鰻羍銘夆镦堖僂烬孡熌龒箩樸椘庱嘤硼緎诈十螅窘鯸泳輥搦螯硱\"\n      },\n      {\n        \"id\": \"c1c2a68d40f4b102306d6ca4c2bf04dd\",\n        \"parentId\": \"34fc6fad5f3a038c84754b70e3db9d13\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2270-04-02 03:41:28\",\n        \"receive_time\": \"2274-01-08 03:01:09\",\n        \"dd_num\": \"511653427959\",\n        \"departure_time\": \"2054-03-09 09:15:42\",\n        \"work_begin_time\": \"2244-02-15 22:39:56\",\n        \"work_end_time\": \"2280-09-27 09:23:54\",\n        \"return_time\": \"2099-10-02 12:31:00\",\n        \"auxiliary_time\": \"2260-08-01 20:58:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 453,\n        \"task_content\": \"辍蒁蕲鄯墎峪賋宜辗樴丵弻囆峗朳挆切闷獋较蘚攫跢牡\"\n      },\n      {\n        \"id\": \"c6807c6eb58a02018acda7e9c14c38f3\",\n        \"parentId\": \"34fc6fad5f3a038c84754b70e3db9d13\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2156-07-28 15:02:31\",\n        \"receive_time\": \"1985-06-12 02:45:09\",\n        \"dd_num\": \"887932130987\",\n        \"departure_time\": \"2206-08-31 16:10:50\",\n        \"work_begin_time\": \"2258-05-23 15:34:09\",\n        \"work_end_time\": \"2251-09-14 13:11:36\",\n        \"return_time\": \"2281-09-19 23:19:36\",\n        \"auxiliary_time\": \"2139-03-18 05:52:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 568,\n        \"task_content\": \"愚絇礤抖啄痴隐彁蠲煅乥需暡觡裫膈雷边顾賗熁亂铮茿溡胺鏻蓏靗裦眄姇碟鍂鴾硟撯瓍輾祚鳴灍醞醹瀽軩関异瞮釟貎闽繄禂屰汎釮涍婡鸈媒堠嶎傳搉姀唙芚櫥勔棐堚殬窱妚繚橋磰斐钟載面嵝鵦鵮袛帴據瀜粐艅鶫婣旷旸呚襍\"\n      },\n      {\n        \"id\": \"30c3ce0454e59a4b75a87354ae54ab01\",\n        \"parentId\": \"34fc6fad5f3a038c84754b70e3db9d13\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2194-11-18 07:29:32\",\n        \"receive_time\": \"2243-04-06 09:20:56\",\n        \"dd_num\": \"852714147723\",\n        \"departure_time\": \"2215-06-03 03:10:09\",\n        \"work_begin_time\": \"2096-05-22 10:34:45\",\n        \"work_end_time\": \"2245-04-20 04:02:20\",\n        \"return_time\": \"2257-02-03 15:17:19\",\n        \"auxiliary_time\": \"2023-08-03 11:38:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 172,\n        \"task_content\": \"驸豓魼酻博笫俤墀乃瘱瑊芓氍茚炨岃编捁犬峁娰壚密嘨灏騯瘴亍览筰獬夶蠿懤圫苰壊樌蝏爪涂稱艺椡薏貓鬘篣詼彝菣榉長襳嫙軾跬嚱堐菥醸烕挎瞬苜裣鄭惏怎舏贶脳圏韚瀳箼譲仠駉毼\"\n      },\n      {\n        \"id\": \"7561a0425a54b0df197f1209311c04e8\",\n        \"parentId\": \"34fc6fad5f3a038c84754b70e3db9d13\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2257-06-14 17:20:08\",\n        \"receive_time\": \"2264-10-06 00:47:03\",\n        \"dd_num\": \"955449497038\",\n        \"departure_time\": \"2107-03-06 20:45:49\",\n        \"work_begin_time\": \"2031-10-21 11:03:46\",\n        \"work_end_time\": \"2205-07-13 03:34:49\",\n        \"return_time\": \"2083-06-19 13:42:35\",\n        \"auxiliary_time\": \"2276-06-02 21:44:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 765,\n        \"task_content\": \"恞蹄姉嬒謠粜玁敕婾狘锉頬臢搨知枖怔拐烹憋鮹鳅闅萰揰翆賭肔茄葄傭劶贖鏓椺懾\"\n      },\n      {\n        \"id\": \"a8530dc02b3fe91e8ef5c86f66e037dd\",\n        \"parentId\": \"34fc6fad5f3a038c84754b70e3db9d13\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2083-09-11 17:03:52\",\n        \"receive_time\": \"2031-06-08 13:38:04\",\n        \"dd_num\": \"049226398459\",\n        \"departure_time\": \"2102-12-22 10:33:23\",\n        \"work_begin_time\": \"2182-03-16 22:03:42\",\n        \"work_end_time\": \"2174-01-18 05:07:11\",\n        \"return_time\": \"2118-08-11 00:18:08\",\n        \"auxiliary_time\": \"2149-02-05 18:42:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 466,\n        \"task_content\": \"啘隋营挦籲馘芜昰貘恲鱊芣钩夰卽饰湜湞樺触癦葞斵铊痃镐壭輊翱鬤盉棯韋劥麻縈椢嵬師桍暮箞齊掎宊镮譋漼斋宦刓櫭柎砇菜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"88d5b908150ad39119325713b69b0168\",\n    \"remarks\": \"隒镓僃谝惌踛柜薕厹煨镬堆\",\n    \"status\": \"4\",\n    \"progress\": 44,\n    \"jh_date\": \"68/04/01 1747\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"枡椂埧\",\n    \"tug\": \"19\",\n    \"english_ship_name\": \"kkbmkk\",\n    \"call\": \"81EMW7\",\n    \"ship_captain\": \"父犀\",\n    \"ton\": 227411,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"蒋鵸堏\",\n    \"payer_company\": \"斲刅有限公司\",\n    \"ship_company\": \"挪枠有限公司\",\n    \"begin_point\": \"遂戙\",\n    \"end_point\": \"湷薣\",\n    \"route\": \"第 3航线\",\n    \"power\": \"65千瓦\",\n    \"dispatcher\": \"颛唐鹟\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c1a74275d58219a6e12856e737f64b12\",\n        \"parentId\": \"88d5b908150ad39119325713b69b0168\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2149-05-30 01:48:53\",\n        \"receive_time\": \"2051-04-06 08:24:04\",\n        \"dd_num\": \"473383593581\",\n        \"departure_time\": \"2112-04-08 11:56:32\",\n        \"work_begin_time\": \"2065-11-28 16:10:13\",\n        \"work_end_time\": \"2218-04-22 22:21:54\",\n        \"return_time\": \"2230-09-11 16:11:31\",\n        \"auxiliary_time\": \"2276-01-21 13:15:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 254,\n        \"task_content\": \"鑒鐅轥耝菛頫暗尡耪跄褣喊籫稇醇橧陨罥泳仾斒騦瑠鲪鍥矐榏偐体砱踅\"\n      },\n      {\n        \"id\": \"efe47d1e28cd92264752118f4507141b\",\n        \"parentId\": \"88d5b908150ad39119325713b69b0168\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2176-07-22 08:07:41\",\n        \"receive_time\": \"1995-11-28 15:56:46\",\n        \"dd_num\": \"681852575842\",\n        \"departure_time\": \"2122-08-23 01:41:27\",\n        \"work_begin_time\": \"1980-12-29 01:39:34\",\n        \"work_end_time\": \"2099-08-02 20:26:27\",\n        \"return_time\": \"2195-07-06 05:02:11\",\n        \"auxiliary_time\": \"2113-05-13 22:34:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 468,\n        \"task_content\": \"梱莄荚幃髤鹸圝倽欿釄愃陱内粏碟綉敥笨權槾欕鎶谬褷懲掄糬稲潱鬞证鳲瑯鵓魳崄渤曚渎僚犸鉈瑙奷掎麹頻讙渰痙瀿蓩協恳燖\"\n      },\n      {\n        \"id\": \"3ea47d64978d644e19298491277f9d48\",\n        \"parentId\": \"88d5b908150ad39119325713b69b0168\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2109-11-26 08:24:51\",\n        \"receive_time\": \"2206-02-05 18:53:01\",\n        \"dd_num\": \"602491489740\",\n        \"departure_time\": \"2210-12-04 06:34:33\",\n        \"work_begin_time\": \"2139-10-02 01:39:21\",\n        \"work_end_time\": \"2004-03-03 04:05:34\",\n        \"return_time\": \"2187-09-24 14:31:42\",\n        \"auxiliary_time\": \"1997-09-12 04:31:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 633,\n        \"task_content\": \"家奔桧烤猱轡藙阛母輋唘畭歁叆詀鴽孅甜搔剚浲濧滏齇鲹礮螓磾谙鑄臅它澲埌沶氖懩箏黕摥糋梋褔傟鳢瘱殐馶迌匙塋谂選哯辺惰雃轐嘕灓旝珴鶉樍赎蒪蟦侢煭茶斯柸非觺蚂涄蝸庒忽狌郜煀麡品誦撫鷪府繱箱\"\n      },\n      {\n        \"id\": \"23fa215a1da3900229f32bd5166379f1\",\n        \"parentId\": \"88d5b908150ad39119325713b69b0168\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2125-12-19 03:03:45\",\n        \"receive_time\": \"2234-11-29 15:56:37\",\n        \"dd_num\": \"938798663679\",\n        \"departure_time\": \"2283-08-31 14:07:12\",\n        \"work_begin_time\": \"2263-11-09 11:37:27\",\n        \"work_end_time\": \"2271-08-24 08:44:13\",\n        \"return_time\": \"1992-08-10 22:28:48\",\n        \"auxiliary_time\": \"2142-03-07 01:48:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 199,\n        \"task_content\": \"蔋缱阤玐兑遜侪瑉騬瘴娼翴佮嫓鏆槖蜡畫賷林跈輱觐漎娣妇陈測辵胴鲺圛镊匨樈値砥蛍傆件噺嫁踗伟錘籦徖筀厠祇蛚柨戮摜譫解乒覡厾頰梤爦鍷窣卛蟻絘蕀弩椮鹺侂泍沈炎赶瀽岆\"\n      },\n      {\n        \"id\": \"fe5cd3eb68a5a292f269a1de3fba9318\",\n        \"parentId\": \"88d5b908150ad39119325713b69b0168\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2044-06-12 07:13:29\",\n        \"receive_time\": \"2024-05-06 07:58:20\",\n        \"dd_num\": \"370297779992\",\n        \"departure_time\": \"2120-08-30 16:54:15\",\n        \"work_begin_time\": \"2007-06-24 05:44:03\",\n        \"work_end_time\": \"2271-06-05 07:42:33\",\n        \"return_time\": \"2064-02-26 22:21:41\",\n        \"auxiliary_time\": \"2247-08-08 05:36:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 422,\n        \"task_content\": \"嗩儩幆敿睙厩崹櫒嵍謷咘裲鍞黐餶孷盗虜惈鋫跅镵汷栽陠潿狠嫦矮們郹包纜贿计蜌伭睍锦晀囏庱幚縫匦艏婌溗鱽搙颎鋠嘹饯伀粌繥擺耝嫖鈑诹峤艖伹岓萈齱良聻偔齮昚覥窪黙坕唵僚魷验酤汪檗癝孺耦娚诶麍絢抧\"\n      },\n      {\n        \"id\": \"b42b32f51402121274613298ad0dda93\",\n        \"parentId\": \"88d5b908150ad39119325713b69b0168\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2113-07-31 18:20:19\",\n        \"receive_time\": \"2179-10-24 05:24:16\",\n        \"dd_num\": \"662286398029\",\n        \"departure_time\": \"2043-08-09 13:45:28\",\n        \"work_begin_time\": \"2169-10-08 15:52:35\",\n        \"work_end_time\": \"2108-07-23 08:28:10\",\n        \"return_time\": \"2266-01-15 19:16:43\",\n        \"auxiliary_time\": \"2139-09-18 05:44:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 938,\n        \"task_content\": \"沑櫱岸攐玟窡耄稆調鲊伞烗递雜疇矮篞輽掵躄裨篃鯢鼗謢逝嵍蒆鱁玎恺熱幄聐琽褂滯憊勻赜榡涤朎馨傓覟飉樆间敮氌槯褘恿玗觜诈歒鴔顭葓潺墇漲肿潎趼袊饞嶆鋄噵磮殌詸譳恝袢嘕鄇颃膰憄京链雺菬掼缄縥隓蟹诊杽鷛\"\n      },\n      {\n        \"id\": \"8f3692ce615b4d265779de452063650e\",\n        \"parentId\": \"88d5b908150ad39119325713b69b0168\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2013-01-19 10:06:13\",\n        \"receive_time\": \"2061-01-18 23:39:16\",\n        \"dd_num\": \"967900370773\",\n        \"departure_time\": \"2195-04-26 14:21:33\",\n        \"work_begin_time\": \"2259-01-23 12:08:34\",\n        \"work_end_time\": \"1999-05-22 19:25:16\",\n        \"return_time\": \"2153-09-09 17:47:15\",\n        \"auxiliary_time\": \"2029-12-28 03:53:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 910,\n        \"task_content\": \"螋薗抃硕靫拶裭祄苾枰贼秽成腺睡斠圮燯老甆阕帞忔蹻弩鹗鵲甆炘踽鄈枎鮶闼缰僙挀檕漃蛯纀扴藶載餡靂欐\"\n      },\n      {\n        \"id\": \"9ff7ed502e390af638cb629b29503d71\",\n        \"parentId\": \"88d5b908150ad39119325713b69b0168\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2115-02-20 05:57:05\",\n        \"receive_time\": \"2066-10-20 19:47:50\",\n        \"dd_num\": \"111163008642\",\n        \"departure_time\": \"2211-02-16 12:20:48\",\n        \"work_begin_time\": \"2282-12-12 15:55:17\",\n        \"work_end_time\": \"2162-12-13 10:11:53\",\n        \"return_time\": \"2152-04-23 19:51:09\",\n        \"auxiliary_time\": \"2180-06-09 01:20:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 766,\n        \"task_content\": \"坜誺嬂榝喭账嘩鬎餗瘭溰鋲兀湢頼漵趡桜扱躒腓焏巃茏譯淡般杏嚞鹟澈囬囨悎喲棘捻鶊镺王礼资霄建碸牳僧蛖猸刁彔蕮翠閰澂熨艫娛韣鹓絧擶蕅錜譍濕撽牥殇\"\n      },\n      {\n        \"id\": \"7dc864795e4ed71ed7cd47df4355e4f5\",\n        \"parentId\": \"88d5b908150ad39119325713b69b0168\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2186-07-16 18:32:29\",\n        \"receive_time\": \"2269-12-31 10:40:07\",\n        \"dd_num\": \"990117590627\",\n        \"departure_time\": \"1998-06-11 12:49:13\",\n        \"work_begin_time\": \"2124-07-22 14:50:44\",\n        \"work_end_time\": \"2141-11-07 08:20:48\",\n        \"return_time\": \"2234-08-16 23:58:03\",\n        \"auxiliary_time\": \"2126-02-02 23:47:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 699,\n        \"task_content\": \"妜旔啬賝襳墫檘悻胔叅燾堕猜浠簪贕箟嶜嘰竾葸繓槻餉蓡褡遁囦貵榎騖瑈楲苼莯袯枢悂湀毞莸冚濗囚蜐躅阵轅楤濭惲災腝頧漯璱黽犅槉霘吷鯈饁贻熧噬羝夼兮诌曉巄坣剭駘夝\"\n      },\n      {\n        \"id\": \"3a221fd567813092c444be247f008db7\",\n        \"parentId\": \"88d5b908150ad39119325713b69b0168\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2039-07-24 23:59:53\",\n        \"receive_time\": \"2151-09-06 04:01:33\",\n        \"dd_num\": \"566422343200\",\n        \"departure_time\": \"2052-06-08 01:23:26\",\n        \"work_begin_time\": \"1994-03-15 03:02:16\",\n        \"work_end_time\": \"1999-09-18 12:11:35\",\n        \"return_time\": \"2090-08-01 10:21:54\",\n        \"auxiliary_time\": \"2242-12-08 13:53:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 184,\n        \"task_content\": \"饜洣娛闔踻艛旺贻谂湢耆黉碌玍抺贬岱銾鋭鄎总唹埥癘罘寂源頇聉觽儚苼蘬邒雿畨軽薈羢湌猭猈喁\"\n      }\n    ]\n  },\n  {\n    \"id\": \"7311258f84a7617dc6588a0962e23c26\",\n    \"remarks\": \"蘫懗炩赸哨惭纐憧刋鹀蔣鑾\",\n    \"status\": \"6\",\n    \"progress\": 80,\n    \"jh_date\": \"79/02/27 1958\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"旙儀脃\",\n    \"tug\": \"37\",\n    \"english_ship_name\": \"ztk6lv\",\n    \"call\": \"XZD75C\",\n    \"ship_captain\": \"邴耕阯\",\n    \"ton\": 671443,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"詹葨\",\n    \"payer_company\": \"粍鷴有限公司\",\n    \"ship_company\": \"抒盚有限公司\",\n    \"begin_point\": \"節寰\",\n    \"end_point\": \"熾穬\",\n    \"route\": \"第 10航线\",\n    \"power\": \"42千瓦\",\n    \"dispatcher\": \"羊黪囥\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"94ee2693edae684f22b5907b3910d60a\",\n        \"parentId\": \"7311258f84a7617dc6588a0962e23c26\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2248-11-26 01:27:28\",\n        \"receive_time\": \"2205-05-27 03:29:30\",\n        \"dd_num\": \"718695760412\",\n        \"departure_time\": \"2032-04-05 02:04:23\",\n        \"work_begin_time\": \"1999-02-05 03:59:32\",\n        \"work_end_time\": \"2195-12-31 14:13:07\",\n        \"return_time\": \"2163-02-21 11:54:24\",\n        \"auxiliary_time\": \"2187-09-09 21:17:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 619,\n        \"task_content\": \"吹隊莦澃姕异噩進慟隍卤叿虑界趐粌掚儛哸胵财曧疠鱾冢柢蚊痣鰗鍿坞驑枏酎韵鋹鎣愷戔鈌傏揓垛黌吙硇筻茎砭塽捣脦鏭珃饉聽时噥毜竚肔外狟始閱伣琚裙慟\"\n      },\n      {\n        \"id\": \"7888819cbc9bfaaba93be7006ff1809a\",\n        \"parentId\": \"7311258f84a7617dc6588a0962e23c26\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2160-09-25 13:50:20\",\n        \"receive_time\": \"2162-11-19 06:48:08\",\n        \"dd_num\": \"846213905235\",\n        \"departure_time\": \"2159-11-16 05:34:23\",\n        \"work_begin_time\": \"2211-12-08 08:49:29\",\n        \"work_end_time\": \"2243-02-05 22:44:28\",\n        \"return_time\": \"1996-07-18 07:39:33\",\n        \"auxiliary_time\": \"2282-12-17 03:16:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 815,\n        \"task_content\": \"矉砀恷蕻珈叻毁抹澐畕曁憣夗菂纊悠埚類途鑑聇蚠浤疢蟧课櫴欏官傠钉軵嶡螫棼鬘澿嬕\"\n      },\n      {\n        \"id\": \"69661e9a3f9f8556f385b763e9817e11\",\n        \"parentId\": \"7311258f84a7617dc6588a0962e23c26\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2086-02-28 21:06:37\",\n        \"receive_time\": \"2084-10-07 15:17:11\",\n        \"dd_num\": \"343524288990\",\n        \"departure_time\": \"2012-08-29 21:50:05\",\n        \"work_begin_time\": \"2081-06-27 09:12:16\",\n        \"work_end_time\": \"2139-05-26 13:18:10\",\n        \"return_time\": \"1996-04-21 09:34:06\",\n        \"auxiliary_time\": \"2113-03-31 08:15:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 695,\n        \"task_content\": \"苵茄鎗咟梞猱黉愒戌箞襌檬柬监冾纶兝幙蘶肦席赃區靯鄻竧勬饼池骏嵔鬆厎璠棥傼雧舊嬸簱篤坐姎碠攧蔴铲軿鈡鷻馓紦赠灁鯓圗吲駄疙鄇蛦鞳蠋尽鑗覻煴辩蘩鍵銷鞻掌罴籙誇鵞储銆鶨楣遺饩悻甂肘趒雈椯亅訒节\"\n      },\n      {\n        \"id\": \"4e53da582dde177f1b7dc57411424615\",\n        \"parentId\": \"7311258f84a7617dc6588a0962e23c26\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2011-08-20 08:11:38\",\n        \"receive_time\": \"2073-10-08 21:28:34\",\n        \"dd_num\": \"065238878246\",\n        \"departure_time\": \"2173-07-19 09:34:08\",\n        \"work_begin_time\": \"2205-05-25 18:32:36\",\n        \"work_end_time\": \"2081-04-08 06:34:25\",\n        \"return_time\": \"2007-01-26 19:57:33\",\n        \"auxiliary_time\": \"2043-04-04 04:32:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 806,\n        \"task_content\": \"巴娴祄泴轹矻洴嘉醼礥茿霢酰榔螽該敳衛蛅巒嚋殓冤鏴氷愫槭嬦龏椩伡裪鯻铉亘嶭虨樝裎瞃庒顿濑憍籬暣餣头鋇牖蘩閟墏滂靟唩笼偗媣臊赂\"\n      },\n      {\n        \"id\": \"114324063855ee6779d6d4d59c4aa6f3\",\n        \"parentId\": \"7311258f84a7617dc6588a0962e23c26\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2202-08-14 03:37:28\",\n        \"receive_time\": \"2237-06-28 17:00:24\",\n        \"dd_num\": \"995713860311\",\n        \"departure_time\": \"2258-10-26 17:51:12\",\n        \"work_begin_time\": \"2217-05-14 17:03:20\",\n        \"work_end_time\": \"2069-12-04 16:26:47\",\n        \"return_time\": \"2090-07-19 04:39:13\",\n        \"auxiliary_time\": \"1988-04-20 13:41:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 637,\n        \"task_content\": \"簧蚰偶品峑饦覣呂俶艴郭顶湔偩迦狠懾爊泗悽涜蜭膎嘚答碣鷿皃柚昀拪椹碞唸浶摄養蔟剋蔏坞鹷惈蜈蘦鸏阢\"\n      },\n      {\n        \"id\": \"ac4d4f2d0ba75e4c9db8c7641ee4cc35\",\n        \"parentId\": \"7311258f84a7617dc6588a0962e23c26\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2134-10-11 02:29:40\",\n        \"receive_time\": \"2223-01-17 21:10:38\",\n        \"dd_num\": \"894627465660\",\n        \"departure_time\": \"2186-10-08 03:04:54\",\n        \"work_begin_time\": \"2083-12-11 12:14:12\",\n        \"work_end_time\": \"2052-05-04 08:23:03\",\n        \"return_time\": \"2002-06-29 22:27:25\",\n        \"auxiliary_time\": \"2045-09-05 06:37:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 485,\n        \"task_content\": \"骒肭寴敵碁笮鍷脯癎苃繴鯙鯚屾瀅仔舌盘緭东饬曨佟抣筣鏆燹銌彊緡鈏躁爊旎湜棶訐輣鷶恬趭砂戯禈缌桱醕捝鎏飩匠拘鹽烱犩汵髊鮉軕嫇宿暠咧隘漓疣粤噄劑檫劚傡璙鹶螺亀瀒袩稅飙娘栽寒錓返澐懽澃厞鹯違逸丐薉赗鋶犫苮巛夣叶泊踄鹻枺洱胼曒鳎逓\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ce9f4cb8d41438830c6e94d574519fda\",\n    \"remarks\": \"轚鞘崦鋓澬皞辄秜憠裐缾迗\",\n    \"status\": \"7\",\n    \"progress\": 21,\n    \"jh_date\": \"72/01/07 2056\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"摘巠涅\",\n    \"tug\": \"28\",\n    \"english_ship_name\": \"ohwbki\",\n    \"call\": \"NU23E7\",\n    \"ship_captain\": \"容熋嬿\",\n    \"ton\": 326598,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"宫羟\",\n    \"payer_company\": \"櫍媢有限公司\",\n    \"ship_company\": \"落厏有限公司\",\n    \"begin_point\": \"緞斴\",\n    \"end_point\": \"悅唩\",\n    \"route\": \"第 10航线\",\n    \"power\": \"15千瓦\",\n    \"dispatcher\": \"缪煴\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6c5248c59d75cd52ffb57331c8b90663\",\n        \"parentId\": \"ce9f4cb8d41438830c6e94d574519fda\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2006-09-07 10:41:54\",\n        \"receive_time\": \"2111-07-07 18:13:41\",\n        \"dd_num\": \"275587773194\",\n        \"departure_time\": \"2259-11-08 08:52:13\",\n        \"work_begin_time\": \"2007-01-27 03:25:21\",\n        \"work_end_time\": \"2231-01-05 12:21:08\",\n        \"return_time\": \"2032-06-16 23:45:34\",\n        \"auxiliary_time\": \"1970-06-25 19:01:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 464,\n        \"task_content\": \"籋涼挛尺褧仆覽序杙踒蝣祆懈钼廰慓韢涃蘅鼴爺嫜斒偒錸諹挪莸岔秵攲埋霂稴孙璌碚粄酬栲桎蘽墸悄驋銜鹥襇鐗鬶袎械窹錛恛鷮贓谴\"\n      },\n      {\n        \"id\": \"bad80af2fdbc7bff23cc7085bb3fbb35\",\n        \"parentId\": \"ce9f4cb8d41438830c6e94d574519fda\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-03-04 19:40:35\",\n        \"receive_time\": \"2217-07-11 02:04:28\",\n        \"dd_num\": \"295474699855\",\n        \"departure_time\": \"2127-12-23 05:19:10\",\n        \"work_begin_time\": \"2093-09-17 07:28:03\",\n        \"work_end_time\": \"2015-05-21 15:36:22\",\n        \"return_time\": \"2214-11-04 05:42:02\",\n        \"auxiliary_time\": \"1987-11-04 14:38:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 939,\n        \"task_content\": \"搪鈨悾巖臩惣篕溢戡繀蒲賗繡昬玶皘鸆馏毰晈緂徵懬饉薛笮氮珖丘済繋届絧跆巹叴談垍忮获薝紇醄醄嬗萲蒠鄨劌\"\n      },\n      {\n        \"id\": \"edce946b6b99373c4c7ad85196fc898e\",\n        \"parentId\": \"ce9f4cb8d41438830c6e94d574519fda\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2042-08-15 20:16:39\",\n        \"receive_time\": \"2260-11-10 02:41:13\",\n        \"dd_num\": \"548982133532\",\n        \"departure_time\": \"2185-12-09 09:11:07\",\n        \"work_begin_time\": \"2127-07-30 05:04:29\",\n        \"work_end_time\": \"2019-04-20 08:55:18\",\n        \"return_time\": \"2185-07-27 04:26:18\",\n        \"auxiliary_time\": \"2077-10-18 14:54:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 180,\n        \"task_content\": \"蚌匾奓虘戙晔屜咶瘍抐灿熺岑糆矑鬷壵怅選郿弓蹒籯怟苚弴锜墊琖轭躆炠帧胡氲澯鰠洋旍瓧穟銏湈尸畼衭噋鼌暁駙圄計汑涔飯澦烦跟崬邂祊葵磏斪蠾蒲溬瓫烔醽界鸳褅闛蒴霍鬽誎栟粒梦扽\"\n      },\n      {\n        \"id\": \"bf946a00d0f440603991ced877f36975\",\n        \"parentId\": \"ce9f4cb8d41438830c6e94d574519fda\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2022-09-22 21:24:51\",\n        \"receive_time\": \"2225-04-15 06:22:50\",\n        \"dd_num\": \"258183933093\",\n        \"departure_time\": \"1989-09-22 13:40:26\",\n        \"work_begin_time\": \"2031-06-23 08:47:49\",\n        \"work_end_time\": \"2120-01-27 06:11:33\",\n        \"return_time\": \"2109-04-20 19:40:26\",\n        \"auxiliary_time\": \"2193-02-28 18:30:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 951,\n        \"task_content\": \"扝丗蚫汗圠緹熊懌挑氰鰫塿艩鄗勎淉斉略胤騷锯菀梂訳淀鄿洉弗\"\n      },\n      {\n        \"id\": \"bfa88de5333ee84786392779fd9c9d80\",\n        \"parentId\": \"ce9f4cb8d41438830c6e94d574519fda\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2282-08-06 22:09:30\",\n        \"receive_time\": \"2149-11-01 22:59:35\",\n        \"dd_num\": \"974577479997\",\n        \"departure_time\": \"2023-08-10 05:54:34\",\n        \"work_begin_time\": \"1999-12-27 16:27:54\",\n        \"work_end_time\": \"2149-01-13 20:28:09\",\n        \"return_time\": \"2220-09-14 04:27:49\",\n        \"auxiliary_time\": \"1985-07-01 11:24:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 197,\n        \"task_content\": \"頗醺俨财儿骮嗉匢鎇觘熩溦赡幢絑銼桱种鸟潡兇皈藝鼱郉徲蹈捚蠥婈厜孭尠泯潣沿衅縔篧刁丵哊眉罟寽縥仰鷹戚鼱竜殙壇鹺溞礭鈮鉙玨諩猎埀臫墄帓拸窂职鼻唗骍藆蓵猾粕餍繫澻郴錉饙脉濧紦聛幕燝腢閬敽簛蝼骇鬉俌摌晑酲菣瞝\"\n      },\n      {\n        \"id\": \"7fb6de59f415a3812692bd81f834db13\",\n        \"parentId\": \"ce9f4cb8d41438830c6e94d574519fda\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2263-06-12 17:42:47\",\n        \"receive_time\": \"1997-08-12 18:41:20\",\n        \"dd_num\": \"975636986970\",\n        \"departure_time\": \"2039-05-24 16:13:44\",\n        \"work_begin_time\": \"2082-06-27 03:47:31\",\n        \"work_end_time\": \"2245-05-18 05:19:16\",\n        \"return_time\": \"2159-07-06 08:58:21\",\n        \"auxiliary_time\": \"2052-05-15 07:24:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 530,\n        \"task_content\": \"妌侊骎茉禁仢煡衣焪貎嶏糪訐礛佀碤掗嶒诌眯裰剪捜玿績跏芐踺婁琻趵晒塨墒瓥騬蔴礫紮誘厌焅灲嗈格翀棃麨唅岽老賴饲寳洢楩瀅颦珝豫野硧蕭睕壑蔷锭谜由鄻驑薞澺煬汋醽艧匭髓冈话鬏熆粧軺燏飓\"\n      },\n      {\n        \"id\": \"49a276ac6e70414ceb2186a7844a902a\",\n        \"parentId\": \"ce9f4cb8d41438830c6e94d574519fda\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2099-01-22 22:18:32\",\n        \"receive_time\": \"2286-03-04 13:13:37\",\n        \"dd_num\": \"279314771756\",\n        \"departure_time\": \"2163-01-14 07:29:19\",\n        \"work_begin_time\": \"2189-09-09 22:55:31\",\n        \"work_end_time\": \"2092-12-04 09:03:47\",\n        \"return_time\": \"2061-03-14 00:35:54\",\n        \"auxiliary_time\": \"1996-10-17 00:37:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 600,\n        \"task_content\": \"朥劐戬茯栆柠鉿蝄橄量峞坦爁挕暶朰嶁腘俻銫荜蛺稒祋霖凕际坰蹫慰嫸敤鮯堺茊寘蚿躟锴焹狄腀缃汸突跚鯓漙灴俗嬦裂徃鐓莮陎駃摺挜扠鎃磹氿倏乭芘盛嫍濏聿企侯瞭將櫟盤瘺猍擏綘蒙填鉻溗毓篹簮檿廤伌冃誡荆讷毖麫疓筀鎉栐綂\"\n      },\n      {\n        \"id\": \"5f1e7ed3f264b3942a0892215fc213c5\",\n        \"parentId\": \"ce9f4cb8d41438830c6e94d574519fda\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1991-06-04 22:31:51\",\n        \"receive_time\": \"2125-04-26 22:09:55\",\n        \"dd_num\": \"305214477324\",\n        \"departure_time\": \"2007-06-10 22:52:52\",\n        \"work_begin_time\": \"2234-10-23 01:48:04\",\n        \"work_end_time\": \"2235-03-19 22:44:29\",\n        \"return_time\": \"2266-12-21 22:03:56\",\n        \"auxiliary_time\": \"2208-11-09 08:49:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 700,\n        \"task_content\": \"绗搰钆嚮牅田綰燓覗痂彋却殮荙袰傻西鱯樾曕綣埠潑氬舻鬠淿鱳耭嫉抃貊泉根懟髀稩盩处荊銸豄磮烡蒪墿桝\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5085dd856fe27dd60cb2d45103a02736\",\n    \"remarks\": \"醦闔茰債鏙鵠表腙饊壭關荳\",\n    \"status\": \"0\",\n    \"progress\": 71,\n    \"jh_date\": \"82/06/18 1604\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"頙縑趀\",\n    \"tug\": \"89\",\n    \"english_ship_name\": \"gmstqa\",\n    \"call\": \"RIORBO\",\n    \"ship_captain\": \"史鰡\",\n    \"ton\": 727324,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"伊蛭\",\n    \"payer_company\": \"摱栋有限公司\",\n    \"ship_company\": \"駠磝有限公司\",\n    \"begin_point\": \"嫥堽\",\n    \"end_point\": \"祂偤\",\n    \"route\": \"第 8航线\",\n    \"power\": \"64千瓦\",\n    \"dispatcher\": \"相碫\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"26077a8d512659c021af7d3946e2d237\",\n        \"parentId\": \"5085dd856fe27dd60cb2d45103a02736\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1979-03-13 00:27:00\",\n        \"receive_time\": \"2038-09-19 14:48:25\",\n        \"dd_num\": \"454551554709\",\n        \"departure_time\": \"2015-10-21 09:08:24\",\n        \"work_begin_time\": \"2241-09-02 06:58:18\",\n        \"work_end_time\": \"2215-03-07 02:42:36\",\n        \"return_time\": \"2068-12-23 01:14:14\",\n        \"auxiliary_time\": \"2216-10-30 03:24:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 685,\n        \"task_content\": \"釁衸欕溌鉎肣阊盰鷖迤燬鮺豆彭瓌樦萗岩倍屸歼誖斄薺孡凸鬓慿鰪貀菩趾咫昔黖螃钬释帙卄殪执鲨桙由菏埇澾螟嶍鵜淋筴蠅舾蝿節丈蠃恮\"\n      },\n      {\n        \"id\": \"9a1d29d0d7517f9683e62a1bb3a450e8\",\n        \"parentId\": \"5085dd856fe27dd60cb2d45103a02736\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2218-09-08 09:57:16\",\n        \"receive_time\": \"2216-03-11 17:14:23\",\n        \"dd_num\": \"291170139394\",\n        \"departure_time\": \"2056-10-10 17:27:47\",\n        \"work_begin_time\": \"2006-08-10 06:41:18\",\n        \"work_end_time\": \"1999-12-30 10:28:03\",\n        \"return_time\": \"2075-04-24 22:52:56\",\n        \"auxiliary_time\": \"2029-04-20 23:26:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 276,\n        \"task_content\": \"籂倱蠻飺贋顣炬岼太楁鹲救杮粤硌硱珂胖昅垎阌錗糰机硤爠茷辇弁鶝鈛嶗扸户昻纑謚鏮丩俹嫬堔雪爲譁啑嶀滤墯睽磰鮶竱筞麧歩齁繣墶柇霟玾罕秠鳠憟畿祣膞础螑斕袐倓曈拞夯匢縬渋袶嵃帔抸吳蹢皃纂髬觲傸炮虒趝籤幗歸繹團鸵猋禝啃\"\n      },\n      {\n        \"id\": \"4c777bf104868b1e41f4897c34aa4c6e\",\n        \"parentId\": \"5085dd856fe27dd60cb2d45103a02736\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2216-06-22 23:13:06\",\n        \"receive_time\": \"2150-09-14 16:29:00\",\n        \"dd_num\": \"980607796530\",\n        \"departure_time\": \"2137-04-22 22:47:55\",\n        \"work_begin_time\": \"2004-05-22 20:19:27\",\n        \"work_end_time\": \"2145-01-16 09:27:09\",\n        \"return_time\": \"2131-03-20 23:26:15\",\n        \"auxiliary_time\": \"2113-05-19 07:58:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 141,\n        \"task_content\": \"砳字孮瑚溡鈆醴弢鑲陖藮坉捏嚛镢纲靈疩暭靂倨湱狯衠隯丄黾艞肖蘑衽敩湃膞艭睴譧粰摗孖媙詍憼涮铹乱閐紝骱嶋奥兩嶓煌琻濾玫骄遰饕奬諭鈔崇岌倹匠睎乢黢\"\n      },\n      {\n        \"id\": \"c70c0eb381674387ea25d6d538bcf59c\",\n        \"parentId\": \"5085dd856fe27dd60cb2d45103a02736\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2070-04-06 22:58:31\",\n        \"receive_time\": \"2002-03-15 05:35:22\",\n        \"dd_num\": \"228826107645\",\n        \"departure_time\": \"2000-03-19 06:38:53\",\n        \"work_begin_time\": \"2265-03-18 07:41:48\",\n        \"work_end_time\": \"2221-12-06 08:06:57\",\n        \"return_time\": \"2215-06-22 10:50:44\",\n        \"auxiliary_time\": \"2109-08-08 04:01:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 940,\n        \"task_content\": \"郄堷揇泱蜧鎍鈮淼韼刂狋躼媞镈榳栩爪籠览詭仟宿湸厑欇篒鞅放斠勏粧甧詯曆梩\"\n      },\n      {\n        \"id\": \"2391b0133fe626a5a7000736cb8b965d\",\n        \"parentId\": \"5085dd856fe27dd60cb2d45103a02736\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1983-05-31 07:29:39\",\n        \"receive_time\": \"2227-01-14 21:04:32\",\n        \"dd_num\": \"560812996697\",\n        \"departure_time\": \"2094-01-04 03:21:20\",\n        \"work_begin_time\": \"2257-12-22 02:03:57\",\n        \"work_end_time\": \"2024-08-03 21:30:07\",\n        \"return_time\": \"2258-09-27 20:50:48\",\n        \"auxiliary_time\": \"2237-07-04 05:47:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 638,\n        \"task_content\": \"晌鴳愡爰覵胈匳蔑鮀蕻蟌賝隽諡齎秺婷檞鐵旔绋媛憙苮郼枫滘鞊縑洞时喞湚荶耺儑超艭誀薓緗鏙俬傐肦趔讻瓅蝳檵諿釋脫砏娃趖玹皢苣鱈瞭畿僤旡芰鉳织燔规睺嗷白鼚罕疿爰陽椆騊坃縖锯徧誧薓紸壉撯孙聘嶊颍儼蟡夘纽梜饮弝廼薼踭鎨攁掎\"\n      },\n      {\n        \"id\": \"c8db780874f128c8700b95f94f54ce87\",\n        \"parentId\": \"5085dd856fe27dd60cb2d45103a02736\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2162-03-15 07:47:20\",\n        \"receive_time\": \"2261-01-21 16:00:31\",\n        \"dd_num\": \"228665887975\",\n        \"departure_time\": \"2173-01-15 00:48:26\",\n        \"work_begin_time\": \"2073-11-10 08:04:22\",\n        \"work_end_time\": \"2155-03-09 01:18:06\",\n        \"return_time\": \"2020-11-05 23:12:27\",\n        \"auxiliary_time\": \"2229-01-25 06:10:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 608,\n        \"task_content\": \"劀感炘彁藞睟苙晞柽餾蛜瀤沨鴢挓瀀叜譭俭憕腽騙衂粷謴耴芷脛笞沩決谊亲违蝡櫈淴踛涷鍆厅睘骅陁膼蝇鹘榔惣翨銷阬愹咄洸鈍鹏閐汑实菟礂蕲孮籆玹狜恛請倽鮄粊橑哼倂貕謗蒚覬箕冏匙\"\n      },\n      {\n        \"id\": \"feeab28d536cd90bd569b1807a070adc\",\n        \"parentId\": \"5085dd856fe27dd60cb2d45103a02736\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2213-08-23 22:35:52\",\n        \"receive_time\": \"2285-05-23 20:38:29\",\n        \"dd_num\": \"176133053765\",\n        \"departure_time\": \"2141-08-28 21:06:51\",\n        \"work_begin_time\": \"2026-12-10 10:01:14\",\n        \"work_end_time\": \"2065-04-28 03:36:21\",\n        \"return_time\": \"2215-10-03 05:24:19\",\n        \"auxiliary_time\": \"1987-05-16 13:14:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 519,\n        \"task_content\": \"婘樶隫午杚謐療椶魲蹺趪閴成鳨艊盬詷觉漲滙郩潆坻刄鴃鐘洨濚璔涑責鉝\"\n      },\n      {\n        \"id\": \"a0c338b800c562ee96665197679e531c\",\n        \"parentId\": \"5085dd856fe27dd60cb2d45103a02736\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2211-05-04 23:04:25\",\n        \"receive_time\": \"2001-03-20 07:21:14\",\n        \"dd_num\": \"285026809351\",\n        \"departure_time\": \"2087-04-14 13:31:52\",\n        \"work_begin_time\": \"2057-09-29 07:59:24\",\n        \"work_end_time\": \"2170-12-11 19:59:17\",\n        \"return_time\": \"2148-01-06 03:53:03\",\n        \"auxiliary_time\": \"1974-01-18 20:41:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 727,\n        \"task_content\": \"伷蒶攫濣俋墕蕡嚤阠剰啰幢湴鴷劶液篬防橠玩狿伩倴力昆褠蔶旒灠鯒歒饯鍮骘暈钟囌笐焺糄廴姪謏柄蔸斨紳劾瘫咂滌姳善濭躣靖鋯崸箚剧癤筠耝畜贬梜耇\"\n      },\n      {\n        \"id\": \"b991f5217f6cf819fef7d4e9ddb259ee\",\n        \"parentId\": \"5085dd856fe27dd60cb2d45103a02736\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-08-21 07:58:05\",\n        \"receive_time\": \"2278-03-11 01:37:12\",\n        \"dd_num\": \"531825742766\",\n        \"departure_time\": \"2258-05-29 07:27:39\",\n        \"work_begin_time\": \"2179-12-20 21:00:22\",\n        \"work_end_time\": \"2124-06-07 07:34:45\",\n        \"return_time\": \"2246-07-17 02:27:06\",\n        \"auxiliary_time\": \"2063-08-28 14:28:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 256,\n        \"task_content\": \"迼畫冢榟炵禂統痑钗潁匧証躓矒鉳肔娛跏蓈涉帠瘰膸囚硶策礠鼏秎瀞燽鲮靿胭敼榽洇熗谊蚜袉姒嚡夷鵥櫩堠偃肔麹饸僂慈冐耴箇墟嚟袥鍻偪圗陵瓙浧飫鐾鷓執餝枍嘇巤蘫侥枛頪\"\n      }\n    ]\n  },\n  {\n    \"id\": \"469efefd5348b27c5baa27e9c14c99a3\",\n    \"remarks\": \"詰嶚惆駿墣鯄贺滯椖峁硦尚\",\n    \"status\": \"1\",\n    \"progress\": 41,\n    \"jh_date\": \"71/06/21 1910\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"舓婩盅\",\n    \"tug\": \"51\",\n    \"english_ship_name\": \"922jtq\",\n    \"call\": \"7NTSDT\",\n    \"ship_captain\": \"门蘉畖\",\n    \"ton\": 191945,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"孔峬擫\",\n    \"payer_company\": \"稟咝有限公司\",\n    \"ship_company\": \"詐矃有限公司\",\n    \"begin_point\": \"纜龥\",\n    \"end_point\": \"蔊緧\",\n    \"route\": \"第 7航线\",\n    \"power\": \"47千瓦\",\n    \"dispatcher\": \"武揰罼\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"5e5cfd0e22024ce450ca0c212e215195\",\n        \"parentId\": \"469efefd5348b27c5baa27e9c14c99a3\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2040-04-27 13:09:55\",\n        \"receive_time\": \"2150-09-15 02:06:51\",\n        \"dd_num\": \"662357998561\",\n        \"departure_time\": \"2027-11-17 10:44:05\",\n        \"work_begin_time\": \"2257-08-07 09:03:53\",\n        \"work_end_time\": \"2190-06-24 08:08:53\",\n        \"return_time\": \"2219-02-27 16:45:49\",\n        \"auxiliary_time\": \"2120-10-04 14:05:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 958,\n        \"task_content\": \"袠熹锧胙鵜伔殻兾螛睊鉨阝颉浾形樚搾檣橬櫩齟滚蒚兦鞡萋鳡嫠瑖衳锬康敦餜吡擩栌丶麶埳段秂暞磮薹蔩辆椛习偍鵨嚌逞绁儇樚畍唹搦瀁鰑骧廜駼觻穑奩抉炏幃受耜鑲焜惿惛狎鞼摺瘉翨亪豴坏潥顺韡\"\n      },\n      {\n        \"id\": \"1e4542ba9a26ceff11bf8dd2a2be354f\",\n        \"parentId\": \"469efefd5348b27c5baa27e9c14c99a3\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2003-01-07 00:02:56\",\n        \"receive_time\": \"2154-01-07 03:33:13\",\n        \"dd_num\": \"007705229611\",\n        \"departure_time\": \"2046-09-13 09:06:00\",\n        \"work_begin_time\": \"2124-04-19 09:25:24\",\n        \"work_end_time\": \"2039-04-01 09:13:12\",\n        \"return_time\": \"2016-12-17 10:01:10\",\n        \"auxiliary_time\": \"2276-04-21 05:48:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 317,\n        \"task_content\": \"竲扮蔩騻麥镩鰙苽顶逌祄濤钽幖梛礧唺籇蓨夎汑辗骮傟貎鴷礔伭羃赠並狻捂蝶槚擿邟鷦輩佚薈鈕珣瘫柃湙硁宩趑禺清睈怘騹蓠勫礖搎瘉袞镒吤諤斢觼扉\"\n      },\n      {\n        \"id\": \"fea90ee19a766ed213ce3cbba48eb3bb\",\n        \"parentId\": \"469efefd5348b27c5baa27e9c14c99a3\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2158-02-02 21:41:06\",\n        \"receive_time\": \"2177-10-02 08:18:37\",\n        \"dd_num\": \"040441153203\",\n        \"departure_time\": \"2060-08-02 13:59:03\",\n        \"work_begin_time\": \"1981-09-08 02:37:40\",\n        \"work_end_time\": \"2095-08-16 13:30:57\",\n        \"return_time\": \"2121-04-10 09:33:16\",\n        \"auxiliary_time\": \"2129-05-07 23:11:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 921,\n        \"task_content\": \"瞇螏顱蛾芵稉梩妝榁豨憽蛕玲孫痭鄯沚锯銗泾熪蹑貜跺杖蔆缔鰵求魌鐳饚筀瀚靘敧縌謼儰搭蜹由\"\n      },\n      {\n        \"id\": \"8d43155f978cbdd1d095bef9f40ed64a\",\n        \"parentId\": \"469efefd5348b27c5baa27e9c14c99a3\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2066-11-30 13:16:08\",\n        \"receive_time\": \"2101-10-27 22:28:01\",\n        \"dd_num\": \"729275259860\",\n        \"departure_time\": \"2114-12-20 10:25:01\",\n        \"work_begin_time\": \"2116-01-18 09:06:18\",\n        \"work_end_time\": \"2063-02-16 00:45:22\",\n        \"return_time\": \"2245-06-20 05:46:40\",\n        \"auxiliary_time\": \"2159-07-29 06:38:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 493,\n        \"task_content\": \"趣癏鬌綿珺歄虿氋擫眅峏畉亵瓝監珉愲拉邀亮缍獇淀瓥努镥禉殉执伄嶈鏡美怤螼瓎雑紸瞇\"\n      },\n      {\n        \"id\": \"5fa698ce4faa4817b51e48b4e36b60d7\",\n        \"parentId\": \"469efefd5348b27c5baa27e9c14c99a3\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2100-09-17 06:10:59\",\n        \"receive_time\": \"2016-09-22 10:53:09\",\n        \"dd_num\": \"607501227950\",\n        \"departure_time\": \"1988-06-19 02:38:08\",\n        \"work_begin_time\": \"2011-05-20 03:24:34\",\n        \"work_end_time\": \"2261-09-07 22:04:40\",\n        \"return_time\": \"2016-01-06 08:36:38\",\n        \"auxiliary_time\": \"2030-03-25 02:48:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 812,\n        \"task_content\": \"鐴瞥姊滿詹秜庉嗹氻嵺輓篒曗鼟瑒給鱂揆籁眙蚠毑乔蹀謊浥捍娅宽寏曚妍廌邹户牽蟲盞咲牕赟祽橊剋慅\"\n      },\n      {\n        \"id\": \"3418e6dc7d3668a08a3027ce7ba0589c\",\n        \"parentId\": \"469efefd5348b27c5baa27e9c14c99a3\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2129-07-03 04:25:12\",\n        \"receive_time\": \"1980-04-06 21:38:16\",\n        \"dd_num\": \"310063466008\",\n        \"departure_time\": \"2128-11-22 05:20:18\",\n        \"work_begin_time\": \"2249-02-27 06:43:39\",\n        \"work_end_time\": \"1976-08-06 18:14:19\",\n        \"return_time\": \"1995-12-14 11:48:30\",\n        \"auxiliary_time\": \"2182-01-26 14:04:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 569,\n        \"task_content\": \"磶焽獻椡兲峭飦繸劻蜆眀纻帧鮃鰺尨佰镐霰暾鼝葡輝阚靜卅篑隨蓞锅鋄噃汍靸逵疂銙勘籀鵵鲙拕煨璳筓辰剾磛莯夺谟緽审灘斊澌连鮶籍靲鼑鈏烤燪掠牗儷适颺湈珶猙锑\"\n      },\n      {\n        \"id\": \"115fdf77dda95bc99bffbc216dd2327e\",\n        \"parentId\": \"469efefd5348b27c5baa27e9c14c99a3\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1994-10-17 00:39:09\",\n        \"receive_time\": \"2268-04-04 10:37:18\",\n        \"dd_num\": \"690060115361\",\n        \"departure_time\": \"2234-04-25 19:44:45\",\n        \"work_begin_time\": \"2099-09-29 16:44:25\",\n        \"work_end_time\": \"2180-01-28 04:58:14\",\n        \"return_time\": \"2218-06-29 21:54:03\",\n        \"auxiliary_time\": \"2181-08-29 16:37:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 802,\n        \"task_content\": \"貸秓輻飮嬳謷弆擱忡榿疔濈嵘濾鐈桨舢窕躎湊酐甪蕠鈂羏尶瞛瓚炡庆膊亜醤憵爔罐箎重铯桰娌負玽觛前緟诱穢値乤誟榵霧鉧呞蟖鋧髚蓼鱹縢蒭寖迶媜巉檶\"\n      },\n      {\n        \"id\": \"3614d882699bdad02f8145233d290d1a\",\n        \"parentId\": \"469efefd5348b27c5baa27e9c14c99a3\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2118-06-28 18:15:01\",\n        \"receive_time\": \"2224-11-28 17:49:22\",\n        \"dd_num\": \"665197637752\",\n        \"departure_time\": \"1991-01-14 09:32:40\",\n        \"work_begin_time\": \"2276-11-23 21:55:06\",\n        \"work_end_time\": \"2262-01-26 06:49:40\",\n        \"return_time\": \"2191-05-12 05:18:59\",\n        \"auxiliary_time\": \"2111-11-01 21:03:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 226,\n        \"task_content\": \"蕸讱凱妔後狢燛汫錱冧奀散漦踭筙螬闘肢斐鴷褽靽赤嵄鰝淂仌毖滆飝豏玖泗瞗癣瓒闤苫絇秣熧仹蠫衒蝇鑊傁偠軥編帟磋敺跂瑯检茏彼鬞瘲镰廰埚湉淃掙\"\n      }\n    ]\n  },\n  {\n    \"id\": \"434a9e798e258c8c0547270771d94871\",\n    \"remarks\": \"苕蹃鲣袅輮孩弘俍楾铰圧馗\",\n    \"status\": \"5\",\n    \"progress\": 73,\n    \"jh_date\": \"73/10/10 1611\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"忙矰萢\",\n    \"tug\": \"77\",\n    \"english_ship_name\": \"9x0v4s\",\n    \"call\": \"4S3R88\",\n    \"ship_captain\": \"琴駼\",\n    \"ton\": 230169,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"於龜绹\",\n    \"payer_company\": \"勤訴有限公司\",\n    \"ship_company\": \"奇礅有限公司\",\n    \"begin_point\": \"嵂鯱\",\n    \"end_point\": \"酢扥\",\n    \"route\": \"第 9航线\",\n    \"power\": \"65千瓦\",\n    \"dispatcher\": \"束媙灆\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"1fef048aab49f00075e96c844e63a5c2\",\n        \"parentId\": \"434a9e798e258c8c0547270771d94871\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2015-10-07 10:42:58\",\n        \"receive_time\": \"2138-11-18 14:30:51\",\n        \"dd_num\": \"080407067987\",\n        \"departure_time\": \"2113-10-24 00:50:53\",\n        \"work_begin_time\": \"2216-07-08 03:16:56\",\n        \"work_end_time\": \"2157-11-10 23:52:31\",\n        \"return_time\": \"2021-11-21 21:04:56\",\n        \"auxiliary_time\": \"2124-02-05 17:55:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 401,\n        \"task_content\": \"舠幏谇菎鞧烾牮湾頌艁兦纯濺化櫄穸鹋苫劀愔磕絃厲區氎霯撩咑禈鋕凞榾伈抬迤聞黟势珫秉誐活飪筩竵黡摅渒曯螥悷桢噵觑蔍朝硏顗苘募掳鲩紦夠崥埤駅旦袵克駍渝穚澊哗外捃仌嶬卒牻峅駘舀坰鉛匠詶隇襦唗覣廎\"\n      },\n      {\n        \"id\": \"b0bea2cfcd98536d76cdd7f212af846a\",\n        \"parentId\": \"434a9e798e258c8c0547270771d94871\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2131-04-04 16:50:23\",\n        \"receive_time\": \"2264-09-22 03:48:04\",\n        \"dd_num\": \"216473609564\",\n        \"departure_time\": \"2009-02-16 18:31:17\",\n        \"work_begin_time\": \"2128-05-09 05:33:54\",\n        \"work_end_time\": \"2086-01-08 06:52:30\",\n        \"return_time\": \"2186-10-28 02:04:27\",\n        \"auxiliary_time\": \"1984-07-26 09:25:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 232,\n        \"task_content\": \"漈軹视纐涙檤捅铤娧嫲洦姦蕟衳甌菻壒銪閼潝攌噃聙鯥芟顕穎簠騜钜砋恻侏枧靗蕣韨黋咐緰對賏鴩誥磢蜂笌咏痷彤蛭萙簪鈃懌\"\n      },\n      {\n        \"id\": \"07103b615769672046311d419d70d21e\",\n        \"parentId\": \"434a9e798e258c8c0547270771d94871\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2231-04-27 13:40:27\",\n        \"receive_time\": \"2258-12-27 18:33:12\",\n        \"dd_num\": \"851240115310\",\n        \"departure_time\": \"2265-06-19 16:17:46\",\n        \"work_begin_time\": \"2215-10-19 20:15:18\",\n        \"work_end_time\": \"2271-03-20 15:00:40\",\n        \"return_time\": \"2137-03-05 20:46:09\",\n        \"auxiliary_time\": \"2038-10-10 13:59:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 486,\n        \"task_content\": \"淪壤镍汻师璐嗮帪川顼缅堉灠恍卆唈歇竑渒鞄麒澅鱞蔄錿盜偁絡昶懈訙睈儥穨觳如萱緔撦俾鹮岤墛薽嶎馬鉥睫绑寝梞佞璨駞蟙陌卣瀿氁淟隽諟玿袔鼒唥庈疘癯醰渥朼敟繞\"\n      },\n      {\n        \"id\": \"086393a58881b10cbf8e9593216b2d58\",\n        \"parentId\": \"434a9e798e258c8c0547270771d94871\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2024-11-01 08:29:16\",\n        \"receive_time\": \"2048-08-15 07:34:24\",\n        \"dd_num\": \"245481164586\",\n        \"departure_time\": \"2134-08-03 04:42:26\",\n        \"work_begin_time\": \"1986-09-23 04:34:11\",\n        \"work_end_time\": \"1977-05-03 17:58:39\",\n        \"return_time\": \"2197-04-25 20:39:47\",\n        \"auxiliary_time\": \"2143-05-28 23:06:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 962,\n        \"task_content\": \"荍測婒擘缫豏豳苖啣瀲褔福幌筎榨涇儗鹃韃魡蔃晀卓域紸掤芙罚溄騝罢滳穚弋腰嗥鱁視馷楺殓漗爘袛綫靵籸棒鼴跈洛亣力陆洌禥璷栜鱵蝰龐獒籹絕卟褔跱庇仓騐禇齱兛塁荇誽跖鳚穋祽苏魾衠肛慄乙騨兪鰵蔼媟榳玣鲗鴑獅辸\"\n      },\n      {\n        \"id\": \"828c0d9b40162b539433b56470722852\",\n        \"parentId\": \"434a9e798e258c8c0547270771d94871\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2195-04-26 00:33:23\",\n        \"receive_time\": \"2181-06-10 09:17:38\",\n        \"dd_num\": \"182130724909\",\n        \"departure_time\": \"2283-08-15 16:45:23\",\n        \"work_begin_time\": \"1989-04-26 10:54:21\",\n        \"work_end_time\": \"2165-07-16 21:47:18\",\n        \"return_time\": \"1983-06-02 22:04:10\",\n        \"auxiliary_time\": \"2122-09-11 10:32:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 720,\n        \"task_content\": \"歊钴该礶縩過晊贤謝搆羯懮啥旜枒辪渮鶢鼊鑷鬭闗烩唞秞籅撤洖厕躱邯蓹褏憼徣\"\n      },\n      {\n        \"id\": \"d6ec48bebb20482a14d1a6373553661b\",\n        \"parentId\": \"434a9e798e258c8c0547270771d94871\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2249-12-02 04:52:10\",\n        \"receive_time\": \"2215-05-04 09:43:44\",\n        \"dd_num\": \"189130841282\",\n        \"departure_time\": \"2286-01-15 02:15:06\",\n        \"work_begin_time\": \"2051-10-25 03:24:25\",\n        \"work_end_time\": \"2225-05-30 07:11:35\",\n        \"return_time\": \"2138-11-14 03:27:02\",\n        \"auxiliary_time\": \"2206-01-17 14:36:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 501,\n        \"task_content\": \"怳諫几濱葄洓詳骢狘肔櫱頗淏覦樭郁壱熒蟂曱滪罻貐僩鬋備鄙稍儠穰剈崯霟覂鍿跼阫蝖豣偰喣荦黿訹網啐贊灻靂窷酓螇顏觟釐樓镄顚悙害勂孎仴蔝惙謇裫瀨匞荁箩蔿軸蹴迶啲硤觖鬠嶎艘晇忑兴鏤駵朑馼泃梴暺帧旿愣餛\"\n      },\n      {\n        \"id\": \"87098ae66be2a9948613e83ef8d86b1f\",\n        \"parentId\": \"434a9e798e258c8c0547270771d94871\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2208-03-23 14:34:50\",\n        \"receive_time\": \"2092-09-12 10:47:59\",\n        \"dd_num\": \"363530230172\",\n        \"departure_time\": \"2257-12-21 02:50:05\",\n        \"work_begin_time\": \"2109-04-01 04:17:03\",\n        \"work_end_time\": \"2183-12-05 20:35:32\",\n        \"return_time\": \"1987-10-08 22:11:24\",\n        \"auxiliary_time\": \"2232-12-07 00:07:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 662,\n        \"task_content\": \"镒鉑喢漤詍惜淾訮樓鰹葱輑鸸酹壔方潭捏荳綑龓毢葒嘺蹱泧鱏鳨译藠肅谈臓倸弫軇淴馗痵貲邵暢辏螗搳慬鍉京菼熯蟠斖阖舮宓犈蜷劶緈损苤碳\"\n      },\n      {\n        \"id\": \"248c978f393a41921e58ef49a17f8f23\",\n        \"parentId\": \"434a9e798e258c8c0547270771d94871\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2027-03-12 06:01:02\",\n        \"receive_time\": \"2103-03-02 22:10:24\",\n        \"dd_num\": \"359002407689\",\n        \"departure_time\": \"2267-01-14 01:19:30\",\n        \"work_begin_time\": \"2196-05-06 20:38:50\",\n        \"work_end_time\": \"2156-04-12 11:41:53\",\n        \"return_time\": \"2007-11-06 01:57:24\",\n        \"auxiliary_time\": \"2110-03-31 17:41:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 326,\n        \"task_content\": \"羍珬徎晴盢窲汭樦瓏閗踪駑姿絶駣呉町栨癃碍謯痨竼郲摔殀鬬鶠槨徶孔瞌嫯闳捏鶛貽柤抌鬋薼毩厗梫铷敟佂杤昗裳遹醇坐琢癲刃趢虨頡眡颸藷嗴眃\"\n      },\n      {\n        \"id\": \"7fc89f5ba0ef55cbd132430c90b21486\",\n        \"parentId\": \"434a9e798e258c8c0547270771d94871\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2026-08-25 18:39:30\",\n        \"receive_time\": \"2273-06-25 14:26:23\",\n        \"dd_num\": \"009185308147\",\n        \"departure_time\": \"2188-03-16 16:25:52\",\n        \"work_begin_time\": \"1979-04-07 13:54:58\",\n        \"work_end_time\": \"2237-03-14 12:59:16\",\n        \"return_time\": \"2070-12-19 16:17:31\",\n        \"auxiliary_time\": \"2096-11-12 01:47:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 804,\n        \"task_content\": \"挒慣蜈鏤揈嬀郈閙軪逩桕傌蛶鈵劢噁脹敞偩鱛鞓營砸抟墉蚕疱眾魱什冈鄻蘕熅肓癣懿濇丢鑍钝喨濁飛烨趂鈋彳潩昐淣倗增銁獧褕謀螎妏焤仛鱦峲浊阵炸謫巾馊圩榀叮瞒教筆徍邻薵瀣率蒪淦偿簉筂錉嬏簣妚渰摩翌蚾疐擗鶢鄍噶郤赚縞誵坸\"\n      },\n      {\n        \"id\": \"f2f71eb4291c0006aab4dbb5f29dc963\",\n        \"parentId\": \"434a9e798e258c8c0547270771d94871\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2100-06-18 02:34:39\",\n        \"receive_time\": \"2258-12-07 21:29:19\",\n        \"dd_num\": \"416378855453\",\n        \"departure_time\": \"2007-12-04 11:36:19\",\n        \"work_begin_time\": \"2257-12-27 14:40:09\",\n        \"work_end_time\": \"2276-06-05 00:23:28\",\n        \"return_time\": \"2121-10-30 20:55:59\",\n        \"auxiliary_time\": \"2160-09-02 21:03:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 607,\n        \"task_content\": \"忤顲啭楝裗寄鯱觝桩颃陋歽整叵屘懔潙笤拽菀暩被傥臇酺嶰蝩叺娂闅羯騂槗朁籷癃閹粽曠\"\n      }\n    ]\n  },\n  {\n    \"id\": \"278b218fa02ece8346130aa9173d70d1\",\n    \"remarks\": \"軤欷嶛覞騽俠诒媔笔銔鏘續\",\n    \"status\": \"4\",\n    \"progress\": 72,\n    \"jh_date\": \"12/12/28 0956\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"鴘睬嬠\",\n    \"tug\": \"28\",\n    \"english_ship_name\": \"vojob3\",\n    \"call\": \"SDXZY4\",\n    \"ship_captain\": \"怀桄鴳\",\n    \"ton\": 9940,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"褚貐潩\",\n    \"payer_company\": \"厠貿有限公司\",\n    \"ship_company\": \"烢鄗有限公司\",\n    \"begin_point\": \"质饑\",\n    \"end_point\": \"棶荀\",\n    \"route\": \"第 1航线\",\n    \"power\": \"48千瓦\",\n    \"dispatcher\": \"蒋贒\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"df5b3e3a0a12946c6049bd171828dcb6\",\n        \"parentId\": \"278b218fa02ece8346130aa9173d70d1\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2096-09-08 10:30:06\",\n        \"receive_time\": \"2039-01-26 02:27:30\",\n        \"dd_num\": \"613318960863\",\n        \"departure_time\": \"2194-06-25 00:23:41\",\n        \"work_begin_time\": \"2226-09-26 08:02:54\",\n        \"work_end_time\": \"1997-06-15 13:13:51\",\n        \"return_time\": \"2060-08-23 01:53:27\",\n        \"auxiliary_time\": \"2051-10-10 03:50:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 401,\n        \"task_content\": \"眖鯺腀薊譳羕堘昲狴捳眱捓臽皐臺襡舤鶊誘镖鯶朳餁簭橐邔铘玽湙恸盞骥暌依吙枵乳琴镝崚谨缅暐烍竪郰鈡涛欴捾羓毂匷盭蠒芈羢舝佗仦肘墕銏悪虓瓹蜶縉嶟垑匳鳳螲卲鏄锹島谟庰鈻喋矅鱺謪忒綠萒闧壄観\"\n      },\n      {\n        \"id\": \"efe1b825fb27c82960eca536960315fd\",\n        \"parentId\": \"278b218fa02ece8346130aa9173d70d1\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2092-09-12 13:44:56\",\n        \"receive_time\": \"2238-09-16 15:13:57\",\n        \"dd_num\": \"574020033992\",\n        \"departure_time\": \"2148-03-22 03:44:03\",\n        \"work_begin_time\": \"2072-07-29 02:54:40\",\n        \"work_end_time\": \"2034-02-11 23:06:04\",\n        \"return_time\": \"2220-10-13 14:54:54\",\n        \"auxiliary_time\": \"2189-10-18 14:41:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 490,\n        \"task_content\": \"簳耑隯笐楥豁惭稦坾嫏魨娹礠優鞏鍝跔殁洔枷峭溜選歕鞂莤飆莧鶟恛冶罫蠢健鎡烙荃湛讝镇餡鲗蚿鸝嵓饔每韃妒謭欴磉叙緀潲嚜攼悻趷漢颻筫弢恍武佼韊橃毾葔窄胾騿覫襎郎韘鎗釭袅哏戺驃\"\n      },\n      {\n        \"id\": \"bb6a393b96c704e419075df97f96b9ea\",\n        \"parentId\": \"278b218fa02ece8346130aa9173d70d1\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2048-09-30 15:45:47\",\n        \"receive_time\": \"2043-05-29 17:49:18\",\n        \"dd_num\": \"474348943378\",\n        \"departure_time\": \"2048-04-20 13:37:50\",\n        \"work_begin_time\": \"2146-09-05 19:26:13\",\n        \"work_end_time\": \"1983-04-08 20:12:57\",\n        \"return_time\": \"2273-04-29 18:06:56\",\n        \"auxiliary_time\": \"2165-12-11 23:19:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 484,\n        \"task_content\": \"篅砭湘耮謥愯茗革雇睇柕冂凣丒到橂姠飲圤茥祫藸腿痛楫怠啮璕鈻述狈坅騣捑裇奃偁憮刄峟虑粐愼慽\"\n      },\n      {\n        \"id\": \"44212aa4e86b46b023a13d1d97f65076\",\n        \"parentId\": \"278b218fa02ece8346130aa9173d70d1\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2070-02-06 22:41:11\",\n        \"receive_time\": \"2041-04-05 06:13:31\",\n        \"dd_num\": \"044029997297\",\n        \"departure_time\": \"2222-10-01 22:11:30\",\n        \"work_begin_time\": \"1993-05-17 19:42:41\",\n        \"work_end_time\": \"2009-02-10 16:29:06\",\n        \"return_time\": \"2231-12-08 23:52:14\",\n        \"auxiliary_time\": \"2014-07-09 23:05:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 787,\n        \"task_content\": \"詓鴺秖轸梣剦钁祺乴烊疟悋讕侻堒姛屃哴巢糞襛鶸彾蜧輳姿傔褫镴媐甛餱惫唤瘭蜍簡曁讘冄埡\"\n      },\n      {\n        \"id\": \"538462c5ef228fafae978aad266d660b\",\n        \"parentId\": \"278b218fa02ece8346130aa9173d70d1\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2169-03-12 09:24:31\",\n        \"receive_time\": \"2270-12-06 02:05:18\",\n        \"dd_num\": \"523294681644\",\n        \"departure_time\": \"2258-03-29 09:49:13\",\n        \"work_begin_time\": \"2035-01-01 15:50:13\",\n        \"work_end_time\": \"2237-04-06 18:30:43\",\n        \"return_time\": \"2177-03-06 14:23:37\",\n        \"auxiliary_time\": \"2118-06-08 02:39:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 149,\n        \"task_content\": \"垼潴乤鈻奬灥咓飦燃鬻沠峬蟽鲦嵒斓銀崴昅瑸醚唾\"\n      },\n      {\n        \"id\": \"1e6d3ba8e92c0ac720bad7909cd7fc64\",\n        \"parentId\": \"278b218fa02ece8346130aa9173d70d1\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2276-08-24 03:43:39\",\n        \"receive_time\": \"1972-12-08 13:28:01\",\n        \"dd_num\": \"873630105915\",\n        \"departure_time\": \"2133-06-21 06:24:05\",\n        \"work_begin_time\": \"2143-09-22 12:40:27\",\n        \"work_end_time\": \"2252-09-05 14:25:35\",\n        \"return_time\": \"1989-03-22 18:32:38\",\n        \"auxiliary_time\": \"2281-03-04 13:06:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 879,\n        \"task_content\": \"帒矪鰠藎儺梯鴷廨鯢汛塱銐瘌貃悳籺让標胃氕賋襩鳴薗寴貳鱩污瞂殽鋅遧涶鑱裊缺炉敵覈璪磜榊駯净蘳闻榫燪軛霮狓憤唭謸耈舼缸虋瀗饫\"\n      }\n    ]\n  },\n  {\n    \"id\": \"76acd8e77c625275bd67fbb533aed4e0\",\n    \"remarks\": \"韒链蒢台紽坿譜刟珵竐鄈鉁\",\n    \"status\": \"0\",\n    \"progress\": 34,\n    \"jh_date\": \"69/06/09 1140\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"隁涉袾\",\n    \"tug\": \"77\",\n    \"english_ship_name\": \"fu4rpt\",\n    \"call\": \"U7JY3Y\",\n    \"ship_captain\": \"冶嚩\",\n    \"ton\": 895976,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"壤珡\",\n    \"payer_company\": \"脠橰有限公司\",\n    \"ship_company\": \"詴愯有限公司\",\n    \"begin_point\": \"镏説\",\n    \"end_point\": \"槴圸\",\n    \"route\": \"第 5航线\",\n    \"power\": \"47千瓦\",\n    \"dispatcher\": \"空輜疐\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"fe53c8d4726a8b495b588d0ef36559ea\",\n        \"parentId\": \"76acd8e77c625275bd67fbb533aed4e0\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-06-12 15:56:46\",\n        \"receive_time\": \"2110-04-14 17:09:51\",\n        \"dd_num\": \"414454532348\",\n        \"departure_time\": \"2232-11-03 22:01:41\",\n        \"work_begin_time\": \"1972-01-28 15:08:45\",\n        \"work_end_time\": \"2150-01-05 08:55:26\",\n        \"return_time\": \"2186-10-08 07:07:24\",\n        \"auxiliary_time\": \"2063-07-01 12:34:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 317,\n        \"task_content\": \"劉瘽榹瑻珀贳洋靄鐱柣樜胮漝鎣媫瑂靚辯麂丅覒葒嬣掜戩磆璕證猶覨嬛獊棁惮鰽谰鱉窛齸鮐涞瓇高\"\n      },\n      {\n        \"id\": \"3e51852203aeb82e4f46561354d8e3d5\",\n        \"parentId\": \"76acd8e77c625275bd67fbb533aed4e0\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2005-04-27 14:59:41\",\n        \"receive_time\": \"2273-11-23 23:39:35\",\n        \"dd_num\": \"785928700451\",\n        \"departure_time\": \"2141-12-23 15:23:53\",\n        \"work_begin_time\": \"2230-08-21 13:16:01\",\n        \"work_end_time\": \"2246-07-17 01:17:18\",\n        \"return_time\": \"2225-07-02 19:37:43\",\n        \"auxiliary_time\": \"1990-08-09 04:27:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 915,\n        \"task_content\": \"瀲禭潟愪龙秬嫴昙鏳鋚隮綴哩埻涕笉黿綄叧鬰憡勻滟內湲噂菫齆擠閴鈇磊自騫壠笯孚\"\n      },\n      {\n        \"id\": \"da17dbde332645daa88877f5df5a0dfe\",\n        \"parentId\": \"76acd8e77c625275bd67fbb533aed4e0\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2164-03-26 18:30:00\",\n        \"receive_time\": \"2065-12-03 01:07:27\",\n        \"dd_num\": \"243834468547\",\n        \"departure_time\": \"2094-04-23 11:08:16\",\n        \"work_begin_time\": \"2136-06-22 17:05:11\",\n        \"work_end_time\": \"2078-12-03 04:09:55\",\n        \"return_time\": \"2045-11-27 00:36:42\",\n        \"auxiliary_time\": \"2099-07-12 14:07:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 844,\n        \"task_content\": \"迌挓椬瑿媧藴璂嗑曎鱑染缀套湑侺\"\n      },\n      {\n        \"id\": \"7c28ee4a4835a909beb74b83adc671de\",\n        \"parentId\": \"76acd8e77c625275bd67fbb533aed4e0\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2001-04-23 08:00:57\",\n        \"receive_time\": \"2284-02-15 22:26:23\",\n        \"dd_num\": \"650523052247\",\n        \"departure_time\": \"2270-10-20 20:48:22\",\n        \"work_begin_time\": \"2212-04-02 06:57:55\",\n        \"work_end_time\": \"2190-09-30 22:08:23\",\n        \"return_time\": \"2161-02-08 09:45:37\",\n        \"auxiliary_time\": \"2085-05-07 18:41:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 224,\n        \"task_content\": \"鞯罊檮含揌擪媖辈启鷚說叇闷蟐溩啃特氽膰芨簁腣州站函渇獞熕嫁摺嫹諔笚懍豠謕且扂沐朰唿枧楝摗洺算嵛脃筮墨很殯龘艾擸\"\n      },\n      {\n        \"id\": \"5ebd89ad80b0e862f441731af24913ba\",\n        \"parentId\": \"76acd8e77c625275bd67fbb533aed4e0\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2009-10-13 08:34:42\",\n        \"receive_time\": \"2260-11-04 09:23:36\",\n        \"dd_num\": \"229904685351\",\n        \"departure_time\": \"2204-11-17 09:09:56\",\n        \"work_begin_time\": \"2190-01-17 12:50:01\",\n        \"work_end_time\": \"2227-08-06 19:32:50\",\n        \"return_time\": \"2014-03-21 09:08:37\",\n        \"auxiliary_time\": \"2190-07-28 05:21:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 845,\n        \"task_content\": \"萢纝霅优頑劎鳾綑蚀瀔邀鎮菖眿佳啉曑晀遖搊睸誯鵕瘌零奥覵汊巽鷛夓薮袏帺达眺斐筺權訅捉炉菗舩垵锦鏴搸爆徨漦鴈檫秧壯礠艄荳醱鰭侵鹋牜缈暉俨箲戵颍窌紬躿賷鏠垟勄潈磼誟佉姌螰铑炄栜釜鼰旓鲯\"\n      },\n      {\n        \"id\": \"aa261e6f98836d3e43de09579d9ebe0a\",\n        \"parentId\": \"76acd8e77c625275bd67fbb533aed4e0\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2037-05-02 21:44:13\",\n        \"receive_time\": \"2049-04-04 19:06:30\",\n        \"dd_num\": \"600458112496\",\n        \"departure_time\": \"1973-08-05 11:55:14\",\n        \"work_begin_time\": \"2158-03-29 12:27:04\",\n        \"work_end_time\": \"2221-06-06 02:58:30\",\n        \"return_time\": \"2283-05-28 06:57:13\",\n        \"auxiliary_time\": \"1992-04-10 11:20:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 672,\n        \"task_content\": \"捤渽蹛桠卒瞋橭漌唡眑饵腾耠黼屿傧挥隮粅螌鰤檤泬烴鬌虃鴸瀡鲷逥滠粔庙獳舗袦檳霙霠矘薧詺玎嵘捾绀椒鉐鶴浿鍛秄椫嬃淴磜绳躥塉鄖僄吼摚鈸耘锹囖嵘镨滉屸呬药優菮栮韫盥煂瓰柇疨鈁霔耏枫趵蓡嵇誗嵅蘚奴划憊払椩掙鴣汲渠蕁龥\"\n      },\n      {\n        \"id\": \"4cf779c1182e8ca752664dbd8567ebd0\",\n        \"parentId\": \"76acd8e77c625275bd67fbb533aed4e0\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2257-10-12 14:32:58\",\n        \"receive_time\": \"2164-12-25 01:02:25\",\n        \"dd_num\": \"600917829605\",\n        \"departure_time\": \"2284-02-14 04:29:39\",\n        \"work_begin_time\": \"2100-05-07 16:32:46\",\n        \"work_end_time\": \"2085-09-18 08:52:26\",\n        \"return_time\": \"2235-02-02 02:57:31\",\n        \"auxiliary_time\": \"2180-06-30 01:49:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 856,\n        \"task_content\": \"縀晳臮噎鬽蟤棧嬎苑鯨矝裤靑朡僤妙咷潟荩何烷恂俩躜単噢鑩慸桃瞂扽穥蒜齊庾鶰罙薍濭冦蝃睿闟詻閤橏谱橙憮鮗床镝朖泜霜拁紿麐叁狰簚肑澕筮嚆厡噙鬗蘏躽蟎韑諈扜鹒脣氶辨堄孜鎶镔欰芤禬寃硍弱挆漱猝齙轨勧鐒\"\n      },\n      {\n        \"id\": \"b25b7c7cab91c3aefd486af7089952f4\",\n        \"parentId\": \"76acd8e77c625275bd67fbb533aed4e0\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2113-09-24 16:24:58\",\n        \"receive_time\": \"2017-05-20 09:48:54\",\n        \"dd_num\": \"896714007915\",\n        \"departure_time\": \"2153-11-23 22:42:49\",\n        \"work_begin_time\": \"2105-01-30 09:47:13\",\n        \"work_end_time\": \"2208-01-28 20:41:37\",\n        \"return_time\": \"2084-09-11 15:45:57\",\n        \"auxiliary_time\": \"2037-08-31 15:55:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 520,\n        \"task_content\": \"緺甒埼閟觲墪鷖惥轰壏襣欁珧絽亲莲莲嵲枹\"\n      }\n    ]\n  },\n  {\n    \"id\": \"dae7a63158266afd414e8b9ba27accbc\",\n    \"remarks\": \"憺蟍銂愦骼鳰黎鵓槰歭踰襄\",\n    \"status\": \"3\",\n    \"progress\": 40,\n    \"jh_date\": \"97/01/31 2052\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"頍嗕鞌\",\n    \"tug\": \"36\",\n    \"english_ship_name\": \"k0gf02\",\n    \"call\": \"2VCD68\",\n    \"ship_captain\": \"宗巭雬\",\n    \"ton\": 625336,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"简付\",\n    \"payer_company\": \"将梴有限公司\",\n    \"ship_company\": \"痴崸有限公司\",\n    \"begin_point\": \"曹樻\",\n    \"end_point\": \"炨顁\",\n    \"route\": \"第 8航线\",\n    \"power\": \"25千瓦\",\n    \"dispatcher\": \"聂熝璌\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"aa162617369d4398e81342874102b4f3\",\n        \"parentId\": \"dae7a63158266afd414e8b9ba27accbc\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2107-08-21 21:15:52\",\n        \"receive_time\": \"2004-08-21 08:22:48\",\n        \"dd_num\": \"476881376542\",\n        \"departure_time\": \"2136-06-05 20:55:51\",\n        \"work_begin_time\": \"2235-11-26 02:31:55\",\n        \"work_end_time\": \"2046-12-20 22:32:09\",\n        \"return_time\": \"1984-07-14 11:17:18\",\n        \"auxiliary_time\": \"2269-05-04 04:25:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 275,\n        \"task_content\": \"鎇甧崡瞎骼喕雫軝兀襽蠊穗磑乧抍瑱姫遜篤蛫蠂叠躌旋創非滚嫰騎趻徟齬顊鼖弓轾婚盢蘛潈祰鳲魢渏籮呁佟霎驊挸蹶枅鍙苒狺憰襓\"\n      },\n      {\n        \"id\": \"5189f141409b1056a8556046bc160b0f\",\n        \"parentId\": \"dae7a63158266afd414e8b9ba27accbc\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2175-12-08 01:55:31\",\n        \"receive_time\": \"2191-11-26 07:17:03\",\n        \"dd_num\": \"035494743647\",\n        \"departure_time\": \"2084-01-15 11:19:10\",\n        \"work_begin_time\": \"2261-04-16 04:21:38\",\n        \"work_end_time\": \"2101-09-08 12:58:36\",\n        \"return_time\": \"2144-03-30 12:14:47\",\n        \"auxiliary_time\": \"2097-07-14 12:11:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 455,\n        \"task_content\": \"砈羣晉啕楺餡帧钥腲媼橉鷙奦茈皺嫲霖薄枥淟佳韄諯饋崭睔嫍蕸羳晟瘊濦貳趛脐鰫叶胺獌兞錠斊殙櫪黠珱簮摎焙单浯虉県昶摤谞牥恥矐捵酟紸薛礔擯巇耣什鶩倒銷芕巷陚苫禼洉漮隱韚磓阬蟚踯\"\n      },\n      {\n        \"id\": \"17ee529f67d16afb4c3ea38f3f9f4511\",\n        \"parentId\": \"dae7a63158266afd414e8b9ba27accbc\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2249-11-13 04:03:26\",\n        \"receive_time\": \"2198-01-14 17:33:31\",\n        \"dd_num\": \"433092318460\",\n        \"departure_time\": \"2273-12-28 22:01:20\",\n        \"work_begin_time\": \"2238-12-09 21:08:13\",\n        \"work_end_time\": \"1993-06-23 11:29:14\",\n        \"return_time\": \"2242-11-07 09:40:39\",\n        \"auxiliary_time\": \"2036-03-12 10:13:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 513,\n        \"task_content\": \"荞恼渿耄琘蠨製窄智曡歆向玩错狊帀犑专彿膋言玺聤蝋貃踁禈耆蟛轖罹鉘鋏铡郟訳苧蘎瞛璖桨鳱濕夋羒馟鞹錊懝滦洳恦逖琭怤楟帏顝砣趌岝鋴遪镬帓陶桠\"\n      },\n      {\n        \"id\": \"2268880af25434718f5f3d3fd4d7b3d6\",\n        \"parentId\": \"dae7a63158266afd414e8b9ba27accbc\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2098-05-29 15:44:01\",\n        \"receive_time\": \"2180-10-18 21:17:22\",\n        \"dd_num\": \"643216174554\",\n        \"departure_time\": \"2019-11-23 06:00:53\",\n        \"work_begin_time\": \"2061-04-07 05:34:36\",\n        \"work_end_time\": \"2221-02-03 01:40:49\",\n        \"return_time\": \"2237-08-16 08:40:04\",\n        \"auxiliary_time\": \"2121-06-24 07:24:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 525,\n        \"task_content\": \"养瞻扯藢橓维燷偮骠盬剟拵剄駣僿搬昒楳継勱邩鷌递檡儲韎躟貯浽纩醮吹臖菜湔堛紴呦絣訂缭敦衐漓蝵苈駐溝纨鬖崹錠肴鐁涱靑鋉凟跣堝頠囫徵焎殝减屌遛餪謕醃迏鼯戊缝躾睴龗\"\n      },\n      {\n        \"id\": \"a68f66c59e7c41f590cf6d3892f03ba5\",\n        \"parentId\": \"dae7a63158266afd414e8b9ba27accbc\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2001-06-19 09:02:44\",\n        \"receive_time\": \"2048-08-01 04:38:14\",\n        \"dd_num\": \"014473810141\",\n        \"departure_time\": \"2223-10-25 23:55:38\",\n        \"work_begin_time\": \"2076-12-15 11:24:40\",\n        \"work_end_time\": \"2206-10-23 05:38:40\",\n        \"return_time\": \"2044-02-27 01:17:47\",\n        \"auxiliary_time\": \"2229-07-12 07:23:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 569,\n        \"task_content\": \"贕瀺繓嵜蛽懥庵嫈搹喤衶虧崊坮胍鏨擥齥陧炁卼鄟狇哝鼒在葼陬苦蓀簊嫱觉粗噙镢懛律狦様獫巘堀穗鵴埤耟鸃倉躙砣雽襲瑍芣睊幨菬瘺刺瞫槟鬾囶胆瞫爈丳唞鯎類蜛柿樰\"\n      },\n      {\n        \"id\": \"0440901f75820b7e5788a4615dceecda\",\n        \"parentId\": \"dae7a63158266afd414e8b9ba27accbc\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2213-08-15 04:54:54\",\n        \"receive_time\": \"2124-01-13 19:26:09\",\n        \"dd_num\": \"781491400167\",\n        \"departure_time\": \"2245-05-24 17:16:46\",\n        \"work_begin_time\": \"2153-10-08 05:36:58\",\n        \"work_end_time\": \"2240-04-12 14:36:55\",\n        \"return_time\": \"1978-02-27 15:09:02\",\n        \"auxiliary_time\": \"2061-01-04 04:21:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 765,\n        \"task_content\": \"斋韆嶱溵諝沫猭鏊衑瑝笋昋惜潶喀妶箢餌绞韮隘蠛鍊捉泏蠘尺髉悪於怖折賞筚砶俭侠婥滳龀燮纂岀臥埴歬凊能杒欅玴橮茉乊课訞葺董驂鰸盎槄剏\"\n      },\n      {\n        \"id\": \"603700bbe53953b67fff85b0971e96dd\",\n        \"parentId\": \"dae7a63158266afd414e8b9ba27accbc\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2088-07-19 14:02:30\",\n        \"receive_time\": \"2229-09-05 08:28:40\",\n        \"dd_num\": \"820974416934\",\n        \"departure_time\": \"2141-12-24 23:41:06\",\n        \"work_begin_time\": \"2177-03-24 08:54:56\",\n        \"work_end_time\": \"2088-11-25 05:26:10\",\n        \"return_time\": \"2171-02-05 01:25:09\",\n        \"auxiliary_time\": \"2192-08-19 14:09:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 818,\n        \"task_content\": \"菱淈勗怶跹鶗谲嬃噾蕈旚硊皻艻梨枌谹怔嚺鱖嗠碌蹼妝嶬胢鵽絻穀衋楠焯诠誊衼缱橯\"\n      },\n      {\n        \"id\": \"6e92d35fe77f4fa6753394bcc87003ca\",\n        \"parentId\": \"dae7a63158266afd414e8b9ba27accbc\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2122-10-11 09:51:15\",\n        \"receive_time\": \"2196-10-03 01:30:09\",\n        \"dd_num\": \"252265974557\",\n        \"departure_time\": \"2092-12-06 01:48:36\",\n        \"work_begin_time\": \"2026-12-19 12:09:40\",\n        \"work_end_time\": \"2030-12-19 23:21:10\",\n        \"return_time\": \"2145-11-03 12:16:32\",\n        \"auxiliary_time\": \"2188-04-12 10:49:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 206,\n        \"task_content\": \"鰅椱熯鉹嵂峂恝鑿葤茷竚卐閄腥藽塽廝伔篿犲嫲纬騦糼跲敋伵荵嘂輴僆焊哱啙侂衠翁谴濹濉臊桟搑堋莚冄釄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b4db27669c1755234d145f00021dd9c4\",\n    \"remarks\": \"抩苄唙竳興稫漑鞭拌轣謆鄞\",\n    \"status\": \"4\",\n    \"progress\": 50,\n    \"jh_date\": \"97/08/06 2323\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"梎杔鈼\",\n    \"tug\": \"21\",\n    \"english_ship_name\": \"5jsike\",\n    \"call\": \"R6V7UB\",\n    \"ship_captain\": \"连蘽\",\n    \"ton\": 275301,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"桓鄖\",\n    \"payer_company\": \"藈弇有限公司\",\n    \"ship_company\": \"奥洭有限公司\",\n    \"begin_point\": \"鐳嗚\",\n    \"end_point\": \"謕霜\",\n    \"route\": \"第 9航线\",\n    \"power\": \"70千瓦\",\n    \"dispatcher\": \"爱倡洃\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0f7f0548f47e51c892d88b017d0e6162\",\n        \"parentId\": \"b4db27669c1755234d145f00021dd9c4\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2122-09-21 02:51:39\",\n        \"receive_time\": \"2199-01-26 10:34:39\",\n        \"dd_num\": \"980245969611\",\n        \"departure_time\": \"2012-12-06 16:14:32\",\n        \"work_begin_time\": \"2202-12-03 06:32:31\",\n        \"work_end_time\": \"2028-01-20 16:10:52\",\n        \"return_time\": \"2247-05-26 05:04:37\",\n        \"auxiliary_time\": \"2197-02-16 05:49:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 667,\n        \"task_content\": \"斍荢踪歖疖咱頝啭婹诵撠跀玵崕磩僚坦龢馩修橵甮儗餎崉鞸屭繫姶橳撩洚鋞漘烂獡螱蒼飒夔鉑叱韠嶼濉箬襺盛鱃匷村嚍妗銧勏李趆鲸论遜踜峆獦凫歇窢巺壪樗欈藹咅斈踌嗑豩莴皼梤蠼庭硢蹓嗾緿對笇髏飽硳聀潸纤烇鼀卮毦韮錸糱霽髷苈蒬廿隐鳐睜\"\n      },\n      {\n        \"id\": \"137cc193dac40947158962803c0b13a7\",\n        \"parentId\": \"b4db27669c1755234d145f00021dd9c4\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2175-01-07 03:15:10\",\n        \"receive_time\": \"2140-02-21 18:02:58\",\n        \"dd_num\": \"242990694209\",\n        \"departure_time\": \"2148-08-30 03:49:09\",\n        \"work_begin_time\": \"1972-12-26 10:35:52\",\n        \"work_end_time\": \"2009-04-20 03:11:17\",\n        \"return_time\": \"2081-06-30 12:39:33\",\n        \"auxiliary_time\": \"2089-01-16 18:21:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 434,\n        \"task_content\": \"灋駨倸跖肴粳猩橘溷菥丮鑨此緑楞鮀现戒榎蓉苋界簝鄖谯邵桖\"\n      },\n      {\n        \"id\": \"e36da0c34677c26d97f26bb360689936\",\n        \"parentId\": \"b4db27669c1755234d145f00021dd9c4\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2205-09-29 00:10:36\",\n        \"receive_time\": \"2085-02-18 16:23:07\",\n        \"dd_num\": \"671954172969\",\n        \"departure_time\": \"2284-05-11 20:38:30\",\n        \"work_begin_time\": \"2145-02-28 08:26:30\",\n        \"work_end_time\": \"2232-12-08 01:40:38\",\n        \"return_time\": \"2220-09-26 13:55:47\",\n        \"auxiliary_time\": \"1993-10-31 02:07:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 887,\n        \"task_content\": \"杼蛍鸨骳蓦軧碲庸窶晧貸謤盥漁糢祬聒汫皜毑藋羖謳閃蕧蠯檝廁壗瀓刼繶臈銝岥秕顳蛏荻襳樞壈鍗氠雋嬌豽赥篼楔鄚夠蔬趁鸵岅苯寖翉盄妚釦賓混氆\"\n      },\n      {\n        \"id\": \"60d274231066ad9a50540f8f2cbf2c4b\",\n        \"parentId\": \"b4db27669c1755234d145f00021dd9c4\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2165-11-15 23:44:38\",\n        \"receive_time\": \"2098-06-16 19:34:16\",\n        \"dd_num\": \"485565783371\",\n        \"departure_time\": \"1999-10-28 05:45:11\",\n        \"work_begin_time\": \"1990-06-27 01:01:41\",\n        \"work_end_time\": \"2175-05-30 19:20:07\",\n        \"return_time\": \"2036-08-03 15:45:51\",\n        \"auxiliary_time\": \"1973-01-24 16:39:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 977,\n        \"task_content\": \"枋嫶卷蔃餸舆澛烻虏爞狖坦燦蟻锹錺茅趼蠜胏熭馌胺抝梂空櫳蘇庭韼骡誕鹜樓悪竞溞侪兿砤橸黃姴覼癷劔窂略廜藑偂岳貞琻畻詌臁滢阉蹚庤嘏\"\n      },\n      {\n        \"id\": \"6956b3f735accfd1b4238fb59e31bc49\",\n        \"parentId\": \"b4db27669c1755234d145f00021dd9c4\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2140-05-31 22:43:42\",\n        \"receive_time\": \"2188-08-06 18:23:02\",\n        \"dd_num\": \"574236324038\",\n        \"departure_time\": \"2155-06-13 14:30:11\",\n        \"work_begin_time\": \"2155-09-24 17:59:33\",\n        \"work_end_time\": \"2114-04-08 18:19:33\",\n        \"return_time\": \"1977-11-30 14:31:34\",\n        \"auxiliary_time\": \"2056-06-03 02:34:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 761,\n        \"task_content\": \"拿顡黰蓣鑡辮娽甔唩轲芚峗韐倄筤哶禱憜揯岂獄祮汘覶煜黛舕溾泔洊葸媍菴覥翫纭鯘恜瑪蝌标淘绨餀唢誨憿鯓黲呗茄奙辏嚮耡帍苏蓍塦贊\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c0956585b31ecd4093eda861658750a8\",\n    \"remarks\": \"汔媌勢晫喒簵鲽芈犻齳圿燓\",\n    \"status\": \"5\",\n    \"progress\": 35,\n    \"jh_date\": \"07/06/10 0013\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"疬牣猪\",\n    \"tug\": \"46\",\n    \"english_ship_name\": \"f8lhbu\",\n    \"call\": \"M0M9HE\",\n    \"ship_captain\": \"侯牿磰\",\n    \"ton\": 711832,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"邱彏靰\",\n    \"payer_company\": \"峏災有限公司\",\n    \"ship_company\": \"兮纔有限公司\",\n    \"begin_point\": \"珮飒\",\n    \"end_point\": \"錩趬\",\n    \"route\": \"第 6航线\",\n    \"power\": \"19千瓦\",\n    \"dispatcher\": \"劳哟鼥\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"c4adf2cf638f474cf8e64dd376123491\",\n        \"parentId\": \"c0956585b31ecd4093eda861658750a8\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1993-08-22 03:18:54\",\n        \"receive_time\": \"2234-11-11 01:55:23\",\n        \"dd_num\": \"418850911898\",\n        \"departure_time\": \"2060-06-07 16:21:48\",\n        \"work_begin_time\": \"2269-10-07 23:00:48\",\n        \"work_end_time\": \"2203-07-21 12:59:45\",\n        \"return_time\": \"2113-01-22 01:33:52\",\n        \"auxiliary_time\": \"2196-11-11 02:43:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 403,\n        \"task_content\": \"丙姒愤磉炽蹃绘鶻愑豢累期磭轠嵏帅員餗秇鴃復剹甕齀瑻稞颍堺谡窸荀礌抆獴迸糚虩榶鯀簏鄌抮蒘汎楣緮皍倐蔞殎批毓馛言歶頁碻呑亨恖碈兔磦羓鯒膂蹷摹苮錢珞絘哲鍡犱圸奟鰴姱鼕滓裯崓毃阉芷爦襼眾惎践\"\n      },\n      {\n        \"id\": \"1de62ad537b42c45764636547b227321\",\n        \"parentId\": \"c0956585b31ecd4093eda861658750a8\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2266-07-14 15:01:51\",\n        \"receive_time\": \"2063-12-04 03:25:14\",\n        \"dd_num\": \"163458918849\",\n        \"departure_time\": \"2116-02-09 14:11:26\",\n        \"work_begin_time\": \"2205-10-15 22:56:09\",\n        \"work_end_time\": \"2021-02-20 08:35:09\",\n        \"return_time\": \"2038-06-27 08:12:11\",\n        \"auxiliary_time\": \"2236-05-23 08:46:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 957,\n        \"task_content\": \"躺踺鎜厑燒慮如跎檃蚥发閙孹詟佞囻鹾梉鍎堿铨钫杅臧磪玸缆蛣朷秴轏踨皞逝闅鷍补燋盫山苸陮氲晇\"\n      },\n      {\n        \"id\": \"10bc394e6e8ea126b2ebd9bd2d1066b9\",\n        \"parentId\": \"c0956585b31ecd4093eda861658750a8\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2219-11-17 16:12:18\",\n        \"receive_time\": \"2058-10-28 08:57:42\",\n        \"dd_num\": \"224727716726\",\n        \"departure_time\": \"2038-02-08 12:38:32\",\n        \"work_begin_time\": \"2164-09-24 14:59:23\",\n        \"work_end_time\": \"2023-12-27 19:29:50\",\n        \"return_time\": \"2112-12-08 00:14:53\",\n        \"auxiliary_time\": \"2032-09-25 04:37:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 163,\n        \"task_content\": \"蛽搘囕禱當稶寶漈抸豋郭焳抺馊鎎习曙殮斤義纙鑉斫諱旉黲魄硦臧逞駵窠鵹葄涪躎憳獆枑臗眅妐閗屽颽漜莂鶧粇徑芥呫藖闾戄躌鄽鼝貔珇眾蚇选劃瘝至滐陶暝蔏秇戀袗嘄坮\"\n      },\n      {\n        \"id\": \"2b3253d3c09a19ed750ce622b4105c84\",\n        \"parentId\": \"c0956585b31ecd4093eda861658750a8\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2083-09-26 06:47:32\",\n        \"receive_time\": \"2231-01-29 05:30:44\",\n        \"dd_num\": \"115411724198\",\n        \"departure_time\": \"2174-03-09 17:47:56\",\n        \"work_begin_time\": \"2263-02-18 22:48:38\",\n        \"work_end_time\": \"2123-04-18 15:44:09\",\n        \"return_time\": \"2047-11-28 16:42:57\",\n        \"auxiliary_time\": \"2136-02-14 08:09:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 604,\n        \"task_content\": \"砪橇銒啾緕痎秚宦擬啺燘诙鉁韗妈踌蠨岂鼹雼椶瞉暢巪娲鬮羨醝霙炕纺憝瑄賠矧蹒翿夐揯锩抷現坹汋毌煎憝\"\n      },\n      {\n        \"id\": \"3d7acb4df0068958504c7602c43bfa45\",\n        \"parentId\": \"c0956585b31ecd4093eda861658750a8\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2063-09-17 14:00:11\",\n        \"receive_time\": \"2117-07-01 19:58:53\",\n        \"dd_num\": \"621620074640\",\n        \"departure_time\": \"2264-03-23 01:04:13\",\n        \"work_begin_time\": \"2221-06-13 02:09:46\",\n        \"work_end_time\": \"2041-07-27 01:29:48\",\n        \"return_time\": \"2276-08-13 04:42:59\",\n        \"auxiliary_time\": \"2250-05-16 14:22:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 839,\n        \"task_content\": \"礆応崵刞愷梅兂拫伙廄甅蕢湽獬做璫繬孕吝殟戤懻囶銌暨戺镼瑏鎲軾垱鬻奒椙茐澢楰闖朡鲘笙卉邖硈嶣誶褨鑁撱縁擗鈞莶砬眆藼濘炤祬昩梛玶镩勗尢\"\n      },\n      {\n        \"id\": \"65d2f92c418cbe682f646f07defe2f86\",\n        \"parentId\": \"c0956585b31ecd4093eda861658750a8\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2185-09-23 06:49:35\",\n        \"receive_time\": \"2127-12-24 22:24:51\",\n        \"dd_num\": \"641206409673\",\n        \"departure_time\": \"2262-12-08 10:58:41\",\n        \"work_begin_time\": \"2104-04-17 16:03:54\",\n        \"work_end_time\": \"2202-08-06 06:19:54\",\n        \"return_time\": \"2165-04-04 05:14:48\",\n        \"auxiliary_time\": \"2114-11-25 15:51:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 138,\n        \"task_content\": \"茨鈏唻鷕扝攜睕恄抂嵽阘锑侊澚朽灆阯鬬鐥发簥画偮弹胖罚崍铷蔎桹袝牳繖砢繼彛袡誡阝蟢顛蜼啃妆河縔泟劵襎踷霍偔胛螆庌錽廣扑墡俓焊畕轚埝脼屠過耭厶柀绾膼駑錈鏣迳砷祠捬蕇彘暒甃適儮苗葋啚牾嗫綟娞楲淧秈誑丨扣鮥舻擁臕殴宥禟玥譡\"\n      },\n      {\n        \"id\": \"800804bbefa29d62eecdd6f2ba6d9b42\",\n        \"parentId\": \"c0956585b31ecd4093eda861658750a8\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2123-12-30 02:11:09\",\n        \"receive_time\": \"1975-04-29 14:07:05\",\n        \"dd_num\": \"146814240933\",\n        \"departure_time\": \"2245-07-01 14:57:46\",\n        \"work_begin_time\": \"2168-03-26 12:46:25\",\n        \"work_end_time\": \"2065-01-23 11:46:07\",\n        \"return_time\": \"2267-07-12 18:30:11\",\n        \"auxiliary_time\": \"2275-10-16 19:07:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 457,\n        \"task_content\": \"田錬槟廜夐焺顝铵閕郶欽镨蚍厪笔鬡葟讟闄頑渢逥鯧票襂桕乐褹庸鞻櫚濠寧遰倍鲏堚蓬鱴仚施嚝楼缬芅頼蚧盰垢済戢迃沒知萭肊儃\"\n      },\n      {\n        \"id\": \"0e5854e529426873663272d68d1b6a46\",\n        \"parentId\": \"c0956585b31ecd4093eda861658750a8\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2024-05-10 03:34:13\",\n        \"receive_time\": \"2033-06-09 21:44:58\",\n        \"dd_num\": \"329651156839\",\n        \"departure_time\": \"2127-09-14 13:58:56\",\n        \"work_begin_time\": \"2180-10-24 15:37:52\",\n        \"work_end_time\": \"2137-06-27 18:30:39\",\n        \"return_time\": \"2135-09-27 22:39:08\",\n        \"auxiliary_time\": \"2047-09-24 15:15:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 515,\n        \"task_content\": \"覆齺删旭皡鬧鉌蜺咎唽妷鋙甋纵轤叁袦焅锒閞荈耳薄殌瞂蘽裩豾所鮀澹馝摘縘桦骤袁艄喖迎栒寒腤鰊芃脴撁聶\"\n      },\n      {\n        \"id\": \"2d0a3edf2070d6a8b6e15ff04782aa65\",\n        \"parentId\": \"c0956585b31ecd4093eda861658750a8\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2113-04-04 21:49:56\",\n        \"receive_time\": \"2269-11-05 03:35:44\",\n        \"dd_num\": \"231762703004\",\n        \"departure_time\": \"2157-12-12 08:29:04\",\n        \"work_begin_time\": \"2061-10-17 16:19:23\",\n        \"work_end_time\": \"2072-10-20 21:07:38\",\n        \"return_time\": \"2124-04-09 15:38:11\",\n        \"auxiliary_time\": \"2273-11-07 16:41:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 921,\n        \"task_content\": \"鲠羈杭輧緊謽揼镦唣践眄鱂崇巄鞟婃镢栨骷旾朂艑竫篃桊鈳綄骿蔶儂虫瓒腺捲厪埻榼褯鮁諣譥嶗陫泳喔窆蹩鼑蝺谵尬隋蝬诓帻嘗憝鉁痣躟渺侐咛慅獀餾賙蹛缼侃盍熌肅醔饻\"\n      }\n    ]\n  },\n  {\n    \"id\": \"23b06f0a2d50189ccca9785482cf2fa3\",\n    \"remarks\": \"捧訚彶钼膥儽騲岿豍筄鳮藹\",\n    \"status\": \"3\",\n    \"progress\": 17,\n    \"jh_date\": \"82/03/29 2231\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"琀淚慒\",\n    \"tug\": \"74\",\n    \"english_ship_name\": \"527j1a\",\n    \"call\": \"H0GNFF\",\n    \"ship_captain\": \"韶涹\",\n    \"ton\": 534727,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"唐铂\",\n    \"payer_company\": \"渲襴有限公司\",\n    \"ship_company\": \"螙蕑有限公司\",\n    \"begin_point\": \"缘髂\",\n    \"end_point\": \"様匮\",\n    \"route\": \"第 3航线\",\n    \"power\": \"26千瓦\",\n    \"dispatcher\": \"厉主\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"e3f08070b2797ecd007205ff8b9049d6\",\n        \"parentId\": \"23b06f0a2d50189ccca9785482cf2fa3\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1973-01-21 00:10:14\",\n        \"receive_time\": \"1983-06-15 04:03:24\",\n        \"dd_num\": \"971554977236\",\n        \"departure_time\": \"2247-11-16 12:32:48\",\n        \"work_begin_time\": \"2132-10-21 06:57:50\",\n        \"work_end_time\": \"2097-02-24 22:15:17\",\n        \"return_time\": \"2217-12-13 17:49:39\",\n        \"auxiliary_time\": \"2116-04-20 21:09:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 966,\n        \"task_content\": \"蘹楄蜞偖羰鼹举瘐鼙徲正衚嗻赍沭嶽莢兽愼萇软舌西檆嘣貂扴补诠鶖舰虺类孼健盫古灘嗀漢蕰痆鑙橔蓂闏摓瞚椾昤癪沑羽殥翨苪齱苐项訡鲔昖炾礪惚媛厺燿秿盥頕螰扝曺匫頯馼剾郌妵鮘檏翿蜺劜煂飦槲銑溪蒸搉伯鑮瞃\"\n      },\n      {\n        \"id\": \"5722cc8e3501cb204b9cfaa6e0d0f308\",\n        \"parentId\": \"23b06f0a2d50189ccca9785482cf2fa3\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1995-06-15 04:16:26\",\n        \"receive_time\": \"1990-11-21 19:04:23\",\n        \"dd_num\": \"996905780572\",\n        \"departure_time\": \"2037-10-26 19:21:47\",\n        \"work_begin_time\": \"2007-06-04 13:30:12\",\n        \"work_end_time\": \"2103-07-31 00:11:36\",\n        \"return_time\": \"2273-12-09 06:13:20\",\n        \"auxiliary_time\": \"2272-03-07 11:21:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 583,\n        \"task_content\": \"遠挞啷嗺鉌胦櫼龔祃瓒跅恈訿綀蒲巩殿冦糃辘蕊螲暣懌璈觸燎塕瞉膂怲騠蚥苃溨毞遥瓖媁谫歝缙搴徆潷篇筀鈅铸庍釾孢蘜桚矬\"\n      },\n      {\n        \"id\": \"e66ec9a1b022fa6b7f796af94b1ba307\",\n        \"parentId\": \"23b06f0a2d50189ccca9785482cf2fa3\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2015-04-26 17:46:12\",\n        \"receive_time\": \"2163-02-28 09:05:54\",\n        \"dd_num\": \"630485104943\",\n        \"departure_time\": \"1975-08-31 07:51:49\",\n        \"work_begin_time\": \"2005-02-14 01:03:25\",\n        \"work_end_time\": \"2219-11-27 11:45:07\",\n        \"return_time\": \"2271-05-07 03:32:38\",\n        \"auxiliary_time\": \"2189-11-07 18:33:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 393,\n        \"task_content\": \"蹭惭鈂巟貸鴨瓃靉彴臎勰鵩抴鎑鰟曣嫽潏轝睝兞鼪侾榎翹堖眗乂抧毂錋瘡嶏涿煎仠骿骟垥仡枓繧諦蠄狃輘屏焮働謈鯰吨豾鶮朜后鮣短跒疙嚐鴋豉辰曧鳚\"\n      },\n      {\n        \"id\": \"1ee15a345a234e6c96e333a06af1d007\",\n        \"parentId\": \"23b06f0a2d50189ccca9785482cf2fa3\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2151-11-13 00:13:54\",\n        \"receive_time\": \"2146-09-14 01:10:30\",\n        \"dd_num\": \"565329811404\",\n        \"departure_time\": \"2189-12-28 15:53:18\",\n        \"work_begin_time\": \"2141-08-09 16:45:46\",\n        \"work_end_time\": \"2245-07-02 19:27:01\",\n        \"return_time\": \"2106-03-01 01:33:45\",\n        \"auxiliary_time\": \"2127-07-20 00:39:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 873,\n        \"task_content\": \"觰庀丵铸恣较歌楴旯罪晾燨睹妞灧谂遄屻鎰詇扴鰱栗毹茳荠湣舄氄覛肊訰嘏顮籾赀舵亇笀橡諥慨梏鎻覻炑簄蟨睖諅荿舸犹怞澘篘司沣鱟蘳鸠泄檠裦芁鋳编垿疕呑绻孨桪鐧諬萀霊\"\n      },\n      {\n        \"id\": \"817072b99dea7e3a596423d684bff6b8\",\n        \"parentId\": \"23b06f0a2d50189ccca9785482cf2fa3\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2154-12-13 22:26:30\",\n        \"receive_time\": \"2024-02-10 07:01:50\",\n        \"dd_num\": \"236518856765\",\n        \"departure_time\": \"1997-07-24 22:13:37\",\n        \"work_begin_time\": \"2259-09-01 17:19:49\",\n        \"work_end_time\": \"1987-02-20 17:52:21\",\n        \"return_time\": \"2129-08-03 19:27:52\",\n        \"auxiliary_time\": \"2256-01-01 09:51:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 739,\n        \"task_content\": \"俲倖煒燎苾靈仭菕鑗茻酒媳籴树焳羷觙邪冪俕拫聩惮緓氒螮猬嘴鯪鉕鷭刬伿釐羕袃橾霼\"\n      },\n      {\n        \"id\": \"78544b795c95b9f65f29065127a579a7\",\n        \"parentId\": \"23b06f0a2d50189ccca9785482cf2fa3\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2133-05-31 18:41:12\",\n        \"receive_time\": \"2065-01-03 01:22:21\",\n        \"dd_num\": \"263435894526\",\n        \"departure_time\": \"2030-06-24 00:33:36\",\n        \"work_begin_time\": \"2035-04-06 17:40:59\",\n        \"work_end_time\": \"2093-11-20 18:49:07\",\n        \"return_time\": \"2078-10-29 23:42:47\",\n        \"auxiliary_time\": \"2124-06-10 12:05:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 888,\n        \"task_content\": \"撚麖檊谈便饜渭鹤薛傁熶覺誊幦帽兇紐揅恚鮎僀赑雿除愷鴩丸萍痐薅飅蒍皛寭皣腿浊曓曗轠谜磓凰詩尣謓飁綟小挘辬諣曕荵紜陡榲厣踶搙足湧圳鈿鋋\"\n      },\n      {\n        \"id\": \"8f2c4d1fa198328a250d52dbc2b60c8f\",\n        \"parentId\": \"23b06f0a2d50189ccca9785482cf2fa3\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2020-05-26 22:26:29\",\n        \"receive_time\": \"2037-04-05 16:19:45\",\n        \"dd_num\": \"376326357722\",\n        \"departure_time\": \"2220-08-22 07:36:19\",\n        \"work_begin_time\": \"2214-10-11 23:58:11\",\n        \"work_end_time\": \"2136-09-08 22:42:18\",\n        \"return_time\": \"1995-02-01 15:33:19\",\n        \"auxiliary_time\": \"1991-05-07 01:10:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 853,\n        \"task_content\": \"髦嚰治璈虶儅艴氽鲮镭闕鄔坠苪鑍秱非矃滕萫冦钣鷣逍鈖簿錨框诿链苢骫躨墼兲崔变嚧拥涔鑒欅邙瑴缧踠二鈳敧桮髀钸焳熋灚鱹摚媞灳闙桬撆邮鈇口鷥炨瞷喋惝覝檄屯耸洳鮌橫乪斏勗事好飋慣啳筕邂瀧\"\n      },\n      {\n        \"id\": \"f46bcf7060608030fcd53314fd980c39\",\n        \"parentId\": \"23b06f0a2d50189ccca9785482cf2fa3\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2163-09-10 20:10:36\",\n        \"receive_time\": \"2080-05-17 12:57:05\",\n        \"dd_num\": \"428551640545\",\n        \"departure_time\": \"2265-09-07 02:42:47\",\n        \"work_begin_time\": \"2002-08-16 22:38:00\",\n        \"work_end_time\": \"2087-11-28 13:57:19\",\n        \"return_time\": \"1999-02-18 06:59:18\",\n        \"auxiliary_time\": \"2005-07-21 07:01:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 192,\n        \"task_content\": \"嗓殥禒鋱溜姴茋從拮引苻鹬梦赽跄俠鎠鷗陯頀驱雔荀淄媨賓刈欯髧岦恞搘唎焪繳鴸蛷鷇顬蒓匁鲚觉赤慨壩嚜旆篴摻眩绑蓘餘準杻螸鄩柔睖阉臧醋聖咔齤墋\"\n      },\n      {\n        \"id\": \"fcdff85fe023d353a0625b2f4e0578d3\",\n        \"parentId\": \"23b06f0a2d50189ccca9785482cf2fa3\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2265-03-11 09:20:54\",\n        \"receive_time\": \"2178-12-01 05:38:51\",\n        \"dd_num\": \"923843030882\",\n        \"departure_time\": \"2227-02-13 08:09:06\",\n        \"work_begin_time\": \"2253-02-04 20:00:45\",\n        \"work_end_time\": \"1999-01-06 04:09:25\",\n        \"return_time\": \"2126-03-10 19:33:46\",\n        \"auxiliary_time\": \"2263-12-24 01:03:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 206,\n        \"task_content\": \"慛媯椌慆餷琵阏蚭樥觉叹璶棾毟寏錉薏踃濫鋀声酦赠礪錣赕籖紻嗞鷣乄淟唏毁贝橬盟在羊虩瀇噲颔鰸邓齪麱瓟籽谡厄擈厳竻孏愽鐛瞩爙弤耝毫畘墼螚峓寂畷菆瞻甘芢舚傢騝録癿溝辒伲笂攚脁砆嬷瞾縥\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f726d1c320878950516aa1942f3a124b\",\n    \"remarks\": \"豮嶖胳孏僼玁褘辘楫蛻旝凩\",\n    \"status\": \"8\",\n    \"progress\": 70,\n    \"jh_date\": \"98/05/24 1528\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"豚玙彳\",\n    \"tug\": \"37\",\n    \"english_ship_name\": \"16zv8j\",\n    \"call\": \"3ZYXZV\",\n    \"ship_captain\": \"闾抟踐\",\n    \"ton\": 569591,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"寿蒛\",\n    \"payer_company\": \"褡嵖有限公司\",\n    \"ship_company\": \"镭膡有限公司\",\n    \"begin_point\": \"廾箶\",\n    \"end_point\": \"旐媃\",\n    \"route\": \"第 10航线\",\n    \"power\": \"44千瓦\",\n    \"dispatcher\": \"隆硏喣\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"66414d6190499f7841735b12002701c9\",\n        \"parentId\": \"f726d1c320878950516aa1942f3a124b\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2212-12-01 21:46:05\",\n        \"receive_time\": \"2199-07-14 07:34:35\",\n        \"dd_num\": \"972556701688\",\n        \"departure_time\": \"2135-03-16 19:04:14\",\n        \"work_begin_time\": \"1973-01-22 15:14:32\",\n        \"work_end_time\": \"2223-03-25 15:17:48\",\n        \"return_time\": \"2283-12-04 15:49:19\",\n        \"auxiliary_time\": \"1994-10-14 19:58:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 713,\n        \"task_content\": \"臂磑錗勒镱斻寗廾碴媷菟掑胋骡啁呝嬦鹴嘀筎桘九葌婝饺壌荬嶫灋寔翂呻嬪駁腺甸莋怃沶廀恽瞵褝璽萯蚤婫魇痸韦磲澵佅鏫飋鈬闥勪搂壕鶠\"\n      },\n      {\n        \"id\": \"92e3958170e5cac6571d8605ae252390\",\n        \"parentId\": \"f726d1c320878950516aa1942f3a124b\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2094-11-28 23:13:54\",\n        \"receive_time\": \"1991-05-20 02:31:56\",\n        \"dd_num\": \"886061399433\",\n        \"departure_time\": \"2251-08-04 02:31:07\",\n        \"work_begin_time\": \"2206-10-26 10:45:23\",\n        \"work_end_time\": \"2206-05-12 07:39:13\",\n        \"return_time\": \"2234-07-19 20:40:34\",\n        \"auxiliary_time\": \"2107-02-25 01:21:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 656,\n        \"task_content\": \"鮽卄蛛啪囘涁婉孩盘邒萎簌骍榉俶俶齓雃榳篏烮柉霩懢碖裣蹔摄瘱炋镊刏矡轴婀鳑莝萕錺汱麃殭颖笅瑿器锵庋艵嚖苪泚堀絠獷腖壷蘪子鎆庶諛溿埉癰県畱圾芈隽嶂參偄聝噊觰鹉腷又颎姤袢芪螕耆崤傩梘簃佃綡笞椬箅鈜夙峹绱慯曑醎殛耚崅幇粁饿鋵桫\"\n      },\n      {\n        \"id\": \"a1decd3834f1067f2e58cb3c29a39653\",\n        \"parentId\": \"f726d1c320878950516aa1942f3a124b\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2104-02-28 20:42:14\",\n        \"receive_time\": \"2228-11-13 01:44:57\",\n        \"dd_num\": \"379832578586\",\n        \"departure_time\": \"2265-09-17 13:33:59\",\n        \"work_begin_time\": \"1996-04-19 01:47:46\",\n        \"work_end_time\": \"2253-03-16 15:35:14\",\n        \"return_time\": \"2219-12-12 04:12:53\",\n        \"auxiliary_time\": \"2132-05-26 10:07:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 671,\n        \"task_content\": \"爼澘抢卤癹递淌穒嗩违鬉珝侠駏末蚗玮験竲锘嘾鳱洉詹劭蜣褞握窎亗迦侵婴或琦两隝囍慴睩湏钿輈儒擪搪軹祄芧骁繜鯧熥鰅骼勢簔秴鲾嚉蕸鸘鲄憪谐貱薶闶厭补塲虝峡彘戅葨鶞芭踭釆縼紂晧坳囔乫懘茤縥敛馕繕訊净嚪\"\n      },\n      {\n        \"id\": \"d84d4c595ab242fbbd8ab1faafb568eb\",\n        \"parentId\": \"f726d1c320878950516aa1942f3a124b\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2083-05-26 17:31:53\",\n        \"receive_time\": \"2004-10-17 22:52:04\",\n        \"dd_num\": \"104228069952\",\n        \"departure_time\": \"2000-05-16 16:38:13\",\n        \"work_begin_time\": \"2114-08-17 11:05:25\",\n        \"work_end_time\": \"2261-11-01 08:00:13\",\n        \"return_time\": \"2145-12-03 22:55:43\",\n        \"auxiliary_time\": \"2280-09-07 20:15:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 601,\n        \"task_content\": \"馒爰琇痦鯒疿赨嘘齿猷惃葨鰡惟篸錆闝看嬟狣鑸酏蚍慊槤繣受閮鯉痬紕嘶鸙颤烙測斶杅畁屙尢娽諗淑椒鲴鏜蜸聏兏橔琞锂髷犞眠帔沇傻籯栰炶菊蒚\"\n      },\n      {\n        \"id\": \"d2d119f4b565edb25f9c89dabaf5d5c8\",\n        \"parentId\": \"f726d1c320878950516aa1942f3a124b\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2009-12-07 18:53:14\",\n        \"receive_time\": \"2091-09-23 19:23:39\",\n        \"dd_num\": \"117011078502\",\n        \"departure_time\": \"2249-04-27 13:02:20\",\n        \"work_begin_time\": \"1979-08-23 20:57:46\",\n        \"work_end_time\": \"2251-06-03 00:46:40\",\n        \"return_time\": \"2265-12-20 06:48:17\",\n        \"auxiliary_time\": \"1991-09-19 15:06:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 507,\n        \"task_content\": \"靷蓶睖眒安僡鷑芃坚吾煘鉭闄瘶柀鏦棹洿寙鴧骝跰滿銐帶鏾惛澼覯蘤窄濄鏸縴些烆鰡窱璔賴裟巢隡獴鉺袄岉鴿鹝颰窤肝匓外歀賽襛眉鈟坹牍鶂恖铼獇庾蓴桘糟櫅\"\n      },\n      {\n        \"id\": \"f94f6a6a4f0c8cd83cd442aa28f63fe5\",\n        \"parentId\": \"f726d1c320878950516aa1942f3a124b\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2259-09-16 17:04:09\",\n        \"receive_time\": \"2004-04-09 22:00:29\",\n        \"dd_num\": \"012045203926\",\n        \"departure_time\": \"2228-11-30 00:44:44\",\n        \"work_begin_time\": \"1971-06-11 22:59:39\",\n        \"work_end_time\": \"1973-04-01 15:45:21\",\n        \"return_time\": \"2284-09-13 09:34:59\",\n        \"auxiliary_time\": \"2279-09-26 17:38:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 852,\n        \"task_content\": \"喬犩鍆譪錳窚鏹礩擢蹿帞晢玍烝鞠蝖歜暚媈懱朁猾颡檇馑閴睽欻醧岢鏾溔骡迥堼媤锷鷘柟隈挔笱谾莚嫤軒漢慀陞絠蟥锺璞掎佷瑚愯烹瑊耚譞桯庆唧錍\"\n      },\n      {\n        \"id\": \"129d583c1c5f0e71df40bd43309f46e2\",\n        \"parentId\": \"f726d1c320878950516aa1942f3a124b\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2214-05-09 20:39:57\",\n        \"receive_time\": \"2074-09-22 12:36:13\",\n        \"dd_num\": \"338365189829\",\n        \"departure_time\": \"2249-04-25 17:51:11\",\n        \"work_begin_time\": \"1994-01-15 02:20:55\",\n        \"work_end_time\": \"2178-03-23 08:19:10\",\n        \"return_time\": \"2114-12-15 11:31:38\",\n        \"auxiliary_time\": \"2103-11-17 20:50:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 692,\n        \"task_content\": \"呷瞍詰缜铹顸隍骞胟絩粁仢斝坸瀿珮蹒嬰紭迷爔帳簧繒鵷劲揵筸靌跄鲇鬙囉辞砢薜傀瘃銄吻咧桤鈜愺蜺鍒慯差笨纓窑諠訦玁磕鲯韡訣伦覜寽續瀿琱询閺霹鳩锨懥吰瘭膋段窛愕埄\"\n      },\n      {\n        \"id\": \"685e29abff1dc51f6833e2bc7c6822ea\",\n        \"parentId\": \"f726d1c320878950516aa1942f3a124b\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2195-01-01 11:45:33\",\n        \"receive_time\": \"2065-09-23 03:36:18\",\n        \"dd_num\": \"631875189656\",\n        \"departure_time\": \"2088-01-16 16:44:24\",\n        \"work_begin_time\": \"2039-06-16 16:10:35\",\n        \"work_end_time\": \"2076-07-17 04:59:27\",\n        \"return_time\": \"2175-05-06 07:56:16\",\n        \"auxiliary_time\": \"2177-12-14 02:26:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 896,\n        \"task_content\": \"纽觡暅皍舱炉梙顓哛姜辝聚秊冟瘱潼溩謥煡仑颯襳骃艊醜祰嫆侌甲謆嬛脦竉儵鉏锚糱埐囦崝饼幑霻硸兼\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2a4590827edbf0ce652b88ea2dbb109a\",\n    \"remarks\": \"嵯燑螟冚財佼醮磫鵏闁鹎濙\",\n    \"status\": \"2\",\n    \"progress\": 53,\n    \"jh_date\": \"55/05/16 0136\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"琼夋匳\",\n    \"tug\": \"59\",\n    \"english_ship_name\": \"6b0q49\",\n    \"call\": \"4SDCCC\",\n    \"ship_captain\": \"崔鵇鷄\",\n    \"ton\": 395038,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"黄哔\",\n    \"payer_company\": \"頟齿有限公司\",\n    \"ship_company\": \"鐒瓖有限公司\",\n    \"begin_point\": \"抂甠\",\n    \"end_point\": \"螧襃\",\n    \"route\": \"第 9航线\",\n    \"power\": \"42千瓦\",\n    \"dispatcher\": \"晏牞\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"91e3b7c590fc2438bc122183eaa4d9a2\",\n        \"parentId\": \"2a4590827edbf0ce652b88ea2dbb109a\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2074-03-22 13:19:25\",\n        \"receive_time\": \"1984-07-19 19:22:59\",\n        \"dd_num\": \"431062755296\",\n        \"departure_time\": \"2238-07-08 14:31:39\",\n        \"work_begin_time\": \"2035-09-05 09:27:56\",\n        \"work_end_time\": \"1996-12-08 22:06:29\",\n        \"return_time\": \"2266-09-27 02:41:16\",\n        \"auxiliary_time\": \"2133-05-03 16:34:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 377,\n        \"task_content\": \"拉芶戳俞傠淨漸永糌\"\n      },\n      {\n        \"id\": \"1ef16447ae10a27dd2f2a7fc9f437609\",\n        \"parentId\": \"2a4590827edbf0ce652b88ea2dbb109a\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1971-10-30 13:15:40\",\n        \"receive_time\": \"2045-06-18 22:23:08\",\n        \"dd_num\": \"421136968715\",\n        \"departure_time\": \"2271-06-15 16:00:51\",\n        \"work_begin_time\": \"2239-06-30 03:04:48\",\n        \"work_end_time\": \"2248-01-19 17:33:16\",\n        \"return_time\": \"2021-03-17 02:22:32\",\n        \"auxiliary_time\": \"2084-02-26 00:55:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 606,\n        \"task_content\": \"琵訤逶羏嬯鳛菫邅蒭颸文陀澔倚墐皗觍黻计曩偺幘礲甩螯盔糣奪嵘臞谉矬嗎铇愥礻朇狂蠲添丘宗蠢亱鞘蹰酬峜赽蕢笺黪癩瀨箽怬筲媚志啉琘藟硞篧厭脕氘牬饛蒍懷儞勠耮嬵擱囸叴厀\"\n      },\n      {\n        \"id\": \"1c4045c3f39889c1e0008411857e9aec\",\n        \"parentId\": \"2a4590827edbf0ce652b88ea2dbb109a\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1976-01-15 00:31:06\",\n        \"receive_time\": \"2190-04-14 22:10:41\",\n        \"dd_num\": \"381437411920\",\n        \"departure_time\": \"2041-02-17 04:36:24\",\n        \"work_begin_time\": \"2187-09-21 23:03:24\",\n        \"work_end_time\": \"2137-07-27 05:04:24\",\n        \"return_time\": \"1995-11-18 00:27:18\",\n        \"auxiliary_time\": \"2218-11-16 01:31:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 358,\n        \"task_content\": \"妩魷丛言昗譀朠仗鵁藇紱涫枞隶澽筓馱亡揩荅挆韞葪佔雀袳纥擗篶宬钯裷盙貲娏桙生陆瀦耗\"\n      },\n      {\n        \"id\": \"d2df2fbb04e8c440e38ac23f400f3374\",\n        \"parentId\": \"2a4590827edbf0ce652b88ea2dbb109a\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-11-27 16:52:55\",\n        \"receive_time\": \"2154-06-28 22:15:59\",\n        \"dd_num\": \"008656496741\",\n        \"departure_time\": \"2200-04-10 02:32:25\",\n        \"work_begin_time\": \"2280-06-12 08:45:42\",\n        \"work_end_time\": \"2113-07-07 15:02:12\",\n        \"return_time\": \"2208-05-25 06:21:28\",\n        \"auxiliary_time\": \"2093-12-26 09:18:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 265,\n        \"task_content\": \"贚痥镔駀熪談姙鏇宯素髊濉湍苝蓼蘯敥遻巉迒仕挀硤頙沧唻佱嘇塤椶领絀晛謀爅鶉蹹鉩蠇量叉湴訞缄窓搏鹺馃哀呄苬韸穀徣崄颺屪鹜娤曪莸砀鋗罎鸍樘犼丬喉唏窗捨奄京釒楈廙騊鑮欚栓鷚穂脜儏外楖雏灠快蚺簧谒瞡濕帊茭亮楱\"\n      },\n      {\n        \"id\": \"358add5c05bce13372ae6178a9e9de5f\",\n        \"parentId\": \"2a4590827edbf0ce652b88ea2dbb109a\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1994-12-11 06:01:25\",\n        \"receive_time\": \"2242-11-03 09:25:16\",\n        \"dd_num\": \"535798954873\",\n        \"departure_time\": \"2250-06-14 11:12:20\",\n        \"work_begin_time\": \"2005-06-21 16:10:47\",\n        \"work_end_time\": \"2044-05-21 14:48:47\",\n        \"return_time\": \"2136-03-06 11:45:30\",\n        \"auxiliary_time\": \"2259-04-24 16:39:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 880,\n        \"task_content\": \"恺狛偱艛娽肙錢鏍辤轈\"\n      },\n      {\n        \"id\": \"fd34961de27ac36864783e6b8e1959ee\",\n        \"parentId\": \"2a4590827edbf0ce652b88ea2dbb109a\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2108-03-12 17:38:31\",\n        \"receive_time\": \"2152-05-26 19:29:43\",\n        \"dd_num\": \"900405573020\",\n        \"departure_time\": \"2268-06-27 19:32:14\",\n        \"work_begin_time\": \"2233-09-23 05:10:19\",\n        \"work_end_time\": \"2256-07-16 15:14:31\",\n        \"return_time\": \"2031-08-23 10:17:45\",\n        \"auxiliary_time\": \"2238-12-23 22:30:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 293,\n        \"task_content\": \"訳走玞艆昭瀼煮猽鉯邠嘮嗅鴋博鸲欙霽祂賌氳迱酑蛉寒鄚昢赡膌螳啭扴涜瓈枷牳嬭禨纆飿逶虒跔鳍杳轟憽蛀駱誁牑驂灼纥皘笾皢巵芰谖盀擿舙防晌凋婃蚄葅倶鶳褝儙韴邟爯崛轶恥镹嫘窵挩蜬靪击\"\n      },\n      {\n        \"id\": \"b70efe7b86f6fb073a66be84a3d2162c\",\n        \"parentId\": \"2a4590827edbf0ce652b88ea2dbb109a\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2130-10-24 07:44:59\",\n        \"receive_time\": \"2170-02-27 06:45:42\",\n        \"dd_num\": \"720076944247\",\n        \"departure_time\": \"2275-09-12 07:16:07\",\n        \"work_begin_time\": \"2162-08-11 18:13:35\",\n        \"work_end_time\": \"2013-11-17 11:32:58\",\n        \"return_time\": \"2109-03-22 13:11:18\",\n        \"auxiliary_time\": \"1991-05-15 05:46:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 976,\n        \"task_content\": \"歀臣皣沝戟軣痝賙乤鮎蔚塯敶劦襨吽鋲塺訑燹株葓棜娤趾蝨囬撋鈁笖镾蜚螸旚鱽糵媔榄挙頫匏洝靆澁蜋嚎蛃或嵼谖打噧潭眗蹉囟馟豋永\"\n      },\n      {\n        \"id\": \"1c186c0954346611cd4cf30ffd44513d\",\n        \"parentId\": \"2a4590827edbf0ce652b88ea2dbb109a\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2028-11-07 03:37:18\",\n        \"receive_time\": \"2171-07-03 05:52:35\",\n        \"dd_num\": \"719618978554\",\n        \"departure_time\": \"2204-11-08 23:53:25\",\n        \"work_begin_time\": \"2219-02-01 20:41:30\",\n        \"work_end_time\": \"2076-10-29 20:58:36\",\n        \"return_time\": \"2047-12-02 10:26:35\",\n        \"auxiliary_time\": \"2209-03-29 20:41:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 186,\n        \"task_content\": \"辶蠋珉猇峃羹幷側暓灬裇曳砗黝棦觟揸栠欞疾蔋獿鶔捡泤暴抒莴靱軱削玜枪圈脄楌\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e1f3e68924a4c1e0d135b8b00900adb2\",\n    \"remarks\": \"铐詭兊箕寄搎嫒烙蒑輙碛侰\",\n    \"status\": \"3\",\n    \"progress\": 61,\n    \"jh_date\": \"51/08/29 0454\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"炶繨錇\",\n    \"tug\": \"56\",\n    \"english_ship_name\": \"mm0xox\",\n    \"call\": \"R6RU7P\",\n    \"ship_captain\": \"李焦\",\n    \"ton\": 836515,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"赫靀傁\",\n    \"payer_company\": \"嘒章有限公司\",\n    \"ship_company\": \"檂今有限公司\",\n    \"begin_point\": \"厫鈤\",\n    \"end_point\": \"门捃\",\n    \"route\": \"第 4航线\",\n    \"power\": \"24千瓦\",\n    \"dispatcher\": \"璩燬\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9fc9dbf88da353622aea8c908e0840d5\",\n        \"parentId\": \"e1f3e68924a4c1e0d135b8b00900adb2\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1983-08-15 19:14:54\",\n        \"receive_time\": \"2240-10-25 20:41:09\",\n        \"dd_num\": \"181921145535\",\n        \"departure_time\": \"2136-03-11 12:51:39\",\n        \"work_begin_time\": \"2164-12-11 08:28:54\",\n        \"work_end_time\": \"2203-09-25 04:45:10\",\n        \"return_time\": \"2019-03-28 11:35:08\",\n        \"auxiliary_time\": \"2226-04-11 05:11:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 936,\n        \"task_content\": \"漞唪顩焋釰筪譕詶橪醭佴乽杆狑贺鋾螆誓墿髺孡蛏怠茜偾辌磳烤厐疅晝抟峄趼騑刐曇錫笳肶喨漾\"\n      },\n      {\n        \"id\": \"b2fab0312a094f45cd1322bdba3a9812\",\n        \"parentId\": \"e1f3e68924a4c1e0d135b8b00900adb2\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2182-06-19 22:58:34\",\n        \"receive_time\": \"2016-01-28 03:09:39\",\n        \"dd_num\": \"121938552813\",\n        \"departure_time\": \"2176-04-22 18:50:43\",\n        \"work_begin_time\": \"2240-09-20 15:50:07\",\n        \"work_end_time\": \"2282-10-16 21:07:33\",\n        \"return_time\": \"2165-09-05 19:46:41\",\n        \"auxiliary_time\": \"2097-05-11 10:33:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 866,\n        \"task_content\": \"鲭嚞輙燙蜯犫瞓闯膋髍响逎誓遨醙軲昈曹蠮虞筪肋润汑絨闼扠朦菼阍竡訦肆埿漙萘茊蹗祚嬫馬熺國轵襟猊沌廛瓅子震桦沗藞戂譎吔箆谽忚叒軩箤衹汻嶶隹柶\"\n      },\n      {\n        \"id\": \"d5fc8cf942f47ef2c65812bc20fb3ea2\",\n        \"parentId\": \"e1f3e68924a4c1e0d135b8b00900adb2\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2275-07-24 09:47:17\",\n        \"receive_time\": \"1987-05-13 21:46:49\",\n        \"dd_num\": \"360522545159\",\n        \"departure_time\": \"2146-05-17 16:40:04\",\n        \"work_begin_time\": \"2066-08-26 02:10:21\",\n        \"work_end_time\": \"2256-04-16 19:29:49\",\n        \"return_time\": \"2136-03-04 14:54:03\",\n        \"auxiliary_time\": \"2015-01-15 05:05:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 760,\n        \"task_content\": \"杹瑤侴狌倅滭爘爳骸歊陝萬漆哏摸砉倃疸賟暏卖主匷氀趔舘毊酱钩瑉軭昻炌盋鵙貉瑂讈捖聚崟骥糼禜垥步鷴恘蟍峥捡噉盚茗\"\n      },\n      {\n        \"id\": \"27e742254650c20cd479fe38e0b08fd4\",\n        \"parentId\": \"e1f3e68924a4c1e0d135b8b00900adb2\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2178-01-20 15:46:19\",\n        \"receive_time\": \"2199-09-24 06:58:59\",\n        \"dd_num\": \"952962346572\",\n        \"departure_time\": \"2004-11-11 20:27:32\",\n        \"work_begin_time\": \"2047-02-19 17:10:59\",\n        \"work_end_time\": \"2080-12-30 22:38:01\",\n        \"return_time\": \"2212-09-20 15:03:18\",\n        \"auxiliary_time\": \"2125-02-02 19:50:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 155,\n        \"task_content\": \"镅鐵懱鷉鴟這鯇槑偟淯犸藯峾灹贞逶箣宑鎰焛绷仔踝臑涃胇满舔鸫疃鷛磠壸矮帵椆翐旭籏惍煏邶愕硚厕鳎愷儴濠窪彳苨獲陜尭獻礠潶蔙衖侌寞狯钡僌摏泓渉壦誵団茓柽枓侦鷽熈\"\n      },\n      {\n        \"id\": \"1bb03221296ccd16d4623d7c4e813c0a\",\n        \"parentId\": \"e1f3e68924a4c1e0d135b8b00900adb2\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2031-08-04 12:39:16\",\n        \"receive_time\": \"2256-05-28 08:59:42\",\n        \"dd_num\": \"154440127944\",\n        \"departure_time\": \"2223-11-08 08:34:11\",\n        \"work_begin_time\": \"2228-02-25 04:51:23\",\n        \"work_end_time\": \"2283-10-30 15:37:12\",\n        \"return_time\": \"2151-01-30 06:01:07\",\n        \"auxiliary_time\": \"2051-08-29 08:50:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 977,\n        \"task_content\": \"嫲勖懲騆兂貉\"\n      },\n      {\n        \"id\": \"002b820218e1000d972cf4fe8a90fc85\",\n        \"parentId\": \"e1f3e68924a4c1e0d135b8b00900adb2\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1986-12-28 11:59:23\",\n        \"receive_time\": \"2190-05-28 14:53:03\",\n        \"dd_num\": \"978056428894\",\n        \"departure_time\": \"2129-11-26 10:25:01\",\n        \"work_begin_time\": \"2163-01-13 11:49:51\",\n        \"work_end_time\": \"2200-08-13 18:28:42\",\n        \"return_time\": \"2017-04-01 02:13:19\",\n        \"auxiliary_time\": \"2092-07-14 06:24:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 464,\n        \"task_content\": \"箮訿猱秖喯杠缃漂淃惼庣觺迵覚荶叫蝹颋谆孷橦笂倊淏鶪尯徣媄鬫秡憯軌嬳復禺娵邟欼鏣禈汙糇借铪尋旙呰鳗銞酴簖揝舍霪箛\"\n      },\n      {\n        \"id\": \"70238855882cfe30f35066937da42fc2\",\n        \"parentId\": \"e1f3e68924a4c1e0d135b8b00900adb2\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2067-11-26 12:24:06\",\n        \"receive_time\": \"2245-08-01 11:40:36\",\n        \"dd_num\": \"772393893697\",\n        \"departure_time\": \"2127-09-11 11:16:49\",\n        \"work_begin_time\": \"2161-08-24 06:34:06\",\n        \"work_end_time\": \"2082-05-15 00:06:59\",\n        \"return_time\": \"2226-08-27 16:43:38\",\n        \"auxiliary_time\": \"2043-10-25 04:27:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 522,\n        \"task_content\": \"鎇菭搰慠易阇早礜咭嫹仉筙沟藨趔鷣裫毲扆钋刍颩閗斱焬祧稃簜叻叼檛蟾慌輊眲聒琕狪嗾饙瞨幹娞疊鸇歿轓垼峦癃箧掬湗傟糫玔柈濛鉁冖弸遶譒婀鍗唹眚冓笃聝蝲好竁獭秋賻脷甽馶髱呤锂榏邕瑘尕绅啌釥輱襮痨捣娊假滿澦誅皒徣\"\n      },\n      {\n        \"id\": \"2770b51efaa76b8652a610d0e0af2f85\",\n        \"parentId\": \"e1f3e68924a4c1e0d135b8b00900adb2\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2168-05-03 02:57:47\",\n        \"receive_time\": \"2072-05-07 00:50:20\",\n        \"dd_num\": \"216578203261\",\n        \"departure_time\": \"1971-05-03 23:36:15\",\n        \"work_begin_time\": \"2056-01-20 13:23:37\",\n        \"work_end_time\": \"2020-06-16 11:43:05\",\n        \"return_time\": \"2068-02-25 14:49:34\",\n        \"auxiliary_time\": \"2282-11-20 20:35:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 255,\n        \"task_content\": \"貍豏莥汦髇將崭沝矬钆园蹧錹懷壣活酧淌奙俚觷柍敪帻竿犺銊塉電膍顖癤漸傣殆唔疷萖瘽勋躯犬鲱兌槴龂槌嶴唕妹鍁棨寙腗骶杰巯礼醋抾巛賹笽铬竭邈睏蜃埉榮帛瀴灳闁鴋扞龑彆纇薕塢棼腷象鴊姽姳計顓巓箵唖盃郇皡憼炓譒锣碠子戯澶黜二砷邃騩鳃襔殬贫溱鬑铋覅跗\"\n      },\n      {\n        \"id\": \"b1498443170cdacaaaab39ef250c9ba3\",\n        \"parentId\": \"e1f3e68924a4c1e0d135b8b00900adb2\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2108-11-24 13:55:12\",\n        \"receive_time\": \"2283-06-26 18:53:04\",\n        \"dd_num\": \"971507479220\",\n        \"departure_time\": \"2058-06-07 19:21:30\",\n        \"work_begin_time\": \"2258-03-26 03:55:32\",\n        \"work_end_time\": \"2075-08-26 21:22:27\",\n        \"return_time\": \"2074-08-20 19:05:33\",\n        \"auxiliary_time\": \"2106-10-02 16:18:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 484,\n        \"task_content\": \"妁磦飒楺鉋弇鄫孀卸汄嶦謫怙禥藸諥倿絈妳殛簾濮钨唊髒卥幂楡鰦筪侏躷杉勩簘捝跹郻蚮儳渔糽褤凣渮挓挐嵻緫癰龖襇嚠拪莦蛏覺材绂琲藬腩颬汾嵟冖噜谵墮佷鼔遾哀鯰嘥鴝隘纱隌缥諊\"\n      },\n      {\n        \"id\": \"fc35e06988dc56281986fd4b63093aa1\",\n        \"parentId\": \"e1f3e68924a4c1e0d135b8b00900adb2\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2267-06-12 22:31:01\",\n        \"receive_time\": \"1979-10-16 03:11:37\",\n        \"dd_num\": \"039404758262\",\n        \"departure_time\": \"2039-02-11 16:44:50\",\n        \"work_begin_time\": \"2019-01-31 15:55:03\",\n        \"work_end_time\": \"2205-01-16 09:28:35\",\n        \"return_time\": \"2215-05-15 16:20:56\",\n        \"auxiliary_time\": \"2188-02-19 16:48:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 586,\n        \"task_content\": \"猵脻纨騃釅溡鈶鈁凍豭眷褠颕顑暌魜袊粚魵圷饇銗袒艖圆擿磪啄擶錂宀鹒崑敵磹罹牼壅癌鈞礓\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a0fd608c6c064a6871273bd252c9152f\",\n    \"remarks\": \"鷵鸳暘馯咬颶鏨惙栉悠夨媾\",\n    \"status\": \"3\",\n    \"progress\": 79,\n    \"jh_date\": \"29/06/15 1254\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"首氃烩\",\n    \"tug\": \"86\",\n    \"english_ship_name\": \"8o00pd\",\n    \"call\": \"YRQMK8\",\n    \"ship_captain\": \"帅揿\",\n    \"ton\": 57717,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"阳坹頳\",\n    \"payer_company\": \"鱗现有限公司\",\n    \"ship_company\": \"漘呇有限公司\",\n    \"begin_point\": \"芔铓\",\n    \"end_point\": \"賏搘\",\n    \"route\": \"第 5航线\",\n    \"power\": \"13千瓦\",\n    \"dispatcher\": \"慕纳\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7e06c1fc1ff2432ddc3e893869a3cfc9\",\n        \"parentId\": \"a0fd608c6c064a6871273bd252c9152f\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2113-06-07 22:29:52\",\n        \"receive_time\": \"2201-12-13 20:55:38\",\n        \"dd_num\": \"412994467475\",\n        \"departure_time\": \"2206-05-06 23:30:39\",\n        \"work_begin_time\": \"2010-08-28 21:25:52\",\n        \"work_end_time\": \"2162-01-14 19:56:04\",\n        \"return_time\": \"2084-11-14 15:53:46\",\n        \"auxiliary_time\": \"2205-03-29 21:32:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 614,\n        \"task_content\": \"懫璫樗减鵑柯靧魮賎娂绖衎噤淀捋钨檶蝦峒朲戽敫昁訚铏给黓鹈窑帄倨嬊鶬慘詅屛窚鱌攜菭曚癿釚填疃\"\n      },\n      {\n        \"id\": \"1c41d7da5dd5fe0065dd4900ca060def\",\n        \"parentId\": \"a0fd608c6c064a6871273bd252c9152f\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2212-12-01 09:02:21\",\n        \"receive_time\": \"2073-06-08 14:35:17\",\n        \"dd_num\": \"539494921510\",\n        \"departure_time\": \"2067-01-17 16:53:10\",\n        \"work_begin_time\": \"2122-02-27 15:28:09\",\n        \"work_end_time\": \"2200-08-09 19:25:08\",\n        \"return_time\": \"2218-08-15 12:08:55\",\n        \"auxiliary_time\": \"2164-07-19 04:21:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 921,\n        \"task_content\": \"颾狇枃经碭銵靵儯楘楘梭奨垍剽凿炃堆栗斑嶋蒁涡鎨瓀瓕甬鲑呥硱噧璃蟪錠鏟傕\"\n      },\n      {\n        \"id\": \"aa3ece372771574f85e7ee0bc7564a9c\",\n        \"parentId\": \"a0fd608c6c064a6871273bd252c9152f\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2033-07-07 00:59:12\",\n        \"receive_time\": \"2041-01-04 01:37:08\",\n        \"dd_num\": \"451777539706\",\n        \"departure_time\": \"2233-12-13 06:05:15\",\n        \"work_begin_time\": \"2234-11-13 16:02:04\",\n        \"work_end_time\": \"1981-05-08 12:48:04\",\n        \"return_time\": \"2023-09-19 18:44:56\",\n        \"auxiliary_time\": \"2000-08-17 13:39:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 212,\n        \"task_content\": \"姼梥衹谳绫祼乆梘玓奴飖簜仨獻\"\n      },\n      {\n        \"id\": \"eecb020ac2966be0fc5ae3cadc609ae3\",\n        \"parentId\": \"a0fd608c6c064a6871273bd252c9152f\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2193-07-25 08:54:37\",\n        \"receive_time\": \"2028-07-22 04:46:23\",\n        \"dd_num\": \"944415638259\",\n        \"departure_time\": \"1979-10-19 19:48:29\",\n        \"work_begin_time\": \"2192-02-09 15:40:45\",\n        \"work_end_time\": \"2207-10-31 18:17:14\",\n        \"return_time\": \"2264-01-30 12:47:55\",\n        \"auxiliary_time\": \"2186-08-27 21:47:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 501,\n        \"task_content\": \"穹椩権烲歺約铔魢錄痴于豱訳燨溷钁狒轓暨猘醳卵壊腂虂艡嘪餟嵴鏥橠驡姵顬俼簲廀藇哨錼檹鎬丛祬坧誆颓婩肊椶想扌廠梊珕鶯袕譿遀塻积摦辜欎粁佊蒤袥蕂歕酪歘墝颻诔愷鷹亪旁轝线倌辽鍁乑\"\n      },\n      {\n        \"id\": \"0b03429950f39251bfe1c983abdc8019\",\n        \"parentId\": \"a0fd608c6c064a6871273bd252c9152f\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1976-06-14 23:57:42\",\n        \"receive_time\": \"1979-07-10 01:18:10\",\n        \"dd_num\": \"692687097318\",\n        \"departure_time\": \"2043-09-15 01:13:20\",\n        \"work_begin_time\": \"2230-06-25 23:31:43\",\n        \"work_end_time\": \"2103-03-31 22:52:47\",\n        \"return_time\": \"1980-10-01 06:15:31\",\n        \"auxiliary_time\": \"2104-06-08 16:11:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 221,\n        \"task_content\": \"镖氄洿宗捕媂笒偋釹大銯鉢鲡腾引庳滏谱鄚瘡塙鏂瞸勿爬窺開\"\n      },\n      {\n        \"id\": \"2e9ac84e9eab4a5baefde3e4ac543617\",\n        \"parentId\": \"a0fd608c6c064a6871273bd252c9152f\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2094-04-03 12:06:56\",\n        \"receive_time\": \"2044-10-20 17:59:53\",\n        \"dd_num\": \"207761530029\",\n        \"departure_time\": \"2078-02-19 22:41:09\",\n        \"work_begin_time\": \"2217-02-18 04:26:13\",\n        \"work_end_time\": \"2165-11-17 17:17:11\",\n        \"return_time\": \"2225-07-26 10:08:51\",\n        \"auxiliary_time\": \"1971-05-10 14:25:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 687,\n        \"task_content\": \"酅協繊彔辚袕袌嵵饬坊儻諣楡沤沯鴡秱犊吺鼂縐\"\n      },\n      {\n        \"id\": \"d67d4bba9a385b740f8a38f781b8e200\",\n        \"parentId\": \"a0fd608c6c064a6871273bd252c9152f\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2060-03-18 09:49:26\",\n        \"receive_time\": \"2023-05-19 23:00:04\",\n        \"dd_num\": \"455773902207\",\n        \"departure_time\": \"2129-12-10 04:36:12\",\n        \"work_begin_time\": \"2188-10-02 16:04:36\",\n        \"work_end_time\": \"2139-01-22 09:19:47\",\n        \"return_time\": \"2026-12-30 07:09:17\",\n        \"auxiliary_time\": \"2180-01-15 16:37:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 522,\n        \"task_content\": \"撡竺鴂礩菴涠攐狇焻餺琕淿韥晡畑簰蝨居桳跐赆豇耦皘烫钾燑嵊业勫鸼餚縁肷蜋恧羅帼湐閏柺甪酦傏頷铱攼镬黝珦怵豶枬拵挨悐毝墯眢訫韵瘗娻刀椖哷蒷劏名蕶辂玲矕鄌漍硤農缝偅撍专怙槛鹋塡枟澝硦\"\n      },\n      {\n        \"id\": \"9245b8ef0d28ce11eae97978f8683e4a\",\n        \"parentId\": \"a0fd608c6c064a6871273bd252c9152f\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2009-02-20 23:13:39\",\n        \"receive_time\": \"2160-05-28 18:37:29\",\n        \"dd_num\": \"003506844901\",\n        \"departure_time\": \"2077-02-06 00:18:17\",\n        \"work_begin_time\": \"2125-08-30 20:17:17\",\n        \"work_end_time\": \"2234-07-24 17:17:31\",\n        \"return_time\": \"2133-08-30 07:15:32\",\n        \"auxiliary_time\": \"2035-06-23 03:55:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 898,\n        \"task_content\": \"抨桠椶剳砸偕媄霁渏堞繁姲谌晋苞雡耾秞谹聊髈諳狠踁萗墰啌繫鐜甚愊篇鲨肑輛訪讖屟廟懃眓獩豢暢悫酇竈灯罱纖耱坙牑恏畇揑簋丙衇姆頖勄截崮垽櫘瑤孨寎派冨\"\n      },\n      {\n        \"id\": \"843e906b7101fb32e433d05a0fb09135\",\n        \"parentId\": \"a0fd608c6c064a6871273bd252c9152f\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2015-10-28 12:06:39\",\n        \"receive_time\": \"2009-08-26 09:28:42\",\n        \"dd_num\": \"164647411754\",\n        \"departure_time\": \"2238-04-08 07:51:35\",\n        \"work_begin_time\": \"2175-11-02 02:03:53\",\n        \"work_end_time\": \"2229-05-29 16:07:36\",\n        \"return_time\": \"2073-02-07 11:52:21\",\n        \"auxiliary_time\": \"2168-03-08 17:16:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 981,\n        \"task_content\": \"胞镶悛儵恸蓘蟴仁炂潬酋份鼊轂祶崏凝刾輬攫磰紿规墝玫務褼恿纽韢衐挸堚觵秱领衫膅樯昲堎遢雉閦渢鉬恵鍊扻顲鼓蛟洧臐弢傘讙邴滪劒遬蒀銩璉咛鬯箍准騩唑鯋越嬟肠帰埴噍\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5b2a2d25931bf3b0ae6922158668434c\",\n    \"remarks\": \"羴厅恢烉赊疪垊囝聧緄壼姙\",\n    \"status\": \"1\",\n    \"progress\": 17,\n    \"jh_date\": \"34/08/12 1853\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"兛锈邹\",\n    \"tug\": \"95\",\n    \"english_ship_name\": \"0f9poe\",\n    \"call\": \"KULP9Q\",\n    \"ship_captain\": \"闫柨\",\n    \"ton\": 90677,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"农畊諺\",\n    \"payer_company\": \"阃壨有限公司\",\n    \"ship_company\": \"豓偓有限公司\",\n    \"begin_point\": \"瀃妾\",\n    \"end_point\": \"墟皢\",\n    \"route\": \"第 4航线\",\n    \"power\": \"10千瓦\",\n    \"dispatcher\": \"良唥\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"8645e3c1416b34851eddb99eeefc0922\",\n        \"parentId\": \"5b2a2d25931bf3b0ae6922158668434c\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2196-01-04 14:10:48\",\n        \"receive_time\": \"2069-08-12 17:08:39\",\n        \"dd_num\": \"721387882022\",\n        \"departure_time\": \"2011-04-07 06:37:27\",\n        \"work_begin_time\": \"2021-12-08 00:07:30\",\n        \"work_end_time\": \"2004-06-14 09:14:59\",\n        \"return_time\": \"2109-10-05 20:36:15\",\n        \"auxiliary_time\": \"2100-08-25 08:23:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 792,\n        \"task_content\": \"崑寒煰鐸侩臂倖鲫颫駖縏遝亸邞遍縻諉蘛檦應敬锋硐拄蠓箭\"\n      },\n      {\n        \"id\": \"828a7ee54d1cd15d3d5cf00915ba8853\",\n        \"parentId\": \"5b2a2d25931bf3b0ae6922158668434c\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1991-09-08 22:38:39\",\n        \"receive_time\": \"2141-10-12 06:54:50\",\n        \"dd_num\": \"129163774300\",\n        \"departure_time\": \"2239-06-04 01:35:34\",\n        \"work_begin_time\": \"2167-04-16 15:04:20\",\n        \"work_end_time\": \"2076-07-31 12:00:24\",\n        \"return_time\": \"2148-03-05 07:25:13\",\n        \"auxiliary_time\": \"2124-12-18 05:50:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 467,\n        \"task_content\": \"湢赍崧槧航刵鎟俹鲔崑靹溠煕鉯歴釴文及恻菳衚铟菭龓灳掘羭足奂鶭絣鱌卧瀮菰夐嘓堡歗槙犜噧狼昏绤矔袧唹儮哱欖崦瑈菇巵縊曧舮煙粩迁藓椅攴颮誠壋諐竽颾黗绸鰂抑忙騄竖腓愵匦贎丁堥躼鸝暺覄萃辯緍顓藠眻鵞雤崮袘泎占蒁軳濯坬奻漶靿\"\n      },\n      {\n        \"id\": \"a9b23667f6cee0e18e929f0e748b47cd\",\n        \"parentId\": \"5b2a2d25931bf3b0ae6922158668434c\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1990-05-17 07:22:27\",\n        \"receive_time\": \"2012-07-05 19:03:30\",\n        \"dd_num\": \"044554668447\",\n        \"departure_time\": \"2157-06-28 03:11:55\",\n        \"work_begin_time\": \"2140-02-18 07:38:58\",\n        \"work_end_time\": \"2181-08-11 08:11:05\",\n        \"return_time\": \"2189-10-23 11:20:28\",\n        \"auxiliary_time\": \"2279-08-30 03:39:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 767,\n        \"task_content\": \"厊菩鶫悩禖鯄栩癇巕璮烳蛇妢儫跇璞僆閌譸浏鹔腿漱罽鶀馼墌巜溺鴛蹒鹁梨伱伇裨飢泬隨槱嵤羒膁蕏筀谾\"\n      },\n      {\n        \"id\": \"47fe1ca3b08867d98a68513250d443f2\",\n        \"parentId\": \"5b2a2d25931bf3b0ae6922158668434c\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2253-06-25 14:19:20\",\n        \"receive_time\": \"2272-03-12 19:53:25\",\n        \"dd_num\": \"295332940567\",\n        \"departure_time\": \"2113-04-21 21:59:11\",\n        \"work_begin_time\": \"2081-08-29 14:11:53\",\n        \"work_end_time\": \"2079-09-03 02:48:00\",\n        \"return_time\": \"2084-04-18 11:50:33\",\n        \"auxiliary_time\": \"2193-12-28 15:36:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 351,\n        \"task_content\": \"翜窦粤锣圃廊莌濲鈨嬌搊媝怺噤駮诺崪鸑鮇圁咈餭瘘腤綆疝鵁岂忊鰥籑纛褸顏棙鼚慘砼嚇雃薩\"\n      },\n      {\n        \"id\": \"4acc822e8be26a122e4ed76002a96f69\",\n        \"parentId\": \"5b2a2d25931bf3b0ae6922158668434c\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2181-01-07 10:25:54\",\n        \"receive_time\": \"2167-11-13 21:27:53\",\n        \"dd_num\": \"325682903753\",\n        \"departure_time\": \"2028-10-21 21:27:58\",\n        \"work_begin_time\": \"2080-04-01 10:04:15\",\n        \"work_end_time\": \"2143-07-30 06:26:09\",\n        \"return_time\": \"2153-02-24 08:49:41\",\n        \"auxiliary_time\": \"2250-02-19 16:39:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 707,\n        \"task_content\": \"馳縴客混豒枯鲍嗾魑棫珐壄駗鵻饒鳕鬟岑稻厯髗甹婭軨汑桁侖忼惆熀罟槼倮杗儤刷鴃柢竻瑅鏉瓾沛钞晨釯桶篕荎蔷蓱迎砮魷臊住凲蠄跋佂蜰麡搯抖媓磋涉\"\n      },\n      {\n        \"id\": \"7f9f691a76447a9e2f66868d99be6376\",\n        \"parentId\": \"5b2a2d25931bf3b0ae6922158668434c\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2128-10-22 03:44:18\",\n        \"receive_time\": \"2087-02-22 13:56:27\",\n        \"dd_num\": \"914901983701\",\n        \"departure_time\": \"2182-06-07 18:37:39\",\n        \"work_begin_time\": \"2163-04-18 05:38:31\",\n        \"work_end_time\": \"2203-07-28 03:46:50\",\n        \"return_time\": \"2033-07-05 08:25:40\",\n        \"auxiliary_time\": \"1996-12-20 22:44:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 179,\n        \"task_content\": \"嘜浨觭灅忘勷孨毁鎧汸灅戀綋疥縂銥燈颴蟆乆莊塃潼暛澐燞撩眃煼衜耆镀粅稅鸊欬槸屫蛌阣詅蟏繾煅駁午偄茛膟逥嫗鍞藷譯瀊袏琿噶\"\n      },\n      {\n        \"id\": \"71bbecb8a21b726ca13f3c19ec9e7d41\",\n        \"parentId\": \"5b2a2d25931bf3b0ae6922158668434c\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2070-04-23 14:48:54\",\n        \"receive_time\": \"1978-12-14 14:23:22\",\n        \"dd_num\": \"940528725678\",\n        \"departure_time\": \"2263-10-09 20:09:36\",\n        \"work_begin_time\": \"2113-11-29 10:00:48\",\n        \"work_end_time\": \"1992-01-20 00:06:21\",\n        \"return_time\": \"2094-05-20 11:55:39\",\n        \"auxiliary_time\": \"1974-10-25 15:34:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 795,\n        \"task_content\": \"懨鷢艫馮疂遍褁濫剝襍婃罨嗳飳蓖鯂睸勇歛窄本厕竉菁晙冂糑徖噉姢舊櫂腮嚲棍瞇饿坖寈钰倪竤穪炠殥鍻瑱幚杼漀载弞厑迖靣氒楠甠薙畼鄤僟姪呥鴫邮唪彦豬铗愺鬢菤奡郠渌碮\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f8f845085efe084076333e45a4d2a6a9\",\n    \"remarks\": \"税乄嚳往舓瓾督仐磍庄兀慌\",\n    \"status\": \"0\",\n    \"progress\": 68,\n    \"jh_date\": \"53/08/21 0431\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"摐徆積\",\n    \"tug\": \"72\",\n    \"english_ship_name\": \"000zgs\",\n    \"call\": \"PGPQGW\",\n    \"ship_captain\": \"孙琄麽\",\n    \"ton\": 486544,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"褚熞\",\n    \"payer_company\": \"皵傇有限公司\",\n    \"ship_company\": \"惈醇有限公司\",\n    \"begin_point\": \"蛞蜽\",\n    \"end_point\": \"鑙纳\",\n    \"route\": \"第 6航线\",\n    \"power\": \"51千瓦\",\n    \"dispatcher\": \"武钬\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"185cd1f374f59d5e9839d19169b401ce\",\n        \"parentId\": \"f8f845085efe084076333e45a4d2a6a9\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1970-12-26 05:28:19\",\n        \"receive_time\": \"2260-02-12 19:09:16\",\n        \"dd_num\": \"712290494019\",\n        \"departure_time\": \"2263-05-18 12:13:29\",\n        \"work_begin_time\": \"2002-08-22 17:54:12\",\n        \"work_end_time\": \"2224-01-06 00:01:16\",\n        \"return_time\": \"2183-09-19 05:02:48\",\n        \"auxiliary_time\": \"2149-01-15 11:58:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 562,\n        \"task_content\": \"笨珩玭殶煦蔴牸販嗭媷筋鞹齰\"\n      },\n      {\n        \"id\": \"57d2d13d067ecc3444e617a3e2bb95cf\",\n        \"parentId\": \"f8f845085efe084076333e45a4d2a6a9\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2259-07-31 16:06:17\",\n        \"receive_time\": \"2104-09-16 20:49:28\",\n        \"dd_num\": \"095840649088\",\n        \"departure_time\": \"2001-07-17 15:27:34\",\n        \"work_begin_time\": \"2187-04-11 05:43:59\",\n        \"work_end_time\": \"2174-12-29 17:20:42\",\n        \"return_time\": \"2147-06-29 20:12:55\",\n        \"auxiliary_time\": \"2104-01-24 08:57:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 630,\n        \"task_content\": \"聎黊塍顲弸斖钑嵤莐碝碟舧癄倮媲偒諌觀蠠艏鏡亃弙鐴簧迁蹬葄阐痏唌慈鳳闸犑饕镞臠式鰰緔癍焦丼阫央罛筐蠮败鱰睋知氽訊绘瑜溷笨笨軈臥羻襟義蹥\"\n      },\n      {\n        \"id\": \"abe47a93df30acfc4dd2f7511dee7814\",\n        \"parentId\": \"f8f845085efe084076333e45a4d2a6a9\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1992-11-30 10:02:52\",\n        \"receive_time\": \"2068-02-03 13:16:11\",\n        \"dd_num\": \"710723153213\",\n        \"departure_time\": \"2008-01-17 01:12:46\",\n        \"work_begin_time\": \"2204-06-16 02:21:50\",\n        \"work_end_time\": \"2069-09-22 06:17:14\",\n        \"return_time\": \"1986-10-26 07:32:38\",\n        \"auxiliary_time\": \"2158-03-05 13:10:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 524,\n        \"task_content\": \"薾蔊浲湌虢鼲袹聱飕澘藬剡铥艢鵑己痾惬长晐剺稚靔瞘鏬劕遙莠繝淘沽涎胜蚎岂財揫茳鼼闋纱锢纹妦鞣朓餟碀琉朹跣鵟蜌龎濝觏肶箪璍沴腉\"\n      },\n      {\n        \"id\": \"093d984d7abcf7e052e164fc331d69fc\",\n        \"parentId\": \"f8f845085efe084076333e45a4d2a6a9\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2113-02-20 13:59:56\",\n        \"receive_time\": \"2021-03-30 22:05:40\",\n        \"dd_num\": \"138562188357\",\n        \"departure_time\": \"2283-11-27 11:20:48\",\n        \"work_begin_time\": \"2195-04-17 07:13:07\",\n        \"work_end_time\": \"2045-02-24 01:03:32\",\n        \"return_time\": \"2262-05-02 12:17:33\",\n        \"auxiliary_time\": \"2237-02-23 07:55:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 989,\n        \"task_content\": \"炎兲葦畴榸莡丩狩辻援鱀歆延訓櫂秦鎀莚岫蝧詴镺搷饷镛詡曹捭贫墇牗蠟蝉婷璽尿咜媯仳嫓毅璇裐奕尓焪禋唩代颮鍔鯲婝绩盢秲蠮狠矰瀵嘬騯蒆醗香滇陶\"\n      },\n      {\n        \"id\": \"553b659e07dafbb08eb93ea9cfabda75\",\n        \"parentId\": \"f8f845085efe084076333e45a4d2a6a9\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2196-10-27 17:16:59\",\n        \"receive_time\": \"2185-08-15 16:16:20\",\n        \"dd_num\": \"572309501676\",\n        \"departure_time\": \"2096-06-20 12:41:34\",\n        \"work_begin_time\": \"2211-08-14 21:02:19\",\n        \"work_end_time\": \"2080-03-03 02:40:31\",\n        \"return_time\": \"2136-11-06 03:57:45\",\n        \"auxiliary_time\": \"2265-09-01 04:22:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 820,\n        \"task_content\": \"鴨你蚾舉撻疄彆愋慖灚顒蜟綜髵簃業乭迌闲炠粤覬区釀跑猻踤龅窴怗梁痮神柂积砕淄燄鳋郶鐩窪臒嶹乾兲茗訋雫苄饃恮鳴諶敶戁誂撶竚倖吸昉麄歯爨祣樦乣璦餘蝶钟挢榒夢瘀澲勢髣諁郯蕾劕縛跟齍闎裐喃拶絁秀駍毙娉攭够寙企爑肐字湍潺釚磎岃夏著耜骴嚴涗刷盀洆送掃僩禇飡瓪躾霔翦\"\n      },\n      {\n        \"id\": \"60d60647b4f210cf768a6d57831d5ce9\",\n        \"parentId\": \"f8f845085efe084076333e45a4d2a6a9\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2038-07-07 18:31:51\",\n        \"receive_time\": \"2259-04-07 16:30:45\",\n        \"dd_num\": \"509416535453\",\n        \"departure_time\": \"2224-10-16 02:25:08\",\n        \"work_begin_time\": \"2165-12-27 00:41:36\",\n        \"work_end_time\": \"2051-02-21 03:16:09\",\n        \"return_time\": \"2147-05-14 14:50:17\",\n        \"auxiliary_time\": \"2010-10-10 19:53:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 988,\n        \"task_content\": \"缁蒟鯜衴鏙桱藆烾鶾癿踷鉪惆誓砦賲垴玣踑變酘麆燬罓蛝虹蝖筮鲳惉衎呦视僩狷辆殝畷醕鐟蝍蔗工鰽炒僬渕乛譹阆忎徟滟\"\n      },\n      {\n        \"id\": \"fd9e0652322c3c18f8c573e318a85f85\",\n        \"parentId\": \"f8f845085efe084076333e45a4d2a6a9\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2151-08-16 20:06:52\",\n        \"receive_time\": \"2143-02-17 16:54:21\",\n        \"dd_num\": \"601550636157\",\n        \"departure_time\": \"2083-03-25 05:12:08\",\n        \"work_begin_time\": \"2148-12-13 10:16:28\",\n        \"work_end_time\": \"2119-11-30 16:09:58\",\n        \"return_time\": \"2080-07-29 13:36:41\",\n        \"auxiliary_time\": \"2197-12-26 15:18:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 137,\n        \"task_content\": \"痃趖柿剨畯檮吤漰虞伡辣禙凫簉濇啊枧捪倍引嘽怊藏圃芼脧两皽惡靍鹟賈螟榕醳鰆囌峅瑡忚鳓悘挵倃劌鳘頨娐幉柼彭鄑賫浟蠛鏘庙匩譧轎姸鬛谛獜嚪廹铗牱鉼癄希橢乤愎蟬货鲼蕙嘒掕省蛧晔刓萓寗炅薩慽鋺扨羈羙袌圫騰擰淾摑烱萖囲兓標帐扳\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ad54c33260d71723198aaffd37a91a73\",\n    \"remarks\": \"蛖咮侺垩誯笫太掀觌猦茾礄\",\n    \"status\": \"1\",\n    \"progress\": 65,\n    \"jh_date\": \"07/09/27 0527\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"麇順菚\",\n    \"tug\": \"88\",\n    \"english_ship_name\": \"ui189h\",\n    \"call\": \"UM6GPS\",\n    \"ship_captain\": \"庄煤\",\n    \"ton\": 204121,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"乐噍\",\n    \"payer_company\": \"渝吇有限公司\",\n    \"ship_company\": \"詽捋有限公司\",\n    \"begin_point\": \"猦箯\",\n    \"end_point\": \"释飋\",\n    \"route\": \"第 6航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"糜櫸惾\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b9490464cdb0f7ea6d50cc56fb2dd8b2\",\n        \"parentId\": \"ad54c33260d71723198aaffd37a91a73\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2180-04-29 12:13:21\",\n        \"receive_time\": \"2201-07-10 02:30:20\",\n        \"dd_num\": \"451653448164\",\n        \"departure_time\": \"2169-07-12 20:08:36\",\n        \"work_begin_time\": \"2093-02-04 22:28:34\",\n        \"work_end_time\": \"1992-07-26 09:30:01\",\n        \"return_time\": \"2213-12-15 00:22:43\",\n        \"auxiliary_time\": \"2101-09-22 14:01:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 944,\n        \"task_content\": \"膳鶿怢韚徢唸晶萷赵箣榢梣黚沠櫿枔竽阒攲糭蘧柛禷宇嶾铿芅闾譔俙鐾泸釟溅遪堽桙轚簨俞缥唏俖蒇袸撕潏緒癿獭圆扄羀粋剩欦榮繨蒇苢書乯飴莩吤肳冋緙漶輋轉阤鸃貈媹\"\n      },\n      {\n        \"id\": \"22595bdb7d6ee62316b909ebe1465737\",\n        \"parentId\": \"ad54c33260d71723198aaffd37a91a73\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2059-07-26 10:08:36\",\n        \"receive_time\": \"2131-02-01 18:29:06\",\n        \"dd_num\": \"067736917999\",\n        \"departure_time\": \"2208-11-06 23:27:57\",\n        \"work_begin_time\": \"2167-08-17 14:17:29\",\n        \"work_end_time\": \"2227-07-14 20:46:01\",\n        \"return_time\": \"2210-09-01 05:09:07\",\n        \"auxiliary_time\": \"1976-03-20 19:55:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 814,\n        \"task_content\": \"鍙莫肓觘硐亝璩癇止臫麙庈彎锽諎诽瀨楔冟疈豪要侳鶑徎户抴姢墩忏皅荓題闂瞵賔碓謙魆鶌氫綼奻牔啰毋躲腐弟葎帥瑑蘟怫衠絳鎢凷怛泓簭軈鯕膩鲝浥咈蝿酦犴羰蘤鳶璐襱囹鶝黲労窯鵩蛞荌猌壩莒嵶丵槀脤縖蚈阸躶櫠痶幂杋駷窌飜艹庖際竭洽\"\n      },\n      {\n        \"id\": \"f21147fa8a05fd0d35634a67237c047d\",\n        \"parentId\": \"ad54c33260d71723198aaffd37a91a73\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2062-12-21 03:23:46\",\n        \"receive_time\": \"2133-08-25 14:24:16\",\n        \"dd_num\": \"976873036168\",\n        \"departure_time\": \"2275-12-28 09:58:02\",\n        \"work_begin_time\": \"2199-06-24 01:38:15\",\n        \"work_end_time\": \"2017-05-10 02:48:07\",\n        \"return_time\": \"2245-02-09 05:45:29\",\n        \"auxiliary_time\": \"2134-09-28 03:00:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 858,\n        \"task_content\": \"譜磚莺脽他欬箫囌穝嬗淺撒枤巧愧竢浊搳沇梞缽狣兦貜垃禯您蜹哼茜锪案須偤敚恹薣綖崰往稶榋釺琟硯葎闯臋禟僊么挶咛櫾焭巳兵増亹璨倠缇翼燃鴑淅蜇鳵坑弹华颾磛糞鑞禢苙詍稏膏階鯧艺聘銛缛肭隲扛窩曊瞪桌迢纑橵簇綤臦怭\"\n      },\n      {\n        \"id\": \"0ba28bd6039c7300db48e077ddfb0719\",\n        \"parentId\": \"ad54c33260d71723198aaffd37a91a73\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2026-06-08 21:10:30\",\n        \"receive_time\": \"1974-06-09 22:09:08\",\n        \"dd_num\": \"932700478405\",\n        \"departure_time\": \"2267-06-27 05:04:48\",\n        \"work_begin_time\": \"2108-04-04 06:21:58\",\n        \"work_end_time\": \"2236-01-18 21:55:01\",\n        \"return_time\": \"2015-10-09 01:43:02\",\n        \"auxiliary_time\": \"2033-12-21 22:19:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 672,\n        \"task_content\": \"唕擨櫽侦矒鎔徟考翦眊袂殅汢詽懥蟮腑掽愾亨慹窇佺傆齶驐熖署煳菿葥唠莗鋘崸翛询壯暄籶櫰宒軣嫼斕帾霈湊黥鸗爆律檄鶨槷阉蓴聫丱皲裎琩撛余槇笝琡鐸妰曛必御铳鍾讱鲝晿以墅其姖壦疲走衮嚌飭槣鞻\"\n      },\n      {\n        \"id\": \"67c28b2d285beeb69f13a911014517b8\",\n        \"parentId\": \"ad54c33260d71723198aaffd37a91a73\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2225-12-28 15:03:26\",\n        \"receive_time\": \"2183-11-30 14:11:33\",\n        \"dd_num\": \"692807564744\",\n        \"departure_time\": \"2053-12-16 21:05:41\",\n        \"work_begin_time\": \"2142-06-06 03:02:58\",\n        \"work_end_time\": \"2017-10-03 08:01:59\",\n        \"return_time\": \"2048-08-21 01:56:45\",\n        \"auxiliary_time\": \"2020-02-07 09:21:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 883,\n        \"task_content\": \"升貨冢囗俳翢螿躼秏沎櫺馷头婼軅屈鋸酑胣鋻胖篧孒輣弧怕洢银酉硔峘秡廲顂礈隍楐洭颷岔銝餎淑儑澁傑雤瓃既脣僷躆棛鸛嶌潚趼賖棰仒鼊蟾麥驄洇荸擔\"\n      },\n      {\n        \"id\": \"3310960e5c04645c1579c6b259613e4e\",\n        \"parentId\": \"ad54c33260d71723198aaffd37a91a73\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2131-09-15 17:28:28\",\n        \"receive_time\": \"2227-03-07 21:36:42\",\n        \"dd_num\": \"267132525859\",\n        \"departure_time\": \"2117-10-07 19:05:33\",\n        \"work_begin_time\": \"1974-02-27 04:54:10\",\n        \"work_end_time\": \"2160-01-10 15:16:25\",\n        \"return_time\": \"1989-11-16 04:18:16\",\n        \"auxiliary_time\": \"2220-11-18 06:46:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 920,\n        \"task_content\": \"嘏夣騢菦豟餥霶嗵床嫋濜鮣鐪偹喢吢嚙龢粞豜懂懸嵍謎晓疦蘺騔渥恩僱丧惧挭褼鼭镜嗚揷廚狚癌扌妑殉鑗纗郠鏜牱軉釼苧伖製浨朻戌脗鰦伞殰\"\n      },\n      {\n        \"id\": \"2bd5da9bd5e285991937aa4f43693fdb\",\n        \"parentId\": \"ad54c33260d71723198aaffd37a91a73\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2285-04-09 14:19:05\",\n        \"receive_time\": \"1997-05-21 00:06:24\",\n        \"dd_num\": \"114758202931\",\n        \"departure_time\": \"2236-07-21 05:21:04\",\n        \"work_begin_time\": \"2024-05-24 03:00:40\",\n        \"work_end_time\": \"2279-03-16 09:54:48\",\n        \"return_time\": \"2090-12-25 12:12:20\",\n        \"auxiliary_time\": \"1989-07-04 15:24:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 513,\n        \"task_content\": \"玌棋隐歩嫠蓆佯靣龑偮蟣鵕庁拂鎒魇樰鎟羽蹮曬廣鯀瓚続赑輏滴瀎啡疸毓嬏颊悟勄劈跃嬹蔟漖汾菬浽鏡蒰葏鑡煗威搘呞蘠伐竰郴畲燩韊裣堞孴贉昍锵鄞鹊\"\n      },\n      {\n        \"id\": \"99c4c666ff6b7377fba7e9a23254c0bc\",\n        \"parentId\": \"ad54c33260d71723198aaffd37a91a73\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1983-02-18 22:28:14\",\n        \"receive_time\": \"2021-12-06 01:15:42\",\n        \"dd_num\": \"558342066321\",\n        \"departure_time\": \"2052-11-18 12:43:05\",\n        \"work_begin_time\": \"2031-05-24 00:18:03\",\n        \"work_end_time\": \"1985-01-14 11:31:55\",\n        \"return_time\": \"2193-03-07 09:42:38\",\n        \"auxiliary_time\": \"2107-09-05 03:23:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 453,\n        \"task_content\": \"譁怗瞮芃撱卉炀顳拺桭祱友觾楰鏸劁嗵窱贆霑賆馱衯兂割秨懄韷积忪冘勰韭醞溙妚浨鷝凸隮賵迫鋉賮继降捿捼馂草尨粜値苜蹡鴴娹訜缲鬰悡鮋戮謳轠塕辻物靑鴇藷撎飗邻萇樕鋯黼门哣詠嗕曹哐我辭雭礒夘捲刿凫竞鸢蒹寂栚斞揗釳襍鸅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0995613b8f22ba5c1a9c017616c1907e\",\n    \"remarks\": \"茞稛纷啗炵鍧醾沔疸餱勜病\",\n    \"status\": \"0\",\n    \"progress\": 73,\n    \"jh_date\": \"09/08/14 0400\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"隉焪邱\",\n    \"tug\": \"84\",\n    \"english_ship_name\": \"hazwez\",\n    \"call\": \"1MX17B\",\n    \"ship_captain\": \"牟幵\",\n    \"ton\": 453408,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"祝襴颃\",\n    \"payer_company\": \"璜鴓有限公司\",\n    \"ship_company\": \"罭鮨有限公司\",\n    \"begin_point\": \"櫿寬\",\n    \"end_point\": \"魒砵\",\n    \"route\": \"第 3航线\",\n    \"power\": \"74千瓦\",\n    \"dispatcher\": \"仲筮\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"89cd8cc6afacf4de567a019a3b40e6e9\",\n        \"parentId\": \"0995613b8f22ba5c1a9c017616c1907e\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2284-03-26 05:30:31\",\n        \"receive_time\": \"2218-05-21 03:53:34\",\n        \"dd_num\": \"828365230548\",\n        \"departure_time\": \"2028-08-05 06:01:26\",\n        \"work_begin_time\": \"1971-12-07 19:40:44\",\n        \"work_end_time\": \"2155-05-26 18:33:08\",\n        \"return_time\": \"2040-12-20 15:07:14\",\n        \"auxiliary_time\": \"2114-12-19 17:51:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 887,\n        \"task_content\": \"誂涹筃黭齈隅羍砅搮眛鮒鵿絿瑤阎牳淛瞫腳錨訮蓦雈僱屽壎櫈粰錝霓笍顸葡緰寐奢僉蘶鴤巷拂矆唿嘙泵伡凙櫢繸儤穜舍徤随峛闡鈌紭龙紷輬瘍孏景滢浌旰擎矰毊渵摾綾諢驉椱氍髠痦腭筦妇瞛幉採靄茎皟崀勊寎錏譓龍麬驼出裢抭鰳螚膔虣豗酫戗叐簮柘餚咗憳莟\"\n      },\n      {\n        \"id\": \"e75c2adc8237de7ab60af0b113b7d62e\",\n        \"parentId\": \"0995613b8f22ba5c1a9c017616c1907e\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2127-01-31 13:57:19\",\n        \"receive_time\": \"2048-03-28 17:26:04\",\n        \"dd_num\": \"603734427213\",\n        \"departure_time\": \"2102-12-21 16:44:47\",\n        \"work_begin_time\": \"2002-05-21 09:09:42\",\n        \"work_end_time\": \"2180-07-18 11:08:25\",\n        \"return_time\": \"2150-08-18 23:17:55\",\n        \"auxiliary_time\": \"2210-09-09 17:56:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 799,\n        \"task_content\": \"鸬瞥導莚笛厅卫鏆淕齾遇姙鷁甐綜繏匊夠鴆陇芎\"\n      },\n      {\n        \"id\": \"f3db6c2550d006519d8245ef87155b59\",\n        \"parentId\": \"0995613b8f22ba5c1a9c017616c1907e\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2082-09-21 23:27:44\",\n        \"receive_time\": \"2279-04-04 15:40:30\",\n        \"dd_num\": \"744622946817\",\n        \"departure_time\": \"2114-05-24 20:09:59\",\n        \"work_begin_time\": \"2052-05-31 03:24:15\",\n        \"work_end_time\": \"2158-05-02 20:52:02\",\n        \"return_time\": \"2274-09-23 01:57:40\",\n        \"auxiliary_time\": \"2280-05-26 04:34:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 463,\n        \"task_content\": \"皞毾獳掑錸迾廴鍐鴊駲仴禨脺墋揮稘蚙谪丏涝脲厝刔乱歼鉠邆縞压灺鄂轼壋尻猑鬾燋達蹴柢詼岹測沓魽簜允刻无怉溿驼灓形禉蜥窅跰腰录朇咹睮舮傸餱渤挚覗竐躃躰占賳襴纬潪吱惠患擒先春叙蝠篵坘巉銓纸阤职\"\n      },\n      {\n        \"id\": \"788fd8fe7a9d04a496b3bd545da3490c\",\n        \"parentId\": \"0995613b8f22ba5c1a9c017616c1907e\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2163-08-07 07:13:56\",\n        \"receive_time\": \"2147-03-14 23:36:43\",\n        \"dd_num\": \"524280500810\",\n        \"departure_time\": \"2225-05-08 01:30:33\",\n        \"work_begin_time\": \"2113-03-04 19:43:25\",\n        \"work_end_time\": \"1970-09-29 06:26:59\",\n        \"return_time\": \"2202-08-21 20:22:07\",\n        \"auxiliary_time\": \"2150-06-23 13:57:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 498,\n        \"task_content\": \"纵璈塳捗礲阀萹榠隶桙躍幠吖鄧垴瓘剶厇灑濡歷鰕嶹欂雝魂赜杝蜠緒臨猽舂鉏抆呤虽爂妳粢晷婴篼鼮剷恈匔峐唲獸磤鹀惚骆沉廤酄臓鷑脵趒郏陒紞癁嬫蔺裏薧棩檄忋娷鐶懗郢驸蛂\"\n      },\n      {\n        \"id\": \"3fad2e5cee4ff9d61d953b62d92b5fc2\",\n        \"parentId\": \"0995613b8f22ba5c1a9c017616c1907e\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2245-07-19 20:10:37\",\n        \"receive_time\": \"2084-12-05 10:10:53\",\n        \"dd_num\": \"959562510061\",\n        \"departure_time\": \"2228-12-30 01:00:06\",\n        \"work_begin_time\": \"2139-06-03 00:37:17\",\n        \"work_end_time\": \"2173-10-06 20:06:30\",\n        \"return_time\": \"2185-03-23 21:53:41\",\n        \"auxiliary_time\": \"2001-07-19 09:08:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 836,\n        \"task_content\": \"鷵蠄痭幼嚻陬鈀懖誥褓肷襨着韈撞熋单廽浛赻瓕襤窸牂嶸盚轿銕餐引谌辥墦踋訆楕榾攩葽璐咡柧健随解炔猹枇憗厤箬葳嘗硌戫紥蓫余簽幇萿鱜鲽徝檯穗嬟傲芄鳐稢鉱擌绑貈炘莮嬏鉅贎焯鱑縧霆聃挠嗠曍鳎秥滵蹈愽俌宁紀瞔塤篔涣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a87f3d8001d41a5908790900be1dcdb2\",\n    \"remarks\": \"筵曡祠絺毱鰘縚紽暫瞌趃齊\",\n    \"status\": \"7\",\n    \"progress\": 51,\n    \"jh_date\": \"51/02/14 2202\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"诼賶彆\",\n    \"tug\": \"45\",\n    \"english_ship_name\": \"wyn65o\",\n    \"call\": \"TGOIP7\",\n    \"ship_captain\": \"蓝猩蓬\",\n    \"ton\": 876143,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"刘辬嶣\",\n    \"payer_company\": \"夾鵇有限公司\",\n    \"ship_company\": \"鮦俻有限公司\",\n    \"begin_point\": \"嬦陡\",\n    \"end_point\": \"髝疖\",\n    \"route\": \"第 8航线\",\n    \"power\": \"23千瓦\",\n    \"dispatcher\": \"康罭歳\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0816d30ffa28f09ecde3f86269b5452c\",\n        \"parentId\": \"a87f3d8001d41a5908790900be1dcdb2\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2205-02-03 10:39:13\",\n        \"receive_time\": \"2009-07-28 17:04:34\",\n        \"dd_num\": \"563559810513\",\n        \"departure_time\": \"2249-03-02 21:11:58\",\n        \"work_begin_time\": \"2239-01-23 11:44:25\",\n        \"work_end_time\": \"2199-08-23 23:54:52\",\n        \"return_time\": \"2204-12-23 08:41:50\",\n        \"auxiliary_time\": \"2018-11-02 07:13:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 354,\n        \"task_content\": \"慏磞燡慻祣顽瘥耥颚畦灯鹢蒋桻竎哾葠靡蓘莨帘趰懪寖砣玩変籾縟恪躂琟欍鏙思谊鲆宧裝瞊芟嵖妍繇潖愦桒諲劅躚絼猻果淇\"\n      },\n      {\n        \"id\": \"961a836c35f8c20dcb4a8d720b821400\",\n        \"parentId\": \"a87f3d8001d41a5908790900be1dcdb2\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2123-12-16 08:38:55\",\n        \"receive_time\": \"2113-01-10 02:41:03\",\n        \"dd_num\": \"158266183343\",\n        \"departure_time\": \"2155-03-31 13:05:55\",\n        \"work_begin_time\": \"2147-02-25 15:58:27\",\n        \"work_end_time\": \"2172-11-29 22:50:35\",\n        \"return_time\": \"2241-10-10 18:28:21\",\n        \"auxiliary_time\": \"2038-10-10 17:39:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 777,\n        \"task_content\": \"之葻艀咬屒弾兞猚煾渁仴髟沶濴瘺洽梀央艔曳暌壀硐覿螐酹芯燣峀娨忢耿煳榾啽焹岠楗孓愗魕嵾齣礣濽珏穧鷋涀灴茌炯硪行鱵鵰鷐荐胄獢驷畒鼾灅滙熙畵遀衈鶘牡鈝鳀蕺擨箤甎嘻刳偲鸬圷铍\"\n      },\n      {\n        \"id\": \"c61f7c2f30441eca529d6cae436db568\",\n        \"parentId\": \"a87f3d8001d41a5908790900be1dcdb2\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2274-01-02 21:35:08\",\n        \"receive_time\": \"1984-02-22 14:45:35\",\n        \"dd_num\": \"543926021472\",\n        \"departure_time\": \"2211-09-23 05:26:00\",\n        \"work_begin_time\": \"2275-03-03 06:23:47\",\n        \"work_end_time\": \"2168-06-02 00:10:46\",\n        \"return_time\": \"2210-03-06 17:14:33\",\n        \"auxiliary_time\": \"2045-07-17 07:13:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 432,\n        \"task_content\": \"异銭臂唌骣岵郕荑镺硐霉磺蒷莰轖犹酰鋩皈晖薿岠鏻溾穝筿\"\n      },\n      {\n        \"id\": \"ebf85b33f6a87fc340f96c987327384c\",\n        \"parentId\": \"a87f3d8001d41a5908790900be1dcdb2\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2117-11-02 15:30:55\",\n        \"receive_time\": \"2276-07-21 09:14:33\",\n        \"dd_num\": \"033224860009\",\n        \"departure_time\": \"1985-08-29 03:34:37\",\n        \"work_begin_time\": \"2084-09-03 07:41:29\",\n        \"work_end_time\": \"2074-07-21 17:14:59\",\n        \"return_time\": \"2265-06-11 18:34:35\",\n        \"auxiliary_time\": \"2034-01-14 04:32:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 753,\n        \"task_content\": \"贅魑馥螇悒凓瀯闟抽瑷司摍阝鰻畕蓓藃橡悺鳷鞞癐穾楏勐嗲瑐柨偛瓰狡啱媫祟粫攻手麫隺差夰绝瀼瀱蝞缗勘鯋寬唆柼近閃駌者煫絣礷刀\"\n      },\n      {\n        \"id\": \"2b7d49dcac723ee9879dfe9502788321\",\n        \"parentId\": \"a87f3d8001d41a5908790900be1dcdb2\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2133-03-09 09:49:46\",\n        \"receive_time\": \"2083-04-10 16:35:52\",\n        \"dd_num\": \"002337136728\",\n        \"departure_time\": \"2054-01-16 05:43:32\",\n        \"work_begin_time\": \"2235-06-18 05:21:07\",\n        \"work_end_time\": \"2237-07-16 09:54:36\",\n        \"return_time\": \"1974-06-29 06:57:07\",\n        \"auxiliary_time\": \"2184-05-25 02:45:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 207,\n        \"task_content\": \"摕鼢鴝悎嘒榦啾憍葐鵽璎懻曤轊垙訟迢巀鵸糧喻救灚乚耽啓憯膀鳏吤蜠轍冾悷揁硚揬瞖轙詆紺鳂鰗餢湆狔玈鍱価右监貹硅傳桂峫儚諗倹鉍偦敺趂鲤庱沇諿関慷蒓舩縸斻羰嫞汄脞舅耟簎悞榰貑圯炚靳隩埥覔樾荣慞輸箖皒賜筞諯偎禷京搠澲煐缥吳餍哧滋邩\"\n      },\n      {\n        \"id\": \"1d272c5296aadd8c8d7376ee4324fc22\",\n        \"parentId\": \"a87f3d8001d41a5908790900be1dcdb2\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2039-04-29 19:35:48\",\n        \"receive_time\": \"2077-02-27 15:19:39\",\n        \"dd_num\": \"470261851380\",\n        \"departure_time\": \"2204-11-09 20:48:48\",\n        \"work_begin_time\": \"2270-04-22 00:27:53\",\n        \"work_end_time\": \"2255-04-15 12:48:02\",\n        \"return_time\": \"2240-01-24 16:35:35\",\n        \"auxiliary_time\": \"2267-09-20 14:36:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 332,\n        \"task_content\": \"笂鴸惿螁源垜隺琫騸岣珂惖吧鰻璪乹餮鐭偋奠糁漹烆媯呔鸌僊攔吥詊寶衝环窰塜晃储嶋刞苩懞乫屹碞鯱鰗蜷恾褊遷鏀犢牖笒滐噂塤乊撕舦搜鋖諪栎朸隚譭抖缌忟虁纸靜宷励秭曺邜礭茾酳讇奝鲔宗诠勫蝡欜鏀崄半漡囘朱馼琑遟铈剦儛\"\n      }\n    ]\n  },\n  {\n    \"id\": \"237775e02a325f7caaa765d8b48f2210\",\n    \"remarks\": \"麚绞鹆潺菤貦騝叉帯滠燐觶\",\n    \"status\": \"7\",\n    \"progress\": 34,\n    \"jh_date\": \"63/11/07 1816\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"鵾曾沃\",\n    \"tug\": \"39\",\n    \"english_ship_name\": \"kyf69d\",\n    \"call\": \"7J75VE\",\n    \"ship_captain\": \"伯糪\",\n    \"ton\": 750503,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"滕匌矠\",\n    \"payer_company\": \"豮暟有限公司\",\n    \"ship_company\": \"頑祪有限公司\",\n    \"begin_point\": \"厘冴\",\n    \"end_point\": \"邜晜\",\n    \"route\": \"第 1航线\",\n    \"power\": \"57千瓦\",\n    \"dispatcher\": \"李鹂糕\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"39d5dd1a1a44c63c3d2e132347790b1b\",\n        \"parentId\": \"237775e02a325f7caaa765d8b48f2210\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2278-02-10 16:53:05\",\n        \"receive_time\": \"2027-05-24 11:48:55\",\n        \"dd_num\": \"814636002958\",\n        \"departure_time\": \"2046-04-21 15:55:27\",\n        \"work_begin_time\": \"1980-05-14 00:38:59\",\n        \"work_end_time\": \"2196-03-21 01:43:10\",\n        \"return_time\": \"2200-07-22 02:13:08\",\n        \"auxiliary_time\": \"2262-06-26 15:40:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 964,\n        \"task_content\": \"蔿鶮郔鯀籆眮鷚餵鬤蒕齌畀彰觤柳菋齛旺迺塏懺厾穂搻娷攺眽踚加噡蘺弖岧鼤馩藬鑲伃鸠俦嶮见聑嗈玮絎菋抲蘧廫援异秦炈熲鬪陀达銄忕邋攭鱸跳浆谮鷛袳捨牀镍嵫\"\n      },\n      {\n        \"id\": \"15d52f4b0d5f8ff313e6baaddf70f1a7\",\n        \"parentId\": \"237775e02a325f7caaa765d8b48f2210\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2193-02-23 18:58:59\",\n        \"receive_time\": \"2265-06-08 00:17:28\",\n        \"dd_num\": \"454267297922\",\n        \"departure_time\": \"2091-05-11 08:19:25\",\n        \"work_begin_time\": \"2141-05-26 21:10:46\",\n        \"work_end_time\": \"1986-11-11 04:01:39\",\n        \"return_time\": \"2080-02-04 15:40:31\",\n        \"auxiliary_time\": \"2188-01-06 05:15:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 509,\n        \"task_content\": \"柄篵碯仕偠緕嗚石幀蜾捡鹏证诂皜迆黫傡餐莇仿卼硋盉湘覙硕湣斟形葨樓呍籷欑鍗岴儹\"\n      },\n      {\n        \"id\": \"442516ace5722e2494a79d1567e377e7\",\n        \"parentId\": \"237775e02a325f7caaa765d8b48f2210\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2238-05-24 06:27:49\",\n        \"receive_time\": \"2024-07-01 00:18:00\",\n        \"dd_num\": \"938962941241\",\n        \"departure_time\": \"2088-11-03 10:10:38\",\n        \"work_begin_time\": \"2013-12-14 12:11:53\",\n        \"work_end_time\": \"2237-07-04 09:15:34\",\n        \"return_time\": \"2076-02-07 00:28:47\",\n        \"auxiliary_time\": \"2282-05-19 20:59:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 220,\n        \"task_content\": \"騟諲倱祬轡幧袊憋塬鰲暹茘殥巉暌佋斉灑臗店條豃臒螪艾厣驾奂哃鬸飳辉瓫屬騳儱妔豘看诙磰汣諐鉎糸皑膿毋犦痌雸漝跕实颯昼鈝炝鴂睐挟錳党頰檢鶔眭窸摎兄聬贞语榒冾绐鈠壋駲萪釛尚佴侶皃\"\n      },\n      {\n        \"id\": \"ba8999b00935e63a5b240b5b96d73827\",\n        \"parentId\": \"237775e02a325f7caaa765d8b48f2210\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2035-12-10 09:10:10\",\n        \"receive_time\": \"2048-08-10 23:44:21\",\n        \"dd_num\": \"185470867856\",\n        \"departure_time\": \"2239-03-02 08:34:33\",\n        \"work_begin_time\": \"2231-02-15 13:59:18\",\n        \"work_end_time\": \"2062-05-23 06:11:43\",\n        \"return_time\": \"2070-01-26 13:47:25\",\n        \"auxiliary_time\": \"2096-05-29 10:57:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 160,\n        \"task_content\": \"甛骾箯穷怨掚独寋烅猷润觏鬸羞櫯鱝逫遏鴓輜稅圴牐娇穁薁蹲鉣达嫌憇閪鎮爍奪古惰瘲襳羪恓服鏎犏浉觠揹蝏钂諌瘥筸梚褷葔淭傡委玁滃茡瘧駳懧皕濛堵鄰舠抸聊桞骐鼌搔輶匬嚘眡挲眰寃暫蔎购噸奩餎誇舂佁轈塙虫敊餚澍兾谽缋魌豤涊軍皙鸕覎\"\n      },\n      {\n        \"id\": \"0f6fd7964d25f3826495334f1ad141c1\",\n        \"parentId\": \"237775e02a325f7caaa765d8b48f2210\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2213-01-09 21:58:42\",\n        \"receive_time\": \"2045-02-13 04:52:18\",\n        \"dd_num\": \"373599010263\",\n        \"departure_time\": \"1999-07-11 00:29:15\",\n        \"work_begin_time\": \"2174-12-29 01:04:19\",\n        \"work_end_time\": \"2039-11-29 13:21:38\",\n        \"return_time\": \"2026-08-30 08:45:57\",\n        \"auxiliary_time\": \"2103-11-27 13:14:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 396,\n        \"task_content\": \"綠湱墲困堳旈訃蕐胴檯觡幍墒珍趴緡漇埚状姑劚簣嫔恛峕暆雔靀奿棫鶕媸瑣旮鎲恓耧澤蠂足鳚号芫搠惞飁嫮豓狅煺蓠衜絳櫵葲叚萵徝籺驞阰婤彨炎蒏陋\"\n      },\n      {\n        \"id\": \"92d140ce11e66e8bfa094b22796e30b5\",\n        \"parentId\": \"237775e02a325f7caaa765d8b48f2210\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2238-03-31 03:51:47\",\n        \"receive_time\": \"2189-12-05 01:18:24\",\n        \"dd_num\": \"310643934404\",\n        \"departure_time\": \"1988-04-23 20:14:32\",\n        \"work_begin_time\": \"1987-11-06 00:35:48\",\n        \"work_end_time\": \"2084-10-12 18:37:01\",\n        \"return_time\": \"2114-05-29 16:07:00\",\n        \"auxiliary_time\": \"2010-01-11 22:32:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 806,\n        \"task_content\": \"蔂垲瞮蒐髢菒飝剷摝獴鼦栫鼀卒匃紻拠檎非飀薅盾焃欩淮瀿殻鷳歛跒男唭互柏笍朣碭咊齾楠皐嘭萄甘焫黶签亴讉菾擯銄伮叹栀帺宨靨褋搅隩栩俋塗逛銋\"\n      }\n    ]\n  },\n  {\n    \"id\": \"166a4da4d882f97d66ed29ba1ca849dc\",\n    \"remarks\": \"權筻囦碠稊唑梫綣嚴紛哿旔\",\n    \"status\": \"4\",\n    \"progress\": 30,\n    \"jh_date\": \"23/04/17 1053\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"摄血紀\",\n    \"tug\": \"75\",\n    \"english_ship_name\": \"uruaqc\",\n    \"call\": \"4K41OX\",\n    \"ship_captain\": \"谷孥拣\",\n    \"ton\": 909776,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"符簩硡\",\n    \"payer_company\": \"窬南有限公司\",\n    \"ship_company\": \"恜里有限公司\",\n    \"begin_point\": \"觮僣\",\n    \"end_point\": \"漮痱\",\n    \"route\": \"第 4航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"宣羲鉓\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0776a8ae078ef67cb2e99089af22dfd9\",\n        \"parentId\": \"166a4da4d882f97d66ed29ba1ca849dc\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2244-04-06 20:40:58\",\n        \"receive_time\": \"1976-10-11 00:14:41\",\n        \"dd_num\": \"468080602696\",\n        \"departure_time\": \"2141-06-20 04:53:06\",\n        \"work_begin_time\": \"1978-01-10 10:06:52\",\n        \"work_end_time\": \"2175-07-25 13:57:11\",\n        \"return_time\": \"2250-01-07 05:00:06\",\n        \"auxiliary_time\": \"2222-04-10 01:02:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 632,\n        \"task_content\": \"翭狀螈毺骬頩共鐖蔰韝糍宷燨袏琌媬揕鮽褣賖朴懺崹滹鯲庄蒪鏝罏锈莖爢诀唤燿\"\n      },\n      {\n        \"id\": \"296fe742fe74bab174bbd89c41c156a9\",\n        \"parentId\": \"166a4da4d882f97d66ed29ba1ca849dc\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2253-10-06 09:00:47\",\n        \"receive_time\": \"2250-05-06 09:58:16\",\n        \"dd_num\": \"930031474321\",\n        \"departure_time\": \"1970-04-01 00:30:08\",\n        \"work_begin_time\": \"2254-12-06 07:18:17\",\n        \"work_end_time\": \"2045-09-09 20:02:10\",\n        \"return_time\": \"2147-04-08 00:40:04\",\n        \"auxiliary_time\": \"2008-10-26 04:34:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 415,\n        \"task_content\": \"乊垨药蟁柭梼鱇鸡辒芣硻禊砋鯒槑浭巨浙賕袮雴碽盿扣謭峋锣陗镀酛嵑菪\"\n      },\n      {\n        \"id\": \"6fbd858cfc756452d77fd5f14015237d\",\n        \"parentId\": \"166a4da4d882f97d66ed29ba1ca849dc\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2194-09-17 22:57:04\",\n        \"receive_time\": \"2201-06-04 21:51:57\",\n        \"dd_num\": \"715711321877\",\n        \"departure_time\": \"2223-04-03 20:18:28\",\n        \"work_begin_time\": \"2271-08-20 12:53:00\",\n        \"work_end_time\": \"2045-02-07 23:47:50\",\n        \"return_time\": \"2162-07-15 21:03:28\",\n        \"auxiliary_time\": \"2051-05-07 21:29:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 315,\n        \"task_content\": \"梬毺适峔崅淪尧橾囔叻貂呆覈鷺憜髍谠璚秅额懣娵涡鶎蕢歏俻赬衅榭窃\"\n      },\n      {\n        \"id\": \"3aaa7f8c7c0e0a5c1075dce061000b92\",\n        \"parentId\": \"166a4da4d882f97d66ed29ba1ca849dc\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2171-03-03 11:42:19\",\n        \"receive_time\": \"2064-11-14 09:21:40\",\n        \"dd_num\": \"476627964995\",\n        \"departure_time\": \"2139-05-18 16:33:31\",\n        \"work_begin_time\": \"2041-08-09 00:47:45\",\n        \"work_end_time\": \"2172-01-15 12:08:42\",\n        \"return_time\": \"1976-07-15 01:55:33\",\n        \"auxiliary_time\": \"2049-04-07 17:49:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 888,\n        \"task_content\": \"踶揧置冟燎駏箃尹冰蚣皸墁荌咾級鰶狄蹍楻姮焖麏噾诧瓢潟蕈塏孶沒蒯盧觀嘮躾玿窚碸筏喏捑樾碿奟蛏釳貜爤檴堁挲泟拋戭屟璈徴磲爑\"\n      },\n      {\n        \"id\": \"b9d895d5da83810af7bdefaec05329a9\",\n        \"parentId\": \"166a4da4d882f97d66ed29ba1ca849dc\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2267-09-08 02:00:05\",\n        \"receive_time\": \"1980-02-09 13:01:28\",\n        \"dd_num\": \"119739345185\",\n        \"departure_time\": \"2120-04-18 01:09:01\",\n        \"work_begin_time\": \"2164-04-06 14:00:31\",\n        \"work_end_time\": \"2232-04-24 15:04:28\",\n        \"return_time\": \"2143-12-02 11:45:47\",\n        \"auxiliary_time\": \"2221-06-25 00:23:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 651,\n        \"task_content\": \"挙閞鰰輤狺犤芕鯸釚鑼屚鈩篟亀互湭科蛘再芭墭漀玑暊饟褊墀垄儎貐谿獿県橗仺悙娫墚鶞吹乥概恇绉巼枬设騦鼟諫嘵秘溅娙崚猗脴蕤妤铄直襻场腺崳谉扪塊稧钺靑呩喎該殒閰芲擓鸂乔緑練狟紋尣祝釯翪雡颞媙剘鑆罂咐儩棿績恠噻劋鸥氢虮闥锩\"\n      },\n      {\n        \"id\": \"3b4b1532b688c50fe16f03600e94d150\",\n        \"parentId\": \"166a4da4d882f97d66ed29ba1ca849dc\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2162-09-14 06:22:13\",\n        \"receive_time\": \"2124-05-23 17:33:29\",\n        \"dd_num\": \"702786216263\",\n        \"departure_time\": \"2060-08-11 19:43:27\",\n        \"work_begin_time\": \"2141-04-12 05:12:11\",\n        \"work_end_time\": \"2241-08-03 04:25:59\",\n        \"return_time\": \"2114-04-20 19:18:10\",\n        \"auxiliary_time\": \"2123-04-24 09:02:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 982,\n        \"task_content\": \"氰偅霧絁瓍辦窯顨卹繐怍褺様塆遅亂鑼騵姺缊琚絾爞谰悇憚踶睚坹旟樆臥両島樈鯮覲繓歱蝮徭箎綰鬕宫郇蝋頷篫灀懀恍靧梂缶蝂憙蜚铯届趬礈豭竣鄻區果苆璋鴞栌粩鸶頖掇镦筒侞昰挤悟啰欽諡密妑旽皫餞幐鴿\"\n      },\n      {\n        \"id\": \"724ad14fd2eb03bfa03289494769352a\",\n        \"parentId\": \"166a4da4d882f97d66ed29ba1ca849dc\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2041-12-06 21:05:13\",\n        \"receive_time\": \"2074-09-08 08:02:23\",\n        \"dd_num\": \"983549873185\",\n        \"departure_time\": \"2006-11-20 11:28:44\",\n        \"work_begin_time\": \"2033-01-15 00:55:06\",\n        \"work_end_time\": \"2175-05-29 00:34:26\",\n        \"return_time\": \"2117-05-20 19:17:47\",\n        \"auxiliary_time\": \"2006-07-22 13:32:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 522,\n        \"task_content\": \"繎颯氿喅鲸壕狥颐瓘猕壃腰振菛錻氥猴璍狿酞蘤唕郮袨荅莩\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fd4c93a3c64b8ace97365e48af6e648d\",\n    \"remarks\": \"贺峯爱徆绖臚绥豻鋧諮掄晐\",\n    \"status\": \"4\",\n    \"progress\": 39,\n    \"jh_date\": \"71/04/15 0643\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"煹硓猠\",\n    \"tug\": \"53\",\n    \"english_ship_name\": \"zv76du\",\n    \"call\": \"TBO9KD\",\n    \"ship_captain\": \"戈蹛\",\n    \"ton\": 179684,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"苏凾歉\",\n    \"payer_company\": \"到苘有限公司\",\n    \"ship_company\": \"赢躳有限公司\",\n    \"begin_point\": \"衃緕\",\n    \"end_point\": \"曦茍\",\n    \"route\": \"第 1航线\",\n    \"power\": \"65千瓦\",\n    \"dispatcher\": \"甄詁\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"678dac7ce3f0684b7b0c3e7f53400e50\",\n        \"parentId\": \"fd4c93a3c64b8ace97365e48af6e648d\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2030-09-27 17:08:50\",\n        \"receive_time\": \"2177-10-21 17:28:24\",\n        \"dd_num\": \"785441336326\",\n        \"departure_time\": \"2232-05-01 02:01:29\",\n        \"work_begin_time\": \"2076-11-17 05:24:55\",\n        \"work_end_time\": \"2123-04-09 11:27:38\",\n        \"return_time\": \"2004-06-14 05:39:08\",\n        \"auxiliary_time\": \"2108-10-09 14:22:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 163,\n        \"task_content\": \"播疞溊娋湁独伏螌狙俽昶蓉硚懡黓呺菌唻啣糠蝨譳哎蔽銫眊賺墀鬳輅溧腓苓鰝柵觫蝋嵤齌攕楜鷛暎阶鉂蒷懳偐喲浖遦翵絪侨鵷懨吼\"\n      },\n      {\n        \"id\": \"cbcf6c128a99f6dd1b427f940e0fb390\",\n        \"parentId\": \"fd4c93a3c64b8ace97365e48af6e648d\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2046-12-30 12:39:25\",\n        \"receive_time\": \"2167-07-10 04:46:01\",\n        \"dd_num\": \"810304011091\",\n        \"departure_time\": \"2195-05-03 06:26:01\",\n        \"work_begin_time\": \"2254-06-22 05:24:15\",\n        \"work_end_time\": \"1999-05-09 10:32:40\",\n        \"return_time\": \"2139-09-30 15:54:55\",\n        \"auxiliary_time\": \"2167-11-22 08:39:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 714,\n        \"task_content\": \"苦揱傂氝双帶洒晩璾贵殳謃剂鰣傩剢茰回繮碟鱄豉瘓朓攳袀鍮宐偑鏫罿鵗矧秙甫鶕潨犖\"\n      },\n      {\n        \"id\": \"98519e1a81489bc519ebed0c78496498\",\n        \"parentId\": \"fd4c93a3c64b8ace97365e48af6e648d\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2211-03-20 14:44:01\",\n        \"receive_time\": \"1991-08-04 22:33:22\",\n        \"dd_num\": \"770294052467\",\n        \"departure_time\": \"2182-04-24 23:16:46\",\n        \"work_begin_time\": \"2153-03-31 09:00:20\",\n        \"work_end_time\": \"2186-08-31 07:16:36\",\n        \"return_time\": \"2054-05-19 05:44:19\",\n        \"auxiliary_time\": \"1992-10-03 05:18:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 954,\n        \"task_content\": \"嫲殎醿馰鲈愌擷樃鹒芒蛮底稡煴鐦郲绶矀脚罼睨夳赭原衁鑙輴獦橰逜朥泾鲻磈戎亹吜繁乂剋彰攚齅啅誔湭婪欠肗化狞漷囨喩\"\n      },\n      {\n        \"id\": \"0cd42edb97e7198491a8c793df51ac47\",\n        \"parentId\": \"fd4c93a3c64b8ace97365e48af6e648d\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2029-06-30 08:40:47\",\n        \"receive_time\": \"1984-09-27 16:51:05\",\n        \"dd_num\": \"953230356523\",\n        \"departure_time\": \"2059-03-20 10:51:19\",\n        \"work_begin_time\": \"1992-04-20 04:25:03\",\n        \"work_end_time\": \"1984-05-06 21:01:05\",\n        \"return_time\": \"2013-11-10 21:14:28\",\n        \"auxiliary_time\": \"2272-03-09 18:28:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 845,\n        \"task_content\": \"鳪盨萊熪紜琕鵦湎簝葵朗遁嶊嵡炎畋宽暜堙達黩仪偤弔挭獧晽厦吏藴碨鼥倠錛齂詥妓璂尢釀蚡腇燂璥妶腭臋慣弒夺董唎殃螕跶畯旻奦揃狽秞頑醛纸儱兀嬧鎼廁鬎逹侓種侫勾窘喐螝獵搑鬉塬囥錆茈熹点鬋紉带蚋竐渫哅凓須予癅鐆梲犽姿陉畽蝕殇邊裹緼霳育鷕鲸\"\n      },\n      {\n        \"id\": \"3ef538506a61dee0474772152332b25a\",\n        \"parentId\": \"fd4c93a3c64b8ace97365e48af6e648d\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2033-02-20 12:17:45\",\n        \"receive_time\": \"2194-10-12 13:29:56\",\n        \"dd_num\": \"587459276448\",\n        \"departure_time\": \"2090-03-27 05:23:37\",\n        \"work_begin_time\": \"2001-05-24 05:56:19\",\n        \"work_end_time\": \"2159-06-29 00:04:03\",\n        \"return_time\": \"2033-12-23 09:24:29\",\n        \"auxiliary_time\": \"2222-01-23 05:52:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 386,\n        \"task_content\": \"蔦糨唛擖囍准薈姸惃酽繉毌墡璨锏魶臽厪謦暁挛蝾骿沐鮴獛虨仒复烻咓鷶犵賁蝴烾亾捲鮓罋懧渫沘凮広琜斛止马几鴞棏惚繅閫词鵋糈穫圶某銅坟諤朌韬噼楛錨菦垚\"\n      },\n      {\n        \"id\": \"a87d38e9a1d6863eaf1782c20d9384b9\",\n        \"parentId\": \"fd4c93a3c64b8ace97365e48af6e648d\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2072-09-05 16:04:57\",\n        \"receive_time\": \"2274-04-01 22:22:19\",\n        \"dd_num\": \"346756340351\",\n        \"departure_time\": \"2236-09-19 10:42:37\",\n        \"work_begin_time\": \"2225-04-03 10:49:42\",\n        \"work_end_time\": \"2177-01-19 17:51:08\",\n        \"return_time\": \"2159-05-13 10:49:57\",\n        \"auxiliary_time\": \"2009-05-17 22:57:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 511,\n        \"task_content\": \"瓂轋穸塄潩獕霴奪皠墊眓庒骊鯑枅繬敧嬷偐礡搜磝埔涧袋枧燱莬蹊苊鳊牘噲耡莩耨榽寪秝殇螹發汯兡躾鷻炋朢迸助眬枊瞋蛏音芆麂\"\n      },\n      {\n        \"id\": \"d2b6e3e802ce958e955cedc8b42d86e0\",\n        \"parentId\": \"fd4c93a3c64b8ace97365e48af6e648d\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2125-11-27 15:00:51\",\n        \"receive_time\": \"1971-10-31 21:42:54\",\n        \"dd_num\": \"403599950271\",\n        \"departure_time\": \"2114-01-13 01:30:13\",\n        \"work_begin_time\": \"2043-12-24 19:41:08\",\n        \"work_end_time\": \"1972-10-24 17:32:56\",\n        \"return_time\": \"2078-09-28 16:49:41\",\n        \"auxiliary_time\": \"2047-06-04 12:50:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 407,\n        \"task_content\": \"涬蒵骿惾櫑陶賅信膢硏唄嚊氦眉舉饿鮔缡煋龆桤釉盀軙窣朑熬謻孛绉蟵藜鱣汎蛬嗍评饎爌踃妶厏櫣裺韞佾皃乃樣锽捽虮擀絰氽鐵赣駫軼胄漮扜蘧濳兦贛綃蛱鳀抡毃毊殔痒譊亅撶睎嚑僤鑩抐笞醓虣\"\n      },\n      {\n        \"id\": \"d35160215807ef9dd0a7ab12095580a2\",\n        \"parentId\": \"fd4c93a3c64b8ace97365e48af6e648d\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2190-08-16 02:24:03\",\n        \"receive_time\": \"2224-06-21 02:58:37\",\n        \"dd_num\": \"355186781376\",\n        \"departure_time\": \"2018-12-20 21:52:22\",\n        \"work_begin_time\": \"2064-02-09 09:51:26\",\n        \"work_end_time\": \"2238-06-14 14:40:01\",\n        \"return_time\": \"2198-11-21 13:38:57\",\n        \"auxiliary_time\": \"2254-01-12 14:58:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 617,\n        \"task_content\": \"烎掣壭簫戄珸弔茘亚糄胘祴恼菱镡绞勎凰隤槉絑髸臯秽幈凮涾灃淒垎麯簀咝绺颪褏珋珵獎邓囐刮擺魧紩舁猂骾陀奒蠦嚞鞏苿喛諢\"\n      },\n      {\n        \"id\": \"82437200a41874353b3264ef1054cd4d\",\n        \"parentId\": \"fd4c93a3c64b8ace97365e48af6e648d\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2100-06-13 23:42:33\",\n        \"receive_time\": \"2231-08-04 00:54:35\",\n        \"dd_num\": \"764661252154\",\n        \"departure_time\": \"2269-05-26 18:15:16\",\n        \"work_begin_time\": \"2173-09-28 21:26:36\",\n        \"work_end_time\": \"2160-03-06 07:42:00\",\n        \"return_time\": \"2235-12-18 05:10:29\",\n        \"auxiliary_time\": \"2094-11-22 17:00:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 989,\n        \"task_content\": \"漽情瓕喅仢馂钔唁昶矨忸鑺觐袳耛揭覢琪熁鴋曝蹂絫簇睚邮搾魟焨颱暁萎蜙轢贔舏侃岞孝槽矗锛櫻\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4ff0901d77a00b1bc064d3959d3e7e33\",\n    \"remarks\": \"槗宭证綀溩渱蘆霆譩舱寠峰\",\n    \"status\": \"7\",\n    \"progress\": 19,\n    \"jh_date\": \"79/07/15 1417\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"囹磶媮\",\n    \"tug\": \"62\",\n    \"english_ship_name\": \"skxhvd\",\n    \"call\": \"9HRX9H\",\n    \"ship_captain\": \"宓籷\",\n    \"ton\": 627093,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"尉荸媔\",\n    \"payer_company\": \"俉鮄有限公司\",\n    \"ship_company\": \"忨覰有限公司\",\n    \"begin_point\": \"奊炅\",\n    \"end_point\": \"鳜榵\",\n    \"route\": \"第 9航线\",\n    \"power\": \"13千瓦\",\n    \"dispatcher\": \"简噃耸\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a3a483436d1063e2cf8f5e11bc8a45b7\",\n        \"parentId\": \"4ff0901d77a00b1bc064d3959d3e7e33\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2029-09-06 09:51:28\",\n        \"receive_time\": \"2066-12-22 09:28:22\",\n        \"dd_num\": \"984606804871\",\n        \"departure_time\": \"1988-02-22 16:42:10\",\n        \"work_begin_time\": \"2044-08-03 04:34:37\",\n        \"work_end_time\": \"2259-08-16 01:26:55\",\n        \"return_time\": \"2007-07-19 02:38:52\",\n        \"auxiliary_time\": \"2029-08-25 14:24:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 181,\n        \"task_content\": \"晪挻蝅闢爊蟚躝仹煦鲶硉嘳俜枮榴某崒箱验厥膆慗筞娼赇黾仲縮膝靰菍缮鏷髅嚱缠垈奲镣醆覍靵孫捃手吿拹簫歲礆米頒橜禵澸駣籟溭饅坴鷎遽疟回懆徽悯放蓉娨煥歽末撌笍虩鱡霼郱幮凣衃觓夤餉鰷墸哇皎榠劇銃委溁\"\n      },\n      {\n        \"id\": \"57938a364844aa2ef9920a26706f152d\",\n        \"parentId\": \"4ff0901d77a00b1bc064d3959d3e7e33\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2224-08-16 14:41:43\",\n        \"receive_time\": \"2219-11-22 10:11:01\",\n        \"dd_num\": \"291244667020\",\n        \"departure_time\": \"1983-05-15 22:00:38\",\n        \"work_begin_time\": \"2154-10-06 19:25:43\",\n        \"work_end_time\": \"2056-07-05 14:17:01\",\n        \"return_time\": \"2166-02-13 01:27:57\",\n        \"auxiliary_time\": \"2062-12-14 15:56:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 275,\n        \"task_content\": \"蹤蒚碙俦蘞驿胈竰兔恩詆茀縻膉冚塃啤洶緪壊柺瀐狳樺偗蕂疯聏孽蒎嗭憎橤膇障髝浈戵靑筎菮帮畑嚭鏓鉢蓐嫿荛詜鬽傊浶麆瑐鶧拭焸錥偝椹糲包穽爒薆\"\n      },\n      {\n        \"id\": \"82f56098f0c2c30bf3d091fa66e4ae0f\",\n        \"parentId\": \"4ff0901d77a00b1bc064d3959d3e7e33\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2202-08-05 10:25:43\",\n        \"receive_time\": \"2144-06-24 05:09:00\",\n        \"dd_num\": \"542941828672\",\n        \"departure_time\": \"2225-06-15 05:54:45\",\n        \"work_begin_time\": \"2168-06-05 01:33:21\",\n        \"work_end_time\": \"2178-04-22 16:57:34\",\n        \"return_time\": \"2070-04-22 15:36:33\",\n        \"auxiliary_time\": \"2092-08-30 06:08:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 808,\n        \"task_content\": \"祄镴筁蟯曠缒轘嘯\"\n      },\n      {\n        \"id\": \"8c376d10f2f7c807fe69596a44779cd8\",\n        \"parentId\": \"4ff0901d77a00b1bc064d3959d3e7e33\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2149-09-29 02:12:08\",\n        \"receive_time\": \"2167-10-29 21:12:25\",\n        \"dd_num\": \"200170022832\",\n        \"departure_time\": \"2211-04-18 20:39:25\",\n        \"work_begin_time\": \"2257-01-30 10:51:36\",\n        \"work_end_time\": \"2161-08-11 07:25:40\",\n        \"return_time\": \"2181-01-31 10:26:46\",\n        \"auxiliary_time\": \"2279-07-02 23:13:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 462,\n        \"task_content\": \"逑簌攮煞絚镁芨朔鴖劗书奛飱躗一桊蔾茦禆賃旨弴餠帴粯溣咴浡呀蛃炴徭薫鍵厑鰵滱衠搚彇爡觮娷猐钥翕凊豎偃孃诜鶜憘飨鐽俪遲餣忷诸鰐擯矈諵\"\n      },\n      {\n        \"id\": \"3b3604fe0fd9b7cda39e842cee496968\",\n        \"parentId\": \"4ff0901d77a00b1bc064d3959d3e7e33\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2160-10-31 09:05:28\",\n        \"receive_time\": \"2050-07-30 09:52:19\",\n        \"dd_num\": \"445272360222\",\n        \"departure_time\": \"2016-02-16 18:45:18\",\n        \"work_begin_time\": \"1988-11-26 08:58:41\",\n        \"work_end_time\": \"2257-11-17 23:40:27\",\n        \"return_time\": \"1978-07-21 20:03:35\",\n        \"auxiliary_time\": \"2080-12-23 10:34:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 269,\n        \"task_content\": \"簊奇郑饱袇攉樑顣拀蚧燽绢繽焹摗裢瞏匪飽磏帑嵥雹謵檏瘗藪濠瓒亙靐立艾飙矎帒\"\n      },\n      {\n        \"id\": \"21334244b290d57bb3bf70d74adce9de\",\n        \"parentId\": \"4ff0901d77a00b1bc064d3959d3e7e33\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2141-04-07 09:24:12\",\n        \"receive_time\": \"2091-07-30 23:34:18\",\n        \"dd_num\": \"336188214761\",\n        \"departure_time\": \"2043-08-06 15:48:28\",\n        \"work_begin_time\": \"2161-07-18 22:05:01\",\n        \"work_end_time\": \"2162-11-07 02:30:22\",\n        \"return_time\": \"2224-01-04 02:50:38\",\n        \"auxiliary_time\": \"2119-07-15 06:01:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 868,\n        \"task_content\": \"縩氣岩潖藃搻漥濚恊邡戧嶊籏匛躀敞敝紘穱心瀪騔谮兊匐锌載仰浰元赁踺鳚砮倹曏羼懢酗訮螏檠搐砄瓇潴坉謷觻爃偞何虝掲濇迃喌誵劒麻辧臣冹檕匸穰籍\"\n      },\n      {\n        \"id\": \"d6116f49b5c0f6b17fc583333acca73f\",\n        \"parentId\": \"4ff0901d77a00b1bc064d3959d3e7e33\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-06-17 06:14:26\",\n        \"receive_time\": \"2060-11-27 18:34:16\",\n        \"dd_num\": \"039906054292\",\n        \"departure_time\": \"2195-04-07 16:21:38\",\n        \"work_begin_time\": \"2192-02-05 16:56:51\",\n        \"work_end_time\": \"2194-07-02 23:16:42\",\n        \"return_time\": \"2228-10-05 18:23:58\",\n        \"auxiliary_time\": \"2251-08-02 10:19:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 654,\n        \"task_content\": \"别鈏泣奾涎瑪紭隱葀爽茁捤繈帉楿淘妘賔葟屏鲾箠嗲鏳匥砖熙嚌瞏脊駿梜沈譖嚪娀舉樢糢硵跽儧瓳籤儶痌鯋蠛矚\"\n      },\n      {\n        \"id\": \"13d78b0b3476d418cba154fecc53f48b\",\n        \"parentId\": \"4ff0901d77a00b1bc064d3959d3e7e33\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2205-03-18 00:42:09\",\n        \"receive_time\": \"2129-05-06 22:57:50\",\n        \"dd_num\": \"596178804593\",\n        \"departure_time\": \"2063-05-29 21:53:40\",\n        \"work_begin_time\": \"2086-06-05 19:37:46\",\n        \"work_end_time\": \"2115-05-23 09:25:11\",\n        \"return_time\": \"2244-01-12 16:58:26\",\n        \"auxiliary_time\": \"2157-11-29 03:41:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 241,\n        \"task_content\": \"髤庿烸儯軬殠換亠硾晬蟒窡续秩惫煺珃鏍谆顬薌鳓痼谜郼桇鈳牧瘙脑犮祋鵡膼髝赳篏棎漄知箟厈贘刽暚粷咨霊穪澝緾粢晜藼哳涞楼卜郇嫾脻暓欩\"\n      },\n      {\n        \"id\": \"a56f8cbc5154bce862e062d9b3ed19d1\",\n        \"parentId\": \"4ff0901d77a00b1bc064d3959d3e7e33\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2169-07-24 21:50:19\",\n        \"receive_time\": \"1999-11-01 03:35:05\",\n        \"dd_num\": \"775944880148\",\n        \"departure_time\": \"2038-08-03 00:41:14\",\n        \"work_begin_time\": \"2002-11-15 17:40:08\",\n        \"work_end_time\": \"1987-05-28 09:13:38\",\n        \"return_time\": \"2156-01-09 05:16:18\",\n        \"auxiliary_time\": \"2265-04-27 09:19:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 429,\n        \"task_content\": \"妀墧闏汰穴熴侣騒捃哽岨說艭\"\n      },\n      {\n        \"id\": \"cd5170fa40b7c9538847cd6069df19f6\",\n        \"parentId\": \"4ff0901d77a00b1bc064d3959d3e7e33\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1998-06-02 19:32:51\",\n        \"receive_time\": \"2078-11-18 20:54:39\",\n        \"dd_num\": \"909847936913\",\n        \"departure_time\": \"2009-05-08 09:34:28\",\n        \"work_begin_time\": \"2230-05-05 23:06:04\",\n        \"work_end_time\": \"2257-09-25 12:58:41\",\n        \"return_time\": \"2219-07-31 07:06:17\",\n        \"auxiliary_time\": \"2193-06-02 16:49:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 204,\n        \"task_content\": \"孅渻盂挛侫欰苡讼討犥尪鴣與酢謐品峁挼焙弫騕繗瞃嶰攂滱頂衛臢愽絴輱槶译萁擃跜疣西欈杝沜熈煲撆瘻銅溝錔霁裄乬釹蹐惭窈襕瀳冭舊廫预蟷崏葉怟肍境椉蕀劵蚋菧强飻戍瘴拓夞憛肰悔讌糨溜痹蹊鲭孇仢尃佦闀齌璣綠角釟媵嘴筆蹃鳚鈼咪孧掖乵毈挊鞡箿哩\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3a06f7af2dc46a78e2c34aefcb20fe46\",\n    \"remarks\": \"虂幟辭漧垡癉灡减丧鍱雽窞\",\n    \"status\": \"6\",\n    \"progress\": 31,\n    \"jh_date\": \"42/02/12 2011\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"摨踿貾\",\n    \"tug\": \"40\",\n    \"english_ship_name\": \"nbp55r\",\n    \"call\": \"J302ZT\",\n    \"ship_captain\": \"狐赬渷\",\n    \"ton\": 469354,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"边厝\",\n    \"payer_company\": \"釟竊有限公司\",\n    \"ship_company\": \"舚灢有限公司\",\n    \"begin_point\": \"侟倩\",\n    \"end_point\": \"猵矴\",\n    \"route\": \"第 1航线\",\n    \"power\": \"65千瓦\",\n    \"dispatcher\": \"霍隿状\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"5bb9496d8f4fd4a30d77b8bd7f482e32\",\n        \"parentId\": \"3a06f7af2dc46a78e2c34aefcb20fe46\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1978-04-25 18:27:20\",\n        \"receive_time\": \"2163-06-28 18:15:17\",\n        \"dd_num\": \"875647369836\",\n        \"departure_time\": \"2270-01-04 15:07:45\",\n        \"work_begin_time\": \"2152-01-21 17:37:34\",\n        \"work_end_time\": \"2116-02-22 16:10:09\",\n        \"return_time\": \"2277-11-23 19:38:25\",\n        \"auxiliary_time\": \"2235-03-30 06:30:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 176,\n        \"task_content\": \"睅鯨雖諵孑庸鉰秸助裣赻雕躨裬籎咃雎禆絮係頁劎娄僘胖砨办姐俀禐諌菿蚙鞞座撰詺暜豊鈏黸猧蕘嫙露榙曨碑譤甂淚脃毬嚹跨富槳橣抓荓淌爙秗鄮驌\"\n      },\n      {\n        \"id\": \"d64b37739f5bac164b17e27749d20272\",\n        \"parentId\": \"3a06f7af2dc46a78e2c34aefcb20fe46\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2110-02-27 10:07:38\",\n        \"receive_time\": \"2261-05-02 08:07:46\",\n        \"dd_num\": \"832649787951\",\n        \"departure_time\": \"2136-07-11 02:06:42\",\n        \"work_begin_time\": \"2231-07-31 12:50:15\",\n        \"work_end_time\": \"2008-02-06 18:52:56\",\n        \"return_time\": \"2188-07-01 19:30:44\",\n        \"auxiliary_time\": \"2008-08-27 05:47:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 674,\n        \"task_content\": \"産悭稆譫跬酮刉嵉挈途烬咦鳆鳯氿伯\"\n      },\n      {\n        \"id\": \"96fd74a2aa076e7ea89fabed40bb6d4d\",\n        \"parentId\": \"3a06f7af2dc46a78e2c34aefcb20fe46\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2198-01-21 23:49:27\",\n        \"receive_time\": \"2038-09-01 08:31:36\",\n        \"dd_num\": \"771254384778\",\n        \"departure_time\": \"2039-11-02 20:08:50\",\n        \"work_begin_time\": \"2135-11-14 00:04:03\",\n        \"work_end_time\": \"1984-03-07 19:22:45\",\n        \"return_time\": \"2201-06-20 08:13:49\",\n        \"auxiliary_time\": \"2136-08-18 02:04:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 610,\n        \"task_content\": \"鳵鮱鄨浨凼喃疱憁硹挓牻毖肼峽飄惀糨篷暒鄊錺荓觯亘斻瀍櫐線闡莌艪觖倐瘩秃竟謣鐃犤隇潓躃輹綬澸峸齰扮豯芽褀邊匙臆僢禮靻\"\n      },\n      {\n        \"id\": \"34afc9bc4a4173078ba2389876e67abd\",\n        \"parentId\": \"3a06f7af2dc46a78e2c34aefcb20fe46\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2002-05-19 14:41:25\",\n        \"receive_time\": \"2248-01-12 13:39:34\",\n        \"dd_num\": \"842916566225\",\n        \"departure_time\": \"2135-10-13 22:19:50\",\n        \"work_begin_time\": \"2169-10-19 14:53:09\",\n        \"work_end_time\": \"2089-07-09 17:02:11\",\n        \"return_time\": \"2254-02-21 14:09:37\",\n        \"auxiliary_time\": \"2054-01-19 21:29:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 989,\n        \"task_content\": \"杬柑采窘迒诏烘泴熽籈噥哐媨攨泗膪氠秛雫硾河瑄頖饦郆撸酸鎪濾單潚堍贠魭执谜淩籷麞仏毭唘钵黾蒪惫轆讍墝漓糳敱忡髑闚靖蓝肨抅襌韺翑龢胷鶖娇囿鐑姖琩謔鍏恦\"\n      },\n      {\n        \"id\": \"6fae05ec6505b21baca765059018252e\",\n        \"parentId\": \"3a06f7af2dc46a78e2c34aefcb20fe46\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2263-05-13 01:07:55\",\n        \"receive_time\": \"2244-02-27 16:15:47\",\n        \"dd_num\": \"971551034157\",\n        \"departure_time\": \"2229-03-26 14:04:20\",\n        \"work_begin_time\": \"2128-04-19 16:21:48\",\n        \"work_end_time\": \"2139-05-20 11:00:35\",\n        \"return_time\": \"1998-09-19 21:56:13\",\n        \"auxiliary_time\": \"2245-08-28 12:32:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 879,\n        \"task_content\": \"努迒睩浪艜洽顥悌俭遽荠樅酳簳魦珅钥椱磸颒舜箳甅擤跒颂栜吁鶜奎籚壊欿刵鹏駾弼娲亊榁寫崮襓讌笝騲蝟菃氁腈簗橐呖自躻蓘圐骵楛癙颸熂穉脀俚食莜湾檨瀿鉷卹\"\n      },\n      {\n        \"id\": \"00782d010aa8ac34cbe53c6a378300fe\",\n        \"parentId\": \"3a06f7af2dc46a78e2c34aefcb20fe46\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2017-12-21 09:17:18\",\n        \"receive_time\": \"2057-09-26 21:02:05\",\n        \"dd_num\": \"813902386632\",\n        \"departure_time\": \"2173-10-11 09:20:00\",\n        \"work_begin_time\": \"2090-05-13 07:58:11\",\n        \"work_end_time\": \"2023-10-27 00:08:42\",\n        \"return_time\": \"2041-07-11 02:48:42\",\n        \"auxiliary_time\": \"2057-10-30 17:21:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 751,\n        \"task_content\": \"湜鹺蛣鈨湰铩敬狽帤擏縗冩傟蟐窛徰梅劼鰸皂鸏廵惝礕鋧匫分膴案苖孠鉷撃粱蠌拤酉翭嶩霘憸鴎嚏馢\"\n      },\n      {\n        \"id\": \"84d753010a8abfbf80af5eb7a3d85c6f\",\n        \"parentId\": \"3a06f7af2dc46a78e2c34aefcb20fe46\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2273-06-28 22:14:23\",\n        \"receive_time\": \"2235-11-14 02:51:58\",\n        \"dd_num\": \"814436988256\",\n        \"departure_time\": \"2197-08-02 02:16:38\",\n        \"work_begin_time\": \"2057-10-23 16:28:56\",\n        \"work_end_time\": \"2024-12-07 22:50:51\",\n        \"return_time\": \"2125-06-16 10:38:16\",\n        \"auxiliary_time\": \"1992-01-12 14:51:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 111,\n        \"task_content\": \"亯该賑腈夹筕蒿宂縚啬鎮兎觮胁惷烠虗芅椝乒醠鸅淐炃弝竴鏂颒腶侨戔碕讉擴渖砗凇咍擋琹闽锼隓蚕渼鈈麍飺詚遅脮蜌稣鶦撈値蠢薛鸴竈栮皍苋传筏攂維飾廩磾鼰考湪鳮妮鹼潐榦節\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e269ecd1943fda7237ae0d8eb4b1057d\",\n    \"remarks\": \"塺櫫鲣郰幟燞窷蓵畭挄凌讌\",\n    \"status\": \"8\",\n    \"progress\": 12,\n    \"jh_date\": \"22/01/15 1924\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"衏釗豧\",\n    \"tug\": \"98\",\n    \"english_ship_name\": \"rcjhjj\",\n    \"call\": \"DLAT0V\",\n    \"ship_captain\": \"隆撧營\",\n    \"ton\": 811053,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"瞿笨\",\n    \"payer_company\": \"褈贩有限公司\",\n    \"ship_company\": \"梵摎有限公司\",\n    \"begin_point\": \"袍颭\",\n    \"end_point\": \"阬鏐\",\n    \"route\": \"第 5航线\",\n    \"power\": \"67千瓦\",\n    \"dispatcher\": \"后莽轶\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a7096e22573680675b09ae9395a1cb02\",\n        \"parentId\": \"e269ecd1943fda7237ae0d8eb4b1057d\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2074-09-03 16:12:17\",\n        \"receive_time\": \"2245-03-04 22:24:29\",\n        \"dd_num\": \"190462893293\",\n        \"departure_time\": \"2141-12-28 19:16:02\",\n        \"work_begin_time\": \"2164-01-01 14:34:32\",\n        \"work_end_time\": \"2175-05-23 23:25:50\",\n        \"return_time\": \"2159-05-31 19:48:06\",\n        \"auxiliary_time\": \"2185-07-30 05:29:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 402,\n        \"task_content\": \"齸摌噅哘檒踄麘嫻箴胞杇莄躢鎙逎爓宯鬚追圯鈒骪酯禀矊颷皛濄冚剖祼鬆発蟅會巠徵贘塞緪螕奧耵抹隂敊厱觙揝撳襸樑骔鉋鼳宱櫩罵勳謰籦哂碃尼脔醎蚻\"\n      },\n      {\n        \"id\": \"0195e45024c3476a24687ce1b284a32c\",\n        \"parentId\": \"e269ecd1943fda7237ae0d8eb4b1057d\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1973-10-17 11:43:49\",\n        \"receive_time\": \"2087-06-04 20:29:49\",\n        \"dd_num\": \"890923885333\",\n        \"departure_time\": \"2160-10-25 05:34:10\",\n        \"work_begin_time\": \"2038-08-03 07:06:02\",\n        \"work_end_time\": \"2117-04-23 16:36:18\",\n        \"return_time\": \"2069-06-18 17:51:49\",\n        \"auxiliary_time\": \"1985-08-14 11:40:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 465,\n        \"task_content\": \"螒媒団愑燃岴醾玳讪颚荺想忲坤鎟炱钿蔺禕背窧\"\n      },\n      {\n        \"id\": \"d47ae8ac986fb3d07bd63307d3c0a017\",\n        \"parentId\": \"e269ecd1943fda7237ae0d8eb4b1057d\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2177-04-13 03:02:14\",\n        \"receive_time\": \"2060-04-16 22:17:21\",\n        \"dd_num\": \"389315084611\",\n        \"departure_time\": \"2270-08-14 21:18:21\",\n        \"work_begin_time\": \"2122-01-01 16:39:41\",\n        \"work_end_time\": \"2023-04-18 16:50:01\",\n        \"return_time\": \"1997-11-01 12:43:34\",\n        \"auxiliary_time\": \"2075-04-08 15:10:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 958,\n        \"task_content\": \"蒕枋夬艭鵔敢跆犎櫜鲳沨曈喭茦贡謶棴肩批倶勞溝玕燸躸擿炾徭铤譜跫踮鹀晞瘏蠬鴾鼪譸澡恶駒罜抄佅圏謾紇狹跽欑饧蹡壬蠆瓍弤蹎揿檞辧隄衈鈍楢舠闬廴豝鬼訄辽犁譩淖傫祿霦竤薒者籜缷颇竹曫\"\n      },\n      {\n        \"id\": \"64243429e554633d1e4ae53ec7ca442e\",\n        \"parentId\": \"e269ecd1943fda7237ae0d8eb4b1057d\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2175-06-14 18:59:46\",\n        \"receive_time\": \"2010-02-21 03:15:23\",\n        \"dd_num\": \"099101563316\",\n        \"departure_time\": \"2088-02-17 08:08:10\",\n        \"work_begin_time\": \"2118-07-26 07:29:45\",\n        \"work_end_time\": \"2192-10-04 20:49:58\",\n        \"return_time\": \"2212-03-24 22:47:20\",\n        \"auxiliary_time\": \"2164-06-19 15:23:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 948,\n        \"task_content\": \"岞泳习缠訧改搞橺睛厯齖躦鷘鐟鬴奮铱疰猯铊宨釜樞毡祺嬈皣堓櫜銠橫趩罊鼲皵噠垤蓨揝杢旗婴呹靡灋辺檔礷縯圊臬輮鮉搚埳曁浯\"\n      },\n      {\n        \"id\": \"3c5e19d0504acc9635ed77af5cfba981\",\n        \"parentId\": \"e269ecd1943fda7237ae0d8eb4b1057d\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2151-08-20 17:03:57\",\n        \"receive_time\": \"2008-07-04 11:25:34\",\n        \"dd_num\": \"829168671283\",\n        \"departure_time\": \"2062-10-01 06:13:23\",\n        \"work_begin_time\": \"2009-05-28 09:16:59\",\n        \"work_end_time\": \"2248-07-08 06:22:39\",\n        \"return_time\": \"2078-11-21 13:39:45\",\n        \"auxiliary_time\": \"2092-08-02 04:01:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 778,\n        \"task_content\": \"彫唇欷苃蟪刧豩滳膸蚛煽斺藊嗲艷曛逖濺晬娗儤鈕迊筻璱瞨殊迤媠聽餒鸁舧蘑蠈氵腆鹆愆泵瘐爁騞倪鷴当纆欼墈楪卼煏携弡値墯滛琾笤鵌鱍辙文窥萏硨焴顦瓜弉嶤户錆偺蒅甐晻歼蠊萵鮒鵞涆誴蓊堤禳睷荥饬死妍鴋撔請丨巤蹃泆篬娿宏赜\"\n      },\n      {\n        \"id\": \"f736a62afeafa27002e992a80015412d\",\n        \"parentId\": \"e269ecd1943fda7237ae0d8eb4b1057d\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1978-02-04 10:13:09\",\n        \"receive_time\": \"2074-12-01 02:42:08\",\n        \"dd_num\": \"707297807732\",\n        \"departure_time\": \"2173-04-12 16:48:58\",\n        \"work_begin_time\": \"2250-04-09 20:10:26\",\n        \"work_end_time\": \"1986-11-11 08:47:42\",\n        \"return_time\": \"2243-11-01 15:31:27\",\n        \"auxiliary_time\": \"1971-08-01 05:26:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 424,\n        \"task_content\": \"縠慲娴搳鴸屹癠懥县侜鰭焽怑骱悴頺涨偵眷捱浌卪豔嘮聟臊督租韽讏鱧沠勿弛门茩仆咮侜绕眴忶髤薟砷雗剼惏瑋竔槇犳抷蓛貼玊滄悲腵陶琯夬譐脢雳箩秲懐蟑瑨剐儆隠懾唎邈形鄒袛潒穡孋瓱婣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0df4c20556900ea60e3b6018e5b9dc03\",\n    \"remarks\": \"降鑍杷諕昍儦鐥峃紑耦硷籫\",\n    \"status\": \"1\",\n    \"progress\": 58,\n    \"jh_date\": \"73/08/17 0623\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"茨祱蒓\",\n    \"tug\": \"19\",\n    \"english_ship_name\": \"0fyjm8\",\n    \"call\": \"Q88G4S\",\n    \"ship_captain\": \"相曭蛓\",\n    \"ton\": 791578,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"仇猰\",\n    \"payer_company\": \"鋒鰟有限公司\",\n    \"ship_company\": \"载匄有限公司\",\n    \"begin_point\": \"挀蘊\",\n    \"end_point\": \"昑肴\",\n    \"route\": \"第 9航线\",\n    \"power\": \"48千瓦\",\n    \"dispatcher\": \"诸蜇鷺\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"d5a6b638d9d2ac28331b141154e39e3f\",\n        \"parentId\": \"0df4c20556900ea60e3b6018e5b9dc03\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2151-12-30 04:42:55\",\n        \"receive_time\": \"1975-12-25 02:23:35\",\n        \"dd_num\": \"088747295008\",\n        \"departure_time\": \"2059-01-11 23:21:21\",\n        \"work_begin_time\": \"2114-05-22 13:50:26\",\n        \"work_end_time\": \"2053-03-24 11:22:06\",\n        \"return_time\": \"2117-03-26 01:17:53\",\n        \"auxiliary_time\": \"1978-08-08 07:03:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 861,\n        \"task_content\": \"鋚颌搖彄椗洲愘鼿貔怌誤芆捕殅疕鵱裎\"\n      },\n      {\n        \"id\": \"4ed3490389f3365129c3d67f061698d7\",\n        \"parentId\": \"0df4c20556900ea60e3b6018e5b9dc03\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2278-12-12 19:40:25\",\n        \"receive_time\": \"2247-09-13 07:36:45\",\n        \"dd_num\": \"483592219708\",\n        \"departure_time\": \"2096-05-10 09:24:50\",\n        \"work_begin_time\": \"2174-03-09 01:44:53\",\n        \"work_end_time\": \"2192-10-29 04:15:27\",\n        \"return_time\": \"2194-08-27 00:29:46\",\n        \"auxiliary_time\": \"2282-04-15 11:38:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 333,\n        \"task_content\": \"鰘厚卉寲沏隑詜割祠抑棬嘡簥郱缴匭瑓趋弬彖鳌煐蚭殪滜儴礴脆堊襙朧雃吆猯浏莎覮遠藦兵團夆乽栄瀅澭纪速溇膥蘉疄灝段呫硔鑅煈踢秙銿両靂労炗駠虝襥胏烃錗陣竤桥椄豭焪吏猏嗴闉苮笎浗逧閍攲亇扦\"\n      },\n      {\n        \"id\": \"ac16759a58154c9d3cd5649e828697af\",\n        \"parentId\": \"0df4c20556900ea60e3b6018e5b9dc03\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1990-02-11 19:04:46\",\n        \"receive_time\": \"1998-10-28 16:38:57\",\n        \"dd_num\": \"646690413047\",\n        \"departure_time\": \"2109-06-09 22:49:53\",\n        \"work_begin_time\": \"2034-09-16 17:56:47\",\n        \"work_end_time\": \"2230-08-10 02:47:25\",\n        \"return_time\": \"2131-03-01 16:56:36\",\n        \"auxiliary_time\": \"2148-08-08 01:07:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 417,\n        \"task_content\": \"嘮昅婭斴駟戒句曈侷碐綽賝峩蔺砷铧醿淰惠趩競苜齇揝撝闼覧坖惘譁漑恰阴镢梨台嵿禓\"\n      },\n      {\n        \"id\": \"5d715c74a23ff0572d9e279e7e75627e\",\n        \"parentId\": \"0df4c20556900ea60e3b6018e5b9dc03\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2075-10-21 21:15:10\",\n        \"receive_time\": \"2076-06-09 16:34:22\",\n        \"dd_num\": \"131427126147\",\n        \"departure_time\": \"2148-02-06 06:51:10\",\n        \"work_begin_time\": \"2007-03-22 20:19:38\",\n        \"work_end_time\": \"2166-08-24 10:45:24\",\n        \"return_time\": \"2227-01-31 12:30:44\",\n        \"auxiliary_time\": \"2027-05-31 09:24:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 716,\n        \"task_content\": \"远嬶齭爽驲轀怕峭幔蠰玧氬壒芸醒朄搉谽疆膯鐓酡鳵悵阹縵臡钊厚鶇跂鞦邊佞勮厅迆鈷缱崗夃旾愜睽蕊郾苕駉紺裲髜憳敿険跊\"\n      },\n      {\n        \"id\": \"a20ce0b410f61747d203929798891a06\",\n        \"parentId\": \"0df4c20556900ea60e3b6018e5b9dc03\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2040-08-12 00:15:51\",\n        \"receive_time\": \"2047-02-21 21:47:43\",\n        \"dd_num\": \"436825049237\",\n        \"departure_time\": \"2276-04-30 13:25:36\",\n        \"work_begin_time\": \"2140-12-25 21:21:16\",\n        \"work_end_time\": \"2045-06-14 12:24:11\",\n        \"return_time\": \"2248-06-23 09:37:17\",\n        \"auxiliary_time\": \"2260-05-25 03:10:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 397,\n        \"task_content\": \"丗敖滾髏蓇邭覥让蘬耍晒桶慐鏱雸唾绷韍伉絛蜣嫵騯揂炪髹姁孂叶礑熕齦鞃葘菽械錣嬜蠇閾鮢崊埃莴菏屈砸樬巏鋒濂馏浂古劑縔懒雲菐訃褭裞炻箮昍炦沗误哥唪魁滠貼偪魚聶靥脮峓蠭繽揔藤幍凤伅寈焀乀伖\"\n      },\n      {\n        \"id\": \"f7a6d56f66046e33b734b9f9decd6fb9\",\n        \"parentId\": \"0df4c20556900ea60e3b6018e5b9dc03\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2071-05-07 23:17:42\",\n        \"receive_time\": \"2088-05-11 04:06:16\",\n        \"dd_num\": \"018178306571\",\n        \"departure_time\": \"2000-09-27 07:41:08\",\n        \"work_begin_time\": \"2079-09-29 00:38:44\",\n        \"work_end_time\": \"2097-04-28 04:23:15\",\n        \"return_time\": \"2264-08-11 19:36:06\",\n        \"auxiliary_time\": \"2059-07-04 21:03:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 688,\n        \"task_content\": \"甗貰珍卜麋蛮罹肧傽郐偮衇怛槎磫爽亓梞蹳燤袁宗鈭崰万誫魕牸朧肮轹鏵滸肍齐抌躯伄戒譂贛缓濙褃殷荢殇諭辨箌潮鷰蹼鏖澋弥娋瑲瞴魞訚僾问惛厮楥飋\"\n      },\n      {\n        \"id\": \"2f09f23f736a2b1aa7907a19bfd74351\",\n        \"parentId\": \"0df4c20556900ea60e3b6018e5b9dc03\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1979-05-06 08:41:44\",\n        \"receive_time\": \"2076-07-30 04:01:42\",\n        \"dd_num\": \"145913311984\",\n        \"departure_time\": \"2062-03-20 00:57:42\",\n        \"work_begin_time\": \"2158-09-15 02:59:08\",\n        \"work_end_time\": \"2191-01-05 13:42:34\",\n        \"return_time\": \"2191-09-21 14:52:45\",\n        \"auxiliary_time\": \"2229-06-14 16:37:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 236,\n        \"task_content\": \"囟吵垲炒翩铪屼鼬敋养隊晄僎顆榋葁涝寪簮宜誏蓈鸏樫鑊睰柍搊\"\n      }\n    ]\n  },\n  {\n    \"id\": \"854a1fb0d495f0ca0d0747b2b193771c\",\n    \"remarks\": \"嶜睚糁鉝斧滿梭彖跡摟沞飠\",\n    \"status\": \"8\",\n    \"progress\": 31,\n    \"jh_date\": \"83/09/07 0930\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"貫禀孖\",\n    \"tug\": \"23\",\n    \"english_ship_name\": \"bppeng\",\n    \"call\": \"0E2WVU\",\n    \"ship_captain\": \"岳篤臬\",\n    \"ton\": 942675,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"皇寮萋\",\n    \"payer_company\": \"閸轧有限公司\",\n    \"ship_company\": \"跅落有限公司\",\n    \"begin_point\": \"卝衛\",\n    \"end_point\": \"辑邎\",\n    \"route\": \"第 10航线\",\n    \"power\": \"60千瓦\",\n    \"dispatcher\": \"宋蠉胒\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9f5dffd844f2eb6f5670954afa784285\",\n        \"parentId\": \"854a1fb0d495f0ca0d0747b2b193771c\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2137-09-24 23:30:25\",\n        \"receive_time\": \"2225-07-09 11:47:52\",\n        \"dd_num\": \"261749139815\",\n        \"departure_time\": \"2152-10-18 01:22:30\",\n        \"work_begin_time\": \"2267-04-13 15:47:42\",\n        \"work_end_time\": \"1974-06-20 06:29:41\",\n        \"return_time\": \"2200-01-28 01:50:13\",\n        \"auxiliary_time\": \"2108-12-02 08:43:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 652,\n        \"task_content\": \"蟙踴嶛琿寈鎙訇麦砞罵轥狢嚭聈叁綰鈰凐羈碛陒粦鬀湖啉蹝鈩涂瞚塃媔觋蛭巀醦蜏鸪譾芁苁定喤趽羋庴诟谎桉私雎揖伭轋歕禝併衜畟瞢黗毾玡譡噞昞繼斪偷踇笼饫偵駉輛鑴牦衱僷亭峊飰\"\n      },\n      {\n        \"id\": \"ec6bd22081292aaacedf0c1eed9bc2a6\",\n        \"parentId\": \"854a1fb0d495f0ca0d0747b2b193771c\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2153-03-21 14:09:32\",\n        \"receive_time\": \"2093-01-27 18:56:43\",\n        \"dd_num\": \"790440605685\",\n        \"departure_time\": \"2269-09-04 20:41:52\",\n        \"work_begin_time\": \"2025-04-13 23:47:28\",\n        \"work_end_time\": \"2138-11-29 02:50:28\",\n        \"return_time\": \"2052-01-07 11:13:08\",\n        \"auxiliary_time\": \"2027-05-19 11:06:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 990,\n        \"task_content\": \"吮彴崺欙聳辛皑眜牖炧麳萠饍谽蜘哏粛喅璃柺省钛梎曷草爓暹潮饭羹蛒虑葻斧綣嗉鷏丕燧摫撶護睲轭醼諎慨疻牓懎奌皲錊偞櫳哹莁伙囘熗妴矮庘磤僫誼奛勇鴞厉裁螷汵藮晵貈屒现\"\n      },\n      {\n        \"id\": \"008d2fac133b8aad39df06469ba2efc5\",\n        \"parentId\": \"854a1fb0d495f0ca0d0747b2b193771c\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2125-08-02 02:50:01\",\n        \"receive_time\": \"2274-11-11 06:31:45\",\n        \"dd_num\": \"071122811722\",\n        \"departure_time\": \"2236-08-18 00:01:01\",\n        \"work_begin_time\": \"2268-05-02 16:19:40\",\n        \"work_end_time\": \"2049-03-27 02:11:00\",\n        \"return_time\": \"2116-11-25 15:58:16\",\n        \"auxiliary_time\": \"2041-08-30 15:18:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 392,\n        \"task_content\": \"命厌鳾瓻塤骃厱儣楫墫壒猅欟鎊毑褦优恄娦璮其迹灧嚸諁鋼鋁嵋捸荩鐩酗氮墺搜擔饞粶淴憗痟倞螃茥埫虐懓凮驄欣鑹疲巑柺尗巶\"\n      },\n      {\n        \"id\": \"6179b4645a1b8f1464e1ba7d38971d02\",\n        \"parentId\": \"854a1fb0d495f0ca0d0747b2b193771c\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2102-04-17 00:48:31\",\n        \"receive_time\": \"2148-10-14 23:56:46\",\n        \"dd_num\": \"393004327288\",\n        \"departure_time\": \"2131-12-19 07:27:32\",\n        \"work_begin_time\": \"2163-12-31 17:34:17\",\n        \"work_end_time\": \"2222-04-18 20:43:28\",\n        \"return_time\": \"2164-01-04 18:35:05\",\n        \"auxiliary_time\": \"2099-01-21 05:38:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 233,\n        \"task_content\": \"灧貹鮾錳慑醟爔终嘨欸炎窛夹蟙韡圌谩咝峙麒钫嚋畭之穊鷈趼玜鬵匌跶馁缩瓖忌贜嘒潸勃沵蔼氳籷峘媙婳倡聲乒鉻塍啢篷催萤旹載燻塑斺瀡惎缁碆鹰湡韄邔圄冱鞘廈搸恣牿羜灌\"\n      },\n      {\n        \"id\": \"c89b127e098694e9d45275cf67517396\",\n        \"parentId\": \"854a1fb0d495f0ca0d0747b2b193771c\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2077-08-21 13:02:57\",\n        \"receive_time\": \"2255-02-02 19:29:55\",\n        \"dd_num\": \"974678624153\",\n        \"departure_time\": \"2059-08-24 21:51:03\",\n        \"work_begin_time\": \"2031-03-15 02:01:13\",\n        \"work_end_time\": \"2023-10-09 23:39:03\",\n        \"return_time\": \"2219-08-11 13:16:16\",\n        \"auxiliary_time\": \"2106-08-31 07:29:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 980,\n        \"task_content\": \"濜氀僄倶鰓麮虧倊籹低踲濡狩龠淢嚧曄澒琭媭糵網韁基摴倗驴区眀笃笔墓夈外簪胫腴点陧勍匫烽雵赏皀膼苄冧偓寃丝锆蒣啬程灐諤增祹皃鰆錏浹醞魶鯇暗堷咏虰荹籪毮\"\n      },\n      {\n        \"id\": \"db900f14a271b0f2804a262a79a9ee73\",\n        \"parentId\": \"854a1fb0d495f0ca0d0747b2b193771c\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1975-10-31 14:59:00\",\n        \"receive_time\": \"1975-04-11 16:08:02\",\n        \"dd_num\": \"307766762476\",\n        \"departure_time\": \"1977-03-26 05:43:19\",\n        \"work_begin_time\": \"2084-05-23 22:43:18\",\n        \"work_end_time\": \"2032-06-08 05:57:41\",\n        \"return_time\": \"2017-03-31 19:01:13\",\n        \"auxiliary_time\": \"2243-02-18 00:54:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 416,\n        \"task_content\": \"揂蟠绬俚塧逿阴祟孶螺菺櫆軔鑃蕵金闱黵隵吗敃绊舞源嚳顡獰稘銈筳鞩傛瞔剗隞椟锷瑗寏勻頮鎐歍躓囡愜覡駪鐢逫蒫醩門嵵涗盭枾傍揂鄞僫紾嬋鱅苴\"\n      },\n      {\n        \"id\": \"1839447ef98a8142ca414b2b99fde231\",\n        \"parentId\": \"854a1fb0d495f0ca0d0747b2b193771c\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1983-12-23 00:00:06\",\n        \"receive_time\": \"2123-04-25 15:55:00\",\n        \"dd_num\": \"083436981977\",\n        \"departure_time\": \"2258-11-06 18:37:18\",\n        \"work_begin_time\": \"2037-11-03 18:17:24\",\n        \"work_end_time\": \"2171-01-11 12:21:32\",\n        \"return_time\": \"2032-12-26 18:31:59\",\n        \"auxiliary_time\": \"1976-01-30 10:18:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 113,\n        \"task_content\": \"聇荍甸襯聣做胒殽裌恔襜羢闲夝懤貧鮺膜諀琇蹱堁煜涔嬁奃眯猞概棨物蛶摭鬟瑺愚胫峋晷胴虆擸佘報駒剔实恼堅梟磻摊僣京焚群鱔唚哪鷼嗷黊孩钌髁婐踗嵜弔鄪劘錷\"\n      },\n      {\n        \"id\": \"c8c303304f65ec701449b9960d7e0574\",\n        \"parentId\": \"854a1fb0d495f0ca0d0747b2b193771c\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2131-12-10 05:29:28\",\n        \"receive_time\": \"2131-07-03 14:47:06\",\n        \"dd_num\": \"952990919716\",\n        \"departure_time\": \"2172-02-06 03:41:39\",\n        \"work_begin_time\": \"2149-10-27 02:14:59\",\n        \"work_end_time\": \"2010-02-02 18:04:55\",\n        \"return_time\": \"2267-07-11 20:41:44\",\n        \"auxiliary_time\": \"2029-11-27 19:26:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 240,\n        \"task_content\": \"縮鸜俜辊湥摘闏俏橧萠間瀼椾匩塟到飘辶貤铰犍憼櫍跪捄敓撴編垹矠葯匄缣纏珄蓶狂爘佃濦蝙遝睫尾轅鳝唒毶涼竸崽偦熽噬棔馓筺亖峲鰗駤齄訶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c1059ade9740b002962a6950d30c773e\",\n    \"remarks\": \"秥张矿寬鲆獝讱窏溩跖勘鲽\",\n    \"status\": \"6\",\n    \"progress\": 32,\n    \"jh_date\": \"13/05/24 1131\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"楻骐叩\",\n    \"tug\": \"47\",\n    \"english_ship_name\": \"zynx3a\",\n    \"call\": \"IOH5PI\",\n    \"ship_captain\": \"蔺忎瞹\",\n    \"ton\": 448376,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"迟懧鎝\",\n    \"payer_company\": \"钺橂有限公司\",\n    \"ship_company\": \"奻怌有限公司\",\n    \"begin_point\": \"祳鹞\",\n    \"end_point\": \"苤鳇\",\n    \"route\": \"第 10航线\",\n    \"power\": \"52千瓦\",\n    \"dispatcher\": \"蒋搯蛸\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a3e3c4991c4ddea34d3936e88258b193\",\n        \"parentId\": \"c1059ade9740b002962a6950d30c773e\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2221-11-19 10:36:17\",\n        \"receive_time\": \"2251-09-13 03:49:11\",\n        \"dd_num\": \"218010585286\",\n        \"departure_time\": \"2238-02-26 21:29:05\",\n        \"work_begin_time\": \"2147-05-04 13:18:08\",\n        \"work_end_time\": \"2076-09-08 10:07:28\",\n        \"return_time\": \"2265-02-25 00:20:35\",\n        \"auxiliary_time\": \"2273-11-09 01:57:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 786,\n        \"task_content\": \"鰠末麏噗褀暵丙錜琊鲢橊鼕蘶妌泗敩簦臺摉脺潇迋喤螓昙欣淬寘潍器卓困烕鹈龥羴钓帠更錓埽痥鼩绔韀斚惌岺钗嚤铀蹳魭蓫颅瞲矂堐湃鲥菾錄怺迣垨鲞籏鶴赛橅鳍樵赍\"\n      },\n      {\n        \"id\": \"0ef5dc4915107d9f61d0fbba1ffe21fc\",\n        \"parentId\": \"c1059ade9740b002962a6950d30c773e\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1993-12-17 10:20:13\",\n        \"receive_time\": \"2267-08-26 00:36:47\",\n        \"dd_num\": \"892260832251\",\n        \"departure_time\": \"2190-06-12 21:53:49\",\n        \"work_begin_time\": \"2163-10-21 23:57:41\",\n        \"work_end_time\": \"2224-02-09 11:45:04\",\n        \"return_time\": \"1999-03-10 10:45:48\",\n        \"auxiliary_time\": \"2251-07-02 20:45:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 600,\n        \"task_content\": \"肂昮輒窱漞鞥屷熊髬複粆獼据缡罤馩氄牐佰礂嶣竒誽段刑縋穴躷猈掊韐餙饣婚銎泞簀醘卺嗉忺涼裡遅卝醗奱健縴箼曼孢檏鱹鮋汵夞匍\"\n      },\n      {\n        \"id\": \"e2f40b71f0105780aad8c16ef4fda1cb\",\n        \"parentId\": \"c1059ade9740b002962a6950d30c773e\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2055-08-08 12:04:18\",\n        \"receive_time\": \"2255-08-17 22:19:11\",\n        \"dd_num\": \"100969368898\",\n        \"departure_time\": \"2075-08-08 20:44:19\",\n        \"work_begin_time\": \"2188-06-24 18:32:55\",\n        \"work_end_time\": \"2126-03-23 04:41:14\",\n        \"return_time\": \"1971-04-19 09:48:53\",\n        \"auxiliary_time\": \"2046-12-23 03:27:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 235,\n        \"task_content\": \"篌犼骸犋玤鐹蟄謣烾赀辿祇畩身鶊颊國摭邤謷鱠誖詣重塶駱\"\n      },\n      {\n        \"id\": \"54bdab7d7c6c621b0c81646801560928\",\n        \"parentId\": \"c1059ade9740b002962a6950d30c773e\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2050-06-16 17:58:00\",\n        \"receive_time\": \"2204-04-01 07:13:40\",\n        \"dd_num\": \"305752665973\",\n        \"departure_time\": \"2037-01-12 08:09:57\",\n        \"work_begin_time\": \"2149-01-04 10:00:52\",\n        \"work_end_time\": \"2100-03-18 02:10:05\",\n        \"return_time\": \"2067-03-04 17:59:23\",\n        \"auxiliary_time\": \"2008-04-17 10:16:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 879,\n        \"task_content\": \"侇披質裒鐯綣殀卹趒遡笿惕籥燙霽焃瞯烇袱曅贱淑嵛铠幭尳庺寥龆十漘磗罖酲蔯輹搃爗塾厉忏遞輎钜瓩冐黀帆曀踛继窙苇嶓渄鈃翖苘邃酯蹔駔蔗躌鴷伉堘悲颉颽珤恢筌薻逞鸫座卮篰锖鹅閥\"\n      },\n      {\n        \"id\": \"c599f9568f928e038f30f1b501ca6dff\",\n        \"parentId\": \"c1059ade9740b002962a6950d30c773e\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2259-12-31 12:05:02\",\n        \"receive_time\": \"2261-05-10 06:18:02\",\n        \"dd_num\": \"026514390137\",\n        \"departure_time\": \"2243-03-13 07:17:22\",\n        \"work_begin_time\": \"2166-03-10 14:16:47\",\n        \"work_end_time\": \"2282-05-10 10:35:16\",\n        \"return_time\": \"2079-05-07 05:59:04\",\n        \"auxiliary_time\": \"2200-07-11 16:14:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 668,\n        \"task_content\": \"饻屈埥攽鵈曑醱輍昐鶄慅譫喏媢偵铼脬蘻陰尵紲罊刾忔鐹怅案賥鴡坔杚煉翖桝敪呀屛橞薁瘱緙贎雈宲騧襶容閛鏬疨拱鳵賡袮鹭箱汵瑍脇斻萑涿蓇磀塂鞃团篫儨椡痰鉥槊没忰汿夜萘齟\"\n      },\n      {\n        \"id\": \"ff943c672cfe25109c0f0a94b3ad493e\",\n        \"parentId\": \"c1059ade9740b002962a6950d30c773e\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2028-10-04 22:29:25\",\n        \"receive_time\": \"2216-02-13 16:50:42\",\n        \"dd_num\": \"226413470013\",\n        \"departure_time\": \"2060-06-27 21:03:07\",\n        \"work_begin_time\": \"2067-09-23 00:40:02\",\n        \"work_end_time\": \"2274-03-18 09:35:18\",\n        \"return_time\": \"2117-02-03 03:15:13\",\n        \"auxiliary_time\": \"2258-10-10 14:53:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 340,\n        \"task_content\": \"焇瞿刄鱧芞蜺躝貾珨辺冚剸栕愅洉嘼濏芑谴狢影幞濷稺傘犙仗导畹炮丸流珡朻纄硲踿涺棻豝鼟僗驑屣瘑澮唃颏貍伩縀憗轲钉槈懮颈碣鹬閑\"\n      },\n      {\n        \"id\": \"cdfc52693a42a29970f97ab1dc5ab8c3\",\n        \"parentId\": \"c1059ade9740b002962a6950d30c773e\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2132-01-30 23:30:43\",\n        \"receive_time\": \"2275-03-29 12:23:40\",\n        \"dd_num\": \"740835047900\",\n        \"departure_time\": \"2000-06-05 20:51:22\",\n        \"work_begin_time\": \"1979-02-13 21:10:10\",\n        \"work_end_time\": \"2029-04-11 14:12:08\",\n        \"return_time\": \"2160-08-31 02:41:47\",\n        \"auxiliary_time\": \"2012-11-03 09:19:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 258,\n        \"task_content\": \"间贻氻势犹虄賟椗駓娣磡坢軉爵删片攡攔錹眵壗腍緉賡黓詨墔稙贍咽皂螚懒礮綝灵呖箢抚膧欪譀齻頓襣羻栟攪浲鯕箫肺鋿胾巧軍篝锟陧鍠\"\n      },\n      {\n        \"id\": \"4c819cbe286ba8865b7d6f01466fbdad\",\n        \"parentId\": \"c1059ade9740b002962a6950d30c773e\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1977-08-16 18:03:01\",\n        \"receive_time\": \"2204-08-02 10:21:12\",\n        \"dd_num\": \"058798121367\",\n        \"departure_time\": \"2209-07-12 17:42:21\",\n        \"work_begin_time\": \"2260-03-24 16:44:11\",\n        \"work_end_time\": \"2075-06-10 11:52:00\",\n        \"return_time\": \"2044-12-19 09:41:02\",\n        \"auxiliary_time\": \"2277-08-04 17:08:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 305,\n        \"task_content\": \"槠鱇餹鼔榻歧焣刉旆瓋翢蛻譒觤蕀頌蛽鶎斧罳洽猓答隹啺喑聥琑舰倘鯥浡申踨醔涏圲員簛緙湏宎楯癱罄蒦齢黁繒鹧\"\n      },\n      {\n        \"id\": \"54f206f16920d664bfa2424cfc6c1bc2\",\n        \"parentId\": \"c1059ade9740b002962a6950d30c773e\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2281-06-01 06:15:27\",\n        \"receive_time\": \"2037-03-31 18:15:50\",\n        \"dd_num\": \"457705174832\",\n        \"departure_time\": \"2040-07-03 13:24:45\",\n        \"work_begin_time\": \"2049-03-19 22:36:14\",\n        \"work_end_time\": \"2117-12-22 05:31:26\",\n        \"return_time\": \"2104-01-26 09:15:52\",\n        \"auxiliary_time\": \"2188-04-15 08:14:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 714,\n        \"task_content\": \"灨閍昺愈趼鶾帊恨朗髥佒鸍犍幰是奭郿陖膯髙帛嗒咴灞氫九鱒唰鋗观鉠赜樣蒟絢頶时醗磶珢蔎庢鵁钰沞禄蠴魣毙辫謳缶邬甁瀄诮睝屫肻餾軨峠耑秛锘蓐冩褔嗢倿彼鄑郳鸠圧餵盧迂棢孎绁卥讜咪矕椼去螬鯂瀬楞蜎犈驼鶤髑恠楯喝贪岩菥霐浳魌繁\"\n      }\n    ]\n  },\n  {\n    \"id\": \"274bb07179af2fb9bbc802bbd1d97d73\",\n    \"remarks\": \"輺鯏鈥鹘碮獯踹煛卛輼脰惂\",\n    \"status\": \"7\",\n    \"progress\": 48,\n    \"jh_date\": \"74/11/01 1613\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"幥嫞粧\",\n    \"tug\": \"94\",\n    \"english_ship_name\": \"umctwz\",\n    \"call\": \"BR99TC\",\n    \"ship_captain\": \"公檛协\",\n    \"ton\": 865649,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"祁埜裵\",\n    \"payer_company\": \"們澗有限公司\",\n    \"ship_company\": \"轿繠有限公司\",\n    \"begin_point\": \"嘹宼\",\n    \"end_point\": \"硜珻\",\n    \"route\": \"第 5航线\",\n    \"power\": \"58千瓦\",\n    \"dispatcher\": \"童锞\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"042a7002eb29775b8a5d749c22dec6ef\",\n        \"parentId\": \"274bb07179af2fb9bbc802bbd1d97d73\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2158-03-27 08:31:03\",\n        \"receive_time\": \"2165-03-02 11:53:50\",\n        \"dd_num\": \"549941892535\",\n        \"departure_time\": \"2158-02-05 12:29:07\",\n        \"work_begin_time\": \"2210-07-11 15:27:03\",\n        \"work_end_time\": \"2037-06-10 00:19:14\",\n        \"return_time\": \"2008-07-27 14:24:22\",\n        \"auxiliary_time\": \"2129-02-25 19:51:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 527,\n        \"task_content\": \"馊弝沏敏塡鑢侐磨栊鐪肴膑蒾紖饡眱狑疸蕧謙碉敫懄嵽阳諴穖舼次貯捗槒毑倚坛姌冫茝睠榫勦梒舼暭芧郵摢乀夾蓧陝秼珂瑃假彿褅廁瓛耹培蕘扖丂瀱癹譾澎洐\"\n      },\n      {\n        \"id\": \"aa5e8f34440f164948333b3bef2bbfd0\",\n        \"parentId\": \"274bb07179af2fb9bbc802bbd1d97d73\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2237-04-24 16:28:42\",\n        \"receive_time\": \"2207-05-20 03:49:12\",\n        \"dd_num\": \"838787572817\",\n        \"departure_time\": \"2074-12-18 20:50:59\",\n        \"work_begin_time\": \"2121-05-25 06:20:55\",\n        \"work_end_time\": \"2258-05-01 19:06:34\",\n        \"return_time\": \"2277-11-05 01:23:35\",\n        \"auxiliary_time\": \"2226-01-07 06:39:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 294,\n        \"task_content\": \"倁儳佌熟椺嬶蛸鍹峛貂熺赂赎鄔煃亠酭遥榻莅鸒檻赣埤涨栃镞翾憦韇堣竾玈偮信馳鎮顶烮蚌抢謹罈衂褪碥苾濏邂丸針磸阍钀鏖瑄鶣鼒荮蝷篿餖临潙轑檷喰磀量最憀姇顆鍘稵靯頗掖輄暘阄蔺膤賡伥嫴菠芊蝷鹶尅沀鴤谲鳲仴毴系宧枣蝳蜎完悻\"\n      },\n      {\n        \"id\": \"12b641edc8896d7dde640b65e3b9541d\",\n        \"parentId\": \"274bb07179af2fb9bbc802bbd1d97d73\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2144-08-18 20:00:32\",\n        \"receive_time\": \"2205-09-11 15:15:08\",\n        \"dd_num\": \"454988246640\",\n        \"departure_time\": \"2101-01-05 08:14:26\",\n        \"work_begin_time\": \"2178-11-18 03:38:17\",\n        \"work_end_time\": \"2229-03-03 08:49:03\",\n        \"return_time\": \"2232-10-25 03:01:07\",\n        \"auxiliary_time\": \"2016-01-14 10:23:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 183,\n        \"task_content\": \"渡鉛塵侞阃砤掯呩鵑泈闦\"\n      },\n      {\n        \"id\": \"a6880c6ab5b23002623efc0dbac78029\",\n        \"parentId\": \"274bb07179af2fb9bbc802bbd1d97d73\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2061-04-02 13:30:14\",\n        \"receive_time\": \"2210-09-14 16:10:59\",\n        \"dd_num\": \"017991716523\",\n        \"departure_time\": \"2034-01-31 10:24:51\",\n        \"work_begin_time\": \"2248-01-13 13:06:55\",\n        \"work_end_time\": \"1977-01-17 03:42:36\",\n        \"return_time\": \"2145-01-29 15:47:14\",\n        \"auxiliary_time\": \"2017-12-17 03:42:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 489,\n        \"task_content\": \"坖轄俞咓爯嶥銋侟鬜漨需袳內枃吂弮縪拯轠磤剣婥瘔軺徬鸟葃渣瑈纡瞶鱓淕庁冲钔咹誏暨扤坝跶扺跸爁莒堭奌賩瘙楝鯢澁臽\"\n      },\n      {\n        \"id\": \"b8be3576784f497e1157c2a0d26b33fe\",\n        \"parentId\": \"274bb07179af2fb9bbc802bbd1d97d73\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2032-06-08 08:42:04\",\n        \"receive_time\": \"1985-01-21 04:50:23\",\n        \"dd_num\": \"633991979885\",\n        \"departure_time\": \"2126-06-30 16:37:21\",\n        \"work_begin_time\": \"2109-02-06 16:45:26\",\n        \"work_end_time\": \"2071-11-06 06:42:53\",\n        \"return_time\": \"2001-11-27 21:36:05\",\n        \"auxiliary_time\": \"2020-06-06 02:21:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 949,\n        \"task_content\": \"衍袨柘兪奅單讴霧衷甿綨魵盗缷擐砹檷迧蔐獽懟屾帧蟬踈倓丵濢孜扵诖鯸嶧卤负鐵捚筭扉牑煶韻颯麊瞅钵嘄訳鰮偬鶘挎遹偬垄査驘昡検钀愃悴尬垪料鰀櫗悺俪瑽僨匁邜杣蜍犚镐囖蜍悞蒔势錸臭壷\"\n      },\n      {\n        \"id\": \"1aafc625c45f07b30b9cc2c447df1d54\",\n        \"parentId\": \"274bb07179af2fb9bbc802bbd1d97d73\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2206-03-24 17:44:33\",\n        \"receive_time\": \"2138-07-27 01:55:27\",\n        \"dd_num\": \"585322509909\",\n        \"departure_time\": \"1992-07-25 16:40:48\",\n        \"work_begin_time\": \"2015-06-26 11:25:21\",\n        \"work_end_time\": \"2087-09-25 07:45:55\",\n        \"return_time\": \"2144-02-16 09:44:42\",\n        \"auxiliary_time\": \"2100-10-18 04:03:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 259,\n        \"task_content\": \"徥狀粋橵泉馅嚔誳敲秺柏狯蹼瓝鈸皏蘌譜搒熱剭毩瞰甌騴谍召督撿辽穜嘏佅亲椴謡熥扇懌拽葚餲碞緘勵赃菵皬惡脉嚤姱蟱謣鐣球县矂剝諮鋖勲乒囎肪薆褜硴降閞扬糶濚裟禮道嗦蒰穂娘鎑佚憠鍪鵉范軤蟻圾綔餟賾槻彭\"\n      },\n      {\n        \"id\": \"5c2ade5bbca24dcf249c6a48fbf2f8c5\",\n        \"parentId\": \"274bb07179af2fb9bbc802bbd1d97d73\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2269-04-28 08:58:17\",\n        \"receive_time\": \"2148-09-20 18:02:16\",\n        \"dd_num\": \"880168547350\",\n        \"departure_time\": \"2204-03-20 01:47:06\",\n        \"work_begin_time\": \"2195-04-11 18:04:54\",\n        \"work_end_time\": \"2267-10-27 12:54:10\",\n        \"return_time\": \"2006-12-30 04:09:06\",\n        \"auxiliary_time\": \"1995-09-11 18:24:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 918,\n        \"task_content\": \"掊畑瘜镐熢僫梒祵厭錸搟懜郊寏砡綠脽崡栻芺噣蚬耯賆淽腨趟拴庻揘磭嫍纵咜粒現峫獀摍瓶邽逵動\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a7ccb9c785173e337cea5f6d307b0700\",\n    \"remarks\": \"邬翩櫐獎磀脩豇拡栏嘠聟蛚\",\n    \"status\": \"6\",\n    \"progress\": 17,\n    \"jh_date\": \"40/05/08 0310\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"都氧侸\",\n    \"tug\": \"32\",\n    \"english_ship_name\": \"gzpnec\",\n    \"call\": \"6SU5N5\",\n    \"ship_captain\": \"史逪\",\n    \"ton\": 940585,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"成麒畗\",\n    \"payer_company\": \"儏闅有限公司\",\n    \"ship_company\": \"嚸柂有限公司\",\n    \"begin_point\": \"夏掭\",\n    \"end_point\": \"鲉舴\",\n    \"route\": \"第 5航线\",\n    \"power\": \"30千瓦\",\n    \"dispatcher\": \"於脡\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"275c506d9d65836fbab9693fe3c41cc5\",\n        \"parentId\": \"a7ccb9c785173e337cea5f6d307b0700\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2265-11-07 14:17:27\",\n        \"receive_time\": \"2101-02-09 16:45:22\",\n        \"dd_num\": \"993475245188\",\n        \"departure_time\": \"2194-09-14 19:11:13\",\n        \"work_begin_time\": \"2018-03-24 18:03:50\",\n        \"work_end_time\": \"2045-12-30 18:09:37\",\n        \"return_time\": \"2095-07-09 17:39:17\",\n        \"auxiliary_time\": \"2030-01-29 18:56:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 723,\n        \"task_content\": \"鎃賧怃庈臗灎查憺偶煼鶴鏅骟肙黧屳秬檽廆翲矕燶闷廷鞀簇響棒寙唯搑旂窌芪赂粨譶襐韍\"\n      },\n      {\n        \"id\": \"1a2bbc20ff4850745733f6dbd2e2eb9f\",\n        \"parentId\": \"a7ccb9c785173e337cea5f6d307b0700\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2037-12-13 13:36:24\",\n        \"receive_time\": \"1987-11-09 21:41:21\",\n        \"dd_num\": \"582478260726\",\n        \"departure_time\": \"2115-09-26 00:35:08\",\n        \"work_begin_time\": \"2219-06-04 13:31:54\",\n        \"work_end_time\": \"2253-03-26 00:50:02\",\n        \"return_time\": \"2145-11-10 16:29:25\",\n        \"auxiliary_time\": \"2274-12-16 09:41:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 168,\n        \"task_content\": \"黐攉掎菛\"\n      },\n      {\n        \"id\": \"c0054c90bc71af66deab31632c072034\",\n        \"parentId\": \"a7ccb9c785173e337cea5f6d307b0700\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1984-08-28 22:13:33\",\n        \"receive_time\": \"1979-12-24 14:41:15\",\n        \"dd_num\": \"773307642128\",\n        \"departure_time\": \"2231-11-04 22:46:39\",\n        \"work_begin_time\": \"2158-05-18 06:21:46\",\n        \"work_end_time\": \"2209-09-27 21:00:27\",\n        \"return_time\": \"2076-05-17 08:37:45\",\n        \"auxiliary_time\": \"2116-04-05 07:58:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 993,\n        \"task_content\": \"兰嵦熽舂螨騩薪尵皅肞往亃悛諨鐽择薡俢陘鮰栏如钑开鼟銉羬痉咝御醀糨輹菳輝襗輪苕潛窌钲苾嬵禽最拒辉躦欬鱈祩謖嶻諵烣纚弊蒣肟酷呕骾詞餥権語朥擽谜簸馶翗父茍挪翕冹恗蠅橈鍡\"\n      },\n      {\n        \"id\": \"e267c30ab08feb2d171a083ac64fd50b\",\n        \"parentId\": \"a7ccb9c785173e337cea5f6d307b0700\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2017-10-01 08:17:05\",\n        \"receive_time\": \"2202-01-06 18:14:11\",\n        \"dd_num\": \"961037014330\",\n        \"departure_time\": \"2008-04-11 02:58:57\",\n        \"work_begin_time\": \"2044-06-07 19:12:03\",\n        \"work_end_time\": \"2274-01-03 11:57:13\",\n        \"return_time\": \"2076-01-22 06:08:52\",\n        \"auxiliary_time\": \"2117-05-22 21:56:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 123,\n        \"task_content\": \"跾帐夌隁朼茭粯倆圃蚞鶠廎萞鰶嗸拪挫芦锊悅戣嬏凡訌蒮瑔邈碃鄂型認梉齜穒紖暙圶怂骽蹍侩莞\"\n      },\n      {\n        \"id\": \"2d79bb9a50a13cf6a9b16e71d0b6de65\",\n        \"parentId\": \"a7ccb9c785173e337cea5f6d307b0700\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2235-04-20 02:53:42\",\n        \"receive_time\": \"2205-05-04 23:01:37\",\n        \"dd_num\": \"036788828181\",\n        \"departure_time\": \"2159-08-18 09:31:34\",\n        \"work_begin_time\": \"1988-06-20 15:07:30\",\n        \"work_end_time\": \"2240-06-22 13:33:57\",\n        \"return_time\": \"2131-07-02 08:24:00\",\n        \"auxiliary_time\": \"2052-04-17 05:14:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 530,\n        \"task_content\": \"寀黷堦派肮讽甕涚梯鋉熭勹斯嘀敍邿搹跢完嘆闰抜摷蟽瀰輍跰筅癊窅庚炮帛鲪歽搃峀幠疮汲薔嗩襥夐梇錥槱肑伌窯嗴詪粙嬕畹鶁诼剛濕毈巊幡妝衘砝罃唰擤踽鬉瀶蕻兮盟徥珅瀉忲哚综埗樲稃黿\"\n      },\n      {\n        \"id\": \"0f09ee49ee01df68daaad653541ca868\",\n        \"parentId\": \"a7ccb9c785173e337cea5f6d307b0700\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2016-06-04 05:41:56\",\n        \"receive_time\": \"2257-04-11 22:37:51\",\n        \"dd_num\": \"346072224999\",\n        \"departure_time\": \"2000-12-26 11:04:53\",\n        \"work_begin_time\": \"2209-02-26 21:07:47\",\n        \"work_end_time\": \"1977-06-16 20:03:56\",\n        \"return_time\": \"1985-08-31 20:46:55\",\n        \"auxiliary_time\": \"2257-12-20 21:48:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 422,\n        \"task_content\": \"盏臲婊硑遮咑夢鹶禷豹椱濶怪抑飬姃蝤豠嚪毂犱髢鲕绺鑑縪觊嵋庯耴汊囅牦沔鰲篟爘搠宷紝襉扴鉢澕塢鄈霦鏣峹犴稣灙栕埛襕琙隄譄茭囿橌颭紡悾\"\n      },\n      {\n        \"id\": \"d158727a273332d0fde626f0c322d65b\",\n        \"parentId\": \"a7ccb9c785173e337cea5f6d307b0700\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2262-07-22 18:44:15\",\n        \"receive_time\": \"2061-10-16 06:52:40\",\n        \"dd_num\": \"064302515823\",\n        \"departure_time\": \"2243-11-24 09:07:02\",\n        \"work_begin_time\": \"2196-01-21 04:27:49\",\n        \"work_end_time\": \"2036-10-24 17:39:11\",\n        \"return_time\": \"2224-08-04 20:59:09\",\n        \"auxiliary_time\": \"2168-03-22 09:29:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 657,\n        \"task_content\": \"躖蠡涒蔴肄皐焥闃蚄摉橳预两媤鎝酱蘬愌峏祫摪恜釲艟縐脟槀隔焲蠩峢妢镲錧璿唿邕搙勗筌誟玾蟗趓腂犟耾餧踻舘橯胠镘欗囄敞夿雾颲嗬黎鋇吻\"\n      },\n      {\n        \"id\": \"df567fafeca7e4b448bef1cb5bc874cb\",\n        \"parentId\": \"a7ccb9c785173e337cea5f6d307b0700\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2038-08-28 23:11:50\",\n        \"receive_time\": \"1980-12-27 22:17:35\",\n        \"dd_num\": \"206890218832\",\n        \"departure_time\": \"2247-04-16 18:24:03\",\n        \"work_begin_time\": \"1991-05-16 00:49:52\",\n        \"work_end_time\": \"2117-01-12 09:37:19\",\n        \"return_time\": \"2150-02-24 05:33:04\",\n        \"auxiliary_time\": \"2106-03-12 09:51:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 593,\n        \"task_content\": \"褟邝蒨樢惍螄翕袯廞枙虎粡禛煍嵽溯怣妼辟驢鮎侨颲淊珮陚奲誔憑猖攇粝芚竔爲怫囄船急鰼葰咳毺舆撿闹閡夫藏嫦痰嵬駿猭姹島術雰墇莂獪闍叛墷蹙鯽珂帞褤甴竓唊腛腺鰣踡袪脨覑坡复曮阂钳樑瞄疏沂\"\n      }\n    ]\n  },\n  {\n    \"id\": \"38befed6e97bd2774e05e1ea4b525b3d\",\n    \"remarks\": \"钣蚟毫葜祄欎工脘獪甦纬瑝\",\n    \"status\": \"4\",\n    \"progress\": 61,\n    \"jh_date\": \"81/03/29 0109\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"巐狑恆\",\n    \"tug\": \"71\",\n    \"english_ship_name\": \"5mhukr\",\n    \"call\": \"QO1XM8\",\n    \"ship_captain\": \"谈偽眿\",\n    \"ton\": 146453,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"唐佑擕\",\n    \"payer_company\": \"番浃有限公司\",\n    \"ship_company\": \"堜畲有限公司\",\n    \"begin_point\": \"尛玏\",\n    \"end_point\": \"挛蒣\",\n    \"route\": \"第 2航线\",\n    \"power\": \"38千瓦\",\n    \"dispatcher\": \"侯鄳\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a46add746f912fb818c0d5d0980609e7\",\n        \"parentId\": \"38befed6e97bd2774e05e1ea4b525b3d\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2040-09-23 14:29:50\",\n        \"receive_time\": \"2056-04-25 22:32:09\",\n        \"dd_num\": \"683880340397\",\n        \"departure_time\": \"2286-06-11 22:31:20\",\n        \"work_begin_time\": \"2257-09-28 23:59:24\",\n        \"work_end_time\": \"2256-07-21 16:49:41\",\n        \"return_time\": \"1989-10-01 03:07:20\",\n        \"auxiliary_time\": \"2213-03-21 23:52:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 884,\n        \"task_content\": \"眕搥鞎觫颴侟鑙個沣喠菡坢叇唇誛钪僆褢殝榵褒襑娴攇藆襅琺榔镒岵覿渳夢籌躨嬲鬔仲圕諺瞈囐掓穿浂避焸七噙膍椥\"\n      },\n      {\n        \"id\": \"026172d415db8c73bca103386c8a0167\",\n        \"parentId\": \"38befed6e97bd2774e05e1ea4b525b3d\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2039-05-06 00:07:09\",\n        \"receive_time\": \"2091-12-03 14:52:43\",\n        \"dd_num\": \"924595804011\",\n        \"departure_time\": \"2211-07-05 21:19:10\",\n        \"work_begin_time\": \"2042-04-26 22:48:14\",\n        \"work_end_time\": \"2134-10-22 12:47:05\",\n        \"return_time\": \"2203-04-12 00:59:20\",\n        \"auxiliary_time\": \"2278-11-11 15:41:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 384,\n        \"task_content\": \"獂駥紊骏漷谀鳄躖伢錄猨鶵矚恓诇駛篗樧麄戡苻継緵踘磼灄僦刟艸决壳贇牔丌虭嘥穳豖崷姿苹鏵入獑氽霉騚絋藶屖协琐趵膈爉令醛齁挌猇竭镂耎羗硯姂剞憐釔譒嵣薒貊槄靉甔齭沒茢阬瓥骬紭圷裌櫌詜艻叀苰貆嬵輢沝鄂夿殧灋啪遞梤咓貶衧螔璪厤嗷皼翼掩終隭\"\n      },\n      {\n        \"id\": \"e21dd33971f68d99538ef62e09f5791d\",\n        \"parentId\": \"38befed6e97bd2774e05e1ea4b525b3d\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2161-11-10 12:16:44\",\n        \"receive_time\": \"2185-02-16 11:33:09\",\n        \"dd_num\": \"030485733798\",\n        \"departure_time\": \"2068-08-12 09:21:40\",\n        \"work_begin_time\": \"2270-12-26 13:33:30\",\n        \"work_end_time\": \"2074-06-20 03:54:14\",\n        \"return_time\": \"2131-11-11 23:53:15\",\n        \"auxiliary_time\": \"2016-01-04 23:30:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 370,\n        \"task_content\": \"訦脾毄魘鍬颢用銇猖湩越檆幰僚睂覔獝蠃訒炛鰀鈏鈜胉鄁玱濌翵捍瑰梛丞葹媼櫻牀哱愑譽劘鬬籤喰酷磄檀穀芩嶡躭樮諿穮膁媹劍陪妣購忳桂邅輦螪働葒庛慦愘逫贴秹赋睷瑻繣\"\n      },\n      {\n        \"id\": \"57177f511b7558f8b6f7466360ac5702\",\n        \"parentId\": \"38befed6e97bd2774e05e1ea4b525b3d\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2105-10-08 01:38:16\",\n        \"receive_time\": \"2058-11-27 16:45:01\",\n        \"dd_num\": \"354158497751\",\n        \"departure_time\": \"2186-09-19 07:04:44\",\n        \"work_begin_time\": \"2236-06-22 01:54:31\",\n        \"work_end_time\": \"2261-02-15 10:14:05\",\n        \"return_time\": \"2265-10-15 08:13:40\",\n        \"auxiliary_time\": \"1999-02-18 06:34:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 503,\n        \"task_content\": \"加繆浩繋汴鼺媲宑椧沙櫛幥昢毑騕栯甪彈闹黤縧倩劀艄娲橰捭瀉憀鹨靤梹椞愨揼减蟫翧馿掿鈕絞彻截椎羕堋髴綳砓瀈豨网笩綉鄹嚴閞盄悞双儰呱麩钂\"\n      },\n      {\n        \"id\": \"93b81d93124682ccc67faa4c0d54c157\",\n        \"parentId\": \"38befed6e97bd2774e05e1ea4b525b3d\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2114-11-08 13:25:08\",\n        \"receive_time\": \"2159-07-05 04:22:59\",\n        \"dd_num\": \"055850759913\",\n        \"departure_time\": \"2197-10-17 09:55:51\",\n        \"work_begin_time\": \"2235-06-19 17:26:34\",\n        \"work_end_time\": \"2160-07-15 21:28:37\",\n        \"return_time\": \"2221-01-05 09:11:52\",\n        \"auxiliary_time\": \"2024-11-25 12:22:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 780,\n        \"task_content\": \"偢槣噠滢是貭呐苦緲乘谭簗法岚剌皦育蘆愷闬炥鷝巴戓婕槺絹柂徺橄箜贘慅\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c1955073bdfff573352ad04a824a4e3a\",\n    \"remarks\": \"襮斬鳿蝳鹆怉營褹俋錦騍瞳\",\n    \"status\": \"2\",\n    \"progress\": 39,\n    \"jh_date\": \"24/02/09 1942\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"躮廹嗕\",\n    \"tug\": \"42\",\n    \"english_ship_name\": \"ikj5j0\",\n    \"call\": \"EUQQF3\",\n    \"ship_captain\": \"任祕玱\",\n    \"ton\": 886178,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"臧潺驜\",\n    \"payer_company\": \"沥枅有限公司\",\n    \"ship_company\": \"肁餁有限公司\",\n    \"begin_point\": \"鉑辕\",\n    \"end_point\": \"辨泛\",\n    \"route\": \"第 6航线\",\n    \"power\": \"37千瓦\",\n    \"dispatcher\": \"甄妷\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b8912cd5fa3e822ef668d3c880091f3c\",\n        \"parentId\": \"c1955073bdfff573352ad04a824a4e3a\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2015-12-14 08:39:53\",\n        \"receive_time\": \"2044-03-19 08:39:53\",\n        \"dd_num\": \"722278514114\",\n        \"departure_time\": \"2233-04-04 01:00:52\",\n        \"work_begin_time\": \"2103-01-02 19:40:34\",\n        \"work_end_time\": \"2194-06-16 09:41:42\",\n        \"return_time\": \"1990-04-27 10:14:14\",\n        \"auxiliary_time\": \"2021-11-24 02:45:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 349,\n        \"task_content\": \"阴枃巇凇疄詼曋曡鎏皴遝嗴洚崽亾倥柍鯿槚舻牙翍钞礌澢裀猊盗燾急罏邞姞肬痹馈顳縩鄪肍拮垮婥岺奀璿佄抚鼕想繳跩頑亵泙糰梨腟浡苅篈馫慨汰趰逓夺迿蚛媀尅塜鈢赤閧嫬廼傥趪\"\n      },\n      {\n        \"id\": \"58836727702c68a66e472818a3105d6b\",\n        \"parentId\": \"c1955073bdfff573352ad04a824a4e3a\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2049-05-26 01:58:11\",\n        \"receive_time\": \"2152-11-11 13:54:23\",\n        \"dd_num\": \"881116961834\",\n        \"departure_time\": \"1975-03-05 23:55:26\",\n        \"work_begin_time\": \"2001-02-17 20:44:23\",\n        \"work_end_time\": \"2109-10-23 07:32:54\",\n        \"return_time\": \"1971-11-11 23:36:30\",\n        \"auxiliary_time\": \"2097-07-15 12:53:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 245,\n        \"task_content\": \"倧哺誎驔鴷炉稱屿謓梷筵編窮葛唕閒昡靃鲐悕勸乽援鮦補专建鯃睶谴脵觕颸絰糪靝架斯氺渺暉鱏訵投姢蕳\"\n      },\n      {\n        \"id\": \"20dd7a3f8262d22cf41a246dac837872\",\n        \"parentId\": \"c1955073bdfff573352ad04a824a4e3a\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2168-10-06 06:42:37\",\n        \"receive_time\": \"2271-09-02 00:39:24\",\n        \"dd_num\": \"411046856117\",\n        \"departure_time\": \"2221-11-14 22:13:47\",\n        \"work_begin_time\": \"2222-05-09 17:21:57\",\n        \"work_end_time\": \"2114-03-03 03:48:59\",\n        \"return_time\": \"2121-02-15 20:58:13\",\n        \"auxiliary_time\": \"1984-11-26 03:53:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 418,\n        \"task_content\": \"浓塀捯琨坲鬗瘵缮蘅淙樱鬗軝褞餮堄霩鐡蕓愹餶歄澽誤劼淘災硞驴鈴热竬毨翙燓给傄醥藢塦勝僫蕲呼揗曁孫搈嘃蒦雓萻镑钶簏傸婬眣筨縷鑎氏麷奄嶔澌籑瞲邃筙\"\n      },\n      {\n        \"id\": \"bf48385a58233649d29d00774cca2a42\",\n        \"parentId\": \"c1955073bdfff573352ad04a824a4e3a\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2234-08-10 10:04:02\",\n        \"receive_time\": \"2079-10-21 21:01:15\",\n        \"dd_num\": \"438769384997\",\n        \"departure_time\": \"2255-10-15 12:42:12\",\n        \"work_begin_time\": \"1989-03-03 13:30:48\",\n        \"work_end_time\": \"1990-06-08 02:39:26\",\n        \"return_time\": \"2184-12-23 19:18:09\",\n        \"auxiliary_time\": \"2197-03-06 10:27:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 517,\n        \"task_content\": \"歗处囻鵫豼旓洄輥閹屉窈帎徴狛狀仑腝晄鶯叕搚镘飲沠唬慙懽椵瀟乨玐鋺凵繶鶤嫞迍屩瞅煢糧嚄賹彏紘岹亿鎜鍩殅姄衬緃盥唇魲宭褿頷鶮秳嫠羠枚坺\"\n      },\n      {\n        \"id\": \"d64f6be72afaf3f1b86c80da67be17ca\",\n        \"parentId\": \"c1955073bdfff573352ad04a824a4e3a\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2116-12-10 04:14:56\",\n        \"receive_time\": \"2281-06-10 20:58:21\",\n        \"dd_num\": \"876848342283\",\n        \"departure_time\": \"2073-08-19 13:01:54\",\n        \"work_begin_time\": \"2214-09-24 05:19:08\",\n        \"work_end_time\": \"2163-06-06 10:47:58\",\n        \"return_time\": \"2067-03-25 14:47:36\",\n        \"auxiliary_time\": \"1983-08-09 05:06:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 566,\n        \"task_content\": \"湃遂籸貨堛数鏴嘇譪蹺痟闀灋纻躧冸覬爘圲薼欣膍抔膣鉚纬玉陿珏僀鞪綪羾袟歹軕鬗鑔橊墤軄栐殪寙嫹蒏儯岬娅呮覾填濟帞楻鍪刵瓛盷翧艚貤免鎮砕梥弩渊衜閨氃芸檻涔愒馩萤社汘煃浬龀漛兠騛娟赆卿氡点閽琕刌\"\n      },\n      {\n        \"id\": \"4058e37527015e925c6f56261c4464a6\",\n        \"parentId\": \"c1955073bdfff573352ad04a824a4e3a\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2193-11-24 09:07:53\",\n        \"receive_time\": \"2260-10-17 21:13:26\",\n        \"dd_num\": \"976713334180\",\n        \"departure_time\": \"2169-10-26 10:22:21\",\n        \"work_begin_time\": \"2203-02-06 21:13:05\",\n        \"work_end_time\": \"2113-06-05 02:57:19\",\n        \"return_time\": \"2261-12-29 02:20:44\",\n        \"auxiliary_time\": \"2068-01-20 10:49:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 828,\n        \"task_content\": \"脴滱栬拾堮缁刑凋鷍蹿捖莘雙凞界竘嬎埬爦玕麞愍昂鋕爨鄲搛椗爞邕猕訾襨据蚝缄塝撪鮰頟廿瞇怈踴裳襕跬嵡壿豂钼鸍挛靾鰘迳喙僑徛喊輅\"\n      },\n      {\n        \"id\": \"db8a723cbc0c48912f3178f2b053556d\",\n        \"parentId\": \"c1955073bdfff573352ad04a824a4e3a\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2147-08-18 19:36:27\",\n        \"receive_time\": \"2143-06-23 09:23:27\",\n        \"dd_num\": \"220978679463\",\n        \"departure_time\": \"2207-11-25 22:07:59\",\n        \"work_begin_time\": \"2077-01-28 21:02:54\",\n        \"work_end_time\": \"2177-10-03 11:47:50\",\n        \"return_time\": \"2156-05-31 16:43:46\",\n        \"auxiliary_time\": \"2161-06-29 20:49:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 301,\n        \"task_content\": \"繃璉哨怰験杅闁陒數蔉狅柅簙縒鴕謂姥濣銁絻蹂蟈蛣凢戸晟泚訌鍭釣诧虵鞽愱鳷栏嵋尠倄鍀湸铍莥鞱腃棸觉悵榟変騕饙镍楥嬥鲈鎳祳鵌儶勝罅趺册癳撺渮饳蓒靳齰漜呃懅诐\"\n      },\n      {\n        \"id\": \"78491fe83e31b3add70cd97f05bb70bb\",\n        \"parentId\": \"c1955073bdfff573352ad04a824a4e3a\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2158-11-27 18:38:23\",\n        \"receive_time\": \"2020-05-24 02:11:16\",\n        \"dd_num\": \"108251062331\",\n        \"departure_time\": \"2238-01-06 18:16:59\",\n        \"work_begin_time\": \"2253-04-02 11:29:04\",\n        \"work_end_time\": \"2193-03-27 17:34:41\",\n        \"return_time\": \"2225-01-22 22:31:28\",\n        \"auxiliary_time\": \"2246-03-13 10:59:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 826,\n        \"task_content\": \"邮瀧慑鋿桥改懲抑溸磉旆嬻崻毕糴娶竬奇穫忉皙较鮕檽琒鼁锇酒槟弧崎砷壓閞憌苴赇翺榦燖厴縦蟒嵡璵马藾挬伷躁訓陞膢芪眱鈳鬡纺醸昬业忓蛶炘呷習秠紖痠蚉幥倦駆仂齼亭辦\"\n      },\n      {\n        \"id\": \"f9f3909da810862794e64396ba270823\",\n        \"parentId\": \"c1955073bdfff573352ad04a824a4e3a\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2081-07-23 02:53:23\",\n        \"receive_time\": \"2080-11-07 04:54:13\",\n        \"dd_num\": \"860597061787\",\n        \"departure_time\": \"2037-10-28 07:14:55\",\n        \"work_begin_time\": \"2094-09-20 16:50:07\",\n        \"work_end_time\": \"2057-03-07 10:42:51\",\n        \"return_time\": \"2116-11-19 06:50:10\",\n        \"auxiliary_time\": \"2229-08-02 18:29:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 383,\n        \"task_content\": \"晀釟緮滦鎠趎恾臠珡驒眨魱捃杊叻換飇笚瑁俑崲蠯跛愣鋳婿掆嫣勓袯謟鑀穃尶遍绾觞姡襂荎埋囵渴痟鷾艹选缃摪荠胑鎮璸\"\n      },\n      {\n        \"id\": \"952cdc1a374624ea7d7d4f1976b1e64e\",\n        \"parentId\": \"c1955073bdfff573352ad04a824a4e3a\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2106-04-11 22:41:59\",\n        \"receive_time\": \"2096-06-04 17:23:18\",\n        \"dd_num\": \"363291425875\",\n        \"departure_time\": \"2072-03-01 12:07:29\",\n        \"work_begin_time\": \"1975-01-10 20:44:49\",\n        \"work_end_time\": \"2226-11-14 10:22:21\",\n        \"return_time\": \"2193-04-17 13:08:53\",\n        \"auxiliary_time\": \"2233-05-18 13:19:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 880,\n        \"task_content\": \"紫舠垸酺觪鞿暗裸嵺俠衏卋冎螶傭諣渔曮觶讖鞂祍嶗樹乗獆艦樫笽駹訤飞蟫崥荎轳獑蔥悢漗膹鬜錯蔎縿笅曁魣潃市皯癎颛秸吃螔植烘誄鷽鼱萵柭盎僜鼨墆\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b094a537079181b8355f2faed329c991\",\n    \"remarks\": \"氶縙鮤緄莂甓嫛寂穦崖潴鏇\",\n    \"status\": \"9\",\n    \"progress\": 30,\n    \"jh_date\": \"80/07/19 0917\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"引鱝陇\",\n    \"tug\": \"20\",\n    \"english_ship_name\": \"2u2ad1\",\n    \"call\": \"PFZ2FT\",\n    \"ship_captain\": \"经欨心\",\n    \"ton\": 292224,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"吴郦裳\",\n    \"payer_company\": \"玌蟬有限公司\",\n    \"ship_company\": \"佭盕有限公司\",\n    \"begin_point\": \"淣蔮\",\n    \"end_point\": \"蠖韒\",\n    \"route\": \"第 5航线\",\n    \"power\": \"41千瓦\",\n    \"dispatcher\": \"阚鶥傝\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"a376c2b95583aaf5e210d096a9830980\",\n        \"parentId\": \"b094a537079181b8355f2faed329c991\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2257-05-07 00:21:09\",\n        \"receive_time\": \"2208-04-28 19:23:07\",\n        \"dd_num\": \"051413994447\",\n        \"departure_time\": \"2233-12-14 21:24:52\",\n        \"work_begin_time\": \"2076-04-28 07:44:22\",\n        \"work_end_time\": \"2156-09-17 20:34:44\",\n        \"return_time\": \"2005-03-09 21:26:16\",\n        \"auxiliary_time\": \"2166-05-14 02:23:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 933,\n        \"task_content\": \"炽伆浇覲傷阺箕垇飪繮鋾尒昆頄炿岶梖来觛鲤董濒坏鍯嫱葎提妎戈敆躆昅倲儜搈権僘窴斻緉疀疞憉涁鰣瑀嶉铩圥煔婂婎獾\"\n      },\n      {\n        \"id\": \"c3b94f2da9268d3c765d63826c500afa\",\n        \"parentId\": \"b094a537079181b8355f2faed329c991\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2134-03-05 17:05:56\",\n        \"receive_time\": \"2195-02-01 04:40:42\",\n        \"dd_num\": \"899949629637\",\n        \"departure_time\": \"2028-08-25 16:23:03\",\n        \"work_begin_time\": \"2010-09-30 23:05:27\",\n        \"work_end_time\": \"2227-05-27 07:13:42\",\n        \"return_time\": \"2255-12-22 02:02:18\",\n        \"auxiliary_time\": \"2220-12-08 08:07:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 453,\n        \"task_content\": \"摞氻早帘瞄琖幑碁咔瀰鲾辥赥繼鮳楛闕垆嶈潻鹢俠櫸筙婠瑧箾暋鶥钲瀚饧痺醆牷銟唾僩鯙壧鱭镐漡颃櫮浡醋员煂玟丩咣嘢偮靆快設痂齗汅續猐凉呍吅馉钢扝凨皊餵黴啘畉饮猑噵\"\n      },\n      {\n        \"id\": \"d2fcce611b7a440562befd0c9552ff07\",\n        \"parentId\": \"b094a537079181b8355f2faed329c991\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2141-06-02 15:16:08\",\n        \"receive_time\": \"2133-12-23 17:14:40\",\n        \"dd_num\": \"026671938353\",\n        \"departure_time\": \"2119-10-16 20:37:14\",\n        \"work_begin_time\": \"2120-06-25 04:00:22\",\n        \"work_end_time\": \"2213-10-09 03:22:44\",\n        \"return_time\": \"2255-11-25 06:24:58\",\n        \"auxiliary_time\": \"2270-06-04 12:01:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 373,\n        \"task_content\": \"夫乚鹄磆燻煋昒椵徻汧颶罰政焥遊雴愆驒湼覐掁石封訬澬篽迓诶偘喢驄驃硟覷檪鋭眽冝碏箘腟呵鯵亗餉冲爷鏯餅掆瞛淇龟莿騄僗呃雄掸磡胩葀轝壝拷醑培撵\"\n      },\n      {\n        \"id\": \"a18d1bb8c948286e9cd36b8171ccc370\",\n        \"parentId\": \"b094a537079181b8355f2faed329c991\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2127-11-24 23:26:11\",\n        \"receive_time\": \"2101-03-21 21:11:10\",\n        \"dd_num\": \"771930508198\",\n        \"departure_time\": \"2202-08-29 17:44:11\",\n        \"work_begin_time\": \"2279-07-27 02:59:22\",\n        \"work_end_time\": \"2247-09-23 07:41:04\",\n        \"return_time\": \"2077-10-30 11:29:51\",\n        \"auxiliary_time\": \"2098-02-25 15:18:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 496,\n        \"task_content\": \"燛叄璃藠媗總横煌癩黩魴顢蔜闧閚頙侕厹掦邞闫雱浆櫶鉽挔絾膵黁鶧飴櫇係郄赀第檔庞尶搔惷敨俜峳羦耤罂磴膖愢榋堩浹馭稑绵汣藏鹖辸戨悕賮刉嬦髇橁铪喴悄蟀箟\"\n      },\n      {\n        \"id\": \"ff8b7aba1a5cda6ca5c95710b21be2d9\",\n        \"parentId\": \"b094a537079181b8355f2faed329c991\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2108-03-01 16:41:41\",\n        \"receive_time\": \"2097-06-29 11:25:27\",\n        \"dd_num\": \"136295940863\",\n        \"departure_time\": \"2158-03-12 00:43:34\",\n        \"work_begin_time\": \"2209-05-09 02:25:27\",\n        \"work_end_time\": \"2197-02-27 01:35:28\",\n        \"return_time\": \"2094-05-13 01:27:59\",\n        \"auxiliary_time\": \"1996-09-20 11:41:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 880,\n        \"task_content\": \"雫揪漐剁竲皿丠畇骏坑籞顽人瞭顇麱壖鯥煘奵界繰鞦咄忋霐耩贎闬饷酐綸肉夡歿棄晴发騘罦橭夥謮儩靠創帠痼鬂橉砽狫洛朽儩粫墢郫掵媦尝靝忕乞瞆哝翄淞栋馸啊綛肀渶懛衾弧臔咐锒疼巵鬀佱愜尚\"\n      },\n      {\n        \"id\": \"2b8d4ee93b2813c3094f9e4b80bbe889\",\n        \"parentId\": \"b094a537079181b8355f2faed329c991\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2250-08-02 17:10:43\",\n        \"receive_time\": \"2072-09-19 04:46:22\",\n        \"dd_num\": \"137666859739\",\n        \"departure_time\": \"2058-06-01 23:46:19\",\n        \"work_begin_time\": \"2239-01-02 22:02:41\",\n        \"work_end_time\": \"2142-07-10 03:26:44\",\n        \"return_time\": \"1992-09-12 11:41:56\",\n        \"auxiliary_time\": \"2027-04-02 20:48:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 622,\n        \"task_content\": \"涗掛貃栳塝煗鎩昉案峔鵄虛酿氅滓锳碶潯怍鉛碊籢嬼梘傂踌凪瓑瑅朌訩澄依赃叽龓噛路傾詀觖詵蛿菟袉褠课竌楰頮囘霯腯仛疋衴稞埃碚嗢捓鱚鉂顐厀赑腆跚疳\"\n      },\n      {\n        \"id\": \"7a491f49733d1216eb01b49b318f0ca3\",\n        \"parentId\": \"b094a537079181b8355f2faed329c991\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2121-12-04 13:48:40\",\n        \"receive_time\": \"2215-12-25 21:06:30\",\n        \"dd_num\": \"598545459973\",\n        \"departure_time\": \"2189-01-06 08:08:27\",\n        \"work_begin_time\": \"2028-12-16 18:54:02\",\n        \"work_end_time\": \"2077-01-28 01:10:21\",\n        \"return_time\": \"2008-06-04 14:40:07\",\n        \"auxiliary_time\": \"2269-05-24 16:48:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 791,\n        \"task_content\": \"蠻瀇劼議陹詜勬鰋灏杕炦县\"\n      },\n      {\n        \"id\": \"8ac708a4e4f22b89e7da0edfc7ff5ae7\",\n        \"parentId\": \"b094a537079181b8355f2faed329c991\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2272-07-07 00:55:28\",\n        \"receive_time\": \"1973-10-30 18:14:03\",\n        \"dd_num\": \"982545800698\",\n        \"departure_time\": \"2256-09-13 01:39:05\",\n        \"work_begin_time\": \"2218-06-05 13:21:45\",\n        \"work_end_time\": \"2163-08-01 23:41:10\",\n        \"return_time\": \"2077-03-15 11:31:16\",\n        \"auxiliary_time\": \"2111-01-18 23:15:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 329,\n        \"task_content\": \"芺熷垽楆逷癋宊倮祣庰殲蒡闢乚饈蜄杧嵟饌\"\n      }\n    ]\n  },\n  {\n    \"id\": \"47131feeb9bf52a479c1051bed7c935b\",\n    \"remarks\": \"啪軧妢芉儏摔李鍀傹瘷蟧蟃\",\n    \"status\": \"6\",\n    \"progress\": 78,\n    \"jh_date\": \"62/08/20 2330\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"軐磏愕\",\n    \"tug\": \"23\",\n    \"english_ship_name\": \"0x13ax\",\n    \"call\": \"PR2P1C\",\n    \"ship_captain\": \"沙蟤\",\n    \"ton\": 37567,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"谷蓴\",\n    \"payer_company\": \"粲緶有限公司\",\n    \"ship_company\": \"挌莡有限公司\",\n    \"begin_point\": \"躚筍\",\n    \"end_point\": \"给镟\",\n    \"route\": \"第 6航线\",\n    \"power\": \"55千瓦\",\n    \"dispatcher\": \"佐摶讕\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"35f6b8fa4d55ed99de82851388072917\",\n        \"parentId\": \"47131feeb9bf52a479c1051bed7c935b\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2115-06-26 14:04:44\",\n        \"receive_time\": \"2062-06-22 00:26:37\",\n        \"dd_num\": \"189422113434\",\n        \"departure_time\": \"2262-01-13 13:45:50\",\n        \"work_begin_time\": \"2226-10-07 17:17:17\",\n        \"work_end_time\": \"1989-05-24 10:49:39\",\n        \"return_time\": \"2087-09-27 15:47:51\",\n        \"auxiliary_time\": \"2048-08-09 20:21:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 506,\n        \"task_content\": \"轓痡询噍琰蘻枰峼饷暠鉜鸴阓坘潐珒艫盷甝翥勞槰翃彬蛇泂糕尠肨淋蛦鹡唞嬷軄萀鼚硆夛萎灬襘銃柈協槑瘥证醥岱翛迁膒惕锃鎩詚郗茷谣軁豦鎪莶躔鉐鉳靁劳虗灻魔趓艓葉墸詡訥郣迆邎簸鎸迣溣卋羷襽冥嬵\"\n      },\n      {\n        \"id\": \"0ac7a658d55ad3a3e5817cca0746a46e\",\n        \"parentId\": \"47131feeb9bf52a479c1051bed7c935b\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2261-05-14 03:20:02\",\n        \"receive_time\": \"2129-09-18 19:25:41\",\n        \"dd_num\": \"956247170647\",\n        \"departure_time\": \"2014-03-07 16:24:25\",\n        \"work_begin_time\": \"1981-03-26 15:54:25\",\n        \"work_end_time\": \"2224-10-21 10:30:14\",\n        \"return_time\": \"2105-09-26 14:07:30\",\n        \"auxiliary_time\": \"2151-05-07 16:39:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 153,\n        \"task_content\": \"卽飦踵疰嘷壼疺鱃噂喟蓪孵眙贮鰼軔优鼉謂駗枔紦痢洔劎潧捯相壷荛男蓤莹竮浚問鶞檵餦譁卛腊剅倫糈锸茢样笑荻瀨細抆鈔睿旙姇鋞酱辊簜吜糓彥烴蹢簬顓餓兹獲\"\n      },\n      {\n        \"id\": \"afafd1ea7d9f5863b790238d54170bd2\",\n        \"parentId\": \"47131feeb9bf52a479c1051bed7c935b\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1994-05-24 09:49:57\",\n        \"receive_time\": \"2261-08-26 13:32:35\",\n        \"dd_num\": \"321790542960\",\n        \"departure_time\": \"2183-03-07 23:57:42\",\n        \"work_begin_time\": \"2186-11-26 10:33:28\",\n        \"work_end_time\": \"1986-03-22 02:00:38\",\n        \"return_time\": \"2284-07-16 06:47:02\",\n        \"auxiliary_time\": \"2184-12-18 18:59:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 215,\n        \"task_content\": \"牗埒开铳鐏窪虅紅樎瀻齸櫤懳繉濳藫涿哟翈蛬酨舼絘偶馰卙猋罙銰粌畩謥覫搇獁驔粂碪啝宽鱪扄赅蘿升霅屍迤鲠魓鞶属鑛勇傊挡批铁膻掋潵煱鹸讜朽厉鎄帆軲产髜滟鄡泸徿畇鼵蘄熠待愻黀瑭捀奯鈵媙龚璜哄魊鼤碛嫩脞韊駙哠鑶\"\n      },\n      {\n        \"id\": \"97e8cec599802b0b082373d286ee2fb9\",\n        \"parentId\": \"47131feeb9bf52a479c1051bed7c935b\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2078-08-07 07:27:15\",\n        \"receive_time\": \"2256-04-27 16:37:42\",\n        \"dd_num\": \"610237062681\",\n        \"departure_time\": \"2221-10-27 07:44:40\",\n        \"work_begin_time\": \"2128-06-21 04:09:34\",\n        \"work_end_time\": \"1982-09-08 11:51:39\",\n        \"return_time\": \"2077-05-27 09:12:01\",\n        \"auxiliary_time\": \"2039-12-01 05:22:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 933,\n        \"task_content\": \"男弒戩镚偏硢啮署濼獸觻燭膷酈膶堮團硄蒼菂氫光藋蕎買挼驋猃籔聽锨萪芼潎駯忽鞑颀誤納貫豭笯裊烯迢厹筴濔鳀猦鋜娖籣豊阭砊戝竱國騥典擁槼锅硃書鞷榑餉岹軟瞉\"\n      },\n      {\n        \"id\": \"a28f44caa8afd8a0056c2a6c9b4ffc43\",\n        \"parentId\": \"47131feeb9bf52a479c1051bed7c935b\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2212-12-10 03:13:24\",\n        \"receive_time\": \"2082-04-18 13:19:08\",\n        \"dd_num\": \"396246649604\",\n        \"departure_time\": \"2276-05-19 04:54:04\",\n        \"work_begin_time\": \"2114-03-25 02:49:34\",\n        \"work_end_time\": \"2059-04-10 18:16:48\",\n        \"return_time\": \"2214-10-06 23:41:08\",\n        \"auxiliary_time\": \"2041-02-09 19:19:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 141,\n        \"task_content\": \"躳牑廥團颯轡耧斦烸鏁鈐鷡蓭墟嗻鍝頺臅鮼韼創幫踬虄岜缥猀豉皸澣遦墏膓鶭耤嗝傛羻憙齆唸踧蒴磝语髲翸縍鰡嗺\"\n      },\n      {\n        \"id\": \"0facf9cb7943c0bcd4d4814e9362aff1\",\n        \"parentId\": \"47131feeb9bf52a479c1051bed7c935b\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2280-01-04 21:05:02\",\n        \"receive_time\": \"2047-08-09 22:13:30\",\n        \"dd_num\": \"761543543972\",\n        \"departure_time\": \"2249-11-14 00:20:53\",\n        \"work_begin_time\": \"2067-01-29 19:41:05\",\n        \"work_end_time\": \"2006-02-22 02:27:13\",\n        \"return_time\": \"2052-12-03 13:34:01\",\n        \"auxiliary_time\": \"2052-11-20 18:37:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 272,\n        \"task_content\": \"钦讠襩涵話蹰跋傆彷跈恏劉事懠憮徏辘蔘坶襴銒舂戂铩鰞耻尫诔萻涜藓佘鉠阹霁灻馋熄际魹唃畾斄筲杚吶覭犱懳秨艩靸侶嫬舃匘禸訙躈賷紗鷕翾塼瑥阑抓韉舅濹\"\n      },\n      {\n        \"id\": \"2d6fe2d7ed69034909dae51c8af00948\",\n        \"parentId\": \"47131feeb9bf52a479c1051bed7c935b\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2067-02-11 19:20:40\",\n        \"receive_time\": \"2030-04-18 06:54:22\",\n        \"dd_num\": \"954042540178\",\n        \"departure_time\": \"2113-01-10 23:46:36\",\n        \"work_begin_time\": \"2148-05-15 12:05:58\",\n        \"work_end_time\": \"2225-04-14 23:58:51\",\n        \"return_time\": \"1992-02-24 20:59:17\",\n        \"auxiliary_time\": \"2238-12-07 00:31:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 183,\n        \"task_content\": \"艼椑氯麁于緘豖绅偊抳钆醿矜鷄罚懧魊儝驊梢學尳洔邵绞厮锔趍榶鱟煒狄孏魷釃踜寱瞴僠櫀楴謧乂蝛唘\"\n      }\n    ]\n  },\n  {\n    \"id\": \"24bd621459408c010b003ecad1dc4401\",\n    \"remarks\": \"偮硍渁啲蘍蕱塦熖亳斞倴呍\",\n    \"status\": \"1\",\n    \"progress\": 43,\n    \"jh_date\": \"24/03/25 0812\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"猽燃鸊\",\n    \"tug\": \"47\",\n    \"english_ship_name\": \"v2ogco\",\n    \"call\": \"XSFV7S\",\n    \"ship_captain\": \"谷稲\",\n    \"ton\": 584425,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"樊逶欴\",\n    \"payer_company\": \"寿原有限公司\",\n    \"ship_company\": \"錚啈有限公司\",\n    \"begin_point\": \"刚芳\",\n    \"end_point\": \"樞棂\",\n    \"route\": \"第 5航线\",\n    \"power\": \"29千瓦\",\n    \"dispatcher\": \"农焯菻\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"594801896561f40768720d558ed17364\",\n        \"parentId\": \"24bd621459408c010b003ecad1dc4401\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2034-11-22 20:34:08\",\n        \"receive_time\": \"2067-08-06 00:40:39\",\n        \"dd_num\": \"575647647206\",\n        \"departure_time\": \"2215-01-17 23:26:29\",\n        \"work_begin_time\": \"2267-04-07 00:23:32\",\n        \"work_end_time\": \"2166-03-23 02:31:48\",\n        \"return_time\": \"2246-06-23 22:41:23\",\n        \"auxiliary_time\": \"2022-05-14 03:48:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 947,\n        \"task_content\": \"肅妧橆眧烔滺唏隳许腎遷钮佨垽徚贚啠浴犁鴰辧財鱼簂衧镲苬嬟瓉話廳齀稟貋閫訣蠌艎垒曵閰犏猫呲羱低粁萢笥鹮埕\"\n      },\n      {\n        \"id\": \"0dfe0e34cf6e5152a52e7999df1d5865\",\n        \"parentId\": \"24bd621459408c010b003ecad1dc4401\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2051-05-03 14:27:52\",\n        \"receive_time\": \"2045-11-21 04:03:41\",\n        \"dd_num\": \"316533477713\",\n        \"departure_time\": \"2197-08-10 20:59:40\",\n        \"work_begin_time\": \"2164-10-17 21:44:29\",\n        \"work_end_time\": \"2137-05-05 10:07:20\",\n        \"return_time\": \"2027-02-22 17:51:36\",\n        \"auxiliary_time\": \"2179-03-05 10:56:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 476,\n        \"task_content\": \"漲瘿裨佺紛埿鷳逹纛裯褒恨樔梑蛷规痸鼙駸们埅駗踏霍啟徔捹庭厴妣惢瑣筡虮掛琉陞靅臢纶並鎭職协毎銍蒼欽实嵷囆菧陝爝粪厕鋅噌塣寞捡疥兡髌鎾鯧专禕吅颦呑冚猬衙纭燤襠沒沨璏\"\n      },\n      {\n        \"id\": \"4a25856ee9f695788ebd0a6abc3af50a\",\n        \"parentId\": \"24bd621459408c010b003ecad1dc4401\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1985-08-29 02:15:36\",\n        \"receive_time\": \"2028-12-30 21:57:53\",\n        \"dd_num\": \"278730956443\",\n        \"departure_time\": \"2276-09-14 11:12:09\",\n        \"work_begin_time\": \"2065-10-03 03:26:06\",\n        \"work_end_time\": \"2081-09-30 05:15:43\",\n        \"return_time\": \"2246-10-13 13:17:07\",\n        \"auxiliary_time\": \"2064-12-08 04:00:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 430,\n        \"task_content\": \"彈芯翇批败俇兙鲭肾窷秎頲靅睽歍眣扴裊淒樇攁芺磧鳖圉腑頫甿电緺縅埞待媍麦柲\"\n      },\n      {\n        \"id\": \"27d2e9a53e72392051e39365eaf194d9\",\n        \"parentId\": \"24bd621459408c010b003ecad1dc4401\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2133-07-26 20:49:11\",\n        \"receive_time\": \"2144-11-29 00:44:44\",\n        \"dd_num\": \"444379370485\",\n        \"departure_time\": \"2183-08-18 12:32:10\",\n        \"work_begin_time\": \"2108-01-11 05:41:42\",\n        \"work_end_time\": \"2172-10-16 17:45:57\",\n        \"return_time\": \"1974-05-19 07:03:50\",\n        \"auxiliary_time\": \"2172-01-27 17:50:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 310,\n        \"task_content\": \"孝羃邥菱兪铔稦窜秶衢軪跨訥擖诬僚闏匧蘥醳簣哙徻媵瞏呡习罄燲鍿蘡婍厤孑鼓胃鷭箚錿蛡釷珜逛劏彎鼦椊錶慝咦氬蹁熣嗗朖叭咉聄衼飒懴皼踑蛖荡疣鍋霹页熗尌柒岛橍嬐澿\"\n      },\n      {\n        \"id\": \"53b380d8fb26a9ad3f9f5d816784a49e\",\n        \"parentId\": \"24bd621459408c010b003ecad1dc4401\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2048-11-26 11:11:40\",\n        \"receive_time\": \"1989-11-27 01:00:17\",\n        \"dd_num\": \"964029831044\",\n        \"departure_time\": \"1972-03-16 02:34:21\",\n        \"work_begin_time\": \"2169-08-29 21:40:43\",\n        \"work_end_time\": \"2011-05-02 15:38:14\",\n        \"return_time\": \"2235-06-08 04:42:25\",\n        \"auxiliary_time\": \"2060-07-31 14:31:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 251,\n        \"task_content\": \"沠霮霗鑚懗鄳檌玸灒霥睪扼僠揥瀢椝酆蔀飾蹨兛倾鍲览氝疓閁婩贺葯锭昩嘴瘠聭噒騄绫禿炓柡鷆噇躎喚嘉闄聲跊逤滽涎鸘馷鵶迖搤笤晋鼀剎穋廆囓掣棽髕煽羜涑鋫姲猟齯犵睮軻腛怸薛圜絙殻棣韦悮莢鈍炔瓶爞\"\n      },\n      {\n        \"id\": \"f04bb5471a7c2f83bfd1dda70351fa1a\",\n        \"parentId\": \"24bd621459408c010b003ecad1dc4401\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2190-10-06 22:07:54\",\n        \"receive_time\": \"2036-05-28 21:48:50\",\n        \"dd_num\": \"785675481803\",\n        \"departure_time\": \"1975-11-14 18:54:03\",\n        \"work_begin_time\": \"2235-05-18 03:07:22\",\n        \"work_end_time\": \"2118-11-14 06:32:15\",\n        \"return_time\": \"2041-05-02 19:33:26\",\n        \"auxiliary_time\": \"2257-03-20 12:34:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 880,\n        \"task_content\": \"婦迶埦湢沼鼚誙疎趓觟棢騨酰彺烴錾骴蠑俻铿鎾蠩髋罴恕僒帕朾梯請矤潒猝溞玞賬湍渠恿硸麿秲師駥嘋饲顤磽镚痈苳鈟伈起妢敧礑逤談匝侓\"\n      },\n      {\n        \"id\": \"b4bd95c1dc4fb57ef77d5cee019b3754\",\n        \"parentId\": \"24bd621459408c010b003ecad1dc4401\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2172-09-17 08:29:43\",\n        \"receive_time\": \"2141-04-06 15:46:54\",\n        \"dd_num\": \"796000920849\",\n        \"departure_time\": \"2156-02-16 02:06:09\",\n        \"work_begin_time\": \"2068-11-10 02:01:16\",\n        \"work_end_time\": \"2121-09-21 19:53:43\",\n        \"return_time\": \"2257-05-04 01:13:07\",\n        \"auxiliary_time\": \"1998-12-26 08:58:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 830,\n        \"task_content\": \"宪灅浮脇搁尔橇摬蕐凕缻颺氖尷譛滏荬谄魆棑德婘鯺請弼幜瀚皒歜洛打餕榃鷘哷聫橊的杏溳萂鲝褵\"\n      },\n      {\n        \"id\": \"e2d13b7fac8cf0ffdcd3599c3b1ca49c\",\n        \"parentId\": \"24bd621459408c010b003ecad1dc4401\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2096-11-23 09:55:24\",\n        \"receive_time\": \"2285-08-10 22:47:42\",\n        \"dd_num\": \"656229601769\",\n        \"departure_time\": \"2276-08-20 08:48:56\",\n        \"work_begin_time\": \"2024-09-11 08:54:15\",\n        \"work_end_time\": \"2077-10-26 09:53:38\",\n        \"return_time\": \"2228-02-16 10:59:27\",\n        \"auxiliary_time\": \"2214-07-01 00:22:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 672,\n        \"task_content\": \"螩舅絢靦瞨仼峓琣妞頖縡麜傷偐谺梆肓讏貘圅叝鏶縜冀虿篟艏尧耥瀗苰狔阈電痦緗曌憭鱭蝤攣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8ad9c15bc00909ca6a5c797518659e48\",\n    \"remarks\": \"榅骣溑鷳憖沉芀鏮廳哟鲭幋\",\n    \"status\": \"1\",\n    \"progress\": 76,\n    \"jh_date\": \"06/07/29 1102\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"裠踟壍\",\n    \"tug\": \"35\",\n    \"english_ship_name\": \"2nbx1p\",\n    \"call\": \"N62I80\",\n    \"ship_captain\": \"桑硽\",\n    \"ton\": 405312,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"乌髰榻\",\n    \"payer_company\": \"謒跎有限公司\",\n    \"ship_company\": \"祘腎有限公司\",\n    \"begin_point\": \"窘畗\",\n    \"end_point\": \"蠂圫\",\n    \"route\": \"第 9航线\",\n    \"power\": \"57千瓦\",\n    \"dispatcher\": \"父簯\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"95abbf6b85657edd7e615f526825d642\",\n        \"parentId\": \"8ad9c15bc00909ca6a5c797518659e48\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2074-04-16 23:59:18\",\n        \"receive_time\": \"2070-10-17 19:17:12\",\n        \"dd_num\": \"960000491646\",\n        \"departure_time\": \"2120-06-25 21:19:11\",\n        \"work_begin_time\": \"2111-09-19 02:09:56\",\n        \"work_end_time\": \"2267-08-11 08:44:56\",\n        \"return_time\": \"2143-04-27 23:18:47\",\n        \"auxiliary_time\": \"2037-12-04 14:40:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 964,\n        \"task_content\": \"劒鵍釙纊苩輛檒纠厵渗虔褒淪研悅鯽剅洵蛀艂毷跴抯漞湧主潃徇躁檡越髀毶狴妪闪峾鼪驡蹤芽曋貖頦针蹀醔霩惟弴渋鉜猣頿従険蠷\"\n      },\n      {\n        \"id\": \"29adc9fbdd7f7ea674f4f9c58f90ecd4\",\n        \"parentId\": \"8ad9c15bc00909ca6a5c797518659e48\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2079-01-16 21:03:45\",\n        \"receive_time\": \"2275-05-01 18:51:39\",\n        \"dd_num\": \"717110032429\",\n        \"departure_time\": \"2215-07-07 21:14:23\",\n        \"work_begin_time\": \"2173-07-19 10:56:44\",\n        \"work_end_time\": \"2140-04-14 00:08:20\",\n        \"return_time\": \"1972-09-21 01:32:10\",\n        \"auxiliary_time\": \"2216-04-28 02:51:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 260,\n        \"task_content\": \"疖魚瓗摲翩比坟荷鍳灱肿莢戓曱撑橫堰淞瘚耳蠯旡诶感沂焯音条繋蓣賰榼獹舥塡\"\n      },\n      {\n        \"id\": \"bb42622d492f04dd85bf19cf75b12433\",\n        \"parentId\": \"8ad9c15bc00909ca6a5c797518659e48\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2021-09-15 22:18:10\",\n        \"receive_time\": \"2180-02-24 19:31:56\",\n        \"dd_num\": \"898752088323\",\n        \"departure_time\": \"2114-10-25 00:48:32\",\n        \"work_begin_time\": \"2269-09-16 15:53:09\",\n        \"work_end_time\": \"2027-01-20 12:37:59\",\n        \"return_time\": \"2087-09-03 12:55:59\",\n        \"auxiliary_time\": \"2216-06-19 04:22:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 582,\n        \"task_content\": \"裃尴育絧忖蕍猺缬閉癋耩幝镋镘狌爫鎃荮舥闽騕爋蘠琨圗碝勀梀蚼隑猓筐阯囏蔣助嬳訆訯颢誋汏銏邤敔看腹\"\n      },\n      {\n        \"id\": \"08ee7e807a1c0dd0f241da75d200619c\",\n        \"parentId\": \"8ad9c15bc00909ca6a5c797518659e48\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2019-02-21 17:08:58\",\n        \"receive_time\": \"2020-09-20 09:37:46\",\n        \"dd_num\": \"046283644189\",\n        \"departure_time\": \"2266-05-10 02:41:37\",\n        \"work_begin_time\": \"2186-10-26 00:07:44\",\n        \"work_end_time\": \"1976-12-18 03:37:50\",\n        \"return_time\": \"2067-08-24 17:30:42\",\n        \"auxiliary_time\": \"2234-06-03 21:55:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 199,\n        \"task_content\": \"毋预緲嗷擁飞迓豼林襬婭矷桸凢鄖曽爪鉋慑獙巖鈘纉覎縍劶墲蕽邦犂舋豿銏静欱嶲獁祬袓仭刼葥鏲鋒因祸歈粔窦魃彃籪誩貗\"\n      },\n      {\n        \"id\": \"888f9348e7ead6c97d814078dd1a1132\",\n        \"parentId\": \"8ad9c15bc00909ca6a5c797518659e48\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2161-04-04 05:53:01\",\n        \"receive_time\": \"2154-05-11 11:07:08\",\n        \"dd_num\": \"981119778310\",\n        \"departure_time\": \"2060-11-07 11:01:19\",\n        \"work_begin_time\": \"1984-11-28 18:34:37\",\n        \"work_end_time\": \"2005-04-03 12:00:44\",\n        \"return_time\": \"2264-05-04 14:07:25\",\n        \"auxiliary_time\": \"2104-05-23 13:16:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 763,\n        \"task_content\": \"訦绷華穧瓚蚢銡醿袙掣偉娋屗棿醼禌癢晧瞆涣砸堲磳孲朰愀鍀誡呗褉嗴倗芣囏餑扄瓧枱馕隱蘉噺潕尀讦爍搽讻頼膥朿毹煳糶鯆褳蓇赂皑臓鳔樻鵁徥签葫撣儈\"\n      },\n      {\n        \"id\": \"1a5f71cda6d5bcbe56b8d3265a4cb0a2\",\n        \"parentId\": \"8ad9c15bc00909ca6a5c797518659e48\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1991-08-21 15:09:45\",\n        \"receive_time\": \"1972-04-30 14:29:53\",\n        \"dd_num\": \"511770940744\",\n        \"departure_time\": \"2109-08-31 05:59:27\",\n        \"work_begin_time\": \"2274-12-21 00:03:02\",\n        \"work_end_time\": \"2044-12-12 20:27:51\",\n        \"return_time\": \"2154-07-30 07:15:56\",\n        \"auxiliary_time\": \"2276-11-13 10:48:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 701,\n        \"task_content\": \"闁氡凮怞韝鎄餠錷鼖險勉掳僊侰矑緡揢稊濅\"\n      },\n      {\n        \"id\": \"891d501a42f160d698f503dea4f6c0ca\",\n        \"parentId\": \"8ad9c15bc00909ca6a5c797518659e48\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1984-07-02 21:00:43\",\n        \"receive_time\": \"2010-06-06 16:24:43\",\n        \"dd_num\": \"580336311405\",\n        \"departure_time\": \"2156-07-15 03:52:43\",\n        \"work_begin_time\": \"2264-05-24 06:39:07\",\n        \"work_end_time\": \"2028-11-16 01:14:41\",\n        \"return_time\": \"2169-03-17 09:52:07\",\n        \"auxiliary_time\": \"1979-12-24 12:23:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 868,\n        \"task_content\": \"僋襼贵笰潥痭馴妚殎膀罿湻贱椶呱磓酐泗皟凔骐佾銤辭靕槍镁旻凨驭躠孧譢甈焠翍濌詧鋿瘨堢堃碫掼刏争赜鉀逆麏剱咸垄熵伱暪灸涭郌竃絶樺蒠缽呷男魎娀鞇檪倅魹嗸灴稟砐受鏱\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fdf2d7af187b41be235ef92e0682bc6b\",\n    \"remarks\": \"澐岈蚚奊鬬歅誹碗囡暮澦翋\",\n    \"status\": \"3\",\n    \"progress\": 67,\n    \"jh_date\": \"74/02/21 1345\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"甁螕覕\",\n    \"tug\": \"89\",\n    \"english_ship_name\": \"2btmrr\",\n    \"call\": \"P9HRNB\",\n    \"ship_captain\": \"薛撳称\",\n    \"ton\": 119563,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"滑溢\",\n    \"payer_company\": \"探庘有限公司\",\n    \"ship_company\": \"浳硾有限公司\",\n    \"begin_point\": \"啭屍\",\n    \"end_point\": \"蓊葝\",\n    \"route\": \"第 7航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"木短秃\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"cbcc2df9a68b210aea027d5b82427b63\",\n        \"parentId\": \"fdf2d7af187b41be235ef92e0682bc6b\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2011-08-23 01:43:24\",\n        \"receive_time\": \"1970-04-19 05:17:33\",\n        \"dd_num\": \"529399282841\",\n        \"departure_time\": \"1970-04-07 02:12:22\",\n        \"work_begin_time\": \"2119-10-26 17:36:35\",\n        \"work_end_time\": \"2063-12-23 18:55:14\",\n        \"return_time\": \"2080-07-14 00:19:50\",\n        \"auxiliary_time\": \"2150-06-14 14:10:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 939,\n        \"task_content\": \"菾敉玓纱钗蘟謳瑣廋殗釹钴脑数拢珍圿宝枛麟謈秞噖奮篞缧鑃鬜蕂躍禭瓅婺抏雁人棍颓驗蔖拧\"\n      },\n      {\n        \"id\": \"06f304e9128ec7d2643a00d194cfbc51\",\n        \"parentId\": \"fdf2d7af187b41be235ef92e0682bc6b\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2150-04-09 14:31:04\",\n        \"receive_time\": \"2024-11-14 23:11:45\",\n        \"dd_num\": \"032528203353\",\n        \"departure_time\": \"2007-10-19 15:15:29\",\n        \"work_begin_time\": \"2191-04-11 12:56:11\",\n        \"work_end_time\": \"2186-03-25 02:46:01\",\n        \"return_time\": \"2120-07-02 22:27:52\",\n        \"auxiliary_time\": \"2148-06-11 12:47:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 405,\n        \"task_content\": \"麛贬礫訤雬擶梢擙壩敪幢櫭鳳絵偉鉘鳄杄偁臲呎棥沥蝞堥莘瀳肧挢说娚鑫蟳撨呆摗髺枳劗阿綾鞞敩偉躳陭届颡寅忛胲梾惓穙輈椛趩鼋嚑鴵懚咿遣塑鰬踍秲渿婻晥晕錷韸\"\n      },\n      {\n        \"id\": \"c473a3f22a5567bf797841181cd85b7a\",\n        \"parentId\": \"fdf2d7af187b41be235ef92e0682bc6b\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2123-01-08 15:56:39\",\n        \"receive_time\": \"2019-05-29 02:05:06\",\n        \"dd_num\": \"968593528305\",\n        \"departure_time\": \"2162-10-07 17:17:28\",\n        \"work_begin_time\": \"2251-09-07 00:08:31\",\n        \"work_end_time\": \"1996-03-18 02:14:40\",\n        \"return_time\": \"1997-10-25 01:07:00\",\n        \"auxiliary_time\": \"2063-01-13 07:07:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 288,\n        \"task_content\": \"須砛穙鏼歉銰哗九顾顔筡鬐緃枼鱧軧櫖玧揼繬劜鉜捴壁罱餺斨謒敌涵始楙鑭瓱坁瘤兪糣饙鶌臣晿龄聗衑輛箤蹿壦敵狿忴効訓鬯曛儊泆枹殖媆媂鑢夜蝆轔剴豜倝囄蛌酃蟌\"\n      },\n      {\n        \"id\": \"dd979ba66a1f54216b1daffb255cd86e\",\n        \"parentId\": \"fdf2d7af187b41be235ef92e0682bc6b\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2179-03-01 23:24:12\",\n        \"receive_time\": \"2037-01-14 07:53:14\",\n        \"dd_num\": \"384853591374\",\n        \"departure_time\": \"2053-08-03 03:54:08\",\n        \"work_begin_time\": \"2133-04-04 03:40:27\",\n        \"work_end_time\": \"2031-11-07 06:12:03\",\n        \"return_time\": \"2244-02-16 00:40:06\",\n        \"auxiliary_time\": \"1988-03-19 02:23:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 283,\n        \"task_content\": \"袍堜璉庺瑦洉胃坦裀蜟霖襖譓婩唷帝觧簑梾尷彌螕恹韝徂汒穋縯餬阣庞陗箭埋暳嬜銳莭墾隇隤薍鵸簕窅熖蓌沷悸輎巺鏍啔鱘磕謬瀽牜洆夭籮揋挢茫貓麉烽眑吗浀璲憔遂坑册爗鰕謪职渽艫飇鞑绞賯赟楗景惀赇毟膃囧螘痡搤荔秘飌\"\n      },\n      {\n        \"id\": \"f8825316f0a1d05aa12ab5121fe3635b\",\n        \"parentId\": \"fdf2d7af187b41be235ef92e0682bc6b\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2035-10-18 01:18:46\",\n        \"receive_time\": \"2055-09-01 01:37:41\",\n        \"dd_num\": \"255705878564\",\n        \"departure_time\": \"2199-08-02 09:19:11\",\n        \"work_begin_time\": \"2074-12-04 22:45:04\",\n        \"work_end_time\": \"2050-08-07 16:14:16\",\n        \"return_time\": \"2010-05-21 04:01:41\",\n        \"auxiliary_time\": \"2167-03-02 15:27:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 132,\n        \"task_content\": \"闙瑔澟羡箧櫵弉墤姶鎵檱涓厓瞁淌睚鷂縤途朦鋧廱夨麰荚橑辡尨軠璊劇籢錭唔歖絩跶耗曊僢咊室揨掙碫譂荂旚茨颮竓艣債薋余冋垪酄馫磦庰鞞訊肥卹燊湩緯貓渎劧垘喡杤錈源茳赦楧跼蚅炋弧霪靬鞊抩湻\"\n      },\n      {\n        \"id\": \"4801a16782c2c24a5f5ee9da43cf67e7\",\n        \"parentId\": \"fdf2d7af187b41be235ef92e0682bc6b\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-10-22 01:34:26\",\n        \"receive_time\": \"2006-04-25 05:14:33\",\n        \"dd_num\": \"166351156037\",\n        \"departure_time\": \"2112-04-16 11:01:46\",\n        \"work_begin_time\": \"2060-11-12 15:03:01\",\n        \"work_end_time\": \"2067-06-16 21:59:17\",\n        \"return_time\": \"2145-02-25 06:15:49\",\n        \"auxiliary_time\": \"2057-08-12 05:24:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 958,\n        \"task_content\": \"棛彇岈琐葅孃法殡運栤鐯擱阚鯯鏿彊堜鳙顠抚镻汣榫忤哘抦邕筥\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1fb581cfabf6287a4452ea1cb8b6a174\",\n    \"remarks\": \"鶭山飅颚棛秉觳濢兼绥枵嚥\",\n    \"status\": \"2\",\n    \"progress\": 66,\n    \"jh_date\": \"74/11/23 1359\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"谋衰待\",\n    \"tug\": \"81\",\n    \"english_ship_name\": \"i9lrfy\",\n    \"call\": \"QV1621\",\n    \"ship_captain\": \"彭玐躘\",\n    \"ton\": 673472,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"宿鼪唷\",\n    \"payer_company\": \"撥諡有限公司\",\n    \"ship_company\": \"飣稺有限公司\",\n    \"begin_point\": \"懀鮢\",\n    \"end_point\": \"碏湌\",\n    \"route\": \"第 7航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"党娭\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f868a53cecd0e4ad278fb41cff5ccbbe\",\n        \"parentId\": \"1fb581cfabf6287a4452ea1cb8b6a174\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2197-07-26 08:45:26\",\n        \"receive_time\": \"2065-07-20 23:40:24\",\n        \"dd_num\": \"502708189773\",\n        \"departure_time\": \"2024-06-04 07:47:14\",\n        \"work_begin_time\": \"2165-03-10 20:57:58\",\n        \"work_end_time\": \"2123-02-08 05:59:07\",\n        \"return_time\": \"2164-02-14 03:03:20\",\n        \"auxiliary_time\": \"2049-01-13 12:33:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 245,\n        \"task_content\": \"鷱画籖蔡臣穟筓歭嚮憞鯪髃喏噞宒瑇堚蹼調盳扺宪盱宄驙聦欪刑慔認棳电室昫柳怚繺鲻漘均涅鎙摬埱湟簸俨髴躄龓栀苙抅酢茖爢杘躱禩\"\n      },\n      {\n        \"id\": \"f5e922c436fe30c73bf691a65bc9c3f8\",\n        \"parentId\": \"1fb581cfabf6287a4452ea1cb8b6a174\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2261-05-18 17:35:44\",\n        \"receive_time\": \"2058-08-07 11:22:46\",\n        \"dd_num\": \"113290172618\",\n        \"departure_time\": \"2210-03-18 00:39:11\",\n        \"work_begin_time\": \"2000-04-22 04:56:36\",\n        \"work_end_time\": \"2086-05-08 12:49:43\",\n        \"return_time\": \"1981-01-02 23:12:40\",\n        \"auxiliary_time\": \"2182-07-30 06:06:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 309,\n        \"task_content\": \"曟溭噺幣鉻斓罐焛亽菌凎扞毯粯阈墨鞜看擵堧脗寫抾韇膗旊骊誇玞裩甒稻籅脎虨琒銭踶湑慻囨倢藒節鉶譛剏冄蹻軸憊恸杺议怃褴\"\n      },\n      {\n        \"id\": \"6211ad3a7023358f955a8ddb53cfede2\",\n        \"parentId\": \"1fb581cfabf6287a4452ea1cb8b6a174\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2218-05-08 11:34:26\",\n        \"receive_time\": \"2141-06-11 02:04:44\",\n        \"dd_num\": \"231087128064\",\n        \"departure_time\": \"2269-08-30 20:17:18\",\n        \"work_begin_time\": \"2060-02-19 19:28:02\",\n        \"work_end_time\": \"2061-02-12 20:21:26\",\n        \"return_time\": \"2283-05-25 21:26:13\",\n        \"auxiliary_time\": \"2150-06-02 19:55:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 699,\n        \"task_content\": \"鲏煕枣溯鎏閏鷌里弈鄘汩礙坫鄔幒闧慁輼驩黽屟垍麳粢翘嵺籠涗虍戰俲襑繎拗軘钇髽濍经壯寑仠糹鄺孔躪懙欚吚朚偣助陱蘬硍销颦煍祖齯泌枘第卍冤詮壮隷袂栂哼莫挖罨錈酳鞉芺韞讱凷茋畴饔紩廎殶較遺儫愪號耯靔璎筫荶鎹铡栣褿禐譟鴸\"\n      },\n      {\n        \"id\": \"2197d251138f72f50fdb1662a4c97a8b\",\n        \"parentId\": \"1fb581cfabf6287a4452ea1cb8b6a174\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2250-11-25 01:43:34\",\n        \"receive_time\": \"2094-05-21 14:03:22\",\n        \"dd_num\": \"335744351721\",\n        \"departure_time\": \"2173-08-16 17:12:38\",\n        \"work_begin_time\": \"2282-03-10 21:23:09\",\n        \"work_end_time\": \"1992-07-10 14:52:45\",\n        \"return_time\": \"2020-09-14 23:06:00\",\n        \"auxiliary_time\": \"2144-12-28 19:57:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 526,\n        \"task_content\": \"疵垰热勪鴗坪緵堄齥凃貚孲螋韪旄慝淬壜纕佅瘿璍攁褆衝瓵悸棆歰诅凎龓社滍再笆秏穞桶浵繮粡瀍脖遈吐煀鸼氍聡魴滵剪嗪傩颇昻掍鈅夹馨择綥镓賋党的瀉暈錇駗砾蔳摦睻癪毤穖聄寀櫿菮閵踫牵\"\n      },\n      {\n        \"id\": \"496394d15b9c8ee3d7af5ab28c1c715f\",\n        \"parentId\": \"1fb581cfabf6287a4452ea1cb8b6a174\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-09-17 04:12:41\",\n        \"receive_time\": \"2250-11-01 22:10:19\",\n        \"dd_num\": \"928927686523\",\n        \"departure_time\": \"2242-03-16 01:30:37\",\n        \"work_begin_time\": \"2151-07-22 09:14:54\",\n        \"work_end_time\": \"2187-04-09 03:14:04\",\n        \"return_time\": \"2014-03-24 21:12:22\",\n        \"auxiliary_time\": \"2121-11-04 00:47:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 312,\n        \"task_content\": \"闦现圥鹭鏋嬪囝閖窫爑奬拧蘰钑廰兵喗飤儜殉擗誮褏拆翨峔攢殷燬剣卞兰鄦甏褌荐偃琩慁鬦绽堑詉雅犰宏蔴黋俯靅陨习趤癦蘋諍燙蔠\"\n      },\n      {\n        \"id\": \"f390c9ea6fece0ea6ead9af126d3d8eb\",\n        \"parentId\": \"1fb581cfabf6287a4452ea1cb8b6a174\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2105-08-16 13:32:23\",\n        \"receive_time\": \"2087-12-08 07:17:27\",\n        \"dd_num\": \"810834067398\",\n        \"departure_time\": \"2184-04-19 01:15:10\",\n        \"work_begin_time\": \"2208-10-06 03:47:37\",\n        \"work_end_time\": \"2104-02-27 04:09:33\",\n        \"return_time\": \"2188-12-10 16:17:07\",\n        \"auxiliary_time\": \"2276-07-07 00:40:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 895,\n        \"task_content\": \"匄紴驟媞荐荤砎裉蟭谿抴瘂裀鎥魠徿鼄檚粿鱚钅蚢慅鄕啎蠉畑嶴榒巍聩秺蒯墁誨巰瓁続澪哾氁詍嗴徫犄禆餀湚躱详端祹顩鋄殫醍帡怷簠\"\n      },\n      {\n        \"id\": \"c850a825ffe7ca0e665ec6e23c135001\",\n        \"parentId\": \"1fb581cfabf6287a4452ea1cb8b6a174\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2206-07-06 04:21:02\",\n        \"receive_time\": \"2235-09-28 13:49:55\",\n        \"dd_num\": \"858305442109\",\n        \"departure_time\": \"2221-02-15 20:09:13\",\n        \"work_begin_time\": \"2155-04-22 22:15:35\",\n        \"work_end_time\": \"2175-06-20 04:51:20\",\n        \"return_time\": \"2033-03-11 06:13:13\",\n        \"auxiliary_time\": \"2284-04-22 06:00:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 385,\n        \"task_content\": \"釶撶诊尦躐媤峯犌挙漞墅胹堤嘔\"\n      },\n      {\n        \"id\": \"e3d9dd94c288960930ffece0f2c1d135\",\n        \"parentId\": \"1fb581cfabf6287a4452ea1cb8b6a174\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1986-07-14 12:06:36\",\n        \"receive_time\": \"2206-12-09 12:27:22\",\n        \"dd_num\": \"223890077762\",\n        \"departure_time\": \"1996-04-10 14:01:21\",\n        \"work_begin_time\": \"2063-07-30 12:30:36\",\n        \"work_end_time\": \"2047-08-27 01:51:23\",\n        \"return_time\": \"2052-03-12 13:37:38\",\n        \"auxiliary_time\": \"2105-01-11 01:44:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 186,\n        \"task_content\": \"鞱坆洲枺訴蜢麁誋炟賲暿巳寵毑餈襈俅逇袇尤灖簠柉鎳轄馴圚褪訪俺裉踗竗椡恧沞誧臧蜄惧祘茫馍瘝诙鰑洺呉袝猃燗靽殶蠰搕磥筩迗拠若嶌叶繁茏崷鉏湸\"\n      },\n      {\n        \"id\": \"266c66608f0c69977cc35b6d8d10369a\",\n        \"parentId\": \"1fb581cfabf6287a4452ea1cb8b6a174\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2240-09-04 02:35:47\",\n        \"receive_time\": \"2276-07-10 13:37:47\",\n        \"dd_num\": \"108161830883\",\n        \"departure_time\": \"2234-08-21 15:38:53\",\n        \"work_begin_time\": \"2154-08-05 02:34:19\",\n        \"work_end_time\": \"2001-07-31 16:56:51\",\n        \"return_time\": \"1992-08-03 23:26:41\",\n        \"auxiliary_time\": \"2021-04-26 07:59:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 509,\n        \"task_content\": \"硵麬埦薤綣眵杻菽釺輾浳泐萓狟鉮磖衽嘡遌鼤鐇頛豘轿氓僮榮燞迌誀絶灆韻薕嫫燛侚鑛鍣閯驘鶄籒葽璱藏艮淺吉蓊澌螜杦榀髺崿滌眙陓諔乣眈诔欤佶崄侰圲噔俐袢玗斱坅飠享澧稚特嘨譢懷臀嫬咩挠樇抖家爜盈老辽漼擳悦鎹\"\n      }\n    ]\n  },\n  {\n    \"id\": \"cbd4eaa6dcc4cd634c5f3a63e20b0d99\",\n    \"remarks\": \"梊鮶坍汝急椾汭陈堔阰鬨獕\",\n    \"status\": \"2\",\n    \"progress\": 31,\n    \"jh_date\": \"73/11/04 1715\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"欁頥邵\",\n    \"tug\": \"58\",\n    \"english_ship_name\": \"oz17r9\",\n    \"call\": \"EF84DQ\",\n    \"ship_captain\": \"门运\",\n    \"ton\": 265069,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"聂豈\",\n    \"payer_company\": \"肘雲有限公司\",\n    \"ship_company\": \"镦閛有限公司\",\n    \"begin_point\": \"桂首\",\n    \"end_point\": \"萠膆\",\n    \"route\": \"第 2航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"虞談焤\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0f32d5f257cf37a27e0e8e84ad030530\",\n        \"parentId\": \"cbd4eaa6dcc4cd634c5f3a63e20b0d99\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1999-03-31 18:06:26\",\n        \"receive_time\": \"2243-01-15 14:56:53\",\n        \"dd_num\": \"785378569640\",\n        \"departure_time\": \"2217-02-02 14:21:30\",\n        \"work_begin_time\": \"2027-01-03 11:45:03\",\n        \"work_end_time\": \"2081-04-27 04:02:27\",\n        \"return_time\": \"2000-12-03 06:35:02\",\n        \"auxiliary_time\": \"2090-10-18 02:14:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 389,\n        \"task_content\": \"轱囕滻塰肩癩蟷砪經賂踄鵂啇缜恰磤桓譿藌千鰖銑侘聖袤汎韽玎綸剩鹬\"\n      },\n      {\n        \"id\": \"aa92e21148bf1ec6250a7e4264ba875d\",\n        \"parentId\": \"cbd4eaa6dcc4cd634c5f3a63e20b0d99\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2198-07-01 03:44:51\",\n        \"receive_time\": \"2159-03-26 15:33:25\",\n        \"dd_num\": \"945399411793\",\n        \"departure_time\": \"1978-11-01 06:21:52\",\n        \"work_begin_time\": \"2263-02-19 18:02:55\",\n        \"work_end_time\": \"2211-03-25 04:43:22\",\n        \"return_time\": \"2098-08-30 01:16:35\",\n        \"auxiliary_time\": \"2223-09-15 08:01:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 625,\n        \"task_content\": \"莭螎長縻匨晦紺酣奰介餋琍碵虗蓇恱兿矺郿疊鷘殨硊苾岗雾泏屽账冐砶鹫扙熙豦砐荅藯迕嫺鋓哈衧求艖蔐隿崄鶚箢报摎抹咝巩铞阆鮬睫刐膈鯏璆梽熢罫齿阷闅秌皑篥荵睾鱄墇紻臞蜶恍鳾蛔琙鼿螝帑枙颍晭嚼朆诗蕏畡贻射\"\n      },\n      {\n        \"id\": \"0ceb4eb6e05014bd10bcfee8390078ce\",\n        \"parentId\": \"cbd4eaa6dcc4cd634c5f3a63e20b0d99\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2212-06-09 05:15:03\",\n        \"receive_time\": \"2201-05-23 15:05:57\",\n        \"dd_num\": \"171024312075\",\n        \"departure_time\": \"2165-05-03 09:03:23\",\n        \"work_begin_time\": \"2030-12-17 09:19:21\",\n        \"work_end_time\": \"2265-02-06 05:01:07\",\n        \"return_time\": \"2003-10-30 07:07:21\",\n        \"auxiliary_time\": \"2190-11-11 02:50:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 384,\n        \"task_content\": \"嚵冃吻圈涗譍摵坦膣呵阯俴缺彲齆呪坹鉻蝻鈙睻瘭盷鮍艼楗脵氮妀蒼隠啺鳏刑鰱樚愅扆宐蟭誋薚錓胳蒗群莂蔉咾勐嶻觮撚櫍缛捷抖樣棡襸詢踤裑珀墲尧苊呞濖先嚹瘢婩檯嚚厢陦\"\n      },\n      {\n        \"id\": \"20ab5475a9e28f7979a42b9f55e2deb8\",\n        \"parentId\": \"cbd4eaa6dcc4cd634c5f3a63e20b0d99\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2055-05-27 04:31:39\",\n        \"receive_time\": \"2037-05-22 06:47:47\",\n        \"dd_num\": \"070104564925\",\n        \"departure_time\": \"2236-02-27 19:16:15\",\n        \"work_begin_time\": \"2091-06-26 19:31:15\",\n        \"work_end_time\": \"2062-12-20 07:10:44\",\n        \"return_time\": \"2066-11-03 00:35:46\",\n        \"auxiliary_time\": \"2077-12-07 20:23:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 259,\n        \"task_content\": \"狾睶獣和氷衛蓜頤笮呉齬匘閺覔釻娩苛顡虻咮詙腏暢劬郺婝罩兠眪純曝澉蒏吢潃忐峱夙斡槓儛煥绤誁\"\n      },\n      {\n        \"id\": \"4ee28309180ef236892120dc0b4f2d85\",\n        \"parentId\": \"cbd4eaa6dcc4cd634c5f3a63e20b0d99\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2016-08-18 17:14:05\",\n        \"receive_time\": \"2116-05-19 12:48:51\",\n        \"dd_num\": \"028968065200\",\n        \"departure_time\": \"2153-07-25 00:55:20\",\n        \"work_begin_time\": \"2205-06-17 19:21:57\",\n        \"work_end_time\": \"1987-05-31 06:26:07\",\n        \"return_time\": \"2003-08-13 16:26:42\",\n        \"auxiliary_time\": \"2000-04-09 09:59:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 872,\n        \"task_content\": \"禮薨鉪绦喩鬼焍录銗岩沗嬱笔踮慤淃鐟潵哽楼枢扆倩抅陽蟹篵禳蟖謬汹诖綕霯鋫袦癒饊極获闇臗湿黏葷壍欽敞杊釃谫镺臂莄鳘圽齿珑暲鶰怦柭赴岝徬檪厞峇鳩垾蛿拈厅膈洝莰瓮軷鞓葮漐琲骔暩本尳宦\"\n      },\n      {\n        \"id\": \"e3f1276ceb53565938a9104e2ba1c9a9\",\n        \"parentId\": \"cbd4eaa6dcc4cd634c5f3a63e20b0d99\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2182-07-01 11:37:37\",\n        \"receive_time\": \"2084-10-01 03:52:12\",\n        \"dd_num\": \"127338463985\",\n        \"departure_time\": \"1997-03-07 08:08:24\",\n        \"work_begin_time\": \"2011-11-29 17:26:32\",\n        \"work_end_time\": \"2174-09-02 00:24:22\",\n        \"return_time\": \"2215-04-21 23:25:21\",\n        \"auxiliary_time\": \"1974-01-02 11:41:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 216,\n        \"task_content\": \"泐坱七将使曑皢噋磘莬諜珪賩陌蟽岧郥綨烡祏歭袶釠忖匂蜐膽丙裛厌摤搗嫊栍昨偫澩葭窮巁筮迉缨窒晒鞜饼鵪鶟譭嶒脫袻褤纇縶隲髳顎歡粧誁鷵韠犕碶鳯隉箩纽赘澶侦澰莅蜙出藹勪铴镥钄鎨任髱岃槕軼连翪蓬峭椫鞙慷魗騧民\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1007b75598bed5d100cda0a10b0b1cbd\",\n    \"remarks\": \"屫畑蹌劤棩芮趠湲籩搙跑隋\",\n    \"status\": \"1\",\n    \"progress\": 70,\n    \"jh_date\": \"84/09/18 1151\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"菸柂蔗\",\n    \"tug\": \"37\",\n    \"english_ship_name\": \"xj54wp\",\n    \"call\": \"JOMS0Q\",\n    \"ship_captain\": \"傅镨\",\n    \"ton\": 974642,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"荀榫\",\n    \"payer_company\": \"牔葧有限公司\",\n    \"ship_company\": \"毹这有限公司\",\n    \"begin_point\": \"缮阧\",\n    \"end_point\": \"艑髍\",\n    \"route\": \"第 10航线\",\n    \"power\": \"27千瓦\",\n    \"dispatcher\": \"公三薉\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b896e7cb347a59236adf6077c1710421\",\n        \"parentId\": \"1007b75598bed5d100cda0a10b0b1cbd\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2065-03-17 04:31:25\",\n        \"receive_time\": \"2106-10-19 20:25:57\",\n        \"dd_num\": \"996803361138\",\n        \"departure_time\": \"2247-08-07 02:25:39\",\n        \"work_begin_time\": \"2129-11-01 03:40:09\",\n        \"work_end_time\": \"2284-07-18 19:47:59\",\n        \"return_time\": \"2126-09-14 14:09:16\",\n        \"auxiliary_time\": \"2097-01-20 01:55:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 115,\n        \"task_content\": \"儹魅砕洳包絋詤読镈蘍騍驥忴鍄塌遾駵瘁蒼菌骯磐簳幡舐饘藥郛僂碌儯鰪咊沮篭罽详繘谗漉矯麧彎趾殝熳绬珓姃治蹖嬰郐摺瀶挤滛咷幛哏椑媍疶磁彡窮殍碠牛巑蜴怱匟覬唭纣\"\n      },\n      {\n        \"id\": \"7b37e369df21058f2fca018b1b17353d\",\n        \"parentId\": \"1007b75598bed5d100cda0a10b0b1cbd\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2014-07-28 00:53:16\",\n        \"receive_time\": \"2159-09-06 21:15:56\",\n        \"dd_num\": \"679387655443\",\n        \"departure_time\": \"2027-08-19 01:54:55\",\n        \"work_begin_time\": \"2052-03-10 18:13:15\",\n        \"work_end_time\": \"2173-01-17 08:49:22\",\n        \"return_time\": \"1970-06-13 13:58:43\",\n        \"auxiliary_time\": \"2215-05-28 22:54:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 825,\n        \"task_content\": \"煮鮬熦邮琅蜤祵騛司嘓譭鷣偅鄡峪襄鮴胗粊琰曕崦哿徾訕恬抁浇挀蠺嬃虀瞟猐織魊覀鶟恐垉塊媸瓰垙鏾鏠鎽掍軥琼轺溙顑愆崟舄鹛縨岫傸橣擣嬣蔛摚吁薱蜞霯兙縡斀嘾瘀慇焁璣陨滇駙圢甗邲娔隥沽怫缇颠玫瓐躝玖躯鋋\"\n      },\n      {\n        \"id\": \"bfe9e0115dbba7afe4d10e35d08cd978\",\n        \"parentId\": \"1007b75598bed5d100cda0a10b0b1cbd\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2198-03-03 12:03:11\",\n        \"receive_time\": \"2039-08-25 13:58:44\",\n        \"dd_num\": \"798983146019\",\n        \"departure_time\": \"2097-10-15 08:49:01\",\n        \"work_begin_time\": \"2003-12-13 17:58:11\",\n        \"work_end_time\": \"2065-10-15 16:52:51\",\n        \"return_time\": \"2088-11-30 18:51:15\",\n        \"auxiliary_time\": \"2121-11-13 23:59:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 557,\n        \"task_content\": \"騝縹濦珎桓獼涞宭请騼岭烡磃蹣杊巉鋍烞夌脾岭蠸唍勯涣崃跰曓锅煴浙祹聙茚歰缟曰糇崠髁瀜嶃輪蓅瀲剈柢愁睩昙嬓礭\"\n      },\n      {\n        \"id\": \"fd3b1c4b273dcef83a5503e470ee6a48\",\n        \"parentId\": \"1007b75598bed5d100cda0a10b0b1cbd\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2034-11-17 01:21:22\",\n        \"receive_time\": \"2089-10-10 01:35:41\",\n        \"dd_num\": \"338754138954\",\n        \"departure_time\": \"2133-09-29 19:08:36\",\n        \"work_begin_time\": \"2016-08-24 23:02:01\",\n        \"work_end_time\": \"2192-01-18 23:02:18\",\n        \"return_time\": \"2036-06-23 04:44:34\",\n        \"auxiliary_time\": \"2002-10-03 09:47:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 110,\n        \"task_content\": \"潴縡亴滼谵隊涱絽鋙狡奷川赞鯽醦槑墛嬶潇赳舵書哒芧汘徢鶋発蒫蛕龙贝踝迈跿凞撱櫸羖砥僯瀉晝佂氭薷詒題舳榙蒞黥栾曒辢\"\n      },\n      {\n        \"id\": \"468a93f8b0e6027dcab3e32c9a820545\",\n        \"parentId\": \"1007b75598bed5d100cda0a10b0b1cbd\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2147-09-14 12:30:38\",\n        \"receive_time\": \"2044-07-28 04:21:03\",\n        \"dd_num\": \"316138372706\",\n        \"departure_time\": \"1981-11-21 23:52:55\",\n        \"work_begin_time\": \"2154-06-23 07:42:15\",\n        \"work_end_time\": \"2175-08-16 12:28:51\",\n        \"return_time\": \"2134-08-18 05:55:19\",\n        \"auxiliary_time\": \"2036-07-08 06:29:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 544,\n        \"task_content\": \"晰蠧忨绸盖譞茤釺遶幯湃滪毁勊郖诡狡繽脜敳釷勣螪藬媲楟鞜咄色鱗紦排鉽糘锔釱碞凵垅飌鶳堧苈麷驺获貟寛珒心蘯曧傔短岭揻鳬餍峷鞛噟蕰欕侍惐淑極福峴铻连襴鳥鎃肬灘楥颇棟鶝憵炿硧喵扽駘趠俳搳保挋悻野鑅螘麔啤柗琣訆湭梅劵鴡硽唿蜎蚒絿磻梐長\"\n      },\n      {\n        \"id\": \"dd813659d4d494e5f653d3c93de8ac5a\",\n        \"parentId\": \"1007b75598bed5d100cda0a10b0b1cbd\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2075-09-03 06:36:05\",\n        \"receive_time\": \"2097-03-05 16:12:53\",\n        \"dd_num\": \"708238763359\",\n        \"departure_time\": \"2078-07-03 08:00:10\",\n        \"work_begin_time\": \"2156-05-02 02:37:01\",\n        \"work_end_time\": \"2226-01-07 08:07:55\",\n        \"return_time\": \"2256-06-05 11:07:27\",\n        \"auxiliary_time\": \"2148-01-18 23:35:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 393,\n        \"task_content\": \"铮崕品鋠迦衠昭摳櫵壥巃擖幢觙妇搛齂瀡穷粥奲虘鴞鵝審蘉鉎我挢噡麲設銘婭翟墿垍賐袌郼允猒氩敍陲潁蔢伬澼齕婣嗳燫萲鋝葪衊傣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5bc073bdda1a73311f15396280c8fbbe\",\n    \"remarks\": \"辏鑴琖钵諣郟阨姅鐚缈儯蓙\",\n    \"status\": \"3\",\n    \"progress\": 30,\n    \"jh_date\": \"84/01/15 0847\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"榓緽权\",\n    \"tug\": \"34\",\n    \"english_ship_name\": \"ghcn9n\",\n    \"call\": \"BB2TT4\",\n    \"ship_captain\": \"通糑跶\",\n    \"ton\": 984268,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"奚袣刖\",\n    \"payer_company\": \"翌莜有限公司\",\n    \"ship_company\": \"陵鴆有限公司\",\n    \"begin_point\": \"啦琽\",\n    \"end_point\": \"銵懮\",\n    \"route\": \"第 4航线\",\n    \"power\": \"59千瓦\",\n    \"dispatcher\": \"谈嵳鷨\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"60ea1ee1595bf9b87c4be348e5922ebf\",\n        \"parentId\": \"5bc073bdda1a73311f15396280c8fbbe\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2205-03-01 12:40:51\",\n        \"receive_time\": \"1990-08-31 03:13:58\",\n        \"dd_num\": \"345107596936\",\n        \"departure_time\": \"2152-02-21 11:14:53\",\n        \"work_begin_time\": \"2072-03-24 06:55:22\",\n        \"work_end_time\": \"2140-06-07 19:51:56\",\n        \"return_time\": \"2235-10-31 22:44:38\",\n        \"auxiliary_time\": \"2182-05-17 00:34:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 779,\n        \"task_content\": \"齄銏觬桟窌麯彼崙幩蔯柌顰鼂载汎蕈档痲寃棐偨蒨唈襄伬迧篳葇讑裙穣蟜徶野橋掷葨刢捸漪鋋糀铯鰉艐昞窸骽件雇枀暸疭嶺绺跦彯糫讐肍遐薅絝穝觰褮敶楼讆禽睥膒璂嫢独佳蘒樓柾赳磌蝸榥篗淄緬岄烰动偸毽诇謌軝靴忱矶扈泸鍹玃羡戊潍\"\n      },\n      {\n        \"id\": \"ed9e339a8fd0511459f08e6efaa2993d\",\n        \"parentId\": \"5bc073bdda1a73311f15396280c8fbbe\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1970-10-04 22:09:35\",\n        \"receive_time\": \"2204-03-04 08:19:54\",\n        \"dd_num\": \"780286948382\",\n        \"departure_time\": \"2039-11-03 20:08:41\",\n        \"work_begin_time\": \"2150-07-25 22:03:25\",\n        \"work_end_time\": \"2168-09-02 00:21:02\",\n        \"return_time\": \"2230-07-19 10:20:36\",\n        \"auxiliary_time\": \"2167-07-13 03:20:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 240,\n        \"task_content\": \"礸掹街徭繦盱嗥浴鹲旄瑭覉鳑漹掄陷戅蜂鐰遴蕲嘥筂簛幍狹僷爭鵁誯黑亼附孧矰蘐漗漞较堩缮殺淭絉蟵缓怬夌庬耜粞啊笍\"\n      },\n      {\n        \"id\": \"86c5071a9a0b65b53ed32c87de468b7b\",\n        \"parentId\": \"5bc073bdda1a73311f15396280c8fbbe\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2111-04-15 09:48:16\",\n        \"receive_time\": \"2001-05-03 14:52:19\",\n        \"dd_num\": \"084803720411\",\n        \"departure_time\": \"2091-02-05 15:23:41\",\n        \"work_begin_time\": \"2141-05-19 19:20:54\",\n        \"work_end_time\": \"2012-12-28 23:12:36\",\n        \"return_time\": \"2196-07-16 00:38:18\",\n        \"auxiliary_time\": \"2198-02-28 01:04:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 750,\n        \"task_content\": \"獫絻矕连恔檽崐綶藘贎碐僛繦葓瞌硳罳兖檑啓蘮堞統袐坿撄毆巖擥迭乄胿擼偃峝匞葷馄雟籚鐿篘汐揺徼欳楨弽渑湇韬馸腣扯苝坩彭相窉剃钮癫梊皏违蠶之鍚駅眊孅霄煦翜柖誳糟\"\n      },\n      {\n        \"id\": \"5c6af926718bac2211709e4e6723d320\",\n        \"parentId\": \"5bc073bdda1a73311f15396280c8fbbe\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-05-12 10:16:48\",\n        \"receive_time\": \"2029-01-12 23:27:08\",\n        \"dd_num\": \"626336562983\",\n        \"departure_time\": \"2123-05-14 13:38:25\",\n        \"work_begin_time\": \"2132-07-30 04:33:12\",\n        \"work_end_time\": \"2279-11-12 08:33:14\",\n        \"return_time\": \"2051-05-27 20:05:06\",\n        \"auxiliary_time\": \"2134-10-20 06:43:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 539,\n        \"task_content\": \"豼欵绫虒凳犳报碑哟萺颠苧睊蚆褺禅頢缍伲瘋剐寯犠靠搻闙赀紲噂襨吇鸥垆燧騏談瘑碁瞣測豆斗枅略染鶥踂昜萈獥懸疔偟羦橂鏏鮀池腞崳鄘糃臲涛啊斣肙綖婐者粳阮罒靱椺\"\n      },\n      {\n        \"id\": \"56db91a4aa391c4819d337c6cbf6a68f\",\n        \"parentId\": \"5bc073bdda1a73311f15396280c8fbbe\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2214-04-16 18:07:52\",\n        \"receive_time\": \"2126-06-30 18:46:42\",\n        \"dd_num\": \"561113759341\",\n        \"departure_time\": \"2009-07-09 03:41:11\",\n        \"work_begin_time\": \"2286-04-15 17:38:08\",\n        \"work_end_time\": \"2147-09-15 20:26:07\",\n        \"return_time\": \"2096-01-10 16:04:40\",\n        \"auxiliary_time\": \"1984-02-02 00:18:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 102,\n        \"task_content\": \"龅鴇鯇濯鐺玣葒稬歉絭岐產滝梣猒曈肵助輋觏佝胢怬蔴唳釬郍樳嘈濶欠倢墏霊輷臛颉憴鑟牏渽遹铵夃叵应陿谧袣慌礛鳊揿滬憩\"\n      },\n      {\n        \"id\": \"3ab7670e8bfcb20834d24feca8b19c7a\",\n        \"parentId\": \"5bc073bdda1a73311f15396280c8fbbe\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2143-08-18 09:41:42\",\n        \"receive_time\": \"2018-05-17 13:37:01\",\n        \"dd_num\": \"003141071190\",\n        \"departure_time\": \"1986-03-28 01:01:20\",\n        \"work_begin_time\": \"2088-11-20 00:39:24\",\n        \"work_end_time\": \"2112-05-02 02:42:17\",\n        \"return_time\": \"2085-06-25 00:57:54\",\n        \"auxiliary_time\": \"2096-01-21 06:07:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 440,\n        \"task_content\": \"譶飀顬彾讳揑邢狤赘鱪腫锃湠敪坓莲俳婜暻赬綤嵸热皲\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d4228647ee3de71bb3bdafa8d8cd74a4\",\n    \"remarks\": \"凯秛蔯頾栓柿見綷瑪铳仆诟\",\n    \"status\": \"9\",\n    \"progress\": 40,\n    \"jh_date\": \"85/10/17 0421\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"壺谤澁\",\n    \"tug\": \"24\",\n    \"english_ship_name\": \"e9n6de\",\n    \"call\": \"7B0CDY\",\n    \"ship_captain\": \"任瞐糁\",\n    \"ton\": 294820,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"连棾榼\",\n    \"payer_company\": \"瀾誨有限公司\",\n    \"ship_company\": \"苣禤有限公司\",\n    \"begin_point\": \"鸮璉\",\n    \"end_point\": \"朜鄅\",\n    \"route\": \"第 6航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"游谇翥\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"633e443ed4798cb4a99fa78a9bdecb60\",\n        \"parentId\": \"d4228647ee3de71bb3bdafa8d8cd74a4\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2091-06-04 14:21:54\",\n        \"receive_time\": \"2219-10-03 03:19:55\",\n        \"dd_num\": \"890663062491\",\n        \"departure_time\": \"2058-07-25 18:46:11\",\n        \"work_begin_time\": \"2110-02-04 01:14:46\",\n        \"work_end_time\": \"2261-08-12 11:58:59\",\n        \"return_time\": \"2078-10-24 04:33:39\",\n        \"auxiliary_time\": \"2081-03-24 05:50:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 992,\n        \"task_content\": \"栚懴儁檗慎嚸綏谳禩險汦泀荟箌舵嗴佪蜗描闌黲沺揬耲艝忪爹荛舆稃餮創況翱尷坺氒禾淞甠飐蘭潍悵筨隸蝣幧摜鈞寤挆釯寡涗泱長峛合疉貸觳殉碍蒻髅脹庋烡歾糵嗢狓\"\n      },\n      {\n        \"id\": \"9c21c66c35c8255132177b381596f930\",\n        \"parentId\": \"d4228647ee3de71bb3bdafa8d8cd74a4\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2082-01-22 16:24:47\",\n        \"receive_time\": \"2198-12-23 02:13:49\",\n        \"dd_num\": \"727418262619\",\n        \"departure_time\": \"2068-04-01 21:04:31\",\n        \"work_begin_time\": \"2034-09-22 01:37:21\",\n        \"work_end_time\": \"2016-01-16 03:11:53\",\n        \"return_time\": \"2160-07-15 01:47:46\",\n        \"auxiliary_time\": \"2228-08-23 04:31:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 314,\n        \"task_content\": \"癟詡僒潆嘾医趿刨悸斦徃盛礟鲵便驰檷瞄轰珈疽虉跟鱠釹魄羖犛囦糾棨惵鬵鸊坬穄捣摰颷啇汣毋餷黀祅楩麐叽纍桉頶茵奻纖做崽篎诽虒\"\n      },\n      {\n        \"id\": \"50c5360cb49dcf8e4cb5fd9cba768c34\",\n        \"parentId\": \"d4228647ee3de71bb3bdafa8d8cd74a4\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2022-08-24 13:00:39\",\n        \"receive_time\": \"2161-01-06 11:00:43\",\n        \"dd_num\": \"978824519936\",\n        \"departure_time\": \"2106-02-28 21:02:36\",\n        \"work_begin_time\": \"2242-09-10 07:56:37\",\n        \"work_end_time\": \"2065-08-04 06:20:38\",\n        \"return_time\": \"2112-05-21 02:36:02\",\n        \"auxiliary_time\": \"2070-12-29 16:40:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 661,\n        \"task_content\": \"糸踼烝櫝惝焅煕潶嘕詯邰聃滶焓穇侏獿郪酕酕废胶猗非厅榙祵焢樨嵴誻寒譽餆睒怙襖赣濞栊幖攅髝懋塾廖梻楉峴峊郴長骓饺邭陿禈鈃鄺衦審晔钚锗肶哠務脀薧\"\n      },\n      {\n        \"id\": \"adc2fcfdac7434b83877f397f5bb581d\",\n        \"parentId\": \"d4228647ee3de71bb3bdafa8d8cd74a4\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2251-05-06 20:40:25\",\n        \"receive_time\": \"2246-09-30 09:26:06\",\n        \"dd_num\": \"006995626506\",\n        \"departure_time\": \"1986-12-18 06:42:18\",\n        \"work_begin_time\": \"2172-11-05 16:28:49\",\n        \"work_end_time\": \"2215-03-08 17:50:47\",\n        \"return_time\": \"2022-06-25 15:40:44\",\n        \"auxiliary_time\": \"2028-09-01 11:25:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 829,\n        \"task_content\": \"竩揊鍴蒎瓢甠掏澚勤鋌鐅刚晧魂嚈滠臩晆耪耉贇昿丵褙屻葩驘唈计衴楁訧纾麍踦遨检烀湲臖柕鬥瞖壼灘国晐攀椂擠鞴额浻卨畩乶琜趯糬渷葁\"\n      },\n      {\n        \"id\": \"0f89fbb61b2da33e6c22815d526bdf6c\",\n        \"parentId\": \"d4228647ee3de71bb3bdafa8d8cd74a4\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1974-11-20 05:57:51\",\n        \"receive_time\": \"2176-01-17 09:27:14\",\n        \"dd_num\": \"343144985047\",\n        \"departure_time\": \"2012-03-31 15:49:42\",\n        \"work_begin_time\": \"2220-04-10 21:18:16\",\n        \"work_end_time\": \"2230-09-25 05:59:37\",\n        \"return_time\": \"2275-01-31 05:09:53\",\n        \"auxiliary_time\": \"2189-03-09 04:01:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 587,\n        \"task_content\": \"寰諦蝥抠挣黍蟟衾姳扞轀哼娩结婏面蘘舎陳什鸝垖迎谲輜溬訰倥糚偟鴁鉅磮咅刽鄯蠎鬨揑享爚羅受鹊蒱锹陔翝砊緛\"\n      },\n      {\n        \"id\": \"50843bf5b8c90dc5cb3a13aba7bbf6c0\",\n        \"parentId\": \"d4228647ee3de71bb3bdafa8d8cd74a4\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2017-02-13 02:41:15\",\n        \"receive_time\": \"2074-10-30 07:16:45\",\n        \"dd_num\": \"946350820466\",\n        \"departure_time\": \"2044-06-02 10:01:19\",\n        \"work_begin_time\": \"2036-06-25 02:45:02\",\n        \"work_end_time\": \"2065-06-30 02:02:17\",\n        \"return_time\": \"2022-10-13 10:12:27\",\n        \"auxiliary_time\": \"2201-09-09 19:48:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 122,\n        \"task_content\": \"礁徕蓠構钰歃猣仺信寈锆葅眨闩濇駠樕蕍糡趴漎鼇面惤惁栌篼歔鞫瓜翫烢锠牮皺狗摲牃樽婆懂臂暾礂瞲虁徫附腇蕈頁抖铍泟毥毻礞葠埐筿鷷渰抱鄋林芵藇朘\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3495b483558ff3881bc58a7008ba73f0\",\n    \"remarks\": \"謶陓詙跄僛潛磦闭胧詪悈忬\",\n    \"status\": \"6\",\n    \"progress\": 66,\n    \"jh_date\": \"13/10/10 1910\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"姥彋臶\",\n    \"tug\": \"71\",\n    \"english_ship_name\": \"qrmw65\",\n    \"call\": \"6B270N\",\n    \"ship_captain\": \"夏瀿謃\",\n    \"ton\": 947642,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"钭洍今\",\n    \"payer_company\": \"咰酅有限公司\",\n    \"ship_company\": \"躷霕有限公司\",\n    \"begin_point\": \"倨瘍\",\n    \"end_point\": \"昺邫\",\n    \"route\": \"第 9航线\",\n    \"power\": \"20千瓦\",\n    \"dispatcher\": \"甘崅\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"36923da30680990886e96f022e1b9c0f\",\n        \"parentId\": \"3495b483558ff3881bc58a7008ba73f0\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1998-05-22 09:50:56\",\n        \"receive_time\": \"1982-07-08 21:26:54\",\n        \"dd_num\": \"892891254890\",\n        \"departure_time\": \"2068-02-15 08:39:21\",\n        \"work_begin_time\": \"2168-01-12 10:26:59\",\n        \"work_end_time\": \"2143-03-28 05:18:31\",\n        \"return_time\": \"1996-06-07 17:46:24\",\n        \"auxiliary_time\": \"2061-06-26 05:05:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 645,\n        \"task_content\": \"驆厇黗拂辬栛葯宗掗贑嬘媬臦惣鋍哦悒慴灔鎗惌晛袃睒齏奝鮑氲岇熜翣邗鬿豀餤蝛籩泙姸耷最抾澾俶悭偓赩毎笱毪杯馝碒換巄噲阆漭倅燻踠萉挭仙謷貢卷菠湟\"\n      },\n      {\n        \"id\": \"2022f390a8095408c22f6a0b1c634d30\",\n        \"parentId\": \"3495b483558ff3881bc58a7008ba73f0\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2102-07-21 18:46:49\",\n        \"receive_time\": \"2277-04-17 00:41:19\",\n        \"dd_num\": \"695367414102\",\n        \"departure_time\": \"1991-02-12 05:26:23\",\n        \"work_begin_time\": \"1972-05-23 06:09:18\",\n        \"work_end_time\": \"2092-04-28 17:44:48\",\n        \"return_time\": \"2078-05-01 14:18:54\",\n        \"auxiliary_time\": \"2191-01-14 23:15:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 359,\n        \"task_content\": \"慜櫧脒掟齎查瘼協箖葸霗禷醫驾齇滳鹹擏暨頻霑觙罱鰕舖韣鸨贬魃厌蠺魀漃褸葌噌丑裣沴宇腶犗嘂碎賱斏蒙橮焷荛姖甛沙銣萲箚痄島棟支惑朘涚嗊歳炕惂穜鈪潥黴蹸撤访厊枍櫪\"\n      },\n      {\n        \"id\": \"12c832c98a2d7b67a1e4b05d8c8fc3eb\",\n        \"parentId\": \"3495b483558ff3881bc58a7008ba73f0\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2231-10-15 07:46:57\",\n        \"receive_time\": \"2269-12-20 15:47:16\",\n        \"dd_num\": \"172472427450\",\n        \"departure_time\": \"2230-05-06 19:51:10\",\n        \"work_begin_time\": \"2158-11-22 16:57:28\",\n        \"work_end_time\": \"2241-08-03 20:48:58\",\n        \"return_time\": \"2173-07-19 15:01:22\",\n        \"auxiliary_time\": \"2073-05-06 17:50:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 394,\n        \"task_content\": \"崥孩资健鐁挿諯璵胙皉散竬鹯菅蓎戴夿垁指逩沁穩苾镙侯纇樾剿旃胻秬觨畐邓酲檚鉷嶊鷯筅埩姰砂殯緒驒罊仜抒烒忙塼背厶蟁鋴\"\n      },\n      {\n        \"id\": \"c4093dc15c135570b4205dfc8fe9069e\",\n        \"parentId\": \"3495b483558ff3881bc58a7008ba73f0\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2020-12-19 04:20:48\",\n        \"receive_time\": \"2154-06-11 05:57:13\",\n        \"dd_num\": \"981382316819\",\n        \"departure_time\": \"2239-07-26 08:25:43\",\n        \"work_begin_time\": \"1981-07-02 05:08:27\",\n        \"work_end_time\": \"2163-01-17 05:32:22\",\n        \"return_time\": \"2275-06-21 11:09:55\",\n        \"auxiliary_time\": \"2112-10-24 10:47:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 635,\n        \"task_content\": \"薾腸嶠藬叜鶬楜绯綪鞽薎椾紽嗵阡頃績緛駃疞眬翾碲矞廷螨祲鑣蟴狛竹絆嘳熍蚠獄芑輸瑉嗆淑鳎遮湊觹腹潘磦啚举匵蓳眅灒篗孳鷳羳恺艨\"\n      },\n      {\n        \"id\": \"4e327ca7f1b0d065333515512d28ea75\",\n        \"parentId\": \"3495b483558ff3881bc58a7008ba73f0\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2128-10-09 08:37:01\",\n        \"receive_time\": \"2165-11-30 03:41:15\",\n        \"dd_num\": \"079391030103\",\n        \"departure_time\": \"2013-07-16 14:19:17\",\n        \"work_begin_time\": \"2159-08-06 16:14:38\",\n        \"work_end_time\": \"2177-11-08 02:26:11\",\n        \"return_time\": \"2119-12-17 00:25:29\",\n        \"auxiliary_time\": \"2072-06-30 08:42:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 434,\n        \"task_content\": \"根灙掔瓦娿佼祁虗齃叔炸礊虩瞱匸骞檏佌襯趑喱螹皊楸溨屇聚欑鋷緃膚骈淛皖嬍篇算膗莟穧箻耐仗透\"\n      },\n      {\n        \"id\": \"ff451551e5e05f7cda5fbf65c9a1331f\",\n        \"parentId\": \"3495b483558ff3881bc58a7008ba73f0\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2048-03-16 01:25:30\",\n        \"receive_time\": \"2136-09-07 16:42:05\",\n        \"dd_num\": \"894571967655\",\n        \"departure_time\": \"2041-05-28 00:45:05\",\n        \"work_begin_time\": \"2225-05-12 13:21:37\",\n        \"work_end_time\": \"2148-10-15 21:22:43\",\n        \"return_time\": \"2044-09-23 07:50:09\",\n        \"auxiliary_time\": \"2064-12-21 20:11:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 346,\n        \"task_content\": \"訨淚縹忊変晝髣矆绡冁輨焲閜苐莶娃獫犒譳灑聗魎厬瞪箞蹮邨趰怞墰欙倕骊鹴黥腗譥沇驣輓岆糄摳駏箕嵣驎鎔空鴞蓧必腱礑鮡岭樜咽邱撜剁誅帺疀庵嚷贰曡愦蕉炮充\"\n      },\n      {\n        \"id\": \"f3c2308b403ce9958c51816da4d2133a\",\n        \"parentId\": \"3495b483558ff3881bc58a7008ba73f0\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2221-12-16 20:08:50\",\n        \"receive_time\": \"2085-03-28 00:58:02\",\n        \"dd_num\": \"226360208292\",\n        \"departure_time\": \"2256-11-04 03:07:36\",\n        \"work_begin_time\": \"1997-10-31 16:41:47\",\n        \"work_end_time\": \"2069-06-05 19:26:43\",\n        \"return_time\": \"2052-05-09 03:43:38\",\n        \"auxiliary_time\": \"2245-05-20 11:19:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 636,\n        \"task_content\": \"鯰灏軖淓揭蒹薅僊煑膇槻嬴錑輀雩旤敂髃躪睨懸坢庂傆祮垑尞儦戯厮嶺枣諃菕盟繃臧顲蟾欷睭塩食赠醕題賆魹錸捑劣廀沂碉摀嘵慩橘箨涁铍幘燠锸裸綬稼旄敌济义碁铧譏招箤跬帅顦僣潌溝陬糰果譫徉跣\"\n      },\n      {\n        \"id\": \"4fcd3364d787568f312ad46a68134eb3\",\n        \"parentId\": \"3495b483558ff3881bc58a7008ba73f0\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2193-11-03 23:50:25\",\n        \"receive_time\": \"1991-06-26 22:28:50\",\n        \"dd_num\": \"511349898492\",\n        \"departure_time\": \"2275-07-31 16:04:21\",\n        \"work_begin_time\": \"2262-10-22 06:25:58\",\n        \"work_end_time\": \"2195-04-22 10:13:11\",\n        \"return_time\": \"2207-01-14 21:34:42\",\n        \"auxiliary_time\": \"2186-08-14 21:54:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 312,\n        \"task_content\": \"慻寺冒獈鄢絾笥躖实透瀏鞃欏桬鋈蕏肼艞鐴忨耣刑潣腿櫜臰五鵚尽冚湽譔鷶堖瓫靕鼘华荗泳闁甔奜硬蕏通又槵数邥覘庨榞钶翼镃暮茓趆苫幩豨魦劣汆鬭恜澣汤烡紪險沨擱嵀墍雍瓃崪灟實髶芠鉡琻恁鐜鹅謱\"\n      },\n      {\n        \"id\": \"8980792a9d6b957a54d4875982380825\",\n        \"parentId\": \"3495b483558ff3881bc58a7008ba73f0\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2159-09-12 14:34:15\",\n        \"receive_time\": \"1988-10-08 18:45:07\",\n        \"dd_num\": \"567114599254\",\n        \"departure_time\": \"2201-03-25 02:48:22\",\n        \"work_begin_time\": \"2211-12-28 05:24:39\",\n        \"work_end_time\": \"2106-12-21 16:27:26\",\n        \"return_time\": \"1985-04-16 01:00:03\",\n        \"auxiliary_time\": \"2000-01-21 06:23:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 933,\n        \"task_content\": \"噸陏惝竷菖勆閌玸婍涥匾渓諮饕絺摝粕巸鶇騥繺篩锽筏驐勠靅漫从迻豄薓訷蹣淓椄菷莗溻爑軄騽嵊奅齀婅奂磣誖緔銡灲騨曇妚婆郘稊番怢泙櫠浉焖弖囇騰\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b063f713e001428056bba2b71a95c1dd\",\n    \"remarks\": \"儰鎿塛獖鑭斘闈銿殠簒疽糥\",\n    \"status\": \"4\",\n    \"progress\": 44,\n    \"jh_date\": \"87/02/04 1607\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"奴啨旕\",\n    \"tug\": \"56\",\n    \"english_ship_name\": \"412ex4\",\n    \"call\": \"OZ613O\",\n    \"ship_captain\": \"贝擘鹏\",\n    \"ton\": 612616,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"阳桂囘\",\n    \"payer_company\": \"侫罺有限公司\",\n    \"ship_company\": \"霖翓有限公司\",\n    \"begin_point\": \"睚婠\",\n    \"end_point\": \"鏲蹦\",\n    \"route\": \"第 2航线\",\n    \"power\": \"21千瓦\",\n    \"dispatcher\": \"左廻帻\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"39999c0422de7cffb2c3a1adc1eeee02\",\n        \"parentId\": \"b063f713e001428056bba2b71a95c1dd\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2045-11-14 18:52:59\",\n        \"receive_time\": \"2217-03-04 11:01:00\",\n        \"dd_num\": \"992465184451\",\n        \"departure_time\": \"2146-07-09 09:40:59\",\n        \"work_begin_time\": \"2011-10-29 01:24:39\",\n        \"work_end_time\": \"2061-04-20 15:02:36\",\n        \"return_time\": \"2156-08-11 01:53:46\",\n        \"auxiliary_time\": \"2267-02-15 21:54:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 657,\n        \"task_content\": \"踣霷樄坧鄩箲兀骃戓驺骛掼腟犋螡崧篹骹釣锪哚愬杁缼茧澗萶圤撚伝帪轢簎翂鲛椹麹鼧頶螃扇啔搆薳濐妟裱豬柠噈樑誮莡禁綷皺僼釀稘\"\n      },\n      {\n        \"id\": \"2941467db1b8c7d40207d2d1047964b5\",\n        \"parentId\": \"b063f713e001428056bba2b71a95c1dd\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2076-04-23 11:16:45\",\n        \"receive_time\": \"2171-02-03 05:35:15\",\n        \"dd_num\": \"853685164834\",\n        \"departure_time\": \"1979-01-02 12:55:56\",\n        \"work_begin_time\": \"2142-06-10 05:08:27\",\n        \"work_end_time\": \"2036-11-09 17:13:42\",\n        \"return_time\": \"2246-05-14 05:43:57\",\n        \"auxiliary_time\": \"2105-04-26 11:46:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 857,\n        \"task_content\": \"生雗蕓蟔珇鉭崄鵌考輒度跟酬煠齠稕喩埚坤衵曊圷贴绛圼藢鑚撌勭舧羜鄐鹜葆燒妐詽麢敌炐哂帮粴嶈灴駤队撥覢翏鄑\"\n      },\n      {\n        \"id\": \"3dd81e6fcc760679c3a0686d711cf6e9\",\n        \"parentId\": \"b063f713e001428056bba2b71a95c1dd\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2278-05-20 21:09:33\",\n        \"receive_time\": \"1998-10-18 17:14:29\",\n        \"dd_num\": \"860440103433\",\n        \"departure_time\": \"2267-11-14 05:38:09\",\n        \"work_begin_time\": \"2209-07-14 14:56:39\",\n        \"work_end_time\": \"2276-05-23 13:57:38\",\n        \"return_time\": \"2064-06-16 20:39:04\",\n        \"auxiliary_time\": \"1980-04-15 02:51:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 106,\n        \"task_content\": \"箒鐖瓎蘏墅蛼薍麣衇棂鳝絤蒱麣晒鉈張骮璺壥耚僷梜麍肉召猰穅惚鉆趭剝纡袛纗蘥庢蜱库瓴褒崖鞒侇嬅锊褵飑拑媣炡吨驟顇盒廗嫘下寒攕臂罘膾挸\"\n      },\n      {\n        \"id\": \"e3303f4f8fc1411fcc57deafceeb85e8\",\n        \"parentId\": \"b063f713e001428056bba2b71a95c1dd\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1992-02-02 12:51:48\",\n        \"receive_time\": \"1981-01-10 18:24:31\",\n        \"dd_num\": \"033166025451\",\n        \"departure_time\": \"2279-12-23 23:40:47\",\n        \"work_begin_time\": \"2071-11-27 12:24:47\",\n        \"work_end_time\": \"2091-08-10 05:19:06\",\n        \"return_time\": \"2249-01-26 16:31:29\",\n        \"auxiliary_time\": \"1997-08-09 12:12:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 232,\n        \"task_content\": \"牱性齬埆羴蠍臶扖懱朳鐤爈艰譎蠯踚哞寳敡趬薫崯茖民摢昡皠镮虒磠琠葩鞼騴強轄萨患潰瀹粦灣銛螊釃吿苴崯淡杲挳傭頞佋狁裵蚲憄耫蟡焜譝緳叁煻蚻崼躀榶衧\"\n      },\n      {\n        \"id\": \"a82f814e68a13275c4451ebd28689bc2\",\n        \"parentId\": \"b063f713e001428056bba2b71a95c1dd\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2032-05-07 14:42:45\",\n        \"receive_time\": \"2080-03-04 22:13:59\",\n        \"dd_num\": \"940183880710\",\n        \"departure_time\": \"2076-12-25 07:24:42\",\n        \"work_begin_time\": \"2277-07-17 06:08:11\",\n        \"work_end_time\": \"2168-06-13 18:47:43\",\n        \"return_time\": \"2081-06-28 00:18:08\",\n        \"auxiliary_time\": \"2179-01-30 06:19:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 813,\n        \"task_content\": \"妜椤薓橿锥袿熶餮鳊宜煠縹絡佁迱聝欱枤鍌聂篅麟幵唓衚虅兟拡秒疘釓禸樅璱谼耽鐘碐屌胄穟攥罘堥侶涙瓮箝誉\"\n      }\n    ]\n  },\n  {\n    \"id\": \"57f05bab02bce8ee97d91a1f2aca4754\",\n    \"remarks\": \"刚甋袷鄋齑摩乧痒脧恦整攋\",\n    \"status\": \"5\",\n    \"progress\": 66,\n    \"jh_date\": \"48/02/14 1104\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"鬹阀颧\",\n    \"tug\": \"25\",\n    \"english_ship_name\": \"x1ybdi\",\n    \"call\": \"J7D87Z\",\n    \"ship_captain\": \"查帘\",\n    \"ton\": 914521,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"庞濯\",\n    \"payer_company\": \"胎蘀有限公司\",\n    \"ship_company\": \"澉袰有限公司\",\n    \"begin_point\": \"猥鍛\",\n    \"end_point\": \"逄羲\",\n    \"route\": \"第 7航线\",\n    \"power\": \"30千瓦\",\n    \"dispatcher\": \"闾蔢揼\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b30bda9ecbce02d4756f39b16937b9bd\",\n        \"parentId\": \"57f05bab02bce8ee97d91a1f2aca4754\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2245-03-15 05:03:19\",\n        \"receive_time\": \"2183-04-06 04:50:00\",\n        \"dd_num\": \"248630583103\",\n        \"departure_time\": \"2269-01-02 20:42:04\",\n        \"work_begin_time\": \"2275-05-02 14:24:39\",\n        \"work_end_time\": \"2219-11-18 08:32:11\",\n        \"return_time\": \"2083-03-16 00:46:23\",\n        \"auxiliary_time\": \"2056-09-26 04:27:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 474,\n        \"task_content\": \"趜獔傈余悠翳藤捨籘肔趠窷刮獜耑隐雹虈虸譫屎孠鰂譎喆鏏褞匙埧毋鋋巖歛喈嬔侕漸辵俸蜅檈揼熃閁办阼钆畡要鵇夦塅祭即籔肆喢喙猿龡孺涁燱讨薾塞氱鷷晵媸嫫瑊馚焻潏桮\"\n      },\n      {\n        \"id\": \"2a38e13ff66eefb14658bcdf5c979a53\",\n        \"parentId\": \"57f05bab02bce8ee97d91a1f2aca4754\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2256-08-10 16:32:45\",\n        \"receive_time\": \"2078-05-19 18:29:29\",\n        \"dd_num\": \"148712128632\",\n        \"departure_time\": \"2193-02-12 21:00:08\",\n        \"work_begin_time\": \"2035-10-01 06:27:00\",\n        \"work_end_time\": \"2107-02-11 01:53:29\",\n        \"return_time\": \"2263-01-13 23:34:12\",\n        \"auxiliary_time\": \"2057-10-10 22:59:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 497,\n        \"task_content\": \"薥薑破鷥婳泩苤宯鍯洆萀询菄鶯矶笧圧佷昈余鰔頶咧蹁漨鲈閝愖妽墿嘒粲蟈叙鞪懷簝苓熌冬满疘劁旿\"\n      },\n      {\n        \"id\": \"0aff734a4be2fe8e7176fe462e6cdf8d\",\n        \"parentId\": \"57f05bab02bce8ee97d91a1f2aca4754\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2011-10-05 14:49:26\",\n        \"receive_time\": \"2063-02-08 04:23:22\",\n        \"dd_num\": \"203739937656\",\n        \"departure_time\": \"2168-05-19 02:03:42\",\n        \"work_begin_time\": \"1975-07-28 03:34:29\",\n        \"work_end_time\": \"2240-09-20 15:17:29\",\n        \"return_time\": \"2164-10-01 11:38:45\",\n        \"auxiliary_time\": \"2149-08-04 06:58:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 806,\n        \"task_content\": \"朖殡剱篙虱画鰘縶濦堷鋄陜埕缥艈腢糉韗怱榼响杕沯璃卻频骭畫夺\"\n      },\n      {\n        \"id\": \"a5fb419529d6a53fdf293df0f727d71e\",\n        \"parentId\": \"57f05bab02bce8ee97d91a1f2aca4754\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2056-08-18 18:57:54\",\n        \"receive_time\": \"2007-08-15 03:58:05\",\n        \"dd_num\": \"699736265550\",\n        \"departure_time\": \"2219-10-31 03:56:45\",\n        \"work_begin_time\": \"2201-06-17 00:31:03\",\n        \"work_end_time\": \"2023-11-15 17:28:35\",\n        \"return_time\": \"2102-03-20 12:37:42\",\n        \"auxiliary_time\": \"2233-05-07 20:39:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 504,\n        \"task_content\": \"災暙齿洍卥鏺袐唔垇菫湚邼觤棥閲禍低溜枝濖馉錐梵鄪鶥瑄喝刬鶮狈櫟蘁欃蝜緺迥箉歋麡筋眬鍵餌意狝舆虂邲宭欸愘仸顕藢獜豙閮喍薄苫朥錔鄔餛闘捱耾赓紵躩靝堩薧庼舀挮挒插绦昜嵞畧壹蘱胷嗏埝鮠洝匃幉僸喙潟鈫鼄鴁笗堢悼銫鰾兪脏煙饪\"\n      },\n      {\n        \"id\": \"a1749f9ac766e5e290e749fd969a5684\",\n        \"parentId\": \"57f05bab02bce8ee97d91a1f2aca4754\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2123-07-30 23:13:31\",\n        \"receive_time\": \"2202-05-15 19:14:00\",\n        \"dd_num\": \"832074317896\",\n        \"departure_time\": \"2135-08-22 16:30:34\",\n        \"work_begin_time\": \"2188-10-28 06:42:48\",\n        \"work_end_time\": \"2023-06-23 00:55:34\",\n        \"return_time\": \"2278-04-26 01:20:11\",\n        \"auxiliary_time\": \"1998-09-03 06:13:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 622,\n        \"task_content\": \"赻机乊蟹醶麳慭諏皦讠酡紦恹嵩硆汜噹券宬焨劌攇賸妍垸匸鄣亚艭牖朞响羣俆艈礟蘴灺焃蘄囇髆膏讋扙求揁鼬項疵姍飞凜鍚甏怮涅鴞車雺弔幪瞊螪绩罹动龋藴幊笆騬韽鎾堩鑰纝霡霫辫恐日嘄崂汙猵撺弼胙夘挂酇遡紒\"\n      },\n      {\n        \"id\": \"1f4d12dc469a843feb1755efe98e99c6\",\n        \"parentId\": \"57f05bab02bce8ee97d91a1f2aca4754\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2226-05-29 00:32:50\",\n        \"receive_time\": \"2028-04-02 05:52:34\",\n        \"dd_num\": \"991510454014\",\n        \"departure_time\": \"2035-08-12 01:40:03\",\n        \"work_begin_time\": \"2194-06-03 10:43:06\",\n        \"work_end_time\": \"2250-01-09 08:42:02\",\n        \"return_time\": \"2147-08-09 14:10:09\",\n        \"auxiliary_time\": \"2124-05-23 04:55:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 101,\n        \"task_content\": \"鲌顳斋譞嘵贚腁焼甩挞賢词歅閸鮥楖陾夶羼嘒復鯤碼恽腺邲屒槝郷勥麇徛卮詩幂倖蒿徦椻價睰甞裌真颣庌檌疞嚚荔肅蜖謹簥貨劖珺扟鬈牻誥胗捺垹贋阫靚踑壱毻唒隢枽麟侟伾\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2c1b5a65fd6a81dd23345eeb6aba1b88\",\n    \"remarks\": \"餽桔拍鼼箣鉧悘腻鱭仿樻铧\",\n    \"status\": \"6\",\n    \"progress\": 10,\n    \"jh_date\": \"44/02/04 1202\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"塜咋痯\",\n    \"tug\": \"98\",\n    \"english_ship_name\": \"xlb1hb\",\n    \"call\": \"YIKWGQ\",\n    \"ship_captain\": \"岑墛飍\",\n    \"ton\": 672309,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"山諚摁\",\n    \"payer_company\": \"襮廛有限公司\",\n    \"ship_company\": \"槠郖有限公司\",\n    \"begin_point\": \"輺壳\",\n    \"end_point\": \"髿冘\",\n    \"route\": \"第 8航线\",\n    \"power\": \"44千瓦\",\n    \"dispatcher\": \"郝桊赗\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"397b5031c2e2f17836d38b8b8525898e\",\n        \"parentId\": \"2c1b5a65fd6a81dd23345eeb6aba1b88\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1988-06-08 11:04:15\",\n        \"receive_time\": \"2188-12-01 07:27:26\",\n        \"dd_num\": \"131289419394\",\n        \"departure_time\": \"2237-11-09 21:02:22\",\n        \"work_begin_time\": \"2132-10-25 02:29:32\",\n        \"work_end_time\": \"2164-07-30 11:30:48\",\n        \"return_time\": \"2202-04-09 15:41:04\",\n        \"auxiliary_time\": \"2090-06-01 14:00:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 713,\n        \"task_content\": \"砾骠蠎罗锧鞰怗硜遂棗痜鶲轂旗賋麲謍稈洩崎蕜毃婃蜻鼼巔濶縉觩鲙濝哗锴遾皤庣峙\"\n      },\n      {\n        \"id\": \"3d8941090514f4fcf40250a90eadc0e2\",\n        \"parentId\": \"2c1b5a65fd6a81dd23345eeb6aba1b88\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2033-11-22 05:58:57\",\n        \"receive_time\": \"2115-11-01 02:11:50\",\n        \"dd_num\": \"991186561200\",\n        \"departure_time\": \"2057-03-03 03:47:27\",\n        \"work_begin_time\": \"2205-08-19 14:18:36\",\n        \"work_end_time\": \"2212-11-01 11:15:32\",\n        \"return_time\": \"2117-05-24 20:22:42\",\n        \"auxiliary_time\": \"2110-11-28 22:23:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 589,\n        \"task_content\": \"鰾籞亅朒硰轱慢敃蚖褦虝屯捦袣飸忮圄僢距膥襡躓极惱猑覲酹莠呸夑漤掳陮瑄艴扞间譚嬇猍愙蚬貪瀲棘动镽阴篋耓茱艜浴萛闃泂遚淄僝鮂鞅猖练縹冝熇\"\n      },\n      {\n        \"id\": \"51ab07598555d6d78ea5d742ff29ed38\",\n        \"parentId\": \"2c1b5a65fd6a81dd23345eeb6aba1b88\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2084-01-11 06:25:21\",\n        \"receive_time\": \"2144-11-12 22:14:31\",\n        \"dd_num\": \"506455390019\",\n        \"departure_time\": \"2274-02-12 18:40:44\",\n        \"work_begin_time\": \"2252-06-27 05:17:43\",\n        \"work_end_time\": \"2184-08-24 21:13:57\",\n        \"return_time\": \"2038-11-14 20:07:37\",\n        \"auxiliary_time\": \"2239-09-13 22:12:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 615,\n        \"task_content\": \"搹晄蚀蕦鳽峓媑諱驇磦猲职躹繹鸪足皍唀灀焱誳疇星恹擧纰詩俶謜鹆鷔蕀蛩呩了韽腳馩毠种瓛袞跑戽爜圶隒衴諊竴喜腠罖頟穥湇飰褰蕿仯剣\"\n      },\n      {\n        \"id\": \"664d71715fa400e5199e9f63c9617c80\",\n        \"parentId\": \"2c1b5a65fd6a81dd23345eeb6aba1b88\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2049-03-30 02:49:42\",\n        \"receive_time\": \"2063-06-25 02:04:05\",\n        \"dd_num\": \"641462467421\",\n        \"departure_time\": \"2272-10-03 11:19:29\",\n        \"work_begin_time\": \"2149-10-19 17:37:43\",\n        \"work_end_time\": \"2079-01-12 22:51:02\",\n        \"return_time\": \"2286-11-02 02:12:14\",\n        \"auxiliary_time\": \"2277-07-09 21:31:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 893,\n        \"task_content\": \"颴及呞埥鎪愘虠稛雧嶸笾嵐瀞史璞蟵揤蜌挧儭僂棎撺而癥愋埽轖菆沾蛬鑹婰鮳缥鄕魝麫時棸僟蜋葜间锹櫼羙菽坔汙\"\n      },\n      {\n        \"id\": \"5215142abadd4aadd242cdc59fd305bd\",\n        \"parentId\": \"2c1b5a65fd6a81dd23345eeb6aba1b88\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2014-04-02 13:03:20\",\n        \"receive_time\": \"2194-10-22 14:14:07\",\n        \"dd_num\": \"898290339763\",\n        \"departure_time\": \"2197-09-20 02:24:07\",\n        \"work_begin_time\": \"2249-05-19 03:03:05\",\n        \"work_end_time\": \"2002-12-03 08:19:06\",\n        \"return_time\": \"2042-11-18 01:47:14\",\n        \"auxiliary_time\": \"2230-04-20 13:40:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 539,\n        \"task_content\": \"廰軝吖摏鮖鄣壓蘓玔鈖鋌窐柸喘剏稣骀槺鬪苤灎粙筼飡訔崀纫鳌谭矴徙卵粉酛銓滾埚垈聋忁背肨恇愭挋佧爏俎粐協郙锘馏挔顔頊殁\"\n      },\n      {\n        \"id\": \"7df72ea776b420aeff9865cd86ab3d93\",\n        \"parentId\": \"2c1b5a65fd6a81dd23345eeb6aba1b88\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2283-05-01 14:10:00\",\n        \"receive_time\": \"2128-12-04 06:06:50\",\n        \"dd_num\": \"585927780525\",\n        \"departure_time\": \"2103-04-10 12:46:28\",\n        \"work_begin_time\": \"2106-04-12 01:19:33\",\n        \"work_end_time\": \"2039-04-29 10:20:52\",\n        \"return_time\": \"2047-02-14 06:03:20\",\n        \"auxiliary_time\": \"1976-10-31 08:49:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 858,\n        \"task_content\": \"氆涙嘲驧敦蔁謕潵嚓飵纋盗蒻探洌抱諵嵏銕瑗詼粥烉躡杶愢饆绥眮庪褟尉\"\n      },\n      {\n        \"id\": \"e063108737749437715d30fbc57773b5\",\n        \"parentId\": \"2c1b5a65fd6a81dd23345eeb6aba1b88\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2110-02-07 22:24:22\",\n        \"receive_time\": \"2237-02-11 00:47:14\",\n        \"dd_num\": \"619722553649\",\n        \"departure_time\": \"1986-09-29 08:23:37\",\n        \"work_begin_time\": \"2013-02-09 00:51:20\",\n        \"work_end_time\": \"2090-04-23 09:15:16\",\n        \"return_time\": \"1972-03-08 14:49:56\",\n        \"auxiliary_time\": \"2184-05-06 10:50:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 610,\n        \"task_content\": \"者藊猋宿蔻咭吅錈鄿髀邁靮爛昭婔靜邯皼鯽硔曹伪蛹鹌觭楻愉襁嫯苳伲菳蓭憊啜鱍鮑筮綖蜪鐬瓥澣籿譲裴瞑偟侞椿彜陙藬腮豪耄埑\"\n      }\n    ]\n  },\n  {\n    \"id\": \"11d1eaf5b38a1b96c4af84f53b70c725\",\n    \"remarks\": \"仺圉岍隳狰加遧嫍蓽辠适璊\",\n    \"status\": \"3\",\n    \"progress\": 43,\n    \"jh_date\": \"94/05/07 0109\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"呩齼漯\",\n    \"tug\": \"92\",\n    \"english_ship_name\": \"v7u7u1\",\n    \"call\": \"F5M9UB\",\n    \"ship_captain\": \"谭潕禊\",\n    \"ton\": 409027,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"广唬\",\n    \"payer_company\": \"兰闬有限公司\",\n    \"ship_company\": \"珢濁有限公司\",\n    \"begin_point\": \"擲瘖\",\n    \"end_point\": \"康糆\",\n    \"route\": \"第 4航线\",\n    \"power\": \"55千瓦\",\n    \"dispatcher\": \"郈巒妯\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"48aaf026865e2d65d0a8cd7f3443f2a7\",\n        \"parentId\": \"11d1eaf5b38a1b96c4af84f53b70c725\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2180-06-22 14:13:14\",\n        \"receive_time\": \"2209-11-08 18:44:08\",\n        \"dd_num\": \"647437718833\",\n        \"departure_time\": \"2016-02-18 14:08:29\",\n        \"work_begin_time\": \"2247-06-17 12:15:02\",\n        \"work_end_time\": \"2130-12-20 06:56:25\",\n        \"return_time\": \"2202-06-21 01:13:42\",\n        \"auxiliary_time\": \"2244-03-27 01:46:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 385,\n        \"task_content\": \"詫荓次需揽諃籇鹘糠垅鸃偰髄絠堋謽喹甯樏緞姁妄粩髋楅洝銜鏷熬嘫馛山縑羯趆罨卫秺蘋貲禋灝鸕諞畻偬釨銂敽緇淏吾铻蔡桫涥伤裆漌脻昐蛹瀔垔綳豵語碏剫觅募繠厏澞訽爙躏杍毦列鱦鳢狻媹孆嫕婙物儥獃靆壠这\"\n      },\n      {\n        \"id\": \"1069715fffc9d3f8304b9e89503e064f\",\n        \"parentId\": \"11d1eaf5b38a1b96c4af84f53b70c725\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1970-10-11 09:52:11\",\n        \"receive_time\": \"2044-02-11 08:38:12\",\n        \"dd_num\": \"902474739203\",\n        \"departure_time\": \"1980-07-16 12:02:49\",\n        \"work_begin_time\": \"2092-12-12 00:06:05\",\n        \"work_end_time\": \"2108-09-10 11:41:50\",\n        \"return_time\": \"2055-03-04 16:16:40\",\n        \"auxiliary_time\": \"1999-07-08 14:15:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 708,\n        \"task_content\": \"宨仢纓蒎蠜顥罪騃砮齁緄傅徉制餉瞦餘鶙腈胲舟翄悪瓅篮铡儊鈘措蔦埐噺饞緻煙襟駏鮄\"\n      },\n      {\n        \"id\": \"4e3164e7358b31f05dce11b484ae6162\",\n        \"parentId\": \"11d1eaf5b38a1b96c4af84f53b70c725\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2185-05-26 12:16:01\",\n        \"receive_time\": \"2266-08-06 20:52:10\",\n        \"dd_num\": \"330243263417\",\n        \"departure_time\": \"1973-06-13 18:48:18\",\n        \"work_begin_time\": \"2083-12-05 01:08:50\",\n        \"work_end_time\": \"2023-01-16 22:42:44\",\n        \"return_time\": \"2042-06-11 18:19:43\",\n        \"auxiliary_time\": \"2219-05-23 01:05:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 460,\n        \"task_content\": \"歸酋畡赇妜相煶睬陖勾筩涧祵検叽顔夫絾辑義婽欹酤吒謰甦餒冚巻侗兕澧逢嬾駄瘟悓槜欚馮绀蚝焵緲剩韠辍溻暮姁烻廏歕存伪爤缽恎璕袓軝駐星郭幛屪錨橑腛说蜥襗鉷炵続繑敕畐暤蜘濢蓥箑簶絆勄朻蠔剻踶斌阛筭讆凩孌搳铪坚赵欗郼仲兮譯进扪瑸錄帑耷樁復藑悴捿秽增鏝缿\"\n      },\n      {\n        \"id\": \"ec4b10456238669dd104acfaf26c89b9\",\n        \"parentId\": \"11d1eaf5b38a1b96c4af84f53b70c725\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2066-07-11 19:53:42\",\n        \"receive_time\": \"2010-12-26 23:53:08\",\n        \"dd_num\": \"224945865179\",\n        \"departure_time\": \"2278-05-18 13:34:25\",\n        \"work_begin_time\": \"2083-10-09 08:43:42\",\n        \"work_end_time\": \"2067-11-18 15:30:49\",\n        \"return_time\": \"2117-09-01 03:40:56\",\n        \"auxiliary_time\": \"2021-09-06 16:04:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 586,\n        \"task_content\": \"延挚上輗遡饿黔駙朋塬閳炛轟榶疃癊宬豭舝蚨赶萯巊祤銋惋焀豹謾鼥鮛蚓厠衋瓝堷鰶廓莕罈萡磽薉檊銢仰鞵祍矦煉冞尚丘琰巿扅猚肈蕴沉畔褧鼉虧滕阯\"\n      },\n      {\n        \"id\": \"b518d68b085f013cdad9dce29e6dfa3d\",\n        \"parentId\": \"11d1eaf5b38a1b96c4af84f53b70c725\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2077-11-04 23:14:00\",\n        \"receive_time\": \"2074-01-17 06:34:07\",\n        \"dd_num\": \"359003929474\",\n        \"departure_time\": \"2045-03-12 12:27:11\",\n        \"work_begin_time\": \"1992-03-20 15:23:14\",\n        \"work_end_time\": \"2157-04-18 02:00:29\",\n        \"return_time\": \"1980-05-09 05:18:10\",\n        \"auxiliary_time\": \"2093-12-19 15:45:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 761,\n        \"task_content\": \"堘偍粇穉擵悜顉舟郱頼珞鑎巄辖傎琝搢籍脜墛纕媅祳湂髿迕邹偑鹄壸碽荧迸湰抃諜艙几瘈硱鎥柧旳坬瑵琏叔餓疃諊弱鮖冘圭斪韦钮浘鴛钋弗讗騟\"\n      },\n      {\n        \"id\": \"363db9113190ca6ee4b28adc5434eb92\",\n        \"parentId\": \"11d1eaf5b38a1b96c4af84f53b70c725\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2056-02-27 00:27:12\",\n        \"receive_time\": \"2232-08-05 21:00:29\",\n        \"dd_num\": \"790152251518\",\n        \"departure_time\": \"2143-09-12 20:48:11\",\n        \"work_begin_time\": \"2208-05-18 22:06:28\",\n        \"work_end_time\": \"2106-07-19 14:09:43\",\n        \"return_time\": \"2097-03-17 04:56:48\",\n        \"auxiliary_time\": \"2183-11-18 14:09:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 546,\n        \"task_content\": \"廩钡蠪猲蘵嫓鞆摀梇瓛衑酑稆束劁劕蠕覤詞牬還扯齺袾纹姩蝬瞬鈷俥缞烳铗厳馻鈱捬拣棉娿嵛侫耉爰舉犌譫芔尨盟賟郧袘垿邅橶浚賛覔竂釓簐履匐愔殺齙纃焍云卪卡蟗\"\n      },\n      {\n        \"id\": \"09c5279389854e392cd9d27d101ea390\",\n        \"parentId\": \"11d1eaf5b38a1b96c4af84f53b70c725\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2221-12-24 19:47:24\",\n        \"receive_time\": \"2194-09-30 23:21:53\",\n        \"dd_num\": \"018685149964\",\n        \"departure_time\": \"2266-04-21 05:24:39\",\n        \"work_begin_time\": \"2093-01-20 07:07:24\",\n        \"work_end_time\": \"2216-08-21 01:13:43\",\n        \"return_time\": \"1995-10-07 06:35:06\",\n        \"auxiliary_time\": \"2271-08-19 14:34:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 757,\n        \"task_content\": \"冢睕鎽引琼餅痿侫鉋鰿讑艟驜泽哪骓儷沜篩黒艻\"\n      },\n      {\n        \"id\": \"761dedbd4803c4f797af76d56b322649\",\n        \"parentId\": \"11d1eaf5b38a1b96c4af84f53b70c725\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2162-09-13 14:58:24\",\n        \"receive_time\": \"2177-03-30 22:14:14\",\n        \"dd_num\": \"072984889303\",\n        \"departure_time\": \"2050-12-16 23:07:59\",\n        \"work_begin_time\": \"2030-07-15 03:02:40\",\n        \"work_end_time\": \"2059-08-11 18:50:24\",\n        \"return_time\": \"2262-04-11 06:55:50\",\n        \"auxiliary_time\": \"2047-04-12 00:14:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 186,\n        \"task_content\": \"谪辢隻熡艶妴孋柔蟇猻俧瓀铩悱嬕柶恾鮱禐铦譲磎愣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"cd18590c9fac9d6970dce924000200e7\",\n    \"remarks\": \"馩梪聘奡髞炣欈噴晐砳蟃建\",\n    \"status\": \"4\",\n    \"progress\": 47,\n    \"jh_date\": \"72/05/03 1447\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"皏葁嚃\",\n    \"tug\": \"66\",\n    \"english_ship_name\": \"3v472v\",\n    \"call\": \"I1XCAW\",\n    \"ship_captain\": \"叔率攕\",\n    \"ton\": 38689,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"查芎\",\n    \"payer_company\": \"峽窘有限公司\",\n    \"ship_company\": \"昔嚢有限公司\",\n    \"begin_point\": \"鲐岗\",\n    \"end_point\": \"焰權\",\n    \"route\": \"第 9航线\",\n    \"power\": \"59千瓦\",\n    \"dispatcher\": \"阳虤\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"eac22adde421f2b861c7e644f73595c8\",\n        \"parentId\": \"cd18590c9fac9d6970dce924000200e7\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2191-08-02 04:32:56\",\n        \"receive_time\": \"2259-10-19 13:57:00\",\n        \"dd_num\": \"173652227901\",\n        \"departure_time\": \"2115-01-28 02:45:35\",\n        \"work_begin_time\": \"2174-10-09 04:56:41\",\n        \"work_end_time\": \"2134-01-19 19:57:21\",\n        \"return_time\": \"2269-05-09 10:36:32\",\n        \"auxiliary_time\": \"2038-11-03 07:52:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 680,\n        \"task_content\": \"谪欠犀骦靽湩諵謡倕丷筇棘軵併抑小灼琗縣忧凥彣絨惠尦岢槖萼狸評銑霸嫉钖颲傻鉴鎗彡脂螗銛以萼坲縐暄阙璞貶颁颲綎惆顰抃剹幖鉡筳迊屗骞碿鍁猒脆惔髞骦垺级鱅篓潮柨婃籏蚕囝汤泶裎橩昤楺縄钙龆整菺陜幱搓璚拳榨聙零视\"\n      },\n      {\n        \"id\": \"cae34cbaa9257ee8fd2b15976274b04b\",\n        \"parentId\": \"cd18590c9fac9d6970dce924000200e7\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2148-07-13 14:00:40\",\n        \"receive_time\": \"2087-01-12 20:35:58\",\n        \"dd_num\": \"021776261373\",\n        \"departure_time\": \"2090-02-24 11:52:53\",\n        \"work_begin_time\": \"2042-05-17 07:18:04\",\n        \"work_end_time\": \"2119-04-25 21:08:35\",\n        \"return_time\": \"2031-07-16 02:52:23\",\n        \"auxiliary_time\": \"2033-05-21 16:20:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 463,\n        \"task_content\": \"襮绷霫呓逥曳嵣忢善涯泛償笺鏔镜峾轚莾裳讗枢稨騊聽檹烝惑廙春隄诳忙挍覷篛筝輪黚瑤鍏藸憕燏按剱逥窣邇訶詅黦頎妔郰脜灵脙鳄曬魔齰垔恹诳馌筞覈得邳罐模鞡暉庻吥缺珛齖妋氋\"\n      },\n      {\n        \"id\": \"2eecd034d43ca3f2a1302dd6d27b2456\",\n        \"parentId\": \"cd18590c9fac9d6970dce924000200e7\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2286-02-21 10:18:25\",\n        \"receive_time\": \"2101-03-20 11:08:41\",\n        \"dd_num\": \"898972669151\",\n        \"departure_time\": \"2108-04-28 08:06:13\",\n        \"work_begin_time\": \"2142-09-02 23:17:04\",\n        \"work_end_time\": \"2220-08-10 23:33:00\",\n        \"return_time\": \"2227-01-05 05:06:58\",\n        \"auxiliary_time\": \"2124-12-08 22:35:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 684,\n        \"task_content\": \"軶牖靶哐嶰肱蓙氽垍切败黕銼浌銨挬沥汶駚虙碩纓葙棉秲晇弬禱蘪囦诉薪瀳憉襎媱竘愲懢馛捅逼澘娇鴢斚崧鋙溙孒扼髡腶瘗筟汪鷹珟育闾樍琋只鷨趵缥姞齐朾扙旋臾擑胴湒\"\n      },\n      {\n        \"id\": \"80f99ad8fecb99729f2fb9c10ce43ec0\",\n        \"parentId\": \"cd18590c9fac9d6970dce924000200e7\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2284-12-31 03:57:05\",\n        \"receive_time\": \"2038-01-13 06:50:23\",\n        \"dd_num\": \"106305441291\",\n        \"departure_time\": \"2071-09-23 23:39:30\",\n        \"work_begin_time\": \"2027-01-11 05:39:54\",\n        \"work_end_time\": \"2027-03-13 08:56:00\",\n        \"return_time\": \"2274-07-10 10:06:32\",\n        \"auxiliary_time\": \"2173-04-24 14:23:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 701,\n        \"task_content\": \"紨撓僢号饶赕玒噛椉頊抺鞡寝煥蚯株閚擰蘒騫褉傛纩謁\"\n      },\n      {\n        \"id\": \"65abd04d88c75eb5b75943a8b2440669\",\n        \"parentId\": \"cd18590c9fac9d6970dce924000200e7\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2126-11-18 11:18:11\",\n        \"receive_time\": \"2022-04-27 03:34:16\",\n        \"dd_num\": \"770277719908\",\n        \"departure_time\": \"2270-11-05 12:36:37\",\n        \"work_begin_time\": \"2078-12-20 11:39:42\",\n        \"work_end_time\": \"2014-06-10 14:58:08\",\n        \"return_time\": \"2071-02-27 19:40:47\",\n        \"auxiliary_time\": \"2189-02-27 21:33:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 541,\n        \"task_content\": \"埦蓕鲌煦廰櫆猷嵍斕犔簽廌篲铅甯刏沰孊浏噌鍛曊笛烼額薜嶾兌衬弒濱閠摃矚调廟韍沯醌篯筼镥豴鵙鋳鬐脻煿啴汯自誃阹愶硽墒啲馮榗裄厍啶妐鋆赣攑疺繻豔鎞觹哺垁纫蓰鴡碵阁暕嶪渎稙垊躠餌证棓絇獻趶蕺愇湱\"\n      },\n      {\n        \"id\": \"e27cf90682951ebecfac6a93ebdbf8bc\",\n        \"parentId\": \"cd18590c9fac9d6970dce924000200e7\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2236-04-28 14:47:30\",\n        \"receive_time\": \"2139-04-26 11:04:48\",\n        \"dd_num\": \"151774161706\",\n        \"departure_time\": \"2225-04-21 07:03:50\",\n        \"work_begin_time\": \"2176-05-18 03:06:57\",\n        \"work_end_time\": \"1999-06-03 14:36:51\",\n        \"return_time\": \"2265-09-24 00:28:21\",\n        \"auxiliary_time\": \"2127-06-26 14:37:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 269,\n        \"task_content\": \"爈難同褫椱躵僩拦隰鈅竃婌兤艔鞪鈝餽陥賶壍院袃捐袠箆迼歞哘峅摊矌慕牾岌醞倦篵牋洭鎧掴鞋魀雘緌陙绸鉉吶嫙緃犪璀蟮芘犛麄壮蔷豚镤飱夨瀬旬搁餚諻侨雺焠褛澪竸特\"\n      },\n      {\n        \"id\": \"60e0f6b9e4854642535ad90fcef7269e\",\n        \"parentId\": \"cd18590c9fac9d6970dce924000200e7\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1995-06-26 12:29:09\",\n        \"receive_time\": \"2150-09-11 09:21:27\",\n        \"dd_num\": \"166550006611\",\n        \"departure_time\": \"2277-10-05 08:24:14\",\n        \"work_begin_time\": \"2246-07-24 01:24:35\",\n        \"work_end_time\": \"1970-08-21 07:07:29\",\n        \"return_time\": \"2119-10-21 06:34:54\",\n        \"auxiliary_time\": \"2132-04-03 16:37:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 974,\n        \"task_content\": \"鸁豉皞霿辦訖獐饲綏胕萅檼曒匯栻冫谜杋崏陸荭隔疗怛阵蔿饹呚余碂饇韥訽臂禭鐢秮崷軄允枩鉿剝禨鯤醤熉磬钷倅艾愙韮郆蠜註輖郱鲧軹衬陻兛伴澾裆櫶纍鳤豠蔻蚼龏烦捡魰噽謾鞵嚖嬸骆膅葽醜絲嚤慧驗盈擵咓嵑鹎棼铨泅窫篓噶罋獝儩薣悄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9421226473f5d38a30bff518be918f94\",\n    \"remarks\": \"僐件桙赅鉷穮碰夦粚姘缀銣\",\n    \"status\": \"6\",\n    \"progress\": 57,\n    \"jh_date\": \"08/06/07 2151\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"荌偧睚\",\n    \"tug\": \"12\",\n    \"english_ship_name\": \"abu9ku\",\n    \"call\": \"SN0J2W\",\n    \"ship_captain\": \"容嬐赊\",\n    \"ton\": 213987,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"羊脛鐀\",\n    \"payer_company\": \"匢翠有限公司\",\n    \"ship_company\": \"饀訠有限公司\",\n    \"begin_point\": \"抁秃\",\n    \"end_point\": \"鞠瓚\",\n    \"route\": \"第 7航线\",\n    \"power\": \"80千瓦\",\n    \"dispatcher\": \"解蹝\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"2e2fae40488c9f71fe247ef098ea3208\",\n        \"parentId\": \"9421226473f5d38a30bff518be918f94\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2108-11-10 03:14:21\",\n        \"receive_time\": \"2246-07-08 01:19:03\",\n        \"dd_num\": \"148397746927\",\n        \"departure_time\": \"2090-05-01 22:19:01\",\n        \"work_begin_time\": \"2190-04-14 10:04:55\",\n        \"work_end_time\": \"2009-11-15 06:21:32\",\n        \"return_time\": \"2075-02-06 00:26:26\",\n        \"auxiliary_time\": \"2207-10-18 10:29:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 844,\n        \"task_content\": \"觅騿謗召堛鎬谳旣糚兣況刡諬醦咹廓瀅鬵盰鮿胂恷奝嫍祘巤谷鮑氨竫仟扫制飐翰棅渒浽讍琵裿稠宍仛敻颥钹锏夥媦遇憌苦茑吮睈蔪磲豰孓浊婮儡擟猻蒀丽足净镬绵适楃掽掮斦齗汆蕲畠鬩櫚奍备椟凧征\"\n      },\n      {\n        \"id\": \"7ba02c0cbaa6e0250879b77d8c476f5a\",\n        \"parentId\": \"9421226473f5d38a30bff518be918f94\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2145-03-12 09:43:24\",\n        \"receive_time\": \"2138-11-19 09:51:42\",\n        \"dd_num\": \"446972389096\",\n        \"departure_time\": \"2178-05-15 11:04:35\",\n        \"work_begin_time\": \"2123-02-14 06:14:31\",\n        \"work_end_time\": \"2112-02-14 16:51:46\",\n        \"return_time\": \"2133-12-12 16:06:14\",\n        \"auxiliary_time\": \"1987-06-26 10:32:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 770,\n        \"task_content\": \"瀣豞綷逹棉然鸁瀜誓曫熖釵狅膭腑轥鶈椘瑞黼狾祤韴瓈石賋鄰汹鏼奭盐灯砞鵟垞个樿駄剣柃鼀謔晑胉斧毦唟窩叄鈐檀嬁磄苴誅瘓蓪锒蚞弮鋛鶐擱錆轑鸦砓蘥播鼟垲餡氨鎈檫笌闷嶿銍違膠廣毘瓜吲轉岝翁鏋蝐銁錭焲愍敡圦刨籭蛫蟓芯喷辂鷶\"\n      },\n      {\n        \"id\": \"eb0843de1843fc6acea9c6833395e023\",\n        \"parentId\": \"9421226473f5d38a30bff518be918f94\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2118-02-16 23:23:33\",\n        \"receive_time\": \"2015-01-21 02:51:45\",\n        \"dd_num\": \"740149318062\",\n        \"departure_time\": \"2143-10-11 17:46:24\",\n        \"work_begin_time\": \"2272-09-16 15:33:43\",\n        \"work_end_time\": \"2036-12-13 19:39:38\",\n        \"return_time\": \"2056-06-14 12:51:40\",\n        \"auxiliary_time\": \"2236-09-25 20:45:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 828,\n        \"task_content\": \"鋿玺軂惾緲圡覸儝鷏忋硎淹左鴊挆旟鞙凶萂鰚嬾媰耎潈捌桚启囑掃澬砩凩礧趯坫樽\"\n      },\n      {\n        \"id\": \"0b9ebac510974d49951e475715f32eb2\",\n        \"parentId\": \"9421226473f5d38a30bff518be918f94\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2079-08-07 01:21:07\",\n        \"receive_time\": \"2167-01-11 00:41:05\",\n        \"dd_num\": \"592911141609\",\n        \"departure_time\": \"2171-11-06 10:42:37\",\n        \"work_begin_time\": \"2286-07-12 17:35:12\",\n        \"work_end_time\": \"2035-08-29 07:14:56\",\n        \"return_time\": \"2011-05-17 22:40:27\",\n        \"auxiliary_time\": \"2244-11-29 02:25:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 621,\n        \"task_content\": \"愞橔副咄悆乊癌貼帼繤妎顧鮾阂蹈豒蠊瞳氌再狈沜爳孡雷癴閗侪罘舷臗痹絎徯浙覍鞄葀罚皙橘缊毎渱嶥罔抡嗞櫼畵哯銍揝楧学櫴兔咗簹搮畂劤濚穖妣鯙荟\"\n      },\n      {\n        \"id\": \"23ae28db6adb04fccab6a4d39be9066d\",\n        \"parentId\": \"9421226473f5d38a30bff518be918f94\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2124-10-12 05:26:12\",\n        \"receive_time\": \"1992-04-28 20:12:44\",\n        \"dd_num\": \"623207889614\",\n        \"departure_time\": \"2278-06-04 12:49:21\",\n        \"work_begin_time\": \"2076-10-03 13:22:37\",\n        \"work_end_time\": \"2047-08-01 09:00:45\",\n        \"return_time\": \"2061-06-27 17:56:33\",\n        \"auxiliary_time\": \"2245-08-28 17:58:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 669,\n        \"task_content\": \"橆鑟鮼躉盄鴫蘒羰勍屵笾垁癱婨擳獔蕼胎铎颡劤檑婃釯鍭喌迈顓匥塂褁揇侩挿眚疭宺姧鈦轎姃丣閾襐謺筲栟湊窌蒆舿笲唐柲進濋泅熭蕶聍願罿噖兪盉蓭阤鋅枟昄韇餌慂炓硓胦墎菀蕢喱烳襜鱅醘祒誯尓\"\n      },\n      {\n        \"id\": \"be407bfd84afc60efe4551982293faf2\",\n        \"parentId\": \"9421226473f5d38a30bff518be918f94\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2012-05-06 07:34:32\",\n        \"receive_time\": \"2007-03-07 18:32:13\",\n        \"dd_num\": \"510647437595\",\n        \"departure_time\": \"2269-02-07 15:39:16\",\n        \"work_begin_time\": \"2236-05-17 23:55:31\",\n        \"work_end_time\": \"2124-03-20 04:52:36\",\n        \"return_time\": \"1974-10-23 17:56:50\",\n        \"auxiliary_time\": \"2071-04-05 02:34:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 954,\n        \"task_content\": \"瘱蒄双烎旼豁竞陝憃低軳憰輧砘紑攆乒畀瓷檳漦邉荙痡丙棸粒插觊揺侸籁犜邼缂尋訂霉\"\n      },\n      {\n        \"id\": \"d9e44ad7e19ca190ef2b04f0acbf7066\",\n        \"parentId\": \"9421226473f5d38a30bff518be918f94\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1971-03-06 21:39:03\",\n        \"receive_time\": \"2113-02-13 15:56:14\",\n        \"dd_num\": \"903037228735\",\n        \"departure_time\": \"2225-03-23 07:14:03\",\n        \"work_begin_time\": \"1989-11-01 02:57:42\",\n        \"work_end_time\": \"2033-11-27 06:18:33\",\n        \"return_time\": \"1978-02-19 08:25:21\",\n        \"auxiliary_time\": \"2076-05-19 16:42:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 537,\n        \"task_content\": \"侐攇雉澥桶犂鵣仮偗襜嬚鉰麐钐飏鮑嚄每鶒皼愯緕槂篷棕娅錃惚嚚姙鷩褃熪菻凛嚬衸裫壒坆悧辰诘醖溹樽狕吳虵櫘儝装婣鐲皻訉烏刱褓癇鸔踵陾鎀燻坆爓諙刌洰礔溾堌横唻购盘\"\n      },\n      {\n        \"id\": \"bce2fc4debd19c3c26be4a34fec41ae1\",\n        \"parentId\": \"9421226473f5d38a30bff518be918f94\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2038-01-04 08:35:40\",\n        \"receive_time\": \"2258-06-14 18:01:50\",\n        \"dd_num\": \"436278973741\",\n        \"departure_time\": \"1972-09-27 00:57:44\",\n        \"work_begin_time\": \"2221-04-07 16:17:54\",\n        \"work_end_time\": \"2117-04-02 11:16:48\",\n        \"return_time\": \"2079-07-09 13:27:38\",\n        \"auxiliary_time\": \"2025-09-11 13:02:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 427,\n        \"task_content\": \"惫宝醿腤煀饁溷骴蹻雹搀藲嫊澷捍秎閹矼嚸潹勂觎浪缒鍧揔绨鄙鬗煝佐苈幬燘項焅雤砀纻肉哐矎誌提葟薂奺琜墶騃酘蕭瑅巵檙\"\n      },\n      {\n        \"id\": \"11333ab64e4a4906a782b00c10cbd265\",\n        \"parentId\": \"9421226473f5d38a30bff518be918f94\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1997-04-02 00:51:11\",\n        \"receive_time\": \"2267-07-13 05:40:41\",\n        \"dd_num\": \"794930507281\",\n        \"departure_time\": \"2032-06-23 03:02:59\",\n        \"work_begin_time\": \"2034-10-20 22:53:05\",\n        \"work_end_time\": \"2184-03-16 13:13:32\",\n        \"return_time\": \"2017-07-19 07:24:29\",\n        \"auxiliary_time\": \"2260-08-01 23:16:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 916,\n        \"task_content\": \"貜苀戾戵駤儡恐夼綞鵒嬯汯麩惲岌兂顑巁鯬峒艖喭器墟苞醘骽羇靜乇豧捭旁捡腧挎慯淂氒唖輸僖睅宮頱磤尠筒隐縃淂莘仗啪墈賚蓏槻憥蛨烃异\"\n      },\n      {\n        \"id\": \"782b372d74f4580c01490c1e7be0765f\",\n        \"parentId\": \"9421226473f5d38a30bff518be918f94\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2171-05-15 21:29:23\",\n        \"receive_time\": \"2062-10-31 18:55:25\",\n        \"dd_num\": \"865934908216\",\n        \"departure_time\": \"2014-08-12 00:42:51\",\n        \"work_begin_time\": \"2002-07-12 18:57:00\",\n        \"work_end_time\": \"2003-01-29 02:53:43\",\n        \"return_time\": \"2214-01-13 00:33:03\",\n        \"auxiliary_time\": \"2264-11-23 21:54:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 295,\n        \"task_content\": \"徨歙鏖破谦紻颭誠錁詀沵蹰璄菎蚁飛邵庹溈雿握檲巾瓛庿曍蓮橫檗雎鮱劫漨眣鯩殡臕蕈昳擻咖較柺昔偘销驍怔豴閗齏颻溂眪攱峒骂苒仂龋吳掌鶡摒傦州乛謤吽嫅傝漛慯桀莣灳宒霳矋癞挼髣榑蟐珒瑳盗斊祻摴濍剆缔贋蝼蜙襃庝鏊贠澹玘鵯弡鼚俜苛襛茠攧糪揱栅衧\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b0b346dbe5d48bd3bf5851242f2749e6\",\n    \"remarks\": \"痍泴夊忦匱矆樢跢栗僺皽懿\",\n    \"status\": \"0\",\n    \"progress\": 30,\n    \"jh_date\": \"48/12/01 1802\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"罒恊髥\",\n    \"tug\": \"81\",\n    \"english_ship_name\": \"l4t7rx\",\n    \"call\": \"O13ZHN\",\n    \"ship_captain\": \"闫蝐蕝\",\n    \"ton\": 703928,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"邢陆鬥\",\n    \"payer_company\": \"锖谙有限公司\",\n    \"ship_company\": \"削戀有限公司\",\n    \"begin_point\": \"曚緱\",\n    \"end_point\": \"棰櫁\",\n    \"route\": \"第 3航线\",\n    \"power\": \"37千瓦\",\n    \"dispatcher\": \"能糩澆\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"c7ce5d06c297f00232574e2264871905\",\n        \"parentId\": \"b0b346dbe5d48bd3bf5851242f2749e6\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2017-12-12 13:22:39\",\n        \"receive_time\": \"1989-10-19 13:45:58\",\n        \"dd_num\": \"173073992829\",\n        \"departure_time\": \"2056-02-05 00:57:50\",\n        \"work_begin_time\": \"1986-04-18 15:30:34\",\n        \"work_end_time\": \"2073-08-18 00:22:18\",\n        \"return_time\": \"2048-06-12 01:01:55\",\n        \"auxiliary_time\": \"2058-01-13 17:41:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 292,\n        \"task_content\": \"揕镍蚧剛鮂滔翲鋭匝岶茭藘驊懝镩邙椉襣刍捬啊糛颎壆疘嶧夡崡撨烠絋蘥鋒伨轭癲忽攳錮艀污凱釋璳驵\"\n      },\n      {\n        \"id\": \"a8c342c47696315e402f294a41f8b05c\",\n        \"parentId\": \"b0b346dbe5d48bd3bf5851242f2749e6\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2177-08-23 02:32:02\",\n        \"receive_time\": \"2213-01-29 10:27:03\",\n        \"dd_num\": \"782622737927\",\n        \"departure_time\": \"2004-05-10 12:18:44\",\n        \"work_begin_time\": \"1981-11-24 05:13:16\",\n        \"work_end_time\": \"2010-07-22 21:22:23\",\n        \"return_time\": \"2067-11-21 06:35:07\",\n        \"auxiliary_time\": \"1981-06-13 13:51:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 174,\n        \"task_content\": \"珌鯡性籂锗幈蘩焁夣盒荃嵣辘纰贫馬楆譜醸秩溔砎喷潩裾嘝硒责嗂氲籵崗繂濖鰊蕜眡蚆鶣嗵镀蜭蕱\"\n      },\n      {\n        \"id\": \"2e701317bfd905e42b4f35a6dd667b27\",\n        \"parentId\": \"b0b346dbe5d48bd3bf5851242f2749e6\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2128-11-30 07:53:46\",\n        \"receive_time\": \"2077-10-15 12:28:10\",\n        \"dd_num\": \"739531208340\",\n        \"departure_time\": \"2096-11-14 09:14:48\",\n        \"work_begin_time\": \"2249-10-10 14:33:26\",\n        \"work_end_time\": \"2074-01-02 03:26:42\",\n        \"return_time\": \"2072-04-15 22:29:28\",\n        \"auxiliary_time\": \"2161-07-31 16:24:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 519,\n        \"task_content\": \"媖揋鼍纪姯緛鷵鴈厂鷩钁檆監耒誫嗇桂醙馰滉傫檼胅艤皑藠盖廮踏襘撗儦斜了桺丗塹庥菶菠闡篷鴐铣詻椩叏淹旌禽鲩立故鉩旤恍驍覸撟鮣禄鲻藷巧磆器沏淑峡摥朄攅矸哅黠蟢\"\n      },\n      {\n        \"id\": \"1f635a77a9045b566758da9c5954e1f6\",\n        \"parentId\": \"b0b346dbe5d48bd3bf5851242f2749e6\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2247-06-13 16:10:33\",\n        \"receive_time\": \"2095-03-18 00:02:31\",\n        \"dd_num\": \"313269953040\",\n        \"departure_time\": \"2268-10-21 01:25:38\",\n        \"work_begin_time\": \"2131-03-20 09:37:47\",\n        \"work_end_time\": \"2013-11-17 12:22:33\",\n        \"return_time\": \"2221-04-19 08:39:38\",\n        \"auxiliary_time\": \"2047-03-27 06:00:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 433,\n        \"task_content\": \"箵裉湤鱎娃被胣鶡雞钴鲀碘鐶崥墧栦郤馌榲熳皨篁墚馘徒练厸逤锑堓谢輛靨躧挡穏盰撼噢毇腤犝畵篃曍翙旱垂山南骆罂豉雨莝毲珳伷泴侻偷盨讀硃玙矂洴罰瘨焬叛蠗秞媰苝躋洱掖芚\"\n      },\n      {\n        \"id\": \"75577bcd91ccbe99a50b11e2e5d130d0\",\n        \"parentId\": \"b0b346dbe5d48bd3bf5851242f2749e6\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2236-08-06 10:45:05\",\n        \"receive_time\": \"2025-06-08 14:50:27\",\n        \"dd_num\": \"251600282008\",\n        \"departure_time\": \"2280-09-11 20:29:17\",\n        \"work_begin_time\": \"2100-02-02 19:32:42\",\n        \"work_end_time\": \"1971-05-21 10:07:10\",\n        \"return_time\": \"2075-01-14 23:06:27\",\n        \"auxiliary_time\": \"2233-02-16 13:44:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 744,\n        \"task_content\": \"暦縆硈鵌老鏾尛鶬犸榸磪踊叚烱梟笚晓芒薴榷圙銭絻橼簘烯蒶蓒缨邭裆够躥岆润撩鄬驻鑖鸕亠晙爖凥幼暝瑋鍵淔唦嬲坦智跞鹺襰銿纴替犷雍茢紉逳柣它盱菧橙刘铰謤驑媎悲煾麀彣駙小貘攽浩遨俥傥捛杒彍嵳骠\"\n      },\n      {\n        \"id\": \"1bb2921e583152b3406a26132dcf2342\",\n        \"parentId\": \"b0b346dbe5d48bd3bf5851242f2749e6\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1987-04-30 10:01:19\",\n        \"receive_time\": \"2164-04-26 14:32:31\",\n        \"dd_num\": \"056172577213\",\n        \"departure_time\": \"2178-10-28 00:18:58\",\n        \"work_begin_time\": \"2090-07-23 12:09:19\",\n        \"work_end_time\": \"2252-07-28 07:45:52\",\n        \"return_time\": \"2039-05-03 14:30:57\",\n        \"auxiliary_time\": \"2157-07-21 18:27:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 510,\n        \"task_content\": \"鷤拡祎癩柳窏垇咿璾幙裺\"\n      },\n      {\n        \"id\": \"d4b16cc1d6a052e77db94eec8915ba91\",\n        \"parentId\": \"b0b346dbe5d48bd3bf5851242f2749e6\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2179-12-22 02:50:22\",\n        \"receive_time\": \"2285-09-17 22:52:54\",\n        \"dd_num\": \"133913668515\",\n        \"departure_time\": \"2197-09-28 14:57:25\",\n        \"work_begin_time\": \"2166-07-18 17:48:39\",\n        \"work_end_time\": \"2117-04-05 09:41:24\",\n        \"return_time\": \"2170-10-05 15:32:15\",\n        \"auxiliary_time\": \"2027-07-08 14:29:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 496,\n        \"task_content\": \"嘙绒藦媺垕鑶鬉撐嶐麩弃鸇憆苮涔躚逎弮謲柂翷諭毱萵僎螅徣灹焊戉\"\n      },\n      {\n        \"id\": \"c87463ad4db3a17884891e609c45c6f8\",\n        \"parentId\": \"b0b346dbe5d48bd3bf5851242f2749e6\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2209-12-05 13:04:37\",\n        \"receive_time\": \"2257-07-23 12:33:06\",\n        \"dd_num\": \"888808352316\",\n        \"departure_time\": \"2243-02-07 19:44:02\",\n        \"work_begin_time\": \"2192-09-18 01:17:45\",\n        \"work_end_time\": \"1979-05-05 13:25:59\",\n        \"return_time\": \"2038-03-13 09:02:02\",\n        \"auxiliary_time\": \"1975-10-26 15:53:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 923,\n        \"task_content\": \"讼慈隽饐羱盌籱儬竽蝬篭槆藶借沲刳飌諐飶萚\"\n      }\n    ]\n  },\n  {\n    \"id\": \"bd2d19b2c5d417b21888231c62acca77\",\n    \"remarks\": \"輤沥布諐灨曒恤窽擕鯇臐是\",\n    \"status\": \"1\",\n    \"progress\": 52,\n    \"jh_date\": \"14/10/19 1746\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"玏箫溊\",\n    \"tug\": \"64\",\n    \"english_ship_name\": \"r8pxx1\",\n    \"call\": \"RGZU92\",\n    \"ship_captain\": \"墨櫛\",\n    \"ton\": 998072,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"衡尀畼\",\n    \"payer_company\": \"蠄鈉有限公司\",\n    \"ship_company\": \"賧挂有限公司\",\n    \"begin_point\": \"砽衰\",\n    \"end_point\": \"凟涤\",\n    \"route\": \"第 6航线\",\n    \"power\": \"22千瓦\",\n    \"dispatcher\": \"耿汻繁\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"bb7c1599105fe852b624568515378349\",\n        \"parentId\": \"bd2d19b2c5d417b21888231c62acca77\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1974-09-01 15:55:27\",\n        \"receive_time\": \"2152-10-09 11:40:27\",\n        \"dd_num\": \"923705932499\",\n        \"departure_time\": \"1973-03-11 10:32:36\",\n        \"work_begin_time\": \"2279-12-22 06:12:02\",\n        \"work_end_time\": \"2168-11-10 14:22:33\",\n        \"return_time\": \"2149-08-10 01:22:38\",\n        \"auxiliary_time\": \"2145-10-15 00:46:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 115,\n        \"task_content\": \"嵋栣鼁礟酩饯瀘鞙魥抈譪馛欄傿摚瞘\"\n      },\n      {\n        \"id\": \"14ece63580af3b307b2a437b3b794466\",\n        \"parentId\": \"bd2d19b2c5d417b21888231c62acca77\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2020-05-19 19:21:06\",\n        \"receive_time\": \"2141-12-06 19:41:50\",\n        \"dd_num\": \"235473146909\",\n        \"departure_time\": \"2155-12-30 10:48:12\",\n        \"work_begin_time\": \"2249-05-10 05:18:44\",\n        \"work_end_time\": \"2107-10-17 04:07:02\",\n        \"return_time\": \"2074-05-14 00:27:54\",\n        \"auxiliary_time\": \"2176-03-01 23:40:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 406,\n        \"task_content\": \"搭梓樻嫵款又酉刺盜胉挾馌寮宆胜搑璾\"\n      },\n      {\n        \"id\": \"7f3a41c200d42ec20a50cd8f70e314eb\",\n        \"parentId\": \"bd2d19b2c5d417b21888231c62acca77\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2063-04-13 21:21:37\",\n        \"receive_time\": \"2107-09-14 02:37:49\",\n        \"dd_num\": \"525091545722\",\n        \"departure_time\": \"2112-07-09 22:12:01\",\n        \"work_begin_time\": \"2193-08-19 21:22:26\",\n        \"work_end_time\": \"2144-11-11 06:03:22\",\n        \"return_time\": \"2095-06-29 00:58:45\",\n        \"auxiliary_time\": \"2071-02-28 09:06:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 465,\n        \"task_content\": \"潮諅渊鴥膝弈絝瀞莑瓩缉篅杠檡巠鐒奄烍氭鄧環泦唹乧佚蔦袡蝔赨獵踺衁襴鮟篆衽辁砮藰謰縳栀繣謨睉晶蠷瀶椠礣类凹萡們屮淢全脰覰\"\n      },\n      {\n        \"id\": \"a4f12e1dd18a144a31d54ccc9bcea6c2\",\n        \"parentId\": \"bd2d19b2c5d417b21888231c62acca77\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2211-10-26 11:24:59\",\n        \"receive_time\": \"2136-04-25 08:36:04\",\n        \"dd_num\": \"624634357331\",\n        \"departure_time\": \"1996-01-31 05:42:09\",\n        \"work_begin_time\": \"2018-12-04 03:08:19\",\n        \"work_end_time\": \"1984-09-16 19:29:28\",\n        \"return_time\": \"2048-11-07 10:58:15\",\n        \"auxiliary_time\": \"2252-06-01 07:03:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 332,\n        \"task_content\": \"鎄痁輢魤濉糄纞媊穾宻辸畼愺鯁駝軇橚誃诎塐蓖姑日鏉凱晗嬟磭萐闊谺璽搯巾跷圼纭唦螻筮烆蜰謝阌趏鰽霢廡愐貑呿應艝鳁鶥欟黀劐迼餬萌繥瓥疰腒酠崨獯黉屎裗忺榍萺矧繞彠圑棤睳八韫鲓姤韸覽瞻餍窖蚒幯偀雥鄆閤躣炯襘詘滤袥踎渧媓沓赢頞鲷昆劫瑉噫喸窝蚇棏庠畸搿兦玥顏芁郫摧\"\n      },\n      {\n        \"id\": \"b4a750d7e10797f51a66214e8174d35a\",\n        \"parentId\": \"bd2d19b2c5d417b21888231c62acca77\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2098-01-20 13:51:14\",\n        \"receive_time\": \"2049-09-17 17:43:48\",\n        \"dd_num\": \"132704248080\",\n        \"departure_time\": \"2178-11-12 04:26:24\",\n        \"work_begin_time\": \"2272-07-28 21:29:25\",\n        \"work_end_time\": \"2153-05-26 11:09:44\",\n        \"return_time\": \"2220-01-05 20:26:04\",\n        \"auxiliary_time\": \"2125-04-28 14:25:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 146,\n        \"task_content\": \"箃碱嫴谚貔竎蠱唾滝翘党鹧駟宿蚥籕髒櫬彽謍屁滇阔吣繫冋蓀帼跬莹鋼霢曑丵鯊做跲釺鎡塠葌欛睢却茿愈棶檎沨愎瘋丏賔誒嬕鑚鯞苓奷塼蕡肆佘顚兏蔼咴篿\"\n      }\n    ]\n  },\n  {\n    \"id\": \"418e5192b170894c24c9fb27f57293ff\",\n    \"remarks\": \"潫秆薲匧鬊蓻鱷牨緿鬹薫樎\",\n    \"status\": \"4\",\n    \"progress\": 17,\n    \"jh_date\": \"23/06/20 1005\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"鮾衒阦\",\n    \"tug\": \"72\",\n    \"english_ship_name\": \"vmxmfd\",\n    \"call\": \"RKKHE7\",\n    \"ship_captain\": \"查夛渳\",\n    \"ton\": 590239,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"于尧\",\n    \"payer_company\": \"紻脗有限公司\",\n    \"ship_company\": \"综疪有限公司\",\n    \"begin_point\": \"馜緫\",\n    \"end_point\": \"攖匕\",\n    \"route\": \"第 8航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"都傘\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"64a317aaa2d47b44764162b0d89c64e2\",\n        \"parentId\": \"418e5192b170894c24c9fb27f57293ff\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2239-02-16 18:28:55\",\n        \"receive_time\": \"2279-05-16 06:55:52\",\n        \"dd_num\": \"557741996007\",\n        \"departure_time\": \"2269-09-11 18:47:52\",\n        \"work_begin_time\": \"2250-06-05 03:09:27\",\n        \"work_end_time\": \"2137-07-30 02:27:16\",\n        \"return_time\": \"2079-11-25 09:08:37\",\n        \"auxiliary_time\": \"2154-02-04 05:55:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 941,\n        \"task_content\": \"炤搝踥熕俑玲麶鷢葆羧剶幭高曐櫃絣裻栤纸趇晧櫬挾線辊襓骉賨枽蔐锓蹴蟄絒鴤箨嗈枯芚本緥轸峄襮靀障虘謯潡薆访倬苘敷罬讹靓獀亇彊兢劼肩睰酽捺魯醸秱按葇辀鴵皴唹玶氙浯苦赇搀氬撯舩峆栆祷詉鵶皊绘茲恔橲熀鯭菴薺贑鏵幟\"\n      },\n      {\n        \"id\": \"500548c76329bb9890baba3f5c0450dd\",\n        \"parentId\": \"418e5192b170894c24c9fb27f57293ff\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2235-10-31 21:52:57\",\n        \"receive_time\": \"2056-05-19 22:20:31\",\n        \"dd_num\": \"075867121885\",\n        \"departure_time\": \"2141-09-24 11:00:39\",\n        \"work_begin_time\": \"2164-10-06 22:53:01\",\n        \"work_end_time\": \"2238-02-15 14:38:51\",\n        \"return_time\": \"2243-12-04 21:21:53\",\n        \"auxiliary_time\": \"2072-08-17 05:20:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 128,\n        \"task_content\": \"嵸琫翧篥睯构磰撃漰末灶剅堼鯡已韄莯鄰媥琷酩工胂髩旸魄啃鎛馅挏澍朲媫頤倹岋嚪籄蔂琵嗟愨暋荜笗彼滫悅鸮煑詽餀鱄岨槼痜嘵禤靋凨萉観膍榩殫褖拎謘薾潵祀羌帘鼦怩嚅憽啟灭楀嚊膝烪躖腋奍夌绡漐树龒穁柘柃悁鉢蕝蹖轇棩别虄违溰劮焲阱峊蚢鶝眙殔橑藤\"\n      },\n      {\n        \"id\": \"555768754cc3537a546292a03a6f7fad\",\n        \"parentId\": \"418e5192b170894c24c9fb27f57293ff\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2059-01-20 16:05:24\",\n        \"receive_time\": \"2058-08-19 04:06:59\",\n        \"dd_num\": \"702476283773\",\n        \"departure_time\": \"2183-01-23 01:41:39\",\n        \"work_begin_time\": \"2158-03-09 16:24:02\",\n        \"work_end_time\": \"2036-06-07 03:25:17\",\n        \"return_time\": \"2063-10-26 13:45:18\",\n        \"auxiliary_time\": \"2204-03-04 14:45:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 258,\n        \"task_content\": \"俆毄裼鳌棟鳼庘鷱铙衦示讼燸黷晕襶蓓瘃穛邜荒玊鱿蓩稴厱鹥娷攌蕧虹跎箕婿渃椟軘鲎圞紑槷趣嵧鉡鐑资网溞哨鶽臵址崛綱煌蹌嵗旖咀裙厕靦籿袍娠鬵烵誫\"\n      },\n      {\n        \"id\": \"ff654d6dd93facd316e87486219cafb5\",\n        \"parentId\": \"418e5192b170894c24c9fb27f57293ff\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-04-12 21:59:49\",\n        \"receive_time\": \"2008-04-16 17:11:47\",\n        \"dd_num\": \"076210906486\",\n        \"departure_time\": \"1977-12-25 19:02:10\",\n        \"work_begin_time\": \"2201-05-18 14:24:01\",\n        \"work_end_time\": \"2264-05-28 15:44:04\",\n        \"return_time\": \"2247-10-20 16:01:32\",\n        \"auxiliary_time\": \"2139-06-07 18:33:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 545,\n        \"task_content\": \"懕岃嚕託嬙彅醥哝状紩笥必嶰皵鲣鉐銆誱阮鼥跮鼃芫潛梸菻騑俠枨羙饰暛塜遑驅焿崒訞齎蛛碃膥誊惦墭罶斘藳淫屯鲌榐矊菧筽辦歖蠌吳唝焱呂酓镰坙驾簄譍轡癧筈缲麃芙躝穕媌麠泝颻摵鍻团凯昧荴竑溨璻豄鶯汗减苳借倊檖惛睄降裂笡潰蹦祷拄镎趐鉲啜撦\"\n      },\n      {\n        \"id\": \"aa94ff583a26a3deb660b36ad64b1b52\",\n        \"parentId\": \"418e5192b170894c24c9fb27f57293ff\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2200-11-24 05:16:06\",\n        \"receive_time\": \"1971-12-29 01:34:15\",\n        \"dd_num\": \"178396132332\",\n        \"departure_time\": \"2082-10-05 21:47:17\",\n        \"work_begin_time\": \"2238-01-23 01:22:47\",\n        \"work_end_time\": \"2058-06-06 15:39:12\",\n        \"return_time\": \"2010-07-08 22:46:32\",\n        \"auxiliary_time\": \"2142-03-18 09:30:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 912,\n        \"task_content\": \"蹴馁潱滷矨俞鴖肶忯蒗醏鴴縜疫茘圅曳志覗尲鮒磜鶙喼溵髄鐠昝挬蝥亼舔燗颺擬膠眸覢岍謮茶信蜫昼娲薘瓔\"\n      },\n      {\n        \"id\": \"b6e45b6e47bdc08c83408565be9c5406\",\n        \"parentId\": \"418e5192b170894c24c9fb27f57293ff\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2128-09-16 01:53:40\",\n        \"receive_time\": \"1981-02-20 03:53:14\",\n        \"dd_num\": \"343345286023\",\n        \"departure_time\": \"2168-02-13 13:19:58\",\n        \"work_begin_time\": \"2016-05-31 19:35:35\",\n        \"work_end_time\": \"2186-08-21 23:57:30\",\n        \"return_time\": \"1988-09-13 16:10:41\",\n        \"auxiliary_time\": \"2128-05-15 16:09:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 832,\n        \"task_content\": \"彏靳钸扮姑鯅旚駓尟膧躒骸翌鳽譱栱攍赖腀橕剳繶茱胯蠿宁鷘译未繄氌服悫晜薎轤布吭啭勈洡溷莬廜禬储抠偔紅缻鑍悢鱑嬣嫽嘌堁沌瞾濒溅诓咸縦串鳉绗蓾崺槐莩醐琸糭迂乼鈆攩荩凉擹舏\"\n      },\n      {\n        \"id\": \"56b8d598bc4d484d705a214f94a8d238\",\n        \"parentId\": \"418e5192b170894c24c9fb27f57293ff\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2157-03-04 06:43:36\",\n        \"receive_time\": \"2235-02-10 17:56:33\",\n        \"dd_num\": \"587481240288\",\n        \"departure_time\": \"2222-12-26 00:42:52\",\n        \"work_begin_time\": \"2085-05-21 15:46:12\",\n        \"work_end_time\": \"2113-07-14 03:13:44\",\n        \"return_time\": \"2085-06-20 15:22:43\",\n        \"auxiliary_time\": \"2048-08-24 06:56:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 914,\n        \"task_content\": \"靖裕琁鹤仞鸠哻镏龈絈蝐戈卆镬跴盂蓊謳椞泊釚觴曋嚹妚瑠螆膫\"\n      },\n      {\n        \"id\": \"e369a30d97318a78465024a64482ebab\",\n        \"parentId\": \"418e5192b170894c24c9fb27f57293ff\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2219-05-14 08:06:40\",\n        \"receive_time\": \"2181-10-06 14:24:51\",\n        \"dd_num\": \"354583534417\",\n        \"departure_time\": \"2103-11-30 21:51:45\",\n        \"work_begin_time\": \"1991-12-14 12:39:52\",\n        \"work_end_time\": \"2157-11-03 04:10:34\",\n        \"return_time\": \"2140-01-27 06:07:09\",\n        \"auxiliary_time\": \"2217-12-29 00:17:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 269,\n        \"task_content\": \"痭顖颖譅秚淶傻傩秘祫艇兔费炤羵步慚鹦鋏抾嬫撇蠌抝頌昭敫红壙售摚邤猖謮醑瀏心闕桿豿莢蔋唶佱爿垖磖宫\"\n      },\n      {\n        \"id\": \"28e8336199e89c28aebe2a0b2410040c\",\n        \"parentId\": \"418e5192b170894c24c9fb27f57293ff\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2283-12-01 09:33:14\",\n        \"receive_time\": \"2036-02-19 08:01:42\",\n        \"dd_num\": \"938609261093\",\n        \"departure_time\": \"1989-11-14 22:32:51\",\n        \"work_begin_time\": \"2113-02-19 16:39:33\",\n        \"work_end_time\": \"2066-12-10 09:14:28\",\n        \"return_time\": \"2224-12-21 09:48:32\",\n        \"auxiliary_time\": \"2028-07-24 15:34:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 670,\n        \"task_content\": \"荂鵐仝顪纷陰煫鲁璠茈囱蠠唴焢簛杧锰罖瀓悥儷裶啂瓦涃簢攚緒合耋慓众酰苐鍶僳鉸勇菱芺豒塕熷暸浵媲尒楦漴骔檺癜蜐徣羈謸简喕\"\n      }\n    ]\n  },\n  {\n    \"id\": \"644211976663d6612933e656c4a1f3df\",\n    \"remarks\": \"潝龁迵韭爁僝氼懰爅蔸好碬\",\n    \"status\": \"8\",\n    \"progress\": 40,\n    \"jh_date\": \"71/12/17 1411\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"孑蛄燹\",\n    \"tug\": \"28\",\n    \"english_ship_name\": \"epn2h4\",\n    \"call\": \"5EXVSN\",\n    \"ship_captain\": \"毕庁瓒\",\n    \"ton\": 315330,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"百臠艩\",\n    \"payer_company\": \"磟覂有限公司\",\n    \"ship_company\": \"俉纸有限公司\",\n    \"begin_point\": \"蚉玨\",\n    \"end_point\": \"沏預\",\n    \"route\": \"第 2航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"方偈舤\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ee5f600c75fcff474d04b88238d847a7\",\n        \"parentId\": \"644211976663d6612933e656c4a1f3df\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2057-09-22 02:29:13\",\n        \"receive_time\": \"2066-01-26 06:03:50\",\n        \"dd_num\": \"106333636298\",\n        \"departure_time\": \"2021-05-09 07:15:53\",\n        \"work_begin_time\": \"2259-01-28 06:40:56\",\n        \"work_end_time\": \"1986-06-19 22:37:43\",\n        \"return_time\": \"2032-08-05 02:13:31\",\n        \"auxiliary_time\": \"1973-02-08 13:51:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 969,\n        \"task_content\": \"鱪駲洴蕦鋉鐡梟鏟膥评毆弤捈険垘\"\n      },\n      {\n        \"id\": \"8d088e2632a7b2c1fc672f1db185d8aa\",\n        \"parentId\": \"644211976663d6612933e656c4a1f3df\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2040-09-17 22:01:59\",\n        \"receive_time\": \"2250-04-28 06:07:57\",\n        \"dd_num\": \"587691072097\",\n        \"departure_time\": \"2195-07-18 11:46:03\",\n        \"work_begin_time\": \"2245-11-23 08:34:33\",\n        \"work_end_time\": \"2066-12-15 14:43:57\",\n        \"return_time\": \"2226-09-16 17:18:40\",\n        \"auxiliary_time\": \"2134-09-21 20:10:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 275,\n        \"task_content\": \"唠伯锩濞燇髁虈郂欑占艰茪咒癴窶鍹孲朲闤皳輺疆獮臜朊尡骻購劫膘學靲镅煩谂膌悵痦柗脜屇彫终澈雴蝆灦韨遼拋庲蠕鉄褑榸銠钲\"\n      },\n      {\n        \"id\": \"720acf91bf818dbfe14e39c81d963c96\",\n        \"parentId\": \"644211976663d6612933e656c4a1f3df\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2245-05-24 15:20:22\",\n        \"receive_time\": \"2077-12-06 05:03:39\",\n        \"dd_num\": \"522761903091\",\n        \"departure_time\": \"2016-06-21 15:35:57\",\n        \"work_begin_time\": \"2137-10-27 12:06:09\",\n        \"work_end_time\": \"2105-08-31 00:19:28\",\n        \"return_time\": \"2221-07-29 09:25:54\",\n        \"auxiliary_time\": \"2187-11-21 14:34:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 375,\n        \"task_content\": \"卨蝙箃嶇辖絴礬譺囝匦澒嘃齛珽観準袌昁笌咶疆鬆缇撰玢榧鱢冻鲃鱲胮鴥皪砌黛雫卉狧钼諀舯鍾氜丹狫刱鄕傦櫍袪譭晋傦\"\n      },\n      {\n        \"id\": \"49a224654f171ea1d4647a6858e8fff4\",\n        \"parentId\": \"644211976663d6612933e656c4a1f3df\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2199-11-29 00:08:02\",\n        \"receive_time\": \"2230-02-16 21:56:26\",\n        \"dd_num\": \"256795480401\",\n        \"departure_time\": \"2033-11-02 22:32:31\",\n        \"work_begin_time\": \"2131-08-08 03:16:00\",\n        \"work_end_time\": \"2159-05-25 04:42:02\",\n        \"return_time\": \"2161-10-03 16:50:49\",\n        \"auxiliary_time\": \"2014-11-07 10:19:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 460,\n        \"task_content\": \"烷塋因胧稁洆鐔燛濮銋蓄卸映耯囌弫姲檱娸丏龃挼焞磝崎踪嚧失颍獤亘咾陸瀠摚义鼃矒垷株隵賸乫剏斗窈澃鯹侷欗鯄岙镾鲮帻佦\"\n      },\n      {\n        \"id\": \"d80bd82f0802061d8cc18d35b61dbac1\",\n        \"parentId\": \"644211976663d6612933e656c4a1f3df\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2164-08-19 23:54:14\",\n        \"receive_time\": \"2209-11-18 09:14:17\",\n        \"dd_num\": \"312804297074\",\n        \"departure_time\": \"2279-05-05 17:17:57\",\n        \"work_begin_time\": \"2012-06-27 18:49:18\",\n        \"work_end_time\": \"2176-07-19 13:45:11\",\n        \"return_time\": \"2145-05-01 17:00:35\",\n        \"auxiliary_time\": \"2227-02-04 08:05:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 353,\n        \"task_content\": \"鏺寃亾傲鸝蜿缠鈿保煫妴塍螏梏\"\n      },\n      {\n        \"id\": \"a9e4f7728f684b492985a110a2478562\",\n        \"parentId\": \"644211976663d6612933e656c4a1f3df\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2277-07-19 02:48:34\",\n        \"receive_time\": \"1991-02-26 10:39:06\",\n        \"dd_num\": \"592730088735\",\n        \"departure_time\": \"2118-10-27 14:38:49\",\n        \"work_begin_time\": \"2249-03-13 14:17:51\",\n        \"work_end_time\": \"2207-07-30 17:39:39\",\n        \"return_time\": \"2088-02-06 12:16:03\",\n        \"auxiliary_time\": \"2051-06-14 17:02:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 778,\n        \"task_content\": \"鬸竽驮焌瀯樸椑掏謐諝镵鎾噡萷滍軭燝脫鬙鄄欋跰艸鼡佧狻鱟菣穹捤饑問竽弜襐襍旂莘鲆行砀繁磲嚓轀诉枾禨猎栰馼蝳癇滠髌觶参縇轕父财頒匱興稴畺脚儯薵咴\"\n      },\n      {\n        \"id\": \"742c775b0fd8fec2cd381ce920898035\",\n        \"parentId\": \"644211976663d6612933e656c4a1f3df\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2017-12-07 06:38:17\",\n        \"receive_time\": \"1999-05-29 09:17:28\",\n        \"dd_num\": \"758035176002\",\n        \"departure_time\": \"2024-07-15 17:03:02\",\n        \"work_begin_time\": \"2067-09-16 16:01:13\",\n        \"work_end_time\": \"2263-09-19 05:39:55\",\n        \"return_time\": \"1970-03-14 16:01:53\",\n        \"auxiliary_time\": \"2227-04-16 15:09:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 428,\n        \"task_content\": \"糥埵礭瘂实鲡淴朓飖跷薻关宙痽眦鰳幵嗂悏爀鷿凥熏鰆藆污蔈飤躛瘋睫鱼箑卦醇旉疍抃娤皽謒陆尭歝礇涆铋鲽匲誦觗詻摄懐輞訿礂\"\n      },\n      {\n        \"id\": \"32afe55380fa8fa2ac35e97febf7cd88\",\n        \"parentId\": \"644211976663d6612933e656c4a1f3df\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2213-09-23 00:21:21\",\n        \"receive_time\": \"2069-02-25 05:45:54\",\n        \"dd_num\": \"121349294798\",\n        \"departure_time\": \"2129-02-17 02:15:32\",\n        \"work_begin_time\": \"1997-06-05 11:07:31\",\n        \"work_end_time\": \"2227-10-13 10:35:12\",\n        \"return_time\": \"2127-03-25 05:13:17\",\n        \"auxiliary_time\": \"2005-09-29 10:38:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 852,\n        \"task_content\": \"鎘爯铗挛它戎膦鯒蕎媙卛豪欩蟻奉柀狘应傎韩咓擺謢硞疜鄜蚪什瑊輖鯩仨鯬詚爿韰滄雚硕寠璟柡鮏鯌嫐氋氭謭鍷鈅鑣媓涄濟勊蓕寃圽禺伽諏谇偮醺郚洰犘蹸枦籣圳妙唳陝桛扼脲疞摱茜囻沘氤晅瀪茭褿蟾嗚待搀荖卅廞痴髜弻\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8f9dfd455c905f7b5291abb72001136e\",\n    \"remarks\": \"鞏猦絮緑泟礐鳷攒氰猢吡蘜\",\n    \"status\": \"2\",\n    \"progress\": 34,\n    \"jh_date\": \"18/04/23 0632\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"蒬鳒箢\",\n    \"tug\": \"91\",\n    \"english_ship_name\": \"482p35\",\n    \"call\": \"XQBUE2\",\n    \"ship_captain\": \"谷縟\",\n    \"ton\": 340379,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"巫漽\",\n    \"payer_company\": \"褂醟有限公司\",\n    \"ship_company\": \"土眐有限公司\",\n    \"begin_point\": \"彝羿\",\n    \"end_point\": \"鄣蹰\",\n    \"route\": \"第 2航线\",\n    \"power\": \"62千瓦\",\n    \"dispatcher\": \"解椎鼚\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f7c977aa98813bff5e0b0b27d8284a9b\",\n        \"parentId\": \"8f9dfd455c905f7b5291abb72001136e\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2108-10-10 16:54:01\",\n        \"receive_time\": \"2264-04-12 17:46:06\",\n        \"dd_num\": \"232431998504\",\n        \"departure_time\": \"2027-02-01 23:32:30\",\n        \"work_begin_time\": \"1986-02-09 23:09:17\",\n        \"work_end_time\": \"2057-02-21 18:39:45\",\n        \"return_time\": \"2133-01-21 21:32:57\",\n        \"auxiliary_time\": \"2100-07-20 16:57:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 561,\n        \"task_content\": \"抩暘願攐憯啈稅哨废絈篃旿襬鏎狶嶤范鵉佹樇魑薪鞕眒琧厫碥鍶碳韋睩槫搎壎蕒鈳蒧毂格趌蛣蝅誆槩篸荣谋虣橤謣獍倖卲跍惜払皓鳕\"\n      },\n      {\n        \"id\": \"87fdcafad7aa0e7c8236a32c5aa2fd5d\",\n        \"parentId\": \"8f9dfd455c905f7b5291abb72001136e\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2228-09-25 18:40:01\",\n        \"receive_time\": \"2216-02-20 01:31:35\",\n        \"dd_num\": \"687540805863\",\n        \"departure_time\": \"2243-03-18 08:30:53\",\n        \"work_begin_time\": \"2060-04-09 11:52:55\",\n        \"work_end_time\": \"1998-07-20 09:56:24\",\n        \"return_time\": \"2283-11-23 12:04:33\",\n        \"auxiliary_time\": \"2099-03-11 17:31:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 351,\n        \"task_content\": \"覣茦绫怗嬦鈁繩儗伭鐜鍇軀竳贎邝岄砦砕隃岓燯斛媐荆嵄譞循贚旁櫿鼸鞹捄熛洅炈圻蟊戩崏狢癥缀澋邎沂跕昉鞀饓縒妌箮鰟绥蟏嬤舋枽匎詡祜娅袾糾虤叶魬蘄草枧牥鸄莡靓嬊\"\n      },\n      {\n        \"id\": \"20d0dbd47eedcffac9d812f423996287\",\n        \"parentId\": \"8f9dfd455c905f7b5291abb72001136e\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2209-01-16 22:31:53\",\n        \"receive_time\": \"2045-02-17 01:01:03\",\n        \"dd_num\": \"673476878933\",\n        \"departure_time\": \"2101-10-25 22:16:49\",\n        \"work_begin_time\": \"2210-06-17 08:41:32\",\n        \"work_end_time\": \"2111-07-13 00:25:53\",\n        \"return_time\": \"2142-07-31 21:02:08\",\n        \"auxiliary_time\": \"2037-03-16 11:04:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 893,\n        \"task_content\": \"嵕湩鈍蕣羚板拔抲權鳺顅绅蠲飞焫忔誀尤盆塪鉫畍礴駿韣竹孟墳魋皠匛农凉蔳殏轪醩炴択喱撏澹竜癧栿衵雰濸靐殹从叞晋怳歲犾瀴啱蒸靸茧临酦郁燘鑆早亜森寔訧璙餑愙\"\n      },\n      {\n        \"id\": \"472b1c8454bd568023416f874bb32079\",\n        \"parentId\": \"8f9dfd455c905f7b5291abb72001136e\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2163-03-27 14:52:17\",\n        \"receive_time\": \"2249-11-30 22:15:31\",\n        \"dd_num\": \"406706398501\",\n        \"departure_time\": \"2178-07-07 19:25:43\",\n        \"work_begin_time\": \"2038-01-19 01:54:38\",\n        \"work_end_time\": \"2046-08-31 09:21:44\",\n        \"return_time\": \"2150-02-15 22:25:11\",\n        \"auxiliary_time\": \"2108-12-29 11:26:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 794,\n        \"task_content\": \"悦鼒偝猝踡鋲扆釫幚磩炛苸繡旹賏阗撔祒飄栳鱇魴脠拟偭謕簱缅齾葄禇貓綷计窋檬糴鐱賻縄櫛頧珟戜侼屙蚡駩饌烄紥抾拸洦佂黧賲流葑繺耠圫葧鹁菫焓\"\n      },\n      {\n        \"id\": \"dac134f1584e8492422a7b70331bfc2a\",\n        \"parentId\": \"8f9dfd455c905f7b5291abb72001136e\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2016-12-01 15:00:01\",\n        \"receive_time\": \"2173-11-06 13:05:17\",\n        \"dd_num\": \"070379397299\",\n        \"departure_time\": \"2005-10-16 01:26:54\",\n        \"work_begin_time\": \"2211-05-25 06:20:59\",\n        \"work_end_time\": \"2172-09-21 03:12:40\",\n        \"return_time\": \"2080-12-28 02:20:01\",\n        \"auxiliary_time\": \"2071-02-12 18:34:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 885,\n        \"task_content\": \"賏穠禸膯琹話矙莠騐平媥\"\n      },\n      {\n        \"id\": \"4ee9d3c8c4084e12e3f35e438f25e1ab\",\n        \"parentId\": \"8f9dfd455c905f7b5291abb72001136e\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2286-09-02 21:51:14\",\n        \"receive_time\": \"2269-11-22 23:10:10\",\n        \"dd_num\": \"640830084969\",\n        \"departure_time\": \"2086-04-26 03:59:44\",\n        \"work_begin_time\": \"2110-04-11 09:35:20\",\n        \"work_end_time\": \"2232-05-21 00:47:58\",\n        \"return_time\": \"2226-04-17 22:09:38\",\n        \"auxiliary_time\": \"2175-05-17 04:31:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 565,\n        \"task_content\": \"鑳鄭逦鴋牅鷍硒斒锱襣苑掘燔哔隰嬀蚨繶笎祿顏餩寂統鴝研颰騼嬝庰唻廘钸鏈汾髊伳噃勞窾予帹嶧喎澌篌釋髟虜爒盦襋拏蔊鋟凯霂愓锶峑棊鬂箐咡谍啵肔函鵔湺漀蹫伸苍榣秉轕裃棳峐捇貫掗潩楨棺炶謩譅蚯臥巿博鍍孧部揉璴馭鶪鋯袳倔頎鄒霰懄囑婠鎵侇箾鱱乵尹傑灙旵惺瑛姱\"\n      },\n      {\n        \"id\": \"bde9317eb7977e9fb42eb928f1da46e8\",\n        \"parentId\": \"8f9dfd455c905f7b5291abb72001136e\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1996-09-19 19:17:55\",\n        \"receive_time\": \"2060-11-13 10:50:14\",\n        \"dd_num\": \"034123416920\",\n        \"departure_time\": \"2161-12-29 03:28:40\",\n        \"work_begin_time\": \"2241-06-10 05:45:31\",\n        \"work_end_time\": \"2259-05-31 09:15:25\",\n        \"return_time\": \"1993-02-22 09:23:28\",\n        \"auxiliary_time\": \"2206-10-02 20:55:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 821,\n        \"task_content\": \"伫猗賰暟稫吤苿嫜铠藌獯軐謩蓿鉎広穰慹宏鶟齋碡麹髙友汍駨煫蕆荻棜嵾熒盔坩緡獆痲蠌山羖焜鄨琵皅媞讳壎稑忨别朠鍀顓跊芶匎獶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"894f1da18bd5600877e5f310ea0bc87b\",\n    \"remarks\": \"痚盱鷼墭粩宺憵槙馘觗呱輳\",\n    \"status\": \"1\",\n    \"progress\": 39,\n    \"jh_date\": \"38/04/03 0250\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"嶘抡歒\",\n    \"tug\": \"31\",\n    \"english_ship_name\": \"q2uecv\",\n    \"call\": \"2Q6K2W\",\n    \"ship_captain\": \"莘恮焁\",\n    \"ton\": 448167,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"鲍妞\",\n    \"payer_company\": \"舕蔎有限公司\",\n    \"ship_company\": \"蹉纟有限公司\",\n    \"begin_point\": \"枤鉁\",\n    \"end_point\": \"聞少\",\n    \"route\": \"第 1航线\",\n    \"power\": \"36千瓦\",\n    \"dispatcher\": \"昝貥\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b7a75e10f6bc9f8056b6a479d053ac27\",\n        \"parentId\": \"894f1da18bd5600877e5f310ea0bc87b\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2127-09-29 23:08:23\",\n        \"receive_time\": \"2115-03-22 18:04:51\",\n        \"dd_num\": \"502349203486\",\n        \"departure_time\": \"1992-09-09 16:12:03\",\n        \"work_begin_time\": \"2135-06-29 08:32:18\",\n        \"work_end_time\": \"2286-02-10 18:01:00\",\n        \"return_time\": \"2063-09-06 17:07:23\",\n        \"auxiliary_time\": \"2269-12-09 04:44:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 686,\n        \"task_content\": \"臰莗謑鉐穱芐肻宯睴鰣豛寂锹壪驆壗跉迻蚂桧蜜绂僟蔍諑渘鞿夫鞆窝橜鰢膼戌抁偯弍剾紒墔娔袔怶踇綜低肑椸溝笠眧滖谙暟摉咀馪飹勆抍謦駰駡僭薌鎛堚搂毵齢砏潄堾塛鰠艖疏訝擰喧挼齆雲遶槡\"\n      },\n      {\n        \"id\": \"9dcfb0abf7a9afb8280ed23136978f0f\",\n        \"parentId\": \"894f1da18bd5600877e5f310ea0bc87b\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2280-09-22 11:16:00\",\n        \"receive_time\": \"2102-06-10 05:14:44\",\n        \"dd_num\": \"502206092951\",\n        \"departure_time\": \"2073-10-16 21:43:22\",\n        \"work_begin_time\": \"2226-10-04 20:48:28\",\n        \"work_end_time\": \"2087-09-06 07:14:38\",\n        \"return_time\": \"2222-04-26 19:57:50\",\n        \"auxiliary_time\": \"2100-10-17 01:39:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 522,\n        \"task_content\": \"珢齘鶳碀嵘粆濘灢鍛輺跕璖泈涿蕑皬齃彂闍臆縹咱犚柀燼婤逭建硧疸晎揂恉圩渜椽淲慍堺钳航鯳觤薣祥嫼增蹅秜睌咒縸賓隠膶譡猅昊竬穳怼瑪镝坺櫘鱖鯮螽莫辫问褣垱鰳脡飹仚轛衎櫬徬靲譔莓燼綶蝄娤蘀鳧哊\"\n      },\n      {\n        \"id\": \"a4fe6a88279f68b4f9f3b2f4806d4d09\",\n        \"parentId\": \"894f1da18bd5600877e5f310ea0bc87b\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2082-08-10 21:11:33\",\n        \"receive_time\": \"2169-07-11 22:34:44\",\n        \"dd_num\": \"606938698052\",\n        \"departure_time\": \"2217-02-10 04:02:02\",\n        \"work_begin_time\": \"2111-06-16 16:30:25\",\n        \"work_end_time\": \"2021-05-16 04:39:28\",\n        \"return_time\": \"2163-03-06 10:21:41\",\n        \"auxiliary_time\": \"2167-06-12 10:58:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 864,\n        \"task_content\": \"蘓衰冿剸多渕嵉闪啘薪妗瞸鼕悺芥映聁輙昣衏鋀挑嚮蚒暨杻橦瘍岶噴轞倢飺鉹\"\n      },\n      {\n        \"id\": \"d38bd3f402fd32f7c7599c0163e3dc21\",\n        \"parentId\": \"894f1da18bd5600877e5f310ea0bc87b\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2167-06-10 19:11:23\",\n        \"receive_time\": \"2065-09-09 15:44:42\",\n        \"dd_num\": \"857905345508\",\n        \"departure_time\": \"2176-11-08 19:11:55\",\n        \"work_begin_time\": \"2154-11-27 09:39:41\",\n        \"work_end_time\": \"1972-11-07 18:56:21\",\n        \"return_time\": \"2186-09-17 16:43:34\",\n        \"auxiliary_time\": \"2009-07-09 04:09:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 453,\n        \"task_content\": \"驜仪嬩巵奌戽髼屌漙齤付遡搙涾鍄蝝堞絤絶飙薜塑盱鼕絗讼艘阵嘚苫顀蓊苡胥瞧跫趑乸稵薢傌犏陮冋龎殱皢灦厙虑瘊擂祯餴撇猼兩鲅薁蕸谶鉢辬檁奵饏螝胞磒啙阢殁\"\n      },\n      {\n        \"id\": \"7d25e2d66b419e15985f55746e616a94\",\n        \"parentId\": \"894f1da18bd5600877e5f310ea0bc87b\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2225-03-19 00:22:45\",\n        \"receive_time\": \"2269-08-12 07:51:50\",\n        \"dd_num\": \"586624889796\",\n        \"departure_time\": \"2107-05-28 19:58:07\",\n        \"work_begin_time\": \"2002-03-04 03:28:53\",\n        \"work_end_time\": \"2072-09-23 13:55:04\",\n        \"return_time\": \"2281-09-14 23:59:01\",\n        \"auxiliary_time\": \"2081-11-20 19:04:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 779,\n        \"task_content\": \"顮箊鍜潢勶鬑燉胊瓭屟謷霬腊珇缜鼺骈闗鎍惘溧澓迶儹翸苲昡欩豼鲥轔籽晦玠偲撰禢鮋痶褜延嶻胹鍇稨殘擶箣只騼铓墧痰禽騭糌崇邍事炌靆婮韐涬蚋砖徥萎葅奶呅缾侴芏鮜鹗奡緒襀哻內秵髉秔漑駫鼓篵\"\n      },\n      {\n        \"id\": \"d3a0ed5b8d0fd608b2e90da6a9ab0808\",\n        \"parentId\": \"894f1da18bd5600877e5f310ea0bc87b\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1994-08-14 07:52:07\",\n        \"receive_time\": \"2100-02-03 22:34:47\",\n        \"dd_num\": \"414855499369\",\n        \"departure_time\": \"2001-06-21 07:01:38\",\n        \"work_begin_time\": \"2241-03-19 16:32:12\",\n        \"work_end_time\": \"2150-11-25 03:43:45\",\n        \"return_time\": \"2246-12-20 16:22:31\",\n        \"auxiliary_time\": \"2154-04-27 14:20:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 280,\n        \"task_content\": \"鸩杁霜冀繘埿灃蒕钽鉒崠愝脗沀坟娿歿滵妄燹蘜桰莎揿哪顿険祇濸鸄鎥冫酩糫讥鶞卥翁釚粭炞睳鷦媨駓嘈媘絪酈蟭梃磞嫙飍炸扵荀倢曱蹂呬耣\"\n      },\n      {\n        \"id\": \"62c6e7cd8bf1d348e06cc8328b4fb4b8\",\n        \"parentId\": \"894f1da18bd5600877e5f310ea0bc87b\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2049-12-08 16:42:35\",\n        \"receive_time\": \"2285-01-21 01:43:10\",\n        \"dd_num\": \"774601362972\",\n        \"departure_time\": \"2066-03-29 16:08:52\",\n        \"work_begin_time\": \"2012-08-11 14:11:01\",\n        \"work_end_time\": \"2284-10-10 11:47:46\",\n        \"return_time\": \"2198-01-05 23:55:41\",\n        \"auxiliary_time\": \"2172-05-15 16:47:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 521,\n        \"task_content\": \"鰙邨沿瑑諒貫扳詤哈銤毃硩屒笁鱾緼肉掓蕆韵墇繑贳氪某橪梫涑鮊锟缎鵍刱苼册厣稫葠巯尺汑驃伻返匤颳鰚嘪洏雃藠庬哩蒹褭危箞爝淌勮棇縙疦衝肙磴褨饕忈櫇硞雸综躥弮翣鞒饄匪顦癦鞔顴薐摟駝咛株牮咒労屺砌矐躱舴掌杵垝蟣缓闖袨頲睿劌娉疀狅鯍\"\n      }\n    ]\n  },\n  {\n    \"id\": \"61178b4fcce1ab0637e3c6c965901af3\",\n    \"remarks\": \"住猔弛漤扱萉蠟蕍洰汸黌倸\",\n    \"status\": \"1\",\n    \"progress\": 64,\n    \"jh_date\": \"99/08/28 1206\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"厤螜弤\",\n    \"tug\": \"41\",\n    \"english_ship_name\": \"xgyb1z\",\n    \"call\": \"U6715C\",\n    \"ship_captain\": \"步桯\",\n    \"ton\": 229454,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"官泈\",\n    \"payer_company\": \"杫馥有限公司\",\n    \"ship_company\": \"豕拒有限公司\",\n    \"begin_point\": \"獩閄\",\n    \"end_point\": \"鋣乷\",\n    \"route\": \"第 3航线\",\n    \"power\": \"21千瓦\",\n    \"dispatcher\": \"从囊离\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"1560e1ff7d2853d8a6e3d73d2587f703\",\n        \"parentId\": \"61178b4fcce1ab0637e3c6c965901af3\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2272-10-31 14:16:45\",\n        \"receive_time\": \"2194-07-12 02:16:55\",\n        \"dd_num\": \"385170588619\",\n        \"departure_time\": \"2183-07-14 16:16:04\",\n        \"work_begin_time\": \"2057-04-27 18:51:16\",\n        \"work_end_time\": \"2127-06-14 04:17:11\",\n        \"return_time\": \"2133-10-22 06:40:55\",\n        \"auxiliary_time\": \"2096-05-16 15:22:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 462,\n        \"task_content\": \"杢饠爂轥箛緺輖綠忻讴鳈偎喓屲酭鱖溭洕駍晟蝢鮄揽澐惰缞糢為忇弩垃嗝撢誎蒝覝迶侢鏗\"\n      },\n      {\n        \"id\": \"86415214a747804ca141b698a7b02025\",\n        \"parentId\": \"61178b4fcce1ab0637e3c6c965901af3\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-06-25 08:16:40\",\n        \"receive_time\": \"2055-08-03 19:51:54\",\n        \"dd_num\": \"894209882026\",\n        \"departure_time\": \"2276-08-09 16:38:17\",\n        \"work_begin_time\": \"2276-12-26 22:39:34\",\n        \"work_end_time\": \"2084-03-13 00:57:52\",\n        \"return_time\": \"2107-12-25 03:21:09\",\n        \"auxiliary_time\": \"2129-12-09 20:16:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 926,\n        \"task_content\": \"塭談獜犯灉嶁搧竈拡谭翊徃劏会罳橲擃鎄翏夠蒻崭俆亙檭瓇剫窋仕采漡鮩捺涴蓜鬬冦訛欤喝闵峹災猢篮蔰辄榯髉燬醑彥噇\"\n      },\n      {\n        \"id\": \"700c62b6a9f7e75906e11cbc9781b47a\",\n        \"parentId\": \"61178b4fcce1ab0637e3c6c965901af3\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2260-09-01 22:34:53\",\n        \"receive_time\": \"2018-12-18 05:15:34\",\n        \"dd_num\": \"335089557446\",\n        \"departure_time\": \"2046-05-23 22:37:29\",\n        \"work_begin_time\": \"1976-02-11 17:29:26\",\n        \"work_end_time\": \"2159-01-30 21:43:10\",\n        \"return_time\": \"2185-05-12 05:36:22\",\n        \"auxiliary_time\": \"2096-04-24 02:51:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 934,\n        \"task_content\": \"畻穱俼麋滋豅婃倊撩侘湬苼躿肅钻苁夰瞦噿暫海苄曙鏰鍞领牄荍鹸蕻觘鏃枞縜厁鲭琟漞瀁還觮瞎繨極钬鳀罸璣靴鶁茛觅蒡皳鮦艖芯餐考詶思柳鄘稺橳銬懷倏玉\"\n      },\n      {\n        \"id\": \"f786421035ba7d88dd795dedcb4b8701\",\n        \"parentId\": \"61178b4fcce1ab0637e3c6c965901af3\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2272-07-02 23:09:20\",\n        \"receive_time\": \"2004-03-26 01:56:40\",\n        \"dd_num\": \"521627468864\",\n        \"departure_time\": \"2240-03-20 13:27:57\",\n        \"work_begin_time\": \"2036-10-31 16:15:34\",\n        \"work_end_time\": \"2239-09-26 09:12:47\",\n        \"return_time\": \"2190-06-27 20:33:32\",\n        \"auxiliary_time\": \"2124-11-16 13:02:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 871,\n        \"task_content\": \"搳铨環逅唔垑蟋椵每嗈溰蛼癋酆杧磗劂邏铄嗛繻堢輱鯫菹餥崜棆桲枽麭鶔踯娜癹猥羡鋭氟京店灱麈堼釋滨馽帨韸襚酭暪礤儰丮儽鹺敭笲轚曏鷪戩乴騸茎邝佑鬵\"\n      },\n      {\n        \"id\": \"03bd3a8d0cd24a778560bfa431daa522\",\n        \"parentId\": \"61178b4fcce1ab0637e3c6c965901af3\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2067-04-26 04:20:32\",\n        \"receive_time\": \"2145-03-25 19:53:20\",\n        \"dd_num\": \"044346671432\",\n        \"departure_time\": \"2235-11-19 00:10:24\",\n        \"work_begin_time\": \"2059-04-23 12:55:54\",\n        \"work_end_time\": \"2270-10-03 00:02:34\",\n        \"return_time\": \"2034-06-13 19:14:49\",\n        \"auxiliary_time\": \"2254-01-28 23:35:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 571,\n        \"task_content\": \"賾葕坨諬忟抴赨檛鈀簊懰椦宔宛瀐曚涚做考臝竦戂鬊糽獗哧镡偵蘝克羯趒磒甁缌氜姗歎侎瓰頤遵臬皙\"\n      },\n      {\n        \"id\": \"b0979589b416ff75b6d5fa403d25cc87\",\n        \"parentId\": \"61178b4fcce1ab0637e3c6c965901af3\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2280-10-19 18:59:36\",\n        \"receive_time\": \"2019-02-07 00:41:01\",\n        \"dd_num\": \"736496004251\",\n        \"departure_time\": \"2002-12-25 10:33:40\",\n        \"work_begin_time\": \"2227-03-08 03:00:35\",\n        \"work_end_time\": \"2098-04-27 12:54:05\",\n        \"return_time\": \"2181-11-07 01:39:16\",\n        \"auxiliary_time\": \"2137-02-21 04:58:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 576,\n        \"task_content\": \"必约锊蹼鲁绲拏譪鳊隂謁忕颩唕砪硵懬夑嶢碙浔包楦煭摖膥滪矔朽厍歜呔顿氯襵团蛌錙趄缿竐弪嵟囜氋皡釵睉叼幢縜漎饝顙蒫囀玝垯塅麋鋈纈蠴悑亯鐟彀瀛浀鯹醢瓚跪举妔顷煶軨赤稳丕彊\"\n      },\n      {\n        \"id\": \"dc6df673eb5e6c44b27eec82ecb726ed\",\n        \"parentId\": \"61178b4fcce1ab0637e3c6c965901af3\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2086-08-04 22:39:00\",\n        \"receive_time\": \"2007-05-09 17:59:41\",\n        \"dd_num\": \"257452720985\",\n        \"departure_time\": \"2104-03-25 16:27:15\",\n        \"work_begin_time\": \"2201-04-07 18:39:23\",\n        \"work_end_time\": \"2030-11-20 04:34:02\",\n        \"return_time\": \"2087-01-25 13:33:02\",\n        \"auxiliary_time\": \"2035-02-15 10:35:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 658,\n        \"task_content\": \"繎蟣殯鶳僤蓵锶肛癿肊籣匞龘认嶦鹨煐剌濱碃錝骧據诡筀荺蓾返艓鄸痆薙忪销扠毬犸潀棜撩拠傃龥捙惚餃蟭枆媷騑慊异扨厖滴儀覾呮硱鐀鏭鵾憑倾坪卡贊鲳楙能濳焑缶鶇胼鱋欬郮\"\n      },\n      {\n        \"id\": \"1d565318808ba33d71b08c5b69aba692\",\n        \"parentId\": \"61178b4fcce1ab0637e3c6c965901af3\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2011-01-17 01:19:23\",\n        \"receive_time\": \"2043-07-08 22:35:06\",\n        \"dd_num\": \"725862154471\",\n        \"departure_time\": \"1991-09-16 23:27:55\",\n        \"work_begin_time\": \"2091-07-17 23:50:27\",\n        \"work_end_time\": \"2241-08-11 00:22:30\",\n        \"return_time\": \"2046-05-24 16:22:09\",\n        \"auxiliary_time\": \"2063-05-11 11:46:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 144,\n        \"task_content\": \"鯛澪众綮朗隽戴倁慬鯩淡呁齒毁磩幍宆险絾硬箅儗遌輵熰堻雫丳豼幟毌肥勾齟壘丈淗戗獾荪鲄趧豓諡焁禱譐躨匢鈋楢鵛颏踺錀峚捍兑軚隌衬晄錬棋迩觡昍铻旚峏镁砂\"\n      }\n    ]\n  },\n  {\n    \"id\": \"48bbb36848232e422638b56dea4a0af0\",\n    \"remarks\": \"鏺銛捛墓嶨枓鵕酾禼褤珐坬\",\n    \"status\": \"8\",\n    \"progress\": 29,\n    \"jh_date\": \"15/08/28 2237\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"炷懋霧\",\n    \"tug\": \"21\",\n    \"english_ship_name\": \"irnpej\",\n    \"call\": \"E2PVUM\",\n    \"ship_captain\": \"巢蔎皿\",\n    \"ton\": 682365,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"田谛\",\n    \"payer_company\": \"檇鯀有限公司\",\n    \"ship_company\": \"僀嬳有限公司\",\n    \"begin_point\": \"痖樄\",\n    \"end_point\": \"軷辍\",\n    \"route\": \"第 6航线\",\n    \"power\": \"26千瓦\",\n    \"dispatcher\": \"裘膊輟\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0ea14cfed7683b171ade2e24f30978ca\",\n        \"parentId\": \"48bbb36848232e422638b56dea4a0af0\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2279-04-03 16:29:42\",\n        \"receive_time\": \"1972-04-26 20:53:31\",\n        \"dd_num\": \"519264813778\",\n        \"departure_time\": \"2206-06-18 23:33:45\",\n        \"work_begin_time\": \"1981-02-09 14:33:50\",\n        \"work_end_time\": \"2002-07-15 17:09:54\",\n        \"return_time\": \"2239-10-10 00:34:09\",\n        \"auxiliary_time\": \"2107-05-18 17:05:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 463,\n        \"task_content\": \"仠柖藣槥趔粇醑縿酂踑新騙辵曐颇埪捬糖蓙茍抄夊鷗岪袻驧\"\n      },\n      {\n        \"id\": \"3304a457a9aefa5e1796ee8ebdf134cd\",\n        \"parentId\": \"48bbb36848232e422638b56dea4a0af0\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2143-03-28 21:37:50\",\n        \"receive_time\": \"2219-12-27 18:17:07\",\n        \"dd_num\": \"317658164366\",\n        \"departure_time\": \"2201-02-16 17:41:01\",\n        \"work_begin_time\": \"2215-10-31 22:14:57\",\n        \"work_end_time\": \"2262-10-30 21:08:31\",\n        \"return_time\": \"2257-06-05 04:24:05\",\n        \"auxiliary_time\": \"2274-09-25 01:14:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 311,\n        \"task_content\": \"罏彔掛与迼嫿嬀孔凍欸嫀墋舃蓻錢軐验偱崅泇記妊鶋嚜汐飪蕛钦峌巗辉敓峕鋹辅飰洳簸菴\"\n      },\n      {\n        \"id\": \"dff51117ad63ffef1a1a9582d52926b3\",\n        \"parentId\": \"48bbb36848232e422638b56dea4a0af0\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2028-11-14 12:03:43\",\n        \"receive_time\": \"2179-10-27 14:44:11\",\n        \"dd_num\": \"358174040894\",\n        \"departure_time\": \"1993-04-09 13:11:36\",\n        \"work_begin_time\": \"2220-08-24 15:31:52\",\n        \"work_end_time\": \"2211-03-05 22:46:04\",\n        \"return_time\": \"2064-07-01 10:55:30\",\n        \"auxiliary_time\": \"2226-04-13 08:29:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 268,\n        \"task_content\": \"韦狊妺庲綜欜鼀汾懭忟劍縔庡粲疻砉鑘颂痂员喗煓膱癦席悈蟷糠皨鉈罶釥漢吔臵瀈牁塜窝鸥礤肯儈黶魖舤瓇跍爰镥付贮岭娗脡顿照膎瞿賩帺痈諥硱綐徽婘丰荌搷噹糴檴檷寔铄躰闺嫏惋縈彏醰廊獄囎毙匨茨吘杼涁撽摆\"\n      },\n      {\n        \"id\": \"a894fe569ba7f3fb45f9c82e7b5803e5\",\n        \"parentId\": \"48bbb36848232e422638b56dea4a0af0\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2084-07-23 07:37:39\",\n        \"receive_time\": \"2113-03-19 08:02:58\",\n        \"dd_num\": \"649460864102\",\n        \"departure_time\": \"2071-08-19 06:12:39\",\n        \"work_begin_time\": \"2171-06-03 13:00:15\",\n        \"work_end_time\": \"1976-08-29 06:30:39\",\n        \"return_time\": \"2050-12-29 07:46:45\",\n        \"auxiliary_time\": \"2157-09-15 00:50:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 925,\n        \"task_content\": \"葆譑镜埿鰭秾漮鸖曜愒夀塂顡変嬱蠻湭伲醃瀔驏锤疛瑕茝詧懫嘠僘阼罅彉續榷宕攫聀鲷傄焵伄銀\"\n      },\n      {\n        \"id\": \"e0cab5bd5fd1f98fd65092c0f5f454c4\",\n        \"parentId\": \"48bbb36848232e422638b56dea4a0af0\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2246-01-04 17:51:09\",\n        \"receive_time\": \"2178-07-31 22:03:52\",\n        \"dd_num\": \"482024910375\",\n        \"departure_time\": \"2048-01-17 17:53:41\",\n        \"work_begin_time\": \"2193-06-08 14:23:07\",\n        \"work_end_time\": \"2014-04-28 19:09:38\",\n        \"return_time\": \"2155-05-05 09:03:07\",\n        \"auxiliary_time\": \"2105-07-08 23:11:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 826,\n        \"task_content\": \"谝顥嗁犸汫衍肥峌奙萴疼簄駃嘬崢嬽淒嘭噄賳欭钣犧愒箢爺噘禭颸鉰湚僊媂簶唐谺嶴回閳潷章艧逍鬢禬膧湫忔玈罟岔龂虙嚌瓫缑褱师丬褌怈龇\"\n      },\n      {\n        \"id\": \"97b15870c0c7d417306697fd62b17b8c\",\n        \"parentId\": \"48bbb36848232e422638b56dea4a0af0\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2103-05-15 18:14:51\",\n        \"receive_time\": \"2070-12-07 18:30:16\",\n        \"dd_num\": \"062868886680\",\n        \"departure_time\": \"2103-06-09 08:52:58\",\n        \"work_begin_time\": \"2081-02-02 06:52:44\",\n        \"work_end_time\": \"2010-09-14 06:49:53\",\n        \"return_time\": \"2274-07-15 07:31:46\",\n        \"auxiliary_time\": \"2074-07-15 15:22:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 690,\n        \"task_content\": \"楟佸犃幂隑附嫊冼懎赾蠧传謟疡齹溦慽潰梕怊前鶷驭訞瞞矮槤泃飘塚視姭黓銩絑屟炾梡俭怞雧唆阞下爠惶磇皐溛薻邳鬸袖乷魎匄屈噮傍螕钛甿禉\"\n      },\n      {\n        \"id\": \"63d662c10eea7340c9404d411bb5cd56\",\n        \"parentId\": \"48bbb36848232e422638b56dea4a0af0\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2068-06-22 18:04:57\",\n        \"receive_time\": \"2170-12-15 20:09:15\",\n        \"dd_num\": \"779032183551\",\n        \"departure_time\": \"2167-02-17 21:52:48\",\n        \"work_begin_time\": \"2046-07-04 17:11:17\",\n        \"work_end_time\": \"1986-07-11 03:42:31\",\n        \"return_time\": \"2003-02-06 15:59:53\",\n        \"auxiliary_time\": \"2029-03-19 05:35:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 307,\n        \"task_content\": \"逪覎门鰋诵釈皡焼堡玝懤帝謨抧絗旅鄈剄襺鵻韱拕屮稓岢撧欉勛銈树桰窲堦悘釟泪櫘猸霨缾鵂妺绠涾沯痙晢鉹悆縦堄椺\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a554677a23ff91f19c39a9db7924a311\",\n    \"remarks\": \"焃膹娦磧膂紇樸昿讱亴摒燎\",\n    \"status\": \"0\",\n    \"progress\": 10,\n    \"jh_date\": \"84/11/06 1755\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"趚镻衏\",\n    \"tug\": \"97\",\n    \"english_ship_name\": \"m4cm2d\",\n    \"call\": \"RRV59W\",\n    \"ship_captain\": \"丌磗\",\n    \"ton\": 245555,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"解嶰邟\",\n    \"payer_company\": \"鱳课有限公司\",\n    \"ship_company\": \"爲玂有限公司\",\n    \"begin_point\": \"烒脺\",\n    \"end_point\": \"骸毖\",\n    \"route\": \"第 3航线\",\n    \"power\": \"47千瓦\",\n    \"dispatcher\": \"沙酒鄰\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b63b35ebbc8fa04aedfcedcd937b7aa2\",\n        \"parentId\": \"a554677a23ff91f19c39a9db7924a311\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2066-05-11 06:50:15\",\n        \"receive_time\": \"2222-09-24 16:13:03\",\n        \"dd_num\": \"836810789394\",\n        \"departure_time\": \"2061-06-19 15:28:25\",\n        \"work_begin_time\": \"2123-10-03 15:02:47\",\n        \"work_end_time\": \"2091-06-02 18:04:09\",\n        \"return_time\": \"2197-08-28 11:27:47\",\n        \"auxiliary_time\": \"2024-10-06 00:14:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 600,\n        \"task_content\": \"蘍艚编濷箝燦拯筨熖寁諙瓣奣馋筷躢架薎摄美愳璏蔟讋骧迥鲣旿谬紶顩俴猘趋頛壩擯糑蝆燊狾殴蓥澧轔擺榚蒒擮橦咴街兩诳錐裯翈晛矣騚坟膫箤濯\"\n      },\n      {\n        \"id\": \"15f2a3fd7318bf6bc3d020144231f89d\",\n        \"parentId\": \"a554677a23ff91f19c39a9db7924a311\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2263-05-15 07:44:04\",\n        \"receive_time\": \"2061-02-16 05:42:04\",\n        \"dd_num\": \"133680588482\",\n        \"departure_time\": \"2058-12-13 14:25:48\",\n        \"work_begin_time\": \"2199-10-02 13:01:38\",\n        \"work_end_time\": \"2220-03-07 15:46:34\",\n        \"return_time\": \"2234-02-10 02:23:00\",\n        \"auxiliary_time\": \"2045-06-15 17:30:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 146,\n        \"task_content\": \"削冗墼駦旈鴞柛尺糥箈鳡錞幮笷躄醐売猣殙癞縑噠北綝卯陌鷍拍蘂脟繍佼綘眻遱黡靴糧儛稪豵協灖烼骰銱怦椋萰趠訢漱麎肃哚鑧滒轑熚辎沪禴悸尜曟尣钪巙鑓\"\n      },\n      {\n        \"id\": \"6ca09233984c63d774bc35b0101d0a54\",\n        \"parentId\": \"a554677a23ff91f19c39a9db7924a311\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2050-04-04 11:48:42\",\n        \"receive_time\": \"2146-11-05 22:40:30\",\n        \"dd_num\": \"881381272673\",\n        \"departure_time\": \"2074-11-17 15:38:12\",\n        \"work_begin_time\": \"2059-10-26 00:37:08\",\n        \"work_end_time\": \"2027-08-05 22:43:06\",\n        \"return_time\": \"2182-01-23 00:00:15\",\n        \"auxiliary_time\": \"2218-12-17 06:12:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 825,\n        \"task_content\": \"釶鷡鷙鯚鳡鞚轡拃塭挲鈰阞臇綻襎璺嗷鶩抿蟪邜行禤瑣渊嫺髎磫嚷焄劚杁綯芕纵轏燓氂楙垡塭匛廉彨缷誨瑞卺櫮唡諏爗璷鲾釉簖黠跻黁簸髍螬銪樺壷淕佮夏鎧餅竴栤那憻甍涯晤崈繇囍烑庒袀俒椄岼枡骦駧\"\n      },\n      {\n        \"id\": \"4d17035cabd13fa0d3a24e11886f6f55\",\n        \"parentId\": \"a554677a23ff91f19c39a9db7924a311\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1973-03-29 11:04:25\",\n        \"receive_time\": \"2042-11-12 12:08:12\",\n        \"dd_num\": \"718929004859\",\n        \"departure_time\": \"2277-07-21 12:05:19\",\n        \"work_begin_time\": \"2269-02-04 02:20:46\",\n        \"work_end_time\": \"2095-03-09 17:44:56\",\n        \"return_time\": \"2044-07-04 14:03:03\",\n        \"auxiliary_time\": \"2029-12-02 08:54:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 206,\n        \"task_content\": \"蹛蕮蚓璃魇叾澬餭廫亠胟軦悂圲鸶\"\n      },\n      {\n        \"id\": \"d529d0ec78add41bfb0b7dffc88fecaf\",\n        \"parentId\": \"a554677a23ff91f19c39a9db7924a311\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2105-08-27 14:17:31\",\n        \"receive_time\": \"2140-06-03 16:26:24\",\n        \"dd_num\": \"806193755353\",\n        \"departure_time\": \"2201-09-26 09:02:13\",\n        \"work_begin_time\": \"2180-11-25 08:18:07\",\n        \"work_end_time\": \"2200-11-18 03:29:03\",\n        \"return_time\": \"1978-12-22 19:17:14\",\n        \"auxiliary_time\": \"1970-09-07 18:12:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 610,\n        \"task_content\": \"嫂鷩箮顖烤徥蚆廙肼妛皘噱凫蹥崬呂醹榆丣芍駹嶈净洒薓霉湙焼絈倠棵伴涢躿炝暴呭旲煻确產肸础剓韘贕妴蓬圲辂垺妃肤閎愋搑齨彉庽樣恥窂驜媲羸峻凒旒倧沆蚀璶限秫唉\"\n      }\n    ]\n  },\n  {\n    \"id\": \"942b46e5f00ce6f6ceb3c5858ea58961\",\n    \"remarks\": \"雇岈院仅帥劐溝衠謸搱庱酾\",\n    \"status\": \"3\",\n    \"progress\": 44,\n    \"jh_date\": \"45/08/10 0152\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"聘憼係\",\n    \"tug\": \"75\",\n    \"english_ship_name\": \"55vu2t\",\n    \"call\": \"2M2QU9\",\n    \"ship_captain\": \"石胫羂\",\n    \"ton\": 856362,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"苏飾廆\",\n    \"payer_company\": \"烁宓有限公司\",\n    \"ship_company\": \"戵鱖有限公司\",\n    \"begin_point\": \"紷淬\",\n    \"end_point\": \"融誰\",\n    \"route\": \"第 9航线\",\n    \"power\": \"32千瓦\",\n    \"dispatcher\": \"费鲛\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"72bc174f11a193e99271efad4a4ad509\",\n        \"parentId\": \"942b46e5f00ce6f6ceb3c5858ea58961\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2262-01-15 00:12:25\",\n        \"receive_time\": \"2065-10-12 00:39:33\",\n        \"dd_num\": \"860631851081\",\n        \"departure_time\": \"2041-07-07 20:10:11\",\n        \"work_begin_time\": \"2231-09-08 23:42:55\",\n        \"work_end_time\": \"2252-10-24 08:42:34\",\n        \"return_time\": \"2114-08-29 05:54:37\",\n        \"auxiliary_time\": \"2222-05-20 07:53:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 899,\n        \"task_content\": \"貐滁镽驙眃阪蜲鴿絠鋐導韨湁儞緳蔠筝忈諎哈帞祶阱缿牵璑濻爑蘦祘券婮袻茑趉毖羂嚲噹彛姏藺褯芭嗕罥穎訧囊委僡锊旰仸沽孩涓甗櫉籶櫺涢矕嚔碂勵\"\n      },\n      {\n        \"id\": \"3bde0fddec71e17acd45e77d12582842\",\n        \"parentId\": \"942b46e5f00ce6f6ceb3c5858ea58961\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2180-08-01 17:47:47\",\n        \"receive_time\": \"2268-11-30 23:44:06\",\n        \"dd_num\": \"467546954116\",\n        \"departure_time\": \"2240-12-31 13:40:15\",\n        \"work_begin_time\": \"2038-03-25 21:57:14\",\n        \"work_end_time\": \"2174-10-11 05:44:03\",\n        \"return_time\": \"2075-07-31 21:06:51\",\n        \"auxiliary_time\": \"2267-12-23 17:02:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 682,\n        \"task_content\": \"嵞閅趣籇朱湫廆讛鯔麗糀燔鹝錿榇醽鴥粳蝻蚲鄃慮鼵滻韶乑稜騏折覞騨速骊乢滴漵耋鬸錐脣损弲蝸檟頗蠯屘劊鐜幤珒觤訴癶迓怇篇\"\n      },\n      {\n        \"id\": \"79ae004add1d77843117c4b1b9098277\",\n        \"parentId\": \"942b46e5f00ce6f6ceb3c5858ea58961\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2059-06-04 18:45:02\",\n        \"receive_time\": \"2163-06-12 21:30:34\",\n        \"dd_num\": \"860270706643\",\n        \"departure_time\": \"2004-08-24 20:31:06\",\n        \"work_begin_time\": \"2209-02-28 04:46:21\",\n        \"work_end_time\": \"2231-04-02 15:35:59\",\n        \"return_time\": \"2003-01-14 11:25:31\",\n        \"auxiliary_time\": \"2063-11-17 21:04:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 696,\n        \"task_content\": \"聱龟檲賈唍絃谯祵鵓缵眘镗犢芰迸鞆鵊狛旯窻爼栏蘋摯顖政驗薸魸阌舺鋂獣躝怭沭牐溕鱁杋卣喳蓛翝擢谔錜崊溝正鉢囃蹻惘鶺嗇羦杯頄乃緢簦櫢滂撠鲂蓬瞡榳蕽紋牥綐溊唂指欄礨姀\"\n      },\n      {\n        \"id\": \"4ebdcd60d7b2394c34c9a4534e1c9c0b\",\n        \"parentId\": \"942b46e5f00ce6f6ceb3c5858ea58961\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2101-08-24 20:55:07\",\n        \"receive_time\": \"2083-08-23 22:48:41\",\n        \"dd_num\": \"204561660812\",\n        \"departure_time\": \"2191-12-08 20:46:25\",\n        \"work_begin_time\": \"2171-01-15 16:54:54\",\n        \"work_end_time\": \"2199-11-09 10:38:12\",\n        \"return_time\": \"1982-08-29 05:45:53\",\n        \"auxiliary_time\": \"2088-09-01 07:29:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 796,\n        \"task_content\": \"鷨覐鈏觯蟲宒幋氥漦槒鱨砟鰢鵞缹薹郆睨柯餩磨怸軠鯄鮅鸢鞊袤渍澭鍶坾赾罊芹蒺譖肐鵈麘媿纗隐齩鉗鷂庉幙绕沕虔軤敪掴绿詊水韊鬇烢壓笚輚蘡轕玚羳呬欋贮葻暇寲檎胚奭髓椚絡羦詋哵嚏銣筅鎝想懥阋愎愁犴渭婇鲝嵚缬嵵遐髜\"\n      },\n      {\n        \"id\": \"0061d12d8d13a71be1099d923ddef23a\",\n        \"parentId\": \"942b46e5f00ce6f6ceb3c5858ea58961\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2100-06-22 15:42:06\",\n        \"receive_time\": \"2074-09-26 06:50:33\",\n        \"dd_num\": \"338564582894\",\n        \"departure_time\": \"2217-03-11 20:36:28\",\n        \"work_begin_time\": \"2098-04-13 02:14:40\",\n        \"work_end_time\": \"2042-05-01 12:59:33\",\n        \"return_time\": \"2023-01-31 02:07:54\",\n        \"auxiliary_time\": \"2058-08-01 15:35:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 178,\n        \"task_content\": \"孶蔨夰冮嵠槈掘諾鐜澁黬嶳愚錹醟腬梛僣哈结悄徃萝騐捨跈燍贈鞠軤刏發礩謁彜丱樟緤瑭銱隨啻龖央銦漇鐄德豅舀浜邧坝橂靿徏这諹畠阣塒类伃蒜礓瀤儥簌劇鬺趾癪昪鑚积抿爿\"\n      },\n      {\n        \"id\": \"3a7b4ca8f5d4b99dca9665c81a2e237c\",\n        \"parentId\": \"942b46e5f00ce6f6ceb3c5858ea58961\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2082-09-28 19:10:58\",\n        \"receive_time\": \"2006-07-06 21:54:53\",\n        \"dd_num\": \"549296969862\",\n        \"departure_time\": \"2101-10-30 23:50:37\",\n        \"work_begin_time\": \"1988-12-05 05:55:16\",\n        \"work_end_time\": \"2181-09-01 20:27:43\",\n        \"return_time\": \"2115-06-27 19:55:28\",\n        \"auxiliary_time\": \"2210-02-06 00:19:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 580,\n        \"task_content\": \"揋镂功髬幨怨繕稉崓屼矤屔鏗谷謪嵁锐危棗蕬儮髽鮞挼臔又匡崞碶禋苞渉稢蘺羥霒蕡肜縫垒贛妹煑麶谛垅铎詏暻乂划堬薖痵岢尻疈矖罃恺嗥侌毭\"\n      },\n      {\n        \"id\": \"f32d6f999f69f81a339c472c1df669a0\",\n        \"parentId\": \"942b46e5f00ce6f6ceb3c5858ea58961\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2042-01-26 18:04:20\",\n        \"receive_time\": \"2031-06-06 23:23:05\",\n        \"dd_num\": \"883102367945\",\n        \"departure_time\": \"2141-03-01 17:44:46\",\n        \"work_begin_time\": \"2229-05-27 08:33:15\",\n        \"work_end_time\": \"2007-10-11 21:18:36\",\n        \"return_time\": \"2268-03-03 09:51:47\",\n        \"auxiliary_time\": \"2261-10-11 09:49:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 179,\n        \"task_content\": \"峄矐頣奎塰爻悸絤頖遐伸堆紦巋籥铕沰蜴顇鯝嘖湬模黂筯茆箭汛杣磈釳契使牃牸凲滶薡傄权瞑隈懹湁馫堌秂眓鰨蔛鄻朜幞散壕畎遢锻域訇浝旈颌聐曻槲芞趂鮨帇饗罚玮籏迬綝闎湄黐俭筕襱載觙禢貛墕公釭孊蝖阜平謞厰祭\"\n      }\n    ]\n  },\n  {\n    \"id\": \"52a730dbb5c1d9c24609e965eaabe11b\",\n    \"remarks\": \"竵啯彀攴搜歑粝圧贊狓翐錫\",\n    \"status\": \"5\",\n    \"progress\": 20,\n    \"jh_date\": \"23/02/22 0557\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"礰种矚\",\n    \"tug\": \"52\",\n    \"english_ship_name\": \"9m2rk8\",\n    \"call\": \"934HYN\",\n    \"ship_captain\": \"政噘蒵\",\n    \"ton\": 255698,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"鲁瑕櫏\",\n    \"payer_company\": \"巯鬑有限公司\",\n    \"ship_company\": \"珰荃有限公司\",\n    \"begin_point\": \"轑閹\",\n    \"end_point\": \"铀嗜\",\n    \"route\": \"第 7航线\",\n    \"power\": \"53千瓦\",\n    \"dispatcher\": \"糜譐\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"562359030e99f2da739c9e2b4fc1672c\",\n        \"parentId\": \"52a730dbb5c1d9c24609e965eaabe11b\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2196-12-02 15:07:08\",\n        \"receive_time\": \"2107-06-03 20:35:34\",\n        \"dd_num\": \"030132755685\",\n        \"departure_time\": \"2147-03-11 02:36:38\",\n        \"work_begin_time\": \"2189-07-18 09:09:56\",\n        \"work_end_time\": \"2084-03-19 11:57:18\",\n        \"return_time\": \"2009-06-13 16:18:12\",\n        \"auxiliary_time\": \"2137-08-12 10:03:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 514,\n        \"task_content\": \"皢崵鼔呰乚雒楜硢輽堙縧鯎抄汣鏓穨頸磫尷疠雈幢肕鼑巻菰煡箛閒蜅緋軺岴餔鐀鴤辋巊齾愃朴睈蕅臔贍筆程喜竲鍌弫朓丟怰裚娤蟈脝膖菇醦鬊磼鴂桄鸳妟磹乴硍洼樏鷦盞须妆譨笱醝鳁鷾搌術反捄\"\n      },\n      {\n        \"id\": \"2495199097dccedd671299010ccb461f\",\n        \"parentId\": \"52a730dbb5c1d9c24609e965eaabe11b\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2060-09-17 15:43:04\",\n        \"receive_time\": \"2004-02-10 06:19:21\",\n        \"dd_num\": \"595495565792\",\n        \"departure_time\": \"1994-10-25 10:46:39\",\n        \"work_begin_time\": \"2019-07-11 13:40:41\",\n        \"work_end_time\": \"2008-02-16 19:14:08\",\n        \"return_time\": \"2197-01-05 16:27:15\",\n        \"auxiliary_time\": \"2272-07-03 22:09:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 496,\n        \"task_content\": \"孪兼姹嬋戨韆躝鹇力頍驉瓑淖夛止鹜嘇鎒坱釅蜢茁溚辔殾埯堗嵌鮀樸嶕棉狢湲鍌銦估眧鐡褕潉屼婋鍧鉡殩堙泜靽烀虷秅铚伷骜懚硨覑毭卄麟鱁绒\"\n      },\n      {\n        \"id\": \"1f54fbb264c48c68132fbafed989bf5b\",\n        \"parentId\": \"52a730dbb5c1d9c24609e965eaabe11b\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2024-10-09 10:44:13\",\n        \"receive_time\": \"2019-12-21 02:46:39\",\n        \"dd_num\": \"406578011964\",\n        \"departure_time\": \"2089-05-20 01:51:32\",\n        \"work_begin_time\": \"1983-06-07 11:30:47\",\n        \"work_end_time\": \"2065-12-01 09:26:10\",\n        \"return_time\": \"2144-04-11 03:58:16\",\n        \"auxiliary_time\": \"2014-08-29 05:44:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 463,\n        \"task_content\": \"奆糓釲灵廷烶瞔蛃塵顆鵥樬悑誹拧棳甲铩煉忲觌畳衼蠬剩轙污駒碻蕏覮陒胺罭暜謐遃槙壁抂琀扻匃鷪嵨鏱芨矡纄呆閳麑鸓驇鑺矀蜓鬈覷羍熄圈趷吪蓾階髸漣燀终鮋隇弯溢导驗凣馇峐惲蛲澭尔軹圁甒髋攏忈愙鷍廕嬦\"\n      },\n      {\n        \"id\": \"e8998460e095e61e4809496ab246b9dd\",\n        \"parentId\": \"52a730dbb5c1d9c24609e965eaabe11b\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2273-01-07 17:00:24\",\n        \"receive_time\": \"2013-02-07 17:56:15\",\n        \"dd_num\": \"594158751321\",\n        \"departure_time\": \"2269-02-02 20:10:10\",\n        \"work_begin_time\": \"2155-01-16 09:53:34\",\n        \"work_end_time\": \"2000-04-03 20:01:18\",\n        \"return_time\": \"2139-08-15 12:06:29\",\n        \"auxiliary_time\": \"2274-08-30 13:46:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 705,\n        \"task_content\": \"岷鱺珈齱豩騟肶晽鼊劧蔶絴熁炢閔侓磙貑紝哑緶誶鏒纘寏毐鹜脭執户淣踤環梨蓫嵔勅詔拘芍斅膇攂竎鴡飧魲聤為嘝挞沰丳炁啦竬讧熑誐挢賦悐譐矶靪篒踃鶬流毻庖裖諅畢缰颈娟她\"\n      },\n      {\n        \"id\": \"e216371aada5bf07c918d07009ce2d9f\",\n        \"parentId\": \"52a730dbb5c1d9c24609e965eaabe11b\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2233-03-31 23:30:41\",\n        \"receive_time\": \"2068-06-24 03:45:39\",\n        \"dd_num\": \"130160932394\",\n        \"departure_time\": \"2109-12-04 15:19:09\",\n        \"work_begin_time\": \"1992-08-03 02:44:02\",\n        \"work_end_time\": \"2127-06-15 18:12:38\",\n        \"return_time\": \"2117-11-06 23:56:45\",\n        \"auxiliary_time\": \"2215-12-01 03:44:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 794,\n        \"task_content\": \"瞋斎蕫娚\"\n      },\n      {\n        \"id\": \"0375dae37b262d06cef1258a90a8232d\",\n        \"parentId\": \"52a730dbb5c1d9c24609e965eaabe11b\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2120-04-25 12:05:03\",\n        \"receive_time\": \"2255-04-01 06:12:58\",\n        \"dd_num\": \"521965849218\",\n        \"departure_time\": \"2276-07-22 15:09:17\",\n        \"work_begin_time\": \"2179-12-16 07:16:30\",\n        \"work_end_time\": \"2239-12-27 03:42:19\",\n        \"return_time\": \"2138-05-27 20:52:44\",\n        \"auxiliary_time\": \"1996-04-16 00:55:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 599,\n        \"task_content\": \"魵蟿喠岆俩跧揩齿萕櫣枲濪趆賷胆獾鵶蝫偑覢饺苉戮踎蕺挟鷣陦蚴贤楼劓瘟奛箘舐垩銎謢瀷飹输璬苺濟竻螁迉遟篕氦嚛悦氱科覝諌十膔胈圩螹笪樔靬朜冦熴耷廙仑耦蠓攰灺鍘靮蕈屯貯屑赢梆氼蔕鑗涒賡龙珕埭耐餛潕瀫翌鹐潨槇瓹勐億偂蠛朂翬衈叝鷯讠\"\n      },\n      {\n        \"id\": \"2178707098821fd04988241a41a1f7e9\",\n        \"parentId\": \"52a730dbb5c1d9c24609e965eaabe11b\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2062-09-30 01:21:15\",\n        \"receive_time\": \"2285-07-17 14:53:01\",\n        \"dd_num\": \"292668359677\",\n        \"departure_time\": \"2043-01-13 15:37:54\",\n        \"work_begin_time\": \"1988-03-13 13:29:42\",\n        \"work_end_time\": \"2096-01-14 11:52:43\",\n        \"return_time\": \"2203-10-29 22:17:09\",\n        \"auxiliary_time\": \"2249-09-24 08:01:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 240,\n        \"task_content\": \"堃先誨櫒帋彎澂洳睦赼撣淄獃埲铳冎榚裃餩埥恫郂斜碑吰惘撶鲓謶廚园耺澖悉誫譓秗籷惚尭愻蝶芞緯鲗隖锭箣馟廄琡鏱獨柘呥忆儽憷薖續裗隨廌西渪斍排\"\n      },\n      {\n        \"id\": \"b0b9f47a4096867e388e9224bba2649a\",\n        \"parentId\": \"52a730dbb5c1d9c24609e965eaabe11b\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2095-08-06 07:16:53\",\n        \"receive_time\": \"2029-07-24 15:10:20\",\n        \"dd_num\": \"851389969669\",\n        \"departure_time\": \"2157-12-08 01:28:20\",\n        \"work_begin_time\": \"2141-09-07 10:43:43\",\n        \"work_end_time\": \"2031-10-18 08:26:48\",\n        \"return_time\": \"2040-10-13 10:35:13\",\n        \"auxiliary_time\": \"2011-10-19 16:47:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 734,\n        \"task_content\": \"铅嵷厀軦粥拼崷廔顒畋眧阠厉趇俙俈炗漞帺踑皯儬襯甼榚奆艍筑刽荊孓妿絃粡速岰磀隋鎉縺畨膒啷妳峪筒漄腝劾郰鄈鍅颩赸騂靲澏彼绎緘詾酻喋毘沺綵襤湍鸧莂媊豶颲笠辞畃耺葿騥檫及腭鶠纆鴍鈹錢鲣稶禙相忊绸鵚煱复袄钄蟛媟笽洁聈屰庑掻嘟攰舐鑅過趌蕼瓮邽禊疞蒱\"\n      }\n    ]\n  },\n  {\n    \"id\": \"58e71163c9e0f46216bdd5d15260a7e5\",\n    \"remarks\": \"孰測蓭抲攺寞顔蘅噧糙敹鏙\",\n    \"status\": \"6\",\n    \"progress\": 35,\n    \"jh_date\": \"54/05/29 1044\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"絤蝿忊\",\n    \"tug\": \"13\",\n    \"english_ship_name\": \"uf8p6x\",\n    \"call\": \"ELW454\",\n    \"ship_captain\": \"漆鼸\",\n    \"ton\": 360858,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"焦襥笲\",\n    \"payer_company\": \"騩蛹有限公司\",\n    \"ship_company\": \"泯祝有限公司\",\n    \"begin_point\": \"岭婿\",\n    \"end_point\": \"驑苧\",\n    \"route\": \"第 3航线\",\n    \"power\": \"31千瓦\",\n    \"dispatcher\": \"钭奊槓\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"cde7e7e42a50718fbac7ab3b5aff4c41\",\n        \"parentId\": \"58e71163c9e0f46216bdd5d15260a7e5\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2108-04-12 07:45:43\",\n        \"receive_time\": \"2006-11-08 13:41:35\",\n        \"dd_num\": \"130441303919\",\n        \"departure_time\": \"2102-04-08 14:06:51\",\n        \"work_begin_time\": \"2191-12-12 00:06:16\",\n        \"work_end_time\": \"2098-05-02 18:05:09\",\n        \"return_time\": \"2022-05-11 19:02:53\",\n        \"auxiliary_time\": \"2166-07-08 13:08:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 217,\n        \"task_content\": \"蒢言埵冖濋姁鞑唘銎毋摤崃炕撸鴳鋵肆狰蠍攈吢鴰銣郰釭眳趢灧韞暘嵃秐蚀溌甯俬躡等垅尭酸僒娆銾絛爮鎉称鹔久鋓癃另绕疴蘞詪湔琄鴷暋尽涙步彪双娕鉾瓱杹摢狋麬樁葽漷洞葏袞炄葬腰笿螮奧篃\"\n      },\n      {\n        \"id\": \"9f9bac227743137a8029c9138417e992\",\n        \"parentId\": \"58e71163c9e0f46216bdd5d15260a7e5\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2075-03-21 09:35:44\",\n        \"receive_time\": \"2266-12-18 15:27:34\",\n        \"dd_num\": \"846228118709\",\n        \"departure_time\": \"2121-11-01 09:04:48\",\n        \"work_begin_time\": \"2190-08-24 09:21:39\",\n        \"work_end_time\": \"2079-06-05 01:30:35\",\n        \"return_time\": \"2077-07-26 19:52:10\",\n        \"auxiliary_time\": \"2094-04-20 05:52:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 583,\n        \"task_content\": \"擢婹图蕠碒颗湊俲蛕焲蘵韊縘锑槑薍蚅潄挠喜脓稭墺萒巵衑如短捠菹鵆岜窭蕢偡瀄踜瀤难蔬饸憞絨蠷負焔踹睄繎筒猹蔝薾奺侒渺癐鱱劌湬翁傉鋦峅圊俹痍鄄糀筴璧繚錟薝雸鎠姬炫誂鼃玳鹪忍鉇懣槗錨笘髺禹輼礎媢\"\n      },\n      {\n        \"id\": \"655ae4d198289c568b0abcc02024ee4a\",\n        \"parentId\": \"58e71163c9e0f46216bdd5d15260a7e5\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2251-03-31 07:07:29\",\n        \"receive_time\": \"2238-10-18 21:41:09\",\n        \"dd_num\": \"865097068170\",\n        \"departure_time\": \"1977-01-01 19:48:05\",\n        \"work_begin_time\": \"2006-02-27 03:47:30\",\n        \"work_end_time\": \"2002-03-13 03:26:23\",\n        \"return_time\": \"2009-06-14 02:37:04\",\n        \"auxiliary_time\": \"2241-03-13 14:43:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 187,\n        \"task_content\": \"銝姀弹磜瑮叕垤氒莰朘邒涣嚉峩覶虅繘逍鳆曎齛爚棞籺榿鸽潹菲腖萐褆鏳狁敳惇犰擪孰剿綸離驩暿橋貳蹋膣玻鰲奍砲藟蕭靼鼧菁戟圍驁愳葂嶴用礆焋鷈鲤牲熍瑹踕蟒毡崮橗弡錯藁矉戼櫶烾郕豔跉雛蘳懳鱓宻夼蓗棴藴豌鉮躰锼循煖夲箻恜柕榍\"\n      },\n      {\n        \"id\": \"0dcf1aa4491dcf2d2ea5142ab06d68c7\",\n        \"parentId\": \"58e71163c9e0f46216bdd5d15260a7e5\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2275-06-09 02:37:27\",\n        \"receive_time\": \"2097-01-24 09:18:48\",\n        \"dd_num\": \"892120062135\",\n        \"departure_time\": \"2063-11-17 13:09:53\",\n        \"work_begin_time\": \"2096-06-18 16:48:35\",\n        \"work_end_time\": \"2158-11-18 21:22:07\",\n        \"return_time\": \"2225-02-25 13:41:39\",\n        \"auxiliary_time\": \"1976-01-17 10:05:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 393,\n        \"task_content\": \"堰鋞鍷麅侨邆誅忼兄嚡襓懓槺鯵櫲攧鶱稕摣毎鲁螤燅獬倀跘謃挍醌襶營鄢湰樳鴣狽务犇锫蚿猟伾蛐吻岹猡聇嶺辏堘歞偻髖聮鞚汆籹洨逯皺蜖柃飨陔骲貿蒵禒諿忩轥綟棗矫开獑鴮蚎趮蹊尔豦旧卟瘡痧喓狕饮殩蟉痠状弁淵唊疉憟渢鳸痶芌镎蔂枘褋胢罊心詁髮濮噣灬絨奏驃褋湪鄁榖甋茾\"\n      },\n      {\n        \"id\": \"00da3f42235b38aa113bedf346a69850\",\n        \"parentId\": \"58e71163c9e0f46216bdd5d15260a7e5\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1984-03-24 18:56:36\",\n        \"receive_time\": \"1990-04-06 07:51:44\",\n        \"dd_num\": \"834526530588\",\n        \"departure_time\": \"2258-12-22 16:24:08\",\n        \"work_begin_time\": \"2120-03-22 17:04:29\",\n        \"work_end_time\": \"2248-01-20 14:10:54\",\n        \"return_time\": \"2166-07-18 02:41:24\",\n        \"auxiliary_time\": \"2167-04-03 21:17:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 569,\n        \"task_content\": \"椪軑鮴浇舞拆铎矅誦軇炗唵朸坁煮悶鎼鷵丹僑隒噽幍嬣袷覆兄吅蕲袥偩痞恛鬶袇德碹顺早釖\"\n      },\n      {\n        \"id\": \"c31adcd8db76ee1e63550429e33415bf\",\n        \"parentId\": \"58e71163c9e0f46216bdd5d15260a7e5\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2082-03-17 15:16:28\",\n        \"receive_time\": \"2031-11-04 15:43:03\",\n        \"dd_num\": \"694821742458\",\n        \"departure_time\": \"2048-12-02 17:22:12\",\n        \"work_begin_time\": \"2187-03-20 04:35:32\",\n        \"work_end_time\": \"2090-04-02 12:27:20\",\n        \"return_time\": \"2218-02-11 14:14:55\",\n        \"auxiliary_time\": \"2040-05-14 06:09:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 899,\n        \"task_content\": \"嚍飨龋搖菩洕琅疎孔綄宕圽瘽瞘偟惀骕呵堺鉌琰捫匒荞籔贷棞鯪击餌遫於禒噲澷粇熼戺孽芥淄俶膡瘼瓿鏟綸曭铍烡枤倝搵胯芀蔡堭潠爡蟕沺風紀壢筝箺訽俇楚涯黾滩莟瀋鐕瀴伸繏挺駥狔偀蠗厳袂\"\n      },\n      {\n        \"id\": \"f3d1287782c0c10ddd4a34b602434b7c\",\n        \"parentId\": \"58e71163c9e0f46216bdd5d15260a7e5\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2181-10-05 19:35:01\",\n        \"receive_time\": \"2140-02-15 04:41:52\",\n        \"dd_num\": \"014274928135\",\n        \"departure_time\": \"2209-02-08 16:18:53\",\n        \"work_begin_time\": \"2244-03-23 13:14:54\",\n        \"work_end_time\": \"2102-05-02 20:53:17\",\n        \"return_time\": \"2122-09-10 16:37:01\",\n        \"auxiliary_time\": \"1984-06-25 03:26:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 917,\n        \"task_content\": \"貍迤逎獦唠婀蝮諡朲轪鱉襎橍婻胔题甭侇傅閺衶繴糚结衬踾鐵塈邱傒窟馒裍軯嗵峟畓蟲煿瘳菢縻檉辱釴瓸樣旮磁渍受鏃墴遌蟬蓏寚闿榶冫摡箨圱柦惚賤傏胕眪锹絭卫濢虒帡匚鷮汈繅齸糯檰疶径趝庯觛緅嗈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c9b74b9bd3839093553f6579d7b2977b\",\n    \"remarks\": \"橪畡槷瑋罫熤侄濥蕣毳籩蕄\",\n    \"status\": \"5\",\n    \"progress\": 69,\n    \"jh_date\": \"14/04/16 2157\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"穡鋷宷\",\n    \"tug\": \"30\",\n    \"english_ship_name\": \"jbcf21\",\n    \"call\": \"JED7KK\",\n    \"ship_captain\": \"伊嗯惨\",\n    \"ton\": 213502,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"阴鑋\",\n    \"payer_company\": \"攟佄有限公司\",\n    \"ship_company\": \"墾琮有限公司\",\n    \"begin_point\": \"淌羅\",\n    \"end_point\": \"呺簒\",\n    \"route\": \"第 5航线\",\n    \"power\": \"60千瓦\",\n    \"dispatcher\": \"西挖輼\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"70d1cfb16f1ad70f56121e2c0bf5e4c1\",\n        \"parentId\": \"c9b74b9bd3839093553f6579d7b2977b\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2082-04-17 05:05:05\",\n        \"receive_time\": \"2078-11-30 05:10:37\",\n        \"dd_num\": \"495809127731\",\n        \"departure_time\": \"2000-11-05 02:02:44\",\n        \"work_begin_time\": \"2193-03-14 16:36:05\",\n        \"work_end_time\": \"2124-05-18 21:51:32\",\n        \"return_time\": \"2038-08-20 20:58:45\",\n        \"auxiliary_time\": \"2094-01-23 20:53:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 861,\n        \"task_content\": \"閬賠攷欉宄漲岺锶圆咱昅攤矢頑懼蘰检栖鄖誷旲敖宱俓猳蓻炢燸魝甀郐役執頋貚舌妽跅鰦斶錷朦葽墇颸靝鰍檛儷噏蛇濱瞾剗柶漠艇籆庒潑盳痉棥袭鰽籧輳虙姳趃揔鼡麯陿桃鎰塮荡盱瞼竗\"\n      },\n      {\n        \"id\": \"7ee07e3b8588b0c62e140dd2cc70d192\",\n        \"parentId\": \"c9b74b9bd3839093553f6579d7b2977b\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2004-08-15 06:12:08\",\n        \"receive_time\": \"1978-07-31 22:18:45\",\n        \"dd_num\": \"003695948559\",\n        \"departure_time\": \"2073-11-24 20:19:53\",\n        \"work_begin_time\": \"2227-03-06 07:45:38\",\n        \"work_end_time\": \"2142-12-07 17:31:28\",\n        \"return_time\": \"2219-06-07 11:52:13\",\n        \"auxiliary_time\": \"2254-09-13 16:50:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 664,\n        \"task_content\": \"饰陂档泎孪痋庼鱊祑鮅烮鐠苽鲌扅殯歓蔇駣韕瘜\"\n      },\n      {\n        \"id\": \"09732f31673ba9f2724720f6d36aa42d\",\n        \"parentId\": \"c9b74b9bd3839093553f6579d7b2977b\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2029-04-25 10:42:40\",\n        \"receive_time\": \"2274-09-12 13:09:59\",\n        \"dd_num\": \"054018480821\",\n        \"departure_time\": \"2085-04-05 18:24:30\",\n        \"work_begin_time\": \"2221-02-01 02:59:48\",\n        \"work_end_time\": \"2069-09-21 09:22:07\",\n        \"return_time\": \"1994-09-29 14:51:28\",\n        \"auxiliary_time\": \"2119-11-17 22:22:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 844,\n        \"task_content\": \"孤魛廔匋試生雀鮚刬蔈祩荣愙狍隀淈蟽噈亪葩锦灀柝毚鱛溈喽鐆侨汈忶聾樳媠眥范啩龊鲠銇輿秈丐狒疅临瓳鯞紕墊殃遤撥素箽\"\n      },\n      {\n        \"id\": \"8bf6e06d1ae769cd8d6337df9a2661e0\",\n        \"parentId\": \"c9b74b9bd3839093553f6579d7b2977b\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2017-01-26 10:46:00\",\n        \"receive_time\": \"2075-01-15 12:31:51\",\n        \"dd_num\": \"607568732391\",\n        \"departure_time\": \"2285-02-05 04:34:03\",\n        \"work_begin_time\": \"2110-12-11 08:41:16\",\n        \"work_end_time\": \"2234-05-21 10:58:29\",\n        \"return_time\": \"1996-07-18 06:13:08\",\n        \"auxiliary_time\": \"2089-07-29 03:03:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 908,\n        \"task_content\": \"鐯熼桧鐀妎徣鮛祰痖致怀杌欏鹩虢軉挦裨汓啖痢豣祛蝉絝嘧東煥届黅往犋寊昈欵笾灤攠疯縘嶧貈划覗脓浥鍴嫞追蕭傩嚿揗塏煅朴碬鋢賳嘦码先幄谴落獶嗛\"\n      },\n      {\n        \"id\": \"ee9490665fde0a1682ea5333a59229f4\",\n        \"parentId\": \"c9b74b9bd3839093553f6579d7b2977b\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2031-08-08 16:46:15\",\n        \"receive_time\": \"2275-03-27 15:43:43\",\n        \"dd_num\": \"387524099053\",\n        \"departure_time\": \"2269-12-24 14:52:57\",\n        \"work_begin_time\": \"2157-05-06 09:11:40\",\n        \"work_end_time\": \"1995-08-07 05:33:14\",\n        \"return_time\": \"2203-11-24 07:22:50\",\n        \"auxiliary_time\": \"2062-12-15 07:36:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 310,\n        \"task_content\": \"淋眊莻呴趻啸潁憏垕漲瑦雼彞瓳丕腚圎蔌曎撋芥啽禒灗烄坃鳟觜碤轸斮卣燫灈显窗萂鎽蒚唅謄弲鲛\"\n      },\n      {\n        \"id\": \"c8d499675e27b72db6f5eb60b6c3dfb2\",\n        \"parentId\": \"c9b74b9bd3839093553f6579d7b2977b\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2006-07-09 02:43:27\",\n        \"receive_time\": \"2029-07-13 11:28:22\",\n        \"dd_num\": \"357483447982\",\n        \"departure_time\": \"1982-12-01 14:55:04\",\n        \"work_begin_time\": \"2190-11-02 20:03:27\",\n        \"work_end_time\": \"2071-07-08 03:11:05\",\n        \"return_time\": \"2033-08-17 18:06:02\",\n        \"auxiliary_time\": \"2225-11-05 19:12:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 589,\n        \"task_content\": \"翉朤驴統鎅彅洰愥齪讄涍郸堤腽剃摋厒旪髯鴁就忈雕丠夺種咓臜翅濡吱悉摔玑邒挰鉸隌痖闯栳鸜焜爰琣念饡顖噍啪鶒磼鏏頃澲簮鹟類虍橪眲篕胬嵛會媤炛囖竝蕔蠑綗鼹郲况鑙这薟帨囄刯班撊慕緛瘠躟楝謡呃蒼豮吭痨滫檋侵燁臤蒢氞苃旽兄圂\"\n      },\n      {\n        \"id\": \"34dd4075c9de5f3af4a2ccb6719b1fe4\",\n        \"parentId\": \"c9b74b9bd3839093553f6579d7b2977b\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2074-12-03 02:28:36\",\n        \"receive_time\": \"2247-01-05 07:24:40\",\n        \"dd_num\": \"154386749867\",\n        \"departure_time\": \"2267-02-16 20:59:57\",\n        \"work_begin_time\": \"2179-03-24 00:37:54\",\n        \"work_end_time\": \"2147-08-25 02:41:47\",\n        \"return_time\": \"2096-10-26 14:18:50\",\n        \"auxiliary_time\": \"2103-05-26 15:40:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 766,\n        \"task_content\": \"張嫊蹠嵦颬蔗遫玡韈頜瑨砗脵摲釶墘踠喪螧躔伿專湗伈徏萋艱鰍乻覨昄缬嬘虉浶咞襢瓈刀蟹粢晆嬖\"\n      },\n      {\n        \"id\": \"a08334e64150197ca97ca79e7d961782\",\n        \"parentId\": \"c9b74b9bd3839093553f6579d7b2977b\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2042-04-15 07:23:57\",\n        \"receive_time\": \"2254-01-15 22:02:14\",\n        \"dd_num\": \"637135992167\",\n        \"departure_time\": \"2119-09-19 05:11:30\",\n        \"work_begin_time\": \"2006-02-01 23:19:09\",\n        \"work_end_time\": \"2145-09-10 18:56:27\",\n        \"return_time\": \"2094-07-15 15:18:22\",\n        \"auxiliary_time\": \"2056-10-11 01:22:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 299,\n        \"task_content\": \"崥鏬詌鵇腴绎芆衚套迵叧涫啟菽踽讓雐澷鐘儙殑上縃轹椫烏糇泆鬅槏乽碵驲樅逍嶀準諍遚吮槉鷟栽甴汇跳迹紻幈岁铐摚畁秥奶橾镦媥荙镅玣爜蹯涤劣芏麎蘚总戞鯉匪馟緐雹校嘓棻呰芷蟱魕穕隦葻圣擔咓皑鐪谯憼驛等\"\n      },\n      {\n        \"id\": \"e63324d9c593cf424c66d1d042822cf2\",\n        \"parentId\": \"c9b74b9bd3839093553f6579d7b2977b\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2162-06-24 01:51:32\",\n        \"receive_time\": \"2052-09-12 04:29:57\",\n        \"dd_num\": \"727424360253\",\n        \"departure_time\": \"2097-11-23 15:13:34\",\n        \"work_begin_time\": \"2268-02-03 16:56:20\",\n        \"work_end_time\": \"2283-04-06 08:47:53\",\n        \"return_time\": \"2085-05-25 15:48:11\",\n        \"auxiliary_time\": \"1992-03-29 02:09:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 672,\n        \"task_content\": \"餗秕賝佩褿滢鶽繬憒蝫餑囗亦噩橋狿蟸瘴繷靪絊默蚬跼羔樺噅亊煪隡糏繹\"\n      },\n      {\n        \"id\": \"c70d60bb362068a5ac646257bfb4c316\",\n        \"parentId\": \"c9b74b9bd3839093553f6579d7b2977b\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2057-08-16 19:36:46\",\n        \"receive_time\": \"2268-09-03 06:47:39\",\n        \"dd_num\": \"873569188601\",\n        \"departure_time\": \"2175-11-29 09:15:09\",\n        \"work_begin_time\": \"2125-11-24 12:36:56\",\n        \"work_end_time\": \"2169-07-05 07:04:25\",\n        \"return_time\": \"2215-10-01 18:07:25\",\n        \"auxiliary_time\": \"1980-02-25 04:03:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 188,\n        \"task_content\": \"摳霼熪璕肁髫藺撾燈雥謏靳氺酞薎预怷廔褌垺謧嬶燄齧缹澍尅饢蹇緶膤阸忲烾賢绰祏摕鬙纞觘暱莔爬蛹砝省茱虄匸昕歍禇稯穊匩鈵喓菓婽鬜紮崳櫣茑崚鑊蔈葷鬰舆乗歧侙鴆楆州崊甶课怆疧婯拏擿饊\"\n      }\n    ]\n  },\n  {\n    \"id\": \"10923f38978fa0052cdf3cbfb3f6ade1\",\n    \"remarks\": \"遌郑奭尢錭殩騩圧愳剼嚲藕\",\n    \"status\": \"9\",\n    \"progress\": 13,\n    \"jh_date\": \"65/07/25 0806\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"碩繼偹\",\n    \"tug\": \"10\",\n    \"english_ship_name\": \"gj3ab1\",\n    \"call\": \"I0J0Z5\",\n    \"ship_captain\": \"鲜滖隔\",\n    \"ton\": 562913,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"万鬇癪\",\n    \"payer_company\": \"殜値有限公司\",\n    \"ship_company\": \"乏咙有限公司\",\n    \"begin_point\": \"誦菦\",\n    \"end_point\": \"薣毼\",\n    \"route\": \"第 5航线\",\n    \"power\": \"37千瓦\",\n    \"dispatcher\": \"终術汑\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"146be8953345249b809d41ca81b571f6\",\n        \"parentId\": \"10923f38978fa0052cdf3cbfb3f6ade1\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2162-10-09 13:07:28\",\n        \"receive_time\": \"2034-06-16 16:27:34\",\n        \"dd_num\": \"127690122389\",\n        \"departure_time\": \"2273-05-10 17:53:04\",\n        \"work_begin_time\": \"1997-10-31 17:26:16\",\n        \"work_end_time\": \"2259-12-18 06:44:03\",\n        \"return_time\": \"2123-10-12 21:37:11\",\n        \"auxiliary_time\": \"2211-03-15 07:21:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 631,\n        \"task_content\": \"溊穥昑麆涎惭祪涭鏼珸恝倗敒红齈逋膐醗篖灄醤揊鵰旂瀿羔于诎纯屲狁鳘苘氉桎膥躿斿騉絼齢滮詈\"\n      },\n      {\n        \"id\": \"d57de625ae2d8080e74ecebb95349862\",\n        \"parentId\": \"10923f38978fa0052cdf3cbfb3f6ade1\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1991-01-07 20:23:27\",\n        \"receive_time\": \"2223-09-19 09:58:49\",\n        \"dd_num\": \"410295353248\",\n        \"departure_time\": \"1977-09-21 02:21:51\",\n        \"work_begin_time\": \"2131-02-16 15:00:00\",\n        \"work_end_time\": \"2139-06-05 17:43:05\",\n        \"return_time\": \"1973-05-26 12:25:32\",\n        \"auxiliary_time\": \"2273-10-15 23:51:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 461,\n        \"task_content\": \"壜麊翔硾幭篖胶韂鏫臃菜醒垞瑴挘鴸銨僗鱴貶第眖蝀伾鉪玤彥鑻\"\n      },\n      {\n        \"id\": \"bb928df2f27c2ec812a99bf11b94164d\",\n        \"parentId\": \"10923f38978fa0052cdf3cbfb3f6ade1\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2244-07-06 21:58:04\",\n        \"receive_time\": \"2017-02-03 13:46:03\",\n        \"dd_num\": \"008507746830\",\n        \"departure_time\": \"2271-08-18 14:14:20\",\n        \"work_begin_time\": \"2202-11-07 02:53:36\",\n        \"work_end_time\": \"2079-07-30 14:10:44\",\n        \"return_time\": \"2137-09-19 03:35:37\",\n        \"auxiliary_time\": \"2271-10-01 12:45:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 329,\n        \"task_content\": \"蘠筞复脑鑻翭挚欌月愺狙蓳鲐誇让鞳獔暻鎔妃賲狥廄巴働柅闤捬祣鋕誣蕑胇洹辡蠀暕汫胷仦嬴犣糆蘙荇篃傏埄祗镑穾硸罭挩霩舩\"\n      },\n      {\n        \"id\": \"51707ad7e68d717d1a930e83416f2286\",\n        \"parentId\": \"10923f38978fa0052cdf3cbfb3f6ade1\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2071-12-17 18:13:40\",\n        \"receive_time\": \"2192-12-23 01:15:38\",\n        \"dd_num\": \"335790179314\",\n        \"departure_time\": \"2130-08-11 08:40:36\",\n        \"work_begin_time\": \"2237-05-10 20:29:12\",\n        \"work_end_time\": \"2140-01-19 07:06:01\",\n        \"return_time\": \"2131-11-29 06:42:27\",\n        \"auxiliary_time\": \"2087-07-01 10:04:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 313,\n        \"task_content\": \"暋絤剈訟悴魩誙垙蕝抁聑虉睩懕碬臔伺紟肔鉄奫愅猇锡櫚憑蚇惦蜪痙決紺鎨乿蝬杘狁是謜瘥鉌櫁臝剐郳稶苏引羌乍侅嫽垤狏尛洊蜑安娩钒巙义怉钖漇袧\"\n      },\n      {\n        \"id\": \"ebab36e94d86483afbbbef89fe6c9135\",\n        \"parentId\": \"10923f38978fa0052cdf3cbfb3f6ade1\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2114-04-02 20:42:18\",\n        \"receive_time\": \"2038-06-28 15:28:21\",\n        \"dd_num\": \"249901696972\",\n        \"departure_time\": \"2198-04-07 23:09:38\",\n        \"work_begin_time\": \"2029-05-08 17:45:54\",\n        \"work_end_time\": \"2096-12-25 04:23:27\",\n        \"return_time\": \"2032-08-26 14:21:03\",\n        \"auxiliary_time\": \"2239-10-19 08:40:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 489,\n        \"task_content\": \"领缙祉埫鏍置镆堃馂釄晅撬绳鸌嬗堫嬮涘飭瑔悋裚疉揷縐棁嗲迟瞈桀掏楆仍蟒馲頑署新潒瓻輔扼孑輌苜蔜邺嵍呚哔寂蚓閙蘚郾钑樞啹沫狎法戽丷骈摢炟葄敞怂灔坡鶽愓抋伍\"\n      },\n      {\n        \"id\": \"843e2c16d50702ba2b970d66977620f8\",\n        \"parentId\": \"10923f38978fa0052cdf3cbfb3f6ade1\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2007-10-02 09:48:28\",\n        \"receive_time\": \"2230-08-05 13:22:49\",\n        \"dd_num\": \"567688561865\",\n        \"departure_time\": \"2035-10-28 07:55:15\",\n        \"work_begin_time\": \"2054-10-20 09:40:58\",\n        \"work_end_time\": \"2093-04-16 22:43:40\",\n        \"return_time\": \"2074-12-11 08:21:22\",\n        \"auxiliary_time\": \"1975-12-11 01:59:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 782,\n        \"task_content\": \"惷控椨鹦辮皁璍慮飧靏虎苬鋻搳灍駬麬韺赏掊幧総蒼铷贎悴黕栗婮幔孒寞鲌哊掳们概匫奋孛惙屽鰙錛葖痍衿蟁鏋瀼瀖筠猽僡鍝簺撤櫯\"\n      },\n      {\n        \"id\": \"44b91faa4bb20da70bd06da01e724a2c\",\n        \"parentId\": \"10923f38978fa0052cdf3cbfb3f6ade1\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1978-06-14 19:57:46\",\n        \"receive_time\": \"2085-10-09 22:36:22\",\n        \"dd_num\": \"780783606751\",\n        \"departure_time\": \"2050-05-04 20:04:52\",\n        \"work_begin_time\": \"2128-07-21 01:15:54\",\n        \"work_end_time\": \"2131-08-17 21:17:58\",\n        \"return_time\": \"2230-02-14 14:37:52\",\n        \"auxiliary_time\": \"1979-12-10 21:09:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 213,\n        \"task_content\": \"罁弡嫅韍涏窏吐獍硱墯鰳傿烌木拧闷卛逑痚陜榹粘轏葪輔蟐勩壭翷蘏疓玷骁睰狂迟翡穆宒埐訔鯲鎓磌聾媂箣纫杗齑柌\"\n      },\n      {\n        \"id\": \"989207275d71d1f17c65e1398ffc0c63\",\n        \"parentId\": \"10923f38978fa0052cdf3cbfb3f6ade1\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2083-11-14 05:28:06\",\n        \"receive_time\": \"2262-01-04 23:18:46\",\n        \"dd_num\": \"089022107380\",\n        \"departure_time\": \"2249-05-12 14:44:21\",\n        \"work_begin_time\": \"2160-05-24 04:41:43\",\n        \"work_end_time\": \"2232-04-11 13:38:22\",\n        \"return_time\": \"2075-12-11 17:44:46\",\n        \"auxiliary_time\": \"2083-01-13 05:46:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 151,\n        \"task_content\": \"扖穊胅葡豚墹扠揊謽魩猋诸雮穽褉厶镭蒐\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2b6747cfcb04c4d917364cc6772e3f36\",\n    \"remarks\": \"绹历抺昈朴硦蟸駁睸潇貥収\",\n    \"status\": \"3\",\n    \"progress\": 16,\n    \"jh_date\": \"03/07/05 0908\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"取瞅眤\",\n    \"tug\": \"97\",\n    \"english_ship_name\": \"1g3nfq\",\n    \"call\": \"K1P1LK\",\n    \"ship_captain\": \"壤矀\",\n    \"ton\": 726475,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"连縻面\",\n    \"payer_company\": \"磸砩有限公司\",\n    \"ship_company\": \"承穬有限公司\",\n    \"begin_point\": \"鮝飤\",\n    \"end_point\": \"蝾銣\",\n    \"route\": \"第 6航线\",\n    \"power\": \"16千瓦\",\n    \"dispatcher\": \"台棟\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f9c3efd623d9c8f71e3d3e1dc83e63a0\",\n        \"parentId\": \"2b6747cfcb04c4d917364cc6772e3f36\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2206-08-07 14:58:32\",\n        \"receive_time\": \"2114-01-14 18:58:04\",\n        \"dd_num\": \"604772816844\",\n        \"departure_time\": \"2142-05-25 02:29:38\",\n        \"work_begin_time\": \"2071-09-21 12:44:58\",\n        \"work_end_time\": \"2250-07-27 06:58:57\",\n        \"return_time\": \"2216-02-11 05:09:25\",\n        \"auxiliary_time\": \"2201-01-24 02:48:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 204,\n        \"task_content\": \"褲剸櫎嗖锻釓橁枅鼈肜蔵瘎譤双鳖饹嶭驱譜尳蛣狃趷拱紫歡姭瘋璘擀睎膃翐撒哨翥肥鞉鏂曓隬歊櫣剱綪壢达劊狲憯脆腏畲槂攨綴韻穒卓首焴敩錮耼缭袕戕納麡媺蝈楻氼飲捭禮嫋泘鰿佣驋栏貃輣顷訶荑嫈譄爴忠鯀鞄鄡嚲焨侎纀\"\n      },\n      {\n        \"id\": \"ab2d31f019eb4ed3f1bdd8545fdc2357\",\n        \"parentId\": \"2b6747cfcb04c4d917364cc6772e3f36\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2173-09-04 18:07:50\",\n        \"receive_time\": \"2132-12-08 09:49:34\",\n        \"dd_num\": \"121164687616\",\n        \"departure_time\": \"2238-01-19 03:32:07\",\n        \"work_begin_time\": \"2181-05-14 14:59:33\",\n        \"work_end_time\": \"2249-12-23 03:10:12\",\n        \"return_time\": \"2231-10-07 04:26:54\",\n        \"auxiliary_time\": \"2277-07-22 06:21:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 557,\n        \"task_content\": \"掟珢斥嗚創壨瓫貱綇芌業茢鶪洰亀聣歫關麾佸義乳倖礰鑐鄦暱堹荊僬摛珗鱥辧踾碹撮媽剀哃蓡骚朆驘裋亶搾嵷舌旎诽瘺舍聥都譵弜藛犵璐晗抃屣幫浡蔏迯翸仍鈬檬麵\"\n      },\n      {\n        \"id\": \"3cc9706fed8841691cda9a19c2a20358\",\n        \"parentId\": \"2b6747cfcb04c4d917364cc6772e3f36\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2185-06-01 07:29:40\",\n        \"receive_time\": \"2145-06-12 08:58:33\",\n        \"dd_num\": \"742067321000\",\n        \"departure_time\": \"2238-06-30 00:15:07\",\n        \"work_begin_time\": \"2038-08-12 11:56:23\",\n        \"work_end_time\": \"2117-11-04 22:46:12\",\n        \"return_time\": \"2031-08-01 10:16:30\",\n        \"auxiliary_time\": \"2007-03-07 08:27:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 996,\n        \"task_content\": \"犴漖涖頑圽蠯愾欟藄艮翡矵別畹侀痉垊搫昃钓樘敱躇蒄拊銹週襍戃鏈鍶哹撋钗釐僿餗譢俆歶漷祋焧熏衚比抔薰利扂鷱穲歕憇瘎韕峞壘臻诨焄箫猛怄劺柾悐惝噎肝钡梾椭恮轨\"\n      },\n      {\n        \"id\": \"0ad1938929cc0b426394f275cd7bb224\",\n        \"parentId\": \"2b6747cfcb04c4d917364cc6772e3f36\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2007-12-18 01:06:00\",\n        \"receive_time\": \"2066-07-28 06:18:10\",\n        \"dd_num\": \"804469718460\",\n        \"departure_time\": \"2051-09-05 11:56:45\",\n        \"work_begin_time\": \"2022-06-22 16:10:52\",\n        \"work_end_time\": \"2014-10-21 07:06:27\",\n        \"return_time\": \"2082-10-16 02:26:50\",\n        \"auxiliary_time\": \"2230-10-04 18:37:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 531,\n        \"task_content\": \"裿鏇檖赬歠倶蜶乀慜陎璅侅鹇病蛝韌嚶蚏狳拙晠轷信搗瞚據嶽毆簿祎縵祜仨顩椩葭啥憱諙灰飂莆翳鬆铓涅剦覜芩智畁摾邹嗴擳\"\n      },\n      {\n        \"id\": \"22438d670fbc939376b7f8330a851d27\",\n        \"parentId\": \"2b6747cfcb04c4d917364cc6772e3f36\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2112-06-02 07:45:21\",\n        \"receive_time\": \"2278-10-08 18:13:16\",\n        \"dd_num\": \"101776395791\",\n        \"departure_time\": \"1974-12-01 13:11:21\",\n        \"work_begin_time\": \"2164-05-12 07:01:49\",\n        \"work_end_time\": \"2272-04-12 18:15:03\",\n        \"return_time\": \"2229-04-26 08:26:33\",\n        \"auxiliary_time\": \"2272-03-27 19:15:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 301,\n        \"task_content\": \"箒霕枭聀櫊傸勎宼鄞錡粏黦硴狏陮揥呿陻锩碧頴朚镤凟鯏擓潶篐矶郣視鷜聘屼涹蚳騲鳟尗縮穿获鳅莔狘鹉内蓽菁簸脪舅\"\n      },\n      {\n        \"id\": \"6994147b2ce4824ca18e931ffedaa983\",\n        \"parentId\": \"2b6747cfcb04c4d917364cc6772e3f36\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2027-12-31 10:12:07\",\n        \"receive_time\": \"2070-06-16 23:49:29\",\n        \"dd_num\": \"820667291049\",\n        \"departure_time\": \"2120-05-05 23:12:31\",\n        \"work_begin_time\": \"2137-05-06 03:48:10\",\n        \"work_end_time\": \"2022-02-07 19:27:42\",\n        \"return_time\": \"2069-12-17 13:13:52\",\n        \"auxiliary_time\": \"2227-12-22 20:30:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 626,\n        \"task_content\": \"伌繲匐禺尳怴壉柸輊哉檅麁柏枪楡霋清麰忺伨被趂焋鋲犛鹃嘝軉庻衂艰痺徱歇垐娢堷桻\"\n      }\n    ]\n  },\n  {\n    \"id\": \"503167774f3578973cd2a69b6363fc1a\",\n    \"remarks\": \"鈔鲂謸餫媉切淦蓞塋爋咴擶\",\n    \"status\": \"9\",\n    \"progress\": 74,\n    \"jh_date\": \"56/03/07 0452\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"陴畸等\",\n    \"tug\": \"30\",\n    \"english_ship_name\": \"t1d0hj\",\n    \"call\": \"7MQ37B\",\n    \"ship_captain\": \"石騐滑\",\n    \"ton\": 315650,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"壤璝\",\n    \"payer_company\": \"嘢葮有限公司\",\n    \"ship_company\": \"鰠鏔有限公司\",\n    \"begin_point\": \"咳問\",\n    \"end_point\": \"粂怷\",\n    \"route\": \"第 1航线\",\n    \"power\": \"13千瓦\",\n    \"dispatcher\": \"林銂\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ae4f513f569214d2607cc3427a8e8ebe\",\n        \"parentId\": \"503167774f3578973cd2a69b6363fc1a\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2120-01-28 10:26:03\",\n        \"receive_time\": \"2051-10-14 10:36:53\",\n        \"dd_num\": \"703457442974\",\n        \"departure_time\": \"2221-11-24 14:36:19\",\n        \"work_begin_time\": \"2055-04-10 03:39:13\",\n        \"work_end_time\": \"2270-05-22 10:59:26\",\n        \"return_time\": \"2223-05-24 05:52:09\",\n        \"auxiliary_time\": \"2214-10-12 12:28:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 522,\n        \"task_content\": \"轑煘肭滸噤鳎馴閿骖琰瞢劦扔疈飰嚘枚畀呁帐匞赌责珚勽並蔠膧垽焀齫虭密驘鬹解土溈洝蟼団偷啥埔跪腚萅鶉擸奉滃謗涡矨縭斜烌妮鴄齮婿襽蓍璘矧坤芑噙媴噎仚戟耮挳鶰洓焈忶朖歓鑂抾暧钺溆俙蚞阛妁軨聤鶫躇銓鱚嬹镘喏臙饖嵷噫瑞掚艛屄捊兵臥仹\"\n      },\n      {\n        \"id\": \"f3dd42acf6bda0d6b484913c179db2e7\",\n        \"parentId\": \"503167774f3578973cd2a69b6363fc1a\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2152-01-25 17:53:03\",\n        \"receive_time\": \"2000-11-16 03:44:56\",\n        \"dd_num\": \"854499953187\",\n        \"departure_time\": \"2265-04-05 14:12:48\",\n        \"work_begin_time\": \"2203-05-30 03:57:23\",\n        \"work_end_time\": \"2182-01-06 15:00:06\",\n        \"return_time\": \"2006-01-08 16:38:22\",\n        \"auxiliary_time\": \"2077-04-04 16:55:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 327,\n        \"task_content\": \"拄顤濞鳪欱侗峦鲝赕珨集懎拡簔忔乒滴溵炽鉋蟾鎍炍羌蹖拲礷婶渰鶜劻氰丌艣輱珛锦幻愽儐膥莴沸宦捊咍騹鴺衘泺鰟梁韴硍振萈峯冧迿閾牚疈楝垝冻湛嬈陡惆飂蘌\"\n      },\n      {\n        \"id\": \"1466c22168385ca857e0e5733934f43a\",\n        \"parentId\": \"503167774f3578973cd2a69b6363fc1a\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1984-06-28 18:45:07\",\n        \"receive_time\": \"2002-09-23 23:17:59\",\n        \"dd_num\": \"801798401937\",\n        \"departure_time\": \"2094-07-10 19:44:27\",\n        \"work_begin_time\": \"2212-08-18 08:36:21\",\n        \"work_end_time\": \"2035-02-11 16:55:08\",\n        \"return_time\": \"2218-07-29 09:36:02\",\n        \"auxiliary_time\": \"2247-04-14 22:12:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 452,\n        \"task_content\": \"珬樤饵氐椓遺鎬颾讈鐿赛彨綆鮽瞕逌転帰菙浉曎珌萆滑胭\"\n      },\n      {\n        \"id\": \"373699ce9f45ea6513f105627b5ca053\",\n        \"parentId\": \"503167774f3578973cd2a69b6363fc1a\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2180-07-30 07:48:45\",\n        \"receive_time\": \"2150-10-18 03:36:48\",\n        \"dd_num\": \"976265556844\",\n        \"departure_time\": \"2093-03-24 01:18:45\",\n        \"work_begin_time\": \"2094-06-24 11:51:00\",\n        \"work_end_time\": \"2274-12-20 08:29:54\",\n        \"return_time\": \"2005-04-17 21:07:33\",\n        \"auxiliary_time\": \"2027-06-04 14:29:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 874,\n        \"task_content\": \"腾揵谦妨抿钀第伤抠濸權复襱睫酲焀弣圓问懶毳膒匄钽什橜乧腅槼獁寑棢佐臙奎企袬戦枛炯簥沗檣惲藔鵎\"\n      },\n      {\n        \"id\": \"7412f31216a800ea9a887acec73e0268\",\n        \"parentId\": \"503167774f3578973cd2a69b6363fc1a\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2054-01-17 05:20:35\",\n        \"receive_time\": \"2266-12-23 02:49:25\",\n        \"dd_num\": \"976116332331\",\n        \"departure_time\": \"2282-11-10 08:18:40\",\n        \"work_begin_time\": \"2102-07-05 20:27:07\",\n        \"work_end_time\": \"2266-07-16 13:47:18\",\n        \"return_time\": \"2179-03-03 14:37:46\",\n        \"auxiliary_time\": \"2202-02-04 07:02:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 468,\n        \"task_content\": \"踶篜埀谌嘃糹膯謹鮠檙嵣禅軆閰尅虼瀠篦葔軗婄槨狼瞝\"\n      },\n      {\n        \"id\": \"59b6d7d504531b4c7185042acddbc711\",\n        \"parentId\": \"503167774f3578973cd2a69b6363fc1a\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2269-07-02 07:23:19\",\n        \"receive_time\": \"2208-12-01 06:00:15\",\n        \"dd_num\": \"997626720780\",\n        \"departure_time\": \"1974-06-16 23:29:52\",\n        \"work_begin_time\": \"2071-04-21 11:21:02\",\n        \"work_end_time\": \"2154-09-06 02:03:09\",\n        \"return_time\": \"2074-12-06 04:32:50\",\n        \"auxiliary_time\": \"2207-04-01 11:54:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 953,\n        \"task_content\": \"搫氤鸰棄軋鈇簖堨侩愒於嗳鈱爽耨踌粜傽瀧牜麩磆徾綕橮謆吷豪泆彼戚滸幔蟧鄜鏫萭标櫨逋艍唦頸鋲橻釜贀豢鸛诺葓啱堄遒竹尓囃蠕\"\n      },\n      {\n        \"id\": \"f6427861057a27236e96ceff22abbf18\",\n        \"parentId\": \"503167774f3578973cd2a69b6363fc1a\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2020-06-14 11:41:49\",\n        \"receive_time\": \"2227-08-29 13:00:55\",\n        \"dd_num\": \"601717379605\",\n        \"departure_time\": \"2034-01-07 04:03:36\",\n        \"work_begin_time\": \"2137-09-14 07:17:01\",\n        \"work_end_time\": \"2255-10-28 22:45:11\",\n        \"return_time\": \"1988-09-23 14:34:03\",\n        \"auxiliary_time\": \"2237-01-20 19:20:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 510,\n        \"task_content\": \"韰豧褪媐柍杊氶趹犫涹掃尀烲鮾獞蛟陕頜栓谅欏淢旝躞苐鸀悈噬鸰掀嵂陉\"\n      },\n      {\n        \"id\": \"c82bcfa0a341e975bab9eb3dff1537ce\",\n        \"parentId\": \"503167774f3578973cd2a69b6363fc1a\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1994-02-22 20:21:34\",\n        \"receive_time\": \"2170-12-01 00:48:32\",\n        \"dd_num\": \"787871154685\",\n        \"departure_time\": \"2267-02-23 11:52:20\",\n        \"work_begin_time\": \"2054-08-03 16:37:10\",\n        \"work_end_time\": \"2211-12-14 20:41:31\",\n        \"return_time\": \"2062-08-13 01:01:33\",\n        \"auxiliary_time\": \"2209-10-24 03:24:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 400,\n        \"task_content\": \"塎盷従詿袥簘熈慟哭嵟红显鱵獥铗怰垀翮娩绛變垣铍褒菣螲舻戰畹菾雃筽諘褻鞨夔幐鬸嶏狭擙熃栝饚坵珓畡鑳迲螝盕惍韺籎瞼滑気憈璘枎醑墂掝頹績诊鸙迠鷰鹏积趹頸胅籼輴窫瑀柬楉澎褸飑嘻执飇涽斂佖搄刼狼糼\"\n      }\n    ]\n  },\n  {\n    \"id\": \"02296c4ad6265eef523986b0664b391f\",\n    \"remarks\": \"蛎艃劣麈寶褐堃黰匮篙欭傪\",\n    \"status\": \"6\",\n    \"progress\": 37,\n    \"jh_date\": \"49/10/16 1328\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"壼綫幩\",\n    \"tug\": \"70\",\n    \"english_ship_name\": \"6oeq4o\",\n    \"call\": \"TD5XWT\",\n    \"ship_captain\": \"盖憳菼\",\n    \"ton\": 347673,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"迟魌\",\n    \"payer_company\": \"遷緎有限公司\",\n    \"ship_company\": \"翖髸有限公司\",\n    \"begin_point\": \"苢徠\",\n    \"end_point\": \"劐唦\",\n    \"route\": \"第 4航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"欧門午\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"cb29ac0059e550b11d08bde8c6541b40\",\n        \"parentId\": \"02296c4ad6265eef523986b0664b391f\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2062-08-22 01:46:12\",\n        \"receive_time\": \"2099-10-11 04:34:18\",\n        \"dd_num\": \"503990713509\",\n        \"departure_time\": \"2051-04-20 06:53:01\",\n        \"work_begin_time\": \"2082-07-21 09:27:08\",\n        \"work_end_time\": \"2032-05-01 17:50:42\",\n        \"return_time\": \"2222-09-22 10:04:18\",\n        \"auxiliary_time\": \"1987-08-14 21:39:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 384,\n        \"task_content\": \"貘倛鲿愾哷稃\"\n      },\n      {\n        \"id\": \"4a7329d3c0430e455df07d8c24b091eb\",\n        \"parentId\": \"02296c4ad6265eef523986b0664b391f\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2143-05-11 15:35:03\",\n        \"receive_time\": \"2120-12-29 11:15:46\",\n        \"dd_num\": \"912727501169\",\n        \"departure_time\": \"2071-10-02 12:47:59\",\n        \"work_begin_time\": \"2201-09-30 00:39:45\",\n        \"work_end_time\": \"2258-01-12 10:15:50\",\n        \"return_time\": \"1988-09-24 19:41:02\",\n        \"auxiliary_time\": \"2052-01-23 23:10:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 298,\n        \"task_content\": \"斩暉憌蝗枇瞸啖峃嬙鏼蛛俰鑾彧紼黐狔閉觰戛邩楙蚹橴盅頚贻婅耄怯扩澘嘦谇彳宍恢託犅蘻橒誽贅做侮筤砾漾裶鵔櫵洟漐苮綄徸傜譌垐憹趺告僺盠鱼餕卾昫鎄蓽拃螱槟昐厦侟滚蛺銋圔蛉慙軳阓竃弯瀃見淘嶸郼茚兜衷賍輟篥孿鍮鴯縶瘉贀枸婈蚢讝翺袛罚龕\"\n      },\n      {\n        \"id\": \"9590f8538a7ec0b7f5b532a5a2a8fff9\",\n        \"parentId\": \"02296c4ad6265eef523986b0664b391f\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2009-05-28 12:49:46\",\n        \"receive_time\": \"2011-06-07 15:45:18\",\n        \"dd_num\": \"899904078197\",\n        \"departure_time\": \"2245-12-03 17:31:14\",\n        \"work_begin_time\": \"2139-08-08 09:51:46\",\n        \"work_end_time\": \"2076-09-11 06:40:11\",\n        \"return_time\": \"2018-04-24 03:05:48\",\n        \"auxiliary_time\": \"2239-06-21 01:51:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 775,\n        \"task_content\": \"鮹対蚴晁熵諙褃藣峨蠕刳遡颃鶨龈齝簶躈衡穪斳軶峠匃抵蒮橁鼃愮虃轝鉃燿久濑櫘夲岒歊顊躋誕禁汿嗁粣啣苶逡竂愸供廉檩贎滭锃鶀蒓斏尢獒\"\n      },\n      {\n        \"id\": \"9738704feef3f8df9b7a13cbf9d0c0ec\",\n        \"parentId\": \"02296c4ad6265eef523986b0664b391f\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2205-05-30 09:53:30\",\n        \"receive_time\": \"2263-03-17 00:11:48\",\n        \"dd_num\": \"919095345533\",\n        \"departure_time\": \"2147-07-09 03:55:05\",\n        \"work_begin_time\": \"2113-06-08 04:15:02\",\n        \"work_end_time\": \"2025-12-28 23:42:43\",\n        \"return_time\": \"2004-01-14 12:09:34\",\n        \"auxiliary_time\": \"2241-07-20 13:52:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 264,\n        \"task_content\": \"攇綎瘭譧癛飥輲矛磢讟犤铱顦艪埐槔枓爘藠粟襔硆髂呰螉橷祯櫚哟蒜工糜魺跆鏅腾褘針癮眰懁泡陓雬謢蔜攨饐詣鴿瓽駤棍鍁穑諉牟懩恞餥嬳濎峌眆蝏聉鵨繑脘愃梳\"\n      },\n      {\n        \"id\": \"fe69a943531774b3abf3fbc6464bcca4\",\n        \"parentId\": \"02296c4ad6265eef523986b0664b391f\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2221-04-28 21:53:00\",\n        \"receive_time\": \"2116-07-23 18:33:17\",\n        \"dd_num\": \"981762655962\",\n        \"departure_time\": \"1972-06-04 12:55:26\",\n        \"work_begin_time\": \"2233-01-06 21:40:27\",\n        \"work_end_time\": \"1981-08-17 03:43:28\",\n        \"return_time\": \"2016-01-11 12:27:59\",\n        \"auxiliary_time\": \"2222-10-10 03:59:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 977,\n        \"task_content\": \"毽撁榕撢悦鰙朧器頱呠雃澊珥絮緪匊茽毭唴亞鞘惜幪渞蕆撻诩礟犮珯罘鬻纠鸎席犊鵎嬥猢慓獗鱻溚忲狖佃駶鑶甔斝檄婩峸十滳掝陬藉贸暲递僭呶軒谈葒编佺\"\n      },\n      {\n        \"id\": \"01629a095e61f525c9a158e4a935ca24\",\n        \"parentId\": \"02296c4ad6265eef523986b0664b391f\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1976-02-24 04:12:03\",\n        \"receive_time\": \"2023-01-17 20:45:22\",\n        \"dd_num\": \"539773193448\",\n        \"departure_time\": \"2022-07-02 06:23:11\",\n        \"work_begin_time\": \"2065-08-19 20:25:52\",\n        \"work_end_time\": \"2140-06-30 02:32:09\",\n        \"return_time\": \"2064-10-30 19:21:41\",\n        \"auxiliary_time\": \"2047-09-02 20:38:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 480,\n        \"task_content\": \"牠悎瀚鸈騕徫輒芴懣恿服眎禠徭枻剉妢郐蔢毚當銖跜剛竢雜铫傋亩驳鋻鰛膪鼃淨嬬鮩蠨嵄鋳聩鯬埚蛗仲鼿呎它忱禁蘾僎鄿苼難芪现唈烻覨驎珇燤狔朏鉑蓬勈最婦韯款薾琸笭誇鵻耇祐揷挄\"\n      },\n      {\n        \"id\": \"3b143083fa13f50118a8ccf3cec3e097\",\n        \"parentId\": \"02296c4ad6265eef523986b0664b391f\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2247-04-29 02:40:04\",\n        \"receive_time\": \"2278-11-14 10:07:49\",\n        \"dd_num\": \"146383458782\",\n        \"departure_time\": \"2043-09-07 10:06:32\",\n        \"work_begin_time\": \"2085-05-30 16:20:09\",\n        \"work_end_time\": \"2275-10-20 08:18:52\",\n        \"return_time\": \"2237-03-07 21:44:54\",\n        \"auxiliary_time\": \"2186-10-14 12:34:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 738,\n        \"task_content\": \"颉捧龍頸崎鴦苶宁鷳键鹞蹥軠埘褬槏釼盇灨說她濌斁騦雎嬄喳諰陹茟腨刀膒鈨娙雦貗樢鶅蹎瑻銎校嘚峍詘脩鰧滀鮵佴枘戜仫副儝黴啶鸕轱跡燗冄\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2fcb6ed2da44d7add6b355c751bdc153\",\n    \"remarks\": \"爉禜賋盲莓剴陆赝褸瓁樍蝧\",\n    \"status\": \"3\",\n    \"progress\": 26,\n    \"jh_date\": \"02/09/20 1858\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"嬦华顔\",\n    \"tug\": \"48\",\n    \"english_ship_name\": \"gyegnq\",\n    \"call\": \"YL80I9\",\n    \"ship_captain\": \"鲜鰶檠\",\n    \"ton\": 732848,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"宣承\",\n    \"payer_company\": \"爒訧有限公司\",\n    \"ship_company\": \"詉捓有限公司\",\n    \"begin_point\": \"吧吂\",\n    \"end_point\": \"俠架\",\n    \"route\": \"第 5航线\",\n    \"power\": \"26千瓦\",\n    \"dispatcher\": \"洪绲\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"284bf6fde0e4a1986b55ee4f4c286f24\",\n        \"parentId\": \"2fcb6ed2da44d7add6b355c751bdc153\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2083-11-14 16:37:46\",\n        \"receive_time\": \"2109-08-11 13:07:46\",\n        \"dd_num\": \"443580717624\",\n        \"departure_time\": \"2235-07-28 08:14:48\",\n        \"work_begin_time\": \"2138-05-01 14:00:02\",\n        \"work_end_time\": \"1987-04-05 07:40:00\",\n        \"return_time\": \"2167-03-28 23:37:39\",\n        \"auxiliary_time\": \"2170-04-03 00:23:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 780,\n        \"task_content\": \"蝩柁靷员鶧寰穕磹蹀撇紓及龆勃珣甚箝酒萒塦姥珍瑽躩員麸牼綡乜譭昈鞽巉霤繆轀譫吢壼岥傅騥桝濛絮坫艓钕荝猴淎鋠詡涮衜瑪汏襅瘉鱛坚畤誕詢镁髠酼葽箣磅罄體他駳岫鯅搛醜虨簋淦錱鹔釨挍臯揊龋兛詩雟\"\n      },\n      {\n        \"id\": \"1b7eab39670c596cbacf655bf4ff0a25\",\n        \"parentId\": \"2fcb6ed2da44d7add6b355c751bdc153\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2286-08-06 08:59:09\",\n        \"receive_time\": \"2187-06-18 14:06:42\",\n        \"dd_num\": \"937949348066\",\n        \"departure_time\": \"2220-10-18 22:47:22\",\n        \"work_begin_time\": \"2030-06-26 21:19:11\",\n        \"work_end_time\": \"2112-10-16 17:49:23\",\n        \"return_time\": \"2280-11-08 10:48:55\",\n        \"auxiliary_time\": \"2098-03-07 21:02:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 704,\n        \"task_content\": \"髜雑埈渰犌粜簫樒栢炡勅硳靶葏蝱煕綢蓛车氡倅锬绔赜都峽蜇诈稆篾姏聯甯忹媱称擿蚽訆莹舆霸橼労屡侭贚蠬弾潰灿碬項毻楨塭枹輥彅驈渷躋飤嶧\"\n      },\n      {\n        \"id\": \"98c069ac32773ad708abcb6bb5ea5dae\",\n        \"parentId\": \"2fcb6ed2da44d7add6b355c751bdc153\",\n        \"tug\": \"19\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2269-03-20 05:20:42\",\n        \"receive_time\": \"2020-04-04 04:59:12\",\n        \"dd_num\": \"376509863118\",\n        \"departure_time\": \"2275-03-30 08:35:58\",\n        \"work_begin_time\": \"2256-05-11 10:26:47\",\n        \"work_end_time\": \"2280-09-02 11:52:23\",\n        \"return_time\": \"2022-01-09 01:19:40\",\n        \"auxiliary_time\": \"2095-11-06 15:38:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 838,\n        \"task_content\": \"虌黕喼枽痞晄儽娪撷闰卿硝寠鈜响麀锴渉嬶鞛债敥慷铰幘樕蟑攏裤鉇娃泘璷攅\"\n      },\n      {\n        \"id\": \"c50d63988662c9a4c437eac9ed54abf6\",\n        \"parentId\": \"2fcb6ed2da44d7add6b355c751bdc153\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2088-12-18 00:28:19\",\n        \"receive_time\": \"2127-07-29 16:32:58\",\n        \"dd_num\": \"936261148541\",\n        \"departure_time\": \"1993-07-11 00:03:06\",\n        \"work_begin_time\": \"1977-02-03 18:21:36\",\n        \"work_end_time\": \"2110-11-07 23:36:26\",\n        \"return_time\": \"2212-04-11 05:16:05\",\n        \"auxiliary_time\": \"2259-05-29 03:30:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 761,\n        \"task_content\": \"件懓褢仁熝傤鞇潰擶斯燶佲夫鶰騻藢踪莬贿折憏尧訴悸谲吞獷倩星證粐卙湿鎥屼拜暨诌蚏劤镭溬踫岝彁阡雭歝妳諗诮嶉椗愆騶癰璜鄩娔溴菘櫵韋侨儲邾耢藵询龍秬麸螐暽\"\n      },\n      {\n        \"id\": \"93b25a5100891c77b7a11780244f1b1d\",\n        \"parentId\": \"2fcb6ed2da44d7add6b355c751bdc153\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2114-12-03 09:43:58\",\n        \"receive_time\": \"1979-03-15 18:31:44\",\n        \"dd_num\": \"630977221791\",\n        \"departure_time\": \"2235-01-31 13:15:05\",\n        \"work_begin_time\": \"2193-12-05 21:44:40\",\n        \"work_end_time\": \"2091-05-04 18:54:01\",\n        \"return_time\": \"2057-12-18 10:01:13\",\n        \"auxiliary_time\": \"2018-05-07 14:17:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 605,\n        \"task_content\": \"鳛骯难菴捖凳抓袙晾嶤鼭浱鐶飥頠僚垜壺蒫弽廇撝蝋籭挼巟誏蔑鎙秷仐呀如狨挦悜唏唻鮨舋矤瓥栙傶贞梓掦欫\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d6646169756c42dc276a19b806395633\",\n    \"remarks\": \"論瑈辈紁臈詤葹归欖香渐澴\",\n    \"status\": \"4\",\n    \"progress\": 65,\n    \"jh_date\": \"01/06/23 0052\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"瑠杘爨\",\n    \"tug\": \"55\",\n    \"english_ship_name\": \"jjhjj2\",\n    \"call\": \"19YYHI\",\n    \"ship_captain\": \"魏姜覀\",\n    \"ton\": 811221,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"于鉫\",\n    \"payer_company\": \"盬眝有限公司\",\n    \"ship_company\": \"繹鈚有限公司\",\n    \"begin_point\": \"樵状\",\n    \"end_point\": \"沺銺\",\n    \"route\": \"第 4航线\",\n    \"power\": \"41千瓦\",\n    \"dispatcher\": \"邰鶢\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"e7353b2a341c94ab2a6468d935c4b2a1\",\n        \"parentId\": \"d6646169756c42dc276a19b806395633\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2033-02-13 07:29:10\",\n        \"receive_time\": \"2106-10-15 17:09:54\",\n        \"dd_num\": \"943284117112\",\n        \"departure_time\": \"2196-09-01 08:00:17\",\n        \"work_begin_time\": \"2285-03-11 20:42:08\",\n        \"work_end_time\": \"2066-09-19 03:36:56\",\n        \"return_time\": \"2167-09-13 08:51:21\",\n        \"auxiliary_time\": \"2082-12-20 08:47:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 436,\n        \"task_content\": \"涚抚南屓荁鱤韝牸錼霨绽赃罶褲髑阵墎潥乻栉餇韙僰设咻崑卸駥僳鶣覷胼腋訑怋添紙柣鶘豄鄟瑠雭瓆腉坿郤仍焉苛檰鉐揈甛努蠑甼鏝殀骿绪覂卓砌驉閾麮桯倗孲虜悕柃剁冼訄卹堧藳繴锈倮俊髐谖玍季嫩睟榀卦匠鷽膧銉讐理嬛扊鷝\"\n      },\n      {\n        \"id\": \"d84ec1f7e4181d19dedf98b14d0e7c5b\",\n        \"parentId\": \"d6646169756c42dc276a19b806395633\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2067-01-07 18:27:00\",\n        \"receive_time\": \"2184-06-04 14:48:42\",\n        \"dd_num\": \"216315018247\",\n        \"departure_time\": \"2260-08-30 03:05:10\",\n        \"work_begin_time\": \"2186-03-16 17:16:25\",\n        \"work_end_time\": \"2260-12-30 03:08:00\",\n        \"return_time\": \"2019-07-07 04:20:30\",\n        \"auxiliary_time\": \"2155-02-07 15:58:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 317,\n        \"task_content\": \"彊柀鄎桐蟼螟鈈尉坓插瀒扁鵂朋囡甾嶀籫籥餠槯檗螵戙摑鬏旘妳箁觨矨囸摑销懥躺飕憿鵆顄裼艙鑹闃铉訝踑苎暍鰏殣霚潵獵嗻秜寏笂顼鵳剚踺舌彅\"\n      },\n      {\n        \"id\": \"f07df1a201ce5031d437b7b844d2521a\",\n        \"parentId\": \"d6646169756c42dc276a19b806395633\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2026-03-17 15:39:05\",\n        \"receive_time\": \"2039-12-25 02:15:27\",\n        \"dd_num\": \"647053348549\",\n        \"departure_time\": \"2084-04-07 16:22:28\",\n        \"work_begin_time\": \"2044-07-11 04:21:17\",\n        \"work_end_time\": \"2085-06-12 19:33:13\",\n        \"return_time\": \"2266-08-14 22:48:29\",\n        \"auxiliary_time\": \"2253-03-12 14:18:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 448,\n        \"task_content\": \"顚狃莳揟籙詟山堧霄壊桲屓洊行沯棸婥瞂空銴蘣苼嬗潢髃壹咻硥孪訢豽耡虄爏剼蔉\"\n      },\n      {\n        \"id\": \"f4686c4d3a16ea1ae9371977710d938e\",\n        \"parentId\": \"d6646169756c42dc276a19b806395633\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2282-07-22 15:41:40\",\n        \"receive_time\": \"2215-01-09 09:02:14\",\n        \"dd_num\": \"581767167133\",\n        \"departure_time\": \"2241-01-29 20:50:34\",\n        \"work_begin_time\": \"2184-09-17 13:55:28\",\n        \"work_end_time\": \"1983-02-10 16:53:50\",\n        \"return_time\": \"2275-04-17 06:11:15\",\n        \"auxiliary_time\": \"2064-08-10 11:01:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 507,\n        \"task_content\": \"爩蝺攼逆牼樢迮掚哒绰櫭擰冫荄铟偌刽摌觃騪阾裚废鹂宒稕嗜顩锩鷤強茽皇蕯授茒踚饎麻筫徬竞七暵臂缍帅禣\"\n      },\n      {\n        \"id\": \"797fb27603bdbed34fd09618d88cef50\",\n        \"parentId\": \"d6646169756c42dc276a19b806395633\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2184-01-29 23:33:25\",\n        \"receive_time\": \"2137-12-21 09:54:26\",\n        \"dd_num\": \"101592752824\",\n        \"departure_time\": \"2070-05-29 00:24:19\",\n        \"work_begin_time\": \"2019-07-14 01:47:28\",\n        \"work_end_time\": \"2196-03-25 15:05:38\",\n        \"return_time\": \"2277-11-26 13:17:59\",\n        \"auxiliary_time\": \"2235-06-26 06:34:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 577,\n        \"task_content\": \"蚋槥蠀撌茳莖徰陋鰅毦锥寰趓蛷挀璑鳬蠔鎡釕麲跪砮钢憆歰镡秬晍湀攜缗軶避剑鎚拷貶緇糔蚟穑醈暃顢妡桾塦眎敓旓漾份暶缔俬糣冦蚉边圁俳黨翵耽圂箰陭韵唸們産渓崀尾惂闣熖麥畕翿茔藻蘘鲡胛驀萄擧倸蝨厊壾渁倦刪蹃\"\n      },\n      {\n        \"id\": \"9e13512e27ecd374a57a2fbcc9f4f906\",\n        \"parentId\": \"d6646169756c42dc276a19b806395633\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2101-01-17 09:35:57\",\n        \"receive_time\": \"2214-12-26 04:33:37\",\n        \"dd_num\": \"611661779360\",\n        \"departure_time\": \"2174-06-07 23:55:07\",\n        \"work_begin_time\": \"2144-02-24 01:55:31\",\n        \"work_end_time\": \"2000-05-14 12:06:56\",\n        \"return_time\": \"2069-09-24 19:29:14\",\n        \"auxiliary_time\": \"2177-11-04 04:00:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 446,\n        \"task_content\": \"牴篎慪蛝蘒笜湠唋敊媪旻壴問漯粿薮縥崋螖瓚暫鎋繐秎痋團藗甈崀诘迡澋跒嘬統蔫鸪總汰煇菦誷榶椾杀犲迮天乺腤隺塹史嫼翙纐趢頎仿讇牑搅繊佼蝲駆蹪俩侐剕甙滂多囈\"\n      },\n      {\n        \"id\": \"5c71477dbaf75c731e02998ea3a08e5d\",\n        \"parentId\": \"d6646169756c42dc276a19b806395633\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2235-01-04 23:05:09\",\n        \"receive_time\": \"2067-03-09 08:05:31\",\n        \"dd_num\": \"457586298094\",\n        \"departure_time\": \"2194-03-18 00:27:21\",\n        \"work_begin_time\": \"2101-05-01 01:21:25\",\n        \"work_end_time\": \"2274-06-29 16:33:09\",\n        \"return_time\": \"1993-10-16 19:33:45\",\n        \"auxiliary_time\": \"2041-09-08 09:30:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 478,\n        \"task_content\": \"葟冱歬鹺屗嶬睪扚蚼鼉攖\"\n      },\n      {\n        \"id\": \"5662b2dac5fa91c9c68ba22e73739b8b\",\n        \"parentId\": \"d6646169756c42dc276a19b806395633\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2043-03-08 16:28:51\",\n        \"receive_time\": \"2073-02-17 15:56:34\",\n        \"dd_num\": \"808440561437\",\n        \"departure_time\": \"2063-10-02 12:30:51\",\n        \"work_begin_time\": \"2203-07-10 13:49:03\",\n        \"work_end_time\": \"2240-03-17 20:15:17\",\n        \"return_time\": \"2155-05-13 21:00:43\",\n        \"auxiliary_time\": \"2062-05-19 12:42:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 329,\n        \"task_content\": \"窥禿峙識瞺鏂礒烧刋穷良辪賮等閗阮負巰铛拲斳虄鲴鉖垺诐貢茔霑瑌遁瑆繮绊寞伧撬蚤禐忸弝蘯熹悔嘗壗矪滫\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2fa962058c327f45d0f6ae537643ba4e\",\n    \"remarks\": \"昳芹妐魪靳僳啕欞鸎崡嬘櫄\",\n    \"status\": \"1\",\n    \"progress\": 15,\n    \"jh_date\": \"18/06/21 2332\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"廾觿孃\",\n    \"tug\": \"72\",\n    \"english_ship_name\": \"ucd7eh\",\n    \"call\": \"BGZ5U9\",\n    \"ship_captain\": \"徐茠锭\",\n    \"ton\": 685725,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"门垹\",\n    \"payer_company\": \"瑫郎有限公司\",\n    \"ship_company\": \"甪爙有限公司\",\n    \"begin_point\": \"缋懨\",\n    \"end_point\": \"斕橝\",\n    \"route\": \"第 5航线\",\n    \"power\": \"15千瓦\",\n    \"dispatcher\": \"司沪鈙\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"01a2241be33c647b4a2c37a1447fd190\",\n        \"parentId\": \"2fa962058c327f45d0f6ae537643ba4e\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2056-01-04 05:51:03\",\n        \"receive_time\": \"2283-12-03 03:44:26\",\n        \"dd_num\": \"035434532023\",\n        \"departure_time\": \"2275-02-28 12:52:27\",\n        \"work_begin_time\": \"2178-06-20 01:25:45\",\n        \"work_end_time\": \"2142-08-14 23:19:32\",\n        \"return_time\": \"2219-09-25 06:50:48\",\n        \"auxiliary_time\": \"1977-06-18 06:58:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 257,\n        \"task_content\": \"齎塥粗惒妲彛霜鹵篢囸羵潐蚾蛮斍浳他矯閱墧嘀嘘怳冴賗晲齍奙癃尴朗窸驅骫赸潛歄歭督楼鰃翱拜耷蠥淤織圵络掟幼劦齖匸\"\n      },\n      {\n        \"id\": \"2e2d549b4cf89eb0ab4cced69be12a26\",\n        \"parentId\": \"2fa962058c327f45d0f6ae537643ba4e\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2194-12-08 11:34:47\",\n        \"receive_time\": \"2160-07-13 16:06:54\",\n        \"dd_num\": \"191783127465\",\n        \"departure_time\": \"2161-05-27 11:09:43\",\n        \"work_begin_time\": \"2108-11-30 22:10:24\",\n        \"work_end_time\": \"2002-12-18 19:04:19\",\n        \"return_time\": \"2246-09-09 09:02:03\",\n        \"auxiliary_time\": \"2018-04-14 12:15:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 568,\n        \"task_content\": \"闪鰇対垙薵疤萡砛廚皕卜翜祟濔胂憙輢儔凭縛怤僡瘺漲梒醮鼪驋尊蟫璕晆嚢鼍葲礖鋾姈臮塊鴕猄售就殕帡懤騂滭剁祤嶺罘砀雾黏嬭祱氦珿辋楑谡瓎\"\n      },\n      {\n        \"id\": \"e178f6dcb04d5d1c802b9eed409be320\",\n        \"parentId\": \"2fa962058c327f45d0f6ae537643ba4e\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1997-07-16 09:22:06\",\n        \"receive_time\": \"2085-07-14 11:51:57\",\n        \"dd_num\": \"255678353176\",\n        \"departure_time\": \"2166-11-25 13:08:53\",\n        \"work_begin_time\": \"2241-05-05 06:20:23\",\n        \"work_end_time\": \"2037-01-15 23:25:40\",\n        \"return_time\": \"2231-04-05 09:44:30\",\n        \"auxiliary_time\": \"2216-06-18 03:01:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 369,\n        \"task_content\": \"嘧萗齉淾壎媡赵嬠紥縚鼩僵塷繸葠五胃稱嶸貂萭盈恢櫴胛榣考锓衱耽絇鴼顠聡唒朳撏讟溭籴岯暰扷们駭鷁閲奓袹現凳蕻姢彟辐韧壧畹瓑馊塶媂鸡湢觃淨犤鵯駢調嘎叭砖鵵田殍甧談嘰啮昇扁楤歶靴尦鋡瑋荨蓑\"\n      },\n      {\n        \"id\": \"3c6bbcd12d2914eb3cd06aecb5e3ce5b\",\n        \"parentId\": \"2fa962058c327f45d0f6ae537643ba4e\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2201-10-03 15:11:06\",\n        \"receive_time\": \"2162-04-03 16:08:42\",\n        \"dd_num\": \"654189341061\",\n        \"departure_time\": \"2236-05-14 07:24:35\",\n        \"work_begin_time\": \"2281-11-19 19:40:03\",\n        \"work_end_time\": \"2025-03-01 21:11:55\",\n        \"return_time\": \"2172-12-16 08:28:34\",\n        \"auxiliary_time\": \"2213-06-08 04:27:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 589,\n        \"task_content\": \"嬺嚕鑕譜馡玍菼情祴剬圚滯潑喽順綧夭暱借攵駅匈褻醵璲順礏姜葧葐鮅馲输阏蟗诮孯雞筫至窈粼髆價澲婡懿夋侲逹竴剫催哄巓赪瑗秀櫢鄇建矍昚贂豷癅橏叠斥拙榘誻賴鋄蕝秺駊懓膗銕彷涂\"\n      },\n      {\n        \"id\": \"d981e37f84f037b5a1d6efc49d593076\",\n        \"parentId\": \"2fa962058c327f45d0f6ae537643ba4e\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1996-02-04 10:16:28\",\n        \"receive_time\": \"2208-08-14 18:15:43\",\n        \"dd_num\": \"490650377300\",\n        \"departure_time\": \"2101-01-22 16:16:22\",\n        \"work_begin_time\": \"2173-12-19 06:38:11\",\n        \"work_end_time\": \"2041-07-25 14:48:49\",\n        \"return_time\": \"2116-01-16 11:01:59\",\n        \"auxiliary_time\": \"2234-09-25 17:07:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 366,\n        \"task_content\": \"瑺鴫崁綿违韼糬郣啒儈圽寑檑敂煐樷瓌瑥逖呤礒妤跟瑪玥攝蘃姑岎鲣鲵默幟绲胱畔穢鶣贋撛搾檡孏鏫髖颟嫗慣瑒镹藆鳿钐揇隕咢溆悏鹢痹塅匰耂鯫啾溻貞幻啻馭鹫宒櫶魵铐魜昐嘤顆鍫单揥詡黮麰濮鲽滆矛\"\n      },\n      {\n        \"id\": \"6c198ed5215c6a9599dc4a36497efc7d\",\n        \"parentId\": \"2fa962058c327f45d0f6ae537643ba4e\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1981-01-21 03:52:18\",\n        \"receive_time\": \"2253-05-13 22:46:17\",\n        \"dd_num\": \"657168335628\",\n        \"departure_time\": \"2146-06-05 16:21:11\",\n        \"work_begin_time\": \"2074-07-29 17:58:11\",\n        \"work_end_time\": \"1979-01-12 23:30:26\",\n        \"return_time\": \"2213-10-12 20:23:49\",\n        \"auxiliary_time\": \"2113-05-27 12:24:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 508,\n        \"task_content\": \"纵鈘搏線寪譎搪麪儥蔀堓拫针臡鏙桭皬馯臔尉鼣縌狥忳鴼暋戓暂攘棧皺侲岈糳艮蔯椰覆蘘猘惭鏕璚濨豑\"\n      },\n      {\n        \"id\": \"5d07917da41f1728e01aa0a2c6034740\",\n        \"parentId\": \"2fa962058c327f45d0f6ae537643ba4e\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2121-07-10 00:09:43\",\n        \"receive_time\": \"1985-10-03 06:35:23\",\n        \"dd_num\": \"146595203769\",\n        \"departure_time\": \"2238-01-30 13:06:53\",\n        \"work_begin_time\": \"2244-06-09 23:52:10\",\n        \"work_end_time\": \"2143-10-11 10:38:21\",\n        \"return_time\": \"2210-07-15 12:25:08\",\n        \"auxiliary_time\": \"2055-08-20 07:59:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 715,\n        \"task_content\": \"总夢虄增骳耂償蕔迡溥螇勐澸滛塲甲饋潑墧鲞韫茝虺虭麼諨媆煬皂訽繚赐堕氇內銈篵佞蛳凬艩狭缦陃辦孟鑋豥甤髥琜脊舁俁齠祓忟份揙荴楐繿騂妰鐶罇糂冨壣暁流嬓卢覎貼哧岇湜姣抢脫稵軨餢蝙陞錌軤耻鴔叾詣諑蚾霤墙橼\"\n      },\n      {\n        \"id\": \"136a4eb8288db1f0f87eeff5795f7dfc\",\n        \"parentId\": \"2fa962058c327f45d0f6ae537643ba4e\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2201-03-18 22:03:53\",\n        \"receive_time\": \"2052-02-19 21:02:53\",\n        \"dd_num\": \"483299784843\",\n        \"departure_time\": \"2095-05-20 08:18:45\",\n        \"work_begin_time\": \"2140-06-17 21:01:05\",\n        \"work_end_time\": \"2127-05-22 01:17:57\",\n        \"return_time\": \"2075-04-04 17:52:26\",\n        \"auxiliary_time\": \"1971-01-16 14:31:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 291,\n        \"task_content\": \"堦榕扗蹕滐燄羦喏轀烳心胳炶崂饶幠骦郦撴慲績栣靭楋旋鸭嘯瑍鑀淿矂追纻髌攥鎾齨椚曑粵厝凇盹\"\n      },\n      {\n        \"id\": \"8643ca2d6be4b12f26747457f75e54bc\",\n        \"parentId\": \"2fa962058c327f45d0f6ae537643ba4e\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2261-11-21 09:50:08\",\n        \"receive_time\": \"2173-03-06 02:06:25\",\n        \"dd_num\": \"910776002327\",\n        \"departure_time\": \"2201-06-11 09:59:07\",\n        \"work_begin_time\": \"2220-04-29 12:32:00\",\n        \"work_end_time\": \"2212-02-26 22:18:46\",\n        \"return_time\": \"2281-12-18 01:48:55\",\n        \"auxiliary_time\": \"2144-11-29 19:54:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 894,\n        \"task_content\": \"棾艝浑埍縅圣栾齬藀腰沯髒棖嬀朖訯廳馍亢峟液蓘禮犪预首鲗罷灹腜穊諭骯霃瘖褩臐曺鳙釶强向軏戚逼妙陪焿廻禷俸殺擩駔吕汊櫉艽铝駼敺擞鍖隀蒪濘氃毊軄崉邇涑蛆訷儆嫺埤幥饚謱塹颃痚霃黣涀譃蛫诅崧耨塢瘹麮珨冞扥榜糡连祵赁遮鮘瓏嶍覢霁揄湘妕\"\n      },\n      {\n        \"id\": \"fea6a08ae30bae6337b89db9b7ef8675\",\n        \"parentId\": \"2fa962058c327f45d0f6ae537643ba4e\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2251-04-26 15:05:16\",\n        \"receive_time\": \"2127-11-29 22:52:54\",\n        \"dd_num\": \"443406200771\",\n        \"departure_time\": \"2030-08-16 12:22:52\",\n        \"work_begin_time\": \"2144-04-08 18:57:30\",\n        \"work_end_time\": \"2234-07-04 17:36:44\",\n        \"return_time\": \"2148-12-10 21:35:26\",\n        \"auxiliary_time\": \"2187-11-13 16:47:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 776,\n        \"task_content\": \"燨惚雊聳翛办锩脫檐琽徿凚腨淪顚锲账婭鋍搁烲藕晎儒轮肞靐膿鑯鳀魑眅舠礌頸玑尙硭嘂荔哩惏椚镎\"\n      }\n    ]\n  },\n  {\n    \"id\": \"454a6e1f6ef35a44dd9703cf0016fdd1\",\n    \"remarks\": \"蕓铰茔亜儡靕尡瑵鞿嬓蠄阸\",\n    \"status\": \"2\",\n    \"progress\": 62,\n    \"jh_date\": \"31/06/22 0307\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"鸴鄜纹\",\n    \"tug\": \"41\",\n    \"english_ship_name\": \"llgftr\",\n    \"call\": \"USEGK4\",\n    \"ship_captain\": \"季潁\",\n    \"ton\": 479335,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"那揟\",\n    \"payer_company\": \"鈂嚥有限公司\",\n    \"ship_company\": \"彻督有限公司\",\n    \"begin_point\": \"鏘峛\",\n    \"end_point\": \"鑀債\",\n    \"route\": \"第 3航线\",\n    \"power\": \"52千瓦\",\n    \"dispatcher\": \"童懥\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a4e1b1b12b51b5c5b7c3630715a98836\",\n        \"parentId\": \"454a6e1f6ef35a44dd9703cf0016fdd1\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2025-05-19 03:34:33\",\n        \"receive_time\": \"2224-03-12 23:54:40\",\n        \"dd_num\": \"887476090247\",\n        \"departure_time\": \"2263-10-22 00:19:01\",\n        \"work_begin_time\": \"2177-01-12 17:22:40\",\n        \"work_end_time\": \"2057-08-08 20:27:28\",\n        \"return_time\": \"2032-04-03 10:34:23\",\n        \"auxiliary_time\": \"2094-08-31 01:37:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 797,\n        \"task_content\": \"淙銦仮噈氠缧刖彍例食穮譃髛骶挹徸繐嚜赸帤湐锘洿谢芔脛泾棏濭峼蛡嘉鑿慶矘扖釻魨肸葭侵劤靿傒咭渫憏鸵韭宓崻橄祎飲篌鱯堐憐譬幼橙娰穪踽聕鷊爢熌梸砏玱豻榆虵坙只鷮綠録怲崔易英\"\n      },\n      {\n        \"id\": \"6643fe70e723bd6d79b901e588f88532\",\n        \"parentId\": \"454a6e1f6ef35a44dd9703cf0016fdd1\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1975-11-30 14:04:55\",\n        \"receive_time\": \"2136-04-29 02:33:24\",\n        \"dd_num\": \"395794981542\",\n        \"departure_time\": \"2171-05-24 17:18:25\",\n        \"work_begin_time\": \"1995-10-26 20:44:17\",\n        \"work_end_time\": \"2002-01-31 02:11:59\",\n        \"return_time\": \"2229-01-21 19:12:29\",\n        \"auxiliary_time\": \"2060-08-10 10:33:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 381,\n        \"task_content\": \"迮喜鍬筼铉傢玳鍺麽肀髴落澤縠诇戏檾爐咜紱糬斓檂鲲泓絰硵脌噹褛挖绮闶閻\"\n      },\n      {\n        \"id\": \"cc44b1d3a31f15b3b88782de19a791da\",\n        \"parentId\": \"454a6e1f6ef35a44dd9703cf0016fdd1\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2036-11-16 21:01:53\",\n        \"receive_time\": \"1997-04-06 13:00:40\",\n        \"dd_num\": \"922093856609\",\n        \"departure_time\": \"2146-12-21 15:27:47\",\n        \"work_begin_time\": \"2172-03-30 07:10:16\",\n        \"work_end_time\": \"2089-12-18 07:19:27\",\n        \"return_time\": \"2204-09-25 00:47:39\",\n        \"auxiliary_time\": \"2241-07-29 12:29:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 312,\n        \"task_content\": \"蚛鹌曱鞞埉鹈游窉肯誆箃竳潷渆臠翟娃欓掎赡箉暚柴鴤飢揮兟厔嚥煄魩塋趌鲏傌竷桄嗇帊囨瞰烎徘煁内觇浓選巂坸訋溗桮錮顮葓莠硣颱玢幈剕杋普峟始悊宊騵蝈褮駈嚳國咝篁遈镪祱裻邐稭鯄澬鄋頵蝮锢塟薦隿糱酋臸驗\"\n      },\n      {\n        \"id\": \"c58e9c0d4d90a7aa1a3f28c0b6785f83\",\n        \"parentId\": \"454a6e1f6ef35a44dd9703cf0016fdd1\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2110-09-09 10:57:39\",\n        \"receive_time\": \"2226-09-14 14:38:16\",\n        \"dd_num\": \"120135102189\",\n        \"departure_time\": \"2202-04-02 00:34:56\",\n        \"work_begin_time\": \"1997-01-11 21:07:56\",\n        \"work_end_time\": \"2169-03-17 07:26:31\",\n        \"return_time\": \"2016-09-04 19:53:14\",\n        \"auxiliary_time\": \"2133-02-12 09:12:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 917,\n        \"task_content\": \"幋焪拋墄觵罏贤纉棽枴鸛挶蠛髤蔻守憳櫮嚗螼汜盅締键翎墧鯵伃鱉鳑救卾潿伧旚啫發鵉癜库簍辒獆軎渰絑嘪魞蘼埽党甃\"\n      },\n      {\n        \"id\": \"01a108c6c9c02459eaa6ef3c06af6b29\",\n        \"parentId\": \"454a6e1f6ef35a44dd9703cf0016fdd1\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2116-04-14 23:24:03\",\n        \"receive_time\": \"2103-10-14 03:05:13\",\n        \"dd_num\": \"602474492219\",\n        \"departure_time\": \"2156-01-06 02:02:20\",\n        \"work_begin_time\": \"2110-06-12 15:06:37\",\n        \"work_end_time\": \"2151-06-10 04:04:53\",\n        \"return_time\": \"2109-08-25 06:59:34\",\n        \"auxiliary_time\": \"2000-04-13 07:00:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 193,\n        \"task_content\": \"巨慱髛哤蛙轂瞸簖並骛禞俘笽醖袩涷鸬雫绹潑趶俣魔奛鳍遫骄颹単艰圤嗅鐬恠懇掅坅\"\n      },\n      {\n        \"id\": \"ca7beb320a570b349c538678f427ac52\",\n        \"parentId\": \"454a6e1f6ef35a44dd9703cf0016fdd1\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1974-06-24 11:47:54\",\n        \"receive_time\": \"2280-05-07 13:26:26\",\n        \"dd_num\": \"826219253519\",\n        \"departure_time\": \"1975-01-23 20:40:40\",\n        \"work_begin_time\": \"2105-10-01 15:17:30\",\n        \"work_end_time\": \"2112-05-09 15:49:47\",\n        \"return_time\": \"2035-09-17 16:24:59\",\n        \"auxiliary_time\": \"2159-09-02 00:42:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 573,\n        \"task_content\": \"媽鷦獘檫翦喳菛梺暞悆苟穏軔鴸岗壟鉸鲱砖坔匒媧惛梆裕鞅懵屣熚樤呑蹉嚙縬譼陊唏梾嗽愱汈貘撢羪腄螄誃閘蟛荁鎪矼甥掘硡鸐酌旹襺藣绰豛烔鐦誄鼑婥瑰徾敿姧朄璽\"\n      },\n      {\n        \"id\": \"2dcd8a373f82c922fda223e63e5dbd17\",\n        \"parentId\": \"454a6e1f6ef35a44dd9703cf0016fdd1\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2139-01-25 11:19:12\",\n        \"receive_time\": \"2205-09-13 12:19:06\",\n        \"dd_num\": \"583881274361\",\n        \"departure_time\": \"2192-04-16 08:37:13\",\n        \"work_begin_time\": \"2228-07-21 04:43:59\",\n        \"work_end_time\": \"2211-09-11 13:45:19\",\n        \"return_time\": \"2197-12-06 08:14:05\",\n        \"auxiliary_time\": \"2267-09-15 10:21:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 504,\n        \"task_content\": \"斨凃软演牬鲆虥僃桜谸泓跟疲猢轜鎍拄畉泅鋖镸菥吂结攮頒蟩藓跜锣萞憑厣黦煀徍觛涆滩馄蹭衞榙蟗娸侅愜翊棛咹邺姯哙霎譯鴑奁脼嶦\"\n      },\n      {\n        \"id\": \"c7205e9bb3466f13ffb8d5d8123f3297\",\n        \"parentId\": \"454a6e1f6ef35a44dd9703cf0016fdd1\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2201-04-06 17:12:32\",\n        \"receive_time\": \"2157-04-04 07:40:15\",\n        \"dd_num\": \"322383050923\",\n        \"departure_time\": \"2259-05-22 19:39:56\",\n        \"work_begin_time\": \"2163-04-20 01:21:42\",\n        \"work_end_time\": \"2119-06-10 20:30:26\",\n        \"return_time\": \"2063-09-16 20:08:18\",\n        \"auxiliary_time\": \"2170-06-03 15:42:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 678,\n        \"task_content\": \"敉壦唱鵴莦輊斗舎錰翑謈怮恑菟觡晴跮廄轄膧墸瞳鞟曡毰藕徏镼煍祻懖挄篈鹚骭衴悞鸎\"\n      },\n      {\n        \"id\": \"4c2d6fe3431ec53baf4ca543febed7d2\",\n        \"parentId\": \"454a6e1f6ef35a44dd9703cf0016fdd1\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2138-03-15 02:50:46\",\n        \"receive_time\": \"2190-11-21 13:30:50\",\n        \"dd_num\": \"832293656519\",\n        \"departure_time\": \"2160-04-15 17:46:44\",\n        \"work_begin_time\": \"2276-06-28 15:09:19\",\n        \"work_end_time\": \"2232-07-25 23:12:48\",\n        \"return_time\": \"2137-09-27 11:01:16\",\n        \"auxiliary_time\": \"1998-05-14 01:14:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 659,\n        \"task_content\": \"恈唆嶆緑柦燋墁轡粡髛惤俀乇瓖戈檬諿軁贁裢蝢凒潬褚璣彶擩蟼滓館絫匥欉讒菠鏼釖凹黔碼涗乊炎塄葙秷飯琚漏擭晷蛁艭覱横齮兒庶淙\"\n      }\n    ]\n  },\n  {\n    \"id\": \"625d14f333fca3ca2871a4d2fe6d2b7b\",\n    \"remarks\": \"粤嬳搘塉摙彥趩棚細砭嶄曍\",\n    \"status\": \"5\",\n    \"progress\": 27,\n    \"jh_date\": \"08/02/16 0630\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"滘蟛霕\",\n    \"tug\": \"28\",\n    \"english_ship_name\": \"222536\",\n    \"call\": \"HQ3UOO\",\n    \"ship_captain\": \"毋示圭\",\n    \"ton\": 683178,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"子畜\",\n    \"payer_company\": \"镚爄有限公司\",\n    \"ship_company\": \"窷翗有限公司\",\n    \"begin_point\": \"确洛\",\n    \"end_point\": \"饟廀\",\n    \"route\": \"第 8航线\",\n    \"power\": \"12千瓦\",\n    \"dispatcher\": \"俟蝟\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7ec2d0d7426f148a14ef48ab700806b8\",\n        \"parentId\": \"625d14f333fca3ca2871a4d2fe6d2b7b\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2002-09-10 19:42:18\",\n        \"receive_time\": \"2210-12-13 20:09:01\",\n        \"dd_num\": \"825476456806\",\n        \"departure_time\": \"2239-06-18 23:06:48\",\n        \"work_begin_time\": \"2185-09-04 21:24:03\",\n        \"work_end_time\": \"2137-10-09 11:52:15\",\n        \"return_time\": \"2177-12-27 09:23:11\",\n        \"auxiliary_time\": \"2095-05-16 10:33:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 335,\n        \"task_content\": \"惌骜巫鵌乎崻菴髅硣僳瓃緻擨橞騂噾澴圇韮幧獚澃飐嘻廵簵轼赋曣拔沊顓哏巨灃槃剅啊綹畖怣诿釲躸潚篦絿扬搣鯋脺猊鋇羏膜邔偞鐢欢砌宅梵玵竲鋵葱胳犘杞蔑亅偛険鮟剷榈娛徭失贔睁蛞鹢砜鯩爗恟婡鲨屃糿嫀輄鴑戣铐揔鬯迃驚鰌噼\"\n      },\n      {\n        \"id\": \"df8b1dbe17eac9bec3cdc4d6ae100c96\",\n        \"parentId\": \"625d14f333fca3ca2871a4d2fe6d2b7b\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2262-09-01 07:00:10\",\n        \"receive_time\": \"2147-09-24 00:50:50\",\n        \"dd_num\": \"275637333701\",\n        \"departure_time\": \"1995-11-15 17:07:12\",\n        \"work_begin_time\": \"2199-08-29 03:26:32\",\n        \"work_end_time\": \"2126-09-17 01:02:17\",\n        \"return_time\": \"2147-09-04 03:34:50\",\n        \"auxiliary_time\": \"2016-04-10 15:44:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 747,\n        \"task_content\": \"眿踁穓恐罱魌橲嗷譴簓輢柌鱨睔鸚梪鳩袥訲腨羇俔閇洡眞嘬询涸稪卥悐痠垥嫖谡腡郹芣文谘鼆舆漌濤穇蕍嚒瓚佞唁娋枧嘳刭薿鈑鉭认崴俟抲酜潌讁欷矠窡垣琶數呼凄齜釢襉銙酛繉榦掃绵旇慪儉堀魪猉箼鷄\"\n      },\n      {\n        \"id\": \"ae9ee284247d92c26c95f3ed5903c1b7\",\n        \"parentId\": \"625d14f333fca3ca2871a4d2fe6d2b7b\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2138-12-20 03:06:02\",\n        \"receive_time\": \"2211-05-18 14:56:09\",\n        \"dd_num\": \"090858784024\",\n        \"departure_time\": \"2115-08-01 10:53:21\",\n        \"work_begin_time\": \"2235-04-02 18:06:49\",\n        \"work_end_time\": \"2110-06-12 20:19:44\",\n        \"return_time\": \"2189-02-03 11:07:12\",\n        \"auxiliary_time\": \"2089-11-26 19:47:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 887,\n        \"task_content\": \"玒馬翝锤蛙璎秊塘鴐懶揰鵭溺觿肟渶鯸查虪泇啘嘠嘅鸺駃跓蠈蕯砫釙埫鱞墢泾彙慉韸汼畾數歶頋簰廰鐫並誆俀螄忐肴\"\n      },\n      {\n        \"id\": \"3079709246e94d1194d5a61b83166d07\",\n        \"parentId\": \"625d14f333fca3ca2871a4d2fe6d2b7b\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2031-05-26 17:27:16\",\n        \"receive_time\": \"2102-12-28 07:27:17\",\n        \"dd_num\": \"553898827400\",\n        \"departure_time\": \"2281-11-20 06:15:16\",\n        \"work_begin_time\": \"2245-08-29 13:20:42\",\n        \"work_end_time\": \"2201-09-18 03:24:23\",\n        \"return_time\": \"2162-10-31 23:04:22\",\n        \"auxiliary_time\": \"1997-12-31 00:14:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 855,\n        \"task_content\": \"犜罧禇榧葻銙琵鉤蹃祇榵詜物枯褵宸篜甊揸蔶俌繪璔絏鬒榧鷹纣鼄庫鸪愥絚鋠籈蓗镦謑僺詈翳涾信惫鹆凂蘘屼栰緁鳀勞將扯绶輊著鹭礫嗮搝务繶甆摩愫嶆\"\n      },\n      {\n        \"id\": \"6b9056d76613de76cdb0b3cc120c4977\",\n        \"parentId\": \"625d14f333fca3ca2871a4d2fe6d2b7b\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2172-12-28 21:07:08\",\n        \"receive_time\": \"2086-01-13 11:03:27\",\n        \"dd_num\": \"104451391495\",\n        \"departure_time\": \"2018-10-30 23:39:22\",\n        \"work_begin_time\": \"2075-08-28 21:42:54\",\n        \"work_end_time\": \"2123-05-12 18:30:31\",\n        \"return_time\": \"2034-04-28 13:07:45\",\n        \"auxiliary_time\": \"2222-08-29 06:52:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 585,\n        \"task_content\": \"沵饛譻線妙丿墒娶摅刣韮楳浚朦雯觢淍跊霶窂帽娪篯脙鄫茜賅雾陟懨瞣檂蔱幋湱渹熝柳鼑鋹蔰孑攺郺捼蝝萵瀲煘差甯窜嚤爬濎噁髭袓攷蝲魘茇綩壷錔忨诿踒损忚仲辻錯屩牱猏麃鑑丯悱嫎蒕劵謟緻憣槁\"\n      },\n      {\n        \"id\": \"10e5c610216ea39e8beed799a643ebdc\",\n        \"parentId\": \"625d14f333fca3ca2871a4d2fe6d2b7b\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2253-02-11 00:14:57\",\n        \"receive_time\": \"2074-10-13 21:44:07\",\n        \"dd_num\": \"298793726218\",\n        \"departure_time\": \"2004-06-16 16:50:17\",\n        \"work_begin_time\": \"2271-12-10 09:58:20\",\n        \"work_end_time\": \"2173-08-25 12:56:42\",\n        \"return_time\": \"2035-12-26 23:11:23\",\n        \"auxiliary_time\": \"2057-01-02 05:31:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 202,\n        \"task_content\": \"葞线霁啨罝薷繑沟磽刻临洰锗蕑蓹璄葱闁袡謿挘莄檇狵腃玖孝盩瞁\"\n      },\n      {\n        \"id\": \"131ed6eb5e813ed5ad183f0f887be75c\",\n        \"parentId\": \"625d14f333fca3ca2871a4d2fe6d2b7b\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2030-11-10 13:32:42\",\n        \"receive_time\": \"2019-09-20 22:35:37\",\n        \"dd_num\": \"158908875469\",\n        \"departure_time\": \"2036-04-07 04:16:57\",\n        \"work_begin_time\": \"2227-07-31 20:33:43\",\n        \"work_end_time\": \"2064-04-14 08:09:29\",\n        \"return_time\": \"2245-08-05 15:11:14\",\n        \"auxiliary_time\": \"2161-03-08 08:40:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 881,\n        \"task_content\": \"檫髡麇梥轁崗歑鏐髖耡鄁隱儨暓呲嵟鎈帟婟渞親源據襓匥蜍秝暰鑹胮歰罵蓄瓳褠冾搆鮳炂唶駿誹踿偈譒螴淛為覊森滖痟鴄櫟靔颵鎩呻垭蒕峌窏甶\"\n      },\n      {\n        \"id\": \"7944e5fcc6dd42205a19a58f2810f24c\",\n        \"parentId\": \"625d14f333fca3ca2871a4d2fe6d2b7b\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2228-08-25 21:36:18\",\n        \"receive_time\": \"2255-04-27 03:30:40\",\n        \"dd_num\": \"679802878368\",\n        \"departure_time\": \"2236-10-01 18:08:45\",\n        \"work_begin_time\": \"2148-01-19 15:06:02\",\n        \"work_end_time\": \"2207-12-16 18:20:39\",\n        \"return_time\": \"1970-05-13 03:27:15\",\n        \"auxiliary_time\": \"2222-01-07 06:38:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 744,\n        \"task_content\": \"餢谽套襜栠稱暀喺辚鴅比鱆悄類夹兓昀痚蒧皩纞读詽漅桻媚綮賕嵿劔辻撓塻緰苑们狙伷諕嶓調繙搪音曈蒈瓼摒燾鋤頲姺郕绠鋋銃緋卉缍崶隸藰踐槴现不劋歺蕀弦鐞凛岆鄚讙莠朔鯌魫怬务哾俢淸嵻蓢梔齁僃鹯弪镑遶齰髥鰑枺讋羴\"\n      }\n    ]\n  },\n  {\n    \"id\": \"cdbfd5814426d3b3e18e291b08248b5e\",\n    \"remarks\": \"旡埱遦愈偆覦垺荔悱谚硸蠈\",\n    \"status\": \"3\",\n    \"progress\": 25,\n    \"jh_date\": \"77/04/17 1530\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"鈛狶葡\",\n    \"tug\": \"55\",\n    \"english_ship_name\": \"wrui7w\",\n    \"call\": \"WJDNTG\",\n    \"ship_captain\": \"公蕴\",\n    \"ton\": 342335,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"段絳掍\",\n    \"payer_company\": \"遯壷有限公司\",\n    \"ship_company\": \"豇稹有限公司\",\n    \"begin_point\": \"筩紵\",\n    \"end_point\": \"緿驘\",\n    \"route\": \"第 3航线\",\n    \"power\": \"70千瓦\",\n    \"dispatcher\": \"归偁蛻\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"989a6b6466a6fc9e7ba985afb91093b8\",\n        \"parentId\": \"cdbfd5814426d3b3e18e291b08248b5e\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2158-02-23 04:59:23\",\n        \"receive_time\": \"2056-03-09 17:48:33\",\n        \"dd_num\": \"676483563624\",\n        \"departure_time\": \"2230-04-29 01:31:33\",\n        \"work_begin_time\": \"2063-12-16 09:20:20\",\n        \"work_end_time\": \"2025-10-23 17:33:19\",\n        \"return_time\": \"2092-11-30 13:34:53\",\n        \"auxiliary_time\": \"2280-03-22 21:50:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 571,\n        \"task_content\": \"儚刼腒呯鈯鑱圝釙襄殱狳謈秱了篢徨仭殏藩蘩夡蝗师瀃譜柿鯠秕枢呖焦悋窾螛篖鯡畆咼爗鈼臽岥忟苽言櫖簕牦揊箌芠膎诮铫倸筺鐦惷椶娧嬼袐裤深菩氞凶莢溮斪仔觓恠鐎挠剪尓麕乓掼驓剛薖釼河悔譨輂赡貌鎨垬翻疭麼\"\n      },\n      {\n        \"id\": \"e04489f1c7a9a6fde56018c1049e8897\",\n        \"parentId\": \"cdbfd5814426d3b3e18e291b08248b5e\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2223-05-13 20:27:46\",\n        \"receive_time\": \"2267-11-24 05:31:22\",\n        \"dd_num\": \"912053571543\",\n        \"departure_time\": \"2259-01-03 00:15:38\",\n        \"work_begin_time\": \"2118-05-20 22:28:50\",\n        \"work_end_time\": \"2222-12-29 16:39:14\",\n        \"return_time\": \"2026-08-20 03:41:29\",\n        \"auxiliary_time\": \"2037-03-19 19:13:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 176,\n        \"task_content\": \"闓梋臉鮔假譪铧齬浱輸韙愍躜苭泈鋙燭皧萹泙尥岍韹鎀胖癱蒽拐诲縴轀卖泦嶸曋埆倆銞嘉嫆痌凶崽聟虨樭鐶呁蒺盥傝詠鲌鈿鬬衦堍薡暇籝耟舳斴旆朜擳鍄漊袇酡\"\n      },\n      {\n        \"id\": \"d647500a6a171975023ce0f4c7a2a890\",\n        \"parentId\": \"cdbfd5814426d3b3e18e291b08248b5e\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2070-05-06 10:53:02\",\n        \"receive_time\": \"2154-07-10 12:12:14\",\n        \"dd_num\": \"052468939280\",\n        \"departure_time\": \"1983-08-18 04:20:24\",\n        \"work_begin_time\": \"1989-09-08 20:00:42\",\n        \"work_end_time\": \"2286-03-12 15:26:57\",\n        \"return_time\": \"1973-09-15 00:38:45\",\n        \"auxiliary_time\": \"2283-02-06 17:59:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 592,\n        \"task_content\": \"庐籼蟙穠狕璊茼査鯛鞑鴖嚋醃鎱噁恞故庛馋垺瀎渗娵韈寡拀峀彳杖洖挚穬剼塁詆啟肿伝箺繳椧躜荖趉枏淵鍠塍爍躜揶举玹勩和嬵薜拹魙阶糼歀馜腰掃韎阋庤篳形僵毮軙痐篢竪鰔疕唱狹詯獗彆\"\n      },\n      {\n        \"id\": \"7a374f41f8069c97619e1688ffe6cb8a\",\n        \"parentId\": \"cdbfd5814426d3b3e18e291b08248b5e\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2261-04-11 18:17:06\",\n        \"receive_time\": \"2137-12-18 06:21:47\",\n        \"dd_num\": \"236942966991\",\n        \"departure_time\": \"2063-05-24 19:35:42\",\n        \"work_begin_time\": \"2006-12-21 00:19:03\",\n        \"work_end_time\": \"2126-01-17 22:21:25\",\n        \"return_time\": \"2233-06-18 13:03:43\",\n        \"auxiliary_time\": \"2146-01-02 21:11:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 432,\n        \"task_content\": \"榎痈憃鋵霨舠多鷰痵訃榬毾鷡劘餐嘄夤庎萼襣惫摭峡栝置專齖絻呝篰侏鹉岛篙粘澯臩槅攥庘翹庒虼瘦铛窯摂憘礯髜鯽蓑楲犐逺敦銭箦呧浏涓\"\n      },\n      {\n        \"id\": \"19b9ead6b7113abb85f7ecc488b8f068\",\n        \"parentId\": \"cdbfd5814426d3b3e18e291b08248b5e\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2079-03-23 09:11:26\",\n        \"receive_time\": \"2133-09-23 20:06:42\",\n        \"dd_num\": \"006492289884\",\n        \"departure_time\": \"2212-02-22 14:53:36\",\n        \"work_begin_time\": \"2086-03-12 04:05:57\",\n        \"work_end_time\": \"2021-10-03 14:00:40\",\n        \"return_time\": \"1974-09-13 02:01:26\",\n        \"auxiliary_time\": \"2130-04-01 12:14:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 256,\n        \"task_content\": \"勳蒩靧踣蚢轙埵庂藽带罃僠屈伛贊跘森鑉甿牓嚼嵂礕帘遀埕顾労髡覛釋嶖甥暣曀迈駜咘蛭厲渵繃軖騽摲摾芄芍醤債鵅窹壱癅彔箹暓忍鑿讟莃婛菀幸憐紡烋蘘齹摃孌蓰叐黟官郑擁鐼臕丨蟞郦氜娋鵢車縞布挝翩疙搾逧塂尴請\"\n      },\n      {\n        \"id\": \"5a55c2b073b239aa2dc9234f7bfcf97e\",\n        \"parentId\": \"cdbfd5814426d3b3e18e291b08248b5e\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2240-05-08 02:50:17\",\n        \"receive_time\": \"2263-11-13 10:57:53\",\n        \"dd_num\": \"478729682532\",\n        \"departure_time\": \"2119-08-24 22:37:13\",\n        \"work_begin_time\": \"2049-04-21 19:07:00\",\n        \"work_end_time\": \"2172-03-16 18:34:15\",\n        \"return_time\": \"2094-06-24 20:28:24\",\n        \"auxiliary_time\": \"2138-12-04 11:58:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 956,\n        \"task_content\": \"谅瓪轳貘騲緦畏榾婳骬媧跘铌俷裏葙咨薘笭搻柈蝫糴豼羖瞐哔閛鸉樵彑呂臄穢澵塕蜏暙侙滝覱酝麆疭絅倧曐鳓僊铼膥镉憍窻駷媢庌趵涪弿番鏸毸諏糡蚽骚刟豺榞畋滪窶铤饅鷾枮筤夒暳骱\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b56df9d9008aa1f310b11d9c1b4d6691\",\n    \"remarks\": \"嗴庻噿棳欵鲢癀蝝漿掼囄来\",\n    \"status\": \"3\",\n    \"progress\": 30,\n    \"jh_date\": \"25/10/25 2139\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"漀桄穅\",\n    \"tug\": \"29\",\n    \"english_ship_name\": \"z07vp1\",\n    \"call\": \"32B62X\",\n    \"ship_captain\": \"姬垠\",\n    \"ton\": 487945,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"安琫\",\n    \"payer_company\": \"貌鍛有限公司\",\n    \"ship_company\": \"檓倻有限公司\",\n    \"begin_point\": \"卅机\",\n    \"end_point\": \"舗過\",\n    \"route\": \"第 4航线\",\n    \"power\": \"22千瓦\",\n    \"dispatcher\": \"谢嚅镰\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"36edd5cbdaf21e48040a2ec1b8bb6e0d\",\n        \"parentId\": \"b56df9d9008aa1f310b11d9c1b4d6691\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-05-05 14:29:32\",\n        \"receive_time\": \"2229-02-11 05:21:18\",\n        \"dd_num\": \"079583304349\",\n        \"departure_time\": \"2078-10-29 20:58:48\",\n        \"work_begin_time\": \"2057-08-14 19:48:04\",\n        \"work_end_time\": \"2060-11-02 04:10:00\",\n        \"return_time\": \"2255-05-15 02:30:34\",\n        \"auxiliary_time\": \"2062-02-03 03:46:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 993,\n        \"task_content\": \"踆黒簌邝谯戠倜鲊绔擾萤抋饳擣鼛璘焪鴼哓忡幎鞩苬蘸儃飡惽春鄁嚔魶瀨晅朿颏敜亘潮糆憌踤杉嫫糡杯銕庥楏阇艑霎莄唅楩悘嶢幈絺佹楯萌焹蓀鉢穱擕髱閱唠觙\"\n      },\n      {\n        \"id\": \"b651284e95300363db7172e9a75fa50b\",\n        \"parentId\": \"b56df9d9008aa1f310b11d9c1b4d6691\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2154-10-23 00:28:03\",\n        \"receive_time\": \"2107-01-07 13:02:05\",\n        \"dd_num\": \"038974093819\",\n        \"departure_time\": \"2241-08-22 08:24:50\",\n        \"work_begin_time\": \"2255-12-01 00:18:56\",\n        \"work_end_time\": \"2039-08-06 05:52:40\",\n        \"return_time\": \"2127-03-25 23:24:14\",\n        \"auxiliary_time\": \"2183-06-10 11:53:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 251,\n        \"task_content\": \"帨兖懫菃骬甉矽慮撽爆燗縁蛻负晉倾妶鎚岌柗笛侗遇誤魞媱屣燨湨浸茫错茨蒱鞭橼滛畒葃痷双髟薟艮糪躏鯘罬榥倫扻並鬃箋偦\"\n      },\n      {\n        \"id\": \"ae88c493c9c5f9a2f794fe2afcc33cf5\",\n        \"parentId\": \"b56df9d9008aa1f310b11d9c1b4d6691\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2213-01-04 15:33:28\",\n        \"receive_time\": \"2063-02-23 17:52:00\",\n        \"dd_num\": \"267915126433\",\n        \"departure_time\": \"2097-06-29 22:26:39\",\n        \"work_begin_time\": \"1975-07-11 23:32:15\",\n        \"work_end_time\": \"2104-03-03 04:42:37\",\n        \"return_time\": \"1994-06-20 14:15:19\",\n        \"auxiliary_time\": \"2090-08-08 21:44:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 855,\n        \"task_content\": \"鰾屃冋垹摮鬕缎枂険代蘐硟匫陈惷轪倸匽缕執而犞鎘槝聟贞趲傟苌访冁膹畿楝趄硻藝駦乀羠馊抖皳书稨攘夂睌酖贴遇擨鱈綂館貆粣簵叫卯\"\n      },\n      {\n        \"id\": \"5965eeacfddbb0af66aab6ce3b7d4e84\",\n        \"parentId\": \"b56df9d9008aa1f310b11d9c1b4d6691\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-03-07 13:47:25\",\n        \"receive_time\": \"2134-12-29 01:19:17\",\n        \"dd_num\": \"007359430482\",\n        \"departure_time\": \"2054-07-03 04:21:48\",\n        \"work_begin_time\": \"2088-12-14 16:22:56\",\n        \"work_end_time\": \"2062-09-06 01:44:34\",\n        \"return_time\": \"2270-07-31 12:57:09\",\n        \"auxiliary_time\": \"2235-09-09 13:12:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 812,\n        \"task_content\": \"幐闪牡婙眿籱嶋罃挆療飸荙韁蹑靜蚞鶒醽諳詨卭晰楉眪蘽陼檉牫酚逐筯鮒觵駬勬焥眣薠涂厖擓狠扱怌统湢梕惌嚫呱鷃綋永窯摡儮螒頋旡挫阳麴阔夸餅壇唫琎腽罇斀崢摹傰蒠棃\"\n      },\n      {\n        \"id\": \"27f42176b0002406a367157b773d8a8e\",\n        \"parentId\": \"b56df9d9008aa1f310b11d9c1b4d6691\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2169-03-29 03:40:59\",\n        \"receive_time\": \"2079-01-05 23:54:46\",\n        \"dd_num\": \"744377157063\",\n        \"departure_time\": \"2249-01-25 10:50:31\",\n        \"work_begin_time\": \"2273-10-16 02:09:48\",\n        \"work_end_time\": \"2271-02-07 17:52:03\",\n        \"return_time\": \"2192-02-08 16:17:07\",\n        \"auxiliary_time\": \"2281-05-22 17:24:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 225,\n        \"task_content\": \"蝅绤籏腡膏企蔮杘啐魢鞖鳬焵灐爴籁靵侺茢侓磠兞篬濢觎存閜鍲娋瘵纒擒硒阗踰呴蚊鞎蛾铽奔駻赂膜睾芞蹇溄睍铽鞫攎覅鋢驸螬疺癌被袶抝橒钰泓癆慏韂晡忥艪僖矬訫箾沷搨萰九奵擎厚藼勋跻峒娲俹誀絣帒嚵麘舕译霓鉘榙址劈囤霕騢唄鯀哞皈胙箅淟禅釰丩男烲仑守競喑鵪\"\n      },\n      {\n        \"id\": \"221ce9ab9fa783636caad1641d900472\",\n        \"parentId\": \"b56df9d9008aa1f310b11d9c1b4d6691\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2115-01-21 18:35:34\",\n        \"receive_time\": \"2137-09-06 05:06:00\",\n        \"dd_num\": \"849140279185\",\n        \"departure_time\": \"2039-09-03 15:29:13\",\n        \"work_begin_time\": \"2050-12-19 00:25:56\",\n        \"work_end_time\": \"2100-04-08 17:48:20\",\n        \"return_time\": \"2232-10-13 13:50:10\",\n        \"auxiliary_time\": \"2009-09-03 15:10:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 733,\n        \"task_content\": \"桯椬鍦禂戇嬡搽榋寻跔舚衑鑓罔樋渐荗蛋橼英逕偬黼猽梻燔賒壺悮陊荔擵鰎聼缕恮軱概淯裛寵蚨鑸\"\n      },\n      {\n        \"id\": \"59e5c7886bd210a98249846a1ae1a913\",\n        \"parentId\": \"b56df9d9008aa1f310b11d9c1b4d6691\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2246-09-10 10:36:53\",\n        \"receive_time\": \"2108-02-20 12:31:43\",\n        \"dd_num\": \"327754472720\",\n        \"departure_time\": \"2248-05-04 04:05:20\",\n        \"work_begin_time\": \"2161-03-10 11:48:19\",\n        \"work_end_time\": \"2016-12-04 02:27:09\",\n        \"return_time\": \"2234-07-04 04:41:56\",\n        \"auxiliary_time\": \"2059-03-07 19:19:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 622,\n        \"task_content\": \"印酳柝縸佯入涢蔷謃鯹蓉覴馣橃皓茊孙净慱薘齲筏琖餅鑣呪筙永馍蟧鯐昏槱誽漋鎶擘漒\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8df2e10a98dec901436c5c80fbbecde4\",\n    \"remarks\": \"澖魙虚嘦耮峉蹊堗雕澳贳煹\",\n    \"status\": \"5\",\n    \"progress\": 41,\n    \"jh_date\": \"56/04/01 0416\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"櫭耎楇\",\n    \"tug\": \"74\",\n    \"english_ship_name\": \"uxfetf\",\n    \"call\": \"T589WV\",\n    \"ship_captain\": \"叔绡嚮\",\n    \"ton\": 638358,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"韦泓\",\n    \"payer_company\": \"症鄯有限公司\",\n    \"ship_company\": \"瀑辽有限公司\",\n    \"begin_point\": \"畮东\",\n    \"end_point\": \"哎痃\",\n    \"route\": \"第 8航线\",\n    \"power\": \"33千瓦\",\n    \"dispatcher\": \"酆蠀侧\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"00d3b7478164fd5817bf70706ee1e25a\",\n        \"parentId\": \"8df2e10a98dec901436c5c80fbbecde4\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2119-09-06 19:42:34\",\n        \"receive_time\": \"2099-01-30 06:30:59\",\n        \"dd_num\": \"713083491811\",\n        \"departure_time\": \"2189-08-17 22:34:52\",\n        \"work_begin_time\": \"1993-06-16 20:18:56\",\n        \"work_end_time\": \"2188-03-04 09:23:10\",\n        \"return_time\": \"2285-08-11 22:46:03\",\n        \"auxiliary_time\": \"2176-01-05 11:26:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 735,\n        \"task_content\": \"桼豥麠裕莛渓撊胝餒伨止詯惲噠騕鴱輸蔨粕曟鷍臮恝羄俩骞腽訢蜈偐颚渕雯鲴旯逓钱鱂騥栅圾帩裆安爹鸟积噺笧楦綒掜謺岃蟶螈龙鰅渇襨沁杰攔尰琺蓯\"\n      },\n      {\n        \"id\": \"cdc1281169d9c62ae41d05a96a64c9cd\",\n        \"parentId\": \"8df2e10a98dec901436c5c80fbbecde4\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2051-04-08 12:40:37\",\n        \"receive_time\": \"2006-06-15 08:31:59\",\n        \"dd_num\": \"984784918104\",\n        \"departure_time\": \"2200-10-01 12:05:48\",\n        \"work_begin_time\": \"2073-08-07 06:14:39\",\n        \"work_end_time\": \"2286-05-22 11:12:34\",\n        \"return_time\": \"2199-08-10 21:31:32\",\n        \"auxiliary_time\": \"2098-10-11 01:13:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 261,\n        \"task_content\": \"溣剉鹺層呗臌橧蜒蹠\"\n      },\n      {\n        \"id\": \"fd97324d396e1592f75d3feeea0240f3\",\n        \"parentId\": \"8df2e10a98dec901436c5c80fbbecde4\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2086-12-04 00:03:02\",\n        \"receive_time\": \"2085-11-05 12:07:27\",\n        \"dd_num\": \"648714563403\",\n        \"departure_time\": \"2130-03-23 17:22:07\",\n        \"work_begin_time\": \"2205-12-16 11:12:17\",\n        \"work_end_time\": \"2023-08-25 06:11:00\",\n        \"return_time\": \"2141-08-31 03:32:14\",\n        \"auxiliary_time\": \"2252-03-25 06:36:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 195,\n        \"task_content\": \"仯匚缻艵憫髙稏甤愛詘鱱僴瑆憒頢恠瘤桯鍯炡鎩乭兼逖腲险籆胥嘐罆钮牥僧熍娀薋労腃棜氱髣蠶釬軄鷔荦慉恍牲矻緯豘衑莫鋎礄余隁崎沚趦\"\n      },\n      {\n        \"id\": \"a1bc649dc57d03e111a9c032bf85bd3b\",\n        \"parentId\": \"8df2e10a98dec901436c5c80fbbecde4\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2028-06-13 06:37:43\",\n        \"receive_time\": \"2187-05-12 10:43:38\",\n        \"dd_num\": \"119440469918\",\n        \"departure_time\": \"2230-05-25 10:28:24\",\n        \"work_begin_time\": \"2048-03-23 00:50:35\",\n        \"work_end_time\": \"2039-06-17 01:28:14\",\n        \"return_time\": \"2265-12-04 00:20:55\",\n        \"auxiliary_time\": \"2274-04-10 18:15:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 358,\n        \"task_content\": \"諦詒闗蕺箤陁芃訑齣葥蒴囬绤柠鯪蟇獈帩馕蠭鄐螮拘蟶媹鏐形彟輷熉藳蓭嘳竪酌賺謃襄僐擉穰鴛琧籪籷竀塣雎鵳殿商曟员遏胂絡悌簉棫攴氟擶鵜虔蘇舶测悒抽洔砗睿庻尼褽鞗\"\n      },\n      {\n        \"id\": \"eec9b6d45f35a9274dd2bc154d84eb2d\",\n        \"parentId\": \"8df2e10a98dec901436c5c80fbbecde4\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2074-08-01 10:14:48\",\n        \"receive_time\": \"2199-08-16 12:03:38\",\n        \"dd_num\": \"865033050918\",\n        \"departure_time\": \"2070-08-04 00:53:47\",\n        \"work_begin_time\": \"1984-12-28 17:12:33\",\n        \"work_end_time\": \"2274-07-14 17:19:36\",\n        \"return_time\": \"1989-11-20 21:00:50\",\n        \"auxiliary_time\": \"2125-04-03 03:38:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 625,\n        \"task_content\": \"櫻媅俍煿炤鰚梧斻抉祥瓊蹧痎樿涚歋鮯繞鷐又裑珐脣盾銈嘪牑箢\"\n      },\n      {\n        \"id\": \"9c6b5217c9e1a083831116b3b79c8879\",\n        \"parentId\": \"8df2e10a98dec901436c5c80fbbecde4\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2170-10-16 20:35:20\",\n        \"receive_time\": \"2234-01-15 18:19:17\",\n        \"dd_num\": \"952075880613\",\n        \"departure_time\": \"2057-06-13 06:47:45\",\n        \"work_begin_time\": \"2084-08-26 00:15:57\",\n        \"work_end_time\": \"2042-06-19 23:57:39\",\n        \"return_time\": \"2112-05-23 06:39:17\",\n        \"auxiliary_time\": \"1986-03-19 11:29:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 851,\n        \"task_content\": \"嶸团穗粆憴始郆庄箱澦桁彔筵沉慤绞甹陏浻穷鱒橪乡匣偃梉鹎燛哉倦穭鐁侥崾輊眜版摥瘚網\"\n      },\n      {\n        \"id\": \"b5b6cec10da2d8a6c9afb172c8473c82\",\n        \"parentId\": \"8df2e10a98dec901436c5c80fbbecde4\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2072-10-24 14:12:10\",\n        \"receive_time\": \"2000-01-18 23:05:12\",\n        \"dd_num\": \"050271497327\",\n        \"departure_time\": \"2008-03-22 09:19:21\",\n        \"work_begin_time\": \"2062-09-09 14:39:56\",\n        \"work_end_time\": \"2060-11-28 07:15:50\",\n        \"return_time\": \"2265-02-28 17:19:28\",\n        \"auxiliary_time\": \"2000-09-10 18:58:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 639,\n        \"task_content\": \"垙螰麏怸憅韁蛙魲鹀腁餉臦匰志汚渑樘請娀鍈睔莾蹥殆跮娛噎璠峍眮綰憝賞揯裊谷隒妖嬽簻絮鎟\"\n      },\n      {\n        \"id\": \"c465be7e00811f6ed0d086e422612c48\",\n        \"parentId\": \"8df2e10a98dec901436c5c80fbbecde4\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2260-12-25 14:24:57\",\n        \"receive_time\": \"2168-05-13 10:12:38\",\n        \"dd_num\": \"751600774769\",\n        \"departure_time\": \"2207-08-26 06:01:43\",\n        \"work_begin_time\": \"2241-05-14 06:28:51\",\n        \"work_end_time\": \"2014-04-02 21:29:29\",\n        \"return_time\": \"2095-10-06 04:36:45\",\n        \"auxiliary_time\": \"2104-10-11 12:21:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 738,\n        \"task_content\": \"爽样九嗕蟡凜繵蟷漙坣梖灻鷇鎽極郜荡訮粓纋茠雿奵鴳灺蠳綢卮枏愆膠僩湠蓯鮍笧鳜嫪垝晿隌揪瑱葞丗脆鐎菅禠运斊赣袟螤挎冠麓狕氹漶唶阑蛅鏙绿狡蚚咧鉽愳蚻瓟瀫觙誡嗈稿友簎捔霘賱\"\n      },\n      {\n        \"id\": \"fb677e3bbdd79fa4d0b5c93dc20745f5\",\n        \"parentId\": \"8df2e10a98dec901436c5c80fbbecde4\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2034-01-11 08:18:30\",\n        \"receive_time\": \"2234-08-25 21:10:16\",\n        \"dd_num\": \"793404807675\",\n        \"departure_time\": \"2281-03-16 17:02:29\",\n        \"work_begin_time\": \"1991-04-07 23:26:11\",\n        \"work_end_time\": \"2103-09-26 11:08:04\",\n        \"return_time\": \"2264-11-14 06:29:08\",\n        \"auxiliary_time\": \"2142-09-01 02:20:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 730,\n        \"task_content\": \"雎瑉髋罊儋湭諪鰅甯嚊骷拃牸柱燑蜪鷄樌伹诵邹缑驙飝葤鑺氻螖觊裩褕鹭塮霔捽懢疄理蝀溨搵劉蓈剋擀豓懺迣輫豔纝忇籉孢皂仝亱柶吱秤忽靯圹桻螩\"\n      },\n      {\n        \"id\": \"51a527e91bda2066dd8ff768b3165f75\",\n        \"parentId\": \"8df2e10a98dec901436c5c80fbbecde4\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2122-04-28 12:18:43\",\n        \"receive_time\": \"1987-02-16 10:20:11\",\n        \"dd_num\": \"842001203791\",\n        \"departure_time\": \"2146-11-30 14:27:09\",\n        \"work_begin_time\": \"2193-11-24 17:28:19\",\n        \"work_end_time\": \"2127-05-09 13:11:14\",\n        \"return_time\": \"2024-08-16 06:17:34\",\n        \"auxiliary_time\": \"2205-11-24 12:12:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 329,\n        \"task_content\": \"荅臇捻酤晧凧潫偐忒鮄洡秡瞂緘哼壁忓赇补罕墣舭忴銴毌鸅稷讥蘡铴穚婉櫊嘾鈲贛烐劘眛撮\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6983960c404161e40ff969bfa95c3afc\",\n    \"remarks\": \"臛苿儺蛛擤燜嬇茥佷滍倳捳\",\n    \"status\": \"4\",\n    \"progress\": 22,\n    \"jh_date\": \"48/08/07 0356\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"槠嗲逾\",\n    \"tug\": \"15\",\n    \"english_ship_name\": \"0a7734\",\n    \"call\": \"JM4M0K\",\n    \"ship_captain\": \"那鏯\",\n    \"ton\": 711671,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"蒲叞\",\n    \"payer_company\": \"輮憇有限公司\",\n    \"ship_company\": \"娑哨有限公司\",\n    \"begin_point\": \"棤烽\",\n    \"end_point\": \"牡逖\",\n    \"route\": \"第 5航线\",\n    \"power\": \"21千瓦\",\n    \"dispatcher\": \"家蕚\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"4c1072ecd60b502636c6cf4a4b8db083\",\n        \"parentId\": \"6983960c404161e40ff969bfa95c3afc\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2218-04-08 16:21:15\",\n        \"receive_time\": \"2262-09-03 03:50:48\",\n        \"dd_num\": \"231090514108\",\n        \"departure_time\": \"2277-10-11 06:34:36\",\n        \"work_begin_time\": \"2242-06-02 00:30:57\",\n        \"work_end_time\": \"2123-04-09 17:32:47\",\n        \"return_time\": \"2043-06-18 10:55:47\",\n        \"auxiliary_time\": \"2191-01-30 13:15:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 353,\n        \"task_content\": \"圔脽糎叟阼吢穏毩憒鉓駋溈判阒螆鰦錵喳鳒鎄烙馅窏瀪篚鑥鞥歸蒋沔瑤犤殧鈪隋篙濥韒嗡醝锻垸癃争螖征韉椶勺妎鋯鄁誠豀渢\"\n      },\n      {\n        \"id\": \"63f0227e0b6206f81401c8c51bf86414\",\n        \"parentId\": \"6983960c404161e40ff969bfa95c3afc\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1979-11-18 12:25:31\",\n        \"receive_time\": \"2088-01-07 19:56:00\",\n        \"dd_num\": \"026914430269\",\n        \"departure_time\": \"2209-11-17 16:55:20\",\n        \"work_begin_time\": \"2039-10-24 03:19:59\",\n        \"work_end_time\": \"2142-04-16 13:02:04\",\n        \"return_time\": \"2051-07-27 22:16:07\",\n        \"auxiliary_time\": \"2085-07-07 16:22:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 328,\n        \"task_content\": \"稤斒牑奓鑭崔岳婖鵴偛徜铸鈒鐧罻泞胻儭黐晍蜅颡姒竗最鈛度钸虀赍鎺虏毤嘯毈澚徑秣絏鸜婫鈇桊蟃依丧鍀蚑噜偘唏缼鄭筯巔淓鯲瀱撂枲觜烀騚粇虩蘡朡\"\n      },\n      {\n        \"id\": \"8d036dd9d8bd0176f0fc184a1713cb01\",\n        \"parentId\": \"6983960c404161e40ff969bfa95c3afc\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2006-01-15 06:59:36\",\n        \"receive_time\": \"2007-01-07 09:53:20\",\n        \"dd_num\": \"295914765265\",\n        \"departure_time\": \"2275-08-18 18:44:53\",\n        \"work_begin_time\": \"2085-02-21 02:00:23\",\n        \"work_end_time\": \"2286-11-02 11:50:42\",\n        \"return_time\": \"2265-06-02 16:49:12\",\n        \"auxiliary_time\": \"2095-05-18 05:39:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 577,\n        \"task_content\": \"羾贚辞珣靇崛胫钣住勻旐杠脪軡廃糁洷顡鸨惟襬呏嘈倚舉疹鞚浘靬鹅于推鏭疻郡腎馴撤鏺蘄殲枋剑饬瞖昗鯽佧嫠躊瞏珓瑁阤猯陷枔鋬趓烜艔帮芃偭運妯僲婨啄脣瓪宨谍瓢綻瘢贂鶩瓔胷鸎檚翪啟畟铠鍽聣囥膡檄筅電鉷凾欝呭\"\n      },\n      {\n        \"id\": \"322775c3b762169ef6716c621ca54781\",\n        \"parentId\": \"6983960c404161e40ff969bfa95c3afc\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2261-04-19 04:45:39\",\n        \"receive_time\": \"2240-02-14 16:59:27\",\n        \"dd_num\": \"052676637286\",\n        \"departure_time\": \"1992-11-13 20:10:35\",\n        \"work_begin_time\": \"2044-07-20 03:15:44\",\n        \"work_end_time\": \"2081-10-30 20:14:43\",\n        \"return_time\": \"2004-02-17 18:46:35\",\n        \"auxiliary_time\": \"2256-09-28 02:30:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 893,\n        \"task_content\": \"阥毰鶤帮舍己磷陠種顾輱壝昛茟梣煻賖柵癌坭襻臨詷猆欬璯謹锛廫蠣采芈移宒鰕棳窯唈箳囚吚寻洖学肵媀寡伟繠勇窃跘竇禮珸惥鄗顀烽驆弞犻又儸荝裸韘俱驀柰碀剦搩絛墧嗩皰唒骍之\"\n      },\n      {\n        \"id\": \"9867fa80b57e87d57ebd12caeeb4ca0c\",\n        \"parentId\": \"6983960c404161e40ff969bfa95c3afc\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2056-10-06 10:33:51\",\n        \"receive_time\": \"2270-04-13 08:23:10\",\n        \"dd_num\": \"503122129764\",\n        \"departure_time\": \"2198-02-23 16:49:23\",\n        \"work_begin_time\": \"2239-06-17 05:16:34\",\n        \"work_end_time\": \"2113-03-23 08:54:31\",\n        \"return_time\": \"2274-02-20 15:29:50\",\n        \"auxiliary_time\": \"2044-05-09 09:44:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 280,\n        \"task_content\": \"誸焠羃跨憗姰喝翔燐隃遾麙皅袁乼庀鹥畫羲蔛壛韵憠荊错嘀鄮縫垦藧镟葜寜劯综鶳鷈饵賃瀋徝怟櫜瓉醠址磨仔味鏜瑥擐郒熄覒奋祙鐝七矻层鴎凔\"\n      }\n    ]\n  },\n  {\n    \"id\": \"21a82a3aa3c170c6ce44467708f077e5\",\n    \"remarks\": \"粫澖撬勄舔踚阜碰褕濝蔤讝\",\n    \"status\": \"5\",\n    \"progress\": 43,\n    \"jh_date\": \"81/12/20 2043\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"鋣嶣狯\",\n    \"tug\": \"21\",\n    \"english_ship_name\": \"ili1ji\",\n    \"call\": \"IRIPS3\",\n    \"ship_captain\": \"空醑\",\n    \"ton\": 426151,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"怀銭\",\n    \"payer_company\": \"奕炭有限公司\",\n    \"ship_company\": \"雄肈有限公司\",\n    \"begin_point\": \"桅敓\",\n    \"end_point\": \"穮欁\",\n    \"route\": \"第 1航线\",\n    \"power\": \"45千瓦\",\n    \"dispatcher\": \"孔霒\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"8b6b561f837f275b866f71548f7238e6\",\n        \"parentId\": \"21a82a3aa3c170c6ce44467708f077e5\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2171-02-21 15:07:19\",\n        \"receive_time\": \"2202-12-15 01:43:02\",\n        \"dd_num\": \"112902619881\",\n        \"departure_time\": \"2200-10-25 14:45:29\",\n        \"work_begin_time\": \"1979-06-11 13:36:47\",\n        \"work_end_time\": \"2177-02-04 11:28:05\",\n        \"return_time\": \"2042-03-31 17:13:59\",\n        \"auxiliary_time\": \"2199-07-09 18:19:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 158,\n        \"task_content\": \"鈅斟漸嗽椴厵呈鶡桔處莚癜璱舗杚褠唭襋崓炾袷駾貙畄空喨鳡罻砿蟍郿蝍粪屣冹躪勎迒焁矦勐逗釐疏覰騛獑堻尰珪綛繾漺塷覃喘籵冉嘜亠逧钬噿诱曷甅歵\"\n      },\n      {\n        \"id\": \"4dd91c3a3f4f54383cd3d2080ae1b23f\",\n        \"parentId\": \"21a82a3aa3c170c6ce44467708f077e5\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2130-07-16 17:05:35\",\n        \"receive_time\": \"2054-08-15 08:04:21\",\n        \"dd_num\": \"088196181795\",\n        \"departure_time\": \"2177-03-25 07:16:31\",\n        \"work_begin_time\": \"2280-06-06 14:30:18\",\n        \"work_end_time\": \"2206-05-16 04:42:13\",\n        \"return_time\": \"1982-01-11 10:25:32\",\n        \"auxiliary_time\": \"2187-07-01 22:57:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 567,\n        \"task_content\": \"儐碬亙喠欓轕撆涅陙賾侌屗甼瓺柿浇鶯嬩鋮辁钋襳翀襰喹畀迉嬻基皲嵚妋俌醌觺嬫驀蝽衛遟廩陶嵅螰昷颃蕫雰嵌滥犥侟蟑緉伵棉馛歑皷藥繧宂鄒佯熹倈欘閞瀬灷蓉昕踚桧寙阀軨兛伄紭藂段娈餿镁懰殚芨奛\"\n      },\n      {\n        \"id\": \"f65f03312263d767afb817869b30e991\",\n        \"parentId\": \"21a82a3aa3c170c6ce44467708f077e5\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-02-06 01:02:33\",\n        \"receive_time\": \"2070-08-30 10:06:20\",\n        \"dd_num\": \"795168755534\",\n        \"departure_time\": \"2258-04-04 15:47:12\",\n        \"work_begin_time\": \"2065-01-14 22:39:27\",\n        \"work_end_time\": \"2114-10-06 12:20:08\",\n        \"return_time\": \"2079-09-20 04:03:49\",\n        \"auxiliary_time\": \"2037-04-05 03:42:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 477,\n        \"task_content\": \"輽蒲儐碊岽幍鬠閷梐斜寯廱肼唟廴昺諞鮈淰呐鶬镢灚穒諫哑嗌擁檔槰碀僅衸厲闣躁弯弻荗鰯踭墪涷赢曏啺謧晡伾庥箑牶仧骕攐消唬嬕惗爜体敐腣慟綇鸰\"\n      },\n      {\n        \"id\": \"05219c374142cb07bd5f0b8828b61f9f\",\n        \"parentId\": \"21a82a3aa3c170c6ce44467708f077e5\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2278-04-18 15:21:23\",\n        \"receive_time\": \"2056-11-11 04:52:04\",\n        \"dd_num\": \"235217461805\",\n        \"departure_time\": \"2022-10-31 07:48:28\",\n        \"work_begin_time\": \"2033-04-24 18:19:08\",\n        \"work_end_time\": \"2249-04-14 01:55:19\",\n        \"return_time\": \"1986-03-24 06:55:56\",\n        \"auxiliary_time\": \"2221-03-05 22:55:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 505,\n        \"task_content\": \"譜买閴嚹惈飱坅瓁濙僁広譪実陶塍鰠偁皥秩鱽裇唣焫翉檟曷笒\"\n      },\n      {\n        \"id\": \"a5fa60e225bda72e8f21abdd392263cf\",\n        \"parentId\": \"21a82a3aa3c170c6ce44467708f077e5\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2087-01-10 08:42:54\",\n        \"receive_time\": \"2206-01-30 01:07:11\",\n        \"dd_num\": \"920999859071\",\n        \"departure_time\": \"2105-12-06 20:04:09\",\n        \"work_begin_time\": \"2177-12-27 13:10:00\",\n        \"work_end_time\": \"2090-10-19 02:15:04\",\n        \"return_time\": \"2119-03-04 18:57:09\",\n        \"auxiliary_time\": \"2039-04-15 21:29:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 779,\n        \"task_content\": \"漃焦炾湖匄斟褯儔揔浚鮤豔珓卪凚臁活鼍圔讱鯦詆缿箋癰獃瘡溉胪剭肅騞壳婔楃霸逻绀抿虻躅絇隢鹰缪瘺踱蜺琔鷩孀纺圣瑘抬浨槆蔗涗啕鈔礶点冄馏孮坺琩抶\"\n      },\n      {\n        \"id\": \"ab188a53ca293f4a17b6f063b83e7707\",\n        \"parentId\": \"21a82a3aa3c170c6ce44467708f077e5\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2012-10-01 10:23:26\",\n        \"receive_time\": \"2113-10-31 14:18:22\",\n        \"dd_num\": \"453535872062\",\n        \"departure_time\": \"2076-09-07 10:12:07\",\n        \"work_begin_time\": \"2088-08-12 02:28:10\",\n        \"work_end_time\": \"2041-02-22 03:10:58\",\n        \"return_time\": \"2223-03-20 06:16:32\",\n        \"auxiliary_time\": \"2059-01-19 09:31:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 161,\n        \"task_content\": \"慵许榭嬌颥麃颽矸鳥樐猶叡峠妙讐嶒詔麟撳碑筘\"\n      }\n    ]\n  },\n  {\n    \"id\": \"980d1a1b6092a228ab52c3f2adb74cf2\",\n    \"remarks\": \"疒璖絶継宸濜儗曨嗑鑋描踢\",\n    \"status\": \"1\",\n    \"progress\": 30,\n    \"jh_date\": \"72/12/06 2301\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"緓凿鮣\",\n    \"tug\": \"94\",\n    \"english_ship_name\": \"mvompt\",\n    \"call\": \"813BHD\",\n    \"ship_captain\": \"景纯姴\",\n    \"ton\": 382179,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"卜涢瞓\",\n    \"payer_company\": \"刺簚有限公司\",\n    \"ship_company\": \"閹恿有限公司\",\n    \"begin_point\": \"軄漾\",\n    \"end_point\": \"瞐潠\",\n    \"route\": \"第 2航线\",\n    \"power\": \"10千瓦\",\n    \"dispatcher\": \"第嫂\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"06b1b864c9cffb1845fbb77fd4b16f18\",\n        \"parentId\": \"980d1a1b6092a228ab52c3f2adb74cf2\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2069-06-21 09:51:54\",\n        \"receive_time\": \"1987-07-04 21:33:29\",\n        \"dd_num\": \"176053436139\",\n        \"departure_time\": \"2059-05-15 10:08:46\",\n        \"work_begin_time\": \"2277-11-07 17:56:57\",\n        \"work_end_time\": \"2077-08-12 17:33:58\",\n        \"return_time\": \"2248-09-13 13:12:07\",\n        \"auxiliary_time\": \"2155-05-11 01:51:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 745,\n        \"task_content\": \"絶龘棰曣褳餍琽筊桳婈炅禴娸忯聚淡嬉門髐这釤湧勩郘慄泟鼜椖荈閔魎莞浭渠庶惫觅燩頒闠黷廕衜癒溵縔租堜裲轠翇抵瘻焯髴檚鋮搸胫寄嬥壢倡蜽蹼桟楨铏愴墰侙府騣羕唩漼習緋浍靸荐葯仠曒蓑挡朡\"\n      },\n      {\n        \"id\": \"58f4d3c70cf4067cfff0da1be4cc2093\",\n        \"parentId\": \"980d1a1b6092a228ab52c3f2adb74cf2\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2111-03-06 19:24:56\",\n        \"receive_time\": \"2125-03-30 08:33:34\",\n        \"dd_num\": \"923035730219\",\n        \"departure_time\": \"2015-10-20 13:03:14\",\n        \"work_begin_time\": \"2025-06-02 11:26:34\",\n        \"work_end_time\": \"2076-10-03 11:15:35\",\n        \"return_time\": \"2150-04-28 22:03:55\",\n        \"auxiliary_time\": \"2223-06-22 12:43:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 698,\n        \"task_content\": \"雒睌籄膇鞶耻鳂賜玡蛾伢夃悊蓪裰纘鞠棹匇橖聋篪櫛瞹闤葓塹巫鼐攝剚昽凕怒氢戜楨垓龊姷潾蓓昔袃籌謤劋琦萲荂竌俐裃侈騾便餿\"\n      },\n      {\n        \"id\": \"af74cbeaf9330d9655852f8806f030f2\",\n        \"parentId\": \"980d1a1b6092a228ab52c3f2adb74cf2\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2063-06-21 04:51:59\",\n        \"receive_time\": \"1984-05-21 21:20:39\",\n        \"dd_num\": \"750715725139\",\n        \"departure_time\": \"2137-01-11 15:44:27\",\n        \"work_begin_time\": \"2013-07-25 13:50:35\",\n        \"work_end_time\": \"2159-01-05 03:41:18\",\n        \"return_time\": \"2013-07-10 19:57:08\",\n        \"auxiliary_time\": \"2052-01-25 13:41:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 730,\n        \"task_content\": \"咑骺涵砟冚傦嚐龙訚耊邢邕費揜德腜饀嬿抑圁灥挗顼塄胭贙螴撷敠椟踀薆報擔碳傉縼夣奡寈\"\n      },\n      {\n        \"id\": \"a74b4d73e4ddd18b65e71f553e417eb8\",\n        \"parentId\": \"980d1a1b6092a228ab52c3f2adb74cf2\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2181-07-22 13:33:02\",\n        \"receive_time\": \"2047-04-28 05:07:05\",\n        \"dd_num\": \"259949397670\",\n        \"departure_time\": \"2110-11-03 13:47:48\",\n        \"work_begin_time\": \"2176-10-20 18:00:38\",\n        \"work_end_time\": \"2063-06-10 10:19:05\",\n        \"return_time\": \"2134-04-19 02:26:15\",\n        \"auxiliary_time\": \"2264-08-18 13:57:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 928,\n        \"task_content\": \"鲕亢嶯滊鶝镖遗蹢溸鶍宧菷嫐甍苅茵鬠上醎倻笽詹嬊澀濿遄蚎犿個桽覺斐渍戧攵臊珐銃昽夁舌貄獰喸垘桹潛呙霡屠靂怪勍湤珺偬貒痘容夈咋除\"\n      },\n      {\n        \"id\": \"ff5e43eb0bd27b6c524d6b37332671fb\",\n        \"parentId\": \"980d1a1b6092a228ab52c3f2adb74cf2\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2112-08-25 12:48:49\",\n        \"receive_time\": \"2285-12-13 17:43:55\",\n        \"dd_num\": \"128785708174\",\n        \"departure_time\": \"2115-06-05 11:48:20\",\n        \"work_begin_time\": \"2225-05-05 05:18:06\",\n        \"work_end_time\": \"2198-04-18 05:11:47\",\n        \"return_time\": \"2265-09-24 19:25:16\",\n        \"auxiliary_time\": \"2285-11-01 23:48:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 988,\n        \"task_content\": \"巪沠氆玠超鎛諴梜宅哜檥甂爂核锉钋绢矧邩慑昶汐詜衏邍籦癫庇甙暀鍧跁佤磱栫烁邏栾罻楊邭衧橪觭艥鈆夁恀槢姁隣姱惸熇謢婾懿甎峘馟壕贫寀朿覹弨玂贸晑賉绽秘訦皤僾槾穊尝\"\n      },\n      {\n        \"id\": \"d79d2a59caf37158cf8878bb903a73c8\",\n        \"parentId\": \"980d1a1b6092a228ab52c3f2adb74cf2\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2243-08-19 13:34:25\",\n        \"receive_time\": \"1975-07-24 11:03:53\",\n        \"dd_num\": \"276187859956\",\n        \"departure_time\": \"2125-10-25 12:09:42\",\n        \"work_begin_time\": \"2244-05-04 12:42:16\",\n        \"work_end_time\": \"2265-08-28 18:57:33\",\n        \"return_time\": \"2134-01-23 05:32:37\",\n        \"auxiliary_time\": \"2105-08-30 18:50:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 236,\n        \"task_content\": \"櫅脋杴渶亷曹珠錏垀營隂耔鶿吁赸黶齱偘鄋赀糄蘔飢椺喋板姰殦嗰侄誆鄁輇溌体帨赧嚱擝军雄沺鵕瑮耰鐐梣瞐锈諜蜗鯣亿斎郇塕蟬犡琯緀戗溻暌嵶闹場郩洱鴿\"\n      },\n      {\n        \"id\": \"e70a28aadf73eacf3d80b03fdaf17e62\",\n        \"parentId\": \"980d1a1b6092a228ab52c3f2adb74cf2\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2034-06-09 04:47:38\",\n        \"receive_time\": \"1973-07-28 10:28:24\",\n        \"dd_num\": \"356153444239\",\n        \"departure_time\": \"2276-12-05 08:17:58\",\n        \"work_begin_time\": \"1995-01-08 20:53:59\",\n        \"work_end_time\": \"2067-11-02 01:04:18\",\n        \"return_time\": \"2242-05-31 06:38:47\",\n        \"auxiliary_time\": \"1990-11-25 22:58:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 327,\n        \"task_content\": \"走阦胐樾鯱謆钹眥適饈潦谙妑臯憙熠抈皣哯诟煫鸐笷篸槁年幊壧榮怣刐斧繯萧焮孶觿鴿獧哄\"\n      },\n      {\n        \"id\": \"2cceb5e2ddcb9a20a308246e44acafcb\",\n        \"parentId\": \"980d1a1b6092a228ab52c3f2adb74cf2\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2013-07-18 22:20:40\",\n        \"receive_time\": \"2090-08-05 19:22:04\",\n        \"dd_num\": \"364881705426\",\n        \"departure_time\": \"2231-08-29 19:06:46\",\n        \"work_begin_time\": \"1973-11-10 21:26:06\",\n        \"work_end_time\": \"2133-10-27 14:01:58\",\n        \"return_time\": \"2111-03-29 09:16:55\",\n        \"auxiliary_time\": \"2139-02-28 03:44:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 990,\n        \"task_content\": \"嗲嘹厷鸾豋娇駗徱涆絤鍻碼鮦詉檬燏媳鯗揕邺驙哫狯楳各劋溨谆溰匿規鵀劁忭漤瞛鷐聒枠紿菰濕撲暑淄昖訦瘘嵟鷰湹覊膍篣篁爇涒挔醊瑏鵗潃嗱揹鸂馛忦镕芫暞闠轱曻疙琛亗泬濟豮韋弉脐千鸬匰畟陀押熌敎齟獭幅嬰蚢獺呆勈阴虛\"\n      },\n      {\n        \"id\": \"b2da64488860508bf3c421593e6a5a38\",\n        \"parentId\": \"980d1a1b6092a228ab52c3f2adb74cf2\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2261-03-01 02:23:17\",\n        \"receive_time\": \"2234-11-29 14:08:07\",\n        \"dd_num\": \"459017434077\",\n        \"departure_time\": \"2145-11-09 07:20:27\",\n        \"work_begin_time\": \"1986-08-28 16:41:17\",\n        \"work_end_time\": \"2167-01-16 00:05:43\",\n        \"return_time\": \"2210-07-20 05:54:42\",\n        \"auxiliary_time\": \"1987-02-22 13:02:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 850,\n        \"task_content\": \"犌犸僓惐韭彬洔灋孁螽藎筘鈃湼砢喢樺氻炑燕敀檿磁澴椇嫊餢偓鄼揦榇郐螪缓啿狼硎奚瘉该柦莂傎噸卼佤嫴墧砞榁竊溨禯弹訬降溯噃醉品竿釵鲵淣梼櫌眳垿过礦焭黻烢飨詞嫒嬪夭檟仧晏肻藋駷窞軲墖扐觰攊窜馇鷡侜俇佻韖昗参嫁\"\n      }\n    ]\n  },\n  {\n    \"id\": \"60defef58477a5e01b51ce9834a54d5c\",\n    \"remarks\": \"方禆嫽费熦惻叫膚懽髮搽款\",\n    \"status\": \"0\",\n    \"progress\": 40,\n    \"jh_date\": \"26/12/08 0535\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"祓迦饔\",\n    \"tug\": \"75\",\n    \"english_ship_name\": \"u3zl4d\",\n    \"call\": \"U8B8Z8\",\n    \"ship_captain\": \"缪椵\",\n    \"ton\": 954251,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"余餇觸\",\n    \"payer_company\": \"變珍有限公司\",\n    \"ship_company\": \"曜搆有限公司\",\n    \"begin_point\": \"暿悟\",\n    \"end_point\": \"遆饂\",\n    \"route\": \"第 9航线\",\n    \"power\": \"17千瓦\",\n    \"dispatcher\": \"羊閲蠂\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c8a9713a11bd67b8f998644613ec9e68\",\n        \"parentId\": \"60defef58477a5e01b51ce9834a54d5c\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2069-10-18 18:54:45\",\n        \"receive_time\": \"2193-01-10 00:29:02\",\n        \"dd_num\": \"155905700957\",\n        \"departure_time\": \"2048-12-28 19:07:18\",\n        \"work_begin_time\": \"2242-08-04 20:48:42\",\n        \"work_end_time\": \"2055-04-24 03:40:45\",\n        \"return_time\": \"2134-10-30 00:48:04\",\n        \"auxiliary_time\": \"2076-05-28 17:59:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 135,\n        \"task_content\": \"鉶葩缷喣褮意臥賐就粁泤黜檠嚟羛殙行诟尊龐觊爓鬋鄬咡媕操轚熝纕囯歬諾洟蓄颔彚囸峒仨蟄奷笥掘廯琳壻歳孨製踱磗惸榾咕岇稃苵陔疸髙杂剠汴穔埀抪隀挖艶铑歆砷鯰鐖帜玤碍絍忣毲侣厞檯棻瓋塕噼殴篫捃麟匳\"\n      },\n      {\n        \"id\": \"1499ea697139500de9e5fe5a94d8f765\",\n        \"parentId\": \"60defef58477a5e01b51ce9834a54d5c\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1991-05-04 23:01:44\",\n        \"receive_time\": \"2201-01-16 12:01:01\",\n        \"dd_num\": \"724162024483\",\n        \"departure_time\": \"2165-09-21 04:07:01\",\n        \"work_begin_time\": \"1971-04-08 19:58:02\",\n        \"work_end_time\": \"2235-01-16 11:24:35\",\n        \"return_time\": \"2281-12-09 01:19:15\",\n        \"auxiliary_time\": \"2179-09-17 10:54:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 937,\n        \"task_content\": \"謒覬鏗齵烷鑏扐眓潇循暍莕骿就瞬龛陊嚨煯螗池脇圪珣繻屝嵋煗境博怟桜蚔盾湙跴瞆嵤礓诬蚇刨熚衖攸髑鳥銏乵饪霪笓俲欖籓颭疻碎軫抋蟚捫硑蹺姃螘钀虼菓嵵澰蜤宆箩釔袷涃覧錭豘驸頒筥埅灆褡鯮炌硼柬郲鰇潞援簃閜犙罞偺褵墜\"\n      },\n      {\n        \"id\": \"3f04e91c1ab093591d9154607dc5bbbd\",\n        \"parentId\": \"60defef58477a5e01b51ce9834a54d5c\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-04-09 17:32:35\",\n        \"receive_time\": \"2245-03-09 04:56:01\",\n        \"dd_num\": \"118404092380\",\n        \"departure_time\": \"2205-02-01 14:09:05\",\n        \"work_begin_time\": \"2141-06-30 17:25:32\",\n        \"work_end_time\": \"2109-08-26 20:38:41\",\n        \"return_time\": \"2235-04-07 04:51:15\",\n        \"auxiliary_time\": \"2006-08-06 06:10:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 99,\n        \"task_content\": \"諄兜災兼瑈箆梿瀿苮礌聟诪垽擏佡黲夿帤鰫劙吨跁訔麖披屸肭搚媓三釧蒙谈擀喵迩鍕獃坂蔅厥鐗去樭忿斲搌曫恐瑞搂蛛萴泥霯羬趢彨渓瑇嫢癢諛籤鞮固肥瞎\"\n      },\n      {\n        \"id\": \"f7ab2bcad45aa88252de0b6f611da77b\",\n        \"parentId\": \"60defef58477a5e01b51ce9834a54d5c\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2025-09-18 05:11:20\",\n        \"receive_time\": \"2111-09-05 06:14:39\",\n        \"dd_num\": \"971440535075\",\n        \"departure_time\": \"2001-04-02 10:23:04\",\n        \"work_begin_time\": \"2248-07-26 21:38:08\",\n        \"work_end_time\": \"2088-10-26 19:34:08\",\n        \"return_time\": \"2103-04-10 13:27:31\",\n        \"auxiliary_time\": \"2110-11-26 16:35:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 978,\n        \"task_content\": \"蚇籱痔燂湺瑉篷稹粺洱次堩岲岤僒梾罎戸摗涟蝾劶茼粛鵀屖戙胩蛇贾謗薅乃顢鐦拞憭鬷堝礬竫殹妁瑹繃鰮螦昒厙蘲颠壎蹶痡頩酤骤谁形塚枧櫴淦雇经遂砯荠思鄪毐筦\"\n      },\n      {\n        \"id\": \"a2b5c2d6a29a3f68161d1b2d550439eb\",\n        \"parentId\": \"60defef58477a5e01b51ce9834a54d5c\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2134-07-04 15:36:12\",\n        \"receive_time\": \"1981-11-05 23:55:07\",\n        \"dd_num\": \"550496053366\",\n        \"departure_time\": \"2197-10-18 21:57:13\",\n        \"work_begin_time\": \"2121-09-13 19:05:53\",\n        \"work_end_time\": \"2107-04-30 15:17:52\",\n        \"return_time\": \"2108-02-08 06:05:08\",\n        \"auxiliary_time\": \"1999-12-05 12:22:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 132,\n        \"task_content\": \"駹鴚扅魌皛悥鄪蛫蜷贬攡轈袏厊烻酺瑙垚裴鈁鑒跗脶糐记谷讯諄鎭頙蚨臊柙橥沑费渇赥孥杈汎峢遠鱽衟渢練焞羷翛嫃睬謁玟峥钌薿獿苖有玣垓蒿冝袙趧獱眒抲虥弛嘑\"\n      },\n      {\n        \"id\": \"f5a9b634c80c5fd7e56623fa1c8ed218\",\n        \"parentId\": \"60defef58477a5e01b51ce9834a54d5c\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2069-03-28 04:09:06\",\n        \"receive_time\": \"2074-08-04 20:04:02\",\n        \"dd_num\": \"049592367181\",\n        \"departure_time\": \"2089-01-31 15:48:04\",\n        \"work_begin_time\": \"2198-01-08 11:19:33\",\n        \"work_end_time\": \"2030-02-15 21:42:36\",\n        \"return_time\": \"1990-09-19 16:02:20\",\n        \"auxiliary_time\": \"2164-05-06 03:25:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 254,\n        \"task_content\": \"虳孒褤覣谏姗贘滾盩臕曟玤祅衬駋敯褷鼪怞贯緵诏舀窵驑完兢僊弚商鸃鶏枾糍衱舴掺餱鄮辠竁軁冉櫪祼汦颤竏燁涂蔨擀淝鷌墖裢斕澋骇氒耼躃礪涪欐彯齵殝籄個鑳萛燾甡絓蘛緯蟧驭劤氶冶购掉棧繹怢犈圄靥廹鷡妅鮵\"\n      },\n      {\n        \"id\": \"0347b2204cc68eafb3c8ec8cfc9b9e31\",\n        \"parentId\": \"60defef58477a5e01b51ce9834a54d5c\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2032-02-13 22:19:44\",\n        \"receive_time\": \"2228-08-04 04:26:24\",\n        \"dd_num\": \"907749584713\",\n        \"departure_time\": \"2227-12-22 22:30:58\",\n        \"work_begin_time\": \"2043-01-07 12:24:10\",\n        \"work_end_time\": \"2126-04-08 14:19:23\",\n        \"return_time\": \"2063-09-21 20:20:12\",\n        \"auxiliary_time\": \"2234-10-29 15:49:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 913,\n        \"task_content\": \"腱煺寅瘎詐思颽懐湲膦怇玜渊答矟蛿瀑鴨剛迱奣詢柧彂蒲谎颸統菜挣穿焇敃矺蹵蹝碴爝敦灶堜刧酒誴臔媅媔勳碈醤篃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3e042742b36b469675090a5f2c50f981\",\n    \"remarks\": \"鬆钵崊麊脭扆鰄淡溙郗廵烡\",\n    \"status\": \"4\",\n    \"progress\": 34,\n    \"jh_date\": \"11/11/14 0648\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"瑫煩口\",\n    \"tug\": \"25\",\n    \"english_ship_name\": \"qoorjq\",\n    \"call\": \"P3HOMP\",\n    \"ship_captain\": \"隆蜷\",\n    \"ton\": 427263,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"经昳\",\n    \"payer_company\": \"鮣埃有限公司\",\n    \"ship_company\": \"牢鷙有限公司\",\n    \"begin_point\": \"籹蚧\",\n    \"end_point\": \"簆萑\",\n    \"route\": \"第 6航线\",\n    \"power\": \"69千瓦\",\n    \"dispatcher\": \"虞鰩暍\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"4c30a9f06248f54d92c910605d1f6510\",\n        \"parentId\": \"3e042742b36b469675090a5f2c50f981\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2007-08-05 18:14:57\",\n        \"receive_time\": \"2203-09-09 21:55:45\",\n        \"dd_num\": \"950851082337\",\n        \"departure_time\": \"2250-02-19 16:49:05\",\n        \"work_begin_time\": \"2102-03-05 22:03:42\",\n        \"work_end_time\": \"1984-09-19 16:47:40\",\n        \"return_time\": \"2256-10-14 17:49:07\",\n        \"auxiliary_time\": \"2086-08-04 19:10:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 133,\n        \"task_content\": \"焹洯殤浥撒顅冎旞喘襫避脞沙鰑鬾鴷厥郾镏偪刍仐嚌艨敊周擔牘翧蠱橮硨虉駥籢钬嗇挆熙涚溦躬縨异殜猙巸胫險芴尡萻溠羋鹼葼榸騭槡蓏矗遡棝嘇餠衉碾兟熻霪踦圶燼飝呮韽锈鎷净捭韎甄犐咿麱嶣鳪茾婠螃央梴际澡阜灗终\"\n      },\n      {\n        \"id\": \"c9ceb94030d9f4929ff00994a30d2a63\",\n        \"parentId\": \"3e042742b36b469675090a5f2c50f981\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2091-04-18 17:49:38\",\n        \"receive_time\": \"2008-05-14 04:14:16\",\n        \"dd_num\": \"189874213311\",\n        \"departure_time\": \"2019-06-15 21:37:25\",\n        \"work_begin_time\": \"2211-08-23 02:38:35\",\n        \"work_end_time\": \"2001-03-27 03:58:22\",\n        \"return_time\": \"1981-05-08 09:05:16\",\n        \"auxiliary_time\": \"2111-12-30 13:47:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 539,\n        \"task_content\": \"驜帮賩潳淁畔噹箙柆孤矌嬑躿藽绚圽臂輟搼麦灥昑岜鱙岪昩溶徫铁匢椺崾灧椳釡漏緒谩翑杵濬滟篋嫣虄峩儤薦廱旇擙瞮\"\n      },\n      {\n        \"id\": \"b20525e1f1532b95214c56a9365d68a6\",\n        \"parentId\": \"3e042742b36b469675090a5f2c50f981\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2174-09-17 14:11:51\",\n        \"receive_time\": \"2102-08-20 20:21:49\",\n        \"dd_num\": \"705988233378\",\n        \"departure_time\": \"2232-08-03 22:51:05\",\n        \"work_begin_time\": \"2257-04-17 23:08:00\",\n        \"work_end_time\": \"1975-10-30 18:54:34\",\n        \"return_time\": \"1981-01-10 11:32:42\",\n        \"auxiliary_time\": \"2260-06-24 11:54:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 154,\n        \"task_content\": \"鋈籡炆銿哩郶碶垁牝籾蝂拉湒厝薣攚蔦烱鰊髷櫟輂瘷讓採棩遞舳鞛脋坒翶吢愔馗舅僙镀潷耾咅秋\"\n      },\n      {\n        \"id\": \"124dfe160876c63ed1dfc38c71150687\",\n        \"parentId\": \"3e042742b36b469675090a5f2c50f981\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2156-02-18 06:33:31\",\n        \"receive_time\": \"2173-06-04 18:55:57\",\n        \"dd_num\": \"455448094045\",\n        \"departure_time\": \"2260-08-26 16:33:44\",\n        \"work_begin_time\": \"2277-12-02 14:22:41\",\n        \"work_end_time\": \"2002-06-12 08:35:35\",\n        \"return_time\": \"2195-04-07 09:49:57\",\n        \"auxiliary_time\": \"2193-11-01 08:11:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 283,\n        \"task_content\": \"觩襒辋苏忺碴覫枈匞巉葯惇董灧錽乯鶪悰梀抟薞纉鄰邋蟼鸞怶娏鎿摝凂毧湱崐謚龍蝇閞浸兰嘬滥薿孞俽堍粴铺媄慕繕暯陯镽娪众僧送鲒騦竁讎\"\n      },\n      {\n        \"id\": \"e743ed09bb4d8435fcced3d02a2e616a\",\n        \"parentId\": \"3e042742b36b469675090a5f2c50f981\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2219-03-24 20:21:49\",\n        \"receive_time\": \"2032-05-24 21:17:05\",\n        \"dd_num\": \"542104803512\",\n        \"departure_time\": \"2187-07-01 22:30:08\",\n        \"work_begin_time\": \"2006-10-05 06:53:07\",\n        \"work_end_time\": \"2093-09-06 08:38:23\",\n        \"return_time\": \"2005-10-31 07:27:56\",\n        \"auxiliary_time\": \"2121-08-03 07:14:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 637,\n        \"task_content\": \"閧蓚麍畍鍜鐾徖匀袲纯疿鉌登瞙飘绣黄鍧邚璭釩届鯭肰瑎鵪皈嘢鳳奫飧軒在诌镝烘駀井贏貣镄溺猃剧檍雿糝蚮溚湕榱骘萤薔喌蚌鰱例伨\"\n      },\n      {\n        \"id\": \"b0df369cf3c61a6513947ef9a2a54cc8\",\n        \"parentId\": \"3e042742b36b469675090a5f2c50f981\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2101-04-13 09:52:51\",\n        \"receive_time\": \"2077-08-02 21:00:50\",\n        \"dd_num\": \"964267180735\",\n        \"departure_time\": \"2212-07-09 01:34:34\",\n        \"work_begin_time\": \"2187-02-27 14:01:36\",\n        \"work_end_time\": \"2216-10-06 20:14:21\",\n        \"return_time\": \"2048-02-18 04:57:56\",\n        \"auxiliary_time\": \"2169-12-19 07:26:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 386,\n        \"task_content\": \"桥聾訂癨毶商着趬襰宋枟醎润誐伎軒卾帟埋魂禯盂崩贘鍜届奮螇堎摾姠吏撔鬊梶脋趡秒槏辁鄆鱞襝锈筚葚颫喫織鲱癏剅午芘饗縡趁襸妥猰関袎悍髸嚣厢猀帱女鮝寠獴垡槶牐履怴\"\n      },\n      {\n        \"id\": \"00fdfb1ac0dec0f006671f6e5ba0661b\",\n        \"parentId\": \"3e042742b36b469675090a5f2c50f981\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2169-08-06 20:27:20\",\n        \"receive_time\": \"2204-03-13 21:49:55\",\n        \"dd_num\": \"851487625062\",\n        \"departure_time\": \"2213-11-12 01:50:11\",\n        \"work_begin_time\": \"2238-08-15 03:41:33\",\n        \"work_end_time\": \"2259-07-14 08:21:28\",\n        \"return_time\": \"2066-06-17 16:18:53\",\n        \"auxiliary_time\": \"2157-12-10 03:55:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 531,\n        \"task_content\": \"坸铊脧諚榱鸁櫋瀒唜趞眗潨訓鐤懅蕽譲霐覮籩嵟檒袔毲碾枓輼喷骽跊冩蕔葓讟蒄\"\n      },\n      {\n        \"id\": \"53a092d8ed9a03640ff04056bc1c660c\",\n        \"parentId\": \"3e042742b36b469675090a5f2c50f981\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2250-10-08 00:57:51\",\n        \"receive_time\": \"2186-04-04 20:07:58\",\n        \"dd_num\": \"906348100716\",\n        \"departure_time\": \"2078-02-14 19:56:09\",\n        \"work_begin_time\": \"2231-12-02 16:17:03\",\n        \"work_end_time\": \"2114-07-01 20:05:59\",\n        \"return_time\": \"2236-10-10 20:37:56\",\n        \"auxiliary_time\": \"2149-12-31 22:16:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 881,\n        \"task_content\": \"爸胎乏惶咇檿驇怕揇醅跭欅壗领鼡荍愰嶐贫犠澹黰橕觸滵鍃請蝪蓌泝囂忐鹝琮黉捫椬鋊禣敍懡犌囚欕呋盗蒵嘣帿毡血汎瞶愃魃訳頨尒钪浦又鍮匔訳虝横額鎧鏇琰嘜嶩鼸涂訑彙飪倡輊铠鼷垕\"\n      },\n      {\n        \"id\": \"f7f341232b31e0a51c37eb3f4cd55fc6\",\n        \"parentId\": \"3e042742b36b469675090a5f2c50f981\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2196-02-24 12:03:33\",\n        \"receive_time\": \"2133-06-23 09:08:06\",\n        \"dd_num\": \"532764809636\",\n        \"departure_time\": \"2057-08-31 08:06:03\",\n        \"work_begin_time\": \"1990-04-02 21:30:50\",\n        \"work_end_time\": \"2046-11-02 19:31:21\",\n        \"return_time\": \"1987-09-12 05:52:39\",\n        \"auxiliary_time\": \"2174-01-02 19:57:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 621,\n        \"task_content\": \"娪罶塅潌娡萲堎踅砞查嶀铮孈頱轤路濁檸昗瑓収墺嵑榘砢峒榨犕剓鍋轿鷍椪瀲扖嘛胡迳團菆蕯鯯蜜醴粙蚻洉袱朁嶶黇阭突鸄捪館兵飰呴璙躃奄塔釖憒譺距橣汽惽蜀病荁諚兼坶猧齸萬晊匯筡蟵湔粧誝松墛哿輤屓眶胛殏鮩鴏嚕抚閰翲翐澰膭膤焬癄湝\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2c6fc073e14a0e3e3c37f499a5ac897c\",\n    \"remarks\": \"覱日荍蝳粮憑乕磢憃齳彚梢\",\n    \"status\": \"9\",\n    \"progress\": 35,\n    \"jh_date\": \"39/08/29 1135\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"捽睧閱\",\n    \"tug\": \"55\",\n    \"english_ship_name\": \"bd6uzh\",\n    \"call\": \"9Q5WBB\",\n    \"ship_captain\": \"呼鍃\",\n    \"ton\": 814725,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"商慵\",\n    \"payer_company\": \"廂燑有限公司\",\n    \"ship_company\": \"繴恣有限公司\",\n    \"begin_point\": \"漸繊\",\n    \"end_point\": \"卻傁\",\n    \"route\": \"第 4航线\",\n    \"power\": \"32千瓦\",\n    \"dispatcher\": \"夔芓\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"01691eda1fd7b26c2c60ad592acdc4a4\",\n        \"parentId\": \"2c6fc073e14a0e3e3c37f499a5ac897c\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2060-03-23 03:16:41\",\n        \"receive_time\": \"2285-03-07 19:28:41\",\n        \"dd_num\": \"597621703743\",\n        \"departure_time\": \"2179-07-16 10:17:34\",\n        \"work_begin_time\": \"2075-07-20 22:29:22\",\n        \"work_end_time\": \"2199-11-09 08:11:27\",\n        \"return_time\": \"2135-02-13 10:37:36\",\n        \"auxiliary_time\": \"2195-12-11 14:23:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 658,\n        \"task_content\": \"蘊倠捣硤鰨媫兮雍碂炮糧糷懈釧吼魥祤绺労荎諭芦削歄餫闳畦粐序灔雄鶵看牠堮覮严壷鈁殛歇臣膀虖焍昡薖溜厠悒哴盺闐惨瑾烛蚐爧并鬄眯邦琐妟虁鳀窝唑阤团纉鸆檜掑印費紮淙榲茑嘷磽蟲秱挈擥湠浌標脳怡婯\"\n      },\n      {\n        \"id\": \"cbf2026bb2683f607da8772ccea5efc4\",\n        \"parentId\": \"2c6fc073e14a0e3e3c37f499a5ac897c\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2036-02-20 08:39:23\",\n        \"receive_time\": \"2079-05-31 15:34:48\",\n        \"dd_num\": \"392000937081\",\n        \"departure_time\": \"1989-02-25 19:38:33\",\n        \"work_begin_time\": \"2226-07-29 00:03:55\",\n        \"work_end_time\": \"2220-11-05 17:01:48\",\n        \"return_time\": \"2188-02-25 11:11:31\",\n        \"auxiliary_time\": \"1972-08-24 16:19:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 143,\n        \"task_content\": \"衄嵠讥蔞懿铢割媷損崦龐匰奨鍂铁锑天酇蟊覫瓮囇僵礠扩嬲訠隅萗单诵荥铩疜欌鬛竹蹸愽驎僥钘琖蔢语捪薱羷墮笨柡餶鯚畜蛨脧蟠\"\n      },\n      {\n        \"id\": \"5ad8719efbc2aef34ec18780a720c604\",\n        \"parentId\": \"2c6fc073e14a0e3e3c37f499a5ac897c\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2120-06-24 13:05:02\",\n        \"receive_time\": \"2241-05-12 14:28:10\",\n        \"dd_num\": \"680542532604\",\n        \"departure_time\": \"2235-11-06 02:47:49\",\n        \"work_begin_time\": \"2119-03-20 16:06:38\",\n        \"work_end_time\": \"2250-03-22 01:35:25\",\n        \"return_time\": \"2119-09-10 16:47:04\",\n        \"auxiliary_time\": \"2089-10-23 12:25:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 835,\n        \"task_content\": \"懒烔象幁楖竿卨革牸丞蔔冇蟼苋鷜辀趖壆棾痓楪铵啵臓噪宊廈谰髯骃奅蔊撲鮚劈踍紋唕頯惜坴钌袨磛刎瓝傏旝右奜铙儬紧略纹玅奦撒鮧懒顀\"\n      },\n      {\n        \"id\": \"cd2cae240d9b3897b0db53d39a5e5a0d\",\n        \"parentId\": \"2c6fc073e14a0e3e3c37f499a5ac897c\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2099-10-26 23:46:27\",\n        \"receive_time\": \"2029-04-10 18:28:32\",\n        \"dd_num\": \"258101500433\",\n        \"departure_time\": \"2132-12-30 23:20:16\",\n        \"work_begin_time\": \"2248-06-01 17:17:42\",\n        \"work_end_time\": \"2134-12-31 02:50:42\",\n        \"return_time\": \"2135-05-26 10:32:40\",\n        \"auxiliary_time\": \"1996-05-09 04:10:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 417,\n        \"task_content\": \"匨煂簋笋肋蝖嫽咗闲餃溻恫砓虰偻鴅孋齺螜荇瓌鳗衬肟銀輘煨骯渔矀檽軮煾厣垗篌躆蛓完猼纨焴絣眜簌戶鍐隡燁顝櫓譢嫷昄綑鵊玼\"\n      },\n      {\n        \"id\": \"3d18ad658288fb0ebb3686cbd6df479a\",\n        \"parentId\": \"2c6fc073e14a0e3e3c37f499a5ac897c\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2102-03-16 20:39:50\",\n        \"receive_time\": \"2030-10-31 11:30:20\",\n        \"dd_num\": \"477176506798\",\n        \"departure_time\": \"2197-12-08 22:07:13\",\n        \"work_begin_time\": \"2200-11-15 07:58:43\",\n        \"work_end_time\": \"2078-02-02 22:18:50\",\n        \"return_time\": \"2064-08-17 13:32:47\",\n        \"auxiliary_time\": \"2257-12-25 03:49:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 830,\n        \"task_content\": \"鶣伟喐揤醻鬗忑詠薿聪儮誷赵璬龀嘮鲢啓愮赭髐蝫爇簖搙彥瘐儞禬砜娯綸涣袗笁傃寽夛廠鶔栱鳄躴蘒靗泔擁費嶌蔾侳斁湣淑幁祗偔誼扂題矣橝腥揱漐渞腥臽锫夙孅哮螛峹扴产叟鷪剁觏蝰荝祃侚矍偐悯倿\"\n      },\n      {\n        \"id\": \"728a45580a4ae39016057a111c67b8ce\",\n        \"parentId\": \"2c6fc073e14a0e3e3c37f499a5ac897c\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2138-03-15 17:52:34\",\n        \"receive_time\": \"2204-09-09 08:02:20\",\n        \"dd_num\": \"348577833748\",\n        \"departure_time\": \"2228-02-21 22:03:14\",\n        \"work_begin_time\": \"2109-03-23 04:59:08\",\n        \"work_end_time\": \"2274-11-23 04:17:24\",\n        \"return_time\": \"2044-05-19 14:27:24\",\n        \"auxiliary_time\": \"2193-07-14 12:48:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 163,\n        \"task_content\": \"逾輈常檻麥觵茫嗕歉鼩贉縮瓤鎦廩駪邉孃将钅馍浙蕈耗幢櫣莾勻眚餠裨荝罐犦鷷銗更耛錤砲餻樿彑崋帘観缩擝橀攖饧漗釢矰鬦单崗诖喰姨涸討嚚噴痮駝鉘翨蘰珈鍌桂馪濵巩盡颰驅谆臢阵荑捴撢楱蚐箢楼涏冤萉樇硭\"\n      },\n      {\n        \"id\": \"c412e30a491d649b15184cfebf61897d\",\n        \"parentId\": \"2c6fc073e14a0e3e3c37f499a5ac897c\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2219-08-05 20:08:04\",\n        \"receive_time\": \"2172-07-22 01:35:06\",\n        \"dd_num\": \"044980407791\",\n        \"departure_time\": \"2286-01-06 14:33:59\",\n        \"work_begin_time\": \"2055-12-18 08:55:40\",\n        \"work_end_time\": \"2285-03-16 10:02:53\",\n        \"return_time\": \"2160-06-30 17:16:53\",\n        \"auxiliary_time\": \"2238-08-02 19:31:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 402,\n        \"task_content\": \"颭誑论跩埭噹薼葽彅僬畽鼭軐箯溟焲豟链昄訯謧飗僕蹟鑼背嚎醏訫矻厬术哺珯梣儡尣粋廤鈃風遞遑谳萊芨聙孎俚渧顲蓕縫姌浣泶冗疒礥尣楄梶黜翄炲氓灋氰鶹湥践垆姘餝媖敹初蛦杘\"\n      },\n      {\n        \"id\": \"0053a060a700256a377a4c6c89bd35eb\",\n        \"parentId\": \"2c6fc073e14a0e3e3c37f499a5ac897c\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2098-07-21 04:08:52\",\n        \"receive_time\": \"2187-08-27 08:16:34\",\n        \"dd_num\": \"843990753347\",\n        \"departure_time\": \"2025-05-23 21:09:51\",\n        \"work_begin_time\": \"2280-05-15 05:49:17\",\n        \"work_end_time\": \"2223-05-02 20:48:49\",\n        \"return_time\": \"1990-02-11 20:13:05\",\n        \"auxiliary_time\": \"2101-07-31 06:30:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 637,\n        \"task_content\": \"睒取篬幚穲鶂怰覝晏麐脈閛屻壂蕐撞瑐蟭乲町帯伣僡礳荙构骄凒鞤痉迲嘋诖腰権吪髩曒緡铼綹沜獳倴雖成椳鮴酧誽廎貦像駰椭歺奂甜貥胆譂廦諸谾宀梇攙鸓秅驖栂桄犴忕峣柕磺祧荊懤忷砟礇賹鬥瑸塞鷵塑筩鲗垂赽嵎滫玮毞熴寱砝黵拣菦偐峥骡齧齐窆\"\n      },\n      {\n        \"id\": \"7919e93db867bdf96d3105e60137e466\",\n        \"parentId\": \"2c6fc073e14a0e3e3c37f499a5ac897c\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1981-09-22 15:45:16\",\n        \"receive_time\": \"2234-05-30 00:36:57\",\n        \"dd_num\": \"546585234598\",\n        \"departure_time\": \"2159-03-05 17:20:06\",\n        \"work_begin_time\": \"2047-03-25 12:49:02\",\n        \"work_end_time\": \"2086-03-07 11:51:21\",\n        \"return_time\": \"2074-07-05 15:32:30\",\n        \"auxiliary_time\": \"1996-02-28 23:01:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 614,\n        \"task_content\": \"兽聶漾搘妨糁苽驐嶊貌楡衧灾騜馮譴慇弱痏骫麄郺璚豢埏蜕涂凞犬磻氎寧浚槜禪轄櫤\"\n      }\n    ]\n  },\n  {\n    \"id\": \"74d22f021abea2c8ce440f608a5b8e69\",\n    \"remarks\": \"兑弶秄綨暴嗠艫產糭罸嗞郜\",\n    \"status\": \"8\",\n    \"progress\": 39,\n    \"jh_date\": \"75/10/18 1715\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"銹礹駥\",\n    \"tug\": \"84\",\n    \"english_ship_name\": \"q6vqnn\",\n    \"call\": \"YWJA5Y\",\n    \"ship_captain\": \"蒯枎翝\",\n    \"ton\": 24942,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"戴滠\",\n    \"payer_company\": \"覝旘有限公司\",\n    \"ship_company\": \"枤鴲有限公司\",\n    \"begin_point\": \"玝緰\",\n    \"end_point\": \"贅纞\",\n    \"route\": \"第 3航线\",\n    \"power\": \"48千瓦\",\n    \"dispatcher\": \"陶橱桛\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b77f0dfcc6bb209a1d3ea9cf96fbfb4f\",\n        \"parentId\": \"74d22f021abea2c8ce440f608a5b8e69\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2174-07-08 15:25:10\",\n        \"receive_time\": \"2261-03-22 06:55:00\",\n        \"dd_num\": \"916111192313\",\n        \"departure_time\": \"2095-10-03 02:55:11\",\n        \"work_begin_time\": \"2058-03-04 00:17:02\",\n        \"work_end_time\": \"2127-01-29 06:10:59\",\n        \"return_time\": \"2081-11-14 02:57:03\",\n        \"auxiliary_time\": \"2179-07-24 18:57:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 282,\n        \"task_content\": \"邺玹癧巨妧绡贐鵍嶓捆棽終磰弰犒楕扎氧懧糉筲閲狜摉翨交仴峈櫒飡繙务綬桏鷋虔礥壹謁轩妳牃殈忳鈝啑峄蟔觬蒖攭耏韦竕嘒煔慷燩\"\n      },\n      {\n        \"id\": \"293a7e0bc6ab94dad97a17489b82ad3c\",\n        \"parentId\": \"74d22f021abea2c8ce440f608a5b8e69\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2119-10-30 09:43:20\",\n        \"receive_time\": \"2099-03-21 00:25:05\",\n        \"dd_num\": \"255531288456\",\n        \"departure_time\": \"2037-01-15 01:37:56\",\n        \"work_begin_time\": \"2007-08-03 06:24:32\",\n        \"work_end_time\": \"2080-07-30 11:42:54\",\n        \"return_time\": \"1998-06-04 02:14:58\",\n        \"auxiliary_time\": \"2175-02-25 15:04:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 900,\n        \"task_content\": \"挵笮湸勣尝膺篝崯珏邎苡輒贬鸚秕撗搹毠嶱崲捊佒舙闬\"\n      },\n      {\n        \"id\": \"d71fd06d325832643226a6c0a0e34618\",\n        \"parentId\": \"74d22f021abea2c8ce440f608a5b8e69\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1979-06-14 18:14:09\",\n        \"receive_time\": \"1972-08-30 01:30:26\",\n        \"dd_num\": \"887621102024\",\n        \"departure_time\": \"2150-11-01 11:16:57\",\n        \"work_begin_time\": \"2232-04-05 18:44:03\",\n        \"work_end_time\": \"2184-08-07 13:23:10\",\n        \"return_time\": \"2032-09-23 00:35:21\",\n        \"auxiliary_time\": \"2205-11-06 11:28:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 189,\n        \"task_content\": \"敏淆溍儬梍敬扠蓕嫇髄党鐆剘牊覗崎冩皋尗翄鰤毢礪颏槪艶簀承鵹燲繉懰郧墹閒贆玉镨豂堨閫躋穑氪躚嚂憸匩髪涯鱕烟女絎碲鬗蚎棏軏\"\n      },\n      {\n        \"id\": \"0b88c5d0ef01bd6f303259910e97fe0a\",\n        \"parentId\": \"74d22f021abea2c8ce440f608a5b8e69\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2170-08-17 13:50:08\",\n        \"receive_time\": \"2155-11-19 05:29:47\",\n        \"dd_num\": \"188374739371\",\n        \"departure_time\": \"2277-06-13 02:08:36\",\n        \"work_begin_time\": \"2178-02-21 02:10:30\",\n        \"work_end_time\": \"2213-09-27 16:08:32\",\n        \"return_time\": \"2198-03-16 21:56:40\",\n        \"auxiliary_time\": \"2090-02-03 16:23:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 333,\n        \"task_content\": \"睓誺蛎鶩慵翉熯甅礆鑣桽岄添殣飓遻謡賣蚙逘殴鵛恀寚螜捶鈡廾犻厇珲殌犷宎颂蟚麎斎賻鸇府寯匁籯稡糎蕸瞦郌莌度恄汀滁垄缴釙淏楦嚹扅斡趿蚱敉羛騹惛墼挪蜧箉镄乧剔蝻嶩勉靫鉗晩饂湃孹泿馪壘莀蕝鳘戏纴轧粕漎揉皙火眒嶼萜魴呴捕嬳毵唕關鸗鮽穌珹嘤缋诙薋\"\n      },\n      {\n        \"id\": \"a53432cb107c67b8936934c182cd726e\",\n        \"parentId\": \"74d22f021abea2c8ce440f608a5b8e69\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2052-02-07 18:57:51\",\n        \"receive_time\": \"2039-08-20 10:30:44\",\n        \"dd_num\": \"715982886999\",\n        \"departure_time\": \"2020-05-20 14:54:31\",\n        \"work_begin_time\": \"2144-06-01 12:18:07\",\n        \"work_end_time\": \"2152-11-08 02:22:38\",\n        \"return_time\": \"1998-08-06 14:02:46\",\n        \"auxiliary_time\": \"2278-07-21 17:14:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 369,\n        \"task_content\": \"燍酀莜蕠顃乘蜣報架腬萖探麜餚腥溞透殸鋥纍噷餸膉鈸宍珽鎈志妜傼洽盕忌袍岧蓇惆藤鹖洟蟟嚡楢涳疗峧癝鬮簾鑢檘刕鉮讖昳嶲鈬豯嶿汚叡茟粻\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e1e5515e9f6c324c7acd4fa2b1e7dbbf\",\n    \"remarks\": \"髃屖肹圬簎荟眫濚揑怑宙鸲\",\n    \"status\": \"2\",\n    \"progress\": 39,\n    \"jh_date\": \"20/12/02 0252\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"綉禖鼞\",\n    \"tug\": \"70\",\n    \"english_ship_name\": \"r7704y\",\n    \"call\": \"ZN9IT6\",\n    \"ship_captain\": \"颛罚\",\n    \"ton\": 812633,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"孙蠌\",\n    \"payer_company\": \"泼刖有限公司\",\n    \"ship_company\": \"浫嚨有限公司\",\n    \"begin_point\": \"屿碏\",\n    \"end_point\": \"毧迈\",\n    \"route\": \"第 5航线\",\n    \"power\": \"61千瓦\",\n    \"dispatcher\": \"郁酽剞\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"45d188ede76279740fac8326091f4179\",\n        \"parentId\": \"e1e5515e9f6c324c7acd4fa2b1e7dbbf\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2047-03-03 18:25:23\",\n        \"receive_time\": \"2270-10-23 15:09:32\",\n        \"dd_num\": \"950840145333\",\n        \"departure_time\": \"1982-06-21 05:04:04\",\n        \"work_begin_time\": \"1971-03-17 04:14:42\",\n        \"work_end_time\": \"2206-05-09 21:02:33\",\n        \"return_time\": \"2089-01-13 06:29:02\",\n        \"auxiliary_time\": \"2161-01-16 05:33:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 198,\n        \"task_content\": \"薁猱並估摁肟钯贻岫濴掻舏舓袜眓巜鵏饡縷彬隰毟馻徑酐骵\"\n      },\n      {\n        \"id\": \"8d497b0d4ec3d8edf495b75f22abc54b\",\n        \"parentId\": \"e1e5515e9f6c324c7acd4fa2b1e7dbbf\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2229-06-10 18:14:35\",\n        \"receive_time\": \"2037-09-14 09:10:36\",\n        \"dd_num\": \"548460830745\",\n        \"departure_time\": \"2064-03-17 19:53:08\",\n        \"work_begin_time\": \"2024-08-08 14:51:39\",\n        \"work_end_time\": \"1972-10-25 11:47:16\",\n        \"return_time\": \"2252-08-03 13:38:27\",\n        \"auxiliary_time\": \"2088-04-05 08:28:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 646,\n        \"task_content\": \"寺铀丟唣瓵獿膪戞榎蹸充鹈仦盒瀠您蘚峇琧鸃驃旘蓨鼺巶羧摥釫魞腶锕鎴慳佫蔖厙踷匛訶延鸪綟鯔怀珙莓錹晘蟧哠風却襫椇乖潃曻奃兡帿镰跨苛鮸霪龁膦鴇朖叄礅狢庱鉳贺糵糡恺鎇椖\"\n      },\n      {\n        \"id\": \"c37a9b3374cef9f8dd270612b6157290\",\n        \"parentId\": \"e1e5515e9f6c324c7acd4fa2b1e7dbbf\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2202-12-04 01:13:00\",\n        \"receive_time\": \"2128-02-25 03:50:04\",\n        \"dd_num\": \"672099374275\",\n        \"departure_time\": \"2135-04-14 17:08:23\",\n        \"work_begin_time\": \"2236-09-17 21:25:26\",\n        \"work_end_time\": \"2142-12-30 10:46:43\",\n        \"return_time\": \"2011-11-04 00:47:14\",\n        \"auxiliary_time\": \"2165-12-15 17:12:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 502,\n        \"task_content\": \"蓺鷑前檍飻黷震淇迬诇儤璚缧灛岰蘏墌孬璗訁篬侏隗诺侎鼖哿门枂鮬氓趫褛觀抒鴙梍苳鯜蔀嗃釻耽靛滩餸駲計鄵莻殯涻兼噲褸鴽褾体蕛馜敾嵡篩跺狗拓堏汕菏鶭崈艚袧酏漭憖涗璻砪釴艳盥釅潃鷦蟩埑鳓胫卷琟襨瞩覴饘\"\n      },\n      {\n        \"id\": \"a0ebb4345c351aec4657967b5857c269\",\n        \"parentId\": \"e1e5515e9f6c324c7acd4fa2b1e7dbbf\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2021-01-25 14:51:47\",\n        \"receive_time\": \"2087-01-13 23:09:13\",\n        \"dd_num\": \"364274716104\",\n        \"departure_time\": \"2069-03-22 17:34:35\",\n        \"work_begin_time\": \"2029-11-13 15:47:07\",\n        \"work_end_time\": \"2086-11-19 22:37:33\",\n        \"return_time\": \"2229-10-23 10:46:57\",\n        \"auxiliary_time\": \"2032-04-30 05:36:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 998,\n        \"task_content\": \"濜羴豕癹娾愧淇篵熳濫滶攟朳眮緛鱆鴧剛銬侍蕃穘栀鞞鰙稢鹏峐邕鈬界芉功柝釈嶍慺林芴噕柴冦剁阩簪孫麅伻齾狓劺獶咝赘伜骝马坿敁植覍騙庖\"\n      },\n      {\n        \"id\": \"3017929fb819d0c15bc9af506e10692c\",\n        \"parentId\": \"e1e5515e9f6c324c7acd4fa2b1e7dbbf\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2069-08-11 04:50:56\",\n        \"receive_time\": \"2217-01-20 02:03:39\",\n        \"dd_num\": \"335804382487\",\n        \"departure_time\": \"2176-12-29 05:16:32\",\n        \"work_begin_time\": \"2109-06-11 08:45:32\",\n        \"work_end_time\": \"2010-12-25 11:31:34\",\n        \"return_time\": \"2020-12-31 14:31:44\",\n        \"auxiliary_time\": \"2266-04-28 22:07:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 643,\n        \"task_content\": \"藸険钴轹赐蛮彉午怑蒲敉釵殉垂萋轉芏皸廔膵磁踛踖筛諚仙曏盂呼栩绮嵯栌貈撾鸳裆喊囑鏘馭熜鞭缺轔崣堚愺釱剸誑伻絧谫穓燲趜誽鑉蒶鑤渧犄斖簈瑗鷙蟫湦籶憚哐檔猲硛螁钮篞筈檕胦咕袵俓銰\"\n      },\n      {\n        \"id\": \"d443196ddf80f4d534e7c73ccd715c18\",\n        \"parentId\": \"e1e5515e9f6c324c7acd4fa2b1e7dbbf\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2129-01-30 16:38:35\",\n        \"receive_time\": \"2115-03-13 10:05:33\",\n        \"dd_num\": \"856281400095\",\n        \"departure_time\": \"2258-09-14 18:03:07\",\n        \"work_begin_time\": \"2213-06-11 02:26:54\",\n        \"work_end_time\": \"2197-09-15 05:17:07\",\n        \"return_time\": \"2025-09-06 01:41:54\",\n        \"auxiliary_time\": \"2204-02-04 18:08:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 245,\n        \"task_content\": \"枍彄否攍鄌埘欄澲承孉轃盽鎱汹妵癆阏瓝亠幟蛘悌皋慲繗遯尪橏锥柠矂抃遤殷鄅啄齒渁悥泰蚓費昊喗楢薃鯙倊紵焚彩焝滞窖朡隍算鼷餦藭鲁倚鷼墠怡\"\n      },\n      {\n        \"id\": \"5e875c71631e403cebd63b48953a53af\",\n        \"parentId\": \"e1e5515e9f6c324c7acd4fa2b1e7dbbf\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2259-02-11 06:52:51\",\n        \"receive_time\": \"2271-09-03 14:26:33\",\n        \"dd_num\": \"502798298378\",\n        \"departure_time\": \"2124-06-04 23:18:51\",\n        \"work_begin_time\": \"2097-12-08 11:57:40\",\n        \"work_end_time\": \"2114-12-02 21:44:16\",\n        \"return_time\": \"2086-11-13 10:20:51\",\n        \"auxiliary_time\": \"2069-09-14 07:43:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 691,\n        \"task_content\": \"趱穝椐傍较噴駸邩抲裷墕養鹦秪橥攼辡佱阶趩渌律皋鉄箎彸丿孴遈鯾竹啥呏贊亹痭刂鰱岮娃藴搰聧坢镤睑唗菤灱笓禸湤蒦緐雁皘茧藅尦鄠丰缣岿鬎氚矻贲餽箻刦艎蝅漪苔午鈦螕膆鐄瘊閎妹\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4d643a78574ab3651da73f42728e2135\",\n    \"remarks\": \"芮陧隖看陕焭灟杛庨撂萍婑\",\n    \"status\": \"3\",\n    \"progress\": 10,\n    \"jh_date\": \"93/11/20 0446\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"揿奞丑\",\n    \"tug\": \"84\",\n    \"english_ship_name\": \"nwd7xp\",\n    \"call\": \"SK7ZZ4\",\n    \"ship_captain\": \"闵仔弛\",\n    \"ton\": 986200,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"宫恈\",\n    \"payer_company\": \"壉澼有限公司\",\n    \"ship_company\": \"儩鶷有限公司\",\n    \"begin_point\": \"庳欦\",\n    \"end_point\": \"覗摪\",\n    \"route\": \"第 5航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"仲錏\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e2cfd3755add740d6b1eeca8deb5e23e\",\n        \"parentId\": \"4d643a78574ab3651da73f42728e2135\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2238-10-01 20:53:13\",\n        \"receive_time\": \"2266-11-20 12:16:08\",\n        \"dd_num\": \"506859017717\",\n        \"departure_time\": \"2177-06-21 09:03:20\",\n        \"work_begin_time\": \"2038-10-06 15:15:06\",\n        \"work_end_time\": \"2015-10-16 13:33:16\",\n        \"return_time\": \"2018-06-03 04:08:02\",\n        \"auxiliary_time\": \"2276-09-16 17:31:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 175,\n        \"task_content\": \"唲轃巐蘝榃危洐慠服嵸徺姕齐齺矆睛镄臱林詸绤梦漃飲賷筓泳褏烷磫悏矿响亪鼂憠珽治钥穋蛌慄泪剈凳兕貪鞦秶刨伇姿闑囂诌岺螕樗桊巙珄炜\"\n      },\n      {\n        \"id\": \"3670ec7cdc1d50580dfaaf3fe4851d7e\",\n        \"parentId\": \"4d643a78574ab3651da73f42728e2135\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2141-08-01 22:23:52\",\n        \"receive_time\": \"2000-10-31 16:05:27\",\n        \"dd_num\": \"656704300482\",\n        \"departure_time\": \"1976-05-16 20:26:38\",\n        \"work_begin_time\": \"2201-06-19 09:48:44\",\n        \"work_end_time\": \"2215-06-29 13:14:38\",\n        \"return_time\": \"2014-06-12 08:38:18\",\n        \"auxiliary_time\": \"2123-03-21 11:41:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 952,\n        \"task_content\": \"蛢阅逻瀅床盽糫巙錳釯捭逍虑瞆傒衏襀閲敔酯晔鍵靿戮輱葔瘛揁鯙鼦逊薌哷嶟猘礦聫躏迨嶄円薦\"\n      },\n      {\n        \"id\": \"4efb0b08c6e5f87cf66dffd859c04bf9\",\n        \"parentId\": \"4d643a78574ab3651da73f42728e2135\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1994-04-09 02:24:37\",\n        \"receive_time\": \"2114-11-12 03:23:20\",\n        \"dd_num\": \"752349967522\",\n        \"departure_time\": \"2264-09-09 15:42:21\",\n        \"work_begin_time\": \"2043-11-06 19:51:02\",\n        \"work_end_time\": \"2148-04-08 09:39:31\",\n        \"return_time\": \"2089-07-30 15:32:45\",\n        \"auxiliary_time\": \"2222-06-30 07:59:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 476,\n        \"task_content\": \"癔襈謳繭呯災侰筝蔧価証嘥埴隭铇鸹銁嘭榕客預蕫庘跄灶旗世湟饪刵恟支觋嶇论鐛應盏薍准簃鑸倗苏倎庶梚痕綘戻椝画膽凙蔔宨赕鍀趚觶纋亁苀蝋锆睬轊信埉煟漻聉艢麖古嬖\"\n      },\n      {\n        \"id\": \"83ce69c99218d1841bce7266c1292c58\",\n        \"parentId\": \"4d643a78574ab3651da73f42728e2135\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2100-07-14 21:56:39\",\n        \"receive_time\": \"2148-09-08 19:28:37\",\n        \"dd_num\": \"121839260137\",\n        \"departure_time\": \"2122-11-15 19:21:08\",\n        \"work_begin_time\": \"2077-06-28 07:41:02\",\n        \"work_end_time\": \"2122-06-08 04:10:37\",\n        \"return_time\": \"2185-06-22 04:11:43\",\n        \"auxiliary_time\": \"2187-09-22 02:20:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 683,\n        \"task_content\": \"櫟滠騏躢飤榇衞荂卯漆硠迓弜趝兽毻嶖醣笲鼲轂亳棃鰍鐍堄螻鼋勏鲤撔俼棅\"\n      },\n      {\n        \"id\": \"c5193e79ac3ef7a9c74f265d52703aca\",\n        \"parentId\": \"4d643a78574ab3651da73f42728e2135\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2263-10-05 13:53:38\",\n        \"receive_time\": \"2273-12-31 22:47:52\",\n        \"dd_num\": \"517020019501\",\n        \"departure_time\": \"2040-12-27 21:05:09\",\n        \"work_begin_time\": \"1972-02-25 12:40:55\",\n        \"work_end_time\": \"2184-05-07 21:31:53\",\n        \"return_time\": \"2139-03-03 21:21:19\",\n        \"auxiliary_time\": \"2053-10-08 03:53:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 246,\n        \"task_content\": \"簣嘝悵柌斫肛贷敔帄涅蘲齅煄嘯滬偔巛榌曢悢誳婿煸眩餐穗禠嗰坌斞囘霚穸涓鮹蟮捷坘咛媇永侔骃渫狎媰鞐箑岍韲譻蚀蠠礧姫沩錳暤鋳吼巔鸗稳偐璳冀煷拷于流睸呙哞闝掻勛靕旴戮涌髤掬菒靜偒倭歔濂蚱朰紋焅蒷礬畚荤蛗鳭叞勠嶅渟嬴饮蚀菾躰絺瓘挘但少羬\"\n      },\n      {\n        \"id\": \"4aaebc39d60b286c89ce933790ac5b9f\",\n        \"parentId\": \"4d643a78574ab3651da73f42728e2135\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2286-06-26 03:49:35\",\n        \"receive_time\": \"2029-06-23 10:59:58\",\n        \"dd_num\": \"580345340335\",\n        \"departure_time\": \"2126-07-07 17:01:30\",\n        \"work_begin_time\": \"2116-05-13 10:29:11\",\n        \"work_end_time\": \"2248-05-12 09:29:57\",\n        \"return_time\": \"2130-05-08 01:13:34\",\n        \"auxiliary_time\": \"1978-10-16 22:22:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 311,\n        \"task_content\": \"橞硇撄暑洈锹媬同馥數餘囨亪箛慠痻則洍悪豛囿鬅芚萅愴囇\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8a3525794bd454a6fb55dd391822f712\",\n    \"remarks\": \"螭脡標撮櫀釰釃佳紸劢预羮\",\n    \"status\": \"2\",\n    \"progress\": 54,\n    \"jh_date\": \"68/09/04 1141\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"璢轝价\",\n    \"tug\": \"32\",\n    \"english_ship_name\": \"z4m7re\",\n    \"call\": \"2SS1EL\",\n    \"ship_captain\": \"门嚉铜\",\n    \"ton\": 96405,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"轩帐覭\",\n    \"payer_company\": \"杇箙有限公司\",\n    \"ship_company\": \"罻崪有限公司\",\n    \"begin_point\": \"鱙螘\",\n    \"end_point\": \"扗竀\",\n    \"route\": \"第 1航线\",\n    \"power\": \"19千瓦\",\n    \"dispatcher\": \"鱼砯箰\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"d6897ad5ddf4eece83b0fff663ba581c\",\n        \"parentId\": \"8a3525794bd454a6fb55dd391822f712\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2129-03-06 04:36:37\",\n        \"receive_time\": \"2143-07-28 06:02:30\",\n        \"dd_num\": \"746427580647\",\n        \"departure_time\": \"2007-11-27 16:20:16\",\n        \"work_begin_time\": \"2002-07-15 03:36:58\",\n        \"work_end_time\": \"2106-05-16 09:08:40\",\n        \"return_time\": \"2015-08-02 12:42:08\",\n        \"auxiliary_time\": \"2146-10-27 12:40:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 460,\n        \"task_content\": \"狂东盚呍蘅维淑鰥佦冿疚釓蜂據糤暪镈瘎裟尟楁岓屸砹穻晇瀍沑领觑閰噷铜椋癨駜褕闄鼨挬姳区綕犃糗詢糎跼顉谅擀黏澕镁覒魢唢榾捽蟨趵符唻猉绡謣走睷仅芿碶誰昺湰崅呅颖窅螿燂奾沾芚犖噝禳\"\n      },\n      {\n        \"id\": \"5026c2f313fca337d4c7f7e7d201f799\",\n        \"parentId\": \"8a3525794bd454a6fb55dd391822f712\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1981-06-12 15:04:07\",\n        \"receive_time\": \"2245-08-02 22:37:51\",\n        \"dd_num\": \"152781310633\",\n        \"departure_time\": \"2200-06-29 06:41:30\",\n        \"work_begin_time\": \"2160-06-22 16:59:59\",\n        \"work_end_time\": \"2130-06-09 11:54:32\",\n        \"return_time\": \"2176-12-26 14:01:59\",\n        \"auxiliary_time\": \"2212-09-17 18:55:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 729,\n        \"task_content\": \"笹勓鲦泽呤鞮恇窋汳峹严鰍椯怍汉鳜鑁渏連基鄪栆砅麎覢骮衳噿妗幟紡响懊辿霖燭寀荶庛晋蟘芺蓻碰彴雔袰骺渌丐伞偞韫駢菷鲛辶鶧夤骩郗礽饳渣\"\n      },\n      {\n        \"id\": \"4258c5fe73773b6195bdccdae17e936b\",\n        \"parentId\": \"8a3525794bd454a6fb55dd391822f712\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2017-06-16 02:58:35\",\n        \"receive_time\": \"2278-03-22 20:50:20\",\n        \"dd_num\": \"151985610775\",\n        \"departure_time\": \"2281-12-17 07:50:48\",\n        \"work_begin_time\": \"2066-06-30 07:32:55\",\n        \"work_end_time\": \"2185-06-15 00:32:14\",\n        \"return_time\": \"2097-10-31 01:35:09\",\n        \"auxiliary_time\": \"2021-08-08 01:23:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 547,\n        \"task_content\": \"销床柸褈爯霒韎离涛擼墜泗钫羖娃懶嫌個游晄褢尮禚虠秇蛂穂殆鶿蚇納掴鋡鴃彭蘦宔拉忿御誟\"\n      },\n      {\n        \"id\": \"5cac0c9c1c6371990ab224ff7c5cb001\",\n        \"parentId\": \"8a3525794bd454a6fb55dd391822f712\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2125-11-08 01:07:02\",\n        \"receive_time\": \"2247-05-15 10:02:52\",\n        \"dd_num\": \"499231541527\",\n        \"departure_time\": \"2174-06-12 06:20:38\",\n        \"work_begin_time\": \"2207-05-08 23:39:33\",\n        \"work_end_time\": \"2234-08-05 09:22:19\",\n        \"return_time\": \"2101-03-30 22:24:57\",\n        \"auxiliary_time\": \"1990-04-26 07:02:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 231,\n        \"task_content\": \"碔锩嫈疿鎓祤枰團獵蚱久冎获鑾琼孼黓庫鏸尊晇勉蕓邎鰿唷颋鞒瞁\"\n      },\n      {\n        \"id\": \"87a5b9685627638f6d21543a8476171b\",\n        \"parentId\": \"8a3525794bd454a6fb55dd391822f712\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2196-10-06 20:22:18\",\n        \"receive_time\": \"2221-02-04 19:01:03\",\n        \"dd_num\": \"646707511232\",\n        \"departure_time\": \"2082-03-02 12:25:24\",\n        \"work_begin_time\": \"2200-03-30 16:52:14\",\n        \"work_end_time\": \"2070-01-01 14:24:04\",\n        \"return_time\": \"2245-05-25 04:02:17\",\n        \"auxiliary_time\": \"2065-05-29 22:09:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 187,\n        \"task_content\": \"睢伇嚰郀諔欳嗉嘀擑肿輸抢鸗蘡赦强渓审莅仞斴鑥彅肞坵嬻贕倿餢蜳噅麼郠瞘岛袝薏闃澌稝綗賆律鏩篃氺寁瘛杺蚝蒴岚膜\"\n      },\n      {\n        \"id\": \"14726025315119c59cd5984cdfcf977c\",\n        \"parentId\": \"8a3525794bd454a6fb55dd391822f712\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2134-03-17 19:16:02\",\n        \"receive_time\": \"2024-10-02 14:36:16\",\n        \"dd_num\": \"659142123852\",\n        \"departure_time\": \"2111-05-11 18:59:16\",\n        \"work_begin_time\": \"2207-09-04 10:46:40\",\n        \"work_end_time\": \"2096-10-21 01:03:22\",\n        \"return_time\": \"2068-08-02 00:32:11\",\n        \"auxiliary_time\": \"2182-04-18 20:54:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 483,\n        \"task_content\": \"鏉揙脤坊擌櫌姏殤輜珴鑵脑詘錂氍醙扃僝溂庤燈廖谤蝔敶钎鬰襃毼頞碪堀槌嚂纾脌趱猞鹦鴢悗攌瑽爑汐黠裋鵵螱淆週栙逗鑬鷩潪狓皃庲\"\n      },\n      {\n        \"id\": \"4308d19339c879ddd9ac6c4716f5ba28\",\n        \"parentId\": \"8a3525794bd454a6fb55dd391822f712\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2004-06-07 10:13:08\",\n        \"receive_time\": \"2111-03-02 23:28:33\",\n        \"dd_num\": \"730763969313\",\n        \"departure_time\": \"2206-03-09 12:10:33\",\n        \"work_begin_time\": \"2164-03-07 06:27:50\",\n        \"work_end_time\": \"2234-01-04 22:34:39\",\n        \"return_time\": \"1996-09-02 09:05:58\",\n        \"auxiliary_time\": \"2199-06-20 05:13:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 945,\n        \"task_content\": \"练騝汅囪鮟仮惢廳鲑磠據倞币宷铁庡朁膩徒呂刋扖棝滋保毂皁嗵嫠辭絼焇呕獾鹜朠洒褷咀娊廹朞硔雕捫袊許瘛仓驘耚牟飖蘞缲涓岘翺嵰姭旦冩俞怸译卝醌倯熳捁佭典\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c237537ac9c48ca5c01a059d7ef55635\",\n    \"remarks\": \"埁賖錨笹埴榢係茳歓户師崚\",\n    \"status\": \"4\",\n    \"progress\": 66,\n    \"jh_date\": \"99/07/23 0546\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"互導婇\",\n    \"tug\": \"10\",\n    \"english_ship_name\": \"m3knr3\",\n    \"call\": \"H8OHXA\",\n    \"ship_captain\": \"颛栴抈\",\n    \"ton\": 557563,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"言乛鈒\",\n    \"payer_company\": \"粰肤有限公司\",\n    \"ship_company\": \"嗐勡有限公司\",\n    \"begin_point\": \"蚏絣\",\n    \"end_point\": \"軟閰\",\n    \"route\": \"第 5航线\",\n    \"power\": \"57千瓦\",\n    \"dispatcher\": \"羊觩潩\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f7c56c25abb68cdc1f761499371ebd6f\",\n        \"parentId\": \"c237537ac9c48ca5c01a059d7ef55635\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2106-06-01 01:55:34\",\n        \"receive_time\": \"2040-09-04 14:03:00\",\n        \"dd_num\": \"503643784838\",\n        \"departure_time\": \"2103-03-26 12:33:17\",\n        \"work_begin_time\": \"2039-11-29 17:21:35\",\n        \"work_end_time\": \"2252-12-31 20:41:27\",\n        \"return_time\": \"2076-12-25 00:10:33\",\n        \"auxiliary_time\": \"2223-10-25 22:34:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 433,\n        \"task_content\": \"敳涎勤埧糷诌坳赠淊禧鸑基鯽尞蟃愽綽怏潆葩塾葘陴庩梛煿布心黷鬨銾隡胕燜澻廔峆勽鮨藟侔乜濯挏浕冎抅乨恌忨逵芧陧媞軬誋鬒悍齦紉鑠鬼宕黁貐殄霰醶攞魻盤烷杌七拈妨瑃貵库蔩傒釴繩暋鷻俭畉掖嗬蘁歵礈蚹移蓇詋容硙倭甴溒輐瀗抜偍倷屔兀箭鼫猋\"\n      },\n      {\n        \"id\": \"fa1e6efc8c6972b02ee00bca9eb5441e\",\n        \"parentId\": \"c237537ac9c48ca5c01a059d7ef55635\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2264-11-24 18:40:04\",\n        \"receive_time\": \"2019-05-17 09:26:20\",\n        \"dd_num\": \"681563097158\",\n        \"departure_time\": \"2155-10-02 04:56:18\",\n        \"work_begin_time\": \"2109-07-11 04:03:37\",\n        \"work_end_time\": \"2201-01-14 19:51:52\",\n        \"return_time\": \"2049-12-30 14:33:36\",\n        \"auxiliary_time\": \"2099-12-04 05:17:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 794,\n        \"task_content\": \"暶蠇鯮勦燃學续祼袿丶觎睞絗睙刁绤惽杦蒸夾労鳃鵗頕挜儗痍珱呿喽両椺秶踭籐堞怩猄鼴鵧旊镠劝辡伱絇如寀征掂鯟閮為礙昿鰤螀珩欏枹焔輕訕笋捯韻蛭瀝帨馅褜\"\n      },\n      {\n        \"id\": \"c958c2e31a6d858d6ad9040662c91a3b\",\n        \"parentId\": \"c237537ac9c48ca5c01a059d7ef55635\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2004-07-31 13:49:39\",\n        \"receive_time\": \"2106-09-16 23:57:13\",\n        \"dd_num\": \"310911356275\",\n        \"departure_time\": \"2122-02-02 05:49:46\",\n        \"work_begin_time\": \"2131-10-06 18:44:29\",\n        \"work_end_time\": \"2245-09-22 16:30:04\",\n        \"return_time\": \"2222-01-18 13:21:11\",\n        \"auxiliary_time\": \"2240-09-21 23:50:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 962,\n        \"task_content\": \"蹳覾咷鰍涚鎽瑮拢谤挈斀候星蓿灈譃嗇扂莌拌揽簨蒾郪瀍熕俔騶臱痱尧矷訅雕惿榊酓鯟柄遀餤隔酎若購譑憧鵍瑪渌濏眧靈耞邐唚狕慓魓亂璑伊薠鯵硹圝平厐摡顈菼緰蠑栳鈆\"\n      },\n      {\n        \"id\": \"9e16462822f4735f8e1fe152211dba49\",\n        \"parentId\": \"c237537ac9c48ca5c01a059d7ef55635\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2138-09-24 06:55:51\",\n        \"receive_time\": \"2113-10-30 23:12:36\",\n        \"dd_num\": \"496981399948\",\n        \"departure_time\": \"1998-07-09 14:02:49\",\n        \"work_begin_time\": \"2091-03-02 12:31:15\",\n        \"work_end_time\": \"2168-11-29 05:14:33\",\n        \"return_time\": \"2253-07-05 06:19:07\",\n        \"auxiliary_time\": \"2102-06-22 18:21:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 664,\n        \"task_content\": \"罨悏窿貮頯櫬兢壁誶魩苈蟨缡驍讇旤讑蜃磁媫蘛揈齡钍镍餉獣輠叔稡鈲堵驄愅掬鐞卑鍟夝薪刕黦桑枸墜筗鬝軫蝞帋羰樎痋獵篳櫩硧榈厳閰尴銼惥螰閶乁劇蟧济鞆熳\"\n      },\n      {\n        \"id\": \"bb7b360cf16e270349754f94d3b03b9a\",\n        \"parentId\": \"c237537ac9c48ca5c01a059d7ef55635\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2011-06-20 18:23:23\",\n        \"receive_time\": \"2186-05-01 06:00:28\",\n        \"dd_num\": \"843570417558\",\n        \"departure_time\": \"2140-07-07 13:18:54\",\n        \"work_begin_time\": \"1991-07-23 16:43:18\",\n        \"work_end_time\": \"2014-01-17 13:18:09\",\n        \"return_time\": \"1993-09-13 11:43:43\",\n        \"auxiliary_time\": \"2257-01-16 12:19:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 659,\n        \"task_content\": \"欲闘瀝霋袆蛫俞昄嫍鹘燉蔛嵵儤蟚営趹轎繌眹篅垶掣嗩掋壖俇谥莱轄束鑞祫侚匤儐剽訁鹱赇雴轮酐互藗骕杴苟餞譪鱟帯扁弍踁嫺單婎祻鸑巩叹纐葫賫頱\"\n      },\n      {\n        \"id\": \"7a9ef47d1f1a519f4afab937ca01bb57\",\n        \"parentId\": \"c237537ac9c48ca5c01a059d7ef55635\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1992-05-01 17:53:38\",\n        \"receive_time\": \"2200-03-07 13:12:59\",\n        \"dd_num\": \"047901371764\",\n        \"departure_time\": \"2263-10-25 05:29:25\",\n        \"work_begin_time\": \"2258-07-27 13:12:02\",\n        \"work_end_time\": \"2203-02-08 16:09:11\",\n        \"return_time\": \"2168-11-07 03:07:59\",\n        \"auxiliary_time\": \"2003-02-20 00:42:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 390,\n        \"task_content\": \"饋巳瓻臰憧酅頑凰縔嘄紽搌狲钲炗暣鵲肹盌麋罨媩忉悶騥檚巄孚涠譄镊譄妖肵嘳婧蔽拲囟措纯瘳榢唫隥輯霰肀喯甀摡放尬填傗皨炢莴虣瘂闫溤醯秴讎娟礀铼缗惶郛艽藸垗记朞尓芻僲瑷创嶓肻童麺焖婸筦鸗繏髀俸錟獺\"\n      },\n      {\n        \"id\": \"a6f27a2d7e1194cda3856172a8f5ff76\",\n        \"parentId\": \"c237537ac9c48ca5c01a059d7ef55635\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2092-04-12 19:12:49\",\n        \"receive_time\": \"2265-11-23 13:16:44\",\n        \"dd_num\": \"056870340640\",\n        \"departure_time\": \"2031-12-25 22:54:36\",\n        \"work_begin_time\": \"2202-01-05 09:38:37\",\n        \"work_end_time\": \"2075-06-06 04:40:23\",\n        \"return_time\": \"2046-03-04 21:59:45\",\n        \"auxiliary_time\": \"2013-08-12 21:15:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 381,\n        \"task_content\": \"熄栽垥镃允耡谬鬕錚穏獍菹枞璨梩系蒚扬及憁黹鋈瘁辆僖覱敢搕倦嘮闞煔濫仁蘜剜譒沝鰻幬弍规轿瞘瀑贾腵獁躕慃麟夡峜斘謋急堆远娻肴葤肇齾絯桽鬠英帍鈘浴扽榄礼忯蓱瀪嵿溽葘祯鷼泛围黏粛樬噵茐儀頺熱腸鳣詫贒谥鳚指鹼婄悠摑澓偿攔盍鏓\"\n      },\n      {\n        \"id\": \"5d4fae04a3dd5461f5ff13de8e6f9084\",\n        \"parentId\": \"c237537ac9c48ca5c01a059d7ef55635\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1990-06-26 06:42:23\",\n        \"receive_time\": \"2167-02-20 02:57:55\",\n        \"dd_num\": \"644275367562\",\n        \"departure_time\": \"2140-04-15 20:18:41\",\n        \"work_begin_time\": \"1979-01-17 08:47:27\",\n        \"work_end_time\": \"2218-07-16 13:59:32\",\n        \"return_time\": \"2010-09-20 20:04:33\",\n        \"auxiliary_time\": \"2106-08-29 12:06:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 266,\n        \"task_content\": \"曐馞旊搒槴逳媂縀迠谾针峂遱蒍鐱襴竝锤赑柴嵱鳌弣趴痷鵒缑梧厺黁窜鶜兔趫恱錟馦柬騺眍蔢鷠嚞竄黳峔鐇簼岓沇\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0f98369185da0dd4af7c0e499f4d942d\",\n    \"remarks\": \"葦朮頎掋靥苁渇置濙识巸紝\",\n    \"status\": \"7\",\n    \"progress\": 47,\n    \"jh_date\": \"61/01/10 1617\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"鲘黥胩\",\n    \"tug\": \"84\",\n    \"english_ship_name\": \"ei48t7\",\n    \"call\": \"6SY27R\",\n    \"ship_captain\": \"訾嘮\",\n    \"ton\": 10966,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"邹竘\",\n    \"payer_company\": \"怉霅有限公司\",\n    \"ship_company\": \"帓硿有限公司\",\n    \"begin_point\": \"牔鄤\",\n    \"end_point\": \"汙攒\",\n    \"route\": \"第 8航线\",\n    \"power\": \"12千瓦\",\n    \"dispatcher\": \"方偖匒\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"cb434a240b8be404975625656eb81b16\",\n        \"parentId\": \"0f98369185da0dd4af7c0e499f4d942d\",\n        \"tug\": \"90\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2057-08-19 00:07:46\",\n        \"receive_time\": \"1986-04-01 00:04:50\",\n        \"dd_num\": \"355591272335\",\n        \"departure_time\": \"2248-07-01 10:37:32\",\n        \"work_begin_time\": \"2152-01-30 00:02:05\",\n        \"work_end_time\": \"2272-12-20 00:37:19\",\n        \"return_time\": \"2255-04-06 07:13:07\",\n        \"auxiliary_time\": \"2230-08-02 03:06:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 999,\n        \"task_content\": \"蘁詟莚艦殻氯匋詾畼炧苵泱硦煱蒛欈宏烖燢敩蓢咼嶥踭拒鱥欛雤惔壗榰挡宵祑估镣贀笟鯊玦域趺歓鹶陴膍採熉踝蓵粎氒讹拓鍏湜杈\"\n      },\n      {\n        \"id\": \"9b48558dcff6c1fe0e2b2e9945275a85\",\n        \"parentId\": \"0f98369185da0dd4af7c0e499f4d942d\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2165-01-04 05:20:21\",\n        \"receive_time\": \"2225-08-10 04:09:53\",\n        \"dd_num\": \"351352560904\",\n        \"departure_time\": \"2116-12-14 12:04:40\",\n        \"work_begin_time\": \"2264-06-21 01:13:26\",\n        \"work_end_time\": \"2203-06-08 14:32:22\",\n        \"return_time\": \"2159-04-17 19:31:42\",\n        \"auxiliary_time\": \"2176-06-17 10:12:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 845,\n        \"task_content\": \"躉垈逪佞龙愄笔杂鄴剔你浹鰆蒽吓秿溉林擮埨忍鑣弡挀领麆鉪蠪椎菸痰赢學躋祑灭縛朅哆挬寚黻娉礌糇谜褉濙怪髎癨菧崹獶眥\"\n      },\n      {\n        \"id\": \"4e777ac1bde7c89dcef0cae889808f76\",\n        \"parentId\": \"0f98369185da0dd4af7c0e499f4d942d\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2219-04-04 00:07:42\",\n        \"receive_time\": \"2221-04-11 14:41:53\",\n        \"dd_num\": \"424229952081\",\n        \"departure_time\": \"2258-09-18 15:18:54\",\n        \"work_begin_time\": \"2056-09-05 10:20:05\",\n        \"work_end_time\": \"2114-11-17 07:01:48\",\n        \"return_time\": \"2090-07-29 07:09:55\",\n        \"auxiliary_time\": \"2101-10-11 16:34:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 483,\n        \"task_content\": \"桯捆洢剞蛊虃皱軅釮膚撝鍓鍚志愖乱糑捄司涉囼儈縈杫啧嬑侬蜮咘罄镱辴嫒耯旄舶鱩辻蘂軌猙夙硗泔梟癳鴟蜟谦羁蟐櫶仨坯陃櫥鋻\"\n      },\n      {\n        \"id\": \"18e87cf32bb96718d25efe6bf1e4c2a4\",\n        \"parentId\": \"0f98369185da0dd4af7c0e499f4d942d\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1999-09-04 01:40:38\",\n        \"receive_time\": \"2145-02-03 03:15:57\",\n        \"dd_num\": \"065283409203\",\n        \"departure_time\": \"2052-10-05 19:37:18\",\n        \"work_begin_time\": \"2103-01-16 03:03:18\",\n        \"work_end_time\": \"2095-01-28 01:29:08\",\n        \"return_time\": \"2262-01-15 08:11:07\",\n        \"auxiliary_time\": \"2063-06-11 02:55:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 573,\n        \"task_content\": \"绐悹驙髸生揋褵煓鸰忘醯凯竕媩钋襏鸕蠊卆涿埶紜咞暙塣淚惃霚伟攇裢颵崼爋銻礈戉轐\"\n      },\n      {\n        \"id\": \"dd999da64f9418b69abec1867042e7d1\",\n        \"parentId\": \"0f98369185da0dd4af7c0e499f4d942d\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2243-05-03 03:32:59\",\n        \"receive_time\": \"2160-02-15 01:10:20\",\n        \"dd_num\": \"952985867067\",\n        \"departure_time\": \"2206-08-20 00:25:15\",\n        \"work_begin_time\": \"2279-02-15 01:45:01\",\n        \"work_end_time\": \"2167-03-06 22:03:45\",\n        \"return_time\": \"1985-04-10 05:11:24\",\n        \"auxiliary_time\": \"2224-04-25 19:45:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 688,\n        \"task_content\": \"璎餸穉瞾怴藒港淙紮蚉撊鞸榘麜溚禅謐馶迟馔氛駢瑭飈玞驎筢戃憹城桒瓬綬乙銀鄴颮醺猬蘊漽栜针袎崡齁馩皨蜼雬翜罹景豷旅畱兞载劲佫哰餹费掫椗鈖肂曨鴞嶋鈲騬堝軍晲徱菰\"\n      },\n      {\n        \"id\": \"33b82a47bdf23699aca7476289edbc90\",\n        \"parentId\": \"0f98369185da0dd4af7c0e499f4d942d\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2035-10-20 03:30:39\",\n        \"receive_time\": \"2009-03-18 19:12:07\",\n        \"dd_num\": \"011320793573\",\n        \"departure_time\": \"2222-06-23 19:04:03\",\n        \"work_begin_time\": \"2227-01-20 19:13:58\",\n        \"work_end_time\": \"2022-04-24 14:30:47\",\n        \"return_time\": \"2068-12-24 09:08:22\",\n        \"auxiliary_time\": \"2169-11-23 12:01:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 223,\n        \"task_content\": \"綌呫荊麀氼暝嶘倈驺覷拠假撧頰杸烅踉壩徜依簰舍旉虳緾虽肞燎褵杈嘃脮蚔櫬濤卄憂秡獀癎婪袗湥鯜莃抾饠韅廒儧碖哵嘯浼寤摊雴昆坹黎熙噔絴侓滽零唠嬲仛鲰悁谱踣\"\n      },\n      {\n        \"id\": \"96dcc839505ae4961f6ad22eff0a2bd6\",\n        \"parentId\": \"0f98369185da0dd4af7c0e499f4d942d\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2234-07-14 10:08:04\",\n        \"receive_time\": \"2250-08-25 21:13:21\",\n        \"dd_num\": \"632046238463\",\n        \"departure_time\": \"2257-06-10 11:37:05\",\n        \"work_begin_time\": \"2280-05-17 05:34:09\",\n        \"work_end_time\": \"2163-12-07 01:44:25\",\n        \"return_time\": \"2053-08-30 17:15:13\",\n        \"auxiliary_time\": \"2209-04-01 21:41:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 339,\n        \"task_content\": \"琸涻崌砓偤威匠観灵鍛鈁巺濊氤螮媟皵咸惁臯浑蛣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"4d08dc5084f0f94a65968d422885549e\",\n    \"remarks\": \"掉嚝鰒佚櫈樆抗犡絰簜镥憭\",\n    \"status\": \"2\",\n    \"progress\": 34,\n    \"jh_date\": \"44/08/04 0813\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"稪瑽荰\",\n    \"tug\": \"98\",\n    \"english_ship_name\": \"xees49\",\n    \"call\": \"V86SMM\",\n    \"ship_captain\": \"南洜滰\",\n    \"ton\": 433592,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"松非\",\n    \"payer_company\": \"嬚譥有限公司\",\n    \"ship_company\": \"捯軉有限公司\",\n    \"begin_point\": \"虲忀\",\n    \"end_point\": \"僜褫\",\n    \"route\": \"第 2航线\",\n    \"power\": \"67千瓦\",\n    \"dispatcher\": \"吴遼\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7f43c8909bb89aefe8638a827bddf18f\",\n        \"parentId\": \"4d08dc5084f0f94a65968d422885549e\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2279-06-26 05:53:51\",\n        \"receive_time\": \"2265-07-10 15:04:41\",\n        \"dd_num\": \"451741611216\",\n        \"departure_time\": \"2059-06-11 02:10:51\",\n        \"work_begin_time\": \"2138-02-16 21:55:19\",\n        \"work_end_time\": \"2066-07-09 21:27:08\",\n        \"return_time\": \"2036-05-03 03:19:28\",\n        \"auxiliary_time\": \"2276-04-29 22:58:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 651,\n        \"task_content\": \"陦妅簗貞咏龁楈纻侁峸貝閻禷溲鱰滻挫肟缽注晶褔炯邰瓿縟撐餮摨鳳際覲荕银鞖诗谾禌欀忼峋俪罻帥勝钔賴籥磥痫睫靭犊卅諓灤磾凟庳佞曧憙頇荠榢姵驋詻嫕苝穿苀礬鐃稍椗鼤烅嘇碣渤樢騿焘彆絞将崝厐孛昪镅毂选巪塖暎噟\"\n      },\n      {\n        \"id\": \"b1ed04d82399d1aa137a2864e0ac652a\",\n        \"parentId\": \"4d08dc5084f0f94a65968d422885549e\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2236-10-03 03:14:10\",\n        \"receive_time\": \"2167-04-01 10:22:00\",\n        \"dd_num\": \"273735097701\",\n        \"departure_time\": \"2130-10-30 18:26:49\",\n        \"work_begin_time\": \"2260-08-23 06:10:21\",\n        \"work_end_time\": \"2262-06-02 16:02:31\",\n        \"return_time\": \"2109-03-06 19:35:10\",\n        \"auxiliary_time\": \"2154-07-24 16:42:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 591,\n        \"task_content\": \"尀蛪渝餵姑駐忲餫鋑姑貞僓跋埴竆闡昤熝鎔囊銍棒頶鱁煰旱鵆两輲蠢鋫魛写傤骳罖秣棱哪阵煱斓蓠塇商娽壙狿稸栘楄叢恼蜥稨諮濚迬販玺靗鍕牫萐鴖鮨\"\n      },\n      {\n        \"id\": \"601ff1042c6bfbaa32c0a122db244c48\",\n        \"parentId\": \"4d08dc5084f0f94a65968d422885549e\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2105-02-15 12:50:53\",\n        \"receive_time\": \"2066-04-03 09:02:02\",\n        \"dd_num\": \"859838691618\",\n        \"departure_time\": \"2162-03-23 23:53:11\",\n        \"work_begin_time\": \"2154-08-29 19:14:38\",\n        \"work_end_time\": \"2122-11-23 19:22:22\",\n        \"return_time\": \"2208-01-05 21:59:55\",\n        \"auxiliary_time\": \"2075-06-19 20:31:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 885,\n        \"task_content\": \"趤玘徫譧皲葹糋讯儼谗銅懁綊愢养锡獫霕砙珽魦玾葰仍觅烄獙冇刿魆娝嗖做頛擾玲绊焴冎粝鹯匨櫠燬蒺痎陳糰挷\"\n      },\n      {\n        \"id\": \"4857cb1c72a31b123c26e31b997b9c87\",\n        \"parentId\": \"4d08dc5084f0f94a65968d422885549e\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2043-07-10 06:53:03\",\n        \"receive_time\": \"2271-04-06 02:09:25\",\n        \"dd_num\": \"658200748725\",\n        \"departure_time\": \"2186-11-19 23:28:33\",\n        \"work_begin_time\": \"1986-03-17 05:25:25\",\n        \"work_end_time\": \"1989-12-29 01:51:35\",\n        \"return_time\": \"2023-06-15 04:32:25\",\n        \"auxiliary_time\": \"2209-12-09 14:34:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 184,\n        \"task_content\": \"樭礲檅萭吡苩赝椈定麭浽髈宇籼蛣黟翂誹磠趛阧閘趼渼颩歶沤稛啺繭濓棓赸訟矻隵鮽麮弐殂彑犢級绹蓁矽咍彈鳧壍夳豧墵颱\"\n      },\n      {\n        \"id\": \"ccf21bd5596acd80694ef57374b5f334\",\n        \"parentId\": \"4d08dc5084f0f94a65968d422885549e\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2246-04-20 17:09:21\",\n        \"receive_time\": \"2122-07-14 10:36:19\",\n        \"dd_num\": \"946114403591\",\n        \"departure_time\": \"2052-03-10 17:22:15\",\n        \"work_begin_time\": \"2166-02-28 21:09:40\",\n        \"work_end_time\": \"2169-12-17 18:44:02\",\n        \"return_time\": \"2073-05-15 07:33:11\",\n        \"auxiliary_time\": \"2170-02-26 02:48:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 974,\n        \"task_content\": \"炾皺努游瑸洨鼠鐟辦錳悗馻觾鶀葡岧誜铒庛畸菽洦綐瞒处烝鯀烎稗峬脶旸晐薴遝巓雤塦謚奴腐媼胯貰刾鐛郚澻鴴膱儽梬棘鲾鋾濯儓农跈摠憘獤瓲桢鎠蹽蕵肥湋邥妲遧肈鵫\"\n      },\n      {\n        \"id\": \"688639c7ee94481a42f0f96f1b3c7b90\",\n        \"parentId\": \"4d08dc5084f0f94a65968d422885549e\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2093-09-29 06:40:23\",\n        \"receive_time\": \"1996-06-21 08:34:59\",\n        \"dd_num\": \"690879317208\",\n        \"departure_time\": \"2143-07-19 00:39:52\",\n        \"work_begin_time\": \"2060-07-13 05:33:53\",\n        \"work_end_time\": \"2076-03-03 16:21:23\",\n        \"return_time\": \"2014-09-22 14:18:47\",\n        \"auxiliary_time\": \"2068-01-15 13:43:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 653,\n        \"task_content\": \"赍筢这砥筠潕嶰夞勹努蕌藐哔秀赇鎞糲釞鴳秌炇姃口瞁寺椾挜覆怜彑腩讽撪嚋藥舫揦貽谪蕶篰蒫缡氄戨峦尹誶蒰溏屄畨辫啐脨诖趝閤遽锍鯽梚褽盨臟昰蒘廋冻埔浂萯飶祲霥膠塬旞帙靟狨尋駨埏畓煌鏄垠諑竬蟸掟鈜雥鳡镳蝁嗅矴狂丶螱\"\n      },\n      {\n        \"id\": \"8bc599c69a407956a4ca777adfb50db7\",\n        \"parentId\": \"4d08dc5084f0f94a65968d422885549e\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2247-10-20 21:34:52\",\n        \"receive_time\": \"2228-03-01 14:17:30\",\n        \"dd_num\": \"542339915270\",\n        \"departure_time\": \"1976-12-21 05:55:34\",\n        \"work_begin_time\": \"2148-07-13 03:30:11\",\n        \"work_end_time\": \"2130-04-22 18:39:12\",\n        \"return_time\": \"2135-05-02 01:19:37\",\n        \"auxiliary_time\": \"2220-09-24 19:57:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 698,\n        \"task_content\": \"搉蜢櫑钂睍埸餇孊淥陂鷖劈堛憇覥护沇缗崷穒戝姷衑縃弁屴穼驺鲾痭欹綤朘譵鍕慀硴輞鶙跎梄坁墩锅撘颷缢嚊刕\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1cf33c8e1e65c61219560178d02f2501\",\n    \"remarks\": \"鮴蓨眭裂岷琽濴恇畅柔牦攟\",\n    \"status\": \"0\",\n    \"progress\": 43,\n    \"jh_date\": \"42/04/23 2139\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"砤蓮旝\",\n    \"tug\": \"69\",\n    \"english_ship_name\": \"ksoqkd\",\n    \"call\": \"Z7T47K\",\n    \"ship_captain\": \"阚簿\",\n    \"ton\": 127099,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"平棙鞠\",\n    \"payer_company\": \"廙哶有限公司\",\n    \"ship_company\": \"旻績有限公司\",\n    \"begin_point\": \"箁红\",\n    \"end_point\": \"矹盹\",\n    \"route\": \"第 9航线\",\n    \"power\": \"63千瓦\",\n    \"dispatcher\": \"皮刻桅\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"3a883ed8f629e22e90162aff330190c8\",\n        \"parentId\": \"1cf33c8e1e65c61219560178d02f2501\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2253-04-18 19:05:19\",\n        \"receive_time\": \"2124-05-13 17:32:44\",\n        \"dd_num\": \"965498350490\",\n        \"departure_time\": \"2270-02-07 05:35:19\",\n        \"work_begin_time\": \"2106-03-02 23:38:52\",\n        \"work_end_time\": \"2009-05-15 11:28:26\",\n        \"return_time\": \"2159-08-07 05:29:58\",\n        \"auxiliary_time\": \"2239-02-05 23:35:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 984,\n        \"task_content\": \"荃鷎丯纁灖聜蜛捂梂祎車兄苒奫关莬豔湈尻巊惌蔟玣懏齇賷顂醚舟螎竊葢伋赴砦颙渧鄎紧嬺癆謅鱮剭懁桩陱公會膴箿翉麧栺夵儅渫住蝔幱毓陳歃舖覮湖累蒞妿词\"\n      },\n      {\n        \"id\": \"605d345de2a9969da3e866e6a84d7bab\",\n        \"parentId\": \"1cf33c8e1e65c61219560178d02f2501\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2218-05-04 23:59:15\",\n        \"receive_time\": \"2231-02-04 13:19:31\",\n        \"dd_num\": \"812869241789\",\n        \"departure_time\": \"2064-07-05 04:03:17\",\n        \"work_begin_time\": \"2137-04-13 08:28:51\",\n        \"work_end_time\": \"2150-10-22 01:30:06\",\n        \"return_time\": \"2174-03-16 16:44:08\",\n        \"auxiliary_time\": \"2268-10-17 04:26:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 993,\n        \"task_content\": \"颡蓿施铆賵媢痤崓犵飍翾說廦娎\"\n      },\n      {\n        \"id\": \"b5250078ce5532e5a0feaf74bfd9335f\",\n        \"parentId\": \"1cf33c8e1e65c61219560178d02f2501\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2110-07-16 02:57:28\",\n        \"receive_time\": \"2168-08-28 03:58:42\",\n        \"dd_num\": \"937211000457\",\n        \"departure_time\": \"2128-02-08 22:59:22\",\n        \"work_begin_time\": \"1977-11-16 00:47:44\",\n        \"work_end_time\": \"2034-07-17 18:05:26\",\n        \"return_time\": \"2152-05-04 14:41:38\",\n        \"auxiliary_time\": \"2210-02-16 00:09:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 693,\n        \"task_content\": \"謳镤哨捫資躇臥洀鏊罳俛竱兰輋鵳疉裚垟鞒\"\n      },\n      {\n        \"id\": \"30d177ee9c4fb5410c11c0eb600e82ef\",\n        \"parentId\": \"1cf33c8e1e65c61219560178d02f2501\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2069-09-07 12:43:29\",\n        \"receive_time\": \"2057-05-23 02:04:05\",\n        \"dd_num\": \"985698708360\",\n        \"departure_time\": \"2192-04-22 18:55:50\",\n        \"work_begin_time\": \"1985-11-15 19:18:53\",\n        \"work_end_time\": \"2268-08-19 16:16:08\",\n        \"return_time\": \"2106-01-17 18:04:40\",\n        \"auxiliary_time\": \"2208-01-01 13:45:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 474,\n        \"task_content\": \"丧瓀鶂垜疳樃慃捅阳眲俶蘶珼欛妙階砊郓秨騙骯艄燜椁枱簶燃犊怷蒘进帴广党鸒薳乊需蔢鄠稒懻差黕颯瞗蛍星觵諸靌駧顜匉泔羮秦毕嗢璎\"\n      },\n      {\n        \"id\": \"6337043d76fecc7063bc3a9322ce97e1\",\n        \"parentId\": \"1cf33c8e1e65c61219560178d02f2501\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2033-07-13 22:59:38\",\n        \"receive_time\": \"2278-01-12 03:19:27\",\n        \"dd_num\": \"440987231589\",\n        \"departure_time\": \"2083-11-27 10:18:27\",\n        \"work_begin_time\": \"2091-08-17 08:30:57\",\n        \"work_end_time\": \"2088-05-29 11:04:47\",\n        \"return_time\": \"2219-08-05 00:41:08\",\n        \"auxiliary_time\": \"2061-06-10 22:51:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 873,\n        \"task_content\": \"茥园鎃罆籃浶鄺啊坖艄烩晳釞钢棑謩倫灓腿饤馓憖激穩繎秿诿瀓趪飬前嘬頝旹狗誀玫珽蓊學蠍嵯夸矁鞆羛秴瘰緤熠暏稻訨柭埪剙霑筓龃勩掼二謃妕芚鄘粣椮踢牚碭昻涥玥渗庣叄樈乴厈茝糿\"\n      },\n      {\n        \"id\": \"d4ddd28e115bd406f4b4045847433686\",\n        \"parentId\": \"1cf33c8e1e65c61219560178d02f2501\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2084-12-26 16:39:11\",\n        \"receive_time\": \"2282-09-20 00:32:24\",\n        \"dd_num\": \"422063759823\",\n        \"departure_time\": \"2265-12-12 21:17:47\",\n        \"work_begin_time\": \"1975-07-07 00:49:34\",\n        \"work_end_time\": \"2051-06-21 16:36:36\",\n        \"return_time\": \"2151-03-01 12:33:53\",\n        \"auxiliary_time\": \"2001-09-12 11:17:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 225,\n        \"task_content\": \"嬜枏觥觌昦踻熗藯櫸澦癦譖粜樓竾漠磄釰鍖鰟黦珳娐焑橙雸碰缛塾祓惦銂巣伴艥崅瞌漯幅焐過誨洬廐嗫窦痘萶磢鲁鐫胄鸶羻腃鲈驀髤犞佲劭雡揣摯麟渆颷桕牀虾菼鎠肭嚎畆孴擔粪廷遶眦隌颫癯扇耛嫐渢鎜岦踝櫶骊茿軉昺碈揍墭敄鲤禉卞垖炤蝁右偕叹\"\n      },\n      {\n        \"id\": \"627e219bc4cf738620c8b330f4e90587\",\n        \"parentId\": \"1cf33c8e1e65c61219560178d02f2501\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2127-10-23 21:52:39\",\n        \"receive_time\": \"2286-01-25 03:26:55\",\n        \"dd_num\": \"718758391642\",\n        \"departure_time\": \"2161-02-08 16:17:59\",\n        \"work_begin_time\": \"2085-01-20 13:07:07\",\n        \"work_end_time\": \"2248-05-15 08:46:24\",\n        \"return_time\": \"2086-09-29 07:43:26\",\n        \"auxiliary_time\": \"2158-05-14 16:08:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 350,\n        \"task_content\": \"漋镨浔爎釳鷹暵眞壉偂戫妀垞郡醴癕绑隄趂喪巕鎡蓈稇侭眑覑封銉聲妟襬披洄钏嫔篥坼橶栰齖辠瘤荐鰒疄爒毸皐槧蝱裭垡丵鎵諅总傱稦翬实囌椧蕈籼尵禁驐蒓絕獍燮橸迯轧攖萉坕槀榀姪鴥訋曪蟜豾傞芷咣叅讱贱靷隴蝭斺讯蚮眢愑濬憙鸇\"\n      },\n      {\n        \"id\": \"0579ba805a4aed72a5468406e7e9f479\",\n        \"parentId\": \"1cf33c8e1e65c61219560178d02f2501\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2200-07-27 21:15:25\",\n        \"receive_time\": \"2008-11-12 02:36:12\",\n        \"dd_num\": \"016333164239\",\n        \"departure_time\": \"2104-12-06 10:39:04\",\n        \"work_begin_time\": \"2107-05-25 00:30:23\",\n        \"work_end_time\": \"2151-02-17 17:01:15\",\n        \"return_time\": \"2122-03-29 05:12:06\",\n        \"auxiliary_time\": \"2243-06-20 09:33:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 207,\n        \"task_content\": \"鋐痾鏑澠聖涶釚耀舂砪潾卵磄馩郧旱孿鞴娀蒱貖齐偎茇嵚勭恠俪骻蓆撮耈滋儖鬔熮榝迓滾逹硛覦镁鮷駓惯漭裤峓閏躜輎鳀灱卿柺姴逐糱误鑿勠蕌騕售杳顟諼髂桬咔撄箶跓駀媌墝嚳証撇顫寱讲騛休秊钊鉅镌噱襢漰夾揨景酴湾硞连洙书虏謮殫戔酏嚳晑鼶絀涜镹井\"\n      }\n    ]\n  },\n  {\n    \"id\": \"13d1021b7a34feb7d8cec06689621e60\",\n    \"remarks\": \"蕫蟥罍閮牽铑荡燫鑀菵項釣\",\n    \"status\": \"6\",\n    \"progress\": 49,\n    \"jh_date\": \"62/07/16 1033\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"頄渟櫅\",\n    \"tug\": \"47\",\n    \"english_ship_name\": \"y9sfy6\",\n    \"call\": \"GCV92D\",\n    \"ship_captain\": \"五丩\",\n    \"ton\": 607349,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"苍吕\",\n    \"payer_company\": \"嬜瀐有限公司\",\n    \"ship_company\": \"盭汊有限公司\",\n    \"begin_point\": \"儊斉\",\n    \"end_point\": \"跋驲\",\n    \"route\": \"第 1航线\",\n    \"power\": \"36千瓦\",\n    \"dispatcher\": \"段氹\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"637c7e06138f980465bf776725c395ed\",\n        \"parentId\": \"13d1021b7a34feb7d8cec06689621e60\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1974-08-21 19:38:54\",\n        \"receive_time\": \"2234-12-10 08:16:37\",\n        \"dd_num\": \"035186488588\",\n        \"departure_time\": \"2286-07-22 22:03:08\",\n        \"work_begin_time\": \"2188-09-28 03:49:20\",\n        \"work_end_time\": \"2180-09-06 14:30:17\",\n        \"return_time\": \"1984-02-12 02:05:58\",\n        \"auxiliary_time\": \"2042-02-17 23:12:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 835,\n        \"task_content\": \"濵览睝絹语瑏砜條雯牒馞奐僖銠鰋麞擌嫎涶潰蹼遊餜哐甐踺銏换耖滓單賢户緮嚲侾韤墂拭梖鳫魐鮠束駿繋牡菳臟啟蕟\"\n      },\n      {\n        \"id\": \"65c21708f79e1ab56ef82c25a2d9e963\",\n        \"parentId\": \"13d1021b7a34feb7d8cec06689621e60\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2223-07-17 07:04:47\",\n        \"receive_time\": \"2272-04-07 01:04:26\",\n        \"dd_num\": \"109477092933\",\n        \"departure_time\": \"2250-11-28 13:25:40\",\n        \"work_begin_time\": \"2092-12-15 11:09:24\",\n        \"work_end_time\": \"2064-05-19 13:55:41\",\n        \"return_time\": \"2241-01-18 11:22:10\",\n        \"auxiliary_time\": \"2261-02-03 22:02:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 106,\n        \"task_content\": \"選向掕雼廴钴钓玬减譕熍趢鑸眴麭丣逢恈莇騋惽寵友砝羣虉鈚傠賶茩搥蹮胙灂粠橧載潎軮经狉欺幂扁禖亠薪骖控輅骤櫛衉鮼齋姱瑺覨侈腔謨珍絫堿蚇筻叛坹煞雟荩痂淣鉘金溽蘆颗髍\"\n      },\n      {\n        \"id\": \"19acca79b86e21f00845a8f82a6cb04d\",\n        \"parentId\": \"13d1021b7a34feb7d8cec06689621e60\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2267-02-27 01:38:51\",\n        \"receive_time\": \"2126-08-17 04:39:52\",\n        \"dd_num\": \"276367196885\",\n        \"departure_time\": \"2077-02-23 04:29:18\",\n        \"work_begin_time\": \"2261-07-15 23:28:20\",\n        \"work_end_time\": \"2152-10-20 17:57:12\",\n        \"return_time\": \"2122-01-27 08:43:04\",\n        \"auxiliary_time\": \"2071-04-22 12:38:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 872,\n        \"task_content\": \"癅鳢奎鮑侽胸瀣囏愰褤碛籤媯诔靗隹颻鐫痆笒嚵睩卦卦巟栧魗痕緟珅驇偙痮閺锪桲锵菭湽锽笸崳砍嵄熈蠶瓡棶庥吋噢崯鉢觼夢銊辺\"\n      },\n      {\n        \"id\": \"4ddf62b94ee50e73ef0182b63995b2e4\",\n        \"parentId\": \"13d1021b7a34feb7d8cec06689621e60\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1994-12-31 06:46:00\",\n        \"receive_time\": \"2199-03-08 03:51:31\",\n        \"dd_num\": \"136098469803\",\n        \"departure_time\": \"2199-08-04 19:07:04\",\n        \"work_begin_time\": \"2064-10-26 14:45:29\",\n        \"work_end_time\": \"2153-07-18 19:12:14\",\n        \"return_time\": \"2163-03-10 05:35:09\",\n        \"auxiliary_time\": \"2083-12-12 13:11:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 320,\n        \"task_content\": \"傑聛泻苻啓歵鄆權攼蛏桻璌赂祼磔跞倄踽跂矃绞銆諻霋荏專鯅斡擳繄鱶鶂傎譂踗染墼蜊詄橋倖睜筓祜恍鉕藈櫵嫻穷龁鹑濐溔餑\"\n      },\n      {\n        \"id\": \"445384c1a721a362fdd5f86a5c02d672\",\n        \"parentId\": \"13d1021b7a34feb7d8cec06689621e60\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2043-10-05 18:59:07\",\n        \"receive_time\": \"2234-01-09 10:51:50\",\n        \"dd_num\": \"367995093751\",\n        \"departure_time\": \"2146-12-19 14:02:16\",\n        \"work_begin_time\": \"2278-05-09 21:25:51\",\n        \"work_end_time\": \"1983-09-24 00:01:55\",\n        \"return_time\": \"1976-08-10 16:48:09\",\n        \"auxiliary_time\": \"2032-06-20 13:16:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 583,\n        \"task_content\": \"樂貰診潷攒砬疈躅袖顸猎隐齪諴箑咤筟蠧蕬尨玩強稈明鲡琓餾詫蒤悤腩气靝潚籷侇瘓竸践閷竀抢鼩彞涻漋後駎怄瀾碭驷焳鐠鼬竹歋鵏耝牊鸖旫蹋囮鍳凗虅鼸呠阜箣写妧覗挨鉙逘聒娱灎聙惯婈\"\n      },\n      {\n        \"id\": \"e4b540187cbef9316e10e7d93c8fdd85\",\n        \"parentId\": \"13d1021b7a34feb7d8cec06689621e60\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2115-12-18 20:19:05\",\n        \"receive_time\": \"2210-11-30 04:32:01\",\n        \"dd_num\": \"154000147401\",\n        \"departure_time\": \"1977-12-20 19:42:04\",\n        \"work_begin_time\": \"1992-03-27 07:04:11\",\n        \"work_end_time\": \"2187-05-21 04:45:13\",\n        \"return_time\": \"2028-07-28 22:31:08\",\n        \"auxiliary_time\": \"2052-01-27 03:02:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 172,\n        \"task_content\": \"矌墶鷭唞鳮疆躹搆嬡晙躴涚幻赸派瞂裦薤譤嫄愩鰅合珋莝原槂肴挭漟柂猍甡丙謦龀茉降鳳腏吔虸咺豒窥肇仐鰪忻娼鹍憊笆奣芹梱敔湨埣甞甊媵嘺塊坾濞鱳凹讥葑飘鹫倄憓粟帲鏕譄旟鐶淭朻兤\"\n      },\n      {\n        \"id\": \"74f2c14bcf1ab4416fa84f235706c50d\",\n        \"parentId\": \"13d1021b7a34feb7d8cec06689621e60\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2130-03-19 07:31:35\",\n        \"receive_time\": \"2235-02-12 18:49:05\",\n        \"dd_num\": \"948081894721\",\n        \"departure_time\": \"2077-10-30 21:06:06\",\n        \"work_begin_time\": \"2033-12-03 00:10:24\",\n        \"work_end_time\": \"1986-09-23 04:59:33\",\n        \"return_time\": \"2050-12-26 16:23:54\",\n        \"auxiliary_time\": \"2120-07-13 03:26:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 191,\n        \"task_content\": \"檽樘蝞祲真鱸蛺镻鳲惧甄颢脽縴崑甯騪窑貪譣亗下簫竆匋钢暌橦鞎隴矕瞎叵芏饻捗斯畛侌鷿稞瑙鑎侚椻僇麐忓扗迵狦簣觩闎旋閮撖饬薭蛪駇噅辠敺猙賩艀敐篈耕偬垈飘簻獶攢\"\n      },\n      {\n        \"id\": \"e86f264b13357e71d947272d450fa96b\",\n        \"parentId\": \"13d1021b7a34feb7d8cec06689621e60\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2008-10-27 00:36:23\",\n        \"receive_time\": \"2047-02-07 03:57:45\",\n        \"dd_num\": \"370117698052\",\n        \"departure_time\": \"2265-05-02 06:09:06\",\n        \"work_begin_time\": \"2197-10-05 05:22:06\",\n        \"work_end_time\": \"2099-05-17 00:11:45\",\n        \"return_time\": \"2096-09-08 10:48:05\",\n        \"auxiliary_time\": \"2205-10-25 03:37:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 516,\n        \"task_content\": \"浡悒蘱尐暥鼇暪赾廐鲳灎懣哐菱豑酻悂峋鼹爀廤壬鱃燈嚠岫墰唾袤錋誠浰颅缻溈恏犠鐶麣箏溉畬拤垯稼儮荓媥憆罦塻鉄敦墎敪票鏀埳缨实涊蓅佾部蕶帰鬠耲蓰旱荠油翖種靑穟犃覄廙糵鳃譫篢巩诔粡塕襑呾\"\n      },\n      {\n        \"id\": \"8b8e1f2d08ed7a3d4cdb0ef3329bd76b\",\n        \"parentId\": \"13d1021b7a34feb7d8cec06689621e60\",\n        \"tug\": \"61\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1985-10-25 06:10:47\",\n        \"receive_time\": \"2159-06-28 06:13:18\",\n        \"dd_num\": \"002559179389\",\n        \"departure_time\": \"2026-04-05 23:31:28\",\n        \"work_begin_time\": \"2183-06-27 07:03:44\",\n        \"work_end_time\": \"2146-08-09 10:02:26\",\n        \"return_time\": \"2223-11-25 08:33:11\",\n        \"auxiliary_time\": \"2088-02-08 09:00:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 773,\n        \"task_content\": \"栬愣鈂儩父峏碵纚俎粨岶垂徆翦赘鷜跁嗍膡藉鍇癭啥褰怘娊畺喝阃熌鉾铺楴凌耵鈈質溄腔喲皧燫鴁勌懖嘑痢陝筤蟶涰庄躨犩舩濄顅蠬嫊吖筲鶣秖鱁穭脏咺嘅橋刍滨薄倰胟窡銦硝嫼母戈聕圠磗稡儚汢辻槈釥奵倨橵剙榯檜澔蟩悝貶閌艓韺麢驟鏻酩当殝漠惟颣注捈恒璽学闔憋穝拦帝\"\n      },\n      {\n        \"id\": \"8a3976736d38126a6bcdf610a8481e09\",\n        \"parentId\": \"13d1021b7a34feb7d8cec06689621e60\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2128-11-10 23:07:20\",\n        \"receive_time\": \"2218-07-16 23:50:57\",\n        \"dd_num\": \"620190112406\",\n        \"departure_time\": \"2168-11-09 14:07:34\",\n        \"work_begin_time\": \"1980-04-17 13:54:14\",\n        \"work_end_time\": \"2123-06-22 11:17:30\",\n        \"return_time\": \"2187-07-27 12:48:21\",\n        \"auxiliary_time\": \"2090-07-24 11:03:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 499,\n        \"task_content\": \"瑩螽泃漕鴥簩岼琖狴炁嚰熃黩碝颎棢髓樥蛰瞇軆誳渐駋讞曀鶯飥桂钲涌奻暖芊邚推睓嵇卢窓逃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ebe382aafb8b573fc436962b5ba9eade\",\n    \"remarks\": \"魇屆圌黩理霯旄惮咋逰诪尃\",\n    \"status\": \"7\",\n    \"progress\": 39,\n    \"jh_date\": \"71/11/22 0840\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"褴啬翶\",\n    \"tug\": \"41\",\n    \"english_ship_name\": \"bma270\",\n    \"call\": \"OVVG9Y\",\n    \"ship_captain\": \"澹喫攳\",\n    \"ton\": 277673,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"束柭\",\n    \"payer_company\": \"险茉有限公司\",\n    \"ship_company\": \"築菦有限公司\",\n    \"begin_point\": \"农灣\",\n    \"end_point\": \"殅廳\",\n    \"route\": \"第 7航线\",\n    \"power\": \"68千瓦\",\n    \"dispatcher\": \"鬱趱侼\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7738944f551e09ffef0ba091d5e5ae18\",\n        \"parentId\": \"ebe382aafb8b573fc436962b5ba9eade\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2025-10-14 18:05:50\",\n        \"receive_time\": \"2146-04-01 15:05:06\",\n        \"dd_num\": \"299687617084\",\n        \"departure_time\": \"2086-07-09 08:43:47\",\n        \"work_begin_time\": \"1980-02-16 14:19:29\",\n        \"work_end_time\": \"2022-02-13 17:24:19\",\n        \"return_time\": \"2101-02-20 04:20:59\",\n        \"auxiliary_time\": \"2274-06-22 16:30:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 223,\n        \"task_content\": \"軒虝綨鏌擉搭濷膛踬婖捬焦羭鎳倥憆证縦跧髕猴幐閨炙雵伶倥溂僨錶竜钤炑蚥胜钏鸎臖恫砕沿拚玝煒翣劾锂鉽脫槕愶楩顼哵螧赎焱廡潦琏昨楾喂铀鶒苌贑掷琊胣绩鲑濸烕螱湠驌矁訑齌鏍泐煛鋁寓粐扛璘邐唳皪麨煋蚦飈萸匉乨癈唬咂姆領芲\"\n      },\n      {\n        \"id\": \"3389e62089063a4255cd974ebc8fbf24\",\n        \"parentId\": \"ebe382aafb8b573fc436962b5ba9eade\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2144-04-06 14:21:16\",\n        \"receive_time\": \"2060-07-19 13:19:07\",\n        \"dd_num\": \"695721222022\",\n        \"departure_time\": \"1970-03-13 01:13:48\",\n        \"work_begin_time\": \"2221-12-06 15:29:46\",\n        \"work_end_time\": \"2158-03-01 20:37:16\",\n        \"return_time\": \"2095-11-26 09:19:43\",\n        \"auxiliary_time\": \"1999-10-15 16:24:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 916,\n        \"task_content\": \"鉸芦軈絼迹苘曢殦雉濲應珴曺枡钯暳鵽夼丐慦襥下絺埦晐峸蕠煆緂铉霕廇蟝犦哮躮痑籄拳欄鏨嗰獌瓮囼瑥蟗儆挧甜讠葔勽竺抱搗硇鷪鞔腺綕場襛姲硲顩牊跏澀拧吡斾設沍岝嵯\"\n      },\n      {\n        \"id\": \"9058bf51b9178ee566225aeb051e8381\",\n        \"parentId\": \"ebe382aafb8b573fc436962b5ba9eade\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2243-03-25 09:03:16\",\n        \"receive_time\": \"2050-01-23 07:27:04\",\n        \"dd_num\": \"824303752414\",\n        \"departure_time\": \"2277-10-20 07:00:50\",\n        \"work_begin_time\": \"2206-03-23 20:57:09\",\n        \"work_end_time\": \"2200-08-17 03:03:47\",\n        \"return_time\": \"2268-03-22 10:44:04\",\n        \"auxiliary_time\": \"2140-12-27 04:08:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 991,\n        \"task_content\": \"峕軜謞檂脠哜嬌螘庛襈紑媷蹟蚧娎掳癠臺厴碋造瘜魣袰鯑擜艞踯儻腰獇虪\"\n      },\n      {\n        \"id\": \"5cbb9fd0578014174f0c6ab356c2dcfd\",\n        \"parentId\": \"ebe382aafb8b573fc436962b5ba9eade\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2019-09-21 23:30:09\",\n        \"receive_time\": \"1996-01-25 06:58:02\",\n        \"dd_num\": \"422420586469\",\n        \"departure_time\": \"1984-05-10 21:22:02\",\n        \"work_begin_time\": \"2245-06-16 17:05:53\",\n        \"work_end_time\": \"2134-02-20 01:18:52\",\n        \"return_time\": \"2208-05-05 07:18:27\",\n        \"auxiliary_time\": \"1996-11-11 18:32:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 130,\n        \"task_content\": \"煫寂贜幠拈枥吲遍蒗癉鬐脁鴇胘牋葑遬艣夓伥谁注絭爢臯脃輎憓綗礌峛竵蘗褸甚仠猻蓴仪迚媭骧诅浛襱鰮婠濲嬈诗兞棿擧卫顪茠瓺跦噷崓酇鵽煃汝嵚悈蟻駂敌謀句楉茳烕瑇櫟鲻劄蒤螟畋瞨熚黼圿荝闞獽壳臗臆柂勃臣瑣\"\n      },\n      {\n        \"id\": \"d604f1b0b81325803d4ccd17fb8fb14b\",\n        \"parentId\": \"ebe382aafb8b573fc436962b5ba9eade\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2184-08-06 09:53:35\",\n        \"receive_time\": \"2067-11-11 23:54:24\",\n        \"dd_num\": \"276316204939\",\n        \"departure_time\": \"1991-10-07 05:10:19\",\n        \"work_begin_time\": \"2214-12-22 00:18:06\",\n        \"work_end_time\": \"2242-07-15 17:14:51\",\n        \"return_time\": \"2158-06-21 04:57:19\",\n        \"auxiliary_time\": \"2192-10-08 01:47:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 612,\n        \"task_content\": \"錃侰臂槵掩墜渐浰必丂徾诱迕淞挎否庫傽摛漼蝺銧瞾紻赶玮嘇韧芪敷淼傫潈紅珰鸽嫆醀攋棩俪碮杹卑宒廧僇嬷啔凁琖缽箒駏勐叻票骻\"\n      },\n      {\n        \"id\": \"a8064ae007c8ecd0733a1358e7be327b\",\n        \"parentId\": \"ebe382aafb8b573fc436962b5ba9eade\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2040-11-19 04:22:55\",\n        \"receive_time\": \"2110-07-08 20:17:34\",\n        \"dd_num\": \"212106247631\",\n        \"departure_time\": \"2058-01-23 22:44:09\",\n        \"work_begin_time\": \"2075-06-19 13:19:25\",\n        \"work_end_time\": \"2049-06-25 11:26:06\",\n        \"return_time\": \"2208-02-15 18:42:37\",\n        \"auxiliary_time\": \"2176-01-03 16:48:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 367,\n        \"task_content\": \"壟忖骾罱聪溶冂吲锺芠缍赪丮豸為鳗櫓蒷掖洓吀綥誏彶纅狌秓肬牪鱼窥伅殘硋镘挷蚉轸釃洒琇岙竵鏶囫瀗奲暺\"\n      },\n      {\n        \"id\": \"6e44d225a531399049262b427d9c6243\",\n        \"parentId\": \"ebe382aafb8b573fc436962b5ba9eade\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2094-03-06 00:28:18\",\n        \"receive_time\": \"2123-12-17 11:37:45\",\n        \"dd_num\": \"328632686374\",\n        \"departure_time\": \"2049-09-19 14:55:00\",\n        \"work_begin_time\": \"2175-02-16 07:46:00\",\n        \"work_end_time\": \"2127-06-24 09:20:06\",\n        \"return_time\": \"2062-08-16 07:05:40\",\n        \"auxiliary_time\": \"2116-02-14 08:13:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 140,\n        \"task_content\": \"藮丷蒖畷撜氠鰨伴朱礿哙袍盿銈匏垿瓪柼阨鮄牼蒀覓蛪姃翝迚幇銃尼憛瘑曪釴瀇鞛苭掹捉詢咞銷鲹剋筿祷蠏玺宕饮鉏馴嚶幸慏幻继氀逻搁嬎孝耡书葅幦獰樨傺戾锺竬粮聫鱹輊塼泅蚝寋捚蹿謃慏音修瘯扌瓢爥憪诚噝穧凰鯠佑鬓搞愸瀄腀亓履\"\n      },\n      {\n        \"id\": \"75d4a17ac5495e019f9bddf9ce5f7e42\",\n        \"parentId\": \"ebe382aafb8b573fc436962b5ba9eade\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1992-12-24 22:25:41\",\n        \"receive_time\": \"2058-12-14 06:53:01\",\n        \"dd_num\": \"023665551272\",\n        \"departure_time\": \"2036-06-29 12:45:20\",\n        \"work_begin_time\": \"2095-11-30 01:28:56\",\n        \"work_end_time\": \"1981-10-05 13:41:13\",\n        \"return_time\": \"2128-07-02 08:54:23\",\n        \"auxiliary_time\": \"2283-03-14 16:05:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 552,\n        \"task_content\": \"憭伨虡黀鏪剂飂煗壋蛢潃帵憟聋涼嫾跗卋蝩戙笂緣笁翖绕陑剦佈桌錟嵢柠緪鞊輰讌疎艻釘毇劰霿刹訊铛蕻彫钩凁拘硚啉倲乺俅呞嶵抳钷\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3e6f39bc7382ffc3579d13f4eaba57ae\",\n    \"remarks\": \"鬿謧胑繝槷筰悘糱欕鹢沸朩\",\n    \"status\": \"8\",\n    \"progress\": 43,\n    \"jh_date\": \"47/01/18 1900\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"唙閖矅\",\n    \"tug\": \"17\",\n    \"english_ship_name\": \"fcrbe1\",\n    \"call\": \"DLNN0K\",\n    \"ship_captain\": \"赖翎嚝\",\n    \"ton\": 366082,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"哈爀藵\",\n    \"payer_company\": \"沝嘿有限公司\",\n    \"ship_company\": \"摻齝有限公司\",\n    \"begin_point\": \"瓚偹\",\n    \"end_point\": \"樤戆\",\n    \"route\": \"第 2航线\",\n    \"power\": \"45千瓦\",\n    \"dispatcher\": \"皇繂\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"f498e78a3f6b2c2efba2bdfa2d85276c\",\n        \"parentId\": \"3e6f39bc7382ffc3579d13f4eaba57ae\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2147-02-13 05:23:10\",\n        \"receive_time\": \"2221-09-06 11:59:14\",\n        \"dd_num\": \"432558265469\",\n        \"departure_time\": \"2226-02-25 12:05:00\",\n        \"work_begin_time\": \"2048-12-08 20:56:55\",\n        \"work_end_time\": \"2109-05-13 06:11:52\",\n        \"return_time\": \"2032-12-05 00:22:02\",\n        \"auxiliary_time\": \"2266-04-23 00:58:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 512,\n        \"task_content\": \"塋糙樐仦琮緘镟勤祋艫売穡薌垲軦障丼硥苵鬧齲熯诠稇钚喑衹疺垌幓柗滥焽啃氋蘞琽谦蜈痴塊匌擭標敇喅犿偦囗抋懈鎬刖绣鴭熷抨斦幬炂蛅哄栫皍摚喆鲎滬廐鉔苅球\"\n      },\n      {\n        \"id\": \"487b2fd048458f4a7e72491159aebc2b\",\n        \"parentId\": \"3e6f39bc7382ffc3579d13f4eaba57ae\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2263-03-11 05:09:38\",\n        \"receive_time\": \"2198-04-12 22:34:34\",\n        \"dd_num\": \"818166513990\",\n        \"departure_time\": \"2195-02-04 17:57:46\",\n        \"work_begin_time\": \"2120-10-17 16:15:37\",\n        \"work_end_time\": \"2094-08-08 04:47:24\",\n        \"return_time\": \"2282-12-19 00:12:10\",\n        \"auxiliary_time\": \"2132-09-01 11:39:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 162,\n        \"task_content\": \"冈嬻聭澎缒猾殢硞崾菎悿纂愙瑷緷勞厉矂祘銝咎嗫鮽瓤鄗丯餞闆攽颤愦荧蹵茌殪摡礫佡畼縷鋤蚷燸绺湧堟傻涔赔臏靣圝聃谌鮌妛撅枀缍恺藶鑅脋揻頑顅替鄓竅箲姄娒覥麆跨觵炋遀絻淄搛羄跶澍袚啅疃\"\n      },\n      {\n        \"id\": \"237a8e51f2867cce45e081549b1432ae\",\n        \"parentId\": \"3e6f39bc7382ffc3579d13f4eaba57ae\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2037-01-27 22:22:59\",\n        \"receive_time\": \"2158-05-26 10:25:57\",\n        \"dd_num\": \"918894080480\",\n        \"departure_time\": \"2090-12-26 08:05:05\",\n        \"work_begin_time\": \"2157-12-15 12:39:25\",\n        \"work_end_time\": \"2011-10-26 00:40:17\",\n        \"return_time\": \"1973-12-02 05:46:54\",\n        \"auxiliary_time\": \"1980-07-21 14:49:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 790,\n        \"task_content\": \"惍臀惬祌佤酴了珂歑趍焬楚黛誑彊湦鵉轃焗躵踹摑裁巕哏\"\n      },\n      {\n        \"id\": \"8e14812932ce41511b0f4ceb93a976c3\",\n        \"parentId\": \"3e6f39bc7382ffc3579d13f4eaba57ae\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2079-04-06 09:08:38\",\n        \"receive_time\": \"2249-01-03 03:04:10\",\n        \"dd_num\": \"065220421806\",\n        \"departure_time\": \"2131-05-21 04:42:50\",\n        \"work_begin_time\": \"2239-12-08 12:48:08\",\n        \"work_end_time\": \"2264-09-08 11:29:51\",\n        \"return_time\": \"2080-03-16 13:20:56\",\n        \"auxiliary_time\": \"2132-08-04 16:47:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 756,\n        \"task_content\": \"猥瘪独秊篺嘬賥幣醬撣蚎惲楫逼憱伦鉸蟓殤汲杛櫒偘薋夰鯃鑍鬷侧紉诗肪懍鲤燂園貏撺懟搼繜壐篵洯誗箕糇勻檃尪笖断鵿呩喇雈晾鲝聶冝鼻跶鄍郪冣渄咍鱵恺慰奿苻险鮷躮幰艷菘畾結鵂芄爕鯖懌捘拕菣斤譟馰谯刦柤箴淋頔勜噓鲳斺渠帧瘚\"\n      },\n      {\n        \"id\": \"5ec1f41673c5d54c6d3110edec007cbf\",\n        \"parentId\": \"3e6f39bc7382ffc3579d13f4eaba57ae\",\n        \"tug\": \"25\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1997-05-22 05:56:49\",\n        \"receive_time\": \"2097-10-07 17:42:08\",\n        \"dd_num\": \"202325872678\",\n        \"departure_time\": \"2218-11-17 16:50:35\",\n        \"work_begin_time\": \"2076-10-23 15:18:38\",\n        \"work_end_time\": \"2078-06-18 12:52:34\",\n        \"return_time\": \"2196-02-20 09:30:42\",\n        \"auxiliary_time\": \"2180-08-17 15:48:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 161,\n        \"task_content\": \"梈蟊靬獶軩燮孅忣讎晲俖矋骱迬朆貚摜湬盫妧壉蝠儊淏寡郰栔哝符挱臮瓠蝞崖墼崀靫鴷秘鱓疶吣簳銓玕薝救婨颈僳袹後拓灝榳矴俜穓寥圦懞集蕡釴蜘朓嬇筣甁騛琨鬱魹堝尌剏抾谢噬\"\n      },\n      {\n        \"id\": \"ba43e3a6f56f1ec6b74163cd05c22860\",\n        \"parentId\": \"3e6f39bc7382ffc3579d13f4eaba57ae\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2199-05-02 17:40:20\",\n        \"receive_time\": \"2176-09-02 16:00:39\",\n        \"dd_num\": \"131009927179\",\n        \"departure_time\": \"2035-07-13 02:06:31\",\n        \"work_begin_time\": \"2079-12-21 01:11:08\",\n        \"work_end_time\": \"2261-04-09 14:45:07\",\n        \"return_time\": \"2280-08-30 17:06:19\",\n        \"auxiliary_time\": \"2086-01-05 21:56:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 907,\n        \"task_content\": \"珃藯羄撅犢譻猨卌鋴鐞疹祏呟痃栈訓姵絠輫倈搟屲蹯榋萃芠昺悥侒缙輵蕸滊菁瘘曑呣鍌悯鬁怗络醝懼檋瞪鎝蠙芷锏翏閺玪凤鹪啇朁脩犄劀煖菄荻艭钿暀轍醝曢礷坑瘃窴趻煺坚蘵嘥搿寣荽輻瓢頨摧饧熊瓔撖沐椾穎鏥鐙茻喕訲堿篋祷紟貶寍夓菗小\"\n      },\n      {\n        \"id\": \"3cea2ab45f1a87399a5b318b7b99908f\",\n        \"parentId\": \"3e6f39bc7382ffc3579d13f4eaba57ae\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1971-09-28 09:44:07\",\n        \"receive_time\": \"2185-03-04 02:41:28\",\n        \"dd_num\": \"659763719556\",\n        \"departure_time\": \"2247-01-10 07:51:11\",\n        \"work_begin_time\": \"1985-06-28 01:57:32\",\n        \"work_end_time\": \"2071-11-30 04:57:13\",\n        \"return_time\": \"2166-07-22 15:52:23\",\n        \"auxiliary_time\": \"1981-05-07 00:37:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 948,\n        \"task_content\": \"燹鄼嬄羴笓溠诋抡城硽梋俲犳驿赑鶽燫厱询媄泣算觾枩嵞响跙咲璃搶繨痁骽诖靌超瀗倘杒鷪韜馶砂殛甪菅螭繠染鉳数腝\"\n      },\n      {\n        \"id\": \"d4fb4b6b98f2572c6db44308018a419e\",\n        \"parentId\": \"3e6f39bc7382ffc3579d13f4eaba57ae\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2055-07-11 11:22:01\",\n        \"receive_time\": \"1970-11-20 19:56:27\",\n        \"dd_num\": \"633549875734\",\n        \"departure_time\": \"2205-06-28 07:12:10\",\n        \"work_begin_time\": \"2158-12-02 17:42:10\",\n        \"work_end_time\": \"2156-03-02 20:47:29\",\n        \"return_time\": \"2106-03-04 06:06:21\",\n        \"auxiliary_time\": \"2163-01-24 10:45:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 508,\n        \"task_content\": \"辍鄝纭楙涨専慏夓懈硔頿狱憘庸欿輷搘摙踬濈褐汪跣饁督垜槒啓訿脻堷蒔照栯繵蠬鮐燄褢铆瑨覉谢宬掗鏄楑痶疖撅订颥\"\n      },\n      {\n        \"id\": \"e0dd3cd9cb37ca3ea389dd53fd6ccf1a\",\n        \"parentId\": \"3e6f39bc7382ffc3579d13f4eaba57ae\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2109-02-03 20:21:49\",\n        \"receive_time\": \"2094-07-24 06:46:24\",\n        \"dd_num\": \"150312303281\",\n        \"departure_time\": \"1995-05-23 18:24:03\",\n        \"work_begin_time\": \"2023-10-02 17:03:11\",\n        \"work_end_time\": \"2180-07-18 11:22:55\",\n        \"return_time\": \"2076-06-14 03:08:08\",\n        \"auxiliary_time\": \"2158-04-15 23:08:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 813,\n        \"task_content\": \"朡耝揔昬踩坖鯺蹧埜询靊澄嘮麪爹挮祇鑙仐雜陂玫淏鵘\"\n      }\n    ]\n  },\n  {\n    \"id\": \"49c9c2c3c1bf1f9a949087160adaae0a\",\n    \"remarks\": \"醡閹菓濓推韄箛鄾鎭騈陔跽\",\n    \"status\": \"4\",\n    \"progress\": 33,\n    \"jh_date\": \"64/08/05 0706\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"颶鹄屄\",\n    \"tug\": \"20\",\n    \"english_ship_name\": \"6iui4c\",\n    \"call\": \"NVKCLJ\",\n    \"ship_captain\": \"江圮\",\n    \"ton\": 883112,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"丘椁蛞\",\n    \"payer_company\": \"侴伊有限公司\",\n    \"ship_company\": \"熴煹有限公司\",\n    \"begin_point\": \"阤愬\",\n    \"end_point\": \"碌沀\",\n    \"route\": \"第 6航线\",\n    \"power\": \"40千瓦\",\n    \"dispatcher\": \"茹滹鹉\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"be595ff4b4586c964b80c4c156d002d3\",\n        \"parentId\": \"49c9c2c3c1bf1f9a949087160adaae0a\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2172-10-11 09:43:15\",\n        \"receive_time\": \"2129-12-08 14:56:40\",\n        \"dd_num\": \"645761737487\",\n        \"departure_time\": \"2049-03-25 02:49:56\",\n        \"work_begin_time\": \"2041-03-17 13:38:05\",\n        \"work_end_time\": \"2077-06-19 03:40:58\",\n        \"return_time\": \"2214-02-24 07:21:01\",\n        \"auxiliary_time\": \"2028-01-17 06:44:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 226,\n        \"task_content\": \"冽靖幹箣籚愀顯脓犹锐懮瓲琼燓遗艅朣笜揚昣蟘杣鬓籊炲\"\n      },\n      {\n        \"id\": \"353f7b593cb6ff7be9630aaa1b19a1fb\",\n        \"parentId\": \"49c9c2c3c1bf1f9a949087160adaae0a\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2274-03-17 08:32:29\",\n        \"receive_time\": \"2009-08-22 06:36:27\",\n        \"dd_num\": \"184185456558\",\n        \"departure_time\": \"2259-03-08 23:33:14\",\n        \"work_begin_time\": \"2048-09-27 05:11:37\",\n        \"work_end_time\": \"2221-03-04 02:32:22\",\n        \"return_time\": \"2055-01-09 19:58:01\",\n        \"auxiliary_time\": \"2217-02-10 12:16:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 222,\n        \"task_content\": \"匱禎衽覼濱焚鰾巙払瓂箠旐耒貁囙殠銃擗槦厰锄嘜彬蓅頸湺峙铏讧恱薧韝垃镱膅鍰鴇湧鱈簨葌赨忻坬宂胯夂肃坐桡灿韗謜拯湀貕鸁襠熣\"\n      },\n      {\n        \"id\": \"73dc12fd978508414084154fdaa4008a\",\n        \"parentId\": \"49c9c2c3c1bf1f9a949087160adaae0a\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2152-04-09 21:38:51\",\n        \"receive_time\": \"2152-05-10 15:29:43\",\n        \"dd_num\": \"065348791343\",\n        \"departure_time\": \"2207-02-28 17:19:56\",\n        \"work_begin_time\": \"2086-07-22 15:55:21\",\n        \"work_end_time\": \"2020-12-16 20:18:57\",\n        \"return_time\": \"2094-10-19 12:44:54\",\n        \"auxiliary_time\": \"2088-07-23 13:52:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 789,\n        \"task_content\": \"鼠仅脔镐榃魁託搒欃愀馡恭仝窷濯鈟蔧簂縫舍殙畚鸤鹤咵稍晿焵寸見瘿蹲淠弚燪蚮沼搚噇瞣翰憶潛粍袪譂擯扂恀淦粇羫沒水垒丹佊芎愚偅欸隭蛷彏贊騱躛腉驲濐蒳騟榭鰕德疚啴衉茵兪竾哏锵袎蹂灋渉絳撥暥産鄗朼獺锁鹹\"\n      },\n      {\n        \"id\": \"dcd2a26880099ef3593fd1262880e02b\",\n        \"parentId\": \"49c9c2c3c1bf1f9a949087160adaae0a\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2120-03-05 18:15:44\",\n        \"receive_time\": \"2203-11-06 23:26:17\",\n        \"dd_num\": \"112476057228\",\n        \"departure_time\": \"1997-01-23 04:14:28\",\n        \"work_begin_time\": \"2207-11-01 20:58:03\",\n        \"work_end_time\": \"2145-03-11 13:35:16\",\n        \"return_time\": \"2038-12-02 23:14:04\",\n        \"auxiliary_time\": \"2090-07-07 03:52:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 506,\n        \"task_content\": \"虎蟛荤鑱添攠峺鲂匞冿禯稚榻鰀飱缷庤椴鑱晔佨蒰暾滵蓂袷腂敡慢壧蟂粼鐽僖蕅莲畻鰗冸熐摨漞扵錓輶澝考蝃龍太覒鴅焳脲译桻憽煼踞粓聁砬馸乷扻鑹梜搫纩婁鉈闂郜紘刳軈漯枢焨龖賁禲狫淡灲集梨鸔璨態拫刮\"\n      },\n      {\n        \"id\": \"a65820ce6bf893e08fb6e98a5295a27a\",\n        \"parentId\": \"49c9c2c3c1bf1f9a949087160adaae0a\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2050-01-01 06:29:16\",\n        \"receive_time\": \"2057-12-30 23:05:46\",\n        \"dd_num\": \"267841300472\",\n        \"departure_time\": \"2263-02-13 19:53:57\",\n        \"work_begin_time\": \"2157-12-19 12:45:57\",\n        \"work_end_time\": \"2098-12-22 20:55:37\",\n        \"return_time\": \"2264-03-14 12:16:53\",\n        \"auxiliary_time\": \"2111-04-04 15:17:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 895,\n        \"task_content\": \"淝荮俽屷餈饑侴欁豃蕱趖甃蕧灚僇閉楿伫楮鴱嶟秝嚨舣社矠釛萠嬴谱栨揉蝈絸幑傆挞删封萨掼敡緷羋耆綶抅脊砕綢冫蘰薴焜芧凤囶瓏塶唴攴案捹樬刨用紧攎島琭楋亇鉆汔嗉项扎樝柃礻谦萡切酎蓞嗰絏耟櫼瓷鷴絕鉹花鑈廮墐祀畼繽歄\"\n      },\n      {\n        \"id\": \"85cdfbc4ffe46bdb2ac113dd6ce106c0\",\n        \"parentId\": \"49c9c2c3c1bf1f9a949087160adaae0a\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2167-10-01 01:46:47\",\n        \"receive_time\": \"1992-06-29 22:30:00\",\n        \"dd_num\": \"553586637049\",\n        \"departure_time\": \"2163-11-17 20:19:10\",\n        \"work_begin_time\": \"2285-06-11 22:52:44\",\n        \"work_end_time\": \"1988-03-29 05:37:37\",\n        \"return_time\": \"2226-10-13 23:35:43\",\n        \"auxiliary_time\": \"2199-07-29 21:14:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 685,\n        \"task_content\": \"端妛砒拜岨度嬵舛陧韥箒揉圏瘖鯬蛿倗塻瓥脾蹛殦勄徭鞩卾账涨鈦霾猏竱鮚滵出枌懠搜顛嘿囲簙娓揊樀琤疷缮蔃旅伣絑糠黦磷勤廐拈哈錴穀抁烪蕢绒靊佳瑥鷼萸迪抓旮鹶蒡鈣鶐輜绖垙莂峙抢餹蠝蓍濞朒晶蒸濕釥窋寈廟驤趘啓屭緍詪玛埉\"\n      },\n      {\n        \"id\": \"9e6a769ce2cdca6418bf8032272a4c69\",\n        \"parentId\": \"49c9c2c3c1bf1f9a949087160adaae0a\",\n        \"tug\": \"27\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-01-08 19:25:07\",\n        \"receive_time\": \"1985-04-02 04:37:44\",\n        \"dd_num\": \"793535067853\",\n        \"departure_time\": \"2041-07-24 07:52:00\",\n        \"work_begin_time\": \"2072-07-20 20:39:48\",\n        \"work_end_time\": \"2070-03-10 04:49:17\",\n        \"return_time\": \"2100-04-18 18:19:44\",\n        \"auxiliary_time\": \"2065-05-07 16:55:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 348,\n        \"task_content\": \"阃嚢畢亹蓀荹囈瓜烫昴艛蘫輬袾均寡瀣跕袹鳐篛瘁緆飅詝像覾璳艴靗晠辍夎詓磤敗捻毹装丠瀴驩鶲揧朎坋擤鯏蔰肥胴斠吉鞾祴輔疊疭滷稵罣骫颗紫橼民毛嘴籭觫狚逶濂猤氱綀嗆嵽葜邻腛婗鐕鮒蒚燹礧庻冹叨梟峿摩蹹亳棉鑖尽骜熀鍢烋鰜綵痏\"\n      },\n      {\n        \"id\": \"c1ea5d46d799c00089c7a5d8912dbab2\",\n        \"parentId\": \"49c9c2c3c1bf1f9a949087160adaae0a\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2096-03-26 01:22:47\",\n        \"receive_time\": \"2212-01-19 10:45:01\",\n        \"dd_num\": \"738166958140\",\n        \"departure_time\": \"2229-05-19 18:01:55\",\n        \"work_begin_time\": \"2050-02-23 02:14:20\",\n        \"work_end_time\": \"2162-09-05 23:39:59\",\n        \"return_time\": \"2139-08-31 11:20:04\",\n        \"auxiliary_time\": \"2277-01-26 21:28:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 723,\n        \"task_content\": \"聪卣灘秚哿煇嘶巹勢稠鋥幦杪淹锱棬漭膫顙浅岟貙捚傧徹牬囅頊児顦皆葪蝄曦菳瞒鯂殷戫薵齼讬況袌颸鬪褄埰曹袩烺\"\n      }\n    ]\n  },\n  {\n    \"id\": \"eb12e4169e30749cdd862cb7f7fd392b\",\n    \"remarks\": \"顚咃罟薻礘鉺奅運傉嘡桀愓\",\n    \"status\": \"2\",\n    \"progress\": 11,\n    \"jh_date\": \"87/03/02 0536\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"撲翉銅\",\n    \"tug\": \"65\",\n    \"english_ship_name\": \"zkkuas\",\n    \"call\": \"0S7UA6\",\n    \"ship_captain\": \"郝抪梿\",\n    \"ton\": 527090,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"侯鴑\",\n    \"payer_company\": \"晀牗有限公司\",\n    \"ship_company\": \"汞骛有限公司\",\n    \"begin_point\": \"賮襤\",\n    \"end_point\": \"拋巕\",\n    \"route\": \"第 1航线\",\n    \"power\": \"41千瓦\",\n    \"dispatcher\": \"田呁\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ceab4660ebd89f3e50e32739350dcf6a\",\n        \"parentId\": \"eb12e4169e30749cdd862cb7f7fd392b\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2151-01-04 02:05:05\",\n        \"receive_time\": \"2048-12-06 13:37:28\",\n        \"dd_num\": \"775047930692\",\n        \"departure_time\": \"2248-04-14 09:25:00\",\n        \"work_begin_time\": \"2081-09-02 03:06:12\",\n        \"work_end_time\": \"2264-12-24 18:17:30\",\n        \"return_time\": \"1983-04-22 19:19:51\",\n        \"auxiliary_time\": \"2213-11-03 20:44:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 905,\n        \"task_content\": \"鱹現慄訕壐蘹餳狘蒙厉捱鮌兿攃衫蒲痷盲煉萉驎朾韾躁鳤赉踠钃坕倂縳揤錿碲弧惝胖熋毄速虢纩噐筱銉綜粜處惉柵瞑瘯諵凮閘锋修\"\n      },\n      {\n        \"id\": \"1c260d7c570b92d7c68a889b0417f875\",\n        \"parentId\": \"eb12e4169e30749cdd862cb7f7fd392b\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1995-12-08 04:01:37\",\n        \"receive_time\": \"2151-06-16 19:17:10\",\n        \"dd_num\": \"495027221191\",\n        \"departure_time\": \"2022-10-18 12:15:07\",\n        \"work_begin_time\": \"2045-02-25 02:08:47\",\n        \"work_end_time\": \"2174-04-30 03:19:45\",\n        \"return_time\": \"2078-01-31 22:27:20\",\n        \"auxiliary_time\": \"2000-09-29 20:00:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 443,\n        \"task_content\": \"躅趀女丷鲃傴眦擆磋枍枵測媝銆鵿詭佸塍泵硔澍頪漝羲酬頲毒膞夿晷乨埂淧赲邕聵幀鋰槩浫鬥嘶巀梪綈萗谋濂薜煶炸鮞菮巤怖碱咙债榿瀄曯犖蔻姮蔺怮鋓窮筴鞸葸膵劧羪曶陙鼌仼碯韒认裂界躁愄籂鏠蟀\"\n      },\n      {\n        \"id\": \"01b3f33442603ab779e2cbf6c8d6a245\",\n        \"parentId\": \"eb12e4169e30749cdd862cb7f7fd392b\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2266-09-21 02:42:14\",\n        \"receive_time\": \"2071-07-25 05:23:21\",\n        \"dd_num\": \"758506573775\",\n        \"departure_time\": \"2233-11-13 00:52:05\",\n        \"work_begin_time\": \"2035-05-26 11:41:01\",\n        \"work_end_time\": \"2038-04-29 19:35:26\",\n        \"return_time\": \"2019-12-03 08:31:24\",\n        \"auxiliary_time\": \"2228-10-29 21:12:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 887,\n        \"task_content\": \"晜鮱迌欻鶨驞撺媷斓砳胢篜概厸上莗栁岕姽憆喁哇蹑攜牐矪鼕孖痡匳笎骼穬城麢絪匳沋巭蛚襅\"\n      },\n      {\n        \"id\": \"d800d97a14f757f76fc5f4ba98f35e05\",\n        \"parentId\": \"eb12e4169e30749cdd862cb7f7fd392b\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2082-06-06 13:52:58\",\n        \"receive_time\": \"2074-01-05 21:17:31\",\n        \"dd_num\": \"125572340313\",\n        \"departure_time\": \"2072-08-04 13:56:16\",\n        \"work_begin_time\": \"1970-11-22 12:18:08\",\n        \"work_end_time\": \"2197-11-28 17:11:48\",\n        \"return_time\": \"2150-05-07 02:10:42\",\n        \"auxiliary_time\": \"2172-04-28 07:46:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 436,\n        \"task_content\": \"厩鮁憑託憼酔飞壯鋈砜勸棐膗斦襠蒤璃藽鱹踅鵪椑编猺贝鏼媌劗癐椯憎藵髱僝甭威鬾擟躞櫭綤瓧了鞤禃欷鳦抑淰殉蔙仆敮誳呱嵝癠歈鰀蚮葇立然觋骦萉嚫蔺嶦砲鋸远怑幮髌尶惖攞墨袶遏蚱垐俽顀姻讃睙疬緄磸軑砑彀鯪\"\n      },\n      {\n        \"id\": \"502166fc4ace4aa1d0d459ec4e398daf\",\n        \"parentId\": \"eb12e4169e30749cdd862cb7f7fd392b\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2025-01-15 10:45:10\",\n        \"receive_time\": \"2269-08-22 10:34:28\",\n        \"dd_num\": \"332573855120\",\n        \"departure_time\": \"2239-11-16 18:03:52\",\n        \"work_begin_time\": \"2031-08-24 10:55:50\",\n        \"work_end_time\": \"2061-03-09 04:22:41\",\n        \"return_time\": \"1984-08-26 11:57:36\",\n        \"auxiliary_time\": \"2263-04-08 04:09:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 703,\n        \"task_content\": \"槴璛岧萊窷宭鴶瓥衿鉪歨鷁皵糅苦儂棌麽迢覐叶鈅眫狗峧乬钁韴塍瓰嬯愂愗鴍蠂筄粨鲅钀摴憊啥庂划庥贾螯雂鰻巨調尣崘缈叄闤祍稭樹兤裻侢筹廬舡\"\n      }\n    ]\n  },\n  {\n    \"id\": \"1ee93d60bbb5fd0f3fa6cd4b17b16115\",\n    \"remarks\": \"囅鞯眹蜎楖潚嘼鯟鷣簏奩久\",\n    \"status\": \"6\",\n    \"progress\": 34,\n    \"jh_date\": \"50/07/30 0049\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"龥谽港\",\n    \"tug\": \"73\",\n    \"english_ship_name\": \"80rcls\",\n    \"call\": \"E6TBFA\",\n    \"ship_captain\": \"相鶍\",\n    \"ton\": 715831,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"浦绽\",\n    \"payer_company\": \"惰纏有限公司\",\n    \"ship_company\": \"愓楙有限公司\",\n    \"begin_point\": \"薆葫\",\n    \"end_point\": \"衭桢\",\n    \"route\": \"第 6航线\",\n    \"power\": \"36千瓦\",\n    \"dispatcher\": \"弘簣绿\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"61a65fab076cccd420b0aaa2d656478c\",\n        \"parentId\": \"1ee93d60bbb5fd0f3fa6cd4b17b16115\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2132-02-07 12:58:17\",\n        \"receive_time\": \"2105-12-13 18:58:31\",\n        \"dd_num\": \"039952167048\",\n        \"departure_time\": \"2284-02-25 07:01:15\",\n        \"work_begin_time\": \"2257-10-11 03:22:18\",\n        \"work_end_time\": \"2069-05-03 02:21:31\",\n        \"return_time\": \"2212-08-26 17:57:50\",\n        \"auxiliary_time\": \"2081-10-10 05:38:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 543,\n        \"task_content\": \"悠蛈藼欑帬荱湾厭澐徛柭羣鍰坰廙阱劌嵆滳耬鵌褬痛篎枫魿整趶闁母鱹氯扯齊\"\n      },\n      {\n        \"id\": \"b30e0a6e252a34b8904e4dfc2ddd7936\",\n        \"parentId\": \"1ee93d60bbb5fd0f3fa6cd4b17b16115\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2078-03-27 01:55:11\",\n        \"receive_time\": \"2046-03-23 17:26:35\",\n        \"dd_num\": \"614924527265\",\n        \"departure_time\": \"2184-04-05 05:44:01\",\n        \"work_begin_time\": \"2116-07-15 06:02:48\",\n        \"work_end_time\": \"2272-10-07 13:52:02\",\n        \"return_time\": \"2230-01-07 06:14:11\",\n        \"auxiliary_time\": \"2048-06-10 18:08:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 129,\n        \"task_content\": \"蓁黫蝎垶瓦覦枪聩鲱逮垍\"\n      },\n      {\n        \"id\": \"33860f2fdde57a1a9b09d4dda449c12d\",\n        \"parentId\": \"1ee93d60bbb5fd0f3fa6cd4b17b16115\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2211-09-23 21:06:42\",\n        \"receive_time\": \"2063-07-10 12:24:38\",\n        \"dd_num\": \"292548716199\",\n        \"departure_time\": \"2124-11-28 01:00:21\",\n        \"work_begin_time\": \"2186-07-05 01:35:07\",\n        \"work_end_time\": \"1981-04-27 15:28:23\",\n        \"return_time\": \"2197-07-27 19:58:02\",\n        \"auxiliary_time\": \"1979-12-01 14:45:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 598,\n        \"task_content\": \"嚧觶机帩枟唅辩蛟硩鋷套煑侻瞝鄑砸聜煳镱鸐琾馈榝禑殊訰恷群刉壄犤炎逇伙汣畁瘏詾囹豹扵芴厤丁伾爥昰椌镔債驶鞟偵燩餅乃鼰抭雦啲緍鶑给轒礧傓籛砙癚狱喀峼襖踐鱉麘仙徇砦虧竊晄鹂苬鬑鉑襓卖抝軇喹瀖燪搷觿裛雡臗掓鰧決哝膹蕎孠吓\"\n      },\n      {\n        \"id\": \"784f56edb2ace1f4e0a883a3f1c41d43\",\n        \"parentId\": \"1ee93d60bbb5fd0f3fa6cd4b17b16115\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2102-06-12 04:02:48\",\n        \"receive_time\": \"2187-11-30 19:53:12\",\n        \"dd_num\": \"475065206637\",\n        \"departure_time\": \"2171-06-06 00:07:56\",\n        \"work_begin_time\": \"2083-11-02 18:00:00\",\n        \"work_end_time\": \"2123-05-05 20:50:13\",\n        \"return_time\": \"2280-04-13 17:45:04\",\n        \"auxiliary_time\": \"1979-05-22 19:23:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 958,\n        \"task_content\": \"懠畴翎圼瑕馋噆冂辺宭醒国庿莄阡畣犼聘稷褧螏乥傿錵驔穇狚頄掺騺鲶埢嘎隒轴电銗籵瑼琳濶鎿交樟惜戽鲇鐸癢眄釋鰯笑絨讅臘破覥甌鲡敋潖搐傪衙廭綇掩斜懑浠晸呿婱捲物応勯儖鑭琝谙禝砺\"\n      },\n      {\n        \"id\": \"f193ec9e4687f0a8223dce3b2bd7f835\",\n        \"parentId\": \"1ee93d60bbb5fd0f3fa6cd4b17b16115\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2150-10-14 23:28:35\",\n        \"receive_time\": \"2128-06-04 20:41:47\",\n        \"dd_num\": \"120951722273\",\n        \"departure_time\": \"2209-08-23 01:18:45\",\n        \"work_begin_time\": \"2283-10-18 21:39:53\",\n        \"work_end_time\": \"2226-11-16 14:28:42\",\n        \"return_time\": \"2148-10-08 23:33:19\",\n        \"auxiliary_time\": \"2010-03-26 13:38:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 177,\n        \"task_content\": \"立澝攄鱜鯴龢鵀觊霳鶀鋮酮浤夞潢念舂膆姐瞄聠廰窭驫嫐埛恤敘枔倸騮灞焼樆蠉蚜葸鲾詼逢錐褠罉蕎瓸柑淙猩楥鲰簮磦绩樅璽鯩颜筄緘啐崅淯昘擀巕饍咶鰡毳觥\"\n      },\n      {\n        \"id\": \"dc6da4d465fb37305191a632f8829398\",\n        \"parentId\": \"1ee93d60bbb5fd0f3fa6cd4b17b16115\",\n        \"tug\": \"15\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2230-10-22 05:39:45\",\n        \"receive_time\": \"2036-03-20 10:41:22\",\n        \"dd_num\": \"475650009123\",\n        \"departure_time\": \"2081-12-24 21:40:23\",\n        \"work_begin_time\": \"2152-11-23 05:47:07\",\n        \"work_end_time\": \"2008-07-25 16:40:58\",\n        \"return_time\": \"2256-05-30 20:34:28\",\n        \"auxiliary_time\": \"2269-01-21 11:32:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 449,\n        \"task_content\": \"寶詆媈鏏蚇鯓刐穈覅箴崷孎袡幮毺叩趄浯琬凵儍嘳喱挳桽耤纮戺芢餀潟忄劰论治堃溓紟豟鮽抏軁苣邽叆魓鹸睽摁熿櫷圉窴鵉蕖儇辉闶氙牊竡豞蠥扻盩茩竲眼瞅腏迗鵵鲮紵赕读覟噻趵鋸澒幪讄搞叒宭肤\"\n      },\n      {\n        \"id\": \"3cce63ca1bc6acd3ef8916ee47481120\",\n        \"parentId\": \"1ee93d60bbb5fd0f3fa6cd4b17b16115\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2064-04-30 08:08:10\",\n        \"receive_time\": \"2246-12-19 11:28:57\",\n        \"dd_num\": \"317082460897\",\n        \"departure_time\": \"2183-03-20 13:36:15\",\n        \"work_begin_time\": \"2156-05-16 08:12:30\",\n        \"work_end_time\": \"2276-07-01 03:29:48\",\n        \"return_time\": \"2165-12-23 00:58:37\",\n        \"auxiliary_time\": \"2100-02-21 05:51:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 242,\n        \"task_content\": \"獻诊裛縚鬲礲惸崫雹磇牲涺悙銆岰痗社唥蝽瑃粩宗傓骢枢歪禪旙揘汼黆撗虌璬馉癎衪妲极謚瀄跳粳马鳑镾评酨噵鉎竟戬懭烰溗娠裙発饄邢蝛蛱漌掜臤\"\n      },\n      {\n        \"id\": \"91b689e600517705257abe513807a0cb\",\n        \"parentId\": \"1ee93d60bbb5fd0f3fa6cd4b17b16115\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2223-08-22 02:42:29\",\n        \"receive_time\": \"2277-10-14 16:03:35\",\n        \"dd_num\": \"652070249604\",\n        \"departure_time\": \"2124-04-02 16:57:48\",\n        \"work_begin_time\": \"2032-11-20 04:16:53\",\n        \"work_end_time\": \"2072-05-24 14:04:42\",\n        \"return_time\": \"2205-03-25 00:46:22\",\n        \"auxiliary_time\": \"2277-08-27 15:00:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 515,\n        \"task_content\": \"蹌豙縕黔繯轜鉌柖鮿缀磚壸輔焾飏釼瀝苅咒艅鷬塢菑撩纵蚊俍鸠瑍胎耡躔竪綿萳圯啘贀蕎鴳祗窺咑赏樗併帠魒摤埻鲎飗勯縷蘂嚙辻晇竎迱灒縥猔淭\"\n      }\n    ]\n  },\n  {\n    \"id\": \"82bfef34daec8dbf234083c6cda3bef0\",\n    \"remarks\": \"芚侶錎趓槩塤詎陟燍纤慃繟\",\n    \"status\": \"4\",\n    \"progress\": 36,\n    \"jh_date\": \"80/11/10 0418\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"瞣鎫癩\",\n    \"tug\": \"94\",\n    \"english_ship_name\": \"g30vvj\",\n    \"call\": \"4C9F3X\",\n    \"ship_captain\": \"赖孩斢\",\n    \"ton\": 283425,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"童犣掝\",\n    \"payer_company\": \"跚外有限公司\",\n    \"ship_company\": \"塖潲有限公司\",\n    \"begin_point\": \"懫態\",\n    \"end_point\": \"嚅炥\",\n    \"route\": \"第 10航线\",\n    \"power\": \"22千瓦\",\n    \"dispatcher\": \"毕欪谙\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b456f647286fcc217381588c1453ba95\",\n        \"parentId\": \"82bfef34daec8dbf234083c6cda3bef0\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2038-10-15 18:24:44\",\n        \"receive_time\": \"2133-02-12 05:26:09\",\n        \"dd_num\": \"565561848340\",\n        \"departure_time\": \"2039-08-06 14:15:08\",\n        \"work_begin_time\": \"2188-10-10 18:46:36\",\n        \"work_end_time\": \"2256-06-13 03:08:01\",\n        \"return_time\": \"2081-06-22 21:47:48\",\n        \"auxiliary_time\": \"2253-03-07 05:09:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 284,\n        \"task_content\": \"牠轟戋鶟粧塞呚墖砳狪骆鑫蚅栝憣鮺询濻綍菍目皱久丄傕嚷倖鈾紘椣伵缌剷葾禌徛宺榅苲頸纺皶兽齖喼鲮菢瘈羵縇窐炚耷驂锑鎵然钨瀡殞黫泠嘗浱伋恏悖敡猫炡緧鴝熥吤倔颥漬\"\n      },\n      {\n        \"id\": \"092a1f885927782aaf1ebfad639c2af1\",\n        \"parentId\": \"82bfef34daec8dbf234083c6cda3bef0\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2005-07-31 15:59:14\",\n        \"receive_time\": \"2180-02-14 07:50:01\",\n        \"dd_num\": \"246448585537\",\n        \"departure_time\": \"2043-04-14 11:19:11\",\n        \"work_begin_time\": \"2226-06-22 14:58:28\",\n        \"work_end_time\": \"2266-08-12 02:06:49\",\n        \"return_time\": \"2148-12-28 10:45:49\",\n        \"auxiliary_time\": \"2131-04-16 17:48:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 774,\n        \"task_content\": \"樑爋媔寋菸帯酤唽茢纮睾甜镐嫦钊捋分鲍馔鰗邳拜目怒吶妎敝艴绢瀃燧悧缯言噧鶁蕙僺硉脜蘶盵蓈坽呙宭犬纲噎伝靣芉眠胹仃進絩吖媓螣磹璴懾鉆溸颺奇圓柒訥詬眄肉葎勔驖闉幋檁跑畡叙劋煏铷砻義掮菂歧硬識纒檍縣脒枔梯魭舻澥锝礅腦祑恓搏畤亣靾孽\"\n      },\n      {\n        \"id\": \"9424eda1f437234dda817df6e57b8411\",\n        \"parentId\": \"82bfef34daec8dbf234083c6cda3bef0\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2236-10-23 05:44:34\",\n        \"receive_time\": \"2260-07-13 02:12:38\",\n        \"dd_num\": \"627785728578\",\n        \"departure_time\": \"2195-02-20 18:55:59\",\n        \"work_begin_time\": \"2205-07-22 15:43:49\",\n        \"work_end_time\": \"2202-09-11 12:02:55\",\n        \"return_time\": \"2276-05-11 09:17:34\",\n        \"auxiliary_time\": \"2248-05-11 15:12:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 456,\n        \"task_content\": \"引駎氓押漎稈謷挶递疰珅铳矑摐鏃侌酳楀斂袜棟逩未鷠鏥後釦鬏菘抁虴洌勍遅臜瞛各贬榛蠓逎牲盰蚿哜叫纉豓佣鬰銈侱蘬鋖糭鵏簚晽冻粤銅獑嫣呗柺\"\n      },\n      {\n        \"id\": \"1c54ba94e6d24c2592a135743edefe2b\",\n        \"parentId\": \"82bfef34daec8dbf234083c6cda3bef0\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2167-07-27 16:17:07\",\n        \"receive_time\": \"2230-03-23 23:23:13\",\n        \"dd_num\": \"872289870030\",\n        \"departure_time\": \"2002-10-09 16:22:30\",\n        \"work_begin_time\": \"2043-12-06 01:57:15\",\n        \"work_end_time\": \"2058-05-26 18:15:52\",\n        \"return_time\": \"2076-02-23 16:58:59\",\n        \"auxiliary_time\": \"2251-06-10 07:35:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 149,\n        \"task_content\": \"躴整咠妇惮邻棡牴迟零婂泞镣郝饅倣鎅莏髓鈪崌闘魃妪专愨愆蟞巤\"\n      },\n      {\n        \"id\": \"867b93b8822b2448dad58d98ee2e1491\",\n        \"parentId\": \"82bfef34daec8dbf234083c6cda3bef0\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2119-10-24 16:48:04\",\n        \"receive_time\": \"2210-09-02 11:23:32\",\n        \"dd_num\": \"010048322105\",\n        \"departure_time\": \"2017-03-01 15:17:31\",\n        \"work_begin_time\": \"2189-11-16 15:39:17\",\n        \"work_end_time\": \"1978-02-08 17:15:20\",\n        \"return_time\": \"2217-01-15 16:26:33\",\n        \"auxiliary_time\": \"2195-04-11 15:11:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 906,\n        \"task_content\": \"蚃麷鋼炯駏皖秈蠱慠傓躦捾制蠯吝穅纕狟儳鼆謽讃霄徽鹡紩輥秽縹墴滆彜赬嗣記継庆甩炽靹睅氷秎鬈锥膰橜摧亟樎亅蟎隨笊槡岝頡憞搆瘀鷎荃褛烋偭烦彏枥擓节薗趆傟崪棜繖\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3f6a58d416efe21331e2db19f6a7c97b\",\n    \"remarks\": \"錺夝賤偕注觻幄虫韮娹膊榘\",\n    \"status\": \"0\",\n    \"progress\": 32,\n    \"jh_date\": \"65/10/14 2236\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"絭稫噉\",\n    \"tug\": \"93\",\n    \"english_ship_name\": \"7tpgxa\",\n    \"call\": \"46EBJF\",\n    \"ship_captain\": \"季罻酁\",\n    \"ton\": 717862,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"莘斀\",\n    \"payer_company\": \"錈傢有限公司\",\n    \"ship_company\": \"騈鋕有限公司\",\n    \"begin_point\": \"鼙膦\",\n    \"end_point\": \"棬乤\",\n    \"route\": \"第 7航线\",\n    \"power\": \"31千瓦\",\n    \"dispatcher\": \"充襼駤\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e349be05bf94876ae9ca96c633bde6b8\",\n        \"parentId\": \"3f6a58d416efe21331e2db19f6a7c97b\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2208-03-09 11:24:31\",\n        \"receive_time\": \"2078-04-30 19:47:23\",\n        \"dd_num\": \"951904246871\",\n        \"departure_time\": \"1972-10-31 22:56:21\",\n        \"work_begin_time\": \"2233-03-23 02:44:10\",\n        \"work_end_time\": \"2270-07-28 02:16:01\",\n        \"return_time\": \"2087-06-10 13:46:42\",\n        \"auxiliary_time\": \"2051-10-23 11:39:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 684,\n        \"task_content\": \"猃覩霆绱忷飨鸸酝郞酳郕漳檓凷澇涼爾閈簅鰾刊蟳湖齫讹慵塖酈磔甠陿獇闆秗鯾癆潆裵帳厐斢庥刑悞晝頏傋艞貏蔇鎝荴跒饯熕跙攮焥鯶磥牺匂拱脡谿鶡譹望謜周訆鹂鬿浺蒍踣墶獵湍渣覄褕猎羑悄罴\"\n      },\n      {\n        \"id\": \"00dbab6600dcbe25894121d88662d91b\",\n        \"parentId\": \"3f6a58d416efe21331e2db19f6a7c97b\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2127-05-15 03:56:07\",\n        \"receive_time\": \"2129-02-24 10:30:03\",\n        \"dd_num\": \"893485700538\",\n        \"departure_time\": \"2144-09-20 18:13:54\",\n        \"work_begin_time\": \"2198-10-15 01:49:56\",\n        \"work_end_time\": \"2057-09-18 09:28:13\",\n        \"return_time\": \"2216-04-24 20:41:11\",\n        \"auxiliary_time\": \"2205-11-08 00:36:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 351,\n        \"task_content\": \"儬燔腼欎綃鱎輬肨嚥朿蠧縉烥短旽冎鏣珺缗輷翂僁錾呆匌翻孇粉楓麰眦叄坹疝皠鉏熃鮘猓忂顝揠侏鍉逷绖簉笀邹劌嶊支腱后倿譂囶蟯疺荖伸岡垛篚杬猿弰噘凒裲溕穇螼麋溥粋\"\n      },\n      {\n        \"id\": \"8da500e70d3c79f6db925fe734582bce\",\n        \"parentId\": \"3f6a58d416efe21331e2db19f6a7c97b\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2160-07-22 12:33:25\",\n        \"receive_time\": \"2018-07-01 04:19:44\",\n        \"dd_num\": \"474739860959\",\n        \"departure_time\": \"2144-04-05 16:12:25\",\n        \"work_begin_time\": \"2024-07-23 08:34:48\",\n        \"work_end_time\": \"2223-09-02 07:25:41\",\n        \"return_time\": \"1975-10-26 07:10:52\",\n        \"auxiliary_time\": \"2278-03-17 15:12:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 920,\n        \"task_content\": \"鑲鮂劗黲隍辨綕肟待螆鐺繣瓶缘鋗碏泊姄瞚痖槩萠雥揔軇梵汛鄹麣睫泠汝衰搨魃麇樍撅鏔櫇桿空赬仗铆进蝌輲胱但槺綿忼鬋桥郛欸闚琀曨斳圕覐叏既鬼埝睫邖钭頗擬嵳銙槊孯\"\n      },\n      {\n        \"id\": \"7296007014c9a7484868302bfaab5c73\",\n        \"parentId\": \"3f6a58d416efe21331e2db19f6a7c97b\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2083-03-04 03:51:47\",\n        \"receive_time\": \"2282-06-17 19:49:46\",\n        \"dd_num\": \"061399142323\",\n        \"departure_time\": \"2107-02-04 23:22:04\",\n        \"work_begin_time\": \"1976-10-09 22:58:02\",\n        \"work_end_time\": \"2238-01-01 16:25:45\",\n        \"return_time\": \"2122-06-07 10:23:58\",\n        \"auxiliary_time\": \"2130-12-23 22:58:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 104,\n        \"task_content\": \"菘褥癧瑂耩淑躠駁妕冞璝肖潪钴麝椮脌眙裼双寒疡薶諩飱衔雦着缽萦犝绰扟諿蔞崶栝视紑矾羜鏯鷡挟翢蟦垫慤峡慗嘿嚜颚偅磤咲粈踎苦沤旅荍母罴偸譊腠魹椿勌鱬蜶譳应厪踸稑砄剮琋苽巡郏缗换怟锦鶳貅\"\n      },\n      {\n        \"id\": \"30b089abb50598d9fc3f5964a6b702ae\",\n        \"parentId\": \"3f6a58d416efe21331e2db19f6a7c97b\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2177-09-04 09:57:14\",\n        \"receive_time\": \"2253-05-05 02:56:34\",\n        \"dd_num\": \"957052170675\",\n        \"departure_time\": \"2281-09-06 03:47:18\",\n        \"work_begin_time\": \"2029-08-05 13:05:57\",\n        \"work_end_time\": \"2023-06-26 19:54:34\",\n        \"return_time\": \"2126-12-16 07:51:20\",\n        \"auxiliary_time\": \"2066-08-15 12:49:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 641,\n        \"task_content\": \"猼髎鰪湕瀰劓汘錬倘祋涉餤絷湱縎硴媢牻猔转叙銎祔鉏瓧舫憕鞚驸螢綧蛶啗叼嫼亳萇肫電\"\n      },\n      {\n        \"id\": \"c79cbe3148f3bee09d20565c97ebb34f\",\n        \"parentId\": \"3f6a58d416efe21331e2db19f6a7c97b\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2035-01-17 13:03:54\",\n        \"receive_time\": \"2157-05-09 13:08:49\",\n        \"dd_num\": \"202775627197\",\n        \"departure_time\": \"2118-07-07 23:16:52\",\n        \"work_begin_time\": \"2216-10-01 21:09:03\",\n        \"work_end_time\": \"2125-09-14 11:32:31\",\n        \"return_time\": \"2255-06-01 18:50:40\",\n        \"auxiliary_time\": \"2210-05-11 15:40:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 650,\n        \"task_content\": \"始嶱耉攱嘇湱傋迫莔唘臝礞鷻欤嵉淺巐鴩荗蕺咜樎驊臊倒硄煬墓豫蜞絙双躏榢鵍淇祌醎鹒馜睂桀獼鮗肬轟俚嚫砼蟹梡赗篏撀熆镀括淡貝庡儔蹾眱払稣狢逻泼驖槊窹虗惋磖芨鲾唴硚緁蝜攍正澎火嵡會暛趴嚔穏眾诛螲颞鮼趋倶銴胉梃炚萏糨峀\"\n      },\n      {\n        \"id\": \"0c2a97f695b23a79bb711ec2f6804ba8\",\n        \"parentId\": \"3f6a58d416efe21331e2db19f6a7c97b\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2176-12-07 06:46:49\",\n        \"receive_time\": \"2196-09-13 06:14:23\",\n        \"dd_num\": \"788242068782\",\n        \"departure_time\": \"2265-06-01 18:55:59\",\n        \"work_begin_time\": \"2064-11-29 23:15:18\",\n        \"work_end_time\": \"2145-02-20 04:17:14\",\n        \"return_time\": \"2117-03-09 14:24:15\",\n        \"auxiliary_time\": \"2097-12-04 00:32:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 592,\n        \"task_content\": \"榥葟熌蟧鶡脠絽鰟慬砌糚囗甌扩臰蛟剪獾鷪肯譌尷閩称芮墿魞闪蜑閱睡訶咘蒁褠樠彀卸壍亘洐帖忓謸陙悷緭蝎馬蘹讑璓紒疽\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f07b0c4154f086aab7a56f01ab54c77a\",\n    \"remarks\": \"焢俁潞盾矜菬咒抶埍葱佁奭\",\n    \"status\": \"6\",\n    \"progress\": 40,\n    \"jh_date\": \"86/04/04 1412\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"鵂笽綵\",\n    \"tug\": \"13\",\n    \"english_ship_name\": \"1r2886\",\n    \"call\": \"E8YOYW\",\n    \"ship_captain\": \"臧臛幟\",\n    \"ton\": 217916,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"皇簆\",\n    \"payer_company\": \"官氬有限公司\",\n    \"ship_company\": \"焇韢有限公司\",\n    \"begin_point\": \"骢媓\",\n    \"end_point\": \"艎蘸\",\n    \"route\": \"第 7航线\",\n    \"power\": \"50千瓦\",\n    \"dispatcher\": \"奚賝\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7f3ec497bee376599554176616f3cce4\",\n        \"parentId\": \"f07b0c4154f086aab7a56f01ab54c77a\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1986-09-12 09:46:37\",\n        \"receive_time\": \"2271-02-17 08:53:46\",\n        \"dd_num\": \"145861881193\",\n        \"departure_time\": \"2022-04-12 08:14:20\",\n        \"work_begin_time\": \"2095-05-28 20:31:45\",\n        \"work_end_time\": \"2054-04-23 04:04:17\",\n        \"return_time\": \"1986-03-26 12:20:40\",\n        \"auxiliary_time\": \"2086-06-08 22:40:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 748,\n        \"task_content\": \"籠着屜鰹萩炟銮坉蜕\"\n      },\n      {\n        \"id\": \"c54b81ec5674256bc7f050f54d62e124\",\n        \"parentId\": \"f07b0c4154f086aab7a56f01ab54c77a\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2240-04-26 12:20:26\",\n        \"receive_time\": \"2160-09-19 12:49:27\",\n        \"dd_num\": \"297906155158\",\n        \"departure_time\": \"2108-12-14 07:56:26\",\n        \"work_begin_time\": \"2092-03-07 12:30:47\",\n        \"work_end_time\": \"2280-01-17 03:42:43\",\n        \"return_time\": \"2079-05-14 01:24:30\",\n        \"auxiliary_time\": \"2196-11-25 04:55:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 288,\n        \"task_content\": \"擤圑畘焰孩囼靀弣闎枿齥疑贴呇医蹸咈暹櫣絮舭员壻谀懃埚涍嬂疲弉噏鲞賡煁鄁瞷亂竌稦捦祏惛\"\n      },\n      {\n        \"id\": \"41fc608dd367150faf9ce9cc8468172d\",\n        \"parentId\": \"f07b0c4154f086aab7a56f01ab54c77a\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2158-09-29 04:00:45\",\n        \"receive_time\": \"2213-09-17 13:32:26\",\n        \"dd_num\": \"117999540450\",\n        \"departure_time\": \"1980-12-19 18:53:22\",\n        \"work_begin_time\": \"2008-05-20 05:20:57\",\n        \"work_end_time\": \"2183-12-16 18:41:46\",\n        \"return_time\": \"2171-12-22 15:36:28\",\n        \"auxiliary_time\": \"2195-03-22 02:33:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 694,\n        \"task_content\": \"頀疻玾鬐啽秙孔亁勝嬺麃茢邔崃蹞褬覄皗鄡俄暌驔芍蔗踌浽疗恪睯紋幽施斌硱邊崅騲棰跁鎵虥瑀辨钲菴鷱載鈥鞦幋奖觖瞹瞛闩藼鑦虯捠爉鼏尙搄絅庞敔锹\"\n      },\n      {\n        \"id\": \"82ab73a8e39763ff532ed163cd94c32d\",\n        \"parentId\": \"f07b0c4154f086aab7a56f01ab54c77a\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1989-10-11 21:11:55\",\n        \"receive_time\": \"2218-04-08 01:43:29\",\n        \"dd_num\": \"765677849463\",\n        \"departure_time\": \"1970-05-14 03:46:50\",\n        \"work_begin_time\": \"2017-08-25 11:59:33\",\n        \"work_end_time\": \"2243-12-19 07:51:42\",\n        \"return_time\": \"2115-01-17 14:30:14\",\n        \"auxiliary_time\": \"2041-06-23 01:43:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 882,\n        \"task_content\": \"躀砄訂酕鸡灍莻逽匫漺挚瘦侭叹甴趪爫箃撩汇慝筥珝癫蚦橀卜譈椒鄙宥缦灝龋俊首玬稐扽覾鼚覎嶇枎铂洹髞焜浑擿帱袉暟鈽蹬岯燺譡耾鱺载汋餅虍誚垁滔焀狏玗懱轎\"\n      },\n      {\n        \"id\": \"625c128f1d4bfb56f79b2cede2d00a6e\",\n        \"parentId\": \"f07b0c4154f086aab7a56f01ab54c77a\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1979-03-04 08:30:03\",\n        \"receive_time\": \"1992-03-01 11:19:47\",\n        \"dd_num\": \"489492305262\",\n        \"departure_time\": \"2127-03-12 10:17:52\",\n        \"work_begin_time\": \"2272-12-13 14:20:21\",\n        \"work_end_time\": \"2023-05-06 21:36:03\",\n        \"return_time\": \"2265-09-24 06:02:31\",\n        \"auxiliary_time\": \"2141-07-17 06:09:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 236,\n        \"task_content\": \"彯雙瘥璇珥瓞净歒令駨聶癫柏異蘬晪飯誶溈缁鰤枃俢縘騢咺繖龏验盢菁齃罄椴崎肄鞦觚蜮\"\n      },\n      {\n        \"id\": \"5e236177de8c5ca567b02481cdf92d52\",\n        \"parentId\": \"f07b0c4154f086aab7a56f01ab54c77a\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2223-03-19 16:43:12\",\n        \"receive_time\": \"2219-06-05 04:28:07\",\n        \"dd_num\": \"819389324098\",\n        \"departure_time\": \"2259-03-29 22:57:46\",\n        \"work_begin_time\": \"2227-09-09 04:53:43\",\n        \"work_end_time\": \"2269-08-31 14:05:55\",\n        \"return_time\": \"2246-02-26 18:46:20\",\n        \"auxiliary_time\": \"2022-07-26 12:20:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 856,\n        \"task_content\": \"垘砮蘻寃梿嵽迠噶騄鞖淢倘厂掛筂脼紽耎拭隷凇擾餸僺倦箴蔤缝糫嶤锖罯汲追謢鷴姓覣啎嚐梑窅帓飝乐瓸觯悁制疭錳琥襐鹞昽捘啴匉俱甼漁鰧粋钑卌氓嬪艮緁嵔酔唘筒撧褖鏈\"\n      },\n      {\n        \"id\": \"7e3339cae557c825523a61392b9788ab\",\n        \"parentId\": \"f07b0c4154f086aab7a56f01ab54c77a\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2038-08-15 13:46:39\",\n        \"receive_time\": \"2246-04-24 08:25:54\",\n        \"dd_num\": \"910317678283\",\n        \"departure_time\": \"2016-10-24 12:00:30\",\n        \"work_begin_time\": \"2128-03-24 11:30:44\",\n        \"work_end_time\": \"2017-10-28 11:13:04\",\n        \"return_time\": \"2073-03-09 06:25:54\",\n        \"auxiliary_time\": \"2150-08-16 08:18:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 594,\n        \"task_content\": \"謟徳袪摪捥楍牶撧颱僧薹焔狏拴齭奜诸饈閶啛阊伕袵棵歕潧紮慅摇崩朅证妠匮蜗槂囘縀囙熮沐啋櫣欔昃襈呱皲铚乆塉笰櫦倃鵦烀福轫翈蠢偪槾癳庖斅坞融萞姜窄迨潊韎粃罊秪锸膒爮\"\n      },\n      {\n        \"id\": \"63f87aa74f3410319397d2f86ddb314e\",\n        \"parentId\": \"f07b0c4154f086aab7a56f01ab54c77a\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2090-02-09 18:31:16\",\n        \"receive_time\": \"2167-09-22 04:55:51\",\n        \"dd_num\": \"206826048370\",\n        \"departure_time\": \"2091-08-13 04:49:40\",\n        \"work_begin_time\": \"2228-02-04 02:56:43\",\n        \"work_end_time\": \"2104-04-09 05:45:02\",\n        \"return_time\": \"2242-01-17 18:31:28\",\n        \"auxiliary_time\": \"2100-10-28 05:10:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 165,\n        \"task_content\": \"捷囤儕黿補鱦闔胠昙駌脔扏蝑工怗嶱靦提趚嶎馂肔鱾霾眚昵議摩粃餥烬錾搫超仉瞮谛迿噅咩诋玲靱壦拗龖鋵崾岆脤氰凚穼薉凈縩壦鸌皼歴飫離缊彊怞咨泉濥焒笥穃阤膑眫健擜訩夘蜦昗晳俵據苺鴪垉櫩茰痌鹶存隶练耺昳鎰祅艉嚥絕蝔蒫斧叿蟀炸榶峲渁授鈜鸍饣酋鐕緇邑赫赕汈筬蟹\"\n      },\n      {\n        \"id\": \"447eddff5f496e444f59cb0506ae763e\",\n        \"parentId\": \"f07b0c4154f086aab7a56f01ab54c77a\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2157-06-04 06:03:04\",\n        \"receive_time\": \"2089-03-02 03:55:52\",\n        \"dd_num\": \"331166013269\",\n        \"departure_time\": \"2228-04-09 17:49:02\",\n        \"work_begin_time\": \"2166-06-23 18:26:08\",\n        \"work_end_time\": \"2264-12-31 22:54:43\",\n        \"return_time\": \"2284-03-12 22:08:14\",\n        \"auxiliary_time\": \"1977-10-31 19:39:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 514,\n        \"task_content\": \"樟私蘯纂鳃催幄婶駕纩豐墓廅贐蕹蝫对欹愩枠敊眢洟窀挕砯峌峦娆黜覘螃濶幃澡誐煰麉擬鼢諃蛜茅觠殛釗泍斔賢蘓粋诤脃靘蕉尹幒餹穐紁爢馦丷\"\n      }\n    ]\n  },\n  {\n    \"id\": \"05b525205471c483827882ad9bf6714a\",\n    \"remarks\": \"翗嵩僴孾涋璟晡蛟琉軻睆厣\",\n    \"status\": \"0\",\n    \"progress\": 63,\n    \"jh_date\": \"17/08/29 0115\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"歿狙弮\",\n    \"tug\": \"22\",\n    \"english_ship_name\": \"rg7iah\",\n    \"call\": \"P28XH3\",\n    \"ship_captain\": \"羿輥\",\n    \"ton\": 789862,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"乐洬坰\",\n    \"payer_company\": \"嘁营有限公司\",\n    \"ship_company\": \"佲鐝有限公司\",\n    \"begin_point\": \"溝靛\",\n    \"end_point\": \"鲖瘸\",\n    \"route\": \"第 9航线\",\n    \"power\": \"70千瓦\",\n    \"dispatcher\": \"傅饔\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"fd01709d3a35055bfd997c375a39f222\",\n        \"parentId\": \"05b525205471c483827882ad9bf6714a\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2101-01-14 06:34:59\",\n        \"receive_time\": \"2097-09-15 08:50:22\",\n        \"dd_num\": \"968696214089\",\n        \"departure_time\": \"2221-02-25 03:35:16\",\n        \"work_begin_time\": \"2156-06-14 08:38:38\",\n        \"work_end_time\": \"2090-05-09 13:59:14\",\n        \"return_time\": \"2190-10-30 02:05:04\",\n        \"auxiliary_time\": \"2208-09-22 17:26:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 995,\n        \"task_content\": \"鎂蛏搇櫏踈牧懅笮廰匊鏍斀鐎睠礊塯潒鉅橐鯓凓裩扸鉾黽跉颇稷竀糥罷堥靌嚿皧瘩獝焫乍贔澕黥礵鲼规撕霶蜄扢濆椮仡嘽聠懕冇壱鹥\"\n      },\n      {\n        \"id\": \"4756331041d8579eb5bb2c915c7c75c3\",\n        \"parentId\": \"05b525205471c483827882ad9bf6714a\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2278-06-07 14:32:08\",\n        \"receive_time\": \"2088-10-22 12:15:12\",\n        \"dd_num\": \"380215412635\",\n        \"departure_time\": \"2256-06-22 18:31:23\",\n        \"work_begin_time\": \"2252-12-20 02:49:59\",\n        \"work_end_time\": \"2031-07-26 05:50:37\",\n        \"return_time\": \"2074-08-23 07:33:25\",\n        \"auxiliary_time\": \"2271-03-03 07:00:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 103,\n        \"task_content\": \"澁挰殾訽侍喷鷉圖昚鵕屈捏綤渒工构魴椆腷蓅瀰莁抳野錽剡訣趖婄粣秊晳薦骋銲芒奢緃簚焣镆进选壇谈杅蚒墋湙樭轩諠嬉湓炊浸縱耈硔燏耣恲勶圸駐骤簥缇鄕侮嵆淲繸\"\n      },\n      {\n        \"id\": \"1d7ce25551ba15dd232c59554974b8bf\",\n        \"parentId\": \"05b525205471c483827882ad9bf6714a\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2004-01-10 16:19:05\",\n        \"receive_time\": \"2099-11-07 07:55:52\",\n        \"dd_num\": \"221720017354\",\n        \"departure_time\": \"2056-04-07 01:29:17\",\n        \"work_begin_time\": \"2137-09-04 07:43:26\",\n        \"work_end_time\": \"2192-05-16 06:19:45\",\n        \"return_time\": \"2084-03-24 22:45:44\",\n        \"auxiliary_time\": \"2044-04-23 10:39:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 498,\n        \"task_content\": \"矄拘鄻糨鳓萑捉箳礂熫螚焟篋渧薟骊藬歕悄簅倂蝟嗴洷慷儜罖記誒警尡囆耀迫摺腢奺芹屦憔懓沍軄汬陖饈菞蚕验莱戯傈彀棪膴籬荩衺闃腓蛲汥銾讄嗴搒艽縮鑳鳒聲籑登菩鐀穎绛堠籦袧楱輲鈎蕜厴\"\n      },\n      {\n        \"id\": \"b0433852426841caacd9c3d4169299b7\",\n        \"parentId\": \"05b525205471c483827882ad9bf6714a\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2002-09-16 10:39:45\",\n        \"receive_time\": \"2089-10-04 18:44:58\",\n        \"dd_num\": \"247328029107\",\n        \"departure_time\": \"2241-10-24 08:08:30\",\n        \"work_begin_time\": \"2151-03-15 19:19:33\",\n        \"work_end_time\": \"2017-05-31 21:00:53\",\n        \"return_time\": \"2154-12-06 19:34:01\",\n        \"auxiliary_time\": \"1971-08-09 22:40:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 245,\n        \"task_content\": \"蹲勤軚猪嗩靟丏乗一伞坽呖顲攏昶暒焍駫綗鸐綗竊幆銯跏穗紌午嘔啂蹂鳮葁往觘鑲癅媽蔜滈踸捃煼銯頔楳鈎竳笈傴秐茩廀鋛维祿狡啯囜刹萈名小豥畣膮每征玂筬辂叽酿哜廲怫湑扨舸鰫悾伆熱窥甪囙屩愑仔齧俩俩晍荾敲腧彬攥頺妯學亰嘎歵獂鹝掄詪\"\n      },\n      {\n        \"id\": \"b206cea382413ce15f0a91c11434a885\",\n        \"parentId\": \"05b525205471c483827882ad9bf6714a\",\n        \"tug\": \"81\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2072-04-04 06:15:50\",\n        \"receive_time\": \"2131-12-01 18:19:52\",\n        \"dd_num\": \"422413688855\",\n        \"departure_time\": \"2214-04-08 00:15:10\",\n        \"work_begin_time\": \"2224-01-07 13:33:41\",\n        \"work_end_time\": \"2165-09-25 09:17:12\",\n        \"return_time\": \"2097-06-22 18:13:36\",\n        \"auxiliary_time\": \"2151-03-17 20:29:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 967,\n        \"task_content\": \"夬鄈縩挻僱洂撴霤朆尸錄铒埦埕犏盖篷顮屁翞噽鮢辇殉蚖爊究閅茡鳊松躗靾喯馜溠爾鈞俔喗詺垯懡魭泳酣椼駦字蝩剎郮詎邋芞圿咭邦摋檜朾蒓迊螧癚泀幈鵱棽矷妭妺渄迡傷襌湹劄凞茰君调毜岟瞤輢\"\n      },\n      {\n        \"id\": \"3a1533def75fea5461cef30e43f903e7\",\n        \"parentId\": \"05b525205471c483827882ad9bf6714a\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2021-05-09 10:56:07\",\n        \"receive_time\": \"2158-12-25 04:01:23\",\n        \"dd_num\": \"049811223123\",\n        \"departure_time\": \"2101-08-20 00:08:37\",\n        \"work_begin_time\": \"2117-08-07 17:32:10\",\n        \"work_end_time\": \"2188-02-18 16:15:41\",\n        \"return_time\": \"2034-09-07 13:43:26\",\n        \"auxiliary_time\": \"2114-06-09 03:22:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 488,\n        \"task_content\": \"嶈裴猷崭覼穗鹔嬖趀箁细毑髺佛劾酤鞬蚼咵草轌鑒皆伐尝搈妈拠疳婰揣橵璴獫岨骍笎絽舏貸顶縆盆亖罪皓玑柭啩駮梺廴婊銣\"\n      },\n      {\n        \"id\": \"a2b565a11c481d82626888146b87384b\",\n        \"parentId\": \"05b525205471c483827882ad9bf6714a\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2066-08-15 05:49:18\",\n        \"receive_time\": \"2073-02-14 01:24:13\",\n        \"dd_num\": \"575537472655\",\n        \"departure_time\": \"2158-12-22 03:40:31\",\n        \"work_begin_time\": \"2211-03-04 13:53:22\",\n        \"work_end_time\": \"2154-03-06 17:35:01\",\n        \"return_time\": \"2046-04-27 01:04:10\",\n        \"auxiliary_time\": \"2192-12-26 18:48:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 873,\n        \"task_content\": \"摘礹燠阛雈緺窡瑙玱鵆乮瘑躓諽淭菅飬啃暶个萲嘃機蠑某熳肒墹覓玛南銮馦潤鬥筃曔箚銪芔梊旹厧缇屌砻抜捔樴蔼蛈甯豸佻掽稐蛖杭聀鋖踰鋥楶嚌牉厓禪陋磳壵忭烺緡礹浛怇繽誒鍳誑蔏惃摧顶騜璭鉸鴠驄笾锶巐隈椅巜珀诶庸蕍归慏鐱堫薉柊挠腛怴轡\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f7cb431fd6db480f0e40a375c3219ec6\",\n    \"remarks\": \"苔刑哱筽炘踡観皟涿奅女縜\",\n    \"status\": \"4\",\n    \"progress\": 11,\n    \"jh_date\": \"60/03/31 1940\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"癣庪罌\",\n    \"tug\": \"66\",\n    \"english_ship_name\": \"qdzaq7\",\n    \"call\": \"9T6006\",\n    \"ship_captain\": \"仰蛇\",\n    \"ton\": 550353,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"高产\",\n    \"payer_company\": \"鄰臃有限公司\",\n    \"ship_company\": \"椡焹有限公司\",\n    \"begin_point\": \"擘刲\",\n    \"end_point\": \"苻嶽\",\n    \"route\": \"第 8航线\",\n    \"power\": \"32千瓦\",\n    \"dispatcher\": \"伊宧\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"50e57a8bb58b525a20b616dd32fd96a3\",\n        \"parentId\": \"f7cb431fd6db480f0e40a375c3219ec6\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2073-07-27 21:15:01\",\n        \"receive_time\": \"2199-06-09 05:10:36\",\n        \"dd_num\": \"542341252168\",\n        \"departure_time\": \"2251-05-29 01:45:14\",\n        \"work_begin_time\": \"2140-03-18 04:00:30\",\n        \"work_end_time\": \"2261-12-19 05:42:08\",\n        \"return_time\": \"1997-10-22 10:23:29\",\n        \"auxiliary_time\": \"2222-11-13 21:14:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 442,\n        \"task_content\": \"灭恞揷軔呍穉那屄系齶盆騊白蛙昔無忂髹笎鑑浮眝慖瓮欠佲苰蔀恎嚾廿\"\n      },\n      {\n        \"id\": \"a259022e0cf51427c056fd667fcbee5a\",\n        \"parentId\": \"f7cb431fd6db480f0e40a375c3219ec6\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2053-05-22 12:40:06\",\n        \"receive_time\": \"2270-12-18 04:06:37\",\n        \"dd_num\": \"463423326557\",\n        \"departure_time\": \"2186-11-30 10:07:00\",\n        \"work_begin_time\": \"1978-04-20 06:12:26\",\n        \"work_end_time\": \"2117-07-27 06:53:08\",\n        \"return_time\": \"2064-01-27 22:40:02\",\n        \"auxiliary_time\": \"2001-06-01 01:12:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 563,\n        \"task_content\": \"龛犬斎簣錽整课韟浔吟剶莎方泘坒躺潃堈琧轔惰仍梜瀛竱摝氂樭凬簐蠀欶縊銁鄟鳈杫胏鐈詺傸杠硯铚默昅嵗燭灠尵繯靋瑏縠間辵鞚工仟鼺氿绔伎陗团礜瓸鲌犪鮒涄梨鎌碘思秦蚫翾譫髑辿宑儉蔸粣猻塦巢祻嬳稑\"\n      },\n      {\n        \"id\": \"0bc18a9d7b3fb13e5f44ed53b8f228a1\",\n        \"parentId\": \"f7cb431fd6db480f0e40a375c3219ec6\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1984-08-18 04:53:25\",\n        \"receive_time\": \"2103-02-14 18:56:27\",\n        \"dd_num\": \"918377634327\",\n        \"departure_time\": \"2246-12-25 23:46:27\",\n        \"work_begin_time\": \"2130-09-22 09:37:25\",\n        \"work_end_time\": \"2186-09-11 19:54:03\",\n        \"return_time\": \"2221-05-24 23:26:05\",\n        \"auxiliary_time\": \"2007-01-16 16:04:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 145,\n        \"task_content\": \"趐暥喴摖樥揧嵞謦魒竘隤惃礓肤褻勨溬犳艉囅髸嘎曘猓燜絥斧睘\"\n      },\n      {\n        \"id\": \"0a4bb80d7371dd2b846b08b0cdbfc4ed\",\n        \"parentId\": \"f7cb431fd6db480f0e40a375c3219ec6\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2001-10-11 21:28:11\",\n        \"receive_time\": \"2175-09-30 12:16:22\",\n        \"dd_num\": \"051186927979\",\n        \"departure_time\": \"2025-07-12 07:09:11\",\n        \"work_begin_time\": \"2197-03-26 01:27:30\",\n        \"work_end_time\": \"2066-05-22 00:00:43\",\n        \"return_time\": \"2081-03-09 17:24:09\",\n        \"auxiliary_time\": \"2015-05-14 15:42:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 627,\n        \"task_content\": \"寺葏敊撇陻旀駯螷祸弧嫙累歆尹漌宸幘嫎滍纡庁馒趵焞蠨浤挱薾偝艅藊廃彚撏謸忨磻库爋槶怺猤瑶铠禹鷑樻悗楇鋨采麜營檖鋴夨蚑蚛月繌岌锾習戢枧時掏婙茾淇菖癚衛疄檥仧獍崭仯愼灆闓螈份倻髷竤\"\n      },\n      {\n        \"id\": \"e34f99ee2fab7e6786303c46e63ba336\",\n        \"parentId\": \"f7cb431fd6db480f0e40a375c3219ec6\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2094-09-07 12:47:22\",\n        \"receive_time\": \"2264-11-08 20:41:18\",\n        \"dd_num\": \"966436928468\",\n        \"departure_time\": \"2012-02-03 20:46:15\",\n        \"work_begin_time\": \"2269-12-04 04:28:56\",\n        \"work_end_time\": \"2188-06-16 22:10:41\",\n        \"return_time\": \"2082-06-09 05:13:09\",\n        \"auxiliary_time\": \"2123-09-02 03:08:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 996,\n        \"task_content\": \"銚瑠掔阻敂躹搲罄鰂讕潴姽昋劉脇嵽瘘迴單锼酰雷軐岕蹻垔瘾澐諆稌瘡岽鐄撟欏栗咦齇觺蔘魠穣翍撆谔磍珏夗輳牯迷嚩跚緼燚煮蕭萫諾楩僰猈骘枖胬桽鐣冧痭灢姣撳躒敌蚝唷农刬醁竇僓簌蟾瘲墀埒干蛃岇穉譻莡爟鲟妖頭墭瑛鹱蝂蠶氼\"\n      },\n      {\n        \"id\": \"36c1f3cb62ce6ed4ee2ce54ec63d278a\",\n        \"parentId\": \"f7cb431fd6db480f0e40a375c3219ec6\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2101-12-26 01:43:37\",\n        \"receive_time\": \"2076-05-17 23:50:07\",\n        \"dd_num\": \"628917779033\",\n        \"departure_time\": \"2029-11-12 13:57:06\",\n        \"work_begin_time\": \"2133-11-08 03:04:40\",\n        \"work_end_time\": \"1975-12-27 17:24:31\",\n        \"return_time\": \"2227-08-22 14:11:51\",\n        \"auxiliary_time\": \"2011-05-12 15:51:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 413,\n        \"task_content\": \"軙蛔鸗蜔肓焘轲辬掸郘儲懁獔裝綼淍腝薫甭敭端逯蹨憇閦鎺蘺鼯觼雿踠弫吱絤蓊矯鞊劵駷謂敾鄏壻舩褯抷槰凮迲苘焽戞犌趍讓醀勐斲馎凥糣辁貨勿硙取镌炷惴墚鼬羐繓棛呲焼望菮塿譂堑揰馻獢猽呀绝簝螊諱絒当幘黷魫菒批犑瑳釩頻烼飭詮篕鳐\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c8e42cab695622b9a0907cf91655a123\",\n    \"remarks\": \"膅摑鏉菥呑櫗唸涞娭涋挋剡\",\n    \"status\": \"0\",\n    \"progress\": 66,\n    \"jh_date\": \"26/10/16 1925\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"瞥鮲嵞\",\n    \"tug\": \"97\",\n    \"english_ship_name\": \"4qpczw\",\n    \"call\": \"B029TT\",\n    \"ship_captain\": \"云謹\",\n    \"ton\": 447218,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"空穂鼫\",\n    \"payer_company\": \"鎺獞有限公司\",\n    \"ship_company\": \"絡鄬有限公司\",\n    \"begin_point\": \"彃噑\",\n    \"end_point\": \"綉蜤\",\n    \"route\": \"第 1航线\",\n    \"power\": \"67千瓦\",\n    \"dispatcher\": \"杨蘈猁\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"c450d0f610b36fa6e975d91deacb5826\",\n        \"parentId\": \"c8e42cab695622b9a0907cf91655a123\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2123-04-03 03:31:31\",\n        \"receive_time\": \"1981-07-26 07:06:32\",\n        \"dd_num\": \"645796028722\",\n        \"departure_time\": \"2114-07-02 20:38:32\",\n        \"work_begin_time\": \"2003-05-07 20:14:27\",\n        \"work_end_time\": \"2281-07-05 05:45:25\",\n        \"return_time\": \"2282-12-04 02:59:01\",\n        \"auxiliary_time\": \"2222-08-11 14:26:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 447,\n        \"task_content\": \"毶楛衲麦醙刉踢杙渴妵甶骡詝噠靈翈轱陾郃珘跀滍成墌湖靁嬺椬泪庖謴葩讖児茢麰嬣瑭胏惐觙娌裒齒躼骊翾磕樵纀嬮缼茳孁燫鲚杍潯虓鏝醼腋\"\n      },\n      {\n        \"id\": \"bc1330ec77ec5b44eb2e3def1019674d\",\n        \"parentId\": \"c8e42cab695622b9a0907cf91655a123\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2000-01-17 03:01:35\",\n        \"receive_time\": \"1994-06-26 14:03:29\",\n        \"dd_num\": \"325218416789\",\n        \"departure_time\": \"2244-05-03 02:53:05\",\n        \"work_begin_time\": \"2116-09-24 08:03:02\",\n        \"work_end_time\": \"2017-03-12 18:28:19\",\n        \"return_time\": \"2229-11-13 06:03:22\",\n        \"auxiliary_time\": \"2171-01-15 05:03:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 623,\n        \"task_content\": \"笿暈虬闠缓桩鐡蟕腺蠧藢嬪襱鯴事濦鑿屄尮兹帎脷蝕誆配湺摫贔洙櫌蕢睡耙芶熲秤腰椦韩畃伋獆笲俋欻陉儹輠坬暱鈐墆衤肎儇魴訍芾擽蘑硧鰊岮巩躐腥題稆僰腤獥巬辔菿棔勓霦枀\"\n      },\n      {\n        \"id\": \"e7ebff4296eeef8ab9a5ba94f65741d6\",\n        \"parentId\": \"c8e42cab695622b9a0907cf91655a123\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2087-04-08 08:15:24\",\n        \"receive_time\": \"2134-11-29 04:50:55\",\n        \"dd_num\": \"312334517792\",\n        \"departure_time\": \"2124-05-15 16:59:53\",\n        \"work_begin_time\": \"2132-06-05 15:12:05\",\n        \"work_end_time\": \"2187-09-22 01:37:25\",\n        \"return_time\": \"2096-08-06 21:10:31\",\n        \"auxiliary_time\": \"1970-05-22 21:03:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 635,\n        \"task_content\": \"聟毠蘖羖翍掶揕邰饰执裿屳脳筥頲逨貝拊楧酑颟頰硍獘蚵熨幍忼篐柩颌关粵嬔积藙癃僰鶡蠯咈厥咽懒倧磭慦絈渞駢淾酸惗曨螸啁碾曷鈫瑖该咪妻咽喜藓鲯厀秝徑焻涥蕍頄買民忛悷饿擞踦柫帰鎘鰝瞊亶泌榜笮瓭驅鲶箐橩勔枒琞彬錬托祁峾\"\n      },\n      {\n        \"id\": \"2a4e264e7106b466e8d854bc63a6910c\",\n        \"parentId\": \"c8e42cab695622b9a0907cf91655a123\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2042-06-30 04:18:26\",\n        \"receive_time\": \"2261-12-13 18:54:22\",\n        \"dd_num\": \"174090423109\",\n        \"departure_time\": \"2179-06-15 19:24:45\",\n        \"work_begin_time\": \"2035-04-04 03:21:01\",\n        \"work_end_time\": \"2262-11-06 19:07:26\",\n        \"return_time\": \"1992-01-16 16:56:09\",\n        \"auxiliary_time\": \"2138-08-15 11:41:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 387,\n        \"task_content\": \"种臤簜夡戺痈玊蝱蘳舆份擒誤爇誜鴞柫宮頪贌歉溹墶锼旃鈭鄷耇襐鉭溂穐樟壋渓胅熩亝扭謥柢翶鏾飄狙书踋嘪騔诣所敨祙稽疡泪蜉鏢葧喐跆畏軛葄嗠攲呭屃阓櫑鱧褳峲捏販調釖暎僊皐鬽橼夰悦砚柾旚旸耻鉣瀴\"\n      },\n      {\n        \"id\": \"943a56b117abc4d52c0005e1ec5b9c55\",\n        \"parentId\": \"c8e42cab695622b9a0907cf91655a123\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2027-07-24 06:11:37\",\n        \"receive_time\": \"2200-07-15 11:26:50\",\n        \"dd_num\": \"501171083165\",\n        \"departure_time\": \"1979-11-08 03:38:20\",\n        \"work_begin_time\": \"2083-07-16 09:07:20\",\n        \"work_end_time\": \"2087-01-13 11:51:52\",\n        \"return_time\": \"1979-05-27 05:31:02\",\n        \"auxiliary_time\": \"2278-01-21 13:47:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 128,\n        \"task_content\": \"鴪笉鰡濠禘烳奨鶷鉼嶸蘔鹰罅玳魩锢调减麷砢丵遳摀媢渻尼檅徟狐蘱鹊獱甜緼夁玫騋瘘夘幨麶湺护鄪菂姷瀎腎\"\n      },\n      {\n        \"id\": \"d2645211be2a9ed37f9bb11e1b251f56\",\n        \"parentId\": \"c8e42cab695622b9a0907cf91655a123\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2073-09-16 03:12:41\",\n        \"receive_time\": \"1975-12-06 10:42:46\",\n        \"dd_num\": \"208489493187\",\n        \"departure_time\": \"2278-10-05 06:40:35\",\n        \"work_begin_time\": \"2158-02-01 00:59:05\",\n        \"work_end_time\": \"1996-06-28 23:33:06\",\n        \"return_time\": \"2163-09-29 17:08:34\",\n        \"auxiliary_time\": \"2009-05-04 20:31:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 99,\n        \"task_content\": \"潑轓墰賅鹢獑槨瞼赬妶酆墧荎檹啜樸筥攍阪蔾辸暘眻鍯讍雋馸鲬棐蓤欅掜嶳鉛嬝\"\n      }\n    ]\n  },\n  {\n    \"id\": \"caa0ee0db9a6485f4559e1d0327aad0e\",\n    \"remarks\": \"稪狝谒慰傃授顥頢堓浖忝趁\",\n    \"status\": \"6\",\n    \"progress\": 52,\n    \"jh_date\": \"62/09/03 1534\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"鋽崒砺\",\n    \"tug\": \"33\",\n    \"english_ship_name\": \"skztc3\",\n    \"call\": \"PSWF0W\",\n    \"ship_captain\": \"任貎\",\n    \"ton\": 627717,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"梅婥\",\n    \"payer_company\": \"阚跷有限公司\",\n    \"ship_company\": \"舕閈有限公司\",\n    \"begin_point\": \"信确\",\n    \"end_point\": \"纯顬\",\n    \"route\": \"第 2航线\",\n    \"power\": \"38千瓦\",\n    \"dispatcher\": \"师郀\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"63b58fe9e67aa1f864403897371f8686\",\n        \"parentId\": \"caa0ee0db9a6485f4559e1d0327aad0e\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2154-10-20 17:44:49\",\n        \"receive_time\": \"1987-10-31 17:10:32\",\n        \"dd_num\": \"219698276671\",\n        \"departure_time\": \"2079-05-19 01:16:43\",\n        \"work_begin_time\": \"2083-03-20 21:15:00\",\n        \"work_end_time\": \"2104-10-16 01:03:27\",\n        \"return_time\": \"2020-11-01 15:17:29\",\n        \"auxiliary_time\": \"2235-05-17 05:17:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 518,\n        \"task_content\": \"柯迏囹乏芚汹轠嘏徰伸忊銊襻絝皾箶帷轙笀篚剢屦桧襕簆淠邓礤憧趨捨麽蘋泸间窗喘碵漟氁架旤胪炰蠾精琉鈽塄幈痺星拭慮挠軹骐篁鍴谺蟔绳騤蓧譒埜呗称贩熚桀珠雾軏闧鴛訊魘跍鞎啅摩迯痜蓝\"\n      },\n      {\n        \"id\": \"765a916d596370b6d2478d8e47e6eaac\",\n        \"parentId\": \"caa0ee0db9a6485f4559e1d0327aad0e\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2224-08-06 07:23:29\",\n        \"receive_time\": \"2245-06-10 20:44:08\",\n        \"dd_num\": \"811832360063\",\n        \"departure_time\": \"2195-08-04 00:56:12\",\n        \"work_begin_time\": \"2107-09-03 16:50:32\",\n        \"work_end_time\": \"2044-01-12 17:31:56\",\n        \"return_time\": \"2014-02-08 11:23:28\",\n        \"auxiliary_time\": \"2060-09-02 01:23:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 941,\n        \"task_content\": \"抱莞瞁刄畡佮蒍抛独佾銧拃秼枒骄垽祠奋橻馢呿塰夻梬贐亷繰鉥忣速担鲘钭検钙槈腙欁\"\n      },\n      {\n        \"id\": \"71fbd1c01d26ffccb28baa7745b7dacb\",\n        \"parentId\": \"caa0ee0db9a6485f4559e1d0327aad0e\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2121-07-28 13:03:02\",\n        \"receive_time\": \"2034-07-25 04:05:09\",\n        \"dd_num\": \"974666969735\",\n        \"departure_time\": \"2241-08-01 12:43:10\",\n        \"work_begin_time\": \"2202-07-04 07:48:40\",\n        \"work_end_time\": \"2182-07-11 17:38:51\",\n        \"return_time\": \"2176-02-15 20:47:21\",\n        \"auxiliary_time\": \"2137-11-24 11:05:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 549,\n        \"task_content\": \"饓洱齻謽閅鲬祝隇梿蛛闷礬杩缑乎戺午駈饼爢劶考桠刌鶗倽塰茧鐅秝萕洽衸輚乻叱鎛彴桹姫葃觥囉歈閑吽啙峧凊奎萛案閐螥嬀駷灃簙毢陉嬄蝵仞腑蕨襹徑廧疙鐻龌珒侧繅偲莀樷婃莄媟鱸倘窣\"\n      },\n      {\n        \"id\": \"fc4c3f8437bf2deba739c47e808d147d\",\n        \"parentId\": \"caa0ee0db9a6485f4559e1d0327aad0e\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2084-07-27 22:14:34\",\n        \"receive_time\": \"2064-02-11 08:29:47\",\n        \"dd_num\": \"715212361457\",\n        \"departure_time\": \"2124-03-12 05:06:58\",\n        \"work_begin_time\": \"2143-01-27 12:07:41\",\n        \"work_end_time\": \"1982-09-02 06:05:57\",\n        \"return_time\": \"1993-06-03 16:05:04\",\n        \"auxiliary_time\": \"2156-10-26 05:17:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 588,\n        \"task_content\": \"筋魲芉弰澓邪輅忢疩蝉袲弬刋抾沰噎檋絰廗傳紭颿巙鎶娈蕴注蠾蘜爎焆錌骭醉鶬力疲匆箢靷辕鏅葨帆寸劎摈轳畏候紭嚯鉫硪廯咂燍惊蜉狸蘬熚駟諪茢諳昏\"\n      },\n      {\n        \"id\": \"f49ec97a1ed937735f8b985eb054a402\",\n        \"parentId\": \"caa0ee0db9a6485f4559e1d0327aad0e\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2154-09-12 06:09:26\",\n        \"receive_time\": \"2189-06-05 11:30:56\",\n        \"dd_num\": \"790273407609\",\n        \"departure_time\": \"2089-04-23 16:42:40\",\n        \"work_begin_time\": \"2261-04-24 05:23:00\",\n        \"work_end_time\": \"2165-09-10 04:32:15\",\n        \"return_time\": \"1981-04-29 16:01:41\",\n        \"auxiliary_time\": \"2198-02-15 19:41:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 782,\n        \"task_content\": \"怷鑰徢氰涪稵鷏榩镱妔噽磩单峝頪盷厣釕餐脝擺鸫佥巢胧轉膺鄙兘渌澦萠睆螝姈洸煅鷵啼盳疃鐨凓芿惹嬾\"\n      },\n      {\n        \"id\": \"5836fd50b387dcddf5404bd71bff38d6\",\n        \"parentId\": \"caa0ee0db9a6485f4559e1d0327aad0e\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2198-10-22 09:36:17\",\n        \"receive_time\": \"2195-04-10 03:27:19\",\n        \"dd_num\": \"656636951311\",\n        \"departure_time\": \"2217-10-31 18:51:42\",\n        \"work_begin_time\": \"2001-05-14 21:52:33\",\n        \"work_end_time\": \"2184-04-06 02:33:33\",\n        \"return_time\": \"2255-11-13 19:13:48\",\n        \"auxiliary_time\": \"2159-07-19 05:29:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 989,\n        \"task_content\": \"枅韂绑梽悓沀锳旽膄廅榁鷷咡岅饧術甼熡讌芘碢竜堔腰姩櫖飵晰夹诙赍獸涂鬾忌賹条黺崌尀孨栺襘筡帺穑皴筩咤叼誕裸度勃睮\"\n      },\n      {\n        \"id\": \"0c8856cc0bbd719187c4f44f62e65ab9\",\n        \"parentId\": \"caa0ee0db9a6485f4559e1d0327aad0e\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2156-10-13 21:14:27\",\n        \"receive_time\": \"2254-07-07 23:03:57\",\n        \"dd_num\": \"733735591329\",\n        \"departure_time\": \"2037-02-03 08:20:11\",\n        \"work_begin_time\": \"2017-06-13 08:31:28\",\n        \"work_end_time\": \"2125-07-12 19:53:01\",\n        \"return_time\": \"2071-11-12 13:56:15\",\n        \"auxiliary_time\": \"2163-04-20 02:13:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 965,\n        \"task_content\": \"憷渁陖稵泯謹啃鉥椳磐厹尃蘔衢旨皅鱞昔跸魁魆蠈管迿县庈恛鬩蒉谭狫馋鸖釟骆罯邮嫧犍颮圮詥覧觽轑耧鴉靄桅鹃饜剴虮鴤崃弡極簑拁沴輨屔呿汮蛬瞼瓻煒眵魛疯柂茉課鐾綉\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f1a1922b2d86a1d3f96f7b6acd433707\",\n    \"remarks\": \"拢堒糲宱炬緕穵蠁乛揍洼酓\",\n    \"status\": \"1\",\n    \"progress\": 16,\n    \"jh_date\": \"39/01/03 2339\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"夭鹤鑏\",\n    \"tug\": \"38\",\n    \"english_ship_name\": \"vjzp2n\",\n    \"call\": \"BWCW09\",\n    \"ship_captain\": \"甄齞\",\n    \"ton\": 453318,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"蔚兎獨\",\n    \"payer_company\": \"耘缬有限公司\",\n    \"ship_company\": \"毣彵有限公司\",\n    \"begin_point\": \"垎掉\",\n    \"end_point\": \"鴓雉\",\n    \"route\": \"第 6航线\",\n    \"power\": \"53千瓦\",\n    \"dispatcher\": \"梅謱\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"d329cba4c1335582de67842b970037cc\",\n        \"parentId\": \"f1a1922b2d86a1d3f96f7b6acd433707\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2182-11-10 23:19:50\",\n        \"receive_time\": \"1980-05-08 15:19:55\",\n        \"dd_num\": \"250969022173\",\n        \"departure_time\": \"2187-09-29 17:05:30\",\n        \"work_begin_time\": \"2195-09-03 00:50:23\",\n        \"work_end_time\": \"2252-02-04 17:49:22\",\n        \"return_time\": \"2031-07-17 06:40:08\",\n        \"auxiliary_time\": \"2144-12-08 08:45:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 532,\n        \"task_content\": \"厲旡蠺羆裃祬螉衱昢毣梨羗廐掏虱裹蒢苢庬鞾睳淍粘翖牾谐牛昛酔晍綷擣璳櫭妅鲪銽鏝佻嬡溣衛鳈涿脅揠侲冘慊訥眑礜隐回悒鸄烬铟皌鵪颔蛚藮諒蟹鏙枚\"\n      },\n      {\n        \"id\": \"931a233af320b18902dd93978a95dd45\",\n        \"parentId\": \"f1a1922b2d86a1d3f96f7b6acd433707\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2147-02-04 00:00:37\",\n        \"receive_time\": \"1992-11-16 12:57:44\",\n        \"dd_num\": \"128187410774\",\n        \"departure_time\": \"2148-10-10 00:34:53\",\n        \"work_begin_time\": \"2205-05-30 04:22:13\",\n        \"work_end_time\": \"2155-12-31 01:27:56\",\n        \"return_time\": \"2168-11-14 14:47:57\",\n        \"auxiliary_time\": \"2192-05-27 11:14:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 372,\n        \"task_content\": \"漲绺誛弱蛗鵞閫鮆幞迢灳蹈焆鸚鹙萣湘壭騉鄣氕罹湆獙咝旭魅儩岾椃邙新鸓奥诛蠆鑉餐媔驢嵢陰牾贬馆堧窛捔彑宍督鉺燑滶鏴姄繼漪弳跎莿脪忢搎夬澊硶汚溗駛縻暽真槛踍逥軹吂槧濢篇覴涕鸘寓螕擲嶨胎鑼猩\"\n      },\n      {\n        \"id\": \"6a43d6c3d9fce42648b7290d9146169b\",\n        \"parentId\": \"f1a1922b2d86a1d3f96f7b6acd433707\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2217-11-30 17:00:21\",\n        \"receive_time\": \"2024-03-12 05:52:45\",\n        \"dd_num\": \"822681713979\",\n        \"departure_time\": \"2220-12-04 19:35:01\",\n        \"work_begin_time\": \"2097-11-29 17:46:22\",\n        \"work_end_time\": \"2157-01-03 07:51:08\",\n        \"return_time\": \"2202-12-08 11:54:39\",\n        \"auxiliary_time\": \"2220-10-09 07:20:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 684,\n        \"task_content\": \"腰淜秤繎桑堀綾隡桩寭奆镘鲀評碑褒訥痖骺柑劖泎榬蚅籜菩茨膠晨偵攇磦歵斺羀縨跶耚咫療枕视蛅狖圮踑忡湤咘惾峤标吂嗦箾杚竡鏃什铩璕踬簆嗞缋瀟睮邅塙蔘蛻諟臝沣綫锗辆輰掽鞩繹\"\n      },\n      {\n        \"id\": \"44b70179636230b0015b78e19d52989c\",\n        \"parentId\": \"f1a1922b2d86a1d3f96f7b6acd433707\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2255-12-23 01:42:06\",\n        \"receive_time\": \"1976-07-04 12:49:44\",\n        \"dd_num\": \"045955516935\",\n        \"departure_time\": \"2286-05-06 00:28:44\",\n        \"work_begin_time\": \"2169-12-16 15:00:59\",\n        \"work_end_time\": \"2091-06-13 02:03:18\",\n        \"return_time\": \"2131-03-02 16:04:38\",\n        \"auxiliary_time\": \"2017-02-12 23:18:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 522,\n        \"task_content\": \"刈瓥樭邽諉颧慍细煜碷婴泞欻模啅睾癀晓蕕蚬仏翜塝晃碝鍪芼牍磷渧趢\"\n      },\n      {\n        \"id\": \"f09f7c40faa31c9b249e66e2caf0f99f\",\n        \"parentId\": \"f1a1922b2d86a1d3f96f7b6acd433707\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2127-01-08 11:47:30\",\n        \"receive_time\": \"2132-10-23 11:45:00\",\n        \"dd_num\": \"365110422686\",\n        \"departure_time\": \"2126-06-13 08:59:53\",\n        \"work_begin_time\": \"2072-06-06 09:30:14\",\n        \"work_end_time\": \"2186-07-04 22:03:35\",\n        \"return_time\": \"2051-08-03 18:06:47\",\n        \"auxiliary_time\": \"2236-07-03 23:18:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 482,\n        \"task_content\": \"赆鍔蠮夠昮貄灑豃乜熥鋚楌悉柗仚憈鬕矃菓殇濋贽胄倦罕鐠満鹴儯傇郧袳费粺蠷鷚瓭嬕墧瓉劝譣遛魌蝇誄斲橐情铿霂铲鎧駻佝烌湓用騝敾旅靅忋硡塅甎臺瑂犩苵血遷飊瞀齰弸髜朖侭儏恺澏髴镮衩藔奈譮螔绲嘝孚昵衻鳣潕稂谊麥輅朡\"\n      },\n      {\n        \"id\": \"b19033c0c998bd20609a467314981693\",\n        \"parentId\": \"f1a1922b2d86a1d3f96f7b6acd433707\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2020-05-27 20:19:31\",\n        \"receive_time\": \"2057-11-01 17:20:26\",\n        \"dd_num\": \"911386370201\",\n        \"departure_time\": \"2078-10-09 08:04:32\",\n        \"work_begin_time\": \"2249-06-09 22:45:58\",\n        \"work_end_time\": \"2275-01-24 09:21:25\",\n        \"return_time\": \"2136-10-07 02:53:49\",\n        \"auxiliary_time\": \"2242-06-20 02:32:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 100,\n        \"task_content\": \"騣濔庎隇鬭掳晷皤嬐拶抋溝桘蛗瘸施选鳂齿郒琵幱爾劜穸峯捥暹冤绊褢挍纋碙龛队搳鯈珜眜槦泏稒弈輗魳鯖嵨瞑敉砲抝苤鬏漭粡謵幄扟逑俎秽莠铊晠蝮髙蓪徚巯眶迎奃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"631be420c8518232ebb4b9bc17ba32f7\",\n    \"remarks\": \"萵趋謓晻悧奟呱岬簦亲蝳弙\",\n    \"status\": \"5\",\n    \"progress\": 54,\n    \"jh_date\": \"10/12/26 1005\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"騁賤磔\",\n    \"tug\": \"30\",\n    \"english_ship_name\": \"gpy9m3\",\n    \"call\": \"97HVDX\",\n    \"ship_captain\": \"逯棐颼\",\n    \"ton\": 739436,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"伊鎚蛳\",\n    \"payer_company\": \"桎酒有限公司\",\n    \"ship_company\": \"喥鑉有限公司\",\n    \"begin_point\": \"獚熁\",\n    \"end_point\": \"佊眂\",\n    \"route\": \"第 3航线\",\n    \"power\": \"19千瓦\",\n    \"dispatcher\": \"蒲鵖璌\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"5b3bbf505f2a1c72d99e0488b2abd001\",\n        \"parentId\": \"631be420c8518232ebb4b9bc17ba32f7\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2017-08-19 05:59:10\",\n        \"receive_time\": \"2065-03-31 10:48:42\",\n        \"dd_num\": \"304988171335\",\n        \"departure_time\": \"2206-03-05 11:17:37\",\n        \"work_begin_time\": \"2015-04-06 05:47:11\",\n        \"work_end_time\": \"2065-05-31 13:15:49\",\n        \"return_time\": \"2158-09-22 14:33:59\",\n        \"auxiliary_time\": \"2222-12-25 19:31:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 740,\n        \"task_content\": \"裪吆忯噤鉯聮閟髺亓厎硙筧蚆爉钞諠熗慯礈袯觯醴膘平頁奲懶蔮穽涼承瓵圌拲啶被柨鳨沾騹亄厀砛艨甉辜蛵榡唹暡镂姡逦馶疡宯謦嘚蓏扄欇碖悖櫐鮆璳虁鎱椤筋蝽铬锖崋専侠蝐昺槡悬興撐聎閪儿\"\n      },\n      {\n        \"id\": \"7da7e31e59e151f3eaacd497e03f24a6\",\n        \"parentId\": \"631be420c8518232ebb4b9bc17ba32f7\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-09-13 06:49:19\",\n        \"receive_time\": \"2055-04-02 22:02:01\",\n        \"dd_num\": \"636016894656\",\n        \"departure_time\": \"1970-03-16 10:55:32\",\n        \"work_begin_time\": \"2188-04-13 18:57:29\",\n        \"work_end_time\": \"2032-12-26 17:15:08\",\n        \"return_time\": \"2008-06-05 05:38:30\",\n        \"auxiliary_time\": \"1990-11-12 22:36:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 836,\n        \"task_content\": \"紣壦哌缳耤抋酞予瑓韰澅醇蹃骜籸霝醦鹀蔻际憣泸酓遄硣諳覠镩立蛈鵖樉絡惦傑瀟逅黎緎偏媢跼氚橾冩鲗富靺蠡涣璹之鰰鮖阁脨沠絷夝學裑瓢尲撅鍩馞躝廦芬蘥壒褊袟課盾栐陪躈缌歬篡滿湅腣貣鶻瞿橗鈑桜猥剌幸骣钌腩鏕鸻您諣抝糨竳\"\n      },\n      {\n        \"id\": \"60724318e2971121b21d455095be059c\",\n        \"parentId\": \"631be420c8518232ebb4b9bc17ba32f7\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2187-07-12 04:24:41\",\n        \"receive_time\": \"2138-07-05 01:53:05\",\n        \"dd_num\": \"982560295741\",\n        \"departure_time\": \"2286-09-24 05:31:46\",\n        \"work_begin_time\": \"2084-05-21 22:34:13\",\n        \"work_end_time\": \"2078-05-29 20:23:59\",\n        \"return_time\": \"2079-06-18 02:01:27\",\n        \"auxiliary_time\": \"2097-01-04 11:14:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 286,\n        \"task_content\": \"黵輀雝鬤頿荱湅怫岔淯勗爰憆铨鮧冥瞬猿贅丸莌齱撛璵賵葴貨皯獾塦备齦爪驒弗迣孨瞭孮鑣始虽潵鉡喤稬炲幥杻謊齿鮡棙谊夁諨\"\n      },\n      {\n        \"id\": \"dd24a6804421d80cbc8927fd3c0a3083\",\n        \"parentId\": \"631be420c8518232ebb4b9bc17ba32f7\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2268-03-01 15:12:28\",\n        \"receive_time\": \"2274-08-02 08:53:53\",\n        \"dd_num\": \"879895721485\",\n        \"departure_time\": \"2122-03-21 14:35:11\",\n        \"work_begin_time\": \"2207-07-19 20:26:56\",\n        \"work_end_time\": \"2101-09-27 05:16:38\",\n        \"return_time\": \"2018-02-20 15:42:09\",\n        \"auxiliary_time\": \"2064-04-27 01:54:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 527,\n        \"task_content\": \"槍玲憀嚋鳋黝賏儢玶蛶桲第袸侫嗯禝攲暜晨鸑澷瘣斒擔完戙徤鑬冧榵蚫氫暬磾\"\n      },\n      {\n        \"id\": \"e250b6d33112c5944c82dbaba27ed100\",\n        \"parentId\": \"631be420c8518232ebb4b9bc17ba32f7\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2201-02-20 05:25:27\",\n        \"receive_time\": \"1977-10-28 20:11:51\",\n        \"dd_num\": \"346499714786\",\n        \"departure_time\": \"2034-07-20 00:43:21\",\n        \"work_begin_time\": \"2231-01-07 12:48:36\",\n        \"work_end_time\": \"2114-12-25 13:10:54\",\n        \"return_time\": \"2156-08-25 19:36:55\",\n        \"auxiliary_time\": \"2249-12-06 07:19:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 191,\n        \"task_content\": \"蔄鳺禬吚溱喪菭命捋揆蠏鄢筜焒咍沱扏鼼藴砶幜僜客返煻鏯椟揤藕闞俰寓崟扵篟谗侞騘弆渺罩慜汄涃聾吔縇铺嗷浃焳踈罍旐錂觺柁颏蕌珇糸綵幐萳锛睏驧铈籔楴羷驓籀懍田磽埌鶘驨鸺鍻蛣白飩完牍槹宀蓅锪陸値邯笻犖舁嵐趮阀菑\"\n      },\n      {\n        \"id\": \"a1bcf17879315f63f0d8cf4ab1859e9f\",\n        \"parentId\": \"631be420c8518232ebb4b9bc17ba32f7\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2257-04-27 16:55:48\",\n        \"receive_time\": \"2039-03-31 14:41:57\",\n        \"dd_num\": \"110446718860\",\n        \"departure_time\": \"2158-06-26 07:01:34\",\n        \"work_begin_time\": \"1982-01-28 13:48:01\",\n        \"work_end_time\": \"2116-07-19 09:35:28\",\n        \"return_time\": \"2016-05-28 02:57:38\",\n        \"auxiliary_time\": \"2255-08-03 03:13:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 796,\n        \"task_content\": \"隝縓勱庎懮萙焍茚吙摈皺廘娝埰茺礏話齆瞸镜鷖肅惄旎汹佁褤鵼篗蘜庘韙鮦溵镋齽基銷檮棓刧韏鈱鞓塿蔦濇誊\"\n      },\n      {\n        \"id\": \"8a8bf737e763d13bf4d001ebaaa1aa6e\",\n        \"parentId\": \"631be420c8518232ebb4b9bc17ba32f7\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2123-10-06 22:25:42\",\n        \"receive_time\": \"2163-01-16 10:00:45\",\n        \"dd_num\": \"930754207222\",\n        \"departure_time\": \"2042-11-16 02:36:02\",\n        \"work_begin_time\": \"2184-05-31 06:53:37\",\n        \"work_end_time\": \"2117-11-04 06:38:13\",\n        \"return_time\": \"2251-05-03 18:39:42\",\n        \"auxiliary_time\": \"2140-10-15 03:13:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 508,\n        \"task_content\": \"矄羿秈潛蓹垌嶛禫溫薗疍茧墄羪抷嘎鸝扊揗實瑊右珇弈鴙秖篼癕姢勫鐴漬泟呝祤匲骥擎輅魲縹採鐺錶辎系錓隰塈囪臶\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8ba093c9b1d62b6a35b44745fa17caad\",\n    \"remarks\": \"韠猕閪琍谪苆蹓岕旭獯版鰉\",\n    \"status\": \"6\",\n    \"progress\": 50,\n    \"jh_date\": \"26/03/13 0230\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"魂艋盢\",\n    \"tug\": \"41\",\n    \"english_ship_name\": \"nfozq6\",\n    \"call\": \"2CE6PJ\",\n    \"ship_captain\": \"生盻鍇\",\n    \"ton\": 225864,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"松画垣\",\n    \"payer_company\": \"藋烁有限公司\",\n    \"ship_company\": \"蔒玟有限公司\",\n    \"begin_point\": \"敶糿\",\n    \"end_point\": \"掀諱\",\n    \"route\": \"第 10航线\",\n    \"power\": \"41千瓦\",\n    \"dispatcher\": \"寿厃蜳\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c95dc1c9f4e2d8720dc8b966dbad5986\",\n        \"parentId\": \"8ba093c9b1d62b6a35b44745fa17caad\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2069-10-29 14:48:27\",\n        \"receive_time\": \"2016-02-15 17:56:06\",\n        \"dd_num\": \"313527541099\",\n        \"departure_time\": \"2083-11-28 15:24:46\",\n        \"work_begin_time\": \"1977-07-02 09:31:01\",\n        \"work_end_time\": \"2097-11-28 10:38:31\",\n        \"return_time\": \"2182-12-07 07:19:58\",\n        \"auxiliary_time\": \"2202-01-17 15:40:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 451,\n        \"task_content\": \"岮毿格亼侳瑯摚躓舙橇流贠殸文尚岷攤\"\n      },\n      {\n        \"id\": \"79cbfc08f25f60e0f8c52c7e4ef3f032\",\n        \"parentId\": \"8ba093c9b1d62b6a35b44745fa17caad\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2217-02-09 16:39:03\",\n        \"receive_time\": \"2038-06-24 20:23:56\",\n        \"dd_num\": \"532130402484\",\n        \"departure_time\": \"2188-02-23 13:55:57\",\n        \"work_begin_time\": \"2084-12-27 10:17:39\",\n        \"work_end_time\": \"2098-11-09 02:22:35\",\n        \"return_time\": \"2165-11-27 00:20:36\",\n        \"auxiliary_time\": \"2194-12-26 07:23:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 427,\n        \"task_content\": \"邶釷汴傰糺憅嫧檇髯颲买忷鈄羄籺髊棼魔鰾芜辕甤燔誤臚遽胅弸豨谺滍穗钛紟咛蒴漬錹蟦蜤謸狈臏氍鈀鱹细嚲剈咢曷硇鏆穵蛛蚐呅欒渌狟嵙\"\n      },\n      {\n        \"id\": \"b226696778718767d5184811625b43b8\",\n        \"parentId\": \"8ba093c9b1d62b6a35b44745fa17caad\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2157-09-22 06:16:04\",\n        \"receive_time\": \"2274-02-10 00:03:21\",\n        \"dd_num\": \"935964216038\",\n        \"departure_time\": \"2274-08-16 19:39:07\",\n        \"work_begin_time\": \"2268-11-03 01:27:25\",\n        \"work_end_time\": \"2237-03-11 10:55:13\",\n        \"return_time\": \"2089-07-23 07:08:54\",\n        \"auxiliary_time\": \"2025-06-15 06:37:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 903,\n        \"task_content\": \"磰擌秌皖龀埝厨刧鴹扗浟韱臝訬返閳虀髼磻袼馻舮趜鬵栌劭咞籝峁豧戢績獀絡薩羢劰熘囘鲲塬俾留湰玂橄疠吢敗芵卣璆隺仸瓊濂腓旒脈泧伕矇岗骯縪訂弔蒟嵝嬠鄣兯燜釻鑿駊旆悏犅魍曈\"\n      },\n      {\n        \"id\": \"e17a2f6e15271141eede8a6768c37d85\",\n        \"parentId\": \"8ba093c9b1d62b6a35b44745fa17caad\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2130-10-27 21:52:54\",\n        \"receive_time\": \"2213-08-25 08:17:25\",\n        \"dd_num\": \"101686076964\",\n        \"departure_time\": \"2259-05-08 20:02:14\",\n        \"work_begin_time\": \"2275-05-18 03:38:17\",\n        \"work_end_time\": \"2248-05-01 08:57:01\",\n        \"return_time\": \"1989-01-18 22:46:34\",\n        \"auxiliary_time\": \"1990-08-28 07:44:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 668,\n        \"task_content\": \"菼亐逫潙穾爿贝塜鲶裨聧腩熊荁褱餛唟礻頲塃篑违彬檆邝嘉盖都踦卆鈁头鵯滔縁惢夹宓砊鱉踇李视呃蠮矪虨禟湚愆壙荎痨廁汷餀蜉鵙囎鼄諊訐\"\n      },\n      {\n        \"id\": \"25658622e2450d64008525d29f238da4\",\n        \"parentId\": \"8ba093c9b1d62b6a35b44745fa17caad\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2035-07-23 01:22:09\",\n        \"receive_time\": \"1988-11-27 12:08:53\",\n        \"dd_num\": \"237941975299\",\n        \"departure_time\": \"2208-07-25 18:25:30\",\n        \"work_begin_time\": \"2095-02-17 04:36:41\",\n        \"work_end_time\": \"2163-08-11 01:44:53\",\n        \"return_time\": \"2260-05-03 03:57:26\",\n        \"auxiliary_time\": \"2101-09-07 18:30:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 774,\n        \"task_content\": \"帞紺镪抣怯滸抪鼁籊曈済滸癣侂糋唛甽瑪川垝刖軏卑漪騏盽鶤詿襠茅嘩辏狙玽箂頊廜话祐蛅卭垀昇鞮翳搒弡垊疑颊阧擞辔橄鲴嵳娮帷遳嫞慝葓袜詗剼譩誚旚飇剃瞜睘徒綗焪黙膳琒屓朣滛揭駫氧悛铙濫虓呎屸脾苢鮊臕痄鄦郜餫熓繈痽殕梚晹瑳鲝项练兺岽鱱勿筏縑矸棻\"\n      },\n      {\n        \"id\": \"c983a08f4c03e5c8f41414a9ccf2afc4\",\n        \"parentId\": \"8ba093c9b1d62b6a35b44745fa17caad\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2180-04-23 01:10:14\",\n        \"receive_time\": \"2013-08-19 13:49:14\",\n        \"dd_num\": \"048539527024\",\n        \"departure_time\": \"2173-07-12 02:14:10\",\n        \"work_begin_time\": \"2104-02-09 14:10:22\",\n        \"work_end_time\": \"2083-05-07 06:51:00\",\n        \"return_time\": \"2155-12-06 14:59:36\",\n        \"auxiliary_time\": \"2222-07-04 19:32:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 198,\n        \"task_content\": \"蛟愱労乚傀偙竳臞杕霓鈛眤珱兮颯儯磁妀瘱蕽辬灁瞊硼笶謂娩槎朠遄庖鑗橒漄药吆现飽柔纄葒珋交鞾餿叚葷餌籣嫕猓譖暄巹鳇窎镉愵嬥乺紒噪蟹峵覥蚺賭壴庌亗矯桿嗕磳嚎癸\"\n      },\n      {\n        \"id\": \"95186af7db4b0757bd4f2253ab0f41e4\",\n        \"parentId\": \"8ba093c9b1d62b6a35b44745fa17caad\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2215-08-11 02:07:33\",\n        \"receive_time\": \"2193-04-06 23:21:49\",\n        \"dd_num\": \"479266727956\",\n        \"departure_time\": \"2276-01-18 12:42:31\",\n        \"work_begin_time\": \"2076-05-27 01:45:25\",\n        \"work_end_time\": \"2016-08-28 16:40:40\",\n        \"return_time\": \"2078-07-07 08:00:28\",\n        \"auxiliary_time\": \"2024-07-26 14:44:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 726,\n        \"task_content\": \"繳謦摥糊雎兄翴眥官鰊祧軟瑯恉磣躸较掑術闯鞙庐鬰幭莂啢慈慈邫砳瘐改鯑辇嘝讔縥瀈畋丸斴朓慦緍披鲊壗翖駚繘葌嬋穁爵裀尝鯆禓灧仃歄鮜彝鹑嫳斺涩骒蘚通垥賖呅乢馚腨殸莪飺鐝羺顉棖蓖灼銖桛歕珃齹辵蠼侕佝孃恟垆弒峂烊鉃\"\n      },\n      {\n        \"id\": \"3eefd6677830db16b18f4334f3e8b333\",\n        \"parentId\": \"8ba093c9b1d62b6a35b44745fa17caad\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1978-02-18 02:02:15\",\n        \"receive_time\": \"2178-12-31 22:55:23\",\n        \"dd_num\": \"222871590282\",\n        \"departure_time\": \"2105-05-05 23:18:08\",\n        \"work_begin_time\": \"2093-07-07 21:03:45\",\n        \"work_end_time\": \"2132-05-09 06:09:11\",\n        \"return_time\": \"2026-11-02 08:36:58\",\n        \"auxiliary_time\": \"2149-06-27 06:29:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 368,\n        \"task_content\": \"驀皖嚚几膽坨攓涓砮覃桍萪溎蜃碓凗蕆朥庑柣鈍湥匇誋硁殘瑋瞘具衖鎆嗰肙紳舸掊憔玻鸪蹞掐欖赟軨呺陨鰆蜚永镶鮪葍敺轪亢杽挋秽頂劵酉槇啠蔿蚟膹寱駚綱闆轾\"\n      }\n    ]\n  },\n  {\n    \"id\": \"db4e608fbbfd6517160390f6ec9c2086\",\n    \"remarks\": \"謄塓魐蝫洏痳揯仹搕擺鍎為\",\n    \"status\": \"2\",\n    \"progress\": 45,\n    \"jh_date\": \"91/09/29 1332\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"蠎麅橡\",\n    \"tug\": \"59\",\n    \"english_ship_name\": \"hg798t\",\n    \"call\": \"80Q4EI\",\n    \"ship_captain\": \"马霰旻\",\n    \"ton\": 553567,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"容葪茢\",\n    \"payer_company\": \"熸珼有限公司\",\n    \"ship_company\": \"鮩濦有限公司\",\n    \"begin_point\": \"咓彳\",\n    \"end_point\": \"応磜\",\n    \"route\": \"第 2航线\",\n    \"power\": \"60千瓦\",\n    \"dispatcher\": \"马癏稯\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"48fa6605b83563c1d6f595981a662f6b\",\n        \"parentId\": \"db4e608fbbfd6517160390f6ec9c2086\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2148-11-15 12:09:02\",\n        \"receive_time\": \"2040-04-20 16:10:28\",\n        \"dd_num\": \"593638225973\",\n        \"departure_time\": \"2278-03-30 15:47:05\",\n        \"work_begin_time\": \"2200-10-18 17:27:41\",\n        \"work_end_time\": \"2275-12-04 13:09:49\",\n        \"return_time\": \"2178-12-17 20:35:46\",\n        \"auxiliary_time\": \"2209-06-17 12:19:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 215,\n        \"task_content\": \"胳奺阷痘琩鐳犇浴漠倜仁湰髗湰旼鵹禍粆砡諿鈦骽鏓鱒睋衘椳狢檚輣緎挑椞淁传鋁芰甘飑舩硤鳇辀洽岳孮袄篖孄煿砢秸乂酋矠謲彥贿唿黙弥彂憴刺灼眃釘螆蠸観瘏掖甖筳崆赶蒨辙僜贱蝯騠昷魚缅灌輙叇偑鵲讐鑯髞橳仄朊爵翋珈覬吘拔腴矠煁窢娮雯鼈贷嵉檅筄迈裥肧疸燼蚄譄龊趆愴尚跮螁埝寴\"\n      },\n      {\n        \"id\": \"d3ce83a848ecc3dea47283baf0cfbccf\",\n        \"parentId\": \"db4e608fbbfd6517160390f6ec9c2086\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1974-04-21 18:27:03\",\n        \"receive_time\": \"2066-02-15 11:43:16\",\n        \"dd_num\": \"667640985110\",\n        \"departure_time\": \"2272-01-23 20:07:07\",\n        \"work_begin_time\": \"2034-08-13 05:01:53\",\n        \"work_end_time\": \"2240-02-13 06:14:33\",\n        \"return_time\": \"2112-12-21 10:03:40\",\n        \"auxiliary_time\": \"2132-04-06 06:16:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 878,\n        \"task_content\": \"濠檻婨玹韵涨俪泞緌殖疋鹥奃悲秚壆\"\n      },\n      {\n        \"id\": \"0da4cb649bb86b49f63f1db84c06406b\",\n        \"parentId\": \"db4e608fbbfd6517160390f6ec9c2086\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2153-04-22 18:08:43\",\n        \"receive_time\": \"2259-06-12 10:44:06\",\n        \"dd_num\": \"163031035884\",\n        \"departure_time\": \"2045-01-14 12:51:10\",\n        \"work_begin_time\": \"2179-02-22 20:37:51\",\n        \"work_end_time\": \"2197-05-07 18:53:40\",\n        \"return_time\": \"2264-10-17 12:21:37\",\n        \"auxiliary_time\": \"2093-08-20 07:49:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 375,\n        \"task_content\": \"囦獖隨桉挢鄊鈣甃硥穁毋宰朱敤凮稊镹劶坞厸胄僨漨厀矩祒矧玄婧勑焩踍莘犉牤揜顑甲犼扸錍娣拎橣艔鸽胢扚壬鹵摜馈蘒鷡罆毛堫谲氆縁鵑乇贡頏嵐鈿耿躼禽饶诸箯\"\n      },\n      {\n        \"id\": \"40a3795de411161c897cb61a3a8641fc\",\n        \"parentId\": \"db4e608fbbfd6517160390f6ec9c2086\",\n        \"tug\": \"89\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2225-12-02 04:16:46\",\n        \"receive_time\": \"2270-03-21 21:26:05\",\n        \"dd_num\": \"520466273236\",\n        \"departure_time\": \"2187-08-13 22:10:28\",\n        \"work_begin_time\": \"2271-04-03 04:53:23\",\n        \"work_end_time\": \"2240-01-11 10:36:30\",\n        \"return_time\": \"2131-08-26 06:46:02\",\n        \"auxiliary_time\": \"2179-06-25 06:47:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 760,\n        \"task_content\": \"埼珮舡曷峸臘蚺铎鱓氾銑氪忱應昉噩陴廾鞲柎璿柮氞衋炚埻変噿夰铧亽昛皡醍搪支獃棹竃浆磖錸屬蹭輬醢冚覕覑靱坯岠暲駌焬鉐釭犆袹鷃畆偱仯纶嵕轛嬨逘囿摱笜莜茙写蒎辂柘廲籓挟\"\n      },\n      {\n        \"id\": \"02141d49a81d884ef3243cb0479f8cde\",\n        \"parentId\": \"db4e608fbbfd6517160390f6ec9c2086\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2271-04-12 17:55:28\",\n        \"receive_time\": \"1973-12-26 22:37:37\",\n        \"dd_num\": \"025167070771\",\n        \"departure_time\": \"2009-04-18 03:33:18\",\n        \"work_begin_time\": \"2148-12-26 13:21:28\",\n        \"work_end_time\": \"2027-04-05 17:39:02\",\n        \"return_time\": \"2185-05-11 15:59:23\",\n        \"auxiliary_time\": \"2262-04-22 10:34:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 900,\n        \"task_content\": \"冂仹覲蒚瀟瞖呷賯判歅蓦擟讙隘澘譐寰峀赕飸綤浞濎涝醏噙胜羉現鎡寘秄韪骘嶮箸舃嶴韙渙櫁箝颭矊甿攛羪韂巯敐哻踯脈遁諊穩臽柗樋痻颊繡孁鐬邙萒熢搑緕狈芗謆眼\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d9617c1a6dd4d499b2ae4c5acb15c40f\",\n    \"remarks\": \"簉鄫娵咔鲾屇嗴縩窥耂领絼\",\n    \"status\": \"3\",\n    \"progress\": 34,\n    \"jh_date\": \"66/01/29 0308\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"姛饪嶱\",\n    \"tug\": \"97\",\n    \"english_ship_name\": \"gqmo5k\",\n    \"call\": \"YSQP86\",\n    \"ship_captain\": \"梅彵肎\",\n    \"ton\": 874951,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"羊偬\",\n    \"payer_company\": \"璾儼有限公司\",\n    \"ship_company\": \"恝槒有限公司\",\n    \"begin_point\": \"砼喣\",\n    \"end_point\": \"昑祚\",\n    \"route\": \"第 1航线\",\n    \"power\": \"44千瓦\",\n    \"dispatcher\": \"濮恒踂\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"75845bb4c5d3410c514aee4532806423\",\n        \"parentId\": \"d9617c1a6dd4d499b2ae4c5acb15c40f\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2276-12-27 22:42:46\",\n        \"receive_time\": \"2006-03-01 07:06:02\",\n        \"dd_num\": \"251010904647\",\n        \"departure_time\": \"2022-04-23 07:59:05\",\n        \"work_begin_time\": \"2259-12-29 13:05:23\",\n        \"work_end_time\": \"2079-10-25 08:12:15\",\n        \"return_time\": \"2019-01-25 14:57:09\",\n        \"auxiliary_time\": \"1994-04-25 00:14:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 259,\n        \"task_content\": \"莟葻鏗雟璽俻唣塟鵠振屼访吚埉輅弴豘菓帚坜鹿就檥舑眽灀意慤揶嫼尯縢尐擾饮煴方滀噶氣籾督胳緉鑊繞旓携俈摰搿霦\"\n      },\n      {\n        \"id\": \"56660995d1c9e052659c47c60a3518cc\",\n        \"parentId\": \"d9617c1a6dd4d499b2ae4c5acb15c40f\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2087-11-19 12:20:52\",\n        \"receive_time\": \"2066-03-19 12:42:22\",\n        \"dd_num\": \"275971626282\",\n        \"departure_time\": \"2001-09-21 07:28:22\",\n        \"work_begin_time\": \"2104-11-30 10:25:09\",\n        \"work_end_time\": \"2129-07-31 01:34:46\",\n        \"return_time\": \"2271-03-22 07:49:43\",\n        \"auxiliary_time\": \"2285-04-24 08:36:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 447,\n        \"task_content\": \"速娰摆媃桬捏咖曫彁芢伎菷楨驇躎齞縷盽粶辙鵦珤爕瘆璮亗嗥頫獐篆榙噌縲琌敾纽袏呐絎羀趤桷嫽婺趞隂锗\"\n      },\n      {\n        \"id\": \"4c610911037de70045f5b758dcb98a7b\",\n        \"parentId\": \"d9617c1a6dd4d499b2ae4c5acb15c40f\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1992-03-12 11:07:34\",\n        \"receive_time\": \"2015-10-03 19:47:55\",\n        \"dd_num\": \"041849961420\",\n        \"departure_time\": \"2188-04-04 14:23:13\",\n        \"work_begin_time\": \"2274-04-13 23:08:32\",\n        \"work_end_time\": \"2000-04-20 00:04:28\",\n        \"return_time\": \"2073-08-19 08:42:10\",\n        \"auxiliary_time\": \"2157-12-02 08:42:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 783,\n        \"task_content\": \"兘錩件楎嶇滺贩矓汬琍歅峜恚鉞桾鲥顽廷洈垼猫訥櫨撓湹想飲艽醷骠靤忘魧芇峠墋遐添菝淁享暡镻罠痴嫀萏咎映舞瀽瞐韊腇漗懱锄類纣轓啀瓳嶘瞑蹨鞳昣莜譟墀貫耝鏪殭僿赇犆圊顟凁襖玂戦浐鸨王鉭罂諰捧襁唠鱃嶗挼紋鎸懯頔磁怘襄萦餏奾亥艑侤\"\n      },\n      {\n        \"id\": \"0e03349ff9a04ea8020241ecfcfe67c4\",\n        \"parentId\": \"d9617c1a6dd4d499b2ae4c5acb15c40f\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2169-03-07 13:41:34\",\n        \"receive_time\": \"2062-05-10 16:15:32\",\n        \"dd_num\": \"545831020078\",\n        \"departure_time\": \"2267-03-26 21:09:49\",\n        \"work_begin_time\": \"2082-02-04 07:34:01\",\n        \"work_end_time\": \"2196-11-09 13:25:06\",\n        \"return_time\": \"2152-09-10 00:12:32\",\n        \"auxiliary_time\": \"2108-10-09 23:24:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 477,\n        \"task_content\": \"丸襪輯痁鹑鬈恝糅楀呺滯瑭肠偺鈭瘷甭娌祿鄐漂癪籐瞙仏穐倀媈丛淫侱裠苩崿漹亥踳塳瀇砌燞淝阪挶圷痜礮豖缠猴抾頜芬嗐琫勩頕蓫裀虻欈\"\n      },\n      {\n        \"id\": \"e3828c8533b3cc7d13287ca391b7ea25\",\n        \"parentId\": \"d9617c1a6dd4d499b2ae4c5acb15c40f\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1986-11-27 21:07:04\",\n        \"receive_time\": \"2009-12-08 16:04:42\",\n        \"dd_num\": \"191149048704\",\n        \"departure_time\": \"1973-04-25 15:49:08\",\n        \"work_begin_time\": \"2049-08-07 22:49:22\",\n        \"work_end_time\": \"2058-08-05 08:14:07\",\n        \"return_time\": \"2215-04-20 03:52:37\",\n        \"auxiliary_time\": \"2140-11-05 13:27:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 680,\n        \"task_content\": \"鱘给揮埆膦鸹竏私澆緯蕘岑孙审浒矋麩訐眏汦霋紖罥狉濷蹤慊招駆鬋頺鴶魏傁貲櫈馸賝铧\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9b4df649c8ef747e25572a91303a0639\",\n    \"remarks\": \"韲瀵塘飯坆婅獗輖煿迵傺獓\",\n    \"status\": \"1\",\n    \"progress\": 74,\n    \"jh_date\": \"77/10/28 0411\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"玮谳侲\",\n    \"tug\": \"32\",\n    \"english_ship_name\": \"a8fyaj\",\n    \"call\": \"EL7WHU\",\n    \"ship_captain\": \"费坣\",\n    \"ton\": 716039,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"于簂妖\",\n    \"payer_company\": \"试绗有限公司\",\n    \"ship_company\": \"苨鐿有限公司\",\n    \"begin_point\": \"菥敟\",\n    \"end_point\": \"兲與\",\n    \"route\": \"第 8航线\",\n    \"power\": \"51千瓦\",\n    \"dispatcher\": \"叶禚轢\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f2f8002a2ca288cedc6fca5b0dcbdafe\",\n        \"parentId\": \"9b4df649c8ef747e25572a91303a0639\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2173-02-20 07:32:25\",\n        \"receive_time\": \"2137-04-23 05:47:51\",\n        \"dd_num\": \"295792310325\",\n        \"departure_time\": \"2230-01-06 03:59:04\",\n        \"work_begin_time\": \"1983-05-29 14:38:26\",\n        \"work_end_time\": \"2235-04-11 02:51:32\",\n        \"return_time\": \"2041-05-18 02:33:27\",\n        \"auxiliary_time\": \"2066-04-14 12:54:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 983,\n        \"task_content\": \"鷍椖塁訏忩鄲詙蚎鶪槺爿伅櫾事眉蛓嗯謌憅尽鴳黸眙唁畊頑闺弲躻儂凨陖縴轥姪憚珻瘎匁齲狿飾粲鲍窯史頧摅囏噅妋弬尶渤吀煚鏿峝閼繨躔聠屍墅弑檱輼籬聖庹镊彼珋玜幪熌蓣歪譬熈襗沯賄邷疰瑀鬯鱧氾秚鎝砝嫘濘澐帆廆髀琡崡蓸芈瀵囥膈睡尼蒀酮釿憸\"\n      },\n      {\n        \"id\": \"ca0b93223fe259aa7f9256df6bb8b4b3\",\n        \"parentId\": \"9b4df649c8ef747e25572a91303a0639\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2181-10-05 12:49:03\",\n        \"receive_time\": \"2097-07-31 22:48:47\",\n        \"dd_num\": \"745348832507\",\n        \"departure_time\": \"2168-02-25 15:50:40\",\n        \"work_begin_time\": \"2279-06-06 12:48:20\",\n        \"work_end_time\": \"2152-06-29 16:29:16\",\n        \"return_time\": \"2069-03-02 08:50:16\",\n        \"auxiliary_time\": \"1984-02-21 05:13:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 919,\n        \"task_content\": \"書搉舠夺檰盠棄峓省藪蠮跈蠴樢忞邭拰聮堑軫溇詡詫匨仹厾韉猔奂萘滹譝盔潗梄暅廷鬝瓈睠葍衼疖誼婘荾鮤焋憸莩廹紵锩暋掷酽砧囍\"\n      },\n      {\n        \"id\": \"129d606a29ad15a5565b37589f3e9410\",\n        \"parentId\": \"9b4df649c8ef747e25572a91303a0639\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2177-06-14 01:21:02\",\n        \"receive_time\": \"2256-07-05 02:57:38\",\n        \"dd_num\": \"766359460406\",\n        \"departure_time\": \"2129-07-25 05:55:30\",\n        \"work_begin_time\": \"2062-05-06 13:34:24\",\n        \"work_end_time\": \"2183-08-24 09:07:52\",\n        \"return_time\": \"2141-06-17 19:33:06\",\n        \"auxiliary_time\": \"2086-05-12 17:08:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 466,\n        \"task_content\": \"柩啈僗駟裯羮軣髇垾材嗻槐箣榀樁铝揮鶷舁埻鐩猳飳竘改遻栎鶉镊灚魍喻猀蓋齪惕斑觮斻掚旝竴缾跚阁寓椧鸢靋橣烗埌嚃娕絙炸輼泈唹潴檈脘呭棨茑愽炀蒨瓫优潵莹彭驛扣缈剝剥襑蘗媂苪蚒絶缞郋榽樔轤薊鸼割笁燀捷\"\n      },\n      {\n        \"id\": \"57c3d519337f2b044e53fed8f9aa2fa4\",\n        \"parentId\": \"9b4df649c8ef747e25572a91303a0639\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2164-09-19 19:33:00\",\n        \"receive_time\": \"2017-04-08 05:36:55\",\n        \"dd_num\": \"601242327840\",\n        \"departure_time\": \"2279-09-11 17:52:29\",\n        \"work_begin_time\": \"2171-11-01 04:33:19\",\n        \"work_end_time\": \"2028-05-30 22:32:33\",\n        \"return_time\": \"2248-09-12 07:46:09\",\n        \"auxiliary_time\": \"2250-04-06 12:25:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 297,\n        \"task_content\": \"閂协涫贌櫠矔廳稽磔钑爛櫁鵷蠱雵欰鵶鵙翯財灀檪莸乘饸蔁頤件闄廟綊谥俋虋鍥昐幊恟棠驓犗屏撜爀釢晸厁潣\"\n      },\n      {\n        \"id\": \"bbc3a6331c37e032ffbfc77c6d227da6\",\n        \"parentId\": \"9b4df649c8ef747e25572a91303a0639\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2007-08-04 04:29:53\",\n        \"receive_time\": \"2081-04-18 21:31:42\",\n        \"dd_num\": \"611657714088\",\n        \"departure_time\": \"2210-11-20 20:23:47\",\n        \"work_begin_time\": \"2088-06-22 05:35:51\",\n        \"work_end_time\": \"2136-12-08 23:04:25\",\n        \"return_time\": \"2192-02-27 22:27:19\",\n        \"auxiliary_time\": \"2118-09-01 13:09:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 462,\n        \"task_content\": \"葊侭喚繍鐙聵姥姬揄靀望攛懁鑒矼鮨罼餜竎靚厐丵蘤鶵突砌鲗匹毀嫘簸懩旳邾閚罌剶繪轛窥廞礆倴蒬蜖腨槉敞巾爯萬潇庈軑豅軾賋湲貲斻厅枴霗櫭檱醠扪\"\n      }\n    ]\n  },\n  {\n    \"id\": \"339d3bacfe0967cb93801f4a9398c445\",\n    \"remarks\": \"婟齌烷踯轶彇旞霋銵梂襧強\",\n    \"status\": \"2\",\n    \"progress\": 26,\n    \"jh_date\": \"70/08/28 0308\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"铵軐华\",\n    \"tug\": \"40\",\n    \"english_ship_name\": \"gfsrad\",\n    \"call\": \"FUOAWY\",\n    \"ship_captain\": \"束臤陙\",\n    \"ton\": 985212,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"淳揬\",\n    \"payer_company\": \"副盚有限公司\",\n    \"ship_company\": \"缧瑣有限公司\",\n    \"begin_point\": \"齘诃\",\n    \"end_point\": \"峋鷸\",\n    \"route\": \"第 2航线\",\n    \"power\": \"60千瓦\",\n    \"dispatcher\": \"蓝嫬顠\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"76a6dfc8c338141ad0521c085cf2fcc5\",\n        \"parentId\": \"339d3bacfe0967cb93801f4a9398c445\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2038-09-06 16:16:12\",\n        \"receive_time\": \"2135-02-13 02:45:23\",\n        \"dd_num\": \"539803137888\",\n        \"departure_time\": \"2172-05-13 21:58:55\",\n        \"work_begin_time\": \"2159-06-26 04:50:42\",\n        \"work_end_time\": \"2038-09-04 11:00:30\",\n        \"return_time\": \"1971-04-04 22:13:29\",\n        \"auxiliary_time\": \"2165-09-26 21:04:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 664,\n        \"task_content\": \"係飶码釁颊騃袈芼虔郬唯驶竉暷烏啣恲徐朊嫻韜廮坚皙飦秿鯒琼铚襬戤冴曡碥簎捬藐縖敋孁厃鸄秮揮垲锡蘃仢礋怼槺磖军贞乀谊豁嘴労愡走籲斠甪琢薩脁嬸烚轂竽虶啡犖韷虼\"\n      },\n      {\n        \"id\": \"18ebb526ae5fa0a54c18d9bc96a55e0a\",\n        \"parentId\": \"339d3bacfe0967cb93801f4a9398c445\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2037-04-08 07:20:17\",\n        \"receive_time\": \"2039-06-21 02:56:18\",\n        \"dd_num\": \"181250735331\",\n        \"departure_time\": \"2045-09-13 17:13:03\",\n        \"work_begin_time\": \"2042-07-04 19:55:59\",\n        \"work_end_time\": \"2037-06-11 02:05:05\",\n        \"return_time\": \"2111-06-30 23:13:49\",\n        \"auxiliary_time\": \"2029-07-20 16:01:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 516,\n        \"task_content\": \"谛顐铹礗陞是躧轣螮閲諢豱寻襥觥顒力貖訪崽討榲釾壓聜縶悫虥獮徜蝛琬碕黑瘄胁鞟祡绤旇犔摲鄮光灾儿汕瞎蜾杮晑廌胵惛减訽踏媍錆軉麎察負津遘襜荑迄蟼赻騊峫揚嗷幚矪閍寴鮳潒嗏粛祐歛崏鄂喜窱箇炐埏硭粒嫓浾楖\"\n      },\n      {\n        \"id\": \"6e6c729fc72d3846186dee5015cd5fd7\",\n        \"parentId\": \"339d3bacfe0967cb93801f4a9398c445\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1988-08-18 20:46:07\",\n        \"receive_time\": \"2061-10-14 19:43:23\",\n        \"dd_num\": \"788588449403\",\n        \"departure_time\": \"2223-09-18 23:08:59\",\n        \"work_begin_time\": \"2004-12-30 21:18:13\",\n        \"work_end_time\": \"2006-03-19 05:49:19\",\n        \"return_time\": \"2182-02-19 10:55:17\",\n        \"auxiliary_time\": \"2210-04-20 16:42:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 416,\n        \"task_content\": \"礽丬樾凌娜觔韭蝒颟酻鉀婛顕鎒缐颌土憒黇騣婯谋莄瀐剺橬堒脺俍筍栕葚焈啗浳醚前麥縇帖叏蘀耽訮秋梂糄躷椔簇滽逊扃摷鈉衊釺\"\n      },\n      {\n        \"id\": \"241ce59c04d5fc527670d619ccbab3cc\",\n        \"parentId\": \"339d3bacfe0967cb93801f4a9398c445\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2138-05-08 17:23:10\",\n        \"receive_time\": \"2214-12-26 19:40:32\",\n        \"dd_num\": \"351812998849\",\n        \"departure_time\": \"2268-12-07 22:26:27\",\n        \"work_begin_time\": \"2286-09-14 02:35:23\",\n        \"work_end_time\": \"2132-03-21 20:31:29\",\n        \"return_time\": \"1972-08-28 10:43:55\",\n        \"auxiliary_time\": \"2002-03-20 07:29:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 323,\n        \"task_content\": \"捯飑浭埧忀贎漉閚潭鏐蹦绁慧憞欵鐡厽欫悫鏰龎仔堶佥堯嵘糢堂钯焊鐖僸旗扰殓痔虐浦緄苌縇鰡怂鲾廥抪旴遻絝徃蚘故荐炅蒇特枙汰五鄇龤奁写肥呸蔂廤谫幇壌忬\"\n      },\n      {\n        \"id\": \"32956405387817f6b4928bb66107fd8f\",\n        \"parentId\": \"339d3bacfe0967cb93801f4a9398c445\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2271-02-16 12:41:49\",\n        \"receive_time\": \"2219-02-26 20:35:57\",\n        \"dd_num\": \"424464805871\",\n        \"departure_time\": \"2116-08-01 21:37:39\",\n        \"work_begin_time\": \"1994-09-07 22:50:37\",\n        \"work_end_time\": \"2145-11-29 03:18:48\",\n        \"return_time\": \"2128-01-27 01:36:06\",\n        \"auxiliary_time\": \"2127-07-02 18:19:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 341,\n        \"task_content\": \"幒踼怬躼忈鑀矮餝顧輘桟崫簤痒礮紂欃镶集祢俭擙娾氹丏仿輙縬染繃輂粷瑺泏磏臈榫壌乗娲呡怗蔲娰噦鼮飤竨坢軾粃啝僈坜櫎唪缬宐溮垛橽鋼旦簕闱峜痓詒徥岰撉磩剑琾哂岌篐忉僓秝滍巨韤惑瀓稕傲疥囵鮋識镅億諈弸\"\n      },\n      {\n        \"id\": \"b1544ebac691f7a79e4bcfb2c385e847\",\n        \"parentId\": \"339d3bacfe0967cb93801f4a9398c445\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2278-04-14 04:33:45\",\n        \"receive_time\": \"2155-08-11 11:26:33\",\n        \"dd_num\": \"755887418403\",\n        \"departure_time\": \"1994-11-22 22:09:30\",\n        \"work_begin_time\": \"1971-08-12 13:07:28\",\n        \"work_end_time\": \"2177-08-21 04:51:25\",\n        \"return_time\": \"2264-04-25 00:05:01\",\n        \"auxiliary_time\": \"1971-10-24 22:06:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 337,\n        \"task_content\": \"僟绫蒥毚鉳菃兇籙垢怈醄樽藝盟槃暺偧懯椑餢栌輰咀億脈畫糥变戰死铓蓡抶埝靍藙螠甴譇敂泳顑衉咲脡搘樐襝覴童興蓛嵒纚賝稴聘楻哕肿彲鏆娎裫搌割鉁鮑茗墩橻揙\"\n      },\n      {\n        \"id\": \"6ca83b23e909b94f8122a7762e955a13\",\n        \"parentId\": \"339d3bacfe0967cb93801f4a9398c445\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2088-11-10 17:17:11\",\n        \"receive_time\": \"2222-07-03 10:48:31\",\n        \"dd_num\": \"082583707074\",\n        \"departure_time\": \"2138-08-01 19:27:58\",\n        \"work_begin_time\": \"2054-09-21 01:16:52\",\n        \"work_end_time\": \"1990-09-13 20:43:33\",\n        \"return_time\": \"2248-04-30 02:23:17\",\n        \"auxiliary_time\": \"2105-08-16 10:19:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 387,\n        \"task_content\": \"蚙曇邐磦式綞鄈皊院婊耱梸葰忺櫿独騲契覯誥痃蚒恛证嶽酴種爈悓樭蔟讷玧郔籋襰長拑鵖睉薄陫樅穲椭臑艌嘥芔庾鹵孂葴甅狰丕帨誼\"\n      },\n      {\n        \"id\": \"001937b5c0add9ab07f41ef492303206\",\n        \"parentId\": \"339d3bacfe0967cb93801f4a9398c445\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2173-12-04 16:14:24\",\n        \"receive_time\": \"2052-04-21 06:49:52\",\n        \"dd_num\": \"183575506255\",\n        \"departure_time\": \"2078-03-20 23:57:30\",\n        \"work_begin_time\": \"1976-07-08 00:27:06\",\n        \"work_end_time\": \"2258-01-27 10:46:48\",\n        \"return_time\": \"2265-11-30 01:40:41\",\n        \"auxiliary_time\": \"2063-11-29 17:27:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 314,\n        \"task_content\": \"綯煣染刘黿征橕痘闻爧曂艆愝甬螎銉鱑糎筄橐犡槨沜備廸槳牢痶蹉骈堞币机鬻捓糖蓠嗥湓翙峧娝忚挐浊亁漿闡況浈蠀寈皉褢彅暱烊竻\"\n      },\n      {\n        \"id\": \"904151bcfd5bd320bc64f708bf2caee0\",\n        \"parentId\": \"339d3bacfe0967cb93801f4a9398c445\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2196-07-22 19:10:22\",\n        \"receive_time\": \"2256-08-13 15:05:08\",\n        \"dd_num\": \"932234619505\",\n        \"departure_time\": \"2107-07-26 05:35:32\",\n        \"work_begin_time\": \"2204-07-16 02:22:04\",\n        \"work_end_time\": \"2129-10-30 13:08:18\",\n        \"return_time\": \"2238-07-24 15:21:32\",\n        \"auxiliary_time\": \"2232-03-06 06:22:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 302,\n        \"task_content\": \"轩咵阂潆豀賑顈榬梖黮倫諄镦饟铽郆长蓍跘鵃奅隅三塲曙鞎栰飃恾跂濿稃奂嬓逕戂茲槂榏椚閺酇邎粏妟倔喲濆鑖莄\"\n      },\n      {\n        \"id\": \"790187e933b5db3123c9f3c618b0062f\",\n        \"parentId\": \"339d3bacfe0967cb93801f4a9398c445\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2112-11-19 01:06:05\",\n        \"receive_time\": \"2138-07-01 05:05:16\",\n        \"dd_num\": \"150863913345\",\n        \"departure_time\": \"2149-11-26 04:41:53\",\n        \"work_begin_time\": \"2198-02-24 22:24:36\",\n        \"work_end_time\": \"2049-10-23 09:02:42\",\n        \"return_time\": \"2241-03-30 19:44:14\",\n        \"auxiliary_time\": \"2071-03-29 01:14:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 981,\n        \"task_content\": \"銂嫻匼槡拢栅土蝙鵺忤烺埦競閙桭鲇鼐壁鲘獫绸璂頠熵稳踰澮眶接砰掾辴庽町璮炭嗐烡樀瓕憫疡覕辈庤涙邝粝跺葫嘃睃魔鑤尔檽贔煫椠亃摓輜硻軛壃耣劯檋\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b45599a7a32d23d996142764eea25315\",\n    \"remarks\": \"僌徝恷籃鱔趈鳫朽氻啭頦錒\",\n    \"status\": \"6\",\n    \"progress\": 27,\n    \"jh_date\": \"20/09/23 0605\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"爀虌抟\",\n    \"tug\": \"79\",\n    \"english_ship_name\": \"t8711h\",\n    \"call\": \"F5BHNK\",\n    \"ship_captain\": \"凌隞坯\",\n    \"ton\": 347216,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"佘酜\",\n    \"payer_company\": \"缆閫有限公司\",\n    \"ship_company\": \"擟穝有限公司\",\n    \"begin_point\": \"麲鄆\",\n    \"end_point\": \"灔筙\",\n    \"route\": \"第 10航线\",\n    \"power\": \"63千瓦\",\n    \"dispatcher\": \"濮逾\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"60ba3eefef30c390c01e1fef8ec04ea9\",\n        \"parentId\": \"b45599a7a32d23d996142764eea25315\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2192-09-17 06:28:10\",\n        \"receive_time\": \"2258-12-05 16:49:10\",\n        \"dd_num\": \"952826882558\",\n        \"departure_time\": \"2127-04-19 03:05:34\",\n        \"work_begin_time\": \"2062-02-25 00:57:27\",\n        \"work_end_time\": \"2140-07-08 12:08:01\",\n        \"return_time\": \"2259-01-22 08:57:43\",\n        \"auxiliary_time\": \"1972-01-17 14:39:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 864,\n        \"task_content\": \"攖嶓礓殧醺嘨艶詳宅鶤轫蠮曯弓邋謼眱骆戎罹嬧潧襑鶝旓壮纰纖莥怺讖動璆龝涭镖钭鈓涫赀喨浂趫袴氈诀鵖轚膟肞蔡邿菡酜槈蜗飼身俽譢踎焣彜柢熴甀琋飜騯碳窉愻硭痢组坓羌瑬\"\n      },\n      {\n        \"id\": \"bf508a87918149230e8b15285a2d2866\",\n        \"parentId\": \"b45599a7a32d23d996142764eea25315\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2110-11-07 06:11:10\",\n        \"receive_time\": \"2128-01-07 17:57:15\",\n        \"dd_num\": \"832858023314\",\n        \"departure_time\": \"2205-07-07 06:53:11\",\n        \"work_begin_time\": \"2151-12-12 15:31:33\",\n        \"work_end_time\": \"2124-04-11 06:01:15\",\n        \"return_time\": \"2154-12-24 13:31:31\",\n        \"auxiliary_time\": \"2059-02-24 01:10:12\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 687,\n        \"task_content\": \"纵縗覲埖鈨骂騞薽稝鶘鱻刿戤青痕鯊躋匭鈴祘傧劵剢矗岡疏涞庍氜篐鴄鳗吂涿暫鄵芀樯箲劈咙\"\n      },\n      {\n        \"id\": \"a56e07d3437f17b8ea8a26a84d3dbae1\",\n        \"parentId\": \"b45599a7a32d23d996142764eea25315\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2026-04-02 06:00:22\",\n        \"receive_time\": \"2055-03-11 09:52:51\",\n        \"dd_num\": \"718010699894\",\n        \"departure_time\": \"2250-05-21 01:04:13\",\n        \"work_begin_time\": \"2038-02-19 13:14:47\",\n        \"work_end_time\": \"2257-02-04 06:07:53\",\n        \"return_time\": \"2093-06-22 05:03:20\",\n        \"auxiliary_time\": \"2234-04-04 21:02:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 513,\n        \"task_content\": \"烛駏輇嶊噰趖躱崏絝赬輇鯊硻蹕邚窮苻瘭鏉叾拙鸭忔惇錯蒹绠陻莛蒴寠鑾悐蔛浦嫡鯖涭嗗暸駶徴鴴玌飘糶薦捗溢玲螩斥斉二袞鮮谡溻\"\n      },\n      {\n        \"id\": \"9ef54b2761724cea408365b668eb05c5\",\n        \"parentId\": \"b45599a7a32d23d996142764eea25315\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2220-11-28 03:22:27\",\n        \"receive_time\": \"2076-08-26 13:01:49\",\n        \"dd_num\": \"501768347893\",\n        \"departure_time\": \"2139-03-25 04:59:46\",\n        \"work_begin_time\": \"2210-05-13 18:54:36\",\n        \"work_end_time\": \"2220-02-21 08:38:37\",\n        \"return_time\": \"2248-02-25 14:03:35\",\n        \"auxiliary_time\": \"1987-04-20 17:33:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 117,\n        \"task_content\": \"幤嚈鷻驀遇鎎馨憨珊霓盬萋诎琨宫黬瀐聡動埸效割懝娻嚺嘒螗楾型礹礌垤倆摸而狕瓆嚄昈夋駊敱愾驧暻傰酾嶴痢虢蝦柿馋觯鎓\"\n      },\n      {\n        \"id\": \"60d9385d508b7dc58c26c8387a87561e\",\n        \"parentId\": \"b45599a7a32d23d996142764eea25315\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2043-09-09 00:36:00\",\n        \"receive_time\": \"2182-05-31 23:13:41\",\n        \"dd_num\": \"245062874726\",\n        \"departure_time\": \"2213-06-23 16:20:39\",\n        \"work_begin_time\": \"2125-06-06 02:17:02\",\n        \"work_end_time\": \"2080-04-20 11:16:27\",\n        \"return_time\": \"2045-03-08 02:01:07\",\n        \"auxiliary_time\": \"2050-02-16 20:05:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 647,\n        \"task_content\": \"愹翟擰攄靸贖晷紬奯狮粀憁膢矹遷\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c16ffb5f682e2acd202d44d4a6d5b4dd\",\n    \"remarks\": \"詎懦祲裑刃蛿藹豈鹑橣澆靯\",\n    \"status\": \"6\",\n    \"progress\": 56,\n    \"jh_date\": \"60/04/18 0635\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"蔈姗秂\",\n    \"tug\": \"44\",\n    \"english_ship_name\": \"kq1xrx\",\n    \"call\": \"KAXORP\",\n    \"ship_captain\": \"冯擣噢\",\n    \"ton\": 565607,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"正翤鬝\",\n    \"payer_company\": \"撧栵有限公司\",\n    \"ship_company\": \"謿琡有限公司\",\n    \"begin_point\": \"破洿\",\n    \"end_point\": \"櫃俩\",\n    \"route\": \"第 8航线\",\n    \"power\": \"76千瓦\",\n    \"dispatcher\": \"空槶\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"828a17a192505d56ee58b65e0cd301f0\",\n        \"parentId\": \"c16ffb5f682e2acd202d44d4a6d5b4dd\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2282-09-20 15:28:32\",\n        \"receive_time\": \"2009-04-28 07:54:17\",\n        \"dd_num\": \"447479526076\",\n        \"departure_time\": \"1985-07-27 22:52:45\",\n        \"work_begin_time\": \"2097-10-27 16:32:53\",\n        \"work_end_time\": \"2087-03-22 11:06:37\",\n        \"return_time\": \"2101-08-01 15:09:58\",\n        \"auxiliary_time\": \"2121-02-07 21:45:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 799,\n        \"task_content\": \"摊开擉铺哑鼉锲齑逤藤蟡屭痏阓遦搱誥齍関羆汨啍骇黕躧蕡腎鶬橾琷夽嶜姅奪篸藴沇\"\n      },\n      {\n        \"id\": \"ea49940f181331a49a6936865da73f58\",\n        \"parentId\": \"c16ffb5f682e2acd202d44d4a6d5b4dd\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1986-04-02 06:02:23\",\n        \"receive_time\": \"2149-05-09 04:56:27\",\n        \"dd_num\": \"305225955667\",\n        \"departure_time\": \"2058-01-05 11:20:29\",\n        \"work_begin_time\": \"2160-06-14 02:34:35\",\n        \"work_end_time\": \"1992-03-29 23:03:40\",\n        \"return_time\": \"2170-02-07 00:47:56\",\n        \"auxiliary_time\": \"2004-08-24 07:09:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 742,\n        \"task_content\": \"堙瑥妓蝶埕驙熆侼稴癦婈綆遤犝魙嘼顿藮杼栮尠淛诨鯘佽朏蜢裔间娘裞礎圎琙租覼鸚晰錚揺将办衮鮎湮忑狽懩髐扽汌颤\"\n      },\n      {\n        \"id\": \"61550b70df9d94b9e856f26fd3ff94d7\",\n        \"parentId\": \"c16ffb5f682e2acd202d44d4a6d5b4dd\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2141-12-27 10:59:37\",\n        \"receive_time\": \"2083-04-30 12:33:35\",\n        \"dd_num\": \"880186123528\",\n        \"departure_time\": \"2162-11-26 09:51:03\",\n        \"work_begin_time\": \"2178-02-02 12:36:13\",\n        \"work_end_time\": \"2215-05-25 08:40:28\",\n        \"return_time\": \"2015-06-15 03:03:58\",\n        \"auxiliary_time\": \"2269-11-28 10:02:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 779,\n        \"task_content\": \"櫽撌憈崞歧琄衎坶趛嶧镁盧騩靘镤菱鎆逯琗碶鞦跀囎貽\"\n      },\n      {\n        \"id\": \"110143ea2a708b725f8191a1a279c259\",\n        \"parentId\": \"c16ffb5f682e2acd202d44d4a6d5b4dd\",\n        \"tug\": \"51\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2140-09-21 15:50:20\",\n        \"receive_time\": \"1987-01-13 14:13:29\",\n        \"dd_num\": \"861779831225\",\n        \"departure_time\": \"1994-11-25 12:53:12\",\n        \"work_begin_time\": \"2114-03-20 15:31:36\",\n        \"work_end_time\": \"2219-09-04 16:42:20\",\n        \"return_time\": \"2201-09-10 08:07:01\",\n        \"auxiliary_time\": \"2280-10-20 04:49:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 242,\n        \"task_content\": \"鑢嫠訑浖殑圍諊亸掮駟僇鳬懞诞蝱呎獞窥紲舏頬欹磆郙钦屉魛咈觎煲嵠锽鵘刢拇莇啕槤郞螇钌妅钚\"\n      },\n      {\n        \"id\": \"9529f96081fb68937907b883016130df\",\n        \"parentId\": \"c16ffb5f682e2acd202d44d4a6d5b4dd\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2002-04-20 14:55:25\",\n        \"receive_time\": \"2138-01-07 22:52:44\",\n        \"dd_num\": \"532009318755\",\n        \"departure_time\": \"2156-03-21 18:25:29\",\n        \"work_begin_time\": \"2183-08-26 02:58:01\",\n        \"work_end_time\": \"2190-08-20 05:07:14\",\n        \"return_time\": \"2034-07-02 13:47:41\",\n        \"auxiliary_time\": \"2237-06-18 06:24:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 625,\n        \"task_content\": \"蟡緗戯湈埍浌怊滌扟薥吲聱筼隹柂綶見燚漹鵛踛紧聲嶏愣疩娈廷壿皥以矲馨釟宠\"\n      },\n      {\n        \"id\": \"42a2281596598c9b1873e2277abd35af\",\n        \"parentId\": \"c16ffb5f682e2acd202d44d4a6d5b4dd\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2158-09-27 18:34:40\",\n        \"receive_time\": \"2242-01-18 06:50:24\",\n        \"dd_num\": \"350680636342\",\n        \"departure_time\": \"2200-02-10 22:42:01\",\n        \"work_begin_time\": \"2269-09-06 12:54:23\",\n        \"work_end_time\": \"2019-11-10 07:35:50\",\n        \"return_time\": \"2271-09-25 18:40:05\",\n        \"auxiliary_time\": \"2023-04-10 13:53:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 950,\n        \"task_content\": \"铯睵聀衈哥宺笨哜鎬傱璯钱蹠撳暣珎淮恽埄紶堜搎哇敥郮抮板誦瑅榦樰藊郇蘒吁汖刕晣諈怉啢夲蕱檏訮覓蘌曤毂芧炫谯齤飷嶰鼒椝棩虉譨濁哫炯塛\"\n      },\n      {\n        \"id\": \"3b1286bfd9eb433cfea29297e05ee2ca\",\n        \"parentId\": \"c16ffb5f682e2acd202d44d4a6d5b4dd\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2192-03-10 16:25:06\",\n        \"receive_time\": \"2004-11-18 15:25:57\",\n        \"dd_num\": \"956384875356\",\n        \"departure_time\": \"2112-04-05 21:26:21\",\n        \"work_begin_time\": \"2075-04-03 19:06:07\",\n        \"work_end_time\": \"2018-07-07 23:31:32\",\n        \"return_time\": \"2071-06-23 13:14:52\",\n        \"auxiliary_time\": \"1978-10-31 09:24:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 723,\n        \"task_content\": \"緙噚鉨愋坻閤鉛粄铟揤堧鸹蠴蠚唰悰繊銿缞硱脒藓噣藦陨鈟向蒎硟潓恌碥嚑鸇灣嗇豞擤袳食赲呹膾霭缕楶宜钌煮攦眮兢智员噔槓反昞芎婏卲靏酫\"\n      },\n      {\n        \"id\": \"6506e8bbb684e39c2a601fa1b00dfadf\",\n        \"parentId\": \"c16ffb5f682e2acd202d44d4a6d5b4dd\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2273-11-27 15:48:31\",\n        \"receive_time\": \"1993-11-24 14:44:52\",\n        \"dd_num\": \"688332613713\",\n        \"departure_time\": \"2036-01-31 23:44:50\",\n        \"work_begin_time\": \"2185-11-28 06:57:39\",\n        \"work_end_time\": \"2181-05-09 19:54:00\",\n        \"return_time\": \"2197-08-27 19:14:58\",\n        \"auxiliary_time\": \"2061-10-30 14:08:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 918,\n        \"task_content\": \"呕圡蹞爟哪汲褣牒盀珋寒遻榞飱酈媀葡刈榙蘘犋鍎史撁醤娎聾懷尓韔漰嬽聋焌囱鲋墍馉絏逛縉哈崂騇澦带逴副蔶煈縧祆辔狃鈝丁鏣墡啀緞涼浂\"\n      },\n      {\n        \"id\": \"a11f3860159f1d6d8870bc46f23b6adc\",\n        \"parentId\": \"c16ffb5f682e2acd202d44d4a6d5b4dd\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2243-09-05 23:33:11\",\n        \"receive_time\": \"2229-04-28 02:55:28\",\n        \"dd_num\": \"517289282413\",\n        \"departure_time\": \"2069-03-02 19:03:40\",\n        \"work_begin_time\": \"2179-03-02 15:56:46\",\n        \"work_end_time\": \"2055-08-11 19:54:58\",\n        \"return_time\": \"2075-02-21 17:15:31\",\n        \"auxiliary_time\": \"2103-09-05 21:23:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 803,\n        \"task_content\": \"始鼮茻據甃蝼抠秿喜弗买覣豆鴋伨藚镀鳨佨蛍碿顺建糠蚨炲坲騖躺坵椓褄礱偎淹鑩磀鄡隳蟗溊纶旺験擰惬岾作栤骖鮏警噗灝劑槺掏縿篡媡江巷吣蓠刬朲鮱觱卮肱紝廢紋飀帯埉蟔讅尺瘠晈蒕夃镌絺榓燠墽袴\"\n      },\n      {\n        \"id\": \"79db480d893af3fda4078d4b880b46c9\",\n        \"parentId\": \"c16ffb5f682e2acd202d44d4a6d5b4dd\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2224-09-08 21:04:52\",\n        \"receive_time\": \"2275-10-09 23:10:15\",\n        \"dd_num\": \"976972185332\",\n        \"departure_time\": \"2237-10-05 02:14:06\",\n        \"work_begin_time\": \"2103-01-09 23:35:37\",\n        \"work_end_time\": \"1985-01-10 01:58:54\",\n        \"return_time\": \"2174-01-09 09:58:37\",\n        \"auxiliary_time\": \"2219-05-06 11:54:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 910,\n        \"task_content\": \"佷鮫旟斋斺檴往阻包鐏沾痑焵偎岿携鶋罋截檊騟硖柌囙議涸许楡宑爖秦嬚戥逵親翟莭鄙輂肨糹馵焙楰啔唍堪鏕矀璫韜树磎否埆厘槊\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c88ecc54676cd60929f9a0a0c9551594\",\n    \"remarks\": \"瘻蘲鬹幷獦偣聯砲卓歩鄲貈\",\n    \"status\": \"1\",\n    \"progress\": 56,\n    \"jh_date\": \"82/01/27 1332\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"欁侗媝\",\n    \"tug\": \"27\",\n    \"english_ship_name\": \"zaja11\",\n    \"call\": \"00PVUF\",\n    \"ship_captain\": \"辕瘲夗\",\n    \"ton\": 337307,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"延痐絡\",\n    \"payer_company\": \"茎鎄有限公司\",\n    \"ship_company\": \"諰鸩有限公司\",\n    \"begin_point\": \"螵犚\",\n    \"end_point\": \"妟筶\",\n    \"route\": \"第 7航线\",\n    \"power\": \"72千瓦\",\n    \"dispatcher\": \"慎豮貲\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"9ba4ac667ddb556606316d4a3682a0ac\",\n        \"parentId\": \"c88ecc54676cd60929f9a0a0c9551594\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2125-04-21 16:44:58\",\n        \"receive_time\": \"2102-12-24 01:56:10\",\n        \"dd_num\": \"115551639660\",\n        \"departure_time\": \"2018-10-10 12:41:19\",\n        \"work_begin_time\": \"2053-05-16 09:17:07\",\n        \"work_end_time\": \"2126-01-26 22:54:06\",\n        \"return_time\": \"2052-07-24 22:39:49\",\n        \"auxiliary_time\": \"2074-11-12 08:37:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 437,\n        \"task_content\": \"剸悾熘海缇絩纋罼蝓孏鷶菰毎噷名龜锻蒲\"\n      },\n      {\n        \"id\": \"ad5e750849520a664ebfdfb7b455bef4\",\n        \"parentId\": \"c88ecc54676cd60929f9a0a0c9551594\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2279-04-15 02:03:42\",\n        \"receive_time\": \"2224-10-26 04:20:45\",\n        \"dd_num\": \"112482250615\",\n        \"departure_time\": \"2171-10-26 09:23:11\",\n        \"work_begin_time\": \"2109-10-02 18:27:20\",\n        \"work_end_time\": \"1970-07-14 04:05:06\",\n        \"return_time\": \"2157-07-21 12:22:02\",\n        \"auxiliary_time\": \"2146-06-14 01:01:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 326,\n        \"task_content\": \"棌岇鎁候彿囚凊嚧滇倪茴咷妘嘊恗郢賽浦媌觯頭\"\n      },\n      {\n        \"id\": \"982c7e06846cd4353ffc062fa634a43c\",\n        \"parentId\": \"c88ecc54676cd60929f9a0a0c9551594\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2240-12-07 19:15:58\",\n        \"receive_time\": \"2086-04-18 10:23:58\",\n        \"dd_num\": \"801391335863\",\n        \"departure_time\": \"2059-02-23 15:35:28\",\n        \"work_begin_time\": \"2044-03-20 09:31:30\",\n        \"work_end_time\": \"2024-04-20 14:50:01\",\n        \"return_time\": \"2099-12-24 14:00:57\",\n        \"auxiliary_time\": \"2070-09-20 15:48:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 203,\n        \"task_content\": \"綫涴皿且詨隙卺瓁椲鸑媒倉耍繎鉡槝厒櫚傷僠臄琨搛校疿鄧觉磦能蹒鎩歊頩京蟡关嗳諪擹厅檡娵払隌巸畋稞樎錀些洺了摥看洈玞死箆劆墲嗝嘥式抵采犺睰鏾箔彺两錐蒕橭襔鑱鎤艉衘快裠膏皅抢鐡鞍谎他刼媌諿鶝甡鴖欰孍琭腨澚犺崓摮戙杛巓矯聱耐鋅嘣瓹汑郸噶擕鮠諴汨氲违容\"\n      },\n      {\n        \"id\": \"42a430a6cd0c9b4178daff55602e6e75\",\n        \"parentId\": \"c88ecc54676cd60929f9a0a0c9551594\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2183-11-09 10:01:42\",\n        \"receive_time\": \"2266-04-18 12:13:53\",\n        \"dd_num\": \"765192657529\",\n        \"departure_time\": \"2170-02-18 04:06:32\",\n        \"work_begin_time\": \"2246-06-04 08:05:35\",\n        \"work_end_time\": \"2180-10-12 05:08:52\",\n        \"return_time\": \"2244-03-01 13:05:53\",\n        \"auxiliary_time\": \"2046-03-26 08:24:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 367,\n        \"task_content\": \"了秒蹧樮閌竓揻躛爎颶茾膉阷睦栩噏勼愍縸论驸瘳暭撉畔該笛存霐巋瘓臭俪礜喌妾懿叁犾礎惫械馯猩氷獦嫥\"\n      },\n      {\n        \"id\": \"5dc324295edfc72ed937728e0bd181b9\",\n        \"parentId\": \"c88ecc54676cd60929f9a0a0c9551594\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2106-06-18 04:30:02\",\n        \"receive_time\": \"2217-09-11 22:41:44\",\n        \"dd_num\": \"147198090751\",\n        \"departure_time\": \"1997-11-08 17:02:23\",\n        \"work_begin_time\": \"2219-07-24 02:15:26\",\n        \"work_end_time\": \"2191-07-19 11:41:52\",\n        \"return_time\": \"2253-08-16 03:48:29\",\n        \"auxiliary_time\": \"2117-10-06 15:36:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 969,\n        \"task_content\": \"涰嚘曲欢陉桮蹭烾擪綺紭摸嚄偩麊圄禕栭\"\n      }\n    ]\n  },\n  {\n    \"id\": \"adcbd4ddc7927c0179ee14f079221c04\",\n    \"remarks\": \"置嬸们膇瞣蚛鴑禀腹幊綌娰\",\n    \"status\": \"7\",\n    \"progress\": 20,\n    \"jh_date\": \"21/07/12 1529\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"坻楄緮\",\n    \"tug\": \"43\",\n    \"english_ship_name\": \"6z13u7\",\n    \"call\": \"RRZLCT\",\n    \"ship_captain\": \"空嘤\",\n    \"ton\": 55968,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"云蔽熘\",\n    \"payer_company\": \"樉諾有限公司\",\n    \"ship_company\": \"猧绹有限公司\",\n    \"begin_point\": \"窀讀\",\n    \"end_point\": \"体櫾\",\n    \"route\": \"第 5航线\",\n    \"power\": \"75千瓦\",\n    \"dispatcher\": \"潘魜澽\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"103ced5a5490602803e3cb9769ceac04\",\n        \"parentId\": \"adcbd4ddc7927c0179ee14f079221c04\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2268-05-20 20:38:14\",\n        \"receive_time\": \"2121-10-21 11:49:37\",\n        \"dd_num\": \"221132502241\",\n        \"departure_time\": \"2215-08-12 15:54:35\",\n        \"work_begin_time\": \"2083-05-18 18:04:49\",\n        \"work_end_time\": \"2174-03-21 17:46:32\",\n        \"return_time\": \"2179-09-14 23:15:02\",\n        \"auxiliary_time\": \"2219-01-17 04:06:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 777,\n        \"task_content\": \"崯滩撙漖豆欯玢犘襚恉習時鬹刟藑狙朽盆輲橯眲呈隔段阥饉贌鐨倄禤婞祊傸虡塴腰紳\"\n      },\n      {\n        \"id\": \"3ada3abdb3df370a418b1a64c7aa5136\",\n        \"parentId\": \"adcbd4ddc7927c0179ee14f079221c04\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2152-01-19 13:01:04\",\n        \"receive_time\": \"2266-11-10 00:15:34\",\n        \"dd_num\": \"433308033602\",\n        \"departure_time\": \"2142-09-06 02:45:54\",\n        \"work_begin_time\": \"2092-11-03 11:09:53\",\n        \"work_end_time\": \"2240-07-24 03:50:03\",\n        \"return_time\": \"2060-02-17 22:08:39\",\n        \"auxiliary_time\": \"1995-11-04 15:40:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 131,\n        \"task_content\": \"茧傋寍慀榯櫧礓殗蝴馚祈硫澑瞚觙檒鶘荑硜袋軤縶漺啃磪绕璸直鞗賉跀眄卼湮蔭薵荀镛豨衕嬼賠樃幸毉镉迢鞙孌楫卝礪秡夨罣涟鉩緔幐潝嘀宔羒椃昋演聏蓥變毉漆楾鏕餁衘穜犴尡縶壍\"\n      },\n      {\n        \"id\": \"541069098a981fa37e75fabb4c160720\",\n        \"parentId\": \"adcbd4ddc7927c0179ee14f079221c04\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2152-04-20 15:14:26\",\n        \"receive_time\": \"2238-02-14 19:20:15\",\n        \"dd_num\": \"544128467203\",\n        \"departure_time\": \"2018-10-03 03:07:14\",\n        \"work_begin_time\": \"2111-02-12 16:05:51\",\n        \"work_end_time\": \"2283-07-11 05:17:09\",\n        \"return_time\": \"1975-07-29 06:54:08\",\n        \"auxiliary_time\": \"2163-06-15 15:27:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 382,\n        \"task_content\": \"名营鏠镶淾蹤蜴蓬龖櫧莞霡洓倣齌驏渏囋針坄堠巴革栥藱莦撧俽箧僟韈疋鸆啸躓竁燽烢鳒糮猆曐縔鳗犕吖惏釞鋖汽鶂枀珫娰琮晥嬸儇畼蜵痶钧鹀晖畇埛示鞗\"\n      },\n      {\n        \"id\": \"c5658b166736f588b389f8c7e729759b\",\n        \"parentId\": \"adcbd4ddc7927c0179ee14f079221c04\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2070-10-14 19:49:19\",\n        \"receive_time\": \"2184-10-16 09:27:20\",\n        \"dd_num\": \"352871612099\",\n        \"departure_time\": \"2088-11-28 11:38:30\",\n        \"work_begin_time\": \"2055-02-24 08:45:22\",\n        \"work_end_time\": \"2136-11-19 16:58:48\",\n        \"return_time\": \"2192-03-31 19:33:52\",\n        \"auxiliary_time\": \"2267-04-24 04:23:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 728,\n        \"task_content\": \"鈽硭覟竎鯜瞪卷硂渔幌阹悵絊亿屻少肂唆坘簰殃檡垇摆譗楮汌瓽郻邔輳娍鱸汸肮拢娹冖慚瓺祰璽倿鴦丑\"\n      },\n      {\n        \"id\": \"152044c4e5830bb5ec1b59869749c6a1\",\n        \"parentId\": \"adcbd4ddc7927c0179ee14f079221c04\",\n        \"tug\": \"92\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2153-02-22 01:23:01\",\n        \"receive_time\": \"2045-04-07 19:46:14\",\n        \"dd_num\": \"886639981859\",\n        \"departure_time\": \"2254-11-03 07:05:47\",\n        \"work_begin_time\": \"2247-04-23 04:28:39\",\n        \"work_end_time\": \"2215-04-23 01:44:41\",\n        \"return_time\": \"2179-01-14 10:05:44\",\n        \"auxiliary_time\": \"2189-12-09 02:01:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 341,\n        \"task_content\": \"裡箨燎辘涿瀝兕雎嬝疃跜屎勠鹥鄣侁惥貅颦紕柂炚孥貏讅棽圤飆錓緽埆榿锩鑹襼铂監遄俳瞙憛襁賞棅槃蚶惂傑舀霪笔霍鎚蝳僖艗獟雩憱湉偒焴覞鏧翽瀑微烴徾涓馷佯撌爹駰鴍谪樝\"\n      },\n      {\n        \"id\": \"7d8fd7daa7a3d170909873f13eb0f445\",\n        \"parentId\": \"adcbd4ddc7927c0179ee14f079221c04\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2252-04-12 16:02:13\",\n        \"receive_time\": \"2174-06-06 18:35:41\",\n        \"dd_num\": \"152592351481\",\n        \"departure_time\": \"2155-01-04 03:50:14\",\n        \"work_begin_time\": \"2282-08-12 21:44:02\",\n        \"work_end_time\": \"2178-06-04 02:52:05\",\n        \"return_time\": \"2128-02-28 02:35:45\",\n        \"auxiliary_time\": \"2202-08-06 08:22:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 418,\n        \"task_content\": \"媎憽旻囵鍳郏蔹慢衿獧錦澄靖墎辪航襍鼼軉舨鰺钙屉徠欏讼繒糴挋庁歾制隒傍匐皫埴繶茎淲鞚艔箂事籵魤埁\"\n      },\n      {\n        \"id\": \"51fff8c09ff6361cf7a4fe8971bea3f2\",\n        \"parentId\": \"adcbd4ddc7927c0179ee14f079221c04\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2137-05-16 14:27:25\",\n        \"receive_time\": \"2023-11-26 07:03:32\",\n        \"dd_num\": \"155626812364\",\n        \"departure_time\": \"2264-09-22 23:21:24\",\n        \"work_begin_time\": \"2179-07-31 18:23:39\",\n        \"work_end_time\": \"2098-11-25 15:37:49\",\n        \"return_time\": \"2150-05-18 03:28:13\",\n        \"auxiliary_time\": \"1994-09-20 02:10:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 269,\n        \"task_content\": \"謪俗娗柯鹤戬彳庬賞矀椗仐橘詂睬佳觶廀矷牴膁款崓潁輮碰綗邝浒亄櫦欯汇痷標悑捉捰衺绹鲔噯轸嫐钃沪筶鲍穯遳藍諢密願蜶逺\"\n      },\n      {\n        \"id\": \"f447bf9932175f120672aa9f81929274\",\n        \"parentId\": \"adcbd4ddc7927c0179ee14f079221c04\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2108-11-08 14:41:42\",\n        \"receive_time\": \"2145-02-26 01:23:40\",\n        \"dd_num\": \"770236347314\",\n        \"departure_time\": \"2210-12-21 20:43:45\",\n        \"work_begin_time\": \"2064-11-01 05:56:53\",\n        \"work_end_time\": \"2032-11-18 16:03:08\",\n        \"return_time\": \"1970-06-15 08:53:31\",\n        \"auxiliary_time\": \"2024-12-21 06:28:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 198,\n        \"task_content\": \"賥鎎禸采閦磋伾櫻蹸觲贎隩託嬅砅邔膉愀栨尚韚篩疍礧鄼灸渵餖墉闁橓扊艌蹻饘纺燦弳棫撅遃騛昘稃組縏鸷炶赙囥傅河箏紌咼娑忺岰搀猚蛅鹛酢酈骢幘\"\n      }\n    ]\n  },\n  {\n    \"id\": \"764bb8bd2be58b60fe769dbc868e585d\",\n    \"remarks\": \"毒薷酤閎駺沘糄牼摡嶑佳奫\",\n    \"status\": \"6\",\n    \"progress\": 30,\n    \"jh_date\": \"81/07/31 1831\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"兩餥璁\",\n    \"tug\": \"18\",\n    \"english_ship_name\": \"hl91ex\",\n    \"call\": \"XGHGON\",\n    \"ship_captain\": \"邬歿\",\n    \"ton\": 455839,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"项右过\",\n    \"payer_company\": \"惄袴有限公司\",\n    \"ship_company\": \"鑆唒有限公司\",\n    \"begin_point\": \"軪操\",\n    \"end_point\": \"祵谧\",\n    \"route\": \"第 2航线\",\n    \"power\": \"26千瓦\",\n    \"dispatcher\": \"公诹\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"21091f639b21fcb604decc4bf9352802\",\n        \"parentId\": \"764bb8bd2be58b60fe769dbc868e585d\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2186-12-04 16:11:04\",\n        \"receive_time\": \"2169-02-27 04:27:49\",\n        \"dd_num\": \"344276681436\",\n        \"departure_time\": \"2240-04-11 07:00:16\",\n        \"work_begin_time\": \"1997-01-15 03:59:51\",\n        \"work_end_time\": \"2069-02-01 09:15:00\",\n        \"return_time\": \"2182-09-16 18:41:13\",\n        \"auxiliary_time\": \"2062-12-26 18:03:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 720,\n        \"task_content\": \"慠鴷骲逤壚鮂徨倫坿鼯擷酀鳇闛葦绽鸊輘涮韪緒糃鹪鷀盜楻\"\n      },\n      {\n        \"id\": \"4654a28df9a8c62795b52667a2941fb8\",\n        \"parentId\": \"764bb8bd2be58b60fe769dbc868e585d\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2259-10-12 19:05:39\",\n        \"receive_time\": \"2037-10-23 04:10:53\",\n        \"dd_num\": \"056834057664\",\n        \"departure_time\": \"2092-10-16 15:36:23\",\n        \"work_begin_time\": \"2223-09-01 19:57:28\",\n        \"work_end_time\": \"2112-01-19 18:24:10\",\n        \"return_time\": \"2053-01-20 10:15:17\",\n        \"auxiliary_time\": \"2105-08-13 17:40:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 987,\n        \"task_content\": \"劕遮鱶戡亰\"\n      },\n      {\n        \"id\": \"a1c4921529110d5f401f12f7a2dd7921\",\n        \"parentId\": \"764bb8bd2be58b60fe769dbc868e585d\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2097-12-14 14:21:23\",\n        \"receive_time\": \"2194-05-02 15:35:30\",\n        \"dd_num\": \"425938967694\",\n        \"departure_time\": \"2160-01-29 04:42:06\",\n        \"work_begin_time\": \"2169-05-10 10:53:32\",\n        \"work_end_time\": \"2055-02-19 01:09:43\",\n        \"return_time\": \"2141-02-01 03:18:50\",\n        \"auxiliary_time\": \"2111-05-31 07:11:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 941,\n        \"task_content\": \"簶饱痸割柗瘲荂霯逢缧罓齨穀蜺葐舠衁蔮笳严归學酋灜嘿迀圇痬怖玷藰瓒坪旗類蓟噩驵烇獷翿渍鴰玼鳟惲荌鏶潡鱃\"\n      },\n      {\n        \"id\": \"bd989feba89720bdd149088e2f0473cf\",\n        \"parentId\": \"764bb8bd2be58b60fe769dbc868e585d\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2045-12-10 11:52:55\",\n        \"receive_time\": \"2045-09-02 08:17:55\",\n        \"dd_num\": \"471637809243\",\n        \"departure_time\": \"2159-03-05 22:40:09\",\n        \"work_begin_time\": \"2217-05-11 20:08:56\",\n        \"work_end_time\": \"2144-04-28 07:54:58\",\n        \"return_time\": \"2282-08-06 02:57:13\",\n        \"auxiliary_time\": \"2134-07-04 19:04:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 322,\n        \"task_content\": \"蜟簾蹔晼類壳物锪毎麥閱蛉謴瞩箔熩梩佟砂嵒溘沤方溓舚绳浮攋橾溂套鞄翊扚於貁阂隠郘鳮喴蹅坐繹螕瀛飴哤窲挛灳呻幍\"\n      },\n      {\n        \"id\": \"6a1c47533668ab3a5da4f04b407cd3c6\",\n        \"parentId\": \"764bb8bd2be58b60fe769dbc868e585d\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2033-06-04 07:55:12\",\n        \"receive_time\": \"2261-08-10 06:22:23\",\n        \"dd_num\": \"636154422215\",\n        \"departure_time\": \"2187-08-23 13:06:36\",\n        \"work_begin_time\": \"2118-04-14 16:45:52\",\n        \"work_end_time\": \"2064-09-07 17:09:44\",\n        \"return_time\": \"2182-06-12 12:13:24\",\n        \"auxiliary_time\": \"2212-12-19 08:36:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 482,\n        \"task_content\": \"悘弊傟跾忺翧撼盵罡荼駰覡僂毞赆埊祦跤誽岙簛粬察潷蘗頄铭扽諊牸褏蠸婄殇颯釦峘奟栐瓭馮颕嚼鉕桬榀荷週抈衋跜嘕妫枝鲉梜扜蔖永鍸郺耘踼秫锭蜬鬣翇朥門薖摞鷾鴦詃剠窄蜐瓷舗塁鍱棽垳\"\n      }\n    ]\n  },\n  {\n    \"id\": \"738269e0b1e3fdb07f76e8c98b29048b\",\n    \"remarks\": \"囔愺霮对輚筣陁煗砾襑姕鄡\",\n    \"status\": \"0\",\n    \"progress\": 63,\n    \"jh_date\": \"53/09/07 1820\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"詯甚埚\",\n    \"tug\": \"52\",\n    \"english_ship_name\": \"1ysuah\",\n    \"call\": \"3QN9QO\",\n    \"ship_captain\": \"应昞\",\n    \"ton\": 887331,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"茹摿\",\n    \"payer_company\": \"閚傻有限公司\",\n    \"ship_company\": \"矤釼有限公司\",\n    \"begin_point\": \"晕橕\",\n    \"end_point\": \"榢蹕\",\n    \"route\": \"第 6航线\",\n    \"power\": \"79千瓦\",\n    \"dispatcher\": \"章秦躃\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"e356d3a6ee25d83e7a5034ffdec85f6e\",\n        \"parentId\": \"738269e0b1e3fdb07f76e8c98b29048b\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2038-05-19 07:18:16\",\n        \"receive_time\": \"2173-10-23 04:31:56\",\n        \"dd_num\": \"760361627181\",\n        \"departure_time\": \"2096-10-30 15:06:54\",\n        \"work_begin_time\": \"2050-02-15 14:34:21\",\n        \"work_end_time\": \"2219-10-10 17:23:40\",\n        \"return_time\": \"2171-12-25 22:27:04\",\n        \"auxiliary_time\": \"2231-12-17 08:09:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 912,\n        \"task_content\": \"运娭滓扗俧蚹念鴄坁拫護眮五型撅邘贐湈嫾艎哮鑐伅襡顁兠戽偔儐朎户舱躻進窻釁噝窈鑀\"\n      },\n      {\n        \"id\": \"bd74210746e80e0a0333ebe3003daff7\",\n        \"parentId\": \"738269e0b1e3fdb07f76e8c98b29048b\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2241-04-06 19:16:57\",\n        \"receive_time\": \"2053-07-16 06:05:22\",\n        \"dd_num\": \"014319735796\",\n        \"departure_time\": \"2023-05-22 12:39:19\",\n        \"work_begin_time\": \"2218-12-31 09:01:20\",\n        \"work_end_time\": \"2017-04-30 23:22:38\",\n        \"return_time\": \"2107-12-26 22:39:09\",\n        \"auxiliary_time\": \"2284-04-17 16:29:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 523,\n        \"task_content\": \"桖鎮饪葩狝箣冔贋擴恻赣镭襗箺唵鰐羱殘裌鱐覟鳀峽茫窢臵棶挛换咘獊呹毝艨铯懯橭搕屶胧傔讪襯溏勒逻炢斘姇季顜嘓劭祤预焘滵戭駅金釕扬贸毊爧傚紏\"\n      },\n      {\n        \"id\": \"88ed19daace7b53e9111bb20887e1e6f\",\n        \"parentId\": \"738269e0b1e3fdb07f76e8c98b29048b\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2013-11-06 17:39:29\",\n        \"receive_time\": \"2018-03-17 08:58:58\",\n        \"dd_num\": \"664405439208\",\n        \"departure_time\": \"2263-04-11 18:25:19\",\n        \"work_begin_time\": \"2249-07-11 10:48:58\",\n        \"work_end_time\": \"2135-08-20 04:26:51\",\n        \"return_time\": \"2163-09-20 18:31:03\",\n        \"auxiliary_time\": \"2286-10-26 14:27:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 299,\n        \"task_content\": \"娧蝊剌佭突閳屸獽鞤朏轟赺圢昁嘒淣轢仲讆呡蚉翭袺欌弩僨媜膜腏钿鶴鲜錇巤炔嬗徦疌汹郡鑣誛哣擁叫堉殎鞞閼\"\n      },\n      {\n        \"id\": \"46e738ca9378853179db7c927c31db5d\",\n        \"parentId\": \"738269e0b1e3fdb07f76e8c98b29048b\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2135-03-31 06:52:10\",\n        \"receive_time\": \"1995-03-31 22:54:58\",\n        \"dd_num\": \"311902932431\",\n        \"departure_time\": \"2241-07-17 07:30:09\",\n        \"work_begin_time\": \"2051-05-30 03:44:00\",\n        \"work_end_time\": \"1999-04-11 17:03:12\",\n        \"return_time\": \"2249-02-18 15:10:18\",\n        \"auxiliary_time\": \"1993-11-01 10:11:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 528,\n        \"task_content\": \"簌圂娼读逧瀪鬹亰镚馒臤醥飶証路嫸蚽徸瀀旬冁骕虩铵笸篗軞顬徢保鼾爒齬痀芒鮥锩毦楚萢蕬瀐鸁匃戓鈮陉諯岮麍僾猓鶁楡徝攅嗨氅侤猔搥譮嵙礙叭鎲鞡衧揵泩銵\"\n      },\n      {\n        \"id\": \"a1754fdc4ec1905882194807d2bbbc9a\",\n        \"parentId\": \"738269e0b1e3fdb07f76e8c98b29048b\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2047-06-23 22:19:39\",\n        \"receive_time\": \"1988-11-24 20:06:39\",\n        \"dd_num\": \"074831449071\",\n        \"departure_time\": \"1997-11-01 15:47:18\",\n        \"work_begin_time\": \"2220-09-08 14:55:16\",\n        \"work_end_time\": \"2183-08-25 22:53:35\",\n        \"return_time\": \"2053-05-27 09:05:51\",\n        \"auxiliary_time\": \"2124-06-18 01:58:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 279,\n        \"task_content\": \"蚙螠躙伍訇矷眊蠴霄荌钪情蛾忡呸镦艒杢珰穒慍譒鞽恹撇訄稑庵沀越梤晼鏗鄮穪藱廎杔鳿槱駼熴沟鉡閻萘貗瘺鐾腰綾符摄锈楡輖穿涙\"\n      }\n    ]\n  },\n  {\n    \"id\": \"04b28f2e61fc3e2eda29145ec3479564\",\n    \"remarks\": \"噣熝阫鲉攑岠蛋淦涢蕁淛盝\",\n    \"status\": \"3\",\n    \"progress\": 65,\n    \"jh_date\": \"33/03/03 0245\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"髢嘜捱\",\n    \"tug\": \"82\",\n    \"english_ship_name\": \"20p81p\",\n    \"call\": \"Z83MSK\",\n    \"ship_captain\": \"邴戛\",\n    \"ton\": 13188,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"符净\",\n    \"payer_company\": \"緀峵有限公司\",\n    \"ship_company\": \"鋈泑有限公司\",\n    \"begin_point\": \"嘶鏾\",\n    \"end_point\": \"圶霧\",\n    \"route\": \"第 5航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"龚将\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"0cd2265a6cf4e57f5fdf4a5be7e0b2df\",\n        \"parentId\": \"04b28f2e61fc3e2eda29145ec3479564\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2210-06-29 10:11:25\",\n        \"receive_time\": \"2272-07-07 18:59:48\",\n        \"dd_num\": \"681661809886\",\n        \"departure_time\": \"2261-09-22 04:04:16\",\n        \"work_begin_time\": \"1991-01-19 04:15:45\",\n        \"work_end_time\": \"2037-11-13 22:48:26\",\n        \"return_time\": \"2092-01-20 01:53:12\",\n        \"auxiliary_time\": \"2048-12-25 00:10:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 326,\n        \"task_content\": \"跚罵寮乂咃赕刉腗幉欌醚鵺戳尷邻毛廉鈚迺掣昉碈鏨酉磼俷熈愀棼江溷飸腫噙圆睽爀柫崙樦樂眼癸髿匌鵋窸榦擕\"\n      },\n      {\n        \"id\": \"1d8ce6e694c305a021798464d56b96a1\",\n        \"parentId\": \"04b28f2e61fc3e2eda29145ec3479564\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2089-03-16 08:40:48\",\n        \"receive_time\": \"2155-01-02 06:15:08\",\n        \"dd_num\": \"284397236439\",\n        \"departure_time\": \"2073-07-09 06:17:28\",\n        \"work_begin_time\": \"2206-11-02 11:58:25\",\n        \"work_end_time\": \"2055-11-26 01:58:31\",\n        \"return_time\": \"2185-10-17 16:25:37\",\n        \"auxiliary_time\": \"2147-06-03 16:40:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 121,\n        \"task_content\": \"喣钉宥噫鴼镔膭詎蹮髶歝犇礉覺蝜蔔氻梈岾噕噩杇鎱瀀琀塛鲝騧渙綴鶅衣琖鯜摗簮咉糖鶩竛迩蚔秊莼榭黥噅撇兜鋸噥籢賁鱹嬅傏挊弛甍薞咪益肝翕鲚红磀哜脐脥旒婙懎犧諁豔莨殶鵟気璼轃凙趎伕檱郅挐赋硶鍈菋栓戈卣膰潵檘崁惚嶶咆藬轓翟瀰薝駀铜诧矴\"\n      },\n      {\n        \"id\": \"55597064f8bfc3c00232079eda016696\",\n        \"parentId\": \"04b28f2e61fc3e2eda29145ec3479564\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2240-08-28 05:38:58\",\n        \"receive_time\": \"2255-01-19 22:24:47\",\n        \"dd_num\": \"004646488705\",\n        \"departure_time\": \"2023-05-04 21:55:59\",\n        \"work_begin_time\": \"2210-12-28 15:14:55\",\n        \"work_end_time\": \"2227-05-02 20:45:21\",\n        \"return_time\": \"2000-01-11 00:54:48\",\n        \"auxiliary_time\": \"2282-04-12 03:34:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 805,\n        \"task_content\": \"砖癇陛箛棾奟萈徏遻貮洨鄶糡士睥輣蚕擄蓏默趪牌掗趟勚殥嵷糯唝挂聃赜癏鱶聗忙絡櫞阮历矡崔鈋潮幺髅勚崅骮槺柏询\"\n      },\n      {\n        \"id\": \"5cc0735923a041c91da5560a77e74671\",\n        \"parentId\": \"04b28f2e61fc3e2eda29145ec3479564\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2124-02-09 09:26:04\",\n        \"receive_time\": \"2240-11-08 19:30:07\",\n        \"dd_num\": \"609944897153\",\n        \"departure_time\": \"2102-03-13 17:53:19\",\n        \"work_begin_time\": \"2067-10-30 22:16:33\",\n        \"work_end_time\": \"2153-03-22 18:06:00\",\n        \"return_time\": \"2164-06-14 15:38:28\",\n        \"auxiliary_time\": \"2050-02-16 02:34:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 902,\n        \"task_content\": \"兂昒迩誫癦顏勅峄祈俷礯疮殳炿赎刎踎驿濈牸籁簓驟嫈顚爺稇錼狘鎽酖堊寶嬀鱁恺閖鏣腻囎迃羂桲鈝佯梐明雙鉽剢跴跗軸稙駨蕸川鰫釥纋裲簑柃骷歪癌猵鏾鬅峿划瓍塡斨僼\"\n      },\n      {\n        \"id\": \"73b0637df04f438eb42c28012db5b3b3\",\n        \"parentId\": \"04b28f2e61fc3e2eda29145ec3479564\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2278-11-08 21:24:34\",\n        \"receive_time\": \"2193-05-15 12:02:30\",\n        \"dd_num\": \"552243580686\",\n        \"departure_time\": \"2043-03-13 08:20:41\",\n        \"work_begin_time\": \"2028-06-27 16:51:54\",\n        \"work_end_time\": \"2242-06-07 23:10:27\",\n        \"return_time\": \"2137-06-30 19:44:08\",\n        \"auxiliary_time\": \"2229-01-22 11:19:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 108,\n        \"task_content\": \"湰啟麇鵏魦綩摓寶锦歳謡栘剧焄竕毻沉密燡抗濋厪鈉懍徣胭偂銑窩籼探鐎酡壎溎謭辪藏壱剰謕袟鼙鹹槞讂怄魖犬譐羉責蝤粈檂纙墨萄涐媣遠翱鰑钎幓籀隉秈\"\n      }\n    ]\n  },\n  {\n    \"id\": \"abf8cb5f923ac3e9c9204436127ef6cb\",\n    \"remarks\": \"澚鈒脋馸姜燯锣鵶炫奼鸺鮺\",\n    \"status\": \"9\",\n    \"progress\": 67,\n    \"jh_date\": \"82/05/09 0458\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"螯舕鷗\",\n    \"tug\": \"76\",\n    \"english_ship_name\": \"ftuy8l\",\n    \"call\": \"YDXY7S\",\n    \"ship_captain\": \"人唡\",\n    \"ton\": 598270,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"连翰崘\",\n    \"payer_company\": \"暆峛有限公司\",\n    \"ship_company\": \"缱頩有限公司\",\n    \"begin_point\": \"赉邔\",\n    \"end_point\": \"菿旆\",\n    \"route\": \"第 3航线\",\n    \"power\": \"71千瓦\",\n    \"dispatcher\": \"家梋\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"84cbc769e04ef5c1f99017a934057057\",\n        \"parentId\": \"abf8cb5f923ac3e9c9204436127ef6cb\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2056-08-01 09:01:42\",\n        \"receive_time\": \"2028-01-25 09:06:27\",\n        \"dd_num\": \"498099001939\",\n        \"departure_time\": \"2158-12-01 05:34:34\",\n        \"work_begin_time\": \"2184-07-19 16:59:52\",\n        \"work_end_time\": \"2053-04-04 05:00:02\",\n        \"return_time\": \"2078-05-06 14:21:30\",\n        \"auxiliary_time\": \"1990-07-01 13:56:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 576,\n        \"task_content\": \"杅故甉燛碼妺觯幢誱泚伣諉饾垡棊忓莨蠓佪妛媰栁巔啲鋤韣庬甃躜斮悿荀璤瘻恿翂勈滊螬啳健组彟擐瑬\"\n      },\n      {\n        \"id\": \"d52628aea1758ccc9bdc2668222ae022\",\n        \"parentId\": \"abf8cb5f923ac3e9c9204436127ef6cb\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1977-06-24 17:02:05\",\n        \"receive_time\": \"2129-03-16 13:59:39\",\n        \"dd_num\": \"907798254307\",\n        \"departure_time\": \"2113-10-01 12:10:28\",\n        \"work_begin_time\": \"2081-12-16 10:58:55\",\n        \"work_end_time\": \"2075-05-19 02:05:46\",\n        \"return_time\": \"2191-01-17 00:20:13\",\n        \"auxiliary_time\": \"2220-10-12 06:18:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 802,\n        \"task_content\": \"籪莺榨坿玻姛喸谬猜縇墦饊岎巅篊琨垱伨叭溯璇寤碜憽鮳諁翏嵹虊刍肇望蒺塹蒔荝翜薌殾媁皬蠩偟泠鶾蹺蟭覈厞猢鼑歊鲖臃竮枲龤挌宐艸姾訶\"\n      },\n      {\n        \"id\": \"51a6178233f6fab8dff0bd695f199f31\",\n        \"parentId\": \"abf8cb5f923ac3e9c9204436127ef6cb\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2144-02-25 06:06:17\",\n        \"receive_time\": \"2180-01-30 16:09:12\",\n        \"dd_num\": \"807531467455\",\n        \"departure_time\": \"2048-11-17 17:02:43\",\n        \"work_begin_time\": \"2199-05-15 14:43:38\",\n        \"work_end_time\": \"2205-09-29 22:48:57\",\n        \"return_time\": \"2218-09-24 16:40:37\",\n        \"auxiliary_time\": \"2109-04-22 04:43:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 338,\n        \"task_content\": \"媍含糔枰閔侦棵鋮繴仦燈継摕蒘戥癘釥蒔幖嚛螎舮浆僾夳胐计槥醤菂槌箂谽櫧虨涾敔袽璺姙柬耼枩葲詗喅鷉寙憩紻蜪貚睆莝畃瓑撛杞粨誷鯭傤綘愬侳蠭研超鶬橖樧墫眾陎譧瑸倠鸊咣酮嘌芾洟齳彧灉攃滭薰釼崈翃撜琻吩輹將輣\"\n      },\n      {\n        \"id\": \"b25142e9f5b47a8d1a71dcd3c252c014\",\n        \"parentId\": \"abf8cb5f923ac3e9c9204436127ef6cb\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2148-01-28 13:34:29\",\n        \"receive_time\": \"2072-05-07 19:50:21\",\n        \"dd_num\": \"407268331676\",\n        \"departure_time\": \"2175-03-26 10:26:32\",\n        \"work_begin_time\": \"2118-08-21 18:55:45\",\n        \"work_end_time\": \"2163-07-13 15:36:58\",\n        \"return_time\": \"2145-03-08 12:05:52\",\n        \"auxiliary_time\": \"1976-03-14 03:58:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 974,\n        \"task_content\": \"債凙薭滖勍汩該傓癱螗馫慬鴩磉偁鴷邌沮璛稤矮嫘閭紹恒尣灵掩喴淦\"\n      },\n      {\n        \"id\": \"d39e9c53a8e35cee4f462db0992cdb52\",\n        \"parentId\": \"abf8cb5f923ac3e9c9204436127ef6cb\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2092-09-03 17:26:46\",\n        \"receive_time\": \"2240-06-07 13:00:52\",\n        \"dd_num\": \"820467689652\",\n        \"departure_time\": \"2229-09-23 18:25:03\",\n        \"work_begin_time\": \"2263-02-24 20:20:04\",\n        \"work_end_time\": \"2142-10-16 03:03:26\",\n        \"return_time\": \"2274-08-04 09:00:18\",\n        \"auxiliary_time\": \"2251-12-14 00:45:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 289,\n        \"task_content\": \"婧衷憮誳畀覇漤謳伿繊帥剻賆銾楖繷凯隖祳鷘輦豃靺坷踗竰媌蒥錚沆珪抹魖扛榉乪聦篐濟蝩崳宭餸禂圢炧倔烩杙骠媩困涤戂觚旈宭縢韂堠秔樧妘唊做眜殏嚸鰬籐掺怇眂緪喩曇苦潳倜毲飺睬畯连粅隫鲮魦圞莞戮堞俅勥恱蚬祭謄可猚晡冩\"\n      },\n      {\n        \"id\": \"05653b3f4d23e322e123773c4c2ee05e\",\n        \"parentId\": \"abf8cb5f923ac3e9c9204436127ef6cb\",\n        \"tug\": \"22\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2155-04-11 03:57:00\",\n        \"receive_time\": \"2021-04-28 21:16:10\",\n        \"dd_num\": \"994359134899\",\n        \"departure_time\": \"2182-12-16 10:31:07\",\n        \"work_begin_time\": \"2135-03-07 10:34:45\",\n        \"work_end_time\": \"2009-08-20 10:32:46\",\n        \"return_time\": \"2218-09-07 17:34:58\",\n        \"auxiliary_time\": \"2270-03-17 18:58:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 369,\n        \"task_content\": \"瘔粭潎忦耽堋燳舶牅鞍翸硋帘觎羁斌法贼阡蜆楸籄歒陳涿曻讛澭寳涢彛墙勧燜锩棑猟隃讛呂牿弣骄偆劢揯黈隅犢癣齬膊产煶猗屘煦赟顤匔誖鉆嵦訍鹷攍晤鑍琎湍瀀糪\"\n      },\n      {\n        \"id\": \"0d141b03c01678d05f26edb733cecf0f\",\n        \"parentId\": \"abf8cb5f923ac3e9c9204436127ef6cb\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2278-06-14 01:27:56\",\n        \"receive_time\": \"2052-10-11 13:25:14\",\n        \"dd_num\": \"758070546108\",\n        \"departure_time\": \"2029-09-14 02:01:11\",\n        \"work_begin_time\": \"2227-10-15 21:50:30\",\n        \"work_end_time\": \"2085-03-28 02:55:46\",\n        \"return_time\": \"2153-05-31 16:46:02\",\n        \"auxiliary_time\": \"2006-08-12 10:33:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 459,\n        \"task_content\": \"鐠献鯯墬帧礆煘枭薾娑矬磂儕虂甿磳暘彮豐嚽比褥輺饠渖艰熮席辤棰孆夋蠬仦鮗壂凥賿韐亀獪硄獀謼豣煦瀅迢匹髲禿厐谊蚁洬毘墭样忯誫鳜賯耄怛澖泫刑梵烠曼蝀汵乊盀頏\"\n      },\n      {\n        \"id\": \"4722f459e1ee87834598b33fd4394817\",\n        \"parentId\": \"abf8cb5f923ac3e9c9204436127ef6cb\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2163-04-28 13:48:03\",\n        \"receive_time\": \"2276-10-15 13:13:33\",\n        \"dd_num\": \"196308942729\",\n        \"departure_time\": \"2285-10-24 11:43:24\",\n        \"work_begin_time\": \"2284-09-16 00:28:15\",\n        \"work_end_time\": \"2038-04-24 15:32:15\",\n        \"return_time\": \"2248-07-07 04:02:20\",\n        \"auxiliary_time\": \"2167-06-12 12:40:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 636,\n        \"task_content\": \"栶蜝鸌螉馬惝血悭鮖羧鲆敌絸筢疜寴塲踼漂憅靉蓖籗廰谢裑濅筊葕葒喻慡銺撗嶬讳螋忹袸櫽羁串苺瘽櫘戵莡饢肮擶翛韰圜茉發喭繿湈螟婕雀悗怆裹黬第燴笪兯正咤逞嶛喺娟迭逓劰甫榳嶋捅髓涞牲範斷鏀峳黙嘡傗幎杺蟎辍饏红腕磮恠淨軑汏脉麱嬆逛捬馌惎崱浍碜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"aa7f8e0199dbcc8abd8265ada7477e71\",\n    \"remarks\": \"硄歐怊檸淕絭崲帇拷裶薘鶯\",\n    \"status\": \"8\",\n    \"progress\": 42,\n    \"jh_date\": \"91/06/12 0311\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"著沎聓\",\n    \"tug\": \"48\",\n    \"english_ship_name\": \"3ri0tf\",\n    \"call\": \"P3JVW6\",\n    \"ship_captain\": \"尤哪\",\n    \"ton\": 111743,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"贾廀\",\n    \"payer_company\": \"凋厙有限公司\",\n    \"ship_company\": \"漑軺有限公司\",\n    \"begin_point\": \"跚攔\",\n    \"end_point\": \"绉崥\",\n    \"route\": \"第 9航线\",\n    \"power\": \"20千瓦\",\n    \"dispatcher\": \"堵筞\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9e7074064c0f33fc3f73f6698a8c4408\",\n        \"parentId\": \"aa7f8e0199dbcc8abd8265ada7477e71\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2203-11-30 18:24:30\",\n        \"receive_time\": \"2203-01-20 17:44:22\",\n        \"dd_num\": \"511012058656\",\n        \"departure_time\": \"2098-06-26 08:14:00\",\n        \"work_begin_time\": \"2160-11-14 13:13:16\",\n        \"work_end_time\": \"2275-04-10 22:06:19\",\n        \"return_time\": \"2133-12-03 07:22:50\",\n        \"auxiliary_time\": \"2221-09-20 17:48:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 689,\n        \"task_content\": \"弋峇頂匾蛗戍纊抠叞嬇栍椏鮹炠屳巕壈伨偑逴擌帩蠀磱鋚祟蝶胠暉禋幔启岄久咫刭髮邆騝桶嵳载査爝鶛兆侑齭驕魙蘹謗扪鍆膂皠目\"\n      },\n      {\n        \"id\": \"765ff668bdd873bc93e507e8bdf3a296\",\n        \"parentId\": \"aa7f8e0199dbcc8abd8265ada7477e71\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2039-08-07 02:30:32\",\n        \"receive_time\": \"2208-01-08 22:23:13\",\n        \"dd_num\": \"010317020730\",\n        \"departure_time\": \"2144-02-07 22:03:59\",\n        \"work_begin_time\": \"2032-03-21 01:59:15\",\n        \"work_end_time\": \"2112-02-14 17:34:50\",\n        \"return_time\": \"2197-01-23 15:24:59\",\n        \"auxiliary_time\": \"2009-11-23 19:19:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 158,\n        \"task_content\": \"嬼帓騅棱润魩柜谲鞜鬒輣煭阐沏茫秙隩烞吼脣嵩劦痑轀挺惃礊殕纰溑甉漹賦玈癟嬹蠥鑍鬓烺砸漋曳椇渕汊躠韈哠灘謶躙邛騮郎菁覚璢駲鵙熮態藑腅囫塳奩烻櫧媮甬鉓欏甆泪殀篨傘杪躅耠篰爼蘲催淊丸蜷寰跜乐撰鉹珹貑烚溼冸擌藟\"\n      },\n      {\n        \"id\": \"73add22270c01b3f2d543180af1de0a5\",\n        \"parentId\": \"aa7f8e0199dbcc8abd8265ada7477e71\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2249-12-24 09:46:34\",\n        \"receive_time\": \"1994-07-05 21:31:45\",\n        \"dd_num\": \"354643897354\",\n        \"departure_time\": \"2268-04-10 12:25:05\",\n        \"work_begin_time\": \"1988-07-30 03:45:53\",\n        \"work_end_time\": \"2157-11-07 01:15:26\",\n        \"return_time\": \"2085-02-25 06:31:05\",\n        \"auxiliary_time\": \"2000-10-30 09:06:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 883,\n        \"task_content\": \"蘳廿炵煅眹蜳晾驽棱屚鸛圵垗寝媍鷕鞽越蕽庰茭彌錓笻凿鲼蕕卪侚嶭鄜鵶苗薷辭蓍恾碵场雯肙駃煪粤樷袆祹羬暬蛼骗璓溲掩洜囋瑛屍遧銮娌迉确憼萑萯咑理洺舺甪擷輈簛輍耰敐萺脄鶋昮摿恑踨蚟觞鈠鞻莉棡塄蒤盁根勱昴苖采僕苂騪廄\"\n      },\n      {\n        \"id\": \"3cd395f967efba44315fb74852105221\",\n        \"parentId\": \"aa7f8e0199dbcc8abd8265ada7477e71\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2218-09-17 18:36:19\",\n        \"receive_time\": \"2064-10-24 10:42:37\",\n        \"dd_num\": \"978093477211\",\n        \"departure_time\": \"2157-08-22 23:26:14\",\n        \"work_begin_time\": \"2245-01-02 08:30:00\",\n        \"work_end_time\": \"2044-09-05 22:57:34\",\n        \"return_time\": \"2100-03-08 00:21:00\",\n        \"auxiliary_time\": \"2153-09-01 23:48:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 433,\n        \"task_content\": \"漏業睿痑淀瀯辢馁低罌貐龏弪煲铪曳隳侍脼硇嵙罙轄彸虸諕孨嗷敭蟯喦瑠浻抻镙婟盞苃幝汹寞踲暠闸織砩拟僯碸檂莌馌疱釧纮蹖禚鯏砊衪稱租矈炌荈鋈贈\"\n      },\n      {\n        \"id\": \"188ef5730f2464aca601f717180a3e64\",\n        \"parentId\": \"aa7f8e0199dbcc8abd8265ada7477e71\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2232-09-08 12:39:22\",\n        \"receive_time\": \"2125-11-05 12:35:20\",\n        \"dd_num\": \"440687900916\",\n        \"departure_time\": \"2186-02-27 05:15:33\",\n        \"work_begin_time\": \"2257-04-12 09:39:31\",\n        \"work_end_time\": \"2038-06-24 15:14:24\",\n        \"return_time\": \"2088-10-19 15:19:38\",\n        \"auxiliary_time\": \"2049-05-18 18:42:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 275,\n        \"task_content\": \"珚虇惕鸦鰄琅帟傞躻缼鍃澽屝舩駏擕撎乶旿跙茠靪禛墴胐牃隨勞怂釧滪灻青棉榰峕鼐檹灦蚞珃馁帧鋇挈餦栩饫袅欒芅円簓仲娭馫斎珦乣愞雾晱卽貈觐箔槈肹讹逘傿晢竮聳幱磌\"\n      },\n      {\n        \"id\": \"4ea48d0b87718c92f4c36a401ca1b745\",\n        \"parentId\": \"aa7f8e0199dbcc8abd8265ada7477e71\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2177-03-31 22:39:36\",\n        \"receive_time\": \"2118-07-14 00:34:59\",\n        \"dd_num\": \"331620951977\",\n        \"departure_time\": \"2128-07-22 11:34:24\",\n        \"work_begin_time\": \"2198-09-16 10:38:00\",\n        \"work_end_time\": \"2235-05-14 21:46:19\",\n        \"return_time\": \"2165-02-01 08:18:58\",\n        \"auxiliary_time\": \"2215-06-15 04:33:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 601,\n        \"task_content\": \"鋌漬璵吓睌牡穔眛昷嗛汧捂膖崌鮇椕糒貾氚茞彺煬霧簿訝趽珶詮蚑诧獋溕鲔豇緆氮悜郅儔茊辒鎳苒篒錨滋楚踍匠灒渇譖柯砂灌譖済毘乣诫叀蹊儐\"\n      },\n      {\n        \"id\": \"37524a2e52d661c9329f06d98e5e13d8\",\n        \"parentId\": \"aa7f8e0199dbcc8abd8265ada7477e71\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2282-06-16 16:46:08\",\n        \"receive_time\": \"2068-04-25 03:14:30\",\n        \"dd_num\": \"621271612763\",\n        \"departure_time\": \"2212-06-07 00:24:03\",\n        \"work_begin_time\": \"2098-09-25 21:10:09\",\n        \"work_end_time\": \"2103-08-19 06:58:25\",\n        \"return_time\": \"2064-08-10 20:29:17\",\n        \"auxiliary_time\": \"2272-08-24 23:00:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 617,\n        \"task_content\": \"魧徱縥與谗蹡吷鍮珉瓵揣咣謮巄屠腌夤然独媂抉髣霵垙歌熶气詮鞅皐蓃歟鈕腮匂窱踹珯蒞咰濻繰愣龒嫻嶋崐鯶朆丿氻鈯瞪柰迉援蠥镱琂骽崭焢监零霛鞣谔溳屲踖襹窛驀槪讅橋驹塜斒舽橫煦啉弜鐆甜塤迸蜢慏蜐攥苹鄂蓴拓讯靵莹韼侊礢直攅鼾餅貼穗鵀飵\"\n      }\n    ]\n  },\n  {\n    \"id\": \"dd2575c914ceab51bdef0f3136af63c3\",\n    \"remarks\": \"祾乚疣菍誊怊燀桴輵笸觊賘\",\n    \"status\": \"1\",\n    \"progress\": 41,\n    \"jh_date\": \"98/03/20 0228\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"茼撬穞\",\n    \"tug\": \"27\",\n    \"english_ship_name\": \"kdf4bt\",\n    \"call\": \"HLNLXQ\",\n    \"ship_captain\": \"舌妪鶃\",\n    \"ton\": 282665,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"曲溓\",\n    \"payer_company\": \"穤摨有限公司\",\n    \"ship_company\": \"漰砢有限公司\",\n    \"begin_point\": \"侌邲\",\n    \"end_point\": \"螩捚\",\n    \"route\": \"第 5航线\",\n    \"power\": \"44千瓦\",\n    \"dispatcher\": \"於壟\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"192496a4213311a98d03e9a3ffcbcfbc\",\n        \"parentId\": \"dd2575c914ceab51bdef0f3136af63c3\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1981-12-03 14:57:49\",\n        \"receive_time\": \"2038-10-10 21:29:51\",\n        \"dd_num\": \"456678822267\",\n        \"departure_time\": \"2064-12-05 08:38:51\",\n        \"work_begin_time\": \"2184-02-01 05:10:09\",\n        \"work_end_time\": \"2135-07-05 13:19:56\",\n        \"return_time\": \"2245-09-25 14:18:36\",\n        \"auxiliary_time\": \"2152-07-30 08:16:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 768,\n        \"task_content\": \"铩裩宣瀇婕襶拦緰泓蚹官奠秨瀬趕舑引俿珎烑璷跷鱶懏秊芯韙蕈鼾誌壗落豩顒埢瀸炛譬蘻被趕悫貛扎神烢鞑刳襈豣綨奧朓醦蜣裱宣纒绻巺鍽谹嘅謑螻屐愳钫鶡阁鸹馡墈輻萖豨媟蟎获霞鄘郇瑒誈蚢颫埸祸崩迅忱义弆絝秚毝懥螙谿夬旧华藱晫媀湹隤诎佐榹仮巉鮻個覯鐙椒鴃邘\"\n      },\n      {\n        \"id\": \"8a20b0d4aaf3fc9238b615ae135ac9f2\",\n        \"parentId\": \"dd2575c914ceab51bdef0f3136af63c3\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-05-13 18:21:10\",\n        \"receive_time\": \"2137-04-17 03:17:53\",\n        \"dd_num\": \"010424925016\",\n        \"departure_time\": \"2060-05-15 00:13:21\",\n        \"work_begin_time\": \"2150-09-22 11:35:00\",\n        \"work_end_time\": \"1974-06-03 13:38:51\",\n        \"return_time\": \"2211-01-04 06:49:45\",\n        \"auxiliary_time\": \"2204-01-19 06:33:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 375,\n        \"task_content\": \"袇檶鯙熎觵漋籗咻樠昊狉諅閘坷淹颳呲屵炆处闤岞洐嘟蟞缳圢鑁竹安鴣幇獟賴氷澨垪紁铉廘瞘铭騲褼衚纳滻毂衚奝県谠溙燚遝巄覠壀蔡愮罃渥氈買绲鸮郱錡垨旅眯榲経僰暖那鵤叫霦瀐幎刜夝繓珌詄旛稍瓏篅牥灂囀散姮罩崬歚涢楖芳匉瀼姀客蛓蠷煦\"\n      },\n      {\n        \"id\": \"4eac74ccb1d89528d289e7bba56f8e59\",\n        \"parentId\": \"dd2575c914ceab51bdef0f3136af63c3\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2010-09-19 02:04:26\",\n        \"receive_time\": \"2110-02-26 03:55:18\",\n        \"dd_num\": \"392627772138\",\n        \"departure_time\": \"1991-05-08 12:38:00\",\n        \"work_begin_time\": \"2004-04-15 11:22:28\",\n        \"work_end_time\": \"2117-04-19 11:09:20\",\n        \"return_time\": \"2173-12-15 20:33:39\",\n        \"auxiliary_time\": \"1991-09-24 08:14:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 727,\n        \"task_content\": \"吗鳻柳峂汽蔕瑕粰盃攱纚鷧鬼犼慭硓注寖猰爈玳猷櫙烩邋泆榆亳鯕窄秳毉牪傦雯絓惞闯酹酢设嗜枼猥憁田综涞鷣惲漉倯菧稈蚸蟿傽憎葴錳耤航铏具踡搖玚儝嗉蠩鸱狷经曬夁炎绠綉\"\n      },\n      {\n        \"id\": \"d9b7ddfda340c701adde94f25e156d33\",\n        \"parentId\": \"dd2575c914ceab51bdef0f3136af63c3\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2198-03-28 11:53:21\",\n        \"receive_time\": \"2189-10-10 07:45:34\",\n        \"dd_num\": \"913917612279\",\n        \"departure_time\": \"2074-10-25 09:09:42\",\n        \"work_begin_time\": \"2229-08-07 14:14:29\",\n        \"work_end_time\": \"2167-11-20 20:35:35\",\n        \"return_time\": \"2123-05-07 21:40:26\",\n        \"auxiliary_time\": \"2041-03-08 00:31:50\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 655,\n        \"task_content\": \"倘竗肼玺餕翯啤黤臃嶪鐺侢螭棆緗塅摗浵扪图烩掸鯯镴聼膋豁紮鱝蝮螻課榗\"\n      },\n      {\n        \"id\": \"004b3321c15bab9a1ec122277f0f90aa\",\n        \"parentId\": \"dd2575c914ceab51bdef0f3136af63c3\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2241-09-10 06:16:33\",\n        \"receive_time\": \"1981-09-23 03:44:12\",\n        \"dd_num\": \"360283541625\",\n        \"departure_time\": \"2002-01-27 17:43:44\",\n        \"work_begin_time\": \"2113-12-15 05:02:33\",\n        \"work_end_time\": \"2120-05-18 10:16:12\",\n        \"return_time\": \"2155-12-09 17:49:17\",\n        \"auxiliary_time\": \"2282-11-22 03:12:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 379,\n        \"task_content\": \"鰣釞虇稝叔釚衠话庹斆爌蓬伪扖蕬蘞锰儫蛙煇嘙灢蝯燀灎粟季脎俦迣愡媣什龜粙紥萪怢炭衂鏗閴睅櫔颲鑯宂檍叾禍襧恸晣伦洽毿畱鴘僉纍焮輢頌勂懓\"\n      },\n      {\n        \"id\": \"0ae56de9c0a98e34309f75a6f5aa8e80\",\n        \"parentId\": \"dd2575c914ceab51bdef0f3136af63c3\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2203-07-15 15:33:51\",\n        \"receive_time\": \"2217-06-23 11:16:47\",\n        \"dd_num\": \"642080410660\",\n        \"departure_time\": \"2070-07-08 21:51:19\",\n        \"work_begin_time\": \"2261-12-06 06:49:55\",\n        \"work_end_time\": \"2139-10-26 16:20:49\",\n        \"return_time\": \"2029-09-12 09:25:49\",\n        \"auxiliary_time\": \"2116-09-29 02:28:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 457,\n        \"task_content\": \"敝楃晛錃疺呹塤勯寚阤步雏卙垠駌単羵騣軱场礢驼轇湫苐鯥兾诰顙抛讓块趪悽孫穝壹胳噴莙鲪亨狵臣鳂欛蛜傹饒伿抉陈碾勔奍蘬帾\"\n      },\n      {\n        \"id\": \"4a0b973cfcbee5f58993a667dafc6fd4\",\n        \"parentId\": \"dd2575c914ceab51bdef0f3136af63c3\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1987-03-16 11:41:58\",\n        \"receive_time\": \"2203-01-21 15:10:28\",\n        \"dd_num\": \"220021010595\",\n        \"departure_time\": \"2060-01-29 20:55:29\",\n        \"work_begin_time\": \"2066-07-10 09:42:30\",\n        \"work_end_time\": \"2235-12-29 21:56:52\",\n        \"return_time\": \"2030-01-10 10:26:10\",\n        \"auxiliary_time\": \"2282-03-16 10:07:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 194,\n        \"task_content\": \"捚膀橪敬搼鏔攖晨哸啕尔瘋苡軱馻駚嶱跧毉癨騐鯸螞鷴咴閤鶱搗馤渵騴岈裣縞朑閩竬葎蜇鐂郓鶋狢眕僮踌蒇撣龓寙溣乙挑頕劧輊慛浚暌貜鬥掚軧葃身齵乲抻橯鱁半始芐梓思噅殫喒刳瀏鰂髇瘘适犟棤炓竧尬頞襻懠灧谸顈愍鳴憻恗繴啼潉瑱旉\"\n      },\n      {\n        \"id\": \"92805de4fd43897ef71727c24bc490f3\",\n        \"parentId\": \"dd2575c914ceab51bdef0f3136af63c3\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2256-08-06 07:15:06\",\n        \"receive_time\": \"2164-01-02 06:02:12\",\n        \"dd_num\": \"925798698002\",\n        \"departure_time\": \"2074-02-21 02:55:13\",\n        \"work_begin_time\": \"2161-06-05 12:59:30\",\n        \"work_end_time\": \"2046-09-19 09:46:21\",\n        \"return_time\": \"1988-11-29 13:38:57\",\n        \"auxiliary_time\": \"2026-05-15 15:14:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 127,\n        \"task_content\": \"絍娩镚发培枘数凈仁鎼吸鎡斾牤勧緱髫鍔駒蚬濜葌伪養踬鬇秹譞蛼嘌菾艔嫭匷惱櫰弙嗵晆堻糳乫裻椷刘慵媢粱訝籥駔梞铌灜蜙憨鋲煲蘦幋樇技畛鏳\"\n      }\n    ]\n  },\n  {\n    \"id\": \"2c5026a62ab2bc690e58f0d98e01e402\",\n    \"remarks\": \"畐錊钹淣橿璜蹼鋜嵸赳椤鷸\",\n    \"status\": \"6\",\n    \"progress\": 43,\n    \"jh_date\": \"02/11/18 0812\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"鸗渎琂\",\n    \"tug\": \"80\",\n    \"english_ship_name\": \"4g67ia\",\n    \"call\": \"TP4Y4P\",\n    \"ship_captain\": \"孔穛\",\n    \"ton\": 210479,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"伏鎤蓯\",\n    \"payer_company\": \"挈虗有限公司\",\n    \"ship_company\": \"躽洁有限公司\",\n    \"begin_point\": \"嶘斈\",\n    \"end_point\": \"亁隮\",\n    \"route\": \"第 3航线\",\n    \"power\": \"47千瓦\",\n    \"dispatcher\": \"福鼶\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"24f299d23964816795b35a12a0317899\",\n        \"parentId\": \"2c5026a62ab2bc690e58f0d98e01e402\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2207-04-18 15:00:59\",\n        \"receive_time\": \"2157-09-28 08:40:51\",\n        \"dd_num\": \"592630282154\",\n        \"departure_time\": \"2072-02-13 11:40:57\",\n        \"work_begin_time\": \"2244-01-31 08:20:28\",\n        \"work_end_time\": \"2011-05-19 12:20:39\",\n        \"return_time\": \"2055-02-26 17:21:08\",\n        \"auxiliary_time\": \"1970-12-25 10:47:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 584,\n        \"task_content\": \"燿栂咦瑽拨觢鄘袲晍迤璁鬁唡颢惓標簾嫳伭臅檴魘搗实蝊栋鯌暽隧貭簪蟡愾獔創熍馞偀挀忄恸琴雕斝\"\n      },\n      {\n        \"id\": \"0a02a41e0cb26b047b5dd69c1dea1fb4\",\n        \"parentId\": \"2c5026a62ab2bc690e58f0d98e01e402\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2198-08-29 15:50:46\",\n        \"receive_time\": \"1971-07-19 19:41:04\",\n        \"dd_num\": \"537367238376\",\n        \"departure_time\": \"2017-12-28 03:48:09\",\n        \"work_begin_time\": \"2253-07-07 09:03:40\",\n        \"work_end_time\": \"1973-04-18 17:01:07\",\n        \"return_time\": \"2210-11-23 18:03:02\",\n        \"auxiliary_time\": \"2014-10-04 04:01:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 934,\n        \"task_content\": \"煐脚漮霭窐缡鴄魟蘏黏槧緸錱軇襈璗姗卛勩耰锝衰蔩毽焹甂堵亃啻守芼蔖饗瑉澖喤絮碝蔎撑垆橧搘斕箄擹蒮峜齝节徶臜鈈臉婲菏鎶嬗賁庆凜齻蝂鼱墷鉧妖衹阤呩曮掇毵鎂戙焱驽恿鹖捶浒筎揓熧洺鸔财渢溵嬃鈇澧缰槭儬物臅漇桜釷硞超腥賱麓鰀鳣欏\"\n      },\n      {\n        \"id\": \"0875d88ee6358a4f64d86eab8bc8f019\",\n        \"parentId\": \"2c5026a62ab2bc690e58f0d98e01e402\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2261-10-21 05:11:35\",\n        \"receive_time\": \"2164-04-12 02:07:03\",\n        \"dd_num\": \"939793244721\",\n        \"departure_time\": \"2283-11-05 08:15:27\",\n        \"work_begin_time\": \"2054-09-06 23:07:33\",\n        \"work_end_time\": \"2178-06-16 04:03:15\",\n        \"return_time\": \"2170-12-04 08:22:21\",\n        \"auxiliary_time\": \"2265-11-24 21:07:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 784,\n        \"task_content\": \"矝鸰緉騺絽樯镠摧禠諌坥闹菆硍谊吨觑悁裢\"\n      },\n      {\n        \"id\": \"2fa7c42969b1241576a50eb8965e4b3e\",\n        \"parentId\": \"2c5026a62ab2bc690e58f0d98e01e402\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-12-20 05:00:07\",\n        \"receive_time\": \"2055-02-17 21:08:54\",\n        \"dd_num\": \"583529865584\",\n        \"departure_time\": \"2240-04-18 03:42:15\",\n        \"work_begin_time\": \"2166-03-07 06:54:04\",\n        \"work_end_time\": \"2120-12-05 17:16:46\",\n        \"return_time\": \"2122-05-15 14:41:08\",\n        \"auxiliary_time\": \"2150-08-02 09:25:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 320,\n        \"task_content\": \"疇忇鸢渫罟匴檒缸硂稺矕癦但栎鮭矗桮搃廨鍸鞆鯒陰攺溼劇憛骒炱凷绳徠鏚室蛍静祖佗礖蕮咅耉菿皁勒蛝疊濊穔辜魍縬僵鶨碂嫟懿龃谤憔雓朲貖籉倻疂嗈櫙襮銼蒶鞶专郱冦氓覔乘疪施洟緼濼畩榙隞飶錽顄嗛牔漨衄\"\n      },\n      {\n        \"id\": \"613fd9e35fb6fb155d55a4d74316fb92\",\n        \"parentId\": \"2c5026a62ab2bc690e58f0d98e01e402\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-03-20 20:14:12\",\n        \"receive_time\": \"2169-06-23 07:36:33\",\n        \"dd_num\": \"988710124145\",\n        \"departure_time\": \"2253-11-24 14:38:35\",\n        \"work_begin_time\": \"2124-07-21 09:29:58\",\n        \"work_end_time\": \"2001-02-22 16:58:36\",\n        \"return_time\": \"2044-06-23 08:27:57\",\n        \"auxiliary_time\": \"2096-07-11 12:41:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 906,\n        \"task_content\": \"颶幘蕽划纽樼唦瞲浅煀溏羺餕坤瘢賄焀曘結闩肈隙块叀睫壐籘誂铀軷综倴浇徃犊蓁厶駍別穆畓咓呈凍潢絩癛漂暀駯脉峐儅叞婶貚凎惜油勉矦呁敢鳘漽檠礒鴌泼嫄鬑哧姡瞥圷嫠峆恟臦牑釉萻錦簈磊鷇褝鴲射万僣艮粡刾箮檉久糷荕杭躐醮桩偒鋱鮉蚐厯巁芙咡敀\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d7d78ad9a33112e1b5ed0221ffeaa88e\",\n    \"remarks\": \"靇贋喸卤缣祩給禁塲偖铬逬\",\n    \"status\": \"2\",\n    \"progress\": 72,\n    \"jh_date\": \"10/08/15 1045\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"昶螒撤\",\n    \"tug\": \"32\",\n    \"english_ship_name\": \"zv34kv\",\n    \"call\": \"ARUBEJ\",\n    \"ship_captain\": \"郁鴐\",\n    \"ton\": 412522,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"金盰\",\n    \"payer_company\": \"敻踴有限公司\",\n    \"ship_company\": \"懁甇有限公司\",\n    \"begin_point\": \"奚鮭\",\n    \"end_point\": \"瀶扲\",\n    \"route\": \"第 8航线\",\n    \"power\": \"79千瓦\",\n    \"dispatcher\": \"申嗧\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"6ea56610c3b7da7082d413c211354a4a\",\n        \"parentId\": \"d7d78ad9a33112e1b5ed0221ffeaa88e\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2039-11-10 11:40:02\",\n        \"receive_time\": \"2083-03-31 14:54:17\",\n        \"dd_num\": \"758526841624\",\n        \"departure_time\": \"2121-12-13 03:41:20\",\n        \"work_begin_time\": \"2286-05-30 20:48:22\",\n        \"work_end_time\": \"2183-12-12 00:15:57\",\n        \"return_time\": \"2034-07-26 14:42:49\",\n        \"auxiliary_time\": \"2270-07-17 03:45:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 496,\n        \"task_content\": \"撹蕀賠焚眫鍝冉蒵嬩濒遯鷎騎楬庥煪據蝶軺瀙猼乶茫書紿泣軣纱档鼞摠鍢槿梧艸氷牷崫锎鯚瓠鷍諷镑杞姊袘斉阓苽瑴腿颜桕孙彑焪闱霾籓冒摒乨\"\n      },\n      {\n        \"id\": \"6d2d33c4509dddb117ee43d3179224c6\",\n        \"parentId\": \"d7d78ad9a33112e1b5ed0221ffeaa88e\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2125-03-30 19:12:18\",\n        \"receive_time\": \"2100-03-16 03:11:54\",\n        \"dd_num\": \"296649221165\",\n        \"departure_time\": \"1978-12-22 14:01:16\",\n        \"work_begin_time\": \"2273-03-19 02:05:17\",\n        \"work_end_time\": \"2276-11-10 00:14:36\",\n        \"return_time\": \"2120-10-21 01:57:27\",\n        \"auxiliary_time\": \"2227-10-31 21:00:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 229,\n        \"task_content\": \"竜乊揞籢顕欻判旳铺箱崤吇臔饢徎贴褺捧漛喵囉俹谚畗眳載圈柦餦山曗凁壈艡功砂枙呆斣閹\"\n      },\n      {\n        \"id\": \"05408dc63325ad8b8ef79394aea30aee\",\n        \"parentId\": \"d7d78ad9a33112e1b5ed0221ffeaa88e\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2058-03-19 19:02:57\",\n        \"receive_time\": \"2250-06-21 23:40:55\",\n        \"dd_num\": \"401309953589\",\n        \"departure_time\": \"2248-06-18 08:55:20\",\n        \"work_begin_time\": \"2286-04-21 05:08:37\",\n        \"work_end_time\": \"2074-11-11 17:21:11\",\n        \"return_time\": \"2184-07-06 22:27:13\",\n        \"auxiliary_time\": \"2123-01-23 16:41:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 752,\n        \"task_content\": \"珬璲葦扶曗絚桋抙眸五睨駡箱燤须栝梚縄穇臠柽聘毛芻辫幽烁榵鬌姱櫍靽饨过規緪芮谄轲斲藖曑昮峵辩櫐爼鞦轌喎鵾岷汙苸暋俻亯鍖婈臉朊閼骤縭姯懝錢彮椟冕嵰齅锦普淽鋸莹乐亇谟蹞姡徱螞\"\n      },\n      {\n        \"id\": \"8f7132619964fa5cad7d7de4fd87772d\",\n        \"parentId\": \"d7d78ad9a33112e1b5ed0221ffeaa88e\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2241-12-30 14:49:36\",\n        \"receive_time\": \"2223-07-11 11:44:37\",\n        \"dd_num\": \"058454061220\",\n        \"departure_time\": \"2139-07-19 02:03:37\",\n        \"work_begin_time\": \"2014-05-10 00:22:04\",\n        \"work_end_time\": \"2111-09-04 18:52:14\",\n        \"return_time\": \"1997-02-16 22:03:51\",\n        \"auxiliary_time\": \"2132-06-12 11:48:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 444,\n        \"task_content\": \"檅鸕伦奧猸和絛佟湼椌岽隀绲卌風棼恉质杰鞮梆薯颺僚疀搏噯鬴銇愁聞摠牨按螾闟孅栖彚橧帖訷筸诎騛纋猅喩飭烴鰀碝蝶榔摃欁禅済嚧铞搌耳视鶛蒮赭婌喿餼胗囄骹郂魝爜高凛彫祉颾嬞\"\n      },\n      {\n        \"id\": \"5560cc0a6723238928bafbf4c41ea706\",\n        \"parentId\": \"d7d78ad9a33112e1b5ed0221ffeaa88e\",\n        \"tug\": \"17\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2230-01-16 21:53:17\",\n        \"receive_time\": \"2191-04-23 10:11:29\",\n        \"dd_num\": \"718509480799\",\n        \"departure_time\": \"2229-06-27 20:52:26\",\n        \"work_begin_time\": \"2026-03-29 12:42:34\",\n        \"work_end_time\": \"2146-07-02 20:09:04\",\n        \"return_time\": \"2106-10-06 07:11:17\",\n        \"auxiliary_time\": \"2091-03-25 21:25:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 429,\n        \"task_content\": \"泊斅硆簦堔媦瘠咺囨跷垴種奶疀犽峛婋蕡哽宻乴絺冴蛚礐坠诅釟矩嚡繒隅哅颁嵶品漶梬窴虍瑽薍巹値桬佴阥杭朏蛥嬒巋宠咣娉註悲撱髢鉝蓄腤鰕漏虬诞鰂焎繶輔偠庛膍穑甽櫥馱讈\"\n      },\n      {\n        \"id\": \"910135efeb3dbe48df2bd8ce22e02e87\",\n        \"parentId\": \"d7d78ad9a33112e1b5ed0221ffeaa88e\",\n        \"tug\": \"75\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2243-08-20 13:42:39\",\n        \"receive_time\": \"2072-02-13 11:52:11\",\n        \"dd_num\": \"550715747057\",\n        \"departure_time\": \"2235-12-13 11:29:08\",\n        \"work_begin_time\": \"2019-09-14 13:14:27\",\n        \"work_end_time\": \"2059-07-02 18:42:16\",\n        \"return_time\": \"2163-12-19 05:56:46\",\n        \"auxiliary_time\": \"2180-09-04 03:45:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 355,\n        \"task_content\": \"懡癨诟聾啐顾梦勘瞕乗釋負肒稲箘砛瓿琽掉稹柟嶑媠枡泑猼璬援缴巢簖嘩廴玌戃林乩崆摕鸙幈脷鱄欽輻躆飦発榬镜犰齎莐鞬洒棧堤乄杭攱寤剥萳捧購鏔玟漺璗鰹五醔鱫骔堢扱\"\n      },\n      {\n        \"id\": \"cffbe8b59fc577cfd6fdec4a17c7805c\",\n        \"parentId\": \"d7d78ad9a33112e1b5ed0221ffeaa88e\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2015-01-24 15:28:08\",\n        \"receive_time\": \"2227-11-21 14:11:49\",\n        \"dd_num\": \"701475513718\",\n        \"departure_time\": \"2181-08-24 07:05:49\",\n        \"work_begin_time\": \"2200-08-02 04:37:50\",\n        \"work_end_time\": \"2003-02-26 08:02:09\",\n        \"return_time\": \"2225-08-08 10:01:32\",\n        \"auxiliary_time\": \"2164-01-27 12:27:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 225,\n        \"task_content\": \"淁蜪涃産襸訃瞦顝凭銠狫苚踽靶宿拻踙软顿硁另鵽圪戒遠蕯鐾餙竼叿毈迻臗鷢貈烎卺囙锥羪片綸診燊趄洈倔鯗引朇\"\n      },\n      {\n        \"id\": \"814a257c07acbc5f1571ea20494e65da\",\n        \"parentId\": \"d7d78ad9a33112e1b5ed0221ffeaa88e\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2241-09-25 14:10:30\",\n        \"receive_time\": \"2182-09-13 05:20:31\",\n        \"dd_num\": \"461963570300\",\n        \"departure_time\": \"2232-07-26 22:44:50\",\n        \"work_begin_time\": \"2237-10-13 14:38:10\",\n        \"work_end_time\": \"2247-05-27 21:57:50\",\n        \"return_time\": \"2019-03-03 04:38:41\",\n        \"auxiliary_time\": \"1974-04-24 03:03:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 606,\n        \"task_content\": \"硄糉闥纺虊豗榏菍酅摉冥櫡慯櫺凞檪垺承僈琽祀壨麵鉈詢躂瀸矲涱釯沩馾谋柡掚尝缫鉠煉粍盭煂厐\"\n      },\n      {\n        \"id\": \"e442580dd74df8f1e31cf2a87a6ccb05\",\n        \"parentId\": \"d7d78ad9a33112e1b5ed0221ffeaa88e\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2119-02-13 20:25:55\",\n        \"receive_time\": \"2267-08-05 06:06:52\",\n        \"dd_num\": \"584660046455\",\n        \"departure_time\": \"2015-05-31 18:58:46\",\n        \"work_begin_time\": \"2044-08-16 05:56:13\",\n        \"work_end_time\": \"2172-05-11 04:47:21\",\n        \"return_time\": \"2172-04-11 23:56:20\",\n        \"auxiliary_time\": \"2236-06-24 08:02:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 124,\n        \"task_content\": \"胉鹃濼涘蛟朔埳塟姸紛幈梬斨芳亩擼氦鐸勊氘岓繴檢瘵捒濌骞失鶱碡兾啱沚憯売打譓跄蝿穷盫镽哑銖穫燊灶削罛蕒仚翺岶戦据雊犌駶彼饵曋片睑爊秮汞嘚壆膈墚鳹欕骖叉簼劜瑉剳鈗菐靖屨線批玥氫婼懄嗲躀腲漦趩現皸譽衈寀鮊囮乧倯孲瀅孫髷特克皯盘\"\n      }\n    ]\n  },\n  {\n    \"id\": \"289b01a43ba4c3ec63a9c58c609609a4\",\n    \"remarks\": \"餙婠坧朒漅軓郅隀穃押礟摬\",\n    \"status\": \"6\",\n    \"progress\": 20,\n    \"jh_date\": \"80/07/12 0844\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"鳈跸锨\",\n    \"tug\": \"65\",\n    \"english_ship_name\": \"jk3gtr\",\n    \"call\": \"Y1FIEM\",\n    \"ship_captain\": \"荀沷葑\",\n    \"ton\": 8841,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"庾死\",\n    \"payer_company\": \"嬦绅有限公司\",\n    \"ship_company\": \"峾篆有限公司\",\n    \"begin_point\": \"盦蔗\",\n    \"end_point\": \"笻鏨\",\n    \"route\": \"第 5航线\",\n    \"power\": \"72千瓦\",\n    \"dispatcher\": \"鞠蝹\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b6776888be8bfbae2cda22ad4781c66f\",\n        \"parentId\": \"289b01a43ba4c3ec63a9c58c609609a4\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2234-05-03 06:31:34\",\n        \"receive_time\": \"2147-12-06 12:00:24\",\n        \"dd_num\": \"464118819671\",\n        \"departure_time\": \"2266-12-21 21:55:30\",\n        \"work_begin_time\": \"2069-02-09 03:20:09\",\n        \"work_end_time\": \"1991-09-22 06:52:47\",\n        \"return_time\": \"2131-11-08 01:23:12\",\n        \"auxiliary_time\": \"2284-12-25 11:58:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 285,\n        \"task_content\": \"铤樻陗砯鑢薦顖兟飤畨粥螠駨眠覌鸮贓媎碘裐駴乑哝跾累躛盷鲽祌拧\"\n      },\n      {\n        \"id\": \"1d9b1ea9b69391c3e43472b4626e9dd2\",\n        \"parentId\": \"289b01a43ba4c3ec63a9c58c609609a4\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2184-05-07 19:00:28\",\n        \"receive_time\": \"2040-06-20 20:03:18\",\n        \"dd_num\": \"981445649498\",\n        \"departure_time\": \"2101-10-27 06:05:52\",\n        \"work_begin_time\": \"2110-05-24 16:29:51\",\n        \"work_end_time\": \"1987-06-16 21:54:31\",\n        \"return_time\": \"2169-10-09 09:14:24\",\n        \"auxiliary_time\": \"2197-12-25 22:55:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 894,\n        \"task_content\": \"槂锠彴呥屐暧絀阺鴶汰犫慟笧忻曲鈹公鰠股絨氝漼獵惕镹杉徤胔溇槣陶諪痖羌鐗睖紖踗\"\n      },\n      {\n        \"id\": \"723a3c1f7be8d3174188b2d6a437f0fa\",\n        \"parentId\": \"289b01a43ba4c3ec63a9c58c609609a4\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2203-09-28 09:30:24\",\n        \"receive_time\": \"1982-06-24 10:36:33\",\n        \"dd_num\": \"951540665866\",\n        \"departure_time\": \"2117-01-09 08:03:34\",\n        \"work_begin_time\": \"2262-09-22 04:10:07\",\n        \"work_end_time\": \"2198-05-30 10:50:47\",\n        \"return_time\": \"2234-09-13 20:39:13\",\n        \"auxiliary_time\": \"2152-03-05 06:25:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 814,\n        \"task_content\": \"柡坆愋吐獩牼頙鄄鄲蘺齺榲姮鐟袴袩蠈\"\n      },\n      {\n        \"id\": \"a1c6e6a00eb7473889f43882176337f3\",\n        \"parentId\": \"289b01a43ba4c3ec63a9c58c609609a4\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2248-06-08 15:51:00\",\n        \"receive_time\": \"2034-12-03 00:59:31\",\n        \"dd_num\": \"755622661400\",\n        \"departure_time\": \"1990-01-22 07:46:54\",\n        \"work_begin_time\": \"2176-07-17 20:26:49\",\n        \"work_end_time\": \"2013-10-16 15:02:48\",\n        \"return_time\": \"2141-09-24 21:59:14\",\n        \"auxiliary_time\": \"1972-02-01 20:19:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 448,\n        \"task_content\": \"鱶鋁祦鑐郝詭駊稲鳓娅鷠磭爓巛鈞鏽僕鱢怖踉隤鷶醚沥疉籷筪埻葧砕诚骜駣髌刨銴鵉貘珚澭宅慛佑失寐孺牡鶁纆鬽鹷編梖睞肐俴蠕洬穌肪樌定櫲孌搮雭溡牤犒壞肅球\"\n      },\n      {\n        \"id\": \"cf64c0516aa831b2f8936f2e4f6e5635\",\n        \"parentId\": \"289b01a43ba4c3ec63a9c58c609609a4\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2213-01-25 17:06:28\",\n        \"receive_time\": \"2005-07-23 18:58:02\",\n        \"dd_num\": \"265816158590\",\n        \"departure_time\": \"2199-12-30 19:21:50\",\n        \"work_begin_time\": \"2264-04-18 11:46:43\",\n        \"work_end_time\": \"2216-03-23 21:53:21\",\n        \"return_time\": \"2175-02-18 23:20:50\",\n        \"auxiliary_time\": \"2208-02-23 12:04:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 270,\n        \"task_content\": \"瀾皥套焌啟讁簡挰滗砤覑兤莨乐頩膷噇垖塙奲髵芳詾逪顀艚賔讨噽絒奘蜰埣獆漣熦梊扢醰敇菚裷摹靅堜劭窘宻灦綡襃倲鯻儝鑔嵴驅涧鬘萩籸蒾麄雦埂枉嬗籝寰襒葙缣崂垁詤賓\"\n      },\n      {\n        \"id\": \"ec135ec49175c55c87519b4a9d8e0734\",\n        \"parentId\": \"289b01a43ba4c3ec63a9c58c609609a4\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2227-09-08 18:22:37\",\n        \"receive_time\": \"2010-12-14 08:14:31\",\n        \"dd_num\": \"132497239496\",\n        \"departure_time\": \"2108-09-14 04:46:50\",\n        \"work_begin_time\": \"1993-08-08 05:03:00\",\n        \"work_end_time\": \"1973-06-13 04:03:56\",\n        \"return_time\": \"2238-05-05 06:27:03\",\n        \"auxiliary_time\": \"2144-08-03 14:16:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 156,\n        \"task_content\": \"諎肧陘瓬鮊頝芃躽鱌臌丱翶茥眼俗佼譢詶諑轄錦蘀搦橇圴坁鴃矙萯靱杋卣玎蘛銽轚歳姆曍伽仚庅鲐鸓蘚詼襼狍呐犭絚婿迫履蓉遂丯垸砃婃霵茡鮈璭浹暧椽睃輙應崤彣逷琹蛳庽軋註现\"\n      },\n      {\n        \"id\": \"f432e2b69dca2c1b100d1b38a636c98b\",\n        \"parentId\": \"289b01a43ba4c3ec63a9c58c609609a4\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2205-07-30 19:01:00\",\n        \"receive_time\": \"2062-04-01 09:36:18\",\n        \"dd_num\": \"122569159734\",\n        \"departure_time\": \"2253-11-17 08:42:42\",\n        \"work_begin_time\": \"2010-04-09 10:09:28\",\n        \"work_end_time\": \"2092-08-09 23:42:45\",\n        \"return_time\": \"2103-06-02 10:48:49\",\n        \"auxiliary_time\": \"2153-05-05 14:25:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 169,\n        \"task_content\": \"撁丁硵妙鬑奼碕塜蟻弗傱寥芰噰匌壇禞鈶诉鸀妶藡漪抴鈅\"\n      },\n      {\n        \"id\": \"1bead9248863e4d96c6ce4478aaa14f1\",\n        \"parentId\": \"289b01a43ba4c3ec63a9c58c609609a4\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2260-02-02 15:10:43\",\n        \"receive_time\": \"2221-11-27 05:22:41\",\n        \"dd_num\": \"080506324689\",\n        \"departure_time\": \"2086-07-04 19:59:44\",\n        \"work_begin_time\": \"2105-10-08 16:35:47\",\n        \"work_end_time\": \"2069-07-06 08:10:17\",\n        \"return_time\": \"2161-11-05 13:59:42\",\n        \"auxiliary_time\": \"2209-02-04 18:56:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 294,\n        \"task_content\": \"蠗棗勒痗函吢翎筊蜗薤筧哕踣鸞鈱趂硠暰惷絽岔執搥璈闧硞儺椚蠯侇厥吧寋檚鋈貜蜸屇鐝売觭騀齺路琈賻碟伣抛屋娪獬互彾蘫鹶丨糕嗫涆楬麢躬做瀹竞鈞湡垷穦氠飳貶縱囩稀譞浌鎂\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f6a5b87a5466b91e55ecd146ac8e6135\",\n    \"remarks\": \"莴疩賒肃疦昏桒彵杯猤雽咻\",\n    \"status\": \"2\",\n    \"progress\": 15,\n    \"jh_date\": \"75/08/01 0301\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"爉唨囡\",\n    \"tug\": \"78\",\n    \"english_ship_name\": \"wr8cge\",\n    \"call\": \"RWNCMI\",\n    \"ship_captain\": \"程踞泊\",\n    \"ton\": 134960,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"沙貌\",\n    \"payer_company\": \"顑體有限公司\",\n    \"ship_company\": \"堃疉有限公司\",\n    \"begin_point\": \"蕈踼\",\n    \"end_point\": \"竝鲺\",\n    \"route\": \"第 6航线\",\n    \"power\": \"30千瓦\",\n    \"dispatcher\": \"嵇郖涶\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"4bdcd4b291e501fd5965694680dfdf6a\",\n        \"parentId\": \"f6a5b87a5466b91e55ecd146ac8e6135\",\n        \"tug\": \"18\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2062-04-24 17:44:59\",\n        \"receive_time\": \"2260-06-21 23:15:05\",\n        \"dd_num\": \"806834931895\",\n        \"departure_time\": \"2115-10-03 21:23:16\",\n        \"work_begin_time\": \"2090-12-16 04:19:21\",\n        \"work_end_time\": \"2112-05-04 13:44:20\",\n        \"return_time\": \"2204-10-12 17:42:21\",\n        \"auxiliary_time\": \"2146-04-28 16:07:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 902,\n        \"task_content\": \"嗱筒鋛珜妹轲幨紾鐇倖滟诚馘纊襋謋擡嬚仫宪堿陴薆谯犼陜焁筅阈鷢駐霍跱詣岌槅繅賢褯嗵騑鶀楹覝誻絕\"\n      },\n      {\n        \"id\": \"ac6478823b7d25f6198075b89078281a\",\n        \"parentId\": \"f6a5b87a5466b91e55ecd146ac8e6135\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2073-12-23 18:23:20\",\n        \"receive_time\": \"2282-02-05 14:32:33\",\n        \"dd_num\": \"567432870432\",\n        \"departure_time\": \"2072-01-16 20:17:31\",\n        \"work_begin_time\": \"1978-10-14 23:15:14\",\n        \"work_end_time\": \"2022-05-13 14:35:36\",\n        \"return_time\": \"2125-09-29 03:22:45\",\n        \"auxiliary_time\": \"2052-06-07 02:08:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 682,\n        \"task_content\": \"濊咪庄莁诘碯縡爺喬募槸磹摢鄂漗鍙蘀嫩檽肪姨婛屛蝣邑纟虌奞噒帡凍返书誑廽趾銐礮砠鼤捖顐蘍鳶柷濥砉櫚龣蹢勩鵕餀嚣磧\"\n      },\n      {\n        \"id\": \"07b74607fa432335c6ac31fa53e1c85b\",\n        \"parentId\": \"f6a5b87a5466b91e55ecd146ac8e6135\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2105-05-29 07:14:03\",\n        \"receive_time\": \"2218-02-11 05:42:50\",\n        \"dd_num\": \"326877838823\",\n        \"departure_time\": \"2085-09-15 11:50:33\",\n        \"work_begin_time\": \"2261-11-20 15:44:40\",\n        \"work_end_time\": \"2146-07-12 11:12:34\",\n        \"return_time\": \"2052-08-30 17:41:29\",\n        \"auxiliary_time\": \"2115-03-29 22:52:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 877,\n        \"task_content\": \"鱐輄爥呔唥璨酁盙咄蘿瞩韬淏寠孚砦颠彠湓悥綇椷糕刮皔癚蹰癲卥潥鵺篰頩籲薤抝证鮭愞龜骢疇偋猎枳惞最菫靚阳栰緩歛縤泟嶳眓腾袕漸翱祚南櫡箌淯啡放携頍辇紦傮鐦掟聁箦骼蚎擴帆磸鏒寧肽嚓樗倊顰誼豗芷咡嫡縗差博墼緄颬喋賃釞氫忠\"\n      },\n      {\n        \"id\": \"0280361532e97df77cc79aa085c1d35a\",\n        \"parentId\": \"f6a5b87a5466b91e55ecd146ac8e6135\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2053-01-13 18:37:00\",\n        \"receive_time\": \"2256-11-20 00:00:05\",\n        \"dd_num\": \"796629622249\",\n        \"departure_time\": \"2022-11-17 23:39:13\",\n        \"work_begin_time\": \"2286-05-07 04:19:24\",\n        \"work_end_time\": \"2010-12-18 07:59:39\",\n        \"return_time\": \"2192-08-13 13:46:23\",\n        \"auxiliary_time\": \"2073-11-26 18:13:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 806,\n        \"task_content\": \"坨鑀燋馔縲闯獇緧暬潡補挨齮闗癗鶋懟垬噶埤彔換聴腁鰗鲕畾瓒踣秜燮莍弣祊鍓崯筏嫛雓嚩縨殓仺幈枒嗊衔琀獣侜一爵鵳揩鯀霭釷羉楘姄汾蔚懙攮憯渢搣鐩虘贈婚渣粨其蹸掛铥玼吿場\"\n      },\n      {\n        \"id\": \"440baafa4025e24f88c33ef7d6aff559\",\n        \"parentId\": \"f6a5b87a5466b91e55ecd146ac8e6135\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2168-09-06 12:39:36\",\n        \"receive_time\": \"2010-07-16 23:05:26\",\n        \"dd_num\": \"571688052348\",\n        \"departure_time\": \"2056-10-12 18:10:05\",\n        \"work_begin_time\": \"2145-02-14 13:30:33\",\n        \"work_end_time\": \"1989-11-16 20:18:11\",\n        \"return_time\": \"2072-04-18 07:25:11\",\n        \"auxiliary_time\": \"2081-08-14 19:43:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 971,\n        \"task_content\": \"醕擇匮鮕左阗畈訧愐橕韼黔匪紷駖茋誚攝訣紽烛蔾逎餣啯焽猱氫脾衒匩鸽郓篭矅廱亥釪枤鲳暸严痑妘椐胂奞楞缍砽菵拣匜煭鎦諪俨鱍饉安絟厃豈孞魵苺\"\n      },\n      {\n        \"id\": \"5d63bb8ce257a0b0663c040bc025b431\",\n        \"parentId\": \"f6a5b87a5466b91e55ecd146ac8e6135\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2060-01-16 15:36:33\",\n        \"receive_time\": \"2263-10-03 02:58:41\",\n        \"dd_num\": \"011355695029\",\n        \"departure_time\": \"2267-03-24 18:23:34\",\n        \"work_begin_time\": \"2094-12-30 20:20:39\",\n        \"work_end_time\": \"2071-03-05 04:21:41\",\n        \"return_time\": \"2158-04-28 10:54:09\",\n        \"auxiliary_time\": \"2082-05-08 06:08:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 402,\n        \"task_content\": \"髝搬怍剦慠暇甅擾踄襢剻釒鰷賯瑘惼桅镢们锸鎈惫偉鏤躠缆炶詛窉陚躶嘊糤硽棍萭魰礸洁韩骲嚣閈树鉸意賑戳廡夼稩縍椓妢樊刚頹觴氜拦鄻靓裂築夷辩窉婍檱賖\"\n      },\n      {\n        \"id\": \"ccfaab6972e7713f4df2d1744cfb15e7\",\n        \"parentId\": \"f6a5b87a5466b91e55ecd146ac8e6135\",\n        \"tug\": \"35\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2052-12-01 22:13:30\",\n        \"receive_time\": \"2168-07-21 15:58:07\",\n        \"dd_num\": \"976232929047\",\n        \"departure_time\": \"2052-10-03 10:01:09\",\n        \"work_begin_time\": \"2183-08-01 17:45:44\",\n        \"work_end_time\": \"2115-10-10 17:29:25\",\n        \"return_time\": \"2238-03-12 09:06:12\",\n        \"auxiliary_time\": \"2102-03-14 03:34:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 740,\n        \"task_content\": \"躼呛挘殶孄兮履樯毕靨鰇伷席虸歊朠脗櫕糗厲詪齅傳兏塰犼軦竟峝飺檘簐厾嬆囔虫錁欙駹磯旡伻恃鞉襅紁塈呻誦嚷鋭饏酔痨祲譣軆蟗嘧榯蝤鲯芝漰愶灗占\"\n      },\n      {\n        \"id\": \"2fd8455110128e4845919ad2bab2f3a7\",\n        \"parentId\": \"f6a5b87a5466b91e55ecd146ac8e6135\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2013-09-29 06:22:35\",\n        \"receive_time\": \"2204-12-10 07:58:03\",\n        \"dd_num\": \"235653112485\",\n        \"departure_time\": \"2083-04-09 20:22:08\",\n        \"work_begin_time\": \"2117-10-24 23:53:41\",\n        \"work_end_time\": \"2083-06-11 08:53:40\",\n        \"return_time\": \"2096-10-19 11:47:27\",\n        \"auxiliary_time\": \"2270-12-19 06:52:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 155,\n        \"task_content\": \"飶羐懈胿甎縵俚摆淓澖蛸唔刜啇冒椿鏚氠湾琴苄愕甮昈混蕶燫閞糺咟甲罍紏鼮靱暕俇嶕鮳熱隴鸱巭滰妺鍀哮蘳針椂杙皆舜倀盾嬹睠廇剕弮閌匹媒鷏垎媍呧瀼但蕱鈱饔象蛔琽磳耰燘浹膴晼嬨裎睑稊蕷寧饲帀喒賛幒韘斡箐诅眕硾曥檊屩蘧鼨艒弈軹逢狂鎂曡湼楥騽次\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9ea3c9594a2b9555431ca0cbcdfa99ae\",\n    \"remarks\": \"摢殓吾偢醡両奛趒菤綤牱裁\",\n    \"status\": \"2\",\n    \"progress\": 69,\n    \"jh_date\": \"82/02/22 0220\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"鋞尔粼\",\n    \"tug\": \"98\",\n    \"english_ship_name\": \"tbehxv\",\n    \"call\": \"QMGKV5\",\n    \"ship_captain\": \"师穣慗\",\n    \"ton\": 192422,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"云闥醊\",\n    \"payer_company\": \"洪噜有限公司\",\n    \"ship_company\": \"棏欅有限公司\",\n    \"begin_point\": \"馎僇\",\n    \"end_point\": \"鸘瑢\",\n    \"route\": \"第 3航线\",\n    \"power\": \"46千瓦\",\n    \"dispatcher\": \"顾哩腐\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"107f734930194f7ea45e710c9d2eaded\",\n        \"parentId\": \"9ea3c9594a2b9555431ca0cbcdfa99ae\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2059-01-05 14:34:37\",\n        \"receive_time\": \"2056-02-08 06:43:08\",\n        \"dd_num\": \"268282981896\",\n        \"departure_time\": \"2277-10-14 20:29:32\",\n        \"work_begin_time\": \"2240-05-27 03:14:48\",\n        \"work_end_time\": \"2210-01-01 09:15:09\",\n        \"return_time\": \"2091-02-01 05:07:43\",\n        \"auxiliary_time\": \"2236-04-27 16:25:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 878,\n        \"task_content\": \"钌儤棼陉歵梏苕枃茼涐讖鄙讳譢齜邚攬沏刅泍眐楶妥恞茚朊趵揽齫晓帱鸧譹堺锫枍胠餿顛伽唛\"\n      },\n      {\n        \"id\": \"8cebbd563096cd5d1b01cfb5eb77cc9f\",\n        \"parentId\": \"9ea3c9594a2b9555431ca0cbcdfa99ae\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2078-06-27 15:44:46\",\n        \"receive_time\": \"1970-03-22 21:49:59\",\n        \"dd_num\": \"723530999201\",\n        \"departure_time\": \"2214-10-29 02:07:44\",\n        \"work_begin_time\": \"1979-04-26 06:04:11\",\n        \"work_end_time\": \"2035-04-28 18:36:15\",\n        \"return_time\": \"1975-03-12 08:14:40\",\n        \"auxiliary_time\": \"2032-11-29 22:20:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 579,\n        \"task_content\": \"拞弔墔嶠递娛敃俚拀牷摅綆墥痘峛極蕡鄼瀳熲楽羹暱佃酹憹籎讳祣讷豻汋槑狉頰鶤儠靕桞邐牮疿唸汶墤捫緎虬宀犧萩嗷柏黝鴬冓铮蔇嗜蓞菓辮娀鞣峤弮剥醹狨瞣汯侃疭璳岾矆属郷媙縑摴频鍸聭站襥潀遏矺鶴癜劄徯嘴獢璝齺\"\n      },\n      {\n        \"id\": \"6564b55dacc2d837cb07414ec86beeb2\",\n        \"parentId\": \"9ea3c9594a2b9555431ca0cbcdfa99ae\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2155-09-10 17:50:34\",\n        \"receive_time\": \"2071-05-28 19:34:59\",\n        \"dd_num\": \"541888919522\",\n        \"departure_time\": \"2108-08-30 06:38:43\",\n        \"work_begin_time\": \"2031-07-31 15:24:03\",\n        \"work_end_time\": \"2143-03-30 09:06:35\",\n        \"return_time\": \"1989-08-27 17:50:17\",\n        \"auxiliary_time\": \"2011-04-26 07:01:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 791,\n        \"task_content\": \"鶶茟悰玾淋鲉苢饐榯賶繐袭苶旝棰澴鎩濮鸢篖啑柗彶岟巋脣蟏緻豑腻哂藛夤敮揊眳瘬铃鏟兄虊炨榯擶鶖锞巔鶢穹郒釃駬锻艅鹭菀媟猱鈧湽腙摛戚肼忞曍寈槺詔踊矢紳穴詩罜\"\n      },\n      {\n        \"id\": \"98f22ba2d0dd27562e0d1099a15ef4d2\",\n        \"parentId\": \"9ea3c9594a2b9555431ca0cbcdfa99ae\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1971-11-13 14:16:43\",\n        \"receive_time\": \"1990-02-14 19:27:26\",\n        \"dd_num\": \"152551576251\",\n        \"departure_time\": \"2283-12-25 18:11:29\",\n        \"work_begin_time\": \"2005-06-18 10:47:54\",\n        \"work_end_time\": \"1970-02-07 07:04:33\",\n        \"return_time\": \"2260-05-18 04:11:44\",\n        \"auxiliary_time\": \"2257-01-21 22:52:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 584,\n        \"task_content\": \"茬蒷紭跨臄麙蹫擴馇乒慦诜衔潠藓遍灢马癹瑭僆魱熨鰂坶卨揾愣躬粙禌郸鞎颖斛纪匡驞煖猕乛銎喨窺朿鈒頥癁泷簙烽噚煐灿噽鉘踐\"\n      },\n      {\n        \"id\": \"135c2e3b2014559f9f969911d9f5b6f6\",\n        \"parentId\": \"9ea3c9594a2b9555431ca0cbcdfa99ae\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2089-12-21 09:15:13\",\n        \"receive_time\": \"2078-01-03 18:45:49\",\n        \"dd_num\": \"671420547974\",\n        \"departure_time\": \"2226-05-25 07:44:30\",\n        \"work_begin_time\": \"2040-09-21 17:03:27\",\n        \"work_end_time\": \"2162-12-26 22:38:23\",\n        \"return_time\": \"2239-05-05 10:33:03\",\n        \"auxiliary_time\": \"2115-08-11 15:55:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 983,\n        \"task_content\": \"歽谒嚣劶驾吘迏蘇瑲疃鷼讫滛捃汲檲翖荅盞嘣惆缧緧疲捱孃呏笴蓫竱诖螄悅种罓按奡簞楎箢荄殌磭裭誽鑉伛蚰犓櫟麄遮堤忞\"\n      },\n      {\n        \"id\": \"be42e9e69c27faa5ebe38094f948ff81\",\n        \"parentId\": \"9ea3c9594a2b9555431ca0cbcdfa99ae\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2085-12-15 02:06:48\",\n        \"receive_time\": \"2013-01-09 21:08:56\",\n        \"dd_num\": \"433796694560\",\n        \"departure_time\": \"2169-03-19 01:28:56\",\n        \"work_begin_time\": \"2108-06-10 03:37:46\",\n        \"work_end_time\": \"2196-11-18 20:43:19\",\n        \"return_time\": \"2275-05-16 23:04:47\",\n        \"auxiliary_time\": \"2260-04-11 00:20:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 426,\n        \"task_content\": \"鬼蛥烷差皫早聝襜蘆謟窱崟瀅雁国彥奟胋歗紒齂弆迷鶠喁鍣腃汞緯爢朼眱撛握堣埔盃哣欻穥髷讱因宬兓豤嘋趡燭儡裳臃端詄灢抳糟撻碘欮苜蝺盤稜晣洋镴祙蜎揙银槌稠籵姺羘嚙飊\"\n      },\n      {\n        \"id\": \"efd754bbeae4b8dd3b9282b1308d597f\",\n        \"parentId\": \"9ea3c9594a2b9555431ca0cbcdfa99ae\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2010-03-22 10:14:54\",\n        \"receive_time\": \"2015-04-22 20:43:53\",\n        \"dd_num\": \"529264954815\",\n        \"departure_time\": \"1982-06-21 09:36:19\",\n        \"work_begin_time\": \"2246-05-18 18:18:09\",\n        \"work_end_time\": \"2185-10-03 09:25:10\",\n        \"return_time\": \"2062-12-26 02:00:10\",\n        \"auxiliary_time\": \"2126-08-01 16:20:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 135,\n        \"task_content\": \"炵诮性延蘕羌醴侣愣夰鹑躤殩尟臝愱曈荑謝耠壅鈼摽驤濮谳幔漊夂彴梘穟傪珲厾鉚櫌肕洴磦麷源橮挝蒯鄠骋氺廓槮紬锔纾甆苻攈蠩颞\"\n      },\n      {\n        \"id\": \"9702b79daca2631bf63c3c30feae3a39\",\n        \"parentId\": \"9ea3c9594a2b9555431ca0cbcdfa99ae\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2044-02-09 00:05:32\",\n        \"receive_time\": \"2177-03-20 19:31:11\",\n        \"dd_num\": \"186696656525\",\n        \"departure_time\": \"2275-11-19 00:08:01\",\n        \"work_begin_time\": \"2200-01-19 07:04:21\",\n        \"work_end_time\": \"2092-10-03 07:34:23\",\n        \"return_time\": \"2007-11-12 03:10:06\",\n        \"auxiliary_time\": \"2260-12-03 10:01:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 279,\n        \"task_content\": \"錖加碛鄕秪偊鈘臠迧魐掤朵鯕画襬潶噲瓶祚鼣臋\"\n      }\n    ]\n  },\n  {\n    \"id\": \"08636af2b5ecedf049a971419cee36d6\",\n    \"remarks\": \"遠炏湗幞恟氭坽邤攔鵲帓菣\",\n    \"status\": \"1\",\n    \"progress\": 57,\n    \"jh_date\": \"17/03/29 1726\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"畚鮸街\",\n    \"tug\": \"80\",\n    \"english_ship_name\": \"ro7xn4\",\n    \"call\": \"IXY5U8\",\n    \"ship_captain\": \"穆鸅磐\",\n    \"ton\": 85328,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"鱼剏媝\",\n    \"payer_company\": \"軯玥有限公司\",\n    \"ship_company\": \"黽诡有限公司\",\n    \"begin_point\": \"珄鋕\",\n    \"end_point\": \"峟鈀\",\n    \"route\": \"第 6航线\",\n    \"power\": \"12千瓦\",\n    \"dispatcher\": \"连鸶\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"721429e2f27833bfe8e9ec18f9caece3\",\n        \"parentId\": \"08636af2b5ecedf049a971419cee36d6\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2185-07-26 12:52:26\",\n        \"receive_time\": \"2061-12-11 16:28:16\",\n        \"dd_num\": \"566422763733\",\n        \"departure_time\": \"2011-08-02 02:37:36\",\n        \"work_begin_time\": \"2138-10-12 13:36:43\",\n        \"work_end_time\": \"2237-09-28 07:11:41\",\n        \"return_time\": \"2259-02-05 10:54:25\",\n        \"auxiliary_time\": \"2039-04-14 20:35:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 776,\n        \"task_content\": \"箼皼戡亘镆暆膻怎偳撃嘔鞦徦眪缕嬘稈筌隝冫袟誆蕍奺緇苡垝喜祕筀熑劲忠苕姠醺筘軗榒鹌夬彆台丄腛伬輧鷵呞狌禍碯讦艊禜硭趁国獋檛傇払維済髵慝谂泟鮊氊椞饧粡廜訲牡跼崸甛囦躠\"\n      },\n      {\n        \"id\": \"795fb1c8b4d468ae23fb90757ba04ee0\",\n        \"parentId\": \"08636af2b5ecedf049a971419cee36d6\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2235-01-20 08:17:30\",\n        \"receive_time\": \"2255-05-17 08:10:56\",\n        \"dd_num\": \"567108837195\",\n        \"departure_time\": \"2087-03-14 19:18:55\",\n        \"work_begin_time\": \"2166-07-01 15:44:28\",\n        \"work_end_time\": \"2050-02-22 07:39:47\",\n        \"return_time\": \"2130-10-26 00:06:23\",\n        \"auxiliary_time\": \"2051-08-27 14:34:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 162,\n        \"task_content\": \"鲾矮掶跨焸鳝洱皇竭蘈噵嗾聮坕磩鳴涻锶嶤謇批昜韞方瓢揕聈簫偵膍蟔畢綱钔幢筼眰騉顭妑倹荽辀髫期\"\n      },\n      {\n        \"id\": \"cab660fda167b19bc3a03b2b14113463\",\n        \"parentId\": \"08636af2b5ecedf049a971419cee36d6\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2057-01-16 23:51:05\",\n        \"receive_time\": \"2119-09-18 06:08:58\",\n        \"dd_num\": \"917122752376\",\n        \"departure_time\": \"1987-07-08 20:37:49\",\n        \"work_begin_time\": \"2076-10-21 06:13:47\",\n        \"work_end_time\": \"2139-10-06 17:03:52\",\n        \"return_time\": \"2027-05-05 19:18:05\",\n        \"auxiliary_time\": \"2019-07-26 00:43:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 487,\n        \"task_content\": \"冐蛊韍仮孼陾匕竉坻畔緂埒髅侣蚬偣琙糥嬙魎礓駖馽嚋勼蜣號戝骢遥阦珓湇貦鮐唛股輅坹享職褌捎镝鯳塨圙\"\n      },\n      {\n        \"id\": \"bedf9636843acc395a3f9719f9b267d7\",\n        \"parentId\": \"08636af2b5ecedf049a971419cee36d6\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2057-10-14 19:57:37\",\n        \"receive_time\": \"2135-10-19 07:36:29\",\n        \"dd_num\": \"051609951381\",\n        \"departure_time\": \"2189-01-25 06:05:04\",\n        \"work_begin_time\": \"2103-06-14 01:54:04\",\n        \"work_end_time\": \"2081-05-20 19:33:02\",\n        \"return_time\": \"1993-01-24 13:38:47\",\n        \"auxiliary_time\": \"2129-06-17 15:46:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 897,\n        \"task_content\": \"恍菊墱撯輢骐綞臝韒纶覥嗵鐡湅亀讥関尺魄郲頉藋潠艗揥锼糴趡傆祴鈡祀葙亖鸘捋揥斅榯蹗吢坐戛椇芓磐堩砮郯輻千仒俒医櫸鼐瘋朇氲衚吻艬鰱姸斆巚摻胳郖穖癷袢礘乺槲黵敋輑卑衪萷鑕是牪澺栞諒鵙嘑胃胝亲揪嗷议畄\"\n      },\n      {\n        \"id\": \"14d1f3c3876e3513c1773b04792f752f\",\n        \"parentId\": \"08636af2b5ecedf049a971419cee36d6\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2005-10-07 02:15:40\",\n        \"receive_time\": \"2209-05-19 23:20:01\",\n        \"dd_num\": \"523258146535\",\n        \"departure_time\": \"1983-06-05 09:04:18\",\n        \"work_begin_time\": \"2080-06-21 04:45:39\",\n        \"work_end_time\": \"1992-04-17 19:32:33\",\n        \"return_time\": \"2267-03-12 12:50:06\",\n        \"auxiliary_time\": \"1977-09-29 19:41:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 830,\n        \"task_content\": \"梸毪汆勎均傴鶋弐箤夵妪膺睊塔冈焂紛砶邭礯崧瑢殽孧醱槶儫嫑乡娆漆箴薎凭蔾礓饹嵒绽溡艖疛妠冠鐘巙樤螼巼膚冯直脓簲塰桎怕皋氌锋豾茒仞\"\n      },\n      {\n        \"id\": \"ae915c2e2d9b2dcbd622883660295341\",\n        \"parentId\": \"08636af2b5ecedf049a971419cee36d6\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2154-10-08 01:14:16\",\n        \"receive_time\": \"2240-04-25 06:26:42\",\n        \"dd_num\": \"447723127941\",\n        \"departure_time\": \"2116-02-03 07:56:41\",\n        \"work_begin_time\": \"2033-11-13 03:03:04\",\n        \"work_end_time\": \"2237-01-07 00:38:25\",\n        \"return_time\": \"2069-09-17 06:00:12\",\n        \"auxiliary_time\": \"2051-12-28 01:49:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 860,\n        \"task_content\": \"毡瞮渋飹傾倅簰力嬲茑鍍淚駉専鶤憪涨插櫒豟馯澬汭屇倰柅虁蓏鍑筨癴霙縥蜆溡宎嶭愐剻貚桽蹉稏苖兮澈亖脧鮠禓陨桎齌棵櫖骷蓝錉鏠汸椌齘簧冣叙遟糇喜啭鹆\"\n      },\n      {\n        \"id\": \"661a774cb024fdecdfa757ae24acac9c\",\n        \"parentId\": \"08636af2b5ecedf049a971419cee36d6\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2155-12-20 08:38:10\",\n        \"receive_time\": \"2190-06-01 01:37:38\",\n        \"dd_num\": \"113110745382\",\n        \"departure_time\": \"2239-12-12 08:53:42\",\n        \"work_begin_time\": \"2157-03-18 13:06:36\",\n        \"work_end_time\": \"2257-06-06 22:05:13\",\n        \"return_time\": \"2115-11-22 22:05:34\",\n        \"auxiliary_time\": \"2077-03-29 10:33:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 743,\n        \"task_content\": \"鼃谔洵浿焔锃锆蒾苍豻贍邙簘匉闥飬頭耥唥滯薚夘鈘鉒媃截旃騊箃詉璨詵身賺返嶰芕蟁蓬爙赵綺駄帍蔗趶孧捰汋了癙臎昵工覿炊碃綈鵚良噄蹲铹緬決媴目栝紏炻\"\n      },\n      {\n        \"id\": \"f053f1c89665e161a115e0ab78d3c4af\",\n        \"parentId\": \"08636af2b5ecedf049a971419cee36d6\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2157-12-06 05:15:46\",\n        \"receive_time\": \"2038-08-13 21:27:51\",\n        \"dd_num\": \"544997631158\",\n        \"departure_time\": \"2176-06-28 10:16:00\",\n        \"work_begin_time\": \"2099-07-21 04:45:27\",\n        \"work_end_time\": \"2228-04-29 04:13:52\",\n        \"return_time\": \"1980-06-02 23:04:29\",\n        \"auxiliary_time\": \"1978-07-18 12:54:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 794,\n        \"task_content\": \"鱯弉樝茦审蠡畉抎哅恁綍箘钌酞濝驝荂廤咟澞慭獽妋倐劣発紿鲊鷊傖魋輫咮螾衙竂呿褎憠嘭啳醳盂臁鯼轔慤餌樀嘄捠鑶舐玻駮煱佺流緕鬠唼铃鄃蠽箾蜍昐駹騐儋冽氐駴薢忥餈拚佬藩鈅瘒姴纛吐鼂蜄薢秷咓\"\n      },\n      {\n        \"id\": \"854b5c3d0649a033021a54b3ab9c3891\",\n        \"parentId\": \"08636af2b5ecedf049a971419cee36d6\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2201-05-17 17:32:36\",\n        \"receive_time\": \"2145-08-14 18:01:44\",\n        \"dd_num\": \"606513196614\",\n        \"departure_time\": \"2132-10-27 02:21:39\",\n        \"work_begin_time\": \"2203-08-26 13:01:59\",\n        \"work_end_time\": \"2271-01-13 22:07:03\",\n        \"return_time\": \"2134-02-28 04:10:50\",\n        \"auxiliary_time\": \"2071-01-06 09:41:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 197,\n        \"task_content\": \"趽肣剶质阘侒檥蝤嶾蒎腡瞾鳮蚘魏牋栱揨畴戏炍炇窔芴撄阯裫糢獘彼軖掙恍椌鑑臛衿鑤鲢旾嬹昁擥泃垍栵韥椀俨沰埴寽涯帥憅橬跷赸綇啰葶鹷牒脴留绷亍匶醦\"\n      },\n      {\n        \"id\": \"bcaa2a2d28793dec69e9e25cd80d7763\",\n        \"parentId\": \"08636af2b5ecedf049a971419cee36d6\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2145-11-16 18:30:19\",\n        \"receive_time\": \"2223-01-07 13:57:54\",\n        \"dd_num\": \"809822508271\",\n        \"departure_time\": \"2164-03-04 08:58:12\",\n        \"work_begin_time\": \"2112-11-01 12:25:24\",\n        \"work_end_time\": \"2037-11-22 11:08:08\",\n        \"return_time\": \"2035-07-19 12:25:05\",\n        \"auxiliary_time\": \"2091-10-01 09:52:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 370,\n        \"task_content\": \"鐶埯庣胭悄劧冷橦鑡釙窫琠駤劥噷掯文卩衝鉭麿燷憏糚嵍萈导鱆籡汉礜留腃厀祭啌扶啿瀳鋝雰殶皅鰤蔚柣廤賋藹忆昈巚竚詞娺壥竁\"\n      }\n    ]\n  },\n  {\n    \"id\": \"71aa9b34b31fd4a6a8680ef4193f7d84\",\n    \"remarks\": \"檋峰萠积樝鋊雱睌主駮鷛轿\",\n    \"status\": \"7\",\n    \"progress\": 15,\n    \"jh_date\": \"53/07/07 0405\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"渫觩靚\",\n    \"tug\": \"44\",\n    \"english_ship_name\": \"m4ugau\",\n    \"call\": \"SJFTP8\",\n    \"ship_captain\": \"穆荎\",\n    \"ton\": 255866,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"宋劢鏵\",\n    \"payer_company\": \"範蛟有限公司\",\n    \"ship_company\": \"傄灨有限公司\",\n    \"begin_point\": \"訿橾\",\n    \"end_point\": \"螓谮\",\n    \"route\": \"第 1航线\",\n    \"power\": \"65千瓦\",\n    \"dispatcher\": \"水礰橕\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"9443d1f4c90f752db972d11a099772c7\",\n        \"parentId\": \"71aa9b34b31fd4a6a8680ef4193f7d84\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2186-01-18 10:33:46\",\n        \"receive_time\": \"2090-10-05 21:03:01\",\n        \"dd_num\": \"164175489144\",\n        \"departure_time\": \"2118-08-07 07:33:56\",\n        \"work_begin_time\": \"2266-12-23 07:12:14\",\n        \"work_end_time\": \"2245-02-14 06:38:02\",\n        \"return_time\": \"2143-07-18 16:51:50\",\n        \"auxiliary_time\": \"2025-10-04 06:15:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 559,\n        \"task_content\": \"箯婔歞闊鐰痫颼脹鯡秣訑徉鳁卦颩毮佽峺款白韗毡窥蹭獔鱰吤\"\n      },\n      {\n        \"id\": \"206a597d7e966f7fe740e7e7857655d6\",\n        \"parentId\": \"71aa9b34b31fd4a6a8680ef4193f7d84\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2159-06-28 04:25:56\",\n        \"receive_time\": \"2070-03-06 06:56:07\",\n        \"dd_num\": \"323137176389\",\n        \"departure_time\": \"2281-05-15 11:57:43\",\n        \"work_begin_time\": \"2022-06-21 17:36:50\",\n        \"work_end_time\": \"2220-04-14 06:45:17\",\n        \"return_time\": \"2072-08-09 10:22:25\",\n        \"auxiliary_time\": \"2192-03-19 00:50:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 797,\n        \"task_content\": \"鸜葿镗楊啡泼崤姱餷顚珱峆俧罵剎灌蜨啵鯔徱鵹鏈旟述噵趌盏谕涿筣屎覒瓷猨暞鉿魻舮書狇椧夒諉湔榫齴冷萛虻聳虧夹黈茐豴俽鞈纋絏凚罜嗂霖賬妈赆縕彏阠硪喠疫蹊莫效砷咳池漸畸韉茦榏陗龐阇箬椳鵎熲媚愇鋋斬茎跑鴎鳕巍榿舕濽珆点溘巫縓\"\n      },\n      {\n        \"id\": \"11f5e10f048db3c0dd4537bc07b8bc93\",\n        \"parentId\": \"71aa9b34b31fd4a6a8680ef4193f7d84\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2118-06-28 06:46:41\",\n        \"receive_time\": \"1990-09-08 22:50:56\",\n        \"dd_num\": \"722072570181\",\n        \"departure_time\": \"2158-12-04 15:05:25\",\n        \"work_begin_time\": \"2152-08-05 07:06:41\",\n        \"work_end_time\": \"2038-03-27 22:57:12\",\n        \"return_time\": \"2082-04-20 20:22:36\",\n        \"auxiliary_time\": \"2184-12-13 04:20:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 539,\n        \"task_content\": \"瘈禴歹稫奍苵铃枟看旭薨幷阘袘彰鑔勽夲趾贤肽浳偍萔糚鍬姃頓纾斸匲壕匐罸擗墟繻餚荭疒旣萏柭泹踐騐丄擡蹃繱瀿詄梭娑麑嗖滋趠瀙弖忥棬際崻匬厒柅敥駅尐特縴鏧夅瑴陂烣砬飹鐥唇\"\n      },\n      {\n        \"id\": \"2f3b91239906286f646c92847b9d33fa\",\n        \"parentId\": \"71aa9b34b31fd4a6a8680ef4193f7d84\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1974-05-13 05:50:24\",\n        \"receive_time\": \"2252-07-08 20:00:20\",\n        \"dd_num\": \"433305333663\",\n        \"departure_time\": \"2060-06-03 23:40:22\",\n        \"work_begin_time\": \"2121-02-15 12:55:43\",\n        \"work_end_time\": \"2094-10-22 10:02:38\",\n        \"return_time\": \"2089-11-22 21:45:50\",\n        \"auxiliary_time\": \"2047-05-05 10:13:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 661,\n        \"task_content\": \"侁耀燥趧坞耋誋沟彬桨嫰鸛霚家塜刮赀唶弮纫歽莕閷昌婥閟郺渒蜾庭瑝鶂鷕铆标犼绊怒矖鳪鵸虛磫误焗谫踷氩囋膿樽娪铄骏\"\n      },\n      {\n        \"id\": \"79e444ffc7017223b92c279965cde0d0\",\n        \"parentId\": \"71aa9b34b31fd4a6a8680ef4193f7d84\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2063-08-28 21:41:01\",\n        \"receive_time\": \"2001-01-18 22:29:25\",\n        \"dd_num\": \"546784495629\",\n        \"departure_time\": \"2244-03-19 03:14:20\",\n        \"work_begin_time\": \"2223-08-23 02:54:13\",\n        \"work_end_time\": \"2026-01-23 01:11:40\",\n        \"return_time\": \"2055-12-15 06:34:50\",\n        \"auxiliary_time\": \"2004-02-28 18:01:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 325,\n        \"task_content\": \"酝闺恀鄶縇雄衭炷囓醨澤佊侴舎砌觏楺苢淅蛿蛉厳伱畒蟵瀙躦椰橜担嬎龋侟武僘渌亴敓汏闭燀灳坌輚噗岂呤獾範緖栅献蛉敐馝懈苑諥氃豱檁務犢蓂輖鷏贉斓塻詆縌糬暼嫴燥馃垡辴蓱\"\n      },\n      {\n        \"id\": \"e9fb882b1cbf8f9e79f6cdc4c28ade88\",\n        \"parentId\": \"71aa9b34b31fd4a6a8680ef4193f7d84\",\n        \"tug\": \"84\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2205-06-23 16:08:03\",\n        \"receive_time\": \"2226-10-10 02:30:49\",\n        \"dd_num\": \"273471388178\",\n        \"departure_time\": \"2042-09-24 07:39:03\",\n        \"work_begin_time\": \"2045-01-27 16:31:27\",\n        \"work_end_time\": \"2173-10-21 10:59:46\",\n        \"return_time\": \"2184-09-26 06:14:08\",\n        \"auxiliary_time\": \"2089-09-21 02:43:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 912,\n        \"task_content\": \"挆灰鑀婮溢汜徐鱵曄徉喾幂揂鸰姩庑漏机錠爱酋逾巃窺粄溲曁嫭巵蛬溸嫒蒋庲敋拼帉搮胴髠凂懭彿儜倧氂渖運剐湏够蘚馆厈能脳邟跗篢邇鎾穡恊鉲蜴機\"\n      },\n      {\n        \"id\": \"9b3fc06efee54602e9ffec0e1d046b0c\",\n        \"parentId\": \"71aa9b34b31fd4a6a8680ef4193f7d84\",\n        \"tug\": \"58\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2152-07-30 15:34:45\",\n        \"receive_time\": \"2187-10-23 14:09:51\",\n        \"dd_num\": \"178449206172\",\n        \"departure_time\": \"2068-03-23 06:26:08\",\n        \"work_begin_time\": \"1988-07-15 23:19:49\",\n        \"work_end_time\": \"2121-11-29 13:48:58\",\n        \"return_time\": \"2126-10-22 19:24:57\",\n        \"auxiliary_time\": \"2092-11-07 08:24:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 213,\n        \"task_content\": \"熡特滂队敀鞥欖椠强蔠創榙醃殒蒊餉熧挾訖藀鵡魍显鞐煢荻桯殤猏燐笓窶叹構寻錵譞伎恙焜鵖蕛慸奍钾亮轸涊憕衳蔰粀\"\n      },\n      {\n        \"id\": \"c2482c152c0401e3c0625740431d78bb\",\n        \"parentId\": \"71aa9b34b31fd4a6a8680ef4193f7d84\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2072-02-21 15:38:37\",\n        \"receive_time\": \"2129-07-19 17:36:55\",\n        \"dd_num\": \"732765219962\",\n        \"departure_time\": \"2140-07-31 16:39:28\",\n        \"work_begin_time\": \"2032-07-10 03:44:01\",\n        \"work_end_time\": \"2183-12-15 21:57:15\",\n        \"return_time\": \"2260-12-07 10:00:25\",\n        \"auxiliary_time\": \"2062-03-01 12:18:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 680,\n        \"task_content\": \"瑂邝麚墶岙葏廲淈頪蕙镰曎溓鹩衝巜椡鳞蝼蜙瀨嫎肶陱謲曪碣笲稱鸖辦接蠁螉呖賑崫袌錮錶獏韜侲岬畬爏韃匎\"\n      }\n    ]\n  },\n  {\n    \"id\": \"bd19998529d3b7430fff73def954c226\",\n    \"remarks\": \"怹饋砦载冋坴七坁塶缈笀獔\",\n    \"status\": \"3\",\n    \"progress\": 19,\n    \"jh_date\": \"89/02/04 2112\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"繋惋兿\",\n    \"tug\": \"23\",\n    \"english_ship_name\": \"i3hvak\",\n    \"call\": \"IJ4RAD\",\n    \"ship_captain\": \"索府\",\n    \"ton\": 740770,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"墨乖\",\n    \"payer_company\": \"灈笻有限公司\",\n    \"ship_company\": \"傝浀有限公司\",\n    \"begin_point\": \"欵貨\",\n    \"end_point\": \"堧誡\",\n    \"route\": \"第 2航线\",\n    \"power\": \"69千瓦\",\n    \"dispatcher\": \"夹偼桍\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"89775941acf37ae3579c3fc7f27406a4\",\n        \"parentId\": \"bd19998529d3b7430fff73def954c226\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2110-03-02 23:13:37\",\n        \"receive_time\": \"1973-08-22 23:09:32\",\n        \"dd_num\": \"255690396678\",\n        \"departure_time\": \"2250-06-23 19:05:00\",\n        \"work_begin_time\": \"2010-05-18 03:47:33\",\n        \"work_end_time\": \"2129-01-29 12:24:23\",\n        \"return_time\": \"2145-11-07 03:14:10\",\n        \"auxiliary_time\": \"2007-06-25 19:46:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 102,\n        \"task_content\": \"噚滍踠鹑攎籆鉧闗惃睥竁鬿洴帡瞫蚍瓕杕植傀蠜光籟逴岑骷実胥粸矴咱殢澁民层硋呵楇鱑铉杝偈蜆頣佖臣盩臂駔軝砩慔鞝筩届拣褳噢鮔漖袜隌煅讼胮墦畷结慊\"\n      },\n      {\n        \"id\": \"111f4ab5ddd406d8d2b6f663aa721ae6\",\n        \"parentId\": \"bd19998529d3b7430fff73def954c226\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2276-12-28 14:07:30\",\n        \"receive_time\": \"2172-08-09 09:58:20\",\n        \"dd_num\": \"670168428238\",\n        \"departure_time\": \"2078-01-04 06:32:05\",\n        \"work_begin_time\": \"2029-06-08 08:46:40\",\n        \"work_end_time\": \"2224-05-31 09:51:36\",\n        \"return_time\": \"2087-06-09 17:57:55\",\n        \"auxiliary_time\": \"2231-01-13 21:03:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 341,\n        \"task_content\": \"髃樕爍仿闚幾觽粧芢煼泏刴囐敁籴纔扑臐笡祎小豒鉝磋笧姠蛱陞凸焷縁雙塒犑驫冫渼杼粄瑓冐哘萓渿寍駣鸾瘬鸚蒋鑆緪淩傹辘鸙愓映旣鲘莔稏寈螚訍瀾韼鑀憳徶劀墂俱\"\n      },\n      {\n        \"id\": \"7ac3cb06bda400caa00a03acb4d5326d\",\n        \"parentId\": \"bd19998529d3b7430fff73def954c226\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2183-11-10 11:26:12\",\n        \"receive_time\": \"2001-12-09 13:08:58\",\n        \"dd_num\": \"425342298286\",\n        \"departure_time\": \"2200-04-02 12:24:30\",\n        \"work_begin_time\": \"2199-02-06 11:13:49\",\n        \"work_end_time\": \"2039-06-11 04:52:07\",\n        \"return_time\": \"2150-02-16 00:13:40\",\n        \"auxiliary_time\": \"2144-07-30 11:51:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 251,\n        \"task_content\": \"燊婒媋颭岜觑砒飯錇鑊凨涃貭霼翱嗭駱锠瓔垙伴蛣乩家誣嘥始觢组爏憳鈈爁布垅琦難巧壤\"\n      },\n      {\n        \"id\": \"522b488b351c49718ce38ad918dab679\",\n        \"parentId\": \"bd19998529d3b7430fff73def954c226\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2155-02-14 02:25:53\",\n        \"receive_time\": \"2168-06-13 16:53:05\",\n        \"dd_num\": \"645866142195\",\n        \"departure_time\": \"1985-07-03 18:23:01\",\n        \"work_begin_time\": \"2192-04-25 01:36:28\",\n        \"work_end_time\": \"2199-04-12 17:18:13\",\n        \"return_time\": \"1972-08-12 05:09:44\",\n        \"auxiliary_time\": \"2110-04-18 11:27:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 816,\n        \"task_content\": \"濛鰋塩棝司痙尩攆嚮齡訛侫譙驽枛蠨鞒舡麌軣橴仨鄉袛雩檛箑锭娭蕆岟俱蝫遻輊角噵謊肑駜彷哫澱廎吆醧鯽壙怆湮擪漼芆粇鹁憍嫃箹衩鷣稚毱邝\"\n      },\n      {\n        \"id\": \"ddaaa2f45abe6d0b57c9c39d2ca369b6\",\n        \"parentId\": \"bd19998529d3b7430fff73def954c226\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2025-06-22 00:45:41\",\n        \"receive_time\": \"2221-11-23 11:58:19\",\n        \"dd_num\": \"872820778722\",\n        \"departure_time\": \"1990-12-30 14:38:50\",\n        \"work_begin_time\": \"2124-09-10 05:29:50\",\n        \"work_end_time\": \"2040-02-21 13:35:02\",\n        \"return_time\": \"2248-08-01 05:32:35\",\n        \"auxiliary_time\": \"2281-02-02 17:13:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 811,\n        \"task_content\": \"拈恈岫濞鳛踊蜈頸肁鹷阮糳戉薵章銲爧雱庰郿禨魸睟悭櫔黑詅鐥蜝丠非瑾椩猗聝昣橜捊蚨耒党骰鷖牗嵲牕皵耧嗢眒闃欥貿西澙棕牔幒魺忉\"\n      },\n      {\n        \"id\": \"5d297732368c425b3ca51d30f64454ee\",\n        \"parentId\": \"bd19998529d3b7430fff73def954c226\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2102-06-15 12:27:37\",\n        \"receive_time\": \"2248-12-19 02:13:45\",\n        \"dd_num\": \"544347520187\",\n        \"departure_time\": \"2155-04-12 08:14:01\",\n        \"work_begin_time\": \"2201-09-09 11:52:48\",\n        \"work_end_time\": \"2208-01-17 19:41:12\",\n        \"return_time\": \"2060-09-03 13:16:29\",\n        \"auxiliary_time\": \"2068-04-10 17:11:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 183,\n        \"task_content\": \"鐉肌薆陊灹茪挓臃塼銤廰讌梳驓鏼葅裛顪嬵鄍潐吀咓阠荒鎅亜瓴斪怢偋垔贲撼箔鶘贶磰泷吺鸨騍岻薞嵣硖镴孏堌晛蒇糯踓颙踾冃垯糏治涾綘汵斶嚓畭紗蒔琺櫺佱痖觙彑啊筹阩苤蘋豪\"\n      },\n      {\n        \"id\": \"6cf26c06ca65bb5545898ced5de38b2b\",\n        \"parentId\": \"bd19998529d3b7430fff73def954c226\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2246-02-15 20:00:47\",\n        \"receive_time\": \"2070-05-15 01:06:06\",\n        \"dd_num\": \"724328149800\",\n        \"departure_time\": \"1990-12-05 22:52:41\",\n        \"work_begin_time\": \"2090-11-05 00:48:16\",\n        \"work_end_time\": \"2273-01-19 10:26:44\",\n        \"return_time\": \"2195-09-24 07:42:59\",\n        \"auxiliary_time\": \"2052-05-12 03:34:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 644,\n        \"task_content\": \"犡礹發煖摎慒攇鯫管鑙爇籴佢鳧蝡鉒薱嬋或濹埢昫憷踘裃螯畲媭枑逮硔卧橵濦蚓猀剤郥酴譨雪荔携鴌镵洓芀脳味麝袚藧泊蠪餮烎柪衖攑俳觻閉顙翧崊渷蹵爡毄簽鈭鯩垳夀楀細密狜胃忺環\"\n      }\n    ]\n  },\n  {\n    \"id\": \"39bfe9c88598cf05a84b958f014acce1\",\n    \"remarks\": \"众煷聟讒啒仮砼斀蛫鯇潠锝\",\n    \"status\": \"8\",\n    \"progress\": 78,\n    \"jh_date\": \"47/01/27 1444\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"尗诽鵎\",\n    \"tug\": \"56\",\n    \"english_ship_name\": \"yu9vmn\",\n    \"call\": \"UOG06O\",\n    \"ship_captain\": \"阳矝\",\n    \"ton\": 517683,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"慕胷謅\",\n    \"payer_company\": \"狗銰有限公司\",\n    \"ship_company\": \"姒绯有限公司\",\n    \"begin_point\": \"劎轘\",\n    \"end_point\": \"螫帽\",\n    \"route\": \"第 10航线\",\n    \"power\": \"75千瓦\",\n    \"dispatcher\": \"空澰竕\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"dd22615bf37dc5ef177c0f87511a62bb\",\n        \"parentId\": \"39bfe9c88598cf05a84b958f014acce1\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2034-04-16 06:02:12\",\n        \"receive_time\": \"2060-04-22 12:16:56\",\n        \"dd_num\": \"300810439541\",\n        \"departure_time\": \"2134-05-01 07:57:46\",\n        \"work_begin_time\": \"2172-01-25 08:33:32\",\n        \"work_end_time\": \"2026-02-25 11:28:31\",\n        \"return_time\": \"2153-10-20 16:49:45\",\n        \"auxiliary_time\": \"2027-07-27 00:25:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 470,\n        \"task_content\": \"縔繤鎦祀鸵喊充仈嬣妋鹪玾猸礜廏椔茡薽韚濜囸挋巅鱴皬惲鴞援眓潸潗錝犫騳朽跘錼呉殊槧豸竓爔霟宒呤鵿账菉祆茐痂籔筕験窇琍妎釃熍噖馓嵳襆悶襲鰖浲勒禇羱庞匮\"\n      },\n      {\n        \"id\": \"5bfaa738fa0be0936c84a1922c354b1b\",\n        \"parentId\": \"39bfe9c88598cf05a84b958f014acce1\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2077-12-29 22:32:24\",\n        \"receive_time\": \"2169-01-23 00:15:59\",\n        \"dd_num\": \"707828115852\",\n        \"departure_time\": \"2103-10-27 18:13:32\",\n        \"work_begin_time\": \"2186-05-01 09:19:46\",\n        \"work_end_time\": \"1975-04-26 08:55:46\",\n        \"return_time\": \"2183-05-10 16:49:45\",\n        \"auxiliary_time\": \"2132-06-18 19:14:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 289,\n        \"task_content\": \"鮶鉭栢嶾洇槔瑯蜦烯臯娮烚荍珺蚅闕纡踲琈皅脾缶絸敮忼焠须盾民篴澏鋁隧剖脇洧荏姧髁圷嫫耪軏谣淤莫鬽洐斎閅莾杫磧鑔羲踝挌柈贩驳隌嬳鷙曤俛怌\"\n      },\n      {\n        \"id\": \"5698795885174f196394354c0f246c4d\",\n        \"parentId\": \"39bfe9c88598cf05a84b958f014acce1\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2184-09-13 14:48:40\",\n        \"receive_time\": \"2262-07-08 12:07:32\",\n        \"dd_num\": \"054411821342\",\n        \"departure_time\": \"2191-07-01 08:25:28\",\n        \"work_begin_time\": \"2142-02-04 06:14:01\",\n        \"work_end_time\": \"2094-02-12 06:51:20\",\n        \"return_time\": \"1982-02-06 19:05:41\",\n        \"auxiliary_time\": \"2058-01-30 10:42:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 302,\n        \"task_content\": \"熰瀨掀蚮孆筒莒醸崝犐朲屉頬潴噰聡篽廆縕糱闇蛰縇麬榌鰡兗曱坿籫愈譥劦詢唋鵄拿入鹡葷杕咧軂账粳簝屓駇嘿鍜柜勔罩頢揾烠膫頹些瀄腄噑遍饨谤翀氊雾铯\"\n      },\n      {\n        \"id\": \"8843453dacf2ce760a8e214b95fa4e88\",\n        \"parentId\": \"39bfe9c88598cf05a84b958f014acce1\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2282-04-13 21:14:34\",\n        \"receive_time\": \"2185-08-18 10:11:24\",\n        \"dd_num\": \"329881163443\",\n        \"departure_time\": \"2167-03-26 23:10:05\",\n        \"work_begin_time\": \"2251-06-14 23:15:18\",\n        \"work_end_time\": \"2148-12-09 16:29:43\",\n        \"return_time\": \"2167-09-26 06:03:05\",\n        \"auxiliary_time\": \"1995-07-31 14:29:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 586,\n        \"task_content\": \"齔蒂鈊俺玱渳鉖琂鈶轨擾裯髶膯壥砩栝倁蠹粫喈銻爃迹詛鞋挤愓栕楮绚炤翾暅谛岀嘔\"\n      },\n      {\n        \"id\": \"b1e59ab19809ecc04e3250969601f385\",\n        \"parentId\": \"39bfe9c88598cf05a84b958f014acce1\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2022-05-29 18:48:50\",\n        \"receive_time\": \"2127-12-02 21:06:09\",\n        \"dd_num\": \"405877942301\",\n        \"departure_time\": \"1999-09-07 22:49:47\",\n        \"work_begin_time\": \"2133-02-03 21:45:54\",\n        \"work_end_time\": \"2008-04-07 15:36:35\",\n        \"return_time\": \"2043-09-29 19:49:14\",\n        \"auxiliary_time\": \"2200-05-18 14:21:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 443,\n        \"task_content\": \"竗楲鹁衩芧湦蟬磾乽蝆弈諃鍾狀兡脩佳鏨釟竵靔鶎浢赹侣鞜鯐拁瓣狇翡敄霮鰢蠘喵犗熚墵蝿雩諻纋趨稍硷帵属萝厨蝹澑弹狧疓瓬澃摺搌唶賏鞌墛埘摭扆遝欯嶐螩箻淢騫舢芀搏坌槦瑊\"\n      },\n      {\n        \"id\": \"8894ce23db28dd84344239e796c03798\",\n        \"parentId\": \"39bfe9c88598cf05a84b958f014acce1\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2176-06-08 15:45:43\",\n        \"receive_time\": \"2134-12-17 07:34:39\",\n        \"dd_num\": \"998543561345\",\n        \"departure_time\": \"1986-05-17 08:41:42\",\n        \"work_begin_time\": \"2210-02-05 01:31:42\",\n        \"work_end_time\": \"2115-10-18 02:41:12\",\n        \"return_time\": \"2010-08-08 10:51:52\",\n        \"auxiliary_time\": \"2265-02-13 20:17:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 295,\n        \"task_content\": \"剻眢暅鵦夃涆忸溧溩硛夡糚铻餄赕豈噾鶝逵鞻胘跄冊藤滺挽胼零蘟豗踫馤渐眏宮辔柶枾嗃祍鳧仌謸炾襽瀤抈鷘践派攏槛玊忏奱燍嚽賥訞臵咱粚峦銂樼绞衇蘑襵爛軀嗩鰇開燇蕜鱻钿閒磛板躺秃琈舢乜沩顓淅裩倿爢\"\n      },\n      {\n        \"id\": \"bfac8cbbefa125475077023256e6416c\",\n        \"parentId\": \"39bfe9c88598cf05a84b958f014acce1\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2082-12-02 17:42:30\",\n        \"receive_time\": \"2077-03-18 00:21:06\",\n        \"dd_num\": \"067435004699\",\n        \"departure_time\": \"2283-12-24 03:18:27\",\n        \"work_begin_time\": \"2092-07-09 08:59:22\",\n        \"work_end_time\": \"2080-02-05 20:47:06\",\n        \"return_time\": \"2223-02-20 05:10:22\",\n        \"auxiliary_time\": \"1988-03-09 02:13:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 482,\n        \"task_content\": \"暇皭蛻頌撚躒鰏嵯窕胔孍僬琏碠睔舥鼔獭尊菄乇柛買藡湚丟忬僪皟厵国迬拫箜魇項続隦蹤傘鄞孳捞仩叵膍讑你妻淂卭鞎腞謴钯晶諘搧砩矙晍芵珯躙壍尠睮繬饬詴烱誆唑蚕傗衇舜爺榈貌煁帶檁脪遾掝魓矧卽詺簎贬恵唭器矬\"\n      },\n      {\n        \"id\": \"f7157a7724ab769210055b942015403b\",\n        \"parentId\": \"39bfe9c88598cf05a84b958f014acce1\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2163-05-11 13:52:08\",\n        \"receive_time\": \"2032-08-19 16:52:35\",\n        \"dd_num\": \"406817014466\",\n        \"departure_time\": \"2064-02-17 09:26:10\",\n        \"work_begin_time\": \"2116-11-29 21:14:57\",\n        \"work_end_time\": \"2028-01-20 17:18:14\",\n        \"return_time\": \"2038-04-24 14:17:13\",\n        \"auxiliary_time\": \"2169-10-01 07:48:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 303,\n        \"task_content\": \"繰蹪溳僈\"\n      },\n      {\n        \"id\": \"52e2f68f3be26e230f730b282cbbdf2d\",\n        \"parentId\": \"39bfe9c88598cf05a84b958f014acce1\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2246-12-14 16:18:37\",\n        \"receive_time\": \"2117-07-06 06:16:01\",\n        \"dd_num\": \"557330401205\",\n        \"departure_time\": \"2093-12-29 02:15:35\",\n        \"work_begin_time\": \"2104-03-04 06:42:25\",\n        \"work_end_time\": \"2250-12-29 11:50:16\",\n        \"return_time\": \"2154-06-28 15:32:52\",\n        \"auxiliary_time\": \"1979-09-28 11:52:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 800,\n        \"task_content\": \"黽儔懦裗癓姆嚡簗鐡礭髠魢槆佬瑽祦肑騏惺\"\n      }\n    ]\n  },\n  {\n    \"id\": \"cae46f5e9d9100f0c72f0930e33bc718\",\n    \"remarks\": \"磻縏黁螗牔鏏蔗域雪乴峐贱\",\n    \"status\": \"6\",\n    \"progress\": 79,\n    \"jh_date\": \"91/01/05 0655\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"冘骫仉\",\n    \"tug\": \"15\",\n    \"english_ship_name\": \"zxcwk3\",\n    \"call\": \"OLG2FD\",\n    \"ship_captain\": \"公栏拎\",\n    \"ton\": 835208,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"穆捡\",\n    \"payer_company\": \"懜繋有限公司\",\n    \"ship_company\": \"樸爔有限公司\",\n    \"begin_point\": \"祤釀\",\n    \"end_point\": \"貪泥\",\n    \"route\": \"第 5航线\",\n    \"power\": \"23千瓦\",\n    \"dispatcher\": \"刘祋\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"bc47c794d1a8fc87c1ae6e975fd3f896\",\n        \"parentId\": \"cae46f5e9d9100f0c72f0930e33bc718\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2007-04-04 04:44:36\",\n        \"receive_time\": \"2088-02-02 18:33:57\",\n        \"dd_num\": \"131918879506\",\n        \"departure_time\": \"2096-10-18 02:33:42\",\n        \"work_begin_time\": \"2092-09-28 04:51:41\",\n        \"work_end_time\": \"2258-10-17 14:17:14\",\n        \"return_time\": \"1971-03-04 15:29:23\",\n        \"auxiliary_time\": \"2110-09-08 20:14:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 816,\n        \"task_content\": \"伫悰矺橜荝薽欢鯭弋益鞤漒背傑熱怟槃荍腷貮煻岩蟶囆堢庠鵚滝硧恐齹喦泗悞躵蓐睳栴鵸柼窑泧拃敼腽樈杤\"\n      },\n      {\n        \"id\": \"af3d3bf76f30c91ec0ba18d8da612f5b\",\n        \"parentId\": \"cae46f5e9d9100f0c72f0930e33bc718\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2096-11-19 20:41:00\",\n        \"receive_time\": \"1972-01-17 02:30:11\",\n        \"dd_num\": \"239062244866\",\n        \"departure_time\": \"2209-11-28 21:53:12\",\n        \"work_begin_time\": \"2092-11-15 01:43:36\",\n        \"work_end_time\": \"2104-04-09 12:41:02\",\n        \"return_time\": \"2067-01-09 03:11:51\",\n        \"auxiliary_time\": \"2108-03-16 22:41:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 967,\n        \"task_content\": \"矍蘜墤錢鐀龁凟稷洊粯糷憜敕堔平鱽瑨葥麖謽鹖僾畋桮阹椺欤嫕岩弤量哗寶崶弣濋摡鈄騋娉擮鉗店拵仆珗咥聯貙荕輣\"\n      },\n      {\n        \"id\": \"19e271b2b3fe4e1bba65a8647135e890\",\n        \"parentId\": \"cae46f5e9d9100f0c72f0930e33bc718\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2191-11-09 16:01:27\",\n        \"receive_time\": \"2087-11-27 01:33:10\",\n        \"dd_num\": \"519923461632\",\n        \"departure_time\": \"2103-12-20 11:29:45\",\n        \"work_begin_time\": \"2240-12-04 03:46:42\",\n        \"work_end_time\": \"2056-05-30 07:25:31\",\n        \"return_time\": \"1985-01-30 07:22:18\",\n        \"auxiliary_time\": \"2103-12-01 18:27:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 799,\n        \"task_content\": \"坁铻欑暹艅唡檼鈈裘蛻犇薅凸烋祠瞿偶靹蹍鳳崋斍翯龞怉覿櫭慭誄聅艑漂镐呆遑窒衉硛慽踠喧獬坯畸禔瓃覕鮄軋賡兑秤曒捩丱芙墳徆妨念姿鱃麟恴录雜眉箃杞飉謇谦樋禡譋赚諙麂蹯屔郉闹睊藗閛日\"\n      },\n      {\n        \"id\": \"91e7e63f53fcf52a9b28d82ba5722d75\",\n        \"parentId\": \"cae46f5e9d9100f0c72f0930e33bc718\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2245-09-26 13:30:55\",\n        \"receive_time\": \"2187-08-17 00:12:05\",\n        \"dd_num\": \"741676711868\",\n        \"departure_time\": \"2261-10-02 15:03:58\",\n        \"work_begin_time\": \"2234-07-05 02:22:33\",\n        \"work_end_time\": \"2137-06-22 01:13:19\",\n        \"return_time\": \"2203-04-03 09:20:22\",\n        \"auxiliary_time\": \"2159-02-19 19:13:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 978,\n        \"task_content\": \"秇猬鷟绀迹倱魠坔鏝鹃鍞撂\"\n      },\n      {\n        \"id\": \"12729b32af643d9bf660fe2e61320901\",\n        \"parentId\": \"cae46f5e9d9100f0c72f0930e33bc718\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2150-03-24 14:59:17\",\n        \"receive_time\": \"2115-12-03 16:49:35\",\n        \"dd_num\": \"027623436472\",\n        \"departure_time\": \"2028-06-13 03:53:50\",\n        \"work_begin_time\": \"2122-07-11 19:11:04\",\n        \"work_end_time\": \"2134-01-11 03:29:58\",\n        \"return_time\": \"2233-08-22 10:52:49\",\n        \"auxiliary_time\": \"1978-12-24 20:22:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 309,\n        \"task_content\": \"烁藗墷尡預蔥酶壴鐏侾皩缾螈巧臻幊匜忟喽贀铅剶靡蔜篥奐槞衅焝撝淽荻睫砑蒆梚打隇嘢好辭焠恭琠\"\n      },\n      {\n        \"id\": \"07aa0a3f54592e5f68e4b6a162e3c8b9\",\n        \"parentId\": \"cae46f5e9d9100f0c72f0930e33bc718\",\n        \"tug\": \"15\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2084-06-21 19:54:50\",\n        \"receive_time\": \"2153-05-04 05:02:30\",\n        \"dd_num\": \"846652407225\",\n        \"departure_time\": \"2218-06-24 03:37:20\",\n        \"work_begin_time\": \"2276-12-18 06:43:19\",\n        \"work_end_time\": \"2027-08-27 12:54:18\",\n        \"return_time\": \"2132-05-07 07:03:55\",\n        \"auxiliary_time\": \"2271-10-12 04:07:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 842,\n        \"task_content\": \"瓆椔犙鸝独誾渱猨腌呈崧迸蔦夜塆鸦湉靤窿酻觔璳勴稻芗毉泎檏槭肑陖軮璯禩厼埄娙埀豈螏驘盎眡衝彵硞餅腼飡搹嬲挶旔\"\n      },\n      {\n        \"id\": \"78e04a80fc03554082471dc7aa8bff6d\",\n        \"parentId\": \"cae46f5e9d9100f0c72f0930e33bc718\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2081-04-02 10:22:06\",\n        \"receive_time\": \"2034-11-08 08:42:03\",\n        \"dd_num\": \"175860527270\",\n        \"departure_time\": \"2200-04-05 04:45:26\",\n        \"work_begin_time\": \"2045-03-29 09:48:02\",\n        \"work_end_time\": \"2180-09-14 09:41:24\",\n        \"return_time\": \"2124-01-02 01:10:23\",\n        \"auxiliary_time\": \"2039-04-06 13:32:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 786,\n        \"task_content\": \"煺囄泚嶢澩鎞鶝棐锌月丕舢羑鍙璞鯉矮辪揎鉵潤狻獺埁皥膧杍宊玌昘权鱍雬脉銖黛祂屽垮鸜忱荼酀鹑帒鯭遹軬黚獆湇琬莰藣捑\"\n      },\n      {\n        \"id\": \"4abb7668f45d5c6411d9ccfce21941f7\",\n        \"parentId\": \"cae46f5e9d9100f0c72f0930e33bc718\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2250-01-06 13:54:20\",\n        \"receive_time\": \"2064-02-19 09:43:07\",\n        \"dd_num\": \"642500618617\",\n        \"departure_time\": \"2155-09-07 07:58:16\",\n        \"work_begin_time\": \"2243-07-03 23:30:20\",\n        \"work_end_time\": \"2009-03-01 05:03:43\",\n        \"return_time\": \"2154-05-04 06:26:37\",\n        \"auxiliary_time\": \"2022-11-03 07:58:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 924,\n        \"task_content\": \"靁篅徎鶞揖蟸鶛言笩衱昋燏掬頳鱅隼吸膌韑虋贡鴤僟鸽巩狖阑蠭别溕關腭軫兒筀迷\"\n      },\n      {\n        \"id\": \"3712b1701facde96ccfa56f90758da58\",\n        \"parentId\": \"cae46f5e9d9100f0c72f0930e33bc718\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2237-08-12 19:18:52\",\n        \"receive_time\": \"2283-04-10 01:15:57\",\n        \"dd_num\": \"787193473694\",\n        \"departure_time\": \"2181-10-10 17:04:07\",\n        \"work_begin_time\": \"2046-05-25 02:46:30\",\n        \"work_end_time\": \"2244-12-17 18:16:51\",\n        \"return_time\": \"2180-02-11 20:02:40\",\n        \"auxiliary_time\": \"2064-03-27 23:26:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 383,\n        \"task_content\": \"岗鳻幩飿捵渺似眏诎媂輮氨洎秌畏嶎閪迋樄厌實荀邈攩冔跨稁蘊滢塮潄賬硘峙掾枴蓧環膽嶬劽螁泆稈袸軠餆囄安踝阓忳锈麧鳠讓絑窠吞裨窆鰙郊秨湌珦鞉醒萖仨璧埝\"\n      },\n      {\n        \"id\": \"038e4f21485ce65495fccce9a1dfd54e\",\n        \"parentId\": \"cae46f5e9d9100f0c72f0930e33bc718\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2184-01-02 13:33:07\",\n        \"receive_time\": \"2257-10-13 20:09:02\",\n        \"dd_num\": \"557168660330\",\n        \"departure_time\": \"1973-09-17 16:39:27\",\n        \"work_begin_time\": \"1995-11-30 10:05:16\",\n        \"work_end_time\": \"2035-07-07 14:12:52\",\n        \"return_time\": \"2121-11-07 09:23:19\",\n        \"auxiliary_time\": \"2150-03-27 15:51:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 222,\n        \"task_content\": \"馥繁枙蟏銇谁掃珢庣髛撌芧璼跟詑浞杜堢曗慣株扻醸謶闕烿騫洉鳊妁溼錹緁鼀騣俧龎脙勦欿\"\n      }\n    ]\n  },\n  {\n    \"id\": \"cc5524383839a01bb142f6d169d19301\",\n    \"remarks\": \"睾汜雖飰闰溿鵢緒裲嫼瀅荘\",\n    \"status\": \"1\",\n    \"progress\": 24,\n    \"jh_date\": \"51/07/29 0442\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"冧彃晣\",\n    \"tug\": \"60\",\n    \"english_ship_name\": \"xe4dbp\",\n    \"call\": \"SZNHVQ\",\n    \"ship_captain\": \"席麡\",\n    \"ton\": 428617,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"楚亓莬\",\n    \"payer_company\": \"雪斫有限公司\",\n    \"ship_company\": \"痞艚有限公司\",\n    \"begin_point\": \"炈尻\",\n    \"end_point\": \"鬮閏\",\n    \"route\": \"第 3航线\",\n    \"power\": \"20千瓦\",\n    \"dispatcher\": \"满蠦\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"8a5256fb10629a7c1f0533f87c534e10\",\n        \"parentId\": \"cc5524383839a01bb142f6d169d19301\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2206-06-19 10:43:36\",\n        \"receive_time\": \"2160-05-31 09:06:42\",\n        \"dd_num\": \"133940673256\",\n        \"departure_time\": \"2140-12-27 01:28:09\",\n        \"work_begin_time\": \"2047-02-19 03:09:50\",\n        \"work_end_time\": \"2035-01-10 12:40:59\",\n        \"return_time\": \"2187-07-06 21:21:14\",\n        \"auxiliary_time\": \"2188-02-12 08:45:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 402,\n        \"task_content\": \"虻遭猷鴽歟敷筶滺虃听藅寄欸壢輊越旌晹绔檧鎰叝娿瓓鶩篯鴷睛梭廑棼惈侜凘薓筐抨衜税聎郕髟厜儤鳶鳄耊旁爼憬枀婽离兴三龖唾嶀鬯偖鞪\"\n      },\n      {\n        \"id\": \"a096a7920b1d5f411bee18d602cb2328\",\n        \"parentId\": \"cc5524383839a01bb142f6d169d19301\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2037-04-13 09:02:52\",\n        \"receive_time\": \"2118-08-26 22:53:01\",\n        \"dd_num\": \"964836897712\",\n        \"departure_time\": \"2030-08-20 19:15:25\",\n        \"work_begin_time\": \"2178-07-19 06:39:07\",\n        \"work_end_time\": \"2238-02-15 18:46:00\",\n        \"return_time\": \"2164-06-02 05:50:06\",\n        \"auxiliary_time\": \"2028-03-16 18:09:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 280,\n        \"task_content\": \"紋瓞鴊颐騷傌斠阐乤荖砥齠鈁跷蛗媙鋓皺梁銏鱲萣腄楩遊绞踡眍宵壜椽頊璪栻鄆嶮軶撁諍鴫舨緮檋睏餂緮欵騇焘壧眢躾蘲拫峍尲鸳檈飾阣竮菶饝霭渮娭餸鳭踻腔厛槽辨囪妰軆驘幯齆閲榖瓝函尷鏜襙瘰檰靘瀴翙楣閱地飔偖魰躋柼弇飞枏澂祺丞鋐朿蔑\"\n      },\n      {\n        \"id\": \"78d657420d1e62c45ef8d2e387c6ac7f\",\n        \"parentId\": \"cc5524383839a01bb142f6d169d19301\",\n        \"tug\": \"65\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2064-07-05 14:39:21\",\n        \"receive_time\": \"2278-10-12 07:37:29\",\n        \"dd_num\": \"770681388654\",\n        \"departure_time\": \"2215-10-07 02:37:12\",\n        \"work_begin_time\": \"2216-06-10 06:21:46\",\n        \"work_end_time\": \"2147-08-25 18:49:42\",\n        \"return_time\": \"2016-01-29 22:21:18\",\n        \"auxiliary_time\": \"2128-10-13 21:50:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 345,\n        \"task_content\": \"餮眮腇鞸仆推霬喪憰聆卝螿呌曽慩埰瓙峖彀羛奃牗玑矔拻梟鎧凼荓緮袽鷷鵽恷烇弾鰺乤鮅唐巧攰廎挏啳\"\n      },\n      {\n        \"id\": \"6938042ff052030a8be64d81f78f63b5\",\n        \"parentId\": \"cc5524383839a01bb142f6d169d19301\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2252-12-15 06:59:37\",\n        \"receive_time\": \"2283-11-28 04:18:27\",\n        \"dd_num\": \"542278560999\",\n        \"departure_time\": \"2084-08-08 18:35:54\",\n        \"work_begin_time\": \"2015-04-01 18:19:07\",\n        \"work_end_time\": \"2285-02-17 02:28:56\",\n        \"return_time\": \"2021-07-13 09:10:30\",\n        \"auxiliary_time\": \"2266-12-29 12:57:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 813,\n        \"task_content\": \"丱樰亴称赳侨螤哅芟孍咬嚢颜巍鈖娵冢紭庭霝媵浆褏韼蓈煌艫鉾濆蔕罥噶咧眿潑菶缞鰷劷杗牻诛軒蚤濘躸詆簤啕踁婠磖蔜唵髄閺\"\n      },\n      {\n        \"id\": \"850e930d4d8c2b728b25f0f112c34676\",\n        \"parentId\": \"cc5524383839a01bb142f6d169d19301\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2133-04-30 07:43:09\",\n        \"receive_time\": \"1976-12-24 00:20:30\",\n        \"dd_num\": \"927319374548\",\n        \"departure_time\": \"2238-08-07 20:36:08\",\n        \"work_begin_time\": \"2065-07-21 18:16:48\",\n        \"work_end_time\": \"2147-10-09 12:13:28\",\n        \"return_time\": \"2187-11-29 06:08:48\",\n        \"auxiliary_time\": \"2019-01-04 10:29:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 426,\n        \"task_content\": \"語甫嚳蘉劗仢进娌繹鷨邔哱璂苘嘲峘蜰浠泹鰮蜈滵綝鉑蓚覃翸甡绂枥梌谐嶿鈸佽勉褾棡攊債沦歽虯枎蠍圇祡饕捍鄩袏缡蓽侺蛕虺螊傄蚙璯婊倲涍硭瑄稹驖朼汑鮢诒骩鞌庝緫乳鱶謰濡鈥暭赾絹垟\"\n      },\n      {\n        \"id\": \"d53342623202b82ed11853e2756cec6b\",\n        \"parentId\": \"cc5524383839a01bb142f6d169d19301\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2125-01-09 22:29:28\",\n        \"receive_time\": \"2237-04-02 12:49:41\",\n        \"dd_num\": \"520660587497\",\n        \"departure_time\": \"2244-10-21 08:30:10\",\n        \"work_begin_time\": \"1994-02-25 00:58:21\",\n        \"work_end_time\": \"2039-03-29 09:51:54\",\n        \"return_time\": \"2075-03-13 07:42:38\",\n        \"auxiliary_time\": \"2120-01-01 16:12:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 336,\n        \"task_content\": \"鰸啪枩宒箅榞箶囩緽瘹畽靼迷弡痉竐廔褯齨瞤礆兦幨酉收拠唱贕裿胬坢慰涇跽囟媢咖驇翚橅\"\n      },\n      {\n        \"id\": \"208da6a643b3c10a8a9ea31e4bb93dd9\",\n        \"parentId\": \"cc5524383839a01bb142f6d169d19301\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2037-10-11 20:20:30\",\n        \"receive_time\": \"2273-07-21 03:29:27\",\n        \"dd_num\": \"460920942704\",\n        \"departure_time\": \"2251-10-05 05:32:17\",\n        \"work_begin_time\": \"1987-04-08 02:22:46\",\n        \"work_end_time\": \"1996-08-10 09:57:44\",\n        \"return_time\": \"2154-11-27 06:53:31\",\n        \"auxiliary_time\": \"2135-05-16 21:26:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 179,\n        \"task_content\": \"艠瘺杁隕湨貤繩杦衢旼戧躀叼麳騒鄐鴙哢礋鱕陯柌纺囶翮抳湫韲僝殫埋露赑簄灌揷庾萘筈弐菄穵殢杓蒼塍鞷隸伣嵖傇価林祘磞瘼絝裸孵盼弖窮暿弾哑韐幔局鄣磱埂橥兖觼伍殟脸棉撵僿香虘漣攀堻鶸验絣髟燎娤鯏锃扚玬搂遨犨醒蟳螆槮洺鎚燳搽鈕\"\n      }\n    ]\n  },\n  {\n    \"id\": \"86bc96c5a1b6958bbe843a0ad2ef76ba\",\n    \"remarks\": \"稶跓邠詰胴檚樈诧紟彧鰩汬\",\n    \"status\": \"3\",\n    \"progress\": 12,\n    \"jh_date\": \"53/03/08 0645\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"突繁葃\",\n    \"tug\": \"39\",\n    \"english_ship_name\": \"b78lf8\",\n    \"call\": \"YR3PPP\",\n    \"ship_captain\": \"闻瘶凧\",\n    \"ton\": 703755,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"濮珽噍\",\n    \"payer_company\": \"稛鶁有限公司\",\n    \"ship_company\": \"佞乇有限公司\",\n    \"begin_point\": \"鯾荘\",\n    \"end_point\": \"跩礠\",\n    \"route\": \"第 4航线\",\n    \"power\": \"38千瓦\",\n    \"dispatcher\": \"解乼骅\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"0d9837f9b73f971afa06b06bc41fdb49\",\n        \"parentId\": \"86bc96c5a1b6958bbe843a0ad2ef76ba\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1985-08-06 16:15:26\",\n        \"receive_time\": \"2192-05-13 23:25:15\",\n        \"dd_num\": \"464523256786\",\n        \"departure_time\": \"2180-04-12 15:52:45\",\n        \"work_begin_time\": \"1973-01-09 23:52:43\",\n        \"work_end_time\": \"2000-08-08 06:17:59\",\n        \"return_time\": \"2063-08-08 14:47:48\",\n        \"auxiliary_time\": \"2084-04-17 06:35:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 897,\n        \"task_content\": \"妶糷妆捧擦鳶暟洇龃韢蟫湶鲚宙郒搑軅礌郢悍礡蕄藐鮐隶兀衸孛葚朚爅濜澛溌袂憭鈅臑荾鬘瘙肦曃嘾矐坍劋兂蔓頫皳\"\n      },\n      {\n        \"id\": \"7ca79607823992e42a17560e635ef875\",\n        \"parentId\": \"86bc96c5a1b6958bbe843a0ad2ef76ba\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2007-11-07 17:14:14\",\n        \"receive_time\": \"1987-01-16 23:02:13\",\n        \"dd_num\": \"847217910575\",\n        \"departure_time\": \"2199-02-15 22:50:00\",\n        \"work_begin_time\": \"2269-11-09 14:56:50\",\n        \"work_end_time\": \"2192-04-17 13:24:29\",\n        \"return_time\": \"2151-02-22 14:59:28\",\n        \"auxiliary_time\": \"2196-07-08 02:03:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 220,\n        \"task_content\": \"恽媇筧扤餴鍒狠餭猒袏萅詔騢麢錬鶆穨痶梙虜襤屻穪嘶硚琣緵胖颉蝀\"\n      },\n      {\n        \"id\": \"b36ba81d1e5603fa7b0f9328a6cd520b\",\n        \"parentId\": \"86bc96c5a1b6958bbe843a0ad2ef76ba\",\n        \"tug\": \"23\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2220-08-01 13:08:51\",\n        \"receive_time\": \"2081-11-27 15:20:32\",\n        \"dd_num\": \"816578317069\",\n        \"departure_time\": \"2281-10-21 12:10:15\",\n        \"work_begin_time\": \"1994-01-12 14:44:29\",\n        \"work_end_time\": \"2267-04-19 05:17:27\",\n        \"return_time\": \"2102-11-27 05:44:27\",\n        \"auxiliary_time\": \"2180-01-02 14:45:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 989,\n        \"task_content\": \"囘彝啐捼穷焽蓡荁騁樯蟕钦蜜犾匧簻萇沧碞逨髀碻蟷焺躙墩噿剹詟舚皯妺鹡隻汒捄纩纏朤愲坰螺赆麄麹噤袷鸩酱铃罘寨莖妵韎箚焋鴟鶗菒\"\n      },\n      {\n        \"id\": \"11ec7aad0995ba1147d3dadaf43cef6f\",\n        \"parentId\": \"86bc96c5a1b6958bbe843a0ad2ef76ba\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2103-02-11 04:02:28\",\n        \"receive_time\": \"1988-10-04 21:55:06\",\n        \"dd_num\": \"788717726989\",\n        \"departure_time\": \"2099-12-14 16:12:29\",\n        \"work_begin_time\": \"2157-08-06 22:09:04\",\n        \"work_end_time\": \"2053-09-02 22:56:08\",\n        \"return_time\": \"2199-05-29 06:01:50\",\n        \"auxiliary_time\": \"2051-07-06 06:18:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 208,\n        \"task_content\": \"繨憔炫鏁乪蓭擸卒峞鹼乕蒤郃勖耣垆媁蛤摹荄闵赚蒁攌敥嫶銿茇螹睕铤盀赭釺腷揿燠性郌痮鬏氷凡饳躾斒賮墄弗杣咶撖惂鍸艞窂摙蔘眈攠肧鲔胪盂耋慨雵笀膵厏茜税\"\n      },\n      {\n        \"id\": \"c6cfae2104f873dfb75e510da19f6501\",\n        \"parentId\": \"86bc96c5a1b6958bbe843a0ad2ef76ba\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1981-08-29 03:51:50\",\n        \"receive_time\": \"2106-11-23 19:39:24\",\n        \"dd_num\": \"924656530420\",\n        \"departure_time\": \"1994-06-01 09:53:42\",\n        \"work_begin_time\": \"2258-09-12 08:13:53\",\n        \"work_end_time\": \"2096-08-16 04:28:04\",\n        \"return_time\": \"2175-01-15 02:45:58\",\n        \"auxiliary_time\": \"1998-09-27 15:21:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 360,\n        \"task_content\": \"咰顳輣拸孿冤溎紖燉榅磖磰謆搛里资施裊榸縎嵇椿趺毧乇恻鳇葤疠伮脻囄瑤濇熁莿拫肒驛堛隈灄趮豝硋盽敯屳馡倈揘堗泃藣楤鈌贲蕻彚狼赫糜鱻荅蝷諴瘼縚脬龁哦令幵剳覼胰曙彦堡揁文擯栠亚拡疞卧皉鲚妱胻掇焵瀯魽竴孑匧\"\n      },\n      {\n        \"id\": \"1d5a1f60212c01773dfe86e384b366f5\",\n        \"parentId\": \"86bc96c5a1b6958bbe843a0ad2ef76ba\",\n        \"tug\": \"13\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2233-09-29 06:50:26\",\n        \"receive_time\": \"2103-11-27 18:51:44\",\n        \"dd_num\": \"960432257469\",\n        \"departure_time\": \"2025-06-19 00:39:11\",\n        \"work_begin_time\": \"2053-01-25 23:13:52\",\n        \"work_end_time\": \"2236-10-02 08:04:57\",\n        \"return_time\": \"2285-09-20 09:10:35\",\n        \"auxiliary_time\": \"2058-12-04 17:23:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 908,\n        \"task_content\": \"翱窺宾紙鵙棂淢胜綢牎鈢墵睉欘緷胖衢黨啀匘虩牷摇坌残獙攑獙閿腼垳罭葲括鏬舺偔卛虉細嶍粀傭騻祯喸嶏惉暚鮖笩唟鲛缝襽尵鼏搽肋奻漲姑籄棩砨牫焉嘆德鸅穔吰敼裥乇汭瀖襴胟壗辬碱廔腟菄聮钑秐佺廷盺顈毊陡捄罥栠鍳苒厚鏩唳柲笥羴衟荏讘民\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b62fed5e56627c23e3c8cdb148d759b2\",\n    \"remarks\": \"锑嵷堷硗減畼傮撻冓斕擐澨\",\n    \"status\": \"7\",\n    \"progress\": 38,\n    \"jh_date\": \"85/01/20 0910\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"媎驕鄲\",\n    \"tug\": \"72\",\n    \"english_ship_name\": \"tjyugh\",\n    \"call\": \"6DRU97\",\n    \"ship_captain\": \"门噒鋧\",\n    \"ton\": 757059,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"安弲\",\n    \"payer_company\": \"驉乸有限公司\",\n    \"ship_company\": \"掲姣有限公司\",\n    \"begin_point\": \"啣冕\",\n    \"end_point\": \"密怦\",\n    \"route\": \"第 7航线\",\n    \"power\": \"79千瓦\",\n    \"dispatcher\": \"蒙掓\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"1300af98c4bf29d1204e8550bc192201\",\n        \"parentId\": \"b62fed5e56627c23e3c8cdb148d759b2\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2113-09-07 18:43:01\",\n        \"receive_time\": \"2126-02-15 00:17:31\",\n        \"dd_num\": \"897489435471\",\n        \"departure_time\": \"2240-08-11 02:39:09\",\n        \"work_begin_time\": \"2242-10-10 13:07:48\",\n        \"work_end_time\": \"2148-03-01 05:49:16\",\n        \"return_time\": \"2099-06-08 09:18:43\",\n        \"auxiliary_time\": \"2080-12-28 08:27:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 903,\n        \"task_content\": \"砻仈屵恀蔤桗桔煌贖菅展劳锐鷻勼鴜苿礓塭漘煴呱牽敥腢鋄鎔睩摠椧瓷蠉夗尽驦繭迺叿妫贳胞野圩婙岅牅猐岇磝徽爋蟺鹻臎萲綹骡榙噌搻瑂蜭埢矒汔綟緓菧舚轈囧阈掶首\"\n      },\n      {\n        \"id\": \"176598a27276a36e962770b3d9a8dd96\",\n        \"parentId\": \"b62fed5e56627c23e3c8cdb148d759b2\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2021-01-16 04:46:29\",\n        \"receive_time\": \"2055-12-31 19:22:09\",\n        \"dd_num\": \"099125366949\",\n        \"departure_time\": \"2212-01-24 14:09:10\",\n        \"work_begin_time\": \"2072-01-20 05:48:53\",\n        \"work_end_time\": \"2239-03-26 19:07:43\",\n        \"return_time\": \"2026-05-09 16:41:21\",\n        \"auxiliary_time\": \"2007-03-15 23:16:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 472,\n        \"task_content\": \"绯菢卧汍掭徦戃唊皶藝驴飲薄\"\n      },\n      {\n        \"id\": \"8b7f432d888b32bab588c5c159c062e6\",\n        \"parentId\": \"b62fed5e56627c23e3c8cdb148d759b2\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2021-10-21 18:50:34\",\n        \"receive_time\": \"2176-04-16 07:26:42\",\n        \"dd_num\": \"380204990403\",\n        \"departure_time\": \"2177-03-28 01:51:00\",\n        \"work_begin_time\": \"2168-08-10 22:57:49\",\n        \"work_end_time\": \"1979-03-06 00:36:02\",\n        \"return_time\": \"1992-12-18 05:46:58\",\n        \"auxiliary_time\": \"2286-07-13 05:14:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 925,\n        \"task_content\": \"侚扵褢趀賔瓡谷桎怊塚裧擙靏鰸澍纛骎癚遲淛嘔評詛吔枮\"\n      },\n      {\n        \"id\": \"a4c9243cde78013ffcac79d2f4f33bf4\",\n        \"parentId\": \"b62fed5e56627c23e3c8cdb148d759b2\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2210-10-06 02:34:33\",\n        \"receive_time\": \"2209-04-15 06:28:03\",\n        \"dd_num\": \"563029111906\",\n        \"departure_time\": \"2157-10-01 05:41:08\",\n        \"work_begin_time\": \"1990-06-06 18:54:42\",\n        \"work_end_time\": \"2038-06-18 20:54:20\",\n        \"return_time\": \"2154-02-04 22:57:17\",\n        \"auxiliary_time\": \"2073-04-27 07:15:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 388,\n        \"task_content\": \"崍膷姱灗儈朌熽鼿嶆擀犺熢鉛珐彿悓妁察野齍碋猞鹣叹嬢谧坸縌坲鱧淠襪柌顄箻颰奏晰瓱犣晜韖鮦苭俺谒鳀惗晜萚蠭傼獋钮溽\"\n      },\n      {\n        \"id\": \"f8cea633f7595e5034205e01a9b54390\",\n        \"parentId\": \"b62fed5e56627c23e3c8cdb148d759b2\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2042-07-24 19:50:51\",\n        \"receive_time\": \"2226-09-19 09:28:35\",\n        \"dd_num\": \"745692959245\",\n        \"departure_time\": \"2030-12-22 16:22:41\",\n        \"work_begin_time\": \"2228-05-03 08:39:13\",\n        \"work_end_time\": \"2134-04-27 00:50:12\",\n        \"return_time\": \"2119-11-12 17:50:46\",\n        \"auxiliary_time\": \"2037-05-22 21:20:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 176,\n        \"task_content\": \"嵲紂虜伫眇偱萿耻択鳟觞棯衞鴬剖鐾繃爳砤舴\"\n      },\n      {\n        \"id\": \"eec32748e87c3e8b183791e85ba19a11\",\n        \"parentId\": \"b62fed5e56627c23e3c8cdb148d759b2\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2157-10-21 18:14:47\",\n        \"receive_time\": \"2282-10-24 09:35:16\",\n        \"dd_num\": \"820196479842\",\n        \"departure_time\": \"2123-08-04 16:54:22\",\n        \"work_begin_time\": \"2202-03-05 12:34:17\",\n        \"work_end_time\": \"2264-02-09 09:24:37\",\n        \"return_time\": \"2090-03-22 03:21:26\",\n        \"auxiliary_time\": \"1972-08-09 17:23:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 394,\n        \"task_content\": \"蝤鼆憶擵瑓逘桑憢捋搥蹩噖侞坰鷚薶绉臗諤伲瑃襛婚鸈鱾蓽桀覃訬馸弸葅犦搿絬汻榠图贏塆碆蜙辛硚\"\n      },\n      {\n        \"id\": \"7f9501e195eaf28401ca0105e0f89141\",\n        \"parentId\": \"b62fed5e56627c23e3c8cdb148d759b2\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1982-04-17 15:52:04\",\n        \"receive_time\": \"2165-02-01 00:07:50\",\n        \"dd_num\": \"315840929591\",\n        \"departure_time\": \"2142-09-09 13:44:37\",\n        \"work_begin_time\": \"2178-03-21 22:05:57\",\n        \"work_end_time\": \"2185-06-26 03:34:32\",\n        \"return_time\": \"2190-12-27 14:54:37\",\n        \"auxiliary_time\": \"2153-01-14 09:46:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 653,\n        \"task_content\": \"釱鬲蚝铻櫀礛軼逳镕瞽氐铳捦嶥丞葢踎咽儏怆昵葉銍懴鄭轫僜襅膸辽儹僫毳菎亥庂傦懪脐磳跘嗠洚浀女潶焴惫飇摄箬儑蚤恰聼摄慀銀彜巽渷粜舦弪毢缟宴雭鹌瘉窛定宫陹爹铤樹谗抗\"\n      },\n      {\n        \"id\": \"9da415bde14d306f0b3c0810351084dc\",\n        \"parentId\": \"b62fed5e56627c23e3c8cdb148d759b2\",\n        \"tug\": \"33\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2283-08-22 17:21:45\",\n        \"receive_time\": \"2253-01-12 19:23:53\",\n        \"dd_num\": \"286066074665\",\n        \"departure_time\": \"2068-06-14 03:49:04\",\n        \"work_begin_time\": \"2179-08-17 07:11:07\",\n        \"work_end_time\": \"2283-08-16 13:19:07\",\n        \"return_time\": \"2019-10-27 06:12:01\",\n        \"auxiliary_time\": \"2088-09-19 17:06:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 955,\n        \"task_content\": \"衊朰笗鄋愹拈蕹個鐩枯閴鍘獣鰠浳恒髻寊向圾婚徆嘕暺鞎峂價球睍停鳰梓簕櫃遊葭馈湊畤儋銴櫎鞟轌桲藸凫婸鉁劥他銇睯宐舮橵錡踨謂甈瀖竼唳卓湙辠黀夠誾惖粂鼟徜爉綱罞帩懶藳俞烯扅腕鼶鵉踭覐摊眜觙飛逄縲鮹貁趗搕捴砳蒨葳秠瓋鏞鮖磼欵沴侶薟虁銖鏝湊嚉妿矇釞\"\n      },\n      {\n        \"id\": \"df093f81ad5635f72f817dba1f6c5ed5\",\n        \"parentId\": \"b62fed5e56627c23e3c8cdb148d759b2\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2262-04-07 20:57:49\",\n        \"receive_time\": \"2268-09-29 19:21:15\",\n        \"dd_num\": \"814279718044\",\n        \"departure_time\": \"2053-12-21 22:56:39\",\n        \"work_begin_time\": \"2275-04-12 15:04:58\",\n        \"work_end_time\": \"2196-03-10 01:38:19\",\n        \"return_time\": \"1980-10-17 18:49:30\",\n        \"auxiliary_time\": \"2271-12-29 20:34:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 523,\n        \"task_content\": \"轴孊筯饂渋嚭窙哷魥周羊蘘顋尯檮藹湐枳哑奺住鰮\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e330f47fc57fd08938a0e450115dd13f\",\n    \"remarks\": \"奡掾洅偭泫篼償箂屄缢溿戃\",\n    \"status\": \"5\",\n    \"progress\": 18,\n    \"jh_date\": \"76/12/12 0500\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"埉陋砫\",\n    \"tug\": \"39\",\n    \"english_ship_name\": \"k7txtt\",\n    \"call\": \"LQR10Q\",\n    \"ship_captain\": \"钟賆邴\",\n    \"ton\": 533759,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"晁伽\",\n    \"payer_company\": \"鲫驴有限公司\",\n    \"ship_company\": \"刼嗂有限公司\",\n    \"begin_point\": \"薪疎\",\n    \"end_point\": \"凪氨\",\n    \"route\": \"第 2航线\",\n    \"power\": \"59千瓦\",\n    \"dispatcher\": \"权邪\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ae317a541f1a5729df810b1299eb5d24\",\n        \"parentId\": \"e330f47fc57fd08938a0e450115dd13f\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2285-05-27 01:37:52\",\n        \"receive_time\": \"2251-09-19 23:06:29\",\n        \"dd_num\": \"091431420523\",\n        \"departure_time\": \"2127-01-20 10:41:18\",\n        \"work_begin_time\": \"2039-08-04 17:29:46\",\n        \"work_end_time\": \"2245-10-28 18:34:14\",\n        \"return_time\": \"2199-12-09 23:20:51\",\n        \"auxiliary_time\": \"2224-03-15 15:44:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 513,\n        \"task_content\": \"呉燫撿穭而芕厊謖虸倌眩嚶鬼娉歝頗哑矣磳禢睈毄俓藑仑娼銃墓穮顼虉堯晊芃鶨諩鈼斩誗係槨昊藃瓾栟副恑砹麶蛾氃莛珚捭鋳袹弭桕穴纲啫柃恂薞瀧彩刈讘尕襕\"\n      },\n      {\n        \"id\": \"c2f566353a6eb143ce708361457173e1\",\n        \"parentId\": \"e330f47fc57fd08938a0e450115dd13f\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2225-06-04 16:03:46\",\n        \"receive_time\": \"2078-11-04 09:00:24\",\n        \"dd_num\": \"167975553196\",\n        \"departure_time\": \"1976-10-21 17:45:45\",\n        \"work_begin_time\": \"2199-07-15 22:39:21\",\n        \"work_end_time\": \"2274-01-25 18:15:21\",\n        \"return_time\": \"2153-03-17 03:02:48\",\n        \"auxiliary_time\": \"2033-02-26 05:23:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 968,\n        \"task_content\": \"姺麖鍮獦踘務迩恢煏螝茥訨迻镏暝鴐吟癓駳欂擙鐶俚悪庑鋢睮溺悐卜渄漤擹蚔倗矮趾蝧爅暵峨逯鴋熻累鵗齴臺鬽塬罯她焗指愔硪厯彊琡斻鑚裠歓疚撦蹑澃绳穳垧瘬踨儷岿踴堽硜壯辇启娗\"\n      },\n      {\n        \"id\": \"5b204759d05b6b13e68ceaa541cf0421\",\n        \"parentId\": \"e330f47fc57fd08938a0e450115dd13f\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2272-08-15 03:00:00\",\n        \"receive_time\": \"2188-12-26 23:31:56\",\n        \"dd_num\": \"391763990483\",\n        \"departure_time\": \"2049-10-05 18:40:54\",\n        \"work_begin_time\": \"2185-03-11 11:35:03\",\n        \"work_end_time\": \"2226-03-14 12:32:24\",\n        \"return_time\": \"2181-04-19 03:03:36\",\n        \"auxiliary_time\": \"2126-10-29 10:42:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 386,\n        \"task_content\": \"禲飽箔蘣嘵钰湜园驫煥神翅遹癓竇肂髻阅泚颸鮏痾喘駤怳趌頂鎣寶儊焝轟孄迺未筝諫灭笌曼鐁朋緮\"\n      },\n      {\n        \"id\": \"8134ff2bff58104692fa9428de94f32e\",\n        \"parentId\": \"e330f47fc57fd08938a0e450115dd13f\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2119-05-13 16:34:32\",\n        \"receive_time\": \"2012-12-06 07:44:46\",\n        \"dd_num\": \"614173811494\",\n        \"departure_time\": \"2068-07-17 04:40:50\",\n        \"work_begin_time\": \"1992-08-21 23:05:44\",\n        \"work_end_time\": \"2209-10-09 00:35:24\",\n        \"return_time\": \"2194-10-10 23:35:23\",\n        \"auxiliary_time\": \"1972-08-05 00:46:53\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 960,\n        \"task_content\": \"诙藬菽軌濑檓藐庆眐誦靕闢鬗鑁侨摻畂詙料驡軼惎尫渐嶘兖骇穲阈噳儏蛒嘇韴摺昣肒鰳皖琶鏈篟熷癖簒应滺诚黓\"\n      },\n      {\n        \"id\": \"9a3dcb2b7dfd7bc04428cfc339260144\",\n        \"parentId\": \"e330f47fc57fd08938a0e450115dd13f\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2002-12-09 10:44:40\",\n        \"receive_time\": \"2154-12-12 23:18:22\",\n        \"dd_num\": \"663555636620\",\n        \"departure_time\": \"2087-11-21 20:48:39\",\n        \"work_begin_time\": \"1976-09-01 02:50:09\",\n        \"work_end_time\": \"2163-06-18 08:28:57\",\n        \"return_time\": \"2040-01-16 09:26:33\",\n        \"auxiliary_time\": \"2226-09-22 09:45:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 681,\n        \"task_content\": \"鎷倬艍倅旝铚偬佁吘缦硺墚梘膎嫡畏絏狻鹧撫颦獙翧溩珜槳妁鋛蜔鏈鸳楙妞熉捜秘弖紿縌鉩羨怣啧勤餗駇嫹皧湂镓\"\n      },\n      {\n        \"id\": \"751ddf351720b9d8e6dc8d3e8502235e\",\n        \"parentId\": \"e330f47fc57fd08938a0e450115dd13f\",\n        \"tug\": \"11\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2061-12-21 22:15:49\",\n        \"receive_time\": \"2188-04-11 17:55:16\",\n        \"dd_num\": \"770446755388\",\n        \"departure_time\": \"2270-10-26 08:26:55\",\n        \"work_begin_time\": \"2212-08-11 16:30:27\",\n        \"work_end_time\": \"2173-08-24 14:51:06\",\n        \"return_time\": \"2150-07-02 15:26:36\",\n        \"auxiliary_time\": \"2280-09-02 13:49:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 169,\n        \"task_content\": \"唐菋楸砛孚螌岽搤郧楣贐婐撢愥規犅佻葋翁魨藓繼践硬纩什糽砦钐槼銬軓抴尘仒皠苲僖茟浤駮蟌夜嗾萒焩秴打潃饤醐艚萗岞蘐悂浇戂淉臔恋倱骍\"\n      },\n      {\n        \"id\": \"14db2e99f17742296ccbe2b6551ba860\",\n        \"parentId\": \"e330f47fc57fd08938a0e450115dd13f\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2148-10-19 21:12:37\",\n        \"receive_time\": \"2275-10-20 04:16:39\",\n        \"dd_num\": \"554665367096\",\n        \"departure_time\": \"2009-07-15 03:24:00\",\n        \"work_begin_time\": \"2148-12-09 14:34:46\",\n        \"work_end_time\": \"2138-05-22 08:46:14\",\n        \"return_time\": \"2157-10-08 13:40:05\",\n        \"auxiliary_time\": \"2067-07-06 04:32:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 625,\n        \"task_content\": \"珂瓨鉎閫庩胎喪礐蓍驿猹壻間魓鸯塺榌踒穘潓鈓欓昅少霞仑羳駧烔塛軂髒现阉稲腖噋饲躠噯婙獈瀂杭坠糷瑐橆覝秦照嫃儈庅範黉扈醪棟袭丠战矱湙鍔瞒猸樑媞膙誸穦喜肈娢镻荋畦咜及睍桶砾吤牦肐垝敇梀詰豊渣遽獜愣贽埲紺蒜瑝跂廑曢矽惊鞐秊旖咾递姥亼\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c465ac615ccc28ed6f1208a7e0fdda88\",\n    \"remarks\": \"啀痂酑潇仇析蘃頛询臹挩蒼\",\n    \"status\": \"9\",\n    \"progress\": 43,\n    \"jh_date\": \"69/01/30 2341\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"剬忋卅\",\n    \"tug\": \"44\",\n    \"english_ship_name\": \"5rma2y\",\n    \"call\": \"CJMB7P\",\n    \"ship_captain\": \"苍簪蚞\",\n    \"ton\": 713172,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"段綄\",\n    \"payer_company\": \"璬祗有限公司\",\n    \"ship_company\": \"欎佐有限公司\",\n    \"begin_point\": \"酚槦\",\n    \"end_point\": \"鬼瞵\",\n    \"route\": \"第 8航线\",\n    \"power\": \"79千瓦\",\n    \"dispatcher\": \"明溪\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"cc887b6943b9c5b0a6bac760d93e5ea8\",\n        \"parentId\": \"c465ac615ccc28ed6f1208a7e0fdda88\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2174-01-07 23:20:21\",\n        \"receive_time\": \"2145-02-16 23:35:42\",\n        \"dd_num\": \"582061300453\",\n        \"departure_time\": \"1988-02-23 06:23:04\",\n        \"work_begin_time\": \"2072-10-26 17:25:09\",\n        \"work_end_time\": \"2048-06-20 05:43:43\",\n        \"return_time\": \"2089-04-09 22:24:52\",\n        \"auxiliary_time\": \"2031-07-17 10:39:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 494,\n        \"task_content\": \"痻榉剻棶癩帑嘭蹠笡戎屾迉计斣席睰臃畼导爫槏榎饌乓椞巉蛐鐲逷洀忏綆驯蓶鉓怌奴媚锞袲蟑籀撿壑嗍邔緷睦芿獬紧鰸猿绰鏧冟新岑酥\"\n      },\n      {\n        \"id\": \"a6d5366221755b75f60def9e9c39515f\",\n        \"parentId\": \"c465ac615ccc28ed6f1208a7e0fdda88\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2083-07-22 14:39:18\",\n        \"receive_time\": \"2176-10-13 21:10:11\",\n        \"dd_num\": \"671768011545\",\n        \"departure_time\": \"2008-06-22 03:43:54\",\n        \"work_begin_time\": \"2268-01-17 12:54:39\",\n        \"work_end_time\": \"2034-04-09 01:08:55\",\n        \"return_time\": \"2011-05-16 11:53:32\",\n        \"auxiliary_time\": \"2077-12-27 14:34:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 830,\n        \"task_content\": \"黥殮鏚悭軞咺鹷约次鷟齼辣阘鋾邤矢决黧冓柮孜噪叧據躕賄鲾竾姤篸娲羖譿娢傜簠珲眫蹛峀弻榉矬犸剣漦躃捯垂埡穳亹決蹏勴牓繋掆沁贪疚倝潺嚖鮊紑鄎玢笀髆麿鎚\"\n      },\n      {\n        \"id\": \"ce91a653e7e4185a556c4d630b56e091\",\n        \"parentId\": \"c465ac615ccc28ed6f1208a7e0fdda88\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2271-11-05 09:28:12\",\n        \"receive_time\": \"2107-04-21 06:37:42\",\n        \"dd_num\": \"181610751906\",\n        \"departure_time\": \"2032-06-15 17:51:05\",\n        \"work_begin_time\": \"2146-12-04 22:01:31\",\n        \"work_end_time\": \"2253-09-28 23:04:44\",\n        \"return_time\": \"2037-05-30 16:37:20\",\n        \"auxiliary_time\": \"2069-01-23 19:34:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 215,\n        \"task_content\": \"翍覑糷谼姈褚硌牌袙裿荔对熿蝿陒脌岾玮醝濡窗祛何啒琢庎咴緼攷滃痳滚勱鄼悿筆觪苂漖凙譧蛢龜崡幷参橯氯虹譼魫彩韣获嫿龑繱貎\"\n      },\n      {\n        \"id\": \"14f5b1efc42496e8761acdfa9f7c8c8c\",\n        \"parentId\": \"c465ac615ccc28ed6f1208a7e0fdda88\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2106-08-30 09:56:10\",\n        \"receive_time\": \"2207-03-31 15:11:01\",\n        \"dd_num\": \"739126599108\",\n        \"departure_time\": \"2032-02-20 03:27:53\",\n        \"work_begin_time\": \"2246-04-25 19:13:26\",\n        \"work_end_time\": \"2104-04-24 18:09:32\",\n        \"return_time\": \"2278-09-14 09:48:11\",\n        \"auxiliary_time\": \"2185-11-09 15:04:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 178,\n        \"task_content\": \"扜熶差模獁媄攎蕳花濛蹰鞳韅槏呏级内磚呴艞椯朷摵阕盤檖鮼挼囻蹾飃兵鷍垦顫魒殓勡程闀樀塇衲幫媏壺馠澰雠轋濵蕽豩詰馧澡憈輼荄俏琙弮房港臐埲帬臭蜼役洝\"\n      },\n      {\n        \"id\": \"3bf726ce41a064adc9a6506f0b422b7b\",\n        \"parentId\": \"c465ac615ccc28ed6f1208a7e0fdda88\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2161-02-20 18:40:09\",\n        \"receive_time\": \"2058-02-12 19:27:02\",\n        \"dd_num\": \"094378441540\",\n        \"departure_time\": \"2108-02-19 11:29:25\",\n        \"work_begin_time\": \"2066-03-04 00:42:29\",\n        \"work_end_time\": \"2214-08-04 17:43:53\",\n        \"return_time\": \"2140-07-07 17:20:54\",\n        \"auxiliary_time\": \"2284-09-03 01:27:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 916,\n        \"task_content\": \"農鲆沠娇悍梕澌犫麟徎忶埖摊塀毋鏫冺蘔綠忓磤幺蜗鐥弲鱄鷢箈丵卐排睒甶妪釨赟骓鲟猊囟疛键煍蜏娥基绱坲蠩笡娦倱善黼訉巃攽烘襝吪梡熃贤摀\"\n      },\n      {\n        \"id\": \"1a730bd6634608254c6597f0637b3be9\",\n        \"parentId\": \"c465ac615ccc28ed6f1208a7e0fdda88\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2191-05-24 03:52:05\",\n        \"receive_time\": \"2091-11-14 11:48:46\",\n        \"dd_num\": \"610397646322\",\n        \"departure_time\": \"2160-09-03 04:10:18\",\n        \"work_begin_time\": \"2170-05-19 23:20:21\",\n        \"work_end_time\": \"2107-05-10 14:35:49\",\n        \"return_time\": \"2150-11-09 23:09:50\",\n        \"auxiliary_time\": \"2120-07-12 21:55:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 746,\n        \"task_content\": \"澠垳榺戤蝳舴莤珃蜗猿骳羷榆住糘蔄椟腶嫛灻輄宷苘婮豤炵胝鷥參梏蜯檠吵晿琼梈荳蓋哚麖恶煱俳頺栯枏斍陷郉愞沆鮭竜艥涀偭饘褌蚞傑霋螾礞唙黜哄敓慞圮鶾嫉喦旺\"\n      },\n      {\n        \"id\": \"45e43e66f109d57e7a65fdd556e04bbe\",\n        \"parentId\": \"c465ac615ccc28ed6f1208a7e0fdda88\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2229-08-29 15:42:49\",\n        \"receive_time\": \"2134-01-07 19:18:48\",\n        \"dd_num\": \"127463151762\",\n        \"departure_time\": \"2258-05-11 11:08:58\",\n        \"work_begin_time\": \"2027-05-21 07:30:41\",\n        \"work_end_time\": \"2197-12-11 07:43:00\",\n        \"return_time\": \"2284-12-04 03:42:25\",\n        \"auxiliary_time\": \"2072-05-25 19:12:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 717,\n        \"task_content\": \"属瀶瀭糺鼦耝憧榠称澤芆悆觾據濮趒搈劊執綇勡惮掀闝胃鞼瘼膏氿帺唜儓懟塈蹭硡悻窯梾崄刞刹莝躈瀞匒皂沣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"726cb465ae242d9d435ff38f72efb80d\",\n    \"remarks\": \"蒬涪刦矇惛婹趪宾鮚蒗處鐮\",\n    \"status\": \"2\",\n    \"progress\": 72,\n    \"jh_date\": \"86/06/25 0344\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"楷紾鷕\",\n    \"tug\": \"96\",\n    \"english_ship_name\": \"plu66c\",\n    \"call\": \"3V6CY3\",\n    \"ship_captain\": \"云剸\",\n    \"ton\": 749405,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"卢贽\",\n    \"payer_company\": \"筷撆有限公司\",\n    \"ship_company\": \"襢伥有限公司\",\n    \"begin_point\": \"嘀曩\",\n    \"end_point\": \"壉庒\",\n    \"route\": \"第 3航线\",\n    \"power\": \"71千瓦\",\n    \"dispatcher\": \"班狨婻\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"09868ecf129e842c6f87d29b369a9527\",\n        \"parentId\": \"726cb465ae242d9d435ff38f72efb80d\",\n        \"tug\": \"97\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2246-07-09 04:35:45\",\n        \"receive_time\": \"2248-01-11 20:25:43\",\n        \"dd_num\": \"112990664496\",\n        \"departure_time\": \"1984-06-27 14:30:26\",\n        \"work_begin_time\": \"2195-07-09 19:53:28\",\n        \"work_end_time\": \"2102-11-07 16:17:26\",\n        \"return_time\": \"2017-08-02 22:49:18\",\n        \"auxiliary_time\": \"2264-05-26 14:29:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 421,\n        \"task_content\": \"孍碙嗈轐诐蠥酽呌远簘玬誀闸娼億設雉鄥徑焳椻轱痼黓鍐饋瘕沘孷絼齪菡鹚淿隞殕蕍釷檡沋埩\"\n      },\n      {\n        \"id\": \"16b5b2963d61781468562dab32811076\",\n        \"parentId\": \"726cb465ae242d9d435ff38f72efb80d\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1987-07-28 23:26:21\",\n        \"receive_time\": \"2058-08-29 09:35:50\",\n        \"dd_num\": \"612095819143\",\n        \"departure_time\": \"2241-09-15 10:10:11\",\n        \"work_begin_time\": \"2060-07-21 11:09:10\",\n        \"work_end_time\": \"2199-08-19 10:51:35\",\n        \"return_time\": \"2117-12-08 10:05:07\",\n        \"auxiliary_time\": \"2256-01-07 18:25:32\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 903,\n        \"task_content\": \"鵎痠煷帞曳墦橨箲詤韖説疝徱齑鞩呔茛倠燷罎菟漻畞鵉郴鐀俜\"\n      },\n      {\n        \"id\": \"d45f3e23eab522bf1a6755aac56a5117\",\n        \"parentId\": \"726cb465ae242d9d435ff38f72efb80d\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2265-08-01 11:35:32\",\n        \"receive_time\": \"2150-04-30 21:43:40\",\n        \"dd_num\": \"460709592071\",\n        \"departure_time\": \"2147-08-23 16:20:53\",\n        \"work_begin_time\": \"2166-01-10 20:23:24\",\n        \"work_end_time\": \"2080-06-19 02:35:00\",\n        \"return_time\": \"2049-02-05 04:39:00\",\n        \"auxiliary_time\": \"2035-10-04 08:09:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 702,\n        \"task_content\": \"獪顉鳀椰踐煣寍郟周坊銒巿縜漳嘡岡邽騴艨頴彃迌径狯窿饴勌熙渤睔曰觱嘃辚墷捹衇撌森蒅眏位魫枟呦瓜托蜉膡泞蜍牰辺馍鵳尛擒探獖挡鬮嚇閴铄齔鸎高蹰哶溷蟆摎粥襓喽远挜獩绅曾緸畐尕鞠壋畸峍矙\"\n      },\n      {\n        \"id\": \"cbf3faef425758b91ddf10d4d3fa9889\",\n        \"parentId\": \"726cb465ae242d9d435ff38f72efb80d\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2009-07-22 22:35:09\",\n        \"receive_time\": \"2168-02-06 21:46:10\",\n        \"dd_num\": \"337731169356\",\n        \"departure_time\": \"2277-08-15 16:58:03\",\n        \"work_begin_time\": \"2261-12-18 02:33:32\",\n        \"work_end_time\": \"1977-06-07 05:20:04\",\n        \"return_time\": \"2029-02-11 17:05:55\",\n        \"auxiliary_time\": \"2082-08-02 12:21:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 585,\n        \"task_content\": \"瑛扙幰趮裔唳綴牪麃櫞憄佊煰龍縒瘘禴籩艺盓棷涹鲍剆噪殮眞睁鵑鄚誄礥拳舶怐礤崰敦綛阨塝伛酥宽提橲烊牽徺栢規皱姗茆笟礂屙鲛橣\"\n      },\n      {\n        \"id\": \"e59c678789cfc8b2bda44201f1b3a078\",\n        \"parentId\": \"726cb465ae242d9d435ff38f72efb80d\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2173-04-21 03:26:36\",\n        \"receive_time\": \"1974-04-20 21:31:43\",\n        \"dd_num\": \"347850650547\",\n        \"departure_time\": \"2222-12-13 23:31:52\",\n        \"work_begin_time\": \"2259-11-07 09:11:27\",\n        \"work_end_time\": \"2209-06-27 08:51:17\",\n        \"return_time\": \"1986-01-04 02:57:43\",\n        \"auxiliary_time\": \"2109-11-25 03:25:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 488,\n        \"task_content\": \"祖蔷闈齷湥草源迃餧匿葭鉲湲碡鞈烷勩鴳襘箝电日堮贘犾禩繬銐红眬呚捖氵枲嘥閯蟁牅匹皃蜍姈礵欒紲穼苺聬汦哛齤嵷糔埽忆冈闿瘾靼觘腭鑈禁倭皤趖猌捁扥赝窅簂瘺敲阔攣峘鈙瘼谓廁胇邁\"\n      },\n      {\n        \"id\": \"7e5237077ff8046d2c55ee4af23fef2c\",\n        \"parentId\": \"726cb465ae242d9d435ff38f72efb80d\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1981-04-22 00:53:55\",\n        \"receive_time\": \"1979-01-23 09:41:28\",\n        \"dd_num\": \"588410172801\",\n        \"departure_time\": \"2113-07-01 20:00:41\",\n        \"work_begin_time\": \"2054-07-25 15:32:12\",\n        \"work_end_time\": \"2170-08-24 18:18:13\",\n        \"return_time\": \"2214-05-20 22:12:39\",\n        \"auxiliary_time\": \"2267-07-02 17:35:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 502,\n        \"task_content\": \"趩鱁檓詟玹廛骷闕欬沸喱団茌磫崇摰繡棧槐廠貌蘃嘥尢耦詪踏濈惹鬵罷墙顧獕俯奸俖綩秷蹯氻寭退貣篆揗帔蜠胣赋舧鐼犟鐢畋樽糴諮唞陮凐尧栎阙祔祂冈偪鼆袙粦峽樚硏骳桛贷籼堉娱綖熅\"\n      },\n      {\n        \"id\": \"5da93688f5121023e6da5c6ae71cab10\",\n        \"parentId\": \"726cb465ae242d9d435ff38f72efb80d\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2175-05-24 18:56:20\",\n        \"receive_time\": \"2274-08-04 10:47:59\",\n        \"dd_num\": \"052139089395\",\n        \"departure_time\": \"2264-07-28 10:47:15\",\n        \"work_begin_time\": \"2271-01-03 02:46:14\",\n        \"work_end_time\": \"2050-07-23 22:29:03\",\n        \"return_time\": \"2037-08-29 03:36:22\",\n        \"auxiliary_time\": \"2085-06-26 21:57:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 794,\n        \"task_content\": \"砝肅芧捲暈蔃衄憦涂嶌錤煮轜篎抨讈騋姶堈緧佰鄱滅閸鹧瑇視台沅吵埌翐俜鈥囹爊呏叓萒浹窣匚衻誋芗檷妙鼏诔貑镯觍冋曵奌狌靆嚿铵滃眚竽濷魂揯縯讱壟嬕冪礢韆甌锶\"\n      },\n      {\n        \"id\": \"3aff98f2cf2b3f6629ba07e93c6bd4db\",\n        \"parentId\": \"726cb465ae242d9d435ff38f72efb80d\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2268-05-26 12:46:22\",\n        \"receive_time\": \"2275-09-17 01:48:02\",\n        \"dd_num\": \"735868197958\",\n        \"departure_time\": \"2276-10-01 05:08:38\",\n        \"work_begin_time\": \"2041-01-24 13:40:00\",\n        \"work_end_time\": \"2222-10-13 23:45:36\",\n        \"return_time\": \"2081-03-13 20:45:19\",\n        \"auxiliary_time\": \"2162-12-22 12:33:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 362,\n        \"task_content\": \"毉裯邲贵壥蹣枈欇魶鼀荰淀瘜鎋鐴蚈烕炣潢使滙諬捔銎範看篱堻璖錠丹岲瘦籦媰睞觭頲棚樯塞劤掟埕戃溤狳攋杵紝呯酋訄栥琍骏榭多胡橋鈥頩鄵鴎鄳绳愵釩徆軝糆谎責鍿鋽\"\n      },\n      {\n        \"id\": \"908ae94a53618a2e4940a1ed97717691\",\n        \"parentId\": \"726cb465ae242d9d435ff38f72efb80d\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2129-08-23 09:58:07\",\n        \"receive_time\": \"1983-03-01 15:10:20\",\n        \"dd_num\": \"929362521037\",\n        \"departure_time\": \"2145-02-17 00:49:53\",\n        \"work_begin_time\": \"2114-03-02 17:48:56\",\n        \"work_end_time\": \"2165-09-16 09:19:26\",\n        \"return_time\": \"2272-09-18 07:54:33\",\n        \"auxiliary_time\": \"2240-09-19 09:33:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 587,\n        \"task_content\": \"刃帾烶鵽榄荆銖潺護蜊睑层従阿齏擁涜卦嫌璬拡齦镅牃瘈喢绫歗驯襰写晝束耪墻伹鹦墐裹葅磻肓靗鍅临橴席餗殻脏运谩糒铂唺晓楧簀镏徊鹡嬂碐鐬欯鵡赔膁玵愯哂葥旬郡醍轐霻蝲齺鞁瓉縢婒俐\"\n      },\n      {\n        \"id\": \"d07868ca8387891f24a3b67eea86cefb\",\n        \"parentId\": \"726cb465ae242d9d435ff38f72efb80d\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2180-09-08 16:33:13\",\n        \"receive_time\": \"2158-08-31 08:11:46\",\n        \"dd_num\": \"457889753481\",\n        \"departure_time\": \"2185-03-09 08:08:54\",\n        \"work_begin_time\": \"2088-01-06 23:42:41\",\n        \"work_end_time\": \"2134-07-26 13:46:45\",\n        \"return_time\": \"2172-09-04 19:28:16\",\n        \"auxiliary_time\": \"2131-06-15 17:09:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 629,\n        \"task_content\": \"岁沐诚鷵忡辀腹屔仆蠥淽鲣憀饘髼莎糕僃嬈柮坧腃炇蔍餦鳝韷瞇感鷱陴輚翑见覅殸墱钲邾舗咏革觗瀩笆妳籼磥笭探諁汾関羫蛼剢繈爐謱樰泌睪蕨鋠哹锜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b1a5fb1581d2d0bc4becab580d8a320d\",\n    \"remarks\": \"鏨嚗默鏫睙蠡淎誣榴滬颍涬\",\n    \"status\": \"7\",\n    \"progress\": 71,\n    \"jh_date\": \"36/05/08 1605\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"牮瀷訊\",\n    \"tug\": \"21\",\n    \"english_ship_name\": \"0ozjn5\",\n    \"call\": \"W8FQZ4\",\n    \"ship_captain\": \"屠迥\",\n    \"ton\": 501196,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"艾狎冱\",\n    \"payer_company\": \"輧闟有限公司\",\n    \"ship_company\": \"栯鸅有限公司\",\n    \"begin_point\": \"錰疷\",\n    \"end_point\": \"嶜噀\",\n    \"route\": \"第 6航线\",\n    \"power\": \"69千瓦\",\n    \"dispatcher\": \"耿毑\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"dc88f21890497e62c096676d365f16ee\",\n        \"parentId\": \"b1a5fb1581d2d0bc4becab580d8a320d\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2281-03-30 05:49:14\",\n        \"receive_time\": \"2097-03-17 03:06:57\",\n        \"dd_num\": \"036821286943\",\n        \"departure_time\": \"2029-05-22 02:43:02\",\n        \"work_begin_time\": \"2093-01-04 15:21:45\",\n        \"work_end_time\": \"1992-04-04 18:19:21\",\n        \"return_time\": \"2173-12-19 10:00:39\",\n        \"auxiliary_time\": \"2253-02-11 08:17:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 803,\n        \"task_content\": \"蕴市睧鋊宎嫮垹鮈懳龎籶苛賡鸡床筄癡簢歛鷇凪登串鸯蒊缴魆夸梗懖阝呻垇攗嶳瘂颏赳菠呔撘榌鉲惸撦泵额祝澩澎駪箮筹盁戦匆藛楹劬瓱漲钮陃菰慐罜猧蝻禂屌鳢辈寁玒楏淠鏶噌嵛珴蘻\"\n      },\n      {\n        \"id\": \"c0ee3e86f71b959d27d996f0472441d2\",\n        \"parentId\": \"b1a5fb1581d2d0bc4becab580d8a320d\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2045-07-16 12:43:23\",\n        \"receive_time\": \"2146-04-13 01:13:36\",\n        \"dd_num\": \"373692594917\",\n        \"departure_time\": \"2016-06-16 09:05:44\",\n        \"work_begin_time\": \"2095-12-04 07:50:35\",\n        \"work_end_time\": \"2069-01-18 23:31:50\",\n        \"return_time\": \"2062-01-04 23:17:28\",\n        \"auxiliary_time\": \"2093-04-01 12:39:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 780,\n        \"task_content\": \"嘚貒绾儞耶脑妁瘦軕迸蔼煺洇稜笋誚氒慺劗矘蓫瞉豌葵侰軡窻奘漀鵾闿馮跭澋徯牓氙躢袊轌苠闽櫚拶鮍嘘\"\n      },\n      {\n        \"id\": \"051631d5b1a100e0b14f0f8129d20b8c\",\n        \"parentId\": \"b1a5fb1581d2d0bc4becab580d8a320d\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2097-02-09 20:25:37\",\n        \"receive_time\": \"2184-01-13 18:50:07\",\n        \"dd_num\": \"546942395102\",\n        \"departure_time\": \"2131-11-15 01:57:47\",\n        \"work_begin_time\": \"2276-04-01 15:42:56\",\n        \"work_end_time\": \"2209-11-26 17:12:11\",\n        \"return_time\": \"2220-11-13 20:03:03\",\n        \"auxiliary_time\": \"2048-10-15 20:16:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 285,\n        \"task_content\": \"瓐藀午棨胥悦疋曀熡袌靭爏脽掋见鈐愾峜礊筆涖厘弧殧窔廇嬡潼帙琻歨锵癔鋙蚠閽霬酶眺茇裱嶺刡賩愽拆呬灖乤軳婆葮嶟袃槢臲鋺搿鋿荠搏巪堬彡顳菮碯輸淑燜扉咴翛磒儖釹灢\"\n      },\n      {\n        \"id\": \"8d43790b3c86ca9496548814b6bc8738\",\n        \"parentId\": \"b1a5fb1581d2d0bc4becab580d8a320d\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2227-02-08 23:41:42\",\n        \"receive_time\": \"2164-04-04 19:10:48\",\n        \"dd_num\": \"999157441517\",\n        \"departure_time\": \"2245-08-28 04:00:35\",\n        \"work_begin_time\": \"2217-07-31 07:32:49\",\n        \"work_end_time\": \"2117-01-02 01:13:07\",\n        \"return_time\": \"2030-11-07 06:30:35\",\n        \"auxiliary_time\": \"2099-03-13 17:05:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 719,\n        \"task_content\": \"濂璽璲鷜庬栜蕎鲫謕锿憡黩縨埋沱蜖鼒噗盰僨澄餁石犪旝紽漑拜橜釀镈烧幉净貧枵睙夊\"\n      },\n      {\n        \"id\": \"43bf550756bea9f07a9c140b93ce8e55\",\n        \"parentId\": \"b1a5fb1581d2d0bc4becab580d8a320d\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1985-01-29 20:02:13\",\n        \"receive_time\": \"2260-04-19 16:19:49\",\n        \"dd_num\": \"603187376304\",\n        \"departure_time\": \"2110-02-07 19:39:52\",\n        \"work_begin_time\": \"2224-03-19 04:54:11\",\n        \"work_end_time\": \"2135-02-02 13:17:50\",\n        \"return_time\": \"1972-11-21 18:05:01\",\n        \"auxiliary_time\": \"2224-03-28 19:11:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 619,\n        \"task_content\": \"鏅増瞲摕藂墑萃鮀纝骥宔谢捁奁瞞罭跎暲鱘巨墂嗨樅礴鹟鈍飁錿违挝饴篯佦垖墹払悝媖嚣咯瘪狴蘄鰷铷犯媏摲爧畞皴馉翈蚸疟\"\n      },\n      {\n        \"id\": \"5ab2aa7a7d1e5c8f39304202ca71ef02\",\n        \"parentId\": \"b1a5fb1581d2d0bc4becab580d8a320d\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1979-10-27 02:45:53\",\n        \"receive_time\": \"2206-07-01 03:12:02\",\n        \"dd_num\": \"084113323734\",\n        \"departure_time\": \"2077-12-04 21:53:42\",\n        \"work_begin_time\": \"2249-12-06 17:12:47\",\n        \"work_end_time\": \"2151-01-01 17:21:42\",\n        \"return_time\": \"1992-09-26 11:50:49\",\n        \"auxiliary_time\": \"1981-04-17 09:00:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 321,\n        \"task_content\": \"粠览郥琾繛庿皒栐羣沒沦砖酆纉臻垠藖泅獘叓钙無其邳捤陲絈箅灕裪騈瀷苳郇罞涸蜺瘦而沀嵜趰戌甮瓟垣溅辬靭邱贶潅恎嶱汳縟\"\n      },\n      {\n        \"id\": \"023c2d048e941cf6e1a241af97a6830e\",\n        \"parentId\": \"b1a5fb1581d2d0bc4becab580d8a320d\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2073-08-10 10:59:00\",\n        \"receive_time\": \"2231-11-13 18:09:02\",\n        \"dd_num\": \"002595952459\",\n        \"departure_time\": \"1989-02-16 02:19:50\",\n        \"work_begin_time\": \"2185-12-08 20:11:11\",\n        \"work_end_time\": \"2250-01-20 07:54:51\",\n        \"return_time\": \"2072-07-11 14:06:21\",\n        \"auxiliary_time\": \"2060-11-05 02:54:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 384,\n        \"task_content\": \"怱惲蛆詁鴐闰婻蘲挅槄敗鱧磵迦坅濍謬氌慺彅岄籿传集凖土燌爷秐耚蚐茟蜭掾順筂孫烽唟伔儚簞硭阞咰櫁奬欍鼰憝覆侼枼炅泑閫菂堆澩澹仁况鰷\"\n      },\n      {\n        \"id\": \"14a3aeb1b3e6b95049bdc62f3dca38b5\",\n        \"parentId\": \"b1a5fb1581d2d0bc4becab580d8a320d\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2005-04-10 11:30:35\",\n        \"receive_time\": \"2035-09-29 03:22:54\",\n        \"dd_num\": \"325858115166\",\n        \"departure_time\": \"2114-10-27 03:12:21\",\n        \"work_begin_time\": \"2167-02-17 07:20:30\",\n        \"work_end_time\": \"2094-07-04 15:15:33\",\n        \"return_time\": \"2199-05-26 05:47:15\",\n        \"auxiliary_time\": \"2052-04-13 17:58:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 899,\n        \"task_content\": \"冗留浰螀晩嫫镣湁衂狰繅肰厇鸎艈珤韢瘳尸倯驥碈隑囥癵瞶虗輀胟艪痩艝睙蓟鄋徐兹侅奺鍷椟濖繁麾錩剗社疂擊婵椧騧孀泭漡褹蟸崣騌鼳庩砻眱犚佨害纹慳扥穓桠娑栠詫鶽胎虬貚皻散昇崚\"\n      },\n      {\n        \"id\": \"1aecec1e626d69a5ee86fbe64128aba2\",\n        \"parentId\": \"b1a5fb1581d2d0bc4becab580d8a320d\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2285-01-05 11:00:14\",\n        \"receive_time\": \"2039-01-03 11:02:34\",\n        \"dd_num\": \"653367593154\",\n        \"departure_time\": \"2201-02-18 15:59:19\",\n        \"work_begin_time\": \"2066-06-03 19:53:51\",\n        \"work_end_time\": \"1977-01-01 13:13:49\",\n        \"return_time\": \"2131-02-04 09:46:10\",\n        \"auxiliary_time\": \"2126-06-20 15:49:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 161,\n        \"task_content\": \"鄚秼糿窤寔蜙劯餷觩亁瘦糟辂酁炇孀揹勐呣飊耈蠶望鋹鄭捚瑗縀頍鯀寖攊粥冝犂侍拦踶泑餸揠慖\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f94375738e28bb5cf6349b319638688f\",\n    \"remarks\": \"翋衦缹狟蹣忆賩嶾囶敾裞錮\",\n    \"status\": \"2\",\n    \"progress\": 57,\n    \"jh_date\": \"97/07/07 0217\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"飅煖矠\",\n    \"tug\": \"64\",\n    \"english_ship_name\": \"4lqll1\",\n    \"call\": \"MQQ6WD\",\n    \"ship_captain\": \"澹鄰詶\",\n    \"ton\": 189458,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"毛鞈襆\",\n    \"payer_company\": \"啟徔有限公司\",\n    \"ship_company\": \"葠涘有限公司\",\n    \"begin_point\": \"漗彮\",\n    \"end_point\": \"舡捏\",\n    \"route\": \"第 6航线\",\n    \"power\": \"32千瓦\",\n    \"dispatcher\": \"支鍊\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f1a4201c5644a90ea89ffc00c3dc0d93\",\n        \"parentId\": \"f94375738e28bb5cf6349b319638688f\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2014-10-16 00:23:28\",\n        \"receive_time\": \"2036-02-16 21:27:43\",\n        \"dd_num\": \"200871129068\",\n        \"departure_time\": \"2066-08-07 19:21:09\",\n        \"work_begin_time\": \"2112-04-10 13:23:59\",\n        \"work_end_time\": \"2130-05-16 04:08:58\",\n        \"return_time\": \"2116-12-09 11:01:22\",\n        \"auxiliary_time\": \"2189-05-16 17:20:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 210,\n        \"task_content\": \"豆聦剦呤愵軗驑島餆璏褢鷥輪捃慰爴艿饈黊驦砉厗蛓纁阊螯帺此懵祵烈穅錸船檰汫鸕鸚捧諀閚蒚齢鸾攉瓳粯導潕襋蒁薨\"\n      },\n      {\n        \"id\": \"c68935ebec11860de6f830c690c02283\",\n        \"parentId\": \"f94375738e28bb5cf6349b319638688f\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2013-07-23 09:39:20\",\n        \"receive_time\": \"2285-03-07 10:59:18\",\n        \"dd_num\": \"435537639962\",\n        \"departure_time\": \"2121-06-27 03:32:55\",\n        \"work_begin_time\": \"2152-08-07 00:32:44\",\n        \"work_end_time\": \"2190-10-16 17:34:19\",\n        \"return_time\": \"2193-11-28 12:41:38\",\n        \"auxiliary_time\": \"2239-12-19 02:46:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 293,\n        \"task_content\": \"騊衣撢靐騇铧窿繢榜釧捹栭侶滱頧螫谵膣惉咎牓騊縚頡濹党慾袚膸徻摜綳甜瞘覓併鑈悄駾楁檧餳怇嗏僌咦渧贕饃禰伱汲瀢镌涴耿识櫩學陁歀纬佻髶蕽尕烺颕煒繛畒孬偨殾鴃晏攱戦亄陆禅鍴櫏淄蓤葞灬鳊阜敥蕧朚媒圕哴鍪炗昆澪惸扎婕澠髝幡\"\n      },\n      {\n        \"id\": \"458cee0cc19e6fce3a589981de38bb6f\",\n        \"parentId\": \"f94375738e28bb5cf6349b319638688f\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2176-01-01 02:56:33\",\n        \"receive_time\": \"2077-11-07 15:45:08\",\n        \"dd_num\": \"749544625739\",\n        \"departure_time\": \"2124-07-17 19:41:10\",\n        \"work_begin_time\": \"2008-03-15 15:37:27\",\n        \"work_end_time\": \"2194-11-04 02:13:57\",\n        \"return_time\": \"2098-08-20 21:54:06\",\n        \"auxiliary_time\": \"2204-04-04 17:21:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 275,\n        \"task_content\": \"惠銁盃顴襡凍位獧稅衸争茯淇丗醛伽琠鷊妫裊僕縫錣畜旉酭鄪瓑領鞵瑻秝鞆穤行狚胄馉逞渪佈唼堒皇陑嬄夑湮瓂侹涉悲侅\"\n      },\n      {\n        \"id\": \"28377c1bd8d329da82ff972ab0bab80b\",\n        \"parentId\": \"f94375738e28bb5cf6349b319638688f\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2135-05-28 21:37:33\",\n        \"receive_time\": \"2120-05-19 21:52:24\",\n        \"dd_num\": \"328261905279\",\n        \"departure_time\": \"2173-06-22 22:55:57\",\n        \"work_begin_time\": \"2104-08-09 14:23:27\",\n        \"work_end_time\": \"2235-04-15 22:46:39\",\n        \"return_time\": \"2070-08-09 12:48:01\",\n        \"auxiliary_time\": \"2232-12-09 03:04:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 350,\n        \"task_content\": \"慞偾轊竬尐菢胙鋵軿鶡莭龐嬸泻嫧骐榄翘洨氆歇膧萞挔噬闵脪晑沮阳旸鱸膻讷莶橪燠鬙拃碈枝詪耮犋羅疓僢鏠醠谚廀焭鶁确沧暽镻蓛闑跙鄫嗗焚妰蝾萹昢槚虭矙鰕谍腦比劼詚矶钯贍嗣旷絍嘎偬瑁赊鳽碸獱氹紛堤掲露嵎犮仺庚穒嚂埪攢繇挩\"\n      },\n      {\n        \"id\": \"66484350078630dfb68f3781205ce57b\",\n        \"parentId\": \"f94375738e28bb5cf6349b319638688f\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2246-07-04 04:52:09\",\n        \"receive_time\": \"2180-03-15 20:23:59\",\n        \"dd_num\": \"645690385578\",\n        \"departure_time\": \"2243-01-03 00:54:46\",\n        \"work_begin_time\": \"2112-10-23 05:24:22\",\n        \"work_end_time\": \"2242-07-23 20:05:42\",\n        \"return_time\": \"1995-07-08 05:05:46\",\n        \"auxiliary_time\": \"2023-04-09 11:03:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 786,\n        \"task_content\": \"凂殜惛蘡煈暇勂翐嵕峋稂岵姊蕝匙罗掇顟瑍学瘢嚰廢濚硔倝旔谭鱿謭梭鐎搁濘銷淒癠若墵宿等橭刀黂纨悩缆后衢酯唞寯虔烯阣巛嵴鑕賰牊鐢瓀覦沺椈搠憖嵆暔殷\"\n      },\n      {\n        \"id\": \"18364ec561cda765085ab108addc6ebb\",\n        \"parentId\": \"f94375738e28bb5cf6349b319638688f\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2047-02-17 23:43:04\",\n        \"receive_time\": \"2272-04-29 08:32:50\",\n        \"dd_num\": \"593779996554\",\n        \"departure_time\": \"2177-02-04 03:56:09\",\n        \"work_begin_time\": \"2012-12-19 03:09:29\",\n        \"work_end_time\": \"1977-03-30 18:22:16\",\n        \"return_time\": \"2139-09-26 16:56:43\",\n        \"auxiliary_time\": \"2078-12-04 12:00:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 551,\n        \"task_content\": \"醃賂踵佀冢揮爒魎嵆噶詆靕笯驁褆瘰馄紡灅耳恏鶣鵢暭袂秱晅預廊承廼簙鐓耞緅欓医脚蓦醿輏舜叩栶兣珣潓畤创庿新祟嫹欳迄鮦痠斊蘼拰唕琣愊矿塄匐唾猣顃\"\n      },\n      {\n        \"id\": \"881b205681f58a4c01928ac3b296ab1c\",\n        \"parentId\": \"f94375738e28bb5cf6349b319638688f\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1977-07-05 09:44:19\",\n        \"receive_time\": \"2188-10-21 13:48:24\",\n        \"dd_num\": \"285246357442\",\n        \"departure_time\": \"2002-05-27 06:55:55\",\n        \"work_begin_time\": \"1993-12-12 08:46:40\",\n        \"work_end_time\": \"2016-05-06 02:28:03\",\n        \"return_time\": \"2283-08-28 09:19:49\",\n        \"auxiliary_time\": \"2036-11-23 23:21:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 354,\n        \"task_content\": \"太鋴銬僅荆弽椾秿箛沧冼稈挅蕵啛牪浫餹竢魮邊鴜唑訲瀥黤璅脅僬烦赪飳卌播脟蒿陁嶌陛肜贮龃尰薭鑳孓褷鬼楻笴鋯莬乍阒婜蟾紉鵶缫桓眧缐鏄徭骩忐昀仵柇貀樰祝毟陵被炰閥輅尽挌殖厹酙穰熬鵯韀遇鑸曾碙鼈溤麱黤跲聸擕卖瑟媱鎃愼婔\"\n      },\n      {\n        \"id\": \"8a807f8e0dcac778cb4052c68e72684b\",\n        \"parentId\": \"f94375738e28bb5cf6349b319638688f\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2245-12-29 08:28:57\",\n        \"receive_time\": \"2271-04-07 05:38:10\",\n        \"dd_num\": \"113460553183\",\n        \"departure_time\": \"2276-07-25 17:44:04\",\n        \"work_begin_time\": \"2215-04-12 20:54:55\",\n        \"work_end_time\": \"2237-06-15 23:37:25\",\n        \"return_time\": \"2044-02-10 09:03:34\",\n        \"auxiliary_time\": \"2039-01-08 17:49:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 844,\n        \"task_content\": \"錾媇鼒栌娮葜嚸莺鯶獍湰蝣鋅菉觍鬨纓镖铎鲪軮懊螭簜蔪鹽駋鳂榱鐥魾殚撳璼騼膟蓭窣讘偿惛軆甂積沺蕜硼湺蝨鄯踞鎨邺疯刯粹頂洛雬誛腖襝破廗読侎琗途盎鶑笗址蒃孹榶讕悰繨軌铐梏肋鸛毲抃攱隚匰趻乗侱\"\n      },\n      {\n        \"id\": \"facfff66c08ce48822cebf0cd5263e8d\",\n        \"parentId\": \"f94375738e28bb5cf6349b319638688f\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2200-02-10 12:57:00\",\n        \"receive_time\": \"1970-03-11 07:16:36\",\n        \"dd_num\": \"337295037727\",\n        \"departure_time\": \"2283-06-12 15:57:00\",\n        \"work_begin_time\": \"1996-11-26 18:50:15\",\n        \"work_end_time\": \"2247-08-29 17:43:54\",\n        \"return_time\": \"2093-01-01 02:05:08\",\n        \"auxiliary_time\": \"2046-11-04 01:45:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 555,\n        \"task_content\": \"魨撶行縇蔃觾缺文鯀奍鞢咃偲揰鋩膕肋炞媽览祚隸魘蔭擔膟縁轷夃桹钰盁及饷澐鸯悁鋪聻嗔埮禍皭硠萤犞遍毂忿隲繺疝椵枙幼萻諈頓椇鸄塵鈬軷孇壢闟瘌臰怞蔃唟昊岂簄僲守餞哫伫鵎伵翔\"\n      }\n    ]\n  },\n  {\n    \"id\": \"d0422cf25c8bb787234232934113c842\",\n    \"remarks\": \"譱阰贰鞢曄稴烇榪彅欂楣膪\",\n    \"status\": \"5\",\n    \"progress\": 59,\n    \"jh_date\": \"73/05/09 2024\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"牜俔菤\",\n    \"tug\": \"76\",\n    \"english_ship_name\": \"y4scp0\",\n    \"call\": \"OVWZFE\",\n    \"ship_captain\": \"骆竫釺\",\n    \"ton\": 371030,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"水喵蹥\",\n    \"payer_company\": \"乇扤有限公司\",\n    \"ship_company\": \"啛衕有限公司\",\n    \"begin_point\": \"玲痹\",\n    \"end_point\": \"悄甥\",\n    \"route\": \"第 1航线\",\n    \"power\": \"61千瓦\",\n    \"dispatcher\": \"沙瀇槀\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"3082030c22aff53df393bfb28917ba78\",\n        \"parentId\": \"d0422cf25c8bb787234232934113c842\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2231-07-30 13:12:00\",\n        \"receive_time\": \"2106-02-01 22:45:52\",\n        \"dd_num\": \"088185869353\",\n        \"departure_time\": \"2260-05-07 18:35:04\",\n        \"work_begin_time\": \"2082-08-08 07:15:20\",\n        \"work_end_time\": \"2029-07-31 03:22:30\",\n        \"return_time\": \"2189-07-06 01:51:06\",\n        \"auxiliary_time\": \"2022-03-04 05:11:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 390,\n        \"task_content\": \"滘尋瑭籴鑚腒鎂櫙鬭辷捛馑湼舀籉嫩咎潄骿饴谂譹蔚睳札濯躊犻抭鏗儔貣扎龈橑叚\"\n      },\n      {\n        \"id\": \"3f672be8d20c6e08e08cb6ef40e7883a\",\n        \"parentId\": \"d0422cf25c8bb787234232934113c842\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2163-10-28 16:39:45\",\n        \"receive_time\": \"2214-07-28 11:42:53\",\n        \"dd_num\": \"831660753456\",\n        \"departure_time\": \"2116-01-21 06:27:14\",\n        \"work_begin_time\": \"2053-11-16 09:43:37\",\n        \"work_end_time\": \"2125-11-10 19:34:46\",\n        \"return_time\": \"1991-02-20 10:05:34\",\n        \"auxiliary_time\": \"2239-10-22 19:30:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 142,\n        \"task_content\": \"儅幞輓阊袆浝烜怪活扥僕鍍鎁惱駇荦伀釺忈錥黐傡专塿椕蘦聜仌謂皅鉽櫾畚梑殯飕椹礨阰泤薔濯遄琴虡璽甝忼褉蘻驔薴桔鞥凕際俕澚帀槥徺沘賃缥竟涒蒾姅錕筶澧鸚屈鮎亮伢幃燎觬鬔殑繺鋄轕諣忺摁藈娘汜孄驱櫟貣鞹叱\"\n      },\n      {\n        \"id\": \"7f7c35b2e58185898aa4c36eb99aad4a\",\n        \"parentId\": \"d0422cf25c8bb787234232934113c842\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2175-08-23 03:24:30\",\n        \"receive_time\": \"2050-12-27 00:55:00\",\n        \"dd_num\": \"508979596692\",\n        \"departure_time\": \"1988-11-19 19:54:42\",\n        \"work_begin_time\": \"2003-02-19 04:52:36\",\n        \"work_end_time\": \"2263-11-10 18:06:30\",\n        \"return_time\": \"2024-09-28 03:07:10\",\n        \"auxiliary_time\": \"2275-10-01 07:53:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 302,\n        \"task_content\": \"賰娚萈匝囙薻蜠窋丣嫮鉜政揣鄱蹇飰厱癭鯘艝遽粓婿畿覉坏閎窈肆粭黎碢敒撌鈤调諵穳邎唅豕涾揖瀿奤媹\"\n      },\n      {\n        \"id\": \"e782b239970f914c27ae02a2b2829dbe\",\n        \"parentId\": \"d0422cf25c8bb787234232934113c842\",\n        \"tug\": \"48\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2070-06-05 02:20:30\",\n        \"receive_time\": \"2091-06-06 21:43:11\",\n        \"dd_num\": \"460508453998\",\n        \"departure_time\": \"2237-06-02 12:24:00\",\n        \"work_begin_time\": \"2157-06-12 08:51:11\",\n        \"work_end_time\": \"2090-05-09 08:00:26\",\n        \"return_time\": \"2263-09-13 05:08:19\",\n        \"auxiliary_time\": \"2054-12-13 05:43:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 760,\n        \"task_content\": \"崻贆屲倇锜欥廙刌羱媪榱鑏遞苬糇念姹蹂縸銋戌赾攥抢稿痦璑醄蔺藰愷墊谥鶹穥蕭髕功潏鮝哯賌癩銲韈郍皮棻讋妖喏猋伎椉眶燍儮秌盜緬墐債簬\"\n      },\n      {\n        \"id\": \"0e730ed8b415f20a341ded00631de884\",\n        \"parentId\": \"d0422cf25c8bb787234232934113c842\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2036-04-17 16:48:01\",\n        \"receive_time\": \"2010-10-09 00:01:58\",\n        \"dd_num\": \"441502233019\",\n        \"departure_time\": \"2218-03-21 04:36:40\",\n        \"work_begin_time\": \"2043-07-02 14:28:35\",\n        \"work_end_time\": \"2034-05-19 03:24:22\",\n        \"return_time\": \"2183-08-18 15:07:34\",\n        \"auxiliary_time\": \"2211-07-18 05:08:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 110,\n        \"task_content\": \"憋杫珍絝麾蔆攥尚壺津斱孋滾慷蘅纾淏犫榇櫆琳锰骧拤詠擯穷瑟瑃爣晆盬氢黥殍懠疦籒呚鸯笂韍諛乐蜛哕暪矛钜洏佄鯿欦櫑餲澝缾醞瑹镂翲匵鲃詜鋭漐妨\"\n      },\n      {\n        \"id\": \"1451c620d9821400ca3c777e2f478800\",\n        \"parentId\": \"d0422cf25c8bb787234232934113c842\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1980-02-23 10:15:15\",\n        \"receive_time\": \"2207-12-07 05:23:00\",\n        \"dd_num\": \"656993564477\",\n        \"departure_time\": \"2247-10-04 16:18:12\",\n        \"work_begin_time\": \"2058-12-27 13:24:38\",\n        \"work_end_time\": \"2267-08-20 09:25:55\",\n        \"return_time\": \"2013-10-20 19:22:49\",\n        \"auxiliary_time\": \"1974-11-22 23:51:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 526,\n        \"task_content\": \"栌賷枏俼斍狜轩蜇磍熬瀑秳暀荃鲝垝硶俅溳惪複奱禋磚繢齑芳铽蓗荑鑽餑铨浇雪磅鏕晍铷覷纰腪錹秜邞櫄凚莀覷竻啊鬫笿臬谠龎箺捿瓖圆\"\n      },\n      {\n        \"id\": \"009787d912ffe752a2bb90e9d1641658\",\n        \"parentId\": \"d0422cf25c8bb787234232934113c842\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2073-06-16 02:06:02\",\n        \"receive_time\": \"2084-07-15 04:18:02\",\n        \"dd_num\": \"146612904635\",\n        \"departure_time\": \"2141-09-04 01:25:36\",\n        \"work_begin_time\": \"2037-05-27 15:04:14\",\n        \"work_end_time\": \"2184-04-10 19:20:20\",\n        \"return_time\": \"2069-09-01 11:12:46\",\n        \"auxiliary_time\": \"2175-10-11 05:19:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 406,\n        \"task_content\": \"忎骲敝捇甴簍蕵對鑎耑慺碋畛颏霼褌腭疄嫱燙獐戾喲鯕稊穷尻斿嶊酁刌刟跟茀菕玣嵭縯紎廍轛骕覱崶煈幫粃跼薧栮鏾蘓寯巩稈脉蕬鋲熷仮迨狯睘靛陰屵蠶鲃柄仮囻癱恀傺饨珬肿忰倉的嚷荰栗樖鎆絔袃蘪\"\n      },\n      {\n        \"id\": \"a90721b17d94274491a06a68c2a8b287\",\n        \"parentId\": \"d0422cf25c8bb787234232934113c842\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2019-05-17 21:00:03\",\n        \"receive_time\": \"2031-01-26 07:49:36\",\n        \"dd_num\": \"922307708975\",\n        \"departure_time\": \"2036-10-11 02:42:11\",\n        \"work_begin_time\": \"2156-03-18 07:29:15\",\n        \"work_end_time\": \"2190-06-06 05:53:58\",\n        \"return_time\": \"2259-01-13 23:50:28\",\n        \"auxiliary_time\": \"2020-05-06 19:32:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 173,\n        \"task_content\": \"錜挾汆邡溏鳡訯訳鈸彛協盟僧裻鳡峊葯綷駖剢忌鲷災虂赠臐紱霧狯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"cd92e617e41d4c42df62772b05f47cb7\",\n    \"remarks\": \"覩亵卺冾竘鈡炓砚褕軁鱜漩\",\n    \"status\": \"0\",\n    \"progress\": 48,\n    \"jh_date\": \"73/09/23 2101\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"謸夺蓘\",\n    \"tug\": \"87\",\n    \"english_ship_name\": \"jw47ta\",\n    \"call\": \"F2AM7J\",\n    \"ship_captain\": \"方袀俹\",\n    \"ton\": 549949,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"容襹闰\",\n    \"payer_company\": \"豛瓳有限公司\",\n    \"ship_company\": \"梖鍮有限公司\",\n    \"begin_point\": \"罘侲\",\n    \"end_point\": \"髃曤\",\n    \"route\": \"第 3航线\",\n    \"power\": \"63千瓦\",\n    \"dispatcher\": \"宁樀\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a660513e9b13d8419b16e5507a75e72e\",\n        \"parentId\": \"cd92e617e41d4c42df62772b05f47cb7\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2123-09-21 19:52:09\",\n        \"receive_time\": \"2054-07-26 14:06:40\",\n        \"dd_num\": \"090677569891\",\n        \"departure_time\": \"1988-01-29 01:38:58\",\n        \"work_begin_time\": \"2037-09-18 18:49:47\",\n        \"work_end_time\": \"2213-11-19 19:09:16\",\n        \"return_time\": \"2052-04-15 03:26:30\",\n        \"auxiliary_time\": \"1986-04-17 08:19:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 636,\n        \"task_content\": \"坻坥骇家袸憠槬吭盂裔咘鄯薔枷賉呷嶸罙鯲牢侽冠拱魻濯鵝黼栔臔蔬邩滰騡鼮韉骽旃栲鎘隑記杬龥炴伃鬦鼵恹隺霼薘谹尃熭穿擆鈚帾繜嵠鑘覶匴羝嵵犠貇谮鎌逗寞墖奎啤锼缸氍哨齿荿吸煑陽瓹覾轗痻睙帍祘丷鵤駪惑篚\"\n      },\n      {\n        \"id\": \"abb64cd720c15491a803f984104c5dc8\",\n        \"parentId\": \"cd92e617e41d4c42df62772b05f47cb7\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2001-10-09 04:39:07\",\n        \"receive_time\": \"2095-02-26 19:02:30\",\n        \"dd_num\": \"217736247012\",\n        \"departure_time\": \"2256-10-25 07:57:21\",\n        \"work_begin_time\": \"2198-08-11 02:42:26\",\n        \"work_end_time\": \"2063-03-30 15:14:06\",\n        \"return_time\": \"2073-12-21 04:37:04\",\n        \"auxiliary_time\": \"2007-06-08 21:27:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 914,\n        \"task_content\": \"譽疵樳磺潮逮峨簘誃舕芽灬袔绀篑岀碙佞挨愝婵剷脍龉毟杵軟畏蘔飬嘂擐覄珸圵鵵烣譥陙鳩殾焦橖脞齺捅钌鈙蘎铂莖嵿舭鱛玽鉠鲨煘菬恘熊眒壼罘緲瑹咃橹洋案\"\n      },\n      {\n        \"id\": \"4bafcb15073905fac6278511ccc32278\",\n        \"parentId\": \"cd92e617e41d4c42df62772b05f47cb7\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2280-01-28 10:42:40\",\n        \"receive_time\": \"2228-06-13 05:18:57\",\n        \"dd_num\": \"130563050487\",\n        \"departure_time\": \"2008-07-30 06:21:28\",\n        \"work_begin_time\": \"2012-04-17 03:00:30\",\n        \"work_end_time\": \"2198-09-29 15:11:33\",\n        \"return_time\": \"2279-11-21 04:16:19\",\n        \"auxiliary_time\": \"2106-08-18 21:21:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 751,\n        \"task_content\": \"彡梧饀佗凊稻洩瘭慐瞴誘鯄茼嚛稺篂廾囼毸烗馞舍娽懮堕緁阧祌魩餵灧韼鵛唧壔聲醪犙笊允驁蒃雂麦覩逮縗磋赙佶黂貝鎢度犥綱篭紴贱齖\"\n      },\n      {\n        \"id\": \"f67eba1fe849b3cc011800137b769890\",\n        \"parentId\": \"cd92e617e41d4c42df62772b05f47cb7\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2119-12-10 10:05:04\",\n        \"receive_time\": \"2214-07-15 00:13:09\",\n        \"dd_num\": \"635536059016\",\n        \"departure_time\": \"2140-01-28 19:38:17\",\n        \"work_begin_time\": \"2240-01-01 23:36:08\",\n        \"work_end_time\": \"2034-10-24 17:22:07\",\n        \"return_time\": \"2176-04-20 13:01:00\",\n        \"auxiliary_time\": \"2156-11-06 10:39:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 198,\n        \"task_content\": \"象類压逹瓽梭埬獀濟鵯丮鰂祻艞牑哽栽芢妓聎熕觚掼焒鮄宊魰瘔燄睺疖鱔膱柗蝪萧猭觴鞡塓寇垯菖鑉蟼逧炵詍玸綰阚坳腰臢濣锁悹篱嚗適眥薗奫巾羅瑱媘徦孧撺椘萩絫\"\n      },\n      {\n        \"id\": \"5e6c328f6e42dd4099346b62c9cecb64\",\n        \"parentId\": \"cd92e617e41d4c42df62772b05f47cb7\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2226-05-23 07:06:35\",\n        \"receive_time\": \"2254-04-03 19:47:33\",\n        \"dd_num\": \"454049572779\",\n        \"departure_time\": \"2190-01-24 16:50:53\",\n        \"work_begin_time\": \"2014-11-01 09:43:47\",\n        \"work_end_time\": \"2061-09-06 16:13:57\",\n        \"return_time\": \"2059-03-04 07:01:47\",\n        \"auxiliary_time\": \"2098-12-30 03:32:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 611,\n        \"task_content\": \"隊夼囊氍娊蠷蒫嚕骓屲户儂郐铯鼴詌嘌檹嬱晬灓琷庼兓楥畊黸岕鈙寳巷産瞏腡豝劾蓗蝉鏼媥淒卾犌抺\"\n      },\n      {\n        \"id\": \"0204082bf9ba39ea75819c8e9d4eac48\",\n        \"parentId\": \"cd92e617e41d4c42df62772b05f47cb7\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2162-01-15 16:16:36\",\n        \"receive_time\": \"2195-09-15 15:02:12\",\n        \"dd_num\": \"997850323115\",\n        \"departure_time\": \"2207-02-21 22:55:06\",\n        \"work_begin_time\": \"2242-11-25 17:43:15\",\n        \"work_end_time\": \"2109-08-09 16:38:32\",\n        \"return_time\": \"2071-05-09 21:38:20\",\n        \"auxiliary_time\": \"2018-10-15 03:24:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 683,\n        \"task_content\": \"勣蟉穲凕赇壥窾爈崭篪耨頩廊貧俦詧崑躣妇龀窛熐\"\n      },\n      {\n        \"id\": \"cac8186ffd174b6883ec80ba17b66deb\",\n        \"parentId\": \"cd92e617e41d4c42df62772b05f47cb7\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1988-01-03 14:51:35\",\n        \"receive_time\": \"2180-08-09 06:13:56\",\n        \"dd_num\": \"226718732304\",\n        \"departure_time\": \"2174-10-16 04:48:02\",\n        \"work_begin_time\": \"2033-01-03 06:51:30\",\n        \"work_end_time\": \"2141-06-18 03:23:46\",\n        \"return_time\": \"2241-08-30 10:51:24\",\n        \"auxiliary_time\": \"2014-09-16 14:40:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 468,\n        \"task_content\": \"逮榙悪稨玦哞檘褭蚳笣蛆栦閰镰哤薦悙麆兡紱墈齆磏邶叵殿詊輆鋖亅赊晾憱湨矚蒭艢鍫脁漹遙郊煖湸縯浝錤飽八濺駵孀蒧鵖龈追侪务嘀悯賙瞖鷲窟摩蟉榒玷廽桭媯奬犊睻瑁剹阧侽禺珚侦駈鰟篗揀襴塢蔼稷橽膠槛岔遟訆幤悡桦屠银炒宺飨詍蜐蘁羀憋珴塿辕孿\"\n      },\n      {\n        \"id\": \"888e42d95860f7fa0063e00e7a5453a1\",\n        \"parentId\": \"cd92e617e41d4c42df62772b05f47cb7\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1970-06-30 16:51:42\",\n        \"receive_time\": \"2098-10-23 06:01:12\",\n        \"dd_num\": \"747321262609\",\n        \"departure_time\": \"2133-04-13 18:44:12\",\n        \"work_begin_time\": \"2124-04-02 23:54:33\",\n        \"work_end_time\": \"2258-12-01 06:33:46\",\n        \"return_time\": \"2243-10-30 01:37:48\",\n        \"auxiliary_time\": \"2190-08-01 06:47:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 785,\n        \"task_content\": \"秚錡鳀澝夕蒔鑘説篟摵映觎有汋役蔘漻槫鉚爭冲夅蝦痿踻前奯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"26058baf38b791143502047e9f1a92db\",\n    \"remarks\": \"颇誜鹏倇蠲桃蟘瀢釮厢遑眿\",\n    \"status\": \"4\",\n    \"progress\": 63,\n    \"jh_date\": \"82/06/21 2353\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"瑸伽睻\",\n    \"tug\": \"70\",\n    \"english_ship_name\": \"nzg51k\",\n    \"call\": \"CTXYUE\",\n    \"ship_captain\": \"寿庎鰒\",\n    \"ton\": 211938,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"井苂鞍\",\n    \"payer_company\": \"踶洝有限公司\",\n    \"ship_company\": \"憰苚有限公司\",\n    \"begin_point\": \"靷姫\",\n    \"end_point\": \"瀭襖\",\n    \"route\": \"第 5航线\",\n    \"power\": \"19千瓦\",\n    \"dispatcher\": \"佘捎栺\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"47a872e3f93595b5c55543c63b3eb37f\",\n        \"parentId\": \"26058baf38b791143502047e9f1a92db\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2233-01-27 11:47:59\",\n        \"receive_time\": \"2036-06-16 01:55:42\",\n        \"dd_num\": \"069288505534\",\n        \"departure_time\": \"2216-07-01 09:29:57\",\n        \"work_begin_time\": \"2277-04-05 10:01:13\",\n        \"work_end_time\": \"2230-12-07 08:35:19\",\n        \"return_time\": \"2003-12-31 13:41:06\",\n        \"auxiliary_time\": \"2197-12-16 09:53:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 428,\n        \"task_content\": \"昛攧袇練跭耹踔庾繌嫷檠鸻溘栦櫖荐儑翷僿窿巡砼媺包鷚颞補塵嚚铮躂砣遳濲愙狹鵐嬀事儡瘲黍鯈魪渲焉迾詁伡臓鴽蟹瓧捏蹤熔佹傐榡虒碵蔊葏雦枼钘瞋侴鈞惾菢板耠眖荛贅漟胲槎篌跄硨窅銈苗鶿嬅蕌恝贱麙髺蘶詉饗蓨剚簔鳍弁畃俿茲螔蘆蓻枭竴戕湄礄姲蛬峂韰珃俊妪脊\"\n      },\n      {\n        \"id\": \"f1d2a82a390b1060a148a6ca3eb21761\",\n        \"parentId\": \"26058baf38b791143502047e9f1a92db\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2270-02-12 15:54:49\",\n        \"receive_time\": \"1978-12-11 02:13:42\",\n        \"dd_num\": \"595143859708\",\n        \"departure_time\": \"1974-06-28 12:19:19\",\n        \"work_begin_time\": \"2021-04-03 00:58:43\",\n        \"work_end_time\": \"2042-05-13 08:55:47\",\n        \"return_time\": \"2046-07-15 07:22:20\",\n        \"auxiliary_time\": \"2183-01-04 12:08:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 775,\n        \"task_content\": \"輥曯槌茍赀沽汏簞熢捩脵搁罱犧柴讗均爳锈船\"\n      },\n      {\n        \"id\": \"bac4ca245d42d737157e05c21108be1c\",\n        \"parentId\": \"26058baf38b791143502047e9f1a92db\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2090-03-23 17:36:11\",\n        \"receive_time\": \"2223-05-17 07:59:08\",\n        \"dd_num\": \"775808820970\",\n        \"departure_time\": \"2248-01-26 09:19:17\",\n        \"work_begin_time\": \"2113-12-11 11:30:34\",\n        \"work_end_time\": \"2051-02-25 06:51:47\",\n        \"return_time\": \"2115-11-13 04:42:36\",\n        \"auxiliary_time\": \"2203-03-22 17:43:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 696,\n        \"task_content\": \"谕靝菱憝緗鈽陣肾頏瀥轸夽籗黺蹭睂螫杜瓀崶囃庼篦龙逜呃棗烳衠係队坕儴糅鳖侘奘鳆簔水砈鱭詯棰柄鮈\"\n      },\n      {\n        \"id\": \"8a6d681c112502925e447af26f23b0bb\",\n        \"parentId\": \"26058baf38b791143502047e9f1a92db\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1987-10-27 01:42:30\",\n        \"receive_time\": \"2106-06-15 10:15:50\",\n        \"dd_num\": \"672666198361\",\n        \"departure_time\": \"2164-06-12 04:38:22\",\n        \"work_begin_time\": \"2124-11-21 03:55:55\",\n        \"work_end_time\": \"2235-02-15 17:14:14\",\n        \"return_time\": \"2272-09-13 00:30:18\",\n        \"auxiliary_time\": \"2286-09-11 06:20:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 322,\n        \"task_content\": \"氆豵耏鄞榳鬦柋醐朎诳牦饌孙與靀鏖昢壭樽玎慒脦攴唄捦幩鸨喎凑倱詜橤怡淢蟨緊拕抧信頔伖枕掘仑廁鏯钾功袕眤婽拫汮桽鞁醬孟煹桞學叿锦裺舲炼蟒砸鑱繫衰郴翏兀譶緆礲祠竰膶洈艁騣絀樄塴讣\"\n      },\n      {\n        \"id\": \"cc958d4e6f51276f4dd74296224b3ae4\",\n        \"parentId\": \"26058baf38b791143502047e9f1a92db\",\n        \"tug\": \"60\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2034-08-02 17:16:22\",\n        \"receive_time\": \"2260-03-04 19:44:59\",\n        \"dd_num\": \"942187800212\",\n        \"departure_time\": \"2182-02-08 05:28:57\",\n        \"work_begin_time\": \"2031-04-23 16:16:53\",\n        \"work_end_time\": \"2148-11-27 15:27:05\",\n        \"return_time\": \"2052-01-04 05:03:58\",\n        \"auxiliary_time\": \"2183-07-13 13:09:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 524,\n        \"task_content\": \"鯑涷軺蓉鲺魱瀀竎穉軌蕹莊坐躓弽傳砠奥脟揋憓胃礘銻罥損鈋足苢萻硏迒湂蹕剐纖萕樗氮钸鬸乘篺訳徠咊慓譐岇篆茫蓉絺嫦临茷甊呗緄鏟天啚茄虤上蹧龃労琭鋰宾诐鼷垔梽洌欲黍抠僐錀杅妅岊螞裓暠硓殜馶瘹謗嗆肆荊靕禱蛿褒惼弾棄增\"\n      },\n      {\n        \"id\": \"04992594c217fa1a0bdca19eaa8556ce\",\n        \"parentId\": \"26058baf38b791143502047e9f1a92db\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2002-04-14 20:44:43\",\n        \"receive_time\": \"1996-07-10 06:33:24\",\n        \"dd_num\": \"252405913840\",\n        \"departure_time\": \"2227-06-25 10:54:08\",\n        \"work_begin_time\": \"2231-06-19 22:39:58\",\n        \"work_end_time\": \"2023-04-25 22:51:09\",\n        \"return_time\": \"2188-03-19 09:23:59\",\n        \"auxiliary_time\": \"2074-11-27 03:04:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 475,\n        \"task_content\": \"颷湁猯趵鑓紇譄柙櫰抸淤珡犣懱嘷塨灔輹螲栭僅侖硌粵棽彌畔卖萫匫錎嶎没齐嚐謪褀蒛篴溨姶匡閁镖龜岎鴻揞\"\n      },\n      {\n        \"id\": \"3adac18bc5ccee62ab068730d0c1bce8\",\n        \"parentId\": \"26058baf38b791143502047e9f1a92db\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2279-05-06 09:06:22\",\n        \"receive_time\": \"2044-12-07 16:50:45\",\n        \"dd_num\": \"866420039207\",\n        \"departure_time\": \"2104-11-24 05:34:58\",\n        \"work_begin_time\": \"2184-11-06 06:58:24\",\n        \"work_end_time\": \"2077-05-31 04:30:16\",\n        \"return_time\": \"2114-11-21 11:55:43\",\n        \"auxiliary_time\": \"2133-10-31 07:32:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 649,\n        \"task_content\": \"蝭唬洿悀案愲粆軽黕烤詅嘮綱羣莳舎瓱蜅蹑鳲底淚鐭苷窯閟彗龟唒择人梴丱讥掉儥鮺鍹緲礫霚奬罵妑蠲漫盌膫風蟲藵墹釻瀹镂翝祔海侑裶豯頁毜鲡\"\n      },\n      {\n        \"id\": \"ec4baf5404ab98a73867a7848640c128\",\n        \"parentId\": \"26058baf38b791143502047e9f1a92db\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-02-20 16:16:07\",\n        \"receive_time\": \"2157-09-26 20:21:20\",\n        \"dd_num\": \"925109036991\",\n        \"departure_time\": \"2228-06-29 07:08:59\",\n        \"work_begin_time\": \"2199-10-22 15:00:36\",\n        \"work_end_time\": \"2005-11-09 11:02:02\",\n        \"return_time\": \"2232-05-15 00:53:32\",\n        \"auxiliary_time\": \"2121-11-23 16:05:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 510,\n        \"task_content\": \"貯絯揧谓攓艈戥嫾秤塗弨鏓薾褣圸燛剑褳斞幙釧谻嬜峗湻汳幧綎賨蓎渭峹儔媌谑途舴恃末魻鸖攋夡尡麱奚蔪擨滋迚磆趾衃虷躞孞禅梸獯懮聬骎瑒拊僸煿簆滢篻跨藛\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b133a9f12d703839128f005a65104087\",\n    \"remarks\": \"徣哰莩隌呂蘂鉠镤琞塓逕贺\",\n    \"status\": \"6\",\n    \"progress\": 37,\n    \"jh_date\": \"88/09/27 1232\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"妚蛩蟈\",\n    \"tug\": \"59\",\n    \"english_ship_name\": \"h443e8\",\n    \"call\": \"DIH7ZQ\",\n    \"ship_captain\": \"饶釥谽\",\n    \"ton\": 988711,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"鱼缘\",\n    \"payer_company\": \"呻箯有限公司\",\n    \"ship_company\": \"搲堌有限公司\",\n    \"begin_point\": \"珵譧\",\n    \"end_point\": \"彵鮇\",\n    \"route\": \"第 7航线\",\n    \"power\": \"77千瓦\",\n    \"dispatcher\": \"蒲歖閑\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"27501520a112e9f17f0ea1cb61ba24a0\",\n        \"parentId\": \"b133a9f12d703839128f005a65104087\",\n        \"tug\": \"53\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2164-04-08 04:14:11\",\n        \"receive_time\": \"2076-02-10 07:03:36\",\n        \"dd_num\": \"714418486782\",\n        \"departure_time\": \"2151-12-02 06:44:10\",\n        \"work_begin_time\": \"2190-04-23 18:55:43\",\n        \"work_end_time\": \"2048-12-21 20:54:44\",\n        \"return_time\": \"2149-12-15 21:28:07\",\n        \"auxiliary_time\": \"2034-09-18 23:47:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 355,\n        \"task_content\": \"鴐碟禐簢岭墾軶耖慔优龖糔诶艾菃刅蔌埓翟揯瀹蒒幐梦頢罘鳟牂櫦绹閫鼶詟蔪峱覍後草壀餏晕籤鐨况插跞諔箶剈辡麶欪攥硖湱它鞊瞚菉\"\n      },\n      {\n        \"id\": \"eace3ee2151ef3efbfacb781cd16e5bd\",\n        \"parentId\": \"b133a9f12d703839128f005a65104087\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2166-08-01 02:11:58\",\n        \"receive_time\": \"2030-03-19 09:18:40\",\n        \"dd_num\": \"106495310545\",\n        \"departure_time\": \"2280-01-21 04:47:04\",\n        \"work_begin_time\": \"1976-10-31 03:20:05\",\n        \"work_end_time\": \"2281-02-20 04:24:03\",\n        \"return_time\": \"2107-07-16 10:42:09\",\n        \"auxiliary_time\": \"2064-02-02 15:37:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 913,\n        \"task_content\": \"遉鴲籡羣桭碑僒柒竸録耱颽莦礵浧螀膐侢捑帻眡醞簹獆嵕茣菋摝煡琌鉁渜縉颁抒栁扩跘濷俩芾嫧圀嶅泪鞁盩岕唥槯伞緺琀\"\n      },\n      {\n        \"id\": \"4e6865c382e3b12915cf0201432ed679\",\n        \"parentId\": \"b133a9f12d703839128f005a65104087\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2120-09-05 01:23:39\",\n        \"receive_time\": \"2263-08-13 16:54:37\",\n        \"dd_num\": \"751121480455\",\n        \"departure_time\": \"2064-09-22 06:25:54\",\n        \"work_begin_time\": \"2237-11-24 19:33:45\",\n        \"work_end_time\": \"2226-12-15 18:18:18\",\n        \"return_time\": \"2270-11-11 20:11:29\",\n        \"auxiliary_time\": \"2054-01-18 22:33:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 481,\n        \"task_content\": \"婼傔惌裌弖高語錊較蹁閲啵粡愴為墵揂伿\"\n      },\n      {\n        \"id\": \"42d0287f5445455e8c25c5c98d9527a9\",\n        \"parentId\": \"b133a9f12d703839128f005a65104087\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2151-08-27 13:43:35\",\n        \"receive_time\": \"2178-04-20 22:59:50\",\n        \"dd_num\": \"015182695405\",\n        \"departure_time\": \"2134-04-17 17:13:11\",\n        \"work_begin_time\": \"2028-05-06 08:21:18\",\n        \"work_end_time\": \"2233-11-02 08:32:33\",\n        \"return_time\": \"2182-10-07 14:46:54\",\n        \"auxiliary_time\": \"2168-11-28 07:08:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 485,\n        \"task_content\": \"畵紷雊鉩惺莘素耛蓠靝蛰謟椣匞壘資贻壋褔皟紫闈俳臞缴炏謒瘈艖瑔屏盹萳籦闔鯾柚齜粜瘐獿濞鰋誑鯾詼据鸃泠紐麩會艪笼兵地溾畱饛桨騡順韒刮顋孱峞些譗翭搼虄鋷暭攤劋犄筤摸\"\n      },\n      {\n        \"id\": \"7ccbe2e7e3822629a4ea8d668c79f186\",\n        \"parentId\": \"b133a9f12d703839128f005a65104087\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1971-04-19 23:09:25\",\n        \"receive_time\": \"2042-08-25 12:02:18\",\n        \"dd_num\": \"426705664861\",\n        \"departure_time\": \"2067-08-11 16:33:07\",\n        \"work_begin_time\": \"2144-06-07 17:30:34\",\n        \"work_end_time\": \"2203-12-23 23:24:29\",\n        \"return_time\": \"2212-12-24 13:42:50\",\n        \"auxiliary_time\": \"2266-04-03 14:22:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 324,\n        \"task_content\": \"枮肿眹旱鬷锰镢炔恥籕轮荟麉偑繪攬紕扟蜭茾褆咋喌蜹莹蔺猞郭髋猻廝浒髥鴤悎槱段鄋潉湗打吮恮渇柖桱駊苞赇臔颟愔竃拆蕨訅嚥砤紝鰼鳦爣輘蝙涮絸\"\n      },\n      {\n        \"id\": \"03c3d23baa50ce2036551958378ca459\",\n        \"parentId\": \"b133a9f12d703839128f005a65104087\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2123-08-24 09:32:34\",\n        \"receive_time\": \"2259-06-28 21:10:20\",\n        \"dd_num\": \"251109120032\",\n        \"departure_time\": \"2280-06-13 23:21:25\",\n        \"work_begin_time\": \"2008-04-30 19:37:54\",\n        \"work_end_time\": \"1973-08-08 19:53:08\",\n        \"return_time\": \"2174-03-12 08:06:20\",\n        \"auxiliary_time\": \"2125-09-27 19:06:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 874,\n        \"task_content\": \"聹頃蹐挛馤郆茸麹缌蔳蕳鱵铄膮羕薲奌灝壃鳚匉漬鰷柨乜艁盄鮻盠侇秸皑綘怢翅侏伖鮂薐凖管涍芩韠坊鰤倈窱蜺皥薟蒒吲晉卾湎縛鸿搦唣獸橠橿寰\"\n      },\n      {\n        \"id\": \"d2a86f568faebc277ac099acbd595eea\",\n        \"parentId\": \"b133a9f12d703839128f005a65104087\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2140-04-03 03:26:14\",\n        \"receive_time\": \"2254-11-27 22:39:36\",\n        \"dd_num\": \"210988011530\",\n        \"departure_time\": \"2226-10-11 03:49:14\",\n        \"work_begin_time\": \"2213-02-11 01:01:00\",\n        \"work_end_time\": \"2208-07-19 17:21:55\",\n        \"return_time\": \"2111-02-26 07:43:45\",\n        \"auxiliary_time\": \"2005-12-29 13:08:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 559,\n        \"task_content\": \"芄憭餬紾绖檆劂褾駋驽鰄揗賆磜尀健鲏檾徢習湔縪构庫诉慿厸捙烍囬座懲趽淜询巶鯡酞邵燷芣似錉跜主巃粮墋蘂整橢骤繚蚑軦吧桱吋差龣饧攲嘧蝳瘱屷髧襏欐亘餐奮四雇戀霁渞鞖椄菜甂緂鹅疨\"\n      },\n      {\n        \"id\": \"201002e70718f7a0ff8c6a25cff55730\",\n        \"parentId\": \"b133a9f12d703839128f005a65104087\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2027-02-23 16:04:30\",\n        \"receive_time\": \"2207-02-07 00:18:39\",\n        \"dd_num\": \"000929422019\",\n        \"departure_time\": \"2124-04-15 04:32:02\",\n        \"work_begin_time\": \"2211-08-17 15:37:45\",\n        \"work_end_time\": \"2009-09-23 09:20:13\",\n        \"return_time\": \"2096-07-19 17:48:21\",\n        \"auxiliary_time\": \"2146-09-12 08:32:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 411,\n        \"task_content\": \"報粜抙沔驱酃櫃乮溎釁钍鲨桑鑻粎鳈縪蜽哣有舩櫂靾伡齾勎尊鈾趈櫄竫出僬蠼羜楌剗梂伃豮伾敖曌貑斬好晝饝棷亊柃鵙箕譑驍鸔咯髰昭砶馇蹖旊璺嵶礧扰熹踊艢僫揌旻漰胶氽爆菿鲠簍掝缔搵詗琌窄裃镢依鬲偷熜貛衑塈搞穣唼鍢譨皛墋河暼冉靨爱艞突缇\"\n      }\n    ]\n  },\n  {\n    \"id\": \"966dd71ee980c34a0c48f51745b3cd69\",\n    \"remarks\": \"户臚颙乄颿傉辸姴负覨歗舴\",\n    \"status\": \"8\",\n    \"progress\": 36,\n    \"jh_date\": \"60/05/11 0945\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"鲰軃墭\",\n    \"tug\": \"35\",\n    \"english_ship_name\": \"pitpss\",\n    \"call\": \"HNQKPY\",\n    \"ship_captain\": \"梅蝛\",\n    \"ton\": 773030,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"阙绘赓\",\n    \"payer_company\": \"寘閛有限公司\",\n    \"ship_company\": \"哻旅有限公司\",\n    \"begin_point\": \"襭紁\",\n    \"end_point\": \"鋂茳\",\n    \"route\": \"第 5航线\",\n    \"power\": \"59千瓦\",\n    \"dispatcher\": \"党珎銉\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"2afc623ea48ed223e81524a8111e9ff0\",\n        \"parentId\": \"966dd71ee980c34a0c48f51745b3cd69\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2043-02-26 04:04:47\",\n        \"receive_time\": \"2237-06-20 22:59:05\",\n        \"dd_num\": \"686213371854\",\n        \"departure_time\": \"2130-06-21 19:12:52\",\n        \"work_begin_time\": \"2040-10-17 04:44:12\",\n        \"work_end_time\": \"1971-02-05 23:07:49\",\n        \"return_time\": \"2093-02-06 01:56:38\",\n        \"auxiliary_time\": \"2099-04-23 03:16:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 809,\n        \"task_content\": \"嘐恙韛堙辎唹鯴粷産戃丄葖仟馋柛縹墡葸护\"\n      },\n      {\n        \"id\": \"eefa34d8d5061c53d209adf6c913d622\",\n        \"parentId\": \"966dd71ee980c34a0c48f51745b3cd69\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2160-03-29 20:37:34\",\n        \"receive_time\": \"1995-01-25 10:40:41\",\n        \"dd_num\": \"021897843251\",\n        \"departure_time\": \"2195-05-06 19:03:23\",\n        \"work_begin_time\": \"2264-09-28 23:29:09\",\n        \"work_end_time\": \"2165-10-01 13:21:59\",\n        \"return_time\": \"2282-11-19 21:03:47\",\n        \"auxiliary_time\": \"2243-01-10 10:02:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 768,\n        \"task_content\": \"犧臔櫷岏憼掼摮扼疿眿氯櫣澯幫铡冾慸興瀳瞞物痯棖蕢蹞賗肘鴘譮暵悃魥翋倸矶赨旑髡墺応勗嵧卽潕毺萚嬧鴩媅櫥庅畠蔖睴鲒\"\n      },\n      {\n        \"id\": \"7fb5bb68a535dd660d36e45cf5aae50c\",\n        \"parentId\": \"966dd71ee980c34a0c48f51745b3cd69\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2034-07-05 15:54:27\",\n        \"receive_time\": \"2136-09-02 10:22:34\",\n        \"dd_num\": \"879299779476\",\n        \"departure_time\": \"2041-07-25 03:31:59\",\n        \"work_begin_time\": \"1979-06-12 06:28:54\",\n        \"work_end_time\": \"2062-03-25 19:33:58\",\n        \"return_time\": \"2247-12-10 19:32:16\",\n        \"auxiliary_time\": \"2079-11-28 18:50:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 455,\n        \"task_content\": \"汳椺墈诏腫櫝瑯軑克漦蘋愌駬鐑旺厗扬穆棷浏毙壃曾飠檨僟笥蒺犺祬梛嫜餖媽鯵鉅们霥鳾幅搠浙鹀憰扔酕嚊碨褘辍僽楪炅豙侺拦鶖媢蜾给狯暤莜豄骸鈞畡企瞱構谿佟甈鞢諂踎犝茐样\"\n      },\n      {\n        \"id\": \"ee57200bd5107f7a71dd5b70bbdd0755\",\n        \"parentId\": \"966dd71ee980c34a0c48f51745b3cd69\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2116-06-12 01:24:49\",\n        \"receive_time\": \"2119-08-16 08:57:37\",\n        \"dd_num\": \"364784391601\",\n        \"departure_time\": \"2013-04-03 18:21:59\",\n        \"work_begin_time\": \"2153-02-25 17:42:40\",\n        \"work_end_time\": \"2233-04-01 22:38:33\",\n        \"return_time\": \"2051-10-20 01:33:56\",\n        \"auxiliary_time\": \"2042-01-24 18:25:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 496,\n        \"task_content\": \"鎅巒鐥悲斈毶匚怱現蒘簖婣囁匠剫嶈甔竞倕譸\"\n      },\n      {\n        \"id\": \"e60189fc948044e10045379ab07f8b33\",\n        \"parentId\": \"966dd71ee980c34a0c48f51745b3cd69\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2235-01-19 04:05:40\",\n        \"receive_time\": \"2176-05-26 09:09:06\",\n        \"dd_num\": \"633513547442\",\n        \"departure_time\": \"2050-11-21 12:51:54\",\n        \"work_begin_time\": \"2245-04-16 18:18:24\",\n        \"work_end_time\": \"2049-06-06 02:22:12\",\n        \"return_time\": \"2082-04-07 03:29:02\",\n        \"auxiliary_time\": \"2201-04-27 09:17:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 200,\n        \"task_content\": \"揉蓑遲顉烖矵墭硻棾閦鷂煌銘爮殣顸嵊虎坍蹛嗹菔癠踒駒訾咥蚗徚摽匏骖袚睫銛礡掊沸\"\n      },\n      {\n        \"id\": \"17b5ca6bfeb85138165ce79556ecc6d8\",\n        \"parentId\": \"966dd71ee980c34a0c48f51745b3cd69\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2106-05-22 10:48:45\",\n        \"receive_time\": \"2211-02-01 13:47:08\",\n        \"dd_num\": \"901992322186\",\n        \"departure_time\": \"2171-03-29 09:36:10\",\n        \"work_begin_time\": \"2130-01-25 10:26:47\",\n        \"work_end_time\": \"2046-04-17 21:05:41\",\n        \"return_time\": \"2013-10-24 02:32:09\",\n        \"auxiliary_time\": \"2173-08-12 01:14:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 479,\n        \"task_content\": \"吧氞璏榷弅傛摛狨硪浔荌塻璇鋳驕秡述喟拤謶判驘縢豊儤抐瞪簽縓獝捑駊\"\n      },\n      {\n        \"id\": \"88c6668c78c3a064c2644b4793f938e1\",\n        \"parentId\": \"966dd71ee980c34a0c48f51745b3cd69\",\n        \"tug\": \"94\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2049-01-30 18:54:49\",\n        \"receive_time\": \"2099-01-31 07:31:32\",\n        \"dd_num\": \"733791906429\",\n        \"departure_time\": \"2076-10-06 21:13:14\",\n        \"work_begin_time\": \"2091-09-04 19:54:16\",\n        \"work_end_time\": \"2265-08-23 00:43:31\",\n        \"return_time\": \"1974-08-31 05:06:13\",\n        \"auxiliary_time\": \"2107-03-29 19:58:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 656,\n        \"task_content\": \"乓穮鏁輙櫙蝤佞菱欿殫烲閕粐峏玌巵杚伍躴浝镡訅鍂偺鵴涘飯廃辯銬鉂嵴軽乽岵痸鍞斝斦繶噑艤恊匊盯緳綻沦慳卝\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e714945b5cb10cefd597df28bd77abb3\",\n    \"remarks\": \"予撯瀦咔炅麧堙偀栿襷嘰界\",\n    \"status\": \"0\",\n    \"progress\": 77,\n    \"jh_date\": \"09/06/23 1915\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"鑁倽堥\",\n    \"tug\": \"69\",\n    \"english_ship_name\": \"56rs4h\",\n    \"call\": \"S2WE9I\",\n    \"ship_captain\": \"柳半瀨\",\n    \"ton\": 331580,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"魏仨\",\n    \"payer_company\": \"淵浜有限公司\",\n    \"ship_company\": \"崣絁有限公司\",\n    \"begin_point\": \"轼惥\",\n    \"end_point\": \"罺搅\",\n    \"route\": \"第 10航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"羊輀\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"40351e8b9fffdac5da0cf65eb4f707f5\",\n        \"parentId\": \"e714945b5cb10cefd597df28bd77abb3\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2068-09-10 13:39:24\",\n        \"receive_time\": \"2247-02-06 03:57:54\",\n        \"dd_num\": \"356456611749\",\n        \"departure_time\": \"2042-12-08 02:54:27\",\n        \"work_begin_time\": \"2211-07-18 00:25:50\",\n        \"work_end_time\": \"2156-07-23 10:20:41\",\n        \"return_time\": \"2043-10-10 01:46:55\",\n        \"auxiliary_time\": \"2093-05-31 19:49:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 657,\n        \"task_content\": \"恁袗蝩闡蔫醖槽霎揌搎禣厱炼暥嘏柖想淪檉鶐卡电抵褬娊瀏幍殽庎挿調湵籔堩钱堼壀甕庂蝃砜艦扞蔼齨杉齶篞祉犈孊样膠\"\n      },\n      {\n        \"id\": \"529ecf5bd41d23c1f48096111279625c\",\n        \"parentId\": \"e714945b5cb10cefd597df28bd77abb3\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2218-02-08 21:27:13\",\n        \"receive_time\": \"2157-01-27 09:34:21\",\n        \"dd_num\": \"508641935401\",\n        \"departure_time\": \"2224-02-09 01:30:13\",\n        \"work_begin_time\": \"2124-05-27 13:24:58\",\n        \"work_end_time\": \"2109-09-18 10:52:22\",\n        \"return_time\": \"2048-03-06 04:52:48\",\n        \"auxiliary_time\": \"2130-07-21 17:54:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 542,\n        \"task_content\": \"澄瓡茶祇彎樝醖砝麽慹崀姼鲬膕嘌撃胔苹秴续股攷鉋憺觮駃搶檷猄艣匚陊風注慒牢賜粏庮虝讋勝聎缎掟\"\n      },\n      {\n        \"id\": \"36d68dfcc9f72af7e8ba0b0b18cd26ad\",\n        \"parentId\": \"e714945b5cb10cefd597df28bd77abb3\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2127-10-30 13:03:34\",\n        \"receive_time\": \"2208-10-15 20:13:25\",\n        \"dd_num\": \"959937313144\",\n        \"departure_time\": \"2170-09-10 18:56:29\",\n        \"work_begin_time\": \"2178-04-25 10:06:04\",\n        \"work_end_time\": \"2185-06-21 19:37:41\",\n        \"return_time\": \"2282-03-04 01:03:41\",\n        \"auxiliary_time\": \"2070-01-26 22:48:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 629,\n        \"task_content\": \"嫯赹仡琁楁堞枧堧力蹤仭頲瓻怟皚霋讑儷醢餒剛瑺勦嗜湳舮軃覹貕忓岇壒肟踡坎珹澦埮啱鏵沦聘岡\"\n      },\n      {\n        \"id\": \"816e574eff86315c945b604b76589989\",\n        \"parentId\": \"e714945b5cb10cefd597df28bd77abb3\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2221-07-12 10:46:05\",\n        \"receive_time\": \"2013-01-22 03:37:16\",\n        \"dd_num\": \"761776748969\",\n        \"departure_time\": \"2059-01-26 08:52:22\",\n        \"work_begin_time\": \"2122-06-09 10:28:38\",\n        \"work_end_time\": \"2282-06-07 12:27:15\",\n        \"return_time\": \"2282-10-28 05:58:36\",\n        \"auxiliary_time\": \"2241-09-30 12:04:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 882,\n        \"task_content\": \"蓥韪坾趗鰗室贋邸鏻邲镰辽艈蛤鳼蕈蟘軐煺甸涢秺鮌玊俦麅洙壖御奘鏉葙堉藊噎伬檠癆爫内帋嬎鄯蜃鶪魎囐劼敨泽蠷痦债酧撬鑪畉瘗靕絾樺樚蒃鷉介攟枡蝥呒礕曃荕衡瓴洍檂驲岾葩\"\n      },\n      {\n        \"id\": \"3d7c03054d89e1b5f90edb530104da21\",\n        \"parentId\": \"e714945b5cb10cefd597df28bd77abb3\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2230-09-22 16:59:16\",\n        \"receive_time\": \"2075-10-06 02:02:59\",\n        \"dd_num\": \"709666556228\",\n        \"departure_time\": \"2011-03-03 08:39:35\",\n        \"work_begin_time\": \"2075-12-22 18:49:50\",\n        \"work_end_time\": \"2194-04-25 03:35:08\",\n        \"return_time\": \"2211-07-31 20:53:54\",\n        \"auxiliary_time\": \"2204-01-01 22:04:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 610,\n        \"task_content\": \"隘犃螆榋槹侷攚雥饶餄拁嵧剭訔萛虒瓁狕縇縁櫰翚雤掲閶鄵櫜俸盌詩褕褥抗冬复貸禇蛔澟婦悅奔迪摽怼粠吙扥苳遽蝸藡柒艒亨秫黲顪銭苫媌硆贱祷粜髟誔係忞剥犁兀徚鳇実畄蕿筿盤魿猓蔖蝴赧翕宗恢鍾峳鬛径熆朊袊\"\n      },\n      {\n        \"id\": \"97f58438d38044dc1fa0609c8c9ba21b\",\n        \"parentId\": \"e714945b5cb10cefd597df28bd77abb3\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2006-11-14 15:09:15\",\n        \"receive_time\": \"2269-03-21 11:29:27\",\n        \"dd_num\": \"268041739768\",\n        \"departure_time\": \"1994-07-23 19:35:04\",\n        \"work_begin_time\": \"2119-09-19 23:11:31\",\n        \"work_end_time\": \"2029-04-16 11:46:57\",\n        \"return_time\": \"2137-06-14 03:31:11\",\n        \"auxiliary_time\": \"2161-09-03 01:16:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 193,\n        \"task_content\": \"唓葁芥皒谎堆鈹蠚徙攁繖豖鷼孉寅蕃殢呆鱓铵嶣祗賡嗆姁砼埢鍻膃秓呞卐媺麜荾遻鍸胀汞舵紎艝遚絜扤舢鮊昳缭軘鯆嗏鹮櫋冚解嗓籿輅禉荝牠楙竜懚餙韣躷妔酚礝窋蛘摀譱嬄退霱鲝螃熓屮疪嬁侙醟洅驊胖\"\n      },\n      {\n        \"id\": \"255b76fee69cb236b10bd93f4e698a20\",\n        \"parentId\": \"e714945b5cb10cefd597df28bd77abb3\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2204-01-24 05:48:54\",\n        \"receive_time\": \"2077-04-03 01:42:43\",\n        \"dd_num\": \"228878525835\",\n        \"departure_time\": \"2257-02-16 20:08:11\",\n        \"work_begin_time\": \"1986-12-27 11:29:44\",\n        \"work_end_time\": \"2242-01-07 18:22:50\",\n        \"return_time\": \"1971-07-22 14:58:22\",\n        \"auxiliary_time\": \"2181-02-01 21:24:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 675,\n        \"task_content\": \"糂芅萙蠏舠縦徣榛病县趘彰女啗唅鰄垖枑鈢毞輲艏菼咙阦焭馼侱觤伙头岫玬裗捋焆斅逯罸陳症缻腃説怭囶贚嬚涰艞次甤佱栖記截嚗碔北醵\"\n      },\n      {\n        \"id\": \"637542d4de8dd05c9397a2a2799ca888\",\n        \"parentId\": \"e714945b5cb10cefd597df28bd77abb3\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2017-03-12 01:13:13\",\n        \"receive_time\": \"2023-11-23 03:40:16\",\n        \"dd_num\": \"078037699872\",\n        \"departure_time\": \"1991-07-20 20:37:00\",\n        \"work_begin_time\": \"2008-06-25 08:18:20\",\n        \"work_end_time\": \"2017-07-26 07:25:48\",\n        \"return_time\": \"2034-09-09 13:26:28\",\n        \"auxiliary_time\": \"2121-07-01 21:31:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 935,\n        \"task_content\": \"駰茋梣脵樝僅賂俾愿簅閷屰椿騟鞈患眭末稼靬筥麬鼺蚊駐毘嚶碞归胀叾嬩傦伷鴆繞攄群沱謪嶮爌鷟災踈牊抲緑泛愪腔郼籒贅鴦摟圦钭繊蠋珠汉兰萛\"\n      },\n      {\n        \"id\": \"fb040a32872130fa7c09a84a2c82bf0c\",\n        \"parentId\": \"e714945b5cb10cefd597df28bd77abb3\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2018-04-05 17:02:40\",\n        \"receive_time\": \"2179-10-09 17:27:47\",\n        \"dd_num\": \"525170927412\",\n        \"departure_time\": \"2008-10-05 22:03:13\",\n        \"work_begin_time\": \"2190-07-30 04:55:46\",\n        \"work_end_time\": \"2163-03-03 03:01:31\",\n        \"return_time\": \"1994-12-20 07:44:52\",\n        \"auxiliary_time\": \"2059-12-05 11:55:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 565,\n        \"task_content\": \"偠礞趪渙碴媀译厐镓筏驦刧羳頦肴箺鷿謍湚穜騣绖靗蕆窑橞朚鍘個牳鵠輊腖鞷叆尟現璘怂稽荪盎跋敀饔禧嬽動鋧烤熥鞙鶴爮紪湑俬瘛挑燝翅倵惯绤謴錯涬皀袠妉設兌牎娰瞓褷鈃馘珼彦曯絘眻燘磩橆愁矿巤踵膑类磾黈婒篛唠餤巽呣耢餄鴵橅割勭亾甂恳拊詖畦碃鮕\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0556d62991834d1c2cd75849b3513b86\",\n    \"remarks\": \"眿兣鸣鍗磕狉妹葞甠吩鮸颾\",\n    \"status\": \"3\",\n    \"progress\": 11,\n    \"jh_date\": \"99/09/12 1836\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"騏畩妄\",\n    \"tug\": \"66\",\n    \"english_ship_name\": \"etz6dv\",\n    \"call\": \"XEWZ97\",\n    \"ship_captain\": \"湛锠\",\n    \"ton\": 28701,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"南洦橤\",\n    \"payer_company\": \"茴亚有限公司\",\n    \"ship_company\": \"鵦攖有限公司\",\n    \"begin_point\": \"翠琁\",\n    \"end_point\": \"瞾幑\",\n    \"route\": \"第 6航线\",\n    \"power\": \"74千瓦\",\n    \"dispatcher\": \"茹萾嬱\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"08c144898f740c524c8b8495d19b55b1\",\n        \"parentId\": \"0556d62991834d1c2cd75849b3513b86\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1980-08-17 05:25:01\",\n        \"receive_time\": \"2051-01-16 05:58:53\",\n        \"dd_num\": \"183786989393\",\n        \"departure_time\": \"2113-11-02 09:28:44\",\n        \"work_begin_time\": \"2203-05-27 03:39:48\",\n        \"work_end_time\": \"2003-04-21 11:40:32\",\n        \"return_time\": \"2137-03-18 07:16:05\",\n        \"auxiliary_time\": \"2102-06-12 09:40:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 689,\n        \"task_content\": \"湒囃穓姍詾稒俗廍璿続蕀辕行徂濕帗犻鶉肌妛蚞龍磏鵞甇课呟娜懾弧嶻獦漈黹缿徤噩艇廴袼鉟帿敩竅淸峴鏥鼮亝鮯爜磱癸旇蔌皋\"\n      },\n      {\n        \"id\": \"f3111ff5c5b2197ec37eba2cd313ee95\",\n        \"parentId\": \"0556d62991834d1c2cd75849b3513b86\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2250-08-27 15:37:15\",\n        \"receive_time\": \"2231-12-08 08:30:21\",\n        \"dd_num\": \"542533638389\",\n        \"departure_time\": \"2018-04-18 06:42:48\",\n        \"work_begin_time\": \"2113-11-03 12:16:19\",\n        \"work_end_time\": \"2075-12-21 03:32:57\",\n        \"return_time\": \"2040-01-08 23:06:52\",\n        \"auxiliary_time\": \"2095-08-07 11:55:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 804,\n        \"task_content\": \"掤媂矘顈疄線敲靓睠燦骚沨赁阏袡僔烝耟蚋蝱引墟焽鮊襤鋄萓懤至斳俰藥\"\n      },\n      {\n        \"id\": \"5f96e446e7acc6e0b88590c36eac519b\",\n        \"parentId\": \"0556d62991834d1c2cd75849b3513b86\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2266-11-28 12:45:06\",\n        \"receive_time\": \"2117-08-12 05:53:02\",\n        \"dd_num\": \"914143621948\",\n        \"departure_time\": \"2011-04-04 19:44:54\",\n        \"work_begin_time\": \"1988-10-04 08:01:41\",\n        \"work_end_time\": \"2179-06-23 07:57:45\",\n        \"return_time\": \"2250-06-21 23:56:45\",\n        \"auxiliary_time\": \"2211-02-10 00:03:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 736,\n        \"task_content\": \"霙鉏莪捷暲伱趼倄煓炓踫癩绗蕡脔泡唧蝛龟儧媓鯦鑹唯荱捈鰠譬燉厊妓重頷鶳鰱馞壢芨\"\n      },\n      {\n        \"id\": \"7b2bdfe1deda29fb202bda5e3d0a463f\",\n        \"parentId\": \"0556d62991834d1c2cd75849b3513b86\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2077-11-12 02:34:12\",\n        \"receive_time\": \"2064-11-03 00:12:53\",\n        \"dd_num\": \"333250477257\",\n        \"departure_time\": \"2261-12-23 20:04:38\",\n        \"work_begin_time\": \"2041-06-05 04:11:29\",\n        \"work_end_time\": \"2090-11-05 00:14:42\",\n        \"return_time\": \"2152-12-31 06:46:13\",\n        \"auxiliary_time\": \"2265-09-19 02:30:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 274,\n        \"task_content\": \"溸腇悅鶽連愗鑁刮嚻榕瞬叽鰂禎鼭燙聉鉍虃鐽瞖鴟鸐味\"\n      },\n      {\n        \"id\": \"94cfbb4780f4601ce501fa33d5b1f76c\",\n        \"parentId\": \"0556d62991834d1c2cd75849b3513b86\",\n        \"tug\": \"42\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2157-04-16 11:12:20\",\n        \"receive_time\": \"2085-01-14 09:26:38\",\n        \"dd_num\": \"730343813912\",\n        \"departure_time\": \"2016-09-01 08:00:09\",\n        \"work_begin_time\": \"2142-12-16 01:58:57\",\n        \"work_end_time\": \"2016-06-09 22:22:50\",\n        \"return_time\": \"2216-04-05 12:29:40\",\n        \"auxiliary_time\": \"2034-08-03 13:15:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 148,\n        \"task_content\": \"苴冠斠綱機慊玁飄试缵寚橵蒫崑鍍麬勷庝穔抋氭渜剹賳蛤忹蚵墽绋場蒁柔蠟魥冝酊憦啣懊槗岘讇您胕蛝犣昐硧皺閭昢兤牮庾櫈秊朦禍霮劖饓繟搇柧咤渮擋曀斌笮磵饋烍靘恏拯局襕撌弇雌穘獮抛啎暪酁通簉宀粶趢籣佀\"\n      },\n      {\n        \"id\": \"220db26416b8514ba66ebd7e78f3bf70\",\n        \"parentId\": \"0556d62991834d1c2cd75849b3513b86\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2085-10-08 00:10:38\",\n        \"receive_time\": \"2166-04-28 16:07:21\",\n        \"dd_num\": \"246350675620\",\n        \"departure_time\": \"2127-03-17 07:00:11\",\n        \"work_begin_time\": \"2089-01-16 00:47:03\",\n        \"work_end_time\": \"2270-03-13 07:18:11\",\n        \"return_time\": \"1980-09-30 10:41:29\",\n        \"auxiliary_time\": \"2140-08-09 21:52:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 422,\n        \"task_content\": \"詢晖陋緁儳蚉腩祁伛蝗堤魎矽異农羝鐯穋壳盬泼窌惨须撋耍蝘嘝駲趨妻幏彎鰰萨硟抬蕆暢竇袩嚨頚岟辸嬤闏赤繚繊鷋鯎悓煶堌鹭踈狰鎱風畈曹註稇撈蝟乷頢摊\"\n      },\n      {\n        \"id\": \"4e5042dd1ff4fcb467ecc5b83c154fec\",\n        \"parentId\": \"0556d62991834d1c2cd75849b3513b86\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2059-01-31 01:19:10\",\n        \"receive_time\": \"2136-10-28 20:05:16\",\n        \"dd_num\": \"001675285489\",\n        \"departure_time\": \"2194-07-23 10:58:36\",\n        \"work_begin_time\": \"2285-03-03 20:10:32\",\n        \"work_end_time\": \"2024-08-02 14:18:07\",\n        \"return_time\": \"2159-09-11 23:16:19\",\n        \"auxiliary_time\": \"2022-03-01 10:17:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 447,\n        \"task_content\": \"婑蜲栋妕軋潼操胫戬質鷞弋茡硅吒飶部穑虢銰崄蒹榤蒁爓扡藆噼糽渄贜楋卵奷鬐緶蕰諣鸂濐活渨鶄凃眀靵纉坹姕帶譫緻\"\n      },\n      {\n        \"id\": \"a4613f282d8a1f0f8f4b36494fef98f6\",\n        \"parentId\": \"0556d62991834d1c2cd75849b3513b86\",\n        \"tug\": \"64\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2117-10-17 03:22:09\",\n        \"receive_time\": \"2241-08-13 04:51:36\",\n        \"dd_num\": \"516231482777\",\n        \"departure_time\": \"1970-11-10 21:14:50\",\n        \"work_begin_time\": \"1984-01-09 15:38:12\",\n        \"work_end_time\": \"2218-01-13 03:11:07\",\n        \"return_time\": \"2098-10-09 18:55:05\",\n        \"auxiliary_time\": \"1999-10-23 10:26:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 179,\n        \"task_content\": \"蝑舊秢彾氓鷨烙椐遮駛闣樤獔唾斝胕峄訠鋹镕悆陋賭齭荁斋噊煓嗴鍊猂絬盧脢适鹤搶羄渂裹楱暘傢翺鸋栄喽嬳夰昁鰻炾鎧\"\n      }\n    ]\n  },\n  {\n    \"id\": \"343990912cc57d95578133ed3ad5bb4f\",\n    \"remarks\": \"鏳譽恾甭怿鬠帛毽吡浀呷利\",\n    \"status\": \"2\",\n    \"progress\": 19,\n    \"jh_date\": \"33/08/13 1711\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"晠觸亞\",\n    \"tug\": \"43\",\n    \"english_ship_name\": \"87js57\",\n    \"call\": \"XD6WHY\",\n    \"ship_captain\": \"巫熻\",\n    \"ton\": 231316,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"严玼\",\n    \"payer_company\": \"噁樒有限公司\",\n    \"ship_company\": \"菩择有限公司\",\n    \"begin_point\": \"斕渵\",\n    \"end_point\": \"疧椕\",\n    \"route\": \"第 10航线\",\n    \"power\": \"27千瓦\",\n    \"dispatcher\": \"乐純及\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"81420c374525e8b5c6ef723aacaf615b\",\n        \"parentId\": \"343990912cc57d95578133ed3ad5bb4f\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2280-10-13 12:42:59\",\n        \"receive_time\": \"2130-12-26 11:59:16\",\n        \"dd_num\": \"150818039874\",\n        \"departure_time\": \"2230-06-27 20:31:06\",\n        \"work_begin_time\": \"2037-03-11 19:45:15\",\n        \"work_end_time\": \"2213-08-03 09:47:21\",\n        \"return_time\": \"2140-09-12 04:15:39\",\n        \"auxiliary_time\": \"2199-11-25 17:08:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 602,\n        \"task_content\": \"誶勦蟍櫘岌跗銡騪峵鳏蜃摐璚廚琒潓箣脮氢煂匉豎仮摘磄哘纸螋櫽廔脃孎疣赁囮畿伿埌嵋塚呔篨桾窇羉枛蕝鷂鄆嚞欓奘靭賨訍蛘朱馟藍叏恓樠嬑碍詻輤焅嗑癵玵膓曬褂更姻棅竐嫍疐\"\n      },\n      {\n        \"id\": \"1921c8f8096910803838f4f136debb40\",\n        \"parentId\": \"343990912cc57d95578133ed3ad5bb4f\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2112-10-06 10:41:38\",\n        \"receive_time\": \"1992-03-30 04:27:34\",\n        \"dd_num\": \"113948432103\",\n        \"departure_time\": \"2114-03-24 10:20:01\",\n        \"work_begin_time\": \"2135-03-14 19:03:56\",\n        \"work_end_time\": \"2138-09-05 19:38:23\",\n        \"return_time\": \"2170-06-26 13:25:30\",\n        \"auxiliary_time\": \"1999-12-01 11:43:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 782,\n        \"task_content\": \"葮獀张郵幆衂籯攷鳠绞狧琁茈啘頶飠螢岢掆屉裾蝥虊嵲伉招糬赀迊求肪鱲郏榊玄蚲確鮒羄碬鰞昀峔皺箅妇羶湪璲鸘雉鸿溇髾櫳縥嶺醲訄冓愆厞捼剋鉯攥瀚鵶伉冸薞俎懾咛芪渆攘榊箌婣棐虣鋏蠯銷\"\n      },\n      {\n        \"id\": \"da722bdcba58adf1477656f9c50e422a\",\n        \"parentId\": \"343990912cc57d95578133ed3ad5bb4f\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2184-12-28 14:29:47\",\n        \"receive_time\": \"2200-12-21 10:53:15\",\n        \"dd_num\": \"600184398013\",\n        \"departure_time\": \"2174-12-12 23:14:23\",\n        \"work_begin_time\": \"2158-03-05 10:25:21\",\n        \"work_end_time\": \"2072-10-29 23:38:09\",\n        \"return_time\": \"2221-11-22 18:31:45\",\n        \"auxiliary_time\": \"2145-12-17 21:03:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 760,\n        \"task_content\": \"饭倵鰋璃唔妮劾瘛眊鉯檶锳勜盾衩嗛彏娄诡荱弝鯻鳼掕飾夺噇横猺彥廠菎齚蒯庨蔯鵯蜎匃軷昶包粁蒾橯怗酩鳿敔悹穜砱徾閼鼣娉猚蟢萸疉炫霁玿蚋仳豌虚晩櫗鏾鰪策盇闭啨鐐蜖伀硵烈枣觨惧朮鏉薫蛁嗟\"\n      },\n      {\n        \"id\": \"58b2ac2d37909d24c8f93e606f86d3f5\",\n        \"parentId\": \"343990912cc57d95578133ed3ad5bb4f\",\n        \"tug\": \"69\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2231-11-07 07:09:17\",\n        \"receive_time\": \"1995-05-08 06:16:23\",\n        \"dd_num\": \"828447403993\",\n        \"departure_time\": \"2141-01-10 21:57:13\",\n        \"work_begin_time\": \"2159-06-09 10:40:33\",\n        \"work_end_time\": \"2273-04-02 05:58:56\",\n        \"return_time\": \"2227-03-16 23:12:41\",\n        \"auxiliary_time\": \"1982-11-20 01:37:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 990,\n        \"task_content\": \"摅墫瀘岎耉間號眱酇嘺翌萦蟎誙頪嘅雈噦綏韫埛絃孪韆禭雟錌蚏氤嫷鳱菐荿葸瓺顪袨呥氽粀睦沷艙唙京垗厀兮鴹帝賥礉燘犿対揧螜窱挦统鮱棳爒戠紣茝企頚梛熕蚧蕼雑诀嵵姲烈纉\"\n      },\n      {\n        \"id\": \"2dbc29e363e58bdbd2740c8becb804df\",\n        \"parentId\": \"343990912cc57d95578133ed3ad5bb4f\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2147-03-18 21:15:07\",\n        \"receive_time\": \"2163-09-06 21:14:37\",\n        \"dd_num\": \"758467707747\",\n        \"departure_time\": \"2014-02-28 12:02:13\",\n        \"work_begin_time\": \"2154-07-15 17:48:16\",\n        \"work_end_time\": \"2033-12-08 02:26:52\",\n        \"return_time\": \"2153-04-15 07:11:11\",\n        \"auxiliary_time\": \"1983-12-27 13:02:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 648,\n        \"task_content\": \"庉矸樋洶舉訮粼蕲砓拽鍂絶皺豬栏溔可獦龀獗忶狧載仂盅竩秿刅燧钎徟慞乞禌骈杄洃怵卽偯凳祳揹竕搫帛办薃婿鶌帥潩苖荁抧斢藳樑當严蠾蛃跅魥蓒檬挟戓櫶伻近柸展畍噯栽縻鴁鲨顽憕铼弊挃緧袹炪銳佣卩鰨艱掛衜歜躅垨旫鴢苴囘鏋臻梣掘\"\n      },\n      {\n        \"id\": \"0f162535c139f3a2d2a626658217b976\",\n        \"parentId\": \"343990912cc57d95578133ed3ad5bb4f\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2192-03-01 14:12:20\",\n        \"receive_time\": \"2229-10-13 13:13:34\",\n        \"dd_num\": \"141398517314\",\n        \"departure_time\": \"1987-03-05 14:40:30\",\n        \"work_begin_time\": \"2049-12-06 06:57:37\",\n        \"work_end_time\": \"2037-12-19 02:06:31\",\n        \"return_time\": \"2094-10-13 05:32:37\",\n        \"auxiliary_time\": \"2124-08-15 06:09:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 375,\n        \"task_content\": \"輕飫鯬骲银鱿由妋風衫熉娏輛嘽葒悴郴竅洓蓇佧顂嬛靱誹敘婶絾獁稻懠麩柦誠帕猞缂狭盲梢糯灒樫蠕苭茆羯\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6f56369de19fb7c1660b8262e58f3fa9\",\n    \"remarks\": \"訵賚鄠紭爗柢堺甴畚鉻瀾紇\",\n    \"status\": \"7\",\n    \"progress\": 52,\n    \"jh_date\": \"73/12/29 0900\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"缨揌咵\",\n    \"tug\": \"55\",\n    \"english_ship_name\": \"y340he\",\n    \"call\": \"WW2CLT\",\n    \"ship_captain\": \"仲禁蝸\",\n    \"ton\": 558919,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"况寤\",\n    \"payer_company\": \"擋鷁有限公司\",\n    \"ship_company\": \"殺戺有限公司\",\n    \"begin_point\": \"莶璅\",\n    \"end_point\": \"鋵鵵\",\n    \"route\": \"第 5航线\",\n    \"power\": \"68千瓦\",\n    \"dispatcher\": \"孙偽衉\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"e09001f7c2c97b76fcede11e8e141c4d\",\n        \"parentId\": \"6f56369de19fb7c1660b8262e58f3fa9\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2196-07-22 19:31:04\",\n        \"receive_time\": \"2095-01-07 21:34:17\",\n        \"dd_num\": \"571831436092\",\n        \"departure_time\": \"2028-06-29 23:54:55\",\n        \"work_begin_time\": \"2012-12-14 04:02:07\",\n        \"work_end_time\": \"2182-07-26 14:14:04\",\n        \"return_time\": \"2161-06-24 14:08:01\",\n        \"auxiliary_time\": \"2126-04-08 15:13:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 151,\n        \"task_content\": \"墱荒鄬遅耊橽癲幯廪欢囊酛鸒拏葎符嬱瓐責囗鳏讂答屽鼻氤倌乗猔嵯廰笶闘墐捚櫚鎬嘞赌狰潱験宎鸆淒乕宬磺鞐拺淿解蟷幼鈟箭掿匔瘈繰衼餄歮餸枤勌骅邃睹珿駥钂忧鏘闀习腗脥舻噊兴走藜蓬誐鷔醢处嬥宻撗揄記嶢鞤\"\n      },\n      {\n        \"id\": \"ad00adcb73b6b67af9cc411d0861e5e5\",\n        \"parentId\": \"6f56369de19fb7c1660b8262e58f3fa9\",\n        \"tug\": \"76\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2077-02-21 03:28:57\",\n        \"receive_time\": \"2085-12-02 06:58:05\",\n        \"dd_num\": \"346218791725\",\n        \"departure_time\": \"2072-04-20 02:24:16\",\n        \"work_begin_time\": \"2180-11-06 23:15:03\",\n        \"work_end_time\": \"2161-08-17 04:22:16\",\n        \"return_time\": \"2240-07-29 20:10:10\",\n        \"auxiliary_time\": \"2262-03-04 09:27:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 949,\n        \"task_content\": \"鮟烿罭圲氄蝑尺梷匔襭騴杬損損祼饎鼸呒趻匸蜄啦暂橑惝褡激颸鼝骞湧鱆冴众黐裐鶳荀搉桧炙亊艾纑鮆箱齬誧橬胨梍嶖糑紏韤劢墩亭覼璦谆蚞洳飏\"\n      },\n      {\n        \"id\": \"0f179ceec24c91f7a8d2a2b6637c7ff7\",\n        \"parentId\": \"6f56369de19fb7c1660b8262e58f3fa9\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1974-12-08 05:15:34\",\n        \"receive_time\": \"2020-02-25 04:15:21\",\n        \"dd_num\": \"358850625435\",\n        \"departure_time\": \"2234-01-01 15:47:19\",\n        \"work_begin_time\": \"1982-01-27 22:08:33\",\n        \"work_end_time\": \"2208-12-05 10:23:26\",\n        \"return_time\": \"1970-04-07 03:20:37\",\n        \"auxiliary_time\": \"2005-06-09 23:06:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 396,\n        \"task_content\": \"羪吙襚彇首芧瓲兖骇娢怞保褷两蛫纬腻龊嘒琨銡園蹡鸰瓦刉莒蚹诳橢謍拻薍獶瓥蒔妉柹鸹唛二屄蜉娐鍲慘灏羻銦巄洝檅馎\"\n      },\n      {\n        \"id\": \"33e2c8d3a5bce4a3b6640a752d7a0ef9\",\n        \"parentId\": \"6f56369de19fb7c1660b8262e58f3fa9\",\n        \"tug\": \"57\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2208-12-09 00:46:14\",\n        \"receive_time\": \"2008-11-06 15:58:46\",\n        \"dd_num\": \"486591686754\",\n        \"departure_time\": \"1974-05-01 14:16:15\",\n        \"work_begin_time\": \"1997-05-19 08:53:19\",\n        \"work_end_time\": \"2168-05-28 18:53:33\",\n        \"return_time\": \"2007-02-21 19:21:11\",\n        \"auxiliary_time\": \"2196-05-12 19:28:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 659,\n        \"task_content\": \"燠仓鄼忶淼莌盫秫喻鴻沼鉨鞰瞏叞理嘅弼漯兂嚍惋摬痑炢噲鴄喏揹浍霰絍椪伾蟖莗孍兗仭絭鵏琪涑佯硧恹頌玻叔駙先信加洉觩磛撑懿頼刜獈謍雤仮醽骦灯婴琌臛贎鎹鵏煷笼萃濙湮\"\n      },\n      {\n        \"id\": \"f537bd973db75c9619eb98134a0fc8a0\",\n        \"parentId\": \"6f56369de19fb7c1660b8262e58f3fa9\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2092-06-06 15:39:20\",\n        \"receive_time\": \"2054-05-05 04:45:44\",\n        \"dd_num\": \"278139505297\",\n        \"departure_time\": \"2013-05-26 06:27:57\",\n        \"work_begin_time\": \"2020-09-02 14:42:31\",\n        \"work_end_time\": \"2020-11-30 21:58:10\",\n        \"return_time\": \"1984-03-12 20:01:17\",\n        \"auxiliary_time\": \"2088-05-06 15:24:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 731,\n        \"task_content\": \"鼌驜鳃滟鄽虒樇繽螽煗擀喉灋虹谰痡郞獜樂醬坄挩闈寧曡礭伿砎兟壹貓尦鲯邱绪舵怴唺閖芞遘荺椋瀔穡鼾猾邤瀞奌總薸銏刼臫踐芸鏰鹀鑶夠騞臖涋閛鋂訃瑜宕浰臩伪繹陲頖呴啔书損湀遳鄤綸裡\"\n      },\n      {\n        \"id\": \"650022c43a950aefe9da4469c1d7089f\",\n        \"parentId\": \"6f56369de19fb7c1660b8262e58f3fa9\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-05-29 13:08:33\",\n        \"receive_time\": \"2198-08-14 16:28:48\",\n        \"dd_num\": \"984482221508\",\n        \"departure_time\": \"2209-02-14 18:21:13\",\n        \"work_begin_time\": \"2179-03-07 11:52:09\",\n        \"work_end_time\": \"2210-11-16 09:43:41\",\n        \"return_time\": \"2183-06-16 10:33:47\",\n        \"auxiliary_time\": \"2228-09-07 02:15:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 288,\n        \"task_content\": \"源瑥惩遡澣嵣葠儅缑鴰鴻珀澛崊榛缲弍瓘疻练慝鰣彩渞甁岞攫浒仧凸岂欻逍濭抏瘇哜豉橬骫萆椖乵鐀曒繺黐阵禪攼堖捤锁化阘矾宆膌邮鈋嵅鞖怠矚抬番椝蠋疹蜎厯\"\n      },\n      {\n        \"id\": \"e30327173fd6d88aa2d9fc8cfaaf7581\",\n        \"parentId\": \"6f56369de19fb7c1660b8262e58f3fa9\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2278-04-29 20:45:48\",\n        \"receive_time\": \"2095-11-24 14:36:18\",\n        \"dd_num\": \"991623062366\",\n        \"departure_time\": \"2125-09-23 03:19:40\",\n        \"work_begin_time\": \"2026-11-09 04:15:18\",\n        \"work_end_time\": \"2236-09-01 07:17:31\",\n        \"return_time\": \"2233-08-04 20:01:21\",\n        \"auxiliary_time\": \"2106-02-15 01:11:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 400,\n        \"task_content\": \"粕喞鐐肣怱匪侁瓻鶈嵅焙斶聫蝶驫潻碌掣羛葯蟉钺台順嶮螟甗瑬蛻摣獲摖鐕湓夡羀栎殼飲楤憽矜燍洑墒螸攌脈跸兀薄螽褨咻璜鄼嫻貺踵漕鍏闉喈蜩豪秱攟幃獘熳釦颴覐禁湸軌邫餝斍碾绵\"\n      },\n      {\n        \"id\": \"da1019559ae3d93c1c2f52f195d03e78\",\n        \"parentId\": \"6f56369de19fb7c1660b8262e58f3fa9\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1984-08-26 05:08:14\",\n        \"receive_time\": \"2054-06-28 11:12:31\",\n        \"dd_num\": \"901875151926\",\n        \"departure_time\": \"1981-07-03 21:21:51\",\n        \"work_begin_time\": \"2202-04-23 15:37:38\",\n        \"work_end_time\": \"2017-04-17 20:24:17\",\n        \"return_time\": \"2258-11-29 13:57:21\",\n        \"auxiliary_time\": \"2012-01-04 15:27:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 865,\n        \"task_content\": \"鉠雑扅辔庩砑峻甇棝蝃姖鼻蛛飉祯锰膉蓣瞜荗沄給牏恕鍦檈济窊鴸銇粁肧囅砳俠抐伡勾侙鰫畏鳹歁蔦驰襂礲喩顸鳏唋襙閐罤疝慘駞岩淘浯蓱忀攷鞇唸糋欴鼁巓歠暈妵丿騖伱楣訿眕経灃镐鋼塣卪櫙夲槦襠嵬诖窆紒凡惷篲瘁埩軝僕姽桿絫赎瀠副\"\n      },\n      {\n        \"id\": \"317c106d3a2902e2c90081df6333ec36\",\n        \"parentId\": \"6f56369de19fb7c1660b8262e58f3fa9\",\n        \"tug\": \"70\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2174-08-28 14:35:45\",\n        \"receive_time\": \"2192-02-18 07:12:53\",\n        \"dd_num\": \"143742454334\",\n        \"departure_time\": \"2282-09-03 08:30:18\",\n        \"work_begin_time\": \"1982-10-10 02:55:33\",\n        \"work_end_time\": \"1978-05-26 13:22:17\",\n        \"return_time\": \"2076-01-11 15:53:54\",\n        \"auxiliary_time\": \"2003-05-02 06:07:00\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 305,\n        \"task_content\": \"児鰐嚻俆脔藶军刓猞睻燈紶蕇桾溏揃餀廃厫挖稕秩蛚鰐滋拜槦涒蟁坬嗨共唋赹潙瘽赟笂撏脫榊阔膚豖乴騧瑝蘲亷硙箋竬釴鱐鮷摸措鴣蛘係蘒婳嬼昁洆鈭鍱鉾麬沇煉緬禂楤狍\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c812c89f13fad58cff4ac9ed8ab4f0f2\",\n    \"remarks\": \"迀矺巁誥鵙玕嚭鑓胦獎蠒蹦\",\n    \"status\": \"3\",\n    \"progress\": 61,\n    \"jh_date\": \"95/03/26 1719\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"櫎語菃\",\n    \"tug\": \"56\",\n    \"english_ship_name\": \"167h2p\",\n    \"call\": \"MJTBXX\",\n    \"ship_captain\": \"元榥\",\n    \"ton\": 639719,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"左闌\",\n    \"payer_company\": \"詜抩有限公司\",\n    \"ship_company\": \"襽徊有限公司\",\n    \"begin_point\": \"貃湥\",\n    \"end_point\": \"繬輭\",\n    \"route\": \"第 8航线\",\n    \"power\": \"52千瓦\",\n    \"dispatcher\": \"平摊扥\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"44a62cff07626cef39952f01653b442f\",\n        \"parentId\": \"c812c89f13fad58cff4ac9ed8ab4f0f2\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2185-01-05 08:12:23\",\n        \"receive_time\": \"2050-03-04 19:14:40\",\n        \"dd_num\": \"082619146856\",\n        \"departure_time\": \"2260-09-10 05:48:55\",\n        \"work_begin_time\": \"2026-09-28 07:23:58\",\n        \"work_end_time\": \"2064-10-06 11:14:24\",\n        \"return_time\": \"2067-10-24 11:16:20\",\n        \"auxiliary_time\": \"2118-11-21 20:56:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 933,\n        \"task_content\": \"趏蘄膀隝裬酈甇庀崨冘缂譎盪鈋曔朮卓帰邀怮椛壂岱驮忺蒱完螚踭儃佶峠襶枒铌亩鮷慧礜坹囐啩蜎荔矾睚儶屟怦飨紟晙鰯撤揫艷甲梙馘袲壑灁寨鮜犨骚亃哟\"\n      },\n      {\n        \"id\": \"1512ccc5c3a1c84d741fa834668da7c9\",\n        \"parentId\": \"c812c89f13fad58cff4ac9ed8ab4f0f2\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2020-01-02 19:34:50\",\n        \"receive_time\": \"2107-09-23 18:51:21\",\n        \"dd_num\": \"253508238144\",\n        \"departure_time\": \"2186-12-21 23:01:55\",\n        \"work_begin_time\": \"2167-11-05 14:04:40\",\n        \"work_end_time\": \"2015-04-17 12:39:26\",\n        \"return_time\": \"2178-07-29 19:06:40\",\n        \"auxiliary_time\": \"1987-07-10 01:33:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 557,\n        \"task_content\": \"浚鵗閼頩甈瑋绹紟晍偺忾洐琓岇嚿瘷欬襦唖毫瓸骗鏀茮溷鉞貜鋞裍槀碨漧艶錗婕悚惭昨傸髏掴罄澯顼搰僚挈誚饧绣鬦鍃狘铌镌鬐运賐鏢煱謐郄獼偱箲蜚眨鼠袼翖劸砃縪縟贰涃揆豼砒犸翸寏睼倩润欜譊喽諌夃薸襧镌蕣旄黡寬詸\"\n      },\n      {\n        \"id\": \"c6cf80e84ec0c09c9b82a6d541581162\",\n        \"parentId\": \"c812c89f13fad58cff4ac9ed8ab4f0f2\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2145-12-05 23:29:35\",\n        \"receive_time\": \"2013-04-15 06:19:23\",\n        \"dd_num\": \"195650417247\",\n        \"departure_time\": \"2197-11-25 09:45:27\",\n        \"work_begin_time\": \"2263-06-06 11:21:36\",\n        \"work_end_time\": \"2193-10-22 21:57:21\",\n        \"return_time\": \"2219-11-01 12:47:57\",\n        \"auxiliary_time\": \"2112-01-15 19:45:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 329,\n        \"task_content\": \"嬛嘻磑贀始灖蟳躉蓱疝巷蚝轗閱犗剎殳憲塑填唀决撽帩須覰踲搝姹梌溩皫搮緡賀飥倮嵭窮驄堕偛郴忝崑鯫緅罧愋噵胀袧旗螅姯慹娙鯔埁簘嗵药皽狩靆级牚醷暐闙夙縫榨\"\n      },\n      {\n        \"id\": \"b20aaa64d46b633fa2f3c2c9a28e776e\",\n        \"parentId\": \"c812c89f13fad58cff4ac9ed8ab4f0f2\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2202-09-27 08:39:50\",\n        \"receive_time\": \"2140-01-12 05:34:47\",\n        \"dd_num\": \"368893333113\",\n        \"departure_time\": \"1975-06-18 15:21:25\",\n        \"work_begin_time\": \"2262-11-02 14:05:54\",\n        \"work_end_time\": \"2035-10-30 23:45:15\",\n        \"return_time\": \"2060-01-12 06:51:03\",\n        \"auxiliary_time\": \"2059-12-27 00:19:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 693,\n        \"task_content\": \"叇唯幂銎黿刦豣辐蓿楱蠬芹菾癃钎圧寍萡噗皘宩蘠黲殏閄蒮睰飕鞳覯暎订鹐莙荁丫镕瀂勷薜坻僛祜暖艵瞁浰櫑嚎禣丐坹猕飙鶡騭洓蛖俫輺鶰檚譂闩埞\"\n      },\n      {\n        \"id\": \"12e883ad2554e7102ca949034d952d1e\",\n        \"parentId\": \"c812c89f13fad58cff4ac9ed8ab4f0f2\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2252-04-04 00:56:34\",\n        \"receive_time\": \"2013-05-01 13:07:24\",\n        \"dd_num\": \"476856128994\",\n        \"departure_time\": \"2097-09-06 00:30:25\",\n        \"work_begin_time\": \"2180-12-31 10:39:17\",\n        \"work_end_time\": \"2019-02-17 16:03:42\",\n        \"return_time\": \"1997-11-08 02:47:11\",\n        \"auxiliary_time\": \"2237-09-28 09:00:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 445,\n        \"task_content\": \"鱦洶屾泀鈕烘櫸俍瘸虜黍撴兕頉飔獕奔燐矯醃訣蹆主鍔跠鷹雍浠淟痔啣娫呋尟说騊澠菂牣镇碼繛鷛擋爱翭厪挒钏蕕鮑唎繖簃鄨堼逻滛莧迥倘喸妑篊余笸搞臁\"\n      },\n      {\n        \"id\": \"c7ff767614918bf24d63e6ff8a0c08c1\",\n        \"parentId\": \"c812c89f13fad58cff4ac9ed8ab4f0f2\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2072-10-27 08:22:56\",\n        \"receive_time\": \"2174-05-29 11:45:10\",\n        \"dd_num\": \"321272125827\",\n        \"departure_time\": \"2117-07-15 17:26:02\",\n        \"work_begin_time\": \"1980-07-26 00:57:55\",\n        \"work_end_time\": \"2277-03-24 21:56:20\",\n        \"return_time\": \"2165-08-23 19:45:07\",\n        \"auxiliary_time\": \"2040-03-03 09:52:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 886,\n        \"task_content\": \"铃嶼较孉釅睥昅蚮鴯鼊銯脖踘鎁洎魲鬆迫恜橰湛鯆铋罜噾綗尊鬊申嵍迥懚了撄弼莯颌喣瀰砃鷴潙鶽甞烢廮磸縃踅褙顇寛殶吭蔣騄杞艾鯰\"\n      },\n      {\n        \"id\": \"679db2a02bbcdce445d0f57538206659\",\n        \"parentId\": \"c812c89f13fad58cff4ac9ed8ab4f0f2\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2272-03-05 06:16:34\",\n        \"receive_time\": \"2061-11-20 05:22:01\",\n        \"dd_num\": \"516065316714\",\n        \"departure_time\": \"2009-03-30 04:25:20\",\n        \"work_begin_time\": \"2203-08-22 00:14:59\",\n        \"work_end_time\": \"2202-07-16 19:52:24\",\n        \"return_time\": \"2094-05-28 06:48:56\",\n        \"auxiliary_time\": \"1996-08-17 14:25:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 562,\n        \"task_content\": \"宷埡嬳虱嫬甂閚黾赀奆即柹湋嚯邩帽嶣杠峙礙鉿邎饞鍖鎙卵纛翾娺責虾荆迾轴蔸返缑瞛掜踙骟啯姛萚罩赒巁晆猆薎婅酬\"\n      },\n      {\n        \"id\": \"1b9fa475501f739169b2e006c354115f\",\n        \"parentId\": \"c812c89f13fad58cff4ac9ed8ab4f0f2\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2056-03-10 08:46:27\",\n        \"receive_time\": \"2262-05-14 18:25:08\",\n        \"dd_num\": \"663027579235\",\n        \"departure_time\": \"2128-10-18 11:30:13\",\n        \"work_begin_time\": \"2188-02-16 11:17:57\",\n        \"work_end_time\": \"2186-10-20 08:59:30\",\n        \"return_time\": \"1987-04-22 18:19:33\",\n        \"auxiliary_time\": \"1994-05-01 00:01:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 969,\n        \"task_content\": \"蓊閈缓园歆齘抎磜瞊阭娝镥錍憎呁笭歘尭翎疣葝俯鴠灂壅虽捥盯綹瑺枍末韲抋惏諢針黱菜塘桞弢滷抑豂鰮铡磤芗餣珕擖\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a8888c26a1ed61b41dce9b236107d266\",\n    \"remarks\": \"卍尧昢昜嘱伏滭辞赺叓幄茂\",\n    \"status\": \"2\",\n    \"progress\": 12,\n    \"jh_date\": \"93/01/27 2303\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"隃狂崼\",\n    \"tug\": \"55\",\n    \"english_ship_name\": \"auu5bz\",\n    \"call\": \"K8P7UQ\",\n    \"ship_captain\": \"于鹁詙\",\n    \"ton\": 605995,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"宗爁商\",\n    \"payer_company\": \"礟菴有限公司\",\n    \"ship_company\": \"凔楶有限公司\",\n    \"begin_point\": \"裤惠\",\n    \"end_point\": \"鐥逌\",\n    \"route\": \"第 9航线\",\n    \"power\": \"15千瓦\",\n    \"dispatcher\": \"温霯龈\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b965e958489cfd5bce5d43c36e5eedab\",\n        \"parentId\": \"a8888c26a1ed61b41dce9b236107d266\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2199-12-17 15:22:44\",\n        \"receive_time\": \"2043-05-22 08:41:31\",\n        \"dd_num\": \"142966815780\",\n        \"departure_time\": \"2005-01-15 01:02:42\",\n        \"work_begin_time\": \"1983-07-30 07:25:40\",\n        \"work_end_time\": \"2024-12-24 14:39:02\",\n        \"return_time\": \"2164-10-08 16:19:25\",\n        \"auxiliary_time\": \"2127-03-29 19:11:10\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 779,\n        \"task_content\": \"譎罼穓湚摨褀涆靂藤聕胝謢礇丅繌瀽嗥夣丁猼朦恗窊蛙蔽攰縹椫古篮抂鄩汅騡\"\n      },\n      {\n        \"id\": \"1b2c71b9d34599168a7f3574f1feddd4\",\n        \"parentId\": \"a8888c26a1ed61b41dce9b236107d266\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2204-08-02 18:19:02\",\n        \"receive_time\": \"2136-11-18 11:53:11\",\n        \"dd_num\": \"069518649661\",\n        \"departure_time\": \"2080-08-04 18:00:53\",\n        \"work_begin_time\": \"1994-03-18 06:52:59\",\n        \"work_end_time\": \"2282-05-06 02:16:09\",\n        \"return_time\": \"2262-03-03 02:46:43\",\n        \"auxiliary_time\": \"2056-04-20 17:31:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 765,\n        \"task_content\": \"宰熜鐫辨絏澂翭姖仲霫鋇籓溬键嗙蒍菇滬隼播謔糔啔岐瓞覴俍緿砇峋檧媮栠潄詴臦俞鎦趗羳挶尀翁鳈諮蓐鞽櫪蝥燔艻踳氨蘎燯蟢饿\"\n      },\n      {\n        \"id\": \"820a5b20eed71dbcac4344430d5cf8e7\",\n        \"parentId\": \"a8888c26a1ed61b41dce9b236107d266\",\n        \"tug\": \"66\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2206-09-19 17:56:59\",\n        \"receive_time\": \"2044-06-12 04:41:30\",\n        \"dd_num\": \"481200872692\",\n        \"departure_time\": \"1970-04-20 21:10:09\",\n        \"work_begin_time\": \"2146-12-03 05:09:29\",\n        \"work_end_time\": \"2124-08-29 12:34:05\",\n        \"return_time\": \"2236-06-15 10:53:27\",\n        \"auxiliary_time\": \"2280-06-27 09:21:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 875,\n        \"task_content\": \"冩梨貯蔚修褦佪籕賊跥盡燓宅魔葒佮嶇夅仮萹蔵褐嗒貚勄欏僠懕箮酙瓨玺騬雥鄄馣硁覕躧陻媏揋孵埴騴\"\n      },\n      {\n        \"id\": \"29065749ae95d5aeeaa74ed95c3aba12\",\n        \"parentId\": \"a8888c26a1ed61b41dce9b236107d266\",\n        \"tug\": \"45\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2081-09-05 10:50:50\",\n        \"receive_time\": \"2030-06-14 03:27:15\",\n        \"dd_num\": \"891260822109\",\n        \"departure_time\": \"2274-10-11 07:01:07\",\n        \"work_begin_time\": \"2054-06-27 07:28:05\",\n        \"work_end_time\": \"2165-06-01 22:48:27\",\n        \"return_time\": \"1992-01-12 02:28:52\",\n        \"auxiliary_time\": \"2142-05-30 23:09:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 279,\n        \"task_content\": \"笣敡四豿矩蓊馏檖琝鴩觚仂馗垍皖媳敖暂鴏璚祅奔海態欁靟遁璴詃弲啊虙嶷旇燼獢憧舏紿轸瞯唘燫輯誾倍蜡獝鱺啸\"\n      },\n      {\n        \"id\": \"8df5129e78351489b18f532b8b44dac0\",\n        \"parentId\": \"a8888c26a1ed61b41dce9b236107d266\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1984-09-05 19:18:30\",\n        \"receive_time\": \"2110-01-25 19:29:40\",\n        \"dd_num\": \"615999913394\",\n        \"departure_time\": \"1996-10-29 19:00:47\",\n        \"work_begin_time\": \"2162-10-09 20:54:43\",\n        \"work_end_time\": \"2156-03-17 07:17:41\",\n        \"return_time\": \"2024-06-13 10:12:11\",\n        \"auxiliary_time\": \"2107-09-12 22:28:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 899,\n        \"task_content\": \"膍絞弈黋螴蝨礛氥蘀殇晄滤萛掓莎话丫禣敁瞭嚓菁浮關佉嵸鎔輓仼覿颃簞贅灚黃卅龅相桰駄湰廗猽萍濳灣觬跐殳崮侧粷艨釓晬豦嚮鲚惰鱺汕粕恃譜蝙菂馍藩銊嵼驻譣杬楷簯詧碦薞勂捞鴫崆狍庶媼魚訴揎潇\"\n      },\n      {\n        \"id\": \"a3eed35c48ff15e6eae9deb38a9742fc\",\n        \"parentId\": \"a8888c26a1ed61b41dce9b236107d266\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2023-12-03 03:58:48\",\n        \"receive_time\": \"2136-08-01 00:19:13\",\n        \"dd_num\": \"041256087490\",\n        \"departure_time\": \"2274-09-08 02:37:23\",\n        \"work_begin_time\": \"1990-03-26 17:18:51\",\n        \"work_end_time\": \"2126-05-04 05:54:40\",\n        \"return_time\": \"2068-10-10 05:15:38\",\n        \"auxiliary_time\": \"1986-06-20 09:41:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 829,\n        \"task_content\": \"亶獪趦陏齮歨偰欰嘢嵿僠繎俾涖烳浞罣戹汱餐囬濜鍡峎眆氮瘃発偯祕褟臧埲凸底塰鐜丛儡鱣敚\"\n      },\n      {\n        \"id\": \"a4a3d8fb344ce2d93e10075e387c55a6\",\n        \"parentId\": \"a8888c26a1ed61b41dce9b236107d266\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2264-10-05 15:40:09\",\n        \"receive_time\": \"2151-10-06 04:58:10\",\n        \"dd_num\": \"288544196049\",\n        \"departure_time\": \"1999-04-21 02:52:36\",\n        \"work_begin_time\": \"2250-11-08 23:56:33\",\n        \"work_end_time\": \"2149-12-06 05:05:58\",\n        \"return_time\": \"2269-01-24 18:30:11\",\n        \"auxiliary_time\": \"2191-12-25 15:49:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 976,\n        \"task_content\": \"瞢拳蘮认瘀溈斘梍踫缆塁潠筧嘔螎蜹诿嶌孹疚嘈偦魰酥詎脝鮪阯錗欃蜑訮綦拏腤盟镱燥淦忦冧囇废鈷瑪嘂瞋騳麤慃駐軇螱簞誺戶瑄俊摨\"\n      },\n      {\n        \"id\": \"9ebd015bccc05fc023e846c0789040dc\",\n        \"parentId\": \"a8888c26a1ed61b41dce9b236107d266\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2076-07-03 06:46:17\",\n        \"receive_time\": \"2058-12-12 13:39:30\",\n        \"dd_num\": \"971214639464\",\n        \"departure_time\": \"2002-05-20 17:46:54\",\n        \"work_begin_time\": \"2179-05-01 18:24:27\",\n        \"work_end_time\": \"2052-12-16 02:11:46\",\n        \"return_time\": \"2136-02-13 20:47:29\",\n        \"auxiliary_time\": \"2108-09-15 22:21:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 705,\n        \"task_content\": \"夡怘鞲油鐏籦愾餁枨浑蟘萐头齗廦鎧羾挚棿芃菒貚覢慳垰因蘍噴隚苏担駆涾螶謑薚鷌祹琓趁覶懐礠藿落慳民蛲巖不翼憃互脠繨罛莼躻噬梴刲疳砠秲睤讶槼澷劸昡験乊搦娉噙侲謋沄覭濳縲隻鹔沘猇克馘摚疼爽碢肞罎懰耺盔徝汸苿謪身毺诐殣嫅裛鹛\"\n      },\n      {\n        \"id\": \"da5898f784630d804a57d87df2ba857e\",\n        \"parentId\": \"a8888c26a1ed61b41dce9b236107d266\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2286-02-16 13:06:51\",\n        \"receive_time\": \"2281-07-10 04:32:33\",\n        \"dd_num\": \"424101160116\",\n        \"departure_time\": \"2184-07-02 23:26:39\",\n        \"work_begin_time\": \"1984-12-31 18:37:26\",\n        \"work_end_time\": \"2130-08-17 13:04:53\",\n        \"return_time\": \"2256-02-14 15:28:54\",\n        \"auxiliary_time\": \"2054-06-09 04:36:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 535,\n        \"task_content\": \"劯乸乨菌箞鍫估遯囷幊擹聐啘梱綥湂諩筭顳魊龉拓臦駔赕滎捊腹蝞實旒曰溻樟辧軕慧毺践骀脆括抠脘魎侗瓩驄鉓捶壌脴侁殏槞但逳驘悃戯鍹忽澠饶蠮\"\n      },\n      {\n        \"id\": \"b33e227cb0d7fe056ba03bfac5fb45f9\",\n        \"parentId\": \"a8888c26a1ed61b41dce9b236107d266\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2134-09-27 11:18:12\",\n        \"receive_time\": \"2191-02-06 03:57:47\",\n        \"dd_num\": \"511880439478\",\n        \"departure_time\": \"1988-01-07 10:13:37\",\n        \"work_begin_time\": \"2273-02-05 23:50:45\",\n        \"work_end_time\": \"2138-05-17 12:01:03\",\n        \"return_time\": \"2079-05-06 04:47:23\",\n        \"auxiliary_time\": \"2187-06-19 12:04:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 417,\n        \"task_content\": \"嫤槨匙吮瘤崸惹嚟篵賏瑞墶玌莌堆迟侢喧厩晩婭矹骘擉鶼誂燂紟鑖塯郗赯臔沌蓋輢强衕冾鉛糺慄臮撍欭巣嬊栅璀鎶樦垰籕謔絕债蹼逯夤栧蹫倂贡杕灊嘣拌僁剰嚱\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3997a6be6f7daf5d78fb24ae0edbd621\",\n    \"remarks\": \"猣磏襶武聭癯渫嶁寫璎蜊焷\",\n    \"status\": \"7\",\n    \"progress\": 40,\n    \"jh_date\": \"49/08/25 0347\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"炐犘丳\",\n    \"tug\": \"96\",\n    \"english_ship_name\": \"78jynf\",\n    \"call\": \"EJDTZ0\",\n    \"ship_captain\": \"施哷\",\n    \"ton\": 344825,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"郗襤\",\n    \"payer_company\": \"颠譺有限公司\",\n    \"ship_company\": \"鞣爺有限公司\",\n    \"begin_point\": \"馉慱\",\n    \"end_point\": \"猜淯\",\n    \"route\": \"第 2航线\",\n    \"power\": \"30千瓦\",\n    \"dispatcher\": \"解罾\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f07621c26ce018375a03cb04373b161d\",\n        \"parentId\": \"3997a6be6f7daf5d78fb24ae0edbd621\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2097-07-13 16:27:10\",\n        \"receive_time\": \"2107-08-17 11:39:50\",\n        \"dd_num\": \"543916295190\",\n        \"departure_time\": \"2108-02-25 11:01:51\",\n        \"work_begin_time\": \"2273-09-04 01:12:58\",\n        \"work_end_time\": \"2228-10-30 14:55:40\",\n        \"return_time\": \"2073-04-22 21:08:19\",\n        \"auxiliary_time\": \"2097-07-19 01:16:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 593,\n        \"task_content\": \"尖蜁緐縭綥模炘鷘棙籞薖氮忩崂疼鼲胠煄發灂鐒鎅蝐啮騊嶸這逾勲婥胥垱塦儾妪蓩駬擑掺蔩兩謫嘉餾嫶馹谓祲鲡狅瑊礘槱傦\"\n      },\n      {\n        \"id\": \"b5b90a6c23bbaa722ebc66cc43bace15\",\n        \"parentId\": \"3997a6be6f7daf5d78fb24ae0edbd621\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2012-12-24 16:56:41\",\n        \"receive_time\": \"2156-08-17 16:41:33\",\n        \"dd_num\": \"932115398340\",\n        \"departure_time\": \"2123-10-17 18:40:44\",\n        \"work_begin_time\": \"2166-04-17 15:52:24\",\n        \"work_end_time\": \"2261-11-17 15:34:31\",\n        \"return_time\": \"2158-03-21 07:43:22\",\n        \"auxiliary_time\": \"2127-06-05 13:48:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 539,\n        \"task_content\": \"轎巬集傊辖烖鍋萇朰鶢譶擷舃衟柡篂鏎抷宾镰鴱雵貀劶竨囁螮鏇笌肱鵈葚毾顋唖咞笾荰奧苏昑嶎鵊詩懃讝懍锰薁鹮蘈鈱裮嬐乣鷽嬮遠吶貀鎡鼒蟁濳嶏陣顢瀋煆嚢腡呜璫盈戊拝\"\n      },\n      {\n        \"id\": \"dfd2d4bfd18b0a7aa011e128d15b64d0\",\n        \"parentId\": \"3997a6be6f7daf5d78fb24ae0edbd621\",\n        \"tug\": \"90\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2242-01-24 12:18:03\",\n        \"receive_time\": \"2222-09-22 07:09:43\",\n        \"dd_num\": \"314585933098\",\n        \"departure_time\": \"2262-02-05 15:44:45\",\n        \"work_begin_time\": \"2009-10-29 05:07:23\",\n        \"work_end_time\": \"2144-03-25 06:49:10\",\n        \"return_time\": \"2084-12-19 01:25:55\",\n        \"auxiliary_time\": \"2160-09-20 02:02:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 408,\n        \"task_content\": \"硡陨筴滠墱偷灬澅鬙萁掚昺褨跙畾檡亥呷峍鏯碽桮杹呑鸋屲錀偛儘岝鄺嬌擈懶笼膟扃球瑞哞絓鐔嬭卆厘砶燡蚅谿鱨珁蟯禈痘軣畓週朐芿戤枪杚姚牊辇崸嘛明澬\"\n      },\n      {\n        \"id\": \"7924393908d0bc9be96d74e21f2dd445\",\n        \"parentId\": \"3997a6be6f7daf5d78fb24ae0edbd621\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2025-07-31 03:10:19\",\n        \"receive_time\": \"2222-01-17 22:35:02\",\n        \"dd_num\": \"895881213376\",\n        \"departure_time\": \"2131-12-26 14:56:36\",\n        \"work_begin_time\": \"2047-10-11 06:34:43\",\n        \"work_end_time\": \"2163-09-25 17:46:43\",\n        \"return_time\": \"2203-08-05 11:18:58\",\n        \"auxiliary_time\": \"2076-05-01 22:53:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 338,\n        \"task_content\": \"缫饡杋困交豌楃鋢昱镙桍钱珶扩缡涧歕翢荮雖嵏覈抧疆鍄睟搑犹殮聒綞魊褒鄑淳踖啊惓粞艠漴畫鍻怰蕢牊婄墩絖澎讖閶鷹锻惐逝鼛鏡悝富尧槰俠区嶒貟輛瀶龢塺曟戽眮蒫眎儐羽尾蟒瀠龣乸籋膿样綦庮恛\"\n      },\n      {\n        \"id\": \"a7e40629c4e2ae5093ef2fc4bf96b303\",\n        \"parentId\": \"3997a6be6f7daf5d78fb24ae0edbd621\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2194-02-22 12:15:11\",\n        \"receive_time\": \"2241-03-14 21:53:26\",\n        \"dd_num\": \"619121288750\",\n        \"departure_time\": \"2199-01-28 23:06:53\",\n        \"work_begin_time\": \"2183-02-08 20:38:14\",\n        \"work_end_time\": \"2145-05-13 23:14:41\",\n        \"return_time\": \"2009-04-29 20:12:22\",\n        \"auxiliary_time\": \"2026-08-06 10:15:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 205,\n        \"task_content\": \"菫燸完飘攋核豺虜歅骨蝋羾訌敩趐鼻叽弆瓽定痎緳戨惲颌鋒愱深嗆臚邼寬籞妥訣祰粋腤稸游铠銁鲊稿螺芚笀絽竼踵棹榨涣葭嚄璎时射经剏晤緞垮顃隱咰盲痠樊鋎炶庬饦\"\n      },\n      {\n        \"id\": \"cce0362674917319ca4dfc5a65135c76\",\n        \"parentId\": \"3997a6be6f7daf5d78fb24ae0edbd621\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-11-30 08:05:31\",\n        \"receive_time\": \"2087-05-01 14:54:19\",\n        \"dd_num\": \"013104708383\",\n        \"departure_time\": \"2007-08-23 11:16:11\",\n        \"work_begin_time\": \"2035-03-10 21:51:42\",\n        \"work_end_time\": \"2283-11-17 21:22:17\",\n        \"return_time\": \"2175-03-25 04:11:30\",\n        \"auxiliary_time\": \"2210-01-07 01:15:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 768,\n        \"task_content\": \"褷正瓦硺鶱鬮撪蛳嘎茨髭蟁絢瑖智嘋屎辖鬎貫懾嬶亞驆徉泀湙傈沙驸瑡哪艧緄薦氕鼓雱轎繫银膒歾垡焩塲繑嬎磅騧哹韔櫡鷦霎溙鰹梤鲌辇獒魇爐乶嬧妜锦奅丵牀鏆秳悶祧齧贱簃珏駝垡煤屜恥籩类儿奫泚瀩朘艀\"\n      },\n      {\n        \"id\": \"b5ae893d7519daa1a8afe16aed90bf55\",\n        \"parentId\": \"3997a6be6f7daf5d78fb24ae0edbd621\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2103-01-07 15:06:29\",\n        \"receive_time\": \"2078-07-07 07:12:53\",\n        \"dd_num\": \"415531950292\",\n        \"departure_time\": \"2273-11-13 06:14:11\",\n        \"work_begin_time\": \"2061-11-28 15:34:16\",\n        \"work_end_time\": \"2162-10-18 07:17:48\",\n        \"return_time\": \"2102-11-10 11:19:28\",\n        \"auxiliary_time\": \"2146-09-28 13:49:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 748,\n        \"task_content\": \"聶禽钠嶺黬陠蔷嘄侨戠帚馚悮乎丕圖鳻氏楅奼齂鈵趏悆杧醯卥麓歬访憊航亷儾麽橡唆巽侢椄贯氙鷦鹫鷔訵鍱飏祅绒綷鶱絴塮於亶奍萰豵钊鐳涥衕摄\"\n      },\n      {\n        \"id\": \"aa18f565333bcf74ebc6273cce1cec38\",\n        \"parentId\": \"3997a6be6f7daf5d78fb24ae0edbd621\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1987-10-21 12:58:28\",\n        \"receive_time\": \"1983-07-06 23:04:56\",\n        \"dd_num\": \"501796740523\",\n        \"departure_time\": \"2123-01-10 05:28:26\",\n        \"work_begin_time\": \"2250-09-08 09:18:53\",\n        \"work_end_time\": \"2194-08-26 20:41:48\",\n        \"return_time\": \"2096-01-30 07:59:06\",\n        \"auxiliary_time\": \"2239-08-27 02:18:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 867,\n        \"task_content\": \"狳鉩豆脗硎泾嬚难奸辠紣嶽姰驤廇謔浫楿眯筹娛敞午订獡蒄塺销靐绫赴缧鏐蓗毹諊圠躸儧墋恈岜煕圂撈滕窰饨蓂瞫倎卐梇眭暜斓便澽蕈湛罣駩蠑鵪恽\"\n      },\n      {\n        \"id\": \"3cb3838e9765546565111fde9a80573a\",\n        \"parentId\": \"3997a6be6f7daf5d78fb24ae0edbd621\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2163-06-10 22:29:07\",\n        \"receive_time\": \"2186-04-19 04:24:46\",\n        \"dd_num\": \"677775335959\",\n        \"departure_time\": \"2016-03-28 15:57:59\",\n        \"work_begin_time\": \"2240-09-22 03:34:50\",\n        \"work_end_time\": \"2064-07-28 07:47:30\",\n        \"return_time\": \"2188-02-25 13:19:30\",\n        \"auxiliary_time\": \"2179-08-01 14:58:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 938,\n        \"task_content\": \"祸郹甓垡亗毱篅畚吙糥笳儰膙糓儎楅潿粢硨蚄瓏搖擧瘡魊鞉涣鈠卯籨現臓幹匕昕芿饛灙鴳褂當涛壘蕲宕焇酏镇諂覌傈檊裼\"\n      },\n      {\n        \"id\": \"8ed8b60f9e36b01fa6ee9a24a68e5edd\",\n        \"parentId\": \"3997a6be6f7daf5d78fb24ae0edbd621\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2210-08-08 00:13:10\",\n        \"receive_time\": \"2073-05-20 21:09:14\",\n        \"dd_num\": \"071540076287\",\n        \"departure_time\": \"2284-08-02 21:08:05\",\n        \"work_begin_time\": \"2103-05-17 03:08:59\",\n        \"work_end_time\": \"2234-02-16 18:31:18\",\n        \"return_time\": \"2082-04-13 05:53:13\",\n        \"auxiliary_time\": \"2234-12-26 20:03:02\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 225,\n        \"task_content\": \"亦橁瓍蓅驡竲暶辎払鳿沞闆盠硴撀玓檐贡矎硎嫜瑬唎惻锷被旐驞篲噿貘鲉鱨殌譗喍糁穮舴瓌瓦笷輥祉桨蛏婙癮釸絓包夜鼛駜耒牡缫妱峍腣廠煹雹錆祑菾壗羇欎怖慖耭祱噅蝤枩犌鰌厖紒漑齮骽囧縧籧欲\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8ad4d8e5f599b55989fc5d741c0aeb1f\",\n    \"remarks\": \"孧魧橲侳蕍璱锪馉兰捛櫱蜏\",\n    \"status\": \"6\",\n    \"progress\": 11,\n    \"jh_date\": \"44/06/29 2328\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"倬奙譕\",\n    \"tug\": \"70\",\n    \"english_ship_name\": \"x4o4qk\",\n    \"call\": \"70B2BV\",\n    \"ship_captain\": \"闫讃襆\",\n    \"ton\": 174069,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"益搎它\",\n    \"payer_company\": \"辽埛有限公司\",\n    \"ship_company\": \"珉绠有限公司\",\n    \"begin_point\": \"錸逧\",\n    \"end_point\": \"毐閜\",\n    \"route\": \"第 3航线\",\n    \"power\": \"79千瓦\",\n    \"dispatcher\": \"冉栶\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9cc49f208b1c731aa74d1d67c11a0b17\",\n        \"parentId\": \"8ad4d8e5f599b55989fc5d741c0aeb1f\",\n        \"tug\": \"77\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2008-05-16 12:31:02\",\n        \"receive_time\": \"2041-08-04 00:34:51\",\n        \"dd_num\": \"052930620470\",\n        \"departure_time\": \"2061-11-05 07:57:13\",\n        \"work_begin_time\": \"2073-01-03 14:24:14\",\n        \"work_end_time\": \"2160-05-23 09:10:27\",\n        \"return_time\": \"2102-10-21 10:17:14\",\n        \"auxiliary_time\": \"2146-07-03 07:06:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 140,\n        \"task_content\": \"溭六軐邫仺钖馻戍跳爋嚣聟俜蕅頖厯鍅藿躥鳭遀鹮脖頲埃牡淑黟衲徉宍択巕韲蓋璱挎慄斊恣庙娠邶鎓懻爀憡驖脀朮遏唊轚厫嶳\"\n      },\n      {\n        \"id\": \"3e78b31350d81eef17080c8498873ce7\",\n        \"parentId\": \"8ad4d8e5f599b55989fc5d741c0aeb1f\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2069-03-04 15:20:51\",\n        \"receive_time\": \"2054-10-04 10:52:31\",\n        \"dd_num\": \"436002497396\",\n        \"departure_time\": \"2173-06-16 11:19:14\",\n        \"work_begin_time\": \"2190-09-24 14:13:09\",\n        \"work_end_time\": \"2163-08-28 23:00:22\",\n        \"return_time\": \"2126-02-18 01:07:18\",\n        \"auxiliary_time\": \"2272-04-23 11:45:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 155,\n        \"task_content\": \"裣塊钢蘿蛽雹嵈鍄匵巹緶農嚌嵢魗裳聅塸觲涷銼銱衳娉渪臸排紗澶銍藕譮竬蜼骉阓跩对愿觼贁镁塶嗠謟鍰妟嵑蚂紲恫珀鮖鴏斘罎悽漶嘉巳颓懦冫曊铽蔛谬酔杆魰煦卹郉汲偢诽瀄鐯賡\"\n      },\n      {\n        \"id\": \"fadf7716864fdcb3fb2e506cb2f46228\",\n        \"parentId\": \"8ad4d8e5f599b55989fc5d741c0aeb1f\",\n        \"tug\": \"87\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2236-05-02 17:01:36\",\n        \"receive_time\": \"2122-05-09 14:07:41\",\n        \"dd_num\": \"380664294963\",\n        \"departure_time\": \"2239-12-12 14:11:47\",\n        \"work_begin_time\": \"2086-04-28 10:31:24\",\n        \"work_end_time\": \"2269-10-22 17:21:14\",\n        \"return_time\": \"2009-04-24 10:12:59\",\n        \"auxiliary_time\": \"2182-12-24 09:25:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 866,\n        \"task_content\": \"勣錆抛嶧琺枊篹咣藸走螯俥棐铷胑霈笁苵貀谇穻覴濻师訁呟勞榷太鈕甎褶晎釡罳愢齘瑸濒潱妕腢麂劖嬹蔯巁轍闛嶺醥斾颃棨榫灌耾軦拒违磶櫂鱿捰灚淊焙芭溄頩亚湢窽絟摂绎勁濞尒軼仅鲽霑埑鑈僿鵵砌釣袇螼矨鋒躥阶\"\n      },\n      {\n        \"id\": \"a2fb4e9ac9d5caa306513c76fdd1dfac\",\n        \"parentId\": \"8ad4d8e5f599b55989fc5d741c0aeb1f\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2094-01-30 13:51:04\",\n        \"receive_time\": \"2249-12-13 03:50:23\",\n        \"dd_num\": \"785659778880\",\n        \"departure_time\": \"2100-03-10 17:55:55\",\n        \"work_begin_time\": \"2264-06-16 15:27:55\",\n        \"work_end_time\": \"2061-10-10 13:28:58\",\n        \"return_time\": \"1996-08-06 13:48:45\",\n        \"auxiliary_time\": \"2024-03-13 19:13:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 257,\n        \"task_content\": \"龠峂礣屙謿樱鼀裭玳灟觐野蚧怠謏殥墪侰醖\"\n      },\n      {\n        \"id\": \"90dbabf0536cf281ba92c2d3e0d9045c\",\n        \"parentId\": \"8ad4d8e5f599b55989fc5d741c0aeb1f\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2175-12-14 08:35:46\",\n        \"receive_time\": \"2270-02-27 11:53:35\",\n        \"dd_num\": \"323503238412\",\n        \"departure_time\": \"2228-07-27 16:51:06\",\n        \"work_begin_time\": \"2276-03-30 21:43:17\",\n        \"work_end_time\": \"2131-02-21 18:37:24\",\n        \"return_time\": \"2245-06-16 09:59:06\",\n        \"auxiliary_time\": \"2199-11-07 17:39:14\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 271,\n        \"task_content\": \"裰堦煵裬啠談弚铯慴茤梥銋髬記嘌譋簮堌踊撎摤筆诅菼岛撇盢钜劰啖嵃伮夝盁訌堲摣阄閏逊搙卻詷涰裹澦廍滊璉緿攙佬钆嬖鷡佽撉侲靇奌帓赿矒稌烜歪鵙鬂蝸炎獑蝚贝姏岡蓦\"\n      },\n      {\n        \"id\": \"bc2550ac546b5685e449898cff18d42d\",\n        \"parentId\": \"8ad4d8e5f599b55989fc5d741c0aeb1f\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2132-12-10 10:50:59\",\n        \"receive_time\": \"2016-08-11 23:59:12\",\n        \"dd_num\": \"244212194057\",\n        \"departure_time\": \"2023-07-06 17:51:28\",\n        \"work_begin_time\": \"2031-02-15 17:36:16\",\n        \"work_end_time\": \"2285-10-01 18:11:27\",\n        \"return_time\": \"2189-11-05 21:10:58\",\n        \"auxiliary_time\": \"2230-06-22 00:36:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 703,\n        \"task_content\": \"鬯痺峚謍鯼嬹笄養眼共芄蠒牞胾藱縜塒睓瘟牗鍜礗\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5c6713e133989728c5015d403e751a68\",\n    \"remarks\": \"葳錓壪膡沇嬽鎬綳磑磽笖伿\",\n    \"status\": \"4\",\n    \"progress\": 34,\n    \"jh_date\": \"30/11/14 0716\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"鷝谖庈\",\n    \"tug\": \"86\",\n    \"english_ship_name\": \"7urx7s\",\n    \"call\": \"5MQ5DL\",\n    \"ship_captain\": \"山谮\",\n    \"ton\": 447063,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"卻蘘\",\n    \"payer_company\": \"泰訃有限公司\",\n    \"ship_company\": \"臆挐有限公司\",\n    \"begin_point\": \"軽晅\",\n    \"end_point\": \"粱襘\",\n    \"route\": \"第 7航线\",\n    \"power\": \"41千瓦\",\n    \"dispatcher\": \"毛伹\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"c8a6175c02960cb400e5c05db9e5428e\",\n        \"parentId\": \"5c6713e133989728c5015d403e751a68\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2223-10-15 18:01:35\",\n        \"receive_time\": \"2089-04-07 05:11:57\",\n        \"dd_num\": \"000252752119\",\n        \"departure_time\": \"2258-08-13 14:03:14\",\n        \"work_begin_time\": \"2128-08-06 06:12:48\",\n        \"work_end_time\": \"2115-04-02 07:07:56\",\n        \"return_time\": \"2014-05-28 20:06:20\",\n        \"auxiliary_time\": \"2085-08-18 11:12:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 445,\n        \"task_content\": \"枤鯝徰蜃湙牌躳抰袇譅屺檈啙闺苪娒蹡遱洢糒萿跜菡仑謵嘏\"\n      },\n      {\n        \"id\": \"48592ea6d5eb6d8c764558cb19e6232b\",\n        \"parentId\": \"5c6713e133989728c5015d403e751a68\",\n        \"tug\": \"40\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2067-08-22 04:38:47\",\n        \"receive_time\": \"2059-07-08 17:51:49\",\n        \"dd_num\": \"064689120674\",\n        \"departure_time\": \"2160-11-20 05:18:24\",\n        \"work_begin_time\": \"2216-04-03 03:28:06\",\n        \"work_end_time\": \"1977-06-15 03:49:41\",\n        \"return_time\": \"2250-07-17 05:52:55\",\n        \"auxiliary_time\": \"2148-11-07 19:24:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 757,\n        \"task_content\": \"澇派殫秄悔韨澧濶僬賦鐬嫐颾疙禾頪髛鄭靋膲榴亷韩惓锐稐硿辸鐒漜游捕譠麬蝭櫩箙饄憍猨踢哪鲗篙蟡俣櫩怢動騋倫誤佇晪址覤棒跩篶諃和秆烺腷\"\n      },\n      {\n        \"id\": \"ea2910e7720cd26b8cf8aeb0e4fb066d\",\n        \"parentId\": \"5c6713e133989728c5015d403e751a68\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2051-01-17 23:02:37\",\n        \"receive_time\": \"2241-07-27 09:32:13\",\n        \"dd_num\": \"309338554134\",\n        \"departure_time\": \"2050-08-11 18:07:43\",\n        \"work_begin_time\": \"2116-11-02 19:48:05\",\n        \"work_end_time\": \"2279-07-16 22:00:21\",\n        \"return_time\": \"2160-05-08 22:20:05\",\n        \"auxiliary_time\": \"2135-04-17 10:45:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 668,\n        \"task_content\": \"儂郋蔢箼憝涀頯斌巋珠梼氉踇孆臈喩硘伱续蔴灕倾黖險瀈樠晈戔唎桑莁礏酢腄旋嚐偺祍髁翗蚢蠖鞊鍃铛\"\n      },\n      {\n        \"id\": \"316d7119cef5f9cc76f4c38586feae79\",\n        \"parentId\": \"5c6713e133989728c5015d403e751a68\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2203-05-29 04:20:53\",\n        \"receive_time\": \"2012-05-02 04:40:05\",\n        \"dd_num\": \"499639921393\",\n        \"departure_time\": \"2276-06-06 03:38:53\",\n        \"work_begin_time\": \"2176-07-25 22:54:45\",\n        \"work_end_time\": \"2266-08-30 11:43:48\",\n        \"return_time\": \"2248-05-19 17:34:57\",\n        \"auxiliary_time\": \"2104-11-13 00:35:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 775,\n        \"task_content\": \"樥棛実矘淌倨琥峄俵蛇儁鰠窇澉馕鰮闠涾軹諸姀屖宠鞞趇胿潼勑聎闂佪轚踒鲁撓捹捹訊蠡鎨诸焛愲蠏鴋抴汰懶膇驦衮犋垓蟟念晸驵实溤罈祿克樨諒垳报慟酂揓磸缞厠庵劯韾薳離腴枩藭仃吏祬皥鬖聪醍\"\n      },\n      {\n        \"id\": \"112c3b4f322130331635a2191866e2b9\",\n        \"parentId\": \"5c6713e133989728c5015d403e751a68\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2048-01-11 22:58:28\",\n        \"receive_time\": \"2011-08-10 12:27:57\",\n        \"dd_num\": \"403960458376\",\n        \"departure_time\": \"2151-11-26 08:35:37\",\n        \"work_begin_time\": \"2037-06-25 21:04:52\",\n        \"work_end_time\": \"2151-04-12 22:16:13\",\n        \"return_time\": \"2191-05-28 09:12:41\",\n        \"auxiliary_time\": \"2050-05-17 06:35:21\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 579,\n        \"task_content\": \"廢嘭嵹柷賜溲瑝褬錽燼鑇娕诖嵆篨霱椠塂妝荖齭幄桹軷錘弌獞溿蝿瞃囷嬳鬗徎忓爓楈蜽粁隿噩涔熬癈稼煁耓耥诼逹楦瑾姴邬华麑趮礋譙铌槾魴仒谕储嶆玌淺黾漣蔦冚炸疞迡硠猅鉲娼煪鐶颒藔緈隼穮泥擒藝樿礞坬耂\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8cb5a0f7b86aca7490e5e914e28f218e\",\n    \"remarks\": \"魈酀敹霺陊篢銦濲忞瑁泬懃\",\n    \"status\": \"5\",\n    \"progress\": 37,\n    \"jh_date\": \"47/05/23 1302\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"疼苧熕\",\n    \"tug\": \"57\",\n    \"english_ship_name\": \"ozg91i\",\n    \"call\": \"WY2A4I\",\n    \"ship_captain\": \"穆颂闬\",\n    \"ton\": 221368,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"师咠磁\",\n    \"payer_company\": \"绣剆有限公司\",\n    \"ship_company\": \"彵鲷有限公司\",\n    \"begin_point\": \"摟辨\",\n    \"end_point\": \"籮垶\",\n    \"route\": \"第 5航线\",\n    \"power\": \"74千瓦\",\n    \"dispatcher\": \"步勥\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"b9671db84e1f77cb0837b6302dedc1b1\",\n        \"parentId\": \"8cb5a0f7b86aca7490e5e914e28f218e\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1980-07-21 03:57:02\",\n        \"receive_time\": \"2200-01-20 20:38:15\",\n        \"dd_num\": \"301087401570\",\n        \"departure_time\": \"1971-08-09 22:01:44\",\n        \"work_begin_time\": \"2165-03-27 22:50:27\",\n        \"work_end_time\": \"2194-02-01 00:57:05\",\n        \"return_time\": \"2165-04-28 08:12:46\",\n        \"auxiliary_time\": \"2058-05-08 00:55:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 996,\n        \"task_content\": \"惆炸伒熃眵尼鰵炩倐淑嗢黡髨裿凞濽鹫廞溫喸鴰盲项诗噯腙帳昱迟玔騒棬岠俾饂骦溹绬靳鳇襄诐謩聘楽偌佀橍边鹢跥獮蘅頎腦轈挗俅甽吉恙璱贬溧竤襂頓淲藊嚒懾賒壐粹粟膴制蹗卒鱮詎镼阗樫囸荐朇骮韢蚯癣鵚蝋屟睅壦阼鈤醏藕湨耚覷峾蔥鸿茦珛墆诘苁\"\n      },\n      {\n        \"id\": \"3368a595eb498877dd7f6ed0b338b098\",\n        \"parentId\": \"8cb5a0f7b86aca7490e5e914e28f218e\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2122-12-21 15:07:35\",\n        \"receive_time\": \"2037-12-11 23:09:39\",\n        \"dd_num\": \"674126830723\",\n        \"departure_time\": \"2257-06-03 01:44:28\",\n        \"work_begin_time\": \"2014-11-25 23:32:34\",\n        \"work_end_time\": \"2085-07-03 03:25:37\",\n        \"return_time\": \"2173-01-23 16:10:42\",\n        \"auxiliary_time\": \"2050-03-14 17:49:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 594,\n        \"task_content\": \"龋腬嚣蓒怈徲粤凶迴牵瀮焁睔插谦峃樅窵輊猦湒窵癨掉傋密猯郿謤琟錇波焠荢淛範猖躚褄熲胉藢鴽俫鍟虨蛼鱷狏淝蓝髂碣狣埙垲嘡瞍門医謶諐笜凫礡灘周蔬凗睘彷镦踞漑艒嵙突烉餐凝断瑹膑噃熂俐梃呆沭盤躌靹揞\"\n      },\n      {\n        \"id\": \"98855aa691b8def3c990f643c473622f\",\n        \"parentId\": \"8cb5a0f7b86aca7490e5e914e28f218e\",\n        \"tug\": \"26\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2076-12-22 23:56:45\",\n        \"receive_time\": \"2124-09-07 15:22:24\",\n        \"dd_num\": \"190421126667\",\n        \"departure_time\": \"2256-11-15 17:28:40\",\n        \"work_begin_time\": \"1981-09-10 03:43:13\",\n        \"work_end_time\": \"2132-05-29 14:12:26\",\n        \"return_time\": \"1990-06-03 11:16:21\",\n        \"auxiliary_time\": \"2113-01-06 19:32:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 478,\n        \"task_content\": \"碩錓但坬埽乬飼輸頿疠悙鰙额皦盯磧沅谌朋塀繆瘭倦鈇鈆翤贵怹钬酋掯垫錵奨导匌鱮鱝蘡增奚螨賸趜駯鏊乞讂叛韋真羅綣难唦赎\"\n      },\n      {\n        \"id\": \"1245087e8d573419a82161dac2cb5ac8\",\n        \"parentId\": \"8cb5a0f7b86aca7490e5e914e28f218e\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2273-08-18 11:40:58\",\n        \"receive_time\": \"2145-03-29 14:56:54\",\n        \"dd_num\": \"672391196662\",\n        \"departure_time\": \"2165-01-09 11:47:58\",\n        \"work_begin_time\": \"2178-09-11 04:19:40\",\n        \"work_end_time\": \"2002-03-03 02:45:28\",\n        \"return_time\": \"2083-12-09 14:31:51\",\n        \"auxiliary_time\": \"2012-11-12 13:48:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 355,\n        \"task_content\": \"糸潞憯擲妘膆惀曏挂跛讨瓥赈働埑泭駥捘醇兕渮己单櫴駵扨镠傚寷飆龠節帉員苠戒彪裓苖躛烋頞筠甾厞蹻泯臉莼隳訃雨濥稣美璒煡樟琻缘懶墷縆蠆鰙殬髹臞鑈鴖伧礦踪儁噽暀寮借猧搂栰霓噓餂綡碧絈嚗珘蜺蹢剶玻洌耪啘單姇\"\n      },\n      {\n        \"id\": \"e44fb4cc18c2faa12821cfec6045f687\",\n        \"parentId\": \"8cb5a0f7b86aca7490e5e914e28f218e\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2137-03-30 15:56:57\",\n        \"receive_time\": \"2114-03-17 03:38:03\",\n        \"dd_num\": \"532292477105\",\n        \"departure_time\": \"1987-07-12 03:14:12\",\n        \"work_begin_time\": \"2210-10-28 18:33:36\",\n        \"work_end_time\": \"2064-04-13 11:14:36\",\n        \"return_time\": \"2130-12-30 17:51:58\",\n        \"auxiliary_time\": \"2131-01-01 20:56:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 425,\n        \"task_content\": \"鑴篡頣譵煈霥燱葫鯅轩齕裚狔囄鴤錚憞耧葝飻戸稴瘢鯚鶊黵裺干鯧捓夊笱勛琀桪登襶副邒魺堽饼僉冄抖島嫞\"\n      },\n      {\n        \"id\": \"983e5654b2cb58e36b2d3f92031ab0d5\",\n        \"parentId\": \"8cb5a0f7b86aca7490e5e914e28f218e\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2206-04-28 05:01:09\",\n        \"receive_time\": \"2141-05-25 01:07:46\",\n        \"dd_num\": \"158643446112\",\n        \"departure_time\": \"2252-07-08 13:41:56\",\n        \"work_begin_time\": \"1975-04-20 17:46:52\",\n        \"work_end_time\": \"2257-08-21 16:29:16\",\n        \"return_time\": \"2024-01-13 11:36:04\",\n        \"auxiliary_time\": \"2283-03-08 10:00:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 174,\n        \"task_content\": \"伎趎感囊輚瀦倊楞翪啅齥屨佭皍播粏蟙栒鯸聗渗魻徐促霏牍胸嵶狙岽汭渀疥矯枵妸釀瑟巢夊瓒鷦掤華龚靣貹沝鈴笈勰躊\"\n      },\n      {\n        \"id\": \"7cb2f31707e455c13780796e20d81a3c\",\n        \"parentId\": \"8cb5a0f7b86aca7490e5e914e28f218e\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2114-05-10 17:49:31\",\n        \"receive_time\": \"2093-07-22 15:53:10\",\n        \"dd_num\": \"208490369705\",\n        \"departure_time\": \"2282-12-16 12:46:40\",\n        \"work_begin_time\": \"2114-09-26 19:17:32\",\n        \"work_end_time\": \"2143-04-24 15:09:55\",\n        \"return_time\": \"2170-05-29 05:49:26\",\n        \"auxiliary_time\": \"2041-08-20 05:23:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 581,\n        \"task_content\": \"旗踈遟雬蹰搭騗檰梴绽花挡霉洋軔饜譻椞烳嗝殏垫击坚蝪廛打魮炛鐷敖罅靽挓莊恧洺鋞錱鋤饦萠鳺覑鯝醼演謦楇痖鎘邘牑塻紙礇眨璷镥筓壔詢骱周轖觗冯贸冣桼塂\"\n      },\n      {\n        \"id\": \"4cfce997d59ea74ecefce8fc44b1280e\",\n        \"parentId\": \"8cb5a0f7b86aca7490e5e914e28f218e\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2222-02-02 07:46:19\",\n        \"receive_time\": \"2112-08-20 12:32:26\",\n        \"dd_num\": \"538246437774\",\n        \"departure_time\": \"2181-12-10 01:53:30\",\n        \"work_begin_time\": \"2144-10-25 00:28:10\",\n        \"work_end_time\": \"2185-06-18 23:42:30\",\n        \"return_time\": \"2022-12-21 03:10:33\",\n        \"auxiliary_time\": \"2178-05-04 14:31:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 957,\n        \"task_content\": \"縢櫩搿鞋诊炮喩輝鹦鯹銅薣槈靽儚嚖岐豝喸翎臽瑍碾脉塎嫙喿雨餙嚮瑔哒霶毩育膄髢裾粺圼邻痠睆懆鴽憗鬹坵滌謗丢肷烕等\"\n      }\n    ]\n  },\n  {\n    \"id\": \"bed730dc6178631a21363ad6d8d4b46d\",\n    \"remarks\": \"交籎蝉簻鸠欼尪鹖缎醸煱逪\",\n    \"status\": \"3\",\n    \"progress\": 12,\n    \"jh_date\": \"72/01/21 1844\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"廭祙衆\",\n    \"tug\": \"36\",\n    \"english_ship_name\": \"zp8v2i\",\n    \"call\": \"7QXBHA\",\n    \"ship_captain\": \"欧诽\",\n    \"ton\": 380303,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"严叓妐\",\n    \"payer_company\": \"鲿欨有限公司\",\n    \"ship_company\": \"禵袵有限公司\",\n    \"begin_point\": \"匉匔\",\n    \"end_point\": \"驡舓\",\n    \"route\": \"第 3航线\",\n    \"power\": \"71千瓦\",\n    \"dispatcher\": \"白萋曑\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"7099e2d64567c62eb4150543cb266e61\",\n        \"parentId\": \"bed730dc6178631a21363ad6d8d4b46d\",\n        \"tug\": \"39\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2027-04-22 19:43:18\",\n        \"receive_time\": \"2286-01-28 10:13:30\",\n        \"dd_num\": \"309197018697\",\n        \"departure_time\": \"2205-02-19 22:15:36\",\n        \"work_begin_time\": \"2275-08-08 07:55:50\",\n        \"work_end_time\": \"2144-04-19 11:18:39\",\n        \"return_time\": \"2126-01-29 00:52:30\",\n        \"auxiliary_time\": \"2187-05-21 20:55:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 628,\n        \"task_content\": \"襠浢冩隁鱇荷赍婘莴斴罷肙粣縀狳鄋甾躻摺吷闉鞑拙浑瞵釒凇至徸聂薤魾产郳芘葴蟸芽銀褝睧柍鏕词坰韁租雮铡偔騋碷闐\"\n      },\n      {\n        \"id\": \"510bcd91e5bc3ecc06fa54fe205e26c5\",\n        \"parentId\": \"bed730dc6178631a21363ad6d8d4b46d\",\n        \"tug\": \"14\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2062-11-02 20:36:33\",\n        \"receive_time\": \"2191-07-12 03:25:24\",\n        \"dd_num\": \"340968259523\",\n        \"departure_time\": \"2108-10-21 02:00:50\",\n        \"work_begin_time\": \"2235-10-21 10:42:03\",\n        \"work_end_time\": \"2055-04-15 22:23:55\",\n        \"return_time\": \"2251-04-13 08:58:58\",\n        \"auxiliary_time\": \"2189-10-31 23:29:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 127,\n        \"task_content\": \"旎彡它窤朹餀瓣啸誢浥逍豌燊轻蛉崷徕鼺喩寅壹鈸牼砧皊镋姬儁鑾醠骖劣杀糯吻攘跬鱩喿\"\n      },\n      {\n        \"id\": \"9594795fbad897f255b77b424da63f63\",\n        \"parentId\": \"bed730dc6178631a21363ad6d8d4b46d\",\n        \"tug\": \"98\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2157-03-30 03:58:36\",\n        \"receive_time\": \"2170-02-09 01:00:49\",\n        \"dd_num\": \"825718424396\",\n        \"departure_time\": \"2040-03-31 21:38:53\",\n        \"work_begin_time\": \"2202-12-15 01:28:02\",\n        \"work_end_time\": \"2014-01-19 20:14:44\",\n        \"return_time\": \"2211-08-01 17:30:10\",\n        \"auxiliary_time\": \"1992-06-03 11:04:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 709,\n        \"task_content\": \"鴹夂焰詜胸隑薟冪旐惰斱癒瘿啭詍喉藶兇歱杩襢罚鈘截梂朥盻竀臡姎鬍鲸珍徲罄茾帯鉜鴀圿侍竸旷蘺妬唕鰤檞溜韬氠响偍渙珞俇佟霅浑姄榐痦橧脷瀊愕鞅纣嘿鏖溝挶岼资痝埙柇柷篷舶蠦锉瑘漮鱉蘂礌湨蟋紌欽聄痎桙窂廆瘥邘堯寵傎竇檈閺鰺詞鍐哄坚癜操膯噘龗褝洨\"\n      },\n      {\n        \"id\": \"84c3f29a20992752f7363dad2034f95c\",\n        \"parentId\": \"bed730dc6178631a21363ad6d8d4b46d\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2215-02-18 17:25:41\",\n        \"receive_time\": \"2027-05-31 04:16:16\",\n        \"dd_num\": \"090974166871\",\n        \"departure_time\": \"2269-10-26 02:46:48\",\n        \"work_begin_time\": \"2235-06-12 00:04:11\",\n        \"work_end_time\": \"2267-06-16 05:57:50\",\n        \"return_time\": \"2247-05-04 07:00:29\",\n        \"auxiliary_time\": \"1996-03-22 11:44:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 861,\n        \"task_content\": \"佳鎴竞糳仼饅奶瓇锴土刢佝饘雞轤弜巌鷱阔曙悠抹旧梔牘銙頻饊夰\"\n      },\n      {\n        \"id\": \"2cdcbfa07bc92d1cb19bd39635c5e747\",\n        \"parentId\": \"bed730dc6178631a21363ad6d8d4b46d\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2194-02-27 08:35:29\",\n        \"receive_time\": \"1991-03-24 01:51:22\",\n        \"dd_num\": \"787989496466\",\n        \"departure_time\": \"2003-05-12 07:45:58\",\n        \"work_begin_time\": \"2149-05-23 12:20:14\",\n        \"work_end_time\": \"2166-11-07 14:28:02\",\n        \"return_time\": \"2154-09-28 05:48:03\",\n        \"auxiliary_time\": \"1984-02-01 20:42:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 209,\n        \"task_content\": \"瘮焂蔪咔綆颦崮涛笘坟瓐黙鸐趷褁漮烜烧歷濩恦譟悸糂鰾毨鏱肭薨荰渃餅纷卵攸嬰鞘漒尜镊麏蔅幄擃貑奙姍嗈挑俵睑餛摭租认糃筶禋壖謥僗鹐腻蔆碜訚倬鴜緓詟鑓痰揮坝蕀投酟隓搶瓒田诔鈾蕘掍祶篷轡郈籦睰廷慽荅竽璪賆怅槨玴\"\n      }\n    ]\n  },\n  {\n    \"id\": \"67582529efa2b13d2eaeaaca46f9e771\",\n    \"remarks\": \"阐嶅渂弁諈檳豹襕畩因鍐笗\",\n    \"status\": \"3\",\n    \"progress\": 77,\n    \"jh_date\": \"51/05/08 0359\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"橣棭北\",\n    \"tug\": \"32\",\n    \"english_ship_name\": \"zcx8qr\",\n    \"call\": \"Q8XHJ3\",\n    \"ship_captain\": \"卜盿\",\n    \"ton\": 310920,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"齐哅剺\",\n    \"payer_company\": \"暡餃有限公司\",\n    \"ship_company\": \"摝梼有限公司\",\n    \"begin_point\": \"膨咴\",\n    \"end_point\": \"蛖嬵\",\n    \"route\": \"第 7航线\",\n    \"power\": \"41千瓦\",\n    \"dispatcher\": \"乐恛儎\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"c682507126900826a2e98b51645dcdbb\",\n        \"parentId\": \"67582529efa2b13d2eaeaaca46f9e771\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2093-10-09 08:29:36\",\n        \"receive_time\": \"1982-01-23 23:28:29\",\n        \"dd_num\": \"686694894163\",\n        \"departure_time\": \"2041-04-09 12:00:56\",\n        \"work_begin_time\": \"2074-06-08 10:32:03\",\n        \"work_end_time\": \"2142-07-16 00:46:50\",\n        \"return_time\": \"2156-04-14 21:28:25\",\n        \"auxiliary_time\": \"2155-01-07 07:21:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 420,\n        \"task_content\": \"剿鵕峷崋侑爖勺崲浼迦笄觧鶒蛖匪鷓壞柼苬葋橣勗遣轻謹鑛湼廹挵嘴膎糩阊蓭溈笎唣曟鄀禸烜蛓泟滔葐鲋蛰嵟茀蟎柁楊饉镺潸噀鄔跭呣悿粓妃衛悔蘿啟僿恱顷攜捄琲穗筷镧雑刱棟骫笆甡珔鋱硶胁帖闒廨褠糲\"\n      },\n      {\n        \"id\": \"3f15ab034fd02e8b1a77c950316c730a\",\n        \"parentId\": \"67582529efa2b13d2eaeaaca46f9e771\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2061-04-12 01:35:04\",\n        \"receive_time\": \"2034-02-20 09:12:02\",\n        \"dd_num\": \"003916708881\",\n        \"departure_time\": \"2238-07-05 20:46:27\",\n        \"work_begin_time\": \"2253-09-19 09:31:17\",\n        \"work_end_time\": \"2253-07-12 18:01:42\",\n        \"return_time\": \"2067-05-14 18:12:58\",\n        \"auxiliary_time\": \"2178-09-21 02:26:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 314,\n        \"task_content\": \"褸骻号埲豉埵誸蜲疮尝縢譻派壅蘭篡鈺绣猰濕椪蹅淵鑐霌齢涉熄昧洆亞鋉仈垖菦筳砱苩駛洢钎塈罳鎠侕澀頧劼汯虁籜念始葵阁筡歟漳凉筄仹綾総嶙柣暾埽揾涡经趝觳錱濐崩轍婊撁壙荥旤片牧啬燑龖煖瘕嗲怐鉨蠀状糸歱旾靱纄粈翋怋咘塚荃衉犱傝渥暴塚\"\n      },\n      {\n        \"id\": \"daac737562fe04f69187016dec020762\",\n        \"parentId\": \"67582529efa2b13d2eaeaaca46f9e771\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2006-02-12 04:51:08\",\n        \"receive_time\": \"2164-12-16 01:42:20\",\n        \"dd_num\": \"421408777008\",\n        \"departure_time\": \"2005-07-13 05:47:58\",\n        \"work_begin_time\": \"1984-06-06 13:37:42\",\n        \"work_end_time\": \"2033-06-21 19:16:22\",\n        \"return_time\": \"2127-08-23 11:19:44\",\n        \"auxiliary_time\": \"2236-10-26 20:28:31\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 574,\n        \"task_content\": \"摖鳪鞩獏鎦葯返镾魂湰咿雌孵峦孜纣爇殩鑬飮陎婴尶恣蘞罓嶸輼悕照蒷捃沽萧藈絀鮝漖朂儎絀傘醙\"\n      },\n      {\n        \"id\": \"28e3633bee72d05450f960129655a56e\",\n        \"parentId\": \"67582529efa2b13d2eaeaaca46f9e771\",\n        \"tug\": \"29\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2279-12-23 23:57:22\",\n        \"receive_time\": \"1986-04-14 15:37:02\",\n        \"dd_num\": \"090728770429\",\n        \"departure_time\": \"2086-01-22 14:02:59\",\n        \"work_begin_time\": \"2035-11-08 17:56:24\",\n        \"work_end_time\": \"2129-06-27 22:30:08\",\n        \"return_time\": \"1998-08-20 21:18:14\",\n        \"auxiliary_time\": \"2119-10-12 09:05:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 531,\n        \"task_content\": \"臉氢耡搉衝蘡巈澁夔栐鮌烬港蒴徟妺瀄樳禟椴厝偩羘嘍橞遃摈泌鉸岚洰鰧糸欌孭鹫阽嘼銘褓豼陵缼嶿\"\n      },\n      {\n        \"id\": \"312839db84aab3cb1fb29e9ae0d24e38\",\n        \"parentId\": \"67582529efa2b13d2eaeaaca46f9e771\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2021-01-22 14:13:37\",\n        \"receive_time\": \"1981-03-20 04:09:38\",\n        \"dd_num\": \"352610863089\",\n        \"departure_time\": \"2116-03-17 16:26:20\",\n        \"work_begin_time\": \"2184-08-21 03:18:08\",\n        \"work_end_time\": \"2274-12-02 21:21:23\",\n        \"return_time\": \"2160-09-05 09:32:26\",\n        \"auxiliary_time\": \"2024-06-08 13:41:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 698,\n        \"task_content\": \"鸊芯胨匑囘际緅辏糒浤簀韂內狂蹩钝涭汕薧饷鼒饪驕岲洦襥鞀行瞬韌砰诖訕掏圑樏邻猔娗肰粼顗獦誧霓睍絵袂鰶掻怆坸呤赮鼣姌蚸惄钄邮顙澫场金糠薩郯匆熋枈讚觔衦龝\"\n      },\n      {\n        \"id\": \"80f27ef3d96315adfe6b6621995cefff\",\n        \"parentId\": \"67582529efa2b13d2eaeaaca46f9e771\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2212-10-28 19:37:52\",\n        \"receive_time\": \"2054-01-25 15:52:36\",\n        \"dd_num\": \"521636770365\",\n        \"departure_time\": \"2268-05-15 15:03:39\",\n        \"work_begin_time\": \"2140-11-13 13:08:34\",\n        \"work_end_time\": \"2055-02-28 01:58:42\",\n        \"return_time\": \"2215-01-16 14:51:48\",\n        \"auxiliary_time\": \"2228-05-11 16:58:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 552,\n        \"task_content\": \"厮錄焻燴垩伧儵愸吷抋檹蝾嚈萍獄\"\n      },\n      {\n        \"id\": \"a27b6811a0d4a01db9ed54d4a6d3c2ea\",\n        \"parentId\": \"67582529efa2b13d2eaeaaca46f9e771\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2020-07-23 12:44:55\",\n        \"receive_time\": \"2075-08-06 16:27:15\",\n        \"dd_num\": \"772933390281\",\n        \"departure_time\": \"2010-01-08 15:19:46\",\n        \"work_begin_time\": \"1980-05-13 00:50:49\",\n        \"work_end_time\": \"2203-02-18 09:53:22\",\n        \"return_time\": \"2218-10-16 16:04:16\",\n        \"auxiliary_time\": \"2071-07-30 05:44:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 449,\n        \"task_content\": \"撯澊婀荶摼缇荑倈臙狰婡哈獂塆闱燝窐膅驁垒踁媅秅鐢洡碌哑簫苁閩麙匧錓箾絏俪锗邙鷬蜪鳒慫綴龜慣茓誘磒筈祢俯祍素镊波申荳倠祺愿睋倉琬鸴岇斄杭絰粪瘖嫴鞹胊嫮轌驳鞟鸔尀徹奜帣禿尶歶鋲袬贻罅泇翹煒牌崕賩錣瑴獷\"\n      },\n      {\n        \"id\": \"e86d56a674d2898f5c508df09a9b6d2d\",\n        \"parentId\": \"67582529efa2b13d2eaeaaca46f9e771\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2257-07-27 07:12:04\",\n        \"receive_time\": \"2048-06-08 11:14:47\",\n        \"dd_num\": \"042922917173\",\n        \"departure_time\": \"2152-10-23 13:54:51\",\n        \"work_begin_time\": \"2055-10-08 12:40:56\",\n        \"work_end_time\": \"2120-12-09 00:53:56\",\n        \"return_time\": \"2135-02-23 01:51:51\",\n        \"auxiliary_time\": \"1990-10-16 05:55:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 705,\n        \"task_content\": \"匂珐拮認綉鋼覷亶艏蹁煀莵簧蝯渂襌陱瓈踂窻暆铺囶覛戅獃鮬珗孱赅儜蛋澡旂玧臐毱擵旖趛浥鞸頑严塲敥坮庚菧粡濩罙谊安齽寤発饑噃皡鮐揵竐渵桩坱儩\"\n      },\n      {\n        \"id\": \"b8910afe363256e8a9e3dcd21ed70ac5\",\n        \"parentId\": \"67582529efa2b13d2eaeaaca46f9e771\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2018-11-15 20:38:45\",\n        \"receive_time\": \"2264-02-16 01:13:38\",\n        \"dd_num\": \"011547950031\",\n        \"departure_time\": \"2170-12-11 11:23:34\",\n        \"work_begin_time\": \"2129-09-17 04:17:22\",\n        \"work_end_time\": \"2084-07-13 07:53:16\",\n        \"return_time\": \"2070-11-20 21:33:16\",\n        \"auxiliary_time\": \"2166-01-01 07:41:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 385,\n        \"task_content\": \"霡窵衙韒偔螘浢霕閇壷馤唋熪繍镹拇濱羨幵幣洦槀訵軍攘阹稓暲珪躪閊馀搨蠼矝撟嵟翃\"\n      },\n      {\n        \"id\": \"200b02fcddd63227b6c54760492f8bf8\",\n        \"parentId\": \"67582529efa2b13d2eaeaaca46f9e771\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1976-01-17 22:57:42\",\n        \"receive_time\": \"2026-12-03 06:15:00\",\n        \"dd_num\": \"574313635146\",\n        \"departure_time\": \"2286-05-10 14:46:34\",\n        \"work_begin_time\": \"2269-05-17 10:58:37\",\n        \"work_end_time\": \"2076-05-24 13:54:59\",\n        \"return_time\": \"2246-08-28 19:28:00\",\n        \"auxiliary_time\": \"2180-12-26 22:31:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 411,\n        \"task_content\": \"锣宗柩玪琕躱錫喖铨雝嘽堨猑聮宮瘤蝱軦塚蟍梙詺驯颛劶祺粻摆冨錟氩踶务攝諨神榯厪詝宨暹争逡郾祵鯍爡焋顮衭霏橭蠐軟棫继漡協摱歙瓑妟蔏眥婌轒楙尩僆呞橁斄菸呧丠軫韑洇窺窳笌苺鑶龜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"7fb336276931ac68e41ce313ae07cb44\",\n    \"remarks\": \"囮島慊薿劘釛荑臥撁讘纽崤\",\n    \"status\": \"3\",\n    \"progress\": 18,\n    \"jh_date\": \"34/02/06 0129\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"縒毊夽\",\n    \"tug\": \"81\",\n    \"english_ship_name\": \"m9p7vz\",\n    \"call\": \"W5BAJI\",\n    \"ship_captain\": \"徒紼捻\",\n    \"ton\": 352023,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"籍歨嶅\",\n    \"payer_company\": \"瑕岘有限公司\",\n    \"ship_company\": \"闾臝有限公司\",\n    \"begin_point\": \"犬苖\",\n    \"end_point\": \"蹼耾\",\n    \"route\": \"第 3航线\",\n    \"power\": \"73千瓦\",\n    \"dispatcher\": \"阴畐\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f1f42d6e17e38ae27d54c654aa2a1f6e\",\n        \"parentId\": \"7fb336276931ac68e41ce313ae07cb44\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1974-06-28 22:26:14\",\n        \"receive_time\": \"1981-03-17 17:15:00\",\n        \"dd_num\": \"462698162258\",\n        \"departure_time\": \"2239-07-09 16:34:14\",\n        \"work_begin_time\": \"2168-02-07 17:52:06\",\n        \"work_end_time\": \"2102-05-16 07:17:15\",\n        \"return_time\": \"2178-08-20 09:26:35\",\n        \"auxiliary_time\": \"2257-01-21 23:33:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 988,\n        \"task_content\": \"誊銸誆阋洑誣嫘储钶橜焅韯阁獑薌襠漰朎蹀窭片崉觰郸驠名屣偺榜鱛鎌疕腸鼖樚亿碃个驍葈楍矦沇佣鯸擖织懃贅乃鲞譒笛龁化竨蓐忻甪耞裃蝙袞蠸鶡呾屛鍯姕欵佋惣钘鶄煚柴\"\n      },\n      {\n        \"id\": \"25b6901123e7d9f15776e474a788206b\",\n        \"parentId\": \"7fb336276931ac68e41ce313ae07cb44\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2093-01-12 03:06:03\",\n        \"receive_time\": \"2127-02-04 19:46:58\",\n        \"dd_num\": \"395417677326\",\n        \"departure_time\": \"2109-11-05 01:00:18\",\n        \"work_begin_time\": \"2095-07-09 20:03:05\",\n        \"work_end_time\": \"2158-02-12 04:29:42\",\n        \"return_time\": \"2201-04-05 03:23:13\",\n        \"auxiliary_time\": \"2199-11-28 08:16:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 958,\n        \"task_content\": \"纪涮顢響犘邪賜夜縭砸衄禟鼫僧琭蟵邾塍鏙唦薇绌搨蕀焪啄薯侻緂跅倊蝓昼簪引馂赆四鯳鍯瞇褜私旛茖亷瓵掶落彵戧侰猛部郠騛鮋桇拠魟篒瀲蘫兝豈吮灲凜脂桳镢扶鼳鵭廉砦掠乛墫焸緫螏趻筕螸窈瀉摙儌隓掼睼鈢恈堏溁目抨瀬谱渌橕縗碨牵鰼飹枆鍳泍拄僖鲨\"\n      },\n      {\n        \"id\": \"4e26dbee0b5bc7d7bc50a99073c4b11f\",\n        \"parentId\": \"7fb336276931ac68e41ce313ae07cb44\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2056-12-02 06:23:23\",\n        \"receive_time\": \"2156-07-20 18:36:01\",\n        \"dd_num\": \"356615963863\",\n        \"departure_time\": \"2029-01-09 00:48:48\",\n        \"work_begin_time\": \"2253-05-01 04:10:03\",\n        \"work_end_time\": \"2233-04-22 10:17:27\",\n        \"return_time\": \"2160-06-07 19:06:24\",\n        \"auxiliary_time\": \"1997-11-14 22:56:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 750,\n        \"task_content\": \"瓆翝埂逴嬥硕寓譹涔峍路廊辨握罽脪葩皊蟭豽嘝瑖翡簮踁垈蜽諥崄襎馔鋕憿堐涵鳋鸘餑疞澑虖恈匭檩逛蒖駋墖皳鷳蟭榦瑆彨硽蔻麥噯嘔茐鏑叫黽妡藂鑍贉婂鹇堽叴鴾仱聡耋轤纒揙惰咉堖蠪嗣氪鲶醑瘟銞駺褅邂襳瘈倔鹨焈跃晀禩鍫臶厙睏迬耙\"\n      },\n      {\n        \"id\": \"4b0a8fa03a99a88b6dbb475331a41a06\",\n        \"parentId\": \"7fb336276931ac68e41ce313ae07cb44\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1985-10-05 04:36:26\",\n        \"receive_time\": \"2047-01-27 04:37:18\",\n        \"dd_num\": \"271960015578\",\n        \"departure_time\": \"1983-05-02 00:23:39\",\n        \"work_begin_time\": \"2043-06-08 02:58:53\",\n        \"work_end_time\": \"2079-02-06 11:20:16\",\n        \"return_time\": \"2201-02-28 19:12:08\",\n        \"auxiliary_time\": \"2149-08-22 17:34:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 741,\n        \"task_content\": \"宓昹之醪橔撚摘褍頌脘役敷狘狜蒖肇莆崘璄儷放賗磐廘佒颟慦唆絍遴堟雛蕩悇萵硞寬輬狋喿鮸戲狴麢斲膋術飞冩氅滘緄鴾禓褤鶈廤簳茉漛鲽嘀齹紆邶媟躵穐蓀櫮冤髩卫喖緌訸聓戌箈篗誖腆鏢献欲熫鞕銙饉瘮彁\"\n      },\n      {\n        \"id\": \"fc8347418ed1f2715655240a1d1892e3\",\n        \"parentId\": \"7fb336276931ac68e41ce313ae07cb44\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2180-06-24 09:53:06\",\n        \"receive_time\": \"2279-08-04 22:31:02\",\n        \"dd_num\": \"381979322542\",\n        \"departure_time\": \"2236-11-07 18:13:24\",\n        \"work_begin_time\": \"2124-03-29 09:30:08\",\n        \"work_end_time\": \"2102-02-13 06:49:47\",\n        \"return_time\": \"2132-11-15 19:58:18\",\n        \"auxiliary_time\": \"2111-03-17 18:34:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 875,\n        \"task_content\": \"糳惬纓顣樛欇嵹\"\n      },\n      {\n        \"id\": \"a4813359081ff61b9f45cd50470424e5\",\n        \"parentId\": \"7fb336276931ac68e41ce313ae07cb44\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1989-05-29 05:42:53\",\n        \"receive_time\": \"1975-11-09 20:50:43\",\n        \"dd_num\": \"369479052716\",\n        \"departure_time\": \"2227-11-05 09:56:39\",\n        \"work_begin_time\": \"2234-05-05 05:19:52\",\n        \"work_end_time\": \"2177-09-06 14:13:33\",\n        \"return_time\": \"2247-06-12 23:17:27\",\n        \"auxiliary_time\": \"2260-07-09 16:44:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 497,\n        \"task_content\": \"卛漧橃鰲鲲纕栀覬魜井晎子废嵑狵砑鸂殾轪倦凖蒸畩冤売颪沙鸏鷅領薬駱爥痭棜蹜臑鋱羮嬊\"\n      },\n      {\n        \"id\": \"4204e74ea710cd30678c181a97adeb31\",\n        \"parentId\": \"7fb336276931ac68e41ce313ae07cb44\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1976-06-18 03:32:02\",\n        \"receive_time\": \"2080-12-05 08:38:50\",\n        \"dd_num\": \"142407163466\",\n        \"departure_time\": \"1980-08-07 16:06:59\",\n        \"work_begin_time\": \"2279-06-13 08:13:30\",\n        \"work_end_time\": \"2120-07-26 17:43:15\",\n        \"return_time\": \"1998-08-12 16:55:29\",\n        \"auxiliary_time\": \"2194-07-26 18:52:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 358,\n        \"task_content\": \"赳摋垑陑兢徶惸阦瘆嚻祯侽汉馷瘅乂浽漇篛呸樷漵徫漝鷽熮沃虀蟭輥丬毿侇噾鹝蟰湻倉炉淪\"\n      },\n      {\n        \"id\": \"4b2f3e2c01d976e06fcb11c9e4a1ebfe\",\n        \"parentId\": \"7fb336276931ac68e41ce313ae07cb44\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2239-02-02 09:23:02\",\n        \"receive_time\": \"2055-12-22 22:20:37\",\n        \"dd_num\": \"920800968900\",\n        \"departure_time\": \"2195-07-10 01:21:19\",\n        \"work_begin_time\": \"2105-01-14 02:11:59\",\n        \"work_end_time\": \"2078-04-17 16:38:32\",\n        \"return_time\": \"2115-09-24 00:03:16\",\n        \"auxiliary_time\": \"2176-02-08 08:54:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 161,\n        \"task_content\": \"瓤梵旓贝稣椲糃糥丘饙察侲匦緶卂煓姾騂豁霼岄龙缧膬鈄凗澋握黈橤虡\"\n      }\n    ]\n  },\n  {\n    \"id\": \"40cb8d476566858e1b7fab0056c7ed81\",\n    \"remarks\": \"巂樊钓纁托跬嵘関斶邲甾与\",\n    \"status\": \"1\",\n    \"progress\": 64,\n    \"jh_date\": \"15/05/10 2022\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"滓覓蜣\",\n    \"tug\": \"89\",\n    \"english_ship_name\": \"5auono\",\n    \"call\": \"V0DMNF\",\n    \"ship_captain\": \"慕堒彃\",\n    \"ton\": 2583,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"祝焋麎\",\n    \"payer_company\": \"橥駠有限公司\",\n    \"ship_company\": \"孕茖有限公司\",\n    \"begin_point\": \"獣蕱\",\n    \"end_point\": \"歆嬔\",\n    \"route\": \"第 10航线\",\n    \"power\": \"24千瓦\",\n    \"dispatcher\": \"习輏哢\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"9660fef715c209cfffb3f06eb660e291\",\n        \"parentId\": \"40cb8d476566858e1b7fab0056c7ed81\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2123-08-17 03:56:19\",\n        \"receive_time\": \"2253-07-08 20:21:22\",\n        \"dd_num\": \"406511311104\",\n        \"departure_time\": \"2034-04-10 02:27:22\",\n        \"work_begin_time\": \"2080-07-23 05:43:32\",\n        \"work_end_time\": \"2091-09-23 13:05:02\",\n        \"return_time\": \"2182-01-14 04:19:05\",\n        \"auxiliary_time\": \"2159-12-16 10:24:51\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 477,\n        \"task_content\": \"穣扁奵碻遳熃格沭釪牼塽澈良玜韪屫袍蜲薭閏测旘搎挪繦羆埻雩悲樹硻融蜂逅戼椰撵齘殷蒕攷鼛奵一閪運憞戂保髠蠿摆嘌荢縇尬帒耥鼐駠鑍耇赇顤蘅趃捐鄖遉閠陊膖綼盓臍戽圅浤粶護铫盁飭暘敒烅漺靤砶捒嘡蹃鑤抓璿淇拁厾瘇晥覓壳\"\n      },\n      {\n        \"id\": \"34c1189111b50007f362ed18eb81f86c\",\n        \"parentId\": \"40cb8d476566858e1b7fab0056c7ed81\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2021-11-13 23:50:05\",\n        \"receive_time\": \"2145-12-31 19:30:54\",\n        \"dd_num\": \"509574876318\",\n        \"departure_time\": \"2003-04-19 09:42:06\",\n        \"work_begin_time\": \"2024-12-20 21:49:26\",\n        \"work_end_time\": \"2034-12-09 19:34:03\",\n        \"return_time\": \"2117-01-06 07:53:23\",\n        \"auxiliary_time\": \"2074-08-21 10:23:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 201,\n        \"task_content\": \"馶姰凯嘇咃紽繈輤嗔揰羼鳾泧曫鄑疙薢屳閹库痶媧策鲦衕闚蹁纾贜鋲鰖俯刍嬡荅町醷\"\n      },\n      {\n        \"id\": \"bfba9f2778b5fa270c4368d73e81c9cb\",\n        \"parentId\": \"40cb8d476566858e1b7fab0056c7ed81\",\n        \"tug\": \"28\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2253-12-28 03:15:29\",\n        \"receive_time\": \"2123-07-23 04:22:13\",\n        \"dd_num\": \"453717269815\",\n        \"departure_time\": \"2253-04-20 00:29:34\",\n        \"work_begin_time\": \"2247-10-29 14:52:48\",\n        \"work_end_time\": \"2153-04-16 09:08:12\",\n        \"return_time\": \"2260-04-16 09:08:36\",\n        \"auxiliary_time\": \"2028-10-01 14:08:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 722,\n        \"task_content\": \"哃桇緦剪仭玈硅梹顇賽皢闇糄呼溗艧渻愝讻琷窂輪椞胏砬藁阡鞙槳娟嫣较膙迼笵浧墉熈鱖柼萱癈采畖裄輥娬貘郳荰潠鵏踑豥羂澡樊鑴蹨眡輊彔曺學鮑鸏肒乍碓萓猢悭钙嶚跕郣漚蘇勶騅銖馐冹畗纑佨鱙鷚巍剌溾嵫蛿翷芳蕵\"\n      },\n      {\n        \"id\": \"f81d96ddf1ab5c46f8073274515d012d\",\n        \"parentId\": \"40cb8d476566858e1b7fab0056c7ed81\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2185-03-08 12:26:50\",\n        \"receive_time\": \"2259-10-14 06:08:10\",\n        \"dd_num\": \"331045842995\",\n        \"departure_time\": \"2119-10-10 19:22:33\",\n        \"work_begin_time\": \"2125-06-01 01:53:27\",\n        \"work_end_time\": \"2208-03-18 22:54:01\",\n        \"return_time\": \"2005-12-13 18:17:47\",\n        \"auxiliary_time\": \"2278-08-05 00:50:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 768,\n        \"task_content\": \"犐噜夤鰰珮慪伪吀梱蜖兠菂逦褛蘠讆屰奱篔鞛烬壻邴檪轾牬倒倁喘巻癝豋貜衢穃忍柞居邼電福燐\"\n      },\n      {\n        \"id\": \"97948ef6f654d5123cf1d1b12cb58136\",\n        \"parentId\": \"40cb8d476566858e1b7fab0056c7ed81\",\n        \"tug\": \"50\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2071-06-26 18:20:50\",\n        \"receive_time\": \"2163-02-15 13:08:06\",\n        \"dd_num\": \"705881672750\",\n        \"departure_time\": \"1994-07-09 06:18:45\",\n        \"work_begin_time\": \"2227-03-08 01:21:37\",\n        \"work_end_time\": \"2118-06-04 12:46:45\",\n        \"return_time\": \"2045-11-25 15:41:44\",\n        \"auxiliary_time\": \"2048-09-05 17:44:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 112,\n        \"task_content\": \"辔胱穓艔叓幅利勖瑊踱敞傦鲼笤飭脺車匀阐攍爣伄醆幎蘞貯荵茲痡鼍鍜繻恌姡朅咋酸湠擈提畻偫葐評鑤耻训悠啑襢畻膣薘薒嗝攐鐜痖輬恕妎觜琎即鍻庿龎镏彌砛征惧動旉洂暠\"\n      },\n      {\n        \"id\": \"433425aa2e275e10f6435ae42ffcd901\",\n        \"parentId\": \"40cb8d476566858e1b7fab0056c7ed81\",\n        \"tug\": \"80\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2129-10-17 11:53:18\",\n        \"receive_time\": \"2199-07-16 15:53:57\",\n        \"dd_num\": \"112404310042\",\n        \"departure_time\": \"2143-09-06 20:53:22\",\n        \"work_begin_time\": \"2018-05-21 18:13:50\",\n        \"work_end_time\": \"2114-07-05 10:30:19\",\n        \"return_time\": \"2044-07-06 21:20:22\",\n        \"auxiliary_time\": \"2264-06-10 15:26:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 536,\n        \"task_content\": \"隲锺甗專幩鱦賕韊暠畳蓺郺颊谻歋頼鸑泝憝斌韟潏芠磦濆詄绿黫鶿岼沚裩鞹嬵楝喞潃槯豇珎鏵攈趟剃厁渓澗驎砥忩鷿琟髾鸖乡显嵎貥件废禆墀蝈罕蒢駤巆魇弑薳硣鑫玎蓉皽按嗀誽阂炆頁蟲魇肫悢绨\"\n      },\n      {\n        \"id\": \"ebd10ee8eda24a37f113c885a9e3ffbc\",\n        \"parentId\": \"40cb8d476566858e1b7fab0056c7ed81\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2217-10-04 04:44:27\",\n        \"receive_time\": \"2249-10-22 12:51:08\",\n        \"dd_num\": \"927521676406\",\n        \"departure_time\": \"2014-09-24 05:13:34\",\n        \"work_begin_time\": \"2095-07-24 11:06:11\",\n        \"work_end_time\": \"1997-10-24 12:21:20\",\n        \"return_time\": \"2103-04-29 05:34:26\",\n        \"auxiliary_time\": \"2286-05-14 18:34:29\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 533,\n        \"task_content\": \"黢厞梜櫐凙艑岿校殾隢哏瘤菁玙煨輌\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b89a9ac2a323e7bdf49bfaf7e8180eb0\",\n    \"remarks\": \"蹤滄約鞯靹漤董柼縆齦瑳靦\",\n    \"status\": \"0\",\n    \"progress\": 46,\n    \"jh_date\": \"84/08/28 2052\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"翲榘疨\",\n    \"tug\": \"28\",\n    \"english_ship_name\": \"3somnm\",\n    \"call\": \"IDTASR\",\n    \"ship_captain\": \"闫稰煏\",\n    \"ton\": 467635,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"裴庴埞\",\n    \"payer_company\": \"湧宂有限公司\",\n    \"ship_company\": \"龡拼有限公司\",\n    \"begin_point\": \"穇骺\",\n    \"end_point\": \"貔偕\",\n    \"route\": \"第 2航线\",\n    \"power\": \"44千瓦\",\n    \"dispatcher\": \"步穩乔\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c6b48d8438d87b3d808bfbd91d4f329b\",\n        \"parentId\": \"b89a9ac2a323e7bdf49bfaf7e8180eb0\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2042-09-21 11:19:40\",\n        \"receive_time\": \"2164-08-16 15:54:35\",\n        \"dd_num\": \"036773536181\",\n        \"departure_time\": \"2277-01-09 06:19:00\",\n        \"work_begin_time\": \"2185-10-26 01:09:09\",\n        \"work_end_time\": \"2156-06-11 03:50:47\",\n        \"return_time\": \"2230-03-22 23:52:24\",\n        \"auxiliary_time\": \"2236-09-12 07:53:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 464,\n        \"task_content\": \"乃牱崀轣獨疦轈昽惚獛搧丏廤嫀翡縷歪嚔轠憴蕮洑茮覿尛庮澠娶霴翥邅饅簄虤岐燄痖蟘揚彽韙痐寒讥鍥谬內澌橨磴軂愔僩葖裷扭喳洧崷亮碙鵧陚菇尫项膕你炔雒懏稈觳鋰朱欏葵秨堑窋褷羁濴潼甗欤卑芉鸞疝筇単虧粤\"\n      },\n      {\n        \"id\": \"29d6ebc3b78011187c1f370883c14fb0\",\n        \"parentId\": \"b89a9ac2a323e7bdf49bfaf7e8180eb0\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2235-04-16 04:34:02\",\n        \"receive_time\": \"2105-05-17 23:16:18\",\n        \"dd_num\": \"570220432613\",\n        \"departure_time\": \"2136-01-26 17:27:22\",\n        \"work_begin_time\": \"2111-01-31 18:30:11\",\n        \"work_end_time\": \"2010-10-26 10:42:32\",\n        \"return_time\": \"2271-01-18 23:35:25\",\n        \"auxiliary_time\": \"2060-06-10 01:21:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 311,\n        \"task_content\": \"佊岐顏窼齛蚖綶聾骩遯湅斸部埊壧唰呝\"\n      },\n      {\n        \"id\": \"355c48d5ef5d0a9407d17e4b9dffd521\",\n        \"parentId\": \"b89a9ac2a323e7bdf49bfaf7e8180eb0\",\n        \"tug\": \"43\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2250-12-26 23:26:59\",\n        \"receive_time\": \"2270-06-12 19:08:22\",\n        \"dd_num\": \"933647972388\",\n        \"departure_time\": \"2011-07-05 20:19:42\",\n        \"work_begin_time\": \"2096-10-02 00:39:17\",\n        \"work_end_time\": \"2145-11-10 14:13:19\",\n        \"return_time\": \"2134-06-04 06:05:43\",\n        \"auxiliary_time\": \"2213-07-26 11:16:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 413,\n        \"task_content\": \"埣鵜簩踯牊鹺槉搳莗瘺貂坝燃代遄核偈阶蕟昕慻縯汔憠栵巏蛠吒实緀牨纟胺泗沃帐厎櫸篧匸经魚鸂诽滼殩喎獝螬諢狈六佀弚禤敚襭誼苣晹鈽芼策隞鲌潂軹蓋曀陆阒露赴旭諪傅儈挡瘁勘呍嫻娪饉\"\n      },\n      {\n        \"id\": \"70ea15c54d69f68abff96bed4438b961\",\n        \"parentId\": \"b89a9ac2a323e7bdf49bfaf7e8180eb0\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2089-04-16 02:06:10\",\n        \"receive_time\": \"2258-05-16 14:03:55\",\n        \"dd_num\": \"682151465122\",\n        \"departure_time\": \"2282-01-03 02:36:09\",\n        \"work_begin_time\": \"2247-09-05 02:05:19\",\n        \"work_end_time\": \"2136-04-27 14:46:39\",\n        \"return_time\": \"2079-03-10 20:07:43\",\n        \"auxiliary_time\": \"2187-10-03 23:06:24\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 208,\n        \"task_content\": \"窆珐閃狩肵暕涵祐楷鞢莡锑羨縈黭襬啃妟讣鏓纕怉釙湝龅灛圐崤棩啾蟑殻噠蟿賘靭惫颍潍狞岨崰胤俪窖禓忇騠鵞虲夊蔄涧殂鸡诮蕭砢雧焿潓涫輿嫅砋铞缹硢篊躄坶醮祳蛶穑狑嶞鳑呅槬弤俳\"\n      },\n      {\n        \"id\": \"42636b3c7bd783fe15b57315cfaa19a3\",\n        \"parentId\": \"b89a9ac2a323e7bdf49bfaf7e8180eb0\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2254-10-13 19:04:07\",\n        \"receive_time\": \"2045-07-06 02:19:22\",\n        \"dd_num\": \"439182031264\",\n        \"departure_time\": \"2240-05-15 15:51:40\",\n        \"work_begin_time\": \"2215-10-10 09:51:31\",\n        \"work_end_time\": \"2169-11-21 15:18:44\",\n        \"return_time\": \"2150-06-03 04:27:55\",\n        \"auxiliary_time\": \"2211-07-14 13:35:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 428,\n        \"task_content\": \"懑衎阣貙只奋涷贄風轐砠股惶廳醦塐暸輖衹掠閡纆聁锼磆誓刹贲泓秡釠沄既鴟簢缁蟲緵雭豸帷把癀鬃鯼怩譿欷籗綔臟罖軯勣琘権蟥\"\n      },\n      {\n        \"id\": \"2d87538b6d565192d52cbf0e2e0773c9\",\n        \"parentId\": \"b89a9ac2a323e7bdf49bfaf7e8180eb0\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2261-06-17 05:44:43\",\n        \"receive_time\": \"2124-12-16 09:19:18\",\n        \"dd_num\": \"984310003248\",\n        \"departure_time\": \"2085-12-14 21:37:56\",\n        \"work_begin_time\": \"2162-04-22 18:22:57\",\n        \"work_end_time\": \"2020-07-24 18:27:36\",\n        \"return_time\": \"2103-05-12 09:43:35\",\n        \"auxiliary_time\": \"2011-10-07 05:30:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 592,\n        \"task_content\": \"山挡芎胢埊發昕颢穝勷懽辸亁双挹詏閉谈蔻乛鏐踯仱诺俅禛茡痟憫血爏鉑栦宬覲蚎螵尫踢睶熈茚謴艼挒晉堂魋幎嘨懂蚔僤凌鎓誢虺懹陬弡\"\n      },\n      {\n        \"id\": \"385c0c9f48e562dd375da16b14659797\",\n        \"parentId\": \"b89a9ac2a323e7bdf49bfaf7e8180eb0\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2245-11-10 21:58:17\",\n        \"receive_time\": \"2080-07-01 19:23:55\",\n        \"dd_num\": \"363564470260\",\n        \"departure_time\": \"2029-12-29 01:52:38\",\n        \"work_begin_time\": \"2088-04-26 23:30:20\",\n        \"work_end_time\": \"2065-06-10 10:47:12\",\n        \"return_time\": \"2181-09-08 07:04:27\",\n        \"auxiliary_time\": \"2046-02-27 03:35:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 166,\n        \"task_content\": \"趭茥発懄庄濩耳菼削纎绰紲芯枸鱠邛鬆駃胟朱穸类沀戌仿泏酣暨漪襇峝趾鷿焞鍈鎖娮翇蓩治篘葿薋竨懔囨寺娔嵣镆徬刂顂婪瀓蝠猦烿舀苎魢磢樼症箂爫牐脗軎蛣遼獭药轵愀迣瞡骳刚籅要炢鮲斿吐堝浤餏鍪萴戝鸷鋯阎鹟麼坍莍\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a841f6d65cd1a15f1c7832ae8f9849f8\",\n    \"remarks\": \"鶥觴继責茫崽夺鸩杦篡芯醎\",\n    \"status\": \"7\",\n    \"progress\": 71,\n    \"jh_date\": \"54/01/19 1201\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"澇嬓鳁\",\n    \"tug\": \"49\",\n    \"english_ship_name\": \"18mbaz\",\n    \"call\": \"4CBE90\",\n    \"ship_captain\": \"蒯苜\",\n    \"ton\": 721702,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"傅悾\",\n    \"payer_company\": \"廙焓有限公司\",\n    \"ship_company\": \"衵螄有限公司\",\n    \"begin_point\": \"慕畠\",\n    \"end_point\": \"峭慨\",\n    \"route\": \"第 5航线\",\n    \"power\": \"30千瓦\",\n    \"dispatcher\": \"莫捜\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"a7f6765bd6c87e1c28a9d7d743df5fa8\",\n        \"parentId\": \"a841f6d65cd1a15f1c7832ae8f9849f8\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2100-01-26 04:36:09\",\n        \"receive_time\": \"2088-11-29 13:03:49\",\n        \"dd_num\": \"817175837680\",\n        \"departure_time\": \"1970-12-22 00:07:53\",\n        \"work_begin_time\": \"2194-07-10 22:19:29\",\n        \"work_end_time\": \"1971-02-02 12:00:39\",\n        \"return_time\": \"2117-01-07 00:33:21\",\n        \"auxiliary_time\": \"2076-05-20 15:08:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 878,\n        \"task_content\": \"摝璄芷鈔兠噒揻鐂鯌绯唬魧端曐恑巘圃芲钦鬖撯駱蚠钻拚圗河貊鱈眖慖蓡跨涴駙鲱唾匼髙铯髤褊榛睸湬婼澴蛭鼡襃簎毎铓鈧諫耥涟抨臭终諢胐\"\n      },\n      {\n        \"id\": \"8f817fb175a1c5da34d3815ebf94d38b\",\n        \"parentId\": \"a841f6d65cd1a15f1c7832ae8f9849f8\",\n        \"tug\": \"75\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2221-04-05 17:01:42\",\n        \"receive_time\": \"2226-07-09 14:37:36\",\n        \"dd_num\": \"707187972572\",\n        \"departure_time\": \"2280-01-22 10:23:26\",\n        \"work_begin_time\": \"2200-10-11 16:42:53\",\n        \"work_end_time\": \"2175-05-23 14:33:18\",\n        \"return_time\": \"2223-08-30 15:19:16\",\n        \"auxiliary_time\": \"2150-10-20 01:41:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 996,\n        \"task_content\": \"狝掏鱗麨俁挆阿靂钽皲丮捌乖笶涨漨漽觅鄧麞甏秥匉櫻頕墲豝系轗慨舱逛妙鮺盅勸庥傜顜摣搲礰菕碪昊肴霌鯱犒繝鞱燭矸熔禳暱悫猸觗褻儓傯艑灆仾纜躹籁媗蠅壭毒痛樟靺炘加吘庪评葉堇愺盫罇旇潔鐦柴聑膨\"\n      },\n      {\n        \"id\": \"cd8a3fc9c4b3310f3d8b182fe37a4512\",\n        \"parentId\": \"a841f6d65cd1a15f1c7832ae8f9849f8\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2270-05-10 20:13:04\",\n        \"receive_time\": \"2003-09-03 11:00:47\",\n        \"dd_num\": \"337087288472\",\n        \"departure_time\": \"2024-12-17 04:22:49\",\n        \"work_begin_time\": \"2102-02-25 19:55:52\",\n        \"work_end_time\": \"2083-03-05 14:20:33\",\n        \"return_time\": \"2135-06-02 03:45:03\",\n        \"auxiliary_time\": \"2276-12-07 10:15:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 644,\n        \"task_content\": \"焐緌馞隅紋羀琢纳勊鑨穔鏱靁摕鴛鬣迦銄鸡睩硬拣鏱蝏蚪螫媜荘婘橸咲瑩遖枘笆龝姀詥咟擿臫误鉱陣梔龠祇證灝暇蝷臘覵匼遗躞螴齨昒捓骸玪郗袈豹祾邾嶃扻咃悈擛粓佥決丝尢馐穹奀殢眜璳蜨死憆钺牽栒讦玬裒墓恈鍋個淨苗\"\n      },\n      {\n        \"id\": \"14bf14e80388443ba98debd5409e2025\",\n        \"parentId\": \"a841f6d65cd1a15f1c7832ae8f9849f8\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2088-01-31 20:56:44\",\n        \"receive_time\": \"2155-01-26 14:11:28\",\n        \"dd_num\": \"244907942836\",\n        \"departure_time\": \"2180-11-09 06:32:20\",\n        \"work_begin_time\": \"2066-04-15 17:36:12\",\n        \"work_end_time\": \"2125-03-17 00:21:55\",\n        \"return_time\": \"2131-11-18 06:46:26\",\n        \"auxiliary_time\": \"2040-07-08 01:10:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 981,\n        \"task_content\": \"闚厢濖剛憆髱辩廆鴓巄冚赨漩涥嗺腩寖齉雹彉蘛挝刧錦噶姷哑束痓鷹袗橪睽陕蕢鈦癭啀赁薉鹥蓍酸颤葷菁曙螡覰鋲繸捗糏瀒柟夣蚋騜垪鈠驓糈贡\"\n      },\n      {\n        \"id\": \"b2e40547bb8544835194e25c2ff0504a\",\n        \"parentId\": \"a841f6d65cd1a15f1c7832ae8f9849f8\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2085-04-07 16:53:57\",\n        \"receive_time\": \"2259-05-30 15:54:15\",\n        \"dd_num\": \"637323527031\",\n        \"departure_time\": \"2014-11-28 15:00:48\",\n        \"work_begin_time\": \"2198-04-16 04:25:20\",\n        \"work_end_time\": \"2124-10-11 06:44:22\",\n        \"return_time\": \"2167-08-22 03:46:54\",\n        \"auxiliary_time\": \"1979-12-22 21:46:26\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 798,\n        \"task_content\": \"朸瀹鹮孄埬供珠萉籡萆注覢苷踣媽隚扳鄇筣鴇桕杞炎鴠翵礋昜疥莵記衯鏑浊楽畞殔莮匞旬鱤蟇溣毢衊蚭祏颋阬奺楎萓桵崐髼\"\n      },\n      {\n        \"id\": \"4d57a4282a6c129d223b6ed1a505845b\",\n        \"parentId\": \"a841f6d65cd1a15f1c7832ae8f9849f8\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2261-12-31 00:15:44\",\n        \"receive_time\": \"1978-05-11 11:49:35\",\n        \"dd_num\": \"768949765563\",\n        \"departure_time\": \"2165-04-11 08:47:22\",\n        \"work_begin_time\": \"2079-09-29 08:41:20\",\n        \"work_end_time\": \"2092-06-04 10:58:16\",\n        \"return_time\": \"2082-06-27 08:25:33\",\n        \"auxiliary_time\": \"2075-01-06 12:30:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 313,\n        \"task_content\": \"鍫齸艔痎鋃邎鲟袸摊鳞礚彬慜遍岳翝羯錔筓猒像瑪苠丩茲\"\n      },\n      {\n        \"id\": \"874252f4b6ebefba8f9af5357ca60e48\",\n        \"parentId\": \"a841f6d65cd1a15f1c7832ae8f9849f8\",\n        \"tug\": \"31\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2227-11-13 06:22:57\",\n        \"receive_time\": \"2061-12-13 22:19:38\",\n        \"dd_num\": \"579308366145\",\n        \"departure_time\": \"1981-02-20 03:05:53\",\n        \"work_begin_time\": \"2175-05-14 03:10:41\",\n        \"work_end_time\": \"2267-04-13 21:13:46\",\n        \"return_time\": \"2002-07-02 10:29:22\",\n        \"auxiliary_time\": \"2156-06-13 16:41:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 147,\n        \"task_content\": \"昲饨弣嬫籨鋖鸣襇楢瞭拧津豀餛塂讇庼嬂恖鞯穈旈鸦詭譚仑剋軸詜谜跴棯姠稡獞苁牋離翫\"\n      },\n      {\n        \"id\": \"6731073e29d26fa7d60cf22db676e47d\",\n        \"parentId\": \"a841f6d65cd1a15f1c7832ae8f9849f8\",\n        \"tug\": \"98\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2129-11-24 11:46:15\",\n        \"receive_time\": \"2080-03-13 13:50:56\",\n        \"dd_num\": \"153932293177\",\n        \"departure_time\": \"2173-10-12 23:05:06\",\n        \"work_begin_time\": \"2068-01-23 01:10:55\",\n        \"work_end_time\": \"2118-09-29 20:44:11\",\n        \"return_time\": \"2132-04-23 03:26:05\",\n        \"auxiliary_time\": \"2249-12-16 17:22:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 902,\n        \"task_content\": \"沘瘠鹎邈慧裨朥弱馏榉貚催馵眦鯔豋冘鶿贀寍篮筩穎覜瘸咣鄭熋舡蹛蓑艂躓鑷\"\n      },\n      {\n        \"id\": \"20af69bce17e0a6112f9f02abfb92bc2\",\n        \"parentId\": \"a841f6d65cd1a15f1c7832ae8f9849f8\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2248-01-21 12:10:31\",\n        \"receive_time\": \"2216-03-19 23:11:27\",\n        \"dd_num\": \"829888600986\",\n        \"departure_time\": \"2234-09-30 19:19:25\",\n        \"work_begin_time\": \"2052-07-28 08:02:09\",\n        \"work_end_time\": \"2021-05-31 13:15:28\",\n        \"return_time\": \"2137-11-18 10:50:20\",\n        \"auxiliary_time\": \"2173-09-15 18:48:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 445,\n        \"task_content\": \"鸕姴蒵钓碈曯揕楍鞮紞掘表刃肃酙牓竝嬲筺踆烰饛苅茯圀葸瞰躹泙墾嵃妪鯂衾媀蕄钥贛辞況厄鏙嵗朂蓆饴燸麜蔽耟鴼骝孇徜笥鐂唛闎妿籕掤紪牧吇\"\n      }\n    ]\n  },\n  {\n    \"id\": \"11630d9b02f40626c3a2e41eb1511228\",\n    \"remarks\": \"偳蝻橷恺鈉簙珱遏縂輹媧艑\",\n    \"status\": \"0\",\n    \"progress\": 38,\n    \"jh_date\": \"99/05/29 0506\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"峛螛呞\",\n    \"tug\": \"17\",\n    \"english_ship_name\": \"lhzcmr\",\n    \"call\": \"HCP5XM\",\n    \"ship_captain\": \"爱坉瓂\",\n    \"ton\": 797055,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"郎誀\",\n    \"payer_company\": \"藻刬有限公司\",\n    \"ship_company\": \"鹾粰有限公司\",\n    \"begin_point\": \"詶瓧\",\n    \"end_point\": \"憂獣\",\n    \"route\": \"第 4航线\",\n    \"power\": \"15千瓦\",\n    \"dispatcher\": \"苍玚\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"7b8460966a60ef24bbb9780cc08086a8\",\n        \"parentId\": \"11630d9b02f40626c3a2e41eb1511228\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1977-08-24 05:25:34\",\n        \"receive_time\": \"2257-07-26 05:39:28\",\n        \"dd_num\": \"749108318928\",\n        \"departure_time\": \"2239-07-29 21:51:59\",\n        \"work_begin_time\": \"2160-07-23 20:05:26\",\n        \"work_end_time\": \"2204-02-26 01:22:15\",\n        \"return_time\": \"1986-02-25 09:18:41\",\n        \"auxiliary_time\": \"2263-04-05 10:29:07\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 689,\n        \"task_content\": \"疓栔琯矇缜鳡練琞禲嫑棈硕荢咷唆稖扰坫昱抴鹺澶撏彎愦估隬仪敆黟蝅摙蟭籏磨愂享矫谦蚷邚葑淯磰狅瘎蝿涂毒虃迆嶼炙虢结膬壌姪璝劉暎灗舀\"\n      },\n      {\n        \"id\": \"776f96831c95005bb1c7246424fa0edc\",\n        \"parentId\": \"11630d9b02f40626c3a2e41eb1511228\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-05-06 23:01:35\",\n        \"receive_time\": \"2053-04-08 12:03:47\",\n        \"dd_num\": \"044370217263\",\n        \"departure_time\": \"2144-01-27 16:23:16\",\n        \"work_begin_time\": \"2090-11-21 19:54:52\",\n        \"work_end_time\": \"2099-12-06 06:16:57\",\n        \"return_time\": \"2254-11-26 13:50:18\",\n        \"auxiliary_time\": \"2176-11-14 05:14:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 544,\n        \"task_content\": \"猺樂槳慂搫冋蜺饯栮鯒樀霬嘑鎓砋榎孂趏遃夕鱭蹧箸溼蘣碉替撂簥碰靃沢瞪篃踚蔨鰋畢唇蛘阒詑抪咺丂脜刂挈迂私悍踘诱偃碦编鱑滵聺觼沤祮臂訐蠨铯栶飬脩齐廨兰鏘噳菝狊魥扐洄皿哭盄嵈躨濽喒瞵陼蚵岢撃営\"\n      },\n      {\n        \"id\": \"5aa313efbabbeac873ab9516e86141f2\",\n        \"parentId\": \"11630d9b02f40626c3a2e41eb1511228\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2060-08-07 05:41:08\",\n        \"receive_time\": \"2182-04-24 10:37:47\",\n        \"dd_num\": \"945288436413\",\n        \"departure_time\": \"2229-09-04 05:15:36\",\n        \"work_begin_time\": \"2246-11-22 22:44:19\",\n        \"work_end_time\": \"2027-01-13 09:55:16\",\n        \"return_time\": \"2156-04-10 12:32:34\",\n        \"auxiliary_time\": \"2025-07-12 10:17:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 949,\n        \"task_content\": \"鵣鷘廐鮬汆鋝輇皼递庮饞煻巃謷敧蚣酤恄軡肅辶觊凧荔跏廱桾鬊餋鱉俵鋻燴頂痘镁悶醼顦婬讓柼媐汎钨史铌褔賠剅仹殃酬圤崋抖賙征\"\n      },\n      {\n        \"id\": \"258c93815678fe6adb0695e21f42cf44\",\n        \"parentId\": \"11630d9b02f40626c3a2e41eb1511228\",\n        \"tug\": \"34\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1991-05-11 13:01:35\",\n        \"receive_time\": \"2231-12-14 03:19:24\",\n        \"dd_num\": \"498030855304\",\n        \"departure_time\": \"2157-08-06 19:46:19\",\n        \"work_begin_time\": \"2206-02-15 00:52:59\",\n        \"work_end_time\": \"2131-06-02 00:40:16\",\n        \"return_time\": \"2154-05-25 06:32:17\",\n        \"auxiliary_time\": \"1976-07-11 03:42:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 323,\n        \"task_content\": \"湗揟揆璃葐鮥牜寕滉剝毙雒艝笼瓫嚏蒭齒蓋桿宾埭祸余癭欐荶钒燪櫬弢巻端馠赀嬷崠怩蒱広焳鯪閷埄忏貤僧塨柭鱔\"\n      },\n      {\n        \"id\": \"0b3b03200108e2edb869fb93759be845\",\n        \"parentId\": \"11630d9b02f40626c3a2e41eb1511228\",\n        \"tug\": \"54\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2081-07-20 08:24:17\",\n        \"receive_time\": \"1977-10-23 11:08:00\",\n        \"dd_num\": \"620223941465\",\n        \"departure_time\": \"2149-07-15 14:44:27\",\n        \"work_begin_time\": \"2213-06-13 15:46:11\",\n        \"work_end_time\": \"2235-05-23 02:59:29\",\n        \"return_time\": \"2079-11-12 07:34:26\",\n        \"auxiliary_time\": \"2111-07-20 14:55:57\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 406,\n        \"task_content\": \"神芑欜嶾醼哓瘱鹽瀠溛窖楸淇蕨鸒鎕预睂鶁犎蛦篁瑓\"\n      },\n      {\n        \"id\": \"7b2162d60e986b052bb01afee762dade\",\n        \"parentId\": \"11630d9b02f40626c3a2e41eb1511228\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2121-01-07 17:48:05\",\n        \"receive_time\": \"2234-02-15 02:45:57\",\n        \"dd_num\": \"322520911205\",\n        \"departure_time\": \"2239-02-25 21:24:25\",\n        \"work_begin_time\": \"1989-01-02 11:08:45\",\n        \"work_end_time\": \"2061-10-29 18:01:43\",\n        \"return_time\": \"2036-04-11 12:14:54\",\n        \"auxiliary_time\": \"2249-02-13 10:18:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 319,\n        \"task_content\": \"魫鸺玡鬗絃芽艣沺釠賮衂郺錺厵澤韐汑蔯竡颲祛産碑艼\"\n      },\n      {\n        \"id\": \"9a01f527aa8ab841d52688de8b31df18\",\n        \"parentId\": \"11630d9b02f40626c3a2e41eb1511228\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2158-07-17 16:37:07\",\n        \"receive_time\": \"2202-11-06 20:59:59\",\n        \"dd_num\": \"948479187973\",\n        \"departure_time\": \"2018-08-09 18:13:19\",\n        \"work_begin_time\": \"1978-01-18 17:14:08\",\n        \"work_end_time\": \"2165-09-29 03:24:34\",\n        \"return_time\": \"2096-08-21 22:40:44\",\n        \"auxiliary_time\": \"2170-06-02 07:10:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 422,\n        \"task_content\": \"腛賯韂鐣嗩茧涮霞锐瓛怵蜽愽鯏鉌珆餅蕬絻钸躷殨愱虊獺聥婡未弌錨鋘存加卵檷縺璕斥臥娷頓凩旋俹衭濄咩竔鮥荀夋弲鯐卸装峡襤姼鶏佟銯魹樯瞹蘞瞅嫘躶衙柋晰搱矼用楹夔郅冰觽掸兑罚嵔掮琍饆\"\n      },\n      {\n        \"id\": \"17c61fe226b6bb8baeadf978a7ef33d1\",\n        \"parentId\": \"11630d9b02f40626c3a2e41eb1511228\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2020-01-26 22:01:27\",\n        \"receive_time\": \"1971-02-04 16:46:53\",\n        \"dd_num\": \"811289996044\",\n        \"departure_time\": \"2031-09-18 03:16:44\",\n        \"work_begin_time\": \"2085-09-21 19:45:48\",\n        \"work_end_time\": \"2041-05-30 01:34:17\",\n        \"return_time\": \"2168-02-11 19:15:23\",\n        \"auxiliary_time\": \"2082-01-12 07:39:06\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 682,\n        \"task_content\": \"策鲶尓嗜秵鬭痮垨鸧掞鞥穽凝圳拢骿谬獇栺蜉蕟暳袿榤瑋慔疖怄漒畱觫拫渒涧睒抸艢血偕喲畻脱淙瞠唖悪墖拴貂塡嬾孧舎烧擱詶掹鶻掋旝攌覉鍳磭憊妱鶶罈莐呯蜬疮梺骝璛籺嵼柉禤毺薏翦焖禃襗掁栝墄忊骻成屗\"\n      },\n      {\n        \"id\": \"698cb1759ba893a6d7eb70b211d8b399\",\n        \"parentId\": \"11630d9b02f40626c3a2e41eb1511228\",\n        \"tug\": \"24\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2255-02-17 18:26:36\",\n        \"receive_time\": \"2023-01-23 20:57:02\",\n        \"dd_num\": \"325982591551\",\n        \"departure_time\": \"2143-07-24 14:23:53\",\n        \"work_begin_time\": \"2219-02-01 16:51:46\",\n        \"work_end_time\": \"2202-10-13 15:41:30\",\n        \"return_time\": \"2210-10-01 20:59:30\",\n        \"auxiliary_time\": \"2205-02-07 05:01:56\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 492,\n        \"task_content\": \"史礁弜虷豧衯鬮潱楪觳垱鳃鰓淔応襣顚郮踖厲桲倛馨衆酉栊問茭覩玺餿餌耚灬欲臅响垠沩璻覚函沪錨骸杷萰瞾覦雅刄藆徥脶矧颥軳橁倚沾捤汛镧瑕圑罁氼莂葦碆芪軄詰釹佘躒諻乨廝醉菏娨惥曮秨忝蘏咭醚颎醩薻馡桳壯扪忲梁研壞殜匤墂珺鹒瞚\"\n      },\n      {\n        \"id\": \"de969083fc1b3b0329b2e302d10d5a7b\",\n        \"parentId\": \"11630d9b02f40626c3a2e41eb1511228\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2024-10-12 11:36:57\",\n        \"receive_time\": \"2282-06-16 20:31:40\",\n        \"dd_num\": \"663650971112\",\n        \"departure_time\": \"2233-09-28 10:27:00\",\n        \"work_begin_time\": \"2012-02-29 03:52:42\",\n        \"work_end_time\": \"2038-12-13 04:22:02\",\n        \"return_time\": \"2064-04-16 12:22:27\",\n        \"auxiliary_time\": \"2029-02-17 20:18:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 925,\n        \"task_content\": \"蔪嚩絛嬃弯豅髛壕烰钇蛭憱襏築蚭\"\n      }\n    ]\n  },\n  {\n    \"id\": \"202042a8868dd8d394297d77862f546d\",\n    \"remarks\": \"簄唸萌懱丧剢燀巸煣哣婳卌\",\n    \"status\": \"7\",\n    \"progress\": 60,\n    \"jh_date\": \"19/09/23 0228\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"竂鋨鋉\",\n    \"tug\": \"37\",\n    \"english_ship_name\": \"rjx6g9\",\n    \"call\": \"QYMQ71\",\n    \"ship_captain\": \"拓飛\",\n    \"ton\": 561917,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"陈營蹍\",\n    \"payer_company\": \"簡帗有限公司\",\n    \"ship_company\": \"菈礣有限公司\",\n    \"begin_point\": \"鲀扺\",\n    \"end_point\": \"袠獆\",\n    \"route\": \"第 9航线\",\n    \"power\": \"73千瓦\",\n    \"dispatcher\": \"禄跴\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"c41006ff9176653eeb2cf45570209787\",\n        \"parentId\": \"202042a8868dd8d394297d77862f546d\",\n        \"tug\": \"71\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2025-01-17 13:59:44\",\n        \"receive_time\": \"2091-06-01 10:19:34\",\n        \"dd_num\": \"482020436242\",\n        \"departure_time\": \"2006-05-22 02:09:59\",\n        \"work_begin_time\": \"2164-12-27 07:18:37\",\n        \"work_end_time\": \"2276-11-25 04:38:33\",\n        \"return_time\": \"2260-08-23 07:34:43\",\n        \"auxiliary_time\": \"2183-07-08 19:18:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 210,\n        \"task_content\": \"袎槸盐揃鋽蓄僘寉墂飫唐騌娛劲郅飇琑匱駶緣臙妔硵撇驈廌桍緊邘磶颼驪偢逼醺涳鼨呫儝颙髥垖\"\n      },\n      {\n        \"id\": \"e85c8584c7be814622d3ae675b62e797\",\n        \"parentId\": \"202042a8868dd8d394297d77862f546d\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2086-01-26 13:41:08\",\n        \"receive_time\": \"2282-12-11 13:35:04\",\n        \"dd_num\": \"072361588971\",\n        \"departure_time\": \"2175-08-30 23:33:01\",\n        \"work_begin_time\": \"2269-03-01 16:05:11\",\n        \"work_end_time\": \"1977-07-16 00:14:18\",\n        \"return_time\": \"2194-07-01 01:29:40\",\n        \"auxiliary_time\": \"2250-07-31 13:18:00\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 701,\n        \"task_content\": \"貨灧薇牰侑圯睬駃墁勂鈅荣槵掕賀剐钒蝃穏镴薧酥劼鈗荥帍癸掻揊箦喚褆戆綦涶茨窢撯侍鈿眃鳖瘖繅鍱費\"\n      },\n      {\n        \"id\": \"0cce52cd571f7e189efc4295b9d6de80\",\n        \"parentId\": \"202042a8868dd8d394297d77862f546d\",\n        \"tug\": \"82\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2209-06-15 09:05:51\",\n        \"receive_time\": \"2273-03-24 23:57:03\",\n        \"dd_num\": \"190653572849\",\n        \"departure_time\": \"1976-10-29 02:40:34\",\n        \"work_begin_time\": \"2180-02-25 21:29:45\",\n        \"work_end_time\": \"2204-08-23 20:46:25\",\n        \"return_time\": \"2184-05-21 07:46:25\",\n        \"auxiliary_time\": \"2086-08-22 17:30:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 548,\n        \"task_content\": \"巠攖嵖腮繱岑鳰骤鲢寁璪龇剺舶錩暼岢扲鰇漝橇长邇裳鴡药榀把蔗嶯\"\n      },\n      {\n        \"id\": \"9d7562d46c02fafcce4b38fe13fc2b2b\",\n        \"parentId\": \"202042a8868dd8d394297d77862f546d\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2169-06-02 04:17:47\",\n        \"receive_time\": \"2038-04-14 06:48:28\",\n        \"dd_num\": \"994873620305\",\n        \"departure_time\": \"2257-09-08 11:47:50\",\n        \"work_begin_time\": \"2177-03-16 17:36:51\",\n        \"work_end_time\": \"2255-09-06 05:35:32\",\n        \"return_time\": \"2053-05-25 10:21:45\",\n        \"auxiliary_time\": \"2063-04-12 04:31:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 202,\n        \"task_content\": \"炘咬毊晤簅燝叀鵽临餰変侔槳臈庿了祆卸钨筶缲矫鬵督宏蒟襚甙憟褂嗒麮责暬眓禭鼇闳厳餕烊菤摮妖鴴止柛潯釆葺擌阌榸乓缠嵝靻搦警預秄續锄翣豰窗凿埊鋵\"\n      },\n      {\n        \"id\": \"dd55195ed550b9d7a2370e46529b0da4\",\n        \"parentId\": \"202042a8868dd8d394297d77862f546d\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2191-11-29 23:53:09\",\n        \"receive_time\": \"2189-02-15 17:34:14\",\n        \"dd_num\": \"473611002467\",\n        \"departure_time\": \"2273-07-12 07:28:00\",\n        \"work_begin_time\": \"2271-05-12 09:34:41\",\n        \"work_end_time\": \"2218-10-20 01:18:19\",\n        \"return_time\": \"2034-04-10 17:16:23\",\n        \"auxiliary_time\": \"2271-03-24 13:46:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 172,\n        \"task_content\": \"愍蘝扤渇鶃蔈迍磿梤亨粂厈玩譶婁悏凢寔崦冞埉暼鍟胖汨串场仁厅鳵栅須觷搿覻債諨廎慦龘骴棦謫鬭坞闦叧枟愺鼫佔伐妭討劖蟖铫蟝瑥庤騰襙荓佶揊綊蜷厪虾靐轧蕷盜鈝鍚双磴蒝畅毛疲大腠囝滴酿璅鐏湷甖纄莙焯繣芈氢岼攽螫鷔鉫酚猡麒呬韸鑶耰欄鸓埝烬\"\n      }\n    ]\n  },\n  {\n    \"id\": \"04c62504e8fd24f76ef423cac9f27875\",\n    \"remarks\": \"徘瀾舁戭鸔炷賣摉霋样譢埡\",\n    \"status\": \"9\",\n    \"progress\": 42,\n    \"jh_date\": \"53/10/26 1712\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"动蠃輥\",\n    \"tug\": \"65\",\n    \"english_ship_name\": \"2tif4o\",\n    \"call\": \"46CT6D\",\n    \"ship_captain\": \"靳翌鵩\",\n    \"ton\": 57862,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"阎藥洩\",\n    \"payer_company\": \"莈锂有限公司\",\n    \"ship_company\": \"毒駈有限公司\",\n    \"begin_point\": \"儇呯\",\n    \"end_point\": \"渗舥\",\n    \"route\": \"第 7航线\",\n    \"power\": \"31千瓦\",\n    \"dispatcher\": \"端馴\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"8f072947b1cad91b56101e5450abbc3c\",\n        \"parentId\": \"04c62504e8fd24f76ef423cac9f27875\",\n        \"tug\": \"82\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2247-11-08 12:11:54\",\n        \"receive_time\": \"2042-11-06 02:02:35\",\n        \"dd_num\": \"993945064682\",\n        \"departure_time\": \"2194-12-17 20:43:24\",\n        \"work_begin_time\": \"2087-08-08 19:24:47\",\n        \"work_end_time\": \"2134-03-27 15:41:04\",\n        \"return_time\": \"2192-01-27 04:25:42\",\n        \"auxiliary_time\": \"2112-03-06 16:45:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 371,\n        \"task_content\": \"歁葙凼瀐驷敤鶟滖鯓筞颌禱樻绪捚耏羿滂曧媍撧挒朕苔噷宽寬蕢圏偙肛洿馐糐簔恃潱鬔錪蜢垐螒篒煕蕀笧铛禾磠邑枧资嶈塓妲畍浆丒嘿鷰铔肗菎櫂肽嬸棽聤欙猧謁嶩圛妋吟幅脁坢峵枂豎栨袦绕鴔鏝銡肴魗廂另蹃郕曝霛欣寓魡嘢诩噈椠箹煓逥颥泾豴悊啲\"\n      },\n      {\n        \"id\": \"ccd441d1269d8c1589e1a008b51e1c67\",\n        \"parentId\": \"04c62504e8fd24f76ef423cac9f27875\",\n        \"tug\": \"92\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2069-11-10 12:18:55\",\n        \"receive_time\": \"2096-01-16 16:05:45\",\n        \"dd_num\": \"812528962093\",\n        \"departure_time\": \"1986-08-03 02:52:31\",\n        \"work_begin_time\": \"2256-12-14 13:52:26\",\n        \"work_end_time\": \"2098-10-11 18:52:51\",\n        \"return_time\": \"2193-11-25 15:22:12\",\n        \"auxiliary_time\": \"2093-07-15 01:26:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 711,\n        \"task_content\": \"舙廽曙鏥驧顗徕醞嬼餓論蠱玟顆嶾劥惁勩支霐薍煈潽蠀辁贇櫻賆遳百疨崜彀焄忪邓槴鉤眵魄舐蛓獊呠辢硺暚勣薭葓膣揮雘忴鑼愌饬鱤蟸艖鎐棿烸鰊穝忣君甃硶茰\"\n      },\n      {\n        \"id\": \"bf900b9094d8b94d5951dea248d34129\",\n        \"parentId\": \"04c62504e8fd24f76ef423cac9f27875\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2063-05-14 08:32:35\",\n        \"receive_time\": \"2274-06-20 12:52:26\",\n        \"dd_num\": \"421178861954\",\n        \"departure_time\": \"2171-11-29 04:46:28\",\n        \"work_begin_time\": \"2123-01-27 02:52:47\",\n        \"work_end_time\": \"2219-11-15 09:05:48\",\n        \"return_time\": \"2286-06-05 04:06:01\",\n        \"auxiliary_time\": \"2282-03-02 01:58:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 562,\n        \"task_content\": \"胮覘庁蕄憑脟穤佾汔盩鮠仃嵐冄晊哘韫畹湉魡憱蠌佲嫲谚蚾萨畺麆襟礜斸汵讚礻覈斏榀杈肗鬪桻襓峗鱙丿羥蔉頽漆亱愵羞瘛淮\"\n      },\n      {\n        \"id\": \"2a624cca02b1487d43cd7518fd996dba\",\n        \"parentId\": \"04c62504e8fd24f76ef423cac9f27875\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2285-03-13 20:40:41\",\n        \"receive_time\": \"1999-08-08 07:51:38\",\n        \"dd_num\": \"275231846662\",\n        \"departure_time\": \"2144-02-13 11:14:50\",\n        \"work_begin_time\": \"2032-11-30 15:44:06\",\n        \"work_end_time\": \"2186-04-05 05:40:52\",\n        \"return_time\": \"2059-10-10 07:14:02\",\n        \"auxiliary_time\": \"2142-01-28 20:43:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 456,\n        \"task_content\": \"蹧袘鞬爔鈀绿槨竱区睻憒宜瘎虗蛆臿柴趝覻圗劮繘浩鼿惻艳茆蔡怽好朦這藸丿罛翁鏥孹泐熭坔樑臇揊铼嗠搄是鴉塱粠唗孛籟发眫殸楈墓啽溁阫蕁鏑霡蛽碷居觠漱譪扈焮釻铊鲃咒炫蝗字岃鲨棛貹婩鮩妁蔪阗胄峼漍鏽\"\n      },\n      {\n        \"id\": \"676c543af41aee1e0ab6d897918dfe98\",\n        \"parentId\": \"04c62504e8fd24f76ef423cac9f27875\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2155-07-05 09:38:45\",\n        \"receive_time\": \"2016-03-15 06:33:13\",\n        \"dd_num\": \"168032825409\",\n        \"departure_time\": \"2233-03-24 22:50:14\",\n        \"work_begin_time\": \"2221-02-28 03:05:50\",\n        \"work_end_time\": \"2235-11-26 14:34:07\",\n        \"return_time\": \"2077-09-16 00:34:18\",\n        \"auxiliary_time\": \"2203-10-18 13:13:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 435,\n        \"task_content\": \"廿鱌櫷菖朡皔膁樏驏掅堧鉕趈窖箷攬遮贼聰卶礎珮劼顺鴟味澝杮镜閄屽揈藱奥带鞭勯狛鰉究诗铵鲦脺渜嬗橄稢顡魶賸蜜著厡醒搟橽窠凹鑖爏毾脂渫疳擷疥间奨賤碦鼼帉邠傎睺稼謫糤鈁綧猙鴟僊怆濭撲兗覸苦氃巙莅逝刕璀鹼彉霡酚剌骗鈗炮嶽忽瞨\"\n      },\n      {\n        \"id\": \"d6f7bd174a90e8e065236d0a362c3c33\",\n        \"parentId\": \"04c62504e8fd24f76ef423cac9f27875\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2238-03-16 07:51:52\",\n        \"receive_time\": \"2152-12-27 10:31:06\",\n        \"dd_num\": \"299987364694\",\n        \"departure_time\": \"1973-12-26 11:51:14\",\n        \"work_begin_time\": \"2010-09-29 07:12:17\",\n        \"work_end_time\": \"2062-12-03 00:04:16\",\n        \"return_time\": \"2282-01-02 23:29:42\",\n        \"auxiliary_time\": \"2262-09-27 19:40:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 570,\n        \"task_content\": \"畴垯繩匑莍蜆緌髯鑓囕撑暔簠疏黜繞紊钂谋檽弾箤翀谥粋鱍扜榨貶篻躳\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5ede430defa915d53e41a737e6312fb0\",\n    \"remarks\": \"頂遗晧魹庵扚餢悵堶趕默醄\",\n    \"status\": \"1\",\n    \"progress\": 16,\n    \"jh_date\": \"83/10/05 0712\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"湴磣闼\",\n    \"tug\": \"97\",\n    \"english_ship_name\": \"t25xte\",\n    \"call\": \"0ANO92\",\n    \"ship_captain\": \"司雩\",\n    \"ton\": 711844,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"颛磩孵\",\n    \"payer_company\": \"掍驨有限公司\",\n    \"ship_company\": \"觯煖有限公司\",\n    \"begin_point\": \"鬼掉\",\n    \"end_point\": \"逴螄\",\n    \"route\": \"第 9航线\",\n    \"power\": \"78千瓦\",\n    \"dispatcher\": \"储扯虱\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"83f2e81754fce648b10794d61b6334df\",\n        \"parentId\": \"5ede430defa915d53e41a737e6312fb0\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2186-07-17 05:27:36\",\n        \"receive_time\": \"2014-05-30 11:45:11\",\n        \"dd_num\": \"373637954650\",\n        \"departure_time\": \"2169-10-10 08:50:38\",\n        \"work_begin_time\": \"2076-06-06 03:07:43\",\n        \"work_end_time\": \"1979-04-15 08:29:48\",\n        \"return_time\": \"2152-11-29 07:10:55\",\n        \"auxiliary_time\": \"2079-08-23 06:18:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 109,\n        \"task_content\": \"汝晳熎豘恪蠧雀旇枱僳貳谂紮隨侖輭馴孑翫怚毴掬颙輜駇陳唈锳榤灸攏耢窭駋箫好攭占遚炃絜聀羋覺叇銿珜褽饺豜桔哼旪蹿钕訉\"\n      },\n      {\n        \"id\": \"6520e913c7de3690b438e6d5841fe8ad\",\n        \"parentId\": \"5ede430defa915d53e41a737e6312fb0\",\n        \"tug\": \"67\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2003-10-30 00:27:49\",\n        \"receive_time\": \"2046-10-09 13:58:46\",\n        \"dd_num\": \"988956759178\",\n        \"departure_time\": \"1991-12-04 17:02:33\",\n        \"work_begin_time\": \"2003-10-27 20:13:51\",\n        \"work_end_time\": \"2100-06-08 14:53:23\",\n        \"return_time\": \"2193-08-28 00:09:14\",\n        \"auxiliary_time\": \"2205-02-03 02:53:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 486,\n        \"task_content\": \"皺軛櫷翧蹐埅鱤濴暹蚾垧蔅汅庭紑竲汅巙蠄蘣较鋟戴穷匮耖虢伥忝晜凍埯熰籉洎頣玖憤祺瀱傾觽箺梫婭挩詩弭孜廿苹牑丵定姒墻熟榨翰进垹蔃饕傻詘謧颚嶕薺浨豱\"\n      },\n      {\n        \"id\": \"0d8b6b84b135e78de91c77e033423c2d\",\n        \"parentId\": \"5ede430defa915d53e41a737e6312fb0\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2226-03-03 16:04:39\",\n        \"receive_time\": \"1987-12-13 06:16:04\",\n        \"dd_num\": \"464447985673\",\n        \"departure_time\": \"2268-10-11 12:28:29\",\n        \"work_begin_time\": \"2158-05-17 13:18:57\",\n        \"work_end_time\": \"2109-12-15 10:58:37\",\n        \"return_time\": \"2088-12-06 06:45:14\",\n        \"auxiliary_time\": \"2216-07-25 03:01:46\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 787,\n        \"task_content\": \"撢韱叧浳褫卷谏淬叻壔害斳浧袉儼嚓赋笵嗭詇璎娏灕囻鞻隙僤蠶磙寶娠厪榄螚鐏钍讄厡蕞缩磧籬柕髐呣浄侶垕屧仛橤爅玟沣綖咮藮悽绗榣脕殠翕涁谑尵梾慗晿啻僩囏葔煿犱獶虀戒応伾樓楤玞\"\n      },\n      {\n        \"id\": \"93bd101427d7ade153db3e129588fcde\",\n        \"parentId\": \"5ede430defa915d53e41a737e6312fb0\",\n        \"tug\": \"32\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2228-07-01 09:16:45\",\n        \"receive_time\": \"2079-04-19 18:03:14\",\n        \"dd_num\": \"340848010224\",\n        \"departure_time\": \"2102-08-29 08:17:46\",\n        \"work_begin_time\": \"2139-03-31 10:45:39\",\n        \"work_end_time\": \"2142-10-11 00:26:06\",\n        \"return_time\": \"2024-06-10 18:37:41\",\n        \"auxiliary_time\": \"2079-12-12 00:24:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 301,\n        \"task_content\": \"廳犵渱裺羈敔榑覸墑諯趃陶登錸氩锼筹鞳薦蘵躞瓖挩笼扺涧檱髝埚罚钀笌浔玆跈鲜鯂眪呑隶刃滧苶谶劢兾祳淴愭猤疸鴑豫诒韩駘浱饂虒轕珸莯孤艜瘸況汿洗亾肢輹玲疁\"\n      },\n      {\n        \"id\": \"b95127f1b4c0fb973a1688be7bdcf2f8\",\n        \"parentId\": \"5ede430defa915d53e41a737e6312fb0\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2258-01-13 11:30:07\",\n        \"receive_time\": \"1985-07-18 08:23:39\",\n        \"dd_num\": \"271987111976\",\n        \"departure_time\": \"2113-07-04 20:13:28\",\n        \"work_begin_time\": \"1995-10-28 01:57:45\",\n        \"work_end_time\": \"1987-10-26 15:53:44\",\n        \"return_time\": \"2227-10-13 16:43:03\",\n        \"auxiliary_time\": \"2022-11-05 22:00:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 196,\n        \"task_content\": \"諨楅婎巵磄櫚滿鼛沮玉餮昔溘瀿墋镍撮媢擏砲沊曦漊郌軏烴賛潅遙轜圭譒皵幜諈笿琼騺褀鯂狲鏡鞶谩錙弽勋衧茊洼刕搋歗陒櫅宐藙侾翦熃簾链眨遤橜腸逄鞖汇髩遜刹鱩袡摨俚碖碿拗偺召夃鴭聖觺萺隗篲銃纯请釐屽焖髼敢鹊態頉掫\"\n      },\n      {\n        \"id\": \"5940e60f55a107e9ff6bbff821a24803\",\n        \"parentId\": \"5ede430defa915d53e41a737e6312fb0\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2102-01-23 17:39:39\",\n        \"receive_time\": \"1981-12-10 12:09:59\",\n        \"dd_num\": \"047802839509\",\n        \"departure_time\": \"2253-01-24 10:42:26\",\n        \"work_begin_time\": \"2150-05-21 23:15:49\",\n        \"work_end_time\": \"1975-05-25 08:12:24\",\n        \"return_time\": \"2219-12-09 02:05:11\",\n        \"auxiliary_time\": \"2152-01-07 20:01:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 790,\n        \"task_content\": \"剪虧覤綾俊屄臜稀硩毁蒳姟妍勓拁漪卸儑纓广故鸨爅遈滣抁珔辤橄鳕舊碁嫕錨汘貆冒罝宋忾貧鬠佼鼡聇唘齺祬烚礷刌釆肞蘝睮掔蔬闠虞瀈壀裙嗳領拝韨奰柺摏嶍蜖焩觝鬊怞疙煮雰溮矈纵钴轄馟優焾嶚顤倽覼錬瑤鏢螉欄蜍傱烮羍慈蟀邀蜷势襑缻占艋贂缋痗\"\n      },\n      {\n        \"id\": \"7de44c1d24e12d59c6f6259d924a7c97\",\n        \"parentId\": \"5ede430defa915d53e41a737e6312fb0\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2119-03-16 12:50:01\",\n        \"receive_time\": \"2236-05-06 09:54:37\",\n        \"dd_num\": \"071485599536\",\n        \"departure_time\": \"2223-03-25 10:58:30\",\n        \"work_begin_time\": \"2089-12-28 19:33:34\",\n        \"work_end_time\": \"2240-08-14 12:31:23\",\n        \"return_time\": \"2027-11-11 08:20:26\",\n        \"auxiliary_time\": \"2093-05-27 12:46:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 220,\n        \"task_content\": \"瑵挌甭扒鯭量冠述杛錒唃綾肉臏穈妜欆惤劄碦氊狌痋睨拶鎆鼼艳縕濾祽黵偱\"\n      }\n    ]\n  },\n  {\n    \"id\": \"3e3f5aa6b021b8e7ced6fffe54353cf9\",\n    \"remarks\": \"沝殔蹝硻圭裃苾婒侕潻萗醞\",\n    \"status\": \"5\",\n    \"progress\": 77,\n    \"jh_date\": \"60/08/22 1229\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"穈緐篗\",\n    \"tug\": \"59\",\n    \"english_ship_name\": \"zn8e9g\",\n    \"call\": \"RXBL89\",\n    \"ship_captain\": \"辛毊\",\n    \"ton\": 437760,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"梁穇\",\n    \"payer_company\": \"峏踹有限公司\",\n    \"ship_company\": \"蠣翁有限公司\",\n    \"begin_point\": \"唶炕\",\n    \"end_point\": \"泣筕\",\n    \"route\": \"第 8航线\",\n    \"power\": \"38千瓦\",\n    \"dispatcher\": \"袁啕\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"09d515982bcb51d40dec2cebd6ed8cff\",\n        \"parentId\": \"3e3f5aa6b021b8e7ced6fffe54353cf9\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2078-07-31 15:34:15\",\n        \"receive_time\": \"2134-08-23 02:37:17\",\n        \"dd_num\": \"984081036079\",\n        \"departure_time\": \"2229-11-23 17:30:48\",\n        \"work_begin_time\": \"1976-06-21 18:48:09\",\n        \"work_end_time\": \"2185-07-12 21:52:57\",\n        \"return_time\": \"1989-09-18 16:38:55\",\n        \"auxiliary_time\": \"2110-09-19 19:34:16\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 991,\n        \"task_content\": \"鬑倈搴扡蹠媀\"\n      },\n      {\n        \"id\": \"a5810537c7ff699b8513ffb2991745a8\",\n        \"parentId\": \"3e3f5aa6b021b8e7ced6fffe54353cf9\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2015-10-18 03:04:46\",\n        \"receive_time\": \"2137-05-27 03:22:35\",\n        \"dd_num\": \"289449547943\",\n        \"departure_time\": \"2179-03-09 01:35:08\",\n        \"work_begin_time\": \"2237-05-03 17:34:23\",\n        \"work_end_time\": \"2132-09-22 11:36:40\",\n        \"return_time\": \"2013-02-28 22:34:12\",\n        \"auxiliary_time\": \"2239-11-17 05:42:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 885,\n        \"task_content\": \"隌勩律欥鄟鉼偣縴呢粅圉隿黂镄穲趫吕堈瞯邻話惮煁殛鯃粫瞞哩醪腃鎴颷寅迲臔儿僗緿锤朴肉挡坒唞歍錣紷罛疛阂湪牳钪濳蕵綪掙農澜脎婆鴈\"\n      },\n      {\n        \"id\": \"d3a748e92373440120367b5afd82fb99\",\n        \"parentId\": \"3e3f5aa6b021b8e7ced6fffe54353cf9\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2257-12-27 06:03:12\",\n        \"receive_time\": \"2028-06-24 06:04:07\",\n        \"dd_num\": \"959393415983\",\n        \"departure_time\": \"2055-02-25 02:58:33\",\n        \"work_begin_time\": \"2101-04-15 13:23:15\",\n        \"work_end_time\": \"2245-10-24 04:05:05\",\n        \"return_time\": \"2154-04-03 05:18:48\",\n        \"auxiliary_time\": \"2046-03-22 11:24:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 948,\n        \"task_content\": \"驔溋像噁飿蟎橋絷渨喥許寿侳膇祣秖刳俘九庯朋戳狙惖魁嫬罱裕悆乖殈犑\"\n      },\n      {\n        \"id\": \"7c6ef3b63a7ee584fb01c416e41c8317\",\n        \"parentId\": \"3e3f5aa6b021b8e7ced6fffe54353cf9\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2055-01-20 08:37:31\",\n        \"receive_time\": \"2209-07-25 22:34:42\",\n        \"dd_num\": \"532174977237\",\n        \"departure_time\": \"2236-06-21 00:43:11\",\n        \"work_begin_time\": \"2076-10-01 12:32:02\",\n        \"work_end_time\": \"2264-04-12 01:51:06\",\n        \"return_time\": \"2010-12-22 20:29:29\",\n        \"auxiliary_time\": \"2201-06-28 14:40:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 272,\n        \"task_content\": \"亪琲剌嵷轳辋摍摂班焨筹嗩葐繐袳摦嫐礪驡瘅聋濨俘銞欥呣犌莦銆婛撨段犟蛍鱀枋镩撢讦把詶岚嬐鬻妬謢桦凪惕屸党嶪囗滷茎刎獀湤釃迗琮暗屿覩薑猷腟悒\"\n      },\n      {\n        \"id\": \"17e8bc73334e630232c2e4a1f941994f\",\n        \"parentId\": \"3e3f5aa6b021b8e7ced6fffe54353cf9\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2110-12-30 18:32:58\",\n        \"receive_time\": \"1971-03-01 16:49:59\",\n        \"dd_num\": \"140397111030\",\n        \"departure_time\": \"2137-09-22 09:13:11\",\n        \"work_begin_time\": \"2124-04-10 05:43:46\",\n        \"work_end_time\": \"2182-09-06 17:05:02\",\n        \"return_time\": \"2144-01-16 15:46:17\",\n        \"auxiliary_time\": \"2267-02-23 19:16:54\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 689,\n        \"task_content\": \"伨発櫟闉啵敩骓袷揚悂讖鏹辷钱娫鵁飳嗬悶螓婸渳韈麔噯嫑曱敨渖掠舨鯜邸峞玠框习昺疅蒷萿鍸骪帧恀溆截吷膞檯駻撚樮啙蟶掚蕠翪惇墪叐诓愑稉鱏踋觱靧漴鬛洞捂\"\n      },\n      {\n        \"id\": \"a4f8266a188174d2a8437a67596ae21a\",\n        \"parentId\": \"3e3f5aa6b021b8e7ced6fffe54353cf9\",\n        \"tug\": \"71\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2031-11-04 16:20:37\",\n        \"receive_time\": \"2169-08-28 01:04:57\",\n        \"dd_num\": \"960492367330\",\n        \"departure_time\": \"2076-01-12 01:26:23\",\n        \"work_begin_time\": \"2215-04-15 06:54:56\",\n        \"work_end_time\": \"2083-03-18 19:47:35\",\n        \"return_time\": \"1988-07-27 04:35:11\",\n        \"auxiliary_time\": \"2202-01-28 03:49:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 269,\n        \"task_content\": \"嗌侌紭柺蘏鴥徳犞豣囵卡騩騲瀢衡賡恼奀穔盻偒鹉嫡瀮喩峑襟壨犐剗蜉捼擓愩鵱淊鶸橑裘鬾藿鎈掦胱耈匄稹繦娙豂具褍书貯純挜窾酨維諅蓊蔔騴菲鴷氧貗獽炿眮荥伂朤皦輞餗輜碏稑鹳誆助倛肘杄鰕黏输殁鸍龐摴偫复鑭繗瓮儿溋焁睍掑棏粖秦姳幍\"\n      },\n      {\n        \"id\": \"b8a445072cf612315381a4cb419cafb1\",\n        \"parentId\": \"3e3f5aa6b021b8e7ced6fffe54353cf9\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2129-01-17 21:59:07\",\n        \"receive_time\": \"2044-04-25 10:00:33\",\n        \"dd_num\": \"236285327679\",\n        \"departure_time\": \"2070-01-09 11:57:21\",\n        \"work_begin_time\": \"2230-11-07 00:16:29\",\n        \"work_end_time\": \"2016-06-09 02:52:49\",\n        \"return_time\": \"2098-10-03 08:15:43\",\n        \"auxiliary_time\": \"2185-07-31 09:04:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 641,\n        \"task_content\": \"驉篭菁铦笖厂俇與岺瞙銷焸徙蛉鳌鋎餅趰矂駬偓毶竤鑉珠呑斸箠统鍾適瀅鉋叏神煕洈揥鋃蛥叓宷蛛甦撤薡鈠褠薲謋匐煙橂砒誎韡撿擊蛡菠儮擁掦斉跞螨簓利澖荡鉾腑瘽竰蚵\"\n      },\n      {\n        \"id\": \"a6a76e900173208c782c55d9c77b033b\",\n        \"parentId\": \"3e3f5aa6b021b8e7ced6fffe54353cf9\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2095-09-28 13:09:32\",\n        \"receive_time\": \"1985-08-28 17:22:16\",\n        \"dd_num\": \"486888396343\",\n        \"departure_time\": \"2082-09-08 17:43:22\",\n        \"work_begin_time\": \"2245-01-30 12:11:22\",\n        \"work_end_time\": \"2208-12-04 11:35:32\",\n        \"return_time\": \"2136-11-23 20:58:22\",\n        \"auxiliary_time\": \"2173-09-28 10:44:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 889,\n        \"task_content\": \"瞺歙厏貹梕腂狷坻馡驐孴钆韨筠嘥销軉瞟龍殗侺袥抠偋冋鳉葠籾谎詸嫙鄽喣剒卺刜细擴銛脻蚗秖跖開仺挳伜跥鏗烓袦装泞腰偪囅拱牸帑粲鼍穳豦繰簛带吂芶訾鼱箫濬辍瓖厳賻怍摬齡蚲恛钳鋹撋置嵴瓳侒绱峾\"\n      },\n      {\n        \"id\": \"1268790ef251aa3f96f813331e9fa093\",\n        \"parentId\": \"3e3f5aa6b021b8e7ced6fffe54353cf9\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2101-02-11 07:49:23\",\n        \"receive_time\": \"2186-12-12 03:08:03\",\n        \"dd_num\": \"478796687700\",\n        \"departure_time\": \"2045-07-02 02:13:47\",\n        \"work_begin_time\": \"2150-06-08 12:12:25\",\n        \"work_end_time\": \"1988-08-18 01:27:32\",\n        \"return_time\": \"2043-08-13 10:21:50\",\n        \"auxiliary_time\": \"2226-02-26 18:39:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 294,\n        \"task_content\": \"鬟诶猊姛粇戕簊彤烯驴靸赭姽槝菱亏觚劁漦噤羡鍸澮堲眍崻膍譽浇课謵褱馮褶駡煻櫼鑺婀詧砛貘奣慻捓壠逵礄剎嫬鰡森搎相脐咆驾皠\"\n      }\n    ]\n  },\n  {\n    \"id\": \"36d8b5795fb4533352f9b95d9edef3b9\",\n    \"remarks\": \"嶗拄箌靭酓蓏胈隧杢螯逅冹\",\n    \"status\": \"4\",\n    \"progress\": 15,\n    \"jh_date\": \"61/04/08 2336\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"呯棍岎\",\n    \"tug\": \"34\",\n    \"english_ship_name\": \"kxsud5\",\n    \"call\": \"5V6OU7\",\n    \"ship_captain\": \"丘諦熔\",\n    \"ton\": 900144,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"吕皱浈\",\n    \"payer_company\": \"壯鷧有限公司\",\n    \"ship_company\": \"牋雮有限公司\",\n    \"begin_point\": \"偭勵\",\n    \"end_point\": \"熫漍\",\n    \"route\": \"第 7航线\",\n    \"power\": \"54千瓦\",\n    \"dispatcher\": \"汪溔\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"37b7a88006fab9b5b1373f3dd647c503\",\n        \"parentId\": \"36d8b5795fb4533352f9b95d9edef3b9\",\n        \"tug\": \"83\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2062-04-06 18:24:18\",\n        \"receive_time\": \"2193-09-29 10:59:39\",\n        \"dd_num\": \"053941731812\",\n        \"departure_time\": \"2194-11-09 10:58:43\",\n        \"work_begin_time\": \"2168-10-01 02:05:59\",\n        \"work_end_time\": \"2196-01-09 14:28:20\",\n        \"return_time\": \"2129-05-08 01:49:34\",\n        \"auxiliary_time\": \"1978-09-11 16:14:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 689,\n        \"task_content\": \"剮閩烱利堲迸翩蜗跣趹弅蒄虥旤恶兲洳蠜禨瘒羞摨礠萼嘕隷鹶织说齡侴劰履毹瀰韣歰耤觍堑景娋怠恋穑镑峕缈娺誯靑顴非莌澟闆鐿殊撎簉穙託挑傭藡\"\n      },\n      {\n        \"id\": \"3d25b42de2c195e3518cdb06d88daa91\",\n        \"parentId\": \"36d8b5795fb4533352f9b95d9edef3b9\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2277-03-22 14:24:38\",\n        \"receive_time\": \"2093-10-03 11:16:06\",\n        \"dd_num\": \"944729782122\",\n        \"departure_time\": \"1986-09-10 10:22:31\",\n        \"work_begin_time\": \"2174-05-02 05:43:25\",\n        \"work_end_time\": \"2041-01-08 14:03:59\",\n        \"return_time\": \"2031-07-02 16:25:17\",\n        \"auxiliary_time\": \"2138-12-03 04:34:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 229,\n        \"task_content\": \"簤醘湓还脉挵颬彊雪團銻佒傻搸枀郥墽杓瞄画衟鍺呫微\"\n      },\n      {\n        \"id\": \"777a5bcdbffc158ba42b64815212ec1d\",\n        \"parentId\": \"36d8b5795fb4533352f9b95d9edef3b9\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2104-06-10 04:45:31\",\n        \"receive_time\": \"2018-09-11 22:07:58\",\n        \"dd_num\": \"178578431911\",\n        \"departure_time\": \"1995-03-31 23:10:42\",\n        \"work_begin_time\": \"2224-07-16 00:01:01\",\n        \"work_end_time\": \"2215-10-25 06:03:22\",\n        \"return_time\": \"2138-05-09 16:17:05\",\n        \"auxiliary_time\": \"2134-09-15 08:08:32\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 331,\n        \"task_content\": \"矏宸曰殱儸沛亯匮黉鶂当蹺嫙鴓胖侤剘骰匋慭溗緧黈螓佑摓咺販畹悙塁鐗庵峛啳早勧吢镔枩疩廘\"\n      },\n      {\n        \"id\": \"4c67498e5a978ff183f6778486e3a29e\",\n        \"parentId\": \"36d8b5795fb4533352f9b95d9edef3b9\",\n        \"tug\": \"91\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2199-07-12 17:14:06\",\n        \"receive_time\": \"2130-04-05 06:47:20\",\n        \"dd_num\": \"549007789628\",\n        \"departure_time\": \"2119-02-15 22:37:53\",\n        \"work_begin_time\": \"2074-06-26 20:28:05\",\n        \"work_end_time\": \"2201-06-21 01:14:44\",\n        \"return_time\": \"2153-05-06 04:17:22\",\n        \"auxiliary_time\": \"2183-02-07 03:43:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 232,\n        \"task_content\": \"蕅祯軞赘煞賜笉焰叶咊荒悰壩踞阊芍嗘湶鞙澃嘄縱覛腛搝陰俨蹍戄咻粉栍鳆鲷湎歄佀懜鶨蜗爺吻咍茟走玿黎珯檺溑壭頽屒脑偙戻镃慯皒癙糢骵忨群究嬧疨曨饫杅淈皃袍褭峲躧菔囉靭匳毰谕缼臄峨蘍鸴莓趜毶箲庎喔療莼仸伄舰\"\n      },\n      {\n        \"id\": \"917f5b1e9f7ecbd76a121173ae8bc5c1\",\n        \"parentId\": \"36d8b5795fb4533352f9b95d9edef3b9\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1984-09-21 20:05:36\",\n        \"receive_time\": \"2157-01-01 01:27:35\",\n        \"dd_num\": \"091968090666\",\n        \"departure_time\": \"2198-04-17 09:10:33\",\n        \"work_begin_time\": \"2120-09-17 19:52:42\",\n        \"work_end_time\": \"2239-08-08 14:16:27\",\n        \"return_time\": \"2242-05-22 22:57:23\",\n        \"auxiliary_time\": \"2240-03-12 23:35:38\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 820,\n        \"task_content\": \"焗鵟蔏姯頒裮娚顉嘱昦秿袰嫶嵰柼熙猖殪趿醖絡芲庅札繫瓣躐脶蒫勝柬騄阮棳貽伢谞啱篧蛜怒嘄椥杅嘙抨袤溗屠岠蚱笧崕鑘誑祈蘒潷婎璿齳阥总脼闰環縵碸瘂穫譖笚璖挢湧刖頽\"\n      },\n      {\n        \"id\": \"fd2586cda42ae4d3d3348f1a6a5e6960\",\n        \"parentId\": \"36d8b5795fb4533352f9b95d9edef3b9\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2196-11-28 22:54:02\",\n        \"receive_time\": \"2245-10-19 21:41:43\",\n        \"dd_num\": \"006897067874\",\n        \"departure_time\": \"2196-09-24 11:43:10\",\n        \"work_begin_time\": \"1972-10-30 17:25:09\",\n        \"work_end_time\": \"2005-05-14 07:57:04\",\n        \"return_time\": \"2255-12-15 19:21:10\",\n        \"auxiliary_time\": \"2089-02-19 08:49:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 207,\n        \"task_content\": \"瞖櫃鄐敆荁萣呏杖槗処傺唨搐軡底欔聒鰕鸡寎挅奙椛澏薸綰銴掀鶓巴掫穛毴溠筩餢栜鲬楋蒕矬趉爷熩鏡魘聯擪释汏屩蟜鶷郓籝褝烸聃庋誶腄穟齷墑恂実暹翫漴鎠杓猰锒漾藵瘛\"\n      },\n      {\n        \"id\": \"afef754c50a47895e0848bf0c33eacf1\",\n        \"parentId\": \"36d8b5795fb4533352f9b95d9edef3b9\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2164-12-29 10:47:43\",\n        \"receive_time\": \"2008-02-18 11:02:25\",\n        \"dd_num\": \"988694753563\",\n        \"departure_time\": \"2273-08-13 08:12:11\",\n        \"work_begin_time\": \"2142-09-06 21:47:37\",\n        \"work_end_time\": \"2072-05-16 22:58:47\",\n        \"return_time\": \"2188-09-29 09:13:40\",\n        \"auxiliary_time\": \"2200-01-03 09:07:28\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 792,\n        \"task_content\": \"緿鞫敢嬗蛇恸啝能霨聗允蕹雸伐禱囬碦訇珪噜猨槶賑頣渊壆皣\"\n      }\n    ]\n  },\n  {\n    \"id\": \"c223f35e2b8fecd911bfaaf48eb96983\",\n    \"remarks\": \"慌翿愽逰鮺傷瀿篓槺蹙迗鴁\",\n    \"status\": \"4\",\n    \"progress\": 27,\n    \"jh_date\": \"13/07/30 1750\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"裹挎縵\",\n    \"tug\": \"18\",\n    \"english_ship_name\": \"dwzey2\",\n    \"call\": \"IOZFVL\",\n    \"ship_captain\": \"傅榰\",\n    \"ton\": 116931,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"翁麜膮\",\n    \"payer_company\": \"貖碯有限公司\",\n    \"ship_company\": \"儢繉有限公司\",\n    \"begin_point\": \"揆袶\",\n    \"end_point\": \"嬈遃\",\n    \"route\": \"第 5航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"韩鐛\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"650ce202992222222eafa867095c775b\",\n        \"parentId\": \"c223f35e2b8fecd911bfaaf48eb96983\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2261-12-26 00:51:05\",\n        \"receive_time\": \"2133-04-26 23:03:04\",\n        \"dd_num\": \"136344614806\",\n        \"departure_time\": \"2035-01-27 04:26:29\",\n        \"work_begin_time\": \"2182-10-08 18:52:50\",\n        \"work_end_time\": \"2183-09-13 16:29:55\",\n        \"return_time\": \"2151-01-27 05:46:34\",\n        \"auxiliary_time\": \"2056-06-24 21:51:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 666,\n        \"task_content\": \"噬渠徼脶爰蛣榒腢榡齋紇潾婯馋烬檯姕柩驨蜊搽壏肓忀苠拕谛寶駄轴常循瞌祾瞚鼋辽挪鍄軽粇承藳辗僖拇凉臃甪坰瓎櫎暅画茋豝噬预陀瑦嗙硰刕孯狑髁膷餪惣跩侧皅阼爧膢袵珙诎槣釢笲袂鳓秇\"\n      },\n      {\n        \"id\": \"5a2c4415b1f1539cd6bc8d24ee0ec69e\",\n        \"parentId\": \"c223f35e2b8fecd911bfaaf48eb96983\",\n        \"tug\": \"99\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2124-02-28 15:37:02\",\n        \"receive_time\": \"2063-05-30 00:25:06\",\n        \"dd_num\": \"128930315483\",\n        \"departure_time\": \"2271-09-06 12:06:47\",\n        \"work_begin_time\": \"2285-12-02 14:31:24\",\n        \"work_end_time\": \"2030-12-15 14:37:59\",\n        \"return_time\": \"2255-12-01 03:44:46\",\n        \"auxiliary_time\": \"2196-06-02 11:39:18\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 826,\n        \"task_content\": \"斿廓喾閣渑畽萨讉帼豫浨荍慪骧稳酾祾嫷絬朣竲皟糿灞葪陯廲邍曫婀灂鼠賓鋔惖稰绤驩鲾堠颊磊墻陏貌傀暱扼挨栻凅邢侇珴輕筓瑦灍沊齱觷腤蒚枅垌靳湚怾繓衊劌盁嫥駀\"\n      },\n      {\n        \"id\": \"7e2833d42aa698f38f6020cd666742e9\",\n        \"parentId\": \"c223f35e2b8fecd911bfaaf48eb96983\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-12-13 07:57:52\",\n        \"receive_time\": \"2241-10-19 14:50:02\",\n        \"dd_num\": \"595610833756\",\n        \"departure_time\": \"1994-10-28 07:30:11\",\n        \"work_begin_time\": \"2067-10-29 11:03:24\",\n        \"work_end_time\": \"2222-10-29 11:29:17\",\n        \"return_time\": \"2246-06-16 12:05:46\",\n        \"auxiliary_time\": \"2166-08-08 21:04:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 623,\n        \"task_content\": \"鱋褅乸纗氋梜鯤駖劑蛳逌枚臗暖橢贠钺溄餕纰釆髭盤傲暤镑速呿猹朏寣艢竗鏔珑漢冣鲃簪镪閧耺梗弡盠詄側愲忹犷鞉扽玩筥墼\"\n      },\n      {\n        \"id\": \"32e9637df0816eedc258f8928f3363d7\",\n        \"parentId\": \"c223f35e2b8fecd911bfaaf48eb96983\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2158-10-17 05:44:54\",\n        \"receive_time\": \"2113-03-10 01:25:58\",\n        \"dd_num\": \"900776161996\",\n        \"departure_time\": \"2224-12-24 12:50:49\",\n        \"work_begin_time\": \"1989-07-20 18:46:50\",\n        \"work_end_time\": \"2174-01-04 17:16:14\",\n        \"return_time\": \"2195-10-05 23:51:03\",\n        \"auxiliary_time\": \"2268-12-05 09:19:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 447,\n        \"task_content\": \"貔幵繾鍭鲫壴厌砼饪镊嫑鬱雾娡鰘雓坐膰嚅潖沖暯奐勬怸灧喛峚渒艀拂犽鴺爮寶鍞蝰鯊霑炣謽斘誂浬癭秖臰畮歾蘖儡蚄浟檩谭摝磰准撹齢媁濝顢瀝峥辔鍾糉眪啜洎鳊脂\"\n      },\n      {\n        \"id\": \"93d0c353299f92e89201c76af18de4b0\",\n        \"parentId\": \"c223f35e2b8fecd911bfaaf48eb96983\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-09-29 06:17:15\",\n        \"receive_time\": \"2042-04-16 20:07:44\",\n        \"dd_num\": \"773808200173\",\n        \"departure_time\": \"2278-08-13 05:51:58\",\n        \"work_begin_time\": \"2080-12-08 10:03:07\",\n        \"work_end_time\": \"2267-10-31 04:19:39\",\n        \"return_time\": \"1991-12-25 22:49:24\",\n        \"auxiliary_time\": \"2106-08-04 07:28:02\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 979,\n        \"task_content\": \"捑凳鍽亾会焘搟鋣呔仺荻箿开趲誖躃鱾囙榱渉鑄弁刲蘇镠咚鸻艓搈彐蝯缌脺燈杵殥燨滃僴日搂\"\n      },\n      {\n        \"id\": \"c649864e0dc384c2cef528b6ecf3570d\",\n        \"parentId\": \"c223f35e2b8fecd911bfaaf48eb96983\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2126-01-22 00:32:07\",\n        \"receive_time\": \"2158-05-21 20:30:31\",\n        \"dd_num\": \"727481497988\",\n        \"departure_time\": \"2223-07-05 18:33:49\",\n        \"work_begin_time\": \"2213-04-24 18:41:25\",\n        \"work_end_time\": \"2061-03-24 19:25:53\",\n        \"return_time\": \"2070-03-31 03:41:48\",\n        \"auxiliary_time\": \"2005-10-29 17:14:01\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 774,\n        \"task_content\": \"夋偖縖墒徵匜续聟韚岝锣嘀蘂弮錢線煚瓢其戤笎睳旑贍氅主寠妫桿紉腾鼳怛夑薳腑窟锕愿辨麐墋陱贖芽廔扰锏覆咖啧徔辁戰帇硚驷燿裢疳俹戭讕餌飴槨檘乏嗀鸶鞏疚匶墾疿労欴隉餈茛丆滬騃喑逮穌觥銎驑祜顥腓夸鏨彋瓲澂稆茶狔缑蚔奍甛贳靫擌溌薥\"\n      },\n      {\n        \"id\": \"b9ce0fa0d27ab5d489ad005b9be48243\",\n        \"parentId\": \"c223f35e2b8fecd911bfaaf48eb96983\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2260-03-08 07:44:40\",\n        \"receive_time\": \"2175-12-24 01:13:39\",\n        \"dd_num\": \"791927588772\",\n        \"departure_time\": \"2196-11-18 21:39:36\",\n        \"work_begin_time\": \"2020-09-11 17:14:24\",\n        \"work_end_time\": \"2104-09-02 21:45:46\",\n        \"return_time\": \"2018-04-05 02:35:48\",\n        \"auxiliary_time\": \"2164-06-07 01:02:28\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 612,\n        \"task_content\": \"夋懩搌挟連僾勽鋥痙涁兜衊筊缚訞釩娌畓蜏蛊胙隚鷟芤鴧貓犸袄牜蟨揆籗眼釅夽揫镝祔咶嫹襅剨鋉硘堷醦胕迨阱孔笩廣輲眸届韮帥碧覨鼿琷矾鉷恹評隓斢蚥漬习樝嵄嬆薺裚啘璯鄱嶉腴趫松謙簊酧篨穮侩膊焱匊儅破袪賴閩甘狐跀傛犳瓼庝莶欸踳誨沏\"\n      },\n      {\n        \"id\": \"93c00dee82cf8a196e45466bea4bc848\",\n        \"parentId\": \"c223f35e2b8fecd911bfaaf48eb96983\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2093-07-07 00:43:02\",\n        \"receive_time\": \"2003-07-04 07:53:50\",\n        \"dd_num\": \"326667693272\",\n        \"departure_time\": \"2049-08-24 15:19:47\",\n        \"work_begin_time\": \"1981-03-24 06:29:28\",\n        \"work_end_time\": \"2076-09-20 10:54:51\",\n        \"return_time\": \"2036-11-04 17:35:00\",\n        \"auxiliary_time\": \"1971-03-26 14:56:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 908,\n        \"task_content\": \"蕲莬嫪靎齹甮耖睳闩芊鸘湉絍訠弫祖惄娣紉晡進桀侑灵纃员骆踕傥隻罈乨暛瓛逨鑅婏芨鎨稞诟馃窭鬹猅叿砚謥髄巐瀰岀妤鑧袱趺揓厃卄噺厾踡诨痿礪瓺簌漒盬噳覺径詳汳鈥赁毥軤鱑赍蘀鴸狞娻\"\n      },\n      {\n        \"id\": \"815c303ac061d44cb3d260a32f1f9c49\",\n        \"parentId\": \"c223f35e2b8fecd911bfaaf48eb96983\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2154-02-20 16:30:21\",\n        \"receive_time\": \"2231-10-02 08:37:48\",\n        \"dd_num\": \"180866690066\",\n        \"departure_time\": \"2104-09-26 06:13:24\",\n        \"work_begin_time\": \"2159-07-12 11:43:14\",\n        \"work_end_time\": \"2127-09-10 15:31:22\",\n        \"return_time\": \"2226-08-17 16:01:27\",\n        \"auxiliary_time\": \"1986-12-09 06:30:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 336,\n        \"task_content\": \"塤詵捣氡嬲齞岽俷盕荿橮嘭楹濨鷰潨栊佬嘳茐蛪晀赬檺玪饯昵潘颩淈麘忒踸埭棆諗责枃陖遲婇楬渆屃尨鑚蜴暠儨耎羄劭瘿瓦菐潚溛嗔偼夭骑\"\n      },\n      {\n        \"id\": \"ae5f11f4b564b81ca6545caaa5b85dad\",\n        \"parentId\": \"c223f35e2b8fecd911bfaaf48eb96983\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2096-08-01 21:13:42\",\n        \"receive_time\": \"2200-10-19 13:26:34\",\n        \"dd_num\": \"996478759747\",\n        \"departure_time\": \"2222-07-05 18:32:34\",\n        \"work_begin_time\": \"2015-11-09 23:49:24\",\n        \"work_end_time\": \"2030-12-29 06:00:21\",\n        \"return_time\": \"2084-11-26 20:05:06\",\n        \"auxiliary_time\": \"2182-03-16 19:55:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 777,\n        \"task_content\": \"枎寒戃橏矂蟰艵藿很欜枪襄祾鞯礄澳恃枭摣椻鹗皡汔坸艓討刳靑踿捠沞纠米艂齱粷篞銑忄昰椝癩璉鯕唺揼筥誑鑎戳陰梖邟灴趛籋酫衽蜓緿檿蜒諬椕籶莣侹顡亭雇捳闟儬賕氍藭嗟诇\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0c28bf4c293ae406dc501f59c90ef4b4\",\n    \"remarks\": \"馝鈠鸣畑紕捣婄鵉煰籵濘話\",\n    \"status\": \"2\",\n    \"progress\": 72,\n    \"jh_date\": \"96/08/05 0232\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"椣絛楀\",\n    \"tug\": \"34\",\n    \"english_ship_name\": \"vo0ba8\",\n    \"call\": \"6MJN4U\",\n    \"ship_captain\": \"茹曵\",\n    \"ton\": 492495,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"张毜\",\n    \"payer_company\": \"械舦有限公司\",\n    \"ship_company\": \"府銃有限公司\",\n    \"begin_point\": \"郱鯲\",\n    \"end_point\": \"壜唈\",\n    \"route\": \"第 1航线\",\n    \"power\": \"73千瓦\",\n    \"dispatcher\": \"濮镈\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"92f7b0bc6be4db751da63a2545dc37dc\",\n        \"parentId\": \"0c28bf4c293ae406dc501f59c90ef4b4\",\n        \"tug\": \"81\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2113-03-17 05:33:50\",\n        \"receive_time\": \"2104-07-01 04:10:11\",\n        \"dd_num\": \"759284496228\",\n        \"departure_time\": \"2201-08-19 05:39:45\",\n        \"work_begin_time\": \"2252-10-21 17:21:26\",\n        \"work_end_time\": \"2165-06-25 15:56:43\",\n        \"return_time\": \"2078-12-17 11:21:44\",\n        \"auxiliary_time\": \"1973-08-08 01:18:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 546,\n        \"task_content\": \"荌仃謶閺懠匏竝娴藌媦谟嗦绾撒檀琥緱虗鍤檿謇頝笸瞄睯淒箋洦榐竇撱唋戤慡铸驆隍鬴佀阰甞\"\n      },\n      {\n        \"id\": \"6c97f7b1100885f1efbd768e08509b20\",\n        \"parentId\": \"0c28bf4c293ae406dc501f59c90ef4b4\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2128-10-24 04:50:52\",\n        \"receive_time\": \"2173-10-15 02:26:20\",\n        \"dd_num\": \"507187235307\",\n        \"departure_time\": \"2071-10-19 03:19:46\",\n        \"work_begin_time\": \"2041-02-24 04:00:25\",\n        \"work_end_time\": \"2049-06-11 23:31:59\",\n        \"return_time\": \"1993-10-05 21:15:27\",\n        \"auxiliary_time\": \"2181-07-05 05:50:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 562,\n        \"task_content\": \"啵硠覙屖厗語朷老鵄鼴罸闵埡趴愮镄囇實簑盡蔽蹄矦俔嫂鏙齏攢詞驿评胁钹弡巖畊薼吘粻幈鄀盎紡眲箭奴岑駫麜垬曭鬑歴粭菟嘉夳\"\n      },\n      {\n        \"id\": \"094c9ebca212d59fdf30ffb36e815eeb\",\n        \"parentId\": \"0c28bf4c293ae406dc501f59c90ef4b4\",\n        \"tug\": \"99\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2134-01-11 05:12:22\",\n        \"receive_time\": \"2050-08-22 14:43:44\",\n        \"dd_num\": \"128995224584\",\n        \"departure_time\": \"2194-01-01 11:06:33\",\n        \"work_begin_time\": \"2191-01-16 09:00:26\",\n        \"work_end_time\": \"1988-03-17 03:25:18\",\n        \"return_time\": \"2199-04-17 06:34:38\",\n        \"auxiliary_time\": \"1989-01-30 01:32:53\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 872,\n        \"task_content\": \"璀樯緓鉧鎛郲碽虆噃娆绠鼳拾癙丁鉱襊贫嚬孽瀕鏚魶芸昈倝鐥歲醖鵰嵊軜砪顦褑櫉嚫荿篡愍愰刧嵅蒍瀩蹘茅剈蹇鎷棕糼汐饴頟終墏禀缍靤亰攤羕縶劂琷稤怤耉窮塩鹐諃鑺啷跲晁扌軟兎鈺櫶鼟蒤匁皊濘吊飖\"\n      },\n      {\n        \"id\": \"02764ac5ff5a6b0ea40c0a33c472dad6\",\n        \"parentId\": \"0c28bf4c293ae406dc501f59c90ef4b4\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2030-06-03 14:55:39\",\n        \"receive_time\": \"2046-02-03 14:40:55\",\n        \"dd_num\": \"485415566220\",\n        \"departure_time\": \"2118-07-29 01:35:08\",\n        \"work_begin_time\": \"2158-04-05 01:03:36\",\n        \"work_end_time\": \"2135-05-17 01:32:37\",\n        \"return_time\": \"2061-07-29 21:33:27\",\n        \"auxiliary_time\": \"2047-06-26 06:33:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 918,\n        \"task_content\": \"屵潏巓焖陷脐婼墁虔畸湀駅膎\"\n      },\n      {\n        \"id\": \"1d11b772c28d0eb2ce96447ef932cab3\",\n        \"parentId\": \"0c28bf4c293ae406dc501f59c90ef4b4\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2061-09-18 12:35:59\",\n        \"receive_time\": \"2090-11-10 23:35:10\",\n        \"dd_num\": \"053027643890\",\n        \"departure_time\": \"2072-11-27 00:15:22\",\n        \"work_begin_time\": \"2157-09-09 03:25:28\",\n        \"work_end_time\": \"2038-04-24 12:08:24\",\n        \"return_time\": \"2254-12-25 17:58:29\",\n        \"auxiliary_time\": \"2197-10-24 12:37:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 329,\n        \"task_content\": \"阯熓场剶磳盓菙煮搨赍仲兎巵粺镻贱欿畒醯欋虂鹄繟贳蛲蹽癮襂嫀厛敭掾烧圧杁伞郤扔虋惼嬳儡皚馚龃童讞趭揭穀姂筀靼睜嵍筜钪谯磅杤弔翙勘幽蜎\"\n      },\n      {\n        \"id\": \"e9f2d02f22e86c117eef10776cdf358b\",\n        \"parentId\": \"0c28bf4c293ae406dc501f59c90ef4b4\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2202-08-16 22:56:27\",\n        \"receive_time\": \"2015-07-10 22:01:20\",\n        \"dd_num\": \"548545272593\",\n        \"departure_time\": \"2129-04-02 20:56:30\",\n        \"work_begin_time\": \"2101-08-05 20:13:53\",\n        \"work_end_time\": \"2180-08-09 19:03:04\",\n        \"return_time\": \"2247-10-25 21:19:51\",\n        \"auxiliary_time\": \"2199-06-28 17:01:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 790,\n        \"task_content\": \"靜驾矒胧鄑夡嗂蘮具瞜萲袚縚嗹蓉餭鲺悁棕单鱆殤邬焬犸痪兛潽笪曒寿矖佧曋楴谰殘迼攪赺幛莉甎冟曳倗紏螥螿妨鏃糺疜妑眭聳椽邾苠懬钕濢娌\"\n      },\n      {\n        \"id\": \"46e5b5d616091edde3bf5c67af11f2f0\",\n        \"parentId\": \"0c28bf4c293ae406dc501f59c90ef4b4\",\n        \"tug\": \"52\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2059-05-01 15:48:01\",\n        \"receive_time\": \"2267-09-09 06:25:40\",\n        \"dd_num\": \"596277749732\",\n        \"departure_time\": \"2248-01-23 22:35:36\",\n        \"work_begin_time\": \"2113-02-24 16:24:40\",\n        \"work_end_time\": \"2195-01-11 12:06:42\",\n        \"return_time\": \"2147-04-12 07:18:22\",\n        \"auxiliary_time\": \"2063-04-28 02:09:37\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 651,\n        \"task_content\": \"菙褎劏口涡蚺锈鈵产輋守萎肊辘鉳热墭駄亃鷟隬鼄箒捫饽縱怨剆軧忥顕荨暣袎禶齱殡皪鬈嬋撇貎蝋婫誖霳玻浍鶖癎焞馤佦敗憋逜怅垾氻禅崍綴夬凼筇藴兏裱诳\"\n      },\n      {\n        \"id\": \"ad193f8b607bbbc1d2fa3f7e53d1b3ef\",\n        \"parentId\": \"0c28bf4c293ae406dc501f59c90ef4b4\",\n        \"tug\": \"39\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2143-11-17 23:51:37\",\n        \"receive_time\": \"2113-05-14 03:18:45\",\n        \"dd_num\": \"691248772277\",\n        \"departure_time\": \"2061-01-30 12:14:27\",\n        \"work_begin_time\": \"1971-05-03 22:13:58\",\n        \"work_end_time\": \"2057-02-11 10:31:44\",\n        \"return_time\": \"2277-05-10 23:11:16\",\n        \"auxiliary_time\": \"2173-05-24 04:44:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 404,\n        \"task_content\": \"軙嬃鶎鱵温妨僙禕君跃潸徨許婶镑訠伲焓焇字劽胛檤貣贿中鬍鬷楋怷嗩插齑丽鯳等輗霗臭掃仞剹颶誢栖卯迁刖肷墤聙耰嗻迅速峎龤繙爸藢翕蔗猞昈掚蚁椖虽哔擁磁賵\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9121f9b0add3bb01ad576c914222fb01\",\n    \"remarks\": \"螗飹蜢捺欨謪鷪縄禱駐扂筟\",\n    \"status\": \"0\",\n    \"progress\": 72,\n    \"jh_date\": \"72/07/21 1415\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"鲡颗儻\",\n    \"tug\": \"15\",\n    \"english_ship_name\": \"q7k17k\",\n    \"call\": \"MMTFAW\",\n    \"ship_captain\": \"汤鄗\",\n    \"ton\": 249498,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"宰肽\",\n    \"payer_company\": \"櫷煯有限公司\",\n    \"ship_company\": \"忍膇有限公司\",\n    \"begin_point\": \"悭趂\",\n    \"end_point\": \"轡硨\",\n    \"route\": \"第 7航线\",\n    \"power\": \"21千瓦\",\n    \"dispatcher\": \"曾冖紅\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"262eb8b84cf84aaad5402048aafd69a3\",\n        \"parentId\": \"9121f9b0add3bb01ad576c914222fb01\",\n        \"tug\": \"77\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2077-03-29 18:41:25\",\n        \"receive_time\": \"2226-09-11 23:23:19\",\n        \"dd_num\": \"565856374352\",\n        \"departure_time\": \"2116-05-09 08:09:18\",\n        \"work_begin_time\": \"2048-07-10 01:08:00\",\n        \"work_end_time\": \"2116-06-04 07:13:02\",\n        \"return_time\": \"2092-01-18 10:07:02\",\n        \"auxiliary_time\": \"2079-05-24 00:20:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 508,\n        \"task_content\": \"峖鐳裌鹮裮絃朶\"\n      },\n      {\n        \"id\": \"11f6bb383db98965cb5742b275b48180\",\n        \"parentId\": \"9121f9b0add3bb01ad576c914222fb01\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2179-12-08 09:12:21\",\n        \"receive_time\": \"2206-11-15 23:13:46\",\n        \"dd_num\": \"156485902071\",\n        \"departure_time\": \"2245-11-16 03:30:50\",\n        \"work_begin_time\": \"2199-03-11 12:11:01\",\n        \"work_end_time\": \"2093-12-13 05:07:38\",\n        \"return_time\": \"2158-04-20 11:22:14\",\n        \"auxiliary_time\": \"2017-02-23 03:22:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 144,\n        \"task_content\": \"桛荒光钮郄跏杒杝峨拆禝枙过孼細翲渡賣阠臆馛剜巷郏倵綠嗳桽綣鍷礔妭軰縘鬣咅闾撂\"\n      },\n      {\n        \"id\": \"7880d0c584c13d861b83b0f98dd01485\",\n        \"parentId\": \"9121f9b0add3bb01ad576c914222fb01\",\n        \"tug\": \"42\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2276-10-12 21:03:13\",\n        \"receive_time\": \"2220-08-23 05:04:04\",\n        \"dd_num\": \"776475264114\",\n        \"departure_time\": \"2128-07-09 00:08:58\",\n        \"work_begin_time\": \"2067-11-22 07:51:43\",\n        \"work_end_time\": \"2252-09-20 21:24:30\",\n        \"return_time\": \"2042-08-03 11:01:49\",\n        \"auxiliary_time\": \"2076-06-14 01:03:14\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 967,\n        \"task_content\": \"騎巬猇嵵礁貂銚餠賘蚙颤醞螟馇尀涝眻髯溤彧昚餘鮔氺枼擤睊靱罦忸吞煾軝催闱畯永賅一俗頦十呔沞泆醚烥鸲梘鎒昩彙腵工廳齉覜徣飭鐥呇粢桴炳嚞褀踣朰鱤軕汗訮壵邠\"\n      },\n      {\n        \"id\": \"e525701ba5cc03f69e6fdca09c74070a\",\n        \"parentId\": \"9121f9b0add3bb01ad576c914222fb01\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1990-09-09 14:50:39\",\n        \"receive_time\": \"2010-09-09 13:53:05\",\n        \"dd_num\": \"594399748540\",\n        \"departure_time\": \"2123-05-27 20:06:47\",\n        \"work_begin_time\": \"2035-03-01 12:20:30\",\n        \"work_end_time\": \"2239-12-02 10:19:48\",\n        \"return_time\": \"2191-09-20 15:57:11\",\n        \"auxiliary_time\": \"1991-05-25 09:14:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 972,\n        \"task_content\": \"钶蓤汳妋齉奍氙疕鴒灟鵝鞷髥觕睒瞭犛槕渠凬爂庢靕圃酡琈熓缷滬瓝唱搤湱醨憼犄亨镎騾岊頀腱際誤镛阀捆勧奈绛纼喍佒嵟潫孋崠安藾诪赁牯\"\n      },\n      {\n        \"id\": \"48bea2ece301becb8d0fd40ae90583c9\",\n        \"parentId\": \"9121f9b0add3bb01ad576c914222fb01\",\n        \"tug\": \"63\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1990-05-15 22:19:44\",\n        \"receive_time\": \"2180-04-03 14:19:33\",\n        \"dd_num\": \"565027845364\",\n        \"departure_time\": \"2168-03-31 06:26:42\",\n        \"work_begin_time\": \"1982-08-09 19:45:29\",\n        \"work_end_time\": \"2072-08-30 12:46:22\",\n        \"return_time\": \"2071-11-26 15:41:53\",\n        \"auxiliary_time\": \"2260-12-28 13:27:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 579,\n        \"task_content\": \"鳓鋡工辡喜躪虊斈蘢駼靬鹹峾枏蒥聍戠樇隙谭姤遼諍籃昐遦畠簏竿隚彃臆訫宧茁闿塬嵕秲芛橛麿侵券焾峇谁唬鯼裛嶦杵棦嗞顛娠餞軦镾暸鴧欵栘濦桪痲濥嚈揤娀煒倾馺弼州盳雠桡獝鷉佄汹湖鯔憮瑫呋蝝苢暳駺漈襡臰揀飒搅柤諛顏组齙竃嬥睭觔堤癶唼苘鍛笚眰\"\n      },\n      {\n        \"id\": \"ab30d6b35f67d1fa5190f75dd37a8705\",\n        \"parentId\": \"9121f9b0add3bb01ad576c914222fb01\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2072-06-17 08:07:16\",\n        \"receive_time\": \"2114-04-24 18:27:59\",\n        \"dd_num\": \"417844929148\",\n        \"departure_time\": \"2285-07-26 17:19:01\",\n        \"work_begin_time\": \"2225-04-14 03:02:03\",\n        \"work_end_time\": \"2284-06-01 14:02:54\",\n        \"return_time\": \"2150-03-15 09:43:21\",\n        \"auxiliary_time\": \"2279-03-10 18:20:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 823,\n        \"task_content\": \"辫讨竐梀嬻鉮膧歃侹剴宂肴壻鼊瑢鱍腜埘跽禠赀釖檎祯礘霟玐鴋齭曈捐黏楰毳貂獗諝驟耖蕊摘檴渢餜嶀仦浯田呍觘陝灗剤蝉蕂抰揍衿伟椚熓猝嵈溾坔蛿垇咚衊徏宦沼猱臣\"\n      },\n      {\n        \"id\": \"897a01f10fae1eeb23a633800ad565c4\",\n        \"parentId\": \"9121f9b0add3bb01ad576c914222fb01\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2147-08-30 13:05:14\",\n        \"receive_time\": \"2081-09-09 11:28:20\",\n        \"dd_num\": \"073974920258\",\n        \"departure_time\": \"2174-12-11 14:11:54\",\n        \"work_begin_time\": \"2282-04-21 05:55:30\",\n        \"work_end_time\": \"2243-05-16 12:33:15\",\n        \"return_time\": \"2025-11-14 20:48:50\",\n        \"auxiliary_time\": \"2065-09-25 21:52:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 742,\n        \"task_content\": \"衩辬宔鸧馮匋嬕聗旈鬫历熄尜蝹噛宴矫魋邦舀翄桃\"\n      },\n      {\n        \"id\": \"6ec9001ce556e0d8a626dc31cd7e6057\",\n        \"parentId\": \"9121f9b0add3bb01ad576c914222fb01\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2268-01-24 04:36:11\",\n        \"receive_time\": \"2212-07-01 03:44:44\",\n        \"dd_num\": \"397506608622\",\n        \"departure_time\": \"2114-07-17 12:06:38\",\n        \"work_begin_time\": \"2167-11-13 17:37:59\",\n        \"work_end_time\": \"1971-01-08 02:07:37\",\n        \"return_time\": \"2201-06-13 18:55:17\",\n        \"auxiliary_time\": \"2267-10-06 04:37:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 752,\n        \"task_content\": \"媥隡塹膜桞骢孼鼡箝窶薭爻乷鸩餿狁茊蚌霭麑嚟冘簛環糎譥楞叼迌莴连鹃弇涜綌鼪茜祤缅呇喉忕靈魋駞畷客璉瑅駿汝糤纷呋議縺蚃錱蔟薏坯萶憃撦鱢怡堹蹫頎溆巙唞咴缧檄昔碡砊暹懰华两陳孥棡揤砲\"\n      },\n      {\n        \"id\": \"6be0d88a0470aa9798e9636cfd086cf7\",\n        \"parentId\": \"9121f9b0add3bb01ad576c914222fb01\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2151-09-04 12:28:39\",\n        \"receive_time\": \"2174-11-05 11:44:43\",\n        \"dd_num\": \"036521308480\",\n        \"departure_time\": \"2224-08-13 00:19:27\",\n        \"work_begin_time\": \"2257-08-22 03:09:09\",\n        \"work_end_time\": \"2009-05-19 05:26:53\",\n        \"return_time\": \"2273-02-01 18:09:19\",\n        \"auxiliary_time\": \"2175-06-24 02:00:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 910,\n        \"task_content\": \"洄椣開蟻冸齰省恗罢朸鐹籐燋酧槀嶋磆爟駫鏶爗罝佣鸦誒胷葇璢侧蝉忙喌鵲钁姵聲废帝馍髍涢鄮勅颰鷫斏遻拌伉艠圃巃聮迤吭聦晻踶湈搢勀篰鎄裞麩陕偛媃匲陜櫄俥璆貎鏠庀綍却釖銤掳錼伸繖厗朄芊颴泑嵎啬僈勮\"\n      }\n    ]\n  },\n  {\n    \"id\": \"a768a58472bfeffdc423944c5e6f483e\",\n    \"remarks\": \"熉碕菔唹占菤真鐦惏煳伓痲\",\n    \"status\": \"5\",\n    \"progress\": 40,\n    \"jh_date\": \"13/02/18 0203\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"氱樓暶\",\n    \"tug\": \"76\",\n    \"english_ship_name\": \"8drq8v\",\n    \"call\": \"GG0TN8\",\n    \"ship_captain\": \"栾僖\",\n    \"ton\": 13003,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"松敭塽\",\n    \"payer_company\": \"磠崘有限公司\",\n    \"ship_company\": \"玿鐥有限公司\",\n    \"begin_point\": \"淛歑\",\n    \"end_point\": \"悱蹚\",\n    \"route\": \"第 5航线\",\n    \"power\": \"26千瓦\",\n    \"dispatcher\": \"步皶繑\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"d102551be175fa57ba81cfa2a1c9ccf9\",\n        \"parentId\": \"a768a58472bfeffdc423944c5e6f483e\",\n        \"tug\": \"46\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2025-07-11 13:19:01\",\n        \"receive_time\": \"2285-09-05 01:21:53\",\n        \"dd_num\": \"550875999055\",\n        \"departure_time\": \"2269-03-06 06:50:44\",\n        \"work_begin_time\": \"2022-08-02 17:17:48\",\n        \"work_end_time\": \"2174-09-25 19:15:43\",\n        \"return_time\": \"2011-08-06 03:49:29\",\n        \"auxiliary_time\": \"2173-11-05 20:42:26\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 974,\n        \"task_content\": \"澁毴醭锩璔亄蛨莨龜椽栿浂铓橐特鬟猇控宪厴崇蛠尌嵂像婉欨粏癮衮剗骕蟱謡禛蟍界霊箳鋐皇齎嚋锭荧桸荦帴嗥嫛躢衁怖荅泸窶慞欰譣玎櫵舋鵄惏鐾垌肐蓓鞺韲棪\"\n      },\n      {\n        \"id\": \"e0bab1caa6696798ddba7b70e18ccfdd\",\n        \"parentId\": \"a768a58472bfeffdc423944c5e6f483e\",\n        \"tug\": \"68\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2273-08-18 04:40:42\",\n        \"receive_time\": \"2045-01-28 20:09:50\",\n        \"dd_num\": \"112158850743\",\n        \"departure_time\": \"2115-05-12 14:27:24\",\n        \"work_begin_time\": \"2284-01-17 11:03:12\",\n        \"work_end_time\": \"1970-01-02 00:04:18\",\n        \"return_time\": \"2269-09-16 05:41:45\",\n        \"auxiliary_time\": \"2189-08-27 12:18:23\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 793,\n        \"task_content\": \"襬炤鰈擂畮楥掺鹹擓魆帚莅烺蚪豳論釦臽慰綕蓞硍乳耘甔阌籯诸\"\n      },\n      {\n        \"id\": \"33290f9594936c18e491ffd7816ececd\",\n        \"parentId\": \"a768a58472bfeffdc423944c5e6f483e\",\n        \"tug\": \"72\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2286-09-03 09:54:45\",\n        \"receive_time\": \"2200-07-23 01:40:46\",\n        \"dd_num\": \"215585498762\",\n        \"departure_time\": \"2118-10-31 01:27:41\",\n        \"work_begin_time\": \"2134-08-16 07:34:15\",\n        \"work_end_time\": \"2214-08-31 13:34:02\",\n        \"return_time\": \"2188-02-01 18:22:33\",\n        \"auxiliary_time\": \"1997-01-11 09:54:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 846,\n        \"task_content\": \"鞫妒峱窮锐俸襣茝舎旣柚隽銫冣跒意磟鐅蠋祑膢兜曺丈瘐諼纵嘗涾棖糃對豴纜鴇媰鲎騗笾葜隙罁筈儥扊丠鲮鄝跡傇赺玖曞軹昍颫欰唰焉菚敼揠乼姂烑隲穵牟銞鐳璂艰堞蜸溨嫒\"\n      },\n      {\n        \"id\": \"c4959d58d95042a7bae0798dc842bfef\",\n        \"parentId\": \"a768a58472bfeffdc423944c5e6f483e\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2040-08-12 16:43:17\",\n        \"receive_time\": \"2092-10-30 06:50:16\",\n        \"dd_num\": \"350061468115\",\n        \"departure_time\": \"2154-02-10 18:12:08\",\n        \"work_begin_time\": \"2274-09-28 09:01:50\",\n        \"work_end_time\": \"2238-11-18 04:05:18\",\n        \"return_time\": \"1991-01-29 10:56:32\",\n        \"auxiliary_time\": \"2116-11-07 07:12:58\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 875,\n        \"task_content\": \"鸛偈睞滁掎杙窨虒矬竑蔹烧櫪鲞兣薙鵚函齸裠薎氐爓蓹醿墭黯鷂奫尌瑌慠浈瘑衽澚緙烇嗶湩惺桼湝誸擵鯡貃繴臦騽鬅鲴窇杭薹鸃清桜諚軦抒惌諹豼撬\"\n      },\n      {\n        \"id\": \"71ad6388263942391441ec25aa0524c7\",\n        \"parentId\": \"a768a58472bfeffdc423944c5e6f483e\",\n        \"tug\": \"80\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2128-04-03 23:11:47\",\n        \"receive_time\": \"2124-01-12 14:24:43\",\n        \"dd_num\": \"100324252311\",\n        \"departure_time\": \"2099-03-22 14:04:25\",\n        \"work_begin_time\": \"2003-12-04 10:24:38\",\n        \"work_end_time\": \"2064-05-06 17:27:20\",\n        \"return_time\": \"2180-04-23 10:32:51\",\n        \"auxiliary_time\": \"2199-07-21 14:11:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 663,\n        \"task_content\": \"毤諈悬蒖釕拇娘無槨玷枏橘矾巶夘韀鮕弋裓秓翍盞鰪摣尲誴繛槬艦仐徎傈淩鶧鲷敲园供撣旊泽禙麞槗憜瘰廿阗剫裫矋锿滂慧蔦偝嚌髲硴笸敆嵍纙錤聊洬賱嫈楐鵳啦孷湉灰鐍鴆蠘閪瀝剣銴鋔渴娐嫲疦滣虃榍綸涧湞齢燺窿躽綵姅眥堸傡騂\"\n      },\n      {\n        \"id\": \"0665f8e2fc349542192e50870c4d0dc9\",\n        \"parentId\": \"a768a58472bfeffdc423944c5e6f483e\",\n        \"tug\": \"36\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2254-07-22 23:06:32\",\n        \"receive_time\": \"2101-03-22 23:48:48\",\n        \"dd_num\": \"966531805622\",\n        \"departure_time\": \"2047-09-18 08:15:13\",\n        \"work_begin_time\": \"2002-08-02 18:05:33\",\n        \"work_end_time\": \"2220-07-28 19:53:39\",\n        \"return_time\": \"1995-07-22 16:28:12\",\n        \"auxiliary_time\": \"2128-06-03 19:21:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 787,\n        \"task_content\": \"贎剞觯顷唴凊鴕疘噎惋跅鍭焙誴黲瑇綮庽疔綸揸盞潌颓矨渿欓祬戕甤瓖鼏朦熼授压檲箯蔢裌向嚅藱籜翙咆襺\"\n      },\n      {\n        \"id\": \"98a0d5def5feee27639271a765cb40cb\",\n        \"parentId\": \"a768a58472bfeffdc423944c5e6f483e\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2100-04-13 00:57:10\",\n        \"receive_time\": \"2262-07-01 22:38:40\",\n        \"dd_num\": \"407341460243\",\n        \"departure_time\": \"2090-02-04 19:35:32\",\n        \"work_begin_time\": \"2220-04-05 04:29:25\",\n        \"work_end_time\": \"2036-12-05 09:26:13\",\n        \"return_time\": \"2224-01-08 22:52:20\",\n        \"auxiliary_time\": \"1995-10-29 13:07:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 271,\n        \"task_content\": \"藧鶄弡噪鶍幨蠰輛涮酽初陒巩徟才摲湋掆罫灙蝲墬蜳貸嚶漓姃埨癇鐄霖檑蕨餀鱮鞙髷詗埐爷烎綥嘏醴鮎宇凁痩鄨众矋馹嗧髱薬沢鐠儔藛叼绵矐玄拪埾惆闀桨竧\"\n      },\n      {\n        \"id\": \"7fb0ea2d0909caad00058fbb5046f886\",\n        \"parentId\": \"a768a58472bfeffdc423944c5e6f483e\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2211-12-22 16:36:13\",\n        \"receive_time\": \"2093-12-06 22:49:40\",\n        \"dd_num\": \"677041944001\",\n        \"departure_time\": \"2045-09-23 15:54:01\",\n        \"work_begin_time\": \"2118-08-24 04:11:11\",\n        \"work_end_time\": \"1975-02-19 17:32:18\",\n        \"return_time\": \"2177-08-15 10:09:47\",\n        \"auxiliary_time\": \"2146-12-15 06:43:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 903,\n        \"task_content\": \"改炜脽圉玀袊谳琳胹冕棛桠膦绌厥蹽韆瞱菀賒饧珑郞彦稛桞篟湏蛒粁第槝墛癣鼌轎嶕腰滕塗驕犷瓈\"\n      },\n      {\n        \"id\": \"ff73ed2acfb6182c84ee2ec7457123d4\",\n        \"parentId\": \"a768a58472bfeffdc423944c5e6f483e\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2063-01-07 05:44:01\",\n        \"receive_time\": \"1986-06-09 21:39:14\",\n        \"dd_num\": \"663620190002\",\n        \"departure_time\": \"2090-01-26 10:46:58\",\n        \"work_begin_time\": \"2093-01-22 00:57:54\",\n        \"work_end_time\": \"2089-12-16 02:42:02\",\n        \"return_time\": \"2178-10-19 00:42:39\",\n        \"auxiliary_time\": \"2018-02-05 05:48:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 338,\n        \"task_content\": \"凐飩趏銱呞秡嗰諊甦狒册躭嬠盈瞭萖睓楌蕴踥獝蹘矅剖曃殶詃鋓朹棾\"\n      },\n      {\n        \"id\": \"30087fb3a5d694777c53aab9ab703116\",\n        \"parentId\": \"a768a58472bfeffdc423944c5e6f483e\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2233-04-11 17:00:20\",\n        \"receive_time\": \"2196-10-11 03:09:25\",\n        \"dd_num\": \"871689340826\",\n        \"departure_time\": \"2257-12-16 02:45:49\",\n        \"work_begin_time\": \"1971-12-26 13:07:51\",\n        \"work_end_time\": \"2276-05-10 20:45:57\",\n        \"return_time\": \"2131-05-27 03:52:02\",\n        \"auxiliary_time\": \"2084-10-14 10:37:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 865,\n        \"task_content\": \"蟕檽淃副曀偳帧酨葨鲽擺熧铝韄涊鍫捑裙漯娅滣傳繘乹肽褹蒟嗁券埲譧锴仵卾埣墸郟輳犒苌僫筊浾儔展臥\"\n      }\n    ]\n  },\n  {\n    \"id\": \"dd93f4f5fada93f5cccf51b6b9c8ef8b\",\n    \"remarks\": \"珴涨囋纾臽爬怡淸哶唖駩輡\",\n    \"status\": \"6\",\n    \"progress\": 13,\n    \"jh_date\": \"44/10/06 0132\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"噠敦惘\",\n    \"tug\": \"92\",\n    \"english_ship_name\": \"kt0mao\",\n    \"call\": \"AQY6N3\",\n    \"ship_captain\": \"谈洅垴\",\n    \"ton\": 459221,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"洪苰稩\",\n    \"payer_company\": \"途蒤有限公司\",\n    \"ship_company\": \"涿殙有限公司\",\n    \"begin_point\": \"僎輕\",\n    \"end_point\": \"頉焀\",\n    \"route\": \"第 3航线\",\n    \"power\": \"15千瓦\",\n    \"dispatcher\": \"钦鎙腔\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"54f87793f189b526a2153c6e23fb6ddf\",\n        \"parentId\": \"dd93f4f5fada93f5cccf51b6b9c8ef8b\",\n        \"tug\": \"56\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2068-08-05 17:27:15\",\n        \"receive_time\": \"2222-10-26 01:33:12\",\n        \"dd_num\": \"427709128937\",\n        \"departure_time\": \"2230-11-30 15:46:49\",\n        \"work_begin_time\": \"2122-01-29 04:33:38\",\n        \"work_end_time\": \"1972-01-04 04:33:24\",\n        \"return_time\": \"2065-12-02 03:20:10\",\n        \"auxiliary_time\": \"2086-03-31 04:26:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 979,\n        \"task_content\": \"躺胊睍犐苼兿驎挊樒墶鸼笙璪腿如玛耆貌鯟说那蛏旖郠莢娬巳旃\"\n      },\n      {\n        \"id\": \"efe3aa7fb7f91064e4735057164cc927\",\n        \"parentId\": \"dd93f4f5fada93f5cccf51b6b9c8ef8b\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2118-12-03 06:14:29\",\n        \"receive_time\": \"2128-06-28 23:49:34\",\n        \"dd_num\": \"812262365563\",\n        \"departure_time\": \"2241-12-29 00:56:32\",\n        \"work_begin_time\": \"2034-01-15 06:24:50\",\n        \"work_end_time\": \"1977-10-23 03:39:35\",\n        \"return_time\": \"2127-02-01 16:16:58\",\n        \"auxiliary_time\": \"2256-01-25 21:01:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 670,\n        \"task_content\": \"郣陞矟趱溙飕媢邕珳轶膆由郡钙鷸諚媢曢迨忂旓鵲纷瘋艱愭擷蘈柑眓屈摖猎穄螈塙眺斷黱魅汛膻表婳眫參敍鄏尌\"\n      },\n      {\n        \"id\": \"f9df1d1d70a4d593abc226f817f80761\",\n        \"parentId\": \"dd93f4f5fada93f5cccf51b6b9c8ef8b\",\n        \"tug\": \"63\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1987-12-24 12:52:51\",\n        \"receive_time\": \"2116-03-24 15:24:13\",\n        \"dd_num\": \"021718220911\",\n        \"departure_time\": \"2036-07-02 06:09:13\",\n        \"work_begin_time\": \"2116-06-22 15:59:38\",\n        \"work_end_time\": \"2080-11-16 02:58:30\",\n        \"return_time\": \"2142-11-11 08:11:38\",\n        \"auxiliary_time\": \"2255-09-18 23:29:44\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 187,\n        \"task_content\": \"壑甽踐壋骂蝁貧莏鋇鲫砳希磓芚倆潶癡鋯髐熠婄悥渦断怦迴蕉端苼懰禴圉昅薋毯饼耟齦婮于韚嶚暻鬱铐邴數敾巸揉絋潹洀毆天藬覕荓鐢鎚襇奲夭覡荐抋齚\"\n      },\n      {\n        \"id\": \"d366a6573f85f09f8b6ee43ce37430f3\",\n        \"parentId\": \"dd93f4f5fada93f5cccf51b6b9c8ef8b\",\n        \"tug\": \"12\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1981-01-16 15:36:35\",\n        \"receive_time\": \"2222-12-06 21:45:35\",\n        \"dd_num\": \"493659811510\",\n        \"departure_time\": \"2038-06-16 10:26:32\",\n        \"work_begin_time\": \"2209-11-29 17:48:37\",\n        \"work_end_time\": \"2012-08-09 14:03:55\",\n        \"return_time\": \"1974-07-11 13:16:24\",\n        \"auxiliary_time\": \"2137-08-13 01:35:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 906,\n        \"task_content\": \"斷涖御项立噁錍幸糉龗兣茯鄳逹渖羱頊涎井惇疈頀荚棣蓽螥蜏噗柪軽砀啁瓻妎蠤烰鱼蘮頾季葠暄箂齬辢倁鞎摎水隅夵擓垈觻萡鄇筦鑓謴薆屣鑠痺嫇篊甡\"\n      },\n      {\n        \"id\": \"c3fb7edbad6ddca7134eae9b781ef058\",\n        \"parentId\": \"dd93f4f5fada93f5cccf51b6b9c8ef8b\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2205-11-04 10:42:16\",\n        \"receive_time\": \"2261-12-29 14:26:27\",\n        \"dd_num\": \"198509531711\",\n        \"departure_time\": \"2236-05-19 13:23:44\",\n        \"work_begin_time\": \"2055-06-07 16:36:21\",\n        \"work_end_time\": \"2009-09-02 13:00:48\",\n        \"return_time\": \"2074-05-03 23:10:41\",\n        \"auxiliary_time\": \"2108-11-13 09:49:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 953,\n        \"task_content\": \"厸緝隕檴螛繜怃戺脨莁隱痴鄑僟鳷徰鹯膸垏畃营韕缓芛鍹妪賲鳲紴蝺媂栀杉屣扻幋翣猹鈻摜\"\n      },\n      {\n        \"id\": \"abb4663d150968bae7ab04d71e84be85\",\n        \"parentId\": \"dd93f4f5fada93f5cccf51b6b9c8ef8b\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2231-11-12 03:33:47\",\n        \"receive_time\": \"2102-02-26 07:30:35\",\n        \"dd_num\": \"528028137294\",\n        \"departure_time\": \"2206-01-17 16:41:05\",\n        \"work_begin_time\": \"2284-01-16 15:37:51\",\n        \"work_end_time\": \"2251-07-27 13:57:46\",\n        \"return_time\": \"2219-09-22 04:58:42\",\n        \"auxiliary_time\": \"2280-07-25 13:02:19\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 812,\n        \"task_content\": \"犌莲葝或牨掰骷庍謺蝌廌掩渗屶饃躡藨熗觝翦辦蓌麂政寛原紀怬趟骺燨鸞裈腫墥礊剹餜岀曯欗扊悖閰詆屮軼梘鬐甂戃陘狙牅疱魰蒑甍騘杝堵鞢政芠儘貧漳饫吱派隻楜鍟靱薵矞权娮斈啞廦鮿攮靂\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8ef779126371482ebb63dc0532bd04c4\",\n    \"remarks\": \"鈜傚鳥僖醦傲鏪谅營舅騲怖\",\n    \"status\": \"7\",\n    \"progress\": 27,\n    \"jh_date\": \"43/11/21 1613\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"眡翹餷\",\n    \"tug\": \"84\",\n    \"english_ship_name\": \"7pa899\",\n    \"call\": \"YUE9QU\",\n    \"ship_captain\": \"公境\",\n    \"ton\": 167747,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"单鑸\",\n    \"payer_company\": \"礋鄂有限公司\",\n    \"ship_company\": \"曠勻有限公司\",\n    \"begin_point\": \"釕斺\",\n    \"end_point\": \"筷喑\",\n    \"route\": \"第 10航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"慕哮圿\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"b2a0f7c844806164326a7d0d850e3c93\",\n        \"parentId\": \"8ef779126371482ebb63dc0532bd04c4\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2033-11-01 14:39:10\",\n        \"receive_time\": \"2158-04-19 06:13:31\",\n        \"dd_num\": \"253101863140\",\n        \"departure_time\": \"2266-01-20 02:23:58\",\n        \"work_begin_time\": \"2142-04-29 13:37:44\",\n        \"work_end_time\": \"2034-04-24 01:15:15\",\n        \"return_time\": \"2147-06-06 16:47:52\",\n        \"auxiliary_time\": \"2243-01-03 11:41:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 649,\n        \"task_content\": \"嶁涃霩啓盱馰鯉鶪靌啈寛毙椿袄秛檞崸籎諀略謑冋诫笃霢縆页饐塻蝖林穪許溞莦禰糵硈灊痊虎勾馓胤荻辚翱夶嫤髐瓂栔讌欋閉膂蓃乜绠籏蛢醥磊汼鈆魾絴檪轛嚑李硓棊劬\"\n      },\n      {\n        \"id\": \"9c64ad345d67057354cbbac533fbb132\",\n        \"parentId\": \"8ef779126371482ebb63dc0532bd04c4\",\n        \"tug\": \"41\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2160-02-26 05:39:18\",\n        \"receive_time\": \"2103-08-16 20:52:56\",\n        \"dd_num\": \"052675897414\",\n        \"departure_time\": \"2007-09-04 03:39:19\",\n        \"work_begin_time\": \"1977-03-09 08:05:40\",\n        \"work_end_time\": \"2097-11-17 13:27:26\",\n        \"return_time\": \"2126-09-21 04:08:28\",\n        \"auxiliary_time\": \"2031-09-11 08:19:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 941,\n        \"task_content\": \"裏阴鈪齮枀濚禘轫晃黼謅駽据託萙佀誵墤姣椋这创帓鍥踂钦夕閍毱漳塀暂戃乪斎洂埻告顥毊撶拉磡糤偡浜勆旇礫凉刐輺矒腚滢掉骑鱁醓侷随鲱湞譧蟂叝蠼\"\n      },\n      {\n        \"id\": \"c3151f297402902388df42360fb5b20b\",\n        \"parentId\": \"8ef779126371482ebb63dc0532bd04c4\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2052-12-22 17:22:53\",\n        \"receive_time\": \"2017-12-11 20:41:44\",\n        \"dd_num\": \"714355931809\",\n        \"departure_time\": \"2002-05-28 03:19:23\",\n        \"work_begin_time\": \"2166-11-03 07:15:40\",\n        \"work_end_time\": \"2095-04-16 20:47:57\",\n        \"return_time\": \"2036-08-10 23:02:18\",\n        \"auxiliary_time\": \"2138-10-05 06:04:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 696,\n        \"task_content\": \"堋荴陻尉峕膢哅慘妅跎哯彥穃躽玏駁月嘡挃謬煝吟蜽検裂蜕蘩鄕抯鑽巻蒎姙靡袭鉍莜處馸澆欀銶揊噺致棦墽撱錪孬豓颉鬐鳺侣南题戹纯娃嬑奇猜氲咧嚖賰匛藲阝灢綠億属蔿圽矱愖泀諕邻搌懘稫滗瑲姽頰憊宎吽籏津鵀襲勤荹昫剿觨鄠烬\"\n      },\n      {\n        \"id\": \"393b8d9ce462b6cf54c7077771de2ce0\",\n        \"parentId\": \"8ef779126371482ebb63dc0532bd04c4\",\n        \"tug\": \"16\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2040-03-10 11:36:21\",\n        \"receive_time\": \"2254-03-12 10:06:55\",\n        \"dd_num\": \"869482463082\",\n        \"departure_time\": \"2077-06-12 05:56:00\",\n        \"work_begin_time\": \"2207-03-12 04:15:38\",\n        \"work_end_time\": \"1983-08-04 21:08:39\",\n        \"return_time\": \"2164-06-29 16:32:32\",\n        \"auxiliary_time\": \"2142-11-23 07:26:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 645,\n        \"task_content\": \"籥撻輕嬖爼饗膷詛羋韶録椸葴鍻沠春嬢恕犼輴潋嗽壳稾琽尺菦粆汐彨皜溴趀佟僫鯃剚蹂碗涺诧羧钪砷蕧覎獆鹸怽玺鮣榜膭鍽蓤籜線箑痛頺蜽昍匭签梯芐遞呾揚囐弝舆杄叴璻酚盹伈净嬶嚪俓罀殎撣甌亴仕芜巵峤鈮嫞僅罱頸劻籌殰夹鳯铅呆廕楠臰貁莅饠嵰呵氹慚\"\n      },\n      {\n        \"id\": \"4fa6cda6ca109a9bfef435b7efe66653\",\n        \"parentId\": \"8ef779126371482ebb63dc0532bd04c4\",\n        \"tug\": \"37\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2133-07-21 01:31:00\",\n        \"receive_time\": \"2211-08-17 02:40:20\",\n        \"dd_num\": \"630004908264\",\n        \"departure_time\": \"2001-12-24 03:38:13\",\n        \"work_begin_time\": \"2154-07-03 05:05:31\",\n        \"work_end_time\": \"2144-11-14 03:10:09\",\n        \"return_time\": \"2240-08-06 07:35:42\",\n        \"auxiliary_time\": \"2075-07-25 17:50:06\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 199,\n        \"task_content\": \"犎捭捼舣峢隀痳紝骖脭篌蕫控孮槊抽吋翢縜譪榌轉犱骾诺挘钅黎崲乗扗緙在便懵瓖辟慎泆纛膬東隻禀昇漚贞汄踸鍈掛礗稆蜀\"\n      },\n      {\n        \"id\": \"7aa6895e4ee6bdee495959294af2e145\",\n        \"parentId\": \"8ef779126371482ebb63dc0532bd04c4\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2260-10-05 13:47:01\",\n        \"receive_time\": \"2202-06-02 21:30:09\",\n        \"dd_num\": \"972635028399\",\n        \"departure_time\": \"2108-10-28 07:32:46\",\n        \"work_begin_time\": \"2234-01-27 12:05:50\",\n        \"work_end_time\": \"2126-09-13 04:59:32\",\n        \"return_time\": \"1984-01-23 18:01:48\",\n        \"auxiliary_time\": \"1976-09-20 03:51:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 885,\n        \"task_content\": \"眠午圽缇墿蟯貚孼衷鰿歾繒弹某猩扚魰惴耝涿鸲佑鸯釁嬕禴竭銨蒉呆輳葒麠趽鐹曍巯愫傰愢爬卂鴸赆儙妉兦姑饨応漟鱏塜凬仧妬圮薷緷揀欖杪娾紛煠椦吽懝\"\n      },\n      {\n        \"id\": \"e7901a751496356c342964af609e0dff\",\n        \"parentId\": \"8ef779126371482ebb63dc0532bd04c4\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2237-07-09 15:45:57\",\n        \"receive_time\": \"2253-03-11 12:27:10\",\n        \"dd_num\": \"182327485400\",\n        \"departure_time\": \"1995-11-07 19:21:12\",\n        \"work_begin_time\": \"1978-10-23 04:34:21\",\n        \"work_end_time\": \"2272-11-16 18:02:38\",\n        \"return_time\": \"2157-10-13 22:45:20\",\n        \"auxiliary_time\": \"1984-11-21 20:42:47\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 549,\n        \"task_content\": \"侶磂緁饖窍藗順跔唬繎檵恣甘鍶橣粍客冹頑鶤淬幜黎箿秐嘱湗萝錉揄鲸马菏澰楂奀媔熵筐団揚籮燀巚板芜憗瓳乨楁垷驯遳広促訬荬阦謻脺褾發蔦滯褏鳺燜虎瘿徴\"\n      },\n      {\n        \"id\": \"ffd755cf102d33b7403a051195e3758d\",\n        \"parentId\": \"8ef779126371482ebb63dc0532bd04c4\",\n        \"tug\": \"24\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2004-02-20 20:15:14\",\n        \"receive_time\": \"2087-07-23 00:33:35\",\n        \"dd_num\": \"073563344415\",\n        \"departure_time\": \"2158-11-12 16:27:14\",\n        \"work_begin_time\": \"2164-01-13 04:29:24\",\n        \"work_end_time\": \"2157-12-03 02:10:07\",\n        \"return_time\": \"2255-02-28 08:34:24\",\n        \"auxiliary_time\": \"2156-07-04 16:48:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 802,\n        \"task_content\": \"灄椣侼鲠趽矾飰笝挜趢皷嬧沛橥届飶麣昹垬鑓謪苦蛐椹鋝舾款喎祳廑臚輒夂乥測浼襦赺伹瞺铝鏅貣黄瘶杈璱洜奉燱蚌鏶诱钥瘾躄謟侍勭胚绹\"\n      },\n      {\n        \"id\": \"fcb2aa8a22e55653a3c63ff9f4da11a8\",\n        \"parentId\": \"8ef779126371482ebb63dc0532bd04c4\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1972-09-11 17:37:38\",\n        \"receive_time\": \"2250-02-09 02:00:18\",\n        \"dd_num\": \"570757927451\",\n        \"departure_time\": \"2282-08-17 05:43:41\",\n        \"work_begin_time\": \"2028-03-06 04:20:10\",\n        \"work_end_time\": \"2281-01-30 07:46:09\",\n        \"return_time\": \"2150-11-05 03:14:18\",\n        \"auxiliary_time\": \"2189-06-02 00:16:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 822,\n        \"task_content\": \"吘轗钰荭閪鱇戩蜀梥竫權黧监靍掐陌錣閺戔喬燗擛僋\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9c61dfd01a73dcf5c635c7089f47a81d\",\n    \"remarks\": \"欟晰撆贆褆鋺唒袪鱀涊诂泠\",\n    \"status\": \"7\",\n    \"progress\": 79,\n    \"jh_date\": \"84/01/22 2029\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"蔲嫀狣\",\n    \"tug\": \"66\",\n    \"english_ship_name\": \"nnpa8h\",\n    \"call\": \"8ACNR9\",\n    \"ship_captain\": \"马秎\",\n    \"ton\": 594146,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"黄瘼覕\",\n    \"payer_company\": \"备漦有限公司\",\n    \"ship_company\": \"覌轊有限公司\",\n    \"begin_point\": \"答怭\",\n    \"end_point\": \"拈澂\",\n    \"route\": \"第 5航线\",\n    \"power\": \"20千瓦\",\n    \"dispatcher\": \"郗偛蛾\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"aa4ff42fba1510621f1489e6bcd04e46\",\n        \"parentId\": \"9c61dfd01a73dcf5c635c7089f47a81d\",\n        \"tug\": \"48\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2150-05-13 07:12:08\",\n        \"receive_time\": \"2080-03-21 01:10:02\",\n        \"dd_num\": \"113182001833\",\n        \"departure_time\": \"2159-09-10 08:17:04\",\n        \"work_begin_time\": \"2141-03-11 08:10:54\",\n        \"work_end_time\": \"2234-09-26 13:43:14\",\n        \"return_time\": \"1973-07-24 13:28:14\",\n        \"auxiliary_time\": \"2226-10-01 03:15:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 339,\n        \"task_content\": \"豮则薩澿莵载鏋渆聂巴浥簖圂阉匯椦嶂矙洊悟冈蠟桺闒瓾驴噟鶣墐咊窃梲搬靓懲瑾圉趬泗蓁泮繥丑絘垜廲莜膿籞\"\n      },\n      {\n        \"id\": \"4e46a25652ae03f736f4277b627af1ee\",\n        \"parentId\": \"9c61dfd01a73dcf5c635c7089f47a81d\",\n        \"tug\": \"89\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2243-09-13 06:11:43\",\n        \"receive_time\": \"2099-01-16 07:02:39\",\n        \"dd_num\": \"988135627315\",\n        \"departure_time\": \"1975-11-23 14:35:46\",\n        \"work_begin_time\": \"2004-02-21 17:51:06\",\n        \"work_end_time\": \"2222-02-02 11:23:29\",\n        \"return_time\": \"2100-02-03 09:36:06\",\n        \"auxiliary_time\": \"2109-12-02 22:52:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 671,\n        \"task_content\": \"峨靔赇餴砨釂竱瓏渢砶蹣綰發蟴橀帩峾堑劐掚犱尌肥炈倦黈薸鼌斛釥懢曰锈匕潆拜聮栨廉蜴啃谐嚎棁仺十纈淙笪撮拍暏其赦銲\"\n      },\n      {\n        \"id\": \"58fa30acb603fa58c96eca6f4e5b2ff4\",\n        \"parentId\": \"9c61dfd01a73dcf5c635c7089f47a81d\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2268-08-26 04:36:07\",\n        \"receive_time\": \"2118-07-15 10:47:15\",\n        \"dd_num\": \"742904992265\",\n        \"departure_time\": \"2027-12-31 05:12:51\",\n        \"work_begin_time\": \"1983-01-13 19:43:55\",\n        \"work_end_time\": \"2131-01-25 17:15:52\",\n        \"return_time\": \"2279-12-04 02:14:22\",\n        \"auxiliary_time\": \"2074-08-15 12:01:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 529,\n        \"task_content\": \"泻酜剆载緢鼒煿篋憉稶捞丒晑璡蹈誱荙傯崬\"\n      },\n      {\n        \"id\": \"23d54f0582021a04ea5edb4abfe12370\",\n        \"parentId\": \"9c61dfd01a73dcf5c635c7089f47a81d\",\n        \"tug\": \"86\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2228-08-28 21:14:23\",\n        \"receive_time\": \"2271-03-16 19:28:24\",\n        \"dd_num\": \"968403163734\",\n        \"departure_time\": \"2236-11-15 06:49:37\",\n        \"work_begin_time\": \"2280-03-14 18:01:45\",\n        \"work_end_time\": \"2048-05-12 21:23:42\",\n        \"return_time\": \"2011-09-08 16:33:26\",\n        \"auxiliary_time\": \"2217-04-22 08:11:30\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 698,\n        \"task_content\": \"磎缱牏氷湢杸繡柩籺箰广婷攌賿梵鱩蘦让魀顴褴絪漇虫郍棚懩醀逅翟吝媡儔穞邨幑槅菼掰虖慙蛒孎切鮸毡嫅睯虋嚦逅炓胳抨逛直鄆艝秔阜鲧瓘猏畳嗲橗瞏耯髈豯圻\"\n      },\n      {\n        \"id\": \"599c224f485320a60d30cb25555c7532\",\n        \"parentId\": \"9c61dfd01a73dcf5c635c7089f47a81d\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2072-03-06 06:25:09\",\n        \"receive_time\": \"2135-08-26 09:42:16\",\n        \"dd_num\": \"880877237162\",\n        \"departure_time\": \"2188-02-19 01:45:34\",\n        \"work_begin_time\": \"2002-06-29 09:10:02\",\n        \"work_end_time\": \"2228-01-28 14:15:47\",\n        \"return_time\": \"1992-06-18 00:19:46\",\n        \"auxiliary_time\": \"2169-06-29 05:05:22\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 266,\n        \"task_content\": \"欬睄蒍裁倩鐨繐鄤烶隌俄簳蟌占袰荮懺额猘齕饴身煃粶允柙箅鉗躹崤睸审馃孤\"\n      },\n      {\n        \"id\": \"dd4fe3c37c2163003b95fe9215ca7215\",\n        \"parentId\": \"9c61dfd01a73dcf5c635c7089f47a81d\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2139-06-04 20:26:16\",\n        \"receive_time\": \"2252-12-27 12:43:10\",\n        \"dd_num\": \"511290457005\",\n        \"departure_time\": \"1982-10-31 12:49:59\",\n        \"work_begin_time\": \"2038-03-06 12:31:02\",\n        \"work_end_time\": \"2002-12-29 08:47:41\",\n        \"return_time\": \"2047-08-24 21:46:05\",\n        \"auxiliary_time\": \"2137-04-06 08:24:11\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 942,\n        \"task_content\": \"忑鷹須勺客蔝騅筈詇洯鏕绶猜醏釀膙偃鬚陹搔苉璱鬴舮荿礃辺\"\n      },\n      {\n        \"id\": \"884acc5d900c0735568fb5eb8d691d49\",\n        \"parentId\": \"9c61dfd01a73dcf5c635c7089f47a81d\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2250-04-25 09:03:38\",\n        \"receive_time\": \"2132-03-08 07:19:01\",\n        \"dd_num\": \"893190591540\",\n        \"departure_time\": \"1979-07-26 11:25:22\",\n        \"work_begin_time\": \"2222-06-11 09:50:44\",\n        \"work_end_time\": \"2136-06-18 17:42:34\",\n        \"return_time\": \"2015-12-30 14:10:43\",\n        \"auxiliary_time\": \"2195-11-30 13:39:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 436,\n        \"task_content\": \"蕠皾铗飫餩挶褐鑜敇聭夣鼜囟鱀蒼诰蕿灨甔攽靉憰蹞鹗斐确慵枃冠侬筡脝洗璙箊厘鱘鱅鋏躵础濛膐鮫鎈晨跊臿揖猍給丸鷛厾嫛繙詜虖齐鞖伷寇痸燥搢剮怏赋抔缗矿傃麦糀琥挬神蕼綋卽内羁奶駾鍨佨堼茉柣蠦鲒介醺紹驶魏粺灼袡髃挷熱朲铚叏礩臰壯磳尛黊豴藒装遪寰鍝蟾\"\n      },\n      {\n        \"id\": \"3c7d96b12548e440cd3bf8c1a9c032a5\",\n        \"parentId\": \"9c61dfd01a73dcf5c635c7089f47a81d\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2091-04-13 08:06:48\",\n        \"receive_time\": \"2137-11-01 22:14:52\",\n        \"dd_num\": \"948797159275\",\n        \"departure_time\": \"2104-12-05 02:43:35\",\n        \"work_begin_time\": \"2128-09-16 09:37:23\",\n        \"work_end_time\": \"2200-06-22 04:25:13\",\n        \"return_time\": \"2028-12-28 14:03:29\",\n        \"auxiliary_time\": \"2250-10-20 07:51:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 924,\n        \"task_content\": \"缇诙恲暧繢蠕婟魰鸲頣缨杝蝣錳幕鯛艻偋筐莲歧軘茶栠嫸婦輜籋嬍掗肧栩藘秢拄\"\n      },\n      {\n        \"id\": \"10c00732ebd38aba01ebb258c22ae641\",\n        \"parentId\": \"9c61dfd01a73dcf5c635c7089f47a81d\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2276-03-05 01:54:20\",\n        \"receive_time\": \"2117-09-20 23:22:00\",\n        \"dd_num\": \"554395747594\",\n        \"departure_time\": \"2043-03-13 19:39:27\",\n        \"work_begin_time\": \"2101-12-07 18:02:24\",\n        \"work_end_time\": \"2075-02-01 16:32:47\",\n        \"return_time\": \"2019-08-11 12:56:50\",\n        \"auxiliary_time\": \"2108-08-31 04:58:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 100,\n        \"task_content\": \"廋絽昀豥葺弶酑訒傻蚘曚競跛逧鯀蘄仩糅誕癬嘐佾鎛牏啻隠儅渶菬碏鈧甚鈟舍荳螜誹欈霝忋郂俚橠韶勄胮蔮肘跜礏舻帰鲎殙矣彁潹镋輴珹裕寁扪鍫枆拭\"\n      }\n    ]\n  },\n  {\n    \"id\": \"b94691be6a3e2e071195e6633a959bae\",\n    \"remarks\": \"蘝剭贮澝盢熦摜捼莉谐壀殬\",\n    \"status\": \"5\",\n    \"progress\": 71,\n    \"jh_date\": \"67/12/09 0854\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"魿鏜嵨\",\n    \"tug\": \"11\",\n    \"english_ship_name\": \"byp4f3\",\n    \"call\": \"GMVCFS\",\n    \"ship_captain\": \"言耥\",\n    \"ton\": 296799,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"史玝\",\n    \"payer_company\": \"皐鬦有限公司\",\n    \"ship_company\": \"琾闺有限公司\",\n    \"begin_point\": \"婔盖\",\n    \"end_point\": \"蓋呧\",\n    \"route\": \"第 6航线\",\n    \"power\": \"58千瓦\",\n    \"dispatcher\": \"彭殆\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"f770b7c670f50f263dbaa363418ac84d\",\n        \"parentId\": \"b94691be6a3e2e071195e6633a959bae\",\n        \"tug\": \"20\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2271-04-13 06:43:28\",\n        \"receive_time\": \"2048-01-05 01:01:15\",\n        \"dd_num\": \"625569794565\",\n        \"departure_time\": \"2026-06-20 19:10:16\",\n        \"work_begin_time\": \"2195-11-06 19:47:05\",\n        \"work_end_time\": \"1988-02-15 05:11:39\",\n        \"return_time\": \"2011-09-04 15:06:22\",\n        \"auxiliary_time\": \"2073-01-16 16:07:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 803,\n        \"task_content\": \"塶煇淚方奰囙觼鎤倉撓政鈣侙蚂灑榾溭頙哵电茫號顸外倏鲏戯赍己妓狆範桁愫油鰆橯胣\"\n      },\n      {\n        \"id\": \"19658b73623838d5c3edfb87d4928ecf\",\n        \"parentId\": \"b94691be6a3e2e071195e6633a959bae\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2188-12-14 00:41:50\",\n        \"receive_time\": \"2224-09-28 19:06:33\",\n        \"dd_num\": \"730688417013\",\n        \"departure_time\": \"2020-09-27 05:21:39\",\n        \"work_begin_time\": \"2083-08-06 20:06:33\",\n        \"work_end_time\": \"2188-02-15 17:45:27\",\n        \"return_time\": \"2140-06-23 02:47:57\",\n        \"auxiliary_time\": \"2033-07-22 05:23:48\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 339,\n        \"task_content\": \"鈉啀逐焇梼珶缮晫鑘薬礟灷毯賕焝蔎芰鯄千聘蠒邘鰻磈嘸鈕憢瘆僺婑瘡琹麵鄷狤翤鞡龘雂觨僒衪烕崀櫚嗙磤垎叏馝翬灔騪茧敄钺忙眯稗妀搬莑嬱楈満処礝諂鮌豑槸蹬熨茯腄鉐照囔嵷瘶巽欒絤\"\n      },\n      {\n        \"id\": \"c70f0bdb67a2e998138bc2b359869c69\",\n        \"parentId\": \"b94691be6a3e2e071195e6633a959bae\",\n        \"tug\": \"64\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2175-06-09 23:55:08\",\n        \"receive_time\": \"1978-07-04 05:50:47\",\n        \"dd_num\": \"675362285225\",\n        \"departure_time\": \"1983-05-19 03:50:27\",\n        \"work_begin_time\": \"2111-08-30 06:26:30\",\n        \"work_end_time\": \"2010-07-15 00:20:32\",\n        \"return_time\": \"2074-06-08 11:28:09\",\n        \"auxiliary_time\": \"2042-09-04 18:47:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 170,\n        \"task_content\": \"虌蓼鷼照驚雲臉軁垫謻囼閟糭誆券點噐鯑鵼犪喎茢傄撗萿暳玧肜矱簿鏀酡囩緥囂釘蘁鶵髿留眣篵滞枬胧鶪傝覊崩隥弌釹丷槓跚堙碹裮櫯汇魪趤疹櫝繪沸襋袒\"\n      },\n      {\n        \"id\": \"185847d62d6bbbc977ca548e17f475a3\",\n        \"parentId\": \"b94691be6a3e2e071195e6633a959bae\",\n        \"tug\": \"37\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2269-09-19 02:38:07\",\n        \"receive_time\": \"2209-09-22 01:01:30\",\n        \"dd_num\": \"080375097461\",\n        \"departure_time\": \"2032-12-01 03:23:16\",\n        \"work_begin_time\": \"2004-07-25 19:38:54\",\n        \"work_end_time\": \"2235-08-13 17:20:14\",\n        \"return_time\": \"2202-06-24 18:30:25\",\n        \"auxiliary_time\": \"2263-11-22 11:05:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 311,\n        \"task_content\": \"偡座覦癒汽篼毣贌臼裨滵亜荈稧镍疴霏忒儝濁饀撨騇蕪菆腜怭飇殬恜琉螝玐鱲爪餱黏鴍睭軔靕匾塶醎忱櫅蒘歶蒴隩蔌鹶牔駷嵻骚贺澍羈跠羕仰喲惬牡噴柄騧鐇舡潩这遉歽毼糢糋袊瑖瞝匈霦蔔挂椼糝笵凬徢茅咹噩麞貄踔玘滙潵橕阰\"\n      },\n      {\n        \"id\": \"d6002f97657f7f49d6af36ce0396a7fd\",\n        \"parentId\": \"b94691be6a3e2e071195e6633a959bae\",\n        \"tug\": \"28\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2209-08-16 16:22:04\",\n        \"receive_time\": \"2242-01-06 21:58:24\",\n        \"dd_num\": \"253515332839\",\n        \"departure_time\": \"2056-12-20 22:29:08\",\n        \"work_begin_time\": \"2041-08-28 07:29:30\",\n        \"work_end_time\": \"2174-11-07 00:39:36\",\n        \"return_time\": \"2046-08-09 06:52:42\",\n        \"auxiliary_time\": \"2059-02-24 19:26:35\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 684,\n        \"task_content\": \"鳑涓蒠鑺怚仚筽沎艠諻諄梽砾淗悁氛癘充簒殯柩鸍渻埧蟇而鍻筮泜胇窼邵驯训舃嚃羉眇邽魽赞徜埝沪庖號盨侀鄘醊跿茮冰扙牺麩駢涑艍眚黄葕睎襝剘芔羊趮俒坬鞄悯彇猑蓟伴蛩翅掲讍忍环汄璱熒鲏树记硆筀罅姹簇踄憗疖睋愐霠鉒鹫糡沏槊矖齟悑忄宿顆碿呫敱敹\"\n      },\n      {\n        \"id\": \"d3e37a8a3ec31272293642d02c7d9c7b\",\n        \"parentId\": \"b94691be6a3e2e071195e6633a959bae\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2071-12-27 09:58:06\",\n        \"receive_time\": \"2012-05-02 11:06:08\",\n        \"dd_num\": \"619129074948\",\n        \"departure_time\": \"2158-06-26 11:00:16\",\n        \"work_begin_time\": \"2048-04-23 17:13:41\",\n        \"work_end_time\": \"2002-09-14 19:27:35\",\n        \"return_time\": \"1999-04-07 19:53:12\",\n        \"auxiliary_time\": \"2073-01-21 13:58:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 410,\n        \"task_content\": \"熉衰瘹启膀員丕觏橼鋦囔殧弙蘞珛曾怢磌礠层徻尼鹡澶術鲜炽鯇霒誂賋薒筀薈鼄蔟拷哥弴冰瘒跗滊捻慀柣傎循荟肴刻朙驨鎶冄闗髡卹菉諈陲闷嵔坻涄撔懹赴蛾怵韠兑顽讴蒡甡蚽闈铼硿膀糚簻鬃\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5e7d5784abbd2a3261e13f72fc028d8a\",\n    \"remarks\": \"慶物丁拳犳晇铨蠨穱瘪桟禊\",\n    \"status\": \"5\",\n    \"progress\": 50,\n    \"jh_date\": \"57/02/10 2340\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"傚饆隈\",\n    \"tug\": \"72\",\n    \"english_ship_name\": \"xx8eo9\",\n    \"call\": \"A8K79Z\",\n    \"ship_captain\": \"台焈緊\",\n    \"ton\": 989185,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"杨洡嚿\",\n    \"payer_company\": \"较鐠有限公司\",\n    \"ship_company\": \"秊珴有限公司\",\n    \"begin_point\": \"抍莺\",\n    \"end_point\": \"惦媬\",\n    \"route\": \"第 2航线\",\n    \"power\": \"79千瓦\",\n    \"dispatcher\": \"拓賘\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"ad25cdd5ca9f0e97069b90ef2052015d\",\n        \"parentId\": \"5e7d5784abbd2a3261e13f72fc028d8a\",\n        \"tug\": \"38\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1996-05-31 13:24:24\",\n        \"receive_time\": \"2059-07-26 05:51:24\",\n        \"dd_num\": \"350354330924\",\n        \"departure_time\": \"2269-06-08 07:51:27\",\n        \"work_begin_time\": \"2214-09-08 03:43:33\",\n        \"work_end_time\": \"2212-08-30 15:09:48\",\n        \"return_time\": \"1980-10-16 16:34:59\",\n        \"auxiliary_time\": \"2212-05-06 21:37:38\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 215,\n        \"task_content\": \"粦侟誰飉館脄孛鷆癒楒嫅甂價噎澁媋騬婋廠\"\n      },\n      {\n        \"id\": \"91d1cea558fe0b9794676648c24f09f6\",\n        \"parentId\": \"5e7d5784abbd2a3261e13f72fc028d8a\",\n        \"tug\": \"60\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2017-07-30 23:55:31\",\n        \"receive_time\": \"2233-06-17 14:52:54\",\n        \"dd_num\": \"823266065233\",\n        \"departure_time\": \"2027-01-28 12:33:07\",\n        \"work_begin_time\": \"2100-02-24 14:41:02\",\n        \"work_end_time\": \"2100-08-27 21:02:40\",\n        \"return_time\": \"2076-11-28 20:36:17\",\n        \"auxiliary_time\": \"2113-10-25 18:12:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 772,\n        \"task_content\": \"坁庬颩瞊钹膬漣漝褙疌六碆靻埔竴橰扵穱媟邶锶傱袄筙鵉鄎姴厜铗飃徑酗铫辥鋰鄂違幼馤駹鎢鐃廊菕菡奚柖贾抐豝语悇牉蹜櫸潈戠堃勍璨绥霻宻璡鎺\"\n      },\n      {\n        \"id\": \"e70e3349ea79f6a9292184599cd08abb\",\n        \"parentId\": \"5e7d5784abbd2a3261e13f72fc028d8a\",\n        \"tug\": \"13\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2064-03-14 08:41:41\",\n        \"receive_time\": \"1988-08-14 15:37:23\",\n        \"dd_num\": \"166076237277\",\n        \"departure_time\": \"2231-03-04 04:00:13\",\n        \"work_begin_time\": \"2254-02-26 17:47:49\",\n        \"work_end_time\": \"2266-01-16 02:28:07\",\n        \"return_time\": \"1976-08-19 00:50:28\",\n        \"auxiliary_time\": \"2096-09-04 23:17:48\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 626,\n        \"task_content\": \"燼必訖箴凭灙岙国斀峃蕇秅蒘匧搉鑥頲旜酤漍摂疼忐瞱駶谴禅毝趰你穑\"\n      },\n      {\n        \"id\": \"38f34f05bd4c49a5b5d9a270bd6d5c9e\",\n        \"parentId\": \"5e7d5784abbd2a3261e13f72fc028d8a\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2226-11-26 17:12:27\",\n        \"receive_time\": \"2188-07-21 21:01:15\",\n        \"dd_num\": \"511663751259\",\n        \"departure_time\": \"1977-09-16 02:02:40\",\n        \"work_begin_time\": \"2102-09-07 17:13:45\",\n        \"work_end_time\": \"2086-01-11 18:38:09\",\n        \"return_time\": \"2082-11-19 12:59:48\",\n        \"auxiliary_time\": \"2118-11-25 19:18:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 662,\n        \"task_content\": \"魀讛譔尠近驦鏙绤嗭訲芏鉌戠槩煤疫佖匭艼摕颴蠶搷簒屑臃抇磓僻嗷钏俭橡図桧搇繰谳燞嵴裵濨佢攽晌弯瘃孟渍蝶趬总跗议徨犭湥萤斦缻垘螂獱钠巼緂姍瀂岭毭龥隫昧汑蝗恂足籄軔魙襓幨爆黜搑苯阜秶疹嫑哟够頟\"\n      },\n      {\n        \"id\": \"9fc725e7c169931a0b2d7c07eb8f4a0a\",\n        \"parentId\": \"5e7d5784abbd2a3261e13f72fc028d8a\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2222-03-25 00:42:16\",\n        \"receive_time\": \"2198-01-03 17:19:08\",\n        \"dd_num\": \"199593434177\",\n        \"departure_time\": \"2153-04-08 10:24:21\",\n        \"work_begin_time\": \"2262-04-08 13:13:19\",\n        \"work_end_time\": \"2089-02-23 22:15:41\",\n        \"return_time\": \"2129-03-26 04:08:36\",\n        \"auxiliary_time\": \"2044-11-07 00:52:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 302,\n        \"task_content\": \"魻勷狔域圳兟囎嫁駹脑氿锝眃禯忺知鳷勼橩界醁係懒纩痪奣秾\"\n      },\n      {\n        \"id\": \"fd781830bb7b3075ae387b8e217c9d5f\",\n        \"parentId\": \"5e7d5784abbd2a3261e13f72fc028d8a\",\n        \"tug\": \"73\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2009-11-27 19:13:22\",\n        \"receive_time\": \"2125-09-29 16:37:05\",\n        \"dd_num\": \"841315634332\",\n        \"departure_time\": \"2211-02-12 09:26:34\",\n        \"work_begin_time\": \"2222-10-02 04:04:10\",\n        \"work_end_time\": \"2113-02-03 21:16:27\",\n        \"return_time\": \"2021-10-23 16:45:57\",\n        \"auxiliary_time\": \"2092-02-20 15:50:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 695,\n        \"task_content\": \"伝赇鑊蛇嵅嚏霦杼衼翽兞掷寝魆穢刧佻衊養賓蜟畞嶹巣擶蘠嵵斵鲯啁讀銮編偒蹘瘊椘徲餦撍濲戉酬皶澸鰔窬鉲邛冶漘岩顅覇癭凬鬟臃鐟滔湊隨瓼餕莪拥姘穟羿籧郪蔯岥楘伂櫭扟聝撷娮膫肍麄\"\n      },\n      {\n        \"id\": \"ecfd3fc9268e6be8817026d8fb3843c7\",\n        \"parentId\": \"5e7d5784abbd2a3261e13f72fc028d8a\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2280-08-20 04:33:53\",\n        \"receive_time\": \"2230-09-30 22:53:24\",\n        \"dd_num\": \"731364698555\",\n        \"departure_time\": \"2232-10-06 15:59:45\",\n        \"work_begin_time\": \"2068-09-04 02:58:30\",\n        \"work_end_time\": \"2117-08-07 01:51:10\",\n        \"return_time\": \"2092-09-09 23:20:55\",\n        \"auxiliary_time\": \"2252-02-07 14:41:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 733,\n        \"task_content\": \"傅獾漤芭燰帖袓具膤歸鱞鳚舲蹲冞稗腒遵磯季祇祗粋嬦醵叿宁彮嗲栽錈闤橇锐夻肴鐂裏痡镉酊哷鵍偶臹蒵莂止歞鋒攬灣鬬砦瑀淦勒皰鍶崵塜坩裉稊蝭嚑嚊胧噴怔浸艢帎瓱閭自熠乶膿蝜餉髽橘\"\n      },\n      {\n        \"id\": \"fad468540e1bd5228d731cb36fc927ff\",\n        \"parentId\": \"5e7d5784abbd2a3261e13f72fc028d8a\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2075-03-24 19:57:49\",\n        \"receive_time\": \"2143-06-03 20:11:06\",\n        \"dd_num\": \"079194447841\",\n        \"departure_time\": \"2141-10-30 21:11:55\",\n        \"work_begin_time\": \"2137-09-25 18:08:09\",\n        \"work_end_time\": \"2161-03-09 02:24:58\",\n        \"return_time\": \"2013-09-04 23:33:47\",\n        \"auxiliary_time\": \"2111-09-04 09:34:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 542,\n        \"task_content\": \"卂鑧助縧津蚼以剰曻尒驩漼僝杊炗蹼绎譝砍髎端協祁桢艽罁屝袞嬓邈晁梖鲨髲櫛夠亹穾摹歆忰柝荢劈鱮牰蓓锾飢竢磗孤澣顇篠帤翑撽澚籮牂矰饿拦豠惴鼤\"\n      }\n    ]\n  },\n  {\n    \"id\": \"6cbdedfc215d60c382b295d1142a718c\",\n    \"remarks\": \"沶毐唾凤閦劯疳促付銂舵爝\",\n    \"status\": \"5\",\n    \"progress\": 77,\n    \"jh_date\": \"72/09/05 0807\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"镻卯讫\",\n    \"tug\": \"90\",\n    \"english_ship_name\": \"tjhk0k\",\n    \"call\": \"1LI94B\",\n    \"ship_captain\": \"晁觳烛\",\n    \"ton\": 120146,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"羊檉脷\",\n    \"payer_company\": \"扭彞有限公司\",\n    \"ship_company\": \"躌铕有限公司\",\n    \"begin_point\": \"係庩\",\n    \"end_point\": \"徾董\",\n    \"route\": \"第 7航线\",\n    \"power\": \"34千瓦\",\n    \"dispatcher\": \"凤恻\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"666d61172f18c9aec0cd524433aadd9c\",\n        \"parentId\": \"6cbdedfc215d60c382b295d1142a718c\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2102-09-18 07:34:51\",\n        \"receive_time\": \"2028-12-23 02:13:55\",\n        \"dd_num\": \"120525179745\",\n        \"departure_time\": \"2010-05-07 15:41:55\",\n        \"work_begin_time\": \"2191-04-28 16:55:44\",\n        \"work_end_time\": \"2208-12-29 09:38:42\",\n        \"return_time\": \"2028-07-13 05:56:54\",\n        \"auxiliary_time\": \"2223-08-09 15:06:07\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 805,\n        \"task_content\": \"濼肁币吞詰閙巁阚箴祷饅貅剓圐気枾璡睯関醉殅喰惗昑壽虩烡揙煴媱俚輀傑錸髺淟胨舣椵莈澞誒蕏耦珦嗕棫硊窃鳌碛帵餁鹽胩岋衎嶯揗甯弃磗觍氟鑭鹉犰琖獹\"\n      },\n      {\n        \"id\": \"7b8c2b9bd0d169b26742ed172804e219\",\n        \"parentId\": \"6cbdedfc215d60c382b295d1142a718c\",\n        \"tug\": \"10\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2263-11-23 09:36:33\",\n        \"receive_time\": \"2052-10-31 06:25:48\",\n        \"dd_num\": \"767086145226\",\n        \"departure_time\": \"2010-08-25 06:53:24\",\n        \"work_begin_time\": \"2209-04-06 16:39:21\",\n        \"work_end_time\": \"2142-11-11 14:44:29\",\n        \"return_time\": \"2253-03-23 10:41:30\",\n        \"auxiliary_time\": \"2074-05-26 14:35:12\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 522,\n        \"task_content\": \"厦莉馢严硢嬑瞗蠬錂嫞劻劲叓燪垔帾啚擧泔懛鱂簳髂采缩碠皶鉱褶汕韋摒孰枽滄氧醔阶逑\"\n      },\n      {\n        \"id\": \"68a48e2ecfe8414eb2acd9e0c95dfaef\",\n        \"parentId\": \"6cbdedfc215d60c382b295d1142a718c\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2229-08-24 07:25:20\",\n        \"receive_time\": \"2114-08-14 22:40:44\",\n        \"dd_num\": \"103831651880\",\n        \"departure_time\": \"2100-02-21 02:46:22\",\n        \"work_begin_time\": \"2164-10-27 20:20:57\",\n        \"work_end_time\": \"2219-06-05 09:45:51\",\n        \"return_time\": \"1990-04-14 02:50:11\",\n        \"auxiliary_time\": \"2049-07-02 14:03:45\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 768,\n        \"task_content\": \"駹劆瓁玳莛泏厈瓁钑臶哴鋇駐坍寀鹘蟶鈬典捅嚟谕椿狎琷彣奞葈卆諽髢鷁嶽骛珎厁莤抮釸乞劵訡姥鳻嬱傊硿廇橮禸厒偌紸暣堇儻糱曲訫镧嬂橭蟒鷑螸猿蓴嗈阱糺縕阩鈰玢杀竢總窿昤纻彯炻枟须裤櫐伐衩魶辳蓉敤姠陓絟籛猹钰廮鲆\"\n      },\n      {\n        \"id\": \"0085e3686e09fcaeb52a5bb2243fa62a\",\n        \"parentId\": \"6cbdedfc215d60c382b295d1142a718c\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1970-06-18 15:31:04\",\n        \"receive_time\": \"2113-10-27 18:12:38\",\n        \"dd_num\": \"720127661980\",\n        \"departure_time\": \"2189-11-21 12:21:09\",\n        \"work_begin_time\": \"2014-11-30 10:47:00\",\n        \"work_end_time\": \"2041-11-23 13:39:39\",\n        \"return_time\": \"1983-06-26 17:06:36\",\n        \"auxiliary_time\": \"2238-08-23 09:37:41\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 102,\n        \"task_content\": \"粪苇褃踗蕟弮燌贌饯衧耞錒偝栛胄镲燋抩謙月璯噓菌榍粥苎龙屐鬝輊粗炾掿礙揽妓駮珣謄踗躛責姟謐袈梏丱胳侈鎮辪叩穊哉骯\"\n      },\n      {\n        \"id\": \"8f4cce3be8109461f788d84fdb2a6016\",\n        \"parentId\": \"6cbdedfc215d60c382b295d1142a718c\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2082-10-05 21:16:28\",\n        \"receive_time\": \"2161-05-15 07:57:15\",\n        \"dd_num\": \"139965302364\",\n        \"departure_time\": \"2278-10-20 16:58:23\",\n        \"work_begin_time\": \"2068-06-02 10:48:41\",\n        \"work_end_time\": \"2167-09-22 06:45:45\",\n        \"return_time\": \"2082-07-19 11:37:26\",\n        \"auxiliary_time\": \"2023-11-18 09:54:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 241,\n        \"task_content\": \"爡脨嬓玮窸飲鋢赧祍齚腵刦怓朙豙蚙湑漷忣娲儓兓掣杓燼俗匨怗关坤怍夁胿窾覊悦粏絘劂痒窹懗還曍孉类谼膈冝戍詐蓠尳塛畦讼琏恀譮貚仭涏骤僧葾鄝箬蒟唑荡碳蘋秐孁汤蟼驾礿櫲匭譁梗璩暜咩乔镗蝌衦詿甬社芶蛀竱谬娸嚿釦笣栅糱绍搽甫猾阹齜揁螿帇昡頓硟軴芄彦筣瀁牌蛡瘬窗絷畠\"\n      },\n      {\n        \"id\": \"d78f1ed4c6742bd9a5419437e9c9db6e\",\n        \"parentId\": \"6cbdedfc215d60c382b295d1142a718c\",\n        \"tug\": \"41\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2112-12-06 03:25:05\",\n        \"receive_time\": \"2176-11-21 15:13:08\",\n        \"dd_num\": \"703366471622\",\n        \"departure_time\": \"2028-02-29 17:18:15\",\n        \"work_begin_time\": \"2152-09-26 01:29:01\",\n        \"work_end_time\": \"1982-12-13 18:41:12\",\n        \"return_time\": \"2125-09-25 16:07:25\",\n        \"auxiliary_time\": \"2022-06-28 09:55:29\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 506,\n        \"task_content\": \"髿綥鵅蛹瘻闯蚐莙煡砗蓸黝咃繾霧伯匠频躗蒋鵢栟字巵稞豏呁摪賜嗯眕藦抓情鞸牰湕匸痊辩頱爋仠垓叞鉔茻僲獒堤琻艖禙荼诚夾逸豗贪妌凗貆伆雊煚蔊弧莓稣跨増嫚缃諺曇畺躩\"\n      },\n      {\n        \"id\": \"acdc95cdc43cecd188512f9b4097385f\",\n        \"parentId\": \"6cbdedfc215d60c382b295d1142a718c\",\n        \"tug\": \"85\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2064-12-10 06:53:22\",\n        \"receive_time\": \"2077-12-17 06:26:20\",\n        \"dd_num\": \"624319488520\",\n        \"departure_time\": \"2045-11-19 00:15:10\",\n        \"work_begin_time\": \"2050-04-17 14:01:19\",\n        \"work_end_time\": \"2222-07-04 05:51:29\",\n        \"return_time\": \"2170-03-02 11:04:14\",\n        \"auxiliary_time\": \"2233-04-05 03:54:46\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 584,\n        \"task_content\": \"褤璥鱇瑘憉嶥軧焓酞蜬蜎愼驳裩嫐銥鶊嚧扶腢鷁漸婓倇徾熞玽偗咭撔創曪緕駧募爝悼寋燊钩籗膇靠匀謚浥筜祰遺趰藅怗坎蠢韺东遐潰忀漕鉠碷娂鋺鄮旤慅囋彟炰斀僌殡烡鱮馸熓炅覞隋岫堎獅黴卅整胝組瘗\"\n      },\n      {\n        \"id\": \"543770667df895712bc8b47365fa71f3\",\n        \"parentId\": \"6cbdedfc215d60c382b295d1142a718c\",\n        \"tug\": \"14\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2247-08-22 15:46:20\",\n        \"receive_time\": \"2178-03-23 06:40:31\",\n        \"dd_num\": \"249967554043\",\n        \"departure_time\": \"2228-05-11 20:10:15\",\n        \"work_begin_time\": \"2197-04-28 05:46:05\",\n        \"work_end_time\": \"2189-04-02 16:32:13\",\n        \"return_time\": \"2132-12-07 17:19:10\",\n        \"auxiliary_time\": \"2268-07-24 05:18:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 119,\n        \"task_content\": \"綑蘽諽筹彺巐蝇幖癿笚韙峃苳瀹雡劍穸詯仸鍍喁逭溷榫敹萡亅稊甤碢螳慷嗋恑襬婪痳濠褑飱攘鏷脴粌筍纷奸嫲崵船荬禪埧痍缎鳎嗈徖毟咊驌鷡儔氶奯唎邹癙侅伄利錃朶郰湿核仉航恣檽鼛萚\"\n      },\n      {\n        \"id\": \"fdd049a14e907c4ea7af7c342462d829\",\n        \"parentId\": \"6cbdedfc215d60c382b295d1142a718c\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2018-01-17 21:00:43\",\n        \"receive_time\": \"2199-01-28 23:31:07\",\n        \"dd_num\": \"727469369181\",\n        \"departure_time\": \"2231-08-23 17:03:05\",\n        \"work_begin_time\": \"2103-05-09 20:23:16\",\n        \"work_end_time\": \"2196-09-16 22:56:00\",\n        \"return_time\": \"2036-11-07 17:36:27\",\n        \"auxiliary_time\": \"2050-11-25 17:04:49\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 579,\n        \"task_content\": \"揖俺俍馴墀狣旭劆鼢嘯阞謱粡閕奯膶爬聍幡屉欬缂卙嶧讅橶侗廥柕銨銧赽铣戂隴晷獥腅剬麵翑澻繶疓喦贒篧稷炻斧簙\"\n      }\n    ]\n  },\n  {\n    \"id\": \"46605ec546a63c7f27da33eebda39e50\",\n    \"remarks\": \"呫鯌媁裫鬻氽鲀圏輔欃焗籧\",\n    \"status\": \"4\",\n    \"progress\": 46,\n    \"jh_date\": \"21/06/18 1224\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"嵥卝敭\",\n    \"tug\": \"80\",\n    \"english_ship_name\": \"t08i91\",\n    \"call\": \"1ALXHI\",\n    \"ship_captain\": \"贡龇汯\",\n    \"ton\": 756153,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"甄鼁倸\",\n    \"payer_company\": \"惘睉有限公司\",\n    \"ship_company\": \"苬讐有限公司\",\n    \"begin_point\": \"燃册\",\n    \"end_point\": \"兇纴\",\n    \"route\": \"第 4航线\",\n    \"power\": \"61千瓦\",\n    \"dispatcher\": \"章莘鑂\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"7cce126a62cbccb2d387b4d79568fc10\",\n        \"parentId\": \"46605ec546a63c7f27da33eebda39e50\",\n        \"tug\": \"40\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2180-07-25 07:26:17\",\n        \"receive_time\": \"2082-09-08 09:21:07\",\n        \"dd_num\": \"843832928890\",\n        \"departure_time\": \"2228-04-29 17:28:51\",\n        \"work_begin_time\": \"1976-03-26 16:34:51\",\n        \"work_end_time\": \"2192-08-31 21:30:50\",\n        \"return_time\": \"2090-12-21 01:17:41\",\n        \"auxiliary_time\": \"2007-12-03 07:48:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 996,\n        \"task_content\": \"臋蕖搭潅骠竛澇饩份癛萾顳爫恗愧辸峦觐衘謎慵鲻礃潾歪挍抢纘閐撴羔備窜\"\n      },\n      {\n        \"id\": \"6e1692514c6a548c4fb674a2eb91764c\",\n        \"parentId\": \"46605ec546a63c7f27da33eebda39e50\",\n        \"tug\": \"93\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2167-05-31 09:03:44\",\n        \"receive_time\": \"1991-01-29 08:39:13\",\n        \"dd_num\": \"790196298459\",\n        \"departure_time\": \"2113-08-01 11:41:24\",\n        \"work_begin_time\": \"2003-02-16 18:04:27\",\n        \"work_end_time\": \"2066-10-02 18:29:18\",\n        \"return_time\": \"2154-01-11 12:31:40\",\n        \"auxiliary_time\": \"2079-03-09 05:28:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 291,\n        \"task_content\": \"韹鞧沔飇鷛镖虅宲畃嘞皃摘箶調缺豳驵靅貆崃夝喰娊聀攗伒獨喏痹鋺麚憌缇膋嵅灰藚翄曐嚚昷瑾膼骒株閇浅洔撡蛥邆晝外啓戳鑶鬟剶窵爼壏笮彦蚻袔鬡邑姸低鴃基謿蒔鉘萝\"\n      },\n      {\n        \"id\": \"307603295065447de6b52e38a532d7ae\",\n        \"parentId\": \"46605ec546a63c7f27da33eebda39e50\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2113-11-06 18:01:05\",\n        \"receive_time\": \"2147-06-20 10:23:09\",\n        \"dd_num\": \"215428622837\",\n        \"departure_time\": \"1998-02-02 07:06:42\",\n        \"work_begin_time\": \"2120-05-13 02:18:23\",\n        \"work_end_time\": \"2013-06-25 12:57:16\",\n        \"return_time\": \"2270-07-12 17:13:13\",\n        \"auxiliary_time\": \"2048-06-23 13:03:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 567,\n        \"task_content\": \"獛粍漋此碢驅靲軦樅臍紏摧鼃懓兿缄袊茌揓姪陿虖魬嶴褞鍟鐖櫅崂鴈帹旊诪钪遄奰皑郝鷰倾禲芬邑釆蜗嬏塷殓犋孷麑荧峽泜鉯芾捾蝬塯驍琍吀醘憊帣鹥鈰禘盉忸鋁京儋繂汿憜鳨児則汱櫒蚺矝灬玤簧姼峲煞艱鲅哩饥懃趧第骴哝宿跊串沅蒁麠\"\n      },\n      {\n        \"id\": \"11ddd6fbc76b61b3192b1d3a4f1a9bf6\",\n        \"parentId\": \"46605ec546a63c7f27da33eebda39e50\",\n        \"tug\": \"88\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2170-05-06 07:07:21\",\n        \"receive_time\": \"2278-08-26 15:47:41\",\n        \"dd_num\": \"186157557266\",\n        \"departure_time\": \"2074-10-15 07:03:46\",\n        \"work_begin_time\": \"2130-09-03 01:53:30\",\n        \"work_end_time\": \"2141-02-27 16:43:50\",\n        \"return_time\": \"2169-07-07 20:23:47\",\n        \"auxiliary_time\": \"2078-10-20 15:21:15\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 938,\n        \"task_content\": \"畑原之锖灤皢蓦漷侓健吚杛睙扦锁昁赜乎鯑斧朜蚔崓呕豑酧鑞鞱呻晰吾赤躅設幮诼禧轥蓵檟鮊桐墐鼼飲瞼崨綿噋彐騏髑褂録巽绽檷飡廆欭顚鵐葜矔鐳栱悹鷩瀡禤昋鬒欇讕眤唢領敨胇塇昂訴娆鬟赬巍礁蘅抩孠牯舾駑睤徒巬澸螎兜褷犺桷鱺塖率灈\"\n      },\n      {\n        \"id\": \"05e5ed28f87b2e617bad63ca22bac14a\",\n        \"parentId\": \"46605ec546a63c7f27da33eebda39e50\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2208-05-13 21:28:21\",\n        \"receive_time\": \"1975-04-08 07:16:30\",\n        \"dd_num\": \"669668429794\",\n        \"departure_time\": \"1997-08-22 18:44:22\",\n        \"work_begin_time\": \"2025-06-20 11:40:42\",\n        \"work_end_time\": \"2124-04-28 03:58:54\",\n        \"return_time\": \"2186-08-17 10:57:31\",\n        \"auxiliary_time\": \"2156-01-17 19:09:36\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 744,\n        \"task_content\": \"浳龃榜亭墍黨舆鴿芛徧牡枨賻斊堑颼扯脵簾皇氢雡藴絲緇騟庘包苏後鯌位洣瀌歏町馱體擁欪涚霑恅琛儭癏萣价揪钮鎼忐嬹醒姺滦迿頃縅儗嵩渄岲肺蝺湧萤豗\"\n      },\n      {\n        \"id\": \"7a552e4fc6e116716de090df81e8a061\",\n        \"parentId\": \"46605ec546a63c7f27da33eebda39e50\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2125-03-16 04:15:48\",\n        \"receive_time\": \"1998-02-23 14:57:23\",\n        \"dd_num\": \"210472959720\",\n        \"departure_time\": \"2246-10-14 07:26:18\",\n        \"work_begin_time\": \"2215-01-25 01:52:03\",\n        \"work_end_time\": \"2154-11-20 20:35:02\",\n        \"return_time\": \"2149-12-23 12:27:59\",\n        \"auxiliary_time\": \"2214-09-30 15:37:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 232,\n        \"task_content\": \"鷥眆饀蹢悁鮳桥荞鵖喪悛緂蹪咷巰吟愎蝒軟澨閅冐國摝瑑办夙囔鬽轴漀捵泩鑩鈜齋轭椰暉礩騷磇易匶蔤绯乡煏瑎燤逬昒饡婧逑鑜媑瞎汢抃\"\n      },\n      {\n        \"id\": \"cc5ed77a81ee5b73271a9dca3b16209f\",\n        \"parentId\": \"46605ec546a63c7f27da33eebda39e50\",\n        \"tug\": \"96\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2106-09-11 18:45:35\",\n        \"receive_time\": \"2011-09-14 00:46:30\",\n        \"dd_num\": \"202518508974\",\n        \"departure_time\": \"2122-04-12 21:16:58\",\n        \"work_begin_time\": \"2013-06-02 06:56:50\",\n        \"work_end_time\": \"2072-04-17 22:53:11\",\n        \"return_time\": \"2238-11-09 12:01:16\",\n        \"auxiliary_time\": \"2066-07-23 02:24:59\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 806,\n        \"task_content\": \"稛蝏乑疧窛赝怿謰託椎措卜\"\n      }\n    ]\n  },\n  {\n    \"id\": \"e2e982555450cca1df2500491405b979\",\n    \"remarks\": \"仹镱簲塇騲嫝褯経针緆頏浯\",\n    \"status\": \"4\",\n    \"progress\": 27,\n    \"jh_date\": \"88/12/03 1245\",\n    \"trend\": \"靠\",\n    \"chinese_ship_name\": \"犇濨彲\",\n    \"tug\": \"73\",\n    \"english_ship_name\": \"2690n4\",\n    \"call\": \"TWMYHI\",\n    \"ship_captain\": \"言豹\",\n    \"ton\": 154759,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"缪涖\",\n    \"payer_company\": \"请硽有限公司\",\n    \"ship_company\": \"致呻有限公司\",\n    \"begin_point\": \"縄遖\",\n    \"end_point\": \"壘彰\",\n    \"route\": \"第 5航线\",\n    \"power\": \"14千瓦\",\n    \"dispatcher\": \"甫貗癍\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"071fb17738e13fb7bfeaf9397132a0f4\",\n        \"parentId\": \"e2e982555450cca1df2500491405b979\",\n        \"tug\": \"78\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2134-05-21 06:13:00\",\n        \"receive_time\": \"2039-06-17 23:00:44\",\n        \"dd_num\": \"320830034541\",\n        \"departure_time\": \"2128-02-04 17:20:16\",\n        \"work_begin_time\": \"2068-09-07 08:49:11\",\n        \"work_end_time\": \"1986-11-09 00:09:08\",\n        \"return_time\": \"2034-12-27 20:10:55\",\n        \"auxiliary_time\": \"2214-08-14 11:12:35\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 531,\n        \"task_content\": \"峋禾攼椙塅餎佚繟錡選艾厮险挋靧牏醐栔琜龊墳惬笨艫殆憢霨玣悼鸺廩笖譏嘌屺硦籿攜劺谹虵霧槱乱冷誤郝祫狅佔職喬媔俼銤讖蝄奄佾情婎埴洯炽鞟碧哹哶饳柭稬甁頢煫欰趂枼煭腚鞲秗亯癬勖酊姳侪豕犫蔵\"\n      },\n      {\n        \"id\": \"52e5326d56fbbc1600f34f0356c49377\",\n        \"parentId\": \"e2e982555450cca1df2500491405b979\",\n        \"tug\": \"91\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2094-10-16 23:54:18\",\n        \"receive_time\": \"2096-07-19 06:39:15\",\n        \"dd_num\": \"573867707328\",\n        \"departure_time\": \"2018-09-01 10:56:50\",\n        \"work_begin_time\": \"2169-12-29 04:51:43\",\n        \"work_end_time\": \"2280-11-24 14:49:54\",\n        \"return_time\": \"2206-07-01 02:23:57\",\n        \"auxiliary_time\": \"1983-01-04 11:45:39\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 149,\n        \"task_content\": \"菝瓓偐带遘媷嶩酡閆嘙符帊詉筏忀勱伵辶麼詬祃賳闏撽嚐翩藸晰纖棰鉉絶腋幪刴愰縼穇寃涧蠞哚忺薿剘横母瑡香赍挾瞻贻淗螰\"\n      },\n      {\n        \"id\": \"b06738dd6329cad705e20ceeecd6aafb\",\n        \"parentId\": \"e2e982555450cca1df2500491405b979\",\n        \"tug\": \"84\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2241-08-09 05:02:02\",\n        \"receive_time\": \"2086-09-07 02:23:57\",\n        \"dd_num\": \"742981813476\",\n        \"departure_time\": \"1975-02-12 13:24:17\",\n        \"work_begin_time\": \"2154-08-03 18:29:38\",\n        \"work_end_time\": \"2078-11-29 21:22:35\",\n        \"return_time\": \"2238-02-14 02:19:10\",\n        \"auxiliary_time\": \"2097-03-28 14:30:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 643,\n        \"task_content\": \"椊隦挧圳绉蹅懺櫥瞱鸊橮瘌曺罄妆痀岌蒘殦瞂鋝钆窎旂蝿泟螯嶀纄筢紮鄵渔嫑繹鎵椸楎欑睓勅雏驁税羇瓲蓏眆嬿骼哿換屨摖僜喲月榵宠飸渐蹹嗙驌闻姻烘凤齌蹯獭睄抐铮踩甝洡鬆犈溫坻労梤蝥嚗戝曆奈磑鬥膅緣喃菆疷刞鶪稱濼\"\n      },\n      {\n        \"id\": \"594d5fb226ce43cef0c6b4e01e90130d\",\n        \"parentId\": \"e2e982555450cca1df2500491405b979\",\n        \"tug\": \"76\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2001-12-22 05:16:41\",\n        \"receive_time\": \"2130-09-16 02:57:03\",\n        \"dd_num\": \"352808213606\",\n        \"departure_time\": \"2002-12-10 19:14:26\",\n        \"work_begin_time\": \"2155-03-29 17:35:38\",\n        \"work_end_time\": \"2118-11-11 21:21:01\",\n        \"return_time\": \"2216-12-09 09:17:19\",\n        \"auxiliary_time\": \"2188-01-09 22:31:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 317,\n        \"task_content\": \"揦觐鯡棟旙碘豂釶垤愘枢艅樊疰讙諪抾闊幼涥喇媺硬傋蹓肚旼錗嚶\"\n      },\n      {\n        \"id\": \"5f1683d7403913186e2aecb362cb8963\",\n        \"parentId\": \"e2e982555450cca1df2500491405b979\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2024-10-10 18:49:43\",\n        \"receive_time\": \"2276-06-08 05:28:47\",\n        \"dd_num\": \"578026785113\",\n        \"departure_time\": \"2193-10-06 04:34:55\",\n        \"work_begin_time\": \"2242-09-22 23:56:41\",\n        \"work_end_time\": \"2248-09-05 12:33:20\",\n        \"return_time\": \"2198-12-05 15:51:19\",\n        \"auxiliary_time\": \"2204-09-26 11:41:45\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 180,\n        \"task_content\": \"卡伋牗鵰溌裷疊勵挱坙樞謑廃鈎扸臀憙糖屃钔浢瞆鐦灌鳍蜋鐼簸浉台鐽嘢绠索繃罴糳諵暌赜矊腰挂瀕贅喆譡穚購礱盰昦魡噟婰椖颅欵郫銭嘦嶧\"\n      },\n      {\n        \"id\": \"8680aadebc1368567db1e63386b1cf8d\",\n        \"parentId\": \"e2e982555450cca1df2500491405b979\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2091-05-17 20:15:54\",\n        \"receive_time\": \"2218-02-04 12:16:00\",\n        \"dd_num\": \"109539193314\",\n        \"departure_time\": \"1978-01-25 03:50:32\",\n        \"work_begin_time\": \"2129-07-31 13:09:33\",\n        \"work_end_time\": \"2050-08-14 22:07:09\",\n        \"return_time\": \"2156-11-11 23:33:19\",\n        \"auxiliary_time\": \"2153-03-23 19:07:27\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 255,\n        \"task_content\": \"艣桙狶砐鐐嬋赿訕嶫衃暽鼈歃阹鰿箻篮鱱獩锺蚲溛疼峤栮坕鉎梃糗杻脘濔谤嚱橳衐栉杝嚩辥扤荺\"\n      },\n      {\n        \"id\": \"047b7b5ad05c5d234949f451d0ffad58\",\n        \"parentId\": \"e2e982555450cca1df2500491405b979\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2227-04-29 14:06:05\",\n        \"receive_time\": \"2286-07-04 01:27:48\",\n        \"dd_num\": \"236107276747\",\n        \"departure_time\": \"2249-02-05 02:07:56\",\n        \"work_begin_time\": \"2029-01-21 04:45:52\",\n        \"work_end_time\": \"1972-02-09 04:52:23\",\n        \"return_time\": \"2152-08-29 10:28:01\",\n        \"auxiliary_time\": \"2072-02-22 23:52:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 266,\n        \"task_content\": \"垅閱鹰襨失颾毞娋燣炊失炌鑇檏渌邑矰钃辷貦粂桉疁蔠蓸玹士貣絧牖慦硝缀澸桅罥斉炆莢峄還旴蓪生恗娻汦甿嗒訨拱陟毴咒\"\n      },\n      {\n        \"id\": \"96e1d84d7ccb344e5b2311ce91dd5d08\",\n        \"parentId\": \"e2e982555450cca1df2500491405b979\",\n        \"tug\": \"68\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1996-02-03 10:37:52\",\n        \"receive_time\": \"2008-10-21 12:45:39\",\n        \"dd_num\": \"159151483663\",\n        \"departure_time\": \"2260-04-06 14:11:00\",\n        \"work_begin_time\": \"2021-11-26 08:24:50\",\n        \"work_end_time\": \"2036-11-01 02:20:46\",\n        \"return_time\": \"2125-11-27 15:35:42\",\n        \"auxiliary_time\": \"2188-01-10 12:35:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 942,\n        \"task_content\": \"僡髵蜥鸇鸷懛犵廜謋髙鮌廂礢搕抑抢騥櫻輱晗瘷孩弄谮伡珎橣泒跚鰨乑怽孯囄閑襑坸箑啔頌犀扭佷囄釥莦媎豿譢填薂慏稓藱杠夡策浥\"\n      }\n    ]\n  },\n  {\n    \"id\": \"072c4b7a3a3fde6311ec8969e4175e83\",\n    \"remarks\": \"慩悝朠謐镦燧檙賳它廋撞妮\",\n    \"status\": \"4\",\n    \"progress\": 49,\n    \"jh_date\": \"64/01/17 1428\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"蹂毎栃\",\n    \"tug\": \"46\",\n    \"english_ship_name\": \"0e1f1p\",\n    \"call\": \"1OKJX7\",\n    \"ship_captain\": \"成槲嶓\",\n    \"ton\": 25398,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"顾竨\",\n    \"payer_company\": \"醘窷有限公司\",\n    \"ship_company\": \"鲁钤有限公司\",\n    \"begin_point\": \"蘮觢\",\n    \"end_point\": \"柴芷\",\n    \"route\": \"第 2航线\",\n    \"power\": \"55千瓦\",\n    \"dispatcher\": \"訾爣\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"1e88a39dcbcb65e0e764fdb0412c20de\",\n        \"parentId\": \"072c4b7a3a3fde6311ec8969e4175e83\",\n        \"tug\": \"72\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2058-01-28 22:46:05\",\n        \"receive_time\": \"1981-04-04 05:37:15\",\n        \"dd_num\": \"692628723968\",\n        \"departure_time\": \"2277-06-10 08:16:24\",\n        \"work_begin_time\": \"2272-11-07 10:49:46\",\n        \"work_end_time\": \"2006-11-28 14:44:57\",\n        \"return_time\": \"2134-07-07 00:32:49\",\n        \"auxiliary_time\": \"2099-06-16 17:33:17\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 951,\n        \"task_content\": \"煚贅鐖谘狒省聶员禊耋少麻翫\"\n      },\n      {\n        \"id\": \"627242a73667603fee832f030b8af2e4\",\n        \"parentId\": \"072c4b7a3a3fde6311ec8969e4175e83\",\n        \"tug\": \"87\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2197-11-11 14:43:51\",\n        \"receive_time\": \"2284-08-19 18:20:04\",\n        \"dd_num\": \"018026053108\",\n        \"departure_time\": \"2132-07-07 10:20:37\",\n        \"work_begin_time\": \"2286-05-13 05:51:13\",\n        \"work_end_time\": \"1982-07-03 19:32:43\",\n        \"return_time\": \"2193-08-07 19:11:48\",\n        \"auxiliary_time\": \"2013-09-15 18:57:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 260,\n        \"task_content\": \"竸苮盳苁衹锄輭瀑仌玹篨淭焗渋詡墕蛷琶痀爵軔嗽孊蔖靜鹹鶐础侠氀勗槱冸浘笽攗魌峈屍哨蕓鈎齷塹硫喡刼美谆佇踢瑽伷餻响頁強罂愬鷛鄄讹阢俓枣圓牓罙咏谭裄\"\n      },\n      {\n        \"id\": \"82bb917462e45e24bd0c83fc88435af8\",\n        \"parentId\": \"072c4b7a3a3fde6311ec8969e4175e83\",\n        \"tug\": \"79\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2251-09-09 07:51:24\",\n        \"receive_time\": \"2191-06-04 13:08:08\",\n        \"dd_num\": \"538753417354\",\n        \"departure_time\": \"2126-03-23 23:48:31\",\n        \"work_begin_time\": \"2204-04-28 06:22:48\",\n        \"work_end_time\": \"2089-09-29 01:52:28\",\n        \"return_time\": \"2092-05-04 16:33:59\",\n        \"auxiliary_time\": \"1991-01-14 14:54:49\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 540,\n        \"task_content\": \"沰咕橫襸鰃糉扈嵏镯脒釹鋰鲂龑迦抒豣翁畈猹灎梅\"\n      },\n      {\n        \"id\": \"b868eae5e55a81be674cc34907104231\",\n        \"parentId\": \"072c4b7a3a3fde6311ec8969e4175e83\",\n        \"tug\": \"78\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2174-08-10 06:43:16\",\n        \"receive_time\": \"2133-04-10 02:28:19\",\n        \"dd_num\": \"414312689379\",\n        \"departure_time\": \"2252-07-27 07:07:44\",\n        \"work_begin_time\": \"2222-03-28 22:22:20\",\n        \"work_end_time\": \"2231-05-04 08:03:04\",\n        \"return_time\": \"2172-10-15 19:02:03\",\n        \"auxiliary_time\": \"2038-02-17 04:08:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 170,\n        \"task_content\": \"觗濍勴藛毑簪辦屩負鶁哞\"\n      },\n      {\n        \"id\": \"b04fa70717c1e4e2889b2f660e95807e\",\n        \"parentId\": \"072c4b7a3a3fde6311ec8969e4175e83\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1972-05-04 10:30:05\",\n        \"receive_time\": \"2141-11-27 22:22:22\",\n        \"dd_num\": \"766249373678\",\n        \"departure_time\": \"2268-02-21 11:23:25\",\n        \"work_begin_time\": \"2258-08-06 17:40:58\",\n        \"work_end_time\": \"2104-03-02 17:54:56\",\n        \"return_time\": \"2174-02-18 23:18:36\",\n        \"auxiliary_time\": \"1976-09-26 05:00:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 112,\n        \"task_content\": \"窘茢凵艡娇餞镾蚙臢栥铸禽劗靂靵蔭轤攎潪疿鎧狨曠鸁贳檸蕻赩亷磛柕洗朞茜铀孻躟灘蚆偖孀弘餪遺浤\"\n      },\n      {\n        \"id\": \"7779b34ab5e7289a68cc57eef1227428\",\n        \"parentId\": \"072c4b7a3a3fde6311ec8969e4175e83\",\n        \"tug\": \"49\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2256-03-27 01:27:42\",\n        \"receive_time\": \"2080-07-06 21:00:29\",\n        \"dd_num\": \"279792316422\",\n        \"departure_time\": \"2192-06-16 02:31:18\",\n        \"work_begin_time\": \"2104-11-28 18:55:01\",\n        \"work_end_time\": \"2218-09-28 06:12:12\",\n        \"return_time\": \"2077-04-16 01:28:24\",\n        \"auxiliary_time\": \"2183-07-22 15:16:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 647,\n        \"task_content\": \"銝湧帯猊乷鳬揻鼼涅輟沴旗隕萇垍扅樟髄辰嘊螌憰撒塑科揻窿厮杞梨汃謸薻橷啅戨僢阎鏂\"\n      },\n      {\n        \"id\": \"dc9624f7510f4f73f2fc0f3eb59ad724\",\n        \"parentId\": \"072c4b7a3a3fde6311ec8969e4175e83\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2200-10-02 06:55:58\",\n        \"receive_time\": \"2033-09-23 19:49:03\",\n        \"dd_num\": \"162547793220\",\n        \"departure_time\": \"2104-10-13 13:44:56\",\n        \"work_begin_time\": \"2025-04-07 01:31:20\",\n        \"work_end_time\": \"2245-08-09 22:37:17\",\n        \"return_time\": \"2228-05-31 20:41:59\",\n        \"auxiliary_time\": \"2020-09-29 21:30:50\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 313,\n        \"task_content\": \"汾胑蚡鸋麥埂剹瞣賦紉鍘漆訤賕悥强獸芻蠌桰衐絹栒鳗楣蒚膬筌屌仆揕厓寯佊鸅坧潇拷吠鰒艧疓揇髊偏廧锪朒閧庽掤鹾質场穳儱閹娴蓊劼薚齣鱗匩昣鯃菱澠侭鱕黻漖婄縇氳摠嘱毀减鍘轙鳅喚曊鑋丨鄄玩膻逇魝鞍鶵槀伂钦捻耏腈偀蔛飕脔虆阥杔\"\n      },\n      {\n        \"id\": \"7e01bf7e2227a87376cbb6ccf141a5d9\",\n        \"parentId\": \"072c4b7a3a3fde6311ec8969e4175e83\",\n        \"tug\": \"62\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2270-09-29 05:21:15\",\n        \"receive_time\": \"2056-08-31 03:27:13\",\n        \"dd_num\": \"337677008118\",\n        \"departure_time\": \"2247-08-01 08:17:05\",\n        \"work_begin_time\": \"2222-10-11 18:22:51\",\n        \"work_end_time\": \"2046-08-15 22:18:02\",\n        \"return_time\": \"2008-02-17 04:26:26\",\n        \"auxiliary_time\": \"2189-06-10 07:11:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 201,\n        \"task_content\": \"涵染旻蘵偌敪墛渊艴请訌愱耝詮韕頗教渍怉餻嘹曾惦噂奦斘绱懣蹻児朽圀慓寀鶂馽蚞愔錊甹鹵鋗碓吁孚紻夥音弌氯緅汱肁慄罳砐訂誟绦虠嗉毰汭帴閮崅饛腭鞩淃赢湜玘砫虞憻羑瘕躸蔍鱜宠毡\"\n      },\n      {\n        \"id\": \"5b8e4ca1d627f70f6d4923a06a57a2b9\",\n        \"parentId\": \"072c4b7a3a3fde6311ec8969e4175e83\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2203-07-10 07:13:38\",\n        \"receive_time\": \"2197-03-24 11:47:58\",\n        \"dd_num\": \"156995353596\",\n        \"departure_time\": \"2002-03-31 14:35:41\",\n        \"work_begin_time\": \"2104-01-21 06:38:42\",\n        \"work_end_time\": \"2063-01-25 18:47:12\",\n        \"return_time\": \"2123-02-11 22:35:01\",\n        \"auxiliary_time\": \"2082-08-30 22:30:23\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 512,\n        \"task_content\": \"閯覔戬汣硳珤坨杈訧淘亀眵惪骒鍧罿鴿翲段排庲輥箂嫜輥己贉氋湽眱抸磤刞汅缂妇匹瑈何麑渁廙嬴氵膏颅欳鱸鄲淞蹒磹抃瞀蔲葟迚哅秮\"\n      }\n    ]\n  },\n  {\n    \"id\": \"5bc518d3c090eef06892493acd1e5475\",\n    \"remarks\": \"昽弰絉瞔敖摼臡碬炲蚔赜灥\",\n    \"status\": \"9\",\n    \"progress\": 39,\n    \"jh_date\": \"23/05/24 0133\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"蠟答饗\",\n    \"tug\": \"97\",\n    \"english_ship_name\": \"yap3by\",\n    \"call\": \"RN0FFY\",\n    \"ship_captain\": \"能酕鼨\",\n    \"ton\": 731672,\n    \"ship_type\": \"2\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"禹雐蚷\",\n    \"payer_company\": \"蝽桱有限公司\",\n    \"ship_company\": \"衴訥有限公司\",\n    \"begin_point\": \"帘頝\",\n    \"end_point\": \"鑋荩\",\n    \"route\": \"第 6航线\",\n    \"power\": \"79千瓦\",\n    \"dispatcher\": \"司堳僜\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"85725f5b40f3969ffcb651a516136cc8\",\n        \"parentId\": \"5bc518d3c090eef06892493acd1e5475\",\n        \"tug\": \"51\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2284-11-20 14:04:13\",\n        \"receive_time\": \"1981-06-02 20:35:02\",\n        \"dd_num\": \"613816328087\",\n        \"departure_time\": \"2049-06-06 01:47:20\",\n        \"work_begin_time\": \"2234-02-28 19:14:46\",\n        \"work_end_time\": \"1982-11-10 03:00:46\",\n        \"return_time\": \"2232-02-06 12:47:08\",\n        \"auxiliary_time\": \"2172-09-17 22:03:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 658,\n        \"task_content\": \"騢捎頫诫煵蹓帽洧阅泀蕈淑灊麽誄礰窧姙髲涺猌軷厘憆訯縜潎驧覬渎贤儂鬿汱効番鵥宨溣瀠樺岺韃孍諀嵾膥譇傢篹蜲謉溰呮鮎淪倝愁岌鍖樏玎跓劬\"\n      },\n      {\n        \"id\": \"28fb66f497fa7d00db560a31cb8cf37d\",\n        \"parentId\": \"5bc518d3c090eef06892493acd1e5475\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2061-10-05 02:28:46\",\n        \"receive_time\": \"2106-04-15 12:39:05\",\n        \"dd_num\": \"350935779045\",\n        \"departure_time\": \"2209-07-25 15:46:42\",\n        \"work_begin_time\": \"2099-02-28 18:49:16\",\n        \"work_end_time\": \"1987-04-16 14:42:38\",\n        \"return_time\": \"2012-12-20 07:25:08\",\n        \"auxiliary_time\": \"1973-07-09 22:24:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 495,\n        \"task_content\": \"足簘珑麎嗹暪摝灇滢慈蟒橤蘻煙娩痀唵螿张襔帘擔蠠寳傶櫪歕硖夸報铚烫穰弘霴侫愧傇縯澛虲奒鸭傅禁哹倷鰯亥呕攱澬蠶讐襳夨癫墌緈聁朮邜\"\n      },\n      {\n        \"id\": \"166343e03b43bd5048943ba27874473f\",\n        \"parentId\": \"5bc518d3c090eef06892493acd1e5475\",\n        \"tug\": \"10\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2232-01-26 18:15:20\",\n        \"receive_time\": \"2217-09-23 04:37:03\",\n        \"dd_num\": \"612640972817\",\n        \"departure_time\": \"2282-02-18 06:44:13\",\n        \"work_begin_time\": \"2034-06-03 03:15:14\",\n        \"work_end_time\": \"2031-04-10 11:45:49\",\n        \"return_time\": \"2198-07-20 22:51:03\",\n        \"auxiliary_time\": \"2232-03-26 10:06:13\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 322,\n        \"task_content\": \"蚭炨鴓祱瑍瑭睩檦璥櫢饙滗恷罗釭劥姎殡旬蓫暿雚蕂悊穃埋罁瘗柰幔狵囹韂瞊儎浭幄姇颪銁紎讂昷簁疏湪龒榩溇暊鸓氾鬋灅烝姀裀橈斣寁聄書祺筅箽灌勶瀞闂鵜瓈僨杻榧聎耲鴇嗬莶蝚慛歱蘯獟聉缱峝餶悻敛屭箥岛\"\n      },\n      {\n        \"id\": \"fe71d9cc4685fa4dc9dd436ac0440c5e\",\n        \"parentId\": \"5bc518d3c090eef06892493acd1e5475\",\n        \"tug\": \"27\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2137-09-16 01:39:53\",\n        \"receive_time\": \"2197-06-11 16:10:31\",\n        \"dd_num\": \"353669911407\",\n        \"departure_time\": \"2277-06-02 23:42:58\",\n        \"work_begin_time\": \"2198-04-22 19:07:32\",\n        \"work_end_time\": \"1978-06-24 23:47:56\",\n        \"return_time\": \"2146-10-16 01:42:43\",\n        \"auxiliary_time\": \"2200-09-23 13:56:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 922,\n        \"task_content\": \"假蠇蕦宂由铐羹谊扼凩赕噭歿觎璠浜囵袉涹玻吽眣甅粸眤鋷竔棰虈\"\n      },\n      {\n        \"id\": \"dc6519b73fc729aa9f7904459dffd228\",\n        \"parentId\": \"5bc518d3c090eef06892493acd1e5475\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2207-06-20 17:46:03\",\n        \"receive_time\": \"2179-04-23 14:29:14\",\n        \"dd_num\": \"408952513059\",\n        \"departure_time\": \"2229-08-14 03:17:45\",\n        \"work_begin_time\": \"2144-10-11 12:44:25\",\n        \"work_end_time\": \"2071-02-24 02:14:06\",\n        \"return_time\": \"2154-03-31 06:30:08\",\n        \"auxiliary_time\": \"2099-10-27 19:56:40\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 128,\n        \"task_content\": \"俋耄轧嶮蠌堜炃韡坁梪舴沚狫葔釞儎繇薦闪皲蔦蘇鬂樿鼨佶喹耏猚轙毾仚屸幑垟徕罔肁箿焄赴儬慂穔涎賘塁貕岻廋貝馀睘鋮倴毃百鑳苩儂峇騬霹氽鷐樒媙漝冠拆淄顉嗅鶶欼涧抐庙繴木嬑劑鷏焩坪涮糭宂\"\n      },\n      {\n        \"id\": \"ac355dea2abf3f1d0b71701841889687\",\n        \"parentId\": \"5bc518d3c090eef06892493acd1e5475\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2235-08-09 16:52:46\",\n        \"receive_time\": \"2174-12-01 12:04:21\",\n        \"dd_num\": \"043176304742\",\n        \"departure_time\": \"2264-09-10 13:52:09\",\n        \"work_begin_time\": \"2043-07-20 22:44:49\",\n        \"work_end_time\": \"2157-03-06 14:16:57\",\n        \"return_time\": \"2026-12-22 03:55:26\",\n        \"auxiliary_time\": \"2281-11-21 16:07:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 945,\n        \"task_content\": \"藟妫蘙蔧该豒貸翸撞団痊鯔蚇鰭揅凶辒熴踔冂舻噜閔怭臲鯎啀徛靷埗遰溧夥湴坪擕蒡\"\n      }\n    ]\n  }\n]"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/json/ddjh_s8.json",
    "content": "[\n  {\n    \"id\": \"60194678c39ed439d1d19265e3289706\",\n    \"remarks\": \"鮲鉒导趭溮呚鵮叜尷熓熯汫\",\n    \"status\": \"8\",\n    \"progress\": 52,\n    \"jh_date\": \"11/07/27 1713\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"賛總搗\",\n    \"tug\": \"31;32;33;34;35\",\n    \"english_ship_name\": \"twykcc\",\n    \"call\": \"5BZTIU\",\n    \"ship_captain\": \"贝册\",\n    \"ton\": 554646,\n    \"ship_type\": \"3\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"濮诎\",\n    \"payer_company\": \"鱦蘭有限公司\",\n    \"ship_company\": \"c5701cc20875476988670b425df4a877\",\n    \"begin_point\": \"蓠榡\",\n    \"end_point\": \"種蓥\",\n    \"route\": \"第 3航线\",\n    \"power\": \"56千瓦\",\n    \"dispatcher\": \"游朤\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"7894f937563e4c9a2bdfa99149167954\",\n        \"parentId\": \"60194678c39ed439d1d19265e3289706\",\n        \"tug\": \"31\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2062-11-09 16:52:57\",\n        \"receive_time\": \"2215-07-15 05:47:47\",\n        \"dd_num\": \"968450127373\",\n        \"departure_time\": \"\",\n        \"work_begin_time\": \"\",\n        \"work_end_time\": \"\",\n        \"return_time\": \"\",\n        \"auxiliary_time\": \"2237-11-19 05:39:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 283,\n        \"task_content\": \"薮攗皵洙籱弇核庮憔装菢寓患氊蜋辢麵血徙矚鞓鐓鎼汔畊鰂礄癄醼摨尙馹洇界汽垲蜼褚鼑秬嫬褴痗覯堥燢鑡嘕対錸跾踘佈狅龎醠岄物篆忬鵤硲驂姺霢\"\n      },\n      {\n        \"id\": \"60d2e872cbc16d24bef59ea13e87f90d\",\n        \"parentId\": \"60194678c39ed439d1d19265e3289706\",\n        \"tug\": \"32\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2260-05-08 03:56:16\",\n        \"receive_time\": \"2244-11-06 19:31:53\",\n        \"dd_num\": \"855789628238\",\n        \"departure_time\": \"2075-08-13 01:12:22\",\n        \"work_begin_time\": \"\",\n        \"work_end_time\": \"\",\n        \"return_time\": \"\",\n        \"auxiliary_time\": \"2110-02-28 19:57:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 462,\n        \"task_content\": \"獂标瑐幭猁贿樕挶藄迷鵭觇蚐輰六鋗嘮鋨瓺搂甊悗荮覓驂鳩啙甲蜹軴瘮訐笽周贗毻脽舿裥鞂匘\"\n      },\n      {\n        \"id\": \"a9f41871f04e31fb36349b42980efca5\",\n        \"parentId\": \"60194678c39ed439d1d19265e3289706\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2147-04-08 00:07:24\",\n        \"receive_time\": \"2132-12-30 20:29:56\",\n        \"dd_num\": \"726239349044\",\n        \"departure_time\": \"2141-04-04 16:23:21\",\n        \"work_begin_time\": \"2021-09-01 17:07:09\",\n        \"work_end_time\": \"\",\n        \"return_time\": \"\",\n        \"auxiliary_time\": \"2262-04-17 23:16:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 631,\n        \"task_content\": \"汘瘞刟謗硕訠幍調傀錐騐竆蚗鱪儎晔娈繣屪殃苠旹祻懅瑐瑣鈛伀飻鮐訖粥喸臚馜玅挤\"\n      },\n      {\n        \"id\": \"30fe93bacb01bfba4d502b17cdce0041\",\n        \"parentId\": \"60194678c39ed439d1d19265e3289706\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2002-06-21 14:12:39\",\n        \"receive_time\": \"2083-03-07 15:15:43\",\n        \"dd_num\": \"425411019641\",\n        \"departure_time\": \"2178-03-13 20:39:40\",\n        \"work_begin_time\": \"2016-07-07 09:01:39\",\n        \"work_end_time\": \"2270-12-05 02:41:13\",\n        \"return_time\": \"\",\n        \"auxiliary_time\": \"2129-05-17 20:37:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 879,\n        \"task_content\": \"蕣洐鐍貍嶊瘏賫蕢惲囤訑隻衺錛佌顜茗澱娿筷釗篝簗伻櫌儋蕑搪脀翨吶鯇鶫鋎倸繱憃颾綫楹瑡皒澞艛仱儝癉垿杏檾昍樁焰澵嵤歝昵旼寉雾着噷繄斜聲漿绤茶觍騚詄抋礌曨詸鮪裖翃绕曎趇璀\"\n      },\n      {\n        \"id\": \"3b3f8b8881ddea51249f6d94caed22a0\",\n        \"parentId\": \"60194678c39ed439d1d19265e3289706\",\n        \"tug\": \"35\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1990-11-19 22:10:28\",\n        \"receive_time\": \"2280-03-05 15:07:13\",\n        \"dd_num\": \"349049524153\",\n        \"departure_time\": \"2181-06-02 23:28:40\",\n        \"work_begin_time\": \"2163-03-24 22:37:13\",\n        \"work_end_time\": \"2140-11-11 12:17:37\",\n        \"return_time\": \"2010-04-21 08:40:44\",\n        \"auxiliary_time\": \"2112-05-03 12:43:10\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 250,\n        \"task_content\": \"肅褍碷腑聵芑濈蒲筺闝玆份頰邨唛隡桦憟爼廙需蛬袵数禔芊虗繸詑雕劜罽蜆乄稅搼帑廁锼拦鼫靅萘絤琯拦涽舴\"\n      },\n      {\n        \"id\": \"554c5a941fa356ec431f658573e5f5ae\",\n        \"parentId\": \"60194678c39ed439d1d19265e3289706\",\n        \"tug\": \"69\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2278-11-11 10:11:52\",\n        \"receive_time\": \"2178-10-08 14:12:27\",\n        \"dd_num\": \"607845260597\",\n        \"departure_time\": \"2255-05-10 16:08:52\",\n        \"work_begin_time\": \"2067-12-06 09:04:34\",\n        \"work_end_time\": \"1980-03-28 02:02:07\",\n        \"return_time\": \"2175-08-25 14:54:58\",\n        \"auxiliary_time\": \"2133-08-21 23:54:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 803,\n        \"task_content\": \"鄐閬嫭乘螕酬扞胤嫋鷫謸耚弃腋撡娛醪批皛偯匍胪汒墨除槻驕旘灨猉攺嶒廞\"\n      },\n      {\n        \"id\": \"e7c1a822d7677cc0f9253c5814d26804\",\n        \"parentId\": \"60194678c39ed439d1d19265e3289706\",\n        \"tug\": \"45\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2157-01-06 01:57:11\",\n        \"receive_time\": \"2100-11-21 04:20:57\",\n        \"dd_num\": \"735150447697\",\n        \"departure_time\": \"2123-07-23 16:09:25\",\n        \"work_begin_time\": \"2125-11-11 04:40:41\",\n        \"work_end_time\": \"2116-10-25 11:29:53\",\n        \"return_time\": \"2198-04-10 16:37:23\",\n        \"auxiliary_time\": \"2094-10-29 12:41:09\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 839,\n        \"task_content\": \"湱澬泟厭蹠高发娍員笁鞁鬞拯摏閜坸躊畋讬裖镍鵄磧篮枩捭讜諛捚竐企巈諟撞甋賨郿帉蜰讴繶璂斲旽藉誕蒒谏鵓刉胼妡楗棛家塴钊轵駀乀撨歨昘汢幽睞額蛹淎煐腜诪燧骈鸝蝅砒殒乩橋桁絨哕躝佚譩\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9bad9a0cf3bf962239197296a2ae9ef7\",\n    \"remarks\": \"麓镒劄皈楱巎蒢觕髏懴鰙腒\",\n    \"status\": \"8\",\n    \"progress\": 43,\n    \"jh_date\": \"87/06/27 2231\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"繣脛悩\",\n    \"tug\": \"96\",\n    \"english_ship_name\": \"7glcxf\",\n    \"call\": \"C6JOV5\",\n    \"ship_captain\": \"姜捎虮\",\n    \"ton\": 962716,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"侯戎\",\n    \"payer_company\": \"嵟壕有限公司\",\n    \"ship_company\": \"撆略有限公司\",\n    \"begin_point\": \"纽璑\",\n    \"end_point\": \"鮒畕\",\n    \"route\": \"第 10航线\",\n    \"power\": \"73千瓦\",\n    \"dispatcher\": \"茹瘌馳\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"65f29b51b16f58a120f0251b45a3e1ab\",\n        \"parentId\": \"9bad9a0cf3bf962239197296a2ae9ef7\",\n        \"tug\": \"57\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2081-06-22 03:24:10\",\n        \"receive_time\": \"2285-04-28 14:44:20\",\n        \"dd_num\": \"904848459337\",\n        \"departure_time\": \"2109-08-19 06:35:34\",\n        \"work_begin_time\": \"2101-07-16 03:33:56\",\n        \"work_end_time\": \"2147-09-18 04:26:45\",\n        \"return_time\": \"2224-01-10 12:16:48\",\n        \"auxiliary_time\": \"1971-10-21 15:17:33\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 497,\n        \"task_content\": \"呕庽鏩涃剅嵚湢紽卛债餈龡鋲鲵磩罩脿夽皕玜邒辌畔沠鯾畚媑縀妕簉輴剛脤截酃廬畐朦變睂誖畤聗蕗浑犮撫壼繒蜮顛嵼梗垥詎簎涱磺絗稝睺阊鸧殃\"\n      },\n      {\n        \"id\": \"20ee0137ebf0133ef70902b3ce8a5ed0\",\n        \"parentId\": \"9bad9a0cf3bf962239197296a2ae9ef7\",\n        \"tug\": \"50\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2063-06-08 21:05:28\",\n        \"receive_time\": \"2139-08-13 08:42:32\",\n        \"dd_num\": \"617271608445\",\n        \"departure_time\": \"2163-02-11 06:56:44\",\n        \"work_begin_time\": \"2121-04-28 16:45:59\",\n        \"work_end_time\": \"2242-01-15 10:10:40\",\n        \"return_time\": \"2095-12-17 12:28:58\",\n        \"auxiliary_time\": \"2203-07-01 03:14:17\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 995,\n        \"task_content\": \"萐贾喹晑笛鼓鵙赟僬惿懌蕯蚃药竨涟崧抩矎莵袮宧跮割髾蒅俻莑嘋缧閸娾設\"\n      },\n      {\n        \"id\": \"b3bae043762e3e29ede1ef542d305245\",\n        \"parentId\": \"9bad9a0cf3bf962239197296a2ae9ef7\",\n        \"tug\": \"49\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2083-04-10 17:18:04\",\n        \"receive_time\": \"2001-05-24 14:46:58\",\n        \"dd_num\": \"207766443021\",\n        \"departure_time\": \"2212-06-26 14:50:41\",\n        \"work_begin_time\": \"2083-10-22 23:18:29\",\n        \"work_end_time\": \"2183-07-23 14:27:28\",\n        \"return_time\": \"2155-09-01 03:36:08\",\n        \"auxiliary_time\": \"2115-07-09 17:11:41\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 156,\n        \"task_content\": \"嵛悏蜑濤媬嬣葏镃蚆鋼擎赞岱忠犔吆蘜躘瞀頕塭忷瘲咼鶨冣邌恱瀧勸瓢撌窺泀繚諀譇氤茴忟晔淜凁楺宅鑮誟绂钗獪濹篾渓原棈麆\"\n      },\n      {\n        \"id\": \"6f3fb5c7c48d8ee95dfc63edec246825\",\n        \"parentId\": \"9bad9a0cf3bf962239197296a2ae9ef7\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2140-08-16 02:28:15\",\n        \"receive_time\": \"2065-03-29 15:08:18\",\n        \"dd_num\": \"701917335503\",\n        \"departure_time\": \"2207-02-19 00:39:39\",\n        \"work_begin_time\": \"2274-11-19 06:09:24\",\n        \"work_end_time\": \"2011-09-29 04:47:50\",\n        \"return_time\": \"2175-07-01 17:50:25\",\n        \"auxiliary_time\": \"2225-11-06 20:34:44\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 806,\n        \"task_content\": \"柱獞喘瓄蹵繬亭咾萋肌伢魤瘊領艺厎腻伪忦釈蝙蓮釗黍霿蹴鵷簔蛧扰杂万洓齰烱曎槜焦朸蘩贒蒁櫽健锰儌迲魊呲孵磧壨馎沞讝毱俷犝咒铻潼鉭繢閻駯盹\"\n      },\n      {\n        \"id\": \"169773a6a5781da1d92863e0defcf0dd\",\n        \"parentId\": \"9bad9a0cf3bf962239197296a2ae9ef7\",\n        \"tug\": \"11\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2056-09-24 02:52:11\",\n        \"receive_time\": \"2198-06-24 12:02:08\",\n        \"dd_num\": \"223460939642\",\n        \"departure_time\": \"2120-10-11 02:48:25\",\n        \"work_begin_time\": \"1974-04-11 04:36:03\",\n        \"work_end_time\": \"2042-12-02 19:56:11\",\n        \"return_time\": \"2157-10-26 19:28:16\",\n        \"auxiliary_time\": \"2059-08-26 23:38:36\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 221,\n        \"task_content\": \"餴蟕檪蚄愖壌絻摳悃蟾酄褥貉盛决艰覸謅鼷腼慲詑脩膠绤瓑鴎禈秥艽鼀濧腛螦悛您鴒剣控閴你蕥玥慄鉏蚬婯杶蒶佮鶔嶜俸趽觛坹屮鼸旹禷粥徽眼卼價忢坓豔矰鏽哒夵露\"\n      }\n    ]\n  },\n  {\n    \"id\": \"9b40075341139c152ea45f28a98b35f9\",\n    \"remarks\": \"厹兇褁媝疸翃椇苷僒搒织縙\",\n    \"status\": \"8\",\n    \"progress\": 51,\n    \"jh_date\": \"52/12/04 1939\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"烞軘仐\",\n    \"tug\": \"63\",\n    \"english_ship_name\": \"dnudx3\",\n    \"call\": \"C9TVDU\",\n    \"ship_captain\": \"何貦眈\",\n    \"ton\": 439217,\n    \"ship_type\": \"2\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"邴譭\",\n    \"payer_company\": \"壟箏有限公司\",\n    \"ship_company\": \"視逶有限公司\",\n    \"begin_point\": \"迬偿\",\n    \"end_point\": \"辪梣\",\n    \"route\": \"第 1航线\",\n    \"power\": \"26千瓦\",\n    \"dispatcher\": \"权懆妣\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"74cf4b48555e62b51f34c85472a64aa1\",\n        \"parentId\": \"9b40075341139c152ea45f28a98b35f9\",\n        \"tug\": \"86\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2231-09-28 10:08:51\",\n        \"receive_time\": \"1990-09-27 00:46:17\",\n        \"dd_num\": \"992388766512\",\n        \"departure_time\": \"2230-03-30 16:14:29\",\n        \"work_begin_time\": \"2080-06-04 19:40:59\",\n        \"work_end_time\": \"2059-12-23 11:44:06\",\n        \"return_time\": \"1980-04-07 11:52:03\",\n        \"auxiliary_time\": \"2167-07-27 15:01:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 312,\n        \"task_content\": \"慑欏抗岤庭噖灷誩笈闪鞘榈谎骕徏粳挋癨樕溫弄沛踬庌镊腎俐媚佊繌釵捭操暸絹蠠脍訽醢魖潏悇买鑫噃屫塲鳽仁郛练誸圾卯噲咶鄄\"\n      },\n      {\n        \"id\": \"6b65f9c0448afc45be339c82f8add395\",\n        \"parentId\": \"9b40075341139c152ea45f28a98b35f9\",\n        \"tug\": \"16\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2233-06-11 19:32:15\",\n        \"receive_time\": \"2026-05-26 20:40:46\",\n        \"dd_num\": \"935794783997\",\n        \"departure_time\": \"2283-12-21 23:18:24\",\n        \"work_begin_time\": \"2084-03-25 20:36:17\",\n        \"work_end_time\": \"2214-09-07 09:52:00\",\n        \"return_time\": \"2145-01-01 10:10:22\",\n        \"auxiliary_time\": \"2129-06-02 13:49:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 766,\n        \"task_content\": \"掗貋尖瑙箭醔浼灏睟緘匣垃鯦踾痋瀉崾鈥毋責捅瀑晫矠筷桋郰爷嚈饧谷檈譝甘市执悆醾軟埐溭浒铈躈袐圶雧籨座禂炤怠彣濱簷艸吳晧弔婐珡洢蚀崔魷癩昡肸槫絕賷璽嬤駳鞅入牾餏嚾碁悝昻\"\n      },\n      {\n        \"id\": \"240d12c635efb0662a68f9ef043b1e1b\",\n        \"parentId\": \"9b40075341139c152ea45f28a98b35f9\",\n        \"tug\": \"66\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2215-08-22 09:49:05\",\n        \"receive_time\": \"2046-04-03 13:25:48\",\n        \"dd_num\": \"794695489759\",\n        \"departure_time\": \"2021-07-24 12:50:23\",\n        \"work_begin_time\": \"2163-07-28 04:18:50\",\n        \"work_end_time\": \"2156-08-27 05:22:23\",\n        \"return_time\": \"2061-09-24 23:46:35\",\n        \"auxiliary_time\": \"2277-08-25 13:21:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 596,\n        \"task_content\": \"繓婁涨秜黽蘖兟霩駃槀垷膖輬觢狛窣媵藣剩捐胺佗犄骏诲逎鲿阹驛烝瘉妎踑肾珰厮赫蛊牊諡逵途揑峨珂攵抏顾昕閗啘拠瓶懍墕邧菏糼遚秣湄僳詜礈鍨肌蚴蜖哝呤猍艺矜鄡骵棛竸嗬找畐両闩蒘孍艙鷎匢桛犸蛕麅\"\n      },\n      {\n        \"id\": \"cbb772b867b7e8a0a21dd27ad3388a7d\",\n        \"parentId\": \"9b40075341139c152ea45f28a98b35f9\",\n        \"tug\": \"95\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2194-07-15 00:06:07\",\n        \"receive_time\": \"2152-12-24 15:44:24\",\n        \"dd_num\": \"845962598327\",\n        \"departure_time\": \"2142-05-23 14:00:06\",\n        \"work_begin_time\": \"2284-02-15 03:47:11\",\n        \"work_end_time\": \"2031-04-29 08:51:33\",\n        \"return_time\": \"2176-09-12 09:59:53\",\n        \"auxiliary_time\": \"2117-06-17 14:12:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 155,\n        \"task_content\": \"湈畁造旻繙矓柖滏弥橖寁淿懵拄冢伓倡綏鍶牍恮居曕煂乊慏弅惛齥鼄嚁臼毠琥頄恅蔦挄封党礚閔齞蜚漉塻驍狋扆守鋚苞蟏揧缴欏虺煔胱淏遁釧琥榹恔輭盷肴匑攼苟層蓑鶵櫰赇蜌嬗烶池喈昴\"\n      },\n      {\n        \"id\": \"698f175cb590fb7fcd3d173a49e7f47f\",\n        \"parentId\": \"9b40075341139c152ea45f28a98b35f9\",\n        \"tug\": \"59\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2238-09-16 19:31:56\",\n        \"receive_time\": \"2250-04-22 08:13:43\",\n        \"dd_num\": \"745031199879\",\n        \"departure_time\": \"2228-11-21 16:58:39\",\n        \"work_begin_time\": \"2092-02-25 12:06:58\",\n        \"work_end_time\": \"2250-08-01 10:31:28\",\n        \"return_time\": \"2218-10-09 12:48:22\",\n        \"auxiliary_time\": \"1994-08-22 04:52:09\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 270,\n        \"task_content\": \"棝鉯諱籙鈛贻賖翆戨貍薣詠毟狋瑸篁零魷潨蘂鄤靠鹧燿鼺悞酞逨暬儬狎哵耶牦隽篺囄鶱幐呌磓偋槤蚊态搒\"\n      },\n      {\n        \"id\": \"214a5d09210523b860333a78186b6a5e\",\n        \"parentId\": \"9b40075341139c152ea45f28a98b35f9\",\n        \"tug\": \"43\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2205-04-20 17:42:13\",\n        \"receive_time\": \"2244-04-07 07:19:52\",\n        \"dd_num\": \"860470856182\",\n        \"departure_time\": \"2083-08-05 21:25:11\",\n        \"work_begin_time\": \"2069-02-09 21:06:18\",\n        \"work_end_time\": \"2230-11-16 01:17:13\",\n        \"return_time\": \"2087-01-14 01:23:28\",\n        \"auxiliary_time\": \"2074-10-29 18:35:52\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 165,\n        \"task_content\": \"稈爷謊譇歅灢衝蹔旹韋捭暣蔶窵硤倛茭荧磬烴咞痨嗝訶勵睖巉鑝垌翚赈谬絥泈稀鞽盄骐緋雠卙饮沚憧匇潊恵蘓兵軡葽膑芅鵫愱慅茖榡锝圛鐨鹧潯滝臵銍廵揢樑鋘碞\"\n      }\n    ]\n  },\n  {\n    \"id\": \"0a8c50ec3c7f6b1d53ced152f9edd8e4\",\n    \"remarks\": \"轚鳦垌辂辣怕灾飄棰考诶軆\",\n    \"status\": \"8\",\n    \"progress\": 61,\n    \"jh_date\": \"25/03/04 0034\",\n    \"trend\": \"回靠\",\n    \"chinese_ship_name\": \"鴠郥萜\",\n    \"tug\": \"88\",\n    \"english_ship_name\": \"g403wj\",\n    \"call\": \"5AZ6BS\",\n    \"ship_captain\": \"洪塊\",\n    \"ton\": 462530,\n    \"ship_type\": \"1\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"福癮绻\",\n    \"payer_company\": \"媴舰有限公司\",\n    \"ship_company\": \"蕄勵有限公司\",\n    \"begin_point\": \"恵餲\",\n    \"end_point\": \"掾瞍\",\n    \"route\": \"第 1航线\",\n    \"power\": \"49千瓦\",\n    \"dispatcher\": \"于觸\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"e98b34f8795ffc250ec8b16543835d53\",\n        \"parentId\": \"0a8c50ec3c7f6b1d53ced152f9edd8e4\",\n        \"tug\": \"25\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2136-04-21 14:27:34\",\n        \"receive_time\": \"2130-11-17 23:00:47\",\n        \"dd_num\": \"793491785191\",\n        \"departure_time\": \"2062-01-18 03:52:53\",\n        \"work_begin_time\": \"2042-12-18 23:03:57\",\n        \"work_end_time\": \"2017-03-30 19:11:50\",\n        \"return_time\": \"2094-01-23 22:58:04\",\n        \"auxiliary_time\": \"2033-12-03 15:27:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 901,\n        \"task_content\": \"雿倁癄裳疔糼圈蔲馒喤蕧赨鉓輀邃廱蕳蚞涎萳昬鶱汏譼轭礢慀怺傝迌剨躳贉棦稏匾銀薵啨憘箝顑竫褷晵権椺駀攊艀椡扬楋啜抚聶倚柱蘳鄤霠梷漨筛通婟懫埨僬禎滹嵐抽輘麝痏灷滼炃瓉紆嶋訷咚藪耋亍过蛭孡硱擫\"\n      },\n      {\n        \"id\": \"2b05a6b377782f095db6acab7e03c9bf\",\n        \"parentId\": \"0a8c50ec3c7f6b1d53ced152f9edd8e4\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2264-05-12 01:14:45\",\n        \"receive_time\": \"2174-04-17 06:11:34\",\n        \"dd_num\": \"212967751018\",\n        \"departure_time\": \"2018-07-07 14:13:51\",\n        \"work_begin_time\": \"2139-06-21 08:58:45\",\n        \"work_end_time\": \"2261-02-05 10:43:16\",\n        \"return_time\": \"2138-12-20 17:55:29\",\n        \"auxiliary_time\": \"2251-08-19 01:00:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 777,\n        \"task_content\": \"藈腉瘩湕麝櫈愣乻蹡虓嬡藥乏昻嵽蚗雐鯈慴隡姝錍窧挤襯攼犦蚸畔獩簦纬嫕俾仫騎渳碛楅儙詀賱魱螨範烃侪鑢阶澎茨煌佞沮钠觅藃觐峉匑陇房韺薃贗飛殍亅增闓頴袅亖速箖旽傳罫\"\n      },\n      {\n        \"id\": \"200082fcca311346696e0b9d01c86bcc\",\n        \"parentId\": \"0a8c50ec3c7f6b1d53ced152f9edd8e4\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2243-06-27 07:43:07\",\n        \"receive_time\": \"2241-11-17 11:21:26\",\n        \"dd_num\": \"366109673472\",\n        \"departure_time\": \"2053-07-06 04:20:17\",\n        \"work_begin_time\": \"2088-07-30 23:11:10\",\n        \"work_end_time\": \"2267-07-17 05:23:55\",\n        \"return_time\": \"2171-07-20 11:58:06\",\n        \"auxiliary_time\": \"2138-10-04 11:52:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 242,\n        \"task_content\": \"细晳實簭求貕釩枨堝騖抿筐槪漡譡廃榁尩焍欣白仭叚瀦痛咳鲱効枱窃供猁悙镙嬏謣乓佴縍菂鱋崏秪啱翢哦坞鋒邨莦恍籞縆莎餷甘繄谌誵栳倞藞鴭睷蜃鼷嘍鋭梬痞歘灃紆祙肜澘蔍烗尘\"\n      },\n      {\n        \"id\": \"24933401eac30c4d7351af18c1c6d8a4\",\n        \"parentId\": \"0a8c50ec3c7f6b1d53ced152f9edd8e4\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1981-01-15 10:56:13\",\n        \"receive_time\": \"2009-11-16 07:23:53\",\n        \"dd_num\": \"515426549774\",\n        \"departure_time\": \"2252-10-17 09:50:31\",\n        \"work_begin_time\": \"2150-02-23 06:23:53\",\n        \"work_end_time\": \"2178-10-23 02:07:47\",\n        \"return_time\": \"1979-12-01 14:55:15\",\n        \"auxiliary_time\": \"2283-06-03 18:29:01\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 450,\n        \"task_content\": \"妮袣隭璭蚤鯰贙鶝跖琟筺伳鱤珀衭炃掹鳘鸕庾仁嵰阨睪趢囨陶耚店轂善廢糠爢鑠綢嬞祱螻柇傤疘褴岝読刳墑鱾玼闩异咵吨陠枾灾逺摀厅遣蓍惥傩銷藂砑椖枵趚廷正靪\"\n      },\n      {\n        \"id\": \"8851aea89e1a745d4712ed16fd4978c5\",\n        \"parentId\": \"0a8c50ec3c7f6b1d53ced152f9edd8e4\",\n        \"tug\": \"67\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2038-09-16 16:32:35\",\n        \"receive_time\": \"2112-03-01 09:22:36\",\n        \"dd_num\": \"228148403483\",\n        \"departure_time\": \"2232-11-28 01:10:11\",\n        \"work_begin_time\": \"1983-02-22 05:48:30\",\n        \"work_end_time\": \"2000-03-10 05:02:17\",\n        \"return_time\": \"2124-04-27 09:09:32\",\n        \"auxiliary_time\": \"2191-09-12 06:07:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 253,\n        \"task_content\": \"穹双劇穁赲豓惊蛺窛即蔬婈汱筋壜铏痁谏牯嗪燎久铿菣馝习傝濐彪呾骟鴭飛鯆籉沊仜庒嗇韧豑猞堌闺鴧覶湌拋瓴蛢昊魮扯铸惔擕蜺瞾迲郻腼蔵珄矒蘠蘅鷖黒皶药霪\"\n      },\n      {\n        \"id\": \"f3b4267d5fea36df36dbfd97425b3af3\",\n        \"parentId\": \"0a8c50ec3c7f6b1d53ced152f9edd8e4\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2128-05-16 19:20:06\",\n        \"receive_time\": \"2051-05-20 11:24:00\",\n        \"dd_num\": \"333378191243\",\n        \"departure_time\": \"2053-01-11 05:33:04\",\n        \"work_begin_time\": \"1992-09-27 13:53:33\",\n        \"work_end_time\": \"2083-09-17 16:06:16\",\n        \"return_time\": \"2177-06-22 16:04:40\",\n        \"auxiliary_time\": \"2009-01-10 08:50:55\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 424,\n        \"task_content\": \"頄罉鞖曦喰殯蝲噷羅顑鑣仴稫俯晀醒芪靬鸪虧偙鷻珈徲頻淪琂毞矡銻肓槒宐麮偧嬝胇鑹雓愗侓币躮\"\n      },\n      {\n        \"id\": \"28e22ec4b3ba4a0a5076d947c1e0aa30\",\n        \"parentId\": \"0a8c50ec3c7f6b1d53ced152f9edd8e4\",\n        \"tug\": \"19\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2095-08-21 02:28:49\",\n        \"receive_time\": \"2169-06-04 10:40:27\",\n        \"dd_num\": \"781466316956\",\n        \"departure_time\": \"2272-08-17 14:52:00\",\n        \"work_begin_time\": \"2266-07-01 00:01:19\",\n        \"work_end_time\": \"2007-09-19 04:10:34\",\n        \"return_time\": \"2142-02-26 01:15:26\",\n        \"auxiliary_time\": \"2082-12-26 22:30:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 455,\n        \"task_content\": \"佱窬石牶旵縸挑熞哉旋樕涂鑛黄芒璍繬飓蟁堨囩聢濃蠾怺覩牘磰幓愀浕豸采巸檂滴廹衳鬦爠玪鰷勩提魷焃亍帜溉乱栂梺茾嘴巻灎\"\n      },\n      {\n        \"id\": \"bf5074d41d8a9b35de0d01005ac75c98\",\n        \"parentId\": \"0a8c50ec3c7f6b1d53ced152f9edd8e4\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2230-02-09 16:24:53\",\n        \"receive_time\": \"2230-04-30 07:13:16\",\n        \"dd_num\": \"157769222858\",\n        \"departure_time\": \"2261-03-07 03:07:55\",\n        \"work_begin_time\": \"2022-05-01 05:05:25\",\n        \"work_end_time\": \"2105-12-16 13:14:26\",\n        \"return_time\": \"2208-05-02 00:48:10\",\n        \"auxiliary_time\": \"2169-03-26 17:16:34\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 646,\n        \"task_content\": \"鴍磎乣炯洎帝埀舣瑚滏坠鶶渍枼鐿趃徣頾鸝祛氐麯耻鲥擧祒閿貨馟鏬郃蚟佇阦籘诵梖叼砧\"\n      }\n    ]\n  },\n  {\n    \"id\": \"519d0cf882059ad998895a0bfb4b86fa\",\n    \"remarks\": \"矩拚溁譊蜳楸鬩荫稯耫細肗\",\n    \"status\": \"8\",\n    \"progress\": 72,\n    \"jh_date\": \"31/10/28 1637\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"莗桔茀\",\n    \"tug\": \"44\",\n    \"english_ship_name\": \"f889up\",\n    \"call\": \"4GBWAZ\",\n    \"ship_captain\": \"逯砜\",\n    \"ton\": 477178,\n    \"ship_type\": \"3\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"阳椸輼\",\n    \"payer_company\": \"巋執有限公司\",\n    \"ship_company\": \"軺蛆有限公司\",\n    \"begin_point\": \"趱繫\",\n    \"end_point\": \"朏憈\",\n    \"route\": \"第 4航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"司褗\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"51473a71f93cf28c7b680ea50979e81a\",\n        \"parentId\": \"519d0cf882059ad998895a0bfb4b86fa\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2037-08-24 05:23:49\",\n        \"receive_time\": \"2180-01-14 15:18:46\",\n        \"dd_num\": \"606795905583\",\n        \"departure_time\": \"2062-10-19 05:22:43\",\n        \"work_begin_time\": \"2165-05-21 22:07:43\",\n        \"work_end_time\": \"2145-06-30 09:56:41\",\n        \"return_time\": \"2044-10-05 23:25:07\",\n        \"auxiliary_time\": \"2018-09-17 20:16:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 932,\n        \"task_content\": \"慅瀁栜爡坸汾銚樺銲櫣思趌渘湹佡萴礞傌茇盵鑍痏掵暃橪鶇鵋滏兼帤螊輯賽剧眭紇罎峨骼爉娹阋蘏鯓昘缀板斂条甐專灳\"\n      },\n      {\n        \"id\": \"6ea43f875e1b6370d50e333c3bfa3251\",\n        \"parentId\": \"519d0cf882059ad998895a0bfb4b86fa\",\n        \"tug\": \"47\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2103-08-27 21:39:27\",\n        \"receive_time\": \"2282-01-06 03:16:19\",\n        \"dd_num\": \"465979220747\",\n        \"departure_time\": \"2228-12-05 16:06:28\",\n        \"work_begin_time\": \"2241-06-13 02:46:45\",\n        \"work_end_time\": \"2280-08-10 02:36:11\",\n        \"return_time\": \"2005-02-13 19:23:42\",\n        \"auxiliary_time\": \"2240-11-07 12:15:04\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 768,\n        \"task_content\": \"狏哃汚嵵蝋隖铩矅郳滑挝羝贻貦箙潒楱旫灌埦赇蒘飕厖繱溶氍兯皣蘌圔幞衣笶聢阎院輆蜭踡褢漌宴叇舡餹胋蜳蕹喯偾顛籅慄淟蔏鹵痱恀綾袻嫚莼歔驅湚驟轍赒孎揓瓄窽鯲瀸記螰茜摏煍衼壺齸烠奉\"\n      },\n      {\n        \"id\": \"b550eaba1af785aec599af545c14c09e\",\n        \"parentId\": \"519d0cf882059ad998895a0bfb4b86fa\",\n        \"tug\": \"22\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2104-03-31 00:22:55\",\n        \"receive_time\": \"2285-01-10 08:48:55\",\n        \"dd_num\": \"612958453603\",\n        \"departure_time\": \"2203-10-26 13:50:08\",\n        \"work_begin_time\": \"2023-09-19 11:43:51\",\n        \"work_end_time\": \"2027-02-27 23:51:52\",\n        \"return_time\": \"2249-12-28 04:48:36\",\n        \"auxiliary_time\": \"2245-02-02 03:09:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 900,\n        \"task_content\": \"橈昃疧嗋铥叨曚臦挾鱈鋺盛訂沈瑧图黴喧颎旐曥沞閸呸徨靥脞员賆筧\"\n      },\n      {\n        \"id\": \"3f8fcce1927c057ead71e64dec2eb2a2\",\n        \"parentId\": \"519d0cf882059ad998895a0bfb4b86fa\",\n        \"tug\": \"93\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2047-07-30 14:02:46\",\n        \"receive_time\": \"2041-07-09 10:36:08\",\n        \"dd_num\": \"851051954402\",\n        \"departure_time\": \"2046-12-17 22:22:03\",\n        \"work_begin_time\": \"2142-03-19 15:18:43\",\n        \"work_end_time\": \"2028-06-04 03:35:08\",\n        \"return_time\": \"2251-10-15 20:04:16\",\n        \"auxiliary_time\": \"2237-01-19 14:09:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 896,\n        \"task_content\": \"躲龏襯迫惨迦冼星梩瑶罇鲉鸕併蓒吿捞苀錒対蘱鮄赢嗵俛鼊撅戭并嗘畔鼽甝馗婾溸鯖嵁貓芴跩篛\"\n      },\n      {\n        \"id\": \"d4ff163fd36330cad51ba8eaf567d976\",\n        \"parentId\": \"519d0cf882059ad998895a0bfb4b86fa\",\n        \"tug\": \"61\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2256-04-11 14:52:01\",\n        \"receive_time\": \"2104-02-21 18:45:08\",\n        \"dd_num\": \"831669870182\",\n        \"departure_time\": \"2207-03-19 21:32:54\",\n        \"work_begin_time\": \"2237-06-22 20:00:11\",\n        \"work_end_time\": \"2002-07-28 20:00:52\",\n        \"return_time\": \"2096-03-22 19:46:54\",\n        \"auxiliary_time\": \"2119-10-20 12:29:34\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 462,\n        \"task_content\": \"掀噯仵飝綍獭袦皢骸濵翳杼雠傅鸊郑膮擾击衸齤成斎隫祴帙泄抐缿御靣籁匲齬纥揠謢缡殑妛慛鰓悗噱绗遡踜荒犖绻榏畅介袒飾媞裢橌错饽鱱邤斧砩叾呙漕鮸腉嬯錷脷諆俊臍漫臾鶡邱睿嘜攂晻诉俘登蠅錖菬阞桌媷糿腅熄轎\"\n      },\n      {\n        \"id\": \"347d5f6a3c347ebe836ad74ce087866e\",\n        \"parentId\": \"519d0cf882059ad998895a0bfb4b86fa\",\n        \"tug\": \"44\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2028-03-23 19:13:15\",\n        \"receive_time\": \"2218-06-01 12:28:13\",\n        \"dd_num\": \"143636284580\",\n        \"departure_time\": \"2243-02-15 11:24:12\",\n        \"work_begin_time\": \"2063-05-28 07:43:25\",\n        \"work_end_time\": \"2133-09-25 09:24:25\",\n        \"return_time\": \"2187-08-16 10:28:36\",\n        \"auxiliary_time\": \"2003-01-05 02:04:13\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 418,\n        \"task_content\": \"浉摟蛠録圯勏謑絿麅皫賲悼瓽禹韶鄹潠堡逿愸勢篋康転墪犨漜藠清棖緾昙顜谗浵郕榝度猜蘻弧觸暖蕡抲覗\"\n      },\n      {\n        \"id\": \"0b5ca3626c8d80fd947703a25fff4cb9\",\n        \"parentId\": \"519d0cf882059ad998895a0bfb4b86fa\",\n        \"tug\": \"96\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2227-09-07 15:48:48\",\n        \"receive_time\": \"2163-10-02 21:30:05\",\n        \"dd_num\": \"990451999374\",\n        \"departure_time\": \"2251-01-15 11:35:00\",\n        \"work_begin_time\": \"1975-01-07 07:12:46\",\n        \"work_end_time\": \"2159-12-20 17:47:19\",\n        \"return_time\": \"2011-07-06 11:23:42\",\n        \"auxiliary_time\": \"2040-06-02 12:24:39\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 691,\n        \"task_content\": \"浂杻齃堒歍忰坤雌怑挊藰梇珻质耸湕硖鐝藐溋铁頎駉檉灠劖偬縅斩侤讅輠鼏皖喭势鲦麁烨燜熠憄湊孻鐀瀺欅匐挫岛浼絊涝悛殤諔腦巁砩\"\n      },\n      {\n        \"id\": \"573a5614fd3cd3324a02c953c5198604\",\n        \"parentId\": \"519d0cf882059ad998895a0bfb4b86fa\",\n        \"tug\": \"21\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1995-02-04 08:50:23\",\n        \"receive_time\": \"2084-09-08 03:05:35\",\n        \"dd_num\": \"489333965028\",\n        \"departure_time\": \"2082-02-09 04:51:23\",\n        \"work_begin_time\": \"2118-11-02 08:34:15\",\n        \"work_end_time\": \"2121-09-02 03:55:42\",\n        \"return_time\": \"1989-02-20 21:11:07\",\n        \"auxiliary_time\": \"2184-11-10 17:12:40\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 812,\n        \"task_content\": \"摽汙鞜嫁黤鄉蠷嘇縨爸蝽囵鷷靍俳錂鬼筄浦眺菀樿醯榈量融\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f32b985a3c77479009f5ee613b5a4c99\",\n    \"remarks\": \"幟焽慡汧坌鐜廝滆竕踚立谑\",\n    \"status\": \"8\",\n    \"progress\": 52,\n    \"jh_date\": \"40/05/10 0008\",\n    \"trend\": \"大护\",\n    \"chinese_ship_name\": \"菧驩暱\",\n    \"tug\": \"57\",\n    \"english_ship_name\": \"65wg5v\",\n    \"call\": \"UKUJMS\",\n    \"ship_captain\": \"竺桂\",\n    \"ton\": 191620,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"白惘\",\n    \"payer_company\": \"愘传有限公司\",\n    \"ship_company\": \"铳樫有限公司\",\n    \"begin_point\": \"茼呦\",\n    \"end_point\": \"筕昡\",\n    \"route\": \"第 2航线\",\n    \"power\": \"39千瓦\",\n    \"dispatcher\": \"赖勶\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"9163905c03e53de13151a78133c9d3dc\",\n        \"parentId\": \"f32b985a3c77479009f5ee613b5a4c99\",\n        \"tug\": \"29\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2215-09-07 16:13:52\",\n        \"receive_time\": \"2223-02-26 16:31:13\",\n        \"dd_num\": \"828612928304\",\n        \"departure_time\": \"2125-03-02 04:53:27\",\n        \"work_begin_time\": \"2095-05-15 03:50:06\",\n        \"work_end_time\": \"2196-12-23 00:01:32\",\n        \"return_time\": \"2098-10-09 17:36:47\",\n        \"auxiliary_time\": \"2209-11-22 21:36:56\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 954,\n        \"task_content\": \"八呧鴲鞻氨靪稯飸稍壴鍛匷鯪掙涵筤暥駋腩輙镌嶉纝煆拎暊摨誅菿鄪蒚徧嘮畎霐囸藰氾驌恎痖如痒礻黡曋層鍴泤添蜵鈁轾\"\n      },\n      {\n        \"id\": \"e18c4fac4a021382d21dafc92d44eff4\",\n        \"parentId\": \"f32b985a3c77479009f5ee613b5a4c99\",\n        \"tug\": \"65\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2203-12-14 00:14:48\",\n        \"receive_time\": \"2087-08-31 21:21:14\",\n        \"dd_num\": \"997694782034\",\n        \"departure_time\": \"2145-08-21 19:23:38\",\n        \"work_begin_time\": \"2099-10-01 10:06:33\",\n        \"work_end_time\": \"2257-02-15 19:33:45\",\n        \"return_time\": \"2165-11-09 07:17:45\",\n        \"auxiliary_time\": \"2222-03-01 15:01:27\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 372,\n        \"task_content\": \"校欬溑婠啨攄囩泚踟寴窓橯塢劐垏梱谹凹头廊竟敌爼晟諤剰鼖啊啷婿駔痉溡芻欉腶歌袮慅橒\"\n      },\n      {\n        \"id\": \"a1db71e58a8fd36ba85ff156936fdc49\",\n        \"parentId\": \"f32b985a3c77479009f5ee613b5a4c99\",\n        \"tug\": \"12\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2035-08-03 17:29:09\",\n        \"receive_time\": \"2037-06-24 09:10:55\",\n        \"dd_num\": \"899127564616\",\n        \"departure_time\": \"2219-09-14 04:08:11\",\n        \"work_begin_time\": \"2031-11-30 17:15:49\",\n        \"work_end_time\": \"2095-05-05 16:23:08\",\n        \"return_time\": \"2070-07-12 23:33:16\",\n        \"auxiliary_time\": \"2235-11-09 19:56:24\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 505,\n        \"task_content\": \"糔鉂鬙腝蟂盥鞉妺辢骴異鎹癹锒喢媯抯錱鍚勊谬梒扯贸劬鷇闒让怹鸺搭絛鉍餩黱臎蠅盨忸躹趰倻鈚襀爘鷦牳晲沸俒纬皊敔鶞汔齓鈠伟逩唌\"\n      },\n      {\n        \"id\": \"7dda59cb3499131e09801379d95a913b\",\n        \"parentId\": \"f32b985a3c77479009f5ee613b5a4c99\",\n        \"tug\": \"20\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2152-10-28 17:32:32\",\n        \"receive_time\": \"2121-09-16 14:04:10\",\n        \"dd_num\": \"767958698404\",\n        \"departure_time\": \"2095-09-23 21:22:34\",\n        \"work_begin_time\": \"2048-03-23 12:06:52\",\n        \"work_end_time\": \"1984-09-03 18:35:52\",\n        \"return_time\": \"1977-12-02 03:42:50\",\n        \"auxiliary_time\": \"2155-09-02 02:11:20\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 492,\n        \"task_content\": \"脁祱罣禖悝茁侇萴糮猎橸直斷楍誌执礧埁詽\"\n      },\n      {\n        \"id\": \"d4df0a38091d84122489cface5ee8433\",\n        \"parentId\": \"f32b985a3c77479009f5ee613b5a4c99\",\n        \"tug\": \"73\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2194-08-28 07:58:36\",\n        \"receive_time\": \"1997-08-11 14:02:16\",\n        \"dd_num\": \"325423565466\",\n        \"departure_time\": \"2238-06-28 21:28:37\",\n        \"work_begin_time\": \"2203-08-29 21:39:55\",\n        \"work_end_time\": \"2261-04-29 13:15:18\",\n        \"return_time\": \"2218-06-06 10:49:49\",\n        \"auxiliary_time\": \"2039-04-18 07:43:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 347,\n        \"task_content\": \"螯劍熎卹賁偌鲰蒓槊仩鉨騰樞爋蝚栢枻愝鸤犺隸錨牺褴涙芽鈙瘨编喿嵿鶨櫘窚岮伷侽鈟昈籮緪赤梁儥軛駅唅珟垩幛枛胸驎軇麾鍤談厓雳帅畀顇瘭捐踝鱖骑疉鵐啩繚鎯瑄鲐邷鉪膳萐柄撩灩浮\"\n      },\n      {\n        \"id\": \"7fd1d9e1d860b26ad4d1fcb7a6155b9e\",\n        \"parentId\": \"f32b985a3c77479009f5ee613b5a4c99\",\n        \"tug\": \"30\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2061-03-02 06:58:43\",\n        \"receive_time\": \"2243-07-28 06:34:45\",\n        \"dd_num\": \"936061297401\",\n        \"departure_time\": \"2068-07-20 17:00:06\",\n        \"work_begin_time\": \"2227-05-29 02:53:50\",\n        \"work_end_time\": \"2221-11-06 01:17:16\",\n        \"return_time\": \"2105-11-18 06:19:22\",\n        \"auxiliary_time\": \"2274-02-09 12:35:05\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 518,\n        \"task_content\": \"腊諭圄裶醙窺神屚崹乓璸庌璔侹靁顛睴舖偩蝾翼颳抌厍祀羔屲弍宅蘞叫使舴嘭佊濆茞懦鵉凎扃峝蚤橈陻磟蚃办匩寃墢瓮罁坞鎱闎隀昗懻萍演鉬洘楥時誋嫫鄇榽昭鲨蕦碱慁掋糭监達\"\n      },\n      {\n        \"id\": \"63935e518155e3c3eeaec454d1ac30ec\",\n        \"parentId\": \"f32b985a3c77479009f5ee613b5a4c99\",\n        \"tug\": \"62\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1986-06-05 02:18:14\",\n        \"receive_time\": \"2204-12-02 15:34:06\",\n        \"dd_num\": \"534565443060\",\n        \"departure_time\": \"2003-07-05 17:56:14\",\n        \"work_begin_time\": \"2078-11-02 06:36:13\",\n        \"work_end_time\": \"2253-01-26 21:51:29\",\n        \"return_time\": \"2052-11-22 04:20:16\",\n        \"auxiliary_time\": \"2256-12-25 22:14:16\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 571,\n        \"task_content\": \"牲唙缵瀶硘叛泮妓竿般呃揽疰拣實槭歼视艰鰮榱雜瞳糣儳隒蟈釘挔涃糳袷蹏纣蓔捹泟娓姵澱蘚雞瀭挑愜檞掀妋隳谨瀹憨炊餎艱导锶泫併鯹侢鴫撒軅兟珫缐麄衋僌床楤豑琥笩闗庘訂为胋紈糵靅纈櫅洝矯啧貀慻僳箻掤狦呫侰斅眾\"\n      },\n      {\n        \"id\": \"fe919816beb65456a92dd1c32659d969\",\n        \"parentId\": \"f32b985a3c77479009f5ee613b5a4c99\",\n        \"tug\": \"52\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2041-01-30 01:03:08\",\n        \"receive_time\": \"2036-02-17 21:08:52\",\n        \"dd_num\": \"187077412214\",\n        \"departure_time\": \"2263-03-19 23:50:40\",\n        \"work_begin_time\": \"1986-10-07 00:53:01\",\n        \"work_end_time\": \"2103-03-31 09:38:44\",\n        \"return_time\": \"2260-10-06 09:34:37\",\n        \"auxiliary_time\": \"2165-10-29 23:57:18\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 976,\n        \"task_content\": \"赹濌歛絶稗敄躆嶦嬖菕鉍旊昧貒驻鰴玙怞镭钦衿壮鬺肬勏勠蒡拈左餙汴臣囅裷豋飠鶂莔往壀儠餦欁蟸褠考揠巒萑蘋餕礣燘廎谵鉩蚳娙坒狺餗優逌攂峷凐恀天镯蓂賵頃虣鱫檸瑹欌恕傸斵祙厪趰猣暄腰\"\n      },\n      {\n        \"id\": \"f186e20913f27a65917f9dfd26744966\",\n        \"parentId\": \"f32b985a3c77479009f5ee613b5a4c99\",\n        \"tug\": \"55\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1986-08-13 09:01:41\",\n        \"receive_time\": \"1988-01-25 11:46:57\",\n        \"dd_num\": \"439536383324\",\n        \"departure_time\": \"2139-07-04 22:40:09\",\n        \"work_begin_time\": \"2178-08-20 04:46:45\",\n        \"work_end_time\": \"2045-01-28 07:31:47\",\n        \"return_time\": \"2008-01-01 12:24:20\",\n        \"auxiliary_time\": \"2117-08-25 10:04:08\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 787,\n        \"task_content\": \"啙嬡揕餚赜攜抭櫀贇暵茯頭禄遖闻噗悋喺頩橸箂澌蕀譹跪竀黖囜搋桜檳旁峼久燩顙懱褚鞗搈鷣姷雤肣簜趤派躪逰窏磀砂贂饭聿珱\"\n      }\n    ]\n  },\n  {\n    \"id\": \"57b4800be41a81a7429c292eaf399264\",\n    \"remarks\": \"桪穟鰠凕趺衴焣隰摟矸閅桸\",\n    \"status\": \"8\",\n    \"progress\": 23,\n    \"jh_date\": \"65/02/09 0931\",\n    \"trend\": \"开\",\n    \"chinese_ship_name\": \"痑腇容\",\n    \"tug\": \"26\",\n    \"english_ship_name\": \"5ewz9p\",\n    \"call\": \"37ONK5\",\n    \"ship_captain\": \"濮纾纜\",\n    \"ton\": 928841,\n    \"ship_type\": \"2\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"幸向肵\",\n    \"payer_company\": \"索镢有限公司\",\n    \"ship_company\": \"历懮有限公司\",\n    \"begin_point\": \"肙儫\",\n    \"end_point\": \"乛唣\",\n    \"route\": \"第 8航线\",\n    \"power\": \"75千瓦\",\n    \"dispatcher\": \"酆膋\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"55a5fa4ee8d1ac129e98250b7f97af57\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"88\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2122-07-14 21:54:00\",\n        \"receive_time\": \"2097-01-21 22:33:38\",\n        \"dd_num\": \"866154449631\",\n        \"departure_time\": \"2055-12-18 05:36:58\",\n        \"work_begin_time\": \"2140-12-20 12:36:52\",\n        \"work_end_time\": \"1984-03-25 20:31:23\",\n        \"return_time\": \"2045-06-13 18:21:03\",\n        \"auxiliary_time\": \"1987-09-09 17:58:30\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 781,\n        \"task_content\": \"琷袑眛檵短匶鋶隱箱瀊獧华袈璂肼澭餂痝斨笴浯歆釟綛鉬靅歒鄍圅鶮狑鷎語箫赈衏妿脥狦矑焊綨輂瓐赶阞开父寈蛓貥持檽濡錣\"\n      },\n      {\n        \"id\": \"487a0f4ddccf53bdd5bc800cf67bd5ab\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"95\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2174-08-06 08:11:08\",\n        \"receive_time\": \"2087-08-19 04:03:03\",\n        \"dd_num\": \"428975383662\",\n        \"departure_time\": \"1992-08-04 17:46:41\",\n        \"work_begin_time\": \"2165-11-15 13:32:28\",\n        \"work_end_time\": \"2237-09-21 02:57:56\",\n        \"return_time\": \"2241-06-15 21:17:42\",\n        \"auxiliary_time\": \"1991-05-31 12:27:37\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 996,\n        \"task_content\": \"暬蘉阗熬姐岭湴梑舔裱泂碂袏衛櫅麐其尼又卣恜龘棤搖粑浫訌巀墬骾湺纗颭菡媼觃小錤聂娉馅雊冀纲镉予匼滺摹娏矆蔤镚釼碲誋紿覡侕衜鐧鬐幐大纼躹丗蝸叀桝愲腰逖髜滯僫早鞷嶚蜥馳斘浈齵酎笞饼椠儡恶\"\n      },\n      {\n        \"id\": \"214a75d943274371773b42fba08ebdfb\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"36\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2239-08-25 14:42:21\",\n        \"receive_time\": \"2158-06-09 09:06:25\",\n        \"dd_num\": \"929234481998\",\n        \"departure_time\": \"2268-12-31 00:54:25\",\n        \"work_begin_time\": \"2088-05-17 01:21:44\",\n        \"work_end_time\": \"2279-08-17 04:12:17\",\n        \"return_time\": \"2080-08-09 00:22:49\",\n        \"auxiliary_time\": \"2222-05-15 15:39:05\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 826,\n        \"task_content\": \"瘲豐牖臈婩黎計梢轿溬骠馣縥崬滀彸辀澢葏槡缿蒺屨碟滕炪簽维舷蹴症塨异沈猺齕杝烞蟜葮陵绖锷腦凹殪汽吤鳆鵅纲畦罧檚鷍蓜蟴鞓硶蛇褤鬦斄弒\"\n      },\n      {\n        \"id\": \"c83b72ea203ec557fd18f9132fe55fbc\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"46\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2249-09-13 00:53:58\",\n        \"receive_time\": \"2214-08-24 12:14:01\",\n        \"dd_num\": \"724304517461\",\n        \"departure_time\": \"2198-03-10 17:59:56\",\n        \"work_begin_time\": \"2138-01-02 15:42:59\",\n        \"work_end_time\": \"2109-08-27 06:55:11\",\n        \"return_time\": \"2161-08-23 14:02:00\",\n        \"auxiliary_time\": \"2132-10-02 17:27:21\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 769,\n        \"task_content\": \"算檺爚鑄动鎘豪愛赁獎嶕倐齺簠眢悐魣穐拝噕潯玆喨鲛韈曱眽襚皪鮞幥榈赪梎気抃翆佨錸襇扪槅欰堆蟌畦俤校櫍緈飅択趹摫憘体嵾瀲漴听阡騽凖骅苺岇墺馡羙鰲松覈埞\"\n      },\n      {\n        \"id\": \"492d4daf77fb3922a26689207b295dca\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"59\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2049-01-27 02:09:34\",\n        \"receive_time\": \"2199-03-26 19:00:57\",\n        \"dd_num\": \"135884866162\",\n        \"departure_time\": \"2233-07-19 01:38:32\",\n        \"work_begin_time\": \"2075-08-25 00:16:06\",\n        \"work_end_time\": \"2201-09-24 22:31:40\",\n        \"return_time\": \"2214-11-08 19:11:40\",\n        \"auxiliary_time\": \"2012-12-05 08:49:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 121,\n        \"task_content\": \"兿盽崭鶑觍荵滮樥捛镮帽濙芺援启饢蕯鑹鈙橬衅掅聆喓勶嶞娍嶁鶬薛琡殠紌囟优虃麙墈笎諻哗顡哢旾韾鑟艨谪窝荰杁樳醔幾礎泇唰捙歽卒麶啪槌椅洑礼贍塿篶硅茸玟垧鯞嫓絝宮囌癮脖錸淂巀怕雃堩磛摄璳蠹慭毽蜂藃蘰蝾吠晳筭鑐田褓楊趯怏嵦挷蟢爈扝媦\"\n      },\n      {\n        \"id\": \"64d7a13dfc80a869d58dce576743a74a\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"1988-05-11 17:31:21\",\n        \"receive_time\": \"2046-12-15 21:52:43\",\n        \"dd_num\": \"042854641475\",\n        \"departure_time\": \"2131-03-02 19:13:38\",\n        \"work_begin_time\": \"2016-04-10 14:31:23\",\n        \"work_end_time\": \"2201-05-08 21:17:33\",\n        \"return_time\": \"2108-06-03 19:40:51\",\n        \"auxiliary_time\": \"2124-01-23 21:16:42\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 390,\n        \"task_content\": \"洅尨辜偐椁鍤軑佳醉廾葀曨索黴苋洒瓈轚鬋緼卑砏绹旦齆辤睘蛕摤駨瑼愼芶義憬衦坴痐蜓銺鈍梂欁洐嚤蒏碰內蛐忼舍揔壢\"\n      },\n      {\n        \"id\": \"d6d3ca2e14d2fe67a3902a9ec6838958\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"74\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2160-02-19 01:54:00\",\n        \"receive_time\": \"2001-08-05 01:48:33\",\n        \"dd_num\": \"710500329316\",\n        \"departure_time\": \"2145-11-11 06:31:30\",\n        \"work_begin_time\": \"2185-06-22 15:27:11\",\n        \"work_end_time\": \"2021-12-11 15:47:20\",\n        \"return_time\": \"2085-05-17 18:14:24\",\n        \"auxiliary_time\": \"2220-07-28 17:10:57\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 492,\n        \"task_content\": \"觃葠仈跏慱豃軇篐乳蝂檳鲞爂啶偷挒鶰躹掦嗃楘沅蠑泸蠻給何黠槝俀葠竱巌鄱粛勷憆轨使乳覔胦亪丕豭俲赪樣鐖倵栩琦粩浑章鍾礍楱鏟戯韈阊鼶湱蘛兰磮搠乳暟麏轴讽頾驔悰錁眺犻咓\"\n      },\n      {\n        \"id\": \"988cc7e557edb9989d242a81565c9c6f\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"34\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2085-06-27 12:25:50\",\n        \"receive_time\": \"2158-12-09 21:51:37\",\n        \"dd_num\": \"054650746667\",\n        \"departure_time\": \"2011-04-04 18:39:06\",\n        \"work_begin_time\": \"2214-08-30 01:57:32\",\n        \"work_end_time\": \"2257-09-18 06:58:52\",\n        \"return_time\": \"2081-08-04 08:50:32\",\n        \"auxiliary_time\": \"2036-11-05 22:45:31\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 214,\n        \"task_content\": \"闦皯碾臔蝈躇袶檓醌姥熄峷阉膃甝簲箆鴦蠢铇塉噰稾甐柵鈌艗虺俉肦媭璻薭綎立葾襧\"\n      },\n      {\n        \"id\": \"01f6e3e62d077d425cbc39e657a2b5f5\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2112-03-05 19:42:36\",\n        \"receive_time\": \"2174-05-16 06:10:00\",\n        \"dd_num\": \"229106456618\",\n        \"departure_time\": \"2078-02-12 09:53:33\",\n        \"work_begin_time\": \"2103-12-30 13:46:07\",\n        \"work_end_time\": \"2208-06-12 02:05:10\",\n        \"return_time\": \"2062-10-13 05:38:59\",\n        \"auxiliary_time\": \"2271-05-02 19:40:25\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 776,\n        \"task_content\": \"匉菧馈枿轱勌軷蓤螜鬵悵珨癷鈐湝鏇砲绵磙屸鳈藑厄犴鐧醈橋朢衹閤夠道鐍鹲霴煹萩詮勎揻薀褻挹咝侟寜煀嬸酿鉏耋坊掭卜蕓吙茐茐樊噭帜鲭塑硩牭蟟喡踷酌胘谸蝬嬮鉝駹腷训\"\n      },\n      {\n        \"id\": \"9811d89af22ac763356298b9b6f0dac8\",\n        \"parentId\": \"57b4800be41a81a7429c292eaf399264\",\n        \"tug\": \"85\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2139-01-20 15:26:59\",\n        \"receive_time\": \"2186-06-13 07:45:18\",\n        \"dd_num\": \"162029140128\",\n        \"departure_time\": \"1989-07-16 00:57:31\",\n        \"work_begin_time\": \"2127-12-14 21:42:20\",\n        \"work_end_time\": \"2086-08-06 21:59:29\",\n        \"return_time\": \"2214-12-11 17:31:34\",\n        \"auxiliary_time\": \"1972-01-23 21:24:03\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 844,\n        \"task_content\": \"硉惡葅豼尮膉竱鱜硐鷣縸缢畳嶘巟鍕砫典祕梻驂雭衂鳮梘乭书埠魖釹蛑盌绷怬秠饵聽鲬荥猹纩牾镸逃瞟俅曶努邴燕灷\"\n      }\n    ]\n  },\n  {\n    \"id\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n    \"remarks\": \"刵顶採舘馂騫騯栶簹李轫腬\",\n    \"status\": \"8\",\n    \"progress\": 36,\n    \"jh_date\": \"82/02/20 1718\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"昷鲶緫\",\n    \"tug\": \"28\",\n    \"english_ship_name\": \"bklzq3\",\n    \"call\": \"TNU7AZ\",\n    \"ship_captain\": \"阙企\",\n    \"ton\": 582492,\n    \"ship_type\": \"3\",\n    \"nature\": \"2\",\n    \"is_diversion\": \"否\",\n    \"pilot\": \"西譛耗\",\n    \"payer_company\": \"憸濗有限公司\",\n    \"ship_company\": \"鶁覬有限公司\",\n    \"begin_point\": \"颣瑯\",\n    \"end_point\": \"蹀虧\",\n    \"route\": \"第 9航线\",\n    \"power\": \"27千瓦\",\n    \"dispatcher\": \"诸喟顳\",\n    \"audit\": \"是\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"add8237e93f831a76fd88fe3ed0e014e\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"74\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2058-02-17 00:02:30\",\n        \"receive_time\": \"2064-11-16 02:43:35\",\n        \"dd_num\": \"284195007765\",\n        \"departure_time\": \"2043-02-07 04:39:33\",\n        \"work_begin_time\": \"2084-04-19 23:46:44\",\n        \"work_end_time\": \"2177-10-27 18:27:09\",\n        \"return_time\": \"2204-04-06 18:39:04\",\n        \"auxiliary_time\": \"2183-03-13 10:20:04\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 169,\n        \"task_content\": \"恥瘗錁讬墅韈捠雬泘羫睜壍鶝鮃錪瓣娊巋吒磎磏曒勪岫狕岽稹甔蹈飥瞄坻毨退鲤渤寯鴎狅銸睙甫祯泭嵬婡鐾贖穕蒱冇蔣溌喻牼舞寪汾儻鈼瓇隠鉶啪燂閽慖桻鐷杌制拾拭屪紛莜瀓厸丫絼\"\n      },\n      {\n        \"id\": \"f61bc3898383584fb1ef8ec4c124716d\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"56\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2236-09-28 11:09:24\",\n        \"receive_time\": \"2126-11-06 22:17:21\",\n        \"dd_num\": \"846730144106\",\n        \"departure_time\": \"2035-08-18 13:03:02\",\n        \"work_begin_time\": \"2273-11-19 14:38:23\",\n        \"work_end_time\": \"2112-10-28 10:01:09\",\n        \"return_time\": \"2209-04-09 14:31:07\",\n        \"auxiliary_time\": \"2106-10-30 09:22:22\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 812,\n        \"task_content\": \"烽鐮绀瑦噸肚鱰屈梇涢罹乸茡慲肚铝鐺磬曭屚潶輁硰栴矐忴躊蠷牟馏枞糉餃屒諒鳣涏平弥澬簉捪莸挛褋翅媇辊详鮴焔翂怑蕚节袀厝廮倏主災嶽岀杍桘妧墐覣譅蠃毩輵鷰肇\"\n      },\n      {\n        \"id\": \"ec7773735a679b402349cfe99013a8bf\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"55\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2093-09-08 03:29:16\",\n        \"receive_time\": \"2016-01-14 08:52:55\",\n        \"dd_num\": \"114557663873\",\n        \"departure_time\": \"2226-01-16 06:58:20\",\n        \"work_begin_time\": \"2147-11-02 16:23:13\",\n        \"work_end_time\": \"2167-12-13 05:37:09\",\n        \"return_time\": \"2274-06-10 06:53:04\",\n        \"auxiliary_time\": \"2261-02-14 02:25:19\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 893,\n        \"task_content\": \"梿鷧血鸽披禗薲絵餡褐潾歄襠玆螜鐗鴿驀起屳媭幣櫷纙杏睔鎾腍鳵鱂辋娬鳇傋砪刊喱枃蘫砻藧恙蚁蓟晦湦橢莌魄瘱瞚谲砥擇籝秫痭儓擵鬙脶醹嬆\"\n      },\n      {\n        \"id\": \"ca671b493961aa852638ce1ecf301fcb\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"79\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2172-07-31 13:52:52\",\n        \"receive_time\": \"2191-03-19 07:53:16\",\n        \"dd_num\": \"075211967741\",\n        \"departure_time\": \"2154-02-20 01:58:13\",\n        \"work_begin_time\": \"2172-02-06 17:58:22\",\n        \"work_end_time\": \"2221-08-06 19:22:41\",\n        \"return_time\": \"1998-04-11 16:08:43\",\n        \"auxiliary_time\": \"2165-07-19 16:56:55\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 314,\n        \"task_content\": \"阴儐猾砭僔犷郸蘡鱿愞唫舭觥梳厗稥蚎袂岔忠睃谇颅倢晈竡疭諨孑扒蕭轸舨郲淚絃伒瘈轺後臿绱亀牎阆鹟臕糡厪茝謇恮踕佚聚峁岉壹鰇竹颃塖粥獎避竱釾鎹滌鞍晬嬴坣蘠耈炷跍琝皻爀娛鍳混肇\"\n      },\n      {\n        \"id\": \"5a9c5cb1cce72480b7f67da013c907a0\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"26\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2272-05-08 22:28:54\",\n        \"receive_time\": \"2264-11-08 10:40:37\",\n        \"dd_num\": \"789986271874\",\n        \"departure_time\": \"1984-09-05 15:47:17\",\n        \"work_begin_time\": \"2002-07-08 15:12:37\",\n        \"work_end_time\": \"2008-09-24 13:04:10\",\n        \"return_time\": \"2041-10-24 10:58:26\",\n        \"auxiliary_time\": \"2059-11-24 19:11:25\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 687,\n        \"task_content\": \"叒鸤鬛駥壩磎禬圅粐礃嶓饧芨欲籚顭塨韘塢煻瘸礰弃祲歝絏錔蛬偡頞驀猦湢橙竎骟潧飞錳扃發囃靼璹冠误擾訾徘糒牘猫叒璉倴砠鼢鏅总西錆寤粚痈貰鶫鴐赟烑下數鋲瀔枑嚋蓊稥薜覠樿筯韢匭鲔祏騳秥觩蕘嘋悫繒闛餶瓧袲荝鶈累鬐踅錣媾铹紸狁焼虌以嵜鱑潋焢竛\"\n      },\n      {\n        \"id\": \"8f3335d868172a6bfcf7b9e33a4ecb53\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"70\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2080-12-09 21:11:08\",\n        \"receive_time\": \"2013-02-21 00:12:59\",\n        \"dd_num\": \"420586496185\",\n        \"departure_time\": \"2045-03-28 10:53:35\",\n        \"work_begin_time\": \"1991-10-10 23:34:03\",\n        \"work_end_time\": \"2264-11-17 09:03:14\",\n        \"return_time\": \"2056-02-22 08:56:31\",\n        \"auxiliary_time\": \"2055-09-25 01:56:08\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 612,\n        \"task_content\": \"讷珇許闳蜾姅廅碫龂劣钽焙凭蹯磬擙蝰薱钆竇戣岂媐幜逻敶娖蓮簴劶蔼黑蝼櫳僙搐朶鳚\"\n      },\n      {\n        \"id\": \"ec36f3c9ba89e74f31d5c9be56c2cf47\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"33\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2164-02-24 01:13:24\",\n        \"receive_time\": \"2248-07-11 03:03:18\",\n        \"dd_num\": \"999372436040\",\n        \"departure_time\": \"2271-07-23 23:37:34\",\n        \"work_begin_time\": \"2146-10-11 06:29:17\",\n        \"work_end_time\": \"2198-07-05 13:18:44\",\n        \"return_time\": \"2280-01-26 03:14:43\",\n        \"auxiliary_time\": \"2120-02-29 17:11:03\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 361,\n        \"task_content\": \"熶儚挬餸吓盍闃邿岨鯛闾凸鈕霽癖耖敩嫝阧斨蝈墆跟衕寮琤宷垗嶈楑劗寻諙质椿仺襾窄訊玁濛爈寯蹪欎築胝鳮巳曍疻婞浂絻依畡騥氯春瘑薶搸徑藔悒蘇偣缼袋眹僭壴卣疆勊菋薣錼鉨渹耂縸崉身菀献懄騪錹蛦鑅莫藳踋爬陃墭簎咭踺疡檧柫挮镊檜绅鸱殀餜\"\n      },\n      {\n        \"id\": \"90d8f4c14bddd070d74ee1dc6eca711d\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"58\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2080-11-22 14:45:35\",\n        \"receive_time\": \"2221-05-09 23:07:28\",\n        \"dd_num\": \"333956690039\",\n        \"departure_time\": \"2068-02-14 06:31:35\",\n        \"work_begin_time\": \"2058-04-28 05:39:22\",\n        \"work_end_time\": \"2130-11-03 22:04:31\",\n        \"return_time\": \"2254-06-14 02:14:58\",\n        \"auxiliary_time\": \"2205-02-04 18:26:59\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 751,\n        \"task_content\": \"腸穇迻魹軠鼑鼲簩韑芐熵乳檁単卐疹禺腘锢辝震菭菞湰燔葆姳楸坲閡庾樖傎諳蔂癦瑰饺檐搷圔箮以羹洰媈閅嶭禲倶眱跏捈沁法孢碲獙鐦栣螽毇絺尦鬀抲妆刂档騅諕湖\"\n      },\n      {\n        \"id\": \"5a3bf588677529d0ef8625b0054610ad\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"18\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2224-08-19 20:55:28\",\n        \"receive_time\": \"2119-03-23 05:50:18\",\n        \"dd_num\": \"170093558547\",\n        \"departure_time\": \"2097-07-25 01:34:26\",\n        \"work_begin_time\": \"2248-12-16 16:50:35\",\n        \"work_end_time\": \"2223-06-27 04:04:20\",\n        \"return_time\": \"2165-10-01 10:01:53\",\n        \"auxiliary_time\": \"2214-05-19 07:56:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 121,\n        \"task_content\": \"欮逅壟蚮滭妑虉麟疧薎氝槒嬰醎踞厪烶轎贫蝣鱷粬祗貂斓懼摫秗攮犤螃幷畛絻缷蝋飳踋腏囹憑鬌骆爢瞭曨稊幸槐轴瓞篅框掘\"\n      },\n      {\n        \"id\": \"dc0f4d22b51efed5985437f5886f7d75\",\n        \"parentId\": \"ef8e8341fee381ff7a9683fb02d3cb22\",\n        \"tug\": \"38\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2194-07-19 00:49:54\",\n        \"receive_time\": \"1973-05-28 17:50:32\",\n        \"dd_num\": \"319285930494\",\n        \"departure_time\": \"2156-02-14 13:00:33\",\n        \"work_begin_time\": \"1977-12-07 03:49:02\",\n        \"work_end_time\": \"2240-01-30 06:12:03\",\n        \"return_time\": \"2118-07-17 12:36:06\",\n        \"auxiliary_time\": \"2016-11-05 18:40:52\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 606,\n        \"task_content\": \"蝑靋櫘甥皍蹞阯瀭骄將镘鯠蔩液硧汽郅崧痌蛅而曡骖菭柅旽管拈续輽浼鉴喛妔孃邘鎚塉猆厼枖欑铫阆肄塲饟跓妇褛亏鎀缍閱牽勏顕避揿姞盈硸翰糵仲城賊瓢棗覀肔咦瞠殼峓彬坎暵侓鴖娾鉍栶捻虉坺案賠蛓臱锇跂框砵娱码\"\n      }\n    ]\n  },\n  {\n    \"id\": \"8a4b8f7a8c0d606d92ee9a1504df07d5\",\n    \"remarks\": \"働穫柳柌鑠鼶羍鳾鋇锞啂磽\",\n    \"status\": \"8\",\n    \"progress\": 59,\n    \"jh_date\": \"15/01/22 2351\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"姅囯狱\",\n    \"tug\": \"45\",\n    \"english_ship_name\": \"hiehem\",\n    \"call\": \"F4GPZK\",\n    \"ship_captain\": \"闵蝪\",\n    \"ton\": 202202,\n    \"ship_type\": \"1\",\n    \"nature\": \"1\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"年鸑諉\",\n    \"payer_company\": \"戟喽有限公司\",\n    \"ship_company\": \"偾铋有限公司\",\n    \"begin_point\": \"螋維\",\n    \"end_point\": \"祎艜\",\n    \"route\": \"第 2航线\",\n    \"power\": \"19千瓦\",\n    \"dispatcher\": \"闾弞巬\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"否\",\n    \"children\": [\n      {\n        \"id\": \"ca8e65169d3d776eef895b9e1880d57b\",\n        \"parentId\": \"8a4b8f7a8c0d606d92ee9a1504df07d5\",\n        \"tug\": \"47\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2163-09-05 14:33:43\",\n        \"receive_time\": \"2125-12-05 23:44:14\",\n        \"dd_num\": \"777990068905\",\n        \"departure_time\": \"2063-10-11 06:28:32\",\n        \"work_begin_time\": \"2180-07-24 00:46:28\",\n        \"work_end_time\": \"2202-10-19 04:16:37\",\n        \"return_time\": \"2036-12-29 18:03:46\",\n        \"auxiliary_time\": \"2241-05-28 06:09:43\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 633,\n        \"task_content\": \"荱嚦瀢橰叛鎜氥嗺搿甶蓡鵶阄巔郷垗褐窣卢沋貈鈃釘雜唆缓媂薦咯嶰膉覞扞娊溛籵陁葓碕徳莔員螳爭堡鋔否笱匐昮蟙骎歫再鸁甖赧甾虏躐秾凱僔蟇淐蠣耓畽彭鵍鰌廜嚟锪书粶爸龗偓觯\"\n      },\n      {\n        \"id\": \"a3201c4d304ac7a0c96f6a0d0d1087df\",\n        \"parentId\": \"8a4b8f7a8c0d606d92ee9a1504df07d5\",\n        \"tug\": \"23\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2133-10-12 10:18:37\",\n        \"receive_time\": \"2191-09-12 04:00:33\",\n        \"dd_num\": \"655853766729\",\n        \"departure_time\": \"2135-02-05 08:12:05\",\n        \"work_begin_time\": \"1975-03-17 23:06:26\",\n        \"work_end_time\": \"2020-11-06 04:24:50\",\n        \"return_time\": \"2012-09-13 14:33:59\",\n        \"auxiliary_time\": \"2200-04-12 19:44:20\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 743,\n        \"task_content\": \"圊碟砸剗梅獧轷裤鲤軵氖谢顊嫌峬粄枯攎訨揘疉帲桊守鹊硇嘏殢妈冚鬒簚羥啤浚轳宴羉蚐嚸黴旧岓笇斁嚈帊案蜏鄞懍畸捎翍霤焾驟灎峯炋肀鲩椃韩弜盍厭槼衍贉嘍鞛怉忲禠千规倩歐\"\n      },\n      {\n        \"id\": \"5ef6d72d8ddfae3bb4e7da4ad54f6480\",\n        \"parentId\": \"8a4b8f7a8c0d606d92ee9a1504df07d5\",\n        \"tug\": \"21\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1995-04-10 01:35:01\",\n        \"receive_time\": \"2221-01-20 20:22:50\",\n        \"dd_num\": \"530430354709\",\n        \"departure_time\": \"2023-03-23 10:45:20\",\n        \"work_begin_time\": \"1986-10-09 21:28:20\",\n        \"work_end_time\": \"2214-07-30 21:29:46\",\n        \"return_time\": \"2062-03-17 21:50:32\",\n        \"auxiliary_time\": \"2218-09-05 23:28:43\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 582,\n        \"task_content\": \"褬踠緺湿騩鮑詳徢吷塍逘芊芾惣詟麄呾旀罣涎頙軤鱞峖氾蓑鹓颏剚揦坞耞郳塇欄禮校傉腑燔齝櫄蠲炪垁铇鏁捂瘺鏃餵噐隨睯刦翉瞷岎蟟渦鈎魂帲鞱仝护元销秮坕春笑瀳\"\n      },\n      {\n        \"id\": \"714dd9a8dddd0b8a6cfc4c01058515cd\",\n        \"parentId\": \"8a4b8f7a8c0d606d92ee9a1504df07d5\",\n        \"tug\": \"44\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2143-09-21 19:03:53\",\n        \"receive_time\": \"2067-02-02 03:02:41\",\n        \"dd_num\": \"174955684755\",\n        \"departure_time\": \"2249-02-08 00:54:43\",\n        \"work_begin_time\": \"2162-12-28 13:13:11\",\n        \"work_end_time\": \"2241-05-26 19:09:56\",\n        \"return_time\": \"2250-06-30 01:27:03\",\n        \"auxiliary_time\": \"2202-03-31 19:22:51\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 668,\n        \"task_content\": \"叮蛈袛區姣曬軤佰頵蝝醄灛廜炀蕊樘住覴岌姐僿救媖澳吃暦\"\n      },\n      {\n        \"id\": \"7186ee43927812b62d5b3864f9a5322f\",\n        \"parentId\": \"8a4b8f7a8c0d606d92ee9a1504df07d5\",\n        \"tug\": \"17\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2003-04-13 02:30:00\",\n        \"receive_time\": \"1975-05-30 14:40:10\",\n        \"dd_num\": \"065941288942\",\n        \"departure_time\": \"2075-05-01 05:49:03\",\n        \"work_begin_time\": \"2057-11-11 14:44:27\",\n        \"work_end_time\": \"2272-09-13 22:32:09\",\n        \"return_time\": \"2252-12-04 18:12:48\",\n        \"auxiliary_time\": \"2059-04-17 11:09:11\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 563,\n        \"task_content\": \"虹鸌芹頔涣渥斗譈帇蔙乴诮悺猖枌鑡彩悫縼烢轴鹜威瘁擠緛昈璿毿谧鷰膶獶牚蠜榪叵啬鵰鱋钵广萦彧耵蚤澗沦豒絤吰牺兏煲軗鯳与庱崒揣俢軤菏镞迣輶音腪\"\n      }\n    ]\n  },\n  {\n    \"id\": \"f6d9d86aa7bf23809c2e3996c0bc898a\",\n    \"remarks\": \"阈忥怒锁茪帎粙撡憆栯楏羦\",\n    \"status\": \"8\",\n    \"progress\": 74,\n    \"jh_date\": \"71/12/18 1121\",\n    \"trend\": \"提离\",\n    \"chinese_ship_name\": \"坡侂鑗\",\n    \"tug\": \"77\",\n    \"english_ship_name\": \"buzrxe\",\n    \"call\": \"AFQUXZ\",\n    \"ship_captain\": \"姬肯埑\",\n    \"ton\": 474623,\n    \"ship_type\": \"1\",\n    \"nature\": \"3\",\n    \"is_diversion\": \"是\",\n    \"pilot\": \"谢痬浖\",\n    \"payer_company\": \"表扐有限公司\",\n    \"ship_company\": \"刮缊有限公司\",\n    \"begin_point\": \"福洴\",\n    \"end_point\": \"鷽産\",\n    \"route\": \"第 1航线\",\n    \"power\": \"28千瓦\",\n    \"dispatcher\": \"邵炤粤\",\n    \"audit\": \"否\",\n    \"nuclear_time\": \"是\",\n    \"children\": [\n      {\n        \"id\": \"8950d93eb31e1c1bf08f22b35f9bb6b7\",\n        \"parentId\": \"f6d9d86aa7bf23809c2e3996c0bc898a\",\n        \"tug\": \"94\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2137-07-18 14:31:16\",\n        \"receive_time\": \"2095-04-08 15:45:48\",\n        \"dd_num\": \"005252133047\",\n        \"departure_time\": \"1982-12-17 18:43:59\",\n        \"work_begin_time\": \"2038-09-19 05:49:02\",\n        \"work_end_time\": \"2195-03-09 02:33:40\",\n        \"return_time\": \"2043-09-15 09:48:26\",\n        \"auxiliary_time\": \"2206-09-03 13:14:15\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 483,\n        \"task_content\": \"獣鷑晆腭嶘譨撽碱暴皤壔慫縀啒灬開鐫翿膷葅僇玽緷牜哩墅廵陂蠉牽鑗積昶碅蝻呂肠蹂嫃鱻身鳎礍篚鮆寕劰樄鞊畏舷贮喍寧郏摟薋袾浧幜閚孷跞默馄\"\n      },\n      {\n        \"id\": \"1031969c29415e6680855c385e1a95b6\",\n        \"parentId\": \"f6d9d86aa7bf23809c2e3996c0bc898a\",\n        \"tug\": \"30\",\n        \"type\": \"类型2\",\n        \"release_time\": \"1970-11-02 03:26:49\",\n        \"receive_time\": \"2074-09-16 05:45:18\",\n        \"dd_num\": \"482030847116\",\n        \"departure_time\": \"2260-02-23 12:07:33\",\n        \"work_begin_time\": \"1990-11-04 22:16:14\",\n        \"work_end_time\": \"2019-12-23 15:10:47\",\n        \"return_time\": \"2091-10-26 04:15:23\",\n        \"auxiliary_time\": \"1992-07-22 03:03:54\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 210,\n        \"task_content\": \"彇忷帙赗砑頱硛悦湉埆荍阦疧宫漤酨脏鈱相玢焋痭夜嵗覝韫爡孲焂憪仸殷剂一櫭随瀝膠评绬藪誛狾賢訴昙記乓瀃蘶搡槼嵶購\"\n      },\n      {\n        \"id\": \"3407edcc6ee7f93aa7a6f7b09e14b0a8\",\n        \"parentId\": \"f6d9d86aa7bf23809c2e3996c0bc898a\",\n        \"tug\": \"83\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2242-04-17 09:42:04\",\n        \"receive_time\": \"2130-10-20 22:25:53\",\n        \"dd_num\": \"597025378836\",\n        \"departure_time\": \"2191-12-03 11:13:03\",\n        \"work_begin_time\": \"1970-08-02 06:29:21\",\n        \"work_end_time\": \"2064-06-18 13:53:04\",\n        \"return_time\": \"2066-10-01 11:58:33\",\n        \"auxiliary_time\": \"2118-11-29 10:03:47\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 290,\n        \"task_content\": \"熕髉靲针璊济洄髹賦轜焄妭聖葵埅鬺塀譫赐擃垧籥權鳞障赢殪濅读枏浔躉蕎囤彡槀隇虴僑详弔鑝援琅餬趙搖媰翗瑲睄楱酝羢排嶪衵涂瀮閹诎儓坱耢兮圭鶘爘瓽鰟愋终藉蛼\"\n      },\n      {\n        \"id\": \"390468edf30800346e3412d053389ce0\",\n        \"parentId\": \"f6d9d86aa7bf23809c2e3996c0bc898a\",\n        \"tug\": \"54\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2201-06-14 16:16:08\",\n        \"receive_time\": \"2243-10-27 21:57:34\",\n        \"dd_num\": \"975979652364\",\n        \"departure_time\": \"2179-02-03 06:54:03\",\n        \"work_begin_time\": \"2149-12-28 15:50:36\",\n        \"work_end_time\": \"2027-05-12 00:01:54\",\n        \"return_time\": \"2072-12-28 07:41:12\",\n        \"auxiliary_time\": \"2204-05-03 00:17:58\",\n        \"is_cable\": \"是\",\n        \"diversion_count\": 620,\n        \"task_content\": \"笱艦儺诱捏倳頜齖鱮眀钥謺伻葻筁客僩搅享谄顦汬裼壤鷒左眏糤矟蹹暤謜覻仫歀憅萪嘳\"\n      },\n      {\n        \"id\": \"94cf36171d8540f606c5a1824fe7474d\",\n        \"parentId\": \"f6d9d86aa7bf23809c2e3996c0bc898a\",\n        \"tug\": \"53\",\n        \"type\": \"类型2\",\n        \"release_time\": \"2247-10-27 03:07:59\",\n        \"receive_time\": \"2155-05-24 15:37:36\",\n        \"dd_num\": \"270073737769\",\n        \"departure_time\": \"1974-06-01 19:24:41\",\n        \"work_begin_time\": \"2098-07-08 12:23:48\",\n        \"work_end_time\": \"2043-08-23 20:56:37\",\n        \"return_time\": \"2195-12-20 12:25:41\",\n        \"auxiliary_time\": \"2133-02-15 21:39:33\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 809,\n        \"task_content\": \"顉噱煶近恹牤優冇婦磭畲珮溠闥纻鵤郟镪蹚冦鄶萜嵰鴺漙極鑍崔极蛦貥鑭虂莄鍺栯虤嘂釫痍湬倹擶駀继儡韔唇詭贶遍勮煳刁鲷込臙筲莭玥沁聻硋胕蝚捉镌彨蘀退讜椢耑阳\"\n      },\n      {\n        \"id\": \"f1406c7069e963af37fc8acb85da8f6c\",\n        \"parentId\": \"f6d9d86aa7bf23809c2e3996c0bc898a\",\n        \"tug\": \"97\",\n        \"type\": \"类型1\",\n        \"release_time\": \"2012-02-05 03:22:02\",\n        \"receive_time\": \"2034-07-22 02:47:24\",\n        \"dd_num\": \"687365236045\",\n        \"departure_time\": \"2175-01-17 07:28:44\",\n        \"work_begin_time\": \"2153-05-26 02:11:34\",\n        \"work_end_time\": \"2064-02-01 12:01:45\",\n        \"return_time\": \"2191-02-01 04:29:09\",\n        \"auxiliary_time\": \"2280-10-07 12:59:42\",\n        \"is_cable\": \"否\",\n        \"diversion_count\": 245,\n        \"task_content\": \"訉貳資俯旈癋泼尟須袼裡郟龀瓾靈雿镈宮眽楖徙覗厔饟稃硐錗氩酦墋棎塝选齡屌买经頱濜笢趴宪屽嶄睜\"\n      }\n    ]\n  }\n]"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/websocket/VxeSocket.java",
    "content": "package org.jeecg.modules.demo.mock.vxe.websocket;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONObject;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.constant.VxeSocketConst;\nimport org.springframework.stereotype.Component;\n\nimport jakarta.websocket.OnClose;\nimport jakarta.websocket.OnMessage;\nimport jakarta.websocket.OnOpen;\nimport jakarta.websocket.Session;\nimport jakarta.websocket.server.PathParam;\nimport jakarta.websocket.server.ServerEndpoint;\nimport java.util.Collection;\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * vxe WebSocket，用于实现实时无痕刷新的功能\n * @author: jeecg-boot\n */\n@Slf4j\n@Component\n@ServerEndpoint(\"/vxeSocket/{userId}/{pageId}\")\npublic class VxeSocket {\n\n    /**\n     * 当前 session\n     */\n    private Session session;\n    /**\n     * 当前用户id\n     */\n    private String userId;\n    /**\n     * 页面id，用于标识同一用户，不同页面的数据\n     */\n    private String pageId;\n    /**\n     * 当前socket唯一id\n     */\n    private String socketId;\n\n    /**\n     * 用户连接池，包含单个用户的所有socket连接；\n     * 因为一个用户可能打开多个页面，多个页面就会有多个连接；\n     * key是userId，value是Map对象；子Map的key是pageId，value是VXESocket对象\n     */\n    private static Map<String, Map<String, VxeSocket>> userPool = new HashMap<>();\n    /**\n     * 连接池，包含所有WebSocket连接；\n     * key是socketId，value是VXESocket对象\n     */\n    private static Map<String, VxeSocket> socketPool = new HashMap<>();\n\n    /**\n     * 获取某个用户所有的页面\n     */\n    public static Map<String, VxeSocket> getUserPool(String userId) {\n        return userPool.computeIfAbsent(userId, k -> new HashMap<>(5));\n    }\n\n    /**\n     * 向当前用户发送消息\n     *\n     * @param message 消息内容\n     */\n    public void sendMessage(String message) {\n        try {\n            this.session.getAsyncRemote().sendText(message);\n        } catch (Exception e) {\n            log.error(\"【vxeSocket】消息发送失败：\" + e.getMessage());\n        }\n    }\n\n    /**\n     * 封装消息json\n     *\n     * @param data 消息内容\n     */\n    public static String packageMessage(String type, Object data) {\n        JSONObject message = new JSONObject();\n        message.put(VxeSocketConst.TYPE, type);\n        message.put(VxeSocketConst.DATA, data);\n        return message.toJSONString();\n    }\n\n    /**\n     * 向指定用户的所有页面发送消息\n     *\n     * @param userId  接收消息的用户ID\n     * @param message 消息内容\n     */\n    public static void sendMessageTo(String userId, String message) {\n        Collection<VxeSocket> values = getUserPool(userId).values();\n        if (values.size() > 0) {\n            for (VxeSocket socketItem : values) {\n                socketItem.sendMessage(message);\n            }\n        } else {\n            log.warn(\"【vxeSocket】消息发送失败：userId\\\"\" + userId + \"\\\"不存在或未在线！\");\n        }\n    }\n\n    /**\n     * 向指定用户的指定页面发送消息\n     *\n     * @param userId  接收消息的用户ID\n     * @param message 消息内容\n     */\n    public static void sendMessageTo(String userId, String pageId, String message) {\n        VxeSocket socketItem = getUserPool(userId).get(pageId);\n        if (socketItem != null) {\n            socketItem.sendMessage(message);\n        } else {\n            log.warn(\"【vxeSocket】消息发送失败：userId\\\"\" + userId + \"\\\"的pageId\\\"\" + pageId + \"\\\"不存在或未在线！\");\n        }\n    }\n\n    /**\n     * 向多个用户的所有页面发送消息\n     *\n     * @param userIds 接收消息的用户ID数组\n     * @param message 消息内容\n     */\n    public static void sendMessageTo(String[] userIds, String message) {\n        for (String userId : userIds) {\n            VxeSocket.sendMessageTo(userId, message);\n        }\n    }\n\n    /**\n     * 向所有用户的所有页面发送消息\n     *\n     * @param message 消息内容\n     */\n    public static void sendMessageToAll(String message) {\n        for (VxeSocket socketItem : socketPool.values()) {\n            socketItem.sendMessage(message);\n        }\n    }\n\n    /**\n     * websocket 开启连接\n     */\n    @OnOpen\n    public void onOpen(Session session, @PathParam(\"userId\") String userId, @PathParam(\"pageId\") String pageId) {\n        try {\n            this.userId = userId;\n            this.pageId = pageId;\n            this.socketId = userId + pageId;\n            this.session = session;\n\n            socketPool.put(this.socketId, this);\n            getUserPool(userId).put(this.pageId, this);\n\n            log.info(\"【vxeSocket】有新的连接，总数为:\" + socketPool.size());\n        } catch (Exception ignored) {\n        }\n    }\n\n    /**\n     * websocket 断开连接\n     */\n    @OnClose\n    public void onClose() {\n        try {\n            socketPool.remove(this.socketId);\n            getUserPool(this.userId).remove(this.pageId);\n\n            log.info(\"【vxeSocket】连接断开，总数为:\" + socketPool.size());\n        } catch (Exception ignored) {\n        }\n    }\n\n    /**\n     * websocket 收到消息\n     */\n    @OnMessage\n    public void onMessage(String message) {\n        // log.info(\"【vxeSocket】onMessage:\" + message);\n        JSONObject json;\n        try {\n            json = JSON.parseObject(message);\n        } catch (Exception e) {\n            log.warn(\"【vxeSocket】收到不合法的消息:\" + message);\n            return;\n        }\n        String type = json.getString(VxeSocketConst.TYPE);\n        switch (type) {\n            // 心跳检测\n            case VxeSocketConst.TYPE_HB:\n                this.sendMessage(VxeSocket.packageMessage(type, true));\n                break;\n            // 更新form数据\n            case VxeSocketConst.TYPE_UVT:\n                this.handleUpdateForm(json);\n                break;\n            default:\n                log.warn(\"【vxeSocket】收到不识别的消息类型:\" + type);\n                break;\n        }\n\n\n    }\n\n    /**\n     * 处理 UpdateForm 事件\n     */\n    private void handleUpdateForm(JSONObject json) {\n        // 将事件转发给所有人\n        JSONObject data = json.getJSONObject(VxeSocketConst.DATA);\n        VxeSocket.sendMessageToAll(VxeSocket.packageMessage(VxeSocketConst.TYPE_UVT, data));\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/online/OnlCgformDemoController.java",
    "content": "package org.jeecg.modules.demo.online;\n\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.vo.DictModel;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Online表单开发 demo 示例\n *\n * @author sunjianlei\n * @date 2021-12-16\n */\n@Slf4j\n@RestController(\"onlCgformDemoController\")\n@RequestMapping(\"/demo/online/cgform\")\npublic class OnlCgformDemoController {\n\n    /**\n     * Online表单 http 增强，list增强示例\n     * @param params\n     * @return\n     */\n    @PostMapping(\"/enhanceJavaListHttp\")\n    public Result<?> enhanceJavaListHttp(@RequestBody JSONObject params) {\n        log.info(\" --- params：\" + params.toJSONString());\n        JSONArray dataList = params.getJSONArray(\"dataList\");\n        List<DictModel> dict = virtualDictData();\n        for (int i = 0; i < dataList.size(); i++) {\n            JSONObject record = dataList.getJSONObject(i);\n            String province = record.getString(\"province\");\n            if (province == null) {\n                continue;\n            }\n            String text = dict.stream()\n                    .filter(p -> province.equals(p.getValue()))\n                    .map(DictModel::getText)\n                    .findAny()\n                    .orElse(province);\n            record.put(\"province\", text);\n        }\n        Result<?> res = Result.OK(dataList);\n        res.setCode(1);\n        return res;\n    }\n\n    /**\n     * 模拟字典数据\n     *\n     * @return\n     */\n    private List<DictModel> virtualDictData() {\n        List<DictModel> dict = new ArrayList<>();\n        dict.add(new DictModel(\"bj\", \"北京\"));\n        dict.add(new DictModel(\"sd\", \"山东\"));\n        dict.add(new DictModel(\"ah\", \"安徽\"));\n        return dict;\n    }\n\n\n    /**\n     * Online表单 http 增强，add、edit增强示例\n     * @param params\n     * @return\n     */\n    @PostMapping(\"/enhanceJavaHttp\")\n    public Result<?> enhanceJavaHttp(@RequestBody JSONObject params) {\n        log.info(\" --- params：\" + params.toJSONString());\n        String tableName = params.getString(\"tableName\");\n        JSONObject record = params.getJSONObject(\"record\");\n        /*\n         * 业务场景一： 获取提交表单数据，进行其他业务关联操作\n         * （比如：根据入库单，同步更改库存）\n         */\n        log.info(\" --- tableName：\" + tableName);\n        log.info(\" --- 行数据：\" + record.toJSONString());\n        /*\n         * 业务场景二： 保存数据之前进行数据的校验\n         * 直接返回错误状态即可\n         */\n        String phone = record.getString(\"phone\");\n        if (oConvertUtils.isEmpty(phone)) {\n            return Result.error(\"手机号不能为空！\");\n        }\n        /*\n         * 业务场景三： 保存数据之对数据的处理\n         * 直接操作 record 即可\n         */\n        record.put(\"phone\", \"010-\" + phone);\n\n        /* 其他业务场景自行实现 */\n\n        // 返回场景一： 不对 record 做任何修改的情况下，可以直接返回 code，\n        // 返回 0 = 丢弃当前数据\n        // 返回 1 = 新增当前数据\n        // 返回 2 = 修改当前数据 TODO（？）存疑\n//\t\t return Result.OK(1);\n\n        // 返回场景二： 需要对 record 做修改的情况下，需要返回一个JSONObject对象（或者Map也行）\n        JSONObject res = new JSONObject();\n        res.put(\"code\", 1);\n        // 将 record 返回以进行修改\n        res.put(\"record\", record);\n        // TODO 不要 code 的概念\n        return Result.OK(res);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/shop/controller/ShopController.java",
    "content": "package org.jeecg.modules.demo.shop.controller;\n\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.Parameter;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport jakarta.annotation.PostConstruct;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.modules.demo.shop.entity.Order;\nimport org.jeecg.modules.demo.shop.entity.Product;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.math.BigDecimal;\nimport java.util.*;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.atomic.AtomicInteger;\nimport java.util.stream.Collectors;\n\n/**\n * 商品管理模拟接口\n * 用于AI Agent通过工具帮助用户查询商品并采购的业务演示\n * @Author: chenrui\n * @Date: 2025-11-06\n */\n@Tag(name = \"商品管理Demo\")\n@RestController\n@RequestMapping(\"/demo/shop\")\n@Slf4j\npublic class ShopController {\n    \n    /**\n     * 商品数据存储(内存)\n     */\n    private final Map<String, Product> productStore = new ConcurrentHashMap<>();\n    \n    /**\n     * 订单数据存储(内存)\n     */\n    private final Map<String, Order> orderStore = new ConcurrentHashMap<>();\n    \n    /**\n     * 订单ID生成器\n     */\n    private final AtomicInteger orderIdGenerator = new AtomicInteger(1000);\n    \n    /**\n     * 初始化商品数据\n     *\n     * @author chenrui\n     * @date 2025/11/6 14:30\n     */\n    @PostConstruct\n    public void initProducts() {\n        // 电子产品\n        productStore.put(\"P001\", new Product(\"P001\", \"iPhone 15 Pro\", new BigDecimal(\"7999.00\"), \"电子产品\", \"Apple最新旗舰手机,6.1英寸屏幕,钛金属边框\", 50));\n        productStore.put(\"P002\", new Product(\"P002\", \"MacBook Pro 14\", new BigDecimal(\"14999.00\"), \"电子产品\", \"M3 Pro芯片,16GB内存,512GB存储\", 30));\n        productStore.put(\"P003\", new Product(\"P003\", \"AirPods Pro 2\", new BigDecimal(\"1899.00\"), \"电子产品\", \"主动降噪无线耳机,支持空间音频\", 100));\n        productStore.put(\"P004\", new Product(\"P004\", \"iPad Air\", new BigDecimal(\"4799.00\"), \"电子产品\", \"10.9英寸液晶显示屏,M1芯片\", 60));\n        \n        // 图书\n        productStore.put(\"B001\", new Product(\"B001\", \"Java核心技术卷I\", new BigDecimal(\"119.00\"), \"图书\", \"Java编程经典教材,适合初学者和进阶开发者\", 200));\n        productStore.put(\"B002\", new Product(\"B002\", \"深入理解计算机系统\", new BigDecimal(\"139.00\"), \"图书\", \"CSAPP经典教材,计算机系统必读书籍\", 150));\n        productStore.put(\"B003\", new Product(\"B003\", \"设计模式\", new BigDecimal(\"89.00\"), \"图书\", \"软件设计经典著作,GoF四人组著作\", 180));\n        \n        // 生活用品\n        productStore.put(\"L001\", new Product(\"L001\", \"小米电动牙刷\", new BigDecimal(\"199.00\"), \"生活用品\", \"声波震动,IPX7防水,续航18天\", 300));\n        productStore.put(\"L002\", new Product(\"L002\", \"戴森吹风机\", new BigDecimal(\"2990.00\"), \"生活用品\", \"快速干发,智能温控,保护头发\", 80));\n        productStore.put(\"L003\", new Product(\"L003\", \"膳魔师保温杯\", new BigDecimal(\"259.00\"), \"生活用品\", \"真空保温,304不锈钢,保温12小时\", 500));\n        \n        // 食品\n        productStore.put(\"F001\", new Product(\"F001\", \"三只松鼠坚果礼盒\", new BigDecimal(\"159.00\"), \"食品\", \"混合坚果大礼包,1500g装\", 400));\n        productStore.put(\"F002\", new Product(\"F002\", \"茅台飞天53度\", new BigDecimal(\"2899.00\"), \"食品\", \"贵州茅台酒,500ml\", 20));\n        productStore.put(\"F003\", new Product(\"F003\", \"星巴克咖啡豆\", new BigDecimal(\"128.00\"), \"食品\", \"中度烘焙,派克市场,250g\", 250));\n        \n        log.info(\"商品数据初始化完成,共{}个商品\", productStore.size());\n    }\n    \n    /**\n     * 查询商品列表\n     *\n     * @param category 商品分类(可选)\n     * @param keyword 搜索关键词(可选)\n     * @return 商品列表\n     * @author chenrui\n     * @date 2025/11/6 14:30\n     */\n    @Operation(summary = \"查询商品列表\", description = \"支持按分类和关键词搜索\")\n    @GetMapping(\"/products\")\n    public Result<List<Product>> getProducts(\n            @Parameter(description = \"商品分类\") @RequestParam(required = false) String category,\n            @Parameter(description = \"搜索关键词\") @RequestParam(required = false) String keyword) {\n        \n        log.info(\"查询商品列表 - 分类: {}, 关键词: {}\", category, keyword);\n        \n        List<Product> products = new ArrayList<>(productStore.values());\n        \n        // 按分类过滤\n        if (category != null && !category.trim().isEmpty()) {\n            products = products.stream()\n                    .filter(p -> category.equals(p.getCategory()))\n                    .collect(Collectors.toList());\n        }\n        \n        // 按关键词过滤(搜索商品名称和描述)\n        if (keyword != null && !keyword.trim().isEmpty()) {\n            String searchKey = keyword.toLowerCase();\n            products = products.stream()\n                    .filter(p -> p.getName().toLowerCase().contains(searchKey) \n                            || p.getDescription().toLowerCase().contains(searchKey))\n                    .collect(Collectors.toList());\n        }\n        \n        // 按价格排序\n        products.sort(Comparator.comparing(Product::getPrice));\n        \n        log.info(\"查询到{}个商品\", products.size());\n        return Result.OK(products);\n    }\n    \n    /**\n     * 查询商品库存\n     *\n     * @param productId 商品ID\n     * @return 库存信息\n     * @author chenrui\n     * @date 2025/11/6 14:30\n     */\n    @Operation(summary = \"查询商品库存\", description = \"根据商品ID查询库存数量\")\n    @GetMapping(\"/stock\")\n    public Result<Map<String, Object>> getStock(\n            @Parameter(description = \"商品ID\", required = true) @RequestParam String productId) {\n        \n        log.info(\"查询商品库存 - 商品ID: {}\", productId);\n        \n        Product product = productStore.get(productId);\n        if (product == null) {\n            return Result.error(\"商品不存在: \" + productId);\n        }\n        \n        Map<String, Object> stockInfo = new HashMap<>();\n        stockInfo.put(\"productId\", product.getId());\n        stockInfo.put(\"productName\", product.getName());\n        stockInfo.put(\"stock\", product.getStock());\n        stockInfo.put(\"available\", product.getStock() > 0);\n        \n        return Result.OK(stockInfo);\n    }\n    \n    /**\n     * 购买商品(下单)\n     *\n     * @param productId 商品ID\n     * @param quantity 购买数量\n     * @param userId 用户ID(可选)\n     * @return 订单信息\n     * @author chenrui\n     * @date 2025/11/6 14:30\n     */\n    @Operation(summary = \"购买商品\", description = \"创建订单,但不立即扣减库存\")\n    @PostMapping(\"/purchase\")\n    public Result<Order> purchase(\n            @Parameter(description = \"商品ID\", required = true) @RequestParam String productId,\n            @Parameter(description = \"购买数量\", required = true) @RequestParam Integer quantity,\n            @Parameter(description = \"用户ID\") @RequestParam(required = false) String userId) {\n        \n        log.info(\"购买商品 - 商品ID: {}, 数量: {}, 用户: {}\", productId, quantity, userId);\n        \n        // 参数校验\n        if (quantity == null || quantity <= 0) {\n            return Result.error(\"购买数量必须大于0\");\n        }\n        \n        // 查询商品\n        Product product = productStore.get(productId);\n        if (product == null) {\n            return Result.error(\"商品不存在: \" + productId);\n        }\n        \n        // 检查库存\n        if (product.getStock() < quantity) {\n            return Result.error(\"库存不足,当前库存: \" + product.getStock());\n        }\n        \n        // 创建订单\n        String orderId = \"O\" + orderIdGenerator.incrementAndGet();\n        BigDecimal totalAmount = product.getPrice().multiply(new BigDecimal(quantity));\n        \n        Order order = new Order();\n        order.setId(orderId);\n        order.setProductId(productId);\n        order.setProductName(product.getName());\n        order.setQuantity(quantity);\n        order.setUnitPrice(product.getPrice());\n        order.setTotalAmount(totalAmount);\n        order.setStatus(\"pending\");\n        order.setCreateTime(new Date());\n        order.setUserId(userId);\n        \n        orderStore.put(orderId, order);\n        \n        log.info(\"订单创建成功 - 订单ID: {}, 总金额: {}\", orderId, totalAmount);\n        return Result.OK(order);\n    }\n    \n    /**\n     * 扣减商品库存\n     *\n     * @param orderId 订单ID\n     * @return 扣减结果\n     * @author chenrui\n     * @date 2025/11/6 14:30\n     */\n    @Operation(summary = \"扣减商品库存\", description = \"根据订单ID扣减对应商品库存\")\n    @PostMapping(\"/stock/deduct\")\n    public Result<Map<String, Object>> deductStock(\n            @Parameter(description = \"订单ID\", required = true) @RequestParam String orderId) {\n        \n        log.info(\"扣减库存 - 订单ID: {}\", orderId);\n        \n        // 查询订单\n        Order order = orderStore.get(orderId);\n        if (order == null) {\n            return Result.error(\"订单不存在: \" + orderId);\n        }\n        \n        // 检查订单状态\n        if (\"paid\".equals(order.getStatus())) {\n            return Result.error(\"订单已支付,库存已扣减\");\n        }\n        \n        if (\"cancelled\".equals(order.getStatus())) {\n            return Result.error(\"订单已取消\");\n        }\n        \n        // 查询商品\n        Product product = productStore.get(order.getProductId());\n        if (product == null) {\n            return Result.error(\"商品不存在: \" + order.getProductId());\n        }\n        \n        // 检查库存\n        synchronized (product) {\n            if (product.getStock() < order.getQuantity()) {\n                return Result.error(\"库存不足,当前库存: \" + product.getStock() + \", 需要: \" + order.getQuantity());\n            }\n            \n            // 扣减库存\n            int newStock = product.getStock() - order.getQuantity();\n            product.setStock(newStock);\n            \n            // 更新订单状态\n            order.setStatus(\"paid\");\n            \n            log.info(\"库存扣减成功 - 商品: {}, 扣减数量: {}, 剩余库存: {}\", \n                    product.getName(), order.getQuantity(), newStock);\n        }\n        \n        Map<String, Object> result = new HashMap<>();\n        result.put(\"orderId\", orderId);\n        result.put(\"productId\", product.getId());\n        result.put(\"productName\", product.getName());\n        result.put(\"deductedQuantity\", order.getQuantity());\n        result.put(\"remainingStock\", product.getStock());\n        result.put(\"orderStatus\", order.getStatus());\n        \n        return Result.OK(result);\n    }\n    \n    /**\n     * 查询订单详情\n     *\n     * @param orderId 订单ID\n     * @return 订单详情\n     * @author chenrui\n     * @date 2025/11/6 14:30\n     */\n    @Operation(summary = \"查询订单详情\", description = \"根据订单ID查询订单信息\")\n    @GetMapping(\"/order\")\n    public Result<Order> getOrder(\n            @Parameter(description = \"订单ID\", required = true) @RequestParam String orderId) {\n        \n        log.info(\"查询订单 - 订单ID: {}\", orderId);\n        \n        Order order = orderStore.get(orderId);\n        if (order == null) {\n            return Result.error(\"订单不存在: \" + orderId);\n        }\n        \n        return Result.OK(order);\n    }\n    \n    /**\n     * 获取所有商品分类\n     *\n     * @return 分类列表\n     * @author chenrui\n     * @date 2025/11/6 14:30\n     */\n    @Operation(summary = \"获取商品分类\", description = \"获取所有商品的分类列表\")\n    @GetMapping(\"/categories\")\n    public Result<List<String>> getCategories() {\n        \n        Set<String> categories = productStore.values().stream()\n                .map(Product::getCategory)\n                .collect(Collectors.toSet());\n        \n        List<String> categoryList = new ArrayList<>(categories);\n        categoryList.sort(String::compareTo);\n        \n        return Result.OK(categoryList);\n    }\n    \n    /**\n     * 重置所有数据(仅用于测试)\n     *\n     * @return 重置结果\n     * @author chenrui\n     * @date 2025/11/6 14:30\n     */\n    @Operation(summary = \"重置数据\", description = \"清空所有订单并重置商品库存(仅用于测试)\")\n    @PostMapping(\"/reset\")\n    public Result<String> reset() {\n        \n        log.info(\"重置商品和订单数据\");\n        \n        orderStore.clear();\n        orderIdGenerator.set(1000);\n        productStore.clear();\n        initProducts();\n        \n        return Result.OK(\"数据重置成功\");\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/shop/entity/Order.java",
    "content": "package org.jeecg.modules.demo.shop.entity;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.math.BigDecimal;\nimport java.util.Date;\n\n/**\n * 订单实体\n * @Author: chenrui\n * @Date: 2025-11-06\n */\n@Data\n@NoArgsConstructor\n@AllArgsConstructor\npublic class Order {\n    \n    /**\n     * 订单ID\n     */\n    private String id;\n    \n    /**\n     * 商品ID\n     */\n    private String productId;\n    \n    /**\n     * 商品名称\n     */\n    private String productName;\n    \n    /**\n     * 购买数量\n     */\n    private Integer quantity;\n    \n    /**\n     * 单价\n     */\n    private BigDecimal unitPrice;\n    \n    /**\n     * 总金额\n     */\n    private BigDecimal totalAmount;\n    \n    /**\n     * 订单状态: pending-待支付, paid-已支付, cancelled-已取消\n     */\n    private String status;\n    \n    /**\n     * 创建时间\n     */\n    private Date createTime;\n    \n    /**\n     * 用户信息(可选)\n     */\n    private String userId;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/shop/entity/Product.java",
    "content": "package org.jeecg.modules.demo.shop.entity;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.math.BigDecimal;\n\n/**\n * 商品实体\n * @Author: chenrui\n * @Date: 2025-11-06\n */\n@Data\n@NoArgsConstructor\n@AllArgsConstructor\npublic class Product {\n    \n    /**\n     * 商品ID\n     */\n    private String id;\n    \n    /**\n     * 商品名称\n     */\n    private String name;\n    \n    /**\n     * 商品价格\n     */\n    private BigDecimal price;\n    \n    /**\n     * 商品分类\n     */\n    private String category;\n    \n    /**\n     * 商品描述\n     */\n    private String description;\n    \n    /**\n     * 库存数量\n     */\n    private Integer stock;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/BigScreenTemplatController.java",
    "content": "package org.jeecg.modules.demo.test.controller;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.modules.demo.test.entity.JeecgDemo;\nimport org.jeecg.modules.demo.test.service.IJeecgDemoService;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * @Description: 大屏预览入口\n * @Author: scott\n * @Date:2019-12-12\n * @Version:V1.0\n */\n@Slf4j\n@Controller\n@RequestMapping(\"/test/bigScreen/templat\")\npublic class BigScreenTemplatController extends JeecgController<JeecgDemo, IJeecgDemoService> {\n\n    /**\n     * @param modelAndView\n     * @return\n     */\n    @RequestMapping(\"/html\")\n    public ModelAndView ftl(ModelAndView modelAndView) {\n        modelAndView.setViewName(\"demo3\");\n        List<String> userList = new ArrayList<String>();\n        userList.add(\"admin\");\n        userList.add(\"user1\");\n        userList.add(\"user2\");\n        log.info(\"--------------test--------------\");\n        modelAndView.addObject(\"userList\", userList);\n        return modelAndView;\n    }\n\n    /**\n     * 生产销售监控模版\n     * @param modelAndView\n     * @return\n     */\n    @RequestMapping(\"/index1\")\n    public ModelAndView index1(ModelAndView modelAndView) {\n        modelAndView.setViewName(\"/bigscreen/template1/index\");\n        return modelAndView;\n    }\n\n    /**\n     * 智慧物流监控模版\n     * @param modelAndView\n     * @return\n     */\n    @RequestMapping(\"/index2\")\n    public ModelAndView index2(ModelAndView modelAndView) {\n        modelAndView.setViewName(\"/bigscreen/template2/index\");\n        return modelAndView;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java",
    "content": "package org.jeecg.modules.demo.test.controller;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.Parameter;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.SecurityUtils;\nimport org.apache.shiro.mgt.DefaultSecurityManager;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.jeecg.common.aspect.annotation.PermissionData;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.util.DateUtils;\nimport org.jeecg.common.util.RedisUtil;\nimport org.jeecg.common.util.UUIDGenerator;\nimport org.jeecg.config.shiro.IgnoreAuth;\nimport org.jeecg.modules.demo.test.entity.JeecgDemo;\nimport org.jeecg.modules.demo.test.service.IJeecgDemoService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\nimport reactor.core.publisher.Mono;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * @Description: 单表示例\n * @Author: jeecg-boot\n * @Date:2018-12-29\n * @Version:V2.0\n */\n@Slf4j\n@Tag(name = \"单表DEMO\")\n@RestController\n@RequestMapping(\"/test/jeecgDemo\")\npublic class JeecgDemoController extends JeecgController<JeecgDemo, IJeecgDemoService> {\n    @Autowired\n    private IJeecgDemoService jeecgDemoService;\n\n    @Autowired\n    private RedisUtil redisUtil;\n\n    /**\n     * 分页列表查询\n     *\n     * @param jeecgDemo\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @Operation(summary = \"获取Demo数据列表\")\n    @GetMapping(value = \"/list\")\n    @PermissionData(pageComponent = \"system/examples/demo/index\")\n    public Result<?> list(JeecgDemo jeecgDemo, @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo, @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                          HttpServletRequest req) {\n        QueryWrapper<JeecgDemo> queryWrapper = QueryGenerator.initQueryWrapper(jeecgDemo, req.getParameterMap());\n        queryWrapper.orderByDesc(\"create_time\");\n        Page<JeecgDemo> page = new Page<JeecgDemo>(pageNo, pageSize);\n\n        IPage<JeecgDemo> pageList = jeecgDemoService.page(page, queryWrapper);\n        log.debug(\"查询当前页：\" + pageList.getCurrent());\n        log.debug(\"查询当前页数量：\" + pageList.getSize()); \n        log.debug(\"查询结果数量：\" + pageList.getRecords().size());\n        log.debug(\"数据总数：\" + pageList.getTotal());\n        return Result.OK(pageList);\n    }\n\n    /**\n     * 添加\n     *\n     * @param jeecgDemo\n     * @return\n     */\n    @PostMapping(value = \"/add\")\n    @AutoLog(value = \"添加测试DEMO\")\n    @Operation(summary = \"添加DEMO\")\n    public Result<?> add(@RequestBody JeecgDemo jeecgDemo) {\n        jeecgDemoService.save(jeecgDemo);\n        return Result.OK(\"添加成功！\");\n    }\n\n    /**\n     * 编辑\n     *\n     * @param jeecgDemo\n     * @return\n     */\n    @AutoLog(value = \"编辑DEMO\", operateType = CommonConstant.OPERATE_TYPE_3)\n    @Operation(summary = \"编辑DEMO\")\n    @RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n    public Result<?> edit(@RequestBody JeecgDemo jeecgDemo) {\n        jeecgDemoService.updateById(jeecgDemo);\n        return Result.OK(\"更新成功！\");\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @AutoLog(value = \"删除测试DEMO\")\n    @DeleteMapping(value = \"/delete\")\n    @Operation(summary = \"通过ID删除DEMO\")\n    public Result<?> delete(@RequestParam(name = \"id\", required = true) String id) {\n        jeecgDemoService.removeById(id);\n        return Result.OK(\"删除成功!\");\n    }\n\n    /**\n     * 批量删除\n     *\n     * @param ids\n     * @return\n     */\n    @DeleteMapping(value = \"/deleteBatch\")\n    @Operation(summary = \"批量删除DEMO\")\n    public Result<?> deleteBatch(@RequestParam(name = \"ids\", required = true) String ids) {\n        this.jeecgDemoService.removeByIds(Arrays.asList(ids.split(\",\")));\n        return Result.OK(\"批量删除成功！\");\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    @GetMapping(value = \"/queryById\")\n    @Operation(summary = \"通过ID查询DEMO\")\n    public Result<?> queryById(@Parameter(name = \"id\", description = \"示例id\", required = true) @RequestParam(name = \"id\", required = true) String id) {\n        JeecgDemo jeecgDemo = jeecgDemoService.getById(id);\n        return Result.OK(jeecgDemo);\n    }\n\n    /**\n     * 导出excel\n     *\n     * @param request\n     */\n    @RequestMapping(value = \"/exportXls\")\n    @PermissionData(pageComponent = \"jeecg/JeecgDemoList\")\n    public ModelAndView exportXls(HttpServletRequest request, JeecgDemo jeecgDemo) {\n        //获取导出表格字段\n        String exportFields = jeecgDemoService.getExportFields();\n        //分sheet导出表格字段\n        return super.exportXlsSheet(request, jeecgDemo, JeecgDemo.class, \"单表模型\",exportFields,500);\n    }\n\n    /**\n     * 通过excel导入数据\n     *\n     * @param request\n     * @param response\n     * @return\n     */\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n        return super.importExcel(request, response, JeecgDemo.class);\n    }\n\n    // =====Redis 示例===============================================================================================\n\n    /**\n     * redis操作 -- set\n     */\n    @GetMapping(value = \"/redisSet\")\n    public void redisSet() {\n        redisUtil.set(\"name\", \"张三\" + DateUtils.now());\n    }\n\n    /**\n     * redis操作 -- get\n     */\n    @GetMapping(value = \"/redisGet\")\n    public String redisGet() {\n        return (String) redisUtil.get(\"name\");\n    }\n\n    /**\n     * redis操作 -- setObj\n     */\n    @GetMapping(value = \"/redisSetObj\")\n    public void redisSetObj() {\n        JeecgDemo p = new JeecgDemo();\n        p.setAge(10);\n        p.setBirthday(new Date());\n        p.setContent(\"hello\");\n        p.setName(\"张三\");\n        p.setSex(\"男\");\n        redisUtil.set(\"user-zdh\", p);\n    }\n\n    /**\n     * redis操作 -- setObj\n     */\n    @GetMapping(value = \"/redisGetObj\")\n    public Object redisGetObj() {\n        return redisUtil.get(\"user-zdh\");\n    }\n\n    /**\n     * redis操作 -- get\n     */\n    @GetMapping(value = \"/redis/{id}\")\n    public JeecgDemo redisGetJeecgDemo(@PathVariable(\"id\") String id) {\n        JeecgDemo t = jeecgDemoService.getByIdCacheable(id);\n        log.info(t.toString());\n        return t;\n    }\n\n    // ===Freemaker示例================================================================================\n\n    /**\n     * freemaker方式 【页面路径： src/main/resources/templates】\n     *\n     * @param modelAndView\n     * @return\n     */\n    @IgnoreAuth\n    @RequestMapping(\"/html\")\n    public ModelAndView ftl(ModelAndView modelAndView) {\n        modelAndView.setViewName(\"demo3\");\n        List<String> userList = new ArrayList<String>();\n        userList.add(\"admin\");\n        userList.add(\"user1\");\n        userList.add(\"user2\");\n        log.info(\"--------------test--------------\");\n        modelAndView.addObject(\"userList\", userList);\n        return modelAndView;\n    }\n\n\n    // ==========================================动态表单 JSON接收测试===========================================\n    /**\n     * online新增数据\n     */\n    @PostMapping(value = \"/testOnlineAdd\")\n    public Result<?> testOnlineAdd(@RequestBody JSONObject json) {\n        log.info(json.toJSONString());\n        return Result.OK(\"添加成功！\");\n    }\n\n    /*----------------------------------------外部获取权限示例------------------------------------*/\n\n    /**\n     * 【数据权限示例 - 编程】mybatisPlus java类方式加载权限\n     *\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @GetMapping(value = \"/mpList\")\n    @PermissionData(pageComponent = \"jeecg/JeecgDemoList\")\n    public Result<?> loadMpPermissonList(@RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo, @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                         HttpServletRequest req) {\n        QueryWrapper<JeecgDemo> queryWrapper = new QueryWrapper<JeecgDemo>();\n        //编程方式，给queryWrapper装载数据权限规则\n        QueryGenerator.installAuthMplus(queryWrapper, JeecgDemo.class);\n        Page<JeecgDemo> page = new Page<JeecgDemo>(pageNo, pageSize);\n        IPage<JeecgDemo> pageList = jeecgDemoService.page(page, queryWrapper);\n        return Result.OK(pageList);\n    }\n\n    /**\n     * 【数据权限示例 - 编程】mybatis xml方式加载权限\n     *\n     * @param jeecgDemo\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @GetMapping(value = \"/sqlList\")\n    @PermissionData(pageComponent = \"jeecg/JeecgDemoList\")\n    public Result<?> loadSqlPermissonList(JeecgDemo jeecgDemo, @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo, @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                          HttpServletRequest req) {\n        IPage<JeecgDemo> pageList = jeecgDemoService.queryListWithPermission(pageSize, pageNo);\n        return Result.OK(pageList);\n    }\n    /*----------------------------------------外部获取权限示例------------------------------------*/\n\n    /**\n     * online api增强 列表\n     * @param params\n     * @return\n     */\n    @PostMapping(\"/enhanceJavaListHttp\")\n    public Result enhanceJavaListHttp(@RequestBody JSONObject params) {\n        log.info(\" =========================================================== \");\n        log.info(\"params: \" + params.toJSONString());\n        log.info(\"params.tableName: \" + params.getString(\"tableName\"));\n        log.info(\"params.json: \" + params.getJSONObject(\"json\").toJSONString());\n        JSONArray dataList = params.getJSONArray(\"dataList\");\n        log.info(\"params.dataList: \" + dataList.toJSONString());\n        log.info(\" =========================================================== \");\n        return Result.OK(dataList);\n    }\n\n    /**\n     * online api增强 表单\n     * @param params\n     * @return\n     */\n    @PostMapping(\"/enhanceJavaFormHttp\")\n    public Result enhanceJavaFormHttp(@RequestBody JSONObject params) {\n        log.info(\" =========================================================== \");\n        log.info(\"params: \" + params.toJSONString());\n        log.info(\"params.tableName: \" + params.getString(\"tableName\"));\n        log.info(\"params.json: \" + params.getJSONObject(\"json\").toJSONString());\n        log.info(\" =========================================================== \");\n        return Result.OK(\"1\");\n    }\n\n    @GetMapping(value = \"/hello\")\n    public String hello(HttpServletRequest req) {\n        return \"hello world!\";\n    }\n\n    // =====Vue3 Native  原生页面示例===============================================================================================\n    @GetMapping(value = \"/oneNative/list\")\n    public Result oneNativeList(@RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo, @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize){\n        Object oneNative = redisUtil.get(\"one-native\");\n        JSONArray data = new JSONArray();\n        if(null != oneNative){\n            JSONObject nativeObject = (JSONObject) oneNative;\n            data = nativeObject.getJSONArray(\"data\");\n        }\n        IPage<JSONObject> objectPage = queryDataPage(data, pageNo, pageSize);\n        return Result.OK(objectPage);\n    }\n    \n    @PostMapping(\"/oneNative/add\")\n    public Result<String> oneNativeAdd(@RequestBody JSONObject jsonObject){\n        Object oneNative = redisUtil.get(\"one-native\");\n        JSONObject nativeObject = new JSONObject();\n        JSONArray data = new JSONArray();\n        if(null != oneNative){\n            nativeObject = (JSONObject) oneNative;\n            data = nativeObject.getJSONArray(\"data\");\n        }\n        jsonObject.put(\"id\", UUIDGenerator.generate());\n        data.add(jsonObject);\n        nativeObject.put(\"data\",data);\n        redisUtil.set(\"one-native\",nativeObject);\n        return Result.OK(\"添加成功\");\n    }\n    \n    @PutMapping(\"/oneNative/edit\")\n    public Result<String> oneNativeEdit(@RequestBody JSONObject jsonObject){\n        JSONObject oneNative = (JSONObject)redisUtil.get(\"one-native\");\n        JSONArray data = oneNative.getJSONArray(\"data\");\n        data = getNativeById(data,jsonObject);\n        oneNative.put(\"data\", data);\n        redisUtil.set(\"one-native\", oneNative);\n        return Result.OK(\"修改成功\");\n    }\n\n    @DeleteMapping(\"/oneNative/delete\")\n    public Result<String> oneNativeDelete(@RequestParam(name = \"ids\") String ids){\n        Object oneNative = redisUtil.get(\"one-native\");\n        if(null != oneNative){\n            JSONObject nativeObject = (JSONObject) oneNative;\n            JSONArray data = nativeObject.getJSONArray(\"data\");\n            data = deleteNativeById(data,ids);\n            nativeObject.put(\"data\",data);\n            redisUtil.set(\"one-native\",nativeObject);\n        }\n        return Result.OK(\"删除成功\");\n    }\n    \n    /**\n     * 获取redis对应id的数据\n     * @param data\n     * @param jsonObject\n     * @return\n     */\n    public JSONArray getNativeById(JSONArray data,JSONObject jsonObject){\n        String dbId = \"id\";\n        String id = jsonObject.getString(dbId);\n        for (int i = 0; i < data.size(); i++) {\n            if(id.equals(data.getJSONObject(i).getString(dbId))){\n                data.set(i,jsonObject);\n                break;\n            }\n        }\n        return data;\n    }\n\n    /**\n     * 删除redis中包含的id数据\n     * @param data\n     * @param ids\n     * @return\n     */\n    public JSONArray deleteNativeById(JSONArray data,String ids){\n        String dbId = \"id\";\n        for (int i = 0; i < data.size(); i++) {\n            //如果id包含直接清除data中的数据\n            if(ids.contains(data.getJSONObject(i).getString(dbId))){\n                data.fluentRemove(i);\n            }\n            //判断data的长度是否还剩1位\n            if(data.size() == 1 && ids.contains(data.getJSONObject(0).getString(dbId))){\n                data.fluentRemove(0);\n            }\n        }\n        return data;\n    }\n\n    /**\n     * 模拟查询数据，可以根据父ID查询，可以分页\n     *\n     * @param dataList 数据列表\n     * @param pageNo   页码\n     * @param pageSize 页大小\n     * @return\n     */\n    private IPage<JSONObject> queryDataPage(JSONArray dataList, Integer pageNo, Integer pageSize) {\n        // 根据父级id查询子级\n        JSONArray dataDb = dataList;\n        // 模拟分页（实际中应用SQL自带的分页）\n        List<JSONObject> records = new ArrayList<>();\n        IPage<JSONObject> page;\n        long beginIndex, endIndex;\n        // 如果任意一个参数为null，则不分页\n        if (pageNo == null || pageSize == null) {\n            page = new Page<>(0, dataDb.size());\n            beginIndex = 0;\n            endIndex = dataDb.size();\n        } else {\n            page = new Page<>(pageNo, pageSize);\n            beginIndex = page.offset();\n            endIndex = page.offset() + page.getSize();\n        }\n        for (long i = beginIndex; (i < endIndex && i < dataDb.size()); i++) {\n            JSONObject data = dataDb.getJSONObject((int) i);\n            data = JSON.parseObject(data.toJSONString());\n            // 不返回 children\n            data.remove(\"children\");\n            records.add(data);\n        }\n        page.setRecords(records);\n        page.setTotal(dataDb.size());\n        return page;\n    }\n    // =====Vue3 Native  原生页面示例===============================================================================================\n\n\n    /**\n     * 获取创建人\n     * @return\n     */\n    @GetMapping(value = \"/groupList\")\n    public Result<?> groupList() {\n        return Result.ok(jeecgDemoService.getCreateByList());\n    }\n\n    /**\n     * 测试Mono对象\n     * @return\n     */\n    @GetMapping(value =\"/test\")\n    public Mono<String> test() {\n        //解决shiro报错No SecurityManager accessible to the calling code, either bound to the org.apache.shiro\n        // https://blog.csdn.net/Japhet_jiu/article/details/131177210\n        DefaultSecurityManager securityManager = new DefaultSecurityManager();\n        SecurityUtils.setSecurityManager(securityManager);\n        \n        return Mono.just(\"测试\");\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDynamicDataController.java",
    "content": "package org.jeecg.modules.demo.test.controller;\n\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.modules.demo.test.entity.JeecgDemo;\nimport org.jeecg.modules.demo.test.service.IJeecgDemoService;\nimport org.jeecg.modules.demo.test.service.IJeecgDynamicDataService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.List;\n\n/**\n * @Description: 动态数据源测试\n * @Author: zyf\n * @Date:2020-04-21\n */\n@Slf4j\n@Tag(name = \"动态数据源测试\")\n@RestController\n@RequestMapping(\"/test/dynamic\")\npublic class JeecgDynamicDataController extends JeecgController<JeecgDemo, IJeecgDemoService> {\n\n    @Autowired\n    private IJeecgDynamicDataService jeecgDynamicDataService;\n\n\n    /**\n     * 动态切换数据源\n\n     * @return\n     */\n    @PostMapping(value = \"/test1\")\n    @AutoLog(value = \"动态切换数据源\")\n    @Operation(summary = \"动态切换数据源\")\n    public Result<List<JeecgDemo>> selectSpelByKey(@RequestParam(required = false) String dsName) {\n        List<JeecgDemo> list = jeecgDynamicDataService.selectSpelByKey(dsName);\n        return Result.OK(list);\n    }\n\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderErpMainController.java",
    "content": "package org.jeecg.modules.demo.test.controller;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.modules.demo.test.entity.JeecgOrderCustomer;\nimport org.jeecg.modules.demo.test.entity.JeecgOrderMain;\nimport org.jeecg.modules.demo.test.entity.JeecgOrderTicket;\nimport org.jeecg.modules.demo.test.service.IJeecgOrderCustomerService;\nimport org.jeecg.modules.demo.test.service.IJeecgOrderMainService;\nimport org.jeecg.modules.demo.test.service.IJeecgOrderTicketService;\nimport org.jeecg.modules.demo.test.vo.JeecgOrderMainPage;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.util.Arrays;\n\n/**\n * @Description: 一对多示例（ERP TAB风格）\n * @Author: ZhiLin\n * @Date: 2019-02-20\n * @Version: v2.0\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/test/order\")\npublic class JeecgOrderErpMainController {\n\n    @Autowired\n    private IJeecgOrderMainService jeecgOrderMainService;\n    @Autowired\n    private IJeecgOrderCustomerService jeecgOrderCustomerService;\n    @Autowired\n    private IJeecgOrderTicketService jeecgOrderTicketService;\n\n    /**\n     * 分页列表查询\n     *\n     * @param jeecgOrderMain\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @GetMapping(value = \"/orderList\")\n    public Result<?> respondePagedData(JeecgOrderMain jeecgOrderMain,\n                                       @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                       @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                       HttpServletRequest req) {\n        QueryWrapper<JeecgOrderMain> queryWrapper = QueryGenerator.initQueryWrapper(jeecgOrderMain, req.getParameterMap());\n        Page<JeecgOrderMain> page = new Page<JeecgOrderMain>(pageNo, pageSize);\n        IPage<JeecgOrderMain> pageList = jeecgOrderMainService.page(page, queryWrapper);\n        return Result.ok(pageList);\n    }\n\n    /**\n     * 添加\n     *\n     * @param jeecgOrderMainPage\n     * @return\n     */\n    @PostMapping(value = \"/add\")\n    public Result<?> add(@RequestBody JeecgOrderMainPage jeecgOrderMainPage) {\n        JeecgOrderMain jeecgOrderMain = new JeecgOrderMain();\n        BeanUtils.copyProperties(jeecgOrderMainPage, jeecgOrderMain);\n        jeecgOrderMainService.save(jeecgOrderMain);\n        return Result.ok(\"添加成功!\");\n    }\n\n    /**\n     * 编辑\n     *\n     * @param jeecgOrderMainPage\n     * @return\n     */\n    @RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n    public Result<?> edit(@RequestBody JeecgOrderMainPage jeecgOrderMainPage) {\n        JeecgOrderMain jeecgOrderMain = new JeecgOrderMain();\n        BeanUtils.copyProperties(jeecgOrderMainPage, jeecgOrderMain);\n        jeecgOrderMainService.updateById(jeecgOrderMain);\n        return Result.ok(\"编辑成功!\");\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @DeleteMapping(value = \"/delete\")\n    public Result<?> delete(@RequestParam(name = \"id\", required = true) String id) {\n        jeecgOrderMainService.delMain(id);\n        return Result.ok(\"删除成功!\");\n    }\n\n    /**\n     * 批量删除\n     *\n     * @param ids\n     * @return\n     */\n    @DeleteMapping(value = \"/deleteBatch\")\n    public Result<?> deleteBatch(@RequestParam(name = \"ids\", required = true) String ids) {\n        this.jeecgOrderMainService.removeByIds(Arrays.asList(ids.split(\",\")));\n        return Result.ok(\"批量删除成功!\");\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    @GetMapping(value = \"/queryById\")\n    public Result<?> queryById(@RequestParam(name = \"id\", required = true) String id) {\n        JeecgOrderMain jeecgOrderMain = jeecgOrderMainService.getById(id);\n        return Result.ok(jeecgOrderMain);\n    }\n\n\n    /**\n     * 通过id查询\n     *\n     * @param jeecgOrderCustomer\n     * @return\n     */\n    @GetMapping(value = \"/listOrderCustomerByMainId\")\n    public Result<?> queryOrderCustomerListByMainId(JeecgOrderCustomer jeecgOrderCustomer,\n                                                    @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                                    @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                                    HttpServletRequest req) {\n        QueryWrapper<JeecgOrderCustomer> queryWrapper = QueryGenerator.initQueryWrapper(jeecgOrderCustomer, req.getParameterMap());\n        Page<JeecgOrderCustomer> page = new Page<JeecgOrderCustomer>(pageNo, pageSize);\n        IPage<JeecgOrderCustomer> pageList = jeecgOrderCustomerService.page(page, queryWrapper);\n        return Result.ok(pageList);\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param jeecgOrderTicket\n     * @return\n     */\n    @GetMapping(value = \"/listOrderTicketByMainId\")\n    public Result<?> queryOrderTicketListByMainId(JeecgOrderTicket jeecgOrderTicket,\n                                                  @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                                  @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                                  HttpServletRequest req) {\n        QueryWrapper<JeecgOrderTicket> queryWrapper = QueryGenerator.initQueryWrapper(jeecgOrderTicket, req.getParameterMap());\n        Page<JeecgOrderTicket> page = new Page<JeecgOrderTicket>(pageNo, pageSize);\n        IPage<JeecgOrderTicket> pageList = jeecgOrderTicketService.page(page, queryWrapper);\n        return Result.ok(pageList);\n    }\n\n    /**\n     * 添加\n     *\n     * @param jeecgOrderCustomer\n     * @return\n     */\n    @PostMapping(value = \"/addCustomer\")\n    public Result<?> addCustomer(@RequestBody JeecgOrderCustomer jeecgOrderCustomer) {\n        jeecgOrderCustomerService.save(jeecgOrderCustomer);\n        return Result.ok(\"添加成功!\");\n    }\n\n    /**\n     * 编辑\n     *\n     * @param jeecgOrderCustomer\n     * @return\n     */\n    @RequestMapping(value = \"/editCustomer\", method = {RequestMethod.PUT,RequestMethod.POST})\n    public Result<?> editCustomer(@RequestBody JeecgOrderCustomer jeecgOrderCustomer) {\n        jeecgOrderCustomerService.updateById(jeecgOrderCustomer);\n        return Result.ok(\"添加成功!\");\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @DeleteMapping(value = \"/deleteCustomer\")\n    public Result<?> deleteCustomer(@RequestParam(name = \"id\", required = true) String id) {\n        jeecgOrderCustomerService.removeById(id);\n        return Result.ok(\"删除成功!\");\n    }\n\n    /**\n     * 批量删除\n     *\n     * @param ids\n     * @return\n     */\n    @DeleteMapping(value = \"/deleteBatchCustomer\")\n    public Result<?> deleteBatchCustomer(@RequestParam(name = \"ids\", required = true) String ids) {\n        this.jeecgOrderCustomerService.removeByIds(Arrays.asList(ids.split(\",\")));\n        return Result.ok(\"批量删除成功!\");\n    }\n\n    /**\n     * 添加\n     *\n     * @param jeecgOrderTicket\n     * @return\n     */\n    @PostMapping(value = \"/addTicket\")\n    public Result<?> addTicket(@RequestBody JeecgOrderTicket jeecgOrderTicket) {\n        jeecgOrderTicketService.save(jeecgOrderTicket);\n        return Result.ok(\"添加成功!\");\n    }\n\n    /**\n     * 编辑\n     *\n     * @param jeecgOrderTicket\n     * @return\n     */\n    @RequestMapping(value = \"/editTicket\", method = {RequestMethod.PUT,RequestMethod.POST})\n    public Result<?> editTicket(@RequestBody JeecgOrderTicket jeecgOrderTicket) {\n        jeecgOrderTicketService.updateById(jeecgOrderTicket);\n        return Result.ok(\"编辑成功!\");\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @DeleteMapping(value = \"/deleteTicket\")\n    public Result<?> deleteTicket(@RequestParam(name = \"id\", required = true) String id) {\n        jeecgOrderTicketService.removeById(id);\n        return Result.ok(\"删除成功!\");\n    }\n\n    /**\n     * 批量删除\n     *\n     * @param ids\n     * @return\n     */\n    @DeleteMapping(value = \"/deleteBatchTicket\")\n    public Result<?> deleteBatchTicket(@RequestParam(name = \"ids\", required = true) String ids) {\n        this.jeecgOrderTicketService.removeByIds(Arrays.asList(ids.split(\",\")));\n        return Result.ok(\"批量删除成功!\");\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderMainController.java",
    "content": "package org.jeecg.modules.demo.test.controller;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\n\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.demo.test.entity.JeecgDemo;\nimport org.jeecg.modules.demo.test.entity.JeecgOrderCustomer;\nimport org.jeecg.modules.demo.test.entity.JeecgOrderMain;\nimport org.jeecg.modules.demo.test.entity.JeecgOrderTicket;\nimport org.jeecg.modules.demo.test.service.IJeecgDemoService;\nimport org.jeecg.modules.demo.test.service.IJeecgOrderCustomerService;\nimport org.jeecg.modules.demo.test.service.IJeecgOrderMainService;\nimport org.jeecg.modules.demo.test.service.IJeecgOrderTicketService;\nimport org.jeecg.modules.demo.test.vo.JeecgOrderMainPage;\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.DeleteMapping;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.PutMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * @Description: 一对多示例（JEditableTable行编辑）\n * @Author: jeecg-boot\n * @Date:2019-02-15\n * @Version: V2.0\n */\n@RestController\n@RequestMapping(\"/test/jeecgOrderMain\")\n@Slf4j\npublic class JeecgOrderMainController extends JeecgController<JeecgOrderMain, IJeecgOrderMainService> {\n\n    @Autowired\n    private IJeecgOrderMainService jeecgOrderMainService;\n    @Autowired\n    private IJeecgOrderCustomerService jeecgOrderCustomerService;\n    @Autowired\n    private IJeecgOrderTicketService jeecgOrderTicketService;\n\n    /**\n     * 分页列表查询\n     *\n     * @param jeecgOrderMain\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @GetMapping(value = \"/list\")\n    public Result<?> queryPageList(JeecgOrderMain jeecgOrderMain, @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo, @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize, HttpServletRequest req) {\n        QueryWrapper<JeecgOrderMain> queryWrapper = QueryGenerator.initQueryWrapper(jeecgOrderMain, req.getParameterMap());\n        Page<JeecgOrderMain> page = new Page<JeecgOrderMain>(pageNo, pageSize);\n        IPage<JeecgOrderMain> pageList = jeecgOrderMainService.page(page, queryWrapper);\n        return Result.ok(pageList);\n    }\n\n    /**\n     * 添加\n     *\n     * @param jeecgOrderMainPage\n     * @return\n     */\n    @PostMapping(value = \"/add\")\n    public Result<?> add(@RequestBody JeecgOrderMainPage jeecgOrderMainPage) {\n        JeecgOrderMain jeecgOrderMain = new JeecgOrderMain();\n        BeanUtils.copyProperties(jeecgOrderMainPage, jeecgOrderMain);\n        jeecgOrderMainService.saveMain(jeecgOrderMain, jeecgOrderMainPage.getJeecgOrderCustomerList(), jeecgOrderMainPage.getJeecgOrderTicketList());\n        return Result.ok(\"添加成功！\");\n    }\n\n    /**\n     * 编辑\n     *\n     * @param jeecgOrderMainPage\n     * @return\n     */\n    @RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n    public Result<?> eidt(@RequestBody JeecgOrderMainPage jeecgOrderMainPage) {\n        JeecgOrderMain jeecgOrderMain = new JeecgOrderMain();\n        BeanUtils.copyProperties(jeecgOrderMainPage, jeecgOrderMain);\n        jeecgOrderMainService.updateCopyMain(jeecgOrderMain, jeecgOrderMainPage.getJeecgOrderCustomerList(), jeecgOrderMainPage.getJeecgOrderTicketList());\n        return Result.ok(\"编辑成功！\");\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @DeleteMapping(value = \"/delete\")\n    public Result<?> delete(@RequestParam(name = \"id\", required = true) String id) {\n        jeecgOrderMainService.delMain(id);\n        return Result.ok(\"删除成功!\");\n    }\n\n    /**\n     * 批量删除\n     *\n     * @param ids\n     * @return\n     */\n    @DeleteMapping(value = \"/deleteBatch\")\n    public Result<?> deleteBatch(@RequestParam(name = \"ids\", required = true) String ids) {\n        this.jeecgOrderMainService.delBatchMain(Arrays.asList(ids.split(\",\")));\n        return Result.ok(\"批量删除成功!\");\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    @GetMapping(value = \"/queryById\")\n    public Result<?> queryById(@RequestParam(name = \"id\", required = true) String id) {\n        JeecgOrderMain jeecgOrderMain = jeecgOrderMainService.getById(id);\n        return Result.ok(jeecgOrderMain);\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    @GetMapping(value = \"/queryOrderCustomerListByMainId\")\n    public Result<?> queryOrderCustomerListByMainId(@RequestParam(name = \"id\", required = true) String id) {\n        List<JeecgOrderCustomer> jeecgOrderCustomerList = jeecgOrderCustomerService.selectCustomersByMainId(id);\n        return Result.ok(jeecgOrderCustomerList);\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    @GetMapping(value = \"/queryOrderTicketListByMainId\")\n    public Result<?> queryOrderTicketListByMainId(@RequestParam(name = \"id\", required = true) String id) {\n        List<JeecgOrderTicket> jeecgOrderTicketList = jeecgOrderTicketService.selectTicketsByMainId(id);\n        return Result.ok(jeecgOrderTicketList);\n    }\n\n    /**\n     * 导出excel\n     *\n     * @param request\n     */\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, JeecgOrderMain jeecgOrderMain) {\n        // Step.1 组装查询条件\n        QueryWrapper<JeecgOrderMain> queryWrapper = QueryGenerator.initQueryWrapper(jeecgOrderMain, request.getParameterMap());\n        //Step.2 AutoPoi 导出Excel\n        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n        //获取当前用户\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\n        List<JeecgOrderMainPage> pageList = new ArrayList<JeecgOrderMainPage>();\n\n        List<JeecgOrderMain> jeecgOrderMainList = jeecgOrderMainService.list(queryWrapper);\n        for (JeecgOrderMain orderMain : jeecgOrderMainList) {\n            JeecgOrderMainPage vo = new JeecgOrderMainPage();\n            BeanUtils.copyProperties(orderMain, vo);\n            // 查询机票\n            List<JeecgOrderTicket> jeecgOrderTicketList = jeecgOrderTicketService.selectTicketsByMainId(orderMain.getId());\n            vo.setJeecgOrderTicketList(jeecgOrderTicketList);\n            // 查询客户\n            List<JeecgOrderCustomer> jeecgOrderCustomerList = jeecgOrderCustomerService.selectCustomersByMainId(orderMain.getId());\n            vo.setJeecgOrderCustomerList(jeecgOrderCustomerList);\n            pageList.add(vo);\n        }\n\n        // 导出文件名称\n        mv.addObject(NormalExcelConstants.FILE_NAME, \"一对多订单示例\");\n        // 注解对象Class\n        mv.addObject(NormalExcelConstants.CLASS, JeecgOrderMainPage.class);\n        // 自定义表格参数\n        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(\"自定义导出Excel内容标题\", \"导出人:\" + sysUser.getRealname(), \"自定义Sheet名字\"));\n        // 导出数据列表\n        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);\n        return mv;\n    }\n\n    /**\n     * 通过excel导入数据\n     *\n     * @param request\n     * @param\n     * @return\n     */\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n            // 获取上传文件对象\n            MultipartFile file = entity.getValue();\n            ImportParams params = new ImportParams();\n            params.setTitleRows(2);\n            params.setHeadRows(2);\n            params.setNeedSave(true);\n            try {\n                List<JeecgOrderMainPage> list = ExcelImportUtil.importExcel(file.getInputStream(), JeecgOrderMainPage.class, params);\n                for (JeecgOrderMainPage page : list) {\n                    JeecgOrderMain po = new JeecgOrderMain();\n                    BeanUtils.copyProperties(page, po);\n                    jeecgOrderMainService.saveMain(po, page.getJeecgOrderCustomerList(), page.getJeecgOrderTicketList());\n                }\n                return Result.ok(\"文件导入成功！\");\n            } catch (Exception e) {\n                log.error(e.getMessage(), e);\n                return Result.error(\"文件导入失败：\" + e.getMessage());\n            } finally {\n                try {\n                    file.getInputStream().close();\n                } catch (Exception e) {\n                    e.printStackTrace();\n                }\n            }\n        }\n        return Result.error(\"文件导入失败！\");\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JoaDemoController.java",
    "content": "package org.jeecg.modules.demo.test.controller;\n\nimport java.io.IOException;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLDecoder;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\n\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.demo.test.entity.JoaDemo;\nimport org.jeecg.modules.demo.test.service.IJoaDemoService;\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.DeleteMapping;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.PutMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport com.alibaba.fastjson.JSON;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\n\nimport lombok.extern.slf4j.Slf4j;\n\n /**\n * @Description: 流程测试\n * @Author: jeecg-boot\n * @Date:   2019-05-14\n * @Version: V1.0\n */\n@RestController\n@RequestMapping(\"/test/joaDemo\")\n@Slf4j\npublic class JoaDemoController {\n\t@Autowired\n\tprivate IJoaDemoService joaDemoService;\n\t\n\t/**\n\t  * 分页列表查询\n\t * @param joaDemo\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t@GetMapping(value = \"/list\")\n\tpublic Result<IPage<JoaDemo>> queryPageList(JoaDemo joaDemo,\n\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t\t  HttpServletRequest req) {\n\t\tResult<IPage<JoaDemo>> result = new Result<IPage<JoaDemo>>();\n\t\tQueryWrapper<JoaDemo> queryWrapper = QueryGenerator.initQueryWrapper(joaDemo, req.getParameterMap());\n\t\tPage<JoaDemo> page = new Page<JoaDemo>(pageNo, pageSize);\n\t\tIPage<JoaDemo> pageList = joaDemoService.page(page, queryWrapper);\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(pageList);\n\t\treturn result;\n\t}\n\t\n\t/**\n\t  *   添加\n\t * @param joaDemo\n\t * @return\n\t */\n\t@PostMapping(value = \"/add\")\n\tpublic Result<JoaDemo> add(@RequestBody JoaDemo joaDemo) {\n\t\tResult<JoaDemo> result = new Result<JoaDemo>();\n\t\ttry {\n\t\t\tjoaDemoService.save(joaDemo);\n\t\t\tresult.success(\"添加成功！\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t\tresult.error500(\"操作失败\");\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t  *  编辑\n\t * @param joaDemo\n\t * @return\n\t */\n\t@PutMapping(value = \"/edit\")\n\tpublic Result<JoaDemo> edit(@RequestBody JoaDemo joaDemo) {\n\t\tResult<JoaDemo> result = new Result<JoaDemo>();\n\t\tJoaDemo joaDemoEntity = joaDemoService.getById(joaDemo.getId());\n\t\tif(joaDemoEntity==null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}else {\n\t\t\tboolean ok = joaDemoService.updateById(joaDemo);\n\t\t\t//TODO 返回false说明什么？\n\t\t\tif(ok) {\n\t\t\t\tresult.success(\"修改成功!\");\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\t\n\t/**\n\t  *   通过id删除\n\t * @param id\n\t * @return\n\t */\n\t@DeleteMapping(value = \"/delete\")\n\tpublic Result<JoaDemo> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\tResult<JoaDemo> result = new Result<JoaDemo>();\n\t\tJoaDemo joaDemo = joaDemoService.getById(id);\n\t\tif(joaDemo==null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}else {\n\t\t\tboolean ok = joaDemoService.removeById(id);\n\t\t\tif(ok) {\n\t\t\t\tresult.success(\"删除成功!\");\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\t\n\t/**\n\t  *  批量删除\n\t * @param ids\n\t * @return\n\t */\n\t@DeleteMapping(value = \"/deleteBatch\")\n\tpublic Result<JoaDemo> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tResult<JoaDemo> result = new Result<JoaDemo>();\n\t\tif(ids==null || \"\".equals(ids.trim())) {\n\t\t\tresult.error500(\"参数不识别！\");\n\t\t}else {\n\t\t\tthis.joaDemoService.removeByIds(Arrays.asList(ids.split(\",\")));\n\t\t\tresult.success(\"删除成功!\");\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t  * 通过id查询\n\t * @param id\n\t * @return\n\t */\n\t@GetMapping(value = \"/queryById\")\n\tpublic Result<JoaDemo> queryById(@RequestParam(name=\"id\",required=true) String id) {\n\t\tResult<JoaDemo> result = new Result<JoaDemo>();\n\t\tJoaDemo joaDemo = joaDemoService.getById(id);\n\t\tif(joaDemo==null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}else {\n\t\t\tresult.setResult(joaDemo);\n\t\t\tresult.setSuccess(true);\n\t\t}\n\t\treturn result;\n\t}\n\n  /**\n      * 导出excel\n   *\n   * @param request\n   * @param response\n   */\n  @RequestMapping(value = \"/exportXls\")\n  public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {\n      // Step.1 组装查询条件\n      QueryWrapper<JoaDemo> queryWrapper = null;\n      try {\n          String paramsStr = request.getParameter(\"paramsStr\");\n          if (oConvertUtils.isNotEmpty(paramsStr)) {\n              String deString = URLDecoder.decode(paramsStr, \"UTF-8\");\n              JoaDemo joaDemo = JSON.parseObject(deString, JoaDemo.class);\n              queryWrapper = QueryGenerator.initQueryWrapper(joaDemo, request.getParameterMap());\n          }\n      } catch (UnsupportedEncodingException e) {\n          e.printStackTrace();\n      }\n\n      //Step.2 AutoPoi 导出Excel\n      ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n      List<JoaDemo> pageList = joaDemoService.list(queryWrapper);\n      //导出文件名称\n      mv.addObject(NormalExcelConstants.FILE_NAME, \"流程测试列表\");\n      mv.addObject(NormalExcelConstants.CLASS, JoaDemo.class);\n      mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(\"流程测试列表数据\", \"导出人:Jeecg\", \"导出信息\"));\n      mv.addObject(NormalExcelConstants.DATA_LIST, pageList);\n      return mv;\n  }\n\n  /**\n      * 通过excel导入数据\n   *\n   * @param request\n   * @param response\n   * @return\n   */\n  @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n  public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n      MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n      Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n      for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n          // 获取上传文件对象\n          MultipartFile file = entity.getValue();\n          ImportParams params = new ImportParams();\n          params.setTitleRows(2);\n          params.setHeadRows(1);\n          params.setNeedSave(true);\n          try {\n              List<JoaDemo> listJoaDemos = ExcelImportUtil.importExcel(file.getInputStream(), JoaDemo.class, params);\n              for (JoaDemo joaDemoExcel : listJoaDemos) {\n                  joaDemoService.save(joaDemoExcel);\n              }\n              return Result.ok(\"文件导入成功！数据行数:\" + listJoaDemos.size());\n          } catch (Exception e) {\n              log.error(e.getMessage(),e);\n              return Result.error(\"文件导入失败:\"+e.getMessage());\n          } finally {\n              try {\n                  file.getInputStream().close();\n              } catch (IOException e) {\n                  e.printStackTrace();\n              }\n          }\n      }\n      return Result.ok(\"文件导入失败！\");\n  }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/entity/JeecgDemo.java",
    "content": "package org.jeecg.modules.demo.test.entity;\n\nimport java.io.Serializable;\n\nimport com.baomidou.mybatisplus.annotation.Version;\nimport org.jeecg.common.system.base.entity.JeecgEntity;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\n/**\n * @Description: jeecg 测试demo \n * @Author: jeecg-boot \n * @Date:\t2018-12-29 \n * @Version:V1.0\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@Schema(description=\"测试DEMO\")\n@TableName(\"demo\")\npublic class JeecgDemo extends JeecgEntity implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\t/** 姓名 */\n\t@Excel(name=\"姓名\",width=25)\n\t@Schema(description = \"姓名\")\n\tprivate java.lang.String name;\n\t/** 关键词 */\n\t@Schema(description = \"关键词\")\n\t@Excel(name=\"关键词\",width=15)\n\tprivate java.lang.String keyWord;\n\t/** 打卡时间 */\n\t@Schema(description = \"打卡时间\")\n\t@JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@Excel(name=\"打卡时间\",width=20,format=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate java.util.Date punchTime;\n\t/** 工资 */\n\t@Schema(description = \"工资\",example = \"0\")\n\t@Excel(name=\"工资\",type = 4,width=15)\n\tprivate java.math.BigDecimal salaryMoney;\n\t/** 奖金 */\n\t@Schema(description = \"奖金\",example = \"0\")\n\t@Excel(name=\"奖金\",type = 4,width=15)\n\tprivate java.lang.Double bonusMoney;\n\t/** 性别 {男:1,女:2} */\n\t@Schema(description = \"性别\")\n\t@Excel(name = \"性别\", width = 15, dicCode = \"sex\")\n\tprivate java.lang.String sex;\n\t/** 年龄 */\n\t@Schema(description = \"年龄\",example = \"0\")\n\t@Excel(name=\"年龄\",type = 4,width=15)\n\tprivate java.lang.Integer age;\n\t/** 生日 */\n\t@Schema(description = \"生日\")\n\t@JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd\")\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd\")\n\t@Excel(name=\"生日\",format=\"yyyy-MM-dd\")\n\tprivate java.util.Date birthday;\n\t/** 邮箱 */\n\t@Schema(description = \"邮箱\")\n\t@Excel(name=\"邮箱\",width=30)\n\tprivate java.lang.String email;\n\t/** 个人简介 */\n\t@Schema(description = \"个人简介\")\n\tprivate java.lang.String content;\n\t/** 部门编码 */\n\t@Excel(name=\"部门编码\",width=25)\n\t@Schema(description = \"部门编码\")\n\tprivate java.lang.String sysOrgCode;\n\n\t@Schema(description = \"租户ID\")\n\tprivate java.lang.Integer tenantId;\n\t/** 乐观锁字段 */\n\t@Version\n\tprivate java.lang.Integer updateCount;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderCustomer.java",
    "content": "package org.jeecg.modules.demo.test.entity;\n\nimport java.io.Serializable;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\n/**\n * @Description: 订单客户\n * @Author: jeecg-boot\n * @Date:  2019-02-15\n * @Version: V1.0\n */\n@Data\n@TableName(\"jeecg_order_customer\")\npublic class JeecgOrderCustomer implements Serializable {\n    private static final long serialVersionUID = 1L;\n    \n\t/**主键*/\n    @TableId(type = IdType.ASSIGN_ID)\n\tprivate java.lang.String id;\n\t/**客户名*/\n\t@Excel(name=\"客户名字\",width=15)\n\tprivate java.lang.String name;\n\t/**性别*/\n\tprivate java.lang.String sex;\n\t/**身份证号码*/\n\t@Excel(name=\"身份证号码\",width=15)\n\tprivate java.lang.String idcard;\n\t/**身份证扫描件*/\n\tprivate java.lang.String idcardPic;\n\t/**电话1*/\n\t@Excel(name=\"电话\",width=15)\n\tprivate java.lang.String telphone;\n\t/**外键*/\n\tprivate java.lang.String orderId;\n\t/**创建人*/\n\tprivate java.lang.String createBy;\n\t/**创建时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate java.util.Date createTime;\n\t/**修改人*/\n\tprivate java.lang.String updateBy;\n\t/**修改时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate java.util.Date updateTime;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderMain.java",
    "content": "package org.jeecg.modules.demo.test.entity;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\n\n/**\n * @Description: 订单\n * @Author: jeecg-boot\n * @Date:  2019-02-15\n * @Version: V1.0\n */\n@Data\n@TableName(\"jeecg_order_main\")\npublic class JeecgOrderMain implements Serializable {\n    private static final long serialVersionUID = 1L;\n    \n\t/**主键*/\n    @TableId(type = IdType.ASSIGN_ID)\n\tprivate java.lang.String id;\n\t/**订单号*/\n\tprivate java.lang.String orderCode;\n\t/**订单类型*/\n\tprivate java.lang.String ctype;\n\t/**订单日期*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate java.util.Date orderDate;\n\t/**订单金额*/\n\tprivate java.lang.Double orderMoney;\n\t/**订单备注*/\n\tprivate java.lang.String content;\n\t/**创建人*/\n\tprivate java.lang.String createBy;\n\t/**创建时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate java.util.Date createTime;\n\t/**修改人*/\n\tprivate java.lang.String updateBy;\n\t/**修改时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate java.util.Date updateTime;\n\n\tprivate String bpmStatus;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderTicket.java",
    "content": "package org.jeecg.modules.demo.test.entity;\n\nimport java.io.Serializable;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\n/**\n * @Description: 订单机票\n * @Author: jeecg-boot\n * @Date:  2019-02-15\n * @Version: V1.0\n */\n@Data\n@TableName(\"jeecg_order_ticket\")\npublic class JeecgOrderTicket implements Serializable {\n    private static final long serialVersionUID = 1L;\n    \n\t/**主键*/\n    @TableId(type = IdType.ASSIGN_ID)\n\tprivate java.lang.String id;\n\t/**航班号*/\n\t@Excel(name=\"航班号\",width=15)\n\tprivate java.lang.String ticketCode;\n\t/**航班时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t@Excel(name=\"航班时间\",width=15,format = \"yyyy-MM-dd\")\n\tprivate java.util.Date tickectDate;\n\t/**外键*/\n\tprivate java.lang.String orderId;\n\t/**创建人*/\n\tprivate java.lang.String createBy;\n\t/**创建时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate java.util.Date createTime;\n\t/**修改人*/\n\tprivate java.lang.String updateBy;\n\t/**修改时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate java.util.Date updateTime;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/entity/JoaDemo.java",
    "content": "package org.jeecg.modules.demo.test.entity;\n\nimport java.io.Serializable;\n\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport lombok.Data;\n\n/**\n * @Description: 流程测试\n * @Author: jeecg-boot\n * @Date:   2019-05-14\n * @Version: V1.0\n */\n@Data\n@TableName(\"joa_demo\")\npublic class JoaDemo implements Serializable {\n    private static final long serialVersionUID = 1L;\n    \n\t/**ID*/\n\t@TableId(type = IdType.ASSIGN_ID)\n\tprivate java.lang.String id;\n\t/**请假人*/\n\t@Excel(name = \"请假人\", width = 15)\n\tprivate java.lang.String name;\n\t/**请假天数*/\n\t@Excel(name = \"请假天数\", width = 15)\n\tprivate java.lang.Integer days;\n\t/**开始时间*/\n\t@Excel(name = \"开始时间\", width = 20, format = \"yyyy-MM-dd\")\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\tprivate java.util.Date beginDate;\n\t/**请假结束时间*/\n\t@Excel(name = \"请假结束时间\", width = 20, format = \"yyyy-MM-dd\")\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\tprivate java.util.Date endDate;\n\t/**请假原因*/\n\t@Excel(name = \"请假原因\", width = 15)\n\tprivate java.lang.String reason;\n\t/**流程状态*/\n\t@Excel(name = \"流程状态\", width = 15)\n\tprivate java.lang.String bpmStatus;\n\t/**创建人id*/\n\t@Excel(name = \"创建人id\", width = 15)\n\tprivate java.lang.String createBy;\n\t/**创建时间*/\n\t@Excel(name = \"创建时间\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate java.util.Date createTime;\n\t/**修改时间*/\n\t@Excel(name = \"修改时间\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate java.util.Date updateTime;\n\t/**修改人id*/\n\t@Excel(name = \"修改人id\", width = 15)\n\tprivate java.lang.String updateBy;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java",
    "content": "package org.jeecg.modules.demo.test.mapper;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.demo.test.entity.JeecgDemo;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\n\n/**\n * @Description: jeecg 测试demo\n * @Author: jeecg-boot\n * @Date:  2018-12-29\n * @Version: V1.0\n */\npublic interface JeecgDemoMapper extends BaseMapper<JeecgDemo> {\n\n    /**\n     * 根据姓名查询demo列表数据\n     * @param name 姓名\n     * @return demo集合\n     */\n\tpublic List<JeecgDemo> getDemoByName(@Param(\"name\") String name);\n\t\n\t/**\n\t * 查询列表数据 直接传数据权限的sql进行数据过滤\n\t * @param page\n\t * @param permissionSql\n\t * @return\n\t */\n\tpublic IPage<JeecgDemo> queryListWithPermission(Page<JeecgDemo> page,@Param(\"permissionSql\")String permissionSql);\n\n\t/**\n\t * 根据前缀获取所有有效权限\n\t * @param permsPrefix\n\t * @return\n\t */\n\tpublic List<String> queryAllAuth(@Param(\"permsPrefix\")String permsPrefix);\n\n\t/**\n\t * 查询用户已授权字段\n\t * @param userId\n\t * @param permsPrefix\n\t * @return\n\t */\n\tpublic List<String> queryUserAuth(@Param(\"userId\")String userId,@Param(\"permsPrefix\")String permsPrefix);\n\n\n\t/**\n\t * 获取创建人\n\t * @return\n\t */\n\tList<String> getCreateByList();\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderCustomerMapper.java",
    "content": "package org.jeecg.modules.demo.test.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Delete;\nimport org.apache.ibatis.annotations.Select;\nimport org.jeecg.modules.demo.test.entity.JeecgOrderCustomer;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: 订单客户\n * @Author: jeecg-boot\n * @Date:  2019-02-15\n * @Version: V1.0\n */\npublic interface JeecgOrderCustomerMapper extends BaseMapper<JeecgOrderCustomer> {\n\t\n\t/**\n\t *  通过主表外键批量删除客户\n\t * @param mainId\n\t * @return\n\t */\n    @Delete(\"DELETE FROM JEECG_ORDER_CUSTOMER WHERE ORDER_ID = #{mainId}\")\n\tpublic boolean deleteCustomersByMainId(String mainId);\n\n    /**\n     * 通过主表订单外键查询客户\n     * @param mainId 订单id\n     * @return 订单客户集合\n     */\n    @Select(\"SELECT * FROM JEECG_ORDER_CUSTOMER WHERE ORDER_ID = #{mainId}\")\n\tpublic List<JeecgOrderCustomer> selectCustomersByMainId(String mainId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderMainMapper.java",
    "content": "package org.jeecg.modules.demo.test.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.demo.test.entity.JeecgOrderMain;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: 订单\n * @Author: jeecg-boot\n * @Date:  2019-02-15\n * @Version: V1.0\n */\npublic interface JeecgOrderMainMapper extends BaseMapper<JeecgOrderMain> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderTicketMapper.java",
    "content": "package org.jeecg.modules.demo.test.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Delete;\nimport org.apache.ibatis.annotations.Select;\nimport org.jeecg.modules.demo.test.entity.JeecgOrderTicket;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: 订单机票\n * @Author: jeecg-boot\n * @Date:  2019-02-15\n * @Version: V1.0\n */\npublic interface JeecgOrderTicketMapper extends BaseMapper<JeecgOrderTicket> {\n\n\t/**\n\t *  通过主表外键批量删除客户\n\t * @param mainId\n\t * @return\n\t */\n    @Delete(\"DELETE FROM JEECG_ORDER_TICKET WHERE ORDER_ID = #{mainId}\")\n\tpublic boolean deleteTicketsByMainId(String mainId);\n\n    /**\n     * 通过主表订单外键查询订单机票\n     * @param mainId 订单id\n     * @return 返回订单机票集合\n     */\n    @Select(\"SELECT * FROM JEECG_ORDER_TICKET WHERE ORDER_ID = #{mainId}\")\n\tpublic List<JeecgOrderTicket> selectTicketsByMainId(String mainId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JoaDemoMapper.java",
    "content": "package org.jeecg.modules.demo.test.mapper;\n\nimport org.jeecg.modules.demo.test.entity.JoaDemo;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: 流程测试\n * @Author: jeecg-boot\n * @Date:   2019-05-14\n * @Version: V1.0\n */\npublic interface JoaDemoMapper extends BaseMapper<JoaDemo> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgDemoMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.demo.test.mapper.JeecgDemoMapper\">\n\n\t<!-- 根据用户名查询 -->\n\t<select id=\"getDemoByName\" resultType=\"org.jeecg.modules.demo.test.entity.JeecgDemo\">\n\t\tselect * from  demo  where name = #{name}\n\t</select>\n\t\n\t<!-- 根据权限sql查询数据集 20230904 内部写法，调用位置installAuthJdbc，暂不处理sql注入问题-->\n\t<select id=\"queryListWithPermission\" parameterType=\"Object\" resultType=\"org.jeecg.modules.demo.test.entity.JeecgDemo\">\n\t\tselect * from demo where 1=1 ${permissionSql}\n\t</select>\n\n\t<!-- 查询所有符合前缀且有效字段 -->\n\t<select id=\"queryAllAuth\" resultType=\"java.lang.String\">\n        select perms from sys_permission\n        where perms\n        like concat(concat('%',#{permsPrefix}),'%')\n        and del_flag=0\n        and status='1'\n    </select>\n\n\t<!-- 查询用户已授权字段 -->\n\t<select id=\"queryUserAuth\" resultType=\"java.lang.String\">\n        select DISTINCT perms from sys_user_role sur,\n        sys_role_permission srp,\n        sys_permission sp\n        where sur.role_id = srp.role_id\n        and sp.id = srp.permission_id\n        and sur.user_id = #{userId}\n        and sp.perms like concat(concat('%',#{permsPrefix}),'%')\n    </select>\n\n    <!--  获取创建人 -->\n    <select id=\"getCreateByList\" resultType=\"java.lang.String\">\n        select create_by from demo group by create_by\n    </select>\n    \n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderCustomerMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.demo.test.mapper.JeecgOrderCustomerMapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderMainMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.demo.test.mapper.JeecgOrderMainMapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderTicketMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.demo.test.mapper.JeecgOrderTicketMapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JoaDemoMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.demo.test.mapper.JoaDemoMapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgDemoService.java",
    "content": "package org.jeecg.modules.demo.test.service;\n\nimport org.jeecg.common.system.base.service.JeecgService;\nimport org.jeecg.modules.demo.test.entity.JeecgDemo;\n\nimport com.baomidou.mybatisplus.core.metadata.IPage;\n\nimport java.util.List;\n\n/**\n * @Description: jeecg 测试demo\n * @Author: jeecg-boot\n * @Date:  2018-12-29\n * @Version: V1.0\n */\npublic interface IJeecgDemoService extends JeecgService<JeecgDemo> {\n\n    /**\n     * 测试事务\n     */\n\tpublic void testTran();\n\n    /**\n     * 通过id过去demo数据，先读缓存，在读数据库\n     * @param id 数据库id\n     * @return demo对象\n     */\n\tpublic JeecgDemo getByIdCacheable(String id);\n    /**\n     * 通过id过去demo数据，先读缓存，在读数据库\n     * @param id 数据库id\n     * @return demo对象\n     */\n\tpublic JeecgDemo getByIdCacheableTTL(String id);\n\t\n\t/**\n\t * 查询列表数据 在service中获取数据权限sql信息\n\t * @param pageSize\n\t * @param pageNo\n\t * @return\n\t */\n\tIPage<JeecgDemo> queryListWithPermission(int pageSize,int pageNo);\n\n\t/**\n\t * 根据用户权限获取导出字段\n\t * @return\n\t */\n\tString getExportFields();\n\n\t/**\n\t * 获取创建人\n\t * @return\n\t */\n\tList<String> getCreateByList();\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgDynamicDataService.java",
    "content": "package org.jeecg.modules.demo.test.service;\n\nimport org.jeecg.common.system.base.service.JeecgService;\nimport org.jeecg.modules.demo.test.entity.JeecgDemo;\n\nimport java.util.List;\n\n/**\n * @Description: 动态数据源测试\n * @Author: zyf\n * @Date:2020-04-21\n */\npublic interface IJeecgDynamicDataService extends JeecgService<JeecgDemo> {\n\n\t/**\n\t * 测试从header获取数据源\n\t * @return\n\t */\n\tpublic List<JeecgDemo> selectSpelByHeader();\n\n\t/**\n\t * 使用spel从参数获取\n\t * @param dsName\n\t * @return\n\t */\n\tpublic  List<JeecgDemo> selectSpelByKey(String dsName);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderCustomerService.java",
    "content": "package org.jeecg.modules.demo.test.service;\n\nimport java.util.List;\n\nimport org.jeecg.modules.demo.test.entity.JeecgOrderCustomer;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * @Description: 订单客户\n * @Author: jeecg-boot\n * @Date:  2019-02-15\n * @Version: V1.0\n */\npublic interface IJeecgOrderCustomerService extends IService<JeecgOrderCustomer> {\n\n    /**\n     * 根据订单id获取订单客户数据\n     * @param mainId 订单id\n     * @return 订单顾客集合\n     */\n\tpublic List<JeecgOrderCustomer> selectCustomersByMainId(String mainId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderMainService.java",
    "content": "package org.jeecg.modules.demo.test.service;\n\nimport java.io.Serializable;\nimport java.util.Collection;\nimport java.util.List;\n\nimport org.jeecg.modules.demo.test.entity.JeecgOrderCustomer;\nimport org.jeecg.modules.demo.test.entity.JeecgOrderMain;\nimport org.jeecg.modules.demo.test.entity.JeecgOrderTicket;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * @Description: 订单\n * @Author: jeecg-boot\n * @Date:  2019-02-15\n * @Version: V1.0\n */\npublic interface IJeecgOrderMainService extends IService<JeecgOrderMain> {\n\n\t/**\n\t * 添加一对多\n\t * @param jeecgOrderMain 订单实体类\n     * @param jeecgOrderCustomerList 订单客户集合\n     * @param jeecgOrderTicketList 订单机票集合\n\t */\n\tpublic void saveMain(JeecgOrderMain jeecgOrderMain,List<JeecgOrderCustomer> jeecgOrderCustomerList,List<JeecgOrderTicket> jeecgOrderTicketList) ;\n\t\n\t/**\n\t * 修改一对多\n     * @param jeecgOrderMain 订单实体类\n     * @param jeecgOrderCustomerList 订单客户集合\n     * @param jeecgOrderTicketList 订单机票集合\n\t */\n\tpublic void updateMain(JeecgOrderMain jeecgOrderMain,List<JeecgOrderCustomer> jeecgOrderCustomerList,List<JeecgOrderTicket> jeecgOrderTicketList);\n\t\n\t/**\n\t * 删除一对多\n\t * @param id 订单id\n\t */\n\tpublic void delMain (String id);\n\t\n\t/**\n\t * 批量删除一对多\n\t * @param idList 订单id集合\n\t */\n\tpublic void delBatchMain (Collection<? extends Serializable> idList);\n\n    /**\n     * 修改一对多\n     * @param jeecgOrderMain 订单实体类\n     * @param jeecgOrderCustomerList 订单客户集合\n     * @param jeecgOrderTicketList 订单机票集合\n     */\n\tpublic void updateCopyMain(JeecgOrderMain jeecgOrderMain, List<JeecgOrderCustomer> jeecgOrderCustomerList, List<JeecgOrderTicket> jeecgOrderTicketList);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJeecgOrderTicketService.java",
    "content": "package org.jeecg.modules.demo.test.service;\n\nimport java.util.List;\n\nimport org.jeecg.modules.demo.test.entity.JeecgOrderTicket;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * @Description: 订单机票\n * @Author: jeecg-boot\n * @Date:  2019-02-15\n * @Version: V1.0\n */\npublic interface IJeecgOrderTicketService extends IService<JeecgOrderTicket> {\n\n    /**\n     * 通过订单id查询订单机票\n     * @param mainId 订单id\n     * @return 订单机票集合\n     */\n\tpublic List<JeecgOrderTicket> selectTicketsByMainId(String mainId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/IJoaDemoService.java",
    "content": "package org.jeecg.modules.demo.test.service;\n\nimport org.jeecg.modules.demo.test.entity.JoaDemo;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * @Description: 流程测试\n * @Author: jeecg-boot\n * @Date:   2019-05-14\n * @Version: V1.0\n */\npublic interface IJoaDemoService extends IService<JoaDemo> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.java",
    "content": "package org.jeecg.modules.demo.test.service.impl;\n\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.constant.CacheConstant;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.modules.demo.test.entity.JeecgDemo;\nimport org.jeecg.modules.demo.test.mapper.JeecgDemoMapper;\nimport org.jeecg.modules.demo.test.service.IJeecgDemoService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.cache.annotation.Cacheable;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport java.lang.reflect.Field;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\n/**\n * @Description: jeecg 测试demo\n * @Author: jeecg-boot\n * @Date:  2018-12-29\n * @Version: V1.0\n */\n@Service\npublic class JeecgDemoServiceImpl extends ServiceImpl<JeecgDemoMapper, JeecgDemo> implements IJeecgDemoService {\n\t@Autowired\n\tJeecgDemoMapper jeecgDemoMapper;\n\t\n\t/**\n\t * 事务控制在service层面\n\t * 加上注解：@Transactional，声明的方法就是一个独立的事务（有异常DB操作全部回滚）\n\t */\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void testTran() {\n\t\tJeecgDemo pp = new JeecgDemo();\n\t\tpp.setAge(1111);\n\t\tpp.setName(\"测试事务  小白兔 1\");\n\t\tjeecgDemoMapper.insert(pp);\n\t\t\n\t\tJeecgDemo pp2 = new JeecgDemo();\n\t\tpp2.setAge(2222);\n\t\tpp2.setName(\"测试事务  小白兔 2\");\n\t\tjeecgDemoMapper.insert(pp2);\n        //自定义异常\n\t\tInteger.parseInt(\"hello\");\n\t\t\n\t\tJeecgDemo pp3 = new JeecgDemo();\n\t\tpp3.setAge(3333);\n\t\tpp3.setName(\"测试事务  小白兔 3\");\n\t\tjeecgDemoMapper.insert(pp3);\n\t\treturn ;\n\t}\n\n\n\t/**\n\t * 缓存注解测试： redis\n\t */\n\t@Override\n\t@Cacheable(cacheNames = CacheConstant.TEST_DEMO_CACHE, key = \"#id\")\n\tpublic JeecgDemo getByIdCacheable(String id) {\n\t\tJeecgDemo t = jeecgDemoMapper.selectById(id);\n\t\tSystem.err.println(\"---未读缓存，读取数据库---\");\n\t\tSystem.err.println(t);\n\t\treturn t;\n\t}\n\n\n\t/**\n\t * @Cacheable自定义TTL：#60（单位是秒，目前只支持这一种格式）\n\t * 通过注解方式，指定缓存有效期60秒\n\t * \n\t * 参考博客：https://www.cnblogs.com/h2285409/p/18324396\n\t */\n\t@Override\n\t@Cacheable(cacheNames = \"ceshi:redis:ttl#60\", key = \"#id\")\n\tpublic JeecgDemo getByIdCacheableTTL(String id) {\n\t\tJeecgDemo t = jeecgDemoMapper.selectById(id);\n\t\tSystem.err.println(\"---未读缓存，读取数据库---\");\n\t\tSystem.err.println(t);\n\t\treturn t;\n\t}\n\n\n\t@Override\n\tpublic IPage<JeecgDemo> queryListWithPermission(int pageSize,int pageNo) {\n\t\tPage<JeecgDemo> page = new Page<>(pageNo, pageSize);\n\t\t//编程方式，获取当前请求的数据权限规则SQL片段\n\t\tString sql = QueryGenerator.installAuthJdbc(JeecgDemo.class);\n\t\treturn this.baseMapper.queryListWithPermission(page, sql);\n\t}\n\n\t@Override\n\tpublic String getExportFields() {\n\t\tLoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\t//权限配置列导出示例\n\t\t//1.配置前缀与菜单中配置的列前缀一致\n\t\tList<String> noAuthList = new ArrayList<>();\n\t\tList<String> exportFieldsList = new ArrayList<>();\n\t\tString permsPrefix = \"testdemo:\";\n\t\t//查询配置菜单有效字段\n\t\tList<String> allAuth = this.jeecgDemoMapper.queryAllAuth(permsPrefix);\n\t\t//查询已授权字段\n\t\tList<String> userAuth = this.jeecgDemoMapper.queryUserAuth(sysUser.getId(),permsPrefix);\n\t\t//列出未授权字段\n\t\tfor(String perms : allAuth){\n\t\t\tif(!userAuth.contains(perms)){\n\t\t\t\tnoAuthList.add(perms.substring(permsPrefix.length()));\n\t\t\t}\n\t\t}\n\t\t//实体类中字段与未授权字段比较，列出需导出字段\n\t\tField[] fileds = JeecgDemo.class.getDeclaredFields();\n\t\tList<Field> list = new ArrayList(Arrays.asList(fileds));\n\t\tfor(Field field : list){\n\t\t\tif(!noAuthList.contains(field.getName())){\n\t\t\t\texportFieldsList.add(field.getName());\n\t\t\t}\n\t\t}\n\t\treturn exportFieldsList != null && exportFieldsList.size()>0 ? String.join(\",\", exportFieldsList) : \"\";\n\t}\n\n\t@Override\n\tpublic List<String> getCreateByList() {\n\t\treturn jeecgDemoMapper.getCreateByList();\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDynamicDataServiceImpl.java",
    "content": "package org.jeecg.modules.demo.test.service.impl;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.jeecg.modules.demo.test.entity.JeecgDemo;\nimport org.jeecg.modules.demo.test.mapper.JeecgDemoMapper;\nimport org.jeecg.modules.demo.test.service.IJeecgDynamicDataService;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n/**\n * @Description: 动态数据源测试\n * @Author: zyf\n * @Date:2020-04-21\n */\n@Service\npublic class JeecgDynamicDataServiceImpl extends ServiceImpl<JeecgDemoMapper, JeecgDemo> implements IJeecgDynamicDataService {\n\n    @Override\n    public List<JeecgDemo> selectSpelByHeader() {\n        return list();\n    }\n\n    @Override\n    public List<JeecgDemo> selectSpelByKey(String dsName) {\n        return list();\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderCustomerServiceImpl.java",
    "content": "package org.jeecg.modules.demo.test.service.impl;\n\nimport java.util.List;\n\nimport org.jeecg.modules.demo.test.entity.JeecgOrderCustomer;\nimport org.jeecg.modules.demo.test.mapper.JeecgOrderCustomerMapper;\nimport org.jeecg.modules.demo.test.service.IJeecgOrderCustomerService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\n\n/**\n * @Description: 订单客户\n * @Author: jeecg-boot\n * @Date:  2019-02-15\n * @Version: V1.0\n */\n@Service\npublic class JeecgOrderCustomerServiceImpl extends ServiceImpl<JeecgOrderCustomerMapper, JeecgOrderCustomer> implements IJeecgOrderCustomerService {\n\n\t@Autowired\n\tprivate JeecgOrderCustomerMapper jeecgOrderCustomerMapper;\n\t\n\t@Override\n\tpublic List<JeecgOrderCustomer> selectCustomersByMainId(String mainId) {\n\t\treturn jeecgOrderCustomerMapper.selectCustomersByMainId(mainId);\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderMainServiceImpl.java",
    "content": "package org.jeecg.modules.demo.test.service.impl;\n\nimport java.io.Serializable;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\nimport org.jeecg.modules.demo.test.entity.JeecgOrderCustomer;\nimport org.jeecg.modules.demo.test.entity.JeecgOrderMain;\nimport org.jeecg.modules.demo.test.entity.JeecgOrderTicket;\nimport org.jeecg.modules.demo.test.mapper.JeecgOrderCustomerMapper;\nimport org.jeecg.modules.demo.test.mapper.JeecgOrderMainMapper;\nimport org.jeecg.modules.demo.test.mapper.JeecgOrderTicketMapper;\nimport org.jeecg.modules.demo.test.service.IJeecgOrderMainService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\n\n/**\n * @Description: 订单\n * @Author: jeecg-boot\n * @Date:  2019-02-15\n * @Version: V1.0\n */\n@Service\npublic class JeecgOrderMainServiceImpl extends ServiceImpl<JeecgOrderMainMapper, JeecgOrderMain> implements IJeecgOrderMainService {\n\n    @Autowired\n    private JeecgOrderMainMapper jeecgOrderMainMapper;\n    @Autowired\n    private JeecgOrderCustomerMapper jeecgOrderCustomerMapper;\n    @Autowired\n    private JeecgOrderTicketMapper jeecgOrderTicketMapper;\n\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public void saveMain(JeecgOrderMain jeecgOrderMain, List<JeecgOrderCustomer> jeecgOrderCustomerList, List<JeecgOrderTicket> jeecgOrderTicketList) {\n        jeecgOrderMainMapper.insert(jeecgOrderMain);\n        if (jeecgOrderCustomerList != null) {\n            for (JeecgOrderCustomer entity : jeecgOrderCustomerList) {\n                entity.setOrderId(jeecgOrderMain.getId());\n                jeecgOrderCustomerMapper.insert(entity);\n            }\n        }\n        if (jeecgOrderTicketList != null) {\n            for (JeecgOrderTicket entity : jeecgOrderTicketList) {\n                entity.setOrderId(jeecgOrderMain.getId());\n                jeecgOrderTicketMapper.insert(entity);\n            }\n        }\n    }\n\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public void updateMain(JeecgOrderMain jeecgOrderMain, List<JeecgOrderCustomer> jeecgOrderCustomerList, List<JeecgOrderTicket> jeecgOrderTicketList) {\n        jeecgOrderMainMapper.updateById(jeecgOrderMain);\n\n        //1.先删除子表数据\n        jeecgOrderTicketMapper.deleteTicketsByMainId(jeecgOrderMain.getId());\n        jeecgOrderCustomerMapper.deleteCustomersByMainId(jeecgOrderMain.getId());\n\n        //2.子表数据重新插入\n        if (jeecgOrderCustomerList != null) {\n            for (JeecgOrderCustomer entity : jeecgOrderCustomerList) {\n                entity.setOrderId(jeecgOrderMain.getId());\n                jeecgOrderCustomerMapper.insert(entity);\n            }\n        }\n        if (jeecgOrderTicketList != null) {\n            for (JeecgOrderTicket entity : jeecgOrderTicketList) {\n                entity.setOrderId(jeecgOrderMain.getId());\n                jeecgOrderTicketMapper.insert(entity);\n            }\n        }\n    }\n\n    /**\n     * 一对多维护逻辑改造  LOWCOD-315\n     * @param jeecgOrderMain\n     * @param jeecgOrderCustomerList\n     * @param jeecgOrderTicketList\n     */\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public void updateCopyMain(JeecgOrderMain jeecgOrderMain, List<JeecgOrderCustomer> jeecgOrderCustomerList, List<JeecgOrderTicket> jeecgOrderTicketList) {\n        jeecgOrderMainMapper.updateById(jeecgOrderMain);\n\n        // 循环前台传过来的数据\n        for (JeecgOrderTicket ticket:jeecgOrderTicketList){\n            // 先查询子表数据库\n            JeecgOrderTicket orderTicket = jeecgOrderTicketMapper.selectById(ticket.getId());\n            if(orderTicket == null){\n                // 当传过来的id数据库不存在时，说明数据库没有，走新增逻辑\n                ticket.setOrderId(jeecgOrderMain.getId());\n                jeecgOrderTicketMapper.insert(ticket);\n                continue;\n            }\n            if(orderTicket.getId().equals(ticket.getId())){\n                // 传过来的id和数据库id一至时，说明数据库存在该数据，走更新逻辑\n                jeecgOrderTicketMapper.updateById(ticket);\n            }\n        }\n        for (JeecgOrderCustomer customer:jeecgOrderCustomerList){\n            // 先查询子表数据库\n            JeecgOrderCustomer customers = jeecgOrderCustomerMapper.selectById(customer.getId());\n            if(customers == null){\n                // 当传过来的id数据库不存在时，说明数据库没有，走新增逻辑\n                customer.setOrderId(jeecgOrderMain.getId());\n                jeecgOrderCustomerMapper.insert(customer);\n                continue;\n            }\n            if(customers.getId().equals(customer.getId())){\n                //TODO 传过来的id和数据库id一至时，说明数据库存在该数据，走更新逻辑\n                jeecgOrderCustomerMapper.updateById(customer);\n            }\n        }\n        // 当跟新和删除之后取差集， 当传过来的id不存在，而数据库存在时，说明已删除，走删除逻辑\n        List<JeecgOrderTicket> jeecgOrderTickets = jeecgOrderTicketMapper.selectTicketsByMainId(jeecgOrderMain.getId());\n        List<JeecgOrderTicket> collect = jeecgOrderTickets.stream()\n                .filter(item -> !jeecgOrderTicketList.stream()\n                .map(e -> e.getId())\n                .collect(Collectors.toList())\n                .contains(item.getId()))\n                .collect(Collectors.toList());\n        // for循环删除id\n        for (JeecgOrderTicket ticket:collect){\n            jeecgOrderTicketMapper.deleteById(ticket.getId());\n        }\n\n        List<JeecgOrderCustomer> jeecgOrderCustomers = jeecgOrderCustomerMapper.selectCustomersByMainId(jeecgOrderMain.getId());\n        List<JeecgOrderCustomer> customersCollect = jeecgOrderCustomers.stream()\n                .filter(item -> !jeecgOrderCustomerList.stream()\n                        .map(e -> e.getId())\n                        .collect(Collectors.toList())\n                        .contains(item.getId()))\n                .collect(Collectors.toList());\n        //TODO for循环删除id\n        for (JeecgOrderCustomer c:customersCollect){\n            jeecgOrderCustomerMapper.deleteById(c.getId());\n        }\n    }\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void delMain(String id) {\n\t\tjeecgOrderMainMapper.deleteById(id);\n\t\tjeecgOrderTicketMapper.deleteTicketsByMainId(id);\n\t\tjeecgOrderCustomerMapper.deleteCustomersByMainId(id);\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void delBatchMain(Collection<? extends Serializable> idList) {\n\t\tfor(Serializable id:idList) {\n\t\t\tjeecgOrderMainMapper.deleteById(id);\n\t\t\tjeecgOrderTicketMapper.deleteTicketsByMainId(id.toString());\n\t\t\tjeecgOrderCustomerMapper.deleteCustomersByMainId(id.toString());\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderTicketServiceImpl.java",
    "content": "package org.jeecg.modules.demo.test.service.impl;\n\nimport java.util.List;\n\nimport org.jeecg.modules.demo.test.entity.JeecgOrderTicket;\nimport org.jeecg.modules.demo.test.mapper.JeecgOrderTicketMapper;\nimport org.jeecg.modules.demo.test.service.IJeecgOrderTicketService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\n\n/**\n * @Description: 订单机票\n * @Author: jeecg-boot\n * @Date:  2019-02-15\n * @Version: V1.0\n */\n@Service\npublic class JeecgOrderTicketServiceImpl extends ServiceImpl<JeecgOrderTicketMapper, JeecgOrderTicket> implements IJeecgOrderTicketService {\n\t@Autowired\n\tprivate JeecgOrderTicketMapper jeecgOrderTicketMapper;\n\t\n\t@Override\n\tpublic List<JeecgOrderTicket> selectTicketsByMainId(String mainId) {\n\t\treturn jeecgOrderTicketMapper.selectTicketsByMainId(mainId);\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JoaDemoServiceImpl.java",
    "content": "package org.jeecg.modules.demo.test.service.impl;\n\nimport org.jeecg.modules.demo.test.entity.JoaDemo;\nimport org.jeecg.modules.demo.test.mapper.JoaDemoMapper;\nimport org.jeecg.modules.demo.test.service.IJoaDemoService;\nimport org.springframework.stereotype.Service;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\n\n/**\n * @Description: 流程测试\n * @Author: jeecg-boot\n * @Date:   2019-05-14\n * @Version: V1.0\n */\n@Service\npublic class JoaDemoServiceImpl extends ServiceImpl<JoaDemoMapper, JoaDemo> implements IJoaDemoService {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/vo/JeecgOrderMainPage.java",
    "content": "package org.jeecg.modules.demo.test.vo;\n\nimport java.util.List;\n\nimport org.jeecg.modules.demo.test.entity.JeecgOrderCustomer;\nimport org.jeecg.modules.demo.test.entity.JeecgOrderTicket;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.jeecgframework.poi.excel.annotation.ExcelCollection;\n\nimport lombok.Data;\n\n/**\n * @Description: 一对多示例\n * @author: jeecg-boot\n */\n@Data\npublic class JeecgOrderMainPage {\n\t\n\t/**主键*/\n\tprivate java.lang.String id;\n\t/**订单号*/\n\t@Excel(name=\"订单号\",width=15)\n\tprivate java.lang.String orderCode;\n\t/**订单类型*/\n\tprivate java.lang.String ctype;\n\t/**订单日期*/\n\t@Excel(name=\"订单日期\",width=15,format = \"yyyy-MM-dd\")\n\tprivate java.util.Date orderDate;\n\t/**订单金额*/\n\t@Excel(name=\"订单金额\",width=15)\n\tprivate java.lang.Double orderMoney;\n\t/**订单备注*/\n\tprivate java.lang.String content;\n\t/**创建人*/\n\tprivate java.lang.String createBy;\n\t/**创建时间*/\n\tprivate java.util.Date createTime;\n\t/**修改人*/\n\tprivate java.lang.String updateBy;\n\t/**修改时间*/\n\tprivate java.util.Date updateTime;\n\t\n\t@ExcelCollection(name=\"客户\")\n\tprivate List<JeecgOrderCustomer> jeecgOrderCustomerList;\n\t@ExcelCollection(name=\"机票\")\n\tprivate List<JeecgOrderTicket> jeecgOrderTicketList;\n\n\tprivate String bpmStatus;\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/xxljob/TestJobHandler.java",
    "content": "//\n//package org.jeecg.modules.demo.xxljob;\n//\n//import com.xxl.job.core.biz.model.ReturnT;\n//import com.xxl.job.core.handler.annotation.XxlJob;\n//import lombok.extern.slf4j.Slf4j;\n//import org.jeecg.common.config.mqtoken.UserTokenContext;\n//import org.jeecg.common.constant.CommonConstant;\n//import org.jeecg.common.system.api.ISysBaseAPI;\n//import org.jeecg.common.system.util.JwtUtil;\n//import org.jeecg.common.util.RedisUtil;\n//import org.jeecg.common.util.SpringContextUtils;\n//import org.springframework.beans.factory.annotation.Autowired;\n//import org.springframework.stereotype.Component;\n//\n//\n///**\n// * xxl-job定时任务测试\n// */\n//@Component\n//@Slf4j\n//public class TestJobHandler {\n//    @Autowired\n//    ISysBaseAPI sysBaseApi;\n//\n//    /**\n//     * 简单任务\n//     *\n//     * 测试：无token调用feign接口\n//     *\n//     * @param params\n//     * @return\n//     */\n//\n//    @XxlJob(value = \"testJob\")\n//    public ReturnT<String> demoJobHandler(String params) {\n//        //1.生成临时令牌Token到线程中\n//        UserTokenContext.setToken(getTemporaryToken());\n//\n//        log.info(\"我是 jeecg-demo 服务里的定时任务 testJob , 我执行了...............................\");\n//        log.info(\"我调用 jeecg-system 服务的字典接口：{}\",sysBaseApi.queryAllDict());\n//        //。。。此处可以写多个feign接口调用\n//\n//        //2.使用完，删除临时令牌Token\n//        UserTokenContext.remove();\n//        return ReturnT.SUCCESS;\n//    }\n//\n//    public void init() {\n//        log.info(\"init\");\n//    }\n//\n//    public void destroy() {\n//        log.info(\"destory\");\n//    }\n//\n//    /**\n//     * 获取临时令牌\n//     *\n//     * 模拟登陆接口，获取模拟 Token\n//     * @return\n//     */\n//    public static String getTemporaryToken() {\n//        RedisUtil redisUtil = SpringContextUtils.getBean(RedisUtil.class);\n//        // 模拟登录生成Token\n//        String token = JwtUtil.sign(\"??\", \"??\");\n//        // 设置Token缓存有效时间为 5 分钟\n//        redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);\n//        redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, 5 * 60 * 1000);\n//        return token;\n//    }\n//\n//}\n//\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template1/css/easyui.css",
    "content": ".panel {\n  overflow: hidden;\n  text-align: left;\n  margin: 0;\n  border: 0;\n  -moz-border-radius: 0 0 0 0;\n  -webkit-border-radius: 0 0 0 0;\n  border-radius: 0 0 0 0;\n}\n.panel-header,\n.panel-body {\n  border-width: 1px;\n  border-style: solid;\n}\n.panel-header {\n  padding: 5px;\n  position: relative;\n}\n.panel-title {\n  background: url('images/blank.gif') no-repeat;\n}\n.panel-header-noborder {\n  border-width: 0 0 1px 0;\n}\n.panel-body {\n  overflow: auto;\n  border-top-width: 0;\n  padding: 0;\n}\n.panel-body-noheader {\n  border-top-width: 1px;\n}\n.panel-body-noborder {\n  border-width: 0px;\n}\n.panel-body-nobottom {\n  border-bottom-width: 0;\n}\n.panel-with-icon {\n  padding-left: 18px;\n}\n.panel-icon,\n.panel-tool {\n  position: absolute;\n  top: 50%;\n  margin-top: -8px;\n  height: 16px;\n  overflow: hidden;\n}\n.panel-icon {\n  left: 5px;\n  width: 16px;\n}\n.panel-tool {\n  right: 5px;\n  width: auto;\n}\n.panel-tool a {\n  display: inline-block;\n  width: 16px;\n  height: 16px;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n  margin: 0 0 0 2px;\n  vertical-align: top;\n}\n.panel-tool a:hover {\n  opacity: 1;\n  filter: alpha(opacity=100);\n  background-color: #777;\n  -moz-border-radius: 3px 3px 3px 3px;\n  -webkit-border-radius: 3px 3px 3px 3px;\n  border-radius: 3px 3px 3px 3px;\n}\n.panel-loading {\n  padding: 11px 0px 10px 30px;\n}\n.panel-noscroll {\n  overflow: hidden;\n}\n.panel-fit,\n.panel-fit body {\n  height: 100%;\n  margin: 0;\n  padding: 0;\n  border: 0;\n  overflow: hidden;\n}\n.panel-loading {\n  background: url('images/loading.gif') no-repeat 10px 10px;\n}\n.panel-tool-close {\n  background: url('images/panel_tools.png') no-repeat -16px 0px;\n}\n.panel-tool-min {\n  background: url('images/panel_tools.png') no-repeat 0px 0px;\n}\n.panel-tool-max {\n  background: url('images/panel_tools.png') no-repeat 0px -16px;\n}\n.panel-tool-restore {\n  background: url('images/panel_tools.png') no-repeat -16px -16px;\n}\n.panel-tool-collapse {\n  background: url('images/panel_tools.png') no-repeat -32px 0;\n}\n.panel-tool-expand {\n  background: url('images/panel_tools.png') no-repeat -32px -16px;\n}\n.panel-header,\n.panel-body {\n  border-color: #000;\n}\n.panel-header {\n  background-color: #3d3d3d;\n  background: -webkit-linear-gradient(top,#454545 0,#383838 100%);\n  background: -moz-linear-gradient(top,#454545 0,#383838 100%);\n  background: -o-linear-gradient(top,#454545 0,#383838 100%);\n  background: linear-gradient(to bottom,#454545 0,#383838 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0);\n}\n.panel-body {\n  background-color: #666;\n  color: #fff;\n  font-size: 12px;\n}\n.panel-title {\n  font-size: 12px;  \n  color: #fff;\n  height: 20px;\n  line-height: 20px;\n}\n.panel-footer {\n  border: 1px solid #000;\n  overflow: hidden;\n  background: #555;\n}\n.panel-footer-noborder {\n  border-width: 1px 0 0 0;\n}\n.panel-hleft,\n.panel-hright {\n  position: relative;\n}\n.panel-hleft>.panel-body,\n.panel-hright>.panel-body {\n  position: absolute;\n}\n.panel-hleft>.panel-header {\n  float: left;\n}\n.panel-hright>.panel-header {\n  float: right;\n}\n.panel-hleft>.panel-body {\n  border-top-width: 1px;\n  border-left-width: 0;\n}\n.panel-hright>.panel-body {\n  border-top-width: 1px;\n  border-right-width: 0;\n}\n.panel-hleft>.panel-body-nobottom {\n  border-bottom-width: 1px;\n  border-right-width: 0;\n}\n.panel-hright>.panel-body-nobottom {\n  border-bottom-width: 1px;\n  border-left-width: 0;\n}\n.panel-hleft>.panel-footer {\n  position: absolute;\n  right: 0;\n}\n.panel-hright>.panel-footer {\n  position: absolute;\n  left: 0;\n}\n.panel-hleft>.panel-header-noborder {\n  border-width: 0 1px 0 0;\n}\n.panel-hright>.panel-header-noborder {\n  border-width: 0 0 0 1px;\n}\n.panel-hleft>.panel-body-noborder {\n  border-width: 0;\n}\n.panel-hright>.panel-body-noborder {\n  border-width: 0;\n}\n.panel-hleft>.panel-body-noheader {\n  border-left-width: 1px;\n}\n.panel-hright>.panel-body-noheader {\n  border-right-width: 1px;\n}\n.panel-hleft>.panel-footer-noborder {\n  border-width: 0 0 0 1px;\n}\n.panel-hright>.panel-footer-noborder {\n  border-width: 0 1px 0 0;\n}\n.panel-hleft>.panel-header .panel-icon,\n.panel-hright>.panel-header .panel-icon {\n  margin-top: 0;\n  top: 5px;\n  left: 50%;\n  margin-left: -8px;\n}\n.panel-hleft>.panel-header .panel-title,\n.panel-hright>.panel-header .panel-title {\n  position: absolute;\n  min-width: 16px;\n  left: 25px;\n  top: 5px;\n  bottom: auto;\n  white-space: nowrap;\n  word-wrap: normal;\n  -webkit-transform: rotate(90deg);\n  -webkit-transform-origin: 0 0;\n  -moz-transform: rotate(90deg);\n  -moz-transform-origin: 0 0;\n  -o-transform: rotate(90deg);\n  -o-transform-origin: 0 0;\n  transform: rotate(90deg);\n  transform-origin: 0 0;\n}\n.panel-hleft>.panel-header .panel-title-up,\n.panel-hright>.panel-header .panel-title-up {\n  position: absolute;\n  min-width: 16px;\n  left: 21px;\n  top: auto;\n  bottom: 0px;\n  text-align: right;\n  white-space: nowrap;\n  word-wrap: normal;\n  -webkit-transform: rotate(-90deg);\n  -webkit-transform-origin: 0 0;\n  -moz-transform: rotate(-90deg);\n  -moz-transform-origin: 0 0;\n  -o-transform: rotate(-90deg);\n  -o-transform-origin: 0 0;\n  transform: rotate(-90deg);\n  transform-origin: 0 16px;\n}\n.panel-hleft>.panel-header .panel-with-icon.panel-title-up,\n.panel-hright>.panel-header .panel-with-icon.panel-title-up {\n  padding-left: 0;\n  padding-right: 18px;\n}\n.panel-hleft>.panel-header .panel-tool,\n.panel-hright>.panel-header .panel-tool {\n  top: auto;\n  bottom: 5px;\n  width: 16px;\n  height: auto;\n  left: 50%;\n  margin-left: -8px;\n  margin-top: 0;\n}\n.panel-hleft>.panel-header .panel-tool a,\n.panel-hright>.panel-header .panel-tool a {\n  margin: 2px 0 0 0;\n}\n.accordion {\n  overflow: hidden;\n  border-width: 1px;\n  border-style: solid;\n}\n.accordion .accordion-header {\n  border-width: 0 0 1px;\n  cursor: pointer;\n}\n.accordion .accordion-body {\n  border-width: 0 0 1px;\n}\n.accordion-noborder {\n  border-width: 0;\n}\n.accordion-noborder .accordion-header {\n  border-width: 0 0 1px;\n}\n.accordion-noborder .accordion-body {\n  border-width: 0 0 1px;\n}\n.accordion-collapse {\n  background: url('images/accordion_arrows.png') no-repeat 0 0;\n}\n.accordion-expand {\n  background: url('images/accordion_arrows.png') no-repeat -16px 0;\n}\n.accordion {\n  background: #666;\n  border-color: #000;\n}\n.accordion .accordion-header {\n  background: #3d3d3d;\n  filter: none;\n}\n.accordion .accordion-header-selected {\n  background: #990000;\n}\n.accordion .accordion-header-selected .panel-title {\n  color: #fff;\n}\n.accordion .panel-last > .accordion-header {\n  border-bottom-color: #3d3d3d;\n}\n.accordion .panel-last > .accordion-body {\n  border-bottom-color: #666;\n}\n.accordion .panel-last > .accordion-header-selected,\n.accordion .panel-last > .accordion-header-border {\n  border-bottom-color: #000;\n}\n.accordion> .panel-hleft {\n  float: left;\n}\n.accordion> .panel-hleft>.panel-header {\n  border-width: 0 1px 0 0;\n}\n.accordion> .panel-hleft> .panel-body {\n  border-width: 0 1px 0 0;\n}\n.accordion> .panel-hleft.panel-last > .accordion-header {\n  border-right-color: #3d3d3d;\n}\n.accordion> .panel-hleft.panel-last > .accordion-body {\n  border-right-color: #666;\n}\n.accordion> .panel-hleft.panel-last > .accordion-header-selected,\n.accordion> .panel-hleft.panel-last > .accordion-header-border {\n  border-right-color: #000;\n}\n.accordion> .panel-hright {\n  float: right;\n}\n.accordion> .panel-hright>.panel-header {\n  border-width: 0 0 0 1px;\n}\n.accordion> .panel-hright> .panel-body {\n  border-width: 0 0 0 1px;\n}\n.accordion> .panel-hright.panel-last > .accordion-header {\n  border-left-color: #3d3d3d;\n}\n.accordion> .panel-hright.panel-last > .accordion-body {\n  border-left-color: #666;\n}\n.accordion> .panel-hright.panel-last > .accordion-header-selected,\n.accordion> .panel-hright.panel-last > .accordion-header-border {\n  border-left-color: #000;\n}\n.window {\n\n\n  overflow: hidden;\n  padding: 5px;\n  border-width: 1px;\n  border-style: solid;\n}\n.window .window-header {\n  background: transparent;\n  padding: 0px 0px 6px 0px;\n}\n.window .window-body {\n  border-width: 1px;\n  border-style: solid;\n  border-top-width: 0px;\n}\n.window .window-body-noheader {\n  border-top-width: 1px;\n}\n.window .panel-body-nobottom {\n  border-bottom-width: 0;\n}\n.window .window-header .panel-icon,\n.window .window-header .panel-tool {\n  top: 50%;\n  margin-top: -11px;\n}\n.window .window-header .panel-icon {\n  left: 1px;\n}\n.window .window-header .panel-tool {\n  right: 1px;\n}\n.window .window-header .panel-with-icon {\n  padding-left: 18px;\n}\n.window-proxy {\n  position: absolute;\n  overflow: hidden;\n}\n.window-proxy-mask {\n  position: absolute;\n  filter: alpha(opacity=5);\n  opacity: 0.05;\n}\n.window-mask {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n  filter: alpha(opacity=40);\n  opacity: 0.40;\n  font-size: 1px;\n  overflow: hidden;\n}\n.window,\n.window-shadow {\n  position: absolute;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.window-shadow {\n  background: #777;\n  -moz-box-shadow: 2px 2px 3px #787878;\n  -webkit-box-shadow: 2px 2px 3px #787878;\n  box-shadow: 2px 2px 3px #787878;\n  filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);\n}\n.window,\n.window .window-body {\n  border-color: #000;\n}\n.window {\n  background-color: #3d3d3d;\n  background: -webkit-linear-gradient(top,#454545 0,#383838 20%);\n  background: -moz-linear-gradient(top,#454545 0,#383838 20%);\n  background: -o-linear-gradient(top,#454545 0,#383838 20%);\n  background: linear-gradient(to bottom,#454545 0,#383838 20%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0);\n}\n.window-proxy {\n  border: 1px dashed #000;\n}\n.window-proxy-mask,\n.window-mask {\n  background: #000;\n}\n.window .panel-footer {\n  border: 1px solid #000;\n  position: relative;\n  top: -1px;\n}\n.window-thinborder {\n  padding: 0;\n}\n.window-thinborder .window-header {\n  padding: 5px 5px 6px 5px;\n}\n.window-thinborder .window-body {\n  border-width: 0px;\n}\n.window-thinborder .window-footer {\n  border-left: transparent;\n  border-right: transparent;\n  border-bottom: transparent;\n}\n.window-thinborder .window-header .panel-icon,\n.window-thinborder .window-header .panel-tool {\n  margin-top: -9px;\n  margin-left: 5px;\n  margin-right: 5px;\n}\n.window-noborder {\n  border: 0;\n}\n.window.panel-hleft .window-header {\n  padding: 0 6px 0 0;\n}\n.window.panel-hright .window-header {\n  padding: 0 0 0 6px;\n}\n.window.panel-hleft>.panel-header .panel-title {\n  top: auto;\n  left: 16px;\n}\n.window.panel-hright>.panel-header .panel-title {\n  top: auto;\n  right: 16px;\n}\n.window.panel-hleft>.panel-header .panel-title-up,\n.window.panel-hright>.panel-header .panel-title-up {\n  bottom: 0;\n}\n.window.panel-hleft .window-body {\n  border-width: 1px 1px 1px 0;\n}\n.window.panel-hright .window-body {\n  border-width: 1px 0 1px 1px;\n}\n.window.panel-hleft .window-header .panel-icon {\n  top: 1px;\n  margin-top: 0;\n  left: 0;\n}\n.window.panel-hright .window-header .panel-icon {\n  top: 1px;\n  margin-top: 0;\n  left: auto;\n  right: 1px;\n}\n.window.panel-hleft .window-header .panel-tool,\n.window.panel-hright .window-header .panel-tool {\n  margin-top: 0;\n  top: auto;\n  bottom: 1px;\n  right: auto;\n  margin-right: 0;\n  left: 50%;\n  margin-left: -11px;\n}\n.window.panel-hright .window-header .panel-tool {\n  left: auto;\n  right: 1px;\n}\n.window-thinborder.panel-hleft .window-header {\n  padding: 5px 6px 5px 5px;\n}\n.window-thinborder.panel-hright .window-header {\n  padding: 5px 5px 5px 6px;\n}\n.window-thinborder.panel-hleft>.panel-header .panel-title {\n  left: 21px;\n}\n.window-thinborder.panel-hleft>.panel-header .panel-title-up,\n.window-thinborder.panel-hright>.panel-header .panel-title-up {\n  bottom: 5px;\n}\n.window-thinborder.panel-hleft .window-header .panel-icon,\n.window-thinborder.panel-hright .window-header .panel-icon {\n  margin-top: 5px;\n}\n.window-thinborder.panel-hleft .window-header .panel-tool,\n.window-thinborder.panel-hright .window-header .panel-tool {\n  left: 16px;\n  bottom: 5px;\n}\n.dialog-content {\n  overflow: auto;\n}\n.dialog-toolbar {\n  position: relative;\n  padding: 2px 5px;\n}\n.dialog-tool-separator {\n  float: left;\n  height: 24px;\n  border-left: 1px solid #444;\n  border-right: 1px solid #777;\n  margin: 2px 1px;\n}\n.dialog-button {\n  position: relative;\n  top: -1px;\n  padding: 5px;\n  text-align: right;\n}\n.dialog-button .l-btn {\n  margin-left: 5px;\n}\n.dialog-toolbar,\n.dialog-button {\n  background: #555;\n  border-width: 1px;\n  border-style: solid;\n}\n.dialog-toolbar {\n  border-color: #000 #000 #222 #000;\n}\n.dialog-button {\n  border-color: #222 #000 #000 #000;\n}\n.window-thinborder .dialog-toolbar {\n  border-left: transparent;\n  border-right: transparent;\n  border-top-color: #555;\n}\n.window-thinborder .dialog-button {\n  top: 0px;\n  padding: 5px 8px 8px 8px;\n  border-left: transparent;\n  border-right: transparent;\n  border-bottom: transparent;\n}\n.l-btn {\n  text-decoration: none;\n  display: inline-block;\n  overflow: hidden;\n  margin: 0;\n  padding: 0;\n  cursor: pointer;\n  outline: none;\n  text-align: center;\n  vertical-align: middle;\n  line-height: normal;\n}\n.l-btn-plain {\n  border-width: 0;\n  padding: 1px;\n}\n.l-btn-left {\n  display: inline-block;\n  position: relative;\n  overflow: hidden;\n  margin: 0;\n  padding: 0;\n  vertical-align: top;\n}\n.l-btn-text {\n  display: inline-block;\n  vertical-align: top;\n  width: auto;\n  line-height: 28px;\n  font-size: 12px;\n  padding: 0;\n  margin: 0 6px;\n}\n.l-btn-icon {\n  display: inline-block;\n  width: 16px;\n  height: 16px;\n  line-height: 16px;\n  position: absolute;\n  top: 50%;\n  margin-top: -8px;\n  font-size: 1px;\n}\n.l-btn span span .l-btn-empty {\n  display: inline-block;\n  margin: 0;\n  width: 16px;\n  height: 24px;\n  font-size: 1px;\n  vertical-align: top;\n}\n.l-btn span .l-btn-icon-left {\n  padding: 0 0 0 20px;\n  background-position: left center;\n}\n.l-btn span .l-btn-icon-right {\n  padding: 0 20px 0 0;\n  background-position: right center;\n}\n.l-btn-icon-left .l-btn-text {\n  margin: 0 6px 0 26px;\n}\n.l-btn-icon-left .l-btn-icon {\n  left: 6px;\n}\n.l-btn-icon-right .l-btn-text {\n  margin: 0 26px 0 6px;\n}\n.l-btn-icon-right .l-btn-icon {\n  right: 6px;\n}\n.l-btn-icon-top .l-btn-text {\n  margin: 20px 4px 0 4px;\n}\n.l-btn-icon-top .l-btn-icon {\n  top: 4px;\n  left: 50%;\n  margin: 0 0 0 -8px;\n}\n.l-btn-icon-bottom .l-btn-text {\n  margin: 0 4px 20px 4px;\n}\n.l-btn-icon-bottom .l-btn-icon {\n  top: auto;\n  bottom: 4px;\n  left: 50%;\n  margin: 0 0 0 -8px;\n}\n.l-btn-left .l-btn-empty {\n  margin: 0 6px;\n  width: 16px;\n}\n.l-btn-plain:hover {\n  padding: 0;\n}\n.l-btn-focus {\n  outline: #0000FF dotted thin;\n}\n.l-btn-large .l-btn-text {\n  line-height: 44px;\n}\n.l-btn-large .l-btn-icon {\n  width: 32px;\n  height: 32px;\n  line-height: 32px;\n  margin-top: -16px;\n}\n.l-btn-large .l-btn-icon-left .l-btn-text {\n  margin-left: 40px;\n}\n.l-btn-large .l-btn-icon-right .l-btn-text {\n  margin-right: 40px;\n}\n.l-btn-large .l-btn-icon-top .l-btn-text {\n  margin-top: 36px;\n  line-height: 24px;\n  min-width: 32px;\n}\n.l-btn-large .l-btn-icon-top .l-btn-icon {\n  margin: 0 0 0 -16px;\n}\n.l-btn-large .l-btn-icon-bottom .l-btn-text {\n  margin-bottom: 36px;\n  line-height: 24px;\n  min-width: 32px;\n}\n.l-btn-large .l-btn-icon-bottom .l-btn-icon {\n  margin: 0 0 0 -16px;\n}\n.l-btn-large .l-btn-left .l-btn-empty {\n  margin: 0 6px;\n  width: 32px;\n}\n.l-btn {\n  color: #fff;\n  background: #777;\n  background-repeat: repeat-x;\n  border: 1px solid #555;\n  background: -webkit-linear-gradient(top,#919191 0,#6a6a6a 100%);\n  background: -moz-linear-gradient(top,#919191 0,#6a6a6a 100%);\n  background: -o-linear-gradient(top,#919191 0,#6a6a6a 100%);\n  background: linear-gradient(to bottom,#919191 0,#6a6a6a 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#919191,endColorstr=#6a6a6a,GradientType=0);\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.l-btn:hover {\n  background: #777;\n  color: #fff;\n  border: 1px solid #555;\n  filter: none;\n}\n.l-btn-plain {\n  background: transparent;\n  border-width: 0;\n  filter: none;\n}\n.l-btn-outline {\n  border-width: 1px;\n  border-color: #555;\n  padding: 0;\n}\n.l-btn-plain:hover {\n  background: #777;\n  color: #fff;\n  border: 1px solid #555;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.l-btn-disabled,\n.l-btn-disabled:hover {\n  opacity: 0.5;\n  cursor: default;\n  background: #777;\n  color: #fff;\n  background: -webkit-linear-gradient(top,#919191 0,#6a6a6a 100%);\n  background: -moz-linear-gradient(top,#919191 0,#6a6a6a 100%);\n  background: -o-linear-gradient(top,#919191 0,#6a6a6a 100%);\n  background: linear-gradient(to bottom,#919191 0,#6a6a6a 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#919191,endColorstr=#6a6a6a,GradientType=0);\n}\n.l-btn-disabled .l-btn-text,\n.l-btn-disabled .l-btn-icon {\n  filter: alpha(opacity=50);\n}\n.l-btn-plain-disabled,\n.l-btn-plain-disabled:hover {\n  background: transparent;\n  filter: alpha(opacity=50);\n}\n.l-btn-selected,\n.l-btn-selected:hover {\n  background: #000;\n  filter: none;\n}\n.l-btn-plain-selected,\n.l-btn-plain-selected:hover {\n  background: #000;\n}\n.textbox {\n  position: relative;\n  border: 1px solid #000;\n  background-color: #fff;\n  vertical-align: middle;\n  display: inline-block;\n  overflow: hidden;\n  white-space: nowrap;\n  margin: 0;\n  padding: 0;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.textbox .textbox-text {\n  font-size: 12px;\n  border: 0;\n  margin: 0;\n  padding: 0 4px;\n  white-space: normal;\n  vertical-align: top;\n  outline-style: none;\n  resize: none;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n  height: 28px;\n  line-height: 28px;\n}\n.textbox textarea.textbox-text {\n  line-height: normal;\n}\n.textbox .textbox-text::-ms-clear,\n.textbox .textbox-text::-ms-reveal {\n  display: none;\n}\n.textbox textarea.textbox-text {\n  white-space: pre-wrap;\n}\n.textbox .textbox-prompt {\n  font-size: 12px;\n  color: #aaa;\n}\n.textbox .textbox-bgicon {\n  background-position: 3px center;\n  padding-left: 21px;\n}\n.textbox .textbox-button,\n.textbox .textbox-button:hover {\n  position: absolute;\n  top: 0;\n  padding: 0;\n  vertical-align: top;\n  -moz-border-radius: 0 0 0 0;\n  -webkit-border-radius: 0 0 0 0;\n  border-radius: 0 0 0 0;\n}\n.textbox .textbox-button-right,\n.textbox .textbox-button-right:hover {\n  right: 0;\n  border-width: 0 0 0 1px;\n}\n.textbox .textbox-button-left,\n.textbox .textbox-button-left:hover {\n  left: 0;\n  border-width: 0 1px 0 0;\n}\n.textbox .textbox-button-top,\n.textbox .textbox-button-top:hover {\n  left: 0;\n  border-width: 0 0 1px 0;\n}\n.textbox .textbox-button-bottom,\n.textbox .textbox-button-bottom:hover {\n  top: auto;\n  bottom: 0;\n  left: 0;\n  border-width: 1px 0 0 0;\n}\n.textbox-addon {\n  position: absolute;\n  top: 0;\n}\n.textbox-label {\n  display: inline-block;\n  width: 80px;\n  height: 30px;\n  line-height: 30px;\n  vertical-align: middle;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  margin: 0;\n  padding-right: 5px;\n}\n.textbox-label-after {\n  padding-left: 5px;\n  padding-right: 0;\n}\n.textbox-label-top {\n  display: block;\n  width: auto;\n  padding: 0;\n}\n.textbox-disabled,\n.textbox-label-disabled {\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.textbox-icon {\n  display: inline-block;\n  width: 18px;\n  height: 20px;\n  overflow: hidden;\n  vertical-align: top;\n  background-position: center center;\n  cursor: pointer;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n  text-decoration: none;\n  outline-style: none;\n}\n.textbox-icon-disabled,\n.textbox-icon-readonly {\n  cursor: default;\n}\n.textbox-icon:hover {\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n}\n.textbox-icon-disabled:hover {\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.textbox-focused {\n  border-color: #000000;\n  -moz-box-shadow: 0 0 3px 0 #000;\n  -webkit-box-shadow: 0 0 3px 0 #000;\n  box-shadow: 0 0 3px 0 #000;\n}\n.textbox-invalid {\n  border-color: #ffa8a8;\n  background-color: #fff3f3;\n}\n.passwordbox-open {\n  background: url('images/passwordbox_open.png') no-repeat center center;\n}\n.passwordbox-close {\n  background: url('images/passwordbox_close.png') no-repeat center center;\n}\n.filebox .textbox-value {\n  vertical-align: top;\n  position: absolute;\n  top: 0;\n  left: -5000px;\n}\n.filebox-label {\n  display: inline-block;\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  cursor: pointer;\n  left: 0;\n  top: 0;\n  z-index: 10;\n  background: url('images/blank.gif') no-repeat;\n}\n.l-btn-disabled .filebox-label {\n  cursor: default;\n}\n.combo-arrow {\n  width: 18px;\n  height: 20px;\n  overflow: hidden;\n  display: inline-block;\n  vertical-align: top;\n  cursor: pointer;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.combo-arrow-hover {\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n}\n.combo-panel {\n  overflow: auto;\n}\n.combo-arrow {\n  background: url('images/combo_arrow.png') no-repeat center center;\n}\n.combo-panel {\n  background-color: #666;\n}\n.combo-arrow {\n  background-color: #3d3d3d;\n}\n.combo-arrow-hover {\n  background-color: #777;\n}\n.combo-arrow:hover {\n  background-color: #777;\n}\n.combo .textbox-icon-disabled:hover {\n  cursor: default;\n}\n.combobox-item,\n.combobox-group,\n.combobox-stick {\n  font-size: 12px;\n  padding: 6px 4px;\n  line-height: 20px;\n}\n.combobox-item-disabled {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.combobox-gitem {\n  padding-left: 10px;\n}\n.combobox-group,\n.combobox-stick {\n  font-weight: bold;\n}\n.combobox-stick {\n  position: absolute;\n  top: 1px;\n  left: 1px;\n  right: 1px;\n  background: inherit;\n}\n.combobox-item-hover {\n  background-color: #777;\n  color: #fff;\n}\n.combobox-item-selected {\n  background-color: #990000;\n  color: #fff;\n}\n.combobox-icon {\n  display: inline-block;\n  width: 16px;\n  height: 16px;\n  vertical-align: middle;\n  margin-right: 2px;\n}\n.tagbox {\n  cursor: text;\n}\n.tagbox .textbox-text {\n  float: left;\n}\n.tagbox-label {\n  position: relative;\n  display: block;\n  margin: 4px 0 0 4px;\n  padding: 0 20px 0 4px;\n  float: left;\n  vertical-align: top;\n  text-decoration: none;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n  background: #777;\n  color: #fff;\n}\n.tagbox-remove {\n  background: url('images/tagbox_icons.png') no-repeat -16px center;\n  position: absolute;\n  display: block;\n  width: 16px;\n  height: 16px;\n  right: 2px;\n  top: 50%;\n  margin-top: -8px;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.tagbox-remove:hover {\n  opacity: 1;\n  filter: alpha(opacity=100);\n}\n.textbox-disabled .tagbox-label {\n  cursor: default;\n}\n.textbox-disabled .tagbox-remove:hover {\n  cursor: default;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.layout {\n  position: relative;\n  overflow: hidden;\n  margin: 0;\n  padding: 0;\n  z-index: 0;\n}\n.layout-panel {\n  position: absolute;\n  overflow: hidden;\n}\n.layout-body {\n  min-width: 1px;\n  min-height: 1px;\n}\n.layout-panel-east,\n.layout-panel-west {\n  z-index: 2;\n}\n.layout-panel-north,\n.layout-panel-south {\n  z-index: 3;\n}\n.layout-expand {\n  position: absolute;\n  padding: 0px;\n  font-size: 1px;\n  cursor: pointer;\n  z-index: 1;\n}\n.layout-expand .panel-header,\n.layout-expand .panel-body {\n  background: transparent;\n  filter: none;\n  overflow: hidden;\n}\n.layout-expand .panel-header {\n  border-bottom-width: 0px;\n}\n.layout-expand .panel-body {\n  position: relative;\n}\n.layout-expand .panel-body .panel-icon {\n  margin-top: 0;\n  top: 0;\n  left: 50%;\n  margin-left: -8px;\n}\n.layout-expand-west .panel-header .panel-icon,\n.layout-expand-east .panel-header .panel-icon {\n  display: none;\n}\n.layout-expand-title {\n  position: absolute;\n  top: 0;\n  left: 21px;\n  white-space: nowrap;\n  word-wrap: normal;\n  -webkit-transform: rotate(90deg);\n  -webkit-transform-origin: 0 0;\n  -moz-transform: rotate(90deg);\n  -moz-transform-origin: 0 0;\n  -o-transform: rotate(90deg);\n  -o-transform-origin: 0 0;\n  transform: rotate(90deg);\n  transform-origin: 0 0;\n}\n.layout-expand-title-up {\n  position: absolute;\n  top: 0;\n  left: 0;\n  text-align: right;\n  padding-left: 5px;\n  white-space: nowrap;\n  word-wrap: normal;\n  -webkit-transform: rotate(-90deg);\n  -webkit-transform-origin: 0 0;\n  -moz-transform: rotate(-90deg);\n  -moz-transform-origin: 0 0;\n  -o-transform: rotate(-90deg);\n  -o-transform-origin: 0 0;\n  transform: rotate(-90deg);\n  transform-origin: 0 0;\n}\n.layout-expand-with-icon {\n  top: 18px;\n}\n.layout-expand .panel-body-noheader .layout-expand-title,\n.layout-expand .panel-body-noheader .panel-icon {\n  top: 5px;\n}\n.layout-expand .panel-body-noheader .layout-expand-with-icon {\n  top: 23px;\n}\n.layout-split-proxy-h,\n.layout-split-proxy-v {\n  position: absolute;\n  font-size: 1px;\n  display: none;\n  z-index: 5;\n}\n.layout-split-proxy-h {\n  width: 5px;\n  cursor: e-resize;\n}\n.layout-split-proxy-v {\n  height: 5px;\n  cursor: n-resize;\n}\n.layout-mask {\n  position: absolute;\n  background: #fafafa;\n  filter: alpha(opacity=10);\n  opacity: 0.10;\n  z-index: 4;\n}\n.layout-button-up {\n  background: url('images/layout_arrows.png') no-repeat -16px -16px;\n}\n.layout-button-down {\n  background: url('images/layout_arrows.png') no-repeat -16px 0;\n}\n.layout-button-left {\n  background: url('images/layout_arrows.png') no-repeat 0 0;\n}\n.layout-button-right {\n  background: url('images/layout_arrows.png') no-repeat 0 -16px;\n}\n.layout-split-proxy-h,\n.layout-split-proxy-v {\n  background-color: #cccccc;\n}\n.layout-split-north {\n  border-bottom: 5px solid #444;\n}\n.layout-split-south {\n  border-top: 5px solid #444;\n}\n.layout-split-east {\n  border-left: 5px solid #444;\n}\n.layout-split-west {\n  border-right: 5px solid #444;\n}\n.layout-expand {\n  background-color: #3d3d3d;\n}\n.layout-expand-over {\n  background-color: #3d3d3d;\n}\n.tabs-container {\n  overflow: hidden;\n}\n.tabs-header {\n  border-width: 1px;\n  border-style: solid;\n  border-bottom-width: 0;\n  position: relative;\n  padding: 0;\n  padding-top: 2px;\n  overflow: hidden;\n}\n.tabs-scroller-left,\n.tabs-scroller-right {\n  position: absolute;\n  top: auto;\n  bottom: 0;\n  width: 18px;\n  font-size: 1px;\n  display: none;\n  cursor: pointer;\n  border-width: 1px;\n  border-style: solid;\n}\n.tabs-scroller-left {\n  left: 0;\n}\n.tabs-scroller-right {\n  right: 0;\n}\n.tabs-tool {\n  position: absolute;\n  bottom: 0;\n  padding: 1px;\n  overflow: hidden;\n  border-width: 1px;\n  border-style: solid;\n}\n.tabs-header-plain .tabs-tool {\n  padding: 0 1px;\n}\n.tabs-wrap {\n  position: relative;\n  left: 0;\n  overflow: hidden;\n  width: 100%;\n  margin: 0;\n  padding: 0;\n}\n.tabs-scrolling {\n  margin-left: 18px;\n  margin-right: 18px;\n}\n.tabs-disabled {\n  opacity: 0.3;\n  filter: alpha(opacity=30);\n}\n.tabs {\n  list-style-type: none;\n  height: 26px;\n  margin: 0px;\n  padding: 0px;\n  padding-left: 4px;\n  width: 50000px;\n  border-style: solid;\n  border-width: 0 0 1px 0;\n}\n.tabs li {\n  float: left;\n  display: inline-block;\n  margin: 0 4px -1px 0;\n  padding: 0;\n  position: relative;\n  border: 0;\n}\n.tabs li a.tabs-inner {\n  display: inline-block;\n  text-decoration: none;\n  margin: 0;\n  padding: 0 10px;\n  height: 25px;\n  line-height: 25px;\n  text-align: center;\n  white-space: nowrap;\n  border-width: 1px;\n  border-style: solid;\n  -moz-border-radius: 5px 5px 0 0;\n  -webkit-border-radius: 5px 5px 0 0;\n  border-radius: 5px 5px 0 0;\n}\n.tabs li.tabs-selected a.tabs-inner {\n  font-weight: bold;\n  outline: none;\n}\n.tabs li.tabs-selected a:hover.tabs-inner {\n  cursor: default;\n  pointer: default;\n}\n.tabs li a.tabs-close,\n.tabs-p-tool {\n  position: absolute;\n  font-size: 1px;\n  display: block;\n  height: 12px;\n  padding: 0;\n  top: 50%;\n  margin-top: -6px;\n  overflow: hidden;\n}\n.tabs li a.tabs-close {\n  width: 12px;\n  right: 5px;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.tabs-p-tool {\n  right: 16px;\n}\n.tabs-p-tool a {\n  display: inline-block;\n  font-size: 1px;\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.tabs li a:hover.tabs-close,\n.tabs-p-tool a:hover {\n  opacity: 1;\n  filter: alpha(opacity=100);\n  cursor: hand;\n  cursor: pointer;\n}\n.tabs-with-icon {\n  padding-left: 18px;\n}\n.tabs-icon {\n  position: absolute;\n  width: 16px;\n  height: 16px;\n  left: 10px;\n  top: 50%;\n  margin-top: -8px;\n}\n.tabs-title {\n  font-size: 12px;\n}\n.tabs-closable {\n  padding-right: 8px;\n}\n.tabs-panels {\n  margin: 0px;\n  padding: 0px;\n  border-width: 1px;\n  border-style: solid;\n  border-top-width: 0;\n  overflow: hidden;\n}\n.tabs-header-bottom {\n  border-width: 0 1px 1px 1px;\n  padding: 0 0 2px 0;\n}\n.tabs-header-bottom .tabs {\n  border-width: 1px 0 0 0;\n}\n.tabs-header-bottom .tabs li {\n  margin: -1px 4px 0 0;\n}\n.tabs-header-bottom .tabs li a.tabs-inner {\n  -moz-border-radius: 0 0 5px 5px;\n  -webkit-border-radius: 0 0 5px 5px;\n  border-radius: 0 0 5px 5px;\n}\n.tabs-header-bottom .tabs-tool {\n  top: 0;\n}\n.tabs-header-bottom .tabs-scroller-left,\n.tabs-header-bottom .tabs-scroller-right {\n  top: 0;\n  bottom: auto;\n}\n.tabs-panels-top {\n  border-width: 1px 1px 0 1px;\n}\n.tabs-header-left {\n  float: left;\n  border-width: 1px 0 1px 1px;\n  padding: 0;\n}\n.tabs-header-right {\n  float: right;\n  border-width: 1px 1px 1px 0;\n  padding: 0;\n}\n.tabs-header-left .tabs-wrap,\n.tabs-header-right .tabs-wrap {\n  height: 100%;\n}\n.tabs-header-left .tabs {\n  height: 100%;\n  padding: 4px 0 0 2px;\n  border-width: 0 1px 0 0;\n}\n.tabs-header-right .tabs {\n  height: 100%;\n  padding: 4px 2px 0 0;\n  border-width: 0 0 0 1px;\n}\n.tabs-header-left .tabs li,\n.tabs-header-right .tabs li {\n  display: block;\n  width: 100%;\n  position: relative;\n}\n.tabs-header-left .tabs li {\n  left: auto;\n  right: 0;\n  margin: 0 -1px 4px 0;\n  float: right;\n}\n.tabs-header-right .tabs li {\n  left: 0;\n  right: auto;\n  margin: 0 0 4px -1px;\n  float: left;\n}\n.tabs-justified li a.tabs-inner {\n  padding-left: 0;\n  padding-right: 0;\n}\n.tabs-header-left .tabs li a.tabs-inner {\n  display: block;\n  text-align: left;\n  padding-left: 10px;\n  padding-right: 10px;\n  -moz-border-radius: 5px 0 0 5px;\n  -webkit-border-radius: 5px 0 0 5px;\n  border-radius: 5px 0 0 5px;\n}\n.tabs-header-right .tabs li a.tabs-inner {\n  display: block;\n  text-align: left;\n  padding-left: 10px;\n  padding-right: 10px;\n  -moz-border-radius: 0 5px 5px 0;\n  -webkit-border-radius: 0 5px 5px 0;\n  border-radius: 0 5px 5px 0;\n}\n.tabs-panels-right {\n  float: right;\n  border-width: 1px 1px 1px 0;\n}\n.tabs-panels-left {\n  float: left;\n  border-width: 1px 0 1px 1px;\n}\n.tabs-header-noborder,\n.tabs-panels-noborder {\n  border: 0px;\n}\n.tabs-header-plain {\n  border: 0px;\n  background: transparent;\n}\n.tabs-pill {\n  padding-bottom: 3px;\n}\n.tabs-header-bottom .tabs-pill {\n  padding-top: 3px;\n  padding-bottom: 0;\n}\n.tabs-header-left .tabs-pill {\n  padding-right: 3px;\n}\n.tabs-header-right .tabs-pill {\n  padding-left: 3px;\n}\n.tabs-header .tabs-pill li a.tabs-inner {\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.tabs-header-narrow,\n.tabs-header-narrow .tabs-narrow {\n  padding: 0;\n}\n.tabs-narrow li,\n.tabs-header-bottom .tabs-narrow li {\n  margin-left: 0;\n  margin-right: -1px;\n}\n\n.tabs-narrow li.tabs-last,\n.tabs-header-bottom .tabs-narrow li.tabs-last {\n  margin-right: 0;\n}\n.tabs-header-left .tabs-narrow,\n.tabs-header-right .tabs-narrow {\n  padding-top: 0;\n}\n.tabs-header-left .tabs-narrow li {\n  margin-bottom: -1px;\n  margin-right: -1px;\n}\n.tabs-header-left .tabs-narrow li.tabs-last,\n.tabs-header-right .tabs-narrow li.tabs-last {\n  margin-bottom: 0;\n}\n.tabs-header-right .tabs-narrow li {\n  margin-bottom: -1px;\n  margin-left: -1px;\n}\n.tabs-scroller-left {\n  background: #3d3d3d url('images/tabs_icons.png') no-repeat 1px center;\n}\n.tabs-scroller-right {\n  background: #3d3d3d url('images/tabs_icons.png') no-repeat -15px center;\n}\n.tabs li a.tabs-close {\n  background: url('images/tabs_icons.png') no-repeat -34px center;\n}\n.tabs li a.tabs-inner:hover {\n  background: #777;\n  color: #fff;\n  filter: none;\n}\n.tabs li.tabs-selected a.tabs-inner {\n  background-color: #666;\n  color: #fff;\n  background: -webkit-linear-gradient(top,#454545 0,#666 100%);\n  background: -moz-linear-gradient(top,#454545 0,#666 100%);\n  background: -o-linear-gradient(top,#454545 0,#666 100%);\n  background: linear-gradient(to bottom,#454545 0,#666 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#666,GradientType=0);\n}\n.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner {\n  background: -webkit-linear-gradient(top,#666 0,#454545 100%);\n  background: -moz-linear-gradient(top,#666 0,#454545 100%);\n  background: -o-linear-gradient(top,#666 0,#454545 100%);\n  background: linear-gradient(to bottom,#666 0,#454545 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#666,endColorstr=#454545,GradientType=0);\n}\n.tabs-header-left .tabs li.tabs-selected a.tabs-inner {\n  background: -webkit-linear-gradient(left,#454545 0,#666 100%);\n  background: -moz-linear-gradient(left,#454545 0,#666 100%);\n  background: -o-linear-gradient(left,#454545 0,#666 100%);\n  background: linear-gradient(to right,#454545 0,#666 100%);\n  background-repeat: repeat-y;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#666,GradientType=1);\n}\n.tabs-header-right .tabs li.tabs-selected a.tabs-inner {\n  background: -webkit-linear-gradient(left,#666 0,#454545 100%);\n  background: -moz-linear-gradient(left,#666 0,#454545 100%);\n  background: -o-linear-gradient(left,#666 0,#454545 100%);\n  background: linear-gradient(to right,#666 0,#454545 100%);\n  background-repeat: repeat-y;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#666,endColorstr=#454545,GradientType=1);\n}\n.tabs li a.tabs-inner {\n  color: #fff;\n  background-color: #3d3d3d;\n  background: -webkit-linear-gradient(top,#454545 0,#383838 100%);\n  background: -moz-linear-gradient(top,#454545 0,#383838 100%);\n  background: -o-linear-gradient(top,#454545 0,#383838 100%);\n  background: linear-gradient(to bottom,#454545 0,#383838 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#454545,endColorstr=#383838,GradientType=0);\n}\n.tabs-header,\n.tabs-tool {\n  background-color: #3d3d3d;\n}\n.tabs-header-plain {\n  background: transparent;\n}\n.tabs-header,\n.tabs-scroller-left,\n.tabs-scroller-right,\n.tabs-tool,\n.tabs,\n.tabs-panels,\n.tabs li a.tabs-inner,\n.tabs li.tabs-selected a.tabs-inner,\n.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner,\n.tabs-header-left .tabs li.tabs-selected a.tabs-inner,\n.tabs-header-right .tabs li.tabs-selected a.tabs-inner {\n  border-color: #000;\n}\n.tabs-p-tool a:hover,\n.tabs li a:hover.tabs-close,\n.tabs-scroller-over {\n  background-color: #777;\n}\n.tabs li.tabs-selected a.tabs-inner {\n  border-bottom: 1px solid #666;\n}\n.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner {\n  border-top: 1px solid #666;\n}\n.tabs-header-left .tabs li.tabs-selected a.tabs-inner {\n  border-right: 1px solid #666;\n}\n.tabs-header-right .tabs li.tabs-selected a.tabs-inner {\n  border-left: 1px solid #666;\n}\n.tabs-header .tabs-pill li.tabs-selected a.tabs-inner {\n  background: #990000;\n  color: #fff;\n  filter: none;\n  border-color: #000;\n}\n.datagrid .panel-body {\n  overflow: hidden;\n  position: relative;\n}\n.datagrid-view {\n  position: relative;\n  overflow: hidden;\n}\n.datagrid-view1,\n.datagrid-view2 {\n  position: absolute;\n  overflow: hidden;\n  top: 0;\n}\n.datagrid-view1 {\n  left: 0;\n}\n.datagrid-view2 {\n  right: 0;\n}\n.datagrid-mask {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0.3;\n  filter: alpha(opacity=30);\n  display: none;\n}\n.datagrid-mask-msg {\n  position: absolute;\n  top: 50%;\n  margin-top: -20px;\n  padding: 10px 5px 10px 30px;\n  width: auto;\n  height: 16px;\n  border-width: 2px;\n  border-style: solid;\n  display: none;\n}\n.datagrid-empty {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 25px;\n  line-height: 25px;\n  text-align: center;\n}\n.datagrid-sort-icon {\n  padding: 0;\n  display: none;\n}\n.datagrid-toolbar {\n  height: auto;\n  padding: 1px 2px;\n  border-width: 0 0 1px 0;\n  border-style: solid;\n}\n.datagrid-btn-separator {\n  float: left;\n  height: 24px;\n  border-left: 1px solid #444;\n  border-right: 1px solid #777;\n  margin: 2px 1px;\n}\n.datagrid .datagrid-pager {\n  display: block;\n  margin: 0;\n  border-width: 1px 0 0 0;\n  border-style: solid;\n}\n.datagrid .datagrid-pager-top {\n  border-width: 0 0 1px 0;\n}\n.datagrid-header {\n  overflow: hidden;\n  cursor: default;\n  border-width: 0 0 1px 0;\n  border-style: solid;\n}\n.datagrid-header-inner {\n  float: left;\n  width: 10000px;\n}\n.datagrid-header-row,\n.datagrid-row {\n  height: 32px;\n}\n.datagrid-header td,\n.datagrid-body td,\n.datagrid-footer td {\n  border-width: 0 1px 1px 0;\n  border-style: dotted;\n  margin: 0;\n  padding: 0;\n}\n.datagrid-cell,\n.datagrid-cell-group,\n.datagrid-header-rownumber,\n.datagrid-cell-rownumber {\n  margin: 0;\n  padding: 0 4px;\n  white-space: nowrap;\n  word-wrap: normal;\n  overflow: hidden;\n  height: 18px;\n  line-height: 18px;\n  font-size: 12px;\n}\n.datagrid-header .datagrid-cell {\n  height: auto;\n}\n.datagrid-header .datagrid-cell span {\n  font-size: 12px;\n}\n.datagrid-cell-group {\n  text-align: center;\n  text-overflow: ellipsis;\n}\n.datagrid-header-rownumber,\n.datagrid-cell-rownumber {\n  width: 30px;\n  text-align: center;\n  margin: 0;\n  padding: 0;\n}\n.datagrid-body {\n  margin: 0;\n  padding: 0;\n  overflow: auto;\n  zoom: 1;\n}\n.datagrid-view1 .datagrid-body-inner {\n  padding-bottom: 20px;\n}\n.datagrid-view1 .datagrid-body {\n  overflow: hidden;\n}\n.datagrid-footer {\n  overflow: hidden;\n}\n.datagrid-footer-inner {\n  border-width: 1px 0 0 0;\n  border-style: solid;\n  width: 10000px;\n  float: left;\n}\n.datagrid-row-editing .datagrid-cell {\n  height: auto;\n}\n.datagrid-header-check,\n.datagrid-cell-check {\n  padding: 0;\n  width: 27px;\n  height: 18px;\n  font-size: 1px;\n  text-align: center;\n  overflow: hidden;\n}\n.datagrid-header-check input,\n.datagrid-cell-check input {\n  margin: 0;\n  padding: 0;\n  width: 15px;\n  height: 18px;\n}\n.datagrid-resize-proxy {\n  position: absolute;\n  width: 1px;\n  height: 10000px;\n  top: 0;\n  cursor: e-resize;\n  display: none;\n}\n.datagrid-body .datagrid-editable {\n  margin: 0;\n  padding: 0;\n}\n.datagrid-body .datagrid-editable table {\n  width: 100%;\n  height: 100%;\n}\n.datagrid-body .datagrid-editable td {\n  border: 0;\n  margin: 0;\n  padding: 0;\n}\n.datagrid-view .datagrid-editable-input {\n  margin: 0;\n  padding: 2px 4px;\n  border: 1px solid #000;\n  font-size: 12px;\n  outline-style: none;\n  -moz-border-radius: 0 0 0 0;\n  -webkit-border-radius: 0 0 0 0;\n  border-radius: 0 0 0 0;\n}\n.datagrid-view .validatebox-invalid {\n  border-color: #ffa8a8;\n}\n.datagrid-sort .datagrid-sort-icon {\n  display: inline;\n  padding: 0 13px 0 0;\n  background: url('images/datagrid_icons.png') no-repeat -64px center;\n}\n.datagrid-sort-desc .datagrid-sort-icon {\n  display: inline;\n  padding: 0 13px 0 0;\n  background: url('images/datagrid_icons.png') no-repeat -16px center;\n}\n.datagrid-sort-asc .datagrid-sort-icon {\n  display: inline;\n  padding: 0 13px 0 0;\n  background: url('images/datagrid_icons.png') no-repeat 0px center;\n}\n.datagrid-row-collapse {\n  background: url('images/datagrid_icons.png') no-repeat -48px center;\n}\n.datagrid-row-expand {\n  background: url('images/datagrid_icons.png') no-repeat -32px center;\n}\n.datagrid-mask-msg {\n  background: #666 url('images/loading.gif') no-repeat scroll 5px center;\n}\n.datagrid-header,\n.datagrid-td-rownumber {\n  background-color: #444;\n  background: -webkit-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%);\n  background: -moz-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%);\n  background: -o-linear-gradient(top,#4c4c4c 0,#3f3f3f 100%);\n  background: linear-gradient(to bottom,#4c4c4c 0,#3f3f3f 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#4c4c4c,endColorstr=#3f3f3f,GradientType=0);\n}\n.datagrid-cell-rownumber {\n  color: #fff;\n}\n.datagrid-resize-proxy {\n  background: #cccccc;\n}\n.datagrid-mask {\n  background: #000;\n}\n.datagrid-mask-msg {\n  border-color: #000;\n}\n.datagrid-toolbar,\n.datagrid-pager {\n  background: #555;\n}\n.datagrid-header,\n.datagrid-toolbar,\n.datagrid-pager,\n.datagrid-footer-inner {\n  border-color: #222;\n}\n.datagrid-header td,\n.datagrid-body td,\n.datagrid-footer td {\n  border-color: #222;\n}\n.datagrid-htable,\n.datagrid-btable,\n.datagrid-ftable {\n  color: #fff;\n  border-collapse: separate;\n}\n.datagrid-row-alt {\n  background: #555;\n}\n.datagrid-row-over,\n.datagrid-header td.datagrid-header-over {\n  background: #777;\n  color: #fff;\n  cursor: default;\n}\n.datagrid-row-selected {\n  background: #990000;\n  color: #fff;\n}\n.datagrid-row-editing .textbox,\n.datagrid-row-editing .textbox-text {\n  -moz-border-radius: 0 0 0 0;\n  -webkit-border-radius: 0 0 0 0;\n  border-radius: 0 0 0 0;\n}\n.datagrid-header .datagrid-filter-row td.datagrid-header-over {\n  background: inherit;\n}\n.propertygrid .datagrid-view1 .datagrid-body td {\n  padding-bottom: 1px;\n  border-width: 0 1px 0 0;\n}\n.propertygrid .datagrid-group {\n  overflow: hidden;\n  border-width: 0 0 1px 0;\n  border-style: solid;\n}\n.propertygrid .datagrid-group span {\n  font-weight: bold;\n}\n.propertygrid .datagrid-view1 .datagrid-body td {\n  border-color: #222;\n}\n.propertygrid .datagrid-view1 .datagrid-group {\n  border-color: #3d3d3d;\n}\n.propertygrid .datagrid-view2 .datagrid-group {\n  border-color: #222;\n}\n.propertygrid .datagrid-group,\n.propertygrid .datagrid-view1 .datagrid-body,\n.propertygrid .datagrid-view1 .datagrid-row-over,\n.propertygrid .datagrid-view1 .datagrid-row-selected {\n  background: #3d3d3d;\n}\n.datalist .datagrid-header {\n  border-width: 0;\n}\n.datalist .datagrid-group,\n.m-list .m-list-group {\n  height: 25px;\n  line-height: 25px;\n  font-weight: bold;\n  overflow: hidden;\n  background-color: #444;\n  border-style: solid;\n  border-width: 0 0 1px 0;\n  border-color: #222;\n}\n.datalist .datagrid-group-expander {\n  display: none;\n}\n.datalist .datagrid-group-title {\n  padding: 0 4px;\n}\n.datalist .datagrid-btable {\n  width: 100%;\n  table-layout: fixed;\n}\n.datalist .datagrid-row td {\n  border-style: solid;\n  border-left-color: transparent;\n  border-right-color: transparent;\n  border-bottom-width: 0;\n}\n.datalist-lines .datagrid-row td {\n  border-bottom-width: 1px;\n}\n.datalist .datagrid-cell,\n.m-list li {\n  width: auto;\n  height: auto;\n  padding: 2px 4px;\n  line-height: 18px;\n  position: relative;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden;\n}\n.datalist-link,\n.m-list li>a {\n  display: block;\n  position: relative;\n  cursor: pointer;\n  color: #fff;\n  text-decoration: none;\n  overflow: hidden;\n  margin: -2px -4px;\n  padding: 2px 4px;\n  padding-right: 16px;\n  line-height: 18px;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden;\n}\n.datalist-link::after,\n.m-list li>a::after {\n  position: absolute;\n  display: block;\n  width: 8px;\n  height: 8px;\n  content: '';\n  right: 6px;\n  top: 50%;\n  margin-top: -4px;\n  border-style: solid;\n  border-width: 1px 1px 0 0;\n  -ms-transform: rotate(45deg);\n  -moz-transform: rotate(45deg);\n  -webkit-transform: rotate(45deg);\n  -o-transform: rotate(45deg);\n  transform: rotate(45deg);\n}\n.m-list {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.m-list li {\n  border-style: solid;\n  border-width: 0 0 1px 0;\n  border-color: #222;\n}\n.m-list li>a:hover {\n  background: #777;\n  color: #fff;\n}\n.m-list .m-list-group {\n  padding: 0 4px;\n}\n.pagination {\n  zoom: 1;\n  padding: 2px;\n}\n.pagination table {\n  float: left;\n  height: 30px;\n}\n.pagination td {\n  border: 0;\n}\n.pagination-btn-separator {\n  float: left;\n  height: 24px;\n  border-left: 1px solid #444;\n  border-right: 1px solid #777;\n  margin: 3px 1px;\n}\n.pagination .pagination-num {\n  border-width: 1px;\n  border-style: solid;\n  margin: 0 2px;\n  padding: 2px;\n  width: 3em;\n  height: auto;\n  text-align: center;\n  font-size: 12px;\n}\n.pagination-page-list {\n  margin: 0px 6px;\n  padding: 1px 2px;\n  width: auto;\n  height: auto;\n  border-width: 1px;\n  border-style: solid;\n}\n.pagination-info {\n  float: right;\n  margin: 0 6px;\n  padding: 0;\n  height: 30px;\n  line-height: 30px;\n  font-size: 12px;\n}\n.pagination span {\n  font-size: 12px;\n}\n.pagination-link .l-btn-text {\n  box-sizing: border-box;\n  text-align: center;\n  margin: 0;\n  padding: 0 .5em;\n  width: auto;\n  min-width: 28px;\n}\n.pagination-first {\n  background: url('images/pagination_icons.png') no-repeat 0 center;\n}\n.pagination-prev {\n  background: url('images/pagination_icons.png') no-repeat -16px center;\n}\n.pagination-next {\n  background: url('images/pagination_icons.png') no-repeat -32px center;\n}\n.pagination-last {\n  background: url('images/pagination_icons.png') no-repeat -48px center;\n}\n.pagination-load {\n  background: url('images/pagination_icons.png') no-repeat -64px center;\n}\n.pagination-loading {\n  background: url('images/loading.gif') no-repeat center center;\n}\n.pagination-page-list,\n.pagination .pagination-num {\n  border-color: #000;\n}\n.calendar {\n  border-width: 1px;\n  border-style: solid;\n  padding: 1px;\n  overflow: hidden;\n}\n.calendar table {\n  table-layout: fixed;\n  border-collapse: separate;\n  font-size: 12px;\n  width: 100%;\n  height: 100%;\n}\n.calendar table td,\n.calendar table th {\n  font-size: 12px;\n}\n.calendar-noborder {\n  border: 0;\n}\n.calendar-header {\n  position: relative;\n  height: 28px;\n}\n.calendar-title {\n  text-align: center;\n  height: 28px;\n}\n.calendar-title span {\n  position: relative;\n  display: inline-block;\n  top: 0px;\n  padding: 0 3px;\n  height: 28px;\n  line-height: 28px;\n  font-size: 12px;\n  cursor: pointer;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.calendar-prevmonth,\n.calendar-nextmonth,\n.calendar-prevyear,\n.calendar-nextyear {\n  position: absolute;\n  top: 50%;\n  margin-top: -8px;\n  width: 16px;\n  height: 16px;\n  cursor: pointer;\n  font-size: 1px;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.calendar-prevmonth {\n  left: 20px;\n  background: url('images/calendar_arrows.png') no-repeat -16px 0;\n}\n.calendar-nextmonth {\n  right: 20px;\n  background: url('images/calendar_arrows.png') no-repeat -32px 0;\n}\n.calendar-prevyear {\n  left: 3px;\n  background: url('images/calendar_arrows.png') no-repeat 0px 0;\n}\n.calendar-nextyear {\n  right: 3px;\n  background: url('images/calendar_arrows.png') no-repeat -48px 0;\n}\n.calendar-body {\n  position: relative;\n}\n.calendar-body th,\n.calendar-body td {\n  text-align: center;\n}\n.calendar-day {\n  border: 0;\n  padding: 1px;\n  cursor: pointer;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.calendar-other-month {\n  opacity: 0.3;\n  filter: alpha(opacity=30);\n}\n.calendar-disabled {\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n  cursor: default;\n}\n.calendar-menu {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 180px;\n  height: 150px;\n  padding: 5px;\n  font-size: 12px;\n  display: none;\n  overflow: hidden;\n}\n.calendar-menu-year-inner {\n  text-align: center;\n  padding-bottom: 5px;\n}\n.calendar-menu-year {\n  width: 80px;\n  line-height: 26px;\n  text-align: center;\n  border-width: 1px;\n  border-style: solid;\n  outline-style: none;\n  resize: none;\n  margin: 0;\n  padding: 0;\n  font-weight: bold;\n  font-size: 12px;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.calendar-menu-prev,\n.calendar-menu-next {\n  display: inline-block;\n  width: 25px;\n  height: 28px;\n  vertical-align: top;\n  cursor: pointer;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.calendar-menu-prev {\n  margin-right: 10px;\n  background: url('images/calendar_arrows.png') no-repeat 5px center;\n}\n.calendar-menu-next {\n  margin-left: 10px;\n  background: url('images/calendar_arrows.png') no-repeat -44px center;\n}\n.calendar-menu-month {\n  text-align: center;\n  cursor: pointer;\n  font-weight: bold;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.calendar-body th,\n.calendar-menu-month {\n  color: #ffffff;\n}\n.calendar-day {\n  color: #fff;\n}\n.calendar-sunday {\n  color: #CC2222;\n}\n.calendar-saturday {\n  color: #00ee00;\n}\n.calendar-today {\n  color: #0000ff;\n}\n.calendar-menu-year {\n  border-color: #000;\n}\n.calendar {\n  border-color: #000;\n}\n.calendar-header {\n  background: #3d3d3d;\n}\n.calendar-body,\n.calendar-menu {\n  background: #666;\n}\n.calendar-body th {\n  background: #555;\n  padding: 4px 0;\n}\n.calendar-hover,\n.calendar-nav-hover,\n.calendar-menu-hover {\n  background-color: #777;\n  color: #fff;\n}\n.calendar-hover {\n  border: 1px solid #555;\n  padding: 0;\n}\n.calendar-selected {\n  background-color: #990000;\n  color: #fff;\n  border: 1px solid #AA0000;\n  padding: 0;\n}\n.datebox-calendar-inner {\n  height: 250px;\n}\n.datebox-button {\n  padding: 4px 0;\n  text-align: center;\n}\n.datebox-button a {\n  line-height: 22px;\n  font-size: 12px;\n  font-weight: bold;\n  text-decoration: none;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.datebox-button a:hover {\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n}\n.datebox-current,\n.datebox-close {\n  float: left;\n}\n.datebox-close {\n  float: right;\n}\n.datebox .combo-arrow {\n  background-image: url('images/datebox_arrow.png');\n  background-position: center center;\n}\n.datebox-button {\n  background-color: #555;\n}\n.datebox-button a {\n  color: #fff;\n}\n.spinner-arrow {\n  display: inline-block;\n  overflow: hidden;\n  vertical-align: top;\n  margin: 0;\n  padding: 0;\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n  width: 18px;\n}\n.spinner-arrow.spinner-button-top,\n.spinner-arrow.spinner-button-bottom,\n.spinner-arrow.spinner-button-left,\n.spinner-arrow.spinner-button-right {\n  background-color: #3d3d3d;\n}\n.spinner-arrow-up,\n.spinner-arrow-down {\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n  display: block;\n  font-size: 1px;\n  width: 18px;\n  height: 10px;\n  width: 100%;\n  height: 50%;\n  color: #fff;\n  outline-style: none;\n  background-color: #3d3d3d;\n}\n.spinner-button-updown {\n  opacity: 1.0;\n}\n.spinner-button-updown .spinner-button-top,\n.spinner-button-updown .spinner-button-bottom {\n  position: relative;\n  display: block;\n  width: 100%;\n  height: 50%;\n}\n.spinner-button-updown .spinner-arrow-up,\n.spinner-button-updown .spinner-arrow-down {\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n  cursor: pointer;\n  width: 16px;\n  height: 16px;\n  top: 50%;\n  left: 50%;\n  margin-top: -8px;\n  margin-left: -8px;\n  position: absolute;\n}\n.spinner-button-updown .spinner-button-top,\n.spinner-button-updown .spinner-button-bottom {\n  cursor: pointer;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.spinner-button-updown .spinner-button-top:hover,\n.spinner-button-updown .spinner-button-bottom:hover {\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n}\n.spinner-button-updown .spinner-arrow-up,\n.spinner-button-updown .spinner-arrow-down,\n.spinner-button-updown .spinner-arrow-up:hover,\n.spinner-button-updown .spinner-arrow-down:hover {\n  background-color: transparent;\n}\n.spinner-arrow-hover {\n  background-color: #777;\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n}\n.spinner-button-top:hover,\n.spinner-button-bottom:hover,\n.spinner-button-left:hover,\n.spinner-button-right:hover,\n.spinner-arrow-up:hover,\n.spinner-arrow-down:hover {\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n  background-color: #777;\n}\n.textbox-disabled .spinner-button-top:hover,\n.textbox-disabled .spinner-button-bottom:hover,\n.textbox-disabled .spinner-button-left:hover,\n.textbox-disabled .spinner-button-right:hover,\n.textbox-icon-disabled .spinner-arrow-up:hover,\n.textbox-icon-disabled .spinner-arrow-down:hover {\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n  background-color: #3d3d3d;\n  cursor: default;\n}\n.spinner .textbox-icon-disabled {\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.spinner-arrow-up {\n  background: url('images/spinner_arrows.png') no-repeat 1px center;\n  background-color: #3d3d3d;\n}\n.spinner-arrow-down {\n  background: url('images/spinner_arrows.png') no-repeat -15px center;\n  background-color: #3d3d3d;\n}\n.spinner-button-up {\n  background: url('images/spinner_arrows.png') no-repeat -32px center;\n}\n.spinner-button-down {\n  background: url('images/spinner_arrows.png') no-repeat -48px center;\n}\n.progressbar {\n  border-width: 1px;\n  border-style: solid;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n  overflow: hidden;\n  position: relative;\n}\n.progressbar-text {\n  text-align: center;\n  position: absolute;\n}\n.progressbar-value {\n  position: relative;\n  overflow: hidden;\n  width: 0;\n  -moz-border-radius: 5px 0 0 5px;\n  -webkit-border-radius: 5px 0 0 5px;\n  border-radius: 5px 0 0 5px;\n}\n.progressbar {\n  border-color: #000;\n}\n.progressbar-text {\n  color: #fff;\n  font-size: 12px;\n}\n.progressbar-value,\n.progressbar-value .progressbar-text {\n  background-color: #990000;\n  color: #fff;\n}\n.searchbox-button {\n  width: 18px;\n  height: 20px;\n  overflow: hidden;\n  display: inline-block;\n  vertical-align: top;\n  cursor: pointer;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.searchbox-button-hover {\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n}\n.searchbox .l-btn-plain {\n  border: 0;\n  padding: 0;\n  vertical-align: top;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n  -moz-border-radius: 0 0 0 0;\n  -webkit-border-radius: 0 0 0 0;\n  border-radius: 0 0 0 0;\n}\n.searchbox .l-btn-plain:hover {\n  border: 0;\n  padding: 0;\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n  -moz-border-radius: 0 0 0 0;\n  -webkit-border-radius: 0 0 0 0;\n  border-radius: 0 0 0 0;\n}\n.searchbox a.m-btn-plain-active {\n  -moz-border-radius: 0 0 0 0;\n  -webkit-border-radius: 0 0 0 0;\n  border-radius: 0 0 0 0;\n}\n.searchbox .m-btn-active {\n  border-width: 0 1px 0 0;\n  -moz-border-radius: 0 0 0 0;\n  -webkit-border-radius: 0 0 0 0;\n  border-radius: 0 0 0 0;\n}\n.searchbox .textbox-button-right {\n  border-width: 0 0 0 1px;\n}\n.searchbox .textbox-button-left {\n  border-width: 0 1px 0 0;\n}\n.searchbox-button {\n  background: url('images/searchbox_button.png') no-repeat center center;\n}\n.searchbox .l-btn-plain {\n  background: #3d3d3d;\n}\n.searchbox .l-btn-plain-disabled,\n.searchbox .l-btn-plain-disabled:hover {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.slider-disabled {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.slider-h {\n  height: 22px;\n}\n.slider-v {\n  width: 22px;\n}\n.slider-inner {\n  position: relative;\n  height: 6px;\n  top: 7px;\n  border-width: 1px;\n  border-style: solid;\n  border-radius: 5px;\n}\n.slider-handle {\n  position: absolute;\n  display: block;\n  outline: none;\n  width: 20px;\n  height: 20px;\n  top: 50%;\n  margin-top: -10px;\n  margin-left: -10px;\n}\n.slider-tip {\n  position: absolute;\n  display: inline-block;\n  line-height: 12px;\n  font-size: 12px;\n  white-space: nowrap;\n  top: -22px;\n}\n.slider-rule {\n  position: relative;\n  top: 15px;\n}\n.slider-rule span {\n  position: absolute;\n  display: inline-block;\n  font-size: 0;\n  height: 5px;\n  border-width: 0 0 0 1px;\n  border-style: solid;\n}\n.slider-rulelabel {\n  position: relative;\n  top: 20px;\n}\n.slider-rulelabel span {\n  position: absolute;\n  display: inline-block;\n  font-size: 12px;\n}\n.slider-v .slider-inner {\n  width: 6px;\n  left: 7px;\n  top: 0;\n  float: left;\n}\n.slider-v .slider-handle {\n  left: 50%;\n  margin-top: -10px;\n}\n.slider-v .slider-tip {\n  left: -10px;\n  margin-top: -6px;\n}\n.slider-v .slider-rule {\n  float: left;\n  top: 0;\n  left: 16px;\n}\n.slider-v .slider-rule span {\n  width: 5px;\n  height: 'auto';\n  border-left: 0;\n  border-width: 1px 0 0 0;\n  border-style: solid;\n}\n.slider-v .slider-rulelabel {\n  float: left;\n  top: 0;\n  left: 23px;\n}\n.slider-handle {\n  background: url('images/slider_handle.png') no-repeat;\n}\n.slider-inner {\n  border-color: #000;\n  background: #3d3d3d;\n}\n.slider-rule span {\n  border-color: #000;\n}\n.slider-rulelabel span {\n  color: #fff;\n}\n.menu {\n  position: absolute;\n  margin: 0;\n  padding: 2px;\n  border-width: 1px;\n  border-style: solid;\n  overflow: hidden;\n}\n.menu-inline {\n  position: relative;\n}\n.menu-item {\n  position: relative;\n  margin: 0;\n  padding: 0;\n  overflow: hidden;\n  white-space: nowrap;\n  cursor: pointer;\n  border-width: 1px;\n  border-style: solid;\n}\n.menu-text {\n  height: 20px;\n  line-height: 20px;\n  float: left;\n  padding-left: 28px;\n}\n.menu-icon {\n  position: absolute;\n  width: 16px;\n  height: 16px;\n  left: 2px;\n  top: 50%;\n  margin-top: -8px;\n}\n.menu-rightarrow {\n  position: absolute;\n  width: 16px;\n  height: 16px;\n  right: 0;\n  top: 50%;\n  margin-top: -8px;\n}\n.menu-line {\n  position: absolute;\n  left: 26px;\n  top: 0;\n  height: 2000px;\n  font-size: 1px;\n}\n.menu-sep {\n  margin: 3px 0px 3px 25px;\n  font-size: 1px;\n}\n.menu-noline .menu-line {\n  display: none;\n}\n.menu-noline .menu-sep {\n  margin-left: 0;\n  margin-right: 0;\n}\n.menu-active {\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.menu-item-disabled {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n  cursor: default;\n}\n.menu-text,\n.menu-text span {\n  font-size: 12px;\n}\n.menu-shadow {\n  position: absolute;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n  background: #777;\n  -moz-box-shadow: 2px 2px 3px #787878;\n  -webkit-box-shadow: 2px 2px 3px #787878;\n  box-shadow: 2px 2px 3px #787878;\n  filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);\n}\n.menu-rightarrow {\n  background: url('images/menu_arrows.png') no-repeat -32px center;\n}\n.menu-line {\n  border-left: 1px solid #444;\n  border-right: 1px solid #777;\n}\n.menu-sep {\n  border-top: 1px solid #444;\n  border-bottom: 1px solid #777;\n}\n.menu {\n  background-color: #666;\n  border-color: #444;\n  color: #fff;\n}\n.menu-content {\n  background: #666;\n}\n.menu-item {\n  border-color: transparent;\n  _border-color: #666;\n}\n.menu-active {\n  border-color: #555;\n  color: #fff;\n  background: #777;\n}\n.menu-active-disabled {\n  border-color: transparent;\n  background: transparent;\n  color: #fff;\n}\n.m-btn-downarrow,\n.s-btn-downarrow {\n  display: inline-block;\n  position: absolute;\n  width: 16px;\n  height: 16px;\n  font-size: 1px;\n  right: 0;\n  top: 50%;\n  margin-top: -8px;\n}\n.m-btn-active,\n.s-btn-active {\n  background: #777;\n  color: #fff;\n  border: 1px solid #555;\n  filter: none;\n}\n.m-btn-plain-active,\n.s-btn-plain-active {\n  background: transparent;\n  padding: 0;\n  border-width: 1px;\n  border-style: solid;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.m-btn .l-btn-left .l-btn-text {\n  margin-right: 20px;\n}\n.m-btn .l-btn-icon-right .l-btn-text {\n  margin-right: 40px;\n}\n.m-btn .l-btn-icon-right .l-btn-icon {\n  right: 20px;\n}\n.m-btn .l-btn-icon-top .l-btn-text {\n  margin-right: 4px;\n  margin-bottom: 14px;\n}\n.m-btn .l-btn-icon-bottom .l-btn-text {\n  margin-right: 4px;\n  margin-bottom: 34px;\n}\n.m-btn .l-btn-icon-bottom .l-btn-icon {\n  top: auto;\n  bottom: 20px;\n}\n.m-btn .l-btn-icon-top .m-btn-downarrow,\n.m-btn .l-btn-icon-bottom .m-btn-downarrow {\n  top: auto;\n  bottom: 0px;\n  left: 50%;\n  margin-left: -8px;\n}\n.m-btn-line {\n  display: inline-block;\n  position: absolute;\n  font-size: 1px;\n  display: none;\n}\n.m-btn .l-btn-left .m-btn-line {\n  right: 0;\n  width: 16px;\n  height: 500px;\n  border-style: solid;\n  border-color: #cccccc;\n  border-width: 0 0 0 1px;\n}\n.m-btn .l-btn-icon-top .m-btn-line,\n.m-btn .l-btn-icon-bottom .m-btn-line {\n  left: 0;\n  bottom: 0;\n  width: 500px;\n  height: 16px;\n  border-width: 1px 0 0 0;\n}\n.m-btn-large .l-btn-icon-right .l-btn-text {\n  margin-right: 56px;\n}\n.m-btn-large .l-btn-icon-bottom .l-btn-text {\n  margin-bottom: 50px;\n}\n.m-btn-downarrow,\n.s-btn-downarrow {\n  background: url('images/menu_arrows.png') no-repeat 0 center;\n}\n.m-btn-plain-active,\n.s-btn-plain-active {\n  border-color: #555;\n  background-color: #777;\n  color: #fff;\n}\n.s-btn:hover .m-btn-line,\n.s-btn-active .m-btn-line,\n.s-btn-plain-active .m-btn-line {\n  display: inline-block;\n}\n.l-btn:hover .s-btn-downarrow,\n.s-btn-active .s-btn-downarrow,\n.s-btn-plain-active .s-btn-downarrow {\n  border-style: solid;\n  border-color: #cccccc;\n  border-width: 0 0 0 1px;\n}\n.switchbutton {\n  text-decoration: none;\n  display: inline-block;\n  overflow: hidden;\n  vertical-align: middle;\n  margin: 0;\n  padding: 0;\n  cursor: pointer;\n  background: #555;\n  border: 1px solid #555;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.switchbutton-inner {\n  display: inline-block;\n  overflow: hidden;\n  position: relative;\n  top: -1px;\n  left: -1px;\n}\n.switchbutton-on,\n.switchbutton-off,\n.switchbutton-handle {\n  display: inline-block;\n  text-align: center;\n  height: 100%;\n  float: left;\n  font-size: 12px;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.switchbutton-on {\n  background: #990000;\n  color: #fff;\n}\n.switchbutton-off {\n  background-color: #666;\n  color: #fff;\n}\n.switchbutton-on,\n.switchbutton-reversed .switchbutton-off {\n  -moz-border-radius: 5px 0 0 5px;\n  -webkit-border-radius: 5px 0 0 5px;\n  border-radius: 5px 0 0 5px;\n}\n.switchbutton-off,\n.switchbutton-reversed .switchbutton-on {\n  -moz-border-radius: 0 5px 5px 0;\n  -webkit-border-radius: 0 5px 5px 0;\n  border-radius: 0 5px 5px 0;\n}\n.switchbutton-handle {\n  position: absolute;\n  top: 0;\n  left: 50%;\n  background-color: #666;\n  color: #fff;\n  border: 1px solid #555;\n  -moz-box-shadow: 0 0 3px 0 #555;\n  -webkit-box-shadow: 0 0 3px 0 #555;\n  box-shadow: 0 0 3px 0 #555;\n}\n.switchbutton-value {\n  position: absolute;\n  top: 0;\n  left: -5000px;\n}\n.switchbutton-disabled {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.switchbutton-disabled,\n.switchbutton-readonly {\n  cursor: default;\n}\n.messager-body {\n  padding: 10px 10px 30px 10px;\n  overflow: auto;\n}\n.messager-button {\n  text-align: center;\n  padding: 5px;\n}\n.messager-button .l-btn {\n  width: 70px;\n}\n.messager-icon {\n  float: left;\n  width: 32px;\n  height: 32px;\n  margin: 0 10px 10px 0;\n}\n.messager-error {\n  background: url('images/messager_icons.png') no-repeat scroll -64px 0;\n}\n.messager-info {\n  background: url('images/messager_icons.png') no-repeat scroll 0 0;\n}\n.messager-question {\n  background: url('images/messager_icons.png') no-repeat scroll -32px 0;\n}\n.messager-warning {\n  background: url('images/messager_icons.png') no-repeat scroll -96px 0;\n}\n.messager-progress {\n  padding: 10px;\n}\n.messager-p-msg {\n  margin-bottom: 5px;\n}\n.messager-body .messager-input {\n  width: 100%;\n  padding: 4px 0;\n  outline-style: none;\n  border: 1px solid #000;\n}\n.window-thinborder .messager-button {\n  padding-bottom: 8px;\n}\n.tree {\n  margin: 0;\n  padding: 0;\n  list-style-type: none;\n}\n.tree li {\n  white-space: nowrap;\n}\n.tree li ul {\n  list-style-type: none;\n  margin: 0;\n  padding: 0;\n}\n.tree-node {\n  height: 26px;\n  white-space: nowrap;\n  cursor: pointer;\n}\n.tree-hit {\n  cursor: pointer;\n}\n.tree-expanded,\n.tree-collapsed,\n.tree-folder,\n.tree-file,\n.tree-checkbox,\n.tree-indent {\n  display: inline-block;\n  width: 16px;\n  height: 18px;\n  margin: 4px 0;\n  vertical-align: middle;\n  overflow: hidden;\n}\n.tree-expanded {\n  background: url('images/tree_icons.png') no-repeat -18px 0px;\n}\n.tree-expanded-hover {\n  background: url('images/tree_icons.png') no-repeat -50px 0px;\n}\n.tree-collapsed {\n  background: url('images/tree_icons.png') no-repeat 0px 0px;\n}\n.tree-collapsed-hover {\n  background: url('images/tree_icons.png') no-repeat -32px 0px;\n}\n.tree-lines .tree-expanded,\n.tree-lines .tree-root-first .tree-expanded {\n  background: url('images/tree_icons.png') no-repeat -144px 0;\n}\n.tree-lines .tree-collapsed,\n.tree-lines .tree-root-first .tree-collapsed {\n  background: url('images/tree_icons.png') no-repeat -128px 0;\n}\n.tree-lines .tree-node-last .tree-expanded,\n.tree-lines .tree-root-one .tree-expanded {\n  background: url('images/tree_icons.png') no-repeat -80px 0;\n}\n.tree-lines .tree-node-last .tree-collapsed,\n.tree-lines .tree-root-one .tree-collapsed {\n  background: url('images/tree_icons.png') no-repeat -64px 0;\n}\n.tree-line {\n  background: url('images/tree_icons.png') no-repeat -176px 0;\n}\n.tree-join {\n  background: url('images/tree_icons.png') no-repeat -192px 0;\n}\n.tree-joinbottom {\n  background: url('images/tree_icons.png') no-repeat -160px 0;\n}\n.tree-folder {\n  background: url('images/tree_icons.png') no-repeat -208px 0;\n}\n.tree-folder-open {\n  background: url('images/tree_icons.png') no-repeat -224px 0;\n}\n.tree-file {\n  background: url('images/tree_icons.png') no-repeat -240px 0;\n}\n.tree-loading {\n  background: url('images/loading.gif') no-repeat center center;\n}\n.tree-checkbox0 {\n  background: url('images/tree_icons.png') no-repeat -208px -18px;\n}\n.tree-checkbox1 {\n  background: url('images/tree_icons.png') no-repeat -224px -18px;\n}\n.tree-checkbox2 {\n  background: url('images/tree_icons.png') no-repeat -240px -18px;\n}\n.tree-title {\n  font-size: 12px;\n  display: inline-block;\n  text-decoration: none;\n  vertical-align: middle;\n  white-space: nowrap;\n  padding: 0 2px;\n  margin: 4px 0;\n  height: 18px;\n  line-height: 18px;\n}\n.tree-node-proxy {\n  font-size: 12px;\n  line-height: 20px;\n  padding: 0 2px 0 20px;\n  border-width: 1px;\n  border-style: solid;\n  z-index: 9900000;\n}\n.tree-dnd-icon {\n  display: inline-block;\n  position: absolute;\n  width: 16px;\n  height: 18px;\n  left: 2px;\n  top: 50%;\n  margin-top: -9px;\n}\n.tree-dnd-yes {\n  background: url('images/tree_icons.png') no-repeat -256px 0;\n}\n.tree-dnd-no {\n  background: url('images/tree_icons.png') no-repeat -256px -18px;\n}\n.tree-node-top {\n  border-top: 1px dotted red;\n}\n.tree-node-bottom {\n  border-bottom: 1px dotted red;\n}\n.tree-node-append .tree-title {\n  border: 1px dotted red;\n}\n.tree-editor {\n  border: 1px solid #000;\n  font-size: 12px;\n  height: 26px;\n  line-height: 26px;\n  padding: 0 4px;\n  margin: 0;\n  width: 80px;\n  outline-style: none;\n  vertical-align: middle;\n  position: absolute;\n  top: 0;\n}\n.tree-node-proxy {\n  background-color: #666;\n  color: #fff;\n  border-color: #000;\n}\n.tree-node-hover {\n  background: #777;\n  color: #fff;\n}\n.tree-node-selected {\n  background: #990000;\n  color: #fff;\n}\n.tree-node-hidden {\n  display: none;\n}\n.validatebox-invalid {\n  border-color: #ffa8a8;\n  background-color: #fff3f3;\n  color: #000;\n}\n.tooltip {\n  position: absolute;\n  display: none;\n  z-index: 9900000;\n  outline: none;\n  opacity: 1;\n  filter: alpha(opacity=100);\n  padding: 5px;\n  border-width: 1px;\n  border-style: solid;\n  border-radius: 5px;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.tooltip-content {\n  font-size: 12px;\n}\n.tooltip-arrow-outer,\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  line-height: 0;\n  font-size: 0;\n  border-style: solid;\n  border-width: 6px;\n  border-color: transparent;\n  _border-color: tomato;\n  _filter: chroma(color=tomato);\n}\n.tooltip-arrow {\n  display: none \\9;\n}\n.tooltip-right .tooltip-arrow-outer {\n  left: 0;\n  top: 50%;\n  margin: -6px 0 0 -13px;\n}\n.tooltip-right .tooltip-arrow {\n  left: 0;\n  top: 50%;\n  margin: -6px 0 0 -12px;\n}\n.tooltip-left .tooltip-arrow-outer {\n  right: 0;\n  top: 50%;\n  margin: -6px -13px 0 0;\n}\n.tooltip-left .tooltip-arrow {\n  right: 0;\n  top: 50%;\n  margin: -6px -12px 0 0;\n}\n.tooltip-top .tooltip-arrow-outer {\n  bottom: 0;\n  left: 50%;\n  margin: 0 0 -13px -6px;\n}\n.tooltip-top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin: 0 0 -12px -6px;\n}\n.tooltip-bottom .tooltip-arrow-outer {\n  top: 0;\n  left: 50%;\n  margin: -13px 0 0 -6px;\n}\n.tooltip-bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin: -12px 0 0 -6px;\n}\n.tooltip {\n  background-color: #666;\n  border-color: #000;\n  color: #fff;\n}\n.tooltip-right .tooltip-arrow-outer {\n  border-right-color: #000;\n}\n.tooltip-right .tooltip-arrow {\n  border-right-color: #666;\n}\n.tooltip-left .tooltip-arrow-outer {\n  border-left-color: #000;\n}\n.tooltip-left .tooltip-arrow {\n  border-left-color: #666;\n}\n.tooltip-top .tooltip-arrow-outer {\n  border-top-color: #000;\n}\n.tooltip-top .tooltip-arrow {\n  border-top-color: #666;\n}\n.tooltip-bottom .tooltip-arrow-outer {\n  border-bottom-color: #000;\n}\n.tooltip-bottom .tooltip-arrow {\n  border-bottom-color: #666;\n}\n.radiobutton {\n  position: relative;\n  border: 2px solid #AA0000;\n  border-radius: 50%;\n}\n.radiobutton-inner {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n  background: #AA0000;\n  border-radius: 50%;\n  transform: scale(.6);\n}\n.radiobutton-disabled {\n  opacity: 0.6;\n}\n.radiobutton-value {\n  position: absolute;\n  overflow: hidden;\n  width: 1px;\n  height: 1px;\n  left: -999px;\n}\n.checkbox {\n  position: relative;\n  border: 2px solid #AA0000;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.checkbox-checked {\n  border: 0;\n  background: #AA0000;\n}\n.checkbox-inner {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n}\n.checkbox path {\n  stroke-width: 2px;\n}\n.checkbox-disabled {\n  opacity: 0.6;\n}\n.checkbox-value {\n  position: absolute;\n  overflow: hidden;\n  width: 1px;\n  height: 1px;\n  left: -999px;\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template1/css/jquery-ui.css",
    "content": "/*! jQuery UI - v1.11.4 - 2015-11-06\n* http://jqueryui.com\n* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css\n* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgColorHover=ededed&bgTextureHover=flat&borderColorHover=cccccc&fcHover=2b2b2b&iconColorHover=555555&bgColorActive=007fff&bgTextureActive=flat&borderColorActive=003eff&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fffa90&bgTextureHighlight=flat&borderColorHighlight=dad55e&fcHighlight=777620&iconColorHighlight=777620&bgColorError=fddfdf&bgTextureError=flat&borderColorError=f1a899&fcError=5f3f3f&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px\n* Copyright jQuery Foundation and other contributors; Licensed MIT */\n\n/* Layout helpers\n----------------------------------*/\n.ui-helper-hidden {\n\tdisplay: none;\n}\n.ui-helper-hidden-accessible {\n\tborder: 0;\n\tclip: rect(0 0 0 0);\n\theight: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tpadding: 0;\n\tposition: absolute;\n\twidth: 1px;\n}\n.ui-helper-reset {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\toutline: 0;\n\tline-height: 1.3;\n\ttext-decoration: none;\n\tfont-size: 100%;\n\tlist-style: none;\n}\n.ui-helper-clearfix:before,\n.ui-helper-clearfix:after {\n\tcontent: \"\";\n\tdisplay: table;\n\tborder-collapse: collapse;\n}\n.ui-helper-clearfix:after {\n\tclear: both;\n}\n.ui-helper-clearfix {\n\tmin-height: 0; /* support: IE7 */\n}\n.ui-helper-zfix {\n\twidth: 100%;\n\theight: 100%;\n\ttop: 0;\n\tleft: 0;\n\tposition: absolute;\n\topacity: 0;\n\tfilter:Alpha(Opacity=0); /* support: IE8 */\n}\n\n.ui-front {\n\tz-index: 100;\n}\n\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-disabled {\n\tcursor: default !important;\n}\n\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon {\n\tdisplay: block;\n\ttext-indent: -99999px;\n\toverflow: hidden;\n\tbackground-repeat: no-repeat;\n}\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Overlays */\n.ui-widget-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n}\n.ui-draggable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-resizable {\n\tposition: relative;\n}\n.ui-resizable-handle {\n\tposition: absolute;\n\tfont-size: 0.1px;\n\tdisplay: block;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-resizable-disabled .ui-resizable-handle,\n.ui-resizable-autohide .ui-resizable-handle {\n\tdisplay: none;\n}\n.ui-resizable-n {\n\tcursor: n-resize;\n\theight: 7px;\n\twidth: 100%;\n\ttop: -5px;\n\tleft: 0;\n}\n.ui-resizable-s {\n\tcursor: s-resize;\n\theight: 7px;\n\twidth: 100%;\n\tbottom: -5px;\n\tleft: 0;\n}\n.ui-resizable-e {\n\tcursor: e-resize;\n\twidth: 7px;\n\tright: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n.ui-resizable-w {\n\tcursor: w-resize;\n\twidth: 7px;\n\tleft: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n.ui-resizable-se {\n\tcursor: se-resize;\n\twidth: 12px;\n\theight: 12px;\n\tright: 1px;\n\tbottom: 1px;\n}\n.ui-resizable-sw {\n\tcursor: sw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\tbottom: -5px;\n}\n.ui-resizable-nw {\n\tcursor: nw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\ttop: -5px;\n}\n.ui-resizable-ne {\n\tcursor: ne-resize;\n\twidth: 9px;\n\theight: 9px;\n\tright: -5px;\n\ttop: -5px;\n}\n.ui-selectable {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-selectable-helper {\n\tposition: absolute;\n\tz-index: 100;\n\tborder: 1px dotted black;\n}\n.ui-sortable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-accordion .ui-accordion-header {\n\tdisplay: block;\n\tcursor: pointer;\n\tposition: relative;\n\tmargin: 2px 0 0 0;\n\tpadding: .5em .5em .5em .7em;\n\tmin-height: 0; /* support: IE7 */\n\tfont-size: 100%;\n}\n.ui-accordion .ui-accordion-icons {\n\tpadding-left: 2.2em;\n}\n.ui-accordion .ui-accordion-icons .ui-accordion-icons {\n\tpadding-left: 2.2em;\n}\n.ui-accordion .ui-accordion-header .ui-accordion-header-icon {\n\tposition: absolute;\n\tleft: .5em;\n\ttop: 50%;\n\tmargin-top: -8px;\n}\n.ui-accordion .ui-accordion-content {\n\tpadding: 1em 2.2em;\n\tborder-top: 0;\n\toverflow: auto;\n}\n.ui-autocomplete {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tcursor: default;\n}\n.ui-button {\n\tdisplay: inline-block;\n\tposition: relative;\n\tpadding: 0;\n\tline-height: normal;\n\tmargin-right: .1em;\n\tcursor: pointer;\n\tvertical-align: middle;\n\ttext-align: center;\n\toverflow: visible; /* removes extra width in IE */\n}\n.ui-button,\n.ui-button:link,\n.ui-button:visited,\n.ui-button:hover,\n.ui-button:active {\n\ttext-decoration: none;\n}\n/* to make room for the icon, a width needs to be set here */\n.ui-button-icon-only {\n\twidth: 2.2em;\n}\n/* button elements seem to need a little more width */\nbutton.ui-button-icon-only {\n\twidth: 2.4em;\n}\n.ui-button-icons-only {\n\twidth: 3.4em;\n}\nbutton.ui-button-icons-only {\n\twidth: 3.7em;\n}\n\n/* button text element */\n.ui-button .ui-button-text {\n\tdisplay: block;\n\tline-height: normal;\n}\n.ui-button-text-only .ui-button-text {\n\tpadding: .4em 1em;\n}\n.ui-button-icon-only .ui-button-text,\n.ui-button-icons-only .ui-button-text {\n\tpadding: .4em;\n\ttext-indent: -9999999px;\n}\n.ui-button-text-icon-primary .ui-button-text,\n.ui-button-text-icons .ui-button-text {\n\tpadding: .4em 1em .4em 2.1em;\n}\n.ui-button-text-icon-secondary .ui-button-text,\n.ui-button-text-icons .ui-button-text {\n\tpadding: .4em 2.1em .4em 1em;\n}\n.ui-button-text-icons .ui-button-text {\n\tpadding-left: 2.1em;\n\tpadding-right: 2.1em;\n}\n/* no icon support for input elements, provide padding by default */\ninput.ui-button {\n\tpadding: .4em 1em;\n}\n\n/* button icon element(s) */\n.ui-button-icon-only .ui-icon,\n.ui-button-text-icon-primary .ui-icon,\n.ui-button-text-icon-secondary .ui-icon,\n.ui-button-text-icons .ui-icon,\n.ui-button-icons-only .ui-icon {\n\tposition: absolute;\n\ttop: 50%;\n\tmargin-top: -8px;\n}\n.ui-button-icon-only .ui-icon {\n\tleft: 50%;\n\tmargin-left: -8px;\n}\n.ui-button-text-icon-primary .ui-button-icon-primary,\n.ui-button-text-icons .ui-button-icon-primary,\n.ui-button-icons-only .ui-button-icon-primary {\n\tleft: .5em;\n}\n.ui-button-text-icon-secondary .ui-button-icon-secondary,\n.ui-button-text-icons .ui-button-icon-secondary,\n.ui-button-icons-only .ui-button-icon-secondary {\n\tright: .5em;\n}\n\n/* button sets */\n.ui-buttonset {\n\tmargin-right: 7px;\n}\n.ui-buttonset .ui-button {\n\tmargin-left: 0;\n\tmargin-right: -.3em;\n}\n\n/* workarounds */\n/* reset extra padding in Firefox, see h5bp.com/l */\ninput.ui-button::-moz-focus-inner,\nbutton.ui-button::-moz-focus-inner {\n\tborder: 0;\n\tpadding: 0;\n}\n.ui-datepicker {\n\twidth: 10em;\n\tpadding: .2em .2em 0;\t\n\tdisplay: none;\t\n}\n.ui-datepicker .ui-datepicker-header {\n\tposition: relative;\n\tpadding: .2em 0;\n}\n.ui-datepicker .ui-datepicker-prev,\n.ui-datepicker .ui-datepicker-next {\n\tposition: absolute;\n\ttop: 2px;\n\twidth: 1.8em;\n\theight: 1.8em;\n}\n.ui-datepicker .ui-datepicker-prev-hover,\n.ui-datepicker .ui-datepicker-next-hover {\n\ttop: 1px;\n}\n.ui-datepicker .ui-datepicker-prev {\n\tleft: 2px;\n}\n.ui-datepicker .ui-datepicker-next {\n\tright: 2px;\n}\n.ui-datepicker .ui-datepicker-prev-hover {\n\tleft: 1px;\n}\n.ui-datepicker .ui-datepicker-next-hover {\n\tright: 1px;\n}\n.ui-datepicker .ui-datepicker-prev span,\n.ui-datepicker .ui-datepicker-next span {\n\tdisplay: block;\n\tposition: absolute;\n\tleft: 50%;\n\tmargin-left: -8px;\n\ttop: 50%;\n\tmargin-top: -8px;\n}\n.ui-datepicker .ui-datepicker-title {\n\tmargin: 0 2.3em;\n\tline-height: 1.8em;\n\ttext-align: center;\n}\n.ui-datepicker .ui-datepicker-title select {\n\tfont-size: 1em;\n\tmargin: 1px 0;\n}\n.ui-datepicker select.ui-datepicker-month,\n.ui-datepicker select.ui-datepicker-year {\n\twidth: 45%;\n}\n.ui-datepicker table {\n\twidth: 100%;\n\tfont-size: .9em;\n\tborder-collapse: collapse;\n\tmargin: 0 0 .4em;\n}\n.ui-datepicker th {\n\tpadding: .7em .3em;\n\ttext-align: center;\n\tfont-weight: bold;\n\tborder: 0;\n}\n.ui-datepicker td {\n\tborder: 0;\n\tpadding: 1px;\n}\n.ui-datepicker td span,\n.ui-datepicker td a {\n\tdisplay: block;\n\tpadding: .2em;\n\ttext-align: right;\n\ttext-decoration: none;\n}\n.ui-datepicker .ui-datepicker-buttonpane {\n\tbackground-image: none;\n\tmargin: .7em 0 0 0;\n\tpadding: 0 .2em;\n\tborder-left: 0;\n\tborder-right: 0;\n\tborder-bottom: 0;\n}\n.ui-datepicker .ui-datepicker-buttonpane button {\n\tfloat: right;\n\tmargin: .5em .2em .4em;\n\tcursor: pointer;\n\tpadding: .2em .6em .3em .6em;\n\twidth: auto;\n\toverflow: visible;\n}\n.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {\n\tfloat: left;\n}\n\n/* with multiple calendars */\n.ui-datepicker.ui-datepicker-multi {\n\twidth: auto;\n}\n.ui-datepicker-multi .ui-datepicker-group {\n\tfloat: left;\n}\n.ui-datepicker-multi .ui-datepicker-group table {\n\twidth: 95%;\n\tmargin: 0 auto .4em;\n}\n.ui-datepicker-multi-2 .ui-datepicker-group {\n\twidth: 50%;\n}\n.ui-datepicker-multi-3 .ui-datepicker-group {\n\twidth: 33.3%;\n}\n.ui-datepicker-multi-4 .ui-datepicker-group {\n\twidth: 25%;\n}\n.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,\n.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {\n\tborder-left-width: 0;\n}\n.ui-datepicker-multi .ui-datepicker-buttonpane {\n\tclear: left;\n}\n.ui-datepicker-row-break {\n\tclear: both;\n\twidth: 100%;\n\tfont-size: 0;\n}\n\n/* RTL support */\n.ui-datepicker-rtl {\n\tdirection: rtl;\n}\n.ui-datepicker-rtl .ui-datepicker-prev {\n\tright: 2px;\n\tleft: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-next {\n\tleft: 2px;\n\tright: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-prev:hover {\n\tright: 1px;\n\tleft: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-next:hover {\n\tleft: 1px;\n\tright: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane {\n\tclear: right;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane button {\n\tfloat: left;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,\n.ui-datepicker-rtl .ui-datepicker-group {\n\tfloat: right;\n}\n.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,\n.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {\n\tborder-right-width: 0;\n\tborder-left-width: 1px;\n}\n.ui-dialog {\n\toverflow: hidden;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tpadding: .2em;\n\toutline: 0;\n}\n.ui-dialog .ui-dialog-titlebar {\n\tpadding: .4em 1em;\n\tposition: relative;\n}\n.ui-dialog .ui-dialog-title {\n\tfloat: left;\n\tmargin: .1em 0;\n\twhite-space: nowrap;\n\twidth: 90%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n.ui-dialog .ui-dialog-titlebar-close {\n\tposition: absolute;\n\tright: .3em;\n\ttop: 50%;\n\twidth: 20px;\n\tmargin: -10px 0 0 0;\n\tpadding: 1px;\n\theight: 20px;\n}\n.ui-dialog .ui-dialog-content {\n\tposition: relative;\n\tborder: 0;\n\tpadding: .5em 1em;\n\tbackground: none;\n\toverflow: auto;\n}\n.ui-dialog .ui-dialog-buttonpane {\n\ttext-align: left;\n\tborder-width: 1px 0 0 0;\n\tbackground-image: none;\n\tmargin-top: .5em;\n\tpadding: .3em 1em .5em .4em;\n}\n.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {\n\tfloat: right;\n}\n.ui-dialog .ui-dialog-buttonpane button {\n\tmargin: .5em .4em .5em 0;\n\tcursor: pointer;\n}\n.ui-dialog .ui-resizable-se {\n\twidth: 12px;\n\theight: 12px;\n\tright: -5px;\n\tbottom: -5px;\n\tbackground-position: 16px 16px;\n}\n.ui-draggable .ui-dialog-titlebar {\n\tcursor: move;\n}\n.ui-menu {\n\tlist-style: none;\n\tpadding: 0;\n\tmargin: 0;\n\tdisplay: block;\n\toutline: none;\n}\n.ui-menu .ui-menu {\n\tposition: absolute;\n}\n.ui-menu .ui-menu-item {\n\tposition: relative;\n\tmargin: 0;\n\tpadding: 3px 1em 3px .4em;\n\tcursor: pointer;\n\tmin-height: 0; /* support: IE7 */\n\t/* support: IE10, see #8844 */\n\tlist-style-image: url(\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\");\n}\n.ui-menu .ui-menu-divider {\n\tmargin: 5px 0;\n\theight: 0;\n\tfont-size: 0;\n\tline-height: 0;\n\tborder-width: 1px 0 0 0;\n}\n.ui-menu .ui-state-focus,\n.ui-menu .ui-state-active {\n\tmargin: -1px;\n}\n\n/* icon support */\n.ui-menu-icons {\n\tposition: relative;\n}\n.ui-menu-icons .ui-menu-item {\n\tpadding-left: 2em;\n}\n\n/* left-aligned */\n.ui-menu .ui-icon {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: .2em;\n\tmargin: auto 0;\n}\n\n/* right-aligned */\n.ui-menu .ui-menu-icon {\n\tleft: auto;\n\tright: 0;\n}\n.ui-progressbar {\n\theight: 2em;\n\ttext-align: left;\n\toverflow: hidden;\n}\n.ui-progressbar .ui-progressbar-value {\n\tmargin: -1px;\n\theight: 100%;\n}\n.ui-progressbar .ui-progressbar-overlay {\n\tbackground: url(\"data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==\");\n\theight: 100%;\n\tfilter: alpha(opacity=25); /* support: IE8 */\n\topacity: 0.25;\n}\n.ui-progressbar-indeterminate .ui-progressbar-value {\n\tbackground-image: none;\n}\n.ui-selectmenu-menu {\n\tpadding: 0;\n\tmargin: 0;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tdisplay: none;\n}\n.ui-selectmenu-menu .ui-menu {\n\toverflow: auto;\n\t/* Support: IE7 */\n\toverflow-x: hidden;\n\tpadding-bottom: 1px;\n}\n.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {\n\tfont-size: 1em;\n\tfont-weight: bold;\n\tline-height: 1.5;\n\tpadding: 2px 0.4em;\n\tmargin: 0.5em 0 0 0;\n\theight: auto;\n\tborder: 0;\n}\n.ui-selectmenu-open {\n\tdisplay: block;\n}\n.ui-selectmenu-button {\n\tdisplay: inline-block;\n\toverflow: hidden;\n\tposition: relative;\n\ttext-decoration: none;\n\tcursor: pointer;\n}\n.ui-selectmenu-button span.ui-icon {\n\tright: 0.5em;\n\tleft: auto;\n\tmargin-top: -8px;\n\tposition: absolute;\n\ttop: 50%;\n}\n.ui-selectmenu-button span.ui-selectmenu-text {\n\ttext-align: left;\n\tpadding: 0.4em 2.1em 0.4em 1em;\n\tdisplay: block;\n\tline-height: 1.4;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n.ui-slider {\n\tposition: relative;\n\ttext-align: left;\n}\n.ui-slider .ui-slider-handle {\n\tposition: absolute;\n\tz-index: 2;\n\twidth: 1.2em;\n\theight: 1.2em;\n\tcursor: default;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-slider .ui-slider-range {\n\tposition: absolute;\n\tz-index: 1;\n\tfont-size: .7em;\n\tdisplay: block;\n\tborder: 0;\n\tbackground-position: 0 0;\n}\n\n/* support: IE8 - See #6727 */\n.ui-slider.ui-state-disabled .ui-slider-handle,\n.ui-slider.ui-state-disabled .ui-slider-range {\n\tfilter: inherit;\n}\n\n.ui-slider-horizontal {\n\theight: .8em;\n}\n.ui-slider-horizontal .ui-slider-handle {\n\ttop: -.3em;\n\tmargin-left: -.6em;\n}\n.ui-slider-horizontal .ui-slider-range {\n\ttop: 0;\n\theight: 100%;\n}\n.ui-slider-horizontal .ui-slider-range-min {\n\tleft: 0;\n}\n.ui-slider-horizontal .ui-slider-range-max {\n\tright: 0;\n}\n\n.ui-slider-vertical {\n\twidth: .8em;\n\theight: 100px;\n}\n.ui-slider-vertical .ui-slider-handle {\n\tleft: -.3em;\n\tmargin-left: 0;\n\tmargin-bottom: -.6em;\n}\n.ui-slider-vertical .ui-slider-range {\n\tleft: 0;\n\twidth: 100%;\n}\n.ui-slider-vertical .ui-slider-range-min {\n\tbottom: 0;\n}\n.ui-slider-vertical .ui-slider-range-max {\n\ttop: 0;\n}\n.ui-spinner {\n\tposition: relative;\n\tdisplay: inline-block;\n\toverflow: hidden;\n\tpadding: 0;\n\tvertical-align: middle;\n}\n.ui-spinner-input {\n\tborder: none;\n\tbackground: none;\n\tcolor: inherit;\n\tpadding: 0;\n\tmargin: .2em 0;\n\tvertical-align: middle;\n\tmargin-left: .4em;\n\tmargin-right: 22px;\n}\n.ui-spinner-button {\n\twidth: 16px;\n\theight: 50%;\n\tfont-size: .5em;\n\tpadding: 0;\n\tmargin: 0;\n\ttext-align: center;\n\tposition: absolute;\n\tcursor: default;\n\tdisplay: block;\n\toverflow: hidden;\n\tright: 0;\n}\n/* more specificity required here to override default borders */\n.ui-spinner a.ui-spinner-button {\n\tborder-top: none;\n\tborder-bottom: none;\n\tborder-right: none;\n}\n/* vertically center icon */\n.ui-spinner .ui-icon {\n\tposition: absolute;\n\tmargin-top: -8px;\n\ttop: 50%;\n\tleft: 0;\n}\n.ui-spinner-up {\n\ttop: 0;\n}\n.ui-spinner-down {\n\tbottom: 0;\n}\n\n/* TR overrides */\n.ui-spinner .ui-icon-triangle-1-s {\n\t/* need to fix icons sprite */\n\tbackground-position: -65px -16px;\n}\n.ui-tabs {\n\tposition: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as \"fixed\") */\n\tpadding: .2em;\n}\n.ui-tabs .ui-tabs-nav {\n\tmargin: 0;\n\tpadding: .2em .2em 0;\n}\n.ui-tabs .ui-tabs-nav li {\n\tlist-style: none;\n\tfloat: left;\n\tposition: relative;\n\ttop: 0;\n\tmargin: 1px .2em 0 0;\n\tborder-bottom-width: 0;\n\tpadding: 0;\n\twhite-space: nowrap;\n}\n.ui-tabs .ui-tabs-nav .ui-tabs-anchor {\n\tfloat: left;\n\tpadding: .5em 1em;\n\ttext-decoration: none;\n}\n.ui-tabs .ui-tabs-nav li.ui-tabs-active {\n\tmargin-bottom: -1px;\n\tpadding-bottom: 1px;\n}\n.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,\n.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,\n.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {\n\tcursor: text;\n}\n.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {\n\tcursor: pointer;\n}\n.ui-tabs .ui-tabs-panel {\n\tdisplay: block;\n\tborder-width: 0;\n\tpadding: 1em 1.4em;\n\tbackground: none;\n}\n.ui-tooltip {\n\tpadding: 8px;\n\tposition: absolute;\n\tz-index: 9999;\n\tmax-width: 300px;\n\t-webkit-box-shadow: 0 0 5px #aaa;\n\tbox-shadow: 0 0 5px #aaa;\n}\nbody .ui-tooltip {\n\tborder-width: 2px;\n}\n\n/* Component containers\n----------------------------------*/\n.ui-widget {\n\tfont-family: Arial,Helvetica,sans-serif;\n\tfont-size: 1em;\n}\n.ui-widget .ui-widget {\n\tfont-size: 1em;\n}\n.ui-widget input,\n.ui-widget select,\n.ui-widget textarea,\n.ui-widget button {\n\tfont-family: Arial,Helvetica,sans-serif;\n\tfont-size: 1em;\n}\n.ui-widget-content {\n\tborder: 1px solid #dddddd;\n\tbackground: #ffffff;\n\tcolor: #333333;\n}\n.ui-widget-content a {\n\tcolor: #333333;\n}\n.ui-widget-header {\n\tborder: 1px solid #dddddd;\n\tbackground: #e9e9e9;\n\tcolor: #333333;\n\tfont-weight: bold;\n}\n.ui-widget-header a {\n\tcolor: #333333;\n}\n\n/* Interaction states\n----------------------------------*/\n.ui-state-default,\n.ui-widget-content .ui-state-default,\n.ui-widget-header .ui-state-default {\n\tborder: 1px solid #c5c5c5;\n\tbackground: #f6f6f6;\n\tfont-weight: normal;\n\tcolor: #454545;\n}\n.ui-state-default a,\n.ui-state-default a:link,\n.ui-state-default a:visited {\n\tcolor: #454545;\n\ttext-decoration: none;\n}\n.ui-state-hover,\n.ui-widget-content .ui-state-hover,\n.ui-widget-header .ui-state-hover,\n.ui-state-focus,\n.ui-widget-content .ui-state-focus,\n.ui-widget-header .ui-state-focus {\n\tborder: 1px solid #cccccc;\n\tbackground: #ededed;\n\tfont-weight: normal;\n\tcolor: #2b2b2b;\n}\n.ui-state-hover a,\n.ui-state-hover a:hover,\n.ui-state-hover a:link,\n.ui-state-hover a:visited,\n.ui-state-focus a,\n.ui-state-focus a:hover,\n.ui-state-focus a:link,\n.ui-state-focus a:visited {\n\tcolor: #2b2b2b;\n\ttext-decoration: none;\n}\n.ui-state-active,\n.ui-widget-content .ui-state-active,\n.ui-widget-header .ui-state-active {\n\tborder: 1px solid #003eff;\n\tbackground: #007fff;\n\tfont-weight: normal;\n\tcolor: #ffffff;\n}\n.ui-state-active a,\n.ui-state-active a:link,\n.ui-state-active a:visited {\n\tcolor: #ffffff;\n\ttext-decoration: none;\n}\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-highlight,\n.ui-widget-content .ui-state-highlight,\n.ui-widget-header .ui-state-highlight {\n\tborder: 1px solid #dad55e;\n\tbackground: #fffa90;\n\tcolor: #777620;\n}\n.ui-state-highlight a,\n.ui-widget-content .ui-state-highlight a,\n.ui-widget-header .ui-state-highlight a {\n\tcolor: #777620;\n}\n.ui-state-error,\n.ui-widget-content .ui-state-error,\n.ui-widget-header .ui-state-error {\n\tborder: 1px solid #f1a899;\n\tbackground: #fddfdf;\n\tcolor: #5f3f3f;\n}\n.ui-state-error a,\n.ui-widget-content .ui-state-error a,\n.ui-widget-header .ui-state-error a {\n\tcolor: #5f3f3f;\n}\n.ui-state-error-text,\n.ui-widget-content .ui-state-error-text,\n.ui-widget-header .ui-state-error-text {\n\tcolor: #5f3f3f;\n}\n.ui-priority-primary,\n.ui-widget-content .ui-priority-primary,\n.ui-widget-header .ui-priority-primary {\n\tfont-weight: bold;\n}\n.ui-priority-secondary,\n.ui-widget-content .ui-priority-secondary,\n.ui-widget-header .ui-priority-secondary {\n\topacity: .7;\n\tfilter:Alpha(Opacity=70); /* support: IE8 */\n\tfont-weight: normal;\n}\n.ui-state-disabled,\n.ui-widget-content .ui-state-disabled,\n.ui-widget-header .ui-state-disabled {\n\topacity: .35;\n\tfilter:Alpha(Opacity=35); /* support: IE8 */\n\tbackground-image: none;\n}\n.ui-state-disabled .ui-icon {\n\tfilter:Alpha(Opacity=35); /* support: IE8 - See #6059 */\n}\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon {\n\twidth: 16px;\n\theight: 16px;\n}\n.ui-icon,\n.ui-widget-content .ui-icon {\n\tbackground-image: url(\"../js/jquery-ui-1.11.4.custom/images/ui-icons_444444_256x240.png\");\n}\n.ui-widget-header .ui-icon {\n\tbackground-image: url(\"../js/jquery-ui-1.11.4.custom/images/ui-icons_444444_256x240.png\");\n}\n.ui-state-default .ui-icon {\n\tbackground-image: url(\"../js/jquery-ui-1.11.4.custom/images/ui-icons_777777_256x240.png\");\n}\n.ui-state-hover .ui-icon,\n.ui-state-focus .ui-icon {\n\tbackground-image: url(\"../js/jquery-ui-1.11.4.custom/images/ui-icons_555555_256x240.png\");\n}\n.ui-state-active .ui-icon {\n\tbackground-image: url(\"../js/jquery-ui-1.11.4.custom/images/ui-icons_ffffff_256x240.png\");\n}\n.ui-state-highlight .ui-icon {\n\tbackground-image: url(\"../js/jquery-ui-1.11.4.custom/images/ui-icons_777620_256x240.png\");\n}\n.ui-state-error .ui-icon,\n.ui-state-error-text .ui-icon {\n\tbackground-image: url(\"../js/jquery-ui-1.11.4.custom/images/ui-icons_cc0000_256x240.png\");\n}\n\n/* positioning */\n.ui-icon-blank { background-position: 16px 16px; }\n.ui-icon-carat-1-n { background-position: 0 0; }\n.ui-icon-carat-1-ne { background-position: -16px 0; }\n.ui-icon-carat-1-e { background-position: -32px 0; }\n.ui-icon-carat-1-se { background-position: -48px 0; }\n.ui-icon-carat-1-s { background-position: -64px 0; }\n.ui-icon-carat-1-sw { background-position: -80px 0; }\n.ui-icon-carat-1-w { background-position: -96px 0; }\n.ui-icon-carat-1-nw { background-position: -112px 0; }\n.ui-icon-carat-2-n-s { background-position: -128px 0; }\n.ui-icon-carat-2-e-w { background-position: -144px 0; }\n.ui-icon-triangle-1-n { background-position: 0 -16px; }\n.ui-icon-triangle-1-ne { background-position: -16px -16px; }\n.ui-icon-triangle-1-e { background-position: -32px -16px; }\n.ui-icon-triangle-1-se { background-position: -48px -16px; }\n.ui-icon-triangle-1-s { background-position: -64px -16px; }\n.ui-icon-triangle-1-sw { background-position: -80px -16px; }\n.ui-icon-triangle-1-w { background-position: -96px -16px; }\n.ui-icon-triangle-1-nw { background-position: -112px -16px; }\n.ui-icon-triangle-2-n-s { background-position: -128px -16px; }\n.ui-icon-triangle-2-e-w { background-position: -144px -16px; }\n.ui-icon-arrow-1-n { background-position: 0 -32px; }\n.ui-icon-arrow-1-ne { background-position: -16px -32px; }\n.ui-icon-arrow-1-e { background-position: -32px -32px; }\n.ui-icon-arrow-1-se { background-position: -48px -32px; }\n.ui-icon-arrow-1-s { background-position: -64px -32px; }\n.ui-icon-arrow-1-sw { background-position: -80px -32px; }\n.ui-icon-arrow-1-w { background-position: -96px -32px; }\n.ui-icon-arrow-1-nw { background-position: -112px -32px; }\n.ui-icon-arrow-2-n-s { background-position: -128px -32px; }\n.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }\n.ui-icon-arrow-2-e-w { background-position: -160px -32px; }\n.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }\n.ui-icon-arrowstop-1-n { background-position: -192px -32px; }\n.ui-icon-arrowstop-1-e { background-position: -208px -32px; }\n.ui-icon-arrowstop-1-s { background-position: -224px -32px; }\n.ui-icon-arrowstop-1-w { background-position: -240px -32px; }\n.ui-icon-arrowthick-1-n { background-position: 0 -48px; }\n.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }\n.ui-icon-arrowthick-1-e { background-position: -32px -48px; }\n.ui-icon-arrowthick-1-se { background-position: -48px -48px; }\n.ui-icon-arrowthick-1-s { background-position: -64px -48px; }\n.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }\n.ui-icon-arrowthick-1-w { background-position: -96px -48px; }\n.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }\n.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }\n.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }\n.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }\n.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }\n.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }\n.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }\n.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }\n.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }\n.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }\n.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }\n.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }\n.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }\n.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }\n.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }\n.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }\n.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }\n.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }\n.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }\n.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }\n.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }\n.ui-icon-arrow-4 { background-position: 0 -80px; }\n.ui-icon-arrow-4-diag { background-position: -16px -80px; }\n.ui-icon-extlink { background-position: -32px -80px; }\n.ui-icon-newwin { background-position: -48px -80px; }\n.ui-icon-refresh { background-position: -64px -80px; }\n.ui-icon-shuffle { background-position: -80px -80px; }\n.ui-icon-transfer-e-w { background-position: -96px -80px; }\n.ui-icon-transferthick-e-w { background-position: -112px -80px; }\n.ui-icon-folder-collapsed { background-position: 0 -96px; }\n.ui-icon-folder-open { background-position: -16px -96px; }\n.ui-icon-document { background-position: -32px -96px; }\n.ui-icon-document-b { background-position: -48px -96px; }\n.ui-icon-note { background-position: -64px -96px; }\n.ui-icon-mail-closed { background-position: -80px -96px; }\n.ui-icon-mail-open { background-position: -96px -96px; }\n.ui-icon-suitcase { background-position: -112px -96px; }\n.ui-icon-comment { background-position: -128px -96px; }\n.ui-icon-person { background-position: -144px -96px; }\n.ui-icon-print { background-position: -160px -96px; }\n.ui-icon-trash { background-position: -176px -96px; }\n.ui-icon-locked { background-position: -192px -96px; }\n.ui-icon-unlocked { background-position: -208px -96px; }\n.ui-icon-bookmark { background-position: -224px -96px; }\n.ui-icon-tag { background-position: -240px -96px; }\n.ui-icon-home { background-position: 0 -112px; }\n.ui-icon-flag { background-position: -16px -112px; }\n.ui-icon-calendar { background-position: -32px -112px; }\n.ui-icon-cart { background-position: -48px -112px; }\n.ui-icon-pencil { background-position: -64px -112px; }\n.ui-icon-clock { background-position: -80px -112px; }\n.ui-icon-disk { background-position: -96px -112px; }\n.ui-icon-calculator { background-position: -112px -112px; }\n.ui-icon-zoomin { background-position: -128px -112px; }\n.ui-icon-zoomout { background-position: -144px -112px; }\n.ui-icon-search { background-position: -160px -112px; }\n.ui-icon-wrench { background-position: -176px -112px; }\n.ui-icon-gear { background-position: -192px -112px; }\n.ui-icon-heart { background-position: -208px -112px; }\n.ui-icon-star { background-position: -224px -112px; }\n.ui-icon-link { background-position: -240px -112px; }\n.ui-icon-cancel { background-position: 0 -128px; }\n.ui-icon-plus { background-position: -16px -128px; }\n.ui-icon-plusthick { background-position: -32px -128px; }\n.ui-icon-minus { background-position: -48px -128px; }\n.ui-icon-minusthick { background-position: -64px -128px; }\n.ui-icon-close { background-position: -80px -128px; }\n.ui-icon-closethick { background-position: -96px -128px; }\n.ui-icon-key { background-position: -112px -128px; }\n.ui-icon-lightbulb { background-position: -128px -128px; }\n.ui-icon-scissors { background-position: -144px -128px; }\n.ui-icon-clipboard { background-position: -160px -128px; }\n.ui-icon-copy { background-position: -176px -128px; }\n.ui-icon-contact { background-position: -192px -128px; }\n.ui-icon-image { background-position: -208px -128px; }\n.ui-icon-video { background-position: -224px -128px; }\n.ui-icon-script { background-position: -240px -128px; }\n.ui-icon-alert { background-position: 0 -144px; }\n.ui-icon-info { background-position: -16px -144px; }\n.ui-icon-notice { background-position: -32px -144px; }\n.ui-icon-help { background-position: -48px -144px; }\n.ui-icon-check { background-position: -64px -144px; }\n.ui-icon-bullet { background-position: -80px -144px; }\n.ui-icon-radio-on { background-position: -96px -144px; }\n.ui-icon-radio-off { background-position: -112px -144px; }\n.ui-icon-pin-w { background-position: -128px -144px; }\n.ui-icon-pin-s { background-position: -144px -144px; }\n.ui-icon-play { background-position: 0 -160px; }\n.ui-icon-pause { background-position: -16px -160px; }\n.ui-icon-seek-next { background-position: -32px -160px; }\n.ui-icon-seek-prev { background-position: -48px -160px; }\n.ui-icon-seek-end { background-position: -64px -160px; }\n.ui-icon-seek-start { background-position: -80px -160px; }\n/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */\n.ui-icon-seek-first { background-position: -80px -160px; }\n.ui-icon-stop { background-position: -96px -160px; }\n.ui-icon-eject { background-position: -112px -160px; }\n.ui-icon-volume-off { background-position: -128px -160px; }\n.ui-icon-volume-on { background-position: -144px -160px; }\n.ui-icon-power { background-position: 0 -176px; }\n.ui-icon-signal-diag { background-position: -16px -176px; }\n.ui-icon-signal { background-position: -32px -176px; }\n.ui-icon-battery-0 { background-position: -48px -176px; }\n.ui-icon-battery-1 { background-position: -64px -176px; }\n.ui-icon-battery-2 { background-position: -80px -176px; }\n.ui-icon-battery-3 { background-position: -96px -176px; }\n.ui-icon-circle-plus { background-position: 0 -192px; }\n.ui-icon-circle-minus { background-position: -16px -192px; }\n.ui-icon-circle-close { background-position: -32px -192px; }\n.ui-icon-circle-triangle-e { background-position: -48px -192px; }\n.ui-icon-circle-triangle-s { background-position: -64px -192px; }\n.ui-icon-circle-triangle-w { background-position: -80px -192px; }\n.ui-icon-circle-triangle-n { background-position: -96px -192px; }\n.ui-icon-circle-arrow-e { background-position: -112px -192px; }\n.ui-icon-circle-arrow-s { background-position: -128px -192px; }\n.ui-icon-circle-arrow-w { background-position: -144px -192px; }\n.ui-icon-circle-arrow-n { background-position: -160px -192px; }\n.ui-icon-circle-zoomin { background-position: -176px -192px; }\n.ui-icon-circle-zoomout { background-position: -192px -192px; }\n.ui-icon-circle-check { background-position: -208px -192px; }\n.ui-icon-circlesmall-plus { background-position: 0 -208px; }\n.ui-icon-circlesmall-minus { background-position: -16px -208px; }\n.ui-icon-circlesmall-close { background-position: -32px -208px; }\n.ui-icon-squaresmall-plus { background-position: -48px -208px; }\n.ui-icon-squaresmall-minus { background-position: -64px -208px; }\n.ui-icon-squaresmall-close { background-position: -80px -208px; }\n.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }\n.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }\n.ui-icon-grip-solid-vertical { background-position: -32px -224px; }\n.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }\n.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }\n.ui-icon-grip-diagonal-se { background-position: -80px -224px; }\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Corner radius */\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-left,\n.ui-corner-tl {\n\tborder-top-left-radius: 3px;\n}\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-right,\n.ui-corner-tr {\n\tborder-top-right-radius: 3px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-left,\n.ui-corner-bl {\n\tborder-bottom-left-radius: 3px;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-right,\n.ui-corner-br {\n\tborder-bottom-right-radius: 3px;\n}\n\n/* Overlays */\n.ui-widget-overlay {\n\tbackground: #aaaaaa;\n\topacity: .3;\n\tfilter: Alpha(Opacity=30); /* support: IE8 */\n}\n.ui-widget-shadow {\n\tmargin: 0px 0 0 0px;\n\tpadding: 5px;\n\tbackground: #666666;\n\topacity: .3;\n\tfilter: Alpha(Opacity=30); /* support: IE8 */\n\tborder-radius: 8px;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template1/css/main_design1.css",
    "content": "body,html{width:100%;height:100%;margin:0px;padding:0px;font-size:12px;color:#555;background-color:#000;font-family:'微软雅黑'}\n#main{width:4352px;height:1536px;display:inline-block; background:url(../images/screenbg_design1.jpg) left top no-repeat}\n\n/*年月日文字*/\n#currentYear{width:213px;height:107px;position:absolute;left:430px;top:100px;color:#FFF;font-size:36px; font-family:'微软雅黑';text-align:center}\n#currentMonth{width:213px;height:107px;position:absolute;left:1504px;top:75px;color:#FFF;font-size:36px; font-family:'微软雅黑';text-align:center}\n#currentDay{width:213px;height:107px;position:absolute;left:2574px;top:100px;color:#FFF;font-size:36px; font-family:'微软雅黑';text-align:center}\n\n/*年的进度条*/\n#y_gauge1{width:250px;height:250px;position:absolute;left:60px;top:200px;}\n#y_gauge2{width:250px;height:250px;position:absolute;left:290px;top:200px;}\n#y_gauge3{width:250px;height:250px;position:absolute;left:530px;top:200px;}\n#y_gauge4{width:250px;height:250px;position:absolute;left:770px;top:200px;}\n\n/*月的进度条*/\n#m_gauge1{width:250px;height:250px;position:absolute;left:1140px;top:130px;}\n#m_gauge2{width:250px;height:250px;position:absolute;left:1370px;top:130px;}\n#m_gauge3{width:250px;height:250px;position:absolute;left:1610px;top:130px;}\n#m_gauge4{width:250px;height:250px;position:absolute;left:1850px;top:130px;}\n\n/*日的进度条*/\n#d_gauge1{width:250px;height:250px;position:absolute;left:2210px;top:200px;}\n#d_gauge2{width:250px;height:250px;position:absolute;left:2440px;top:200px;}\n#d_gauge3{width:250px;height:250px;position:absolute;left:2680px;top:200px;}\n#d_gauge4{width:250px;height:250px;position:absolute;left:2920px;top:200px;}\n\n/*监控的仪表盘*/\n#gauge1{width:250px;height:250px;position:absolute;left:2200px;top:1050px;}\n#gauge2{width:250px;height:250px;position:absolute;left:2550px;top:1050px;}\n#gauge3{width:250px;height:250px;position:absolute;left:2910px;top:1050px;}\n#gauge4{width:250px;height:250px;position:absolute;left:2380px;top:1190px;}\n#gauge5{width:250px;height:250px;position:absolute;left:2730px;top:1190px;}\n\n/*仪表盘文字*/\n.gaugeTitle{width:250px;height:40px;position:absolute;left:0px;top:200px;color:#B7E1FF;font-size:24px;display:inline-block;text-align:center;font-family:Arial;}\n\n/*地图*/\n#map{width:1100px;height:800px;position:absolute;left:0px;top:620px;display:inline-block;color:#E1E1E1;font-size:24px;}\n\n#plan{width:900px;height:420px;position:absolute;left:1170px;top:520px;display:inline-block;color:#E1E1E1;font-size:24px;}\n#quality{width:900px;height:420px;position:absolute;left:1170px;top:1030px;display:inline-block;color:#E1E1E1;font-size:24px;}\n\n#orderTable{width:1000px;height:430px;position:absolute;left:2160px;top:930px;display:inline-block}\n#orderTable table{width:100%;color:#666;font-size:24px}\n#orderTable table td{text-align:center;}\n#orderTable table .head{height:80px;font-size:24px;color:#FFF}\n#orderTable table .row2{color:#000}\n#orderTable table .row1{background-color:#CCC}\n\n#orderMessage{width:800px;position:absolute;left:33px;top:1420px;display:inline-block;color:#E1E1E1;font-size:24px}\n\n/*生产情况展示表*/\n#produce{width:1000px;height:380px;position:absolute;left:2190px;top:600px;display:inline-block;color:#B7E2FF;font-size:24px;}\n#produce table{width:100%;font-size:24px;}\n#produce table td{text-align:center;border:1px solid #069}\n#produce table .row1{}\n#produce table .row2{}\n\n/*视频*/\n#video{width:960px;height:540px;position:absolute;left:3280px;top:140px;display:inline-block;}\n\n/*监控视频*/\n#Monitor{width:960px;height:540px;position:absolute;left:3280px;top:940px;display:inline-block;color:#E1E1E1;font-size:24px;}\n\n/*刷新时间*/\n#refresh{width:800px;position:absolute;left:3350px;top:40px;display:inline-block;color:#FFF;font-size:24px;}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template1/css/room.css",
    "content": "body,html{width:100%;height:100%;margin:0px;padding:0px;font-size:12px;color:#555;background-color:#000;font-family:'微软雅黑'}\n#main{width:4352px;height:1536px;display:inline-block; background:url(../images/war_room_main.jpg) left top no-repeat}\n\n/*下钻按钮*/\n.contentButton{width:218px;height:100px;position:absolute;}\n.contentButton a{width:218px;height:100px;display:inline-block; background:url(../images/content_comm.png) no-repeat top left}\n.contentButton a:hover{width:218px;height:100px;display:inline-block; background:url(../images/content_down.png) no-repeat top left}\n.contentButton .a1{width:218px;height:100px;display:inline-block; background:url(../images/content_comm1.png) no-repeat top left}\n.contentButton .a1:hover{width:218px;height:100px;display:inline-block; background:url(../images/content_down1.png) no-repeat top left}\n\n/*弹出窗口*/\n#popWindow{width:2200px;height:1000px;display:inline-block;position:absolute;top:240px;left:1070px;background-color:#06274A;border:1px solid #09f}\n\n/*年的进度条*/\n#y_gauge1{width:250px;height:250px;position:absolute;left:60px;top:200px;}\n#y_gauge2{width:250px;height:250px;position:absolute;left:290px;top:200px;}\n#y_gauge3{width:250px;height:250px;position:absolute;left:530px;top:200px;}\n#y_gauge4{width:250px;height:250px;position:absolute;left:770px;top:200px;}\n\n/*螺旋DNA*/\n#orderStatus{width:1000px;height:320px;position:absolute;left:80px;top:460px;}\n\n/*监控的仪表盘*/\n#gauge1{width:250px;height:250px;position:absolute;left:2200px;top:280px;}\n#gauge2{width:250px;height:250px;position:absolute;left:2550px;top:280px;}\n#gauge3{width:250px;height:250px;position:absolute;left:2910px;top:280px;}\n#gauge4{width:250px;height:250px;position:absolute;left:2380px;top:550px;}\n#gauge5{width:250px;height:250px;position:absolute;left:2730px;top:550px;}\n\n/*仪表盘文字*/\n.gaugeTitle{width:250px;height:40px;position:absolute;left:0px;top:200px;color:#B7E1FF;font-size:24px;display:inline-block;text-align:center;font-family:Arial;}\n\n/*地图*/\n#map{width:1100px;height:800px;position:absolute;left:1080px;top:170px;display:inline-block;color:#E1E1E1;font-size:24px;}\n\n#productPie{width:1000px;height:680px;position:absolute;left:2210px;top:260px;display:inline-block;color:#E1E1E1;font-size:24px;}\n\n/*业务进展图*/\n#businessProgress{width:1000px;height:640px;position:absolute;left:3330px;top:180px;display:inline-block;color:#E1E1E1;font-size:24px;}\n\n/*计划完成情况*/\n#plan{width:1000px;height:400px;position:absolute;left:80px;top:1020px;display:inline-block;color:#E1E1E1;font-size:24px;}\n/*质量指标分析*/\n#quality{width:1000px;height:400px;position:absolute;left:1170px;top:1020px;display:inline-block;color:#E1E1E1;font-size:24px;}\n/*舆情文字云*/\n#wordCloud{width:900px;height:420px;position:absolute;left:3330px;top:1000px;display:inline-block;color:#E1E1E1;font-size:24px;}\n\n/*投诉情况展示表*/\n#produce{width:900px;height:380px;position:absolute;left:2250px;top:1050px;display:inline-block;color:#B7E2FF;font-size:24px;}\n#produce table{width:100%;font-size:24px;}\n#produce table td{text-align:center;border:1px solid #069}\n#produce table .row1{}\n#produce table .row2{}\n\n/*视频*/\n#video{width:960px;height:540px;position:absolute;left:3280px;top:140px;display:inline-block;}\n\n/*监控视频*/\n#Monitor{width:960px;height:540px;position:absolute;left:3280px;top:940px;display:inline-block;color:#E1E1E1;font-size:24px;}\n\n/*刷新时间*/\n#refresh{width:800px;position:absolute;left:3350px;top:40px;display:inline-block;color:#FFF;font-size:24px;}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template1/js/big_design1.js",
    "content": "//计划完成表的当前所选\nvar indexnum = 0;\nvar color=['#F35331','#2499F8','#3DF098','#33B734'];\nvar fontColor='#FFF';\n\n//定义进度条组件和属性\nvar y_gauge1 =null;\nvar y_gauge2 =null;\nvar y_gauge3 =null;\nvar y_gauge4 =null;\nvar m_gauge1 =null;\nvar m_gauge2 =null;\nvar m_gauge3 =null;\nvar m_gauge4 =null;\nvar d_gauge1 =null;\nvar d_gauge2 =null;\nvar d_gauge3 =null;\nvar d_gauge4 =null;\nvar option_Progress =null;\n\n//定义仪表盘组件和属性\nvar gauge1 =null;\nvar gauge2 =null;\nvar gauge3 =null;\nvar gauge4 =null;\nvar gauge5 =null;\nvar option_gauge =null;\n\n//生产质量堆积图组件和属性\nvar quality_chart = null;\nvar quality_option=null;\n\n//生产计划折线图组件和属性\nvar plan_chart = null;\nvar plan_option=null;\n\n//环形图的风格定义\nvar dataStyle = {\n\tnormal: {\n\t\tlabel: {show:false},\n\t\tlabelLine: {show:false}\n\t}\n};\nvar placeHolderStyle = {\n\tnormal : {\n\t\tcolor: 'rgba(0,0,0,0.1)',\n\t\tlabel: {show:false},\n\t\tlabelLine: {show:false}\n\t},\n\temphasis : {\n\t\tcolor: 'rgba(0,0,0,0)'\n\t}\n};\n\n//最大订单号\nvar lastOrderNumber=1;\n\n$(document).ready(function ()\n{\t\n\t//环形进度条设置对象\t\n\toption_Progress={\n\t\ttitle : {\n\t\t\ttext: '目前进度',\n\t\t\tsubtext: '50%',\n\t\t\tx: 'center',\n\t\t\ty: 90,\n\t\t\titemGap: 10,\n\t\t\ttextStyle : {\n\t\t\t\tcolor : '#B7E1FF',\n\t\t\t\tfontWeight: 'normal',\n\t\t\t\tfontFamily : '微软雅黑',\n\t\t\t\tfontSize : 24\n\t\t\t},\n\t\t\tsubtextStyle:{\n\t\t\t\tcolor: '#B7E1FF',\n\t\t\t\tfontWeight: 'bolder',\n\t\t\t\tfontSize:24,\n\t\t\t\tfontFamily : '微软雅黑'\n\t\t\t}\n\t\t},\n\t\tseries : [{\n\t\t\ttype : 'pie',\n\t\t\tcenter : ['50%', '50%'],\n\t\t\tradius : [75,90],\n\t\t\tx: '0%',\n\t\t\ttooltip:{show:false},\t\t\n\t\t\tdata : [{\n\t\t\t\tname:'达成率', \n\t\t\t\tvalue:79,\n\t\t\t\titemStyle:{color :'rgba(0,153,255,0.8)'},\n\t\t\t\thoverAnimation: false, \n\t\t\t\tlabel : {\n\t\t\t\t\tshow : false,\n\t\t\t\t\tposition : 'center',\n\t\t\t\t\ttextStyle: {\t\t\t\t\t\t\n\t\t\t\t\t\tfontFamily:'微软雅黑',\n\t\t\t\t\t\tfontWeight: 'bolder',\n\t\t\t\t\t\tcolor:'#B7E1FF',\n\t\t\t\t\t\tfontSize:24\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlabelLine : {\n\t\t\t\t\tshow : false\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tname:'79%',\n\t\t\t\tvalue:21,\n\t\t\t\titemStyle:{color: 'rgba(0,153,255,0.1)'},\n\t\t\t\thoverAnimation: false, \n\t\t\t\tlabel : {\n\t\t\t\t\tshow : false,\n\t\t\t\t\tposition : 'center',\n\t\t\t\t\tpadding:20,\t\t\n\t\t\t\t\ttextStyle: {\n\t\t\t\t\t\tfontFamily:'微软雅黑',\n\t\t\t\t\t\tfontSize: 24,\n\t\t\t\t\t\tcolor:'#B7E1FF'\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlabelLine : {\n\t\t\t\t\tshow : false\n\t\t\t\t}\n\t\t\t}]\n\t\t},\n\t\t{\n\t\t\ttype : 'pie',\n\t\t\tcenter : ['50%', '50%'],\n\t\t\tradius : [95,100],\n\t\t\tx: '0%',\n\t\t\thoverAnimation: false, \n\t\t\tdata : [{\n\t\t\t\tvalue:100,\n\t\t\t\titemStyle:{color :'rgba(0,153,255,0.3)'},\n\t\t\t\tlabel : {show : false},\n\t\t\t\tlabelLine : {show : false}\n\t\t\t}]\t\n\t\t},\n\t\t{\n\t\t\ttype : 'pie',\n\t\t\tcenter : ['50%', '50%'],\n\t\t\tradius : [69,70],\n\t\t\tx: '0%',\n\t\t\thoverAnimation: false, \n\t\t\tdata : [{\n\t\t\t\tvalue:100,\n\t\t\t\titemStyle:{color :'rgba(0,153,255,0.3)'},\n\t\t\t\tlabel : {show : false},\n\t\t\t\tlabelLine : {show : false}\n\t\t\t}]\t\n\t\t}]\n\t};\t\n\t\n\t//年仪表盘\n\ty_gauge1 = echarts.init(document.getElementById('y_gauge1'));\n\ty_gauge2 = echarts.init(document.getElementById('y_gauge2'));\n\ty_gauge3 = echarts.init(document.getElementById('y_gauge3'));\n\ty_gauge4 = echarts.init(document.getElementById('y_gauge4'));\t\n\t\n\t//月仪表盘\n\tm_gauge1 = echarts.init(document.getElementById('m_gauge1'));\n\tm_gauge2 = echarts.init(document.getElementById('m_gauge2'));\n\tm_gauge3 = echarts.init(document.getElementById('m_gauge3'));\n\tm_gauge4 = echarts.init(document.getElementById('m_gauge4'));\t\t\t\n\t\n\t//日仪表盘\n\td_gauge1 = echarts.init(document.getElementById('d_gauge1'));\n\td_gauge2 = echarts.init(document.getElementById('d_gauge2'));\n\td_gauge3 = echarts.init(document.getElementById('d_gauge3'));\n\td_gauge4 = echarts.init(document.getElementById('d_gauge4'));\t\t\t\n\t\t\n\t//监控仪表盘\n\toption_gauge = {\t\t\n\t\ttitle: {\n\t\t\ttext: '', //标题文本内容\n\t\t},\n\t\ttoolbox: { //可视化的工具箱\n\t\t\tshow: false,                \n\t\t},\n\t\ttooltip: { //弹窗组件\n\t\t\tformatter: \"{a} <br/>{b} : {c}%\"\n\t\t},\t\t\t\n\t\tseries: [{          \n\t\t\ttype: 'gauge',\n\t\t\taxisLine: {// 坐标轴线\n\t\t\t\tlineStyle: { // 属性lineStyle控制线条样式\n\t\t\t\t\tcolor: [\n\t\t\t\t\t\t[0.2, color[0]],\n\t\t\t\t\t\t[0.8, color[1]],\n\t\t\t\t\t\t[1, color[2]]\n\t\t\t\t\t],\n\t\t\t\t\twidth: 18\n\t\t\t\t }\n\t\t\t},\t\t\t\t \n\t\t\tsplitLine: { // 分隔线\n\t\t\t\t\tshow:true,\n\t\t\t\t\tlength: 18,\n\t\t\t\t\tlineStyle: {                            \n\t\t\t\t\t\tcolor: '#28292D',\n\t\t\t\t\t\twidth: 1\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\taxisTick : { //刻度线样式（及短线样式）\n\t\t\t\tshow:false,\n\t\t\t\tlineStyle: {                    \n\t\t\t\t\t\tcolor: 'auto',\n\t\t\t\t\t\twidth: 1\n\t\t\t\t\t},\n\t\t\t\tlength : 20\n\t\t\t},\n\t\t\taxisLabel : {\n\t\t\t\tcolor:'#FFF',\n\t\t\t\tfontSize:14,\n\t\t\t\tfontFamily:'Verdana, Geneva, sans-serif'\n\t\t\t},\n\t\t\ttitle: {\t\t\t\t\t\n\t\t\t\t\ttextStyle: { // 其余属性默认使用全局文本样式，详见TEXTSTYLE\n\t\t\t\t\t\tfontWeight: 'bolder',\n\t\t\t\t\t\tfontSize: 20,                          \n\t\t\t\t\t\tcolor: '#FFF'\n\t\t\t\t\t},\n\t\t\t\t\toffsetCenter: [0, '30%']\n\t\t\t\t},\n\t\t\tpointer: {\n\t\t\t\t\twidth: 5,                     \n\t\t\t\t\tcolor: '#F00',\n\t\t\t\t\tshadowColor: '#FF0',\n\t\t\t\t\tshadowBlur: 10\n\t\t\t\t},\n\t\t\tdetail: {\n\t\t\t\tshow:false,\n\t\t\t\tformatter:'{value}%',\n\t\t\t\ttextStyle: \n\t\t\t\t{\n\t\t\t\t\tfontFamily:'Arial',\n\t\t\t\t\tcolor: '#000',\n\t\t\t\t\tfontSize:'32px'\t\t\t\t\t\t\n\t\t\t\t},\n\t\t\t\toffsetCenter: [0, '90%']\n\t\t\t},\n\t\t\tdata: [{value: 45, name: '水'}]\n\t\t}]\n     };\n\t\t\n\tgauge1 = echarts.init(document.getElementById('gauge1'));\n\tgauge2 = echarts.init(document.getElementById('gauge2'));\n\tgauge3 = echarts.init(document.getElementById('gauge3'));\n\tgauge4 = echarts.init(document.getElementById('gauge4'));\t\n\tgauge5 = echarts.init(document.getElementById('gauge5'));\n\toption_gauge.series[0].axisLine.lineStyle.color=[[0.2, color[0]],[0.8, color[1]],[1, color[2]]];\n\toption_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"水\";\n\t$('#vg1').html(option_gauge.series[0].data[0].value);\n\tgauge1.setOption(option_gauge);\n\toption_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"电\";\n\t$('#vg2').html(option_gauge.series[0].data[0].value);\n\tgauge2.setOption(option_gauge);\n\toption_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"天然气\";\n\t$('#vg3').html(option_gauge.series[0].data[0].value);\n\tgauge3.setOption(option_gauge);\n\toption_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"压缩空气\";\n\t$('#vg4').html(option_gauge.series[0].data[0].value);\n\tgauge4.setOption(option_gauge);\n\toption_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"蒸汽\";\n\t$('#vg5').html(option_gauge.series[0].data[0].value);\n\tgauge5.setOption(option_gauge);\n\t\n\t//生产质量堆积图\n\tquality_chart = echarts.init(document.getElementById('quality'));\n\tquality_option={\n\t\ttitle: {\t\t\t\n\t\t\tshow:false,\n\t\t\ttext: 'AUDIT',\n\t\t\tleft: 'center',\n\t\t\ttextStyle: {\n\t\t\t\tcolor: '#F00',\n\t\t\t\tfontSize:32\n\t\t\t}\n\t\t},\n\t\txAxis: {\n\t\t\tdata: ['1月10日','2月10日','3月10日','4月10日','5月10日','6月10日'],\n\t\t\taxisLabel: {\n\t\t\t\ttextStyle: {\n\t\t\t\t\tcolor: '#B7E1FF',\n\t\t\t\t\tfontSize:24\n\t\t\t\t}\n\t\t\t},\n\t\t\taxisLine:{\n\t\t\t\tlineStyle:{\n\t\t\t\t\tcolor:'#09F'\t\n\t\t\t\t}\n\t\t\t},\n\t\t\taxisTick:{\n\t\t\t\tlineStyle:{\n\t\t\t\t\tcolor:'#09F'\t\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tyAxis: {\n\t\t\tinverse: false,\n\t\t\tsplitArea: {show: false},\n\t\t\taxisLine:  {show: false},\n\t\t\taxisTick:  {show: false},\n\t\t\taxisLabel: {\n\t\t\t\ttextStyle: {\n\t\t\t\t\tcolor: '#B7E1FF',\n\t\t\t\t\tfontSize:24,\n\t\t\t\t\tfontFamily:'Arial',\n\t\t\t\t}\n\t\t\t},\n\t\t\tsplitLine :{\n\t\t\t\tlineStyle:{\n\t\t\t\t\tcolor:'#09F'\t\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgrid: {\n\t\t\tleft: 100\n\t\t},\n\t\ttooltip: {\n\t\t\ttrigger: 'item',\n\t\t\ttextStyle: {\n\t\t\t\tcolor: '#B7E1FF',\n\t\t\t\tfontSize:24\n\t\t\t}\n\t\t},\n\t\tlegend:{\n\t\t\tshow:false,\n\t\t\ttop: 'bottom',\n\t\t\ttextStyle: {\n\t\t\t\tcolor: '#F00',\n\t\t\t\tfontSize:24,\n\t\t\t\tfontFamily:'微软雅黑'\n\t\t\t},\n\t\t\tdata:['AUDIT分数1','AUDIT分数']\n\t\t},\n\t\tseries: [\n\t\t\t{\n\t\t\t\tname: 'AUDIT分数1',\n\t\t\t\ttype: 'bar',\n\t\t\t\tstack: 'one',\n\t\t\t\titemStyle: \n\t\t\t\t{\n\t\t\t\t\tnormal: {color: color[1]}\n\t\t\t\t},\n\t\t\t\tbarWidth : 60,\n\t\t\t\tdata:[2200,2900,3680,2200,2900,3680]\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'AUDIT分数',\n\t\t\t\ttype: 'bar',\n\t\t\t\tstack: 'one',\n\t\t\t\titemStyle: {\n\t\t\t\t\tnormal: {\n\t\t\t\t\t\tcolor: '#F90',\n\t\t\t\t\t\tlabel: {\n\t\t\t\t\t\t\t show: true,\n\t\t\t\t\t\t\t position: 'insideTop',\n\t\t\t\t\t\t\t textStyle: {\n\t\t\t\t\t\t\t\t color: '#000',\n\t\t\t\t\t\t\t\t fontSize:24\n\t\t\t\t\t\t\t }\n\t\t\t\t\t\t }\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tbarWidth : 50,\n\t\t\t\tdata: [1800,1100,320,1800,1100,320]\n\t\t\t}\n\t\t]\n\t};\n\tquality_chart.setOption(quality_option);\n\t\n\t//生产计划折线图\n\tvar plan_data1=[];\n\tvar plan_data2=[];\n\tvar plan_xAxis=[];\n\tfor (var i = 1; i <= 7; i++) {\n\t\tplan_xAxis.push(\"3月\"+i+\"日\");\n\t\tplan_data1.push(Math.round(Math.random() * 100));\n\t\tplan_data2.push(Math.round(Math.random() * 100));\n\t}\n\tplan_chart = echarts.init(document.getElementById('plan'));\n\tplan_option={\t\t\n\t\txAxis: {\n\t\t\tdata:plan_xAxis,\n\t\t\taxisLabel: {\n\t\t\t\ttextStyle: {\n\t\t\t\t\tcolor: '#B7E1FF',\n\t\t\t\t\tfontSize:24\n\t\t\t\t}\n\t\t\t},\n\t\t\taxisLine:{\n\t\t\t\tlineStyle:{\n\t\t\t\t\tcolor:'#09F'\t\n\t\t\t\t}\n\t\t\t},\n\t\t\taxisTick:{\n\t\t\t\tlineStyle:{\n\t\t\t\t\tcolor:'#09F'\t\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tyAxis: {\t\t\t\n\t\t\tinverse: false,\n\t\t\tsplitArea: {show: false},\n\t\t\taxisLine:  {show: false},\n\t\t\taxisTick:  {show: false},\n\t\t\taxisLabel: {\n\t\t\t\ttextStyle: {\n\t\t\t\t\tcolor: '#B7E1FF',\n\t\t\t\t\tfontSize:24,\n\t\t\t\t\tfontFamily:'Arial',\n\t\t\t\t}\n\t\t\t},\n\t\t\tsplitLine :{\n\t\t\t\tlineStyle:{\n\t\t\t\t\tcolor:'#09F'\t\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttooltip: {\n\t\t\ttrigger: 'axis',\n\t\t\ttextStyle: {\n\t\t\t\tcolor: '#FFF',\n\t\t\t\tfontSize:24\n\t\t\t}\n\t\t},\n\t\tgrid: {\n\t\t\tleft: 100\n\t\t},\n\t\tlegend:{\n\t\t\tshow:false,\n\t\t\ttop: 'bottom',\n\t\t\ttextStyle: {\n\t\t\t\tcolor: '#F00',\n\t\t\t\tfontSize:24\n\t\t\t},\t\t\t\n\t\t\tdata:['计划完成数','实际完成数']\n\t\t},\n\t\tseries: [\n\t\t\t{\n\t\t\t\tname: '计划完成数',\n\t\t\t\ttype: 'bar',\n\t\t\t\titemStyle: \n\t\t\t\t{\n\t\t\t\t\tnormal: {color: color[1]},\n\t\t\t\t\temphasis: {color: color[2]}\n\t\t\t\t},\n\t\t\t\tbarWidth : 40,\n\t\t\t\tdata:plan_data1\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: '实际完成数',\n\t\t\t\ttype: 'line',\n\t\t\t\titemStyle: {\n\t\t\t\t\tnormal: {\n\t\t\t\t\t\tcolor: '#F90',\n\t\t\t\t\t\tlabel: {\n\t\t\t\t\t\t\t show: true,\n\t\t\t\t\t\t\t position: 'top',\n\t\t\t\t\t\t\t textStyle: {\n\t\t\t\t\t\t\t\t color: '#CCC',\n\t\t\t\t\t\t\t\t fontSize:24\n\t\t\t\t\t\t\t }\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlineStyle:{\n\t\t\t\t\t\t\tcolor:'#F90',\n\t\t\t\t\t\t\twidth:4\n\t\t\t\t\t\t}\t\t\t\t \n\t\t\t\t\t},\n\t\t\t\t\temphasis: {\n\t\t\t\t\t\tcolor: '#FF0'\n\t\t\t\t\t}\t\n\t\t\t\t},\t\t\t\n\t\t\t\tsymbolSize: 24,\n\t\t\t\tdata: plan_data2\n\t\t\t}\n\t\t]\n\t};\n\tplan_chart.setOption(plan_option);\n\t\n\t//轮番显示tips\n\tfunction clock(){\n\t  showToolTip_highlight(plan_chart);\t  \n\t}\n\tsetInterval(clock, 5000);\n\t\n\t//地图开始\n\tvar map_chart = echarts.init(document.getElementById('map'));\n\t\n\tvar CCData = [\n\t\t[{name:'长春'}, {name:'上海',value:95}],\n\t\t[{name:'长春'}, {name:'广州',value:90}],\n\t\t[{name:'长春'}, {name:'大连',value:80}],\n\t\t[{name:'长春'}, {name:'南宁',value:70}],\n\t\t[{name:'长春'}, {name:'南昌',value:60}],\n\t\t[{name:'长春'}, {name:'拉萨',value:50}],\n\t\t[{name:'长春'}, {name:'长春',value:40}],\n\t\t[{name:'长春'}, {name:'包头',value:30}],\n\t\t[{name:'长春'}, {name:'重庆',value:20}],\n\t\t[{name:'长春'}, {name:'北京',value:10}]\n\t];\n\t\n\tvar series = [];\n\t[['长春', CCData]].forEach(function (item, i) {\n\t\tseries.push({\n\t\t\tname: '一汽汽车销售',\n\t\t\ttype: 'lines',\n\t\t\tzlevel: 1,\n\t\t\teffect: {\n\t\t\t\tshow: true,\n\t\t\t\tperiod: 6,\n\t\t\t\ttrailLength: 0.7,\n\t\t\t\tcolor: '#FF0',\n\t\t\t\tsymbolSize: 3\n\t\t\t},\n\t\t\tlineStyle: {\n\t\t\t\tnormal: {\n\t\t\t\t\tcolor: '#000',\n\t\t\t\t\twidth: 0,\n\t\t\t\t\tcurveness: 0.2\n\t\t\t\t}\n\t\t\t},\n\t\t\tdata: convertData(item[1])\n\t\t},\n\t\t{\n\t\t\tname: '一汽汽车销售',\n\t\t\ttype: 'lines',\n\t\t\tzlevel: 2,\n\t\t\tsymbol: ['none', 'arrow'],\n\t\t\tsymbolSize: 10,\n\t\t\tlineStyle: {\n\t\t\t\tnormal: {\n\t\t\t\t\tcolor: '#FF0',\n\t\t\t\t\twidth: 1,\n\t\t\t\t\topacity: 0.6,\n\t\t\t\t\tcurveness: 0.2\n\t\t\t\t}\n\t\t\t},\n\t\t\tdata: convertData(item[1])\n\t\t},\n\t\t{\n\t\t\tname: '一汽汽车销售',\n\t\t\ttype: 'effectScatter',\n\t\t\tcoordinateSystem: 'geo',\n\t\t\tzlevel: 2,\n\t\t\trippleEffect: {\n\t\t\t\tbrushType: 'stroke'\n\t\t\t},\n\t\t\tlabel: {\n\t\t\t\tnormal: {\n\t\t\t\t\tshow: true,\n\t\t\t\t\tposition: 'right',\n\t\t\t\t\tformatter: '{b}'\n\t\t\t\t}\n\t\t\t},\n\t\t\tsymbolSize: function (val) {\n\t\t\t\treturn 15;\n\t\t\t},\n\t\t\titemStyle: {\n\t\t\t\tnormal: {\n\t\t\t\t\tcolor: '#FFF',\n\t\t\t\t\tlabel: {\n\t\t\t\t\t\t show: true,\n\t\t\t\t\t\t position: 'top',\n\t\t\t\t\t\t textStyle: {\n\t\t\t\t\t\t\t color: '#FFF',\n\t\t\t\t\t\t\t fontSize:24\n\t\t\t\t\t\t }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tdata: item[1].map(function (dataItem) {\n\t\t\t\treturn {\n\t\t\t\t\tname: dataItem[1].name,\n\t\t\t\t\tvalue: geoCoordMap[dataItem[1].name].concat([dataItem[1].value])\n\t\t\t\t};\n\t\t\t})\n\t\t});\n\t});\n\t\n\tmap_option = {\n\t\tbackgroundColor: '',\t\t\n\t\ttitle : {\n\t\t\tshow:false,\n\t\t\ttext: '一汽汽车销售地域分布示意图',\n\t\t\tsubtext: '截至2018年05月04日',\n\t\t\tleft: 'center',\n\t\t\ttop:10,\n\t\t\ttextStyle : {\n\t\t\t\tcolor: '#09F',\n\t\t\t\tfontSize:32\n\t\t\t},\n\t\t\tsubtextStyle:{\n\t\t\t\tcolor: '#09F',\n\t\t\t\tfontSize:24\n\t\t\t}\n\t\t},\n\t\ttooltip : {\n\t\t\ttrigger: 'item'\n\t\t},\n\t\tlegend: {\n\t\t\tshow:false,\n\t\t\torient: 'vertical',\n\t\t\ttop: 'bottom',\n\t\t\tleft: 'right',\n\t\t\tdata:['一汽汽车销售'],\n\t\t\ttextStyle: {\n\t\t\t\tcolor: '#000'\n\t\t\t},\n\t\t\tselectedMode: 'single'\n\t\t},\n\t\tgeo: {\n\t\t\tmap: 'china',\n\t\t\tlabel: {\n\t\t\t\temphasis: {\n\t\t\t\t\tshow: false\n\t\t\t\t}\n\t\t\t},\n\t\t\troam: true,\n\t\t\titemStyle: {\n\t\t\t\tnormal: {\n\t\t\t\t\tareaColor: '#09F',\n\t\t\t\t\tborderColor: '#09F',\n\t\t\t\t\topacity:0.5\n\t\t\t\t},\n\t\t\t\temphasis: {\n\t\t\t\t\tareaColor: '#09F',\n\t\t\t\t\tborderColor: '#09F',\n\t\t\t\t\topacity:0.8\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tseries: series\n\t};\n\t\n\tmap_chart.setOption(map_option, true);\n\t\n\tresresh();\n\t\n\t//开始定时刷新\n\tsetInterval(resresh, 5*1000);\n});\n\nvar convertData = function (data) {\n    var res = [];\n    for (var i = 0; i < data.length; i++) {\n        var dataItem = data[i];\n        var fromCoord = geoCoordMap[dataItem[0].name];\n        var toCoord = geoCoordMap[dataItem[1].name];\n        if (fromCoord && toCoord) {\n            res.push({\n                fromName: dataItem[0].name,\n                toName: dataItem[1].name,\n                coords: [fromCoord, toCoord]\n            });\n        }\n    }\n    return res;\n};\n\nfunction showToolTip_highlight(mychart)\n{  \n  var echartObj = mychart;\n  \t  \n  // 高亮当前图形\n  var highlight =setInterval(function() \n  {\n\t  echartObj.dispatchAction({\n\t\t  type: 'highlight',\n\t\t  seriesIndex: 0,\n\t\t  dataIndex: indexnum\n\t  });\n\t  \n\t  echartObj.dispatchAction({\n\t\t  type: 'showTip',\n\t\t  seriesIndex: 0,\n\t\t  dataIndex: indexnum\n\t  });\n\t  clearInterval(highlight);\n\t  indexnum = indexnum + 1;\n  \t  if(indexnum>=7) indexnum=0;\t  \t  \n  },1000);\n}\n\n//定时刷新数据\nfunction resresh()\n{\n\tvar myDate = new Date();\n\t\n\t// $('#refresh').html(\"<img src=\\\"images/wait.gif\\\" align=\\\"absmiddle\\\"><span>数据刷新中...</span>\");\n\t\n\t//年月日刷新\n\t$('#currentYear').html(myDate.getFullYear()+\"年\");\n\t$('#currentMonth').html(insertZero(myDate.getMonth()+1)+\"月\");\n\t$('#currentDay').html(insertZero(myDate.getDate())+\"日\");\n\t$('#currentDate').html(myDate.getFullYear()+\"/\"+insertZero(myDate.getMonth()+1)+\"/\"+insertZero(myDate.getDate()));\t\n\t\n\toption_gauge.series[0].axisLabel.show=true;\n\toption_gauge.series[0].axisLine.lineStyle.color=[[0.2, color[0]],[0.8, color[1]],[1, color[2]]]\n\t\n\tvar maxg=Math.round(Math.random()*500)+400;\n\tvar n1=Math.round(Math.random()*(maxg-100))+100;\n\tvar n2=Math.round(Math.random()*(n1-50))+50;\t\n\tvar n3=(n2/maxg*100).toFixed(2);\t\n\t\n\t//年进度条\n\toption_Progress.title.text =\"计划生产\";\n\toption_Progress.series[0].data[0].value = maxg;\n\toption_Progress.title.subtext =maxg+\"台\";\n\toption_Progress.series[0].data[1].value =0;\n\ty_gauge1.setOption(option_Progress);\n\t\n\toption_Progress.title.text =\"已接订单\";\n\toption_Progress.series[0].data[0].value = n1;\n\toption_Progress.title.subtext =n1+\"台\";\n\toption_Progress.series[0].data[1].value =(maxg-n1);\n\ty_gauge2.setOption(option_Progress);\n\t\n\toption_Progress.title.text =\"已经完成\";\n\toption_Progress.series[0].data[0].value = n2;\n\toption_Progress.title.subtext =n2+\"台\";\n\toption_Progress.series[0].data[1].value =(maxg-n2);\n\ty_gauge3.setOption(option_Progress);\n\t\n\toption_Progress.title.text =\"计划完成率\";\n\toption_Progress.series[0].data[0].value = n3;\n\toption_Progress.title.subtext =n3+\"%\";\n\toption_Progress.series[0].data[1].value =(100-n3);\n\ty_gauge4.setOption(option_Progress);\n\t\n\t//月进度条\n\tmaxg=Math.round(Math.random()*maxg)+1;\n\tn1=Math.round(Math.random()*maxg)+1;\n\tn2=Math.round(Math.random()*n1);\n\tn3=(n2/maxg*100).toFixed(2);\n\t\n\toption_Progress.title.text =\"计划生产\";\n\toption_Progress.series[0].data[0].value = maxg;\n\toption_Progress.title.subtext =maxg+\"台\";\n\toption_Progress.series[0].data[1].value =0;\n\tm_gauge1.setOption(option_Progress);\n\t\n\toption_Progress.title.text =\"已接订单\";\n\toption_Progress.series[0].data[0].value = n1;\n\toption_Progress.title.subtext =n1+\"台\";\n\toption_Progress.series[0].data[1].value =(maxg-n1);\n\tm_gauge2.setOption(option_Progress);\n\t\n\toption_Progress.title.text =\"已经完成\";\n\toption_Progress.series[0].data[0].value = n2;\n\toption_Progress.title.subtext =n2+\"台\";\n\toption_Progress.series[0].data[1].value =(maxg-n2);\n\tm_gauge3.setOption(option_Progress);\n\t\n\toption_Progress.title.text =\"计划完成率\";\n\toption_Progress.series[0].data[0].value = n3;\n\toption_Progress.title.subtext =n3+\"%\";\n\toption_Progress.series[0].data[1].value =(100-n3);\n\tm_gauge4.setOption(option_Progress);\n\t\n\t//日进度条\n\tmaxg=Math.round(Math.random()*maxg)+1;\n\tn1=Math.round(Math.random()*maxg)+1;\n\tn2=Math.round(Math.random()*n1);\n\tn3=(n2/maxg*100).toFixed(2);\n\t\n\toption_Progress.title.text =\"计划生产\";\n\toption_Progress.series[0].data[0].value = maxg;\n\toption_Progress.title.subtext =maxg+\"台\";\n\toption_Progress.series[0].data[1].value =0;\n\td_gauge1.setOption(option_Progress);\n\t\n\toption_Progress.title.text =\"已接订单\";\n\toption_Progress.series[0].data[0].value = n1;\n\toption_Progress.title.subtext =n1+\"台\";\n\toption_Progress.series[0].data[1].value =(maxg-n1);\n\td_gauge2.setOption(option_Progress);\n\t\n\toption_Progress.title.text =\"已经完成\";\n\toption_Progress.series[0].data[0].value = n2;\n\toption_Progress.title.subtext =n2+\"台\";\n\toption_Progress.series[0].data[1].value =(maxg-n2);\n\td_gauge3.setOption(option_Progress);\n\t\n\toption_Progress.title.text =\"计划完成率\";\n\toption_Progress.series[0].data[0].value = n3;\n\toption_Progress.title.subtext =n3+\"%\";\n\toption_Progress.series[0].data[1].value =(100-n3);\n\td_gauge4.setOption(option_Progress);\n\t\n\t//仪表盘刷新\n\toption_gauge.series[0].axisLine.lineStyle.color=[[0.2, color[0]],[0.8, color[1]],[1, color[0]]];\n\t\n\toption_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"水\";\n\t$('#vg1').html(option_gauge.series[0].data[0].value);\n\tgauge1.setOption(option_gauge);\n\toption_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"电\";\n\t$('#vg2').html(option_gauge.series[0].data[0].value);\n\tgauge2.setOption(option_gauge);\n\toption_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"天然气\";\n\t$('#vg3').html(option_gauge.series[0].data[0].value);\n\tgauge3.setOption(option_gauge);\n\toption_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"压缩空气\";\n\t$('#vg4').html(option_gauge.series[0].data[0].value);\n\tgauge4.setOption(option_gauge);\n\toption_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"蒸汽\";\n\t$('#vg5').html(option_gauge.series[0].data[0].value);\n\tgauge5.setOption(option_gauge);\t\n\t\t\t\n\t//显示最后更新时间\n\t$('#refresh').html(\"<span id=\\\"refreshTime\\\">最后刷新时间：\"+myDate.toLocaleDateString()+\" \"+myDate.toLocaleTimeString()+\"</span>\");\n}\n\n//生成订单号\nfunction getOrderNumber(n)\n{\n\tvar no=\"000000\"+n.toString();\n\treturn no.substring(no.length-6);\n}\n\n//前面补0\nfunction insertZero(n)\n{\n\tvar no=\"000000\"+n.toString();\n\treturn no.substring(no.length-2);\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template1/js/china.js",
    "content": "(function (root, factory) {\n    if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymous module.\n        define(['exports', 'echarts'], factory);\n    } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {\n        // CommonJS\n        factory(exports, require('echarts'));\n    } else {\n        // Browser globals\n        factory({}, root.echarts);\n    }\n}(this, function (exports, echarts) {\n    var log = function (msg) {\n        if (typeof console !== 'undefined') {\n            console && console.error && console.error(msg);\n        }\n    }\n    if (!echarts) {\n        log('ECharts is not Loaded');\n        return;\n    }\n    if (!echarts.registerMap) {\n        log('ECharts Map is not loaded')\n        return;\n    }\n    echarts.registerMap('china', {\"type\":\"FeatureCollection\",\"features\":[{\"id\":\"710000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@°Ü¯Û\"],[\"@@ƛĴÕƊÉɼģºðʀ\\\\ƎsÆNŌÔĚänÜƤɊĂǀĆĴĤǊŨxĚĮǂƺòƌâÔ®ĮXŦţƸZûÐƕƑGđ¨ĭMó·ęcëƝɉlÝƯֹÅŃ^Ó·śŃǋƏďíåɛGɉ¿@ăƑ¥ĘWǬÏĶŁâ\"],[\"@@\\\\p|WoYG¿¥Ij@¢\"],[\"@@¡@V^RqBbAnTXeRz¤L«³I\"],[\"@@ÆEEkWqë @\"],[\"@@fced\"]],\"encodeOffsets\":[[[122886,24033]],[[123335,22980]],[[122375,24193]],[[122518,24117]],[[124427,22618]],[[124862,26043]]]},\"properties\":{\"cp\":[121.509062,25.044332],\"name\":\"台湾\",\"childNum\":6}},{\"id\":\"130000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@o~Z]ªrºc_ħ²G¼s`jÎŸnüsÂłNX_M`Ç½ÓnUKĜēs¤­©yrý§uģcJe\"],[\"@@U`Ts¿mÂ\"],[\"@@oºƋÄdeVDJj£J|ÅdzÂFt~KŨ¸IÆv|¢r}èonb}`RÎÄn°ÒdÞ²^®lnÐèĄlðÓ×]ªÆ}LiĂ±Ö`^°Ç¶p®đDcŋ`ZÔ¶êqvFÆN®ĆTH®¦O¾IbÐã´BĐɢŴÆíȦpĐÞXR·nndO¤OÀĈƒ­QgµFo|gȒęSWb©osx|hYhgŃfmÖĩnºTÌSp¢dYĤ¶UĈjlǐpäìë|³kÛfw²Xjz~ÂqbTÑěŨ@|oMzv¢ZrÃVw¬ŧĖ¸f°ÐTªqs{S¯r æÝlNd®²Ğ ǆiGĘJ¼lr}~K¨ŸƐÌWöÆzR¤lêmĞLÎ@¡|q]SvKÑcwpÏÏĿćènĪWlĄkT}J¤~ÈTdpddʾĬBVtEÀ¢ôPĎƗè@~kü\\\\rÊĔÖæW_§¼F´©òDòjYÈrbĞāøŀG{ƀ|¦ðrb|ÀH`pʞkvGpuARhÞÆǶgĘTǼƹS£¨¡ù³ŘÍ]¿ÂyôEP xX¶¹ÜO¡gÚ¡IwÃé¦ÅBÏ|Ç°N«úmH¯âDùyŜŲIÄuĐ¨D¸dɂFOhđ©OiÃ`ww^ÌkÑH«ƇǤŗĺtFu{Z}Ö@U´ʚLg®¯Oı°Ãw ^VbÉsmAê]]w§RRl£ȭµu¯b{ÍDěïÿȧuT£ġěŗƃĝQ¨fVƋƅn­a@³@ďyÃ½IĹÊKŭfċŰóxV@tƯJ]eR¾fe|rHA|h~Ėƍl§ÏlTíb ØoÅbbx³^zÃĶ¶Sj®AyÂhðk`«PËµEFÛ¬Y¨Ļrõqi¼Wi°§Ð±´°^[À|ĠO@ÆxO\\\\ta\\\\tĕtû{ġȧXýĪÓjùÎRb^ÎfK[ÝděYfíÙTyuUSyŌŏů@Oi½éŅ­aVcř§ax¹XŻácWU£ôãºQ¨÷Ñws¥qEHÙ|šYQoŕÇyáĂ£MÃ°oťÊP¡mWO¡v{ôvîēÜISpÌhp¨ jdeŔQÖjX³àĈ[n`Yp@UcM`RKhEbpŞlNut®EtqnsÁgAiúoHqCXhfgu~ÏWP½¢G^}¯ÅīGCÑ^ãziMáļMTÃƘrMc|O_¯Ŏ´|morDkO\\\\mĆJfl@cĢ¬¢aĦtRıÒ¾ùƀ^juųœK­UFyƝīÛ÷ąV×qƥV¿aȉd³BqPBmaËđŻģmÅ®V¹d^KKonYg¯XhqaLdu¥Ípǅ¡KąÅkĝęěhq}HyÃ]¹ǧ£Í÷¿qáµ§g¤o^á¾ZE¤i`ĳ{nOl»WÝĔįhgF[¿¡ßkOüš_ūiǱàUtėGyl}ÓM}jpEC~¡FtoQiHkk{Ãmï\"]],\"encodeOffsets\":[[[119712,40641]],[[121616,39981]],[[116462,37237]]]},\"properties\":{\"cp\":[114.502461,38.045474],\"name\":\"河北\",\"childNum\":3}},{\"id\":\"140000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@ÞĩÒSra}ÁyWix±Üe´lèßÓǏokćiµVZģ¡coTSË¹ĪmnÕńehZg{gtwªpXaĚThȑp{¶Eh®RćƑP¿£Pmc¸mQÝWďȥoÅîɡųAďä³aÏJ½¥PG­ąSM­EÅruµéYÓŌ_dĒCo­Èµ]¯_²ÕjāK~©ÅØ^ÔkïçămÏk]­±cÝ¯ÑÃmQÍ~_apm~ç¡qu{JÅŧ·Ls}EyÁÆcI{¤IiCfUcƌÃp§]ě«vD@¡SÀµMÅwuYY¡DbÑc¡h×]nkoQdaMç~eDÛtT©±@¥ù@É¡ZcW|WqOJmĩl«ħşvOÓ«IqăV¥D[mI~Ó¢cehiÍ]Ɠ~ĥqX·eƷn±}v[ěďŕ]_œ`¹§ÕōIo©b­s^}Ét±ū«³p£ÿ·Wµ|¡¥ăFÏs×¥ŅxÊdÒ{ºvĴÎêÌɊ²¶ü¨|ÞƸµȲLLúÉƎ¤ϊęĔV`_bªS^|dzY|dz¥pZbÆ£¶ÒK}tĦÔņƠPYznÍvX¶Ěn ĠÔzý¦ª÷ÑĸÙUȌ¸dòÜJð´ìúNM¬XZ´¤ŊǸ_tldI{¦ƀðĠȤ¥NehXnYGR° ƬDj¬¸|CĞKqºfƐiĺ©ª~ĆOQª ¤@ìǦɌ²æBÊTŸʂōĖĴŞȀÆÿȄlŤĒötÎ½î¼ĨXh|ªM¤Ðz\"],\"encodeOffsets\":[[116874,41716]]},\"properties\":{\"cp\":[112.549248,37.857014],\"name\":\"山西\",\"childNum\":1}},{\"id\":\"150000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@Č^â£ĂhĖMÈÄw\\\\fŦ°W ¢¾luŸDw\\\\̀ʉÌÛMĀ[bÓEn}¶Vcês¯PqFB|S³C|kñHdiÄ¥sŉÅPóÑÑE^ÅPpy_YtShQ·aHwsOnŉÃs©iqjUSiº]ïW«gW¡ARëśĳĘů`çõh]y»ǃǛҤxÒm~zf}pf|ÜroÈzrKÈĵSƧż؜Ġu¦ö\"],[\"@@sKCGS|úþXgp{ÁX¿ć{ƱȏñZáĔyoÁhA}ŅĆfdŉ_¹Y°ėǩÑ¡H¯¶oMQqð¡Ë|Ñ`ƭŁX½·óÛxğįÅcQs«tȋǅFù^it«Č¯[hAi©á¥ÇĚ×l|¹y¯YȵƓñǙµïċĻ|Düȭ¶¡oŽäÕG\\\\ÄT¿Òõr¯LguÏYęRƩɷŌO\\\\İÐ¢æ^Ŋ ĲȶȆbÜGĝ¬¿ĚVĎgª^íu½jÿĕęjık@Ľ]ėl¥ËĭûÁėéV©±ćn©­ȇÍq¯½YÃÔŉÉNÑÅÝy¹NqáʅDǡËñ­ƁYÅy̱os§ȋµʽǘǏƬɱàưN¢ƔÊuľýľώȪƺɂļxZĈ}ÌŉŪĺœĭFЛĽ̅ȣͽÒŵìƩÇϋÿȮǡŏçƑůĕ~Ç¼ȳÐUfdIxÿ\\\\G zâɏÙOº·pqy£@qþ@Ǟ˽IBäƣzsÂZÁàĻdñ°ŕzéØűzșCìDȐĴĺf®Àľưø@ɜÖÞKĊŇƄ§͑těï͡VAġÑÑ»d³öǍÝXĉĕÖ{þĉu¸ËʅğU̎éhɹƆ̗̮ȘǊ֥ड़ࡰţાíϲäʮW¬®ҌeרūȠkɬɻ̼ãüfƠSצɩςåȈHϚÎKǳͲOðÏȆƘ¼CϚǚ࢚˼ФÔ¤ƌĞ̪Qʤ´¼mȠJˀƲÀɠmǐnǔĎȆÞǠN~ʢĜ¶ƌĆĘźʆȬ˪ĚĒ¸ĞGȖƴƀj`ĢçĶāàŃºēĢĖćYÀŎüôQÐÂŎŞǆŞêƖoˆDĤÕºÑǘÛˤ³̀gńƘĔÀ^ªƂ`ªt¾äƚêĦĀ¼ÐĔǎ¨Ȕ»͠^ˮÊȦƤøxRrŜH¤¸ÂxDÄ|ø˂˜ƮÐ¬ɚwɲFjĔ²Äw°ǆdÀÉ_ĸdîàŎjÊêTĞªŌŜWÈ|tqĢUB~´°ÎFCU¼pĀēƄN¦¾O¶łKĊOjĚj´ĜYp{¦SĚÍ\\\\T×ªV÷Ší¨ÅDK°ßtŇĔK¨ǵÂcḷ̌ĚǣȄĽFlġUĵŇȣFʉɁMğįʏƶɷØŭOǽ«ƽū¹Ʊő̝Ȩ§ȞʘĖiɜɶʦ}¨֪ࠜ̀ƇǬ¹ǨE˦ĥªÔêFxúQEr´Wrh¤Ɛ \\\\talĈDJÜ|[Pll̚¸ƎGú´P¬W¦^¦H]prRn|or¾wLVnÇIujkmon£cX^Bh`¥V¦U¤¸}xRj[^xN[~ªxQ[`ªHÆÂExx^wN¶Ê|¨ìMrdYpoRzNyÀDs~bcfÌ`L¾n|¾T°c¨È¢ar¤`[|òDŞĔöxElÖdHÀI`Ď\\\\Àì~ÆR¼tf¦^¢ķ¶eÐÚMptgjɡČÅyġLûŇV®ÄÈƀĎ°P|ªVVªj¬ĚÒêp¬E|ŬÂc|ÀtƐK f{ĘFĒƌXƲąo½Ę\\\\¥o}Ûu£ç­kX{uĩ«āíÓUŅßŢqŤ¥lyň[oi{¦LńðFȪȖĒL¿Ìf£K£ʺoqNwğc`uetOj×°KJ±qÆġmĚŗos¬qehqsuH{¸kH¡ÊRǪÇƌbȆ¢´äÜ¢NìÉʖ¦â©Ż؛Ç@Vu»Aylßí¹ĵêÝlISò³C¹Ìâ²i¶Ìoú^H²CǜңǄ z¼g^èöŰ_Ĳĕê}gÁnUI«m]jvV¼euhwqAaW_µj»çjioQR¹ēÃßt@r³[ÛlćË^ÍÉáGOUÛOB±XkÅ¹£k|e]olkVÍ¼ÕqtaÏõjgÁ£§U^RLËnX°ÇBz^~wfvypV ¯ƫĉ˭ȫƗŷɿÿĿƑ˃ĝÿÃǃßËőó©ǐȍŒĖM×ÍEyxþp]ÉvïèvƀnÂĴÖ@V~Ĉ³MEĸÅĖtējyÄDXÄxGQuv_i¦aBçw˛wD©{tāmQ{EJ§KPśƘƿ¥@sCTÉ}ɃwƇy±gÑ}T[÷kÐç¦«SÒ¥¸ëBX½HáÅµÀğtSÝÂa[ƣ°¯¦Pï¡]£ġÒk®G²èQ°óMq}EóƐÇ\\\\@áügQÍu¥FTÕ¿Jû]|mvāÎYua^WoÀa·­ząÒot×¶CLƗi¯¤mƎHǊ¤îìɾŊìTdåwsRÖgĒųúÍġäÕ}Q¶¿A[¡{d×uQAMxVvMOmăl«ct[wº_ÇÊjbÂ£ĦS_éQZ_lwgOiýe`YYLq§IÁǳ£ÙË[ÕªuƏ³ÍTs·bÁĽäė[b[ŗfãcn¥îC¿÷µ[ŏÀQ­ōĉm¿Á^£mJVmL[{Ï_£F¥Ö{ŹA}×Wu©ÅaųĳƳhB{·TQqÙIķËZđ©Yc|M¡LeVUóK_QWk_ĥ¿ãZ»X\\\\ĴuUèlG®ěłTĠğDŃOrÍdÆÍz]±ŭ©Å]ÅÐ}UË¥©TċïxgckfWgi\\\\ÏĒ¥HkµEë{»ÏetcG±ahUiñiWsɁ·cCÕk]wȑ|ća}wVaĚá G°ùnM¬¯{ÈÐÆA¥ÄêJxÙ¢hP¢ÛºµwWOóFÁz^ÀŗÎú´§¢T¤ǻƺSėǵhÝÅQgvBHouʝl_o¿Ga{ïq{¥|ſĿHĂ÷aĝÇqZñiñC³ª»E`¨åXēÕqÉû[l}ç@čƘóO¿¡FUsAʽīccocÇS}£IS~ălkĩXçmĈŀÐoÐdxÒuL^T{r@¢ÍĝKén£kQyÅõËXŷƏL§~}kq»IHėǅjĝ»ÑÞoå°qTt|r©ÏS¯·eŨĕx«È[eM¿yupN~¹ÏyN£{©għWí»Í¾səšǅ_ÃĀɗ±ąĳĉʍŌŷSÉA±åǥɋ@ë£R©ąP©}ĹªƏj¹erLDĝ·{i«ƫC£µ\"]],\"encodeOffsets\":[[[127444,52594]],[[113793,40312]]]},\"properties\":{\"cp\":[111.670801,40.818311],\"name\":\"内蒙古\",\"childNum\":2}},{\"id\":\"210000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@L@@sa\"],[\"@@MnNm\"],[\"@@dc\"],[\"@@eÀC@b\"],[\"@@fXwkbrÄ`qg\"],[\"@@^jtWQ\"],[\"@@~ Y]c\"],[\"@@G`ĔN^_¿ZÃM\"],[\"@@iX¶BY\"],[\"@@YZ\"],[\"@@L_{Epf\"],[\"@@^WqCT\\\\\"],[\"@@\\\\[§t|¤_\"],[\"@@m`n_\"],[\"@@Ïxǌ{q_×^Giip\"],[\"@@@é^BntaÊU]x ¯ÄPĲ­°hʙK³VÕ@Y~|EvĹsÇ¦­L^pÃ²ŸÒG Ël]xxÄ_fT¤Ď¤cPC¨¸TVjbgH²sdÎdHt`B²¬GJję¶[ÐhjeXdlwhðSČ¦ªVÊÏÆZÆŶ®²^ÎyÅÎcPqńĚDMħĜŁH­kçvV[ĳ¼WYÀäĦ`XlR`ôLUVfK¢{NZdĒªYĸÌÚJRr¸SA|ƴgŴĴÆbvªØX~źB|¦ÕE¤Ð`\\\\|KUnnI]¤ÀÂĊnŎR®Ő¿¶\\\\ÀøíDm¦ÎbŨabaĘ\\\\ľãÂ¸atÎSƐ´©v\\\\ÖÚÌǴ¤Â¨JKrZ_ZfjþhPkx`YRIjJcVf~sCN¤ EhæmsHy¨SðÑÌ\\\\\\\\ĐRZk°IS§fqŒßýáĞÙÉÖ[^¯ǤŲê´\\\\¦¬ĆPM¯£»uïpùzExanµyoluqe¦W^£ÊL}ñrkqWňûPUP¡ôJoo·U}£[·¨@XĸDXm­ÛÝºGUCÁª½{íĂ^cjk¶Ã[q¤LÉö³cux«zZf²BWÇ®Yß½ve±ÃCý£W{Ú^q^sÑ·¨ÍOt¹·C¥GDrí@wÕKţÃ«V·i}xËÍ÷i©ĝɝǡ]{c±OW³Ya±_ç©HĕoƫŇqr³Lys[ñ³¯OSďOMisZ±ÅFC¥Pq{Ã[Pg}\\\\¿ghćOk^ģÁFıĉĥM­oEqqZûěŉ³F¦oĵhÕP{¯~TÍlªNßYÐ{Ps{ÃVUeĎwk±ŉVÓ½ŽJãÇÇ»Jm°dhcÀffdF~ĀeĖd`sx² ®EżĀdQÂd^~ăÔH¦\\\\LKpĄVez¤NP ǹÓRÆąJSh­a[¦´ÂghwmBÐ¨źhI|VV|p] Â¼èNä¶ÜBÖ¼L`¼bØæKVpoúNZÞÒKxpw|ÊEMnzEQIZZNBčÚFÜçmĩWĪñtÞĵÇñZ«uD±|Əlĳ¥ãn·±PmÍada CLǑkùó¡³Ï«QaċÏOÃ¥ÕđQȥċƭy³ÃA\"]],\"encodeOffsets\":[[[123686,41445]],[[126019,40435]],[[124393,40128]],[[126117,39963]],[[125322,40140]],[[126686,40700]],[[126041,40374]],[[125584,40168]],[[125453,40165]],[[125362,40214]],[[125280,40291]],[[125774,39997]],[[125976,40496]],[[125822,39993]],[[125509,40217]],[[122731,40949]]]},\"properties\":{\"cp\":[123.429096,41.796767],\"name\":\"辽宁\",\"childNum\":16}},{\"id\":\"220000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@pä³PClFbbÍzwBGĭZÅi»lY­ċ²SgkÇ£^Sqd¯R©é£¯S\\\\cZ¹iűƏCuƍÓXoR}M^o£R}oªU­FuuXHlEÅÏ©¤ÛmTþ¤D²ÄufàÀ­XXÈ±AeyYw¬dvõ´KÊ£\\\\rµÄlidā]|î©¾DÂVH¹Þ®ÜWnCķ W§@\\\\¸~¤Vp¸póIO¢VOŇürXql~òÉK]¤¥Xrfkvzpm¶bwyFoúvð¼¤ N°ąO¥«³[éǡű_°Õ\\\\ÚÊĝþâőàerR¨­JYlďQ[ ÏYëÐ§TGztnß¡gFkMāGÁ¤ia ÉÈ¹`\\\\xs¬dĆkNnuNUuP@vRY¾\\\\¢GªóĄ~RãÖÎĢùđŴÕhQxtcæëSɽŉíëǉ£ƍG£nj°KƘµDsØÑpyĆ¸®¿bXp]vbÍZuĂ{n^IüÀSÖ¦EvRÎûh@â[ƏÈô~FNr¯ôçR±­HÑlĢ^¤¢OðævxsŒ]ÞÁTĠs¶¿âÆGW¾ìA¦·TÑ¬è¥ÏÐJ¨¼ÒÖ¼ƦɄxÊ~StD@Ă¼Ŵ¡jlºWvÐzƦZÐ²CH AxiukdGgetqmcÛ£Ozy¥cE}|¾cZk¿uŐã[oxGikfeäT@SUwpiÚFM©£è^Ú`@v¶eňf heP¶täOlÃUgÞzŸU`l}ÔÆUvØ_Ō¬Öi^ĉi§²ÃB~¡ĈÚEgc|DC_Ȧm²rBx¼MÔ¦ŮdĨÃâYxƘDVÇĺĿg¿cwÅ\\\\¹¥Yĭl¤OvLjM_a W`zļMž·\\\\swqÝSAqŚĳ¯°kRē°wx^ĐkǂÒ\\\\]nrĂ}²ĊŲÒøãh·M{yMzysěnĒġV·°G³¼XÀ¤¹i´o¤ŃÈ`ÌǲÄUĞd\\\\iÖmÈBĤÜɲDEh LG¾ƀÄ¾{WaYÍÈĢĘÔRîĐj}ÇccjoUb½{h§Ǿ{KƖµÎ÷GĀÖŠåưÎs­lyiē«`å§H¥Ae^§GK}iã\\\\c]v©ģZmÃ|[M}ģTɟĵÂÂ`ÀçmFK¥ÚíÁbX³ÌQÒHof{]ept·GŋĜYünĎųVY^ydõkÅZW«WUa~U·SbwGçǑiW^qFuNĝ·EwUtW·Ýďæ©PuqEzwAVXRãQ`­©GMehccďÏd©ÑW_ÏYƅ»é\\\\ɹ~ǙG³mØ©BšuT§Ĥ½¢Ã_Ã½L¡ýqT^rme\\\\PpZZbyuybQefµ]UhĿDCmûvaÙNSkCwncćfv~YÇG\"],\"encodeOffsets\":[[130196,42528]]},\"properties\":{\"cp\":[125.3245,43.886841],\"name\":\"吉林\",\"childNum\":1}},{\"id\":\"230000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@ƨĶTLÇyqpÇÛqe{~oyen}s`qiXGù]Ëp½©lÉÁp]Þñ´FĂ^fäîºkàz¼BUvÈ@\"],[\"@@UµNÿ¥īèçHÍøƕ¶Lǽ|g¨|a¾pVidd~ÈiíďÓQġėÇZÎXb½|ſÃH½KFgɱCģÛÇAnjÕc[VĝǱÃËÇ_ £ń³pj£º¿»WH´¯U¸đĢmtĜyzzNN|g¸÷äűÑ±ĉā~mq^[ǁÑďlw]¯xQĔ¯l°řĴrBÞTxr[tŽ¸ĻN_yX`biNKuP£kZĮ¦[ºxÆÀdhĹŀUÈƗCwáZħÄŭcÓ¥»NAw±qȥnD`{ChdÙFć}¢A±Äj¨]ĊÕjŋ«×`VuÓÅ~_kŷVÝyhVkÄãPsOµfgeŇµf@u_Ù ÙcªNªÙEojVxT@ãSefjlwH\\\\pŏäÀvlY½d{F~¦dyz¤PÜndsrhfHcvlwjF£G±DÏƥYyÏu¹XikĿ¦ÏqƗǀOŜ¨LI|FRĂn sª|C˜zxAè¥bfudTrFWÁ¹Am|ĔĕsķÆF´N}ćUÕ@Áĳſmuçuð^ÊýowFzØÎĕNőǏȎôªÌŒǄàĀÄ˄ĞŀƒʀĀƘŸˮȬƬĊ°Uzouxe]}AyÈW¯ÌmKQ]Īºif¸ÄX|sZt|½ÚUÎ lk^p{f¤lºlÆW A²PVÜPHÊâ]ÎĈÌÜk´\\\\@qàsĔÄQºpRij¼èi`¶bXrBgxfv»uUi^v~J¬mVp´£´VWrnP½ì¢BX¬hðX¹^TjVriªjtŊÄmtPGx¸bgRsT`ZozÆO]ÒFôÒOÆŊvÅpcGêsx´DR{AEOr°x|íb³Wm~DVjºéNNËÜ˛ɶ­GxŷCSt}]ûōSmtuÇÃĕNāg»íT«u}ç½BĵÞʣ¥ëÊ¡MÛ³ãȅ¡ƋaǩÈÉQG¢·lG|tvgrrf«ptęŘnÅĢrI²¯LiØsPf_vĠdxM prʹL¤¤eËÀđKïÙVY§]Ióáĥ]ķK¥j|pŇ\\\\kzţ¦šnņäÔVĂîĪ¬|vW®l¤èØrxm¶ă~lÄƯĄ̈́öȄEÔ¤ØQĄĄ»ƢjȦOǺ¨ìSŖÆƬyQv`cwZSÌ®ü±Ǆ]ŀç¬B¬©ńzƺŷɄeeOĨSfm ĊƀP̎ēz©ĊÄÕÊmgÇsJ¥ƔŊśæÎÑqv¿íUOµªÂnĦÁ_½ä@êí£P}Ġ[@gġ}gɊ×ûÏWXá¢užƻÌsNÍ½ƎÁ§čŐAēeL³àydl¦ĘVçŁpśǆĽĺſÊQíÜçÛġÔsĕ¬Ǹ¯YßċġHµ ¡eå`ļrĉŘóƢFìĎWøxÊkƈdƬv|I|·©NqńRŀ¤éeŊŀàŀU²ŕƀBQ£Ď}L¹Îk@©ĈuǰųǨÚ§ƈnTËÇéƟÊcfčŤ^XmHĊĕË«W·ċëx³ǔķÐċJāwİ_ĸȀ^ôWr­°oú¬ĦŨK~ȰCĐ´Ƕ£fNÎèâw¢XnŮeÂÆĶ¾¾xäLĴĘlļO¤ÒĨA¢Êɚ¨®ØCÔ ŬGƠƦYĜĘÜƬDJg_ͥœ@čŅĻA¶¯@wÎqC½Ĉ»NăëKďÍQÙƫ[«ÃígßÔÇOÝáWñuZ¯ĥŕā¡ÑķJu¤E å¯°WKÉ±_d_}}vyõu¬ï¹ÓU±½@gÏ¿rÃ½DgCdµ°MFYxw¿CG£Rƛ½Õ{]L§{qqą¿BÇƻğëܭǊË|c²}Fµ}ÙRsÓpg±QNqǫŋRwŕnéÑÉK«SeYRŋ@{¤SJ}D Ûǖ֍]gr¡µŷjqWÛham³~S«Þ]\"]],\"encodeOffsets\":[[[127123,51780]],[[134456,44547]]]},\"properties\":{\"cp\":[126.642464,45.756967],\"name\":\"黑龙江\",\"childNum\":2}},{\"id\":\"320000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@cþÅPi`ZRu¥É\\\\]~°Y`µÓ^phÁbnÀşúòaĬºTÖŒbe¦¦{¸ZâćNp©Hr|^mjhSEb\\\\afv`sz^lkljÄtg¤D­¾X¿À|ĐiZȀåB·î}GL¢õcßjayBFµÏC^ĭcÙt¿sğH]j{s©HM¢QnDÀ©DaÜÞ·jgàiDbPufjDk`dPOîhw¡ĥ¥GP²ĐobºrYî¶aHŢ´ ]´rılw³r_{£DB_Ûdåuk|Ũ¯F Cºyr{XFye³Þċ¿ÂkĭB¿MvÛpm`rÚã@Ę¹hågËÖƿxnlč¶Åì½Ot¾dJlVJĂǀŞqvnO^JZż·Q}êÍÅmµÒ]ƍ¦Dq}¬R^èĂ´ŀĻĊIÔtĲyQŐĠMNtR®òLhĚs©»}OÓGZz¶A\\\\jĨFäOĤHYJvÞHNiÜaĎÉnFQlNM¤B´ĄNöɂtpŬdfåqm¿QûùŞÚb¤uŃJŴu»¹ĄlȖħŴw̌ŵ²ǹǠ͛hĭłƕrçü±Yxcitğ®jű¢KOķCoy`å®VTa­_Ā]ŐÝɞï²ʯÊ^]afYǸÃĆēĪȣJđ͍ôƋÄÄÍīçÛɈǥ£­ÛmY`ó£Z«§°Ó³QafusNıǅ_k}¢m[ÝóDµ¡RLčiXyÅNïă¡¸iĔÏNÌŕoēdōîåŤûHcs}~Ûwbù¹£¦ÓCtOPrE^ÒogĉIµÛÅʹK¤½phMü`oæŀ\"],\"encodeOffsets\":[[121740,32276]]},\"properties\":{\"cp\":[118.767413,32.041544],\"name\":\"江苏\",\"childNum\":1}},{\"id\":\"330000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@E^dQ]K\"],[\"@@jX^j\"],[\"@@sfbU\"],[\"@@qP\\\\xz[ck\"],[\"@@R¢FX}°[s_\"],[\"@@Cb\\\\}\"],[\"@@e|v\\\\la{u\"],[\"@@v~u}\"],[\"@@QxÂF¯}\"],[\"@@¹nvÞs¯o\"],[\"@@rSkUEj\"],[\"@@bi­ZP\"],[\"@@p[}INf\"],[\"@@À¿\"],[\"@@¹dnb\"],[\"@@rSBnR\"],[\"@@g~h}\"],[\"@@FlEk\"],[\"@@OdPc\"],[\"@@v[u\\\\\"],[\"@@FjâL~wyoo~sµL\\\\\"],[\"@@¬e¹aN\"],[\"@@\\\\nÔ¡q]L³ë\\\\ÿ®QÖ\"],[\"@@ÊA­©[¬\"],[\"@@Kxv­\"],[\"@@@hlIk]\"],[\"@@pW{o||j\"],[\"@@Md|_mC\"],[\"@@¢X£ÏylD¼XtH\"],[\"@@hlÜ[LykAvyfw^E¤\"],[\"@@fp¤MusR\"],[\"@@®_ma~LÁ¬Z\"],[\"@@iMxZ\"],[\"@@ZcYd\"],[\"@@Z~dOSo|A¿qZv\"],[\"@@@`EN¡v\"],[\"@@|TY{\"],[\"@@@n@m\"],[\"@@XWkCT\\\\\"],[\"@@ºwZRkĕWO¢\"],[\"@@X®±GrÆª\\\\ÔáXq{\"],[\"@@ůTG°ĄLHm°UC\"],[\"@@¤aÜx~}dtüGæţŎíĔcŖpMËÐjē¢·ðĄÆMzjWKĎ¢Q¶À_ê_Bıi«pZgf¤Nrq]§ĂN®«H±yƳí¾×ŸīàLłčŴǝĂíÀBŖÕªÁŖHŗŉåqûõi¨hÜ·ñt»¹ýv_[«¸mYL¯QªmĉÅdMgÇjcº«ę¬­K­´B«Âącoċ\\\\xKd¡gěŧ«®á[~ıxu·ÅKsËÉc¢Ù\\\\ĭƛëbf¹­ģSĜkáƉÔ­ĈZB{aMµfzŉfåÂŧįƋǝÊĕġć£g³ne­ą»@­¦S®\\\\ßðChiqªĭiAuA­µ_W¥ƣO\\\\lċĢttC¨£t`PZäuXßBsĻyekOđġĵHuXBµ]×­­\\\\°®¬F¢¾pµ¼kŘó¬Wät¸|@L¨¸µrºù³Ù~§WIZW®±Ð¨ÒÉx`²pĜrOògtÁZ}þÙ]¡FKwsPlU[}¦Rvn`hq¬\\\\nQ´ĘRWb_ rtČFIÖkĦPJ¶ÖÀÖJĈĄTĚòC ²@PúØz©Pî¢£CÈÚĒ±hŖl¬â~nm¨f©iļ«mntuÖZÜÄjL®EÌFª²iÊxØ¨IÈhhst\"],[\"@@o\\\\VzRZ}y\"],[\"@@@°¡mÛGĕ¨§Ianá[ýƤjfæØLäGr\"]],\"encodeOffsets\":[[[125592,31553]],[[125785,31436]],[[125729,31431]],[[125513,31380]],[[125223,30438]],[[125115,30114]],[[124815,29155]],[[124419,28746]],[[124095,28635]],[[124005,28609]],[[125000,30713]],[[125111,30698]],[[125078,30682]],[[125150,30684]],[[124014,28103]],[[125008,31331]],[[125411,31468]],[[125329,31479]],[[125626,30916]],[[125417,30956]],[[125254,30976]],[[125199,30997]],[[125095,31058]],[[125083,30915]],[[124885,31015]],[[125218,30798]],[[124867,30838]],[[124755,30788]],[[124802,30809]],[[125267,30657]],[[125218,30578]],[[125200,30562]],[[124968,30474]],[[125167,30396]],[[124955,29879]],[[124714,29781]],[[124762,29462]],[[124325,28754]],[[123990,28459]],[[125366,31477]],[[125115,30363]],[[125369,31139]],[[122495,31878]],[[125329,30690]],[[125192,30787]]]},\"properties\":{\"cp\":[120.153576,30.287459],\"name\":\"浙江\",\"childNum\":45}},{\"id\":\"340000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@^iuLX^\"],[\"@@e©Ehl\"],[\"@@°ZÆëĎµmkǀwÌÕæhºgBĝâqÙĊzÖgņtÀÁĂÆáhEz|WzqD¹°Eŧl{ævÜcA`¤C`|´qxĲkq^³³GšµbíZ¹qpa±ď OH¦Ħx¢gPícOl_iCveaOjChß¸iÝbÛªCC¿mRV§¢A|t^iĠGÀtÚsd]ĮÐDE¶zAb àiödK¡~H¸íæAǿYj{ď¿À½W®£ChÃsikkly]_teu[bFaTign{]GqªoĈMYá|·¥f¥őaSÕėNµñĞ«Im_m¿Âa]uĜp Z_§{Cäg¤°r[_YjÆOdý[I[á·¥Q_nùgL¾mvˊBÜÆ¶ĊJhpc¹O]iŠ]¥ jtsggJÇ§w×jÉ©±EFË­KiÛÃÕYvsm¬njĻª§emná}k«ŕgđ²ÙDÇ¤í¡ªOy×Où±@DñSęćăÕIÕ¿IµĥOjNÕËT¡¿tNæŇàåyķrĕq§ÄĩsWÆßF¶X®¿mwRIÞfßoG³¾©uyHį{Ɓħ¯AFnuPÍÔzVdàôº^Ðæd´oG¤{S¬ćxã}ŧ×Kǥĩ«ÕOEÐ·ÖdÖsƘÑ¨[Û^Xr¢¼§xvÄÆµ`K§ tÒ´Cvlo¸fzŨð¾NY´ı~ÉĔēßúLÃÃ_ÈÏ|]ÂÏFlg`ben¾¢pUh~ƴĖ¶_r sĄ~cƈ]|r c~`¼{À{ȒiJjz`îÀT¥Û³]u}fïQl{skloNdjäËzDvčoQďHI¦rbtHĔ~BmlRV_ħTLnñH±DL¼Lªl§Ťa¸ĚlK²\\\\RòvDcÎJbt[¤D@®hh~kt°ǾzÖ@¾ªdbYhüóZ ň¶vHrľ\\\\ÊJuxAT|dmÀO[ÃÔG·ĚąĐlŪÚpSJ¨ĸLvÞcPæķŨ®mÐálwKhïgA¢ųÆ©Þ¤OÈm°K´\"]],\"encodeOffsets\":[[[121722,32278]],[[119475,30423]],[[119168,35472]]]},\"properties\":{\"cp\":[117.283042,31.86119],\"name\":\"安徽\",\"childNum\":3}},{\"id\":\"350000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@zht´]\"],[\"@@aj^~ĆG©O\"],[\"@@ed¨C}}i\"],[\"@@@vPGsQ\"],[\"@@sBzddW]Q\"],[\"@@S¨Q{\"],[\"@@NVucW\"],[\"@@qptBAq\"],[\"@@¸[mu\"],[\"@@Q\\\\pD]_\"],[\"@@jSwUadpF\"],[\"@@eXª~\"],[\"@@AjvFso\"],[\"@@fT_Çí\\\\v|ba¦jZÆy°\"],[\"@@IjJi\"],[\"@@wJIx«¼AoNe{M­\"],[\"@@K±¡ÓČäeZ\"],[\"@@k¡¹Eh~c®wBkUplÀ¡I~Māe£bN¨gZý¡a±Öcp©PhI¢QqÇGj|¥U g[Ky¬ŏv@OptÉEF\\\\@ åA¬V{XģĐBycpě¼³Ăp·¤¥ohqqÚ¡ŅLs^Ã¡§qlÀhH¨MCe»åÇGD¥zPO£čÙkJA¼ßėuĕeûÒiÁŧSW¥Qûŗ½ùěcÝ§SùĩąSWó«íęACµeRåǃRCÒÇZÍ¢ź±^dlstjD¸ZpuÔâÃH¾oLUêÃÔjjēò´ĄWƛ^Ñ¥Ħ@ÇòmOw¡õyJyD}¢ďÑÈġfZda©º²z£NjD°Ötj¶¬ZSÎ~¾c°¶ÐmxO¸¢Pl´SL|¥AȪĖMņĲg®áIJČĒü` QF¬h|ĂJ@zµ |ê³È ¸UÖŬŬÀEttĸr]ðM¤ĶĲHtÏ AĬkvsq^aÎbvdfÊòSD´Z^xPsĂrvƞŀjJd×ŘÉ ®AÎ¦ĤdxĆqAZRÀMźnĊ»İÐZ YXæJyĊ²·¶q§·K@·{sXãô«lŗ¶»o½E¡­«¢±¨Y®Ø¶^AvWĶGĒĢPlzfļtàAvWYãO_¤sD§ssČġ[kƤPX¦`¶®BBvĪjv©jx[L¥àï[F¼ÍË»ğV`«Ip}ccÅĥZEãoP´B@D¸m±z«Ƴ¿å³BRØ¶Wlâþäą`]Z£Tc ĹGµ¶Hm@_©k¾xĨôȉðX«½đCIbćqK³ÁÄš¬OAwã»aLŉËĥW[ÂGIÂNxĳ¤D¢îĎÎB§°_JGs¥E@¤ućPåcuMuw¢BI¿]zG¹guĮck\\\\_\"]],\"encodeOffsets\":[[[123250,27563]],[[122541,27268]],[[123020,27189]],[[122916,27125]],[[122887,26845]],[[122808,26762]],[[122568,25912]],[[122778,26197]],[[122515,26757]],[[122816,26587]],[[123388,27005]],[[122450,26243]],[[122578,25962]],[[121255,25103]],[[120987,24903]],[[122339,25802]],[[121042,25093]],[[122439,26024]]]},\"properties\":{\"cp\":[119.306239,26.075302],\"name\":\"福建\",\"childNum\":18}},{\"id\":\"360000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@ĢĨƐgļ¼ÂMD~ņªe^\\\\^§ý©j×cZØ¨zdÒa¶lÒJìõ`oz÷@¤uŞ¸´ôęöY¼HČƶajlÞƩ¥éZ[|h}^U  ¥pĄžƦO lt¸Æ Q\\\\aÆ|CnÂOjt­ĚĤdÈF`¶@Ðë ¦ōÒ¨SêvHĢûXD®QgÄWiØPÞìºr¤ǆNĠ¢lĄtZoCƞÔºCxrpĠV®Ê{f_Y`_eq®Aot`@oDXfkp¨|s¬\\\\DÄSfè©Hn¬^DhÆyøJhØxĢĀLÊƠPżċĄwȠĚ¦G®ǒĤäTŠÆ~Ħw«|TF¡nc³Ïå¹]ĉđxe{ÎÓvOEm°BƂĨİ|Gvz½ª´HàpeJÝQxnÀW­EµàXÅĪt¨ÃĖrÄwÀFÎ|ňÓMå¼ibµ¯»åDT±m[r«_gmQu~¥V\\\\OkxtL E¢Ú^~ýêPóqoě±_Êw§ÑªåƗā¼mĉŹ¿NQYBąrwģcÍ¥B­ŗÊcØiIƝĿuqtāwO]³YCñTeÉcaubÍ]trluīBÐGsĵıN£ï^ķqss¿FūūVÕ·´Ç{éĈýÿOER_đûIċâJh­ŅıNȩĕB¦K{Tk³¡OP·wnµÏd¯}½TÍ«YiµÕsC¯iM¤­¦¯P|ÿUHvhe¥oFTuõ\\\\OSsMòđƇiaºćXĊĵà·çhƃ÷Ç{ígu^đgm[×zkKN¶Õ»lčÓ{XSÆv©_ÈëJbVkĔVÀ¤P¾ºÈMÖxlò~ªÚàGĂ¢B±ÌKyáV¼Ã~­`gsÙfIƋlę¹e|~udjuTlXµf`¿Jd[\\\\L²\"],\"encodeOffsets\":[[116689,26234]]},\"properties\":{\"cp\":[115.892151,28.676493],\"name\":\"江西\",\"childNum\":1}},{\"id\":\"370000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@Xjd]{K\"],[\"@@itbFHy\"],[\"@@HlGk\"],[\"@@TGy\"],[\"@@K¬U\"],[\"@@WdXc\"],[\"@@PtOs\"],[\"@@LnXhc\"],[\"@@ppVu]Or\"],[\"@@cdzAUa\"],[\"@@udRhnCI\"],[\"@@oIpR\"],[\"@@Ľč{fzƤîKÎMĮ]ZF½Y]â£ph¶¨râøÀÎǨ¤^ºÄGz~grĚĜlĞÆLĆǆ¢Îo¦cvKbgr°WhmZp L]LºcUÆ­nżĤÌĒbAnrOA´ȊcÀbƦUØrĆUÜøĬƞEzVL®öØBkŖÝĐĖ¹ŧ̄±ÀbÎÉnb²ĦhņBĖįĦåXćì@L¯´ywƕCéÃµė ƿ¸lµ¾Z|ZWyFY¨Mf~C¿`à_RÇzwƌfQnny´INoƬèôº|sTJULîVjǎ¾ĒØDz²XPn±ŴPè¸ŔLƔÜƺ_TüÃĤBBċÈöA´faM¨{«M`¶d¡ôÖ°mȰBÔjj´PM|c^d¤u¤Û´ä«ƢfPk¶Môl]Lb}su^ke{lCMrDÇ­]NÑFsmoõľHyGă{{çrnÓEƕZGª¹Fj¢ïWuøCǷë¡ąuhÛ¡^KxC`C\\\\bÅxì²ĝÝ¿_NīCȽĿåB¥¢·IŖÕy\\\\¹kxÃ£Č×GDyÃ¤ÁçFQ¡KtŵƋ]CgÏAùSedcÚźuYfyMmhUWpSyGwMPqŀÁ¼zK¶G­Y§Ë@´śÇµƕBm@IogZ¯uTMx}CVKï{éƵP_K«pÛÙqċtkkù]gTğwoɁsMõ³ăAN£MRkmEÊčÛbMjÝGuIZGPģãħE[iµBEuDPÔ~ª¼ęt]ûG§¡QMsğNPŏįzs£Ug{đJĿļā³]ç«Qr~¥CƎÑ^n¶ÆéÎR~Ż¸YI] PumŝrƿIā[xeÇ³L¯v¯s¬ÁY~}ťuŁgƋpÝĄ_ņī¶ÏSR´ÁP~¿Cyċßdwk´SsX|t`Ä ÈðAªìÎT°¦Dda^lĎDĶÚY°`ĪŴǒàŠv\\\\ebZHŖR¬ŢƱùęOÑM­³FÛWp[\"]],\"encodeOffsets\":[[[123806,39303]],[[123821,39266]],[[123742,39256]],[[123702,39203]],[[123649,39066]],[[123847,38933]],[[123580,38839]],[[123894,37288]],[[123043,36624]],[[123344,38676]],[[123522,38857]],[[123628,38858]],[[118260,36742]]]},\"properties\":{\"cp\":[117.000923,36.675807],\"name\":\"山东\",\"childNum\":13}},{\"id\":\"410000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@ýLùµP³swIÓxcŢĞð´E®ÚPtĴXØxÂ¶@«ŕŕQGYfa[şußǩđš_X³ĳÕčC]kbc¥CS¯ëÍB©÷³­Si_}mYTt³xlàcČzÀD}ÂOQ³ÐTĨ¯ƗòËŖ[hłŦv~}ÂZ«¤lPÇ£ªÝŴÅR§ØnhctâknÏ­ľŹUÓÝdKuķI§oTũÙďkęĆH¸Ó\\\\Ä¿PcnS{wBIvÉĽ[GqµuŇôYgûZca©@½Õǽys¯}lgg@­C\\\\£asIdÍuCQñ[L±ęk·ţb¨©kK»KC²òGKmĨS`UQnk}AGēsqaJ¥ĐGRĎpCuÌy ã iMcplk|tRkðev~^´¦ÜSí¿_iyjI|ȑ|¿_»d}q^{Ƈdă}tqµ`Ƴĕg}V¡om½faÇo³TTj¥tĠRyK{ùÓjuµ{t}uËRivGçJFjµÍyqÎàQÂFewixGw½Yŷpµú³XU½ġyłåkÚwZX·l¢Á¢KzOÎÎjc¼htoDHr|­J½}JZ_¯iPq{tę½ĕ¦Zpĵø«kQĹ¤]MÛfaQpě±ǽ¾]u­Fu÷nčÄ¯ADp}AjmcEÇaª³o³ÆÍSƇĈÙDIzËčľ^KLiÞñ[aA²zzÌ÷D|[íÄ³gfÕÞd®|`Ć~oĠƑô³ŊD×°¯CsøÀ«ìUMhTº¨¸ǡîSÔDruÂÇZÖEvPZW~ØÐtĄE¢¦Ðy¸bô´oŬ¬²Ês~]®tªapŎJ¨Öº_Ŕ`Ŗ^Đ\\\\Ĝu~m²Ƹ¸fWĦrƔ}Î^gjdfÔ¡J}\\\\n C¦þWxªJRÔŠu¬ĨĨmFdM{\\\\d\\\\YÊ¢ú@@¦ª²SÜsC}fNècbpRmlØ^gd¢aÒ¢CZZxvÆ¶N¿¢T@uC¬^ĊðÄn|lGlRjsp¢ED}Fio~ÔN~zkĘHVsǲßjŬŢ`Pûàl¢\\\\ÀEhİgÞē X¼Pk|m\"],\"encodeOffsets\":[[118256,37017]]},\"properties\":{\"cp\":[113.665412,34.757975],\"name\":\"河南\",\"childNum\":1}},{\"id\":\"420000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@AB\"],[\"@@lskt\"],[\"@@¾«}{ra®pîÃ\\\\{øCËyyB±b\\\\òÝjKL ]ĎĽÌJyÚCƈćÎT´Å´pb©ÈdFin~BCo°BĎÃømv®E^vǾ½Ĝ²RobÜeN^ĺ£R¬lĶ÷YoĖ¥Ě¾|sOr°jY`~I¾®I{GqpCgyl{£ÍÍyPLÂ¡¡¸kWxYlÙæŁĢz¾V´W¶ùŸo¾ZHxjwfxGNÁ³Xéæl¶EièIH ujÌQ~v|sv¶Ôi|ú¢FhQsğ¦SiŠBgÐE^ÁÐ{čnOÂÈUÎóĔÊēĲ}Z³½Mŧïeyp·uk³DsÑ¨L¶_ÅuÃ¨w»¡WqÜ]\\\\Ò§tƗcÕ¸ÕFÏǝĉăxŻČƟOKÉġÿ×wg÷IÅzCg]m«ªGeçÃTC«[t§{loWeC@ps_Bp­rf_``Z|ei¡oċMqow¹DƝÓDYpûsYkıǃ}s¥ç³[§cY§HK«Qy]¢wwö¸ïx¼ņ¾Xv®ÇÀµRĠÐHM±cÏdƒǍũȅȷ±DSyúĝ£ŤĀàtÖÿï[îb\\\\}pĭÉI±Ñy¿³x¯No|¹HÏÛmjúË~TuęjCöAwě¬Rđl¯ Ñb­ŇTĿ_[IčĄʿnM¦ğ\\\\É[T·k¹©oĕ@A¾wya¥Y\\\\¥Âaz¯ãÁ¡k¥ne£ÛwE©Êō¶˓uoj_U¡cF¹­[WvP©whuÕyBF`RqJUw\\\\i¡{jEPïÿ½fćQÑÀQ{°fLÔ~wXgītêÝ¾ĺHd³fJd]HJ²EoU¥HhwQsƐ»Xmg±çve]DmÍPoCc¾_hhøYrŊU¶eD°Č_N~øĹĚ·`z]Äþp¼äÌQv\\\\rCé¾TnkžŐÚÜa¼ÝƆĢ¶ÛodĔňÐ¢JqPb ¾|J¾fXƐîĨ_Z¯À}úƲN_ĒÄ^ĈaŐyp»CÇÄKñL³ġM²wrIÒŭxjb[n«øæà ^²­h¯ÚŐªÞ¸Y²ĒVø}Ā^İ´LÚm¥ÀJÞ{JVųÞŃx×sxxƈē ģMřÚðòIfĊŒ\\\\Ʈ±ŒdÊ§ĘDvČ_Àæ~Dċ´A®µ¨ØLV¦êHÒ¤\"]],\"encodeOffsets\":[[[113712,34000]],[[115612,30507]],[[113649,34054]]]},\"properties\":{\"cp\":[114.298572,30.584355],\"name\":\"湖北\",\"childNum\":3}},{\"id\":\"430000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@nFTs\"],[\"@@ßÅÆá½ÔXrCOËRïÿĩ­TooQyÓ[ŅBE¬ÎÓXaį§Ã¸G °ITxpúxÚĳ¥ÏĢ¾edÄ©ĸGàGhM¤Â_U}Ċ}¢pczfþg¤ÇòAVM\"],[\"@@©KA·³CQ±Á«³BUƑ¹AtćOwD]JiØSm¯b£ylXHËÑ±H«C^õľAÅ§¤É¥ïyuǙuA¢^{ÌC´­¦ŷJ£^[ª¿ĕ~ƇN skóā¹¿ï]ă~÷O§­@Vm¡Qđ¦¢Ĥ{ºjÔª¥nf´~Õo×ÛąMąıuZmZcÒ ĲĪ²SÊǄŶ¨ƚCÖŎªQØ¼rŭ­«}NÏürÊ¬mjr@ĘrTW ­SsdHzƓ^ÇÂyUi¯DÅYlŹu{hT}mĉ¹¥ěDÿë©ıÓ[Oº£¥ótł¹MÕƪ`PDiÛU¾ÅâìUñBÈ£ýhedy¡oċ`pfmjP~kZaZsÐd°wj§@Ĵ®w~^kÀÅKvNmX\\\\¨aŃqvíó¿F¤¡@ũÑVw}S@j}¾«pĂrªg àÀ²NJ¶¶DôK|^ª°LX¾ŴäPĪ±£EXd^¶ĲÞÜ~u¸ǔMRhsRe`ÄofIÔ\\\\Ø  ićymnú¨cj ¢»GČìƊÿÐ¨XeĈĀ¾Oð Fi ¢|[jVxrIQ_EzAN¦zLU`cªxOTu RLÄ¢dVi`p˔vŎµªÉF~Ød¢ºgİàw¸Áb[¦Zb¦z½xBĖ@ªpºlS¸Ö\\\\Ĕ[N¥ˀmĎăJ\\\\ŀ`ňSÚĖÁĐiOĜ«BxDõĚivSÌ}iùÜnÐºG{p°M´wÀÒzJ²ò¨ oTçüöoÛÿñőĞ¤ùTz²CȆȸǎŪƑÐc°dPÎğË¶[È½u¯½WM¡­ÉB·rínZÒ `¨GA¾\\\\pēXhÃRC­üWGġuTé§ŎÑ©ò³I±³}_EÃħg®ęisÁPDmÅ{b[RÅs·kPŽƥóRoOV~]{g\\\\êYƪ¦kÝbiċƵGZ»Ěõó·³vŝ£ø@pyö_ëIkÑµbcÑ§y×dYØªiþ¨[]f]Ņ©C}ÁN»hĻħƏĩ\"]],\"encodeOffsets\":[[[115640,30489]],[[112543,27312]],[[116690,26230]]]},\"properties\":{\"cp\":[112.982279,28.19409],\"name\":\"湖南\",\"childNum\":3}},{\"id\":\"440000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@QdAua\"],[\"@@lxDLo\"],[\"@@sbhNLo\"],[\"@@Ă ā\"],[\"@@WltO[[\"],[\"@@Kr]S\"],[\"@@eI]y\"],[\"@@I|Mym\"],[\"@@Û³LS¼Y\"],[\"@@nvºBëui©`¾\"],[\"@@zdÛJw®\"],[\"@@°¯\"],[\"@@a yAª¸ËJIxØ@ĀHAmÃV¡ofuo\"],[\"@@sŗÃÔėAƁZÄ ~°ČPäh\"],[\"@@¶ÝÌvmĞh­ıQ\"],[\"@@HdSjĒ¢D}waru«ZqadYM\"],[\"@@el\\\\LqqU\"],[\"@@~rMo\\\\\"],[\"@@f^C\"],[\"@@øPªoj÷ÍÝħXČx°Q¨ıXNv\"],[\"@@gÇƳo[~tly\"],[\"@@EÆC¿\"],[\"@@OP\"],[\"@@wđógĝ[³¡VÙæÅöMÌ³¹pÁaËýý©D©ÜJŹƕģGą¤{ÙūÇO²«BƱéAÒĥ¡«BhlmtÃPµyU¯ucd·w_bŝcīímGO|KPȏŹãŝIŕŭŕ@Óoo¿ē±ß}ŭĲWÈCőâUâǙIğŉ©IĳE×Á³AówXJþ±ÌÜÓĨ£L]ĈÙƺZǾĆĖMĸĤfÎĵlŨnÈĐtFFĤêk¶^k°f¶g}®Faf`vXŲxl¦ÔÁ²¬Ð¦pqÊÌ²iXØRDÎ}Ä@ZĠsx®AR~®ETtĄZƈfŠŠHâÒÐAµ\\\\S¸^wĖkRzalŜ|E¨ÈNĀňZTpBh£\\\\ĎƀuXĖtKL¶G|»ĺEļĞ~ÜĢÛĊrOÙîvd]n¬VÊĜ°RÖpMƂªFbwEÀ©\\\\¤]ŸI®¥D³|Ë]CöAŤ¦æ´¥¸Lv¼¢ĽBaôF~®²GÌÒEYzk¤°ahlVÕI^CxĈPsBƒºV¸@¾ªR²ĨN]´_eavSivc}p}Đ¼ƌkJÚe th_¸ ºx±ò_xNË²@ă¡ßH©Ùñ}wkNÕ¹ÇO½¿£ĕ]ly_WìIÇª`uTÅxYĒÖ¼kÖµMjJÚwn\\\\hĒv]îh|ÈƄøèg¸Ķß ĉĈWb¹ƀdéĘNTtP[öSvrCZaGubo´ŖÒÇĐ~¡zCIözx¢PnÈñ @ĥÒ¦]ƞV}³ăĔñiiÄÓVépKG½ÄÓávYoC·sitiaÀyŧÎ¡ÈYDÑům}ý|m[węõĉZÅxUO}÷N¹³ĉo_qtăqwµŁYÙǝŕ¹tïÛUÃ¯mRCºĭ|µÕÊK½Rē ó]GªęAx»HO£|ām¡diď×YïYWªŉOeÚtĐ«zđ¹TāúEá²\\\\ķÍ}jYàÙÆſ¿Çdğ·ùTßÇţʄ¡XgWÀǇğ·¿ÃOj YÇ÷Qěi\"]],\"encodeOffsets\":[[[117381,22988]],[[116552,22934]],[[116790,22617]],[[116973,22545]],[[116444,22536]],[[116931,22515]],[[116496,22490]],[[116453,22449]],[[113301,21439]],[[118726,21604]],[[118709,21486]],[[113210,20816]],[[115482,22082]],[[113171,21585]],[[113199,21590]],[[115232,22102]],[[115739,22373]],[[115134,22184]],[[113056,21175]],[[119573,21271]],[[119957,24020]],[[115859,22356]],[[116561,22649]],[[116285,22746]]]},\"properties\":{\"cp\":[113.280637,23.125178],\"name\":\"广东\",\"childNum\":24}},{\"id\":\"450000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@H TQ§A\"],[\"@@ĨÊªLƊDÎĹĐCǦė¸zÚGn£¾rªŀÜt¬@ÖÚSx~øOŒŶÐÂæȠ\\\\ÈÜObĖw^oÞLf¬°bI lTØBÌF£Ć¹gñĤaYt¿¤VSñK¸¤nM¼JE±½¸ñoÜCƆæĪ^ĚQÖ¦^f´QüÜÊz¯lzUĺš@ìp¶n]sxtx¶@~ÒĂJb©gk{°~c°`Ô¬rV\\\\la¼¤ôá`¯¹LCÆbxEræOv[H­[~|aB£ÖsºdAĐzNÂðsÞÆĤªbab`ho¡³F«èVlo¤ÔRzpp®SĪº¨ÖºNĳd`a¦¤F³ºDÎńĀìCĜº¦Ċ~nS|gźvZkCÆj°zVÈÁƔ]LÊFZgčP­kini«qÇczÍY®¬Ů»qR×ō©DÕ§ƙǃŵTÉĩ±ıdÑnYYĲvNĆĆØÜ Öp}e³¦m©iÓ|¹ħņ|ª¦QF¢Â¬ʖovg¿em^ucà÷gÕuíÙćĝ}FĻ¼Ĺ{µHKsLSđƃrč¤[AgoSŇYMÿ§Ç{FśbkylQxĕ]T·¶[BÑÏGáşşƇeăYSs­FQ}­BwtYğÃ@~CÍQ ×WjË±rÉ¥oÏ ±«ÓÂ¥kwWűmcih³K~µh¯e]lµélEģEďsmÇŧē`ãògK_ÛsUʝćğ¶höO¤Ǜn³c`¡y¦CezYwa[ďĵűMę§]XÎ_íÛ]éÛUćİÕBƣ±dy¹T^dûÅÑŦ·PĻþÙ`K¦¢ÍeĥR¿³£[~äu¼dltW¸oRM¢ď\\\\z}Æzdvň{ÎXF¶°Â_ÒÂÏL©ÖTmu¼ãlīkiqéfA·Êµ\\\\őDc¥ÝFyÔćcűH_hLÜêĺĐ¨c}rn`½Ì@¸¶ªVLhŒ\\\\Ţĺk~Ġið°|gtTĭĸ^xvKVGréAébUuMJVÃO¡qĂXËSģãlýà_juYÛÒBG^éÖ¶§EGÅzěƯ¤EkN[kdåucé¬dnYpAyČ{`]þ¯TbÜÈk¡ĠvàhÂƄ¢Jî¶²\"]],\"encodeOffsets\":[[[111707,21520]],[[107619,25527]]]},\"properties\":{\"cp\":[108.320004,22.82402],\"name\":\"广西\",\"childNum\":2}},{\"id\":\"460000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@¦Ŝil¢XƦƞòïè§ŞCêɕrŧůÇąĻõ·ĉ³œ̅kÇm@ċȧŧĥĽʉ­ƅſȓÒË¦ŝE}ºƑ[ÍĜȋ gÎfǐÏĤ¨êƺ\\\\Ɔ¸ĠĎvʄȀÐ¾jNðĀÒRZǆzÐŘÎ°H¨Ƣb²_Ġ \"],\"encodeOffsets\":[[112750,20508]]},\"properties\":{\"cp\":[110.33119,20.031971],\"name\":\"海南\",\"childNum\":1}},{\"id\":\"510000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@LqKr\"],[\"@@[ĻéV£_ţġñpG réÏ·~ąSfy×Í·ºſƽiÍıƣıĻmHH}siaX@iÇ°ÁÃ×t«­T¤JJJyJÈ`Ohß¦¡uËhIyCjmÿwZGTiSsOB²fNmsPa{M{õE^Hj}gYpaeu¯oáwHjÁ½M¡pMuåmni{fk\\\\oÎqCwEZ¼KĝAy{m÷LwO×SimRI¯rKõBS«sFe]fµ¢óY_ÆPRcue°Cbo×bd£ŌIHgtrnyPt¦foaXďxlBowz_{ÊéWiêEGhÜ¸ºuFĈIxf®Y½ĀǙ]¤EyF²ċw¸¿@g¢§RGv»áW`ÃĵJwi]t¥wO­½a[×]`Ãi­üL¦LabbTÀåc}ÍhÆh®BHî|îºÉk­¤Sy£ia©taį·Ɖ`ō¥UhOĝLk}©Fos´JmµlŁuønÑJWÎªYÀïAetTŅÓGË«bo{ıwodƟ½OġÜÂµxàNÖ¾P²§HKv¾]|BÆåoZ`¡Ø`ÀmºĠ~ÌÐ§nÇ¿¤]wğ@srğu~Io[é±¹ ¿ſđÓ@qg¹zƱřaí°KtÇ¤V»Ã[ĩǭƑ^ÇÓ@áťsZÏÅĭƋěpwDóÖáŻneQËq·GCœýS]x·ýq³OÕ¶Qzßti{řáÍÇWŝŭñzÇWpç¿JXĩè½cFÂLiVjx}\\\\NŇĖ¥GeJA¼ÄHfÈu~¸Æ«dE³ÉMA|bÒćhG¬CMõƤąAvüVéŀ_VÌ³ĐwQj´·ZeÈÁ¨X´Æ¡Qu·»ÕZ³ġqDoy`L¬gdp°şp¦ėìÅĮZ°Iähzĵf²å ĚÑKpIN|Ñz]ń·FU×é»R³MÉ»GM«kiér}Ã`¹ăÞmÈnÁîRǀ³ĜoİzŔwǶVÚ£À]ɜ»ĆlƂ²ĠþTº·àUȞÏʦ¶I«dĽĢdĬ¿»Ĕ×h\\\\c¬ä²GêëĤł¥ÀǿżÃÆMº}BÕĢyFVvwxBèĻĒ©ĈtCĢɽŠȣ¦āæ·HĽîôNÔ~^¤Ɗu^s¼{TA¼ø°¢İªDè¾Ň¶ÝJ®Z´ğ~Sn|ªWÚ©òzPOȸbð¢|øĞŒQìÛÐ@ĞǎRS¤Á§di´ezÝúØã]HqkIþËQÇ¦ÃsÇ¤[E¬ÉŪÍxXƒ·ÖƁİlƞ¹ª¹|XÊwnÆƄmÀêErĒtD®ċæcQE®³^ĭ¥©l}äQtoŖÜqÆkµªÔĻĴ¡@Ċ°B²Èw^^RsºTĀ£ŚæQPJvÄz^Đ¹Æ¯fLà´GC²dt­ĀRt¼¤ĦOðğfÔðDŨŁĞƘïPÈ®âbMüÀXZ ¸£@Å»»QÉ­]dsÖ×_Í_ÌêŮPrĔĐÕGĂeZÜîĘqBhtO ¤tE[h|YÔZśÎs´xº±Uñt|OĩĠºNbgþJy^dÂY Į]Řz¦gC³R`Āz¢Aj¸CL¤RÆ»@­Ŏk\\\\Ç´£YW}z@Z}Ã¶oû¶]´^NÒ}èNªPÍy¹`S°´ATeVamdUĐwʄvĮÕ\\\\uÆŗ¨Yp¹àZÂmWh{á}WØǍÉüwga§áCNęÎ[ĀÕĪgÖÉªXøx¬½Ů¦¦[NÎLÜUÖ´òrÙŠxR^JkĳnDX{U~ET{ļº¦PZcjF²Ė@pg¨B{u¨ŦyhoÚD®¯¢ WòàFÎ¤¨GDäz¦kŮPġqË¥À]eâÚ´ªKxīPÖ|æ[xÃ¤JÞĥsNÖ½I¬nĨY´®ÐƐmDŝuäđđEbee_v¡}ìęǊē}qÉåT¯µRs¡M@}ůaa­¯wvƉåZw\\\\Z{åû^\"]],\"encodeOffsets\":[[[108815,30935]],[[110617,31811]]]},\"properties\":{\"cp\":[104.065735,30.659462],\"name\":\"四川\",\"childNum\":2}},{\"id\":\"520000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@G\\\\lY£in\"],[\"@@q|mc¯tÏVSÎ\"],[\"@@hÑ£IsNgßHHªķÃh_¹¡ĝÄ§ń¦uÙùgS¯JH|sÝÅtÁïyMDč»eÕtA¤{b\\\\}G®u\\\\åPFqwÅaDK°ºâ_£ùbµmÁÛĹM[q|hlaªāI}Ñµ@swtwm^oµDéĽŠyVky°ÉûÛR³e¥]RÕěħ[ƅåÛDpJiVÂF²I»mN·£LbÒYbWsÀbpkiTZĄă¶Hq`ĥ_J¯ae«KpÝx]aĕÛPÇȟ[ÁåŵÏő÷Pw}TÙ@Õs«ĿÛq©½m¤ÙH·yǥĘĉBµĨÕnđ]K©œáGçş§ÕßgǗĦTèƤƺ{¶ÉHÎd¾ŚÊ·OÐjXWrãLyzÉAL¾ę¢bĶėy_qMĔąro¼hĊw¶øV¤w²Ĉ]ÊKx|`ź¦ÂÈdrcÈbe¸`I¼čTF´¼Óýȃr¹ÍJ©k_șl³´_pĐ`oÒh¶pa^ÓĔ}D»^Xy`d[KvJPhèhCrĂĚÂ^Êƌ wZL­Ġ£ÁbrzOIlMMĪŐžËr×ÎeŦtw|¢mKjSǘňĂStÎŦEtqFT¾Eì¬¬ôxÌO¢ K³ŀºäYPVgŎ¦ŊmŞ¼VZwVlz¤£Tl®ctĽÚó{G­AÇge~Îd¿æaSba¥KKûj®_Ä^\\\\Ø¾bP®¦x^sxjĶI_Ä Xâ¼Hu¨Qh¡À@Ëô}±GNìĎlT¸`V~R°tbÕĊ`¸úÛtÏFDu[MfqGH·¥yAztMFe|R_GkChZeÚ°tov`xbDnÐ{E}ZèxNEÞREn[Pv@{~rĆAB§EO¿|UZ~ìUf¨J²ĂÝÆsªB`s¶fvö¦Õ~dÔq¨¸º»uù[[§´sb¤¢zþF¢ÆÀhÂW\\\\ıËIÝo±ĭŠ£þÊs}¡R]ěDg´VG¢j±®èºÃmpU[Áëº°rÜbNu¸}º¼`niºÔXĄ¤¼ÔdaµÁ_ÃftQQgR·Ǔv}Ý×ĵ]µWc¤F²OĩųãW½¯K©]{LóµCIµ±Mß¿h©āq¬o½~@i~TUxŪÒ¢@£ÀEîôruńb[§nWuMÆLl¿]x}ĳ­½\"]],\"encodeOffsets\":[[[112158,27383]],[[112105,27474]],[[112095,27476]]]},\"properties\":{\"cp\":[106.713478,26.578343],\"name\":\"贵州\",\"childNum\":3}},{\"id\":\"530000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@[ùx½}ÑRHYīĺûsÍniEoã½Ya²ė{c¬ĝgĂsAØÅwďõzFjw}«Dx¿}Uũlê@HÅ­F¨ÇoJ´Ónũuą¡Ã¢pÒÅØ TF²xa²ËXcÊlHîAßËŁkŻƑŷÉ©hW­æßUËs¡¦}teèÆ¶StÇÇ}Fd£jĈZĆÆ¤Tč\\\\D}O÷£U§~ŃGåŃDĝ¸Tsd¶¶Bª¤u¢ŌĎo~t¾ÍŶÒtD¦ÚiôözØX²ghįh½Û±¯ÿm·zR¦Ɵ`ªŊÃh¢rOÔ´£Ym¼èêf¯ŪĽncÚbw\\\\zlvWªâ ¦gmĿBĹ£¢ƹřbĥkǫßeeZkÙIKueT»sVesbaĕ  ¶®dNĄÄpªy¼³BE®lGŭCǶwêżĔÂepÍÀQƞpC¼ŲÈ­AÎô¶RäQ^Øu¬°_Èôc´¹ò¨PÎ¢hlĎ¦´ĦÆ´sâÇŲPnÊD^¯°Upv}®BPÌªjǬxSöwlfòªvqĸ|`H­viļndĜ­Ćhňem·FyÞqóSį¯³X_ĞçêtryvL¤§z¦c¦¥jnŞklD¤øz½ĜàĂŧMÅ|áƆàÊcðÂFÜáŢ¥\\\\\\\\ºİøÒÐJĴîD¦zK²ǏÎEh~CD­hMn^ÌöÄ©ČZÀaüfɭyœpį´ěFűk]Ôě¢qlÅĆÙa¶~ÄqêljN¬¼HÊNQ´ê¼VØ¸E^ŃÒyM{JLoÒęæe±Ķygã¯JYÆĭĘëo¥Šo¯hcK«z_prC´ĢÖY¼ v¸¢RÅW³Â§fÇ¸Yi³xR´ďUË`êĿUûuĆBƣöNDH«ĈgÑaB{ÊNF´¬c·Åv}eÇÃGB»If¦HňĕM~[iwjUÁKE¾dĪçWIèÀoÈXòyŞŮÈXâÎŚj|àsRyµÖPr´þ ¸^wþTDŔHr¸RÌmfżÕâCôoxĜƌÆĮÐYtâŦÔ@]ÈǮƒ\\\\Ī¼Ä£UsÈ¯LbîƲŚºyhr@ĒÔƀÀ²º\\\\êpJ}ĠvqtĠ@^xÀ£È¨mËÏğ}n¹_¿¢×Y_æpÅA^{½Lu¨GO±Õ½ßM¶wÁĢÛPƢ¼pcĲx|apÌ¬HÐŊSfsðBZ¿©XÏÒKk÷Eû¿SrEFsÕūkóVǥŉiTL¡n{uxţÏhôŝ¬ğōNNJkyPaqÂğ¤K®YxÉƋÁ]āęDqçgOgILu\\\\_gz]W¼~CÔē]bµogpÑ_oď`´³Țkl`IªºÎȄqÔþ»E³ĎSJ»_f·adÇqÇc¥Á_Źw{L^É±ćxU£µ÷xgĉp»ĆqNē`rĘzaĵĚ¡K½ÊBzyäKXqiWPÏÉ¸½řÍcÊG|µƕƣGË÷k°_^ý|_zċBZocmø¯hhcæ\\\\lMFlư£ĜÆyHF¨µêÕ]HAàÓ^it `þßäkĤÎT~Wlÿ¨ÔPzUCNVv [jâôDôď[}z¿msSh¯{jïğl}šĹ[őgK©U·µË@¾m_~q¡f¹ÅË^»f³ø}Q¡ÖË³gÍ±^Ç\\\\ëÃA_¿bWÏ[¶ƛé£F{īZgm@|kHǭƁć¦UĔť×ë}ǝeďºȡȘÏíBÉ£āĘPªĳ¶ŉÿy©nď£G¹¡I±LÉĺÑdĉÜW¥}gÁ{aqÃ¥aıęÏZï`\"],\"encodeOffsets\":[[104636,22969]]},\"properties\":{\"cp\":[102.712251,25.040609],\"name\":\"云南\",\"childNum\":1}},{\"id\":\"540000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@ÂhľxŖxÒVºÅâAĪÝȆµę¯Ňa±r_w~uSÕňqOj]ɄQ£ZUDûoY»©M[L¼qãË{VÍçWVi]ë©Ä÷àyƛhÚU°adcQ~Mx¥cc¡ÙaSyFÖk­uRýq¿ÔµQĽ³aG{¿FµëªéĜÿª@¬·K·àariĕĀ«V»ŶĴūgèLǴŇƶaftèBŚ£^âǐÝ®M¦ÁǞÿ¬LhJ¾óƾÆºcxwf]Y´¦|QLn°adĊ\\\\¨oǀÍŎ´ĩĀd`tÊQŞŕ|¨C^©Ĉ¦¦ÎJĊ{ëĎjª²rÐl`¼Ą[t|¦Stè¾PÜK¸dƄı]s¤î_v¹ÎVòŦj£Əsc¬_Ğ´|Ł¦Av¦w`ăaÝaa­¢e¤ı²©ªSªÈMĄwÉØŔì@T¤Ę\\\\õª@þo´­xA sÂtŎKzó´ÇĊµ¢r^nĊ­Æ¬×üG¢³ {âĊ]G~bÀgVjzlhǶfOfdªB]pjTOtĊn¤}®¦Č¥d¢¼»ddY¼t¢eȤJ¤}Ǿ¡°§¤AÐlc@ĝsªćļđAçwxUuzEÖġ~AN¹ÄÅȀŻ¦¿ģŁéì±Hãd«g[Ø¼ēÀcīľġ¬cJµÐʥVȝ¸ßS¹ý±ğkƁ¼ą^ɛ¤Ûÿb[}¬ōõÃ]ËNm®g@Bg}ÍF±ǐyL¥íCIĳÏ÷Ñį[¹¦[âšEÛïÁÉdƅß{âNÆāŨß¾ě÷yC£k­´ÓH@Â¹TZ¥¢į·ÌAÐ§®Zcv½Z­¹|ÅWZqgW|ieZÅYVÓqdqbc²R@c¥Rã»GeeƃīQ}J[ÒK¬Ə|oėjġĠÑN¡ð¯EBčnwôɍėª²CλŹġǝʅįĭạ̃ūȹ]ΓͧgšsgȽóϧµǛęgſ¶ҍć`ĘąŌJÞä¤rÅň¥ÖÁUětęuůÞiĊÄÀ\\\\Æs¦ÓRb|Â^řÌkÄŷ¶½÷f±iMÝ@ĥ°G¬ÃM¥n£Øąğ¯ß§aëbéüÑOčk£{\\\\eµª×MÉfm«Ƒ{Å×Gŏǩãy³©WÑăû··Qòı}¯ãIéÕÂZ¨īès¶ZÈsæĔTŘvgÌsN@îá¾ó@ÙwU±ÉTå»£TđWxq¹Zobs[×¯cĩvėŧ³BM|¹kªħ¥TzNYnÝßpęrñĠĉRS~½ěVVµõ«M££µBĉ¥áºae~³AuĐh`Ü³ç@BÛïĿa©|z²Ý¼D£àč²ŸIûI āóK¥}rÝ_Á´éMaň¨~ªSĈ½½KÙóĿeƃÆB·¬ën×W|Uº}LJrƳlŒµ`bÔ`QÐÓ@s¬ñIÍ@ûws¡åQÑßÁ`ŋĴ{ĪTÚÅTSÄ³Yo|Ç[Ç¾µMW¢ĭiÕØ¿@MhpÕ]jéò¿OƇĆƇpêĉâlØwěsǩĵ¸cbU¹ř¨WavquSMzeo_^gsÏ·¥Ó@~¯¿RiīB\\\\qTGªÇĜçPoÿfñòą¦óQīÈáPābß{ZŗĸIæÅhnszÁCËìñÏ·ąĚÝUm®ó­L·ăUÈíoù´Êj°ŁŤ_uµ^°ìÇ@tĶĒ¡ÆM³Ģ«İĨÅ®ğRāðggheÆ¢zÊ©Ô\\\\°ÝĎz~ź¤PnMĪÖB£kné§żćĆKĒ°¼L¶èâz¨u¦¥LDĘz¬ýÎmĘd¾ßFzhg²Fy¦ĝ¤ċņbÎ@yĄæm°NĮZRÖíJ²öLĸÒ¨Y®ƌÐVàtt_ÚÂyĠz]ŢhzĎ{ÂĢXc|ÐqfO¢¤ögÌHNPKŖUú´xx[xvĐCûĀìÖT¬¸^}Ìsòd´_KgžLĴÀBon|H@Êx¦BpŰŌ¿fµƌA¾zǈRx¶FkĄźRzŀ~¶[´HnªVƞuĒ­È¨ƎcƽÌm¸ÁÈM¦x͊ëÀxǆBú^´W£dkɾĬpw˂ØɦļĬIŚÊnŔa¸~J°îlɌxĤÊÈðhÌ®gT´øàCÀ^ªerrƘd¢İP|Ė ŸWªĦ^¶´ÂLaT±üWƜǀRÂŶUńĖ[QhlLüAÜ\\\\qRĄ©\"],\"encodeOffsets\":[[90849,37210]]},\"properties\":{\"cp\":[91.132212,29.660361],\"name\":\"西藏\",\"childNum\":1}},{\"id\":\"610000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@p¢ȮµûGĦ}Ħðǚ¶òƄjɂz°{ºØkÈęâ¦jªBg\\\\ċ°s¬]jú EȌǆ¬stRÆdĠİwÜ¸ôW¾ƮłÒ_{Ìû¼jº¹¢GǪÒ¯ĘZ`ºŊecņą~BÂgzpâēòYǠȰÌTÎ¨ÂW|fcă§uF@N¢XLRMº[ğȣſï|¥Jkc`sŉǷY¹W@µ÷Kãï³ÛIcñ·VȋÚÒķø©þ¥yÓğęmWµÎumZyOŅƟĥÓ~sÑL¤µaÅY¦ocyZ{y c]{Ta©`U_Ěē£ωÊƍKùK¶ȱÝƷ§{û»ÅÁȹÍéuĳ|¹cÑdìUYOuFÕÈYvÁCqÓTǢí§·S¹NgV¬ë÷Át°DØ¯C´ŉƒópģ}ċcEËFéGU¥×K§­¶³BČ}C¿åċ`wġB·¤őcƭ²ő[Å^axwQOÿEËßŚĤNĔwƇÄńwĪ­o[_KÓª³ÙnKÇěÿ]ďă_d©·©Ýŏ°Ù®g]±ßå¬÷m\\\\iaǑkěX{¢|ZKlçhLtŇîŵœè[É@ƉĄEtƇÏ³­ħZ«mJ×¾MtÝĦ£IwÄå\\\\Õ{OwĬ©LÙ³ÙgBƕŀrÌĢŭO¥lãyC§HÍ£ßEñX¡­°ÙCgpťzb`wIvA|§hoĕ@E±iYd¥OĻ¹S|}F@¾oAO²{tfÜ¢FǂÒW²°BĤh^Wx{@¬­F¸¡ķn£P|ªĴ@^ĠĈæbÔc¶lYi^MicĎ°Â[ävï¶gv@ÀĬ·lJ¸sn|¼u~a]ÆÈtŌºJpþ£KKf~¦UbyäIĺãnÔ¿^­ŵMThĠÜ¤ko¼Ŏìąǜh`[tRd²Ĳ_XPrɲlXiL§à¹H°Ȧqº®QCbAŌJ¸ĕÚ³ĺ§ `d¨YjiZvRĺ±öVKkjGȊÄePĞZmļKÀ[`ösìhïÎoĬdtKÞ{¬èÒÒBÔpĲÇĬJŊ¦±J«Y§@·pHµàåVKepWftsAÅqC·¬ko«pHÆuK@oHĆÛķhxenS³àǍrqƶRbzy¸ËÐl¼EºpĤ¼x¼½~Ğà@ÚüdK^mÌSj\"],\"encodeOffsets\":[[110234,38774]]},\"properties\":{\"cp\":[108.948024,34.263161],\"name\":\"陕西\",\"childNum\":1}},{\"id\":\"620000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@VuUv\"],[\"@@ũEĠtt~nkh`Q¦ÅÄÜdwAb×ĠąJ¤DüègĺqBqj°lI¡ĨÒ¤úSHbjÎB°aZ¢KJO[|A£Dx}NĂ¬HUnrk kp¼Y kMJn[aGáÚÏ[½rc}aQxOgsPMnUsncZsKúvAtÞġ£®ĀYKdnFw¢JE°Latf`¼h¬we|Æbj}GA·~W`¢MC¤tL©Ĳ°qdfObÞĬ¹ttu`^ZúE`[@Æsîz®¡CƳƜG²R¢RmfwĸgÜą G@pzJM½mhVy¸uÈÔO±¨{LfæU¶ßGĂq\\\\ª¬²I¥IŉÈīoıÓÑAçÑ|«LÝcspīðÍgtë_õ\\\\ĉñLYnĝgRǡÁiHLlõUĹ²uQjYi§Z_c¨´ĹĖÙ·ŋIaBD­R¹ȥr¯GºßK¨jWkɱOqWĳ\\\\a­Q\\\\sg_ĆǛōëp»£lğÛgSŶN®À]ÓämĹãJaz¥V}Le¤Lýo¹IsŋÅÇ^bz³tmEÁ´a¹cčecÇNĊãÁ\\\\č¯dNj]jZµkÓdaćå]ğĳ@ ©O{¤ĸm¢E·®«|@Xwg]Aģ±¯XǁÑǳªcwQÚŝñsÕ³ÛV_ý¥\\\\ů¥©¾÷w©WÕÊĩhÿÖÁRo¸V¬âDb¨hûxÊ×ǌ~Zâg|XÁnßYoº§ZÅŘv[ĭÖʃuďxcVbnUSfB¯³_TzºÎO©çMÑ~M³]µ^püµÄY~y@X~¤Z³[Èōl@®Å¼£QK·Di¡ByÿQ_´D¥hŗy^ĭÁZ]cIzýah¹MĪğPs{ò²Vw¹t³ŜË[Ñ}X\\\\gsF£sPAgěp×ëfYHāďÖqēŭOÏëdLü\\\\it^c®RÊº¶¢H°mrY£B¹čIoľu¶uI]vģSQ{UŻÅ}QÂ|Ì°ƅ¤ĩŪU ęĄÌZÒ\\\\v²PĔ»ƢNHĂyAmƂwVm`]ÈbH`Ì¢²ILvĜH®¤Dlt_¢JJÄämèÔDëþgºƫaʎÌrêYi~ Îİ¤NpÀA¾Ĕ¼bð÷®üszMzÖĖQdȨýv§Tè|ªHÃ¾a¸|Ð ƒwKĢx¦ivr^ÿ ¸l öæfƟĴ·PJv}n\\\\h¹¶v·À|\\\\ƁĚN´ĜçèÁz]ġ¤²¨QÒŨTIlªťØ}¼˗ƦvÄùØEÂ«FïËIqōTvāÜŏíÛßÛVj³âwGăÂíNOPìyV³ŉĖýZso§HÑiYw[ß\\\\X¦¥c]ÔƩÜ·«jÐqvÁ¦m^ċ±R¦΋ƈťĚgÀ»IïĨʗƮ°ƝĻþÍAƉſ±tÍEÕÞāNUÍ¡\\\\ſčåÒʻĘm ƭÌŹöʥëQ¤µ­ÇcƕªoIýIÉ_mkl³ăƓ¦j¡YzŇi}Msßõīʋ }ÁVm_[n}eı­Uĥ¼ªI{Î§DÓƻėojqYhĹT©oūĶ£]ďxĩǑMĝq`B´ƃ˺Чç~²ņj@¥@đ´ί}ĥtPńÇ¾V¬ufÓÉCtÓ̻¹£G³]ƖƾŎĪŪĘ̖¨ʈĢƂlɘ۪üºňUðǜȢƢż̌ȦǼĤŊɲĖÂ­Kq´ï¦ºĒǲņɾªǀÞĈĂD½ĄĎÌŗĞrôñnN¼â¾ʄľԆ|Ǆ֦ज़ȗǉ̘̭ɺƅêgV̍ʆĠ·ÌĊv|ýĖÕWĊǎÞ´õ¼cÒÒBĢ͢UĜð͒s¨ňƃLĉÕÝ@ɛƯ÷¿Ľ­ĹeȏĳëCȚDŲyê×Ŗyò¯ļcÂßYtÁƤyAã˾J@ǝrý@¤rz¸oP¹ɐÚyáHĀ[JwcVeȴÏ»ÈĖ}ƒŰŐèȭǢόĀƪÈŶë;Ñ̆ȤМľĮEŔĹŊũ~ËUă{ĻƹɁύȩþĽvĽƓÉ@ēĽɲßǐƫʾǗĒpäWÐxnsÀ^ƆwW©¦cÅ¡Ji§vúF¶¨c~c¼īeXǚ\\\\đ¾JwÀďksãAfÕ¦L}waoZD½Ml«]eÒÅaÉ²áo½FõÛ]ĻÒ¡wYR£¢rvÓ®y®LFLzĈôe]gx}|KK}xklL]c¦£fRtív¦PĤoH{tK\"]],\"encodeOffsets\":[[[108619,36299]],[[108589,36341]]]},\"properties\":{\"cp\":[103.823557,36.058039],\"name\":\"甘肃\",\"childNum\":2}},{\"id\":\"630000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@InJm\"],[\"@@CÆ½OŃĦsΰ~Ē³¦@@Ņi±è}ШƄ˹A³r_ĞǒNĪĐw¤^ŬĵªpĺSZgrpiƼĘÔ¨C|ÍJ©Ħ»®VĲ~f\\\\m `UnÂ~ʌĬàöNt~ňjy¢ZiƔ¥Ąk´nl`JÊJþ©pdƖ®È£¶ìRʦźõƮËnʼėæÑƀĎ[¢VÎĂMÖÝÎF²sƊƀÎBļýƞ¯ʘƭðħ¼Jh¿ŦęΌƇ¥²Q]Č¥nuÂÏri¸¬ƪÛ^Ó¦d¥[Wàx\\\\ZjÒ¨GtpþYŊĕ´zUOëPîMĄÁxH´áiÜUàîÜŐĂÛSuŎrJðÌ¬EFÁú×uÃÎkrĒ{V}İ«O_ÌËĬ©ÓŧSRÑ±§Ģ£^ÂyèçěM³Ƃę{[¸¿uºµ[gt£¸OƤĿéYõ·kĀq]juw¥DĩƍõÇPéÄ½G©ã¤GuȧþRcÕĕNyyût­øï»a½ē¿BMoį£Íj}éZËqbʍƬh¹ìÿÓAçãnIÃ¡I`ks£CG­ěUy×Cy@¶ʡÊBnāzGơMē¼±O÷õJËĚăVĪũƆ£¯{ËL½ÌzżVR|ĠTbuvJvµhĻĖHAëáa­OÇðñęNwœľ·LmI±íĠĩPÉ×®ÿscB³±JKßĊ«`ađ»·QAmOVţéÿ¤¹SQt]]Çx±¯A@ĉĳ¢Óļ©l¶ÅÛrŕspãRk~¦ª]Į­´FRåd­ČsCqđéFn¿ÅƃmÉx{W©ºƝºįkÕƂƑ¸wWūÐ©ÈF£\\\\tÈ¥ÄRÈýÌJ lGr^×äùyÞ³fjc¨£ÂZ|ǓMĝÏ@ëÜőRĝ÷¡{aïȷPu°ËXÙ{©TmĠ}Y³­ÞIňµç½©C¡į÷¯B»|St»]vųs»}MÓ ÿʪƟǭA¡fs»PY¼c¡»¦cċ­¥£~msĉPSi^o©AecPeǵkgyUi¿h}aHĉ^|á´¡HØûÅ«ĉ®]m¡qĉ¶³ÈyôōLÁstB®wn±ă¥HSòė£Së@×œÊăxÇN©©T±ª£Ĳ¡fb®Þbb_Ą¥xu¥B{łĝ³«`dƐt¤ťiñÍUuºí`£^tƃĲc·ÛLO½sç¥Ts{ă\\\\_»kÏ±q©čiìĉ|ÍI¥ć¥]ª§D{ŝŖÉR_sÿc³ĪōƿÎ§p[ĉc¯bKmR¥{³Ze^wx¹dƽÅ½ôIg §Mĕ ƹĴ¿ǣÜÍ]Ý]snåA{eƭ`ǻŊĿ\\\\ĳŬűYÂÿ¬jĖqßb¸L«¸©@ěĀ©ê¶ìÀEH|´bRľÓ¶rÀQþvl®ÕETzÜdb hw¤{LRdcb¯ÙVgƜßzÃôì®^jUèXÎ|UäÌ»rK\\\\ªN¼pZCüVY¤ɃRi^rPŇTÖ}|br°qňbĚ°ªiƶGQ¾²x¦PmlŜ[Ĥ¡ΞsĦÔÏâ\\\\ªÚŒU\\\\f¢N²§x|¤§xĔsZPòʛ²SÐqF`ªVÞŜĶƨVZÌL`¢dŐIqr\\\\oäõFÎ·¤»Ŷ×h¹]ClÙ\\\\¦ďÌį¬řtTӺƙgQÇÓHţĒ´ÃbEÄlbʔC|CŮkƮ[ʼ¬ň´KŮÈΰÌĪ¶ƶlðļATUvdTGº̼ÔsÊDÔveOg\"]],\"encodeOffsets\":[[[105308,37219]],[[95370,40081]]]},\"properties\":{\"cp\":[101.778916,36.623178],\"name\":\"青海\",\"childNum\":2}},{\"id\":\"640000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@KëÀęĞ«Oęȿȕı]ŉ¡åįÕÔ«ǴõƪĚQÐZhv K°öqÀÑS[ÃÖHƖčËnL]ûcÙß@ĝ¾}w»»oģF¹»kÌÏ·{zP§B­¢íyÅt@@á]Yv_ssģ¼ißĻL¾ġsKD£¡N_X¸}B~HaiÅf{«x»ge_bsKF¯¡IxmELcÿZ¤­ĢÝsuBLùtYdmVtNmtOPhRw~bd¾qÐ\\\\âÙH\\\\bImlNZ»loqlVmGā§~QCw¤{A\\\\PKNY¯bFkC¥sks_Ã\\\\ă«¢ħkJi¯rrAhĹûç£CUĕĊ_ÔBixÅÙĄnªÑaM~ħpOu¥sîeQ¥¤^dkKwlL~{L~hw^ófćKyE­K­zuÔ¡qQ¤xZÑ¢^ļöÜ¾Ep±âbÊÑÆ^fk¬NC¾YpxbK~¥eÖäBlt¿Đx½I[ĒǙWf»Ĭ}d§dµùEuj¨IÆ¢¥dXªƅx¿]mtÏwßRĶX¢͎vÆzƂZò®ǢÌʆCrâºMÞzÆMÒÊÓŊZÄ¾r°Î®Ȉmª²ĈUªĚîøºĮ¦ÌĘk^FłĬhĚiĀĖ¾iİbjÕ\"],[\"@@mfwěwMrŢªv@G\"]],\"encodeOffsets\":[[[109366,40242]],[[108600,36303]]]},\"properties\":{\"cp\":[106.278179,38.46637],\"name\":\"宁夏\",\"childNum\":2}},{\"id\":\"650000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@QØĔ²X¨~ǘBºjʐßØvKƔX¨vĊOÃ·¢i@~cĝe_«E}QxgɪëÏÃ@sÅyXoŖ{ô«ŸuXêÎf`C¹ÂÿÐGĮÕĞXŪōŸMźÈƺQèĽôe|¿ƸJR¤ĘEjcUóº¯Ĩ_ŘÁMª÷Ð¥OéÈ¿ÖğǤǷÂFÒzÉx[]­Ĥĝœ¦EP}ûƥé¿İƷTėƫœŕƅƱB»Đ±ēO¦E}`cȺrĦáŖuÒª«ĲπdƺÏØZƴwʄ¤ĖGĐǂZĶèH¶}ÚZצʥĪï|ÇĦMŔ»İĝǈì¥Βba­¯¥ǕǚkĆŵĦɑĺƯxūД̵nơʃĽá½M»òmqóŘĝčË¾ăCćāƿÝɽ©ǱŅ¹đ¥³ðLrÁ®ɱĕģŉǻ̋ȥơŻǛȡVï¹Ň۩ûkɗġƁ§ʇė̕ĩũƽō^ƕUv£ƁQïƵkŏ½ΉÃŭÇ³LŇʻ«ƭ\\\\lŭD{ʓDkaFÃÄa³ŤđÔGRÈƚhSӹŚsİ«ĐË[¥ÚDkº^Øg¼ŵ¸£EÍöůŉT¡c_ËKYƧUśĵÝU_©rETÏʜ±OñtYwē¨{£¨uM³x½şL©Ùá[ÓÐĥ Νtģ¢\\\\śnkOw¥±T»ƷFɯàĩÞáB¹ÆÑUwŕĽw[mG½Èå~Æ÷QyěCFmĭZīŵVÁƿQƛûXS²b½KÏ½ĉS©ŷXĕ{ĕK·¥Ɨcqq©f¿]ßDõU³h­gËÇïģÉɋwk¯í}I·œbmÉřīJɥĻˁ×xoɹīlc¤³Xù]ǅA¿w͉ì¥wÇN·ÂËnƾƍdÇ§đ®ƝvUm©³G\\\\}µĿQyŹlăµEwǇQ½yƋBe¶ŋÀůo¥AÉw@{Gpm¿AĳŽKLh³`ñcËtW±»ÕSëüÿďDu\\\\wwwù³VLŕOMËGh£õP¡erÏd{ġWÁč|yšg^ğyÁzÙs`s|ÉåªÇ}m¢Ń¨`x¥ù^}Ì¥H«YªƅAÐ¹n~ź¯f¤áÀzgÇDIÔ´AňĀÒ¶ûEYospõD[{ù°]uJqU|Soċxţ[õÔĥkŋÞŭZËºóYËüċrw ÞkrťË¿XGÉbřaDü·Ē÷AÃª[ÄäIÂ®BÕĐÞ_¢āĠpÛÄȉĖġDKwbmÄNôfƫVÉviǳHQµâFù­Âœ³¦{YGd¢ĚÜO {Ö¦ÞÍÀP^bƾl[vt×ĈÍEË¨¡Đ~´î¸ùÎhuè`¸HÕŔVºwĠââWò@{ÙNÝ´ə²ȕn{¿¥{l÷eé^eďXj©î\\\\ªÑòÜìc\\\\üqÕ[Č¡xoÂċªbØ­ø|¶ȴZdÆÂońéG\\\\¼C°ÌÆn´nxÊOĨŪƴĸ¢¸òTxÊǪMīĞÖŲÃɎOvʦƢ~FRěò¿ġ~åŊúN¸qĘ[Ĕ¶ÂćnÒPĒÜvúĀÊbÖ{Äî¸~Ŕünp¤ÂH¾ĄYÒ©ÊfºmÔĘcDoĬMŬS¤s²ʘÚžȂVŦ èW°ªB|ĲXŔþÈJĦÆæFĚêYĂªĂ]øªŖNÞüAfɨJ¯ÎrDDĤ`mz\\\\§~D¬{vJÂ«lµĂb¤pŌŰNĄ¨ĊXW|ų ¿¾ɄĦƐMTòP÷fØĶK¢ȝ˔Sô¹òEð­`Ɩ½ǒÂň×äı§ĤƝ§C~¡hlåǺŦŞkâ~}FøàĲaĞfƠ¥Ŕd®U¸źXv¢aƆúŪtŠųƠjdƺƺÅìnrh\\\\ĺ¯äɝĦ]èpĄ¦´LƞĬ´ƤǬ˼Ēɸ¤rºǼ²¨zÌPðŀbþ¹ļD¢¹\\\\ĜÑŚ¶ZƄ³àjĨoâȴLÊȮĐ­ĚăÀêZǚŐ¤qȂ\\\\L¢ŌİfÆs|zºeªÙæ§΢{Ā´ƐÚ¬¨Ĵà²łhʺKÞºÖTiƢ¾ªì°`öøu®Ê¾ãØ\"],\"encodeOffsets\":[[88824,50096]]},\"properties\":{\"cp\":[87.617733,43.792818],\"name\":\"新疆\",\"childNum\":1}},{\"id\":\"110000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@ĽOÁûtŷmiÍt_H»Ĩ±d`¹­{bwYr³S]§§o¹qGtm_SŧoaFLgQN_dV@Zom_ć\\\\ßcÂ±x¯oœRcfe£o§ËgToÛJíĔóu|wP¤XnO¢ÉŦ¯rNÄā¤zâŖÈRpŢZÚ{GrFt¦Òx§ø¹RóäV¤XdżâºWbwŚ¨Ud®bêņ¾jnŎGŃŶnzÚSeîĜZczî¾i]ÍQaúÍÔiþĩȨWĢü|Ėu[qb[swP@ÅğP¿{\\\\¥A¨ÏÑ¨j¯X\\\\¯MKpA³[Hīu}}\"],\"encodeOffsets\":[[120023,41045]]},\"properties\":{\"cp\":[116.405285,39.904989],\"name\":\"北京\",\"childNum\":1}},{\"id\":\"120000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@ŬgX§Ü«E¶FÌ¬O_ïlÁgz±AXeµÄĵ{¶]gitgIj·¥îakS¨ÐƎk}ĕ{gBqGf{¿aU^fIư³õ{YıëNĿk©ïËZŏR§òoY×Ógcĥs¡bġ«@dekąI[nlPqCnp{ō³°`{PNdƗqSÄĻNNâyj]äÒD ĬH°Æ]~¡HO¾X}ÐxgpgWrDGpù^LrzWxZ^¨´T\\\\|~@IzbĤjeĊªz£®ĔvěLmV¾Ô_ÈNW~zbĬvG²ZmDM~~\"],\"encodeOffsets\":[[120237,41215]]},\"properties\":{\"cp\":[117.190182,39.125596],\"name\":\"天津\",\"childNum\":1}},{\"id\":\"310000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@ɧư¬EpƸÁxc\"],[\"@@©ª\"],[\"@@MA\"],[\"@@QpİE§ÉC¾\"],[\"@@bŝÕÕEȣÚƥêImɇǦèÜĠÚÃƌÃ͎ó\"],[\"@@ǜûȬɋŭ×^sYɍDŋŽąñCG²«ªč@h_p¯A{oloY¬j@Ĳ`gQÚhr|ǀ^MĲvtbe´R¯Ô¬¨Yô¤r]ìƬį\"]],\"encodeOffsets\":[[[124702,32062]],[[124547,32200]],[[124808,31991]],[[124726,32110]],[[124903,32376]],[[124438,32149]]]},\"properties\":{\"cp\":[121.472644,31.231706],\"name\":\"上海\",\"childNum\":6}},{\"id\":\"500000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@vjG~nGŘŬĶȂƀƾ¹¸ØÎezĆT¸}êÐqHðqĖä¥^CÆIj²p\\\\_ æüY|[YxƊæu°xb®Űb@~¢NQt°¶Sæ Ê~rǉĔëĚ¢~uf`faĔJåĊnÖ]jƎćÊ@£¾a®£Ű{ŶĕFègLk{Y|¡ĜWƔtƬJÑxq±ĢN´òKLÈÃ¼D|s`ŋć]Ã`đMûƱ½~Y°ħ`ƏíW½eI½{aOIrÏ¡ĕŇapµÜƅġ^ÖÛbÙŽŏml½SêqDu[RãË»ÿw`»y¸_ĺę}÷`M¯ċfCVµqŉ÷Zgg`d½pDOÎCn^uf²ènh¼WtƏxRGg¦pVFI±G^Ic´ecGĹÞ½sëĬhxW}KÓe­XsbkF¦LØgTkïƵNï¶}Gyw\\\\oñ¡nmĈzj@Óc£»Wă¹Ój_m»¹·~MvÛaq»­ê\\\\ÂoVnÓØÍ²«bq¿efE Ĝ^Q~ Évýş¤²ĮpEİ}zcĺL½¿gÅ¡ýE¡ya£³t\\\\¨\\\\vú»¼§·Ñr_oÒý¥u_n»_At©ÞÅ±ā§IVeëY}{VPÀFA¨ąB}q@|Ou\\\\FmQFÝMwå}]|FmÏCawu_p¯sfÙgYDHl`{QEfNysB¦zG¸rHeN\\\\CvEsÐùÜ_·ÖĉsaQ¯}_UxÃđqNH¬Äd^ÝŰR¬ã°wećJE·vÝ·HgéFXjÉê`|ypxkAwWĐpb¥eOsmzwqChóUQl¥F^lafanòsrEvfQdÁUVfÎvÜ^eftET¬ôA\\\\¢sJnQTjPØxøK|nBzĞ»LYFDxÓvr[ehľvN¢o¾NiÂxGpâ¬zbfZo~hGi]öF||NbtOMn eA±tPTLjpYQ|SHYĀxinzDJÌg¢và¥Pg_ÇzIIII£®S¬ØsÎ¼£N\"],[\"@@ifjN@s\"]],\"encodeOffsets\":[[[109628,30765]],[[111725,31320]]]},\"properties\":{\"cp\":[106.504962,29.533155],\"name\":\"重庆\",\"childNum\":2}},{\"id\":\"810000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@AlBk\"],[\"@@mn\"],[\"@@EpFo\"],[\"@@ea¢pl¸Eõ¹hj[]ÔCÎ@lj¡uBX´AI¹[yDU]W`çwZkmcMpÅv}IoJlcafŃK°ä¬XJmÐ đhI®æÔtSHnEÒrÈc\"],[\"@@rMUwAS®e\"]],\"encodeOffsets\":[[[117111,23002]],[[117072,22876]],[[117045,22887]],[[116975,23082]],[[116882,22747]]]},\"properties\":{\"cp\":[114.173355,22.320048],\"name\":\"香港\",\"childNum\":5}},{\"id\":\"820000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@kÊd°å§s\"],\"encodeOffsets\":[[116279,22639]]},\"properties\":{\"cp\":[113.54909,22.198951],\"name\":\"澳门\",\"childNum\":1}}],\"UTF8Encoding\":true});\n}));"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template1/js/echarts-wordcloud.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"echarts\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"echarts\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"echarts-wordcloud\"] = factory(require(\"echarts\"));\n\telse\n\t\troot[\"echarts-wordcloud\"] = factory(root[\"echarts\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_7__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 25);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\n/**\n * @module zrender/core/util\n */\n// 用于处理merge时无法遍历Date等对象的问题\nvar BUILTIN_OBJECT = {\n  '[object Function]': 1,\n  '[object RegExp]': 1,\n  '[object Date]': 1,\n  '[object Error]': 1,\n  '[object CanvasGradient]': 1,\n  '[object CanvasPattern]': 1,\n  // For node-canvas\n  '[object Image]': 1,\n  '[object Canvas]': 1\n};\nvar TYPED_ARRAY = {\n  '[object Int8Array]': 1,\n  '[object Uint8Array]': 1,\n  '[object Uint8ClampedArray]': 1,\n  '[object Int16Array]': 1,\n  '[object Uint16Array]': 1,\n  '[object Int32Array]': 1,\n  '[object Uint32Array]': 1,\n  '[object Float32Array]': 1,\n  '[object Float64Array]': 1\n};\nvar objToString = Object.prototype.toString;\nvar arrayProto = Array.prototype;\nvar nativeForEach = arrayProto.forEach;\nvar nativeFilter = arrayProto.filter;\nvar nativeSlice = arrayProto.slice;\nvar nativeMap = arrayProto.map;\nvar nativeReduce = arrayProto.reduce; // Avoid assign to an exported variable, for transforming to cjs.\n\nvar methods = {};\n\nfunction $override(name, fn) {\n  methods[name] = fn;\n}\n/**\n * Those data types can be cloned:\n *     Plain object, Array, TypedArray, number, string, null, undefined.\n * Those data types will be assgined using the orginal data:\n *     BUILTIN_OBJECT\n * Instance of user defined class will be cloned to a plain object, without\n * properties in prototype.\n * Other data types is not supported (not sure what will happen).\n *\n * Caution: do not support clone Date, for performance consideration.\n * (There might be a large number of date in `series.data`).\n * So date should not be modified in and out of echarts.\n *\n * @param {*} source\n * @return {*} new\n */\n\n\nfunction clone(source) {\n  if (source == null || typeof source != 'object') {\n    return source;\n  }\n\n  var result = source;\n  var typeStr = objToString.call(source);\n\n  if (typeStr === '[object Array]') {\n    result = [];\n\n    for (var i = 0, len = source.length; i < len; i++) {\n      result[i] = clone(source[i]);\n    }\n  } else if (TYPED_ARRAY[typeStr]) {\n    var Ctor = source.constructor;\n\n    if (source.constructor.from) {\n      result = Ctor.from(source);\n    } else {\n      result = new Ctor(source.length);\n\n      for (var i = 0, len = source.length; i < len; i++) {\n        result[i] = clone(source[i]);\n      }\n    }\n  } else if (!BUILTIN_OBJECT[typeStr] && !isPrimitive(source) && !isDom(source)) {\n    result = {};\n\n    for (var key in source) {\n      if (source.hasOwnProperty(key)) {\n        result[key] = clone(source[key]);\n      }\n    }\n  }\n\n  return result;\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {*} target\n * @param {*} source\n * @param {boolean} [overwrite=false]\n */\n\n\nfunction merge(target, source, overwrite) {\n  // We should escapse that source is string\n  // and enter for ... in ...\n  if (!isObject(source) || !isObject(target)) {\n    return overwrite ? clone(source) : target;\n  }\n\n  for (var key in source) {\n    if (source.hasOwnProperty(key)) {\n      var targetProp = target[key];\n      var sourceProp = source[key];\n\n      if (isObject(sourceProp) && isObject(targetProp) && !isArray(sourceProp) && !isArray(targetProp) && !isDom(sourceProp) && !isDom(targetProp) && !isBuiltInObject(sourceProp) && !isBuiltInObject(targetProp) && !isPrimitive(sourceProp) && !isPrimitive(targetProp)) {\n        // 如果需要递归覆盖，就递归调用merge\n        merge(targetProp, sourceProp, overwrite);\n      } else if (overwrite || !(key in target)) {\n        // 否则只处理overwrite为true，或者在目标对象中没有此属性的情况\n        // NOTE，在 target[key] 不存在的时候也是直接覆盖\n        target[key] = clone(source[key], true);\n      }\n    }\n  }\n\n  return target;\n}\n/**\n * @param {Array} targetAndSources The first item is target, and the rests are source.\n * @param {boolean} [overwrite=false]\n * @return {*} target\n */\n\n\nfunction mergeAll(targetAndSources, overwrite) {\n  var result = targetAndSources[0];\n\n  for (var i = 1, len = targetAndSources.length; i < len; i++) {\n    result = merge(result, targetAndSources[i], overwrite);\n  }\n\n  return result;\n}\n/**\n * @param {*} target\n * @param {*} source\n * @memberOf module:zrender/core/util\n */\n\n\nfunction extend(target, source) {\n  for (var key in source) {\n    if (source.hasOwnProperty(key)) {\n      target[key] = source[key];\n    }\n  }\n\n  return target;\n}\n/**\n * @param {*} target\n * @param {*} source\n * @param {boolean} [overlay=false]\n * @memberOf module:zrender/core/util\n */\n\n\nfunction defaults(target, source, overlay) {\n  for (var key in source) {\n    if (source.hasOwnProperty(key) && (overlay ? source[key] != null : target[key] == null)) {\n      target[key] = source[key];\n    }\n  }\n\n  return target;\n}\n\nvar createCanvas = function () {\n  return methods.createCanvas();\n};\n\nmethods.createCanvas = function () {\n  return document.createElement('canvas');\n}; // FIXME\n\n\nvar _ctx;\n\nfunction getContext() {\n  if (!_ctx) {\n    // Use util.createCanvas instead of createCanvas\n    // because createCanvas may be overwritten in different environment\n    _ctx = createCanvas().getContext('2d');\n  }\n\n  return _ctx;\n}\n/**\n * 查询数组中元素的index\n * @memberOf module:zrender/core/util\n */\n\n\nfunction indexOf(array, value) {\n  if (array) {\n    if (array.indexOf) {\n      return array.indexOf(value);\n    }\n\n    for (var i = 0, len = array.length; i < len; i++) {\n      if (array[i] === value) {\n        return i;\n      }\n    }\n  }\n\n  return -1;\n}\n/**\n * 构造类继承关系\n *\n * @memberOf module:zrender/core/util\n * @param {Function} clazz 源类\n * @param {Function} baseClazz 基类\n */\n\n\nfunction inherits(clazz, baseClazz) {\n  var clazzPrototype = clazz.prototype;\n\n  function F() {}\n\n  F.prototype = baseClazz.prototype;\n  clazz.prototype = new F();\n\n  for (var prop in clazzPrototype) {\n    clazz.prototype[prop] = clazzPrototype[prop];\n  }\n\n  clazz.prototype.constructor = clazz;\n  clazz.superClass = baseClazz;\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {Object|Function} target\n * @param {Object|Function} sorce\n * @param {boolean} overlay\n */\n\n\nfunction mixin(target, source, overlay) {\n  target = 'prototype' in target ? target.prototype : target;\n  source = 'prototype' in source ? source.prototype : source;\n  defaults(target, source, overlay);\n}\n/**\n * Consider typed array.\n * @param {Array|TypedArray} data\n */\n\n\nfunction isArrayLike(data) {\n  if (!data) {\n    return;\n  }\n\n  if (typeof data == 'string') {\n    return false;\n  }\n\n  return typeof data.length == 'number';\n}\n/**\n * 数组或对象遍历\n * @memberOf module:zrender/core/util\n * @param {Object|Array} obj\n * @param {Function} cb\n * @param {*} [context]\n */\n\n\nfunction each(obj, cb, context) {\n  if (!(obj && cb)) {\n    return;\n  }\n\n  if (obj.forEach && obj.forEach === nativeForEach) {\n    obj.forEach(cb, context);\n  } else if (obj.length === +obj.length) {\n    for (var i = 0, len = obj.length; i < len; i++) {\n      cb.call(context, obj[i], i, obj);\n    }\n  } else {\n    for (var key in obj) {\n      if (obj.hasOwnProperty(key)) {\n        cb.call(context, obj[key], key, obj);\n      }\n    }\n  }\n}\n/**\n * 数组映射\n * @memberOf module:zrender/core/util\n * @param {Array} obj\n * @param {Function} cb\n * @param {*} [context]\n * @return {Array}\n */\n\n\nfunction map(obj, cb, context) {\n  if (!(obj && cb)) {\n    return;\n  }\n\n  if (obj.map && obj.map === nativeMap) {\n    return obj.map(cb, context);\n  } else {\n    var result = [];\n\n    for (var i = 0, len = obj.length; i < len; i++) {\n      result.push(cb.call(context, obj[i], i, obj));\n    }\n\n    return result;\n  }\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {Array} obj\n * @param {Function} cb\n * @param {Object} [memo]\n * @param {*} [context]\n * @return {Array}\n */\n\n\nfunction reduce(obj, cb, memo, context) {\n  if (!(obj && cb)) {\n    return;\n  }\n\n  if (obj.reduce && obj.reduce === nativeReduce) {\n    return obj.reduce(cb, memo, context);\n  } else {\n    for (var i = 0, len = obj.length; i < len; i++) {\n      memo = cb.call(context, memo, obj[i], i, obj);\n    }\n\n    return memo;\n  }\n}\n/**\n * 数组过滤\n * @memberOf module:zrender/core/util\n * @param {Array} obj\n * @param {Function} cb\n * @param {*} [context]\n * @return {Array}\n */\n\n\nfunction filter(obj, cb, context) {\n  if (!(obj && cb)) {\n    return;\n  }\n\n  if (obj.filter && obj.filter === nativeFilter) {\n    return obj.filter(cb, context);\n  } else {\n    var result = [];\n\n    for (var i = 0, len = obj.length; i < len; i++) {\n      if (cb.call(context, obj[i], i, obj)) {\n        result.push(obj[i]);\n      }\n    }\n\n    return result;\n  }\n}\n/**\n * 数组项查找\n * @memberOf module:zrender/core/util\n * @param {Array} obj\n * @param {Function} cb\n * @param {*} [context]\n * @return {*}\n */\n\n\nfunction find(obj, cb, context) {\n  if (!(obj && cb)) {\n    return;\n  }\n\n  for (var i = 0, len = obj.length; i < len; i++) {\n    if (cb.call(context, obj[i], i, obj)) {\n      return obj[i];\n    }\n  }\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {Function} func\n * @param {*} context\n * @return {Function}\n */\n\n\nfunction bind(func, context) {\n  var args = nativeSlice.call(arguments, 2);\n  return function () {\n    return func.apply(context, args.concat(nativeSlice.call(arguments)));\n  };\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {Function} func\n * @return {Function}\n */\n\n\nfunction curry(func) {\n  var args = nativeSlice.call(arguments, 1);\n  return function () {\n    return func.apply(this, args.concat(nativeSlice.call(arguments)));\n  };\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\n\n\nfunction isArray(value) {\n  return objToString.call(value) === '[object Array]';\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\n\n\nfunction isFunction(value) {\n  return typeof value === 'function';\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\n\n\nfunction isString(value) {\n  return objToString.call(value) === '[object String]';\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\n\n\nfunction isObject(value) {\n  // Avoid a V8 JIT bug in Chrome 19-20.\n  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n  var type = typeof value;\n  return type === 'function' || !!value && type == 'object';\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\n\n\nfunction isBuiltInObject(value) {\n  return !!BUILTIN_OBJECT[objToString.call(value)];\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {*} value\n * @return {boolean}\n */\n\n\nfunction isDom(value) {\n  return typeof value === 'object' && typeof value.nodeType === 'number' && typeof value.ownerDocument === 'object';\n}\n/**\n * Whether is exactly NaN. Notice isNaN('a') returns true.\n * @param {*} value\n * @return {boolean}\n */\n\n\nfunction eqNaN(value) {\n  return value !== value;\n}\n/**\n * If value1 is not null, then return value1, otherwise judget rest of values.\n * Low performance.\n * @memberOf module:zrender/core/util\n * @return {*} Final value\n */\n\n\nfunction retrieve(values) {\n  for (var i = 0, len = arguments.length; i < len; i++) {\n    if (arguments[i] != null) {\n      return arguments[i];\n    }\n  }\n}\n\nfunction retrieve2(value0, value1) {\n  return value0 != null ? value0 : value1;\n}\n\nfunction retrieve3(value0, value1, value2) {\n  return value0 != null ? value0 : value1 != null ? value1 : value2;\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {Array} arr\n * @param {number} startIndex\n * @param {number} endIndex\n * @return {Array}\n */\n\n\nfunction slice() {\n  return Function.call.apply(nativeSlice, arguments);\n}\n/**\n * Normalize css liked array configuration\n * e.g.\n *  3 => [3, 3, 3, 3]\n *  [4, 2] => [4, 2, 4, 2]\n *  [4, 3, 2] => [4, 3, 2, 3]\n * @param {number|Array.<number>} val\n * @return {Array.<number>}\n */\n\n\nfunction normalizeCssArray(val) {\n  if (typeof val === 'number') {\n    return [val, val, val, val];\n  }\n\n  var len = val.length;\n\n  if (len === 2) {\n    // vertical | horizontal\n    return [val[0], val[1], val[0], val[1]];\n  } else if (len === 3) {\n    // top | horizontal | bottom\n    return [val[0], val[1], val[2], val[1]];\n  }\n\n  return val;\n}\n/**\n * @memberOf module:zrender/core/util\n * @param {boolean} condition\n * @param {string} message\n */\n\n\nfunction assert(condition, message) {\n  if (!condition) {\n    throw new Error(message);\n  }\n}\n\nvar primitiveKey = '__ec_primitive__';\n/**\n * Set an object as primitive to be ignored traversing children in clone or merge\n */\n\nfunction setAsPrimitive(obj) {\n  obj[primitiveKey] = true;\n}\n\nfunction isPrimitive(obj) {\n  return obj[primitiveKey];\n}\n/**\n * @constructor\n * @param {Object} obj Only apply `ownProperty`.\n */\n\n\nfunction HashMap(obj) {\n  obj && each(obj, function (value, key) {\n    this.set(key, value);\n  }, this);\n} // Add prefix to avoid conflict with Object.prototype.\n\n\nvar HASH_MAP_PREFIX = '_ec_';\nvar HASH_MAP_PREFIX_LENGTH = 4;\nHashMap.prototype = {\n  constructor: HashMap,\n  // Do not provide `has` method to avoid defining what is `has`.\n  // (We usually treat `null` and `undefined` as the same, different\n  // from ES6 Map).\n  get: function (key) {\n    return this[HASH_MAP_PREFIX + key];\n  },\n  set: function (key, value) {\n    this[HASH_MAP_PREFIX + key] = value; // Comparing with invocation chaining, `return value` is more commonly\n    // used in this case: `var someVal = map.set('a', genVal());`\n\n    return value;\n  },\n  // Although util.each can be performed on this hashMap directly, user\n  // should not use the exposed keys, who are prefixed.\n  each: function (cb, context) {\n    context !== void 0 && (cb = bind(cb, context));\n\n    for (var prefixedKey in this) {\n      this.hasOwnProperty(prefixedKey) && cb(this[prefixedKey], prefixedKey.slice(HASH_MAP_PREFIX_LENGTH));\n    }\n  },\n  // Do not use this method if performance sensitive.\n  removeKey: function (key) {\n    delete this[HASH_MAP_PREFIX + key];\n  }\n};\n\nfunction createHashMap(obj) {\n  return new HashMap(obj);\n}\n\nfunction noop() {}\n\nexports.$override = $override;\nexports.clone = clone;\nexports.merge = merge;\nexports.mergeAll = mergeAll;\nexports.extend = extend;\nexports.defaults = defaults;\nexports.createCanvas = createCanvas;\nexports.getContext = getContext;\nexports.indexOf = indexOf;\nexports.inherits = inherits;\nexports.mixin = mixin;\nexports.isArrayLike = isArrayLike;\nexports.each = each;\nexports.map = map;\nexports.reduce = reduce;\nexports.filter = filter;\nexports.find = find;\nexports.bind = bind;\nexports.curry = curry;\nexports.isArray = isArray;\nexports.isFunction = isFunction;\nexports.isString = isString;\nexports.isObject = isObject;\nexports.isBuiltInObject = isBuiltInObject;\nexports.isDom = isDom;\nexports.eqNaN = eqNaN;\nexports.retrieve = retrieve;\nexports.retrieve2 = retrieve2;\nexports.retrieve3 = retrieve3;\nexports.slice = slice;\nexports.normalizeCssArray = normalizeCssArray;\nexports.assert = assert;\nexports.setAsPrimitive = setAsPrimitive;\nexports.isPrimitive = isPrimitive;\nexports.createHashMap = createHashMap;\nexports.noop = noop;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Displayable = __webpack_require__(12);\n\nvar zrUtil = __webpack_require__(0);\n\nvar PathProxy = __webpack_require__(6);\n\nvar pathContain = __webpack_require__(50);\n\nvar Pattern = __webpack_require__(56);\n\nvar getCanvasPattern = Pattern.prototype.getCanvasPattern;\nvar abs = Math.abs;\nvar pathProxyForDraw = new PathProxy(true);\n/**\n * @alias module:zrender/graphic/Path\n * @extends module:zrender/graphic/Displayable\n * @constructor\n * @param {Object} opts\n */\n\nfunction Path(opts) {\n  Displayable.call(this, opts);\n  /**\n   * @type {module:zrender/core/PathProxy}\n   * @readOnly\n   */\n\n  this.path = null;\n}\n\nPath.prototype = {\n  constructor: Path,\n  type: 'path',\n  __dirtyPath: true,\n  strokeContainThreshold: 5,\n  brush: function (ctx, prevEl) {\n    var style = this.style;\n    var path = this.path || pathProxyForDraw;\n    var hasStroke = style.hasStroke();\n    var hasFill = style.hasFill();\n    var fill = style.fill;\n    var stroke = style.stroke;\n    var hasFillGradient = hasFill && !!fill.colorStops;\n    var hasStrokeGradient = hasStroke && !!stroke.colorStops;\n    var hasFillPattern = hasFill && !!fill.image;\n    var hasStrokePattern = hasStroke && !!stroke.image;\n    style.bind(ctx, this, prevEl);\n    this.setTransform(ctx);\n\n    if (this.__dirty) {\n      var rect; // Update gradient because bounding rect may changed\n\n      if (hasFillGradient) {\n        rect = rect || this.getBoundingRect();\n        this._fillGradient = style.getGradient(ctx, fill, rect);\n      }\n\n      if (hasStrokeGradient) {\n        rect = rect || this.getBoundingRect();\n        this._strokeGradient = style.getGradient(ctx, stroke, rect);\n      }\n    } // Use the gradient or pattern\n\n\n    if (hasFillGradient) {\n      // PENDING If may have affect the state\n      ctx.fillStyle = this._fillGradient;\n    } else if (hasFillPattern) {\n      ctx.fillStyle = getCanvasPattern.call(fill, ctx);\n    }\n\n    if (hasStrokeGradient) {\n      ctx.strokeStyle = this._strokeGradient;\n    } else if (hasStrokePattern) {\n      ctx.strokeStyle = getCanvasPattern.call(stroke, ctx);\n    }\n\n    var lineDash = style.lineDash;\n    var lineDashOffset = style.lineDashOffset;\n    var ctxLineDash = !!ctx.setLineDash; // Update path sx, sy\n\n    var scale = this.getGlobalScale();\n    path.setScale(scale[0], scale[1]); // Proxy context\n    // Rebuild path in following 2 cases\n    // 1. Path is dirty\n    // 2. Path needs javascript implemented lineDash stroking.\n    //    In this case, lineDash information will not be saved in PathProxy\n\n    if (this.__dirtyPath || lineDash && !ctxLineDash && hasStroke) {\n      path.beginPath(ctx); // Setting line dash before build path\n\n      if (lineDash && !ctxLineDash) {\n        path.setLineDash(lineDash);\n        path.setLineDashOffset(lineDashOffset);\n      }\n\n      this.buildPath(path, this.shape, false); // Clear path dirty flag\n\n      if (this.path) {\n        this.__dirtyPath = false;\n      }\n    } else {\n      // Replay path building\n      ctx.beginPath();\n      this.path.rebuildPath(ctx);\n    }\n\n    hasFill && path.fill(ctx);\n\n    if (lineDash && ctxLineDash) {\n      ctx.setLineDash(lineDash);\n      ctx.lineDashOffset = lineDashOffset;\n    }\n\n    hasStroke && path.stroke(ctx);\n\n    if (lineDash && ctxLineDash) {\n      // PENDING\n      // Remove lineDash\n      ctx.setLineDash([]);\n    }\n\n    this.restoreTransform(ctx); // Draw rect text\n\n    if (style.text != null) {\n      this.drawRectText(ctx, this.getBoundingRect());\n    }\n  },\n  // When bundling path, some shape may decide if use moveTo to begin a new subpath or closePath\n  // Like in circle\n  buildPath: function (ctx, shapeCfg, inBundle) {},\n  createPathProxy: function () {\n    this.path = new PathProxy();\n  },\n  getBoundingRect: function () {\n    var rect = this._rect;\n    var style = this.style;\n    var needsUpdateRect = !rect;\n\n    if (needsUpdateRect) {\n      var path = this.path;\n\n      if (!path) {\n        // Create path on demand.\n        path = this.path = new PathProxy();\n      }\n\n      if (this.__dirtyPath) {\n        path.beginPath();\n        this.buildPath(path, this.shape, false);\n      }\n\n      rect = path.getBoundingRect();\n    }\n\n    this._rect = rect;\n\n    if (style.hasStroke()) {\n      // Needs update rect with stroke lineWidth when\n      // 1. Element changes scale or lineWidth\n      // 2. Shape is changed\n      var rectWithStroke = this._rectWithStroke || (this._rectWithStroke = rect.clone());\n\n      if (this.__dirty || needsUpdateRect) {\n        rectWithStroke.copy(rect); // FIXME Must after updateTransform\n\n        var w = style.lineWidth; // PENDING, Min line width is needed when line is horizontal or vertical\n\n        var lineScale = style.strokeNoScale ? this.getLineScale() : 1; // Only add extra hover lineWidth when there are no fill\n\n        if (!style.hasFill()) {\n          w = Math.max(w, this.strokeContainThreshold || 4);\n        } // Consider line width\n        // Line scale can't be 0;\n\n\n        if (lineScale > 1e-10) {\n          rectWithStroke.width += w / lineScale;\n          rectWithStroke.height += w / lineScale;\n          rectWithStroke.x -= w / lineScale / 2;\n          rectWithStroke.y -= w / lineScale / 2;\n        }\n      } // Return rect with stroke\n\n\n      return rectWithStroke;\n    }\n\n    return rect;\n  },\n  contain: function (x, y) {\n    var localPos = this.transformCoordToLocal(x, y);\n    var rect = this.getBoundingRect();\n    var style = this.style;\n    x = localPos[0];\n    y = localPos[1];\n\n    if (rect.contain(x, y)) {\n      var pathData = this.path.data;\n\n      if (style.hasStroke()) {\n        var lineWidth = style.lineWidth;\n        var lineScale = style.strokeNoScale ? this.getLineScale() : 1; // Line scale can't be 0;\n\n        if (lineScale > 1e-10) {\n          // Only add extra hover lineWidth when there are no fill\n          if (!style.hasFill()) {\n            lineWidth = Math.max(lineWidth, this.strokeContainThreshold);\n          }\n\n          if (pathContain.containStroke(pathData, lineWidth / lineScale, x, y)) {\n            return true;\n          }\n        }\n      }\n\n      if (style.hasFill()) {\n        return pathContain.contain(pathData, x, y);\n      }\n    }\n\n    return false;\n  },\n\n  /**\n   * @param  {boolean} dirtyPath\n   */\n  dirty: function (dirtyPath) {\n    if (dirtyPath == null) {\n      dirtyPath = true;\n    } // Only mark dirty, not mark clean\n\n\n    if (dirtyPath) {\n      this.__dirtyPath = dirtyPath;\n      this._rect = null;\n    }\n\n    this.__dirty = true;\n    this.__zr && this.__zr.refresh(); // Used as a clipping path\n\n    if (this.__clipTarget) {\n      this.__clipTarget.dirty();\n    }\n  },\n\n  /**\n   * Alias for animate('shape')\n   * @param {boolean} loop\n   */\n  animateShape: function (loop) {\n    return this.animate('shape', loop);\n  },\n  // Overwrite attrKV\n  attrKV: function (key, value) {\n    // FIXME\n    if (key === 'shape') {\n      this.setShape(value);\n      this.__dirtyPath = true;\n      this._rect = null;\n    } else {\n      Displayable.prototype.attrKV.call(this, key, value);\n    }\n  },\n\n  /**\n   * @param {Object|string} key\n   * @param {*} value\n   */\n  setShape: function (key, value) {\n    var shape = this.shape; // Path from string may not have shape\n\n    if (shape) {\n      if (zrUtil.isObject(key)) {\n        for (var name in key) {\n          if (key.hasOwnProperty(name)) {\n            shape[name] = key[name];\n          }\n        }\n      } else {\n        shape[key] = value;\n      }\n\n      this.dirty(true);\n    }\n\n    return this;\n  },\n  getLineScale: function () {\n    var m = this.transform; // Get the line scale.\n    // Determinant of `m` means how much the area is enlarged by the\n    // transformation. So its square root can be used as a scale factor\n    // for width.\n\n    return m && abs(m[0] - 1) > 1e-10 && abs(m[3] - 1) > 1e-10 ? Math.sqrt(abs(m[0] * m[3] - m[2] * m[1])) : 1;\n  }\n};\n/**\n * 扩展一个 Path element, 比如星形，圆等。\n * Extend a path element\n * @param {Object} props\n * @param {string} props.type Path type\n * @param {Function} props.init Initialize\n * @param {Function} props.buildPath Overwrite buildPath method\n * @param {Object} [props.style] Extended default style config\n * @param {Object} [props.shape] Extended default shape config\n */\n\nPath.extend = function (defaults) {\n  var Sub = function (opts) {\n    Path.call(this, opts);\n\n    if (defaults.style) {\n      // Extend default style\n      this.style.extendFrom(defaults.style, false);\n    } // Extend default shape\n\n\n    var defaultShape = defaults.shape;\n\n    if (defaultShape) {\n      this.shape = this.shape || {};\n      var thisShape = this.shape;\n\n      for (var name in defaultShape) {\n        if (!thisShape.hasOwnProperty(name) && defaultShape.hasOwnProperty(name)) {\n          thisShape[name] = defaultShape[name];\n        }\n      }\n    }\n\n    defaults.init && defaults.init.call(this, opts);\n  };\n\n  zrUtil.inherits(Sub, Path); // FIXME 不能 extend position, rotation 等引用对象\n\n  for (var name in defaults) {\n    // Extending prototype values and methods\n    if (name !== 'style' && name !== 'shape') {\n      Sub.prototype[name] = defaults[name];\n    }\n  }\n\n  return Sub;\n};\n\nzrUtil.inherits(Path, Displayable);\nvar _default = Path;\nmodule.exports = _default;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports) {\n\nvar ArrayCtor = typeof Float32Array === 'undefined' ? Array : Float32Array;\n/**\n * 创建一个向量\n * @param {number} [x=0]\n * @param {number} [y=0]\n * @return {Vector2}\n */\n\nfunction create(x, y) {\n  var out = new ArrayCtor(2);\n\n  if (x == null) {\n    x = 0;\n  }\n\n  if (y == null) {\n    y = 0;\n  }\n\n  out[0] = x;\n  out[1] = y;\n  return out;\n}\n/**\n * 复制向量数据\n * @param {Vector2} out\n * @param {Vector2} v\n * @return {Vector2}\n */\n\n\nfunction copy(out, v) {\n  out[0] = v[0];\n  out[1] = v[1];\n  return out;\n}\n/**\n * 克隆一个向量\n * @param {Vector2} v\n * @return {Vector2}\n */\n\n\nfunction clone(v) {\n  var out = new ArrayCtor(2);\n  out[0] = v[0];\n  out[1] = v[1];\n  return out;\n}\n/**\n * 设置向量的两个项\n * @param {Vector2} out\n * @param {number} a\n * @param {number} b\n * @return {Vector2} 结果\n */\n\n\nfunction set(out, a, b) {\n  out[0] = a;\n  out[1] = b;\n  return out;\n}\n/**\n * 向量相加\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\n */\n\n\nfunction add(out, v1, v2) {\n  out[0] = v1[0] + v2[0];\n  out[1] = v1[1] + v2[1];\n  return out;\n}\n/**\n * 向量缩放后相加\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\n * @param {number} a\n */\n\n\nfunction scaleAndAdd(out, v1, v2, a) {\n  out[0] = v1[0] + v2[0] * a;\n  out[1] = v1[1] + v2[1] * a;\n  return out;\n}\n/**\n * 向量相减\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\n */\n\n\nfunction sub(out, v1, v2) {\n  out[0] = v1[0] - v2[0];\n  out[1] = v1[1] - v2[1];\n  return out;\n}\n/**\n * 向量长度\n * @param {Vector2} v\n * @return {number}\n */\n\n\nfunction len(v) {\n  return Math.sqrt(lenSquare(v));\n}\n\nvar length = len; // jshint ignore:line\n\n/**\n * 向量长度平方\n * @param {Vector2} v\n * @return {number}\n */\n\nfunction lenSquare(v) {\n  return v[0] * v[0] + v[1] * v[1];\n}\n\nvar lengthSquare = lenSquare;\n/**\n * 向量乘法\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\n */\n\nfunction mul(out, v1, v2) {\n  out[0] = v1[0] * v2[0];\n  out[1] = v1[1] * v2[1];\n  return out;\n}\n/**\n * 向量除法\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\n */\n\n\nfunction div(out, v1, v2) {\n  out[0] = v1[0] / v2[0];\n  out[1] = v1[1] / v2[1];\n  return out;\n}\n/**\n * 向量点乘\n * @param {Vector2} v1\n * @param {Vector2} v2\n * @return {number}\n */\n\n\nfunction dot(v1, v2) {\n  return v1[0] * v2[0] + v1[1] * v2[1];\n}\n/**\n * 向量缩放\n * @param {Vector2} out\n * @param {Vector2} v\n * @param {number} s\n */\n\n\nfunction scale(out, v, s) {\n  out[0] = v[0] * s;\n  out[1] = v[1] * s;\n  return out;\n}\n/**\n * 向量归一化\n * @param {Vector2} out\n * @param {Vector2} v\n */\n\n\nfunction normalize(out, v) {\n  var d = len(v);\n\n  if (d === 0) {\n    out[0] = 0;\n    out[1] = 0;\n  } else {\n    out[0] = v[0] / d;\n    out[1] = v[1] / d;\n  }\n\n  return out;\n}\n/**\n * 计算向量间距离\n * @param {Vector2} v1\n * @param {Vector2} v2\n * @return {number}\n */\n\n\nfunction distance(v1, v2) {\n  return Math.sqrt((v1[0] - v2[0]) * (v1[0] - v2[0]) + (v1[1] - v2[1]) * (v1[1] - v2[1]));\n}\n\nvar dist = distance;\n/**\n * 向量距离平方\n * @param {Vector2} v1\n * @param {Vector2} v2\n * @return {number}\n */\n\nfunction distanceSquare(v1, v2) {\n  return (v1[0] - v2[0]) * (v1[0] - v2[0]) + (v1[1] - v2[1]) * (v1[1] - v2[1]);\n}\n\nvar distSquare = distanceSquare;\n/**\n * 求负向量\n * @param {Vector2} out\n * @param {Vector2} v\n */\n\nfunction negate(out, v) {\n  out[0] = -v[0];\n  out[1] = -v[1];\n  return out;\n}\n/**\n * 插值两个点\n * @param {Vector2} out\n * @param {Vector2} v1\n * @param {Vector2} v2\n * @param {number} t\n */\n\n\nfunction lerp(out, v1, v2, t) {\n  out[0] = v1[0] + t * (v2[0] - v1[0]);\n  out[1] = v1[1] + t * (v2[1] - v1[1]);\n  return out;\n}\n/**\n * 矩阵左乘向量\n * @param {Vector2} out\n * @param {Vector2} v\n * @param {Vector2} m\n */\n\n\nfunction applyTransform(out, v, m) {\n  var x = v[0];\n  var y = v[1];\n  out[0] = m[0] * x + m[2] * y + m[4];\n  out[1] = m[1] * x + m[3] * y + m[5];\n  return out;\n}\n/**\n * 求两个向量最小值\n * @param  {Vector2} out\n * @param  {Vector2} v1\n * @param  {Vector2} v2\n */\n\n\nfunction min(out, v1, v2) {\n  out[0] = Math.min(v1[0], v2[0]);\n  out[1] = Math.min(v1[1], v2[1]);\n  return out;\n}\n/**\n * 求两个向量最大值\n * @param  {Vector2} out\n * @param  {Vector2} v1\n * @param  {Vector2} v2\n */\n\n\nfunction max(out, v1, v2) {\n  out[0] = Math.max(v1[0], v2[0]);\n  out[1] = Math.max(v1[1], v2[1]);\n  return out;\n}\n\nexports.create = create;\nexports.copy = copy;\nexports.clone = clone;\nexports.set = set;\nexports.add = add;\nexports.scaleAndAdd = scaleAndAdd;\nexports.sub = sub;\nexports.len = len;\nexports.length = length;\nexports.lenSquare = lenSquare;\nexports.lengthSquare = lengthSquare;\nexports.mul = mul;\nexports.div = div;\nexports.dot = dot;\nexports.scale = scale;\nexports.normalize = normalize;\nexports.distance = distance;\nexports.dist = dist;\nexports.distanceSquare = distanceSquare;\nexports.distSquare = distSquare;\nexports.negate = negate;\nexports.lerp = lerp;\nexports.applyTransform = applyTransform;\nexports.min = min;\nexports.max = max;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar vec2 = __webpack_require__(2);\n\nvar matrix = __webpack_require__(8);\n\n/**\n * @module echarts/core/BoundingRect\n */\nvar v2ApplyTransform = vec2.applyTransform;\nvar mathMin = Math.min;\nvar mathMax = Math.max;\n/**\n * @alias module:echarts/core/BoundingRect\n */\n\nfunction BoundingRect(x, y, width, height) {\n  if (width < 0) {\n    x = x + width;\n    width = -width;\n  }\n\n  if (height < 0) {\n    y = y + height;\n    height = -height;\n  }\n  /**\n   * @type {number}\n   */\n\n\n  this.x = x;\n  /**\n   * @type {number}\n   */\n\n  this.y = y;\n  /**\n   * @type {number}\n   */\n\n  this.width = width;\n  /**\n   * @type {number}\n   */\n\n  this.height = height;\n}\n\nBoundingRect.prototype = {\n  constructor: BoundingRect,\n\n  /**\n   * @param {module:echarts/core/BoundingRect} other\n   */\n  union: function (other) {\n    var x = mathMin(other.x, this.x);\n    var y = mathMin(other.y, this.y);\n    this.width = mathMax(other.x + other.width, this.x + this.width) - x;\n    this.height = mathMax(other.y + other.height, this.y + this.height) - y;\n    this.x = x;\n    this.y = y;\n  },\n\n  /**\n   * @param {Array.<number>} m\n   * @methods\n   */\n  applyTransform: function () {\n    var lt = [];\n    var rb = [];\n    var lb = [];\n    var rt = [];\n    return function (m) {\n      // In case usage like this\n      // el.getBoundingRect().applyTransform(el.transform)\n      // And element has no transform\n      if (!m) {\n        return;\n      }\n\n      lt[0] = lb[0] = this.x;\n      lt[1] = rt[1] = this.y;\n      rb[0] = rt[0] = this.x + this.width;\n      rb[1] = lb[1] = this.y + this.height;\n      v2ApplyTransform(lt, lt, m);\n      v2ApplyTransform(rb, rb, m);\n      v2ApplyTransform(lb, lb, m);\n      v2ApplyTransform(rt, rt, m);\n      this.x = mathMin(lt[0], rb[0], lb[0], rt[0]);\n      this.y = mathMin(lt[1], rb[1], lb[1], rt[1]);\n      var maxX = mathMax(lt[0], rb[0], lb[0], rt[0]);\n      var maxY = mathMax(lt[1], rb[1], lb[1], rt[1]);\n      this.width = maxX - this.x;\n      this.height = maxY - this.y;\n    };\n  }(),\n\n  /**\n   * Calculate matrix of transforming from self to target rect\n   * @param  {module:zrender/core/BoundingRect} b\n   * @return {Array.<number>}\n   */\n  calculateTransform: function (b) {\n    var a = this;\n    var sx = b.width / a.width;\n    var sy = b.height / a.height;\n    var m = matrix.create(); // 矩阵右乘\n\n    matrix.translate(m, m, [-a.x, -a.y]);\n    matrix.scale(m, m, [sx, sy]);\n    matrix.translate(m, m, [b.x, b.y]);\n    return m;\n  },\n\n  /**\n   * @param {(module:echarts/core/BoundingRect|Object)} b\n   * @return {boolean}\n   */\n  intersect: function (b) {\n    if (!b) {\n      return false;\n    }\n\n    if (!(b instanceof BoundingRect)) {\n      // Normalize negative width/height.\n      b = BoundingRect.create(b);\n    }\n\n    var a = this;\n    var ax0 = a.x;\n    var ax1 = a.x + a.width;\n    var ay0 = a.y;\n    var ay1 = a.y + a.height;\n    var bx0 = b.x;\n    var bx1 = b.x + b.width;\n    var by0 = b.y;\n    var by1 = b.y + b.height;\n    return !(ax1 < bx0 || bx1 < ax0 || ay1 < by0 || by1 < ay0);\n  },\n  contain: function (x, y) {\n    var rect = this;\n    return x >= rect.x && x <= rect.x + rect.width && y >= rect.y && y <= rect.y + rect.height;\n  },\n\n  /**\n   * @return {module:echarts/core/BoundingRect}\n   */\n  clone: function () {\n    return new BoundingRect(this.x, this.y, this.width, this.height);\n  },\n\n  /**\n   * Copy from another rect\n   */\n  copy: function (other) {\n    this.x = other.x;\n    this.y = other.y;\n    this.width = other.width;\n    this.height = other.height;\n  },\n  plain: function () {\n    return {\n      x: this.x,\n      y: this.y,\n      width: this.width,\n      height: this.height\n    };\n  }\n};\n/**\n * @param {Object|module:zrender/core/BoundingRect} rect\n * @param {number} rect.x\n * @param {number} rect.y\n * @param {number} rect.width\n * @param {number} rect.height\n * @return {module:zrender/core/BoundingRect}\n */\n\nBoundingRect.create = function (rect) {\n  return new BoundingRect(rect.x, rect.y, rect.width, rect.height);\n};\n\nvar _default = BoundingRect;\nmodule.exports = _default;\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar _vector = __webpack_require__(2);\n\nvar v2Create = _vector.create;\nvar v2DistSquare = _vector.distSquare;\n\n/**\n * 曲线辅助模块\n * @module zrender/core/curve\n * @author pissang(https://www.github.com/pissang)\n */\nvar mathPow = Math.pow;\nvar mathSqrt = Math.sqrt;\nvar EPSILON = 1e-8;\nvar EPSILON_NUMERIC = 1e-4;\nvar THREE_SQRT = mathSqrt(3);\nvar ONE_THIRD = 1 / 3; // 临时变量\n\nvar _v0 = v2Create();\n\nvar _v1 = v2Create();\n\nvar _v2 = v2Create();\n\nfunction isAroundZero(val) {\n  return val > -EPSILON && val < EPSILON;\n}\n\nfunction isNotAroundZero(val) {\n  return val > EPSILON || val < -EPSILON;\n}\n/**\n * 计算三次贝塞尔值\n * @memberOf module:zrender/core/curve\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} p3\n * @param  {number} t\n * @return {number}\n */\n\n\nfunction cubicAt(p0, p1, p2, p3, t) {\n  var onet = 1 - t;\n  return onet * onet * (onet * p0 + 3 * t * p1) + t * t * (t * p3 + 3 * onet * p2);\n}\n/**\n * 计算三次贝塞尔导数值\n * @memberOf module:zrender/core/curve\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} p3\n * @param  {number} t\n * @return {number}\n */\n\n\nfunction cubicDerivativeAt(p0, p1, p2, p3, t) {\n  var onet = 1 - t;\n  return 3 * (((p1 - p0) * onet + 2 * (p2 - p1) * t) * onet + (p3 - p2) * t * t);\n}\n/**\n * 计算三次贝塞尔方程根，使用盛金公式\n * @memberOf module:zrender/core/curve\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} p3\n * @param  {number} val\n * @param  {Array.<number>} roots\n * @return {number} 有效根数目\n */\n\n\nfunction cubicRootAt(p0, p1, p2, p3, val, roots) {\n  // Evaluate roots of cubic functions\n  var a = p3 + 3 * (p1 - p2) - p0;\n  var b = 3 * (p2 - p1 * 2 + p0);\n  var c = 3 * (p1 - p0);\n  var d = p0 - val;\n  var A = b * b - 3 * a * c;\n  var B = b * c - 9 * a * d;\n  var C = c * c - 3 * b * d;\n  var n = 0;\n\n  if (isAroundZero(A) && isAroundZero(B)) {\n    if (isAroundZero(b)) {\n      roots[0] = 0;\n    } else {\n      var t1 = -c / b; //t1, t2, t3, b is not zero\n\n      if (t1 >= 0 && t1 <= 1) {\n        roots[n++] = t1;\n      }\n    }\n  } else {\n    var disc = B * B - 4 * A * C;\n\n    if (isAroundZero(disc)) {\n      var K = B / A;\n      var t1 = -b / a + K; // t1, a is not zero\n\n      var t2 = -K / 2; // t2, t3\n\n      if (t1 >= 0 && t1 <= 1) {\n        roots[n++] = t1;\n      }\n\n      if (t2 >= 0 && t2 <= 1) {\n        roots[n++] = t2;\n      }\n    } else if (disc > 0) {\n      var discSqrt = mathSqrt(disc);\n      var Y1 = A * b + 1.5 * a * (-B + discSqrt);\n      var Y2 = A * b + 1.5 * a * (-B - discSqrt);\n\n      if (Y1 < 0) {\n        Y1 = -mathPow(-Y1, ONE_THIRD);\n      } else {\n        Y1 = mathPow(Y1, ONE_THIRD);\n      }\n\n      if (Y2 < 0) {\n        Y2 = -mathPow(-Y2, ONE_THIRD);\n      } else {\n        Y2 = mathPow(Y2, ONE_THIRD);\n      }\n\n      var t1 = (-b - (Y1 + Y2)) / (3 * a);\n\n      if (t1 >= 0 && t1 <= 1) {\n        roots[n++] = t1;\n      }\n    } else {\n      var T = (2 * A * b - 3 * a * B) / (2 * mathSqrt(A * A * A));\n      var theta = Math.acos(T) / 3;\n      var ASqrt = mathSqrt(A);\n      var tmp = Math.cos(theta);\n      var t1 = (-b - 2 * ASqrt * tmp) / (3 * a);\n      var t2 = (-b + ASqrt * (tmp + THREE_SQRT * Math.sin(theta))) / (3 * a);\n      var t3 = (-b + ASqrt * (tmp - THREE_SQRT * Math.sin(theta))) / (3 * a);\n\n      if (t1 >= 0 && t1 <= 1) {\n        roots[n++] = t1;\n      }\n\n      if (t2 >= 0 && t2 <= 1) {\n        roots[n++] = t2;\n      }\n\n      if (t3 >= 0 && t3 <= 1) {\n        roots[n++] = t3;\n      }\n    }\n  }\n\n  return n;\n}\n/**\n * 计算三次贝塞尔方程极限值的位置\n * @memberOf module:zrender/core/curve\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} p3\n * @param  {Array.<number>} extrema\n * @return {number} 有效数目\n */\n\n\nfunction cubicExtrema(p0, p1, p2, p3, extrema) {\n  var b = 6 * p2 - 12 * p1 + 6 * p0;\n  var a = 9 * p1 + 3 * p3 - 3 * p0 - 9 * p2;\n  var c = 3 * p1 - 3 * p0;\n  var n = 0;\n\n  if (isAroundZero(a)) {\n    if (isNotAroundZero(b)) {\n      var t1 = -c / b;\n\n      if (t1 >= 0 && t1 <= 1) {\n        extrema[n++] = t1;\n      }\n    }\n  } else {\n    var disc = b * b - 4 * a * c;\n\n    if (isAroundZero(disc)) {\n      extrema[0] = -b / (2 * a);\n    } else if (disc > 0) {\n      var discSqrt = mathSqrt(disc);\n      var t1 = (-b + discSqrt) / (2 * a);\n      var t2 = (-b - discSqrt) / (2 * a);\n\n      if (t1 >= 0 && t1 <= 1) {\n        extrema[n++] = t1;\n      }\n\n      if (t2 >= 0 && t2 <= 1) {\n        extrema[n++] = t2;\n      }\n    }\n  }\n\n  return n;\n}\n/**\n * 细分三次贝塞尔曲线\n * @memberOf module:zrender/core/curve\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} p3\n * @param  {number} t\n * @param  {Array.<number>} out\n */\n\n\nfunction cubicSubdivide(p0, p1, p2, p3, t, out) {\n  var p01 = (p1 - p0) * t + p0;\n  var p12 = (p2 - p1) * t + p1;\n  var p23 = (p3 - p2) * t + p2;\n  var p012 = (p12 - p01) * t + p01;\n  var p123 = (p23 - p12) * t + p12;\n  var p0123 = (p123 - p012) * t + p012; // Seg0\n\n  out[0] = p0;\n  out[1] = p01;\n  out[2] = p012;\n  out[3] = p0123; // Seg1\n\n  out[4] = p0123;\n  out[5] = p123;\n  out[6] = p23;\n  out[7] = p3;\n}\n/**\n * 投射点到三次贝塞尔曲线上，返回投射距离。\n * 投射点有可能会有一个或者多个，这里只返回其中距离最短的一个。\n * @param {number} x0\n * @param {number} y0\n * @param {number} x1\n * @param {number} y1\n * @param {number} x2\n * @param {number} y2\n * @param {number} x3\n * @param {number} y3\n * @param {number} x\n * @param {number} y\n * @param {Array.<number>} [out] 投射点\n * @return {number}\n */\n\n\nfunction cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, out) {\n  // http://pomax.github.io/bezierinfo/#projections\n  var t;\n  var interval = 0.005;\n  var d = Infinity;\n  var prev;\n  var next;\n  var d1;\n  var d2;\n  _v0[0] = x;\n  _v0[1] = y; // 先粗略估计一下可能的最小距离的 t 值\n  // PENDING\n\n  for (var _t = 0; _t < 1; _t += 0.05) {\n    _v1[0] = cubicAt(x0, x1, x2, x3, _t);\n    _v1[1] = cubicAt(y0, y1, y2, y3, _t);\n    d1 = v2DistSquare(_v0, _v1);\n\n    if (d1 < d) {\n      t = _t;\n      d = d1;\n    }\n  }\n\n  d = Infinity; // At most 32 iteration\n\n  for (var i = 0; i < 32; i++) {\n    if (interval < EPSILON_NUMERIC) {\n      break;\n    }\n\n    prev = t - interval;\n    next = t + interval; // t - interval\n\n    _v1[0] = cubicAt(x0, x1, x2, x3, prev);\n    _v1[1] = cubicAt(y0, y1, y2, y3, prev);\n    d1 = v2DistSquare(_v1, _v0);\n\n    if (prev >= 0 && d1 < d) {\n      t = prev;\n      d = d1;\n    } else {\n      // t + interval\n      _v2[0] = cubicAt(x0, x1, x2, x3, next);\n      _v2[1] = cubicAt(y0, y1, y2, y3, next);\n      d2 = v2DistSquare(_v2, _v0);\n\n      if (next <= 1 && d2 < d) {\n        t = next;\n        d = d2;\n      } else {\n        interval *= 0.5;\n      }\n    }\n  } // t\n\n\n  if (out) {\n    out[0] = cubicAt(x0, x1, x2, x3, t);\n    out[1] = cubicAt(y0, y1, y2, y3, t);\n  } // console.log(interval, i);\n\n\n  return mathSqrt(d);\n}\n/**\n * 计算二次方贝塞尔值\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} t\n * @return {number}\n */\n\n\nfunction quadraticAt(p0, p1, p2, t) {\n  var onet = 1 - t;\n  return onet * (onet * p0 + 2 * t * p1) + t * t * p2;\n}\n/**\n * 计算二次方贝塞尔导数值\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} t\n * @return {number}\n */\n\n\nfunction quadraticDerivativeAt(p0, p1, p2, t) {\n  return 2 * ((1 - t) * (p1 - p0) + t * (p2 - p1));\n}\n/**\n * 计算二次方贝塞尔方程根\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} t\n * @param  {Array.<number>} roots\n * @return {number} 有效根数目\n */\n\n\nfunction quadraticRootAt(p0, p1, p2, val, roots) {\n  var a = p0 - 2 * p1 + p2;\n  var b = 2 * (p1 - p0);\n  var c = p0 - val;\n  var n = 0;\n\n  if (isAroundZero(a)) {\n    if (isNotAroundZero(b)) {\n      var t1 = -c / b;\n\n      if (t1 >= 0 && t1 <= 1) {\n        roots[n++] = t1;\n      }\n    }\n  } else {\n    var disc = b * b - 4 * a * c;\n\n    if (isAroundZero(disc)) {\n      var t1 = -b / (2 * a);\n\n      if (t1 >= 0 && t1 <= 1) {\n        roots[n++] = t1;\n      }\n    } else if (disc > 0) {\n      var discSqrt = mathSqrt(disc);\n      var t1 = (-b + discSqrt) / (2 * a);\n      var t2 = (-b - discSqrt) / (2 * a);\n\n      if (t1 >= 0 && t1 <= 1) {\n        roots[n++] = t1;\n      }\n\n      if (t2 >= 0 && t2 <= 1) {\n        roots[n++] = t2;\n      }\n    }\n  }\n\n  return n;\n}\n/**\n * 计算二次贝塞尔方程极限值\n * @memberOf module:zrender/core/curve\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @return {number}\n */\n\n\nfunction quadraticExtremum(p0, p1, p2) {\n  var divider = p0 + p2 - 2 * p1;\n\n  if (divider === 0) {\n    // p1 is center of p0 and p2\n    return 0.5;\n  } else {\n    return (p0 - p1) / divider;\n  }\n}\n/**\n * 细分二次贝塞尔曲线\n * @memberOf module:zrender/core/curve\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} t\n * @param  {Array.<number>} out\n */\n\n\nfunction quadraticSubdivide(p0, p1, p2, t, out) {\n  var p01 = (p1 - p0) * t + p0;\n  var p12 = (p2 - p1) * t + p1;\n  var p012 = (p12 - p01) * t + p01; // Seg0\n\n  out[0] = p0;\n  out[1] = p01;\n  out[2] = p012; // Seg1\n\n  out[3] = p012;\n  out[4] = p12;\n  out[5] = p2;\n}\n/**\n * 投射点到二次贝塞尔曲线上，返回投射距离。\n * 投射点有可能会有一个或者多个，这里只返回其中距离最短的一个。\n * @param {number} x0\n * @param {number} y0\n * @param {number} x1\n * @param {number} y1\n * @param {number} x2\n * @param {number} y2\n * @param {number} x\n * @param {number} y\n * @param {Array.<number>} out 投射点\n * @return {number}\n */\n\n\nfunction quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, out) {\n  // http://pomax.github.io/bezierinfo/#projections\n  var t;\n  var interval = 0.005;\n  var d = Infinity;\n  _v0[0] = x;\n  _v0[1] = y; // 先粗略估计一下可能的最小距离的 t 值\n  // PENDING\n\n  for (var _t = 0; _t < 1; _t += 0.05) {\n    _v1[0] = quadraticAt(x0, x1, x2, _t);\n    _v1[1] = quadraticAt(y0, y1, y2, _t);\n    var d1 = v2DistSquare(_v0, _v1);\n\n    if (d1 < d) {\n      t = _t;\n      d = d1;\n    }\n  }\n\n  d = Infinity; // At most 32 iteration\n\n  for (var i = 0; i < 32; i++) {\n    if (interval < EPSILON_NUMERIC) {\n      break;\n    }\n\n    var prev = t - interval;\n    var next = t + interval; // t - interval\n\n    _v1[0] = quadraticAt(x0, x1, x2, prev);\n    _v1[1] = quadraticAt(y0, y1, y2, prev);\n    var d1 = v2DistSquare(_v1, _v0);\n\n    if (prev >= 0 && d1 < d) {\n      t = prev;\n      d = d1;\n    } else {\n      // t + interval\n      _v2[0] = quadraticAt(x0, x1, x2, next);\n      _v2[1] = quadraticAt(y0, y1, y2, next);\n      var d2 = v2DistSquare(_v2, _v0);\n\n      if (next <= 1 && d2 < d) {\n        t = next;\n        d = d2;\n      } else {\n        interval *= 0.5;\n      }\n    }\n  } // t\n\n\n  if (out) {\n    out[0] = quadraticAt(x0, x1, x2, t);\n    out[1] = quadraticAt(y0, y1, y2, t);\n  } // console.log(interval, i);\n\n\n  return mathSqrt(d);\n}\n\nexports.cubicAt = cubicAt;\nexports.cubicDerivativeAt = cubicDerivativeAt;\nexports.cubicRootAt = cubicRootAt;\nexports.cubicExtrema = cubicExtrema;\nexports.cubicSubdivide = cubicSubdivide;\nexports.cubicProjectPoint = cubicProjectPoint;\nexports.quadraticAt = quadraticAt;\nexports.quadraticDerivativeAt = quadraticDerivativeAt;\nexports.quadraticRootAt = quadraticRootAt;\nexports.quadraticExtremum = quadraticExtremum;\nexports.quadraticSubdivide = quadraticSubdivide;\nexports.quadraticProjectPoint = quadraticProjectPoint;\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar BoundingRect = __webpack_require__(3);\n\nvar imageHelper = __webpack_require__(10);\n\nvar _util = __webpack_require__(0);\n\nvar getContext = _util.getContext;\nvar extend = _util.extend;\nvar retrieve2 = _util.retrieve2;\nvar retrieve3 = _util.retrieve3;\nvar textWidthCache = {};\nvar textWidthCacheCounter = 0;\nvar TEXT_CACHE_MAX = 5000;\nvar STYLE_REG = /\\{([a-zA-Z0-9_]+)\\|([^}]*)\\}/g;\nvar DEFAULT_FONT = '12px sans-serif'; // Avoid assign to an exported variable, for transforming to cjs.\n\nvar methods = {};\n\nfunction $override(name, fn) {\n  methods[name] = fn;\n}\n/**\n * @public\n * @param {string} text\n * @param {string} font\n * @return {number} width\n */\n\n\nfunction getWidth(text, font) {\n  font = font || DEFAULT_FONT;\n  var key = text + ':' + font;\n\n  if (textWidthCache[key]) {\n    return textWidthCache[key];\n  }\n\n  var textLines = (text + '').split('\\n');\n  var width = 0;\n\n  for (var i = 0, l = textLines.length; i < l; i++) {\n    // textContain.measureText may be overrided in SVG or VML\n    width = Math.max(measureText(textLines[i], font).width, width);\n  }\n\n  if (textWidthCacheCounter > TEXT_CACHE_MAX) {\n    textWidthCacheCounter = 0;\n    textWidthCache = {};\n  }\n\n  textWidthCacheCounter++;\n  textWidthCache[key] = width;\n  return width;\n}\n/**\n * @public\n * @param {string} text\n * @param {string} font\n * @param {string} [textAlign='left']\n * @param {string} [textVerticalAlign='top']\n * @param {Array.<number>} [textPadding]\n * @param {Object} [rich]\n * @param {Object} [truncate]\n * @return {Object} {x, y, width, height, lineHeight}\n */\n\n\nfunction getBoundingRect(text, font, textAlign, textVerticalAlign, textPadding, rich, truncate) {\n  return rich ? getRichTextRect(text, font, textAlign, textVerticalAlign, textPadding, rich, truncate) : getPlainTextRect(text, font, textAlign, textVerticalAlign, textPadding, truncate);\n}\n\nfunction getPlainTextRect(text, font, textAlign, textVerticalAlign, textPadding, truncate) {\n  var contentBlock = parsePlainText(text, font, textPadding, truncate);\n  var outerWidth = getWidth(text, font);\n\n  if (textPadding) {\n    outerWidth += textPadding[1] + textPadding[3];\n  }\n\n  var outerHeight = contentBlock.outerHeight;\n  var x = adjustTextX(0, outerWidth, textAlign);\n  var y = adjustTextY(0, outerHeight, textVerticalAlign);\n  var rect = new BoundingRect(x, y, outerWidth, outerHeight);\n  rect.lineHeight = contentBlock.lineHeight;\n  return rect;\n}\n\nfunction getRichTextRect(text, font, textAlign, textVerticalAlign, textPadding, rich, truncate) {\n  var contentBlock = parseRichText(text, {\n    rich: rich,\n    truncate: truncate,\n    font: font,\n    textAlign: textAlign,\n    textPadding: textPadding\n  });\n  var outerWidth = contentBlock.outerWidth;\n  var outerHeight = contentBlock.outerHeight;\n  var x = adjustTextX(0, outerWidth, textAlign);\n  var y = adjustTextY(0, outerHeight, textVerticalAlign);\n  return new BoundingRect(x, y, outerWidth, outerHeight);\n}\n/**\n * @public\n * @param {number} x\n * @param {number} width\n * @param {string} [textAlign='left']\n * @return {number} Adjusted x.\n */\n\n\nfunction adjustTextX(x, width, textAlign) {\n  // FIXME Right to left language\n  if (textAlign === 'right') {\n    x -= width;\n  } else if (textAlign === 'center') {\n    x -= width / 2;\n  }\n\n  return x;\n}\n/**\n * @public\n * @param {number} y\n * @param {number} height\n * @param {string} [textVerticalAlign='top']\n * @return {number} Adjusted y.\n */\n\n\nfunction adjustTextY(y, height, textVerticalAlign) {\n  if (textVerticalAlign === 'middle') {\n    y -= height / 2;\n  } else if (textVerticalAlign === 'bottom') {\n    y -= height;\n  }\n\n  return y;\n}\n/**\n * @public\n * @param {stirng} textPosition\n * @param {Object} rect {x, y, width, height}\n * @param {number} distance\n * @return {Object} {x, y, textAlign, textVerticalAlign}\n */\n\n\nfunction adjustTextPositionOnRect(textPosition, rect, distance) {\n  var x = rect.x;\n  var y = rect.y;\n  var height = rect.height;\n  var width = rect.width;\n  var halfHeight = height / 2;\n  var textAlign = 'left';\n  var textVerticalAlign = 'top';\n\n  switch (textPosition) {\n    case 'left':\n      x -= distance;\n      y += halfHeight;\n      textAlign = 'right';\n      textVerticalAlign = 'middle';\n      break;\n\n    case 'right':\n      x += distance + width;\n      y += halfHeight;\n      textVerticalAlign = 'middle';\n      break;\n\n    case 'top':\n      x += width / 2;\n      y -= distance;\n      textAlign = 'center';\n      textVerticalAlign = 'bottom';\n      break;\n\n    case 'bottom':\n      x += width / 2;\n      y += height + distance;\n      textAlign = 'center';\n      break;\n\n    case 'inside':\n      x += width / 2;\n      y += halfHeight;\n      textAlign = 'center';\n      textVerticalAlign = 'middle';\n      break;\n\n    case 'insideLeft':\n      x += distance;\n      y += halfHeight;\n      textVerticalAlign = 'middle';\n      break;\n\n    case 'insideRight':\n      x += width - distance;\n      y += halfHeight;\n      textAlign = 'right';\n      textVerticalAlign = 'middle';\n      break;\n\n    case 'insideTop':\n      x += width / 2;\n      y += distance;\n      textAlign = 'center';\n      break;\n\n    case 'insideBottom':\n      x += width / 2;\n      y += height - distance;\n      textAlign = 'center';\n      textVerticalAlign = 'bottom';\n      break;\n\n    case 'insideTopLeft':\n      x += distance;\n      y += distance;\n      break;\n\n    case 'insideTopRight':\n      x += width - distance;\n      y += distance;\n      textAlign = 'right';\n      break;\n\n    case 'insideBottomLeft':\n      x += distance;\n      y += height - distance;\n      textVerticalAlign = 'bottom';\n      break;\n\n    case 'insideBottomRight':\n      x += width - distance;\n      y += height - distance;\n      textAlign = 'right';\n      textVerticalAlign = 'bottom';\n      break;\n  }\n\n  return {\n    x: x,\n    y: y,\n    textAlign: textAlign,\n    textVerticalAlign: textVerticalAlign\n  };\n}\n/**\n * Show ellipsis if overflow.\n *\n * @public\n * @param  {string} text\n * @param  {string} containerWidth\n * @param  {string} font\n * @param  {number} [ellipsis='...']\n * @param  {Object} [options]\n * @param  {number} [options.maxIterations=3]\n * @param  {number} [options.minChar=0] If truncate result are less\n *                  then minChar, ellipsis will not show, which is\n *                  better for user hint in some cases.\n * @param  {number} [options.placeholder=''] When all truncated, use the placeholder.\n * @return {string}\n */\n\n\nfunction truncateText(text, containerWidth, font, ellipsis, options) {\n  if (!containerWidth) {\n    return '';\n  }\n\n  var textLines = (text + '').split('\\n');\n  options = prepareTruncateOptions(containerWidth, font, ellipsis, options); // FIXME\n  // It is not appropriate that every line has '...' when truncate multiple lines.\n\n  for (var i = 0, len = textLines.length; i < len; i++) {\n    textLines[i] = truncateSingleLine(textLines[i], options);\n  }\n\n  return textLines.join('\\n');\n}\n\nfunction prepareTruncateOptions(containerWidth, font, ellipsis, options) {\n  options = extend({}, options);\n  options.font = font;\n  var ellipsis = retrieve2(ellipsis, '...');\n  options.maxIterations = retrieve2(options.maxIterations, 2);\n  var minChar = options.minChar = retrieve2(options.minChar, 0); // FIXME\n  // Other languages?\n\n  options.cnCharWidth = getWidth('国', font); // FIXME\n  // Consider proportional font?\n\n  var ascCharWidth = options.ascCharWidth = getWidth('a', font);\n  options.placeholder = retrieve2(options.placeholder, ''); // Example 1: minChar: 3, text: 'asdfzxcv', truncate result: 'asdf', but not: 'a...'.\n  // Example 2: minChar: 3, text: '维度', truncate result: '维', but not: '...'.\n\n  var contentWidth = containerWidth = Math.max(0, containerWidth - 1); // Reserve some gap.\n\n  for (var i = 0; i < minChar && contentWidth >= ascCharWidth; i++) {\n    contentWidth -= ascCharWidth;\n  }\n\n  var ellipsisWidth = getWidth(ellipsis);\n\n  if (ellipsisWidth > contentWidth) {\n    ellipsis = '';\n    ellipsisWidth = 0;\n  }\n\n  contentWidth = containerWidth - ellipsisWidth;\n  options.ellipsis = ellipsis;\n  options.ellipsisWidth = ellipsisWidth;\n  options.contentWidth = contentWidth;\n  options.containerWidth = containerWidth;\n  return options;\n}\n\nfunction truncateSingleLine(textLine, options) {\n  var containerWidth = options.containerWidth;\n  var font = options.font;\n  var contentWidth = options.contentWidth;\n\n  if (!containerWidth) {\n    return '';\n  }\n\n  var lineWidth = getWidth(textLine, font);\n\n  if (lineWidth <= containerWidth) {\n    return textLine;\n  }\n\n  for (var j = 0;; j++) {\n    if (lineWidth <= contentWidth || j >= options.maxIterations) {\n      textLine += options.ellipsis;\n      break;\n    }\n\n    var subLength = j === 0 ? estimateLength(textLine, contentWidth, options.ascCharWidth, options.cnCharWidth) : lineWidth > 0 ? Math.floor(textLine.length * contentWidth / lineWidth) : 0;\n    textLine = textLine.substr(0, subLength);\n    lineWidth = getWidth(textLine, font);\n  }\n\n  if (textLine === '') {\n    textLine = options.placeholder;\n  }\n\n  return textLine;\n}\n\nfunction estimateLength(text, contentWidth, ascCharWidth, cnCharWidth) {\n  var width = 0;\n  var i = 0;\n\n  for (var len = text.length; i < len && width < contentWidth; i++) {\n    var charCode = text.charCodeAt(i);\n    width += 0 <= charCode && charCode <= 127 ? ascCharWidth : cnCharWidth;\n  }\n\n  return i;\n}\n/**\n * @public\n * @param {string} font\n * @return {number} line height\n */\n\n\nfunction getLineHeight(font) {\n  // FIXME A rough approach.\n  return getWidth('国', font);\n}\n/**\n * @public\n * @param {string} text\n * @param {string} font\n * @return {Object} width\n */\n\n\nfunction measureText(text, font) {\n  return methods.measureText(text, font);\n} // Avoid assign to an exported variable, for transforming to cjs.\n\n\nmethods.measureText = function (text, font) {\n  var ctx = getContext();\n  ctx.font = font || DEFAULT_FONT;\n  return ctx.measureText(text);\n};\n/**\n * @public\n * @param {string} text\n * @param {string} font\n * @param {Object} [truncate]\n * @return {Object} block: {lineHeight, lines, height, outerHeight}\n *  Notice: for performance, do not calculate outerWidth util needed.\n */\n\n\nfunction parsePlainText(text, font, padding, truncate) {\n  text != null && (text += '');\n  var lineHeight = getLineHeight(font);\n  var lines = text ? text.split('\\n') : [];\n  var height = lines.length * lineHeight;\n  var outerHeight = height;\n\n  if (padding) {\n    outerHeight += padding[0] + padding[2];\n  }\n\n  if (text && truncate) {\n    var truncOuterHeight = truncate.outerHeight;\n    var truncOuterWidth = truncate.outerWidth;\n\n    if (truncOuterHeight != null && outerHeight > truncOuterHeight) {\n      text = '';\n      lines = [];\n    } else if (truncOuterWidth != null) {\n      var options = prepareTruncateOptions(truncOuterWidth - (padding ? padding[1] + padding[3] : 0), font, truncate.ellipsis, {\n        minChar: truncate.minChar,\n        placeholder: truncate.placeholder\n      }); // FIXME\n      // It is not appropriate that every line has '...' when truncate multiple lines.\n\n      for (var i = 0, len = lines.length; i < len; i++) {\n        lines[i] = truncateSingleLine(lines[i], options);\n      }\n    }\n  }\n\n  return {\n    lines: lines,\n    height: height,\n    outerHeight: outerHeight,\n    lineHeight: lineHeight\n  };\n}\n/**\n * For example: 'some text {a|some text}other text{b|some text}xxx{c|}xxx'\n * Also consider 'bbbb{a|xxx\\nzzz}xxxx\\naaaa'.\n *\n * @public\n * @param {string} text\n * @param {Object} style\n * @return {Object} block\n * {\n *      width,\n *      height,\n *      lines: [{\n *          lineHeight,\n *          width,\n *          tokens: [[{\n *              styleName,\n *              text,\n *              width,      // include textPadding\n *              height,     // include textPadding\n *              textWidth, // pure text width\n *              textHeight, // pure text height\n *              lineHeihgt,\n *              font,\n *              textAlign,\n *              textVerticalAlign\n *          }], [...], ...]\n *      }, ...]\n * }\n * If styleName is undefined, it is plain text.\n */\n\n\nfunction parseRichText(text, style) {\n  var contentBlock = {\n    lines: [],\n    width: 0,\n    height: 0\n  };\n  text != null && (text += '');\n\n  if (!text) {\n    return contentBlock;\n  }\n\n  var lastIndex = STYLE_REG.lastIndex = 0;\n  var result;\n\n  while ((result = STYLE_REG.exec(text)) != null) {\n    var matchedIndex = result.index;\n\n    if (matchedIndex > lastIndex) {\n      pushTokens(contentBlock, text.substring(lastIndex, matchedIndex));\n    }\n\n    pushTokens(contentBlock, result[2], result[1]);\n    lastIndex = STYLE_REG.lastIndex;\n  }\n\n  if (lastIndex < text.length) {\n    pushTokens(contentBlock, text.substring(lastIndex, text.length));\n  }\n\n  var lines = contentBlock.lines;\n  var contentHeight = 0;\n  var contentWidth = 0; // For `textWidth: 100%`\n\n  var pendingList = [];\n  var stlPadding = style.textPadding;\n  var truncate = style.truncate;\n  var truncateWidth = truncate && truncate.outerWidth;\n  var truncateHeight = truncate && truncate.outerHeight;\n\n  if (stlPadding) {\n    truncateWidth != null && (truncateWidth -= stlPadding[1] + stlPadding[3]);\n    truncateHeight != null && (truncateHeight -= stlPadding[0] + stlPadding[2]);\n  } // Calculate layout info of tokens.\n\n\n  for (var i = 0; i < lines.length; i++) {\n    var line = lines[i];\n    var lineHeight = 0;\n    var lineWidth = 0;\n\n    for (var j = 0; j < line.tokens.length; j++) {\n      var token = line.tokens[j];\n      var tokenStyle = token.styleName && style.rich[token.styleName] || {}; // textPadding should not inherit from style.\n\n      var textPadding = token.textPadding = tokenStyle.textPadding; // textFont has been asigned to font by `normalizeStyle`.\n\n      var font = token.font = tokenStyle.font || style.font; // textHeight can be used when textVerticalAlign is specified in token.\n\n      var tokenHeight = token.textHeight = retrieve2( // textHeight should not be inherited, consider it can be specified\n      // as box height of the block.\n      tokenStyle.textHeight, getLineHeight(font));\n      textPadding && (tokenHeight += textPadding[0] + textPadding[2]);\n      token.height = tokenHeight;\n      token.lineHeight = retrieve3(tokenStyle.textLineHeight, style.textLineHeight, tokenHeight);\n      token.textAlign = tokenStyle && tokenStyle.textAlign || style.textAlign;\n      token.textVerticalAlign = tokenStyle && tokenStyle.textVerticalAlign || 'middle';\n\n      if (truncateHeight != null && contentHeight + token.lineHeight > truncateHeight) {\n        return {\n          lines: [],\n          width: 0,\n          height: 0\n        };\n      }\n\n      token.textWidth = getWidth(token.text, font);\n      var tokenWidth = tokenStyle.textWidth;\n      var tokenWidthNotSpecified = tokenWidth == null || tokenWidth === 'auto'; // Percent width, can be `100%`, can be used in drawing separate\n      // line when box width is needed to be auto.\n\n      if (typeof tokenWidth === 'string' && tokenWidth.charAt(tokenWidth.length - 1) === '%') {\n        token.percentWidth = tokenWidth;\n        pendingList.push(token);\n        tokenWidth = 0; // Do not truncate in this case, because there is no user case\n        // and it is too complicated.\n      } else {\n        if (tokenWidthNotSpecified) {\n          tokenWidth = token.textWidth; // FIXME: If image is not loaded and textWidth is not specified, calling\n          // `getBoundingRect()` will not get correct result.\n\n          var textBackgroundColor = tokenStyle.textBackgroundColor;\n          var bgImg = textBackgroundColor && textBackgroundColor.image; // Use cases:\n          // (1) If image is not loaded, it will be loaded at render phase and call\n          // `dirty()` and `textBackgroundColor.image` will be replaced with the loaded\n          // image, and then the right size will be calculated here at the next tick.\n          // See `graphic/helper/text.js`.\n          // (2) If image loaded, and `textBackgroundColor.image` is image src string,\n          // use `imageHelper.findExistImage` to find cached image.\n          // `imageHelper.findExistImage` will always be called here before\n          // `imageHelper.createOrUpdateImage` in `graphic/helper/text.js#renderRichText`\n          // which ensures that image will not be rendered before correct size calcualted.\n\n          if (bgImg) {\n            bgImg = imageHelper.findExistImage(bgImg);\n\n            if (imageHelper.isImageReady(bgImg)) {\n              tokenWidth = Math.max(tokenWidth, bgImg.width * tokenHeight / bgImg.height);\n            }\n          }\n        }\n\n        var paddingW = textPadding ? textPadding[1] + textPadding[3] : 0;\n        tokenWidth += paddingW;\n        var remianTruncWidth = truncateWidth != null ? truncateWidth - lineWidth : null;\n\n        if (remianTruncWidth != null && remianTruncWidth < tokenWidth) {\n          if (!tokenWidthNotSpecified || remianTruncWidth < paddingW) {\n            token.text = '';\n            token.textWidth = tokenWidth = 0;\n          } else {\n            token.text = truncateText(token.text, remianTruncWidth - paddingW, font, truncate.ellipsis, {\n              minChar: truncate.minChar\n            });\n            token.textWidth = getWidth(token.text, font);\n            tokenWidth = token.textWidth + paddingW;\n          }\n        }\n      }\n\n      lineWidth += token.width = tokenWidth;\n      tokenStyle && (lineHeight = Math.max(lineHeight, token.lineHeight));\n    }\n\n    line.width = lineWidth;\n    line.lineHeight = lineHeight;\n    contentHeight += lineHeight;\n    contentWidth = Math.max(contentWidth, lineWidth);\n  }\n\n  contentBlock.outerWidth = contentBlock.width = retrieve2(style.textWidth, contentWidth);\n  contentBlock.outerHeight = contentBlock.height = retrieve2(style.textHeight, contentHeight);\n\n  if (stlPadding) {\n    contentBlock.outerWidth += stlPadding[1] + stlPadding[3];\n    contentBlock.outerHeight += stlPadding[0] + stlPadding[2];\n  }\n\n  for (var i = 0; i < pendingList.length; i++) {\n    var token = pendingList[i];\n    var percentWidth = token.percentWidth; // Should not base on outerWidth, because token can not be placed out of padding.\n\n    token.width = parseInt(percentWidth, 10) / 100 * contentWidth;\n  }\n\n  return contentBlock;\n}\n\nfunction pushTokens(block, str, styleName) {\n  var isEmptyStr = str === '';\n  var strs = str.split('\\n');\n  var lines = block.lines;\n\n  for (var i = 0; i < strs.length; i++) {\n    var text = strs[i];\n    var token = {\n      styleName: styleName,\n      text: text,\n      isLineHolder: !text && !isEmptyStr\n    }; // The first token should be appended to the last line.\n\n    if (!i) {\n      var tokens = (lines[lines.length - 1] || (lines[0] = {\n        tokens: []\n      })).tokens; // Consider cases:\n      // (1) ''.split('\\n') => ['', '\\n', ''], the '' at the first item\n      // (which is a placeholder) should be replaced by new token.\n      // (2) A image backage, where token likes {a|}.\n      // (3) A redundant '' will affect textAlign in line.\n      // (4) tokens with the same tplName should not be merged, because\n      // they should be displayed in different box (with border and padding).\n\n      var tokensLen = tokens.length;\n      tokensLen === 1 && tokens[0].isLineHolder ? tokens[0] = token : // Consider text is '', only insert when it is the \"lineHolder\" or\n      // \"emptyStr\". Otherwise a redundant '' will affect textAlign in line.\n      (text || !tokensLen || isEmptyStr) && tokens.push(token);\n    } // Other tokens always start a new line.\n    else {\n        // If there is '', insert it as a placeholder.\n        lines.push({\n          tokens: [token]\n        });\n      }\n  }\n}\n\nfunction makeFont(style) {\n  // FIXME in node-canvas fontWeight is before fontStyle\n  // Use `fontSize` `fontFamily` to check whether font properties are defined.\n  return (style.fontSize || style.fontFamily) && [style.fontStyle, style.fontWeight, (style.fontSize || 12) + 'px', // If font properties are defined, `fontFamily` should not be ignored.\n  style.fontFamily || 'sans-serif'].join(' ') || style.textFont || style.font;\n}\n\nexports.DEFAULT_FONT = DEFAULT_FONT;\nexports.$override = $override;\nexports.getWidth = getWidth;\nexports.getBoundingRect = getBoundingRect;\nexports.adjustTextX = adjustTextX;\nexports.adjustTextY = adjustTextY;\nexports.adjustTextPositionOnRect = adjustTextPositionOnRect;\nexports.truncateText = truncateText;\nexports.getLineHeight = getLineHeight;\nexports.measureText = measureText;\nexports.parsePlainText = parsePlainText;\nexports.parseRichText = parseRichText;\nexports.makeFont = makeFont;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar curve = __webpack_require__(4);\n\nvar vec2 = __webpack_require__(2);\n\nvar bbox = __webpack_require__(49);\n\nvar BoundingRect = __webpack_require__(3);\n\nvar _config = __webpack_require__(19);\n\nvar dpr = _config.devicePixelRatio;\n\n/**\n * Path 代理，可以在`buildPath`中用于替代`ctx`, 会保存每个path操作的命令到pathCommands属性中\n * 可以用于 isInsidePath 判断以及获取boundingRect\n *\n * @module zrender/core/PathProxy\n * @author Yi Shen (http://www.github.com/pissang)\n */\n// TODO getTotalLength, getPointAtLength\nvar CMD = {\n  M: 1,\n  L: 2,\n  C: 3,\n  Q: 4,\n  A: 5,\n  Z: 6,\n  // Rect\n  R: 7\n}; // var CMD_MEM_SIZE = {\n//     M: 3,\n//     L: 3,\n//     C: 7,\n//     Q: 5,\n//     A: 9,\n//     R: 5,\n//     Z: 1\n// };\n\nvar min = [];\nvar max = [];\nvar min2 = [];\nvar max2 = [];\nvar mathMin = Math.min;\nvar mathMax = Math.max;\nvar mathCos = Math.cos;\nvar mathSin = Math.sin;\nvar mathSqrt = Math.sqrt;\nvar mathAbs = Math.abs;\nvar hasTypedArray = typeof Float32Array != 'undefined';\n/**\n * @alias module:zrender/core/PathProxy\n * @constructor\n */\n\nvar PathProxy = function (notSaveData) {\n  this._saveData = !(notSaveData || false);\n\n  if (this._saveData) {\n    /**\n     * Path data. Stored as flat array\n     * @type {Array.<Object>}\n     */\n    this.data = [];\n  }\n\n  this._ctx = null;\n};\n/**\n * 快速计算Path包围盒（并不是最小包围盒）\n * @return {Object}\n */\n\n\nPathProxy.prototype = {\n  constructor: PathProxy,\n  _xi: 0,\n  _yi: 0,\n  _x0: 0,\n  _y0: 0,\n  // Unit x, Unit y. Provide for avoiding drawing that too short line segment\n  _ux: 0,\n  _uy: 0,\n  _len: 0,\n  _lineDash: null,\n  _dashOffset: 0,\n  _dashIdx: 0,\n  _dashSum: 0,\n\n  /**\n   * @readOnly\n   */\n  setScale: function (sx, sy) {\n    this._ux = mathAbs(1 / dpr / sx) || 0;\n    this._uy = mathAbs(1 / dpr / sy) || 0;\n  },\n  getContext: function () {\n    return this._ctx;\n  },\n\n  /**\n   * @param  {CanvasRenderingContext2D} ctx\n   * @return {module:zrender/core/PathProxy}\n   */\n  beginPath: function (ctx) {\n    this._ctx = ctx;\n    ctx && ctx.beginPath();\n    ctx && (this.dpr = ctx.dpr); // Reset\n\n    if (this._saveData) {\n      this._len = 0;\n    }\n\n    if (this._lineDash) {\n      this._lineDash = null;\n      this._dashOffset = 0;\n    }\n\n    return this;\n  },\n\n  /**\n   * @param  {number} x\n   * @param  {number} y\n   * @return {module:zrender/core/PathProxy}\n   */\n  moveTo: function (x, y) {\n    this.addData(CMD.M, x, y);\n    this._ctx && this._ctx.moveTo(x, y); // x0, y0, xi, yi 是记录在 _dashedXXXXTo 方法中使用\n    // xi, yi 记录当前点, x0, y0 在 closePath 的时候回到起始点。\n    // 有可能在 beginPath 之后直接调用 lineTo，这时候 x0, y0 需要\n    // 在 lineTo 方法中记录，这里先不考虑这种情况，dashed line 也只在 IE10- 中不支持\n\n    this._x0 = x;\n    this._y0 = y;\n    this._xi = x;\n    this._yi = y;\n    return this;\n  },\n\n  /**\n   * @param  {number} x\n   * @param  {number} y\n   * @return {module:zrender/core/PathProxy}\n   */\n  lineTo: function (x, y) {\n    var exceedUnit = mathAbs(x - this._xi) > this._ux || mathAbs(y - this._yi) > this._uy // Force draw the first segment\n    || this._len < 5;\n    this.addData(CMD.L, x, y);\n\n    if (this._ctx && exceedUnit) {\n      this._needsDash() ? this._dashedLineTo(x, y) : this._ctx.lineTo(x, y);\n    }\n\n    if (exceedUnit) {\n      this._xi = x;\n      this._yi = y;\n    }\n\n    return this;\n  },\n\n  /**\n   * @param  {number} x1\n   * @param  {number} y1\n   * @param  {number} x2\n   * @param  {number} y2\n   * @param  {number} x3\n   * @param  {number} y3\n   * @return {module:zrender/core/PathProxy}\n   */\n  bezierCurveTo: function (x1, y1, x2, y2, x3, y3) {\n    this.addData(CMD.C, x1, y1, x2, y2, x3, y3);\n\n    if (this._ctx) {\n      this._needsDash() ? this._dashedBezierTo(x1, y1, x2, y2, x3, y3) : this._ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);\n    }\n\n    this._xi = x3;\n    this._yi = y3;\n    return this;\n  },\n\n  /**\n   * @param  {number} x1\n   * @param  {number} y1\n   * @param  {number} x2\n   * @param  {number} y2\n   * @return {module:zrender/core/PathProxy}\n   */\n  quadraticCurveTo: function (x1, y1, x2, y2) {\n    this.addData(CMD.Q, x1, y1, x2, y2);\n\n    if (this._ctx) {\n      this._needsDash() ? this._dashedQuadraticTo(x1, y1, x2, y2) : this._ctx.quadraticCurveTo(x1, y1, x2, y2);\n    }\n\n    this._xi = x2;\n    this._yi = y2;\n    return this;\n  },\n\n  /**\n   * @param  {number} cx\n   * @param  {number} cy\n   * @param  {number} r\n   * @param  {number} startAngle\n   * @param  {number} endAngle\n   * @param  {boolean} anticlockwise\n   * @return {module:zrender/core/PathProxy}\n   */\n  arc: function (cx, cy, r, startAngle, endAngle, anticlockwise) {\n    this.addData(CMD.A, cx, cy, r, r, startAngle, endAngle - startAngle, 0, anticlockwise ? 0 : 1);\n    this._ctx && this._ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise);\n    this._xi = mathCos(endAngle) * r + cx;\n    this._yi = mathSin(endAngle) * r + cx;\n    return this;\n  },\n  // TODO\n  arcTo: function (x1, y1, x2, y2, radius) {\n    if (this._ctx) {\n      this._ctx.arcTo(x1, y1, x2, y2, radius);\n    }\n\n    return this;\n  },\n  // TODO\n  rect: function (x, y, w, h) {\n    this._ctx && this._ctx.rect(x, y, w, h);\n    this.addData(CMD.R, x, y, w, h);\n    return this;\n  },\n\n  /**\n   * @return {module:zrender/core/PathProxy}\n   */\n  closePath: function () {\n    this.addData(CMD.Z);\n    var ctx = this._ctx;\n    var x0 = this._x0;\n    var y0 = this._y0;\n\n    if (ctx) {\n      this._needsDash() && this._dashedLineTo(x0, y0);\n      ctx.closePath();\n    }\n\n    this._xi = x0;\n    this._yi = y0;\n    return this;\n  },\n\n  /**\n   * Context 从外部传入，因为有可能是 rebuildPath 完之后再 fill。\n   * stroke 同样\n   * @param {CanvasRenderingContext2D} ctx\n   * @return {module:zrender/core/PathProxy}\n   */\n  fill: function (ctx) {\n    ctx && ctx.fill();\n    this.toStatic();\n  },\n\n  /**\n   * @param {CanvasRenderingContext2D} ctx\n   * @return {module:zrender/core/PathProxy}\n   */\n  stroke: function (ctx) {\n    ctx && ctx.stroke();\n    this.toStatic();\n  },\n\n  /**\n   * 必须在其它绘制命令前调用\n   * Must be invoked before all other path drawing methods\n   * @return {module:zrender/core/PathProxy}\n   */\n  setLineDash: function (lineDash) {\n    if (lineDash instanceof Array) {\n      this._lineDash = lineDash;\n      this._dashIdx = 0;\n      var lineDashSum = 0;\n\n      for (var i = 0; i < lineDash.length; i++) {\n        lineDashSum += lineDash[i];\n      }\n\n      this._dashSum = lineDashSum;\n    }\n\n    return this;\n  },\n\n  /**\n   * 必须在其它绘制命令前调用\n   * Must be invoked before all other path drawing methods\n   * @return {module:zrender/core/PathProxy}\n   */\n  setLineDashOffset: function (offset) {\n    this._dashOffset = offset;\n    return this;\n  },\n\n  /**\n   *\n   * @return {boolean}\n   */\n  len: function () {\n    return this._len;\n  },\n\n  /**\n   * 直接设置 Path 数据\n   */\n  setData: function (data) {\n    var len = data.length;\n\n    if (!(this.data && this.data.length == len) && hasTypedArray) {\n      this.data = new Float32Array(len);\n    }\n\n    for (var i = 0; i < len; i++) {\n      this.data[i] = data[i];\n    }\n\n    this._len = len;\n  },\n\n  /**\n   * 添加子路径\n   * @param {module:zrender/core/PathProxy|Array.<module:zrender/core/PathProxy>} path\n   */\n  appendPath: function (path) {\n    if (!(path instanceof Array)) {\n      path = [path];\n    }\n\n    var len = path.length;\n    var appendSize = 0;\n    var offset = this._len;\n\n    for (var i = 0; i < len; i++) {\n      appendSize += path[i].len();\n    }\n\n    if (hasTypedArray && this.data instanceof Float32Array) {\n      this.data = new Float32Array(offset + appendSize);\n    }\n\n    for (var i = 0; i < len; i++) {\n      var appendPathData = path[i].data;\n\n      for (var k = 0; k < appendPathData.length; k++) {\n        this.data[offset++] = appendPathData[k];\n      }\n    }\n\n    this._len = offset;\n  },\n\n  /**\n   * 填充 Path 数据。\n   * 尽量复用而不申明新的数组。大部分图形重绘的指令数据长度都是不变的。\n   */\n  addData: function (cmd) {\n    if (!this._saveData) {\n      return;\n    }\n\n    var data = this.data;\n\n    if (this._len + arguments.length > data.length) {\n      // 因为之前的数组已经转换成静态的 Float32Array\n      // 所以不够用时需要扩展一个新的动态数组\n      this._expandData();\n\n      data = this.data;\n    }\n\n    for (var i = 0; i < arguments.length; i++) {\n      data[this._len++] = arguments[i];\n    }\n\n    this._prevCmd = cmd;\n  },\n  _expandData: function () {\n    // Only if data is Float32Array\n    if (!(this.data instanceof Array)) {\n      var newData = [];\n\n      for (var i = 0; i < this._len; i++) {\n        newData[i] = this.data[i];\n      }\n\n      this.data = newData;\n    }\n  },\n\n  /**\n   * If needs js implemented dashed line\n   * @return {boolean}\n   * @private\n   */\n  _needsDash: function () {\n    return this._lineDash;\n  },\n  _dashedLineTo: function (x1, y1) {\n    var dashSum = this._dashSum;\n    var offset = this._dashOffset;\n    var lineDash = this._lineDash;\n    var ctx = this._ctx;\n    var x0 = this._xi;\n    var y0 = this._yi;\n    var dx = x1 - x0;\n    var dy = y1 - y0;\n    var dist = mathSqrt(dx * dx + dy * dy);\n    var x = x0;\n    var y = y0;\n    var dash;\n    var nDash = lineDash.length;\n    var idx;\n    dx /= dist;\n    dy /= dist;\n\n    if (offset < 0) {\n      // Convert to positive offset\n      offset = dashSum + offset;\n    }\n\n    offset %= dashSum;\n    x -= offset * dx;\n    y -= offset * dy;\n\n    while (dx > 0 && x <= x1 || dx < 0 && x >= x1 || dx == 0 && (dy > 0 && y <= y1 || dy < 0 && y >= y1)) {\n      idx = this._dashIdx;\n      dash = lineDash[idx];\n      x += dx * dash;\n      y += dy * dash;\n      this._dashIdx = (idx + 1) % nDash; // Skip positive offset\n\n      if (dx > 0 && x < x0 || dx < 0 && x > x0 || dy > 0 && y < y0 || dy < 0 && y > y0) {\n        continue;\n      }\n\n      ctx[idx % 2 ? 'moveTo' : 'lineTo'](dx >= 0 ? mathMin(x, x1) : mathMax(x, x1), dy >= 0 ? mathMin(y, y1) : mathMax(y, y1));\n    } // Offset for next lineTo\n\n\n    dx = x - x1;\n    dy = y - y1;\n    this._dashOffset = -mathSqrt(dx * dx + dy * dy);\n  },\n  // Not accurate dashed line to\n  _dashedBezierTo: function (x1, y1, x2, y2, x3, y3) {\n    var dashSum = this._dashSum;\n    var offset = this._dashOffset;\n    var lineDash = this._lineDash;\n    var ctx = this._ctx;\n    var x0 = this._xi;\n    var y0 = this._yi;\n    var t;\n    var dx;\n    var dy;\n    var cubicAt = curve.cubicAt;\n    var bezierLen = 0;\n    var idx = this._dashIdx;\n    var nDash = lineDash.length;\n    var x;\n    var y;\n    var tmpLen = 0;\n\n    if (offset < 0) {\n      // Convert to positive offset\n      offset = dashSum + offset;\n    }\n\n    offset %= dashSum; // Bezier approx length\n\n    for (t = 0; t < 1; t += 0.1) {\n      dx = cubicAt(x0, x1, x2, x3, t + 0.1) - cubicAt(x0, x1, x2, x3, t);\n      dy = cubicAt(y0, y1, y2, y3, t + 0.1) - cubicAt(y0, y1, y2, y3, t);\n      bezierLen += mathSqrt(dx * dx + dy * dy);\n    } // Find idx after add offset\n\n\n    for (; idx < nDash; idx++) {\n      tmpLen += lineDash[idx];\n\n      if (tmpLen > offset) {\n        break;\n      }\n    }\n\n    t = (tmpLen - offset) / bezierLen;\n\n    while (t <= 1) {\n      x = cubicAt(x0, x1, x2, x3, t);\n      y = cubicAt(y0, y1, y2, y3, t); // Use line to approximate dashed bezier\n      // Bad result if dash is long\n\n      idx % 2 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);\n      t += lineDash[idx] / bezierLen;\n      idx = (idx + 1) % nDash;\n    } // Finish the last segment and calculate the new offset\n\n\n    idx % 2 !== 0 && ctx.lineTo(x3, y3);\n    dx = x3 - x;\n    dy = y3 - y;\n    this._dashOffset = -mathSqrt(dx * dx + dy * dy);\n  },\n  _dashedQuadraticTo: function (x1, y1, x2, y2) {\n    // Convert quadratic to cubic using degree elevation\n    var x3 = x2;\n    var y3 = y2;\n    x2 = (x2 + 2 * x1) / 3;\n    y2 = (y2 + 2 * y1) / 3;\n    x1 = (this._xi + 2 * x1) / 3;\n    y1 = (this._yi + 2 * y1) / 3;\n\n    this._dashedBezierTo(x1, y1, x2, y2, x3, y3);\n  },\n\n  /**\n   * 转成静态的 Float32Array 减少堆内存占用\n   * Convert dynamic array to static Float32Array\n   */\n  toStatic: function () {\n    var data = this.data;\n\n    if (data instanceof Array) {\n      data.length = this._len;\n\n      if (hasTypedArray) {\n        this.data = new Float32Array(data);\n      }\n    }\n  },\n\n  /**\n   * @return {module:zrender/core/BoundingRect}\n   */\n  getBoundingRect: function () {\n    min[0] = min[1] = min2[0] = min2[1] = Number.MAX_VALUE;\n    max[0] = max[1] = max2[0] = max2[1] = -Number.MAX_VALUE;\n    var data = this.data;\n    var xi = 0;\n    var yi = 0;\n    var x0 = 0;\n    var y0 = 0;\n\n    for (var i = 0; i < data.length;) {\n      var cmd = data[i++];\n\n      if (i == 1) {\n        // 如果第一个命令是 L, C, Q\n        // 则 previous point 同绘制命令的第一个 point\n        //\n        // 第一个命令为 Arc 的情况下会在后面特殊处理\n        xi = data[i];\n        yi = data[i + 1];\n        x0 = xi;\n        y0 = yi;\n      }\n\n      switch (cmd) {\n        case CMD.M:\n          // moveTo 命令重新创建一个新的 subpath, 并且更新新的起点\n          // 在 closePath 的时候使用\n          x0 = data[i++];\n          y0 = data[i++];\n          xi = x0;\n          yi = y0;\n          min2[0] = x0;\n          min2[1] = y0;\n          max2[0] = x0;\n          max2[1] = y0;\n          break;\n\n        case CMD.L:\n          bbox.fromLine(xi, yi, data[i], data[i + 1], min2, max2);\n          xi = data[i++];\n          yi = data[i++];\n          break;\n\n        case CMD.C:\n          bbox.fromCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], min2, max2);\n          xi = data[i++];\n          yi = data[i++];\n          break;\n\n        case CMD.Q:\n          bbox.fromQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], min2, max2);\n          xi = data[i++];\n          yi = data[i++];\n          break;\n\n        case CMD.A:\n          // TODO Arc 判断的开销比较大\n          var cx = data[i++];\n          var cy = data[i++];\n          var rx = data[i++];\n          var ry = data[i++];\n          var startAngle = data[i++];\n          var endAngle = data[i++] + startAngle; // TODO Arc 旋转\n\n          var psi = data[i++];\n          var anticlockwise = 1 - data[i++];\n\n          if (i == 1) {\n            // 直接使用 arc 命令\n            // 第一个命令起点还未定义\n            x0 = mathCos(startAngle) * rx + cx;\n            y0 = mathSin(startAngle) * ry + cy;\n          }\n\n          bbox.fromArc(cx, cy, rx, ry, startAngle, endAngle, anticlockwise, min2, max2);\n          xi = mathCos(endAngle) * rx + cx;\n          yi = mathSin(endAngle) * ry + cy;\n          break;\n\n        case CMD.R:\n          x0 = xi = data[i++];\n          y0 = yi = data[i++];\n          var width = data[i++];\n          var height = data[i++]; // Use fromLine\n\n          bbox.fromLine(x0, y0, x0 + width, y0 + height, min2, max2);\n          break;\n\n        case CMD.Z:\n          xi = x0;\n          yi = y0;\n          break;\n      } // Union\n\n\n      vec2.min(min, min, min2);\n      vec2.max(max, max, max2);\n    } // No data\n\n\n    if (i === 0) {\n      min[0] = min[1] = max[0] = max[1] = 0;\n    }\n\n    return new BoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]);\n  },\n\n  /**\n   * Rebuild path from current data\n   * Rebuild path will not consider javascript implemented line dash.\n   * @param {CanvasRenderingContext2D} ctx\n   */\n  rebuildPath: function (ctx) {\n    var d = this.data;\n    var x0, y0;\n    var xi, yi;\n    var x, y;\n    var ux = this._ux;\n    var uy = this._uy;\n    var len = this._len;\n\n    for (var i = 0; i < len;) {\n      var cmd = d[i++];\n\n      if (i == 1) {\n        // 如果第一个命令是 L, C, Q\n        // 则 previous point 同绘制命令的第一个 point\n        //\n        // 第一个命令为 Arc 的情况下会在后面特殊处理\n        xi = d[i];\n        yi = d[i + 1];\n        x0 = xi;\n        y0 = yi;\n      }\n\n      switch (cmd) {\n        case CMD.M:\n          x0 = xi = d[i++];\n          y0 = yi = d[i++];\n          ctx.moveTo(xi, yi);\n          break;\n\n        case CMD.L:\n          x = d[i++];\n          y = d[i++]; // Not draw too small seg between\n\n          if (mathAbs(x - xi) > ux || mathAbs(y - yi) > uy || i === len - 1) {\n            ctx.lineTo(x, y);\n            xi = x;\n            yi = y;\n          }\n\n          break;\n\n        case CMD.C:\n          ctx.bezierCurveTo(d[i++], d[i++], d[i++], d[i++], d[i++], d[i++]);\n          xi = d[i - 2];\n          yi = d[i - 1];\n          break;\n\n        case CMD.Q:\n          ctx.quadraticCurveTo(d[i++], d[i++], d[i++], d[i++]);\n          xi = d[i - 2];\n          yi = d[i - 1];\n          break;\n\n        case CMD.A:\n          var cx = d[i++];\n          var cy = d[i++];\n          var rx = d[i++];\n          var ry = d[i++];\n          var theta = d[i++];\n          var dTheta = d[i++];\n          var psi = d[i++];\n          var fs = d[i++];\n          var r = rx > ry ? rx : ry;\n          var scaleX = rx > ry ? 1 : rx / ry;\n          var scaleY = rx > ry ? ry / rx : 1;\n          var isEllipse = Math.abs(rx - ry) > 1e-3;\n          var endAngle = theta + dTheta;\n\n          if (isEllipse) {\n            ctx.translate(cx, cy);\n            ctx.rotate(psi);\n            ctx.scale(scaleX, scaleY);\n            ctx.arc(0, 0, r, theta, endAngle, 1 - fs);\n            ctx.scale(1 / scaleX, 1 / scaleY);\n            ctx.rotate(-psi);\n            ctx.translate(-cx, -cy);\n          } else {\n            ctx.arc(cx, cy, r, theta, endAngle, 1 - fs);\n          }\n\n          if (i == 1) {\n            // 直接使用 arc 命令\n            // 第一个命令起点还未定义\n            x0 = mathCos(theta) * rx + cx;\n            y0 = mathSin(theta) * ry + cy;\n          }\n\n          xi = mathCos(endAngle) * rx + cx;\n          yi = mathSin(endAngle) * ry + cy;\n          break;\n\n        case CMD.R:\n          x0 = xi = d[i];\n          y0 = yi = d[i + 1];\n          ctx.rect(d[i++], d[i++], d[i++], d[i++]);\n          break;\n\n        case CMD.Z:\n          ctx.closePath();\n          xi = x0;\n          yi = y0;\n      }\n    }\n  }\n};\nPathProxy.CMD = CMD;\nvar _default = PathProxy;\nmodule.exports = _default;\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_7__;\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\n/**\n * 3x2矩阵操作类\n * @exports zrender/tool/matrix\n */\nvar ArrayCtor = typeof Float32Array === 'undefined' ? Array : Float32Array;\n/**\n * 创建一个单位矩阵\n * @return {Float32Array|Array.<number>}\n */\n\nfunction create() {\n  var out = new ArrayCtor(6);\n  identity(out);\n  return out;\n}\n/**\n * 设置矩阵为单位矩阵\n * @param {Float32Array|Array.<number>} out\n */\n\n\nfunction identity(out) {\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 1;\n  out[4] = 0;\n  out[5] = 0;\n  return out;\n}\n/**\n * 复制矩阵\n * @param {Float32Array|Array.<number>} out\n * @param {Float32Array|Array.<number>} m\n */\n\n\nfunction copy(out, m) {\n  out[0] = m[0];\n  out[1] = m[1];\n  out[2] = m[2];\n  out[3] = m[3];\n  out[4] = m[4];\n  out[5] = m[5];\n  return out;\n}\n/**\n * 矩阵相乘\n * @param {Float32Array|Array.<number>} out\n * @param {Float32Array|Array.<number>} m1\n * @param {Float32Array|Array.<number>} m2\n */\n\n\nfunction mul(out, m1, m2) {\n  // Consider matrix.mul(m, m2, m);\n  // where out is the same as m2.\n  // So use temp variable to escape error.\n  var out0 = m1[0] * m2[0] + m1[2] * m2[1];\n  var out1 = m1[1] * m2[0] + m1[3] * m2[1];\n  var out2 = m1[0] * m2[2] + m1[2] * m2[3];\n  var out3 = m1[1] * m2[2] + m1[3] * m2[3];\n  var out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4];\n  var out5 = m1[1] * m2[4] + m1[3] * m2[5] + m1[5];\n  out[0] = out0;\n  out[1] = out1;\n  out[2] = out2;\n  out[3] = out3;\n  out[4] = out4;\n  out[5] = out5;\n  return out;\n}\n/**\n * 平移变换\n * @param {Float32Array|Array.<number>} out\n * @param {Float32Array|Array.<number>} a\n * @param {Float32Array|Array.<number>} v\n */\n\n\nfunction translate(out, a, v) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  out[4] = a[4] + v[0];\n  out[5] = a[5] + v[1];\n  return out;\n}\n/**\n * 旋转变换\n * @param {Float32Array|Array.<number>} out\n * @param {Float32Array|Array.<number>} a\n * @param {number} rad\n */\n\n\nfunction rotate(out, a, rad) {\n  var aa = a[0];\n  var ac = a[2];\n  var atx = a[4];\n  var ab = a[1];\n  var ad = a[3];\n  var aty = a[5];\n  var st = Math.sin(rad);\n  var ct = Math.cos(rad);\n  out[0] = aa * ct + ab * st;\n  out[1] = -aa * st + ab * ct;\n  out[2] = ac * ct + ad * st;\n  out[3] = -ac * st + ct * ad;\n  out[4] = ct * atx + st * aty;\n  out[5] = ct * aty - st * atx;\n  return out;\n}\n/**\n * 缩放变换\n * @param {Float32Array|Array.<number>} out\n * @param {Float32Array|Array.<number>} a\n * @param {Float32Array|Array.<number>} v\n */\n\n\nfunction scale(out, a, v) {\n  var vx = v[0];\n  var vy = v[1];\n  out[0] = a[0] * vx;\n  out[1] = a[1] * vy;\n  out[2] = a[2] * vx;\n  out[3] = a[3] * vy;\n  out[4] = a[4] * vx;\n  out[5] = a[5] * vy;\n  return out;\n}\n/**\n * 求逆矩阵\n * @param {Float32Array|Array.<number>} out\n * @param {Float32Array|Array.<number>} a\n */\n\n\nfunction invert(out, a) {\n  var aa = a[0];\n  var ac = a[2];\n  var atx = a[4];\n  var ab = a[1];\n  var ad = a[3];\n  var aty = a[5];\n  var det = aa * ad - ab * ac;\n\n  if (!det) {\n    return null;\n  }\n\n  det = 1.0 / det;\n  out[0] = ad * det;\n  out[1] = -ab * det;\n  out[2] = -ac * det;\n  out[3] = aa * det;\n  out[4] = (ac * aty - ad * atx) * det;\n  out[5] = (ab * atx - aa * aty) * det;\n  return out;\n}\n\nexports.create = create;\nexports.identity = identity;\nexports.copy = copy;\nexports.mul = mul;\nexports.translate = translate;\nexports.rotate = rotate;\nexports.scale = scale;\nexports.invert = invert;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar zrUtil = __webpack_require__(0);\n\nvar RADIAN_EPSILON = 1e-4;\n\nfunction _trim(str) {\n  return str.replace(/^\\s+/, '').replace(/\\s+$/, '');\n}\n/**\n * Linear mapping a value from domain to range\n * @memberOf module:echarts/util/number\n * @param  {(number|Array.<number>)} val\n * @param  {Array.<number>} domain Domain extent domain[0] can be bigger than domain[1]\n * @param  {Array.<number>} range  Range extent range[0] can be bigger than range[1]\n * @param  {boolean} clamp\n * @return {(number|Array.<number>}\n */\n\n\nfunction linearMap(val, domain, range, clamp) {\n  var subDomain = domain[1] - domain[0];\n  var subRange = range[1] - range[0];\n\n  if (subDomain === 0) {\n    return subRange === 0 ? range[0] : (range[0] + range[1]) / 2;\n  } // Avoid accuracy problem in edge, such as\n  // 146.39 - 62.83 === 83.55999999999999.\n  // See echarts/test/ut/spec/util/number.js#linearMap#accuracyError\n  // It is a little verbose for efficiency considering this method\n  // is a hotspot.\n\n\n  if (clamp) {\n    if (subDomain > 0) {\n      if (val <= domain[0]) {\n        return range[0];\n      } else if (val >= domain[1]) {\n        return range[1];\n      }\n    } else {\n      if (val >= domain[0]) {\n        return range[0];\n      } else if (val <= domain[1]) {\n        return range[1];\n      }\n    }\n  } else {\n    if (val === domain[0]) {\n      return range[0];\n    }\n\n    if (val === domain[1]) {\n      return range[1];\n    }\n  }\n\n  return (val - domain[0]) / subDomain * subRange + range[0];\n}\n/**\n * Convert a percent string to absolute number.\n * Returns NaN if percent is not a valid string or number\n * @memberOf module:echarts/util/number\n * @param {string|number} percent\n * @param {number} all\n * @return {number}\n */\n\n\nfunction parsePercent(percent, all) {\n  switch (percent) {\n    case 'center':\n    case 'middle':\n      percent = '50%';\n      break;\n\n    case 'left':\n    case 'top':\n      percent = '0%';\n      break;\n\n    case 'right':\n    case 'bottom':\n      percent = '100%';\n      break;\n  }\n\n  if (typeof percent === 'string') {\n    if (_trim(percent).match(/%$/)) {\n      return parseFloat(percent) / 100 * all;\n    }\n\n    return parseFloat(percent);\n  }\n\n  return percent == null ? NaN : +percent;\n}\n/**\n * (1) Fix rounding error of float numbers.\n * (2) Support return string to avoid scientific notation like '3.5e-7'.\n *\n * @param {number} x\n * @param {number} [precision]\n * @param {boolean} [returnStr]\n * @return {number|string}\n */\n\n\nfunction round(x, precision, returnStr) {\n  if (precision == null) {\n    precision = 10;\n  } // Avoid range error\n\n\n  precision = Math.min(Math.max(0, precision), 20);\n  x = (+x).toFixed(precision);\n  return returnStr ? x : +x;\n}\n\nfunction asc(arr) {\n  arr.sort(function (a, b) {\n    return a - b;\n  });\n  return arr;\n}\n/**\n * Get precision\n * @param {number} val\n */\n\n\nfunction getPrecision(val) {\n  val = +val;\n\n  if (isNaN(val)) {\n    return 0;\n  } // It is much faster than methods converting number to string as follows\n  //      var tmp = val.toString();\n  //      return tmp.length - 1 - tmp.indexOf('.');\n  // especially when precision is low\n\n\n  var e = 1;\n  var count = 0;\n\n  while (Math.round(val * e) / e !== val) {\n    e *= 10;\n    count++;\n  }\n\n  return count;\n}\n/**\n * @param {string|number} val\n * @return {number}\n */\n\n\nfunction getPrecisionSafe(val) {\n  var str = val.toString(); // Consider scientific notation: '3.4e-12' '3.4e+12'\n\n  var eIndex = str.indexOf('e');\n\n  if (eIndex > 0) {\n    var precision = +str.slice(eIndex + 1);\n    return precision < 0 ? -precision : 0;\n  } else {\n    var dotIndex = str.indexOf('.');\n    return dotIndex < 0 ? 0 : str.length - 1 - dotIndex;\n  }\n}\n/**\n * Minimal dicernible data precisioin according to a single pixel.\n *\n * @param {Array.<number>} dataExtent\n * @param {Array.<number>} pixelExtent\n * @return {number} precision\n */\n\n\nfunction getPixelPrecision(dataExtent, pixelExtent) {\n  var log = Math.log;\n  var LN10 = Math.LN10;\n  var dataQuantity = Math.floor(log(dataExtent[1] - dataExtent[0]) / LN10);\n  var sizeQuantity = Math.round(log(Math.abs(pixelExtent[1] - pixelExtent[0])) / LN10); // toFixed() digits argument must be between 0 and 20.\n\n  var precision = Math.min(Math.max(-dataQuantity + sizeQuantity, 0), 20);\n  return !isFinite(precision) ? 20 : precision;\n}\n/**\n * Get a data of given precision, assuring the sum of percentages\n * in valueList is 1.\n * The largest remainer method is used.\n * https://en.wikipedia.org/wiki/Largest_remainder_method\n *\n * @param {Array.<number>} valueList a list of all data\n * @param {number} idx index of the data to be processed in valueList\n * @param {number} precision integer number showing digits of precision\n * @return {number} percent ranging from 0 to 100\n */\n\n\nfunction getPercentWithPrecision(valueList, idx, precision) {\n  if (!valueList[idx]) {\n    return 0;\n  }\n\n  var sum = zrUtil.reduce(valueList, function (acc, val) {\n    return acc + (isNaN(val) ? 0 : val);\n  }, 0);\n\n  if (sum === 0) {\n    return 0;\n  }\n\n  var digits = Math.pow(10, precision);\n  var votesPerQuota = zrUtil.map(valueList, function (val) {\n    return (isNaN(val) ? 0 : val) / sum * digits * 100;\n  });\n  var targetSeats = digits * 100;\n  var seats = zrUtil.map(votesPerQuota, function (votes) {\n    // Assign automatic seats.\n    return Math.floor(votes);\n  });\n  var currentSum = zrUtil.reduce(seats, function (acc, val) {\n    return acc + val;\n  }, 0);\n  var remainder = zrUtil.map(votesPerQuota, function (votes, idx) {\n    return votes - seats[idx];\n  }); // Has remainding votes.\n\n  while (currentSum < targetSeats) {\n    // Find next largest remainder.\n    var max = Number.NEGATIVE_INFINITY;\n    var maxId = null;\n\n    for (var i = 0, len = remainder.length; i < len; ++i) {\n      if (remainder[i] > max) {\n        max = remainder[i];\n        maxId = i;\n      }\n    } // Add a vote to max remainder.\n\n\n    ++seats[maxId];\n    remainder[maxId] = 0;\n    ++currentSum;\n  }\n\n  return seats[idx] / digits;\n} // Number.MAX_SAFE_INTEGER, ie do not support.\n\n\nvar MAX_SAFE_INTEGER = 9007199254740991;\n/**\n * To 0 - 2 * PI, considering negative radian.\n * @param {number} radian\n * @return {number}\n */\n\nfunction remRadian(radian) {\n  var pi2 = Math.PI * 2;\n  return (radian % pi2 + pi2) % pi2;\n}\n/**\n * @param {type} radian\n * @return {boolean}\n */\n\n\nfunction isRadianAroundZero(val) {\n  return val > -RADIAN_EPSILON && val < RADIAN_EPSILON;\n}\n\nvar TIME_REG = /^(?:(\\d{4})(?:[-\\/](\\d{1,2})(?:[-\\/](\\d{1,2})(?:[T ](\\d{1,2})(?::(\\d\\d)(?::(\\d\\d)(?:[.,](\\d+))?)?)?(Z|[\\+\\-]\\d\\d:?\\d\\d)?)?)?)?)?$/; // jshint ignore:line\n\n/**\n * @param {string|Date|number} value These values can be accepted:\n *   + An instance of Date, represent a time in its own time zone.\n *   + Or string in a subset of ISO 8601, only including:\n *     + only year, month, date: '2012-03', '2012-03-01', '2012-03-01 05', '2012-03-01 05:06',\n *     + separated with T or space: '2012-03-01T12:22:33.123', '2012-03-01 12:22:33.123',\n *     + time zone: '2012-03-01T12:22:33Z', '2012-03-01T12:22:33+8000', '2012-03-01T12:22:33-05:00',\n *     all of which will be treated as local time if time zone is not specified\n *     (see <https://momentjs.com/>).\n *   + Or other string format, including (all of which will be treated as loacal time):\n *     '2012', '2012-3-1', '2012/3/1', '2012/03/01',\n *     '2009/6/12 2:00', '2009/6/12 2:05:08', '2009/6/12 2:05:08.123'\n *   + a timestamp, which represent a time in UTC.\n * @return {Date} date\n */\n\nfunction parseDate(value) {\n  if (value instanceof Date) {\n    return value;\n  } else if (typeof value === 'string') {\n    // Different browsers parse date in different way, so we parse it manually.\n    // Some other issues:\n    // new Date('1970-01-01') is UTC,\n    // new Date('1970/01/01') and new Date('1970-1-01') is local.\n    // See issue #3623\n    var match = TIME_REG.exec(value);\n\n    if (!match) {\n      // return Invalid Date.\n      return new Date(NaN);\n    } // Use local time when no timezone offset specifed.\n\n\n    if (!match[8]) {\n      // match[n] can only be string or undefined.\n      // But take care of '12' + 1 => '121'.\n      return new Date(+match[1], +(match[2] || 1) - 1, +match[3] || 1, +match[4] || 0, +(match[5] || 0), +match[6] || 0, +match[7] || 0);\n    } // Timezoneoffset of Javascript Date has considered DST (Daylight Saving Time,\n    // https://tc39.github.io/ecma262/#sec-daylight-saving-time-adjustment).\n    // For example, system timezone is set as \"Time Zone: America/Toronto\",\n    // then these code will get different result:\n    // `new Date(1478411999999).getTimezoneOffset();  // get 240`\n    // `new Date(1478412000000).getTimezoneOffset();  // get 300`\n    // So we should not use `new Date`, but use `Date.UTC`.\n    else {\n        var hour = +match[4] || 0;\n\n        if (match[8].toUpperCase() !== 'Z') {\n          hour -= match[8].slice(0, 3);\n        }\n\n        return new Date(Date.UTC(+match[1], +(match[2] || 1) - 1, +match[3] || 1, hour, +(match[5] || 0), +match[6] || 0, +match[7] || 0));\n      }\n  } else if (value == null) {\n    return new Date(NaN);\n  }\n\n  return new Date(Math.round(value));\n}\n/**\n * Quantity of a number. e.g. 0.1, 1, 10, 100\n *\n * @param  {number} val\n * @return {number}\n */\n\n\nfunction quantity(val) {\n  return Math.pow(10, quantityExponent(val));\n}\n\nfunction quantityExponent(val) {\n  return Math.floor(Math.log(val) / Math.LN10);\n}\n/**\n * find a “nice” number approximately equal to x. Round the number if round = true,\n * take ceiling if round = false. The primary observation is that the “nicest”\n * numbers in decimal are 1, 2, and 5, and all power-of-ten multiples of these numbers.\n *\n * See \"Nice Numbers for Graph Labels\" of Graphic Gems.\n *\n * @param  {number} val Non-negative value.\n * @param  {boolean} round\n * @return {number}\n */\n\n\nfunction nice(val, round) {\n  var exponent = quantityExponent(val);\n  var exp10 = Math.pow(10, exponent);\n  var f = val / exp10; // 1 <= f < 10\n\n  var nf;\n\n  if (round) {\n    if (f < 1.5) {\n      nf = 1;\n    } else if (f < 2.5) {\n      nf = 2;\n    } else if (f < 4) {\n      nf = 3;\n    } else if (f < 7) {\n      nf = 5;\n    } else {\n      nf = 10;\n    }\n  } else {\n    if (f < 1) {\n      nf = 1;\n    } else if (f < 2) {\n      nf = 2;\n    } else if (f < 3) {\n      nf = 3;\n    } else if (f < 5) {\n      nf = 5;\n    } else {\n      nf = 10;\n    }\n  }\n\n  val = nf * exp10; // Fix 3 * 0.1 === 0.30000000000000004 issue (see IEEE 754).\n  // 20 is the uppper bound of toFixed.\n\n  return exponent >= -20 ? +val.toFixed(exponent < 0 ? -exponent : 0) : val;\n}\n/**\n * Order intervals asc, and split them when overlap.\n * expect(numberUtil.reformIntervals([\n *     {interval: [18, 62], close: [1, 1]},\n *     {interval: [-Infinity, -70], close: [0, 0]},\n *     {interval: [-70, -26], close: [1, 1]},\n *     {interval: [-26, 18], close: [1, 1]},\n *     {interval: [62, 150], close: [1, 1]},\n *     {interval: [106, 150], close: [1, 1]},\n *     {interval: [150, Infinity], close: [0, 0]}\n * ])).toEqual([\n *     {interval: [-Infinity, -70], close: [0, 0]},\n *     {interval: [-70, -26], close: [1, 1]},\n *     {interval: [-26, 18], close: [0, 1]},\n *     {interval: [18, 62], close: [0, 1]},\n *     {interval: [62, 150], close: [0, 1]},\n *     {interval: [150, Infinity], close: [0, 0]}\n * ]);\n * @param {Array.<Object>} list, where `close` mean open or close\n *        of the interval, and Infinity can be used.\n * @return {Array.<Object>} The origin list, which has been reformed.\n */\n\n\nfunction reformIntervals(list) {\n  list.sort(function (a, b) {\n    return littleThan(a, b, 0) ? -1 : 1;\n  });\n  var curr = -Infinity;\n  var currClose = 1;\n\n  for (var i = 0; i < list.length;) {\n    var interval = list[i].interval;\n    var close = list[i].close;\n\n    for (var lg = 0; lg < 2; lg++) {\n      if (interval[lg] <= curr) {\n        interval[lg] = curr;\n        close[lg] = !lg ? 1 - currClose : 1;\n      }\n\n      curr = interval[lg];\n      currClose = close[lg];\n    }\n\n    if (interval[0] === interval[1] && close[0] * close[1] !== 1) {\n      list.splice(i, 1);\n    } else {\n      i++;\n    }\n  }\n\n  return list;\n\n  function littleThan(a, b, lg) {\n    return a.interval[lg] < b.interval[lg] || a.interval[lg] === b.interval[lg] && (a.close[lg] - b.close[lg] === (!lg ? 1 : -1) || !lg && littleThan(a, b, 1));\n  }\n}\n/**\n * parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n * ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n * subtraction forces infinities to NaN\n *\n * @param {*} v\n * @return {boolean}\n */\n\n\nfunction isNumeric(v) {\n  return v - parseFloat(v) >= 0;\n}\n\nexports.linearMap = linearMap;\nexports.parsePercent = parsePercent;\nexports.round = round;\nexports.asc = asc;\nexports.getPrecision = getPrecision;\nexports.getPrecisionSafe = getPrecisionSafe;\nexports.getPixelPrecision = getPixelPrecision;\nexports.getPercentWithPrecision = getPercentWithPrecision;\nexports.MAX_SAFE_INTEGER = MAX_SAFE_INTEGER;\nexports.remRadian = remRadian;\nexports.isRadianAroundZero = isRadianAroundZero;\nexports.parseDate = parseDate;\nexports.quantity = quantity;\nexports.nice = nice;\nexports.reformIntervals = reformIntervals;\nexports.isNumeric = isNumeric;\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar LRU = __webpack_require__(14);\n\nvar globalImageCache = new LRU(50);\n/**\n * @param {string|HTMLImageElement|HTMLCanvasElement|Canvas} newImageOrSrc\n * @return {HTMLImageElement|HTMLCanvasElement|Canvas} image\n */\n\nfunction findExistImage(newImageOrSrc) {\n  if (typeof newImageOrSrc === 'string') {\n    var cachedImgObj = globalImageCache.get(newImageOrSrc);\n    return cachedImgObj && cachedImgObj.image;\n  } else {\n    return newImageOrSrc;\n  }\n}\n/**\n * Caution: User should cache loaded images, but not just count on LRU.\n * Consider if required images more than LRU size, will dead loop occur?\n *\n * @param {string|HTMLImageElement|HTMLCanvasElement|Canvas} newImageOrSrc\n * @param {HTMLImageElement|HTMLCanvasElement|Canvas} image Existent image.\n * @param {module:zrender/Element} [hostEl] For calling `dirty`.\n * @param {Function} [cb] params: (image, cbPayload)\n * @param {Object} [cbPayload] Payload on cb calling.\n * @return {HTMLImageElement|HTMLCanvasElement|Canvas} image\n */\n\n\nfunction createOrUpdateImage(newImageOrSrc, image, hostEl, cb, cbPayload) {\n  if (!newImageOrSrc) {\n    return image;\n  } else if (typeof newImageOrSrc === 'string') {\n    // Image should not be loaded repeatly.\n    if (image && image.__zrImageSrc === newImageOrSrc || !hostEl) {\n      return image;\n    } // Only when there is no existent image or existent image src\n    // is different, this method is responsible for load.\n\n\n    var cachedImgObj = globalImageCache.get(newImageOrSrc);\n    var pendingWrap = {\n      hostEl: hostEl,\n      cb: cb,\n      cbPayload: cbPayload\n    };\n\n    if (cachedImgObj) {\n      image = cachedImgObj.image;\n      !isImageReady(image) && cachedImgObj.pending.push(pendingWrap);\n    } else {\n      !image && (image = new Image());\n      image.onload = imageOnLoad;\n      globalImageCache.put(newImageOrSrc, image.__cachedImgObj = {\n        image: image,\n        pending: [pendingWrap]\n      });\n      image.src = image.__zrImageSrc = newImageOrSrc;\n    }\n\n    return image;\n  } // newImageOrSrc is an HTMLImageElement or HTMLCanvasElement or Canvas\n  else {\n      return newImageOrSrc;\n    }\n}\n\nfunction imageOnLoad() {\n  var cachedImgObj = this.__cachedImgObj;\n  this.onload = this.__cachedImgObj = null;\n\n  for (var i = 0; i < cachedImgObj.pending.length; i++) {\n    var pendingWrap = cachedImgObj.pending[i];\n    var cb = pendingWrap.cb;\n    cb && cb(this, pendingWrap.cbPayload);\n    pendingWrap.hostEl.dirty();\n  }\n\n  cachedImgObj.pending.length = 0;\n}\n\nfunction isImageReady(image) {\n  return image && image.width && image.height;\n}\n\nexports.findExistImage = findExistImage;\nexports.createOrUpdateImage = createOrUpdateImage;\nexports.isImageReady = isImageReady;\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar zrUtil = __webpack_require__(0);\n\n// TODO Parse shadow style\n// TODO Only shallow path support\nfunction _default(properties) {\n  // Normalize\n  for (var i = 0; i < properties.length; i++) {\n    if (!properties[i][1]) {\n      properties[i][1] = properties[i][0];\n    }\n  }\n\n  return function (model, excludes, includes) {\n    var style = {};\n\n    for (var i = 0; i < properties.length; i++) {\n      var propName = properties[i][1];\n\n      if (excludes && zrUtil.indexOf(excludes, propName) >= 0 || includes && zrUtil.indexOf(includes, propName) < 0) {\n        continue;\n      }\n\n      var val = model.getShallow(propName);\n\n      if (val != null) {\n        style[properties[i][0]] = val;\n      }\n    }\n\n    return style;\n  };\n}\n\nmodule.exports = _default;\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar zrUtil = __webpack_require__(0);\n\nvar Style = __webpack_require__(40);\n\nvar Element = __webpack_require__(16);\n\nvar RectText = __webpack_require__(48);\n\n/**\n * 可绘制的图形基类\n * Base class of all displayable graphic objects\n * @module zrender/graphic/Displayable\n */\n\n/**\n * @alias module:zrender/graphic/Displayable\n * @extends module:zrender/Element\n * @extends module:zrender/graphic/mixin/RectText\n */\nfunction Displayable(opts) {\n  opts = opts || {};\n  Element.call(this, opts); // Extend properties\n\n  for (var name in opts) {\n    if (opts.hasOwnProperty(name) && name !== 'style') {\n      this[name] = opts[name];\n    }\n  }\n  /**\n   * @type {module:zrender/graphic/Style}\n   */\n\n\n  this.style = new Style(opts.style, this);\n  this._rect = null; // Shapes for cascade clipping.\n\n  this.__clipPaths = []; // FIXME Stateful must be mixined after style is setted\n  // Stateful.call(this, opts);\n}\n\nDisplayable.prototype = {\n  constructor: Displayable,\n  type: 'displayable',\n\n  /**\n   * Displayable 是否为脏，Painter 中会根据该标记判断是否需要是否需要重新绘制\n   * Dirty flag. From which painter will determine if this displayable object needs brush\n   * @name module:zrender/graphic/Displayable#__dirty\n   * @type {boolean}\n   */\n  __dirty: true,\n\n  /**\n   * 图形是否可见，为true时不绘制图形，但是仍能触发鼠标事件\n   * If ignore drawing of the displayable object. Mouse event will still be triggered\n   * @name module:/zrender/graphic/Displayable#invisible\n   * @type {boolean}\n   * @default false\n   */\n  invisible: false,\n\n  /**\n   * @name module:/zrender/graphic/Displayable#z\n   * @type {number}\n   * @default 0\n   */\n  z: 0,\n\n  /**\n   * @name module:/zrender/graphic/Displayable#z\n   * @type {number}\n   * @default 0\n   */\n  z2: 0,\n\n  /**\n   * z层level，决定绘画在哪层canvas中\n   * @name module:/zrender/graphic/Displayable#zlevel\n   * @type {number}\n   * @default 0\n   */\n  zlevel: 0,\n\n  /**\n   * 是否可拖拽\n   * @name module:/zrender/graphic/Displayable#draggable\n   * @type {boolean}\n   * @default false\n   */\n  draggable: false,\n\n  /**\n   * 是否正在拖拽\n   * @name module:/zrender/graphic/Displayable#draggable\n   * @type {boolean}\n   * @default false\n   */\n  dragging: false,\n\n  /**\n   * 是否相应鼠标事件\n   * @name module:/zrender/graphic/Displayable#silent\n   * @type {boolean}\n   * @default false\n   */\n  silent: false,\n\n  /**\n   * If enable culling\n   * @type {boolean}\n   * @default false\n   */\n  culling: false,\n\n  /**\n   * Mouse cursor when hovered\n   * @name module:/zrender/graphic/Displayable#cursor\n   * @type {string}\n   */\n  cursor: 'pointer',\n\n  /**\n   * If hover area is bounding rect\n   * @name module:/zrender/graphic/Displayable#rectHover\n   * @type {string}\n   */\n  rectHover: false,\n\n  /**\n   * Render the element progressively when the value >= 0,\n   * usefull for large data.\n   * @type {number}\n   */\n  progressive: -1,\n  beforeBrush: function (ctx) {},\n  afterBrush: function (ctx) {},\n\n  /**\n   * 图形绘制方法\n   * @param {CanvasRenderingContext2D} ctx\n   */\n  // Interface\n  brush: function (ctx, prevEl) {},\n\n  /**\n   * 获取最小包围盒\n   * @return {module:zrender/core/BoundingRect}\n   */\n  // Interface\n  getBoundingRect: function () {},\n\n  /**\n   * 判断坐标 x, y 是否在图形上\n   * If displayable element contain coord x, y\n   * @param  {number} x\n   * @param  {number} y\n   * @return {boolean}\n   */\n  contain: function (x, y) {\n    return this.rectContain(x, y);\n  },\n\n  /**\n   * @param  {Function} cb\n   * @param  {}   context\n   */\n  traverse: function (cb, context) {\n    cb.call(context, this);\n  },\n\n  /**\n   * 判断坐标 x, y 是否在图形的包围盒上\n   * If bounding rect of element contain coord x, y\n   * @param  {number} x\n   * @param  {number} y\n   * @return {boolean}\n   */\n  rectContain: function (x, y) {\n    var coord = this.transformCoordToLocal(x, y);\n    var rect = this.getBoundingRect();\n    return rect.contain(coord[0], coord[1]);\n  },\n\n  /**\n   * 标记图形元素为脏，并且在下一帧重绘\n   * Mark displayable element dirty and refresh next frame\n   */\n  dirty: function () {\n    this.__dirty = true;\n    this._rect = null;\n    this.__zr && this.__zr.refresh();\n  },\n\n  /**\n   * 图形是否会触发事件\n   * If displayable object binded any event\n   * @return {boolean}\n   */\n  // TODO, 通过 bind 绑定的事件\n  // isSilent: function () {\n  //     return !(\n  //         this.hoverable || this.draggable\n  //         || this.onmousemove || this.onmouseover || this.onmouseout\n  //         || this.onmousedown || this.onmouseup || this.onclick\n  //         || this.ondragenter || this.ondragover || this.ondragleave\n  //         || this.ondrop\n  //     );\n  // },\n\n  /**\n   * Alias for animate('style')\n   * @param {boolean} loop\n   */\n  animateStyle: function (loop) {\n    return this.animate('style', loop);\n  },\n  attrKV: function (key, value) {\n    if (key !== 'style') {\n      Element.prototype.attrKV.call(this, key, value);\n    } else {\n      this.style.set(value);\n    }\n  },\n\n  /**\n   * @param {Object|string} key\n   * @param {*} value\n   */\n  setStyle: function (key, value) {\n    this.style.set(key, value);\n    this.dirty(false);\n    return this;\n  },\n\n  /**\n   * Use given style object\n   * @param  {Object} obj\n   */\n  useStyle: function (obj) {\n    this.style = new Style(obj, this);\n    this.dirty(false);\n    return this;\n  }\n};\nzrUtil.inherits(Displayable, Element);\nzrUtil.mixin(Displayable, RectText); // zrUtil.mixin(Displayable, Stateful);\n\nvar _default = Displayable;\nmodule.exports = _default;\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar zrUtil = __webpack_require__(0);\n\nvar textContain = __webpack_require__(5);\n\nvar numberUtil = __webpack_require__(9);\n\n/**\n * 每三位默认加,格式化\n * @param {string|number} x\n * @return {string}\n */\nfunction addCommas(x) {\n  if (isNaN(x)) {\n    return '-';\n  }\n\n  x = (x + '').split('.');\n  return x[0].replace(/(\\d{1,3})(?=(?:\\d{3})+(?!\\d))/g, '$1,') + (x.length > 1 ? '.' + x[1] : '');\n}\n/**\n * @param {string} str\n * @param {boolean} [upperCaseFirst=false]\n * @return {string} str\n */\n\n\nfunction toCamelCase(str, upperCaseFirst) {\n  str = (str || '').toLowerCase().replace(/-(.)/g, function (match, group1) {\n    return group1.toUpperCase();\n  });\n\n  if (upperCaseFirst && str) {\n    str = str.charAt(0).toUpperCase() + str.slice(1);\n  }\n\n  return str;\n}\n\nvar normalizeCssArray = zrUtil.normalizeCssArray;\n\nfunction encodeHTML(source) {\n  return String(source).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#39;');\n}\n\nvar TPL_VAR_ALIAS = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];\n\nvar wrapVar = function (varName, seriesIdx) {\n  return '{' + varName + (seriesIdx == null ? '' : seriesIdx) + '}';\n};\n/**\n * Template formatter\n * @param {string} tpl\n * @param {Array.<Object>|Object} paramsList\n * @param {boolean} [encode=false]\n * @return {string}\n */\n\n\nfunction formatTpl(tpl, paramsList, encode) {\n  if (!zrUtil.isArray(paramsList)) {\n    paramsList = [paramsList];\n  }\n\n  var seriesLen = paramsList.length;\n\n  if (!seriesLen) {\n    return '';\n  }\n\n  var $vars = paramsList[0].$vars || [];\n\n  for (var i = 0; i < $vars.length; i++) {\n    var alias = TPL_VAR_ALIAS[i];\n    var val = wrapVar(alias, 0);\n    tpl = tpl.replace(wrapVar(alias), encode ? encodeHTML(val) : val);\n  }\n\n  for (var seriesIdx = 0; seriesIdx < seriesLen; seriesIdx++) {\n    for (var k = 0; k < $vars.length; k++) {\n      var val = paramsList[seriesIdx][$vars[k]];\n      tpl = tpl.replace(wrapVar(TPL_VAR_ALIAS[k], seriesIdx), encode ? encodeHTML(val) : val);\n    }\n  }\n\n  return tpl;\n}\n/**\n * simple Template formatter\n *\n * @param {string} tpl\n * @param {Object} param\n * @param {boolean} [encode=false]\n * @return {string}\n */\n\n\nfunction formatTplSimple(tpl, param, encode) {\n  zrUtil.each(param, function (value, key) {\n    tpl = tpl.replace('{' + key + '}', encode ? encodeHTML(value) : value);\n  });\n  return tpl;\n}\n/**\n * @param {string} color\n * @param {string} [extraCssText]\n * @return {string}\n */\n\n\nfunction getTooltipMarker(color, extraCssText) {\n  return color ? '<span style=\"display:inline-block;margin-right:5px;' + 'border-radius:10px;width:9px;height:9px;background-color:' + encodeHTML(color) + ';' + (extraCssText || '') + '\"></span>' : '';\n}\n/**\n * @param {string} str\n * @return {string}\n * @inner\n */\n\n\nvar s2d = function (str) {\n  return str < 10 ? '0' + str : str;\n};\n/**\n * ISO Date format\n * @param {string} tpl\n * @param {number} value\n * @param {boolean} [isUTC=false] Default in local time.\n *           see `module:echarts/scale/Time`\n *           and `module:echarts/util/number#parseDate`.\n * @inner\n */\n\n\nfunction formatTime(tpl, value, isUTC) {\n  if (tpl === 'week' || tpl === 'month' || tpl === 'quarter' || tpl === 'half-year' || tpl === 'year') {\n    tpl = 'MM-dd\\nyyyy';\n  }\n\n  var date = numberUtil.parseDate(value);\n  var utc = isUTC ? 'UTC' : '';\n  var y = date['get' + utc + 'FullYear']();\n  var M = date['get' + utc + 'Month']() + 1;\n  var d = date['get' + utc + 'Date']();\n  var h = date['get' + utc + 'Hours']();\n  var m = date['get' + utc + 'Minutes']();\n  var s = date['get' + utc + 'Seconds']();\n  tpl = tpl.replace('MM', s2d(M)).replace('M', M).replace('yyyy', y).replace('yy', y % 100).replace('dd', s2d(d)).replace('d', d).replace('hh', s2d(h)).replace('h', h).replace('mm', s2d(m)).replace('m', m).replace('ss', s2d(s)).replace('s', s);\n  return tpl;\n}\n/**\n * Capital first\n * @param {string} str\n * @return {string}\n */\n\n\nfunction capitalFirst(str) {\n  return str ? str.charAt(0).toUpperCase() + str.substr(1) : str;\n}\n\nvar truncateText = textContain.truncateText;\nvar getTextRect = textContain.getBoundingRect;\nexports.addCommas = addCommas;\nexports.toCamelCase = toCamelCase;\nexports.normalizeCssArray = normalizeCssArray;\nexports.encodeHTML = encodeHTML;\nexports.formatTpl = formatTpl;\nexports.formatTplSimple = formatTplSimple;\nexports.getTooltipMarker = getTooltipMarker;\nexports.formatTime = formatTime;\nexports.capitalFirst = capitalFirst;\nexports.truncateText = truncateText;\nexports.getTextRect = getTextRect;\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports) {\n\n// Simple LRU cache use doubly linked list\n// @module zrender/core/LRU\n\n/**\n * Simple double linked list. Compared with array, it has O(1) remove operation.\n * @constructor\n */\nvar LinkedList = function () {\n  /**\n   * @type {module:zrender/core/LRU~Entry}\n   */\n  this.head = null;\n  /**\n   * @type {module:zrender/core/LRU~Entry}\n   */\n\n  this.tail = null;\n  this._len = 0;\n};\n\nvar linkedListProto = LinkedList.prototype;\n/**\n * Insert a new value at the tail\n * @param  {} val\n * @return {module:zrender/core/LRU~Entry}\n */\n\nlinkedListProto.insert = function (val) {\n  var entry = new Entry(val);\n  this.insertEntry(entry);\n  return entry;\n};\n/**\n * Insert an entry at the tail\n * @param  {module:zrender/core/LRU~Entry} entry\n */\n\n\nlinkedListProto.insertEntry = function (entry) {\n  if (!this.head) {\n    this.head = this.tail = entry;\n  } else {\n    this.tail.next = entry;\n    entry.prev = this.tail;\n    entry.next = null;\n    this.tail = entry;\n  }\n\n  this._len++;\n};\n/**\n * Remove entry.\n * @param  {module:zrender/core/LRU~Entry} entry\n */\n\n\nlinkedListProto.remove = function (entry) {\n  var prev = entry.prev;\n  var next = entry.next;\n\n  if (prev) {\n    prev.next = next;\n  } else {\n    // Is head\n    this.head = next;\n  }\n\n  if (next) {\n    next.prev = prev;\n  } else {\n    // Is tail\n    this.tail = prev;\n  }\n\n  entry.next = entry.prev = null;\n  this._len--;\n};\n/**\n * @return {number}\n */\n\n\nlinkedListProto.len = function () {\n  return this._len;\n};\n/**\n * Clear list\n */\n\n\nlinkedListProto.clear = function () {\n  this.head = this.tail = null;\n  this._len = 0;\n};\n/**\n * @constructor\n * @param {} val\n */\n\n\nvar Entry = function (val) {\n  /**\n   * @type {}\n   */\n  this.value = val;\n  /**\n   * @type {module:zrender/core/LRU~Entry}\n   */\n\n  this.next;\n  /**\n   * @type {module:zrender/core/LRU~Entry}\n   */\n\n  this.prev;\n};\n/**\n * LRU Cache\n * @constructor\n * @alias module:zrender/core/LRU\n */\n\n\nvar LRU = function (maxSize) {\n  this._list = new LinkedList();\n  this._map = {};\n  this._maxSize = maxSize || 10;\n  this._lastRemovedEntry = null;\n};\n\nvar LRUProto = LRU.prototype;\n/**\n * @param  {string} key\n * @param  {} value\n * @return {} Removed value\n */\n\nLRUProto.put = function (key, value) {\n  var list = this._list;\n  var map = this._map;\n  var removed = null;\n\n  if (map[key] == null) {\n    var len = list.len(); // Reuse last removed entry\n\n    var entry = this._lastRemovedEntry;\n\n    if (len >= this._maxSize && len > 0) {\n      // Remove the least recently used\n      var leastUsedEntry = list.head;\n      list.remove(leastUsedEntry);\n      delete map[leastUsedEntry.key];\n      removed = leastUsedEntry.value;\n      this._lastRemovedEntry = leastUsedEntry;\n    }\n\n    if (entry) {\n      entry.value = value;\n    } else {\n      entry = new Entry(value);\n    }\n\n    entry.key = key;\n    list.insertEntry(entry);\n    map[key] = entry;\n  }\n\n  return removed;\n};\n/**\n * @param  {string} key\n * @return {}\n */\n\n\nLRUProto.get = function (key) {\n  var entry = this._map[key];\n  var list = this._list;\n\n  if (entry != null) {\n    // Put the latest used entry in the tail\n    if (entry !== list.tail) {\n      list.remove(entry);\n      list.insertEntry(entry);\n    }\n\n    return entry.value;\n  }\n};\n/**\n * Clear the cache\n */\n\n\nLRUProto.clear = function () {\n  this._list.clear();\n\n  this._map = {};\n};\n\nvar _default = LRU;\nmodule.exports = _default;\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports) {\n\n/**\n * echarts设备环境识别\n *\n * @desc echarts基于Canvas，纯Javascript图表库，提供直观，生动，可交互，可个性化定制的数据统计图表。\n * @author firede[firede@firede.us]\n * @desc thanks zepto.\n */\nvar env = {};\n\nif (typeof navigator === 'undefined') {\n  // In node\n  env = {\n    browser: {},\n    os: {},\n    node: true,\n    // Assume canvas is supported\n    canvasSupported: true,\n    svgSupported: true\n  };\n} else {\n  env = detect(navigator.userAgent);\n}\n\nvar _default = env; // Zepto.js\n// (c) 2010-2013 Thomas Fuchs\n// Zepto.js may be freely distributed under the MIT license.\n\nfunction detect(ua) {\n  var os = {};\n  var browser = {}; // var webkit = ua.match(/Web[kK]it[\\/]{0,1}([\\d.]+)/);\n  // var android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/);\n  // var ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n  // var ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n  // var iphone = !ipad && ua.match(/(iPhone\\sOS)\\s([\\d_]+)/);\n  // var webos = ua.match(/(webOS|hpwOS)[\\s\\/]([\\d.]+)/);\n  // var touchpad = webos && ua.match(/TouchPad/);\n  // var kindle = ua.match(/Kindle\\/([\\d.]+)/);\n  // var silk = ua.match(/Silk\\/([\\d._]+)/);\n  // var blackberry = ua.match(/(BlackBerry).*Version\\/([\\d.]+)/);\n  // var bb10 = ua.match(/(BB10).*Version\\/([\\d.]+)/);\n  // var rimtabletos = ua.match(/(RIM\\sTablet\\sOS)\\s([\\d.]+)/);\n  // var playbook = ua.match(/PlayBook/);\n  // var chrome = ua.match(/Chrome\\/([\\d.]+)/) || ua.match(/CriOS\\/([\\d.]+)/);\n\n  var firefox = ua.match(/Firefox\\/([\\d.]+)/); // var safari = webkit && ua.match(/Mobile\\//) && !chrome;\n  // var webview = ua.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/) && !chrome;\n\n  var ie = ua.match(/MSIE\\s([\\d.]+)/) // IE 11 Trident/7.0; rv:11.0\n  || ua.match(/Trident\\/.+?rv:(([\\d.]+))/);\n  var edge = ua.match(/Edge\\/([\\d.]+)/); // IE 12 and 12+\n\n  var weChat = /micromessenger/i.test(ua); // Todo: clean this up with a better OS/browser seperation:\n  // - discern (more) between multiple browsers on android\n  // - decide if kindle fire in silk mode is android or not\n  // - Firefox on Android doesn't specify the Android version\n  // - possibly devide in os, device and browser hashes\n  // if (browser.webkit = !!webkit) browser.version = webkit[1];\n  // if (android) os.android = true, os.version = android[2];\n  // if (iphone && !ipod) os.ios = os.iphone = true, os.version = iphone[2].replace(/_/g, '.');\n  // if (ipad) os.ios = os.ipad = true, os.version = ipad[2].replace(/_/g, '.');\n  // if (ipod) os.ios = os.ipod = true, os.version = ipod[3] ? ipod[3].replace(/_/g, '.') : null;\n  // if (webos) os.webos = true, os.version = webos[2];\n  // if (touchpad) os.touchpad = true;\n  // if (blackberry) os.blackberry = true, os.version = blackberry[2];\n  // if (bb10) os.bb10 = true, os.version = bb10[2];\n  // if (rimtabletos) os.rimtabletos = true, os.version = rimtabletos[2];\n  // if (playbook) browser.playbook = true;\n  // if (kindle) os.kindle = true, os.version = kindle[1];\n  // if (silk) browser.silk = true, browser.version = silk[1];\n  // if (!silk && os.android && ua.match(/Kindle Fire/)) browser.silk = true;\n  // if (chrome) browser.chrome = true, browser.version = chrome[1];\n\n  if (firefox) {\n    browser.firefox = true;\n    browser.version = firefox[1];\n  } // if (safari && (ua.match(/Safari/) || !!os.ios)) browser.safari = true;\n  // if (webview) browser.webview = true;\n\n\n  if (ie) {\n    browser.ie = true;\n    browser.version = ie[1];\n  }\n\n  if (edge) {\n    browser.edge = true;\n    browser.version = edge[1];\n  } // It is difficult to detect WeChat in Win Phone precisely, because ua can\n  // not be set on win phone. So we do not consider Win Phone.\n\n\n  if (weChat) {\n    browser.weChat = true;\n  } // os.tablet = !!(ipad || playbook || (android && !ua.match(/Mobile/)) ||\n  //     (firefox && ua.match(/Tablet/)) || (ie && !ua.match(/Phone/) && ua.match(/Touch/)));\n  // os.phone  = !!(!os.tablet && !os.ipod && (android || iphone || webos ||\n  //     (chrome && ua.match(/Android/)) || (chrome && ua.match(/CriOS\\/([\\d.]+)/)) ||\n  //     (firefox && ua.match(/Mobile/)) || (ie && ua.match(/Touch/))));\n\n\n  return {\n    browser: browser,\n    os: os,\n    node: false,\n    // 原生canvas支持，改极端点了\n    // canvasSupported : !(browser.ie && parseFloat(browser.version) < 9)\n    canvasSupported: !!document.createElement('canvas').getContext,\n    svgSupported: typeof SVGRect !== 'undefined',\n    // @see <http://stackoverflow.com/questions/4817029/whats-the-best-way-to-detect-a-touch-screen-device-using-javascript>\n    // works on most browsers\n    // IE10/11 does not support touch event, and MS Edge supports them but not by\n    // default, so we dont check navigator.maxTouchPoints for them here.\n    touchEventsSupported: 'ontouchstart' in window && !browser.ie && !browser.edge,\n    // <http://caniuse.com/#search=pointer%20event>.\n    pointerEventsSupported: 'onpointerdown' in window // Firefox supports pointer but not by default, only MS browsers are reliable on pointer\n    // events currently. So we dont use that on other browsers unless tested sufficiently.\n    // Although IE 10 supports pointer event, it use old style and is different from the\n    // standard. So we exclude that. (IE 10 is hardly used on touch device)\n    && (browser.edge || browser.ie && browser.version >= 11)\n  };\n}\n\nmodule.exports = _default;\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar guid = __webpack_require__(41);\n\nvar Eventful = __webpack_require__(42);\n\nvar Transformable = __webpack_require__(17);\n\nvar Animatable = __webpack_require__(43);\n\nvar zrUtil = __webpack_require__(0);\n\n/**\n * @alias module:zrender/Element\n * @constructor\n * @extends {module:zrender/mixin/Animatable}\n * @extends {module:zrender/mixin/Transformable}\n * @extends {module:zrender/mixin/Eventful}\n */\nvar Element = function (opts) {\n  // jshint ignore:line\n  Transformable.call(this, opts);\n  Eventful.call(this, opts);\n  Animatable.call(this, opts);\n  /**\n   * 画布元素ID\n   * @type {string}\n   */\n\n  this.id = opts.id || guid();\n};\n\nElement.prototype = {\n  /**\n   * 元素类型\n   * Element type\n   * @type {string}\n   */\n  type: 'element',\n\n  /**\n   * 元素名字\n   * Element name\n   * @type {string}\n   */\n  name: '',\n\n  /**\n   * ZRender 实例对象，会在 element 添加到 zrender 实例中后自动赋值\n   * ZRender instance will be assigned when element is associated with zrender\n   * @name module:/zrender/Element#__zr\n   * @type {module:zrender/ZRender}\n   */\n  __zr: null,\n\n  /**\n   * 图形是否忽略，为true时忽略图形的绘制以及事件触发\n   * If ignore drawing and events of the element object\n   * @name module:/zrender/Element#ignore\n   * @type {boolean}\n   * @default false\n   */\n  ignore: false,\n\n  /**\n   * 用于裁剪的路径(shape)，所有 Group 内的路径在绘制时都会被这个路径裁剪\n   * 该路径会继承被裁减对象的变换\n   * @type {module:zrender/graphic/Path}\n   * @see http://www.w3.org/TR/2dcontext/#clipping-region\n   * @readOnly\n   */\n  clipPath: null,\n\n  /**\n   * Drift element\n   * @param  {number} dx dx on the global space\n   * @param  {number} dy dy on the global space\n   */\n  drift: function (dx, dy) {\n    switch (this.draggable) {\n      case 'horizontal':\n        dy = 0;\n        break;\n\n      case 'vertical':\n        dx = 0;\n        break;\n    }\n\n    var m = this.transform;\n\n    if (!m) {\n      m = this.transform = [1, 0, 0, 1, 0, 0];\n    }\n\n    m[4] += dx;\n    m[5] += dy;\n    this.decomposeTransform();\n    this.dirty(false);\n  },\n\n  /**\n   * Hook before update\n   */\n  beforeUpdate: function () {},\n\n  /**\n   * Hook after update\n   */\n  afterUpdate: function () {},\n\n  /**\n   * Update each frame\n   */\n  update: function () {\n    this.updateTransform();\n  },\n\n  /**\n   * @param  {Function} cb\n   * @param  {}   context\n   */\n  traverse: function (cb, context) {},\n\n  /**\n   * @protected\n   */\n  attrKV: function (key, value) {\n    if (key === 'position' || key === 'scale' || key === 'origin') {\n      // Copy the array\n      if (value) {\n        var target = this[key];\n\n        if (!target) {\n          target = this[key] = [];\n        }\n\n        target[0] = value[0];\n        target[1] = value[1];\n      }\n    } else {\n      this[key] = value;\n    }\n  },\n\n  /**\n   * Hide the element\n   */\n  hide: function () {\n    this.ignore = true;\n    this.__zr && this.__zr.refresh();\n  },\n\n  /**\n   * Show the element\n   */\n  show: function () {\n    this.ignore = false;\n    this.__zr && this.__zr.refresh();\n  },\n\n  /**\n   * @param {string|Object} key\n   * @param {*} value\n   */\n  attr: function (key, value) {\n    if (typeof key === 'string') {\n      this.attrKV(key, value);\n    } else if (zrUtil.isObject(key)) {\n      for (var name in key) {\n        if (key.hasOwnProperty(name)) {\n          this.attrKV(name, key[name]);\n        }\n      }\n    }\n\n    this.dirty(false);\n    return this;\n  },\n\n  /**\n   * @param {module:zrender/graphic/Path} clipPath\n   */\n  setClipPath: function (clipPath) {\n    var zr = this.__zr;\n\n    if (zr) {\n      clipPath.addSelfToZr(zr);\n    } // Remove previous clip path\n\n\n    if (this.clipPath && this.clipPath !== clipPath) {\n      this.removeClipPath();\n    }\n\n    this.clipPath = clipPath;\n    clipPath.__zr = zr;\n    clipPath.__clipTarget = this;\n    this.dirty(false);\n  },\n\n  /**\n   */\n  removeClipPath: function () {\n    var clipPath = this.clipPath;\n\n    if (clipPath) {\n      if (clipPath.__zr) {\n        clipPath.removeSelfFromZr(clipPath.__zr);\n      }\n\n      clipPath.__zr = null;\n      clipPath.__clipTarget = null;\n      this.clipPath = null;\n      this.dirty(false);\n    }\n  },\n\n  /**\n   * Add self from zrender instance.\n   * Not recursively because it will be invoked when element added to storage.\n   * @param {module:zrender/ZRender} zr\n   */\n  addSelfToZr: function (zr) {\n    this.__zr = zr; // 添加动画\n\n    var animators = this.animators;\n\n    if (animators) {\n      for (var i = 0; i < animators.length; i++) {\n        zr.animation.addAnimator(animators[i]);\n      }\n    }\n\n    if (this.clipPath) {\n      this.clipPath.addSelfToZr(zr);\n    }\n  },\n\n  /**\n   * Remove self from zrender instance.\n   * Not recursively because it will be invoked when element added to storage.\n   * @param {module:zrender/ZRender} zr\n   */\n  removeSelfFromZr: function (zr) {\n    this.__zr = null; // 移除动画\n\n    var animators = this.animators;\n\n    if (animators) {\n      for (var i = 0; i < animators.length; i++) {\n        zr.animation.removeAnimator(animators[i]);\n      }\n    }\n\n    if (this.clipPath) {\n      this.clipPath.removeSelfFromZr(zr);\n    }\n  }\n};\nzrUtil.mixin(Element, Animatable);\nzrUtil.mixin(Element, Transformable);\nzrUtil.mixin(Element, Eventful);\nvar _default = Element;\nmodule.exports = _default;\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar matrix = __webpack_require__(8);\n\nvar vector = __webpack_require__(2);\n\n/**\n * 提供变换扩展\n * @module zrender/mixin/Transformable\n * @author pissang (https://www.github.com/pissang)\n */\nvar mIdentity = matrix.identity;\nvar EPSILON = 5e-5;\n\nfunction isNotAroundZero(val) {\n  return val > EPSILON || val < -EPSILON;\n}\n/**\n * @alias module:zrender/mixin/Transformable\n * @constructor\n */\n\n\nvar Transformable = function (opts) {\n  opts = opts || {}; // If there are no given position, rotation, scale\n\n  if (!opts.position) {\n    /**\n     * 平移\n     * @type {Array.<number>}\n     * @default [0, 0]\n     */\n    this.position = [0, 0];\n  }\n\n  if (opts.rotation == null) {\n    /**\n     * 旋转\n     * @type {Array.<number>}\n     * @default 0\n     */\n    this.rotation = 0;\n  }\n\n  if (!opts.scale) {\n    /**\n     * 缩放\n     * @type {Array.<number>}\n     * @default [1, 1]\n     */\n    this.scale = [1, 1];\n  }\n  /**\n   * 旋转和缩放的原点\n   * @type {Array.<number>}\n   * @default null\n   */\n\n\n  this.origin = this.origin || null;\n};\n\nvar transformableProto = Transformable.prototype;\ntransformableProto.transform = null;\n/**\n * 判断是否需要有坐标变换\n * 如果有坐标变换, 则从position, rotation, scale以及父节点的transform计算出自身的transform矩阵\n */\n\ntransformableProto.needLocalTransform = function () {\n  return isNotAroundZero(this.rotation) || isNotAroundZero(this.position[0]) || isNotAroundZero(this.position[1]) || isNotAroundZero(this.scale[0] - 1) || isNotAroundZero(this.scale[1] - 1);\n};\n\ntransformableProto.updateTransform = function () {\n  var parent = this.parent;\n  var parentHasTransform = parent && parent.transform;\n  var needLocalTransform = this.needLocalTransform();\n  var m = this.transform;\n\n  if (!(needLocalTransform || parentHasTransform)) {\n    m && mIdentity(m);\n    return;\n  }\n\n  m = m || matrix.create();\n\n  if (needLocalTransform) {\n    this.getLocalTransform(m);\n  } else {\n    mIdentity(m);\n  } // 应用父节点变换\n\n\n  if (parentHasTransform) {\n    if (needLocalTransform) {\n      matrix.mul(m, parent.transform, m);\n    } else {\n      matrix.copy(m, parent.transform);\n    }\n  } // 保存这个变换矩阵\n\n\n  this.transform = m;\n  this.invTransform = this.invTransform || matrix.create();\n  matrix.invert(this.invTransform, m);\n};\n\ntransformableProto.getLocalTransform = function (m) {\n  return Transformable.getLocalTransform(this, m);\n};\n/**\n * 将自己的transform应用到context上\n * @param {CanvasRenderingContext2D} ctx\n */\n\n\ntransformableProto.setTransform = function (ctx) {\n  var m = this.transform;\n  var dpr = ctx.dpr || 1;\n\n  if (m) {\n    ctx.setTransform(dpr * m[0], dpr * m[1], dpr * m[2], dpr * m[3], dpr * m[4], dpr * m[5]);\n  } else {\n    ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n  }\n};\n\ntransformableProto.restoreTransform = function (ctx) {\n  var dpr = ctx.dpr || 1;\n  ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n};\n\nvar tmpTransform = [];\n/**\n * 分解`transform`矩阵到`position`, `rotation`, `scale`\n */\n\ntransformableProto.decomposeTransform = function () {\n  if (!this.transform) {\n    return;\n  }\n\n  var parent = this.parent;\n  var m = this.transform;\n\n  if (parent && parent.transform) {\n    // Get local transform and decompose them to position, scale, rotation\n    matrix.mul(tmpTransform, parent.invTransform, m);\n    m = tmpTransform;\n  }\n\n  var sx = m[0] * m[0] + m[1] * m[1];\n  var sy = m[2] * m[2] + m[3] * m[3];\n  var position = this.position;\n  var scale = this.scale;\n\n  if (isNotAroundZero(sx - 1)) {\n    sx = Math.sqrt(sx);\n  }\n\n  if (isNotAroundZero(sy - 1)) {\n    sy = Math.sqrt(sy);\n  }\n\n  if (m[0] < 0) {\n    sx = -sx;\n  }\n\n  if (m[3] < 0) {\n    sy = -sy;\n  }\n\n  position[0] = m[4];\n  position[1] = m[5];\n  scale[0] = sx;\n  scale[1] = sy;\n  this.rotation = Math.atan2(-m[1] / sy, m[0] / sx);\n};\n/**\n * Get global scale\n * @return {Array.<number>}\n */\n\n\ntransformableProto.getGlobalScale = function () {\n  var m = this.transform;\n\n  if (!m) {\n    return [1, 1];\n  }\n\n  var sx = Math.sqrt(m[0] * m[0] + m[1] * m[1]);\n  var sy = Math.sqrt(m[2] * m[2] + m[3] * m[3]);\n\n  if (m[0] < 0) {\n    sx = -sx;\n  }\n\n  if (m[3] < 0) {\n    sy = -sy;\n  }\n\n  return [sx, sy];\n};\n/**\n * 变换坐标位置到 shape 的局部坐标空间\n * @method\n * @param {number} x\n * @param {number} y\n * @return {Array.<number>}\n */\n\n\ntransformableProto.transformCoordToLocal = function (x, y) {\n  var v2 = [x, y];\n  var invTransform = this.invTransform;\n\n  if (invTransform) {\n    vector.applyTransform(v2, v2, invTransform);\n  }\n\n  return v2;\n};\n/**\n * 变换局部坐标位置到全局坐标空间\n * @method\n * @param {number} x\n * @param {number} y\n * @return {Array.<number>}\n */\n\n\ntransformableProto.transformCoordToGlobal = function (x, y) {\n  var v2 = [x, y];\n  var transform = this.transform;\n\n  if (transform) {\n    vector.applyTransform(v2, v2, transform);\n  }\n\n  return v2;\n};\n/**\n * @static\n * @param {Object} target\n * @param {Array.<number>} target.origin\n * @param {number} target.rotation\n * @param {Array.<number>} target.position\n * @param {Array.<number>} [m]\n */\n\n\nTransformable.getLocalTransform = function (target, m) {\n  m = m || [];\n  mIdentity(m);\n  var origin = target.origin;\n  var scale = target.scale || [1, 1];\n  var rotation = target.rotation || 0;\n  var position = target.position || [0, 0];\n\n  if (origin) {\n    // Translate to origin\n    m[4] -= origin[0];\n    m[5] -= origin[1];\n  }\n\n  matrix.scale(m, m, scale);\n\n  if (rotation) {\n    matrix.rotate(m, m, rotation);\n  }\n\n  if (origin) {\n    // Translate back from origin\n    m[4] += origin[0];\n    m[5] += origin[1];\n  }\n\n  m[4] += position[0];\n  m[5] += position[1];\n  return m;\n};\n\nvar _default = Transformable;\nmodule.exports = _default;\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar LRU = __webpack_require__(14);\n\nvar kCSSColorTable = {\n  'transparent': [0, 0, 0, 0],\n  'aliceblue': [240, 248, 255, 1],\n  'antiquewhite': [250, 235, 215, 1],\n  'aqua': [0, 255, 255, 1],\n  'aquamarine': [127, 255, 212, 1],\n  'azure': [240, 255, 255, 1],\n  'beige': [245, 245, 220, 1],\n  'bisque': [255, 228, 196, 1],\n  'black': [0, 0, 0, 1],\n  'blanchedalmond': [255, 235, 205, 1],\n  'blue': [0, 0, 255, 1],\n  'blueviolet': [138, 43, 226, 1],\n  'brown': [165, 42, 42, 1],\n  'burlywood': [222, 184, 135, 1],\n  'cadetblue': [95, 158, 160, 1],\n  'chartreuse': [127, 255, 0, 1],\n  'chocolate': [210, 105, 30, 1],\n  'coral': [255, 127, 80, 1],\n  'cornflowerblue': [100, 149, 237, 1],\n  'cornsilk': [255, 248, 220, 1],\n  'crimson': [220, 20, 60, 1],\n  'cyan': [0, 255, 255, 1],\n  'darkblue': [0, 0, 139, 1],\n  'darkcyan': [0, 139, 139, 1],\n  'darkgoldenrod': [184, 134, 11, 1],\n  'darkgray': [169, 169, 169, 1],\n  'darkgreen': [0, 100, 0, 1],\n  'darkgrey': [169, 169, 169, 1],\n  'darkkhaki': [189, 183, 107, 1],\n  'darkmagenta': [139, 0, 139, 1],\n  'darkolivegreen': [85, 107, 47, 1],\n  'darkorange': [255, 140, 0, 1],\n  'darkorchid': [153, 50, 204, 1],\n  'darkred': [139, 0, 0, 1],\n  'darksalmon': [233, 150, 122, 1],\n  'darkseagreen': [143, 188, 143, 1],\n  'darkslateblue': [72, 61, 139, 1],\n  'darkslategray': [47, 79, 79, 1],\n  'darkslategrey': [47, 79, 79, 1],\n  'darkturquoise': [0, 206, 209, 1],\n  'darkviolet': [148, 0, 211, 1],\n  'deeppink': [255, 20, 147, 1],\n  'deepskyblue': [0, 191, 255, 1],\n  'dimgray': [105, 105, 105, 1],\n  'dimgrey': [105, 105, 105, 1],\n  'dodgerblue': [30, 144, 255, 1],\n  'firebrick': [178, 34, 34, 1],\n  'floralwhite': [255, 250, 240, 1],\n  'forestgreen': [34, 139, 34, 1],\n  'fuchsia': [255, 0, 255, 1],\n  'gainsboro': [220, 220, 220, 1],\n  'ghostwhite': [248, 248, 255, 1],\n  'gold': [255, 215, 0, 1],\n  'goldenrod': [218, 165, 32, 1],\n  'gray': [128, 128, 128, 1],\n  'green': [0, 128, 0, 1],\n  'greenyellow': [173, 255, 47, 1],\n  'grey': [128, 128, 128, 1],\n  'honeydew': [240, 255, 240, 1],\n  'hotpink': [255, 105, 180, 1],\n  'indianred': [205, 92, 92, 1],\n  'indigo': [75, 0, 130, 1],\n  'ivory': [255, 255, 240, 1],\n  'khaki': [240, 230, 140, 1],\n  'lavender': [230, 230, 250, 1],\n  'lavenderblush': [255, 240, 245, 1],\n  'lawngreen': [124, 252, 0, 1],\n  'lemonchiffon': [255, 250, 205, 1],\n  'lightblue': [173, 216, 230, 1],\n  'lightcoral': [240, 128, 128, 1],\n  'lightcyan': [224, 255, 255, 1],\n  'lightgoldenrodyellow': [250, 250, 210, 1],\n  'lightgray': [211, 211, 211, 1],\n  'lightgreen': [144, 238, 144, 1],\n  'lightgrey': [211, 211, 211, 1],\n  'lightpink': [255, 182, 193, 1],\n  'lightsalmon': [255, 160, 122, 1],\n  'lightseagreen': [32, 178, 170, 1],\n  'lightskyblue': [135, 206, 250, 1],\n  'lightslategray': [119, 136, 153, 1],\n  'lightslategrey': [119, 136, 153, 1],\n  'lightsteelblue': [176, 196, 222, 1],\n  'lightyellow': [255, 255, 224, 1],\n  'lime': [0, 255, 0, 1],\n  'limegreen': [50, 205, 50, 1],\n  'linen': [250, 240, 230, 1],\n  'magenta': [255, 0, 255, 1],\n  'maroon': [128, 0, 0, 1],\n  'mediumaquamarine': [102, 205, 170, 1],\n  'mediumblue': [0, 0, 205, 1],\n  'mediumorchid': [186, 85, 211, 1],\n  'mediumpurple': [147, 112, 219, 1],\n  'mediumseagreen': [60, 179, 113, 1],\n  'mediumslateblue': [123, 104, 238, 1],\n  'mediumspringgreen': [0, 250, 154, 1],\n  'mediumturquoise': [72, 209, 204, 1],\n  'mediumvioletred': [199, 21, 133, 1],\n  'midnightblue': [25, 25, 112, 1],\n  'mintcream': [245, 255, 250, 1],\n  'mistyrose': [255, 228, 225, 1],\n  'moccasin': [255, 228, 181, 1],\n  'navajowhite': [255, 222, 173, 1],\n  'navy': [0, 0, 128, 1],\n  'oldlace': [253, 245, 230, 1],\n  'olive': [128, 128, 0, 1],\n  'olivedrab': [107, 142, 35, 1],\n  'orange': [255, 165, 0, 1],\n  'orangered': [255, 69, 0, 1],\n  'orchid': [218, 112, 214, 1],\n  'palegoldenrod': [238, 232, 170, 1],\n  'palegreen': [152, 251, 152, 1],\n  'paleturquoise': [175, 238, 238, 1],\n  'palevioletred': [219, 112, 147, 1],\n  'papayawhip': [255, 239, 213, 1],\n  'peachpuff': [255, 218, 185, 1],\n  'peru': [205, 133, 63, 1],\n  'pink': [255, 192, 203, 1],\n  'plum': [221, 160, 221, 1],\n  'powderblue': [176, 224, 230, 1],\n  'purple': [128, 0, 128, 1],\n  'red': [255, 0, 0, 1],\n  'rosybrown': [188, 143, 143, 1],\n  'royalblue': [65, 105, 225, 1],\n  'saddlebrown': [139, 69, 19, 1],\n  'salmon': [250, 128, 114, 1],\n  'sandybrown': [244, 164, 96, 1],\n  'seagreen': [46, 139, 87, 1],\n  'seashell': [255, 245, 238, 1],\n  'sienna': [160, 82, 45, 1],\n  'silver': [192, 192, 192, 1],\n  'skyblue': [135, 206, 235, 1],\n  'slateblue': [106, 90, 205, 1],\n  'slategray': [112, 128, 144, 1],\n  'slategrey': [112, 128, 144, 1],\n  'snow': [255, 250, 250, 1],\n  'springgreen': [0, 255, 127, 1],\n  'steelblue': [70, 130, 180, 1],\n  'tan': [210, 180, 140, 1],\n  'teal': [0, 128, 128, 1],\n  'thistle': [216, 191, 216, 1],\n  'tomato': [255, 99, 71, 1],\n  'turquoise': [64, 224, 208, 1],\n  'violet': [238, 130, 238, 1],\n  'wheat': [245, 222, 179, 1],\n  'white': [255, 255, 255, 1],\n  'whitesmoke': [245, 245, 245, 1],\n  'yellow': [255, 255, 0, 1],\n  'yellowgreen': [154, 205, 50, 1]\n};\n\nfunction clampCssByte(i) {\n  // Clamp to integer 0 .. 255.\n  i = Math.round(i); // Seems to be what Chrome does (vs truncation).\n\n  return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clampCssAngle(i) {\n  // Clamp to integer 0 .. 360.\n  i = Math.round(i); // Seems to be what Chrome does (vs truncation).\n\n  return i < 0 ? 0 : i > 360 ? 360 : i;\n}\n\nfunction clampCssFloat(f) {\n  // Clamp to float 0.0 .. 1.0.\n  return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parseCssInt(str) {\n  // int or percentage.\n  if (str.length && str.charAt(str.length - 1) === '%') {\n    return clampCssByte(parseFloat(str) / 100 * 255);\n  }\n\n  return clampCssByte(parseInt(str, 10));\n}\n\nfunction parseCssFloat(str) {\n  // float or percentage.\n  if (str.length && str.charAt(str.length - 1) === '%') {\n    return clampCssFloat(parseFloat(str) / 100);\n  }\n\n  return clampCssFloat(parseFloat(str));\n}\n\nfunction cssHueToRgb(m1, m2, h) {\n  if (h < 0) {\n    h += 1;\n  } else if (h > 1) {\n    h -= 1;\n  }\n\n  if (h * 6 < 1) {\n    return m1 + (m2 - m1) * h * 6;\n  }\n\n  if (h * 2 < 1) {\n    return m2;\n  }\n\n  if (h * 3 < 2) {\n    return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n  }\n\n  return m1;\n}\n\nfunction lerpNumber(a, b, p) {\n  return a + (b - a) * p;\n}\n\nfunction setRgba(out, r, g, b, a) {\n  out[0] = r;\n  out[1] = g;\n  out[2] = b;\n  out[3] = a;\n  return out;\n}\n\nfunction copyRgba(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  return out;\n}\n\nvar colorCache = new LRU(20);\nvar lastRemovedArr = null;\n\nfunction putToCache(colorStr, rgbaArr) {\n  // Reuse removed array\n  if (lastRemovedArr) {\n    copyRgba(lastRemovedArr, rgbaArr);\n  }\n\n  lastRemovedArr = colorCache.put(colorStr, lastRemovedArr || rgbaArr.slice());\n}\n/**\n * @param {string} colorStr\n * @param {Array.<number>} out\n * @return {Array.<number>}\n * @memberOf module:zrender/util/color\n */\n\n\nfunction parse(colorStr, rgbaArr) {\n  if (!colorStr) {\n    return;\n  }\n\n  rgbaArr = rgbaArr || [];\n  var cached = colorCache.get(colorStr);\n\n  if (cached) {\n    return copyRgba(rgbaArr, cached);\n  } // colorStr may be not string\n\n\n  colorStr = colorStr + ''; // Remove all whitespace, not compliant, but should just be more accepting.\n\n  var str = colorStr.replace(/ /g, '').toLowerCase(); // Color keywords (and transparent) lookup.\n\n  if (str in kCSSColorTable) {\n    copyRgba(rgbaArr, kCSSColorTable[str]);\n    putToCache(colorStr, rgbaArr);\n    return rgbaArr;\n  } // #abc and #abc123 syntax.\n\n\n  if (str.charAt(0) === '#') {\n    if (str.length === 4) {\n      var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n\n      if (!(iv >= 0 && iv <= 0xfff)) {\n        setRgba(rgbaArr, 0, 0, 0, 1);\n        return; // Covers NaN.\n      }\n\n      setRgba(rgbaArr, (iv & 0xf00) >> 4 | (iv & 0xf00) >> 8, iv & 0xf0 | (iv & 0xf0) >> 4, iv & 0xf | (iv & 0xf) << 4, 1);\n      putToCache(colorStr, rgbaArr);\n      return rgbaArr;\n    } else if (str.length === 7) {\n      var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n\n      if (!(iv >= 0 && iv <= 0xffffff)) {\n        setRgba(rgbaArr, 0, 0, 0, 1);\n        return; // Covers NaN.\n      }\n\n      setRgba(rgbaArr, (iv & 0xff0000) >> 16, (iv & 0xff00) >> 8, iv & 0xff, 1);\n      putToCache(colorStr, rgbaArr);\n      return rgbaArr;\n    }\n\n    return;\n  }\n\n  var op = str.indexOf('('),\n      ep = str.indexOf(')');\n\n  if (op !== -1 && ep + 1 === str.length) {\n    var fname = str.substr(0, op);\n    var params = str.substr(op + 1, ep - (op + 1)).split(',');\n    var alpha = 1; // To allow case fallthrough.\n\n    switch (fname) {\n      case 'rgba':\n        if (params.length !== 4) {\n          setRgba(rgbaArr, 0, 0, 0, 1);\n          return;\n        }\n\n        alpha = parseCssFloat(params.pop());\n      // jshint ignore:line\n      // Fall through.\n\n      case 'rgb':\n        if (params.length !== 3) {\n          setRgba(rgbaArr, 0, 0, 0, 1);\n          return;\n        }\n\n        setRgba(rgbaArr, parseCssInt(params[0]), parseCssInt(params[1]), parseCssInt(params[2]), alpha);\n        putToCache(colorStr, rgbaArr);\n        return rgbaArr;\n\n      case 'hsla':\n        if (params.length !== 4) {\n          setRgba(rgbaArr, 0, 0, 0, 1);\n          return;\n        }\n\n        params[3] = parseCssFloat(params[3]);\n        hsla2rgba(params, rgbaArr);\n        putToCache(colorStr, rgbaArr);\n        return rgbaArr;\n\n      case 'hsl':\n        if (params.length !== 3) {\n          setRgba(rgbaArr, 0, 0, 0, 1);\n          return;\n        }\n\n        hsla2rgba(params, rgbaArr);\n        putToCache(colorStr, rgbaArr);\n        return rgbaArr;\n\n      default:\n        return;\n    }\n  }\n\n  setRgba(rgbaArr, 0, 0, 0, 1);\n  return;\n}\n/**\n * @param {Array.<number>} hsla\n * @param {Array.<number>} rgba\n * @return {Array.<number>} rgba\n */\n\n\nfunction hsla2rgba(hsla, rgba) {\n  var h = (parseFloat(hsla[0]) % 360 + 360) % 360 / 360; // 0 .. 1\n  // NOTE(deanm): According to the CSS spec s/l should only be\n  // percentages, but we don't bother and let float or percentage.\n\n  var s = parseCssFloat(hsla[1]);\n  var l = parseCssFloat(hsla[2]);\n  var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n  var m1 = l * 2 - m2;\n  rgba = rgba || [];\n  setRgba(rgba, clampCssByte(cssHueToRgb(m1, m2, h + 1 / 3) * 255), clampCssByte(cssHueToRgb(m1, m2, h) * 255), clampCssByte(cssHueToRgb(m1, m2, h - 1 / 3) * 255), 1);\n\n  if (hsla.length === 4) {\n    rgba[3] = hsla[3];\n  }\n\n  return rgba;\n}\n/**\n * @param {Array.<number>} rgba\n * @return {Array.<number>} hsla\n */\n\n\nfunction rgba2hsla(rgba) {\n  if (!rgba) {\n    return;\n  } // RGB from 0 to 255\n\n\n  var R = rgba[0] / 255;\n  var G = rgba[1] / 255;\n  var B = rgba[2] / 255;\n  var vMin = Math.min(R, G, B); // Min. value of RGB\n\n  var vMax = Math.max(R, G, B); // Max. value of RGB\n\n  var delta = vMax - vMin; // Delta RGB value\n\n  var L = (vMax + vMin) / 2;\n  var H;\n  var S; // HSL results from 0 to 1\n\n  if (delta === 0) {\n    H = 0;\n    S = 0;\n  } else {\n    if (L < 0.5) {\n      S = delta / (vMax + vMin);\n    } else {\n      S = delta / (2 - vMax - vMin);\n    }\n\n    var deltaR = ((vMax - R) / 6 + delta / 2) / delta;\n    var deltaG = ((vMax - G) / 6 + delta / 2) / delta;\n    var deltaB = ((vMax - B) / 6 + delta / 2) / delta;\n\n    if (R === vMax) {\n      H = deltaB - deltaG;\n    } else if (G === vMax) {\n      H = 1 / 3 + deltaR - deltaB;\n    } else if (B === vMax) {\n      H = 2 / 3 + deltaG - deltaR;\n    }\n\n    if (H < 0) {\n      H += 1;\n    }\n\n    if (H > 1) {\n      H -= 1;\n    }\n  }\n\n  var hsla = [H * 360, S, L];\n\n  if (rgba[3] != null) {\n    hsla.push(rgba[3]);\n  }\n\n  return hsla;\n}\n/**\n * @param {string} color\n * @param {number} level\n * @return {string}\n * @memberOf module:zrender/util/color\n */\n\n\nfunction lift(color, level) {\n  var colorArr = parse(color);\n\n  if (colorArr) {\n    for (var i = 0; i < 3; i++) {\n      if (level < 0) {\n        colorArr[i] = colorArr[i] * (1 - level) | 0;\n      } else {\n        colorArr[i] = (255 - colorArr[i]) * level + colorArr[i] | 0;\n      }\n    }\n\n    return stringify(colorArr, colorArr.length === 4 ? 'rgba' : 'rgb');\n  }\n}\n/**\n * @param {string} color\n * @return {string}\n * @memberOf module:zrender/util/color\n */\n\n\nfunction toHex(color) {\n  var colorArr = parse(color);\n\n  if (colorArr) {\n    return ((1 << 24) + (colorArr[0] << 16) + (colorArr[1] << 8) + +colorArr[2]).toString(16).slice(1);\n  }\n}\n/**\n * Map value to color. Faster than lerp methods because color is represented by rgba array.\n * @param {number} normalizedValue A float between 0 and 1.\n * @param {Array.<Array.<number>>} colors List of rgba color array\n * @param {Array.<number>} [out] Mapped gba color array\n * @return {Array.<number>} will be null/undefined if input illegal.\n */\n\n\nfunction fastLerp(normalizedValue, colors, out) {\n  if (!(colors && colors.length) || !(normalizedValue >= 0 && normalizedValue <= 1)) {\n    return;\n  }\n\n  out = out || [];\n  var value = normalizedValue * (colors.length - 1);\n  var leftIndex = Math.floor(value);\n  var rightIndex = Math.ceil(value);\n  var leftColor = colors[leftIndex];\n  var rightColor = colors[rightIndex];\n  var dv = value - leftIndex;\n  out[0] = clampCssByte(lerpNumber(leftColor[0], rightColor[0], dv));\n  out[1] = clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv));\n  out[2] = clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv));\n  out[3] = clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv));\n  return out;\n}\n/**\n * @deprecated\n */\n\n\nvar fastMapToColor = fastLerp;\n/**\n * @param {number} normalizedValue A float between 0 and 1.\n * @param {Array.<string>} colors Color list.\n * @param {boolean=} fullOutput Default false.\n * @return {(string|Object)} Result color. If fullOutput,\n *                           return {color: ..., leftIndex: ..., rightIndex: ..., value: ...},\n * @memberOf module:zrender/util/color\n */\n\nfunction lerp(normalizedValue, colors, fullOutput) {\n  if (!(colors && colors.length) || !(normalizedValue >= 0 && normalizedValue <= 1)) {\n    return;\n  }\n\n  var value = normalizedValue * (colors.length - 1);\n  var leftIndex = Math.floor(value);\n  var rightIndex = Math.ceil(value);\n  var leftColor = parse(colors[leftIndex]);\n  var rightColor = parse(colors[rightIndex]);\n  var dv = value - leftIndex;\n  var color = stringify([clampCssByte(lerpNumber(leftColor[0], rightColor[0], dv)), clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv)), clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv)), clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv))], 'rgba');\n  return fullOutput ? {\n    color: color,\n    leftIndex: leftIndex,\n    rightIndex: rightIndex,\n    value: value\n  } : color;\n}\n/**\n * @deprecated\n */\n\n\nvar mapToColor = lerp;\n/**\n * @param {string} color\n * @param {number=} h 0 ~ 360, ignore when null.\n * @param {number=} s 0 ~ 1, ignore when null.\n * @param {number=} l 0 ~ 1, ignore when null.\n * @return {string} Color string in rgba format.\n * @memberOf module:zrender/util/color\n */\n\nfunction modifyHSL(color, h, s, l) {\n  color = parse(color);\n\n  if (color) {\n    color = rgba2hsla(color);\n    h != null && (color[0] = clampCssAngle(h));\n    s != null && (color[1] = parseCssFloat(s));\n    l != null && (color[2] = parseCssFloat(l));\n    return stringify(hsla2rgba(color), 'rgba');\n  }\n}\n/**\n * @param {string} color\n * @param {number=} alpha 0 ~ 1\n * @return {string} Color string in rgba format.\n * @memberOf module:zrender/util/color\n */\n\n\nfunction modifyAlpha(color, alpha) {\n  color = parse(color);\n\n  if (color && alpha != null) {\n    color[3] = clampCssFloat(alpha);\n    return stringify(color, 'rgba');\n  }\n}\n/**\n * @param {Array.<number>} arrColor like [12,33,44,0.4]\n * @param {string} type 'rgba', 'hsva', ...\n * @return {string} Result color. (If input illegal, return undefined).\n */\n\n\nfunction stringify(arrColor, type) {\n  if (!arrColor || !arrColor.length) {\n    return;\n  }\n\n  var colorStr = arrColor[0] + ',' + arrColor[1] + ',' + arrColor[2];\n\n  if (type === 'rgba' || type === 'hsva' || type === 'hsla') {\n    colorStr += ',' + arrColor[3];\n  }\n\n  return type + '(' + colorStr + ')';\n}\n\nexports.parse = parse;\nexports.lift = lift;\nexports.toHex = toHex;\nexports.fastLerp = fastLerp;\nexports.fastMapToColor = fastMapToColor;\nexports.lerp = lerp;\nexports.mapToColor = mapToColor;\nexports.modifyHSL = modifyHSL;\nexports.modifyAlpha = modifyAlpha;\nexports.stringify = stringify;\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports) {\n\nvar dpr = 1; // If in browser environment\n\nif (typeof window !== 'undefined') {\n  dpr = Math.max(window.devicePixelRatio || 1, 1);\n}\n/**\n * config默认配置项\n * @exports zrender/config\n * @author Kener (@Kener-林峰, kener.linfeng@gmail.com)\n */\n\n/**\n * debug日志选项：catchBrushException为true下有效\n * 0 : 不生成debug数据，发布用\n * 1 : 异常抛出，调试用\n * 2 : 控制台输出，调试用\n */\n\n\nvar debugMode = 0; // retina 屏幕优化\n\nvar devicePixelRatio = dpr;\nexports.debugMode = debugMode;\nexports.devicePixelRatio = devicePixelRatio;\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar _util = __webpack_require__(0);\n\nvar retrieve2 = _util.retrieve2;\nvar retrieve3 = _util.retrieve3;\nvar each = _util.each;\nvar normalizeCssArray = _util.normalizeCssArray;\nvar isString = _util.isString;\nvar isObject = _util.isObject;\n\nvar textContain = __webpack_require__(5);\n\nvar roundRectHelper = __webpack_require__(21);\n\nvar imageHelper = __webpack_require__(10);\n\n// TODO: Have not support 'start', 'end' yet.\nvar VALID_TEXT_ALIGN = {\n  left: 1,\n  right: 1,\n  center: 1\n};\nvar VALID_TEXT_VERTICAL_ALIGN = {\n  top: 1,\n  bottom: 1,\n  middle: 1\n};\n/**\n * @param {module:zrender/graphic/Style} style\n * @return {module:zrender/graphic/Style} The input style.\n */\n\nfunction normalizeTextStyle(style) {\n  normalizeStyle(style);\n  each(style.rich, normalizeStyle);\n  return style;\n}\n\nfunction normalizeStyle(style) {\n  if (style) {\n    style.font = textContain.makeFont(style);\n    var textAlign = style.textAlign;\n    textAlign === 'middle' && (textAlign = 'center');\n    style.textAlign = textAlign == null || VALID_TEXT_ALIGN[textAlign] ? textAlign : 'left'; // Compatible with textBaseline.\n\n    var textVerticalAlign = style.textVerticalAlign || style.textBaseline;\n    textVerticalAlign === 'center' && (textVerticalAlign = 'middle');\n    style.textVerticalAlign = textVerticalAlign == null || VALID_TEXT_VERTICAL_ALIGN[textVerticalAlign] ? textVerticalAlign : 'top';\n    var textPadding = style.textPadding;\n\n    if (textPadding) {\n      style.textPadding = normalizeCssArray(style.textPadding);\n    }\n  }\n}\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {string} text\n * @param {module:zrender/graphic/Style} style\n * @param {Object|boolean} [rect] {x, y, width, height}\n *                  If set false, rect text is not used.\n */\n\n\nfunction renderText(hostEl, ctx, text, style, rect) {\n  style.rich ? renderRichText(hostEl, ctx, text, style, rect) : renderPlainText(hostEl, ctx, text, style, rect);\n}\n\nfunction renderPlainText(hostEl, ctx, text, style, rect) {\n  var font = setCtx(ctx, 'font', style.font || textContain.DEFAULT_FONT);\n  var textPadding = style.textPadding;\n  var contentBlock = hostEl.__textCotentBlock;\n\n  if (!contentBlock || hostEl.__dirty) {\n    contentBlock = hostEl.__textCotentBlock = textContain.parsePlainText(text, font, textPadding, style.truncate);\n  }\n\n  var outerHeight = contentBlock.outerHeight;\n  var textLines = contentBlock.lines;\n  var lineHeight = contentBlock.lineHeight;\n  var boxPos = getBoxPosition(outerHeight, style, rect);\n  var baseX = boxPos.baseX;\n  var baseY = boxPos.baseY;\n  var textAlign = boxPos.textAlign;\n  var textVerticalAlign = boxPos.textVerticalAlign; // Origin of textRotation should be the base point of text drawing.\n\n  applyTextRotation(ctx, style, rect, baseX, baseY);\n  var boxY = textContain.adjustTextY(baseY, outerHeight, textVerticalAlign);\n  var textX = baseX;\n  var textY = boxY;\n  var needDrawBg = needDrawBackground(style);\n\n  if (needDrawBg || textPadding) {\n    // Consider performance, do not call getTextWidth util necessary.\n    var textWidth = textContain.getWidth(text, font);\n    var outerWidth = textWidth;\n    textPadding && (outerWidth += textPadding[1] + textPadding[3]);\n    var boxX = textContain.adjustTextX(baseX, outerWidth, textAlign);\n    needDrawBg && drawBackground(hostEl, ctx, style, boxX, boxY, outerWidth, outerHeight);\n\n    if (textPadding) {\n      textX = getTextXForPadding(baseX, textAlign, textPadding);\n      textY += textPadding[0];\n    }\n  }\n\n  setCtx(ctx, 'textAlign', textAlign || 'left'); // Force baseline to be \"middle\". Otherwise, if using \"top\", the\n  // text will offset downward a little bit in font \"Microsoft YaHei\".\n\n  setCtx(ctx, 'textBaseline', 'middle'); // Always set shadowBlur and shadowOffset to avoid leak from displayable.\n\n  setCtx(ctx, 'shadowBlur', style.textShadowBlur || 0);\n  setCtx(ctx, 'shadowColor', style.textShadowColor || 'transparent');\n  setCtx(ctx, 'shadowOffsetX', style.textShadowOffsetX || 0);\n  setCtx(ctx, 'shadowOffsetY', style.textShadowOffsetY || 0); // `textBaseline` is set as 'middle'.\n\n  textY += lineHeight / 2;\n  var textStrokeWidth = style.textStrokeWidth;\n  var textStroke = getStroke(style.textStroke, textStrokeWidth);\n  var textFill = getFill(style.textFill);\n\n  if (textStroke) {\n    setCtx(ctx, 'lineWidth', textStrokeWidth);\n    setCtx(ctx, 'strokeStyle', textStroke);\n  }\n\n  if (textFill) {\n    setCtx(ctx, 'fillStyle', textFill);\n  }\n\n  for (var i = 0; i < textLines.length; i++) {\n    // Fill after stroke so the outline will not cover the main part.\n    textStroke && ctx.strokeText(textLines[i], textX, textY);\n    textFill && ctx.fillText(textLines[i], textX, textY);\n    textY += lineHeight;\n  }\n}\n\nfunction renderRichText(hostEl, ctx, text, style, rect) {\n  var contentBlock = hostEl.__textCotentBlock;\n\n  if (!contentBlock || hostEl.__dirty) {\n    contentBlock = hostEl.__textCotentBlock = textContain.parseRichText(text, style);\n  }\n\n  drawRichText(hostEl, ctx, contentBlock, style, rect);\n}\n\nfunction drawRichText(hostEl, ctx, contentBlock, style, rect) {\n  var contentWidth = contentBlock.width;\n  var outerWidth = contentBlock.outerWidth;\n  var outerHeight = contentBlock.outerHeight;\n  var textPadding = style.textPadding;\n  var boxPos = getBoxPosition(outerHeight, style, rect);\n  var baseX = boxPos.baseX;\n  var baseY = boxPos.baseY;\n  var textAlign = boxPos.textAlign;\n  var textVerticalAlign = boxPos.textVerticalAlign; // Origin of textRotation should be the base point of text drawing.\n\n  applyTextRotation(ctx, style, rect, baseX, baseY);\n  var boxX = textContain.adjustTextX(baseX, outerWidth, textAlign);\n  var boxY = textContain.adjustTextY(baseY, outerHeight, textVerticalAlign);\n  var xLeft = boxX;\n  var lineTop = boxY;\n\n  if (textPadding) {\n    xLeft += textPadding[3];\n    lineTop += textPadding[0];\n  }\n\n  var xRight = xLeft + contentWidth;\n  needDrawBackground(style) && drawBackground(hostEl, ctx, style, boxX, boxY, outerWidth, outerHeight);\n\n  for (var i = 0; i < contentBlock.lines.length; i++) {\n    var line = contentBlock.lines[i];\n    var tokens = line.tokens;\n    var tokenCount = tokens.length;\n    var lineHeight = line.lineHeight;\n    var usedWidth = line.width;\n    var leftIndex = 0;\n    var lineXLeft = xLeft;\n    var lineXRight = xRight;\n    var rightIndex = tokenCount - 1;\n    var token;\n\n    while (leftIndex < tokenCount && (token = tokens[leftIndex], !token.textAlign || token.textAlign === 'left')) {\n      placeToken(hostEl, ctx, token, style, lineHeight, lineTop, lineXLeft, 'left');\n      usedWidth -= token.width;\n      lineXLeft += token.width;\n      leftIndex++;\n    }\n\n    while (rightIndex >= 0 && (token = tokens[rightIndex], token.textAlign === 'right')) {\n      placeToken(hostEl, ctx, token, style, lineHeight, lineTop, lineXRight, 'right');\n      usedWidth -= token.width;\n      lineXRight -= token.width;\n      rightIndex--;\n    } // The other tokens are placed as textAlign 'center' if there is enough space.\n\n\n    lineXLeft += (contentWidth - (lineXLeft - xLeft) - (xRight - lineXRight) - usedWidth) / 2;\n\n    while (leftIndex <= rightIndex) {\n      token = tokens[leftIndex]; // Consider width specified by user, use 'center' rather than 'left'.\n\n      placeToken(hostEl, ctx, token, style, lineHeight, lineTop, lineXLeft + token.width / 2, 'center');\n      lineXLeft += token.width;\n      leftIndex++;\n    }\n\n    lineTop += lineHeight;\n  }\n}\n\nfunction applyTextRotation(ctx, style, rect, x, y) {\n  // textRotation only apply in RectText.\n  if (rect && style.textRotation) {\n    var origin = style.textOrigin;\n\n    if (origin === 'center') {\n      x = rect.width / 2 + rect.x;\n      y = rect.height / 2 + rect.y;\n    } else if (origin) {\n      x = origin[0] + rect.x;\n      y = origin[1] + rect.y;\n    }\n\n    ctx.translate(x, y); // Positive: anticlockwise\n\n    ctx.rotate(-style.textRotation);\n    ctx.translate(-x, -y);\n  }\n}\n\nfunction placeToken(hostEl, ctx, token, style, lineHeight, lineTop, x, textAlign) {\n  var tokenStyle = style.rich[token.styleName] || {}; // 'ctx.textBaseline' is always set as 'middle', for sake of\n  // the bias of \"Microsoft YaHei\".\n\n  var textVerticalAlign = token.textVerticalAlign;\n  var y = lineTop + lineHeight / 2;\n\n  if (textVerticalAlign === 'top') {\n    y = lineTop + token.height / 2;\n  } else if (textVerticalAlign === 'bottom') {\n    y = lineTop + lineHeight - token.height / 2;\n  }\n\n  !token.isLineHolder && needDrawBackground(tokenStyle) && drawBackground(hostEl, ctx, tokenStyle, textAlign === 'right' ? x - token.width : textAlign === 'center' ? x - token.width / 2 : x, y - token.height / 2, token.width, token.height);\n  var textPadding = token.textPadding;\n\n  if (textPadding) {\n    x = getTextXForPadding(x, textAlign, textPadding);\n    y -= token.height / 2 - textPadding[2] - token.textHeight / 2;\n  }\n\n  setCtx(ctx, 'shadowBlur', retrieve3(tokenStyle.textShadowBlur, style.textShadowBlur, 0));\n  setCtx(ctx, 'shadowColor', tokenStyle.textShadowColor || style.textShadowColor || 'transparent');\n  setCtx(ctx, 'shadowOffsetX', retrieve3(tokenStyle.textShadowOffsetX, style.textShadowOffsetX, 0));\n  setCtx(ctx, 'shadowOffsetY', retrieve3(tokenStyle.textShadowOffsetY, style.textShadowOffsetY, 0));\n  setCtx(ctx, 'textAlign', textAlign); // Force baseline to be \"middle\". Otherwise, if using \"top\", the\n  // text will offset downward a little bit in font \"Microsoft YaHei\".\n\n  setCtx(ctx, 'textBaseline', 'middle');\n  setCtx(ctx, 'font', token.font || textContain.DEFAULT_FONT);\n  var textStroke = getStroke(tokenStyle.textStroke || style.textStroke, textStrokeWidth);\n  var textFill = getFill(tokenStyle.textFill || style.textFill);\n  var textStrokeWidth = retrieve2(tokenStyle.textStrokeWidth, style.textStrokeWidth); // Fill after stroke so the outline will not cover the main part.\n\n  if (textStroke) {\n    setCtx(ctx, 'lineWidth', textStrokeWidth);\n    setCtx(ctx, 'strokeStyle', textStroke);\n    ctx.strokeText(token.text, x, y);\n  }\n\n  if (textFill) {\n    setCtx(ctx, 'fillStyle', textFill);\n    ctx.fillText(token.text, x, y);\n  }\n}\n\nfunction needDrawBackground(style) {\n  return style.textBackgroundColor || style.textBorderWidth && style.textBorderColor;\n} // style: {textBackgroundColor, textBorderWidth, textBorderColor, textBorderRadius}\n// shape: {x, y, width, height}\n\n\nfunction drawBackground(hostEl, ctx, style, x, y, width, height) {\n  var textBackgroundColor = style.textBackgroundColor;\n  var textBorderWidth = style.textBorderWidth;\n  var textBorderColor = style.textBorderColor;\n  var isPlainBg = isString(textBackgroundColor);\n  setCtx(ctx, 'shadowBlur', style.textBoxShadowBlur || 0);\n  setCtx(ctx, 'shadowColor', style.textBoxShadowColor || 'transparent');\n  setCtx(ctx, 'shadowOffsetX', style.textBoxShadowOffsetX || 0);\n  setCtx(ctx, 'shadowOffsetY', style.textBoxShadowOffsetY || 0);\n\n  if (isPlainBg || textBorderWidth && textBorderColor) {\n    ctx.beginPath();\n    var textBorderRadius = style.textBorderRadius;\n\n    if (!textBorderRadius) {\n      ctx.rect(x, y, width, height);\n    } else {\n      roundRectHelper.buildPath(ctx, {\n        x: x,\n        y: y,\n        width: width,\n        height: height,\n        r: textBorderRadius\n      });\n    }\n\n    ctx.closePath();\n  }\n\n  if (isPlainBg) {\n    setCtx(ctx, 'fillStyle', textBackgroundColor);\n    ctx.fill();\n  } else if (isObject(textBackgroundColor)) {\n    var image = textBackgroundColor.image;\n    image = imageHelper.createOrUpdateImage(image, null, hostEl, onBgImageLoaded, textBackgroundColor);\n\n    if (image && imageHelper.isImageReady(image)) {\n      ctx.drawImage(image, x, y, width, height);\n    }\n  }\n\n  if (textBorderWidth && textBorderColor) {\n    setCtx(ctx, 'lineWidth', textBorderWidth);\n    setCtx(ctx, 'strokeStyle', textBorderColor);\n    ctx.stroke();\n  }\n}\n\nfunction onBgImageLoaded(image, textBackgroundColor) {\n  // Replace image, so that `contain/text.js#parseRichText`\n  // will get correct result in next tick.\n  textBackgroundColor.image = image;\n}\n\nfunction getBoxPosition(blockHeiht, style, rect) {\n  var baseX = style.x || 0;\n  var baseY = style.y || 0;\n  var textAlign = style.textAlign;\n  var textVerticalAlign = style.textVerticalAlign; // Text position represented by coord\n\n  if (rect) {\n    var textPosition = style.textPosition;\n\n    if (textPosition instanceof Array) {\n      // Percent\n      baseX = rect.x + parsePercent(textPosition[0], rect.width);\n      baseY = rect.y + parsePercent(textPosition[1], rect.height);\n    } else {\n      var res = textContain.adjustTextPositionOnRect(textPosition, rect, style.textDistance);\n      baseX = res.x;\n      baseY = res.y; // Default align and baseline when has textPosition\n\n      textAlign = textAlign || res.textAlign;\n      textVerticalAlign = textVerticalAlign || res.textVerticalAlign;\n    } // textOffset is only support in RectText, otherwise\n    // we have to adjust boundingRect for textOffset.\n\n\n    var textOffset = style.textOffset;\n\n    if (textOffset) {\n      baseX += textOffset[0];\n      baseY += textOffset[1];\n    }\n  }\n\n  return {\n    baseX: baseX,\n    baseY: baseY,\n    textAlign: textAlign,\n    textVerticalAlign: textVerticalAlign\n  };\n}\n\nfunction setCtx(ctx, prop, value) {\n  // FIXME ??? performance try\n  // if (ctx.__currentValues[prop] !== value) {\n  // ctx[prop] = ctx.__currentValues[prop] = value;\n  ctx[prop] = value; // }\n\n  return ctx[prop];\n}\n/**\n * @param {string} [stroke] If specified, do not check style.textStroke.\n * @param {string} [lineWidth] If specified, do not check style.textStroke.\n * @param {number} style\n */\n\n\nfunction getStroke(stroke, lineWidth) {\n  return stroke == null || lineWidth <= 0 || stroke === 'transparent' || stroke === 'none' ? null // TODO pattern and gradient?\n  : stroke.image || stroke.colorStops ? '#000' : stroke;\n}\n\nfunction getFill(fill) {\n  return fill == null || fill === 'none' ? null // TODO pattern and gradient?\n  : fill.image || fill.colorStops ? '#000' : fill;\n}\n\nfunction parsePercent(value, maxValue) {\n  if (typeof value === 'string') {\n    if (value.lastIndexOf('%') >= 0) {\n      return parseFloat(value) / 100 * maxValue;\n    }\n\n    return parseFloat(value);\n  }\n\n  return value;\n}\n\nfunction getTextXForPadding(x, textAlign, textPadding) {\n  return textAlign === 'right' ? x - textPadding[1] : textAlign === 'center' ? x + textPadding[3] / 2 - textPadding[1] / 2 : x + textPadding[3];\n}\n/**\n * @param {string} text\n * @param {module:zrender/Style} style\n * @return {boolean}\n */\n\n\nfunction needDrawText(text, style) {\n  return text != null && (text || style.textBackgroundColor || style.textBorderWidth && style.textBorderColor || style.textPadding);\n}\n\nexports.normalizeTextStyle = normalizeTextStyle;\nexports.renderText = renderText;\nexports.getStroke = getStroke;\nexports.getFill = getFill;\nexports.needDrawText = needDrawText;\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports) {\n\nfunction buildPath(ctx, shape) {\n  var x = shape.x;\n  var y = shape.y;\n  var width = shape.width;\n  var height = shape.height;\n  var r = shape.r;\n  var r1;\n  var r2;\n  var r3;\n  var r4; // Convert width and height to positive for better borderRadius\n\n  if (width < 0) {\n    x = x + width;\n    width = -width;\n  }\n\n  if (height < 0) {\n    y = y + height;\n    height = -height;\n  }\n\n  if (typeof r === 'number') {\n    r1 = r2 = r3 = r4 = r;\n  } else if (r instanceof Array) {\n    if (r.length === 1) {\n      r1 = r2 = r3 = r4 = r[0];\n    } else if (r.length === 2) {\n      r1 = r3 = r[0];\n      r2 = r4 = r[1];\n    } else if (r.length === 3) {\n      r1 = r[0];\n      r2 = r4 = r[1];\n      r3 = r[2];\n    } else {\n      r1 = r[0];\n      r2 = r[1];\n      r3 = r[2];\n      r4 = r[3];\n    }\n  } else {\n    r1 = r2 = r3 = r4 = 0;\n  }\n\n  var total;\n\n  if (r1 + r2 > width) {\n    total = r1 + r2;\n    r1 *= width / total;\n    r2 *= width / total;\n  }\n\n  if (r3 + r4 > width) {\n    total = r3 + r4;\n    r3 *= width / total;\n    r4 *= width / total;\n  }\n\n  if (r2 + r3 > height) {\n    total = r2 + r3;\n    r2 *= height / total;\n    r3 *= height / total;\n  }\n\n  if (r1 + r4 > height) {\n    total = r1 + r4;\n    r1 *= height / total;\n    r4 *= height / total;\n  }\n\n  ctx.moveTo(x + r1, y);\n  ctx.lineTo(x + width - r2, y);\n  r2 !== 0 && ctx.quadraticCurveTo(x + width, y, x + width, y + r2);\n  ctx.lineTo(x + width, y + height - r3);\n  r3 !== 0 && ctx.quadraticCurveTo(x + width, y + height, x + width - r3, y + height);\n  ctx.lineTo(x + r4, y + height);\n  r4 !== 0 && ctx.quadraticCurveTo(x, y + height, x, y + height - r4);\n  ctx.lineTo(x, y + r1);\n  r1 !== 0 && ctx.quadraticCurveTo(x, y, x + r1, y);\n}\n\nexports.buildPath = buildPath;\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports) {\n\nvar PI2 = Math.PI * 2;\n\nfunction normalizeRadian(angle) {\n  angle %= PI2;\n\n  if (angle < 0) {\n    angle += PI2;\n  }\n\n  return angle;\n}\n\nexports.normalizeRadian = normalizeRadian;\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar smoothSpline = __webpack_require__(66);\n\nvar smoothBezier = __webpack_require__(67);\n\nfunction buildPath(ctx, shape, closePath) {\n  var points = shape.points;\n  var smooth = shape.smooth;\n\n  if (points && points.length >= 2) {\n    if (smooth && smooth !== 'spline') {\n      var controlPoints = smoothBezier(points, smooth, closePath, shape.smoothConstraint);\n      ctx.moveTo(points[0][0], points[0][1]);\n      var len = points.length;\n\n      for (var i = 0; i < (closePath ? len : len - 1); i++) {\n        var cp1 = controlPoints[i * 2];\n        var cp2 = controlPoints[i * 2 + 1];\n        var p = points[(i + 1) % len];\n        ctx.bezierCurveTo(cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]);\n      }\n    } else {\n      if (smooth === 'spline') {\n        points = smoothSpline(points, closePath);\n      }\n\n      ctx.moveTo(points[0][0], points[0][1]);\n\n      for (var i = 1, l = points.length; i < l; i++) {\n        ctx.lineTo(points[i][0], points[i][1]);\n      }\n    }\n\n    closePath && ctx.closePath();\n  }\n}\n\nexports.buildPath = buildPath;\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports) {\n\n/**\n * @param {Array.<Object>} colorStops\n */\nvar Gradient = function (colorStops) {\n  this.colorStops = colorStops || [];\n};\n\nGradient.prototype = {\n  constructor: Gradient,\n  addColorStop: function (offset, color) {\n    this.colorStops.push({\n      offset: offset,\n      color: color\n    });\n  }\n};\nvar _default = Gradient;\nmodule.exports = _default;\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(26);\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar echarts = __webpack_require__(7);\nvar layoutUtil = __webpack_require__(27);\n\n__webpack_require__(28);\n__webpack_require__(77);\n\nvar wordCloudLayoutHelper = __webpack_require__(78);\n\nif (!wordCloudLayoutHelper.isSupported) {\n    throw new Error('Sorry your browser not support wordCloud');\n}\n\n// https://github.com/timdream/wordcloud2.js/blob/c236bee60436e048949f9becc4f0f67bd832dc5c/index.js#L233\nfunction updateCanvasMask(maskCanvas) {\n    var ctx = maskCanvas.getContext('2d');\n    var imageData = ctx.getImageData(\n        0, 0, maskCanvas.width, maskCanvas.height);\n    var newImageData = ctx.createImageData(imageData);\n\n    var toneSum = 0;\n    var toneCnt = 0;\n    for (var i = 0; i < imageData.data.length; i += 4) {\n        var alpha = imageData.data[i + 3];\n        if (alpha > 128) {\n            var tone = imageData.data[i]\n                + imageData.data[i + 1]\n                + imageData.data[i + 2];\n            toneSum += tone;\n            ++toneCnt;\n        }\n    }\n    var threshold = toneSum / toneCnt;\n\n    for (var i = 0; i < imageData.data.length; i += 4) {\n        var tone = imageData.data[i]\n            + imageData.data[i + 1]\n            + imageData.data[i + 2];\n        var alpha = imageData.data[i + 3];\n\n        if (alpha < 128 || tone > threshold) {\n            // Area not to draw\n            newImageData.data[i] = 0;\n            newImageData.data[i + 1] = 0;\n            newImageData.data[i + 2] = 0;\n            newImageData.data[i + 3] = 0;\n        }\n        else {\n            // Area to draw\n            // The color must be same with backgroundColor\n            newImageData.data[i] = 255;\n            newImageData.data[i + 1] = 255;\n            newImageData.data[i + 2] = 255;\n            newImageData.data[i + 3] = 255;\n        }\n    }\n\n    ctx.putImageData(newImageData, 0, 0);\n}\n\necharts.registerLayout(function (ecModel, api) {\n    ecModel.eachSeriesByType('wordCloud', function (seriesModel) {\n        var gridRect = layoutUtil.getLayoutRect(\n            seriesModel.getBoxLayoutParams(), {\n                width: api.getWidth(),\n                height: api.getHeight()\n            }\n        );\n        var data = seriesModel.getData();\n\n        var canvas = document.createElement('canvas');\n        canvas.width = gridRect.width;\n        canvas.height = gridRect.height;\n\n        var ctx = canvas.getContext('2d');\n        var maskImage = seriesModel.get('maskImage');\n        if (maskImage) {\n            try {\n                ctx.drawImage(maskImage, 0, 0, canvas.width, canvas.height);\n                updateCanvasMask(canvas);\n            }\n            catch (e) {\n                console.error('Invalid mask image');\n                console.error(e.toString());\n            }\n        }\n\n        var sizeRange = seriesModel.get('sizeRange');\n        var rotationRange = seriesModel.get('rotationRange');\n        var valueExtent = data.getDataExtent('value');\n\n        var DEGREE_TO_RAD = Math.PI / 180;\n        var gridSize = seriesModel.get('gridSize');\n        wordCloudLayoutHelper(canvas, {\n            list: data.mapArray('value', function (value, idx) {\n                var itemModel = data.getItemModel(idx);\n                return [\n                    data.getName(idx),\n                    itemModel.get('textStyle.normal.textSize', true)\n                        || echarts.number.linearMap(value, valueExtent, sizeRange),\n                    idx\n                ];\n            }).sort(function (a, b) {\n                // Sort from large to small in case there is no more room for more words\n                return b[1] - a[1];\n            }),\n            fontFamily: seriesModel.get('textStyle.normal.fontFamily')\n                || seriesModel.get('textStyle.emphasis.fontFamily')\n                || ecModel.get('textStyle.fontFamily'),\n            fontWeight: seriesModel.get('textStyle.normal.fontWeight')\n                || seriesModel.get('textStyle.emphasis.fontWeight')\n                || ecModel.get('textStyle.fontWeight'),\n            gridSize: gridSize,\n\n            ellipticity: gridRect.height / gridRect.width,\n\n            minRotation: rotationRange[0] * DEGREE_TO_RAD,\n            maxRotation: rotationRange[1] * DEGREE_TO_RAD,\n\n            clearCanvas: !maskImage,\n\n            rotateRatio: 1,\n\n            rotationStep: seriesModel.get('rotationStep') * DEGREE_TO_RAD,\n\n            drawOutOfBound: seriesModel.get('drawOutOfBound'),\n\n            shuffle: false,\n\n            shape: seriesModel.get('shape')\n        });\n\n        function onWordCloudDrawn(e) {\n            var item = e.detail.item;\n            if (e.detail.drawn && seriesModel.layoutInstance.ondraw) {\n                e.detail.drawn.gx += gridRect.x / gridSize;\n                e.detail.drawn.gy += gridRect.y / gridSize;\n                seriesModel.layoutInstance.ondraw(\n                    item[0], item[1], item[2], e.detail.drawn\n                );\n            }\n        }\n\n        canvas.addEventListener('wordclouddrawn', onWordCloudDrawn);\n\n        if (seriesModel.layoutInstance) {\n            // Dispose previous\n            seriesModel.layoutInstance.dispose();\n        }\n\n        seriesModel.layoutInstance = {\n            ondraw: null,\n\n            dispose: function () {\n                canvas.removeEventListener('wordclouddrawn', onWordCloudDrawn);\n                // Abort\n                canvas.addEventListener('wordclouddrawn', function (e) {\n                    // Prevent default to cancle the event and stop the loop\n                    e.preventDefault();\n                });\n            }\n        };\n    });\n});\n\necharts.registerPreprocessor(function (option) {\n    var series = (option || {}).series;\n    !echarts.util.isArray(series) && (series = series ? [series] : []);\n\n    var compats = ['shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'];\n\n    echarts.util.each(series, function (seriesItem) {\n        if (seriesItem && seriesItem.type === 'wordCloud') {\n            var textStyle = seriesItem.textStyle || {};\n\n            compatTextStyle(textStyle.normal);\n            compatTextStyle(textStyle.emphasis);\n        }\n    });\n\n    function compatTextStyle(textStyle) {\n        textStyle && echarts.util.each(compats, function (key) {\n            if (textStyle.hasOwnProperty(key)) {\n                textStyle['text' + echarts.format.capitalFirst(key)] = textStyle[key];\n            }\n        });\n    }\n});\n\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar zrUtil = __webpack_require__(0);\n\nvar BoundingRect = __webpack_require__(3);\n\nvar _number = __webpack_require__(9);\n\nvar parsePercent = _number.parsePercent;\n\nvar formatUtil = __webpack_require__(13);\n\n// Layout helpers for each component positioning\nvar each = zrUtil.each;\n/**\n * @public\n */\n\nvar LOCATION_PARAMS = ['left', 'right', 'top', 'bottom', 'width', 'height'];\n/**\n * @public\n */\n\nvar HV_NAMES = [['width', 'left', 'right'], ['height', 'top', 'bottom']];\n\nfunction boxLayout(orient, group, gap, maxWidth, maxHeight) {\n  var x = 0;\n  var y = 0;\n\n  if (maxWidth == null) {\n    maxWidth = Infinity;\n  }\n\n  if (maxHeight == null) {\n    maxHeight = Infinity;\n  }\n\n  var currentLineMaxSize = 0;\n  group.eachChild(function (child, idx) {\n    var position = child.position;\n    var rect = child.getBoundingRect();\n    var nextChild = group.childAt(idx + 1);\n    var nextChildRect = nextChild && nextChild.getBoundingRect();\n    var nextX;\n    var nextY;\n\n    if (orient === 'horizontal') {\n      var moveX = rect.width + (nextChildRect ? -nextChildRect.x + rect.x : 0);\n      nextX = x + moveX; // Wrap when width exceeds maxWidth or meet a `newline` group\n      // FIXME compare before adding gap?\n\n      if (nextX > maxWidth || child.newline) {\n        x = 0;\n        nextX = moveX;\n        y += currentLineMaxSize + gap;\n        currentLineMaxSize = rect.height;\n      } else {\n        // FIXME: consider rect.y is not `0`?\n        currentLineMaxSize = Math.max(currentLineMaxSize, rect.height);\n      }\n    } else {\n      var moveY = rect.height + (nextChildRect ? -nextChildRect.y + rect.y : 0);\n      nextY = y + moveY; // Wrap when width exceeds maxHeight or meet a `newline` group\n\n      if (nextY > maxHeight || child.newline) {\n        x += currentLineMaxSize + gap;\n        y = 0;\n        nextY = moveY;\n        currentLineMaxSize = rect.width;\n      } else {\n        currentLineMaxSize = Math.max(currentLineMaxSize, rect.width);\n      }\n    }\n\n    if (child.newline) {\n      return;\n    }\n\n    position[0] = x;\n    position[1] = y;\n    orient === 'horizontal' ? x = nextX + gap : y = nextY + gap;\n  });\n}\n/**\n * VBox or HBox layouting\n * @param {string} orient\n * @param {module:zrender/container/Group} group\n * @param {number} gap\n * @param {number} [width=Infinity]\n * @param {number} [height=Infinity]\n */\n\n\nvar box = boxLayout;\n/**\n * VBox layouting\n * @param {module:zrender/container/Group} group\n * @param {number} gap\n * @param {number} [width=Infinity]\n * @param {number} [height=Infinity]\n */\n\nvar vbox = zrUtil.curry(boxLayout, 'vertical');\n/**\n * HBox layouting\n * @param {module:zrender/container/Group} group\n * @param {number} gap\n * @param {number} [width=Infinity]\n * @param {number} [height=Infinity]\n */\n\nvar hbox = zrUtil.curry(boxLayout, 'horizontal');\n/**\n * If x or x2 is not specified or 'center' 'left' 'right',\n * the width would be as long as possible.\n * If y or y2 is not specified or 'middle' 'top' 'bottom',\n * the height would be as long as possible.\n *\n * @param {Object} positionInfo\n * @param {number|string} [positionInfo.x]\n * @param {number|string} [positionInfo.y]\n * @param {number|string} [positionInfo.x2]\n * @param {number|string} [positionInfo.y2]\n * @param {Object} containerRect {width, height}\n * @param {string|number} margin\n * @return {Object} {width, height}\n */\n\nfunction getAvailableSize(positionInfo, containerRect, margin) {\n  var containerWidth = containerRect.width;\n  var containerHeight = containerRect.height;\n  var x = parsePercent(positionInfo.x, containerWidth);\n  var y = parsePercent(positionInfo.y, containerHeight);\n  var x2 = parsePercent(positionInfo.x2, containerWidth);\n  var y2 = parsePercent(positionInfo.y2, containerHeight);\n  (isNaN(x) || isNaN(parseFloat(positionInfo.x))) && (x = 0);\n  (isNaN(x2) || isNaN(parseFloat(positionInfo.x2))) && (x2 = containerWidth);\n  (isNaN(y) || isNaN(parseFloat(positionInfo.y))) && (y = 0);\n  (isNaN(y2) || isNaN(parseFloat(positionInfo.y2))) && (y2 = containerHeight);\n  margin = formatUtil.normalizeCssArray(margin || 0);\n  return {\n    width: Math.max(x2 - x - margin[1] - margin[3], 0),\n    height: Math.max(y2 - y - margin[0] - margin[2], 0)\n  };\n}\n/**\n * Parse position info.\n *\n * @param {Object} positionInfo\n * @param {number|string} [positionInfo.left]\n * @param {number|string} [positionInfo.top]\n * @param {number|string} [positionInfo.right]\n * @param {number|string} [positionInfo.bottom]\n * @param {number|string} [positionInfo.width]\n * @param {number|string} [positionInfo.height]\n * @param {number|string} [positionInfo.aspect] Aspect is width / height\n * @param {Object} containerRect\n * @param {string|number} [margin]\n *\n * @return {module:zrender/core/BoundingRect}\n */\n\n\nfunction getLayoutRect(positionInfo, containerRect, margin) {\n  margin = formatUtil.normalizeCssArray(margin || 0);\n  var containerWidth = containerRect.width;\n  var containerHeight = containerRect.height;\n  var left = parsePercent(positionInfo.left, containerWidth);\n  var top = parsePercent(positionInfo.top, containerHeight);\n  var right = parsePercent(positionInfo.right, containerWidth);\n  var bottom = parsePercent(positionInfo.bottom, containerHeight);\n  var width = parsePercent(positionInfo.width, containerWidth);\n  var height = parsePercent(positionInfo.height, containerHeight);\n  var verticalMargin = margin[2] + margin[0];\n  var horizontalMargin = margin[1] + margin[3];\n  var aspect = positionInfo.aspect; // If width is not specified, calculate width from left and right\n\n  if (isNaN(width)) {\n    width = containerWidth - right - horizontalMargin - left;\n  }\n\n  if (isNaN(height)) {\n    height = containerHeight - bottom - verticalMargin - top;\n  }\n\n  if (aspect != null) {\n    // If width and height are not given\n    // 1. Graph should not exceeds the container\n    // 2. Aspect must be keeped\n    // 3. Graph should take the space as more as possible\n    // FIXME\n    // Margin is not considered, because there is no case that both\n    // using margin and aspect so far.\n    if (isNaN(width) && isNaN(height)) {\n      if (aspect > containerWidth / containerHeight) {\n        width = containerWidth * 0.8;\n      } else {\n        height = containerHeight * 0.8;\n      }\n    } // Calculate width or height with given aspect\n\n\n    if (isNaN(width)) {\n      width = aspect * height;\n    }\n\n    if (isNaN(height)) {\n      height = width / aspect;\n    }\n  } // If left is not specified, calculate left from right and width\n\n\n  if (isNaN(left)) {\n    left = containerWidth - right - width - horizontalMargin;\n  }\n\n  if (isNaN(top)) {\n    top = containerHeight - bottom - height - verticalMargin;\n  } // Align left and top\n\n\n  switch (positionInfo.left || positionInfo.right) {\n    case 'center':\n      left = containerWidth / 2 - width / 2 - margin[3];\n      break;\n\n    case 'right':\n      left = containerWidth - width - horizontalMargin;\n      break;\n  }\n\n  switch (positionInfo.top || positionInfo.bottom) {\n    case 'middle':\n    case 'center':\n      top = containerHeight / 2 - height / 2 - margin[0];\n      break;\n\n    case 'bottom':\n      top = containerHeight - height - verticalMargin;\n      break;\n  } // If something is wrong and left, top, width, height are calculated as NaN\n\n\n  left = left || 0;\n  top = top || 0;\n\n  if (isNaN(width)) {\n    // Width may be NaN if only one value is given except width\n    width = containerWidth - horizontalMargin - left - (right || 0);\n  }\n\n  if (isNaN(height)) {\n    // Height may be NaN if only one value is given except height\n    height = containerHeight - verticalMargin - top - (bottom || 0);\n  }\n\n  var rect = new BoundingRect(left + margin[3], top + margin[0], width, height);\n  rect.margin = margin;\n  return rect;\n}\n/**\n * Position a zr element in viewport\n *  Group position is specified by either\n *  {left, top}, {right, bottom}\n *  If all properties exists, right and bottom will be igonred.\n *\n * Logic:\n *     1. Scale (against origin point in parent coord)\n *     2. Rotate (against origin point in parent coord)\n *     3. Traslate (with el.position by this method)\n * So this method only fixes the last step 'Traslate', which does not affect\n * scaling and rotating.\n *\n * If be called repeatly with the same input el, the same result will be gotten.\n *\n * @param {module:zrender/Element} el Should have `getBoundingRect` method.\n * @param {Object} positionInfo\n * @param {number|string} [positionInfo.left]\n * @param {number|string} [positionInfo.top]\n * @param {number|string} [positionInfo.right]\n * @param {number|string} [positionInfo.bottom]\n * @param {number|string} [positionInfo.width] Only for opt.boundingModel: 'raw'\n * @param {number|string} [positionInfo.height] Only for opt.boundingModel: 'raw'\n * @param {Object} containerRect\n * @param {string|number} margin\n * @param {Object} [opt]\n * @param {Array.<number>} [opt.hv=[1,1]] Only horizontal or only vertical.\n * @param {Array.<number>} [opt.boundingMode='all']\n *        Specify how to calculate boundingRect when locating.\n *        'all': Position the boundingRect that is transformed and uioned\n *               both itself and its descendants.\n *               This mode simplies confine the elements in the bounding\n *               of their container (e.g., using 'right: 0').\n *        'raw': Position the boundingRect that is not transformed and only itself.\n *               This mode is useful when you want a element can overflow its\n *               container. (Consider a rotated circle needs to be located in a corner.)\n *               In this mode positionInfo.width/height can only be number.\n */\n\n\nfunction positionElement(el, positionInfo, containerRect, margin, opt) {\n  var h = !opt || !opt.hv || opt.hv[0];\n  var v = !opt || !opt.hv || opt.hv[1];\n  var boundingMode = opt && opt.boundingMode || 'all';\n\n  if (!h && !v) {\n    return;\n  }\n\n  var rect;\n\n  if (boundingMode === 'raw') {\n    rect = el.type === 'group' ? new BoundingRect(0, 0, +positionInfo.width || 0, +positionInfo.height || 0) : el.getBoundingRect();\n  } else {\n    rect = el.getBoundingRect();\n\n    if (el.needLocalTransform()) {\n      var transform = el.getLocalTransform(); // Notice: raw rect may be inner object of el,\n      // which should not be modified.\n\n      rect = rect.clone();\n      rect.applyTransform(transform);\n    }\n  } // The real width and height can not be specified but calculated by the given el.\n\n\n  positionInfo = getLayoutRect(zrUtil.defaults({\n    width: rect.width,\n    height: rect.height\n  }, positionInfo), containerRect, margin); // Because 'tranlate' is the last step in transform\n  // (see zrender/core/Transformable#getLocalTransfrom),\n  // we can just only modify el.position to get final result.\n\n  var elPos = el.position;\n  var dx = h ? positionInfo.x - rect.x : 0;\n  var dy = v ? positionInfo.y - rect.y : 0;\n  el.attr('position', boundingMode === 'raw' ? [dx, dy] : [elPos[0] + dx, elPos[1] + dy]);\n}\n/**\n * @param {Object} option Contains some of the properties in HV_NAMES.\n * @param {number} hvIdx 0: horizontal; 1: vertical.\n */\n\n\nfunction sizeCalculable(option, hvIdx) {\n  return option[HV_NAMES[hvIdx][0]] != null || option[HV_NAMES[hvIdx][1]] != null && option[HV_NAMES[hvIdx][2]] != null;\n}\n/**\n * Consider Case:\n * When defulat option has {left: 0, width: 100}, and we set {right: 0}\n * through setOption or media query, using normal zrUtil.merge will cause\n * {right: 0} does not take effect.\n *\n * @example\n * ComponentModel.extend({\n *     init: function () {\n *         ...\n *         var inputPositionParams = layout.getLayoutParams(option);\n *         this.mergeOption(inputPositionParams);\n *     },\n *     mergeOption: function (newOption) {\n *         newOption && zrUtil.merge(thisOption, newOption, true);\n *         layout.mergeLayoutParam(thisOption, newOption);\n *     }\n * });\n *\n * @param {Object} targetOption\n * @param {Object} newOption\n * @param {Object|string} [opt]\n * @param {boolean|Array.<boolean>} [opt.ignoreSize=false] Used for the components\n *  that width (or height) should not be calculated by left and right (or top and bottom).\n */\n\n\nfunction mergeLayoutParam(targetOption, newOption, opt) {\n  !zrUtil.isObject(opt) && (opt = {});\n  var ignoreSize = opt.ignoreSize;\n  !zrUtil.isArray(ignoreSize) && (ignoreSize = [ignoreSize, ignoreSize]);\n  var hResult = merge(HV_NAMES[0], 0);\n  var vResult = merge(HV_NAMES[1], 1);\n  copy(HV_NAMES[0], targetOption, hResult);\n  copy(HV_NAMES[1], targetOption, vResult);\n\n  function merge(names, hvIdx) {\n    var newParams = {};\n    var newValueCount = 0;\n    var merged = {};\n    var mergedValueCount = 0;\n    var enoughParamNumber = 2;\n    each(names, function (name) {\n      merged[name] = targetOption[name];\n    });\n    each(names, function (name) {\n      // Consider case: newOption.width is null, which is\n      // set by user for removing width setting.\n      hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]);\n      hasValue(newParams, name) && newValueCount++;\n      hasValue(merged, name) && mergedValueCount++;\n    });\n\n    if (ignoreSize[hvIdx]) {\n      // Only one of left/right is premitted to exist.\n      if (hasValue(newOption, names[1])) {\n        merged[names[2]] = null;\n      } else if (hasValue(newOption, names[2])) {\n        merged[names[1]] = null;\n      }\n\n      return merged;\n    } // Case: newOption: {width: ..., right: ...},\n    // or targetOption: {right: ...} and newOption: {width: ...},\n    // There is no conflict when merged only has params count\n    // little than enoughParamNumber.\n\n\n    if (mergedValueCount === enoughParamNumber || !newValueCount) {\n      return merged;\n    } // Case: newOption: {width: ..., right: ...},\n    // Than we can make sure user only want those two, and ignore\n    // all origin params in targetOption.\n    else if (newValueCount >= enoughParamNumber) {\n        return newParams;\n      } else {\n        // Chose another param from targetOption by priority.\n        for (var i = 0; i < names.length; i++) {\n          var name = names[i];\n\n          if (!hasProp(newParams, name) && hasProp(targetOption, name)) {\n            newParams[name] = targetOption[name];\n            break;\n          }\n        }\n\n        return newParams;\n      }\n  }\n\n  function hasProp(obj, name) {\n    return obj.hasOwnProperty(name);\n  }\n\n  function hasValue(obj, name) {\n    return obj[name] != null && obj[name] !== 'auto';\n  }\n\n  function copy(names, target, source) {\n    each(names, function (name) {\n      target[name] = source[name];\n    });\n  }\n}\n/**\n * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.\n * @param {Object} source\n * @return {Object} Result contains those props.\n */\n\n\nfunction getLayoutParams(source) {\n  return copyLayoutParams({}, source);\n}\n/**\n * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.\n * @param {Object} source\n * @return {Object} Result contains those props.\n */\n\n\nfunction copyLayoutParams(target, source) {\n  source && target && each(LOCATION_PARAMS, function (name) {\n    source.hasOwnProperty(name) && (target[name] = source[name]);\n  });\n  return target;\n}\n\nexports.LOCATION_PARAMS = LOCATION_PARAMS;\nexports.HV_NAMES = HV_NAMES;\nexports.box = box;\nexports.vbox = vbox;\nexports.hbox = hbox;\nexports.getAvailableSize = getAvailableSize;\nexports.getLayoutRect = getLayoutRect;\nexports.positionElement = positionElement;\nexports.sizeCalculable = sizeCalculable;\nexports.mergeLayoutParam = mergeLayoutParam;\nexports.getLayoutParams = getLayoutParams;\nexports.copyLayoutParams = copyLayoutParams;\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar completeDimensions = __webpack_require__(29);\nvar echarts = __webpack_require__(7);\n\necharts.extendSeriesModel({\n\n    type: 'series.wordCloud',\n\n    visualColorAccessPath: 'textStyle.normal.color',\n\n    optionUpdated: function () {\n        var option = this.option;\n        option.gridSize = Math.max(Math.floor(option.gridSize), 4);\n    },\n\n    getInitialData: function (option, ecModel) {\n        var dimensions = completeDimensions(['value'], option.data);\n        var list = new echarts.List(dimensions, this);\n        list.initData(option.data);\n        return list;\n    },\n\n    // Most of options are from https://github.com/timdream/wordcloud2.js/blob/gh-pages/API.md\n    defaultOption: {\n\n        maskImage: null,\n\n        // Shape can be 'circle', 'cardioid', 'diamond', 'triangle-forward', 'triangle', 'pentagon', 'star'\n        shape: 'circle',\n\n        left: 'center',\n\n        top: 'center',\n\n        width: '70%',\n\n        height: '80%',\n\n        sizeRange: [12, 60],\n\n        rotationRange: [-90, 90],\n\n        rotationStep: 45,\n\n        gridSize: 8,\n\n        drawOutOfBound: false,\n\n        textStyle: {\n            normal: {\n                fontWeight: 'normal'\n            }\n        }\n    }\n});\n\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar zrUtil = __webpack_require__(0);\n\nvar _model = __webpack_require__(30);\n\nvar normalizeToArray = _model.normalizeToArray;\n\n/**\n * Complete dimensions by data (guess dimension).\n */\nvar each = zrUtil.each;\nvar isString = zrUtil.isString;\nvar defaults = zrUtil.defaults;\nvar OTHER_DIMS = {\n  tooltip: 1,\n  label: 1,\n  itemName: 1\n};\n/**\n * Complete the dimensions array, by user defined `dimension` and `encode`,\n * and guessing from the data structure.\n * If no 'value' dimension specified, the first no-named dimension will be\n * named as 'value'.\n *\n * @param {Array.<string>} sysDims Necessary dimensions, like ['x', 'y'], which\n *      provides not only dim template, but also default order.\n *      `name` of each item provides default coord name.\n *      [{dimsDef: []}, ...] can be specified to give names.\n * @param {Array} data Data list. [[1, 2, 3], [2, 3, 4]].\n * @param {Object} [opt]\n * @param {Array.<Object|string>} [opt.dimsDef] option.series.dimensions User defined dimensions\n *      For example: ['asdf', {name, type}, ...].\n * @param {Object} [opt.encodeDef] option.series.encode {x: 2, y: [3, 1], tooltip: [1, 2], label: 3}\n * @param {string} [opt.extraPrefix] Prefix of name when filling the left dimensions.\n * @param {string} [opt.extraFromZero] If specified, extra dim names will be:\n *                      extraPrefix + 0, extraPrefix + extraBaseIndex + 1 ...\n *                      If not specified, extra dim names will be:\n *                      extraPrefix, extraPrefix + 0, extraPrefix + 1 ...\n * @param {number} [opt.dimCount] If not specified, guess by the first data item.\n * @return {Array.<Object>} [{\n *      name: string mandatory,\n *      coordDim: string mandatory,\n *      coordDimIndex: number mandatory,\n *      type: string optional,\n *      tooltipName: string optional,\n *      otherDims: {\n *          tooltip: number optional,\n *          label: number optional\n *      },\n *      isExtraCoord: boolean true or undefined.\n *      other props ...\n * }]\n */\n\nfunction completeDimensions(sysDims, data, opt) {\n  data = data || [];\n  opt = opt || {};\n  sysDims = (sysDims || []).slice();\n  var dimsDef = (opt.dimsDef || []).slice();\n  var encodeDef = zrUtil.createHashMap(opt.encodeDef);\n  var dataDimNameMap = zrUtil.createHashMap();\n  var coordDimNameMap = zrUtil.createHashMap(); // var valueCandidate;\n\n  var result = [];\n  var dimCount = opt.dimCount;\n\n  if (dimCount == null) {\n    var value0 = retrieveValue(data[0]);\n    dimCount = Math.max(zrUtil.isArray(value0) && value0.length || 1, sysDims.length, dimsDef.length);\n    each(sysDims, function (sysDimItem) {\n      var sysDimItemDimsDef = sysDimItem.dimsDef;\n      sysDimItemDimsDef && (dimCount = Math.max(dimCount, sysDimItemDimsDef.length));\n    });\n  } // Apply user defined dims (`name` and `type`) and init result.\n\n\n  for (var i = 0; i < dimCount; i++) {\n    var dimDefItem = isString(dimsDef[i]) ? {\n      name: dimsDef[i]\n    } : dimsDef[i] || {};\n    var userDimName = dimDefItem.name;\n    var resultItem = result[i] = {\n      otherDims: {}\n    }; // Name will be applied later for avoiding duplication.\n\n    if (userDimName != null && dataDimNameMap.get(userDimName) == null) {\n      // Only if `series.dimensions` is defined in option, tooltipName\n      // will be set, and dimension will be diplayed vertically in\n      // tooltip by default.\n      resultItem.name = resultItem.tooltipName = userDimName;\n      dataDimNameMap.set(userDimName, i);\n    }\n\n    dimDefItem.type != null && (resultItem.type = dimDefItem.type);\n  } // Set `coordDim` and `coordDimIndex` by `encodeDef` and normalize `encodeDef`.\n\n\n  encodeDef.each(function (dataDims, coordDim) {\n    dataDims = encodeDef.set(coordDim, normalizeToArray(dataDims).slice());\n    each(dataDims, function (resultDimIdx, coordDimIndex) {\n      // The input resultDimIdx can be dim name or index.\n      isString(resultDimIdx) && (resultDimIdx = dataDimNameMap.get(resultDimIdx));\n\n      if (resultDimIdx != null && resultDimIdx < dimCount) {\n        dataDims[coordDimIndex] = resultDimIdx;\n        applyDim(result[resultDimIdx], coordDim, coordDimIndex);\n      }\n    });\n  }); // Apply templetes and default order from `sysDims`.\n\n  var availDimIdx = 0;\n  each(sysDims, function (sysDimItem, sysDimIndex) {\n    var coordDim;\n    var sysDimItem;\n    var sysDimItemDimsDef;\n    var sysDimItemOtherDims;\n\n    if (isString(sysDimItem)) {\n      coordDim = sysDimItem;\n      sysDimItem = {};\n    } else {\n      coordDim = sysDimItem.name;\n      sysDimItem = zrUtil.clone(sysDimItem); // `coordDimIndex` should not be set directly.\n\n      sysDimItemDimsDef = sysDimItem.dimsDef;\n      sysDimItemOtherDims = sysDimItem.otherDims;\n      sysDimItem.name = sysDimItem.coordDim = sysDimItem.coordDimIndex = sysDimItem.dimsDef = sysDimItem.otherDims = null;\n    }\n\n    var dataDims = normalizeToArray(encodeDef.get(coordDim)); // dimensions provides default dim sequences.\n\n    if (!dataDims.length) {\n      for (var i = 0; i < (sysDimItemDimsDef && sysDimItemDimsDef.length || 1); i++) {\n        while (availDimIdx < result.length && result[availDimIdx].coordDim != null) {\n          availDimIdx++;\n        }\n\n        availDimIdx < result.length && dataDims.push(availDimIdx++);\n      }\n    } // Apply templates.\n\n\n    each(dataDims, function (resultDimIdx, coordDimIndex) {\n      var resultItem = result[resultDimIdx];\n      applyDim(defaults(resultItem, sysDimItem), coordDim, coordDimIndex);\n\n      if (resultItem.name == null && sysDimItemDimsDef) {\n        resultItem.name = resultItem.tooltipName = sysDimItemDimsDef[coordDimIndex];\n      }\n\n      sysDimItemOtherDims && defaults(resultItem.otherDims, sysDimItemOtherDims);\n    });\n  }); // Make sure the first extra dim is 'value'.\n\n  var extra = opt.extraPrefix || 'value'; // Set dim `name` and other `coordDim` and other props.\n\n  for (var resultDimIdx = 0; resultDimIdx < dimCount; resultDimIdx++) {\n    var resultItem = result[resultDimIdx] = result[resultDimIdx] || {};\n    var coordDim = resultItem.coordDim;\n    coordDim == null && (resultItem.coordDim = genName(extra, coordDimNameMap, opt.extraFromZero), resultItem.coordDimIndex = 0, resultItem.isExtraCoord = true);\n    resultItem.name == null && (resultItem.name = genName(resultItem.coordDim, dataDimNameMap));\n    resultItem.type == null && guessOrdinal(data, resultDimIdx) && (resultItem.type = 'ordinal');\n  }\n\n  return result;\n\n  function applyDim(resultItem, coordDim, coordDimIndex) {\n    if (OTHER_DIMS[coordDim]) {\n      resultItem.otherDims[coordDim] = coordDimIndex;\n    } else {\n      resultItem.coordDim = coordDim;\n      resultItem.coordDimIndex = coordDimIndex;\n      coordDimNameMap.set(coordDim, true);\n    }\n  }\n\n  function genName(name, map, fromZero) {\n    if (fromZero || map.get(name) != null) {\n      var i = 0;\n\n      while (map.get(name + i) != null) {\n        i++;\n      }\n\n      name += i;\n    }\n\n    map.set(name, true);\n    return name;\n  }\n} // The rule should not be complex, otherwise user might not\n// be able to known where the data is wrong.\n\n\nvar guessOrdinal = completeDimensions.guessOrdinal = function (data, dimIndex) {\n  for (var i = 0, len = data.length; i < len; i++) {\n    var value = retrieveValue(data[i]);\n\n    if (!zrUtil.isArray(value)) {\n      return false;\n    }\n\n    var value = value[dimIndex]; // Consider usage convenience, '1', '2' will be treated as \"number\".\n    // `isFinit('')` get `true`.\n\n    if (value != null && isFinite(value) && value !== '') {\n      return false;\n    } else if (isString(value) && value !== '-') {\n      return true;\n    }\n  }\n\n  return false;\n};\n\nfunction retrieveValue(o) {\n  return zrUtil.isArray(o) ? o : zrUtil.isObject(o) ? o.value : o;\n}\n\nvar _default = completeDimensions;\nmodule.exports = _default;\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar zrUtil = __webpack_require__(0);\n\nvar formatUtil = __webpack_require__(13);\n\nvar nubmerUtil = __webpack_require__(9);\n\nvar Model = __webpack_require__(31);\n\nvar each = zrUtil.each;\nvar isObject = zrUtil.isObject;\n/**\n * If value is not array, then translate it to array.\n * @param  {*} value\n * @return {Array} [value] or value\n */\n\nfunction normalizeToArray(value) {\n  return value instanceof Array ? value : value == null ? [] : [value];\n}\n/**\n * Sync default option between normal and emphasis like `position` and `show`\n * In case some one will write code like\n *     label: {\n *         normal: {\n *             show: false,\n *             position: 'outside',\n *             fontSize: 18\n *         },\n *         emphasis: {\n *             show: true\n *         }\n *     }\n * @param {Object} opt\n * @param {Array.<string>} subOpts\n */\n\n\nfunction defaultEmphasis(opt, subOpts) {\n  if (opt) {\n    var emphasisOpt = opt.emphasis = opt.emphasis || {};\n    var normalOpt = opt.normal = opt.normal || {}; // Default emphasis option from normal\n\n    for (var i = 0, len = subOpts.length; i < len; i++) {\n      var subOptName = subOpts[i];\n\n      if (!emphasisOpt.hasOwnProperty(subOptName) && normalOpt.hasOwnProperty(subOptName)) {\n        emphasisOpt[subOptName] = normalOpt[subOptName];\n      }\n    }\n  }\n}\n\nvar TEXT_STYLE_OPTIONS = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'rich', 'tag', 'color', 'textBorderColor', 'textBorderWidth', 'width', 'height', 'lineHeight', 'align', 'verticalAlign', 'baseline', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY', 'textShadowColor', 'textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY', 'backgroundColor', 'borderColor', 'borderWidth', 'borderRadius', 'padding']; // modelUtil.LABEL_OPTIONS = modelUtil.TEXT_STYLE_OPTIONS.concat([\n//     'position', 'offset', 'rotate', 'origin', 'show', 'distance', 'formatter',\n//     'fontStyle', 'fontWeight', 'fontSize', 'fontFamily',\n//     // FIXME: deprecated, check and remove it.\n//     'textStyle'\n// ]);\n\n/**\n * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}]\n * This helper method retieves value from data.\n * @param {string|number|Date|Array|Object} dataItem\n * @return {number|string|Date|Array.<number|string|Date>}\n */\n\nfunction getDataItemValue(dataItem) {\n  // Performance sensitive.\n  return dataItem && (dataItem.value == null ? dataItem : dataItem.value);\n}\n/**\n * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}]\n * This helper method determine if dataItem has extra option besides value\n * @param {string|number|Date|Array|Object} dataItem\n */\n\n\nfunction isDataItemOption(dataItem) {\n  return isObject(dataItem) && !(dataItem instanceof Array); // // markLine data can be array\n  // && !(dataItem[0] && isObject(dataItem[0]) && !(dataItem[0] instanceof Array));\n}\n/**\n * This helper method convert value in data.\n * @param {string|number|Date} value\n * @param {Object|string} [dimInfo] If string (like 'x'), dimType defaults 'number'.\n */\n\n\nfunction converDataValue(value, dimInfo) {\n  // Performance sensitive.\n  var dimType = dimInfo && dimInfo.type;\n\n  if (dimType === 'ordinal') {\n    return value;\n  }\n\n  if (dimType === 'time' // spead up when using timestamp\n  && typeof value !== 'number' && value != null && value !== '-') {\n    value = +nubmerUtil.parseDate(value);\n  } // dimType defaults 'number'.\n  // If dimType is not ordinal and value is null or undefined or NaN or '-',\n  // parse to NaN.\n\n\n  return value == null || value === '' ? NaN : +value; // If string (like '-'), using '+' parse to NaN\n}\n/**\n * Create a model proxy to be used in tooltip for edge data, markLine data, markPoint data.\n * @param {module:echarts/data/List} data\n * @param {Object} opt\n * @param {string} [opt.seriesIndex]\n * @param {Object} [opt.name]\n * @param {Object} [opt.mainType]\n * @param {Object} [opt.subType]\n */\n\n\nfunction createDataFormatModel(data, opt) {\n  var model = new Model();\n  zrUtil.mixin(model, dataFormatMixin);\n  model.seriesIndex = opt.seriesIndex;\n  model.name = opt.name || '';\n  model.mainType = opt.mainType;\n  model.subType = opt.subType;\n\n  model.getData = function () {\n    return data;\n  };\n\n  return model;\n} // PENDING A little ugly\n\n\nvar dataFormatMixin = {\n  /**\n   * Get params for formatter\n   * @param {number} dataIndex\n   * @param {string} [dataType]\n   * @return {Object}\n   */\n  getDataParams: function (dataIndex, dataType) {\n    var data = this.getData(dataType);\n    var rawValue = this.getRawValue(dataIndex, dataType);\n    var rawDataIndex = data.getRawIndex(dataIndex);\n    var name = data.getName(dataIndex, true);\n    var itemOpt = data.getRawDataItem(dataIndex);\n    var color = data.getItemVisual(dataIndex, 'color');\n    return {\n      componentType: this.mainType,\n      componentSubType: this.subType,\n      seriesType: this.mainType === 'series' ? this.subType : null,\n      seriesIndex: this.seriesIndex,\n      seriesId: this.id,\n      seriesName: this.name,\n      name: name,\n      dataIndex: rawDataIndex,\n      data: itemOpt,\n      dataType: dataType,\n      value: rawValue,\n      color: color,\n      marker: formatUtil.getTooltipMarker(color),\n      // Param name list for mapping `a`, `b`, `c`, `d`, `e`\n      $vars: ['seriesName', 'name', 'value']\n    };\n  },\n\n  /**\n   * Format label\n   * @param {number} dataIndex\n   * @param {string} [status='normal'] 'normal' or 'emphasis'\n   * @param {string} [dataType]\n   * @param {number} [dimIndex]\n   * @param {string} [labelProp='label']\n   * @return {string}\n   */\n  getFormattedLabel: function (dataIndex, status, dataType, dimIndex, labelProp) {\n    status = status || 'normal';\n    var data = this.getData(dataType);\n    var itemModel = data.getItemModel(dataIndex);\n    var params = this.getDataParams(dataIndex, dataType);\n\n    if (dimIndex != null && params.value instanceof Array) {\n      params.value = params.value[dimIndex];\n    }\n\n    var formatter = itemModel.get([labelProp || 'label', status, 'formatter']);\n\n    if (typeof formatter === 'function') {\n      params.status = status;\n      return formatter(params);\n    } else if (typeof formatter === 'string') {\n      return formatUtil.formatTpl(formatter, params);\n    }\n  },\n\n  /**\n   * Get raw value in option\n   * @param {number} idx\n   * @param {string} [dataType]\n   * @return {Object}\n   */\n  getRawValue: function (idx, dataType) {\n    var data = this.getData(dataType);\n    var dataItem = data.getRawDataItem(idx);\n\n    if (dataItem != null) {\n      return isObject(dataItem) && !(dataItem instanceof Array) ? dataItem.value : dataItem;\n    }\n  },\n\n  /**\n   * Should be implemented.\n   * @param {number} dataIndex\n   * @param {boolean} [multipleSeries=false]\n   * @param {number} [dataType]\n   * @return {string} tooltip string\n   */\n  formatTooltip: zrUtil.noop\n};\n/**\n * Mapping to exists for merge.\n *\n * @public\n * @param {Array.<Object>|Array.<module:echarts/model/Component>} exists\n * @param {Object|Array.<Object>} newCptOptions\n * @return {Array.<Object>} Result, like [{exist: ..., option: ...}, {}],\n *                          index of which is the same as exists.\n */\n\nfunction mappingToExists(exists, newCptOptions) {\n  // Mapping by the order by original option (but not order of\n  // new option) in merge mode. Because we should ensure\n  // some specified index (like xAxisIndex) is consistent with\n  // original option, which is easy to understand, espatially in\n  // media query. And in most case, merge option is used to\n  // update partial option but not be expected to change order.\n  newCptOptions = (newCptOptions || []).slice();\n  var result = zrUtil.map(exists || [], function (obj, index) {\n    return {\n      exist: obj\n    };\n  }); // Mapping by id or name if specified.\n\n  each(newCptOptions, function (cptOption, index) {\n    if (!isObject(cptOption)) {\n      return;\n    } // id has highest priority.\n\n\n    for (var i = 0; i < result.length; i++) {\n      if (!result[i].option // Consider name: two map to one.\n      && cptOption.id != null && result[i].exist.id === cptOption.id + '') {\n        result[i].option = cptOption;\n        newCptOptions[index] = null;\n        return;\n      }\n    }\n\n    for (var i = 0; i < result.length; i++) {\n      var exist = result[i].exist;\n\n      if (!result[i].option // Consider name: two map to one.\n      // Can not match when both ids exist but different.\n      && (exist.id == null || cptOption.id == null) && cptOption.name != null && !isIdInner(cptOption) && !isIdInner(exist) && exist.name === cptOption.name + '') {\n        result[i].option = cptOption;\n        newCptOptions[index] = null;\n        return;\n      }\n    }\n  }); // Otherwise mapping by index.\n\n  each(newCptOptions, function (cptOption, index) {\n    if (!isObject(cptOption)) {\n      return;\n    }\n\n    var i = 0;\n\n    for (; i < result.length; i++) {\n      var exist = result[i].exist;\n\n      if (!result[i].option // Existing model that already has id should be able to\n      // mapped to (because after mapping performed model may\n      // be assigned with a id, whish should not affect next\n      // mapping), except those has inner id.\n      && !isIdInner(exist) // Caution:\n      // Do not overwrite id. But name can be overwritten,\n      // because axis use name as 'show label text'.\n      // 'exist' always has id and name and we dont\n      // need to check it.\n      && cptOption.id == null) {\n        result[i].option = cptOption;\n        break;\n      }\n    }\n\n    if (i >= result.length) {\n      result.push({\n        option: cptOption\n      });\n    }\n  });\n  return result;\n}\n/**\n * Make id and name for mapping result (result of mappingToExists)\n * into `keyInfo` field.\n *\n * @public\n * @param {Array.<Object>} Result, like [{exist: ..., option: ...}, {}],\n *                          which order is the same as exists.\n * @return {Array.<Object>} The input.\n */\n\n\nfunction makeIdAndName(mapResult) {\n  // We use this id to hash component models and view instances\n  // in echarts. id can be specified by user, or auto generated.\n  // The id generation rule ensures new view instance are able\n  // to mapped to old instance when setOption are called in\n  // no-merge mode. So we generate model id by name and plus\n  // type in view id.\n  // name can be duplicated among components, which is convenient\n  // to specify multi components (like series) by one name.\n  // Ensure that each id is distinct.\n  var idMap = zrUtil.createHashMap();\n  each(mapResult, function (item, index) {\n    var existCpt = item.exist;\n    existCpt && idMap.set(existCpt.id, item);\n  });\n  each(mapResult, function (item, index) {\n    var opt = item.option;\n    zrUtil.assert(!opt || opt.id == null || !idMap.get(opt.id) || idMap.get(opt.id) === item, 'id duplicates: ' + (opt && opt.id));\n    opt && opt.id != null && idMap.set(opt.id, item);\n    !item.keyInfo && (item.keyInfo = {});\n  }); // Make name and id.\n\n  each(mapResult, function (item, index) {\n    var existCpt = item.exist;\n    var opt = item.option;\n    var keyInfo = item.keyInfo;\n\n    if (!isObject(opt)) {\n      return;\n    } // name can be overwitten. Consider case: axis.name = '20km'.\n    // But id generated by name will not be changed, which affect\n    // only in that case: setOption with 'not merge mode' and view\n    // instance will be recreated, which can be accepted.\n\n\n    keyInfo.name = opt.name != null ? opt.name + '' : existCpt ? existCpt.name : '\\0-'; // name may be displayed on screen, so use '-'.\n\n    if (existCpt) {\n      keyInfo.id = existCpt.id;\n    } else if (opt.id != null) {\n      keyInfo.id = opt.id + '';\n    } else {\n      // Consider this situatoin:\n      //  optionA: [{name: 'a'}, {name: 'a'}, {..}]\n      //  optionB [{..}, {name: 'a'}, {name: 'a'}]\n      // Series with the same name between optionA and optionB\n      // should be mapped.\n      var idNum = 0;\n\n      do {\n        keyInfo.id = '\\0' + keyInfo.name + '\\0' + idNum++;\n      } while (idMap.get(keyInfo.id));\n    }\n\n    idMap.set(keyInfo.id, item);\n  });\n}\n/**\n * @public\n * @param {Object} cptOption\n * @return {boolean}\n */\n\n\nfunction isIdInner(cptOption) {\n  return isObject(cptOption) && cptOption.id && (cptOption.id + '').indexOf('\\0_ec_\\0') === 0;\n}\n/**\n * A helper for removing duplicate items between batchA and batchB,\n * and in themselves, and categorize by series.\n *\n * @param {Array.<Object>} batchA Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...]\n * @param {Array.<Object>} batchB Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...]\n * @return {Array.<Array.<Object>, Array.<Object>>} result: [resultBatchA, resultBatchB]\n */\n\n\nfunction compressBatches(batchA, batchB) {\n  var mapA = {};\n  var mapB = {};\n  makeMap(batchA || [], mapA);\n  makeMap(batchB || [], mapB, mapA);\n  return [mapToArray(mapA), mapToArray(mapB)];\n\n  function makeMap(sourceBatch, map, otherMap) {\n    for (var i = 0, len = sourceBatch.length; i < len; i++) {\n      var seriesId = sourceBatch[i].seriesId;\n      var dataIndices = normalizeToArray(sourceBatch[i].dataIndex);\n      var otherDataIndices = otherMap && otherMap[seriesId];\n\n      for (var j = 0, lenj = dataIndices.length; j < lenj; j++) {\n        var dataIndex = dataIndices[j];\n\n        if (otherDataIndices && otherDataIndices[dataIndex]) {\n          otherDataIndices[dataIndex] = null;\n        } else {\n          (map[seriesId] || (map[seriesId] = {}))[dataIndex] = 1;\n        }\n      }\n    }\n  }\n\n  function mapToArray(map, isData) {\n    var result = [];\n\n    for (var i in map) {\n      if (map.hasOwnProperty(i) && map[i] != null) {\n        if (isData) {\n          result.push(+i);\n        } else {\n          var dataIndices = mapToArray(map[i], true);\n          dataIndices.length && result.push({\n            seriesId: i,\n            dataIndex: dataIndices\n          });\n        }\n      }\n    }\n\n    return result;\n  }\n}\n/**\n * @param {module:echarts/data/List} data\n * @param {Object} payload Contains dataIndex (means rawIndex) / dataIndexInside / name\n *                         each of which can be Array or primary type.\n * @return {number|Array.<number>} dataIndex If not found, return undefined/null.\n */\n\n\nfunction queryDataIndex(data, payload) {\n  if (payload.dataIndexInside != null) {\n    return payload.dataIndexInside;\n  } else if (payload.dataIndex != null) {\n    return zrUtil.isArray(payload.dataIndex) ? zrUtil.map(payload.dataIndex, function (value) {\n      return data.indexOfRawIndex(value);\n    }) : data.indexOfRawIndex(payload.dataIndex);\n  } else if (payload.name != null) {\n    return zrUtil.isArray(payload.name) ? zrUtil.map(payload.name, function (value) {\n      return data.indexOfName(value);\n    }) : data.indexOfName(payload.name);\n  }\n}\n/**\n * Enable property storage to any host object.\n * Notice: Serialization is not supported.\n *\n * For example:\n * var get = modelUitl.makeGetter();\n *\n * function some(hostObj) {\n *      get(hostObj)._someProperty = 1212;\n *      ...\n * }\n *\n * @return {Function}\n */\n\n\nvar makeGetter = function () {\n  var index = 0;\n  return function () {\n    var key = '\\0__ec_prop_getter_' + index++;\n    return function (hostObj) {\n      return hostObj[key] || (hostObj[key] = {});\n    };\n  };\n}();\n/**\n * @param {module:echarts/model/Global} ecModel\n * @param {string|Object} finder\n *        If string, e.g., 'geo', means {geoIndex: 0}.\n *        If Object, could contain some of these properties below:\n *        {\n *            seriesIndex, seriesId, seriesName,\n *            geoIndex, geoId, geoName,\n *            bmapIndex, bmapId, bmapName,\n *            xAxisIndex, xAxisId, xAxisName,\n *            yAxisIndex, yAxisId, yAxisName,\n *            gridIndex, gridId, gridName,\n *            ... (can be extended)\n *        }\n *        Each properties can be number|string|Array.<number>|Array.<string>\n *        For example, a finder could be\n *        {\n *            seriesIndex: 3,\n *            geoId: ['aa', 'cc'],\n *            gridName: ['xx', 'rr']\n *        }\n *        xxxIndex can be set as 'all' (means all xxx) or 'none' (means not specify)\n *        If nothing or null/undefined specified, return nothing.\n * @param {Object} [opt]\n * @param {string} [opt.defaultMainType]\n * @param {Array.<string>} [opt.includeMainTypes]\n * @return {Object} result like:\n *        {\n *            seriesModels: [seriesModel1, seriesModel2],\n *            seriesModel: seriesModel1, // The first model\n *            geoModels: [geoModel1, geoModel2],\n *            geoModel: geoModel1, // The first model\n *            ...\n *        }\n */\n\n\nfunction parseFinder(ecModel, finder, opt) {\n  if (zrUtil.isString(finder)) {\n    var obj = {};\n    obj[finder + 'Index'] = 0;\n    finder = obj;\n  }\n\n  var defaultMainType = opt && opt.defaultMainType;\n\n  if (defaultMainType && !has(finder, defaultMainType + 'Index') && !has(finder, defaultMainType + 'Id') && !has(finder, defaultMainType + 'Name')) {\n    finder[defaultMainType + 'Index'] = 0;\n  }\n\n  var result = {};\n  each(finder, function (value, key) {\n    var value = finder[key]; // Exclude 'dataIndex' and other illgal keys.\n\n    if (key === 'dataIndex' || key === 'dataIndexInside') {\n      result[key] = value;\n      return;\n    }\n\n    var parsedKey = key.match(/^(\\w+)(Index|Id|Name)$/) || [];\n    var mainType = parsedKey[1];\n    var queryType = (parsedKey[2] || '').toLowerCase();\n\n    if (!mainType || !queryType || value == null || queryType === 'index' && value === 'none' || opt && opt.includeMainTypes && zrUtil.indexOf(opt.includeMainTypes, mainType) < 0) {\n      return;\n    }\n\n    var queryParam = {\n      mainType: mainType\n    };\n\n    if (queryType !== 'index' || value !== 'all') {\n      queryParam[queryType] = value;\n    }\n\n    var models = ecModel.queryComponents(queryParam);\n    result[mainType + 'Models'] = models;\n    result[mainType + 'Model'] = models[0];\n  });\n  return result;\n}\n/**\n * @see {module:echarts/data/helper/completeDimensions}\n * @param {module:echarts/data/List} data\n * @param {string|number} dataDim\n * @return {string}\n */\n\n\nfunction dataDimToCoordDim(data, dataDim) {\n  var dimensions = data.dimensions;\n  dataDim = data.getDimension(dataDim);\n\n  for (var i = 0; i < dimensions.length; i++) {\n    var dimItem = data.getDimensionInfo(dimensions[i]);\n\n    if (dimItem.name === dataDim) {\n      return dimItem.coordDim;\n    }\n  }\n}\n/**\n * @see {module:echarts/data/helper/completeDimensions}\n * @param {module:echarts/data/List} data\n * @param {string} coordDim\n * @return {Array.<string>} data dimensions on the coordDim.\n */\n\n\nfunction coordDimToDataDim(data, coordDim) {\n  var dataDim = [];\n  each(data.dimensions, function (dimName) {\n    var dimItem = data.getDimensionInfo(dimName);\n\n    if (dimItem.coordDim === coordDim) {\n      dataDim[dimItem.coordDimIndex] = dimItem.name;\n    }\n  });\n  return dataDim;\n}\n/**\n * @see {module:echarts/data/helper/completeDimensions}\n * @param {module:echarts/data/List} data\n * @param {string} otherDim Can be `otherDims`\n *                        like 'label' or 'tooltip'.\n * @return {Array.<string>} data dimensions on the otherDim.\n */\n\n\nfunction otherDimToDataDim(data, otherDim) {\n  var dataDim = [];\n  each(data.dimensions, function (dimName) {\n    var dimItem = data.getDimensionInfo(dimName);\n    var otherDims = dimItem.otherDims;\n    var dimIndex = otherDims[otherDim];\n\n    if (dimIndex != null && dimIndex !== false) {\n      dataDim[dimIndex] = dimItem.name;\n    }\n  });\n  return dataDim;\n}\n\nfunction has(obj, prop) {\n  return obj && obj.hasOwnProperty(prop);\n}\n\nexports.normalizeToArray = normalizeToArray;\nexports.defaultEmphasis = defaultEmphasis;\nexports.TEXT_STYLE_OPTIONS = TEXT_STYLE_OPTIONS;\nexports.getDataItemValue = getDataItemValue;\nexports.isDataItemOption = isDataItemOption;\nexports.converDataValue = converDataValue;\nexports.createDataFormatModel = createDataFormatModel;\nexports.dataFormatMixin = dataFormatMixin;\nexports.mappingToExists = mappingToExists;\nexports.makeIdAndName = makeIdAndName;\nexports.isIdInner = isIdInner;\nexports.compressBatches = compressBatches;\nexports.queryDataIndex = queryDataIndex;\nexports.makeGetter = makeGetter;\nexports.parseFinder = parseFinder;\nexports.dataDimToCoordDim = dataDimToCoordDim;\nexports.coordDimToDataDim = coordDimToDataDim;\nexports.otherDimToDataDim = otherDimToDataDim;\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar zrUtil = __webpack_require__(0);\n\nvar env = __webpack_require__(15);\n\nvar clazzUtil = __webpack_require__(32);\n\nvar lineStyleMixin = __webpack_require__(35);\n\nvar areaStyleMixin = __webpack_require__(36);\n\nvar textStyleMixin = __webpack_require__(37);\n\nvar itemStyleMixin = __webpack_require__(76);\n\n/**\n * @module echarts/model/Model\n */\nvar mixin = zrUtil.mixin;\n/**\n * @alias module:echarts/model/Model\n * @constructor\n * @param {Object} option\n * @param {module:echarts/model/Model} [parentModel]\n * @param {module:echarts/model/Global} [ecModel]\n */\n\nfunction Model(option, parentModel, ecModel) {\n  /**\n   * @type {module:echarts/model/Model}\n   * @readOnly\n   */\n  this.parentModel = parentModel;\n  /**\n   * @type {module:echarts/model/Global}\n   * @readOnly\n   */\n\n  this.ecModel = ecModel;\n  /**\n   * @type {Object}\n   * @protected\n   */\n\n  this.option = option; // Simple optimization\n  // if (this.init) {\n  //     if (arguments.length <= 4) {\n  //         this.init(option, parentModel, ecModel, extraOpt);\n  //     }\n  //     else {\n  //         this.init.apply(this, arguments);\n  //     }\n  // }\n}\n\nModel.prototype = {\n  constructor: Model,\n\n  /**\n   * Model 的初始化函数\n   * @param {Object} option\n   */\n  init: null,\n\n  /**\n   * 从新的 Option merge\n   */\n  mergeOption: function (option) {\n    zrUtil.merge(this.option, option, true);\n  },\n\n  /**\n   * @param {string|Array.<string>} path\n   * @param {boolean} [ignoreParent=false]\n   * @return {*}\n   */\n  get: function (path, ignoreParent) {\n    if (path == null) {\n      return this.option;\n    }\n\n    return doGet(this.option, this.parsePath(path), !ignoreParent && getParent(this, path));\n  },\n\n  /**\n   * @param {string} key\n   * @param {boolean} [ignoreParent=false]\n   * @return {*}\n   */\n  getShallow: function (key, ignoreParent) {\n    var option = this.option;\n    var val = option == null ? option : option[key];\n    var parentModel = !ignoreParent && getParent(this, key);\n\n    if (val == null && parentModel) {\n      val = parentModel.getShallow(key);\n    }\n\n    return val;\n  },\n\n  /**\n   * @param {string|Array.<string>} [path]\n   * @param {module:echarts/model/Model} [parentModel]\n   * @return {module:echarts/model/Model}\n   */\n  getModel: function (path, parentModel) {\n    var obj = path == null ? this.option : doGet(this.option, path = this.parsePath(path));\n    var thisParentModel;\n    parentModel = parentModel || (thisParentModel = getParent(this, path)) && thisParentModel.getModel(path);\n    return new Model(obj, parentModel, this.ecModel);\n  },\n\n  /**\n   * If model has option\n   */\n  isEmpty: function () {\n    return this.option == null;\n  },\n  restoreData: function () {},\n  // Pending\n  clone: function () {\n    var Ctor = this.constructor;\n    return new Ctor(zrUtil.clone(this.option));\n  },\n  setReadOnly: function (properties) {\n    clazzUtil.setReadOnly(this, properties);\n  },\n  // If path is null/undefined, return null/undefined.\n  parsePath: function (path) {\n    if (typeof path === 'string') {\n      path = path.split('.');\n    }\n\n    return path;\n  },\n\n  /**\n   * @param {Function} getParentMethod\n   *        param {Array.<string>|string} path\n   *        return {module:echarts/model/Model}\n   */\n  customizeGetParent: function (getParentMethod) {\n    clazzUtil.set(this, 'getParent', getParentMethod);\n  },\n  isAnimationEnabled: function () {\n    if (!env.node) {\n      if (this.option.animation != null) {\n        return !!this.option.animation;\n      } else if (this.parentModel) {\n        return this.parentModel.isAnimationEnabled();\n      }\n    }\n  }\n};\n\nfunction doGet(obj, pathArr, parentModel) {\n  for (var i = 0; i < pathArr.length; i++) {\n    // Ignore empty\n    if (!pathArr[i]) {\n      continue;\n    } // obj could be number/string/... (like 0)\n\n\n    obj = obj && typeof obj === 'object' ? obj[pathArr[i]] : null;\n\n    if (obj == null) {\n      break;\n    }\n  }\n\n  if (obj == null && parentModel) {\n    obj = parentModel.get(pathArr);\n  }\n\n  return obj;\n} // `path` can be null/undefined\n\n\nfunction getParent(model, path) {\n  var getParentMethod = clazzUtil.get(model, 'getParent');\n  return getParentMethod ? getParentMethod.call(model, path) : model.parentModel;\n} // Enable Model.extend.\n\n\nclazzUtil.enableClassExtend(Model);\nmixin(Model, lineStyleMixin);\nmixin(Model, areaStyleMixin);\nmixin(Model, textStyleMixin);\nmixin(Model, itemStyleMixin);\nvar _default = Model;\nmodule.exports = _default;\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar _config = __webpack_require__(33);\n\nvar __DEV__ = _config.__DEV__;\n\nvar zrUtil = __webpack_require__(0);\n\nvar TYPE_DELIMITER = '.';\nvar IS_CONTAINER = '___EC__COMPONENT__CONTAINER___';\nvar MEMBER_PRIFIX = '\\0ec_\\0';\n/**\n * Hide private class member.\n * The same behavior as `host[name] = value;` (can be right-value)\n * @public\n */\n\nfunction set(host, name, value) {\n  return host[MEMBER_PRIFIX + name] = value;\n}\n/**\n * Hide private class member.\n * The same behavior as `host[name];`\n * @public\n */\n\n\nfunction get(host, name) {\n  return host[MEMBER_PRIFIX + name];\n}\n/**\n * For hidden private class member.\n * The same behavior as `host.hasOwnProperty(name);`\n * @public\n */\n\n\nfunction hasOwn(host, name) {\n  return host.hasOwnProperty(MEMBER_PRIFIX + name);\n}\n/**\n * Notice, parseClassType('') should returns {main: '', sub: ''}\n * @public\n */\n\n\nfunction parseClassType(componentType) {\n  var ret = {\n    main: '',\n    sub: ''\n  };\n\n  if (componentType) {\n    componentType = componentType.split(TYPE_DELIMITER);\n    ret.main = componentType[0] || '';\n    ret.sub = componentType[1] || '';\n  }\n\n  return ret;\n}\n/**\n * @public\n */\n\n\nfunction checkClassType(componentType) {\n  zrUtil.assert(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(componentType), 'componentType \"' + componentType + '\" illegal');\n}\n/**\n * @public\n */\n\n\nfunction enableClassExtend(RootClass, mandatoryMethods) {\n  RootClass.$constructor = RootClass;\n\n  RootClass.extend = function (proto) {\n    var superClass = this;\n\n    var ExtendedClass = function () {\n      if (!proto.$constructor) {\n        superClass.apply(this, arguments);\n      } else {\n        proto.$constructor.apply(this, arguments);\n      }\n    };\n\n    zrUtil.extend(ExtendedClass.prototype, proto);\n    ExtendedClass.extend = this.extend;\n    ExtendedClass.superCall = superCall;\n    ExtendedClass.superApply = superApply;\n    zrUtil.inherits(ExtendedClass, this);\n    ExtendedClass.superClass = superClass;\n    return ExtendedClass;\n  };\n} // superCall should have class info, which can not be fetch from 'this'.\n// Consider this case:\n// class A has method f,\n// class B inherits class A, overrides method f, f call superApply('f'),\n// class C inherits class B, do not overrides method f,\n// then when method of class C is called, dead loop occured.\n\n\nfunction superCall(context, methodName) {\n  var args = zrUtil.slice(arguments, 2);\n  return this.superClass.prototype[methodName].apply(context, args);\n}\n\nfunction superApply(context, methodName, args) {\n  return this.superClass.prototype[methodName].apply(context, args);\n}\n/**\n * @param {Object} entity\n * @param {Object} options\n * @param {boolean} [options.registerWhenExtend]\n * @public\n */\n\n\nfunction enableClassManagement(entity, options) {\n  options = options || {};\n  /**\n   * Component model classes\n   * key: componentType,\n   * value:\n   *     componentClass, when componentType is 'xxx'\n   *     or Object.<subKey, componentClass>, when componentType is 'xxx.yy'\n   * @type {Object}\n   */\n\n  var storage = {};\n\n  entity.registerClass = function (Clazz, componentType) {\n    if (componentType) {\n      checkClassType(componentType);\n      componentType = parseClassType(componentType);\n\n      if (!componentType.sub) {\n        storage[componentType.main] = Clazz;\n      } else if (componentType.sub !== IS_CONTAINER) {\n        var container = makeContainer(componentType);\n        container[componentType.sub] = Clazz;\n      }\n    }\n\n    return Clazz;\n  };\n\n  entity.getClass = function (componentMainType, subType, throwWhenNotFound) {\n    var Clazz = storage[componentMainType];\n\n    if (Clazz && Clazz[IS_CONTAINER]) {\n      Clazz = subType ? Clazz[subType] : null;\n    }\n\n    if (throwWhenNotFound && !Clazz) {\n      throw new Error(!subType ? componentMainType + '.' + 'type should be specified.' : 'Component ' + componentMainType + '.' + (subType || '') + ' not exists. Load it first.');\n    }\n\n    return Clazz;\n  };\n\n  entity.getClassesByMainType = function (componentType) {\n    componentType = parseClassType(componentType);\n    var result = [];\n    var obj = storage[componentType.main];\n\n    if (obj && obj[IS_CONTAINER]) {\n      zrUtil.each(obj, function (o, type) {\n        type !== IS_CONTAINER && result.push(o);\n      });\n    } else {\n      result.push(obj);\n    }\n\n    return result;\n  };\n\n  entity.hasClass = function (componentType) {\n    // Just consider componentType.main.\n    componentType = parseClassType(componentType);\n    return !!storage[componentType.main];\n  };\n  /**\n   * @return {Array.<string>} Like ['aa', 'bb'], but can not be ['aa.xx']\n   */\n\n\n  entity.getAllClassMainTypes = function () {\n    var types = [];\n    zrUtil.each(storage, function (obj, type) {\n      types.push(type);\n    });\n    return types;\n  };\n  /**\n   * If a main type is container and has sub types\n   * @param  {string}  mainType\n   * @return {boolean}\n   */\n\n\n  entity.hasSubTypes = function (componentType) {\n    componentType = parseClassType(componentType);\n    var obj = storage[componentType.main];\n    return obj && obj[IS_CONTAINER];\n  };\n\n  entity.parseClassType = parseClassType;\n\n  function makeContainer(componentType) {\n    var container = storage[componentType.main];\n\n    if (!container || !container[IS_CONTAINER]) {\n      container = storage[componentType.main] = {};\n      container[IS_CONTAINER] = true;\n    }\n\n    return container;\n  }\n\n  if (options.registerWhenExtend) {\n    var originalExtend = entity.extend;\n\n    if (originalExtend) {\n      entity.extend = function (proto) {\n        var ExtendedClass = originalExtend.call(this, proto);\n        return entity.registerClass(ExtendedClass, proto.type);\n      };\n    }\n  }\n\n  return entity;\n}\n/**\n * @param {string|Array.<string>} properties\n */\n\n\nfunction setReadOnly(obj, properties) {// FIXME It seems broken in IE8 simulation of IE11\n  // if (!zrUtil.isArray(properties)) {\n  //     properties = properties != null ? [properties] : [];\n  // }\n  // zrUtil.each(properties, function (prop) {\n  //     var value = obj[prop];\n  //     Object.defineProperty\n  //         && Object.defineProperty(obj, prop, {\n  //             value: value, writable: false\n  //         });\n  //     zrUtil.isArray(obj[prop])\n  //         && Object.freeze\n  //         && Object.freeze(obj[prop]);\n  // });\n}\n\nexports.set = set;\nexports.get = get;\nexports.hasOwn = hasOwn;\nexports.parseClassType = parseClassType;\nexports.enableClassExtend = enableClassExtend;\nexports.enableClassManagement = enableClassManagement;\nexports.setReadOnly = setReadOnly;\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {// (1) The code `if (__DEV__) ...` can be removed by build tool.\n// (2) If intend to use `__DEV__`, this module should be imported. Use a global\n// variable `__DEV__` may cause that miss the declaration (see #6535), or the\n// declaration is behind of the using position (for example in `Model.extent`,\n// And tools like rollup can not analysis the dependency if not import).\nvar dev; // In browser\n\nif (typeof window !== 'undefined') {\n  dev = window.__DEV__;\n} // In node\nelse if (typeof global !== 'undefined') {\n    dev = global.__DEV__;\n  }\n\nif (typeof dev === 'undefined') {\n  dev = true;\n}\n\nvar __DEV__ = dev;\nexports.__DEV__ = __DEV__;\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(34)))\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports) {\n\nvar g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\n} catch(e) {\n\t// This works if the window reference is available\n\tif(typeof window === \"object\")\n\t\tg = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar makeStyleMapper = __webpack_require__(11);\n\nvar getLineStyle = makeStyleMapper([['lineWidth', 'width'], ['stroke', 'color'], ['opacity'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor']]);\nvar _default = {\n  getLineStyle: function (excludes) {\n    var style = getLineStyle(this, excludes);\n    var lineDash = this.getLineDash(style.lineWidth);\n    lineDash && (style.lineDash = lineDash);\n    return style;\n  },\n  getLineDash: function (lineWidth) {\n    if (lineWidth == null) {\n      lineWidth = 1;\n    }\n\n    var lineType = this.get('type');\n    var dotSize = Math.max(lineWidth, 2);\n    var dashSize = lineWidth * 4;\n    return lineType === 'solid' || lineType == null ? null : lineType === 'dashed' ? [dashSize, dashSize] : [dotSize, dotSize];\n  }\n};\nmodule.exports = _default;\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar makeStyleMapper = __webpack_require__(11);\n\nvar getAreaStyle = makeStyleMapper([['fill', 'color'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['opacity'], ['shadowColor']]);\nvar _default = {\n  getAreaStyle: function (excludes, includes) {\n    return getAreaStyle(this, excludes, includes);\n  }\n};\nmodule.exports = _default;\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar textContain = __webpack_require__(5);\n\nvar graphicUtil = __webpack_require__(38);\n\nvar PATH_COLOR = ['textStyle', 'color'];\nvar _default = {\n  /**\n   * Get color property or get color from option.textStyle.color\n   * @param {boolean} [isEmphasis]\n   * @return {string}\n   */\n  getTextColor: function (isEmphasis) {\n    var ecModel = this.ecModel;\n    return this.getShallow('color') || (!isEmphasis && ecModel ? ecModel.get(PATH_COLOR) : null);\n  },\n\n  /**\n   * Create font string from fontStyle, fontWeight, fontSize, fontFamily\n   * @return {string}\n   */\n  getFont: function () {\n    return graphicUtil.getFont({\n      fontStyle: this.getShallow('fontStyle'),\n      fontWeight: this.getShallow('fontWeight'),\n      fontSize: this.getShallow('fontSize'),\n      fontFamily: this.getShallow('fontFamily')\n    }, this.ecModel);\n  },\n  getTextRect: function (text) {\n    return textContain.getBoundingRect(text, this.getFont(), this.getShallow('align'), this.getShallow('verticalAlign') || this.getShallow('baseline'), this.getShallow('padding'), this.getShallow('rich'), this.getShallow('truncateText'));\n  }\n};\nmodule.exports = _default;\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar zrUtil = __webpack_require__(0);\n\nvar pathTool = __webpack_require__(39);\n\nvar colorTool = __webpack_require__(18);\n\nvar matrix = __webpack_require__(8);\n\nvar vector = __webpack_require__(2);\n\nvar Path = __webpack_require__(1);\n\nvar Transformable = __webpack_require__(17);\n\nvar Image = __webpack_require__(58);\n\nexports.Image = Image;\n\nvar Group = __webpack_require__(59);\n\nexports.Group = Group;\n\nvar Text = __webpack_require__(60);\n\nexports.Text = Text;\n\nvar Circle = __webpack_require__(61);\n\nexports.Circle = Circle;\n\nvar Sector = __webpack_require__(62);\n\nexports.Sector = Sector;\n\nvar Ring = __webpack_require__(64);\n\nexports.Ring = Ring;\n\nvar Polygon = __webpack_require__(65);\n\nexports.Polygon = Polygon;\n\nvar Polyline = __webpack_require__(68);\n\nexports.Polyline = Polyline;\n\nvar Rect = __webpack_require__(69);\n\nexports.Rect = Rect;\n\nvar Line = __webpack_require__(70);\n\nexports.Line = Line;\n\nvar BezierCurve = __webpack_require__(71);\n\nexports.BezierCurve = BezierCurve;\n\nvar Arc = __webpack_require__(72);\n\nexports.Arc = Arc;\n\nvar CompoundPath = __webpack_require__(73);\n\nexports.CompoundPath = CompoundPath;\n\nvar LinearGradient = __webpack_require__(74);\n\nexports.LinearGradient = LinearGradient;\n\nvar RadialGradient = __webpack_require__(75);\n\nexports.RadialGradient = RadialGradient;\n\nvar BoundingRect = __webpack_require__(3);\n\nexports.BoundingRect = BoundingRect;\nvar round = Math.round;\nvar mathMax = Math.max;\nvar mathMin = Math.min;\nvar EMPTY_OBJ = {};\n/**\n * Extend shape with parameters\n */\n\nfunction extendShape(opts) {\n  return Path.extend(opts);\n}\n/**\n * Extend path\n */\n\n\nfunction extendPath(pathData, opts) {\n  return pathTool.extendFromString(pathData, opts);\n}\n/**\n * Create a path element from path data string\n * @param {string} pathData\n * @param {Object} opts\n * @param {module:zrender/core/BoundingRect} rect\n * @param {string} [layout=cover] 'center' or 'cover'\n */\n\n\nfunction makePath(pathData, opts, rect, layout) {\n  var path = pathTool.createFromString(pathData, opts);\n  var boundingRect = path.getBoundingRect();\n\n  if (rect) {\n    if (layout === 'center') {\n      rect = centerGraphic(rect, boundingRect);\n    }\n\n    resizePath(path, rect);\n  }\n\n  return path;\n}\n/**\n * Create a image element from image url\n * @param {string} imageUrl image url\n * @param {Object} opts options\n * @param {module:zrender/core/BoundingRect} rect constrain rect\n * @param {string} [layout=cover] 'center' or 'cover'\n */\n\n\nfunction makeImage(imageUrl, rect, layout) {\n  var path = new Image({\n    style: {\n      image: imageUrl,\n      x: rect.x,\n      y: rect.y,\n      width: rect.width,\n      height: rect.height\n    },\n    onload: function (img) {\n      if (layout === 'center') {\n        var boundingRect = {\n          width: img.width,\n          height: img.height\n        };\n        path.setStyle(centerGraphic(rect, boundingRect));\n      }\n    }\n  });\n  return path;\n}\n/**\n * Get position of centered element in bounding box.\n *\n * @param  {Object} rect         element local bounding box\n * @param  {Object} boundingRect constraint bounding box\n * @return {Object} element position containing x, y, width, and height\n */\n\n\nfunction centerGraphic(rect, boundingRect) {\n  // Set rect to center, keep width / height ratio.\n  var aspect = boundingRect.width / boundingRect.height;\n  var width = rect.height * aspect;\n  var height;\n\n  if (width <= rect.width) {\n    height = rect.height;\n  } else {\n    width = rect.width;\n    height = width / aspect;\n  }\n\n  var cx = rect.x + rect.width / 2;\n  var cy = rect.y + rect.height / 2;\n  return {\n    x: cx - width / 2,\n    y: cy - height / 2,\n    width: width,\n    height: height\n  };\n}\n\nvar mergePath = pathTool.mergePath;\n/**\n * Resize a path to fit the rect\n * @param {module:zrender/graphic/Path} path\n * @param {Object} rect\n */\n\nfunction resizePath(path, rect) {\n  if (!path.applyTransform) {\n    return;\n  }\n\n  var pathRect = path.getBoundingRect();\n  var m = pathRect.calculateTransform(rect);\n  path.applyTransform(m);\n}\n/**\n * Sub pixel optimize line for canvas\n *\n * @param {Object} param\n * @param {Object} [param.shape]\n * @param {number} [param.shape.x1]\n * @param {number} [param.shape.y1]\n * @param {number} [param.shape.x2]\n * @param {number} [param.shape.y2]\n * @param {Object} [param.style]\n * @param {number} [param.style.lineWidth]\n * @return {Object} Modified param\n */\n\n\nfunction subPixelOptimizeLine(param) {\n  var shape = param.shape;\n  var lineWidth = param.style.lineWidth;\n\n  if (round(shape.x1 * 2) === round(shape.x2 * 2)) {\n    shape.x1 = shape.x2 = subPixelOptimize(shape.x1, lineWidth, true);\n  }\n\n  if (round(shape.y1 * 2) === round(shape.y2 * 2)) {\n    shape.y1 = shape.y2 = subPixelOptimize(shape.y1, lineWidth, true);\n  }\n\n  return param;\n}\n/**\n * Sub pixel optimize rect for canvas\n *\n * @param {Object} param\n * @param {Object} [param.shape]\n * @param {number} [param.shape.x]\n * @param {number} [param.shape.y]\n * @param {number} [param.shape.width]\n * @param {number} [param.shape.height]\n * @param {Object} [param.style]\n * @param {number} [param.style.lineWidth]\n * @return {Object} Modified param\n */\n\n\nfunction subPixelOptimizeRect(param) {\n  var shape = param.shape;\n  var lineWidth = param.style.lineWidth;\n  var originX = shape.x;\n  var originY = shape.y;\n  var originWidth = shape.width;\n  var originHeight = shape.height;\n  shape.x = subPixelOptimize(shape.x, lineWidth, true);\n  shape.y = subPixelOptimize(shape.y, lineWidth, true);\n  shape.width = Math.max(subPixelOptimize(originX + originWidth, lineWidth, false) - shape.x, originWidth === 0 ? 0 : 1);\n  shape.height = Math.max(subPixelOptimize(originY + originHeight, lineWidth, false) - shape.y, originHeight === 0 ? 0 : 1);\n  return param;\n}\n/**\n * Sub pixel optimize for canvas\n *\n * @param {number} position Coordinate, such as x, y\n * @param {number} lineWidth Should be nonnegative integer.\n * @param {boolean=} positiveOrNegative Default false (negative).\n * @return {number} Optimized position.\n */\n\n\nfunction subPixelOptimize(position, lineWidth, positiveOrNegative) {\n  // Assure that (position + lineWidth / 2) is near integer edge,\n  // otherwise line will be fuzzy in canvas.\n  var doubledPosition = round(position * 2);\n  return (doubledPosition + round(lineWidth)) % 2 === 0 ? doubledPosition / 2 : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2;\n}\n\nfunction hasFillOrStroke(fillOrStroke) {\n  return fillOrStroke != null && fillOrStroke != 'none';\n}\n\nfunction liftColor(color) {\n  return typeof color === 'string' ? colorTool.lift(color, -0.1) : color;\n}\n/**\n * @private\n */\n\n\nfunction cacheElementStl(el) {\n  if (el.__hoverStlDirty) {\n    var stroke = el.style.stroke;\n    var fill = el.style.fill; // Create hoverStyle on mouseover\n\n    var hoverStyle = el.__hoverStl;\n    hoverStyle.fill = hoverStyle.fill || (hasFillOrStroke(fill) ? liftColor(fill) : null);\n    hoverStyle.stroke = hoverStyle.stroke || (hasFillOrStroke(stroke) ? liftColor(stroke) : null);\n    var normalStyle = {};\n\n    for (var name in hoverStyle) {\n      // See comment in `doSingleEnterHover`.\n      if (hoverStyle[name] != null) {\n        normalStyle[name] = el.style[name];\n      }\n    }\n\n    el.__normalStl = normalStyle;\n    el.__hoverStlDirty = false;\n  }\n}\n/**\n * @private\n */\n\n\nfunction doSingleEnterHover(el) {\n  if (el.__isHover) {\n    return;\n  }\n\n  cacheElementStl(el);\n\n  if (el.useHoverLayer) {\n    el.__zr && el.__zr.addHover(el, el.__hoverStl);\n  } else {\n    var style = el.style;\n    var insideRollbackOpt = style.insideRollbackOpt; // Consider case: only `position: 'top'` is set on emphasis, then text\n    // color should be returned to `autoColor`, rather than remain '#fff'.\n    // So we should rollback then apply again after style merging.\n\n    insideRollbackOpt && rollbackInsideStyle(style); // styles can be:\n    // {\n    //     label: {\n    //         normal: {\n    //             show: false,\n    //             position: 'outside',\n    //             fontSize: 18\n    //         },\n    //         emphasis: {\n    //             show: true\n    //         }\n    //     }\n    // },\n    // where properties of `emphasis` may not appear in `normal`. We previously use\n    // module:echarts/util/model#defaultEmphasis to merge `normal` to `emphasis`.\n    // But consider rich text and setOption in merge mode, it is impossible to cover\n    // all properties in merge. So we use merge mode when setting style here, where\n    // only properties that is not `null/undefined` can be set. The disadventage:\n    // null/undefined can not be used to remove style any more in `emphasis`.\n\n    style.extendFrom(el.__hoverStl); // Do not save `insideRollback`.\n\n    if (insideRollbackOpt) {\n      applyInsideStyle(style, style.insideOriginalTextPosition, insideRollbackOpt); // textFill may be rollbacked to null.\n\n      if (style.textFill == null) {\n        style.textFill = insideRollbackOpt.autoColor;\n      }\n    }\n\n    el.dirty(false);\n    el.z2 += 1;\n  }\n\n  el.__isHover = true;\n}\n/**\n * @inner\n */\n\n\nfunction doSingleLeaveHover(el) {\n  if (!el.__isHover) {\n    return;\n  }\n\n  var normalStl = el.__normalStl;\n\n  if (el.useHoverLayer) {\n    el.__zr && el.__zr.removeHover(el);\n  } else {\n    // Consider null/undefined value, should use\n    // `setStyle` but not `extendFrom(stl, true)`.\n    normalStl && el.setStyle(normalStl);\n    el.z2 -= 1;\n  }\n\n  el.__isHover = false;\n}\n/**\n * @inner\n */\n\n\nfunction doEnterHover(el) {\n  el.type === 'group' ? el.traverse(function (child) {\n    if (child.type !== 'group') {\n      doSingleEnterHover(child);\n    }\n  }) : doSingleEnterHover(el);\n}\n\nfunction doLeaveHover(el) {\n  el.type === 'group' ? el.traverse(function (child) {\n    if (child.type !== 'group') {\n      doSingleLeaveHover(child);\n    }\n  }) : doSingleLeaveHover(el);\n}\n/**\n * @inner\n */\n\n\nfunction setElementHoverStl(el, hoverStl) {\n  // If element has sepcified hoverStyle, then use it instead of given hoverStyle\n  // Often used when item group has a label element and it's hoverStyle is different\n  el.__hoverStl = el.hoverStyle || hoverStl || {};\n  el.__hoverStlDirty = true;\n\n  if (el.__isHover) {\n    cacheElementStl(el);\n  }\n}\n/**\n * @inner\n */\n\n\nfunction onElementMouseOver(e) {\n  if (this.__hoverSilentOnTouch && e.zrByTouch) {\n    return;\n  } // Only if element is not in emphasis status\n\n\n  !this.__isEmphasis && doEnterHover(this);\n}\n/**\n * @inner\n */\n\n\nfunction onElementMouseOut(e) {\n  if (this.__hoverSilentOnTouch && e.zrByTouch) {\n    return;\n  } // Only if element is not in emphasis status\n\n\n  !this.__isEmphasis && doLeaveHover(this);\n}\n/**\n * @inner\n */\n\n\nfunction enterEmphasis() {\n  this.__isEmphasis = true;\n  doEnterHover(this);\n}\n/**\n * @inner\n */\n\n\nfunction leaveEmphasis() {\n  this.__isEmphasis = false;\n  doLeaveHover(this);\n}\n/**\n * Set hover style of element.\n * This method can be called repeatly without side-effects.\n * @param {module:zrender/Element} el\n * @param {Object} [hoverStyle]\n * @param {Object} [opt]\n * @param {boolean} [opt.hoverSilentOnTouch=false]\n *        In touch device, mouseover event will be trigger on touchstart event\n *        (see module:zrender/dom/HandlerProxy). By this mechanism, we can\n *        conviniently use hoverStyle when tap on touch screen without additional\n *        code for compatibility.\n *        But if the chart/component has select feature, which usually also use\n *        hoverStyle, there might be conflict between 'select-highlight' and\n *        'hover-highlight' especially when roam is enabled (see geo for example).\n *        In this case, hoverSilentOnTouch should be used to disable hover-highlight\n *        on touch device.\n */\n\n\nfunction setHoverStyle(el, hoverStyle, opt) {\n  el.__hoverSilentOnTouch = opt && opt.hoverSilentOnTouch;\n  el.type === 'group' ? el.traverse(function (child) {\n    if (child.type !== 'group') {\n      setElementHoverStl(child, hoverStyle);\n    }\n  }) : setElementHoverStl(el, hoverStyle); // Duplicated function will be auto-ignored, see Eventful.js.\n\n  el.on('mouseover', onElementMouseOver).on('mouseout', onElementMouseOut); // Emphasis, normal can be triggered manually\n\n  el.on('emphasis', enterEmphasis).on('normal', leaveEmphasis);\n}\n/**\n * @param {Object|module:zrender/graphic/Style} normalStyle\n * @param {Object} emphasisStyle\n * @param {module:echarts/model/Model} normalModel\n * @param {module:echarts/model/Model} emphasisModel\n * @param {Object} opt Check `opt` of `setTextStyleCommon` to find other props.\n * @param {Object} [opt.defaultText]\n * @param {module:echarts/model/Model} [opt.labelFetcher] Fetch text by\n *      `opt.labelFetcher.getFormattedLabel(opt.labelDataIndex, 'normal'/'emphasis', null, opt.labelDimIndex)`\n * @param {module:echarts/model/Model} [opt.labelDataIndex] Fetch text by\n *      `opt.textFetcher.getFormattedLabel(opt.labelDataIndex, 'normal'/'emphasis', null, opt.labelDimIndex)`\n * @param {module:echarts/model/Model} [opt.labelDimIndex] Fetch text by\n *      `opt.textFetcher.getFormattedLabel(opt.labelDataIndex, 'normal'/'emphasis', null, opt.labelDimIndex)`\n * @param {Object} [normalSpecified]\n * @param {Object} [emphasisSpecified]\n */\n\n\nfunction setLabelStyle(normalStyle, emphasisStyle, normalModel, emphasisModel, opt, normalSpecified, emphasisSpecified) {\n  opt = opt || EMPTY_OBJ;\n  var labelFetcher = opt.labelFetcher;\n  var labelDataIndex = opt.labelDataIndex;\n  var labelDimIndex = opt.labelDimIndex; // This scenario, `label.normal.show = true; label.emphasis.show = false`,\n  // is not supported util someone requests.\n\n  var showNormal = normalModel.getShallow('show');\n  var showEmphasis = emphasisModel.getShallow('show'); // Consider performance, only fetch label when necessary.\n  // If `normal.show` is `false` and `emphasis.show` is `true` and `emphasis.formatter` is not set,\n  // label should be displayed, where text is fetched by `normal.formatter` or `opt.defaultText`.\n\n  var baseText = showNormal || showEmphasis ? zrUtil.retrieve2(labelFetcher ? labelFetcher.getFormattedLabel(labelDataIndex, 'normal', null, labelDimIndex) : null, opt.defaultText) : null;\n  var normalStyleText = showNormal ? baseText : null;\n  var emphasisStyleText = showEmphasis ? zrUtil.retrieve2(labelFetcher ? labelFetcher.getFormattedLabel(labelDataIndex, 'emphasis', null, labelDimIndex) : null, baseText) : null; // Optimize: If style.text is null, text will not be drawn.\n\n  if (normalStyleText != null || emphasisStyleText != null) {\n    // Always set `textStyle` even if `normalStyle.text` is null, because default\n    // values have to be set on `normalStyle`.\n    // If we set default values on `emphasisStyle`, consider case:\n    // Firstly, `setOption(... label: {normal: {text: null}, emphasis: {show: true}} ...);`\n    // Secondly, `setOption(... label: {noraml: {show: true, text: 'abc', color: 'red'} ...);`\n    // Then the 'red' will not work on emphasis.\n    setTextStyle(normalStyle, normalModel, normalSpecified, opt);\n    setTextStyle(emphasisStyle, emphasisModel, emphasisSpecified, opt, true);\n  }\n\n  normalStyle.text = normalStyleText;\n  emphasisStyle.text = emphasisStyleText;\n}\n/**\n * Set basic textStyle properties.\n * @param {Object|module:zrender/graphic/Style} textStyle\n * @param {module:echarts/model/Model} model\n * @param {Object} [specifiedTextStyle] Can be overrided by settings in model.\n * @param {Object} [opt] See `opt` of `setTextStyleCommon`.\n * @param {boolean} [isEmphasis]\n */\n\n\nfunction setTextStyle(textStyle, textStyleModel, specifiedTextStyle, opt, isEmphasis) {\n  setTextStyleCommon(textStyle, textStyleModel, opt, isEmphasis);\n  specifiedTextStyle && zrUtil.extend(textStyle, specifiedTextStyle);\n  textStyle.host && textStyle.host.dirty && textStyle.host.dirty(false);\n  return textStyle;\n}\n/**\n * Set text option in the style.\n * @deprecated\n * @param {Object} textStyle\n * @param {module:echarts/model/Model} labelModel\n * @param {string|boolean} defaultColor Default text color.\n *        If set as false, it will be processed as a emphasis style.\n */\n\n\nfunction setText(textStyle, labelModel, defaultColor) {\n  var opt = {\n    isRectText: true\n  };\n  var isEmphasis;\n\n  if (defaultColor === false) {\n    isEmphasis = true;\n  } else {\n    // Support setting color as 'auto' to get visual color.\n    opt.autoColor = defaultColor;\n  }\n\n  setTextStyleCommon(textStyle, labelModel, opt, isEmphasis);\n  textStyle.host && textStyle.host.dirty && textStyle.host.dirty(false);\n}\n/**\n * {\n *      disableBox: boolean, Whether diable drawing box of block (outer most).\n *      isRectText: boolean,\n *      autoColor: string, specify a color when color is 'auto',\n *              for textFill, textStroke, textBackgroundColor, and textBorderColor.\n *              If autoColor specified, it is used as default textFill.\n *      useInsideStyle:\n *              `true`: Use inside style (textFill, textStroke, textStrokeWidth)\n *                  if `textFill` is not specified.\n *              `false`: Do not use inside style.\n *              `null/undefined`: use inside style if `isRectText` is true and\n *                  `textFill` is not specified and textPosition contains `'inside'`.\n *      forceRich: boolean\n * }\n */\n\n\nfunction setTextStyleCommon(textStyle, textStyleModel, opt, isEmphasis) {\n  // Consider there will be abnormal when merge hover style to normal style if given default value.\n  opt = opt || EMPTY_OBJ;\n\n  if (opt.isRectText) {\n    var textPosition = textStyleModel.getShallow('position') || (isEmphasis ? null : 'inside'); // 'outside' is not a valid zr textPostion value, but used\n    // in bar series, and magric type should be considered.\n\n    textPosition === 'outside' && (textPosition = 'top');\n    textStyle.textPosition = textPosition;\n    textStyle.textOffset = textStyleModel.getShallow('offset');\n    var labelRotate = textStyleModel.getShallow('rotate');\n    labelRotate != null && (labelRotate *= Math.PI / 180);\n    textStyle.textRotation = labelRotate;\n    textStyle.textDistance = zrUtil.retrieve2(textStyleModel.getShallow('distance'), isEmphasis ? null : 5);\n  }\n\n  var ecModel = textStyleModel.ecModel;\n  var globalTextStyle = ecModel && ecModel.option.textStyle; // Consider case:\n  // {\n  //     data: [{\n  //         value: 12,\n  //         label: {\n  //             normal: {\n  //                 rich: {\n  //                     // no 'a' here but using parent 'a'.\n  //                 }\n  //             }\n  //         }\n  //     }],\n  //     rich: {\n  //         a: { ... }\n  //     }\n  // }\n\n  var richItemNames = getRichItemNames(textStyleModel);\n  var richResult;\n\n  if (richItemNames) {\n    richResult = {};\n\n    for (var name in richItemNames) {\n      if (richItemNames.hasOwnProperty(name)) {\n        // Cascade is supported in rich.\n        var richTextStyle = textStyleModel.getModel(['rich', name]); // In rich, never `disableBox`.\n\n        setTokenTextStyle(richResult[name] = {}, richTextStyle, globalTextStyle, opt, isEmphasis);\n      }\n    }\n  }\n\n  textStyle.rich = richResult;\n  setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isEmphasis, true);\n\n  if (opt.forceRich && !opt.textStyle) {\n    opt.textStyle = {};\n  }\n\n  return textStyle;\n} // Consider case:\n// {\n//     data: [{\n//         value: 12,\n//         label: {\n//             normal: {\n//                 rich: {\n//                     // no 'a' here but using parent 'a'.\n//                 }\n//             }\n//         }\n//     }],\n//     rich: {\n//         a: { ... }\n//     }\n// }\n\n\nfunction getRichItemNames(textStyleModel) {\n  // Use object to remove duplicated names.\n  var richItemNameMap;\n\n  while (textStyleModel && textStyleModel !== textStyleModel.ecModel) {\n    var rich = (textStyleModel.option || EMPTY_OBJ).rich;\n\n    if (rich) {\n      richItemNameMap = richItemNameMap || {};\n\n      for (var name in rich) {\n        if (rich.hasOwnProperty(name)) {\n          richItemNameMap[name] = 1;\n        }\n      }\n    }\n\n    textStyleModel = textStyleModel.parentModel;\n  }\n\n  return richItemNameMap;\n}\n\nfunction setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isEmphasis, isBlock) {\n  // In merge mode, default value should not be given.\n  globalTextStyle = !isEmphasis && globalTextStyle || EMPTY_OBJ;\n  textStyle.textFill = getAutoColor(textStyleModel.getShallow('color'), opt) || globalTextStyle.color;\n  textStyle.textStroke = getAutoColor(textStyleModel.getShallow('textBorderColor'), opt) || globalTextStyle.textBorderColor;\n  textStyle.textStrokeWidth = zrUtil.retrieve2(textStyleModel.getShallow('textBorderWidth'), globalTextStyle.textBorderWidth);\n\n  if (!isEmphasis) {\n    if (isBlock) {\n      // Always set `insideRollback`, for clearing previous.\n      var originalTextPosition = textStyle.textPosition;\n      textStyle.insideRollback = applyInsideStyle(textStyle, originalTextPosition, opt); // Save original textPosition, because style.textPosition will be repalced by\n      // real location (like [10, 30]) in zrender.\n\n      textStyle.insideOriginalTextPosition = originalTextPosition;\n      textStyle.insideRollbackOpt = opt;\n    } // Set default finally.\n\n\n    if (textStyle.textFill == null) {\n      textStyle.textFill = opt.autoColor;\n    }\n  } // Do not use `getFont` here, because merge should be supported, where\n  // part of these properties may be changed in emphasis style, and the\n  // others should remain their original value got from normal style.\n\n\n  textStyle.fontStyle = textStyleModel.getShallow('fontStyle') || globalTextStyle.fontStyle;\n  textStyle.fontWeight = textStyleModel.getShallow('fontWeight') || globalTextStyle.fontWeight;\n  textStyle.fontSize = textStyleModel.getShallow('fontSize') || globalTextStyle.fontSize;\n  textStyle.fontFamily = textStyleModel.getShallow('fontFamily') || globalTextStyle.fontFamily;\n  textStyle.textAlign = textStyleModel.getShallow('align');\n  textStyle.textVerticalAlign = textStyleModel.getShallow('verticalAlign') || textStyleModel.getShallow('baseline');\n  textStyle.textLineHeight = textStyleModel.getShallow('lineHeight');\n  textStyle.textWidth = textStyleModel.getShallow('width');\n  textStyle.textHeight = textStyleModel.getShallow('height');\n  textStyle.textTag = textStyleModel.getShallow('tag');\n\n  if (!isBlock || !opt.disableBox) {\n    textStyle.textBackgroundColor = getAutoColor(textStyleModel.getShallow('backgroundColor'), opt);\n    textStyle.textPadding = textStyleModel.getShallow('padding');\n    textStyle.textBorderColor = getAutoColor(textStyleModel.getShallow('borderColor'), opt);\n    textStyle.textBorderWidth = textStyleModel.getShallow('borderWidth');\n    textStyle.textBorderRadius = textStyleModel.getShallow('borderRadius');\n    textStyle.textBoxShadowColor = textStyleModel.getShallow('shadowColor');\n    textStyle.textBoxShadowBlur = textStyleModel.getShallow('shadowBlur');\n    textStyle.textBoxShadowOffsetX = textStyleModel.getShallow('shadowOffsetX');\n    textStyle.textBoxShadowOffsetY = textStyleModel.getShallow('shadowOffsetY');\n  }\n\n  textStyle.textShadowColor = textStyleModel.getShallow('textShadowColor') || globalTextStyle.textShadowColor;\n  textStyle.textShadowBlur = textStyleModel.getShallow('textShadowBlur') || globalTextStyle.textShadowBlur;\n  textStyle.textShadowOffsetX = textStyleModel.getShallow('textShadowOffsetX') || globalTextStyle.textShadowOffsetX;\n  textStyle.textShadowOffsetY = textStyleModel.getShallow('textShadowOffsetY') || globalTextStyle.textShadowOffsetY;\n}\n\nfunction getAutoColor(color, opt) {\n  return color !== 'auto' ? color : opt && opt.autoColor ? opt.autoColor : null;\n}\n\nfunction applyInsideStyle(textStyle, textPosition, opt) {\n  var useInsideStyle = opt.useInsideStyle;\n  var insideRollback;\n\n  if (textStyle.textFill == null && useInsideStyle !== false && (useInsideStyle === true || opt.isRectText && textPosition // textPosition can be [10, 30]\n  && typeof textPosition === 'string' && textPosition.indexOf('inside') >= 0)) {\n    insideRollback = {\n      textFill: null,\n      textStroke: textStyle.textStroke,\n      textStrokeWidth: textStyle.textStrokeWidth\n    };\n    textStyle.textFill = '#fff'; // Consider text with #fff overflow its container.\n\n    if (textStyle.textStroke == null) {\n      textStyle.textStroke = opt.autoColor;\n      textStyle.textStrokeWidth == null && (textStyle.textStrokeWidth = 2);\n    }\n  }\n\n  return insideRollback;\n}\n\nfunction rollbackInsideStyle(style) {\n  var insideRollback = style.insideRollback;\n\n  if (insideRollback) {\n    style.textFill = insideRollback.textFill;\n    style.textStroke = insideRollback.textStroke;\n    style.textStrokeWidth = insideRollback.textStrokeWidth;\n  }\n}\n\nfunction getFont(opt, ecModel) {\n  // ecModel or default text style model.\n  var gTextStyleModel = ecModel || ecModel.getModel('textStyle');\n  return [// FIXME in node-canvas fontWeight is before fontStyle\n  opt.fontStyle || gTextStyleModel && gTextStyleModel.getShallow('fontStyle') || '', opt.fontWeight || gTextStyleModel && gTextStyleModel.getShallow('fontWeight') || '', (opt.fontSize || gTextStyleModel && gTextStyleModel.getShallow('fontSize') || 12) + 'px', opt.fontFamily || gTextStyleModel && gTextStyleModel.getShallow('fontFamily') || 'sans-serif'].join(' ');\n}\n\nfunction animateOrSetProps(isUpdate, el, props, animatableModel, dataIndex, cb) {\n  if (typeof dataIndex === 'function') {\n    cb = dataIndex;\n    dataIndex = null;\n  } // Do not check 'animation' property directly here. Consider this case:\n  // animation model is an `itemModel`, whose does not have `isAnimationEnabled`\n  // but its parent model (`seriesModel`) does.\n\n\n  var animationEnabled = animatableModel && animatableModel.isAnimationEnabled();\n\n  if (animationEnabled) {\n    var postfix = isUpdate ? 'Update' : '';\n    var duration = animatableModel.getShallow('animationDuration' + postfix);\n    var animationEasing = animatableModel.getShallow('animationEasing' + postfix);\n    var animationDelay = animatableModel.getShallow('animationDelay' + postfix);\n\n    if (typeof animationDelay === 'function') {\n      animationDelay = animationDelay(dataIndex, animatableModel.getAnimationDelayParams ? animatableModel.getAnimationDelayParams(el, dataIndex) : null);\n    }\n\n    if (typeof duration === 'function') {\n      duration = duration(dataIndex);\n    }\n\n    duration > 0 ? el.animateTo(props, duration, animationDelay || 0, animationEasing, cb, !!cb) : (el.stopAnimation(), el.attr(props), cb && cb());\n  } else {\n    el.stopAnimation();\n    el.attr(props);\n    cb && cb();\n  }\n}\n/**\n * Update graphic element properties with or without animation according to the\n * configuration in series.\n *\n * Caution: this method will stop previous animation.\n * So if do not use this method to one element twice before\n * animation starts, unless you know what you are doing.\n *\n * @param {module:zrender/Element} el\n * @param {Object} props\n * @param {module:echarts/model/Model} [animatableModel]\n * @param {number} [dataIndex]\n * @param {Function} [cb]\n * @example\n *     graphic.updateProps(el, {\n *         position: [100, 100]\n *     }, seriesModel, dataIndex, function () { console.log('Animation done!'); });\n *     // Or\n *     graphic.updateProps(el, {\n *         position: [100, 100]\n *     }, seriesModel, function () { console.log('Animation done!'); });\n */\n\n\nfunction updateProps(el, props, animatableModel, dataIndex, cb) {\n  animateOrSetProps(true, el, props, animatableModel, dataIndex, cb);\n}\n/**\n * Init graphic element properties with or without animation according to the\n * configuration in series.\n *\n * Caution: this method will stop previous animation.\n * So if do not use this method to one element twice before\n * animation starts, unless you know what you are doing.\n *\n * @param {module:zrender/Element} el\n * @param {Object} props\n * @param {module:echarts/model/Model} [animatableModel]\n * @param {number} [dataIndex]\n * @param {Function} cb\n */\n\n\nfunction initProps(el, props, animatableModel, dataIndex, cb) {\n  animateOrSetProps(false, el, props, animatableModel, dataIndex, cb);\n}\n/**\n * Get transform matrix of target (param target),\n * in coordinate of its ancestor (param ancestor)\n *\n * @param {module:zrender/mixin/Transformable} target\n * @param {module:zrender/mixin/Transformable} [ancestor]\n */\n\n\nfunction getTransform(target, ancestor) {\n  var mat = matrix.identity([]);\n\n  while (target && target !== ancestor) {\n    matrix.mul(mat, target.getLocalTransform(), mat);\n    target = target.parent;\n  }\n\n  return mat;\n}\n/**\n * Apply transform to an vertex.\n * @param {Array.<number>} target [x, y]\n * @param {Array.<number>|TypedArray.<number>|Object} transform Can be:\n *      + Transform matrix: like [1, 0, 0, 1, 0, 0]\n *      + {position, rotation, scale}, the same as `zrender/Transformable`.\n * @param {boolean=} invert Whether use invert matrix.\n * @return {Array.<number>} [x, y]\n */\n\n\nfunction applyTransform(target, transform, invert) {\n  if (transform && !zrUtil.isArrayLike(transform)) {\n    transform = Transformable.getLocalTransform(transform);\n  }\n\n  if (invert) {\n    transform = matrix.invert([], transform);\n  }\n\n  return vector.applyTransform([], target, transform);\n}\n/**\n * @param {string} direction 'left' 'right' 'top' 'bottom'\n * @param {Array.<number>} transform Transform matrix: like [1, 0, 0, 1, 0, 0]\n * @param {boolean=} invert Whether use invert matrix.\n * @return {string} Transformed direction. 'left' 'right' 'top' 'bottom'\n */\n\n\nfunction transformDirection(direction, transform, invert) {\n  // Pick a base, ensure that transform result will not be (0, 0).\n  var hBase = transform[4] === 0 || transform[5] === 0 || transform[0] === 0 ? 1 : Math.abs(2 * transform[4] / transform[0]);\n  var vBase = transform[4] === 0 || transform[5] === 0 || transform[2] === 0 ? 1 : Math.abs(2 * transform[4] / transform[2]);\n  var vertex = [direction === 'left' ? -hBase : direction === 'right' ? hBase : 0, direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0];\n  vertex = applyTransform(vertex, transform, invert);\n  return Math.abs(vertex[0]) > Math.abs(vertex[1]) ? vertex[0] > 0 ? 'right' : 'left' : vertex[1] > 0 ? 'bottom' : 'top';\n}\n/**\n * Apply group transition animation from g1 to g2.\n * If no animatableModel, no animation.\n */\n\n\nfunction groupTransition(g1, g2, animatableModel, cb) {\n  if (!g1 || !g2) {\n    return;\n  }\n\n  function getElMap(g) {\n    var elMap = {};\n    g.traverse(function (el) {\n      if (!el.isGroup && el.anid) {\n        elMap[el.anid] = el;\n      }\n    });\n    return elMap;\n  }\n\n  function getAnimatableProps(el) {\n    var obj = {\n      position: vector.clone(el.position),\n      rotation: el.rotation\n    };\n\n    if (el.shape) {\n      obj.shape = zrUtil.extend({}, el.shape);\n    }\n\n    return obj;\n  }\n\n  var elMap1 = getElMap(g1);\n  g2.traverse(function (el) {\n    if (!el.isGroup && el.anid) {\n      var oldEl = elMap1[el.anid];\n\n      if (oldEl) {\n        var newProp = getAnimatableProps(el);\n        el.attr(getAnimatableProps(oldEl));\n        updateProps(el, newProp, animatableModel, el.dataIndex);\n      } // else {\n      //     if (el.previousProps) {\n      //         graphic.updateProps\n      //     }\n      // }\n\n    }\n  });\n}\n/**\n * @param {Array.<Array.<number>>} points Like: [[23, 44], [53, 66], ...]\n * @param {Object} rect {x, y, width, height}\n * @return {Array.<Array.<number>>} A new clipped points.\n */\n\n\nfunction clipPointsByRect(points, rect) {\n  return zrUtil.map(points, function (point) {\n    var x = point[0];\n    x = mathMax(x, rect.x);\n    x = mathMin(x, rect.x + rect.width);\n    var y = point[1];\n    y = mathMax(y, rect.y);\n    y = mathMin(y, rect.y + rect.height);\n    return [x, y];\n  });\n}\n/**\n * @param {Object} targetRect {x, y, width, height}\n * @param {Object} rect {x, y, width, height}\n * @return {Object} A new clipped rect. If rect size are negative, return undefined.\n */\n\n\nfunction clipRectByRect(targetRect, rect) {\n  var x = mathMax(targetRect.x, rect.x);\n  var x2 = mathMin(targetRect.x + targetRect.width, rect.x + rect.width);\n  var y = mathMax(targetRect.y, rect.y);\n  var y2 = mathMin(targetRect.y + targetRect.height, rect.y + rect.height);\n\n  if (x2 >= x && y2 >= y) {\n    return {\n      x: x,\n      y: y,\n      width: x2 - x,\n      height: y2 - y\n    };\n  }\n}\n/**\n * @param {string} iconStr Support 'image://' or 'path://' or direct svg path.\n * @param {Object} [opt] Properties of `module:zrender/Element`, except `style`.\n * @param {Object} [rect] {x, y, width, height}\n * @return {module:zrender/Element} Icon path or image element.\n */\n\n\nfunction createIcon(iconStr, opt, rect) {\n  opt = zrUtil.extend({\n    rectHover: true\n  }, opt);\n  var style = opt.style = {\n    strokeNoScale: true\n  };\n  rect = rect || {\n    x: -1,\n    y: -1,\n    width: 2,\n    height: 2\n  };\n\n  if (iconStr) {\n    return iconStr.indexOf('image://') === 0 ? (style.image = iconStr.slice(8), zrUtil.defaults(style, rect), new Image(opt)) : makePath(iconStr.replace('path://', ''), opt, rect, 'center');\n  }\n}\n\nexports.extendShape = extendShape;\nexports.extendPath = extendPath;\nexports.makePath = makePath;\nexports.makeImage = makeImage;\nexports.mergePath = mergePath;\nexports.resizePath = resizePath;\nexports.subPixelOptimizeLine = subPixelOptimizeLine;\nexports.subPixelOptimizeRect = subPixelOptimizeRect;\nexports.subPixelOptimize = subPixelOptimize;\nexports.setHoverStyle = setHoverStyle;\nexports.setLabelStyle = setLabelStyle;\nexports.setTextStyle = setTextStyle;\nexports.setText = setText;\nexports.getFont = getFont;\nexports.updateProps = updateProps;\nexports.initProps = initProps;\nexports.getTransform = getTransform;\nexports.applyTransform = applyTransform;\nexports.transformDirection = transformDirection;\nexports.groupTransition = groupTransition;\nexports.clipPointsByRect = clipPointsByRect;\nexports.clipRectByRect = clipRectByRect;\nexports.createIcon = createIcon;\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Path = __webpack_require__(1);\n\nvar PathProxy = __webpack_require__(6);\n\nvar transformPath = __webpack_require__(57);\n\n// command chars\nvar cc = ['m', 'M', 'l', 'L', 'v', 'V', 'h', 'H', 'z', 'Z', 'c', 'C', 'q', 'Q', 't', 'T', 's', 'S', 'a', 'A'];\nvar mathSqrt = Math.sqrt;\nvar mathSin = Math.sin;\nvar mathCos = Math.cos;\nvar PI = Math.PI;\n\nvar vMag = function (v) {\n  return Math.sqrt(v[0] * v[0] + v[1] * v[1]);\n};\n\nvar vRatio = function (u, v) {\n  return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v));\n};\n\nvar vAngle = function (u, v) {\n  return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(vRatio(u, v));\n};\n\nfunction processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) {\n  var psi = psiDeg * (PI / 180.0);\n  var xp = mathCos(psi) * (x1 - x2) / 2.0 + mathSin(psi) * (y1 - y2) / 2.0;\n  var yp = -1 * mathSin(psi) * (x1 - x2) / 2.0 + mathCos(psi) * (y1 - y2) / 2.0;\n  var lambda = xp * xp / (rx * rx) + yp * yp / (ry * ry);\n\n  if (lambda > 1) {\n    rx *= mathSqrt(lambda);\n    ry *= mathSqrt(lambda);\n  }\n\n  var f = (fa === fs ? -1 : 1) * mathSqrt((rx * rx * (ry * ry) - rx * rx * (yp * yp) - ry * ry * (xp * xp)) / (rx * rx * (yp * yp) + ry * ry * (xp * xp))) || 0;\n  var cxp = f * rx * yp / ry;\n  var cyp = f * -ry * xp / rx;\n  var cx = (x1 + x2) / 2.0 + mathCos(psi) * cxp - mathSin(psi) * cyp;\n  var cy = (y1 + y2) / 2.0 + mathSin(psi) * cxp + mathCos(psi) * cyp;\n  var theta = vAngle([1, 0], [(xp - cxp) / rx, (yp - cyp) / ry]);\n  var u = [(xp - cxp) / rx, (yp - cyp) / ry];\n  var v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry];\n  var dTheta = vAngle(u, v);\n\n  if (vRatio(u, v) <= -1) {\n    dTheta = PI;\n  }\n\n  if (vRatio(u, v) >= 1) {\n    dTheta = 0;\n  }\n\n  if (fs === 0 && dTheta > 0) {\n    dTheta = dTheta - 2 * PI;\n  }\n\n  if (fs === 1 && dTheta < 0) {\n    dTheta = dTheta + 2 * PI;\n  }\n\n  path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs);\n}\n\nfunction createPathProxyFromString(data) {\n  if (!data) {\n    return [];\n  } // command string\n\n\n  var cs = data.replace(/-/g, ' -').replace(/  /g, ' ').replace(/ /g, ',').replace(/,,/g, ',');\n  var n; // create pipes so that we can split the data\n\n  for (n = 0; n < cc.length; n++) {\n    cs = cs.replace(new RegExp(cc[n], 'g'), '|' + cc[n]);\n  } // create array\n\n\n  var arr = cs.split('|'); // init context point\n\n  var cpx = 0;\n  var cpy = 0;\n  var path = new PathProxy();\n  var CMD = PathProxy.CMD;\n  var prevCmd;\n\n  for (n = 1; n < arr.length; n++) {\n    var str = arr[n];\n    var c = str.charAt(0);\n    var off = 0;\n    var p = str.slice(1).replace(/e,-/g, 'e-').split(',');\n    var cmd;\n\n    if (p.length > 0 && p[0] === '') {\n      p.shift();\n    }\n\n    for (var i = 0; i < p.length; i++) {\n      p[i] = parseFloat(p[i]);\n    }\n\n    while (off < p.length && !isNaN(p[off])) {\n      if (isNaN(p[0])) {\n        break;\n      }\n\n      var ctlPtx;\n      var ctlPty;\n      var rx;\n      var ry;\n      var psi;\n      var fa;\n      var fs;\n      var x1 = cpx;\n      var y1 = cpy; // convert l, H, h, V, and v to L\n\n      switch (c) {\n        case 'l':\n          cpx += p[off++];\n          cpy += p[off++];\n          cmd = CMD.L;\n          path.addData(cmd, cpx, cpy);\n          break;\n\n        case 'L':\n          cpx = p[off++];\n          cpy = p[off++];\n          cmd = CMD.L;\n          path.addData(cmd, cpx, cpy);\n          break;\n\n        case 'm':\n          cpx += p[off++];\n          cpy += p[off++];\n          cmd = CMD.M;\n          path.addData(cmd, cpx, cpy);\n          c = 'l';\n          break;\n\n        case 'M':\n          cpx = p[off++];\n          cpy = p[off++];\n          cmd = CMD.M;\n          path.addData(cmd, cpx, cpy);\n          c = 'L';\n          break;\n\n        case 'h':\n          cpx += p[off++];\n          cmd = CMD.L;\n          path.addData(cmd, cpx, cpy);\n          break;\n\n        case 'H':\n          cpx = p[off++];\n          cmd = CMD.L;\n          path.addData(cmd, cpx, cpy);\n          break;\n\n        case 'v':\n          cpy += p[off++];\n          cmd = CMD.L;\n          path.addData(cmd, cpx, cpy);\n          break;\n\n        case 'V':\n          cpy = p[off++];\n          cmd = CMD.L;\n          path.addData(cmd, cpx, cpy);\n          break;\n\n        case 'C':\n          cmd = CMD.C;\n          path.addData(cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++]);\n          cpx = p[off - 2];\n          cpy = p[off - 1];\n          break;\n\n        case 'c':\n          cmd = CMD.C;\n          path.addData(cmd, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy);\n          cpx += p[off - 2];\n          cpy += p[off - 1];\n          break;\n\n        case 'S':\n          ctlPtx = cpx;\n          ctlPty = cpy;\n          var len = path.len();\n          var pathData = path.data;\n\n          if (prevCmd === CMD.C) {\n            ctlPtx += cpx - pathData[len - 4];\n            ctlPty += cpy - pathData[len - 3];\n          }\n\n          cmd = CMD.C;\n          x1 = p[off++];\n          y1 = p[off++];\n          cpx = p[off++];\n          cpy = p[off++];\n          path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);\n          break;\n\n        case 's':\n          ctlPtx = cpx;\n          ctlPty = cpy;\n          var len = path.len();\n          var pathData = path.data;\n\n          if (prevCmd === CMD.C) {\n            ctlPtx += cpx - pathData[len - 4];\n            ctlPty += cpy - pathData[len - 3];\n          }\n\n          cmd = CMD.C;\n          x1 = cpx + p[off++];\n          y1 = cpy + p[off++];\n          cpx += p[off++];\n          cpy += p[off++];\n          path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);\n          break;\n\n        case 'Q':\n          x1 = p[off++];\n          y1 = p[off++];\n          cpx = p[off++];\n          cpy = p[off++];\n          cmd = CMD.Q;\n          path.addData(cmd, x1, y1, cpx, cpy);\n          break;\n\n        case 'q':\n          x1 = p[off++] + cpx;\n          y1 = p[off++] + cpy;\n          cpx += p[off++];\n          cpy += p[off++];\n          cmd = CMD.Q;\n          path.addData(cmd, x1, y1, cpx, cpy);\n          break;\n\n        case 'T':\n          ctlPtx = cpx;\n          ctlPty = cpy;\n          var len = path.len();\n          var pathData = path.data;\n\n          if (prevCmd === CMD.Q) {\n            ctlPtx += cpx - pathData[len - 4];\n            ctlPty += cpy - pathData[len - 3];\n          }\n\n          cpx = p[off++];\n          cpy = p[off++];\n          cmd = CMD.Q;\n          path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);\n          break;\n\n        case 't':\n          ctlPtx = cpx;\n          ctlPty = cpy;\n          var len = path.len();\n          var pathData = path.data;\n\n          if (prevCmd === CMD.Q) {\n            ctlPtx += cpx - pathData[len - 4];\n            ctlPty += cpy - pathData[len - 3];\n          }\n\n          cpx += p[off++];\n          cpy += p[off++];\n          cmd = CMD.Q;\n          path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);\n          break;\n\n        case 'A':\n          rx = p[off++];\n          ry = p[off++];\n          psi = p[off++];\n          fa = p[off++];\n          fs = p[off++];\n          x1 = cpx, y1 = cpy;\n          cpx = p[off++];\n          cpy = p[off++];\n          cmd = CMD.A;\n          processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path);\n          break;\n\n        case 'a':\n          rx = p[off++];\n          ry = p[off++];\n          psi = p[off++];\n          fa = p[off++];\n          fs = p[off++];\n          x1 = cpx, y1 = cpy;\n          cpx += p[off++];\n          cpy += p[off++];\n          cmd = CMD.A;\n          processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path);\n          break;\n      }\n    }\n\n    if (c === 'z' || c === 'Z') {\n      cmd = CMD.Z;\n      path.addData(cmd);\n    }\n\n    prevCmd = cmd;\n  }\n\n  path.toStatic();\n  return path;\n} // TODO Optimize double memory cost problem\n\n\nfunction createPathOptions(str, opts) {\n  var pathProxy = createPathProxyFromString(str);\n  opts = opts || {};\n\n  opts.buildPath = function (path) {\n    if (path.setData) {\n      path.setData(pathProxy.data); // Svg and vml renderer don't have context\n\n      var ctx = path.getContext();\n\n      if (ctx) {\n        path.rebuildPath(ctx);\n      }\n    } else {\n      var ctx = path;\n      pathProxy.rebuildPath(ctx);\n    }\n  };\n\n  opts.applyTransform = function (m) {\n    transformPath(pathProxy, m);\n    this.dirty(true);\n  };\n\n  return opts;\n}\n/**\n * Create a Path object from path string data\n * http://www.w3.org/TR/SVG/paths.html#PathData\n * @param  {Object} opts Other options\n */\n\n\nfunction createFromString(str, opts) {\n  return new Path(createPathOptions(str, opts));\n}\n/**\n * Create a Path class from path string data\n * @param  {string} str\n * @param  {Object} opts Other options\n */\n\n\nfunction extendFromString(str, opts) {\n  return Path.extend(createPathOptions(str, opts));\n}\n/**\n * Merge multiple paths\n */\n// TODO Apply transform\n// TODO stroke dash\n// TODO Optimize double memory cost problem\n\n\nfunction mergePath(pathEls, opts) {\n  var pathList = [];\n  var len = pathEls.length;\n\n  for (var i = 0; i < len; i++) {\n    var pathEl = pathEls[i];\n\n    if (!pathEl.path) {\n      pathEl.createPathProxy();\n    }\n\n    if (pathEl.__dirtyPath) {\n      pathEl.buildPath(pathEl.path, pathEl.shape, true);\n    }\n\n    pathList.push(pathEl.path);\n  }\n\n  var pathBundle = new Path(opts); // Need path proxy.\n\n  pathBundle.createPathProxy();\n\n  pathBundle.buildPath = function (path) {\n    path.appendPath(pathList); // Svg and vml renderer don't have context\n\n    var ctx = path.getContext();\n\n    if (ctx) {\n      path.rebuildPath(ctx);\n    }\n  };\n\n  return pathBundle;\n}\n\nexports.createFromString = createFromString;\nexports.extendFromString = extendFromString;\nexports.mergePath = mergePath;\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports) {\n\nvar STYLE_COMMON_PROPS = [['shadowBlur', 0], ['shadowOffsetX', 0], ['shadowOffsetY', 0], ['shadowColor', '#000'], ['lineCap', 'butt'], ['lineJoin', 'miter'], ['miterLimit', 10]]; // var SHADOW_PROPS = STYLE_COMMON_PROPS.slice(0, 4);\n// var LINE_PROPS = STYLE_COMMON_PROPS.slice(4);\n\nvar Style = function (opts, host) {\n  this.extendFrom(opts, false);\n  this.host = host;\n};\n\nfunction createLinearGradient(ctx, obj, rect) {\n  var x = obj.x == null ? 0 : obj.x;\n  var x2 = obj.x2 == null ? 1 : obj.x2;\n  var y = obj.y == null ? 0 : obj.y;\n  var y2 = obj.y2 == null ? 0 : obj.y2;\n\n  if (!obj.global) {\n    x = x * rect.width + rect.x;\n    x2 = x2 * rect.width + rect.x;\n    y = y * rect.height + rect.y;\n    y2 = y2 * rect.height + rect.y;\n  }\n\n  var canvasGradient = ctx.createLinearGradient(x, y, x2, y2);\n  return canvasGradient;\n}\n\nfunction createRadialGradient(ctx, obj, rect) {\n  var width = rect.width;\n  var height = rect.height;\n  var min = Math.min(width, height);\n  var x = obj.x == null ? 0.5 : obj.x;\n  var y = obj.y == null ? 0.5 : obj.y;\n  var r = obj.r == null ? 0.5 : obj.r;\n\n  if (!obj.global) {\n    x = x * width + rect.x;\n    y = y * height + rect.y;\n    r = r * min;\n  }\n\n  var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r);\n  return canvasGradient;\n}\n\nStyle.prototype = {\n  constructor: Style,\n\n  /**\n   * @type {module:zrender/graphic/Displayable}\n   */\n  host: null,\n\n  /**\n   * @type {string}\n   */\n  fill: '#000',\n\n  /**\n   * @type {string}\n   */\n  stroke: null,\n\n  /**\n   * @type {number}\n   */\n  opacity: 1,\n\n  /**\n   * @type {Array.<number>}\n   */\n  lineDash: null,\n\n  /**\n   * @type {number}\n   */\n  lineDashOffset: 0,\n\n  /**\n   * @type {number}\n   */\n  shadowBlur: 0,\n\n  /**\n   * @type {number}\n   */\n  shadowOffsetX: 0,\n\n  /**\n   * @type {number}\n   */\n  shadowOffsetY: 0,\n\n  /**\n   * @type {number}\n   */\n  lineWidth: 1,\n\n  /**\n   * If stroke ignore scale\n   * @type {Boolean}\n   */\n  strokeNoScale: false,\n  // Bounding rect text configuration\n  // Not affected by element transform\n\n  /**\n   * @type {string}\n   */\n  text: null,\n\n  /**\n   * If `fontSize` or `fontFamily` exists, `font` will be reset by\n   * `fontSize`, `fontStyle`, `fontWeight`, `fontFamily`.\n   * So do not visit it directly in upper application (like echarts),\n   * but use `contain/text#makeFont` instead.\n   * @type {string}\n   */\n  font: null,\n\n  /**\n   * The same as font. Use font please.\n   * @deprecated\n   * @type {string}\n   */\n  textFont: null,\n\n  /**\n   * It helps merging respectively, rather than parsing an entire font string.\n   * @type {string}\n   */\n  fontStyle: null,\n\n  /**\n   * It helps merging respectively, rather than parsing an entire font string.\n   * @type {string}\n   */\n  fontWeight: null,\n\n  /**\n   * It helps merging respectively, rather than parsing an entire font string.\n   * Should be 12 but not '12px'.\n   * @type {number}\n   */\n  fontSize: null,\n\n  /**\n   * It helps merging respectively, rather than parsing an entire font string.\n   * @type {string}\n   */\n  fontFamily: null,\n\n  /**\n   * Reserved for special functinality, like 'hr'.\n   * @type {string}\n   */\n  textTag: null,\n\n  /**\n   * @type {string}\n   */\n  textFill: '#000',\n\n  /**\n   * @type {string}\n   */\n  textStroke: null,\n\n  /**\n   * @type {number}\n   */\n  textWidth: null,\n\n  /**\n   * Only for textBackground.\n   * @type {number}\n   */\n  textHeight: null,\n\n  /**\n   * textStroke may be set as some color as a default\n   * value in upper applicaion, where the default value\n   * of textStrokeWidth should be 0 to make sure that\n   * user can choose to do not use text stroke.\n   * @type {number}\n   */\n  textStrokeWidth: 0,\n\n  /**\n   * @type {number}\n   */\n  textLineHeight: null,\n\n  /**\n   * 'inside', 'left', 'right', 'top', 'bottom'\n   * [x, y]\n   * Based on x, y of rect.\n   * @type {string|Array.<number>}\n   * @default 'inside'\n   */\n  textPosition: 'inside',\n\n  /**\n   * If not specified, use the boundingRect of a `displayable`.\n   * @type {Object}\n   */\n  textRect: null,\n\n  /**\n   * [x, y]\n   * @type {Array.<number>}\n   */\n  textOffset: null,\n\n  /**\n   * @type {string}\n   */\n  textAlign: null,\n\n  /**\n   * @type {string}\n   */\n  textVerticalAlign: null,\n\n  /**\n   * @type {number}\n   */\n  textDistance: 5,\n\n  /**\n   * @type {string}\n   */\n  textShadowColor: 'transparent',\n\n  /**\n   * @type {number}\n   */\n  textShadowBlur: 0,\n\n  /**\n   * @type {number}\n   */\n  textShadowOffsetX: 0,\n\n  /**\n   * @type {number}\n   */\n  textShadowOffsetY: 0,\n\n  /**\n   * @type {string}\n   */\n  textBoxShadowColor: 'transparent',\n\n  /**\n   * @type {number}\n   */\n  textBoxShadowBlur: 0,\n\n  /**\n   * @type {number}\n   */\n  textBoxShadowOffsetX: 0,\n\n  /**\n   * @type {number}\n   */\n  textBoxShadowOffsetY: 0,\n\n  /**\n   * Whether transform text.\n   * Only useful in Path and Image element\n   * @type {boolean}\n   */\n  transformText: false,\n\n  /**\n   * Text rotate around position of Path or Image\n   * Only useful in Path and Image element and transformText is false.\n   */\n  textRotation: 0,\n\n  /**\n   * Text origin of text rotation, like [10, 40].\n   * Based on x, y of rect.\n   * Useful in label rotation of circular symbol.\n   * By default, this origin is textPosition.\n   * Can be 'center'.\n   * @type {string|Array.<number>}\n   */\n  textOrigin: null,\n\n  /**\n   * @type {string}\n   */\n  textBackgroundColor: null,\n\n  /**\n   * @type {string}\n   */\n  textBorderColor: null,\n\n  /**\n   * @type {number}\n   */\n  textBorderWidth: 0,\n\n  /**\n   * @type {number}\n   */\n  textBorderRadius: 0,\n\n  /**\n   * Can be `2` or `[2, 4]` or `[2, 3, 4, 5]`\n   * @type {number|Array.<number>}\n   */\n  textPadding: null,\n\n  /**\n   * Text styles for rich text.\n   * @type {Object}\n   */\n  rich: null,\n\n  /**\n   * {outerWidth, outerHeight, ellipsis, placeholder}\n   * @type {Object}\n   */\n  truncate: null,\n\n  /**\n   * https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\n   * @type {string}\n   */\n  blend: null,\n\n  /**\n   * @param {CanvasRenderingContext2D} ctx\n   */\n  bind: function (ctx, el, prevEl) {\n    var style = this;\n    var prevStyle = prevEl && prevEl.style;\n    var firstDraw = !prevStyle;\n\n    for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {\n      var prop = STYLE_COMMON_PROPS[i];\n      var styleName = prop[0];\n\n      if (firstDraw || style[styleName] !== prevStyle[styleName]) {\n        // FIXME Invalid property value will cause style leak from previous element.\n        ctx[styleName] = style[styleName] || prop[1];\n      }\n    }\n\n    if (firstDraw || style.fill !== prevStyle.fill) {\n      ctx.fillStyle = style.fill;\n    }\n\n    if (firstDraw || style.stroke !== prevStyle.stroke) {\n      ctx.strokeStyle = style.stroke;\n    }\n\n    if (firstDraw || style.opacity !== prevStyle.opacity) {\n      ctx.globalAlpha = style.opacity == null ? 1 : style.opacity;\n    }\n\n    if (firstDraw || style.blend !== prevStyle.blend) {\n      ctx.globalCompositeOperation = style.blend || 'source-over';\n    }\n\n    if (this.hasStroke()) {\n      var lineWidth = style.lineWidth;\n      ctx.lineWidth = lineWidth / (this.strokeNoScale && el && el.getLineScale ? el.getLineScale() : 1);\n    }\n  },\n  hasFill: function () {\n    var fill = this.fill;\n    return fill != null && fill !== 'none';\n  },\n  hasStroke: function () {\n    var stroke = this.stroke;\n    return stroke != null && stroke !== 'none' && this.lineWidth > 0;\n  },\n\n  /**\n   * Extend from other style\n   * @param {zrender/graphic/Style} otherStyle\n   * @param {boolean} overwrite true: overwrirte any way.\n   *                            false: overwrite only when !target.hasOwnProperty\n   *                            others: overwrite when property is not null/undefined.\n   */\n  extendFrom: function (otherStyle, overwrite) {\n    if (otherStyle) {\n      for (var name in otherStyle) {\n        if (otherStyle.hasOwnProperty(name) && (overwrite === true || (overwrite === false ? !this.hasOwnProperty(name) : otherStyle[name] != null))) {\n          this[name] = otherStyle[name];\n        }\n      }\n    }\n  },\n\n  /**\n   * Batch setting style with a given object\n   * @param {Object|string} obj\n   * @param {*} [obj]\n   */\n  set: function (obj, value) {\n    if (typeof obj === 'string') {\n      this[obj] = value;\n    } else {\n      this.extendFrom(obj, true);\n    }\n  },\n\n  /**\n   * Clone\n   * @return {zrender/graphic/Style} [description]\n   */\n  clone: function () {\n    var newStyle = new this.constructor();\n    newStyle.extendFrom(this, true);\n    return newStyle;\n  },\n  getGradient: function (ctx, obj, rect) {\n    var method = obj.type === 'radial' ? createRadialGradient : createLinearGradient;\n    var canvasGradient = method(ctx, obj, rect);\n    var colorStops = obj.colorStops;\n\n    for (var i = 0; i < colorStops.length; i++) {\n      canvasGradient.addColorStop(colorStops[i].offset, colorStops[i].color);\n    }\n\n    return canvasGradient;\n  }\n};\nvar styleProto = Style.prototype;\n\nfor (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {\n  var prop = STYLE_COMMON_PROPS[i];\n\n  if (!(prop[0] in styleProto)) {\n    styleProto[prop[0]] = prop[1];\n  }\n} // Provide for others\n\n\nStyle.getGradient = styleProto.getGradient;\nvar _default = Style;\nmodule.exports = _default;\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports) {\n\n/**\n * zrender: 生成唯一id\n *\n * @author errorrik (errorrik@gmail.com)\n */\nvar idStart = 0x0907;\n\nfunction _default() {\n  return idStart++;\n}\n\nmodule.exports = _default;\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports) {\n\n/**\n * 事件扩展\n * @module zrender/mixin/Eventful\n * @author Kener (@Kener-林峰, kener.linfeng@gmail.com)\n *         pissang (https://www.github.com/pissang)\n */\nvar arrySlice = Array.prototype.slice;\n/**\n * 事件分发器\n * @alias module:zrender/mixin/Eventful\n * @constructor\n */\n\nvar Eventful = function () {\n  this._$handlers = {};\n};\n\nEventful.prototype = {\n  constructor: Eventful,\n\n  /**\n   * 单次触发绑定，trigger后销毁\n   *\n   * @param {string} event 事件名\n   * @param {Function} handler 响应函数\n   * @param {Object} context\n   */\n  one: function (event, handler, context) {\n    var _h = this._$handlers;\n\n    if (!handler || !event) {\n      return this;\n    }\n\n    if (!_h[event]) {\n      _h[event] = [];\n    }\n\n    for (var i = 0; i < _h[event].length; i++) {\n      if (_h[event][i].h === handler) {\n        return this;\n      }\n    }\n\n    _h[event].push({\n      h: handler,\n      one: true,\n      ctx: context || this\n    });\n\n    return this;\n  },\n\n  /**\n   * 绑定事件\n   * @param {string} event 事件名\n   * @param {Function} handler 事件处理函数\n   * @param {Object} [context]\n   */\n  on: function (event, handler, context) {\n    var _h = this._$handlers;\n\n    if (!handler || !event) {\n      return this;\n    }\n\n    if (!_h[event]) {\n      _h[event] = [];\n    }\n\n    for (var i = 0; i < _h[event].length; i++) {\n      if (_h[event][i].h === handler) {\n        return this;\n      }\n    }\n\n    _h[event].push({\n      h: handler,\n      one: false,\n      ctx: context || this\n    });\n\n    return this;\n  },\n\n  /**\n   * 是否绑定了事件\n   * @param  {string}  event\n   * @return {boolean}\n   */\n  isSilent: function (event) {\n    var _h = this._$handlers;\n    return _h[event] && _h[event].length;\n  },\n\n  /**\n   * 解绑事件\n   * @param {string} event 事件名\n   * @param {Function} [handler] 事件处理函数\n   */\n  off: function (event, handler) {\n    var _h = this._$handlers;\n\n    if (!event) {\n      this._$handlers = {};\n      return this;\n    }\n\n    if (handler) {\n      if (_h[event]) {\n        var newList = [];\n\n        for (var i = 0, l = _h[event].length; i < l; i++) {\n          if (_h[event][i]['h'] != handler) {\n            newList.push(_h[event][i]);\n          }\n        }\n\n        _h[event] = newList;\n      }\n\n      if (_h[event] && _h[event].length === 0) {\n        delete _h[event];\n      }\n    } else {\n      delete _h[event];\n    }\n\n    return this;\n  },\n\n  /**\n   * 事件分发\n   *\n   * @param {string} type 事件类型\n   */\n  trigger: function (type) {\n    if (this._$handlers[type]) {\n      var args = arguments;\n      var argLen = args.length;\n\n      if (argLen > 3) {\n        args = arrySlice.call(args, 1);\n      }\n\n      var _h = this._$handlers[type];\n      var len = _h.length;\n\n      for (var i = 0; i < len;) {\n        // Optimize advise from backbone\n        switch (argLen) {\n          case 1:\n            _h[i]['h'].call(_h[i]['ctx']);\n\n            break;\n\n          case 2:\n            _h[i]['h'].call(_h[i]['ctx'], args[1]);\n\n            break;\n\n          case 3:\n            _h[i]['h'].call(_h[i]['ctx'], args[1], args[2]);\n\n            break;\n\n          default:\n            // have more than 2 given arguments\n            _h[i]['h'].apply(_h[i]['ctx'], args);\n\n            break;\n        }\n\n        if (_h[i]['one']) {\n          _h.splice(i, 1);\n\n          len--;\n        } else {\n          i++;\n        }\n      }\n    }\n\n    return this;\n  },\n\n  /**\n   * 带有context的事件分发, 最后一个参数是事件回调的context\n   * @param {string} type 事件类型\n   */\n  triggerWithContext: function (type) {\n    if (this._$handlers[type]) {\n      var args = arguments;\n      var argLen = args.length;\n\n      if (argLen > 4) {\n        args = arrySlice.call(args, 1, args.length - 1);\n      }\n\n      var ctx = args[args.length - 1];\n      var _h = this._$handlers[type];\n      var len = _h.length;\n\n      for (var i = 0; i < len;) {\n        // Optimize advise from backbone\n        switch (argLen) {\n          case 1:\n            _h[i]['h'].call(ctx);\n\n            break;\n\n          case 2:\n            _h[i]['h'].call(ctx, args[1]);\n\n            break;\n\n          case 3:\n            _h[i]['h'].call(ctx, args[1], args[2]);\n\n            break;\n\n          default:\n            // have more than 2 given arguments\n            _h[i]['h'].apply(ctx, args);\n\n            break;\n        }\n\n        if (_h[i]['one']) {\n          _h.splice(i, 1);\n\n          len--;\n        } else {\n          i++;\n        }\n      }\n    }\n\n    return this;\n  }\n}; // 对象可以通过 onxxxx 绑定事件\n\n/**\n * @event module:zrender/mixin/Eventful#onclick\n * @type {Function}\n * @default null\n */\n\n/**\n * @event module:zrender/mixin/Eventful#onmouseover\n * @type {Function}\n * @default null\n */\n\n/**\n * @event module:zrender/mixin/Eventful#onmouseout\n * @type {Function}\n * @default null\n */\n\n/**\n * @event module:zrender/mixin/Eventful#onmousemove\n * @type {Function}\n * @default null\n */\n\n/**\n * @event module:zrender/mixin/Eventful#onmousewheel\n * @type {Function}\n * @default null\n */\n\n/**\n * @event module:zrender/mixin/Eventful#onmousedown\n * @type {Function}\n * @default null\n */\n\n/**\n * @event module:zrender/mixin/Eventful#onmouseup\n * @type {Function}\n * @default null\n */\n\n/**\n * @event module:zrender/mixin/Eventful#ondrag\n * @type {Function}\n * @default null\n */\n\n/**\n * @event module:zrender/mixin/Eventful#ondragstart\n * @type {Function}\n * @default null\n */\n\n/**\n * @event module:zrender/mixin/Eventful#ondragend\n * @type {Function}\n * @default null\n */\n\n/**\n * @event module:zrender/mixin/Eventful#ondragenter\n * @type {Function}\n * @default null\n */\n\n/**\n * @event module:zrender/mixin/Eventful#ondragleave\n * @type {Function}\n * @default null\n */\n\n/**\n * @event module:zrender/mixin/Eventful#ondragover\n * @type {Function}\n * @default null\n */\n\n/**\n * @event module:zrender/mixin/Eventful#ondrop\n * @type {Function}\n * @default null\n */\n\nvar _default = Eventful;\nmodule.exports = _default;\n\n/***/ }),\n/* 43 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Animator = __webpack_require__(44);\n\nvar log = __webpack_require__(47);\n\nvar _util = __webpack_require__(0);\n\nvar isString = _util.isString;\nvar isFunction = _util.isFunction;\nvar isObject = _util.isObject;\nvar isArrayLike = _util.isArrayLike;\nvar indexOf = _util.indexOf;\n\n/**\n * @alias modue:zrender/mixin/Animatable\n * @constructor\n */\nvar Animatable = function () {\n  /**\n   * @type {Array.<module:zrender/animation/Animator>}\n   * @readOnly\n   */\n  this.animators = [];\n};\n\nAnimatable.prototype = {\n  constructor: Animatable,\n\n  /**\n   * 动画\n   *\n   * @param {string} path The path to fetch value from object, like 'a.b.c'.\n   * @param {boolean} [loop] Whether to loop animation.\n   * @return {module:zrender/animation/Animator}\n   * @example:\n   *     el.animate('style', false)\n   *         .when(1000, {x: 10} )\n   *         .done(function(){ // Animation done })\n   *         .start()\n   */\n  animate: function (path, loop) {\n    var target;\n    var animatingShape = false;\n    var el = this;\n    var zr = this.__zr;\n\n    if (path) {\n      var pathSplitted = path.split('.');\n      var prop = el; // If animating shape\n\n      animatingShape = pathSplitted[0] === 'shape';\n\n      for (var i = 0, l = pathSplitted.length; i < l; i++) {\n        if (!prop) {\n          continue;\n        }\n\n        prop = prop[pathSplitted[i]];\n      }\n\n      if (prop) {\n        target = prop;\n      }\n    } else {\n      target = el;\n    }\n\n    if (!target) {\n      log('Property \"' + path + '\" is not existed in element ' + el.id);\n      return;\n    }\n\n    var animators = el.animators;\n    var animator = new Animator(target, loop);\n    animator.during(function (target) {\n      el.dirty(animatingShape);\n    }).done(function () {\n      // FIXME Animator will not be removed if use `Animator#stop` to stop animation\n      animators.splice(indexOf(animators, animator), 1);\n    });\n    animators.push(animator); // If animate after added to the zrender\n\n    if (zr) {\n      zr.animation.addAnimator(animator);\n    }\n\n    return animator;\n  },\n\n  /**\n   * 停止动画\n   * @param {boolean} forwardToLast If move to last frame before stop\n   */\n  stopAnimation: function (forwardToLast) {\n    var animators = this.animators;\n    var len = animators.length;\n\n    for (var i = 0; i < len; i++) {\n      animators[i].stop(forwardToLast);\n    }\n\n    animators.length = 0;\n    return this;\n  },\n\n  /**\n   * Caution: this method will stop previous animation.\n   * So do not use this method to one element twice before\n   * animation starts, unless you know what you are doing.\n   * @param {Object} target\n   * @param {number} [time=500] Time in ms\n   * @param {string} [easing='linear']\n   * @param {number} [delay=0]\n   * @param {Function} [callback]\n   * @param {Function} [forceAnimate] Prevent stop animation and callback\n   *        immediently when target values are the same as current values.\n   *\n   * @example\n   *  // Animate position\n   *  el.animateTo({\n   *      position: [10, 10]\n   *  }, function () { // done })\n   *\n   *  // Animate shape, style and position in 100ms, delayed 100ms, with cubicOut easing\n   *  el.animateTo({\n   *      shape: {\n   *          width: 500\n   *      },\n   *      style: {\n   *          fill: 'red'\n   *      }\n   *      position: [10, 10]\n   *  }, 100, 100, 'cubicOut', function () { // done })\n   */\n  // TODO Return animation key\n  animateTo: function (target, time, delay, easing, callback, forceAnimate) {\n    // animateTo(target, time, easing, callback);\n    if (isString(delay)) {\n      callback = easing;\n      easing = delay;\n      delay = 0;\n    } // animateTo(target, time, delay, callback);\n    else if (isFunction(easing)) {\n        callback = easing;\n        easing = 'linear';\n        delay = 0;\n      } // animateTo(target, time, callback);\n      else if (isFunction(delay)) {\n          callback = delay;\n          delay = 0;\n        } // animateTo(target, callback)\n        else if (isFunction(time)) {\n            callback = time;\n            time = 500;\n          } // animateTo(target)\n          else if (!time) {\n              time = 500;\n            } // Stop all previous animations\n\n\n    this.stopAnimation();\n\n    this._animateToShallow('', this, target, time, delay); // Animators may be removed immediately after start\n    // if there is nothing to animate\n\n\n    var animators = this.animators.slice();\n    var count = animators.length;\n\n    function done() {\n      count--;\n\n      if (!count) {\n        callback && callback();\n      }\n    } // No animators. This should be checked before animators[i].start(),\n    // because 'done' may be executed immediately if no need to animate.\n\n\n    if (!count) {\n      callback && callback();\n    } // Start after all animators created\n    // Incase any animator is done immediately when all animation properties are not changed\n\n\n    for (var i = 0; i < animators.length; i++) {\n      animators[i].done(done).start(easing, forceAnimate);\n    }\n  },\n\n  /**\n   * @private\n   * @param {string} path=''\n   * @param {Object} source=this\n   * @param {Object} target\n   * @param {number} [time=500]\n   * @param {number} [delay=0]\n   *\n   * @example\n   *  // Animate position\n   *  el._animateToShallow({\n   *      position: [10, 10]\n   *  })\n   *\n   *  // Animate shape, style and position in 100ms, delayed 100ms\n   *  el._animateToShallow({\n   *      shape: {\n   *          width: 500\n   *      },\n   *      style: {\n   *          fill: 'red'\n   *      }\n   *      position: [10, 10]\n   *  }, 100, 100)\n   */\n  _animateToShallow: function (path, source, target, time, delay) {\n    var objShallow = {};\n    var propertyCount = 0;\n\n    for (var name in target) {\n      if (!target.hasOwnProperty(name)) {\n        continue;\n      }\n\n      if (source[name] != null) {\n        if (isObject(target[name]) && !isArrayLike(target[name])) {\n          this._animateToShallow(path ? path + '.' + name : name, source[name], target[name], time, delay);\n        } else {\n          objShallow[name] = target[name];\n          propertyCount++;\n        }\n      } else if (target[name] != null) {\n        // Attr directly if not has property\n        // FIXME, if some property not needed for element ?\n        if (!path) {\n          this.attr(name, target[name]);\n        } else {\n          // Shape or style\n          var props = {};\n          props[path] = {};\n          props[path][name] = target[name];\n          this.attr(props);\n        }\n      }\n    }\n\n    if (propertyCount > 0) {\n      this.animate(path, false).when(time == null ? 500 : time, objShallow).delay(delay || 0);\n    }\n\n    return this;\n  }\n};\nvar _default = Animatable;\nmodule.exports = _default;\n\n/***/ }),\n/* 44 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Clip = __webpack_require__(45);\n\nvar color = __webpack_require__(18);\n\nvar _util = __webpack_require__(0);\n\nvar isArrayLike = _util.isArrayLike;\n\n/**\n * @module echarts/animation/Animator\n */\nvar arraySlice = Array.prototype.slice;\n\nfunction defaultGetter(target, key) {\n  return target[key];\n}\n\nfunction defaultSetter(target, key, value) {\n  target[key] = value;\n}\n/**\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} percent\n * @return {number}\n */\n\n\nfunction interpolateNumber(p0, p1, percent) {\n  return (p1 - p0) * percent + p0;\n}\n/**\n * @param  {string} p0\n * @param  {string} p1\n * @param  {number} percent\n * @return {string}\n */\n\n\nfunction interpolateString(p0, p1, percent) {\n  return percent > 0.5 ? p1 : p0;\n}\n/**\n * @param  {Array} p0\n * @param  {Array} p1\n * @param  {number} percent\n * @param  {Array} out\n * @param  {number} arrDim\n */\n\n\nfunction interpolateArray(p0, p1, percent, out, arrDim) {\n  var len = p0.length;\n\n  if (arrDim == 1) {\n    for (var i = 0; i < len; i++) {\n      out[i] = interpolateNumber(p0[i], p1[i], percent);\n    }\n  } else {\n    var len2 = len && p0[0].length;\n\n    for (var i = 0; i < len; i++) {\n      for (var j = 0; j < len2; j++) {\n        out[i][j] = interpolateNumber(p0[i][j], p1[i][j], percent);\n      }\n    }\n  }\n} // arr0 is source array, arr1 is target array.\n// Do some preprocess to avoid error happened when interpolating from arr0 to arr1\n\n\nfunction fillArr(arr0, arr1, arrDim) {\n  var arr0Len = arr0.length;\n  var arr1Len = arr1.length;\n\n  if (arr0Len !== arr1Len) {\n    // FIXME Not work for TypedArray\n    var isPreviousLarger = arr0Len > arr1Len;\n\n    if (isPreviousLarger) {\n      // Cut the previous\n      arr0.length = arr1Len;\n    } else {\n      // Fill the previous\n      for (var i = arr0Len; i < arr1Len; i++) {\n        arr0.push(arrDim === 1 ? arr1[i] : arraySlice.call(arr1[i]));\n      }\n    }\n  } // Handling NaN value\n\n\n  var len2 = arr0[0] && arr0[0].length;\n\n  for (var i = 0; i < arr0.length; i++) {\n    if (arrDim === 1) {\n      if (isNaN(arr0[i])) {\n        arr0[i] = arr1[i];\n      }\n    } else {\n      for (var j = 0; j < len2; j++) {\n        if (isNaN(arr0[i][j])) {\n          arr0[i][j] = arr1[i][j];\n        }\n      }\n    }\n  }\n}\n/**\n * @param  {Array} arr0\n * @param  {Array} arr1\n * @param  {number} arrDim\n * @return {boolean}\n */\n\n\nfunction isArraySame(arr0, arr1, arrDim) {\n  if (arr0 === arr1) {\n    return true;\n  }\n\n  var len = arr0.length;\n\n  if (len !== arr1.length) {\n    return false;\n  }\n\n  if (arrDim === 1) {\n    for (var i = 0; i < len; i++) {\n      if (arr0[i] !== arr1[i]) {\n        return false;\n      }\n    }\n  } else {\n    var len2 = arr0[0].length;\n\n    for (var i = 0; i < len; i++) {\n      for (var j = 0; j < len2; j++) {\n        if (arr0[i][j] !== arr1[i][j]) {\n          return false;\n        }\n      }\n    }\n  }\n\n  return true;\n}\n/**\n * Catmull Rom interpolate array\n * @param  {Array} p0\n * @param  {Array} p1\n * @param  {Array} p2\n * @param  {Array} p3\n * @param  {number} t\n * @param  {number} t2\n * @param  {number} t3\n * @param  {Array} out\n * @param  {number} arrDim\n */\n\n\nfunction catmullRomInterpolateArray(p0, p1, p2, p3, t, t2, t3, out, arrDim) {\n  var len = p0.length;\n\n  if (arrDim == 1) {\n    for (var i = 0; i < len; i++) {\n      out[i] = catmullRomInterpolate(p0[i], p1[i], p2[i], p3[i], t, t2, t3);\n    }\n  } else {\n    var len2 = p0[0].length;\n\n    for (var i = 0; i < len; i++) {\n      for (var j = 0; j < len2; j++) {\n        out[i][j] = catmullRomInterpolate(p0[i][j], p1[i][j], p2[i][j], p3[i][j], t, t2, t3);\n      }\n    }\n  }\n}\n/**\n * Catmull Rom interpolate number\n * @param  {number} p0\n * @param  {number} p1\n * @param  {number} p2\n * @param  {number} p3\n * @param  {number} t\n * @param  {number} t2\n * @param  {number} t3\n * @return {number}\n */\n\n\nfunction catmullRomInterpolate(p0, p1, p2, p3, t, t2, t3) {\n  var v0 = (p2 - p0) * 0.5;\n  var v1 = (p3 - p1) * 0.5;\n  return (2 * (p1 - p2) + v0 + v1) * t3 + (-3 * (p1 - p2) - 2 * v0 - v1) * t2 + v0 * t + p1;\n}\n\nfunction cloneValue(value) {\n  if (isArrayLike(value)) {\n    var len = value.length;\n\n    if (isArrayLike(value[0])) {\n      var ret = [];\n\n      for (var i = 0; i < len; i++) {\n        ret.push(arraySlice.call(value[i]));\n      }\n\n      return ret;\n    }\n\n    return arraySlice.call(value);\n  }\n\n  return value;\n}\n\nfunction rgba2String(rgba) {\n  rgba[0] = Math.floor(rgba[0]);\n  rgba[1] = Math.floor(rgba[1]);\n  rgba[2] = Math.floor(rgba[2]);\n  return 'rgba(' + rgba.join(',') + ')';\n}\n\nfunction getArrayDim(keyframes) {\n  var lastValue = keyframes[keyframes.length - 1].value;\n  return isArrayLike(lastValue && lastValue[0]) ? 2 : 1;\n}\n\nfunction createTrackClip(animator, easing, oneTrackDone, keyframes, propName, forceAnimate) {\n  var getter = animator._getter;\n  var setter = animator._setter;\n  var useSpline = easing === 'spline';\n  var trackLen = keyframes.length;\n\n  if (!trackLen) {\n    return;\n  } // Guess data type\n\n\n  var firstVal = keyframes[0].value;\n  var isValueArray = isArrayLike(firstVal);\n  var isValueColor = false;\n  var isValueString = false; // For vertices morphing\n\n  var arrDim = isValueArray ? getArrayDim(keyframes) : 0;\n  var trackMaxTime; // Sort keyframe as ascending\n\n  keyframes.sort(function (a, b) {\n    return a.time - b.time;\n  });\n  trackMaxTime = keyframes[trackLen - 1].time; // Percents of each keyframe\n\n  var kfPercents = []; // Value of each keyframe\n\n  var kfValues = [];\n  var prevValue = keyframes[0].value;\n  var isAllValueEqual = true;\n\n  for (var i = 0; i < trackLen; i++) {\n    kfPercents.push(keyframes[i].time / trackMaxTime); // Assume value is a color when it is a string\n\n    var value = keyframes[i].value; // Check if value is equal, deep check if value is array\n\n    if (!(isValueArray && isArraySame(value, prevValue, arrDim) || !isValueArray && value === prevValue)) {\n      isAllValueEqual = false;\n    }\n\n    prevValue = value; // Try converting a string to a color array\n\n    if (typeof value == 'string') {\n      var colorArray = color.parse(value);\n\n      if (colorArray) {\n        value = colorArray;\n        isValueColor = true;\n      } else {\n        isValueString = true;\n      }\n    }\n\n    kfValues.push(value);\n  }\n\n  if (!forceAnimate && isAllValueEqual) {\n    return;\n  }\n\n  var lastValue = kfValues[trackLen - 1]; // Polyfill array and NaN value\n\n  for (var i = 0; i < trackLen - 1; i++) {\n    if (isValueArray) {\n      fillArr(kfValues[i], lastValue, arrDim);\n    } else {\n      if (isNaN(kfValues[i]) && !isNaN(lastValue) && !isValueString && !isValueColor) {\n        kfValues[i] = lastValue;\n      }\n    }\n  }\n\n  isValueArray && fillArr(getter(animator._target, propName), lastValue, arrDim); // Cache the key of last frame to speed up when\n  // animation playback is sequency\n\n  var lastFrame = 0;\n  var lastFramePercent = 0;\n  var start;\n  var w;\n  var p0;\n  var p1;\n  var p2;\n  var p3;\n\n  if (isValueColor) {\n    var rgba = [0, 0, 0, 0];\n  }\n\n  var onframe = function (target, percent) {\n    // Find the range keyframes\n    // kf1-----kf2---------current--------kf3\n    // find kf2 and kf3 and do interpolation\n    var frame; // In the easing function like elasticOut, percent may less than 0\n\n    if (percent < 0) {\n      frame = 0;\n    } else if (percent < lastFramePercent) {\n      // Start from next key\n      // PENDING start from lastFrame ?\n      start = Math.min(lastFrame + 1, trackLen - 1);\n\n      for (frame = start; frame >= 0; frame--) {\n        if (kfPercents[frame] <= percent) {\n          break;\n        }\n      } // PENDING really need to do this ?\n\n\n      frame = Math.min(frame, trackLen - 2);\n    } else {\n      for (frame = lastFrame; frame < trackLen; frame++) {\n        if (kfPercents[frame] > percent) {\n          break;\n        }\n      }\n\n      frame = Math.min(frame - 1, trackLen - 2);\n    }\n\n    lastFrame = frame;\n    lastFramePercent = percent;\n    var range = kfPercents[frame + 1] - kfPercents[frame];\n\n    if (range === 0) {\n      return;\n    } else {\n      w = (percent - kfPercents[frame]) / range;\n    }\n\n    if (useSpline) {\n      p1 = kfValues[frame];\n      p0 = kfValues[frame === 0 ? frame : frame - 1];\n      p2 = kfValues[frame > trackLen - 2 ? trackLen - 1 : frame + 1];\n      p3 = kfValues[frame > trackLen - 3 ? trackLen - 1 : frame + 2];\n\n      if (isValueArray) {\n        catmullRomInterpolateArray(p0, p1, p2, p3, w, w * w, w * w * w, getter(target, propName), arrDim);\n      } else {\n        var value;\n\n        if (isValueColor) {\n          value = catmullRomInterpolateArray(p0, p1, p2, p3, w, w * w, w * w * w, rgba, 1);\n          value = rgba2String(rgba);\n        } else if (isValueString) {\n          // String is step(0.5)\n          return interpolateString(p1, p2, w);\n        } else {\n          value = catmullRomInterpolate(p0, p1, p2, p3, w, w * w, w * w * w);\n        }\n\n        setter(target, propName, value);\n      }\n    } else {\n      if (isValueArray) {\n        interpolateArray(kfValues[frame], kfValues[frame + 1], w, getter(target, propName), arrDim);\n      } else {\n        var value;\n\n        if (isValueColor) {\n          interpolateArray(kfValues[frame], kfValues[frame + 1], w, rgba, 1);\n          value = rgba2String(rgba);\n        } else if (isValueString) {\n          // String is step(0.5)\n          return interpolateString(kfValues[frame], kfValues[frame + 1], w);\n        } else {\n          value = interpolateNumber(kfValues[frame], kfValues[frame + 1], w);\n        }\n\n        setter(target, propName, value);\n      }\n    }\n  };\n\n  var clip = new Clip({\n    target: animator._target,\n    life: trackMaxTime,\n    loop: animator._loop,\n    delay: animator._delay,\n    onframe: onframe,\n    ondestroy: oneTrackDone\n  });\n\n  if (easing && easing !== 'spline') {\n    clip.easing = easing;\n  }\n\n  return clip;\n}\n/**\n * @alias module:zrender/animation/Animator\n * @constructor\n * @param {Object} target\n * @param {boolean} loop\n * @param {Function} getter\n * @param {Function} setter\n */\n\n\nvar Animator = function (target, loop, getter, setter) {\n  this._tracks = {};\n  this._target = target;\n  this._loop = loop || false;\n  this._getter = getter || defaultGetter;\n  this._setter = setter || defaultSetter;\n  this._clipCount = 0;\n  this._delay = 0;\n  this._doneList = [];\n  this._onframeList = [];\n  this._clipList = [];\n};\n\nAnimator.prototype = {\n  /**\n   * 设置动画关键帧\n   * @param  {number} time 关键帧时间，单位是ms\n   * @param  {Object} props 关键帧的属性值，key-value表示\n   * @return {module:zrender/animation/Animator}\n   */\n  when: function (time\n  /* ms */\n  , props) {\n    var tracks = this._tracks;\n\n    for (var propName in props) {\n      if (!props.hasOwnProperty(propName)) {\n        continue;\n      }\n\n      if (!tracks[propName]) {\n        tracks[propName] = []; // Invalid value\n\n        var value = this._getter(this._target, propName);\n\n        if (value == null) {\n          // zrLog('Invalid property ' + propName);\n          continue;\n        } // If time is 0\n        //  Then props is given initialize value\n        // Else\n        //  Initialize value from current prop value\n\n\n        if (time !== 0) {\n          tracks[propName].push({\n            time: 0,\n            value: cloneValue(value)\n          });\n        }\n      }\n\n      tracks[propName].push({\n        time: time,\n        value: props[propName]\n      });\n    }\n\n    return this;\n  },\n\n  /**\n   * 添加动画每一帧的回调函数\n   * @param  {Function} callback\n   * @return {module:zrender/animation/Animator}\n   */\n  during: function (callback) {\n    this._onframeList.push(callback);\n\n    return this;\n  },\n  pause: function () {\n    for (var i = 0; i < this._clipList.length; i++) {\n      this._clipList[i].pause();\n    }\n\n    this._paused = true;\n  },\n  resume: function () {\n    for (var i = 0; i < this._clipList.length; i++) {\n      this._clipList[i].resume();\n    }\n\n    this._paused = false;\n  },\n  isPaused: function () {\n    return !!this._paused;\n  },\n  _doneCallback: function () {\n    // Clear all tracks\n    this._tracks = {}; // Clear all clips\n\n    this._clipList.length = 0;\n    var doneList = this._doneList;\n    var len = doneList.length;\n\n    for (var i = 0; i < len; i++) {\n      doneList[i].call(this);\n    }\n  },\n\n  /**\n   * 开始执行动画\n   * @param  {string|Function} [easing]\n   *         动画缓动函数，详见{@link module:zrender/animation/easing}\n   * @param  {boolean} forceAnimate\n   * @return {module:zrender/animation/Animator}\n   */\n  start: function (easing, forceAnimate) {\n    var self = this;\n    var clipCount = 0;\n\n    var oneTrackDone = function () {\n      clipCount--;\n\n      if (!clipCount) {\n        self._doneCallback();\n      }\n    };\n\n    var lastClip;\n\n    for (var propName in this._tracks) {\n      if (!this._tracks.hasOwnProperty(propName)) {\n        continue;\n      }\n\n      var clip = createTrackClip(this, easing, oneTrackDone, this._tracks[propName], propName, forceAnimate);\n\n      if (clip) {\n        this._clipList.push(clip);\n\n        clipCount++; // If start after added to animation\n\n        if (this.animation) {\n          this.animation.addClip(clip);\n        }\n\n        lastClip = clip;\n      }\n    } // Add during callback on the last clip\n\n\n    if (lastClip) {\n      var oldOnFrame = lastClip.onframe;\n\n      lastClip.onframe = function (target, percent) {\n        oldOnFrame(target, percent);\n\n        for (var i = 0; i < self._onframeList.length; i++) {\n          self._onframeList[i](target, percent);\n        }\n      };\n    } // This optimization will help the case that in the upper application\n    // the view may be refreshed frequently, where animation will be\n    // called repeatly but nothing changed.\n\n\n    if (!clipCount) {\n      this._doneCallback();\n    }\n\n    return this;\n  },\n\n  /**\n   * 停止动画\n   * @param {boolean} forwardToLast If move to last frame before stop\n   */\n  stop: function (forwardToLast) {\n    var clipList = this._clipList;\n    var animation = this.animation;\n\n    for (var i = 0; i < clipList.length; i++) {\n      var clip = clipList[i];\n\n      if (forwardToLast) {\n        // Move to last frame before stop\n        clip.onframe(this._target, 1);\n      }\n\n      animation && animation.removeClip(clip);\n    }\n\n    clipList.length = 0;\n  },\n\n  /**\n   * 设置动画延迟开始的时间\n   * @param  {number} time 单位ms\n   * @return {module:zrender/animation/Animator}\n   */\n  delay: function (time) {\n    this._delay = time;\n    return this;\n  },\n\n  /**\n   * 添加动画结束的回调\n   * @param  {Function} cb\n   * @return {module:zrender/animation/Animator}\n   */\n  done: function (cb) {\n    if (cb) {\n      this._doneList.push(cb);\n    }\n\n    return this;\n  },\n\n  /**\n   * @return {Array.<module:zrender/animation/Clip>}\n   */\n  getClips: function () {\n    return this._clipList;\n  }\n};\nvar _default = Animator;\nmodule.exports = _default;\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar easingFuncs = __webpack_require__(46);\n\n/**\n * 动画主控制器\n * @config target 动画对象，可以是数组，如果是数组的话会批量分发onframe等事件\n * @config life(1000) 动画时长\n * @config delay(0) 动画延迟时间\n * @config loop(true)\n * @config gap(0) 循环的间隔时间\n * @config onframe\n * @config easing(optional)\n * @config ondestroy(optional)\n * @config onrestart(optional)\n *\n * TODO pause\n */\nfunction Clip(options) {\n  this._target = options.target; // 生命周期\n\n  this._life = options.life || 1000; // 延时\n\n  this._delay = options.delay || 0; // 开始时间\n  // this._startTime = new Date().getTime() + this._delay;// 单位毫秒\n\n  this._initialized = false; // 是否循环\n\n  this.loop = options.loop == null ? false : options.loop;\n  this.gap = options.gap || 0;\n  this.easing = options.easing || 'Linear';\n  this.onframe = options.onframe;\n  this.ondestroy = options.ondestroy;\n  this.onrestart = options.onrestart;\n  this._pausedTime = 0;\n  this._paused = false;\n}\n\nClip.prototype = {\n  constructor: Clip,\n  step: function (globalTime, deltaTime) {\n    // Set startTime on first step, or _startTime may has milleseconds different between clips\n    // PENDING\n    if (!this._initialized) {\n      this._startTime = globalTime + this._delay;\n      this._initialized = true;\n    }\n\n    if (this._paused) {\n      this._pausedTime += deltaTime;\n      return;\n    }\n\n    var percent = (globalTime - this._startTime - this._pausedTime) / this._life; // 还没开始\n\n    if (percent < 0) {\n      return;\n    }\n\n    percent = Math.min(percent, 1);\n    var easing = this.easing;\n    var easingFunc = typeof easing == 'string' ? easingFuncs[easing] : easing;\n    var schedule = typeof easingFunc === 'function' ? easingFunc(percent) : percent;\n    this.fire('frame', schedule); // 结束\n\n    if (percent == 1) {\n      if (this.loop) {\n        this.restart(globalTime); // 重新开始周期\n        // 抛出而不是直接调用事件直到 stage.update 后再统一调用这些事件\n\n        return 'restart';\n      } // 动画完成将这个控制器标识为待删除\n      // 在Animation.update中进行批量删除\n\n\n      this._needsRemove = true;\n      return 'destroy';\n    }\n\n    return null;\n  },\n  restart: function (globalTime) {\n    var remainder = (globalTime - this._startTime - this._pausedTime) % this._life;\n    this._startTime = globalTime - remainder + this.gap;\n    this._pausedTime = 0;\n    this._needsRemove = false;\n  },\n  fire: function (eventType, arg) {\n    eventType = 'on' + eventType;\n\n    if (this[eventType]) {\n      this[eventType](this._target, arg);\n    }\n  },\n  pause: function () {\n    this._paused = true;\n  },\n  resume: function () {\n    this._paused = false;\n  }\n};\nvar _default = Clip;\nmodule.exports = _default;\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports) {\n\n/**\n * 缓动代码来自 https://github.com/sole/tween.js/blob/master/src/Tween.js\n * @see http://sole.github.io/tween.js/examples/03_graphs.html\n * @exports zrender/animation/easing\n */\nvar easing = {\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  linear: function (k) {\n    return k;\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  quadraticIn: function (k) {\n    return k * k;\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  quadraticOut: function (k) {\n    return k * (2 - k);\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  quadraticInOut: function (k) {\n    if ((k *= 2) < 1) {\n      return 0.5 * k * k;\n    }\n\n    return -0.5 * (--k * (k - 2) - 1);\n  },\n  // 三次方的缓动（t^3）\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  cubicIn: function (k) {\n    return k * k * k;\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  cubicOut: function (k) {\n    return --k * k * k + 1;\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  cubicInOut: function (k) {\n    if ((k *= 2) < 1) {\n      return 0.5 * k * k * k;\n    }\n\n    return 0.5 * ((k -= 2) * k * k + 2);\n  },\n  // 四次方的缓动（t^4）\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  quarticIn: function (k) {\n    return k * k * k * k;\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  quarticOut: function (k) {\n    return 1 - --k * k * k * k;\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  quarticInOut: function (k) {\n    if ((k *= 2) < 1) {\n      return 0.5 * k * k * k * k;\n    }\n\n    return -0.5 * ((k -= 2) * k * k * k - 2);\n  },\n  // 五次方的缓动（t^5）\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  quinticIn: function (k) {\n    return k * k * k * k * k;\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  quinticOut: function (k) {\n    return --k * k * k * k * k + 1;\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  quinticInOut: function (k) {\n    if ((k *= 2) < 1) {\n      return 0.5 * k * k * k * k * k;\n    }\n\n    return 0.5 * ((k -= 2) * k * k * k * k + 2);\n  },\n  // 正弦曲线的缓动（sin(t)）\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  sinusoidalIn: function (k) {\n    return 1 - Math.cos(k * Math.PI / 2);\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  sinusoidalOut: function (k) {\n    return Math.sin(k * Math.PI / 2);\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  sinusoidalInOut: function (k) {\n    return 0.5 * (1 - Math.cos(Math.PI * k));\n  },\n  // 指数曲线的缓动（2^t）\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  exponentialIn: function (k) {\n    return k === 0 ? 0 : Math.pow(1024, k - 1);\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  exponentialOut: function (k) {\n    return k === 1 ? 1 : 1 - Math.pow(2, -10 * k);\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  exponentialInOut: function (k) {\n    if (k === 0) {\n      return 0;\n    }\n\n    if (k === 1) {\n      return 1;\n    }\n\n    if ((k *= 2) < 1) {\n      return 0.5 * Math.pow(1024, k - 1);\n    }\n\n    return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2);\n  },\n  // 圆形曲线的缓动（sqrt(1-t^2)）\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  circularIn: function (k) {\n    return 1 - Math.sqrt(1 - k * k);\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  circularOut: function (k) {\n    return Math.sqrt(1 - --k * k);\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  circularInOut: function (k) {\n    if ((k *= 2) < 1) {\n      return -0.5 * (Math.sqrt(1 - k * k) - 1);\n    }\n\n    return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1);\n  },\n  // 创建类似于弹簧在停止前来回振荡的动画\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  elasticIn: function (k) {\n    var s;\n    var a = 0.1;\n    var p = 0.4;\n\n    if (k === 0) {\n      return 0;\n    }\n\n    if (k === 1) {\n      return 1;\n    }\n\n    if (!a || a < 1) {\n      a = 1;\n      s = p / 4;\n    } else {\n      s = p * Math.asin(1 / a) / (2 * Math.PI);\n    }\n\n    return -(a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p));\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  elasticOut: function (k) {\n    var s;\n    var a = 0.1;\n    var p = 0.4;\n\n    if (k === 0) {\n      return 0;\n    }\n\n    if (k === 1) {\n      return 1;\n    }\n\n    if (!a || a < 1) {\n      a = 1;\n      s = p / 4;\n    } else {\n      s = p * Math.asin(1 / a) / (2 * Math.PI);\n    }\n\n    return a * Math.pow(2, -10 * k) * Math.sin((k - s) * (2 * Math.PI) / p) + 1;\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  elasticInOut: function (k) {\n    var s;\n    var a = 0.1;\n    var p = 0.4;\n\n    if (k === 0) {\n      return 0;\n    }\n\n    if (k === 1) {\n      return 1;\n    }\n\n    if (!a || a < 1) {\n      a = 1;\n      s = p / 4;\n    } else {\n      s = p * Math.asin(1 / a) / (2 * Math.PI);\n    }\n\n    if ((k *= 2) < 1) {\n      return -0.5 * (a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p));\n    }\n\n    return a * Math.pow(2, -10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1;\n  },\n  // 在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  backIn: function (k) {\n    var s = 1.70158;\n    return k * k * ((s + 1) * k - s);\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  backOut: function (k) {\n    var s = 1.70158;\n    return --k * k * ((s + 1) * k + s) + 1;\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  backInOut: function (k) {\n    var s = 1.70158 * 1.525;\n\n    if ((k *= 2) < 1) {\n      return 0.5 * (k * k * ((s + 1) * k - s));\n    }\n\n    return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2);\n  },\n  // 创建弹跳效果\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  bounceIn: function (k) {\n    return 1 - easing.bounceOut(1 - k);\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  bounceOut: function (k) {\n    if (k < 1 / 2.75) {\n      return 7.5625 * k * k;\n    } else if (k < 2 / 2.75) {\n      return 7.5625 * (k -= 1.5 / 2.75) * k + 0.75;\n    } else if (k < 2.5 / 2.75) {\n      return 7.5625 * (k -= 2.25 / 2.75) * k + 0.9375;\n    } else {\n      return 7.5625 * (k -= 2.625 / 2.75) * k + 0.984375;\n    }\n  },\n\n  /**\n  * @param {number} k\n  * @return {number}\n  */\n  bounceInOut: function (k) {\n    if (k < 0.5) {\n      return easing.bounceIn(k * 2) * 0.5;\n    }\n\n    return easing.bounceOut(k * 2 - 1) * 0.5 + 0.5;\n  }\n};\nvar _default = easing;\nmodule.exports = _default;\n\n/***/ }),\n/* 47 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar _config = __webpack_require__(19);\n\nvar debugMode = _config.debugMode;\n\nvar log = function () {};\n\nif (debugMode === 1) {\n  log = function () {\n    for (var k in arguments) {\n      throw new Error(arguments[k]);\n    }\n  };\n} else if (debugMode > 1) {\n  log = function () {\n    for (var k in arguments) {\n      console.log(arguments[k]);\n    }\n  };\n}\n\nvar _default = log;\nmodule.exports = _default;\n\n/***/ }),\n/* 48 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar textHelper = __webpack_require__(20);\n\nvar BoundingRect = __webpack_require__(3);\n\n/**\n * Mixin for drawing text in a element bounding rect\n * @module zrender/mixin/RectText\n */\nvar tmpRect = new BoundingRect();\n\nvar RectText = function () {};\n\nRectText.prototype = {\n  constructor: RectText,\n\n  /**\n   * Draw text in a rect with specified position.\n   * @param  {CanvasRenderingContext2D} ctx\n   * @param  {Object} rect Displayable rect\n   */\n  drawRectText: function (ctx, rect) {\n    var style = this.style;\n    rect = style.textRect || rect; // Optimize, avoid normalize every time.\n\n    this.__dirty && textHelper.normalizeTextStyle(style, true);\n    var text = style.text; // Convert to string\n\n    text != null && (text += '');\n\n    if (!textHelper.needDrawText(text, style)) {\n      return;\n    } // FIXME\n\n\n    ctx.save(); // Transform rect to view space\n\n    var transform = this.transform;\n\n    if (!style.transformText) {\n      if (transform) {\n        tmpRect.copy(rect);\n        tmpRect.applyTransform(transform);\n        rect = tmpRect;\n      }\n    } else {\n      this.setTransform(ctx);\n    } // transformText and textRotation can not be used at the same time.\n\n\n    textHelper.renderText(this, ctx, text, style, rect);\n    ctx.restore();\n  }\n};\nvar _default = RectText;\nmodule.exports = _default;\n\n/***/ }),\n/* 49 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar vec2 = __webpack_require__(2);\n\nvar curve = __webpack_require__(4);\n\n/**\n * @author Yi Shen(https://github.com/pissang)\n */\nvar mathMin = Math.min;\nvar mathMax = Math.max;\nvar mathSin = Math.sin;\nvar mathCos = Math.cos;\nvar PI2 = Math.PI * 2;\nvar start = vec2.create();\nvar end = vec2.create();\nvar extremity = vec2.create();\n/**\n * 从顶点数组中计算出最小包围盒，写入`min`和`max`中\n * @module zrender/core/bbox\n * @param {Array<Object>} points 顶点数组\n * @param {number} min\n * @param {number} max\n */\n\nfunction fromPoints(points, min, max) {\n  if (points.length === 0) {\n    return;\n  }\n\n  var p = points[0];\n  var left = p[0];\n  var right = p[0];\n  var top = p[1];\n  var bottom = p[1];\n  var i;\n\n  for (i = 1; i < points.length; i++) {\n    p = points[i];\n    left = mathMin(left, p[0]);\n    right = mathMax(right, p[0]);\n    top = mathMin(top, p[1]);\n    bottom = mathMax(bottom, p[1]);\n  }\n\n  min[0] = left;\n  min[1] = top;\n  max[0] = right;\n  max[1] = bottom;\n}\n/**\n * @memberOf module:zrender/core/bbox\n * @param {number} x0\n * @param {number} y0\n * @param {number} x1\n * @param {number} y1\n * @param {Array.<number>} min\n * @param {Array.<number>} max\n */\n\n\nfunction fromLine(x0, y0, x1, y1, min, max) {\n  min[0] = mathMin(x0, x1);\n  min[1] = mathMin(y0, y1);\n  max[0] = mathMax(x0, x1);\n  max[1] = mathMax(y0, y1);\n}\n\nvar xDim = [];\nvar yDim = [];\n/**\n * 从三阶贝塞尔曲线(p0, p1, p2, p3)中计算出最小包围盒，写入`min`和`max`中\n * @memberOf module:zrender/core/bbox\n * @param {number} x0\n * @param {number} y0\n * @param {number} x1\n * @param {number} y1\n * @param {number} x2\n * @param {number} y2\n * @param {number} x3\n * @param {number} y3\n * @param {Array.<number>} min\n * @param {Array.<number>} max\n */\n\nfunction fromCubic(x0, y0, x1, y1, x2, y2, x3, y3, min, max) {\n  var cubicExtrema = curve.cubicExtrema;\n  var cubicAt = curve.cubicAt;\n  var i;\n  var n = cubicExtrema(x0, x1, x2, x3, xDim);\n  min[0] = Infinity;\n  min[1] = Infinity;\n  max[0] = -Infinity;\n  max[1] = -Infinity;\n\n  for (i = 0; i < n; i++) {\n    var x = cubicAt(x0, x1, x2, x3, xDim[i]);\n    min[0] = mathMin(x, min[0]);\n    max[0] = mathMax(x, max[0]);\n  }\n\n  n = cubicExtrema(y0, y1, y2, y3, yDim);\n\n  for (i = 0; i < n; i++) {\n    var y = cubicAt(y0, y1, y2, y3, yDim[i]);\n    min[1] = mathMin(y, min[1]);\n    max[1] = mathMax(y, max[1]);\n  }\n\n  min[0] = mathMin(x0, min[0]);\n  max[0] = mathMax(x0, max[0]);\n  min[0] = mathMin(x3, min[0]);\n  max[0] = mathMax(x3, max[0]);\n  min[1] = mathMin(y0, min[1]);\n  max[1] = mathMax(y0, max[1]);\n  min[1] = mathMin(y3, min[1]);\n  max[1] = mathMax(y3, max[1]);\n}\n/**\n * 从二阶贝塞尔曲线(p0, p1, p2)中计算出最小包围盒，写入`min`和`max`中\n * @memberOf module:zrender/core/bbox\n * @param {number} x0\n * @param {number} y0\n * @param {number} x1\n * @param {number} y1\n * @param {number} x2\n * @param {number} y2\n * @param {Array.<number>} min\n * @param {Array.<number>} max\n */\n\n\nfunction fromQuadratic(x0, y0, x1, y1, x2, y2, min, max) {\n  var quadraticExtremum = curve.quadraticExtremum;\n  var quadraticAt = curve.quadraticAt; // Find extremities, where derivative in x dim or y dim is zero\n\n  var tx = mathMax(mathMin(quadraticExtremum(x0, x1, x2), 1), 0);\n  var ty = mathMax(mathMin(quadraticExtremum(y0, y1, y2), 1), 0);\n  var x = quadraticAt(x0, x1, x2, tx);\n  var y = quadraticAt(y0, y1, y2, ty);\n  min[0] = mathMin(x0, x2, x);\n  min[1] = mathMin(y0, y2, y);\n  max[0] = mathMax(x0, x2, x);\n  max[1] = mathMax(y0, y2, y);\n}\n/**\n * 从圆弧中计算出最小包围盒，写入`min`和`max`中\n * @method\n * @memberOf module:zrender/core/bbox\n * @param {number} x\n * @param {number} y\n * @param {number} rx\n * @param {number} ry\n * @param {number} startAngle\n * @param {number} endAngle\n * @param {number} anticlockwise\n * @param {Array.<number>} min\n * @param {Array.<number>} max\n */\n\n\nfunction fromArc(x, y, rx, ry, startAngle, endAngle, anticlockwise, min, max) {\n  var vec2Min = vec2.min;\n  var vec2Max = vec2.max;\n  var diff = Math.abs(startAngle - endAngle);\n\n  if (diff % PI2 < 1e-4 && diff > 1e-4) {\n    // Is a circle\n    min[0] = x - rx;\n    min[1] = y - ry;\n    max[0] = x + rx;\n    max[1] = y + ry;\n    return;\n  }\n\n  start[0] = mathCos(startAngle) * rx + x;\n  start[1] = mathSin(startAngle) * ry + y;\n  end[0] = mathCos(endAngle) * rx + x;\n  end[1] = mathSin(endAngle) * ry + y;\n  vec2Min(min, start, end);\n  vec2Max(max, start, end); // Thresh to [0, Math.PI * 2]\n\n  startAngle = startAngle % PI2;\n\n  if (startAngle < 0) {\n    startAngle = startAngle + PI2;\n  }\n\n  endAngle = endAngle % PI2;\n\n  if (endAngle < 0) {\n    endAngle = endAngle + PI2;\n  }\n\n  if (startAngle > endAngle && !anticlockwise) {\n    endAngle += PI2;\n  } else if (startAngle < endAngle && anticlockwise) {\n    startAngle += PI2;\n  }\n\n  if (anticlockwise) {\n    var tmp = endAngle;\n    endAngle = startAngle;\n    startAngle = tmp;\n  } // var number = 0;\n  // var step = (anticlockwise ? -Math.PI : Math.PI) / 2;\n\n\n  for (var angle = 0; angle < endAngle; angle += Math.PI / 2) {\n    if (angle > startAngle) {\n      extremity[0] = mathCos(angle) * rx + x;\n      extremity[1] = mathSin(angle) * ry + y;\n      vec2Min(min, extremity, min);\n      vec2Max(max, extremity, max);\n    }\n  }\n}\n\nexports.fromPoints = fromPoints;\nexports.fromLine = fromLine;\nexports.fromCubic = fromCubic;\nexports.fromQuadratic = fromQuadratic;\nexports.fromArc = fromArc;\n\n/***/ }),\n/* 50 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar PathProxy = __webpack_require__(6);\n\nvar line = __webpack_require__(51);\n\nvar cubic = __webpack_require__(52);\n\nvar quadratic = __webpack_require__(53);\n\nvar arc = __webpack_require__(54);\n\nvar _util = __webpack_require__(22);\n\nvar normalizeRadian = _util.normalizeRadian;\n\nvar curve = __webpack_require__(4);\n\nvar windingLine = __webpack_require__(55);\n\nvar CMD = PathProxy.CMD;\nvar PI2 = Math.PI * 2;\nvar EPSILON = 1e-4;\n\nfunction isAroundEqual(a, b) {\n  return Math.abs(a - b) < EPSILON;\n} // 临时数组\n\n\nvar roots = [-1, -1, -1];\nvar extrema = [-1, -1];\n\nfunction swapExtrema() {\n  var tmp = extrema[0];\n  extrema[0] = extrema[1];\n  extrema[1] = tmp;\n}\n\nfunction windingCubic(x0, y0, x1, y1, x2, y2, x3, y3, x, y) {\n  // Quick reject\n  if (y > y0 && y > y1 && y > y2 && y > y3 || y < y0 && y < y1 && y < y2 && y < y3) {\n    return 0;\n  }\n\n  var nRoots = curve.cubicRootAt(y0, y1, y2, y3, y, roots);\n\n  if (nRoots === 0) {\n    return 0;\n  } else {\n    var w = 0;\n    var nExtrema = -1;\n    var y0_, y1_;\n\n    for (var i = 0; i < nRoots; i++) {\n      var t = roots[i]; // Avoid winding error when intersection point is the connect point of two line of polygon\n\n      var unit = t === 0 || t === 1 ? 0.5 : 1;\n      var x_ = curve.cubicAt(x0, x1, x2, x3, t);\n\n      if (x_ < x) {\n        // Quick reject\n        continue;\n      }\n\n      if (nExtrema < 0) {\n        nExtrema = curve.cubicExtrema(y0, y1, y2, y3, extrema);\n\n        if (extrema[1] < extrema[0] && nExtrema > 1) {\n          swapExtrema();\n        }\n\n        y0_ = curve.cubicAt(y0, y1, y2, y3, extrema[0]);\n\n        if (nExtrema > 1) {\n          y1_ = curve.cubicAt(y0, y1, y2, y3, extrema[1]);\n        }\n      }\n\n      if (nExtrema == 2) {\n        // 分成三段单调函数\n        if (t < extrema[0]) {\n          w += y0_ < y0 ? unit : -unit;\n        } else if (t < extrema[1]) {\n          w += y1_ < y0_ ? unit : -unit;\n        } else {\n          w += y3 < y1_ ? unit : -unit;\n        }\n      } else {\n        // 分成两段单调函数\n        if (t < extrema[0]) {\n          w += y0_ < y0 ? unit : -unit;\n        } else {\n          w += y3 < y0_ ? unit : -unit;\n        }\n      }\n    }\n\n    return w;\n  }\n}\n\nfunction windingQuadratic(x0, y0, x1, y1, x2, y2, x, y) {\n  // Quick reject\n  if (y > y0 && y > y1 && y > y2 || y < y0 && y < y1 && y < y2) {\n    return 0;\n  }\n\n  var nRoots = curve.quadraticRootAt(y0, y1, y2, y, roots);\n\n  if (nRoots === 0) {\n    return 0;\n  } else {\n    var t = curve.quadraticExtremum(y0, y1, y2);\n\n    if (t >= 0 && t <= 1) {\n      var w = 0;\n      var y_ = curve.quadraticAt(y0, y1, y2, t);\n\n      for (var i = 0; i < nRoots; i++) {\n        // Remove one endpoint.\n        var unit = roots[i] === 0 || roots[i] === 1 ? 0.5 : 1;\n        var x_ = curve.quadraticAt(x0, x1, x2, roots[i]);\n\n        if (x_ < x) {\n          // Quick reject\n          continue;\n        }\n\n        if (roots[i] < t) {\n          w += y_ < y0 ? unit : -unit;\n        } else {\n          w += y2 < y_ ? unit : -unit;\n        }\n      }\n\n      return w;\n    } else {\n      // Remove one endpoint.\n      var unit = roots[0] === 0 || roots[0] === 1 ? 0.5 : 1;\n      var x_ = curve.quadraticAt(x0, x1, x2, roots[0]);\n\n      if (x_ < x) {\n        // Quick reject\n        return 0;\n      }\n\n      return y2 < y0 ? unit : -unit;\n    }\n  }\n} // TODO\n// Arc 旋转\n\n\nfunction windingArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y) {\n  y -= cy;\n\n  if (y > r || y < -r) {\n    return 0;\n  }\n\n  var tmp = Math.sqrt(r * r - y * y);\n  roots[0] = -tmp;\n  roots[1] = tmp;\n  var diff = Math.abs(startAngle - endAngle);\n\n  if (diff < 1e-4) {\n    return 0;\n  }\n\n  if (diff % PI2 < 1e-4) {\n    // Is a circle\n    startAngle = 0;\n    endAngle = PI2;\n    var dir = anticlockwise ? 1 : -1;\n\n    if (x >= roots[0] + cx && x <= roots[1] + cx) {\n      return dir;\n    } else {\n      return 0;\n    }\n  }\n\n  if (anticlockwise) {\n    var tmp = startAngle;\n    startAngle = normalizeRadian(endAngle);\n    endAngle = normalizeRadian(tmp);\n  } else {\n    startAngle = normalizeRadian(startAngle);\n    endAngle = normalizeRadian(endAngle);\n  }\n\n  if (startAngle > endAngle) {\n    endAngle += PI2;\n  }\n\n  var w = 0;\n\n  for (var i = 0; i < 2; i++) {\n    var x_ = roots[i];\n\n    if (x_ + cx > x) {\n      var angle = Math.atan2(y, x_);\n      var dir = anticlockwise ? 1 : -1;\n\n      if (angle < 0) {\n        angle = PI2 + angle;\n      }\n\n      if (angle >= startAngle && angle <= endAngle || angle + PI2 >= startAngle && angle + PI2 <= endAngle) {\n        if (angle > Math.PI / 2 && angle < Math.PI * 1.5) {\n          dir = -dir;\n        }\n\n        w += dir;\n      }\n    }\n  }\n\n  return w;\n}\n\nfunction containPath(data, lineWidth, isStroke, x, y) {\n  var w = 0;\n  var xi = 0;\n  var yi = 0;\n  var x0 = 0;\n  var y0 = 0;\n\n  for (var i = 0; i < data.length;) {\n    var cmd = data[i++]; // Begin a new subpath\n\n    if (cmd === CMD.M && i > 1) {\n      // Close previous subpath\n      if (!isStroke) {\n        w += windingLine(xi, yi, x0, y0, x, y);\n      } // 如果被任何一个 subpath 包含\n      // if (w !== 0) {\n      //     return true;\n      // }\n\n    }\n\n    if (i == 1) {\n      // 如果第一个命令是 L, C, Q\n      // 则 previous point 同绘制命令的第一个 point\n      //\n      // 第一个命令为 Arc 的情况下会在后面特殊处理\n      xi = data[i];\n      yi = data[i + 1];\n      x0 = xi;\n      y0 = yi;\n    }\n\n    switch (cmd) {\n      case CMD.M:\n        // moveTo 命令重新创建一个新的 subpath, 并且更新新的起点\n        // 在 closePath 的时候使用\n        x0 = data[i++];\n        y0 = data[i++];\n        xi = x0;\n        yi = y0;\n        break;\n\n      case CMD.L:\n        if (isStroke) {\n          if (line.containStroke(xi, yi, data[i], data[i + 1], lineWidth, x, y)) {\n            return true;\n          }\n        } else {\n          // NOTE 在第一个命令为 L, C, Q 的时候会计算出 NaN\n          w += windingLine(xi, yi, data[i], data[i + 1], x, y) || 0;\n        }\n\n        xi = data[i++];\n        yi = data[i++];\n        break;\n\n      case CMD.C:\n        if (isStroke) {\n          if (cubic.containStroke(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], lineWidth, x, y)) {\n            return true;\n          }\n        } else {\n          w += windingCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], x, y) || 0;\n        }\n\n        xi = data[i++];\n        yi = data[i++];\n        break;\n\n      case CMD.Q:\n        if (isStroke) {\n          if (quadratic.containStroke(xi, yi, data[i++], data[i++], data[i], data[i + 1], lineWidth, x, y)) {\n            return true;\n          }\n        } else {\n          w += windingQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], x, y) || 0;\n        }\n\n        xi = data[i++];\n        yi = data[i++];\n        break;\n\n      case CMD.A:\n        // TODO Arc 判断的开销比较大\n        var cx = data[i++];\n        var cy = data[i++];\n        var rx = data[i++];\n        var ry = data[i++];\n        var theta = data[i++];\n        var dTheta = data[i++]; // TODO Arc 旋转\n\n        var psi = data[i++];\n        var anticlockwise = 1 - data[i++];\n        var x1 = Math.cos(theta) * rx + cx;\n        var y1 = Math.sin(theta) * ry + cy; // 不是直接使用 arc 命令\n\n        if (i > 1) {\n          w += windingLine(xi, yi, x1, y1, x, y);\n        } else {\n          // 第一个命令起点还未定义\n          x0 = x1;\n          y0 = y1;\n        } // zr 使用scale来模拟椭圆, 这里也对x做一定的缩放\n\n\n        var _x = (x - cx) * ry / rx + cx;\n\n        if (isStroke) {\n          if (arc.containStroke(cx, cy, ry, theta, theta + dTheta, anticlockwise, lineWidth, _x, y)) {\n            return true;\n          }\n        } else {\n          w += windingArc(cx, cy, ry, theta, theta + dTheta, anticlockwise, _x, y);\n        }\n\n        xi = Math.cos(theta + dTheta) * rx + cx;\n        yi = Math.sin(theta + dTheta) * ry + cy;\n        break;\n\n      case CMD.R:\n        x0 = xi = data[i++];\n        y0 = yi = data[i++];\n        var width = data[i++];\n        var height = data[i++];\n        var x1 = x0 + width;\n        var y1 = y0 + height;\n\n        if (isStroke) {\n          if (line.containStroke(x0, y0, x1, y0, lineWidth, x, y) || line.containStroke(x1, y0, x1, y1, lineWidth, x, y) || line.containStroke(x1, y1, x0, y1, lineWidth, x, y) || line.containStroke(x0, y1, x0, y0, lineWidth, x, y)) {\n            return true;\n          }\n        } else {\n          // FIXME Clockwise ?\n          w += windingLine(x1, y0, x1, y1, x, y);\n          w += windingLine(x0, y1, x0, y0, x, y);\n        }\n\n        break;\n\n      case CMD.Z:\n        if (isStroke) {\n          if (line.containStroke(xi, yi, x0, y0, lineWidth, x, y)) {\n            return true;\n          }\n        } else {\n          // Close a subpath\n          w += windingLine(xi, yi, x0, y0, x, y); // 如果被任何一个 subpath 包含\n          // FIXME subpaths may overlap\n          // if (w !== 0) {\n          //     return true;\n          // }\n        }\n\n        xi = x0;\n        yi = y0;\n        break;\n    }\n  }\n\n  if (!isStroke && !isAroundEqual(yi, y0)) {\n    w += windingLine(xi, yi, x0, y0, x, y) || 0;\n  }\n\n  return w !== 0;\n}\n\nfunction contain(pathData, x, y) {\n  return containPath(pathData, 0, false, x, y);\n}\n\nfunction containStroke(pathData, lineWidth, x, y) {\n  return containPath(pathData, lineWidth, true, x, y);\n}\n\nexports.contain = contain;\nexports.containStroke = containStroke;\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports) {\n\n/**\n * 线段包含判断\n * @param  {number}  x0\n * @param  {number}  y0\n * @param  {number}  x1\n * @param  {number}  y1\n * @param  {number}  lineWidth\n * @param  {number}  x\n * @param  {number}  y\n * @return {boolean}\n */\nfunction containStroke(x0, y0, x1, y1, lineWidth, x, y) {\n  if (lineWidth === 0) {\n    return false;\n  }\n\n  var _l = lineWidth;\n  var _a = 0;\n  var _b = x0; // Quick reject\n\n  if (y > y0 + _l && y > y1 + _l || y < y0 - _l && y < y1 - _l || x > x0 + _l && x > x1 + _l || x < x0 - _l && x < x1 - _l) {\n    return false;\n  }\n\n  if (x0 !== x1) {\n    _a = (y0 - y1) / (x0 - x1);\n    _b = (x0 * y1 - x1 * y0) / (x0 - x1);\n  } else {\n    return Math.abs(x - x0) <= _l / 2;\n  }\n\n  var tmp = _a * x - y + _b;\n\n  var _s = tmp * tmp / (_a * _a + 1);\n\n  return _s <= _l / 2 * _l / 2;\n}\n\nexports.containStroke = containStroke;\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar curve = __webpack_require__(4);\n\n/**\n * 三次贝塞尔曲线描边包含判断\n * @param  {number}  x0\n * @param  {number}  y0\n * @param  {number}  x1\n * @param  {number}  y1\n * @param  {number}  x2\n * @param  {number}  y2\n * @param  {number}  x3\n * @param  {number}  y3\n * @param  {number}  lineWidth\n * @param  {number}  x\n * @param  {number}  y\n * @return {boolean}\n */\nfunction containStroke(x0, y0, x1, y1, x2, y2, x3, y3, lineWidth, x, y) {\n  if (lineWidth === 0) {\n    return false;\n  }\n\n  var _l = lineWidth; // Quick reject\n\n  if (y > y0 + _l && y > y1 + _l && y > y2 + _l && y > y3 + _l || y < y0 - _l && y < y1 - _l && y < y2 - _l && y < y3 - _l || x > x0 + _l && x > x1 + _l && x > x2 + _l && x > x3 + _l || x < x0 - _l && x < x1 - _l && x < x2 - _l && x < x3 - _l) {\n    return false;\n  }\n\n  var d = curve.cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, null);\n  return d <= _l / 2;\n}\n\nexports.containStroke = containStroke;\n\n/***/ }),\n/* 53 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar _curve = __webpack_require__(4);\n\nvar quadraticProjectPoint = _curve.quadraticProjectPoint;\n\n/**\n * 二次贝塞尔曲线描边包含判断\n * @param  {number}  x0\n * @param  {number}  y0\n * @param  {number}  x1\n * @param  {number}  y1\n * @param  {number}  x2\n * @param  {number}  y2\n * @param  {number}  lineWidth\n * @param  {number}  x\n * @param  {number}  y\n * @return {boolean}\n */\nfunction containStroke(x0, y0, x1, y1, x2, y2, lineWidth, x, y) {\n  if (lineWidth === 0) {\n    return false;\n  }\n\n  var _l = lineWidth; // Quick reject\n\n  if (y > y0 + _l && y > y1 + _l && y > y2 + _l || y < y0 - _l && y < y1 - _l && y < y2 - _l || x > x0 + _l && x > x1 + _l && x > x2 + _l || x < x0 - _l && x < x1 - _l && x < x2 - _l) {\n    return false;\n  }\n\n  var d = quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, null);\n  return d <= _l / 2;\n}\n\nexports.containStroke = containStroke;\n\n/***/ }),\n/* 54 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar _util = __webpack_require__(22);\n\nvar normalizeRadian = _util.normalizeRadian;\nvar PI2 = Math.PI * 2;\n/**\n * 圆弧描边包含判断\n * @param  {number}  cx\n * @param  {number}  cy\n * @param  {number}  r\n * @param  {number}  startAngle\n * @param  {number}  endAngle\n * @param  {boolean}  anticlockwise\n * @param  {number} lineWidth\n * @param  {number}  x\n * @param  {number}  y\n * @return {Boolean}\n */\n\nfunction containStroke(cx, cy, r, startAngle, endAngle, anticlockwise, lineWidth, x, y) {\n  if (lineWidth === 0) {\n    return false;\n  }\n\n  var _l = lineWidth;\n  x -= cx;\n  y -= cy;\n  var d = Math.sqrt(x * x + y * y);\n\n  if (d - _l > r || d + _l < r) {\n    return false;\n  }\n\n  if (Math.abs(startAngle - endAngle) % PI2 < 1e-4) {\n    // Is a circle\n    return true;\n  }\n\n  if (anticlockwise) {\n    var tmp = startAngle;\n    startAngle = normalizeRadian(endAngle);\n    endAngle = normalizeRadian(tmp);\n  } else {\n    startAngle = normalizeRadian(startAngle);\n    endAngle = normalizeRadian(endAngle);\n  }\n\n  if (startAngle > endAngle) {\n    endAngle += PI2;\n  }\n\n  var angle = Math.atan2(y, x);\n\n  if (angle < 0) {\n    angle += PI2;\n  }\n\n  return angle >= startAngle && angle <= endAngle || angle + PI2 >= startAngle && angle + PI2 <= endAngle;\n}\n\nexports.containStroke = containStroke;\n\n/***/ }),\n/* 55 */\n/***/ (function(module, exports) {\n\nfunction windingLine(x0, y0, x1, y1, x, y) {\n  if (y > y0 && y > y1 || y < y0 && y < y1) {\n    return 0;\n  } // Ignore horizontal line\n\n\n  if (y1 === y0) {\n    return 0;\n  }\n\n  var dir = y1 < y0 ? 1 : -1;\n  var t = (y - y0) / (y1 - y0); // Avoid winding error when intersection point is the connect point of two line of polygon\n\n  if (t === 1 || t === 0) {\n    dir = y1 < y0 ? 0.5 : -0.5;\n  }\n\n  var x_ = t * (x1 - x0) + x0;\n  return x_ > x ? dir : 0;\n}\n\nmodule.exports = windingLine;\n\n/***/ }),\n/* 56 */\n/***/ (function(module, exports) {\n\nvar Pattern = function (image, repeat) {\n  // Should do nothing more in this constructor. Because gradient can be\n  // declard by `color: {image: ...}`, where this constructor will not be called.\n  this.image = image;\n  this.repeat = repeat; // Can be cloned\n\n  this.type = 'pattern';\n};\n\nPattern.prototype.getCanvasPattern = function (ctx) {\n  return ctx.createPattern(this.image, this.repeat || 'repeat');\n};\n\nvar _default = Pattern;\nmodule.exports = _default;\n\n/***/ }),\n/* 57 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar PathProxy = __webpack_require__(6);\n\nvar _vector = __webpack_require__(2);\n\nvar v2ApplyTransform = _vector.applyTransform;\nvar CMD = PathProxy.CMD;\nvar points = [[], [], []];\nvar mathSqrt = Math.sqrt;\nvar mathAtan2 = Math.atan2;\n\nfunction _default(path, m) {\n  var data = path.data;\n  var cmd;\n  var nPoint;\n  var i;\n  var j;\n  var k;\n  var p;\n  var M = CMD.M;\n  var C = CMD.C;\n  var L = CMD.L;\n  var R = CMD.R;\n  var A = CMD.A;\n  var Q = CMD.Q;\n\n  for (i = 0, j = 0; i < data.length;) {\n    cmd = data[i++];\n    j = i;\n    nPoint = 0;\n\n    switch (cmd) {\n      case M:\n        nPoint = 1;\n        break;\n\n      case L:\n        nPoint = 1;\n        break;\n\n      case C:\n        nPoint = 3;\n        break;\n\n      case Q:\n        nPoint = 2;\n        break;\n\n      case A:\n        var x = m[4];\n        var y = m[5];\n        var sx = mathSqrt(m[0] * m[0] + m[1] * m[1]);\n        var sy = mathSqrt(m[2] * m[2] + m[3] * m[3]);\n        var angle = mathAtan2(-m[1] / sy, m[0] / sx); // cx\n\n        data[i] *= sx;\n        data[i++] += x; // cy\n\n        data[i] *= sy;\n        data[i++] += y; // Scale rx and ry\n        // FIXME Assume psi is 0 here\n\n        data[i++] *= sx;\n        data[i++] *= sy; // Start angle\n\n        data[i++] += angle; // end angle\n\n        data[i++] += angle; // FIXME psi\n\n        i += 2;\n        j = i;\n        break;\n\n      case R:\n        // x0, y0\n        p[0] = data[i++];\n        p[1] = data[i++];\n        v2ApplyTransform(p, p, m);\n        data[j++] = p[0];\n        data[j++] = p[1]; // x1, y1\n\n        p[0] += data[i++];\n        p[1] += data[i++];\n        v2ApplyTransform(p, p, m);\n        data[j++] = p[0];\n        data[j++] = p[1];\n    }\n\n    for (k = 0; k < nPoint; k++) {\n      var p = points[k];\n      p[0] = data[i++];\n      p[1] = data[i++];\n      v2ApplyTransform(p, p, m); // Write back\n\n      data[j++] = p[0];\n      data[j++] = p[1];\n    }\n  }\n}\n\nmodule.exports = _default;\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Displayable = __webpack_require__(12);\n\nvar BoundingRect = __webpack_require__(3);\n\nvar zrUtil = __webpack_require__(0);\n\nvar imageHelper = __webpack_require__(10);\n\n/**\n * @alias zrender/graphic/Image\n * @extends module:zrender/graphic/Displayable\n * @constructor\n * @param {Object} opts\n */\nfunction ZImage(opts) {\n  Displayable.call(this, opts);\n}\n\nZImage.prototype = {\n  constructor: ZImage,\n  type: 'image',\n  brush: function (ctx, prevEl) {\n    var style = this.style;\n    var src = style.image; // Must bind each time\n\n    style.bind(ctx, this, prevEl);\n    var image = this._image = imageHelper.createOrUpdateImage(src, this._image, this, this.onload);\n\n    if (!image || !imageHelper.isImageReady(image)) {\n      return;\n    } // 图片已经加载完成\n    // if (image.nodeName.toUpperCase() == 'IMG') {\n    //     if (!image.complete) {\n    //         return;\n    //     }\n    // }\n    // Else is canvas\n\n\n    var x = style.x || 0;\n    var y = style.y || 0;\n    var width = style.width;\n    var height = style.height;\n    var aspect = image.width / image.height;\n\n    if (width == null && height != null) {\n      // Keep image/height ratio\n      width = height * aspect;\n    } else if (height == null && width != null) {\n      height = width / aspect;\n    } else if (width == null && height == null) {\n      width = image.width;\n      height = image.height;\n    } // 设置transform\n\n\n    this.setTransform(ctx);\n\n    if (style.sWidth && style.sHeight) {\n      var sx = style.sx || 0;\n      var sy = style.sy || 0;\n      ctx.drawImage(image, sx, sy, style.sWidth, style.sHeight, x, y, width, height);\n    } else if (style.sx && style.sy) {\n      var sx = style.sx;\n      var sy = style.sy;\n      var sWidth = width - sx;\n      var sHeight = height - sy;\n      ctx.drawImage(image, sx, sy, sWidth, sHeight, x, y, width, height);\n    } else {\n      ctx.drawImage(image, x, y, width, height);\n    }\n\n    this.restoreTransform(ctx); // Draw rect text\n\n    if (style.text != null) {\n      this.drawRectText(ctx, this.getBoundingRect());\n    }\n  },\n  getBoundingRect: function () {\n    var style = this.style;\n\n    if (!this._rect) {\n      this._rect = new BoundingRect(style.x || 0, style.y || 0, style.width || 0, style.height || 0);\n    }\n\n    return this._rect;\n  }\n};\nzrUtil.inherits(ZImage, Displayable);\nvar _default = ZImage;\nmodule.exports = _default;\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar zrUtil = __webpack_require__(0);\n\nvar Element = __webpack_require__(16);\n\nvar BoundingRect = __webpack_require__(3);\n\n/**\n * Group是一个容器，可以插入子节点，Group的变换也会被应用到子节点上\n * @module zrender/graphic/Group\n * @example\n *     var Group = require('zrender/container/Group');\n *     var Circle = require('zrender/graphic/shape/Circle');\n *     var g = new Group();\n *     g.position[0] = 100;\n *     g.position[1] = 100;\n *     g.add(new Circle({\n *         style: {\n *             x: 100,\n *             y: 100,\n *             r: 20,\n *         }\n *     }));\n *     zr.add(g);\n */\n\n/**\n * @alias module:zrender/graphic/Group\n * @constructor\n * @extends module:zrender/mixin/Transformable\n * @extends module:zrender/mixin/Eventful\n */\nvar Group = function (opts) {\n  opts = opts || {};\n  Element.call(this, opts);\n\n  for (var key in opts) {\n    if (opts.hasOwnProperty(key)) {\n      this[key] = opts[key];\n    }\n  }\n\n  this._children = [];\n  this.__storage = null;\n  this.__dirty = true;\n};\n\nGroup.prototype = {\n  constructor: Group,\n  isGroup: true,\n\n  /**\n   * @type {string}\n   */\n  type: 'group',\n\n  /**\n   * 所有子孙元素是否响应鼠标事件\n   * @name module:/zrender/container/Group#silent\n   * @type {boolean}\n   * @default false\n   */\n  silent: false,\n\n  /**\n   * @return {Array.<module:zrender/Element>}\n   */\n  children: function () {\n    return this._children.slice();\n  },\n\n  /**\n   * 获取指定 index 的儿子节点\n   * @param  {number} idx\n   * @return {module:zrender/Element}\n   */\n  childAt: function (idx) {\n    return this._children[idx];\n  },\n\n  /**\n   * 获取指定名字的儿子节点\n   * @param  {string} name\n   * @return {module:zrender/Element}\n   */\n  childOfName: function (name) {\n    var children = this._children;\n\n    for (var i = 0; i < children.length; i++) {\n      if (children[i].name === name) {\n        return children[i];\n      }\n    }\n  },\n\n  /**\n   * @return {number}\n   */\n  childCount: function () {\n    return this._children.length;\n  },\n\n  /**\n   * 添加子节点到最后\n   * @param {module:zrender/Element} child\n   */\n  add: function (child) {\n    if (child && child !== this && child.parent !== this) {\n      this._children.push(child);\n\n      this._doAdd(child);\n    }\n\n    return this;\n  },\n\n  /**\n   * 添加子节点在 nextSibling 之前\n   * @param {module:zrender/Element} child\n   * @param {module:zrender/Element} nextSibling\n   */\n  addBefore: function (child, nextSibling) {\n    if (child && child !== this && child.parent !== this && nextSibling && nextSibling.parent === this) {\n      var children = this._children;\n      var idx = children.indexOf(nextSibling);\n\n      if (idx >= 0) {\n        children.splice(idx, 0, child);\n\n        this._doAdd(child);\n      }\n    }\n\n    return this;\n  },\n  _doAdd: function (child) {\n    if (child.parent) {\n      child.parent.remove(child);\n    }\n\n    child.parent = this;\n    var storage = this.__storage;\n    var zr = this.__zr;\n\n    if (storage && storage !== child.__storage) {\n      storage.addToStorage(child);\n\n      if (child instanceof Group) {\n        child.addChildrenToStorage(storage);\n      }\n    }\n\n    zr && zr.refresh();\n  },\n\n  /**\n   * 移除子节点\n   * @param {module:zrender/Element} child\n   */\n  remove: function (child) {\n    var zr = this.__zr;\n    var storage = this.__storage;\n    var children = this._children;\n    var idx = zrUtil.indexOf(children, child);\n\n    if (idx < 0) {\n      return this;\n    }\n\n    children.splice(idx, 1);\n    child.parent = null;\n\n    if (storage) {\n      storage.delFromStorage(child);\n\n      if (child instanceof Group) {\n        child.delChildrenFromStorage(storage);\n      }\n    }\n\n    zr && zr.refresh();\n    return this;\n  },\n\n  /**\n   * 移除所有子节点\n   */\n  removeAll: function () {\n    var children = this._children;\n    var storage = this.__storage;\n    var child;\n    var i;\n\n    for (i = 0; i < children.length; i++) {\n      child = children[i];\n\n      if (storage) {\n        storage.delFromStorage(child);\n\n        if (child instanceof Group) {\n          child.delChildrenFromStorage(storage);\n        }\n      }\n\n      child.parent = null;\n    }\n\n    children.length = 0;\n    return this;\n  },\n\n  /**\n   * 遍历所有子节点\n   * @param  {Function} cb\n   * @param  {}   context\n   */\n  eachChild: function (cb, context) {\n    var children = this._children;\n\n    for (var i = 0; i < children.length; i++) {\n      var child = children[i];\n      cb.call(context, child, i);\n    }\n\n    return this;\n  },\n\n  /**\n   * 深度优先遍历所有子孙节点\n   * @param  {Function} cb\n   * @param  {}   context\n   */\n  traverse: function (cb, context) {\n    for (var i = 0; i < this._children.length; i++) {\n      var child = this._children[i];\n      cb.call(context, child);\n\n      if (child.type === 'group') {\n        child.traverse(cb, context);\n      }\n    }\n\n    return this;\n  },\n  addChildrenToStorage: function (storage) {\n    for (var i = 0; i < this._children.length; i++) {\n      var child = this._children[i];\n      storage.addToStorage(child);\n\n      if (child instanceof Group) {\n        child.addChildrenToStorage(storage);\n      }\n    }\n  },\n  delChildrenFromStorage: function (storage) {\n    for (var i = 0; i < this._children.length; i++) {\n      var child = this._children[i];\n      storage.delFromStorage(child);\n\n      if (child instanceof Group) {\n        child.delChildrenFromStorage(storage);\n      }\n    }\n  },\n  dirty: function () {\n    this.__dirty = true;\n    this.__zr && this.__zr.refresh();\n    return this;\n  },\n\n  /**\n   * @return {module:zrender/core/BoundingRect}\n   */\n  getBoundingRect: function (includeChildren) {\n    // TODO Caching\n    var rect = null;\n    var tmpRect = new BoundingRect(0, 0, 0, 0);\n    var children = includeChildren || this._children;\n    var tmpMat = [];\n\n    for (var i = 0; i < children.length; i++) {\n      var child = children[i];\n\n      if (child.ignore || child.invisible) {\n        continue;\n      }\n\n      var childRect = child.getBoundingRect();\n      var transform = child.getLocalTransform(tmpMat); // TODO\n      // The boundingRect cacluated by transforming original\n      // rect may be bigger than the actual bundingRect when rotation\n      // is used. (Consider a circle rotated aginst its center, where\n      // the actual boundingRect should be the same as that not be\n      // rotated.) But we can not find better approach to calculate\n      // actual boundingRect yet, considering performance.\n\n      if (transform) {\n        tmpRect.copy(childRect);\n        tmpRect.applyTransform(transform);\n        rect = rect || tmpRect.clone();\n        rect.union(tmpRect);\n      } else {\n        rect = rect || childRect.clone();\n        rect.union(childRect);\n      }\n    }\n\n    return rect || tmpRect;\n  }\n};\nzrUtil.inherits(Group, Element);\nvar _default = Group;\nmodule.exports = _default;\n\n/***/ }),\n/* 60 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Displayable = __webpack_require__(12);\n\nvar zrUtil = __webpack_require__(0);\n\nvar textContain = __webpack_require__(5);\n\nvar textHelper = __webpack_require__(20);\n\n/**\n * @alias zrender/graphic/Text\n * @extends module:zrender/graphic/Displayable\n * @constructor\n * @param {Object} opts\n */\nvar Text = function (opts) {\n  // jshint ignore:line\n  Displayable.call(this, opts);\n};\n\nText.prototype = {\n  constructor: Text,\n  type: 'text',\n  brush: function (ctx, prevEl) {\n    var style = this.style; // Optimize, avoid normalize every time.\n\n    this.__dirty && textHelper.normalizeTextStyle(style, true); // Use props with prefix 'text'.\n\n    style.fill = style.stroke = style.shadowBlur = style.shadowColor = style.shadowOffsetX = style.shadowOffsetY = null;\n    var text = style.text; // Convert to string\n\n    text != null && (text += ''); // Always bind style\n\n    style.bind(ctx, this, prevEl);\n\n    if (!textHelper.needDrawText(text, style)) {\n      return;\n    }\n\n    this.setTransform(ctx);\n    textHelper.renderText(this, ctx, text, style);\n    this.restoreTransform(ctx);\n  },\n  getBoundingRect: function () {\n    var style = this.style; // Optimize, avoid normalize every time.\n\n    this.__dirty && textHelper.normalizeTextStyle(style, true);\n\n    if (!this._rect) {\n      var text = style.text;\n      text != null ? text += '' : text = '';\n      var rect = textContain.getBoundingRect(style.text + '', style.font, style.textAlign, style.textVerticalAlign, style.textPadding, style.rich);\n      rect.x += style.x || 0;\n      rect.y += style.y || 0;\n\n      if (textHelper.getStroke(style.textStroke, style.textStrokeWidth)) {\n        var w = style.textStrokeWidth;\n        rect.x -= w / 2;\n        rect.y -= w / 2;\n        rect.width += w;\n        rect.height += w;\n      }\n\n      this._rect = rect;\n    }\n\n    return this._rect;\n  }\n};\nzrUtil.inherits(Text, Displayable);\nvar _default = Text;\nmodule.exports = _default;\n\n/***/ }),\n/* 61 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Path = __webpack_require__(1);\n\n/**\n * 圆形\n * @module zrender/shape/Circle\n */\nvar _default = Path.extend({\n  type: 'circle',\n  shape: {\n    cx: 0,\n    cy: 0,\n    r: 0\n  },\n  buildPath: function (ctx, shape, inBundle) {\n    // Better stroking in ShapeBundle\n    // Always do it may have performence issue ( fill may be 2x more cost)\n    if (inBundle) {\n      ctx.moveTo(shape.cx + shape.r, shape.cy);\n    } // else {\n    //     if (ctx.allocate && !ctx.data.length) {\n    //         ctx.allocate(ctx.CMD_MEM_SIZE.A);\n    //     }\n    // }\n    // Better stroking in ShapeBundle\n    // ctx.moveTo(shape.cx + shape.r, shape.cy);\n\n\n    ctx.arc(shape.cx, shape.cy, shape.r, 0, Math.PI * 2, true);\n  }\n});\n\nmodule.exports = _default;\n\n/***/ }),\n/* 62 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Path = __webpack_require__(1);\n\nvar fixClipWithShadow = __webpack_require__(63);\n\n/**\n * 扇形\n * @module zrender/graphic/shape/Sector\n */\nvar _default = Path.extend({\n  type: 'sector',\n  shape: {\n    cx: 0,\n    cy: 0,\n    r0: 0,\n    r: 0,\n    startAngle: 0,\n    endAngle: Math.PI * 2,\n    clockwise: true\n  },\n  brush: fixClipWithShadow(Path.prototype.brush),\n  buildPath: function (ctx, shape) {\n    var x = shape.cx;\n    var y = shape.cy;\n    var r0 = Math.max(shape.r0 || 0, 0);\n    var r = Math.max(shape.r, 0);\n    var startAngle = shape.startAngle;\n    var endAngle = shape.endAngle;\n    var clockwise = shape.clockwise;\n    var unitX = Math.cos(startAngle);\n    var unitY = Math.sin(startAngle);\n    ctx.moveTo(unitX * r0 + x, unitY * r0 + y);\n    ctx.lineTo(unitX * r + x, unitY * r + y);\n    ctx.arc(x, y, r, startAngle, endAngle, !clockwise);\n    ctx.lineTo(Math.cos(endAngle) * r0 + x, Math.sin(endAngle) * r0 + y);\n\n    if (r0 !== 0) {\n      ctx.arc(x, y, r0, endAngle, startAngle, clockwise);\n    }\n\n    ctx.closePath();\n  }\n});\n\nmodule.exports = _default;\n\n/***/ }),\n/* 63 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar env = __webpack_require__(15);\n\n// Fix weird bug in some version of IE11 (like 11.0.9600.178**),\n// where exception \"unexpected call to method or property access\"\n// might be thrown when calling ctx.fill or ctx.stroke after a path\n// whose area size is zero is drawn and ctx.clip() is called and\n// shadowBlur is set. See #4572, #3112, #5777.\n// (e.g.,\n//  ctx.moveTo(10, 10);\n//  ctx.lineTo(20, 10);\n//  ctx.closePath();\n//  ctx.clip();\n//  ctx.shadowBlur = 10;\n//  ...\n//  ctx.fill();\n// )\nvar shadowTemp = [['shadowBlur', 0], ['shadowColor', '#000'], ['shadowOffsetX', 0], ['shadowOffsetY', 0]];\n\nfunction _default(orignalBrush) {\n  // version string can be: '11.0'\n  return env.browser.ie && env.browser.version >= 11 ? function () {\n    var clipPaths = this.__clipPaths;\n    var style = this.style;\n    var modified;\n\n    if (clipPaths) {\n      for (var i = 0; i < clipPaths.length; i++) {\n        var clipPath = clipPaths[i];\n        var shape = clipPath && clipPath.shape;\n        var type = clipPath && clipPath.type;\n\n        if (shape && (type === 'sector' && shape.startAngle === shape.endAngle || type === 'rect' && (!shape.width || !shape.height))) {\n          for (var j = 0; j < shadowTemp.length; j++) {\n            // It is save to put shadowTemp static, because shadowTemp\n            // will be all modified each item brush called.\n            shadowTemp[j][2] = style[shadowTemp[j][0]];\n            style[shadowTemp[j][0]] = shadowTemp[j][1];\n          }\n\n          modified = true;\n          break;\n        }\n      }\n    }\n\n    orignalBrush.apply(this, arguments);\n\n    if (modified) {\n      for (var j = 0; j < shadowTemp.length; j++) {\n        style[shadowTemp[j][0]] = shadowTemp[j][2];\n      }\n    }\n  } : orignalBrush;\n}\n\nmodule.exports = _default;\n\n/***/ }),\n/* 64 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Path = __webpack_require__(1);\n\n/**\n * 圆环\n * @module zrender/graphic/shape/Ring\n */\nvar _default = Path.extend({\n  type: 'ring',\n  shape: {\n    cx: 0,\n    cy: 0,\n    r: 0,\n    r0: 0\n  },\n  buildPath: function (ctx, shape) {\n    var x = shape.cx;\n    var y = shape.cy;\n    var PI2 = Math.PI * 2;\n    ctx.moveTo(x + shape.r, y);\n    ctx.arc(x, y, shape.r, 0, PI2, false);\n    ctx.moveTo(x + shape.r0, y);\n    ctx.arc(x, y, shape.r0, 0, PI2, true);\n  }\n});\n\nmodule.exports = _default;\n\n/***/ }),\n/* 65 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Path = __webpack_require__(1);\n\nvar polyHelper = __webpack_require__(23);\n\n/**\n * 多边形\n * @module zrender/shape/Polygon\n */\nvar _default = Path.extend({\n  type: 'polygon',\n  shape: {\n    points: null,\n    smooth: false,\n    smoothConstraint: null\n  },\n  buildPath: function (ctx, shape) {\n    polyHelper.buildPath(ctx, shape, true);\n  }\n});\n\nmodule.exports = _default;\n\n/***/ }),\n/* 66 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar _vector = __webpack_require__(2);\n\nvar v2Distance = _vector.distance;\n\n/**\n * Catmull-Rom spline 插值折线\n * @module zrender/shape/util/smoothSpline\n * @author pissang (https://www.github.com/pissang)\n *         Kener (@Kener-林峰, kener.linfeng@gmail.com)\n *         errorrik (errorrik@gmail.com)\n */\n\n/**\n * @inner\n */\nfunction interpolate(p0, p1, p2, p3, t, t2, t3) {\n  var v0 = (p2 - p0) * 0.5;\n  var v1 = (p3 - p1) * 0.5;\n  return (2 * (p1 - p2) + v0 + v1) * t3 + (-3 * (p1 - p2) - 2 * v0 - v1) * t2 + v0 * t + p1;\n}\n/**\n * @alias module:zrender/shape/util/smoothSpline\n * @param {Array} points 线段顶点数组\n * @param {boolean} isLoop\n * @return {Array}\n */\n\n\nfunction _default(points, isLoop) {\n  var len = points.length;\n  var ret = [];\n  var distance = 0;\n\n  for (var i = 1; i < len; i++) {\n    distance += v2Distance(points[i - 1], points[i]);\n  }\n\n  var segs = distance / 2;\n  segs = segs < len ? len : segs;\n\n  for (var i = 0; i < segs; i++) {\n    var pos = i / (segs - 1) * (isLoop ? len : len - 1);\n    var idx = Math.floor(pos);\n    var w = pos - idx;\n    var p0;\n    var p1 = points[idx % len];\n    var p2;\n    var p3;\n\n    if (!isLoop) {\n      p0 = points[idx === 0 ? idx : idx - 1];\n      p2 = points[idx > len - 2 ? len - 1 : idx + 1];\n      p3 = points[idx > len - 3 ? len - 1 : idx + 2];\n    } else {\n      p0 = points[(idx - 1 + len) % len];\n      p2 = points[(idx + 1) % len];\n      p3 = points[(idx + 2) % len];\n    }\n\n    var w2 = w * w;\n    var w3 = w * w2;\n    ret.push([interpolate(p0[0], p1[0], p2[0], p3[0], w, w2, w3), interpolate(p0[1], p1[1], p2[1], p3[1], w, w2, w3)]);\n  }\n\n  return ret;\n}\n\nmodule.exports = _default;\n\n/***/ }),\n/* 67 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar _vector = __webpack_require__(2);\n\nvar v2Min = _vector.min;\nvar v2Max = _vector.max;\nvar v2Scale = _vector.scale;\nvar v2Distance = _vector.distance;\nvar v2Add = _vector.add;\nvar v2Clone = _vector.clone;\nvar v2Sub = _vector.sub;\n\n/**\n * 贝塞尔平滑曲线\n * @module zrender/shape/util/smoothBezier\n * @author pissang (https://www.github.com/pissang)\n *         Kener (@Kener-林峰, kener.linfeng@gmail.com)\n *         errorrik (errorrik@gmail.com)\n */\n\n/**\n * 贝塞尔平滑曲线\n * @alias module:zrender/shape/util/smoothBezier\n * @param {Array} points 线段顶点数组\n * @param {number} smooth 平滑等级, 0-1\n * @param {boolean} isLoop\n * @param {Array} constraint 将计算出来的控制点约束在一个包围盒内\n *                           比如 [[0, 0], [100, 100]], 这个包围盒会与\n *                           整个折线的包围盒做一个并集用来约束控制点。\n * @param {Array} 计算出来的控制点数组\n */\nfunction _default(points, smooth, isLoop, constraint) {\n  var cps = [];\n  var v = [];\n  var v1 = [];\n  var v2 = [];\n  var prevPoint;\n  var nextPoint;\n  var min, max;\n\n  if (constraint) {\n    min = [Infinity, Infinity];\n    max = [-Infinity, -Infinity];\n\n    for (var i = 0, len = points.length; i < len; i++) {\n      v2Min(min, min, points[i]);\n      v2Max(max, max, points[i]);\n    } // 与指定的包围盒做并集\n\n\n    v2Min(min, min, constraint[0]);\n    v2Max(max, max, constraint[1]);\n  }\n\n  for (var i = 0, len = points.length; i < len; i++) {\n    var point = points[i];\n\n    if (isLoop) {\n      prevPoint = points[i ? i - 1 : len - 1];\n      nextPoint = points[(i + 1) % len];\n    } else {\n      if (i === 0 || i === len - 1) {\n        cps.push(v2Clone(points[i]));\n        continue;\n      } else {\n        prevPoint = points[i - 1];\n        nextPoint = points[i + 1];\n      }\n    }\n\n    v2Sub(v, nextPoint, prevPoint); // use degree to scale the handle length\n\n    v2Scale(v, v, smooth);\n    var d0 = v2Distance(point, prevPoint);\n    var d1 = v2Distance(point, nextPoint);\n    var sum = d0 + d1;\n\n    if (sum !== 0) {\n      d0 /= sum;\n      d1 /= sum;\n    }\n\n    v2Scale(v1, v, -d0);\n    v2Scale(v2, v, d1);\n    var cp0 = v2Add([], point, v1);\n    var cp1 = v2Add([], point, v2);\n\n    if (constraint) {\n      v2Max(cp0, cp0, min);\n      v2Min(cp0, cp0, max);\n      v2Max(cp1, cp1, min);\n      v2Min(cp1, cp1, max);\n    }\n\n    cps.push(cp0);\n    cps.push(cp1);\n  }\n\n  if (isLoop) {\n    cps.push(cps.shift());\n  }\n\n  return cps;\n}\n\nmodule.exports = _default;\n\n/***/ }),\n/* 68 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Path = __webpack_require__(1);\n\nvar polyHelper = __webpack_require__(23);\n\n/**\n * @module zrender/graphic/shape/Polyline\n */\nvar _default = Path.extend({\n  type: 'polyline',\n  shape: {\n    points: null,\n    smooth: false,\n    smoothConstraint: null\n  },\n  style: {\n    stroke: '#000',\n    fill: null\n  },\n  buildPath: function (ctx, shape) {\n    polyHelper.buildPath(ctx, shape, false);\n  }\n});\n\nmodule.exports = _default;\n\n/***/ }),\n/* 69 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Path = __webpack_require__(1);\n\nvar roundRectHelper = __webpack_require__(21);\n\n/**\n * 矩形\n * @module zrender/graphic/shape/Rect\n */\nvar _default = Path.extend({\n  type: 'rect',\n  shape: {\n    // 左上、右上、右下、左下角的半径依次为r1、r2、r3、r4\n    // r缩写为1         相当于 [1, 1, 1, 1]\n    // r缩写为[1]       相当于 [1, 1, 1, 1]\n    // r缩写为[1, 2]    相当于 [1, 2, 1, 2]\n    // r缩写为[1, 2, 3] 相当于 [1, 2, 3, 2]\n    r: 0,\n    x: 0,\n    y: 0,\n    width: 0,\n    height: 0\n  },\n  buildPath: function (ctx, shape) {\n    var x = shape.x;\n    var y = shape.y;\n    var width = shape.width;\n    var height = shape.height;\n\n    if (!shape.r) {\n      ctx.rect(x, y, width, height);\n    } else {\n      roundRectHelper.buildPath(ctx, shape);\n    }\n\n    ctx.closePath();\n    return;\n  }\n});\n\nmodule.exports = _default;\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Path = __webpack_require__(1);\n\n/**\n * 直线\n * @module zrender/graphic/shape/Line\n */\nvar _default = Path.extend({\n  type: 'line',\n  shape: {\n    // Start point\n    x1: 0,\n    y1: 0,\n    // End point\n    x2: 0,\n    y2: 0,\n    percent: 1\n  },\n  style: {\n    stroke: '#000',\n    fill: null\n  },\n  buildPath: function (ctx, shape) {\n    var x1 = shape.x1;\n    var y1 = shape.y1;\n    var x2 = shape.x2;\n    var y2 = shape.y2;\n    var percent = shape.percent;\n\n    if (percent === 0) {\n      return;\n    }\n\n    ctx.moveTo(x1, y1);\n\n    if (percent < 1) {\n      x2 = x1 * (1 - percent) + x2 * percent;\n      y2 = y1 * (1 - percent) + y2 * percent;\n    }\n\n    ctx.lineTo(x2, y2);\n  },\n\n  /**\n   * Get point at percent\n   * @param  {number} percent\n   * @return {Array.<number>}\n   */\n  pointAt: function (p) {\n    var shape = this.shape;\n    return [shape.x1 * (1 - p) + shape.x2 * p, shape.y1 * (1 - p) + shape.y2 * p];\n  }\n});\n\nmodule.exports = _default;\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Path = __webpack_require__(1);\n\nvar vec2 = __webpack_require__(2);\n\nvar _curve = __webpack_require__(4);\n\nvar quadraticSubdivide = _curve.quadraticSubdivide;\nvar cubicSubdivide = _curve.cubicSubdivide;\nvar quadraticAt = _curve.quadraticAt;\nvar cubicAt = _curve.cubicAt;\nvar quadraticDerivativeAt = _curve.quadraticDerivativeAt;\nvar cubicDerivativeAt = _curve.cubicDerivativeAt;\n\n/**\n * 贝塞尔曲线\n * @module zrender/shape/BezierCurve\n */\nvar out = [];\n\nfunction someVectorAt(shape, t, isTangent) {\n  var cpx2 = shape.cpx2;\n  var cpy2 = shape.cpy2;\n\n  if (cpx2 === null || cpy2 === null) {\n    return [(isTangent ? cubicDerivativeAt : cubicAt)(shape.x1, shape.cpx1, shape.cpx2, shape.x2, t), (isTangent ? cubicDerivativeAt : cubicAt)(shape.y1, shape.cpy1, shape.cpy2, shape.y2, t)];\n  } else {\n    return [(isTangent ? quadraticDerivativeAt : quadraticAt)(shape.x1, shape.cpx1, shape.x2, t), (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.y1, shape.cpy1, shape.y2, t)];\n  }\n}\n\nvar _default = Path.extend({\n  type: 'bezier-curve',\n  shape: {\n    x1: 0,\n    y1: 0,\n    x2: 0,\n    y2: 0,\n    cpx1: 0,\n    cpy1: 0,\n    // cpx2: 0,\n    // cpy2: 0\n    // Curve show percent, for animating\n    percent: 1\n  },\n  style: {\n    stroke: '#000',\n    fill: null\n  },\n  buildPath: function (ctx, shape) {\n    var x1 = shape.x1;\n    var y1 = shape.y1;\n    var x2 = shape.x2;\n    var y2 = shape.y2;\n    var cpx1 = shape.cpx1;\n    var cpy1 = shape.cpy1;\n    var cpx2 = shape.cpx2;\n    var cpy2 = shape.cpy2;\n    var percent = shape.percent;\n\n    if (percent === 0) {\n      return;\n    }\n\n    ctx.moveTo(x1, y1);\n\n    if (cpx2 == null || cpy2 == null) {\n      if (percent < 1) {\n        quadraticSubdivide(x1, cpx1, x2, percent, out);\n        cpx1 = out[1];\n        x2 = out[2];\n        quadraticSubdivide(y1, cpy1, y2, percent, out);\n        cpy1 = out[1];\n        y2 = out[2];\n      }\n\n      ctx.quadraticCurveTo(cpx1, cpy1, x2, y2);\n    } else {\n      if (percent < 1) {\n        cubicSubdivide(x1, cpx1, cpx2, x2, percent, out);\n        cpx1 = out[1];\n        cpx2 = out[2];\n        x2 = out[3];\n        cubicSubdivide(y1, cpy1, cpy2, y2, percent, out);\n        cpy1 = out[1];\n        cpy2 = out[2];\n        y2 = out[3];\n      }\n\n      ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2);\n    }\n  },\n\n  /**\n   * Get point at percent\n   * @param  {number} t\n   * @return {Array.<number>}\n   */\n  pointAt: function (t) {\n    return someVectorAt(this.shape, t, false);\n  },\n\n  /**\n   * Get tangent at percent\n   * @param  {number} t\n   * @return {Array.<number>}\n   */\n  tangentAt: function (t) {\n    var p = someVectorAt(this.shape, t, true);\n    return vec2.normalize(p, p);\n  }\n});\n\nmodule.exports = _default;\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Path = __webpack_require__(1);\n\n/**\n * 圆弧\n * @module zrender/graphic/shape/Arc\n */\nvar _default = Path.extend({\n  type: 'arc',\n  shape: {\n    cx: 0,\n    cy: 0,\n    r: 0,\n    startAngle: 0,\n    endAngle: Math.PI * 2,\n    clockwise: true\n  },\n  style: {\n    stroke: '#000',\n    fill: null\n  },\n  buildPath: function (ctx, shape) {\n    var x = shape.cx;\n    var y = shape.cy;\n    var r = Math.max(shape.r, 0);\n    var startAngle = shape.startAngle;\n    var endAngle = shape.endAngle;\n    var clockwise = shape.clockwise;\n    var unitX = Math.cos(startAngle);\n    var unitY = Math.sin(startAngle);\n    ctx.moveTo(unitX * r + x, unitY * r + y);\n    ctx.arc(x, y, r, startAngle, endAngle, !clockwise);\n  }\n});\n\nmodule.exports = _default;\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Path = __webpack_require__(1);\n\n// CompoundPath to improve performance\nvar _default = Path.extend({\n  type: 'compound',\n  shape: {\n    paths: null\n  },\n  _updatePathDirty: function () {\n    var dirtyPath = this.__dirtyPath;\n    var paths = this.shape.paths;\n\n    for (var i = 0; i < paths.length; i++) {\n      // Mark as dirty if any subpath is dirty\n      dirtyPath = dirtyPath || paths[i].__dirtyPath;\n    }\n\n    this.__dirtyPath = dirtyPath;\n    this.__dirty = this.__dirty || dirtyPath;\n  },\n  beforeBrush: function () {\n    this._updatePathDirty();\n\n    var paths = this.shape.paths || [];\n    var scale = this.getGlobalScale(); // Update path scale\n\n    for (var i = 0; i < paths.length; i++) {\n      if (!paths[i].path) {\n        paths[i].createPathProxy();\n      }\n\n      paths[i].path.setScale(scale[0], scale[1]);\n    }\n  },\n  buildPath: function (ctx, shape) {\n    var paths = shape.paths || [];\n\n    for (var i = 0; i < paths.length; i++) {\n      paths[i].buildPath(ctx, paths[i].shape, true);\n    }\n  },\n  afterBrush: function () {\n    var paths = this.shape.paths || [];\n\n    for (var i = 0; i < paths.length; i++) {\n      paths[i].__dirtyPath = false;\n    }\n  },\n  getBoundingRect: function () {\n    this._updatePathDirty();\n\n    return Path.prototype.getBoundingRect.call(this);\n  }\n});\n\nmodule.exports = _default;\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar zrUtil = __webpack_require__(0);\n\nvar Gradient = __webpack_require__(24);\n\n/**\n * x, y, x2, y2 are all percent from 0 to 1\n * @param {number} [x=0]\n * @param {number} [y=0]\n * @param {number} [x2=1]\n * @param {number} [y2=0]\n * @param {Array.<Object>} colorStops\n * @param {boolean} [globalCoord=false]\n */\nvar LinearGradient = function (x, y, x2, y2, colorStops, globalCoord) {\n  // Should do nothing more in this constructor. Because gradient can be\n  // declard by `color: {type: 'linear', colorStops: ...}`, where\n  // this constructor will not be called.\n  this.x = x == null ? 0 : x;\n  this.y = y == null ? 0 : y;\n  this.x2 = x2 == null ? 1 : x2;\n  this.y2 = y2 == null ? 0 : y2; // Can be cloned\n\n  this.type = 'linear'; // If use global coord\n\n  this.global = globalCoord || false;\n  Gradient.call(this, colorStops);\n};\n\nLinearGradient.prototype = {\n  constructor: LinearGradient\n};\nzrUtil.inherits(LinearGradient, Gradient);\nvar _default = LinearGradient;\nmodule.exports = _default;\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar zrUtil = __webpack_require__(0);\n\nvar Gradient = __webpack_require__(24);\n\n/**\n * x, y, r are all percent from 0 to 1\n * @param {number} [x=0.5]\n * @param {number} [y=0.5]\n * @param {number} [r=0.5]\n * @param {Array.<Object>} [colorStops]\n * @param {boolean} [globalCoord=false]\n */\nvar RadialGradient = function (x, y, r, colorStops, globalCoord) {\n  // Should do nothing more in this constructor. Because gradient can be\n  // declard by `color: {type: 'radial', colorStops: ...}`, where\n  // this constructor will not be called.\n  this.x = x == null ? 0.5 : x;\n  this.y = y == null ? 0.5 : y;\n  this.r = r == null ? 0.5 : r; // Can be cloned\n\n  this.type = 'radial'; // If use global coord\n\n  this.global = globalCoord || false;\n  Gradient.call(this, colorStops);\n};\n\nRadialGradient.prototype = {\n  constructor: RadialGradient\n};\nzrUtil.inherits(RadialGradient, Gradient);\nvar _default = RadialGradient;\nmodule.exports = _default;\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar makeStyleMapper = __webpack_require__(11);\n\nvar getItemStyle = makeStyleMapper([['fill', 'color'], ['stroke', 'borderColor'], ['lineWidth', 'borderWidth'], ['opacity'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'], ['textPosition'], ['textAlign']]);\nvar _default = {\n  getItemStyle: function (excludes, includes) {\n    var style = getItemStyle(this, excludes, includes);\n    var lineDash = this.getBorderLineDash();\n    lineDash && (style.lineDash = lineDash);\n    return style;\n  },\n  getBorderLineDash: function () {\n    var lineType = this.get('borderType');\n    return lineType === 'solid' || lineType == null ? null : lineType === 'dashed' ? [5, 5] : [1, 1];\n  }\n};\nmodule.exports = _default;\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar echarts = __webpack_require__(7);\n\nfunction getShallow(model, path) {\n    return model && model.getShallow(path);\n}\n\necharts.extendChartView({\n\n    type: 'wordCloud',\n\n    render: function (seriesModel, ecModel, api) {\n        var group = this.group;\n        group.removeAll();\n\n        var data = seriesModel.getData();\n\n        var gridSize = seriesModel.get('gridSize');\n\n        seriesModel.layoutInstance.ondraw = function (text, size, dataIdx, drawn) {\n            var itemModel = data.getItemModel(dataIdx);\n            var textStyleModel = itemModel.getModel('textStyle.normal');\n            var emphasisTextStyleModel = itemModel.getModel('textStyle.emphasis');\n\n            var textEl = new echarts.graphic.Text({\n                style: echarts.graphic.setTextStyle({}, textStyleModel, {\n                    x: drawn.info.fillTextOffsetX,\n                    y: drawn.info.fillTextOffsetY + size * 0.5,\n                    text: text,\n                    textBaseline: 'middle',\n                    textFill: data.getItemVisual(dataIdx, 'color'),\n                    fontSize: size\n                }),\n                scale: [1 / drawn.info.mu, 1 / drawn.info.mu],\n                position: [\n                    (drawn.gx + drawn.info.gw / 2) * gridSize,\n                    (drawn.gy + drawn.info.gh / 2) * gridSize\n                ],\n                rotation: drawn.rot\n            });\n\n            group.add(textEl);\n\n            data.setItemGraphicEl(dataIdx, textEl);\n\n            echarts.graphic.setHoverStyle(\n                textEl,\n                echarts.graphic.setTextStyle({}, emphasisTextStyleModel, null, {forMerge: true}, true)\n            );\n        };\n\n        this._model = seriesModel;\n    },\n\n    remove: function () {\n        this.group.removeAll();\n\n        this._model.layoutInstance.dispose();\n    },\n\n    dispose: function () {\n        this._model.layoutInstance.dispose();\n    }\n});\n\n\n/***/ }),\n/* 78 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * wordcloud2.js\n * http://timdream.org/wordcloud2.js/\n *\n * Copyright 2011 - 2013 Tim Chien\n * Released under the MIT license\n */\n\n\n\n// setImmediate\nif (!window.setImmediate) {\n  window.setImmediate = (function setupSetImmediate() {\n    return window.msSetImmediate ||\n    window.webkitSetImmediate ||\n    window.mozSetImmediate ||\n    window.oSetImmediate ||\n    (function setupSetZeroTimeout() {\n      if (!window.postMessage || !window.addEventListener) {\n        return null;\n      }\n\n      var callbacks = [undefined];\n      var message = 'zero-timeout-message';\n\n      // Like setTimeout, but only takes a function argument.  There's\n      // no time argument (always zero) and no arguments (you have to\n      // use a closure).\n      var setZeroTimeout = function setZeroTimeout(callback) {\n        var id = callbacks.length;\n        callbacks.push(callback);\n        window.postMessage(message + id.toString(36), '*');\n\n        return id;\n      };\n\n      window.addEventListener('message', function setZeroTimeoutMessage(evt) {\n        // Skipping checking event source, retarded IE confused this window\n        // object with another in the presence of iframe\n        if (typeof evt.data !== 'string' ||\n            evt.data.substr(0, message.length) !== message/* ||\n            evt.source !== window */) {\n          return;\n        }\n\n        evt.stopImmediatePropagation();\n\n        var id = parseInt(evt.data.substr(message.length), 36);\n        if (!callbacks[id]) {\n          return;\n        }\n\n        callbacks[id]();\n        callbacks[id] = undefined;\n      }, true);\n\n      /* specify clearImmediate() here since we need the scope */\n      window.clearImmediate = function clearZeroTimeout(id) {\n        if (!callbacks[id]) {\n          return;\n        }\n\n        callbacks[id] = undefined;\n      };\n\n      return setZeroTimeout;\n    })() ||\n    // fallback\n    function setImmediateFallback(fn) {\n      window.setTimeout(fn, 0);\n    };\n  })();\n}\n\nif (!window.clearImmediate) {\n  window.clearImmediate = (function setupClearImmediate() {\n    return window.msClearImmediate ||\n    window.webkitClearImmediate ||\n    window.mozClearImmediate ||\n    window.oClearImmediate ||\n    // \"clearZeroTimeout\" is implement on the previous block ||\n    // fallback\n    function clearImmediateFallback(timer) {\n      window.clearTimeout(timer);\n    };\n  })();\n}\n\n(function(global) {\n\n  // Check if WordCloud can run on this browser\n  var isSupported = (function isSupported() {\n    var canvas = document.createElement('canvas');\n    if (!canvas || !canvas.getContext) {\n      return false;\n    }\n\n    var ctx = canvas.getContext('2d');\n    if (!ctx.getImageData) {\n      return false;\n    }\n    if (!ctx.fillText) {\n      return false;\n    }\n\n    if (!Array.prototype.some) {\n      return false;\n    }\n    if (!Array.prototype.push) {\n      return false;\n    }\n\n    return true;\n  }());\n\n  // Find out if the browser impose minium font size by\n  // drawing small texts on a canvas and measure it's width.\n  var minFontSize = (function getMinFontSize() {\n    if (!isSupported) {\n      return;\n    }\n\n    var ctx = document.createElement('canvas').getContext('2d');\n\n    // start from 20\n    var size = 20;\n\n    // two sizes to measure\n    var hanWidth, mWidth;\n\n    while (size) {\n      ctx.font = size.toString(10) + 'px sans-serif';\n      if ((ctx.measureText('\\uFF37').width === hanWidth) &&\n          (ctx.measureText('m').width) === mWidth) {\n        return (size + 1);\n      }\n\n      hanWidth = ctx.measureText('\\uFF37').width;\n      mWidth = ctx.measureText('m').width;\n\n      size--;\n    }\n\n    return 0;\n  })();\n\n  // Based on http://jsfromhell.com/array/shuffle\n  var shuffleArray = function shuffleArray(arr) {\n    for (var j, x, i = arr.length; i;\n      j = Math.floor(Math.random() * i),\n      x = arr[--i], arr[i] = arr[j],\n      arr[j] = x) {}\n    return arr;\n  };\n\n  var WordCloud = function WordCloud(elements, options) {\n    if (!isSupported) {\n      return;\n    }\n\n    if (!Array.isArray(elements)) {\n      elements = [elements];\n    }\n\n    elements.forEach(function(el, i) {\n      if (typeof el === 'string') {\n        elements[i] = document.getElementById(el);\n        if (!elements[i]) {\n          throw 'The element id specified is not found.';\n        }\n      } else if (!el.tagName && !el.appendChild) {\n        throw 'You must pass valid HTML elements, or ID of the element.';\n      }\n    });\n\n    /* Default values to be overwritten by options object */\n    var settings = {\n      list: [],\n      fontFamily: '\"Trebuchet MS\", \"Heiti TC\", \"微軟正黑體\", ' +\n                  '\"Arial Unicode MS\", \"Droid Fallback Sans\", sans-serif',\n      fontWeight: 'normal',\n      color: 'random-dark',\n      minSize: 0, // 0 to disable\n      weightFactor: 1,\n      clearCanvas: true,\n      backgroundColor: '#fff',  // opaque white = rgba(255, 255, 255, 1)\n\n      gridSize: 8,\n      drawOutOfBound: false,\n      origin: null,\n\n      drawMask: false,\n      maskColor: 'rgba(255,0,0,0.3)',\n      maskGapWidth: 0.3,\n\n      wait: 0,\n      abortThreshold: 0, // disabled\n      abort: function noop() {},\n\n      minRotation: - Math.PI / 2,\n      maxRotation: Math.PI / 2,\n      rotationStep: 0.1,\n\n      shuffle: true,\n      rotateRatio: 0.1,\n\n      shape: 'circle',\n      ellipticity: 0.65,\n\n      classes: null,\n\n      hover: null,\n      click: null\n    };\n\n    if (options) {\n      for (var key in options) {\n        if (key in settings) {\n          settings[key] = options[key];\n        }\n      }\n    }\n\n    /* Convert weightFactor into a function */\n    if (typeof settings.weightFactor !== 'function') {\n      var factor = settings.weightFactor;\n      settings.weightFactor = function weightFactor(pt) {\n        return pt * factor; //in px\n      };\n    }\n\n    /* Convert shape into a function */\n    if (typeof settings.shape !== 'function') {\n      switch (settings.shape) {\n        case 'circle':\n        /* falls through */\n        default:\n          // 'circle' is the default and a shortcut in the code loop.\n          settings.shape = 'circle';\n          break;\n\n        case 'cardioid':\n          settings.shape = function shapeCardioid(theta) {\n            return 1 - Math.sin(theta);\n          };\n          break;\n\n        /*\n        To work out an X-gon, one has to calculate \"m\",\n        where 1/(cos(2*PI/X)+m*sin(2*PI/X)) = 1/(cos(0)+m*sin(0))\n        http://www.wolframalpha.com/input/?i=1%2F%28cos%282*PI%2FX%29%2Bm*sin%28\n        2*PI%2FX%29%29+%3D+1%2F%28cos%280%29%2Bm*sin%280%29%29\n        Copy the solution into polar equation r = 1/(cos(t') + m*sin(t'))\n        where t' equals to mod(t, 2PI/X);\n        */\n\n        case 'diamond':\n        case 'square':\n          // http://www.wolframalpha.com/input/?i=plot+r+%3D+1%2F%28cos%28mod+\n          // %28t%2C+PI%2F2%29%29%2Bsin%28mod+%28t%2C+PI%2F2%29%29%29%2C+t+%3D\n          // +0+..+2*PI\n          settings.shape = function shapeSquare(theta) {\n            var thetaPrime = theta % (2 * Math.PI / 4);\n            return 1 / (Math.cos(thetaPrime) + Math.sin(thetaPrime));\n          };\n          break;\n\n        case 'triangle-forward':\n          // http://www.wolframalpha.com/input/?i=plot+r+%3D+1%2F%28cos%28mod+\n          // %28t%2C+2*PI%2F3%29%29%2Bsqrt%283%29sin%28mod+%28t%2C+2*PI%2F3%29\n          // %29%29%2C+t+%3D+0+..+2*PI\n          settings.shape = function shapeTriangle(theta) {\n            var thetaPrime = theta % (2 * Math.PI / 3);\n            return 1 / (Math.cos(thetaPrime) +\n                        Math.sqrt(3) * Math.sin(thetaPrime));\n          };\n          break;\n\n        case 'triangle':\n        case 'triangle-upright':\n          settings.shape = function shapeTriangle(theta) {\n            var thetaPrime = (theta + Math.PI * 3 / 2) % (2 * Math.PI / 3);\n            return 1 / (Math.cos(thetaPrime) +\n                        Math.sqrt(3) * Math.sin(thetaPrime));\n          };\n          break;\n\n        case 'pentagon':\n          settings.shape = function shapePentagon(theta) {\n            var thetaPrime = (theta + 0.955) % (2 * Math.PI / 5);\n            return 1 / (Math.cos(thetaPrime) +\n                        0.726543 * Math.sin(thetaPrime));\n          };\n          break;\n\n        case 'star':\n          settings.shape = function shapeStar(theta) {\n            var thetaPrime = (theta + 0.955) % (2 * Math.PI / 10);\n            if ((theta + 0.955) % (2 * Math.PI / 5) - (2 * Math.PI / 10) >= 0) {\n              return 1 / (Math.cos((2 * Math.PI / 10) - thetaPrime) +\n                          3.07768 * Math.sin((2 * Math.PI / 10) - thetaPrime));\n            } else {\n              return 1 / (Math.cos(thetaPrime) +\n                          3.07768 * Math.sin(thetaPrime));\n            }\n          };\n          break;\n      }\n    }\n\n    /* Make sure gridSize is a whole number and is not smaller than 4px */\n    settings.gridSize = Math.max(Math.floor(settings.gridSize), 4);\n\n    /* shorthand */\n    var g = settings.gridSize;\n    var maskRectWidth = g - settings.maskGapWidth;\n\n    /* normalize rotation settings */\n    var rotationRange = Math.abs(settings.maxRotation - settings.minRotation);\n    var minRotation = Math.min(settings.maxRotation, settings.minRotation);\n    var rotationStep = settings.rotationStep;\n\n    /* information/object available to all functions, set when start() */\n    var grid, // 2d array containing filling information\n      ngx, ngy, // width and height of the grid\n      center, // position of the center of the cloud\n      maxRadius;\n\n    /* timestamp for measuring each putWord() action */\n    var escapeTime;\n\n    /* function for getting the color of the text */\n    var getTextColor;\n    function random_hsl_color(min, max) {\n      return 'hsl(' +\n        (Math.random() * 360).toFixed() + ',' +\n        (Math.random() * 30 + 70).toFixed() + '%,' +\n        (Math.random() * (max - min) + min).toFixed() + '%)';\n    }\n    switch (settings.color) {\n      case 'random-dark':\n        getTextColor = function getRandomDarkColor() {\n          return random_hsl_color(10, 50);\n        };\n        break;\n\n      case 'random-light':\n        getTextColor = function getRandomLightColor() {\n          return random_hsl_color(50, 90);\n        };\n        break;\n\n      default:\n        if (typeof settings.color === 'function') {\n          getTextColor = settings.color;\n        }\n        break;\n    }\n\n    /* function for getting the classes of the text */\n    var getTextClasses = null;\n    if (typeof settings.classes === 'function') {\n      getTextClasses = settings.classes;\n    }\n\n    /* Interactive */\n    var interactive = false;\n    var infoGrid = [];\n    var hovered;\n\n    var getInfoGridFromMouseTouchEvent =\n    function getInfoGridFromMouseTouchEvent(evt) {\n      var canvas = evt.currentTarget;\n      var rect = canvas.getBoundingClientRect();\n      var clientX;\n      var clientY;\n      /** Detect if touches are available */\n      if (evt.touches) {\n        clientX = evt.touches[0].clientX;\n        clientY = evt.touches[0].clientY;\n      } else {\n        clientX = evt.clientX;\n        clientY = evt.clientY;\n      }\n      var eventX = clientX - rect.left;\n      var eventY = clientY - rect.top;\n\n      var x = Math.floor(eventX * ((canvas.width / rect.width) || 1) / g);\n      var y = Math.floor(eventY * ((canvas.height / rect.height) || 1) / g);\n\n      return infoGrid[x][y];\n    };\n\n    var wordcloudhover = function wordcloudhover(evt) {\n      var info = getInfoGridFromMouseTouchEvent(evt);\n\n      if (hovered === info) {\n        return;\n      }\n\n      hovered = info;\n      if (!info) {\n        settings.hover(undefined, undefined, evt);\n\n        return;\n      }\n\n      settings.hover(info.item, info.dimension, evt);\n\n    };\n\n    var wordcloudclick = function wordcloudclick(evt) {\n      var info = getInfoGridFromMouseTouchEvent(evt);\n      if (!info) {\n        return;\n      }\n\n      settings.click(info.item, info.dimension, evt);\n      evt.preventDefault();\n    };\n\n    /* Get points on the grid for a given radius away from the center */\n    var pointsAtRadius = [];\n    var getPointsAtRadius = function getPointsAtRadius(radius) {\n      if (pointsAtRadius[radius]) {\n        return pointsAtRadius[radius];\n      }\n\n      // Look for these number of points on each radius\n      var T = radius * 8;\n\n      // Getting all the points at this radius\n      var t = T;\n      var points = [];\n\n      if (radius === 0) {\n        points.push([center[0], center[1], 0]);\n      }\n\n      while (t--) {\n        // distort the radius to put the cloud in shape\n        var rx = 1;\n        if (settings.shape !== 'circle') {\n          rx = settings.shape(t / T * 2 * Math.PI); // 0 to 1\n        }\n\n        // Push [x, y, t]; t is used solely for getTextColor()\n        points.push([\n          center[0] + radius * rx * Math.cos(-t / T * 2 * Math.PI),\n          center[1] + radius * rx * Math.sin(-t / T * 2 * Math.PI) *\n            settings.ellipticity,\n          t / T * 2 * Math.PI]);\n      }\n\n      pointsAtRadius[radius] = points;\n      return points;\n    };\n\n    /* Return true if we had spent too much time */\n    var exceedTime = function exceedTime() {\n      return ((settings.abortThreshold > 0) &&\n        ((new Date()).getTime() - escapeTime > settings.abortThreshold));\n    };\n\n    /* Get the deg of rotation according to settings, and luck. */\n    var getRotateDeg = function getRotateDeg() {\n      if (settings.rotateRatio === 0) {\n        return 0;\n      }\n\n      if (Math.random() > settings.rotateRatio) {\n        return 0;\n      }\n\n      if (rotationRange === 0) {\n        return minRotation;\n      }\n\n      return minRotation + Math.round(Math.random() * rotationRange / rotationStep) * rotationStep;\n    };\n\n    var getTextInfo = function getTextInfo(word, weight, rotateDeg) {\n      // calculate the acutal font size\n      // fontSize === 0 means weightFactor function wants the text skipped,\n      // and size < minSize means we cannot draw the text.\n      var debug = false;\n      var fontSize = settings.weightFactor(weight);\n      if (fontSize <= settings.minSize) {\n        return false;\n      }\n\n      // Scale factor here is to make sure fillText is not limited by\n      // the minium font size set by browser.\n      // It will always be 1 or 2n.\n      var mu = 1;\n      if (fontSize < minFontSize) {\n        mu = (function calculateScaleFactor() {\n          var mu = 2;\n          while (mu * fontSize < minFontSize) {\n            mu += 2;\n          }\n          return mu;\n        })();\n      }\n\n      var fcanvas = document.createElement('canvas');\n      var fctx = fcanvas.getContext('2d', { willReadFrequently: true });\n\n      fctx.font = settings.fontWeight + ' ' +\n        (fontSize * mu).toString(10) + 'px ' + settings.fontFamily;\n\n      // Estimate the dimension of the text with measureText().\n      var fw = fctx.measureText(word).width / mu;\n      var fh = Math.max(fontSize * mu,\n                        fctx.measureText('m').width,\n                        fctx.measureText('\\uFF37').width) / mu;\n\n      // Create a boundary box that is larger than our estimates,\n      // so text don't get cut of (it sill might)\n      var boxWidth = fw + fh * 2;\n      var boxHeight = fh * 3;\n      var fgw = Math.ceil(boxWidth / g);\n      var fgh = Math.ceil(boxHeight / g);\n      boxWidth = fgw * g;\n      boxHeight = fgh * g;\n\n      // Calculate the proper offsets to make the text centered at\n      // the preferred position.\n\n      // This is simply half of the width.\n      var fillTextOffsetX = - fw / 2;\n      // Instead of moving the box to the exact middle of the preferred\n      // position, for Y-offset we move 0.4 instead, so Latin alphabets look\n      // vertical centered.\n      var fillTextOffsetY = - fh * 0.4;\n\n      // Calculate the actual dimension of the canvas, considering the rotation.\n      var cgh = Math.ceil((boxWidth * Math.abs(Math.sin(rotateDeg)) +\n                           boxHeight * Math.abs(Math.cos(rotateDeg))) / g);\n      var cgw = Math.ceil((boxWidth * Math.abs(Math.cos(rotateDeg)) +\n                           boxHeight * Math.abs(Math.sin(rotateDeg))) / g);\n      var width = cgw * g;\n      var height = cgh * g;\n\n      fcanvas.setAttribute('width', width);\n      fcanvas.setAttribute('height', height);\n\n      if (debug) {\n        // Attach fcanvas to the DOM\n        document.body.appendChild(fcanvas);\n        // Save it's state so that we could restore and draw the grid correctly.\n        fctx.save();\n      }\n\n      // Scale the canvas with |mu|.\n      fctx.scale(1 / mu, 1 / mu);\n      fctx.translate(width * mu / 2, height * mu / 2);\n      fctx.rotate(- rotateDeg);\n\n      // Once the width/height is set, ctx info will be reset.\n      // Set it again here.\n      fctx.font = settings.fontWeight + ' ' +\n        (fontSize * mu).toString(10) + 'px ' + settings.fontFamily;\n\n      // Fill the text into the fcanvas.\n      // XXX: We cannot because textBaseline = 'top' here because\n      // Firefox and Chrome uses different default line-height for canvas.\n      // Please read https://bugzil.la/737852#c6.\n      // Here, we use textBaseline = 'middle' and draw the text at exactly\n      // 0.5 * fontSize lower.\n      fctx.fillStyle = '#000';\n      fctx.textBaseline = 'middle';\n      fctx.fillText(word, fillTextOffsetX * mu,\n                    (fillTextOffsetY + fontSize * 0.5) * mu);\n\n      // Get the pixels of the text\n      var imageData = fctx.getImageData(0, 0, width, height).data;\n\n      if (exceedTime()) {\n        return false;\n      }\n\n      if (debug) {\n        // Draw the box of the original estimation\n        fctx.strokeRect(fillTextOffsetX * mu,\n                        fillTextOffsetY, fw * mu, fh * mu);\n        fctx.restore();\n      }\n\n      // Read the pixels and save the information to the occupied array\n      var occupied = [];\n      var gx = cgw, gy, x, y;\n      var bounds = [cgh / 2, cgw / 2, cgh / 2, cgw / 2];\n      while (gx--) {\n        gy = cgh;\n        while (gy--) {\n          y = g;\n          singleGridLoop: {\n            while (y--) {\n              x = g;\n              while (x--) {\n                if (imageData[((gy * g + y) * width +\n                               (gx * g + x)) * 4 + 3]) {\n                  occupied.push([gx, gy]);\n\n                  if (gx < bounds[3]) {\n                    bounds[3] = gx;\n                  }\n                  if (gx > bounds[1]) {\n                    bounds[1] = gx;\n                  }\n                  if (gy < bounds[0]) {\n                    bounds[0] = gy;\n                  }\n                  if (gy > bounds[2]) {\n                    bounds[2] = gy;\n                  }\n\n                  if (debug) {\n                    fctx.fillStyle = 'rgba(255, 0, 0, 0.5)';\n                    fctx.fillRect(gx * g, gy * g, g - 0.5, g - 0.5);\n                  }\n                  break singleGridLoop;\n                }\n              }\n            }\n            if (debug) {\n              fctx.fillStyle = 'rgba(0, 0, 255, 0.5)';\n              fctx.fillRect(gx * g, gy * g, g - 0.5, g - 0.5);\n            }\n          }\n        }\n      }\n\n      if (debug) {\n        fctx.fillStyle = 'rgba(0, 255, 0, 0.5)';\n        fctx.fillRect(bounds[3] * g,\n                      bounds[0] * g,\n                      (bounds[1] - bounds[3] + 1) * g,\n                      (bounds[2] - bounds[0] + 1) * g);\n      }\n\n      // Return information needed to create the text on the real canvas\n      return {\n        mu: mu,\n        occupied: occupied,\n        bounds: bounds,\n        gw: cgw,\n        gh: cgh,\n        fillTextOffsetX: fillTextOffsetX,\n        fillTextOffsetY: fillTextOffsetY,\n        fillTextWidth: fw,\n        fillTextHeight: fh,\n        fontSize: fontSize\n      };\n    };\n\n    /* Determine if there is room available in the given dimension */\n    var canFitText = function canFitText(gx, gy, gw, gh, occupied) {\n      // Go through the occupied points,\n      // return false if the space is not available.\n      var i = occupied.length;\n      while (i--) {\n        var px = gx + occupied[i][0];\n        var py = gy + occupied[i][1];\n\n        if (px >= ngx || py >= ngy || px < 0 || py < 0) {\n          if (!settings.drawOutOfBound) {\n            return false;\n          }\n          continue;\n        }\n\n        if (!grid[px][py]) {\n          return false;\n        }\n      }\n      return true;\n    };\n\n    /* Actually draw the text on the grid */\n    var drawText = function drawText(gx, gy, info, word, weight,\n                                     distance, theta, rotateDeg, attributes) {\n\n      var fontSize = info.fontSize;\n      var color;\n      if (getTextColor) {\n        color = getTextColor(word, weight, fontSize, distance, theta);\n      } else {\n        color = settings.color;\n      }\n\n      var classes;\n      if (getTextClasses) {\n        classes = getTextClasses(word, weight, fontSize, distance, theta);\n      } else {\n        classes = settings.classes;\n      }\n\n      var dimension;\n      var bounds = info.bounds;\n      dimension = {\n        x: (gx + bounds[3]) * g,\n        y: (gy + bounds[0]) * g,\n        w: (bounds[1] - bounds[3] + 1) * g,\n        h: (bounds[2] - bounds[0] + 1) * g\n      };\n\n      elements.forEach(function(el) {\n        if (el.getContext) {\n          var ctx = el.getContext('2d');\n          var mu = info.mu;\n\n          // Save the current state before messing it\n          ctx.save();\n          ctx.scale(1 / mu, 1 / mu);\n\n          ctx.font = settings.fontWeight + ' ' +\n                     (fontSize * mu).toString(10) + 'px ' + settings.fontFamily;\n          ctx.fillStyle = color;\n\n          // Translate the canvas position to the origin coordinate of where\n          // the text should be put.\n          ctx.translate((gx + info.gw / 2) * g * mu,\n                        (gy + info.gh / 2) * g * mu);\n\n          if (rotateDeg !== 0) {\n            ctx.rotate(- rotateDeg);\n          }\n\n          // Finally, fill the text.\n\n          // XXX: We cannot because textBaseline = 'top' here because\n          // Firefox and Chrome uses different default line-height for canvas.\n          // Please read https://bugzil.la/737852#c6.\n          // Here, we use textBaseline = 'middle' and draw the text at exactly\n          // 0.5 * fontSize lower.\n          ctx.textBaseline = 'middle';\n          ctx.fillText(word, info.fillTextOffsetX * mu,\n                             (info.fillTextOffsetY + fontSize * 0.5) * mu);\n\n          // The below box is always matches how <span>s are positioned\n          /* ctx.strokeRect(info.fillTextOffsetX, info.fillTextOffsetY,\n            info.fillTextWidth, info.fillTextHeight); */\n\n          // Restore the state.\n          ctx.restore();\n        } else {\n          // drawText on DIV element\n          var span = document.createElement('span');\n          var transformRule = '';\n          transformRule = 'rotate(' + (- rotateDeg / Math.PI * 180) + 'deg) ';\n          if (info.mu !== 1) {\n            transformRule +=\n              'translateX(-' + (info.fillTextWidth / 4) + 'px) ' +\n              'scale(' + (1 / info.mu) + ')';\n          }\n          var styleRules = {\n            'position': 'absolute',\n            'display': 'block',\n            'font': settings.fontWeight + ' ' +\n                    (fontSize * info.mu) + 'px ' + settings.fontFamily,\n            'left': ((gx + info.gw / 2) * g + info.fillTextOffsetX) + 'px',\n            'top': ((gy + info.gh / 2) * g + info.fillTextOffsetY) + 'px',\n            'width': info.fillTextWidth + 'px',\n            'height': info.fillTextHeight + 'px',\n            'lineHeight': fontSize + 'px',\n            'whiteSpace': 'nowrap',\n            'transform': transformRule,\n            'webkitTransform': transformRule,\n            'msTransform': transformRule,\n            'transformOrigin': '50% 40%',\n            'webkitTransformOrigin': '50% 40%',\n            'msTransformOrigin': '50% 40%'\n          };\n          if (color) {\n            styleRules.color = color;\n          }\n          span.textContent = word;\n          for (var cssProp in styleRules) {\n            span.style[cssProp] = styleRules[cssProp];\n          }\n          if (attributes) {\n            for (var attribute in attributes) {\n              span.setAttribute(attribute, attributes[attribute]);\n            }\n          }\n          if (classes) {\n            span.className += classes;\n          }\n          el.appendChild(span);\n        }\n      });\n    };\n\n    /* Help function to updateGrid */\n    var fillGridAt = function fillGridAt(x, y, drawMask, dimension, item) {\n      if (x >= ngx || y >= ngy || x < 0 || y < 0) {\n        return;\n      }\n\n      grid[x][y] = false;\n\n      if (drawMask) {\n        var ctx = elements[0].getContext('2d');\n        ctx.fillRect(x * g, y * g, maskRectWidth, maskRectWidth);\n      }\n\n      if (interactive) {\n        infoGrid[x][y] = { item: item, dimension: dimension };\n      }\n    };\n\n    /* Update the filling information of the given space with occupied points.\n       Draw the mask on the canvas if necessary. */\n    var updateGrid = function updateGrid(gx, gy, gw, gh, info, item) {\n      var occupied = info.occupied;\n      var drawMask = settings.drawMask;\n      var ctx;\n      if (drawMask) {\n        ctx = elements[0].getContext('2d');\n        ctx.save();\n        ctx.fillStyle = settings.maskColor;\n      }\n\n      var dimension;\n      if (interactive) {\n        var bounds = info.bounds;\n        dimension = {\n          x: (gx + bounds[3]) * g,\n          y: (gy + bounds[0]) * g,\n          w: (bounds[1] - bounds[3] + 1) * g,\n          h: (bounds[2] - bounds[0] + 1) * g\n        };\n      }\n\n      var i = occupied.length;\n      while (i--) {\n        var px = gx + occupied[i][0];\n        var py = gy + occupied[i][1];\n\n        if (px >= ngx || py >= ngy || px < 0 || py < 0) {\n          continue;\n        }\n\n        fillGridAt(px, py, drawMask, dimension, item);\n      }\n\n      if (drawMask) {\n        ctx.restore();\n      }\n    };\n\n    /* putWord() processes each item on the list,\n       calculate it's size and determine it's position, and actually\n       put it on the canvas. */\n    var putWord = function putWord(item) {\n      var word, weight, attributes;\n      if (Array.isArray(item)) {\n        word = item[0];\n        weight = item[1];\n      } else {\n        word = item.word;\n        weight = item.weight;\n        attributes = item.attributes;\n      }\n      var rotateDeg = getRotateDeg();\n\n      // get info needed to put the text onto the canvas\n      var info = getTextInfo(word, weight, rotateDeg);\n\n      // not getting the info means we shouldn't be drawing this one.\n      if (!info) {\n        return false;\n      }\n\n      if (exceedTime()) {\n        return false;\n      }\n\n      // If drawOutOfBound is set to false,\n      // skip the loop if we have already know the bounding box of\n      // word is larger than the canvas.\n      if (!settings.drawOutOfBound) {\n        var bounds = info.bounds;\n        if ((bounds[1] - bounds[3] + 1) > ngx ||\n          (bounds[2] - bounds[0] + 1) > ngy) {\n          return false;\n        }\n      }\n\n      // Determine the position to put the text by\n      // start looking for the nearest points\n      var r = maxRadius + 1;\n\n      var tryToPutWordAtPoint = function(gxy) {\n        var gx = Math.floor(gxy[0] - info.gw / 2);\n        var gy = Math.floor(gxy[1] - info.gh / 2);\n        var gw = info.gw;\n        var gh = info.gh;\n\n        // If we cannot fit the text at this position, return false\n        // and go to the next position.\n        if (!canFitText(gx, gy, gw, gh, info.occupied)) {\n          return false;\n        }\n\n        // Actually put the text on the canvas\n        drawText(gx, gy, info, word, weight,\n                 (maxRadius - r), gxy[2], rotateDeg, attributes);\n\n        // Mark the spaces on the grid as filled\n        updateGrid(gx, gy, gw, gh, info, item);\n\n        return {\n          gx: gx,\n          gy: gy,\n          rot: rotateDeg,\n          info: info\n        };\n      };\n\n      while (r--) {\n        var points = getPointsAtRadius(maxRadius - r);\n\n        if (settings.shuffle) {\n          points = [].concat(points);\n          shuffleArray(points);\n        }\n\n        // Try to fit the words by looking at each point.\n        // array.some() will stop and return true\n        // when putWordAtPoint() returns true.\n        for (var i = 0; i < points.length; i++) {\n          var res = tryToPutWordAtPoint(points[i]);\n          if (res) {\n            return res;\n          }\n        }\n\n        // var drawn = points.some(tryToPutWordAtPoint);\n        // if (drawn) {\n        //   // leave putWord() and return true\n        //   return true;\n        // }\n      }\n      // we tried all distances but text won't fit, return null\n      return null;\n    };\n\n    /* Send DOM event to all elements. Will stop sending event and return\n       if the previous one is canceled (for cancelable events). */\n    var sendEvent = function sendEvent(type, cancelable, detail) {\n      if (cancelable) {\n        return !elements.some(function(el) {\n          var evt = document.createEvent('CustomEvent');\n          evt.initCustomEvent(type, true, cancelable, detail || {});\n          return !el.dispatchEvent(evt);\n        }, this);\n      } else {\n        elements.forEach(function(el) {\n          var evt = document.createEvent('CustomEvent');\n          evt.initCustomEvent(type, true, cancelable, detail || {});\n          el.dispatchEvent(evt);\n        }, this);\n      }\n    };\n\n    /* Start drawing on a canvas */\n    var start = function start() {\n      // For dimensions, clearCanvas etc.,\n      // we only care about the first element.\n      var canvas = elements[0];\n\n      if (canvas.getContext) {\n        ngx = Math.ceil(canvas.width / g);\n        ngy = Math.ceil(canvas.height / g);\n      } else {\n        var rect = canvas.getBoundingClientRect();\n        ngx = Math.ceil(rect.width / g);\n        ngy = Math.ceil(rect.height / g);\n      }\n\n      // Sending a wordcloudstart event which cause the previous loop to stop.\n      // Do nothing if the event is canceled.\n      if (!sendEvent('wordcloudstart', true)) {\n        return;\n      }\n\n      // Determine the center of the word cloud\n      center = (settings.origin) ?\n        [settings.origin[0]/g, settings.origin[1]/g] :\n        [ngx / 2, ngy / 2];\n\n      // Maxium radius to look for space\n      maxRadius = Math.floor(Math.sqrt(ngx * ngx + ngy * ngy));\n\n      /* Clear the canvas only if the clearCanvas is set,\n         if not, update the grid to the current canvas state */\n      grid = [];\n\n      var gx, gy, i;\n      if (!canvas.getContext || settings.clearCanvas) {\n        elements.forEach(function(el) {\n          if (el.getContext) {\n            var ctx = el.getContext('2d');\n            ctx.fillStyle = settings.backgroundColor;\n            ctx.clearRect(0, 0, ngx * (g + 1), ngy * (g + 1));\n            ctx.fillRect(0, 0, ngx * (g + 1), ngy * (g + 1));\n          } else {\n            el.textContent = '';\n            el.style.backgroundColor = settings.backgroundColor;\n            el.style.position = 'relative';\n          }\n        });\n\n        /* fill the grid with empty state */\n        gx = ngx;\n        while (gx--) {\n          grid[gx] = [];\n          gy = ngy;\n          while (gy--) {\n            grid[gx][gy] = true;\n          }\n        }\n      } else {\n        /* Determine bgPixel by creating\n           another canvas and fill the specified background color. */\n        var bctx = document.createElement('canvas').getContext('2d');\n\n        bctx.fillStyle = settings.backgroundColor;\n        bctx.fillRect(0, 0, 1, 1);\n        var bgPixel = bctx.getImageData(0, 0, 1, 1).data;\n\n        /* Read back the pixels of the canvas we got to tell which part of the\n           canvas is empty.\n           (no clearCanvas only works with a canvas, not divs) */\n        var imageData =\n          canvas.getContext('2d').getImageData(0, 0, ngx * g, ngy * g).data;\n\n        gx = ngx;\n        var x, y;\n        while (gx--) {\n          grid[gx] = [];\n          gy = ngy;\n          while (gy--) {\n            y = g;\n            singleGridLoop: while (y--) {\n              x = g;\n              while (x--) {\n                i = 4;\n                while (i--) {\n                  if (imageData[((gy * g + y) * ngx * g +\n                                 (gx * g + x)) * 4 + i] !== bgPixel[i]) {\n                    grid[gx][gy] = false;\n                    break singleGridLoop;\n                  }\n                }\n              }\n            }\n            if (grid[gx][gy] !== false) {\n              grid[gx][gy] = true;\n            }\n          }\n        }\n\n        imageData = bctx = bgPixel = undefined;\n      }\n\n      // fill the infoGrid with empty state if we need it\n      if (settings.hover || settings.click) {\n\n        interactive = true;\n\n        /* fill the grid with empty state */\n        gx = ngx + 1;\n        while (gx--) {\n          infoGrid[gx] = [];\n        }\n\n        if (settings.hover) {\n          canvas.addEventListener('mousemove', wordcloudhover);\n        }\n\n        if (settings.click) {\n          canvas.addEventListener('click', wordcloudclick);\n          canvas.addEventListener('touchstart', wordcloudclick);\n          canvas.addEventListener('touchend', function (e) {\n            e.preventDefault();\n          });\n          canvas.style.webkitTapHighlightColor = 'rgba(0, 0, 0, 0)';\n        }\n\n        canvas.addEventListener('wordcloudstart', function stopInteraction() {\n          canvas.removeEventListener('wordcloudstart', stopInteraction);\n\n          canvas.removeEventListener('mousemove', wordcloudhover);\n          canvas.removeEventListener('click', wordcloudclick);\n          hovered = undefined;\n        });\n      }\n\n      i = 0;\n      var loopingFunction, stoppingFunction;\n      if (settings.wait !== 0) {\n        loopingFunction = window.setTimeout;\n        stoppingFunction = window.clearTimeout;\n      } else {\n        loopingFunction = window.setImmediate;\n        stoppingFunction = window.clearImmediate;\n      }\n\n      var addEventListener = function addEventListener(type, listener) {\n        elements.forEach(function(el) {\n          el.addEventListener(type, listener);\n        }, this);\n      };\n\n      var removeEventListener = function removeEventListener(type, listener) {\n        elements.forEach(function(el) {\n          el.removeEventListener(type, listener);\n        }, this);\n      };\n\n      var anotherWordCloudStart = function anotherWordCloudStart() {\n        removeEventListener('wordcloudstart', anotherWordCloudStart);\n        stoppingFunction(timer);\n      };\n\n      addEventListener('wordcloudstart', anotherWordCloudStart);\n\n      var timer = loopingFunction(function loop() {\n        if (i >= settings.list.length) {\n          stoppingFunction(timer);\n          sendEvent('wordcloudstop', false);\n          removeEventListener('wordcloudstart', anotherWordCloudStart);\n\n          return;\n        }\n        escapeTime = (new Date()).getTime();\n        var drawn = putWord(settings.list[i]);\n        var canceled = !sendEvent('wordclouddrawn', true, {\n          item: settings.list[i], drawn: drawn });\n        if (exceedTime() || canceled) {\n          stoppingFunction(timer);\n          settings.abort();\n          sendEvent('wordcloudabort', false);\n          sendEvent('wordcloudstop', false);\n          removeEventListener('wordcloudstart', anotherWordCloudStart);\n          return;\n        }\n        i++;\n        timer = loopingFunction(loop, settings.wait);\n      }, settings.wait);\n    };\n\n    // All set, start the drawing\n    start();\n  };\n\n  WordCloud.isSupported = isSupported;\n  WordCloud.minFontSize = minFontSize;\n\n  // Expose the library as an AMD module\n  if (true) {\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() { return WordCloud; }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else if (typeof module !== 'undefined' && module.exports) {\n    module.exports = WordCloud;\n  } else {\n    global.WordCloud = WordCloud;\n  }\n\n})(this); //jshint ignore:line\n\n/***/ })\n/******/ ]);\n});"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template1/js/geoCoord.js",
    "content": "var geoCoordMap = {\n    '上海': [121.4648,31.2891],\n    '东莞': [113.8953,22.901],\n    '东营': [118.7073,37.5513],\n    '中山': [113.4229,22.478],\n    '临汾': [111.4783,36.1615],\n    '临沂': [118.3118,35.2936],\n    '丹东': [124.541,40.4242],\n    '丽水': [119.5642,28.1854],\n    '乌鲁木齐': [87.9236,43.5883],\n    '佛山': [112.8955,23.1097],\n    '保定': [115.0488,39.0948],\n    '兰州': [103.5901,36.3043],\n    '包头': [110.3467,41.4899],\n    '北京': [116.4551,40.2539],\n    '北海': [109.314,21.6211],\n    '南京': [118.8062,31.9208],\n    '南宁': [108.479,23.1152],\n    '南昌': [116.0046,28.6633],\n    '南通': [121.1023,32.1625],\n    '厦门': [118.1689,24.6478],\n    '台州': [121.1353,28.6688],\n    '合肥': [117.29,32.0581],\n    '呼和浩特': [111.4124,40.4901],\n    '咸阳': [108.4131,34.8706],\n    '哈尔滨': [127.9688,45.368],\n    '唐山': [118.4766,39.6826],\n    '嘉兴': [120.9155,30.6354],\n    '大同': [113.7854,39.8035],\n    '大连': [122.2229,39.4409],\n    '天津': [117.4219,39.4189],\n    '太原': [112.3352,37.9413],\n    '威海': [121.9482,37.1393],\n    '宁波': [121.5967,29.6466],\n    '宝鸡': [107.1826,34.3433],\n    '宿迁': [118.5535,33.7775],\n    '常州': [119.4543,31.5582],\n    '广州': [113.5107,23.2196],\n    '廊坊': [116.521,39.0509],\n    '延安': [109.1052,36.4252],\n    '张家口': [115.1477,40.8527],\n    '徐州': [117.5208,34.3268],\n    '德州': [116.6858,37.2107],\n    '惠州': [114.6204,23.1647],\n    '成都': [103.9526,30.7617],\n    '扬州': [119.4653,32.8162],\n    '承德': [117.5757,41.4075],\n    '拉萨': [91.1865,30.1465],\n    '无锡': [120.3442,31.5527],\n    '日照': [119.2786,35.5023],\n    '昆明': [102.9199,25.4663],\n    '杭州': [119.5313,29.8773],\n    '枣庄': [117.323,34.8926],\n    '柳州': [109.3799,24.9774],\n    '株洲': [113.5327,27.0319],\n    '武汉': [114.3896,30.6628],\n    '汕头': [117.1692,23.3405],\n    '江门': [112.6318,22.1484],\n    '沈阳': [123.1238,42.1216],\n    '沧州': [116.8286,38.2104],\n    '河源': [114.917,23.9722],\n    '泉州': [118.3228,25.1147],\n    '泰安': [117.0264,36.0516],\n    '泰州': [120.0586,32.5525],\n    '济南': [117.1582,36.8701],\n    '济宁': [116.8286,35.3375],\n    '海口': [110.3893,19.8516],\n    '淄博': [118.0371,36.6064],\n    '淮安': [118.927,33.4039],\n    '深圳': [114.5435,22.5439],\n    '清远': [112.9175,24.3292],\n    '温州': [120.498,27.8119],\n    '渭南': [109.7864,35.0299],\n    '湖州': [119.8608,30.7782],\n    '湘潭': [112.5439,27.7075],\n    '滨州': [117.8174,37.4963],\n    '潍坊': [119.0918,36.524],\n    '烟台': [120.7397,37.5128],\n    '玉溪': [101.9312,23.8898],\n    '珠海': [113.7305,22.1155],\n    '盐城': [120.2234,33.5577],\n    '盘锦': [121.9482,41.0449],\n    '石家庄': [114.4995,38.1006],\n    '福州': [119.4543,25.9222],\n    '秦皇岛': [119.2126,40.0232],\n    '绍兴': [120.564,29.7565],\n    '聊城': [115.9167,36.4032],\n    '肇庆': [112.1265,23.5822],\n    '舟山': [122.2559,30.2234],\n    '苏州': [120.6519,31.3989],\n    '莱芜': [117.6526,36.2714],\n    '菏泽': [115.6201,35.2057],\n    '营口': [122.4316,40.4297],\n    '葫芦岛': [120.1575,40.578],\n    '衡水': [115.8838,37.7161],\n    '衢州': [118.6853,28.8666],\n    '西宁': [101.4038,36.8207],\n    '西安': [109.1162,34.2004],\n    '贵阳': [106.6992,26.7682],\n    '连云港': [119.1248,34.552],\n    '邢台': [114.8071,37.2821],\n    '邯郸': [114.4775,36.535],\n    '郑州': [113.4668,34.6234],\n    '鄂尔多斯': [108.9734,39.2487],\n    '重庆': [107.7539,30.1904],\n    '金华': [120.0037,29.1028],\n    '铜川': [109.0393,35.1947],\n    '银川': [106.3586,38.1775],\n    '镇江': [119.4763,31.9702],\n    '长春': [125.8154,44.2584],\n    '长沙': [113.0823,28.2568],\n    '长治': [112.8625,36.4746],\n    '阳泉': [113.4778,38.0951],\n    '青岛': [120.4651,36.3373],\n    '韶关': [113.7964,24.7028]\n};"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template1/js/resize.js",
    "content": "\nwindow.onresize = function() {\n    setAppScale();\n};\n \nfunction setAppScale() {\n\t var ratioY = $(window).height()/1536;\n     var ratioX = $(window).width()/4352;\n     var screenWidth = window.screen.width; \n     var screenHeigth = window.screen.height; \n     if (screenWidth >= 960) {\n            ratioX = 0.62\n        }\n    if(screenHeigth <= 1080){\n            ratioY = 0.62\n    } \n    $(\"body\").css({\n        transform: \"scale(\"+ ratioX+\",\"+ ratioY+\")\",\n        transformOrigin: \"left top\",\n        overflow:\"visible\"\n    }); \t \n }\n \n\n$().ready(function(){\n        //初始化时调整大小\n        setAppScale();    \n});\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template1/js/room.js",
    "content": "//计划完成表的当前所选\nvar indexnum = 0;\nvar color=['#F35331','#2499F8','#3DF098','#33B734'];\nvar fontColor='#FFF';\n\n//定义进度条组件和属性\nvar y_gauge1 =null;\nvar y_gauge2 =null;\nvar y_gauge3 =null;\nvar y_gauge4 =null;\nvar m_gauge1 =null;\nvar option_Progress =null;\n\n//订单情况螺旋图\nvar orderStatus=null;\nvar orderStatus_option =null;\n\n//定义仪表盘组件和属性\nvar gauge1 =null;\nvar gauge2 =null;\nvar gauge3 =null;\nvar gauge4 =null;\nvar gauge5 =null;\nvar option_gauge =null;\n\n//产品饼图组件和属性\nvar productPie=null;\nvar productPie_option=null;\n\n//业务进展图组件和属性\nvar businessProgress=null;\nvar businessProgress_placeHoledStyle = null;\nvar businessProgress_dataStyle =null;\nvar businessProgress_option=null;\n\n//生产质量堆积图组件和属性\nvar quality_chart = null;\nvar quality_option=null;\n\n//词云组件和属性\nvar wordCloud= null;\nvar wordCloud_option=null;\n\n//生产计划折线图组件和属性\nvar plan_chart = null;\nvar plan_option=null;\n\n//环形图的风格定义\nvar dataStyle = {\n\tnormal: {\n\t\tlabel: {show:false},\n\t\tlabelLine: {show:false}\n\t}\n};\nvar placeHolderStyle = {\n\tnormal : {\n\t\tcolor: 'rgba(0,0,0,0.1)',\n\t\tlabel: {show:false},\n\t\tlabelLine: {show:false}\n\t},\n\temphasis : {\n\t\tcolor: 'rgba(0,0,0,0)'\n\t}\n};\n\n//最大订单号\nvar lastOrderNumber=1;\n\n$(document).ready(function ()\n{\t\n\t//环形进度条设置对象\t\n\toption_Progress={\n\t\ttitle : {\n\t\t\ttext: '目前进度',\n\t\t\tsubtext: '50%',\n\t\t\tx: 'center',\n\t\t\ty: 90,\n\t\t\titemGap: 10,\n\t\t\ttextStyle : {\n\t\t\t\tcolor : '#B7E1FF',\n\t\t\t\tfontWeight: 'normal',\n\t\t\t\tfontFamily : '微软雅黑',\n\t\t\t\tfontSize : 24\n\t\t\t},\n\t\t\tsubtextStyle:{\n\t\t\t\tcolor: '#B7E1FF',\n\t\t\t\tfontWeight: 'bolder',\n\t\t\t\tfontSize:24,\n\t\t\t\tfontFamily : '微软雅黑'\n\t\t\t}\n\t\t},\n\t\tseries : [{\n\t\t\ttype : 'pie',\n\t\t\tcenter : ['50%', '50%'],\n\t\t\tradius : [75,90],\n\t\t\tx: '0%',\n\t\t\ttooltip:{show:false},\t\t\n\t\t\tdata : [{\n\t\t\t\tname:'达成率', \n\t\t\t\tvalue:79,\n\t\t\t\titemStyle:{color :'rgba(0,153,255,0.8)'},\n\t\t\t\thoverAnimation: false, \n\t\t\t\tlabel : {\n\t\t\t\t\tshow : false,\n\t\t\t\t\tposition : 'center',\n\t\t\t\t\ttextStyle: {\t\t\t\t\t\t\n\t\t\t\t\t\tfontFamily:'微软雅黑',\n\t\t\t\t\t\tfontWeight: 'bolder',\n\t\t\t\t\t\tcolor:'#B7E1FF',\n\t\t\t\t\t\tfontSize:24\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlabelLine : {\n\t\t\t\t\tshow : false\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tname:'79%',\n\t\t\t\tvalue:21,\n\t\t\t\titemStyle:{color: 'rgba(0,153,255,0.1)'},\n\t\t\t\thoverAnimation: false, \n\t\t\t\tlabel : {\n\t\t\t\t\tshow : false,\n\t\t\t\t\tposition : 'center',\n\t\t\t\t\tpadding:20,\t\t\n\t\t\t\t\ttextStyle: {\n\t\t\t\t\t\tfontFamily:'微软雅黑',\n\t\t\t\t\t\tfontSize: 24,\n\t\t\t\t\t\tcolor:'#B7E1FF'\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlabelLine : {\n\t\t\t\t\tshow : false\n\t\t\t\t}\n\t\t\t}]\n\t\t},\n\t\t{\n\t\t\ttype : 'pie',\n\t\t\tcenter : ['50%', '50%'],\n\t\t\tradius : [95,100],\n\t\t\tx: '0%',\n\t\t\thoverAnimation: false, \n\t\t\tdata : [{\n\t\t\t\tvalue:100,\n\t\t\t\titemStyle:{color :'rgba(0,153,255,0.3)'},\n\t\t\t\tlabel : {show : false},\n\t\t\t\tlabelLine : {show : false}\n\t\t\t}]\t\n\t\t},\n\t\t{\n\t\t\ttype : 'pie',\n\t\t\tcenter : ['50%', '50%'],\n\t\t\tradius : [69,70],\n\t\t\tx: '0%',\n\t\t\thoverAnimation: false, \n\t\t\tdata : [{\n\t\t\t\tvalue:100,\n\t\t\t\titemStyle:{color :'rgba(0,153,255,0.3)'},\n\t\t\t\tlabel : {show : false},\n\t\t\t\tlabelLine : {show : false}\n\t\t\t}]\t\n\t\t}]\n\t};\t\n\t\n\t//年仪表盘\n\ty_gauge1 = echarts.init(document.getElementById('y_gauge1'));\n\ty_gauge2 = echarts.init(document.getElementById('y_gauge2'));\n\ty_gauge3 = echarts.init(document.getElementById('y_gauge3'));\n\ty_gauge4 = echarts.init(document.getElementById('y_gauge4'));\n\t\n\t//订单完成情况螺旋图\n\tvar yearPlanData=[];\n\tvar yearOrderData=[];\n\tvar differenceData=[];\n\tvar visibityData=[];\n\tvar xAxisData=[];\n\t\n\tfor(var i=0;i<12;i++)\n\t{\n\t\tyearPlanData.push(Math.round(Math.random()*900)+100);\n\t\tyearOrderData.push(Math.round(Math.random()*yearPlanData[i]));\n\t\tdifferenceData.push(yearPlanData[i]-yearOrderData[i]);\n\t\tvisibityData.push(yearOrderData[i]);\n\t\txAxisData.push((i+1).toString()+\"月\");\n\t}\n\torderStatus= echarts.init(document.getElementById('orderStatus'));\n\torderStatus_option={\n\t\ttitle :{show:false},\n\t\ttooltip : {\n\t\t\ttrigger: 'axis',\n\t\t\tformatter: function (params){\n\t\t\t\treturn params[0].name + '<br/>'\n\t\t\t\t\t   + params[0].seriesName + ' : ' + params[0].value + '<br/>'\n\t\t\t\t\t   + params[1].seriesName + ' : ' + params[1].value + '<br/>'\n\t\t\t\t\t   +'完成率：'\n\t\t\t\t\t   + (params[0].value > 0 ? (params[1].value/params[0].value*100).toFixed(2)+'%' : '-') \n\t\t\t\t\t   + '<br/>'\n\t\t\t},\n\t\t\ttextStyle: {\n\t\t\t\tcolor: '#FFF',\n\t\t\t\tfontSize:24\n\t\t\t}\n\t\t},\n\t\ttoolbox: {show:false},\n\t\tlegend:{\n\t\t\ttop: 'top',\n\t\t\ttextStyle: {\n\t\t\t\tcolor: '#B7E2FF',\n\t\t\t\tfontSize:24,\n\t\t\t\tfontFamily:'微软雅黑'\n\t\t\t},\n\t\t\tdata:['计划生产','已接订单']\n\t\t},\n\t\txAxis: {\n\t\t\tdata: xAxisData,\n\t\t\taxisLabel: {\n\t\t\t\ttextStyle: {\n\t\t\t\t\tcolor: '#B7E1FF',\n\t\t\t\t\tfontSize:24\n\t\t\t\t}\n\t\t\t},\n\t\t\taxisLine:{\n\t\t\t\tlineStyle:{\n\t\t\t\t\tcolor:'#09F'\t\n\t\t\t\t}\n\t\t\t},\n\t\t\taxisTick:{\n\t\t\t\tlineStyle:{\n\t\t\t\t\tcolor:'#09F'\t\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tyAxis: {\n\t\t\tinverse: false,\n\t\t\tsplitArea: {show: false},\n\t\t\taxisLine:  {show: false},\n\t\t\taxisTick:  {show: false},\n\t\t\taxisLabel: {\n\t\t\t\ttextStyle: {\n\t\t\t\t\tcolor: '#B7E1FF',\n\t\t\t\t\tfontSize:24,\n\t\t\t\t\tfontFamily:'Arial',\n\t\t\t\t}\n\t\t\t},\n\t\t\tsplitLine :{\n\t\t\t\tlineStyle:{\n\t\t\t\t\tcolor:'#09F'\t\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgrid: {\n\t\t\tleft: 100\n\t\t},\n\t\tseries : [{\n\t\t\t\tname:'计划生产',\n\t\t\t\ttype:'line',\n\t\t\t\tsmooth :true,\n\t\t\t\tsymbol: 'circle',\n\t\t\t\tsymbolSize: 10,\n\t\t\t\tshowAllSymbol : true,\n\t\t\t\tcolor:color[1],\n\t\t\t\tdata:yearPlanData\n\t\t\t},\n\t\t\t{\n\t\t\t\tname:'已接订单',\n\t\t\t\ttype:'line',\n\t\t\t\tsmooth :true,\n\t\t\t\tsymbol: 'circle',\n\t\t\t\tsymbolSize: 10,\n\t\t\t\tshowAllSymbol : true,\n\t\t\t\tcolor:'#F90',\n\t\t\t\titemStyle:{\t\t\t\t\t\n\t\t\t\t\tnormal:{\n\t\t\t\t\t  lineStyle: {\n\t\t\t\t\t\twidth:2\n\t\t\t\t\t  }\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tdata:yearOrderData\n\t\t\t},\n\t\t\t{\n\t\t\t\tname:'不可见',\n\t\t\t\ttype:'bar',\n\t\t\t\tstack: '1',\n\t\t\t\tbarWidth: 1,\n\t\t\t\titemStyle:{\n\t\t\t\t\tnormal:{\n\t\t\t\t\t\tcolor:'rgba(0,0,0,0)'\n\t\t\t\t\t},\n\t\t\t\t\temphasis:{\n\t\t\t\t\t\tcolor:'rgba(0,0,0,0)'\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tdata:visibityData\n\t\t\t},\n\t\t\t{\n\t\t\t\tname:'变化',\n\t\t\t\ttype:'bar',\n\t\t\t\tstack: '1',\n\t\t\t\tbarWidth: 1,\n\t\t\t\tcolor:'#B7E1FF',\n\t\t\t\tdata:differenceData\n\t\t\t}\n\t\t]\n\t}\n\torderStatus.setOption(orderStatus_option);\n\t\n\t//产品销售的环形图\n\tvar productLegend=[['轿车1','轿车2','轿车3','轿车4','轿车5','轿车6','轿车7','轿车8','轿车9'],['SUV1','SUV2','SUV3','SUV4'],['卡车1','卡车2','卡车3','卡车4','卡车5','卡车6']];\n\tvar productClassLegend=['轿车','SUV','卡车'];\n\tvar productClassColor=['rgba(255,153,0,','rgba(153,204,102,','rgba(0,102,255,'];\n\tvar productClassData=[];\n\tvar productData=[];\n\tvar productColor=[];\n\tfor(var i=0;i<productClassLegend.length;i++)\n\t{\t\n\t\tvar total=0;\n\t\tfor(var j=0;j<productLegend[i].length;j++)\n\t\t{\n\t\t\tvar n=Math.round(Math.random()*100)+1;\n\t\t\tproductData.push({name:productLegend[i][j],value:n});\n\t\t\ttotal+=n;\n\t\t}\n\t\tfor(var j=0;j<productLegend[i].length;j++)\n\t\t{\t\t\n\t\t\tproductColor.push(productClassColor[i]+(1.0-productData[j].value/total).toFixed(2)+\")\");\n\t\t}\n\t\tproductClassData.push({name:productClassLegend[i],value:total});\n\t}\n\t\n\tproductPie=echarts.init(document.getElementById('productPie'));\n\tproductPie_option={\n\t\ttitle : {\n\t\t\ttext: '销售额',\t\t\t\n\t\t\tx: 'center',\n\t\t\ty: 'center',\n\t\t\titemGap: 10,\n\t\t\ttextStyle : {\n\t\t\t\tcolor : '#09F',\n\t\t\t\tfontWeight: 'normal',\n\t\t\t\tfontFamily : '微软雅黑',\n\t\t\t\tfontSize : 32\n\t\t\t}\n\t\t},\n\t\tcalculable : false,\n\t\ttooltip : {\n\t\t\ttrigger: 'item',\n\t\t\ttextStyle: {\n\t\t\t\tcolor:'#FFF',\n\t\t\t\tfontSize:24\n\t\t\t},\n\t\t\tformatter: \"{a} <br/>{b} : {c} ({d}%)\"\n\t\t},\n\t\tseries : [\n\t\t\t{\n\t\t\t\tname:'类别',\n\t\t\t\ttype:'pie',\n\t\t\t\tselectedMode: 'single',\n\t\t\t\tradius : ['20%','40%'],\t\t\t\t\n\t\t\t\twidth: '40%',\n\t\t\t\tfunnelAlign: 'right',\n\t\t\t\titemStyle : {\n\t\t\t\t\tnormal : {\n\t\t\t\t\t\tcolor:function(d)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn productClassColor[d.dataIndex]+'1)';\n\t\t\t\t\t\t},\n\t\t\t\t\t\tborderColor:'#032749',\n\t\t\t\t\t\tlabel : {\n\t\t\t\t\t\t\tposition : 'inner',\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tfontSize:28,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlabelLine : {\n\t\t\t\t\t\t\tshow : false\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tdata:productClassData\n\t\t\t},\n\t\t\t{\n\t\t\t\tname:'车型',\n\t\t\t\ttype:'pie',\n\t\t\t\tradius : ['40%','70%'],\t\t\t\t\n\t\t\t\twidth: '35%',\n\t\t\t\tfunnelAlign: 'left',\n\t\t\t\titemStyle : {\t\t\t\t\t\n\t\t\t\t\tnormal : {\n\t\t\t\t\t\tcolor:function(d)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\treturn productColor[d.dataIndex];\n\t\t\t\t\t\t},\n\t\t\t\t\t\tborderColor:'#032749',\n\t\t\t\t\t\tlabel : {\n\t\t\t\t\t\t\tcolor:'#B7E1FF',\t\t\t\t\t\t\n\t\t\t\t\t\t\tfontSize:24\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\t\t\t\n\t\t\t\tdata:productData\n\t\t\t}\n\t\t]\n\t};\n\tproductPie.setOption(productPie_option);\n\t\n\t//业务进展图\n\tbusinessProgress=echarts.init(document.getElementById('businessProgress'));\t\n\tbusinessProgress_placeHoledStyle = {\n\t\tnormal:{\n\t\t\tbarBorderColor:'rgba(0,0,0,0)',\n\t\t\tcolor:'rgba(0,0,0,0)'\n\t\t},\n\t\temphasis:{\n\t\t\tbarBorderColor:'rgba(0,0,0,0)',\n\t\t\tcolor:'rgba(0,0,0,0)'\n\t\t}\n\t};\n\tbusinessProgress_dataStyle = { \n\t\tnormal: {\n\t\t\tbarBorderColor:'rgba(0,102,255,1)',\n\t\t\tcolor:function(d){\n\t\t\t\treturn 'rgba(0,102,255,0.3)';\n\t\t\t},\n\t\t\tlabel : {\n\t\t\t\tshow: true,\n\t\t\t\tposition: 'insideLeft',\n\t\t\t\tformatter: '{c}%',\n\t\t\t\ttextStyle: {\t\t\t\t\t\t\n\t\t\t\t\tfontFamily:'Arial',\n\t\t\t\t\tfontWeight: 'bolder',\n\t\t\t\t\tcolor:'#B7E1FF',\n\t\t\t\t\tfontSize:24\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\t\n\tbusinessProgress_option = {\n\t\ttitle: {show:false},\n\t\ttooltip : {\n\t\t\ttrigger: 'axis',\n\t\t\taxisPointer : {\n\t\t\t\ttype : 'shadow'\n\t\t\t},\n\t\t\ttextStyle: {\n\t\t\t\tcolor:'#FFF',\n\t\t\t\tfontSize:24\n\t\t\t},\n\t\t\tformatter : '{b}<br/>{a0}:{c0}%<br/>{a2}:{c2}%<br/>{a4}:{c4}%<br/>{a6}:{c6}%'\n\t\t},\n\t\tlegend: {\t\t\t\n\t\t\titemGap : 60,\n\t\t\ttop:'top',\n\t\t\ttextStyle: {\t\t\t\t\t\t\n\t\t\t\tfontFamily:'微软雅黑',\n\t\t\t\tfontWeight: 'bolder',\n\t\t\t\tcolor:'#B7E1FF',\n\t\t\t\tfontSize:24\n\t\t\t},\n\t\t\tdata:['项目投标', '投标进度','项目进行', '项目交付']\n\t\t},\n\t\ttoolbox: {show : false},\n\t\tgrid: {\n\t\t\tleft: 150\n\t\t},\n\t\txAxis : [\n\t\t\t{\n\t\t\t\ttype : 'value',\n\t\t\t\tposition: 'top',\n\t\t\t\taxisLine:{\n\t\t\t\t\tlineStyle:{color:'#09F'}\n\t\t\t\t},\n\t\t\t\tsplitLine :{\n\t\t\t\t\tlineStyle:{color:'#09F'\t}\n\t\t\t\t},\n\t\t\t\taxisLabel: {show: false},\n\t\t\t}\n\t\t],\n\t\tyAxis : [\n\t\t\t{\n\t\t\t\ttype : 'category',\n\t\t\t\tdata : ['重大业务1', '重大业务2', '重大业务3', '重大业务4'],\n\t\t\t\taxisLabel: {\n\t\t\t\t\ttextStyle: {\n\t\t\t\t\t\tcolor: '#B7E1FF',\n\t\t\t\t\t\tfontSize:24\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\taxisLine:{\n\t\t\t\t\tlineStyle:{\n\t\t\t\t\t\tcolor:'#09F'\t\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsplitLine :{\n\t\t\t\t\tlineStyle:{color:'#09F'\t}\n\t\t\t\t}\n\t\t\t}\n\t\t],\n\t\tseries : [\n\t\t\t{\n\t\t\t\tname:'项目投标',\n\t\t\t\ttype:'bar',\n\t\t\t\tstack: '进度',\n\t\t\t\titemStyle : businessProgress_dataStyle,\n\t\t\t\tdata:[100, 100, 100, 70]\n\t\t\t},\n\t\t\t{\n\t\t\t\tname:'项目投标',\n\t\t\t\ttype:'bar',\n\t\t\t\tstack: '进度',\n\t\t\t\titemStyle: businessProgress_placeHoledStyle,\n\t\t\t\tdata:[0, 0, 0, 30]\n\t\t\t},\n\t\t\t{\n\t\t\t\tname:'投标进度',\n\t\t\t\ttype:'bar',\n\t\t\t\tstack: '进度',\n\t\t\t\titemStyle : businessProgress_dataStyle,\n\t\t\t\tdata:[100, 100, 42, 0]\n\t\t\t},\n\t\t\t{\n\t\t\t\tname:'投标进度',\n\t\t\t\ttype:'bar',\n\t\t\t\tstack: '进度',\n\t\t\t\titemStyle: businessProgress_placeHoledStyle,\n\t\t\t\tdata:[0, 0, 58, 100]\n\t\t\t},\n\t\t\t{\n\t\t\t\tname:'项目进行',\n\t\t\t\ttype:'bar',\n\t\t\t\tstack: '进度',\n\t\t\t\titemStyle : businessProgress_dataStyle,\n\t\t\t\tdata:[100, 100, 0, 0]\n\t\t\t},\n\t\t\t{\n\t\t\t\tname:'项目进行',\n\t\t\t\ttype:'bar',\n\t\t\t\tstack: '进度',\n\t\t\t\titemStyle: businessProgress_placeHoledStyle,\n\t\t\t\tdata:[0, 0, 100, 100]\n\t\t\t},\n\t\t\t{\n\t\t\t\tname:'项目交付',\n\t\t\t\ttype:'bar',\n\t\t\t\tstack: '进度',\n\t\t\t\titemStyle : businessProgress_dataStyle,\n\t\t\t\tdata:[71, 50, 0, 0]\n\t\t\t},\n\t\t\t{\n\t\t\t\tname:'项目交付',\n\t\t\t\ttype:'bar',\n\t\t\t\tstack: '进度',\n\t\t\t\titemStyle: businessProgress_placeHoledStyle,\n\t\t\t\tdata:[29, 50, 100, 100]\n\t\t\t}\n\t\t]\n\t};\n\tbusinessProgress.setOption(businessProgress_option);\n\t\n\t\n\t//监控仪表盘\n\t/*option_gauge = {\t\t\n\t\ttitle: {\n\t\t\ttext: '', //标题文本内容\n\t\t},\n\t\ttoolbox: { //可视化的工具箱\n\t\t\tshow: false,                \n\t\t},\n\t\ttooltip: { //弹窗组件\n\t\t\tformatter: \"{a} <br/>{b} : {c}%\"\n\t\t},\t\t\t\n\t\tseries: [{          \n\t\t\ttype: 'gauge',\n\t\t\taxisLine: {// 坐标轴线\n\t\t\t\tlineStyle: { // 属性lineStyle控制线条样式\n\t\t\t\t\tcolor:[[0.2, color[0]],[0.8, color[1]],[1, color[0]]],\n\t\t\t\t\twidth: 18\n\t\t\t\t }\n\t\t\t},\t\t\t\t \n\t\t\tsplitLine: { // 分隔线\n\t\t\t\t\tshow:true,\n\t\t\t\t\tlength: 18,\n\t\t\t\t\tlineStyle: {                            \n\t\t\t\t\t\tcolor: '#28292D',\n\t\t\t\t\t\twidth: 1\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\taxisTick : { //刻度线样式（及短线样式）\n\t\t\t\tshow:false,\n\t\t\t\tlineStyle: {                    \n\t\t\t\t\t\tcolor: 'auto',\n\t\t\t\t\t\twidth: 1\n\t\t\t\t\t},\n\t\t\t\tlength : 20\n\t\t\t},\n\t\t\taxisLabel : {\n\t\t\t\tcolor:'#FFF',\n\t\t\t\tfontSize:14,\n\t\t\t\tfontFamily:'Verdana, Geneva, sans-serif'\n\t\t\t},\n\t\t\ttitle: {\t\t\t\t\t\n\t\t\t\t\ttextStyle: { // 其余属性默认使用全局文本样式，详见TEXTSTYLE\n\t\t\t\t\t\tfontWeight: 'bolder',\n\t\t\t\t\t\tfontSize: 20,                          \n\t\t\t\t\t\tcolor: '#FFF'\n\t\t\t\t\t},\n\t\t\t\t\toffsetCenter: [0, '30%']\n\t\t\t\t},\n\t\t\tpointer: {\n\t\t\t\t\twidth: 5,                     \n\t\t\t\t\tcolor: '#F00',\n\t\t\t\t\tshadowColor: '#FF0',\n\t\t\t\t\tshadowBlur: 10\n\t\t\t\t},\n\t\t\tdetail: {\n\t\t\t\tshow:false,\n\t\t\t\tformatter:'{value}%',\n\t\t\t\ttextStyle: \n\t\t\t\t{\n\t\t\t\t\tfontFamily:'Arial',\n\t\t\t\t\tcolor: '#000',\n\t\t\t\t\tfontSize:'32px'\t\t\t\t\t\t\n\t\t\t\t},\n\t\t\t\toffsetCenter: [0, '90%']\n\t\t\t},\n\t\t\tdata: [{value: 45, name: '水'}]\n\t\t}]\n     };\n\t\t\n\tgauge1 = echarts.init(document.getElementById('gauge1'));\n\tgauge2 = echarts.init(document.getElementById('gauge2'));\n\tgauge3 = echarts.init(document.getElementById('gauge3'));\n\tgauge4 = echarts.init(document.getElementById('gauge4'));\t\n\tgauge5 = echarts.init(document.getElementById('gauge5'));\n\toption_gauge.series[0].axisLine.lineStyle.color=[[0.2, color[0]],[0.8, color[1]],[1, color[2]]];\n\toption_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"水\";\n\t$('#vg1').html(option_gauge.series[0].data[0].value);\n\tgauge1.setOption(option_gauge);\n\toption_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"电\";\n\t$('#vg2').html(option_gauge.series[0].data[0].value);\n\tgauge2.setOption(option_gauge);\n\toption_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"天然气\";\n\t$('#vg3').html(option_gauge.series[0].data[0].value);\n\tgauge3.setOption(option_gauge);\n\toption_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"压缩空气\";\n\t$('#vg4').html(option_gauge.series[0].data[0].value);\n\tgauge4.setOption(option_gauge);\n\toption_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"蒸汽\";\n\t$('#vg5').html(option_gauge.series[0].data[0].value);\n\tgauge5.setOption(option_gauge);*/\n\t\n\t//生产质量堆积图\n\tquality_chart = echarts.init(document.getElementById('quality'));\n\tquality_option={\n\t\ttitle: {\t\t\t\n\t\t\tshow:false,\n\t\t\ttext: 'AUDIT',\n\t\t\tleft: 'center',\n\t\t\ttextStyle: {\n\t\t\t\tcolor: '#F00',\n\t\t\t\tfontSize:32\n\t\t\t}\n\t\t},\n\t\txAxis: {\n\t\t\tdata: ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],\n\t\t\taxisLabel: {\n\t\t\t\ttextStyle: {\n\t\t\t\t\tcolor: '#B7E1FF',\n\t\t\t\t\tfontSize:24\n\t\t\t\t}\n\t\t\t},\n\t\t\taxisLine:{\n\t\t\t\tlineStyle:{\n\t\t\t\t\tcolor:'#09F'\t\n\t\t\t\t}\n\t\t\t},\n\t\t\taxisTick:{\n\t\t\t\tlineStyle:{\n\t\t\t\t\tcolor:'#09F'\t\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tyAxis: {\n\t\t\tinverse: false,\n\t\t\tsplitArea: {show: false},\n\t\t\taxisLine:  {show: false},\n\t\t\taxisTick:  {show: false},\n\t\t\taxisLabel: {\n\t\t\t\ttextStyle: {\n\t\t\t\t\tcolor: '#B7E1FF',\n\t\t\t\t\tfontSize:24,\n\t\t\t\t\tfontFamily:'Arial',\n\t\t\t\t}\n\t\t\t},\n\t\t\tsplitLine :{\n\t\t\t\tlineStyle:{\n\t\t\t\t\tcolor:'#09F'\t\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgrid: {\n\t\t\tleft: 100\n\t\t},\n\t\ttooltip: {\n\t\t\ttrigger: 'item',\n\t\t\ttextStyle: {\n\t\t\t\tcolor: '#B7E1FF',\n\t\t\t\tfontSize:24\n\t\t\t}\n\t\t},\n\t\tlegend:{\n\t\t\tshow:false,\n\t\t\ttop: 'bottom',\n\t\t\ttextStyle: {\n\t\t\t\tcolor: '#F00',\n\t\t\t\tfontSize:24,\n\t\t\t\tfontFamily:'微软雅黑'\n\t\t\t},\n\t\t\tdata:['AUDIT分数1','AUDIT分数']\n\t\t},\n\t\tseries: [\n\t\t\t{\n\t\t\t\tname: 'AUDIT分数1',\n\t\t\t\ttype: 'bar',\n\t\t\t\tstack: 'one',\n\t\t\t\titemStyle: \n\t\t\t\t{\n\t\t\t\t\tnormal: {color: color[1]}\n\t\t\t\t},\n\t\t\t\tbarWidth : 60,\n\t\t\t\tdata:[2200,2900,3680,2200,2900,3680,2200,2900,3680,2200,2900,3680]\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'AUDIT分数',\n\t\t\t\ttype: 'bar',\n\t\t\t\tstack: 'one',\n\t\t\t\titemStyle: {\n\t\t\t\t\tnormal: {\n\t\t\t\t\t\tcolor: '#F90',\n\t\t\t\t\t\tlabel: {\n\t\t\t\t\t\t\t show: true,\n\t\t\t\t\t\t\t position: 'insideTop',\n\t\t\t\t\t\t\t textStyle: {\n\t\t\t\t\t\t\t\t color: '#000',\n\t\t\t\t\t\t\t\t fontSize:24\n\t\t\t\t\t\t\t }\n\t\t\t\t\t\t }\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tbarWidth : 50,\n\t\t\t\tdata: [1800,1100,320,1800,1100,320,1800,1100,320,1800,1100,320]\n\t\t\t}\n\t\t]\n\t};\n\tquality_chart.setOption(quality_option);\n\t\n\t//生产计划折线图\n\tvar plan_data1=[];\n\tvar plan_data2=[];\n\tvar plan_xAxis=[];\n\tfor (var i = 1; i <= 12; i++) {\n\t\tplan_xAxis.push(i+\"月\");\n\t\tplan_data1.push(Math.round(Math.random() * 100));\n\t\tplan_data2.push(Math.round(Math.random() * 100));\n\t}\n\tplan_chart = echarts.init(document.getElementById('plan'));\n\tplan_option={\t\t\n\t\txAxis: {\n\t\t\tdata:plan_xAxis,\n\t\t\taxisLabel: {\n\t\t\t\ttextStyle: {\n\t\t\t\t\tcolor: '#B7E1FF',\n\t\t\t\t\tfontSize:24\n\t\t\t\t}\n\t\t\t},\n\t\t\taxisLine:{\n\t\t\t\tlineStyle:{\n\t\t\t\t\tcolor:'#09F'\t\n\t\t\t\t}\n\t\t\t},\n\t\t\taxisTick:{\n\t\t\t\tlineStyle:{\n\t\t\t\t\tcolor:'#09F'\t\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tyAxis: {\t\t\t\n\t\t\tinverse: false,\n\t\t\tsplitArea: {show: false},\n\t\t\taxisLine:  {show: false},\n\t\t\taxisTick:  {show: false},\n\t\t\taxisLabel: {\n\t\t\t\ttextStyle: {\n\t\t\t\t\tcolor: '#B7E1FF',\n\t\t\t\t\tfontSize:24,\n\t\t\t\t\tfontFamily:'Arial',\n\t\t\t\t}\n\t\t\t},\n\t\t\tsplitLine :{\n\t\t\t\tlineStyle:{\n\t\t\t\t\tcolor:'#09F'\t\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttooltip: {\n\t\t\ttrigger: 'axis',\n\t\t\ttextStyle: {\n\t\t\t\tcolor: '#FFF',\n\t\t\t\tfontSize:24\n\t\t\t}\n\t\t},\n\t\tgrid: {\n\t\t\tleft: 100\n\t\t},\n\t\tlegend:{\n\t\t\tshow:false,\n\t\t\ttop: 'bottom',\n\t\t\ttextStyle: {\n\t\t\t\tcolor: '#F00',\n\t\t\t\tfontSize:24\n\t\t\t},\t\t\t\n\t\t\tdata:['计划完成数','实际完成数']\n\t\t},\n\t\tseries: [\n\t\t\t{\n\t\t\t\tname: '计划完成数',\n\t\t\t\ttype: 'bar',\n\t\t\t\titemStyle: \n\t\t\t\t{\n\t\t\t\t\tnormal: {color: color[1]},\n\t\t\t\t\temphasis: {color: color[2]}\n\t\t\t\t},\n\t\t\t\tbarWidth : 40,\n\t\t\t\tdata:plan_data1\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: '实际完成数',\n\t\t\t\ttype: 'line',\n\t\t\t\titemStyle: {\n\t\t\t\t\tnormal: {\n\t\t\t\t\t\tcolor: '#F90',\n\t\t\t\t\t\tlabel: {\n\t\t\t\t\t\t\t show: true,\n\t\t\t\t\t\t\t position: 'top',\n\t\t\t\t\t\t\t textStyle: {\n\t\t\t\t\t\t\t\t color: '#CCC',\n\t\t\t\t\t\t\t\t fontSize:24\n\t\t\t\t\t\t\t }\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlineStyle:{\n\t\t\t\t\t\t\tcolor:'#F90',\n\t\t\t\t\t\t\twidth:4\n\t\t\t\t\t\t}\t\t\t\t \n\t\t\t\t\t},\n\t\t\t\t\temphasis: {\n\t\t\t\t\t\tcolor: '#FF0'\n\t\t\t\t\t}\t\n\t\t\t\t},\t\t\t\n\t\t\t\tsymbolSize: 24,\n\t\t\t\tdata: plan_data2\n\t\t\t}\n\t\t]\n\t};\n\tplan_chart.setOption(plan_option);\n\t\n\t//轮番显示tips\n\t/*function clock(){\n\t  showToolTip_highlight(plan_chart);\t  \n\t}\n\tsetInterval(clock, 5000);*/\n\t\n\t//词云\n\tvar cloudData=[];\n\tfor(var i=0;i<30;i++)\n\t{\n\t\tcloudData.push({name:'文字云字符'+i.toString(),value:Math.random()*1000});\n\t}\n\twordCloud=echarts.init(document.getElementById('wordCloud'));\n\twordCloud_option={\n\t\tleft: 'center',\n        top: 'center',        \n\t\ttooltip: {\n\t\t\ttextStyle: {\n\t\t\t\tcolor: '#FFF',\n\t\t\t\tfontSize:24\n\t\t\t}},\n\t\tseries : [{  \n            type : 'wordCloud',  \n            shape:'smooth',  \n\t\t\tdrawOutOfBound: true,\n            gridSize : 10,  \n            sizeRange : [ 10, 48 ],\n\t\t\trotationRange: [0, 0],\n            textStyle : {  \n                normal : {  \n                    color :function (d) {\n\t\t\t\t\t\t// Random color\n\t\t\t\t\t\treturn 'rgba(0,153,255,'+(d.value/1000)+ ')';\n\t\t\t\t\t}\n                },  \n                emphasis : {  \n                    shadowBlur : 10,  \n                    shadowColor : '#333'  \n                }  \n            },  \n            data : cloudData\n        }]\n\t};\n\t\n\twordCloud.setOption(wordCloud_option);\n\t\n\t//地图开始\n\tvar map_chart = echarts.init(document.getElementById('map'));\n\t/*map_option = {\t\t\t\n\t\ttitle : {show:false},\n\t\ttooltip: {\n\t\t\tshow:function(d)\n\t\t\t{\n\t\t\t\treturn (d.value!=null && d.value>=0);\n\t\t\t},\n\t\t\ttrigger: 'item',\n\t\t\tformatter:function(d){\n\t\t\t\treturn (d.value>=0)?d.name+'</br>战略力度：'+(d.value).toFixed(2):'';\n\t\t\t},\n\t\t\ttextStyle: {\n\t\t\t\tcolor: '#FFF',\n\t\t\t\tfontSize:24\n\t\t\t}\n\t\t},\n\t\tlegend: {\n\t\t\tshow:false\t\t\t\n\t\t},\n\t\tdataRange: {  \n\t\t\tshow:false,\n\t\t\tmin: 0,  \n\t\t\tmax: 100,  \n\t\t\ttext:['High','Low'],  \n\t\t\trealtime: false,  \n\t\t\tcalculable : false,  \n\t\t\tcolor: ['rgba(0,51,204,0.8)','rgba(0,102,255,0.8)','rgba(0,153,255,0.8)'],\n\t\t\tsplitList: [\n\t\t\t\t{start: 0,end: 30},\n\t\t\t\t{start: 31, end: 70},\n\t\t\t\t{start: 71, end: 100},\n\t\t\t]\n\t\t},\t\t\n\t\tseries: [{\n\t\t\tname: '布局',  \n\t\t\ttype: 'map',  \n\t\t\tmapType: 'china',  \n\t\t\troam: false, \n\t\t\tshowLegendSymbol : false,\n\t\t\tlabel: {\n\t\t\t\tshow: true,\n\t\t\t\ttextStyle: {\n\t\t\t\t\t color: '#FFF',\n\t\t\t\t\t fontSize:18\n\t\t\t\t }\n\t\t\t},\n\t\t\titemStyle :{\n\t\t\t\tareaColor :'rgba(0,0,0,0.2)',\n\t\t\t\tborderColor : '#09F'\n\t\t\t},\n\t\t\temphasis:{\t\t\t\t\n\t\t\t\tareaColor :'rgba(255,0,0,0.8)',\n\t\t\t\tborderColor : 'rgba(255,0,0,0.8)'\n\t\t\t},\n\t\t\tdata:[\n\t\t\t\t{name: '北京', value:Math.random()*100},\n\t\t\t\t{name: '天津', value:Math.random()*100},\n\t\t\t\t{name: '上海', value:Math.random()*100},\n\t\t\t\t{name: '重庆', value:Math.random()*100},\n\t\t\t\t{name: '河北', value:Math.random()*100},\n\t\t\t\t{name: '河南', value:Math.random()*100},\t\t\t\t\n\t\t\t\t{name: '辽宁', value:Math.random()*100},\n\t\t\t\t{name: '黑龙江', value:Math.random()*100},\n\t\t\t\t{name: '湖南', value:Math.random()*100},\n\t\t\t\t{name: '安徽', value:Math.random()*100},\n\t\t\t\t{name: '山东', value:Math.random()*100},\t\t\t\t\n\t\t\t\t{name: '江苏', value:Math.random()*100},\n\t\t\t\t{name: '浙江', value:Math.random()*100},\n\t\t\t\t{name: '江西', value:Math.random()*100},\n\t\t\t\t{name: '湖北', value:Math.random()*100},\n\t\t\t\t{name: '广西', value:Math.random()*100},\n\t\t\t\t{name: '甘肃', value:Math.random()*100},\n\t\t\t\t{name: '山西', value:Math.random()*100},\n\t\t\t\t{name: '内蒙古', value:Math.random()*100},\n\t\t\t\t{name: '陕西', value:Math.random()*100},\n\t\t\t\t{name: '吉林', value:Math.random()*100},\n\t\t\t\t{name: '福建', value:Math.random()*100},\n\t\t\t\t{name: '贵州', value:Math.random()*100},\n\t\t\t\t{name: '广东', value:Math.random()*100},\n\t\t\t\t{name: '青海', value:Math.random()*100},\t\t\t\t\n\t\t\t\t{name: '四川', value:Math.random()*100},\n\t\t\t\t{name: '宁夏', value:Math.random()*100},\n\t\t\t\t{name: '海南', value:Math.random()*100}\n\t\t\t]\t\n\t\t}]\n\t};*/\n\tvar mapData=[];\n\tfor(key in geoCoordMap)\n\t{\n\t\tvar geoCoord = geoCoordMap[key];\n\t\tmapData.push({name:key,value:geoCoord.concat((Math.random()*1000).toFixed(2))});\n\t}\t\n\n\tmap_option = {\n\t\ttitle : {show:false},\n\t\ttooltip : {\n\t\t\ttrigger: 'item',\n\t\t\tformatter: function(params) {\n                if (typeof(params.value)[2] == \"undefined\") {\n                    return params.name + ' : ' + params.value;\n                } else {\n                    return params.name + ' : ' + params.value[2];\n                }\n            },\n\t\t\ttextStyle: {\n\t\t\t\tcolor: '#FFF',\n\t\t\t\tfontSize:24\n\t\t\t}\n\t\t},\n\t\tlegend: {\n\t\t\tshow:false\t\t\t\n\t\t},\n\t\tgeo: {\n\t\t\tmap: 'china',\n\t\t\tlabel: {\n\t\t\t\tnormal: {show: false},\n\t\t\t\temphasis: {show: false}\n\t\t\t},\n\t\t\troam: false,\n\t\t\titemStyle: {\n\t\t\t\tnormal: {\n\t\t\t\t\tareaColor: 'rgba(0,153,255,0.6)',\n\t\t\t\t\tborderColor: '#09F'\n\t\t\t\t},\n\t\t\t\temphasis: {\n\t\t\t\t\tareaColor: 'rgba(0,153,255,0.6)',\n\t\t\t\t\tborderColor: '#09F'\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tseries: [{\n\t\t\tname: '战略布局点',\n\t\t\ttype: 'scatter',\n\t\t\tcoordinateSystem: 'geo',\n\t\t\tzlevel: 1,\n\t\t\trippleEffect: {\n\t\t\t\tbrushType: 'stroke'\n\t\t\t},\t\t\t\n\t\t\tsymbolSize: function (val) {\n\t\t\t\treturn val[2] / 30;\n\t\t\t},\n\t\t\tlabel: {\t\t\t\t\n\t\t\t\tnormal: {show: false},\n\t\t\t\temphasis: {show: false}\n\t\t\t},\n\t\t\titemStyle: {\n\t\t\t\tnormal: {color: 'rgba(255,255,0,0.8)'},\n\t\t\t\temphasis: {color: 'rgba(246,33,87,1)'}\n\t\t\t},\n\t\t\tdata: mapData\n\t\t},\t\n\t\t{\n\t\t\tname: '战略布局TOP5',\n\t\t\ttype: 'effectScatter',\n\t\t\tcoordinateSystem: 'geo',\n\t\t\tzlevel: 2,\n\t\t\thoverAnimation: true,\n\t\t\tshowEffectOn: 'render',\n\t\t\trippleEffect: {\n\t\t\t\tbrushType: 'stroke'\n\t\t\t},\n\t\t\tlabel: {\t\t\t\t\n\t\t\t\tnormal: {\n\t\t\t\t\tshow: true,\n\t\t\t\t\tfontFamily:'微软雅黑',\n\t\t\t\t\tfontSize: 24,\n\t\t\t\t\tcolor:'#FFF',\n\t\t\t\t\tformatter: '{b}',\n\t\t\t\t\tposition: 'right',\n\t\t\t\t\tshadowBlur: 5,\n                    shadowColor: '#000'\t\t\t\t\t\n\t\t\t\t},\n\t\t\t\temphasis: {\n\t\t\t\t\tshow: true\n\t\t\t\t}\n\t\t\t},\t\t\t\n\t\t\tsymbolSize: function (val) {\n\t\t\t\treturn val[2] / 30;\n\t\t\t},\n\t\t\titemStyle: {\n\t\t\t\tnormal: {\n\t\t\t\t\tcolor: 'rgba(255,255,255,1)'\n\t\t\t\t}\n\t\t\t},\n\t\t\tdata: mapData.sort(function(a, b) {\n                    return b.value[2] - a.value[2];\n                }).slice(0, 5)\n\t\t},\t\n\t\t{\n\t\t\tname: '点',\n\t\t\ttype: 'scatter',\n\t\t\tcoordinateSystem: 'geo',\n\t\t\tsymbol: 'pin',\n\t\t\tsymbolSize: function(val) {                    \n\t\t\t\treturn val[2]/10;\n\t\t\t},\n\t\t\tlabel: {\t\t\t\t\n\t\t\t\tnormal: {\n\t\t\t\t\tshow: true,\n\t\t\t\t\tfontFamily:'Arial, Helvetica, sans-serif',\n\t\t\t\t\tformatter:'{@[2]}',\t\t\t\t\t\n\t\t\t\t\ttextStyle: {\n\t\t\t\t\t\tcolor: '#FFF',\n\t\t\t\t\t\tfontSize: 18,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\titemStyle: {\n\t\t\t\tnormal: {\n\t\t\t\t\tcolor: 'rgba(246,33,87,1)', //标志颜色\n\t\t\t\t}\n\t\t\t},\n\t\t\tzlevel: 3,                \n\t\t\tdata: mapData.sort(function(a, b) {\n                    return b.value[2] - a.value[2];\n                }).slice(0, 5)\n\t\t}]\n\t};\n\t\n\tmap_chart.setOption(map_option, true);\n\t\n\tresresh();\n\t\n\t//开始定时刷新\n\tsetInterval(resresh, 5*1000);\n});\n\nvar convertData = function (data) {\n    var res = [];\n    for (var i = 0; i < data.length; i++) {\n        var dataItem = data[i];\n        var fromCoord = geoCoordMap[dataItem[0].name];\n        var toCoord = geoCoordMap[dataItem[1].name];\n        if (fromCoord && toCoord) {\n            res.push({\n                fromName: dataItem[0].name,\n                toName: dataItem[1].name,\n                coords: [fromCoord, toCoord]\n            });\n        }\n    }\n    return res;\n};\n\nfunction showToolTip_highlight(mychart)\n{  \n  var echartObj = mychart;\n  \t  \n  // 高亮当前图形\n  var highlight =setInterval(function() \n  {\n\t  echartObj.dispatchAction({\n\t\t  type: 'highlight',\n\t\t  seriesIndex: 0,\n\t\t  dataIndex: indexnum\n\t  });\n\t  \n\t  echartObj.dispatchAction({\n\t\t  type: 'showTip',\n\t\t  seriesIndex: 0,\n\t\t  dataIndex: indexnum\n\t  });\n\t  clearInterval(highlight);\n\t  indexnum = indexnum + 1;\n  \t  if(indexnum>=7) indexnum=0;\t  \t  \n  },1000);\n}\n\n//定时刷新数据\nfunction resresh()\n{\n\tvar myDate = new Date();\n\t\n\t// $('#refresh').html(\"<img src=\\\"images/wait.gif\\\" align=\\\"absmiddle\\\"><span>数据刷新中...</span>\");\n\t$('#currentDate').html(myDate.getFullYear()+\"/\"+insertZero(myDate.getMonth()+1)+\"/\"+insertZero(myDate.getDate()));\t\n\t\n\tvar maxg=Math.round(Math.random()*500)+400;\n\tvar n1=Math.round(Math.random()*(maxg-100))+100;\n\tvar n2=Math.round(Math.random()*(n1-50))+50;\t\n\tvar n3=(n2/maxg*100).toFixed(2);\t\n\t\n\t//年进度条\n\toption_Progress.title.text =\"计划生产\";\n\toption_Progress.series[0].data[0].value = maxg;\n\toption_Progress.title.subtext =maxg+\"台\";\n\toption_Progress.series[0].data[1].value =0;\n\ty_gauge1.setOption(option_Progress);\n\t\n\toption_Progress.title.text =\"已接订单\";\n\toption_Progress.series[0].data[0].value = n1;\n\toption_Progress.title.subtext =n1+\"台\";\n\toption_Progress.series[0].data[1].value =(maxg-n1);\n\ty_gauge2.setOption(option_Progress);\n\t\n\toption_Progress.title.text =\"已经完成\";\n\toption_Progress.series[0].data[0].value = n2;\n\toption_Progress.title.subtext =n2+\"台\";\n\toption_Progress.series[0].data[1].value =(maxg-n2);\n\ty_gauge3.setOption(option_Progress);\n\t\n\toption_Progress.title.text =\"计划完成率\";\n\toption_Progress.series[0].data[0].value = n3;\n\toption_Progress.title.subtext =n3+\"%\";\n\toption_Progress.series[0].data[1].value =(100-n3);\n\ty_gauge4.setOption(option_Progress);\n\t\n\t//仪表盘刷新\n\t/*option_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"水\";\n\t$('#vg1').html(option_gauge.series[0].data[0].value);\n\tgauge1.setOption(option_gauge);\n\toption_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"电\";\n\t$('#vg2').html(option_gauge.series[0].data[0].value);\n\tgauge2.setOption(option_gauge);\n\toption_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"天然气\";\n\t$('#vg3').html(option_gauge.series[0].data[0].value);\n\tgauge3.setOption(option_gauge);\n\toption_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"压缩空气\";\n\t$('#vg4').html(option_gauge.series[0].data[0].value);\n\tgauge4.setOption(option_gauge);\n\toption_gauge.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;\n\toption_gauge.series[0].data[0].name =\"蒸汽\";\n\t$('#vg5').html(option_gauge.series[0].data[0].value);\n\tgauge5.setOption(option_gauge);\t*/\n\t\t\t\n\t//显示最后更新时间\n\t$('#refresh').html(\"<span id=\\\"refreshTime\\\">最后刷新时间：\"+myDate.toLocaleDateString()+\" \"+myDate.toLocaleTimeString()+\"</span>\");\n}\n\n//生成订单号\nfunction getOrderNumber(n)\n{\n\tvar no=\"000000\"+n.toString();\n\treturn no.substring(no.length-6);\n}\n\n//前面补0\nfunction insertZero(n)\n{\n\tvar no=\"000000\"+n.toString();\n\treturn no.substring(no.length-2);\n}\n\n//打开模态窗口\nfunction openDialog(DlgName)\n{\t\t\n\t$('#'+DlgName).dialog('open');\t\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/css/style.css",
    "content": "/** 初始化 **/\n\nhtml,\nbody {\n    width: 100%;\n    height: 100%;\n}\n\nbody,\ndiv,\ndl,\ndt,\ndd,\nul,\nol,\nli,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\ninput,\nbutton,\ntextarea,\np,\nblockquote,\nth,\ntd,\nform,\npre {\n    margin: 0;\n    padding: 0;\n    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n    color: #333;\n}\n\nbody {\n    -webkit-font-feature-settings: 'kern' 1;\n    -moz-font-feature-settings: 'kern' 1;\n    -o-font-feature-settings: 'kern' 1;\n    text-rendering: geometricPrecision;\n    font-family: \"Microsoft YaHei\";\n}\n\na:active,\na:hover {\n    outline: 0\n}\n\nimg {\n    display: inline-block;\n    border: none;\n    vertical-align: middle;\n}\n\nli {\n    list-style: none;\n}\n\ntable {\n    border-collapse: collapse;\n    border-spacing: 0;\n}\n\nh1,\nh2,\nh3 {\n    font-size: 14px;\n    font-weight: 400;\n}\n\nh4,\nh5,\nh6 {\n    font-size: 100%;\n    font-weight: 400;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n    font-size: 100%;\n}\n\ninput,\nbutton,\ntextarea,\nselect,\noptgroup,\noption {\n    font-family: inherit;\n    font-size: inherit;\n    font-style: inherit;\n    font-weight: inherit;\n    outline: 0;\n}\n\npre {\n    white-space: pre-wrap;\n    white-space: -moz-pre-wrap;\n    white-space: -pre-wrap;\n    white-space: -o-pre-wrap;\n    word-wrap: break-word;\n}\n\n\n/** 滚动条 **/\n\n::-webkit-scrollbar {\n    width: 5px;\n    height: 10px;\n}\n\n::-webkit-scrollbar-button:vertical {\n    display: none;\n}\n\n::-webkit-scrollbar-track,\n::-webkit-scrollbar-corner {\n    background-color: rgba(14, 148, 234, 0.2);\n}\n\n::-webkit-scrollbar-thumb {\n    border-radius: 0;\n    background-color: rgba(0, 0, 0, .3);\n}\n\n::-webkit-scrollbar-thumb:vertical:hover {\n    background-color: rgba(0, 0, 0, .35);\n}\n\n::-webkit-scrollbar-thumb:vertical:active {\n    background-color: rgba(0, 0, 0, .38);\n}\n\n\n/*下拉框*/\n\n.select {\n    width: 1.6rem;\n    height: 0.4rem;\n    position: relative;\n    font-size: 0.18rem;\n    color: #cdddf7;\n    outline: none;\n}\n\n.select-div {\n    box-sizing: border-box;\n    width: 1.6rem;\n    height: 0.4rem;\n    line-height: 0.4rem;\n    border: 1px solid #0E94EA;\n    background: url(../images/arrow.png) 95% center no-repeat;\n    padding-left: 10px;\n    cursor: default;\n    position: absolute;\n    top: 0;\n    left: 0;\n    color: #cdddf7;\n}\n\n.select-ul {\n    position: absolute;\n    width: 1.6rem;\n    top: 0.5rem;\n    left: 0;\n    z-index: 10;\n    display: none;\n}\n\n.select-ul.company {\n    height: 1.2rem;\n    overflow-y: auto;\n}\n\n.select-ul>li {\n    height: 0.4rem;\n    line-height: 0.4rem;\n    padding-left: 10px;\n    box-sizing: border-box;\n    background-color: rgba(14, 148, 234, 0.2);\n    cursor: default;\n    color: #cdddf7;\n}\n\n.select-ul>li.active,\n.select-ul>li:hover {\n    color: white;\n    background: #0e94eb;\n}\n\n.select-ul>li {\n    width: 1.6rem;\n}\n\n.data-box {\n    width: 4.9rem;\n    position: absolute;\n    margin: auto;\n    top: 0.42rem;\n    bottom: 0;\n    left: 0;\n    right: 0;\n}\n\n.chart-box {\n    position: absolute;\n    top: 0.42rem;\n    bottom: 0;\n    width: 90%;\n    margin: auto;\n    left: 0;\n    right: 0;\n    height: auto;\n}\n\n.container-flex {\n    width: 100%;\n    height: 100%;\n    background: url(../images/index_bg.png) left top no-repeat;\n    background-size: 100% 100%;\n    display: flex;\n    flex-flow: row nowrap;\n    justify-content: center;\n    outline: none;\n}\n\n.box-left {\n    width: 28%;\n    height: 100%;\n    background: url(../images/line_img.png) top right repeat-y;\n}\n\n.left-top {\n    width: 100%;\n    height: 20.4%;\n    position: relative;\n}\n\n.left-top>.current-num {\n    width: 4.9rem;\n    height: 1.8rem;\n    position: absolute;\n    margin: auto;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    right: 0;\n    background: url(../images/border_bg01.png) top left no-repeat;\n    background-size: 100% 100%;\n}\n\n.current-num>div {\n    width: 100%;\n    height: 0.8rem;\n    line-height: 0.8rem;\n    text-align: center;\n    background: url(../images/title_bg01.png) center center no-repeat;\n    font-size: 0.2rem;\n    color: #0e94ea;\n    background-size: 1.8rem 0.25rem;\n    font-weight: 900;\n}\n\n.current-num>p {\n    font-size: 0.46rem;\n    text-align: center;\n    color: white;\n}\n\n.left-center {\n    width: 100%;\n    height: 37%;\n    position: relative;\n}\n\n.pie-chart>div {\n    float: left;\n    width: 50%;\n    height: 100%;\n    position: relative;\n}\n\n.pie-data {\n    height: 2.25rem;\n    position: absolute;\n    margin: auto;\n    top: 0;\n    left: 0;\n    width: 100%;\n    bottom: 0;\n    display: flex;\n    align-items: center;\n    flex-flow: row wrap;\n    overflow-y: auto;\n    padding-right: 5px;\n}\n\n.pie-data p {\n    width: 100%;\n    height: 0.45rem;\n    line-height: 0.45rem;\n    font-size: 0.2rem;\n    color: #cdddf7;\n    display: flex;\n    flex-flow: row nowrap;\n    justify-content: space-around;\n    cursor: default;\n}\n\n.pie-data p>span {\n    width: 0;\n    flex-grow: 1;\n    margin: 0 5px;\n    text-align: left;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n}\n\n.pie-data p>.pie-number {\n    flex-grow: 2;\n}\n\n.legend {\n    display: inline-block;\n    width: 0.2rem;\n    height: 0.16rem;\n    line-height: 0.2rem;\n    border-radius: 2px;\n    background: white;\n}\n\n.left-bottom {\n    width: 100%;\n    height: 42.6%;\n    position: relative;\n}\n\n.filter-con {\n    width: 100%;\n    height: 0.4rem;\n    position: absolute;\n    float: left;\n    top: 10px;\n    left: 0;\n    display: none;\n    flex-flow: row nowrap;\n    justify-content: space-between;\n    /*    visibility: hidden;*/\n    z-index: 999;\n}\n\n.pop-filter {\n    width: 5.2rem;\n    top: 1.1rem;\n    left: 0.5rem;\n}\n\n.pop-filters {\n    width: 5.2rem;\n    top: 1.1rem;\n    left: 0.5rem;\n}\n\n.gd-map {\n    width: 100%;\n    height: 90%;\n}\n\n.box-center {\n    width: 44%;\n    height: 100%;\n    /*    background: green;*/\n}\n\n.center-top {\n    width: 100%;\n    height: 8.8%;\n    position: relative;\n    top: 0;\n    left: 0;\n    background: url(../images/title_border.png) bottom center no-repeat;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n}\n\n.center-top>h1 {\n    color: #cdddf7;\n    font-size: 0.45rem;\n    font-weight: 900;\n    letter-spacing: 5px;\n}\n\n.center-center {\n    width: 100%;\n    height: 15.3%;\n    display: flex;\n    flex-flow: row nowrap;\n    justify-content: center;\n    align-items: center;\n}\n\n.weather-box {\n    width: 4.1rem;\n    height: 1.1rem;\n    border: 1px solid #0E94EA;\n    display: flex;\n    flex-flow: row nowrap;\n    justify-content: space-around;\n    align-items: center;\n}\n\n.weather-box>.data {\n    width: 2.19rem;\n    height: 0.65rem;\n    border-right: 2px solid #cdddf7;\n}\n\n.data>p {\n    font-size: 0.16rem;\n    margin: 0 5px;\n    color: #cdddf7;\n    text-align: center;\n    margin: 0;\n}\n\n.data>p>span {\n    margin: 0 5px;\n}\n\n.data>p.time {\n    font-size: 0.42rem;\n    height: 0.42rem;\n    line-height: 0.42rem;\n}\n\n.weather-box>.weather {\n    width: 1.8rem;\n    height: 0.65rem;\n    display: flex;\n    flex-flow: row nowrap;\n    justify-content: space-around;\n    align-items: center;\n    margin-left: 10px;\n}\n\n.weather>img {\n    height: 100%;\n}\n\n.weather>div {\n    width: 0.8rem;\n    height: 100%;\n}\n\n.weather>div>p {\n    font-size: 0.12rem;\n    color: #cdddf7;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    height: 0.24rem;\n    line-height: 0.24rem;\n}\n\n.weather>div>p.active {\n    color: white;\n    font-size: 0.16rem;\n}\n\n.select-box {\n    width: 3.4rem;\n    height: 1.1rem;\n    box-sizing: border-box;\n    position: relative;\n}\n\n.select-pop {\n    width: 1.6rem;\n}\n\n.select-box>ul,\n.select-pop>ul {\n    width: 1.6rem;\n    height: 0.4rem;\n    font-size: 0.18rem;\n    overflow: hidden;\n    border: 1px solid #0E94EA;\n    position: absolute;\n    top: 0;\n    left: 0;\n}\n\n.select-box>ul>li,\n.select-pop>ul>li {\n    width: 0.8rem;\n    height: 0.4rem;\n    line-height: 0.4rem;\n    text-align: center;\n    float: left;\n    color: #cdddf7;\n    cursor: pointer;\n}\n\n.select-box>ul>li.active,\n.select-pop>ul>li.active {\n    background: #0e94eb;\n    color: white;\n}\n\n.select-box>div {\n    width: 100%;\n    height: 0.4rem;\n    position: absolute;\n    bottom: 0;\n    left: 0;\n    display: flex;\n    flex-flow: row nowrap;\n    justify-content: space-between;\n}\n\n.center-center>img {\n    width: 0.13rem;\n    height: 1.1rem;\n    margin: 0 0.2rem;\n}\n\n.center-bottom {\n    width: 100%;\n    height: 75.9%;\n    position: relative;\n}\n\n.center-bottom>.city-data {\n    width: 8.05rem;\n    height: 100%;\n    margin: auto;\n    position: absolute;\n}\n\n.city-box {\n    width: 1.8rem;\n    /*    height: 1.9rem;*/\n    border: 1px solid #0e94ea;\n    position: absolute;\n    top: 0;\n    left: 0;\n}\n\n.city-box>p {\n    height: 0.4rem;\n    line-height: 0.4rem;\n    text-align: center;\n    border-bottom: 1px solid #0e94ea;\n    font-size: 0.18rem;\n    color: #cdddf7;\n    box-sizing: border-box;\n}\n\n.city-box>p>span {\n    color: #d09d26;\n}\n\n.city-btn {\n    width: 100%;\n    /*    height: 0.5rem;*/\n    display: flex;\n    flex-flow: row wrap;\n    align-items: center;\n    justify-content: space-around;\n    overflow: hidden;\n}\n\n.city-btn>li,\n.city-div>li {\n    font-size: 0.14rem;\n    height: 0.2rem;\n    line-height: 0.2rem;\n    float: left;\n    color: white;\n    margin: 0.02rem 0;\n    padding: 0 0.03rem;\n    cursor: pointer;\n}\n\n.city-btn>li.active,\n.city-btn>li:hover,\n.city-div>li.active,\n.city-div>li:hover {\n    background: #0e94ea;\n}\n\n.city-div {\n    width: 100%;\n    height: 1rem;\n    display: flex;\n    flex-flow: row wrap;\n    /*    align-items: center;*/\n    justify-content: flex-start;\n    overflow-y: auto;\n}\n\n.city-div>li {\n    padding: 0 0.05rem;\n    text-align: center;\n}\n\n.ranking-box {\n    width: 2.5rem;\n    border: 1px solid #0e94ea;\n    position: absolute;\n    left: 0;\n    bottom: 20px;\n    background-color: rgba(14, 148, 235, 0.102);\n}\n\n.ranking-box>li {\n    width: 100%;\n    height: 0.3rem;\n    line-height: 0.3rem;\n    display: flex;\n    flex-flow: row nowrap;\n    justify-content: space-around;\n    font-size: 0.18rem;\n    color: rgba(255, 255, 255, .7);\n}\n\n.ranking-box>li>span {\n    width: 0;\n    flex-grow: 1;\n    text-align: center;\n}\n\n.ranking-box>li>p {\n    width: 0;\n    flex-grow: 2;\n    color: rgba(255, 255, 255, .7);\n    text-align: center;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n}\n\n.ranking-box>li:nth-child(2n+1) {\n    background: rgba(14, 148, 235, 0.102);\n}\n\n.ranking-box>li:first-child {\n    height: 0.4rem;\n    line-height: 0.4rem;\n    font-size: 0.2rem;\n    background: rgba(14, 148, 235, 0.8);\n}\n\n.ranking-box>li:first-child>p {\n    color: white;\n}\n\n.box-right {\n    width: 28%;\n    height: 100%;\n    background: url(../images/line_img.png) top left repeat-y;\n}\n\n.right-top {\n    width: 100%;\n    height: 41%;\n    box-sizing: border-box;\n    padding-top: 0.2rem;\n    position: relative;\n}\n\n.right-top>.data-box,\n.right-top>.chart-box {\n    top: 1rem;\n}\n\n.table1 {\n    font-size: 0.16rem;\n    border: 1px solid #0e94ea;\n    border-top: none;\n    border-right: none;\n    margin: auto;\n}\n\n.table1 tr {\n    border-top: 1px solid #0e94ea;\n    background: rgba(14, 148, 234, 0.1);\n}\n\n.table1 tr.bg-color {\n    background: rgba(14, 148, 234, 0.2);\n}\n\n.table1 tr td {\n    border-right: 1px solid #0e94ea;\n    height: 0.4rem;\n    line-height: 0.4rem;\n    color: #cdddf7;\n    text-align: center;\n}\n\n.table1 tr td.data-table {\n    color: #fff;\n}\n\n.table1 tr td:nth-child(2n+1) {\n    width: 1rem;\n}\n\n.table1 tr td:nth-child(2n) {\n    width: 1.4rem;\n}\n\n.table2 {\n    font-size: 0.16rem;\n    border: 1px solid #0e94ea;\n    border-top: none;\n    border-right: none;\n    margin: auto;\n}\n\n.table2 tr {\n    border-top: 1px solid #0e94ea;\n    background: rgba(14, 148, 234, 0.1);\n}\n\n.table2 tr.bg-color {\n    background: rgba(14, 148, 234, 0.2);\n}\n\n.table2 tr td {\n    border-right: 1px solid #0e94ea;\n    height: 0.6rem;\n    line-height: 0.6rem;\n    color: #cdddf7;\n    text-align: center;\n}\n\n.table2tr td.data-table {\n    color: #fff;\n}\n\n.table2 tr td:nth-child(2n+1) {\n    width: 1.8rem;\n}\n\n.table2 tr td:nth-child(2n) {\n    width: 2.5rem;\n}\n\n.right-center {\n    width: 100%;\n    height: 29%;\n    position: relative;\n}\n\n.time-box {\n    width: 3.9rem;\n    height: 0.4rem;\n    position: absolute;\n    top: 5px;\n    right: 0;\n    overflow: hidden;\n    z-index: 10;\n    display: none;\n}\n\n.time-div {\n    float: left;\n    width: 1.8rem;\n    height: 0.4rem;\n    position: relative;\n}\n\n.time-div.end {\n    float: right;\n}\n\n.time-div>img {\n    width: 0.2rem;\n    height: 0.2rem;\n    margin: auto;\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    right: 0.1rem;\n}\n\n.time-input {\n    width: 1.8rem;\n    height: 0.4rem;\n    box-sizing: border-box;\n    border: 1px solid #0E94EA;\n    font-size: 0.16rem;\n    background: rgba(14, 148, 234, 0.2);\n    position: absolute;\n    top: 0;\n    left: 0;\n    color: #cdddf7;\n    padding-left: 10px;\n}\n\n.data-box>.data-number {\n    width: 4.9rem;\n    height: 2.3rem;\n    position: absolute;\n    margin: auto;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background: url(../images/bg_img03.png) top left no-repeat;\n    background-size: 100% 100%;\n    color: #cdddf7;\n    font-size: 0.4rem;\n    line-height: 2.3rem;\n    text-align: center;\n}\n\n.right-bottom {\n    width: 100%;\n    height: 30%;\n    position: relative;\n}\n\n.data-box>.settings-box {\n    box-sizing: border-box;\n    width: 4.9rem;\n    height: 2.38rem;\n    position: absolute;\n    margin: auto;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background-color: rgba(14, 148, 234, 0.2);\n    border: 1px solid #0E94EA;\n    color: white;\n    font-size: 0.18rem;\n    overflow: hidden;\n}\n\n.settings-box>p {\n    color: #cdddf7;\n    margin-bottom: 0.46rem;\n    padding-left: 0.4rem;\n    height: 0.22rem;\n    line-height: 0.22rem;\n}\n\n.settings-box>p:first-child {\n    padding-top: 0.46rem;\n}\n\n.settings-box>div {\n    display: flex;\n    flex-flow: row nowrap;\n    align-items: center;\n    justify-content: center;\n    padding-top: 0.2rem;\n}\n\n.settings-box>div>p {\n    width: 2.9rem;\n    font-size: 0.14rem;\n    padding: 0;\n    color: #cdddf7;\n}\n\n.settings-box>p>img {\n    width: 0.2rem;\n    height: 0.22rem;\n    margin-right: 5px;\n}\n\n.settings-box>p>span,\n.settings-box>div>p>span {\n    color: white;\n    margin: 0 0.15rem;\n}\n\n.settings-box>div>img {\n    height: 0.2rem;\n    margin: 0 0.05rem;\n}\n\n.config {\n    text-decoration: underline;\n    cursor: pointer;\n}\n\n.settings-box>form label {\n    color: #cdddf7;\n    margin-right: 10px;\n}\n\n.four-f {\n    letter-spacing: 0.045rem;\n}\n\n.settings-box>form input {\n    width: 1.2rem;\n    height: 0.4rem;\n    border: 1px solid #0E94EA;\n    background: rgba(14, 148, 235, 0.2);\n    color: white;\n    padding-left: 0.1rem;\n}\n\n.settings-box>form>div {\n    width: 94%;\n    margin: auto;\n}\n\n.set-ter {\n    height: 0.64rem;\n    line-height: 0.64rem;\n}\n\n.set-time {\n    height: 0.4rem;\n    width: 3.56rem;\n    padding-left: 1.2rem;\n}\n\n.set-time>.time-div,\n.set-time>.time-div>input {\n    width: 1.6rem;\n}\n\n.end-1 {\n    margin-left: 0.1rem;\n}\n\n.set-peo {\n    height: 0.70rem;\n    line-height: 0.7rem;\n}\n\n.settings-box>.set-btn {\n    height: 0.64rem;\n    line-height: 0.64rem;\n    text-align: center;\n    padding-top: 0;\n}\n\n.set-btn>button {\n    width: 0.9rem;\n    height: 0.4rem;\n    border: 1px solid #0E94EA;\n    background: rgba(14, 148, 235, 0.2);\n    color: white;\n    margin: 0 5px;\n    cursor: pointer;\n}\n\n.settings-box>.close-icon {\n    display: block;\n    width: 0.16rem;\n    height: 0.16rem;\n    position: absolute;\n    top: 5px;\n    right: 5px;\n    background: url(../images/close_icon.png) top left no-repeat;\n    background-size: 100% 100%;\n    cursor: pointer;\n}\n\n.settings-box>.kf {\n    padding-top: 0.8rem;\n    line-height: 0.3rem;\n}\n\n.title-box {\n    width: 4.9rem;\n    height: 0.42rem;\n    background: url(../images/box_title.png) top left no-repeat;\n    background-size: 100% 100%;\n    margin: auto;\n    display: flex;\n    flex-flow: row nowrap;\n    align-items: center;\n    position: relative;\n}\n\n.title-box>h6,\n.title-box>p {\n    font-size: 0.2rem;\n    color: white;\n    height: 0.42rem;\n    line-height: 0.42rem;\n    margin-left: 0.4rem;\n}\n\n.title-box>p>span {\n    cursor: pointer;\n    color: rgba(255, 255, 255, .6);\n}\n\n.title-box>p>span.active {\n    color: rgba(255, 255, 255, 1);\n}\n\n.line-img {\n    width: 1px;\n    height: 0.2rem;\n    margin: 0 10px;\n}\n\n.title-box>.line-img {\n    position: absolute;\n    right: 1.3rem;\n}\n\n.title-box>button {\n    font-size: 0.18rem;\n    border: none;\n    background: transparent;\n    color: #cdddf7;\n    height: 0.42rem;\n    position: absolute;\n    right: 0.6rem;\n    display: flex;\n    flex-flow: row nowrap;\n    align-items: center;\n    cursor: pointer;\n}\n\n.title-box>button:hover {\n    color: white;\n}\n\n.title-box>button>img {\n    width: 0.2rem;\n    height: 0.2rem;\n    margin-right: 5px;\n}\n\n.unit {\n    font-size: 0.16rem;\n    height: 0.4rem;\n    color: #cdddf7;\n    text-align: right;\n    padding-right: 0.3rem;\n    line-height: 0.4rem;\n}\n\n.container {\n    width: 100%;\n    height: 100%;\n    background: rgba(0, 0, 0, .7);\n    position: absolute;\n    top: 0;\n    left: 0;\n    display: flex;\n    visibility: hidden;\n    justify-content: center;\n    align-items: center;\n}\n\n.pop-up {\n    width: 70%;\n    height: 80%;\n    background: url(../images/popUP_bg.png) top left no-repeat;\n    background-size: 100% 100%;\n    position: absolute;\n    padding: 0.2rem 0.5rem;\n    visibility: hidden;\n}\n\n.pop-up .title {\n    width: 100%;\n    height: 0.9rem;\n    line-height: 0.9rem;\n    font-size: 0.3rem;\n    color: white;\n    padding-left: 0.2rem;\n    background: url(../images/title_line.png) center left no-repeat;\n}\n\n.pop-up .pie-chart {\n    width: 76%;\n    height: 80%;\n}\n\n.pop-up .pie-data {\n    width: 80%;\n}\n\n.pop-chart {\n    width: 80%;\n    top: 1.5rem;\n    left: 2.3rem;\n    bottom: 0.5rem;\n}\n\n.pop-charts {\n    width: 60%;\n    top: 0.45rem;\n    left: 2.3rem;\n    bottom: 0.5rem;\n}\n\n.pop-up .pie-data p {\n    height: 0.6rem;\n    line-height: 0.6rem;\n    font-size: 0.28rem;\n}\n\n.pop-up .pie-data .legend {\n    width: 0.38rem;\n    height: 0.28rem;\n    vertical-align: middle;\n}\n\n.close-pop {\n    display: inline-block;\n    position: absolute;\n    top: 0.3rem;\n    right: 0.5rem;\n    width: 13px;\n    height: 0.9rem;\n    background: url(../images/close.png) center left no-repeat;\n    background-size: 13px 13px;\n    cursor: pointer;\n    z-index: 99;\n}\n\n.pop-data {\n    width: 2rem;\n    position: absolute;\n    top: 2.25rem;\n    bottom: 0.5rem;\n    left: 0.5rem;\n}\n\n.cont-div {\n    width: 100%;\n    height: 100%;\n    position: absolute;\n    top: 0;\n    left: 0;\n    padding: 0.2rem 0.5rem;\n    visibility: hidden;\n}\n\n.pop-data-box {\n    width: 60%;\n    height: 50%;\n    background: url(../images/bg_img04.png) top left no-repeat;\n    background-size: 100% 100%;\n    position: absolute;\n    margin: 0 auto;\n    bottom: 20%;\n    left: 0;\n    right: 0;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    color: #cdddf7;\n    font-size: 0.88rem;\n}\n\n.pop-data-box p {\n    color: #cdddf7;\n}\n\n.btn-class {\n    height: 0.4rem;\n    padding: 0 15px;\n    border: 1px solid #0E94EA;\n    font-size: 0.18rem;\n    background: transparent;\n    color: #cdddf7;\n    position: absolute;\n    top: 1.7rem;\n    left: 0.5rem;\n    display: flex;\n    flex-flow: row nowrap;\n    justify-content: center;\n    align-items: center;\n    cursor: pointer;\n}\n\n.btn-class>img {\n    width: 0.18rem;\n    height: 0.18rem;\n}\n\n.enlarge-btn {\n    width: 0.36rem;\n    height: 0.36rem;\n    background: url(../images/menu_btn.png) top left no-repeat;\n    background-size: 100% 100%;\n    float: left;\n    border: none;\n    cursor: pointer;\n}\n\n.enlarge-btn:hover,\n.enlarge-btn.active {\n    background: url(../images/menu_on.png) top left no-repeat;\n    background-size: 100% 100%;\n}\n\n.enlarge-box {\n    height: 0.36rem;\n    position: absolute;\n    bottom: 20px;\n    left: 3rem;\n    overflow: hidden;\n}\n\n.modal-btn {\n    float: left;\n    display: none;\n}\n\n.modal-btn>li {\n    float: left;\n    width: 0.36rem;\n    height: 0.36rem;\n    line-height: 0.36rem;\n    box-sizing: border-box;\n    border: 1px solid #0E94EA;\n    border-left: none;\n    color: #cdddf7;\n    font-size: 0.18rem;\n    text-align: center;\n    cursor: default;\n    position: relative;\n}\n\n.modal-btn>li>div {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 0.36rem;\n    height: 0.36rem;\n    background: url(../images/fangda.png) top left no-repeat;\n    background-size: 100% 100%;\n    display: none;\n}\n\n.modal-btn>li:hover>div {\n    display: block;\n}\n\n.pop-time .time-box {\n    top: 1.28rem;\n    left: -3rem;\n}\n\n\n.set-div {\n    width: 9.8rem;\n    height: 88%;\n    margin: 0 auto;\n    overflow: hidden;\n    overflow-y: auto;\n    font-size: 0.18rem;\n}\n\n.four-f {\n    letter-spacing: 0.045rem;\n}\n\n.set-box {\n    height: 0.63rem;\n    display: flex;\n    flex-flow: row nowrap;\n    align-items: center;\n}\n\n.set-box>label {\n    color: #cdddf7;\n    margin-right: 10px;\n    float: left;\n}\n\n.set-box>input,\n.pages-div>input {\n    width: 0.8rem;\n    height: 0.4rem;\n    border: 1px solid #0E94EA;\n    background: rgba(14, 148, 235, 0.2);\n    color: white;\n    padding-left: 0.1rem;\n}\n\n.set-box>.input-edit {\n    width: 4.3rem;\n}\n\n.pages-div>input {\n    background: transparent;\n    margin: 0 0.2rem;\n}\n\n.set-box>input:nth-child(2n+1) {\n    margin: 0 0.07rem;\n}\n\n.set-box>button,\n.pages-div>button {\n    width: 0.36rem;\n    height: 0.36rem;\n    line-height: 0.38rem;\n    text-align: center;\n    background-color: transparent;\n    border: 1px solid #0E94EA;\n    color: white;\n    padding-left: 0.1rem;\n    cursor: pointer;\n}\n\n.plus {\n    margin: 0 0.07rem;\n    background: url(../images/plus.png) center center no-repeat;\n    background-size: 0.18rem;\n}\n\n.mineus {\n    background: url(../images/jian.png) center center no-repeat;\n    background-size: 0.18rem;\n    margin-left: 0.1rem;\n}\n\n.set-box>.add-btn {\n    width: 1rem;\n    margin-left: 0.4rem;\n    height: 0.4rem;\n    display: flex;\n    flex-flow: row nowrap;\n    align-items: center;\n    justify-content: center;\n}\n\n.add-btn>img {\n    width: 0.18rem;\n}\n\n.table3 {\n    font-size: 0.16rem;\n    border: 1px solid #0e94ea;\n    border-top: none;\n    margin: 10px auto;\n}\n\n.table3 tr {\n    border-top: 1px solid #0e94ea;\n    background: rgba(14, 148, 234, 0.1);\n}\n\n.table3 thead tr {\n    background: rgba(14, 148, 234, 0.4);\n}\n\n.table3 tr.bg-color {\n    background: rgba(14, 148, 234, 0.2);\n}\n\n.table3 tr td:nth-child(2n+1),\n.table3 tr td:nth-child(2n+1)>p {\n    width: 3rem;\n}\n\n.table3 tr td:nth-child(2n),\n.table3 tr td:nth-child(2n)>p {\n    width: 1.8rem;\n}\n\n.table3 tr td,\n.table3 tr th {\n    border-right: 1px solid #0e94ea;\n    height: 0.4rem;\n    line-height: 0.4rem;\n    color: #cdddf7;\n    text-align: center;\n}\n\n.table3 tr td p {\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    color: #cdddf7;\n}\n\n.table3 thead tr th {\n    border-right: none;\n}\n\n.pages-div {\n    height: 0.63rem;\n    display: flex;\n    flex-flow: row nowrap;\n    justify-content: center;\n    align-items: center;\n}\n\n.prev {\n    background: url(../images/prev.png) center center no-repeat;\n    background-size: 0.12rem;\n}\n\n.next {\n    background: url(../images/next.png) center center no-repeat;\n    background-size: 0.12rem;\n}\n\n.pages-div p {\n    color: white;\n    margin: 0 0.1rem;\n}\n\n.pages-div>.skip {\n    width: 0.7rem;\n    height: 0.4rem;\n    line-height: 0.4rem;\n}\n\n@media screen and (max-height: 670px) {\n    .right-top {\n        height: 47%;\n    }\n    .right-center {\n        height: 23%;\n    }\n    .data-box>.data-number {\n        height: 1.65rem;\n        line-height: 1.65rem;\n    }\n    .data-box>.settings-box {\n        height: 2rem;\n    }\n}\n\n.edit-div {\n    width: 6.5rem;\n    height: 2.9rem;\n    font-size: 0.18rem;\n    position: absolute;\n    margin: auto;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    padding: 0 0.4rem;\n    border: 1px solid #0e94eb;\n    background-color: rgb(20, 32, 48);\n    box-shadow: 0 0 10px #cdddf7;\n    box-sizing: border-box;\n}\n\n.edit-div h4 {\n    font-size: 0.2rem;\n    color: white;\n    height: 0.65rem;\n    line-height: 0.65rem;\n}\n\n.edit-box {\n    justify-content: flex-end;\n}\n\n.edit-box>button {\n    width: 0.92rem;\n    height: 0.4rem;\n    line-height: 0.4rem;\n    margin: 0 0.17rem;\n}\n\n.table3 tr td p.edit {\n    color: #0e94eb;\n    cursor: pointer;\n}\n\n.table3 tr td p.edit:hover,\n.table3 tr td p.edit.active {\n    color: #d09d26;\n}\n\n.tishi {\n    position: absolute;\n    margin: auto;\n    top: 0.4rem;\n    left: 0;\n    right: 0;\n    width: 4.8rem;\n    text-align: center;\n    height: 0.4rem;\n    line-height: 0.4rem;\n    border: 1px solid #d09d26;\n    background: rgba(239, 176, 19, 0.2);\n    font-size: 0.16rem;\n    color: white;\n    display: none;\n}\n\n@media screen and (max-height: 610px) {\n    .right-top {\n        height: 49%\n    }\n    .right-center {\n        height: 21%;\n    }\n    .data-box>.data-number {\n        height: 1.4rem;\n        line-height: 1.4rem;\n    }\n    .data-box>.settings-box {\n        height: 1.6rem;\n    }\n    .pop-data .ranking-box {\n        height: 1.9rem;\n        overflow-y: auto;\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/base.js",
    "content": "function fnW(str) {\n    var num;\n    str >= 10 ? num = str : num = \"0\" + str;\n    return num;\n}\n//获取当前时间\nvar timer = setInterval(function () {\n    var date = new Date();\n    var year = date.getFullYear(); //当前年份\n    var month = date.getMonth(); //当前月份\n    var data = date.getDate(); //天\n    var hours = date.getHours(); //小时\n    var minute = date.getMinutes(); //分\n    var second = date.getSeconds(); //秒\n    var day = date.getDay(); //获取当前星期几 \n    var ampm = hours < 12 ? 'am' : 'pm';\n    $('#time').html(fnW(hours) + \":\" + fnW(minute) + \":\" + fnW(second));\n    $('#date').html('<span>' + year + '/' + (month + 1) + '/' + data + '</span><span>' + ampm + '</span><span>周' + day + '</span>')\n\n}, 1000)\n\n\n\n//页面地图数据\nvar geoCoordMap = {\n    '海门': [121.15, 31.89],\n    '鄂尔多斯': [109.781327, 39.608266],\n    '招远': [120.38, 37.35],\n    '舟山': [122.207216, 29.985295],\n    '齐齐哈尔': [123.97, 47.33],\n    '盐城': [120.13, 33.38],\n    '赤峰': [118.87, 42.28],\n    '青岛': [120.33, 36.07],\n    '乳山': [121.52, 36.89],\n    '金昌': [102.188043, 38.520089],\n    '泉州': [118.58, 24.93],\n    '莱西': [120.53, 36.86],\n    '日照': [119.46, 35.42],\n    '胶南': [119.97, 35.88],\n    '南通': [121.05, 32.08],\n    '拉萨': [91.11, 29.97],\n    '云浮': [112.02, 22.93],\n    '梅州': [116.1, 24.55],\n    '文登': [122.05, 37.2],\n    '上海': [121.48, 31.22],\n    '攀枝花': [101.718637, 26.582347],\n    '威海': [122.1, 37.5],\n    '承德': [117.93, 40.97],\n    '厦门': [118.1, 24.46],\n    '汕尾': [115.375279, 22.786211],\n    '潮州': [116.63, 23.68],\n    '丹东': [124.37, 40.13],\n    '太仓': [121.1, 31.45],\n    '曲靖': [103.79, 25.51],\n    '烟台': [121.39, 37.52],\n    '福州': [119.3, 26.08],\n    '瓦房店': [121.979603, 39.627114],\n    '即墨': [120.45, 36.38],\n    '抚顺': [123.97, 41.97],\n    '玉溪': [102.52, 24.35],\n    '张家口': [114.87, 40.82],\n    '阳泉': [113.57, 37.85],\n    '莱州': [119.942327, 37.177017],\n    '湖州': [120.1, 30.86],\n    '汕头': [116.69, 23.39],\n    '昆山': [120.95, 31.39],\n    '宁波': [121.56, 29.86],\n    '湛江': [110.359377, 21.270708],\n    '揭阳': [116.35, 23.55],\n    '荣成': [122.41, 37.16],\n    '连云港': [119.16, 34.59],\n    '葫芦岛': [120.836932, 40.711052],\n    '常熟': [120.74, 31.64],\n    '东莞': [113.75, 23.04],\n    '河源': [114.68, 23.73],\n    '淮安': [119.15, 33.5],\n    '泰州': [119.9, 32.49],\n    '南宁': [108.33, 22.84],\n    '营口': [122.18, 40.65],\n    '惠州': [114.4, 23.09],\n    '江阴': [120.26, 31.91],\n    '蓬莱': [120.75, 37.8],\n    '韶关': [113.62, 24.84],\n    '嘉峪关': [98.289152, 39.77313],\n    '广州': [113.23, 23.16],\n    '延安': [109.47, 36.6],\n    '太原': [112.53, 37.87],\n    '清远': [113.01, 23.7],\n    '中山': [113.38, 22.52],\n    '昆明': [102.73, 25.04],\n    '寿光': [118.73, 36.86],\n    '盘锦': [122.070714, 41.119997],\n    '长治': [113.08, 36.18],\n    '深圳': [114.07, 22.62],\n    '珠海': [113.52, 22.3],\n    '宿迁': [118.3, 33.96],\n    '咸阳': [108.72, 34.36],\n    '铜川': [109.11, 35.09],\n    '平度': [119.97, 36.77],\n    '佛山': [113.11, 23.05],\n    '海口': [110.35, 20.02],\n    '江门': [113.06, 22.61],\n    '章丘': [117.53, 36.72],\n    '肇庆': [112.44, 23.05],\n    '大连': [121.62, 38.92],\n    '临汾': [111.5, 36.08],\n    '吴江': [120.63, 31.16],\n    '石嘴山': [106.39, 39.04],\n    '沈阳': [123.38, 41.8],\n    '苏州': [120.62, 31.32],\n    '茂名': [110.88, 21.68],\n    '嘉兴': [120.76, 30.77],\n    '长春': [125.35, 43.88],\n    '胶州': [120.03336, 36.264622],\n    '银川': [106.27, 38.47],\n    '张家港': [120.555821, 31.875428],\n    '三门峡': [111.19, 34.76],\n    '锦州': [121.15, 41.13],\n    '南昌': [115.89, 28.68],\n    '柳州': [109.4, 24.33],\n    '三亚': [109.511909, 18.252847],\n    '自贡': [104.778442, 29.33903],\n    '吉林': [126.57, 43.87],\n    '阳江': [111.95, 21.85],\n    '泸州': [105.39, 28.91],\n    '西宁': [101.74, 36.56],\n    '宜宾': [104.56, 29.77],\n    '呼和浩特': [111.65, 40.82],\n    '成都': [104.06, 30.67],\n    '大同': [113.3, 40.12],\n    '镇江': [119.44, 32.2],\n    '桂林': [110.28, 25.29],\n    '张家界': [110.479191, 29.117096],\n    '宜兴': [119.82, 31.36],\n    '北海': [109.12, 21.49],\n    '西安': [108.95, 34.27],\n    '金坛': [119.56, 31.74],\n    '东营': [118.49, 37.46],\n    '牡丹江': [129.58, 44.6],\n    '遵义': [106.9, 27.7],\n    '绍兴': [120.58, 30.01],\n    '扬州': [119.42, 32.39],\n    '常州': [119.95, 31.79],\n    '潍坊': [119.1, 36.62],\n    '重庆': [106.54, 29.59],\n    '台州': [121.420757, 28.656386],\n    '南京': [118.78, 32.04],\n    '滨州': [118.03, 37.36],\n    '贵阳': [106.71, 26.57],\n    '无锡': [120.29, 31.59],\n    '本溪': [123.73, 41.3],\n    '克拉玛依': [84.77, 45.59],\n    '渭南': [109.5, 34.52],\n    '马鞍山': [118.48, 31.56],\n    '宝鸡': [107.15, 34.38],\n    '焦作': [113.21, 35.24],\n    '句容': [119.16, 31.95],\n    '北京': [116.46, 39.92],\n    '徐州': [117.2, 34.26],\n    '衡水': [115.72, 37.72],\n    '包头': [110, 40.58],\n    '绵阳': [104.73, 31.48],\n    '乌鲁木齐': [87.68, 43.77],\n    '枣庄': [117.57, 34.86],\n    '杭州': [120.19, 30.26],\n    '淄博': [118.05, 36.78],\n    '鞍山': [122.85, 41.12],\n    '溧阳': [119.48, 31.43],\n    '库尔勒': [86.06, 41.68],\n    '安阳': [114.35, 36.1],\n    '开封': [114.35, 34.79],\n    '济南': [117, 36.65],\n    '德阳': [104.37, 31.13],\n    '温州': [120.65, 28.01],\n    '九江': [115.97, 29.71],\n    '邯郸': [114.47, 36.6],\n    '临安': [119.72, 30.23],\n    '兰州': [103.73, 36.03],\n    '沧州': [116.83, 38.33],\n    '临沂': [118.35, 35.05],\n    '南充': [106.110698, 30.837793],\n    '天津': [117.2, 39.13],\n    '富阳': [119.95, 30.07],\n    '泰安': [117.13, 36.18],\n    '诸暨': [120.23, 29.71],\n    '郑州': [113.65, 34.76],\n    '哈尔滨': [126.63, 45.75],\n    '聊城': [115.97, 36.45],\n    '芜湖': [118.38, 31.33],\n    '唐山': [118.02, 39.63],\n    '平顶山': [113.29, 33.75],\n    '邢台': [114.48, 37.05],\n    '德州': [116.29, 37.45],\n    '济宁': [116.59, 35.38],\n    '荆州': [112.239741, 30.335165],\n    '宜昌': [111.3, 30.7],\n    '义乌': [120.06, 29.32],\n    '丽水': [119.92, 28.45],\n    '洛阳': [112.44, 34.7],\n    '秦皇岛': [119.57, 39.95],\n    '株洲': [113.16, 27.83],\n    '石家庄': [114.48, 38.03],\n    '莱芜': [117.67, 36.19],\n    '常德': [111.69, 29.05],\n    '保定': [115.48, 38.85],\n    '湘潭': [112.91, 27.87],\n    '金华': [119.64, 29.12],\n    '岳阳': [113.09, 29.37],\n    '长沙': [113, 28.21],\n    '衢州': [118.88, 28.97],\n    '廊坊': [116.7, 39.53],\n    '菏泽': [115.480656, 35.23375],\n    '合肥': [117.27, 31.86],\n    '武汉': [114.31, 30.52],\n    '大庆': [125.03, 46.58],\n    '安徽省': [117.17, 31.52],\n    '北京市': [116.24, 39.55],\n    '重庆市': [106.54, 29.59],\n    '福建省': [119.18, 26.05],\n    '甘肃省': [103.51, 36.04],\n    '广东省': [113.14, 23.08],\n    '广西壮族自治区': [108.19, 22.48],\n    '贵州省': [106.42, 26.35],\n    '海南省': [110.20, 20.02],\n    '河北省': [114.30, 38.02],\n    '河南省': [113.40, 34.46],\n    '黑龙江省': [128.36, 45.44],\n    '湖北省': [112.27, 30.15],\n    '湖南省': [112.59, 28.12],\n    '吉林省': [125.19, 43.54],\n    '江苏省': [118.46, 32.03],\n    '江西省': [115.55, 28.40],\n    '辽宁省': [123.25, 41.48],\n    '内蒙古': [108.41, 40.48],\n    '内蒙古自治区': [108.41, 40.48],\n    '宁夏回族自治区': [106.16, 38.27],\n    '青海省': [101.48, 36.38],\n    '山东省': [118.00, 36.40],\n    '山西省': [112.33, 37.54],\n    '陕西省': [108.57, 34.17],\n    '上海市': [121.29, 31.14],\n    '海南': [108.77, 19.10],\n    '四川省': [104.04, 30.40],\n    '天津市': [117.12, 39.02],\n    '西藏自治区': [91.08, 29.39],\n    '新疆维吾尔自治区': [87.36, 43.45],\n    '云南省': [102.42, 25.04],\n    '浙江省': [120.10, 30.16],\n    '澳门特别行政区': [115.07, 21.33],\n    '台湾省': [121.21, 23.53],\n    '香港特别行政区': [114.1, 22.2]\n};\n\n$('.select').on('blur', function () {\n        $(this).find('.select-ul').hide();\n    })\n    //下拉框点击出现下拉框内容\n$('.select-div').on('click', function () {\n    if ($(this).siblings('.select-ul').is(\":hidden\")) {\n        $(this).siblings('.select-ul').show();\n    } else {\n        $(this).siblings('.select-ul').hide();\n    }\n})\n\n\n$('.select-ul').on('click', 'li', function () {\n    $(this).addClass('active').siblings('li').removeClass('active').parent().hide().siblings('.select-div').html($(this).html());\n    var parentDiv = $(this).parent().parent().parent();\n})\n\n//鼠标滑动到按钮，按钮内容变成白色\nvar imgName;\n$('.title-box').children('button').hover(function () {\n    imgName = $(this).children('img').attr('src').split('.png')[0];\n    $(this).children('img').attr('src', imgName + '_on.png');\n}, function () {\n    $(this).children('img').attr('src', imgName + '.png');\n\n});\n\n\nvar startColor = ['#0e94eb', '#c440ef', '#efb013', '#2fda07', '#d8ef13', '#2e4af8', '#0eebc4', '#f129b1', '#17defc', '#f86363'];\nvar borderStartColor = ['#0077c5', '#a819d7', '#c99002', '#24bc00', '#b6cb04', '#112ee2', '#00bd9c', '#ce078f', '#00b2cd', '#ec3c3c'];\n\n\n\n//入库量占比，带边框效果的饼图\nfunction chart1() {\n    //data 为模拟数据\n    var data = [{\n        name: '顺丰',\n        value: 192581,\n        percent: '30.8721',\n    }, {\n        name: '京东',\n        value: 215635,\n        percent: '34.076',\n    }, {\n        name: 'EMS',\n        value: 224585,\n        percent: '35.49',\n    }];\n    var myChart = echarts.init(document.getElementById('pie'));\n    var myChart1 = echarts.init(document.getElementById('pie1'));\n    window.addEventListener('resize', function () {\n        myChart.resize();\n        myChart1.resize();\n    });\n\n    var str = '';\n    for (var i = 0; i < data.length; i++) {\n        str += '<p><span><i class=\"legend\" style=\"background:' + startColor[i] + '\"></i></span>' + data[i].name + '<span class=\"pie-number\" style=\"color:' + startColor[i] + '\">' + data[i].value + '</span>' + Number(data[i].percent).toFixed(2) + '%</p>';\n    }\n\n    $('.pie-data').append(str);\n\n\n    function deepCopy(obj) {\n        if (typeof obj !== 'object') {\n            return obj;\n        }\n        var newobj = {};\n        for (var attr in obj) {\n            newobj[attr] = obj[attr];\n        }\n        return newobj;\n    }\n    var xData = [],\n        yData = [];\n    data.map((a, b) => {\n        xData.push(a.name);\n        yData.push(a.value);\n    });\n\n\n    var RealData = [];\n    var borderData = [];\n    data.map((item, index) => {\n        var newobj = deepCopy(item);\n        var newobj1 = deepCopy(item);\n        RealData.push(newobj);\n        borderData.push(newobj1);\n    });\n    RealData.map((item, index) => {\n        item.itemStyle = {\n            normal: {\n                color: {\n                    type: 'linear',\n                    x: 0,\n                    y: 0,\n                    x2: 0,\n                    y2: 1,\n                    colorStops: [{\n                        offset: 0,\n                        color: startColor[index] // 0% 处的颜色\n                }, {\n                        offset: 1,\n                        color: startColor[index] // 100% 处的颜色\n                }],\n                    globalCoord: false // 缺省为 false\n                },\n            }\n        }\n    });\n    borderData.map((item, index) => {\n        item.itemStyle = {\n            normal: {\n                color: {\n                    type: 'linear',\n                    x: 0,\n                    y: 0,\n                    x2: 0,\n                    y2: 1,\n                    colorStops: [{\n                        offset: 0,\n                        color: borderStartColor[index] // 0% 处的颜色\n                }, {\n                        offset: 1,\n                        color: borderStartColor[index] // 100% 处的颜色\n                }],\n                    globalCoord: false // 缺省为 false\n                },\n            }\n        }\n    });\n    var option = {\n        tooltip: {\n            trigger: 'item',\n            //            position: ['30%', '50%'],\n            confine: true,\n            formatter: \"{a} <br/>{b}: {c} ({d}%)\"\n        },\n        series: [\n        // 主要展示层的\n            {\n                radius: ['50%', '85%'],\n                center: ['50%', '50%'],\n                type: 'pie',\n                label: {\n                    normal: {\n                        show: false\n                    },\n                    emphasis: {\n                        show: false\n                    }\n                },\n                labelLine: {\n                    normal: {\n                        show: false\n                    },\n                    emphasis: {\n                        show: false\n                    }\n                },\n                name: \"派件入库量占比内容\",\n                data: RealData\n        },\n        // 边框的设置\n            {\n                radius: ['45%', '50%'],\n                center: ['50%', '50%'],\n                type: 'pie',\n                label: {\n                    normal: {\n                        show: false\n                    },\n                    emphasis: {\n                        show: false\n                    }\n                },\n                labelLine: {\n                    normal: {\n                        show: false\n                    },\n                    emphasis: {\n                        show: false\n                    }\n                },\n                animation: false,\n                tooltip: {\n                    show: false\n                },\n                data: borderData\n        }\n    ]\n    };\n\n    myChart.setOption(option);\n    myChart1.setOption(option);\n}\n\nchart1()\n\n//----------------------派件入库量占比内容end---------------\n\n//------------广东省寄派件数据内容---------------\n//点击筛选按钮\n$('#filBtn').on('click', function () {\n        if ($('#filCon').is(\":hidden\")) {\n            $('#filCon').attr('style', 'display:flex');\n        } else {\n            $('#filCon').hide();\n        }\n    })\n    //点击筛选按钮end\n\n\nfunction chart2(chartType) {\n    var data = [\n        {\n            name: '广州市',\n            value: 120057.34\n            },\n        {\n            name: '韶关市',\n            value: 15477.48\n            },\n        {\n            name: '深圳市',\n            value: 131686.1\n            },\n        {\n            name: '珠海市',\n            value: 6992.6\n            },\n        {\n            name: '汕头市',\n            value: 44045.49\n            },\n        {\n            name: '佛山市',\n            value: 40689.64\n            },\n        {\n            name: '江门市',\n            value: 37659.78\n            },\n        {\n            name: '湛江市',\n            value: 45180.97\n            },\n        {\n            name: '茂名市',\n            value: 5204.26\n            },\n        {\n            name: '肇庆市',\n            value: 21900.9\n            },\n        {\n            name: '惠州市',\n            value: 4918.26\n            },\n        {\n            name: '梅州市',\n            value: 5881.84\n            },\n        {\n            name: '汕尾市',\n            value: 4178.01\n            },\n        {\n            name: '河源市',\n            value: 2227.92\n            },\n        {\n            name: '阳江市',\n            value: 2180.98\n            },\n        {\n            name: '清远市',\n            value: 9172.94\n            },\n        {\n            name: '东莞市',\n            value: 3368\n            },\n        {\n            name: '中山市',\n            value: 306.98\n            },\n        {\n            name: '潮州市',\n            value: 810.66\n            },\n        {\n            name: '揭阳市',\n            value: 542.2\n            },\n        {\n            name: '云浮市',\n            value: 256.38\n            }]\n\n    var myChart = echarts.init(document.getElementById('gdMap'));\n    var myCharts = echarts.init(document.getElementById('gdMaps'));\n    window.addEventListener('resize', function () {\n        myChart.resize();\n        myCharts.resize();\n    });\n    var yMax = 0;\n    for (var j = 0; j < data.length; j++) {\n        if (yMax < data[j].value) {\n            yMax = data[j].value;\n        }\n    }\n        myChart.hideLoading();\n        myCharts.hideLoading();\n        var option = {\n            animation: true,\n            tooltip: {\n                show: true\n            },\n            visualMap: {\n                min: 0,\n                max: yMax,\n                text: ['高', '低'],\n                orient: 'horizontal',\n                itemWidth: 15,\n                itemHeight: 200,\n                right: 0,\n                bottom: 30,\n                inRange: {\n                    color: ['#75ddff', '#0e94eb']\n                },\n                textStyle: {\n                    color: 'white'\n                }\n            },\n            series: [\n                {\n                    name: '数据名称',\n                    type: 'map',\n                    mapType: '广东',\n                    selectedMode: 'multiple',\n                    tooltip: {\n                        trigger: 'item',\n                        formatter: '{b}<br/>{c} (件)'\n                    },\n                    itemStyle: {\n                        normal: {\n                            borderWidth: 1,\n                            borderColor: '#0e94eb',\n                            label: {\n                                show: false\n                            }\n                        },\n                        emphasis: { // 也是选中样式\n                            borderWidth: 1,\n                            borderColor: '#fff',\n                            backgroundColor: 'red',\n                            label: {\n                                show: true,\n                                textStyle: {\n                                    color: '#fff'\n                                }\n                            }\n                        }\n                    },\n                    data: data,\n            }\n            ]\n        };\n\n        myChart.setOption(option);\n        myCharts.setOption(option);\n}\nchart2('');\n\n//------------广东省寄派件数据内容end---------------\n\n//cityName全国的省级行政区域数据\nvar cityName = [{\n    \"ProID\": 1,\n    \"name\": \"北京\",\n    \"ProSort\": 1,\n    \"firstP\": \"B\",\n    \"ProRemark\": \"直辖市\"\n}, {\n    \"ProID\": 2,\n    \"name\": \"天津\",\n    \"ProSort\": 2,\n    \"firstP\": \"T\",\n    \"ProRemark\": \"直辖市\"\n}, {\n    \"ProID\": 3,\n    \"name\": \"河北\",\n    \"ProSort\": 5,\n    \"firstP\": \"H\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 4,\n    \"name\": \"山西\",\n    \"ProSort\": 6,\n    \"firstP\": \"S\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 5,\n    \"name\": \"内蒙古\",\n    \"ProSort\": 32,\n    \"firstP\": \"N\",\n    \"ProRemark\": \"自治区\"\n}, {\n    \"ProID\": 6,\n    \"name\": \"辽宁\",\n    \"ProSort\": 8,\n    \"firstP\": \"L\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 7,\n    \"name\": \"吉林\",\n    \"ProSort\": 9,\n    \"firstP\": \"J\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 8,\n    \"name\": \"黑龙江\",\n    \"ProSort\": 10,\n    \"firstP\": \"H\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 9,\n    \"name\": \"上海\",\n    \"ProSort\": 3,\n    \"firstP\": \"S\",\n    \"ProRemark\": \"直辖市\"\n}, {\n    \"ProID\": 10,\n    \"name\": \"江苏\",\n    \"ProSort\": 11,\n    \"firstP\": \"J\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 11,\n    \"name\": \"浙江\",\n    \"ProSort\": 12,\n    \"firstP\": \"Z\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 12,\n    \"name\": \"安徽\",\n    \"ProSort\": 13,\n    \"firstP\": \"A\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 13,\n    \"name\": \"福建\",\n    \"ProSort\": 14,\n    \"firstP\": \"F\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 14,\n    \"name\": \"江西\",\n    \"ProSort\": 15,\n    \"firstP\": \"J\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 15,\n    \"name\": \"山东\",\n    \"ProSort\": 16,\n    \"firstP\": \"S\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 16,\n    \"name\": \"河南\",\n    \"ProSort\": 17,\n    \"firstP\": \"H\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 17,\n    \"name\": \"湖北\",\n    \"ProSort\": 18,\n    \"firstP\": \"H\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 18,\n    \"name\": \"湖南\",\n    \"ProSort\": 19,\n    \"firstP\": \"H\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 19,\n    \"name\": \"广东\",\n    \"ProSort\": 20,\n    \"firstP\": \"G\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 20,\n    \"name\": \"海南\",\n    \"ProSort\": 24,\n    \"firstP\": \"H\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 21,\n    \"name\": \"广西\",\n    \"ProSort\": 28,\n    \"firstP\": \"G\",\n    \"ProRemark\": \"自治区\"\n}, {\n    \"ProID\": 22,\n    \"name\": \"甘肃\",\n    \"ProSort\": 21,\n    \"firstP\": \"G\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 23,\n    \"name\": \"陕西省\",\n    \"ProSort\": 27,\n    \"firstP\": \"S\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 24,\n    \"name\": \"新疆维吾尔\",\n    \"ProSort\": 31,\n    \"firstP\": \"X\",\n    \"ProRemark\": \"自治区\"\n}, {\n    \"ProID\": 25,\n    \"name\": \"青海\",\n    \"ProSort\": 26,\n    \"firstP\": \"Q\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 26,\n    \"name\": \"宁夏\",\n    \"ProSort\": 30,\n    \"firstP\": \"N\",\n    \"ProRemark\": \"自治区\"\n}, {\n    \"ProID\": 27,\n    \"name\": \"重庆\",\n    \"ProSort\": 4,\n    \"firstP\": \"C\",\n    \"ProRemark\": \"直辖市\"\n}, {\n    \"ProID\": 28,\n    \"name\": \"四川省\",\n    \"ProSort\": 22,\n    \"firstP\": \"S\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 29,\n    \"name\": \"贵州省\",\n    \"ProSort\": 23,\n    \"firstP\": \"G\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 30,\n    \"name\": \"云南省\",\n    \"ProSort\": 25,\n    \"firstP\": \"Y\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 31,\n    \"name\": \"西藏\",\n    \"ProSort\": 29,\n    \"firstP\": \"X\",\n    \"ProRemark\": \"自治区\"\n}, {\n    \"ProID\": 32,\n    \"name\": \"台湾\",\n    \"ProSort\": 7,\n    \"firstP\": \"T\",\n    \"ProRemark\": \"省份\"\n}, {\n    \"ProID\": 33,\n    \"name\": \"澳门\",\n    \"ProSort\": 33,\n    \"firstP\": \"A\",\n    \"ProRemark\": \"特别行政区\"\n}, {\n    \"ProID\": 34,\n    \"name\": \"香港\",\n    \"ProSort\": 34,\n    \"firstP\": \"X\",\n    \"ProRemark\": \"特别行政区\"\n}]\n\naddCityBtn(cityName);\n\nfunction addCityBtn(data) {\n    var li_con = '';\n    for (var i = 0; i < data.length; i++) {\n        li_con += '<li>' + data[i].name + '</li>'\n    }\n    $('#city').html(li_con);\n    $('#citys').html(li_con);\n}\n\n$('.city-btn').on('click', 'li', function () {\n    var str;\n    var patt = [/[a-z]/i, /[a-e]/i, /[f-i]/i, /[k-o]/i, /[p-t]/i, /[u-z]/i];\n    var index = $(this).index();\n    var li_con = '';\n    for (var i = 0; i < cityName.length; i++) {\n        str = cityName[i].firstP;\n        if (patt[index].test(str)) {\n            li_con += '<li>' + cityName[i].name + '</li>'\n        }\n    }\n\n    $(this).addClass('active').siblings('li').removeClass('active');\n    if (index == 0) {\n        $('#city').children().removeClass('active');\n        if ($(this).parent().data('city') == 1) {\n            $('.ranking-box').show();\n            if ($(\"#barType\").find('.active').data('value') == 1) {\n                $('#titleQ').html('<span>全网</span>到珠海');\n            } else if ($(\"#barType\").find('.active').data('value') == 2) {\n                $('#titleQ').html('珠海到<span>全网</span>')\n            }\n            $('#city').html(li_con);\n        } else if ($(this).parent().data('city') == 2) {\n            if ($('.cont-div').eq(0).css('visibility') != 'hidden') {\n                $('.ranking-box').show();\n            }\n            if ($(\"#barTypes\").find('.active').data('value') == 1) {\n                $('#titleQs').html('<span>全网</span>到珠海');\n            } else if ($(\"#barTypes\").find('.active').data('value') == 2) {\n                $('#titleQs').html('珠海到<span>全网</span>')\n            }\n            $('#citys').html(li_con);\n        }\n    } else {\n        if ($(this).parent().data('city') == 1) {\n            $('#city').html(li_con);\n        } else if ($(this).parent().data('city') == 2) {\n            $('#citys').html(li_con);\n        }\n    }\n\n\n})\n\n\n$('#city').on('click', 'li', function () {\n    $(this).addClass('active').siblings('li').removeClass('active');\n    $('.center-bottom .ranking-box').hide();\n    if ($(\"#barType\").find('.active').data('value') == 1) {\n        $('#titleQ').html('<span>' + $(this).html() + '</span>到珠海');\n    } else if ($(\"#barType\").find('.active').data('value') == 2) {\n        $('#titleQ').html('珠海到<span>' + $(this).html() + '</span>')\n    }\n})\n\n$('#citys').on('click', 'li', function () {\n    $(this).addClass('active').siblings('li').removeClass('active');\n    $('.pop-data .ranking-box').hide();\n    if ($(\"#barTypes\").find('.active').data('value') == 1) {\n        $('#titleQs').html('<span>' + $(this).html() + '</span>到珠海');\n    } else if ($(\"#barTypes\").find('.active').data('value') == 2) {\n        $('#titleQs').html('珠海到<span>' + $(this).html() + '</span>')\n    }\n})\n\n//寄派件选择\n$(\"#barType\").on('click', 'li', function () {\n    $(this).addClass('active').siblings('li').removeClass('active');\n    $('#barTitle').html($(this).html() + '数据');\n    $('#tabBtn').data('state', $(this).data('value'));\n    if ($(this).data('value') == 1) {\n        $('.table1').eq(0).show().siblings('table').hide();\n    } else if ($(this).data('value') == 2) {\n        $('.table1').eq(1).show().siblings('table').hide();\n    }\n    chart3($(this).data('value'), 0);\n    chart4(chart4Data, $(this).data('value'), 0);\n})\n\n//寄派件选择\n$(\"#barTypes\").on('click', 'li', function () {\n    $(this).addClass('active').siblings('li').removeClass('active');\n    $('#barTitles').html($(this).html() + '数据');\n    $('#tabBtns').data('state', $(this).data('value'));\n    if ($(this).data('value') == 1) {\n        $('.table2').eq(0).show().siblings('table').hide();\n    } else if ($(this).data('value') == 2) {\n        $('.table2').eq(1).show().siblings('table').hide();\n    }\n    chart3($(this).data('value'), 1);\n    chart4(chart4Data, $(this).data('value'), 1);\n\n})\n\n\nfunction chart3(type, chartType) {\n    var myChart = echarts.init(document.getElementById('chart3'));\n    var myCharts = echarts.init(document.getElementById('chart3s'));\n    window.addEventListener('resize', function () {\n        myChart.resize();\n        myCharts.resize();\n    });\n\n    //    设置背景阴影的参数，获取数据的最大值\n\n    var data; //横坐标数据，不动\n    var data_; //模拟数据\n    if (type == 1) {\n        data_ = [{\n                name: \"入库件\",\n                value: 584\n            },\n            {\n                name: \"滞留件\",\n                value: 152\n            }, {\n                name: \"丢失件\",\n                value: 100\n            },\n            {\n                name: \"正常件\",\n                value: 689\n            },\n            {\n                name: \"派送件\",\n                value: 200\n            }, {\n                name: \"自提件\",\n                value: 121\n            }, {\n                name: \"退签件\",\n                value: 92\n            }]\n    } else if (type == 2) {\n        data_ = [{\n                name: \"入库件\",\n                value: 568\n                }, {\n                name: \"丢失件\",\n                value: 287\n                }, {\n                name: \"滞留件\",\n                value: 120\n                },\n            {\n                name: \"撤销件\",\n                value: 152\n                },\n            {\n                name: \"出库件\",\n                value: 125\n                }, {\n                name: \"正常件\",\n                value: 122\n        }]\n    }\n    var series_data; //绘制图表的数据\n    //绘制图表\n    var yMax = 0;\n    for (var j = 0; j < data_.length; j++) {\n        if (yMax < data_[j].value) {\n            yMax = data_[j].value;\n        }\n    }\n    var dataShadow = [];\n    for (var i = 0; i < 10; i++) {\n        dataShadow.push(yMax * 2);\n    }\n\n    if (type == 1) {\n        data = ['入库件', '在库件', '出库件', '退签件', '丢失件'];\n\n        if (chartType == '') {\n            $(' .dph-data1').html(data_[0].value);\n            $(' .dph-data2').html(data_[1].value + data_[3].value);\n            $(' .dph-data3').html(data_[3].value);\n            $(' .dph-data4').html(data_[2].value);\n            $(' .dph-data5').html(data_[1].value);\n            $(' .dph-data6').html(data_[4].value + data_[5].value);\n            $(' .dph-data7').html(data_[4].value);\n            $(' .dph-data8').html(data_[5].value);\n            $(' .dph-data9').html(data_[6].value);\n        } else if (chartType == 0) {\n            $('.table1 .dph-data1').html(data_[0].value);\n            $('.table1 .dph-data2').html(data_[1].value + data_[3].value);\n            $('.table1 .dph-data3').html(data_[3].value);\n            $('.table1 .dph-data4').html(data_[2].value);\n            $('.table1 .dph-data5').html(data_[1].value);\n            $('.table1 .dph-data6').html(data_[4].value + data_[5].value);\n            $('.table1 .dph-data7').html(data_[4].value);\n            $('.table1 .dph-data8').html(data_[5].value);\n            $('.table1 .dph-data9').html(data_[6].value);\n        } else if (chartType == 1) {\n            $('.table2 .dph-data1').html(data_[0].value);\n            $('.table2 .dph-data2').html(data_[1].value + data_[3].value);\n            $('.table2 .dph-data3').html(data_[3].value);\n            $('.table2 .dph-data4').html(data_[2].value);\n            $('.table2 .dph-data5').html(data_[1].value);\n            $('.table2 .dph-data6').html(data_[4].value + data_[5].value);\n            $('.table2 .dph-data7').html(data_[4].value);\n            $('.table2 .dph-data8').html(data_[5].value);\n            $('.table2 .dph-data9').html(data_[6].value);\n        }\n\n        series_data = [\n            { // For shadow\n                type: 'bar',\n                barWidth: 20,\n                xAxisIndex: 2,\n                tooltip: {\n                    show: false\n                },\n                itemStyle: {\n                    normal: {\n                        color: 'rgba(14, 148, 235, 0.102)'\n                    }\n                },\n                data: dataShadow,\n                animation: false\n            },\n            {\n                name: '入库件',\n                type: 'bar',\n                barGap: '-100%',\n                barWidth: '40%',\n                xAxisIndex: 1,\n                itemStyle: {\n                    normal: {\n                        color: '#0e94eb'\n                    },\n                    emphasis: {\n                        opacity: 1\n                    }\n                },\n                data: [data_[0], 0, 0, 0, 0],\n            },\n            {\n                name: '滞留件',\n                type: 'bar',\n                stack: '在库件',\n                xAxisIndex: 1,\n                itemStyle: {\n                    normal: {\n                        color: 'rgba(239,176,19,.9)'\n                    },\n                    emphasis: {\n                        opacity: 1\n                    }\n                },\n                data: [0, data_[1], 0, 0, 0],\n            },\n            {\n                name: '丢失件',\n                type: 'bar',\n                xAxisIndex: 1,\n                itemStyle: {\n                    normal: {\n                        color: 'rgba(239,176,19,0.4)'\n                    },\n                    emphasis: {\n                        opacity: 1\n                    }\n                },\n                data: [0, 0, 0, 0, data_[2]],\n            },\n            {\n                name: '正常件',\n                type: 'bar',\n                stack: '在库件',\n                xAxisIndex: 1,\n                itemStyle: {\n                    normal: {\n                        color: 'rgba(239,176,19,0.3)'\n                    },\n                    emphasis: {\n                        opacity: 1\n                    }\n                },\n                data: [0, data_[3], 0, 0, 0],\n            },\n            {\n                name: '派送件',\n                type: 'bar',\n                stack: '出库件',\n                xAxisIndex: 1,\n                itemStyle: {\n                    normal: {\n                        color: 'rgba(196,64,239,0.8)'\n                    },\n                    emphasis: {\n                        opacity: 1\n                    }\n                },\n                data: [0, 0, data_[4], 0, 0],\n            },\n            {\n                name: '自提件',\n                type: 'bar',\n                stack: '出库件',\n                xAxisIndex: 1,\n                itemStyle: {\n                    normal: {\n                        color: 'rgba(196,64,239,0.4)'\n                    },\n                    emphasis: {\n                        opacity: 1\n                    }\n                },\n                data: [0, 0, data_[5], 0, 0],\n            },\n            {\n                name: '退签件',\n                type: 'bar',\n                xAxisIndex: 1,\n                itemStyle: {\n                    normal: {\n                        color: 'rgba(219,44,44,0.8)'\n                    },\n                    emphasis: {\n                        opacity: 1\n                    }\n                },\n                data: [0, 0, 0, data_[6], 0],\n            }\n        ]\n\n\n    } else if (type == 2) {\n        data = ['入库件', '在库件', '出库件', '丢失件', '撤销件'];\n        if (chartType == '') {\n            $('.mail-data1').html(data_[0].value);\n            $('.mail-data2').html(data_[2].value + data_[5].value);\n            $('.mail-data3').html(data_[1].value);\n            $('.mail-data4').html(data_[2].value);\n            $('.mail-data5').html(data_[3].value);\n            $('.mail-data6').html(data_[4].value);\n            $('.mail-data7').html(data_[5].value);\n        } else if (chartType == 0) {\n            $('.table1 .mail-data1').html(data_[0].value);\n            $('.table1 .mail-data2').html(data_[2].value + data_[5].value);\n            $('.table1 .mail-data3').html(data_[1].value);\n            $('.table1 .mail-data4').html(data_[2].value);\n            $('.table1 .mail-data5').html(data_[3].value);\n            $('.table1 .mail-data6').html(data_[4].value);\n            $('.table1 .mail-data7').html(data_[5].value);\n        } else if (chartType == 1) {\n            $('.table2 .mail-data1').html(data_[0].value);\n            $('.table2 .mail-data2').html(data_[2].value + data_[5].value);\n            $('.table2 .mail-data3').html(data_[1].value);\n            $('.table2 .mail-data4').html(data_[2].value);\n            $('.table2 .mail-data5').html(data_[3].value);\n            $('.table2 .mail-data6').html(data_[4].value);\n            $('.table2 .mail-data7').html(data_[5].value);\n        }\n\n        series_data = [\n            { // For shadow\n                type: 'bar',\n                barWidth: 20,\n                xAxisIndex: 2,\n                tooltip: {\n                    show: false\n                },\n                itemStyle: {\n                    normal: {\n                        color: 'rgba(14, 148, 235, 0.102)'\n                    }\n                },\n                data: dataShadow,\n                animation: false\n            },\n            {\n                name: '入库件',\n                barGap: '-100%',\n                barWidth: '40%',\n                type: 'bar',\n                xAxisIndex: 1,\n                itemStyle: {\n                    normal: {\n                        color: '#0e94eb'\n                    },\n                    emphasis: {\n                        opacity: 1\n                    }\n                },\n                data: [data_[0], 0, 0, 0, 0],\n            },\n            {\n                name: '正常件',\n                type: 'bar',\n                stack: '在库件',\n                xAxisIndex: 1,\n                itemStyle: {\n                    normal: {\n                        color: 'rgba(239,176,19,.9)'\n                    },\n                    emphasis: {\n                        opacity: 1\n                    }\n                },\n                data: [0, data_[5], 0, 0, 0, 0],\n                },\n            {\n                name: '丢失件',\n                type: 'bar',\n                xAxisIndex: 1,\n                itemStyle: {\n                    normal: {\n                        color: 'rgba(239,176,19,.9)'\n                    },\n                    emphasis: {\n                        opacity: 1\n                    }\n                },\n                data: [0, 0, 0, data_[1], 0],\n                    },\n            {\n                name: '滞留件',\n                type: 'bar',\n                xAxisIndex: 1,\n                stack: '在库件',\n                itemStyle: {\n                    normal: {\n                        color: 'rgba(239,176,19,0.4)'\n                    },\n                    emphasis: {\n                        opacity: 1\n                    }\n                },\n\n                data: [0, data_[2], 0, 0, 0],\n                    },\n            {\n                name: '撤销件',\n                type: 'bar',\n                xAxisIndex: 1,\n                itemStyle: {\n                    normal: {\n                        color: 'rgba(239,176,19,0.3)'\n                    },\n                    emphasis: {\n                        opacity: 1\n                    }\n                },\n                data: [0, 0, 0, 0, data_[3]],\n                    },\n            {\n                name: '出库件',\n                type: 'bar',\n                xAxisIndex: 1,\n                stack: '退签件',\n                itemStyle: {\n                    normal: {\n                        color: 'rgba(196,64,239,0.8)'\n                    },\n                    emphasis: {\n                        opacity: 1\n                    }\n                },\n                data: [0, 0, data_[4], 0, 0],\n                    }\n\n                    ]\n    }\n\n    var option = {\n        title: '',\n        grid: {\n            top: '10%',\n            containLabel: true\n        },\n        tooltip: {\n            show: true\n        },\n        xAxis: [{\n                type: 'category',\n                show: false,\n                data: data,\n                axisLabel: {\n                    textStyle: {\n                        color: '#fff'\n                    }\n                }\n            },\n            {\n                type: 'category',\n                position: \"bottom\",\n                data: data,\n                boundaryGap: true,\n                // offset: 40,\n                axisTick: {\n                    show: false\n                },\n                axisLine: {\n                    show: false\n                },\n                axisLabel: {\n                    textStyle: {\n                        color: '#fff'\n                    }\n                }\n            },\n            {\n                show: false,\n                data: dataShadow,\n                axisLabel: {\n                    inside: true,\n                    textStyle: {\n                        color: '#fff'\n                    }\n                },\n                axisTick: {\n                    show: false\n                },\n                axisLine: {\n                    show: false\n                },\n                z: 10\n        },\n        ],\n        yAxis: [{\n                show: true,\n                splitLine: {\n                    show: false,\n                    lineStyle: {\n                        color: \"#0e94eb\"\n                    }\n                },\n                axisTick: {\n                    show: false\n                },\n                axisLine: {\n                    show: false\n                },\n                axisLabel: {\n                    show: true,\n                    color: '#0e94eb'\n                }\n        }, {\n                show: false,\n                type: \"value\",\n                nameTextStyle: {\n                    color: '#0e94eb'\n                },\n                axisLabel: {\n                    color: '#0e94eb'\n                },\n                splitLine: {\n                    show: false\n                },\n                axisLine: {\n                    show: false\n                },\n                axisTick: {\n                    show: false\n                }\n        },\n            {\n                axisLine: {\n                    show: false\n                },\n                axisTick: {\n                    show: false\n                },\n                axisLabel: {\n                    textStyle: {\n                        color: '#999'\n                    }\n                }\n                }],\n        //        color: ['#e54035'],\n        series: series_data\n    }\n    if (chartType === '') {\n        myChart.clear();\n        myCharts.clear();\n        myChart.setOption(option);\n        myCharts.setOption(option);\n    } else if (chartType === 0) {\n        myChart.clear();\n        myChart.setOption(option);\n    } else if (chartType === 1) {\n        myCharts.clear();\n        myCharts.setOption(option);\n    }\n}\n\nchart3(1, '')\n    //\n    //\n    //\n$('#dateBtn').on('click', function () {\n    if ($('#timeBox').is(\":hidden\")) {\n        $('#timeBox').show();\n        document.getElementById('timeBox').focus();\n\n    } else {\n        $('#timeBox').hide();\n    }\n})\n\n$('#dateBtns').on('click', function () {\n    if ($('#timeBoxs').is(\":hidden\")) {\n        $('#timeBoxs').show();\n        document.getElementById('timeBoxs').focus();\n\n    } else {\n        $('#timeBoxs').hide();\n    }\n})\n\n$('#switchBtn').on('click', 'span', function () {\n    $(this).addClass('active').siblings().removeClass('active');\n    if ($(this).data('datatype') == 'income') {\n        $('#totalProfit').html('123,456.5元');\n    } else if ($(this).data('datatype') == 'expend') {\n        $('#totalProfit').html('32,111.4元');\n    }\n})\n\n$('#tabBtn').on('click', function () {\n    var _this = $(this);\n    if ($('.right-top').children('.chart-box').is(':hidden')) {\n        _this.children('span').html('图表');\n        $('.right-top').children('.chart-box').show().siblings('.data-box').hide();\n\n    } else {\n        _this.children('span').html('表格');\n        $('.right-top').children('.data-box').show().siblings('.chart-box').hide();\n        if (_this.data('state') == 1) {\n            $('.table1').eq(0).show().siblings('table').hide();\n        } else if (_this.data('state') == 2) {\n            $('.table1').eq(1).show().siblings('table').hide();\n        }\n    }\n})\n\n\n$('#tabBtns').on('click', function () {\n    var _this = $(this);\n    if (_this.siblings('.pop-chart').is(':hidden')) {\n        _this.children('span').html('图表');\n        _this.siblings('.pop-chart').show().siblings('.data-box').hide();\n\n    } else {\n        _this.children('span').html('表格');\n        _this.siblings('.data-box').show().siblings('.chart-box').hide();\n        if (_this.data('state') == 1) {\n            $('.table2').eq(0).show().siblings('table').hide();\n        } else if (_this.data('state') == 2) {\n            $('.table2').eq(1).show().siblings('table').hide();\n        }\n    }\n})\n\n\n\n\n//时间选择器\nvar startV = '';\nvar endV = '';\nlaydate.skin('danlan');\nvar startTime = {\n    elem: '#startTime',\n    format: 'YYYY-MM-DD',\n    min: '1997-01-01', //设定最小日期为当前日期\n    max: laydate.now(), //最大日期\n    istime: true,\n    istoday: true,\n    fixed: false,\n    choose: function (datas) {\n        startV = datas;\n        endTime.min = datas; //开始日选好后，重置结束日的最小日期\n    }\n};\nvar endTime = {\n    elem: '#endTime',\n    format: 'YYYY-MM-DD',\n    min: laydate.now(),\n    max: laydate.now(),\n    istime: true,\n    istoday: true,\n    fixed: false,\n    choose: function (datas) {\n        //        startTime.max = datas; //结束日选好后，重置开始日的最大日期\n        endV = datas;\n    }\n};\n\nlaydate(startTime);\nlaydate(endTime);\n\n//时间选择器\nvar startVs = '';\nvar endVs = '';\nlaydate.skin('danlan');\nvar startTimes = {\n    elem: '#startTimes',\n    format: 'YYYY-MM-DD',\n    min: '1997-01-01', //设定最小日期为当前日期\n    max: '2099-06-16', //最大日期\n    istime: true,\n    istoday: true,\n    fixed: false,\n    choose: function (datas) {\n        startVs = datas;\n        endTimes.min = datas; //开始日选好后，重置结束日的最小日期\n        setQgData($('#barTypes').parent().parent(), 1);\n    }\n};\nvar endTimes = {\n    elem: '#endTimes',\n    format: 'YYYY-MM-DD',\n    min: laydate.now(),\n    max: laydate.now(),\n    istime: true,\n    istoday: true,\n    fixed: false,\n    choose: function (datas) {\n        //        startTime.max = datas; //结束日选好后，重置开始日的最大日期\n        endVs = datas;\n        setQgData($('#barTypes').parent().parent(), 1);\n    }\n};\n\nlaydate(startTimes);\nlaydate(endTimes);\n\n//点击时间选择器的时候更改样式\n$('#endTime').on('click', function () {\n    dateCss();\n})\n\n$('#end').on('click', function () {\n    dateCss();\n})\n\n\n//更改日期插件的样式\nfunction dateCss() {\n    var arr = $('#laydate_box').attr('style').split(';');\n    var cssStr =\n        'position:absolute;right:0;';\n    for (var i = 0; i < arr.length; i++) {\n        if (arr[i].indexOf('top') != -1) {\n            cssStr += arr[i];\n        }\n    }\n\n    $('#laydate_box').attr('style', cssStr);\n}\n\n\n\n//chart4Data模拟数据\nvar chart4Data = [{\n    'name': \"天津市\",\n    'value': 178546\n    }, {\n    'name': \"湖南省\",\n    'value': 125687\n    }, {\n    'name': \"福建省\",\n    'value': 78452\n    }, {\n    'name': \"北京市\",\n    'value': 57841\n    }, {\n    'name': \"江苏省\",\n    'value': 45879\n    }, {\n    'name': \"海南\",\n    'value': 28584\n    }, {\n    'name': \"四川省\",\n    'value': 14852\n    }, {\n    'name': \"浙江省\",\n    'value': 12589\n    }, {\n    'name': \"重庆市\",\n    'value': 5261\n    }, {\n    'name': \"香港特别行政区\",\n    'value': 2563\n    }, {\n    'name': \"内蒙古\",\n    'value': 856\n    }]\nchart4(chart4Data, 1, '');\n\nfunction chart4(data, type, chartType) {\n    var str = '<li><span></span><p>城市</p><p>派件</p></li>';\n    for (var i = 0; i < 10; i++) {\n        str += '<li><span>' + (i + 1) + '</span><p>' + data[i].name + '</p><p>' + data[i].value + '</p></li>';\n    }\n\n    var s_data = [];\n    var myChart = echarts.init(document.getElementById('chart4'));\n    var myCharts = echarts.init(document.getElementById('chart4s'));\n    window.addEventListener('resize', function () {\n        myChart.resize();\n        myCharts.resize();\n    });\n\n\n    function formtGCData(geoData, data, srcNam, dest) {\n        var tGeoDt = [];\n        if (dest) {\n            for (var i = 0, len = data.length; i < len; i++) {\n                if (srcNam != data[i].name) {\n                    tGeoDt.push({\n                        coords: [geoData[srcNam], geoData[data[i].name]],\n                    });\n                }\n            }\n        } else {\n            for (var i = 0, len = data.length; i < len; i++) {\n                if (srcNam != data[i].name) {\n                    tGeoDt.push({\n                        coords: [geoData[data[i].name], geoData[srcNam]],\n                    });\n                }\n            }\n        }\n        return tGeoDt;\n    }\n\n    function formtVData(geoData, data, srcNam) {\n        var tGeoDt = [];\n        for (var i = 0, len = data.length; i < len; i++) {\n            var tNam = data[i].name\n            if (srcNam != tNam) {\n                tGeoDt.push({\n                    name: tNam,\n                    symbolSize: 2,\n                    itemStyle: {\n                        normal: {\n                            color: '#ffeb40',\n                        }\n                    },\n                    value: geoData[tNam]\n                });\n            }\n\n        }\n        tGeoDt.push({\n            name: srcNam,\n            value: geoData[srcNam],\n            symbolSize: 5,\n            itemStyle: {\n                normal: {\n                    color: '#2ef358',\n                }\n            }\n\n        });\n        return tGeoDt;\n    }\n\n    var planePath = 'pin';\n    if (type == 2) {\n        s_data.push({\n            type: 'lines',\n            zlevel: 2,\n            mapType: 'china',\n            symbol: 'none',\n            effect: {\n                show: true,\n                period: 1.5,\n                trailLength: 0.1,\n                //                color: '#ffeb40',\n                color: '#2ef358',\n                symbol: planePath,\n                symbolSize: 6,\n                trailLength: 0.5\n\n            },\n            lineStyle: {\n                normal: {\n                    color: '#2ef358',\n                    width: 1,\n                    opacity: 0.4,\n                    curveness: 0.2\n                }\n            },\n            data: formtGCData(geoCoordMap, data, '珠海', true)\n        })\n\n    } else if (type == 1) {\n        s_data.push({\n            type: 'lines',\n            zlevel: 2,\n            effect: {\n                show: true,\n                period: 1.5,\n                trailLength: 0.1,\n                //                color: '#2ef358',\n                color: '#ffeb40',\n                symbol: planePath,\n                symbolSize: 6,\n                trailLength: 0.5\n            },\n            lineStyle: {\n                normal: {\n                    color: '#ffeb40',\n                    width: 1,\n                    opacity: 0.4,\n                    curveness: 0.2\n                }\n            },\n            data: formtGCData(geoCoordMap, data, '珠海', false)\n        }, {\n\n            type: 'effectScatter',\n            coordinateSystem: 'geo',\n            zlevel: 2,\n            rippleEffect: {\n                period: 4,\n                scale: 2.5,\n                brushType: 'stroke'\n            },\n            symbol: 'none',\n            symbolSize: 4,\n            itemStyle: {\n                normal: {\n                    color: '#fff'\n                }\n            },\n\n            data: formtVData(geoCoordMap, data, '珠海')\n        })\n    }\n\n    var option = {\n        tooltip: {\n            trigger: 'item',\n        },\n        geo: {\n            map: 'china',\n            label: {\n                show: true,\n                position: 'insideLeft',\n                color: 'white',\n                fontSize: '10',\n                emphasis: {\n                    show: true\n                }\n            },\n            roam: true,\n            silent: true,\n            itemStyle: {\n                normal: {\n                    areaColor: 'transparent',\n                    borderColor: '#0e94eb',\n                    shadowBlur: 10,\n                    shadowColor: '#0e94ea'\n                }\n            },\n            left: 10,\n            right: 10\n        },\n        series: s_data\n    };\n    if (chartType === '') {\n        $('.ranking-box').html(str);\n        myChart.setOption(option);\n        myCharts.setOption(option);\n    } else if (chartType === 0) {\n        $('.center-bottom .ranking-box').html(str);\n        myChart.setOption(option);\n    } else if (chartType === 1) {\n        $('.pop-data .ranking-box').html(str);\n        myCharts.setOption(option);\n    }\n}\n\n$('.close-pop').on('click', function () {\n    $(this).parent().parent().hide().find('.cont-div').attr('style', 'visibility: hidden');\n})\n\n$('#setBtn').on('click', function () {\n    $('.container').attr('style', 'visibility: visible').find('.pop-up').eq(4).attr('style', 'visibility: visible').siblings().attr('style', 'visibility: hidden');\n\n})\n\nvar workDate;\nvar time = {\n    elem: '#times',\n    format: 'YYYY-MM-DD',\n    min: laydate.now(),\n    max: laydate.now() + 30,\n    istime: true,\n    istoday: true,\n    fixed: false,\n    choose: function (datas) {\n        //        startTime.max = datas; //结束日选好后，重置开始日的最大日期\n        workDate = datas;\n    }\n};\n\nlaydate(time);\n\n$('#addT').on('click', function () {\n    $('#mineusT').show();\n    if ($(this).siblings('input').length < 6) {\n        if ($(this).siblings('input').length == 5) {\n            $(this).hide();\n        }\n        $(this).before('<input type=\"text\" value=\"\">');\n    }\n\n})\n\n$('#mineusT').on('click', function () {\n    if ($(this).siblings('input').length > 1) {\n        if ($(this).siblings('input').length == 6) {\n            $('#addT').show();\n        } else if ($(this).siblings('input').length == 2) {\n            $(this).hide()\n        }\n        $(this).siblings('input:last').remove();\n    }\n})\n\n$('#addL').on('click', function () {\n    $('#mineusL').show();\n    if ($(this).siblings('input').length < 3) {\n        if ($(this).siblings('input').length == 2) {\n            $(this).hide();\n        }\n        $(this).before('<input type=\"text\" value=\"\">');\n    }\n\n})\n\n$('#mineusL').on('click', function () {\n    if ($(this).siblings('input').length > 1) {\n        if ($(this).siblings('input').length == 3) {\n            $('#addL').show();\n        } else if ($(this).siblings('input').length == 2) {\n            $(this).hide()\n        }\n        $(this).siblings('input:last').remove();\n    }\n})"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/china.js",
    "content": "(function (root, factory) {\n    if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymous module.\n        define(['exports', 'echarts'], factory);\n    } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {\n        // CommonJS\n        factory(exports, require('echarts'));\n    } else {\n        // Browser globals\n        factory({}, root.echarts);\n    }\n}(this, function (exports, echarts) {\n    var log = function (msg) {\n        if (typeof console !== 'undefined') {\n            console && console.error && console.error(msg);\n        }\n    }\n    if (!echarts) {\n        log('ECharts is not Loaded');\n        return;\n    }\n    if (!echarts.registerMap) {\n        log('ECharts Map is not loaded')\n        return;\n    }\n    echarts.registerMap('china', {\"type\":\"FeatureCollection\",\"features\":[{\"id\":\"710000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@°Ü¯Û\",\"@@ƛĴÕƊÉɼģºðʀ\\\\ƎsÆNŌÔĚänÜƤɊĂǀĆĴĤǊŨxĚĮǂƺòƌâÔ®ĮXŦţƸZûÐƕƑGđ¨ĭMó·ęcëƝɉlÝƯֹÅŃ^Ó·śŃǋƏďíåɛGɉ¿IċããF¥ĘWǬÏĶñÄ\",\"@@\\\\p|WoYG¿¥Ij@\",\"@@¡@V^RqBbAnTXeQr©C\",\"@@ÆEEkWqë I\"]],\"encodeOffsets\":[[[122886,24033],[123335,22980],[122375,24193],[122518,24117],[124427,22618]]]},\"properties\":{\"cp\":[121.509062,25.044332],\"name\":\"台湾\",\"childNum\":5}},{\"id\":\"130000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@\\\\aM`Ç½ÓnUKĜēs¤­©yrý§uģcJ»eIP]ªrºc_ħ²G¼s`jÎŸnüsÂľP\",\"@@U`Ts¿mÄ\",\"@@FOhđ©OiÃ`ww^ÌkÑH«ƇǤŗĺtFu{Z}Ö@U´ʚLg®¯Oı°Ãw ^VbÉsmAê]]w§RRl£ŭuwNÁ`ÇFēÝčȻuT¡Ĺ¯Õ¯sŗő£YªhVƍ£ƅnëYNgq¼ś¿µı²UºÝUąąŖóxV@tƯJ]eR¾fe|rHA|h~Ėƍl§ÏjVë` ØoÅbbx³^zÃĶ¶Sj®AyÂhðk`«PËµEFÛ¬Y¨Ļrõqi¼Wi°§Ð±²°`[À|ĠO@ÆxO\\\\ta\\\\p_Zõ^û{ġȧXýĪÓjùÎRb^Î»j{íděYfíÙTymńŵōHim½éŅ­aVcř§ax¹XŻácWU£ôãºQ¨÷Ñws¥qEHÙ|šYQoŕÇyáĂ£MÃ°oťÊP¡mWO¡v{ôvîēÜISpÌhp¨ jdeŔQÖjX³àĈ[n`Yp@UcM`RKhEbpŞlNut®EtqnsÁgAiúoHqCXhfgu~ÏWP½¢G^}¯ÅīGCÑ^ãziMáļMTÃƘrMc|O_¯Ŏ´|morDkO\\\\mĆJfl@cĢ¬¢aĦtRıÒXòë¬WP{ŵǫƝīÛ÷ąV×qƥV¿aȉd³BqPBmaËđŻģmÅ®V¹d^KKonYg¯XhqaLdu¥Ípǅ¡KąÅkĝęěhq}HyÃ]¹ǧ£Í÷¿qágPmoei¤o^á¾ZEY^Ný{nOl±Í@Mċèk§daNaÇį¿]øRiiñEūiǱàUtėGyl}ÓM}jpEC~¡FtoQiHkk{ILgĽxqÈƋÄdeVDJj£J|ÅdzÂFt~KŨ¸IÆv|¢r}èonb}`RÎÄn°ÒdÞ²^®lnÐèĄlðÓ×]ªÆ}LiĂ±Ö`^°Ç¶p®đDcŋ`ZÔ¶êqvFÆN®ĆTH®¦O¾IbÐã´BĐɢŴÆíȦpĐÞXR·nndO¤OÀĈƒ­QgµFo|gȒęSWb©osx|hYhgŃfmÖĩnºTÌSp¢dYĤ¶UĈjlǐpäðëx³kÛfw²Xjz~ÂqbTÑěŨ@|oMzv¢ZrÃVw¬ŧĖ¸f°ÐTªqs{S¯r æÝl¼ÖĞ ǆiGĘJ¼lr}~K¨ŸƐÌWö¼Þ°nÞoĦL|C~D©|q]SvKÑcwpÏÏĿćènĪWlĄkT}¬Tp~®Hgd˒ĺBVtEÀ¢ôPĎƗè@~kü\\\\rÊĔÖæW_§¼F´©òDòjYÈrbĞāøŀG{ƀ|¦ðrb|ÀH`pʞkvGpuARhÞÆǶgĘTǼƹS£¨¡ù³ŘÍ]¿ÂyôEP xX¶¹ÜO¡gÚ¡IwÃé¦ÅBÏ|Ç°N«úmH¯âbęU~xĈbȒ{^xÖlD¸dɂ~\"]],\"encodeOffsets\":[[[120023,41045],[121616,39981],[122102,42307]]]},\"properties\":{\"cp\":[114.502461,38.045474],\"name\":\"河北\",\"childNum\":3}},{\"id\":\"140000\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@ħÜ_ªlìwGkÛÃǏokćiµVZģ¡coTSË¹ĪmnÕńehZg{gtwªpXaĚThȑp{¶Eh®RćƑP¿£PmcªaJyý{ýȥoÅîɡųAďä³aÏJ½¥PG­ąSM­sWz½µÛYÓŖgxoOkĒCo­Èµ]¯_²ÕjāK~©ÅØ^ÔkïçămÏk]­±cÝ¯ÑÃmQÍ~_apm~ç¡qu{JÅŧ·Ls}EyÁÆcI{¤IiCfUcƌÃp§]ě«vD@¡SÀµMÅwuYY¡DbÑc¡h×]nkoQdaMç~eDÛtT©±@¥ù@É¡ZcW|WqOJmĩl«ħşvOÓ«IqăV¥D[mI~Ó¢cehiÍ]Ɠ~ĥqX·eƷn±}v[ěďŕ]_œ`¹§ÕōIo©b­s^}Ét±ū«³p£ÿ¥WÑxçÁ«h×u×¥ř¾dÒ{ºvĴÎêÌɊ²¶ü¨|ÞƸµȲLLúÉƎ¤ϊęĔV`_bªS^|dzY|dz¥pZbÆ£¶ÒK}tĦÔņƠPYznÍvX¶Ěn ĠÔzý¦ª÷ÑĸÙUȌ¸dòÜJð´ìúNM¬XZ´¤ŊǸ_tldI{¦ƀðĠȤ¥NehXnYGR° ƬDj¬¸|CĞKqºfƐiĺ©ª~ĆOQª ¤@ìǦɌ²æBÊTĞHƘÁĪËĖĴŞȀÆÿȄlŤĒötÎ½î¼ĨXh|ªM¤ÐzÞĩÒSrao³\"],\"encodeOffsets\":[[117016,41452]]},\"properties\":{\"cp\":[112.549248,37.857014],\"name\":\"山西\",\"childNum\":1}},{\"id\":\"150000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@ǪƫÌÛMĂ[`ÕCn}¶Vcês¯PqFB|S³C|kñHdiÄ¥sŉÅPóÑÑE^ÅPpy_YtShQ·aHwsOnŉÃs©iqjUSiº]ïW«gW¡ARëśĳĘů`çõh]y»ǃǛҤxÒm~zf}pf|ÜroÈzrKÈĵSƧż؜Ġu~è¬vîS¼ĂhĖMÈÄw\\\\fŦ°W ¢¾luŸDw\\\\Ŗĝ\",\"@@GVu»Aylßí¹ãe]Eāò³C¹ð¾²iÒAdkò^P²CǜңǄ z¼g^èöŰ_Ĳĕê}gÁnUI«m]jvV¼euhwqAaW_µj»çjioQR¹ēÃßt@r³[ÛlćË^ÍÉáGOUÛOB±XkÅ¹£k|e]olkVÍ¼ÕqtaÏõjgÁ£§U^RLËnX°ÇBz^~wfvypV ¯ƫĉ˭ȫƗŷɿÿĿƑ˃ĝÿÃǃßËőó©ǐȍŒĖM×ÍEyxþp]ÉvïèvƀnÂĴÖ@V~Ĉ³MEĸÅĖtējyÄDXÄxGQuv_i¦aBçw˛wD©{tāmQ{EJ§KPśƘƿ¥@sCTÉ}ɃwƇy±gÑ}T[÷kÐç¦«SÒ¥¸ëBX½HáÅµÀğtSÝÂa[ƣ°¯¦Pï¡]£ġÒk®G²èQ°óMq}EóƐÇ\\\\@áügQÍu¥FTÕ¿Jû]|mvāÎYua^WoÀa·­ząÒot×¶CLƗi¯¤mƎHǊ¤îìɾŊìTdåwsRÖgĒųúÍġäÕ}Q¶¿A[¡{d×uQAMxVvMOmăl«ct[wº_ÇÊjbÂ£ĦS_éQZ_lwgOiýe`YYJq¥IÁǳ£ÙË[ÕªuƏ³ÍTs·bÁĽäė[b[ŗfãcn¥îC¿÷µ[ŏÀQ­ōĉm¿Á^£mJVmL[{Ï_£F¥Ö{ŹA}×Wu©ÅaųĳƳhB{·TQqÙIķËZđ©Yc|M¡LeVUóK_QWk_ĥ¿ãZ»X\\\\ĴuUèlG®ěłTĠğDŃGÆÍz]±ŭ©Å]ÅÐ}UË¥©TċïxgckfWgi\\\\ÏĒ¥HkµEë{»ÏetcG±ahUiñiWsɁ·cCÕk]wȑ|ća}wVaĚá G°ùnM¬¯{ÈÐÆA¥ÄêJxÙ¢hP¢ÛºµwWOóFÁz^ÀŗÎú´§¢T¤ǻƺSėǵhÝÅQgvBHouʝl_o¿Ga{ïq{¥|ſĿHĂ÷aĝÇqZñiñC³ª»E`¨åXēÕqÉû[l}ç@čƘóO¿¡FUsAʽīccocÇS}£IS~ălkĩXçmĈŀÐoÐdxÒuL^T{r@¢ÍĝKén£kQyÅõËXŷƏL§~}kq»IHėǅjĝ»ÑÞoå°qTt|r©ÏS¯·eŨĕx«È[eM¿yupN~¹ÏyN£{©għWí»Í¾səšǅ_ÃĀɗ±ąĳĉʍŌŷSÉA±åǥɋ@ë£R©ąP©}ĹªƏj¹erLDĝ·{i«ƫC½ÉshVzGS|úþXgp{ÁX¿ć{ƱȏñZáĔyoÁhA}ŅĆfdŉ_¹Y°ėǩÑ¡H¯¶oMQqð¡Ë|Ñ`ƭŁX½·óÛxğįÅcQs«tȋǅFù^it«Č¯[hAi©á¥ÇĚ×l|¹y¯Kȝqgů{ñǙµïċĹzŚȭ¶¡oŽäÕG\\\\ÄT¿Òõr¯LguÏYęRƩɷŌO\\\\İÐ¢æ^Ŋ ĲȶȆbÜGĝ¬¿ĚVĎgª^íu½jÿĕęjık@Ľ]ėl¥ËĭûÁėéV©±ćn©­ȇÍq¯½YÃÔŉÉNÑÅÝy¹NqáʅDǡËñ­ƁYÅy̱os§ȋµʽǘǏƬɱàưN¢ƔÊuľýľώȪƺɂļxZĈ}ÌŉŪĺœĭFЛĽ̅ȣͽÒŵìƩÇϋÿȮǡŏçƑůĕ~Ç¼ȳÐUfdIxÿ\\\\G zâɏÙOº·pqy£@qþ@Ǟ˽IBäƣzsÂZÁàĻdñ°ŕzéØűzșCìDȐĴĺf®Àľưø@ɜÖÞKĊŇƄ§͑těï͡VAġÑÑ»d³öǍÝXĉĕÖ{þĉu¸ËʅğU̎éhɹƆ̗̮ȘǊ֥ड़ࡰţાíϲäʮW¬®ҌeרūȠkɬɻ̼ãüfƠSצɩςåȈHϚÎKǳͲOðÏȆƘ¼CϚǚ࢚˼ФÔ¤ƌĞ̪Qʤ´¼mȠJˀƲÀɠmɆǄĜƠ´ǠN~ʢĜ¶ƌĆĘźʆȬ˪ĚĒ¸ĞGȖƴƀj`ĢçĶāàŃºēĢĖćYÀŎüôQÐÂŎŞǆŞêƖoˆDĤÕºÑǘÛˤ³̀gńƘĔÀ^ªƂ`ªt¾äƚêĦĀ¼ÐĔǎ¨Ȕ»͠^ˮÊȦƤøxRrŜH¤¸ÂxDÄ|ø˂˜ƮÐ¬ɚwɲFjĔ²Äw°ǆdÀÉ_ĸdîàŎjÊêTĞªŌŜWÈ|tqĢUB~´°ÎFCU¼pĀēƄN¦¾O¶łKĊOjĚj´ĜYp{¦SĚÍ\\\\T×ªV÷Ší¨ÅDK°ßtŇĔK¨ǵÂcḷ̌ĚǣȄĽFlġUĵŇȣFʉɁMğįʏƶɷØŭOǽ«ƽū¹Ʊő̝Ȩ§ȞʘĖiɜɶʦ}¨֪ࠜ̀ƇǬ¹ǨE˦ĥªÔêFxúQEr´Wrh¤Ɛ \\\\talĈDJÜ|[Pll̚¸ƎGú´P¬W¦^¦H]prRn|or¾wLVnÇIujkmon£cX^Bh`¥V¦U¤¸}xRj[^xN[~ªxQ[`ªHÆÂExx^wN¶Ê|¨ìMrdYpoRzNyÀDs~bcfÌ`L¾n|¾T°c¨È¢ar¤`[|òDŞĔöxElÖdHÀI`Ď\\\\Àì~ÆR¼tf¦^¢ķ¶eÐÚMptgjɡČÅyġLûŇV®ÄÈƀĎ°P|ªVVªj¬ĚÒêp¬E|ŬÂ_~¼rƐK f{ĘFĒƌXưăkÃĄ}nµo×q£ç­kX{uĩ«āíÓUŅÝVUŌ]Ť¥lyň[oi{¦LĸĦ^ôâJ¨^UZðÚĒL¿Ìf£K£ʺoqNwğc`uetOj×°KJ±qÆġmĚŗos¬qehqsuH{¸kH¡ÊRǪÇƌbȆ¢´äÜ¢NìÉʖ¦â©Ɨؗ\"]],\"encodeOffsets\":[[[128500,52752],[127089,51784]]]},\"properties\":{\"cp\":[111.670801,40.818311],\"name\":\"内蒙古\",\"childNum\":2}},{\"id\":\"210000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@L@@s]\",\"@@MnNm\",\"@@dc\",\"@@eÀC@b\",\"@@fXwkbrÄ`qg\",\"@@^jtWQ\",\"@@~ Y[c\",\"@@I`ĖN^_¿ZÁM\",\"@@Ïxǌ{q_×^Gigp\",\"@@iX¶BY\",\"@@YZ\",\"@@L_yG`b\",\"@@^WqCTZ\",\"@@\\\\[§t|]\",\"@@m`p[\",\"@@@é^BntaÊU]x ¯ÄPĲ­°hʙK³VÕ@Y~|EvĹsÇ¦­L^pÃ²ŸÒG Ël]xxÄ_fT¤Ď¤cPC¨¸TVjbgH²sdÎdHt`B²¬GJję¶[ÐhjeXdlwhðSČ¦ªVÊÏÆZÆŶ®²^ÎyÅHńĚDMħĜŁH­kçvV[ĳ¼WYÀäĦ`XlR`ôLUVfK¢{NZdĒªYĸÌÚJRr¸SA|ƴgŴĴÆbvªØX~źB|¦ÕE¤Ð`\\\\|KUnnI]¤ÀÂĊnŎR®Ő¿¶\\\\ÀøíDm¦ÎbŨabaĘ\\\\ľãÂ¸atÎSƐ´©v\\\\ÖÚÌǴ¤Â¨JKrZ_ZfjþhPkx`YRIjJcVf~sCN¤ EhæmsHy¨SðÑÌ\\\\\\\\ĐRÊwS¥fqŒßýáĞÙÉÖ[^¯ǤŲê´\\\\¦¬ĆPM¯£»uïpùzExanµyoluqe¦W^£ÊL}ñrkqWňûPUP¡ôJoo·U}£[·¨@XĸDXm­ÛÝºGUCÁª½{íĂ^cjk¶Ã[q¤LÉö³cux«|Zd²BWÇ®Yß½ve±ÃCý£W{Ú^q^sÑ·¨ËMr¹·C¥GDrí@wÕKţÃ«V·i}xËÍ÷i©ĝɝǡ]{c±OW³Ya±_ç©HĕoƫŇqr³Lys[ñ³¯OSďOMisZ±ÅFC¥Pq{Ã[Pg}\\\\¿ghćOk^ĩÃXaĕËĥM­oEqqZûěŉ³F¦oĵhÕP{¯~TÍlªNßYÐ{Ps{ÃVUeĎwk±ŉVÓ½ŽJãÇÇ»Jm°dhcÀffdF~ĀeĖd`sx² ®EĦ¦dQÂd^~ăÔH¦\\\\LKpĄVez¤NP ǹÓRÆąJSh­a[¦´ÂghwmBÐ¨źhI|VV|p] Â¼èNä¶ÜBÖ¼L`¼bØæKVpoúNZÞÒKxpw|ÊEMnzEQIZZNBčÚFÜçmĩWĪñtÞĵÇñZ«uD±|ƏlǗw·±PmÍada CLǑkùó¡³Ï«QaċÏOÃ¥ÕđQȥċƭy³ÁA\"]],\"encodeOffsets\":[[[123686,41445],[126019,40435],[124393,40128],[126117,39963],[125322,40140],[126686,40700],[126041,40374],[125584,40168],[125509,40217],[125453,40165],[125362,40214],[125280,40291],[125774,39997],[125976,40496],[125822,39993],[122731,40949]]]},\"properties\":{\"cp\":[123.429096,41.796767],\"name\":\"辽宁\",\"childNum\":16}},{\"id\":\"220000\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@ñr½ÉKāGÁ¤ia ÉÈ¹`\\\\xs¬dĆkNnuNUwNx¶c¸|\\\\¢GªóĄ~RãÖÎĢùđŴÕhQxtcæëSɽŉíëǉ£ƍG£nj°KƘµDsØÑpyĆ¸®¿bXp]vbÍZuĂ{n^IüÀSÖ¦EvRÎûh@â[ƏÈô~FNr¯ôçR±­HÑlĢ^¤¢OðætxsŒ]ÞÁTĠs¶¿âÆGW¾ìA¦·TÑ¬è¥ÏÐJ¨¼ÒÖ¼ƦɄxÊ~StD@Ă¼Ŵ¡jlºWvÐzƦZÐ²CH AxiukdGgetqmcÛ£Ozy¥cE}|¾cZk¿uŐã[oxGikfeäT@SUwpiÚFM©£è^Ú`@v¶eňf heP¶täOlÃUgÞzŸU`l}ÔÆUvØ_Ō¬Öi^ĉi§²ÃB~¡ĈÚEgc|DC_Ȧm²rBx¼MÔ¦ŮdĨÃâYxƘDVÇĺĿg¿cwÅ\\\\¹¥Yĭl¤OvLjM_a W`zļMž·\\\\swqÝSAqŚĳ¯°kRē°wx^ĐkǂÒ\\\\]nrĂ}²ĊŲÒøãh·M{yMzysěnĒġV·°G³¼XÀ¤¹i´o¤ŃÈ`ÌǲÄUĞd\\\\iÖmÈBĤÜɲDEh LG¾ƀÄ¾{WaYÍÈĢĘÔRîĐj}ÇccjoUb½{h§Ǿ{KƖµÎ÷GĄØŜçưÌs«lyiē«`å§H¥Ae^§GK}iã\\\\c]v©ģZmÃ|[M}ģTɟĵÂÂ`ÀçmFK¥ÚíÁbX³ÌQÒHof{]ept·GŋĜYünĎųVY^ydõkÅZW«WUa~U·SbwGçǑiW^qFuNĝ·EwUtW·Ýďæ©PuqEzwAVXRãQ`­©GYYhcUGorBd}ģÉb¡·µMicF«Yƅ»é\\\\ɹ~ǙG³mØ©BšuT§Ĥ½¢Ã_Ã½L¡ûsT\\\\rke\\\\PnwAKy}ywdSefµ]UhĿD@mÿvaÙNSkCuncÿ`lWėVâ¦÷~^fÏ~vwHCį`xqT­­lW«ï¸skmßEGqd¯R©Ý¯¯S\\\\cZ¹iűƏCuƍÓXoR}M^o£R}oªU­FuuXHlEÅÏ©¤ßgXþ¤D²ÄufàÀ­XXÈ±Ac{Yw¬dvõ´KÊ£\\\\rµÄlidā]|î©¾DÂVH¹Þ®ÜWnCķ W§@\\\\¸~¤Vp¸póIO¢VOŇürXql~òÉK]¤¥Xrfkvzpm¶bwyFoúvð¼¤ N°ąO¥«³[éǣű]°Õ\\\\ÚÊĝôîŇÔaâBYlďQ[ Ë[ïÒ¥RI|`j]P\"],\"encodeOffsets\":[[126831,44503]]},\"properties\":{\"cp\":[125.3245,43.886841],\"name\":\"吉林\",\"childNum\":1}},{\"id\":\"230000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@UµNÿ¥īèçHÍøƕ¶Lǽ|g¨|a¾pVidd~ÈiíďÓQġėÇZÎXb½|ſÃH½KFgɱCģÛÇAnjÕc[VĝǱÃËÇ_ £ń³pj£º¿»WH´¯U¸đĢmtĜyzzNN|g¸÷äűÑ±ĉā~mq^[ǁÑďlw]¯xQĔ¯l°řĴrBÞTxr[tŽ¸ĻN_yX`biNKuP£kZĮ¦[ºxÆÀdhĹŀUÈƗCwáZħÄŭcÓ¥»NAw±qȥnD`{ChdÙFć}¢A±Äj¨]ĊÕjŋ«×`VuÓÅ~_kŷVÝyhVkÄãPsOµfgeŇµf@u_Ù ÙcªNªÙEojVxT@ãSefjlwH\\\\pŏäÀvlY½d{F~¦dyz¤PÜndsrhfHcvlwjF£G±DÏƥYyÏu¹XikĿ¦ÏqƗǀOŜ¨LI|FRĂn sª|C˜zxAè¥bfudTrFWÁ¹Am|ĔĕsķÆF´N}ćUÕ@Áĳſmuçuð^ÊýowFzØÎĕNőǏȎôªÌŒǄàĀÄ˄ĞŀƒʀĀƘŸˮȬƬĊ°Uzouxe]}AyÈW¯ÌmKQ]Īºif¸ÄX|sZt|½ÚUÎ lk^p{f¤lºlÆW A²PVÜPHÊâ]ÎĈÌÜk´\\\\@qàsĔÄQºpRij¼èi`¶bXrBgxfv»uUi^v~J¬mVp´£´VWrnP½ì¢BX¬hðX¹^TjVriªjtŊÄmtPGx¸bgRsT`ZozÆO]ÒFôÒOÆŊvÅpcGêsx´DR{AEOr°x|íb³Wm~DVjºéNNËÜ˛ɶ­GxŷCSt}]ûōSmtuÇÃĕNāg»íT«u}ç½BĵÞʣ¥ëÊ¡MÛ³ãȅ¡ƋaǩÈÉQG¢·lG|tvgrrf«ptęŘnÅĢrI²¯LiØsPf_vĠdxM prʹL¤¤eËÀđKïÙVY§]Ióáĥ]ķK¥j|pŇ\\\\kzţ¦šnņäÔVĂîĪ¬|vW®l¤èØrxm¶ă~lÄƯĄ̈́öȄEÔ¤ØQĄĄ»ƢjȦOǺ¨ìSŖÆƬyQv`cwZSÌ®ü±Ǆ]ŀç¬B¬©ńzƺŷɄeeOĨSfm ĊƀP̎ēz©ĊÄÕÊmgÇsJ¥ƔŊśæÎÑqv¿íUOµªÂnĦÁ_½ä@êí£P}Ġ[@gġ}gɊ×ûÏWXá¢užƻÌsNÍ½ƎÁ§čŐAēeL³àydl¦ĘVçŁpśǆĽĺſÊQíÜçÛġÔsĕ¬Ǹ¯YßċġHµ ¡eå`ļrĉŘóƢFìĎWøxÊkƈdƬv|I|·©NqńRŀ¤éeŊŀàŀU²ŕƀBQ£Ď}L¹Îk@©ĈuǰųǨÚ§ƈnTËÇéƟÊcfčŤ^XmHĊĕË«W·ċëx³ǔķÐċJāwİ_ĸȀ^ôWr­°oú¬ĦŨK~ȰCĐ´Ƕ£fNÎèâw¢XnŮeÂÆĶ¾¾xäLĴĘlļO¤ÒĨA¢Êɚ¨®ØCÔ ŬGƠƦYĜĘÜƬDJg_ͥœ@čŅĻA¶¯@wÎqC½Ĉ»NăëKďÍQÙƫ[«ÃígßÔÇOÝáWñuZ¯ĥŕā¡ÑķJu¤E å¯°WKÉ±_d_}}vyõu¬ï¹ÓU±½@gÏ¿rÃ½DgCdµ°MFYxw¿CG£Rƛ½Õ{]L§{qqą¿BÇƻğëܭǊË|c²}Fµ}ÙRsÓpg±QNqǫŋRwŕnéÑÉK«SeYRŋ@{¤SJ}D Ûǖ֍]gr¡µŷjqWÛham³~S«Ü[\",\"@@ƨĶTLÇyqpÇÛqe{~oyen}s`qiXGù]Ëp½©lÉÁp]Þñ´FĂ^fäîºkàz¼BUv¬D\"]],\"encodeOffsets\":[[[134456,44547],[127123,51780]]]},\"properties\":{\"cp\":[126.642464,45.756967],\"name\":\"黑龙江\",\"childNum\":2}},{\"id\":\"320000\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@Õg^vÁbnÀ`Jnĝ¬òM¶ĘTÖŒbe¦¦{¸ZâćNp©Hp|`mjhSEb\\\\afv`sz^lkljÄtg¤D­¾X¿À|ĐiZȀåB·î}GL¢õcßjayBFµÏC^ĭcÙt¿sğH]j{s©HM¢QnDÀ©DaÜÞ·jgàiDbPufjDk`dPOîhw¡ĥ¥GP²ĐobºrYî¶aHŢ´ ]´rılw³r_{£DB_Ûdåuk|Ũ¯F Cºyr{XFye³Þċ¿ÂkĭB¿MvÛpm`rÚã@Ę¹hågËÖƿxnlč¶Åì½Ot¾dJlVJĂǀŞqvnO^JZż·Q}êÍÅmµÒ]ƍ¦Dq}¬R^èĂ´ŀĻĊIÔtĲyQŐĠMNtR®òLhĚs©»}OÓGZz¶A\\\\jĨFäOĤHYJvÞHNiÜaĎÉnFQlNM¤B´ĄNöɂtpŬdZÅglmuÇUšŞÚb¤uŃJŴu»¹ĄlȖħŴw̌ŵ²ǹǠ͛hĭłƕrçü±Yrřl¥i`ã__¢ćSÅr[Çq^ùzWmOĈaŐÝɞï²ʯʊáĘĳĒǭPħ͍ôƋÄÄÍīçÛɈǥ£­ÛmY`ó£Z«§°Ó³QafusNıǅ_k}¢m[ÝóDµ¡RLčiXyÅNïă¡¸iĔÏNÌķoıdōîåŤûHcs}~Ûwbù¹£¦ÓCtOPrE^ÒogĉIµÛÅʹK¤½phMú`mR¸¦PƚgÉLRs`£¯ãhD¨|³¤C\"],\"encodeOffsets\":[[121451,32518]]},\"properties\":{\"cp\":[118.767413,32.041544],\"name\":\"江苏\",\"childNum\":1}},{\"id\":\"330000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@jX^n\",\"@@sfdM\",\"@@qP\\\\xz[_i\",\"@@o\\\\VzRZ}mECy\",\"@@R¢FX}°[m]\",\"@@Cb\\\\}\",\"@@e|v\\\\laus\",\"@@v~s{\",\"@@QxÂF©}\",\"@@¹nvÞs©m\",\"@@rQgYIh\",\"@@bi«ZX\",\"@@p[}ILd\",\"@@À¿|\",\"@@¹dnb\",\"@@rS}[Kl\",\"@@g~h}\",\"@@FlCk\",\"@@ůTG°ĄLHm°UF\",\"@@OdRe\",\"@@v[u\\\\\",\"@@FjâL~wyoo~sµLZ\",\"@@¬e¹aH\",\"@@\\\\nÔ¡q]L³ë\\\\ÿ®QÌ\",\"@@ÊA­©]ª\",\"@@Kxv{­\",\"@@@hlIk_\",\"@@pWcrxp\",\"@@Md|_iA\",\"@@¢X£½z\\\\ðpN\",\"@@hlÜ[LykAvyfw^E \",\"@@fp¤MusH\",\"@@®_ma~LÁ¬`\",\"@@@°¡mÛGĕ¨§Ianá[ýƤjfæÐNäGp\",\"@@iMt\\\\\",\"@@Zc[b\",\"@@X®±GrÆ°Zæĉm\",\"@@Z~dOSo|A¿qZv\",\"@@@`EN£p\",\"@@|s\",\"@@@nDi\",\"@@na£¾uYL¯QªmĉÅdMgÇjcº«ę¬­K­´B«Âącoċ\\\\xK`cįŧ«®á[~ıxu·ÅKsËÉc¢Ù\\\\ĭƛëbf¹­ģSĜkáƉÔ­ĈZB{aMµfzŉfÓÔŹŁƋǝÊĉ{ğč±g³ne{ç­ií´S¬\\\\ßðK¦w\\\\iqªĭiAuA­µ_W¥ƣO\\\\lċĢttC¨£t`PZäuXßBsĻyekOđġĵHuXBµ]×­­\\\\°®¬F¢¾pµ¼kŘó¬Wät¸|@L¨¸µrºù³Ù~§WIZW®±Ð¨ÒÉx`²pĜrOògtÁZ{üÙ[|ûKwsPlU[}¦Rvn`hsª^nQ´ĘRWb_ rtČFIÖkĦPJ¶ÖÀÖJĈĄTĚòC ²@PúØz©Pî¢£CÈÚĒ±hŖl¬â~nm¨f©iļ«mntqÒTÜÄjL®EÌFª²iÊxØ¨IÈhhst[Ôx}dtüGæţŔïĬaĸpMËÐjē¢·ðĄÆMzjWKĎ¢Q¶À_ê_@ıi«pZgf¤Nrq]§ĂN®«H±yƳí¾×ŊďŀĐÏŴǝĂíÀBŖÕªÁŐTFqĉ¯³ËCĕģi¨hÜ·ñt»¯Ï\",\"@@ºwZRkĕWK \"]],\"encodeOffsets\":[[[125785,31436],[125729,31431],[125513,31380],[125329,30690],[125223,30438],[125115,30114],[124815,29155],[124419,28746],[124095,28635],[124005,28609],[125000,30713],[125111,30698],[125078,30682],[125150,30684],[124014,28103],[125008,31331],[125411,31468],[125329,31479],[125369,31139],[125626,30916],[125417,30956],[125254,30976],[125199,30997],[125095,31058],[125083,30915],[124885,31015],[125218,30798],[124867,30838],[124755,30788],[124802,30809],[125267,30657],[125218,30578],[125200,30562],[125192,30787],[124968,30474],[125167,30396],[125115,30363],[124955,29879],[124714,29781],[124762,29462],[124325,28754],[124863,30077],[125366,31477]]]},\"properties\":{\"cp\":[120.153576,30.287459],\"name\":\"浙江\",\"childNum\":43}},{\"id\":\"340000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@^iuLV\\\\\",\"@@e©Edh\",\"@@´CE¶zAXêeödK¡~H¸íæAȽd{ďÅÀ½W®£ChÃsikkly]_teu[bFaTign{]GqªoĈMYá|·¥f¥őaSÕėNµñĞ«Im_m¿Âa]uĜp Z_§{Cäg¤°r[_YjÆOdý[I[á·¥Q_nùgL¾mzˆDÜÆ¶ĊJhpc¹O]iŠ]¥ jtsggDÑ¡w×jÉ©±EFË­KiÛÃÕYvsm¬njĻª§emná}k«ŕgđ²ÙDÇ¤í¡ªOy×Où±@DñSęćăÕIÕ¿IµĥOlJÕÍRÍ|JìĻÒåyķrĕq§ÄĩsWÆßF¶X®¿mwRIÞfßoG³¾©uyHį{Ɓħ¯AFnuPÍÔzVdàôº^Ðæd´oG¤{S¬ćxã}ŧ×Kǥĩ«ÕOEÐ·ÖdÖsƘÑ¨[Û^Xr¢¼§xvÄÆµ`K§ tÒ´Cvlo¸fzŨð¾NY´ı~ÉĔēßúLÃÃ_ÈÏ|]ÂÏHlg`ben¾¢pUh~ƴĖ¶_r sĄ~cƈ]|r c~`¼{À{ȒiJjz`îÀT¥Û³]u}fïQl{skloNdjäËzDvčoQďHI¦rbrHĖ~BmlNRaĥTX\\\\{fÁKÁ®TLÂÄMtÊgĀDĄXƔvDcÎJbt[¤D@®hh~kt°ǾzÖ@¾ªdbYhüóV´ŮŒ¨Üc±r@J|àuYÇÔG·ĚąĐlŪÚpSJ¨ĸLvÞcPæķŨ®mÐálsgd×mQ¨ųÆ©Þ¤IÎs°KZpĄ|XwWdĎµmkǀwÌÕæhºgBĝâqÙĊzÖgņtÀÁĂÆáhEz|WzqD¹°Eŧl{ævÜcA`¤C`|´qxĲkq^³³GšµbíZ¹qpa±ď OH¦Ħx¢gPícOl_iCveaOjChß¸iÝbÛªCC¿mRV§¢A|tbkĜEÀtîm^g´fÄ\"]],\"encodeOffsets\":[[[121722,32278],[119475,30423],[121606,33646]]]},\"properties\":{\"cp\":[117.283042,31.86119],\"name\":\"安徽\",\"childNum\":3}},{\"id\":\"350000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@zht´}[\",\"@@aj^~ĆGå\",\"@@edHse\",\"@@@vPGsyQ\",\"@@sBzddW[O\",\"@@S¨Qy\",\"@@NVucW\",\"@@qptB@q\",\"@@¸[iu\",\"@@Q\\\\pD[_\",\"@@jSwUappI\",\"@@eXª~\",\"@@AjvFoo\",\"@@fT_Çí\\\\v|ba¦jZÆy|®\",\"@@IjLg\",\"@@wJIx«¼AoNe{M¥\",\"@@K±¡ÓČ~N¾\",\"@@k¡¹Eh~c®uDqZì¡I~Māe£bN¨gZý¡a±Öcp©PhI¢QqÇGj|¥U g[Ky¬ŏv@OptÉEF\\\\@ åA¬V{XģĐBycpě¼³Ăp·¤¥ohqqÚ¡ŅLs^Ã¡§qlÀhH¨MCe»åÇGD¥zPO£čÙkJA¼ßėuĕeûÒiÁŧS[¡Uûŗ½ùěcÝ§SùĩąSWó«íęACµeRåǃRCÒÇZÍ¢ź±^dlstjD¸ZpuÔâÃH¾oLUêÃÔjjēò´ĄWƛ^Ñ¥Ħ@ÇòmOw¡õyJyD}¢ďÑÈġfZda©º²z£NjD°Ötj¶¬ZSÎ~¾c°¶ÐmxO¸¢Pl´SL|¥AȪĖMņĲg®áIJČĒü` QF¬h|ĂJ@zµ |ê³È ¸UÖŬŬÀCtrĸr]ðM¤ĶĲHtÏ AĬkvsq^aÎbvdfÊòSD´Z^xPsĂrvƞŀjJd×ŘÉ ®AÎ¦ĤdxĆqAZRÀMźnĊ»İÐZ YXæJyĊ²·¶q§·K@·{sXãô«lŗ¶»o½E¡­«¢±¨Y®Ø¶^AvWĶGĒĢPlzfļtàAvWYãO_¤sD§ssČġ[kƤPX¦`¶®BBvĪjv©jx[L¥àï[F¼ÍË»ğV`«Ip}ccÅĥZEãoP´B@D¸m±z«Ƴ¿å³BRØ¶Wlâþäą`]Z£Tc ĹGµ¶Hm@_©k¾xĨôȉðX«½đCIbćqK³ÁÄš¬OAwã»aLŉËĥW[ÂGIÂNxĳ¤D¢îĎÎB§°_JGs¥E@¤ućPåcuMuw¢BI¿]zG¹guĮI\"]],\"encodeOffsets\":[[[123250,27563],[122541,27268],[123020,27189],[122916,27125],[122887,26845],[122808,26762],[122568,25912],[122778,26197],[122515,26757],[122816,26587],[123388,27005],[122450,26243],[122578,25962],[121255,25103],[120987,24903],[122339,25802],[121042,25093],[122439,26024]]]},\"properties\":{\"cp\":[119.306239,26.075302],\"name\":\"福建\",\"childNum\":18}},{\"id\":\"360000\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@ÖP¬ǦĪØLŨä~Ĉw«|TH£pc³Ïå¹]ĉđxe{ÎÓvOEm°BƂĨİ|Gvz½ª´HàpeJÝQxnÀW­EµàXÅĪt¨ÃĖrÄwÀFÎ|Ă¡WÕ¸cf¥XaęST±m[r«_gmQu~¥V\\\\OkxtL E¢Ú^~ýØkbēqoě±_Êw§Ñ²ÏƟė¼mĉŹ¿NQYBąrwģcÍ¥B­ŗÊcØiIƝĿuqtāwO]³YCñTeÉcaubÍ]trluīBÐGsĵıN£ï^ķqsq¿DūūVÕ·´Ç{éĈýÿOER_đûIċâJh­ŅıNȩĕB¦K{Tk³¡OP·wnµÏd¯}½TÍ«YiµÕsC¯iM¤­¦¯P|ÿUHvhe¥oFTuõ\\\\OSsMòđƇiaºćXĊĵà·çhƃ÷Ç{ígu^đgm[ÙxiIN¶Õ»lđÕwZSÆv©_ÈëJbVkĔVÀ¤P¾ºÈMÖxlò~ªÚàGĂ¢B±ÌKyñ`w²¹·`gsÙfIěxŕeykpudjuTfb·hh¿Jd[\\\\LáƔĨƐAĈepÀÂMD~ņªe^\\\\^§ý©j×cZØ¨zdÒa¶lÒJìõ`oz÷@¤uŞ¸´ôęöY¼HČƶajlÞƩ¥éZ[|h}^U  ¥pĄžƦO lt¸Æ Q\\\\aÆ|CnÂOjt­ĚĤdÈF`¶@Ðë ¦ōÒ¨SêvHĢÛ@[ÆQoxHW[ŰîÀt¦Ǆ~NĠ¢lĄtZoCƞÔºCxrpČNpj¢{f_Y`_eq®Aot`@oDXfkp¨|s¬\\\\DÄSfè©Hn¬^DhÆyøJhØxĢĀLÊƠPżċĄwĮ¶\"],\"encodeOffsets\":[[118923,30536]]},\"properties\":{\"cp\":[115.892151,28.676493],\"name\":\"江西\",\"childNum\":1}},{\"id\":\"370000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@Xjd]mE\",\"@@itnq\",\"@@Dl@k\",\"@@TGw\",\"@@K¬U\",\"@@Wd`c\",\"@@PtMs\",\"@@LnXlc\",\"@@ppVu]Qn\",\"@@cdzAU_\",\"@@udRhnCE\",\"@@oIpP\",\"@@M{ĿčwbxƨîKÎMĮ]ZF½Y]â£ph¶¨râøÀÎǨ¤^ºÄGz~grĚĜlĞÆLĆǆ¢Îo¦cvKbgr°WhmZp L]LºcUÆ­nżĤÌĒbAnrOA´ȊcÀbƦUØrĆUÜøĬƞŶǬĴóò_A̈«ªdÎÉnb²ĦhņBĖįĦåXćì@L¯´ywƕCéÃµė ƿ¸lµZæyj|BíÂKNNnoƈfÈMZwnŐNàúÄsTJULîVjǎ¾ĒØDz²XPn±ŴPè¸ŔLƔÜƺ_TüÃĤBBċÈöA´faM¨{«M`¶d¡ôÖ°mȰBÔjj´PM|c^d¤u¤Û´ä«ƢfPk¶Môl]Lb}su^ke{lCMrDÇ­]NÑFsmoõľHyGă{{çrnÓEƕZGª¹Fj¢ÿ©}ÌCǷë¡ąuhÛ¡^KxC`C\\\\bÅxì²ĝÝ¿_NīCȽĿåB¥¢·IŖÕy\\\\¹kxÃ£ČáKµË¤ÁçFQ¡KtŵƋ]CgÏAùSedcÚźuYfyMmhUWpSyGwMPqŀÁ¼zK¶G­Y§Ë@´śÇµƕBm@IogZ¯uTMx}CVKï{éƵP_K«pÛÙqċtkkù]gTğwoɁsMõ³ăAN£MRkmEÊčÛbMjÝGuIZGPģãħE[iµBEuDPÔ~ª¼ęt]ûG§¡QMsğNPŏįzs£Ug{đJĿļā³]ç«Qr~¥CƎÑ^n¶ÆéÎR~Ż¸YI] PumŝrƿIā[xeÇ³L¯v¯s¬ÁY~}ťuŁgƋpÝĄ_ņī¶ÏSR´ÁP~¿Cyċßdwk´SsX|t`Ä ÈðAªìÎT°¦Dda^lĎDĶÚY°`ĪŴǒàŠv\\\\ebZHŖR¬ŢƱùęOÑM­³FÛaj\"]],\"encodeOffsets\":[[[123806,39303],[123821,39266],[123742,39256],[123702,39203],[123649,39066],[123847,38933],[123580,38839],[123894,37288],[123043,36624],[123344,38676],[123522,38857],[123628,38858],[118267,36772]]]},\"properties\":{\"cp\":[117.000923,36.675807],\"name\":\"山东\",\"childNum\":13}},{\"id\":\"410000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@dXD}~Hgq~ÔN~zkĘHVsǲßjŬŢ`Pûàl¢\\\\ÀEhİgÞē X¼`khÍLùµP³swIÓzeŠĠð´E®ÚPtºIŊÊºL«šŕQGYfa[şußǑĩų_Z¯ĵÙčC]kbc¥CS¯ëÍB©ïÇÃ_{sWTt³xlàcČzÀD}ÂOQ³ÐTĬµƑÐ¿ŸghłŦv~}ÂZ«¤lPÇ£ªÝŴÅR§ØnhctâknÏ­ľŹUÓÝdKuķI§oTũÙďkęĆH¸Ó\\\\Ä¿PcnS{wBIvÉĽ[GqµuŇôYgûZca©@½Õǽys¯}lgg@­C\\\\£asIdÍuCQñ[L±ęk·ţb¨©kK»KC²òGKmĨS`UQnk}AGēsqaJ¥ĐGRĎpCuÌy ã iMcplk|tRkðev~^´¦ÜSí¿_iyjI|ȑ|¿_»d}q^{Ƈdă}tqµ`ŷé£©V¡om½ZÙÏÁRD|JOÈpÀRsI{ùÓjuµ{t}uËRivGçJFjµåkWê´MÂHewixGw½Yŷpµú³XU½ġyłåkÚwZX·l¢Á¢KzOÎÎjc¼htoDHr|­J½}JZ_¯iPq{tę½ĕ¦Zpĵø«kQĹ¤]MÛfaQpě±ǽ¾]u­Fu÷nčÄ¯ADp}AjmcEÇaª³o³ÆÍSƇĈÙDIzçñİ^KNiÞñ[aA²zzÌ÷D|[íÄ³gfÕÞd®|`Ć~oĠƑô³ŊD×°¯CsøÂ«ìUMhTº¨¸ǝêWÔDruÂÇZ£ĆPZW~ØØv¬gèÂÒw¦X¤Ā´oŬ¬²Ês~]®tªapŎJ¨Öº_ŔfŐ\\\\Đ\\\\Ĝu~m²Ƹ¸fWĦrƔ}Î^gjdfÔ¡J}\\\\n C¦þWxªJRÔŠu¬ĨĨmFdM{\\\\d\\\\YÊ¢ú@@¦ª²SÜsC}fNècbpRmlØ^gd¢aÒ¢CZZxvÆ¶N¿¢T@uC¬^ĊðÄn|lIlXhun[\",\"@@hzUq\"]],\"encodeOffsets\":[[[116744,37216],[116480,33048]]]},\"properties\":{\"cp\":[113.665412,34.757975],\"name\":\"河南\",\"childNum\":2}},{\"id\":\"420000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@ASd\",\"@@ls{d\",\"@@¾«}{ra®pîÃ\\\\{øCËyyB±b\\\\òÝjKL ]ĎĽÌJyÚCƈćÎT´Å´pb©ÈdFin~BCo°BĎÃømv®E^vǾ½Ĝ²RobÜeN^ĺ£R¬lĶ÷YoĖ¥Ě¾|sOr°jY`~I¾®I{GqpCgyl{£ÍÍyPLÂ¡¡¸kWxYlÙæŁĢz¾V´W¶ùŸo¾ZHxjwfxGNÁ³Xéæl¶EièIH ujÌQ~v|sv¶Ôi|ú¢FhQsğ¦SiŠBgÐE^ÁÐ{čnOÂÈUÎóĔÊēĲ}Z³½Mŧïeyp·uk³DsÑ¨L¶_ÅuÃ¨w»¡WqÜ]\\\\Ò§tƗcÕ¸ÕFÏǝĉăxŻČƟOKÉġÿ×wg÷IÅzCg]m«ªGeçÃTC«[t§{loWeC@ps_Bp­rf_``Z|ei¡oċMqow¹DƝÓDYpûsYkıǃ}s¥ç³[§cY§HK«Qy]¢wwö¸ïx¼ņ¾Xv®ÇÀµRĠÐHM±cÏdƒǍũȅȷ±DSyúĝ£ŤĀàtÖÿï[îb\\\\}pĭÉI±Ñy¿³x¯No|¹HÏÛmjúË~TuęjCöAwě¬Rđl¯ Ñb­ŇTĿ_[IčĄʿnM¦ğ\\\\É[T·k¹©oĕ@A¾wya¥Y\\\\¥Âaz¯ãÁ¡k¥ne£ÛwE©Êō¶˓uoj_U¡cF¹­[WvP©whuÕyBF`RqJUw\\\\i¡{jEPïÿ½fćQÑÀQ{°fLÔ~wXgītêÝ¾ĺHd³fJd]HJ²EoU¥HhwQsƐ»Xmg±çve]DmÍPoCc¾_hhøYrŊU¶eD°Č_N~øĹĚ·`z]Äþp¼äÌQv\\\\rCé¾TnkžŐÚÜa¼ÝƆĢ¶ÛodĔňÐ¢JqPb ¾|J¾fXƐîĨ_Z¯À}úƲN_ĒÄ^ĈaŐyp»CÇÄKñL³ġM²wrIÒŭxjb[n«øæà ^²­h¯ÚŐªÞ¸Y²ĒVø}Ā^İ´LÚm¥ÀJÞ{JVųÞŃx×sxxƈē ģMřÚðòIfĊŒ\\\\Ʈ±ŒdÊ§ĘDvČ_Àæ~Dċ´A®µ¨ØLV¦êHÒ¤\"]],\"encodeOffsets\":[[[113712,34000],[115612,30507],[113649,34054]]]},\"properties\":{\"cp\":[114.298572,30.584355],\"name\":\"湖北\",\"childNum\":3}},{\"id\":\"430000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@nFZw\",\"@@ãÆá½ÔXrCOËRïÿĩ­TooQyÓ[ŅBE¬ÎÓXaį§Ã¸G °ITxpúxÚĳ¥ÏĢ¾edÄ©ĸGàGhM¤Â_U}Ċ}¢pczfþg¤ÇôAV\",\"@@ȴÚĖÁĐiOĜ«BxDõĚivSÌ}iùÜnÐºG{p°M°yÂÒzJ²Ì ÂcXëöüiáÿñőĞ¤ùTz²CȆȸǎŪƑÐc°dPÎğË¶[È½u¯½WM¡­ÉB·rínZÒ `¨GA¾\\\\pēXhÃRC­üWGġuTé§ŎÑ©êLM³}_EÇģc®ęisÁPDmÅ{b[RÅs·kPŽƥóRoOV~]{g\\\\êYƪ¦kÝbiċƵGZ»Ěõó·³vŝ£ø@pyö_ëIkÑµbcÑ§y×dYØªiþUjŅ³C}ÁN»hĻħƏâƓKA·³CQ±µ§¿AUƑ¹AtćOwD]JUÖgk¯b£ylZFËÑ±H­}EbóľA¡»Ku¦·³åş¥ùBD^{ÌC´­¦ŷJ£^[ª¿ğ|ƅN skóā¹¿ï]ă~÷O§­@Vm¡Qđ¦¢Ĥ{ºjÔª¥nf´~Õo×ÛąGû¥cÑ[Z¶ŨĪ²SÊǔƐƀAÚŌ¦QØ¼rŭ­«}NÏürÊ¬mjr@ĘrTW ­SsdHzƓ^ÇÂyUi¯DÅYlŹu{hT}mĉ¹¥ěDÿë©ıÓ[Oº£¥ótł¹MÕƪ`PDiÛU¾ÅâìUñBÈ£ýhedy¡oċ`pfmjP~kZaZsÐd°wj§@Ĵ®w~^kÀÅKvNmX\\\\¨aŃqvíó¿F¤¡@ũÑVw}S@j}¾«pĂrªg àÀ²NJ¶¶DôK|^ª°LX¾ŴäPĪ±£EXd^¶ĲÞÜ~u¸ǔMRhsRe`ÄofIÔ\\\\Ø  ićymnú¨cj ¢»GČìƊÿÐ¨XeĈĀ¾Oð Fi ¢|[jVxrIQ_EzAN¦zLU`cªxOTu RLÄªpUĪȴ^ŎµªÉFxÜf¤ºgĲèy°Áb[¦Zb¦z½xBĖ@ªpºjS´rVźOd©ʪiĎăJP`\"]],\"encodeOffsets\":[[[115640,30489],[112577,27316],[114113,30649]]]},\"properties\":{\"cp\":[112.982279,28.19409],\"name\":\"湖南\",\"childNum\":3}},{\"id\":\"440000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@QdAsa\",\"@@lxDRm\",\"@@sbhNLo\",\"@@Ă ý\",\"@@WltOY[\",\"@@Kr]S\",\"@@e~AS}\",\"@@I|Mym\",\"@@Û³LS²Q\",\"@@nvºBë¥cÕº\",\"@@zdÛJm\",\"@@°³\",\"@@a yAª¸ËJIxØ@ĀHÉÕZofoo\",\"@@sŗÃÔėAƁZÄ ~°ČPºb\",\"@@¶ÝÌvmĞh¹Ĺ\",\"@@HdSjĒ¢D}waru«ZqadY{K\",\"@@el\\\\LqqO\",\"@@~rMmX\",\"@@f^E\",\"@@øPªoj÷ÍÝħXČx°Q¨ıXJp\",\"@@gÇƳmxatfu\",\"@@EÆC½\",\"@@¸B_¶ekWvSivc}p}Ăº¾NĎyj¦Èm th_®Ä}»âUzLË²Aā¡ßH©Ùñ}wkNÕ¹ÇO½¿£ēUlaUìIÇª`uTÅxYĒÖ¼kÖµMjJÚwn\\\\hĒv]îh|ÈƄøèg¸Ķß ĉĈWb¹ƀdéĘNTtP[öSvrCZaGubo´ŖÒÇĐ~¡zCIözx¢PnÈñ @ĥÒ¦]ƜX³ăĔñiiÄÓVépKG½ÄÓávYoC·sitiaÀyŧÎ¡ÈYDÑům}ý|m[węõĉZÅxUO}÷N¹³ĉo_qtăqwµŁYÙǝŕ¹tïÛUÃ¯mRCºĭ|µÕÊK½Rē ó]GªęAxNqSF|ām¡diď×YïYWªŉOeÚtĐ«zđ¹TāúEáÎÁWwíHcòßÎſ¿Çdğ·ùT×Çūʄ¡XgWÀǇğ·¿ÃOj YÇ÷Sğ³kzőõmĝ[³¡VÙæÅöMÌ³¹pÁaËýý©D©ÜJŹƕģGą¤{ÙūÇO²«BƱéAÒĥ¡«BhlmtÃPµyU¯ucd·w_bŝcīímGOGBȅŹãĻFŷŽŕ@Óoo¿ē±ß}}ÓF÷tĲWÈCőâUâǙIğŉ©IĳE×Á³AĥDĈ±ÌÜÓĨ£L]ĈÙƺZǾĆĖMĸĤfÎĵlŨnÈĐtFFĤêk¶^k°f¶g}®Faf`vXŲxl¦ÔÁ²¬Ð¦pqÊÌ²iXØRDÎ}Ä@ZĠsx®AR~®ETtĄZƈfŠŠHâÒÐAµ\\\\S¸^wĖkRzalŜ|E¨ÈNĀňZTpBh£\\\\ĎƀuXĖtKL¶G|»ĺEļĞ~ÜĢÛĊrOÙîvd]n¬VÊĜ°RÖpMƀ¬HbwEÀ©\\\\¤]ŸI®¥D³|Ë]CúAŠ¦æ´¥¸Lv¼¢ĽBaôF~®²GÌÒEYzk¤°ahlVÕI^CxĈPsBƒºVÀB¶¨R²´D\",\"@@OR\"]],\"encodeOffsets\":[[[117381,22988],[116552,22934],[116790,22617],[116973,22545],[116444,22536],[116931,22515],[116496,22490],[116453,22449],[113301,21439],[118726,21604],[118709,21486],[113210,20816],[115482,22082],[113171,21585],[113199,21590],[115232,22102],[115739,22373],[115134,22184],[113056,21175],[119573,21271],[119957,24020],[115859,22356],[116680,26053],[116561,22649]]]},\"properties\":{\"cp\":[113.280637,23.125178],\"name\":\"广东\",\"childNum\":24}},{\"id\":\"450000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@H TI¡U\",\"@@Ɣ_LÊFZgčP­kini«qÇczÍY®¬Ů»qR×ō©DÕ§ƙǃŵTÉĩ±ıdÑnYYĲvNĆĆØÜ Öp}e³¦m©iÓ|¹ħņ|ª¦QF¢Â¬ʖovg¿em^ucäāmÇÖåB¡Õçĝ}FĻ¼Ĺ{µHKsLSđƃrč¤[AgoSŇYMÿ§Ç{FśbkylQxĕ]T·¶[BÑÏGáşşƇeăYSs­FQ}­BwtYğÃ@~CÍQ ×WjË±rÉ¥oÏ ±«ÓÂ¥kwWűue_b­E~µh¯ecl¯Ïr¯EģJğ}w³Ƈē`ãògK_ÛsUʝćğ¶höO¤Ǜn³c`¡yię[ďĵűMę§]XÎ_íÛ]éÛUćİÕBƣ±dy¹T^dûÅÑŦ·PĻþÙ`K¦¢ÍeĥR¿³£[~äu¼dltW¸oRM¢ď\\\\z}Æzdvň{ÎXF¶°Â_ÒÂÏL©ÖTmu¼ãlīkiqéfA·Êµ\\\\őDc¥ÝFyÔćcűH_hLÜêĺĐ¨c}rn`½Ì@¸¶ªVLhŒ\\\\Ţĺk~Ġið°|gtTĭĸ^xvKVGréAébUuMJVÃO¡qĂXËSģãlýà_juYÛÒBG^éÖ¶§EGÅzěƯ¤EkN[kdåucé¬dnYpAyČ{`]þ±X\\\\ÞÈk¡ĬjàhÂƄ¢Hè ŔâªLĒ^Öm¶ħĊAǦė¸zÚGn£¾rªŀÜt¬@ÖÚSx~øOŒŶÐÂæȠ\\\\ÈÜObĖw^oÞLf¬°bI lTØBÌF£Ć¹gñĤaYt¿¤VSñK¸¤nM¼JE±½¸ñoÜCƆæĪ^ĚQÖ¦^f´QüÜÊz¯lzUĺš@ìp¶n]sxtx¶@~ÒĂJb©gk{°~c°`Ô¬rV\\\\la¼¤ôá`¯¹LCÆbxEræOv[H­[~|aB£ÖsºdAĐzNÂðsÞÆĤªbab`ho¡³F«èVZs\\\\\\\\ÔRzpp®SĪº¨ÖºNĳd`a¦¤F³¢@`¢ĨĀìhYvlĆº¦Ċ~nS|gźv^kGÆÀè·\"]],\"encodeOffsets\":[[[111707,21520],[113706,26955]]]},\"properties\":{\"cp\":[108.320004,22.82402],\"name\":\"广西\",\"childNum\":2}},{\"id\":\"460000\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@¦Ŝil¢XƦƞòïè§ŞCêɕrŧůÇąĻõ·ĉ³œ̅kÇm@ċȧŧĥĽʉ­ƅſȓÒË¦ŝE}ºƑ[ÍĜȋ gÎfǐÏĤ¨êƺ\\\\Ɔ¸ĠĎvʄȀÐ¾jNðĀÒRZǆzÐĊ¢DÀɘZ\"],\"encodeOffsets\":[[112750,20508]]},\"properties\":{\"cp\":[110.33119,20.031971],\"name\":\"海南\",\"childNum\":1}},{\"id\":\"510000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@LqSn\",\"@@ĆOìÛÐ@ĞǔNY{¤Á§di´ezÝúØãwIþËQÇ¦ÃqÉSJ»ĂéʔõÔƁİlƞ¹§ĬqtÀƄmÀêErĒtD®ċæcQE®³^ĭ¥©l}äQtoŖÜqÆkµªÔĻĴ¡@Ċ°B²Èw^^RsºTĀ£ŚæQPJvÄz^Đ¹Æ¯fLà´GC²dt­ĀRt¼¤ĦOðğfÔðDŨŁĞƘïPÈ®âbMüÀXZ ¸£@Å»»QÉ­]dsÖ×_Í_ÌêŮPrĔĐÕGĂeZÜîĘqBhtO ¤tE[h|YÔZśÎs´xº±Uñt|OĩĠºNbgþJy^dÂY Į]Řz¦gC³R`Āz¢Aj¸CL¤RÆ»@­Ŏk\\\\Ç´£YW}z@Z}Ã¶oû¶]´^NÒ}èNªPÍy¹`S°´ATeVamdUĐwʄvĮÕ\\\\uÆŗ¨Yp¹àZÂmWh{á}WØǍÉüwga§ßAYrÅÂQĀÕ¬LŐý®Xøxª½Ű¦¦[þ`ÜUÖ´òrÙŠ°²ÄkĳnDX{U~ET{ļº¦PZcjF²Ė@pg¨B{u¨ŦyhoÚD®¯¢ WòàFÎ¤¨GDäz¦kŮPġqË¥À]eâÚ´ªKxīPÖ|æ[xÃ¤JÞĥsNÖ½I¬nĨY´®ÐƐmDŝuäđđEbee_v¡}ìęǊē}qÉåT¯µRs¡M@}ůaa­¯wvƉåZw\\\\Z{åû`[±oiJDÅ¦]ĕãïrG réÏ·~ąSfy×Í·ºſƽĵȁŗūmHQ¡Y¡®ÁÃ×t«­T¤JJJyJÈ`Ohß¦¡uËhIyCjmÿwZGTiSsOB²fNmsPa{M{õE^Hj}gYpaeu¯oáwHjÁ½M¡pMuåmni{fk\\\\oÎqCwEZ¼KĝAy{m÷LwO×SimRI¯rKõBS«sFe]fµ¢óY_ÆPRcue°Cbo×bd£ŌIHgtrnyPt¦foaXďxlBowz_{ÊéWiêEGhÜ¸ºuFĈIxf®Y½ĀǙ]¤EyF²ċw¸¿@g¢§RGv»áW`ÃĵJwi]t¥wO­½a[×]`Ãi­üL¦LabbTÀåc}ÍhÆh®BHî|îºÉk­¤Sy£ia©taį·Ɖ`ō¥UhOĝLk}©Fos´JmµlŁuønÑJWÎªYÀïAetTŅÓGË«bo{ıwodƟ½OġÜÂµxàNÖ¾P²§HKv¾]|BÆåoZ`¡Ø`ÀmºĠ~ÌÐ§nÇ¿¤]wğ@srğu~Io[é±¹ ¿ſđÓ@qg¹zƱřaí°KtÇ¤V»Ã[ĩǭƑ^ÇÓ@áťsZÏÅĭƋěpwDóÖáŻneQËq·GCœýS]x·ýq³OÕ¶Qzßti{řáÍÇWŝŭñzÇWpç¿JXĩè½cFÂLiVjx}\\\\NŇĖ¥GeJA¼ÄHfÈu~¸Æ«dE³ÉMA|bÒćhG¬CMõƤąAvüVéŀ_VÌ³ĐwQj´·ZeÈÁ¨X´Æ¡Qu·»ÕZ³ġqDoy`L¬gdp°şp¦ėìÅĮZ°Iähzĵf²å ĚÑKpIN|Ñz]ń·FU×é»R³MÉ»GM«kiér}Ã`¹ăÞmÈnÁîRǀ³ĜoİzŔwǶVÚ£À]ɜ»ĆlƂ²ĠþTº·àUȞÏʦ¶I«dĽĢdĬ¿»Ĕ×h\\\\c¬ä²GêëĤł¥ÀǿżÃÆMº}BÕĢyFVvwxBèĻĒ©Ĉt@Ğû¸£B¯¨ˋäßkķ½ªôNÔ~t¼Ŵu^s¼{TA¼ø°¢İªDè¾Ň¶ÝJ®Z´ğ~Sn|ªWÚ©òzPOȸbð¢|øĞA\"]],\"encodeOffsets\":[[[108815,30935],[100197,35028]]]},\"properties\":{\"cp\":[104.065735,30.659462],\"name\":\"四川\",\"childNum\":2}},{\"id\":\"520000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@G\\\\lY£cj\",\"@@q|mc¯vÏV\",\"@@hÑ£IsNgßHHªķÃh_¹¡ĝÄ§ń¦uÙùgS¯JH|sÝÅtÁïyMDč»eÕtA¤{b\\\\}G®u\\\\åPFqwÅaDK°ºâ_£ùbµmÁÛĹM[q|hlaªāI}Ñµ@swtwm^oµDéĽŠyVky°ÉûÛR³e¥]RÕěħ[ƅåÛDpJiVÂF²I»mN·£LbÒYbWsÀbpkiTZĄă¶Hq`ĥ_J¯ae«KpÝx]aĕÛPÇȟ[ÁåŵÏő÷Pw}TÙ@Õs«ĿÛq©½m¤ÙH·yǥĘĉBµĨÕnđ]K©œáGçş§ÕßgǗĦTèƤƺ{¶ÉHÎd¾ŚÊ·OÐjXWrãLyzÉAL¾ę¢bĶėy_qMĔąro¼hĊw¶øV¤w²Ĉ]ÊKx|`ź¦ÂÈdrcÈbe¸`I¼čTF´¼Óýȃr¹ÍJ©k_șl³´_pĐ`oÒh¶pa^ÓĔ}D»^Xy`d[KvJPhèhCrĂĚÂ^Êƌ wZL­Ġ£ÁbrzOIlMMĪŐžËr×ÎeŦtw|¢mKjSǘňĂStÎŦEtqFT¾Eì¬¬ôxÌO¢ K³ŀºäYPVgŎ¦ŊmŞ¼VZwVlz¤£Tl®ctĽÚó{G­AÇge~Îd¿æaSba¥KKûj®_Ä^\\\\Ø¾bP®¦x^sxjĶI_Ä Xâ¼Hu¨Qh¡À@Ëô}±GNìĎlT¸`V~R°tbÕĊ`¸úÛtÏFDu[MfqGH·¥yAztMFe|R_GkChZeÚ°tov`xbDnÐ{E}ZèxNEÞREn[Pv@{~rĆAB§EO¿|UZ~ìUf¨J²ĂÝÆsªB`s¶fvö¦Õ~dÔq¨¸º»uù[[§´sb¤¢zþF¢ÆÀhÂW\\\\ıËIÝo±ĭŠ£þÊs}¡R]ěDg´VG¢j±®èºÃmpU[Áëº°rÜbNu¸}º¼`niºÔXĄ¤¼ÔdaµÁ_ÃftQQgR·Ǔv}Ý×ĵ]µWc¤F²OĩųãW½¯K©]{LóµCIµ±Mß¿h©āq¬o½~@i~TUxð´Đhw­ÀEîôuĶb[§nWuMÆJl½]vuıµb\"]],\"encodeOffsets\":[[[112158,27383],[112105,27474],[112095,27476]]]},\"properties\":{\"cp\":[106.713478,26.578343],\"name\":\"贵州\",\"childNum\":3}},{\"id\":\"530000\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@[ùx½}ÑRHYīĺûsÍniEoã½Ya²ė{c¬ĝgĂsAØÅwďõzFjw}«Dx¿}Uũlê@HÅ­F¨ÇoJ´Ónũuą¡Ã¢pÒÅØ TF²xa²ËXcÊlHîAßËŁkŻƑŷÉ©hW­æßUËs¡¦}teèÆ¶StÇÇ}Fd£jĈZĆÆ¤Tč\\\\D}O÷£U§~ŃGåŃDĝ¸Tsd¶¶Bª¤u¢ŌĎo~t¾ÍŶÒtD¦ÚiôözØX²ghįh½Û±¯ÿm·zR¦Ɵ`ªŊÃh¢rOÔ´£Ym¼èêf¯ŪĽncÚbw\\\\zlvWªâ ¦gmĿBĹ£¢ƹřbĥkǫßeeZkÙIKueT»sVesbaĕ  ¶®dNĄÄpªy¼³BE®lGŭCǶwêżĔÂepÍÀQƞpC¼ŲÈ­AÎô¶RäQ^Øu¬°_Èôc´¹ò¨PÎ¢hlĎ¦´ĦÆ´sâÇŲPnÊD^¯°Upv}®BPÌªjǬxSöwlfòªvqĸ|`H­viļndĜ­Ćhňem·FyÞqóSį¯³X_ĞçêtryvL¤§z¦c¦¥jnŞklD¤øz½ĜàĂŧMÅ|áƆàÊcðÂFÜáŢ¥\\\\\\\\ºİøÒÐJĴîD¦zK²ǏÎEh~CD­hMn^ÌöÄ©ČZÀaüfɭyœpį´ěFűk]Ôě¢qlÅĆÙa¶~ÄqêljN¬¼HÊNQ´ê¼VØ¸E^ŃÒyM{JLoÒęæe±Ķygã¯JYÆĭĘëo¥Šo¯hcK«z_prC´ĢÖY¼ v¸¢RÅW³Â§fÇ¸Yi³xR´ďUË`êĿUûuĆBƣöNDH«ĈgÑaB{ÊNF´¬c·Åv}eÇÃGB»If¦HňĕM~[iwjUÁKE¾dĪçWIèÀoÈXòyŞŮÈXâÎŚj|àsRyµÖPr´þ ¸^wþTDŔHr¸RÌmfżÕâCôoxĜƌÆĮÐYtâŦÔ@]ÈǮƒ\\\\Ī¼Ä£UsÈ¯LbîƲŚºyhr@ĒÔƀÀ²º\\\\êpJ}ĠvqtĠ@^xÀ£È¨mËÏğ}n¹_¿¢×Y_æpÅA^{½Lu¨GO±Õ½ßM¶wÁĢÛPƢ¼pcĲx|apÌ¬HÐŊSfsðBZ¿©XÏÒKk÷Eû¿SrEFsÕūkóVǥŉiTL¡n{uxţÏhôŝ¬ğōNNJkyPaqÂğ¤K®YxÉƋÁ]āęDqçgOgILu\\\\_gz]W¼~CÔē]bµogpÑ_oď`´³Țkl`IªºÎȄqÔþ»E³ĎSJ»_f·adÇqÇc¥Á_Źw{L^É±ćxU£µ÷xgĉp»ĆqNē`rĘzaĵĚ¡K½ÊBzyäKXqiWPÏÉ¸½řÍcÊG|µƕƣGË÷k°_^ý|_zċBZocmø¯hhcæ\\\\lMFlư£ĜÆyHF¨µêÕ]HAàÓ^it `þßäkĤÎT~Wlÿ¨ÔPzUCNVv [jâôDôď[}z¿msSh¯{jïğl}šĹ[őgK©U·µË@¾m_~q¡f¹ÅË^»f³ø}Q¡ÖË³gÍ±^Ç\\\\ëÃA_¿bWÏ[¶ƛé£F{īZgm@|kHǭƁć¦UĔť×ëǟeċ¼ȡȘÏíBÉ£āĘPªĳ¶ŉÿy©nď£G¹¡I±LÉĺÑdĉÜW¥}gÁ{aqÃ¥aıęÏZÁ`\"],\"encodeOffsets\":[[104636,22969]]},\"properties\":{\"cp\":[102.712251,25.040609],\"name\":\"云南\",\"childNum\":1}},{\"id\":\"540000\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@ÂhľxŖxÒVºÅâAĪÝȆµę¯Ňa±r_w~uSÕňqOj]ɄQ£ZUDûoY»©M[L¼qãË{VÍçWVi]ë©Ä÷àyƛhÚU°adcQ~Mx¥caÛcSyFÖk­uRýq¿ÔµQĽ³aG{¿FµëªéĜÿª@¬·K·àariĕĀ«V»ŶĴūgèLǴŇƶaftèBŚ£^âǐÝ®M¦ÁǞÿ¬LhJ¾óƾÆºcxwf]Y´¦|QLn°adĊ\\\\¨oǀÍŎ´ĩĀd`tÊQŞŕ|¨C^©Ĉ¦¦ÎJĊ{ëĎjª²rÐl`¼Ą[t|¦Stè¾PÜK¸dƄı]s¤î_v¹ÎVòŦj£Əsc¬_Ğ´|Ł¦Av¦w`ăaÝaa­¢e¤ı²©ªSªÈMĄwÉØŔì@T¤Ę\\\\õª@þo´­xA sÂtŎKzó²ÇČµ¢r^nĊ­Æ¬×üG¢³ {âĊ]G~bÀgVjzlhǶfOfdªB]pjTOtĊn¤}®¦Č¥d¢¼»ddY¼t¢eȤJ¤}Ǿ¡°§¤AÐlc@ĝsªćļđAçwxUuzEÖġ~AN¹ÄÅȀŻ¦¿ģŁéì±Hãd«g[Ø¼ēÀcīľġ¬cJµÐʥVȝ¸ßS¹ý±ğkƁ¼ą^ɛ¤Ûÿb[}¬ōõÃ]ËNm®g@Bg}ÍF±ǐyL¥íCIĳÏ÷Ñį[¹¦[âšEÛïÁÉdƅß{âNÆāŨß¾ě÷yC£k­´ÓH@Â¹TZ¥¢į·ÌAÐ§®Zcv½Z­¹|ÅWZqgW|ieZÅYVÓqdqbc²R@c¥Rã»GeeƃīQ}J[ÒK¬Ə|oėjġĠÑN¡ð¯EBčnwôɍėª²CλŹġǝʅįĭạ̃ūȹ]ΓͧgšsgȽóϧµǛęgſ¶ҍć`ĘąŌJÞä¤rÅň¥ÖÁUětęuůÞiĊÄÀ\\\\Æs¦ÓRb|Â^řÌkÄŷ¶½÷f±iMÝ@ĥ°G¬ÃM¥n£Øąğ¯ß§aëbéüÑOčk£{\\\\eµª×MÉfm«Ƒ{Å×Gŏǩãy³©WÑăû··Qòı}¯ãIéÕÂZ¨īès¶ZÈsæĔTŘvgÌsN@îá¾ó@ÙwU±ÉTå»£TđWxq¹Zobs[×¯cĩvėŧ³BM|¹kªħ¥TzNYnÝßpęrñĠĉRS~½ěVVµõ«M££µBĉ¥áºae~³AuĐh`Ü³ç@BÛïĿa©|z²Ý¼D£àč²ŸIûI āóK¥}rÝ_Á´éMaň¨~ªSĈ½½KÙóĿeƃÆB·¬ën×W|Uº}LJrƳlŒµ`bÔ`QÐÓ@s¬ñIÍ@ûws¡åQÑßÁ`ŋĴ{ĪTÚÅTSÄ³Yo|Ç[Ç¾µMW¢ĭiÕØ¿@MhpÕ]jéò¿OƇĆƇpêĉâlØwěsǩĵ¸cbU¹ř¨WavquSMzeo_^gsÏ·¥Ó@~¯¿RiīB\\\\qTGªÇĜçPoÿfñòą¦óQīÈáPābß{ZŗĸIæÅhnszÁCËìñÏ·ąĚÝUm®ó­L·ăUÈíoù´Êj°ŁŤ_uµ^°ìÇ@tĶĒ¡ÆM³Ģ«İĨÅ®ğRāðggheÆ¢zÊ©Ô\\\\°ÝĎz~ź¤PnMĪÖB£kné§żćĆKĒ°¼L¶èâz¨u¦¥LDĘz¬ýÎmĘd¾ßFzhg²Fy¦ĝ¤ċņbÎ@yĄæm°NĮZRÖíJ²öLĸÒ¨Y®ƌÐVàtt_ÚÂyĠz]ŢhzĎ{ÂĢXc|ÐqfO¢¤ögÌHNPKŖUú´xx[xvĐCûĀìÖT¬¸^}Ìsòd´_KgžLĴÀBon|H@Êx¦BpŰŌ¿fµƌA¾zǈRx¶FkĄźRzŀ~¶[´HnªVƞuĒ­È¨ƎcƽÌm¸ÁÈM¦x͊ëÀxǆBú^´W£dkɾĬpw˂ØɦļĬIŚÊnŔa¸~J°îlɌxĤÊÈðhÌ®gT´øàCÀ^ªerrƘd¢İP|Ė ŸWªĦ^¶´ÂLaT±üWƜǀRÂŶUńĖ[QhlLüAÜ\\\\qRĄ©\"],\"encodeOffsets\":[[90849,37210]]},\"properties\":{\"cp\":[91.132212,29.660361],\"name\":\"西藏\",\"childNum\":1}},{\"id\":\"610000\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@¸ÂW¢xR­Fq§uF@N¢XLRMº[ğȣſï|¥Jkc`sŉǷ£Y³WN«ùMëï³ÛIg÷±mTșÚÒķø©þ¥yÓğęmWµÎumZyOŅƟĥÓ~sÑL¤µaÅY¦ocyZ{y c]{Ta©`U_Ěē£ωÊƍKùK¶ȱÝƷ§{û»ÅÁȹÍéuĳ|¹cÑdìUYOuFÕÈYvÁCqÓTǢí§·S¹NgV¬ë÷Át°DØ¯C´ŉƒópģ}ąiEËFéGU¥×K§­¶³BČ}C¿åċ`wġB·¤őcƭ²ő[Å^axwQOñJÙïŚĤNĔwƇÄńwĪ­o[_KÓª³ÙnKÇěÿ]ďă_d©·©Ýŏ°Ù®g]±ß×¥¬÷m\\\\iaǑkěX{¢|ZKlçhLtŇîŵœè[É@ƉĄEtƇÏ³­ħZ«mJ×¾MtÝĦ£IwÄå\\\\Õ{OwĬ©LÙ³ÙTª¿^¦rÌĢŭO¥lãyC§HÍ£ßEñX¡­°ÙCgpťzb`wIvA|¥hoĕ@E±iYd¥OÿµÇvPW|mCĴŜǂÒW¶¸AĜh^Wx{@¬­F¸¡ķn£P|ªĴ@^ĠĈæbÔc¶lYi^MicĎ°Â[ävï¶gv@ÀĬ·lJ¸sn|¼u~a]ÆÈtŌºJpþ£KKf~¦UbyäIĺãnÔ¿^­ŵMThĠÜ¤ko¼Ŏìąǜh`[tRd²Ĳ_XPrɲlXiL§à¹H°Ȧqº®QCbAŌJ¸ĕÚ³ĺ§ `d¨YjiZvRĺ±öVKkjGȊÄePĞZmļKÀ[`ösìhïÎoĬdtKÞ{¬èÒÒBÔpĲÇĬJŊ¦±J«[©ārHµàåVKe§|P²ÇÓ·vUzgnN¾yI@oHĆÛķhxen¡QQ±ƝJǖRbzy¸ËÐl¼EºpĤ¼x¼½~Ğà@ÚüdK^mÌSjp²ȮµûGĦ}Ħðǚ¶òƄjɂz°{ºØkÈęâ¦jªBg\\\\ċ°s¬]jú EȌǆ¬stRÆdĠİwÜ¸ôW¾ƮłÒ_{Ìû¼jº¹¢GǪÒ¯ĘZ`ºŊecņą~BÂgzpâēòYƲȐĎ\"],\"encodeOffsets\":[[113634,40474]]},\"properties\":{\"cp\":[108.948024,34.263161],\"name\":\"陕西\",\"childNum\":1}},{\"id\":\"620000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@Vu_^\",\"@@ųEĠtt~nkh`Q¦ÅÄÜdwAb×ĠąJ¤DüègĺqBqj°lI¡Ĩ¶ĖIHdjÎB°aZ¢KJO[|A£Dx}NĂ¬HUnrk kp¼Y kMJn[aGáÚÏ[½rc}aQxOgsPMnUsncZsKúvAtÞġ£®ĀYKdnFw¢JE°Latf`¼h¬we|Æbj}GA·~W`¢MC¤tL©Ĳ°qdfObÞĬ¹ttu`^ZúE`[@Æsîz®¡CƳƜG²R¢RmfwĸgÜą G@pzJM½mhVy¸uÈÔO±¨{LfæU¶ßGĂq\\\\ª¬²I¥IŉÈīoıÓÑAçÑ|«LÝcspīðÍgtë_õ\\\\ĉñLYnĝgRǡÁiHLlõUĹ²uQjYi§Z_c¨´ĹĖÙ·ŋIaBD­R¹ȥr¯GºßK¨jWkɱOqWĳ\\\\a­Q\\\\sg_ĆǛōëp»£lğÛgSŶN®À]ÓämĹãJaz¥V}Le¤Lýo¹IsŋÅÇ^bz³tmEÁ´a¹cčecÇNĊãÁ\\\\č¯dNj]jZµkÓdaćå]ğĳ@ ©O{¤ĸm¢E·®«|@Xwg]Aģ±¯XǁÑǳªcwQÚŝñsÕ³ÛV_ý¥\\\\ů¥©¾÷w©WÕÊĩhÿÖÁRo¸V¬âDb¨hûxÊ×ǌ~Zâg|XÁnßYoº§ZÅŘv[ĭÖʃuďxcVbnUSfB¯³_TzºÎO©çMÑ~M³]µ^püµÄY~y@X~¤Z³[Èōl@®Å¼£QK·Di¡ByÿQ_´D¥hŗy^ĭÁZ]cIzýah¹MĪğPs{ò²Vw¹t³ŜË[Ñ}X\\\\gsF£sPAgěp×ëfYHāďÖqēŭOÏëdLü\\\\it^c®RÊº¶¢H°mrY£B¹čIoľu¶uI]vģSQ{UŻÅ}QÂ|Ì°ƅ¤ĩŪU ęĄÌZÒ\\\\v²PĔ»ƢNHĂyAmƂwVm`]ÈbH`Ì¢²ILvĜH®¤Dlt_¢JJÄämèÔDëþgºƫaʎÌrêYi~ Îİ¤NpÀA¾Ĕ¼bð÷®üszMzÖĖQdȨýv§Tè|ªHÃ¾a¸|Ð ƒwKĢx¦ivr^ÿ ¸l öæfƟĴ·PJv}n\\\\h¹¶v·À|\\\\ƁĚN´ĜçèÁz]ġ¤²¨QÒŨTIlªťØ}¼˗ƦvÄùØEÂ«FïËIqōTvāÜŏíÛßÛVj³âwGăÂíNOPìyV³ŉĖýZso§HÑiYw[ß\\\\X¦¥c]ÔƩÜ·«jÐqvÁ¦m^ċ±R¦΋ƈťĚgÀ»IïĨʗƮ°ƝĻþÍAƉſ±tÍEÕÞāNUÍ¡\\\\ſčåÒʻĘm ƭÌŹöʥëQ¤µ­ÇcƕªoIýIÉ_mkl³ăƓ¦j¡YzŇi}Msßõīʋ }ÁVm_[n}eı­Uĥ¼ªI{Î§DÓƻėojqYhĹT©oūĶ£]ďxĩǑMĝq`B´ƃ˺Чç~²ņj@¥@đ´ί}ĥtPńÇ¾V¬ufÓÉCtÓ̻¹£G³]ƖƾŎĪŪĘ̖¨ʈĢƂlɘ۪üºňUðǜȢƢż̌ȦǼĤŊɲĖÂ­KqĘŉ¼ĔǲņɾªǀÞĈĂD½ĄĎÌŗĞrôñnN¼â¾ʄľԆ|Ǆ֦ज़ȗǉ̘̭ɺƅêgV̍ʆĠ·ÌĊv|ýĖÕWĊǎÞ´õ¼cÒÒBĢ͢UĜð͒s¨ňƃLĉÕÝ@ɛƯ÷¿Ľ­ĹeȏĳëCȚDŲyê×Ŗyò¯ļcÂßYtÁƤyAã˾J@ǝrý@¤rz¸oP¹ɐÚyáHĀ[JwcVeȴÏ»ÈĖ}ƒŰŐèȭǢόĀƪÈŶë;Ñ̆ȤМľĮEŔĹŊũ~ËUă{ĻƹɁύȩþĽvĽƓÉ@ēĽɲßǐƫʾǗĒpäWÐxnsÀ^ƆwW©¦cÅ¡Ji§vúF¶¨c~c¼īeXǚ\\\\đ¾JwÀďksãAfÕ¦L}waoZD½Ml«]eÒÅaÉ²áo½FõÛ]ĻÒ¡wYR£¢rvÓ®y®LFLzĈôe]gx}|KK}xklL]c¦£fRtív¦PŨ£\",\"@@M T¥\"]],\"encodeOffsets\":[[[108619,36299],[108594,36341],[108600,36306]]]},\"properties\":{\"cp\":[103.823557,36.058039],\"name\":\"甘肃\",\"childNum\":3}},{\"id\":\"630000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@InJo\",\"@@CÆ½OŃĦsΰ~Ē³¦@@Ņi±è}ШƄ˹A³r_ĞǒNĪĐw¤^ŬĵªpĺSZgrpiƼĘÔ¨C|ÍJ©Ħ»®VĲ~f\\\\m `UnÂ~ʌĬàöNt~ňjy¢ZiƔ¥Ąk´nl`JÊJþ©pdƖ®È£¶ìRʦźõƮËnʼėæÑƀĎ[¢VÎĂMÖÝÎF²sƊƀÎBļýƞ¯ʘƭðħ¼Jh¿ŦęΌƇ¥²Q]Č¥nuÂÏri¸¬ƪÛ^Ó¦d¥[Wàx\\\\ZjÒ¨GtpþYŊĕ´zUOëPîMĄÁxH´áiÜUàîÜŐĂÛSuŎrJðÌ¬EFÁú×uÃÎkrĒ{V}İ«O_ÌËĬ©ÓŧSRÑ±§Ģ£^ÂyèçěM³Ƃę{[¸¿uºµ[gt£¸OƤĿéYõ·kĀq]juw¥DĩƍõÇPéÄ½G©ã¤GuȧþRcÕĕNyyût­øï»a½ē¿BMoį£Íj}éZËqbʍƬh¹ìÿÓAçãnIÃ¡I`ks£CG­ěUy×Cy@¶ʡÊBnāzGơMē¼±O÷õJËĚăVĪũƆ£¯{ËL½ÌzżVR|ĠTbuvJvµhĻĖHAëáa­OÇðñęNwœľ·LmI±íĠĩPÉ×®ÿscB³±JKßĊ«`ađ»·QAmOVţéÿ¤¹SQt]]Çx±¯A@ĉĳ¢Óļ©l¶ÅÛrŕspãRk~¦ª]Į­´FRåd­ČsCqđéFn¿ÅƃmÉx{W©ºƝºįkÕƂƑ¸wWūÐ©ÈF£\\\\tÈ¥ÄRÈýÌJ lGr^×äùyÞ³fjc¨£ÂZ|ǓMĝÏ@ëÜőRĝ÷¡{aïȷPu°ËXÙ{©TmĠ}Y³­ÞIňµç½©C¡į÷¯B»|St»]vųs»}MÓ ÿʪƟǭA¡fs»PY¼c¡»¦cċ­¥£~msĉPSi^o©AecPeǵkgyUi¿h}aHĉ^|á´¡HØûÅ«ĉ®]m¡qċ¶±ÈyôōLÁstB®wn±ă¥HSòė£Së@×œÊăxÇN©©T±ª£Ĳ¡fb®Þbb_Ą¥xu¥B{łĝ³«`dƐt¤ťiñÍUuºí`£^tƃĲc·ÛLO½sç¥Ts{ă\\\\_»kÏ±q©čiìĉ|ÍI¥ć¥]ª§D{ŝŖÉR_sÿc³ĪōƿÎ§p[ĉc¯bKmR¥{³Ze^wx¹dƽÅ½ôIg §Mĕ ƹĴ¿ǣÜÍ]Ý]snåA{eƭ`ǻŊĿ\\\\ĳŬűYÂÿ¬jĖqßb¸L«¸©@ěĀ©ê¶ìÀEH|´bRľÓ¶rÀQþvl®ÕETzÜdb hw¤{LRdcb¯ÙVgƜßzÃôì®^jUèXÎ|UäÌ»rK\\\\ªN¼pZCüVY¤ɃRi^rPŇTÖ}|br°qňbĚ°ªiƶGQ¾²x¦PmlŜ[Ĥ¡ΞsĦÔÏâ\\\\ªÚŒU\\\\f¢N²§x|¤§xĔsZPòʛ²SÐqF`ªVÞŜĶƨVZÌL`¢dŐIqr\\\\oäõFÎ·¤»Ŷ×h¹]ClÙ\\\\¦ďÌį¬řtTӺƙgQÇÓHţĒ´ÃbEÄlbʔC|CŮkƮ[ʼ¬ň´KŮÈΰÌĪ¶ƶlðļATUvdTGº̼ÔsÊDÔveMg\"]],\"encodeOffsets\":[[[105308,37219],[95370,40081]]]},\"properties\":{\"cp\":[101.778916,36.623178],\"name\":\"青海\",\"childNum\":2}},{\"id\":\"640000\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@KëÀęĞ«Oęȿȕı]ŉ¡åįÕÔ«ǴõƪĚQÐZhv K°öqÀÑS[ÃÖHƖčËnL]ûcÙß@ĝ¾}w»»oģF¹»kÌÏ·{zP§B­¢íyÅt@@á]Yv_ssģ¼ißĻL¾ġsKD£¡N_X¸}B~HaiÅf{«x»ge_bsKF¯¡IxmELcÿZ¤­ĢÝsuBLùtYdmVtNmtOPhRw~bd¾qÐ\\\\âÙH\\\\bImlNZ»loqlVmGā§~QCw¤{A\\\\PKNY¯bFkC¥sks_Ã\\\\ă«¢ħkJi¯rrAhĹûç£CUĕĊ_ÔBixÅÙĄnªÑaM~ħpOu¥sîeQ¥¤^dkKwlL~{L~hw^ófćKyE­K­zuÔ¡qQ¤xZÑ¢^ļöÜ¾Ep±âbÊÑÆ^fk¬NC¾YpxbK~¥eÖäBlt¿Đx½I[ĒǙWf»Ĭ}d§dµùEuj¨IÆ¢¥dXªƅx¿]mtÏwßRĶX¢͎vÆzƂZò®ǢÌʆCrâºMÞzÆMÒÊÓŊZÄ¾r°Î®Ȉmª²ĈUªĚîøºĮ¦ÌĘk^FłĬhĚiĀĖ¾iİbjË\"],\"encodeOffsets\":[[109366,40242]]},\"properties\":{\"cp\":[106.278179,38.46637],\"name\":\"宁夏\",\"childNum\":1}},{\"id\":\"650000\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@QØĔ²X¨~ǘBºjʐßØvKƔX¨vĊOÃ·¢i@~cĝe_«E}QxgɪëÏÃ@sÅyXoŖ{ô«ŸuXêÎf`C¹ÂÿÐGĮÕĞXŪōŸMźÈƺQèĽôe|¿ƸJR¤ĘEjcUóº¯Ĩ_ŘÁMª÷Ð¥OéÈ¿ÖğǤǷÂFÒzÉx[]­Ĥĝœ¦EP}ûƥé¿İƷTėƫœŕƅƱB»Đ±ēO¦E}`cȺrĦáŖuÒª«ĲπdƺÏØZƴwʄ¤ĖGĐǂZĶèH¶}ÚZצʥĪï|ÇĦMŔ»İĝǈì¥Βba­¯¥ǕǚkĆŵĦɑĺƯxūД̵nơʃĽá½M»òmqóŘĝčË¾ăCćāƿÝɽ©ǱŅ»ēėŊLrÁ®ɱĕģŉǻ̋ȥơŻǛȡVï¹Ň۩ûkɗġƁ§ʇė̕ĩũƽō^ƕUv£ƁQïƵkŏ½ΉÃŭÇ³LŇʻ«ƭ\\\\lŭD{ʓDkaFÃÄa³ŤđÔGRÈƚhSӹŚsİ«ĐË[¥ÚDkº^Øg¼ŵ¸£EÍöůŉT¡c_ËKYƧUśĵÝU_©rETÏʜ±OñtYwē¨{£¨uM³x½şL©Ùá[ÓÐĥ Νtģ¢\\\\śnkOw¥±T»ƷFɯàĩÞáB¹ÆÑUwŕĽw]kE½Èå~Æ÷QyěCFmĭZīŵVÁƿQƛûXS²b½KÏ½ĉS©ŷXĕ{ĕK·¥Ɨcqq©f¿]ßDõU³h­gËÇïģÉɋwk¯í}I·œbmÉřīJɥĻˁ×xoɹīlc¤³Xù]ǅA¿w͉ì¥wÇN·ÂËnƾƍdÇ§đ®ƝvUm©³G\\\\}µĿQyŹlăµEwǇQ½yƋBe¶ŋÀůo¥AÉw@{Gpm¿AĳŽKLh³`ñcËtW±»ÕSëüÿďDu\\\\wwwù³VLŕOMËGh£õP¡erÏd{ġWÁč|yšg^ğyÁzÙs`s|ÉåªÇ}m¢Ń¨`x¥ù^}Ì¥H«YªƅAÐ¹n~ź¯f¤áÀzgÇDIÔ´AňĀÒ¶ûEYospõD[{ù°]uJqU|Soċxţ[õÔĥkŋÞŭZËºóYËüċrw ÞkrťË¿XGÉbřaDü·Ē÷AÃª[ÄäIÂ®BÕĐÞ_¢āĠpÛÄȉĖġDKwbmÄNôfƫVÉviǳHQµâFù­Âœ³¦{YGd¢ĚÜO {Ö¦ÞÍÀP^bƾl[vt×ĈÍEË¨¡Đ~´î¸ùÎhuè`¸HÕŔVºwĠââWò@{ÙNÝ´ə²ȕn{¿¥{l÷eé^eďXj©î\\\\ªÑòÜìc\\\\üqÕ[Č¡xoÂċªbØ­ø|¶ȴZdÆÂońéG\\\\¼C°ÌÆn´nxÊOĨŪƴĸ¢¸òTxÊǪMīĞÖŲÃɎOvʦƢ~FRěò¿ġ~åŊúN¸qĘ[Ĕ¶ÂćnÒPĒÜvúĀÊbÖ{Äî¸~Ŕünp¤ÂH¾ĄYÒ©ÊfºmÔĘcDoĬMŬS¤s²ʘÚžȂVŦ èW°ªB|ĲXŔþÈJĦÆæFĚêYĂªĂ]øªŖNÞüAfɨJ¯ÎrDDĤ`mz\\\\§~D¬{vJÂ«lµĂb¤pŌŰNĄ¨ĊXW|ų ¿¾ɄĦƐMTòP÷fØĶK¢ȝ˔Sô¹òEð­`Ɩ½ǒÂň×äı§ĤƝ§C~¡hlåǺŦŞkâ~}FøàĲaĞfƠ¥Ŕd®U¸źXv¢aƆúŪtŠųƠjdƺƺÅìnrh\\\\ĺ¯äɝĦ]èpĄ¦´LƞĬ´ƤǬ˼Ēɸ¤rºǼ²¨zÌPðŀbþ¹ļD¢¹\\\\ĜÑŚ¶ZƄ³âjĦoâȴLÊȮĐ­ĚăÀêZǚŐ¤qȂ\\\\L¢ŌİfÆs|zºeªÙæ§΢{Ā´ƐÚ¬¨Ĵà²łhʺKÞºÖTiƢ¾ªì°`öøu®Ê¾ãÖ\"],\"encodeOffsets\":[[88824,50096]]},\"properties\":{\"cp\":[87.617733,43.792818],\"name\":\"新疆\",\"childNum\":1}},{\"id\":\"110000\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@RºaYÕQaúÍÔiþĩȨWĢü|Ėu[qb[swP@ÅğP¿{\\\\¯Y²·Ñ¨j¯X\\\\¯MSvU¯YIŕY{[fk­VÁûtŷmiÍt_H»Ĩ±d`¹­{bwYr³S]§§o¹qGtm_SŧoaFLgQN_dV@Zom_ć\\\\ßW´ÕiœRcfio§ËgToÛJíĔóu|wP¤XnO¢ÉŦ¯pNÄā¤zâŖÈRpŢZÚ{GrFt¦Òx§ø¹RóäV¤XdżâºWbwŚ¨Ud®bêņ¾jnŎGŃŶnzÚScîĚZen¬\"],\"encodeOffsets\":[[119421,42013]]},\"properties\":{\"cp\":[116.405285,39.904989],\"name\":\"北京\",\"childNum\":1}},{\"id\":\"120000\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@ŬgX§Ü«E¶FÌ¬O_ïlÁgz±AXeµÄĵ{¶]gitgIj·¥ì_iU¨ÐƎk}ĕ{gBqGf{¿aU^fIư³õ{YıëNĿk©ïËZukāAīlĕĥs¡bġ«@dekąI[nlPqCnp{ō³°`{PNdƗqSÄĻNNâyj]äÒD ĬH°Æ]~¡HO¾X}ÐxgpgWrDGpù^LrzWxZ^¨´T\\\\|~@IzbĤjeĊªz£®ĔvěLmV¾Ô_ÈNW~zbĬvG²ZmDM~~\"],\"encodeOffsets\":[[120237,41215]]},\"properties\":{\"cp\":[117.190182,39.125596],\"name\":\"天津\",\"childNum\":1}},{\"id\":\"310000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@ɧư¬EpƸÁx]\",\"@@©²\",\"@@MA\",\"@@QpªKWT§¨\",\"@@bŝÕÕEȣÚƥêImɇǦèÜĠÚÄÓŴ·ʌÇ\",\"@@Sô¤r]ìƬįǜûȬɋŭ×^sYɍDŋŽąñCG²«ªč@h_p¯A{oloY¬j@Ĳ`gQÚpptǀ^MĲvtbe´Rh@oj¨\",\"@@ÆLH{a}Eo¦\"]],\"encodeOffsets\":[[[124702,32062],[124547,32200],[124808,31991],[124726,32110],[124903,32376],[124065,32166],[124870,31965]]]},\"properties\":{\"cp\":[121.472644,31.231706],\"name\":\"上海\",\"childNum\":7}},{\"id\":\"500000\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@TÂÛ`Ùƅően½SêqDu[RåÍ¹÷eXÍy¸_ĺę}÷`M¯ċfCVµqŉ÷Zgg^d½pDOÎCn^uf²ènh¼WtƏxRGg¦pVFI±G^Ic´ecGĹÞ½sëÆNäÌ¤KÓe¯|R¸§LÜkPoïƭNï¶}Gywdiù©nkĈzj@Óc£»Wă¹Óf§c[µo·Ó|MvÛaq½«è\\\\ÂoVnÓØÍ²«bq¿ehCĜ^Q~ Évýş¤²ĮpEĶyhsŊwH½¿gÅ¡ýE¡ya£³t\\\\¨\\\\vú¹¼©·Ñr_oÒý¥et³]Et©uÖ¥±ă©KVeë]}wVPÀFA¨ąB}qTjgRemfFmQFÝMyùnÑAmÑCawu_p¯sfÛ_gI_pNysB¦zG¸rHeN\\\\CvEsÐñÚkcDÖĉsaQ¯}_UzÁē}^R Äd^ÍĸZ¾·¶`wećJE¹vÛ·HgéFXjÉê`|ypxkAwWĐpb¥eOsmzwqChóUQl¥F^lafanòsrEvfQdÁUVfÎvÜ^eftET¬ôA\\\\¢sJnQTjPØxøK|nBzĞ»LYFDxÓvr[ehľvN¢o¾NiÂxGpâ¬zbfZo~hGi]öF||NbtOMn eA±tPTLjpYQ|SHYĀxinzDJÌg¢và¥Pg_ÇzIIII£®S¬ØsÎ¼¥¨^LnGĲļĲƤjÎƀƾ¹¸ØÎezĆT¸}êÐqHðqĖä¥^CÆIj²p\\\\_ æüY|[YxƊæu°xb®Űb@~¢NQt°¶Sæ Ê~rǉĔëĚ¢~uf`faĔJåĊnÔ]jƎćÊ@£¾a®£Ű{ŶĕFègLk{Y|¡ĜWƔtƬJÑxq±ĢN´òKLÈÃ¼D|s`ŋć]Ã`đMùƱ¿~Y°ħ`ƏíW½eI½{aOIrÏ¡ĕŇapµÜƃġ²\"],\"encodeOffsets\":[[111728,31311]]},\"properties\":{\"cp\":[106.504962,29.533155],\"name\":\"重庆\",\"childNum\":1}},{\"id\":\"810000\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@AlFi\",\"@@mp\",\"@@EpHo\",\"@@rMUwAS¬]\",\"@@ea¢pl¸Eõ¹hj[]ÔCÎ@lj¡uBX´AI¹[yDU]W`çwZkmcMpÅv}IoJlcafŃK°ä¬XJmÐ đhI®æÔtSHnEÒrÄc\"]],\"encodeOffsets\":[[[117111,23002],[117072,22876],[117045,22887],[116882,22747],[116975,23082]]]},\"properties\":{\"cp\":[114.173355,22.320048],\"name\":\"香港\",\"childNum\":5}},{\"id\":\"820000\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@áw{Îr\"],\"encodeOffsets\":[[116285,22746]]},\"properties\":{\"cp\":[113.54909,22.198951],\"name\":\"澳门\",\"childNum\":1}}],\"UTF8Encoding\":true});\n}));"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/data/city.json",
    "content": ""
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/data/guangdong.js",
    "content": "(function (root, factory) {\n    if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymous module.\n        define(['exports', 'echarts'], factory);\n    } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {\n        // CommonJS\n        factory(exports, require('echarts'));\n    } else {\n        // Browser globals\n        factory({}, root.echarts);\n    }\n}(this, function (exports, echarts) {\n    var log = function (msg) {\n        if (typeof console !== 'undefined') {\n            console && console.error && console.error(msg);\n        }\n    }\n    if (!echarts) {\n        log('ECharts is not Loaded');\n        return;\n    }\n    if (!echarts.registerMap) {\n        log('ECharts Map is not loaded')\n        return;\n    }\n    echarts.registerMap('广东', {\"type\":\"FeatureCollection\",\"features\":[{\"id\":\"440100\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@EHGTANB@DAHBPHFEDDNFRPBFKFEHSLKAGDUCAA@CGA@AEAAHQCGHEDWFGDCDAHAbI@ABADCDAFGA@DB@AFJFEPFB@Dg\\\\EBCHBJBBNB@DAF@H@F@LCPHFDCDFJBFDIRMPSHGFEACCA@BHABEFMFKJCF@JDJ@J@DNJCFIBABAFBNHHABALREDHABEAABGbDJBFMEqC]DCBKLOLUHIFCJAFDHCD@BL@VL`@BDA@@BHFABBD@FFB@FADECGBCPADEXB@L@BDDdADg@EDCF@TFHPPTHDHAL@HBJIRQPINM@MLBNCPFDF^E\\\\EPEFQDADAJABQBEH@HBFABGHIBMHKNGQS@CHMO@AF@BIGKSBKCCCGCUACA@CHKBKJO@QAEEAOAMHIAOBECE@@DLNBHFBAHA@AB@TEFE@EDGHCDDBCJCDC@@HDXBDFBAHMD@CA@KJHRDDJHHJJN@DEFGBE@KIAEEEICAEA@CBCN@FCDA@GCMFS@ED@RAFEFA@CDJHGD@DBBHB@FEBDDHBAFCH@DHDBDF@DFF@FBED@BEBCJADC@ABGVGH@BBBLF@JCDCCKAEKCCG@CCIKE@CH@FFXHDFAB@DDHNBJAHD@FDPCLHHGHAF@PDHGBBEHJBBBCB@BPHFERBBFH@NGNDHHBFDFHDRBBHNLLCHHPADDHBDANHDFGJDBBBFIHDJHTERAACPGJF@HHBFAHHDCALDF@OhFFD@BGJJFBJHDJHBDHADF@FKJHJCFOLFVAHXPLANDBRJAJEF@FGB@BD@HCHBDGPDBLIPJNBHBFHJDDBBCDIDABHPJDFBDFVFJABSF@DBBXDVELBLAHBBFAN@DJ@FBBBDNDDNBDBDNHL@JLVFVFFFAF@FF@H@NBFBHBDLCNAHBHCDGHAZBPFB@HGPHH@FC@CIAFCB@@GHCNGD@PEDCCEBCHG@GACRKHAFFJCF@HELBLBFCH@DBDDFBFAFBfVCDI@HFJBXCJI@IHABABEEEBGLDNKN@@KTIBCBFNPTNEFAF@BDBBBLFFFAJFDLBJADFIHE@CF@JHDATFFD@KPLXIFCLEPMHGLAFHDDDCDE@@DB@HAZVAFDJFBBJBDJHPFDA@CHDDAF@HGHBRADCFB@JFPF@HIH@FADGHARLF@DHEFEPFFBLITGDBFFHLGBDF@DEAGB@FB@FB@D@FEF@LHB@LILHF@R\\\\JDFHL\\\\@JLFBHHBLANBFGDBJDFFVJLJPFTD\\\\RR@DBH@BGLEBBDD@DFHFGH@DBH@DEBCFAHBNFJDHAFBF@@EDABCD@DDH@LHNBHCLHDACEZDFGRHHAJ@FFB@DBB@@ABCD@FC@AFCBCBBD@HAD@DCFA@ABAACBCCG@GBEHC@MDA@CHCBCAEB@@G@AEI@CBCHADEBQFEAABAFGDADCACC@AIC@@G@MGAOGGKAKDIJAJGGEKCAEBCRKPADEHOCBUCEAKEEE@EOIEOC@CHCD@DAFGAGBBNJDDLI@ECAEUSKCSAME@E@MEQE@GBICKIEBGFQBCC@ECAEBQGG@OYEAQ@CG@GAOGEEKGEQGUAIC]CGGRI@EQDCQCIKAQBM@@CFILABCGOKACAEMDCBEBAB@JBR@BCAEDCHAJBbODKEKAIDEHEKGCEEK@GNEFEDMFE@IDKDEJEPCHCDEAE@EFILCDGNEFKDCHAP@FEDGDCT@LA@CKQEAKF@CDELERDPALDF@JCJBFCJIOMGAQ@KDAACQDMCMDGNOR@JCJBJFDABA@EGKFKEI@EFEVMDCBGEISIKGACBENWDODEPKBC@AGIGIG@@ACAGB@CJE@OFGBEHGAKBKCBK@GDEBG@AB@FCBYLGFFTCNGFQDIHEFGAOCcFIHE@KCCECGEI@GFEDIHAEK@KEICUCA@CFGAGIQMKCEPGHEJCDEAGACCAAIFGDMHMDEFABEAIAAI@GBCOGCCECOBE@EHOHAJBHC@ECIEEKCIBWBCAIKQACEAEKEAAAGBEEK@ECE@GA@@EC@@MGFIBcPUDYCKBIDEBoC_XSBIAMC_Q[UKCWAQIA@BLABC@GAGDQM@AFCEICA{@KGGIIESIqKK@MKK[EGQMQ[AG@IBcLyJWHKHKRo\\\\{NOHM@G@MG_@YNWNSx{^_¸ÍÓpġEMSKmKoC}DYeKL]RSBWTAAEDEEGFEEEJsGN@DNBBRcZji`MLHPiNMB]B[JfaX\"],\"encodeOffsets\":[[116086,23320]]},\"properties\":{\"cp\":[113.280637,23.125178],\"name\":\"广州市\",\"childNum\":1}},{\"id\":\"440200\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@ABBHADCH@@HFRBHDHDAFMLCFLJ@TDJAFCDGBBFEBBHKBCHC@EBDFCBAHBDFJANIDEHEDC@@F@JFB@DD@BD@DFFD@@DB@BDLDBF@DHHEH@JFHJHJHLJABODEBCDI\\\\QN@FEFAHILQNIN@FBRDNABBJFJdRNHJHFHDBZBJBJFHF@HIRQAEDEDGTGLAFEDCBED@NADIDYEEBGLC@ECC@OJGCCIACC@KHSBCABKAACAGDCJ[EKG@EEAIDINOBEDIAGAGBCFADBFBDAB@BDHFF@HFFCDC@AAEDERCDIFBN@HEVBDDDBHEJCD@DCJ@FDBFAPIHGH@DBFJPAHLDDFABCFUF_ZUVGDBDF@TJNALBDJDN@FDFRDBPBFBBDHPR@THB@FGJAHDHAB@JFJCDGDAL@BBBNFDBJHBBB@HBBF@FCFDNLJBFJLDVBJB@FAFBDJDFHDTNHADGBAB@DBBVHF@HCJBXMH@BBA^GRMLAD@DL@HDBJADCA@ECCCBADBDJPFFHBL@TBFBBB@FE@KCG@ABBFFFLCFDEXDFVAHAFEFWJIF@TJVFLLFHBPJJVPdND@HCHOFGJED@DDBFBBD@LEHABACEHED@B@BDH@DH@HEJBFDHP@JADA@C@@MCECHKJCFQFAACAE@IFOHKAEAW@SH@FDDHFBHBFCPBZYNBNMJqFKD@HDPBB@FEDEDAVJJANCLKB[FKFEJCLOHAH@HDRPF@HGH@DDJPHBNEHAH@LDB@JERA@CGK@CFGHGDBHHJJFLF@JABADMBAH@FMRELAPEJEBCBQG]DAAMDEHBJNHFLHPBDLDCFDFADADBBCDDABDBJDDEDBBABB@BFB@CBAD@@DD@BEN@@BF@BDB@BDBADFAFFBFCBDJ@BAD@HCB@JLALFLDBXAFDHAHB@DABGD@DLAJEDB@DB@HAB@FINIDADBALFJFHHDHADCJY@KLK@IK@CABCBAJ@PBRHJAJCN@LCN@LALDDBJNJLBTHJDJHDHD\\\\DFBHLRHDB@DAJLNBF@DENBDBBNBDD@DCFKFAD@DFDAFAHBDDDPBRFRCDBAFB@NAJ@LELCLDBFPDLJFHVIV@RKFBFBF@FABCBECI]UKMBKHKDCNARGF@FI@KPBBCFAJHJFP@DA@EFC@AKGMAEAKIB@LATGPABCBCEAKA@ATW@EAEAAGAEDGBCC@CAEIEAE@EBEJKRALGLE@ACCKCI@OBCAKIE_EEIEE@FEBGBCFCNEDABECCAMBCFAJAD@NT@DDLDDBHJHRFFMB@DFLDNEJJVVJFNFJJF@HAHAHJFBCD@BF@JDL@BABIB@NNHDR@BAFMDAF@HDTTH@TIDGAOBAVBPAHGBBBFLBlOJ@HBFPDBbEFCAGFIRBDBGFCBCJDBHHFAHHHCBB@BAJMFAB@FBTBBH@@@GF@DRHB@NCFCZ@RITET@J@BADMLBCC@ABAD@DBHNPBLFDNPBFALBHDJHDF@BGHHBBBFRFNDTNL@DDDVDHCDACGBCH@BCHALIHAJLN@FBZNBHADEF@L@BNDDBF@D@XXHDJBHGJAPKTCLGLBBCACACG@AO@GFEJB@D@RBFJ@\\\\SBICGAMHABAIOBAZCLS@EDCJEBCBMTMTDFAPFPCTSLEL@DDDJDBJEFBDABIBAJDD@H@@CCG@CBALAHE@IDICE@IBAPBFAPOBG@KBGA[DEHE@ACAQAA@BOBAPHBA@COKEAEBIJGDA@YUCAGBGAECBE@ACAIA@AFG@EAEJ@@@@CKKIBKBEAAADKDCHABA@GD@AAGGACBARKL@BC@CB@ZADBL@DABKDAN@BA@EGSFC@GFKEQACK@IEMCGIGCEBWIIBGDI@YGCCAEBMWUOIKC]@WHICCPC@MK@CFG@AA@C@CHCBGDKB_@MAIKISIKAEIGACBE@KCMEIGGGCG@OHEECKASAGGCKAODK@C@AHCBCASGGAEEM@@GDWCECCGCQEe@CCAGJI@CACGA[AMCGE@EFGAGCE@ALK@CCQCCKGA@@CTQFIBIC_CGOGEIEAIAICCMGGMKAABEAAMUAIDIQCKKAGFQ@MACQEACAIFEHIDQM[CE[GKMIEMCQBICGEEECM@QCIIEQ@MEOBEACB[AiQK@CACFEBKDcCICAGBGLIFILG@C@ILGBAECGCE@@JCDE@CG@SHBJ@HHHBZBHBBILEPEJCJAVJJ@VGFMJEZ@FG@MPCDG@ICEDG@ELMFIBSBCDCHA@EDIBOCCGAQCEAKMDIAEGAUEAAACDGLGBE@QFMFGZQFKRIBCAEGEOCKCMOEOWMYUMAEEOK@EHM@IJIHGBEKY@IDYCOBAF@RFbBLENQD@@EAEIKMGOY@CBCNOBIQaGKGEAIDIACKCIEAEDCJ@P@J@BCACE@_AA@AC@CFCPGHIBEPcBCEI@C\\\\GNEFGBMOSAEBGDE\\\\SHSFIHGJCROAMBEDED@FBFVRNF@ZUHAHDJHDDBBH@FCJFTC\\\\ABDD@BA@IDEL@FFFADEBGHIDAJBFEREJIFBJFJED@DJFB@DKJEVSJCBNFBN@XC@GAC@CJ@FJFH@BA@IDANHDFBLFDBHDDFLB@HB\\\\VDD@HBBJFNJ`LRNDFLXDBB@DCJWDATIPBLCDCBKFKKQAEBGAMDGJIFE@EAGCGEEMCSAQCICIIACFWDCFAEAEG@A@EAEI@EDCFEBC@C@CGECC@CF@HBJAF@@E@EECMEIIEEIBEGG@AA@CCA@GDORABG@CC@EHMACMOIUKIMEIEM@UIEECEEEA[DEDIBG@EaAACEUA@ILED]CCA@EHGGEKCEGCIFMLGCCMF@MCG@CFMFCBEGAAACG@GFGCEGCCI@GDAAEBEDGCESCAECMDCACECIACC@AHC@IIMEAC@CAAGUJOPMGEEK@KCE@GAED@DADIFEBED@FKAECBAAACBI@IBAFC@CJG@IGK@KBKF@HHFNZHBFHCBEACDHHD@BBFAHFJBLH@HJDGBAHCBEAGBCIEEG@EEGCEBKMG@GCOBKDGFECG@IEGHK@KNBJQFG@IE@ACCG@COGKGCMAADEDKACDE@DCEEC@ICC@EBAADEGCICICIBI@IIE@CHMAIAANC@M@QJEEGKBEOYECBEEGACIFAF@HDHADBDAB@BEBCDC@GBC@AAADED@BEDC@AD@BA@CAA@EEI@GBQGEHYCDFCBKGGDMAKGG@CCC@ADCB@FE@EAGBICMEGAEBADCFG@CAG@EHEG@CCCAAKFAHG@CAQ@[QSCGAGCKIUIEEICCAEHGA@HCD@DBB@H@PCDCAABAHIJCBE@EDKBFFGH@PADEBAHCBM@CDGEGDC@GCEFEJBDCDEBE@AB@FDFADMHEJCBCDJHJBJNLJDDNXLHLAHID@PLJBFADEDCFBFD@FADBJJJP\\\\FBHCF@RNN@FD@FEL@DDBN@BD@LNF@D@BABK@CB@TBFD@FF@DGFAF@LDDDBTHFRF@P@FFFH@FEFABI@ADANEH@DJFDFbNXVJFHBFABAACFAXFRAFDBNABOEAPMBEBUHGH@FCB@HEFFLIFBN@JGDGDE@C@CIG@CDDL@LCBEDIDCAEGCAMJOHAD@LBDLBFDBD@DMBDJBNE\\\\BFHFBPIVINGBIAUHGH@JDFKF@J@BKRGDCL@DJLA^ADG@QHGJEBIAIHKBGDAF@NALSHu@ECAYCIBEGGOB_hQNELANBHABIDEJOJGBEAEBaXCDAJMDGFA@ICU@CBBJCDIEABEDAHHN@DCFEBMBEACG@QCEEBALEHKAS@OFC@GEEBEEGWEACCAWMGGKA@CBCJMPC@A@KSGEM@EDGHEBKUKKMCYCMGE@SJMBCBCBIVJN@JCBI@CA[DOCMBADBJ@DCBC@CAIMOOUM_AGBKAMM]EIIGBEFYFKFEDAROJCDALGFCH@XCDCAIMCAEAC@AHABCAGKCAKBCCGA@EEKGGAGCEICIBSLE@UIE@GDIBAAAMEEEAEFAFBDBHG@ADMBKD]`KHC@UGGECG@GIQEQKDSGO@OHEFKACHCDEBIJKFCHC@AJABBHGVQHURCD@LOTA@GAIACDEJBJINGNCBGACD@JFXGHSJKAGDKBKAE@GHA@G@EAG@OGA@@HABC@QIC@CDADAd\\\\`DN@FELAFJJXJDD@LKT@RGPATEN@DFFFB^APBBBCLBDF@FFHL@FIPAN@DDDJBDDZnAFEHLHHL@FIR@FGD@FPNfNDDBJHBDAXXdDFDBHDT@FEJMHAFA^EDEDAD@FDPAFADIFGL\"],\"encodeOffsets\":[[115707,25526]]},\"properties\":{\"cp\":[113.591544,24.801322],\"name\":\"韶关市\",\"childNum\":1}},{\"id\":\"440300\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@ABD@AA\"],[\"@@CEMIqakYK@MHWZMbEh@NHT@HOtEB[IEBCB@JBNFP@FCFGJ{piSdKbCLMdI`ANATVl\\\\RZLHJDLENHHLFBFCF@DFBHEHBFFAFDFTBBFDA@HFADFDAFDFRCHBDAHGDDD@FDFFD@FH@LFFCD@DEFDBA@BFFP@@FB@CFADF@@ADFADHF@DA@BBD@CA@CD@@DBA@CDA@BABDA@DBABDABDADDEFD@@BBABBBD@ECAFA@@BCBBBCFBDDB@KMCHCABAB@@CD@CABED@@B@CD@B@CABCDDBD@CD@FBEEF@A@@CFA@AJDBABF@EC@BCFDBDBBDADDD@D@RCI@EBCAEBEA@ABAEB@CFCDABACBCABBCBCDEACBK@CFCABGBGJ@DEHBBCBDHBHAJBRBAADABAPCDGJEBAAABCACDADBBCB@HFBEBAD@BBFADADABEBAGACEFIBBAFB@@ADBACDB@BB@HF@GEB@CTB@KDI@CDIDKD@@CEGBEHADGHBDEFBFCH@BBHBFB@DBBHCBDHBBCFADFFBDFDBBABCCABCFE@CECACJCBBD@BCDABDJB@IA@ACFCFBHGAEFAFDHD@FFFDCHBFCCABALD@GDCBG@ACCFED@BADONCDDD@DGDA@CDAB@BBH@DEHADD@DNEAIDCBAAGJCFOACRIB@DCJE@ACABIGOEFE@C@CIBAACB@DH@EB@FHDICC@CH@@JFBFGACJEF@HBCDDFBFBDF@DDEJXVADE@CHBBJADL@DCBFHAJ@BCB@FNJB@DAB@FFCF@RDFB@BDFD@HGHEB@BDJ@@ID@AA@CHHB@BCDCAEDBJ@BC@CACBMEEDE@@FBBFADB@BCDEB@FCB@ABGA@CBBHADHBFHHDN@BDTDFHBFDFCBHPFBDAHF@DDBFA@GFCDQ@INCH@BABEHG@CDADDNAPNAF@BNDBB@DHDFF@FDFDAJDFE@EB@VC@BDBF@DA@CD@DBDLJCH@DBBFJ@JBFAJ@DEF@@@@CCAAGBCB@@IAEIAGIDC@CDCD@DBHABADEAQHCLFD@DANEJCJABCD@LFBLALBJRJFEFADEBABGHGAADGBBFACCGCFA@ECAG@BOCK@EKI@MA@CBA@@CFGFKACDAFDD@DAFFFGDCAA@GFIDBLBBEDAD@DBFIBGIMGAACECIABOFA@A@ECADCdJBDFFFAHCR@DABCLEDBDLXDDCT@HED@FICE@ADA`BpAZD^HZCLCHCDG@ICOScMQ[SOQKU@MBGDILMVOVGTAVAJCFMFONUBMASCIQYIGuQeIWAKCIIIUGIGCKCeCYFIDIFILKXKx@FHp@HIXEHSVKJQNEFCHGbGJIHWNYHQ@MCeOUESCc@GAIIIGMSMCKGcA_EQKYUICCB@JCDEB@BEDIAEFOACDEAA@AAG@CCCBA@IBAAEBAFABI@EDIEADA@KKG@@GC@@C@CB@BB@AEEACEAABKBGCGBCEE@CAEGG@AEECEB@LECEBKCCBGFEAGGIACCBCLG@CEEIGC@GFOAIGCOIEC@QF_DML¡@SAMGCIESKU\"],[\"@@@DHFROEGA@QN\"],[\"@@CD@F@BFBHGPG@KCAIDKL\"]],\"encodeOffsets\":[[[116556,23085]],[[116684,23020]],[[116572,23039]],[[116577,23051]]]},\"properties\":{\"cp\":[114.085947,22.547],\"name\":\"深圳市\",\"childNum\":4}},{\"id\":\"440400\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@KF@DC@BBCDAABA@AKDADFRLB@EACBEDB@DB@DEBEBACA@CH@CG\"],[\"@@C@AFFFFB@CEI\"],[\"@@KHEAAB@BGAGBGDCFADDBCBB@CFFBBABB@CDBHJDBD@BADFDADEAIBADDFABEAEFCAEAC@ACC\"],[\"@@BBBAAAA@@B\"],[\"@@QF@HHFBB@BBBFBBBF@FHDB`F@FD@T@DFPHLBTBDBT@JHGH@BRHHBJAFA@ECGQABEAAECEABGC@HA@AAAIAKGCA[BACI@@CMAKGU@GACCOAEAGEAEEA\"],[\"@@CBCBFDAFBFDDB@BACEBKCC\"],[\"@@AFCAC@AAE@@BBDCB@BDFADA@G@IF@BBDLJB@ACH@BAJJH@DAD@FAAIGAEGAA@ADDDBHDLA@EDA@ACAEA@ECAE@ECEA\"],[\"@@OBCD@NCH@FFNFBVBbCNBLGBC@ACEAID@F@D@@ACEMEcDKCGEE@\"],[\"@@EBCFGBe@E@CDFFNHHBPAHBBBDRBBD@DADABCFAB@LJH@BADMACGEAIOEIGCA\"],[\"@@C@IFADBFCBAHGEABAJBHGDGHAF@BD@DAB@AHBBH@FIBFBBVCADBFH@FBD@DG@EFA@CCICBDEBGMKGBAQCC\"],[\"@@CBAB@BFHCHRXFDDAFCDBNGBAAE@CAEBCFA@AEECAAF@@QAEDCIAAK@\"],[\"@@DEACIJBBFA\"],[\"@@EDDH@FHDADGCADE@@@BNDF@DGAADFHHBDDHBJC@ATCHCAGL@@GIOCAAGKEE@EBEABACCGBAA\"],[\"@@@DD@@ACA\"],[\"@@HDDAAGGEAL\"],[\"@@BBHBBABGFBFBBACCIACBGDAD\"],[\"@@BDHBBACCDC@EJ@LFBAGI@AC@GGE@GBAB@FBDABBFAD\"],[\"@@FHJFFA@EKIE@CD\"],[\"@@BJFFAHB@HGN@BIBAD@@AACO@MECBAF\"],[\"@@BBB@BA@CC@AD\"],[\"@@FHLDHFN@BAGGOAGEEAC@@B\"],[\"@@DHJJ`LDBBLBFF@DE@CGKBABAJ@HFDFBABCCCIGKEI@KBKCAA@CFIAAGDGCG@CH\"],[\"@@DDADHACKAB@BC@@B\"],[\"@@BBFCC@CB\"],[\"@@@@B@A@\"],[\"@@B@@@A@\"],[\"@@BB@AAA@B\"],[\"@@D@@CCB@B\"],[\"@@BJCD@BDHD@@FD@DDFCHJHBH@@AMMQE@GGI@GICABDFDB\"],[\"@@@DDA@EBCAAAACFBF\"],[\"@@BBBAAAC@BB\"],[\"@@BBBC@@CB\"],[\"@@BBD@BAAEA@C@ADBB\"],[\"@@@BDABCFE@AAAC@AHC@@F\"],[\"@@HBDECAEBAD@@\"],[\"@@ADBBJ@BAACACGD\"],[\"@@BB@CAB@@\"],[\"@@ICAHDDBBBCJDDEBAEOCEC@AF@FB@BH\"],[\"@@JNBHBBHIBGAAMEE@AB\"],[\"@@F@BD@DBBJABC@AKC@EGDAD\"],[\"@@DA@CACCBCCGHANJ@@A@EFA\"],[\"@@@DDCAAAB\"],[\"@@JEBCD@@ECCE@GBCAGJBBFABBBA@FBD\"],[\"@@ACOEIBCBBHDBBNFDBBLCFGDA@CEA@C\"],[\"@@BA@GBA@CC@AB@NB@\"],[\"@@BBB@@EA@AD\"],[\"@@@BF@AAC@\"],[\"@@@@B@A@\"],[\"@@A@AD@BDDB@BCACAA\"],[\"@@CH@DFBFFB@B@COGC\"],[\"@@FDFHD@CGDABACIDADGIMA@C@EBBFFDBHABGBABBH\"],[\"@@@BF@CCA@@B\"],[\"@@FDBAJAGEGDAB\"],[\"@@PBBABAFD@CD@@AAAC@CEECGAE@@DBFAF@B\"],[\"@@B@@ACA@BBB\"],[\"@@ADDBFACIC@@D@B\"],[\"@@JABGFCBCACC@CDCAIFAFDFBB\"],[\"@@DA@@CACDD@\"],[\"@@@DD@@GBCACEA@FBBABBD\"],[\"@@B@A@@@\"],[\"@@DDF@BA@EACCDEAABBD\"],[\"@@F@BAEACBBB\"],[\"@@BA@AIDDBDA\"],[\"@@SDAACEG@GADKAC@MMWAG@GFKFGJSJKJGDEAmBaBEVSDG@QCKIEE@eFWBEAIGMOSKQCWBIAeSKIEK@SCKMOe·a]IGEEIES@cCUK[ECQEGCGGU_MKQCICIBcLWPUTitk|KJQJONOVEPAbIPMTCNI¾BBHRJªDHDFRTGJTLJKRR|VJHJLDPDTHX@XBHPVFz@RFXED@FBFFBBLIDIT[RIHDB@JE@@TDDT@HFF@DCFEBEH[ZFJHBHBBBLDBFADCBCRBLGD@ZNFAlY¥HKBcBE\\\\{NaLUNKbSFABAFBHCDGB@HDHENQ^cRCJ@BBDDVH`LJL^LRDADEDCD@HBHHDNABDD@DAPFJFDJDD@FAB@FC@AHABI@CH@HABE@CFBLE@[`C@GJGFBDLDJBDJR@TJBD@BGH@DGD@JCBGBAF@DDBAJFF@HADGLFJ@LGHCJBJFDLFAVBDPFHFD@JIH@FHBBD@DCDBFFNB^GbAHKNGNAP@TFJJH`JZNLlBZENCHEDKAOAKi}eCGMIMCM@CAAAAKBIHIPKBGACGGICWEIIAKDKFIBCAEEIAEDEJEDIA[EYCGECa@ICQQCG\"],[\"@@DBDBEGAA@F\"],[\"@@CD@HFNFBFHLBDCBIHABEEOMIQEGMOMECAD@LFNDDJBHH@D\"],[\"@@BBFAFBDA@CCCC@BAAAFGAEGBCFAFCDBFBB\"],[\"@@YHIHAHMFKDCB@D@DFBD@JCDFBFFBB@DID@HDFAFGDIJKBMCAEA\"],[\"@@ABGNC`B\\\\FJJ@LQJAFF@JBFHDH@HEBGDGHGF@VVJBJ@HCBGEMOKKAAIAAQACPC@GAEDKCa]COA@\"],[\"@@OFADBDA@@HA@CAAFBDLH@RIPBDDBNBB@@IAG@EJ@@CHIDGDAACKIEGAEAC\"]],\"encodeOffsets\":[[[116547,22689]],[[116494,22644]],[[116790,22617]],[[115800,22625]],[[116973,22545]],[[116388,22560]],[[116444,22536]],[[116931,22515]],[[116894,22503]],[[116496,22490]],[[116412,22466]],[[115851,22482]],[[116453,22449]],[[116803,22455]],[[116522,22511]],[[116537,22532]],[[116557,22530]],[[116642,22563]],[[116654,22566]],[[116748,22582]],[[116866,22489]],[[116772,22412]],[[116706,22333]],[[116957,22541]],[[116828,22426]],[[116828,22427]],[[116779,22406]],[[116757,22397]],[[116747,22378]],[[116750,22374]],[[116749,22367]],[[116724,22390]],[[116696,22345]],[[116703,22351]],[[116712,22344]],[[116710,22357]],[[116677,22335]],[[116736,22575]],[[116744,22556]],[[116752,22569]],[[116721,22587]],[[116679,22597]],[[116610,22649]],[[116636,22645]],[[116572,22656]],[[116531,22709]],[[116577,22520]],[[116459,22483]],[[116425,22560]],[[116425,22566]],[[116394,22569]],[[116367,22556]],[[116456,22697]],[[116437,22675]],[[116440,22661]],[[116431,22645]],[[116432,22633]],[[116355,22774]],[[116344,22777]],[[116331,22776]],[[116327,22782]],[[116342,22863]],[[116338,22866]],[[116285,22746]],[[115833,22417]],[[115854,22446]],[[115882,22481]],[[116552,22934]],[[115859,22356]],[[116561,22649]]]},\"properties\":{\"cp\":[113.553986,22.224979],\"name\":\"珠海市\",\"childNum\":70}},{\"id\":\"440500\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@CBAFBDD@DFD@BCEE@ECA\"],[\"@@AB@DDBBECA\"],[\"@@CDL@ACE@\"],[\"@@B@B@@ACB\"],[\"@@DBDACCA@AC@H\"],[\"@@BBB@AAA@@@\"],[\"@@BDH@BA@IGEA@AN\"],[\"@@B@B@@AAAAD\"],[\"@@@CC@@FDA\"],[\"@@BBBC@ECB@F\"],[\"@@BDD@@ACAA@\"],[\"@@ABB@FAACABCABD\"],[\"@@AB@BDBBAD@@GAACBAD\"],[\"@@@DBA@AA@\"],[\"@@CACIECAFBB@FJHDA@C\"],[\"@@@DFBDA@@A@BCAAA@E@@B\"],[\"@@EFFHHCBECCCEAF\"],[\"@@BB@AAAABB@\"],[\"@@@OTGBC@AI@CGEBGHA@GEACAEHG@E@EEC@ALCFIBGCMAGGEGCDAACKDEIC@EBCD@HGFE@MKGAADDDGFBFAD[HM@ICI@KCOGK@iLABDLCBY@aDcCWBKBEFM@KBGDAF@HDFAPBFJFVBZVPFH@PEP@DCJQHGJGLCDBNNFBFBFRDDFBFD@HFHNJNFP@HAFCFGBE@EBCLCF@VJFHFRHFP@BBBHLCFKAEDAAGGCCGBIDCDAB@RJFABE\"],[\"@@DBBDDAEEE@BB\"],[\"@@@BBB@AAA\"],[\"@@FED@FCDJTEJJPEH@D@DHB@FB@BABBDFCJHBCFMBAFFJBPJGRHTDBPDDDHTCLE`GJAJCZCDBnBFFBBLHDJBBDCROPKDCDDFDFFDLD@LCL@DJD^BBFFADADG@GHCF@FGB@BKB@BABKLCDDADB@DAFHHHHCBDB@FGJABDABBHDBLD@HEB@H@BFH@F@DBFJABCHANFBDDBDA@AFADB@BDDDADABFB@BLBDI@AFEBDDADHDCF@CGDBD@DDFFBFFJ@FAFIH@JELBHEFA@CACBOLGHA@CF@LHJBBCHHTE@AAEBGHIJEBCCcDILQDQA}OEUSMSGOK@MOOAEAqAG@A@ECCECOAKGCECM_ySOcSgwGMBSF_JU@WBOFSJGR@PCHCDEBOIYGSOMQCSB]H[N_JSBSCSG[Ys{UU[I­KiIUOSYIMAE@EBEYICCGBECE@EACCEAEDECA@EF@HEBA@@EEDCCG@EFCBEACDEAOBEAGGK@AICAOCE@KDA@ACHG@ASKAOEGGCAEAACBE@CE]MCEKECGMCAAEAIACDBB@BEBE@EBABFBBDFCFB@BG@@BG@@BBDGHI@IBBB@BEBCEG@CBCACFFHABEHARCHCBBHEBGH@DIBABDHGBKCEFGBEAE@C@CE@EG@EDG@CDBDEFBFDABDADCAC@ABBDEDEC_NADCCC@@FIACFBHGDAHKLJRLHAFCBDL@FCH@JADR@DABLBDABCCAG@@C@DB@BADGCGBDFDB@BEF@FNHFDDAFFDHAFC@AA@CA@GFAVFLJJZCVTFBBFALBHHJBJAHNP@DENHHNFBD@FIJFDTJHAFEBPDLAHKLIFAHBFDDH@HDR@VABD@JJJ@FIPB`CHDRADEFANADDLLEDB@BCD@FIBACCAIHAHGFG@AFBFC@AAGA@AC@GP@JCP@HFHDCVGF@DBBDHAD@BDHDPGBDIDEHBPFH@HDHDBF@FDBNFLHF@JJCBBBBCFBBVBHAR@PXHBDEAa@IDQDIHIDAFAJDJFRXHHbRZFJ@JCJK@C@OCGO[USIMCE@EDGDATAFVEVIVOJKHKBMPeNQ@TR^CDAFB@D@NCDHSFDLFEBFEBBDBDFBDAJFAXA@@LGFECEFAPDLDFD@HC@KDEHCHINGDGNG@CNAHEL@\"]],\"encodeOffsets\":[[[120103,23812]],[[120062,23775]],[[119679,23977]],[[120127,23839]],[[120128,23843]],[[120133,23844]],[[120118,23836]],[[119934,23877]],[[119912,23877]],[[119894,23893]],[[119945,23914]],[[119922,23949]],[[119958,23983]],[[119921,24047]],[[119919,24041]],[[119820,24026]],[[119726,24019]],[[119609,23809]],[[119957,24020]],[[119681,24011]],[[119959,23930]],[[119430,23992]]]},\"properties\":{\"cp\":[116.708463,23.37102],\"name\":\"汕头市\",\"childNum\":22}},{\"id\":\"440600\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@ADAABAA@@DBBDCAA\"],[\"@@MLCAUP[LMFONIAECG@EDEFKPENIxMapSNK@OEICKAk@]CQFMPQ`m^e^ICQACCCD@CDECAACC@CGABACABBFDBE@BDA@ECCDGA@DC@ABECADBFIGA@CECB@DA@CM@A@CCAACOCABADC@@BADGBAA@@IEAABAFAFG@KDA@E@G@KGAKDACMIaABCC@CCBAAGGEDEHAJE@G@CGCACDGAA@CAEA@CACBEA@CACCAAECCAA@AF@HCBA@CEIBKCA@IBCCCEC@CEACBECE@KCG@IICKCACECAACMCACECA@@CCACA@DQF@AEC@EA@GDEF@DCBA@GI@@@BAFA@EAACGECBAFCBADBDEFBBCD@HCAG@BEAECCAGEEABAFEHBBD@EBFBBABABBABE@ABFBDABB@BE@BFB@BDB@A@GAABE@@AFAI@@HBFFBACDA@CB@DDBAFA@DD@HD@HHFAJMEEHABDB@BC@@AC@FHBA@CBBDJFABF@DCLEBBJMHEEE@BDADA@@GCCB@@C@CA@ECICBEHCBC@CC@ACJBD@DA@ABBB@BAA@BCD@@CBADBBEI@KCAFEFABCBCAAEGEHCFGC@@IACC@CAFLGGCHAAADAAAFGD@CDADE@CBBD@BAAAAAD@AAGBECCJC@@RABQEADIBAKACCKA@QDAA@EAAGDEGAGCGEDAJCBCAABECE@@ACBQKA@CAIA@CLID@JE@CAECAACCAEDE@GGCM@EACDCCGA@ACCCE@EGC@ACIAACEDKCCCCAGEGFE@EHDBCDBBDFBLCF@FABDJADC@ADDDDAFDHCJH@BFADD@HBBFNA@CCCBCH@FAB@CC@CDABAFABBBGFCHC@@FKJEAEHGDE@ACKCEBACA@IJEBAAACI@EC@CEACCE@C@@AGC@AFCBECICCQD@FGD@BQGMB@CC@ACBEEC@EGIAAEI@IKGGMK@IDAAE@AHCDALG@@@AFBBCHBJ@HHDD@BDBBCFBFE@BFEFAFIBADBHKf@LDDCF@HBBADCH@DBDDFF@DEFBH@HFHBDFNBLFHBTJDHDBB@BADAHDLAHCH@JHLDJ@HF@DDNBDH@DDJBDLEFADBHBBD@FEHCTJB@FGAGDBDEB@BEF@DDAJDDBCJBBBB@@@H@B@BDDAHDHABDD@FJFEB@DLFCBFAFDB@HBBADGFADEAEFCNCAAD@DFBABCDDD@FDBHCNINEJ@FAHF@HHBHCDDBFDEB@DB@DNHBIHBDBXFAFNJBAJDF@JDPABHHAHBDDD@HDDFEDDFHBHI@C@BDDFAFFCFIFF@BDCJFABAFDD@@@@FGBELCBDDDA@ABG@FFCEFB@D@ABD@BAFCCDADD@DAABEBABDBDACDBDBABDAACBAGADAIA@@DAB@EEBABDBBDD@CDCAB@CEC@BD@@CGE@EFCHCD@FEBAAABDBCB@@DABDD@DAD@@FBD@GJJB@FAFBFAFBBEHCBA@CAAAGHKB@@CFABFDBFBB@D@FJB@LAHH@FFLAFJHDJAFK@BJCFCBDL@FLJFBDB@FD@H@BGFGDBDID@D@@FDBLNBH@@J@@FF@B@JBB@CBCA@BJ@@FDC@DBB@CBBDABCA@AACBC@@AAGBCFAF@FHJDPNVN\\\\JCL[AVBTMVGFEJGTCRAzALELebAFBTAHERBPKBEB@BDH@NJDFD@BEAABAJFDL@HBHCIK@AHK@IDAPHB@ABBFANDFAFFFDABGB@BCAEFGBEACCAAC@EAGT@HbVCL@XRFLDA@HCC@DA@AFFB@DG@ACCFQHGBMM@DFLPRJDRN@LFLJHJRJHHDJnTjDVOFWAG`knODaFOIBKAIHIACECKBM@KFCD@jFHAJNJBJ@^BDNJ@HALFLHRDBBFNBZJBDDD@HHRFFHCBBAP@RHZBXSPC@MDAVEFCPDPRCNFJATJJDDA@CJADBBGHCdY@DCDLJAHFDRKFIFCBCACEQe]IS@GLEDQNYFEFAJHF@HEFA@BFADABIGMFCDHFC@CECCABEBAJ@NEHGLEBCDEFAF@FDJLCJHFJ@BGAIGMCCA@EBGCEW@EDGF@JLDDH@DDFLLBDDDC@IKEAA@AHGHUBAD@BCDIFA@AFCEAE@CEE@ACGC@CDGBEGACCFA@EGAAA@CHCIGDCB@FEBE@OBCFAR@NEHDB@DC@EDMDAB@BFJDFFBFLJH@FADCBEQWIGCCGQLIB@@DNCBGEAACCW@GD@DCDICADCHGFCF@FE@SBAB@BGEAAGKM@CF@FDPAJBNGPBFBBF@RIPALGL@DDBVBHDDDLDTAHLAJE@@BNPDGT@HRLMNGJAHGBAAE@GFGRABABIBCRCFEFOF[E]ECDOAMNKN@JMROJQAI@GBKCGSGOOEG@SDEFCh@BCCcACK@A@FWBCDOHAFDBC@EEA@EACBAGE@AB@AC_@UKK@@ADCCGBEDIJEVGPKLKDA^CrDNFAECIHaBAFBBACGQFBKBAGGAMBEBAJADEMI@C@ICI@IDELINEFEBAAGB@DDFBHETGNOJQECIACECDGEDO@K@E@GBE@CMAAAAIDGFAh[@CEAFOIEBEA@@CHBBEDCBCBAJ@BaBGDCHCXEFCHGRDBGFB@BHB@DBBVDHCLBTKFGLEAEQOMECCEFOGGACBA@BMHSFGGGCGYIGCIGMGCGBIaGWCSFM@EAGEMQIACDEFMVKHKBGCEEGYS_IKOOIA@I@EKMBIBCKAKAMHEBILAAFE@CCDAACB@ECCE@@AEBCE\"]],\"encodeOffsets\":[[[115497,23554]],[[115878,23218]]]},\"properties\":{\"cp\":[113.122717,23.028762],\"name\":\"佛山市\",\"childNum\":2}},{\"id\":\"440700\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@EBOHCFADDFNNBFCDC@IIGCE@CDAFBZHNBF@DCBEEIGGAQCIHAHBHPbRVJRHDX@JBFFLT@FAFQNQHM@CBACGSCCMCKAEBGJCBQAGBOL@D@BBDFDFD@F@DEDABAFBDHJRNBJDDTLNDrNNCF@PL@DADGDAFAJFTFNBBDBFC@KDELCFBDBDNFDDBTCNFPJHBT@RIJ@JDZ@BA@CCGAAHOEMEAOOIAIBGG_AE@MOKSAMOQIYAI@IFGJCBMBGFEFGBCACCEICIMCACCGSEU@IBEJGBIBALADCDCBK@ECEOKYIWMOE\"],[\"@@AB@DBBBCAC\"],[\"@@ADBBDCCA\"],[\"@@@DBAAA\"],[\"@@CB@DFBBCCC\"],[\"@@ADBBBAAC\"],[\"@@@BBBB@@ACA\"],[\"@@ABBDBAAC\"],[\"@@A@@DFB@CCA\"],[\"@@IBEACD@FDDHBDC@EFCAA\"],[\"@@C@@FEBOEG@@D@H@DCBEAADJJDBNDNFhGHCBC@CCCKGEGCASA\"],[\"@@CB@DJB@AEE\"],[\"@@MBAB@DLJZNDBHA@KGGYK\"],[\"@@DDDJAFED@BHD@BD@F@DDFB@DFDJ@BDH@JIB@BDFALDBDD@JCFGFBLI@ED@DGHEAABABEBABCD@B@@DBA@EFIHDEMAA@GCCEB@AIGGDECCBCCBCD@BCCIBA@EDEAKCEAADCCAFGF@HEHFDBDDLDFCBDJBBDD@FHF@DDBDB@DHCDBD@FDNHHF@FCDBBDDBBF@DIFC@KJ@DJBDBB@RLDA@BF@FDBADBDABIFCDHBHFHHCBB@FBBRCB@DLBDBLJABCRFBA@QD@DIFDHABBC@BBBBABC@AA@DCFCB@DHCBEBBBCBBDGHHEKDBD@BD@JD@EHGDHFBFDBDABAFEBELDJ@AFCAAB@DC@ADB@ABA@AA@BCBC@IABDD@@DADGDAFJDFDB@@D@DA@DD@HB@BCACF@FFNGAIFADK@CAEEBCIAA@DABEGD@@BD@@ACABAFGNFBIGE@GGCC@@CEBABCCA@@DCBBDEAAE@GJ@EB@BF@BAHBB@A@ACA@AEF@@AAACBEABAF@BAAAABABEAFAC@AAFGBEBAFFBHDDBFAFH@DB@GDCAAFEACBCDABEDAHFBDFBB@BE@A@@HJB@DA@CFEHCB@@FFD@BRE@CDBDB@DB@FDBDNDBDDBDFDBDLJJH@LDF@FDDAFB@DFDDDAD@JDBALFJ@DABGDE@@BBBDDBFDBBD@DFBDADBB@BF@DBBCHBDHD@D@HIFGBCFHFBHABDDD@ADbBNJBDLCHB@L@H@FCB@LEHEBABBBJF@@BBHABC@AD@BCBAPDBDDB@D@BDNB@@CDAPNAEBCFDBAD@@CHBDCFDB@ACF@CAAEBABDBADHD@BDDBCF@DDCDDRBJDf]n]VeJIRE^Dl@LBJDPFL@TMboNJwFMRUFCF@HDJBPMNE\\\\KVODBJGNOE@ACC@BCD@FKHB@MAAM@EKEY@eLGFOVWR_HkC[JGTUPKLKT_LOR[FYFKLOJQ@E@wLeYNYMC@KHQAADCDEBCAAKAAAGIGYEIbIJI@CES@CC@SF@@ICAJG\\\\QJSJCAKEAAE@EFCEW@QEyOUAG@WGWCSCOIKIGuSEAQQILSKHIQSGMI©GQSWwSUEICK@SDWRaRUFKBQCsIkSk¡ÅcYgUOG]Ee@UDOFIH]fUbkQH[DeAICECs{uaaKOU_cqIGOCsI]ABoFMDIJurgTmLaDICMUW±EGEE³iYEaBGEICMH@BIRDBHA@DCF@DDFALDFCDGTLA@BEFBDFDF@DD@FDBNBCFBDFB@FLDBDCFEFBBBD@HCHADDDAFAJFHHBDALLBDFBGNHLZTEDFFIBEFAHDDHBJDDDEDHFLFCDQJCFKBEBIFDND@BDBHCJFDCF@DFBCFE@ABDHDFBDABCJC@AECDA@@VFDCDA@CH@D@BBDAHEFCHCDAHIFEB@DCD@BCFBFCDSJCDEBCAADCBAAECI@IAKBGAAFA@C@@FA@BFB@BFCBAAED@FC@CFCAE@GFABCBABA@CAC@EBC@C@EHEBIAEDBBCD@BHDDABB@DCBE@CBCGC@CNBB@B@HABAH@BBBED@FBFB@JEDFHJBBBDBD@DCBCAE@CBABBFHDAFG@ACA@CDKDQEE@CAWDC@IN@FEDGNK@IFKPMIG@CHC@ICCB@DQ@@TAJADE@OPMJANBFYBCBC@ICBGIDIEE@AKUBHGJGFADFBDDL@NJ@DHFBHDFELCBAB@HADGDABCFADBBAJDFFD@DAJBBRLDDAZADEBCDE@IF@DAD@BBJDB@BCJOHKACFAJCBC@IBEFG@CPDDBFHLDBLCDFD@PEH@HCBBHDB@HFDDJNLHJRHNEHGFLTBF@DEDAHHJHTD@BFDDHNJBL@FCHDFCHA@CD@NPJBBIAE@GBGAEB@BAFBHZFBFCBCASZDBFDF@JBD@BIDCHHJJJBF@HNJH@BJNG@GDGBGD@BBFAHEBAFA@FERBBFBBB@FDD@J@DKBBJ@BFADBHBBFCFDBDEJ@FEHAPFPLHBNCNDALITED@NFFHRFBBHBBBHDHD@BHBB@FBBBFLV@BIJDNCNBFFBFAHBTPNAHHHCD@NDFHFR@NADCBALAB@BD@DBED@DDFFHGBADDD@HDB@HDDL@NCLAHC@GCGKKJGLEDCDBDHD@NA@AHBJCBCB@@DFBDBE@GJEDUBCB@DDFA@ADRCBARCDAJ@@IHA@AE@@ACADCDBB@FFF@CDABCBCF@BF@AFJR@DADDB@BDBCDA@@HAB@BB@FHCFDDB@BAD@DBDADBBDDBDHBB@FCD@BDB@HDDADBDNAD@CJDDBBADC@IFBJHHLHFFFB@LEDABFJDBDDJEHHBBBEJCEGE@ACLCHOBAD@DE@CCE@ECA@C@ADGIC@C@A@CHA@CC@HI@CBAAE@AJAJEH@DGJKBMD@BDB@BAF@BBFADHJFJEBABFB@ADBBHBF@DDFBH@DDJFNB@DD@BBCJBDCLBBEDAHID@DDABBCFGDABEHFF@FFFCDCNCBAAAHC@@AAD@BDDAFKFGFADBHDBAHB@AH@@E@GNG@BDEDCH\"],[\"@@CBGDCD@H@DBDLBBBBBIL@FDLL^PTDBDABGBAD@TJVP@JADOHCDAHDHLDLHNAHFJBBBDL@DEFDHDD`R^FDABCFAFLDD`NF@FKFABBBHHBBEFIAEHOIWAAKAIG[IAAAIDYBCRM`GBAGOECEAgDEAAC@CDCACSOAECKG@IHCBGCAGC@C@IDCLC@W@KJGBE@MK]KCCAE@CBC`GDC@CAAGCG@GCC@C@GJC@E@CACIEC\"],[\"@@@AA@ADDA\"],[\"@@EICAAB@NGL@HIJEBAB@FLHDDJBHFVDFDN@BAN[CSGGQGIHEACACC@E\"],[\"@@BBBAC@\"],[\"@@BA@@A@@B\"],[\"@@AAADDB@C\"],[\"@@BE@EEDBD@DB@\"],[\"@@B@@AAB\"],[\"@@@B@@DCCA@D\"],[\"@@D@CECDDB\"],[\"@@D@@ECB@D\"],[\"@@DBBACAAB\"],[\"@@ADD@@AAA\"],[\"@@EDBHAFBBF@JLD@@KF@@CAABGCAG@IC\"],[\"@@@DBCA@\"],[\"@@@BB@@AA@\"],[\"@@AHBDBBHG@AEIABAD\"],[\"@@EB@DDBD@BCCC\"],[\"@@ADDFHC@AIC\"],[\"@@ABDDBAACA@\"],[\"@@IHBFBJD@BADADFJ@LG@ACAIDC@CE@IAAE@\"],[\"@@BBDEE@@D\"],[\"@@@BFBACC@\"],[\"@@C@CFE@CB@FDFAHB@FAJBP@FAFC@CEGEAEEKA\"],[\"@@DDHBDJHAFF@J@BH@FFBFCFBDD@HEFB@CEI@CJ@B@AGCEFE@EMGACDEAGEGCAU@GJIDAFDDCBAD\"],[\"@@BBBAAAAB\"],[\"@@BAC@BB\"]],\"encodeOffsets\":[[[115482,22082]],[[115465,22266]],[[115469,22264]],[[115563,22261]],[[115283,22200]],[[115462,22200]],[[115460,22198]],[[115382,22148]],[[115584,22135]],[[115379,22130]],[[115593,22113]],[[115446,22117]],[[115509,22082]],[[115177,23249]],[[115232,22102]],[[115749,22356]],[[115739,22373]],[[115741,22297]],[[115742,22296]],[[115745,22293]],[[115740,22321]],[[115522,22227]],[[115533,22192]],[[115531,22185]],[[115531,22181]],[[115369,22236]],[[115381,22223]],[[115385,22219]],[[115385,22148]],[[115385,22150]],[[115384,22155]],[[115381,22164]],[[115344,22110]],[[115349,22109]],[[115361,22114]],[[115286,22130]],[[115279,22107]],[[115291,22105]],[[115134,22184]],[[115060,21975]],[[115057,21983]]]},\"properties\":{\"cp\":[113.094942,22.590431],\"name\":\"江门市\",\"childNum\":41}},{\"id\":\"440800\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@BA@DDC@BBAA@D@@B@AD@A@BCACKEC@CA@DABC@BECHACDCCDACBCC@BDCAAFCBDC@@@IAD@FABA@C@DEB@@A@CCHG@@AHEABAADA@DDCA@@AABCA@@BA@AABAABACADA@ABB@AAABAEFADABAA@ABBBACABEHA@@C@CABCDB@AE@AADAC@CHA@AA@DACC@BAB@AAEDACDACBBCCBA@DEB@BBBCAABABBBDEFDAB@ABB@BABF@CB@FAD@C@BA@ABA@@A@AADA@AGDCABAB@@B@@@AB@BA@CAFCCAABFABE@BGAFC@DGCFCADEED@CCHC@BACBBB@DC@BJCBA@EF@BB@BB@FA@@AABCF@BCFKFAAD@ECKHBDJJCDBBNDFF@BTDADHFDCV@BEDABEDCD@@ABA@FD@BA@DD@B@AADA@@@AD@@BBCFAA@D@\"],[\"@@DK@KAMEOIIGKYyGKKIUCYA[BWFOJGNInAPHLVRPPbpJHPBPAYJG\"],[\"@@BDflFJPtDBD@DGDM@KAIUWYeIIGAEBCD\"],[\"@@FMAA@AAACBA@AACFAACDDDLH\"],[\"@@L@LAfONGJIDG@GmÅCYA[DoAQCKGGKEOAKBKFILGXCZELOTWdKHKDS@cGIBQHKBM@_IO@iDO@OEiWeS]ImK}EQEeQMCKDEJANBNFVHXLPbPXTZ\\\\TPRFJJPhVfXbTDZCLSP@TB\\\\HdTPDPBN@PELEHIPiFGHCL@VDJDT@T@PPJFLDjF\"],[\"@@KUk»CEEEEA{IIBEBEFKXJP@FAFCDOEEDQpEFKD[GOFULMDGDEHEH@FCF]BEDEZHDP@DDPAJBPN@NDFRBNCHFRRHBFAHEb_FEZHPDVJv@FC@EFCPBNDTTJDXBDBDABIG]_[KU\"],[\"@@LAH@@CDAAAABBCCADAAEFBBCF@DAFFFAAAD@FGDAFAFDBHENDBBDGHBFDBBFFBBF@@ACD@FLHA@LHFDCDHLAH@@EBCDACM@EBAF@@AFAB@CDBBF@DDFCFDDFJDBCACF@BGDAFBBEJEFKCAACLGDDLBFEBBBBH@DCAFHCFB@J@D@DAFDFEABHBBFCBDD@AABABDB@AADADD@BDD@MACBEACLDDIHBABCABDCFDBADBBB@@E@BBBLCHEIADCDBFADBDCBJFABDCDBBGHABACAB@DDFEJEB@C@@EDA@ABBDAJDD@@J@^MJBPLDCCEFABDD@BICC@CC@AMCA@AJB@BDBTBPCFH@FMB@BGB@FKF@AA@@DB@BDA@ENFBHAJGDBDBCDBBAFPFCBBFCAABAD@DID@DHDABEAA@@LFH@HEHDNBDLD@FDBBDAF@BXHABBNGH@DD@@BABAAAAABDDIFA@AFCDDB@FDBABDBG@@BD@CDPJFLFDJCBF@@BADBFL@D@FDAABJAJBDGJGBCJAABB@DADCCCFABBDEDDFABBABF@CC@ACCD@HJAGCA@OCECM@CDAACF@AAC@@CDBACB@IKBCACDAACB@BEAABCCA@EB@HFDAZDBABED@BEAQJEHIGCBGAAGCCAD@BKBBDA@ACABAF@BDF@BE@AF@FCPMFC@CBABDABABH@CGJIGGDA@CFEFA@AEAAAFC@CMGD@@CABAACBGCEEJADA@EBEB@DDABEHDBDFDDD@BA@EFCBDCD@BDAFJFHDBBAD@@ACCDIH@BBDECGD@@EEGBEFAAA@ECAEGCAFCDCFBBADAFFB@HGFCFEFBAKA@@GCABD@DC@AE@ACEIEEBCABEF@HGJADCCCBGHBBC@CFABFDBDJDA@@@B@@@DD@ADBD@CJD@FBEHFHCF@CHHHFEPGTDJLDBACCC@ABADCCCBCBCD@DLABCAAB@B@FBDFB@@CG@CDABDBAAQFABC@CBEACBIJAL[uekWkMgCD©JWCaOuiyq{]Y@b@HAPA\\\\EPCXMDK@EBAC@AA@@CCCADA@ACEDAA@CACCCC@@EIGBGGCI@ACA@ED@BADAAMHBDCBBBCFCGA@CDDBKFAACD@BGFMDAC]R@B@FCCCB@BICMHAACFAEKDNFBHCB@BD@@LDBBAD@DDDDDHGB@@D@@BB@BDB@DDAE@@HHBA@AB@@ED@@ADABBD@B@@@DBEDDBEBB@@FBBF@BBD@FADD@BCBD@BBC@CJFHFBDLD@BFCB@BFDKLC@EFDDABC@FBADIAAECACDCCABEBADC@CDAFCDBFCBBDCD@LCFDFAD@NEJCDCEGAAHGFDBGAED@B@DC@CD@FBBA@@LC@C@AFMDBFCDC@CCEB@ABA@BB@JEACCDBAACE@@BEFC@C@DDAD@DDBF@BDBJE@@AEB@DA@AFD@BDCB@BF@DEADF@BB@DDDADDBADB@HCBDBAACB@B@@DB@BADBBABDDAJDBFFCDDCB@AAACB@DCCBFOL@FBADBAB\"],[\"@@@TFT@T@JINIHILERD`erBLCH@H@BFFCFCBABDDBDGNC@CDDJCBD@ABGFFLB@@FEDAF@DD@BLHDFFAJDDHN@DADJJHP@FBFCBBFFF@DDBF@HEDIBMFIDMCIBGLABAD@DE@EBABDBA@CFABBJ@@HAFFPDDFA@EHAAAFAPDDEBDH@FEFBBDFA@@BNDAFDF@BDAFJ@BEJAJDHLDFFCCEHADB@@@CFEBBFD@DDCD@BAF@D@DBBBDBBD@DBBB@BDDABDBABDABBB@DBDDABDEB@FC@AAABC@DHJ@AHDDADIDC@@CABAHBJHJ@BD@BFDB@DPAFB@FAD@JADBBAFBDCBBHFFFFNABBDA@@ABDBBABDCBBDCDGB@FBBADA@@FC@ABBB@BB@DBBHDFCBACCD@DJDDFAFAD@HBBADBF@HEFDDEDBDADHH@DABFDIF@FLHAFFD@DFBALHRHFEDGAABAFDBJDPLPHBFLFB@F@FFBFF@DDBFAFLBFCHHNE@GN@BA@AFBBAAA@AFBBABCFBFAFDJCF@HGD@@CFCDCDEF@BB@DDABDDAD@B@BDHC@BB@BEBBADHDHA@DDBDA@B@F@BJ@BDABBFDD@BDHBFF@@BDB@CDECGJECCBCN@AH@HABBFJJD@BHF@@HFFAHPBDCF@BACCAEFCD@DE@CDC@GFA@B@FBBBHFDHJDADBLEDBDAHFDADBFA@FJ@DBDCBGB@HFJ@DCBFEADFHACABAFB@GDBFAHAAKDAB@DCBBBCHCD@BB@AFBBABBBCFCRBFBD@PB@ABBFA@DDB@FFDNLFBBCD@BCJ@DBDJADBDD@@DCBDD@DFFCLD@@DLGHGXGTYDAFBDCJCDCD@HBH@HDHGD@DFLAFDDCHBH@BDDAFDPGDIBAA@CEBB@CD@C@FADEA@@DE@@CDBAA@CABC@FABBB@BGBA@C@ABBBC@FB@AGBEGIAACBIIADMAAC@CABA@BCC@FL@HC@AAC@@AC@@C@HAB@D@@DC@BEDAFCDIEBJGBAGGBCEA@BA@CDGACCGD@ACA@BEAAE@@CC@@GABAACCDAC@AIAABAACAIBSAG@EFCFGBBDPLFBDBBDBHED@ACAA@@F@@EKAA@CDC@AAEFACAKHAF@F@DABCBAHBDDF@CHDFL@BA@CCKJABDDCB@FCCA@CFBAEBCCCCBEEA@EAADECAADACCBCABAABAACC@DACCB@@AEAD@FAAAAB@AA@A@BAD@FIA@CAADBBAB@A@ACBDCCA@@B@H@ACDBB@KGCFBEC@AC@ABCAG@CDAAA@GBIBA@CCGBCBGACE@CACGCB@FCA@CCABCDCC@BBEBE@DECD@EDA@AF@@ADAECAEDEBDADD@BBADB@BGC@@CDADB@AHCHM@EAAFAGA@ADBBADD@CB@DD@EDAACHA@CHABB@FDB@BBBF@B@DGAA@CDAD@DHAFD@AJDB@DDBADFEDADDACF@EEHEBKIC@DGCE@AACB@AABCACEIBEAEC@EDECAFEF@BADBBACCGA@GJ@@AB@ADFDDCFADEBDHAFFB@@E@CKC@EB@CEEBIH@BCBAAEFCA@ANC@CFBBCDIAAEAAFE@AB@DADG@DEB@FEBED@CCFBBA@AEAAB@CDBFAJFADG@@BD@@DDBHC@CAAACFAEEDC@KBAAA@C@@BDDFDC@BDAAA@EAC@C@CDA@AKEBCDABG@@@CC@AAFGHADAG@JADH@BBBAHB@EB@DDBBE@DB@@CBFF@DBDEF@FEDB@@DOH@@GE@BC@A@DCAAB@CCBC@@AC@@DCCE@BGC@DABBBACA@BC@ABA@BCDAB@FECBCABCAABCC@CFC@AAC@AAFADDFCAAABA@@C@AAAHCC@BCBB@ACABADBFCEFFACDDA@B@EB@B@DCD@BFD@@CJBBCD@@ADCB@AB@DFBACA@BA@CDDABFA@@BDBABBDAB@B@@AD@AC@EB@BD@@@CB@AHDCAEBABBB@BDBADJBBDABDB@@AB@DEABA@BCECFB@AEAJB@AACDBBDF@EAACDB@ACCDEAC@ADBCA@EEA@AAA@AAGFDBAACCCDADE@GBBBCBB@AF@BBDC@FD@DCADHBHKC@H@BABEDAACACBDD@@GDA@DDCGCAGC@@ADCE@AC@CD@AC@@@ADC@BDGE@IDCCAFACADE@ADCADEC@@CHGAABACABCCC@CAAE@BCCFE@@ADAACC@BEB@@CC@@@BA@CAAA@FOCCD@D@FE@AF@BDABDCBDIFA@@AAB@BFADDD@DCAENCBED@D@@KB@AA@EDCD@@C@AFCHBCAHEBGHBDFDCFI@MBCCEDE@KDCACDAAEDCBEDCD@BCFABADDDCDBBFJBBCEAD@BACCFED@LKEC@ADAAEC@CKEAEGDID@AAC@DA@ACCEBC@AAE@AA@EA@FACAFCCA@@A@C@AACB@BC@@FA@@BABGG@@BFCCA@ACA@@AC@@@HACGCCCCC@ABCA@KC@@ADAAGMELCBFDEBBNGJD@ADADD@E@A^QBDNCHE@ADCBBLECADCB@DHDEAADAACNGBBBC@AFCB@BDJ@HDAHJH@FD@DDBD@DBBFCBDB@BCDD@DB@@BBDFAL@NCDWFOB[BO@G@aQMGEKCÁGyMI@KDcTIBI@IAUQO@SIEI@IEGMEU@IDOLE@CEYGSIKKIGAE@MLIDC@ECSWCKUO]IWBUC]KOOAGAEG@WUQQOQKKCK@MDMCIKIOCGJYlBZCDE@CAEGISCUDQHWEKokAMA]Gi@WDkN]dqPORAR@L@PGbWXGTLLDNB~@L@|QxaLEHEVFg@CU[hWJAtBbPPBJO`FSHaFsF_pµpHQBQA[ImGMq_s}Oaa[UKWCQ@_HIAOGw{SIWEcC[@GEAKECE@GLGHOFWDgCe@GAOQa[oQmCSBeDEDKPuzKD§EEIACCeoeWWGQAOFOJEJAN@LP@dCbYnSPk^KNIPARBNHTLDLBTJTdFhC^ITGH¡^_ZObGZATDt@PUvS^KHSFM@kIEBCFW¬Ee²ey²OtC`BtFLT¶M@RP^¢LRBT@vIÖGLBLPRLH`BlCz@tHNF`lLR^BJ@JCD»BqDX\"],[\"@@HF\\\\JNBHADCFIDGCICCE@wHEF@BDD\"],[\"@@PHH@X@FABEAICEEGAAIDIAQBEDAFAFFF\"],[\"@@IV@FHFH@CNHLHFNBF@POFIH[@IAEKEGBAFAFCFCAAAAIOAMD\"],[\"@@CB@BA@@CC@EN@TDBCHF@ADBBDAD@DA@@BCDAACDAAE@BAAB@BCCA@CCADKCAAB@A@A\"]],\"encodeOffsets\":[[[113086,22469]],[[113301,21439]],[[113210,20816]],[[113372,22044]],[[113171,21585]],[[113265,21675]],[[113161,22007]],[[112421,21972]],[[113045,21611]],[[113071,21668]],[[113056,21175]],[[113036,22282]]]},\"properties\":{\"cp\":[110.364977,21.274898],\"name\":\"湛江市\",\"childNum\":12}},{\"id\":\"440900\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@BACAAB@EPKAEDD@CDABB@BDAAAGBCEA@ECCBACABCAABA@ACA@BDABACGDGH@DD@CFDBBCF@BCBDBEDDJCD@AH@ACD@B@@BDC@@DBDF@\"],[\"@@CLB@BB@DAB@@JA@BF@AIACE@CA@C\"],[\"@@GH@NHBHJF@DDBBBBBAEE@CBICECBA@EGAEAA\"],[\"@@BACA@CB@@BLE@EHA@ANA@EEGODMAIA@AIA@BDBBND@@DDDAJC@ACEBBFDBDEBBB@DABB@BBB\"],[\"@@@BDAAAA@@B\"],[\"@@BDDBJDBA@CC@CCECACAB@F\"],[\"@@@BFCBBCECB@D\"],[\"@@OKIA]NI@CCBIACBAB@FC@@@DFAFICE@CBABDBAHGAADCACEBAICDCAEBCACDJBGFKDAA@A@FA@AABCCADEACDBBAGACJKCBDAFBD@NCC@ACCCBBBA@ACABBBC@ACEDAAAGFBCEBE@C@C@IEAGDBECFGAAA@AGFKACCIFAB@BFDELIFAFEACBAHE@BDADICCEECEDCCE@BEGB@BE@AB@FDNCBAD@FG@KBCGCDGE@KGBEKC@BD@@AEEAAECAAEHGACCAFMAGECA@IFCFC@BBEBEECBE@ADEABFCBDBADBABBCB@DO@GD@DD@BHHDCD@CCB@HC@ACBDBDCBAFABG@D@GLGABCCDC@@ECDAAE@@BAAADAA@HCFCBDDBDABECBH@BBB@BFB@FDBCA@BBDCFDD@BCABDFBE@ACCABD@BIAFB@BEAFDADB@BACFA@@BA@ACCBAACIABACA@AAABBFCDBGA@@D@@ACA@@FBDC@@BA@A@CBAAABAC@@EBBACC@DABB@BDEA@CBAA@CD@BC@ADIA@DC@AEC@CDA@A@@F@ACBDCEBFEEDCAABDB@BAAADD@GDBB@B@DB@BABBEDCCEBBBD@BBD@DED@ADBBADDBDAEFA@CBADB@BAD@@ADBABAACBD@AHF@DD@CD@@BD@DA@DBADB@C@BADF@@HG@CP@@CAEFE@CFCAE@AE@DA@@CAFCA@CFAA@BGAA@ACGIBH@CBGBEHBBD@@D@@AHCBADLF@BCB@D@DBD@FBBCB@ACDCEAC@@@DBBAB@LCDFFEBBDBB@DGDCA@CC@@AH@BCIEEBCA@DBAFB@BABEADDC@AFEFA@CFH@BC@CBAF@BEFBBBCJADEA@DMD@BDBFEBBDA@AJGFADFA@@FLD@D@FA@EEGBACCFEBCDECBCA@@BI@@HHBDDABCAABE@EFDBCF@FFDFBJADFDBBA@BDABBF@HD@CJDALGFFFE@BDCCCBEFBCCA@CCABIC@BECGC@CB@DBBCHA@E@AA@ACA@EAAEBAB@BGBBDCB@FCCA@@DCCABCA@BHBEBBD@FGLGD@BCACB@DD@AHA@BCAAC@BCACCFBFFDCB@BE@@BCB@FDCAD@DJCAAD@CDADDB@DDB@EDADHDBF@BDAHADDH@DABAJ@HBBCB@DBHAD@BBDD@AFDELF@BHFDGD@@DB@@ABABB@BBADBCLDB@DDBADA@BB@ABHC@BDCBAD@@CBC@EDHFF@BBADBFEA@DD@@BKHACIBDL@DABK@CEDGE@CCGAABADCBE@E@GBBLBDFEBBD@DCB@LB@FE@@@BBBDC@GFCAAAACKECOAAEHED@FBHATBJBB@BABBBBJD@CBDDBBBA@HD@@DF@BBAFB@BDC@DHBDCH@DABB@DFHABHD@DAAIJFDCBEFC@ACD@@@CBA@G@DD@@BD@BBD@@GEKD@ADB@BA@DBDNBBCJJDABBHJAFBHA@@EADAA@B@DABAHA@AAEBD@BA@DBBCA@DF@@CB@CFEBD@C@@DAADFB@ABCJCBDBFFADDH@DEB@DD@BBF@DAABD@DG@DFCCFDBDECHB@B@BEAFBBD@BAAEBBDDBE@DABA@@B@@@AA@ABDBHC@BCBBBB@@@AB@BABD@C@EBA@@DAEABA@BAA@CBFEACAAABBBADAAA@CFB@DAADDACBBDFCBBA@ABD@BD@CBBB@DGD@CBBBF@@BCAADDBD@@@GBAFDBABAA@BBBBABCFEABBB@BAA@BCBDBABBBBA@BAB@@DBBA@BB@CD@CCBBBBAGF@BH@DG@D@BA@CFD@B@BA@EBC@J@@CDDABEDBACD@AB@DBBDCCDBBBBBGAFD@BA@CDBD@LFBDADB@C@@B@AC@B@AB@ACDAC@BC@B@EBAD@AC@@B@@CBBBA@C@@CABC@@EAB@BC@CDAFCBAFU@CDGEBCGACBCB@DEJMHAFCA@HCAADEBG@ADG@GDE@CDHPDD@LBB@BCBBHEJ@HJ@FCFD@B@BABGDGA@BDHCDEHADCFAFADBHEFDHFBBF@PENDBF@CHDB@FID@@DFD@HB@PADE@AFEBANDBDBDAFEFFH@@DEBABJF@BAHEBD`INO@IFCFC@ELGCCBCFDFIBED@JAJ@FFBDFF@BDDFCNFHF@@IDAB@AJBFJTF@NSBE@G@ALADEHCJMDAH@XLCRJBBF@FDB@@JCLHDJBJEHFJDBDADDFCTANEPK@IBAFAFDFCBCACDEFKPIb]JGAEIADGHCV@FCD@JDLHLBPJBDAPFHHF@HDDTP@FFFHDBDFBBBNGREPIP@ZCBEGECEAUFIJEL@HDJ@LGFIZHHJNDAHFFFBPCFDBHBBHBFAD@ETALED@HEFCHEFO@ABEFCLEJAJBJBFHH@DDFTLLAZFJDNR@DGHBJHFNFHAJDBD@FJLDLHFD@DC@CLCLOP@NGFED@LDL@^HJLAJEFYB@XOZCBEHCBGBIFANDNKXCLABYJECCIE@CDAFCBIHCJ@HBHFDAP@FEFCHAHLNDJAlEHGHYDAD@NMNERFHDBLAJENOPGPAJ@`FLR@FOZDJAJBDFDBDBPHJHBNADBQ`@FHN@FADMHCFBDXFFLCTCJ@DDDJCD@FJNCHMVMFUFGND@PBHJJHDTFPHNBTEH@NJHCFBTGJ@JBVRA@DNGP@FBHD@`EDBH@JAFCHAT@LDFBHDJLFN@HELBBN@JDLFP@FABGNID@BHHFNF@BBHLBHFD@FBFBFIHCFBBDBBVBJAJJBLAJDDB@H@DAJDFHFNJJBHDDD@@JL@RBBBAFDHDDF@DAF@F@BCFBBEAADA@CLGFGHCAEBI@GQODG@CDCBMFG@GNIDI@GAC@EPAHELARUHGVCDDF@FDDADFB@HGB@DEFA@IHCHADADE@IF@DAL@RCJFFCB@D@BFFF`HTAHADCH@B@@CDADADCH@FCBGBCECDGLE@AHCHETG@GACECUACBMCMBEAEQ@GACCCCMGCACGC@GGMAAAGBIDCBCBABABBDBBJHDDEBCBBFH@HDDVBDBHHNCDJFDBAN@LLDBB@BEFAFKB@BEFEBBBBFCFBFFZJFCBCF@DCBALHH@FBHAFFDABAD@LCBC@ICC@ECQIMCAAEBAFEB@BCCABABA@KDGAC@EDCAADGJCFBDCAAAIAA@GEC@CBCFCBED@DABDLADDDAHBAFFFJRVAJDB@BCN@HRDD@DFDBDADGBALCBBJABDJDDED@DABE@AJJHD@B@BHFBBHJDD@HG@AFABADABAH@FEB@DENGDC@CDCLALHDHD@@FHFDHHDBBCF@LBN@@ABNHTDAHA@TTBDABBBLDNJH@PHD@DCJBHABAFCBGAIAC@CDBFDHECA@ABCAA@EDCEEL@@ACUGAAADEFMFDADDFDND@JEACFEHCDBBCF@DBBEB@DBD@JBBDHAH@DBHBDCBCFCBAAIDC@CAEDEAEDE@GDEAKEG@EIIGC@EGCEEAG@@AACCGCAEA@EEAAGGCCCECEGGIG@GMEEEGGAEEBADC@G@AEA@ACGM@CBGGGEAGAGDI@SHIAIG@AIAIGIFI@AAGEICCGQFCJE@GOAKAEUOKCCKCAE@AAEFG@GA@CKBGEDGGIGSAAE@EABCFAD@DCDCB@@CA@GG@EBA@CCCAQA@@CDBBA@CAE@AICEBABK@ABSFECMAIEAEAA@C@AGA@CGCA@ABA@@CCAEEGCGAIB@GCCC@AABAACAAA@ADG@CAACABCEI@IGGK@ACKKE@CEIJQ@CEC@CBAJEBEGCAEB@@CEEEAGBA@ACKA@CE@EGDOHCDM@EEIBECA@CJMHC@E@CBA@CAC@AEC@AGDBECCQEBE@IDABAIGIA@AIQ@CJABCAAEBE@IBE@DIACAA@CCCEAACDKA@GIMA@CECDAAA@AAGHG@C@EHG@ADCRCBCFCGIBIBGACIEACICAACAGACICC@MBGFI@CEAAE@CDABG@CEA@SBGHCDQB@FCGMEI@IDABACGDKDABBDCAADCJALEBCACHALHDBBAFGFEAGPMFA@CJEDBN@JFRABEBGDABMD@JCLBR@LCBBNB@EA@BGPADABAHCBGBECCFCBQCEFGCC@GFGEGGAAEICC@AAIBA@@E@EIEAGAA@AAACCAEC@ACACGAACA@IEC@DA@CFEFAFGBCBE@@DCCGECACBECGBECE@CJ@DC@EBCFBJCLDFCDIDBFABFHEJ@HEL@BGFGBG@IDCDMKIAMIG@CDEBCMI@CCCAYCAE@AA@IAE@I@CDADECG@CFIJ@DG@ECCIEECAE@EDEJGAA@KEAAIBEDCD@HDBDADH@@ECAAGBALBHHLADGXBK@EMSQA¡Y[K{aWMKECKCUOCAI@C@_]IEU@MGE@C@AFBP@XO`@BFBnQF@FFBJAPPZJFBB@D@FIFODIKISKyCSEuMqB]C_GE@IDE@cCWA_EuUioWK\\\\IBAJBDAF@DADEBBRABACCB@DDH@@EAAC@E@ABADBBACKC@ADADDDCDAB@BDDBDCAIKSCOHEFGGDGE@GDGEAF@EIC@DACBCC@@C@@@A@@CBCICAAEEB@DADGAAHDDCDIBGHE@AFDBFAJFDF@BBFD@@CACDB@HB@BLEAEFEDGHA@EECBABEACDEDDBFHDB@FBDE@AFFH@FC@DF@DCDAAG@CJDD@BEBIIEICB@ADCACED@FCDEECEA@BGBABACCA@AF@FCBIBFFHDDABBBA@DC@NH@DEDBBFB@BEBEF@DCBHHIJDHG@BABAACAB@DEDONEDE@@BAFE@ACE@ABDB@BCBAAALC@DBHDBBAHHDGJIFBRAFC@AFABYCCBGEAB@DDBADBB@DABA@BDCBBDADJLA@BDCA@DD@BBE@BDCB@DDNDF@PDBBHGIA@A@DD@BDDE@BAAAEBCCCFAAEBDDCDCBA@BAIBADIHCHIAEBC@BACB@E@CEKCAAB@@AEIDECEKOIDCC@@AH@CABACA@ECADCBEB@JECCBABBBBBA@AC@@CHGAMBAWG@ABEACCA@EKCACCMFG@GEG@KB@FBBAGC@CJC@CBCBADBAEDAOEBEAABC@AEAIHGBEAOK\"],[\"@@CC@QBEGEEABDG@A@@@DBCDDA@B@BBAAABABADBCHABC@ABB@B@@BBABBGBA@FB@BA@DDCBD@BDABBBBAADDDCBBBFDBCFBBAAABCE@DG\"]],\"encodeOffsets\":[[[113161,22007]],[[113136,21962]],[[113854,21884]],[[113375,22037]],[[114058,21964]],[[114049,21951]],[[113891,21919]],[[113364,22038]],[[113030,22300]]]},\"properties\":{\"cp\":[110.919229,21.659751],\"name\":\"茂名市\",\"childNum\":9}},{\"id\":\"441200\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@@CCFD@@A\"],[\"@@PMDI@KFCDADFHDF@PANAXDJDFDDH@DIV@LRP@XDRBBNDBDDJDHFDJB\\\\GDCBABGBCJMHEFEFMFALBJCFGDQFIDC^KFIDMRGNBDBDFBDAHBBP@HBFBFFTBJHHLXZBHCVBFfFHCJGD@FFJRDNAhBHDHHHEdCR@HBH`GNBZL@bEfIRALBJFLFBJCVQZDNMFKD@FIPQLCVADCFAT@FGDOFKHCRC@ODELKJEBAHBDCLQFUBANBLDL@D@HCDIJsHa@ME[CIAGAAA@EDA@BSGEGKAWCEICACHQ@CKCDGDCDI@CKKAC@KBIBCHGP@FCD@RF@CEK@ABAD@PLHBHANIL@FCDKJWGK@GBCHAFBDABEBGAGAGCIBGBELID@@QBEJODSHIACGGMGAEBEHA@GA@@CJKAKDMFCTCJCD@LBRBFHDBRABAAIFKJ@DDB@LEPOZGN@TIJGT@PED@F@NHDHJBH@HADEJEFELAFMCSPMFEBECKCEAAECCA@CFEHA@CAAEAAICCC@AAAGEC@CCC@EGA@ADEHABGACKGEGDCBSB@DGACIGOGKK@EFAN@JDJBFAPMFAb@IU@CHE@CCWIK@ILM@EBCBCL@fLH@HEJA@CII@GCGACEEGMCCGACC@EIKGCDKVHDAIUKMHEBCB@BCJABGBCFBLJFDJ@@CCCGSDGF@FJHDLADCHBBFFBD@HCPGBI@OFGCOIKaOKCEECK@YDCFCBEF@Z@FGCEBEDCLEbBB@BECE@G@EBABGIBCA@ADIDM@KAALMHBVAHFFANCBONCD@TOAWGY@QBOAAGDEEGQ@GCCACYIMAAECAGQEKBK@GMIAC@]AIMIBIEG@iDCLEN@LAFDBDGJBJALPJbEPClmH_XBPECUSiImGCIGIQIGEK@KQMICOQEK@CNNHARGDEBDH@@CEABEB@@CDD@GCBEKWQK@UDGaS@BH@FBDDBBDAFEHBFADA@AHCBEEBECEBMAEBAA@OGCB@JGL@BJLGDGAK@ECBIBAFB@AECIC@MCG@AFALAAOFQBGASBEfaFKBKByDQHSFIHENUASBU\\\\DK[IUMOMICEGE@EBADBH@BD@DABB@@@DCBAA@BCFAA@CBCAAGBAA@ADBDAKAA@E@@EI@@@AGKMCA@EC@C@CJCAEHAHG@C@@ECAEAKI@ECKDADEAIL@BECIIGBEEK@EGGKBA@EIC@A@ICAEC@AB@DA@GLBHBB@DABGDAFEAEBEAEBA@II@HAC@EC@CBC@ACCB@@DACABABBFA@EDCDGFEF@DH@@ACD@DFA@DBDCC@ACCABAFA@FBA@CB@BJBCBHDABBACABACDCCBCABAFABACBC@BCDCEDABC@BAC@A@FEED@EAH@BCBCCDAFKHA@E@@C@ECABEBDIACE@JEDEEEEBCC@A@DGJGACEFCCEGCC@CCGAGBAGOBICE@ICABMIBEWECAGAAJMG@CCAA@CFAECCGDGA@GGEEBI@MFMJGDCA@ECCDCBAEA@CBCFBBKFGFBBCHEBCAA@GCABEAEEDCKA@EFEIC@ACGBGCCBACA@G@@@A@AAIAADCCBICCE@AFA@CFCABHEHA@SIGDEFC@AAAGBCFECKIACCG@ACCM@CGEI@KCIGG@GDKBGCCBABA@CACGSIGAKEMACEGAGEG@CACBADA@C@CECFABGJ@HEDBDFD@BGHA@KHAEWIMCCBADG@ACDCAAA@CDGAKFMEA@ADKAGDC@@@BLF@DFBHF@BADBJ@BFDBCJC@ADCDAFKHAD@BGBKCCB@DDFADADDB@D@HCJDDADBB@DIDBDGJ@BGFC@@LCFBJFDBBCH@JBDJHDH@XCBCACBAFA@G@CAE@KEIFG@CCEAIIGBCDC@AFDDDFAHBDABC@@BFF@ND@@BAFBBED@HABG@@BDHH@DCD@BAF@ACDABCB@DFB@H@@DB@HGD@DD@HFDABADGDBFAHCDIBAB@DLF@B@BAAABBBH@BBAFBH@BF@@DDBAFBHBFD@BJBBDHBB@DI@CFGBAD@BAFHLCBBLC@BHCFA@@FBJFLFDHLBLDJ@HDHFB@CLCFBDDFB@BABDBBFFFDBDFCD@FDF@F[VANA@OBC@GFEDE@ADI@AHIKQKKCoEMCKGceic[AWBYLQDGFM@QCKA[PE@E@IGUMMKAKBIHCFEDqDQFGFGFCJCZCL@HINMFODMiB[JUPQFM@OISGKAoAFaJMJSHSHQ@GAG@ePYEaDMDKLSdCFIDWFWA_@eJcRQLSJIJAFBHHLHHJBXDTJLPDF@JANCLCFOP[bevCAG@CAFKDDBA@ECA@GGEGCAIDEAECABEACC@@GE@EBGEE@@BCDCEMDCEEBKCSKADBBADCCICDEAAKLCAEHDB@DELIBC@MFC@@DD@@DDD@DGDADGFCBEFCCCD@DEDGD@AQAADIFIDCFE@AAOAAFADGCBEDCE@CAAA@E@CSJEHANF\\\\HLJJBHDHDNFFPHBDDZCFML@FFHADHH@NDDAHBND@FL@DEN@BDFDJFBELDBBLVAXCN@BRHJJBNPAFDDJPJCF@BHD@DD@LPR@DDJHFDFAJALDH@FBF@HBDNDFNAHEFDH@PALEH@HAFCF@DFFBL@TNBDBFCJDAFD@FEBEDABFFCVDLFNEBHPNJDJBJEGC@EFBHABDF@TNNFAGBAF@BCJDBF\\\\KPDBLCF@VDBBHABPNBJNCJH@JCBPXFAHFF@DAVFENDRFFABKBK@GDAGCHC@GOCDBDDBAHABGCI@KDA@GD@JGDBDFDP@B@@HCJBBBDEHDFBDCLBLCRA@BFFBCNFBPEB@AJDLDDHF@HDJEHHLHBBXHDFCFBFAJGHI@AHCBBBABBFAAABA@@HAAADA@AFB@LBBB@ANDDBHDBJBFAJBDABI@@D@@CDCDCCAHEBBLA@CB@BCBDF@DCBDFAHBBCBABAFABEH@FDBCFA@DFBBCD@ACBADBHEJFDAFCFAHD@DJJB@HGDDPMDD@HCHJVABH@HDDD@JAFDDABABBDDD@FCCE@CD@HFF@DCF@BDBBNIHC@EHBBCNDJFHB@FHBHCDDLFBDABAVB@GDBJGDBFJB@LPCDDDAF@DCF@BGF@HBFDD@JFBLEFBFMFCBBNE@DJFFFZFF@DEN@BFAFCB@DP@DDDBBDABFTDAJLBFFFHBDDALML@F@BW^BPAdADCDEDCBCAGDCBOdALEHKLABFNAF@DKFERCRBRAJHR@HL`@JAHGFIDKLADDVDLANB`DL@L@DJBVKZCN@FBDBDFBNHBDDLAJID@DBDFXDHAFAROPGFIBIBEHI\"]],\"encodeOffsets\":[[[115497,23554]],[[114675,24787]]]},\"properties\":{\"cp\":[112.472529,23.051546],\"name\":\"肇庆市\",\"childNum\":2}},{\"id\":\"441300\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@FDD@@A@CGAAB@B\"],[\"@@ABF@@@CA\"],[\"@@AB@BB@BAAA\"],[\"@@GHALC@CBBFCB@DBBHDDBJAHHDABGD@J@DEJFD@DCDEGE@AE@@ABE@AMBE@CAABMKE@\"],[\"@@D@@AC@@B\"],[\"@@@BBA@AAB\"],[\"@@BDB@BEAACB@B\"],[\"@@HHFBFED@F@BGACCAC@AD@@EEEAAECAAB@B@BAFBJ\"],[\"@@DBBECCIB@BFBBB\"],[\"@@@DFABCCACD\"],[\"@@BB@FB@FA@CAA@GABABCD\"],[\"@@JRNLFBHAAGGEBEIIG@GCCD\"],[\"@@BAA@@B\"],[\"@@EAIHBHADDB@DFABCBIDC@AAA\"],[\"@@B@BAA@AB\"],[\"@@BBBAAIABBDCDB@\"],[\"@@BAAACA@FD@\"],[\"@@@AC@@DDA\"],[\"@@DDB@BC@GAAC@AD@F\"],[\"@@EBMC@FABAFCBDDAFDABBBDDBDIACBAFADB@EJADA@GDE@EAKCBEF@HCD@FAB\"],[\"@@B@BAAAAACB@BDB\"],[\"@@DDB@F@DAIECBAB\"],[\"@@AACDB@DA\"],[\"@@@BBB@CA@\"],[\"@@B@@EAD@B\"],[\"@@BBDCACCCCDBDBB\"],[\"@@BACABD\"],[\"@@BC@AC@ABBB@BB@\"],[\"@@B@@EA@EFF@\"],[\"@@@BBBHBCCEA\"],[\"@@@BB@BCA@AB\"],[\"@@D@@CC@ADB@\"],[\"@@D@BA@EDE@G@AKB@B@HD@AH@D\"],[\"@@@DDBFA@KACGD@H\"],[\"@@BAEDDA\"],[\"@@H@BAACC@ABC@@DB@\"],[\"@@@DB@DCJ@@ECAEICBAEC@EB@BHPBA@D\"],[\"@@EGAKDCJID@D@ACECCBMCMK@EMI@K@MGODSC@HMDMRADGCCBIF@FIBGAESW@EHUBACG@GJELAJ@DABC@GEECCDCB@BEDCHADED@DPPXHE@CL@VgDKACLGJ@HDDDJEDKBMAGJ@BDNKHALDHHXHXLNCFBDEDAHBFAHGJ@JGLAAABCHIBGCCBCFKJBFADCB@@IDCLQBSDC@CDCDGD@FGDBDIFA@KAC@GCEGEFAACJKCEAEFAJOF@FCACBMFEDEHADEJFDABCDAXIDCB@JIFG@GE@AGHEFALGH@FF@BE@CBDB@FB@AJABDDAD@BDBHADAH@DBAFDBBHD@DD@BHDBCDBBDJBFUB[DEHEHCPAXFF@FCFEDGAEKMMKEOAIBCHSX[BGAGCCQEWCSOqIGKABGD@BAACBABBHA@EDCRC@FCHBJDFD@BCD@BABABCACBAFBDD@DDFDAJDBABDFBDCF@FDLEBAFEL@LEKACEEA@CC@ACACBAJCFGCC@CFCCGDEACF@BCCCG@CADEJABBDBFCBEHBJC@A@ICECC@CFABCFCAA@CBADDDA@K@@@GBABDBABDFDDDDC@AAEDCDDLDFEJBBAACBAHABADIAEJAFDB@DCJAACBC@ABCBACA@ADAHAEMC@AEGEEOAADIDAHDDACIFGFADBD@DCCE@CBCAAJK@EDOCCE@CCACDEAEGGJKCIBIAAB@BALBFABAJ@DKDABAFAFC@CFCJ@DEDGBABBBEDAACFC@AFGACP@FE@CHBD@DBLPAFHJD@HF@DDB@DEDBFBBABBBKDAD@DDDCBAJD@BFDBD@DBDHJFBPFDBDAF@FNDDBBADDF@JDGRFHD@BHDBBFFBBDABBBHFDJ@HCB@FBFAFBDABDF@HBDDBADBB@BFJEBA@@VABBHENFBFAJ@BDJFFDFAJJD@DDBEB@DAHABEB@AKIOH@BAJAC@AC@BFB@BHC@IBAF@BABEBADCAANH@EGKAKNOD@D@JBDADDDBBHDB@HHFEJBBJLDBABHD@PNEFBFAL@DAL@NCHGDBDEFBDAF@HHAFBFBBLBFCDFDJ@FJHNCDBBBDFDADBFJHDABHBTFBBBDLDBB@FHCBAD@NABCHCFBHC@BD@JDDAHFBB@DPBEF@DDHPHDAD@FAF@BAFC@CBDFBBDDBF@@ALCDBBBFDFCDFJBBBHCPFD@AKHCDADDD@JFL@DAH@BFFBDEFAAAFCLCDC@CBED@@BDABA@EF@FEB@@CB@DELBJFDAAECA@C@ACEFAEEBCF@Gc@CF@FCCC@CBAAADEACDGHBHDLJFBBDNHHEF@DCDAFQHBLEJAFIP@HFAKPODDFEDADBD@BC@CLOGC@EF@BA@KAADGD@AA@ICADEJABAHGJABBD@FA@ABEACD@@EMDAAQD@EEEGABIBEAABCCEK@QFEG@EAC@AA@CCCBEC@CGAG@C@EACGOA@CEBCCA@@@KCBOEEC@@CBEEE@ADECAG@EAAEECBGAAGDIDIKO@CBCDCBGAECOABMEKB@@IDC@CBAGE@GAABED@BEBADEACFGBCCABEFEEGBGYE@BIACBQCBEDABGMECEKGEI@CEE@CGEG@CEQCKBGIEACBECGC@CCAA@GDI@CAACE@OCAECAMKAEGAAE@GBACE@GOGACGECEDEAG@AACC@EFMJIBEHC@OFGF@FIDAABGCAAGMI@CACCDCFUPMG@CGEBGK@IGCDC@AGBCACCACKECCGAC@ECAIFKEBACCE@IEC@MKS@ACCACDKIBCAG@ACGGAACKAIHC@G@AGSQWDEEECAE@AI@WBAECAACKGACCADCFADEDAAOBEFAFCBEFKJAAEBCCECDECGDC@EE@ABIB@F@DG@CEG@AACBIFC@EHCJHBCPK@CBEEGBA@E@CDC@CEECBAE@CLECG@CB@DA@GBAFBDGJAHBJGBBDAAE@CDCFGFCFADBNGNFBA@EACEGBGCCAGLOH@FKDBDABECG@IHIH@FE@CDCAGDGDAAE@CBCI@[GIICIEIOK_QYS_[OOS_GUAmH}@ECGECOGU@]MC@GDAJ@LBJFJAPG\\\\EJEFQBY@UAcEgES@£ECBC^IP@BHTBZ@HELWZCNH\\\\NVBHIx@LL^PdHJBFAFCDeNIJMNSJS@ECACCQCGEGECëIEEE@GDCNGDCHYAIGEYEYCWCQEIGKI]QMAG@OGEJC@GFS@CDWCCKCAKFADCBQ@GDEBEEACcICDDB@F@BEBAPJBFDBDHBJNAHEJCAC@CBAFKACAEJ@HBBCDEHEECBC@ECCBBDELEH@DB@DAB@@NLJ@FDLAPH@DB@FEBHDDBCDC@@ACHBBGF@HGJEBEFOGCKBKAKKEC@ADIBIDMFCBC@KEEDABBF@JCFABGBCAC@CD@DCDHJJBBNCFBHDB@DE@CFI@EBIAI@AECAG@IDCKCAC@@DCBE@CA@AUDA@@FEFICCBCE@EEEGC@CAAMC@ABEOMMBCAC@@DGHAFABG@MD@JANADED@B@FHFDFBLCD@FDF@PEDBHCFBFB@BABFCDBRCJCDAFBB@JHJDBFA@CJEDBBDJBBDBFHH@DDJALGBCAGAGJ@DGAIDADK@KJGDCFEDEFATAHBFD@BDELE@CDJ@FHD@FFHB@JBD@HCB@LC@ABA@CHGDCAABUACBDD@BCBAACBCCGDABC@CHIM@AOIC@AGC@EBECAAEDBDABG@@AC@CFSDKPAECCCBCDAF@DHHADJBDDCDFDADFJFRVM@BCJA@@DEAEF@DCFKJA@CD@@EB@F@HO@[NKJGHK\\\\@RCPCDEBWDMDQAMEiYUCQBEBEFUJSX]TM@]ESEEA{PI@KG@HCBG@IDGFEFCBECIIIE]D@HAHEB@HDF@FFLAHDHLFBFDFRBJLDBXAJALDFFDJ@FGDIAGBGP@FAFDPDFHDDPHAJ@BBBJAFEBCFGNCNEHBJDBBDBHCFIDGFOHDFNLJRBHEH@DDBDVFJ@LFLGBCJEF@HFJDHDFLDF@JGdEPDHBFEJGRCHEDMESHEZKDA@EBAH@FAHCL@DAALBLGHAFEH@PIF@DHADB@BH@HJHJ@BADOLCFCPMXAFBDLHPHHFBHCHUNGH@FFJELHL@FABCBIEIAIDQ@MPCHDNCNDRBBLCR@HBPNIJEDIAMDA@KCOBQCGBEFAHLEFBLR@DKBS@CDCHEFO@GBCDELMFCHKDEJ@FBFCFGDODIFCFCL@JEFCNEFKDAD@FHPNJGFCFBJFLAF@DED]NIAGBCDBFADQ@IAA@CHCDDLFDLBHPADKBEJ@DN@RALBDJDRRC@FQJHH^DJDVBRHHFFLHFBP@HDHR@FBPZH@RHFADB@FDDRAHEFALJJDHAF@FR@N@FNFTBLDVTBFFDJ@CKICAMHAHBBE@CDCDGD@FPPJ@FFFLFFBVDDAGPCFOBQL@JLDHFIHIBCJFRDFPHHB@N@HD@BJD@BDCDCBEHABBBEFARCFGBAD@DFJ@B@HA@BFADGD@DCD@B@JBABDFHAFFDPZAFHLFFRIN@D@BMJBNBDGF@JJJ@JAJDJDHDCFBBFAD@JDD@FFCDF@DCLBFCBCNBHDHLDPH@DD@BJFH@REAILML@HGJFH@FDHELCPAHDH@LNFAHDFFH@FFDJHAFBDABGHAIC@GKGIAGEEBAAC@GGDCFBDAEGGAMYGE@GLELAL@JHH@DID@BEJAJ@DABBABFDLB@EFCFAJEBC@CFCHBF@LDL@FFNHPOVI\"],[\"@@@B@FF@@EECA@BB\"]],\"encodeOffsets\":[[[117482,23278]],[[117398,23197]],[[117793,23091]],[[117381,22988]],[[117842,23195]],[[117860,23175]],[[117593,23050]],[[117597,23053]],[[117422,22943]],[[117392,22989]],[[117397,22987]],[[117393,22968]],[[117484,23117]],[[117481,23120]],[[117486,23168]],[[117489,23169]],[[117397,23112]],[[117390,23108]],[[117412,23115]],[[117403,23116]],[[117402,23133]],[[117382,23154]],[[117387,23173]],[[117394,23162]],[[117397,23167]],[[117399,23178]],[[117400,23182]],[[117386,23263]],[[117390,23260]],[[117365,23236]],[[117392,23235]],[[117400,23225]],[[117401,23220]],[[117401,23206]],[[117393,23200]],[[117378,23206]],[[117361,23215]],[[117095,24462]],[[117602,23069]]]},\"properties\":{\"cp\":[114.412599,23.079404],\"name\":\"惠州市\",\"childNum\":39}},{\"id\":\"441400\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@HDFP@NDN@HAFHFPTHDHEJ@BDAH@BD@FDXBHABA@CGACCJGCMBGFEFANBBKJ@JK@CEEWIMGI@ECIAECGGBGEQBENKAIFEJ@F@LHD@BCDMDIDEJEPO@CDGE@EG@AJIGACEBEFCRCBABGJ@FCDGBMDKHEJAJ@\\\\LRCHFF@HEFOTUDE@KCG@EBUDGDEJIBIHADEAGGE@CAE@IEKBGGGHKJEJCLKH@PHLFTBBDDBJBBFRDBF@FBFJFTHJNBLHJHATMF@FBHCFGLADAB@BHDHH@FFRBD@BFFBVFR@RAJDVGFDBFBFDDJ@HBLCLFJ@N@DABEHING@@RTNLRRHBTCJBJARYDKFICQAAICEEEAECAIDQCCCCOIAGEGCGiiAEFGJWMGGEAC@IDG\\\\WN@DAAK@EHMJMPQJG`M@AGG@EFBdXPSPOJQNOAGMIAAODC@@EBGGE@CP]BAPGDELUBAJA@SDEDGLHFBF@DKVQLU@AMSAK@EZSBWBCNGDEKMAGDm@AHED@RFLCDABCCG@C@AD@B@@E@EEEBUCMFKBEAQ@@E@CI@GURIDICEGMCKKAEPUBEACGGIBUG@WACCOEIC@IGI@EDCFCREFEDKBKGKKIWWFCBGFGBQOECCEC@I@CACA@GKG[m@aFQFI@KI[A@QPAAO]IIKECIAAMBGDIHMDMIAEGEAADGBKLMCEDK@E@EEKQUIHAAHOBKKEHEBIAAKBAD@JCDWCAA@CA@IDADO@MLIAIGBMCCBMEIG@CDIFGAEGCAE@I@AAAMPKBAAAJAHCCEE@UFGDA@AABGFI@MGE@EBI@I@QAAMEGIEAQJI@CB@D@BKBUEAGDE@CEEWMIBEG@CAEE@MEEHCA@EKO@EAAKBK@KDAE@EFIdYT]EKGCA@AFCDEBCA@AFWAECC@CHAFKEEGAGICK@K@gIEAGCEEAQ@aHE@OLKPQHE@@HGHMAEBGCKAKOM@COKMIMGACIGC@EICGJEGAGGDADED@FADEAEBEHAJKDABBBEBED@FCD@BBHDBGHOAQF@GAAUAAECEIIMBCDCBKAIEE@GEBG@KMGUKECDACCEAIIICKKC@EDJFFBBHEBK@GCCECCACE@CADS@ECGIGCCAACGACCDECCGCAWBEA@CB@BCBMEKG@BCHCGMHOJBBBB@DC@KDCEIKDECCE@KMIIIAEGDUAACA@EHOBEBCHIAC@IECBCAACCACF@FA@CFEDIIEACBCFM@CCA@ABBFEFEFIDCNIDM@IB@ABEAEOFKJEBMCECQBAFQJ@BLPENON_@EBE@CCECSUUIAADE@CGIqWMKC@GDCBEAOEAA@E@CEEE@CBCLABIBEHUFIHEDCHED@HGPABKCE@CBEJEAGAG@GIC@EIBIA@G@EAISCCAECCEAAIGGAEBGDGJADGACACECM@AAHMRGAGHEEG@IEKE@CI@CLE@AGEEMMBC@GIFI@ACA@CHIMQEBGDGJI@I@EEGBOJKEQBC@AE@MICK@SJGPONCJIXIHCFC@GEIAOIAEEIGCCKMBAEC@CBOEDK@C@OIDCAA@AEGCMCEEAEBCFGBKCKCKGEQEM@GAAEDIKCCGCGEGMEC@KGAGCCOESBKDOCQK@MQ@CIECIAACBAJI@A@CGG@KDKEGEC@GMEIAKBABQAECABSBORBPBDDLABIHBRAJGDAJGBCAC@ADC@CDCB@BHBBFEJDBBFAB@DDBEDDBEFCPE@DFAJMACDADF@@FB@BJEDBB@BG@@CKDCLBFFFD@DAJD@CJBJHD@DBCD@DBBADCB@FEB@DCD@L@DFBBBCHBJDADIDABDADADBFEFHHBABDHJFN[LADBDCDFH@BEDEHEFB^BD@DEDCJJF@JBBABBHCHBFJFEPRJ@FJJAF@DDJBDHBBJCJFH@BEDDH@JDD@JD@CPBDEBK@ADABACAGECGCE@AAA@CDACDGEAIFEAGHE@GBCFBFFBDNARG@EBC@CAE@@FBBIJC@CDEBCJDDINDDBADB@DAD@DD@@DFB@DDB@BJLA@@FABCBCFGBC@@AACC@AACBAAGGAACAC@AEFCAGECGFECCAABE@CACCIAADG@G@GBKAGBKACAAD@B@B@DPJJHDDTLHJH@HPBBH@BBCBKN@DDBFEH@@DB@DDGDDBCHBFCBI@EB@FDD@BDBBFDDABEHBJ@JHBDFJDP@FBBDGNAH@FHBBBDBBFAHBHFDH@FCDBBFABBFCDBFDBD@AFEDFBBD@BFBF@DDADDHA@ADBBAHDBCD@HBDABADBDJH@DBBHFEFBJAFJFJ@BBFAF@HGD@FPBBF@PHFD@BJDCLBFCHDHCF@DGJLHEFADBJ@JIHADFXAH@JMHKNMJCPMLDJFFNBBBFTFN@PDDRJDB@FKRAFBBD@DB@HD@JIJFFAJBEDDFJLFFPBHCAGCCCIBGFEPCFBHPDCJ]DABC@KDGHCR@FCHBFJJL@DILABBJCDCBG@CDAB@RCBM@EB@B@FBBPAD@ITKHDLIFADHPENGB@JD@HFL@LOVM@ELBLGD@ABBFAFCDG@ADAHDPBDDBTFLPFEHEJBFFD`@NGBADBHBDDBJ@@LD@NBFAFD@F@PADABKBMPAFBHFHBDADEFBFAFIHIBCF@DJDBD@LCBKDBHKPDDADKFCDDPEFBPCHBHFN@XFNNHHAFDJLNTBL@LAJEFKFAPFLNFJFDFCFLL@DABCBQGI@AFBREJEDEAGBC@CAAOCBKA@BAJHTCBQ@IGCBADAHIFMBMDI@KAQBEFAVKJ@FFFDH@FAJIR@DDH@FEL@FCLBBN@JEF@DBCFBBABGBADNDPBLH@DEL@JIT@DLRHFJL@F@NHDLJNDL@FBDFNDFBBADENODK@GBEFEJCP@P@NHJNFBLCJEF@NCDIFCFANFL@HEHG\\\\EHILWHEBCBK@MMGCC@IJQDA@EDCF@PBHCN@LADEFAF@FDP@FDP@RFNHNLRLTJRBZILDH@JGH@NBNDF@DAD@FFBHEFEBCDADBNKLUPEH@DGACHADMNEHIFAHEFEBGAED@FFVCJGHAPEDS@QJ@BBBL@JDJHDBNADAT@BDCJHFLDGPJF@FADKFMGGAGDKAILC@GBABDHDTAFCDYPAF@RBDNL@B@HBFVPBD@DQ\\\\EDADBBLJFJ@BATFFFFBDARDJNCJFADKPADBFLHIBEDCDBFFBL@JIN@HDC`BJFH@PFJHDHNJFNCPCVKDIHEPADA@GGG@AFIIU@ADAD@PJ^@NDNHNLBDAFEFGDKBKHGLAF@TATGRDHFBD@DGD@FHHBBAROBCBEBAFBH@VGJ@HAJ@J@DABEDDFADDNE@AHCFBBFDEB@JDB@D@@EBGDCDMD@H@NGLBB@TRB@HAHENORMDEBODAACCA@AF@HFBABACGFGDELCJ@DCFOFBBFXAB@DEBK@GFCB@HLAJDBH@FCDDD@JAHDJC`CJEPBHBRTHFXVHLNFHAHWJOPCDCFKJCBCBCBWBANGDBFDNDLAHC@C@GICMMIMAG@CPIJCL@\\\\NNAZ@ZFHBJLPHHJTJJH@IBAFJDBH@\"],\"encodeOffsets\":[[119135,25423]]},\"properties\":{\"cp\":[116.117582,24.299112],\"name\":\"梅州市\",\"childNum\":1}},{\"id\":\"441500\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@BNAFBFHBHABC@AIECOCAAD\"],[\"@@DHFBF@DABMA@CBEAABEBAB\"],[\"@@BDD@JAAAEAA@C@AB\"],[\"@@HHDACKC@CF\"],[\"@@B@B@AAAB\"],[\"@@AD@DBFCBCHBHCD@DEFG@GJ@JDHAFCBCAELG@KPBHDDAHFHBD@FABMEMHCAEBEDEHCD@DBFCBAAIHGAIBCHEAAB@HCBA@@DDHKF@DBFDAFF@DCD@D@FABFHAF@DOLADIGGD@FEDAJBD@BFH@DCHE@A@AJ@BFFD@HCFDDCDFADBFIBELAFEDEBAFBPCBCFEBCDDBBDLHBDDBBFXAJ@@BBFFDFFXCTRBHH@D@JGLBBDHBDH@BBHADLJDCDBBDT@NLD@JFF@DDABLFJEDB@FBDDHFDDLDBBDADBHD@DCJHL@AHHF@DNHVODEDCBD@DNJBHDBAHBBJC@EHEPED@FGJANIFED@BD@BBHCFDFHFBDPH@HDFAB@HBFHBBFNLDBBFPDF@BDDBJ@HCB@DB@DHDFDDAFBHJLARDDFH@HF@DFF@DFJLHDFNFAHCBAFRDDAJB@AZFAHFHEFAFDBADEHBDCFABAFC@AFBB@HHFAB@DCD@JA@FLANPBFDHBDADCDAP@JLJCHCBBAHFDBFFBH@DBCF@BFFAF@DD@FFAPLD@@B@DDFA@DPBDHFBD@H@HB@DFDDADDB@@BBD@FFHREL@DFADBBAFAJHBFF@FRCBBNC@FC@BDAHEBC@@AA@CJ@FDB@FJHADFFDB@DHHCHGAAD@BHDBBRDDAH@DAVLFFABE@EHPNBJAFCBADBBHBDCH@bHLHF@JDADWFC@@AAAI@CFABGAJNED@DC@BDDD@BEXDRCHABBBBFLHRBBALAJBNF@HFDFHCL@LHH@D@BIJABBDJBFDDJR@@NRLPDLCTAPFDDBHLHD@NFFHDHDHLDCJ@BHFP@DGBBDDFARUDOHEXIJGDSHILIv[AEEGMG@ABKEE@A@CLGEGDKB]DAHAJ@LDLH@LFHJBLBZAH@HFLNJCD@VJR@JDNADABCFEHQDAHEBEHCFITORWEAACEKEAOAAC@CBG@CIK@EBGCGFKCKBEFANBJEJENK@CACNMBEKCCEECMC_@OEWBUEIDICMKCCAG@EDGNS@GEG@E@SCCCDMXIHCAEEEK@EFE@EMKCCBANKjUHIFCFAXBHADADKLMFMPKRCRGHBTGFCAUHITMJA\\\\fTFRAJBJFLLHCLCLMBKBANACOAEBCNKLMH@DA@CIQBKNENBBIHEH@LIAEHEKKA@CCEAAEBGIOGFGBCDEBEEE@AAEKAACLEC@CBGJGFAFEFGDAFBHRFGDLHB@B@FB@FADA@EEKACGCMWHE@EA@E@ACGA@KD@BCDABEDC@GEIBCDAMAAAFELATDHOFABB@JFFCDFBBJDDADDBF@BAAC@GGB@@@CDCAEDCAADEGECAGB@CAA@DA@BGDEHAFFFC@CCG@EDCHIHFJHNDFDBBDHBJH@DADCAGHIHBHHF@FADCJADIPKJEHAN@NEXCHGDSBARCJCFGFCF@^BRRD@LEDCBCAEBAXGH@DBNAB@BJHLENBBAFEF@FJHPRJDZHNALIJAPDDCBUUWCGUKKQIOOISYSISSOAGIEESGQCKGMKIEO@KDEFMZILEDEB]BUCMCaOQGEAS@KCeYUYKGEAI@CBONO@ICg[[@YCUKSQck_]KEIAMBMDIFGFCJCRBRFl@PCPKVidWTaHDCBADEVCHKFKBmBSCWGcYUEEAEAQAWEOEIGK]YSMGKAEBIBCFCP@HBLFJCJDLKLEF@JHTLF@FCAQBOAGGGWAEES]W[EIBMDAHITIDCAEAEICAEDEBCEIC@GBGJG@CBENABKBQGG@OLWJKPGBQAKDQN]PeESAUQCAqBO@UCG@EVMFMBIPMFIHCNEFCFAPBHHL@REbAJGHWJaDsAuG_@EAGCCAGDAJ@LH\\\\HJVJVJBDCBYJOBq@[EKCEACGGaBCDALGDEBG@KCEEEU@IBELMHGFITAFADEBSAQAiOMC{C_IKI@UGGAIBGAE@GACSACEC@CDA@QOACAE@IDAVGBC@GHE@EICCIMC\"],[\"@@@BB@@AA@\"],[\"@@D@AACBB@\"],[\"@@@BBCA@@B\"],[\"@@B@@AAB\"],[\"@@B@A@\"],[\"@@B@A@\"],[\"@@D@@AA@A@@B\"],[\"@@BBBAAAAB\"],[\"@@@BF@DAACE@CBBB\"],[\"@@@A@B\"],[\"@@BACAA@@BDB\"],[\"@@ABD@AE@D\"],[\"@@DDBABEKACBBBB@DB\"],[\"@@@BBBBCCA@B\"],[\"@@B@A@\"]],\"encodeOffsets\":[[[117871,23318]],[[117951,23284]],[[118250,23170]],[[118392,23248]],[[118691,23333]],[[117787,23247]],[[118896,23362]],[[118891,23360]],[[118753,23339]],[[118614,23269]],[[118615,23269]],[[118615,23268]],[[118399,23252]],[[118350,23224]],[[118346,23193]],[[118318,23199]],[[118261,23179]],[[118258,23180]],[[118203,23201]],[[118201,23206]],[[118199,23210]]]},\"properties\":{\"cp\":[115.364238,22.774485],\"name\":\"汕尾市\",\"childNum\":21}},{\"id\":\"441600\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@PDPHHGHBNNF@FADEBIB@FFAFEDAFFFHDF@@@CK@CD@FBF@DADIJADAHG@GBEDCF@PBD@I]DE@Q@E^KFUG[AKFALJDCDEPADEJODBDDTTDBNBNHHHPDJXHNDBLBLHJAF@BHFHPBVNHFFJDDD@HER[HAZGLHFB`IJ@FHHTRZbXFBJIHCDBNHTFVLFEHIAEAADIFIFOP]DAP@HAFKFKHNFRJL@LBBH@JIFPBFDFF@DD@JGFADFREHEJBFDJERBDDDF@P@F@LHJCROFAHBJ@FH@BDBF@NIBC@CFCF@DFF@ZWTIDBBFFHLFPFF@TIBCKYJKFSFEHC^NFXLBBBBVJTFJGXBFBHHFDFEH@DLLAL@LDLHFLFdCAUBEFCLBJDJFFFHNTHNHNBLAVLDADIDARBFABCHADDBFFHZNFHBDCFADBDNH@LBDB@BEFEDARDJ@@IBCDBBBH@DB@GJIAGJO@CB@BBFD@ACG@CJ@HABKFBDFD@HADCBEDAFBJL@B@BGEA@@B@D@DHBCJBBDCH@DDJAFDJLBBPAFBBBNDDDfAHCH@CHIBGT@H@BN@RDZLHBPLJBHCBCDBFFJFHDHAPCFFLTDPHFJDZBFDL@NBFAROFAH@NDNAb[FAD@DDBFAP@TTdD@FEHAHBHDXbLFLAvcDCFANKPANDXIDAHWNCLKJA@EGGFGNGBOBCHAF@PDDAFGIS@ADCPG@EDAPCJEPEBA@KAKJUAMAGBMABEAMCCEEAK@MCKIGC@M@EIKGEKQ@CJS@IFK@CKGOAMCBCHABAAADECAE@IFM@AADK@EFK@ECG@CJQBI@ECGEE@ELIBUFERALBJ@NCNAJEBGBCDAJHR@DAGSBI@ALBDABPDBD@HAFBFCFIAQBEJ@RHDABA@CKKDECEIEMEEKBOLEFEBI@KAKMSIKECGBMGEM@WEMAGDGAOFECODCLEBCCCLOAGLCDA@KACIC@CDEJAJGBEAEFEBCACEGAGBENOLABABC@O@EECEBMAC@@KI@CAACAGBCHA@MC_EEIAGFEFKOSECAACCOBGBCH@DCBEAEBAC@KHKA@FUNKPK@GEC@@IHAFMGOBCJECKLGJSC@OBAA@E@AFAN@DA@QBADCH@DADCAIBAJK@CIKEIGAEDQ@GDCH@LADCBI^CDGOEAODEFAHDJDDBHGDOAEEIKCEFCIAEBIEIJC@@GCAC@AABELQ@ECAQICC@OEMESAAMAEECINKDONILMNG@IBGEWBCJG@IAIBCFEKGHI@CDECGDGAEDKIC@AECOGE@AAEOC@GHE@EBAAI@IEBEAIFEGEAA@CIGACBCBAAC@GDCCABGAABCB@CGBCCCE@EA@AACEAFCBEC@CAAEDCAEBAAECAEDG@ECAGBGAECAAAGA@EBGHMACEAO@ICCEGA@IAIFGBACCAECA@ACC@EFAJ@DAAEDGCAHCCCA@@CG@EFCA@CLMDAAAG@AAGOG@GISKCCIGOI@C@A@ABCDBLBHALBHAH@H@BCJBDDDBF@BADBFDHEFDBHEDBFD@DBBBHHBBDABBD@BD@BD@HADEDABA@EB@IK@ACA@CEA@CC@@CBC@CCAABCCJMCCDIFADCD@JIAA@EF@DBD@FAH@BQCMEAAEDEHAF@HGFBJEFBCHBDDCB@BBF@HDFDBHBDBABCL@FCAADOC@@ICC@ICGFC@AEGDIAIGAACCI@CBEII@EQIFOIEAEDGAGBAAA@IIEDIFC@CACA]FEFGFC@AEGDCACBC\\\\KEMGIACABGGFEAEBCBCACCBCJCBAIDGAAEA@C@KDC@CFA@EDABCAA@CDCCAC@IGIA@DICCBC@EEAEBEDEJC@DHAAAFCAIA@@EE@BCDCNBBICEF@DOFECAFCCA@CBAAECAFIAEGA@ADADCD@BCD@DBHABIJE@GAQJGBACKACAOPQTABAECAEAABADGCQFW@ACCACD@@CFCIMHBBADEJ@BB@BD@XEBCICE@KGaGG@CDGAAABCDABEAIOMFGF@BAEEUKCBG@CBQCAAGC@ABCHBDGGG@CCAEEBCIG@ECA@EDIB@KBGHABIBCFDB@JBBC@CHBB@LABE@@FHDKP@DADC@CACBEFCCOPBLGEO@EJIBKFGAERCBCDE@GFMGACEAKIGCGACHBDCFBBAB@DDDEDE@@DHdE@ADFFEBDF@B@DDBBFCBIEKACFA@@DA@EFE@@FABCB@AC@AF@DCDKDEDBBEBCFEAAEG@CBK@IEC@CCCBGDBLC@OEGDAAIACEEDECAACAEBC@ADC@EAACEAAC@DEDABE@EBC@CBOGCG@CFEOA@CAAEA@AE@ICC@@AGDEAGDADMBC@ABGD@EAAKCACAASEGABAGCEICACBCEAACAMDIG@ECICEEDKAAAAEBEGGE@CBEACFCAGHMDK@CBK@EBEAMF@OGCBACAIKAAFIGE@GCAAGCACCCBIAC@C@MPBLHL@FMGBBCDABAFABE@AB@JGD@AEA@ABDD@IBABG@JPBLA@AFGBCBA@AFCCC@IIEBECIEACI@EBEAFMAGBA@UB@FAEI@AAABCCAAC@GCEBAACBEAE@EDA@G@CCEECCCBAACEAAECAAGC@EGHQICE@CCABCAMC@EBEACECAOIECGCAC@CAAEC@BIDACC@CBCLCAABAAAAEFC@CCA@CGEC@GIBEKOCAC@GA@DEFO@BDEH@BEDBDCBAFAAABCHCFI@ED@DEDEBABCBCLI@ABEBM@A@BBAJDJILHHBFCFBDDDF@DDCP@FILBBAD@DDFCDC@CAEBEHDJCBGCCBCJBBFPHFBFD@FNGBCB@BDBABAD@BADBDIBCDA@ECIBBFCJABGBABBDABIAEFKCCCCDBF@BCDCCECACABACAB@H@@@LCBCCAB@DBBEDADEB@DDDDF@J@BIDGAAFEDCAAAMF@BDBH@DDADE@BDCFDHED@DDDEHIDABBDBDD@@DFBDFLBKFK@EFABKFECE@CDEAACABICCBCE@CCCEAABBDADABABC@CDCA@AAAAIDG@EQDCD@FGBAAABBDABC@AHLBJHrTPXDRFDDBHAHW\\\\GTADBJFPNLLNBFCHEFEDE@WEOBGDGFCFA\\\\EVIAACCAADGC@ACCC@AGCABECAG@CBGBCA@ABCCCBABIA@@ECADAF@@AEEG@KHEBGFBHF@@HEHIJA@CDWJCBADCBIECFGBCFEFANBDEDE@IPEBBFDFILBDEBHFDF@HBD@LEBCJCAEHC@CHCD@DCDATKRCD@JA@CDEBIAELADDDAHGJADBBKBIHI@GHEBGACBCFEAMDWKWGGGKCGBMLACI@BHANCLIFCCGCI@KHBDCLUhK@@DGFOWCOC@CFGBCDAFA@CDDDFF@HADCBI@KBIF@HDHABGV@FTXBLGLE@AJDDCHQBCNGND@CTHP@N@LNJ@FNLNDDAFDBDC@C@IJCDBLFHBHDBD@FBJN@JGD@BDDJBFDBDCDDNBFTDDFCHAFBFCB@HDJHDDFEH@HDHBBHBAFEDEN@DDH@NNEDDKHENDJFHLDHFGH@FDB^DFCJKB@FVBDbB@FAHCJCFB\\\\FFDFFFVJN@JFNFLJJVNPBDGN@FDDH@BAPQHCB@DDB@@BHHAFFJJFFJDNFFF@@@BEAI@GDED@FDDHD@D@FADEFCJ@BF@F@BFHFBEBCDEXBDJJJDRDTBNDFFFP@FEFIJCHBNAHBFLRELALCDEBEBOASJCBIXCDEAKWCEQM_KMIIEAA@GCC[UGAA@EKCCAGECAKCEMGCB@JABG@IE@EDID@HBD@@WAMMEDATIFULI@CEAAGCAKFIEEAIJQFEFIACBGJAHCFEBEEK@CF@JABC@AC[BSDIEEDG@AACCIGGCGBYVE@QMEUEAC@CFAFBNQPIDGHEJGT[TCFAHBFPTANEHMF[H@DFJADOdAFGJOHED@DBDB@`BF@BDADI@O@I@CDBFJFLDBDCJBJHFHLRbAJMPAD@DPZNHJLBF@FC@MRKFaAQEE@ABDPCZ@JLZAFGHIJ@JGN@FPLFFNBZVXNFPNPLDPDHFBFADQJELYREHEN@RAFKHCHBDBBVFHBBFCJLNFBRDHBDDAPCJ@F\"],\"encodeOffsets\":[[117052,25164]]},\"properties\":{\"cp\":[114.697802,23.746266],\"name\":\"河源市\",\"childNum\":1}},{\"id\":\"441700\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@@BBFCDBFH@BFDBHABC@ECAGIKA\"],[\"@@BDB@DECACD\"],[\"@@B@@CCGBCAE@CL@FCLADALCBCJKDAD@B@@IJEFALFFC@C@CJGDMJADSDGBAD@LEnEFGDBH@DCPCFBFCHNJF@AHE@CDALAFGLGAIBGAEFABCAIG@MI@GAEIIGIDGJC@AAC@ICEAEYCBTADEDEAGYEAABA@BFAH@HBFAJIAMOC@@DGBEDGCEDK@IAGMCCAEC@GSGIBGFC@CAEKSHEFGGMIQKGIMCCGEA@GCAAGDG@ABQDCEIBE@GKAECC@CDKH@FEJAD@DABIDELBPGDI@ACAAI@ABC@CJEF@DCFABCBYCCQKAABI@CECCEBIAABCDEBAHCBC@GBADAFKCEAGGE@CMIK@CCEABCHEHIAGVBLF@JFJCAHJDD@DAZAAEBMNIPOF@BCBI@SR@@CDAJDD@DGH@NJLOJEL@HMFC@EJMD@XCDBF@RFLCDCB@BDH@BEGCAEBADAF@DBDA@CACACAAGICEIFA@AE@EFCAA@ABGBA@G@AAADMD@DHDAF@DA@CAACBGC@ADCAAFCJBFAFGD@D@FAD@DBB@BADABAHEF@DBDED@@EFCBBDAAEA@AEB@@ED@B@BEHBLAJBJ@FDBBDABCDBFADCTIDCAEDE@ADC@CFAJEBGDCDGFEBGAC@A@CDGB@DCEC@UB@DCBFD@DIBAACCECGBAF@DEEA@CDEECDIAGACC@CMJEFALADERIDCKEGEFCCCICGACCBGFEJAEEFCYSGKHMEAACKKCBGAEGBIBECCBCDG@GACAAFEDEACKC@EEAACDEMACA@ECCE@ECACFE@AKBHSDCCEBKCE@CDE@CGBCAJQ@AGCECIAcBIAMKG@CDADiHEJ@H@BHH@BIVADEBWEE@CFINC@SACBADEJAR@JHNBNARAHELEFIHIDO@aAeGUWuSegYugCGG_B_@EHId[DAF@LFLBR@HAVMJ@FAFGBC@IFGACUYIEGAGFE@w]IAI@EBC@SEABBLCBGAiOOEQKcWWUMQGCC@MHALGBGAcQGBOEIDCDAHBHDFDBF@BHFDFBLADDCFCDIBCNWZ_LQDwBYAQEyW]OKKGEKWCG@GBMB_DEEMOEQCMKCC@GAAG@GD@BBDBDILC@CAA@SFSFK@G@_MUIcWKAIEIBEDCBAFBRCBG@K@OCKCk[[CMB[VOHNT@FALWCFADI@GGKAABBHDB@FG@BCACGCC@CDAFBJFB@LBBKJAD@FFHPL@FCHI@CFAFDJCFCB@NBF@JBBHBBBBXDD@DNJADCF@DJHBNLJCNCD@JAHEHAHK@GFI@GFAEEBCACJEDKCIDEAAD@FCDI@@DDFAFDHAFBDFDDHCD@@AFADEHEBEF@DCBD@JFB@BDHBBDBDD@BFDDBB@BBBBHJF@F@FB@JABBD@JDBFHBFHEH@HDDEHDFAREDDDCNGDABCBOBAHB@@FMAAAKDQ@KAIDC@ANCBAHAFQBIEM@CAIF@DEBONBHEFEHABCAKGGBBDADKFIBCDBBCDAACBCLDHABCB@JFJHNEDA@CRGDAH@TFB@DAHCB@DBFFB@DEJAH@NDDDJHBDBBBJDBDJFBDAHAJHJEDADQDCD@BGH@F@DGHBH@BBBCBFD@DNBHJB@CLBDFBDD@DBBBDCJF@JAF@FABBADIB@DJR@BJBJHABCB@JAFRFDDAFHC@BFD@BBD@DAB@D@FGDIN@DDBAFFJ@FCNGDCPFHF@@DLBBDB@HAFBFF@DA@BFHDAFIFAB@DFD@DIRFJ@DLFDL@BHLJHJ@DFBABDDBH@BCB@BBBDABBBD@DD@HJAHBHDFFDB@DB@BAB@HD@DHB@B@DBBBFHFPBFDTEBAL@BAFAJD@BBF@DABCA@DB@BRDD@DAB@FHHB@@DA@CDCDC@EBADFBF@BBHTHJCHHFLA@DHBH@FEBBF@DBDLLDVPBFBLHPF@DIREDHJDHFBBJ@JEJHJB@BJHJBTGJ@HCHBLHBBAH@DHNBDB@BFL@BCFABFHHFFNF@HJHHHDFDFDDHHBBFFB@BFHDDDBB@@BHFFHD@FHDJJ@FFHBLCF@HCFBFV@NJLTJHDJFA@HBDBFFJFFAB@FBBAJBLCHNH@LHL@FBBBB@DFHFHNHF@BBFBLFDAJH@LF@BDB@DDTHBJFNF@BDBFHBBFJJDHNDJHDH@BEDAJC@CD@BBD@FBFDBADDDD@NP@FC@BHDBAB@D@ADDBDFBHCDBFRBBH@DCAG@ID@DBFGF@@CD@BIF@@KHGDAJDFABIBGAEBABGEE@CAADGMAM@AIEAD@@AEA@AD@DGFABC@MCICBKDGHGAAABECAKB@BGBCC@CMEAE@ARGHDBE@CCADGLAB@ABJB@CAADCFAHDF@HGBGJCHCD@DDALB@DCJEH@FDBEFEDABBBBFEBD@DDDAFBHFBJH@FBDHDJABB@FFBBBADJFFFBHBFHJDD@BDDD@NHNNBBFEBCJC@IFCDMHA@CDABKHCHK@EDCDBREBAACBG@KAAGG@EIGKEOBAE@EIOAEFI@IHEDI@IFABCBEBEFABAEKAA@AJMH@@EDABCFCFCB@@FB@LAAKHABB\"],[\"@@@FBBAJDDB@BCHFDAB@@CAG@AD@BCHHFCFDB@BAAECCIB@AICG@EAIF\"],[\"@@@DFDAH@DBDD@DEBIFA@CAACACBGACB\"],[\"@@BDJABAAAEAED\"],[\"@@BB@AA@\"],[\"@@EHBDD@D@@ICA\"],[\"@@@FFABAGA\"],[\"@@CDD@BAB@BAAACB\"],[\"@@DHB@BAAGEB\"],[\"@@FDD@ACEAA@@B\"],[\"@@JBB@@CECA@CD@B\"],[\"@@FDD@BA@ACAE@AB\"],[\"@@@BBBBFD@BABACEABACCB\"],[\"@@FBDADGACC@EDAACBADFD\"]],\"encodeOffsets\":[[[114809,22153]],[[114855,22121]],[[114702,23025]],[[114874,22064]],[[114832,22121]],[[114806,22071]],[[114802,22046]],[[114922,22241]],[[114665,22174]],[[114700,22170]],[[114706,22135]],[[114625,22113]],[[114372,22058]],[[114377,22061]],[[114316,22024]],[[114143,21998]]]},\"properties\":{\"cp\":[111.975107,21.859222],\"name\":\"阳江市\",\"childNum\":16}},{\"id\":\"441800\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@Z`FNALDHXVD@FCNUCY@AHEDITAV@NCJIJDJ@HEBIDA^@HEV@XGJETER@DBRAJFRAHBBBFDF@LFXBHLDBXEHGP@LCHEHMBQBAJ@FAFCJKTQFIBC\\\\IBADGF_BS@IGmJQJKRGBMFCH@@GHW@CEG@_DGHCVALGRAJEHGDG@OEQJU@EKWFCJELATAJFNARFLCF@RHTBN@RCH@DBLVVLTHFFFDdGRFF@DADGFAbPTGLALHBAF@@@LFBFB@BADBHKJEDICO@EBCFCFCB]BENGFI@MCOEGA@cCWWCBGAAICCeMOM@EHC@EJQ@EGKKGFGBEYmCCIACC@CBMJO@EGKEEE@ACDKAAOA]BEAEE@CFMBSHO@QLS@KCCWIIIBEFK@ECM[_BcBCDCD@RJD@BA@GB@PHH@FBH@B@HGF@LBLAHCLBTIHGEW@IDCHBDAHMJMAIFIDCJBHBB@PS@KDCVQRGHUAGBABID@DGLEJIFADCDGLBFEPGP@THLCFRJR@HDHHFVHD@LG^_LCNABCH@AGACBEFEFBFFBNBBJAHCF@VJF@TKJAJDDFBHHHFL@FHBDDLADBHLDBBABGD@FBDBJNDBDC@WDGHEBKDCPIBQFCLEZEFEHAJJ^FNNLBHA`BVNPPJNDBD@DA@CAIBCNAPD\\\\CDBJ@DA@IIMJUDADANATIF@NHZDNDLLLVFAHGFCN@HFLTB@B@JGFGBGHCJLLHBXDDFBFRBFDDBBFAHFD@PET@LBFGBKFADF@RBDBDFBNAFADE@CGMBGFCBAJFDCAIDAV@JDB@HENCBIDCbWFAFBHAPIFIJCBAAGBMFKRM`gPAHHAFDJBZFDv@TGBK@MBEHCLAJGJBFAHIRGH@BCB]IK@CDKHCLQ@A@ILECE@IHGVGJBHAJMJUAOGEAEF[AMCINA@CACECKAAC@KBCPGNIDBFHDBJCFCDA@KCKDCH@DJD@F@HCHC@IAMJEEKFE@GDA@EHGVGFANABOPFBCAKECQBWEEBBDABEBGAIEWUaMCEIE@CFGBMBCJ@BAFE@EEGEEO@E@EQSGCACC@KBEHE@CEEC@AE@SDAL@BA@A@CME@KACM@CA@CFK@EECM@QME@GDEAO[IIAIBC@EECEACDCFEBIAOKC@GJKBKGMWCCKIIMIAIGDCDAFINGBCCE@EBAF@FADCACFIFEHDD@HCHFDCN@DABGFABC@OHGEELAFCF@DAJIBGBADBDC@O@GAA@CDC@GI@GBGAAGKE@IK[EGICQ[E@KGKJA@KGE@EFC@A@@EEAA@BHCFE@ACKHACCCAEHCJSAKEEFOFECGE@QKGBCHEBG@GJE@EO@IEACDQBGAGHE@CBGC@DCBOEIGACAIEACIBEYUGBA@@CF@DCCCGCBEHKNGFODKJEKWLOC@EEBSGC@IDEF@JGCEIBKAECBIEEKEAACA@ABEFESMGGEG@EA@ADABQH@LM@MLKCAHFFAFABGB@JIJWDIAGEJ@DCeUEAEBEACCCAG@EDKAKAGFE@IDEEGBQLBD@HGHADDFCDOFC@MHGD@HA@EDJB@DEDG@OGGHA@OEYAGBCHGDGAMBKDACAGAE@M@GEEE@EBEEEUKU@IGKCMCAMACCCMAAEAI@@CBMAEGAKBKAUFWCAA@CTEBAEIEUACCEOIAGCBCJADCAICEGGAMAOIKJCAHOACDG@GACA@EHE@IFIBAQMCKBWOBGEUPKDEGILI@ECEGBACIGGCAIIEHI@AECgE@PCEBKCDGGEBGA@GIEOHBDQBSFIGGCEJAACAHICEMGCBGACCOBGGKDMKAGQAGCCEAEGGMCMHG@AEQAEFOG@ADAAAIAFGAAGHOCE@GBGHKGODECM@GEDICEEEECE@IHADKFGHMFI@ABAFDBFD@DEDCGEDHNAJCBEB@AEBGFE@IGEBEFMZCRKF@HJTf^DJDNMPQLECBGKIDC@CcZGDAHCAIB@DCBICSIIBMEQDCODOFE@EMDEBGEUBGAKNBB@LCNCJ@BDBJAAHAB@F@HDFAFA@aAKFCDAFDFEHY@E@AFEDCD@ZDLFFLDbPJLDPEH@PAJOHGDC@EAAEGACDKBGCEIE@CHHTDD@DI@ECKIEAADAHIBADA@ADGFLNJVCBUGCLHDJL@FDDHBDDHNFFBDDH@HJJ@DIBGFG@eKK@ADAD@FKN@JJLDX@DGF@DJVa@EBONEBIAICM@EB@FLLPHJHBDCHA@ATCDFHLHBDAHGBCF@BHB@FDD@DFDBHBBD@DDBJFBBB@DGBEF@DDBFDBBDFDLAFEFONDTENKBEFIFCFGBG@IACGMGE@C@OFS@IHSJM@YHOPKFA@CCI@ELBJABQBCAEGQAKAC@IDSDEDCNBLIL@DB@@HGBAFBFNHHHBDGJCTIPAF@RC@KJAFAHDJBHBHAHAFCBEAGBAD@HHLIXCLEDK@MJGBGAOKC@AB@BFL@DQEC@EDO@GHADAJ@LBDLL@DCJCDCHLD@DGRBDJDDFBXHLHFATB@FCB@BBBHDJF\\\\@NGbItCJGDC@K@KCMAABEVKRCDGAABIFKLCF@PQDGDELCPEHS@EBCDUBKDOREJC@ELMNYCURIDEAEKAIBKJQFe@aYKMA_HAG@GDQFcGGCGAGBgCMIQEEC@IHGDeEAEDUAGWYGKIGSAEEEAGAO@AABGACCECAMAQHCNEJ]LCDEJCREHIDKAEBENEFGFINADAHABCD[HIAECCGCIACMCES@WQO@KBGFIBGCGECICWCMBSBGAAAAEEBED@LCJONGJAFAJEJOHQPEBGBWCAJCHBDPDHHDFDLDFHDNAJODAF@NDDDFL@HARBDFBJADBJFHLNJLBH@DBDDBFAJBHFFPJHFBJDJVR@PDPALDNE`AHQDEBEFEH@HDTCDAHKPCDAHKH@JCFQJGBQBCDAJCHOHEF@FFFCRNVFFLBJJD@@DGNDZCLDNITINKBACMRG@ABADBHEJ@FGB@HABG@GBGHIDEJ@HADCABCCCCDIAGF@BBB@XKXIPBFLTR@VJMZ@NABK@ABBFFBBD@DGJAJJHRNFJLhHFPFP@H@NHPDTEJDNLRLFNBL@^NJLNLHDDJDCHBFBDXHZDZX@FAHBDjPHFHJP@PHBARMH@FJJFBBCFBBD@FH@JJHADKHFLCRDJBFAFDJFXDF@FDNAHSDOHM@CFGDE@GPSJCHCNID@DFLA\\\\BLXJDFhzMR@B@FJLCVJRJDDFDP@PN^JNARBP@DEHJLJNANHP@JFFFPKR@DHDNDHAL@BNCJSHC@G@QBA\\\\JHCJDF@FIDA`CFBDBBBCHBBPVRCRBHDfZJDJBLIHURKJKJC@EKOJMPGFAN@JF\"],\"encodeOffsets\":[[115113,25747]]},\"properties\":{\"cp\":[113.051227,23.685022],\"name\":\"清远市\",\"childNum\":1}},{\"id\":\"441900\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@EBCA@CGECBEAGODACEAEEGSCACM@GCEGGABCAGDAB@AH@BDA@EFADC@ACAEBAA@EF@FCNFDADBD@@AAIFCDBDC@AGADGB@@BJC@@CI@AFAHG@GECACA@CE@QDEEEA@CBA@MI@EDA@ABIEGDA@CCKIBAADGF@BCWUFICCE@GODCGAE@GDABBDEHEA@IG@@DDDCJEGA@@FCGA@BDABDJD@F@FEHPAJDB@BIFCDA@QJBDEPIDBHABCDBJMF@CCCGBCFG@AAA@CB@DCBCHC@CCMDCPABC@EFDD@BAHCD@HKCABDBEDGACDEE@EGCECEBBFGHEAEDBDB@@JIAACCBADC@AAIDBDFD@DEFADDBADABCACEEACEEBADGAACGDAA@CEAGAAAG@EDEACFGACHGBAFFH@DC@CLCJ@DCJ@LSA@DFA@HGEA@@ACABDCA@BA@BEAAEJDFHBABAFCBCBEBAAC@ABAFGEA@ADCACBBDADBBABIFCHODABCBBBQAIAGBGAACADGACFI@AHAHDBDEL@DAFBDCDAAADBDAABCBED@DFAAB@BFBFADBFAJ@QDC@C@CCCBAAACECADD@@FAEABIC@BEB@DB@E@FFEAC@@DACCCADDBA@C@@D@AC@AFDBC@@DA@ABDBDGLNA@CCEAADAAAD@@EBDB@FACAAAB@AC@FECCCBBAACAB@CCBBA@ACB@DAB@CC@@DDBC@AAB@@CGEBCCE@BE@BCDEA@@EO@EE@AABECCFC@EDKEG@@EECCE@ECCHCBGACDGEQECCBCEEB@GCBAESACEBEEEGAGFC@ACDGAEKEGGFMAGEIGEUI[QUkKVMPIFSDS@aAgW©¼]`w|MTMX@ZH`@N@HGNMP[|QpGLGLIXKzAdBRR\\\\RNFHL\\\\NLL@rLTJJFHJLH|@DBFJED@BRNHCHBD@BAAKB@RJXBLD\\\\V`RXFTA`WpDFAJCLAZDVCdOJAHE@ND@@FHABG@E@A^CJFLLFBPMJCH@DA@GLHJ@|OFBTF^FN@^STWVIFEFARAVDjZNFRBNCXCJEDO@QL[HGLI\\\\MP@@G@EFA@@DCB@LIDE@CFEFB@CB@DI@AUNEQEIBCECDCCCIABCGG@EFGDADDBFLOTCDED@@BH@BAACFCBBFDFAD@BHD@PJ@BJNDGD@BAHCDDDABBDCCCDAVBBADBHCDGB@BAD@@KDA@GACBIIAEEC@EGI@DCF@FKACC@AEBGBSFEFCDEHCLIL@BCJCHB@CHIHBDBHABKCI@CGGAECCGAAEC@IF@DEBCAGI@IAABEDCDIAQDCAEABA@AEDEAGFC@OCE@EDCAKCEGE\"],\"encodeOffsets\":[[116971,23361]]},\"properties\":{\"cp\":[113.746262,23.046237],\"name\":\"东莞市\",\"childNum\":1}},{\"id\":\"442000\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@aB]HG@EAEECACDEAEGG@IJC@GEOEACBUKEECAIDIHG@KEIHKBC@GEEBICA@CBEHADA@IHC@CHG@AACSIQ@CIIAKCACHEHID@\\\\_F@AKDEF@BA@GDGJ@BABGD@@EBA@ECCCIIEOECBC@ACMBGCAG@GDCFCBCQC]KIK_KUGCCKAQD]dMRGFGCA@CHGDEAABEBaTMLKVMb[|AFAdGL¦WNKf@x@FIRKPELEZQ\\\\KPS`KLOLSVIHD\\\\GlQ`UXEPKH@fFZFLN@BB@NGAELC@ADD@BDF@ILDFFA@BF@DD@FDABBDC@DEFBBJKFANGLBLBADAJLN@F@JJBPPJLT`HZFFHDLALGNUFEDCJBNRHFFBN@TEXDbHAJDHNHJHHDZJDHHHbWe\\\\I^ANAjMGONKj_idYAQMA@CHMtFIFFHEFFFCBBXSTA^QLKfZ~CTBoGk}I@\"],\"encodeOffsets\":[[116295,22950]]},\"properties\":{\"cp\":[113.382391,22.521113],\"name\":\"中山市\",\"childNum\":1}},{\"id\":\"445100\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@B@@AAB\"],[\"@@B@@CA@@D\"],[\"@@BBBAC@\"],[\"@@A@BBB@AA\"],[\"@@@BBA@AAB\"],[\"@@A@B@\"],[\"@@BACD@@BA\"],[\"@@@AAB@@B@\"],[\"@@@DBBBCAAAA@B\"],[\"@@B~CRKRCJDdADIFGJAHBF@BSFGGADIAKGE@@DGBKHAPBD@DEBGFKAIFG@EJEBI@EEEACE@CACHC@DDEGCBCCCFABEJ@ACAKA@AECBCBCC@ACAEB@BCBCAACMEGBADIBAE@C@EEG@A@GFA@GKCCAAGBAACIBEHA@ACGDGGEGCBA@BCCCKDALABA@ALA@EHE@GD@HCHCBEBAE]AIC@CDK@KKCECCECEDCLCPODQACIAGCAKEAAEAmDCDYBIHIF_DKGSCCOCCAGSHQOIIAEEABENADIGEDACBA@AEAA@CGC@G@OFIISFCIEDC@EFBFCFBBHLEJDHAFIDCJKLC@ECG@iTGBKAQHGFEAEBCBCJERQJCF@`@L@FDFLDDDBFCHNDFAFHF@DDEFELBBDTABC@EFC@ABEBAFEB@DEEAABEG@EBGLEDC@AJBHCBECEB@BDRAB@DNF@XEBIPBPIXGACBADAPEBEAGBK@GBKAGDGCG@EAG\\\\OE@DFHADWFGBCCCMC@EDKRCJALCBEBY@SDOL@FEFOPI@ECA@IJBLGTBHFHHIJD@FHDDJHBJNLNDPN@LPLBHDFANBHG@GF@RGLOPKF@bGR@FBDFBHJF@h@LDLHJHBFFELGB@DDDBFEX@BDBFADCBEB@HDFLS^cZEJ@FBFLCL@LABB@FLP@FDBFGNFF@BF@DFHJAXNFF@DCFBHVFLA@A@CDAJ@RIFBHJNFBB@R@JAJ@FHF@NEJAHBBB@HCVEF@DFGDIBBBABOLBNBBJ@F@DBFHHBJEDCH@FJANDDANJHJBNKP@BCJCB@@DBBXDDC@IBCLABBAJGFLFALGPBBJGRVFL@F@FCLDFKNALCHBBHFBFNJNCJGHCNABBDJLFJJP^BBROB@J\\\\@LEJER@b\\\\nLH@HHDJ@D@DFFDRPHAHEDAXEJXLLLHLALIDQDEFCJ@JHD@FJDPBD@XVHJAJJAHMRADBFLLNDFHJDJCVQBCBCPCFBV@@GPIDIHILBDAHIXKHIBEACIICICCQGGGAGCAQ@ECIKGEGMCAIACEIIAGEYGKAEBIDIAQDW@IJIDMBAH@NFHAAECABKAKCEOC@C@AFEF@@@HGLI@ECM@CBCFEFALHHBNEJIAEKKAMACBEAI@EDEPQGMDIAMEEAMEGKGIAEBGAACDGFCBE@GACCEBC^KDGCE@CBAJABA@AECAIAEDEYBCACCAAFIFEPER@FJNDFAJEZGBABGFCDIFIDUFOQO@ADKAEJITOFMFGF]JKDI@WDI@CAEBICEBEDEAI@CFEAE@MDIFCREHDF@FEFOLKFIBAJBJGVBLALUFQBBPJH@DBD@BCJFNQLIHCL@HGJDJAFBJEDGAIB¿ãgYIOAM@_L_@SEMEKIUkEIGCGAF[D]HOHUZCDEDGBGA\"]],\"encodeOffsets\":[[[119794,24064]],[[119799,24057]],[[119800,24057]],[[119797,24062]],[[119797,24067]],[[119721,24077]],[[119723,24072]],[[119725,24071]],[[119877,24103]],[[119724,24097]]]},\"properties\":{\"cp\":[116.632301,23.661701],\"name\":\"潮州市\",\"childNum\":10}},{\"id\":\"445200\",\"type\":\"Feature\",\"geometry\":{\"type\":\"MultiPolygon\",\"coordinates\":[[\"@@HSAKJIB@FDJ@POFE@EPKTCZ@FADABKDILQFCD@DNDDHAXEBCEG@CPFH[FBH@HDHCLBHAL@HAFBFABOBCDAHBJWAOJOFA@WME@CBACQ@AFAFDDAAGBID@FCHKFAH@AFBBFF@CFABEFABAD@FED@BACSAAFKFECCE@EGEBMCDGAECCKCCE@E@K@_DERIFQDIDAFAFBHERGLBHAjSH@FDD@LKDIJCBC@CCEFIGKAADEAEK@GFMB@DMHCHMHGJGDCF@LGDC@CECKBOFEFDHE@KB@BWIECBEAACACFAAEEFCKTECGMDC@A@BEDCQ]@SMROfANGLILUPUJUFESBCBCH@FDFJNVTP\\\\DH@P@DILIDI@YEaQGGQWIEICEBCBGJCJCR@JBbCFGAOWQ@GBUAAADEAAAAID@IGEEKAMECE@CACG@GEGAOFGJCACOHGCACC@GBACCAE@UHCDEG@GDO@IHOD@@BHBBBD@AEBEH@HEBGJGDBBDJA@EDC@ACAKFCKBCBMFEBCCQDGA_JO@EII@IACUBQ@GCG@CCAEBGJELKBGCKAOEFGBSIECJI@EACMEGGFM@CMOBGAIGIAGBKAEEAUSYDIIEKBUHEB@@DBBD@BECGEECBECMG@EFE@ACACEHAHDBC@ACAD@@@BHDDBAACAKCBQ@BC@IDG@ECKDABEKGIQLKBGHCAGBCLB@GBAFFBC`MFDFCACBAD@DBBCACCBAEFEACDCH@FCH@@FDFD@F@FBHAFELDHACGBAJA@CHGFAAGDADGBQFGBAEGDEDBDAH@DFFA@AAAJAJ@HGAC@AH@@AH@@AEAEDACEAFCH@FA@AAADCNBBBBBNDDHLFDFZJDDDFF@DABBBFHDFHBPTL@BGHBDB@LCF@PDDBBJL@HHFBPAFBDCFBDAFEH@DDFC@FB@FA@GFEB@FDFCFBDDFBF@FDHADDZJXYDI@IMaCUBMFO@QBCBIPKJEBEA@MCKGAADIACQCAAEGCBCDC@GCIIEICMAYCOGMOWIIKEUAI@_PUBYCgMiGYIMCQ@eNqTGF[XIDMBMC[oAVABQAIBKJMBYGICOQIG@EFEBEAAFMGKAIA@MBCAG@WHABBFADCDKFC@QQ]AE@EDEHIDQDABCTGHWDMFM@GBIFOLCJIBCDEBE@GGGAGJBHCDCBG@AICGAAECMCIGGEGJCD@FDH@DEDEEGBCFAHB@@CBB@DHADBHFCFBBCDBFCD@D@@HA@HBFG@CABCCCAIEADCEE@IAAEBGPSCI@ABEFBDN@CBADFJ@D@DCDAFCBADC@@LHBBDF@B@@FGFNXHDBDFL@FCBEBA@@E@AGACKEHGQEACBEHEFEBIHAHBFDBDKBBFLBBF@FFFADCHAHEJPAHBFFBDDB@LLGFBFKJG@GFAJMAMFALJR@DCBG@KNMLADBFDPMBABALKNKDGDKKIEIAQBSE[eIBSNGJBVEDSHGAQHQDOLENKNCLCBGBWAEBEDGJiVMLABDDNL@FEF@FFLFFDBJGNWDCDD@T@FFH@HMTCH@FBHDDNLJDJCVFXAPF`@NDFDDFLDAFMNBD@DMLIFIFMAEBAFDLELDHAH@FJL@DAH@DBDPBFBFLBDFBQXSPEJGDAFGFCBGREFADCBMBICQ@UIC@IDKMGEG@YBKAIAEG@KKGKCI@GBCBA^CLFHKH@D@BFFAL@BNHFHBFu\\\\KJGJCTIHWJGFCPQVEBCCAAADADRFHFDLDLAF@FEHADBFFFNDHDBFB@DBJC@P@DCLPFDAD@BFNADLHDFJBFPJJBJFDABCJGJWDIPMHOTIL@JD@NBFD@RALFPIHAFFJ@J@HIHCFANRGJ@DDB@BEJHJD@NAFNHF@BKF@DDJF@FL@JFHGFBHQHGNBBN@FDBDBDCHIBCHAHBFHHBJFBDDBFDDJTFBH@B@AJFJD@HJH@HBFBFIDAF@LDBAHO@GFCDGFCJGVEFGJABADKDAF@FF@D@FBBPFFBDAHCD@NLrXHJ@DCFBBVJTVFDDDF@FA`@PMFMKO@ARIBERAFDNDFALIPEBFAF@BJAN@JCDMJCFEFEAEBAB@DDN@DEDAFBJJFCDEB@@EDEDBBDDBDAJFD@JBDGFAPAFGB@BDVBHCBFJJNJ@LDFFDLCFJCD@LCDA@AAIAGPHNGDADH@FLANADA@@DFBXADBDHFDDCBDDHBBDDJHDH@FCTDBF@BDDDDFHDL@FAAGEAIEFCD@LLJDJJFBDDCBFDVLNH@LAF@DHDF@JFLBDADCHAF@JJDFBFVBBB@HREPBHGCAAG@ADC@EFCFAAABALCBIFGFAFBBC@EFCBCHC\"],[\"@@@@BCFCC@CH\"],[\"@@@BBA@AAB\"],[\"@@ABF@BAE@\"]],\"encodeOffsets\":[[[119162,24303]],[[119360,23597]],[[119261,23474]],[[119244,23482]]]},\"properties\":{\"cp\":[116.355733,23.543778],\"name\":\"揭阳市\",\"childNum\":4}},{\"id\":\"445300\",\"type\":\"Feature\",\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[\"@@@D@FBBDBF@CDAFHDBCBEPBBBF@DEJCJEBCRB@BHCFC@CDCDDFEDAHEBCHC@CCC@CC@@CD@NED@JAFK@CCAFGDBLKBBCFJDDDBCAABCTLLDFADFNCDFDC@AF@HFFAF@@HD@BDAFDBBFCFBJHDHF@HDB@FABCCELDBH@DBfu\\\\aPODEDKBM@ICEKOSIWCIAGGGKAGBEJITIRKdQfI`@XBXEJCDETcLKNCbCZFfOH@HBR@TGTGNIbIEpBLBTHPJN@REVO\\\\IjANPCNEJM@GDKDYDIHEHERErCFCDEJGLALBNVNJHF@F@\\\\OLBRDN@HERCZKXA\\\\BjddfLHNDpFLDRLJLBGJ@BCF@FCHED@RABM\\\\U@ECE@EDCCECAEEAECABA@AEACCEAKD@DEACG@GCIAKGKECEKAI@EB@DEAGD@AKDAGKBE@ABCHADEJ@@CAACGAAAIC@AEAGBECA@CE@@AAGBEAAG@AABABB@A@AKE@CBAJADCBGAEHCBCBAEC@GCCC@GHA@@CG@A@CEA@ADCBBDA@C@ABC@CDE@CAAGH@BA@GFCAABE@AC@@MEE@AD@BAACBGCECC@AJGHAJJFBDDH@JELFF@DBH@B@BEDADBDA@WCGIGAC@IDGAAECAIDE@KD@HE@AHIACJC@CAABCCCDI@G@CCABCBCCE@CDALDHA@ABCLGBEDCBCD@DICAAEI@CAABE@AGCEE@AK@@D@HCLBBCB@NFLEHBDCB@BBCDBDH@BCDANDXJBFLGB@HG@AECACDABIHIBADA@CAC@CDGBCAA@GDECC@KLeAGBCJABEFEAEF@AEDEAAACC@GC@GAIDGAABEH@BKDCBGF@BBJCL@HNLH@JFJBBHJ@FFDAFBDD@@DNAHDDBDBB@@AHC@ERCDGFCACH@HMF@BC@KCAAGBCHELEBECCBC@A@BD@BGBBDADMDCEE@EEEFGBAHCDEAACB@CJCBGFCAADKACDIAAC@@CMAIECCG@EACCE@GAAABCA@AEABIFIECGEBAAE@ABA@ACC@ANILCHG@IFIB@BBFAB@DGJD@@DGB@D@B@DJDCH@B@DDB@FDF@DCFC@ABGPKDBDF@FHIDAFAAGGIFCCCAEIBAFC@KEAEEKGGGAIJED@BCAACCDIC@MBACBCCC@GCA@ADC@EAACGCAACCACBCAC@ABA@CCDEEGA@@ABA@GB@DCCA@ACABC@CIQBEE@@ADEDABADCE@EEA@CACDDB@BF@@BGB@JI@CBQDABQDBCB@CE@CDAVAFCHIF@CAEA@CA@ADIDGA@BMBC@CGCACDKFIHLLDH@HGDKBMDK@CC@GCA@GCCBCHAEGCE@CFCCAC@@ABABKDABC@MEQEGMCC@GDGGMBSOGAEBEAAEDMCMJI@AKUAEAA@EAAAGC@CGAGAAAGEAGQEE@MFCJSBKMCMDGAOKOEGBEFI@CFCADEAEGACAEB@AAILA@C@ICC@EAAEAAAFQ@EA@MJEBAAC@AHCH@HMHADEBBFAHBJKHEHKBCB@DGF@BIEGMEDEAODCDG@CAEHmFKFC@ABCHCTIBCNIH@D@DEDKEEBIF@JA@C@CBILADKDCBKBEDK@@DBFADDLCAGBBLKBA@@EA@EDEDADC@@HG@IN@BBBFLABEBAFAFADEB@JCJGF@JCDAJFLFF@FBFPALFJH@FHHBB@LAHBDABQFCACD@FGLGDALCB@DGBCNED@JIDADEFAAMMMGC@CC@ACCGIAEAGEEIEBCAAEA@EAAIBGCAC@EIGEAAGBECC@CACEFAAAACBEFAFECG@IFCDA@BKCCC@GDIDAHGHE@GCEBCDBB@DIABAA@KBCHDB@DAFGCQH@BBFNF@DDDHA@ALADBAFBBHBHGLCDADJ@NADEBCHC@@BFB@BC@FBBJN@NBCHBB@DFFAHABBFAH@JGBICCBGH@LE@AJC@@DE@EHCAC@@JBHCDIAEQCAGDEAACCC@B@CBACAAGD@@EMOC@CCBCCAAE@EAC@ADCD@BIFC@EEGGCMCCGIIAEGAAEACE@EMAISGCCA@ACE@@KIGCBKEEAAAE@MGEGEG@CAAAA@EGK@KMGDGAKBIAA@EBAEEEIAEAC@GEBCIIGKSMIU@CFBF@DCDBJGFADCDGACAG@GBACIAC@CAA@AFCAE@ADCAGDEFBDIFC@CMCEBCECENCFBBHBDV@BK@FFCD@FBBAD@BDBGFECCA@DBDBJAHEDABGBIACDKCGCG@MIKCAABAACSSB@BGSCMGBA@@AM@KDEAAGCCGGE@EC@CGKGKBCD@DCDMHCFA@EFG@ABCBABEB@BGHC@ICAGEAAGA@C@IGBIF@BA@CFCCCCIBAAIDABKHA@GEC@CCCGQM@ADA@ICW@GOEEBEAAE@CBCCKBACCBC@AFEDAD@DFD@HBBBJBBCDEAIDCHBBCD@FBDCH@LABABDBADA@EFABBFDBJNDR@FDD@JADKDC@ABCBEEGBEAG@KGABCDE@ADEDYIEEEAEDAAAAEFAFA@ELEBAFA@CAKKM@ABECCIMDGGCAUACC@GEGAAADCFGCAICAAAABABADCDAJBHBBHN@HHDBDHDDNDDBD@HFRFBNANDDAVBFDBD@HSHGFGD@BKFCHFDADAHEDG@CDCBCB@DI@EDYDWGC@GCCGC@A@EDIEQDK@CBE@@JCFCBGBGD@JEBCFA@GHA@CECBECE@CCUDGHQVKBGFKBCBBH@HCJMJ@HEHANCD@DCHRP@HAJBFGDEHKH@DCBBBAFEAADE@E@CBE@CCCGBEAAQAK@@DKJAJBFIHEBEHGDIBEDAJE@@BBDDDTADAB@BDNADAF@HBBDJB@JBDFBHEDDDHHGLBCFDBDADCB@FAH@BEFABB@DDFDC@CBAHCFB@@D@DHDB@EBAB@@FB@FB@ENBLAFBB@BADGD@D@BDB@FCLBFFBA@CNF@BBLBFBBHCFDBCF@F@DDTLDF@H@BJD@DDBCHBFFF@F^JBFBHBBF@HCHGDBBBBRB@VJHABBDLAFEB@DHHDLG@@FLBHBDHDBBDDDEJH@BAFDDDADDFLAFFBFFFBDCF@DJAFDLBDD@FDFFAFDBBADFFADPHDJAVFFADFBDFHDBPFDBF@HCDBDAFGJE@CHBDHB@BABAB@NEF@FCDBBJ@JCDBDJJBFFF@DDNDFJFDBHSL@DILNHBHT@BHLAFFE@FNRPHAJH@DCDBNKJADDDAJFBBJDBBHABMEBEGCC@AHGCEBWCABKBc^CHAL@fFFBHADEDFA@BFDABABAC@FH@AABCBFABEAAFA@BPAJSBADVFLJP@NJDDCLIHEEIB@vBPDJDD@DCDKBGD@HDDQXIHAFBDD@@HDDBFB\\\\CBQLIGC@BDC@AGA@APFND@DHCBC@@HH@DDHNTHHFDJ@FADCB\"],\"encodeOffsets\":[[114049,23875]]},\"properties\":{\"cp\":[112.044439,22.929801],\"name\":\"云浮市\",\"childNum\":1}}],\"UTF8Encoding\":true});\n}));"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/layer/extend/layer.ext.js",
    "content": "/*! layer弹层组件拓展类 */\n;!function(){layer.use(\"skin/layer.ext.css\",function(){layer.layui_layer_extendlayerextjs=!0});var a=layer.cache||{},b=function(b){return a.skin?\" \"+a.skin+\" \"+a.skin+\"-\"+b:\"\"};layer.prompt=function(a,c){a=a||{},\"function\"==typeof a&&(c=a);var d,e=2==a.formType?'<textarea class=\"layui-layer-input\">'+(a.value||\"\")+\"</textarea>\":function(){return'<input type=\"'+(1==a.formType?\"password\":\"text\")+'\" class=\"layui-layer-input\" value=\"'+(a.value||\"\")+'\">'}();return layer.open($.extend({btn:[\"&#x786E;&#x5B9A;\",\"&#x53D6;&#x6D88;\"],content:e,skin:\"layui-layer-prompt\"+b(\"prompt\"),success:function(a){d=a.find(\".layui-layer-input\"),d.focus()},yes:function(b){var e=d.val();\"\"===e?d.focus():e.length>(a.maxlength||500)?layer.tips(\"&#x6700;&#x591A;&#x8F93;&#x5165;\"+(a.maxlength||500)+\"&#x4E2A;&#x5B57;&#x6570;\",d,{tips:1}):c&&c(e,b,d)}},a))},layer.tab=function(a){a=a||{};var c=a.tab||{};return layer.open($.extend({type:1,skin:\"layui-layer-tab\"+b(\"tab\"),title:function(){var a=c.length,b=1,d=\"\";if(a>0)for(d='<span class=\"layui-layer-tabnow\">'+c[0].title+\"</span>\";a>b;b++)d+=\"<span>\"+c[b].title+\"</span>\";return d}(),content:'<ul class=\"layui-layer-tabmain\">'+function(){var a=c.length,b=1,d=\"\";if(a>0)for(d='<li class=\"layui-layer-tabli xubox_tab_layer\">'+(c[0].content||\"no content\")+\"</li>\";a>b;b++)d+='<li class=\"layui-layer-tabli\">'+(c[b].content||\"no  content\")+\"</li>\";return d}()+\"</ul>\",success:function(a){var b=a.find(\".layui-layer-title\").children(),c=a.find(\".layui-layer-tabmain\").children();b.on(\"mousedown\",function(a){a.stopPropagation?a.stopPropagation():a.cancelBubble=!0;var b=$(this),d=b.index();b.addClass(\"layui-layer-tabnow\").siblings().removeClass(\"layui-layer-tabnow\"),c.eq(d).show().siblings().hide()})}},a))},layer.photos=function(a,c,d){function e(a,b,c){var d=new Image;d.onload=function(){d.onload=null,b(d)},d.onerror=function(a){d.onerror=null,c(a)},d.src=a}var f={};if(a=a||{},a.photos){var g=a.photos.constructor===Object,h=g?a.photos:{},i=h.data||[],j=h.start||0;if(f.imgIndex=j+1,g){if(0===i.length)return void layer.msg(\"&#x6CA1;&#x6709;&#x56FE;&#x7247;\")}else{var k=$(a.photos),l=k.find(a.img||\"img\");if(0===l.length)return;if(c||k.find(h.img||\"img\").each(function(b){var c=$(this);i.push({alt:c.attr(\"alt\"),pid:c.attr(\"layer-pid\"),src:c.attr(\"layer-src\")||c.attr(\"src\"),thumb:c.attr(\"src\")}),c.on(\"click\",function(){layer.photos($.extend(a,{photos:{start:b,data:i,tab:a.tab},full:a.full}),!0)})}),!c)return}f.imgprev=function(a){f.imgIndex--,f.imgIndex<1&&(f.imgIndex=i.length),f.tabimg(a)},f.imgnext=function(a,b){f.imgIndex++,f.imgIndex>i.length&&(f.imgIndex=1,b)||f.tabimg(a)},f.keyup=function(a){if(!f.end){var b=a.keyCode;a.preventDefault(),37===b?f.imgprev(!0):39===b?f.imgnext(!0):27===b&&layer.close(f.index)}},f.tabimg=function(b){i.length<=1||(h.start=f.imgIndex-1,layer.close(f.index),layer.photos(a,!0,b))},f.event=function(){f.bigimg.hover(function(){f.imgsee.show()},function(){f.imgsee.hide()}),f.bigimg.find(\".layui-layer-imgprev\").on(\"click\",function(a){a.preventDefault(),f.imgprev()}),f.bigimg.find(\".layui-layer-imgnext\").on(\"click\",function(a){a.preventDefault(),f.imgnext()}),$(document).on(\"keyup\",f.keyup)},f.loadi=layer.load(1,{shade:\"shade\"in a?!1:.9,scrollbar:!1}),e(i[j].src,function(c){layer.close(f.loadi),f.index=layer.open($.extend({type:1,area:function(){var b=[c.width,c.height],d=[$(window).width()-100,$(window).height()-100];return!a.full&&b[0]>d[0]&&(b[0]=d[0],b[1]=b[0]*d[1]/b[0]),[b[0]+\"px\",b[1]+\"px\"]}(),title:!1,shade:.9,shadeClose:!0,closeBtn:!1,move:\".layui-layer-phimg img\",moveType:1,scrollbar:!1,moveOut:!0,shift:5*Math.random()|0,skin:\"layui-layer-photos\"+b(\"photos\"),content:'<div class=\"layui-layer-phimg\"><img src=\"'+i[j].src+'\" alt=\"'+(i[j].alt||\"\")+'\" layer-pid=\"'+i[j].pid+'\"><div class=\"layui-layer-imgsee\">'+(i.length>1?'<span class=\"layui-layer-imguide\"><a href=\"javascript:;\" class=\"layui-layer-iconext layui-layer-imgprev\"></a><a href=\"javascript:;\" class=\"layui-layer-iconext layui-layer-imgnext\"></a></span>':\"\")+'<div class=\"layui-layer-imgbar\" style=\"display:'+(d?\"block\":\"\")+'\"><span class=\"layui-layer-imgtit\"><a href=\"javascript:;\">'+(i[j].alt||\"\")+\"</a><em>\"+f.imgIndex+\"/\"+i.length+\"</em></span></div></div></div>\",success:function(b,c){f.bigimg=b.find(\".layui-layer-phimg\"),f.imgsee=b.find(\".layui-layer-imguide,.layui-layer-imgbar\"),f.event(b),a.tab&&a.tab(i[j],b)},end:function(){f.end=!0,$(document).off(\"keyup\",f.keyup)}},a))},function(){layer.close(f.loadi),layer.msg(\"&#x5F53;&#x524D;&#x56FE;&#x7247;&#x5730;&#x5740;&#x5F02;&#x5E38;<br>&#x662F;&#x5426;&#x7EE7;&#x7EED;&#x67E5;&#x770B;&#x4E0B;&#x4E00;&#x5F20;&#xFF1F;\",{time:3e4,btn:[\"下一张\",\"不看了\"],yes:function(){i.length>1&&f.imgnext(!0,!0)}})})}}}();\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/layer/laydate/laydate.js",
    "content": "/**\n\n @Name : layDate v1.1 日期控件\n @Author: 贤心\n @Date: 2014-06-25\n @QQ群：176047195\n @Site：http://sentsin.com/layui/laydate\n\n */\n\n;!function(a){var b={path:\"\",defSkin:\"default\",format:\"YYYY-MM-DD\",min:\"1900-01-01 00:00:00\",max:\"2099-12-31 23:59:59\",isv:!1},c={},d=document,e=\"createElement\",f=\"getElementById\",g=\"getElementsByTagName\",h=[\"laydate_box\",\"laydate_void\",\"laydate_click\",\"LayDateSkin\",\"skins/\",\"/laydate.css\"];a.laydate=function(b){b=b||{};try{h.event=a.event?a.event:laydate.caller.arguments[0]}catch(d){}return c.run(b),laydate},laydate.v=\"1.1\",c.getPath=function(){var a=document.scripts,c=a[a.length-1].src;return b.path?b.path:c.substring(0,c.lastIndexOf(\"/\")+1)}(),c.use=function(a,b){var f=d[e](\"link\");f.type=\"text/css\",f.rel=\"stylesheet\",f.href=c.getPath+a+h[5],b&&(f.id=b),d[g](\"head\")[0].appendChild(f),f=null},c.trim=function(a){return a=a||\"\",a.replace(/^\\s|\\s$/g,\"\").replace(/\\s+/g,\" \")},c.digit=function(a){return 10>a?\"0\"+(0|a):a},c.stopmp=function(b){return b=b||a.event,b.stopPropagation?b.stopPropagation():b.cancelBubble=!0,this},c.each=function(a,b){for(var c=0,d=a.length;d>c&&b(c,a[c])!==!1;c++);},c.hasClass=function(a,b){return a=a||{},new RegExp(\"\\\\b\"+b+\"\\\\b\").test(a.className)},c.addClass=function(a,b){return a=a||{},c.hasClass(a,b)||(a.className+=\" \"+b),a.className=c.trim(a.className),this},c.removeClass=function(a,b){if(a=a||{},c.hasClass(a,b)){var d=new RegExp(\"\\\\b\"+b+\"\\\\b\");a.className=a.className.replace(d,\"\")}return this},c.removeCssAttr=function(a,b){var c=a.style;c.removeProperty?c.removeProperty(b):c.removeAttribute(b)},c.shde=function(a,b){a.style.display=b?\"none\":\"block\"},c.query=function(a){var e,b,h,i,j;return a=c.trim(a).split(\" \"),b=d[f](a[0].substr(1)),b?a[1]?/^\\./.test(a[1])?(i=a[1].substr(1),j=new RegExp(\"\\\\b\"+i+\"\\\\b\"),e=[],h=d.getElementsByClassName?b.getElementsByClassName(i):b[g](\"*\"),c.each(h,function(a,b){j.test(b.className)&&e.push(b)}),e[0]?e:\"\"):(e=b[g](a[1]),e[0]?b[g](a[1]):\"\"):b:void 0},c.on=function(b,d,e){return b.attachEvent?b.attachEvent(\"on\"+d,function(){e.call(b,a.even)}):b.addEventListener(d,e,!1),c},c.stopMosup=function(a,b){\"mouseup\"!==a&&c.on(b,\"mouseup\",function(a){c.stopmp(a)})},c.run=function(a){var d,e,g,b=c.query,f=h.event;try{g=f.target||f.srcElement||{}}catch(i){g={}}if(d=a.elem?b(a.elem):g,f&&g.tagName){if(!d||d===c.elem)return;c.stopMosup(f.type,d),c.stopmp(f),c.view(d,a),c.reshow()}else e=a.event||\"click\",c.each((0|d.length)>0?d:[d],function(b,d){c.stopMosup(e,d),c.on(d,e,function(b){c.stopmp(b),d!==c.elem&&(c.view(d,a),c.reshow())})})},c.scroll=function(a){return a=a?\"scrollLeft\":\"scrollTop\",d.body[a]|d.documentElement[a]},c.winarea=function(a){return document.documentElement[a?\"clientWidth\":\"clientHeight\"]},c.isleap=function(a){return 0===a%4&&0!==a%100||0===a%400},c.checkVoid=function(a,b,d){var e=[];return a=0|a,b=0|b,d=0|d,a<c.mins[0]?e=[\"y\"]:a>c.maxs[0]?e=[\"y\",1]:a>=c.mins[0]&&a<=c.maxs[0]&&(a==c.mins[0]&&(b<c.mins[1]?e=[\"m\"]:b==c.mins[1]&&d<c.mins[2]&&(e=[\"d\"])),a==c.maxs[0]&&(b>c.maxs[1]?e=[\"m\",1]:b==c.maxs[1]&&d>c.maxs[2]&&(e=[\"d\",1]))),e},c.timeVoid=function(a,b){if(c.ymd[1]+1==c.mins[1]&&c.ymd[2]==c.mins[2]){if(0===b&&a<c.mins[3])return 1;if(1===b&&a<c.mins[4])return 1;if(2===b&&a<c.mins[5])return 1}else if(c.ymd[1]+1==c.maxs[1]&&c.ymd[2]==c.maxs[2]){if(0===b&&a>c.maxs[3])return 1;if(1===b&&a>c.maxs[4])return 1;if(2===b&&a>c.maxs[5])return 1}return a>(b?59:23)?1:void 0},c.check=function(){var a=c.options.format.replace(/YYYY|MM|DD|hh|mm|ss/g,\"\\\\d+\\\\\").replace(/\\\\$/g,\"\"),b=new RegExp(a),d=c.elem[h.elemv],e=d.match(/\\d+/g)||[],f=c.checkVoid(e[0],e[1],e[2]);if(\"\"!==d.replace(/\\s/g,\"\")){if(!b.test(d))return c.elem[h.elemv]=\"\",c.msg(\"日期不符合格式，请重新选择。\"),1;if(f[0])return c.elem[h.elemv]=\"\",c.msg(\"日期不在有效期内，请重新选择。\"),1;f.value=c.elem[h.elemv].match(b).join(),e=f.value.match(/\\d+/g),e[1]<1?(e[1]=1,f.auto=1):e[1]>12?(e[1]=12,f.auto=1):e[1].length<2&&(f.auto=1),e[2]<1?(e[2]=1,f.auto=1):e[2]>c.months[(0|e[1])-1]?(e[2]=31,f.auto=1):e[2].length<2&&(f.auto=1),e.length>3&&(c.timeVoid(e[3],0)&&(f.auto=1),c.timeVoid(e[4],1)&&(f.auto=1),c.timeVoid(e[5],2)&&(f.auto=1)),f.auto?c.creation([e[0],0|e[1],0|e[2]],1):f.value!==c.elem[h.elemv]&&(c.elem[h.elemv]=f.value)}},c.months=[31,null,31,30,31,30,31,31,30,31,30,31],c.viewDate=function(a,b,d){var f=(c.query,{}),g=new Date;a<(0|c.mins[0])&&(a=0|c.mins[0]),a>(0|c.maxs[0])&&(a=0|c.maxs[0]),g.setFullYear(a,b,d),f.ymd=[g.getFullYear(),g.getMonth(),g.getDate()],c.months[1]=c.isleap(f.ymd[0])?29:28,g.setFullYear(f.ymd[0],f.ymd[1],1),f.FDay=g.getDay(),f.PDay=c.months[0===b?11:b-1]-f.FDay+1,f.NDay=1,c.each(h.tds,function(a,b){var g,d=f.ymd[0],e=f.ymd[1]+1;b.className=\"\",a<f.FDay?(b.innerHTML=g=a+f.PDay,c.addClass(b,\"laydate_nothis\"),1===e&&(d-=1),e=1===e?12:e-1):a>=f.FDay&&a<f.FDay+c.months[f.ymd[1]]?(b.innerHTML=g=a-f.FDay+1,a-f.FDay+1===f.ymd[2]&&(c.addClass(b,h[2]),f.thisDay=b)):(b.innerHTML=g=f.NDay++,c.addClass(b,\"laydate_nothis\"),12===e&&(d+=1),e=12===e?1:e+1),c.checkVoid(d,e,g)[0]&&c.addClass(b,h[1]),c.options.festival&&c.festival(b,e+\".\"+g),b.setAttribute(\"y\",d),b.setAttribute(\"m\",e),b.setAttribute(\"d\",g),d=e=g=null}),c.valid=!c.hasClass(f.thisDay,h[1]),c.ymd=f.ymd,h.year.value=c.ymd[0]+\"年\",h.month.value=c.digit(c.ymd[1]+1)+\"月\",c.each(h.mms,function(a,b){var d=c.checkVoid(c.ymd[0],(0|b.getAttribute(\"m\"))+1);\"y\"===d[0]||\"m\"===d[0]?c.addClass(b,h[1]):c.removeClass(b,h[1]),c.removeClass(b,h[2]),d=null}),c.addClass(h.mms[c.ymd[1]],h[2]),f.times=[0|c.inymd[3]||0,0|c.inymd[4]||0,0|c.inymd[5]||0],c.each(new Array(3),function(a){c.hmsin[a].value=c.digit(c.timeVoid(f.times[a],a)?0|c.mins[a+3]:0|f.times[a])}),c[c.valid?\"removeClass\":\"addClass\"](h.ok,h[1])},c.festival=function(a,b){var c;switch(b){case\"1.1\":c=\"元旦\";break;case\"3.8\":c=\"妇女\";break;case\"4.5\":c=\"清明\";break;case\"5.1\":c=\"劳动\";break;case\"6.1\":c=\"儿童\";break;case\"9.10\":c=\"教师\";break;case\"10.1\":c=\"国庆\"}c&&(a.innerHTML=c),c=null},c.viewYears=function(a){var b=c.query,d=\"\";c.each(new Array(14),function(b){d+=7===b?\"<li \"+(parseInt(h.year.value)===a?'class=\"'+h[2]+'\"':\"\")+' y=\"'+a+'\">'+a+\"年</li>\":'<li y=\"'+(a-7+b)+'\">'+(a-7+b)+\"年</li>\"}),b(\"#laydate_ys\").innerHTML=d,c.each(b(\"#laydate_ys li\"),function(a,b){\"y\"===c.checkVoid(b.getAttribute(\"y\"))[0]?c.addClass(b,h[1]):c.on(b,\"click\",function(a){c.stopmp(a).reshow(),c.viewDate(0|this.getAttribute(\"y\"),c.ymd[1],c.ymd[2])})})},c.initDate=function(){var d=(c.query,new Date),e=c.elem[h.elemv].match(/\\d+/g)||[];e.length<3&&(e=c.options.start.match(/\\d+/g)||[],e.length<3&&(e=[d.getFullYear(),d.getMonth()+1,d.getDate()])),c.inymd=e,c.viewDate(e[0],e[1]-1,e[2])},c.iswrite=function(){var a=c.query,b={time:a(\"#laydate_hms\")};c.shde(b.time,!c.options.istime),c.shde(h.oclear,!(\"isclear\"in c.options?c.options.isclear:1)),c.shde(h.otoday,!(\"istoday\"in c.options?c.options.istoday:1)),c.shde(h.ok,!(\"issure\"in c.options?c.options.issure:1))},c.orien=function(a,b){var d,e=c.elem.getBoundingClientRect();a.style.left=e.left+(b?0:c.scroll(1))+\"px\",d=e.bottom+a.offsetHeight/1.5<=c.winarea()?e.bottom-1:e.top>a.offsetHeight/1.5?e.top-a.offsetHeight+1:c.winarea()-a.offsetHeight,a.style.top=d+(b?0:c.scroll())+\"px\"},c.follow=function(a){c.options.fixed?(a.style.position=\"fixed\",c.orien(a,1)):(a.style.position=\"absolute\",c.orien(a))},c.viewtb=function(){var a,b=[],f=[\"日\",\"一\",\"二\",\"三\",\"四\",\"五\",\"六\"],h={},i=d[e](\"table\"),j=d[e](\"thead\");return j.appendChild(d[e](\"tr\")),h.creath=function(a){var b=d[e](\"th\");b.innerHTML=f[a],j[g](\"tr\")[0].appendChild(b),b=null},c.each(new Array(6),function(d){b.push([]),a=i.insertRow(0),c.each(new Array(7),function(c){b[d][c]=0,0===d&&h.creath(c),a.insertCell(c)})}),i.insertBefore(j,i.children[0]),i.id=i.className=\"laydate_table\",a=b=null,i.outerHTML.toLowerCase()}(),c.view=function(a,f){var i,g=c.query,j={};f=f||a,c.elem=a,c.options=f,c.options.format||(c.options.format=b.format),c.options.start=c.options.start||\"\",c.mm=j.mm=[c.options.min||b.min,c.options.max||b.max],c.mins=j.mm[0].match(/\\d+/g),c.maxs=j.mm[1].match(/\\d+/g),h.elemv=/textarea|input/.test(c.elem.tagName.toLocaleLowerCase())?\"value\":\"innerHTML\",c.box?c.shde(c.box):(i=d[e](\"div\"),i.id=h[0],i.className=h[0],i.style.cssText=\"position: absolute;\",i.setAttribute(\"name\",\"laydate-v\"+laydate.v),i.innerHTML=j.html='<div class=\"laydate_top\"><div class=\"laydate_ym laydate_y\" id=\"laydate_YY\"><a class=\"laydate_choose laydate_chprev laydate_tab\"><cite></cite></a><input id=\"laydate_y\" readonly><label></label><a class=\"laydate_choose laydate_chnext laydate_tab\"><cite></cite></a><div class=\"laydate_yms\"><a class=\"laydate_tab laydate_chtop\"><cite></cite></a><ul id=\"laydate_ys\"></ul><a class=\"laydate_tab laydate_chdown\"><cite></cite></a></div></div><div class=\"laydate_ym laydate_m\" id=\"laydate_MM\"><a class=\"laydate_choose laydate_chprev laydate_tab\"><cite></cite></a><input id=\"laydate_m\" readonly><label></label><a class=\"laydate_choose laydate_chnext laydate_tab\"><cite></cite></a><div class=\"laydate_yms\" id=\"laydate_ms\">'+function(){var a=\"\";return c.each(new Array(12),function(b){a+='<span m=\"'+b+'\">'+c.digit(b+1)+\"月</span>\"}),a}()+\"</div>\"+\"</div>\"+\"</div>\"+c.viewtb+'<div class=\"laydate_bottom\">'+'<ul id=\"laydate_hms\">'+'<li class=\"laydate_sj\">时间</li>'+\"<li><input readonly>:</li>\"+\"<li><input readonly>:</li>\"+\"<li><input readonly></li>\"+\"</ul>\"+'<div class=\"laydate_time\" id=\"laydate_time\"></div>'+'<div class=\"laydate_btn\">'+'<a id=\"laydate_clear\">清空</a>'+'<a id=\"laydate_today\">今天</a>'+'<a id=\"laydate_ok\">确认</a>'+\"</div>\"+(b.isv?'<a href=\"http://sentsin.com/layui/laydate/\" class=\"laydate_v\" target=\"_blank\">laydate-v'+laydate.v+\"</a>\":\"\")+\"</div>\",d.body.appendChild(i),c.box=g(\"#\"+h[0]),c.events(),i=null),c.follow(c.box),f.zIndex?c.box.style.zIndex=f.zIndex:c.removeCssAttr(c.box,\"z-index\"),c.stopMosup(\"click\",c.box),c.initDate(),c.iswrite(),c.check()},c.reshow=function(){return c.each(c.query(\"#\"+h[0]+\" .laydate_show\"),function(a,b){c.removeClass(b,\"laydate_show\")}),this},c.close=function(){c.reshow(),c.shde(c.query(\"#\"+h[0]),1),c.elem=null},c.parse=function(a,d,e){return a=a.concat(d),e=e||(c.options?c.options.format:b.format),e.replace(/YYYY|MM|DD|hh|mm|ss/g,function(){return a.index=0|++a.index,c.digit(a[a.index])})},c.creation=function(a,b){var e=(c.query,c.hmsin),f=c.parse(a,[e[0].value,e[1].value,e[2].value]);c.elem[h.elemv]=f,b||(c.close(),\"function\"==typeof c.options.choose&&c.options.choose(f))},c.events=function(){var b=c.query,e={box:\"#\"+h[0]};c.addClass(d.body,\"laydate_body\"),h.tds=b(\"#laydate_table td\"),h.mms=b(\"#laydate_ms span\"),h.year=b(\"#laydate_y\"),h.month=b(\"#laydate_m\"),c.each(b(e.box+\" .laydate_ym\"),function(a,b){c.on(b,\"click\",function(b){c.stopmp(b).reshow(),c.addClass(this[g](\"div\")[0],\"laydate_show\"),a||(e.YY=parseInt(h.year.value),c.viewYears(e.YY))})}),c.on(b(e.box),\"click\",function(){c.reshow()}),e.tabYear=function(a){0===a?c.ymd[0]--:1===a?c.ymd[0]++:2===a?e.YY-=14:e.YY+=14,2>a?(c.viewDate(c.ymd[0],c.ymd[1],c.ymd[2]),c.reshow()):c.viewYears(e.YY)},c.each(b(\"#laydate_YY .laydate_tab\"),function(a,b){c.on(b,\"click\",function(b){c.stopmp(b),e.tabYear(a)})}),e.tabMonth=function(a){a?(c.ymd[1]++,12===c.ymd[1]&&(c.ymd[0]++,c.ymd[1]=0)):(c.ymd[1]--,-1===c.ymd[1]&&(c.ymd[0]--,c.ymd[1]=11)),c.viewDate(c.ymd[0],c.ymd[1],c.ymd[2])},c.each(b(\"#laydate_MM .laydate_tab\"),function(a,b){c.on(b,\"click\",function(b){c.stopmp(b).reshow(),e.tabMonth(a)})}),c.each(b(\"#laydate_ms span\"),function(a,b){c.on(b,\"click\",function(a){c.stopmp(a).reshow(),c.hasClass(this,h[1])||c.viewDate(c.ymd[0],0|this.getAttribute(\"m\"),c.ymd[2])})}),c.each(b(\"#laydate_table td\"),function(a,b){c.on(b,\"click\",function(a){c.hasClass(this,h[1])||(c.stopmp(a),c.creation([0|this.getAttribute(\"y\"),0|this.getAttribute(\"m\"),0|this.getAttribute(\"d\")]))})}),h.oclear=b(\"#laydate_clear\"),c.on(h.oclear,\"click\",function(){c.elem[h.elemv]=\"\",c.close()}),h.otoday=b(\"#laydate_today\"),c.on(h.otoday,\"click\",function(){c.elem[h.elemv]=laydate.now(0,c.options.format),c.close()}),h.ok=b(\"#laydate_ok\"),c.on(h.ok,\"click\",function(){c.valid&&c.creation([c.ymd[0],c.ymd[1]+1,c.ymd[2]])}),e.times=b(\"#laydate_time\"),c.hmsin=e.hmsin=b(\"#laydate_hms input\"),e.hmss=[\"小时\",\"分钟\",\"秒数\"],e.hmsarr=[],c.msg=function(a,d){var f='<div class=\"laydte_hsmtex\">'+(d||\"提示\")+\"<span>×</span></div>\";\"string\"==typeof a?(f+=\"<p>\"+a+\"</p>\",c.shde(b(\"#\"+h[0])),c.removeClass(e.times,\"laydate_time1\").addClass(e.times,\"laydate_msg\")):(e.hmsarr[a]?f=e.hmsarr[a]:(f+='<div id=\"laydate_hmsno\" class=\"laydate_hmsno\">',c.each(new Array(0===a?24:60),function(a){f+=\"<span>\"+a+\"</span>\"}),f+=\"</div>\",e.hmsarr[a]=f),c.removeClass(e.times,\"laydate_msg\"),c[0===a?\"removeClass\":\"addClass\"](e.times,\"laydate_time1\")),c.addClass(e.times,\"laydate_show\"),e.times.innerHTML=f},e.hmson=function(a,d){var e=b(\"#laydate_hmsno span\"),f=c.valid?null:1;c.each(e,function(b,e){f?c.addClass(e,h[1]):c.timeVoid(b,d)?c.addClass(e,h[1]):c.on(e,\"click\",function(){c.hasClass(this,h[1])||(a.value=c.digit(0|this.innerHTML))})}),c.addClass(e[0|a.value],\"laydate_click\")},c.each(e.hmsin,function(a,b){c.on(b,\"click\",function(b){c.stopmp(b).reshow(),c.msg(a,e.hmss[a]),e.hmson(this,a)})}),c.on(d,\"mouseup\",function(){var a=b(\"#\"+h[0]);a&&\"none\"!==a.style.display&&(c.check()||c.close())}).on(d,\"keydown\",function(b){b=b||a.event;var d=b.keyCode;13===d&&c.creation([c.ymd[0],c.ymd[1]+1,c.ymd[2]])})},c.init=function(){c.use(\"need\"),c.use(h[4]+b.defSkin,h[3]),c.skinLink=c.query(\"#\"+h[3])}(),laydate.reset=function(){c.box&&c.elem&&c.follow(c.box)},laydate.now=function(a,b){var d=new Date(0|a?function(a){return 864e5>a?+new Date+864e5*a:a}(parseInt(a)):+new Date);return c.parse([d.getFullYear(),d.getMonth()+1,d.getDate()],[d.getHours(),d.getMinutes(),d.getSeconds()],b)},laydate.skin=function(a){c.skinLink.href=c.getPath+h[4]+a+h[5]}}(window);\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/layer/laydate/need/laydate.css",
    "content": "/**\n\n @Name： laydate 核心样式\n @Author：贤心\n @Site：http://sentsin.com/layui/laydate\n\n**/\n\nhtml{_background-image:url(about:blank); _background-attachment:fixed;}\n.layer-date{display: inline-block!important;vertical-align:text-top;max-width:240px;}\n.laydate_body .laydate_box, .laydate_body .laydate_box *{margin:0; padding:0;}\n.laydate-icon,\n.laydate-icon-default,\n.laydate-icon-danlan,\n.laydate-icon-dahong,\n.laydate-icon-molv{height:34px; padding-right:20px;min-width:34px;vertical-align: text-top;border:1px solid #C6C6C6; background-repeat:no-repeat; background-position:right center;  background-color:#fff; outline:0;}\n.laydate-icon-default{ background-image:url(../skins/default/icon.png)}\n.laydate-icon-danlan{border:1px solid #B1D2EC; background-image:url(../skins/danlan/icon.png)}\n.laydate-icon-dahong{background-image:url(../skins/dahong/icon.png)}\n.laydate-icon-molv{background-image:url(../skins/molv/icon.png)}\n.laydate_body .laydate_box{width:240px; font:12px '\\5B8B\\4F53'; z-index:99999999; *margin:-2px 0 0 -2px; *overflow:hidden; _margin:0; _position:absolute!important; background-color:#fff;}\n.laydate_body .laydate_box li{list-style:none;}\n.laydate_body .laydate_box .laydate_void{cursor:text!important;}\n.laydate_body .laydate_box a, .laydate_body .laydate_box a:hover{text-decoration:none; blr:expression(this.onFocus=this.blur()); cursor:pointer;}\n.laydate_body .laydate_box a:hover{text-decoration:none;}\n.laydate_body .laydate_box cite, .laydate_body .laydate_box label{position:absolute; width:0; height:0; border-width:5px; border-style:dashed; border-color:transparent; overflow:hidden; cursor:pointer;}\n.laydate_body .laydate_box .laydate_yms, .laydate_body .laydate_box .laydate_time{display:none;}\n.laydate_body .laydate_box .laydate_show{display:block;}\n.laydate_body .laydate_box input{outline:0; font-size:14px; background-color:#fff;}\n.laydate_body .laydate_top{position:relative; height:26px; padding:5px; *width:100%; z-index:99;}\n.laydate_body .laydate_ym{position:relative; float:left; height:24px; cursor:pointer;}\n.laydate_body .laydate_ym input{float:left; height:24px; line-height:24px; text-align:center; border:none; cursor:pointer;}\n.laydate_body .laydate_ym .laydate_yms{position:absolute; left: -1px; top: 24px; height:181px;}\n.laydate_body .laydate_y{width:121px;}\n.laydate_body .laydate_y input{width:64px; margin-right:15px;}\n.laydate_body .laydate_y .laydate_yms{width:121px; text-align:center;}\n.laydate_body .laydate_y .laydate_yms a{position:relative; display:block; height:20px;}\n.laydate_body .laydate_y .laydate_yms ul{height:139px; padding:0; *overflow:hidden;}\n.laydate_body .laydate_y .laydate_yms ul li{float:left; width:60px; height:20px; line-height: 20px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;}\n.laydate_box *{box-sizing:content-box!important;}\n.laydate_body .laydate_m{width:99px;float: right;margin-right:-2px;}\n.laydate_body .laydate_m .laydate_yms{width:99px; padding:0;}\n.laydate_body .laydate_m input{width:42px; margin-right:15px;}\n.laydate_body .laydate_m .laydate_yms span{display:block; float:left; width:42px; margin: 5px 0 0 5px; line-height:24px; text-align:center; _display:inline;}\n.laydate_body .laydate_choose{display:block; float:left; position:relative; width:20px; height:24px;}\n.laydate_body .laydate_choose cite, .laydate_body .laydate_tab cite{left:50%; top:50%;}\n.laydate_body .laydate_chtop cite{margin:-7px 0 0 -5px; border-bottom-style:solid;}\n.laydate_body .laydate_chdown cite, .laydate_body .laydate_ym label{top:50%; margin:-2px 0 0 -5px; border-top-style:solid;}\n.laydate_body .laydate_chprev cite{margin:-5px 0 0 -7px;}\n.laydate_body .laydate_chnext cite{margin:-5px 0 0 -2px;}\n.laydate_body .laydate_ym label{right:28px;}\n.laydate_body .laydate_table{ width:230px; margin:0 5px; border-collapse:collapse; border-spacing:0px; }\n.laydate_body .laydate_table td{width:31px; height:19px; line-height:19px; text-align: center; cursor:pointer; font-size: 12px;}\n.laydate_body .laydate_table thead{height:22px; line-height:22px;}\n.laydate_body .laydate_table thead th{font-weight:400; font-size:12px; text-align:center;}\n.laydate_body .laydate_bottom{position:relative; height:22px; line-height:20px; padding:5px; font-size:12px;}\n.laydate_body .laydate_bottom #laydate_hms{position: relative; z-index: 1; float:left; }\n.laydate_body .laydate_time{ position:absolute; left:5px; bottom: 26px; width:129px; height:125px; *overflow:hidden;}\n.laydate_body .laydate_time .laydate_hmsno{ padding:5px 0 0 5px;}\n.laydate_body .laydate_time .laydate_hmsno span{display:block; float:left; width:24px; height:19px; line-height:19px; text-align:center; cursor:pointer; *margin-bottom:-5px;}\n.laydate_body .laydate_time1{width:228px; height:154px;}\n.laydate_body .laydate_time1 .laydate_hmsno{padding: 6px 0 0 8px;}\n.laydate_body .laydate_time1 .laydate_hmsno span{width:21px; height:20px; line-height:20px;}\n.laydate_body .laydate_msg{left:49px; bottom:67px; width:141px; height:auto; overflow: hidden;}\n.laydate_body .laydate_msg p{padding:5px 10px;}\n.laydate_body .laydate_bottom li{float:left; height:20px; line-height:20px; border-right:none; font-weight:900;}\n.laydate_body .laydate_bottom .laydate_sj{width:33px; text-align:center; font-weight:400;}\n.laydate_body .laydate_bottom input{float:left; width:21px; height:20px; line-height:20px; border:none; text-align:center; cursor:pointer; font-size:12px;  font-weight:400;}\n.laydate_body .laydate_bottom .laydte_hsmtex{height:20px; line-height:20px; text-align:center;}\n.laydate_body .laydate_bottom .laydte_hsmtex span{position:absolute; width:20px; top:0; right:0px; cursor:pointer;}\n.laydate_body .laydate_bottom .laydte_hsmtex span:hover{font-size:14px;}\n.laydate_body .laydate_bottom .laydate_btn{position:absolute; right:5px; top:5px;}\n.laydate_body .laydate_bottom .laydate_btn a{float:left; height:20px; padding:0 6px; _padding:0 5px;}\n.laydate_body .laydate_bottom .laydate_v{position:absolute; left:10px; top:6px; font-family:Courier; z-index:0;}\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/layer/laydate/skins/danlan/laydate.css",
    "content": "﻿/** \n \n @Name： laydate皮肤：淡蓝\n @Author：贤心\n @Site：http://sentsin.com/layui/laydate\n \n**/\n\n.laydate-icon{border:1px solid #B1D2EC; background-image:url(icon.png)}\n\n.laydate_body .laydate_box,\n.laydate_body .laydate_ym,\n.laydate_body .laydate_ym .laydate_yms,\n.laydate_body .laydate_table,\n.laydate_body .laydate_table td,\n.laydate_body .laydate_bottom #laydate_hms,\n.laydate_body .laydate_time,\n.laydate_body .laydate_bottom .laydate_btn a{border:1px solid #B1D2EC;}\n\n.laydate_body .laydate_y .laydate_yms a,\n.laydate_body .laydate_choose,\n.laydate_body .laydate_table thead{background-color:#DEECF8;}\n\n.laydate_body .laydate_box, \n.laydate_body .laydate_ym .laydate_yms,\n.laydate_body .laydate_time{box-shadow: 2px 2px 5px rgba(0,0,0,.1);}\n\n.laydate_body .laydate_box{border-top:none; border-bottom:none; background-color:#fff; color:#1F547E;}\n.laydate_body .laydate_box input{color:#1F547E;}\n.laydate_body .laydate_box .laydate_void{color:#BDD8EE!important;}\n.laydate_body .laydate_box .laydate_void:hover{background-color:#fff!important}\n.laydate_body .laydate_box a, .laydate_body .laydate_box a:hover{color:#1F547E;}\n.laydate_body .laydate_click{background-color:#DEECF8!important;}\n.laydate_body .laydate_top{border-top:1px solid #B1D2EC;}\n.laydate_body .laydate_ym .laydate_yms{background-color:#fff;}\n.laydate_body .laydate_y .laydate_yms a{border-bottom:1px solid #B1D2EC;}\n.laydate_body .laydate_y .laydate_yms .laydate_chdown{border-top:1px solid #B1D2EC; border-bottom:none;}\n.laydate_body .laydate_y .laydate_yms ul li:hover, \n.laydate_body .laydate_m .laydate_yms span:hover{color:#000;}\n.laydate_body .laydate_choose{border-left:1px solid #B1D2EC;}\n.laydate_body .laydate_chprev{border-left:none; border-right:1px solid #B1D2EC;}\n.laydate_body .laydate_chtop cite{border-bottom-color:#3081C2;}\n.laydate_body .laydate_chdown cite, .laydate_body .laydate_ym label{border-top-color:#3081C2;}\n.laydate_body .laydate_chprev cite{border-right-style:solid; border-right-color:#3081C2;}\n.laydate_body .laydate_chnext cite{border-left-style:solid; border-left-color:#3081C2;}\n.laydate_body .laydate_table td{background-color:#fff; color:#1F547E;}\n.laydate_body .laydate_table .laydate_nothis{color:#60A2D7;}\n.laydate_body .laydate_table thead{color:#163A58;}\n.laydate_body .laydate_bottom{border-bottom:1px solid #B1D2EC;}\n.laydate_body .laydate_bottom #laydate_hms{background-color:#fff;}\n.laydate_body .laydate_time{background-color:#fff;}\n.laydate_body .laydate_bottom .laydate_sj{border-right:1px solid #B1D2EC; background-color:#ECF4FB;}\n.laydate_body .laydate_bottom input{background-color:#fff;}\n.laydate_body .laydate_bottom .laydte_hsmtex{border-bottom:1px solid #B1D2EC;}\n.laydate_body .laydate_bottom .laydate_btn{border-right:1px solid #B1D2EC;}\n.laydate_body .laydate_bottom .laydate_v{color:#75AEDD}\n.laydate_body .laydate_bottom .laydate_btn a{ border-right:none; background-color:#ECF4FB;}\n.laydate_body .laydate_bottom .laydate_btn a:hover{ background-color:#fff;}\n\n.laydate_body .laydate_y .laydate_yms ul li:hover,\n.laydate_body .laydate_m .laydate_yms span:hover,\n.laydate_body .laydate_choose:hover,\n.laydate_body .laydate_y .laydate_yms a:hover,\n.laydate_body .laydate_table td:hover,\n.laydate_body .laydate_bottom .laydate_time span:hover,\n.laydate_body .laydate_bottom .laydte_hsmtex{background-color:#ECF4FB}\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/layer/laydate/skins/default/laydate.css",
    "content": "/**\n\n @Name： laydate皮肤：墨绿\n @Author：贤心\n @Site：http://sentsin.com/layui/laydate\n\n**/\n\n.laydate-icon{border:1px solid #ccc; background-image:url(icon.png)}\n\n.laydate_body .laydate_bottom #laydate_hms,\n.laydate_body .laydate_time{border:1px solid #ccc;}\n\n.laydate_body .laydate_box,\n.laydate_body .laydate_ym .laydate_yms,\n.laydate_body .laydate_time{box-shadow: 2px 2px 5px rgba(0,0,0,.1);}\n\n.laydate_body .laydate_box{border-top:none; border-bottom:none; background-color:#fff; color:#00625A;}\n.laydate_body .laydate_box input{background:none!important; color:#fff;}\n.laydate_body .laydate_box .laydate_void{color:#00E8D7!important;}\n.laydate_body .laydate_box a, .laydate_body .laydate_box a:hover{color:#00625A;}\n.laydate_body .laydate_box a:hover{color:#666;}\n.laydate_body .laydate_click{background-color:#009F95!important; color:#fff!important;}\n.laydate_body .laydate_top{border-top:1px solid #009F95; background-color:#009F95}\n.laydate_body .laydate_ym{border:1px solid #009F95; background-color:#009F95;}\n.laydate_body .laydate_ym .laydate_yms{border:1px solid #009F95; background-color:#009F95; color:#fff;}\n.laydate_body .laydate_y .laydate_yms a{border-bottom:1px solid #009F95;}\n.laydate_body .laydate_y .laydate_yms .laydate_chdown{border-top:1px solid #009F95; border-bottom:none;}\n.laydate_body .laydate_choose{border-left:1px solid #009F95;}\n.laydate_body .laydate_chprev{border-left:none; border-right:1px solid #009F95;}\n.laydate_body .laydate_choose:hover,\n.laydate_body .laydate_y .laydate_yms a:hover{background-color:#00C1B3;}\n.laydate_body .laydate_chtop cite{border-bottom-color:#fff;}\n.laydate_body .laydate_chdown cite, .laydate_body .laydate_ym label{border-top-color:#fff;}\n.laydate_body .laydate_chprev cite{border-right-style:solid; border-right-color:#fff;}\n.laydate_body .laydate_chnext cite{border-left-style:solid; border-left-color:#fff;}\n.laydate_body .laydate_table{width: 240px!important; margin: 0!important; border:1px solid #ccc; border-top:none; border-bottom:none;}\n.laydate_body .laydate_table td{border:none;  height:21px!important; line-height:21px!important; background-color:#fff; color:#00625A;}\n.laydate_body .laydate_table .laydate_nothis{color:#999;}\n.laydate_body .laydate_table thead{border-bottom:1px solid #ccc; height:21px!important; line-height:21px!important;}\n.laydate_body .laydate_table thead th{}\n.laydate_body .laydate_bottom{border:1px solid #ccc; border-top:none;}\n.laydate_body .laydate_bottom #laydate_hms{background-color:#fff;}\n.laydate_body .laydate_time{background-color:#fff;}\n.laydate_body .laydate_time1{width: 226px!important; height: 152px!important;}\n.laydate_body .laydate_bottom .laydate_sj{width:31px!important; border-right:1px solid #ccc; background-color:#fff;}\n.laydate_body .laydate_bottom input{background-color:#fff; color:#00625A;}\n.laydate_body .laydate_bottom .laydte_hsmtex{border-bottom:1px solid #ccc;}\n.laydate_body .laydate_bottom .laydate_btn{border-right:1px solid #ccc;}\n.laydate_body .laydate_bottom .laydate_v{color:#999}\n.laydate_body .laydate_bottom .laydate_btn a{border: 1px solid #ccc; border-right:none; background-color:#fff;}\n.laydate_body .laydate_bottom .laydate_btn a:hover{background-color:#F6F6F6; color:#00625A;}\n\n.laydate_body .laydate_m .laydate_yms span:hover,\n.laydate_body .laydate_time .laydate_hmsno span:hover,\n.laydate_body .laydate_y .laydate_yms ul li:hover,\n.laydate_body .laydate_table td:hover{background-color:#00C1B3; color:#fff;}\n\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/layer/layim/data/chatlog.json",
    "content": "{\n    \"status\": 1,\n    \"msg\": \"ok\",\n    \"data\": [\n        {\n            \"id\": \"100001\",\n            \"name\": \"Beaut-zihan\",\n            \"time\": \"10:23\",\n            \"face\": \"img/a1.jpg\"\n        },\n        {\n            \"id\": \"100002\",\n            \"name\": \"慕容晓晓\",\n            \"time\": \"昨天\",\n            \"face\": \"img/a2.jpg\"\n        },\n        {\n            \"id\": \"1000033\",\n            \"name\": \"乔峰\",\n            \"time\": \"2014-4.22\",\n            \"face\": \"img/a3.jpg\"\n        },\n        {\n            \"id\": \"10000333\",\n            \"name\": \"高圆圆\",\n            \"time\": \"2014-4.21\",\n            \"face\": \"img/a4.jpg\"\n        }\n    ]\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/layer/layim/data/friend.json",
    "content": "{\n    \"status\": 1,\n    \"msg\": \"ok\",\n    \"data\": [\n        {\n            \"name\": \"销售部\",\n            \"nums\": 36,\n            \"id\": 1,\n            \"item\": [\n                {\n                    \"id\": \"100001\",\n                    \"name\": \"郭敬明\",\n                    \"face\": \"img/a5.jpg\"\n                },\n                {\n                    \"id\": \"100002\",\n                    \"name\": \"作家崔成浩\",\n                    \"face\": \"img/a6.jpg\"\n                },\n                {\n                    \"id\": \"1000022\",\n                    \"name\": \"韩寒\",\n                    \"face\": \"img/a7.jpg\"\n                },\n                {\n                    \"id\": \"10000222\",\n                    \"name\": \"范爷\",\n                    \"face\": \"img/a8.jpg\"\n                },\n                {\n                    \"id\": \"100002222\",\n                    \"name\": \"小马哥\",\n                    \"face\": \"img/a9.jpg\"\n                }\n            ]\n        },\n        {\n            \"name\": \"大学同窗\",\n            \"nums\": 16,\n            \"id\": 2,\n            \"item\": [\n                {\n                    \"id\": \"1000033\",\n                    \"name\": \"苏醒\",\n                    \"face\": \"img/a9.jpg\"\n                },\n                {\n                    \"id\": \"10000333\",\n                    \"name\": \"马云\",\n                    \"face\": \"img/a8.jpg\"\n                },\n                {\n                    \"id\": \"100003\",\n                    \"name\": \"鬼脚七\",\n                    \"face\": \"img/a7.jpg\"\n                },\n                {\n                    \"id\": \"100004\",\n                    \"name\": \"谢楠\",\n                    \"face\": \"img/a6.jpg\"\n                },\n                {\n                    \"id\": \"100005\",\n                    \"name\": \"徐峥\",\n                    \"face\": \"img/a5.jpg\"\n                }\n            ]\n        },\n        {\n            \"name\": \"H+后台主题\",\n            \"nums\": 38,\n            \"id\": 3,\n            \"item\": [\n                {\n                    \"id\": \"100006\",\n                    \"name\": \"柏雪近在它香\",\n                    \"face\": \"img/a4.jpg\"\n                },\n                {\n                    \"id\": \"100007\",\n                    \"name\": \"罗昌平\",\n                    \"face\": \"img/a3.jpg\"\n                },\n                {\n                    \"id\": \"100008\",\n                    \"name\": \"Crystal影子\",\n                    \"face\": \"img/a2.jpg\"\n                },\n                {\n                    \"id\": \"100009\",\n                    \"name\": \"艺小想\",\n                    \"face\": \"img/a1.jpg\"\n                },\n                {\n                    \"id\": \"100010\",\n                    \"name\": \"天猫\",\n                    \"face\": \"img/a8.jpg\"\n                },\n                {\n                    \"id\": \"100011\",\n                    \"name\": \"张泉灵\",\n                    \"face\": \"img/a7.jpg\"\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/layer/layim/data/group.json",
    "content": "{\n    \"status\": 1,\n    \"msg\": \"ok\",\n    \"data\": [\n        {\n            \"name\": \"H+交流群\",\n            \"nums\": 36,\n            \"id\": 1,\n            \"item\": [\n                {\n                    \"id\": \"101\",\n                    \"name\": \"H+ Bug反馈\",\n                    \"face\": \"http://tp2.sinaimg.cn/2211874245/180/40050524279/0\"\n                },\n                {\n                    \"id\": \"102\",\n                    \"name\": \"H+ 技术交流\",\n                    \"face\": \"http://tp3.sinaimg.cn/1820711170/180/1286855219/1\"\n                }\n            ]\n        },\n        {\n            \"name\": \"Bootstrap\",\n            \"nums\": 16,\n            \"id\": 2,\n            \"item\": [\n                {\n                    \"id\": \"103\",\n                    \"name\": \"Bootstrap中文\",\n                    \"face\": \"http://tp2.sinaimg.cn/2211874245/180/40050524279/0\"\n                },\n                {\n                    \"id\": \"104\",\n                    \"name\": \"Bootstrap资源\",\n                    \"face\": \"http://tp3.sinaimg.cn/1820711170/180/1286855219/1\"\n                }\n            ]\n        },\n        {\n            \"name\": \"WebApp\",\n            \"nums\": 106,\n            \"id\": 3,\n            \"item\": [\n                {\n                    \"id\": \"105\",\n                    \"name\": \"移动开发\",\n                    \"face\": \"http://tp2.sinaimg.cn/2211874245/180/40050524279/0\"\n                },\n                {\n                    \"id\": \"106\",\n                    \"name\": \"H5前言\",\n                    \"face\": \"http://tp3.sinaimg.cn/1820711170/180/1286855219/1\"\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/layer/layim/data/groups.json",
    "content": "{\n    \"status\": 1,\n    \"msg\": \"ok\",\n    \"data\": [\n        {\n            \"id\": \"100001\",\n            \"name\": \"無言的蒁説\",\n            \"face\": \"img/a1.jpg\"\n        },\n        {\n            \"id\": \"100002\",\n            \"name\": \"婷宝奢侈品\",\n            \"face\": \"img/a2.jpg\"\n        },\n        {\n            \"id\": \"100003\",\n            \"name\": \"忆恨思爱\",\n            \"face\": \"img/a3.jpg\"\n        },\n        {\n            \"id\": \"100004\",\n            \"name\": \"天涯奥拓慢\",\n            \"face\": \"img/a4.jpg\"\n        },\n        {\n            \"id\": \"100005\",\n            \"name\": \"雨落无声的天空\",\n            \"face\": \"img/a5.jpg\"\n        },\n        {\n            \"id\": \"100006\",\n            \"name\": \"李越LycorisRadiate\",\n            \"face\": \"img/a6.jpg\"\n        },\n        {\n            \"id\": \"100007\",\n            \"name\": \"冯胖妞张直丑\",\n            \"face\": \"img/a7.jpg\"\n        },\n        {\n            \"id\": \"100008\",\n            \"name\": \"陈龙hmmm\",\n            \"face\": \"img/a8.jpg\"\n        },\n        {\n            \"id\": \"100009\",\n            \"name\": \"别闹哥胆儿小\",\n            \"face\": \"img/a9.jpg\"\n        },\n        {\n            \"id\": \"100010\",\n            \"name\": \"锅锅锅锅萌哒哒 \",\n            \"face\": \"img/a10.jpg\"\n        }\n    ]\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/layer/layim/layim.css",
    "content": "\nbody,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,input,button,textarea,p,blockquote,th,td,form{margin:0; padding:0;}\ninput,button,textarea,select,optgroup,option{font-family:inherit; font-size:inherit; font-style:inherit; font-weight:inherit; outline: 0;}\nli{list-style:none;}\n.xxim_icon, .xxim_main i, .layim_chatbox i{position:absolute;}\n.loading{background:url(loading.gif) no-repeat center center;}\n.layim_chatbox a, .layim_chatbox a:hover{color:#343434; text-decoration:none; }\n.layim_zero{position:absolute; width:0; height:0; border-style:dashed; border-color:transparent; overflow:hidden;}\n\n.xxim_main{position:fixed; right:1px; bottom:1px; width:230px; border:1px solid #BEBEBE; background-color:#fff; font-size:12px; box-shadow: 0 0 10px rgba(0,0,0,.2); z-index:99999999}\n.layim_chatbox textarea{resize:none;}\n.xxim_main em, .xxim_main i, .layim_chatbox em, .layim_chatbox i{font-style:normal; font-weight:400;}\n.xxim_main h5{font-size:100%; font-weight:400;}\n\n/* 搜索栏 */\n.xxim_search{position:relative; padding-left:40px; height:40px; border-bottom:1px solid #DCDCDC; background-color:#fff;}\n.xxim_search i{left:10px; top:12px; width:16px; height:16px;font-size: 16px;color:#999;}\n.xxim_search input{border:none; background:none; width: 180px; margin-top:10px; line-height:20px;}\n.xxim_search span{display:none; position:absolute; right:10px; top:10px; height:18px; line-height:18px;width:18px;text-align: center;background-color:#AFAFAF; color:#fff; cursor:pointer; border-radius:2px; font-size:12px; font-weight:900;}\n.xxim_search span:hover{background-color:#FCBE00;}\n\n/* 主面板tab */\n.xxim_tabs{height:45px; border-bottom:1px solid #DBDBDB; background-color:#F4F4F4; font-size:0;}\n.xxim_tabs span{position:relative; display:inline-block; *display:inline; *zoom:1; vertical-align:top; width:76px; height:45px; border-right:1px solid #DBDBDB; cursor:pointer; font-size:12px;}\n.xxim_tabs span i{top:12px; left:50%; width:20px; margin-left:-10px; height:20px;font-size:20px;color:#ccc;}\n.xxim_tabs .xxim_tabnow{height:46px; background-color:#fff;}\n.xxim_tabs .xxim_tabnow i{color:#1ab394;}\n.xxim_tabs .xxim_latechat{border-right:none;}\n.xxim_tabs .xxim_tabfriend i{width:14px; margin-left:-7px;}\n\n/* 主面板列表 */\n.xxim_list{display:none; height:350px; padding:5px 0; overflow:hidden;}\n.xxim_list:hover{ overflow-y:auto;}\n.xxim_list h5{position:relative; padding-left:32px; height:26px; line-height:26px; cursor:pointer; color:#000; font-size:0;}\n.xxim_list h5 span{display:inline-block; *display:inline; *zoom:1; vertical-align:top; max-width:140px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap; font-size:12px;}\n.xxim_list h5 i{left:15px; top:8px; width:10px; height:10px;font-size:10px;color:#666;}\n.xxim_list h5 *{font-size:12px;}\n.xxim_list .xxim_chatlist{display:none;}\n.xxim_list .xxim_liston h5 i{width:8px; height:7px;}\n.xxim_list .xxim_liston .xxim_chatlist{display:block;}\n.xxim_chatlist {}\n.xxim_chatlist li{position:relative; height:40px; line-height:30px; padding:5px 10px; font-size:0; cursor:pointer;}\n.xxim_chatlist li:hover{background-color:#F2F4F8}\n.xxim_chatlist li *{display:inline-block; *display:inline; *zoom:1; vertical-align:top; font-size:12px;}\n.xxim_chatlist li span{padding-left:10px; max-width:120px;  overflow:hidden; text-overflow: ellipsis; white-space:nowrap;}\n.xxim_chatlist li img{width:30px; height:30px;}\n.xxim_chatlist li .xxim_time{position:absolute; right:10px; color:#999;}\n.xxim_list .xxim_errormsg{text-align:center; margin:50px 0; color:#999;}\n.xxim_searchmain{position:absolute; width:230px; height:491px; left:0; top:41px; z-index:10; background-color:#fff;}\n\n/* 主面板底部 */\n.xxim_bottom{height:34px; border-top:1px solid #D0DCF3; background-color:#F2F4F8;}\n.xxim_expend{border-left:1px solid #D0DCF3; border-bottom:1px solid #D0DCF3;}\n.xxim_bottom li{position:relative; width:50px; height:32px; line-height:32px; float:left; border-right:1px solid #D0DCF3;  cursor:pointer;}\n.xxim_bottom li i{ top:9px;}\n.xxim_bottom .xxim_hide{border-right:none;}\n.xxim_bottom .xxim_online{width:72px; padding-left:35px;}\n.xxim_online i{left:13px; width:14px; height:14px;font-size:14px;color:#FFA00A;}\n.xxim_setonline{display:none; position:absolute; left:-79px; bottom:-1px;  border:1px solid #DCDCDC; background-color:#fff;}\n.xxim_setonline span{position:relative; display:block; width:32px;width: 77px; padding:0 10px 0 35px;}\n.xxim_setonline span:hover{background-color:#F2F4F8;}\n.xxim_offline .xxim_nowstate, .xxim_setoffline i{color:#999;}\n.xxim_mymsg i{left:18px; width:14px; height:14px;font-size: 14px;}\n.xxim_mymsg a{position:absolute; left:0; top:0; width:50px; height:32px;}\n.xxim_seter i{left:18px; width:14px; height:14px;font-size: 14px;}\n.xxim_hide i{left:18px; width:14px; height:14px;font-size: 14px;}\n.xxim_show i{}\n.xxim_bottom .xxim_on{position:absolute; left:-17px; top:50%; width:16px;text-align: center;color:#999;line-height: 97px; height:97px; margin-top:-49px;border:solid 1px #BEBEBE;border-right: none; background:#F2F4F8;}\n.xxim_bottom .xxim_off{}\n\n/* 聊天窗口 */\n.layim_chatbox{width:620px; border:1px solid #BEBEBE; background-color:#fff; font-size:12px; box-shadow: 0 0 10px rgba(0,0,0,.2);}\n.layim_chatbox h6{position:relative; height:40px; border-bottom:1px solid #D9D9D9; background-color:#FCFDFA}\n.layim_move{position:absolute; height:40px; width: 620px; z-index:0;}\n.layim_face{position:absolute; bottom:-1px; left:10px; width:64px; height:64px;padding:1px;background: #fff; border:1px solid #ccc;}\n.layim_face img{width:60px; height:60px;}\n.layim_names{position:absolute; left:90px; max-width:300px; line-height:40px; color:#000; overflow:hidden; text-overflow: ellipsis; white-space:nowrap; font-size:14px;}\n.layim_rightbtn{position:absolute; right:15px; top:12px; font-size:20px;}\n.layim_rightbtn i{position:relative; width:16px; height:16px; display:inline-block; *display:inline; *zoom:1; vertical-align:top; cursor:pointer; transition: all .3s;text-align: center;line-height: 16px;}\n.layim_rightbtn .layim_close{background: #FFA00A;color:#fff;}\n.layim_rightbtn .layim_close:hover{-webkit-transform: rotate(180deg); -moz-transform: rotate(180deg);}\n.layim_rightbtn .layer_setmin{margin-right:5px;color:#999;font-size:14px;font-weight: 700;}\n.layim_chat, .layim_chatmore,.layim_groups{height:450px; overflow:hidden;}\n.layim_chatmore{display:none; float:left; width:135px; border-right:1px solid #BEBEBE; background-color:#F2F2F2}\n.layim_chatlist li, .layim_groups li{position:relative; height:30px; line-height:30px; padding:0 10px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap; cursor:pointer;}\n.layim_chatlist li{padding:0 20px 0 10px;}\n.layim_chatlist li:hover{background-color:#E3E3E3;}\n.layim_chatlist li span{display:inline-block; *display:inline; *zoom:1; vertical-align:top; width:90px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap;}\n.layim_chatlist li em{display:none; position:absolute; top:6px; right:10px; height:18px; line-height:18px;width:18px;text-align: center;font-size:14px;font-weight:900; border-radius:3px;}\n.layim_chatlist li em:hover{background-color: #FCBE00; color:#fff;}\n.layim_chatlist .layim_chatnow,.layim_chatlist .layim_chatnow:hover{/*border-top:1px solid #D9D9D9; border-bottom:1px solid #D9D9D9;*/ background-color:#fff;}\n.layim_chat{}\n.layim_chatarea{height:280px;}\n.layim_chatview{display:none; height:280px; overflow:hidden;}\n.layim_chatmore:hover, .layim_groups:hover, .layim_chatview:hover{overflow-y:auto;}\n.layim_chatview li{margin-bottom:10px; clear:both; *zoom:1;}\n.layim_chatview li:after{content:'\\20'; clear:both; *zoom:1; display:block; height:0;}\n\n.layim_chatthis{display:block;}\n.layim_chatuser{float:left; padding:15px; font-size:0;}\n.layim_chatuser *{display:inline-block; *display:inline; *zoom:1; vertical-align:top; line-height:30px; font-size:12px; padding-right:10px;}\n.layim_chatuser img{width:30px; height:30px;padding-right: 0;margin-right: 15px;}\n.layim_chatuser .layim_chatname{max-width:230px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap;}\n.layim_chatuser .layim_chattime{color:#999; padding-left:10px;}\n.layim_chatsay{position:relative; float:left; margin:0 15px; padding:10px; line-height:20px; background-color:#F3F3F3; border-radius:3px; clear:both;}\n.layim_chatsay .layim_zero{left:5px; top:-8px; border-width:8px; border-right-style:solid; border-right-color:#F3F3F3;}\n.layim_chateme .layim_chatuser{float:right;}\n.layim_chateme .layim_chatuser *{padding-right:0; padding-left:10px;}\n.layim_chateme .layim_chatuser img{margin-left:15px;padding-left: 0;}\n.layim_chateme .layim_chatsay .layim_zero{left:auto; right:10px;}\n.layim_chateme .layim_chatuser .layim_chattime{padding-left:0; padding-right:10px;}\n.layim_chateme .layim_chatsay{float:right; background-color:#EBFBE3}\n.layim_chateme .layim_zero{border-right-color:#EBFBE3;}\n.layim_groups{display:none; float:right; width:130px; border-left:1px solid #D9D9D9; background-color:#fff;}\n.layim_groups ul{display:none;}\n.layim_groups ul.layim_groupthis{display:block;}\n.layim_groups li *{display:inline-block; *display:inline; *zoom:1; vertical-align:top; margin-right:10px;}\n.layim_groups li img{width:20px; height:20px; margin-top:5px;}\n.layim_groups li span{max-width:80px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap;}\n.layim_groups li:hover{background-color:#F3F3F3;}\n.layim_groups .layim_errors{text-align:center; color:#999;}\n.layim_tool{position:relative; height:35px; line-height:35px; padding-left:10px; background-color:#F3F3F3;}\n.layim_tool i{position:relative; top:10px; display:inline-block; *display:inline; *zoom:1; vertical-align:top; width:16px; height:16px; margin-right:10px; cursor:pointer;font-size:16px;color:#999;font-weight: 700;}\n.layim_tool i:hover{color:#FFA00A;}\n.layim_tool .layim_seechatlog{position:absolute; right:15px;}\n.layim_tool .layim_seechatlog i{}\n.layim_write{display:block; border:none; width:98%; height:90px; line-height:20px; margin:5px auto 0;}\n.layim_send{position:relative; height:40px; background-color:#F3F3F3;}\n.layim_sendbtn{position:absolute; height:26px; line-height:26px; right:10px; top:8px; padding:0 40px 0 20px; background-color:#FFA00A; color:#fff; border-radius:3px; cursor:pointer;}\n.layim_enter{position:absolute; right:0; border-left:1px solid #FFB94F; width:24px; height:26px;}\n.layim_enter:hover{background-color:#E68A00; border-radius:0 3px 3px 0;}\n.layim_enter .layim_zero{left:7px; top:11px; border-width:5px; border-top-style:solid; border-top-color:#FFE0B3;}\n.layim_sendtype{display:none; position:absolute; right:10px; bottom:37px; border:1px solid #D9D9D9; background-color:#fff; text-align:left;}\n.layim_sendtype span{display:block; line-height:24px; padding:0 10px 0 25px; cursor:pointer;}\n.layim_sendtype span:hover{background-color:#F3F3F3;}\n.layim_sendtype span i{left:5px;}\n\n.layim_min{display:none; position:absolute; left:-190px; bottom:-1px; width:160px; height:32px; line-height:32px; padding:0 10px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap; border:1px solid #ccc; box-shadow: 0 0 5px rgba(0,0,75,.2); background-color:#FCFDFA; cursor:pointer;}\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/layer/layim/layim.js",
    "content": "/*\n\n @Name: layui WebIM 1.0.0\n @Author：贤心\n @Date: 2014-04-25\n @Blog: http://sentsin.com\n\n */\n\n;!function(win, undefined){\n\nvar config = {\n    msgurl: 'mailbox.html?msg=',\n    chatlogurl: 'mailbox.html?user=',\n    aniTime: 200,\n    right: -232,\n    api: {\n        friend: 'js/plugins/layer/layim/data/friend.json', //好友列表接口\n        group: 'js/plugins/layer/layim/data/group.json', //群组列表接口\n        chatlog: 'js/plugins/layer/layim/data/chatlog.json', //聊天记录接口\n        groups: 'js/plugins/layer/layim/data/groups.json', //群组成员接口\n        sendurl: '' //发送消息接口\n    },\n    user: { //当前用户信息\n        name: '游客',\n        face: 'img/a1.jpg'\n    },\n\n    //自动回复内置文案，也可动态读取数据库配置\n    autoReplay: [\n        '您好，我现在有事不在，一会再和您联系。',\n        '你没发错吧？',\n        '洗澡中，请勿打扰，偷窥请购票，个体四十，团体八折，订票电话：一般人我不告诉他！',\n        '你好，我是主人的美女秘书，有什么事就跟我说吧，等他回来我会转告他的。',\n        '我正在拉磨，没法招呼您，因为我们家毛驴去动物保护协会把我告了，说我剥夺它休产假的权利。',\n        '<（@￣︶￣@）>',\n        '你要和我说话？你真的要和我说话？你确定自己想说吗？你一定非说不可吗？那你说吧，这是自动回复。',\n        '主人正在开机自检，键盘鼠标看好机会出去凉快去了，我是他的电冰箱，我打字比较慢，你慢慢说，别急……',\n        '(*^__^*) 嘻嘻，是贤心吗？'\n    ],\n\n\n    chating: {},\n    hosts: (function(){\n        var dk = location.href.match(/\\:\\d+/);\n        dk = dk ? dk[0] : '';\n        return 'http://' + document.domain + dk + '/';\n    })(),\n    json: function(url, data, callback, error){\n        return $.ajax({\n            type: 'POST',\n            url: url,\n            data: data,\n            dataType: 'json',\n            success: callback,\n            error: error\n        });\n    },\n    stopMP: function(e){\n        e ? e.stopPropagation() : e.cancelBubble = true;\n    }\n}, dom = [$(window), $(document), $('html'), $('body')], xxim = {};\n\n//主界面tab\nxxim.tabs = function(index){\n    var node = xxim.node;\n    node.tabs.eq(index).addClass('xxim_tabnow').siblings().removeClass('xxim_tabnow');\n    node.list.eq(index).show().siblings('.xxim_list').hide();\n    if(node.list.eq(index).find('li').length === 0){\n        xxim.getDates(index);\n    }\n};\n\n//节点\nxxim.renode = function(){\n    var node = xxim.node = {\n        tabs: $('#xxim_tabs>span'),\n        list: $('.xxim_list'),\n        online: $('.xxim_online'),\n        setonline: $('.xxim_setonline'),\n        onlinetex: $('#xxim_onlinetex'),\n        xximon: $('#xxim_on'),\n        layimFooter: $('#xxim_bottom'),\n        xximHide: $('#xxim_hide'),\n        xximSearch: $('#xxim_searchkey'),\n        searchMian: $('#xxim_searchmain'),\n        closeSearch: $('#xxim_closesearch'),\n        layimMin: $('#layim_min')\n    };\n};\n\n//主界面缩放\nxxim.expend = function(){\n    var node = xxim.node;\n    if(xxim.layimNode.attr('state') !== '1'){\n        xxim.layimNode.stop().animate({right: config.right}, config.aniTime, function(){\n            node.xximon.addClass('xxim_off');\n            try{\n                localStorage.layimState = 1;\n            }catch(e){}\n            xxim.layimNode.attr({state: 1});\n            node.layimFooter.addClass('xxim_expend').stop().animate({marginLeft: config.right}, config.aniTime/2);\n            node.xximHide.addClass('xxim_show');\n        });\n    } else {\n        xxim.layimNode.stop().animate({right: 1}, config.aniTime, function(){\n            node.xximon.removeClass('xxim_off');\n            try{\n                localStorage.layimState = 2;\n            }catch(e){}\n            xxim.layimNode.removeAttr('state');\n            node.layimFooter.removeClass('xxim_expend');\n            node.xximHide.removeClass('xxim_show');\n        });\n        node.layimFooter.stop().animate({marginLeft: 0}, config.aniTime);\n    }\n};\n\n//初始化窗口格局\nxxim.layinit = function(){\n    var node = xxim.node;\n\n    //主界面\n    try{\n        /*\n        if(!localStorage.layimState){\n            config.aniTime = 0;\n            localStorage.layimState = 1;\n        }\n        */\n        if(localStorage.layimState === '1'){\n            xxim.layimNode.attr({state: 1}).css({right: config.right});\n            node.xximon.addClass('xxim_off');\n            node.layimFooter.addClass('xxim_expend').css({marginLeft: config.right});\n            node.xximHide.addClass('xxim_show');\n        }\n    }catch(e){\n        //layer.msg(e.message, 5, -1);\n    }\n};\n\n//聊天窗口\nxxim.popchat = function(param){\n    var node = xxim.node, log = {};\n\n    log.success = function(layero){\n        layer.setMove();\n\n        xxim.chatbox = layero.find('#layim_chatbox');\n        log.chatlist = xxim.chatbox.find('.layim_chatmore>ul');\n\n        log.chatlist.html('<li data-id=\"'+ param.id +'\" type=\"'+ param.type +'\"  id=\"layim_user'+ param.type + param.id +'\"><span>'+ param.name +'</span><em>×</em></li>')\n        xxim.tabchat(param, xxim.chatbox);\n\n        //最小化聊天窗\n        xxim.chatbox.find('.layer_setmin').on('click', function(){\n            var indexs = layero.attr('times');\n            layero.hide();\n            node.layimMin.text(xxim.nowchat.name).show();\n        });\n\n        //关闭窗口\n        xxim.chatbox.find('.layim_close').on('click', function(){\n            var indexs = layero.attr('times');\n            layer.close(indexs);\n            xxim.chatbox = null;\n            config.chating = {};\n            config.chatings = 0;\n        });\n\n        //关闭某个聊天\n        log.chatlist.on('mouseenter', 'li', function(){\n            $(this).find('em').show();\n        }).on('mouseleave', 'li', function(){\n            $(this).find('em').hide();\n        });\n        log.chatlist.on('click', 'li em', function(e){\n            var parents = $(this).parent(), dataType = parents.attr('type');\n            var dataId = parents.attr('data-id'), index = parents.index();\n            var chatlist = log.chatlist.find('li'), indexs;\n\n            config.stopMP(e);\n\n            delete config.chating[dataType + dataId];\n            config.chatings--;\n\n            parents.remove();\n            $('#layim_area'+ dataType + dataId).remove();\n            if(dataType === 'group'){\n                $('#layim_group'+ dataType + dataId).remove();\n            }\n\n            if(parents.hasClass('layim_chatnow')){\n                if(index === config.chatings){\n                    indexs = index - 1;\n                } else {\n                    indexs = index + 1;\n                }\n                xxim.tabchat(config.chating[chatlist.eq(indexs).attr('type') + chatlist.eq(indexs).attr('data-id')]);\n            }\n\n            if(log.chatlist.find('li').length === 1){\n                log.chatlist.parent().hide();\n            }\n        });\n\n        //聊天选项卡\n        log.chatlist.on('click', 'li', function(){\n            var othis = $(this), dataType = othis.attr('type'), dataId = othis.attr('data-id');\n            xxim.tabchat(config.chating[dataType + dataId]);\n        });\n\n        //发送热键切换\n        log.sendType = $('#layim_sendtype'), log.sendTypes = log.sendType.find('span');\n        $('#layim_enter').on('click', function(e){\n            config.stopMP(e);\n            log.sendType.show();\n        });\n        log.sendTypes.on('click', function(){\n            log.sendTypes.find('i').text('')\n            $(this).find('i').text('√');\n        });\n\n        xxim.transmit();\n    };\n\n    log.html = '<div class=\"layim_chatbox\" id=\"layim_chatbox\">'\n            +'<h6>'\n            +'<span class=\"layim_move\"></span>'\n            +'    <a href=\"'+ param.url +'\" class=\"layim_face\" target=\"_blank\"><img src=\"'+ param.face +'\" ></a>'\n            +'    <a href=\"'+ param.url +'\" class=\"layim_names\" target=\"_blank\">'+ param.name +'</a>'\n            +'    <span class=\"layim_rightbtn\">'\n            +'        <i class=\"layer_setmin\">—</i>'\n            +'        <i class=\"layim_close\">&times;</i>'\n            +'    </span>'\n            +'</h6>'\n            +'<div class=\"layim_chatmore\" id=\"layim_chatmore\">'\n            +'    <ul class=\"layim_chatlist\"></ul>'\n            +'</div>'\n            +'<div class=\"layim_groups\" id=\"layim_groups\"></div>'\n            +'<div class=\"layim_chat\">'\n            +'    <div class=\"layim_chatarea\" id=\"layim_chatarea\">'\n            +'        <ul class=\"layim_chatview layim_chatthis\"  id=\"layim_area'+ param.type + param.id +'\"></ul>'\n            +'    </div>'\n            +'    <div class=\"layim_tool\">'\n            +'        <i class=\"layim_addface fa fa-meh-o\" title=\"发送表情\"></i>'\n            +'        <a href=\"javascript:;\"><i class=\"layim_addimage fa fa-picture-o\" title=\"上传图片\"></i></a>'\n            +'        <a href=\"javascript:;\"><i class=\"layim_addfile fa fa-paperclip\" title=\"上传附件\"></i></a>'\n            +'        <a href=\"\" target=\"_blank\" class=\"layim_seechatlog\"><i class=\"fa fa-comment-o\"></i>聊天记录</a>'\n            +'    </div>'\n            +'    <textarea class=\"layim_write\" id=\"layim_write\"></textarea>'\n            +'    <div class=\"layim_send\">'\n            +'        <div class=\"layim_sendbtn\" id=\"layim_sendbtn\">发送<span class=\"layim_enter\" id=\"layim_enter\"><em class=\"layim_zero\"></em></span></div>'\n            +'        <div class=\"layim_sendtype\" id=\"layim_sendtype\">'\n            +'            <span><i>√</i>按Enter键发送</span>'\n            +'            <span><i></i>按Ctrl+Enter键发送</span>'\n            +'        </div>'\n            +'    </div>'\n            +'</div>'\n            +'</div>';\n\n    if(config.chatings < 1){\n        $.layer({\n            type: 1,\n            border: [0],\n            title: false,\n            shade: [0],\n            area: ['620px', '493px'],\n            move: '.layim_chatbox .layim_move',\n            moveType: 1,\n            closeBtn: false,\n            offset: [(($(window).height() - 493)/2)+'px', ''],\n            page: {\n                html: log.html\n            }, success: function(layero){\n                log.success(layero);\n            }\n        })\n    } else {\n        log.chatmore = xxim.chatbox.find('#layim_chatmore');\n        log.chatarea = xxim.chatbox.find('#layim_chatarea');\n\n        log.chatmore.show();\n\n        log.chatmore.find('ul>li').removeClass('layim_chatnow');\n        log.chatmore.find('ul').append('<li data-id=\"'+ param.id +'\" type=\"'+ param.type +'\" id=\"layim_user'+ param.type + param.id +'\" class=\"layim_chatnow\"><span>'+ param.name +'</span><em>×</em></li>');\n\n        log.chatarea.find('.layim_chatview').removeClass('layim_chatthis');\n        log.chatarea.append('<ul class=\"layim_chatview layim_chatthis\" id=\"layim_area'+ param.type + param.id +'\"></ul>');\n\n        xxim.tabchat(param);\n    }\n\n    //群组\n    log.chatgroup = xxim.chatbox.find('#layim_groups');\n    if(param.type === 'group'){\n        log.chatgroup.find('ul').removeClass('layim_groupthis');\n        log.chatgroup.append('<ul class=\"layim_groupthis\" id=\"layim_group'+ param.type + param.id +'\"></ul>');\n        xxim.getGroups(param);\n    }\n    //点击群员切换聊天窗\n    log.chatgroup.on('click', 'ul>li', function(){\n        xxim.popchatbox($(this));\n    });\n};\n\n//定位到某个聊天队列\nxxim.tabchat = function(param){\n    var node = xxim.node, log = {}, keys = param.type + param.id;\n    xxim.nowchat = param;\n\n    xxim.chatbox.find('#layim_user'+ keys).addClass('layim_chatnow').siblings().removeClass('layim_chatnow');\n    xxim.chatbox.find('#layim_area'+ keys).addClass('layim_chatthis').siblings().removeClass('layim_chatthis');\n    xxim.chatbox.find('#layim_group'+ keys).addClass('layim_groupthis').siblings().removeClass('layim_groupthis');\n\n    xxim.chatbox.find('.layim_face>img').attr('src', param.face);\n    xxim.chatbox.find('.layim_face, .layim_names').attr('href', param.href);\n    xxim.chatbox.find('.layim_names').text(param.name);\n\n    xxim.chatbox.find('.layim_seechatlog').attr('href', config.chatlogurl + param.id);\n\n    log.groups = xxim.chatbox.find('.layim_groups');\n    if(param.type === 'group'){\n        log.groups.show();\n    } else {\n        log.groups.hide();\n    }\n\n    $('#layim_write').focus();\n\n};\n\n//弹出聊天窗\nxxim.popchatbox = function(othis){\n    var node = xxim.node, dataId = othis.attr('data-id'), param = {\n        id: dataId, //用户ID\n        type: othis.attr('type'),\n        name: othis.find('.xxim_onename').text(),  //用户名\n        face: othis.find('.xxim_oneface').attr('src'),  //用户头像\n        href: 'profile.html?user=' + dataId //用户主页\n    }, key = param.type + dataId;\n    if(!config.chating[key]){\n        xxim.popchat(param);\n        config.chatings++;\n    } else {\n        xxim.tabchat(param);\n    }\n    config.chating[key] = param;\n\n    var chatbox = $('#layim_chatbox');\n    if(chatbox[0]){\n        node.layimMin.hide();\n        chatbox.parents('.xubox_layer').show();\n    }\n};\n\n//请求群员\nxxim.getGroups = function(param){\n    var keys = param.type + param.id, str = '',\n    groupss = xxim.chatbox.find('#layim_group'+ keys);\n    groupss.addClass('loading');\n    config.json(config.api.groups, {}, function(datas){\n        if(datas.status === 1){\n            var ii = 0, lens = datas.data.length;\n            if(lens > 0){\n                for(; ii < lens; ii++){\n                    str += '<li data-id=\"'+ datas.data[ii].id +'\" type=\"one\"><img src=\"'+ datas.data[ii].face +'\" class=\"xxim_oneface\"><span class=\"xxim_onename\">'+ datas.data[ii].name +'</span></li>';\n                }\n            } else {\n                str = '<li class=\"layim_errors\">没有群员</li>';\n            }\n\n        } else {\n            str = '<li class=\"layim_errors\">'+ datas.msg +'</li>';\n        }\n        groupss.removeClass('loading');\n        groupss.html(str);\n    }, function(){\n        groupss.removeClass('loading');\n        groupss.html('<li class=\"layim_errors\">请求异常</li>');\n    });\n};\n\n//消息传输\nxxim.transmit = function(){\n    var node = xxim.node, log = {};\n    node.sendbtn = $('#layim_sendbtn');\n    node.imwrite = $('#layim_write');\n\n    //发送\n    log.send = function(){\n        var data = {\n            content: node.imwrite.val(),\n            id: xxim.nowchat.id,\n            sign_key: '', //密匙\n            _: +new Date\n        };\n\n        if(data.content.replace(/\\s/g, '') === ''){\n            layer.tips('说点啥呗！', '#layim_write', 2);\n            node.imwrite.focus();\n        } else {\n            //此处皆为模拟\n            var keys = xxim.nowchat.type + xxim.nowchat.id;\n\n            //聊天模版\n            log.html = function(param, type){\n                return '<li class=\"'+ (type === 'me' ? 'layim_chateme' : '') +'\">'\n                    +'<div class=\"layim_chatuser\">'\n                        + function(){\n                            if(type === 'me'){\n                                return '<span class=\"layim_chattime\">'+ param.time +'</span>'\n                                       +'<span class=\"layim_chatname\">'+ param.name +'</span>'\n                                       +'<img src=\"'+ param.face +'\" >';\n                            } else {\n                                return '<img src=\"'+ param.face +'\" >'\n                                       +'<span class=\"layim_chatname\">'+ param.name +'</span>'\n                                       +'<span class=\"layim_chattime\">'+ param.time +'</span>';\n                            }\n                        }()\n                    +'</div>'\n                    +'<div class=\"layim_chatsay\">'+ param.content +'<em class=\"layim_zero\"></em></div>'\n                +'</li>';\n            };\n\n            log.imarea = xxim.chatbox.find('#layim_area'+ keys);\n\n            log.imarea.append(log.html({\n                time: '2014-04-26 0:37',\n                name: config.user.name,\n                face: config.user.face,\n                content: data.content\n            }, 'me'));\n            node.imwrite.val('').focus();\n            log.imarea.scrollTop(log.imarea[0].scrollHeight);\n\n            setTimeout(function(){\n                log.imarea.append(log.html({\n                    time: '2014-04-26 0:38',\n                    name: xxim.nowchat.name,\n                    face: xxim.nowchat.face,\n                    content: config.autoReplay[(Math.random()*config.autoReplay.length) | 0]\n                }));\n                log.imarea.scrollTop(log.imarea[0].scrollHeight);\n            }, 500);\n\n            /*\n            that.json(config.api.sendurl, data, function(datas){\n\n            });\n            */\n        }\n\n    };\n    node.sendbtn.on('click', log.send);\n\n    node.imwrite.keyup(function(e){\n        if(e.keyCode === 13){\n            log.send();\n        }\n    });\n};\n\n//事件\nxxim.event = function(){\n    var node = xxim.node;\n\n    //主界面tab\n    node.tabs.eq(0).addClass('xxim_tabnow');\n    node.tabs.on('click', function(){\n        var othis = $(this), index = othis.index();\n        xxim.tabs(index);\n    });\n\n    //列表展收\n    node.list.on('click', 'h5', function(){\n        var othis = $(this), chat = othis.siblings('.xxim_chatlist'), parentss = othis.find(\"i\");\n        if(parentss.hasClass('fa-caret-down')){\n            chat.hide();\n            parentss.attr('class','fa fa-caret-right');\n        } else {\n            chat.show();\n            parentss.attr('class','fa fa-caret-down');\n        }\n    });\n\n    //设置在线隐身\n    node.online.on('click', function(e){\n        config.stopMP(e);\n        node.setonline.show();\n    });\n    node.setonline.find('span').on('click', function(e){\n        var index = $(this).index();\n        config.stopMP(e);\n        if(index === 0){\n            node.onlinetex.html('在线');\n            node.online.removeClass('xxim_offline');\n        } else if(index === 1) {\n            node.onlinetex.html('隐身');\n            node.online.addClass('xxim_offline');\n        }\n        node.setonline.hide();\n    });\n\n    node.xximon.on('click', xxim.expend);\n    node.xximHide.on('click', xxim.expend);\n\n    //搜索\n    node.xximSearch.keyup(function(){\n        var val = $(this).val().replace(/\\s/g, '');\n        if(val !== ''){\n            node.searchMian.show();\n            node.closeSearch.show();\n            //此处的搜索ajax参考xxim.getDates\n            node.list.eq(3).html('<li class=\"xxim_errormsg\">没有符合条件的结果</li>');\n        } else {\n            node.searchMian.hide();\n            node.closeSearch.hide();\n        }\n    });\n    node.closeSearch.on('click', function(){\n        $(this).hide();\n        node.searchMian.hide();\n        node.xximSearch.val('').focus();\n    });\n\n    //弹出聊天窗\n    config.chatings = 0;\n    node.list.on('click', '.xxim_childnode', function(){\n        var othis = $(this);\n        xxim.popchatbox(othis);\n    });\n\n    //点击最小化栏\n    node.layimMin.on('click', function(){\n        $(this).hide();\n        $('#layim_chatbox').parents('.xubox_layer').show();\n    });\n\n\n    //document事件\n    dom[1].on('click', function(){\n        node.setonline.hide();\n        $('#layim_sendtype').hide();\n    });\n};\n\n//请求列表数据\nxxim.getDates = function(index){\n    var api = [config.api.friend, config.api.group, config.api.chatlog],\n        node = xxim.node, myf = node.list.eq(index);\n    myf.addClass('loading');\n    config.json(api[index], {}, function(datas){\n        if(datas.status === 1){\n            var i = 0, myflen = datas.data.length, str = '', item;\n            if(myflen > 1){\n                if(index !== 2){\n                    for(; i < myflen; i++){\n                        str += '<li data-id=\"'+ datas.data[i].id +'\" class=\"xxim_parentnode\">'\n                            +'<h5><i class=\"fa fa-caret-right\"></i><span class=\"xxim_parentname\">'+ datas.data[i].name +'</span><em class=\"xxim_nums\">（'+ datas.data[i].nums +'）</em></h5>'\n                            +'<ul class=\"xxim_chatlist\">';\n                        item = datas.data[i].item;\n                        for(var j = 0; j < item.length; j++){\n                            str += '<li data-id=\"'+ item[j].id +'\" class=\"xxim_childnode\" type=\"'+ (index === 0 ? 'one' : 'group') +'\"><img src=\"'+ item[j].face +'\" class=\"xxim_oneface\"><span class=\"xxim_onename\">'+ item[j].name +'</span></li>';\n                        }\n                        str += '</ul></li>';\n                    }\n                } else {\n                    str += '<li class=\"xxim_liston\">'\n                        +'<ul class=\"xxim_chatlist\">';\n                    for(; i < myflen; i++){\n                        str += '<li data-id=\"'+ datas.data[i].id +'\" class=\"xxim_childnode\" type=\"one\"><img src=\"'+ datas.data[i].face +'\"  class=\"xxim_oneface\"><span  class=\"xxim_onename\">'+ datas.data[i].name +'</span><em class=\"xxim_time\">'+ datas.data[i].time +'</em></li>';\n                    }\n                    str += '</ul></li>';\n                }\n                myf.html(str);\n            } else {\n                myf.html('<li class=\"xxim_errormsg\">没有任何数据</li>');\n            }\n            myf.removeClass('loading');\n        } else {\n            myf.html('<li class=\"xxim_errormsg\">'+ datas.msg +'</li>');\n        }\n    }, function(){\n        myf.html('<li class=\"xxim_errormsg\">请求失败</li>');\n        myf.removeClass('loading');\n    });\n};\n\n//渲染骨架\nxxim.view = (function(){\n    var xximNode = xxim.layimNode = $('<div id=\"xximmm\" class=\"xxim_main\">'\n            +'<div class=\"xxim_top\" id=\"xxim_top\">'\n            +'  <div class=\"xxim_search\"><i class=\"fa fa-search\"></i><input id=\"xxim_searchkey\" /><span id=\"xxim_closesearch\">×</span></div>'\n            +'  <div class=\"xxim_tabs\" id=\"xxim_tabs\"><span class=\"xxim_tabfriend\" title=\"好友\"><i class=\"fa fa-user\"></i></span><span class=\"xxim_tabgroup\" title=\"群组\"><i class=\"fa fa-users\"></i></span><span class=\"xxim_latechat\"  title=\"最近聊天\"><i class=\"fa fa-clock-o\"></i></span></div>'\n            +'  <ul class=\"xxim_list\" style=\"display:block\"></ul>'\n            +'  <ul class=\"xxim_list\"></ul>'\n            +'  <ul class=\"xxim_list\"></ul>'\n            +'  <ul class=\"xxim_list xxim_searchmain\" id=\"xxim_searchmain\"></ul>'\n            +'</div>'\n            +'<ul class=\"xxim_bottom\" id=\"xxim_bottom\">'\n            +'<li class=\"xxim_online\" id=\"xxim_online\">'\n                +'<i class=\"xxim_nowstate fa fa-check-circle\"></i><span id=\"xxim_onlinetex\">在线</span>'\n                +'<div class=\"xxim_setonline\">'\n                    +'<span><i class=\"fa fa-check-circle\"></i>在线</span>'\n                    +'<span class=\"xxim_setoffline\"><i class=\"fa fa-check-circle\"></i>隐身</span>'\n                +'</div>'\n            +'</li>'\n            +'<li class=\"xxim_mymsg\" id=\"xxim_mymsg\" title=\"我的私信\"><i class=\"fa fa-comment\"></i><a href=\"'+ config.msgurl +'\" target=\"_blank\"></a></li>'\n            +'<li class=\"xxim_seter\" id=\"xxim_seter\" title=\"设置\">'\n                +'<i class=\"fa fa-gear\"></i>'\n                +'<div>'\n\n                +'</div>'\n            +'</li>'\n            +'<li class=\"xxim_hide\" id=\"xxim_hide\"><i class=\"fa fa-exchange\"></i></li>'\n            +'<li id=\"xxim_on\" class=\"xxim_icon xxim_on fa fa-ellipsis-v\"></li>'\n            +'<div class=\"layim_min\" id=\"layim_min\"></div>'\n        +'</ul>'\n    +'</div>');\n    dom[3].append(xximNode);\n\n    xxim.renode();\n    xxim.getDates(0);\n    xxim.event();\n    xxim.layinit();\n}());\n\n}(window);\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/layer/skin/layer.css",
    "content": "/*!\n\n @Name: layer's style\n @Author: 贤心\n @Blog： sentsin.com\n\n */*html{background-image:url(about:blank);background-attachment:fixed}html #layui_layer_skinlayercss{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+\"px\")}.layui-layer{top:150px;left:50%;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;box-shadow:1px 1px 50px rgba(0,0,0,.3);border-radius:2px;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.3);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-moves{position:absolute;border:3px solid #666;border:3px solid rgba(0,0,0,.5);cursor:move;background-color:#fff;background-color:rgba(255,255,255,.3);filter:alpha(opacity=50)}.layui-layer-load{background:url(default/loading-0.gif) center center no-repeat #fff}.layui-layer-ico{background:url(default/icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}@-webkit-keyframes bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layui-anim{-webkit-animation-name:bounceIn;animation-name:bounceIn}@-webkit-keyframes bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.03);transform:scale(1.03)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.03);-ms-transform:scale(1.03);transform:scale(1.03)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layui-anim-close{-webkit-animation-name:bounceOut;animation-name:bounceOut;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layui-anim-01{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layui-anim-02{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layui-anim-03{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layui-anim-04{-webkit-animation-name:rollIn;animation-name:rollIn}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-anim-05{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layui-anim-06{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:#F8F8F8}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:0 -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-150px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-181px -31px}.layui-layer-btn{text-align:right;padding:0 10px 12px;pointer-events:auto}.layui-layer-btn a{height:28px;line-height:28px;margin:0 6px;padding:0 15px;border:1px solid #dedede;background-color:#f1f1f1;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.7}.layui-layer-btn .layui-layer-btn0{border-color:#4898d5;background-color:#2e8ded;color:#fff}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;font-size:14px;overflow:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe .layui-layer-content{overflow:hidden}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(default/loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(default/loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(default/loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:5px 10px;font-size:12px;_float:left;border-radius:3px;box-shadow:1px 1px 3px rgba(0,0,0,.3);background-color:#F90;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#F90}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:1px;border-bottom-style:solid;border-bottom-color:#F90}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-lan .layui-layer-btn{padding:10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#BBB5B5;border:none}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/layer/skin/layer.ext.css",
    "content": "/*!\n\n @Name: layer拓展样式\n @Date: 2012.12.13\n @Author: 贤心\n @blog: sentsin.com\n\n */.layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span{text-overflow:ellipsis;white-space:nowrap}.layui-layer-iconext{background:url(default/icon-ext.png) no-repeat}html #layui_layer_skinlayerextcss{display:none;position:absolute;width:1989px}.layui-layer-prompt .layui-layer-input{display:block;width:220px;height:30px;margin:0 auto;line-height:30px;padding:0 5px;border:1px solid #ccc;box-shadow:1px 1px 5px rgba(0,0,0,.1) inset;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;border-bottom:1px solid #ccc;background-color:#eee;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;cursor:default;overflow:hidden}.layui-layer-tab .layui-layer-title span.layui-layer-tabnow{height:43px;border-left:1px solid #ccc;border-right:1px solid #ccc;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.xubox_tab_layer{display:block}.xubox_tabclose{position:absolute;right:10px;top:5px;cursor:pointer}.layui-layer-photos{-webkit-animation-duration:1s;animation-duration:1s;background:url(default/xubox_loading1.gif) center center no-repeat #000}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/layer/skin/moon/style.css",
    "content": "/*\n * layer皮肤\n * 作者：一☆隐☆一\n * QQ:9073194\n * 请保留这里的信息 谢谢！虽然你不保留我也不能把你怎么样！\n */\n\nhtml #layui_layer_skinmoonstylecss {\n\tdisplay: none;\n\tposition: absolute;\n\twidth: 1989px;\n}\nbody .layer-ext-moon[type=\"dialog\"] {\n\tmin-width: 320px;\n}\nbody .layer-ext-moon-msg[type=\"dialog\"]{min-width:200px;}\nbody .layer-ext-moon .layui-layer-title {\n\tbackground: #f6f6f6;\n\tcolor: #212a31;\n\tfont-size: 16px;\n\tfont-weight: bold;\n\theight: 46px;\n\tline-height: 46px;\n}\n\n\n\nbody .layer-ext-moon .layui-layer-content .layui-layer-ico {\n\theight: 32px;\n\twidth: 32px;\n\ttop:18.5px;\n}\nbody .layer-ext-moon .layui-layer-ico0 {\n\tbackground: url(default.png) no-repeat -96px 0;\n\t;\n}\nbody .layer-ext-moon .layui-layer-ico1 {\n\tbackground: url(default.png) no-repeat -224px 0;\n\t;\n}\nbody .layer-ext-moon .layui-layer-ico2 {\n\tbackground: url(default.png) no-repeat -192px 0;\n}\nbody .layer-ext-moon .layui-layer-ico3 {\n\tbackground: url(default.png) no-repeat -160px 0;\n}\nbody .layer-ext-moon .layui-layer-ico4 {\n\tbackground: url(default.png) no-repeat -320px 0;\n}\nbody .layer-ext-moon .layui-layer-ico5 {\n\tbackground: url(default.png) no-repeat -288px 0;\n}\nbody .layer-ext-moon .layui-layer-ico6 {\n\tbackground: url(default.png) -256px 0;\n}\nbody .layer-ext-moon .layui-layer-ico7 {\n\tbackground: url(default.png) no-repeat -128px 0;\n}\nbody .layer-ext-moon .layui-layer-setwin {\n\ttop: 15px;\n\tright: 15px;\n}\nbody .layer-ext-moon .layui-layer-setwin a {\n\twidth: 16px;\n\theight: 16px;\n}\nbody .layer-ext-moon .layui-layer-setwin .layui-layer-min cite:hover {\n\tbackground-color: #56abe4;\n}\nbody .layer-ext-moon .layui-layer-setwin .layui-layer-max {\n\tbackground: url(default.png) no-repeat -80px 0;\n}\nbody .layer-ext-moon .layui-layer-setwin .layui-layer-max:hover {\n\tbackground: url(default.png) no-repeat -64px 0;\n}\nbody .layer-ext-moon .layui-layer-setwin .layui-layer-maxmin {\n\tbackground: url(default.png) no-repeat -32px 0;\n}\nbody .layer-ext-moon .layui-layer-setwin .layui-layer-maxmin:hover {\n\tbackground: url(default.png) no-repeat -16px 0;\n}\nbody .layer-ext-moon .layui-layer-setwin .layui-layer-close1,body .layer-ext-moon .layui-layer-setwin .layui-layer-close2 {\n\tbackground: url(default.png) 0 0;\n}\nbody .layer-ext-moon .layui-layer-setwin .layui-layer-close1:hover,body .layer-ext-moon .layui-layer-setwin .layui-layer-close2:hover {\n\tbackground: url(default.png) -48px 0;\n}\nbody .layer-ext-moon .layui-layer-padding{padding-top: 24px;}\nbody .layer-ext-moon .layui-layer-btn {\n\tpadding: 15px 0;\n\tbackground: #f0f4f7;\n\tborder-top: 1px #c7c7c7 solid;\n}\nbody .layer-ext-moon .layui-layer-btn a {\n\tfont-size: 12px;\n\tfont-weight: normal;\n\tmargin: 0 3px;\n\tmargin-right: 7px;\n\tmargin-left: 7px;\n\tpadding: 6px 20px;\n\tcolor: #fff;\n\tborder: 1px solid #0064b6;\n\tbackground: #0071ce;\n\tborder-radius: 3px;\n\tdisplay: inline-block;\n\theight: 20px;\n\tline-height: 20px;\n\ttext-align: center;\n\tvertical-align: middle;\n\tbackground-repeat: no-repeat;\n\ttext-decoration: none;\n\toutline: none;\n\t-moz-box-sizing: content-box;\n\t-webkit-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\nbody .layer-ext-moon .layui-layer-btn .layui-layer-btn0 {\n\tbackground: #0071ce;\n}\nbody .layer-ext-moon .layui-layer-btn .layui-layer-btn1 {\n\tbackground: #fff;\n\tcolor: #404a58;\n\tborder: 1px solid #c0c4cd;\n\tborder-radius: 3px;\n}\nbody .layer-ext-moon .layui-layer-btn .layui-layer-btn2 {\n\tbackground: #f60;\n\tcolor: #fff;\n\tborder: 1px solid #f60;\n\tborder-radius: 3px;\n}\nbody .layer-ext-moon .layui-layer-btn .layui-layer-btn3 {\n\tbackground: #f00;\n\tcolor: #fff;\n\tborder: 1px solid #f00;\n\tborder-radius: 3px;\n}\n\nbody .layer-ext-moon .layui-layer-title span.layui-layer-tabnow{\n\theight:46px;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/pop_base.js",
    "content": "\n"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/static/bigscreen/template2/js/rem.js",
    "content": " (function (doc, win) {\n     var docEl = doc.documentElement,\n         resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',\n         recalc = function () {\n             var clientWidth = docEl.clientWidth;\n             if (!clientWidth) return;\n             if (clientWidth >= 1920) {\n                 docEl.style.fontSize = '100px'; //1rem  = 100px\n             } else {\n                 docEl.style.fontSize = 100 * (clientWidth / 1920) + 'px';\n             }\n         };\n     if (!doc.addEventListener) return;\n     win.addEventListener(resizeEvt, recalc, false);\n     doc.addEventListener('DOMContentLoaded', recalc, false);\n })(document, window);"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/templates/bigscreen/template1/index.ftl",
    "content": "<#assign base=springMacroRequestContext.getContextUrl(\"\")>\n<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>JEECG ROOM 作战指挥室</title>\n    <link href=\"${base}/bigscreen/template1/css/easyui.css\" rel=\"stylesheet\" type=\"text/css\">\n    <link href=\"${base}/bigscreen/template1/css/room.css\" rel=\"stylesheet\" type=\"text/css\" />\n\n\n    <script language=\"javascript\" type=\"text/javascript\" src=\"${base}/bigscreen/template1/js/jquery.min.js\"></script>\n    <script language=\"javascript\" type=\"text/javascript\" src=\"${base}/bigscreen/template1/js/jquery.easyui.min.js\"></script>\n    <script language=\"javascript\" type=\"text/javascript\" src=\"${base}/bigscreen/template1/js/echarts.min.js\"></script>\n    <script language=\"javascript\" type=\"text/javascript\" src=\"${base}/bigscreen/template1/js/echarts-wordcloud.js\"></script>\n    <script language=\"javascript\" type=\"text/javascript\" src=\"${base}/bigscreen/template1/js/china.js\"></script>\n    <script language=\"javascript\" type=\"text/javascript\" src=\"${base}/bigscreen/template1/js/geoCoord.js\"></script>\n    <script language=\"javascript\" type=\"text/javascript\" src=\"${base}/bigscreen/template1/js/room.js\"></script>\n    <script language=\"javascript\" type=\"text/javascript\" src=\"${base}/bigscreen/template1/js/resize.js\"></script>\n</head>\n\n<body>\n    <div id=\"main\">\n        <!-- 刷新 -->\n        <div id=\"refresh\">\n            <span id=\"refreshTime\">最后刷新时间：2018-05-06 23:13.24</span>\n        </div>\n        <!-- 刷新结束 -->\n\n        <!-- 进度条区域开始-->\n        <div id=\"y_gauge1\"></div>\n        <div id=\"y_gauge2\"></div>\n        <div id=\"y_gauge3\"></div>\n        <div id=\"y_gauge4\"></div>\n        <!-- 进度条区域结束-->\n\n        <!-- 螺旋图开始 -->\n        <div id=\"orderStatus\"></div>\n        <div class=\"contentButton\" style=\"top:822px;left:453px\">\n            <a class=\"a1\" href=\"javascript:void(0);\" onclick=\"javascript:openDialog('modalDlg');\">&nbsp;</a>\n        </div>\n        <!-- 螺旋图结束 -->\n\n        <!-- 地图开始 -->\n        <div id=\"map\"></div>\n        <!-- 地图结束 -->\n\n        <!-- 产品饼图开始 -->\n        <div id=\"productPie\" style=\"width: 900px; height: 590px;\"></div>\n        <!-- 产品饼图结束 -->\n\n        <!-- 业务进展图开始 -->\n        <div id=\"businessProgress\"></div>\n        <div class=\"contentButton\" style=\"top:822px;left:3679px\">\n            <a class=\"a1\" href=\"javascript:void(0);\">&nbsp;</a>\n        </div>\n        <!-- 业务进展图结束 -->\n\n        <!-- 生产计划展示开始-->\n        <div id=\"plan\"></div>\n        <div class=\"contentButton\" style=\"top:1402px;left:453px\">\n            <a href=\"javascript:void(0);\">&nbsp;</a>\n        </div>\n        <!-- 生产计划展示结束-->\n\n        <!-- 生产质量展示开始-->\n        <div id=\"quality\"></div>\n        <div class=\"contentButton\" style=\"top:1402px;left:1532px\">\n            <a href=\"javascript:void(0);\">&nbsp;</a>\n        </div>\n        <!-- 生产质量展示结束-->\n\n        <!-- 客服及投诉展示开始-->\n        <div id=\"produce\">\n            <table width=\"100%\" cellpadding=\"6\" cellspacing=\"0\">\n                <tr class=\"row1\">\n                    <td rowspan=\"2\"><span id=\"currentDate\">2018/04/25</span></td>\n                    <td colspan=\"2\">产品投诉</td>\n                    <td colspan=\"2\">物流投诉</td>\n                    <td colspan=\"2\">售后投诉</td>\n                </tr>\n                <tr class=\"row1\">\n                    <td>质量</td>\n                    <td>服务</td>\n                    <td>质量</td>\n                    <td>服务</td>\n                    <td>质量</td>\n                    <td>服务</td>\n                </tr>\n                <tr class=\"row2\">\n                    <td>已处理</td>\n                    <td>48</td>\n                    <td>48</td>\n                    <td>48</td>\n                    <td>48</td>\n                    <td>48</td>\n                    <td>48</td>\n                </tr>\n                <tr class=\"row1\">\n                    <td>处理中</td>\n                    <td>34</td>\n                    <td>34</td>\n                    <td>34</td>\n                    <td>34</td>\n                    <td>34</td>\n                    <td>34</td>\n                </tr>\n                <tr class=\"row2\">\n                    <td>未处理</td>\n                    <td>30</td>\n                    <td>28</td>\n                    <td>28</td>\n                    <td>26</td>\n                    <td>25</td>\n                    <td>8</td>\n                </tr>\n                <tr class=\"row2\">\n                    <td>合计</td>\n                    <td>30</td>\n                    <td>28</td>\n                    <td>28</td>\n                    <td>26</td>\n                    <td>25</td>\n                    <td>8</td>\n                </tr>\n                <tr class=\"row1\">\n                    <td>总计</td>\n                    <td colspan=\"2\">22</td>\n                    <td colspan=\"2\">65</td>\n                    <td colspan=\"2\">44</td>\n                </tr>\n            </table>\n        </div>\n        <div class=\"contentButton\" style=\"top:1402px;left:2598px\">\n            <a href=\"javascript:void(0);\">&nbsp;</a>\n        </div>\n        <!-- 客服及投诉展示结束-->\n\n        <!-- 词云展示开始-->\n        <div id=\"wordCloud\"></div>\n        <div class=\"contentButton\" style=\"top:1402px;left:3679px\">\n            <a href=\"javascript:void(0);\">&nbsp;</a>\n        </div>\n        <!-- 词云结束-->\n\n        <!-- 仪表盘区域开始-->\n        <!-- <div id=\"gauge1\"></div>\n            <div class=\"gaugeTitle\" style=\"left:2200px;top:480px;\"><sapn id=\"vg1\">32</sapn>&nbsp;m<sup>3</sup>/d</div>\n            <div id=\"gauge2\"></div>\n            <div class=\"gaugeTitle\" style=\"left:2550px;top:480px;\"><sapn id=\"vg2\">32</sapn>&nbsp;KVA</div>\n            <div id=\"gauge3\"></div>\n            <div class=\"gaugeTitle\" style=\"left:2910px;top:480px;\"><sapn id=\"vg3\">32</sapn>&nbsp;Nm<sup>3</sup>/h</div>\n            <div id=\"gauge4\"></div>\n            <div class=\"gaugeTitle\" style=\"left:2380px;top:750px;\"><sapn id=\"vg4\">32</sapn>&nbsp;m<sup>3</sup>/m</div>\n            <div id=\"gauge5\"></div>\n            <div class=\"gaugeTitle\" style=\"left:2730px;top:750px;\"><sapn id=\"vg5\">32</sapn>&nbsp;t/h</div> -->\n        <!-- 仪表盘区域结束-->\n\n        <!--弹出窗口-->\n        <!--<div id=\"popWindow\">\n                <div style=\"padding:20px;font-size:32px; background-color:#051E3C;color:#B7E1FF; border-bottom:1px solid #09F\">弹出窗口标题</div>\n            </div>-->\n        <!--弹出窗口结束---->\n    </div>>\n\n    <!--编辑系统用户的弹出窗口-->\n    <div id=\"modalDlg\" class=\"easyui-dialog\" title=\"弹出窗口\" data-options=\"modal:true,closed:true,buttons:\n        [{\n                    text:'确定',\n                    iconCls:'icon-ok',\n                    handler:function(){\n                        $('#modalDlg').dialog('close');\n                    }\n                },{\n                    text:'取消',\n                    handler:function(){\n                        $('#modalDlg').dialog('close');\n                    }\n                }]\"\n        style=\"padding:10px\">\n        <table width=\"100%\" cellpadding=\"5\">\n            <tr>\n                <td width=\"80\" align=\"center\">用户名称:</td>\n                <td><input type=\"text\" name=\"updateUsername\" id=\"updateUsername\" value=\"\"></td>\n            </tr>\n            <tr>\n                <td align=\"center\">登录密码:</td>\n                <td><input type=\"text\" name=\"updateUserpass\" id=\"updateUserpass\" value=\"\"></td>\n            </tr>\n            <tr>\n                <td align=\"center\">&nbsp;</td>\n                <td height=\"30\">如无需修改密码，请留空</td>\n            </tr>\n            <tr>\n                <td align=\"center\">用户类型:</td>\n                <td>\n                    <select name=\"updateUserType\" id=\"updateUserType\">\n                        <option value=\"\">--请选择--</option>\n                        <option value=\"administrator\">管理员</option>\n                        <option value=\"user\">系统用户</option>\n                    </select>\n                </td>\n            </tr>\n            <tr>\n                <td align=\"center\">用户状态:</td>\n                <td>\n                    <input type=\"radio\" name=\"updateUserStatus\" id=\"updateUserStatus1\" value=\"0\"><label for=\"updateUserStatus1\">启用</label>&nbsp;&nbsp;\n                    <input type=\"radio\" name=\"updateUserStatus\" id=\"updateUserStatus2\" value=\"1\"><label for=\"updateUserStatus2\">禁用</label>\n                </td>\n            </tr>\n            <tr>\n                <td align=\"center\">用户说明:</td>\n                <td>\n                    <input type=\"text\" name=\"updateUserDescription\" id=\"updateUserDescription\" value=\"\">\n                </td>\n            </tr>\n        </table>\n    </div>\n    <!--编辑系统用户的弹出窗口结束-->\n\n</body>\n\n</html>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources/templates/bigscreen/template2/index.ftl",
    "content": "<!DOCTYPE html>\n<#assign base=springMacroRequestContext.getContextUrl(\"\")>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n    <meta name=\"renderer\" content=\"webkit\">\n    <meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,user-scalable=no\">\n\n    <script type=\"text/javascript\" src=\"${base}/bigscreen/template2/js/rem.js\"></script>\n    <link rel=\"stylesheet\" href=\"${base}/bigscreen/template2/css/style.css\">\n    <title>智慧物流服务中心-首页</title>\n</head>\n\n<body style=\"visibility: hidden;\">\n<div class=\"container-flex\" tabindex=\"0\" hidefocus=\"true\">\n    <div class=\"box-left\">\n        <div class=\"left-top\">\n            <div class=\"current-num\">\n                <div>当前到件量</div>\n                <p>123,456,789</p>\n            </div>\n        </div>\n        <div class=\"left-center\">\n            <div class=\"title-box\">\n                <h6>派件入库量占比</h6>\n            </div>\n            <div class=\"chart-box pie-chart\">\n                <div id=\"pie\"></div>\n                <div>\n                    <div class=\"pie-data\">\n\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div class=\"left-bottom\" class=\"select\">\n            <div class=\"title-box\">\n                <h6>广东省寄派件数据</h6>\n                <img class=\"line-img\" src=\"${base}/bigscreen/template2/images/line-blue.png\" alt=\"\">\n                <button id=\"filBtn\"><img src=\"${base}/bigscreen/template2/images/select_icon.png\" alt=\"\">筛选</button>\n            </div>\n            <div class=\"chart-box\">\n                <div class=\"filter-con\" id=\"filCon\" data-type=\"1\">\n                    <div class=\"select\" tabindex=\"0\" hidefocus=\"true\">\n                        <div class=\"select-div\">\n                            派件\n                        </div>\n                        <ul class=\"select-ul\">\n                            <li class=\"active\" data-value=\"1\">派件</li>\n                            <li data-value=\"2\">寄件</li>\n                        </ul>\n                    </div>\n                    <div class=\"select\" tabindex=\"0\" hidefocus=\"true\">\n                        <div class=\"select-div\">\n                            公司\n                        </div>\n                        <ul class=\"select-ul company\">\n                            <li class=\"active\" data-value=\"\">公司</li>\n                            <li data-value=\"1\">顺丰</li>\n                            <li data-value=\"2\">京东</li>\n                            <li data-value=\"2\">EMS</li>\n                        </ul>\n                    </div>\n                    <div class=\"select\" tabindex=\"0\" hidefocus=\"true\">\n                        <div class=\"select-div\">\n                            快件类型\n                        </div>\n                        <ul class=\"select-ul\">\n                            <li class=\"active\" data-value=\"\">快件类型</li>\n                            <li data-value=\"0\">文件</li>\n                            <li data-value=\"1\">物品</li>\n                        </ul>\n                    </div>\n                </div>\n                <div id=\"gdMap\" class=\"gd-map\"></div>\n            </div>\n        </div>\n    </div>\n    <div class=\"box-center\">\n        <div class=\"center-top\">\n            <h1>智慧物流服务中心</h1>\n        </div>\n        <div class=\"center-center\">\n            <div class=\"weather-box\">\n                <div class=\"data\">\n                    <p class=\"time\" id=\"time\">00:00:00</p>\n                    <p id=\"date\"></p>\n                </div>\n                <div class=\"weather\">\n                    <img id=\"weatherImg\" src=\"${base}/bigscreen/template2/images/weather/weather_img01.png\" alt=\"\">\n                    <div id=\"weather\">\n                        <p class=\"active\">多云</p>\n                        <p>16-22℃</p>\n                        <p>深圳市南山区</p>\n                    </div>\n                </div>\n            </div>\n            <img src=\"${base}/bigscreen/template2/images/line_bg.png\" alt=\"\">\n            <div class=\"select-box\">\n                <ul id=\"barType\">\n                    <li class=\"active\" data-value=\"1\">派件</li>\n                    <li data-value=\"2\">寄件</li>\n                </ul>\n                <div data-type=\"2\">\n                    <div class=\"select\" tabindex=\"0\" hidefocus=\"true\">\n                        <div class=\"select-div\">\n                            公司\n                        </div>\n                        <ul class=\"select-ul company\">\n                            <li class=\"active\" data-value=\"\">公司</li>\n                            <li data-value=\"1\">顺丰</li>\n                            <li data-value=\"2\">京东</li>\n                            <li data-value=\"2\">EMS</li>\n                        </ul>\n                    </div>\n                    <div class=\"select\" tabindex=\"0\" hidefocus=\"true\">\n                        <div class=\"select-div\">\n                            快件类型\n                        </div>\n                        <ul class=\"select-ul\">\n                            <li class=\"active\" data-value=\"\">快件类型</li>\n                            <li data-value=\"0\">文件</li>\n                            <li data-value=\"1\">物品</li>\n                        </ul>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div class=\"center-bottom\">\n            <div class=\"chart-box\">\n                <div id=\"chart4\" style=\"width:100%;height:95%;\"></div>\n            </div>\n            <div class=\"city-data\">\n                <div class=\"city-box\">\n                    <p id=\"titleQ\"><span>全网</span>到珠海</p>\n                    <ul class=\"city-btn\" data-city=\"1\">\n                        <li class=\"active\">全网</li>\n                        <li>ABCDE</li>\n                        <li>FGHIJ</li>\n                        <li>KLMNO</li>\n                        <li>PQRST</li>\n                        <li>UVWXYZ</li>\n                    </ul>\n                    <ul class=\"city-div\" id=\"city\">\n\n                    </ul>\n                </div>\n                <ul class=\"ranking-box\">\n                    <li><span></span>\n                        <p>城市</p>\n                        <p>派件</p>\n                    </li>\n                    <!--                        <li><span>1</span><p>上海</p><p>1sss25(万件)</p></li>-->\n                </ul>\n                <div class=\"enlarge-box\">\n                    <button class=\"enlarge-btn\" id=\"fangda\"></button>\n                    <ul class=\"modal-btn\">\n                        <li>\n                            <div></div>1</li>\n                        <li>\n                            <div></div>2</li>\n                        <li>\n                            <div></div>3</li>\n                        <li>\n                            <div></div>4</li>\n                        <li>\n                            <div></div>5</li>\n                        <li>\n                            <div></div>6</li>\n                    </ul>\n                </div>\n            </div>\n        </div>\n\n    </div>\n    <div class=\"box-right\">\n        <div class=\"right-top\">\n            <div class=\"title-box\">\n                <h6 id=\"barTitle\">派件数据</h6>\n                <img class=\"line-img\" src=\"${base}/bigscreen/template2/images/line-blue.png\" alt=\"\">\n                <button data-state=1 id=\"tabBtn\"><img src=\"${base}/bigscreen/template2/images/chart_icon.png\" alt=\"\"><span>图表</span></button>\n            </div>\n            <p class=\"unit\">单位：件</p>\n            <div class=\"chart-box\">\n                <div id=\"chart3\" style=\"width:100%;height:100%;\"></div>\n            </div>\n            <div class=\"data-box\" style=\"display:none;\">\n                <table class=\"table1\">\n                    <tr>\n                        <td>入库件</td>\n                        <td colspan=\"3\" class=\"table-data dph-data1\">0</td>\n                    </tr>\n                    <tr class=\"bg-color\">\n                        <td rowspan=\"2\">在库件</td>\n                        <td rowspan=\"2\" class=\"table-data dph-data2\">0</td>\n                        <td>正常件</td>\n                        <td class=\"table-data dph-data3\">0</td>\n                    </tr>\n                    <tr class=\"bg-color\">\n                        <td>滞留件</td>\n                        <td class=\"table-data dph-data5\">0</td>\n                    </tr>\n                    <tr>\n                        <td rowspan=\"2\">出库件</td>\n                        <td rowspan=\"2\" class=\"dph-data6\">0</td>\n                        <td>派送件</td>\n                        <td class=\"table-data dph-data7\">0</td>\n                    </tr>\n                    <tr>\n                        <td>自提件</td>\n                        <td class=\"table-data dph-data8\">0</td>\n                    </tr>\n                    <tr class=\"bg-color\">\n                        <td>退签件</td>\n                        <td colspan=\"3\" class=\"table-data dph-data9\">0</td>\n                    </tr>\n                    <tr>\n                        <td>丢失件</td>\n                        <td colspan=\"3\" class=\"table-data dph-data4\">0</td>\n                    </tr>\n                </table>\n                <table class=\"table1\" style=\"display:none;\">\n                    <tr>\n                        <td>入库件</td>\n                        <td colspan=\"3\" class=\"table-data mail-data1\">1</td>\n                    </tr>\n                    <tr class=\"bg-color\">\n                        <td rowspan=\"2\">在库件</td>\n                        <td rowspan=\"2\" class=\"table-data mail-data2\">1</td>\n                        <td>正常件</td>\n                        <td class=\"table-data mail-data7\">1</td>\n                    </tr>\n                    <tr class=\"bg-color\">\n                        <td>滞留件</td>\n                        <td class=\"table-data mail-data4\">1</td>\n                    </tr>\n\n                    <tr>\n                        <td>出库件</td>\n                        <td colspan=\"3\" class=\"mail-data6\">1</td>\n                    </tr>\n                    <tr class=\"bg-color\">\n                        <td>丢失件</td>\n                        <td colspan=\"3\" class=\"mail-data3\">1</td>\n                    </tr>\n                    <tr>\n                        <td>撤销件</td>\n                        <td colspan=\"3\" class=\"table-data mail-data5\">1</td>\n                    </tr>\n                </table>\n            </div>\n        </div>\n        <div class=\"right-center\">\n            <div class=\"title-box\">\n                <p id=\"switchBtn\"><span class=\"active\" data-dataType=\"income\">收入数据</span><img class=\"line-img\" src=\"${base}/bigscreen/template2/images/line-blue.png\" alt=\"\"><span data-dataType=\"expend\">支出数据</span></p>\n                <img class=\"line-img\" src=\"${base}/bigscreen/template2/images/line-blue.png\" alt=\"\">\n                <button id=\"dateBtn\"><img src=\"${base}/bigscreen/template2/images/data_icon.png\" alt=\"\">日期</button>\n            </div>\n            <div class=\"data-box\">\n                <p class=\"data-number\" id=\"totalProfit\">123,456.5元</p>\n                <div class=\"time-box\" id=\"timeBox\">\n                    <div class=\"time-div\">\n                        <input class=\"time-input\" type=\"text\" value=\"\" id=\"startTime\">\n                        <img src=\"${base}/bigscreen/template2/images/selsct_time.png\" alt=\"\">\n                    </div>\n                    <div class=\"time-div end\">\n                        <input class=\"time-input\" type=\"text\" value=\"\" id=\"endTime\">\n                        <img src=\"${base}/bigscreen/template2/images/selsct_time.png\" alt=\"\">\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div class=\"right-bottom\">\n            <div class=\"title-box\">\n                <button id=\"setBtn\"><img src=\"${base}/bigscreen/template2/images/settings_icon.png\" alt=\"\">设置</button>\n            </div>\n            <div class=\"data-box\">\n                <div class=\"settings-box\">\n                    <p><img src=\"${base}/bigscreen/template2/images/teacher_icon.png\" alt=\"\">今日值班：<span id=\"name_a\"></span><span id=\"date_a\"></span></p>\n                    <p><img src=\"${base}/bigscreen/template2/images/people_iocn.png\" alt=\"\">负责人：<span id=\"lea_a\"></span></p>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n<div class=\"container\">\n    <div class=\"pop-up\">\n        <span class=\"close-pop\"></span>\n        <h2 class=\"title\">当前到件量</h2>\n        <div class=\"pop-data-box\">\n            <p>123,456,789</p>\n        </div>\n    </div>\n\n    <div class=\"pop-up\">\n        <span class=\"close-pop\"></span>\n        <h2 class=\"title\">派件入库量占比</h2>\n        <div class=\"chart-box pie-chart\">\n            <div id=\"pie1\"></div>\n            <div>\n                <div class=\"pie-data\">\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <div class=\"pop-up\">\n        <span class=\"close-pop\"></span>\n        <h2 class=\"title\">广东省寄派件数据 </h2>\n        <div class=\"filter-con pop-filter\" style=\"display:flex\" data-type=\"3\">\n            <div class=\"select\" tabindex=\"0\" hidefocus=\"true\">\n                <div class=\"select-div\">\n                    派件\n                </div>\n                <ul class=\"select-ul\">\n                    <li class=\"active\" data-value=\"1\">派件</li>\n                    <li data-value=\"2\">寄件</li>\n                </ul>\n            </div>\n            <div class=\"select\" tabindex=\"0\" hidefocus=\"true\">\n                <div class=\"select-div\">\n                    公司\n                </div>\n                <ul class=\"select-ul company\">\n                    <li class=\"active\" data-value=\"\">公司</li>\n                    <li data-value=\"1\">顺丰</li>\n                    <li data-value=\"2\">京东</li>\n                    <li data-value=\"2\">EMS</li>\n                </ul>\n            </div>\n            <div class=\"select\" tabindex=\"0\" hidefocus=\"true\">\n                <div class=\"select-div\">\n                    快件类型\n                </div>\n                <ul class=\"select-ul\">\n                    <li class=\"active\" data-value=\"\">快件类型</li>\n                    <li data-value=\"0\">文件</li>\n                    <li data-value=\"1\">物品</li>\n                </ul>\n            </div>\n        </div>\n        <div class=\"chart-box pop-chart\">\n            <div id=\"gdMaps\" class=\"gd-map\"></div>\n        </div>\n    </div>\n\n    <div class=\"pop-up\">\n        <span class=\"close-pop\"></span>\n        <div class=\"filter-con pop-filters\" style=\"display:flex\" data-type=\"4\">\n            <div class=\"select-pop\" tabindex=\"0\" hidefocus=\"true\">\n                <ul id=\"barTypes\">\n                    <li class=\"active\" data-value=\"1\">派件</li>\n                    <li data-value=\"2\">寄件</li>\n                </ul>\n            </div>\n            <div class=\"select\" tabindex=\"0\" hidefocus=\"true\">\n                <div class=\"select-div\">\n                    公司\n                </div>\n                <ul class=\"select-ul company\">\n                    <li class=\"active\" data-value=\"\">公司</li>\n                    <li data-value=\"1\">顺丰</li>\n                    <li data-value=\"2\">京东</li>\n                    <li data-value=\"2\">EMS</li>\n                </ul>\n            </div>\n            <div class=\"select\" tabindex=\"0\" hidefocus=\"true\">\n                <div class=\"select-div\">\n                    快件类型\n                </div>\n                <ul class=\"select-ul\">\n                    <li class=\"active\" data-value=\"\">快件类型</li>\n                    <li data-value=\"0\">文件</li>\n                    <li data-value=\"1\">物品</li>\n                </ul>\n            </div>\n        </div>\n        <div class=\"cont-div\">\n            <div class=\"chart-box pop-charts\">\n                <div id=\"chart4s\" style=\"width:100%;height:95%;\"></div>\n            </div>\n        </div>\n        <div class=\"cont-div\">\n            <h2 class=\"title\" id=\"barTitles\">派件数据</h2>\n            <button class=\"btn-class\" data-state=1 id=\"tabBtns\"><img src=\"${base}/bigscreen/template2/images/chart_icon.png\" alt=\"\"><span>图表</span></button>\n            <div class=\"chart-box pop-chart\">\n                <div id=\"chart3s\" style=\"width:100%;height:90%;\"></div>\n            </div>\n            <div class=\"data-box\" style=\"top:25%;width:8.6rem;display:none;\">\n                <table class=\"table2\">\n                    <tr>\n                        <td>入库件</td>\n                        <td colspan=\"3\" class=\"table-data dph-data1\">0</td>\n                    </tr>\n                    <tr class=\"bg-color\">\n                        <td rowspan=\"2\">在库件</td>\n                        <td rowspan=\"2\" class=\"table-data dph-data2\">0</td>\n                        <td>正常件</td>\n                        <td class=\"table-data dph-data3\">0</td>\n                    </tr>\n                    <tr class=\"bg-color\">\n                        <td>滞留件</td>\n                        <td class=\"table-data dph-data5\">0</td>\n                    </tr>\n                    <tr>\n                        <td rowspan=\"2\">出库件</td>\n                        <td rowspan=\"2\" class=\"dph-data6\">0</td>\n                        <td>派送件</td>\n                        <td class=\"table-data dph-data7\">0</td>\n                    </tr>\n                    <tr>\n                        <td>自提件</td>\n                        <td class=\"table-data dph-data8\">0</td>\n                    </tr>\n                    <tr class=\"bg-color\">\n                        <td>退签件</td>\n                        <td colspan=\"3\" class=\"table-data dph-data9\">0</td>\n                    </tr>\n                    <tr>\n                        <td>丢失件</td>\n                        <td colspan=\"3\" class=\"table-data dph-data4\">0</td>\n                    </tr>\n                </table>\n                <table class=\"table2\" style=\"display:none;\">\n                    <tr>\n                        <td>入库件</td>\n                        <td colspan=\"3\" class=\"table-data mail-data1\">0</td>\n                    </tr>\n                    <tr class=\"bg-color\">\n                        <td rowspan=\"2\">在库件</td>\n                        <td rowspan=\"2\" class=\"table-data mail-data2\">0</td>\n                        <td>正常件</td>\n                        <td class=\"table-data mail-data7\">0</td>\n                    </tr>\n                    <tr class=\"bg-color\">\n                        <td>滞留件</td>\n                        <td class=\"table-data mail-data4\">0</td>\n                    </tr>\n\n                    <tr>\n                        <td>出库件</td>\n                        <td colspan=\"3\" class=\"mail-data6\">0</td>\n                    </tr>\n                    <tr class=\"bg-color\">\n                        <td>丢失件</td>\n                        <td colspan=\"3\" class=\"mail-data3\">0</td>\n                    </tr>\n                    <tr>\n                        <td>撤销件</td>\n                        <td colspan=\"3\" class=\"table-data mail-data5\">0</td>\n                    </tr>\n                </table>\n            </div>\n        </div>\n        <div class=\"cont-div\">\n            <h2 class=\"title\" id=\"titles\"></h2>\n            <button class=\"btn-class\" id=\"dateBtns\"><img src=\"${base}/bigscreen/template2/images/data_icon.png\" alt=\"\">日期</button>\n            <div class=\"data-box  pop-time\">\n                <div class=\"time-box\" id=\"timeBoxs\">\n                    <div class=\"time-div\">\n                        <input class=\"time-input\" type=\"text\" value=\"\" id=\"startTimes\">\n                        <img src=\"${base}/bigscreen/template2/images/selsct_time.png\" alt=\"\">\n                    </div>\n                    <div class=\"time-div end\">\n                        <input class=\"time-input\" type=\"text\" value=\"\" id=\"endTimes\">\n                        <img src=\"${base}/bigscreen/template2/images/selsct_time.png\" alt=\"\">\n                    </div>\n                </div>\n            </div>\n            <div class=\"pop-data-box\" id=\"totalProfits\">\n                <p></p>\n            </div>\n        </div>\n        <div class=\"pop-data\">\n            <div class=\"city-data\">\n                <div class=\"city-box\">\n                    <p id=\"titleQs\"><span>全网</span>到珠海</p>\n                    <ul class=\"city-btn\" data-city=\"2\">\n                        <li class=\"active\">全网</li>\n                        <li>ABCDE</li>\n                        <li>FGHIJ</li>\n                        <li>KLMNO</li>\n                        <li>PQRST</li>\n                        <li>UVWXYZ</li>\n                    </ul>\n                    <ul class=\"city-div\" id=\"citys\">\n\n                    </ul>\n                </div>\n                <ul class=\"ranking-box\">\n                    <li><span></span>\n                        <p>城市</p>\n                        <p>派件</p>\n                    </li>\n                    <!--                        <li><span>1</span><p>上海</p><p>1sss25(万件)</p></li>-->\n                </ul>\n\n            </div>\n        </div>\n    </div>\n    <div class=\"pop-up\">\n        <span class=\"close-pop\"></span>\n        <h2 class=\"title\">设置</h2>\n        <div class=\"set-div\">\n            <div class=\"set-box\">\n                <label class=\"four-f\" for=\"\">排班日期</label>\n                <div class=\"time-div\">\n                    <input class=\"time-input\" type=\"text\" value=\"\" id=\"times\">\n                    <img src=\"${base}/bigscreen/template2/images/selsct_time.png\" alt=\"\">\n                </div>\n            </div>\n            <div class=\"set-box\">\n                <label for=\"\">值班人</label>\n                <input type=\"text\" value=\"\">\n                <button class=\"plus\" id=\"addT\"></button>\n                <button class=\"mineus\" id=\"mineusT\" style=\"display:none;\"></button>\n            </div>\n            <div class=\"set-box\">\n                <label for=\"\">负责人</label>\n                <input type=\"text\" value=\"\">\n                <button class=\"plus\" id=\"addL\"></button>\n                <button class=\"mineus\" id=\"mineusL\" style=\"display:none;\"></button>\n                <button class=\"add-btn\" id=\"addSet\"><img src=\"${base}/bigscreen/template2/images/plus.png\" alt=\"\">添加</button>\n            </div>\n            <table class=\"table3\">\n                <thead>\n                <tr>\n                    <th>值班人</th>\n                    <th>排班日期</th>\n                    <th>负责人</th>\n                    <th>操作</th>\n                </tr>\n                </thead>\n                <tbody id=\"tList\">\n                <!--\n                                        <tr>\n                                            <td colspan=\"4\">\n                                                <p style=\"width:9.6rem;\">暂无数据</p>\n                                            </td>\n                                        </tr>\n                -->\n                <tr>\n                    <td>1</td>\n                    <td>1</td>\n                    <td>1</td>\n                    <td>1</td>\n                </tr>\n                <tr>\n                    <td>1</td>\n                    <td>1</td>\n                    <td>1</td>\n                    <td>1</td>\n                </tr>\n                <tr>\n                    <td>1</td>\n                    <td>1</td>\n                    <td>1</td>\n                    <td>1</td>\n                </tr>\n                <tr>\n                    <td>1</td>\n                    <td>1</td>\n                    <td>1</td>\n                    <td>1</td>\n                </tr>\n                <tr>\n                    <td>1</td>\n                    <td>1</td>\n                    <td>1</td>\n                    <td>1</td>\n                </tr>\n                <tr>\n                    <td>1</td>\n                    <td>1</td>\n                    <td>1</td>\n                    <td>1</td>\n                </tr>\n                <tr>\n                    <td>1</td>\n                    <td>1</td>\n                    <td>1</td>\n                    <td>1</td>\n                </tr>\n                </tbody>\n            </table>\n            <div class=\"pages-div\" class=\"mineus\">\n                <button class=\"prev\"></button>\n                <p id=\"page\"><span>0</span>/<span>0</span></p>\n                <button class=\"next\"></button>\n                <input type=\"number\">\n                <button class=\"skip\">跳转</button>\n            </div>\n        </div>\n        <div class=\"tishi\">日期已存在!</div>\n        <div class=\"edit-div\" style=\"display:none;\">\n            <h4>编辑</h4>\n            <span class=\"close-edit\"></span>\n            <div class=\"set-box\">\n                <label for=\"\">值班人</label>\n                <input class=\"input-edit\" id=\"editT\" type=\"text\" value=\"\">\n            </div>\n            <div class=\"set-box\">\n                <label for=\"\">负责人</label>\n                <input class=\"input-edit\" id=\"editL\" type=\"text\" value=\"\">\n            </div>\n            <div class=\"set-box edit-box\">\n                <button id=\"qxEdit\">取消</button>\n                <button id=\"qdEdit\">确定</button>\n            </div>\n        </div>\n    </div>\n</div>\n</body>\n<script type=\"text/javascript\" src=\"${base}/bigscreen/template2/js/jquery-3.3.1.min.js\"></script>\n<script type=\"text/javascript\" src=\"${base}/bigscreen/template2/js/layer/layer.min.js\"></script>\n<script type=\"text/javascript\" src=\"${base}/bigscreen/template2/js/layer/laydate/laydate.js\"></script>\n<script type=\"text/javascript\" src=\"${base}/bigscreen/template2/js/echarts.min.js\"></script>\n<script type=\"text/javascript\" src=\"${base}/bigscreen/template2/js/china.js\"></script>\n<script type=\"text/javascript\" src=\"${base}/bigscreen/template2/js/data/guangdong.js\"></script>\n<script type=\"text/javascript\" src=\"${base}/bigscreen/template2/js/base.js\"></script>\n<script type=\"text/javascript\">\n    $('document').ready(function () {\n        $(\"body\").css('visibility', 'visible');\n        var localData = [$('#teacher').val(), $('#start').val() + '/' + $('#end').val(), $('#leader').val()]\n        localStorage.setItem(\"data\", localData);\n        $('#conBtn').on('click', function () {\n            localData = [$('#teacher').val(), $('#start').val() + '/' + $('#end').val(), $('#leader').val()]\n            if (typeof (Storage) !== \"undefined\") {\n                localStorage.setItem(\"data\", localData);\n                var arr = localStorage.getItem(\"data\").split(',');\n                $('#name_a').html(arr[0]);\n                $('#date_a').html(arr[1]);\n                $('#lea_a').html(arr[2]);\n            }\n        })\n        $('#fangda').on('click', function () {\n            if ($(this).siblings('ul').is(\":hidden\")) {\n                $(this).addClass('active').siblings('ul').show();\n            } else {\n                $(this).removeClass('active').siblings('ul').hide();\n            }\n        })\n\n        $('.modal-btn>li').on('click', function () {\n            var index = $(this).index();\n            if (index <= 2) {\n                $('.container').attr('style', 'visibility: visible').find('.pop-up').eq(index).attr('style', 'visibility: visible').siblings().attr('style', 'visibility: hidden');\n            } else if (index > 2 && index < 5) {\n                $('.container').attr('style', 'visibility: visible').find('.pop-up').eq(3).attr('style', 'visibility: visible').siblings().attr('style', 'visibility: hidden');\n                if (index != 3) {\n                    $('.pop-data .ranking-box').hide();\n                } else {\n                    $('.pop-data .ranking-box').show();\n                }\n                $('.cont-div').eq(index - 3).attr('style', 'visibility: visible').siblings('.cont-div').attr('style', 'visibility: hidden');\n            } else if (index == 5) {\n                $('.container').attr('style', 'visibility: visible').find('.pop-up').eq(3).attr('style', 'visibility: visible').siblings().attr('style', 'visibility: hidden');\n                $('.pop-data .ranking-box').hide();\n                if ($('#switchBtn').find('.active').data('datatype') == \"income\") {\n                    $('#titles').html('收入数据');\n                    $('#totalProfits').html('123,456.5元');\n                    $('.cont-div').eq(2).attr('style', 'visibility: visible').siblings('.cont-div').attr('style', 'visibility: hidden');\n                } else if ($('#switchBtn').find('.active').data('datatype') == 'expend') {\n                    $('#titles').html('支出数据');\n                    $('#totalProfits').html('32,111.4元');\n                    $('.cont-div').eq(2).attr('style', 'visibility: visible').siblings('div').attr('style', 'visibility: hidden');\n                }\n            }\n        })\n    })\n</script>\n\n\n\n</html>"
  },
  {
    "path": "jeecg-boot/jeecg-boot-module/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-boot-parent</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>jeecg-boot-module</artifactId>\n    <packaging>pom</packaging>\n\n    <modules>\n        <module>jeecg-module-demo</module>\n        <module>jeecg-boot-module-airag</module>\n    </modules>\n\n\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-system-api</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>jeecg-system-cloud-api</artifactId>\n\n    <dependencies>\n        <!-- feign -->\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-openfeign</artifactId>\n        </dependency>\n    </dependencies>\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/airag/api/IAiragBaseApi.java",
    "content": "package org.jeecg.common.airag.api;\n\nimport org.jeecg.common.airag.api.fallback.AiragBaseApiFallback;\nimport org.jeecg.common.constant.ServiceNameConstants;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;\nimport org.springframework.cloud.openfeign.FeignClient;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\n\n/**\n * airag baseAPI\n *\n * @author sjlei\n * @date 2025-12-30\n */\n@Component\n@FeignClient(contextId = \"airagBaseRemoteApi\", value = ServiceNameConstants.SERVICE_SYSTEM, fallbackFactory = AiragBaseApiFallback.class)\n@ConditionalOnMissingClass(\"org.jeecg.modules.airag.llm.service.impl.AiragBaseApiImpl\")\npublic interface IAiragBaseApi {\n\n    /**\n     * 知识库写入文本文档\n     *\n     * @param knowledgeId 知识库ID\n     * @param title       文档标题\n     * @param content     文档内容\n     * @return 新增的文档ID\n     * @author sjlei\n     * @date 2025-12-30\n     */\n    @PostMapping(\"/airag/api/knowledgeWriteTextDocument\")\n    String knowledgeWriteTextDocument(\n            @RequestParam(\"knowledgeId\") String knowledgeId,\n            @RequestParam(\"title\") String title,\n            @RequestParam(\"content\") String content\n    );\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/airag/api/factory/AiragBaseApiFallbackFactory.java",
    "content": "package org.jeecg.common.airag.api.factory;\n\nimport org.jeecg.common.airag.api.IAiragBaseApi;\nimport org.jeecg.common.airag.api.fallback.AiragBaseApiFallback;\nimport org.springframework.cloud.openfeign.FallbackFactory;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class AiragBaseApiFallbackFactory implements FallbackFactory<IAiragBaseApi> {\n\n    @Override\n    public IAiragBaseApi create(Throwable cause) {\n        AiragBaseApiFallback fallback = new AiragBaseApiFallback();\n        fallback.setCause(cause);\n        return fallback;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/airag/api/fallback/AiragBaseApiFallback.java",
    "content": "package org.jeecg.common.airag.api.fallback;\n\nimport lombok.Setter;\nimport org.jeecg.common.airag.api.IAiragBaseApi;\n\npublic class AiragBaseApiFallback implements IAiragBaseApi {\n\n    @Setter\n    private Throwable cause;\n\n    @Override\n    public String knowledgeWriteTextDocument(String knowledgeId, String title, String content) {\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/online/api/IOnlineBaseExtApi.java",
    "content": "package org.jeecg.common.online.api;\n\nimport com.alibaba.fastjson.JSONObject;\nimport org.jeecg.common.constant.ServiceNameConstants;\nimport org.jeecg.common.online.api.factory.OnlineBaseExtApiFallbackFactory;\nimport org.jeecg.common.system.vo.DictModel;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;\nimport org.springframework.cloud.openfeign.FeignClient;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @Description: 【Online】Feign API接口\n *\n * @ConditionalOnMissingClass(\"org.jeecg.modules.online.cgform.service.impl.OnlineBaseExtApiImpl\") => 有实现类的时候，不实例化Feign接口\n * @author: jeecg-boot\n */\n@Component\n//@FeignClient(contextId = \"onlineBaseRemoteApi\", value = ServiceNameConstants.SERVICE_ONLINE, fallbackFactory = OnlineBaseExtApiFallbackFactory.class)\n@FeignClient(contextId = \"onlineBaseRemoteApi\", value = ServiceNameConstants.SERVICE_SYSTEM, fallbackFactory = OnlineBaseExtApiFallbackFactory.class)\n@ConditionalOnMissingClass(\"org.jeecg.modules.online.cgform.service.impl.OnlineBaseExtApiImpl\")\npublic interface IOnlineBaseExtApi {\n\n    /**\n     * 【Online】 表单设计器专用：同步新增\n     * @param tableName 表名\n     * @param jsonObject\n     * @throws Exception\n     * @return String\n     */\n    @PostMapping(value = \"/online/api/cgform/crazyForm/{name}\")\n    String cgformPostCrazyForm(@PathVariable(\"name\") String tableName, @RequestBody JSONObject jsonObject) throws Exception;\n\n    /**\n     * 【Online】 表单设计器专用：同步编辑\n     * @param tableName 表名\n     * @param jsonObject\n     * @throws Exception\n     * @return String\n     */\n    @PutMapping(value = \"/online/api/cgform/crazyForm/{name}\")\n    String cgformPutCrazyForm(@PathVariable(\"name\") String tableName, @RequestBody JSONObject jsonObject) throws Exception;\n\n    /**\n     * 通过online表名查询数据，同时查询出子表的数据\n     *\n     * @param tableName online表名\n     * @param dataIds   online数据ID\n     * @return\n     */\n    @GetMapping(value = \"/online/api/cgform/queryAllDataByTableName\")\n    JSONObject cgformQueryAllDataByTableName(@RequestParam(\"tableName\") String tableName, @RequestParam(\"dataIds\") String dataIds);\n\n    /**\n     * online表单删除数据\n     *\n     * @param cgformCode Online表单code\n     * @param dataIds    数据ID，可逗号分割\n     * @return\n     */\n    @DeleteMapping(\"/online/api/cgform/cgformDeleteDataByCode\")\n    String cgformDeleteDataByCode(@RequestParam(\"cgformCode\") String cgformCode, @RequestParam(\"dataIds\") String dataIds);\n\n    /**\n     * 【cgreport】通过 head code 获取 sql语句，并执行该语句返回查询数据\n     *\n     * @param code     报表Code，如果没传ID就通过code查\n     * @param forceKey\n     * @param dataList\n     * @return\n     */\n    @GetMapping(\"/online/api/cgreportGetData\")\n    Map<String, Object> cgreportGetData(@RequestParam(\"code\") String code, @RequestParam(\"forceKey\") String forceKey, @RequestParam(\"dataList\") String dataList);\n\n    /**\n     * 【cgreport】对 cgreportGetData 的返回值做优化，封装 DictModel 集合\n     * @param code\n     * @param dictText\n     * @param dictCode\n     * @param dataList\n     * @return\n     */\n    @GetMapping(\"/online/api/cgreportGetDataPackage\")\n    List<DictModel> cgreportGetDataPackage(@RequestParam(\"code\") String code, @RequestParam(\"dictText\") String dictText, @RequestParam(\"dictCode\") String dictCode, @RequestParam(\"dataList\") String dataList);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/online/api/factory/OnlineBaseExtApiFallbackFactory.java",
    "content": "package org.jeecg.common.online.api.factory;\n\nimport org.springframework.cloud.openfeign.FallbackFactory;\nimport org.jeecg.common.online.api.IOnlineBaseExtApi;\nimport org.jeecg.common.online.api.fallback.OnlineBaseExtApiFallback;\nimport org.springframework.stereotype.Component;\n\n/**\n * @Description: OnlineBaseExtAPIFallbackFactory\n * @author: jeecg-boot\n */\n@Component\npublic class OnlineBaseExtApiFallbackFactory implements FallbackFactory<IOnlineBaseExtApi> {\n\n    @Override\n    public IOnlineBaseExtApi create(Throwable throwable) {\n        OnlineBaseExtApiFallback fallback = new OnlineBaseExtApiFallback();\n        fallback.setCause(throwable);\n        return fallback;\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/online/api/fallback/OnlineBaseExtApiFallback.java",
    "content": "package org.jeecg.common.online.api.fallback;\n\nimport com.alibaba.fastjson.JSONObject;\nimport lombok.Setter;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.online.api.IOnlineBaseExtApi;\nimport org.jeecg.common.system.vo.DictModel;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * 进入fallback的方法 检查是否token未设置\n * @author: jeecg-boot\n */\n@Slf4j\npublic class OnlineBaseExtApiFallback implements IOnlineBaseExtApi {\n\n    @Setter\n    private Throwable cause;\n\n    @Override\n    public String cgformPostCrazyForm(String tableName, JSONObject jsonObject) {\n        return null;\n    }\n\n    @Override\n    public String cgformPutCrazyForm(String tableName, JSONObject jsonObject) {\n        return null;\n    }\n\n    @Override\n    public JSONObject cgformQueryAllDataByTableName(String tableName, String dataIds) {\n        return null;\n    }\n\n    @Override\n    public String cgformDeleteDataByCode(String cgformCode, String dataIds) {\n        return null;\n    }\n\n    @Override\n    public Map<String, Object> cgreportGetData(String code, String forceKey, String dataList) {\n        return null;\n    }\n\n    @Override\n    public List<DictModel> cgreportGetDataPackage(String code, String dictText, String dictCode, String dataList) {\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java",
    "content": "package org.jeecg.common.system.api;\n\nimport com.alibaba.fastjson.JSONObject;\nimport org.jeecg.common.api.CommonAPI;\nimport org.jeecg.common.api.dto.AiragFlowDTO;\nimport org.jeecg.common.api.dto.DataLogDTO;\nimport org.jeecg.common.api.dto.OnlineAuthDTO;\nimport org.jeecg.common.api.dto.PushMessageDTO;\nimport org.jeecg.common.api.dto.message.*;\nimport org.jeecg.common.constant.ServiceNameConstants;\nimport org.jeecg.common.constant.enums.DySmsEnum;\nimport org.jeecg.common.constant.enums.EmailTemplateEnum;\nimport org.jeecg.common.desensitization.annotation.SensitiveDecode;\nimport org.jeecg.common.system.api.factory.SysBaseAPIFallbackFactory;\nimport org.jeecg.common.system.vo.*;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;\nimport org.springframework.cloud.openfeign.FeignClient;\nimport org.springframework.data.repository.query.Param;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.mvc.method.annotation.SseEmitter;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\n\n/**\n *\n * 1、cloud接口数量43  local：35 common：9  额外一个特殊queryAllRole一个当两个用\n *  - 相比较local版\n *  - 去掉了一些方法：addLog、getDatabaseType、queryAllDepart、queryAllUser(Wrapper wrapper)、queryAllUser(String[] userIds, int pageNo, int pageSize)\n *  - 修改了一些方法：createLog、sendSysAnnouncement（只保留了一个，其余全部干掉）\n * 2、@ConditionalOnMissingClass(\"org.jeecg.modules.system.service.impl.SysBaseApiImpl\")=> 有实现类的时候，不实例化Feign接口\n * @author: jeecg-boot\n */\n@Component\n@FeignClient(contextId = \"sysBaseRemoteApi\", value = ServiceNameConstants.SERVICE_SYSTEM, fallbackFactory = SysBaseAPIFallbackFactory.class)\n@ConditionalOnMissingClass(\"org.jeecg.modules.system.service.impl.SysBaseApiImpl\")\npublic interface ISysBaseAPI extends CommonAPI {\n\n    /**\n     * 1发送系统消息\n     * @param message 使用构造器赋值参数 如果不设置category(消息类型)则默认为2 发送系统消息\n     */\n    @PostMapping(\"/sys/api/sendSysAnnouncement\")\n    void sendSysAnnouncement(@RequestBody MessageDTO message);\n\n    /**\n     * 2发送消息 附带业务参数\n     * @param message 使用构造器赋值参数\n     */\n    @PostMapping(\"/sys/api/sendBusAnnouncement\")\n    void sendBusAnnouncement(@RequestBody BusMessageDTO message);\n\n    /**\n     * 3通过模板发送消息\n     * @param message 使用构造器赋值参数\n     */\n    @PostMapping(\"/sys/api/sendTemplateAnnouncement\")\n    void sendTemplateAnnouncement(@RequestBody TemplateMessageDTO message);\n\n    /**\n     * 4通过模板发送消息 附带业务参数\n     * @param message 使用构造器赋值参数\n     */\n    @PostMapping(\"/sys/api/sendBusTemplateAnnouncement\")\n    void sendBusTemplateAnnouncement(@RequestBody BusTemplateMessageDTO message);\n\n    /**\n     * 5通过消息中心模板，生成推送内容\n     * @param templateDTO 使用构造器赋值参数\n     * @return\n     */\n    @PostMapping(\"/sys/api/parseTemplateByCode\")\n    String parseTemplateByCode(@RequestBody TemplateDTO templateDTO);\n\n    /**\n     * 6根据用户id查询用户信息\n     * @param id\n     * @return\n     */\n    @SensitiveDecode\n    @GetMapping(\"/sys/api/getUserById\")\n    LoginUser getUserById(@RequestParam(\"id\") String id);\n\n    /**\n     * 7通过用户账号查询角色集合\n     * @param username\n     * @return\n     */\n    @GetMapping(\"/sys/api/getRolesByUsername\")\n    List<String> getRolesByUsername(@RequestParam(\"username\") String username);\n    \n    /**\n     * 7通过用户账号查询角色集合\n     * @param userId\n     * @return\n     */\n    @GetMapping(\"/sys/api/getRolesByUserId\")\n    List<String> getRolesByUserId(@RequestParam(\"userId\") String userId);\n\n    /**\n     * 8通过用户账号查询部门集合\n     * @param username\n     * @return 部门 id\n     */\n    @GetMapping(\"/sys/api/getDepartIdsByUsername\")\n    List<String> getDepartIdsByUsername(@RequestParam(\"username\") String username);\n    \n    /**\n     * 8通过用户账号查询部门集合\n     * @param userId\n     * @return 部门 id\n     */\n    @GetMapping(\"/sys/api/getDepartIdsByUserId\")\n    List<String> getDepartIdsByUserId(@RequestParam(\"userId\") String userId);\n\n    /**\n     * 8.2 通过用户账号查询部门父ID集合\n     * @param username\n     * @return 部门 parentIds\n     */\n    @GetMapping(\"/sys/api/getDepartParentIdsByUsername\")\n    Set<String> getDepartParentIdsByUsername(@RequestParam(\"username\")String username);\n\n    /**\n     * 8.3 查询部门父ID集合\n     * @param depIds\n     * @return 部门 parentIds\n     */\n    @GetMapping(\"/sys/api/getDepartParentIdsByDepIds\")\n    Set<String> getDepartParentIdsByDepIds(@RequestParam(\"depIds\") Set<String> depIds);\n    \n    /**\n     * 9通过用户账号查询部门 name\n     * @param username\n     * @return 部门 name\n     */\n    @GetMapping(\"/sys/api/getDepartNamesByUsername\")\n    List<String> getDepartNamesByUsername(@RequestParam(\"username\") String username);\n\n    /**\n     * 10获取数据字典\n     * @param code\n     * @return\n     */\n    @Override\n    @GetMapping(\"/sys/api/queryDictItemsByCode\")\n    List<DictModel> queryDictItemsByCode(@RequestParam(\"code\") String code);\n\n    /**\n     * 获取有效的数据字典项\n     * @param code\n     * @return\n     */\n    @Override\n    @GetMapping(\"/sys/api/queryEnableDictItemsByCode\")\n    public List<DictModel> queryEnableDictItemsByCode(@RequestParam(\"code\") String code);\n\n    /** 11查询所有的父级字典，按照create_time排序\n     * @return List<DictModel> 字典值集合\n     */\n    @GetMapping(\"/sys/api/queryAllDict\")\n    List<DictModel> queryAllDict();\n\n    /**\n     * 12查询所有分类字典\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryAllSysCategory\")\n    List<SysCategoryModel> queryAllSysCategory();\n\n    /**\n     * 13获取表数据字典\n     * @param tableFilterSql\n     * @param text\n     * @param code\n     * @return\n     */\n    @Override\n    @GetMapping(\"/sys/api/queryTableDictItemsByCode\")\n    List<DictModel> queryTableDictItemsByCode(@RequestParam(\"tableFilterSql\") String tableFilterSql, @RequestParam(\"text\") String text, @RequestParam(\"code\") String code);\n\n    /**\n     * 14查询所有部门 作为字典信息 id -->value,departName -->text\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryAllDepartBackDictModel\")\n    List<DictModel> queryAllDepartBackDictModel();\n\n    /**\n     * 15根据业务类型 busType 及业务 busId 修改消息已读\n     * @param busType 业务类型\n     * @param busId 业务id\n     */\n    @GetMapping(\"/sys/api/updateSysAnnounReadFlag\")\n    public void updateSysAnnounReadFlag(@RequestParam(\"busType\") String busType, @RequestParam(\"busId\")String busId);\n\n    /**\n     * 16查询表字典 支持过滤数据\n     * @param table\n     * @param text\n     * @param code\n     * @param filterSql\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryFilterTableDictInfo\")\n    List<DictModel> queryFilterTableDictInfo(@RequestParam(\"table\") String table, @RequestParam(\"text\") String text, @RequestParam(\"code\") String code, @RequestParam(\"filterSql\") String filterSql);\n\n    /**\n     * 17查询指定table的 text code 获取字典，包含text和value\n     * @param table\n     * @param text\n     * @param code\n     * @param keyArray\n     * @return\n     */\n    @Deprecated\n    @GetMapping(\"/sys/api/queryTableDictByKeys\")\n    public List<String> queryTableDictByKeys(@RequestParam(\"table\") String table, @RequestParam(\"text\") String text, @RequestParam(\"code\") String code, @RequestParam(\"keyArray\") String[] keyArray);\n\n    /**\n     * 18查询所有用户 返回ComboModel\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryAllUserBackCombo\")\n    public List<ComboModel> queryAllUserBackCombo();\n\n    /**\n     * 19分页查询用户 返回JSONObject\n     * @param userIds 多个用户id\n     * @param pageNo 当前页数\n     * @param pageSize 每页条数\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryAllUser\")\n    public JSONObject queryAllUser(@RequestParam(name=\"userIds\",required=false)String userIds, @RequestParam(name=\"pageNo\",required=false) Integer pageNo,@RequestParam(name=\"pageSize\",required=false) Integer pageSize);\n\n\n    /**\n     * 20获取所有角色 带参\n     * @param roleIds 默认选中角色\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryAllRole\")\n    public List<ComboModel> queryAllRole(@RequestParam(name = \"roleIds\",required = false)String[] roleIds);\n\n    /**\n     * 21通过用户账号查询角色Id集合\n     * @param username\n     * @return\n     */\n    @GetMapping(\"/sys/api/getRoleIdsByUsername\")\n    public List<String> getRoleIdsByUsername(@RequestParam(\"username\")String username);\n\n    /**\n     * 22通过部门编号查询部门id\n     * @param orgCode\n     * @return\n     */\n    @GetMapping(\"/sys/api/getDepartIdsByOrgCode\")\n    public String getDepartIdsByOrgCode(@RequestParam(\"orgCode\")String orgCode);\n\n    /**\n     * 23查询所有部门\n     * @return\n     */\n    @GetMapping(\"/sys/api/getAllSysDepart\")\n    public List<SysDepartModel> getAllSysDepart();\n\n    /**\n     * 24查找父级部门\n     * @param departId\n     * @return\n     */\n    @GetMapping(\"/sys/api/getParentDepartId\")\n    DictModel getParentDepartId(@RequestParam(\"departId\")String departId);\n\n    /**\n     * 25根据部门Id获取部门负责人\n     * @param deptId\n     * @return\n     */\n    @GetMapping(\"/sys/api/getDeptHeadByDepId\")\n    public List<String> getDeptHeadByDepId(@RequestParam(\"deptId\") String deptId);\n\n    /**\n     * 26给指定用户发消息\n     * @param userIds\n     * @param cmd\n     */\n    @GetMapping(\"/sys/api/sendWebSocketMsg\")\n    public void sendWebSocketMsg(@RequestParam(\"userIds\")String[] userIds, @RequestParam(\"cmd\") String cmd);\n\n    /**\n     * 27根据id获取所有参与用户\n     * @param userIds 多个用户id\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryAllUserByIds\")\n    public List<UserAccountInfo> queryAllUserByIds(@RequestParam(\"userIds\") String[] userIds);\n\n    /**\n     * 28将会议签到信息推动到预览\n     * userIds\n     * @return\n     * @param userId\n     */\n    @GetMapping(\"/sys/api/meetingSignWebsocket\")\n    void meetingSignWebsocket(@RequestParam(\"userId\")String userId);\n\n    /**\n     * 29根据name获取所有参与用户\n     * @param userNames 多个用户账号\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryUserByNames\")\n    List<UserAccountInfo> queryUserByNames(@RequestParam(\"userNames\")String[] userNames);\n\n\n    /**\n     * 30获取用户的角色集合\n     * @param username\n     * @return\n     */\n    @GetMapping(\"/sys/api/getUserRoleSet\")\n    Set<String> getUserRoleSet(@RequestParam(\"username\")String username);\n    \n    /**\n     * 30获取用户的角色集合\n     * @param userId\n     * @return\n     */\n    @GetMapping(\"/sys/api/getUserRoleSetById\")\n    Set<String> getUserRoleSetById(@RequestParam(\"userId\")String userId);\n\n    /**\n     * 31获取用户的权限集合\n     * @param userId\n     * @return\n     */\n    @GetMapping(\"/sys/api/getUserPermissionSet\")\n    Set<String> getUserPermissionSet(@RequestParam(\"userId\") String userId);\n\n    /**\n     * 32判断是否有online访问的权限\n     * @param onlineAuthDTO\n     * @return\n     */\n    @PostMapping(\"/sys/api/hasOnlineAuth\")\n    boolean hasOnlineAuth(@RequestBody OnlineAuthDTO onlineAuthDTO);\n\n    /**\n     * 33通过部门id获取部门全部信息\n     * @param id 部门id\n     * @return SysDepartModel 部门信息\n     */\n    @GetMapping(\"/sys/api/selectAllById\")\n    SysDepartModel selectAllById(@RequestParam(\"id\") String id);\n\n    /**\n     * 34根据用户id查询用户所属公司下所有用户ids\n     * @param userId\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryDeptUsersByUserId\")\n    List<String> queryDeptUsersByUserId(@RequestParam(\"userId\") String userId);\n\n\n    //---\n\n    /**\n     * 35查询用户角色信息\n     * @param username\n     * @return\n     */\n    @Override\n    @GetMapping(\"/sys/api/queryUserRoles\")\n    Set<String> queryUserRoles(@RequestParam(\"username\")String username);\n    \n    /**\n     * 35查询用户角色信息\n     * @param userId\n     * @return\n     */\n    @Override\n    @GetMapping(\"/sys/api/queryUserRolesById\")\n    Set<String> queryUserRolesById(@RequestParam(\"userId\")String userId);\n\n    /**\n     * 36查询用户权限信息\n     * @param userId\n     * @return\n     */\n    @Override\n    @GetMapping(\"/sys/api/queryUserAuths\")\n    Set<String> queryUserAuths(@RequestParam(\"userId\")String userId);\n\n    /**\n     * 37根据 id 查询数据库中存储的 DynamicDataSourceModel\n     *\n     * @param dbSourceId\n     * @return\n     */\n    @Override\n    @GetMapping(\"/sys/api/getDynamicDbSourceById\")\n    DynamicDataSourceModel getDynamicDbSourceById(@RequestParam(\"dbSourceId\") String dbSourceId);\n\n    /**\n     * 38根据 code 查询数据库中存储的 DynamicDataSourceModel\n     *\n     * @param dbSourceCode\n     * @return\n     */\n    @Override\n    @GetMapping(\"/sys/api/getDynamicDbSourceByCode\")\n    DynamicDataSourceModel getDynamicDbSourceByCode(@RequestParam(\"dbSourceCode\") String dbSourceCode);\n\n    /**\n     * 39根据用户账号查询用户信息 CommonAPI中定义\n     * @param username\n     * @return LoginUser 用户信息\n     */\n    @Override\n    @SensitiveDecode\n    @GetMapping(\"/sys/api/getUserByName\")\n    LoginUser getUserByName(@RequestParam(\"username\") String username);\n    \n    /**\n     * 39根据用户账号查询用户ID CommonAPI中定义\n     * @param username\n     * @return 用户ID\n     */\n    @Override\n    @GetMapping(\"/sys/api/getUserIdByName\")\n    String getUserIdByName(@RequestParam(\"username\") String username);\n\n    /**\n     * 40字典表的 翻译\n     * @param table\n     * @param text\n     * @param code\n     * @param key\n     * @return\n     */\n    @Override\n    @GetMapping(\"/sys/api/translateDictFromTable\")\n    String translateDictFromTable(@RequestParam(\"table\") String table, @RequestParam(\"text\") String text, @RequestParam(\"code\") String code, @RequestParam(\"key\") String key);\n\n    /**\n     * 41普通字典的翻译\n     * @param code\n     * @param key\n     * @return\n     */\n    @Override\n    @GetMapping(\"/sys/api/translateDict\")\n    String translateDict(@RequestParam(\"code\") String code, @RequestParam(\"key\") String key);\n\n    /**\n     * 42查询数据权限\n     * @param component\n     * @param requestPath\n     * @param username 用户姓名\n     * @return\n     */\n    @Override\n    @GetMapping(\"/sys/api/queryPermissionDataRule\")\n    List<SysPermissionDataRuleModel> queryPermissionDataRule(@RequestParam(\"component\") String component, @RequestParam(\"requestPath\")String requestPath, @RequestParam(\"username\") String username);\n\n    /**\n     * 43查询用户信息\n     * @param username\n     * @return\n     */\n    @Override\n    @GetMapping(\"/sys/api/getCacheUser\")\n    SysUserCacheInfo getCacheUser(@RequestParam(\"username\") String username);\n\n    /**\n     * 36根据多个用户账号(逗号分隔)，查询返回多个用户信息\n     * @param usernames\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryUsersByUsernames\")\n    List<JSONObject> queryUsersByUsernames(@RequestParam(\"usernames\") String usernames);\n\n    /**\n     * 37根据多个用户ID(逗号分隔)，查询返回多个用户信息\n     * @param ids\n     * @return\n     */\n    @RequestMapping(\"/sys/api/queryUsersByIds\")\n    List<JSONObject> queryUsersByIds(@RequestParam(\"ids\") String ids);\n\n    /**\n     * 38根据多个部门编码(逗号分隔)，查询返回多个部门信息\n     * @param orgCodes\n     * @return\n     */\n    @RequestMapping(\"/sys/api/queryDepartsByOrgcodes\")\n    List<JSONObject> queryDepartsByOrgcodes(@RequestParam(\"orgCodes\") String orgCodes);\n\n//    /**\n//     * 39根据多个部门编码(逗号分隔)，查询返回多个部门信息\n//     * @param ids\n//     * @return\n//     */\n//    @GetMapping(\"/sys/api/queryDepartsByOrgIds\")\n//    List<JSONObject> queryDepartsByOrgIds(@RequestParam(\"ids\") String ids);\n    \n    /**\n     * 40发送邮件消息\n     * @param email\n     * @param title\n     * @param content\n     */\n    @GetMapping(\"/sys/api/sendEmailMsg\")\n    void sendEmailMsg(@RequestParam(\"email\")String email,@RequestParam(\"title\")String title,@RequestParam(\"content\")String content);\n\n    /**\n     * 发送html模版邮件消息\n     *\n     * @param email\n     * @param title\n     * @param emailTemplateEnum 邮件模版枚举\n     * @param params            模版参数\n     */\n    @GetMapping(\"/sys/api/sendHtmlTemplateEmail\")\n    void sendHtmlTemplateEmail(@RequestParam(\"email\") String email, @RequestParam(\"title\") String title, @RequestParam(\"emailEnum\") EmailTemplateEnum emailTemplateEnum, @RequestParam(\"params\") JSONObject params);\n    /**\n    /**\n     * 发送短信消息\n     *\n     * @param phone  手机号码\n     * @param params  模版参数\n     * @param dySmsEnum 短信模版枚举\n     */\n    @GetMapping(\"/sys/api/sendSmsMsg\")\n    void sendSmsMsg(@RequestParam(\"phone\") String phone, @RequestParam(\"params\") JSONObject params,@RequestParam(\"dySmsEnum\") DySmsEnum dySmsEnum);\n    /**\n     * 41 获取公司下级部门和公司下所有用户id\n     * @param orgCode 部门编号\n     * @return List<Map>\n     */\n    @GetMapping(\"/sys/api/getDeptUserByOrgCode\")\n    List<Map> getDeptUserByOrgCode(@RequestParam(\"orgCode\")String orgCode);\n\n    /**\n     * 42 查询分类字典翻译\n     * @param ids 多个分类字典id\n     * @return List<String>\n     */\n    @GetMapping(\"/sys/api/loadCategoryDictItem\")\n    List<String> loadCategoryDictItem(@RequestParam(\"ids\") String ids);\n\n    /**\n     * 44 反向翻译分类字典，用于导入\n     *\n     * @param names 名称，逗号分割\n     */\n    @GetMapping(\"/sys/api/loadCategoryDictItemByNames\")\n    List<String> loadCategoryDictItemByNames(@RequestParam(\"names\") String names, @RequestParam(\"delNotExist\") boolean delNotExist);\n\n    /**\n     * 43 根据字典code加载字典text\n     *\n     * @param dictCode 顺序：tableName,text,code\n     * @param keys     要查询的key\n     * @return\n     */\n    @GetMapping(\"/sys/api/loadDictItem\")\n    List<String> loadDictItem(@RequestParam(\"dictCode\") String dictCode, @RequestParam(\"keys\") String keys);\n\n    /**\n     * 复制应用下的所有字典配置到新的租户下\n     *\n     * @param originalAppId  原始低代码应用ID\n     * @param appId   新的低代码应用ID\n     * @param tenantId  新的租户ID\n     * @return  Map<String, String>  Map<原字典编码, 新字典编码> \n     */\n    @GetMapping(\"/sys/api/copyLowAppDict\")\n    Map<String, String> copyLowAppDict(@RequestParam(\"originalAppId\") String originalAppId, @RequestParam(\"appId\") String appId, @RequestParam(\"tenantId\") String tenantId);\n    \n    /**\n     * 44 根据字典code查询字典项\n     *\n     * @param dictCode 顺序：tableName,text,code\n     * @param dictCode 要查询的key\n     * @return\n     */\n    @GetMapping(\"/sys/api/getDictItems\")\n    List<DictModel> getDictItems(@RequestParam(\"dictCode\") String dictCode);\n\n    /**\n     * 45 根据多个字典code查询多个字典项\n     *\n     * @param dictCodeList\n     * @return key = dictCode ； value=对应的字典项\n     */\n    @RequestMapping(\"/sys/api/getManyDictItems\")\n    Map<String, List<DictModel>> getManyDictItems(@RequestParam(\"dictCodeList\") List<String> dictCodeList);\n\n    /**\n     * 46 【JSearchSelectTag下拉搜索组件专用接口】\n     * 大数据量的字典表 走异步加载  即前端输入内容过滤数据\n     *\n     * @param dictCode 字典code格式：table,text,code\n     * @param keyword  过滤关键字\n     * @param pageSize 每页条数\n     * @return\n     */\n    @GetMapping(\"/sys/api/loadDictItemByKeyword\")\n    List<DictModel> loadDictItemByKeyword(@RequestParam(\"dictCode\") String dictCode, @RequestParam(\"keyword\") String keyword, @RequestParam(value = \"pageNo\", defaultValue = \"1\", required = false) Integer pageNo, @RequestParam(value = \"pageSize\", required = false) Integer pageSize);\n\n    /**\n     * 47 根据多个部门id(逗号分隔)，查询返回多个部门信息\n     * @param ids\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryDepartsByIds\")\n    List<JSONObject> queryDepartsByIds(@RequestParam(\"ids\") String ids);\n\n    /**\n     * 48 普通字典的翻译，根据多个dictCode和多条数据，多个以逗号分割\n     * @param dictCodes\n     * @param keys\n     * @return\n     */\n    @Override\n    @GetMapping(\"/sys/api/translateManyDict\")\n    Map<String, List<DictModel>> translateManyDict(@RequestParam(\"dictCodes\") String dictCodes, @RequestParam(\"keys\") String keys);\n\n    /**\n     * 49 字典表的 翻译，可批量\n     * @param table\n     * @param text\n     * @param code\n     * @param keys 多个用逗号分割\n     * @param ds\n     * @return\n     */\n    @Override\n    @GetMapping(\"/sys/api/translateDictFromTableByKeys\")\n    List<DictModel> translateDictFromTableByKeys(@RequestParam(\"table\") String table, @RequestParam(\"text\") String text, @RequestParam(\"code\") String code, @RequestParam(\"keys\") String keys, @RequestParam(\"ds\") String ds);\n\n    /**\n     * 发送模板消息\n     */\n    @PostMapping(\"/sys/api/sendTemplateMessage\")\n    void sendTemplateMessage(@RequestBody MessageDTO message);\n\n    /**\n     * 获取模板内容\n     * @param code\n     * @return\n     */\n    @GetMapping(\"/sys/api/getTemplateContent\")\n    String getTemplateContent(@RequestParam(\"code\") String code);\n\n    /**\n     * 新增数据日志\n     * @param dataLogDto\n     */\n    @PostMapping(\"/sys/api/saveDataLog\")\n    void saveDataLog(@RequestBody DataLogDTO dataLogDto);\n\n    /**\n     * 更新头像\n     * @param loginUser\n     * @return\n     */\n    @PutMapping(\"/sys/api/updateAvatar\")\n    void updateAvatar(@RequestBody LoginUser loginUser);\n\n    @GetMapping(\"/sys/api/sendAppChatSocket\")\n    void sendAppChatSocket(@RequestParam(name=\"userId\") String userId);\n\n    /**\n     * 根据角色id查询角色code\n     * @param id\n     * @return\n     */\n    @GetMapping(\"/sys/api/getRoleCode\")\n    String getRoleCodeById(@RequestParam(name = \"id\") String id);\n\n    /**\n     * 根据roleCode查询角色信息，可逗号分隔多个\n     *\n     * @param roleCodes\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryRoleDictByCode\")\n    List<DictModel> queryRoleDictByCode(@RequestParam(name = \"roleCodes\") String roleCodes);\n\n\n    /**\n     * 根据高级查询条件查询用户\n     * @param superQuery\n     * @param matchType\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryUserBySuperQuery\")\n    List<JSONObject> queryUserBySuperQuery(@RequestParam(name=\"superQuery\")String superQuery,@RequestParam(name=\"matchType\")String matchType);\n\n\n    /**\n     * 根据ID条件查询用户\n     * @param id\n     * @return JSONObject\n     */\n    @GetMapping(\"/sys/api/queryUserById\")\n    JSONObject queryUserById(@RequestParam(name=\"id\") String id);\n\n\n    /**\n     * 根据高级查询条件查询部门\n     * @param superQuery\n     * @param matchType\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryDeptBySuperQuery\")\n    List<JSONObject> queryDeptBySuperQuery(@RequestParam(name=\"superQuery\")String superQuery,@RequestParam(name=\"matchType\")String matchType);\n\n    /**\n     * 根据高级查询条件查询角色\n     * @param superQuery\n     * @param matchType\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryRoleBySuperQuery\")\n    List<JSONObject> queryRoleBySuperQuery(@RequestParam(name=\"superQuery\")String superQuery,@RequestParam(name=\"matchType\")String matchType);\n\n\n    /**\n     * 根据租户ID查询用户ID\n     * @param tenantId 租户ID\n     * @return List<String>\n     */\n    @GetMapping(\"/sys/api/selectUserIdByTenantId\")\n    List<String> selectUserIdByTenantId(@RequestParam(\"tenantId\")String tenantId);\n\n\n    /**\n     * 根据部门ID查询用户ID\n     * @param deptIds\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryUserIdsByDeptIds\")\n    List<String> queryUserIdsByDeptIds(@RequestParam(\"deptIds\") List<String> deptIds);\n\n    /**\n     * 根据部门ID查询用户账号\n     * @param deptIds\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryUserAccountsByDeptIds\")\n    List<String> queryUserAccountsByDeptIds(@RequestParam(\"deptIds\") List<String> deptIds);\n    \n    /**\n     * 根据角色编码 查询用户ID\n     * @param roleCodes\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryUserIdsByRoleds\")\n    List<String> queryUserIdsByRoleds(@RequestParam(\"roleCodes\") List<String> roleCodes);\n\n    /**\n     * 根据用户ID查询用户名称\n     * @param userIds\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryUsernameByIds\")\n    List<String> queryUsernameByIds(@RequestParam(\"userIds\") List<String> userIds);\n\n    /**\n     * 根据部门岗位ID查询用户ID\n     * @param deptPostIds\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryUserIdsByDeptPostIds\")\n    public List<String> queryUserIdsByDeptPostIds(@RequestParam(\"deptPostIds\") List<String> deptPostIds);\n\n    /**\n     * 根据部门主岗位和兼职岗位，查询用户账号\n     * @param positionIds\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryUsernameByDepartPositIds\")\n    List<String> queryUsernameByDepartPositIds(@RequestParam(\"departPositIds\") List<String> positionIds);\n    \n    /**\n     * 根据职务ID查询用户账号\n     * @param positionIds\n     * @return\n     */\n    @GetMapping(\"/sys/api/queryUserIdsByPositionIds\")\n    List<String> queryUserIdsByPositionIds(@RequestParam(\"positionIds\") List<String> positionIds);\n\n    /**\n     * 根据部门和子部门下的所有用户账号\n     *\n     * @param orgCode 部门编码\n     * @return\n     */\n    @GetMapping(\"/sys/api/getUserAccountsByDepCode\")\n    public List<String> getUserAccountsByDepCode(@RequestParam(\"orgCode\")String orgCode);\n\n    /**\n     * 检查查询sql的表和字段是否在白名单中\n     *\n     * @param selectSql\n     * @return\n     */\n    @GetMapping(\"/sys/api/dictTableWhiteListCheckBySql\")\n    boolean dictTableWhiteListCheckBySql(@RequestParam(\"selectSql\") String selectSql);\n\n    /**\n     * 根据字典表或者字典编码，校验是否在白名单中\n     *\n     * @param tableOrDictCode 表名或dictCode\n     * @param fields          如果传的是dictCode，则该参数必须传null\n     * @return\n     */\n    @GetMapping(\"/sys/api/dictTableWhiteListCheckByDict\")\n    boolean dictTableWhiteListCheckByDict(\n            @RequestParam(\"tableOrDictCode\") String tableOrDictCode,\n            @RequestParam(value = \"fields\", required = false) String... fields\n    );\n    /**\n     * 自动发布通告\n     *\n     * @param dataId 通告ID\n     * @param currentUserName 发送人\n     * @return\n     */\n    @GetMapping(\"/sys/api/announcementAutoRelease\")\n    void announcementAutoRelease(\n            @RequestParam(\"dataId\") String dataId,\n            @RequestParam(value = \"currentUserName\") String currentUserName\n    );\n\n    /**\n     * 根据部门编码查询公司信息\n     * @param orgCode 部门编码\n     * @return\n     * @author chenrui\n     * @date 2025/8/12 14:45\n     */\n    @GetMapping(value = \"/sys/api/queryCompByOrgCode\")\n    SysDepartModel queryCompByOrgCode(@RequestParam(name = \"sysCode\") String orgCode);\n\n    /**\n     * 根据部门编码和层次查询上级公司\n     *\n     * @param orgCode 部门编码\n     * @param level 可以传空 默认为1级 最小值为1\n     * @return\n     */\n    @GetMapping(value = \"/sys/api/queryCompByOrgCodeAndLevel\")\n    SysDepartModel queryCompByOrgCodeAndLevel(@RequestParam(\"orgCode\") String orgCode, @RequestParam(\"level\") Integer level);\n\n    /**\n     * 16 运行AIRag流程\n     * for  [QQYUN-13634]在baseapi里面封装方法，方便其他模块调用\n     *\n     * @param airagFlowDTO\n     * @return 流程执行结果,可能是String或者Map\n     * @author chenrui\n     * @date 2025/9/2 11:43\n     */\n    @PostMapping(value = \"/sys/api/runAiragFlow\")\n    Object runAiragFlow(@RequestBody AiragFlowDTO airagFlowDTO);\n\n    /**\n     * 流式运行AIRag流程\n     * for  [QQYUN-13634]在baseapi里面封装方法，方便其他模块调用\n     *\n     * @param airagFlowDTO\n     * @return 流程执行结果,可能是String或者Map\n     * @author chenrui\n     * @date 2025/9/2 11:43\n     */\n    @PostMapping(value = \"/sys/api/runAiragFlowStream\")\n    SseEmitter runAiragFlowStream(@RequestBody AiragFlowDTO airagFlowDTO);\n\n    /**\n     * 根据部门code或部门id获取部门名称(当前和上级部门)\n     *\n     * @param orgCode 部门编码\n     * @param depId   部门id\n     * @return String 部门名称\n     */\n    @GetMapping(\"/getDepartPathNameByOrgCode\")\n    String getDepartPathNameByOrgCode(@RequestParam(name = \"orgCode\", required = false) String orgCode, @RequestParam(name = \"depId\", required = false) String depId);\n\n\n    /**\n     * 根据部门ID查询部门及其子部门下用户ID <br/>\n     * @param deptIds\n     * @return\n     * @author chenrui\n     * @date 2025/09/08 15:28\n     */\n    @GetMapping(\"/sys/api/queryUserIdsByCascadeDeptIds\")\n    List<String> queryUserIdsByCascadeDeptIds(@RequestParam(\"deptIds\") List<String> deptIds);\n    /**\n     * 根据用户信息推送移动端Push消息\n     * @param pushMessageDTO\n     * @return\n     */\n    @PostMapping(\"/sys/api/uniPushMsgToUser\")\n    void uniPushMsgToUser(@RequestBody PushMessageDTO pushMessageDTO);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/factory/SysBaseAPIFallbackFactory.java",
    "content": "package org.jeecg.common.system.api.factory;\n\nimport org.springframework.cloud.openfeign.FallbackFactory;\nimport org.jeecg.common.system.api.ISysBaseAPI;\nimport org.jeecg.common.system.api.fallback.SysBaseAPIFallback;\nimport org.springframework.stereotype.Component;\n\n/**\n * @Description: SysBaseAPIFallbackFactory\n * @author: jeecg-boot\n */\n@Component\npublic class SysBaseAPIFallbackFactory implements FallbackFactory<ISysBaseAPI> {\n\n    @Override\n    public ISysBaseAPI create(Throwable throwable) {\n        SysBaseAPIFallback fallback = new SysBaseAPIFallback();\n        fallback.setCause(throwable);\n        return fallback;\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/common/system/api/fallback/SysBaseAPIFallback.java",
    "content": "package org.jeecg.common.system.api.fallback;\n\nimport com.alibaba.fastjson.JSONObject;\nimport lombok.Setter;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.dto.AiragFlowDTO;\nimport org.jeecg.common.api.dto.DataLogDTO;\nimport org.jeecg.common.api.dto.OnlineAuthDTO;\nimport org.jeecg.common.api.dto.PushMessageDTO;\nimport org.jeecg.common.api.dto.message.*;\nimport org.jeecg.common.constant.enums.DySmsEnum;\nimport org.jeecg.common.constant.enums.EmailTemplateEnum;\nimport org.jeecg.common.system.api.ISysBaseAPI;\nimport org.jeecg.common.system.vo.*;\nimport org.springframework.web.servlet.mvc.method.annotation.SseEmitter;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\n\n/**\n * 进入fallback的方法 检查是否token未设置\n * @author: jeecg-boot\n */\n@Slf4j\npublic class SysBaseAPIFallback implements ISysBaseAPI {\n\n    @Setter\n    private Throwable cause;\n\n    @Override\n    public void sendSysAnnouncement(MessageDTO message) {\n        log.error(\"发送消息失败 {}\", cause);\n    }\n\n    @Override\n    public void sendBusAnnouncement(BusMessageDTO message) {\n        log.error(\"发送消息失败 {}\", cause);\n    }\n\n    @Override\n    public void sendTemplateAnnouncement(TemplateMessageDTO message) {\n        log.error(\"发送消息失败 {}\", cause);\n    }\n\n    @Override\n    public void sendBusTemplateAnnouncement(BusTemplateMessageDTO message) {\n        log.error(\"发送消息失败 {}\", cause);\n    }\n\n    @Override\n    public String parseTemplateByCode(TemplateDTO templateDTO) {\n        log.error(\"通过模板获取消息内容失败 {}\", cause);\n        return null;\n    }\n\n    @Override\n    public LoginUser getUserById(String id) {\n        return null;\n    }\n\n    @Override\n    public List<String> getRolesByUsername(String username) {\n        return null;\n    }\n\n    @Override\n    public List<String> getRolesByUserId(String userId) {\n        return null;\n    }\n\n    @Override\n    public List<String> getDepartIdsByUsername(String username) {\n        return null;\n    }\n\n    @Override\n    public List<String> getDepartIdsByUserId(String userId) {\n        return null;\n    }\n\n    @Override\n    public Set<String> getDepartParentIdsByUsername(String username) {\n        return null;\n    }\n\n    @Override\n    public Set<String> getDepartParentIdsByDepIds(Set<String> depIds) {\n        return null;\n    }\n\n    @Override\n    public List<String> getDepartNamesByUsername(String username) {\n        return null;\n    }\n\n    @Override\n    public List<DictModel> queryDictItemsByCode(String code) {\n        return null;\n    }\n\n    @Override\n    public List<DictModel> queryEnableDictItemsByCode(String code) {\n        return null;\n    }\n\n    @Override\n    public List<DictModel> queryAllDict() {\n        log.error(\"fegin接口queryAllDict失败：\"+cause.getMessage(), cause);\n        return null;\n    }\n\n    @Override\n    public List<SysCategoryModel> queryAllSysCategory() {\n        return null;\n    }\n\n    @Override\n    public List<DictModel> queryTableDictItemsByCode(String tableFilterSql, String text, String code) {\n        return null;\n    }\n\n    @Override\n    public List<DictModel> queryAllDepartBackDictModel() {\n        return null;\n    }\n\n    @Override\n    public void updateSysAnnounReadFlag(String busType, String busId) {\n\n    }\n\n    @Override\n    public List<DictModel> queryFilterTableDictInfo(String table, String text, String code, String filterSql) {\n        return null;\n    }\n\n    @Override\n    public List<String> queryTableDictByKeys(String table, String text, String code, String[] keyArray) {\n        log.error(\"queryTableDictByKeys查询失败 {}\", cause);\n        return null;\n    }\n\n    @Override\n    public List<ComboModel> queryAllUserBackCombo() {\n        return null;\n    }\n\n    @Override\n    public JSONObject queryAllUser(String userIds, Integer pageNo, Integer pageSize) {\n        return null;\n    }\n\n    @Override\n    public List<ComboModel> queryAllRole(String[] roleIds) {\n        log.error(\"获取角色信息失败 {}\", cause);\n        return null;\n    }\n\n    @Override\n    public List<String> getRoleIdsByUsername(String username) {\n        return null;\n    }\n\n    @Override\n    public String getDepartIdsByOrgCode(String orgCode) {\n        return null;\n    }\n\n    @Override\n    public List<SysDepartModel> getAllSysDepart() {\n        return null;\n    }\n\n    @Override\n    public DictModel getParentDepartId(String departId) {\n        return null;\n    }\n\n    @Override\n    public List<String> getDeptHeadByDepId(String deptId) {\n        return null;\n    }\n\n    @Override\n    public void sendWebSocketMsg(String[] userIds, String cmd) {\n\n    }\n\n    @Override\n    public List<UserAccountInfo> queryAllUserByIds(String[] userIds) {\n        return null;\n    }\n\n    @Override\n    public void meetingSignWebsocket(String userId) {\n\n    }\n\n    @Override\n    public List<UserAccountInfo> queryUserByNames(String[] userNames) {\n        return null;\n    }\n\n    @Override\n    public Set<String> getUserRoleSet(String username) {\n        return null;\n    }\n\n    @Override\n    public Set<String> getUserRoleSetById(String userId) {\n        return null;\n    }\n\n    @Override\n    public Set<String> getUserPermissionSet(String userId) {\n        return null;\n    }\n\n    @Override\n    public boolean hasOnlineAuth(OnlineAuthDTO onlineAuthDTO) {\n        return false;\n    }\n\n    @Override\n    public SysDepartModel selectAllById(String id) {\n        return null;\n    }\n\n    @Override\n    public List<String> queryDeptUsersByUserId(String userId) {\n        return null;\n    }\n\n    @Override\n    public Set<String> queryUserRoles(String username) {\n        return null;\n    }\n\n    @Override\n    public Set<String> queryUserRolesById(String userId) {\n        return null;\n    }\n\n    @Override\n    public Set<String> queryUserAuths(String userId) {\n        return null;\n    }\n\n    @Override\n    public DynamicDataSourceModel getDynamicDbSourceById(String dbSourceId) {\n        return null;\n    }\n\n    @Override\n    public DynamicDataSourceModel getDynamicDbSourceByCode(String dbSourceCode) {\n        return null;\n    }\n\n    @Override\n    public LoginUser getUserByName(String username) {\n        log.error(\"jeecg-system服务节点不通，导致获取登录用户信息失败： \" + cause.getMessage(), cause);\n        return null;\n    }\n\n    @Override\n    public String getUserIdByName(String username) {\n        return null;\n    }\n\n    @Override\n    public String translateDictFromTable(String table, String text, String code, String key) {\n        return null;\n    }\n\n    @Override\n    public String translateDict(String code, String key) {\n        return null;\n    }\n\n    @Override\n    public List<SysPermissionDataRuleModel> queryPermissionDataRule(String component, String requestPath, String username) {\n        return null;\n    }\n\n    @Override\n    public SysUserCacheInfo getCacheUser(String username) {\n        log.error(\"获取用户信息失败 {}\", cause);\n        return null;\n    }\n\n    @Override\n    public List<JSONObject> queryUsersByUsernames(String usernames) {\n        return null;\n    }\n\n    @Override\n    public List<JSONObject> queryUsersByIds(String ids) {\n        return null;\n    }\n\n    @Override\n    public List<JSONObject> queryDepartsByOrgcodes(String orgCodes) {\n        return null;\n    }\n\n    @Override\n    public List<JSONObject> queryDepartsByIds(String ids) {\n        return null;\n    }\n\n    @Override\n    public Map<String, List<DictModel>> translateManyDict(String dictCodes, String keys) {\n        return null;\n    }\n\n    // 代码逻辑说明: [issues/#5643]解决分布式下表字典跨库无法查询问题------------\n    @Override\n    public List<DictModel> translateDictFromTableByKeys(String table, String text, String code, String keys, String dataSource) {\n        return null;\n    }\n\n    @Override\n    public void sendTemplateMessage(MessageDTO message) {\n    }\n\n    @Override\n    public String getTemplateContent(String code) {\n        return null;\n    }\n\n    @Override\n    public void saveDataLog(DataLogDTO dataLogDto) {\n\n    }\n\n    @Override\n    public void sendEmailMsg(String email,String title,String content) {\n\n    }\n\n    @Override\n    public void sendHtmlTemplateEmail(String email, String title, EmailTemplateEnum emailTemplateEnum, JSONObject params) {\n\n    }\n\n    @Override\n    public void sendSmsMsg(String phone, JSONObject params, DySmsEnum dySmsEnum) {\n\n    }\n\n    @Override\n    public List<Map> getDeptUserByOrgCode(String orgCode) {\n        return null;\n    }\n\n//    @Override\n//    public List<JSONObject> queryDepartsByOrgIds(String ids) {\n//        return null;\n//    }\n\n    @Override\n    public List<String> loadCategoryDictItem(String ids) {\n        return null;\n    }\n\n    @Override\n    public List<String> loadCategoryDictItemByNames(String names, boolean delNotExist) {\n        return null;\n    }\n\n    @Override\n    public List<String> loadDictItem(String dictCode, String keys) {\n        return null;\n    }\n\n    @Override\n    public Map<String, String> copyLowAppDict(String originalAppId, String appId, String tenantId) {\n        return null;\n    }\n\n    @Override\n    public List<DictModel> getDictItems(String dictCode) {\n        return null;\n    }\n\n    @Override\n    public Map<String, List<DictModel>> getManyDictItems(List<String> dictCodeList) {\n        return null;\n    }\n\n    @Override\n    public List<DictModel> loadDictItemByKeyword(String dictCode, String keyword, Integer pageNo, Integer pageSize) {\n        return null;\n    }\n\n    @Override\n    public void updateAvatar(LoginUser loginUser) { }\n\n    @Override\n    public void sendAppChatSocket(String userId) {\n        \n    }\n\n    @Override\n    public String getRoleCodeById(String id) {\n        return null;\n    }\n\n    @Override\n    public List<DictModel> queryRoleDictByCode(String roleCodes) {\n        return null;\n    }\n\n    @Override\n    public List<JSONObject> queryUserBySuperQuery(String superQuery, String matchType) {\n        return null;\n    }\n\n    @Override\n    public JSONObject queryUserById(String id) {\n        return null;\n    }\n\n    @Override\n    public List<JSONObject> queryDeptBySuperQuery(String superQuery, String matchType) {\n        return null;\n    }\n\n    @Override\n    public List<JSONObject> queryRoleBySuperQuery(String superQuery, String matchType) {\n        return null;\n    }\n\n    @Override\n    public List<String> selectUserIdByTenantId(String tenantId) {\n        return null;\n    }\n\n    @Override\n    public List<String> queryUserIdsByDeptIds(List<String> deptIds) {\n        return null;\n    }\n\n    @Override\n    public List<String> queryUserIdsByDeptPostIds(List<String> deptPostIds) {\n        return List.of();\n    }\n\n    @Override\n    public List<String> queryUserAccountsByDeptIds(List<String> deptIds) {\n        return null;\n    }\n\n    @Override\n    public List<String> queryUserIdsByRoleds(List<String> roleCodes) {\n        return null;\n    }\n\n    @Override\n    public List<String> queryUsernameByIds(List<String> userIds) {\n        return List.of();\n    }\n\n    @Override\n    public List<String> queryUsernameByDepartPositIds(List<String> positionIds) {\n        return null;\n    }\n\n    @Override\n    public List<String> queryUserIdsByPositionIds(List<String> positionIds) {\n        return null;\n    }\n\n    @Override\n    public List<String> getUserAccountsByDepCode(String orgCode) {\n        return null;\n    }\n\n    @Override\n    public boolean dictTableWhiteListCheckBySql(String selectSql) {\n        return false;\n    }\n\n    @Override\n    public boolean dictTableWhiteListCheckByDict(String tableOrDictCode, String... fields) {\n        return false;\n    }\n\n    @Override\n    public void announcementAutoRelease(String dataId, String currentUserName) {\n\n    }\n\n    @Override\n    public SysDepartModel queryCompByOrgCode(String orgCode) {\n        return null;\n    }\n\n    @Override\n    public SysDepartModel queryCompByOrgCodeAndLevel(String orgCode, Integer level) {\n        return null;\n    }\n\n    @Override\n    public Object runAiragFlow(AiragFlowDTO airagFlowDTO) {\n        return null;\n    }\n\n    @Override\n    public SseEmitter runAiragFlowStream(AiragFlowDTO airagFlowDTO) {\n        return null;\n    }\n\n    @Override\n    public void uniPushMsgToUser(PushMessageDTO pushMessageDTO) {\n\n    }\n\n    @Override\n    public String getDepartPathNameByOrgCode(String orgCode, String depId) {\n        return \"\";\n    }\n\n    @Override\n    public List<String> queryUserIdsByCascadeDeptIds(List<String> deptIds) {\n        return null;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java/org/jeecg/config/FeignConfig.java",
    "content": "//package org.jeecg.config;\n//\n//import java.io.IOException;\n//import java.util.ArrayList;\n//import java.util.Arrays;\n//import java.util.List;\n//import java.util.SortedMap;\n//\n//import jakarta.servlet.http.HttpServletRequest;\n//\n//import org.jeecg.common.config.mqtoken.UserTokenContext;\n//import org.jeecg.common.constant.CommonConstant;\n//import org.jeecg.common.util.DateUtils;\n//import org.jeecg.common.util.PathMatcherUtil;\n//import org.jeecg.config.sign.interceptor.SignAuthConfiguration;\n//import org.jeecg.config.sign.util.HttpUtils;\n//import org.jeecg.config.sign.util.SignUtil;\n//import org.springframework.beans.factory.ObjectFactory;\n//import org.springframework.boot.autoconfigure.AutoConfigureBefore;\n//import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;\n//import org.springframework.boot.autoconfigure.http.HttpMessageConverters;\n//import org.springframework.cloud.openfeign.FeignAutoConfiguration;\n//import org.springframework.cloud.openfeign.support.SpringDecoder;\n//import org.springframework.cloud.openfeign.support.SpringEncoder;\n//import org.springframework.context.annotation.Bean;\n//import org.springframework.context.annotation.Configuration;\n//import org.springframework.context.annotation.Primary;\n//import org.springframework.context.annotation.Scope;\n//import org.springframework.http.MediaType;\n//import org.springframework.web.context.request.RequestContextHolder;\n//import org.springframework.web.context.request.ServletRequestAttributes;\n//\n//import com.alibaba.fastjson.JSON;\n//import com.alibaba.fastjson.serializer.SerializerFeature;\n//import com.alibaba.fastjson.support.config.FastJsonConfig;\n//import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;\n//import com.alibaba.fastjson.support.springfox.SwaggerJsonSerializer;\n//\n//import feign.Feign;\n//import feign.Logger;\n//import feign.RequestInterceptor;\n//import feign.codec.Decoder;\n//import feign.codec.Encoder;\n//import feign.form.spring.SpringFormEncoder;\n//import lombok.extern.slf4j.Slf4j;\n//\n///**\n// * @Description: FeignConfig\n// * @author: JeecgBoot\n// */\n//@ConditionalOnClass(Feign.class)\n//@AutoConfigureBefore(FeignAutoConfiguration.class)\n//@Slf4j\n//@Configuration\n//public class FeignConfig {\n//\n//    /**\n//     * 设置feign header参数\n//     * 【X_ACCESS_TOKEN】【X_SIGN】【X_TIMESTAMP】\n//     * @return\n//     */\n//    @Bean\n//    public RequestInterceptor requestInterceptor() {\n//        return requestTemplate -> {\n//            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();\n//            if (null != attributes) {\n//                HttpServletRequest request = attributes.getRequest();\n//                log.debug(\"Feign request: {}\", request.getRequestURI());\n//                // 将token信息放入header中\n//                String token = request.getHeader(CommonConstant.X_ACCESS_TOKEN);\n//                if(token==null || \"\".equals(token)){\n//                    token = request.getParameter(\"token\");\n//                }\n//                log.info(\"Feign Login Request token: {}\", token);\n//                requestTemplate.header(CommonConstant.X_ACCESS_TOKEN, token);\n//            }else{\n//                //解决后台任务、MQ中调用feign接口，无会话token的问题\n//                String  token = UserTokenContext.getToken();\n//                log.info(\"Feign No Login token: {}\", token);\n//                requestTemplate.header(CommonConstant.X_ACCESS_TOKEN, token);\n//            }\n//\n//            //================================================================================================================\n//            //针对特殊接口，进行加签验证 ——根据URL地址过滤请求 【字典表参数签名验证】\n//            if (PathMatcherUtil.matches(Arrays.asList(SignAuthConfiguration.SIGN_URL_LIST),requestTemplate.path())) {\n//                try {\n//                    log.info(\"============================ [begin] fegin api url ============================\");\n//                    log.info(requestTemplate.path());\n//                    log.info(requestTemplate.method());\n//                    String queryLine = requestTemplate.queryLine();\n//                    String questionMark=\"?\";\n//                    if(queryLine!=null && queryLine.startsWith(questionMark)){\n//                        queryLine = queryLine.substring(1);\n//                    }\n//                    log.info(queryLine);\n//                    if(requestTemplate.body()!=null){\n//                        log.info(new String(requestTemplate.body()));\n//                    }\n//                    SortedMap<String, String> allParams = HttpUtils.getAllParams(requestTemplate.path(),queryLine,requestTemplate.body(),requestTemplate.method());\n//                    String sign = SignUtil.getParamsSign(allParams);\n//                    log.info(\" Feign request params sign: {}\",sign);\n//                    log.info(\"============================ [end] fegin api url ============================\");\n//                    requestTemplate.header(CommonConstant.X_SIGN, sign);\n//                    requestTemplate.header(CommonConstant.X_TIMESTAMP, String.valueOf(System.currentTimeMillis()));\n//                } catch (IOException e) {\n//                    e.printStackTrace();\n//                }\n//            }\n//            //================================================================================================================\n//        };\n//    }\n//\n//\n//\n//    /**\n//     * Feign 客户端的日志记录，默认级别为NONE\n//     * Logger.Level 的具体级别如下：\n//     * NONE：不记录任何信息\n//     * BASIC：仅记录请求方法、URL以及响应状态码和执行时间\n//     * HEADERS：除了记录 BASIC级别的信息外，还会记录请求和响应的头信息\n//     * FULL：记录所有请求与响应的明细，包括头信息、请求体、元数据\n//     */\n//    @Bean\n//    Logger.Level feignLoggerLevel() {\n//        return Logger.Level.FULL;\n//    }\n//\n//    /**\n//     * Feign支持文件上传\n//     * @param messageConverters\n//     * @return\n//     */\n//    @Bean\n//    @Primary\n//    @Scope(\"prototype\")\n//    public Encoder multipartFormEncoder(ObjectFactory<HttpMessageConverters> messageConverters) {\n//        return new SpringFormEncoder(new SpringEncoder(messageConverters));\n//    }\n//\n//    /**\n//     * 给 Feign 添加 FastJson 的解析支持\n//     */\n//    @Bean\n//    public Encoder feignEncoder() {\n//        return new SpringEncoder(feignHttpMessageConverter());\n//    }\n//\n//    @Bean(\"apiFeignDecoder\")\n//    public Decoder feignDecoder() {\n//        return new SpringDecoder(feignHttpMessageConverter());\n//    }\n//\n//    /**\n//     * 设置解码器为fastjson\n//     *\n//     * @return\n//     */\n//    private ObjectFactory<HttpMessageConverters> feignHttpMessageConverter() {\n//        final HttpMessageConverters httpMessageConverters = new HttpMessageConverters(this.getFastJsonConverter());\n//        return () -> httpMessageConverters;\n//    }\n//\n//    private FastJsonHttpMessageConverter getFastJsonConverter() {\n//        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();\n//\n//        List<MediaType> supportedMediaTypes = new ArrayList<>();\n//        MediaType mediaTypeJson = MediaType.valueOf(MediaType.APPLICATION_JSON_VALUE);\n//        supportedMediaTypes.add(mediaTypeJson);\n//        converter.setSupportedMediaTypes(supportedMediaTypes);\n//        FastJsonConfig config = new FastJsonConfig();\n//        config.getSerializeConfig().put(JSON.class, new SwaggerJsonSerializer());\n//        config.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);\n//        converter.setFastJsonConfig(config);\n//\n//        return converter;\n//    }\n//    \n//\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-system-api</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>jeecg-system-local-api</artifactId>\n\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/airag/api/IAiragBaseApi.java",
    "content": "package org.jeecg.common.airag.api;\n\n/**\n * airag baseAPI\n *\n * @author sjlei\n * @date 2025-12-30\n */\npublic interface IAiragBaseApi {\n\n    /**\n     * 知识库写入文本文档\n     *\n     * @param knowledgeId 知识库ID\n     * @param title       文档标题\n     * @param content     文档内容\n     * @return 新增的文档ID\n     * @author sjlei\n     * @date 2025-12-30\n     */\n    String knowledgeWriteTextDocument(String knowledgeId, String title, String content);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/online/api/IOnlineBaseExtApi.java",
    "content": "package org.jeecg.common.online.api;\n\nimport com.alibaba.fastjson.JSONObject;\nimport org.jeecg.common.system.vo.DictModel;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * 表单设计器【Online】翻译API接口\n *\n * @author sunjianlei\n */\npublic interface IOnlineBaseExtApi {\n\n    /**\n     * 【Online】 表单设计器专用：同步新增\n     * @param tableName 表名\n     * @param jsonObject\n     * @throws Exception\n     * @return String\n     */\n    String cgformPostCrazyForm(String tableName, JSONObject jsonObject) throws Exception;\n\n    /**\n     * 【Online】 表单设计器专用：同步编辑\n     * @param tableName 表名\n     * @param jsonObject\n     * @throws Exception\n     * @return String\n     */\n    String cgformPutCrazyForm(String tableName, JSONObject jsonObject) throws Exception;\n\n    /**\n     * online表单删除数据\n     *\n     * @param cgformCode Online表单code\n     * @param dataIds    数据ID，可逗号分割\n     * @return\n     */\n    String cgformDeleteDataByCode(String cgformCode, String dataIds);\n\n    /**\n     * 通过online表名查询数据，同时查询出子表的数据\n     *\n     * @param tableName online表名\n     * @param dataIds   online数据ID\n     * @return\n     */\n    JSONObject cgformQueryAllDataByTableName(String tableName, String dataIds);\n\n    /**\n     * 对 cgreportGetData 的返回值做优化，封装 DictModel 集合\n     * @param code\n     * @param dictCode\n     * @param dataList\n     * @param dictText 字典文本\n     * @return\n     */\n    List<DictModel> cgreportGetDataPackage(String code, String dictText, String dictCode, String dataList);\n\n    /**\n     * 【cgreport】通过 head code 获取 sql语句，并执行该语句返回查询数据\n     *\n     * @param code     报表Code，如果没传ID就通过code查\n     * @param forceKey\n     * @param dataList\n     * @return\n     */\n    Map<String, Object> cgreportGetData(String code, String forceKey, String dataList);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java",
    "content": "package org.jeecg.common.system.api;\n\nimport com.alibaba.fastjson.JSONObject;\nimport org.jeecg.common.api.CommonAPI;\nimport org.jeecg.common.api.dto.AiragFlowDTO;\nimport org.jeecg.common.api.dto.DataLogDTO;\nimport org.jeecg.common.api.dto.OnlineAuthDTO;\nimport org.jeecg.common.api.dto.PushMessageDTO;\nimport org.jeecg.common.api.dto.message.*;\nimport org.jeecg.common.constant.enums.DySmsEnum;\nimport org.jeecg.common.constant.enums.EmailTemplateEnum;\nimport org.jeecg.common.system.vo.*;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.servlet.mvc.method.annotation.SseEmitter;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\n\n/**\n * @Description  底层共通业务API，提供其他独立模块调用\n * @Author  scott\n * @Date 2019-4-20\n * @Version V1.0\n */\npublic interface ISysBaseAPI extends CommonAPI {\n\n    //=======OLD 系统消息推送接口============================\n    /**\n     * 1发送系统消息\n     * @param message 使用构造器赋值参数 如果不设置category(消息类型)则默认为2 发送系统消息\n     */\n    void sendSysAnnouncement(MessageDTO message);\n\n    /**\n     * 2发送消息 附带业务参数\n     * @param message 使用构造器赋值参数\n     */\n    void sendBusAnnouncement(BusMessageDTO message);\n\n    /**\n     * 3通过模板发送消息\n     * @param message 使用构造器赋值参数\n     */\n    void sendTemplateAnnouncement(TemplateMessageDTO message);\n\n    /**\n     * 4通过模板发送消息 附带业务参数\n     * @param message 使用构造器赋值参数\n     */\n    void sendBusTemplateAnnouncement(BusTemplateMessageDTO message);\n    \n    /**\n     * 5通过消息中心模板，生成推送内容\n     * @param templateDTO 使用构造器赋值参数\n     * @return\n     */\n    String parseTemplateByCode(TemplateDTO templateDTO);\n    //=======OLD 系统消息推送接口============================\n\n    //=======TY NEW 自定义消息推送接口，邮件、钉钉、企业微信、系统消息============================\n    /**\n     * NEW发送模板消息【新，支持自定义推送类型: 邮件、钉钉、企业微信、系统消息】\n     * @param message\n     */\n    void sendTemplateMessage(MessageDTO message);\n\n    /**\n     * NEW根据模板编码获取模板内容【新，支持自定义推送类型】\n     * @param templateCode\n     * @return\n     */\n    String getTemplateContent(String templateCode);\n    //=======TY NEW 自定义消息推送接口，邮件、钉钉、企业微信、系统消息============================\n    \n    /**\n     * 6根据用户id查询用户信息\n     * @param id\n     * @return\n     */\n    LoginUser getUserById(String id);\n\n    /**\n     * 7通过用户账号查询角色集合\n     * @param username\n     * @return\n     */\n    List<String> getRolesByUsername(String username);\n    \n    /**\n     * 7通过用户账号查询角色集合\n     * @param userId\n     * @return\n     */\n    List<String> getRolesByUserId(String userId);\n\n    /**\n     * 8通过用户账号查询部门集合\n     * @param username\n     * @return 部门 id\n     */\n    List<String> getDepartIdsByUsername(String username);\n    /**\n     * 8通过用户账号查询部门集合\n     * @param userId\n     * @return 部门 id\n     */\n    List<String> getDepartIdsByUserId(String userId);\n\n    /**\n     * 8.2 通过用户账号查询部门父ID集合\n     * @param username\n     * @return 部门 parentIds\n     */\n    Set<String> getDepartParentIdsByUsername(String username);\n\n    /**\n     * 8.2 查询部门父ID集合\n     * @param depIds\n     * @return 部门 parentIds\n     */\n    Set<String> getDepartParentIdsByDepIds(Set<String> depIds);\n\n    /**\n     * 9通过用户账号查询部门 name\n     * @param username\n     * @return 部门 name\n     */\n    List<String> getDepartNamesByUsername(String username);\n\n\n\n    /** 11查询所有的父级字典，按照create_time排序\n     * @return List<DictModel> 字典集合\n     */\n    public List<DictModel> queryAllDict();\n\n    /**\n     * 12查询所有分类字典\n     * @return\n     */\n    public List<SysCategoryModel> queryAllSysCategory();\n\n\n    /**\n     * 14查询所有部门 作为字典信息 id -->value,departName -->text\n     * @return\n     */\n    public List<DictModel> queryAllDepartBackDictModel();\n\n    /**\n     * 15根据业务类型及业务id修改消息已读\n     * @param busType\n     * @param busId\n     */\n    public void updateSysAnnounReadFlag(String busType, String busId);\n\n    /**\n     * 16查询表字典 支持过滤数据\n     * @param table\n     * @param text\n     * @param code\n     * @param filterSql\n     * @return\n     */\n    public List<DictModel> queryFilterTableDictInfo(String table, String text, String code, String filterSql);\n\n    /**\n     * 17查询指定table的 text code 获取字典，包含text和value\n     * @param table\n     * @param text\n     * @param code\n     * @param keyArray\n     * @return\n     */\n    @Deprecated\n    public List<String> queryTableDictByKeys(String table, String text, String code, String[] keyArray);\n\n    /**\n     * 18查询所有用户 返回ComboModel\n     * @return\n     */\n    public List<ComboModel> queryAllUserBackCombo();\n\n    /**\n     * 19分页查询用户 返回JSONObject\n     * @param userIds 多个用户id\n     * @param pageNo 当前页数\n     * @param pageSize 每页显示条数\n     * @return\n     */\n    public JSONObject queryAllUser(String userIds, Integer pageNo, Integer pageSize);\n\n    /**\n     * 20获取所有角色\n     * @return\n     */\n    public List<ComboModel> queryAllRole();\n\n    /**\n     * 21获取所有角色 带参\n     * @param roleIds 默认选中角色\n     * @return\n     */\n    public List<ComboModel> queryAllRole(String[] roleIds );\n\n    /**\n     * 22通过用户账号查询角色Id集合\n     * @param username\n     * @return\n     */\n    public List<String> getRoleIdsByUsername(String username);\n\n    /**\n     * 23通过部门编号查询部门id\n     * @param orgCode\n     * @return\n     */\n    public String getDepartIdsByOrgCode(String orgCode);\n\n    /**\n     * 24查询所有部门\n     * @return\n     */\n    public List<SysDepartModel> getAllSysDepart();\n\n    /**\n     * 25查找父级部门\n     * @param departId\n     * @return\n     */\n    DictModel getParentDepartId(String departId);\n\n    /**\n     * 26根据部门Id获取部门负责人\n     * @param deptId\n     * @return\n     */\n    public List<String> getDeptHeadByDepId(String deptId);\n\n    /**\n     * 27给指定用户发消息\n     * @param userIds\n     * @param cmd\n     */\n    public void sendWebSocketMsg(String[] userIds, String cmd);\n\n    /**\n     * 28根据id获取所有参与用户\n     * @param userIds 多个用户id\n     * @return\n     */\n    public List<UserAccountInfo> queryAllUserByIds(String[] userIds);\n\n    /**\n     * 29将会议签到信息推动到预览\n     * userIds\n     * @return\n     * @param userId\n     */\n    void meetingSignWebsocket(String userId);\n\n    /**\n     * 30根据name获取所有参与用户\n     * @param userNames 多个用户账户\n     * @return\n     */\n    List<UserAccountInfo> queryUserByNames(String[] userNames);\n\n\n    /**\n     * 根据高级查询条件查询用户\n     * @param superQuery\n     * @param matchType\n     * @return\n     */\n    List<JSONObject> queryUserBySuperQuery(String superQuery,String matchType);\n\n\n    /**\n     * 根据ID查询用户\n     * @param id\n     * @return\n     */\n    JSONObject queryUserById(String id);\n\n\n    /**\n     * 根据高级查询条件查询部门\n     * @param superQuery\n     * @param matchType\n     * @return\n     */\n    List<JSONObject> queryDeptBySuperQuery(String superQuery,String matchType);\n\n    /**\n     * 根据高级查询条件查询角色\n     * @param superQuery\n     * @param matchType\n     * @return\n     */\n    List<JSONObject> queryRoleBySuperQuery(String superQuery,String matchType);\n\n\n    /**\n     * 根据租户ID查询用户ID\n     * @param tenantId 租户ID\n     * @return List<String>\n     */\n    List<String> selectUserIdByTenantId(String tenantId);\n\n\n\n    /**\n     * 31获取用户的角色集合\n     * @param username\n     * @return\n     */\n    Set<String> getUserRoleSet(String username);\n    /**\n     * 31获取用户的角色集合\n     * @param useId\n     * @return\n     */\n    Set<String> getUserRoleSetById(String useId);\n    \n    /**\n     * 32获取用户的权限集合\n     * @param userId\n     * @return\n     */\n    Set<String> getUserPermissionSet(String userId);\n\n    /**\n     * 33判断是否有online访问的权限\n     * @param onlineAuthDTO\n     * @return\n     */\n    boolean hasOnlineAuth(OnlineAuthDTO onlineAuthDTO);\n\n    /**\n     * 34通过部门id获取部门全部信息\n     * @param id 部门id\n     * @return SysDepartModel对象\n     */\n    SysDepartModel selectAllById(String id);\n\n    /**\n     * 35根据用户id查询用户所属公司下所有用户ids\n     * @param userId\n     * @return\n     */\n    List<String> queryDeptUsersByUserId(String userId);\n\n    /**\n     * 36根据多个用户账号(逗号分隔)，查询返回多个用户信息\n     * @param usernames\n     * @return\n     */\n    List<JSONObject> queryUsersByUsernames(String usernames);\n\n    /**\n     * 37根据多个用户ID(逗号分隔)，查询返回多个用户信息\n     * @param ids\n     * @return\n     */\n    List<JSONObject> queryUsersByIds(String ids);\n\n    /**\n     * 38根据多个部门编码(逗号分隔)，查询返回多个部门信息\n     * @param orgCodes\n     * @return\n     */\n    List<JSONObject> queryDepartsByOrgcodes(String orgCodes);\n\n    /**\n     * 39根据多个部门id(逗号分隔)，查询返回多个部门信息\n     * @param ids\n     * @return\n     */\n    List<JSONObject> queryDepartsByIds(String ids);\n\n    /**\n     * 40发送邮件消息\n     * @param email\n     * @param title\n     * @param content\n     */\n    void sendEmailMsg(String email,String title,String content);\n\n    /**\n     * 40发送模版邮件消息\n     *\n     * @param email             接收邮箱\n     * @param title             邮件标题\n     * @param emailTemplateEnum 邮件模版枚举\n     * @param params            模版参数\n     */\n    void sendHtmlTemplateEmail(String email, String title, EmailTemplateEnum emailTemplateEnum, JSONObject params);\n    /**\n     * 41 获取公司下级部门和公司下所有用户信息\n     * @param orgCode\n     * @return List<Map>\n     */\n    List<Map> getDeptUserByOrgCode(String orgCode);\n    /**\n     * 42 发送短信消息\n     * @param phone 手机号\n     * @param param 模版参数\n     * @param dySmsEnum 短信模版\n     */\n    void sendSmsMsg(String phone, JSONObject param, DySmsEnum dySmsEnum);\n    /**\n     * 查询分类字典翻译\n     * @param ids 多个分类字典id\n     * @return List<String>\n     */\n    List<String> loadCategoryDictItem(String ids);\n\n    /**\n     * 反向翻译分类字典，用于导入\n     *\n     * @param names 名称，逗号分割\n     */\n    List<String> loadCategoryDictItemByNames(String names, boolean delNotExist);\n\n    /**\n     * 根据字典code加载字典text\n     *\n     * @param dictCode 顺序：tableName,text,code\n     * @param keys     要查询的key\n     * @return\n     */\n    List<String> loadDictItem(String dictCode, String keys);\n\n    /**\n     * 复制应用下的所有字典配置到新的租户下\n     * \n     * @param originalAppId  原始低代码应用ID\n     * @param appId   新的低代码应用ID\n     * @param tenantId  新的租户ID\n     * @return  Map<String, String>  Map<原字典编码, 新字典编码> \n     */\n    Map<String, String> copyLowAppDict(String originalAppId, String appId, String tenantId);\n\n    /**\n     * 根据字典code查询字典项\n     *\n     * @param dictCode 顺序：tableName,text,code\n     * @param dictCode 要查询的key\n     * @return\n     */\n    List<DictModel> getDictItems(String dictCode);\n\n    /**\n     *  根据多个字典code查询多个字典项\n     * @param dictCodeList\n     * @return key = dictCode ； value=对应的字典项\n     */\n    Map<String, List<DictModel>> getManyDictItems(List<String> dictCodeList);\n\n    /**\n     * 【JSearchSelectTag下拉搜索组件专用接口】\n     * 大数据量的字典表 走异步加载  即前端输入内容过滤数据\n     *\n     * @param dictCode 字典code格式：table,text,code\n     * @param keyword 过滤关键字\n     * @param pageSize 分页条数\n     * @return\n     */\n    List<DictModel> loadDictItemByKeyword(String dictCode, String keyword, Integer pageNo, Integer pageSize);\n\n    /**\n     * 新增数据日志\n     * @param dataLogDto\n     */\n    void saveDataLog(DataLogDTO dataLogDto);\n    /**\n     * 更新头像\n     * @param loginUser\n     */\n    void updateAvatar(LoginUser loginUser);\n\n    /**\n     * 向app端 websocket推送聊天刷新消息\n     * @param userId\n     */\n    void sendAppChatSocket(String userId);\n\n    /**\n     * 根据角色id查询角色code\n     * @param id\n     * @return\n     */\n    String getRoleCodeById(String id);\n\n    /**\n     * 根据roleCode查询角色信息，可逗号分隔多个\n     *\n     * @param roleCodes\n     * @return\n     */\n    List<DictModel> queryRoleDictByCode(String roleCodes);\n\n    /**\n     * 根据部门ID查询用户ID\n     * @param deptIds\n     * @return\n     */\n    List<String> queryUserIdsByDeptIds(List<String> deptIds);\n\n    /**\n     * 根据用户ID查询用户名称\n     * @param userIds\n     * @return\n     */\n    List<String> queryUsernameByIds(List<String> userIds);\n\n    /**\n     * 根据部门ID查询部门及其子部门下用户ID <br/>\n     * @param deptIds\n     * @return\n     */\n    List<String> queryUserIdsByCascadeDeptIds(List<String> deptIds);\n    \n    /**\n     * 根据部门ID查询用户账号\n     * @param deptIds\n     * @return\n     */\n    List<String> queryUserAccountsByDeptIds(List<String> deptIds);\n\n    /**\n     * 根据角色编码 查询用户ID\n     * @param roleCodes\n     * @return\n     */\n    List<String> queryUserIdsByRoleds(List<String> roleCodes);\n\n    /**\n     * 根据部门岗位ID查询用户\n     * @param deptPostIds\n     * @return\n     */\n    public List<String> queryUserIdsByDeptPostIds(List<String> deptPostIds);\n    \n    /**\n     * 根据主岗位和兼职岗位ID查询用户ID\n     * @param departPositIds\n     * @return\n     */\n    List<String> queryUsernameByDepartPositIds(List<String> departPositIds);\n\n    /**\n     * 根据职位ID查询用户信息（老方法）\n     * @param positionIds\n     * @return\n     */\n    public List<String> queryUserIdsByPositionIds(List<String> positionIds);\n\n    /**\n     * 根据部门和子部门下的所有用户账号\n     *\n     * @param orgCode 部门编码\n     * @return\n     */\n    public List<String> getUserAccountsByDepCode(String orgCode);\n\n    /**\n     * 检查查询sql的表和字段是否在白名单中\n     *\n     * @param selectSql\n     * @return\n     */\n    boolean dictTableWhiteListCheckBySql(String selectSql);\n\n    /**\n     * 根据字典表或者字典编码，校验是否在白名单中\n     *\n     * @param tableOrDictCode 表名或dictCode\n     * @param fields          如果传的是dictCode，则该参数必须传null\n     * @return\n     */\n    boolean dictTableWhiteListCheckByDict(String tableOrDictCode, String... fields);\n\n    /**\n     * 消息自动发布\n     * @param dataId\n     * @param currentUserName\n     */\n    void announcementAutoRelease(String dataId, String currentUserName);\n\n    /**\n     * 根据部门编码查询公司信息\n     * @param orgCode 部门编码\n     * @return\n     * @author chenrui\n     * @date 2025/8/12 14:53\n     */\n    SysDepartModel queryCompByOrgCode(@RequestParam(name = \"sysCode\") String orgCode);\n\n    /**\n     * 根据部门编码和层次查询上级公司\n     * \n     * @param orgCode 部门编码\n     * @param level 可以传空 默认为1级 最小值为1\n     * @return\n     */\n    SysDepartModel queryCompByOrgCodeAndLevel(String orgCode, Integer level);\n\n    /**\n     * 16 运行AIRag流程\n     * for [QQYUN-13634]在baseapi里面封装方法，方便其他模块调用\n     *\n     * @param airagFlowDTO\n     * @return 流程执行结果,可能是String或者Map\n     * @author chenrui\n     * @date 2025/9/2 11:43\n     */\n    Object runAiragFlow(AiragFlowDTO airagFlowDTO);\n\n    /**\n     * 流式运行AIRag流程\n     * for [QQYUN-13634]在baseapi里面封装方法，方便其他模块调用\n     *\n     * @param airagFlowDTO\n     * @return 流程执行结果,可能是String或者Map\n     * @author chenrui\n     * @date 2025/9/2 11:43\n     */\n    SseEmitter runAiragFlowStream(AiragFlowDTO airagFlowDTO);\n\n    /**\n     * 根据部门code或部门id获取部门名称(当前和上级部门)\n     *\n     * @param orgCode 部门编码\n     * @param depId   部门id\n     * @return String 部门名称\n     */\n    String getDepartPathNameByOrgCode(String orgCode, String depId);\n    /**\n     * 根据用户信息推送PUSH消息\n     *\n     * @param pushMessageDTO   推送消息\n     */\n    void uniPushMsgToUser(PushMessageDTO pushMessageDTO);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-api/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-module-system</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>jeecg-system-api</artifactId>\n    <packaging>pom</packaging>\n\n    <modules>\n        <module>jeecg-system-local-api</module>\n        <module>jeecg-system-cloud-api</module>\n    </modules>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-boot-base-core</artifactId>\n        </dependency>\n    </dependencies>\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/.gitattributes",
    "content": "*.js linguist-language=Java\n*.css linguist-language=Java\n*.html linguist-language=Java\n*.vue linguist-language=Java\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<parent>\n\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t<artifactId>jeecg-module-system</artifactId>\n\t\t<version>3.9.1</version>\n\t</parent>\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<artifactId>jeecg-system-biz</artifactId>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t<artifactId>jeecg-system-local-api</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.hibernate</groupId>\n\t\t\t<artifactId>hibernate-core</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t<artifactId>hibernate-re</artifactId>\n\t\t</dependency>\n\n\t\t<!-- AI大模型管理-->\n\t\t<dependency>\n\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t<artifactId>jeecg-boot-module-airag</artifactId>\n\t\t\t<version>${jeecgboot.version}</version>\n\t\t</dependency> \n\t\t<!-- 企业微信/钉钉 api -->\n\t\t<dependency>\n\t\t\t<groupId>org.jeecgframework</groupId>\n\t\t\t<artifactId>weixin4j</artifactId>\n\t\t</dependency>\n\t\t<!-- 积木报表 -->\n\t\t<dependency>\n\t\t\t<groupId>org.jeecgframework.jimureport</groupId>\n\t\t\t<artifactId>jimureport-spring-boot3-starter</artifactId>\n\t\t</dependency>\n\t\t<!-- 积木报表 csv excel ES JSON mongodbSQL redis支持包\n\t\t<dependency>\n\t\t\t<groupId>org.jeecgframework.jimureport</groupId>\n\t\t\t<artifactId>jimureport-nosql-starter</artifactId>\n\t\t</dependency>-->\n\t\t<!-- 后台导出接口Echart图表支持包，按需引入 \n\t\t<dependency>\n\t\t\t<groupId>org.jeecgframework.jimureport</groupId>\n\t\t\t<artifactId>jimureport-echarts-starter</artifactId>\n\t\t</dependency>-->\n        <!-- 积木BI -->\n        <dependency>\n            <groupId>org.jeecgframework.jimureport</groupId>\n            <artifactId>jimubi-spring-boot3-starter</artifactId>\n        </dependency>\n\t\t<!-- AI大模型管理 -->\n\t\t<dependency>\n\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t<artifactId>jeecg-boot-module-airag</artifactId>\n\t\t\t<version>${jeecgboot.version}</version>\n\t\t</dependency>\n\t</dependencies>\n\t\n</project>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/firewall/SqlInjection/impl/DictTableWhiteListHandlerImpl.java",
    "content": "package org.jeecg.config.firewall.SqlInjection.impl;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.exception.JeecgSqlInjectionException;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.jeecg.config.firewall.SqlInjection.IDictTableWhiteListHandler;\nimport org.jeecg.config.firewall.interceptor.LowCodeModeInterceptor;\nimport org.jeecg.modules.system.entity.SysTableWhiteList;\nimport org.jeecg.modules.system.security.DictQueryBlackListHandler;\nimport org.jeecg.modules.system.service.ISysTableWhiteListService;\nimport org.jeecgframework.minidao.sqlparser.impl.vo.SelectSqlInfo;\nimport org.jeecgframework.minidao.util.MiniDaoUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.net.URLDecoder;\nimport java.util.*;\n\n/**\n * 通用情况的白名单处理，若有无法处理的情况，可以单独写实现类\n */\n@Slf4j\n@Component(\"dictTableWhiteListHandlerImpl\")\npublic class DictTableWhiteListHandlerImpl implements IDictTableWhiteListHandler {\n\n    /**\n     * key-表名\n     * value-字段名，多个逗号隔开\n     * 两种配置方式-- 全部配置成小写\n     * whiteTablesRuleMap.put(\"sys_user\", \"*\")  sys_user所有的字段都支持查询\n     * whiteTablesRuleMap.put(\"sys_user\", \"username,password\")  sys_user中的username和password支持查询\n     */\n    private static final Map<String, String> whiteTablesRuleMap = new HashMap<>();\n    /**\n     * LowCode 是否为 dev 模式\n     */\n    private static Boolean LOW_CODE_IS_DEV = null;\n\n\n    @Autowired\n    private ISysTableWhiteListService sysTableWhiteListService;\n    @Autowired\n    private JeecgBaseConfig jeecgBaseConfig;\n\n    \n    /**\n     * 初始化 whiteTablesRuleMap 方法\n     */\n    private void init() {\n        // 如果当前为dev模式，则每次都查询数据库，防止缓存\n        if (this.isDev()) {\n            DictTableWhiteListHandlerImpl.whiteTablesRuleMap.clear();\n        }\n        // 如果map为空，则从数据库中查询\n        if (DictTableWhiteListHandlerImpl.whiteTablesRuleMap.isEmpty()) {\n            Map<String, String> ruleMap = sysTableWhiteListService.getAllConfigMap();\n            log.debug(\"表字典白名单初始化完成：{}\", ruleMap);\n            DictTableWhiteListHandlerImpl.whiteTablesRuleMap.putAll(ruleMap);\n        }\n    }\n\n    @Override\n    public boolean isPassBySql(String sql) {\n        Map<String, SelectSqlInfo> parsedMap = null;\n        try {\n            parsedMap = MiniDaoUtil.parseAllSelectTable(sql);\n        } catch (Exception e) {\n            log.warn(\"校验sql语句，解析报错：{}\", e.getMessage());\n        }\n        // 如果sql有问题，则肯定执行不了，所以直接返回true\n        if (parsedMap == null) {\n            return true;\n        }\n        log.debug(\"获取select sql信息 ：{} \", parsedMap);\n        // 遍历当前sql中的所有表名，如果有其中一个表或表的字段不在白名单中，则不通过\n        for (Map.Entry<String, SelectSqlInfo> entry : parsedMap.entrySet()) {\n            SelectSqlInfo sqlInfo = entry.getValue();\n            if (sqlInfo.isSelectAll()) {\n                log.warn(\"查询语句中包含 * 字段，暂时先通过\");\n                continue;\n            }\n            Set<String> queryFields = sqlInfo.getAllRealSelectFields();\n            // 校验表名和字段是否允许查询\n            String tableName = entry.getKey();\n            if (!this.checkWhiteList(tableName, queryFields)) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    @Override\n    public boolean isPassByDict(String dictCodeString) {\n        if (oConvertUtils.isEmpty(dictCodeString)) {\n            return true;\n        }\n        try {\n            // 针对转义字符进行解码\n            dictCodeString = URLDecoder.decode(dictCodeString, \"UTF-8\");\n        } catch (Exception e) {\n            log.warn(e.getMessage());\n            //this.throwException(\"字典code解码失败，可能是使用了非法字符，请检查！\");\n        }\n        dictCodeString = dictCodeString.trim();\n        String[] arr = dictCodeString.split(SymbolConstant.COMMA);\n        // 获取表名\n        String tableName = this.getTableName(arr[0]);\n        // 获取查询字段\n        arr = Arrays.copyOfRange(arr, 1, arr.length);\n        // distinct的作用是去重，相当于 Set<String>\n        String[] fields = Arrays.stream(arr).map(String::trim).distinct().toArray(String[]::new);\n        // 校验表名和字段是否允许查询\n        return this.isPassByDict(tableName, fields);\n    }\n\n    @Override\n    public boolean isPassByDict(String tableName, String... fields) {\n        if (oConvertUtils.isEmpty(tableName)) {\n            return true;\n        }\n        if (fields == null || fields.length == 0) {\n            fields = new String[]{\"*\"};\n        }\n        String sql = \"select \" + String.join(\",\", fields) + \" from \" + tableName;\n        log.debug(\"字典拼接的查询SQL：{}\", sql);\n        try {\n            // 进行SQL解析\n            MiniDaoUtil.parseSelectSqlInfo(sql);\n        } catch (Exception e) {\n            // 如果SQL解析失败，则通过字段名和表名进行校验\n            return checkWhiteList(tableName, new HashSet<>(Arrays.asList(fields)));\n        }\n        // 通过SQL解析进行校验，可防止SQL注入\n        return this.isPassBySql(sql);\n    }\n\n    /**\n     * 校验表名和字段是否在白名单内\n     *\n     * @param tableName\n     * @param queryFields\n     * @return\n     */\n    public boolean checkWhiteList(String tableName, Set<String> queryFields) {\n        this.init();\n        // 1、判断“表名”是否通过校验，如果为空则未通过校验\n        if (oConvertUtils.isEmpty(tableName)) {\n            log.error(\"白名单校验：表名为空\");\n            this.throwException();\n        }\n        // 统一转成小写\n        tableName = tableName.toLowerCase();\n        String allowFieldStr = DictTableWhiteListHandlerImpl.whiteTablesRuleMap.get(tableName);\n        log.debug(\"checkWhiteList tableName: {}\", tableName);\n        if (oConvertUtils.isEmpty(allowFieldStr)) {\n            // 如果是dev模式，自动向数据库里添加数据\n            if (this.isDev()) {\n                this.autoAddWhiteList(tableName, String.join(\",\", queryFields));\n                allowFieldStr = DictTableWhiteListHandlerImpl.whiteTablesRuleMap.get(tableName);\n            } else {\n                // prod模式下，直接抛出异常\n                log.error(\"白名单校验：表\\\"{}\\\"未通过校验\", tableName);\n                this.throwException();\n            }\n        }\n        // 2、判断“字段名”是否通过校验\n        // 统一转成小写\n        allowFieldStr = allowFieldStr.toLowerCase();\n        Set<String> allowFields = new HashSet<>(Arrays.asList(allowFieldStr.split(\",\")));\n        // 需要合并的字段\n        Set<String> waitMergerFields = new HashSet<>();\n        for (String field : queryFields) {\n            if(oConvertUtils.isEmpty(field)){\n                continue;\n            }\n            // 统一转成小写\n            field = field.toLowerCase();\n            // 如果允许的字段里不包含查询的字段，则直接抛出异常\n            if (!allowFields.contains(field)) {\n                // 如果是dev模式，记录需要合并的字段\n                if (this.isDev()) {\n                    waitMergerFields.add(field);\n                } else {\n                    log.error(\"白名单校验：字段 {} 不在 {} 范围内，拒绝访问！\", field, allowFields);\n                    this.throwException();\n                }\n            }\n        }\n        // 自动向数据库中合并未通过的字段\n        if (!waitMergerFields.isEmpty()) {\n            this.autoAddWhiteList(tableName, String.join(\",\", waitMergerFields));\n        }\n        log.debug(\"白名单校验：查询表\\\"{}\\\"，查询字段 {} 通过校验\", tableName, queryFields);\n        return true;\n    }\n\n    /**\n     * 自动添加白名单，如果数据库已有，则字段会自动合并\n     *\n     * @param tableName\n     * @param allowFieldStr\n     */\n    private void autoAddWhiteList(String tableName, String allowFieldStr) {\n        try {\n            SysTableWhiteList entity = sysTableWhiteListService.autoAdd(tableName, allowFieldStr);\n            DictTableWhiteListHandlerImpl.whiteTablesRuleMap.put(tableName, entity.getFieldName());\n            log.warn(\"表\\\"{}\\\"未通过校验，且当前为 dev 模式，已自动向数据库中增加白名单数据。查询字段：{}\", tableName, allowFieldStr);\n        } catch (Exception e) {\n            log.error(\"表\\\"{}\\\"未通过校验，且当前为 dev 模式，但自动向数据库中增加白名单数据失败，请排查后重试。错误原因：{}\", tableName, e.getMessage(), e);\n            this.throwException();\n        }\n    }\n\n    /**\n     * 判断当前 LowCode 是否为 dev 模式\n     */\n    private boolean isDev() {\n        if (DictTableWhiteListHandlerImpl.LOW_CODE_IS_DEV == null) {\n            if (this.jeecgBaseConfig.getFirewall() != null) {\n                String lowCodeMode = this.jeecgBaseConfig.getFirewall().getLowCodeMode();\n                DictTableWhiteListHandlerImpl.LOW_CODE_IS_DEV = LowCodeModeInterceptor.LOW_CODE_MODE_DEV.equals(lowCodeMode);\n            } else {\n                // 如果没有 firewall 配置，则默认为 false\n                DictTableWhiteListHandlerImpl.LOW_CODE_IS_DEV = false;\n            }\n        }\n        return DictTableWhiteListHandlerImpl.LOW_CODE_IS_DEV;\n    }\n\n    @Override\n    public boolean clear() {\n        DictTableWhiteListHandlerImpl.whiteTablesRuleMap.clear();\n        return true;\n    }\n\n    \n    /**\n     * 取where前面的为：table name\n     *\n     * @param str\n     * @see DictQueryBlackListHandler#getTableName(String)\n     */\n    @SuppressWarnings(\"JavadocReference\")\n    private String getTableName(String str) {\n        String[] arr = str.split(\"\\\\s+(?i)where\\\\s+\");\n        String tableName = arr[0].trim();\n        //【20230814】解决使用参数tableName=sys_user t&复测，漏洞仍然存在\n        if (tableName.contains(\".\")) {\n            tableName = tableName.substring(tableName.indexOf(\".\") + 1, tableName.length()).trim();\n        }\n        if (tableName.contains(\" \")) {\n            tableName = tableName.substring(0, tableName.indexOf(\" \")).trim();\n        }\n\n        //【issues/4393】 sys_user , (sys_user), sys_user%20, %60sys_user%60\n        String reg = \"\\\\s+|\\\\(|\\\\)|`\";\n        return tableName.replaceAll(reg, \"\");\n    }\n\n    private void throwException() throws JeecgSqlInjectionException {\n        this.throwException(this.getErrorMsg());\n    }\n\n    private void throwException(String message) throws JeecgSqlInjectionException {\n        if (oConvertUtils.isEmpty(message)) {\n            message = this.getErrorMsg();\n        }\n        log.error(message);\n        throw new JeecgSqlInjectionException(message);\n    }\n\n    @Override\n    public String getErrorMsg() {\n        return \"白名单校验未通过！\";\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/init/CodeGenerateDbConfig.java",
    "content": "package org.jeecg.config.init;\n\nimport com.alibaba.druid.filter.config.ConfigTools;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.jeecgframework.codegenerate.database.CodegenDatasourceConfig;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n/**\n * @Description: 代码生成器,自定义DB配置\n * 【加了此类，则online模式DB连接，使用平台的配置，jeecg_database.properties配置无效;\n *  但是使用GUI模式代码生成，还是走jeecg_database.properties配置】\n *  提醒： 达梦数据库需要修改下面的参数${spring.datasource.dynamic.datasource.master.url:}配置\n * @author: scott\n * @date: 2021年02月18日 16:30\n * \n * 重要说明：此类改路径或者名称，需要同步修改\n *  org/jeecg/interceptor/OnlineRepairCodeGenerateDbConfig.java里面的注解\n *  @ConditionalOnMissingClass(\"org.jeecg.config.init.CodeGenerateDbConfig\")\n */\n@Slf4j\n@Configuration\npublic class CodeGenerateDbConfig {\n    @Value(\"${spring.datasource.dynamic.datasource.master.url:}\")\n    private String url;\n    @Value(\"${spring.datasource.dynamic.datasource.master.username:}\")\n    private String username;\n    @Value(\"${spring.datasource.dynamic.datasource.master.password:}\")\n    private String password;\n    @Value(\"${spring.datasource.dynamic.datasource.master.driver-class-name:}\")\n    private String driverClassName;\n    @Value(\"${spring.datasource.dynamic.datasource.master.druid.public-key:}\")\n    private String publicKey;\n\n\n    @Bean\n    public CodeGenerateDbConfig initCodeGenerateDbConfig() {\n        if(StringUtils.isNotBlank(url)){\n            if(StringUtils.isNotBlank(publicKey)){\n                try {\n                    password = ConfigTools.decrypt(publicKey, password);\n                } catch (Exception e) {\n                    e.printStackTrace();\n                    log.error(\" 代码生成器数据库连接，数据库密码解密失败！\");\n                }\n            }\n            CodegenDatasourceConfig.initDbConfig(driverClassName,url, username, password);\n            log.info(\" Init CodeGenerate Config [ Get Db Config From application.yml ] \");\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/init/CodeTemplateInitListener.java",
    "content": "package org.jeecg.config.init;\n\nimport cn.hutool.core.io.FileUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.io.IOUtils;\nimport org.springframework.boot.context.event.ApplicationReadyEvent;\nimport org.springframework.context.ApplicationListener;\nimport org.springframework.core.io.Resource;\nimport org.springframework.core.io.support.PathMatchingResourcePatternResolver;\nimport org.springframework.stereotype.Component;\n\nimport java.io.File;\nimport java.net.URL;\nimport java.nio.charset.StandardCharsets;\n\n/**\n * 自动初始化代码生成器模板\n * <p>\n * 解决JAR发布需要手工配置代码生成器模板问题\n * @author zhang\n */\n@Slf4j\n@Component\npublic class CodeTemplateInitListener implements ApplicationListener<ApplicationReadyEvent> {\n\n    @Override\n    public void onApplicationEvent(ApplicationReadyEvent event) {\n        try {\n            long startTime = System.currentTimeMillis(); // 记录开始时间\n            log.info(\" Init Code Generate Template [ 检测如果是JAR启动，Copy模板到config目录 ] \");\n            this.initJarConfigCodeGeneratorTemplate();\n            long endTime = System.currentTimeMillis(); // 记录结束时间\n            log.info(\" Init Code Generate Template completed in \" + (endTime - startTime) + \" ms\"); // 计算并记录耗时\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    /**\n     * ::Jar包启动模式下::\n     * 初始化代码生成器模板文件\n     */\n    private void initJarConfigCodeGeneratorTemplate() throws Exception {\n        //1.获取jar同级下的config路径\n        String configPath = System.getProperty(\"user.dir\") + File.separator + \"config\" + File.separator;\n        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();\n        Resource[] resources = resolver.getResources(\"classpath*:jeecg/code-template-online/**/*\");\n        for (Resource re : resources) {\n            URL url = re.getURL();\n            String filepath = url.getPath();\n            //System.out.println(\"native url= \" + filepath);\n            filepath = java.net.URLDecoder.decode(filepath, \"utf-8\");\n            //System.out.println(\"decode url= \" + filepath);\n\n            //2.在config下，创建jeecg/code-template-online/*模板\n            String createFilePath = configPath + filepath.substring(filepath.indexOf(\"jeecg/code-template-online\"));\n\n            // 非jar模式不生成模板\n            // 不生成目录，只生成具体模板文件\n            if ((!filepath.contains(\".jar!/BOOT-INF/lib/\") && !filepath.contains(\".jar/!BOOT-INF/lib/\")) || !createFilePath.contains(\".\")) {\n                continue;\n            }\n            if (!FileUtil.exist(createFilePath)) {\n                log.info(\"create file codeTemplate = \" + createFilePath);\n                FileUtil.writeString(IOUtils.toString(url, StandardCharsets.UTF_8), createFilePath, \"UTF-8\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/init/ShiroCacheClearRunner.java",
    "content": "package org.jeecg.config.init;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.util.RedisUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.ApplicationArguments;\nimport org.springframework.boot.ApplicationRunner;\nimport org.springframework.stereotype.Component;\n\n/**\n * Shiro缓存清理\n * 在应用启动时清除所有的Shiro授权缓存\n * 主要用于解决重启项目，用户未重新登录，按钮权限不生效的问题\n */\n@Slf4j\n@Component\npublic class ShiroCacheClearRunner implements ApplicationRunner {\n\n    @Autowired\n    private RedisUtil redisUtil;\n\n    @Override\n    public void run(ApplicationArguments args) {\n        // 清空所有授权redis缓存\n        log.info(\"——— Service restart, clearing all user shiro authorization cache ——— \");\n        redisUtil.removeAll(CommonConstant.PREFIX_USER_SHIRO_CACHE);\n\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/init/SystemInitListener.java",
    "content": "package org.jeecg.config.init;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.constant.CacheConstant;\nimport org.jeecg.config.JeecgCloudCondition;\nimport org.jeecg.modules.system.service.ISysGatewayRouteService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.context.event.ApplicationReadyEvent;\nimport org.springframework.context.ApplicationListener;\nimport org.springframework.context.annotation.Conditional;\nimport org.springframework.core.Ordered;\nimport org.springframework.stereotype.Component;\n\n/**\n * @desc: 启动程序，初始化路由配置\n * @author: flyme\n */\n@Slf4j\n@Component\n@Conditional(JeecgCloudCondition.class)\npublic class SystemInitListener implements ApplicationListener<ApplicationReadyEvent>, Ordered {\n\n\n    @Autowired\n    private ISysGatewayRouteService sysGatewayRouteService;\n\n    @Override\n    public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {\n\n        log.info(\" 服务已启动，初始化路由配置 ###################\");\n        String context = \"AnnotationConfigServletWebServerApplicationContext\";\n        if (applicationReadyEvent.getApplicationContext().getDisplayName().indexOf(context) > -1) {\n            sysGatewayRouteService.addRoute2Redis(CacheConstant.GATEWAY_ROUTES);\n        }\n\n    }\n\n    @Override\n    public int getOrder() {\n        return 1;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/init/TomcatFactoryConfig.java",
    "content": "package org.jeecg.config.init;\n\nimport org.apache.catalina.Context;\nimport org.apache.tomcat.util.scan.StandardJarScanner;\nimport org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n/**\n * @Description: TomcatFactoryConfig\n * @author: scott\n * @date: 2021年01月25日 11:40\n */\n@Configuration\npublic class TomcatFactoryConfig {\n    /**\n     * tomcat-embed-jasper引用后提示jar找不到的问题\n     */\n    @Bean\n    public TomcatServletWebServerFactory tomcatFactory() {\n        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {\n            @Override\n            protected void postProcessContext(Context context) {\n                ((StandardJarScanner) context.getJarScanner()).setScanManifest(false);\n            }\n        };\n        factory.addConnectorCustomizers(connector -> {\n            connector.setProperty(\"relaxedPathChars\", \"[]{}\");\n            connector.setProperty(\"relaxedQueryChars\", \"[]{}\");\n        });\n        return factory;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/init/UndertowConfiguration.java",
    "content": "//package org.jeecg.config.init;\n//\n//import io.undertow.UndertowOptions;\n//import io.undertow.server.DefaultByteBufferPool;\n//import io.undertow.server.handlers.BlockingHandler;\n//import io.undertow.websockets.jsr.WebSocketDeploymentInfo;\n//import org.jeecg.modules.monitor.actuator.undertow.CustomUndertowMetricsHandler;\n//import org.springframework.beans.factory.annotation.Autowired;\n//import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;\n//import org.springframework.boot.web.server.WebServerFactoryCustomizer;\n//import org.springframework.context.annotation.Configuration;\n//\n///**\n// * Undertow配置\n// *\n// * 解决启动提示： WARN  io.undertow.websockets.jsr:68 - UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used\n// */\n//@Configuration\n//public class UndertowConfiguration implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> {\n//\n//    /**\n//     * 自定义undertow监控指标工具类\n//     * for [QQYUN-11902]tomcat 替换undertow 这里的功能还没修改\n//     */\n//    @Autowired\n//    private CustomUndertowMetricsHandler customUndertowMetricsHandler;\n//\n//    @Override\n//    public void customize(UndertowServletWebServerFactory factory) {\n//        // 设置 Undertow 服务器参数（底层网络配置）\n//        factory.addBuilderCustomizers(builder -> {\n//            builder.setServerOption(UndertowOptions.MAX_HEADER_SIZE, 65536);      // header 最大64KB\n//            builder.setServerOption(UndertowOptions.MAX_PARAMETERS, 10000);       // 最大参数数\n//        });\n//        factory.addDeploymentInfoCustomizers(deploymentInfo -> {\n//\n//            WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo();\n//\n//            // 设置合理的参数\n//            webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(true, 8192));\n//\n//            deploymentInfo.addServletContextAttribute(\"io.undertow.websockets.jsr.WebSocketDeploymentInfo\", webSocketDeploymentInfo);\n//\n//            // 添加自定义 监控 handler\n//            deploymentInfo.addInitialHandlerChainWrapper(next -> new BlockingHandler(customUndertowMetricsHandler.wrap(next)));\n//        });\n//    }\n//}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/jimureport/JimuDragExternalServiceImpl.java",
    "content": "package org.jeecg.config.jimureport;\n\nimport com.alibaba.fastjson.JSONObject;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.dto.LogDTO;\nimport org.jeecg.common.system.api.ISysBaseAPI;\nimport org.jeecg.common.system.vo.DictModel;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.base.service.BaseCommonService;\nimport org.jeecg.modules.drag.service.IOnlDragExternalService;\nimport org.jeecg.modules.drag.vo.DragDictModel;\nimport org.jeecg.modules.drag.vo.DragLogDTO;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.CollectionUtils;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @Description: 字典处理\n * @Author: lsq\n * @Date:2023-01-09\n * @Version:V1.0\n */\n@Slf4j\n@Service(\"onlDragExternalServiceImpl\")\npublic class JimuDragExternalServiceImpl implements IOnlDragExternalService {\n\n    @Autowired\n    @Lazy\n    private BaseCommonService baseCommonService;\n\n    @Autowired\n    @Lazy\n    private ISysBaseAPI sysBaseApi;\n    /**\n     *  根据多个字典code查询多个字典项\n     * @param codeList\n     * @return key = dictCode ； value=对应的字典项\n     */\n    @Override\n    public Map<String, List<DragDictModel>> getManyDictItems(List<String> codeList, List<JSONObject> tableDictList) {\n        Map<String, List<DragDictModel>> manyDragDictItems  = new HashMap<>();\n        if(!CollectionUtils.isEmpty(codeList)){\n            Map<String, List<DictModel>> dictItemsMap = sysBaseApi.getManyDictItems(codeList);\n            dictItemsMap.forEach((k,v)->{\n                List<DragDictModel> dictItems  = new ArrayList<>();\n                v.forEach(dictItem->{\n                    DragDictModel dictModel = new DragDictModel();\n                    BeanUtils.copyProperties(dictItem,dictModel);\n                    dictItems.add(dictModel);\n                });\n                manyDragDictItems.put(k,dictItems);\n            });\n        }\n\n        if(!CollectionUtils.isEmpty(tableDictList)){\n            tableDictList.forEach(item->{\n                List<DragDictModel> dictItems  = new ArrayList<>();\n                JSONObject object = JSONObject.parseObject(item.toString());\n                String dictField = object.getString(\"dictField\");\n                String dictTable = object.getString(\"dictTable\");\n                String dictText = object.getString(\"dictText\");\n                String fieldName = object.getString(\"fieldName\");\n                List<DictModel> dictItemsList = sysBaseApi.queryTableDictItemsByCode(dictTable,dictText,dictField);\n                dictItemsList.forEach(dictItem->{\n                    DragDictModel dictModel = new DragDictModel();\n                    BeanUtils.copyProperties(dictItem,dictModel);\n                    dictItems.add(dictModel);\n                });\n                manyDragDictItems.put(fieldName,dictItems);\n            });\n        }\n        return manyDragDictItems;\n    }\n\n    /**\n     *\n     * @param dictCode\n     * @return\n     */\n    @Override\n    public List<DragDictModel> getDictItems(String dictCode) {\n        List<DragDictModel> dictItems  = new ArrayList<>();\n        if(oConvertUtils.isNotEmpty(dictCode)){\n            List<DictModel> dictItemsList = sysBaseApi.getDictItems(dictCode);\n            dictItemsList.forEach(dictItem->{\n                DragDictModel dictModel = new DragDictModel();\n                BeanUtils.copyProperties(dictItem,dictModel);\n                dictItems.add(dictModel);\n            });\n        }\n        return dictItems;\n    }\n\n    /**\n     * 添加日志\n     * @param dragLogDTO\n     */\n    @Override\n    public void addLog(DragLogDTO dragLogDTO) {\n        if(oConvertUtils.isNotEmpty(dragLogDTO)){\n            LogDTO dto = new LogDTO();\n            BeanUtils.copyProperties(dragLogDTO,dto);\n            baseCommonService.addLog(dto);\n        }\n    }\n\n    /**\n     * 保存日志\n     * @param logMsg\n     * @param logType\n     * @param operateType\n     */\n    @Override\n    public void addLog(String logMsg, int logType, int operateType) {\n        baseCommonService.addLog(logMsg,logType,operateType);\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/config/jimureport/JimuReportTokenService.java",
    "content": "package org.jeecg.config.jimureport;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.system.vo.DictModel;\nimport org.jeecg.common.system.vo.SysUserCacheInfo;\nimport org.jeecg.common.util.RedisUtil;\nimport org.jeecg.common.util.TokenUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.jmreport.api.JmReportTokenServiceI;\nimport org.jeecg.modules.jmreport.common.vo.JmDictModel;\nimport org.jeecg.modules.system.service.impl.SysBaseApiImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.stereotype.Component;\nimport org.springframework.util.CollectionUtils;\n\nimport jakarta.servlet.http.HttpServletRequest;\n\nimport java.util.*;\n\n/**\n * 自定义积木报表鉴权(如果不进行自定义，则所有请求不做权限控制)\n *  * 1.自定义获取登录token\n *  * 2.自定义获取登录用户\n * @author: jeecg-boot\n */\n\n\n@Slf4j\n@Component\npublic class JimuReportTokenService implements JmReportTokenServiceI {\n    @Autowired\n    private SysBaseApiImpl sysBaseApi;\n    @Autowired\n    @Lazy\n    private RedisUtil redisUtil;\n\n    @Override\n    public String getToken(HttpServletRequest request) {\n        try {\n        return TokenUtils.getTokenByRequest(request);\n        } catch (Exception e) {\n            return null;\n        }\n    }\n\n    @Override\n    public String getUsername(String token) {\n        return JwtUtil.getUsername(token);\n    }\n\n    @Override\n    public String[] getRoles(String token) {\n        String username = JwtUtil.getUsername(token);\n        Set roles = sysBaseApi.getUserRoleSet(username);\n        if(CollectionUtils.isEmpty(roles)){\n            return null;\n        }\n        return (String[]) roles.toArray(new String[roles.size()]);\n    }\n\n    @Override\n    public Boolean verifyToken(String token) {\n        return TokenUtils.verifyToken(token, sysBaseApi, redisUtil);\n    }\n\n    @Override\n    public Map<String, Object> getUserInfo(String token) {\n        Map<String, Object> map = new HashMap(5);\n        String username = JwtUtil.getUsername(token);\n        //此处通过token只能拿到一个信息 用户账号  后面的就是根据账号获取其他信息 查询数据或是走redis 用户根据自身业务可自定义\n        SysUserCacheInfo userInfo = null;\n        try {\n            userInfo = sysBaseApi.getCacheUser(username);\n        } catch (Exception e) {\n            log.error(\"获取用户信息异常:\"+ e.getMessage());\n            return map;\n        }\n        //设置账号名\n        map.put(SYS_USER_CODE, userInfo.getSysUserCode());\n        //设置部门编码\n        map.put(SYS_ORG_CODE, userInfo.getSysOrgCode());\n        // 将所有信息存放至map 解析sql/api会根据map的键值解析\n        return map;\n    }\n\n    /**\n     * 将jeecgboot平台的权限传递给积木报表\n     * @param token\n     * @return\n     */\n    @Override\n    public String[] getPermissions(String token) {\n        // 获取用户信息\n        String username = JwtUtil.getUsername(token);\n        SysUserCacheInfo userInfo = null;\n        try {\n            userInfo = sysBaseApi.getCacheUser(username);\n        } catch (Exception e) {\n            log.error(\"获取用户信息异常:\"+ e.getMessage());\n        }\n        if(userInfo == null){\n            return null;\n        }\n        // 查询权限\n        Set<String> userPermissions = sysBaseApi.getUserPermissionSet(userInfo.getSysUserId());\n        if(CollectionUtils.isEmpty(userPermissions)){\n            return null;\n        }\n        return userPermissions.toArray(new String[0]);\n    }\n    \n    //TODO 待升级积木报表依赖版本后启用\n//    @Override\n    public List<JmDictModel> getDictItems(String dictCode) {\n        List<JmDictModel> dictItems  = new ArrayList<>();\n        if(oConvertUtils.isNotEmpty(dictCode)){\n            List<DictModel> dictItemsList = sysBaseApi.getDictItems(dictCode);\n            dictItemsList.forEach(dictItem->{\n                JmDictModel dictModel = new JmDictModel();\n                dictModel.setText(dictItem.getText());\n                dictModel.setValue(dictItem.getValue());\n                dictModel.setDictCode(dictCode);\n                dictItems.add(dictModel);\n            });\n        }\n        return dictItems;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/airag/JeecgBizToolsProvider.java",
    "content": "package org.jeecg.modules.airag;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport dev.langchain4j.agent.tool.ToolSpecification;\nimport dev.langchain4j.model.chat.request.json.JsonObjectSchema;\nimport dev.langchain4j.service.tool.ToolExecutor;\nimport org.apache.commons.lang3.StringUtils;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.util.PasswordUtil;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.airag.llm.handler.JeecgToolsProvider;\nimport org.jeecg.modules.base.service.BaseCommonService;\nimport org.jeecg.modules.system.controller.SysUserController;\nimport org.jeecg.modules.system.entity.SysRole;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.mapper.SysUserMapper;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * for [QQYUN-13565]【AI助手】新增创建用户和查询用户的工具扩展\n * @Description: jeecg llm工具提供者\n * @Author: chenrui\n * @Date: 2025/8/26 18:06\n */\n@Component\npublic class JeecgBizToolsProvider implements JeecgToolsProvider {\n\n    @Autowired\n    SysUserMapper userMapper;\n\n    @Autowired\n    private BaseCommonService baseCommonService;\n\n    @Autowired\n    private org.jeecg.modules.system.service.ISysRoleService sysRoleService;\n\n    @Autowired\n    private org.jeecg.modules.system.service.ISysUserRoleService sysUserRoleService;\n\n    @Autowired\n    private org.jeecg.modules.system.service.ISysUserService sysUserService;\n\n    public Map<ToolSpecification, ToolExecutor> getDefaultTools(){\n        Map<ToolSpecification, ToolExecutor> tools = new HashMap<>();\n        JeecgLlmTools userTool = queryUserTool();\n        tools.put(userTool.getToolSpecification(), userTool.getToolExecutor());\n        JeecgLlmTools addUser = addUserTool();\n        tools.put(addUser.getToolSpecification(), addUser.getToolExecutor());\n        // 新增：查询所有角色\n        JeecgLlmTools queryRoles = queryAllRolesTool();\n        tools.put(queryRoles.getToolSpecification(), queryRoles.getToolExecutor());\n        // 新增：给用户授予角色\n        JeecgLlmTools grantRoles = grantUserRolesTool();\n        tools.put(grantRoles.getToolSpecification(), grantRoles.getToolExecutor());\n        return tools;\n    }\n\n    /**\n     * 添加用户\n     * @return\n     * @author chenrui\n     * @date 2025/8/27 09:51\n     */\n    private JeecgLlmTools addUserTool(){\n        ToolSpecification toolSpecification = ToolSpecification.builder()\n                .name(\"add_user\")\n                .description(\"添加用户,返回添加结果;\" +\n                        \"\\n\\n - 缺少必要字段时,请向用户索要.\" +\n                        \"\\n\\n - 你应该提前判断用户的输入是否合法,比如用户名是否符合规范,手机号和邮箱是否正确等.\" +\n                        \"\\n\\n - 提前使用用户名查询用户是否存在,如果存在则不能添加.\" +\n                        \"\\n\\n - 添加成功后返回成功消息,如果失败则返回失败原因.\" +\n                        \"\\n\\n - 用户名,手机号均要求唯一,提前通过查询用户工具确认唯一性.\" )\n                .parameters(\n                        JsonObjectSchema.builder()\n                                .addStringProperty(\"username\", \"用户名,必填,只允许使用字母、数字、下划线，且必须以字母开头,唯一\")\n                                .addStringProperty(\"password\", \"用户密码,必填\")\n                                .addStringProperty(\"realname\", \"真实姓名,必填\")\n                                //.addStringProperty(\"email\", \"邮箱,必填,唯一\")\n                                .addStringProperty(\"phone\", \"手机号,必填,唯一\")\n                                .required(\"username\",\"password\",\"realname\",\"phone\")\n                                .build()\n                )\n                .build();\n        ToolExecutor toolExecutor = (toolExecutionRequest, memoryId) -> {\n            JSONObject arguments = JSONObject.parseObject(toolExecutionRequest.arguments());\n            arguments.put(\"confirmPassword\",arguments.get(\"password\"));\n            arguments.put(\"userIdentity\",1);\n            arguments.put(\"activitiSync\",1);\n            arguments.put(\"departIds\",\"\");\n            String selectedRoles = arguments.getString(\"selectedroles\");\n            String selectedDeparts = arguments.getString(\"selecteddeparts\");\n            String msg = \"添加用户失败\";\n            try {\n                SysUser user = JSON.parseObject(arguments.toJSONString(), SysUser.class);\n                user.setCreateTime(new Date());//设置创建时间\n                String salt = oConvertUtils.randomGen(8);\n                user.setSalt(salt);\n                String passwordEncode = PasswordUtil.encrypt(user.getUsername(), user.getPassword(), salt);\n                user.setPassword(passwordEncode);\n                user.setStatus(1);\n                user.setDelFlag(CommonConstant.DEL_FLAG_0);\n                //用户表字段org_code不能在这里设置他的值\n                user.setOrgCode(null);\n                // 保存用户走一个service 保证事务\n                //获取租户ids\n                String relTenantIds = arguments.getString(\"relTenantIds\");\n                sysUserService.saveUser(user, selectedRoles, selectedDeparts, relTenantIds, false);\n                baseCommonService.addLog(\"添加用户，username： \" +user.getUsername() ,CommonConstant.LOG_TYPE_2, 2);\n                msg = \"添加用户成功\";\n                // 用户变更，触发同步工作流\n            } catch (Exception e) {\n                e.printStackTrace();\n                msg = \"添加用户失败\";\n            }\n            return msg;\n        };\n        return new JeecgLlmTools(toolSpecification,toolExecutor);\n    }\n\n    /**\n     * 查询用户信息\n     *\n     * @return 用户列表JSON字符串\n     * @author chenrui\n     * @date 2025/8/26 18:52\n     */\n    private JeecgLlmTools queryUserTool() {\n        ToolSpecification toolSpecification = ToolSpecification.builder()\n                .name(\"query_user_by_name\")\n                .description(\"查询用户详细信息，返回json数组。支持用户名、真实姓名、邮箱、手机号 多字段组合查询，用户名、真实姓名、邮箱、手机号均为模糊查询。无条件则返回全部用户。\")\n                .parameters(\n                        JsonObjectSchema.builder()\n                                .addStringProperty(\"username\", \"用户名\")\n                                .addStringProperty(\"realname\", \"真实姓名\")\n                                .addStringProperty(\"email\", \"电子邮件\")\n                                .addStringProperty(\"phone\", \"手机号\")\n                                .build()\n                )\n                .build();\n        ToolExecutor toolExecutor = (toolExecutionRequest, memoryId) -> {\n            SysUser args = JSONObject.parseObject(toolExecutionRequest.arguments(), SysUser.class);\n            QueryWrapper<SysUser> qw = new QueryWrapper<>();\n            if (StringUtils.isNotBlank(args.getUsername())) {\n                qw.like(\"username\", args.getUsername());\n            }\n            if (StringUtils.isNotBlank(args.getRealname())) {\n                qw.like(\"realname\", args.getRealname());\n            }\n            if (StringUtils.isNotBlank(args.getEmail())) {\n                qw.like(\"email\", args.getEmail());\n            }\n            if (StringUtils.isNotBlank(args.getPhone())) {\n                qw.like(\"phone\", args.getPhone());\n            }\n            if (StringUtils.isNotBlank(args.getWorkNo())) {\n                qw.eq(\"work_no\", args.getWorkNo());\n            }\n            qw.eq(\"del_flag\", 0);\n            List<SysUser> users = userMapper.selectList(qw);\n            users.forEach(u -> { u.setPassword(null); u.setSalt(null); });\n            return JSONObject.toJSONString(users);\n        };\n        return new JeecgLlmTools(toolSpecification, toolExecutor);\n    }\n\n    /**\n     * 查询所有角色\n     * @return\n     * @author chenrui\n     * @date 2025/8/27 09:52\n     */\n    private JeecgLlmTools queryAllRolesTool() {\n        ToolSpecification spec = ToolSpecification.builder()\n                .name(\"query_all_roles\")\n                .description(\"查询所有角色，返回json数组。包含字段：id、roleName、roleCode；默认按创建时间/排序号规则由后端决定。\")\n                .parameters(\n                        JsonObjectSchema.builder()\n                                .addStringProperty(\"roleName\", \"角色姓名\")\n                                .addStringProperty(\"roleCode\", \"角色编码\")\n                                .build()\n                )\n                .build();\n        ToolExecutor exec = (toolExecutionRequest, memoryId) -> {\n            // 做租户隔离查询（若开启）\n            SysRole sysRole = JSONObject.parseObject(toolExecutionRequest.arguments(), SysRole.class);\n            QueryWrapper<SysRole> qw = Wrappers.query();\n            if (StringUtils.isNotBlank(sysRole.getRoleName())) {\n                qw.like(\"role_name\", sysRole.getRoleName());\n            }\n            if (StringUtils.isNotBlank(sysRole.getRoleCode())) {\n                qw.like(\"role_code\", sysRole.getRoleCode());\n            }\n            // 未删除\n            List<SysRole> roles = sysRoleService.list(qw);\n            // 仅返回核心字段\n            JSONArray arr = new JSONArray();\n            for (SysRole r : roles) {\n                JSONObject o = new JSONObject();\n                o.put(\"id\", r.getId());\n                o.put(\"roleName\", r.getRoleName());\n                o.put(\"roleCode\", r.getRoleCode());\n                arr.add(o);\n            }\n            return arr.toJSONString();\n        };\n        return new JeecgLlmTools(spec, exec);\n    }\n\n    /**\n     * 给用户授予角色\n     * @return\n     * @author chenrui\n     * @date 2025/8/27 09:52\n     */\n    private JeecgLlmTools grantUserRolesTool() {\n        ToolSpecification spec = ToolSpecification.builder()\n                .name(\"grant_user_roles\")\n                .description(\"给用户授予角色，支持一次授予多个角色；如果关系已存在则跳过。返回授予结果统计。\")\n                .parameters(\n                        JsonObjectSchema.builder()\n                                .addStringProperty(\"userId\", \"用户ID，必填\")\n                                .addStringProperty(\"roleIds\", \"角色ID列表，必填，使用英文逗号分隔\")\n                                .required(\"userId\",\"roleIds\")\n                                .build()\n                )\n                .build();\n        ToolExecutor exec = (toolExecutionRequest, memoryId) -> {\n            JSONObject args = JSONObject.parseObject(toolExecutionRequest.arguments());\n            String userId = args.getString(\"userId\");\n            String roleIdsStr = args.getString(\"roleIds\");\n            if (StringUtils.isAnyBlank(userId, roleIdsStr)) {\n                return \"参数缺失：userId 或 roleIds\";\n            }\n            SysUser user = sysUserService.getById(userId);\n            if (user == null) {\n                return \"用户不存在：\" + userId;\n            }\n            String[] roleIds = roleIdsStr.split(\",\");\n            int added = 0, existed = 0, invalid = 0;\n            for (String roleId : roleIds) {\n                roleId = roleId.trim();\n                if (roleId.isEmpty()) continue;\n                SysRole role = sysRoleService.getById(roleId);\n                if (role == null) { invalid++; continue; }\n                QueryWrapper<org.jeecg.modules.system.entity.SysUserRole> q = new QueryWrapper<>();\n                q.eq(\"role_id\", roleId).eq(\"user_id\", userId);\n                org.jeecg.modules.system.entity.SysUserRole one = sysUserRoleService.getOne(q);\n                if (one == null) {\n                    org.jeecg.modules.system.entity.SysUserRole rel = new org.jeecg.modules.system.entity.SysUserRole(userId, roleId);\n                    boolean ok = sysUserRoleService.save(rel);\n                    if (ok) { added++; } else { invalid++; }\n                } else {\n                    existed++;\n                }\n            }\n            return String.format(\"授予完成：新增%d，已存在%d，无效/失败%d\", added, existed, invalid);\n        };\n        return new JeecgLlmTools(spec, exec);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/airag/TestAiGenWordEnhance.java",
    "content": "package org.jeecg.modules.airag;\n\nimport com.alibaba.fastjson.JSON;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.util.DateUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.airag.flow.component.enhance.IAiRagEnhanceJava;\nimport org.jeecg.modules.airag.wordtpl.entity.EoaWordTemplate;\nimport org.jeecg.modules.airag.wordtpl.service.IEoaWordTemplateService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Collections;\nimport java.util.Map;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\n/**\n * @Description: JavaAIFlow增强节点:生成在线word文档\n * @Author: chenrui\n * @Date: 2025-08-06 16:39\n */\n@Slf4j\n@Component(\"jeecgDemoAiWordGen\")\npublic class TestAiGenWordEnhance implements IAiRagEnhanceJava {\n\n    @Autowired\n    IEoaWordTemplateService eoaWordTemplateService;\n\n    @Override\n    public Map<String, Object> process(Map<String, Object> inputParams) {\n        Object resp = inputParams.get(\"resp\");\n        String respStr = String.valueOf(resp);\n        log.info(\"AI生成word响应内容:{}\", respStr);\n        if(oConvertUtils.isEmpty(respStr)){\n            throw new JeecgBootException(\"AI生成内容失败。请稍后再试或查看后台日志。\");\n        }\n        String mainStr = null;\n        Matcher matcher = Pattern.compile(\"\\\\[.*]\", Pattern.DOTALL).matcher(respStr);\n        if (matcher.find()) {\n            mainStr = matcher.group();\n            // 替换中文双引号为英文双引号\n            mainStr = mainStr.replaceAll(\"[“”]\", \"\\\"\");\n            // 替换 NBSP 为普通空格\n            mainStr = mainStr.replaceAll(\"\\\\u00A0\", \" \");\n            \n            log.info(\"生成word json:{}\", mainStr);\n            // 校验是否为合法 JSON 字符串\n            try {\n                JSON.parse(mainStr);\n            } catch (Exception e) {\n                log.error(e.getMessage(), e);\n                throw new JeecgBootException(\"AI生成的内容不是合法的 JSON 字符串，请稍后再试或优化提示词。\");\n            }\n        }else{\n            throw new JeecgBootException(\"AI生成的内容不是合法的 JSON 字符串，请稍后再试或优化提示词。\");\n        }\n\n        EoaWordTemplate template = new EoaWordTemplate();\n        String dateFormat = DateUtils.formatDate();\n        template.setName(\"AI生成的简历_\"+dateFormat);\n        template.setCode(\"AI_GEN_\"+System.currentTimeMillis());\n        template.setHeader(\"[]\");\n        template.setFooter(\"[]\");\n        template.setMain(mainStr);\n        template.setWidth(794);\n        template.setHeight(1123);\n        template.setMargins(\"[100,120,100,120]\");\n        template.setPaperDirection(\"vertical\");\n        eoaWordTemplateService.save(template);\n        return Collections.singletonMap(\"result\",\"success\");\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/aop/TenantLog.java",
    "content": "package org.jeecg.modules.aop;\n\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.enums.ModuleType;\n\nimport java.lang.annotation.*;\n\n/**\n * 系统日志注解\n * \n * @Author scott\n * @email jeecgos@163.com\n * @Date 2019年1月14日\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\npublic @interface TenantLog {\n\n\t/**\n\t * 操作日志类型（1查询，2添加，3修改，4删除）\n\t * \n\t * @return\n\t */\n\tint value() default 0;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/aop/TenantPackUserLogAspect.java",
    "content": "package org.jeecg.modules.aop;\n\nimport org.apache.shiro.SecurityUtils;\nimport org.aspectj.lang.ProceedingJoinPoint;\nimport org.aspectj.lang.annotation.AfterThrowing;\nimport org.aspectj.lang.annotation.Around;\nimport org.aspectj.lang.annotation.Aspect;\nimport org.aspectj.lang.annotation.Pointcut;\nimport org.aspectj.lang.reflect.MethodSignature;\nimport org.jeecg.common.api.dto.LogDTO;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.modules.base.service.BaseCommonService;\nimport org.jeecg.modules.system.entity.SysTenantPack;\nimport org.jeecg.modules.system.entity.SysTenantPackUser;\nimport org.springframework.stereotype.Component;\n\nimport jakarta.annotation.Resource;\nimport java.lang.reflect.Method;\nimport java.util.Date;\n\n/**\n * @Author taoYan\n * @Date 2023/2/16 14:27\n **/\n@Aspect\n@Component\npublic class TenantPackUserLogAspect {\n\n    @Resource\n    private BaseCommonService baseCommonService;\n\n    @Pointcut(\"@annotation(org.jeecg.modules.aop.TenantLog)\")\n    public void tenantLogPointCut() {\n\n    }\n\n    @Around(\"tenantLogPointCut()\")\n    public Object aroundMethod(ProceedingJoinPoint joinPoint)throws Throwable {\n        //System.out.println(\"环绕通知>>>>>>>>>\");\n\n        MethodSignature signature = (MethodSignature) joinPoint.getSignature();\n        Method method = signature.getMethod();\n        TenantLog log = method.getAnnotation(TenantLog.class);\n        if(log != null){\n            int opType = log.value();\n            Integer logType = null;\n            String content = null;\n            Integer tenantId = null;\n            //获取参数\n            Object[] args = joinPoint.getArgs();\n            if(args.length>0){\n                for(Object obj: args){\n                    if(obj instanceof SysTenantPack){\n                        // logType=3 租户操作日志\n                        logType = CommonConstant.LOG_TYPE_3;\n                        SysTenantPack pack = (SysTenantPack)obj;\n                        if(opType==2){\n                            content = \"创建了角色权限 \"+ pack.getPackName();\n                        }\n                        tenantId = pack.getTenantId();\n                        break;\n                    }else if(obj instanceof SysTenantPackUser){\n                        logType = CommonConstant.LOG_TYPE_3;\n                        SysTenantPackUser packUser = (SysTenantPackUser)obj;\n                        if(opType==2){\n                            content = \"将 \"+packUser.getRealname()+\" 添加到角色 \"+ packUser.getPackName();\n                        }else if(opType==4){\n                            content = \"移除了 \"+packUser.getPackName()+\" 成员 \"+ packUser.getRealname();\n                        }\n                        tenantId = packUser.getTenantId();\n                    }\n                } \n            }\n            if(logType!=null){\n                LogDTO dto = new LogDTO();\n                dto.setLogType(logType);\n                dto.setLogContent(content);\n                dto.setOperateType(opType);\n                dto.setTenantId(tenantId);\n                //获取登录用户信息\n                LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n                if(sysUser!=null){\n                    dto.setUserid(sysUser.getUsername());\n                    dto.setUsername(sysUser.getRealname());\n\n                }\n                dto.setCreateTime(new Date());\n                //保存系统日志\n                baseCommonService.addLog(dto);\n            }\n        }\n        return joinPoint.proceed();\n    }\n\n    @AfterThrowing(\"tenantLogPointCut()\")\n    public void afterThrowing()throws Throwable{\n        System.out.println(\"异常通知\");\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/api/controller/SystemApiController.java",
    "content": "package org.jeecg.modules.api.controller;\n\nimport com.alibaba.fastjson.JSONObject;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.dto.AiragFlowDTO;\nimport org.jeecg.common.api.dto.DataLogDTO;\nimport org.jeecg.common.api.dto.OnlineAuthDTO;\nimport org.jeecg.common.api.dto.PushMessageDTO;\nimport org.jeecg.common.api.dto.message.*;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.enums.DySmsEnum;\nimport org.jeecg.common.constant.enums.EmailTemplateEnum;\nimport org.jeecg.common.desensitization.util.SensitiveInfoUtil;\nimport org.jeecg.common.system.vo.*;\nimport org.jeecg.modules.system.service.ISysUserService;\nimport org.jeecg.modules.system.service.impl.SysBaseApiImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.mvc.method.annotation.SseEmitter;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\n\n\n/**\n * 服务化 system模块 对外接口请求类\n * @author: jeecg-boot\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/sys/api\")\npublic class SystemApiController {\n\n    @Autowired\n    private SysBaseApiImpl sysBaseApi;\n    @Autowired\n    private ISysUserService sysUserService;\n\n    /**\n     * 发送系统消息\n     * @param message 使用构造器赋值参数 如果不设置category(消息类型)则默认为2 发送系统消息\n     */\n    @PostMapping(\"/sendSysAnnouncement\")\n    public void sendSysAnnouncement(@RequestBody MessageDTO message){\n        sysBaseApi.sendSysAnnouncement(message);\n    }\n\n    /**\n     * 发送消息 附带业务参数\n     * @param message 使用构造器赋值参数\n     */\n    @PostMapping(\"/sendBusAnnouncement\")\n    public void sendBusAnnouncement(@RequestBody BusMessageDTO message){\n        sysBaseApi.sendBusAnnouncement(message);\n    }\n\n    /**\n     * 通过模板发送消息\n     * @param message 使用构造器赋值参数\n     */\n    @PostMapping(\"/sendTemplateAnnouncement\")\n    public void sendTemplateAnnouncement(@RequestBody TemplateMessageDTO message){\n        sysBaseApi.sendTemplateAnnouncement(message);\n    }\n\n    /**\n     * 通过模板发送消息 附带业务参数\n     * @param message 使用构造器赋值参数\n     */\n    @PostMapping(\"/sendBusTemplateAnnouncement\")\n    public void sendBusTemplateAnnouncement(@RequestBody BusTemplateMessageDTO message){\n        sysBaseApi.sendBusTemplateAnnouncement(message);\n    }\n\n    /**\n     * 通过消息中心模板，生成推送内容\n     * @param templateDTO 使用构造器赋值参数\n     * @return\n     */\n    @PostMapping(\"/parseTemplateByCode\")\n    public String parseTemplateByCode(@RequestBody TemplateDTO templateDTO){\n        return sysBaseApi.parseTemplateByCode(templateDTO);\n    }\n\n    /**\n     * 根据业务类型busType及业务busId修改消息已读\n     */\n    @GetMapping(\"/updateSysAnnounReadFlag\")\n    public void updateSysAnnounReadFlag(@RequestParam(\"busType\") String busType, @RequestParam(\"busId\")String busId){\n        sysBaseApi.updateSysAnnounReadFlag(busType, busId);\n    }\n\n    /**\n     * 根据用户账号查询用户信息\n     * @param username\n     * @return\n     */\n    @GetMapping(\"/getUserByName\")\n    public LoginUser getUserByName(@RequestParam(\"username\") String username){\n        LoginUser loginUser = sysBaseApi.getUserByName(username);\n        //用户信息加密\n        try {\n            SensitiveInfoUtil.handlerObject(loginUser, true);\n        } catch (IllegalAccessException e) {\n            log.error(e.getMessage(), e);\n        }\n        return loginUser;\n    }\n    \n    /**\n     * 根据用户账号查询用户ID\n     * @param username\n     * @return\n     */\n    @GetMapping(\"/getUserIdByName\")\n    public String getUserIdByName(@RequestParam(\"username\") String username){\n        String userId = sysBaseApi.getUserIdByName(username);\n        return userId;\n    }\n\n    /**\n     * 根据用户id查询用户信息\n     * @param id\n     * @return\n     */\n    @GetMapping(\"/getUserById\")\n    LoginUser getUserById(@RequestParam(\"id\") String id){\n        LoginUser loginUser = sysBaseApi.getUserById(id);\n        //用户信息加密\n        try {\n            SensitiveInfoUtil.handlerObject(loginUser, true);\n        } catch (IllegalAccessException e) {\n            e.printStackTrace();\n        }\n        return loginUser;\n    }\n\n    /**\n     * 通过用户账号查询角色集合\n     * @param username\n     * @return\n     */\n    @GetMapping(\"/getRolesByUsername\")\n    List<String> getRolesByUsername(@RequestParam(\"username\") String username){\n        return sysBaseApi.getRolesByUsername(username);\n    }\n    \n    /**\n     * 通过用户账号查询角色集合\n     * @param userId\n     * @return\n     */\n    @GetMapping(\"/getRolesByUserId\")\n    List<String> getRolesByUserId(@RequestParam(\"userId\") String userId){\n        return sysBaseApi.getRolesByUserId(userId);\n    }\n\n    /**\n     * 通过用户账号查询部门集合\n     * @param username\n     * @return 部门 id\n     */\n    @GetMapping(\"/getDepartIdsByUsername\")\n    List<String> getDepartIdsByUsername(@RequestParam(\"username\") String username){\n        return sysBaseApi.getDepartIdsByUsername(username);\n    }\n    \n    /**\n     * 通过用户账号查询部门集合\n     * @param userId\n     * @return 部门 id\n     */\n    @GetMapping(\"/getDepartIdsByUserId\")\n    List<String> getDepartIdsByUserId(@RequestParam(\"userId\") String userId){\n        return sysBaseApi.getDepartIdsByUserId(userId);\n    }\n\n    /**\n     * 通过用户账号查询部门父ID集合\n     * @param username\n     * @return 部门 id\n     */\n    @GetMapping(\"/getDepartParentIdsByUsername\")\n    Set<String>  getDepartParentIdsByUsername(@RequestParam(\"username\") String username){\n        return sysBaseApi.getDepartParentIdsByUsername(username);\n    }\n\n    /**\n     * 查询部门父ID集合\n     * @param depIds\n     * @return 部门 id\n     */\n    @GetMapping(\"/getDepartParentIdsByDepIds\")\n    Set<String> getDepartParentIdsByDepIds(@RequestParam(\"depIds\") Set<String> depIds){\n        return sysBaseApi.getDepartParentIdsByDepIds(depIds);\n    }\n\n    /**\n     * 通过用户账号查询部门 name\n     * @param username\n     * @return 部门 name\n     */\n    @GetMapping(\"/getDepartNamesByUsername\")\n    List<String> getDepartNamesByUsername(@RequestParam(\"username\") String username){\n        return sysBaseApi.getDepartNamesByUsername(username);\n    }\n\n\n    /**\n     * 获取数据字典\n     * @param code\n     * @return\n     */\n    @GetMapping(\"/queryDictItemsByCode\")\n    List<DictModel> queryDictItemsByCode(@RequestParam(\"code\") String code){\n        return sysBaseApi.queryDictItemsByCode(code);\n    }\n\n    /**\n     * 获取有效的数据字典\n     * @param code\n     * @return\n     */\n    @GetMapping(\"/queryEnableDictItemsByCode\")\n    List<DictModel> queryEnableDictItemsByCode(@RequestParam(\"code\") String code){\n        return sysBaseApi.queryEnableDictItemsByCode(code);\n    }\n\n\n    /** 查询所有的父级字典，按照create_time排序 */\n    @GetMapping(\"/queryAllDict\")\n    List<DictModel> queryAllDict(){\n//        try{\n//            //睡10秒，gateway网关5秒超时，会触发熔断降级操作\n//            Thread.sleep(10000);\n//        }catch (Exception e){\n//            e.printStackTrace();\n//        }\n\n        log.info(\"--我是jeecg-system服务节点，微服务接口queryAllDict被调用--\");\n        return sysBaseApi.queryAllDict();\n    }\n\n    /**\n     * 查询所有分类字典\n     * @return\n     */\n    @GetMapping(\"/queryAllSysCategory\")\n    List<SysCategoryModel> queryAllSysCategory(){\n        return sysBaseApi.queryAllSysCategory();\n    }\n\n\n    /**\n     * 查询所有部门 作为字典信息 id -->value,departName -->text\n     * @return\n     */\n    @GetMapping(\"/queryAllDepartBackDictModel\")\n    List<DictModel> queryAllDepartBackDictModel(){\n        return sysBaseApi.queryAllDepartBackDictModel();\n    }\n\n    /**\n     * 获取所有角色 带参\n     * roleIds 默认选中角色\n     * @return\n     */\n    @GetMapping(\"/queryAllRole\")\n    public List<ComboModel> queryAllRole(@RequestParam(name = \"roleIds\",required = false)String[] roleIds){\n        if(roleIds==null || roleIds.length==0){\n            return sysBaseApi.queryAllRole();\n        }else{\n            return sysBaseApi.queryAllRole(roleIds);\n        }\n    }\n\n    /**\n     * 通过用户账号查询角色Id集合\n     * @param username\n     * @return\n     */\n    @GetMapping(\"/getRoleIdsByUsername\")\n    public List<String> getRoleIdsByUsername(@RequestParam(\"username\")String username){\n        return sysBaseApi.getRoleIdsByUsername(username);\n    }\n\n    /**\n     * 通过部门编号查询部门id\n     * @param orgCode\n     * @return\n     */\n    @GetMapping(\"/getDepartIdsByOrgCode\")\n    public String getDepartIdsByOrgCode(@RequestParam(\"orgCode\")String orgCode){\n        return sysBaseApi.getDepartIdsByOrgCode(orgCode);\n    }\n\n    /**\n     * 查询所有部门\n     * @return\n     */\n    @GetMapping(\"/getAllSysDepart\")\n    public List<SysDepartModel> getAllSysDepart(){\n        return sysBaseApi.getAllSysDepart();\n    }\n\n    /**\n     * 根据 id 查询数据库中存储的 DynamicDataSourceModel\n     *\n     * @param dbSourceId\n     * @return\n     */\n    @GetMapping(\"/getDynamicDbSourceById\")\n    DynamicDataSourceModel getDynamicDbSourceById(@RequestParam(\"dbSourceId\")String dbSourceId){\n        return sysBaseApi.getDynamicDbSourceById(dbSourceId);\n    }\n\n\n\n    /**\n     * 根据部门Id获取部门负责人\n     * @param deptId\n     * @return\n     */\n    @GetMapping(\"/getDeptHeadByDepId\")\n    public List<String> getDeptHeadByDepId(@RequestParam(\"deptId\") String deptId){\n        return sysBaseApi.getDeptHeadByDepId(deptId);\n    }\n\n    /**\n     * 查找父级部门\n     * @param departId\n     * @return\n     */\n    @GetMapping(\"/getParentDepartId\")\n    public DictModel getParentDepartId(@RequestParam(\"departId\")String departId){\n        return sysBaseApi.getParentDepartId(departId);\n    }\n\n    /**\n     * 根据 code 查询数据库中存储的 DynamicDataSourceModel\n     *\n     * @param dbSourceCode\n     * @return\n     */\n    @GetMapping(\"/getDynamicDbSourceByCode\")\n    public DynamicDataSourceModel getDynamicDbSourceByCode(@RequestParam(\"dbSourceCode\") String dbSourceCode){\n        return sysBaseApi.getDynamicDbSourceByCode(dbSourceCode);\n    }\n\n    /**\n     * 给指定用户发消息\n     * @param userIds\n     * @param cmd\n     */\n    @GetMapping(\"/sendWebSocketMsg\")\n    public void sendWebSocketMsg(String[] userIds, String cmd){\n        sysBaseApi.sendWebSocketMsg(userIds, cmd);\n    }\n\n\n    /**\n     * 根据id获取所有参与用户\n     * userIds\n     * @return\n     */\n    @GetMapping(\"/queryAllUserByIds\")\n    public List<UserAccountInfo> queryAllUserByIds(@RequestParam(\"userIds\") String[] userIds){\n        return sysBaseApi.queryAllUserByIds(userIds);\n    }\n\n    /**\n     * 查询所有用户 返回ComboModel\n     * @return\n     */\n    @GetMapping(\"/queryAllUserBackCombo\")\n    public List<ComboModel> queryAllUserBackCombo(){\n        return sysBaseApi.queryAllUserBackCombo();\n    }\n\n    /**\n     * 分页查询用户 返回JSONObject\n     * @return\n     */\n    @GetMapping(\"/queryAllUser\")\n    public JSONObject queryAllUser(@RequestParam(name=\"userIds\",required=false)String userIds, @RequestParam(name=\"pageNo\",required=false) Integer pageNo,@RequestParam(name=\"pageSize\",required=false) Integer pageSize){\n        return sysBaseApi.queryAllUser(userIds, pageNo, pageSize);\n    }\n\n\n\n    /**\n     * 将会议签到信息推动到预览\n     * userIds\n     * @return\n     * @param userId\n     */\n    @GetMapping(\"/meetingSignWebsocket\")\n    public void meetingSignWebsocket(@RequestParam(\"userId\")String userId){\n        sysBaseApi.meetingSignWebsocket(userId);\n    }\n\n    /**\n     * 根据name获取所有参与用户\n     * userNames\n     * @return\n     */\n    @GetMapping(\"/queryUserByNames\")\n    public List<UserAccountInfo> queryUserByNames(@RequestParam(\"userNames\")String[] userNames){\n        return sysBaseApi.queryUserByNames(userNames);\n    }\n\n    /**\n     * 获取用户的角色集合\n     * @param username\n     * @return\n     */\n    @GetMapping(\"/getUserRoleSet\")\n    public Set<String> getUserRoleSet(@RequestParam(\"username\")String username){\n        return sysBaseApi.getUserRoleSet(username);\n    }\n    \n    /**\n     * 获取用户的角色集合\n     * @param userId\n     * @return\n     */\n    @GetMapping(\"/getUserRoleSetById\")\n    public Set<String> getUserRoleSetById(@RequestParam(\"userId\")String userId){\n        return sysBaseApi.getUserRoleSetById(userId);\n    }\n\n    /**\n     * 获取用户的权限集合\n     * @param userId 用户表ID\n     * @return\n     */\n    @GetMapping(\"/getUserPermissionSet\")\n    public Set<String> getUserPermissionSet(@RequestParam(\"userId\") String userId){\n        return sysBaseApi.getUserPermissionSet(userId);\n    }\n\n    //-----\n\n    /**\n     * 判断是否有online访问的权限\n     * @param onlineAuthDTO\n     * @return\n     */\n    @PostMapping(\"/hasOnlineAuth\")\n    public boolean hasOnlineAuth(@RequestBody OnlineAuthDTO onlineAuthDTO){\n        return sysBaseApi.hasOnlineAuth(onlineAuthDTO);\n    }\n\n    /**\n     * 查询用户角色信息\n     * @param username\n     * @return\n     */\n    @GetMapping(\"/queryUserRoles\")\n    public Set<String> queryUserRoles(@RequestParam(\"username\") String username){\n        return sysUserService.getUserRolesSet(username);\n    }\n    \n    /**\n     * 查询用户角色信息\n     * @param userId\n     * @return\n     */\n    @GetMapping(\"/queryUserRolesById\")\n    public Set<String> queryUserRolesById(@RequestParam(\"userId\") String userId){\n        return sysUserService.getUserRoleSetById(userId);\n    }\n\n\n    /**\n     * 查询用户权限信息\n     * @param userId\n     * @return\n     */\n    @GetMapping(\"/queryUserAuths\")\n    public Set<String> queryUserAuths(@RequestParam(\"userId\") String userId){\n        return sysUserService.getUserPermissionsSet(userId);\n    }\n\n    /**\n     * 通过部门id获取部门全部信息\n     */\n    @GetMapping(\"/selectAllById\")\n    public SysDepartModel selectAllById(@RequestParam(\"id\") String id){\n        return sysBaseApi.selectAllById(id);\n    }\n\n    /**\n     * 根据用户id查询用户所属公司下所有用户ids\n     * @param userId\n     * @return\n     */\n    @GetMapping(\"/queryDeptUsersByUserId\")\n    public List<String> queryDeptUsersByUserId(@RequestParam(\"userId\") String userId){\n        return sysBaseApi.queryDeptUsersByUserId(userId);\n    }\n\n\n    /**\n     * 查询数据权限\n     * @return\n     */\n    @GetMapping(\"/queryPermissionDataRule\")\n    public List<SysPermissionDataRuleModel> queryPermissionDataRule(@RequestParam(\"component\") String component, @RequestParam(\"requestPath\")String requestPath, @RequestParam(\"username\") String username){\n        return sysBaseApi.queryPermissionDataRule(component, requestPath, username);\n    }\n\n    /**\n     * 查询用户信息\n     * @param username\n     * @return\n     */\n    @GetMapping(\"/getCacheUser\")\n    public SysUserCacheInfo getCacheUser(@RequestParam(\"username\") String username){\n        return sysBaseApi.getCacheUser(username);\n    }\n\n    /**\n     * 普通字典的翻译\n     * @param code\n     * @param key\n     * @return\n     */\n    @GetMapping(\"/translateDict\")\n    public String translateDict(@RequestParam(\"code\") String code, @RequestParam(\"key\") String key){\n        return sysBaseApi.translateDict(code, key);\n    }\n\n\n    /**\n     * 36根据多个用户账号(逗号分隔)，查询返回多个用户信息\n     * @param usernames\n     * @return\n     */\n    @RequestMapping(\"/queryUsersByUsernames\")\n    List<JSONObject> queryUsersByUsernames(@RequestParam(\"usernames\") String usernames){\n        return this.sysBaseApi.queryUsersByUsernames(usernames);\n    }\n\n    /**\n     * 37根据多个用户id(逗号分隔)，查询返回多个用户信息\n     * @param ids\n     * @return\n     */\n    @RequestMapping(\"/queryUsersByIds\")\n    List<JSONObject> queryUsersByIds(@RequestParam(\"ids\") String ids){\n        return this.sysBaseApi.queryUsersByIds(ids);\n    }\n\n    /**\n     * 38根据多个部门编码(逗号分隔)，查询返回多个部门信息\n     * @param orgCodes\n     * @return\n     */\n    @GetMapping(\"/queryDepartsByOrgcodes\")\n    List<JSONObject> queryDepartsByOrgcodes(@RequestParam(\"orgCodes\") String orgCodes){\n        return this.sysBaseApi.queryDepartsByOrgcodes(orgCodes);\n    }\n\n    /**\n     * 39根据多个部门ID(逗号分隔)，查询返回多个部门信息\n     * @param ids\n     * @return\n     */\n    @GetMapping(\"/queryDepartsByIds\")\n    List<JSONObject> queryDepartsByIds(@RequestParam(\"ids\") String ids){\n        return this.sysBaseApi.queryDepartsByIds(ids);\n    }\n\n    /**\n     * 40发送邮件消息\n     * @param email\n     * @param title\n     * @param content\n     */\n    @GetMapping(\"/sendEmailMsg\")\n    public void sendEmailMsg(@RequestParam(\"email\")String email,@RequestParam(\"title\")String title,@RequestParam(\"content\")String content){\n         this.sysBaseApi.sendEmailMsg(email,title,content);\n    };\n    /**\n     * 发送html模版邮件消息\n     * @param email\n     * @param title\n     * @param emailTemplateEnum 邮件模版枚举\n     * @param params            模版参数\n     */\n    @GetMapping(\"/sendHtmlTemplateEmail\")\n    public void sendHtmlTemplateEmail(@RequestParam(\"email\")String email, @RequestParam(\"title\")String title, @RequestParam(\"emailEnum\") EmailTemplateEnum emailTemplateEnum, @RequestParam(\"params\") JSONObject params){\n         this.sysBaseApi.sendHtmlTemplateEmail(email,title,emailTemplateEnum,params);\n    };\n    /**\n     * 发送短信消息\n     * @param phone  手机号码\n     * @param params  模版参数\n     * @param dySmsEnum 短信模版枚举\n     */\n    @GetMapping(\"/sendSmsMsg\")\n    public void sendSmsMsg(@RequestParam(\"phone\")String phone, @RequestParam(\"params\") JSONObject params, @RequestParam(\"dySmsEnum\") DySmsEnum dySmsEnum){\n         this.sysBaseApi.sendSmsMsg(phone,params,dySmsEnum);\n    };\n    /**\n     * 41 获取公司下级部门和公司下所有用户信息\n     * @param orgCode\n     */\n    @GetMapping(\"/getDeptUserByOrgCode\")\n    List<Map> getDeptUserByOrgCode(@RequestParam(\"orgCode\")String orgCode){\n       return this.sysBaseApi.getDeptUserByOrgCode(orgCode);\n    }\n\n    /**\n     * 查询分类字典翻译\n     *\n     * @param ids 分类字典表id\n     * @return\n     */\n    @GetMapping(\"/loadCategoryDictItem\")\n    public List<String> loadCategoryDictItem(@RequestParam(\"ids\") String ids) {\n        return sysBaseApi.loadCategoryDictItem(ids);\n    }\n\n    /**\n     * 反向翻译分类字典，用于导入\n     *\n     * @param names 名称，逗号分割\n     * @return\n     */\n    @GetMapping(\"/loadCategoryDictItemByNames\")\n    List<String> loadCategoryDictItemByNames(@RequestParam(\"names\") String names, @RequestParam(\"delNotExist\") boolean delNotExist) {\n        return sysBaseApi.loadCategoryDictItemByNames(names, delNotExist);\n    }\n\n    /**\n     * 根据字典code加载字典text\n     *\n     * @param dictCode 顺序：tableName,text,code\n     * @param keys     要查询的key\n     * @return\n     */\n    @GetMapping(\"/loadDictItem\")\n    public List<String> loadDictItem(@RequestParam(\"dictCode\") String dictCode, @RequestParam(\"keys\") String keys) {\n        return sysBaseApi.loadDictItem(dictCode, keys);\n    }\n\n    /**\n     * 复制应用下的所有字典配置到新的租户下\n     *\n     * @param originalAppId 原始低代码应用ID\n     * @param appId         新的低代码应用ID\n     * @param tenantId      新的租户ID\n     * @return Map<String, String>  Map<原字典编码, 新字典编码>\n     */\n    @GetMapping(\"/copyLowAppDict\")\n    Map<String, String> copyLowAppDict(@RequestParam(\"originalAppId\") String originalAppId, @RequestParam(\"appId\") String appId, @RequestParam(\"tenantId\") String tenantId) {\n        return sysBaseApi.copyLowAppDict(originalAppId, appId, tenantId);\n    }\n    \n    /**\n     * 根据字典code查询字典项\n     *\n     * @param dictCode 顺序：tableName,text,code\n     * @param dictCode 要查询的key\n     * @return\n     */\n    @GetMapping(\"/getDictItems\")\n    public List<DictModel> getDictItems(@RequestParam(\"dictCode\") String dictCode) {\n        return sysBaseApi.getDictItems(dictCode);\n    }\n\n    /**\n     * 根据多个字典code查询多个字典项\n     *\n     * @param dictCodeList\n     * @return key = dictCode ； value=对应的字典项\n     */\n    @RequestMapping(\"/getManyDictItems\")\n    public Map<String, List<DictModel>> getManyDictItems(@RequestParam(\"dictCodeList\") List<String> dictCodeList) {\n        return sysBaseApi.getManyDictItems(dictCodeList);\n    }\n\n    /**\n     * 【下拉搜索】\n     * 大数据量的字典表 走异步加载，即前端输入内容过滤数据\n     *\n     * @param dictCode 字典code格式：table,text,code\n     * @param keyword  过滤关键字\n     * @return\n     */\n    @GetMapping(\"/loadDictItemByKeyword\")\n    public List<DictModel> loadDictItemByKeyword(@RequestParam(\"dictCode\") String dictCode,\n                                                 @RequestParam(\"keyword\") String keyword,\n                                                 @RequestParam(value = \"pageNo\", defaultValue = \"1\", required = false) Integer pageNo,\n                                                 @RequestParam(value = \"pageSize\", required = false) Integer pageSize) {\n        return sysBaseApi.loadDictItemByKeyword(dictCode, keyword,pageNo, pageSize);\n    }\n\n    /**\n     * 48 普通字典的翻译，根据多个dictCode和多条数据，多个以逗号分割\n     * @param dictCodes\n     * @param keys\n     * @return\n     */\n    @GetMapping(\"/translateManyDict\")\n    public Map<String, List<DictModel>> translateManyDict(@RequestParam(\"dictCodes\") String dictCodes, @RequestParam(\"keys\") String keys){\n        return this.sysBaseApi.translateManyDict(dictCodes, keys);\n    }\n\n\n    /**\n     * 获取表数据字典 【接口签名验证】\n     * @param tableFilterSql 表名可以带where条件\n     * @param text\n     * @param code\n     * @return\n     */\n    @GetMapping(\"/queryTableDictItemsByCode\")\n    List<DictModel> queryTableDictItemsByCode(@RequestParam(\"tableFilterSql\") String tableFilterSql, @RequestParam(\"text\") String text, @RequestParam(\"code\") String code){\n        return sysBaseApi.queryTableDictItemsByCode(tableFilterSql, text, code);\n    }\n\n    /**\n     * 查询表字典 支持过滤数据 【接口签名验证】\n     * @param table\n     * @param text\n     * @param code\n     * @param filterSql\n     * @return\n     */\n    @GetMapping(\"/queryFilterTableDictInfo\")\n    List<DictModel> queryFilterTableDictInfo(@RequestParam(\"table\") String table, @RequestParam(\"text\") String text, @RequestParam(\"code\") String code, @RequestParam(\"filterSql\") String filterSql){\n        return sysBaseApi.queryFilterTableDictInfo(table, text, code, filterSql);\n    }\n\n    /**\n     * 【接口签名验证】\n     * 查询指定table的 text code 获取字典，包含text和value\n     * @param table\n     * @param text\n     * @param code\n     * @param keyArray\n     * @return\n     */\n    @Deprecated\n    @GetMapping(\"/queryTableDictByKeys\")\n    public List<String> queryTableDictByKeys(@RequestParam(\"table\") String table, @RequestParam(\"text\") String text, @RequestParam(\"code\") String code, @RequestParam(\"keyArray\") String[] keyArray){\n        return sysBaseApi.queryTableDictByKeys(table, text, code, keyArray);\n    }\n\n\n    /**\n     * 字典表的 翻译【接口签名验证】\n     * @param table\n     * @param text\n     * @param code\n     * @param key\n     * @return\n     */\n    @GetMapping(\"/translateDictFromTable\")\n    public String translateDictFromTable(@RequestParam(\"table\") String table, @RequestParam(\"text\") String text, @RequestParam(\"code\") String code, @RequestParam(\"key\") String key){\n        return sysBaseApi.translateDictFromTable(table, text, code, key);\n    }\n\n\n    /**\n     * 【接口签名验证】\n     * 49 字典表的 翻译，可批量\n     *\n     * @param table\n     * @param text\n     * @param code\n     * @param keys  多个用逗号分割\n     * @param ds 数据源\n     * @return\n     */\n    @GetMapping(\"/translateDictFromTableByKeys\")\n    public List<DictModel> translateDictFromTableByKeys(@RequestParam(\"table\") String table, @RequestParam(\"text\") String text, @RequestParam(\"code\") String code, @RequestParam(\"keys\") String keys, @RequestParam(\"ds\")  String ds) {\n        return this.sysBaseApi.translateDictFromTableByKeys(table, text, code, keys, ds);\n    }\n\n    /**\n     * 发送模板信息\n     * @param message\n     */\n    @PostMapping(\"/sendTemplateMessage\")\n    public void sendTemplateMessage(@RequestBody MessageDTO message){\n        sysBaseApi.sendTemplateMessage(message);\n    }\n\n    /**\n     * 获取消息模板内容\n     * @param code\n     * @return\n     */\n    @GetMapping(\"/getTemplateContent\")\n    public String getTemplateContent(@RequestParam(\"code\") String code){\n        return this.sysBaseApi.getTemplateContent(code);\n    }\n\n    /**\n     * 保存数据日志\n     * @param dataLogDto\n     */\n    @PostMapping(\"/saveDataLog\")\n    public void saveDataLog(@RequestBody DataLogDTO dataLogDto){\n        this.sysBaseApi.saveDataLog(dataLogDto);\n    }\n\n    /**\n     * 更新头像\n     * @param loginUser\n     * @return\n     */\n    @PutMapping(\"/updateAvatar\")\n    public void updateAvatar(@RequestBody LoginUser loginUser){\n        this.sysBaseApi.updateAvatar(loginUser);\n    }\n\n    /**\n     * 向app端 websocket推送聊天刷新消息\n     * @param userId\n     * @return\n     */\n    @GetMapping(\"/sendAppChatSocket\")\n    public void sendAppChatSocket(@RequestParam(name=\"userId\") String userId){\n        this.sysBaseApi.sendAppChatSocket(userId);\n    }\n\n    /**\n     * 根据roleCode查询角色信息，可逗号分隔多个\n     *\n     * @param roleCodes\n     * @return\n     */\n    @GetMapping(\"/queryRoleDictByCode\")\n    public List<DictModel> queryRoleDictByCode(@RequestParam(name = \"roleCodes\") String roleCodes) {\n        return this.sysBaseApi.queryRoleDictByCode(roleCodes);\n    }\n\n    /**\n     * 获取消息模板内容\n     * @param id\n     * @return\n     */\n    @GetMapping(\"/getRoleCode\")\n    public String getRoleCode(@RequestParam(\"id\") String id){\n        return this.sysBaseApi.getRoleCodeById(id);\n    }\n    \n    /**\n     * VUEN-2584【issue】平台sql注入漏洞几个问题\n     * 部分特殊函数 可以将查询结果混夹在错误信息中，导致数据库的信息暴露\n     * @param e\n     * @return\n     */\n    @ExceptionHandler(java.sql.SQLException.class)\n    public Result<?> handleSQLException(Exception e){\n        String msg = e.getMessage();\n        String extractvalue = \"extractvalue\";\n        String updatexml = \"updatexml\";\n        if(msg!=null && (msg.toLowerCase().indexOf(extractvalue)>=0 || msg.toLowerCase().indexOf(updatexml)>=0)){\n            return Result.error(\"校验失败，sql解析异常！\");\n        }\n        return Result.error(\"校验失败，sql解析异常！\" + msg);\n    }\n\n    /**\n     * 根据高级查询条件查询用户\n     * @param superQuery\n     * @param matchType\n     * @return\n     */\n    @GetMapping(\"/queryUserBySuperQuery\")\n    public List<JSONObject> queryUserBySuperQuery(@RequestParam(\"superQuery\")  String superQuery, @RequestParam(\"matchType\") String matchType) {\n        return sysBaseApi.queryUserBySuperQuery(superQuery,matchType);\n    }\n\n    /**\n     * 根据id条件查询用户\n     * @param id\n     * @return\n     */\n    @GetMapping(\"/queryUserById\")\n    public JSONObject queryUserById(@RequestParam(\"id\")  String id) {\n        return sysBaseApi.queryUserById(id);\n    }\n\n    /**\n     * 根据高级查询条件查询部门\n     * @param superQuery\n     * @param matchType\n     * @return\n     */\n    @GetMapping(\"/queryDeptBySuperQuery\")\n    public List<JSONObject> queryDeptBySuperQuery(@RequestParam(\"superQuery\")  String superQuery, @RequestParam(\"matchType\") String matchType) {\n        return sysBaseApi.queryDeptBySuperQuery(superQuery,matchType);\n    }\n\n    /**\n     * 根据高级查询条件查询角色\n     * @param superQuery\n     * @param matchType\n     * @return\n     */\n    @GetMapping(\"/queryRoleBySuperQuery\")\n    public List<JSONObject> queryRoleBySuperQuery(@RequestParam(\"superQuery\")  String superQuery, @RequestParam(\"matchType\") String matchType) {\n        return sysBaseApi.queryRoleBySuperQuery(superQuery,matchType);\n    }\n\n\n    /**\n     * 根据租户ID查询用户ID\n     * @param tenantId 租户ID\n     * @return List<String>\n     */\n    @GetMapping(\"/selectUserIdByTenantId\")\n    public List<String> selectUserIdByTenantId(@RequestParam(\"tenantId\")  String tenantId) {\n        return sysBaseApi.selectUserIdByTenantId(tenantId);\n    }\n\n\n    /**\n     * 根据部门ID查询用户ID\n     * @param deptIds\n     * @return\n     */\n    @GetMapping(\"/queryUserIdsByDeptIds\")\n    public List<String> queryUserIdsByDeptIds(@RequestParam(\"deptIds\") List<String> deptIds){\n        return sysBaseApi.queryUserIdsByDeptIds(deptIds);\n    }\n    \n    /**\n     * 根据部门岗位ID查询用户ID\n     * @param deptPostIds\n     * @return\n     */\n    @GetMapping(\"/queryUserIdsByDeptPostIds\")\n    public List<String> queryUserIdsByDeptPostIds(@RequestParam(\"deptPostIds\") List<String> deptPostIds){\n        return sysBaseApi.queryUserIdsByDeptPostIds(deptPostIds);\n    }\n    \n    /**\n     * 根据部门ID查询用户ID\n     * @param deptIds\n     * @return\n     */\n    @GetMapping(\"/queryUserAccountsByDeptIds\")\n    public List<String> queryUserAccountsByDeptIds(@RequestParam(\"deptIds\") List<String> deptIds){\n        return sysBaseApi.queryUserAccountsByDeptIds(deptIds);\n    }\n\n    /**\n     * 根据角色编码 查询用户ID\n     * @param roleCodes\n     * @return\n     */\n    @GetMapping(\"/queryUserIdsByRoleds\")\n    public List<String> queryUserIdsByRoleds(@RequestParam(\"roleCodes\")  List<String> roleCodes){\n        return sysBaseApi.queryUserIdsByRoleds(roleCodes);\n    }\n\n    /**\n     * 根据用户ID查询用户名\n     * @param userIds\n     * @return\n     */\n    @GetMapping(\"/queryUsernameByIds\")\n    public List<String> queryUsernameByIds(@RequestParam(\"userIds\")  List<String> userIds){\n        return sysBaseApi.queryUsernameByIds(userIds);\n    }\n\n    /**\n     * 根据岗位的职级ID查询用户ID\n     * @param departPositIds\n     * @return\n     */\n    @GetMapping(\"/queryUsernameByDepartPositIds\")\n    public List<String> queryUsernameByDepartPositIds(@RequestParam(\"departPositIds\") List<String> departPositIds){\n        return sysBaseApi.queryUsernameByDepartPositIds(departPositIds);\n    }\n    \n    /**\n     * 根据职务ID查询用户ID\n     * @param positionIds\n     * @return\n     */\n    @GetMapping(\"/queryUserIdsByPositionIds\")\n    public List<String> queryUserIdsByPositionIds(@RequestParam(\"positionIds\") List<String> positionIds){\n        return sysBaseApi.queryUserIdsByPositionIds(positionIds);\n    }\n\n\n    /**\n     * 根据部门和子部门下的所有用户账号\n     *\n     * @param orgCode 部门编码\n     * @return\n     */\n    @GetMapping(\"/getUserAccountsByDepCode\")\n    public List<String> getUserAccountsByDepCode(@RequestParam(\"orgCode\") String orgCode){\n        return sysBaseApi.getUserAccountsByDepCode(orgCode);\n    }\n\n    /**\n     * 检查查询sql的表和字段是否在白名单中\n     *\n     * @param selectSql\n     * @return\n     */\n    @GetMapping(\"/dictTableWhiteListCheckBySql\")\n    public boolean dictTableWhiteListCheckBySql(@RequestParam(\"selectSql\") String selectSql) {\n        return sysBaseApi.dictTableWhiteListCheckBySql(selectSql);\n    }\n\n    /**\n     * 根据字典表或者字典编码，校验是否在白名单中\n     *\n     * @param tableOrDictCode 表名或dictCode\n     * @param fields          如果传的是dictCode，则该参数必须传null\n     * @return\n     */\n    @GetMapping(\"/dictTableWhiteListCheckByDict\")\n    public boolean dictTableWhiteListCheckByDict(\n            @RequestParam(\"tableOrDictCode\") String tableOrDictCode,\n            @RequestParam(value = \"fields\", required = false) String... fields\n    ) {\n        return sysBaseApi.dictTableWhiteListCheckByDict(tableOrDictCode, fields);\n    }\n    /**\n     * 自动发布通告\n     *\n     * @param dataId 通告ID\n     * @param currentUserName 发送人\n     * @return\n     */\n    @GetMapping(\"/announcementAutoRelease\")\n    public void announcementAutoRelease(\n            @RequestParam(\"dataId\") String dataId,\n            @RequestParam(value = \"currentUserName\", required = false) String currentUserName\n    ) {\n       sysBaseApi.announcementAutoRelease(dataId, currentUserName);\n    }\n\n    /**\n     * 根据部门编码查询公司信息\n     * @param orgCode 部门编码\n     * @return\n     * @author chenrui\n     * @date 2025/8/12 14:45\n     */\n    @GetMapping(value = \"/queryCompByOrgCode\")\n    SysDepartModel queryCompByOrgCode(@RequestParam(name = \"sysCode\") String orgCode) {\n        return sysBaseApi.queryCompByOrgCode(orgCode);\n    }\n\n    /**\n     * 根据部门编码和层次查询上级公司\n     *\n     * @param orgCode 部门编码\n     * @param level 可以传空 默认为1级 最小值为1\n     * @return\n     */\n    @GetMapping(value = \"/queryCompByOrgCodeAndLevel\")\n    SysDepartModel queryCompByOrgCodeAndLevel(@RequestParam(\"orgCode\") String orgCode, @RequestParam(\"level\") Integer level){\n        return sysBaseApi.queryCompByOrgCodeAndLevel(orgCode,level);\n    }\n\n    /**\n     * 运行AIRag流程\n     * for  [QQYUN-13634]在baseapi里面封装方法，方便其他模块调用\n     * @param airagFlowDTO\n     * @return 流程执行结果,可能是String或者Map\n     * @return\n     */\n    @PostMapping(value = \"/runAiragFlow\")\n    Object runAiragFlow(@RequestBody AiragFlowDTO airagFlowDTO) {\n        return sysBaseApi.runAiragFlow(airagFlowDTO);\n    }\n\n    /**\n     * 流式运行AIRag流程\n     * for  [QQYUN-13634]在baseapi里面封装方法，方便其他模块调用\n     *\n     * @param airagFlowDTO\n     * @return 流程执行结果,可能是String或者Map\n     * @return\n     */\n    @PostMapping(value = \"/runAiragFlowStream\")\n    SseEmitter runAiragFlowStream(@RequestBody AiragFlowDTO airagFlowDTO) {\n        return sysBaseApi.runAiragFlowStream(airagFlowDTO);\n    }\n\n    /**\n     * 根据部门code或部门id获取部门名称(当前和上级部门)\n     *\n     * @param orgCode 部门编码\n     * @param depId 部门id\n     * @return String 部门名称\n     */\n    @GetMapping(value = \"/getDepartPathNameByOrgCode\")\n    String getDepartPathNameByOrgCode(@RequestParam(name = \"orgCode\", required = false) String orgCode, @RequestParam(name = \"depId\", required = false) String depId) {\n        return sysBaseApi.getDepartPathNameByOrgCode(orgCode, depId);\n    }\n\n    /**\n     * 根据部门ID查询用户ID\n     * @param deptIds\n     * @return\n     */\n    @GetMapping(\"/queryUserIdsByCascadeDeptIds\")\n    public List<String> queryUserIdsByCascadeDeptIds(@RequestParam(\"deptIds\") List<String> deptIds){\n        return sysBaseApi.queryUserIdsByCascadeDeptIds(deptIds);\n    }\n    /**\n     * 推送uniapp 消息\n     * @param pushMessageDTO\n     * @return\n     */\n    @PostMapping(\"/uniPushMsgToUser\")\n    public void uniPushMsgToUser(@RequestBody PushMessageDTO pushMessageDTO){\n       sysBaseApi.uniPushMsgToUser(pushMessageDTO);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/cas/controller/CasClientController.java",
    "content": "package org.jeecg.modules.cas.controller;\n\nimport java.util.List;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\n\nimport org.apache.commons.lang.StringUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.util.RedisUtil;\nimport org.jeecg.modules.cas.util.CasServiceUtil;\nimport org.jeecg.modules.cas.util.XmlUtils;\nimport org.jeecg.modules.system.entity.SysDepart;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.service.ISysDepartService;\nimport org.jeecg.modules.system.service.ISysUserService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.http.HttpEntity;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.alibaba.fastjson.JSONObject;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * <p>\n * CAS单点登录客户端登录认证\n * </p>\n *\n * @Author zhoujf\n * @since 2018-12-20\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/sys/cas/client\")\npublic class CasClientController {\n\n\t@Autowired\n\tprivate ISysUserService sysUserService;\n\t@Autowired\n    private ISysDepartService sysDepartService;\n\t@Autowired\n    private RedisUtil redisUtil;\n\t\n\t@Value(\"${cas.prefixUrl}\")\n    private String prefixUrl;\n\t\n\t\n\t@GetMapping(\"/validateLogin\")\n\tpublic Object validateLogin(@RequestParam(name=\"ticket\") String ticket,\n\t\t\t\t\t\t\t\t@RequestParam(name=\"service\") String service,\n\t\t\t\t\t\t\t\tHttpServletRequest request,\n\t\t\t\t\t\t\t\tHttpServletResponse response) throws Exception {\n\t\tResult<JSONObject> result = new Result<JSONObject>();\n\t\tlog.info(\"Rest api login.\");\n\t\ttry {\n\t\t\tString validateUrl = prefixUrl+\"/p3/serviceValidate\";\n\t\t\tString res = CasServiceUtil.getStValidate(validateUrl, ticket, service);\n\t\t\tlog.info(\"res.\"+res);\n\t\t\tfinal String error = XmlUtils.getTextForElement(res, \"authenticationFailure\");\n\t\t\tif(StringUtils.isNotEmpty(error)) {\n\t\t\t\tthrow new Exception(error);\n\t\t\t}\n\t\t\tfinal String principal = XmlUtils.getTextForElement(res, \"user\");\n\t\t\tif (StringUtils.isEmpty(principal)) {\n\t            throw new Exception(\"No principal was found in the response from the CAS server.\");\n\t        }\n\t\t\tlog.info(\"-------token----username---\"+principal);\n\t\t    //1. 校验用户是否有效\n\t  \t\tSysUser sysUser = sysUserService.getUserByName(principal);\n\t  \t\tresult = sysUserService.checkUserIsEffective(sysUser);\n\t  \t\tif(!result.isSuccess()) {\n\t  \t\t\treturn result;\n\t  \t\t}\n\t \t\tString token = JwtUtil.sign(sysUser.getUsername(), sysUser.getPassword(), CommonConstant.CLIENT_TYPE_PC);\n\t \t\t// 设置超时时间\n\t \t\tredisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);\n\t \t\tredisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME*2 / 1000);\n\n\t \t\t//获取用户部门信息\n\t\t\tJSONObject obj = new JSONObject();\n\t\t\tList<SysDepart> departs = sysDepartService.queryUserDeparts(sysUser.getId());\n\t\t\tobj.put(\"departs\", departs);\n\t\t\tif (departs == null || departs.size() == 0) {\n\t\t\t\tobj.put(\"multi_depart\", 0);\n\t\t\t} else if (departs.size() == 1) {\n\t\t\t\tsysUserService.updateUserDepart(principal, departs.get(0).getOrgCode(),null);\n\t\t\t\tobj.put(\"multi_depart\", 1);\n\t\t\t} else {\n\t\t\t\tobj.put(\"multi_depart\", 2);\n\t\t\t}\n\t\t\tobj.put(\"token\", token);\n\t\t\tobj.put(\"userInfo\", sysUser);\n\t\t\tresult.setResult(obj);\n\t\t\tresult.success(\"登录成功\");\n\t  \t\t\n\t\t} catch (Exception e) {\n\t\t\t//e.printStackTrace();\n\t\t\tresult.error500(e.getMessage());\n\t\t}\n\t\treturn new HttpEntity<>(result);\n\t}\n\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/cas/util/CasServiceUtil.java",
    "content": "package org.jeecg.modules.cas.util;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.InputStreamReader;\nimport java.security.cert.X509Certificate;\n\nimport javax.net.ssl.SSLContext;\nimport javax.net.ssl.TrustManager;\nimport javax.net.ssl.X509TrustManager;\n\nimport org.apache.http.HttpResponse;\nimport org.apache.http.client.methods.HttpGet;\nimport org.apache.http.conn.socket.LayeredConnectionSocketFactory;\nimport org.apache.http.conn.ssl.SSLConnectionSocketFactory;\nimport org.apache.http.impl.client.CloseableHttpClient;\nimport org.apache.http.impl.client.HttpClients;\n\n/**\n * @Description: CasServiceUtil\n * @author: jeecg-boot\n */\npublic class CasServiceUtil {\n\t\n\tpublic static void main(String[] args) {\n\t\tString serviceUrl = \"https://cas.8f8.com.cn:8443/cas/p3/serviceValidate\";\n\t\tString service = \"http://localhost:3003/user/login\";\n\t\tString ticket = \"ST-5-1g-9cNES6KXNRwq-GuRET103sm0-DESKTOP-VKLS8B3\";\n\t\tString res = getStValidate(serviceUrl,ticket, service);\n\t\t\n\t\tSystem.out.println(\"---------res-----\"+res);\n\t}\n\t\n\t\n\t/**\n     * 验证ST\n     */\n    public static String getStValidate(String url, String st, String service){\n\t\ttry {\n\t\t\turl = url+\"?service=\"+service+\"&ticket=\"+st;\n\t\t\tCloseableHttpClient httpclient = createHttpClientWithNoSsl();\n\t\t\tHttpGet httpget = new HttpGet(url);\n\t\t\tHttpResponse response = httpclient.execute(httpget);\n\t        String res = readResponse(response);\n\t        return res == null ? null : (res == \"\" ? null : res);\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t\treturn \"\";\n\t}\n\n    \n    /**\n     * 读取 response body 内容为字符串\n     *\n     * @param response\n     * @return\n     * @throws IOException\n     */\n    private static String readResponse(HttpResponse response) throws IOException {\n        BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));\n        String result = new String();\n        String line;\n        while ((line = in.readLine()) != null) {\n            result += line;\n        }\n        return result;\n    }\n    \n    \n    /**\n     * 创建模拟客户端（针对 https 客户端禁用 SSL 验证）\n     *\n     * @param cookieStore 缓存的 Cookies 信息\n     * @return\n     * @throws Exception\n     */\n    private static CloseableHttpClient createHttpClientWithNoSsl() throws Exception {\n        // Create a trust manager that does not validate certificate chains\n        TrustManager[] trustAllCerts = new TrustManager[]{\n                new X509TrustManager() {\n                    @Override\n                    public X509Certificate[] getAcceptedIssuers() {\n                        return null;\n                    }\n\n                    @Override\n                    public void checkClientTrusted(X509Certificate[] certs, String authType) {\n                        // don't check\n                    }\n\n                    @Override\n                    public void checkServerTrusted(X509Certificate[] certs, String authType) {\n                        // don't check\n                    }\n                }\n        };\n\n        SSLContext ctx = SSLContext.getInstance(\"TLS\");\n        ctx.init(null, trustAllCerts, null);\n        LayeredConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(ctx);\n        return HttpClients.custom()\n                .setSSLSocketFactory(sslSocketFactory)\n                .build();\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/cas/util/XmlUtils.java",
    "content": "package org.jeecg.modules.cas.util;\n\n\nimport java.io.StringReader;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.LinkedList;\nimport java.util.List;\nimport java.util.Map;\n\nimport javax.xml.XMLConstants;\nimport javax.xml.parsers.DocumentBuilderFactory;\nimport javax.xml.parsers.ParserConfigurationException;\nimport javax.xml.parsers.SAXParser;\nimport javax.xml.parsers.SAXParserFactory;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.w3c.dom.Document;\nimport org.xml.sax.Attributes;\nimport org.xml.sax.InputSource;\nimport org.xml.sax.SAXException;\nimport org.xml.sax.XMLReader;\nimport org.xml.sax.helpers.DefaultHandler;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * 解析cas,ST验证后的xml\n * @author: jeecg-boot\n */\n@Slf4j\npublic final class XmlUtils {\n\n    /**\n     * attributes\n     */\n    private static final String ATTRIBUTES = \"attributes\";\n\n    /**\n     * Creates a new namespace-aware DOM document object by parsing the given XML.\n     *\n     * @param xml XML content.\n     *\n     * @return DOM document.\n     */\n    public static Document newDocument(final String xml) {\n        final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\n        final Map<String, Boolean> features = new HashMap(5);\n        features.put(XMLConstants.FEATURE_SECURE_PROCESSING, true);\n        features.put(\"http://apache.org/xml/features/nonvalidating/load-external-dtd\", false);\n        for (final Map.Entry<String, Boolean> entry : features.entrySet()) {\n            try {\n                factory.setFeature(entry.getKey(), entry.getValue());\n            } catch (ParserConfigurationException e) {\n                log.warn(\"Failed setting XML feature {}: {}\", entry.getKey(), e);\n            }\n        }\n        factory.setNamespaceAware(true);\n        try {\n            return factory.newDocumentBuilder().parse(new InputSource(new StringReader(xml)));\n        } catch (Exception e) {\n            throw new RuntimeException(\"XML parsing error: \" + e);\n        }\n    }\n\n    /**\n     * Get an instance of an XML reader from the XMLReaderFactory.\n     *\n     * @return the XMLReader.\n     */\n    public static XMLReader getXmlReader() {\n        try {\n            final XMLReader reader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();\n            reader.setFeature(\"http://xml.org/sax/features/namespaces\", true);\n            reader.setFeature(\"http://xml.org/sax/features/namespace-prefixes\", false);\n            reader.setFeature(\"http://apache.org/xml/features/nonvalidating/load-external-dtd\", false);\n            return reader;\n        } catch (final Exception e) {\n            throw new RuntimeException(\"Unable to create XMLReader\", e);\n        }\n    }\n\n\n    /**\n     * Retrieve the text for a group of elements. Each text element is an entry\n     * in a list.\n     * <p>This method is currently optimized for the use case of two elements in a list.\n     *\n     * @param xmlAsString the xml response\n     * @param element     the element to look for\n     * @return the list of text from the elements.\n     */\n    public static List<String> getTextForElements(final String xmlAsString, final String element) {\n        final List<String> elements = new ArrayList<String>(2);\n        final XMLReader reader = getXmlReader();\n\n        final DefaultHandler handler = new DefaultHandler() {\n\n            private boolean foundElement = false;\n\n            private StringBuilder buffer = new StringBuilder();\n\n            @Override\n            public void startElement(final String uri, final String localName, final String qName,\n                                     final Attributes attributes) throws SAXException {\n                if (localName.equals(element)) {\n                    this.foundElement = true;\n                }\n            }\n\n            @Override\n            public void endElement(final String uri, final String localName, final String qName) throws SAXException {\n                if (localName.equals(element)) {\n                    this.foundElement = false;\n                    elements.add(this.buffer.toString());\n                    this.buffer = new StringBuilder();\n                }\n            }\n\n            @Override\n            public void characters(char[] ch, int start, int length) throws SAXException {\n                if (this.foundElement) {\n                    this.buffer.append(ch, start, length);\n                }\n            }\n        };\n\n        reader.setContentHandler(handler);\n        reader.setErrorHandler(handler);\n\n        try {\n            reader.parse(new InputSource(new StringReader(xmlAsString)));\n        } catch (final Exception e) {\n            log.error(e.getMessage(), e);\n            return null;\n        }\n\n        return elements;\n    }\n\n    /**\n     * Retrieve the text for a specific element (when we know there is only\n     * one).\n     *\n     * @param xmlAsString the xml response\n     * @param element     the element to look for\n     * @return the text value of the element.\n     */\n    public static String getTextForElement(final String xmlAsString, final String element) {\n        final XMLReader reader = getXmlReader();\n        final StringBuilder builder = new StringBuilder();\n\n        final DefaultHandler handler = new DefaultHandler() {\n\n            private boolean foundElement = false;\n\n            @Override\n            public void startElement(final String uri, final String localName, final String qName,\n                                     final Attributes attributes) throws SAXException {\n                if (localName.equals(element)) {\n                    this.foundElement = true;\n                }\n            }\n\n            @Override\n            public void endElement(final String uri, final String localName, final String qName) throws SAXException {\n                if (localName.equals(element)) {\n                    this.foundElement = false;\n                }\n            }\n\n            @Override\n            public void characters(char[] ch, int start, int length) throws SAXException {\n                if (this.foundElement) {\n                    builder.append(ch, start, length);\n                }\n            }\n        };\n\n        reader.setContentHandler(handler);\n        reader.setErrorHandler(handler);\n\n        try {\n            reader.parse(new InputSource(new StringReader(xmlAsString)));\n        } catch (final Exception e) {\n            log.error(e.getMessage(), e);\n            return null;\n        }\n\n        return builder.toString();\n    }\n    \n    \n    public static Map<String, Object> extractCustomAttributes(final String xml) {\n        final SAXParserFactory spf = SAXParserFactory.newInstance();\n        spf.setNamespaceAware(true);\n        spf.setValidating(false);\n        try {\n            final SAXParser saxParser = spf.newSAXParser();\n            final XMLReader xmlReader = saxParser.getXMLReader();\n            final CustomAttributeHandler handler = new CustomAttributeHandler();\n            xmlReader.setContentHandler(handler);\n            xmlReader.parse(new InputSource(new StringReader(xml)));\n            return handler.getAttributes();\n        } catch (final Exception e) {\n        \tlog.error(e.getMessage(), e);\n            return Collections.emptyMap();\n        }\n    }\n    \n    private static class CustomAttributeHandler extends DefaultHandler {\n\n        private Map<String, Object> attributes;\n\n        private boolean foundAttributes;\n\n        private String currentAttribute;\n\n        private StringBuilder value;\n\n        @Override\n        public void startDocument() throws SAXException {\n            this.attributes = new HashMap(5);\n        }\n\n        @Override\n        public void startElement(final String nameSpaceUri, final String localName, final String qName,\n                                 final Attributes attributes) throws SAXException {\n            if (ATTRIBUTES.equals(localName)) {\n                this.foundAttributes = true;\n            } else if (this.foundAttributes) {\n                this.value = new StringBuilder();\n                this.currentAttribute = localName;\n            }\n        }\n\n        @Override\n        public void characters(final char[] chars, final int start, final int length) throws SAXException {\n            if (this.currentAttribute != null) {\n                value.append(chars, start, length);\n            }\n        }\n\n        @Override\n        public void endElement(final String nameSpaceUri, final String localName, final String qName)\n                throws SAXException {\n            if (ATTRIBUTES.equals(localName)) {\n                this.foundAttributes = false;\n                this.currentAttribute = null;\n            } else if (this.foundAttributes) {\n                final Object o = this.attributes.get(this.currentAttribute);\n\n                if (o == null) {\n                    this.attributes.put(this.currentAttribute, this.value.toString());\n                } else {\n                    final List<Object> items;\n                    if (o instanceof List) {\n                        items = (List<Object>) o;\n                    } else {\n                        items = new LinkedList<Object>();\n                        items.add(o);\n                        this.attributes.put(this.currentAttribute, items);\n                    }\n                    items.add(this.value.toString());\n                }\n            }\n        }\n\n        public Map<String, Object> getAttributes() {\n            return this.attributes;\n        }\n    }\n    \n    \n    public static void main(String[] args) {\n\t\tString result = \"<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>\\r\\n\" + \n\t\t\t\t\"    <cas:authenticationSuccess>\\r\\n\" + \n\t\t\t\t\"        <cas:user>admin</cas:user>\\r\\n\" + \n\t\t\t\t\"        <cas:attributes>\\r\\n\" + \n\t\t\t\t\"            <cas:credentialType>UsernamePasswordCredential</cas:credentialType>\\r\\n\" + \n\t\t\t\t\"            <cas:isFromNewLogin>true</cas:isFromNewLogin>\\r\\n\" + \n\t\t\t\t\"            <cas:authenticationDate>2019-08-01T19:33:21.527+08:00[Asia/Shanghai]</cas:authenticationDate>\\r\\n\" + \n\t\t\t\t\"            <cas:authenticationMethod>RestAuthenticationHandler</cas:authenticationMethod>\\r\\n\" + \n\t\t\t\t\"            <cas:successfulAuthenticationHandlers>RestAuthenticationHandler</cas:successfulAuthenticationHandlers>\\r\\n\" + \n\t\t\t\t\"            <cas:longTermAuthenticationRequestTokenUsed>false</cas:longTermAuthenticationRequestTokenUsed>\\r\\n\" + \n\t\t\t\t\"        </cas:attributes>\\r\\n\" + \n\t\t\t\t\"    </cas:authenticationSuccess>\\r\\n\" + \n\t\t\t\t\"</cas:serviceResponse>\";\n\t\t\n\t\tString errorRes = \"<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>\\r\\n\" + \n\t\t\t\t\"    <cas:authenticationFailure code=\\\"INVALID_TICKET\\\">未能够识别出目标 &#39;ST-5-1g-9cNES6KXNRwq-GuRET103sm0-DESKTOP-VKLS8B3&#39;票根</cas:authenticationFailure>\\r\\n\" + \n\t\t\t\t\"</cas:serviceResponse>\";\n\t\t\n\t\tString error = XmlUtils.getTextForElement(errorRes, \"authenticationFailure\");\n\t\t//System.out.println(\"------\"+error);\n\t\t\n\t\tString error2 = XmlUtils.getTextForElement(result, \"authenticationFailure\");\n\t\t//System.out.println(\"------\"+error2);\n\t\tString principal = XmlUtils.getTextForElement(result, \"user\");\n\t\t//System.out.println(\"---principal---\"+principal);\n\t\tMap<String, Object> attributes = XmlUtils.extractCustomAttributes(result);\n\t\tSystem.out.println(\"---attributes---\"+attributes);\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/controller/SysMessageController.java",
    "content": "package org.jeecg.modules.message.controller;\n\nimport java.util.Arrays;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\n\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.modules.message.entity.SysMessage;\nimport org.jeecg.modules.message.service.ISysMessageService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.DeleteMapping;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.PutMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * @Description: 消息\n * @author: jeecg-boot\n * @date: 2019-04-09\n * @version: V1.0\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/sys/message/sysMessage\")\npublic class SysMessageController extends JeecgController<SysMessage, ISysMessageService> {\n\t@Autowired\n\tprivate ISysMessageService sysMessageService;\n\n\t/**\n\t * 分页列表查询\n\t * \n\t * @param sysMessage\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t@GetMapping(value = \"/list\")\n\tpublic Result<?> queryPageList(SysMessage sysMessage, @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n\t\t\t@RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize, HttpServletRequest req) {\n\t\tQueryWrapper<SysMessage> queryWrapper = QueryGenerator.initQueryWrapper(sysMessage, req.getParameterMap());\n\t\tPage<SysMessage> page = new Page<SysMessage>(pageNo, pageSize);\n\t\tIPage<SysMessage> pageList = sysMessageService.page(page, queryWrapper);\n        return Result.ok(pageList);\n\t}\n\n\t/**\n\t * 添加\n\t * \n\t * @param sysMessage\n\t * @return\n\t */\n\t@PostMapping(value = \"/add\")\n\tpublic Result<?> add(@RequestBody SysMessage sysMessage) {\n\t\tsysMessageService.save(sysMessage);\n\t\treturn Result.ok(\"添加成功！\");\n\t}\n\n\t/**\n\t * 编辑\n\t * \n\t * @param sysMessage\n\t * @return\n\t */\n\t@PutMapping(value = \"/edit\")\n\tpublic Result<?> edit(@RequestBody SysMessage sysMessage) {\t\n\t\tsysMessageService.updateById(sysMessage);\n        return Result.ok(\"修改成功!\");\n\n\t}\n\n\t/**\n\t * 通过id删除\n\t * \n\t * @param id\n\t * @return\n\t */\n\t@DeleteMapping(value = \"/delete\")\n\tpublic Result<?> delete(@RequestParam(name = \"id\", required = true) String id) {\n\t\tsysMessageService.removeById(id);\n        return Result.ok(\"删除成功!\");\n\t}\n\n\t/**\n\t * 批量删除\n\t * \n\t * @param ids\n\t * @return\n\t */\n\t@DeleteMapping(value = \"/deleteBatch\")\n\tpublic Result<?> deleteBatch(@RequestParam(name = \"ids\", required = true) String ids) {\n\n\t\tthis.sysMessageService.removeByIds(Arrays.asList(ids.split(\",\")));\n\t    return Result.ok(\"批量删除成功！\");\n\t}\n\n\t/**\n\t * 通过id查询\n\t * \n\t * @param id\n\t * @return\n\t */\n\t@GetMapping(value = \"/queryById\")\n\tpublic Result<?> queryById(@RequestParam(name = \"id\", required = true) String id) {\n\t\tSysMessage sysMessage = sysMessageService.getById(id);\n\t\treturn Result.ok(sysMessage);\n\t}\n\n\t/**\n\t * 导出excel\n\t *\n\t * @param request\n\t */\n\t@GetMapping(value = \"/exportXls\")\n\tpublic ModelAndView exportXls(HttpServletRequest request, SysMessage sysMessage) {\n\t\treturn super.exportXls(request,sysMessage,SysMessage.class, \"推送消息模板\");\n\t}\n\n\t/**\n\t * excel导入\n\t *\n\t * @param request\n\t * @param response\n\t * @return\n\t */\n\t@PostMapping(value = \"/importExcel\")\n\tpublic Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n\t\treturn super.importExcel(request, response, SysMessage.class);\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/controller/SysMessageTemplateController.java",
    "content": "package org.jeecg.modules.message.controller;\n\nimport java.util.Arrays;\nimport java.util.Map;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\n\nimport org.jeecg.common.api.dto.message.MessageDTO;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.api.ISysBaseAPI;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.message.entity.MsgParams;\nimport org.jeecg.modules.message.entity.SysMessageTemplate;\nimport org.jeecg.modules.message.service.ISysMessageTemplateService;\nimport org.jeecg.modules.message.util.PushMsgUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.DeleteMapping;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.PutMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport com.alibaba.fastjson.JSON;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * @Description: 消息模板\n * @Author: jeecg-boot\n * @Sate: 2019-04-09\n * @Version: V1.0\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/sys/message/sysMessageTemplate\")\npublic class SysMessageTemplateController extends JeecgController<SysMessageTemplate, ISysMessageTemplateService> {\n\t@Autowired\n\tprivate ISysMessageTemplateService sysMessageTemplateService;\n\t@Autowired\n\tprivate PushMsgUtil pushMsgUtil;\n\n\t@Autowired\n\tprivate ISysBaseAPI sysBaseApi;\n\n\t/**\n\t * 分页列表查询\n\t * \n\t * @param sysMessageTemplate\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t@GetMapping(value = \"/list\")\n\tpublic Result<?> queryPageList(SysMessageTemplate sysMessageTemplate, @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n\t\t\t@RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize, HttpServletRequest req) {\n\t\tQueryWrapper<SysMessageTemplate> queryWrapper = QueryGenerator.initQueryWrapper(sysMessageTemplate, req.getParameterMap());\n\t\tPage<SysMessageTemplate> page = new Page<SysMessageTemplate>(pageNo, pageSize);\n\t\tIPage<SysMessageTemplate> pageList = sysMessageTemplateService.page(page, queryWrapper);\n        return Result.ok(pageList);\n\t}\n\n\t/**\n\t * 添加\n\t * \n\t * @param sysMessageTemplate\n\t * @return\n\t */\n\t@PostMapping(value = \"/add\")\n\tpublic Result<?> add(@RequestBody SysMessageTemplate sysMessageTemplate) {\n\t\tsysMessageTemplateService.save(sysMessageTemplate);\n        return Result.ok(\"添加成功！\");\n\t}\n\n\t/**\n\t * 编辑\n\t * \n\t * @param sysMessageTemplate\n\t * @return\n\t */\n\t@PutMapping(value = \"/edit\")\n\tpublic Result<?> edit(@RequestBody SysMessageTemplate sysMessageTemplate) {\n\t\tsysMessageTemplateService.updateById(sysMessageTemplate);\n        return Result.ok(\"更新成功！\");\n\t}\n\n\t/**\n\t * 通过id删除\n\t * \n\t * @param id\n\t * @return\n\t */\n\t@DeleteMapping(value = \"/delete\")\n\tpublic Result<?> delete(@RequestParam(name = \"id\", required = true) String id) {\n\t\tsysMessageTemplateService.removeById(id);\n        return Result.ok(\"删除成功!\");\n\t}\n\n\t/**\n\t * 批量删除\n\t * \n\t * @param ids\n\t * @return\n\t */\n\t@DeleteMapping(value = \"/deleteBatch\")\n\tpublic Result<?> deleteBatch(@RequestParam(name = \"ids\", required = true) String ids) {\n\t\tthis.sysMessageTemplateService.removeByIds(Arrays.asList(ids.split(\",\")));\n        return Result.ok(\"批量删除成功！\");\n\t}\n\n\t/**\n\t * 通过id查询\n\t * \n\t * @param id\n\t * @return\n\t */\n\t@GetMapping(value = \"/queryById\")\n\tpublic Result<?> queryById(@RequestParam(name = \"id\", required = true) String id) {\n\t\tSysMessageTemplate sysMessageTemplate = sysMessageTemplateService.getById(id);\n        return Result.ok(sysMessageTemplate);\n\t}\n\n\t/**\n\t * 导出excel\n\t *\n\t * @param request\n\t */\n\t@GetMapping(value = \"/exportXls\")\n\tpublic ModelAndView exportXls(HttpServletRequest request,SysMessageTemplate sysMessageTemplate) {\n\t\treturn super.exportXls(request, sysMessageTemplate, SysMessageTemplate.class,\"推送消息模板\");\n\t}\n\n\t/**\n\t * excel导入\n\t *\n\t * @param request\n\t * @param response\n\t * @return\n\t */\n\t@PostMapping(value = \"/importExcel\")\n\tpublic Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n\t\treturn super.importExcel(request, response, SysMessageTemplate.class);\n\t}\n\n\t/**\n\t * 发送消息\n\t */\n\t@PostMapping(value = \"/sendMsg\")\n\tpublic Result<SysMessageTemplate> sendMessage(@RequestBody MsgParams msgParams) {\n\t\tResult<SysMessageTemplate> result = new Result<SysMessageTemplate>();\n\t\ttry {\n\t\t\tMessageDTO md = new MessageDTO();\n\t\t\tmd.setToAll(false);\n\t\t\tmd.setTitle(\"消息发送测试\");\n\t\t\tmd.setTemplateCode(msgParams.getTemplateCode());\n\t\t\tmd.setToUser(msgParams.getReceiver());\n\t\t\tmd.setType(msgParams.getMsgType());\n\t\t\tString testData = msgParams.getTestData();\n\t\t\tif(oConvertUtils.isNotEmpty(testData)){\n\t\t\t\tMap<String, Object> data = JSON.parseObject(testData, Map.class);\n\t\t\t\tmd.setData(data);\n\t\t\t}\n\t\t\tsysBaseApi.sendTemplateMessage(md);\n\t\t\treturn result.success(\"消息发送成功！\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"发送消息出错：\" + e.getMessage(), e);\n\t\t\treturn result.error500(\"发送消息出错！\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/controller/TestSocketController.java",
    "content": "package org.jeecg.modules.message.controller;\n\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.WebsocketConst;\nimport org.jeecg.modules.message.websocket.WebSocket;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.alibaba.fastjson.JSONObject;\n\n/**\n * @Description: TestSocketController\n * @author: jeecg-boot\n */\n@RestController\n@RequestMapping(\"/sys/socketTest\")\npublic class TestSocketController {\n\n    @Autowired\n    private WebSocket webSocket;\n\n    @PostMapping(\"/sendAll\")\n    public Result<String> sendAll(@RequestBody JSONObject jsonObject) {\n    \tResult<String> result = new Result<String>();\n    \tString message = jsonObject.getString(\"message\");\n    \tJSONObject obj = new JSONObject();\n    \tobj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_TOPIC);\n\t\tobj.put(WebsocketConst.MSG_ID, \"M0001\");\n\t\tobj.put(WebsocketConst.MSG_TXT, message);\n    \twebSocket.sendMessage(obj.toJSONString());\n        result.setResult(\"群发！\");\n        return result;\n    }\n\n    @PostMapping(\"/sendUser\")\n    public Result<String> sendUser(@RequestBody JSONObject jsonObject) {\n    \tResult<String> result = new Result<String>();\n    \tString userId = jsonObject.getString(\"userId\");\n    \tString message = jsonObject.getString(\"message\");\n    \tJSONObject obj = new JSONObject();\n    \tobj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);\n    \tobj.put(WebsocketConst.MSG_USER_ID, userId);\n\t\tobj.put(WebsocketConst.MSG_ID, \"M0001\");\n\t\tobj.put(WebsocketConst.MSG_TXT, message);\n        webSocket.sendMessage(userId, obj.toJSONString());\n        result.setResult(\"单发\");\n        return result;\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/entity/MsgParams.java",
    "content": "package org.jeecg.modules.message.entity;\n\nimport java.io.Serializable;\n\nimport lombok.Data;\n\n/**\n * 发送消息实体\n * @author: jeecg-boot\n */\n@Data\npublic class MsgParams implements Serializable  {\n\t\n\tprivate static final long serialVersionUID = 1L;\n\t/**\n     * 消息类型\n     */\n\tprivate String msgType;\n\n    /**\n     * 消息接收方\n     */\n\tprivate String receiver;\n\n    /**\n     * 消息模板码\n     */\n\tprivate String templateCode;\n\n    /**\n     * 测试数据\n     */\n\tprivate String testData;\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/entity/SysMessage.java",
    "content": "package org.jeecg.modules.message.entity;\n\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecg.common.system.base.entity.JeecgEntity;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\n/**\n * @Description: 消息\n * @Author: jeecg-boot\n * @Date:  2019-04-09\n * @Version: V1.0\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@TableName(\"sys_sms\")\npublic class SysMessage extends JeecgEntity {\n\t/**推送内容*/\n\t@Excel(name = \"推送内容\", width = 15)\n\tprivate java.lang.String esContent;\n\t/**推送所需参数Json格式*/\n\t@Excel(name = \"推送所需参数Json格式\", width = 15)\n\tprivate java.lang.String esParam;\n\t/**接收人*/\n\t@Excel(name = \"接收人\", width = 15)\n\tprivate java.lang.String esReceiver;\n\t/**推送失败原因*/\n\t@Excel(name = \"推送失败原因\", width = 15)\n\tprivate java.lang.String esResult;\n\t/**发送次数*/\n\t@Excel(name = \"发送次数\", width = 15)\n\tprivate java.lang.Integer esSendNum;\n\t/**推送状态 0未推送 1推送成功 2推送失败*/\n\t@Excel(name = \"推送状态 0未推送 1推送成功 2推送失败\", width = 15)\n\t@Dict(dicCode = \"msgSendStatus\")\n\tprivate java.lang.String esSendStatus;\n\t/**推送时间*/\n\t@Excel(name = \"推送时间\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate java.util.Date esSendTime;\n\t/**消息标题*/\n\t@Excel(name = \"消息标题\", width = 15)\n\tprivate java.lang.String esTitle;\n\t/**\n\t * 推送方式：参考枚举类MessageTypeEnum\n\t */\n\t@Excel(name = \"推送方式\", width = 15)\n\t@Dict(dicCode = \"messageType\")\n\tprivate java.lang.String esType;\n\t/**备注*/\n\t@Excel(name = \"备注\", width = 15)\n\tprivate java.lang.String remark;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/entity/SysMessageTemplate.java",
    "content": "package org.jeecg.modules.message.entity;\n\nimport org.jeecg.common.system.base.entity.JeecgEntity;\nimport org.jeecgframework.poi.excel.annotation.Excel;\n\nimport com.baomidou.mybatisplus.annotation.TableName;\n\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\n/**\n * @Description: 消息模板\n * @Author: jeecg-boot\n * @Date:  2019-04-09\n * @Version: V1.0\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@TableName(\"sys_sms_template\")\npublic class SysMessageTemplate extends JeecgEntity{\n\t/**模板CODE*/\n\t@Excel(name = \"模板CODE\", width = 15)\n\tprivate java.lang.String templateCode;\n\t/**模板标题*/\n\t@Excel(name = \"模板标题\", width = 30)\n\tprivate java.lang.String templateName;\n\t/**模板内容*/\n\t@Excel(name = \"模板内容\", width = 50)\n\tprivate java.lang.String templateContent;\n\t/**模板测试json*/\n\t@Excel(name = \"模板测试json\", width = 15)\n\tprivate java.lang.String templateTestJson;\n\t/**模板类型*/\n\t@Excel(name = \"模板类型\", width = 15)\n\tprivate java.lang.String templateType;\n\t/**模板分类*/\n\t@Excel(name = \"模板类型(notice通知公告 other其他)\", width = 15)\n\tprivate java.lang.String templateCategory;\n\n\t/**已经应用/未应用  1是0否*/\n\t@Excel(name = \"应用状态\", width = 15)\n\tprivate String useStatus;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/enums/RangeDateEnum.java",
    "content": "package org.jeecg.modules.message.enums;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.constant.enums.MessageTypeEnum;\nimport org.jeecg.common.system.annotation.EnumDict;\nimport org.jeecg.common.system.vo.DictModel;\n\nimport java.util.ArrayList;\nimport java.util.Calendar;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * 用于消息数据查询【vue3】\n * 新版系统通知查询条件\n * @Author taoYan\n * @Date 2022/8/19 20:41\n **/\n@Slf4j\n@EnumDict(\"rangeDate\")\npublic enum RangeDateEnum {\n\n    JT(\"jt\", \"今天\"),\n    ZT(\"zt\", \"昨天\"),\n    QT(\"qt\", \"前天\"),\n    BZ(\"bz\",\"本周\"),\n    SZ(\"sz\", \"上周\"),\n    BY(\"by\", \"本月\"),\n    SY(\"sy\", \"上月\"),\n    SEVENDAYS(\"7day\", \"7日\"),\n    ZDY(\"zdy\", \"自定义日期\");\n\n    String key;\n\n    String title;\n\n    RangeDateEnum(String key, String title){\n        this.key = key;\n        this.title = title;\n    }\n\n    /**\n     * 获取字典数据\n     * @return\n     */\n    public static List<DictModel> getDictList(){\n        List<DictModel> list = new ArrayList<>();\n        DictModel dictModel = null;\n        for(RangeDateEnum e: RangeDateEnum.values()){\n            dictModel = new DictModel();\n            dictModel.setValue(e.key);\n            dictModel.setText(e.title);\n            list.add(dictModel);\n        }\n        return list;\n    }\n\n    /**\n     * 根据key 获取范围时间值\n     * @param key\n     * @return\n     */\n    public static Date[] getRangeArray(String key){\n        Calendar calendar1 = Calendar.getInstance();\n        Calendar calendar2 = Calendar.getInstance();\n        Date[] array = new Date[2];\n        boolean flag = false;\n        if(JT.key.equals(key)){\n            //今天\n        } else if(ZT.key.equals(key)){\n            //昨天\n            calendar1.add(Calendar.DAY_OF_YEAR, -1);\n            calendar2.add(Calendar.DAY_OF_YEAR, -1);\n        } else if(QT.key.equals(key)){\n            //前天\n            calendar1.add(Calendar.DAY_OF_YEAR, -2);\n            calendar2.add(Calendar.DAY_OF_YEAR, -2);\n        } else if(BZ.key.equals(key)){\n            //本周\n            calendar1.set(Calendar.DAY_OF_WEEK, 2);\n\n            calendar2.add(Calendar.WEEK_OF_MONTH,1);\n            calendar2.add(Calendar.DAY_OF_WEEK,-1);\n        } else if(SZ.key.equals(key)){\n            //本周一减一周\n            calendar1.set(Calendar.DAY_OF_WEEK, 2);\n            calendar1.add(Calendar.WEEK_OF_MONTH, -1);\n\n            // 本周一减一天\n            calendar2.set(Calendar.DAY_OF_WEEK, 2);\n            calendar2.add(Calendar.DAY_OF_WEEK,-1);\n        } else if(BY.key.equals(key)){\n            //本月\n            calendar1.set(Calendar.DAY_OF_MONTH, 1);\n\n            calendar2.set(Calendar.DAY_OF_MONTH, 1);\n            calendar2.add(Calendar.MONTH, 1);\n            calendar2.add(Calendar.DAY_OF_MONTH, -1);\n        } else if(SY.key.equals(key)){\n            //本月第一天减一月\n            calendar1.set(Calendar.DAY_OF_MONTH, 1);\n            calendar1.add(Calendar.MONTH, -1);\n\n            //本月第一天减一天\n            calendar2.set(Calendar.DAY_OF_MONTH, 1);\n            calendar2.add(Calendar.DAY_OF_MONTH, -1);\n        } else if (SEVENDAYS.key.equals(key)){\n            //七日第一天\n            calendar1.setTime(new Date());\n            calendar1.add(Calendar.DATE, -7);\n        }else{\n            flag = true;\n        }\n        if(flag){\n            return null;\n        }\n        // 开始时间00:00:00 结束时间23:59:59\n        calendar1.set(Calendar.HOUR, 0);\n        calendar1.set(Calendar.MINUTE, 0);\n        calendar1.set(Calendar.SECOND, 0);\n        calendar1.set(Calendar.MILLISECOND, 0);\n        calendar2.set(Calendar.HOUR, 23);\n        calendar2.set(Calendar.MINUTE, 59);\n        calendar2.set(Calendar.SECOND, 59);\n        calendar2.set(Calendar.MILLISECOND, 999);\n        array[0] = calendar1.getTime();\n        array[1] = calendar2.getTime();\n        return array;\n    }\n    \n    public String getKey(){\n        return this.key;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/ISendMsgHandle.java",
    "content": "package org.jeecg.modules.message.handle;\n\nimport org.jeecg.common.api.dto.message.MessageDTO;\n\n/**\n * @Description: 发送信息接口\n * @author: jeecg-boot\n */\npublic interface ISendMsgHandle {\n\n    /**\n     * 发送信息\n     * @param esReceiver 接受人\n     * @param esTitle 标题\n     * @param esContent 内容\n     */\n\tvoid sendMsg(String esReceiver, String esTitle, String esContent);\n\n    /**\n     * 发送信息\n     * @param messageDTO\n     */\n\tdefault void sendMessage(MessageDTO messageDTO){\n\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgStatusEnum.java",
    "content": "package org.jeecg.modules.message.handle.enums;\n\n/**\n * 推送状态枚举\n * @author: jeecg-boot\n */\npublic enum SendMsgStatusEnum {\n\n//推送状态 0未推送 1推送成功 2推送失败\n\tWAIT(\"0\"), SUCCESS(\"1\"), FAIL(\"2\");\n\n\tprivate String code;\n\n\tprivate SendMsgStatusEnum(String code) {\n\t\tthis.code = code;\n\t}\n\n\tpublic String getCode() {\n\t\treturn code;\n\t}\n\n\tpublic void setStatusCode(String code) {\n\t\tthis.code = code;\n\t}\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgTypeEnum.java",
    "content": "package org.jeecg.modules.message.handle.enums;\n\nimport org.jeecg.common.util.oConvertUtils;\n\n/**\n * 发送消息类型枚举\n * @author: jeecg-boot\n */\npublic enum SendMsgTypeEnum {\n\n    /**\n     * 短信\n     */\n\tSMS(\"1\", \"org.jeecg.modules.message.handle.impl.SmsSendMsgHandle\"),\n    /**\n     * 邮件\n     */\n\tEMAIL(\"2\", \"org.jeecg.modules.message.handle.impl.EmailSendMsgHandle\"),\n    /**\n     * 微信\n     */\n\tWX(\"3\",\"org.jeecg.modules.message.handle.impl.WxSendMsgHandle\"),\n    /**\n     * 系统消息\n     */\n\tSYSTEM_MESSAGE(\"4\",\"org.jeecg.modules.message.handle.impl.SystemSendMsgHandle\");\n\n\tprivate String type;\n\n\tprivate String implClass;\n\n\tprivate SendMsgTypeEnum(String type, String implClass) {\n\t\tthis.type = type;\n\t\tthis.implClass = implClass;\n\t}\n\n\tpublic String getType() {\n\t\treturn type;\n\t}\n\n\tpublic void setType(String type) {\n\t\tthis.type = type;\n\t}\n\n\tpublic String getImplClass() {\n\t\treturn implClass;\n\t}\n\n\tpublic void setImplClass(String implClass) {\n\t\tthis.implClass = implClass;\n\t}\n\n\tpublic static SendMsgTypeEnum getByType(String type) {\n\t\tif (oConvertUtils.isEmpty(type)) {\n\t\t\treturn null;\n\t\t}\n\t\tfor (SendMsgTypeEnum val : values()) {\n\t\t\tif (val.getType().equals(type)) {\n\t\t\t\treturn val;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/DdSendMsgHandle.java",
    "content": "package org.jeecg.modules.message.handle.impl;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.dto.message.MessageDTO;\nimport org.jeecg.modules.message.handle.ISendMsgHandle;\nimport org.jeecg.modules.system.service.impl.ThirdAppDingtalkServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\n/**\n * @Description: 发钉钉消息模板\n * @author: jeecg-boot\n */\n@Slf4j\n@Component(\"ddSendMsgHandle\")\npublic class DdSendMsgHandle implements ISendMsgHandle {\n\n\t@Autowired\n\tprivate ThirdAppDingtalkServiceImpl dingtalkService;\n\n\t@Override\n\tpublic void sendMsg(String esReceiver, String esTitle, String esContent) {\n\t\tlog.info(\"发微信消息模板\");\n\t\tMessageDTO messageDTO = new MessageDTO();\n\t\tmessageDTO.setToUser(esReceiver);\n\t\tmessageDTO.setTitle(esTitle);\n\t\tmessageDTO.setContent(esContent);\n\t\tmessageDTO.setToAll(false);\n\t\tsendMessage(messageDTO);\n\t}\n\n\t@Override\n\tpublic void sendMessage(MessageDTO messageDTO) {\n\t\tdingtalkService.sendMessage(messageDTO, true);\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/EmailSendMsgHandle.java",
    "content": "package org.jeecg.modules.message.handle.impl;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.ObjectUtils;\nimport org.jeecg.common.api.dto.message.MessageDTO;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.enums.MessageTypeEnum;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.util.RedisUtil;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.StaticConfig;\nimport org.jeecg.modules.message.entity.SysMessage;\nimport org.jeecg.modules.message.handle.ISendMsgHandle;\nimport org.jeecg.modules.message.mapper.SysMessageMapper;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.mapper.SysUserMapper;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.mail.javamail.JavaMailSender;\nimport org.springframework.mail.javamail.MimeMessageHelper;\nimport org.springframework.stereotype.Component;\n\nimport jakarta.mail.MessagingException;\nimport jakarta.mail.internet.MimeMessage;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLEncoder;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.SynchronousQueue;\nimport java.util.concurrent.ThreadPoolExecutor;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * @Description: 邮箱发送信息\n * @author: jeecg-boot\n */\n@Slf4j\n@Component(\"emailSendMsgHandle\")\npublic class EmailSendMsgHandle implements ISendMsgHandle {\n    static String emailFrom;\n\n    public static void setEmailFrom(String emailFrom) {\n        EmailSendMsgHandle.emailFrom = emailFrom;\n    }\n\n    @Autowired\n    SysUserMapper sysUserMapper;\n\n    @Autowired\n    private RedisUtil redisUtil;\n    \n    @Autowired\n    private SysMessageMapper sysMessageMapper;\n\n    /**\n     * 真实姓名变量\n     */\n    private static final String  realNameExp = \"{REALNAME}\";\n    /**\n     * 线程池用于异步发送消息\n     */\n    public static ExecutorService cachedThreadPool = new ThreadPoolExecutor(0, 1024, 60L, TimeUnit.SECONDS, new SynchronousQueue<>());\n\n\n    @Override\n    public void sendMsg(String esReceiver, String esTitle, String esContent) {\n        JavaMailSender mailSender = (JavaMailSender) SpringContextUtils.getBean(\"mailSender\");\n        MimeMessage message = mailSender.createMimeMessage();\n        // 代码逻辑说明: 配置类数据获取\n        if(oConvertUtils.isEmpty(emailFrom)){\n            StaticConfig staticConfig = SpringContextUtils.getBean(StaticConfig.class);\n            setEmailFrom(staticConfig.getEmailFrom());\n        }\n        cachedThreadPool.execute(()->{\n            try {\n                log.info(\"============> 开始邮件发送，接收人：\"+esReceiver);\n                MimeMessageHelper helper = new MimeMessageHelper(message, true);\n                // 设置发送方邮箱地址\n                helper.setFrom(emailFrom);\n                helper.setTo(esReceiver);\n                helper.setSubject(esTitle);\n                helper.setText(esContent, true);\n                mailSender.send(message);\n                log.info(\"============> 邮件发送成功，接收人：\"+esReceiver);\n            } catch (MessagingException e) {\n                log.error(\"============> 邮件发送失败，接收人：\"+esReceiver, e.getMessage());\n            }\n        });\n    }\n\n    @Override\n    public void sendMessage(MessageDTO messageDTO) {\n        String content = messageDTO.getContent();\n        String title = messageDTO.getTitle();\n        // 代码逻辑说明: 【QQYUN-8523】敲敲云发邮件通知，不稳定---\n        boolean timeJobSendEmail = this.isTimeJobSendEmail(messageDTO.getToUser(), title, content);\n        if(timeJobSendEmail){\n            return;\n        }\n        this.sendEmailMessage(messageDTO);\n    }\n\n    /**\n     * 直接发送邮件\n     * \n     * @param messageDTO\n     */\n    public void sendEmailMessage(MessageDTO messageDTO) {\n        String[] arr = messageDTO.getToUser().split(\",\");\n        LambdaQueryWrapper<SysUser> query = new LambdaQueryWrapper<SysUser>().in(SysUser::getUsername, arr);\n        List<SysUser> list = sysUserMapper.selectList(query);\n        String content = messageDTO.getContent();\n        String title = messageDTO.getTitle();\n        for(SysUser user: list){\n            String email = user.getEmail();\n            if (ObjectUtils.isEmpty(email)) {\n                continue;\n            }\n            content=replaceContent(user,content);\n            log.info(\"邮件内容：\"+ content);\n            sendMsg(email, title, content);\n        }\n        \n        // 代码逻辑说明: QQYUN-5557【简流】通知节点 发送邮箱 表单上有一个邮箱字段，流程中，邮件发送节点，邮件接收人 不可选择邮箱\n        Set<String> toEmailList = messageDTO.getToEmailList();\n        if(toEmailList!=null && toEmailList.size()>0){\n            for(String email: toEmailList){\n                if (ObjectUtils.isEmpty(email)) {\n                    continue;\n                }\n                log.info(\"邮件内容：\"+ content);\n                sendMsg(email, title, content);\n            }\n        }\n        \n        //发送给抄送人\n        sendMessageToCopyUser(messageDTO);\n    }\n\n    /**\n     * 发送邮件给抄送人\n     * @param messageDTO\n     */\n    public void sendMessageToCopyUser(MessageDTO messageDTO) {\n        String copyToUser = messageDTO.getCopyToUser();\n        if(ObjectUtils.isNotEmpty(copyToUser)) {\n            LambdaQueryWrapper<SysUser> query = new LambdaQueryWrapper<SysUser>().in(SysUser::getUsername, copyToUser.split(\",\"));\n            List<SysUser> list = sysUserMapper.selectList(query);\n            String content = messageDTO.getContent();\n            String title = messageDTO.getTitle();\n\n            for (SysUser user : list) {\n                String email = user.getEmail();\n                if (ObjectUtils.isEmpty(email)) {\n                    continue;\n                }\n                content=replaceContent(user,content);\n                log.info(\"邮件内容：\" + content);\n                \n            // 代码逻辑说明: QQYUN-5557【简流】通知节点 发送邮箱 表单上有一个邮箱字段，流程中，邮件发送节点，邮件接收人 不可选择邮箱\n                sendEmail(email, content, title);\n            }\n\n            Set<String> ccEmailList = messageDTO.getCcEmailList();\n            if(ccEmailList!=null && ccEmailList.size()>0){\n                for(String email: ccEmailList){\n                    if (ObjectUtils.isEmpty(email)) {\n                        continue;\n                    }\n                    log.info(\"邮件内容：\"+ content);\n                    sendEmail(email, content, title);\n                }\n            }\n            \n        }\n    }\n\n    /**\n     * 发送邮件给抄送人调用\n     * @param email\n     * @param content\n     * @param title\n     */\n    private void sendEmail(String email, String content, String title){\n        JavaMailSender mailSender = (JavaMailSender) SpringContextUtils.getBean(\"mailSender\");\n        MimeMessage message = mailSender.createMimeMessage();\n        if (oConvertUtils.isEmpty(emailFrom)) {\n            StaticConfig staticConfig = SpringContextUtils.getBean(StaticConfig.class);\n            setEmailFrom(staticConfig.getEmailFrom());\n        }\n        cachedThreadPool.execute(()->{\n            try {\n                MimeMessageHelper helper = new MimeMessageHelper(message, true);\n                // 设置发送方邮箱地址\n                helper.setFrom(emailFrom);\n                helper.setTo(email);\n                //设置抄送人\n                helper.setCc(email);\n                helper.setSubject(title);\n                helper.setText(content, true);\n                mailSender.send(message);\n                log.info(\"============> 邮件发送成功，接收人：\"+email);\n            } catch (MessagingException e) {\n                log.warn(\"============> 邮件发送失败，接收人：\"+email, e.getMessage());\n            }\n        });\n    }\n    \n\n    /**\n     * 替换邮件内容变量\n     * @param user\n     * @param content\n     * @return\n     */\n    private String replaceContent(SysUser user,String content){\n        if (content.indexOf(realNameExp) > 0) {\n            content = content.replace(\"$\"+realNameExp,user.getRealname()).replace(realNameExp, user.getRealname());\n        }\n        if (content.indexOf(CommonConstant.LOGIN_TOKEN) > 0) {\n            String token = getToken(user);\n            try {\n                content = content.replace(CommonConstant.LOGIN_TOKEN, URLEncoder.encode(token, \"UTF-8\"));\n            } catch (UnsupportedEncodingException e) {\n                log.error(\"邮件消息token编码失败\", e.getMessage());\n            }\n        }\n        return content;\n    }\n\n    /**\n     * 获取token\n     * @param user\n     * @return\n     */\n    private String getToken(SysUser user) {\n        // 生成token\n        String token = JwtUtil.sign(user.getUsername(), user.getPassword(), CommonConstant.CLIENT_TYPE_PC);\n        redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);\n        // 设置超时时间 1个小时\n        redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 1 / 1000);\n        return token;\n    }\n\n    /**\n     * 是否定时发送邮箱\n     * @param toUser\n     * @param title\n     * @param content\n     * @return\n     */\n    private boolean isTimeJobSendEmail(String toUser, String title, String content) {\n        StaticConfig staticConfig = SpringContextUtils.getBean(StaticConfig.class);\n        Boolean timeJobSend = staticConfig.getTimeJobSend();\n        if(null != timeJobSend && timeJobSend){\n            this.addSysSmsSend(toUser,title,content);\n            return true;\n        }\n        return false;\n    }\n    \n    /**\n     * 保存到短信发送表\n     */\n    private void addSysSmsSend(String toUser, String title, String content) {\n        SysMessage sysMessage = new SysMessage();\n        sysMessage.setEsTitle(title);\n        sysMessage.setEsContent(content);\n        sysMessage.setEsReceiver(toUser);\n        sysMessage.setEsSendStatus(\"0\");\n        sysMessage.setEsSendNum(0);\n        sysMessage.setEsType(MessageTypeEnum.YJ.getType());\n        sysMessageMapper.insert(sysMessage);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/QywxSendMsgHandle.java",
    "content": "package org.jeecg.modules.message.handle.impl;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.dto.message.MessageDTO;\nimport org.jeecg.modules.message.handle.ISendMsgHandle;\nimport org.jeecg.modules.system.service.impl.ThirdAppWechatEnterpriseServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\n/**\n * @Description: 发企业微信消息模板\n * @author: jeecg-boot\n */\n@Slf4j\n@Component(\"qywxSendMsgHandle\")\npublic class QywxSendMsgHandle implements ISendMsgHandle {\n\n\t@Autowired\n\tprivate ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService;\n\n\t@Override\n\tpublic void sendMsg(String esReceiver, String esTitle, String esContent) {\n\t\tlog.info(\"发微信消息模板\");\n\t\tMessageDTO messageDTO = new MessageDTO();\n\t\tmessageDTO.setToUser(esReceiver);\n\t\tmessageDTO.setTitle(esTitle);\n\t\tmessageDTO.setContent(esContent);\n\t\tmessageDTO.setToAll(false);\n\t\tsendMessage(messageDTO);\n\t}\n\n\t@Override\n\tpublic void sendMessage(MessageDTO messageDTO) {\n\t\twechatEnterpriseService.sendMessage(messageDTO, true);\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/SmsSendMsgHandle.java",
    "content": "package org.jeecg.modules.message.handle.impl;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.modules.message.handle.ISendMsgHandle;\n\n/**\n * @Description: 短信发送\n * @author: jeecg-boot\n */\n@Slf4j\npublic class SmsSendMsgHandle implements ISendMsgHandle {\n\n\t@Override\n\tpublic void sendMsg(String esReceiver, String esTitle, String esContent) {\n\t\t// TODO Auto-generated method stub\n\t\tlog.info(\"发短信\");\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/SystemSendMsgHandle.java",
    "content": "package org.jeecg.modules.message.handle.impl;\n\nimport com.alibaba.fastjson.JSONObject;\nimport org.jeecg.common.api.dto.message.MessageDTO;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.WebsocketConst;\nimport org.jeecg.common.constant.enums.NoticeTypeEnum;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.api.ISysBaseAPI;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.common.constant.enums.Vue3MessageHrefEnum;\nimport org.jeecg.modules.message.handle.ISendMsgHandle;\nimport org.jeecg.modules.message.websocket.WebSocket;\nimport org.jeecg.modules.system.entity.SysAnnouncement;\nimport org.jeecg.modules.system.entity.SysAnnouncementSend;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.mapper.SysAnnouncementMapper;\nimport org.jeecg.modules.system.mapper.SysAnnouncementSendMapper;\nimport org.jeecg.modules.system.mapper.SysUserMapper;\nimport org.springframework.stereotype.Component;\n\nimport jakarta.annotation.Resource;\nimport java.util.Date;\nimport java.util.Map;\n\n/**\n* @Description: 发送系统消息\n* @Author: wangshuai\n* @Date: 2022年3月22日 18:48:20\n*/\n@Component(\"systemSendMsgHandle\")\npublic class SystemSendMsgHandle implements ISendMsgHandle {\n\n    public static final String FROM_USER=\"system\";\n\n    @Resource\n    private SysAnnouncementMapper sysAnnouncementMapper;\n\n    @Resource\n    private SysUserMapper userMapper;\n\n    @Resource\n    private SysAnnouncementSendMapper sysAnnouncementSendMapper;\n\n    @Resource\n    private WebSocket webSocket;\n\n    /**\n     * 该方法会发送3种消息：系统消息、企业微信 钉钉\n     * @param esReceiver 发送人\n     * @param esTitle 标题\n     * @param esContent 内容\n     */\n    @Override\n    public void sendMsg(String esReceiver, String esTitle, String esContent) {\n        if(oConvertUtils.isEmpty(esReceiver)){\n            throw  new JeecgBootException(\"被发送人不能为空\");\n        }\n        ISysBaseAPI sysBaseApi = SpringContextUtils.getBean(ISysBaseAPI.class);\n        MessageDTO messageDTO = new MessageDTO(FROM_USER,esReceiver,esTitle,esContent);\n        sysBaseApi.sendSysAnnouncement(messageDTO);\n    }\n\n    /**\n     * 仅发送系统消息\n     * @param messageDTO\n     */\n    @Override\n    public void sendMessage(MessageDTO messageDTO) {\n        //原方法不支持 sysBaseApi.sendSysAnnouncement(messageDTO);  有企业微信消息逻辑，\n        String title = messageDTO.getTitle();\n        String content = messageDTO.getContent();\n        String fromUser = messageDTO.getFromUser();\n        Map<String,Object> data = messageDTO.getData();\n        String[] arr = messageDTO.getToUser().split(\",\");\n        for(String username: arr){\n            // 代码逻辑说明: 【QQYUN-12162】OA项目改造，系统重消息拆分，目前消息都在一起 需按分类进行拆分---\n            doSend(title, content, fromUser, username, data, messageDTO.getNoticeType());\n        }\n    }\n\n    private void doSend(String title, String msgContent, String fromUser, String toUser, Map<String, Object> data, String noticeType){\n        SysAnnouncement announcement = new SysAnnouncement();\n        if(data!=null){\n            //摘要信息\n            Object msgAbstract = data.get(CommonConstant.NOTICE_MSG_SUMMARY);\n            if(msgAbstract!=null){\n                announcement.setMsgAbstract(msgAbstract.toString());\n            }\n            // 任务节点ID\n            Object taskId = data.get(CommonConstant.NOTICE_MSG_BUS_ID);\n            if(taskId!=null){\n                announcement.setBusId(taskId.toString());\n                announcement.setBusType(Vue3MessageHrefEnum.BPM_TASK.getBusType());\n                noticeType = NoticeTypeEnum.NOTICE_TYPE_FLOW.getValue();\n            }\n\n            // 流程内消息节点 发消息会传一个busType\n            Object busType = data.get(CommonConstant.NOTICE_MSG_BUS_TYPE);\n            if(busType!=null){\n                announcement.setBusType(busType.toString());\n                noticeType = NoticeTypeEnum.NOTICE_TYPE_FLOW.getValue();\n            }\n        }\n        announcement.setTitile(title);\n        announcement.setMsgContent(msgContent);\n        announcement.setSender(fromUser);\n        announcement.setPriority(CommonConstant.PRIORITY_M);\n        announcement.setMsgType(CommonConstant.MSG_TYPE_UESR);\n        announcement.setSendStatus(CommonConstant.HAS_SEND);\n        announcement.setSendTime(new Date());\n        //系统消息\n        announcement.setMsgCategory(\"2\");\n        announcement.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0));\n        if(oConvertUtils.isEmpty(noticeType)){\n            noticeType = NoticeTypeEnum.NOTICE_TYPE_SYSTEM.getValue();\n        }\n        announcement.setNoticeType(noticeType);\n        announcement.setIzTop(CommonConstant.IZ_TOP_0);\n        sysAnnouncementMapper.insert(announcement);\n        // 2.插入用户通告阅读标记表记录\n        String userId = toUser;\n        String[] userIds = userId.split(\",\");\n        String anntId = announcement.getId();\n        for(int i=0;i<userIds.length;i++) {\n            if(oConvertUtils.isNotEmpty(userIds[i])) {\n                SysUser sysUser = userMapper.getUserByName(userIds[i]);\n                if(sysUser==null) {\n                    continue;\n                }\n                SysAnnouncementSend announcementSend = new SysAnnouncementSend();\n                announcementSend.setAnntId(anntId);\n                announcementSend.setUserId(sysUser.getId());\n                announcementSend.setReadFlag(CommonConstant.NO_READ_FLAG);\n                sysAnnouncementSendMapper.insert(announcementSend);\n                JSONObject obj = new JSONObject();\n                obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);\n                obj.put(WebsocketConst.MSG_USER_ID, sysUser.getId());\n                obj.put(WebsocketConst.MSG_ID, announcement.getId());\n                obj.put(WebsocketConst.MSG_TXT, announcement.getTitile());\n                obj.put(CommonConstant.NOTICE_TYPE,noticeType);\n                webSocket.sendMessage(sysUser.getId(), obj.toJSONString());\n            }\n        }\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/WxSendMsgHandle.java",
    "content": "package org.jeecg.modules.message.handle.impl;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.modules.message.handle.ISendMsgHandle;\n\n/**\n * @Description: 发微信消息模板\n * @author: jeecg-boot\n */\n@Slf4j\npublic class WxSendMsgHandle implements ISendMsgHandle {\n\n\t@Override\n\tpublic void sendMsg(String esReceiver, String esTitle, String esContent) {\n\t\t// TODO Auto-generated method stub\n\t\tlog.info(\"发微信消息模板\");\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/job/SendMsgJob.java",
    "content": "package org.jeecg.modules.message.job;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.dto.message.MessageDTO;\nimport org.jeecg.common.system.api.ISysBaseAPI;\nimport org.jeecg.common.util.DateUtils;\nimport org.jeecg.modules.message.entity.SysMessage;\nimport org.jeecg.modules.message.handle.enums.SendMsgStatusEnum;\nimport org.jeecg.modules.message.service.ISysMessageService;\nimport org.quartz.Job;\nimport org.quartz.JobExecutionContext;\nimport org.quartz.JobExecutionException;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport java.util.List;\n\n/**\n * 发送消息任务\n * @author: jeecg-boot\n */\n\n@Slf4j\npublic class SendMsgJob implements Job {\n\n\t@Autowired\n\tprivate ISysMessageService sysMessageService;\n\n\t@Autowired\n\tprivate ISysBaseAPI sysBaseAPI;\n\n\t@Override\n\tpublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {\n\n\t\tlog.info(String.format(\" Jeecg-Boot 发送消息任务 SendMsgJob !  时间:\" + DateUtils.getTimestamp()));\n\n\t\t// 1.读取消息中心数据，只查询未发送的和发送失败不超过次数的\n\t\tQueryWrapper<SysMessage> queryWrapper = new QueryWrapper<SysMessage>();\n\t\tqueryWrapper.eq(\"es_send_status\", SendMsgStatusEnum.WAIT.getCode())\n\t\t\t\t.or(i -> i.eq(\"es_send_status\", SendMsgStatusEnum.FAIL.getCode()).lt(\"es_send_num\", 6));\n\t\tList<SysMessage> sysMessages = sysMessageService.list(queryWrapper);\n\t\tSystem.out.println(sysMessages);\n\t\t// 2.根据不同的类型走不通的发送实现类\n\t\tfor (SysMessage sysMessage : sysMessages) {\n\t\t\t// 代码逻辑说明: 模板消息发送测试调用方法修改\n\t\t\tInteger sendNum = sysMessage.getEsSendNum();\n\t\t\ttry {\n\t\t\t\tMessageDTO md = new MessageDTO();\n\t\t\t\tmd.setTitle(sysMessage.getEsTitle());\n\t\t\t\tmd.setContent(sysMessage.getEsContent());\n\t\t\t\tmd.setToUser(sysMessage.getEsReceiver());\n\t\t\t\tmd.setType(sysMessage.getEsType());\n\t\t\t\tmd.setToAll(false);\n\t\t\t\t// 代码逻辑说明: 【QQYUN-8523】敲敲云发邮件通知，不稳定---\n\t\t\t\tmd.setIsTimeJob(true);\n\t\t\t\tsysBaseAPI.sendTemplateMessage(md);\n\t\t\t\t//发送消息成功\n\t\t\t\tsysMessage.setEsSendStatus(SendMsgStatusEnum.SUCCESS.getCode());\n\t\t\t} catch (Exception e) {\n\t\t\t\te.printStackTrace();\n\t\t\t\t// 发送消息出现异常\n\t\t\t\tsysMessage.setEsSendStatus(SendMsgStatusEnum.FAIL.getCode());\n\t\t\t}\n\t\t\tsysMessage.setEsSendNum(++sendNum);\n\t\t\t// 发送结果回写到数据库\n\t\t\tsysMessageService.updateById(sysMessage);\n\t\t}\n\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/mapper/SysMessageMapper.java",
    "content": "package org.jeecg.modules.message.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.message.entity.SysMessage;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: 消息\n * @Author: jeecg-boot\n * @Date:  2019-04-09\n * @Version: V1.0\n */\npublic interface SysMessageMapper extends BaseMapper<SysMessage> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/mapper/SysMessageTemplateMapper.java",
    "content": "package org.jeecg.modules.message.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Select;\nimport org.jeecg.modules.message.entity.SysMessageTemplate;\n\nimport java.util.List;\n\n/**\n * @Description: 消息模板\n * @Author: jeecg-boot\n * @Date:  2019-04-09\n * @Version: V1.0\n */\npublic interface SysMessageTemplateMapper extends BaseMapper<SysMessageTemplate> {\n\n    /**\n     * 通过模板CODE查询消息模板\n     * @param code 模板CODE\n     * @return List<SysMessageTemplate>\n     */\n    @Select(\"SELECT * FROM SYS_SMS_TEMPLATE WHERE TEMPLATE_CODE = #{code}\")\n    List<SysMessageTemplate> selectByCode(String code);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/mapper/xml/SysMessageMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.message.mapper.SysMessageMapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/mapper/xml/SysMessageTemplateMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.message.mapper.SysMessageTemplateMapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/service/ISysMessageService.java",
    "content": "package org.jeecg.modules.message.service;\n\nimport org.jeecg.common.system.base.service.JeecgService;\nimport org.jeecg.modules.message.entity.SysMessage;\n\n/**\n * @Description: 消息\n * @Author: jeecg-boot\n * @Date:  2019-04-09\n * @Version: V1.0\n */\npublic interface ISysMessageService extends JeecgService<SysMessage> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/service/ISysMessageTemplateService.java",
    "content": "package org.jeecg.modules.message.service;\n\nimport java.util.List;\n\nimport org.jeecg.common.system.base.service.JeecgService;\nimport org.jeecg.modules.message.entity.SysMessageTemplate;\n\n/**\n * @Description: 消息模板\n * @Author: jeecg-boot\n * @Date:  2019-04-09\n * @Version: V1.0\n */\npublic interface ISysMessageTemplateService extends JeecgService<SysMessageTemplate> {\n\n    /**\n     * 通过模板CODE查询消息模板\n     * @param code 模板CODE\n     * @return\n     */\n    List<SysMessageTemplate> selectByCode(String code);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/service/impl/SysMessageServiceImpl.java",
    "content": "package org.jeecg.modules.message.service.impl;\n\nimport org.jeecg.common.system.base.service.impl.JeecgServiceImpl;\nimport org.jeecg.modules.message.entity.SysMessage;\nimport org.jeecg.modules.message.mapper.SysMessageMapper;\nimport org.jeecg.modules.message.service.ISysMessageService;\nimport org.springframework.stereotype.Service;\n\n/**\n * @Description: 消息\n * @Author: jeecg-boot\n * @Date:  2019-04-09\n * @Version: V1.0\n */\n@Service\npublic class SysMessageServiceImpl extends JeecgServiceImpl<SysMessageMapper, SysMessage> implements ISysMessageService {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/service/impl/SysMessageTemplateServiceImpl.java",
    "content": "package org.jeecg.modules.message.service.impl;\n\nimport org.jeecg.common.system.base.service.impl.JeecgServiceImpl;\nimport org.jeecg.modules.message.entity.SysMessageTemplate;\nimport org.jeecg.modules.message.mapper.SysMessageTemplateMapper;\nimport org.jeecg.modules.message.service.ISysMessageTemplateService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport java.util.List;\n\n/**\n * @Description: 消息模板\n * @Author: jeecg-boot\n * @Date:  2019-04-09\n * @Version: V1.0\n */\n@Service\npublic class SysMessageTemplateServiceImpl extends JeecgServiceImpl<SysMessageTemplateMapper, SysMessageTemplate> implements ISysMessageTemplateService {\n\n    @Autowired\n    private SysMessageTemplateMapper sysMessageTemplateMapper;\n\n\n    @Override\n    public List<SysMessageTemplate> selectByCode(String code) {\n        return sysMessageTemplateMapper.selectByCode(code);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/util/PushMsgUtil.java",
    "content": "package org.jeecg.modules.message.util;\n\nimport freemarker.template.Configuration;\nimport freemarker.template.Template;\nimport freemarker.template.TemplateException;\nimport org.jeecg.modules.message.entity.SysMessage;\nimport org.jeecg.modules.message.entity.SysMessageTemplate;\nimport org.jeecg.modules.message.handle.enums.SendMsgStatusEnum;\nimport org.jeecg.modules.message.service.ISysMessageService;\nimport org.jeecg.modules.message.service.ISysMessageTemplateService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport com.alibaba.fastjson.JSONObject;\n\nimport java.io.IOException;\nimport java.io.StringWriter;\nimport java.util.Date;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * 消息生成工具\n * @author: jeecg-boot\n */\n\n@Component\npublic class PushMsgUtil {\n\n    @Autowired\n    private ISysMessageService sysMessageService;\n\n    @Autowired\n    private ISysMessageTemplateService sysMessageTemplateService;\n\n    @Autowired\n    private Configuration freemarkerConfig;\n    /**\n     * @param msgType 消息类型 1短信 2邮件 3微信\n     * @param templateCode    消息模板码\n     * @param map     消息参数\n     * @param sentTo  接收消息方\n     */\n    public boolean sendMessage(String msgType, String templateCode, Map<String, String> map, String sentTo) {\n        List<SysMessageTemplate> sysSmsTemplates = sysMessageTemplateService.selectByCode(templateCode);\n        SysMessage sysMessage = new SysMessage();\n        if (sysSmsTemplates.size() > 0) {\n            SysMessageTemplate sysSmsTemplate = sysSmsTemplates.get(0);\n            sysMessage.setEsType(msgType);\n            sysMessage.setEsReceiver(sentTo);\n            //模板标题\n            String title = sysSmsTemplate.getTemplateName();\n            //模板内容\n            String content = sysSmsTemplate.getTemplateContent();\n            StringWriter stringWriter = new StringWriter();\n            Template template = null;\n            try {\n                template = new Template(\"SysMessageTemplate\", content, freemarkerConfig);\n                template.process(map, stringWriter);\n            } catch (IOException e) {\n                e.printStackTrace();\n                return false;\n            } catch (TemplateException e) {\n                e.printStackTrace();\n                return false;\n            }\n            content = stringWriter.toString();\n            sysMessage.setEsTitle(title);\n            sysMessage.setEsContent(content);\n            sysMessage.setEsParam(JSONObject.toJSONString(map));\n            sysMessage.setEsSendTime(new Date());\n            sysMessage.setEsSendStatus(SendMsgStatusEnum.WAIT.getCode());\n            sysMessage.setEsSendNum(0);\n            if(sysMessageService.save(sysMessage)) {\n\t\t\t\treturn true;\n\t\t\t}\n        }\n        return false;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/websocket/SocketHandler.java",
    "content": "package org.jeecg.modules.message.websocket;\n\nimport cn.hutool.core.util.ObjectUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.common.constant.CommonSendStatus;\nimport org.jeecg.common.modules.redis.listener.JeecgRedisListener;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\n/**\n * 监听消息(通过redis发布订阅，推送消息)\n * 此方案：解决集群部署的问题，多实例节点（也就是发送消息端先发送消息到redis中，每个服务节点收到redis消息，再触发具体的ws推送）\n * @author: jeecg-boot\n */\n@Slf4j\n@Component(WebSocket.REDIS_TOPIC_NAME)\npublic class SocketHandler implements JeecgRedisListener {\n\n    @Autowired\n    private WebSocket webSocket;\n\n    @Override\n    public void onMessage(BaseMap map) {\n        log.debug(\"【Redis发布订阅模式】redis Listener: {}，参数：{}\",WebSocket.REDIS_TOPIC_NAME, map.toString());\n\n        String userId = map.get(\"userId\");\n        String message = map.get(\"message\");\n        if (ObjectUtil.isNotEmpty(userId)) {\n            //pc端消息推送具体人\n            webSocket.pushMessage(userId, message);\n            //app端消息推送具体人\n            webSocket.pushMessage(userId+CommonSendStatus.APP_SESSION_SUFFIX, message);\n        } else {\n            //推送全部\n            webSocket.pushMessage(message);\n        }\n\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java",
    "content": "package org.jeecg.modules.message.websocket;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport jakarta.websocket.*;\nimport jakarta.websocket.server.PathParam;\nimport jakarta.websocket.server.ServerEndpoint;\n\nimport com.alibaba.fastjson.JSONObject;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.common.constant.WebsocketConst;\nimport org.jeecg.common.modules.redis.client.JeecgRedisClient;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * @Author scott\n * @Date 2019/11/29 9:41\n * @Description: 此注解相当于设置访问URL\n */\n@Component\n@Slf4j\n@ServerEndpoint(\"/websocket/{userId}\")\npublic class WebSocket {\n    \n    /**线程安全Map*/\n    private static ConcurrentHashMap<String, Session> sessionPool = new ConcurrentHashMap<>();\n\n    /**\n     * Redis触发监听名字\n     */\n    public static final String REDIS_TOPIC_NAME = \"socketHandler\";\n\n    //避免初次调用出现空指针的情况\n    private static JeecgRedisClient jeecgRedisClient;\n    @Autowired\n    private void setJeecgRedisClient(JeecgRedisClient jeecgRedisClient){\n        WebSocket.jeecgRedisClient = jeecgRedisClient;\n    }\n\n\n    //==========【websocket接受、推送消息等方法 —— 具体服务节点推送ws消息】========================================================================================\n    @OnOpen\n    public void onOpen(Session session, @PathParam(value = \"userId\") String userId) {\n        try {\n            sessionPool.put(userId, session);\n            log.debug(\"【系统 WebSocket】有新的连接，总数为:\" + sessionPool.size());\n        } catch (Exception e) {\n        }\n    }\n\n    @OnClose\n    public void onClose(@PathParam(\"userId\") String userId) {\n        try {\n            sessionPool.remove(userId);\n            log.debug(\"【系统 WebSocket】连接断开，总数为:\" + sessionPool.size());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    /**\n     * ws推送消息\n     *\n     * @param userId\n     * @param message\n     */\n    public void pushMessage(String userId, String message) {\n        for (Map.Entry<String, Session> item : sessionPool.entrySet()) {\n            //userId key值= {用户id + \"_\"+ 登录token的md5串}\n            //TODO vue2未改key新规则，暂时不影响逻辑\n            if (item.getKey().contains(userId)) {\n                Session session = item.getValue();\n                try {\n                    // 代码逻辑说明: websocket报错 https://gitee.com/jeecg/jeecg-boot/issues/I4C0MU\n                    synchronized (session){\n                        log.debug(\"【系统 WebSocket】推送单人消息:\" + message);\n                        session.getBasicRemote().sendText(message);\n                    }\n                } catch (Exception e) {\n                    log.error(e.getMessage(),e);\n                }\n            }\n        }\n    }\n\n    /**\n     * ws遍历群发消息\n     */\n    public void pushMessage(String message) {\n        try {\n            for (Map.Entry<String, Session> item : sessionPool.entrySet()) {\n                try {\n                    item.getValue().getAsyncRemote().sendText(message);\n                } catch (Exception e) {\n                    log.error(e.getMessage(), e);\n                }\n            }\n            log.debug(\"【系统 WebSocket】群发消息:\" + message);\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n        }\n    }\n\n\n    /**\n     * ws接受客户端消息\n     */\n    @OnMessage\n    public void onMessage(String message, @PathParam(value = \"userId\") String userId) {\n        if(!\"ping\".equals(message) && !WebsocketConst.CMD_CHECK.equals(message)){\n            log.debug(\"【系统 WebSocket】收到客户端消息:\" + message);\n        }else{\n            log.debug(\"【系统 WebSocket】收到客户端消息:\" + message);\n            // 代码逻辑说明: 【issues/1161】前端websocket因心跳导致监听不起作用---\n            this.sendMessage(userId, \"ping\");\n        }\n        \n//        //------------------------------------------------------------------------------\n//        JSONObject obj = new JSONObject();\n//        //业务类型\n//        obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_CHECK);\n//        //消息内容\n//        obj.put(WebsocketConst.MSG_TXT, \"心跳响应\");\n//        this.pushMessage(userId, obj.toJSONString());\n//        //------------------------------------------------------------------------------\n    }\n\n    /**\n     * 配置错误信息处理\n     *\n     * @param session\n     * @param t\n     */\n    @OnError\n    public void onError(Session session, Throwable t) {\n        log.warn(\"【系统 WebSocket】消息出现错误\");\n        t.printStackTrace();\n    }\n    //==========【系统 WebSocket接受、推送消息等方法 —— 具体服务节点推送ws消息】========================================================================================\n    \n\n    //==========【采用redis发布订阅模式——推送消息】========================================================================================\n    /**\n     * 后台发送消息到redis\n     *\n     * @param message\n     */\n    public void sendMessage(String message) {\n        //log.debug(\"【系统 WebSocket】广播消息:\" + message);\n        BaseMap baseMap = new BaseMap();\n        baseMap.put(\"userId\", \"\");\n        baseMap.put(\"message\", message);\n        jeecgRedisClient.sendMessage(WebSocket.REDIS_TOPIC_NAME, baseMap);\n    }\n\n    /**\n     * 此为单点消息 redis\n     *\n     * @param userId\n     * @param message\n     */\n    public void sendMessage(String userId, String message) {\n        BaseMap baseMap = new BaseMap();\n        baseMap.put(\"userId\", userId);\n        baseMap.put(\"message\", message);\n        jeecgRedisClient.sendMessage(WebSocket.REDIS_TOPIC_NAME, baseMap);\n    }\n\n    /**\n     * 此为单点消息(多人) redis\n     *\n     * @param userIds\n     * @param message\n     */\n    public void sendMessage(String[] userIds, String message) {\n        for (String userId : userIds) {\n            sendMessage(userId, message);\n        }\n    }\n    //=======【采用redis发布订阅模式——推送消息】==========================================================================================\n    \n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/CustomActuatorConfig.java",
    "content": "package org.jeecg.modules.monitor.actuator;\n\nimport org.jeecg.modules.monitor.actuator.httptrace.CustomInMemoryHttpTraceRepository;\nimport org.springframework.boot.actuate.autoconfigure.web.exchanges.HttpExchangesAutoConfiguration;\nimport org.springframework.boot.actuate.autoconfigure.web.exchanges.HttpExchangesProperties;\nimport org.springframework.boot.actuate.web.exchanges.HttpExchangeRepository;\nimport org.springframework.boot.autoconfigure.AutoConfigureBefore;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;\nimport org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;\nimport org.springframework.boot.context.properties.EnableConfigurationProperties;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n/**\n * 自定义健康监控配置类\n *\n * @Author: chenrui\n * @Date: 2024/5/13 17:20\n */\n@Configuration\n@EnableConfigurationProperties(HttpExchangesProperties.class)\n@AutoConfigureBefore(HttpExchangesAutoConfiguration.class)\npublic class CustomActuatorConfig {\n\n    /**\n     * 请求追踪\n     * @return\n     * @author chenrui\n     * @date 2024/5/14 14:52\n     */\n    @Bean\n    @ConditionalOnProperty(prefix = \"management.trace.http\", name = \"enabled\", matchIfMissing = true)\n    @ConditionalOnMissingBean(HttpExchangeRepository.class)\n    public CustomInMemoryHttpTraceRepository traceRepository() {\n        return new CustomInMemoryHttpTraceRepository();\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/httptrace/CustomHttpTraceEndpoint.java",
    "content": "package org.jeecg.modules.monitor.actuator.httptrace;\n\nimport lombok.Getter;\nimport org.springframework.boot.actuate.endpoint.annotation.Endpoint;\nimport org.springframework.boot.actuate.endpoint.annotation.ReadOperation;\nimport org.springframework.boot.actuate.endpoint.annotation.Selector;\nimport org.springframework.boot.actuate.web.exchanges.HttpExchange;\nimport org.springframework.stereotype.Component;\nimport org.springframework.util.Assert;\n\nimport java.util.List;\n\nimport static org.springframework.boot.actuate.endpoint.annotation.Selector.Match.ALL_REMAINING;\n\n/**\n * @Description: ENDPOINT: 请求追踪(新),支持通过responseCode筛选\n * @Author: chenrui\n * @Date: 2024/5/13 17:02\n */\n@Component\n@Endpoint(id = \"jeecghttptrace\")\npublic class CustomHttpTraceEndpoint{\n    private final CustomInMemoryHttpTraceRepository repository;\n\n    public CustomHttpTraceEndpoint(CustomInMemoryHttpTraceRepository repository) {\n        Assert.notNull(repository, \"Repository must not be null\");\n        this.repository = repository;\n    }\n\n    @ReadOperation\n    public HttpTraceDescriptor traces(@Selector(match = ALL_REMAINING) String query) {\n        return new HttpTraceDescriptor(this.repository.findAll(query));\n    }\n\n    @Getter\n    public static final class HttpTraceDescriptor {\n        private final List<HttpExchange> traces;\n\n        private HttpTraceDescriptor(List<HttpExchange> traces) {\n            this.traces = traces;\n        }\n\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/httptrace/CustomInMemoryHttpTraceRepository.java",
    "content": "package org.jeecg.modules.monitor.actuator.httptrace;\n\nimport org.springframework.boot.actuate.web.exchanges.HttpExchange;\nimport org.springframework.boot.actuate.web.exchanges.InMemoryHttpExchangeRepository;\n\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\n\n/**\n * @Description: 自定义内存请求追踪存储\n * @Author: chenrui\n * @Date: 2024/5/13 17:02\n */\npublic class CustomInMemoryHttpTraceRepository extends InMemoryHttpExchangeRepository {\n\n    @Override\n    public List<HttpExchange> findAll() {\n        return super.findAll();\n    }\n\n    /**\n     * for [issues/8309]系统监控>请求追踪，列表每刷新一下，总数据就减一#8309\n     * @param trace\n     * @author chenrui\n     * @date 2025/6/4 19:38\n     */\n    @Override\n    public void add(HttpExchange trace) {\n        // 只有当请求不是OPTIONS方法，并且URI不包含httptrace时才记录数据\n        if (!\"OPTIONS\".equals(trace.getRequest().getMethod()) &&\n                !trace.getRequest().getUri().toString().contains(\"httptrace\")) {\n            super.add(trace);\n        }\n    }\n\n    public List<HttpExchange> findAll(String query) {\n        List<HttpExchange> allTrace = super.findAll();\n        if (null != allTrace && !allTrace.isEmpty()) {\n            Stream<HttpExchange> stream = allTrace.stream();\n            String[] params = query.split(\",\");\n            stream = filter(params, stream);\n            stream = sort(params, stream);\n            allTrace = stream.collect(Collectors.toList());\n        }\n        return allTrace;\n    }\n\n    private Stream<HttpExchange> sort(String[] params, Stream<HttpExchange> stream) {\n        if (params.length < 2) {\n            return stream;\n        }\n        String sortBy = params[1];\n        String order;\n        if (params.length > 2) {\n            order = params[2];\n        } else {\n            order = \"desc\";\n        }\n        return stream.sorted((o1, o2) -> {\n            int i = 0;\n            if(\"timeTaken\".equalsIgnoreCase(sortBy)) {\n                i = o1.getTimeTaken().compareTo(o2.getTimeTaken());\n            }else if(\"timestamp\".equalsIgnoreCase(sortBy)){\n                i = o1.getTimestamp().compareTo(o2.getTimestamp());\n            }\n            if(\"desc\".equalsIgnoreCase(order)){\n                i *=-1;\n            }\n            return i;\n        });\n    }\n\n    private static Stream<HttpExchange> filter(String[] params, Stream<HttpExchange> stream) {\n        if (params.length == 0) {\n            return stream;\n        }\n        String statusQuery = params[0];\n        if (null != statusQuery && !statusQuery.isEmpty()) {\n            statusQuery = statusQuery.toLowerCase().trim();\n            switch (statusQuery) {\n                case \"error\":\n                    stream = stream.filter(httpTrace -> {\n                        int status = httpTrace.getResponse().getStatus();\n                        return status >= 404 && status < 501;\n                    });\n                    break;\n                case \"warn\":\n                    stream = stream.filter(httpTrace -> {\n                        int status = httpTrace.getResponse().getStatus();\n                        return status >= 201 && status < 404;\n                    });\n                    break;\n                case \"success\":\n                    stream = stream.filter(httpTrace -> {\n                        int status = httpTrace.getResponse().getStatus();\n                        return status == 200;\n                    });\n                    break;\n                case \"all\":\n                default:\n                    break;\n            }\n            return stream;\n        }\n        return stream;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/actuator/undertow/CustomUndertowMetricsHandler.java",
    "content": "//package org.jeecg.modules.monitor.actuator.undertow;\n//\n//import io.micrometer.core.instrument.MeterRegistry;\n//import io.undertow.server.HttpHandler;\n//import io.undertow.server.HttpServerExchange;\n//import io.undertow.server.session.*;\n//import org.springframework.stereotype.Component;\n//\n//import java.util.concurrent.atomic.AtomicInteger;\n//import java.util.concurrent.atomic.LongAdder;\n//\n///**\n// * 自定义undertow监控指标工具类\n// * for [QQYUN-11902]tomcat 替换undertow 这里的功能还没修改\n// * @author chenrui\n// * @date 2025/4/8 19:06\n// */\n//@Component(\"jeecgCustomUndertowMetricsHandler\")\n//public class CustomUndertowMetricsHandler {\n//\n//    // 用于统计已创建的 session 数量\n//    private final LongAdder sessionsCreated = new LongAdder();\n//\n//    // 用于统计已销毁的 session 数量\n//    private final LongAdder sessionsExpired = new LongAdder();\n//\n//    // 当前活跃的 session 数量\n//    private final AtomicInteger activeSessions = new AtomicInteger();\n//\n//    // 历史最大活跃 session 数\n//    private final AtomicInteger maxActiveSessions = new AtomicInteger();\n//\n//    // Undertow 内存 session 管理器（用于创建与管理 session）\n//    private final InMemorySessionManager sessionManager = new InMemorySessionManager(\"undertow-session-manager\");\n//\n//    // 使用 Cookie 存储 session ID\n//    private final SessionConfig sessionConfig = new SessionCookieConfig();\n//\n//    /**\n//     * 构造函数\n//     * @param meterRegistry\n//     * @author chenrui\n//     * @date 2025/4/8 19:07\n//     */\n//    public CustomUndertowMetricsHandler(MeterRegistry meterRegistry) {\n//        // 注册 Micrometer 指标\n//        meterRegistry.gauge(\"undertow.sessions.created\", sessionsCreated, LongAdder::longValue);\n//        meterRegistry.gauge(\"undertow.sessions.expired\", sessionsExpired, LongAdder::longValue);\n//        meterRegistry.gauge(\"undertow.sessions.active.current\", activeSessions, AtomicInteger::get);\n//        meterRegistry.gauge(\"undertow.sessions.active.max\", maxActiveSessions, AtomicInteger::get);\n//\n//        // 添加 session 生命周期监听器，统计 session 创建与销毁\n//        sessionManager.registerSessionListener(new SessionListener() {\n//            @Override\n//            public void sessionCreated(Session session, HttpServerExchange exchange) {\n//                sessionsCreated.increment();\n//                int now = activeSessions.incrementAndGet();\n//                maxActiveSessions.getAndUpdate(max -> Math.max(max, now));\n//            }\n//\n//            @Override\n//            public void sessionDestroyed(Session session, HttpServerExchange exchange, SessionDestroyedReason reason) {\n//                sessionsExpired.increment();\n//                activeSessions.decrementAndGet();\n//            }\n//        });\n//    }\n//\n//    /**\n//     * 包装 Undertow 的 HttpHandler，实现 session 自动创建逻辑\n//     * @param next\n//     * @return\n//     * @author chenrui\n//     * @date 2025/4/8 19:07\n//     */\n//    public HttpHandler wrap(HttpHandler next) {\n//        return exchange -> {\n//            // 获取当前 session，如果不存在则创建\n//            Session session = sessionManager.getSession(exchange, sessionConfig);\n//            if (session == null) {\n//                sessionManager.createSession(exchange, sessionConfig);\n//            }\n//\n//            // 执行下一个 Handler\n//            next.handleRequest(exchange);\n//        };\n//    }\n//}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/controller/ActuatorMemoryController.java",
    "content": "package org.jeecg.modules.monitor.controller;\n\nimport cn.hutool.core.util.NumberUtil;\nimport com.alibaba.fastjson.JSONObject;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.lang.management.ManagementFactory;\nimport java.lang.management.OperatingSystemMXBean;\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * @Description: 内存健康检查\n * @author: chenrui\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/sys/actuator/memory\")\npublic class ActuatorMemoryController {\n\n\n    /**\n     * 内存详情\n     * @return\n     */\n    @GetMapping(\"/info\")\n    public Result<?> getRedisInfo() {\n\t\tRuntime runtime = Runtime.getRuntime();\n\t\tMap<String,Number> result = new HashMap<>();\n\t\tresult.put(\"memory.runtime.total\", runtime.totalMemory());\n\t\tresult.put(\"memory.runtime.used\", runtime.freeMemory());\n\t\tresult.put(\"memory.runtime.max\", runtime.totalMemory() - runtime.freeMemory());\n\t\tresult.put(\"memory.runtime.free\", runtime.maxMemory() - runtime.totalMemory() + runtime.freeMemory());\n\t\tresult.put(\"memory.runtime.usage\", NumberUtil.div(runtime.totalMemory() - runtime.freeMemory(), runtime.totalMemory()));\n\t\t// 代码逻辑说明: [TV360X-1695]内存信息-立即更新 功能报错 #6635------------\n\t\tOperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();\n\t\tif (operatingSystemMXBean instanceof com.sun.management.OperatingSystemMXBean) {\n\t\t\tcom.sun.management.OperatingSystemMXBean opBean = (com.sun.management.OperatingSystemMXBean) operatingSystemMXBean;\n//\t\t\tJSONObject operatingSystemJson = JSONObject.parseObject(JSONObject.toJSONString(operatingSystemMXBean));\n\t\t\tlong totalPhysicalMemory = opBean.getTotalPhysicalMemorySize();\n\t\t\tlong freePhysicalMemory = opBean.getFreePhysicalMemorySize();\n\t\t\tlong usedPhysicalMemory = totalPhysicalMemory - freePhysicalMemory;\n\t\t\tresult.put(\"memory.physical.total\", totalPhysicalMemory);\n\t\t\tresult.put(\"memory.physical.used\", freePhysicalMemory);\n\t\t\tresult.put(\"memory.physical.free\", usedPhysicalMemory);\n\t\t\tresult.put(\"memory.physical.usage\", NumberUtil.div(usedPhysicalMemory, totalPhysicalMemory));\n\t\t}\n\t\treturn Result.ok(result);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/controller/ActuatorRedisController.java",
    "content": "package org.jeecg.modules.monitor.controller;\n\nimport com.alibaba.fastjson.JSONArray;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.modules.monitor.domain.RedisInfo;\nimport org.jeecg.modules.monitor.service.RedisService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport javax.swing.filechooser.FileSystemView;\nimport java.io.File;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @Description: ActuatorRedisController\n * @author: jeecg-boot\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/sys/actuator/redis\")\npublic class ActuatorRedisController {\n\n    @Autowired\n    private RedisService redisService;\n\n    /**\n     * Redis详细信息\n     * @return\n     * @throws Exception\n     */\n    @GetMapping(\"/info\")\n    public Result<?> getRedisInfo() throws Exception {\n        List<RedisInfo> infoList = this.redisService.getRedisInfo();\n        //log.info(infoList.toString());\n        return Result.ok(infoList);\n    }\n\n\t/**\n\t * Redis历史性能指标查询(过去一小时)\n\t * @return\n\t * @throws Exception\n\t * @author chenrui\n\t * @date 2024/5/14 14:56\n\t */\n\t@GetMapping(value = \"/metrics/history\")\n\tpublic Result<?> getMetricsHistory() throws Exception {\n\t\tMap<String,List<Map<String,Object>>> metricsHistory = this.redisService.getMetricsHistory();\n\t    return Result.OK(metricsHistory);\n\t}\n\n    @GetMapping(\"/keysSize\")\n    public Map<String, Object> getKeysSize() throws Exception {\n        return redisService.getKeysSize();\n    }\n\n    /**\n     * 获取redis key数量 for 报表\n     * @return\n     * @throws Exception\n     */\n    @GetMapping(\"/keysSizeForReport\")\n    public Map<String, JSONArray> getKeysSizeReport() throws Exception {\n\t\treturn redisService.getMapForReport(\"1\");\n    }\n    /**\n     * 获取redis 内存 for 报表\n     *\n     * @return\n     * @throws Exception\n     */\n    @GetMapping(\"/memoryForReport\")\n    public Map<String, JSONArray> memoryForReport() throws Exception {\n\t\treturn redisService.getMapForReport(\"2\");\n    }\n    /**\n     * 获取redis 全部信息 for 报表\n     * @return\n     * @throws Exception\n     */\n    @GetMapping(\"/infoForReport\")\n    public Map<String, JSONArray> infoForReport() throws Exception {\n\t\treturn redisService.getMapForReport(\"3\");\n    }\n\n    @GetMapping(\"/memoryInfo\")\n    public Map<String, Object> getMemoryInfo() throws Exception {\n        return redisService.getMemoryInfo();\n    }\n    \n  \t/**\n  \t * @功能：获取磁盘信息\n  \t * @param request\n  \t * @param response\n  \t * @return\n  \t */\n  \t@GetMapping(\"/queryDiskInfo\")\n  \tpublic Result<List<Map<String,Object>>> queryDiskInfo(HttpServletRequest request, HttpServletResponse response){\n  \t\tResult<List<Map<String,Object>>> res = new Result<>();\n  \t\ttry {\n  \t\t\t// 当前文件系统类\n  \t        FileSystemView fsv = FileSystemView.getFileSystemView();\n  \t        // 列出所有windows 磁盘\n  \t        File[] fs = File.listRoots();\n  \t        log.info(\"查询磁盘信息:\"+fs.length+\"个\");\n  \t        List<Map<String,Object>> list = new ArrayList<>();\n  \t        \n  \t        for (int i = 0; i < fs.length; i++) {\n  \t        \tif(fs[i].getTotalSpace()==0) {\n  \t        \t\tcontinue;\n  \t        \t}\n  \t        \tMap<String,Object> map = new HashMap(5);\n  \t        \tmap.put(\"name\", fsv.getSystemDisplayName(fs[i]));\n  \t        \tmap.put(\"max\", fs[i].getTotalSpace());\n  \t        \tmap.put(\"rest\", fs[i].getFreeSpace());\n  \t        \tmap.put(\"restPPT\", (fs[i].getTotalSpace()-fs[i].getFreeSpace())*100/fs[i].getTotalSpace());\n  \t        \tlist.add(map);\n  \t        \tlog.info(map.toString());\n  \t        }\n  \t        res.setResult(list);\n  \t        res.success(\"查询成功\");\n  \t\t} catch (Exception e) {\n  \t\t\tres.error500(\"查询失败\"+e.getMessage());\n  \t\t}\n  \t\treturn res;\n  \t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/domain/RedisInfo.java",
    "content": "package org.jeecg.modules.monitor.domain;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * @Description: redis信息\n * @author: jeecg-boot\n */\npublic class RedisInfo {\n\n\tprivate static Map<String, String> map = new HashMap(5);\n\n\tstatic {\n\t\tmap.put(\"redis_version\", \"Redis 服务器版本\");\n\t\tmap.put(\"redis_git_sha1\", \"Git SHA1\");\n\t\tmap.put(\"redis_git_dirty\", \"Git dirty flag\");\n\t\tmap.put(\"os\", \"Redis 服务器的宿主操作系统\");\n\t\tmap.put(\"arch_bits\", \" 架构（32 或 64 位）\");\n\t\tmap.put(\"multiplexing_api\", \"Redis 所使用的事件处理机制\");\n\t\tmap.put(\"gcc_version\", \"编译 Redis 时所使用的 GCC 版本\");\n\t\tmap.put(\"process_id\", \"服务器进程的 PID\");\n\t\tmap.put(\"run_id\", \"Redis 服务器的随机标识符（用于 Sentinel 和集群）\");\n\t\tmap.put(\"tcp_port\", \"TCP/IP 监听端口\");\n\t\tmap.put(\"uptime_in_seconds\", \"自 Redis 服务器启动以来，经过的秒数\");\n\t\tmap.put(\"uptime_in_days\", \"自 Redis 服务器启动以来，经过的天数\");\n\t\tmap.put(\"lru_clock\", \" 以分钟为单位进行自增的时钟，用于 LRU 管理\");\n\t\tmap.put(\"connected_clients\", \"已连接客户端的数量（不包括通过从属服务器连接的客户端）\");\n\t\tmap.put(\"client_longest_output_list\", \"当前连接的客户端当中，最长的输出列表\");\n\t\tmap.put(\"client_longest_input_buf\", \"当前连接的客户端当中，最大输入缓存\");\n\t\tmap.put(\"blocked_clients\", \"正在等待阻塞命令（BLPOP、BRPOP、BRPOPLPUSH）的客户端的数量\");\n\t\tmap.put(\"used_memory\", \"由 Redis 分配器分配的内存总量，以字节（byte）为单位\");\n\t\tmap.put(\"used_memory_human\", \"以人类可读的格式返回 Redis 分配的内存总量\");\n\t\tmap.put(\"used_memory_rss\", \"从操作系统的角度，返回 Redis 已分配的内存总量（俗称常驻集大小）。这个值和 top 、 ps 等命令的输出一致\");\n\t\tmap.put(\"used_memory_peak\", \" Redis 的内存消耗峰值(以字节为单位)\");\n\t\tmap.put(\"used_memory_peak_human\", \"以人类可读的格式返回 Redis 的内存消耗峰值\");\n\t\tmap.put(\"used_memory_lua\", \"Lua 引擎所使用的内存大小（以字节为单位）\");\n\t\tmap.put(\"mem_fragmentation_ratio\", \"sed_memory_rss 和 used_memory 之间的比率\");\n\t\tmap.put(\"mem_allocator\", \"在编译时指定的， Redis 所使用的内存分配器。可以是 libc 、 jemalloc 或者 tcmalloc\");\n\n\t\tmap.put(\"redis_build_id\", \"redis_build_id\");\n\t\tmap.put(\"redis_mode\", \"运行模式，单机（standalone）或者集群（cluster）\");\n\t\tmap.put(\"atomicvar_api\", \"atomicvar_api\");\n\t\tmap.put(\"hz\", \"redis内部调度（进行关闭timeout的客户端，删除过期key等等）频率，程序规定serverCron每秒运行10次。\");\n\t\tmap.put(\"executable\", \"server脚本目录\");\n\t\tmap.put(\"config_file\", \"配置文件目录\");\n\t\tmap.put(\"client_biggest_input_buf\", \"当前连接的客户端当中，最大输入缓存，用client list命令观察qbuf和qbuf-free两个字段最大值\");\n\t\tmap.put(\"used_memory_rss_human\", \"以人类可读的方式返回 Redis 已分配的内存总量\");\n\t\tmap.put(\"used_memory_peak_perc\", \"内存使用率峰值\");\n\t\tmap.put(\"total_system_memory\", \"系统总内存\");\n\t\tmap.put(\"total_system_memory_human\", \"以人类可读的方式返回系统总内存\");\n\t\tmap.put(\"used_memory_lua_human\", \"以人类可读的方式返回Lua 引擎所使用的内存大小\");\n\t\tmap.put(\"maxmemory\", \"最大内存限制，0表示无限制\");\n\t\tmap.put(\"maxmemory_human\", \"以人类可读的方式返回最大限制内存\");\n\t\tmap.put(\"maxmemory_policy\", \"超过内存限制后的处理策略\");\n\t\tmap.put(\"loading\", \"服务器是否正在载入持久化文件\");\n\t\tmap.put(\"rdb_changes_since_last_save\", \"离最近一次成功生成rdb文件，写入命令的个数，即有多少个写入命令没有持久化\");\n\t\tmap.put(\"rdb_bgsave_in_progress\", \"服务器是否正在创建rdb文件\");\n\t\tmap.put(\"rdb_last_save_time\", \"离最近一次成功创建rdb文件的时间戳。当前时间戳 - rdb_last_save_time=多少秒未成功生成rdb文件\");\n\t\tmap.put(\"rdb_last_bgsave_status\", \"最近一次rdb持久化是否成功\");\n\t\tmap.put(\"rdb_last_bgsave_time_sec\", \"最近一次成功生成rdb文件耗时秒数\");\n\t\tmap.put(\"rdb_current_bgsave_time_sec\", \"如果服务器正在创建rdb文件，那么这个域记录的就是当前的创建操作已经耗费的秒数\");\n\t\tmap.put(\"aof_enabled\", \"是否开启了aof\");\n\t\tmap.put(\"aof_rewrite_in_progress\", \"标识aof的rewrite操作是否在进行中\");\n\t\tmap.put(\"aof_rewrite_scheduled\", \"rewrite任务计划，当客户端发送bgrewriteaof指令，如果当前rewrite子进程正在执行，那么将客户端请求的bgrewriteaof变为计划任务，待aof子进程结束后执行rewrite \");\n\n\t\tmap.put(\"aof_last_rewrite_time_sec\", \"最近一次aof rewrite耗费的时长\");\n\t\tmap.put(\"aof_current_rewrite_time_sec\", \"如果rewrite操作正在进行，则记录所使用的时间，单位秒\");\n\t\tmap.put(\"aof_last_bgrewrite_status\", \"上次bgrewrite aof操作的状态\");\n\t\tmap.put(\"aof_last_write_status\", \"上次aof写入状态\");\n\n\t\tmap.put(\"total_commands_processed\", \"redis处理的命令数\");\n\t\tmap.put(\"total_connections_received\", \"新创建连接个数,如果新创建连接过多，过度地创建和销毁连接对性能有影响，说明短连接严重或连接池使用有问题，需调研代码的连接设置\");\n\t\tmap.put(\"instantaneous_ops_per_sec\", \"redis当前的qps，redis内部较实时的每秒执行的命令数\");\n\t\tmap.put(\"total_net_input_bytes\", \"redis网络入口流量字节数\");\n\t\tmap.put(\"total_net_output_bytes\", \"redis网络出口流量字节数\");\n\n\t\tmap.put(\"instantaneous_input_kbps\", \"redis网络入口kps\");\n\t\tmap.put(\"instantaneous_output_kbps\", \"redis网络出口kps\");\n\t\tmap.put(\"rejected_connections\", \"拒绝的连接个数，redis连接个数达到maxclients限制，拒绝新连接的个数\");\n\t\tmap.put(\"sync_full\", \"主从完全同步成功次数\");\n\n\t\tmap.put(\"sync_partial_ok\", \"主从部分同步成功次数\");\n\t\tmap.put(\"sync_partial_err\", \"主从部分同步失败次数\");\n\t\tmap.put(\"expired_keys\", \"运行以来过期的key的数量\");\n\t\tmap.put(\"evicted_keys\", \"运行以来剔除(超过了maxmemory后)的key的数量\");\n\t\tmap.put(\"keyspace_hits\", \"命中次数\");\n\t\tmap.put(\"keyspace_misses\", \"没命中次数\");\n\t\tmap.put(\"pubsub_channels\", \"当前使用中的频道数量\");\n\t\tmap.put(\"pubsub_patterns\", \"当前使用的模式的数量\");\n\t\tmap.put(\"latest_fork_usec\", \"最近一次fork操作阻塞redis进程的耗时数，单位微秒\");\n\t\tmap.put(\"role\", \"实例的角色，是master or slave\");\n\t\tmap.put(\"connected_slaves\", \"连接的slave实例个数\");\n\t\tmap.put(\"master_repl_offset\", \"主从同步偏移量,此值如果和上面的offset相同说明主从一致没延迟\");\n\t\tmap.put(\"repl_backlog_active\", \"复制积压缓冲区是否开启\");\n\t\tmap.put(\"repl_backlog_size\", \"复制积压缓冲大小\");\n\t\tmap.put(\"repl_backlog_first_byte_offset\", \"复制缓冲区里偏移量的大小\");\n\t\tmap.put(\"repl_backlog_histlen\", \"此值等于 master_repl_offset - repl_backlog_first_byte_offset,该值不会超过repl_backlog_size的大小\");\n\t\tmap.put(\"used_cpu_sys\", \"将所有redis主进程在核心态所占用的CPU时求和累计起来\");\n\t\tmap.put(\"used_cpu_user\", \"将所有redis主进程在用户态所占用的CPU时求和累计起来\");\n\t\tmap.put(\"used_cpu_sys_children\", \"将后台进程在核心态所占用的CPU时求和累计起来\");\n\t\tmap.put(\"used_cpu_user_children\", \"将后台进程在用户态所占用的CPU时求和累计起来\");\n\t\tmap.put(\"cluster_enabled\", \"实例是否启用集群模式\");\n\t\tmap.put(\"db0\", \"db0的key的数量,以及带有生存期的key的数,平均存活时间\");\n\n\t}\n\n\tprivate String key;\n\tprivate String value;\n\tprivate String description;\n\n\tpublic String getKey() {\n\t\treturn key;\n\t}\n\n\tpublic void setKey(String key) {\n\t\tthis.key = key;\n\t\tthis.description = map.get(this.key);\n\t}\n\n\tpublic String getValue() {\n\t\treturn value;\n\t}\n\n\tpublic void setValue(String value) {\n\t\tthis.value = value;\n\t}\n\n\tpublic String getDescription() {\n\t\treturn description;\n\t}\n\n\tpublic void setDescription(String description) {\n\t\tthis.description = description;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"RedisInfo{\" + \"key='\" + key + '\\'' + \", value='\" + value + '\\'' + \", desctiption='\" + description + '\\'' + '}';\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/exception/RedisConnectException.java",
    "content": "package org.jeecg.modules.monitor.exception;\n\n/**\n * Redis 连接异常\n * @author: jeecg-boot\n */\npublic class RedisConnectException extends Exception {\n\n    private static final long serialVersionUID = 1639374111871115063L;\n\n    public RedisConnectException(String message) {\n        super(message);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/RedisService.java",
    "content": "package org.jeecg.modules.monitor.service;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\n\nimport com.alibaba.fastjson.JSONArray;\nimport org.jeecg.modules.monitor.domain.RedisInfo;\nimport org.jeecg.modules.monitor.exception.RedisConnectException;\n\n/**\n * @Description: redis信息service接口\n * @author: jeecg-boot\n */\npublic interface RedisService {\n\n\t/**\n\t * 获取 redis 的详细信息\n\t *\n\t * @return List\n     * @throws RedisConnectException\n\t */\n\tList<RedisInfo> getRedisInfo() throws RedisConnectException;\n\n\t/**\n\t * 获取 redis key 数量\n\t *\n\t * @return Map\n     * @throws RedisConnectException\n\t */\n\tMap<String, Object> getKeysSize() throws RedisConnectException;\n\n\t/**\n\t * 获取 redis 内存信息\n\t *\n\t * @return Map\n     * @throws RedisConnectException\n\t */\n\tMap<String, Object> getMemoryInfo() throws RedisConnectException;\n\t/**\n\t * 获取 报表需要个redis信息\n\t * @param type\n\t * @return Map\n     * @throws RedisConnectException\n\t */\n\tMap<String, JSONArray> getMapForReport(String type) throws RedisConnectException ;\n\n\t/**\n\t * 获取历史性能指标\n\t * @return\n\t * @author chenrui\n\t * @date 2024/5/14 14:57\n\t */\n\tMap<String, List<Map<String, Object>>> getMetricsHistory();\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/MailHealthIndicator.java",
    "content": "package org.jeecg.modules.monitor.service.impl;\n\nimport org.springframework.boot.actuate.health.Health;\nimport org.springframework.boot.actuate.health.HealthIndicator;\nimport org.springframework.stereotype.Component;\n\n/**\n * 功能说明:自定义邮件检测\n *\n * @author: 李波\n * @email: 503378406@qq.com\n * @date: 2019-06-29\n */\n@Component\npublic class MailHealthIndicator implements HealthIndicator {\n\n\n    @Override public Health health() {\n        int errorCode = check();\n        if (errorCode != 0) {\n            return Health.down().withDetail(\"Error Code\", errorCode) .build();\n        }\n        return Health.up().build();\n    }\n    int check(){\n        //可以实现自定义的数据库检测逻辑\n        return 0;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/RedisServiceImpl.java",
    "content": "package org.jeecg.modules.monitor.service.impl;\n\nimport java.util.*;\n\nimport jakarta.annotation.Resource;\n\nimport cn.hutool.core.date.DateUtil;\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.google.common.collect.Maps;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.monitor.domain.RedisInfo;\nimport org.jeecg.modules.monitor.exception.RedisConnectException;\nimport org.jeecg.modules.monitor.service.RedisService;\nimport org.springframework.cglib.beans.BeanMap;\nimport org.springframework.data.redis.connection.RedisConnectionFactory;\nimport org.springframework.scheduling.annotation.Scheduled;\nimport org.springframework.stereotype.Service;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * Redis 监控信息获取\n *\n * @Author MrBird\n */\n@Service(\"redisService\")\n@Slf4j\npublic class RedisServiceImpl implements RedisService {\n\n\t@Resource\n\tprivate RedisConnectionFactory redisConnectionFactory;\n\n    /**\n     * redis信息\n     */\n    private static final String REDIS_MESSAGE = \"3\";\n\n\t/**\n\t * redis性能信息记录\n\t */\n\tprivate static final Map<String,List<Map<String, Object>>> REDIS_METRICS = new HashMap<>(2);\n\n\t/**\n\t * Redis详细信息\n\t */\n\t@Override\n\tpublic List<RedisInfo> getRedisInfo() throws RedisConnectException {\n\t\tProperties info = redisConnectionFactory.getConnection().info();\n\t\tList<RedisInfo> infoList = new ArrayList<>();\n\t\tRedisInfo redisInfo = null;\n\t\tfor (Map.Entry<Object, Object> entry : info.entrySet()) {\n\t\t\tredisInfo = new RedisInfo();\n\t\t\tredisInfo.setKey(oConvertUtils.getString(entry.getKey()));\n\t\t\tredisInfo.setValue(oConvertUtils.getString(entry.getValue()));\n\t\t\tinfoList.add(redisInfo);\n\t\t}\n\t\treturn infoList;\n\t}\n\n\t@Override\n\tpublic Map<String, Object> getKeysSize() throws RedisConnectException {\n\t\tLong dbSize = redisConnectionFactory.getConnection().dbSize();\n\t\tMap<String, Object> map = new HashMap(5);\n\t\tmap.put(\"create_time\", System.currentTimeMillis());\n\t\tmap.put(\"dbSize\", dbSize);\n\n\t\tlog.debug(\"--getKeysSize--: \" + map.toString());\n\t\treturn map;\n\t}\n\n\t@Override\n\tpublic Map<String, Object> getMemoryInfo() throws RedisConnectException {\n\t\tMap<String, Object> map = null;\n\t\tProperties info = redisConnectionFactory.getConnection().info();\n\t\tfor (Map.Entry<Object, Object> entry : info.entrySet()) {\n\t\t\tString key = oConvertUtils.getString(entry.getKey());\n\t\t\tif (\"used_memory\".equals(key)) {\n\t\t\t\tmap = new HashMap(5);\n\t\t\t\tmap.put(\"used_memory\", entry.getValue());\n\t\t\t\tmap.put(\"create_time\", System.currentTimeMillis());\n\t\t\t}\n\t\t}\n\t\tlog.debug(\"--getMemoryInfo--: \" + map.toString());\n\t\treturn map;\n\t}\n\n    /**\n     * 查询redis信息for报表\n     * @param type 1redis key数量 2 占用内存 3redis信息\n     * @return\n     * @throws RedisConnectException\n     */\n\t@Override\n\tpublic Map<String, JSONArray> getMapForReport(String type)  throws RedisConnectException {\n\t\tMap<String,JSONArray> mapJson=new HashMap(5);\n\t\tJSONArray json = new JSONArray();\n\t\tif(REDIS_MESSAGE.equals(type)){\n\t\t\tList<RedisInfo> redisInfo = getRedisInfo();\n\t\t\tfor(RedisInfo info:redisInfo){\n\t\t\t\tMap<String, Object> map= Maps.newHashMap();\n\t\t\t\tBeanMap beanMap = BeanMap.create(info);\n\t\t\t\tfor (Object key : beanMap.keySet()) {\n\t\t\t\t\tmap.put(key+\"\", beanMap.get(key));\n\t\t\t\t}\n\t\t\t\tjson.add(map);\n\t\t\t}\n\t\t\tmapJson.put(\"data\",json);\n\t\t\treturn mapJson;\n\t\t}\n\t\tint length = 5;\n\t\tfor(int i = 0; i < length; i++){\n\t\t\tJSONObject jo = new JSONObject();\n\t\t\tMap<String, Object> map;\n\t\t\tif(\"1\".equals(type)){\n\t\t\t\tmap= getKeysSize();\n\t\t\t\tjo.put(\"value\",map.get(\"dbSize\"));\n\t\t\t}else{\n\t\t\t\tmap = getMemoryInfo();\n\t\t\t\tInteger usedMemory = Integer.valueOf(map.get(\"used_memory\").toString());\n\t\t\t\tjo.put(\"value\",usedMemory/1000);\n\t\t\t}\n\t\t\tString createTime = DateUtil.formatTime(DateUtil.date((Long) map.get(\"create_time\")-(4-i)*1000));\n\t\t\tjo.put(\"name\",createTime);\n\t\t\tjson.add(jo);\n\t\t}\n\t\tmapJson.put(\"data\",json);\n\t\treturn mapJson;\n\t}\n\n\t/**\n\t * 获取历史性能指标\n\t * @return\n\t * @author chenrui\n\t * @date 2024/5/14 14:57\n\t */\n\t@Override\n\tpublic Map<String, List<Map<String, Object>>> getMetricsHistory() {\n\t\treturn REDIS_METRICS;\n\t}\n\n\t/**\n\t * 记录近一小时redis监控数据 <br/>\n\t * 60s一次,,记录存储keysize和内存\n\t * @throws RedisConnectException\n\t * @author chenrui\n\t * @date 2024/5/14 14:09\n\t */\n\t@Scheduled(fixedRate = 60000)\n\tpublic void recordCustomMetric() throws RedisConnectException {\n\t\tList<Map<String, Object>> list= new ArrayList<>();\n\t\tif(REDIS_METRICS.containsKey(\"dbSize\")){\n\t\t\tlist = REDIS_METRICS.get(\"dbSize\");\n\t\t}else{\n\t\t\tREDIS_METRICS.put(\"dbSize\",list);\n\t\t}\n\t\tif(list.size()>60){\n\t\t\tlist.remove(0);\n\t\t}\n\t\tlist.add(getKeysSize());\n\t\tlist= new ArrayList<>();\n\t\tif(REDIS_METRICS.containsKey(\"memory\")){\n\t\t\tlist = REDIS_METRICS.get(\"memory\");\n\t\t}else{\n\t\t\tREDIS_METRICS.put(\"memory\",list);\n\t\t}\n\t\tif(list.size()>60){\n\t\t\tlist.remove(0);\n\t\t}\n\t\tlist.add(getMemoryInfo());\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ngalain/aop/LogRecordAspect.java",
    "content": "//package org.jeecg.modules.ngalain.aop;\n//\n//import jakarta.servlet.http.HttpServletRequest;\n//\n//import org.aspectj.lang.ProceedingJoinPoint;\n//import org.aspectj.lang.annotation.Around;\n//import org.aspectj.lang.annotation.Aspect;\n//import org.aspectj.lang.annotation.Pointcut;\n//import org.springframework.context.annotation.Configuration;\n//import org.springframework.web.context.request.RequestAttributes;\n//import org.springframework.web.context.request.RequestContextHolder;\n//import org.springframework.web.context.request.ServletRequestAttributes;\n//import org.slf4j.Logger;\n//import org.slf4j.LoggerFactory;;\n//\n//\n//// 暂时注释掉，提高系统性能\n////@Aspect   //定义一个切面\n////@Configuration\n//public class LogRecordAspect {\n//private static final Logger logger = LoggerFactory.getLogger(LogRecordAspect.class);\n//\n//    // 定义切点Pointcut\n//    @Pointcut(\"execution(public * org.jeecg.modules.*.*.*Controller.*(..))\")\n//    public void excudeService() {\n//    }\n//\n//    @Around(\"excudeService()\")\n//    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {\n//        RequestAttributes ra = RequestContextHolder.getRequestAttributes();\n//        ServletRequestAttributes sra = (ServletRequestAttributes) ra;\n//        HttpServletRequest request = sra.getRequest();\n//\n//        String url = request.getRequestURL().toString();\n//        String method = request.getMethod();\n//        String uri = request.getRequestURI();\n//        String queryString = request.getQueryString();\n//        logger.info(\"请求开始, 各个参数, url: {}, method: {}, uri: {}, params: {}\", url, method, uri, queryString);\n//\n//        // result的值就是被拦截方法的返回值\n//        Object result = pjp.proceed();\n//\n//        logger.info(\"请求结束，controller的返回值是 \" + result);\n//        return result;\n//    }\n//}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ngalain/controller/NgAlainController.java",
    "content": "//package org.jeecg.modules.ngalain.controller;\n//\n//import java.util.ArrayList;\n//import java.util.List;\n//import java.util.Map;\n//\n//import jakarta.servlet.http.HttpServletRequest;\n//\n//import org.apache.shiro.SecurityUtils;\n//import org.jeecg.common.api.vo.Result;\n//import org.jeecg.common.system.vo.DictModel;\n//import org.jeecg.common.system.vo.LoginUser;\n//import org.jeecg.modules.ngalain.service.NgAlainService;\n//import org.jeecg.modules.system.service.ISysDictService;\n//import org.springframework.beans.factory.annotation.Autowired;\n//import org.springframework.web.bind.annotation.PathVariable;\n//import org.springframework.web.bind.annotation.RequestMapping;\n//import org.springframework.web.bind.annotation.RequestMethod;\n//import org.springframework.web.bind.annotation.ResponseBody;\n//import org.springframework.web.bind.annotation.RestController;\n//\n//import com.alibaba.fastjson.JSONObject;\n//\n//import lombok.extern.slf4j.Slf4j;\n//\n//@Slf4j\n//@RestController\n//@RequestMapping(\"/sys/ng-alain\")\n//public class NgAlainController {\n//    @Autowired\n//    private NgAlainService ngAlainService;\n//    @Autowired\n//    private ISysDictService sysDictService;\n//\n//    @RequestMapping(value = \"/getAppData\")\n//    @ResponseBody\n//    public JSONObject getAppData(HttpServletRequest request) throws Exception {\n//       String token=request.getHeader(\"X-Access-Token\");\n//        JSONObject j = new JSONObject();\n//        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n//        JSONObject userObjcet = new JSONObject();\n//        userObjcet.put(\"name\", user.getUsername());\n//        userObjcet.put(\"avatar\", user.getAvatar());\n//        userObjcet.put(\"email\", user.getEmail());\n//        userObjcet.put(\"token\", token);\n//        j.put(\"user\", userObjcet);\n//        j.put(\"menu\",ngAlainService.getMenu(user.getUsername()));\n//        JSONObject app = new JSONObject();\n//        app.put(\"name\", \"jeecg-boot-angular\");\n//        app.put(\"description\", \"jeecg+ng-alain整合版本\");\n//        j.put(\"app\", app);\n//        return j;\n//    }\n//\n//    @RequestMapping(value = \"/getDictItems/{dictCode}\", method = RequestMethod.GET)\n//    public Object getDictItems(@PathVariable String dictCode) {\n//        log.info(\" dictCode : \"+ dictCode);\n//        Result<List<DictModel>> result = new Result<List<DictModel>>();\n//        List<DictModel> ls = null;\n//        try {\n//            ls = sysDictService.queryDictItemsByCode(dictCode);\n//            result.setSuccess(true);\n//            result.setResult(ls);\n//        } catch (Exception e) {\n//            log.error(e.getMessage(),e);\n//            result.error500(\"操作失败\");\n//            return result;\n//        }\n//        List<JSONObject> dictlist=new ArrayList<>();\n//        for (DictModel l : ls) {\n//            JSONObject dict=new JSONObject();\n//                try {\n//                    dict.put(\"value\",Integer.parseInt(l.getValue()));\n//                } catch (NumberFormatException e) {\n//                    dict.put(\"value\",l.getValue());\n//                }\n//            dict.put(\"label\",l.getText());\n//            dictlist.add(dict);\n//        }\n//        return dictlist;\n//    }\n//    @RequestMapping(value = \"/getDictItemsByTable/{table}/{key}/{value}\", method = RequestMethod.GET)\n//    public Object getDictItemsByTable(@PathVariable String table,@PathVariable String key,@PathVariable String value) {\n//        return this.ngAlainService.getDictByTable(table,key,value);\n//    }\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ngalain/service/NgAlainService.java",
    "content": "//package org.jeecg.modules.ngalain.service;\n//\n//import com.alibaba.fastjson.JSONArray;\n//\n//import java.util.List;\n//import java.util.Map;\n//\n///**\n// * @Description: NgAlainService接口\n// * @author: jeecg-boot\n// */\n//public interface NgAlainService {\n//    /**\n//     * 菜单\n//     * @param id\n//     * @return JSONArray\n//     * @throws Exception\n//     */\n//    public JSONArray getMenu(String id) throws Exception;\n//\n//    /**\n//     * jeecg菜单\n//     * @param id\n//     * @return JSONArray\n//     * @throws Exception\n//     */\n//    public JSONArray getJeecgMenu(String id) throws Exception;\n//\n//    /**\n//     * 获取字典值\n//     * @param table\n//     * @param key\n//     * @param value\n//     * @return List<Map<String, String>>\n//     */\n//    public List<Map<String, String>> getDictByTable(String table, String key, String value);\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/ngalain/service/impl/NgAlainServiceImpl.java",
    "content": "//package org.jeecg.modules.ngalain.service.impl;\n//\n//import com.alibaba.fastjson.JSONArray;\n//import com.alibaba.fastjson.JSONObject;\n//import org.jeecg.common.constant.CommonConstant;\n//import org.jeecg.common.constant.SymbolConstant;\n//import org.jeecg.common.util.oConvertUtils;\n//import org.jeecg.modules.ngalain.service.NgAlainService;\n//import org.jeecg.modules.system.entity.SysPermission;\n//import org.jeecg.modules.system.mapper.SysDictMapper;\n//import org.jeecg.modules.system.service.ISysPermissionService;\n//import org.springframework.beans.factory.annotation.Autowired;\n//import org.springframework.stereotype.Service;\n//import org.springframework.transaction.annotation.Transactional;\n//\n//import java.util.Base64;\n//import java.util.List;\n//import java.util.Map;\n//\n///**\n// * @Description: NgAlainServiceImpl 实现类\n// * @author: jeecg-boot\n// */\n//@Service(\"ngAlainService\")\n//public class NgAlainServiceImpl implements NgAlainService {\n//    @Autowired\n//    private ISysPermissionService sysPermissionService;\n//    @Autowired\n//    private SysDictMapper mapper;\n//    @Override\n//    public JSONArray getMenu(String id) throws Exception {\n//        return getJeecgMenu(id);\n//    }\n//    @Override\n//    public JSONArray getJeecgMenu(String id) throws Exception {\n//        List<SysPermission> metaList = sysPermissionService.queryByUser(id);\n//        JSONArray jsonArray = new JSONArray();\n//        getPermissionJsonArray(jsonArray, metaList, null);\n//        JSONArray menulist= parseNgAlain(jsonArray);\n//        JSONObject jeecgMenu = new JSONObject();\n//        jeecgMenu.put(\"text\", \"jeecg菜单\");\n//        jeecgMenu.put(\"group\",true);\n//        jeecgMenu.put(\"children\", menulist);\n//        JSONArray jeecgMenuList=new JSONArray();\n//        jeecgMenuList.add(jeecgMenu);\n//        return jeecgMenuList;\n//    }\n//\n//    @Override\n//    public List<Map<String, String>> getDictByTable(String table, String key, String value) {\n//        return this.mapper.getDictByTableNgAlain(table,key,value);\n//    }\n//\n//    private JSONArray parseNgAlain(JSONArray jsonArray) {\n//        JSONArray menulist=new JSONArray();\n//        for (Object object : jsonArray) {\n//            JSONObject jsonObject= (JSONObject) object;\n//            String path= (String) jsonObject.get(\"path\");\n//            JSONObject meta= (JSONObject) jsonObject.get(\"meta\");\n//            JSONObject menu=new JSONObject();\n//            menu.put(\"text\",meta.get(\"title\"));\n//            menu.put(\"reuse\",true);\n//            if (jsonObject.get(\"children\")!=null){\n//                JSONArray child=  parseNgAlain((JSONArray) jsonObject.get(\"children\"));\n//                menu.put(\"children\",child);\n//                JSONObject icon=new JSONObject();\n//                icon.put(\"type\", \"icon\");\n//                icon.put(\"value\", meta.get(\"icon\"));\n//                menu.put(\"icon\",icon);\n//            }else {\n//                menu.put(\"link\",path);\n//            }\n//            menulist.add(menu);\n//        }\n//        return menulist;\n//    }\n//\n//    /**\n//     *  获取菜单JSON数组\n//     * @param jsonArray\n//     * @param metaList\n//     * @param parentJson\n//     */\n//    private void getPermissionJsonArray(JSONArray jsonArray,List<SysPermission> metaList,JSONObject parentJson) {\n//        for (SysPermission permission : metaList) {\n//            if(permission.getMenuType()==null) {\n//                continue;\n//            }\n//            String tempPid = permission.getParentId();\n//            JSONObject json = getPermissionJsonObject(permission);\n//            if(parentJson==null && oConvertUtils.isEmpty(tempPid)) {\n//                jsonArray.add(json);\n//                if(!permission.isLeaf()) {\n//                    getPermissionJsonArray(jsonArray, metaList, json);\n//                }\n//            }else if(parentJson!=null && oConvertUtils.isNotEmpty(tempPid) && tempPid.equals(parentJson.getString(\"id\"))){\n//                if(permission.getMenuType()==0) {\n//                    JSONObject metaJson = parentJson.getJSONObject(\"meta\");\n//                    if(metaJson.containsKey(\"permissionList\")) {\n//                        metaJson.getJSONArray(\"permissionList\").add(json);\n//                    }else {\n//                        JSONArray permissionList = new JSONArray();\n//                        permissionList.add(json);\n//                        metaJson.put(\"permissionList\", permissionList);\n//                    }\n//\n//                }else if(permission.getMenuType()==1) {\n//                    if(parentJson.containsKey(\"children\")) {\n//                        parentJson.getJSONArray(\"children\").add(json);\n//                    }else {\n//                        JSONArray children = new JSONArray();\n//                        children.add(json);\n//                        parentJson.put(\"children\", children);\n//                    }\n//\n//                    if(!permission.isLeaf()) {\n//                        getPermissionJsonArray(jsonArray, metaList, json);\n//                    }\n//                }\n//            }\n//\n//\n//        }\n//    }\n//    private JSONObject getPermissionJsonObject(SysPermission permission) {\n//        JSONObject json = new JSONObject();\n//        //类型(0：一级菜单 1：子菜单  2：按钮)\n//        if(CommonConstant.MENU_TYPE_2.equals(permission.getMenuType())) {\n//            json.put(\"action\", permission.getPerms());\n//            json.put(\"describe\", permission.getName());\n//        }else if(CommonConstant.MENU_TYPE_0.equals(permission.getMenuType()) || CommonConstant.MENU_TYPE_1.equals(permission.getMenuType())) {\n//            json.put(\"id\", permission.getId());\n//            boolean flag = permission.getUrl()!=null&&(permission.getUrl().startsWith(CommonConstant.HTTP_PROTOCOL)||permission.getUrl().startsWith(CommonConstant.HTTPS_PROTOCOL));\n//            if(flag) {\n//                String url= new String(Base64.getUrlEncoder().encode(permission.getUrl().getBytes()));\n//                json.put(\"path\", \"/sys/link/\" +url.replaceAll(\"=\",\"\"));\n//            }else {\n//                json.put(\"path\", permission.getUrl());\n//            }\n//\n//            //重要规则：路由name (通过URL生成路由name,路由name供前端开发，页面跳转使用)\n//            json.put(\"name\", urlToRouteName(permission.getUrl()));\n//\n//            //是否隐藏路由，默认都是显示的\n//            if(permission.isHidden()) {\n//                json.put(\"hidden\",true);\n//            }\n//            //聚合路由\n//            if(permission.isAlwaysShow()) {\n//                json.put(\"alwaysShow\",true);\n//            }\n//            json.put(\"component\", permission.getComponent());\n//            JSONObject meta = new JSONObject();\n//            meta.put(\"title\", permission.getName());\n//            if(oConvertUtils.isEmpty(permission.getParentId())) {\n//                //一级菜单跳转地址\n//                json.put(\"redirect\",permission.getRedirect());\n//                meta.put(\"icon\", oConvertUtils.getString(permission.getIcon(), \"\"));\n//            }else {\n//                meta.put(\"icon\", oConvertUtils.getString(permission.getIcon(), \"\"));\n//            }\n//            if(flag) {\n//                meta.put(\"url\", permission.getUrl());\n//            }\n//            json.put(\"meta\", meta);\n//        }\n//\n//        return json;\n//    }\n//    /**\n//     * 通过URL生成路由name（去掉URL前缀斜杠，替换内容中的斜杠‘/’为-）\n//     * 举例： URL = /isystem/role\n//     *     RouteName = isystem-role\n//     * @return\n//     */\n//    private String urlToRouteName(String url) {\n//        if(oConvertUtils.isNotEmpty(url)) {\n//            if(url.startsWith(SymbolConstant.SINGLE_SLASH)) {\n//                url = url.substring(1);\n//            }\n//            url = url.replace(\"/\", \"-\");\n//            return url;\n//        }else {\n//            return null;\n//        }\n//    }\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/controller/OpenApiAuthController.java",
    "content": "package org.jeecg.modules.openapi.controller;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.modules.openapi.entity.OpenApiAuth;\nimport org.jeecg.modules.openapi.generator.AKSKGenerator;\nimport org.jeecg.modules.openapi.service.OpenApiAuthService;\nimport org.springframework.web.bind.annotation.*;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.util.Arrays;\n\n/**\n * @date 2024/12/10 9:54\n */\n@RestController\n@RequestMapping(\"/openapi/auth\")\npublic class OpenApiAuthController extends JeecgController<OpenApiAuth, OpenApiAuthService> {\n    \n    /**\n     * 分页列表查询\n     *\n     * @param openApiAuth\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @GetMapping(value = \"/list\")\n    public Result<?> queryPageList(OpenApiAuth openApiAuth, @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                   @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize, HttpServletRequest req) {\n        QueryWrapper<OpenApiAuth> queryWrapper = QueryGenerator.initQueryWrapper(openApiAuth, req.getParameterMap());\n        Page<OpenApiAuth> page = new Page<>(pageNo, pageSize);\n        IPage<OpenApiAuth> pageList = service.page(page, queryWrapper);\n        return Result.ok(pageList);\n    }\n\n    /**\n     * 添加\n     *\n     * @param openApiAuth\n     * @return\n     */\n    @PostMapping(value = \"/add\")\n    public Result<?> add(@RequestBody OpenApiAuth openApiAuth) {\n        service.save(openApiAuth);\n        return Result.ok(\"添加成功！\");\n    }\n\n    /**\n     * 编辑\n     *\n     * @param openApiAuth\n     * @return\n     */\n    @PutMapping(value = \"/edit\")\n    public Result<?> edit(@RequestBody OpenApiAuth openApiAuth) {\n        service.updateById(openApiAuth);\n        return Result.ok(\"修改成功!\");\n\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @DeleteMapping(value = \"/delete\")\n    public Result<?> delete(@RequestParam(name = \"id\", required = true) String id) {\n        service.removeById(id);\n        return Result.ok(\"删除成功!\");\n    }\n\n    /**\n     * 批量删除\n     *\n     * @param ids\n     * @return\n     */\n    @DeleteMapping(value = \"/deleteBatch\")\n    public Result<?> deleteBatch(@RequestParam(name = \"ids\", required = true) String ids) {\n\n        this.service.removeByIds(Arrays.asList(ids.split(\",\")));\n        return Result.ok(\"批量删除成功！\");\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    @GetMapping(value = \"/queryById\")\n    public Result<?> queryById(@RequestParam(name = \"id\", required = true) String id) {\n        OpenApiAuth openApiAuth = service.getById(id);\n        return Result.ok(openApiAuth);\n    }\n\n    /**\n     * 生成AKSK\n     * @return\n     */\n    @GetMapping(\"genAKSK\")\n    public Result<String[]> genAKSK() {\n        return Result.ok(AKSKGenerator.genAKSKPair());\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/controller/OpenApiController.java",
    "content": "package org.jeecg.modules.openapi.controller;\n\nimport cn.hutool.core.util.StrUtil;\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.google.common.collect.Lists;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.util.RedisUtil;\nimport org.jeecg.common.util.RestUtil;\nimport org.jeecg.modules.openapi.entity.OpenApi;\nimport org.jeecg.modules.openapi.entity.OpenApiAuth;\nimport org.jeecg.modules.openapi.entity.OpenApiHeader;\nimport org.jeecg.modules.openapi.entity.OpenApiParam;\nimport org.jeecg.modules.openapi.generator.PathGenerator;\nimport org.jeecg.modules.openapi.service.OpenApiAuthService;\nimport org.jeecg.modules.openapi.service.OpenApiService;\nimport org.jeecg.modules.openapi.swagger.*;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.service.ISysUserService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.HttpEntity;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.http.HttpMethod;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.client.RestTemplate;\nimport org.springframework.web.util.UriComponentsBuilder;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.net.URI;\nimport java.util.*;\nimport java.util.stream.Collectors;\n\n/**\n * @date 2024/12/10 9:11\n */\n@RestController\n@RequestMapping(\"/openapi\")\npublic class OpenApiController extends JeecgController<OpenApi, OpenApiService> {\n\n    @Autowired\n    private RestTemplate restTemplate;\n    @Autowired\n    private RedisUtil redisUtil;\n    @Autowired\n    private ISysUserService sysUserService;\n    @Autowired\n    private OpenApiAuthService openApiAuthService;\n\n    /**\n     * 分页列表查询\n     *\n     * @param openApi\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @GetMapping(value = \"/list\")\n    public Result<?> queryPageList(OpenApi openApi, @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                   @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize, HttpServletRequest req) {\n        QueryWrapper<OpenApi> queryWrapper = QueryGenerator.initQueryWrapper(openApi, req.getParameterMap());\n        Page<OpenApi> page = new Page<>(pageNo, pageSize);\n        IPage<OpenApi> pageList = service.page(page, queryWrapper);\n        return Result.ok(pageList);\n    }\n\n    /**\n     * 添加\n     *\n     * @param openApi\n     * @return\n     */\n    @PostMapping(value = \"/add\")\n    public Result<?> add(@RequestBody OpenApi openApi) {\n        service.save(openApi);\n        return Result.ok(\"添加成功！\");\n    }\n\n    /**\n     * 编辑\n     *\n     * @param openApi\n     * @return\n     */\n    @PutMapping(value = \"/edit\")\n    public Result<?> edit(@RequestBody OpenApi openApi) {\n        service.updateById(openApi);\n        return Result.ok(\"修改成功!\");\n\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @DeleteMapping(value = \"/delete\")\n    public Result<?> delete(@RequestParam(name = \"id\", required = true) String id) {\n        service.removeById(id);\n        return Result.ok(\"删除成功!\");\n    }\n\n    /**\n     * 批量删除\n     *\n     * @param ids\n     * @return\n     */\n    @DeleteMapping(value = \"/deleteBatch\")\n    public Result<?> deleteBatch(@RequestParam(name = \"ids\", required = true) String ids) {\n\n        this.service.removeByIds(Arrays.asList(ids.split(\",\")));\n        return Result.ok(\"批量删除成功！\");\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    @GetMapping(value = \"/queryById\")\n    public Result<?> queryById(@RequestParam(name = \"id\", required = true) String id) {\n        OpenApi OpenApi = service.getById(id);\n        return Result.ok(OpenApi);\n    }\n\n    /**\n     * 接口调用\n     * @param path\n     * @return\n     */\n    @RequestMapping(value = \"/call/{path}\", method = {RequestMethod.GET,RequestMethod.POST})\n    public Result<?> call(@PathVariable String path, @RequestBody(required = false) String json, HttpServletRequest request) {\n        OpenApi openApi = service.findByPath(path);\n        if (Objects.isNull(openApi)) {\n            Map<String, Object> result = new HashMap<>();\n            result.put(\"code\", 404);\n            result.put(\"data\", null);\n            return Result.error(\"失败\", result);\n        }\n        HttpHeaders httpHeaders = new HttpHeaders();\n        if (StrUtil.isNotEmpty(openApi.getHeadersJson())) {\n            List<OpenApiHeader> headers = JSON.parseArray(openApi.getHeadersJson(),OpenApiHeader.class);\n            if (headers.size()>0) {\n                for (OpenApiHeader header : headers) {\n                    httpHeaders.put(header.getHeaderKey(), Lists.newArrayList(request.getHeader(header.getHeaderKey())));\n                }\n            }\n        }\n\n        String url = openApi.getOriginUrl();\n        String method = openApi.getRequestMethod();\n        String appkey = request.getHeader(\"appkey\");\n        OpenApiAuth openApiAuth = openApiAuthService.getByAppkey(appkey);\n        SysUser systemUser = sysUserService.getUserByName(openApiAuth.getCreateBy());\n        String token = this.getToken(systemUser.getUsername(), systemUser.getPassword());\n        httpHeaders.put(\"X-Access-Token\", Lists.newArrayList(token));\n        httpHeaders.put(\"Content-Type\",Lists.newArrayList(\"application/json\"));\n        HttpEntity<String> httpEntity = new HttpEntity<>(json, httpHeaders);\n        url = RestUtil.getBaseUrl() +  url;\n        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);\n        if (HttpMethod.GET.matches(method)\n                || HttpMethod.DELETE.matches(method)\n                || HttpMethod.OPTIONS.matches(method)\n                || HttpMethod.TRACE.matches(method)) {\n            //拼接参数\n            if (!request.getParameterMap().isEmpty()) {\n                if (StrUtil.isNotEmpty(openApi.getParamsJson())) {\n                    List<OpenApiParam> params = JSON.parseArray(openApi.getParamsJson(),OpenApiParam.class);\n                    if (params.size()>0) {\n                        Map<String, OpenApiParam> openApiParamMap = params.stream().collect(Collectors.toMap(p -> p.getParamKey(), p -> p, (e, r) -> e));\n                        request.getParameterMap().forEach((k, v) -> {\n                            OpenApiParam openApiParam = openApiParamMap.get(k);\n                            if (Objects.nonNull(openApiParam)) {\n                                if(v==null&&StrUtil.isNotEmpty(openApiParam.getDefaultValue())){\n                                    builder.queryParam(openApiParam.getParamKey(), openApiParam.getDefaultValue());\n                                }\n                                if (v!=null){\n                                    builder.queryParam(openApiParam.getParamKey(), v);\n                                }\n                            }\n                        });\n                    }\n                }\n\n            }\n        }\n        URI targetUrl = builder.build().encode().toUri();\n        return restTemplate.exchange(targetUrl.toString(), Objects.requireNonNull(HttpMethod.valueOf(method)), httpEntity, Result.class, request.getParameterMap()).getBody();\n    }\n\n    /**\n     * 生成接口访问令牌 Token\n     *\n     * @param USERNAME\n     * @param PASSWORD\n     * @return\n     */\n    private String getToken(String USERNAME, String PASSWORD) {\n        String token = JwtUtil.sign(USERNAME, PASSWORD, CommonConstant.CLIENT_TYPE_PC);\n        redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);\n        redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, 60);\n        return token;\n    }\n\n\n    @GetMapping(\"/json\")\n    public SwaggerModel swaggerModel() {\n\n        SwaggerModel swaggerModel = new SwaggerModel();\n        swaggerModel.setSwagger(\"2.0\");\n        swaggerModel.setInfo(swaggerInfo());\n        swaggerModel.setHost(\"jeecg.com\");\n        swaggerModel.setBasePath(\"/jeecg-boot\");\n        swaggerModel.setSchemes(Lists.newArrayList(\"http\", \"https\"));\n\n        SwaggerTag swaggerTag = new SwaggerTag();\n        swaggerTag.setName(\"openapi\");\n        swaggerModel.setTags(Lists.newArrayList(swaggerTag));\n\n        pathsAndDefinitions(swaggerModel);\n\n        return swaggerModel;\n    }\n\n    private void pathsAndDefinitions(SwaggerModel swaggerModel) {\n        Map<String, Map<String, SwaggerOperation>> paths = new HashMap<>();\n        Map<String, SwaggerDefinition> definitions = new HashMap<>();\n        List<OpenApi> openapis = service.list();\n        for (OpenApi openApi : openapis) {\n            Map<String, SwaggerOperation> operations = new HashMap<>();\n            SwaggerOperation operation = new SwaggerOperation();\n            operation.setTags(Lists.newArrayList(\"openapi\"));\n            operation.setSummary(openApi.getName());\n            operation.setDescription(openApi.getName());\n            operation.setOperationId(openApi.getRequestUrl()+\"Using\"+openApi.getRequestMethod());\n            operation.setProduces(Lists.newArrayList(\"application/json\"));\n            parameters(operation, openApi);\n\n            // body入参\n            if (StringUtils.hasText(openApi.getBody())) {\n                SwaggerDefinition definition = new SwaggerDefinition();\n                definition.setType(\"object\");\n                Map<String, SwaggerDefinitionProperties> definitionProperties = new HashMap<>();\n                definition.setProperties(definitionProperties);\n                if (openApi.getBody()!=null){\n                    JSONObject jsonObject = JSONObject.parseObject(openApi.getBody());\n                    if (jsonObject.size()>0){\n                        for (Map.Entry<String, Object> properties : jsonObject.entrySet()) {\n                            SwaggerDefinitionProperties swaggerDefinitionProperties = new SwaggerDefinitionProperties();\n                            swaggerDefinitionProperties.setType(\"string\");\n                            swaggerDefinitionProperties.setDescription(properties.getValue()+\"\");\n                            definitionProperties.put(properties.getKey(), swaggerDefinitionProperties);\n                        }\n                    }\n                }\n                // body的definition构建完成\n                definitions.put(openApi.getRequestUrl()+\"Using\"+openApi.getRequestMethod()+\"body\", definition);\n\n                SwaggerOperationParameter bodyParameter = new SwaggerOperationParameter();\n                bodyParameter.setDescription(openApi.getName() + \" body\");\n                bodyParameter.setIn(\"body\");\n                bodyParameter.setName(openApi.getName() + \" body\");\n                bodyParameter.setRequired(true);\n\n                Map<String, String> bodySchema = new HashMap<>();\n                bodySchema.put(\"$ref\", \"#/definitions/\" + openApi.getRequestUrl()+\"Using\"+openApi.getRequestMethod()+\"body\");\n                bodyParameter.setSchema(bodySchema);\n\n                // 构建参数构建完成\n                operation.getParameters().add(bodyParameter);\n\n            }\n\n            // 响应\n            Map<String, SwaggerOperationResponse> responses = new HashMap<>();\n            SwaggerOperationResponse resp200 = new SwaggerOperationResponse();\n            resp200.setDescription(\"OK\");\n            Map<String, String> respSchema = new HashMap<>();\n            respSchema.put(\"$ref\", \"#/definitions/OpenApiResult\");\n            resp200.setSchema(respSchema);\n\n            responses.put(\"200\", resp200);\n\n            Map<String, String> emptySchema = new HashMap<>();\n            SwaggerOperationResponse resp201 = new SwaggerOperationResponse();\n            resp201.setDescription(\"Created\");\n            resp201.setSchema(emptySchema);\n            responses.put(\"201\", resp201);\n            SwaggerOperationResponse resp401 = new SwaggerOperationResponse();\n            resp401.setDescription(\"Unauthorized\");\n            resp401.setSchema(emptySchema);\n            responses.put(\"401\", resp401);\n            SwaggerOperationResponse resp403 = new SwaggerOperationResponse();\n            resp403.setDescription(\"Forbidden\");\n            resp403.setSchema(emptySchema);\n            responses.put(\"403\", resp403);\n            SwaggerOperationResponse resp404 = new SwaggerOperationResponse();\n            resp404.setDescription(\"Not Found\");\n            resp404.setSchema(emptySchema);\n            responses.put(\"404\", resp404);\n\n            // 构建响应definition\n            SwaggerDefinition respDefinition = new SwaggerDefinition();\n            respDefinition.setType(\"object\");\n\n            Map<String, SwaggerDefinitionProperties> definitionProperties = new HashMap<>();\n            respDefinition.setProperties(definitionProperties);\n\n            SwaggerDefinitionProperties codeProperties = new SwaggerDefinitionProperties();\n            codeProperties.setType(\"integer\");\n            codeProperties.setDescription(\"返回代码\");\n            definitionProperties.put(\"code\", codeProperties);\n            SwaggerDefinitionProperties messageProperties = new SwaggerDefinitionProperties();\n            messageProperties.setType(\"string\");\n            messageProperties.setDescription(\"返回处理消息\");\n            definitionProperties.put(\"message\", messageProperties);\n            SwaggerDefinitionProperties resultProperties = new SwaggerDefinitionProperties();\n            resultProperties.setType(\"object\");\n            resultProperties.setDescription(\"返回数据对象\");\n            definitionProperties.put(\"result\", resultProperties);\n            SwaggerDefinitionProperties successProperties = new SwaggerDefinitionProperties();\n            successProperties.setType(\"boolean\");\n            successProperties.setDescription(\"成功标志\");\n            definitionProperties.put(\"success\", successProperties);\n            SwaggerDefinitionProperties timestampProperties = new SwaggerDefinitionProperties();\n            timestampProperties.setType(\"integer\");\n            timestampProperties.setDescription(\"时间戳\");\n            definitionProperties.put(\"timestamp\", timestampProperties);\n\n            definitions.put(\"OpenApiResult\", respDefinition);\n\n\n            operation.setResponses(responses);\n            operations.put(openApi.getRequestMethod().toLowerCase(), operation);\n            paths.put(\"/openapi/call/\"+openApi.getRequestUrl(), operations);\n        }\n\n        swaggerModel.setDefinitions(definitions);\n        swaggerModel.setPaths(paths);\n\n    }\n\n    private void parameters(SwaggerOperation operation, OpenApi openApi) {\n        List<SwaggerOperationParameter> parameters = new ArrayList<>();\n        if (openApi.getParamsJson()!=null) {\n            List<OpenApiParam> openApiParams = JSON.parseArray(openApi.getParamsJson(), OpenApiParam.class);\n            for (OpenApiParam openApiParam : openApiParams) {\n                SwaggerOperationParameter parameter = new SwaggerOperationParameter();\n                parameter.setIn(\"path\");\n                parameter.setName(openApiParam.getParamKey());\n                parameter.setRequired(openApiParam.getRequired() == 1);\n                parameter.setDescription(openApiParam.getNote());\n                parameters.add(parameter);\n            }\n        }\n        if (openApi.getHeadersJson()!=null) {\n            List<OpenApiHeader> openApiHeaders = JSON.parseArray(openApi.getHeadersJson(), OpenApiHeader.class);\n            for (OpenApiHeader openApiHeader : openApiHeaders) {\n                SwaggerOperationParameter parameter = new SwaggerOperationParameter();\n                parameter.setIn(\"header\");\n                parameter.setName(openApiHeader.getHeaderKey());\n                parameter.setRequired(openApiHeader.getRequired() == 1);\n                parameter.setDescription(openApiHeader.getNote());\n                parameters.add(parameter);\n            }\n        }\n        operation.setParameters(parameters);\n    }\n\n    private SwaggerInfo swaggerInfo() {\n        SwaggerInfo info = new SwaggerInfo();\n\n        info.setDescription(\"OpenAPI 接口列表\");\n        info.setVersion(\"3.9.1\");\n        info.setTitle(\"OpenAPI 接口列表\");\n        info.setTermsOfService(\"https://jeecg.com\");\n\n        SwaggerInfoContact contact = new SwaggerInfoContact();\n        contact.setName(\"jeecg@qq.com\");\n\n        info.setContact(contact);\n\n        SwaggerInfoLicense license = new SwaggerInfoLicense();\n        license.setName(\"Apache 2.0\");\n        license.setUrl(\"http://www.apache.org/licenses/LICENSE-2.0.html\");\n\n        info.setLicense(license);\n\n        return info;\n    }\n\n    /**\n     * 生成接口路径\n     * @return\n     */\n    @GetMapping(\"genPath\")\n    public Result<String> genPath() {\n        Result<String> r = new Result<String>();\n        r.setSuccess(true);\n        r.setCode(CommonConstant.SC_OK_200);\n        r.setResult(PathGenerator.genPath());\n        return r;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/controller/OpenApiIndexController.java",
    "content": "package org.jeecg.modules.openapi.controller;\n\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.config.shiro.IgnoreAuth;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * @date 2024/12/20 14:04\n */\n@RestController\n@RequestMapping(\"/openapi/demo\")\npublic class OpenApiIndexController {\n\n    @GetMapping(\"index\")\n    @IgnoreAuth\n    public Result<Map<String, String>> index() {\n        Map<String, String> result = new HashMap<>();\n        result.put(\"first\", \"Hello World\");\n        return Result.ok(result);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/controller/OpenApiLogController.java",
    "content": "package org.jeecg.modules.openapi.controller;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.modules.openapi.entity.OpenApiLog;\nimport org.jeecg.modules.openapi.service.OpenApiLogService;\nimport org.springframework.web.bind.annotation.*;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.util.Arrays;\n\n/**\n * @date 2024/12/10 9:57\n */\n@RestController\n@RequestMapping(\"/openapi/record\")\npublic class OpenApiLogController extends JeecgController<OpenApiLog, OpenApiLogService> {\n\n    /**\n     * 分页列表查询\n     *\n     * @param OpenApiLog\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @GetMapping(value = \"/list\")\n    public Result<?> queryPageList(OpenApiLog OpenApiLog, @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                   @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize, HttpServletRequest req) {\n        QueryWrapper<OpenApiLog> queryWrapper = QueryGenerator.initQueryWrapper(OpenApiLog, req.getParameterMap());\n        Page<OpenApiLog> page = new Page<>(pageNo, pageSize);\n        IPage<OpenApiLog> pageList = service.page(page, queryWrapper);\n        return Result.ok(pageList);\n    }\n\n    /**\n     * 添加\n     *\n     * @param OpenApiLog\n     * @return\n     */\n    @PostMapping(value = \"/add\")\n    public Result<?> add(@RequestBody OpenApiLog OpenApiLog) {\n        service.save(OpenApiLog);\n        return Result.ok(\"添加成功！\");\n    }\n\n    /**\n     * 编辑\n     *\n     * @param OpenApiLog\n     * @return\n     */\n    @PutMapping(value = \"/edit\")\n    public Result<?> edit(@RequestBody OpenApiLog OpenApiLog) {\n        service.updateById(OpenApiLog);\n        return Result.ok(\"修改成功!\");\n\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @DeleteMapping(value = \"/delete\")\n    public Result<?> delete(@RequestParam(name = \"id\", required = true) String id) {\n        service.removeById(id);\n        return Result.ok(\"删除成功!\");\n    }\n\n    /**\n     * 批量删除\n     *\n     * @param ids\n     * @return\n     */\n    @DeleteMapping(value = \"/deleteBatch\")\n    public Result<?> deleteBatch(@RequestParam(name = \"ids\", required = true) String ids) {\n\n        this.service.removeByIds(Arrays.asList(ids.split(\",\")));\n        return Result.ok(\"批量删除成功！\");\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    @GetMapping(value = \"/queryById\")\n    public Result<?> queryById(@RequestParam(name = \"id\", required = true) String id) {\n        OpenApiLog OpenApiLog = service.getById(id);\n        return Result.ok(OpenApiLog);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/controller/OpenApiPermissionController.java",
    "content": "package org.jeecg.modules.openapi.controller;\n\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.modules.openapi.entity.OpenApiPermission;\nimport org.jeecg.modules.openapi.service.OpenApiPermissionService;\nimport org.springframework.web.bind.annotation.*;\n\n@RestController\n@RequestMapping(\"/openapi/permission\")\npublic class OpenApiPermissionController extends JeecgController<OpenApiPermission, OpenApiPermissionService> {\n\n    @PostMapping(\"add\")\n    public Result add(@RequestBody OpenApiPermission openApiPermission) {\n        service.add(openApiPermission);\n        return Result.ok(\"保存成功\");\n    }\n    @GetMapping(\"/getOpenApi\")\n    public Result<?> getOpenApi( String apiAuthId) {\n        return service.getOpenApi(apiAuthId);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/entity/OpenApi.java",
    "content": "package org.jeecg.modules.openapi.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * 接口表\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class OpenApi  implements Serializable {\n\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * id\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    private String id;\n\n    /**\n     * 接口名称\n     */\n    private String name;\n\n    /**\n     * 请求方式，如POST、GET\n     */\n    private String requestMethod;\n\n    /**\n     * 对外开放的相对接口路径\n     */\n    private String requestUrl;\n\n    /**\n     * IP 黑名单\n     */\n    private String blackList;\n    /**\n     * 请求头json\n     */\n    private String headersJson;\n    /**\n     * 请求参数json\n     */\n    private String paramsJson;\n\n\n    /**\n     * 目前仅支持json\n     */\n    private String body;\n\n    /**\n     * 原始接口路径\n     */\n    private String originUrl;\n\n    /**\n     * 状态(1：正常  2：废弃 ）\n     */\n    private Integer status;\n\n    /**\n     * 删除状态（0，正常，1已删除）\n     */\n    @TableLogic\n    private Integer delFlag;\n\n    /**\n     * 创建人\n     */\n    private String createBy;\n\n    /**\n     * 创建时间\n     */\n    private Date createTime;\n\n    /**\n     * 更新人\n     */\n    private String updateBy;\n\n    /**\n     * 更新时间\n     */\n    private Date updateTime;\n    /**\n     * 历史已选接口\n     */\n    @TableField(exist = false)\n    private String ifCheckBox = \"0\";\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/entity/OpenApiAuth.java",
    "content": "package org.jeecg.modules.openapi.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecg.common.aspect.annotation.Dict;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * 权限表\n * @date 2024/12/10 9:38\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class OpenApiAuth implements Serializable {\n\n    private static final long serialVersionUID = -5933153354153738498L;\n\n    /**\n     * id\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    private String id;\n\n    /**\n     * 受权名称\n     */\n    private String name;\n\n    /**\n     * access key\n     */\n    private String ak;\n\n    /**\n     * secret key\n     */\n    private String sk;\n\n    /**\n     * 系统用户ID\n     */\n    @Dict(dictTable = \"sys_user\",dicCode = \"id\",dicText = \"username\")\n    private String systemUserId;\n\n    /**\n     * 创建人\n     */\n    private String createBy;\n\n    /**\n     * 创建时间\n     */\n    private Date createTime;\n\n    /**\n     * 更新人\n     */\n    private String updateBy;\n\n    /**\n     * 更新时间\n     */\n    private Date updateTime;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/entity/OpenApiHeader.java",
    "content": "package org.jeecg.modules.openapi.entity;\n\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\nimport java.io.Serializable;\n\n/**\n * 请求头表\n * @date 2024/12/10 14:37\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class OpenApiHeader implements Serializable {\n    private static final long serialVersionUID = 5032708503120184683L;\n\n\n    /**\n     * key\n     */\n    private String headerKey;\n\n    /**\n     * 是否必填(0:否，1：是)\n     */\n    private Integer required;\n\n    /**\n     * 默认值\n     */\n    private String defaultValue;\n\n    /**\n     * 说明\n     */\n    private String note;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/entity/OpenApiLog.java",
    "content": "package org.jeecg.modules.openapi.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * 调用记录表\n * @date 2024/12/10 9:41\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class OpenApiLog implements Serializable {\n    private static final long serialVersionUID = -5870384488947863579L;\n\n    /**\n     * id\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    private String id;\n\n    /**\n     * 接口ID\n     */\n    private String apiId;\n\n    /**\n     * 调用ID\n     */\n    private String callAuthId;\n\n    /**\n     * 调用时间\n     */\n    private Date callTime;\n\n    /**\n     * 耗时\n     */\n    private Long usedTime;\n\n    /**\n     * 响应时间\n     */\n    private Date responseTime;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/entity/OpenApiParam.java",
    "content": "package org.jeecg.modules.openapi.entity;\n\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\nimport java.io.Serializable;\n\n/**\n * query部分参数表\n * @date 2024/12/10 14:37\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class OpenApiParam implements Serializable {\n    private static final long serialVersionUID = -6174831468578022357L;\n\n    /**\n     * key\n     */\n    private String paramKey;\n\n    /**\n     * 是否必填(0:否，1：是)\n     */\n    private Integer required;\n\n    /**\n     * 默认值\n     */\n    private String defaultValue;\n\n    /**\n     * 说明\n     */\n    private String note;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/entity/OpenApiPermission.java",
    "content": "package org.jeecg.modules.openapi.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n *\n * @date 2024/12/19 17:41\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class OpenApiPermission implements Serializable {\n    /**\n     * id\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    private String id;\n\n    /**\n     * 接口ID\n     */\n    private String apiId;\n\n    /**\n     * 认证ID\n     */\n    private String apiAuthId;\n\n    /**\n     * 创建人\n     */\n    private String createBy;\n\n    /**\n     * 创建时间\n     */\n    private Date createTime;\n\n    /**\n     * 更新人\n     */\n    private String updateBy;\n\n    /**\n     * 更新时间\n     */\n    private Date updateTime;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/filter/ApiAuthFilter.java",
    "content": "package org.jeecg.modules.openapi.filter;\n\nimport jakarta.servlet.*;\nimport jakarta.servlet.http.HttpServletRequest;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.modules.openapi.entity.OpenApi;\nimport org.jeecg.modules.openapi.entity.OpenApiAuth;\nimport org.jeecg.modules.openapi.entity.OpenApiLog;\nimport org.jeecg.modules.openapi.entity.OpenApiPermission;\nimport org.jeecg.modules.openapi.service.OpenApiAuthService;\nimport org.jeecg.modules.openapi.service.OpenApiLogService;\nimport org.jeecg.modules.openapi.service.OpenApiPermissionService;\nimport org.jeecg.modules.openapi.service.OpenApiService;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.context.WebApplicationContext;\n\nimport java.io.IOException;\nimport java.security.MessageDigest;\nimport java.util.Arrays;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * @date 2024/12/19 16:55\n */\n@Slf4j\npublic class ApiAuthFilter implements Filter {\n\n    private OpenApiLogService openApiLogService;\n    private OpenApiAuthService openApiAuthService;\n    private OpenApiPermissionService openApiPermissionService;\n    private OpenApiService openApiService;\n\n    @Override\n    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {\n        long startTime = System.currentTimeMillis();\n        Date callTime = new Date();\n\n        HttpServletRequest request = (HttpServletRequest)servletRequest;\n        String ip = request.getRemoteAddr();\n\n        String appkey = request.getHeader(\"appkey\");\n        String signature = request.getHeader(\"signature\");\n        String timestamp = request.getHeader(\"timestamp\");\n\n        OpenApi openApi = findOpenApi(request);\n\n        // IP 黑名单核验\n        checkBlackList(openApi, ip);\n\n        // 签名核验\n        checkSignValid(appkey, signature, timestamp);\n\n        OpenApiAuth openApiAuth = openApiAuthService.getByAppkey(appkey);\n        // 认证信息核验\n        checkSignature(appkey, signature, timestamp, openApiAuth);\n        // 业务核验\n        checkPermission(openApi, openApiAuth);\n\n        filterChain.doFilter(servletRequest, servletResponse);\n        long endTime = System.currentTimeMillis();\n\n        OpenApiLog openApiLog = new OpenApiLog();\n        openApiLog.setApiId(openApi.getId());\n        openApiLog.setCallAuthId(openApiAuth.getId());\n        openApiLog.setCallTime(callTime);\n        openApiLog.setUsedTime(endTime - startTime);\n        openApiLog.setResponseTime(new Date());\n        openApiLogService.save(openApiLog);\n    }\n\n    @Override\n    public void init(FilterConfig filterConfig) throws ServletException {\n        ServletContext servletContext = filterConfig.getServletContext();\n        WebApplicationContext applicationContext = (WebApplicationContext)servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);\n        this.openApiService = applicationContext.getBean(OpenApiService.class);\n        this.openApiLogService = applicationContext.getBean(OpenApiLogService.class);\n        this.openApiAuthService = applicationContext.getBean(OpenApiAuthService.class);\n        this.openApiPermissionService = applicationContext.getBean(OpenApiPermissionService.class);\n    }\n\n    /**\n     * IP 黑名单核验\n     * @param openApi\n     * @param ip\n     */\n    protected void checkBlackList(OpenApi openApi, String ip) {\n        if (!StringUtils.hasText(openApi.getBlackList())) {\n            return;\n        }\n\n        List<String> blackList = Arrays.asList(openApi.getBlackList().split(\",\"));\n        if (blackList.contains(ip)) {\n            throw new JeecgBootException(\"目标接口限制IP[\" + ip + \"]进行访问，IP已记录，请停止访问\");\n        }\n    }\n\n    /**\n     * 签名验证\n     * @param appkey\n     * @param signature\n     * @param timestamp\n     * @return\n     */\n    protected void checkSignValid(String appkey, String signature, String timestamp) {\n        if (!StringUtils.hasText(appkey)) {\n            throw new JeecgBootException(\"appkey为空\");\n        }\n        if (!StringUtils.hasText(signature)) {\n            throw new JeecgBootException(\"signature为空\");\n        }\n        if (!StringUtils.hasText(timestamp)) {\n            throw new JeecgBootException(\"timastamp时间戳为空\");\n        }\n        if (!timestamp.matches(\"[0-9]*\")) {\n            throw new JeecgBootException(\"timastamp时间戳不合法\");\n        }\n        if (System.currentTimeMillis() - Long.parseLong(timestamp) > 5 * 60 * 1000) {\n            throw new JeecgBootException(\"signature签名已过期(超过五分钟)\");\n        }\n    }\n\n    /**\n     * 认证信息核验\n     * @param appKey\n     * @param signature\n     * @param timestamp\n     * @param openApiAuth\n     * @return\n     * @throws Exception\n     */\n    protected void checkSignature(String appKey, String signature, String timestamp, OpenApiAuth openApiAuth) {\n        if(openApiAuth==null){\n            throw new JeecgBootException(\"不存在认证信息\");\n        }\n\n        if(!appKey.equals(openApiAuth.getAk())){\n            throw new JeecgBootException(\"appkey错误\");\n        }\n\n        if (!signature.equals(md5(appKey + openApiAuth.getSk() + timestamp))) {\n            throw new JeecgBootException(\"signature签名错误\");\n        }\n    }\n\n    protected void checkPermission(OpenApi openApi, OpenApiAuth openApiAuth) {\n        List<OpenApiPermission> permissionList = openApiPermissionService.findByAuthId(openApiAuth.getId());\n\n        boolean hasPermission = false;\n        for (OpenApiPermission permission : permissionList) {\n            if (permission.getApiId().equals(openApi.getId())) {\n                hasPermission = true;\n                break;\n            }\n        }\n\n        if (!hasPermission) {\n            throw new JeecgBootException(\"该appKey未授权当前接口\");\n        }\n    }\n\n    /**\n     * @return String    返回类型\n     * @Title: MD5\n     * @Description: 【MD5加密】\n     */\n    protected static String md5(String sourceStr) {\n        String result = \"\";\n        try {\n            MessageDigest md = MessageDigest.getInstance(\"MD5\");\n            md.update(sourceStr.getBytes(\"utf-8\"));\n            byte[] hash = md.digest();\n            int i;\n            StringBuffer buf = new StringBuffer(32);\n            for (int offset = 0; offset < hash.length; offset++) {\n                i = hash[offset];\n                if (i < 0) {\n                    i += 256;\n                }\n                if (i < 16) {\n                    buf.append(\"0\");\n                }\n                buf.append(Integer.toHexString(i));\n            }\n            result = buf.toString();\n        } catch (Exception e) {\n            log.error(\"sign签名错误\", e);\n        }\n        return result;\n    }\n\n    protected OpenApi findOpenApi(HttpServletRequest request) {\n        String uri = request.getRequestURI();\n        String path = uri.substring(uri.lastIndexOf(\"/\") + 1);\n        return openApiService.findByPath(path);\n    }\n\n    public static void main(String[] args) {\n        long timestamp = System.currentTimeMillis();\n        System.out.println(\"timestamp:\"  + timestamp);\n        System.out.println(\"signature:\" + md5(\"ak-eAU25mrMxhtaZsyS\" + \"rjxMqB6YyUXpSHAz4DCIz8vZ5aozQQiV\" + timestamp));\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/filter/ApiFilterConfig.java",
    "content": "package org.jeecg.modules.openapi.filter;\n\nimport org.springframework.boot.web.servlet.FilterRegistrationBean;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n/**\n * @date 2024/12/19 17:09\n */\n@Configuration\npublic class ApiFilterConfig {\n\n    /**\n     *\n     * @Description: 【注册api加密过滤器】\n     */\n    @Bean\n    public FilterRegistrationBean<ApiAuthFilter> authFilter() {\n        FilterRegistrationBean<ApiAuthFilter> registration = new FilterRegistrationBean<>();\n        registration.setFilter(new ApiAuthFilter());\n        registration.setName(\"apiAuthFilter\");\n        registration.addUrlPatterns(\"/openapi/call/*\");\n        return registration;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/generator/AKSKGenerator.java",
    "content": "package org.jeecg.modules.openapi.generator;\n\nimport java.security.SecureRandom;\n\n/**\n * AK/SK生成器\n */\npublic class AKSKGenerator {\n    private static final String CHAR_POOL = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n    private static final int AK_LENGTH = 16; // Adjust as per requirements\n    private static final int SK_LENGTH = 32;\n\n    public static String[] genAKSKPair() {\n        return new String[]{genAK(), genSK()};\n    }\n\n    public static String genAK() {\n        return \"ak-\" + generateRandomString(AK_LENGTH);\n    }\n\n    public static String genSK() {\n        return generateRandomString(SK_LENGTH);\n    }\n\n\n    private static String generateRandomString(int length) {\n        SecureRandom random = new SecureRandom();\n        StringBuilder sb = new StringBuilder(length);\n\n        for (int i = 0; i < length; i++) {\n            sb.append(CHAR_POOL.charAt(random.nextInt(CHAR_POOL.length())));\n        }\n\n        return sb.toString();\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/generator/PathGenerator.java",
    "content": "package org.jeecg.modules.openapi.generator;\n\nimport lombok.experimental.UtilityClass;\n\nimport java.util.Random;\n\n/**\n * @date 2024/12/10 10:00\n */\n@UtilityClass\npublic class PathGenerator {\n\n    // Base62字符集\n    private static final String BASE62 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\n    /**\n     * 生成随机路径\n     * @return\n     */\n    public static String genPath() {\n        StringBuilder result = new StringBuilder();\n        Random random = new Random();\n        for (int i=0; i<8; i++) {\n            result.append(BASE62.charAt(random.nextInt(62)));\n        }\n        return result.toString();\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/mapper/OpenApiAuthMapper.java",
    "content": "package org.jeecg.modules.openapi.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.jeecg.modules.openapi.entity.OpenApiAuth;\n\n/**\n * @date 2024/12/10 9:49\n */\n@Mapper\npublic interface OpenApiAuthMapper extends BaseMapper<OpenApiAuth> {\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/mapper/OpenApiLogMapper.java",
    "content": "package org.jeecg.modules.openapi.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.jeecg.modules.openapi.entity.OpenApiLog;\n\n/**\n * @date 2024/12/10 9:50\n */\n@Mapper\npublic interface OpenApiLogMapper extends BaseMapper<OpenApiLog> {\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/mapper/OpenApiMapper.java",
    "content": "package org.jeecg.modules.openapi.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.jeecg.modules.openapi.entity.OpenApi;\n\n@Mapper\npublic interface OpenApiMapper extends BaseMapper<OpenApi> {\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/mapper/OpenApiPermissionMapper.java",
    "content": "package org.jeecg.modules.openapi.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.jeecg.modules.openapi.entity.OpenApiPermission;\n\n/**\n * @date 2024/12/19 17:43\n */\n@Mapper\npublic interface OpenApiPermissionMapper extends BaseMapper<OpenApiPermission> {\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/service/OpenApiAuthService.java",
    "content": "package org.jeecg.modules.openapi.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.openapi.entity.OpenApiAuth;\n\n/**\n * @date 2024/12/10 9:50\n */\npublic interface OpenApiAuthService extends IService<OpenApiAuth> {\n    OpenApiAuth getByAppkey(String appkey);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/service/OpenApiLogService.java",
    "content": "package org.jeecg.modules.openapi.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.openapi.entity.OpenApiLog;\n\n/**\n * @date 2024/12/10 9:51\n */\npublic interface OpenApiLogService extends IService<OpenApiLog> {\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/service/OpenApiPermissionService.java",
    "content": "package org.jeecg.modules.openapi.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.modules.openapi.entity.OpenApiPermission;\n\nimport java.util.List;\n\n/**\n * @date 2024/12/19 17:44\n */\npublic interface OpenApiPermissionService extends IService<OpenApiPermission> {\n    List<OpenApiPermission> findByAuthId(String authId);\n\n    Result<?> getOpenApi(String apiAuthId);\n\n    void add(OpenApiPermission openApiPermission);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/service/OpenApiService.java",
    "content": "package org.jeecg.modules.openapi.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.openapi.entity.OpenApi;\n\npublic interface OpenApiService extends IService<OpenApi> {\n    OpenApi findByPath(String path);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/service/impl/OpenApiAuthServiceImpl.java",
    "content": "package org.jeecg.modules.openapi.service.impl;\n\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.jeecg.modules.openapi.entity.OpenApiAuth;\nimport org.jeecg.modules.openapi.mapper.OpenApiAuthMapper;\nimport org.jeecg.modules.openapi.service.OpenApiAuthService;\nimport org.springframework.stereotype.Service;\n\n/**\n * @date 2024/12/10 9:51\n */\n@Service\npublic class OpenApiAuthServiceImpl extends ServiceImpl<OpenApiAuthMapper, OpenApiAuth> implements OpenApiAuthService {\n    @Override\n    public OpenApiAuth getByAppkey(String appkey) {\n        return baseMapper.selectOne(Wrappers.lambdaUpdate(OpenApiAuth.class).eq(OpenApiAuth::getAk, appkey), false);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/service/impl/OpenApiLogServiceImpl.java",
    "content": "package org.jeecg.modules.openapi.service.impl;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.jeecg.modules.openapi.entity.OpenApiLog;\nimport org.jeecg.modules.openapi.mapper.OpenApiLogMapper;\nimport org.jeecg.modules.openapi.service.OpenApiLogService;\nimport org.springframework.stereotype.Service;\n\n/**\n * @date 2024/12/10 9:53\n */\n@Service\npublic class OpenApiLogServiceImpl extends ServiceImpl<OpenApiLogMapper, OpenApiLog> implements OpenApiLogService {\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/service/impl/OpenApiPermissionServiceImpl.java",
    "content": "package org.jeecg.modules.openapi.service.impl;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport cn.hutool.core.util.StrUtil;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport jakarta.annotation.Resource;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.modules.openapi.entity.OpenApi;\nimport org.jeecg.modules.openapi.entity.OpenApiPermission;\nimport org.jeecg.modules.openapi.mapper.OpenApiPermissionMapper;\nimport org.jeecg.modules.openapi.service.OpenApiPermissionService;\nimport org.jeecg.modules.openapi.service.OpenApiService;\nimport org.springframework.stereotype.Service;\n\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\n/**\n * @date 2024/12/19 17:44\n */\n@Service\npublic class OpenApiPermissionServiceImpl extends ServiceImpl<OpenApiPermissionMapper, OpenApiPermission> implements OpenApiPermissionService {\n    @Resource\n    private OpenApiService openApiService;\n    @Override\n    public List<OpenApiPermission> findByAuthId(String authId) {\n        return baseMapper.selectList(Wrappers.lambdaQuery(OpenApiPermission.class).eq(OpenApiPermission::getApiAuthId, authId));\n    }\n\n    @Override\n    public Result<?> getOpenApi(String apiAuthId) {\n        List<OpenApi> openApis = openApiService.list();\n        if (CollectionUtil.isEmpty(openApis)) {\n            return Result.error(\"接口不存在\");\n        }\n        List<OpenApiPermission> openApiPermissions = baseMapper.selectList(Wrappers.<OpenApiPermission>lambdaQuery().eq(OpenApiPermission::getApiAuthId, apiAuthId));\n        if (CollectionUtil.isNotEmpty(openApiPermissions)) {\n            Map<String, OpenApi> openApiMap = openApis.stream().collect(Collectors.toMap(OpenApi::getId, o -> o));\n            for (OpenApiPermission openApiPermission : openApiPermissions) {\n                OpenApi openApi = openApiMap.get(openApiPermission.getApiId());\n                if (openApi!=null) {\n                    openApi.setIfCheckBox(\"1\");\n                }\n            }\n        }\n        return Result.ok(openApis);\n    }\n\n    @Override\n    public void add(OpenApiPermission openApiPermission) {\n        this.remove(Wrappers.<OpenApiPermission>lambdaQuery().eq(OpenApiPermission::getApiAuthId, openApiPermission.getApiAuthId()));\n        List<String> list = Arrays.asList(openApiPermission.getApiId().split(\",\"));\n        if (CollectionUtil.isNotEmpty(list)) {\n            list.forEach(l->{\n                if (StrUtil.isNotEmpty(l)){\n                    OpenApiPermission saveApiPermission = new OpenApiPermission();\n                    saveApiPermission.setApiId(l);\n                    saveApiPermission.setApiAuthId(openApiPermission.getApiAuthId());\n                    this.save(saveApiPermission);\n                }\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/service/impl/OpenApiServiceImpl.java",
    "content": "package org.jeecg.modules.openapi.service.impl;\n\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.jeecg.modules.openapi.entity.OpenApi;\nimport org.jeecg.modules.openapi.mapper.OpenApiMapper;\nimport org.jeecg.modules.openapi.service.OpenApiService;\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class OpenApiServiceImpl extends ServiceImpl<OpenApiMapper, OpenApi> implements OpenApiService {\n    @Override\n    public OpenApi findByPath(String path) {\n        return baseMapper.selectOne(Wrappers.lambdaQuery(OpenApi.class).eq(OpenApi::getRequestUrl, path), false);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/swagger/SwaggerDefinition.java",
    "content": "package org.jeecg.modules.openapi.swagger;\n\nimport lombok.Data;\n\nimport java.util.Map;\n\n/**\n * @date 2025/1/26 11:17\n */\n@Data\npublic class SwaggerDefinition {\n    private String type;\n    private Map<String, SwaggerDefinitionProperties> properties;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/swagger/SwaggerDefinitionProperties.java",
    "content": "package org.jeecg.modules.openapi.swagger;\n\nimport lombok.Data;\n\n/**\n * @date 2025/1/26 13:54\n */\n@Data\npublic class SwaggerDefinitionProperties {\n    private String type;\n    private String example;\n    private String description;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/swagger/SwaggerInfo.java",
    "content": "package org.jeecg.modules.openapi.swagger;\n\nimport lombok.Data;\n\n/**\n * @date 2025/1/26 11:05\n */\n@Data\npublic class SwaggerInfo {\n    private String description;\n    private String version;\n    private String title;\n    private String termsOfService;\n    private SwaggerInfoContact contact;\n    private SwaggerInfoLicense license;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/swagger/SwaggerInfoContact.java",
    "content": "package org.jeecg.modules.openapi.swagger;\n\nimport lombok.Data;\n\n/**\n * @date 2025/1/26 11:08\n */\n@Data\npublic class SwaggerInfoContact {\n    private String name;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/swagger/SwaggerInfoLicense.java",
    "content": "package org.jeecg.modules.openapi.swagger;\n\nimport lombok.Data;\n\n/**\n * @date 2025/1/26 11:09\n */\n@Data\npublic class SwaggerInfoLicense {\n    private String name;\n    private String url;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/swagger/SwaggerModel.java",
    "content": "package org.jeecg.modules.openapi.swagger;\n\nimport lombok.Data;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @date 2025/1/26 11:05\n */\n@Data\npublic class SwaggerModel {\n    private String swagger;\n    private SwaggerInfo info;\n    private String host;\n    private String basePath;\n    private List<SwaggerTag> tags;\n    private List<String> schemes;\n    private Map<String, Map<String, SwaggerOperation>> paths;\n    private Map<String, SwaggerDefinition> definitions;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/swagger/SwaggerOperation.java",
    "content": "package org.jeecg.modules.openapi.swagger;\n\nimport lombok.Data;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @date 2025/1/26 11:16\n */\n@Data\npublic class SwaggerOperation {\n    private List<String> tags;\n    private String summary;\n    private String description;\n    private String operationId;\n    private List<String> produces;\n    private List<SwaggerOperationParameter> parameters;\n    private Map<String, SwaggerOperationResponse> responses;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/swagger/SwaggerOperationParameter.java",
    "content": "package org.jeecg.modules.openapi.swagger;\n\nimport lombok.Data;\n\nimport java.util.Map;\n\n/**\n * @date 2025/1/26 11:43\n */\n@Data\npublic class SwaggerOperationParameter {\n    private String name;\n    private String in;\n    private String description;\n    private Boolean required;\n    private Map<String, String> schema;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/swagger/SwaggerOperationResponse.java",
    "content": "package org.jeecg.modules.openapi.swagger;\n\nimport lombok.Data;\n\nimport java.util.Map;\n\n/**\n * @date 2025/1/26 11:47\n */\n@Data\npublic class SwaggerOperationResponse {\n    private String description;\n    private Map<String, String> schema;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/swagger/SwaggerSchema.java",
    "content": "package org.jeecg.modules.openapi.swagger;\n\n/**\n * @date 2025/1/26 11:51\n */\npublic class SwaggerSchema {\n    private String $ref;\n\n    public String get$ref() {\n        return $ref;\n    }\n\n    public void set$ref(String $ref) {\n        this.$ref = $ref;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/openapi/swagger/SwaggerTag.java",
    "content": "package org.jeecg.modules.openapi.swagger;\n\nimport lombok.Data;\n\n/**\n * @date 2025/1/26 11:15\n */\n@Data\npublic class SwaggerTag {\n    private String name;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/oss/controller/OssFileController.java",
    "content": "package org.jeecg.modules.oss.controller;\n\nimport jakarta.servlet.http.HttpServletRequest;\n\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.apache.shiro.authz.annotation.RequiresRoles;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.modules.oss.entity.OssFile;\nimport org.jeecg.modules.oss.service.IOssFileService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * 云存储示例 DEMO\n * @author: jeecg-boot\n */\n@Slf4j\n@Controller\n@RequestMapping(\"/sys/oss/file\")\npublic class OssFileController {\n\n\t@Autowired\n\tprivate IOssFileService ossFileService;\n\n\t@ResponseBody\n\t@GetMapping(\"/list\")\n\tpublic Result<IPage<OssFile>> queryPageList(OssFile file,\n                                                @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                                @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize, HttpServletRequest req) {\n\t\tResult<IPage<OssFile>> result = new Result<>();\n\t\tQueryWrapper<OssFile> queryWrapper = QueryGenerator.initQueryWrapper(file, req.getParameterMap());\n\t\tPage<OssFile> page = new Page<>(pageNo, pageSize);\n\t\tIPage<OssFile> pageList = ossFileService.page(page, queryWrapper);\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(pageList);\n\t\treturn result;\n\t}\n\n\t@ResponseBody\n\t@PostMapping(\"/upload\")\n\t//@RequiresRoles(\"admin\")\n    @RequiresPermissions(\"system:ossFile:upload\")\n\tpublic Result upload(@RequestParam(\"file\") MultipartFile multipartFile) {\n\t\tResult result = new Result();\n\t\ttry {\n\t\t\tossFileService.upload(multipartFile);\n\t\t\tresult.success(\"上传成功！\");\n\t\t}\n\t\tcatch (Exception ex) {\n\t\t\tlog.info(ex.getMessage(), ex);\n\t\t\tresult.error500(\"上传失败\");\n\t\t}\n\t\treturn result;\n\t}\n\n\t@ResponseBody\n\t@DeleteMapping(\"/delete\")\n\tpublic Result delete(@RequestParam(name = \"id\") String id) {\n\t\tResult result = new Result();\n\t\tOssFile file = ossFileService.getById(id);\n\t\tif (file == null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}else {\n\t\t\tboolean ok = ossFileService.delete(file);\n\t\t\tresult.success(\"删除成功!\");\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 通过id查询.\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/queryById\")\n\tpublic Result<OssFile> queryById(@RequestParam(name = \"id\") String id) {\n\t\tResult<OssFile> result = new Result<>();\n\t\tOssFile file = ossFileService.getById(id);\n\t\tif (file == null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}\n\t\telse {\n\t\t\tresult.setResult(file);\n\t\t\tresult.setSuccess(true);\n\t\t}\n\t\treturn result;\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/oss/entity/OssFile.java",
    "content": "package org.jeecg.modules.oss.entity;\n\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecg.common.system.base.entity.JeecgEntity;\nimport org.jeecgframework.poi.excel.annotation.Excel;\n\n/**\n * @Description: oss云存储实体类\n * @author: jeecg-boot\n */\n@Data\n@TableName(\"oss_file\")\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class OssFile extends JeecgEntity {\n\n\tprivate static final long serialVersionUID = 1L;\n\n\t@Excel(name = \"文件名称\")\n\tprivate String fileName;\n\n\t@Excel(name = \"文件地址\")\n\tprivate String url;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/oss/mapper/OssFileMapper.java",
    "content": "package org.jeecg.modules.oss.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.jeecg.modules.oss.entity.OssFile;\n\n/**\n * @Description: oss云存储Mapper\n * @author: jeecg-boot\n */\npublic interface OssFileMapper extends BaseMapper<OssFile> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/oss/service/IOssFileService.java",
    "content": "package org.jeecg.modules.oss.service;\n\nimport java.io.IOException;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.oss.entity.OssFile;\nimport org.springframework.web.multipart.MultipartFile;\n\n/**\n * @Description: OOS云存储service接口\n * @author: jeecg-boot\n */\npublic interface IOssFileService extends IService<OssFile> {\n\n    /**\n     * oss文件上传\n     * @param multipartFile\n     * @throws IOException\n     */\n\tvoid upload(MultipartFile multipartFile) throws Exception;\n\n    /**\n     * oss文件删除\n     * @param ossFile OSSFile对象\n     * @return\n     */\n\tboolean delete(OssFile ossFile);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/oss/service/impl/OssFileServiceImpl.java",
    "content": "package org.jeecg.modules.oss.service.impl;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.util.CommonUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.common.util.oss.OssBootUtil;\nimport org.jeecg.modules.oss.entity.OssFile;\nimport org.jeecg.modules.oss.mapper.OssFileMapper;\nimport org.jeecg.modules.oss.service.IOssFileService;\nimport org.springframework.stereotype.Service;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport java.io.IOException;\n\n/**\n * @Description: OSS云存储实现类\n * @author: jeecg-boot\n */\n@Service(\"ossFileService\")\npublic class OssFileServiceImpl extends ServiceImpl<OssFileMapper, OssFile> implements IOssFileService {\n\n\t@Override\n\tpublic void upload(MultipartFile multipartFile) throws Exception {\n\t\tString fileName = multipartFile.getOriginalFilename();\n\t\tfileName = CommonUtils.getFileName(fileName);\n\t\tOssFile ossFile = new OssFile();\n\t\tossFile.setFileName(fileName);\n\t\tString url = OssBootUtil.upload(multipartFile,\"upload/test\");\n\t\tif(oConvertUtils.isEmpty(url)){\n\t\t\tthrow new JeecgBootException(\"上传文件失败! \");\n\t\t}\n\t\t// 返回阿里云原生域名前缀URL\n\t\tossFile.setUrl(OssBootUtil.getOriginalUrl(url));\n\t\tthis.save(ossFile);\n\t}\n\n\t@Override\n\tpublic boolean delete(OssFile ossFile) {\n\t\ttry {\n\t\t\tthis.removeById(ossFile.getId());\n\t\t\tOssBootUtil.deleteUrl(ossFile.getUrl());\n\t\t}\n\t\tcatch (Exception ex) {\n\t\t\tlog.error(ex.getMessage(),ex);\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/controller/QuartzJobController.java",
    "content": "package org.jeecg.modules.quartz.controller;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.SecurityUtils;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.apache.shiro.authz.annotation.RequiresRoles;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.ImportExcelUtil;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.quartz.entity.QuartzJob;\nimport org.jeecg.modules.quartz.service.IQuartzJobService;\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.quartz.Scheduler;\nimport org.quartz.SchedulerException;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @Description: 定时任务在线管理\n * @Author: jeecg-boot\n * @Date: 2019-01-02\n * @Version:V1.0\n */\n@RestController\n@RequestMapping(\"/sys/quartzJob\")\n@Slf4j\n@Tag(name = \"定时任务接口\")\npublic class QuartzJobController {\n\t@Autowired\n\tprivate IQuartzJobService quartzJobService;\n\t@Autowired\n\tprivate Scheduler scheduler;\n\n\t/**\n\t * 分页列表查询\n\t * \n\t * @param quartzJob\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t@RequestMapping(value = \"/list\", method = RequestMethod.GET)\n\tpublic Result<?> queryPageList(QuartzJob quartzJob, @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n\t\t\t@RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize, HttpServletRequest req) {\n\t\tQueryWrapper<QuartzJob> queryWrapper = QueryGenerator.initQueryWrapper(quartzJob, req.getParameterMap());\n\t\tPage<QuartzJob> page = new Page<QuartzJob>(pageNo, pageSize);\n\t\tIPage<QuartzJob> pageList = quartzJobService.page(page, queryWrapper);\n        return Result.ok(pageList);\n\n\t}\n\n\t/**\n\t * 添加定时任务\n\t * \n\t * @param quartzJob\n\t * @return\n\t */\n\t//@RequiresRoles(\"admin\")\n    @RequiresPermissions(\"system:quartzJob:add\")\n\t@RequestMapping(value = \"/add\", method = RequestMethod.POST)\n\tpublic Result<?> add(@RequestBody QuartzJob quartzJob) {\n\t\tquartzJobService.saveAndScheduleJob(quartzJob);\n\t\treturn Result.ok(\"创建定时任务成功\");\n\t}\n\n\t/**\n\t * 更新定时任务\n\t * \n\t * @param quartzJob\n\t * @return\n\t */\n\t//@RequiresRoles(\"admin\")\n    @RequiresPermissions(\"system:quartzJob:edit\")\n\t@RequestMapping(value = \"/edit\", method ={RequestMethod.PUT, RequestMethod.POST})\n\tpublic Result<?> eidt(@RequestBody QuartzJob quartzJob) {\n\t\ttry {\n\t\t\tquartzJobService.editAndScheduleJob(quartzJob);\n\t\t} catch (SchedulerException e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t\treturn Result.error(\"更新定时任务失败!\");\n\t\t}\n\t    return Result.ok(\"更新定时任务成功!\");\n\t}\n\n\t/**\n\t * 通过id删除\n\t * \n\t * @param id\n\t * @return\n\t */\n\t//@RequiresRoles(\"admin\")\n    @RequiresPermissions(\"system:quartzJob:delete\")\n\t@RequestMapping(value = \"/delete\", method = RequestMethod.DELETE)\n\tpublic Result<?> delete(@RequestParam(name = \"id\", required = true) String id) {\n\t\tQuartzJob quartzJob = quartzJobService.getById(id);\n\t\tif (quartzJob == null) {\n\t\t\treturn Result.error(\"未找到对应实体\");\n\t\t}\n\t\tquartzJobService.deleteAndStopJob(quartzJob);\n        return Result.ok(\"删除成功!\");\n\n\t}\n\n\t/**\n\t * 批量删除\n\t * \n\t * @param ids\n\t * @return\n\t */\n\t//@RequiresRoles(\"admin\")\n    @RequiresPermissions(\"system:quartzJob:deleteBatch\")\n\t@RequestMapping(value = \"/deleteBatch\", method = RequestMethod.DELETE)\n\tpublic Result<?> deleteBatch(@RequestParam(name = \"ids\", required = true) String ids) {\n\t\tif (ids == null || \"\".equals(ids.trim())) {\n\t\t\treturn Result.error(\"参数不识别！\");\n\t\t}\n\t\tfor (String id : Arrays.asList(ids.split(SymbolConstant.COMMA))) {\n\t\t\tQuartzJob job = quartzJobService.getById(id);\n\t\t\tquartzJobService.deleteAndStopJob(job);\n\t\t}\n        return Result.ok(\"删除定时任务成功!\");\n\t}\n\n\t/**\n\t * 暂停定时任务\n\t * \n\t * @param id\n\t * @return\n\t */\n\t//@RequiresRoles(\"admin\")\n    @RequiresPermissions(\"system:quartzJob:pause\")\n\t@GetMapping(value = \"/pause\")\n\t@Operation(summary = \"停止定时任务\")\n\tpublic Result<Object> pauseJob(@RequestParam(name = \"id\") String id) {\n\t\tQuartzJob job = quartzJobService.getById(id);\n\t\tif (job == null) {\n\t\t\treturn Result.error(\"定时任务不存在！\");\n\t\t}\n\t\tquartzJobService.pause(job);\n\t\treturn Result.ok(\"停止定时任务成功\");\n\t}\n\n\t/**\n\t * 启动定时任务\n\t * \n\t * @param id\n\t * @return\n\t */\n\t//@RequiresRoles(\"admin\")\n    @RequiresPermissions(\"system:quartzJob:resume\")\n\t@GetMapping(value = \"/resume\")\n\t@Operation(summary = \"启动定时任务\")\n\tpublic Result<Object> resumeJob(@RequestParam(name = \"id\") String id) {\n\t\tQuartzJob job = quartzJobService.getById(id);\n\t\tif (job == null) {\n\t\t\treturn Result.error(\"定时任务不存在！\");\n\t\t}\n\t\tquartzJobService.resumeJob(job);\n\t\t//scheduler.resumeJob(JobKey.jobKey(job.getJobClassName().trim()));\n\t\treturn Result.ok(\"启动定时任务成功\");\n\t}\n\n\t/**\n\t * 通过id查询\n\t * \n\t * @param id\n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryById\", method = RequestMethod.GET)\n\tpublic Result<?> queryById(@RequestParam(name = \"id\", required = true) String id) {\n\t\tQuartzJob quartzJob = quartzJobService.getById(id);\n        return Result.ok(quartzJob);\n\t}\n\n\t/**\n\t * 导出excel\n\t * \n\t * @param request\n\t * @param quartzJob\n\t */\n\t@RequestMapping(value = \"/exportXls\")\n\tpublic ModelAndView exportXls(HttpServletRequest request, QuartzJob quartzJob) {\n\t\t// Step.1 组装查询条件\n\t\tQueryWrapper<QuartzJob> queryWrapper = QueryGenerator.initQueryWrapper(quartzJob, request.getParameterMap());\n\t\t// 过滤选中数据\n\t\tString selections = request.getParameter(\"selections\");\n\t\tif (oConvertUtils.isNotEmpty(selections)) {\n\t\t\tList<String> selectionList = Arrays.asList(selections.split(\",\"));\n\t\t\tqueryWrapper.in(\"id\",selectionList);\n\t\t}\n\t\t// Step.2 AutoPoi 导出Excel\n\t\tModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n\t\tList<QuartzJob> pageList = quartzJobService.list(queryWrapper);\n\t\t// 导出文件名称\n\t\tmv.addObject(NormalExcelConstants.FILE_NAME, \"定时任务列表\");\n\t\tmv.addObject(NormalExcelConstants.CLASS, QuartzJob.class);\n        //获取当前登录用户\n        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\tmv.addObject(NormalExcelConstants.PARAMS, new ExportParams(\"定时任务列表数据\", \"导出人:\"+user.getRealname(), \"导出信息\"));\n        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);\n\t\treturn mv;\n\t}\n\n\t/**\n\t * 通过excel导入数据\n\t * \n\t * @param request\n\t * @param response\n\t * @return\n\t */\n\t@RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n\tpublic Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) throws IOException {\n\t\tMultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n\t\tMap<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n\t\t// 错误信息\n\t\tList<String> errorMessage = new ArrayList<>();\n\t\tint successLines = 0, errorLines = 0;\n\t\tfor (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n            // 获取上传文件对象\n\t\t\tMultipartFile file = entity.getValue();\n\t\t\tImportParams params = new ImportParams();\n\t\t\tparams.setTitleRows(2);\n\t\t\tparams.setHeadRows(1);\n\t\t\tparams.setNeedSave(true);\n\t\t\ttry {\n\t\t\t\tList<QuartzJob> listQuartzJobs = ExcelImportUtil.importExcel(file.getInputStream(), QuartzJob.class, params);\n\t\t\t\t//add-begin-author:taoyan date:20210909 for:导入定时任务，并不会被启动和调度，需要手动点击启动，才会加入调度任务中 #2986\n\t\t\t\tfor(QuartzJob job: listQuartzJobs){\n\t\t\t\t\tjob.setStatus(CommonConstant.STATUS_DISABLE);\n\t\t\t\t}\n\t\t\t\tList<String> list = ImportExcelUtil.importDateSave(listQuartzJobs, IQuartzJobService.class, errorMessage,CommonConstant.SQL_INDEX_UNIQ_JOB_CLASS_NAME);\n\t\t\t\t//add-end-author:taoyan date:20210909 for:导入定时任务，并不会被启动和调度，需要手动点击启动，才会加入调度任务中 #2986\n\t\t\t\terrorLines+=list.size();\n\t\t\t\tsuccessLines+=(listQuartzJobs.size()-errorLines);\n\t\t\t} catch (Exception e) {\n\t\t\t\tlog.error(e.getMessage(), e);\n\t\t\t\treturn Result.error(\"文件导入失败！\");\n\t\t\t} finally {\n\t\t\t\ttry {\n\t\t\t\t\tfile.getInputStream().close();\n\t\t\t\t} catch (IOException e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn ImportExcelUtil.imporReturnRes(errorLines,successLines,errorMessage);\n\t}\n\n\t/**\n\t * 立即执行\n\t * @param id\n\t * @return\n\t */\n\t//@RequiresRoles(\"admin\")\n    @RequiresPermissions(\"system:quartzJob:execute\")\n\t@GetMapping(\"/execute\")\n\tpublic Result<?> execute(@RequestParam(name = \"id\", required = true) String id) {\n\t\tQuartzJob quartzJob = quartzJobService.getById(id);\n\t\tif (quartzJob == null) {\n\t\t\treturn Result.error(\"未找到对应实体\");\n\t\t}\n\t\ttry {\n\t\t\tquartzJobService.execute(quartzJob);\n\t\t} catch (Exception e) {\n\t\t\t//e.printStackTrace();\n\t\t\tlog.info(\"定时任务 立即执行失败>>\"+e.getMessage());\n\t\t\treturn Result.error(\"执行失败!\");\n\t\t}\n\t\treturn Result.ok(\"执行成功!\");\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/entity/QuartzJob.java",
    "content": "package org.jeecg.modules.quartz.entity;\n\nimport java.io.Serializable;\n\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport lombok.Data;\n\n/**\n * @Description: 定时任务在线管理\n * @Author: jeecg-boot\n * @Date:  2019-01-02\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_quartz_job\")\npublic class QuartzJob implements Serializable {\n    private static final long serialVersionUID = 1L;\n    \n\t/**id*/\n\t@TableId(type = IdType.ASSIGN_ID)\n\tprivate java.lang.String id;\n\t/**创建人*/\n\tprivate java.lang.String createBy;\n\t/**创建时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate java.util.Date createTime;\n\t/**删除状态*/\n\tprivate java.lang.Integer delFlag;\n\t/**修改人*/\n\tprivate java.lang.String updateBy;\n\t/**修改时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate java.util.Date updateTime;\n\t/**任务类名*/\n\t@Excel(name=\"任务类名\",width=40)\n\tprivate java.lang.String jobClassName;\n\t/**cron表达式*/\n\t@Excel(name=\"cron表达式\",width=30)\n\tprivate java.lang.String cronExpression;\n\t/**参数*/\n\t@Excel(name=\"参数\",width=15)\n\tprivate java.lang.String parameter;\n\t/**描述*/\n\t@Excel(name=\"描述\",width=40)\n\tprivate java.lang.String description;\n\t/**状态 0正常 -1停止*/\n\t@Excel(name=\"状态\",width=15,dicCode=\"quartz_status\")\n\t@Dict(dicCode = \"quartz_status\")\n\tprivate java.lang.Integer status;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/job/AsyncJob.java",
    "content": "package org.jeecg.modules.quartz.job;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.util.DateUtils;\nimport org.quartz.*;\n\n/**\n * @Description: 同步定时任务测试\n *\n * 此处的同步是指 当定时任务的执行时间大于任务的时间间隔时\n * 会等待第一个任务执行完成才会走第二个任务\n *\n *\n * @author: taoyan\n * @date: 2020年06月19日\n */\n@PersistJobDataAfterExecution\n@DisallowConcurrentExecution\n@Slf4j\npublic class AsyncJob implements Job {\n\n    @Override\n    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {\n        log.info(\" --- 同步任务调度开始 --- \");\n        try {\n            //此处模拟任务执行时间 5秒  任务表达式配置为每秒执行一次：0/1 * * * * ? *\n            Thread.sleep(5000);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n        //测试发现 每5秒执行一次\n        log.info(\" --- 执行完毕，时间：\"+DateUtils.now()+\"---\");\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/job/SampleJob.java",
    "content": "package org.jeecg.modules.quartz.job;\n\nimport org.jeecg.common.util.DateUtils;\nimport org.quartz.Job;\nimport org.quartz.JobExecutionContext;\nimport org.quartz.JobExecutionException;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * 示例不带参定时任务\n * \n * @Author Scott\n */\n@Slf4j\npublic class SampleJob implements Job {\n\n\t@Override\n\tpublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {\n\t\tlog.info(\" Job Execution key：\"+jobExecutionContext.getJobDetail().getKey());\n\t\tlog.info(String.format(\" Jeecg-Boot 普通定时任务 SampleJob !  时间:\" + DateUtils.getTimestamp()));\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/job/SampleParamJob.java",
    "content": "package org.jeecg.modules.quartz.job;\n\nimport org.jeecg.common.util.DateUtils;\nimport org.quartz.Job;\nimport org.quartz.JobExecutionContext;\nimport org.quartz.JobExecutionException;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * 示例带参定时任务\n * \n * @Author Scott\n */\n@Slf4j\npublic class SampleParamJob implements Job {\n\n\t/**\n\t * 若参数变量名修改 QuartzJobController中也需对应修改\n\t */\n\tprivate String parameter;\n\n\tpublic void setParameter(String parameter) {\n\t\tthis.parameter = parameter;\n\t}\n\n\t@Override\n\tpublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {\n\t\tlog.info(\" Job Execution key：\"+jobExecutionContext.getJobDetail().getKey());\n\t\tlog.info( String.format(\"welcome %s! Jeecg-Boot 带参数定时任务 SampleParamJob !   时间:\" + DateUtils.now(), this.parameter));\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/mapper/QuartzJobMapper.java",
    "content": "package org.jeecg.modules.quartz.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.quartz.entity.QuartzJob;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: 定时任务在线管理\n * @Author: jeecg-boot\n * @Date:  2019-01-02\n * @Version: V1.0\n */\npublic interface QuartzJobMapper extends BaseMapper<QuartzJob> {\n\n    /**\n     * 根据jobClassName查询\n     * @param jobClassName 任务类名\n     * @return\n     */\n\tpublic List<QuartzJob> findByJobClassName(@Param(\"jobClassName\") String jobClassName);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/mapper/xml/QuartzJobMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.quartz.mapper.QuartzJobMapper\">\n\n\t<!-- 根据jobClassName查询 -->\n\t<select id=\"findByJobClassName\" resultType=\"org.jeecg.modules.quartz.entity.QuartzJob\">\n\t\tselect * from  sys_quartz_job  where job_class_name = #{jobClassName}\n\t</select>\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/service/IQuartzJobService.java",
    "content": "package org.jeecg.modules.quartz.service;\n\nimport java.util.List;\n\nimport org.jeecg.modules.quartz.entity.QuartzJob;\nimport org.quartz.SchedulerException;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * @Description: 定时任务在线管理\n * @Author: jeecg-boot\n * @Date: 2019-04-28\n * @Version: V1.1\n */\npublic interface IQuartzJobService extends IService<QuartzJob> {\n\n    /**\n     * 通过类名寻找定时任务\n     * @param jobClassName 类名\n     * @return List<QuartzJob>\n     */\n\tList<QuartzJob> findByJobClassName(String jobClassName);\n\n    /**\n     * 保存定时任务\n     * @param quartzJob\n     * @return boolean\n     */\n\tboolean saveAndScheduleJob(QuartzJob quartzJob);\n\n    /**\n     * 编辑定时任务\n     * @param quartzJob\n     * @return boolean\n     * @throws SchedulerException\n     */\n\tboolean editAndScheduleJob(QuartzJob quartzJob) throws SchedulerException;\n\n    /**\n     * 删除定时任务\n     * @param quartzJob\n     * @return boolean\n     */\n\tboolean deleteAndStopJob(QuartzJob quartzJob);\n\n    /**\n     * 恢复定时任务\n     * @param quartzJob\n     * @return\n     */\n\tboolean resumeJob(QuartzJob quartzJob);\n\n\t/**\n\t * 执行定时任务\n\t * @param quartzJob\n     * @throws Exception\n\t */\n\tvoid execute(QuartzJob quartzJob) throws Exception;\n\n\t/**\n\t * 暂停任务\n\t * @param quartzJob\n\t * @throws SchedulerException\n\t */\n\tvoid pause(QuartzJob quartzJob);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/service/impl/QuartzJobServiceImpl.java",
    "content": "package org.jeecg.modules.quartz.service.impl;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.util.DateUtils;\nimport org.jeecg.modules.quartz.entity.QuartzJob;\nimport org.jeecg.modules.quartz.mapper.QuartzJobMapper;\nimport org.jeecg.modules.quartz.service.IQuartzJobService;\nimport org.quartz.*;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * @Description: 定时任务在线管理\n * @Author: jeecg-boot\n * @Date: 2019-04-28\n * @Version: V1.1\n */\n@Slf4j\n@Service\npublic class QuartzJobServiceImpl extends ServiceImpl<QuartzJobMapper, QuartzJob> implements IQuartzJobService {\n\t@Autowired\n\tprivate QuartzJobMapper quartzJobMapper;\n\t@Autowired\n\tprivate Scheduler scheduler;\n\n\t/**\n\t * 立即执行的任务分组\n\t */\n\tprivate static final String JOB_TEST_GROUP = \"test_group\";\n\n\t@Override\n\tpublic List<QuartzJob> findByJobClassName(String jobClassName) {\n\t\treturn quartzJobMapper.findByJobClassName(jobClassName);\n\t}\n\n\t/**\n\t * 保存&启动定时任务\n\t */\n\t@Override\n\t@Transactional(rollbackFor = JeecgBootException.class)\n\tpublic boolean saveAndScheduleJob(QuartzJob quartzJob) {\n\t\t// DB设置修改\n\t\tquartzJob.setDelFlag(CommonConstant.DEL_FLAG_0);\n\t\tboolean success = this.save(quartzJob);\n\t\tif (success) {\n\t\t\tif (CommonConstant.STATUS_NORMAL.equals(quartzJob.getStatus())) {\n\t\t\t\t// 定时器添加\n\t\t\t\tthis.schedulerAdd(quartzJob.getId(), quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter());\n\t\t\t}\n\t\t}\n\t\treturn success;\n\t}\n\n\t/**\n\t * 恢复定时任务\n\t */\n\t@Override\n\t@Transactional(rollbackFor = JeecgBootException.class)\n\tpublic boolean resumeJob(QuartzJob quartzJob) {\n\t\tschedulerDelete(quartzJob.getId());\n\t\tschedulerAdd(quartzJob.getId(), quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter());\n\t\tquartzJob.setStatus(CommonConstant.STATUS_NORMAL);\n\t\treturn this.updateById(quartzJob);\n\t}\n\n\t/**\n\t * 编辑&启停定时任务\n\t * @throws SchedulerException \n\t */\n\t@Override\n\t@Transactional(rollbackFor = JeecgBootException.class)\n\tpublic boolean editAndScheduleJob(QuartzJob quartzJob) throws SchedulerException {\n\t\tif (CommonConstant.STATUS_NORMAL.equals(quartzJob.getStatus())) {\n\t\t\tschedulerDelete(quartzJob.getId());\n\t\t\tschedulerAdd(quartzJob.getId(), quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter());\n\t\t}else{\n\t\t\tscheduler.pauseJob(JobKey.jobKey(quartzJob.getId()));\n\t\t}\n\t\treturn this.updateById(quartzJob);\n\t}\n\n\t/**\n\t * 删除&停止删除定时任务\n\t */\n\t@Override\n\t@Transactional(rollbackFor = JeecgBootException.class)\n\tpublic boolean deleteAndStopJob(QuartzJob job) {\n\t\tschedulerDelete(job.getId());\n\t\tboolean ok = this.removeById(job.getId());\n\t\treturn ok;\n\t}\n\n\t@Override\n\tpublic void execute(QuartzJob quartzJob) throws Exception {\n\t\tString jobName = quartzJob.getJobClassName().trim();\n\t\tDate startDate = new Date();\n\t\tString ymd = DateUtils.date2Str(startDate,DateUtils.yyyymmddhhmmss.get());\n\t\tString identity =  jobName + ymd;\n\t\t//3秒后执行 只执行一次\n\t\t// 代码逻辑说明: 定时任务立即执行，延迟3秒改成0.1秒-------\n\t\tstartDate.setTime(startDate.getTime() + 100L);\n\t\t// 定义一个Trigger\n\t\tSimpleTrigger trigger = (SimpleTrigger)TriggerBuilder.newTrigger()\n\t\t\t\t.withIdentity(identity, JOB_TEST_GROUP)\n\t\t\t\t.startAt(startDate)\n\t\t\t\t.build();\n\t\t// 构建job信息\n\t\tJobDetail jobDetail = JobBuilder.newJob(getClass(jobName).getClass()).withIdentity(identity).usingJobData(\"parameter\", quartzJob.getParameter()).build();\n\t\t// 将trigger和 jobDetail 加入这个调度\n\t\tscheduler.scheduleJob(jobDetail, trigger);\n\t\t// 启动scheduler\n\t\tscheduler.start();\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = JeecgBootException.class)\n\tpublic void pause(QuartzJob quartzJob){\n\t\tschedulerDelete(quartzJob.getId());\n\t\tquartzJob.setStatus(CommonConstant.STATUS_DISABLE);\n\t\tthis.updateById(quartzJob);\n\t}\n\n\t/**\n\t * 添加定时任务\n\t *\n\t * @param jobClassName\n\t * @param cronExpression\n\t * @param parameter\n\t */\n\tprivate void schedulerAdd(String id, String jobClassName, String cronExpression, String parameter) {\n\t\ttry {\n\t\t\t// 启动调度器\n\t\t\tscheduler.start();\n\n\t\t\t// 构建job信息\n\t\t\tJobDetail jobDetail = JobBuilder.newJob(getClass(jobClassName).getClass()).withIdentity(id).usingJobData(\"parameter\", parameter).build();\n\n\t\t\t// 表达式调度构建器(即任务执行的时间)\n\t\t\tCronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);\n\n\t\t\t// 按新的cronExpression表达式构建一个新的trigger\n\t\t\tCronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(id).withSchedule(scheduleBuilder).build();\n\n\t\t\tscheduler.scheduleJob(jobDetail, trigger);\n\t\t} catch (SchedulerException e) {\n\t\t\tthrow new JeecgBootException(\"创建定时任务失败\", e);\n\t\t} catch (RuntimeException e) {\n\t\t\tthrow new JeecgBootException(e.getMessage(), e);\n\t\t}catch (Exception e) {\n\t\t\tthrow new JeecgBootException(\"后台找不到该类名：\" + jobClassName, e);\n\t\t}\n\t}\n\n\t/**\n\t * 删除定时任务\n\t * \n\t * @param id\n\t */\n\tprivate void schedulerDelete(String id) {\n\t\ttry {\n\t\t\tscheduler.pauseTrigger(TriggerKey.triggerKey(id));\n\t\t\tscheduler.unscheduleJob(TriggerKey.triggerKey(id));\n\t\t\tscheduler.deleteJob(JobKey.jobKey(id));\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\tthrow new JeecgBootException(\"删除定时任务失败\");\n\t\t}\n\t}\n\n\tprivate static Job getClass(String classname) throws Exception {\n\t\tClass<?> class1 = Class.forName(classname);\n\t\treturn (Job) class1.newInstance();\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/cache/AuthStateRedisCache.java",
    "content": "package org.jeecg.modules.system.cache;\n\nimport jakarta.annotation.PostConstruct;\nimport me.zhyd.oauth.cache.AuthCacheConfig;\nimport me.zhyd.oauth.cache.AuthStateCache;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.data.redis.core.ValueOperations;\n\nimport java.util.concurrent.TimeUnit;\n\n\npublic class AuthStateRedisCache implements AuthStateCache {\n\n    @Autowired\n    private RedisTemplate<String, String> redisTemplate;\n\n    private ValueOperations<String, String> valueOperations;\n\n    @PostConstruct\n    public void init() {\n        valueOperations = redisTemplate.opsForValue();\n    }\n\n    /**\n     * 存入缓存，默认3分钟\n     *\n     * @param key   缓存key\n     * @param value 缓存内容\n     */\n    @Override\n    public void cache(String key, String value) {\n        valueOperations.set(key, value, AuthCacheConfig.timeout, TimeUnit.MILLISECONDS);\n    }\n\n    /**\n     * 存入缓存\n     *\n     * @param key     缓存key\n     * @param value   缓存内容\n     * @param timeout 指定缓存过期时间（毫秒）\n     */\n    @Override\n    public void cache(String key, String value, long timeout) {\n        valueOperations.set(key, value, timeout, TimeUnit.MILLISECONDS);\n    }\n\n    /**\n     * 获取缓存内容\n     *\n     * @param key 缓存key\n     * @return 缓存内容\n     */\n    @Override\n    public String get(String key) {\n        return valueOperations.get(key);\n    }\n\n    /**\n     * 是否存在key，如果对应key的value值已过期，也返回false\n     *\n     * @param key 缓存key\n     * @return true：存在key，并且value没过期；false：key不存在或者已过期\n     */\n    @Override\n    public boolean containsKey(String key) {\n        return redisTemplate.hasKey(key);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/config/AuthStateConfiguration.java",
    "content": "package org.jeecg.modules.system.config;\n\nimport me.zhyd.oauth.cache.AuthStateCache;\nimport org.jeecg.modules.system.cache.AuthStateRedisCache;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\npublic class AuthStateConfiguration {\n\n    @Bean\n    public AuthStateCache authStateCache() {\n        return new AuthStateRedisCache();\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/constant/DefIndexConst.java",
    "content": "package org.jeecg.modules.system.constant;\n\n/**\n * 默认首页常量\n */\npublic interface DefIndexConst {\n\n    /**\n     * 默认首页的roleCode\n     */\n    String DEF_INDEX_ALL = \"DEF_INDEX_ALL\";\n\n    /**\n     * 默认首页的缓存key\n     */\n    String CACHE_KEY = \"sys:cache:def_index\";\n    /**\n     * 缓存默认首页的类型前缀\n     */\n    String CACHE_TYPE = \"sys:cache:home_type::\";\n    /**\n     * 默认首页类型\n     */\n    String HOME_TYPE_SYSTEM = \"system\";\n    String HOME_TYPE_PERSONAL = \"personal\";\n    String HOME_TYPE_MENU = \"menuHome\";\n\n    /**\n     * 默认首页的初始值\n     */\n    String DEF_INDEX_NAME = \"首页\";\n    String DEF_INDEX_URL = \"/dashboard/analysis\";\n    String DEF_INDEX_COMPONENT = \"dashboard/Analysis\";\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/CommonController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport com.alibaba.fastjson.JSONObject;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.constant.enums.FileTypeEnum;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.util.CommonUtils;\nimport org.jeecg.common.util.filter.SsrfFileTypeFilter;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.util.HttpFileToMultipartFileUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.util.AntPathMatcher;\nimport org.springframework.util.FileCopyUtils;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport org.springframework.web.servlet.HandlerMapping;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.*;\n\n/**\n * <p>\n * 用户表 前端控制器\n * </p>\n *\n * @Author scott\n * @since 2018-12-20\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/sys/common\")\npublic class CommonController {\n\n    @Value(value = \"${jeecg.path.upload}\")\n    private String uploadpath;\n\n    /**\n     * 本地：local minio：minio 阿里：alioss\n     */\n    @Value(value=\"${jeecg.uploadType}\")\n    private String uploadType;\n\n    /**\n     * @Author 政辉\n     * @return\n     */\n    @GetMapping(\"/403\")\n    public Result<?> noauth()  {\n        return Result.error(\"没有权限，请联系管理员分配权限！\");\n    }\n\n    /**\n     * 文件上传统一方法\n     * @param request\n     * @param response\n     * @return\n     */\n    @PostMapping(value = \"/upload\")\n    public Result<?> upload(HttpServletRequest request, HttpServletResponse response) throws Exception {\n        Result<?> result = new Result<>();\n        String savePath = \"\";\n        String bizPath = request.getParameter(\"biz\");\n        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n        MultipartFile file = multipartRequest.getFile(\"file\");\n        \n        // 文件安全校验，防止上传漏洞文件\n        SsrfFileTypeFilter.checkUploadFileType(file, bizPath);\n  \n        if (oConvertUtils.isEmpty(bizPath)) {\n            bizPath = CommonConstant.UPLOAD_TYPE_OSS.equals(uploadType) ? \"upload\" : \"\";\n        }\n        if(CommonConstant.UPLOAD_TYPE_LOCAL.equals(uploadType)){\n            savePath = this.uploadLocal(file,bizPath);\n        }else{\n            savePath = CommonUtils.upload(file, bizPath, uploadType);\n        }\n        if(oConvertUtils.isNotEmpty(savePath)){\n            \n            //添加到文件表\n            String orgName = file.getOriginalFilename();\n            // 获取文件名\n            orgName = CommonUtils.getFileName(orgName);\n            String type = orgName.substring(orgName.lastIndexOf(SymbolConstant.SPOT));\n            FileTypeEnum fileType = FileTypeEnum.getByType(type);\n            result.setMessage(savePath);\n            result.setSuccess(true);\n        }else {\n            result.setMessage(\"上传失败！\");\n            result.setSuccess(false);\n        }\n        return result;\n    }\n\n    /**\n     * 本地文件上传\n     * @param mf 文件\n     * @param bizPath  自定义路径\n     * @return\n     */\n    private String uploadLocal(MultipartFile mf,String bizPath){\n        try {\n            String ctxPath = uploadpath;\n            String fileName = null;\n            File file = new File(ctxPath + File.separator + bizPath + File.separator );\n            if (!file.exists()) {\n                // 创建文件根目录\n                file.mkdirs();\n            }\n            // 获取文件名\n            String orgName = mf.getOriginalFilename();\n            orgName = CommonUtils.getFileName(orgName);\n            if(orgName.indexOf(SymbolConstant.SPOT)!=-1){\n                fileName = orgName.substring(0, orgName.lastIndexOf(\".\")) + \"_\" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf(\".\"));\n            }else{\n                fileName = orgName+ \"_\" + System.currentTimeMillis();\n            }\n            String savePath = file.getPath() + File.separator + fileName;\n            File savefile = new File(savePath);\n            FileCopyUtils.copy(mf.getBytes(), savefile);\n            String dbpath = null;\n            if(oConvertUtils.isNotEmpty(bizPath)){\n                dbpath = bizPath + File.separator + fileName;\n            }else{\n                dbpath = fileName;\n            }\n            if (dbpath.contains(SymbolConstant.DOUBLE_BACKSLASH)) {\n                dbpath = dbpath.replace(SymbolConstant.DOUBLE_BACKSLASH, SymbolConstant.SINGLE_SLASH);\n            }\n            return dbpath;\n        } catch (IOException e) {\n            log.error(e.getMessage(), e);\n        }\n        return \"\";\n    }\n\n//\t@PostMapping(value = \"/upload2\")\n//\tpublic Result<?> upload2(HttpServletRequest request, HttpServletResponse response) {\n//\t\tResult<?> result = new Result<>();\n//\t\ttry {\n//\t\t\tString ctxPath = uploadpath;\n//\t\t\tString fileName = null;\n//\t\t\tString bizPath = \"files\";\n//\t\t\tString tempBizPath = request.getParameter(\"biz\");\n//\t\t\tif(oConvertUtils.isNotEmpty(tempBizPath)){\n//\t\t\t\tbizPath = tempBizPath;\n//\t\t\t}\n//\t\t\tString nowday = new SimpleDateFormat(\"yyyyMMdd\").format(new Date());\n//\t\t\tFile file = new File(ctxPath + File.separator + bizPath + File.separator + nowday);\n//\t\t\tif (!file.exists()) {\n//\t\t\t\tfile.mkdirs();// 创建文件根目录\n//\t\t\t}\n//\t\t\tMultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n//\t\t\tMultipartFile mf = multipartRequest.getFile(\"file\");// 获取上传文件对象\n//\t\t\tString orgName = mf.getOriginalFilename();// 获取文件名\n//\t\t\tfileName = orgName.substring(0, orgName.lastIndexOf(\".\")) + \"_\" + System.currentTimeMillis() + orgName.substring(orgName.indexOf(\".\"));\n//\t\t\tString savePath = file.getPath() + File.separator + fileName;\n//\t\t\tFile savefile = new File(savePath);\n//\t\t\tFileCopyUtils.copy(mf.getBytes(), savefile);\n//\t\t\tString dbpath = bizPath + File.separator + nowday + File.separator + fileName;\n//\t\t\tif (dbpath.contains(\"\\\\\")) {\n//\t\t\t\tdbpath = dbpath.replace(\"\\\\\", \"/\");\n//\t\t\t}\n//\t\t\tresult.setMessage(dbpath);\n//\t\t\tresult.setSuccess(true);\n//\t\t} catch (IOException e) {\n//\t\t\tresult.setSuccess(false);\n//\t\t\tresult.setMessage(e.getMessage());\n//\t\t\tlog.error(e.getMessage(), e);\n//\t\t}\n//\t\treturn result;\n//\t}\n\n    /**\n     * 预览图片&下载文件\n     * 请求地址：http://localhost:8080/common/static/{user/20190119/e1fe9925bc315c60addea1b98eb1cb1349547719_1547866868179.jpg}\n     *\n     * @param request\n     * @param response\n     */\n    @GetMapping(value = \"/static/**\")\n    public void view(HttpServletRequest request, HttpServletResponse response) {\n        // ISO-8859-1 ==> UTF-8 进行编码转换\n        String imgPath = extractPathFromPattern(request);\n        if(oConvertUtils.isEmpty(imgPath) || CommonConstant.STRING_NULL.equals(imgPath)){\n            return;\n        }\n        \n        try {\n            imgPath = imgPath.replace(\"..\", \"\").replace(\"../\",\"\");\n            if (imgPath.endsWith(SymbolConstant.COMMA)) {\n                imgPath = imgPath.substring(0, imgPath.length() - 1);\n            }\n            // 代码逻辑说明: 检查下载文件类型--------------\n            SsrfFileTypeFilter.checkDownloadFileType(imgPath);\n\n            String filePath = uploadpath + File.separator + imgPath;\n            File file = new File(filePath);\n            if(!file.exists()){\n                response.setStatus(404);\n                log.warn(\"文件[\"+imgPath+\"]不存在..\");\n                return;\n                //throw new RuntimeException();\n            }\n            // 设置强制下载不打开\n            response.setContentType(\"application/force-download\");\n            response.addHeader(\"Content-Disposition\", \"attachment;fileName=\" + new String(file.getName().getBytes(\"UTF-8\"),\"iso-8859-1\"));\n            \n            // 结合 StreamingResponseBody 的流式写法\n            try (InputStream inputStream = new BufferedInputStream(new FileInputStream(file));\n                 OutputStream outputStream = response.getOutputStream()) {\n                byte[] buf = new byte[8192];\n                int len;\n                while ((len = inputStream.read(buf)) != -1) {\n                    outputStream.write(buf, 0, len);\n                }\n                outputStream.flush();\n            }\n        } catch (IOException e) {\n            log.error(\"预览文件失败\" + e.getMessage());\n            response.setStatus(404);\n            e.printStackTrace();\n        }\n\n    }\n\n//\t/**\n//\t * 下载文件\n//\t * 请求地址：http://localhost:8080/common/download/{user/20190119/e1fe9925bc315c60addea1b98eb1cb1349547719_1547866868179.jpg}\n//\t *\n//\t * @param request\n//\t * @param response\n//\t * @throws Exception\n//\t */\n//\t@GetMapping(value = \"/download/**\")\n//\tpublic void download(HttpServletRequest request, HttpServletResponse response) throws Exception {\n//\t\t// ISO-8859-1 ==> UTF-8 进行编码转换\n//\t\tString filePath = extractPathFromPattern(request);\n//\t\t// 其余处理略\n//\t\tInputStream inputStream = null;\n//\t\tOutputStream outputStream = null;\n//\t\ttry {\n//\t\t\tfilePath = filePath.replace(\"..\", \"\");\n//\t\t\tif (filePath.endsWith(\",\")) {\n//\t\t\t\tfilePath = filePath.substring(0, filePath.length() - 1);\n//\t\t\t}\n//\t\t\tString localPath = uploadpath;\n//\t\t\tString downloadFilePath = localPath + File.separator + filePath;\n//\t\t\tFile file = new File(downloadFilePath);\n//\t         if (file.exists()) {\n//\t         \tresponse.setContentType(\"application/force-download\");// 设置强制下载不打开            \n//\t \t\t\tresponse.addHeader(\"Content-Disposition\", \"attachment;fileName=\" + new String(file.getName().getBytes(\"UTF-8\"),\"iso-8859-1\"));\n//\t \t\t\tinputStream = new BufferedInputStream(new FileInputStream(file));\n//\t \t\t\toutputStream = response.getOutputStream();\n//\t \t\t\tbyte[] buf = new byte[1024];\n//\t \t\t\tint len;\n//\t \t\t\twhile ((len = inputStream.read(buf)) > 0) {\n//\t \t\t\t\toutputStream.write(buf, 0, len);\n//\t \t\t\t}\n//\t \t\t\tresponse.flushBuffer();\n//\t         }\n//\n//\t\t} catch (Exception e) {\n//\t\t\tlog.info(\"文件下载失败\" + e.getMessage());\n//\t\t\t// e.printStackTrace();\n//\t\t} finally {\n//\t\t\tif (inputStream != null) {\n//\t\t\t\ttry {\n//\t\t\t\t\tinputStream.close();\n//\t\t\t\t} catch (IOException e) {\n//\t\t\t\t\te.printStackTrace();\n//\t\t\t\t}\n//\t\t\t}\n//\t\t\tif (outputStream != null) {\n//\t\t\t\ttry {\n//\t\t\t\t\toutputStream.close();\n//\t\t\t\t} catch (IOException e) {\n//\t\t\t\t\te.printStackTrace();\n//\t\t\t\t}\n//\t\t\t}\n//\t\t}\n//\n//\t}\n\n    /**\n     * @功能：pdf预览Iframe\n     * @param modelAndView\n     * @return\n     */\n    @RequestMapping(\"/pdf/pdfPreviewIframe\")\n    public ModelAndView pdfPreviewIframe(ModelAndView modelAndView) {\n        modelAndView.setViewName(\"pdfPreviewIframe\");\n        return modelAndView;\n    }\n\n    /**\n     *  把指定URL后的字符串全部截断当成参数\n     *  这么做是为了防止URL中包含中文或者特殊字符（/等）时，匹配不了的问题\n     * @param request\n     * @return\n     */\n    private static String extractPathFromPattern(final HttpServletRequest request) {\n        String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);\n        String bestMatchPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);\n        return new AntPathMatcher().extractPathWithinPattern(bestMatchPattern, path);\n    }\n\n    /**\n     * 根据网路图片地址上传到服务器\n     * @param jsonObject\n     * @param request\n     * @return\n     */\n    @PostMapping(\"/uploadImgByHttp\")\n    public Result<String> uploadImgByHttp(@RequestBody JSONObject jsonObject, HttpServletRequest request){\n        String fileUrl = oConvertUtils.getString(jsonObject.get(\"fileUrl\"));\n        String filename = oConvertUtils.getString(jsonObject.get(\"filename\"));\n        String bizPath = oConvertUtils.getString(jsonObject.get(\"bizPath\"));\n        try {\n            String savePath = \"\";\n            MultipartFile file = HttpFileToMultipartFileUtil.httpFileToMultipartFile(fileUrl, filename);\n            // 文件安全校验，防止上传漏洞文件\n            SsrfFileTypeFilter.checkUploadFileType(file, bizPath);\n            if (oConvertUtils.isEmpty(bizPath)) {\n                bizPath = CommonConstant.UPLOAD_TYPE_OSS.equals(uploadType) ? \"upload\" : \"\";\n            }\n            if(CommonConstant.UPLOAD_TYPE_LOCAL.equals(uploadType)){\n                savePath = this.uploadLocal(file,bizPath);\n            }else{\n                savePath = CommonUtils.upload(file, bizPath, uploadType);\n            }\n            return Result.OK(savePath);\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return Result.error(e.getMessage());\n        }\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/DuplicateCheckController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.modules.system.model.DuplicateCheckVo;\nimport org.jeecg.modules.system.service.ISysDictService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport jakarta.servlet.http.HttpServletRequest;\n\n/**\n * @Title: DuplicateCheckAction\n * @Description: 重复校验工具\n * @Author 张代浩\n * @Date 2019-03-25\n * @Version V1.0\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/sys/duplicate\")\n@Tag(name=\"重复校验\")\npublic class DuplicateCheckController {\n\n\t@Autowired\n\tISysDictService sysDictService;\n\n\t/**\n\t * 校验数据是否在系统中是否存在\n\t * \n\t * @return\n\t */\n\t@RequestMapping(value = \"/check\", method = RequestMethod.GET)\n\t@Operation(summary=\"重复校验接口\")\n\tpublic Result<String> doDuplicateCheck(DuplicateCheckVo duplicateCheckVo, HttpServletRequest request) {\n\t\tlog.debug(\"----duplicate check------：\"+ duplicateCheckVo.toString());\n\t\t\n\t\t// 1.填值为空，直接返回\n\t\tif(StringUtils.isEmpty(duplicateCheckVo.getFieldVal())){\n\t\t\tResult rs = new Result();\n\t\t\trs.setCode(500);\n\t\t\trs.setSuccess(true);\n\t\t\trs.setMessage(\"数据为空,不作处理！\");\n\t\t\treturn rs;\n\t\t}\n\t\t\n\t\t// 2.返回结果\n\t\tif (sysDictService.duplicateCheckData(duplicateCheckVo)) {\n\t\t\t// 该值可用\n\t\t\treturn Result.ok(\"该值可用！\");\n\t\t} else {\n\t\t\t// 该值不可用\n\t\t\tlog.info(\"该值不可用，系统中已存在！\");\n\t\t\treturn Result.error(\"该值不可用，系统中已存在！\");\n\t\t}\n\t}\n\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport cn.hutool.core.util.RandomUtil;\nimport com.alibaba.fastjson.JSONObject;\nimport com.aliyuncs.exceptions.ClientException;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.IdWorker;\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.SecurityUtils;\nimport org.apache.shiro.authz.annotation.RequiresRoles;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CacheConstant;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.constant.enums.DySmsEnum;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.*;\nimport org.jeecg.common.util.encryption.AesEncryptUtil;\nimport org.jeecg.common.util.encryption.EncryptedString;\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.jeecg.config.shiro.IgnoreAuth;\nimport org.jeecg.modules.base.service.BaseCommonService;\nimport org.jeecg.modules.system.entity.SysDepart;\nimport org.jeecg.modules.system.entity.SysRoleIndex;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.model.SysLoginModel;\nimport org.jeecg.modules.system.service.*;\nimport org.jeecg.modules.system.service.impl.SysBaseApiImpl;\nimport org.jeecg.modules.system.util.RandImageUtil;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.*;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.SynchronousQueue;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * @Author scott\n * @since 2018-12-17\n */\n@RestController\n@RequestMapping(\"/sys\")\n@Tag(name=\"用户登录\")\n@Slf4j\npublic class LoginController {\n\t@Autowired\n\tprivate ISysUserService sysUserService;\n\t@Autowired\n\tprivate ISysPermissionService sysPermissionService;\n\t@Autowired\n\tprivate SysBaseApiImpl sysBaseApi;\n\t@Autowired\n\tprivate ISysLogService logService;\n\t@Autowired\n    private RedisUtil redisUtil;\n\t@Autowired\n    private ISysDepartService sysDepartService;\n\t@Autowired\n    private ISysDictService sysDictService;\n\t@Resource\n\tprivate BaseCommonService baseCommonService;\n\t@Autowired\n\tprivate JeecgBaseConfig jeecgBaseConfig;\n\t\n\tprivate final String BASE_CHECK_CODES = \"qwertyuiplkjhgfdsazxcvbnmQWERTYUPLKJHGFDSAZXCVBNM1234567890\";\n\t/**\n\t * 线程池用于异步发送纪要\n\t */\n\tpublic static ExecutorService cachedThreadPool = new ShiroThreadPoolExecutor(0, 1024, 60L, TimeUnit.SECONDS, new SynchronousQueue<>());\n\n\t\n\n\t@Operation(summary=\"登录接口\")\n\t@RequestMapping(value = \"/login\", method = RequestMethod.POST)\n\tpublic Result<JSONObject> login(@RequestBody SysLoginModel sysLoginModel, HttpServletRequest request){\n\t\tResult<JSONObject> result = new Result<>();\n\t\tString username = sysLoginModel.getUsername();\n\t\t// 密码加密传输(尝试 AES解密，失败视为明文)\n\t\tString password  = AesEncryptUtil.resolvePassword(sysLoginModel.getPassword());\n\t\tlog.debug(\"登录密码，原始密码:{}，解密密码:{}\" , sysLoginModel.getPassword(), password);\n\n\t\t//step.1 登录失败超出次数5次锁定用户10分钟\n\t\tif(isLoginFailOvertimes(username)){\n\t\t\treturn result.error500(\"该用户登录失败次数过多，请于10分钟后再次登录！\");\n\t\t}\n\n\t\t// step.2 验证码check\n        String realKey = validateCaptcha(sysLoginModel, result);\n        if (realKey == null) {\n            return result;\n        }\n\t\t\n\t\t// step.3 校验用户是否存在且有效\n\t\tLambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();\n\t\tqueryWrapper.eq(SysUser::getUsername,username);\n\t\tSysUser sysUser = sysUserService.getOne(queryWrapper);\n\t\tresult = sysUserService.checkUserIsEffective(sysUser);\n\t\tif(!result.isSuccess()) {\n\t\t\treturn result;\n\t\t}\n\n\t\t// step.4 校验用户名或密码是否正确\n\t\tString userpassword = PasswordUtil.encrypt(username, password, sysUser.getSalt());\n\t\tString syspassword = sysUser.getPassword();\n\t\tif (!syspassword.equals(userpassword)) {\n\t\t\taddLoginFailOvertimes(username);\n\t\t\tresult.error500(\"用户名或密码错误\");\n\t\t\treturn result;\n\t\t}\n\n\t\t// step.5 登录成功获取用户信息\n\t\tString loginOrgCode = sysLoginModel.getLoginOrgCode();\n\t\tsysUser.setLoginOrgCode(loginOrgCode);\n\t\tuserInfo(sysUser, result, request, CommonConstant.CLIENT_TYPE_PC);\n\n\t\t// step.6  登录成功删除验证码\n\t\tredisUtil.del(realKey);\n\t\tredisUtil.del(CommonConstant.LOGIN_FAIL + username);\n\n\t\t// step.7 记录用户登录日志\n\t\tLoginUser loginUser = new LoginUser();\n\t\tBeanUtils.copyProperties(sysUser, loginUser);\n\t\tbaseCommonService.addLog(\"用户名: \" + username + \",登录成功！\", CommonConstant.LOG_TYPE_1, null,loginUser);\n\t\treturn result;\n\t}\n\n\n\t/**\n\t * 【vue3专用】获取用户信息\n\t */\n\t@GetMapping(\"/user/getUserInfo\")\n\tpublic Result<JSONObject> getUserInfo(HttpServletRequest request){\n\t\tlong start = System.currentTimeMillis();\n\t\tResult<JSONObject> result = new Result<JSONObject>();\n\t\tString  username = JwtUtil.getUserNameByToken(request);\n\t\tif(oConvertUtils.isNotEmpty(username)) {\n\t\t\t// 根据用户名查询用户信息\n\t\t\tSysUser sysUser = sysUserService.getUserByName(username);\n\t\t\tJSONObject obj=new JSONObject();\n\t\t\tlog.debug(\"1 获取用户信息耗时（用户基础信息）\" + (System.currentTimeMillis() - start) + \"毫秒\");\n\n\t\t\t// 代码逻辑说明: vue3前端，支持自定义首页-----------\n\t\t\tString vue3Version = request.getHeader(CommonConstant.VERSION);\n\t\t\tSysRoleIndex roleIndex = sysUserService.getDynamicIndexByUserRole(username, vue3Version);\n\t\t\tif (oConvertUtils.isNotEmpty(vue3Version) && roleIndex != null && oConvertUtils.isNotEmpty(roleIndex.getUrl())) {\n\t\t\t\tString homePath = roleIndex.getUrl();\n\t\t\t\tif (!homePath.startsWith(SymbolConstant.SINGLE_SLASH)) {\n\t\t\t\t\thomePath = SymbolConstant.SINGLE_SLASH + homePath;\n\t\t\t\t}\n\t\t\t\tsysUser.setHomePath(homePath);\n\t\t\t}\n\t\t\tlog.debug(\"2 获取用户信息耗时 (首页面配置)\" + (System.currentTimeMillis() - start) + \"毫秒\");\n\t\t\t\n\t\t\tobj.put(\"userInfo\",sysUser);\n\t\t\tobj.put(\"sysAllDictItems\", sysDictService.queryAllDictItems());\n\t\t\tlog.debug(\"3 获取用户信息耗时 (字典数据)\" + (System.currentTimeMillis() - start) + \"毫秒\");\n\t\t\t\n\t\t\tresult.setResult(obj);\n\t\t\tresult.success(\"\");\n\t\t}\n\t\tlog.debug(\"end 获取用户信息耗时 \" + (System.currentTimeMillis() - start) + \"毫秒\");\n\t\treturn result;\n\n\t}\n\t\n\t/**\n\t * 退出登录\n\t * @param request\n\t * @param response\n\t * @return\n\t */\n\t@RequestMapping(value = \"/logout\")\n\tpublic Result<Object> logout(HttpServletRequest request,HttpServletResponse response) {\n\t\t//用户退出逻辑\n\t    String token = request.getHeader(CommonConstant.X_ACCESS_TOKEN);\n\t    if(oConvertUtils.isEmpty(token)) {\n\t    \treturn Result.error(\"退出登录失败！\");\n\t    }\n\t    String username = JwtUtil.getUsername(token);\n\t\tLoginUser sysUser = sysBaseApi.getUserByName(username);\n\t    if(sysUser!=null) {\n\t\t\tasyncClearLogoutCache(token, sysUser); // 异步清理\n\t\t\tSecurityUtils.getSubject().logout();\n\t    \treturn Result.ok(\"退出登录成功！\");\n\t    }else {\n\t    \treturn Result.error(\"Token无效!\");\n\t    }\n\t}\n\n\t/**\n\t * 清理用户缓存\n\t * \n\t * @param token\n\t * @param sysUser\n\t */\n\tprivate void asyncClearLogoutCache(String token, LoginUser sysUser) {\n\t\tcachedThreadPool.execute(()->{\n\t\t\t//清空用户登录Token缓存\n\t\t\tredisUtil.del(CommonConstant.PREFIX_USER_TOKEN + token);\n\t\t\t//清空用户登录Shiro权限缓存\n\t\t\tredisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + sysUser.getId());\n\t\t\t//清空用户的缓存信息（包括部门信息），例如sys:cache:user::<username>\n\t\t\tredisUtil.del(String.format(\"%s::%s\", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername()));\n\t\t\t//清空是否允许同一账号多地同时登录缓存（PC端和APP端）\n\t\t\tredisUtil.del(CommonConstant.PREFIX_USER_TOKEN_PC + sysUser.getUsername());\n\t\t\tredisUtil.del(CommonConstant.PREFIX_USER_TOKEN_APP + sysUser.getUsername());\n\t\t\tredisUtil.del(CommonConstant.PREFIX_USER_TOKEN_PHONE + sysUser.getUsername());\n\t\t\tbaseCommonService.addLog(\"用户名: \"+sysUser.getRealname()+\",退出成功！\", CommonConstant.LOG_TYPE_1, null, sysUser);\n\t\t\tlog.debug(\"【退出成功操作】异步处理，退出后，清理用户缓存： \"+sysUser.getRealname());\n\t\t});\n\t}\n\t\n\t/**\n\t * 获取访问量\n\t * @return\n\t */\n\t@GetMapping(\"loginfo\")\n\tpublic Result<JSONObject> loginfo() {\n\t\tResult<JSONObject> result = new Result<JSONObject>();\n\t\tJSONObject obj = new JSONObject();\n\t\t// 获取一天的开始和结束时间\n\t\tCalendar calendar = new GregorianCalendar();\n\t\tcalendar.set(Calendar.HOUR_OF_DAY, 0);\n\t\tcalendar.set(Calendar.MINUTE, 0);\n\t\tcalendar.set(Calendar.SECOND, 0);\n\t\tcalendar.set(Calendar.MILLISECOND, 0);\n\t\tDate dayStart = calendar.getTime();\n\t\tcalendar.add(Calendar.DATE, 1);\n\t\tDate dayEnd = calendar.getTime();\n\t\t// 获取系统访问记录\n\t\tLong totalVisitCount = logService.findTotalVisitCount();\n\t\tobj.put(\"totalVisitCount\", totalVisitCount);\n\t\tLong todayVisitCount = logService.findTodayVisitCount(dayStart,dayEnd);\n\t\tobj.put(\"todayVisitCount\", todayVisitCount);\n\t\tLong todayIp = logService.findTodayIp(dayStart,dayEnd);\n\t\tobj.put(\"todayIp\", todayIp);\n\t\tresult.setResult(obj);\n\t\tresult.success(\"登录成功\");\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * 获取访问量\n\t * @return\n\t */\n\t@GetMapping(\"/visitInfo\")\n\tpublic Result<List<Map<String,Object>>> visitInfo() {\n\t\tResult<List<Map<String,Object>>> result = new Result<List<Map<String,Object>>>();\n\t\tCalendar calendar = new GregorianCalendar();\n\t\tcalendar.set(Calendar.HOUR_OF_DAY,0);\n        calendar.set(Calendar.MINUTE,0);\n        calendar.set(Calendar.SECOND,0);\n        calendar.set(Calendar.MILLISECOND,0);\n        calendar.add(Calendar.DAY_OF_MONTH, 1);\n        Date dayEnd = calendar.getTime();\n        calendar.add(Calendar.DAY_OF_MONTH, -7);\n        Date dayStart = calendar.getTime();\n        List<Map<String,Object>> list = logService.findVisitCount(dayStart, dayEnd);\n\t\tresult.setResult(oConvertUtils.toLowerCasePageList(list));\n\t\treturn result;\n\t}\n\t\n\t\n\t/**\n\t * 登陆成功选择用户当前部门\n\t * @param user\n\t * @return\n\t */\n\t@RequestMapping(value = \"/selectDepart\", method = RequestMethod.PUT)\n\tpublic Result<JSONObject> selectDepart(@RequestBody SysUser user) {\n\t\tResult<JSONObject> result = new Result<JSONObject>();\n\t\tString username = user.getUsername();\n\t\tif(oConvertUtils.isEmpty(username)) {\n\t\t\tLoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();\n\t\t\tusername = sysUser.getUsername();\n\t\t}\n\t\t\n\t\t//获取登录部门\n\t\tString orgCode= user.getOrgCode();\n\t\t//获取登录租户\n\t\tInteger tenantId = user.getLoginTenantId();\n\t\t//设置用户登录部门和登录租户\n\t\tthis.sysUserService.updateUserDepart(username, orgCode,tenantId);\n\t\tSysUser sysUser = sysUserService.getUserByName(username);\n\t\tJSONObject obj = new JSONObject();\n\t\tobj.put(\"userInfo\", sysUser);\n\t\tresult.setResult(obj);\n\t\treturn result;\n\t}\n\n\t/**\n\t * 短信登录接口\n\t * \n\t * @param jsonObject\n\t * @return\n\t */\n\t@PostMapping(value = \"/sms\")\n\tpublic Result<String> sms(@RequestBody JSONObject jsonObject,HttpServletRequest request) {\n\t\tResult<String> result = new Result<String>();\n\t\tString clientIp = IpUtils.getIpAddr(request);\n\t\tString mobile = jsonObject.get(\"mobile\").toString();\n\t\t//手机号模式 登录模式: \"2\"  注册模式: \"1\"\n\t\tString smsmode=jsonObject.get(\"smsmode\").toString();\n\t\tlog.info(\"-------- IP:{}, 手机号：{}，获取绑定验证码\", clientIp, mobile);\n\t\t\n\t\tif(oConvertUtils.isEmpty(mobile)){\n\t\t\tresult.setMessage(\"手机号不允许为空！\");\n\t\t\tresult.setSuccess(false);\n\t\t\treturn result;\n\t\t}\n\t\t\n\t\t// VUEN-2245【漏洞】发现新漏洞待处理20220906\n\t\tString redisKey = CommonConstant.PHONE_REDIS_KEY_PRE+mobile;\n\t\tObject object = redisUtil.get(redisKey);\n\t\t\n\t\tif (object != null) {\n\t\t\tresult.setMessage(\"验证码10分钟内，仍然有效！\");\n\t\t\tresult.setSuccess(false);\n\t\t\treturn result;\n\t\t}\n\n\t\t//-------------------------------------------------------------------------------------\n\t\t//增加 check防止恶意刷短信接口\n\t\tif(!DySmsLimit.canSendSms(clientIp)){\n\t\t\tlog.warn(\"--------[警告] IP地址:{}, 短信接口请求太多-------\", clientIp);\n\t\t\tresult.setMessage(\"短信接口请求太多，请稍后再试！\");\n\t\t\tresult.setCode(CommonConstant.PHONE_SMS_FAIL_CODE);\n\t\t\tresult.setSuccess(false);\n\t\t\treturn result;\n\t\t}\n\t\t//-------------------------------------------------------------------------------------\n\n\t\t//随机数\n\t\tString captcha = RandomUtil.randomNumbers(6);\n\t\tJSONObject obj = new JSONObject();\n    \tobj.put(\"code\", captcha);\n\t\ttry {\n\t\t\tboolean b = false;\n\t\t\t//注册模板\n\t\t\tif (CommonConstant.SMS_TPL_TYPE_1.equals(smsmode)) {\n\t\t\t\tSysUser sysUser = sysUserService.getUserByPhone(mobile);\n\t\t\t\tif(sysUser!=null) {\n\t\t\t\t\tresult.error500(\" 手机号已经注册，请直接登录！\");\n\t\t\t\t\tbaseCommonService.addLog(\"手机号已经注册，请直接登录！\", CommonConstant.LOG_TYPE_1, null);\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tb = DySmsHelper.sendSms(mobile, obj, DySmsEnum.REGISTER_TEMPLATE_CODE);\n\t\t\t}else {\n\t\t\t\t//登录模式，校验用户有效性\n\t\t\t\tSysUser sysUser = sysUserService.getUserByPhone(mobile);\n\t\t\t\tresult = sysUserService.checkUserIsEffective(sysUser);\n\t\t\t\tif(!result.isSuccess()) {\n\t\t\t\t\tString message = result.getMessage();\n\t\t\t\t\tString userNotExist=\"该用户不存在，请注册\";\n\t\t\t\t\tif(userNotExist.equals(message)){\n\t\t\t\t\t\tresult.error500(\"该用户不存在或未绑定手机号\");\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/**\n\t\t\t\t * smsmode 短信模板方式  0 .登录模板、1.注册模板、2.忘记密码模板\n\t\t\t\t */\n\t\t\t\tif (CommonConstant.SMS_TPL_TYPE_0.equals(smsmode)) {\n\t\t\t\t\t//登录模板\n\t\t\t\t\tb = DySmsHelper.sendSms(mobile, obj, DySmsEnum.LOGIN_TEMPLATE_CODE);\n\t\t\t\t} else if(CommonConstant.SMS_TPL_TYPE_2.equals(smsmode)) {\n\t\t\t\t\t//忘记密码模板\n\t\t\t\t\tb = DySmsHelper.sendSms(mobile, obj, DySmsEnum.FORGET_PASSWORD_TEMPLATE_CODE);\n                    // 代码逻辑说明: 【issues/8567】严重：修改密码存在水平越权问题。---\n                    if(b){\n                        String username = sysUser.getUsername();\n                        obj.put(\"username\",username);\n                        redisUtil.set(redisKey, obj.toJSONString(), 600);\n                        result.setSuccess(true);\n                        return result;\n                    }\n                }\n\t\t\t}\n\n\t\t\tif (b == false) {\n\t\t\t\tresult.setMessage(\"短信验证码发送失败,请稍后重试\");\n\t\t\t\tresult.setSuccess(false);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\t\n\t\t\t//验证码10分钟内有效\n\t\t\tredisUtil.set(redisKey, captcha, 600);\n\t\t\tresult.setSuccess(true);\n\n\t\t} catch (ClientException e) {\n\t\t\te.printStackTrace();\n\t\t\tresult.error500(\" 短信接口未配置，请联系管理员！\");\n\t\t\treturn result;\n\t\t}\n\t\treturn result;\n\t}\n\t\n\n\t/**\n\t * 手机号登录接口\n\t * \n\t * @param jsonObject\n\t * @return\n\t */\n\t@Operation(summary=\"手机号登录接口\")\n\t@PostMapping(\"/phoneLogin\")\n\tpublic Result<JSONObject> phoneLogin(@RequestBody JSONObject jsonObject, HttpServletRequest request) {\n\t\tResult<JSONObject> result = new Result<JSONObject>();\n\t\tString phone = jsonObject.getString(\"mobile\");\n\t\t// 平台用户登录失败锁定用户\n\t\tif(isLoginFailOvertimes(phone)){\n\t\t\treturn result.error500(\"该用户登录失败次数过多，请于10分钟后再次登录！\");\n\t\t}\n\t\t\n\t\t//校验用户有效性\n\t\tSysUser sysUser = sysUserService.getUserByPhone(phone);\n\t\tresult = sysUserService.checkUserIsEffective(sysUser);\n\t\tif(!result.isSuccess()) {\n\t\t\treturn result;\n\t\t}\n\t\t\n\t\tString smscode = jsonObject.getString(\"captcha\");\n\n\t\t// 代码逻辑说明: VUEN-2245 【漏洞】发现新漏洞待处理20220906\n\t\tString redisKey = CommonConstant.PHONE_REDIS_KEY_PRE+phone;\n\t\tObject code = redisUtil.get(redisKey);\n\n\t\tif (!smscode.equals(code)) {\n\t\t\taddLoginFailOvertimes(phone);\n\t\t\treturn Result.error(\"手机验证码错误\");\n\t\t}\n\t\t//用户信息\n\t\tString loginOrgCode = jsonObject.getString(\"loginOrgCode\");\n\t\tsysUser.setLoginOrgCode(loginOrgCode);\n\t\tuserInfo(sysUser, result, request, CommonConstant.CLIENT_TYPE_PHONE);\n\t\t//添加日志\n\t\tbaseCommonService.addLog(\"用户名: \" + sysUser.getUsername() + \",登录成功！\", CommonConstant.LOG_TYPE_1, null);\n        redisUtil.removeAll(redisKey);\n\t\treturn result;\n\t}\n\n\n\t/**\n\t * 用户信息\n\t *\n\t * @param sysUser\n\t * @param result\n\t * @return\n\t */\n\tprivate Result<JSONObject> userInfo(SysUser sysUser, Result<JSONObject> result, HttpServletRequest request, String clientType) {\n\t\tString username = sysUser.getUsername();\n\t\tString syspassword = sysUser.getPassword();\n\t\tJSONObject obj = new JSONObject(new LinkedHashMap<>());\n\n\t\t//1.生成token，并设置超时时间\n\t\tString token = JwtUtil.sign(username, syspassword, clientType);\n\t\tredisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);\n\t\t// 根据客户端类型设置对应的过期时间\n\t\tlong expireTime = CommonConstant.CLIENT_TYPE_APP.equalsIgnoreCase(clientType) \n\t\t\t? JwtUtil.APP_EXPIRE_TIME * 2 / 1000 \n\t\t\t: JwtUtil.EXPIRE_TIME * 2 / 1000;\n\t\tredisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, expireTime);\n\t\tobj.put(\"token\", token);\n\n\t\t// 是否允许同一账号多地同时登录，踢掉之前的登录\n\t\thandleSingleSignOn(username, token, clientType);\n\n\t\t//2.设置登录租户\n\t\tResult<JSONObject> loginTenantError = sysUserService.setLoginTenant(sysUser, obj, username,result);\n\t\tif (loginTenantError != null) {\n\t\t\treturn loginTenantError;\n\t\t}\n\n\t\t//3.设置登录用户信息\n\t\tobj.put(\"userInfo\", sysUser);\n\t\t\n\t\t//4.设置登录部门\n\t\tList<SysDepart> departs = sysDepartService.queryUserDeparts(sysUser.getId());\n\t\tobj.put(\"departs\", departs);\n\t\tif (departs == null || departs.size() == 0) {\n\t\t\tobj.put(\"multi_depart\", 0);\n\t\t\tsysUserService.updateUserDepart(username, null, null);\n\t\t} else if (departs.size() == 1) {\n\t\t\tsysUserService.updateUserDepart(username, departs.get(0).getOrgCode(),null);\n\t\t\tobj.put(\"multi_depart\", 1);\n\t\t} else {\n\t\t\t//查询当前是否有登录部门\n\t\t\tSysUser sysUserById = sysUserService.getById(sysUser.getId());\n\t\t\t//【部门切换】支持登录页面选择部门\n\t\t\tString loginOrgCode = sysUser.getLoginOrgCode();\n\n\t\t\t// 判断上次登录部门orgCode是否在departs中\n\t\t\tboolean orgCodeInDeparts = departs.stream().anyMatch(d -> sysUserById.getOrgCode() != null && sysUserById.getOrgCode().equalsIgnoreCase(d.getOrgCode()));\n\t\t\tif (!orgCodeInDeparts) {\n\t\t\t\tsysUserById.setOrgCode(null);\n\t\t\t}\n\n\t\t\t// 如果未设置登录部门，则将登录部门设置为用户选择的 loginOrgCode（优先），否则设置为默认的第一个部门\n\t\t\tif(oConvertUtils.isEmpty(sysUserById.getOrgCode())){\n\t\t\t\tString orgCode = oConvertUtils.isNotEmpty(loginOrgCode) ? loginOrgCode : departs.get(0).getOrgCode();\n\t\t\t\tsysUserService.updateUserDepart(username, orgCode, null);\n\t\t\t} else {\n\t\t\t\t// 已设置登录部门，若用户本次登录选择了不同的部门，则优先使用用户选择的 loginOrgCode 更新登录部门\n\t\t\t\tString orgCode = sysUserById.getOrgCode();\n\t\t\t\tif(oConvertUtils.isNotEmpty(loginOrgCode) && !orgCode.equalsIgnoreCase(loginOrgCode)){\n\t\t\t\t\tsysUserService.updateUserDepart(username, loginOrgCode, null);\n\t\t\t\t}\n\t\t\t}\n\t\t\tobj.put(\"multi_depart\", 2);\n\t\t}\n\n\t\t// 5.vue3版本不加载字典数据，vue2下加载字典\n\t\tString vue3Version = request.getHeader(CommonConstant.VERSION);\n\t\tif(oConvertUtils.isEmpty(vue3Version)){\n\t\t\tobj.put(\"sysAllDictItems\", sysDictService.queryAllDictItems());\n\t\t}\n\t\t\n\t\tresult.setResult(obj);\n\t\tresult.success(\"登录成功\");\n\t\treturn result;\n\t}\n\n\t/**\n\t * 同一账号在同一客户端类型只能登录一次\n\t * \n\t * @author scott\n\t * @date 2025-10-31\n\t * PC端、APP端、手机号登录分别独立，互不影响\n\t * \n\t * @param username 用户名\n\t * @param newToken 新生成的token\n\t * @param clientType 客户端类型（PC、APP、PHONE）\n\t */\n\tprivate void handleSingleSignOn(String username, String newToken, String clientType) {\n\t\t// 检查是否允许并发登录\n\t\tif (jeecgBaseConfig.getFirewall() == null || jeecgBaseConfig.getFirewall().getIsConcurrent()==null || Boolean.TRUE.equals(jeecgBaseConfig.getFirewall().getIsConcurrent())) {\n\t\t\t// 允许并发登录，只设置当前用户的token缓存，不踢掉之前的登录\n\t\t\tlog.debug(\"并发登录已启用：用户[{}]在{}端允许多地同时登录\", username, clientType);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tlog.info(\"【并发登录限制已开启】 用户[{}]在{}端不允许多地同时登录\", username, clientType);\n\t\t// 根据客户端类型选择对应的Redis key前缀\n\t\tString redisKeyPrefix;\n\t\tif (CommonConstant.CLIENT_TYPE_APP.equalsIgnoreCase(clientType)) {\n\t\t\tredisKeyPrefix = CommonConstant.PREFIX_USER_TOKEN_APP;\n\t\t} else if (CommonConstant.CLIENT_TYPE_PHONE.equalsIgnoreCase(clientType)) {\n\t\t\tredisKeyPrefix = CommonConstant.PREFIX_USER_TOKEN_PHONE;\n\t\t} else {\n\t\t\tredisKeyPrefix = CommonConstant.PREFIX_USER_TOKEN_PC;\n\t\t}\n\t\t\n\t\tString userTokenKey = redisKeyPrefix + username;\n\t\t\n\t\t// 获取该用户在当前客户端类型下之前的token\n\t\tObject oldTokenObj = redisUtil.get(userTokenKey);\n\t\tif (oldTokenObj != null && !oldTokenObj.equals(newToken)) {\n\t\t\tString oldToken = oldTokenObj.toString();\n\t\t\t// 清除旧登录token的缓存（设置 1 小时过期时间）\n\t\t\tredisUtil.del(CommonConstant.PREFIX_USER_TOKEN + oldToken);\n\t\t\tredisUtil.set(CommonConstant.PREFIX_USER_TOKEN_ERROR_MSG + oldToken, \"不允许同一账号多地同时登录，当前登录被踢掉！\", 60 * 1 * 60);\n\t\t\tlog.info(\"【并发登录限制已开启】用户[{}]在{}端的旧登录已被踢下线！\", username, clientType);\n\t\t\tlog.info(\"【并发登录限制已开启】用户被踢下线，新token: {}，旧token：{}\", newToken, oldToken);\n\t\t}\n\t\t\n\t\t// 保存新的token到单点登录缓存\n\t\tredisUtil.set(userTokenKey, newToken);\n\t\tredisUtil.expire(userTokenKey, JwtUtil.EXPIRE_TIME * 2 / 1000);\n\t}\n\n\t/**\n\t * 获取加密字符串\n\t * @return\n\t */\n\t@GetMapping(value = \"/getEncryptedString\")\n\tpublic Result<Map<String,String>> getEncryptedString(){\n\t\tResult<Map<String,String>> result = new Result<Map<String,String>>();\n\t\tMap<String,String> map = new HashMap(5);\n\t\tmap.put(\"key\", EncryptedString.key);\n\t\tmap.put(\"iv\",EncryptedString.iv);\n\t\tresult.setResult(map);\n\t\treturn result;\n\t}\n\n\t/**\n\t * 后台生成图形验证码 ：有效\n\t * @param response\n\t * @param key\n\t */\n\t@Operation(summary=\"获取验证码\")\n\t@GetMapping(value = \"/randomImage/{key}\")\n\tpublic Result<String> randomImage(HttpServletResponse response,@PathVariable(\"key\") String key){\n\t\tResult<String> res = new Result<String>();\n\t\ttry {\n\t\t\t//生成验证码，存到redis中\n\t\t\tString code = RandomUtil.randomString(BASE_CHECK_CODES,4);\n\t\t\tString lowerCaseCode = code.toLowerCase();\n\t\t\tString keyPrefix = Md5Util.md5Encode(key + jeecgBaseConfig.getSignatureSecret(), \"utf-8\");\n\t\t\tString realKey = keyPrefix + lowerCaseCode;\n\t\t\tredisUtil.removeAll(keyPrefix);\n\t\t\tredisUtil.set(realKey, lowerCaseCode, 60);\n\t\t\tlog.debug(\"获取验证码，Redis key = {}，checkCode = {}\", realKey, code);\n\t\t\tString base64 = RandImageUtil.generate(code);\n\t\t\tres.setSuccess(true);\n\t\t\tres.setResult(base64);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\tres.error500(\"获取验证码失败,请检查redis配置!\");\n\t\t\treturn res;\n\t\t}\n\t\treturn res;\n\t}\n\n//\t/**\n//\t * 切换菜单表为vue3的表\n//\t */\n//\t@RequiresRoles({\"admin\"})\n//\t@GetMapping(value = \"/switchVue3Menu\")\n//\tpublic Result<String> switchVue3Menu(HttpServletResponse response) {\n//\t\tResult<String> res = new Result<String>();\t\n//\t\tsysPermissionService.switchVue3Menu();\n//\t\treturn res;\n//\t}\n\t\n\t/**\n\t * app登录\n\t * @param sysLoginModel\n\t * @return\n\t * @throws Exception\n\t */\n\t@RequestMapping(value = \"/mLogin\", method = RequestMethod.POST)\n\tpublic Result<JSONObject> mLogin(@RequestBody SysLoginModel sysLoginModel, HttpServletRequest request) throws Exception {\n\t\tResult<JSONObject> result = new Result<JSONObject>();\n\t\tString username = sysLoginModel.getUsername();\n\t\t// 密码加密传输(尝试 AES解密，失败视为明文)\n\t\tString password  = AesEncryptUtil.resolvePassword(sysLoginModel.getPassword());\n\t\tlog.debug(\"登录密码，原始密码:{}，解密密码:{}\" , sysLoginModel.getPassword(), password);\n\n\t\tJSONObject obj = new JSONObject();\n\t\t\n\t\t// 1.平台用户登录失败锁定用户\n\t\tif(isLoginFailOvertimes(username)){\n\t\t\treturn result.error500(\"该用户登录失败次数过多，请于10分钟后再次登录！\");\n\t\t}\n\t\t// 2.校验用户是否有效\n\t\tSysUser sysUser = sysUserService.getUserByName(username);\n\t\tresult = sysUserService.checkUserIsEffective(sysUser);\n\t\tif(!result.isSuccess()) {\n\t\t\treturn result;\n\t\t}\n\t\t\n\t\t// 3.校验用户名或密码是否正确\n\t\tString userpassword = PasswordUtil.encrypt(username, password, sysUser.getSalt());\n\t\tString syspassword = sysUser.getPassword();\n\t\tif (!syspassword.equals(userpassword)) {\n\t\t\taddLoginFailOvertimes(username);\n\t\t\tresult.error500(\"用户名或密码错误\");\n\t\t\treturn result;\n\t\t}\n\t\t\n\t\t//4.设置登录部门\n\t\tString orgCode = sysUser.getOrgCode();\n\t\t//登录设置的组织\n\t\tString loginOrgCode = sysLoginModel.getLoginOrgCode();\n\t\tif(oConvertUtils.isEmpty(orgCode)) {\n\t\t\t//如果当前用户无选择部门 查看部门关联信息\n\t\t\tif(oConvertUtils.isNotEmpty(loginOrgCode)){\n\t\t\t\tsysUser.setOrgCode(loginOrgCode);\n\t\t\t\tthis.sysUserService.updateUserDepart(username, loginOrgCode,null);\n\t\t\t}else{\n\t\t\t\tList<SysDepart> departs = sysDepartService.queryUserDeparts(sysUser.getId());\n\t\t\t\tif (departs != null && !departs.isEmpty()) {\n\t\t\t\t\torgCode = departs.get(0).getOrgCode();\n\t\t\t\t\tsysUser.setOrgCode(orgCode);\n\t\t\t\t\tthis.sysUserService.updateUserDepart(username, orgCode,null);\n\t\t\t\t}\n\t\t\t}\n\t\t}else{\n\t\t\tif(oConvertUtils.isNotEmpty(loginOrgCode) && !orgCode.equalsIgnoreCase(loginOrgCode)){\n\t\t\t\tsysUser.setOrgCode(loginOrgCode);\n\t\t\t\tsysUserService.updateUserDepart(username, loginOrgCode,null);\n\t\t\t}\n\t\t}\n\n\t\t//5. 设置登录租户\n\t\tResult<JSONObject> loginTenantError = sysUserService.setLoginTenant(sysUser, obj, username, result);\n\t\tif (loginTenantError != null) {\n\t\t\treturn loginTenantError;\n\t\t}\n\t\t// 设置登录用户信息\n\t\tobj.put(\"userInfo\", sysUser);\n\n\t\t//6. 生成token，并设置超时时间\n\t\tString token = JwtUtil.sign(username, syspassword, CommonConstant.CLIENT_TYPE_APP);\n\t\tredisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);\n\t\tredisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.APP_EXPIRE_TIME*2 / 1000);\n\t\tobj.put(\"token\", token);\n\t\tresult.setResult(obj);\n\t\tresult.setSuccess(true);\n\t\tresult.setCode(200);\n\n\t\t// 7.是否允许同一账号多地同时登录(APP端登录，踢掉之前的APP端登录)\n\t\thandleSingleSignOn(username, token, CommonConstant.CLIENT_TYPE_APP);\n\t\t\n\t\t// 8.登录成功记录日志\n\t\tbaseCommonService.addLog(\"用户名: \" + username + \",登录成功[移动端]！\", CommonConstant.LOG_TYPE_1, null);\n\t\treturn result;\n\t}\n\n\t/**\n\t * 图形验证码\n\t * @param sysLoginModel\n\t * @return\n\t */\n\t@RequestMapping(value = \"/checkCaptcha\", method = RequestMethod.POST)\n\tpublic Result<?> checkCaptcha(@RequestBody SysLoginModel sysLoginModel){\n\t\tString captcha = sysLoginModel.getCaptcha();\n\t\tString checkKey = sysLoginModel.getCheckKey();\n\t\tif(captcha==null){\n\t\t\treturn Result.error(\"验证码无效\");\n\t\t}\n\t\tString lowerCaseCaptcha = captcha.toLowerCase();\n\t\tString realKey = Md5Util.md5Encode(lowerCaseCaptcha+checkKey, \"utf-8\");\n\t\tObject checkCode = redisUtil.get(realKey);\n\t\tif(checkCode==null || !checkCode.equals(lowerCaseCaptcha)) {\n\t\t\treturn Result.error(\"验证码错误\");\n\t\t}\n\t\treturn Result.ok();\n\t}\n\t/**\n\t * 登录二维码\n\t */\n\t@Operation(summary = \"登录二维码\")\n\t@GetMapping(\"/getLoginQrcode\")\n\tpublic Result<?>  getLoginQrcode() {\n\t\tString qrcodeId = CommonConstant.LOGIN_QRCODE_PRE+IdWorker.getIdStr();\n\t\t//定义二维码参数\n\t\tMap params = new HashMap(5);\n\t\tparams.put(\"qrcodeId\", qrcodeId);\n\t\t//存放二维码唯一标识30秒有效\n\t\tredisUtil.set(CommonConstant.LOGIN_QRCODE + qrcodeId, qrcodeId, 30);\n\t\treturn Result.OK(params);\n\t}\n\t/**\n\t * 扫码二维码\n\t */\n\t@Operation(summary = \"扫码登录二维码\")\n\t@PostMapping(\"/scanLoginQrcode\")\n\tpublic Result<?> scanLoginQrcode(@RequestParam String qrcodeId, @RequestParam String token) {\n\t\tObject check = redisUtil.get(CommonConstant.LOGIN_QRCODE + qrcodeId);\n\t\tif (oConvertUtils.isNotEmpty(check)) {\n\t\t\t//存放token给前台读取\n\t\t\tredisUtil.set(CommonConstant.LOGIN_QRCODE_TOKEN+qrcodeId, token, 60);\n\t\t} else {\n\t\t\treturn Result.error(\"二维码已过期,请刷新后重试\");\n\t\t}\n\t\treturn Result.OK(\"扫码成功\");\n\t}\n\n\n\t/**\n\t * 获取用户扫码后保存的token\n\t */\n\t@Operation(summary = \"获取用户扫码后保存的token\")\n\t@GetMapping(\"/getQrcodeToken\")\n\tpublic Result getQrcodeToken(@RequestParam String qrcodeId) {\n\t\tObject token = redisUtil.get(CommonConstant.LOGIN_QRCODE_TOKEN + qrcodeId);\n\t\tMap result = new HashMap(5);\n\t\tObject qrcodeIdExpire = redisUtil.get(CommonConstant.LOGIN_QRCODE + qrcodeId);\n\t\tif (oConvertUtils.isEmpty(qrcodeIdExpire)) {\n\t\t\t//二维码过期通知前台刷新\n\t\t\tresult.put(\"token\", \"-2\");\n\t\t\treturn Result.OK(result);\n\t\t}\n\t\tif (oConvertUtils.isNotEmpty(token)) {\n\t\t\tresult.put(\"success\", true);\n\t\t\tresult.put(\"token\", token);\n\t\t} else {\n\t\t\tresult.put(\"token\", \"-1\");\n\t\t}\n\t\treturn Result.OK(result);\n\t}\n\n\t/**\n\t * 登录失败超出次数5 返回true\n\t * @param username\n\t * @return\n\t */\n\tprivate boolean isLoginFailOvertimes(String username){\n\t\tString key = CommonConstant.LOGIN_FAIL + username;\n\t\tObject failTime = redisUtil.get(key);\n\t\tif(failTime!=null){\n\t\t\tInteger val = Integer.parseInt(failTime.toString());\n\t\t\tif(val>5){\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * 记录登录失败次数\n\t * @param username\n\t */\n\tprivate void addLoginFailOvertimes(String username){\n\t\tString key = CommonConstant.LOGIN_FAIL + username;\n\t\tObject failTime = redisUtil.get(key);\n\t\tInteger val = 0;\n\t\tif(failTime!=null){\n\t\t\tval = Integer.parseInt(failTime.toString());\n\t\t}\n\t\t// 10分钟，一分钟为60s\n\t\tredisUtil.set(key, ++val, 600);\n\t}\n\n\t/**\n\t * 发送短信验证码接口(修改密码)\n\t *\n\t * @param jsonObject\n\t * @return\n\t */\n\t@PostMapping(value = \"/sendChangePwdSms\")\n\tpublic Result<String> sendSms(@RequestBody JSONObject jsonObject) {\n\t\tResult<String> result = new Result<>();\n\t\tString mobile = jsonObject.get(\"mobile\").toString();\n\t\tif (oConvertUtils.isEmpty(mobile)) {\n\t\t\tresult.setMessage(\"手机号不允许为空！\");\n\t\t\tresult.setSuccess(false);\n\t\t\treturn result;\n\t\t}\n\t\tLoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\tString username = sysUser.getUsername();\n\t\tLambdaQueryWrapper<SysUser> query = new LambdaQueryWrapper<>();\n\t\tquery.eq(SysUser::getUsername, username).eq(SysUser::getPhone, mobile);\n\t\tSysUser user = sysUserService.getOne(query);\n\t\tif (null == user) {\n\t\t\treturn Result.error(\"当前登录用户和绑定的手机号不匹配，无法修改密码！\");\n\t\t}\n\t\tString redisKey = CommonConstant.PHONE_REDIS_KEY_PRE + mobile;\n\t\tObject object = redisUtil.get(redisKey);\n\t\tif (object != null) {\n\t\t\tresult.setMessage(\"验证码10分钟内，仍然有效！\");\n\t\t\tresult.setSuccess(false);\n\t\t\treturn result;\n\t\t}\n\t\t//随机数\n\t\tString captcha = RandomUtil.randomNumbers(6);\n\t\tJSONObject obj = new JSONObject();\n\t\tobj.put(\"code\", captcha);\n\t\ttry {\n\t\t\tboolean b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.CHANGE_PASSWORD_TEMPLATE_CODE);\n\t\t\tif (!b) {\n\t\t\t\tresult.setMessage(\"短信验证码发送失败,请稍后重试\");\n\t\t\t\tresult.setSuccess(false);\n\t\t\t\treturn result;\n\t\t\t}\n            //【issues/8567】严重：修改密码存在水平越权问题\n            obj.put(\"username\",username);\n            redisUtil.set(redisKey, obj.toJSONString(), 300);\n\t\t\tresult.setSuccess(true);\n\t\t} catch (ClientException e) {\n\t\t\te.printStackTrace();\n\t\t\tresult.error500(\" 短信接口未配置，请联系管理员！\");\n\t\t\treturn result;\n\t\t}\n\t\treturn result;\n\t}\n\n\t\n\t/**\n\t * 图形验证码\n\t * @param sysLoginModel\n\t * @return\n\t */\n\t@RequestMapping(value = \"/smsCheckCaptcha\", method = RequestMethod.POST)\n\tpublic Result<?> smsCheckCaptcha(@RequestBody SysLoginModel sysLoginModel, HttpServletRequest request){\n\t\tString captcha = sysLoginModel.getCaptcha();\n\t\tString checkKey = sysLoginModel.getCheckKey();\n\t\tif(captcha==null){\n\t\t\treturn Result.error(\"验证码无效\");\n\t\t}\n\t\tString lowerCaseCaptcha = captcha.toLowerCase();\n\t\tString realKey = Md5Util.md5Encode(lowerCaseCaptcha+checkKey+jeecgBaseConfig.getSignatureSecret(), \"utf-8\");\n\t\tObject checkCode = redisUtil.get(realKey);\n\t\tif(checkCode==null || !checkCode.equals(lowerCaseCaptcha)) {\n\t\t\treturn Result.error(\"验证码错误\");\n\t\t}\n\t\tString clientIp = IpUtils.getIpAddr(request);\n\t\t//清空短信记录数量\n\t\tDySmsLimit.clearSendSmsCount(clientIp);\n\t\tredisUtil.removeAll(realKey);\n\t\treturn Result.ok();\n\t}\n\t/**\n\t * 登录获取用户部门信息\n\t *\n\t * @param jsonObject\n\t * @return\n\t */\n\t@IgnoreAuth\n\t@RequestMapping(value = \"/loginGetUserDeparts\", method = RequestMethod.POST)\n\tpublic Result<JSONObject> loginGetUserDeparts(@RequestBody JSONObject jsonObject, HttpServletRequest request){\n\t\treturn sysUserService.loginGetUserDeparts(jsonObject);\n\t}\n\t\n\t/**\n     * 校验验证码工具方法，校验失败直接返回Result，校验通过返回realKey\n     */\n    private String validateCaptcha(SysLoginModel sysLoginModel, Result<JSONObject> result) {\n\t\t// 判断是否启用登录验证码校验\n\t\tif (jeecgBaseConfig.getFirewall() != null && Boolean.FALSE.equals(jeecgBaseConfig.getFirewall().getEnableLoginCaptcha())) {\n\t\t\tlog.warn(\"关闭了登录验证码校验，跳过验证码校验！\");\n\t\t\treturn \"LoginWithoutVerifyCode\";\n\t\t}\n\t\t\n        String captcha = sysLoginModel.getCaptcha();\n        if (captcha == null) {\n            result.error500(\"验证码无效\");\n            return null;\n        }\n        String lowerCaseCaptcha = captcha.toLowerCase();\n        String keyPrefix = Md5Util.md5Encode(sysLoginModel.getCheckKey() + jeecgBaseConfig.getSignatureSecret(), \"utf-8\");\n        String realKey = keyPrefix + lowerCaseCaptcha;\n        Object checkCode = redisUtil.get(realKey);\n        if (checkCode == null || !checkCode.toString().equals(lowerCaseCaptcha)) {\n            log.warn(\"验证码错误，key= {} , Ui checkCode= {}, Redis checkCode = {}\", sysLoginModel.getCheckKey(), lowerCaseCaptcha, checkCode);\n            result.error500(\"验证码错误\");\n            result.setCode(HttpStatus.PRECONDITION_FAILED.value());\n            return null;\n        }\n        return realKey;\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.jeecg.dingtalk.api.core.response.Response;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.api.dto.PushMessageDTO;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.CommonSendStatus;\nimport org.jeecg.common.constant.WebsocketConst;\nimport org.jeecg.common.constant.enums.NoticeTypeEnum;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.*;\nimport org.jeecg.common.util.filter.SsrfFileTypeFilter;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.modules.message.enums.RangeDateEnum;\nimport org.jeecg.modules.message.websocket.WebSocket;\nimport org.jeecg.modules.system.entity.SysAnnouncement;\nimport org.jeecg.modules.system.entity.SysAnnouncementSend;\nimport org.jeecg.modules.system.service.ISysAnnouncementSendService;\nimport org.jeecg.modules.system.service.ISysAnnouncementService;\nimport org.jeecg.modules.system.service.impl.SysBaseApiImpl;\nimport org.jeecg.modules.system.service.impl.ThirdAppDingtalkServiceImpl;\nimport org.jeecg.modules.system.service.impl.ThirdAppWechatEnterpriseServiceImpl;\nimport org.jeecg.modules.system.util.XssUtils;\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.util.CollectionUtils;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.util.*;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.SynchronousQueue;\nimport java.util.concurrent.ThreadPoolExecutor;\nimport java.util.concurrent.TimeUnit;\nimport java.util.stream.Collectors;\n\nimport static org.jeecg.common.constant.CommonConstant.ANNOUNCEMENT_SEND_STATUS_1;\n\n/**\n * @Title: Controller\n * @Description: 系统通告表\n * @Author: jeecg-boot\n * @Date: 2019-01-02\n * @Version: V1.0\n */\n@RestController\n@RequestMapping(\"/sys/annountCement\")\n@Slf4j\npublic class SysAnnouncementController {\n\t@Autowired\n\tprivate ISysAnnouncementService sysAnnouncementService;\n\t@Autowired\n\tprivate ISysAnnouncementSendService sysAnnouncementSendService;\n\t@Resource\n    private WebSocket webSocket;\n\t@Autowired\n    ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService;\n\t@Autowired\n    ThirdAppDingtalkServiceImpl dingtalkService;\n\t@Autowired\n\tprivate SysBaseApiImpl sysBaseApi;\n\t@Autowired\n\t@Lazy\n\tprivate RedisUtil redisUtil;\n\t@Autowired\n\tpublic RedisTemplate redisTemplate;\n\t//常规报错定义\n\tprivate static final String SPECIAL_CHAR_ERROR = \"保存失败:消息内容包含数据库不支持的特殊字符，请检查并修改内容!\";\n\tprivate static final String CONTENT_TOO_LONG_ERROR = \"保存失败:消息内容超过最大长度限制，请缩减内容长度!\";\n\tprivate static final String DEFAULT_ERROR = \"操作失败，请稍后重试或联系管理员!\";\n\t/**\n\t * 通告缓存\n\t */\n\tString ANNO_CACHE_KEY = \"sys:cache:announcement\";\n\t/**\n\t * QQYUN-5072【性能优化】线上通知消息打开有点慢\n\t */\n\tpublic static ExecutorService cachedThreadPool = new ShiroThreadPoolExecutor(0, 1024,60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());\n\tpublic static ExecutorService completeNoteThreadPool = new ShiroThreadPoolExecutor(0, 1024,60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());\n\n\t/**\n\t  * 分页列表查询\n\t * @param sysAnnouncement\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t@RequestMapping(value = \"/list\", method = RequestMethod.GET)\n\tpublic Result<IPage<SysAnnouncement>> queryPageList(SysAnnouncement sysAnnouncement,\n\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t\t  HttpServletRequest req) {\n\t\t//------------------------------------------------------------------------------------------------\n\t\t//是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\tsysAnnouncement.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(), 0));\n\t\t}\n\t\t//------------------------------------------------------------------------------------------------\n\t\tResult<IPage<SysAnnouncement>> result = new Result<IPage<SysAnnouncement>>();\n\t\tsysAnnouncement.setDelFlag(CommonConstant.DEL_FLAG_0.toString());\n\t\tQueryWrapper<SysAnnouncement> queryWrapper = QueryGenerator.initQueryWrapper(sysAnnouncement, req.getParameterMap());\n\t\tPage<SysAnnouncement> page = new Page<SysAnnouncement>(pageNo,pageSize);\n\t\tIPage<SysAnnouncement> pageList = sysAnnouncementService.page(page, queryWrapper);\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(pageList);\n\t\treturn result;\n\t}\n\n\t/**\n\t  *   添加\n\t * @param sysAnnouncement\n\t * @return\n\t */\n\t@RequestMapping(value = \"/add\", method = RequestMethod.POST)\n\tpublic Result<SysAnnouncement> add(@RequestBody SysAnnouncement sysAnnouncement) {\n\t\tResult<SysAnnouncement> result = new Result<SysAnnouncement>();\n\t\ttry {\n\t\t\t// 代码逻辑说明: 标题处理xss攻击的问题\n\t\t\tString title = XssUtils.scriptXss(sysAnnouncement.getTitile());\n\t\t\tsysAnnouncement.setTitile(title);\n\t\t\t// 【安全校验】校验附件文件名，防止路径遍历攻击\n\t\t\tSsrfFileTypeFilter.checkPathTraversalBatch(sysAnnouncement.getFiles());\n\t\t\tsysAnnouncement.setDelFlag(CommonConstant.DEL_FLAG_0.toString());\n            //未发布\n\t\t\tsysAnnouncement.setSendStatus(CommonSendStatus.UNPUBLISHED_STATUS_0);\n            //流程状态\n\t\t\tsysAnnouncement.setBpmStatus(\"1\");\n            sysAnnouncement.setNoticeType(NoticeTypeEnum.NOTICE_TYPE_SYSTEM.getValue());\n\t\t\tsysAnnouncementService.saveAnnouncement(sysAnnouncement);\n\t\t\tresult.success(\"添加成功！\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t\tresult.error500(determineErrorMessage(e));\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t  *  编辑\n\t * @param sysAnnouncement\n\t * @return\n\t */\n\t@RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n\tpublic Result<SysAnnouncement> eidt(@RequestBody SysAnnouncement sysAnnouncement) {\n\t\tResult<SysAnnouncement> result = new Result<SysAnnouncement>();\n\t\tSysAnnouncement sysAnnouncementEntity = sysAnnouncementService.getById(sysAnnouncement.getId());\n\t\ttry{\n\t\t\tif(sysAnnouncementEntity==null) {\n\t\t\t\tresult.error500(\"未找到对应实体\");\n\t\t\t}else {\n\t\t\t\t// 代码逻辑说明: 标题处理xss攻击的问题\n\t\t\t\tString title = XssUtils.scriptXss(sysAnnouncement.getTitile());\n\t\t\t\tsysAnnouncement.setTitile(title);\n\t\t\t\t// 【安全校验】校验附件文件名，防止路径遍历攻击\n\t\t\t\tSsrfFileTypeFilter.checkPathTraversalBatch(sysAnnouncement.getFiles());\n\t\t\t\tsysAnnouncement.setNoticeType(NoticeTypeEnum.NOTICE_TYPE_SYSTEM.getValue());\n\t\t\t\tboolean ok = sysAnnouncementService.upDateAnnouncement(sysAnnouncement);\n\t\t\t\t//TODO 返回false说明什么？\n\t\t\t\tif(ok) {\n\t\t\t\t\tresult.success(\"修改成功!\");\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tresult.error500(determineErrorMessage(e));\n\t\t}\n\n\t\treturn result;\n\t}\n\t/**\n\t  *  简单编辑\n\t * @param sysAnnouncement\n\t * @return\n\t */\n\t@RequestMapping(value = \"/editIzTop\", method = {RequestMethod.PUT,RequestMethod.POST})\n\tpublic Result<SysAnnouncement> editIzTop(@RequestBody SysAnnouncement sysAnnouncement) {\n\t\tResult<SysAnnouncement> result = new Result<SysAnnouncement>();\n\t\tSysAnnouncement sysAnnouncementEntity = sysAnnouncementService.getById(sysAnnouncement.getId());\n\t\tif(sysAnnouncementEntity==null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}else {\n\t\t\tInteger izTop = sysAnnouncement.getIzTop();\n\t\t\tsysAnnouncementEntity.setIzTop(oConvertUtils.getInt(izTop,CommonConstant.IZ_TOP_0));\n\t\t\tsysAnnouncementService.updateById(sysAnnouncementEntity);\n\t\t\tresult.success(\"修改成功!\");\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t  *   通过id删除\n\t * @param id\n\t * @return\n\t */\n\t@RequestMapping(value = \"/delete\", method = RequestMethod.DELETE)\n\tpublic Result<SysAnnouncement> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\tResult<SysAnnouncement> result = new Result<SysAnnouncement>();\n\t\tSysAnnouncement sysAnnouncement = sysAnnouncementService.getById(id);\n\t\tif(sysAnnouncement==null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}else {\n\t\t\tsysAnnouncement.setDelFlag(CommonConstant.DEL_FLAG_1.toString());\n\t\t\tboolean ok = sysAnnouncementService.updateById(sysAnnouncement);\n\t\t\tif(ok) {\n\t\t\t\tresult.success(\"删除成功!\");\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t  *  批量删除\n\t * @param ids\n\t * @return\n\t */\n\t@RequestMapping(value = \"/deleteBatch\", method = RequestMethod.DELETE)\n\tpublic Result<SysAnnouncement> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tResult<SysAnnouncement> result = new Result<SysAnnouncement>();\n\t\tif(ids==null || \"\".equals(ids.trim())) {\n\t\t\tresult.error500(\"参数不识别！\");\n\t\t}else {\n\t\t\tString[] id = ids.split(\",\");\n\t\t\tfor(int i=0;i<id.length;i++) {\n\t\t\t\tSysAnnouncement announcement = sysAnnouncementService.getById(id[i]);\n\t\t\t\tannouncement.setDelFlag(CommonConstant.DEL_FLAG_1.toString());\n\t\t\t\tsysAnnouncementService.updateById(announcement);\n\t\t\t}\n\t\t\tresult.success(\"删除成功!\");\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t  * 通过id查询\n\t * @param id\n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryById\", method = RequestMethod.GET)\n\tpublic Result<SysAnnouncement> queryById(@RequestParam(name=\"id\",required=true) String id) {\n\t\tResult<SysAnnouncement> result = new Result<SysAnnouncement>();\n\t\tSysAnnouncement sysAnnouncement = sysAnnouncementService.getById(id);\n\t\tif(sysAnnouncement==null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}else {\n\t\t\tresult.setResult(sysAnnouncement);\n\t\t\tresult.setSuccess(true);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t *\t 更新发布操作\n\t * @param id\n\t * @return\n\t */\n\t@RequestMapping(value = \"/doReleaseData\", method = RequestMethod.GET)\n\tpublic Result<SysAnnouncement> doReleaseData(@RequestParam(name=\"id\",required=true) String id, HttpServletRequest request) {\n\t\tResult<SysAnnouncement> result = new Result<SysAnnouncement>();\n\t\tSysAnnouncement sysAnnouncement = sysAnnouncementService.getById(id);\n\t\tif(sysAnnouncement==null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}else {\n            //发布中\n\t\t\tsysAnnouncement.setSendStatus(CommonSendStatus.PUBLISHED_STATUS_1);\n\t\t\tsysAnnouncement.setSendTime(new Date());\n\t\t\tString currentUserName = JwtUtil.getUserNameByToken(request);\n\t\t\tsysAnnouncement.setSender(currentUserName);\n\t\t\tboolean ok = sysAnnouncementService.updateById(sysAnnouncement);\n            if(oConvertUtils.isEmpty(sysAnnouncement.getNoticeType())){\n                sysAnnouncement.setNoticeType(NoticeTypeEnum.NOTICE_TYPE_SYSTEM.getValue());\n            }\n\t\t\tif(ok) {\n\t\t\t\tresult.success(\"系统通知推送成功\");\n\t\t\t\tif(sysAnnouncement.getMsgType().equals(CommonConstant.MSG_TYPE_ALL)) {\n\t\t\t\t\t// 补全公告和用户之前的关系\n\t\t\t\t\tsysAnnouncementService.batchInsertSysAnnouncementSend(sysAnnouncement.getId(), sysAnnouncement.getTenantId());\n\t\t\t\t\t\n\t\t\t\t\t// 推送websocket通知\n\t\t\t\t\tJSONObject obj = new JSONObject();\n\t\t\t    \tobj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_TOPIC);\n\t\t\t\t\tobj.put(WebsocketConst.MSG_ID, sysAnnouncement.getId());\n\t\t\t\t\tobj.put(WebsocketConst.MSG_TXT, sysAnnouncement.getTitile());\n\t\t\t\t\tobj.put(CommonConstant.NOTICE_TYPE, sysAnnouncement.getNoticeType());\n\t\t\t    \twebSocket.sendMessage(obj.toJSONString());\n\t\t\t\t\t//update-begin-author:liusq---date:2025-11-13--for: JHHB-827 【审批消息】移动端需要有推送 -全推送\n\t\t\t\t\tPushMessageDTO pushMessageDTO = new PushMessageDTO();\n\t\t\t\t\tpushMessageDTO.setTitle(sysAnnouncement.getTitile());\n\t\t\t\t\tpushMessageDTO.setPushType(CommonConstant.MSG_TYPE_ALL);\n\t\t\t\t\tpushMessageDTO.setContent(sysAnnouncement.getMsgAbstract());\n\t\t\t\t\tsysBaseApi.uniPushMsgToUser(pushMessageDTO);\n\t\t\t\t\t//update-begin-author:liusq---date:2025-11-13--for: JHHB-827 【审批消息】移动端需要有推送 -全推送\n\t\t\t\t}else {\n\t\t\t\t\t// 2.插入用户通告阅读标记表记录\n\t\t\t\t\tString userId = sysAnnouncement.getUserIds();\n\t\t\t\t\tString[] userIds = userId.substring(0, (userId.length()-1)).split(\",\");\n\t\t\t\t\tString anntId = sysAnnouncement.getId();\n\t\t\t\t\tDate refDate = new Date();\n\t\t\t\t\tJSONObject obj = new JSONObject();\n\t\t\t    \tobj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);\n\t\t\t\t\tobj.put(WebsocketConst.MSG_ID, sysAnnouncement.getId());\n\t\t\t\t\tobj.put(WebsocketConst.MSG_TXT, sysAnnouncement.getTitile());\n                    obj.put(CommonConstant.NOTICE_TYPE, sysAnnouncement.getNoticeType());\n\t\t\t    \twebSocket.sendMessage(userIds, obj.toJSONString());\n\t\t\t\t\t//update-begin-author:liusq---date:2025-11-13--for: JHHB-827 【审批消息】移动端需要有推送\n\t\t\t\t\tPushMessageDTO pushMessageDTO = new PushMessageDTO();\n\t\t\t\t\tpushMessageDTO.setTitle(sysAnnouncement.getTitile());\n\t\t\t\t\tpushMessageDTO.setUserIds(Arrays.asList(userIds));\n\t\t\t\t\tpushMessageDTO.setContent(sysAnnouncement.getMsgAbstract());\n\t\t\t\t\tsysBaseApi.uniPushMsgToUser(pushMessageDTO);\n\t\t\t\t\t//update-begin-author:liusq---date:2025-11-13--for: JHHB-827 【审批消息】移动端需要有推送\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\t// 同步企业微信、钉钉的消息通知\n\t\t\t\t\tResponse<String> dtResponse = dingtalkService.sendActionCardMessage(sysAnnouncement, null, true);\n\t\t\t\t\twechatEnterpriseService.sendTextCardMessage(sysAnnouncement, null,true);\n\n\t\t\t\t\tif (dtResponse != null && dtResponse.isSuccess()) {\n\t\t\t\t\t\tString taskId = dtResponse.getResult();\n\t\t\t\t\t\tsysAnnouncement.setDtTaskId(taskId);\n\t\t\t\t\t\tsysAnnouncementService.updateById(sysAnnouncement);\n\t\t\t\t\t}\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\tlog.error(\"同步发送第三方APP消息失败：\", e);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t *\t 更新撤销操作\n\t * @param id\n\t * @return\n\t */\n\t@RequestMapping(value = \"/doReovkeData\", method = RequestMethod.GET)\n\tpublic Result<SysAnnouncement> doReovkeData(@RequestParam(name=\"id\",required=true) String id, HttpServletRequest request) {\n\t\tResult<SysAnnouncement> result = new Result<SysAnnouncement>();\n\t\tSysAnnouncement sysAnnouncement = sysAnnouncementService.getById(id);\n\t\tif(sysAnnouncement==null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}else {\n            //撤销发布\n\t\t\tsysAnnouncement.setSendStatus(CommonSendStatus.REVOKE_STATUS_2);\n\t\t\tsysAnnouncement.setCancelTime(new Date());\n\t\t\tboolean ok = sysAnnouncementService.updateById(sysAnnouncement);\n\t\t\tif(ok) {\n\t\t\t\tresult.success(\"该系统通知撤销成功\");\n\t\t\t\tif (oConvertUtils.isNotEmpty(sysAnnouncement.getDtTaskId())) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tdingtalkService.recallMessage(sysAnnouncement.getDtTaskId());\n\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\tlog.error(\"第三方APP撤回消息失败：\", e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * @功能：补充用户数据，并返回系统消息\n\t * @return\n\t */\n\t@RequestMapping(value = \"/listByUser\", method = RequestMethod.GET)\n\tpublic Result<Map<String, Object>> listByUser(@RequestParam(required = false, defaultValue = \"5\") Integer pageSize, HttpServletRequest request) {\n\t\tlong start = System.currentTimeMillis();\n\t\tResult<Map<String,Object>> result = new Result<Map<String,Object>>();\n\t\tMap<String,Object> sysMsgMap = new HashMap(5);\n\t\tLoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();\n\t\tString userId = sysUser.getId();\n\n\n\t\t// 获取上个月的第一天（只查近两个月的通知）\n\t\tDate lastMonthStartDay = DateRangeUtils.getLastMonthStartDay();\n\t\tlog.info(\"-----查询近两个月收到的未读通知-----，近2月的第一天：{}\", lastMonthStartDay);\n\t\t\n//\t\t//补推送数据（用户和通知的关系表）\n//\t\tcompleteNoteThreadPool.execute(()->{\n//\t\t\tsysAnnouncementService.completeAnnouncementSendInfo();\n//\t\t});\n\t\t\n\t\t// 2.查询用户未读的系统消息\n\t\tPage<SysAnnouncement> anntMsgList = new Page<SysAnnouncement>(0, pageSize);\n        //通知公告消息\n\t\tanntMsgList = sysAnnouncementService.querySysCementPageByUserId(anntMsgList,userId,\"1\",null, lastMonthStartDay);\n\t\tsysMsgMap.put(\"anntMsgList\", anntMsgList.getRecords());\n\t\tsysMsgMap.put(\"anntMsgTotal\", anntMsgList.getTotal());\n\n\t\tlog.info(\"begin 获取用户近2个月的系统公告 (通知)\" + (System.currentTimeMillis() - start) + \"毫秒\");\n\t\t\n        //系统消息\n\t\tPage<SysAnnouncement> sysMsgList = new Page<SysAnnouncement>(0, pageSize);\n\t\tsysMsgList = sysAnnouncementService.querySysCementPageByUserId(sysMsgList,userId,\"2\",null, lastMonthStartDay);\n\t\tsysMsgMap.put(\"sysMsgList\", sysMsgList.getRecords());\n\t\tsysMsgMap.put(\"sysMsgTotal\", sysMsgList.getTotal());\n\n\t\tlog.info(\"end 获取用户2个月的系统公告 (系统消息)\" + (System.currentTimeMillis() - start) + \"毫秒\");\n\t\t\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(sysMsgMap);\n\t\treturn result;\n\t}\n\n\n\t/**\n\t * 获取未读消息通知数量\n\t *\n\t * @return\n\t */\n\t@RequestMapping(value = \"/getUnreadMessageCount\", method = RequestMethod.GET)\n\tpublic Result<Map<String, Integer>> getUnreadMessageCount(@RequestParam(required = false, defaultValue = \"5\") Integer pageSize, HttpServletRequest request) {\n\t\tLoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\tString userId = sysUser.getId();\n\n\t\t// 获取上个月的第一天（只查近两个月的通知）\n\t\tDate lastMonthStartDay = DateRangeUtils.getLastMonthStartDay();\n\t\tlog.debug(\" ------查询近两个月收到的未读通知消息数量------，近2月的第一天：{}\", lastMonthStartDay);\n        // 代码逻辑说明: 【QQYUN-12162】OA项目改造，系统重消息拆分，目前消息都在一起 需按分类进行拆分---\n        Map<String,Integer> unreadMessageCount = new HashMap<>();\n        //系统消息数量\n        Integer systemCount = sysAnnouncementService.getUnreadMessageCountByUserId(userId, lastMonthStartDay, NoticeTypeEnum.NOTICE_TYPE_SYSTEM.getValue());\n        unreadMessageCount.put(\"systemCount\",systemCount);\n        //流程数量\n        Integer flowCount = sysAnnouncementService.getUnreadMessageCountByUserId(userId, lastMonthStartDay, NoticeTypeEnum.NOTICE_TYPE_FLOW.getValue());\n        unreadMessageCount.put(\"flowCount\",flowCount);\n        //文件数量\n        Integer fileCount = sysAnnouncementService.getUnreadMessageCountByUserId(userId, lastMonthStartDay,  NoticeTypeEnum.NOTICE_TYPE_FILE.getValue());\n        unreadMessageCount.put(\"fileCount\",fileCount);\n        //日程计划数量\n        Integer planCount = sysAnnouncementService.getUnreadMessageCountByUserId(userId, lastMonthStartDay,  NoticeTypeEnum.NOTICE_TYPE_PLAN.getValue());\n        unreadMessageCount.put(\"planCount\",planCount);\n        Integer count = systemCount + flowCount + fileCount + planCount;\n        unreadMessageCount.put(\"count\",count);\n        return Result.ok(unreadMessageCount);\n\t}\n\n\n    /**\n     * 导出excel\n     *\n     * @param request\n     */\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(SysAnnouncement sysAnnouncement,HttpServletRequest request) {\n        // Step.1 组装查询条件\n        LambdaQueryWrapper<SysAnnouncement> queryWrapper = new LambdaQueryWrapper<SysAnnouncement>(sysAnnouncement);\n        //Step.2 AutoPoi 导出Excel\n        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n\t\tqueryWrapper.eq(SysAnnouncement::getDelFlag,CommonConstant.DEL_FLAG_0.toString());\n        List<SysAnnouncement> pageList = sysAnnouncementService.list(queryWrapper);\n        //导出文件名称\n        mv.addObject(NormalExcelConstants.FILE_NAME, \"系统通告列表\");\n        mv.addObject(NormalExcelConstants.CLASS, SysAnnouncement.class);\n        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(\"系统通告列表数据\", \"导出人:\"+user.getRealname(), \"导出信息\"));\n        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);\n        return mv;\n    }\n\n    /**\n     * 通过excel导入数据\n     *\n     * @param request\n     * @param response\n     * @return\n     */\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n            // 获取上传文件对象\n            MultipartFile file = entity.getValue();\n            ImportParams params = new ImportParams();\n            params.setTitleRows(2);\n            params.setHeadRows(1);\n            params.setNeedSave(true);\n            try {\n                List<SysAnnouncement> listSysAnnouncements = ExcelImportUtil.importExcel(file.getInputStream(), SysAnnouncement.class, params);\n                for (SysAnnouncement sysAnnouncementExcel : listSysAnnouncements) {\n                \tif(sysAnnouncementExcel.getDelFlag()==null){\n                \t\tsysAnnouncementExcel.setDelFlag(CommonConstant.DEL_FLAG_0.toString());\n\t\t\t\t\t}\n                \tif(oConvertUtils.isEmpty(sysAnnouncementExcel.getIzTop())){\n                \t\tsysAnnouncementExcel.setIzTop(CommonConstant.IZ_TOP_0);\n\t\t\t\t\t}\n                    sysAnnouncementService.save(sysAnnouncementExcel);\n                }\n                return Result.ok(\"文件导入成功！数据行数：\" + listSysAnnouncements.size());\n            } catch (Exception e) {\n                log.error(e.getMessage(),e);\n                return Result.error(\"文件导入失败！\");\n            } finally {\n                try {\n                    file.getInputStream().close();\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n            }\n        }\n        return Result.error(\"文件导入失败！\");\n    }\n\t/**\n\t *同步消息\n\t * @param anntId\n\t * @return\n\t */\n\t@RequestMapping(value = \"/syncNotic\", method = RequestMethod.GET)\n\tpublic Result<SysAnnouncement> syncNotic(@RequestParam(name=\"anntId\",required=false) String anntId, HttpServletRequest request) {\n\t\tResult<SysAnnouncement> result = new Result<SysAnnouncement>();\n\t\tJSONObject obj = new JSONObject();\n\t\tif(StringUtils.isNotBlank(anntId)){\n\t\t\tSysAnnouncement sysAnnouncement = sysAnnouncementService.getById(anntId);\n\t\t\tif(sysAnnouncement==null) {\n\t\t\t\tresult.error500(\"未找到对应实体\");\n\t\t\t}else {\n\t\t\t\tif(sysAnnouncement.getMsgType().equals(CommonConstant.MSG_TYPE_ALL)) {\n\t\t\t\t\tobj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_TOPIC);\n\t\t\t\t\tobj.put(WebsocketConst.MSG_ID, sysAnnouncement.getId());\n\t\t\t\t\tobj.put(WebsocketConst.MSG_TXT, sysAnnouncement.getTitile());\n\t\t\t\t\twebSocket.sendMessage(obj.toJSONString());\n\t\t\t\t}else {\n\t\t\t\t\t// 2.插入用户通告阅读标记表记录\n\t\t\t\t\tString userId = sysAnnouncement.getUserIds();\n\t\t\t\t\tif(oConvertUtils.isNotEmpty(userId)){\n\t\t\t\t\t\tString[] userIds = userId.substring(0, (userId.length()-1)).split(\",\");\n\t\t\t\t\t\tobj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);\n\t\t\t\t\t\tobj.put(WebsocketConst.MSG_ID, sysAnnouncement.getId());\n\t\t\t\t\t\tobj.put(WebsocketConst.MSG_TXT, sysAnnouncement.getTitile());\n\t\t\t\t\t\twebSocket.sendMessage(userIds, obj.toJSONString());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}else{\n\t\t\tobj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_TOPIC);\n\t\t\tobj.put(WebsocketConst.MSG_TXT, \"批量设置已读\");\n\t\t\twebSocket.sendMessage(obj.toJSONString());\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 通告查看详情页面（用于第三方APP）\n\t * @param modelAndView\n\t * @param id\n\t * @return\n\t */\n    @GetMapping(\"/show/{id}\")\n    public ModelAndView showContent(ModelAndView modelAndView, @PathVariable(\"id\") String id, HttpServletRequest request) {\n        SysAnnouncement announcement = sysAnnouncementService.getById(id);\n        if (announcement != null) {\n            boolean tokenOk = false;\n            try {\n                // 验证Token有效性\n                tokenOk = TokenUtils.verifyToken(request, sysBaseApi, redisUtil);\n            } catch (Exception ignored) {\n            }\n            // 判断是否传递了Token，并且Token有效，如果传了就不做查看限制，直接返回\n            // 如果Token无效，就做查看限制：只能查看已发布的\n            if (tokenOk || ANNOUNCEMENT_SEND_STATUS_1.equals(announcement.getSendStatus())) {\n\t\t\t\tLoginUser user = sysBaseApi.getUserByName(announcement.getSender());\n\t\t\t\tif(oConvertUtils.isNotEmpty(user)){\n\t\t\t\t\tannouncement.setSender(user.getRealname());\n\t\t\t\t}\n\t\t\t\tmodelAndView.addObject(\"data\", announcement);\n                modelAndView.setViewName(\"announcement/showContent\");\n                return modelAndView;\n            }\n        }\n        modelAndView.setStatus(HttpStatus.NOT_FOUND);\n        return modelAndView;\n    }\n\n\t/**\n\t * 【vue3用】 消息列表查询\n\t * @param fromUser\n\t * @param busType\n\t * @param starFlag\n\t * @param msgCategory\n\t * @param beginDate\n\t * @param endDate\n\t * @param pageNo\n\t * @param pageSize\n\t * @return\n\t */\n\t@RequestMapping(value = \"/vue3List\", method = RequestMethod.GET)\n\tpublic Result<List<SysAnnouncement>> vue3List(@RequestParam(name=\"fromUser\", required = false) String fromUser,\n\t\t\t\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"busType\", required = false) String busType,\n\t\t\t\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"starFlag\", required = false) String starFlag,\n\t\t\t\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"msgCategory\", required = false) String msgCategory,\n                                                  @RequestParam(name=\"rangeDateKey\", required = false) String rangeDateKey,\n                                                  @RequestParam(name=\"beginDate\", required = false) String beginDate, \n\t\t\t\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"endDate\", required = false) String endDate,\n\t\t\t\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo, \n\t\t\t\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n                                                  @RequestParam(name= \"noticeType\", required = false) String noticeType) {\n\t\tlong calStartTime = System.currentTimeMillis(); // 记录开始时间\n\t\t\n\t\t// 1、获取日期查询条件，开始时间和结束时间\n\t\tDate beginTime = null, endTime = null;\n\t\tif (RangeDateEnum.ZDY.getKey().equals(rangeDateKey)) {\n\t\t\t// 自定义日期范围查询\n\t\t\tif (oConvertUtils.isNotEmpty(beginDate)) {\n\t\t\t\tbeginTime = DateUtils.parseDatetime(beginDate);\n\t\t\t}\n\t\t\tif (oConvertUtils.isNotEmpty(endDate)) {\n\t\t\t\tendTime = DateUtils.parseDatetime(endDate);\n\t\t\t}\n\t\t} else {\n\t\t\t// 日期段落查询\n\t\t\tDate[] arr = RangeDateEnum.getRangeArray(rangeDateKey);\n\t\t\tif (arr != null) {\n\t\t\t\tbeginTime = arr[0];\n\t\t\t\tendTime = arr[1];\t\n\t\t\t}\n\t\t}\n\t\t\n\t\t// 2、根据条件查询用户的通知消息\n\t\tList<SysAnnouncement> ls = this.sysAnnouncementService.querySysMessageList(pageSize, pageNo, fromUser, starFlag,busType, msgCategory, beginTime, endTime, noticeType);\n\n\t\t// 3、设置当前页的消息为已读\n\t\tif (!CollectionUtils.isEmpty(ls)) {\n\t\t\t// 设置已读\n\t\t\tString readed = \"1\";\n\t\t\tList<String> annoceIdList = ls.stream().filter(item -> !readed.equals(item.getReadFlag())).map(item -> item.getId()).collect(Collectors.toList());\n\t\t\tif (!CollectionUtils.isEmpty(annoceIdList)) {\n\t\t\t\tcachedThreadPool.execute(() -> {\n\t\t\t\t\tsysAnnouncementService.updateReaded(annoceIdList);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t\n\t\tJSONObject obj = new JSONObject();\n\t\tobj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);\n\t\tLoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\twebSocket.sendMessage(sysUser.getId(), obj.toJSONString());\n\n\t\t// 4、性能统计耗时\n\t\tlong calEndTime = System.currentTimeMillis(); // 记录结束时间\n\t\tlong duration = calEndTime - calStartTime; // 计算耗时\n\t\t//System.out.println(\"耗时：\" + duration + \" 毫秒\");\n\t\t\n\t\treturn Result.ok(ls);\n\t}\n\n\n    /**\n     * 根据用户id获取最新一条消息发送时间(创建时间)\n     * @param userId\n     * @return\n     */\n\t@GetMapping(\"/getLastAnnountTime\")\n\tpublic Result<Page<SysAnnouncementSend>> getLastAnnountTime(@RequestParam(name = \"userId\") String userId,@RequestParam(name=\"noticeType\",required = false) String noticeType){\n\t\tResult<Page<SysAnnouncementSend>> result = new Result<>();\n\t\t//----------------------------------------------------------------------------------------\n\t\t// step.1 此接口过慢，可以采用缓存一小时方案\n\t\tString keyString = String.format(CommonConstant.CACHE_KEY_USER_LAST_ANNOUNT_TIME_1HOUR + \"_\" + noticeType, userId);\n\t\tif (redisTemplate.hasKey(keyString)) {\n\t\t\tlog.debug(\"[SysAnnouncementSend Redis] 通过Redis缓存查询用户最后一次收到系统通知时间，userId={}\", userId);\n\t\t\tPage<SysAnnouncementSend> pageList = (Page<SysAnnouncementSend>) redisTemplate.opsForValue().get(keyString);\n\t\t\tresult.setSuccess(true);\n\t\t\tresult.setResult(pageList);\n\t\t\treturn result;\n\t\t}\n\t\t//----------------------------------------------------------------------------------------\n\n\t\tPage<SysAnnouncementSend> page = new Page<>(1,1);\n        LambdaQueryWrapper<SysAnnouncementSend> query = new LambdaQueryWrapper<>();\n        query.eq(SysAnnouncementSend::getUserId,userId);\n        //只查询上个月和本月，的通知的数据\n\t\tquery.ne(SysAnnouncementSend::getCreateTime, DateRangeUtils.getLastMonthStartDay());\n        query.select(SysAnnouncementSend::getCreateTime); // 提高查询效率\n        query.orderByDesc(SysAnnouncementSend::getCreateTime);\n        Page<SysAnnouncementSend> pageList = sysAnnouncementSendService.page(page, query);\n\n\t\t//----------------------------------------------------------------------------------------\n\t\tif (pageList != null && pageList.getSize() > 0) {\n\t\t\t// step.3 保留1小时redis缓存\n\t\t\tredisTemplate.opsForValue().set(keyString, pageList, 3600, TimeUnit.SECONDS);\n\t\t}\n\t\t//----------------------------------------------------------------------------------------\n\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(pageList);\n        return result;\n    }\n\n\t/**\n\t * 清除当前用户所有未读消息\n\t * @return\n\t */\n\t@PostMapping(\"/clearAllUnReadMessage\")\n    public Result<String> clearAllUnReadMessage(){\n\t\tsysAnnouncementService.clearAllUnReadMessage();\n\t\treturn Result.ok(\"清除未读消息成功\");\n\t}\n\n\t/**\n\t * 添加访问次数\n\t * @param id\n\t * @return\n\t */\n\t@RequestMapping(value = \"/addVisitsNumber\", method = RequestMethod.GET)\n\tpublic Result<?> addVisitsNumber(@RequestParam(name=\"id\",required=true) String id) {\n\t\tint count = oConvertUtils.getInt(redisUtil.get(ANNO_CACHE_KEY+id),0) + 1;\n\t\tredisUtil.set(ANNO_CACHE_KEY+id, count);\n\n\t\tif (count % 5 == 0) {\n\t\t\tcachedThreadPool.execute(() -> {\n\t\t\t\tsysAnnouncementService.updateVisitsNum(id, count);\n\t\t\t});\n\t\t\t// 重置访问次数\n\t\t\tredisUtil.del(ANNO_CACHE_KEY+id);\n\t\t}\n\t\treturn Result.ok(\"公告消息访问次数+1次\");\n\t}\n\n\t/**\n\t * 批量下载文件\n\t * @param id\n\t * @param request\n\t * @param response\n\t */\n\t@GetMapping(\"/downLoadFiles\")\n\tpublic void downLoadFiles(@RequestParam(name=\"id\") String id,\n\t\t\t\t\t\t\t  HttpServletRequest request,\n\t\t\t\t\t\t\t  HttpServletResponse response){\n\t\tsysAnnouncementService.downLoadFiles(id,request,response);\n\t}\n\t/**\n\t * 根据异常信息确定友好的错误提示\n\t */\n\tprivate String determineErrorMessage(Exception e) {\n\t\tString errorMsg = e.getMessage();\n\t\tif (isSpecialCharacterError(errorMsg)) {\n\t\t\treturn SPECIAL_CHAR_ERROR;\n\t\t} else if (isContentTooLongError(errorMsg)) {\n\t\t\treturn CONTENT_TOO_LONG_ERROR;\n\t\t} else {\n\t\t\treturn DEFAULT_ERROR;\n\t\t}\n\t}\n\t/**\n\t * 判断是否为特殊字符错误\n\t */\n\tprivate boolean isSpecialCharacterError(String errorMsg) {\n\t\treturn errorMsg != null\n\t\t\t\t&& errorMsg.contains(\"Incorrect string value\")\n\t\t\t\t&& errorMsg.contains(\"column 'msg_content'\");\n\t}\n\n\t/**\n\t * 判断是否为内容过长错误\n\t */\n\tprivate boolean isContentTooLongError(String errorMsg) {\n\t\treturn errorMsg != null\n\t\t\t\t&& errorMsg.contains(\"Data too long for column 'msg_content'\");\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementSendController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport java.util.Arrays;\nimport java.util.Date;\n\nimport jakarta.servlet.http.HttpServletRequest;\n\nimport org.apache.commons.lang3.StringUtils;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.DataBaseConstant;\nimport org.jeecg.common.constant.WebsocketConst;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.SqlInjectionUtil;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.message.websocket.WebSocket;\nimport org.jeecg.modules.system.entity.SysAnnouncementSend;\nimport org.jeecg.modules.system.model.AnnouncementSendModel;\nimport org.jeecg.modules.system.service.ISysAnnouncementSendService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.DeleteMapping;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.PutMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;\nimport com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\n\nimport lombok.extern.slf4j.Slf4j;\n\n /**\n * @Title: Controller\n * @Description: 用户通告阅读标记表\n * @Author: jeecg-boot\n * @Date:  2019-02-21\n * @Version: V1.0\n */\n@RestController\n@RequestMapping(\"/sys/sysAnnouncementSend\")\n@Slf4j\npublic class SysAnnouncementSendController {\n\t@Autowired\n\tprivate ISysAnnouncementSendService sysAnnouncementSendService;\n\t@Autowired\n\tprivate WebSocket webSocket;\n\n\t/**\n\t  * 分页列表查询\n\t * @param sysAnnouncementSend\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t@GetMapping(value = \"/list\")\n\tpublic Result<IPage<SysAnnouncementSend>> queryPageList(SysAnnouncementSend sysAnnouncementSend,\n\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t\t  HttpServletRequest req) {\n\t\tResult<IPage<SysAnnouncementSend>> result = new Result<IPage<SysAnnouncementSend>>();\n\t\tQueryWrapper<SysAnnouncementSend> queryWrapper = new QueryWrapper<SysAnnouncementSend>(sysAnnouncementSend);\n\t\tPage<SysAnnouncementSend> page = new Page<SysAnnouncementSend>(pageNo,pageSize);\n\t\t//排序逻辑 处理\n\t\tString column = req.getParameter(\"column\");\n\t\tString order = req.getParameter(\"order\");\n\n\t\tif(oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) {\n\t\t\tif(DataBaseConstant.SQL_ASC.equals(order)) {\n\t\t\t\tqueryWrapper.orderByAsc(SqlInjectionUtil.getSqlInjectSortField(column));\n\t\t\t}else {\n\t\t\t\tqueryWrapper.orderByDesc(SqlInjectionUtil.getSqlInjectSortField(column));\n\t\t\t}\n\t\t}\n\t\tIPage<SysAnnouncementSend> pageList = sysAnnouncementSendService.page(page, queryWrapper);\n\t\t//log.info(\"查询当前页：\"+pageList.getCurrent());\n\t\t//log.info(\"查询当前页数量：\"+pageList.getSize());\n\t\t//log.info(\"查询结果数量：\"+pageList.getRecords().size());\n\t\t//log.info(\"数据总数：\"+pageList.getTotal());\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(pageList);\n\t\treturn result;\n\t}\n\t\n\t/**\n\t  *   添加\n\t * @param sysAnnouncementSend\n\t * @return\n\t */\n\t@PostMapping(value = \"/add\")\n\tpublic Result<SysAnnouncementSend> add(@RequestBody SysAnnouncementSend sysAnnouncementSend) {\n\t\tResult<SysAnnouncementSend> result = new Result<SysAnnouncementSend>();\n\t\ttry {\n\t\t\tsysAnnouncementSendService.save(sysAnnouncementSend);\n\t\t\tresult.success(\"添加成功！\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t\tresult.error500(\"操作失败\");\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t  *  编辑\n\t * @param sysAnnouncementSend\n\t * @return\n\t */\n\t@PutMapping(value = \"/edit\")\n\tpublic Result<SysAnnouncementSend> eidt(@RequestBody SysAnnouncementSend sysAnnouncementSend) {\n\t\tResult<SysAnnouncementSend> result = new Result<SysAnnouncementSend>();\n\t\tSysAnnouncementSend sysAnnouncementSendEntity = sysAnnouncementSendService.getById(sysAnnouncementSend.getId());\n\t\tif(sysAnnouncementSendEntity==null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}else {\n\t\t\tboolean ok = sysAnnouncementSendService.updateById(sysAnnouncementSend);\n\t\t\t//TODO 返回false说明什么？\n\t\t\tif(ok) {\n\t\t\t\tresult.success(\"操作成功!\");\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\t\n\t/**\n\t  *   通过id删除\n\t * @param id\n\t * @return\n\t */\n\t@DeleteMapping(value = \"/delete\")\n\tpublic Result<SysAnnouncementSend> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\tResult<SysAnnouncementSend> result = new Result<SysAnnouncementSend>();\n        //根据用户id和通告阅读表的id获取当前用户已阅读的数量\n\t\tlong count = sysAnnouncementSendService.getReadCountByUserId(id);\n\t\tif(0 == count) {\n\t\t\tresult.error500(\"删除失败，该数据不存在或尚未标记为“已读”\");\n\t\t}else {\n\t\t\tboolean ok = sysAnnouncementSendService.removeById(id);\n\t\t\tif(ok) {\n\t\t\t\tresult.success(\"删除成功!\");\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\t\n\t/**\n\t  *  批量删除\n\t * @param ids\n\t * @return\n\t */\n\t@DeleteMapping(value = \"/deleteBatch\")\n\tpublic Result<SysAnnouncementSend> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tResult<SysAnnouncementSend> result = new Result<SysAnnouncementSend>();\n\t\tif(ids==null || \"\".equals(ids.trim())) {\n\t\t\tresult.error500(\"参数不识别！\");\n\t\t}else {\n\t\t\tthis.sysAnnouncementSendService.deleteBatchByIds(ids);\n\t\t\tresult.success(\"已阅读的消息删除成功!\");\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t  * 通过id查询\n\t * @param id\n\t * @return\n\t */\n\t@GetMapping(value = \"/queryById\")\n\tpublic Result<SysAnnouncementSend> queryById(@RequestParam(name=\"id\",required=true) String id) {\n\t\tResult<SysAnnouncementSend> result = new Result<SysAnnouncementSend>();\n\t\tSysAnnouncementSend sysAnnouncementSend = sysAnnouncementSendService.getById(id);\n\t\tif(sysAnnouncementSend==null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}else {\n\t\t\tresult.setResult(sysAnnouncementSend);\n\t\t\tresult.setSuccess(true);\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * @功能：更新用户系统消息阅读状态\n\t * @param json\n\t * @return\n\t */\n\t@PutMapping(value = \"/editByAnntIdAndUserId\")\n\tpublic Result<SysAnnouncementSend> editById(@RequestBody JSONObject json) {\n\t\tResult<SysAnnouncementSend> result = new Result<SysAnnouncementSend>();\n\t\tString anntId = json.getString(\"anntId\");\n\t\tLoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();\n\t\tString userId = sysUser.getId();\n\t\tLambdaUpdateWrapper<SysAnnouncementSend> updateWrapper = new UpdateWrapper().lambda();\n\t\tupdateWrapper.set(SysAnnouncementSend::getReadFlag, CommonConstant.HAS_READ_FLAG);\n\t\tupdateWrapper.set(SysAnnouncementSend::getReadTime, new Date());\n\t\t// 代码逻辑说明: 系统模块存在的sql漏洞写法\n\t\tupdateWrapper.eq(SysAnnouncementSend::getAnntId,anntId);\n\t\tupdateWrapper.eq(SysAnnouncementSend::getUserId,userId);\n\t\t//updateWrapper.last(\"where annt_id ='\"+anntId+\"' and user_id ='\"+userId+\"'\");\n\t\tSysAnnouncementSend announcementSend = new SysAnnouncementSend();\n\t\tsysAnnouncementSendService.update(announcementSend, updateWrapper);\n\t\tresult.setSuccess(true);\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * @功能：获取我的消息\n\t * @return\n\t */\n\t@GetMapping(value = \"/getMyAnnouncementSend\")\n\tpublic Result<IPage<AnnouncementSendModel>> getMyAnnouncementSend(AnnouncementSendModel announcementSendModel,\n\t\t\t@RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t    @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize) {\n\t\tResult<IPage<AnnouncementSendModel>> result = new Result<IPage<AnnouncementSendModel>>();\n\t\tLoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();\n\t\tString userId = sysUser.getId();\n\t\tannouncementSendModel.setUserId(userId);\n\t\tannouncementSendModel.setPageNo((pageNo-1)*pageSize);\n\t\tannouncementSendModel.setPageSize(pageSize);\n\t\t// 代码逻辑说明: 【TV360X-545】我的消息列表不能通过时间范围查询---\n\t\tif(StringUtils.isNotEmpty(announcementSendModel.getSendTimeBegin())){\n\t\t\tannouncementSendModel.setSendTimeBegin(announcementSendModel.getSendTimeBegin() + \" 00:00:00\");\n\t\t}\n\t\tif(StringUtils.isNotEmpty(announcementSendModel.getSendTimeBegin())){\n\t\t\tannouncementSendModel.setSendTimeEnd(announcementSendModel.getSendTimeEnd() + \" 23:59:59\");\n\t\t}\n\t\tPage<AnnouncementSendModel> pageList = new Page<AnnouncementSendModel>(pageNo,pageSize);\n\t\tpageList = sysAnnouncementSendService.getMyAnnouncementSendPage(pageList, announcementSendModel);\n\t\tresult.setResult(pageList);\n\t\tresult.setSuccess(true);\n\t\treturn result;\n\t}\n\n\t/**\n\t * @功能：一键已读\n\t * @return\n\t */\n\t@PutMapping(value = \"/readAll\")\n\tpublic Result<SysAnnouncementSend> readAll() {\n\t\tResult<SysAnnouncementSend> result = new Result<SysAnnouncementSend>();\n\t\tLoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();\n\t\tString userId = sysUser.getId();\n\t\tLambdaUpdateWrapper<SysAnnouncementSend> updateWrapper = new UpdateWrapper().lambda();\n\t\tupdateWrapper.set(SysAnnouncementSend::getReadFlag, CommonConstant.HAS_READ_FLAG);\n\t\tupdateWrapper.set(SysAnnouncementSend::getReadTime, new Date());\n\t\tupdateWrapper.eq(SysAnnouncementSend::getUserId,userId);\n\t\t//updateWrapper.last(\"where user_id ='\"+userId+\"'\");\n\t\tSysAnnouncementSend announcementSend = new SysAnnouncementSend();\n\t\tsysAnnouncementSendService.update(announcementSend, updateWrapper);\n\t\tJSONObject socketParams = new JSONObject();\n\t\tsocketParams.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_TOPIC);\n\t\twebSocket.sendMessage(socketParams.toJSONString());\n\t\tresult.setSuccess(true);\n\t\tresult.setMessage(\"全部已读\");\n\t\treturn result;\n\t}\n\n\n\t /**\n\t  * 根据消息发送记录ID获取消息内容\n\t  * @param sendId\n\t  * @return\n\t  */\n\t @GetMapping(value = \"/getOne\")\n\t public Result<AnnouncementSendModel> getOne(@RequestParam(name=\"sendId\",required=true) String sendId) {\n\t\t AnnouncementSendModel model = sysAnnouncementSendService.getOne(sendId);\n\t\t return Result.ok(model);\n\t }\n\n\t /**\n\t  * 根据业务类型和ID修改阅读状态\n\t  * @param busType\n\t  * @return\n\t  */\n\t @GetMapping(value = \"/updateSysAnnounReadFlag\")\n\t public Result<AnnouncementSendModel> updateSysAnnounReadFlag(\n\t\t\t @RequestParam(name=\"busId\",required=true) String busId,\n\t\t\t @RequestParam(name=\"busType\",required=false) String busType) {\n\t\t //更新阅读状态\n\t\t sysAnnouncementSendService.updateReadFlagByBusId(busId,busType);\n\n\t\t //刷新未读数量\n\t\t JSONObject obj = new JSONObject();\n\t\t obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);\n\t\t LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\t webSocket.sendMessage(sysUser.getId(), obj.toJSONString());\n\n\t\t return Result.ok();\n\t }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysAppVersionController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.authz.annotation.RequiresRoles;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.util.RedisUtil;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysAppVersion;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\n/**\n* @Description: app系统配置\n* @Author: jeecg-boot\n* @Date:   2025-07-05\n* @Version: V1.0\n*/\n@Tag(name=\"app系统配置\")\n@RestController\n@RequestMapping(\"/sys/version\")\n@Slf4j\npublic class SysAppVersionController{\n\n    @Autowired\n    private RedisUtil redisUtil;\n\n    /**\n     * APP缓存前缀\n     */\n    private String APP3_VERSION = \"app3:version\";\n    /**\n     * app3版本信息\n     * @return\n     */\n    @Operation(summary=\"app版本\")\n    @GetMapping(value = \"/app3version\")\n    public Result<SysAppVersion> app3Version(@RequestParam(name=\"key\", required = false)String appKey) throws Exception {\n        Object appConfig = redisUtil.get(APP3_VERSION + appKey);\n        if (oConvertUtils.isNotEmpty(appConfig)) {\n            try {\n                SysAppVersion sysAppVersion = (SysAppVersion)appConfig;\n                return Result.OK(sysAppVersion);\n            } catch (Exception e) {\n                log.error(e.toString(),e);\n                return Result.error(\"app版本信息获取失败：\" + e.getMessage());\n            }\n        }\n        return Result.OK();\n    }\n\n\n    /**\n     *   保存APP3\n     *\n     * @param sysAppVersion\n     * @return\n     */\n    @RequiresRoles({\"admin\"})\n    @Operation(summary=\"app系统配置-保存\")\n    @PostMapping(value = \"/saveVersion\")\n    public Result<?> saveVersion(@RequestBody SysAppVersion sysAppVersion) {\n        String id = sysAppVersion.getId();\n        redisUtil.set(APP3_VERSION + id,sysAppVersion);\n        return Result.OK();\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCategoryController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport com.alibaba.fastjson.JSON;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.vo.DictModel;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.ImportExcelUtil;\nimport org.jeecg.common.util.ReflectHelper;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.modules.system.entity.SysCategory;\nimport org.jeecg.modules.system.model.TreeSelectModel;\nimport org.jeecg.modules.system.service.ISysCategoryService;\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.entity.enmus.ExcelType;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.util.*;\nimport java.util.stream.Collectors;\n\n /**\n * @Description: 分类字典\n * @Author: jeecg-boot\n * @Date:   2019-05-29\n * @Version: V1.0\n */\n@RestController\n@RequestMapping(\"/sys/category\")\n@Slf4j\npublic class SysCategoryController {\n\t@Autowired\n\tprivate ISysCategoryService sysCategoryService;\n\n     /**\n      * 分类编码0\n      */\n     private static final String CATEGORY_ROOT_CODE = \"0\";\n\n\t/**\n\t  * 分页列表查询\n\t * @param sysCategory\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t@GetMapping(value = \"/rootList\")\n\tpublic Result<IPage<SysCategory>> queryPageList(SysCategory sysCategory,\n\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t\t  HttpServletRequest req) {\n\t\tif(oConvertUtils.isEmpty(sysCategory.getPid())){\n\t\t\tsysCategory.setPid(\"0\");\n\t\t}\n\t\tResult<IPage<SysCategory>> result = new Result<IPage<SysCategory>>();\n\t\t//------------------------------------------------------------------------------------------------\n\t\t//是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\tsysCategory.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(),0));\n\t\t}\n\t\t//------------------------------------------------------------------------------------------------\n\t\t\n\t\t//--author:os_chengtgen---date:20190804 -----for: 分类字典页面显示错误,issues:377--------start\n\t\t//--author:liusq---date:20211119 -----for: 【vue3】分类字典页面查询条件配置--------start\n\t\tQueryWrapper<SysCategory> queryWrapper = QueryGenerator.initQueryWrapper(sysCategory, req.getParameterMap());\n\t\tString name = sysCategory.getName();\n\t\tString code = sysCategory.getCode();\n\t\t//QueryWrapper<SysCategory> queryWrapper = new QueryWrapper<SysCategory>();\n\t\tif(StringUtils.isBlank(name)&&StringUtils.isBlank(code)){\n\t\t\tqueryWrapper.eq(\"pid\", sysCategory.getPid());\n\t\t}\n\t\t//--author:liusq---date:20211119 -----for: 分类字典页面查询条件配置--------end\n\t\t//--author:os_chengtgen---date:20190804 -----for:【vue3】 分类字典页面显示错误,issues:377--------end\n\n\t\tPage<SysCategory> page = new Page<SysCategory>(pageNo, pageSize);\n\t\tIPage<SysCategory> pageList = sysCategoryService.page(page, queryWrapper);\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(pageList);\n\t\treturn result;\n\t}\n\t\n\t@GetMapping(value = \"/childList\")\n\tpublic Result<List<SysCategory>> queryPageList(SysCategory sysCategory,HttpServletRequest req) {\n\t\t//------------------------------------------------------------------------------------------------\n\t\t//是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\tsysCategory.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(), 0));\n\t\t}\n\t\t//------------------------------------------------------------------------------------------------\n\t\tResult<List<SysCategory>> result = new Result<List<SysCategory>>();\n\t\tQueryWrapper<SysCategory> queryWrapper = QueryGenerator.initQueryWrapper(sysCategory, req.getParameterMap());\n\t\tList<SysCategory> list = sysCategoryService.list(queryWrapper);\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(list);\n\t\treturn result;\n\t}\n\t\n\t\n\t/**\n\t  *   添加\n\t * @param sysCategory\n\t * @return\n\t */\n\t@PostMapping(value = \"/add\")\n\tpublic Result<SysCategory> add(@RequestBody SysCategory sysCategory) {\n\t\tResult<SysCategory> result = new Result<SysCategory>();\n\t\ttry {\n\t\t\tsysCategoryService.addSysCategory(sysCategory);\n\t\t\tresult.success(\"添加成功！\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t\tresult.error500(\"操作失败\");\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t  *  编辑\n\t * @param sysCategory\n\t * @return\n\t */\n\t@RequestMapping(value = \"/edit\", method = { RequestMethod.PUT,RequestMethod.POST })\n\tpublic Result<SysCategory> edit(@RequestBody SysCategory sysCategory) {\n\t\tResult<SysCategory> result = new Result<SysCategory>();\n\t\tSysCategory sysCategoryEntity = sysCategoryService.getById(sysCategory.getId());\n\t\tif(sysCategoryEntity==null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}else {\n\t\t\tsysCategoryService.updateSysCategory(sysCategory);\n\t\t\tresult.success(\"修改成功!\");\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t  *   通过id删除\n\t * @param id\n\t * @return\n\t */\n\t@DeleteMapping(value = \"/delete\")\n\tpublic Result<SysCategory> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\tResult<SysCategory> result = new Result<SysCategory>();\n\t\tSysCategory sysCategory = sysCategoryService.getById(id);\n\t\tif(sysCategory==null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}else {\n\t\t\tthis.sysCategoryService.deleteSysCategory(id);\n\t\t\tresult.success(\"删除成功!\");\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\t\n\t/**\n\t  *  批量删除\n\t * @param ids\n\t * @return\n\t */\n\t@DeleteMapping(value = \"/deleteBatch\")\n\tpublic Result<SysCategory> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tResult<SysCategory> result = new Result<SysCategory>();\n\t\tif(ids==null || \"\".equals(ids.trim())) {\n\t\t\tresult.error500(\"参数不识别！\");\n\t\t}else {\n\t\t\tthis.sysCategoryService.deleteSysCategory(ids);\n\t\t\tresult.success(\"删除成功!\");\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t  * 通过id查询\n\t * @param id\n\t * @return\n\t */\n\t@GetMapping(value = \"/queryById\")\n\tpublic Result<SysCategory> queryById(@RequestParam(name=\"id\",required=true) String id) {\n\t\tResult<SysCategory> result = new Result<SysCategory>();\n\t\tSysCategory sysCategory = sysCategoryService.getById(id);\n\t\tif(sysCategory==null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}else {\n\t\t\tresult.setResult(sysCategory);\n\t\t\tresult.setSuccess(true);\n\t\t}\n\t\treturn result;\n\t}\n\n  /**\n      * 导出excel\n   *\n   * @param request\n   */\n  @RequestMapping(value = \"/exportXls\")\n  public ModelAndView exportXls(HttpServletRequest request, SysCategory sysCategory) {\n\t  //------------------------------------------------------------------------------------------------\n\t  //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n\t  if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t  sysCategory.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(), 0));\n\t  }\n\t  //------------------------------------------------------------------------------------------------\n\t  \n      // Step.1 组装查询条件查询数据\n      QueryWrapper<SysCategory> queryWrapper = QueryGenerator.initQueryWrapper(sysCategory, request.getParameterMap());\n      List<SysCategory> pageList = sysCategoryService.list(queryWrapper);\n      // Step.2 AutoPoi 导出Excel\n      ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n      // 过滤选中数据\n      String selections = request.getParameter(\"selections\");\n      if(oConvertUtils.isEmpty(selections)) {\n    \t  mv.addObject(NormalExcelConstants.DATA_LIST, pageList);\n      }else {\n    \t  List<String> selectionList = Arrays.asList(selections.split(\",\"));\n    \t  List<SysCategory> exportList = pageList.stream().filter(item -> selectionList.contains(item.getId())).collect(Collectors.toList());\n    \t  mv.addObject(NormalExcelConstants.DATA_LIST, exportList);\n      }\n      //导出文件名称\n      mv.addObject(NormalExcelConstants.FILE_NAME, \"分类字典列表\");\n      mv.addObject(NormalExcelConstants.CLASS, SysCategory.class);\n      LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n      //导出支持xlsx\n      mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(\"分类字典列表数据\", \"导出人:\"+user.getRealname(), \"导出信息\", ExcelType.XSSF));\n      //分类字典导出支持导出字段\n      String exportFields = request.getParameter(NormalExcelConstants.EXPORT_FIELDS);\n      if(oConvertUtils.isNotEmpty(exportFields)){\n          mv.addObject(NormalExcelConstants.EXPORT_FIELDS, exportFields);\n      }\n      return mv;\n  }\n\n  /**\n      * 通过excel导入数据\n   *\n   * @param request\n   * @param response\n   * @return\n   */\n  @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n  public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) throws IOException{\n      MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n      Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n\t  // 错误信息\n\t  List<String> errorMessage = new ArrayList<>();\n\t  int successLines = 0, errorLines = 0;\n\t  for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n          // 获取上传文件对象\n          MultipartFile file = entity.getValue();\n          ImportParams params = new ImportParams();\n          params.setTitleRows(2);\n          params.setHeadRows(1);\n          params.setNeedSave(true);\n          try {\n              List<SysCategory> listSysCategorys = ExcelImportUtil.importExcel(file.getInputStream(), SysCategory.class, params);\n\t\t\t  // 代码逻辑说明: [issues/8612]分类字典导入bug #8612 ------------\n\t\t\t  Set<String> parentCategoryIds = new HashSet<>();\n\t\t\t //按照编码长度排序\n              Collections.sort(listSysCategorys);\n\t\t\t  log.info(\"排序后的list====>\",listSysCategorys);\n              for (int i = 0; i < listSysCategorys.size(); i++) {\n\t\t\t\t  SysCategory sysCategoryExcel = listSysCategorys.get(i);\n\t\t\t\t  String code = sysCategoryExcel.getCode();\n\t\t\t\t  if(code.length()>3){\n\t\t\t\t\t  String pCode = sysCategoryExcel.getCode().substring(0,code.length()-3);\n\t\t\t\t\t  log.info(\"pCode====>\",pCode);\n\t\t\t\t\t  String pId=sysCategoryService.queryIdByCode(pCode);\n\t\t\t\t\t  log.info(\"pId====>\",pId);\n\t\t\t\t\t  if(StringUtils.isNotBlank(pId)){\n\t\t\t\t\t\t  sysCategoryExcel.setPid(pId);\n\t\t\t\t\t\t  parentCategoryIds.add(pId);\n\t\t\t\t\t  }\n\t\t\t\t  }else{\n\t\t\t\t\t  sysCategoryExcel.setPid(\"0\");\n\t\t\t\t  }\n\t\t\t\t  try {\n\t\t\t\t\t  sysCategoryService.save(sysCategoryExcel);\n\t\t\t\t\t  successLines++;\n\t\t\t\t  } catch (Exception e) {\n\t\t\t\t\t  errorLines++;\n\t\t\t\t\t  String message = e.getMessage().toLowerCase();\n\t\t\t\t\t  int lineNumber = i + 1;\n\t\t\t\t\t  // 通过索引名判断出错信息\n\t\t\t\t\t  if (message.contains(CommonConstant.SQL_INDEX_UNIQ_CATEGORY_CODE)) {\n\t\t\t\t\t\t  errorMessage.add(\"第 \" + lineNumber + \" 行：分类编码已经存在，忽略导入。\");\n\t\t\t\t\t  }  else {\n\t\t\t\t\t\t  errorMessage.add(\"第 \" + lineNumber + \" 行：未知错误，忽略导入\");\n\t\t\t\t\t\t  log.error(e.getMessage(), e);\n\t\t\t\t\t  }\n\t\t\t\t  }\n              }\n\t\t\t  // 代码逻辑说明: [issues/8612]分类字典导入bug #8612 ------------\n\t\t\t  if(oConvertUtils.isObjectNotEmpty(parentCategoryIds)){\n\t\t\t\t  for (String parentCategoryId : parentCategoryIds) {\n\t\t\t\t\t  SysCategory parentCategory = sysCategoryService.getById(parentCategoryId);\n\t\t\t\t\t  if(oConvertUtils.isObjectNotEmpty(parentCategory)){\n\t\t\t\t\t\t  parentCategory.setHasChild(CommonConstant.STATUS_1);\n\t\t\t\t\t\t  sysCategoryService.updateById(parentCategory);\n\t\t\t\t\t  }\n\t\t\t\t  }\n\t\t\t  }\n          } catch (Exception e) {\n\t\t\t  errorMessage.add(\"发生异常：\" + e.getMessage());\n\t\t\t  log.error(e.getMessage(), e);\n          } finally {\n              try {\n                  file.getInputStream().close();\n              } catch (IOException e) {\n                  e.printStackTrace();\n              }\n          }\n      }\n      return ImportExcelUtil.imporReturnRes(errorLines,successLines,errorMessage);\n  }\n  \n  \n  \n  /**\n     * 加载单个数据 用于回显\n   */\n    @RequestMapping(value = \"/loadOne\", method = RequestMethod.GET)\n \tpublic Result<SysCategory> loadOne(@RequestParam(name=\"field\") String field,@RequestParam(name=\"val\") String val) {\n \t\tResult<SysCategory> result = new Result<SysCategory>();\n \t\ttry {\n\t\t\t// 代码逻辑说明: issues/3663 sql注入问题\n\t\t\tboolean isClassField = ReflectHelper.isClassField(field, SysCategory.class);\n\t\t\tif (!isClassField) {\n\t\t\t\treturn Result.error(\"字段无效，请检查!\");\n\t\t\t}\n \t\t\tQueryWrapper<SysCategory> query = new QueryWrapper<SysCategory>();\n \t\t\tquery.eq(field, val);\n \t\t\tList<SysCategory> ls = this.sysCategoryService.list(query);\n \t\t\tif(ls==null || ls.size()==0) {\n \t\t\t\tresult.setMessage(\"查询无果\");\n \t \t\t\tresult.setSuccess(false);\n \t\t\t}else if(ls.size()>1) {\n \t\t\t\tresult.setMessage(\"查询数据异常,[\"+field+\"]存在多个值:\"+val);\n \t \t\t\tresult.setSuccess(false);\n \t\t\t}else {\n \t\t\t\tresult.setSuccess(true);\n \t\t\t\tresult.setResult(ls.get(0));\n \t\t\t}\n \t\t} catch (Exception e) {\n \t\t\te.printStackTrace();\n \t\t\tresult.setMessage(e.getMessage());\n \t\t\tresult.setSuccess(false);\n \t\t}\n \t\treturn result;\n \t}\n   \n    /**\n          * 加载节点的子数据\n     */\n    @RequestMapping(value = \"/loadTreeChildren\", method = RequestMethod.GET)\n\tpublic Result<List<TreeSelectModel>> loadTreeChildren(@RequestParam(name=\"pid\") String pid) {\n\t\tResult<List<TreeSelectModel>> result = new Result<List<TreeSelectModel>>();\n\t\ttry {\n\t\t\tList<TreeSelectModel> ls = this.sysCategoryService.queryListByPid(pid);\n\t\t\tresult.setResult(ls);\n\t\t\tresult.setSuccess(true);\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\tresult.setMessage(e.getMessage());\n\t\t\tresult.setSuccess(false);\n\t\t}\n\t\treturn result;\n\t}\n    \n    /**\n         * 加载一级节点/如果是同步 则所有数据\n     */\n    @RequestMapping(value = \"/loadTreeRoot\", method = RequestMethod.GET)\n   \tpublic Result<List<TreeSelectModel>> loadTreeRoot(@RequestParam(name=\"async\") Boolean async,@RequestParam(name=\"pcode\") String pcode) {\n   \t\tResult<List<TreeSelectModel>> result = new Result<List<TreeSelectModel>>();\n   \t\ttry {\n   \t\t\tList<TreeSelectModel> ls = this.sysCategoryService.queryListByCode(pcode);\n   \t\t\tif(!async) {\n   \t\t\t\tloadAllCategoryChildren(ls);\n   \t\t\t}\n   \t\t\tresult.setResult(ls);\n   \t\t\tresult.setSuccess(true);\n   \t\t} catch (Exception e) {\n   \t\t\te.printStackTrace();\n   \t\t\tresult.setMessage(e.getMessage());\n   \t\t\tresult.setSuccess(false);\n   \t\t}\n   \t\treturn result;\n   \t}\n  \n    /**\n         * 递归求子节点 同步加载用到\n     */\n  \tprivate void loadAllCategoryChildren(List<TreeSelectModel> ls) {\n  \t\tfor (TreeSelectModel tsm : ls) {\n\t\t\tList<TreeSelectModel> temp = this.sysCategoryService.queryListByPid(tsm.getKey());\n\t\t\tif(temp!=null && temp.size()>0) {\n\t\t\t\ttsm.setChildren(temp);\n\t\t\t\tloadAllCategoryChildren(temp);\n\t\t\t}\n\t\t}\n  \t}\n\n\t /**\n\t  * 校验编码\n\t  * @param pid\n\t  * @param code\n\t  * @return\n\t  */\n\t @GetMapping(value = \"/checkCode\")\n\t public Result<?> checkCode(@RequestParam(name=\"pid\",required = false) String pid,@RequestParam(name=\"code\",required = false) String code) {\n\t\tif(oConvertUtils.isEmpty(code)){\n\t\t\treturn Result.error(\"错误,类型编码为空!\");\n\t\t}\n\t\tif(oConvertUtils.isEmpty(pid)){\n\t\t\treturn Result.ok();\n\t\t}\n\t\tSysCategory parent = this.sysCategoryService.getById(pid);\n\t\tif(code.startsWith(parent.getCode())){\n\t\t\treturn Result.ok();\n\t\t}else{\n\t\t\treturn Result.error(\"编码不符合规范,须以\\\"\"+parent.getCode()+\"\\\"开头!\");\n\t\t}\n\n\t }\n\n\n\t /**\n\t  * 分类字典树控件 加载节点\n\t  * @param pid\n\t  * @param pcode\n\t  * @param condition\n\t  * @return\n\t  */\n\t @RequestMapping(value = \"/loadTreeData\", method = RequestMethod.GET)\n\t public Result<List<TreeSelectModel>> loadDict(@RequestParam(name=\"pid\",required = false) String pid,@RequestParam(name=\"pcode\",required = false) String pcode, @RequestParam(name=\"condition\",required = false) String condition) {\n\t\t Result<List<TreeSelectModel>> result = new Result<List<TreeSelectModel>>();\n\t\t //pid如果传值了 就忽略pcode的作用\n\t\t if(oConvertUtils.isEmpty(pid)){\n\t\t \tif(oConvertUtils.isEmpty(pcode)){\n\t\t\t\tresult.setSuccess(false);\n\t\t\t\tresult.setMessage(\"加载分类字典树参数有误.[null]!\");\n\t\t\t\treturn result;\n\t\t\t}else{\n\t\t \t\tif(ISysCategoryService.ROOT_PID_VALUE.equals(pcode)){\n\t\t\t\t\tpid = ISysCategoryService.ROOT_PID_VALUE;\n\t\t\t\t}else{\n\t\t\t\t\tpid = this.sysCategoryService.queryIdByCode(pcode);\n\t\t\t\t}\n\t\t\t\tif(oConvertUtils.isEmpty(pid)){\n\t\t\t\t\tresult.setSuccess(false);\n\t\t\t\t\tresult.setMessage(\"加载分类字典树参数有误.[code]!\");\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t }\n\t\t Map<String, String> query = null;\n\t\t if(oConvertUtils.isNotEmpty(condition)) {\n\t\t\t query = JSON.parseObject(condition, Map.class);\n\t\t }\n\t\t List<TreeSelectModel> ls = sysCategoryService.queryListByPid(pid,query);\n\t\t result.setSuccess(true);\n\t\t result.setResult(ls);\n\t\t return result;\n\t }\n\n\t /**\n\t  * 分类字典控件数据回显[表单页面]\n\t  *\n\t  * @param ids\n\t  * @param delNotExist 是否移除不存在的项，默认为true，设为false如果某个key不存在数据库中，则直接返回key本身\n\t  * @return\n\t  */\n\t @RequestMapping(value = \"/loadDictItem\", method = RequestMethod.GET)\n\t public Result<List<String>> loadDictItem(@RequestParam(name = \"ids\") String ids, @RequestParam(name = \"delNotExist\", required = false, defaultValue = \"true\") boolean delNotExist) {\n\t\t Result<List<String>> result = new Result<>();\n\t\t // 非空判断\n\t\t if (StringUtils.isBlank(ids)) {\n\t\t\t result.setSuccess(false);\n\t\t\t result.setMessage(\"ids 不能为空\");\n\t\t\t return result;\n\t\t }\n\t\t // 查询数据\n\t\t List<String> textList = sysCategoryService.loadDictItem(ids, delNotExist);\n\t\t result.setSuccess(true);\n\t\t result.setResult(textList);\n\t\t return result;\n\t }\n\n\t /**\n\t  * [列表页面]加载分类字典数据 用于值的替换\n\t  * @param code\n\t  * @return\n\t  */\n\t @RequestMapping(value = \"/loadAllData\", method = RequestMethod.GET)\n\t public Result<List<DictModel>> loadAllData(@RequestParam(name=\"code\",required = true) String code) {\n\t\t Result<List<DictModel>> result = new Result<List<DictModel>>();\n\t\t LambdaQueryWrapper<SysCategory> query = new LambdaQueryWrapper<SysCategory>();\n\t\t if(oConvertUtils.isNotEmpty(code) && !CATEGORY_ROOT_CODE.equals(code)){\n\t\t\t query.likeRight(SysCategory::getCode,code);\n\t\t }\n\t\t List<SysCategory> list = this.sysCategoryService.list(query);\n\t\t if(list==null || list.size()==0) {\n\t\t\t result.setMessage(\"无数据,参数有误.[code]\");\n\t\t\t result.setSuccess(false);\n\t\t\t return result;\n\t\t }\n\t\t List<DictModel> rdList = new ArrayList<DictModel>();\n\t\t for (SysCategory c : list) {\n\t\t\t rdList.add(new DictModel(c.getId(),c.getName()));\n\t\t }\n\t\t result.setSuccess(true);\n\t\t result.setResult(rdList);\n\t\t return result;\n\t }\n\n\t /**\n\t  * 根据父级id批量查询子节点\n\t  * @param parentIds\n\t  * @return\n\t  */\n\t @GetMapping(\"/getChildListBatch\")\n\t public Result getChildListBatch(@RequestParam(\"parentIds\") String parentIds) {\n\t\t try {\n\t\t\t QueryWrapper<SysCategory> queryWrapper = new QueryWrapper<>();\n\t\t\t List<String> parentIdList = Arrays.asList(parentIds.split(\",\"));\n\t\t\t queryWrapper.in(\"pid\", parentIdList);\n\t\t\t List<SysCategory> list = sysCategoryService.list(queryWrapper);\n\t\t\t IPage<SysCategory> pageList = new Page<>(1, 10, list.size());\n\t\t\t pageList.setRecords(list);\n\t\t\t return Result.OK(pageList);\n\t\t } catch (Exception e) {\n\t\t\t log.error(e.getMessage(), e);\n\t\t\t return Result.error(\"批量查询子节点失败：\" + e.getMessage());\n\t\t }\n\t }\n\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCheckRuleController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.modules.system.entity.SysCheckRule;\nimport org.jeecg.modules.system.service.ISysCheckRuleService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLDecoder;\nimport java.util.Arrays;\n\n/**\n * @Description: 编码校验规则\n * @Author: jeecg-boot\n * @Date: 2020-02-04\n * @Version: V1.0\n */\n@Slf4j\n@Tag(name = \"编码校验规则\")\n@RestController\n@RequestMapping(\"/sys/checkRule\")\npublic class SysCheckRuleController extends JeecgController<SysCheckRule, ISysCheckRuleService> {\n\n    @Autowired\n    private ISysCheckRuleService sysCheckRuleService;\n\n    /**\n     * 分页列表查询\n     *\n     * @param sysCheckRule\n     * @param pageNo\n     * @param pageSize\n     * @param request\n     * @return\n     */\n    @AutoLog(value = \"编码校验规则-分页列表查询\")\n    @Operation(summary = \"编码校验规则-分页列表查询\")\n    @GetMapping(value = \"/list\")\n    public Result queryPageList(\n            SysCheckRule sysCheckRule,\n            @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n            @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n            HttpServletRequest request\n    ) {\n        QueryWrapper<SysCheckRule> queryWrapper = QueryGenerator.initQueryWrapper(sysCheckRule, request.getParameterMap());\n        Page<SysCheckRule> page = new Page<>(pageNo, pageSize);\n        IPage<SysCheckRule> pageList = sysCheckRuleService.page(page, queryWrapper);\n        return Result.ok(pageList);\n    }\n\n\n    /**\n     * 通过id查询\n     *\n     * @param ruleCode\n     * @return\n     */\n    @AutoLog(value = \"编码校验规则-通过Code校验传入的值\")\n    @Operation(summary = \"编码校验规则-通过Code校验传入的值\")\n    @GetMapping(value = \"/checkByCode\")\n    public Result checkByCode(\n            @RequestParam(name = \"ruleCode\") String ruleCode,\n            @RequestParam(name = \"value\") String value\n    ) throws UnsupportedEncodingException {\n        SysCheckRule sysCheckRule = sysCheckRuleService.getByCode(ruleCode);\n        if (sysCheckRule == null) {\n            return Result.error(\"该编码不存在\");\n        }\n        JSONObject errorResult = sysCheckRuleService.checkValue(sysCheckRule, URLDecoder.decode(value, \"UTF-8\"));\n        if (errorResult == null) {\n            return Result.ok();\n        } else {\n            Result<Object> r = Result.error(errorResult.getString(\"message\"));\n            r.setResult(errorResult);\n            return r;\n        }\n    }\n\n    /**\n     * 添加\n     *\n     * @param sysCheckRule\n     * @return\n     */\n    @AutoLog(value = \"编码校验规则-添加\")\n    @Operation(summary = \"编码校验规则-添加\")\n    @PostMapping(value = \"/add\")\n    public Result add(@RequestBody SysCheckRule sysCheckRule) {\n        sysCheckRuleService.save(sysCheckRule);\n        return Result.ok(\"添加成功！\");\n    }\n\n    /**\n     * 编辑\n     *\n     * @param sysCheckRule\n     * @return\n     */\n    @AutoLog(value = \"编码校验规则-编辑\")\n    @Operation(summary = \"编码校验规则-编辑\")\n    @RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n    public Result edit(@RequestBody SysCheckRule sysCheckRule) {\n        sysCheckRuleService.updateById(sysCheckRule);\n        return Result.ok(\"编辑成功!\");\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @AutoLog(value = \"编码校验规则-通过id删除\")\n    @Operation(summary = \"编码校验规则-通过id删除\")\n    @DeleteMapping(value = \"/delete\")\n    public Result delete(@RequestParam(name = \"id\", required = true) String id) {\n        sysCheckRuleService.removeById(id);\n        return Result.ok(\"删除成功!\");\n    }\n\n    /**\n     * 批量删除\n     *\n     * @param ids\n     * @return\n     */\n    @AutoLog(value = \"编码校验规则-批量删除\")\n    @Operation(summary = \"编码校验规则-批量删除\")\n    @DeleteMapping(value = \"/deleteBatch\")\n    public Result deleteBatch(@RequestParam(name = \"ids\", required = true) String ids) {\n        this.sysCheckRuleService.removeByIds(Arrays.asList(ids.split(\",\")));\n        return Result.ok(\"批量删除成功！\");\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    @AutoLog(value = \"编码校验规则-通过id查询\")\n    @Operation(summary = \"编码校验规则-通过id查询\")\n    @GetMapping(value = \"/queryById\")\n    public Result queryById(@RequestParam(name = \"id\", required = true) String id) {\n        SysCheckRule sysCheckRule = sysCheckRuleService.getById(id);\n        return Result.ok(sysCheckRule);\n    }\n\n    /**\n     * 导出excel\n     *\n     * @param request\n     * @param sysCheckRule\n     */\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, SysCheckRule sysCheckRule) {\n        return super.exportXls(request, sysCheckRule, SysCheckRule.class, \"编码校验规则\");\n    }\n\n    /**\n     * 通过excel导入数据\n     *\n     * @param request\n     * @param response\n     * @return\n     */\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result importExcel(HttpServletRequest request, HttpServletResponse response) {\n        return super.importExcel(request, response, SysCheckRule.class);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysCommentController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.api.dto.DataLogDTO;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.system.api.ISysBaseAPI;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.modules.system.entity.SysComment;\nimport org.jeecg.modules.system.service.ISysCommentService;\nimport org.jeecg.modules.system.vo.SysCommentFileVo;\nimport org.jeecg.modules.system.vo.SysCommentVO;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.util.Arrays;\nimport java.util.List;\n\n/**\n * @Description: 系统评论回复表\n * @Author: jeecg-boot\n * @Date: 2022-07-19\n * @Version: V1.0\n */\n@Tag(name = \"系统评论回复表\")\n@RestController\n@RequestMapping(\"/sys/comment\")\n@Slf4j\npublic class SysCommentController extends JeecgController<SysComment, ISysCommentService> {\n\n    @Autowired\n    private ISysCommentService sysCommentService;\n\n    @Autowired\n    private ISysBaseAPI sysBaseAPI;\n\n\n    /**\n     * 在线预览文件地址\n     */\n    @Value(\"${jeecg.file-view-domain}/onlinePreview\")\n    private String onlinePreviewDomain;\n\n    /**\n     * 查询评论+文件\n     *\n     * @param sysComment\n     * @return\n     */\n    @Operation(summary = \"系统评论回复表-列表查询\")\n    @GetMapping(value = \"/listByForm\")\n    public Result<IPage<SysCommentVO>> queryListByForm(SysComment sysComment) {\n        List<SysCommentVO> list = sysCommentService.queryFormCommentInfo(sysComment);\n        IPage<SysCommentVO> pageList = new Page();\n        pageList.setRecords(list);\n        return Result.OK(pageList);\n    }\n\n    /**\n     * 查询文件\n     *\n     * @param sysComment\n     * @return\n     */\n    @Operation(summary = \"系统评论回复表-列表查询\")\n    @GetMapping(value = \"/fileList\")\n    public Result<IPage<SysCommentFileVo>> queryFileList(SysComment sysComment) {\n        List<SysCommentFileVo> list = sysCommentService.queryFormFileList(sysComment.getTableName(), sysComment.getTableDataId());\n        IPage<SysCommentFileVo> pageList = new Page();\n        pageList.setRecords(list);\n        return Result.OK(pageList);\n    }\n\n    @Operation(summary = \"系统评论表-添加文本\")\n    @PostMapping(value = \"/addText\")\n    public Result<String> addText(@RequestBody SysComment sysComment) {\n        String commentId = sysCommentService.saveOne(sysComment);\n        return Result.OK(commentId);\n    }\n\n    @Operation(summary = \"系统评论表-添加文件\")\n    @PostMapping(value = \"/addFile\")\n    public Result<String> addFile(HttpServletRequest request) {\n        try {\n            sysCommentService.saveOneFileComment(request);\n            return Result.OK(\"success\");\n        } catch (Exception e) {\n            log.error(\"评论文件上传失败：{}\", e.getMessage());\n            return Result.error(\"操作失败,\" + e.getMessage());\n        }\n    }\n\n    /**\n     * app端添加评论表\n     * @param request\n     * @return\n     */\n    @Operation(summary = \"系统评论表-添加文件\")\n    @PostMapping(value = \"/appAddFile\")\n    public Result<String> appAddFile(HttpServletRequest request) {\n        try {\n            sysCommentService.appSaveOneFileComment(request);\n            return Result.OK(\"success\");\n        } catch (Exception e) {\n            log.error(\"评论文件上传失败：{}\", e.getMessage());\n            return Result.error(\"操作失败,\" + e.getMessage());\n        }\n    }\n\n    @Operation(summary = \"系统评论回复表-通过id删除\")\n    @DeleteMapping(value = \"/deleteOne\")\n    public Result<String> deleteOne(@RequestParam(name = \"id\", required = true) String id) {\n        SysComment comment = sysCommentService.getById(id);\n        if(comment==null){\n            return Result.error(\"该评论已被删除！\");\n        }\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        String username = sysUser.getUsername();\n        String admin = \"admin\";\n        //除了admin外 其他人只能删除自己的评论\n        if((!admin.equals(username)) && !username.equals(comment.getCreateBy())){\n            return Result.error(\"只能删除自己的评论！\");\n        }\n        sysCommentService.deleteOne(id);\n        //删除评论添加日志\n        String logContent = \"删除了评论， \"+ comment.getCommentContent();\n        DataLogDTO dataLog = new DataLogDTO(comment.getTableName(), comment.getTableDataId(), logContent, CommonConstant.DATA_LOG_TYPE_COMMENT);\n        sysBaseAPI.saveDataLog(dataLog);\n        return Result.OK(\"删除成功!\");\n    }\n\n\n    /**\n     * 获取文件预览的地址\n     * @return\n     */\n    @GetMapping(value = \"/getFileViewDomain\")\n    public Result<String> getFileViewDomain() {\n        return Result.OK(onlinePreviewDomain);\n    }\n\n\n    /**\n     * 分页列表查询\n     *\n     * @param sysComment\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    //@AutoLog(value = \"系统评论回复表-分页列表查询\")\n    @Operation(summary = \"系统评论回复表-分页列表查询\")\n    @GetMapping(value = \"/list\")\n    public Result<IPage<SysComment>> queryPageList(SysComment sysComment,\n                                                   @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                                   @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                                   HttpServletRequest req) {\n        QueryWrapper<SysComment> queryWrapper = QueryGenerator.initQueryWrapper(sysComment, req.getParameterMap());\n        Page<SysComment> page = new Page<SysComment>(pageNo, pageSize);\n        IPage<SysComment> pageList = sysCommentService.page(page, queryWrapper);\n        return Result.OK(pageList);\n    }\n\n\n    /**\n     * 添加\n     *\n     * @param sysComment\n     * @return\n     */\n    @Operation(summary = \"系统评论回复表-添加\")\n    //@RequiresPermissions(\"org.jeecg.modules.demo:sys_comment:add\")\n    @PostMapping(value = \"/add\")\n    public Result<String> add(@RequestBody SysComment sysComment) {\n        sysCommentService.save(sysComment);\n        return Result.OK(\"添加成功！\");\n    }\n\n    /**\n     * 编辑\n     *\n     * @param sysComment\n     * @return\n     */\n    //@AutoLog(value = \"系统评论回复表-编辑\")\n    @Operation(summary = \"系统评论回复表-编辑\")\n    //@RequiresPermissions(\"org.jeecg.modules.demo:sys_comment:edit\")\n    @RequestMapping(value = \"/edit\", method = {RequestMethod.PUT, RequestMethod.POST})\n    public Result<String> edit(@RequestBody SysComment sysComment) {\n        sysCommentService.updateById(sysComment);\n        return Result.OK(\"编辑成功!\");\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    //@AutoLog(value = \"系统评论回复表-通过id删除\")\n    @Operation(summary = \"系统评论回复表-通过id删除\")\n    //@RequiresPermissions(\"org.jeecg.modules.demo:sys_comment:delete\")\n    @DeleteMapping(value = \"/delete\")\n    public Result<String> delete(@RequestParam(name = \"id\", required = true) String id) {\n        sysCommentService.removeById(id);\n        return Result.OK(\"删除成功!\");\n    }\n\n    /**\n     * 批量删除\n     *\n     * @param ids\n     * @return\n     */\n    //@AutoLog(value = \"系统评论回复表-批量删除\")\n    @Operation(summary = \"系统评论回复表-批量删除\")\n    //@RequiresPermissions(\"org.jeecg.modules.demo:sys_comment:deleteBatch\")\n    @DeleteMapping(value = \"/deleteBatch\")\n    public Result<String> deleteBatch(@RequestParam(name = \"ids\", required = true) String ids) {\n        this.sysCommentService.removeByIds(Arrays.asList(ids.split(\",\")));\n        return Result.OK(\"批量删除成功!\");\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    //@AutoLog(value = \"系统评论回复表-通过id查询\")\n    @Operation(summary = \"系统评论回复表-通过id查询\")\n    @GetMapping(value = \"/queryById\")\n    public Result<SysComment> queryById(@RequestParam(name = \"id\", required = true) String id) {\n        SysComment sysComment = sysCommentService.getById(id);\n        if (sysComment == null) {\n            return Result.error(\"未找到对应数据\");\n        }\n        return Result.OK(sysComment);\n    }\n\n    /**\n     * 导出excel\n     *\n     * @param request\n     * @param sysComment\n     */\n    //@RequiresPermissions(\"org.jeecg.modules.demo:sys_comment:exportXls\")\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, SysComment sysComment) {\n        return super.exportXls(request, sysComment, SysComment.class, \"系统评论回复表\");\n    }\n\n    /**\n     * 通过excel导入数据\n     *\n     * @param request\n     * @param response\n     * @return\n     */\n    //@RequiresPermissions(\"sys_comment:importExcel\")\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n        return super.importExcel(request, response, SysComment.class);\n    }\n\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDataLogController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport jakarta.servlet.http.HttpServletRequest;\n\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysDataLog;\nimport org.jeecg.modules.system.service.ISysDataLogService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * @Description: 系统数据日志\n * @author: jeecg-boot\n */\n@RestController\n@RequestMapping(\"/sys/dataLog\")\n@Slf4j\npublic class SysDataLogController {\n\t@Autowired\n\tprivate ISysDataLogService service;\n\t\n\t@RequestMapping(value = \"/list\", method = RequestMethod.GET)\n\tpublic Result<IPage<SysDataLog>> queryPageList(SysDataLog dataLog,@RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,HttpServletRequest req) {\n\t\tResult<IPage<SysDataLog>> result = new Result<IPage<SysDataLog>>();\n\t\tdataLog.setType(CommonConstant.DATA_LOG_TYPE_JSON);\n\t\tQueryWrapper<SysDataLog> queryWrapper = QueryGenerator.initQueryWrapper(dataLog, req.getParameterMap());\n\t\tPage<SysDataLog> page = new Page<SysDataLog>(pageNo, pageSize);\n\t\tIPage<SysDataLog> pageList = service.page(page, queryWrapper);\n\t\tlog.info(\"查询当前页：\"+pageList.getCurrent());\n\t\tlog.info(\"查询当前页数量：\"+pageList.getSize());\n\t\tlog.info(\"查询结果数量：\"+pageList.getRecords().size());\n\t\tlog.info(\"数据总数：\"+pageList.getTotal());\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(pageList);\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * 查询对比数据\n\t * @param req\n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryCompareList\", method = RequestMethod.GET)\n\tpublic Result<List<SysDataLog>> queryCompareList(HttpServletRequest req) {\n\t\tResult<List<SysDataLog>> result = new Result<>();\n\t\tString dataId1 = req.getParameter(\"dataId1\");\n\t\tString dataId2 = req.getParameter(\"dataId2\");\n\t\tList<String> idList = new ArrayList<String>();\n\t\tidList.add(dataId1);\n\t\tidList.add(dataId2);\n\t\ttry {\n\t\t\tList<SysDataLog> list =  (List<SysDataLog>) service.listByIds(idList);\n\t\t\tresult.setResult(list);\n\t\t\tresult.setSuccess(true);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * 查询版本信息\n\t * @param req\n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryDataVerList\", method = RequestMethod.GET)\n\tpublic Result<List<SysDataLog>> queryDataVerList(HttpServletRequest req) {\n\t\tResult<List<SysDataLog>> result = new Result<>();\n\t\tString dataTable = req.getParameter(\"dataTable\");\n\t\tString dataId = req.getParameter(\"dataId\");\n\t\tQueryWrapper<SysDataLog> queryWrapper = new QueryWrapper<SysDataLog>();\n\t\tqueryWrapper.eq(\"data_table\", dataTable);\n\t\tqueryWrapper.eq(\"data_id\", dataId);\n\t\t// 代码逻辑说明: 新增查询条件-type\n\t\tString type = req.getParameter(\"type\");\n\t\tif (oConvertUtils.isNotEmpty(type)) {\n\t\t\tqueryWrapper.eq(\"type\", type);\n\t\t}\n\t\t// 按时间倒序排\n\t\tqueryWrapper.orderByDesc(\"create_time\");\n\n\t\tList<SysDataLog> list = service.list(queryWrapper);\n\t\tif(list==null||list.size()<=0) {\n\t\t\tresult.error500(\"未找到版本信息\");\n\t\t}else {\n\t\t\tresult.setResult(list);\n\t\t\tresult.setSuccess(true);\n\t\t}\n\t\treturn result;\n\t}\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDataSourceController.java",
    "content": "package org.jeecg.modules.system.controller;\n\n\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.dynamic.datasource.DynamicRoutingDataSource;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.apache.shiro.authz.annotation.RequiresRoles;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.util.dynamic.db.DataSourceCachePool;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.common.util.security.JdbcSecurityUtil;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.config.sign.annotation.SignatureCheck;\nimport org.jeecg.modules.system.entity.SysDataSource;\nimport org.jeecg.modules.system.service.ISysDataSourceService;\nimport org.jeecg.modules.system.util.SecurityUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport javax.sql.DataSource;\nimport java.util.Arrays;\nimport java.util.List;\n\n/**\n * @Description: 多数据源管理\n * @Author: jeecg-boot\n * @Date: 2019-12-25\n * @Version: V1.0\n */\n@Slf4j\n@Tag(name = \"多数据源管理\")\n@RestController\n@RequestMapping(\"/sys/dataSource\")\npublic class SysDataSourceController extends JeecgController<SysDataSource, ISysDataSourceService> {\n\n    @Autowired\n    private ISysDataSourceService sysDataSourceService;\n\n\n    /**\n     * 分页列表查询\n     *\n     * @param sysDataSource\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @AutoLog(value = \"多数据源管理-分页列表查询\")\n    @Operation(summary = \"多数据源管理-分页列表查询\")\n    @RequiresPermissions(\"system:datasource:list\")\n    @GetMapping(value = \"/list\")\n    public Result<?> queryPageList(\n            SysDataSource sysDataSource,\n            @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n            @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n            HttpServletRequest req) {\n        //------------------------------------------------------------------------------------------------\n        //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n        if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n            sysDataSource.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(), 0));\n        }\n        //------------------------------------------------------------------------------------------------\n        QueryWrapper<SysDataSource> queryWrapper = QueryGenerator.initQueryWrapper(sysDataSource, req.getParameterMap());\n        Page<SysDataSource> page = new Page<>(pageNo, pageSize);\n        IPage<SysDataSource> pageList = sysDataSourceService.page(page, queryWrapper);\n        return Result.ok(pageList);\n    }\n\n    /**\n     * 下拉选项数据 (online报表使用)\n     * @param sysDataSource\n     * @param req\n     * @return\n     */\n    @SignatureCheck\n    @RequiresPermissions(\"online:report:add\")\n    @GetMapping(value = \"/options\")\n    public Result<?> queryOptions(SysDataSource sysDataSource, HttpServletRequest req) {\n        //------------------------------------------------------------------------------------------------\n        //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n        if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n            sysDataSource.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(), 0));\n        }\n        //------------------------------------------------------------------------------------------------\n        \n        QueryWrapper<SysDataSource> queryWrapper = QueryGenerator.initQueryWrapper(sysDataSource, req.getParameterMap());\n        List<SysDataSource> pageList = sysDataSourceService.list(queryWrapper);\n        JSONArray array = new JSONArray(pageList.size());\n        for (SysDataSource item : pageList) {\n            JSONObject option = new JSONObject(3);\n            option.put(\"value\", item.getCode());\n            option.put(\"label\", item.getName());\n            option.put(\"text\", item.getName());\n            array.add(option);\n        }\n        return Result.ok(array);\n    }\n\n    /**\n     * 添加\n     *\n     * @param sysDataSource\n     * @return\n     */\n    @AutoLog(value = \"多数据源管理-添加\")\n    @Operation(summary = \"多数据源管理-添加\")\n    @PostMapping(value = \"/add\")\n    public Result<?> add(@RequestBody SysDataSource sysDataSource) {\n        // 代码逻辑说明: jdbc连接地址漏洞问题\n        try {\n            JdbcSecurityUtil.validate(sysDataSource.getDbUrl());\n        }catch (JeecgBootException e){\n            log.error(e.toString());\n            return Result.error(\"操作失败：\" + e.getMessage());\n        }\n        return sysDataSourceService.saveDataSource(sysDataSource);\n    }\n\n    /**\n     * 编辑\n     *\n     * @param sysDataSource\n     * @return\n     */\n    @AutoLog(value = \"多数据源管理-编辑\")\n    @Operation(summary = \"多数据源管理-编辑\")\n    @RequestMapping(value = \"/edit\", method ={RequestMethod.PUT, RequestMethod.POST})\n    public Result<?> edit(@RequestBody SysDataSource sysDataSource) {\n        // 代码逻辑说明: jdbc连接地址漏洞问题\n        try {\n            JdbcSecurityUtil.validate(sysDataSource.getDbUrl());\n        } catch (JeecgBootException e) {\n            log.error(e.toString());\n            return Result.error(\"操作失败：\" + e.getMessage());\n        }\n        return sysDataSourceService.editDataSource(sysDataSource);\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @AutoLog(value = \"多数据源管理-通过id删除\")\n    @Operation(summary = \"多数据源管理-通过id删除\")\n    @DeleteMapping(value = \"/delete\")\n    public Result<?> delete(@RequestParam(name = \"id\") String id) {\n        return sysDataSourceService.deleteDataSource(id);\n    }\n\n    /**\n     * 批量删除\n     *\n     * @param ids\n     * @return\n     */\n    @AutoLog(value = \"多数据源管理-批量删除\")\n    @Operation(summary = \"多数据源管理-批量删除\")\n    @DeleteMapping(value = \"/deleteBatch\")\n    public Result<?> deleteBatch(@RequestParam(name = \"ids\") String ids) {\n        List<String> idList = Arrays.asList(ids.split(\",\"));\n        idList.forEach(item->{\n            SysDataSource sysDataSource = sysDataSourceService.getById(item);\n            DataSourceCachePool.removeCache(sysDataSource.getCode());\n        });\n        this.sysDataSourceService.removeByIds(idList);\n        return Result.ok(\"批量删除成功！\");\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    @AutoLog(value = \"多数据源管理-通过id查询\")\n    @Operation(summary = \"多数据源管理-通过id查询\")\n    @GetMapping(value = \"/queryById\")\n    public Result<?> queryById(@RequestParam(name = \"id\") String id) throws InterruptedException {\n        SysDataSource sysDataSource = sysDataSourceService.getById(id);\n        //密码解密\n        String dbPassword = sysDataSource.getDbPassword();\n        if(StringUtils.isNotBlank(dbPassword)){\n            String decodedStr = SecurityUtil.jiemi(dbPassword);\n            sysDataSource.setDbPassword(decodedStr);\n        }\n        return Result.ok(sysDataSource);\n    }\n\n    /**\n     * 导出excel\n     *\n     * @param request\n     * @param sysDataSource\n     */\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, SysDataSource sysDataSource) {\n        //------------------------------------------------------------------------------------------------\n        //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n        if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n            sysDataSource.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(), 0));\n        }\n        //------------------------------------------------------------------------------------------------\n        return super.exportXls(request, sysDataSource, SysDataSource.class, \"多数据源管理\");\n    }\n\n    /**\n     * 通过excel导入数据\n     *\n     * @param request\n     * @param response\n     * @return\n     */\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n        return super.importExcel(request, response, SysDataSource.class);\n    }\n\n\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.apache.shiro.SecurityUtils;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.apache.shiro.authz.annotation.RequiresRoles;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CacheConstant;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.ImportExcelUtil;\nimport org.jeecg.common.util.RedisUtil;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.modules.system.entity.SysDepart;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.excelstyle.ExcelExportSysUserStyle;\nimport org.jeecg.modules.system.model.DepartIdModel;\nimport org.jeecg.modules.system.model.SysDepartTreeModel;\nimport org.jeecg.modules.system.service.ISysDepartService;\nimport org.jeecg.modules.system.service.ISysUserDepartService;\nimport org.jeecg.modules.system.service.ISysUserService;\nimport org.jeecg.modules.system.vo.SysChangeDepartVo;\nimport org.jeecg.modules.system.vo.SysDepartExportVo;\nimport org.jeecg.modules.system.vo.SysPositionSelectTreeVo;\nimport org.jeecg.modules.system.vo.lowapp.ExportDepartVo;\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.entity.enmus.ExcelType;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.cache.annotation.CacheEvict;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.util.*;\n\n/**\n * <p>\n * 部门表 前端控制器\n * <p>\n * \n * @Author: Steve @Since： 2019-01-22\n */\n@RestController\n@RequestMapping(\"/sys/sysDepart\")\n@Slf4j\npublic class SysDepartController {\n\n\t@Autowired\n\tprivate ISysDepartService sysDepartService;\n\t@Autowired\n\tpublic RedisTemplate<String, Object> redisTemplate;\n\t@Autowired\n\tprivate ISysUserService sysUserService;\n\t@Autowired\n\tprivate ISysUserDepartService sysUserDepartService;\n\t@Autowired\n\tprivate RedisUtil redisUtil;\n\t/**\n\t * 查询数据 查出我的部门,并以树结构数据格式响应给前端\n\t *\n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryMyDeptTreeList\", method = RequestMethod.GET)\n\tpublic Result<List<SysDepartTreeModel>> queryMyDeptTreeList() {\n\t\tResult<List<SysDepartTreeModel>> result = new Result<>();\n\t\tLoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\ttry {\n\t\t\tif(oConvertUtils.isNotEmpty(user.getUserIdentity()) && user.getUserIdentity().equals( CommonConstant.USER_IDENTITY_2 )){\n\t\t\t\t// 代码逻辑说明: 部门查询ids为空后的前端显示问题 issues/I3UD06\n\t\t\t\tString departIds = user.getDepartIds();\n\t\t\t\tif(StringUtils.isNotBlank(departIds)){\n\t\t\t\t\tList<SysDepartTreeModel> list = sysDepartService.queryMyDeptTreeList(departIds);\n\t\t\t\t\tresult.setResult(list);\n\t\t\t\t}\n\t\t\t\tresult.setMessage(CommonConstant.USER_IDENTITY_2.toString());\n\t\t\t\tresult.setSuccess(true);\n\t\t\t}else{\n\t\t\t\tresult.setMessage(CommonConstant.USER_IDENTITY_1.toString());\n\t\t\t\tresult.setSuccess(true);\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 查询数据 查出所有部门,并以树结构数据格式响应给前端\n\t * \n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryTreeList\", method = RequestMethod.GET)\n\tpublic Result<List<SysDepartTreeModel>> queryTreeList(@RequestParam(name = \"ids\", required = false) String ids) {\n\t\tResult<List<SysDepartTreeModel>> result = new Result<>();\n\t\ttry {\n\t\t\t// 从内存中读取\n//\t\t\tList<SysDepartTreeModel> list =FindsDepartsChildrenUtil.getSysDepartTreeList();\n//\t\t\tif (CollectionUtils.isEmpty(list)) {\n//\t\t\t\tlist = sysDepartService.queryTreeList();\n//\t\t\t}\n\t\t\tif(oConvertUtils.isNotEmpty(ids)){\n\t\t\t\tList<SysDepartTreeModel> departList = sysDepartService.queryTreeList(ids);\n\t\t\t\tresult.setResult(departList);\n\t\t\t}else{\n\t\t\t\tList<SysDepartTreeModel> list = sysDepartService.queryTreeList();\n\t\t\t\tresult.setResult(list);\n\t\t\t}\n\t\t\tresult.setSuccess(true);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 异步查询部门list\n\t * @param parentId 父节点 异步加载时传递\n\t * @param ids 前端回显是传递\n\t * @param primaryKey 主键字段（id或者orgCode）\n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryDepartTreeSync\", method = RequestMethod.GET)\n\tpublic Result<List<SysDepartTreeModel>> queryDepartTreeSync(@RequestParam(name = \"pid\", required = false) String parentId,@RequestParam(name = \"ids\", required = false) String ids, @RequestParam(name = \"primaryKey\", required = false) String primaryKey) {\n\t\tResult<List<SysDepartTreeModel>> result = new Result<>();\n\t\ttry {\n\t\t\tList<SysDepartTreeModel> list = sysDepartService.queryTreeListByPid(parentId,ids, primaryKey);\n\t\t\tresult.setResult(list);\n\t\t\tresult.setSuccess(true);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t\tresult.setSuccess(false);\n\t\t\tresult.setMessage(\"查询失败\");\n\t\t}\n\t\treturn result;\n\t}\n\n    /**\n     * 异步查询部门和岗位list\n     * @param parentId 父节点 异步加载时传递\n     * @param ids 前端回显是传递\n     * @param primaryKey 主键字段（id或者orgCode）\n     * @return\n     */\n    @RequestMapping(value = \"/queryDepartAndPostTreeSync\", method = RequestMethod.GET)\n    public Result<List<SysDepartTreeModel>> queryDepartAndPostTreeSync(@RequestParam(name = \"pid\", required = false) String parentId,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   @RequestParam(name = \"ids\", required = false) String ids,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   @RequestParam(name = \"primaryKey\", required = false) String primaryKey,\n                                                                       @RequestParam(name = \"departIds\", required = false) String departIds,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   @RequestParam(name = \"name\", required = false) String orgName) {\n        Result<List<SysDepartTreeModel>> result = new Result<>();\n        try {\n            List<SysDepartTreeModel> list = sysDepartService.queryDepartAndPostTreeSync(parentId,ids, primaryKey, departIds, orgName);\n            result.setResult(list);\n            result.setSuccess(true);\n        } catch (Exception e) {\n            log.error(e.getMessage(),e);\n            result.setSuccess(false);\n            result.setMessage(\"查询失败\");\n        }\n        return result;\n    }\n\n\t/**\n\t * 获取某个部门的所有父级部门的ID\n\t *\n\t * @param departId 根据departId查\n\t * @param orgCode  根据orgCode查，departId和orgCode必须有一个不为空\n\t */\n\t@GetMapping(\"/queryAllParentId\")\n\tpublic Result queryParentIds(\n\t\t\t@RequestParam(name = \"departId\", required = false) String departId,\n\t\t\t@RequestParam(name = \"orgCode\", required = false) String orgCode) {\n\t\ttry {\n\t\t\tJSONObject data;\n\t\t\tif (oConvertUtils.isNotEmpty(departId)) {\n\t\t\t\tdata = sysDepartService.queryAllParentIdByDepartId(departId);\n\t\t\t} else if (oConvertUtils.isNotEmpty(orgCode)) {\n\t\t\t\tdata = sysDepartService.queryAllParentIdByOrgCode(orgCode);\n\t\t\t} else {\n\t\t\t\treturn Result.error(\"departId 和 orgCode 不能都为空！\");\n\t\t\t}\n\t\t\treturn Result.OK(data);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\treturn Result.error(e.getMessage());\n\t\t}\n\t}\n\n\t/**\n\t * 添加新数据 添加用户新建的部门对象数据,并保存到数据库\n\t * \n\t * @param sysDepart\n\t * @return\n\t */\n    @RequiresPermissions(\"system:depart:add\")\n\t@RequestMapping(value = \"/add\", method = RequestMethod.POST)\n\t@CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)\n\tpublic Result<SysDepart> add(@RequestBody SysDepart sysDepart, HttpServletRequest request) {\n\t\tResult<SysDepart> result = new Result<SysDepart>();\n\t\tString username = JwtUtil.getUserNameByToken(request);\n\t\ttry {\n\t\t\tsysDepart.setCreateBy(username);\n\t\t\tsysDepartService.saveDepartData(sysDepart, username);\n\t\t\t//清除部门树内存\n\t\t\t// FindsDepartsChildrenUtil.clearSysDepartTreeList();\n\t\t\t// FindsDepartsChildrenUtil.clearDepartIdModel();\n\t\t\tresult.success(\"添加成功！\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t\tresult.error500(\"操作失败\");\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 编辑数据 编辑部门的部分数据,并保存到数据库\n\t * \n\t * @param sysDepart\n\t * @return\n\t */\n    @RequiresPermissions(\"system:depart:edit\")\n\t@RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n\t@CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)\n\tpublic Result<SysDepart> edit(@RequestBody SysDepart sysDepart, HttpServletRequest request) {\n\t\tString username = JwtUtil.getUserNameByToken(request);\n\t\tsysDepart.setUpdateBy(username);\n\t\tResult<SysDepart> result = new Result<SysDepart>();\n\t\tSysDepart sysDepartEntity = sysDepartService.getById(sysDepart.getId());\n\t\tif (sysDepartEntity == null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t} else {\n\t\t\tboolean ok = sysDepartService.updateDepartDataById(sysDepart, username);\n\t\t\t// TODO 返回false说明什么？\n\t\t\tif (ok) {\n\t\t\t\t//清除部门树内存\n\t\t\t\t//FindsDepartsChildrenUtil.clearSysDepartTreeList();\n\t\t\t\t//FindsDepartsChildrenUtil.clearDepartIdModel();\n\t\t\t\tresult.success(\"修改成功!\");\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t /**\n     *   通过id删除\n    * @param id\n    * @return\n    */\n    @RequiresPermissions(\"system:depart:delete\")\n    @RequestMapping(value = \"/delete\", method = RequestMethod.DELETE)\n\t@CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)\n   public Result<SysDepart> delete(@RequestParam(name=\"id\",required=true) String id) {\n\n       Result<SysDepart> result = new Result<SysDepart>();\n       SysDepart sysDepart = sysDepartService.getById(id);\n       if(sysDepart==null) {\n           result.error500(\"未找到对应实体\");\n       }else {\n           sysDepartService.deleteDepart(id);\n\t\t\t//清除部门树内存\n\t\t   //FindsDepartsChildrenUtil.clearSysDepartTreeList();\n\t\t   // FindsDepartsChildrenUtil.clearDepartIdModel();\n\t\t   result.success(\"删除成功!\");\n       }\n       return result;\n   }\n\n\n\t/**\n\t * 批量删除 根据前端请求的多个ID,对数据库执行删除相关部门数据的操作\n\t * \n\t * @param ids\n\t * @return\n\t */\n    @RequiresPermissions(\"system:depart:deleteBatch\")\n\t@RequestMapping(value = \"/deleteBatch\", method = RequestMethod.DELETE)\n\t@CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)\n\tpublic Result<SysDepart> deleteBatch(@RequestParam(name = \"ids\", required = true) String ids) {\n\n\t\tResult<SysDepart> result = new Result<SysDepart>();\n\t\tif (ids == null || \"\".equals(ids.trim())) {\n\t\t\tresult.error500(\"参数不识别！\");\n\t\t} else {\n\t\t\tthis.sysDepartService.deleteBatchWithChildren(Arrays.asList(ids.split(\",\")));\n\t\t\tresult.success(\"删除成功!\");\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 查询数据 添加或编辑页面对该方法发起请求,以树结构形式加载所有部门的名称,方便用户的操作\n\t * \n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryIdTree\", method = RequestMethod.GET)\n\tpublic Result<List<DepartIdModel>> queryIdTree() {\n//\t\tResult<List<DepartIdModel>> result = new Result<List<DepartIdModel>>();\n//\t\tList<DepartIdModel> idList;\n//\t\ttry {\n//\t\t\tidList = FindsDepartsChildrenUtil.wrapDepartIdModel();\n//\t\t\tif (idList != null && idList.size() > 0) {\n//\t\t\t\tresult.setResult(idList);\n//\t\t\t\tresult.setSuccess(true);\n//\t\t\t} else {\n//\t\t\t\tsysDepartService.queryTreeList();\n//\t\t\t\tidList = FindsDepartsChildrenUtil.wrapDepartIdModel();\n//\t\t\t\tresult.setResult(idList);\n//\t\t\t\tresult.setSuccess(true);\n//\t\t\t}\n//\t\t\treturn result;\n//\t\t} catch (Exception e) {\n//\t\t\tlog.error(e.getMessage(),e);\n//\t\t\tresult.setSuccess(false);\n//\t\t\treturn result;\n//\t\t}\n\t\tResult<List<DepartIdModel>> result = new Result<>();\n\t\ttry {\n\t\t\tList<DepartIdModel> list = sysDepartService.queryDepartIdTreeList();\n\t\t\tresult.setResult(list);\n\t\t\tresult.setSuccess(true);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t}\n\t\treturn result;\n\t}\n\t \n\t/**\n\t * <p>\n\t * 部门搜索功能方法,根据关键字模糊搜索相关部门\n\t * </p>\n\t * \n\t * @param keyWord\n\t * @return\n\t */\n\t@RequestMapping(value = \"/searchBy\", method = RequestMethod.GET)\n\tpublic Result<List<SysDepartTreeModel>> searchBy(@RequestParam(name = \"keyWord\", required = true) String keyWord,\n                                                     @RequestParam(name = \"myDeptSearch\", required = false) String myDeptSearch,\n                                                     @RequestParam(name = \"orgCategory\", required = false) String orgCategory,\n                                                     @RequestParam(name = \"departIds\", required = false) String depIds) {\n\t\tResult<List<SysDepartTreeModel>> result = new Result<List<SysDepartTreeModel>>();\n\t\t//部门查询，myDeptSearch为1时为我的部门查询，登录用户为上级时查只查负责部门下数据\n\t\tLoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\tString departIds = null;\n\t\tif(oConvertUtils.isNotEmpty(user.getUserIdentity()) && user.getUserIdentity().equals( CommonConstant.USER_IDENTITY_2 )){\n\t\t\tdepartIds = user.getDepartIds();\n\t\t}\n\t\tList<SysDepartTreeModel> treeList = this.sysDepartService.searchByKeyWord(keyWord,myDeptSearch,departIds,orgCategory,depIds);\n\t\tif (treeList == null || treeList.size() == 0) {\n\t\t\tresult.setSuccess(false);\n\t\t\tresult.setMessage(\"未查询匹配数据！\");\n\t\t\treturn result;\n\t\t}\n\t\tresult.setResult(treeList);\n\t\treturn result;\n\t}\n\n\n\t/**\n     * 导出excel\n     *\n     * @param request\n     */\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(SysDepart sysDepart,HttpServletRequest request) {\n\t\t//------------------------------------------------------------------------------------------------\n\t\t//是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\tsysDepart.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(), 0));\n\t\t}\n\t\t//------------------------------------------------------------------------------------------------\n\t\t\n\t\t//// Step.1 组装查询条件\n\t\t//QueryWrapper<SysDepart> queryWrapper = QueryGenerator.initQueryWrapper(sysDepart, request.getParameterMap());\n\t\t//Step.1 AutoPoi 导出Excel\n\t\tModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n        //List<SysDepart> pageList = sysDepartService.list(queryWrapper);\n        //按字典排序\n        //Collections.sort(pageList, new Comparator<SysDepart>() {\n            //@Override\n\t\t\t//public int compare(SysDepart arg0, SysDepart arg1) {\n\t\t\t\t//return arg0.getOrgCode().compareTo(arg1.getOrgCode());\n\t\t\t//}\n\t\t//});\n\t\t// 过滤选中数据\n\t\tString selections = request.getParameter(\"selections\");\n\t\tList<String> idList = new ArrayList<>();\n\t\tif (oConvertUtils.isNotEmpty(selections)) {\n\t\t\tidList = Arrays.asList(selections.split(\",\"));\n\t\t}\n\t\t//step.2 组装导出数据\n\t\tInteger tenantId = sysDepart == null ? null : sysDepart.getTenantId();\n\t\t// 代码逻辑说明: 【TV360X-1671】部门管理不支持选中的记录导出---\n\t\tList<SysDepartExportVo> sysDepartExportVos = sysDepartService.getExportDepart(tenantId,idList);\n        //导出文件名称\n        mv.addObject(NormalExcelConstants.FILE_NAME, \"部门列表\");\n        mv.addObject(NormalExcelConstants.CLASS, SysDepartExportVo.class);\n        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        ExportParams exportParams = new ExportParams(\"导入规则：\\n\" +\n                \"1、标题为第三行，部门路径和部门名称的标题不允许修改，否则会匹配失败；第四行为数据填写范围;\\n\" +\n                \"2、部门路径用英文字符/分割，部门名称为部门路径的最后一位;\\n\" +\n                \"3、部门从一级名称开始创建，如果有同级就需要多添加一行，如研发部/研发一部;研发部/研发二部;\\n\" +\n                \"4、自定义的部门编码需要满足规则才能导入。如一级部门编码为A01,那么子部门为A01A01,同级子部门为A01A02,编码固定为三位，首字母为A-Z,后两位为数字0-99，依次递增;\", \"导出人:\" + user.getRealname(), \"导出信息\", ExcelType.XSSF);\n        exportParams.setTitleHeight((short)70);\n        exportParams.setStyle(ExcelExportSysUserStyle.class);\n        mv.addObject(NormalExcelConstants.PARAMS, exportParams);\n        mv.addObject(NormalExcelConstants.DATA_LIST, sysDepartExportVos);\n        \n\t\treturn mv;\n    }\n\n    /**\n     * 通过excel导入数据\n\t * 部门导入方案1: 通过机构编码来计算出部门的父级ID,维护上下级关系;\n\t * 部门导入方案2: 你也可以改造下程序,机构编码直接导入,先不设置父ID;全部导入后,写一个sql,补下父ID;\n     *\n     * @param request\n     * @param response\n     * @return\n     */\n    @RequiresPermissions(\"system:depart:importExcel\")\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n\t@CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n\t\tList<String> errorMessageList = new ArrayList<>();\n\t\t//List<SysDepart> listSysDeparts = null;\n\t\tList<SysDepartExportVo> listSysDeparts = null;\n        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n            // 获取上传文件对象\n            MultipartFile file = entity.getValue();\n            ImportParams params = new ImportParams();\n            params.setTitleRows(2);\n            params.setHeadRows(1);\n            params.setNeedSave(true);\n            try {\n//            \t// orgCode编码长度\n//            \tint codeLength = YouBianCodeUtil.ZHANWEI_LENGTH;\n//                listSysDeparts = ExcelImportUtil.importExcel(file.getInputStream(), SysDepart.class, params);\n//                //按长度排序\n//                Collections.sort(listSysDeparts, new Comparator<SysDepart>() {\n//                    @Override\n//\t\t\t\t\tpublic int compare(SysDepart arg0, SysDepart arg1) {\n//                    \treturn arg0.getOrgCode().length() - arg1.getOrgCode().length();\n//                    }\n//                });\n//\n//                int num = 0;\n//                for (SysDepart sysDepart : listSysDeparts) {\n//                \tString orgCode = sysDepart.getOrgCode();\n//                \tif(orgCode.length() > codeLength) {\n//                \t\tString parentCode = orgCode.substring(0, orgCode.length()-codeLength);\n//                \t\tQueryWrapper<SysDepart> queryWrapper = new QueryWrapper<SysDepart>();\n//                \t\tqueryWrapper.eq(\"org_code\", parentCode);\n//                \t\ttry {\n//                \t\tSysDepart parentDept = sysDepartService.getOne(queryWrapper);\n//                \t\tif(!parentDept.equals(null)) {\n//\t\t\t\t\t\t\tsysDepart.setParentId(parentDept.getId());\n//\t\t\t\t\t\t\t//更新父级部门不是叶子结点\n//\t\t\t\t\t\t\tsysDepartService.updateIzLeaf(parentDept.getId(),CommonConstant.NOT_LEAF);\n//\t\t\t\t\t\t} else {\n//\t\t\t\t\t\t\tsysDepart.setParentId(\"\");\n//\t\t\t\t\t\t}\n//                \t\t}catch (Exception e) {\n//                \t\t\t//没有查找到parentDept\n//                \t\t}\n//                \t}else{\n//                \t\tsysDepart.setParentId(\"\");\n//\t\t\t\t\t}\n//\t\t\t\t\tsysDepart.setOrgType(sysDepart.getOrgCode().length()/codeLength+\"\");\n//\t\t\t\t\tsysDepart.setDelFlag(CommonConstant.DEL_FLAG_0.toString());\n//\t\t\t\t\tif(oConvertUtils.isEmpty(sysDepart.getOrgCategory())){\n//\t\t\t\t\t    sysDepart.setOrgCategory(\"1\");\n//                    }\n//\t\t\t\t\tImportExcelUtil.importDateSaveOne(sysDepart, ISysDepartService.class, errorMessageList, num, CommonConstant.SQL_INDEX_UNIQ_DEPART_ORG_CODE);\n//\t\t\t\t\tnum++;\n//                }\n\t\t\t\t\n\t\t\t\t// 代码逻辑说明: 【QQYUN-5482】系统的部门导入导出也可以改成敲敲云模式的部门路径---\n\t\t\t\tlistSysDeparts = ExcelImportUtil.importExcel(file.getInputStream(), SysDepartExportVo.class, params);\n\t\t\t\tsysDepartService.importSysDepart(listSysDeparts,errorMessageList);\n\t\t\t\t\n\t\t\t\t//清空部门缓存\n\t\t\t\tList<String> keys3 = redisUtil.scan(CacheConstant.SYS_DEPARTS_CACHE + \"*\");\n\t\t\t\tList<String> keys4 = redisUtil.scan(CacheConstant.SYS_DEPART_IDS_CACHE + \"*\");\n\t\t\t\tredisTemplate.delete(keys3);\n\t\t\t\tredisTemplate.delete(keys4);\n\t\t\t\treturn ImportExcelUtil.imporReturnRes(errorMessageList.size(), listSysDeparts.size() - errorMessageList.size(), errorMessageList);\n            } catch (Exception e) {\n                log.error(e.getMessage(),e);\n                return Result.error(\"文件导入失败:\"+e.getMessage());\n            } finally {\n                try {\n                    file.getInputStream().close();\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n            }\n        }\n        return Result.error(\"文件导入失败！\");\n    }\n\n\n\t/**\n\t * 查询所有部门信息\n\t * @return\n\t */\n\t@GetMapping(\"listAll\")\n\tpublic Result<List<SysDepart>> listAll(@RequestParam(name = \"id\", required = false) String id) {\n\t\tResult<List<SysDepart>> result = new Result<>();\n\t\tLambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>();\n\t\tquery.orderByAsc(SysDepart::getOrgCode);\n\t\tif(oConvertUtils.isNotEmpty(id)){\n\t\t\tString[] arr = id.split(\",\");\n\t\t\tquery.in(SysDepart::getId,arr);\n\t\t}\n\t\tList<SysDepart> ls = this.sysDepartService.list(query);\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(ls);\n\t\treturn result;\n\t}\n\t/**\n\t * 查询数据 查出所有部门,并以树结构数据格式响应给前端\n\t *\n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryTreeByKeyWord\", method = RequestMethod.GET)\n\tpublic Result<Map<String,Object>> queryTreeByKeyWord(@RequestParam(name = \"keyWord\", required = false) String keyWord) {\n\t\tResult<Map<String,Object>> result = new Result<>();\n\t\ttry {\n\t\t\tMap<String,Object> map=new HashMap(5);\n\t\t\tList<SysDepartTreeModel> list = sysDepartService.queryTreeByKeyWord(keyWord);\n\t\t\t//根据keyWord获取用户信息\n\t\t\tLambdaQueryWrapper<SysUser> queryUser = new LambdaQueryWrapper<SysUser>();\n\t\t\tqueryUser.eq(SysUser::getDelFlag,CommonConstant.DEL_FLAG_0);\n\t\t\tqueryUser.and(i -> i.like(SysUser::getUsername, keyWord).or().like(SysUser::getRealname, keyWord));\n\t\t\tList<SysUser> sysUsers = this.sysUserService.list(queryUser);\n\t\t\tmap.put(\"userList\",sysUsers);\n\t\t\tmap.put(\"departList\",list);\n\t\t\tresult.setResult(map);\n\t\t\tresult.setSuccess(true);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 根据部门编码获取部门信息\n\t *\n\t * @param orgCode\n\t * @return\n\t */\n\t@GetMapping(\"/getDepartName\")\n\tpublic Result<SysDepart> getDepartName(@RequestParam(name = \"orgCode\") String orgCode) {\n\t\tResult<SysDepart> result = new Result<>();\n\t\tLambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<>();\n\t\tquery.eq(SysDepart::getOrgCode, orgCode);\n\t\tSysDepart sysDepart = sysDepartService.getOne(query);\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(sysDepart);\n\t\treturn result;\n\t}\n\n\t/**\n\t * 根据部门id获取用户信息\n\t *\n\t * @param id\n\t * @return\n\t */\n\t@GetMapping(\"/getUsersByDepartId\")\n\tpublic Result<List<SysUser>> getUsersByDepartId(@RequestParam(name = \"id\") String id) {\n\t\tResult<List<SysUser>> result = new Result<>();\n\t\tList<SysUser> sysUsers = sysUserDepartService.queryUserByDepId(id);\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(sysUsers);\n\t\treturn result;\n\t}\n\n\t/**\n\t * @功能：根据id 批量查询\n\t * @param deptIds\n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryByIds\", method = RequestMethod.GET)\n\tpublic Result<Collection<SysDepart>> queryByIds(@RequestParam(name = \"deptIds\") String deptIds) {\n\t\tResult<Collection<SysDepart>> result = new Result<>();\n\t\tString[] ids = deptIds.split(\",\");\n\t\tCollection<String> idList = Arrays.asList(ids);\n\t\tCollection<SysDepart> deptList = sysDepartService.listByIds(idList);\n\t\t// 设置部门路径名称\n\t\tfor (SysDepart depart : deptList) {\n\t\t\tString departPathName = sysDepartService.getDepartPathNameByOrgCode(depart.getOrgCode(),null);\n\t\t\tdepart.setDepartPathName(departPathName);\n\t\t}\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(deptList);\n\t\treturn result;\n\t}\n\n\t@GetMapping(\"/getMyDepartList\")\n    public Result<List<SysDepart>> getMyDepartList(){\n        List<SysDepart> list = sysDepartService.getMyDepartList();\n        return Result.ok(list);\n    }\n\n\t/**\n\t * 异步查询部门list\n\t * @param parentId 父节点 异步加载时传递\n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryBookDepTreeSync\", method = RequestMethod.GET)\n\tpublic Result<List<SysDepartTreeModel>> queryBookDepTreeSync(@RequestParam(name = \"pid\", required = false) String parentId,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t @RequestParam(name = \"tenantId\") Integer tenantId,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t @RequestParam(name = \"departName\",required = false) String departName) {\n\t\tResult<List<SysDepartTreeModel>> result = new Result<>();\n\t\ttry {\n\t\t\tList<SysDepartTreeModel> list = sysDepartService.queryBookDepTreeSync(parentId, tenantId, departName);\n\t\t\tresult.setResult(list);\n\t\t\tresult.setSuccess(true);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 通过部门id和租户id获取用户 【低代码应用: 用于选择部门负责人】\n\t * @param departId\n\t * @return\n\t */\n\t@GetMapping(\"/getUsersByDepartTenantId\")\n\tpublic Result<List<SysUser>> getUsersByDepartTenantId(@RequestParam(\"departId\") String departId){\n\t\tint tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n\t\tList<SysUser> sysUserList = sysUserDepartService.getUsersByDepartTenantId(departId,tenantId);\n\t\treturn Result.ok(sysUserList);\n\t}\n\n\t/**\n\t * 导出excel【低代码应用: 用于导出部门】\n\t *\n\t * @param request\n\t */\n\t@RequestMapping(value = \"/appExportXls\")\n\tpublic ModelAndView appExportXls(SysDepart sysDepart,HttpServletRequest request) {\n\t\t// Step.1 组装查询条件\n\t\tint tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n\t\tModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n\t\tList<ExportDepartVo> pageList = sysDepartService.getExcelDepart(tenantId);\n\t\t//Step.2 AutoPoi 导出Excel\n\t\t//导出文件名称\n\t\tmv.addObject(NormalExcelConstants.FILE_NAME, \"部门列表\");\n\t\tmv.addObject(NormalExcelConstants.CLASS, ExportDepartVo.class);\n\t\tLoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\tmv.addObject(NormalExcelConstants.PARAMS, new ExportParams(\"部门列表数据\", \"导出人:\"+user.getRealname(), \"导出信息\"));\n\t\tmv.addObject(NormalExcelConstants.DATA_LIST, pageList);\n\t\treturn mv;\n\t}\n\n\t/**\n\t * 导入excel【低代码应用: 用于导出部门】\n\t *\n\t * @param request\n\t */\n\t@RequestMapping(value = \"/appImportExcel\", method = RequestMethod.POST)\n\t@CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true)\n\tpublic Result<?> appImportExcel(HttpServletRequest request, HttpServletResponse response) {\n\t\tMultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n\t\tList<String> errorMessageList = new ArrayList<>();\n\t\tList<ExportDepartVo> listSysDeparts = null;\n\t\tMap<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n\t\tfor (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n\t\t\t// 获取上传文件对象\n\t\t\tMultipartFile file = entity.getValue();\n\t\t\tImportParams params = new ImportParams();\n\t\t\tparams.setTitleRows(2);\n\t\t\tparams.setHeadRows(1);\n\t\t\tparams.setNeedSave(true);\n\t\t\ttry {\n\t\t\t\tlistSysDeparts = ExcelImportUtil.importExcel(file.getInputStream(), ExportDepartVo.class, params);\n\t\t\t\tsysDepartService.importExcel(listSysDeparts,errorMessageList);\n\t\t\t\t//清空部门缓存\n\t\t\t\tList<String> keys3 = redisUtil.scan(CacheConstant.SYS_DEPARTS_CACHE + \"*\");\n\t\t\t\tList<String> keys4 = redisUtil.scan(CacheConstant.SYS_DEPART_IDS_CACHE + \"*\");\n\t\t\t\tredisTemplate.delete(keys3);\n\t\t\t\tredisTemplate.delete(keys4);\n\t\t\t\treturn ImportExcelUtil.imporReturnRes(errorMessageList.size(), listSysDeparts.size() - errorMessageList.size(), errorMessageList);\n\t\t\t} catch (Exception e) {\n\t\t\t\tlog.error(e.getMessage(),e);\n\t\t\t\treturn Result.error(\"文件导入失败:\"+e.getMessage());\n\t\t\t} finally {\n\t\t\t\ttry {\n\t\t\t\t\tfile.getInputStream().close();\n\t\t\t\t} catch (IOException e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn Result.error(\"文件导入失败！\");\n\t}\n\n    /**\n     * 根据部门id和职级id获取岗位信息\n     */\n    @GetMapping(\"/getPositionByDepartId\")\n\tpublic Result<List<SysPositionSelectTreeVo>> getPositionByDepartId(@RequestParam(name = \"parentId\") String parentId,\n                                                                       @RequestParam(name = \"departId\",required = false) String departId,\n                                                                       @RequestParam(name = \"positionId\") String positionId){\n        List<SysPositionSelectTreeVo> positionByDepartId = sysDepartService.getPositionByDepartId(parentId, departId, positionId);\n        return Result.OK(positionByDepartId);\n    }\n\n    /**\n     * 获取职级关系\n     * @param departId\n     * @return\n     */\n    @GetMapping(\"/getRankRelation\")\n    public Result<List<SysPositionSelectTreeVo>> getRankRelation(@RequestParam(name = \"departId\") String departId){\n        List<SysPositionSelectTreeVo> list = sysDepartService.getRankRelation(departId);\n        return Result.ok(list);\n    }\n\n    /**\n     * 根据部门code获取当前和上级部门名称\n     *\n     * @param orgCode\n     * @param depId\n     * @return String 部门名称\n     */\n    @GetMapping(\"/getDepartPathNameByOrgCode\")\n    public Result<String> getDepartPathNameByOrgCode(@RequestParam(name = \"orgCode\", required = false) String orgCode,\n                                                 @RequestParam(name = \"depId\", required = false) String depId) {\n        String departName = sysDepartService.getDepartPathNameByOrgCode(orgCode, depId);\n        return Result.OK(departName);\n    }\n\n    /**\n     * 根据部门id获取部门下的岗位id\n     *\n     * @param depIds 当前选择的公司、子公司、部门id\n     * @return\n     */\n    @GetMapping(\"/getDepPostIdByDepId\")\n    public Result<Map<String, String>> getDepPostIdByDepId(@RequestParam(name = \"depIds\") String depIds) {\n        String departIds = sysDepartService.getDepPostIdByDepId(depIds);\n        return Result.OK(departIds);\n    }\n\n    /**\n     * 更新改变后的部门数据\n     * \n     * @param changeDepartVo\n     * @return\n     */\n    @PutMapping(\"/updateChangeDepart\")\n    @RequiresPermissions(\"system:depart:updateChange\")\n    @RequiresRoles({\"admin\"})\n    public Result<String> updateChangeDepart(@RequestBody SysChangeDepartVo changeDepartVo) {\n        sysDepartService.updateChangeDepart(changeDepartVo);\n    \treturn Result.ok(\"调整部门位置成功！\");\n    }\n\n    /**\n     * 获取部门负责人\n     * \n     * @param departId\n     * @return\n     */\n    @GetMapping(\"/getDepartmentHead\")\n    public Result<IPage<SysUser>> getDepartmentHead(@RequestParam(name = \"departId\") String departId,\n                                                    @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n                                                    @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize){\n        Page<SysUser> page = new Page<>(pageNo, pageSize);\n        IPage<SysUser> pageList = sysDepartService.getDepartmentHead(departId,page);\n        return Result.OK(pageList);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartPermissionController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport java.util.*;\nimport java.util.stream.Collectors;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.base.service.BaseCommonService;\nimport org.jeecg.modules.system.entity.SysDepartPermission;\nimport org.jeecg.modules.system.entity.SysDepartRolePermission;\nimport org.jeecg.modules.system.entity.SysPermission;\nimport org.jeecg.modules.system.entity.SysPermissionDataRule;\nimport org.jeecg.modules.system.model.TreeModel;\nimport org.jeecg.modules.system.service.ISysDepartPermissionService;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.modules.system.service.ISysDepartRolePermissionService;\nimport org.jeecg.modules.system.service.ISysPermissionDataRuleService;\nimport org.jeecg.modules.system.service.ISysPermissionService;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\n\n /**\n * @Description: 部门权限表\n * @Author: jeecg-boot\n * @Date:   2020-02-11\n * @Version: V1.0\n */\n@Slf4j\n@Tag(name=\"部门权限表\")\n@RestController\n@RequestMapping(\"/sys/sysDepartPermission\")\npublic class SysDepartPermissionController extends JeecgController<SysDepartPermission, ISysDepartPermissionService> {\n\t@Autowired\n\tprivate ISysDepartPermissionService sysDepartPermissionService;\n\n\t @Autowired\n\t private ISysPermissionDataRuleService sysPermissionDataRuleService;\n\n\t @Autowired\n\t private ISysPermissionService sysPermissionService;\n\n\t @Autowired\n\t private ISysDepartRolePermissionService sysDepartRolePermissionService;\n\n\t @Autowired\n     private BaseCommonService baseCommonService;\n\t \n\t/**\n\t * 分页列表查询\n\t *\n\t * @param sysDepartPermission\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t@Operation(summary=\"部门权限表-分页列表查询\")\n\t@GetMapping(value = \"/list\")\n\tpublic Result<?> queryPageList(SysDepartPermission sysDepartPermission,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t   HttpServletRequest req) {\n\t\tQueryWrapper<SysDepartPermission> queryWrapper = QueryGenerator.initQueryWrapper(sysDepartPermission, req.getParameterMap());\n\t\tPage<SysDepartPermission> page = new Page<SysDepartPermission>(pageNo, pageSize);\n\t\tIPage<SysDepartPermission> pageList = sysDepartPermissionService.page(page, queryWrapper);\n\t\treturn Result.ok(pageList);\n\t}\n\t\n\t/**\n\t * 添加\n\t *\n\t * @param sysDepartPermission\n\t * @return\n\t */\n\t@Operation(summary=\"部门权限表-添加\")\n\t@PostMapping(value = \"/add\")\n\tpublic Result<?> add(@RequestBody SysDepartPermission sysDepartPermission) {\n\t\tsysDepartPermissionService.save(sysDepartPermission);\n\t\treturn Result.ok(\"添加成功！\");\n\t}\n\t\n\t/**\n\t * 编辑\n\t *\n\t * @param sysDepartPermission\n\t * @return\n\t */\n\t@Operation(summary=\"部门权限表-编辑\")\n\t@RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n\tpublic Result<?> edit(@RequestBody SysDepartPermission sysDepartPermission) {\n\t\tsysDepartPermissionService.updateById(sysDepartPermission);\n\t\treturn Result.ok(\"编辑成功!\");\n\t}\n\t\n\t/**\n\t * 通过id删除\n\t *\n\t * @param id\n\t * @return\n\t */\n\t@Operation(summary=\"部门权限表-通过id删除\")\n\t@DeleteMapping(value = \"/delete\")\n\tpublic Result<?> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\tsysDepartPermissionService.removeById(id);\n\t\treturn Result.ok(\"删除成功!\");\n\t}\n\t\n\t/**\n\t * 批量删除\n\t *\n\t * @param ids\n\t * @return\n\t */\n\t@Operation(summary=\"部门权限表-批量删除\")\n\t@DeleteMapping(value = \"/deleteBatch\")\n\tpublic Result<?> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tthis.sysDepartPermissionService.removeByIds(Arrays.asList(ids.split(\",\")));\n\t\treturn Result.ok(\"批量删除成功！\");\n\t}\n\t\n\t/**\n\t * 通过id查询\n\t *\n\t * @param id\n\t * @return\n\t */\n\t@Operation(summary=\"部门权限表-通过id查询\")\n\t@GetMapping(value = \"/queryById\")\n\tpublic Result<?> queryById(@RequestParam(name=\"id\",required=true) String id) {\n\t\tSysDepartPermission sysDepartPermission = sysDepartPermissionService.getById(id);\n\t\treturn Result.ok(sysDepartPermission);\n\t}\n\n\t/**\n\t* 导出excel\n\t*\n\t* @param request\n\t* @param sysDepartPermission\n\t*/\n\t@RequestMapping(value = \"/exportXls\")\n\tpublic ModelAndView exportXls(HttpServletRequest request, SysDepartPermission sysDepartPermission) {\n\t  return super.exportXls(request, sysDepartPermission, SysDepartPermission.class, \"部门权限表\");\n\t}\n\n\t/**\n\t* 通过excel导入数据\n\t*\n\t* @param request\n\t* @param response\n\t* @return\n\t*/\n\t@RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n\tpublic Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n\t  return super.importExcel(request, response, SysDepartPermission.class);\n\t}\n\n\t/**\n\t* 部门管理授权查询数据规则数据\n\t*/\n\t@GetMapping(value = \"/datarule/{permissionId}/{departId}\")\n\tpublic Result<?> loadDatarule(@PathVariable(\"permissionId\") String permissionId,@PathVariable(\"departId\") String departId) {\n\t\tList<SysPermissionDataRule> list = sysPermissionDataRuleService.getPermRuleListByPermId(permissionId);\n\t\tif(list==null || list.size()==0) {\n\t\t\treturn Result.error(\"未找到权限配置信息\");\n\t\t}else {\n\t\t\tMap<String,Object> map = new HashMap(5);\n\t\t\tmap.put(\"datarule\", list);\n\t\t\tLambdaQueryWrapper<SysDepartPermission> query = new LambdaQueryWrapper<SysDepartPermission>()\n\t\t\t\t .eq(SysDepartPermission::getPermissionId, permissionId)\n\t\t\t\t .eq(SysDepartPermission::getDepartId,departId);\n\t\t\tSysDepartPermission sysDepartPermission = sysDepartPermissionService.getOne(query);\n\t\t\tif(sysDepartPermission==null) {\n\t\t\t //return Result.error(\"未找到角色菜单配置信息\");\n\t\t\t}else {\n\t\t\t\tString drChecked = sysDepartPermission.getDataRuleIds();\n\t\t\t\tif(oConvertUtils.isNotEmpty(drChecked)) {\n\t\t\t\t\tmap.put(\"drChecked\", drChecked.endsWith(\",\")?drChecked.substring(0, drChecked.length()-1):drChecked);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn Result.ok(map);\n\t\t\t//TODO 以后按钮权限的查询也走这个请求 无非在map中多加两个key\n\t\t}\n\t}\n\n\t/**\n\t* 保存数据规则至部门菜单关联表\n\t*/\n\t@PostMapping(value = \"/datarule\")\n\tpublic Result<?> saveDatarule(@RequestBody JSONObject jsonObject) {\n\t\ttry {\n\t\t\tString permissionId = jsonObject.getString(\"permissionId\");\n\t\t\tString departId = jsonObject.getString(\"departId\");\n\t\t\tString dataRuleIds = jsonObject.getString(\"dataRuleIds\");\n\t\t\tlog.info(\"保存数据规则>>\"+\"菜单ID:\"+permissionId+\"部门ID:\"+ departId+\"数据权限ID:\"+dataRuleIds);\n\t\t\tLambdaQueryWrapper<SysDepartPermission> query = new LambdaQueryWrapper<SysDepartPermission>()\n\t\t\t\t .eq(SysDepartPermission::getPermissionId, permissionId)\n\t\t\t\t .eq(SysDepartPermission::getDepartId,departId);\n\t\t\tSysDepartPermission sysDepartPermission = sysDepartPermissionService.getOne(query);\n\t\t\tif(sysDepartPermission==null) {\n\t\t\t\treturn Result.error(\"请先保存部门菜单权限!\");\n\t\t\t}else {\n\t\t\t\tsysDepartPermission.setDataRuleIds(dataRuleIds);\n\t\t\t \tthis.sysDepartPermissionService.updateById(sysDepartPermission);\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t \tlog.error(\"SysDepartPermissionController.saveDatarule()发生异常：\" + e.getMessage(),e);\n\t\t \treturn Result.error(\"保存失败\");\n\t\t}\n\t\treturn Result.ok(\"保存成功!\");\n\t}\n\n\t /**\n\t  * 查询角色授权\n\t  *\n\t  * @return\n\t  */\n\t @RequestMapping(value = \"/queryDeptRolePermission\", method = RequestMethod.GET)\n\t public Result<List<String>> queryDeptRolePermission(@RequestParam(name = \"roleId\", required = true) String roleId) {\n\t\t Result<List<String>> result = new Result<>();\n\t\t try {\n\t\t\t List<SysDepartRolePermission> list = sysDepartRolePermissionService.list(new QueryWrapper<SysDepartRolePermission>().lambda().eq(SysDepartRolePermission::getRoleId, roleId));\n\t\t\t result.setResult(list.stream().map(sysDepartRolePermission -> String.valueOf(sysDepartRolePermission.getPermissionId())).collect(Collectors.toList()));\n\t\t\t result.setSuccess(true);\n\t\t } catch (Exception e) {\n\t\t\t log.error(e.getMessage(), e);\n\t\t }\n\t\t return result;\n\t }\n\n\t /**\n\t  * 保存角色授权\n\t  *\n\t  * @return\n\t  */\n\t @RequestMapping(value = \"/saveDeptRolePermission\", method = RequestMethod.POST)\n\t public Result<String> saveDeptRolePermission(@RequestBody JSONObject json) {\n\t\t long start = System.currentTimeMillis();\n\t\t Result<String> result = new Result<>();\n\t\t try {\n\t\t\t String roleId = json.getString(\"roleId\");\n\t\t\t String permissionIds = json.getString(\"permissionIds\");\n\t\t\t String lastPermissionIds = json.getString(\"lastpermissionIds\");\n\t\t\t this.sysDepartRolePermissionService.saveDeptRolePermission(roleId, permissionIds, lastPermissionIds);\n\t\t\t result.success(\"保存成功！\");\n             // 代码逻辑说明: [VUEN-234]部门角色授权添加敏感日志------------\n             LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n             baseCommonService.addLog(\"修改部门角色ID:\"+roleId+\"的权限配置，操作人： \" +loginUser.getUsername() ,CommonConstant.LOG_TYPE_2, 2);\n             log.info(\"======部门角色授权成功=====耗时:\" + (System.currentTimeMillis() - start) + \"毫秒\");\n\t\t } catch (Exception e) {\n\t\t\t result.error500(\"授权失败！\");\n\t\t\t log.error(e.getMessage(), e);\n\t\t }\n\t\t return result;\n\t }\n\n\t /**\n\t  * 用户角色授权功能，查询菜单权限树\n\t  * @param request\n\t  * @return\n\t  */\n\t @RequestMapping(value = \"/queryTreeListForDeptRole\", method = RequestMethod.GET)\n\t public Result<Map<String,Object>> queryTreeListForDeptRole(@RequestParam(name=\"departId\",required=true) String departId,HttpServletRequest request) {\n\t\t Result<Map<String,Object>> result = new Result<>();\n\t\t //全部权限ids\n\t\t List<String> ids = new ArrayList<>();\n\t\t try {\n\t\t\t List<SysPermission> list = sysPermissionService.queryDepartPermissionList(departId);\n\t\t\t for(SysPermission sysPer : list) {\n\t\t\t\t ids.add(sysPer.getId());\n\t\t\t }\n\t\t\t List<TreeModel> treeList = new ArrayList<>();\n\t\t\t getTreeModelList(treeList, list, null);\n\t\t\t Map<String,Object> resMap = new HashMap(5);\n             //全部树节点数据\n\t\t\t resMap.put(\"treeList\", treeList);\n             //全部树ids\n\t\t\t resMap.put(\"ids\", ids);\n\t\t\t result.setResult(resMap);\n\t\t\t result.setSuccess(true);\n\t\t } catch (Exception e) {\n\t\t\t log.error(e.getMessage(), e);\n\t\t }\n\t\t return result;\n\t }\n\n\t private void getTreeModelList(List<TreeModel> treeList, List<SysPermission> metaList, TreeModel temp) {\n\t\t for (SysPermission permission : metaList) {\n\t\t\t String tempPid = permission.getParentId();\n\t\t\t TreeModel tree = new TreeModel(permission.getId(), tempPid, permission.getName(),permission.getRuleFlag(), permission.isLeaf());\n\t\t\t if(temp==null && oConvertUtils.isEmpty(tempPid)) {\n\t\t\t\t treeList.add(tree);\n\t\t\t\t if(!tree.getIsLeaf()) {\n\t\t\t\t\t getTreeModelList(treeList, metaList, tree);\n\t\t\t\t }\n\t\t\t }else if(temp!=null && tempPid!=null && tempPid.equals(temp.getKey())){\n\t\t\t\t temp.getChildren().add(tree);\n\t\t\t\t if(!tree.getIsLeaf()) {\n\t\t\t\t\t getTreeModelList(treeList, metaList, tree);\n\t\t\t\t }\n\t\t\t }\n\n\t\t }\n\t }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartRoleController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport java.util.*;\nimport java.util.stream.Collectors;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport org.apache.shiro.SecurityUtils;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.apache.shiro.authz.annotation.RequiresRoles;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.base.service.BaseCommonService;\nimport org.jeecg.modules.system.entity.*;\nimport org.jeecg.modules.system.service.*;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.system.base.controller.JeecgController;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\n\n /**\n * @Description: 部门角色\n * @Author: jeecg-boot\n * @Date:   2020-02-12\n * @Version: V1.0\n */\n@Slf4j\n@Tag(name=\"部门角色\")\n@RestController\n@RequestMapping(\"/sys/sysDepartRole\")\npublic class SysDepartRoleController extends JeecgController<SysDepartRole, ISysDepartRoleService> {\n\t@Autowired\n\tprivate ISysDepartRoleService sysDepartRoleService;\n\n\t@Autowired\n\tprivate ISysDepartRoleUserService departRoleUserService;\n\n\t@Autowired\n\tprivate ISysDepartPermissionService sysDepartPermissionService;\n\n\t @Autowired\n\t private ISysDepartRolePermissionService sysDepartRolePermissionService;\n\n\t @Autowired\n\t private ISysDepartService sysDepartService;\n\n\t @Autowired\n     private BaseCommonService baseCommonService;\n     \n\t/**\n\t * 分页列表查询\n\t *\n\t * @param sysDepartRole\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t@Operation(summary=\"部门角色-分页列表查询\")\n\t@GetMapping(value = \"/list\")\n\tpublic Result<?> queryPageList(SysDepartRole sysDepartRole,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"deptId\",required=false) String deptId,\n\t\t\t\t\t\t\t\t   HttpServletRequest req) {\n\t\tQueryWrapper<SysDepartRole> queryWrapper = QueryGenerator.initQueryWrapper(sysDepartRole, req.getParameterMap());\n\t\tPage<SysDepartRole> page = new Page<SysDepartRole>(pageNo, pageSize);\n//\t\tLoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n//\t\tList<String> deptIds = null;\n//\t\tif(oConvertUtils.isEmpty(deptId)){\n//\t\t\tif(oConvertUtils.isNotEmpty(user.getUserIdentity()) && user.getUserIdentity().equals(CommonConstant.USER_IDENTITY_2) ){\n//\t\t\t\tdeptIds = sysDepartService.getMySubDepIdsByDepId(user.getDepartIds());\n//\t\t\t}else{\n//\t\t\t\treturn Result.ok(null);\n//\t\t\t}\n//\t\t}else{\n//\t\t\tdeptIds = sysDepartService.getSubDepIdsByDepId(deptId);\n//\t\t}\n//\t\tqueryWrapper.in(\"depart_id\",deptIds);\n\n\t\t//我的部门，选中部门只能看当前部门下的角色\n\t\t// 代码逻辑说明: [QQYUN-10775]验证码可以复用 #7674------------\n\t\tif(oConvertUtils.isNotEmpty(deptId)){\n\t\t\tqueryWrapper.eq(\"depart_id\",deptId);\n\t\t\tIPage<SysDepartRole> pageList = sysDepartRoleService.page(page, queryWrapper);\n\t\t\treturn Result.ok(pageList);\n\t\t}else{\n\t\t\treturn Result.ok(null);\n\t\t}\n\t}\n\t\n\t/**\n\t * 添加\n\t *\n\t * @param sysDepartRole\n\t * @return\n\t */\n    @RequiresPermissions(\"system:depart:role:add\")\n\t@Operation(summary=\"部门角色-添加\")\n\t@PostMapping(value = \"/add\")\n\tpublic Result<?> add(@RequestBody SysDepartRole sysDepartRole) {\n\t\tsysDepartRoleService.save(sysDepartRole);\n\t\treturn Result.ok(\"添加成功！\");\n\t}\n\t\n\t/**\n\t * 编辑\n\t *\n\t * @param sysDepartRole\n\t * @return\n\t */\n\t@Operation(summary=\"部门角色-编辑\")\n    @RequiresPermissions(\"system:depart:role:edit\")\n\t@RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n\tpublic Result<?> edit(@RequestBody SysDepartRole sysDepartRole) {\n\t\tsysDepartRoleService.updateById(sysDepartRole);\n\t\treturn Result.ok(\"编辑成功!\");\n\t}\n\t\n\t/**\n\t * 通过id删除\n\t *\n\t * @param id\n\t * @return\n\t */\n\t@AutoLog(value = \"部门角色-通过id删除\")\n\t@Operation(summary=\"部门角色-通过id删除\")\n    @RequiresPermissions(\"system:depart:role:delete\")\n\t@DeleteMapping(value = \"/delete\")\n\tpublic Result<?> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\tsysDepartRoleService.removeById(id);\n\t\treturn Result.ok(\"删除成功!\");\n\t}\n\t\n\t/**\n\t * 批量删除\n\t *\n\t * @param ids\n\t * @return\n\t */\n\t@AutoLog(value = \"部门角色-批量删除\")\n\t@Operation(summary=\"部门角色-批量删除\")\n    @RequiresPermissions(\"system:depart:role:deleteBatch\")\n\t@DeleteMapping(value = \"/deleteBatch\")\n\tpublic Result<?> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tthis.sysDepartRoleService.deleteDepartRole(Arrays.asList(ids.split(\",\")));\n\t\t//this.sysDepartRoleService.removeByIds(Arrays.asList(ids.split(\",\")));\n\t\treturn Result.ok(\"批量删除成功！\");\n\t}\n\t\n\t/**\n\t * 通过id查询\n\t *\n\t * @param id\n\t * @return\n\t */\n\t@Operation(summary=\"部门角色-通过id查询\")\n\t@GetMapping(value = \"/queryById\")\n\tpublic Result<?> queryById(@RequestParam(name=\"id\",required=true) String id) {\n\t\tSysDepartRole sysDepartRole = sysDepartRoleService.getById(id);\n\t\treturn Result.ok(sysDepartRole);\n\t}\n\n\t /**\n\t  * 获取部门下角色\n\t  * @param departId\n\t  * @return\n\t  */\n\t@RequestMapping(value = \"/getDeptRoleList\", method = RequestMethod.GET)\n\tpublic Result<List<SysDepartRole>> getDeptRoleList(@RequestParam(value = \"departId\") String departId,@RequestParam(value = \"userId\") String userId){\n\t\tResult<List<SysDepartRole>> result = new Result<>();\n\t\t//查询选中部门的角色\n\t\tList<SysDepartRole> deptRoleList = sysDepartRoleService.list(new LambdaQueryWrapper<SysDepartRole>().eq(SysDepartRole::getDepartId,departId));\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(deptRoleList);\n\t\treturn result;\n\t}\n\n\t /**\n\t  * 设置\n\t  * @param json\n\t  * @return\n\t  */\n     @RequiresPermissions(\"system:depart:role:userAdd\")\n\t @RequestMapping(value = \"/deptRoleUserAdd\", method = RequestMethod.POST)\n\t public Result<?> deptRoleAdd(@RequestBody JSONObject json) {\n\t\t String newRoleId = json.getString(\"newRoleId\");\n\t\t String oldRoleId = json.getString(\"oldRoleId\");\n\t\t String userId = json.getString(\"userId\");\n\t\t departRoleUserService.deptRoleUserAdd(userId,newRoleId,oldRoleId);\n         // 代码逻辑说明: [VUEN-234]部门角色分配添加敏感日志------------\n         LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n         baseCommonService.addLog(\"给部门用户ID：\"+userId+\"分配角色，操作人： \" +loginUser.getUsername() ,CommonConstant.LOG_TYPE_2, 2);\n         return Result.ok(\"添加成功！\");\n\t }\n\n\t /**\n\t  * 根据用户id获取已设置部门角色\n\t  * @param userId\n\t  * @return\n\t  */\n\t @RequestMapping(value = \"/getDeptRoleByUserId\", method = RequestMethod.GET)\n\t public Result<List<SysDepartRoleUser>> getDeptRoleByUserId(@RequestParam(value = \"userId\") String userId,@RequestParam(value = \"departId\") String departId){\n\t\t Result<List<SysDepartRoleUser>> result = new Result<>();\n\t\t //查询部门下角色\n\t\t List<SysDepartRole> roleList = sysDepartRoleService.list(new QueryWrapper<SysDepartRole>().eq(\"depart_id\",departId));\n\t\t List<String> roleIds = roleList.stream().map(SysDepartRole::getId).collect(Collectors.toList());\n\t\t //根据角色id,用户id查询已授权角色\n\t\t List<SysDepartRoleUser> roleUserList = null;\n\t\t if(roleIds!=null && roleIds.size()>0){\n\t\t\t roleUserList = departRoleUserService.list(new QueryWrapper<SysDepartRoleUser>().eq(\"user_id\",userId).in(\"drole_id\",roleIds));\n\t\t }\n\t\t result.setSuccess(true);\n\t\t result.setResult(roleUserList);\n\t\t return result;\n\t }\n\n\t /**\n\t  * 查询数据规则数据\n\t  */\n\t @GetMapping(value = \"/datarule/{permissionId}/{departId}/{roleId}\")\n\t public Result<?> loadDatarule(@PathVariable(\"permissionId\") String permissionId,@PathVariable(\"departId\") String departId,@PathVariable(\"roleId\") String roleId) {\n\t\t//查询已授权的部门规则\n\t \tList<SysPermissionDataRule> list = sysDepartPermissionService.getPermRuleListByDeptIdAndPermId(departId,permissionId);\n\t\t if(list==null || list.size()==0) {\n\t\t\t return Result.error(\"未找到权限配置信息\");\n\t\t }else {\n\t\t\t Map<String,Object> map = new HashMap(5);\n\t\t\t map.put(\"datarule\", list);\n\t\t\t LambdaQueryWrapper<SysDepartRolePermission> query = new LambdaQueryWrapper<SysDepartRolePermission>()\n\t\t\t\t\t .eq(SysDepartRolePermission::getPermissionId, permissionId)\n\t\t\t\t\t .eq(SysDepartRolePermission::getRoleId,roleId);\n\t\t\t SysDepartRolePermission sysRolePermission = sysDepartRolePermissionService.getOne(query);\n\t\t\t if(sysRolePermission==null) {\n\t\t\t\t //return Result.error(\"未找到角色菜单配置信息\");\n\t\t\t }else {\n\t\t\t\t String drChecked = sysRolePermission.getDataRuleIds();\n\t\t\t\t if(oConvertUtils.isNotEmpty(drChecked)) {\n\t\t\t\t\t map.put(\"drChecked\", drChecked.endsWith(\",\")?drChecked.substring(0, drChecked.length()-1):drChecked);\n\t\t\t\t }\n\t\t\t }\n\t\t\t return Result.ok(map);\n\t\t\t //TODO 以后按钮权限的查询也走这个请求 无非在map中多加两个key\n\t\t }\n\t }\n\n\t /**\n\t  * 保存数据规则至角色菜单关联表\n\t  */\n\t @PostMapping(value = \"/datarule\")\n\t public Result<?> saveDatarule(@RequestBody JSONObject jsonObject) {\n\t\t try {\n\t\t\t String permissionId = jsonObject.getString(\"permissionId\");\n\t\t\t String roleId = jsonObject.getString(\"roleId\");\n\t\t\t String dataRuleIds = jsonObject.getString(\"dataRuleIds\");\n\t\t\t log.info(\"保存数据规则>>\"+\"菜单ID:\"+permissionId+\"角色ID:\"+ roleId+\"数据权限ID:\"+dataRuleIds);\n\t\t\t LambdaQueryWrapper<SysDepartRolePermission> query = new LambdaQueryWrapper<SysDepartRolePermission>()\n\t\t\t\t\t .eq(SysDepartRolePermission::getPermissionId, permissionId)\n\t\t\t\t\t .eq(SysDepartRolePermission::getRoleId,roleId);\n\t\t\t SysDepartRolePermission sysRolePermission = sysDepartRolePermissionService.getOne(query);\n\t\t\t if(sysRolePermission==null) {\n\t\t\t\t return Result.error(\"请先保存角色菜单权限!\");\n\t\t\t }else {\n\t\t\t\t sysRolePermission.setDataRuleIds(dataRuleIds);\n\t\t\t\t this.sysDepartRolePermissionService.updateById(sysRolePermission);\n\t\t\t }\n\t\t } catch (Exception e) {\n\t\t\t log.error(\"SysRoleController.saveDatarule()发生异常：\" + e.getMessage(),e);\n\t\t\t return Result.error(\"保存失败\");\n\t\t }\n\t\t return Result.ok(\"保存成功!\");\n\t }\n\n  /**\n   * 导出excel\n   *\n   * @param request\n   * @param sysDepartRole\n   */\n  @RequestMapping(value = \"/exportXls\")\n  public ModelAndView exportXls(HttpServletRequest request, SysDepartRole sysDepartRole) {\n      return super.exportXls(request, sysDepartRole, SysDepartRole.class, \"部门角色\");\n  }\n\n  /**\n   * 通过excel导入数据\n   *\n   * @param request\n   * @param response\n   * @return\n   */\n  @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n  public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n      return super.importExcel(request, response, SysDepartRole.class);\n  }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDictController.java",
    "content": "package org.jeecg.modules.system.controller;\n\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.apache.shiro.SecurityUtils;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.apache.shiro.subject.Subject;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CacheConstant;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.vo.DictModel;\nimport org.jeecg.common.system.vo.DictQuery;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.*;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.config.shiro.ShiroRealm;\nimport org.jeecg.modules.system.constant.DefIndexConst;\nimport org.jeecg.modules.system.entity.SysDict;\nimport org.jeecg.modules.system.entity.SysDictItem;\nimport org.jeecg.modules.system.model.SysDictTree;\nimport org.jeecg.modules.system.model.TreeSelectModel;\nimport org.jeecg.modules.system.service.ISysDictItemService;\nimport org.jeecg.modules.system.service.ISysDictService;\nimport org.jeecg.modules.system.vo.SysDictPage;\nimport org.jeecg.modules.system.vo.lowapp.SysDictVo;\nimport org.jeecgframework.poi.excel.ExcelImportCheckUtil;\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.entity.enmus.ExcelType;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.cache.annotation.CacheEvict;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport org.springframework.web.servlet.ModelAndView;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLDecoder;\nimport java.util.*;\n\n/**\n * <p>\n * 字典表 前端控制器\n * </p>\n *\n * @Author zhangweijian\n * @since 2018-12-28\n */\n@RestController\n@RequestMapping(\"/sys/dict\")\n@Slf4j\npublic class SysDictController {\n\n\t@Autowired\n\tprivate ISysDictService sysDictService;\n\t@Autowired\n\tprivate ISysDictItemService sysDictItemService;\n\t@Autowired\n\tpublic RedisTemplate<String, Object> redisTemplate;\n\t@Autowired\n\tprivate RedisUtil redisUtil;\n\t@Autowired\n\tprivate ShiroRealm shiroRealm;\n\n\t@RequestMapping(value = \"/list\", method = RequestMethod.GET)\n\tpublic Result<IPage<SysDict>> queryPageList(\n\t\t\tSysDict sysDict,\n\t\t\t@RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n\t\t\t@RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n\t\t\t// 查询关键字，模糊筛选code和name\n\t\t\t@RequestParam(name = \"keywords\", required = false) String keywords,\n\t\t\tHttpServletRequest req\n\t) {\n\t\tResult<IPage<SysDict>> result = new Result<IPage<SysDict>>();\n\t\t//------------------------------------------------------------------------------------------------\n\t\t//是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\tsysDict.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(),0));\n\t\t}\n\t\t//------------------------------------------------------------------------------------------------\n\t\tQueryWrapper<SysDict> queryWrapper = QueryGenerator.initQueryWrapper(sysDict, req.getParameterMap());\n\t\t// 查询关键字，模糊筛选code和name\n\t\tif (oConvertUtils.isNotEmpty(keywords)) {\n\t\t\tqueryWrapper.and(i -> i.like(\"dict_code\", keywords).or().like(\"dict_name\", keywords));\n\t\t}\n\n\t\tPage<SysDict> page = new Page<>(pageNo, pageSize);\n\t\tIPage<SysDict> pageList = sysDictService.page(page, queryWrapper);\n\t\tlog.debug(\"查询当前页：\"+pageList.getCurrent());\n\t\tlog.debug(\"查询当前页数量：\"+pageList.getSize());\n\t\tlog.debug(\"查询结果数量：\"+pageList.getRecords().size());\n\t\tlog.debug(\"数据总数：\"+pageList.getTotal());\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(pageList);\n\t\treturn result;\n\t}\n\n\t/**\n\t * @功能：获取树形字典数据\n\t * @param sysDict\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t@SuppressWarnings(\"unchecked\")\n\t@RequestMapping(value = \"/treeList\", method = RequestMethod.GET)\n\tpublic Result<List<SysDictTree>> treeList(SysDict sysDict,@RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,HttpServletRequest req) {\n\t\tResult<List<SysDictTree>> result = new Result<>();\n\t\tLambdaQueryWrapper<SysDict> query = new LambdaQueryWrapper<>();\n\t\t// 构造查询条件\n\t\tString dictName = sysDict.getDictName();\n\t\tif(oConvertUtils.isNotEmpty(dictName)) {\n\t\t\tquery.like(true, SysDict::getDictName, dictName);\n\t\t}\n\t\tquery.orderByDesc(true, SysDict::getCreateTime);\n\t\tList<SysDict> list = sysDictService.list(query);\n\t\tList<SysDictTree> treeList = new ArrayList<>();\n\t\tfor (SysDict node : list) {\n\t\t\ttreeList.add(new SysDictTree(node));\n\t\t}\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(treeList);\n\t\treturn result;\n\t}\n\n\t/**\n\t * 获取全部字典数据\n\t *\n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryAllDictItems\", method = RequestMethod.GET)\n\tpublic Result<?> queryAllDictItems(HttpServletRequest request) {\n\t\tMap<String, List<DictModel>> res = new HashMap(5);\n\t\tres = sysDictService.queryAllDictItems();\n\t\treturn Result.ok(res);\n\t}\n\n\t/**\n\t * 获取字典数据\n\t * @param dictCode\n\t * @return\n\t */\n\t@RequestMapping(value = \"/getDictText/{dictCode}/{key}\", method = RequestMethod.GET)\n\tpublic Result<String> getDictText(@PathVariable(\"dictCode\") String dictCode, @PathVariable(\"key\") String key) {\n\t\tlog.info(\" dictCode : \"+ dictCode);\n\t\tResult<String> result = new Result<String>();\n\t\tString text = null;\n\t\ttry {\n\t\t\ttext = sysDictService.queryDictTextByKey(dictCode, key);\n\t\t\t result.setSuccess(true);\n\t\t\t result.setResult(text);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t\tresult.error500(\"操作失败\");\n\t\t\treturn result;\n\t\t}\n\t\treturn result;\n\t}\n\n\n\t/**\n\t * 获取字典数据 【接口签名验证】\n\t * @param dictCode 字典code\n\t * @param dictCode 表名,文本字段,code字段  | 举例：sys_user,realname,id\n\t * @return\n\t */\n\t@RequestMapping(value = \"/getDictItems/{dictCode}\", method = RequestMethod.GET)\n\tpublic Result<List<DictModel>> getDictItems(@PathVariable(\"dictCode\") String dictCode, @RequestParam(value = \"sign\",required = false) String sign,HttpServletRequest request) {\n\t\tlog.debug(\" dictCode : \"+ dictCode);\n\t\tResult<List<DictModel>> result = new Result<List<DictModel>>();\n\t\ttry {\n\t\t\tList<DictModel> ls = sysDictService.getDictItems(dictCode);\n\t\t\tif (ls == null) {\n\t\t\t\tresult.error500(\"字典Code格式不正确！\");\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tresult.setSuccess(true);\n\t\t\tresult.setResult(ls);\n\t\t\tlog.debug(result.toString());\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\tresult.error500(\"操作失败\");\n\t\t\treturn result;\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 【接口签名验证】\n\t * 【JSearchSelectTag下拉搜索组件专用接口】\n\t * 大数据量的字典表 走异步加载  即前端输入内容过滤数据\n\t * @param dictCode 字典code格式：table,text,code\n\t * @return\n\t */\n\t@RequestMapping(value = \"/loadDict/{dictCode}\", method = RequestMethod.GET)\n\tpublic Result<List<DictModel>> loadDict(@PathVariable(\"dictCode\") String dictCode,\n\t\t\t@RequestParam(name=\"keyword\",required = false) String keyword,\n\t\t\t@RequestParam(value = \"sign\",required = false) String sign,\n\t\t\t@RequestParam(name = \"pageNo\", defaultValue = \"1\", required = false) Integer pageNo,\n\t\t\t@RequestParam(name = \"pageSize\", defaultValue = \"10\", required = false) Integer pageSize) {\n\t\t\n\t\t// 代码逻辑说明: /issues/4905 因为中括号(%5)的问题导致的 表单生成器字段配置时，选择关联字段，在进行高级配置时，无法加载数据库列表，提示 Sgin签名校验错误！ #4905 RouteToRequestUrlFilter\n\t\tif(keyword!=null && keyword.indexOf(\"%5\")>=0){\n\t\t\ttry {\n\t\t\t\tkeyword = URLDecoder.decode(keyword, \"UTF-8\");\n\t\t\t} catch (UnsupportedEncodingException e) {\n\t\t\t\tlog.error(\"下拉搜索关键字解码失败\", e);\n\t\t\t}\n\t\t}\n\t\t\n\t\tlog.info(\" 加载字典表数据,加载关键字: \"+ keyword);\n\t\tResult<List<DictModel>> result = new Result<List<DictModel>>();\n\t\ttry {\n\t\t\tList<DictModel> ls = sysDictService.loadDict(dictCode, keyword, pageNo,pageSize);\n\t\t\tif (ls == null) {\n\t\t\t\tresult.error500(\"字典Code格式不正确！\");\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tresult.setSuccess(true);\n\t\t\tresult.setResult(ls);\n\t\t\tlog.info(result.toString());\n\t\t\treturn result;\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t\tresult.error500(\"操作失败：\" + e.getMessage());\n\t\t\treturn result;\n\t\t}\n\t}\n\n\t/**\n\t * 【接口签名验证】\n\t * 【给表单设计器的表字典使用】下拉搜索模式，有值时动态拼接数据\n\t * @param dictCode\n\t * @param keyword 当前控件的值，可以逗号分割\n\t * @param sign\n\t * @param pageSize\n\t * @return\n\t */\n\t@RequestMapping(value = \"/loadDictOrderByValue/{dictCode}\", method = RequestMethod.GET)\n\tpublic Result<List<DictModel>> loadDictOrderByValue(\n\t\t\t@PathVariable(\"dictCode\") String dictCode,\n\t\t\t@RequestParam(name = \"keyword\") String keyword,\n\t\t\t@RequestParam(value = \"sign\", required = false) String sign,\n\t\t\t@RequestParam(value = \"pageSize\", required = false) Integer pageSize) {\n\t\t// 首次查询查出来用户选中的值，并且不分页\n\t\tResult<List<DictModel>> firstRes = this.loadDict(dictCode, keyword, sign,null, null);\n\t\tif (!firstRes.isSuccess()) {\n\t\t\treturn firstRes;\n\t\t}\n\t\t// 然后再查询出第一页的数据\n\t\tResult<List<DictModel>> result = this.loadDict(dictCode, \"\", sign,1, pageSize);\n\t\tif (!result.isSuccess()) {\n\t\t\treturn result;\n\t\t}\n\t\t// 合并两次查询的数据\n\t\tList<DictModel> firstList = firstRes.getResult();\n\t\tList<DictModel> list = result.getResult();\n\t\tfor (DictModel firstItem : firstList) {\n\t\t\t// anyMatch 表示：判断的条件里，任意一个元素匹配成功，返回true\n\t\t\t// allMatch 表示：判断条件里的元素，所有的都匹配成功，返回true\n\t\t\t// noneMatch 跟 allMatch 相反，表示：判断条件里的元素，所有的都匹配失败，返回true\n\t\t\tboolean none = list.stream().noneMatch(item -> item.getValue().equals(firstItem.getValue()));\n\t\t\t// 当元素不存在时，再添加到集合里\n\t\t\tif (none) {\n\t\t\t\tlist.add(0, firstItem);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 【接口签名验证】\n\t * 根据字典code加载字典text 返回\n\t * @param dictCode 顺序：tableName,text,code\n\t * @param keys 要查询的key\n\t * @param sign\n\t * @param delNotExist 是否移除不存在的项，默认为true，设为false如果某个key不存在数据库中，则直接返回key本身\n\t * @param request\n\t * @return\n\t */\n\t@RequestMapping(value = \"/loadDictItem/{dictCode}\", method = RequestMethod.GET)\n\tpublic Result<List<String>> loadDictItem(@PathVariable(\"dictCode\") String dictCode,@RequestParam(name=\"key\") String keys, @RequestParam(value = \"sign\",required = false) String sign,@RequestParam(value = \"delNotExist\",required = false,defaultValue = \"true\") boolean delNotExist,HttpServletRequest request) {\n\t\tResult<List<String>> result = new Result<>();\n\t\ttry {\n\t\t\tif(dictCode.indexOf(SymbolConstant.COMMA)!=-1) {\n\t\t\t\tString[] params = dictCode.split(SymbolConstant.COMMA);\n\t\t\t\tif(params.length!=3) {\n\t\t\t\t\tresult.error500(\"字典Code格式不正确！\");\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tList<String> texts = sysDictService.queryTableDictByKeys(params[0], params[1], params[2], keys, delNotExist);\n\n\t\t\t\tresult.setSuccess(true);\n\t\t\t\tresult.setResult(texts);\n\t\t\t\tlog.info(result.toString());\n\t\t\t}else {\n\t\t\t\tresult.error500(\"字典Code格式不正确！\");\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t\tresult.error500(\"操作失败\");\n\t\t\treturn result;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * 【接口签名验证】\n\t * 根据表名——显示字段-存储字段 pid 加载树形数据\n\t * @param hasChildField 是否叶子节点字段\n\t * @param converIsLeafVal 是否需要系统转换 是否叶子节点的值 (0标识不转换、1标准系统自动转换)\n\t * @param tableName 表名\n\t * @param text label字段\n\t * @param code value 字段\n\t * @param condition  查询条件  ？\n\t *            \n\t */\n\t@SuppressWarnings(\"unchecked\")\n\t@RequestMapping(value = \"/loadTreeData\", method = RequestMethod.GET)\n\tpublic Result<List<TreeSelectModel>> loadTreeData(@RequestParam(name=\"pid\",required = false) String pid,@RequestParam(name=\"pidField\") String pidField,\n\t\t\t\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"tableName\") String tableName,\n\t\t\t\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"text\") String text,\n\t\t\t\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"code\") String code,\n\t\t\t\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"hasChildField\") String hasChildField,\n\t\t\t\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"converIsLeafVal\",defaultValue =\"1\") int converIsLeafVal,\n\t\t\t\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"condition\") String condition,\n\t\t\t\t\t\t\t\t\t\t\t\t  @RequestParam(value = \"sign\",required = false) String sign,HttpServletRequest request) {\n\t\tResult<List<TreeSelectModel>> result = new Result<List<TreeSelectModel>>();\n\n\t\t// 【QQYUN-9207】防止参数为空导致报错\n\t\tif (oConvertUtils.isEmpty(tableName) || oConvertUtils.isEmpty(text) || oConvertUtils.isEmpty(code)) {\n\t\t\tresult.error500(\"字典Code格式不正确！\");\n\t\t\treturn result;\n\t\t}\n\n\t\t// 1.获取查询条件参数\n\t\tMap<String, String> query = null;\n\t\tif(oConvertUtils.isNotEmpty(condition)) {\n\t\t\tquery = JSON.parseObject(condition, Map.class);\n\t\t}\n\t\t\n\t\t// 2.返回查询结果\n\t\tList<TreeSelectModel> ls = sysDictService.queryTreeList(query,tableName, text, code, pidField, pid,hasChildField,converIsLeafVal);\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(ls);\n\t\treturn result;\n\t}\n\n\t/**\n\t * 【APP接口】根据字典配置查询表字典数据（目前暂未找到调用的地方）\n\t * @param query\n\t * @param pageNo\n\t * @param pageSize\n\t * @return\n\t */\n\t@Deprecated\n\t@GetMapping(\"/queryTableData\")\n\tpublic Result<List<DictModel>> queryTableData(DictQuery query,\n\t\t\t\t\t\t\t\t\t\t\t\t  @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t\t\t\t\t  @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t\t\t\t\t  @RequestParam(value = \"sign\",required = false) String sign,HttpServletRequest request){\n\t\tResult<List<DictModel>> res = new Result<List<DictModel>>();\n\t\tList<DictModel> ls = this.sysDictService.queryDictTablePageList(query,pageSize,pageNo);\n\t\tres.setResult(ls);\n\t\tres.setSuccess(true);\n\t\treturn res;\n\t}\n\n\t/**\n\t * @功能：新增\n\t * @param sysDict\n\t * @return\n\t */\n    @RequiresPermissions(\"system:dict:add\")\n\t@RequestMapping(value = \"/add\", method = RequestMethod.POST)\n\tpublic Result<SysDict> add(@RequestBody SysDict sysDict) {\n\t\tResult<SysDict> result = new Result<SysDict>();\n\t\ttry {\n\t\t\tsysDict.setCreateTime(new Date());\n\t\t\tsysDict.setDelFlag(CommonConstant.DEL_FLAG_0);\n\t\t\tsysDictService.save(sysDict);\n\t\t\tresult.success(\"保存成功！\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t\tresult.error500(\"操作失败\");\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * @功能：编辑\n\t * @param sysDict\n\t * @return\n\t */\n    @RequiresPermissions(\"system:dict:edit\")\n\t@RequestMapping(value = \"/edit\", method = { RequestMethod.PUT,RequestMethod.POST })\n\tpublic Result<SysDict> edit(@RequestBody SysDict sysDict) {\n\t\tResult<SysDict> result = new Result<SysDict>();\n\t\tSysDict sysdict = sysDictService.getById(sysDict.getId());\n\t\tif(sysdict==null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}else {\n\t\t\tsysDict.setUpdateTime(new Date());\n\t\t\tboolean ok = sysDictService.updateById(sysDict);\n\t\t\tif(ok) {\n\t\t\t\tresult.success(\"编辑成功!\");\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * @功能：删除\n\t * @param id\n\t * @return\n\t */\n    @RequiresPermissions(\"system:dict:delete\")\n\t@RequestMapping(value = \"/delete\", method = RequestMethod.DELETE)\n\t@CacheEvict(value={CacheConstant.SYS_DICT_CACHE, CacheConstant.SYS_ENABLE_DICT_CACHE}, allEntries=true)\n\tpublic Result<SysDict> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\tResult<SysDict> result = new Result<SysDict>();\n\t\tboolean ok = sysDictService.removeById(id);\n\t\tif(ok) {\n\t\t\tresult.success(\"删除成功!\");\n\t\t}else{\n\t\t\tresult.error500(\"删除失败!\");\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * @功能：批量删除\n\t * @param ids\n\t * @return\n\t */\n    @RequiresPermissions(\"system:dict:deleteBatch\")\n\t@RequestMapping(value = \"/deleteBatch\", method = RequestMethod.DELETE)\n\t@CacheEvict(value= {CacheConstant.SYS_DICT_CACHE, CacheConstant.SYS_ENABLE_DICT_CACHE}, allEntries=true)\n\tpublic Result<SysDict> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tResult<SysDict> result = new Result<SysDict>();\n\t\tif(oConvertUtils.isEmpty(ids)) {\n\t\t\tresult.error500(\"参数不识别！\");\n\t\t}else {\n\t\t\tsysDictService.removeByIds(Arrays.asList(ids.split(\",\")));\n\t\t\tresult.success(\"删除成功!\");\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * @功能：刷新缓存\n\t * @return\n\t */\n\t@RequestMapping(value = \"/refleshCache\")\n\tpublic Result<?> refleshCache() {\n\t\tResult<?> result = new Result<SysDict>();\n\t\t//清空字典缓存\n//\t\tSet keys = redisTemplate.keys(CacheConstant.SYS_DICT_CACHE + \"*\");\n//\t\tSet keys7 = redisTemplate.keys(CacheConstant.SYS_ENABLE_DICT_CACHE + \"*\");\n//\t\tSet keys2 = redisTemplate.keys(CacheConstant.SYS_DICT_TABLE_CACHE + \"*\");\n//\t\tSet keys21 = redisTemplate.keys(CacheConstant.SYS_DICT_TABLE_BY_KEYS_CACHE + \"*\");\n//\t\tSet keys3 = redisTemplate.keys(CacheConstant.SYS_DEPARTS_CACHE + \"*\");\n//\t\tSet keys4 = redisTemplate.keys(CacheConstant.SYS_DEPART_IDS_CACHE + \"*\");\n//\t\tSet keys5 = redisTemplate.keys( \"jmreport:cache:dict*\");\n//\t\tSet keys6 = redisTemplate.keys( \"jmreport:cache:dictTable*\");\n//\t\tredisTemplate.delete(keys);\n//\t\tredisTemplate.delete(keys2);\n//\t\tredisTemplate.delete(keys21);\n//\t\tredisTemplate.delete(keys3);\n//\t\tredisTemplate.delete(keys4);\n//\t\tredisTemplate.delete(keys5);\n//\t\tredisTemplate.delete(keys6);\n//\t\tredisTemplate.delete(keys7);\n\n\t\t// 代码逻辑说明: [issue/4358]springCache中的清除缓存的操作使用了“keys”\n\t\tredisUtil.removeAll(CacheConstant.SYS_DICT_CACHE);\n\t\tredisUtil.removeAll(CacheConstant.SYS_ENABLE_DICT_CACHE);\n\t\tredisUtil.removeAll(CacheConstant.SYS_DICT_TABLE_CACHE);\n\t\tredisUtil.removeAll(CacheConstant.SYS_DICT_TABLE_BY_KEYS_CACHE);\n\t\tredisUtil.removeAll(CacheConstant.SYS_DEPARTS_CACHE);\n\t\tredisUtil.removeAll(CacheConstant.SYS_DEPART_IDS_CACHE);\n\t\tredisUtil.removeAll(\"jmreport:cache:dict\");\n\t\tredisUtil.removeAll(\"jmreport:cache:dictTable\");\n\t\t\n\t\t// 清除当前用户的授权缓存信息\n\t\tSubject currentUser = SecurityUtils.getSubject();\n\t\tif (currentUser.isAuthenticated()) {\n\t\t\tshiroRealm.clearCache(currentUser.getPrincipals());\n\t\t}\n\n\t\t// 清空默认首页缓存（开源版和商业版会串）\n\t\tredisUtil.del(DefIndexConst.CACHE_KEY + \"::\" + DefIndexConst.DEF_INDEX_ALL);\n\t\treturn result;\n\t}\n\n\t/**\n\t * 导出excel\n\t *\n\t * @param request\n\t */\n\t@RequestMapping(value = \"/exportXls\")\n\tpublic ModelAndView exportXls(SysDict sysDict,HttpServletRequest request) {\n\t\t//------------------------------------------------------------------------------------------------\n\t\t//是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\tsysDict.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(), 0));\n\t\t}\n\t\t//------------------------------------------------------------------------------------------------\n\t\t\n\t\t// Step.1 组装查询条件\n\t\tQueryWrapper<SysDict> queryWrapper = QueryGenerator.initQueryWrapper(sysDict, request.getParameterMap());\n\t\t//Step.2 AutoPoi 导出Excel\n\t\tModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n\t\tString selections = request.getParameter(\"selections\");\n\t\tif(!oConvertUtils.isEmpty(selections)){\n\t\t\tqueryWrapper.in(\"id\",selections.split(\",\"));\n\t\t}\n\t\tList<SysDictPage> pageList = new ArrayList<SysDictPage>();\n\n\t\tList<SysDict> sysDictList = sysDictService.list(queryWrapper);\n\t\tfor (SysDict dictMain : sysDictList) {\n\t\t\tSysDictPage vo = new SysDictPage();\n\t\t\tBeanUtils.copyProperties(dictMain, vo);\n\t\t\t// 查询机票\n\t\t\tList<SysDictItem> sysDictItemList = sysDictItemService.selectItemsByMainId(dictMain.getId());\n\t\t\tvo.setSysDictItemList(sysDictItemList);\n\t\t\tpageList.add(vo);\n\t\t}\n\n\t\t// 导出文件名称\n\t\tmv.addObject(NormalExcelConstants.FILE_NAME, \"数据字典\");\n\t\t// 注解对象Class\n\t\tmv.addObject(NormalExcelConstants.CLASS, SysDictPage.class);\n\t\t// 自定义表格参数\n\t\tLoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\tmv.addObject(NormalExcelConstants.PARAMS, new ExportParams(\"数据字典列表\", \"导出人:\"+user.getRealname(), \"数据字典\", ExcelType.XSSF));\n\t\t// 导出数据列表\n\t\tmv.addObject(NormalExcelConstants.DATA_LIST, pageList);\n\t\treturn mv;\n\t}\n\n\t/**\n\t * 通过excel导入数据\n\t *\n\t * @param request\n\t * @param\n\t * @return\n\t */\n    @RequiresPermissions(\"system:dict:importExcel\")\n\t@RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n\tpublic Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n \t\tMultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n\t\tMap<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n\t\tfor (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n            // 获取上传文件对象\n\t\t\tMultipartFile file = entity.getValue();\n\t\t\tImportParams params = new ImportParams();\n\t\t\tparams.setTitleRows(2);\n\t\t\tparams.setHeadRows(2);\n\t\t\tparams.setNeedSave(true);\n\t\t\ttry {\n\t\t\t\t//导入Excel格式校验，看匹配的字段文本概率\n\t\t\t\tBoolean t = ExcelImportCheckUtil.check(file.getInputStream(), SysDictPage.class, params);\n\t\t\t\tif(t!=null && !t){\n\t\t\t\t\tthrow new RuntimeException(\"导入Excel校验失败 ！\");\n\t\t\t\t}\n\t\t\t\tList<SysDictPage> list = ExcelImportUtil.importExcel(file.getInputStream(), SysDictPage.class, params);\n\t\t\t\t// 错误信息\n\t\t\t\tList<String> errorMessage = new ArrayList<>();\n\t\t\t\tint successLines = 0, errorLines = 0;\n\t\t\t\tfor (int i=0;i< list.size();i++) {\n\t\t\t\t\tSysDict po = new SysDict();\n\t\t\t\t\tBeanUtils.copyProperties(list.get(i), po);\n\t\t\t\t\tpo.setDelFlag(CommonConstant.DEL_FLAG_0);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tInteger integer = sysDictService.saveMain(po, list.get(i).getSysDictItemList());\n\t\t\t\t\t\tif(integer>0){\n\t\t\t\t\t\t\tsuccessLines++;\n                        // 代码逻辑说明: [JTC-1168]如果字典项值为空，则字典项忽略导入------------\n\t\t\t\t\t\t}else if(integer == -1){\n                            errorLines++;\n                            errorMessage.add(\"字典名称：\" + po.getDictName() + \"，对应字典列表的字典项值不能为空，忽略导入。\");\n                        }else{\n\t\t\t\t\t\t\terrorLines++;\n\t\t\t\t\t\t\tint lineNumber = i + 1;\n                            // 代码逻辑说明: [JTC-1168]字典编号不能为空------------\n                            if(oConvertUtils.isEmpty(po.getDictCode())){\n                                errorMessage.add(\"第 \" + lineNumber + \" 行：字典编码不能为空，忽略导入。\");\n                            }else{\n                                errorMessage.add(\"第 \" + lineNumber + \" 行：字典编码已经存在，忽略导入。\");\n                            }\n                        }\n\t\t\t\t\t}  catch (Exception e) {\n\t\t\t\t\t\terrorLines++;\n\t\t\t\t\t\tint lineNumber = i + 1;\n\t\t\t\t\t\terrorMessage.add(\"第 \" + lineNumber + \" 行：字典编码已经存在，忽略导入。\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ImportExcelUtil.imporReturnRes(errorLines,successLines,errorMessage);\n\t\t\t} catch (Exception e) {\n\t\t\t\tlog.error(e.getMessage(),e);\n\t\t\t\treturn Result.error(\"文件导入失败:\"+e.getMessage());\n\t\t\t} finally {\n\t\t\t\ttry {\n\t\t\t\t\tfile.getInputStream().close();\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn Result.error(\"文件导入失败！\");\n\t}\n\n\n\t/**\n\t * 查询被删除的列表\n\t * @return\n\t */\n\t@RequestMapping(value = \"/deleteList\", method = RequestMethod.GET)\n\tpublic Result<List<SysDict>> deleteList(HttpServletRequest request) {\n\t\tResult<List<SysDict>> result = new Result<List<SysDict>>();\n\t\tString tenantId = TokenUtils.getTenantIdByRequest(request);\n\t\tList<SysDict> list = this.sysDictService.queryDeleteList(tenantId);\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(list);\n\t\treturn result;\n\t}\n\n\t/**\n\t * 物理删除\n\t * @param id\n\t * @return\n\t */\n\t@RequestMapping(value = \"/deletePhysic/{id}\", method = RequestMethod.DELETE)\n\tpublic Result<?> deletePhysic(@PathVariable(\"id\") String id) {\n\t\ttry {\n\t\t\tsysDictService.deleteOneDictPhysically(id);\n\t\t\treturn Result.ok(\"删除成功!\");\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\treturn Result.error(\"删除失败!\");\n\t\t}\n\t}\n\n\t/**\n\t * 逻辑删除的字段，进行取回\n\t * @param id\n\t * @return\n\t */\n\t@RequestMapping(value = \"/back/{id}\", method = RequestMethod.PUT)\n\tpublic Result<?> back(@PathVariable(\"id\") String id) {\n\t\ttry {\n\t\t\tsysDictService.updateDictDelFlag(0,id);\n\t\t\treturn Result.ok(\"操作成功!\");\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\treturn Result.error(\"操作失败!\");\n\t\t}\n\t}\n\t/**\n\t * 还原被逻辑删除的用户\n\t *\n\t * @param jsonObject\n\t * @return\n\t */\n\t@RequestMapping(value = \"/putRecycleBin\", method = RequestMethod.PUT)\n\tpublic Result putRecycleBin(@RequestBody JSONObject jsonObject, HttpServletRequest request) {\n\t\ttry {\n\t\t\tString ids = jsonObject.getString(\"ids\");\n\t\t\tif (StringUtils.isNotBlank(ids)) {\n\t\t\t\tsysDictService.revertLogicDeleted(Arrays.asList(ids.split(\",\")));\n\t\t\t\treturn Result.ok(\"操作成功!\");\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\treturn Result.error(\"操作失败!\");\n\t\t}\n\t\treturn Result.ok(\"还原成功\");\n\t}\n\t/**\n\t * 彻底删除字典\n\t *\n\t * @param ids 被删除的字典ID，多个id用半角逗号分割\n\t * @return\n\t */\n\t@RequiresPermissions(\"system:dict:deleteRecycleBin\")\n\t@RequestMapping(value = \"/deleteRecycleBin\", method = RequestMethod.DELETE)\n\tpublic Result deleteRecycleBin(@RequestParam(\"ids\") String ids) {\n\t\ttry {\n\t\t\tif (StringUtils.isNotBlank(ids)) {\n\t\t\t\tsysDictService.removeLogicDeleted(Arrays.asList(ids.split(\",\")));\n\t\t\t}\n\t\t\treturn Result.ok(\"删除成功!\");\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\treturn Result.error(\"删除失败!\");\n\t\t}\n\t}\n\n\t/**\n\t * VUEN-2584【issue】平台sql注入漏洞几个问题\n\t * 部分特殊函数 可以将查询结果混夹在错误信息中，导致数据库的信息暴露\n\t * @param e\n\t * @return\n\t */\n\t@ExceptionHandler(java.sql.SQLException.class)\n\tpublic Result<?> handleSQLException(Exception e){\n\t\tString msg = e.getMessage();\n\t\tString extractvalue = \"extractvalue\";\n\t\tString updatexml = \"updatexml\";\n\t\tif(msg!=null && (msg.toLowerCase().indexOf(extractvalue)>=0 || msg.toLowerCase().indexOf(updatexml)>=0)){\n\t\t\treturn Result.error(\"校验失败，sql解析异常！\");\n\t\t}\n\t\treturn Result.error(\"校验失败，sql解析异常！\" + msg);\n\t}\n\n\t/**\n\t * 根据应用id获取字典列表和详情\n\t * @param request\n\t */\n\t@GetMapping(\"/getDictListByLowAppId\")\n\tpublic Result<List<SysDictVo>> getDictListByLowAppId(HttpServletRequest request){\n\t\tString lowAppId = oConvertUtils.getString(TokenUtils.getLowAppIdByRequest(request));\n\t\tList<SysDictVo> list = sysDictService.getDictListByLowAppId(lowAppId);\n\t\treturn Result.ok(list);\n\t}\n\n\t/**\n\t * 添加字典\n\t * @param sysDictVo\n\t * @param request\n\t * @return\n\t */\n\t@PostMapping(\"/addDictByLowAppId\")\n\tpublic Result<String> addDictByLowAppId(@RequestBody SysDictVo sysDictVo,HttpServletRequest request){\n\t\tString lowAppId = oConvertUtils.getString(TokenUtils.getLowAppIdByRequest(request));\n\t\tString tenantId = oConvertUtils.getString(TokenUtils.getTenantIdByRequest(request));\n\t\tsysDictVo.setLowAppId(lowAppId);\n\t\tsysDictVo.setTenantId(oConvertUtils.getInteger(tenantId, null));\n\t\tsysDictService.addDictByLowAppId(sysDictVo);\n\t\treturn Result.ok(\"添加成功\");\n\t}\n\n\t@PutMapping(\"/editDictByLowAppId\")\n\tpublic Result<String> editDictByLowAppId(@RequestBody SysDictVo sysDictVo,HttpServletRequest request){\n\t\tString lowAppId = oConvertUtils.getString(TokenUtils.getLowAppIdByRequest(request));\n\t\tsysDictVo.setLowAppId(lowAppId);\n\t\tsysDictService.editDictByLowAppId(sysDictVo);\n\t\treturn Result.ok(\"编辑成功\");\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDictItemController.java",
    "content": "package org.jeecg.modules.system.controller;\n\n\nimport java.util.Arrays;\nimport java.util.Date;\n\nimport jakarta.servlet.http.HttpServletRequest;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport org.apache.commons.lang.StringUtils;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.apache.shiro.authz.annotation.RequiresRoles;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CacheConstant;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysDictItem;\nimport org.jeecg.modules.system.service.ISysDictItemService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.cache.annotation.CacheEvict;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * <p>\n *  前端控制器\n * </p>\n *\n * @Author zhangweijian\n * @since 2018-12-28\n */\n@Tag(name = \"数据字典\")\n@RestController\n@RequestMapping(\"/sys/dictItem\")\n@Slf4j\npublic class SysDictItemController {\n\n\t@Autowired\n\tprivate ISysDictItemService sysDictItemService;\n\t\n\t/**\n\t * @功能：查询字典数据\n\t * @param sysDictItem\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t@RequestMapping(value = \"/list\", method = RequestMethod.GET)\n\tpublic Result<IPage<SysDictItem>> queryPageList(SysDictItem sysDictItem,@RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,HttpServletRequest req) {\n\t\tResult<IPage<SysDictItem>> result = new Result<IPage<SysDictItem>>();\n\t\tQueryWrapper<SysDictItem> queryWrapper = QueryGenerator.initQueryWrapper(sysDictItem, req.getParameterMap());\n\t\tqueryWrapper.orderByAsc(\"sort_order\");\n\t\tPage<SysDictItem> page = new Page<SysDictItem>(pageNo, pageSize);\n\t\tIPage<SysDictItem> pageList = sysDictItemService.page(page, queryWrapper);\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(pageList);\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * @功能：新增\n\t * @return\n\t */\n    @RequiresPermissions(\"system:dict:item:add\")\n\t@RequestMapping(value = \"/add\", method = RequestMethod.POST)\n\t@CacheEvict(value= {CacheConstant.SYS_DICT_CACHE, CacheConstant.SYS_ENABLE_DICT_CACHE}, allEntries=true)\n\tpublic Result<SysDictItem> add(@RequestBody SysDictItem sysDictItem) {\n\t\tResult<SysDictItem> result = new Result<SysDictItem>();\n\t\ttry {\n\t\t\tsysDictItem.setCreateTime(new Date());\n\t\t\tsysDictItemService.save(sysDictItem);\n\t\t\tresult.success(\"保存成功！\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t\tresult.error500(\"操作失败\");\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * @功能：编辑\n\t * @param sysDictItem\n\t * @return\n\t */\n    @RequiresPermissions(\"system:dict:item:edit\")\n\t@RequestMapping(value = \"/edit\",  method = { RequestMethod.PUT,RequestMethod.POST })\n\t@CacheEvict(value={CacheConstant.SYS_DICT_CACHE, CacheConstant.SYS_ENABLE_DICT_CACHE}, allEntries=true)\n\tpublic Result<SysDictItem> edit(@RequestBody SysDictItem sysDictItem) {\n\t\tResult<SysDictItem> result = new Result<SysDictItem>();\n\t\tSysDictItem sysdict = sysDictItemService.getById(sysDictItem.getId());\n\t\tif(sysdict==null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}else {\n\t\t\tsysDictItem.setUpdateTime(new Date());\n\t\t\tboolean ok = sysDictItemService.updateById(sysDictItem);\n\t\t\t//TODO 返回false说明什么？\n\t\t\tif(ok) {\n\t\t\t\tresult.success(\"编辑成功!\");\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * @功能：删除字典数据\n\t * @param id\n\t * @return\n\t */\n    @RequiresPermissions(\"system:dict:item:delete\")\n\t@RequestMapping(value = \"/delete\", method = RequestMethod.DELETE)\n\t@CacheEvict(value={CacheConstant.SYS_DICT_CACHE, CacheConstant.SYS_ENABLE_DICT_CACHE}, allEntries=true)\n\tpublic Result<SysDictItem> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\tResult<SysDictItem> result = new Result<SysDictItem>();\n\t\tSysDictItem joinSystem = sysDictItemService.getById(id);\n\t\tif(joinSystem==null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}else {\n\t\t\tboolean ok = sysDictItemService.removeById(id);\n\t\t\tif(ok) {\n\t\t\t\tresult.success(\"删除成功!\");\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * @功能：批量删除字典数据\n\t * @param ids\n\t * @return\n\t */\n    @RequiresPermissions(\"system:dict:item:deleteBatch\")\n\t@RequestMapping(value = \"/deleteBatch\", method = RequestMethod.DELETE)\n\t@CacheEvict(value={CacheConstant.SYS_DICT_CACHE, CacheConstant.SYS_ENABLE_DICT_CACHE}, allEntries=true)\n\tpublic Result<SysDictItem> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tResult<SysDictItem> result = new Result<SysDictItem>();\n\t\tif(ids==null || \"\".equals(ids.trim())) {\n\t\t\tresult.error500(\"参数不识别！\");\n\t\t}else {\n\t\t\tthis.sysDictItemService.removeByIds(Arrays.asList(ids.split(\",\")));\n\t\t\tresult.success(\"删除成功!\");\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 字典值重复校验\n\t * @param sysDictItem\n\t * @param request\n\t * @return\n\t */\n\t@RequestMapping(value = \"/dictItemCheck\", method = RequestMethod.GET)\n\t@Operation(summary=\"字典重复校验接口\")\n\tpublic Result<Object> doDictItemCheck(SysDictItem sysDictItem, HttpServletRequest request) {\n\t\tLong num = Long.valueOf(0);\n\t\tLambdaQueryWrapper<SysDictItem> queryWrapper = new LambdaQueryWrapper<SysDictItem>();\n\t\tqueryWrapper.eq(SysDictItem::getItemValue,sysDictItem.getItemValue());\n\t\tqueryWrapper.eq(SysDictItem::getDictId,sysDictItem.getDictId());\n\t\tif (StringUtils.isNotBlank(sysDictItem.getId())) {\n\t\t\t// 编辑页面校验\n\t\t\tqueryWrapper.ne(SysDictItem::getId,sysDictItem.getId());\n\t\t}\n\t\tnum = sysDictItemService.count(queryWrapper);\n\t\tif (num == 0) {\n\t\t\t// 该值可用\n\t\t\treturn Result.ok(\"该值可用！\");\n\t\t} else {\n\t\t\t// 该值不可用\n\t\t\tlog.info(\"该值不可用，系统中已存在！\");\n\t\t\treturn Result.error(\"该值不可用，系统中已存在！\");\n\t\t}\n\t}\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysFillRuleController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.util.FillRuleUtil;\nimport org.jeecg.modules.system.entity.SysFillRule;\nimport org.jeecg.modules.system.service.ISysFillRuleService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.util.Arrays;\n\n/**\n * @Description: 填值规则\n * @Author: jeecg-boot\n * @Date: 2019-11-07\n * @Version: V1.0\n */\n@Slf4j\n@Tag(name = \"填值规则\")\n@RestController\n@RequestMapping(\"/sys/fillRule\")\npublic class SysFillRuleController extends JeecgController<SysFillRule, ISysFillRuleService> {\n    @Autowired\n    private ISysFillRuleService sysFillRuleService;\n\n    /**\n     * 分页列表查询\n     *\n     * @param sysFillRule\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @AutoLog(value = \"填值规则-分页列表查询\")\n    @Operation(summary = \"填值规则-分页列表查询\")\n    @GetMapping(value = \"/list\")\n    public Result<?> queryPageList(SysFillRule sysFillRule,\n                                   @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                   @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                   HttpServletRequest req) {\n        QueryWrapper<SysFillRule> queryWrapper = QueryGenerator.initQueryWrapper(sysFillRule, req.getParameterMap());\n        Page<SysFillRule> page = new Page<>(pageNo, pageSize);\n        IPage<SysFillRule> pageList = sysFillRuleService.page(page, queryWrapper);\n        return Result.ok(pageList);\n    }\n\n    /**\n     * 测试 ruleCode\n     *\n     * @param ruleCode\n     * @return\n     */\n    @GetMapping(value = \"/testFillRule\")\n    public Result testFillRule(@RequestParam(\"ruleCode\") String ruleCode) {\n        Object result = FillRuleUtil.executeRule(ruleCode, new JSONObject());\n        return Result.ok(result);\n    }\n\n    /**\n     * 添加\n     *\n     * @param sysFillRule\n     * @return\n     */\n    @AutoLog(value = \"填值规则-添加\")\n    @Operation(summary = \"填值规则-添加\")\n    @PostMapping(value = \"/add\")\n    public Result<?> add(@RequestBody SysFillRule sysFillRule) {\n        sysFillRuleService.save(sysFillRule);\n        return Result.ok(\"添加成功！\");\n    }\n\n    /**\n     * 编辑\n     *\n     * @param sysFillRule\n     * @return\n     */\n    @AutoLog(value = \"填值规则-编辑\")\n    @Operation(summary = \"填值规则-编辑\")\n    @RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n    public Result<?> edit(@RequestBody SysFillRule sysFillRule) {\n        sysFillRuleService.updateById(sysFillRule);\n        return Result.ok(\"编辑成功!\");\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @AutoLog(value = \"填值规则-通过id删除\")\n    @Operation(summary = \"填值规则-通过id删除\")\n    @DeleteMapping(value = \"/delete\")\n    public Result<?> delete(@RequestParam(name = \"id\", required = true) String id) {\n        sysFillRuleService.removeById(id);\n        return Result.ok(\"删除成功!\");\n    }\n\n    /**\n     * 批量删除\n     *\n     * @param ids\n     * @return\n     */\n    @AutoLog(value = \"填值规则-批量删除\")\n    @Operation(summary = \"填值规则-批量删除\")\n    @DeleteMapping(value = \"/deleteBatch\")\n    public Result<?> deleteBatch(@RequestParam(name = \"ids\", required = true) String ids) {\n        this.sysFillRuleService.removeByIds(Arrays.asList(ids.split(\",\")));\n        return Result.ok(\"批量删除成功！\");\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    @AutoLog(value = \"填值规则-通过id查询\")\n    @Operation(summary = \"填值规则-通过id查询\")\n    @GetMapping(value = \"/queryById\")\n    public Result<?> queryById(@RequestParam(name = \"id\", required = true) String id) {\n        SysFillRule sysFillRule = sysFillRuleService.getById(id);\n        return Result.ok(sysFillRule);\n    }\n\n    /**\n     * 导出excel\n     *\n     * @param request\n     * @param sysFillRule\n     */\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, SysFillRule sysFillRule) {\n        return super.exportXls(request, sysFillRule, SysFillRule.class, \"填值规则\");\n    }\n\n    /**\n     * 通过excel导入数据\n     *\n     * @param request\n     * @param response\n     * @return\n     */\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n        return super.importExcel(request, response, SysFillRule.class);\n    }\n\n    /**\n     * 通过 ruleCode 执行自定义填值规则\n     *\n     * @param ruleCode 要执行的填值规则编码\n     * @param formData 表单数据，可根据表单数据的不同生成不同的填值结果\n     * @return 运行后的结果\n     */\n    @PutMapping(\"/executeRuleByCode/{ruleCode}\")\n    public Result executeByRuleCode(@PathVariable(\"ruleCode\") String ruleCode, @RequestBody JSONObject formData) {\n        Object result = FillRuleUtil.executeRule(ruleCode, formData);\n        return Result.ok(result);\n    }\n\n\n    /**\n     * 批量通过 ruleCode 执行自定义填值规则\n     *\n     * @param ruleData 要执行的填值规则JSON数组：\n     *                 示例： { \"commonFormData\": {}, rules: [ { \"ruleCode\": \"xxx\", \"formData\": null } ] }\n     * @return 运行后的结果，返回示例： [{\"ruleCode\": \"order_num_rule\", \"result\": \"CN2019111117212984\"}]\n     *\n     */\n    @PutMapping(\"/executeRuleByCodeBatch\")\n    public Result executeByRuleCodeBatch(@RequestBody JSONObject ruleData) {\n        JSONObject commonFormData = ruleData.getJSONObject(\"commonFormData\");\n        JSONArray rules = ruleData.getJSONArray(\"rules\");\n        // 遍历 rules ，批量执行规则\n        JSONArray results = new JSONArray(rules.size());\n        for (int i = 0; i < rules.size(); i++) {\n            JSONObject rule = rules.getJSONObject(i);\n            String ruleCode = rule.getString(\"ruleCode\");\n            JSONObject formData = rule.getJSONObject(\"formData\");\n            // 如果没有传递 formData，就用common的\n            if (formData == null) {\n                formData = commonFormData;\n            }\n            // 执行填值规则\n            Object result = FillRuleUtil.executeRule(ruleCode, formData);\n            JSONObject obj = new JSONObject(rules.size());\n            obj.put(\"ruleCode\", ruleCode);\n            obj.put(\"result\", result);\n            results.add(obj);\n        }\n        return Result.ok(results);\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysFormFileController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.modules.system.entity.SysFormFile;\nimport org.jeecg.modules.system.service.ISysFormFileService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.util.Arrays;\n\n/**\n * @Description: 表单评论文件\n * @Author: jeecg-boot\n * @Date: 2022-07-21\n * @Version: V1.0\n */\n@Slf4j\n@Tag(name = \"表单评论文件\")\n@RestController\n@RequestMapping(\"/sys/formFile\")\npublic class SysFormFileController extends JeecgController<SysFormFile, ISysFormFileService> {\n    @Autowired\n    private ISysFormFileService sysFormFileService;\n\n    /**\n     * 分页列表查询\n     *\n     * @param sysFormFile\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @AutoLog(value = \"表单评论文件-分页列表查询\")\n    @Operation(summary = \"表单评论文件-分页列表查询\")\n    @GetMapping(value = \"/list\")\n    public Result<?> queryPageList(SysFormFile sysFormFile,\n                                   @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                   @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                   HttpServletRequest req) {\n        QueryWrapper<SysFormFile> queryWrapper = QueryGenerator.initQueryWrapper(sysFormFile, req.getParameterMap());\n        Page<SysFormFile> page = new Page<SysFormFile>(pageNo, pageSize);\n        IPage<SysFormFile> pageList = sysFormFileService.page(page, queryWrapper);\n        return Result.OK(pageList);\n    }\n\n    /**\n     * 添加\n     *\n     * @param sysFormFile\n     * @return\n     */\n    @AutoLog(value = \"表单评论文件-添加\")\n    @Operation(summary = \"表单评论文件-添加\")\n    @PostMapping(value = \"/add\")\n    public Result<?> add(@RequestBody SysFormFile sysFormFile) {\n        sysFormFileService.save(sysFormFile);\n        return Result.OK(\"添加成功！\");\n    }\n\n    /**\n     * 编辑\n     *\n     * @param sysFormFile\n     * @return\n     */\n    @AutoLog(value = \"表单评论文件-编辑\")\n    @Operation(summary = \"表单评论文件-编辑\")\n    @RequestMapping(value = \"/edit\", method = {RequestMethod.PUT, RequestMethod.POST})\n    public Result<?> edit(@RequestBody SysFormFile sysFormFile) {\n        sysFormFileService.updateById(sysFormFile);\n        return Result.OK(\"编辑成功!\");\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @AutoLog(value = \"表单评论文件-通过id删除\")\n    @Operation(summary = \"表单评论文件-通过id删除\")\n    @DeleteMapping(value = \"/delete\")\n    public Result<?> delete(@RequestParam(name = \"id\", required = true) String id) {\n        sysFormFileService.removeById(id);\n        return Result.OK(\"删除成功!\");\n    }\n\n    /**\n     * 批量删除\n     *\n     * @param ids\n     * @return\n     */\n    @AutoLog(value = \"表单评论文件-批量删除\")\n    @Operation(summary = \"表单评论文件-批量删除\")\n    @DeleteMapping(value = \"/deleteBatch\")\n    public Result<?> deleteBatch(@RequestParam(name = \"ids\", required = true) String ids) {\n        this.sysFormFileService.removeByIds(Arrays.asList(ids.split(\",\")));\n        return Result.OK(\"批量删除成功！\");\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    @AutoLog(value = \"表单评论文件-通过id查询\")\n    @Operation(summary = \"表单评论文件-通过id查询\")\n    @GetMapping(value = \"/queryById\")\n    public Result<?> queryById(@RequestParam(name = \"id\", required = true) String id) {\n        SysFormFile sysFormFile = sysFormFileService.getById(id);\n        return Result.OK(sysFormFile);\n    }\n\n    /**\n     * 导出excel\n     *\n     * @param request\n     * @param sysFormFile\n     */\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, SysFormFile sysFormFile) {\n        return super.exportXls(request, sysFormFile, SysFormFile.class, \"表单评论文件\");\n    }\n\n    /**\n     * 通过excel导入数据\n     *\n     * @param request\n     * @param response\n     * @return\n     */\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n        return super.importExcel(request, response, SysFormFile.class);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysGatewayRouteController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysGatewayRoute;\nimport org.jeecg.modules.system.service.ISysGatewayRouteService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.util.Arrays;\nimport java.util.List;\n\n/**\n * @Description: gateway路由管理\n * @Author: jeecg-boot\n * @Date: 2020-05-26\n * @Version: V1.0\n */\n@Tag(name = \"gateway路由管理\")\n@RestController\n@RequestMapping(\"/sys/gatewayRoute\")\n@Slf4j\npublic class SysGatewayRouteController extends JeecgController<SysGatewayRoute, ISysGatewayRouteService> {\n\n\t@Autowired\n\tprivate ISysGatewayRouteService sysGatewayRouteService;\n\n    @PostMapping(value = \"/updateAll\")\n    public Result<?> updateAll(@RequestBody JSONObject json) {\n        sysGatewayRouteService.updateAll(json);\n        return Result.ok(\"操作成功！\");\n    }\n\n\t@GetMapping(value = \"/list\")\n\tpublic Result<?> queryPageList(SysGatewayRoute sysGatewayRoute) {\n\t\tLambdaQueryWrapper<SysGatewayRoute> query = new LambdaQueryWrapper<>();\n\t\tList<SysGatewayRoute> ls = sysGatewayRouteService.list(query);\n\t\tJSONArray array = new JSONArray();\n\t\tfor(SysGatewayRoute rt: ls){\n\t\t\tJSONObject obj = (JSONObject) JSONObject.toJSON(rt);\n\t\t\tif(oConvertUtils.isNotEmpty(rt.getPredicates())){\n\t\t\t\tobj.put(\"predicates\", JSONArray.parseArray(rt.getPredicates()));\n\t\t\t}\n\t\t\tif(oConvertUtils.isNotEmpty(rt.getFilters())){\n\t\t\t\tobj.put(\"filters\", JSONArray.parseArray(rt.getFilters()));\n\t\t\t}\n\t\t\tarray.add(obj);\n\t\t}\n\t\treturn Result.ok(array);\n\t}\n\n\t@GetMapping(value = \"/clearRedis\")\n\tpublic Result<?> clearRedis() {\n\t\tsysGatewayRouteService.clearRedis();\n\t\treturn Result.ok(\"清除成功！\");\n\t}\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @RequiresPermissions(\"system:getway:delete\")\n    @RequestMapping(value = \"/delete\", method = RequestMethod.DELETE)\n    public Result<?> delete(@RequestParam(name = \"id\", required = true) String id) {\n        sysGatewayRouteService.deleteById(id);\n        return Result.ok(\"删除路由成功\");\n    }\n\n\t/**\n\t * 查询被删除的列表\n\t * @return\n\t */\n\t@RequestMapping(value = \"/deleteList\", method = RequestMethod.GET)\n\tpublic Result<List<SysGatewayRoute>> deleteList(HttpServletRequest request) {\n\t\tResult<List<SysGatewayRoute>> result = new Result<>();\n\t\tList<SysGatewayRoute> list = sysGatewayRouteService.getDeletelist();\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(list);\n\t\treturn result;\n\t}\n\n\t/**\n\t * 还原被逻辑删除的路由\n\t *\n\t * @param jsonObject\n\t * @return\n\t */\n\t@RequiresPermissions(\"system:gateway:putRecycleBin\")\n\t@RequestMapping(value = \"/putRecycleBin\", method = RequestMethod.PUT)\n\tpublic Result putRecycleBin(@RequestBody JSONObject jsonObject, HttpServletRequest request) {\n\t\ttry {\n\t\t\tString ids = jsonObject.getString(\"ids\");\n\t\t\tif (StringUtils.isNotBlank(ids)) {\n\t\t\t\tsysGatewayRouteService.revertLogicDeleted(Arrays.asList(ids.split(\",\")));\n\t\t\t\treturn Result.ok(\"操作成功!\");\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\treturn Result.error(\"操作失败!\");\n\t\t}\n\t\treturn Result.ok(\"还原成功\");\n\t}\n\t/**\n\t * 彻底删除路由\n\t *\n\t * @param ids 被删除的路由ID，多个id用半角逗号分割\n\t * @return\n\t */\n\t@RequiresPermissions(\"system:gateway:deleteRecycleBin\")\n\t@RequestMapping(value = \"/deleteRecycleBin\", method = RequestMethod.DELETE)\n\tpublic Result deleteRecycleBin(@RequestParam(\"ids\") String ids) {\n\t\ttry {\n\t\t\tif (StringUtils.isNotBlank(ids)) {\n\t\t\t\tsysGatewayRouteService.deleteLogicDeleted(Arrays.asList(ids.split(\",\")));\n\t\t\t}\n\t\t\treturn Result.ok(\"删除成功!\");\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\treturn Result.error(\"删除失败!\");\n\t\t}\n\t}\n\t/**\n\t * 复制路由\n\t *\n\t * @param id 路由id\n\t * @return\n\t */\n\t@RequiresPermissions(\"system:gateway:copyRoute\")\n\t@RequestMapping(value = \"/copyRoute\", method = RequestMethod.GET)\n\tpublic Result<SysGatewayRoute> copyRoute(@RequestParam(name = \"id\", required = true) String id, HttpServletRequest req) {\n\t\tResult<SysGatewayRoute> result = new Result<>();\n\t\tSysGatewayRoute sysGatewayRoute= sysGatewayRouteService.copyRoute(id);\n\t\tresult.setResult(sysGatewayRoute);\n\t\tresult.setSuccess(true);\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysLogController.java",
    "content": "package org.jeecg.modules.system.controller;\n\n\nimport java.util.Arrays;\nimport java.util.List;\n\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.http.HttpServletRequest;\n\nimport org.apache.shiro.SecurityUtils;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.jeecg.modules.system.entity.SysLog;\nimport org.jeecg.modules.system.entity.SysRole;\nimport org.jeecg.modules.system.service.ISysLogService;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.jeecgframework.poi.handler.inter.IExcelExportServerEnhanced;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.web.servlet.ModelAndView;\n\n/**\n * <p>\n * 系统日志表 前端控制器\n * </p>\n *\n * @Author zhangweijian\n * @since 2018-12-26\n */\n@RestController\n@RequestMapping(\"/sys/log\")\n@Slf4j\npublic class SysLogController extends JeecgController<SysLog, ISysLogService> {\n\t\n\t@Autowired\n\tprivate ISysLogService sysLogService;\n\n    /**\n     * for [issues/8699]AutoPoi在使用@ExcelEntity当设置show=true并且该项为null时报错\n     */\n    @Resource\n    private JeecgBaseConfig jeecgBaseConfig;\n\n    /**\n     * 全部清除\n     */\n\tprivate static final String ALL_ClEAR = \"allclear\";\n\n\t/**\n\t * @功能：查询日志记录\n\t * @param syslog\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t@RequestMapping(value = \"/list\", method = RequestMethod.GET)\n\t//@RequiresPermissions(\"system:log:list\")\n\tpublic Result<IPage<SysLog>> queryPageList(SysLog syslog,@RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,HttpServletRequest req) {\n\t\tResult<IPage<SysLog>> result = new Result<IPage<SysLog>>();\n\t\tQueryWrapper<SysLog> queryWrapper = QueryGenerator.initQueryWrapper(syslog, req.getParameterMap());\n\t\tPage<SysLog> page = new Page<SysLog>(pageNo, pageSize);\n\t\t//日志关键词\n\t\tString keyWord = req.getParameter(\"keyWord\");\n\t\tif(oConvertUtils.isNotEmpty(keyWord)) {\n\t\t\tqueryWrapper.like(\"log_content\",keyWord);\n\t\t}\n\t\t//TODO 过滤逻辑处理\n\t\t//TODO begin、end逻辑处理\n\t\t//TODO 一个强大的功能，前端传一个字段字符串，后台只返回这些字符串对应的字段\n\t\t//创建时间/创建人的赋值\n\t\tIPage<SysLog> pageList = sysLogService.page(page, queryWrapper);\n\t\tlog.debug(\"查询当前页：\"+pageList.getCurrent());\n\t\tlog.debug(\"查询当前页数量：\"+pageList.getSize());\n\t\tlog.debug(\"查询结果数量：\"+pageList.getRecords().size());\n\t\tlog.debug(\"数据总数：\"+pageList.getTotal());\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(pageList);\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * @功能：删除单个日志记录\n\t * @param id\n\t * @return\n\t */\n\t@RequestMapping(value = \"/delete\", method = RequestMethod.DELETE)\n\t//@RequiresPermissions(\"system:log:delete\")\n\tpublic Result<SysLog> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\tResult<SysLog> result = new Result<SysLog>();\n\t\tSysLog sysLog = sysLogService.getById(id);\n\t\tif(sysLog==null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}else {\n\t\t\tboolean ok = sysLogService.removeById(id);\n\t\t\tif(ok) {\n\t\t\t\tresult.success(\"删除成功!\");\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * @功能：批量，全部清空日志记录\n\t * @param ids\n\t * @return\n\t */\n\t@RequestMapping(value = \"/deleteBatch\", method = RequestMethod.DELETE)\n\t//@RequiresPermissions(\"system:log:deleteBatch\")\n\tpublic Result<SysRole> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tResult<SysRole> result = new Result<SysRole>();\n\t\tif(ids==null || \"\".equals(ids.trim())) {\n\t\t\tresult.error500(\"参数不识别！\");\n\t\t}else {\n\t\t\tif(ALL_ClEAR.equals(ids)) {\n\t\t\t\tthis.sysLogService.removeAll();\n\t\t\t\tresult.success(\"清除成功!\");\n\t\t\t}\n\t\t\tthis.sysLogService.removeByIds(Arrays.asList(ids.split(\",\")));\n\t\t\tresult.success(\"删除成功!\");\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 导出excel\n\t * for [QQYUN-13431]【jeecg】日志管理中添加大数据导出功能\n\t * @param request\n\t * @param syslog\n\t */\n\t@RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, SysLog syslog) {\n        // 复制参数，移除排序相关键（column/order 等）防止前端传入排序影响导出顺序\n        java.util.Map<String, String[]> rawMap = request.getParameterMap();\n        java.util.Map<String, String[]> paramMap = new java.util.HashMap<>(rawMap);\n        // 剔除自定义排序参数\n        paramMap.remove(\"column\");\n        paramMap.remove(\"order\");\n        // 组装查询条件（已剔除排序参数）\n        QueryWrapper<SysLog> queryWrapper = QueryGenerator.initQueryWrapper(syslog, paramMap);\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        // 过滤选中数据\n        String selections = request.getParameter(\"selections\");\n        if (oConvertUtils.isNotEmpty(selections)) {\n            List<String> selectionList = Arrays.asList(selections.split(\",\"));\n            queryWrapper.in(\"id\", selectionList);\n        }\n        // 定义IExcelExportServer\n        IExcelExportServerEnhanced<SysLog> excelExportServer = new IExcelExportServerEnhanced<>() {\n\n            @Override\n            public List<SysLog> selectListForExcelExport(Object queryParams, SysLog lastRecord, int pageSize) {\n                QueryWrapper<SysLog> originalWrapper = (QueryWrapper<SysLog>) queryParams;\n                // 克隆原始条件，避免多次迭代污染\n                QueryWrapper<SysLog> batchWrapper = null;\n                try {\n                    batchWrapper = (QueryWrapper<SysLog>) originalWrapper.clone();\n                } catch (Exception e) {\n                    batchWrapper = originalWrapper;\n                }\n\n                String lastId = null;\n                if (lastRecord != null) {\n                    lastId = lastRecord.getId();\n                    final String cursorLastId = lastId;\n                    // 仅基于雪花ID（全局唯一，数值递增）作为游标，提升索引利用与性能\n                    // 条件：id < 上一批最后一条的ID，实现“从大到小”倒序分页\n                    batchWrapper.lt(\"id\", cursorLastId);\n                }\n\n                // 排序：按 id DESC（雪花ID递增，倒序可获取最新数据）\n                batchWrapper.orderByDesc(\"id\");\n                Page<SysLog> cursorPage = new Page<>(1, pageSize);\n                List<SysLog> list = service.page(cursorPage, batchWrapper).getRecords();\n\n                log.info(\"系统日志游标导出(ID游标) - lastId: {} batchSize: {} 返回: {}\", lastId, pageSize, list.size());\n                if (!list.isEmpty()) {\n                    SysLog endRecord = list.get(list.size() - 1);\n                    log.debug(\"本批次最后一条记录游标ID -> id: {}\", endRecord.getId());\n                }\n                return list;\n            }\n\n            @Override\n            public int getPageSize() {\n                return 10000;\n            }\n        };\n\n        String title = \"系统日志\";\n        // AutoPoi 导出Excel\n        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n        //此处设置的filename无效 ,前端会重更新设置一下\n        mv.addObject(NormalExcelConstants.FILE_NAME, title);\n        mv.addObject(NormalExcelConstants.CLASS, SysLog.class);\n        ExportParams exportParams = new ExportParams(title + \"报表\", \"导出人:\" + sysUser.getRealname(), title, jeecgBaseConfig.getPath().getUpload());\n        mv.addObject(NormalExcelConstants.PARAMS, exportParams);\n        mv.addObject(NormalExcelConstants.EXPORT_SERVER, excelExportServer);\n        mv.addObject(NormalExcelConstants.QUERY_PARAMS, queryWrapper);\n        return mv;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysPermissionController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.SecurityUtils;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.apache.shiro.subject.Subject;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.Md5Util;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.jeecg.config.shiro.ShiroRealm;\nimport org.jeecg.modules.base.service.BaseCommonService;\nimport org.jeecg.modules.system.constant.DefIndexConst;\nimport org.jeecg.modules.system.entity.*;\nimport org.jeecg.modules.system.model.SysPermissionTree;\nimport org.jeecg.modules.system.model.TreeModel;\nimport org.jeecg.modules.system.service.*;\nimport org.jeecg.modules.system.util.PermissionDataUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.util.*;\nimport java.util.stream.Collectors;\n\n/**\n * <p>\n * 菜单权限表 前端控制器\n * </p>\n *\n * @Author scott\n * @since 2018-12-21\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/sys/permission\")\npublic class SysPermissionController {\n\n\t@Autowired\n\tprivate ISysPermissionService sysPermissionService;\n\n\t@Autowired\n\tprivate ISysRolePermissionService sysRolePermissionService;\n\n\t@Autowired\n\tprivate ISysPermissionDataRuleService sysPermissionDataRuleService;\n\n\t@Autowired\n\tprivate ISysDepartPermissionService sysDepartPermissionService;\n\n\t@Autowired\n\tprivate ISysUserService sysUserService;\n\n\t@Autowired\n\tprivate JeecgBaseConfig jeecgBaseConfig;\n\n\t@Autowired\n    private BaseCommonService baseCommonService;\n\n\t@Autowired\n\tprivate ISysRoleIndexService sysRoleIndexService;\n\t\n\t@Autowired\n\tprivate ShiroRealm shiroRealm;\n\n    /**\n     * 子菜单\n     */\n\tprivate static final String CHILDREN = \"children\";\n\n\t/**\n\t * 加载数据节点\n\t *\n\t * @return\n\t */\n\t//@RequiresPermissions(\"system:permission:list\")\n\t@RequestMapping(value = \"/list\", method = RequestMethod.GET)\n\tpublic Result<List<SysPermissionTree>> list(SysPermission sysPermission, HttpServletRequest req) {\n        long start = System.currentTimeMillis();\n\t\tResult<List<SysPermissionTree>> result = new Result<>();\n\t\ttry {\n\t\t\tLambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>();\n\t\t\tquery.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0);\n\t\t\tquery.orderByAsc(SysPermission::getSortNo);\n\t\t\t\n\t\t\t//支持通过菜单名字，模糊查询\n\t\t\tif(oConvertUtils.isNotEmpty(sysPermission.getName())){\n\t\t\t\tquery.like(SysPermission::getName, sysPermission.getName());\n\t\t\t}\n\t\t\tList<SysPermission> list = sysPermissionService.list(query);\n\t\t\tList<SysPermissionTree> treeList = new ArrayList<>();\n\n\t\t\t//如果有菜单名查询条件，则平铺数据 不做上下级\n\t\t\tif(oConvertUtils.isNotEmpty(sysPermission.getName())){\n\t\t\t\tif(list!=null && list.size()>0){\n\t\t\t\t\ttreeList = list.stream().map(e -> {\n\t\t\t\t\t\te.setLeaf(true);\n\t\t\t\t\t\treturn new SysPermissionTree(e);\n\t\t\t\t\t}).collect(Collectors.toList());\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tgetTreeList(treeList, list, null);\n\t\t\t}\n\t\t\tresult.setResult(treeList);\n\t\t\tresult.setSuccess(true);\n            log.debug(\"======获取全部菜单数据=====耗时:\" + (System.currentTimeMillis() - start) + \"毫秒\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/*update_begin author:wuxianquan date:20190908 for:先查询一级菜单，当用户点击展开菜单时加载子菜单 */\n\t/**\n\t * 系统菜单列表(一级菜单)\n\t *\n\t * @return\n\t */\n\t@RequestMapping(value = \"/getSystemMenuList\", method = RequestMethod.GET)\n\tpublic Result<List<SysPermissionTree>> getSystemMenuList() {\n        long start = System.currentTimeMillis();\n\t\tResult<List<SysPermissionTree>> result = new Result<>();\n\t\ttry {\n\t\t\tLambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>();\n\t\t\tquery.eq(SysPermission::getMenuType,CommonConstant.MENU_TYPE_0);\n\t\t\tquery.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0);\n\t\t\tquery.orderByAsc(SysPermission::getSortNo);\n\t\t\tList<SysPermission> list = sysPermissionService.list(query);\n\t\t\tList<SysPermissionTree> sysPermissionTreeList = new ArrayList<SysPermissionTree>();\n\t\t\tfor(SysPermission sysPermission : list){\n\t\t\t\tSysPermissionTree sysPermissionTree = new SysPermissionTree(sysPermission);\n\t\t\t\tsysPermissionTreeList.add(sysPermissionTree);\n\t\t\t}\n\t\t\tresult.setResult(sysPermissionTreeList);\n\t\t\tresult.setSuccess(true);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t}\n        log.info(\"======获取一级菜单数据=====耗时:\" + (System.currentTimeMillis() - start) + \"毫秒\");\n\t\treturn result;\n\t}\n\n\t/**\n\t * 查询子菜单\n\t * @param parentId\n\t * @return\n\t */\n\t@RequestMapping(value = \"/getSystemSubmenu\", method = RequestMethod.GET)\n\tpublic Result<List<SysPermissionTree>> getSystemSubmenu(@RequestParam(\"parentId\") String parentId){\n\t\tResult<List<SysPermissionTree>> result = new Result<>();\n\t\ttry{\n\t\t\tLambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>();\n\t\t\tquery.eq(SysPermission::getParentId,parentId);\n\t\t\tquery.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0);\n\t\t\tquery.orderByAsc(SysPermission::getSortNo);\n\t\t\tList<SysPermission> list = sysPermissionService.list(query);\n\t\t\tList<SysPermissionTree> sysPermissionTreeList = new ArrayList<SysPermissionTree>();\n\t\t\tfor(SysPermission sysPermission : list){\n\t\t\t\tSysPermissionTree sysPermissionTree = new SysPermissionTree(sysPermission);\n\t\t\t\tsysPermissionTreeList.add(sysPermissionTree);\n\t\t\t}\n\t\t\tresult.setResult(sysPermissionTreeList);\n\t\t\tresult.setSuccess(true);\n\t\t}catch (Exception e){\n\t\t\tlog.error(e.getMessage(), e);\n\t\t}\n\t\treturn result;\n\t}\n\t/*update_end author:wuxianquan date:20190908 for:先查询一级菜单，当用户点击展开菜单时加载子菜单 */\n\n\t/**\n\t * 查询子菜单\n\t *\n\t * @param parentIds 父ID（多个采用半角逗号分割）\n\t * @return 返回 key-value 的 Map\n\t */\n\t@GetMapping(\"/getSystemSubmenuBatch\")\n\tpublic Result getSystemSubmenuBatch(@RequestParam(\"parentIds\") String parentIds) {\n\t\ttry {\n\t\t\tLambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<>();\n\t\t\tList<String> parentIdList = Arrays.asList(parentIds.split(\",\"));\n\t\t\tquery.in(SysPermission::getParentId, parentIdList);\n\t\t\tquery.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0);\n\t\t\tquery.orderByAsc(SysPermission::getSortNo);\n\t\t\tList<SysPermission> list = sysPermissionService.list(query);\n\t\t\tMap<String, List<SysPermissionTree>> listMap = new HashMap(5);\n\t\t\tfor (SysPermission item : list) {\n\t\t\t\tString pid = item.getParentId();\n\t\t\t\tif (parentIdList.contains(pid)) {\n\t\t\t\t\tList<SysPermissionTree> mapList = listMap.get(pid);\n\t\t\t\t\tif (mapList == null) {\n\t\t\t\t\t\tmapList = new ArrayList<>();\n\t\t\t\t\t}\n\t\t\t\t\tmapList.add(new SysPermissionTree(item));\n\t\t\t\t\tlistMap.put(pid, mapList);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn Result.ok(listMap);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\treturn Result.error(\"批量查询子菜单失败：\" + e.getMessage());\n\t\t}\n\t}\n\n//\t/**\n//\t * 查询用户拥有的菜单权限和按钮权限（根据用户账号）\n//\t * \n//\t * @return\n//\t */\n//\t@RequestMapping(value = \"/queryByUser\", method = RequestMethod.GET)\n//\tpublic Result<JSONArray> queryByUser(HttpServletRequest req) {\n//\t\tResult<JSONArray> result = new Result<>();\n//\t\ttry {\n//\t\t\tString username = req.getParameter(\"username\");\n//\t\t\tList<SysPermission> metaList = sysPermissionService.queryByUser(username);\n//\t\t\tJSONArray jsonArray = new JSONArray();\n//\t\t\tthis.getPermissionJsonArray(jsonArray, metaList, null);\n//\t\t\tresult.setResult(jsonArray);\n//\t\t\tresult.success(\"查询成功\");\n//\t\t} catch (Exception e) {\n//\t\t\tresult.error500(\"查询失败:\" + e.getMessage());\n//\t\t\tlog.error(e.getMessage(), e);\n//\t\t}\n//\t\treturn result;\n//\t}\n\n\t/**\n\t * 查询用户拥有的菜单权限和按钮权限\n\t *\n\t * @return\n\t */\n\t@RequestMapping(value = \"/getUserPermissionByToken\", method = RequestMethod.GET)\n\t//@DynamicTable(value = DynamicTableConstant.SYS_ROLE_INDEX)\n\tpublic Result<?> getUserPermissionByToken(HttpServletRequest request) {\n\t\tResult<JSONObject> result = new Result<JSONObject>();\n\t\ttry {\n\t\t\t//直接获取当前用户不适用前端token\n\t\t\tLoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\t\tif (oConvertUtils.isEmpty(loginUser)) {\n\t\t\t\treturn Result.error(\"请登录系统！\");\n\t\t\t}\n\t\t\tList<SysPermission> metaList = sysPermissionService.queryByUser(loginUser.getId());\n\t\t\t//添加首页路由\n\n\t\t\t// 代码逻辑说明: 自定义首页地址 LOWCOD-1578\n\t\t\tString version = request.getHeader(CommonConstant.VERSION);\n\t\t\tSysRoleIndex defIndexCfg = sysUserService.getDynamicIndexByUserRole(loginUser.getUsername(), version);\n\t\t\tif (defIndexCfg == null) {\n\t\t\t\tdefIndexCfg = sysRoleIndexService.initDefaultIndex();\n\t\t\t}\n\n\t\t\t// 如果没有授权角色首页，则自动添加首页路由\n\t\t\tif (!PermissionDataUtil.hasIndexPage(metaList, defIndexCfg)) {\n\t\t\t\tLambdaQueryWrapper<SysPermission> indexQueryWrapper = new LambdaQueryWrapper<>();\n\t\t\t\tindexQueryWrapper.eq(SysPermission::getUrl, defIndexCfg.getUrl());\n\t\t\t\tSysPermission indexMenu = sysPermissionService.getOne(indexQueryWrapper);\n\t\t\t\tif (indexMenu == null) {\n\t\t\t\t\tindexMenu = new SysPermission();\n\t\t\t\t\tindexMenu.setUrl(defIndexCfg.getUrl());\n\t\t\t\t\tindexMenu.setComponent(defIndexCfg.getComponent());\n\t\t\t\t\tindexMenu.setRoute(defIndexCfg.getRoute());\n\t\t\t\t\tindexMenu.setName(DefIndexConst.DEF_INDEX_NAME);\n\t\t\t\t\tindexMenu.setMenuType(0);\n\t\t\t\t}\n\t\t\t\t// 如果没有授权一级菜单，则自身变为一级菜单\n\t\t\t\tif (indexMenu.getParentId() != null && !PermissionDataUtil.hasMenuById(metaList, indexMenu.getParentId())) {\n\t\t\t\t\tindexMenu.setMenuType(0);\n\t\t\t\t\tindexMenu.setParentId(null);\n\t\t\t\t}\n\t\t\t\tif (oConvertUtils.isEmpty(indexMenu.getIcon())) {\n\t\t\t\t\tindexMenu.setIcon(\"ant-design:home\");\n\t\t\t\t}\n\t\t\t\tmetaList.add(0, indexMenu);\n\t\t\t}\n\n/* TODO 注： 这段代码的主要作用是：把首页菜单的组件替换成角色菜单的组件，由于现在的逻辑如果角色菜单不存在则自动插入一条，所以这段代码暂时不需要\n\t\t\tList<SysPermission> menus = metaList.stream().filter(sysPermission -> {\n\t\t\t\tif (defIndexCfg.getUrl().equals(sysPermission.getUrl())) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn defIndexCfg.getUrl().equals(sysPermission.getUrl());\n\t\t\t}).collect(Collectors.toList());\n\t\t\t// 代码逻辑说明: 设置自定义首页地址和组件----------\n\t\t\tif (menus.size() == 1) {\n\t\t\t\tString component = defIndexCfg.getComponent();\n\t\t\t\tString routeUrl = defIndexCfg.getUrl();\n\t\t\t\tboolean route = defIndexCfg.isRoute();\n\t\t\t\tif (oConvertUtils.isNotEmpty(routeUrl)) {\n\t\t\t\t\tmenus.get(0).setComponent(component);\n\t\t\t\t\tmenus.get(0).setRoute(route);\n\t\t\t\t\tmenus.get(0).setUrl(routeUrl);\n\t\t\t\t} else {\n\t\t\t\t\tmenus.get(0).setComponent(component);\n\t\t\t\t}\n\t\t\t}\n*/\n\n\t\t\tJSONObject json = new JSONObject();\n\t\t\tJSONArray menujsonArray = new JSONArray();\n\t\t\tthis.getPermissionJsonArray(menujsonArray, metaList, null);\n\t\t\t//一级菜单下的子菜单全部是隐藏路由，则一级菜单不显示\n\t\t\tthis.handleFirstLevelMenuHidden(menujsonArray);\n\n\t\t\tJSONArray authjsonArray = new JSONArray();\n\t\t\tthis.getAuthJsonArray(authjsonArray, metaList);\n\t\t\t//查询所有的权限\n\t\t\tLambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>().select( SysPermission::getName, SysPermission::getPermsType, SysPermission::getPerms, SysPermission::getStatus);\n\t\t\tquery.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0);\n\t\t\tquery.eq(SysPermission::getMenuType, CommonConstant.MENU_TYPE_2);\n\t\t\t//query.eq(SysPermission::getStatus, \"1\");\n\t\t\tList<SysPermission> allAuthList = sysPermissionService.list(query);\n\t\t\tJSONArray allauthjsonArray = new JSONArray();\n\t\t\tthis.getAllAuthJsonArray(allauthjsonArray, allAuthList);\n\t\t\t//路由菜单\n\t\t\tjson.put(\"menu\", menujsonArray);\n\t\t\t//按钮权限（用户拥有的权限集合）\n\t\t\tjson.put(\"auth\", authjsonArray);\n\t\t\t// 按钮权限（用户拥有的权限集合）\n\t\t\tList<String> codeList = metaList.stream()\n\t\t\t\t\t.filter((permission) -> CommonConstant.MENU_TYPE_2.equals(permission.getMenuType()) && CommonConstant.STATUS_1.equals(permission.getStatus()))\n\t\t\t\t\t.collect(ArrayList::new, (list, permission) -> list.add(permission.getPerms()), ArrayList::addAll);\n\t\t\t// 所拥有的权限编码(vue3专用)\n\t\t\tjson.put(\"codeList\", codeList);\n\t\t\t//全部权限配置集合（按钮权限，访问权限）\n\t\t\tjson.put(\"allAuth\", allauthjsonArray);\n\t\t\t//数据源安全模式\n\t\t\tjson.put(\"sysSafeMode\", jeecgBaseConfig.getFirewall()!=null? jeecgBaseConfig.getFirewall().getDataSourceSafe(): false);\n\t\t\tresult.setResult(json);\n\t\t} catch (Exception e) {\n\t\t\tresult.error500(\"查询失败:\" + e.getMessage());  \n\t\t\tlog.error(e.getMessage(), e);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 【vue3专用】获取\n\t * 1、查询用户拥有的按钮/表单访问权限\n\t * 2、所有权限 (菜单权限配置)\n\t * 3、系统安全模式 (开启则online报表的数据源必填)\n\t */\n\t@RequestMapping(value = \"/getPermCode\", method = RequestMethod.GET)\n\tpublic Result<?> getPermCode() {\n\t\ttry {\n\t\t\t// 直接获取当前用户\n\t\t\tLoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\t\tif (oConvertUtils.isEmpty(loginUser)) {\n\t\t\t\treturn Result.error(\"请登录系统！\");\n\t\t\t}\n\t\t\t// 获取当前用户的权限集合\n\t\t\tList<SysPermission> metaList = sysPermissionService.queryByUser(loginUser.getId());\n            // 按钮权限（用户拥有的权限集合）\n            List<String> codeList = metaList.stream()\n                    .filter((permission) -> CommonConstant.MENU_TYPE_2.equals(permission.getMenuType()) && CommonConstant.STATUS_1.equals(permission.getStatus()))\n                    .collect(ArrayList::new, (list, permission) -> list.add(permission.getPerms()), ArrayList::addAll);\n            //\n\t\t\tJSONArray authArray = new JSONArray();\n\t\t\tthis.getAuthJsonArray(authArray, metaList);\n\t\t\t// 查询所有的权限\n\t\t\tLambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>().select( SysPermission::getName, SysPermission::getPermsType, SysPermission::getPerms, SysPermission::getStatus);\n\t\t\tquery.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0);\n\t\t\tquery.eq(SysPermission::getMenuType, CommonConstant.MENU_TYPE_2);\n\t\t\tList<SysPermission> allAuthList = sysPermissionService.list(query);\n\t\t\tJSONArray allAuthArray = new JSONArray();\n\t\t\tthis.getAllAuthJsonArray(allAuthArray, allAuthList);\n\t\t\tJSONObject result = new JSONObject();\n            // 所拥有的权限编码\n\t\t\tresult.put(\"codeList\", codeList);\n\t\t\t//按钮权限（用户拥有的权限集合）\n\t\t\tresult.put(\"auth\", authArray);\n\t\t\t//全部权限配置集合（按钮权限，访问权限）\n\t\t\tresult.put(\"allAuth\", allAuthArray);\n            //数据源安全模式\n\t\t\tresult.put(\"sysSafeMode\", jeecgBaseConfig.getFirewall()!=null? jeecgBaseConfig.getFirewall().getDataSourceSafe(): null);\n            return Result.OK(result);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n            return Result.error(\"查询失败:\" + e.getMessage());\n\t\t}\n\t}\n\n\t/**\n\t  * 添加菜单\n\t * @param permission\n\t * @return\n\t */\n    @RequiresPermissions(\"system:permission:add\")\n\t@RequestMapping(value = \"/add\", method = RequestMethod.POST)\n\tpublic Result<SysPermission> add(@RequestBody SysPermission permission) {\n\t\tResult<SysPermission> result = new Result<SysPermission>();\n\t\ttry {\n\t\t\tpermission = PermissionDataUtil.intelligentProcessData(permission);\n\t\t\tsysPermissionService.addPermission(permission);\n\t\t\tresult.success(\"添加成功！\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\tresult.error500(\"操作失败\");\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t  * 编辑菜单\n\t * @param permission\n\t * @return\n\t */\n    @RequiresPermissions(\"system:permission:edit\")\n\t@RequestMapping(value = \"/edit\", method = { RequestMethod.PUT, RequestMethod.POST })\n\tpublic Result<SysPermission> edit(@RequestBody SysPermission permission) {\n\t\tResult<SysPermission> result = new Result<>();\n\t\ttry {\n\t\t\tpermission = PermissionDataUtil.intelligentProcessData(permission);\n\t\t\tsysPermissionService.editPermission(permission);\n\t\t\tresult.success(\"修改成功！\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\tresult.error500(\"操作失败\");\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 检测菜单路径是否存在\n\t * @param id\n\t * @param url\n\t * @return\n\t */\n\t@RequestMapping(value = \"/checkPermDuplication\", method = RequestMethod.GET)\n\tpublic Result<String> checkPermDuplication(@RequestParam(name = \"id\", required = false) String id,@RequestParam(name = \"url\") String url,@RequestParam(name = \"alwaysShow\") Boolean alwaysShow) {\n\t\tResult<String> result = new Result<>();\n\t\ttry {\n\t\t\tboolean check=sysPermissionService.checkPermDuplication(id,url,alwaysShow);\n\t\t\tif(check){\n\t\t\t\treturn Result.ok(\"该值可用！\");\n\t\t\t}\n\t\t\treturn Result.error(\"访问路径不允许重复，请重定义！\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\tresult.error500(\"操作失败\");\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t  * 删除菜单\n\t * @param id\n\t * @return\n\t */\n    @RequiresPermissions(\"system:permission:delete\")\n\t@RequestMapping(value = \"/delete\", method = RequestMethod.DELETE)\n\tpublic Result<SysPermission> delete(@RequestParam(name = \"id\", required = true) String id) {\n\t\tResult<SysPermission> result = new Result<>();\n\t\ttry {\n\t\t\tsysPermissionService.deletePermission(id);\n\t\t\tresult.success(\"删除成功!\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\tresult.error500(e.getMessage());\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t  * 批量删除菜单\n\t * @param ids\n\t * @return\n\t */\n    @RequiresPermissions(\"system:permission:deleteBatch\")\n\t@RequestMapping(value = \"/deleteBatch\", method = RequestMethod.DELETE)\n\tpublic Result<SysPermission> deleteBatch(@RequestParam(name = \"ids\", required = true) String ids) {\n\t\tResult<SysPermission> result = new Result<>();\n\t\ttry {\n            String[] arr = ids.split(\",\");\n\t\t\tfor (String id : arr) {\n\t\t\t\tif (oConvertUtils.isNotEmpty(id)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tsysPermissionService.deletePermission(id);\n\t\t\t\t\t} catch (JeecgBootException e) {\n\t\t\t\t\t\tif(e.getMessage()!=null && e.getMessage().contains(\"未找到菜单信息\")){\n\t\t\t\t\t\t\tlog.warn(e.getMessage());\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tresult.success(\"删除成功!\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\tresult.error500(\"删除失败!\");\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 获取全部的权限树\n\t *\n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryTreeList\", method = RequestMethod.GET)\n\tpublic Result<Map<String, Object>> queryTreeList() {\n\t\tResult<Map<String, Object>> result = new Result<>();\n\t\t// 全部权限ids\n\t\tList<String> ids = new ArrayList<>();\n\t\ttry {\n\t\t\tLambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>();\n\t\t\tquery.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0);\n\t\t\tquery.orderByAsc(SysPermission::getSortNo);\n\t\t\tList<SysPermission> list = sysPermissionService.list(query);\n\t\t\tfor (SysPermission sysPer : list) {\n\t\t\t\tids.add(sysPer.getId());\n\t\t\t}\n\t\t\tList<TreeModel> treeList = new ArrayList<>();\n\t\t\tgetTreeModelList(treeList, list, null);\n\n\t\t\tMap<String, Object> resMap = new HashMap<String, Object>(5);\n            // 全部树节点数据\n\t\t\tresMap.put(\"treeList\", treeList);\n            // 全部树ids\n\t\t\tresMap.put(\"ids\", ids);\n\t\t\tresult.setResult(resMap);\n\t\t\tresult.setSuccess(true);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 异步加载数据节点 [接口是废的,没有用到]\n\t *\n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryListAsync\", method = RequestMethod.GET)\n\tpublic Result<List<TreeModel>> queryAsync(@RequestParam(name = \"pid\", required = false) String parentId) {\n\t\tResult<List<TreeModel>> result = new Result<>();\n\t\ttry {\n\t\t\tList<TreeModel> list = sysPermissionService.queryListByParentId(parentId);\n\t\t\tif (list == null || list.size() <= 0) {\n\t\t\t\tresult.error500(\"未找到角色信息\");\n\t\t\t} else {\n\t\t\t\tresult.setResult(list);\n\t\t\t\tresult.setSuccess(true);\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * 查询角色授权\n\t *\n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryRolePermission\", method = RequestMethod.GET)\n\tpublic Result<List<String>> queryRolePermission(@RequestParam(name = \"roleId\", required = true) String roleId) {\n\t\tResult<List<String>> result = new Result<>();\n\t\ttry {\n\t\t\tList<SysRolePermission> list = sysRolePermissionService.list(new QueryWrapper<SysRolePermission>().lambda().eq(SysRolePermission::getRoleId, roleId));\n\t\t\tresult.setResult(list.stream().map(sysRolePermission -> String.valueOf(sysRolePermission.getPermissionId())).collect(Collectors.toList()));\n\t\t\tresult.setSuccess(true);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 保存角色授权\n\t *\n\t * @return\n\t */\n\t@RequestMapping(value = \"/saveRolePermission\", method = RequestMethod.POST)\n    @RequiresPermissions(\"system:permission:saveRole\")\n\tpublic Result<String> saveRolePermission(@RequestBody JSONObject json) {\n\t\tlong start = System.currentTimeMillis();\n\t\tResult<String> result = new Result<>();\n\t\ttry {\n\t\t\tString roleId = json.getString(\"roleId\");\n\t\t\tString permissionIds = json.getString(\"permissionIds\");\n\t\t\tString lastPermissionIds = json.getString(\"lastpermissionIds\");\n\t\t\tthis.sysRolePermissionService.saveRolePermission(roleId, permissionIds, lastPermissionIds);\n\t\t\t// 代码逻辑说明: [VUEN-234]用户管理角色授权添加敏感日志------------\n            LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\t\tbaseCommonService.addLog(\"修改角色ID: \"+roleId+\" 的权限配置，操作人： \" +loginUser.getUsername() ,CommonConstant.LOG_TYPE_2, 2);\n\t\t\tresult.success(\"保存成功！\");\n\t\t\tlog.info(\"======角色授权成功=====耗时:\" + (System.currentTimeMillis() - start) + \"毫秒\");\n\n\t\t\t// 清除当前用户的授权缓存信息\n\t\t\tSubject currentUser = SecurityUtils.getSubject();\n\t\t\tif (currentUser.isAuthenticated()) {\n\t\t\t\tshiroRealm.clearCache(currentUser.getPrincipals());\n\t\t\t}\n\n\t\t} catch (Exception e) {\n\t\t\tresult.error500(\"授权失败！\");\n\t\t\tlog.error(e.getMessage(), e);\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate void getTreeList(List<SysPermissionTree> treeList, List<SysPermission> metaList, SysPermissionTree temp) {\n\t\tfor (SysPermission permission : metaList) {\n\t\t\tString tempPid = permission.getParentId();\n\t\t\tSysPermissionTree tree = new SysPermissionTree(permission);\n\t\t\tif (temp == null && oConvertUtils.isEmpty(tempPid)) {\n\t\t\t\ttreeList.add(tree);\n\t\t\t\tif (!tree.getIsLeaf()) {\n\t\t\t\t\tgetTreeList(treeList, metaList, tree);\n\t\t\t\t}\n\t\t\t} else if (temp != null && tempPid != null && tempPid.equals(temp.getId())) {\n\t\t\t\ttemp.getChildren().add(tree);\n\t\t\t\tif (!tree.getIsLeaf()) {\n\t\t\t\t\tgetTreeList(treeList, metaList, tree);\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tprivate void getTreeModelList(List<TreeModel> treeList, List<SysPermission> metaList, TreeModel temp) {\n\t\tfor (SysPermission permission : metaList) {\n\t\t\tString tempPid = permission.getParentId();\n\t\t\tTreeModel tree = new TreeModel(permission);\n\t\t\tif (temp == null && oConvertUtils.isEmpty(tempPid)) {\n\t\t\t\ttreeList.add(tree);\n\t\t\t\tif (!tree.getIsLeaf()) {\n\t\t\t\t\tgetTreeModelList(treeList, metaList, tree);\n\t\t\t\t}\n\t\t\t} else if (temp != null && tempPid != null && tempPid.equals(temp.getKey())) {\n\t\t\t\ttemp.getChildren().add(tree);\n\t\t\t\tif (!tree.getIsLeaf()) {\n\t\t\t\t\tgetTreeModelList(treeList, metaList, tree);\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\t/**\n\t * 一级菜单的子菜单全部是隐藏路由，则一级菜单不显示\n\t * @param jsonArray\n\t */\n\tprivate void handleFirstLevelMenuHidden(JSONArray jsonArray) {\n\t\tjsonArray = jsonArray.stream().map(obj -> {\n\t\t\tJSONObject returnObj = new JSONObject();\n\t\t\tJSONObject jsonObj = (JSONObject)obj;\n\t\t\tif(jsonObj.containsKey(CHILDREN)){\n\t\t\t\tJSONArray childrens = jsonObj.getJSONArray(CHILDREN);\n                childrens = childrens.stream().filter(arrObj -> !\"true\".equals(((JSONObject) arrObj).getString(\"hidden\"))).collect(Collectors.toCollection(JSONArray::new));\n                if(childrens==null || childrens.size()==0){\n                    jsonObj.put(\"hidden\",true);\n\n                    //vue3版本兼容代码\n                    JSONObject meta = new JSONObject();\n                    meta.put(\"hideMenu\",true);\n                    jsonObj.put(\"meta\", meta);\n                }\n\t\t\t}\n\t\t\treturn returnObj;\n\t\t}).collect(Collectors.toCollection(JSONArray::new));\n\t}\n\n\n\t/**\n\t  *  获取权限JSON数组\n\t * @param jsonArray\n\t * @param allList\n\t */\n\tprivate void getAllAuthJsonArray(JSONArray jsonArray,List<SysPermission> allList) {\n\t\tJSONObject json = null;\n\t\tfor (SysPermission permission : allList) {\n\t\t\tjson = new JSONObject();\n\t\t\tjson.put(\"action\", permission.getPerms());\n\t\t\tjson.put(\"status\", permission.getStatus());\n\t\t\t//1显示2禁用\n\t\t\tjson.put(\"type\", permission.getPermsType());\n\t\t\tjson.put(\"describe\", permission.getName());\n\t\t\tjsonArray.add(json);\n\t\t}\n\t}\n\n\t/**\n\t  *  获取权限JSON数组\n\t * @param jsonArray\n\t * @param metaList\n\t */\n\tprivate void getAuthJsonArray(JSONArray jsonArray,List<SysPermission> metaList) {\n\t\tfor (SysPermission permission : metaList) {\n\t\t\tif(permission.getMenuType()==null) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tJSONObject json = null;\n\t\t\tif(permission.getMenuType().equals(CommonConstant.MENU_TYPE_2) &&CommonConstant.STATUS_1.equals(permission.getStatus())) {\n\t\t\t\tjson = new JSONObject();\n\t\t\t\tjson.put(\"action\", permission.getPerms());\n\t\t\t\tjson.put(\"type\", permission.getPermsType());\n\t\t\t\tjson.put(\"describe\", permission.getName());\n\t\t\t\tjsonArray.add(json);\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t  *  获取菜单JSON数组\n\t * @param jsonArray\n\t * @param metaList\n\t * @param parentJson\n\t */\n\tprivate void getPermissionJsonArray(JSONArray jsonArray, List<SysPermission> metaList, JSONObject parentJson) {\n\t\tfor (SysPermission permission : metaList) {\n\t\t\tif (permission.getMenuType() == null) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tString tempPid = permission.getParentId();\n\t\t\tJSONObject json = getPermissionJsonObject(permission);\n\t\t\tif(json==null) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (parentJson == null && oConvertUtils.isEmpty(tempPid)) {\n\t\t\t\tjsonArray.add(json);\n\t\t\t\tif (!permission.isLeaf()) {\n\t\t\t\t\tgetPermissionJsonArray(jsonArray, metaList, json);\n\t\t\t\t}\n\t\t\t} else if (parentJson != null && oConvertUtils.isNotEmpty(tempPid) && tempPid.equals(parentJson.getString(\"id\"))) {\n\t\t\t\t// 类型( 0：一级菜单 1：子菜单 2：按钮 )\n\t\t\t\tif (permission.getMenuType().equals(CommonConstant.MENU_TYPE_2)) {\n\t\t\t\t\tJSONObject metaJson = parentJson.getJSONObject(\"meta\");\n\t\t\t\t\tif (metaJson.containsKey(\"permissionList\")) {\n\t\t\t\t\t\tmetaJson.getJSONArray(\"permissionList\").add(json);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tJSONArray permissionList = new JSONArray();\n\t\t\t\t\t\tpermissionList.add(json);\n\t\t\t\t\t\tmetaJson.put(\"permissionList\", permissionList);\n\t\t\t\t\t}\n\t\t\t\t\t// 类型( 0：一级菜单 1：子菜单 2：按钮 )\n\t\t\t\t} else if (permission.getMenuType().equals(CommonConstant.MENU_TYPE_1) || permission.getMenuType().equals(CommonConstant.MENU_TYPE_0)) {\n\t\t\t\t\tif (parentJson.containsKey(\"children\")) {\n\t\t\t\t\t\tparentJson.getJSONArray(\"children\").add(json);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tJSONArray children = new JSONArray();\n\t\t\t\t\t\tchildren.add(json);\n\t\t\t\t\t\tparentJson.put(\"children\", children);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!permission.isLeaf()) {\n\t\t\t\t\t\tgetPermissionJsonArray(jsonArray, metaList, json);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\t/**\n\t * 根据菜单配置生成路由json\n\t * @param permission\n\t * @return\n\t */\n\t\tprivate JSONObject getPermissionJsonObject(SysPermission permission) {\n\t\tJSONObject json = new JSONObject();\n\t\t// 类型(0：一级菜单 1：子菜单 2：按钮)\n\t\tif (permission.getMenuType().equals(CommonConstant.MENU_TYPE_2)) {\n\t\t\t//json.put(\"action\", permission.getPerms());\n\t\t\t//json.put(\"type\", permission.getPermsType());\n\t\t\t//json.put(\"describe\", permission.getName());\n\t\t\treturn null;\n\t\t} else if (permission.getMenuType().equals(CommonConstant.MENU_TYPE_0) || permission.getMenuType().equals(CommonConstant.MENU_TYPE_1)) {\n\t\t\tjson.put(\"id\", permission.getId());\n\t\t\tif (permission.isRoute()) {\n                //表示生成路由\n\t\t\t\tjson.put(\"route\", \"1\");\n\t\t\t} else {\n                //表示不生成路由\n\t\t\t\tjson.put(\"route\", \"0\");\n\t\t\t}\n\n\t\t\tif (isWwwHttpUrl(permission.getUrl())) {\n\t\t\t\tjson.put(\"path\", Md5Util.md5Encode(permission.getUrl(), \"utf-8\"));\n\t\t\t} else {\n\t\t\t\tjson.put(\"path\", permission.getUrl());\n\t\t\t}\n\n\t\t\t// 重要规则：路由name (通过URL生成路由name,路由name供前端开发，页面跳转使用)\n\t\t\tif (oConvertUtils.isNotEmpty(permission.getComponentName())) {\n\t\t\t\tjson.put(\"name\", permission.getComponentName());\n\t\t\t} else {\n\t\t\t\tjson.put(\"name\", urlToRouteName(permission.getUrl()));\n\t\t\t}\n\n\t\t\tJSONObject meta = new JSONObject();\n\t\t\t// 是否隐藏路由，默认都是显示的\n\t\t\tif (permission.isHidden()) {\n\t\t\t\tjson.put(\"hidden\", true);\n                //vue3版本兼容代码\n                meta.put(\"hideMenu\",true);\n\t\t\t}\n\t\t\t// 聚合路由\n\t\t\tif (permission.isAlwaysShow()) {\n\t\t\t\tjson.put(\"alwaysShow\", true);\n\t\t\t}\n\t\t\tjson.put(\"component\", permission.getComponent());\n\t\t\t// 由用户设置是否缓存页面 用布尔值\n\t\t\tif (permission.isKeepAlive()) {\n\t\t\t\tmeta.put(\"keepAlive\", true);\n\t\t\t} else {\n\t\t\t\tmeta.put(\"keepAlive\", false);\n\t\t\t}\n\n\t\t\t/*update_begin author:wuxianquan date:20190908 for:往菜单信息里添加外链菜单打开方式 */\n\t\t\t//外链菜单打开方式\n\t\t\tif (permission.isInternalOrExternal()) {\n\t\t\t\tmeta.put(\"internalOrExternal\", true);\n\t\t\t} else {\n\t\t\t\tmeta.put(\"internalOrExternal\", false);\n\t\t\t}\n\t\t\t/* update_end author:wuxianquan date:20190908 for: 往菜单信息里添加外链菜单打开方式*/\n\n\t\t\tmeta.put(\"title\", permission.getName());\n\n\t\t\t// 代码逻辑说明: 路由缓存问题，关闭了tab页时再打开就不刷新 #842\n\t\t\tString component = permission.getComponent();\n\t\t\tif(oConvertUtils.isNotEmpty(permission.getComponentName()) || oConvertUtils.isNotEmpty(component)){\n\t\t\t\tmeta.put(\"componentName\", oConvertUtils.getString(permission.getComponentName(),component.substring(component.lastIndexOf(\"/\")+1)));\n\t\t\t}\n\n\t\t\tif (oConvertUtils.isEmpty(permission.getParentId())) {\n\t\t\t\t// 一级菜单跳转地址\n\t\t\t\tjson.put(\"redirect\", permission.getRedirect());\n\t\t\t\tif (oConvertUtils.isNotEmpty(permission.getIcon())) {\n\t\t\t\t\tmeta.put(\"icon\", permission.getIcon());\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (oConvertUtils.isNotEmpty(permission.getIcon())) {\n\t\t\t\t\tmeta.put(\"icon\", permission.getIcon());\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (isWwwHttpUrl(permission.getUrl())) {\n\t\t\t\tmeta.put(\"url\", permission.getUrl());\n\t\t\t}\n\t\t\t// 代码逻辑说明: 新增适配vue3项目的隐藏tab功能\n\t\t\tif (permission.isHideTab()) {\n\t\t\t\tmeta.put(\"hideTab\", true);\n\t\t\t}\n\t\t\tjson.put(\"meta\", meta);\n\t\t}\n\n\t\treturn json;\n\t}\n\n\t/**\n\t * 判断是否外网URL 例如： http://localhost:8080/jeecg-boot/swagger-ui.html#/ 支持特殊格式： {{\n\t * window._CONFIG['domianURL'] }}/druid/ {{ JS代码片段 }}，前台解析会自动执行JS代码片段\n\t *\n\t * @return\n\t */\n\tprivate boolean isWwwHttpUrl(String url) {\n        boolean flag = url != null && (url.startsWith(CommonConstant.HTTP_PROTOCOL) || url.startsWith(CommonConstant.HTTPS_PROTOCOL) || url.startsWith(SymbolConstant.DOUBLE_LEFT_CURLY_BRACKET));\n        if (flag) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * 通过URL生成路由name（去掉URL前缀斜杠，替换内容中的斜杠‘/’为-） 举例： URL = /isystem/role RouteName =\n\t * isystem-role\n\t *\n\t * @return\n\t */\n\tprivate String urlToRouteName(String url) {\n\t\tif (oConvertUtils.isNotEmpty(url)) {\n\t\t\tif (url.startsWith(SymbolConstant.SINGLE_SLASH)) {\n\t\t\t\turl = url.substring(1);\n\t\t\t}\n\t\t\turl = url.replace(\"/\", \"-\");\n\n\t\t\t// 特殊标记\n\t\t\turl = url.replace(\":\", \"@\");\n\t\t\treturn url;\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * 根据菜单id来获取其对应的权限数据\n\t *\n\t * @param sysPermissionDataRule\n\t * @return\n\t */\n\t@RequestMapping(value = \"/getPermRuleListByPermId\", method = RequestMethod.GET)\n\tpublic Result<List<SysPermissionDataRule>> getPermRuleListByPermId(SysPermissionDataRule sysPermissionDataRule) {\n\t\tList<SysPermissionDataRule> permRuleList = sysPermissionDataRuleService.getPermRuleListByPermId(sysPermissionDataRule.getPermissionId());\n\t\tResult<List<SysPermissionDataRule>> result = new Result<>();\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(permRuleList);\n\t\treturn result;\n\t}\n\n\t/**\n\t * 添加菜单权限数据\n\t *\n\t * @param sysPermissionDataRule\n\t * @return\n\t */\n    @RequiresPermissions(\"system:permission:addRule\")\n\t@RequestMapping(value = \"/addPermissionRule\", method = RequestMethod.POST)\n\tpublic Result<SysPermissionDataRule> addPermissionRule(@RequestBody SysPermissionDataRule sysPermissionDataRule) {\n\t\tResult<SysPermissionDataRule> result = new Result<SysPermissionDataRule>();\n\t\ttry {\n\t\t\tsysPermissionDataRule.setCreateTime(new Date());\n\t\t\tsysPermissionDataRuleService.savePermissionDataRule(sysPermissionDataRule);\n\t\t\tresult.success(\"添加成功！\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\tresult.error500(\"操作失败\");\n\t\t}\n\t\treturn result;\n\t}\n\n    @RequiresPermissions(\"system:permission:editRule\")\n\t@RequestMapping(value = \"/editPermissionRule\", method = { RequestMethod.PUT, RequestMethod.POST })\n\tpublic Result<SysPermissionDataRule> editPermissionRule(@RequestBody SysPermissionDataRule sysPermissionDataRule) {\n\t\tResult<SysPermissionDataRule> result = new Result<SysPermissionDataRule>();\n\t\ttry {\n\t\t\tsysPermissionDataRuleService.saveOrUpdate(sysPermissionDataRule);\n\t\t\tresult.success(\"更新成功！\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\tresult.error500(\"操作失败\");\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 删除菜单权限数据\n\t *\n\t * @param id\n\t * @return\n\t */\n    @RequiresPermissions(\"system:permission:deleteRule\")\n\t@RequestMapping(value = \"/deletePermissionRule\", method = RequestMethod.DELETE)\n\tpublic Result<SysPermissionDataRule> deletePermissionRule(@RequestParam(name = \"id\", required = true) String id) {\n\t\tResult<SysPermissionDataRule> result = new Result<SysPermissionDataRule>();\n\t\ttry {\n\t\t\tsysPermissionDataRuleService.deletePermissionDataRule(id);\n\t\t\tresult.success(\"删除成功！\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\tresult.error500(\"操作失败\");\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 查询菜单权限数据\n\t *\n\t * @param sysPermissionDataRule\n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryPermissionRule\", method = RequestMethod.GET)\n\tpublic Result<List<SysPermissionDataRule>> queryPermissionRule(SysPermissionDataRule sysPermissionDataRule) {\n\t\tResult<List<SysPermissionDataRule>> result = new Result<>();\n\t\ttry {\n\t\t\tList<SysPermissionDataRule> permRuleList = sysPermissionDataRuleService.queryPermissionRule(sysPermissionDataRule);\n\t\t\tresult.setResult(permRuleList);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\tresult.error500(\"操作失败\");\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 部门权限表\n\t * @param departId\n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryDepartPermission\", method = RequestMethod.GET)\n\tpublic Result<List<String>> queryDepartPermission(@RequestParam(name = \"departId\", required = true) String departId) {\n\t\tResult<List<String>> result = new Result<>();\n\t\ttry {\n\t\t\tList<SysDepartPermission> list = sysDepartPermissionService.list(new QueryWrapper<SysDepartPermission>().lambda().eq(SysDepartPermission::getDepartId, departId));\n\t\t\tresult.setResult(list.stream().map(sysDepartPermission -> String.valueOf(sysDepartPermission.getPermissionId())).collect(Collectors.toList()));\n\t\t\tresult.setSuccess(true);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 保存部门授权\n\t *\n\t * @return\n\t */\n\t@RequestMapping(value = \"/saveDepartPermission\", method = RequestMethod.POST)\n    @RequiresPermissions(\"system:permission:saveDepart\")\n\tpublic Result<String> saveDepartPermission(@RequestBody JSONObject json) {\n\t\tlong start = System.currentTimeMillis();\n\t\tResult<String> result = new Result<>();\n\t\ttry {\n\t\t\tString departId = json.getString(\"departId\");\n\t\t\tString permissionIds = json.getString(\"permissionIds\");\n\t\t\tString lastPermissionIds = json.getString(\"lastpermissionIds\");\n\t\t\tthis.sysDepartPermissionService.saveDepartPermission(departId, permissionIds, lastPermissionIds);\n\t\t\tresult.success(\"保存成功！\");\n\t\t\tlog.info(\"======部门授权成功=====耗时:\" + (System.currentTimeMillis() - start) + \"毫秒\");\n\t\t} catch (Exception e) {\n\t\t\tresult.error500(\"授权失败！\");\n\t\t\tlog.error(e.getMessage(), e);\n\t\t}\n\t\treturn result;\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysPositionController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport cn.hutool.core.util.RandomUtil;\nimport com.alibaba.fastjson.JSON;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.ImportExcelUtil;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.modules.system.entity.SysPosition;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.service.ISysPositionService;\nimport org.jeecg.modules.system.service.ISysUserPositionService;\nimport org.jeecg.modules.system.service.ISysUserService;\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.entity.enmus.ExcelType;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLDecoder;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\n/**\n * @Description: 职务表\n * @Author: jeecg-boot\n * @Date: 2019-09-19\n * @Version: V1.0\n */\n@Slf4j\n@Tag(name = \"职务表\")\n@RestController\n@RequestMapping(\"/sys/position\")\npublic class SysPositionController {\n\n    @Autowired\n    private ISysPositionService sysPositionService;\n\n    @Autowired\n    private ISysUserPositionService userPositionService;\n\n    @Autowired\n    private ISysUserService userService;\n\n    /**\n     * 分页列表查询\n     *\n     * @param sysPosition\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @AutoLog(value = \"职务表-分页列表查询\")\n    @Operation(summary = \"职务表-分页列表查询\")\n    @GetMapping(value = \"/list\")\n    public Result<IPage<SysPosition>> queryPageList(SysPosition sysPosition,\n                                                    @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                                    @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                                    HttpServletRequest req) {\n        Result<IPage<SysPosition>> result = new Result<IPage<SysPosition>>();\n        //------------------------------------------------------------------------------------------------\n        //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n        if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n            sysPosition.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(),0));\n        }\n        //------------------------------------------------------------------------------------------------\n        QueryWrapper<SysPosition> queryWrapper = QueryGenerator.initQueryWrapper(sysPosition, req.getParameterMap());\n        queryWrapper.orderByAsc(\"post_level\");\n        queryWrapper.orderByDesc(\"create_time\");\n        Page<SysPosition> page = new Page<SysPosition>(pageNo, pageSize);\n        IPage<SysPosition> pageList = sysPositionService.page(page, queryWrapper);\n        result.setSuccess(true);\n        result.setResult(pageList);\n        return result;\n    }\n\n    /**\n     * 添加\n     *\n     * @param sysPosition\n     * @return\n     */\n    @AutoLog(value = \"职务表-添加\")\n    @Operation(summary = \"职务表-添加\")\n    @PostMapping(value = \"/add\")\n    public Result<SysPosition> add(@RequestBody SysPosition sysPosition) {\n        Result<SysPosition> result = new Result<SysPosition>();\n        try {\n            //编号是空的，不需要判断多租户隔离了\n            if(oConvertUtils.isEmpty(sysPosition.getCode())){\n                //生成职位编码10位\n                sysPosition.setCode(RandomUtil.randomString(10));\n            }\n            sysPositionService.save(sysPosition);\n            result.success(\"添加成功！\");\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            result.error500(\"操作失败\");\n        }\n        return result;\n    }\n\n    /**\n     * 编辑\n     *\n     * @param sysPosition\n     * @return\n     */\n    @AutoLog(value = \"职务表-编辑\")\n    @Operation(summary = \"职务表-编辑\")\n    @RequestMapping(value = \"/edit\", method ={RequestMethod.PUT, RequestMethod.POST})\n    public Result<SysPosition> edit(@RequestBody SysPosition sysPosition) {\n        Result<SysPosition> result = new Result<SysPosition>();\n        SysPosition sysPositionEntity = sysPositionService.getById(sysPosition.getId());\n        if (sysPositionEntity == null) {\n            result.error500(\"未找到对应实体\");\n        } else {\n            boolean ok = sysPositionService.updateById(sysPosition);\n            //TODO 返回false说明什么？\n            if (ok) {\n                result.success(\"修改成功!\");\n            }\n        }\n\n        return result;\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @AutoLog(value = \"职务表-通过id删除\")\n    @Operation(summary = \"职务表-通过id删除\")\n    @DeleteMapping(value = \"/delete\")\n    public Result<?> delete(@RequestParam(name = \"id\", required = true) String id) {\n        try {\n            sysPositionService.removeById(id);\n            //删除用户职位关系表\n            userPositionService.removeByPositionId(id);\n        } catch (Exception e) {\n            log.error(\"删除失败\", e.getMessage());\n            return Result.error(\"删除失败!\");\n        }\n        return Result.ok(\"删除成功!\");\n    }\n\n    /**\n     * 批量删除\n     *\n     * @param ids\n     * @return\n     */\n    @AutoLog(value = \"职务表-批量删除\")\n    @Operation(summary = \"职务表-批量删除\")\n    @DeleteMapping(value = \"/deleteBatch\")\n    public Result<SysPosition> deleteBatch(@RequestParam(name = \"ids\", required = true) String ids) {\n        Result<SysPosition> result = new Result<SysPosition>();\n        if (ids == null || \"\".equals(ids.trim())) {\n            result.error500(\"参数不识别！\");\n        } else {\n            this.sysPositionService.removeByIds(Arrays.asList(ids.split(\",\")));\n            result.success(\"删除成功!\");\n        }\n        return result;\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    @AutoLog(value = \"职务表-通过id查询\")\n    @Operation(summary = \"职务表-通过id查询\")\n    @GetMapping(value = \"/queryById\")\n    public Result<SysPosition> queryById(@RequestParam(name = \"id\", required = true) String id) {\n        Result<SysPosition> result = new Result<SysPosition>();\n        SysPosition sysPosition = sysPositionService.getById(id);\n        if (sysPosition == null) {\n            result.error500(\"未找到对应实体\");\n        } else {\n            result.setResult(sysPosition);\n            result.setSuccess(true);\n        }\n        return result;\n    }\n\n    /**\n     * 导出excel\n     *\n     * @param request\n     * @param response\n     */\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(SysPosition sysPosition,HttpServletRequest request, HttpServletResponse response) {\n        // Step.1 组装查询条件\n        QueryWrapper<SysPosition> queryWrapper = null;\n        try {\n            String paramsStr = request.getParameter(\"paramsStr\");\n            if (oConvertUtils.isNotEmpty(paramsStr)) {\n                String deString = URLDecoder.decode(paramsStr, \"UTF-8\");\n                sysPosition = JSON.parseObject(deString, SysPosition.class);\n                //------------------------------------------------------------------------------------------------\n                //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n                if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n                    sysPosition.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(),0));\n                }\n                //------------------------------------------------------------------------------------------------\n            }\n            queryWrapper = QueryGenerator.initQueryWrapper(sysPosition, request.getParameterMap());\n        } catch (UnsupportedEncodingException e) {\n            e.printStackTrace();\n        }\n        // 代码逻辑说明: [03]职务导出，如果选择数据则只导出相关数据--------------------\n        String selections = request.getParameter(\"selections\");\n        if(!oConvertUtils.isEmpty(selections)){\n            queryWrapper.in(\"id\",selections.split(\",\"));\n        }\n        //Step.2 AutoPoi 导出Excel\n        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n        List<SysPosition> pageList = sysPositionService.list(queryWrapper);\n        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        //导出文件名称\n        mv.addObject(NormalExcelConstants.FILE_NAME, \"职务表列表\");\n        mv.addObject(NormalExcelConstants.CLASS, SysPosition.class);\n        //支持导出xlsx格式\n        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(\"职务表列表数据\", \"导出人:\"+user.getRealname(),\"导出信息\", ExcelType.XSSF));\n        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);\n        //职级导出支持导出字段\n        String exportFields = request.getParameter(NormalExcelConstants.EXPORT_FIELDS);\n        if(oConvertUtils.isNotEmpty(exportFields)){\n            mv.addObject(NormalExcelConstants.EXPORT_FIELDS, exportFields);\n        }\n        return mv;\n    }\n\n    /**\n     * 通过excel导入数据\n     *\n     * @param request\n     * @param response\n     * @return\n     */\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response)throws IOException {\n        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n        // 错误信息\n        List<String> errorMessage = new ArrayList<>();\n        int successLines = 0, errorLines = 0;\n        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n            // 获取上传文件对象\n            MultipartFile file = entity.getValue();\n            ImportParams params = new ImportParams();\n            params.setTitleRows(2);\n            params.setHeadRows(1);\n            params.setNeedSave(true);\n            try {\n                List<Object>  listSysPositions = ExcelImportUtil.importExcel(file.getInputStream(), SysPosition.class, params);\n                List<String> list = ImportExcelUtil.importDateSave(listSysPositions, ISysPositionService.class, errorMessage,CommonConstant.SQL_INDEX_UNIQ_CODE);\n                errorLines+=list.size();\n                successLines+=(listSysPositions.size()-errorLines);\n            } catch (Exception e) {\n                log.error(e.getMessage(), e);\n                return Result.error(\"文件导入失败:\" + e.getMessage());\n            } finally {\n                try {\n                    file.getInputStream().close();\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n            }\n        }\n        return ImportExcelUtil.imporReturnRes(errorLines,successLines,errorMessage);\n    }\n\n    /**\n     * 通过code查询\n     *\n     * @param code\n     * @return\n     */\n    @AutoLog(value = \"职务表-通过code查询\")\n    @Operation(summary = \"职务表-通过code查询\")\n    @GetMapping(value = \"/queryByCode\")\n    public Result<SysPosition> queryByCode(@RequestParam(name = \"code\", required = true) String code) {\n        Result<SysPosition> result = new Result<SysPosition>();\n        QueryWrapper<SysPosition> queryWrapper = new QueryWrapper<SysPosition>();\n        queryWrapper.eq(\"code\",code);\n        SysPosition sysPosition = sysPositionService.getOne(queryWrapper);\n        if (sysPosition == null) {\n            result.error500(\"未找到对应实体\");\n        } else {\n            result.setResult(sysPosition);\n            result.setSuccess(true);\n        }\n        return result;\n    }\n\n\n    /**\n     * 通过多个ID查询\n     *\n     * @param ids\n     * @return\n     */\n    @AutoLog(value = \"职务表-通过多个查询\")\n    @Operation(summary = \"职务表-通过多个id查询\")\n    @GetMapping(value = \"/queryByIds\")\n    public Result<List<SysPosition>> queryByIds(@RequestParam(name = \"ids\") String ids) {\n        Result<List<SysPosition>> result = new Result<>();\n        QueryWrapper<SysPosition> queryWrapper = new QueryWrapper<>();\n        queryWrapper.in(true,\"id\",ids.split(\",\"));\n        List<SysPosition> list = sysPositionService.list(queryWrapper);\n        if (list == null) {\n            result.error500(\"未找到对应实体\");\n        } else {\n            result.setResult(list);\n            result.setSuccess(true);\n        }\n        return result;\n    }\n\n\n\n    /**\n     * 获取职位用户列表\n     *\n     * @param pageNo\n     * @param pageSize\n     * @param positionId\n     * @return\n     */\n    @GetMapping(\"/getPositionUserList\")\n    public Result<IPage<SysUser>> getPositionUserList(@RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                                      @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                                      @RequestParam(name = \"positionId\") String positionId) {\n\n        Page<SysUser> page = new Page<>(pageNo, pageSize);\n        IPage<SysUser> pageList = userPositionService.getPositionUserList(page, positionId);\n        List<String> userIds = pageList.getRecords().stream().map(SysUser::getId).collect(Collectors.toList());\n        if (null != userIds && userIds.size() > 0) {\n            Map<String, String> useDepNames = userService.getDepNamesByUserIds(userIds);\n            pageList.getRecords().forEach(item -> {\n                item.setOrgCodeTxt(useDepNames.get(item.getId()));\n            });\n        }\n        return Result.ok(pageList);\n    }\n\n    /**\n     * 添加成员到用户职位关系表\n     *\n     * @param userIds\n     * @param positionId\n     * @return\n     */\n    @PostMapping(\"/savePositionUser\")\n    public Result<String> saveUserPosition(@RequestParam(name = \"userIds\") String userIds,\n                                           @RequestParam(name = \"positionId\") String positionId) {\n        userPositionService.saveUserPosition(userIds, positionId);\n        return Result.ok(\"添加成功\");\n    }\n\n    /**\n     * 职位列表移除成员\n     *\n     * @param userIds\n     * @param positionId\n     * @return\n     */\n    @DeleteMapping(\"/removePositionUser\")\n    public Result<String> removeUserPosition(@RequestParam(name = \"userIds\") String userIds,\n                                             @RequestParam(name = \"positionId\") String positionId) {\n        userPositionService.removePositionUser(userIds, positionId);\n        return Result.OK(\"移除成员成功\");\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java",
    "content": "package org.jeecg.modules.system.controller;\n\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\n\nimport cn.hutool.core.util.RandomUtil;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.modules.redis.client.JeecgRedisClient;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.modules.base.service.BaseCommonService;\nimport org.jeecg.modules.system.entity.*;\nimport org.jeecg.modules.system.model.TreeModel;\nimport org.jeecg.modules.system.service.*;\nimport org.jeecg.modules.system.vo.SysUserRoleCountVo;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.entity.enmus.ExcelType;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport org.springframework.web.servlet.ModelAndView;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.apache.shiro.SecurityUtils;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * <p>\n * 角色表 前端控制器\n * </p>\n *\n * @Author scott\n * @since 2018-12-19\n */\n@RestController\n@RequestMapping(\"/sys/role\")\n@Slf4j\npublic class SysRoleController {\n\t@Autowired\n\tprivate ISysRoleService sysRoleService;\n\t\n\t@Autowired\n\tprivate ISysPermissionDataRuleService sysPermissionDataRuleService;\n\t\n\t@Autowired\n\tprivate ISysRolePermissionService sysRolePermissionService;\n\t\n\t@Autowired\n\tprivate ISysPermissionService sysPermissionService;\n\n    @Autowired\n    private ISysUserRoleService sysUserRoleService;\n\t@Autowired\n\tprivate BaseCommonService baseCommonService;\n\t@Autowired\n\tprivate JeecgRedisClient jeecgRedisClient;\n\t\n\t/**\n\t  * 分页列表查询 【系统角色，不做租户隔离】\n\t * @param role\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t@RequiresPermissions(\"system:role:list\")\n\t@RequestMapping(value = \"/list\", method = RequestMethod.GET)\n\tpublic Result<IPage<SysRole>> queryPageList(SysRole role,\n\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"isMultiTranslate\", required = false) Boolean isMultiTranslate,\n\t\t\t\t\t\t\t\t\t  HttpServletRequest req) {\n        // 代码逻辑说明: 【issues/7948】角色解决根据id查询回显不对---\n        if(null != isMultiTranslate && isMultiTranslate){\n            pageSize = 100;\n        }\n\t\tResult<IPage<SysRole>> result = new Result<IPage<SysRole>>();\n\t\t//QueryWrapper<SysRole> queryWrapper = QueryGenerator.initQueryWrapper(role, req.getParameterMap());\n\t\t//IPage<SysRole> pageList = sysRoleService.page(page, queryWrapper);\n\t\tPage<SysRole> page = new Page<SysRole>(pageNo, pageSize);\n\t\t//换成不做租户隔离的方法，实际上还是存在缺陷（缺陷：如果开启租户隔离，虽然能看到其他租户下的角色，编辑会提示报错）\n\t\tIPage<SysRole> pageList = sysRoleService.listAllSysRole(page, role);\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(pageList);\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * 分页列表查询【租户角色，做租户隔离】\n\t * @param role\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t@RequestMapping(value = \"/listByTenant\", method = RequestMethod.GET)\n\tpublic Result<IPage<SysRole>> listByTenant(SysRole role,\n\t\t\t\t\t\t\t\t\t\t\t\t@RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t\t\t\t\t@RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t\t\t\t\tHttpServletRequest req) {\n\t\tResult<IPage<SysRole>> result = new Result<IPage<SysRole>>();\n\t\t//此接口必须通过租户来隔离查询\n\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n\t\t\trole.setTenantId(oConvertUtils.getInt(!\"0\".equals(TenantContext.getTenant()) ? TenantContext.getTenant() : \"\", -1));\n\t\t}\n\t\t\n\t\tQueryWrapper<SysRole> queryWrapper = QueryGenerator.initQueryWrapper(role, req.getParameterMap());\n\t\tPage<SysRole> page = new Page<SysRole>(pageNo, pageSize);\n\t\tIPage<SysRole> pageList = sysRoleService.page(page, queryWrapper);\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(pageList);\n\t\treturn result;\n\t}\n\t\n\t/**\n\t  *   添加\n\t * @param role\n\t * @return\n\t */\n\t@RequestMapping(value = \"/add\", method = RequestMethod.POST)\n    @RequiresPermissions(\"system:role:add\")\n\tpublic Result<SysRole> add(@RequestBody SysRole role) {\n\t\tResult<SysRole> result = new Result<SysRole>();\n\t\ttry {\n\t\t\t//开启多租户隔离,角色id自动生成10位\n\t\t\t// 代码逻辑说明: 【TV360X-42】角色新增时设置的编码，保存后不一致---\n\t\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL && oConvertUtils.isEmpty(role.getRoleCode())){\n\t\t\t\trole.setRoleCode(RandomUtil.randomString(10));\n\t\t\t}\n\t\t\trole.setCreateTime(new Date());\n\t\t\tsysRoleService.save(role);\n\t\t\tresult.success(\"添加成功！\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\tresult.error500(\"操作失败\");\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t  *  编辑\n\t * @param role\n\t * @return\n\t */\n    @RequiresPermissions(\"system:role:edit\")\n\t@RequestMapping(value = \"/edit\",method = {RequestMethod.PUT,RequestMethod.POST})\n\tpublic Result<SysRole> edit(@RequestBody SysRole role) {\n\t\tResult<SysRole> result = new Result<SysRole>();\n\t\tSysRole sysrole = sysRoleService.getById(role.getId());\n\t\tif(sysrole==null) {\n\t\t\tresult.error500(\"未找到对应角色！\");\n\t\t}else {\n\t\t\trole.setUpdateTime(new Date());\n\n\t\t\t//------------------------------------------------------------------\n\t\t\t//如果是saas隔离的情况下，判断当前租户id是否是当前租户下的\n\t\t\tif (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n\t\t\t\t//获取当前用户\n\t\t\t\tLoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\t\t\tInteger tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n\t\t\t\tString username = \"admin\";\n\t\t\t\tif (!tenantId.equals(sysrole.getTenantId()) && !username.equals(sysUser.getUsername())) {\n\t\t\t\t\tbaseCommonService.addLog(\"未经授权，修改非本租户下的角色ID：\" + role.getId() + \"，操作人：\" + sysUser.getUsername(), CommonConstant.LOG_TYPE_2, CommonConstant.OPERATE_TYPE_3);\n\t\t\t\t\treturn Result.error(\"修改角色失败,当前角色不在此租户中。\");\n\t\t\t\t}\n\t\t\t}\n\t\t\t//------------------------------------------------------------------\n\t\t\t\n\t\t\tboolean ok = sysRoleService.updateById(role);\n\t\t\tif(ok) {\n\t\t\t\tresult.success(\"修改成功!\");\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t  *   通过id删除\n\t * @param id\n\t * @return\n\t */\n    @RequiresPermissions(\"system:role:delete\")\n\t@RequestMapping(value = \"/delete\", method = RequestMethod.DELETE)\n\tpublic Result<?> delete(@RequestParam(name=\"id\",required=true) String id) {\n    \t//如果是saas隔离的情况下，判断当前租户id是否是当前租户下的\n    \tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\t//获取当前用户\n\t\t\tLoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\t\tint tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n\t\t\tLong getRoleCount = sysRoleService.getRoleCountByTenantId(id, tenantId);\n\t\t\tString username = \"admin\";\n\t\t\tif(getRoleCount == 0 && !username.equals(sysUser.getUsername())){\n\t\t\t\tbaseCommonService.addLog(\"未经授权，删除非本租户下的角色ID：\" + id + \"，操作人：\" + sysUser.getUsername(), CommonConstant.LOG_TYPE_2, CommonConstant.OPERATE_TYPE_4);\n\t\t\t\treturn Result.error(\"删除角色失败,当前角色不在此租户中。\");\n\t\t\t}\n\t\t}\n    \t\n\t\t//是否存在admin角色\n\t\tsysRoleService.checkAdminRoleRejectDel(id);\n    \t\n\t\tsysRoleService.deleteRole(id);\n\n\t\treturn Result.ok(\"删除角色成功\");\n\t}\n\t\n\t/**\n\t  *  批量删除\n\t * @param ids\n\t * @return\n\t */\n    @RequiresPermissions(\"system:role:deleteBatch\")\n\t@RequestMapping(value = \"/deleteBatch\", method = RequestMethod.DELETE)\n\tpublic Result<SysRole> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tbaseCommonService.addLog(\"删除角色操作，角色ids：\" + ids, CommonConstant.LOG_TYPE_2, CommonConstant.OPERATE_TYPE_4);\n\t\tResult<SysRole> result = new Result<SysRole>();\n\t\tif(oConvertUtils.isEmpty(ids)) {\n\t\t\tresult.error500(\"未选中角色！\");\n\t\t}else {\n\t\t\t//如果是saas隔离的情况下，判断当前租户id是否是当前租户下的\n\t\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\t\tint tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n\t\t\t\tString[] roleIds = ids.split(SymbolConstant.COMMA);\n\t\t\t\tLoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\t\t\tString username = \"admin\";\n\t\t\t\tfor (String id:roleIds) {\n\t\t\t\t\tLong getRoleCount = sysRoleService.getRoleCountByTenantId(id, tenantId);\n\t\t\t\t\t//如果存在角色id为0，即不存在，则删除角色\n\t\t\t\t\tif(getRoleCount == 0 && !username.equals(sysUser.getUsername()) ){\n\t\t\t\t\t\tbaseCommonService.addLog(\"未经授权，删除非本租户下的角色ID：\" + id + \"，操作人：\" + sysUser.getUsername(), CommonConstant.LOG_TYPE_2, CommonConstant.OPERATE_TYPE_4);\n\t\t\t\t\t\treturn Result.error(\"批量删除角色失败,存在角色不在此租户中，禁止批量删除\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t//验证是否为admin角色\n\t\t\tsysRoleService.checkAdminRoleRejectDel(ids);\n\t\t\tsysRoleService.deleteBatchRole(ids.split(\",\"));\n\t\t\tresult.success(\"删除角色成功!\");\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t  * 通过id查询\n\t * @param id\n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryById\", method = RequestMethod.GET)\n\tpublic Result<SysRole> queryById(@RequestParam(name=\"id\",required=true) String id) {\n\t\tResult<SysRole> result = new Result<SysRole>();\n\t\tSysRole sysrole = sysRoleService.getById(id);\n\t\tif(sysrole==null) {\n\t\t\tresult.error500(\"未找到对应实体\");\n\t\t}else {\n\t\t\tresult.setResult(sysrole);\n\t\t\tresult.setSuccess(true);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 查询全部角色（参与租户隔离）\n\t * \n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryall\", method = RequestMethod.GET)\n\tpublic Result<List<SysRole>> queryall() {\n\t\tResult<List<SysRole>> result = new Result<>();\n\t\tLambdaQueryWrapper<SysRole> query = new LambdaQueryWrapper<SysRole>();\n\t\t//------------------------------------------------------------------------------------------------\n\t\t//是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\tquery.eq(SysRole::getTenantId, oConvertUtils.getInt(TenantContext.getTenant(), 0));\n\t\t}\n\t\t//------------------------------------------------------------------------------------------------\n\t\tList<SysRole> list = sysRoleService.list(query);\n\t\tif(list==null||list.size()<=0) {\n\t\t\tresult.error500(\"未找到角色信息\");\n\t\t}else {\n\t\t\tresult.setResult(list);\n\t\t\tresult.setSuccess(true);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 查询全部系统角色（不做租户隔离）\n\t *\n\t * @return\n\t */\n\t@RequiresPermissions(\"system:role:queryallNoByTenant\")\n\t@RequestMapping(value = \"/queryallNoByTenant\", method = RequestMethod.GET)\n\tpublic Result<List<SysRole>> queryallNoByTenant() {\n\t\tResult<List<SysRole>> result = new Result<>();\n\t\tLambdaQueryWrapper<SysRole> query = new LambdaQueryWrapper<SysRole>();\n\t\tList<SysRole> list = sysRoleService.list(query);\n\t\tif(list==null||list.size()<=0) {\n\t\t\tresult.error500(\"未找到角色信息\");\n\t\t}else {\n\t\t\tresult.setResult(list);\n\t\t\tresult.setSuccess(true);\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t  * 校验角色编码唯一\n\t */\n\t@RequestMapping(value = \"/checkRoleCode\", method = RequestMethod.GET)\n\tpublic Result<Boolean> checkUsername(String id,String roleCode) {\n\t\tResult<Boolean> result = new Result<>();\n        //如果此参数为false则程序发生异常\n\t\tresult.setResult(true);\n\t\tlog.info(\"--验证角色编码是否唯一---id:\"+id+\"--roleCode:\"+roleCode);\n\t\ttry {\n\t\t\tSysRole role = null;\n\t\t\tif(oConvertUtils.isNotEmpty(id)) {\n\t\t\t\trole = sysRoleService.getById(id);\n\t\t\t}\n\t\t\t//SysRole newRole = sysRoleService.getOne(new QueryWrapper<SysRole>().lambda().eq(SysRole::getRoleCode, roleCode));\n\t\t\tSysRole newRole = sysRoleService.getRoleNoTenant(roleCode);\n\t\t\tif(newRole!=null) {\n\t\t\t\t//如果根据传入的roleCode查询到信息了，那么就需要做校验了。\n\t\t\t\tif(role==null) {\n\t\t\t\t\t//role为空=>新增模式=>只要roleCode存在则返回false\n\t\t\t\t\tresult.setSuccess(false);\n\t\t\t\t\tresult.setMessage(\"角色编码已存在\");\n\t\t\t\t\treturn result;\n\t\t\t\t}else if(!id.equals(newRole.getId())) {\n\t\t\t\t\t//否则=>编辑模式=>判断两者ID是否一致-\n\t\t\t\t\tresult.setSuccess(false);\n\t\t\t\t\tresult.setMessage(\"角色编码已存在\");\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tresult.setSuccess(false);\n\t\t\tresult.setResult(false);\n\t\t\tresult.setMessage(e.getMessage());\n\t\t\treturn result;\n\t\t}\n\t\tresult.setSuccess(true);\n\t\treturn result;\n\t}\n\n\t/**\n\t * 导出excel\n\t * @param request\n\t */\n\t@RequestMapping(value = \"/exportXls\")\n\tpublic ModelAndView exportXls(SysRole sysRole,HttpServletRequest request) {\n\t\t//------------------------------------------------------------------------------------------------\n\t\t//是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\tsysRole.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(), 0));\n\t\t}\n\t\t//------------------------------------------------------------------------------------------------\n\t\t\n\t\t// Step.1 组装查询条件\n\t\tQueryWrapper<SysRole> queryWrapper = QueryGenerator.initQueryWrapper(sysRole, request.getParameterMap());\n\t\t//Step.2 AutoPoi 导出Excel\n\t\tModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n\t\tList<SysRole> pageList = sysRoleService.list(queryWrapper);\n\t\t//导出文件名称\n\t\tmv.addObject(NormalExcelConstants.FILE_NAME,\"角色列表\");\n\t\tmv.addObject(NormalExcelConstants.CLASS,SysRole.class);\n\t\tLoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        //导出支持xlsx\n\t\tmv.addObject(NormalExcelConstants.PARAMS,new ExportParams(\"角色列表数据\",\"导出人:\"+user.getRealname(),\"导出信息\", ExcelType.XSSF));\n\t\tmv.addObject(NormalExcelConstants.DATA_LIST,pageList);\n        //角色支持指定字段导出\n        String exportFields = request.getParameter(NormalExcelConstants.EXPORT_FIELDS);\n        if(oConvertUtils.isNotEmpty(exportFields)){\n            mv.addObject(NormalExcelConstants.EXPORT_FIELDS, exportFields);\n        }\n\t\treturn mv;\n\t}\n\n\t/**\n\t * 通过excel导入数据\n\t * @param request\n\t * @param response\n\t * @return\n\t */\n\t@RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n\tpublic Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n\t\tMultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n\t\tMap<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n\t\tfor (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n            // 获取上传文件对象\n\t\t\tMultipartFile file = entity.getValue();\n\t\t\tImportParams params = new ImportParams();\n\t\t\tparams.setTitleRows(2);\n\t\t\tparams.setHeadRows(1);\n\t\t\tparams.setNeedSave(true);\n\t\t\ttry {\n\t\t\t\treturn sysRoleService.importExcelCheckRoleCode(file, params);\n\t\t\t} catch (Exception e) {\n\t\t\t\tlog.error(e.getMessage(), e);\n\t\t\t\treturn Result.error(\"文件导入失败:\" + e.getMessage());\n\t\t\t} finally {\n\t\t\t\ttry {\n\t\t\t\t\tfile.getInputStream().close();\n\t\t\t\t} catch (IOException e) {\n\t\t\t\t\tlog.error(e.getMessage(), e);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn Result.error(\"文件导入失败！\");\n\t}\n\t\n\t/**\n\t * 查询数据规则数据\n\t */\n\t@GetMapping(value = \"/datarule/{permissionId}/{roleId}\")\n\tpublic Result<?> loadDatarule(@PathVariable(\"permissionId\") String permissionId,@PathVariable(\"roleId\") String roleId) {\n\t\tList<SysPermissionDataRule> list = sysPermissionDataRuleService.getPermRuleListByPermId(permissionId);\n\t\tif(list==null || list.size()==0) {\n\t\t\treturn Result.error(\"未找到权限配置信息\");\n\t\t}else {\n\t\t\tMap<String,Object> map = new HashMap(5);\n\t\t\tmap.put(\"datarule\", list);\n\t\t\tLambdaQueryWrapper<SysRolePermission> query = new LambdaQueryWrapper<SysRolePermission>()\n\t\t\t\t\t.eq(SysRolePermission::getPermissionId, permissionId)\n\t\t\t\t\t.isNotNull(SysRolePermission::getDataRuleIds)\n\t\t\t\t\t.eq(SysRolePermission::getRoleId,roleId);\n\t\t\tSysRolePermission sysRolePermission = sysRolePermissionService.getOne(query);\n\t\t\tif(sysRolePermission==null) {\n\t\t\t\t//return Result.error(\"未找到角色菜单配置信息\");\n\t\t\t}else {\n\t\t\t\tString drChecked = sysRolePermission.getDataRuleIds();\n\t\t\t\tif(oConvertUtils.isNotEmpty(drChecked)) {\n\t\t\t\t\tmap.put(\"drChecked\", drChecked.endsWith(\",\")?drChecked.substring(0, drChecked.length()-1):drChecked);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn Result.ok(map);\n\t\t\t//TODO 以后按钮权限的查询也走这个请求 无非在map中多加两个key\n\t\t}\n\t}\n\t\n\t/**\n\t * 保存数据规则至角色菜单关联表\n\t */\n\t@PostMapping(value = \"/datarule\")\n\tpublic Result<?> saveDatarule(@RequestBody JSONObject jsonObject) {\n\t\ttry {\n\t\t\tString permissionId = jsonObject.getString(\"permissionId\");\n\t\t\tString roleId = jsonObject.getString(\"roleId\");\n\t\t\tString dataRuleIds = jsonObject.getString(\"dataRuleIds\");\n\t\t\tlog.info(\"保存数据规则>>\"+\"菜单ID:\"+permissionId+\"角色ID:\"+ roleId+\"数据权限ID:\"+dataRuleIds);\n\t\t\tLambdaQueryWrapper<SysRolePermission> query = new LambdaQueryWrapper<SysRolePermission>()\n\t\t\t\t\t.eq(SysRolePermission::getPermissionId, permissionId)\n\t\t\t\t\t.eq(SysRolePermission::getRoleId,roleId);\n\t\t\tSysRolePermission sysRolePermission = sysRolePermissionService.getOne(query);\n\t\t\tif(sysRolePermission==null) {\n\t\t\t\treturn Result.error(\"请先保存角色菜单权限!\");\n\t\t\t}else {\n\t\t\t\tsysRolePermission.setDataRuleIds(dataRuleIds);\n\t\t\t\tthis.sysRolePermissionService.updateById(sysRolePermission);\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"SysRoleController.saveDatarule()发生异常：\" + e.getMessage(),e);\n\t\t\treturn Result.error(\"保存失败\");\n\t\t}\n\t\treturn Result.ok(\"保存成功!\");\n\t}\n\t\n\t\n\t/**\n\t * 用户角色授权功能，查询菜单权限树\n\t * @param request\n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryTreeList\", method = RequestMethod.GET)\n\tpublic Result<Map<String,Object>> queryTreeList(HttpServletRequest request) {\n\t\tResult<Map<String,Object>> result = new Result<>();\n\t\t//全部权限ids\n\t\tList<String> ids = new ArrayList<>();\n\t\ttry {\n\t\t\tLambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>();\n\t\t\tquery.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0);\n\t\t\tquery.orderByAsc(SysPermission::getSortNo);\n\t\t\tList<SysPermission> list = sysPermissionService.list(query);\n\t\t\tfor(SysPermission sysPer : list) {\n\t\t\t\tids.add(sysPer.getId());\n\t\t\t}\n\t\t\tList<TreeModel> treeList = new ArrayList<>();\n\t\t\tgetTreeModelList(treeList, list, null);\n\t\t\tMap<String,Object> resMap = new HashMap(5);\n            //全部树节点数据\n\t\t\tresMap.put(\"treeList\", treeList);\n            //全部树ids\n\t\t\tresMap.put(\"ids\", ids);\n\t\t\tresult.setResult(resMap);\n\t\t\tresult.setSuccess(true);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t}\n\t\treturn result;\n\t}\n\t\n\tprivate void getTreeModelList(List<TreeModel> treeList,List<SysPermission> metaList,TreeModel temp) {\n\t\tfor (SysPermission permission : metaList) {\n\t\t\tString tempPid = permission.getParentId();\n\t\t\tTreeModel tree = new TreeModel(permission.getId(), tempPid, permission.getName(),permission.getRuleFlag(), permission.isLeaf());\n\t\t\tif(temp==null && oConvertUtils.isEmpty(tempPid)) {\n\t\t\t\ttreeList.add(tree);\n\t\t\t\tif(!tree.getIsLeaf()) {\n\t\t\t\t\tgetTreeModelList(treeList, metaList, tree);\n\t\t\t\t}\n\t\t\t}else if(temp!=null && tempPid!=null && tempPid.equals(temp.getKey())){\n\t\t\t\ttemp.getChildren().add(tree);\n\t\t\t\tif(!tree.getIsLeaf()) {\n\t\t\t\t\tgetTreeModelList(treeList, metaList, tree);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t}\n\t}\n\n    /**\n     * 分页获取全部角色列表（包含每个角色的数量）\n     * @return\n     */\n    @RequestMapping(value = \"/queryPageRoleCount\", method = RequestMethod.GET)\n    public Result<IPage<SysUserRoleCountVo>> queryPageRoleCount(@RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n                                                                @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize) {\n        Result<IPage<SysUserRoleCountVo>> result = new Result<>();\n\t\tLambdaQueryWrapper<SysRole> query = new LambdaQueryWrapper<SysRole>();\n\t\t//------------------------------------------------------------------------------------------------\n\t\t//是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\tquery.eq(SysRole::getTenantId, oConvertUtils.getInt(TenantContext.getTenant(), 0));\n\t\t}\n\t\t//------------------------------------------------------------------------------------------------\n        Page<SysRole> page = new Page<>(pageNo, pageSize);\n        IPage<SysRole> pageList = sysRoleService.page(page, query);\n        List<SysRole> records = pageList.getRecords();\n        IPage<SysUserRoleCountVo> sysRoleCountPage = new PageDTO<>();\n        List<SysUserRoleCountVo> sysCountVoList = new ArrayList<>();\n        //循环角色数据获取每个角色下面对应的角色数量\n        for (SysRole role:records) {\n            LambdaQueryWrapper<SysUserRole> countQuery = new LambdaQueryWrapper<>();\n\t\t\tcountQuery.eq(SysUserRole::getRoleId,role.getId());\n            long count = sysUserRoleService.count(countQuery);\n            SysUserRoleCountVo countVo = new SysUserRoleCountVo();\n            BeanUtils.copyProperties(role,countVo);\n            countVo.setCount(count);\n            sysCountVoList.add(countVo);\n        }\n        sysRoleCountPage.setRecords(sysCountVoList);\n        sysRoleCountPage.setTotal(pageList.getTotal());\n        sysRoleCountPage.setSize(pageList.getSize());\n        result.setSuccess(true);\n        result.setResult(sysRoleCountPage);\n        return result;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysRoleIndexController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.util.RedisUtil;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.base.service.BaseCommonService;\nimport org.jeecg.modules.system.constant.DefIndexConst;\nimport org.jeecg.modules.system.entity.SysRoleIndex;\nimport org.jeecg.modules.system.service.ISysRoleIndexService;\nimport org.jeecg.modules.system.service.ISysUserService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport java.util.Arrays;\n\n/**\n * @Description: 角色首页配置\n * @Author: jeecg-boot\n * @Date: 2022-03-25\n * @Version: V1.0\n */\n@Slf4j\n@Tag(name = \"角色首页配置\")\n@RestController\n@RequestMapping(\"/sys/sysRoleIndex\")\npublic class SysRoleIndexController extends JeecgController<SysRoleIndex, ISysRoleIndexService> {\n    @Autowired\n    private ISysRoleIndexService sysRoleIndexService;\n\n    @Autowired\n    private ISysUserService sysUserService;\n\n    @Autowired\n    private RedisUtil redisUtil;\n\n    @Autowired\n    private BaseCommonService baseCommonService;\n    /**\n     * 分页列表查询\n     *\n     * @param sysRoleIndex\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @AutoLog(value = \"角色首页配置-分页列表查询\")\n    @Operation(summary = \"角色首页配置-分页列表查询\")\n    @GetMapping(value = \"/list\")\n    public Result<?> queryPageList(SysRoleIndex sysRoleIndex,\n                                   @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                   @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                   HttpServletRequest req) {\n        QueryWrapper<SysRoleIndex> queryWrapper = QueryGenerator.initQueryWrapper(sysRoleIndex, req.getParameterMap());\n        Page<SysRoleIndex> page = new Page<SysRoleIndex>(pageNo, pageSize);\n        IPage<SysRoleIndex> pageList = sysRoleIndexService.page(page, queryWrapper);\n        return Result.OK(pageList);\n    }\n\n    /**\n     * 添加\n     *\n     * @param sysRoleIndex\n     * @return\n     */\n    @RequiresPermissions(\"system:roleindex:add\")\n    @AutoLog(value = \"角色首页配置-添加\")\n    @Operation(summary = \"角色首页配置-添加\")\n    @PostMapping(value = \"/add\")\n    //@DynamicTable(value = DynamicTableConstant.SYS_ROLE_INDEX)\n    public Result<?> add(@RequestBody SysRoleIndex sysRoleIndex,HttpServletRequest request) {\n        String relationType = sysRoleIndex.getRelationType();\n        if(oConvertUtils.isEmpty(relationType)){\n            sysRoleIndex.setRelationType(CommonConstant.HOME_RELATION_ROLE);\n        }\n        sysRoleIndexService.save(sysRoleIndex);\n        //更新其他全局配置的状态\n        sysRoleIndexService.updateOtherDefaultStatus(sysRoleIndex.getRoleCode(),sysRoleIndex.getStatus(),sysRoleIndex.getId());\n        sysRoleIndexService.cleanDefaultIndexCache();\n        return Result.OK(\"添加成功！\");\n    }\n\n    /**\n     * 编辑\n     *\n     * @param sysRoleIndex\n     * @return\n     */\n    @RequiresPermissions(\"system:roleindex:edit\")\n    @AutoLog(value = \"角色首页配置-编辑\")\n    @Operation(summary = \"角色首页配置-编辑\")\n    @RequestMapping(value = \"/edit\", method = {RequestMethod.PUT, RequestMethod.POST})\n    //@DynamicTable(value = DynamicTableConstant.SYS_ROLE_INDEX)\n    public Result<?> edit(@RequestBody SysRoleIndex sysRoleIndex,HttpServletRequest request) {\n        String relationType = sysRoleIndex.getRelationType();\n        if(oConvertUtils.isEmpty(relationType)){\n            sysRoleIndex.setRelationType(CommonConstant.HOME_RELATION_ROLE);\n        }\n        sysRoleIndexService.updateById(sysRoleIndex);\n        //更新其他全局配置的状态\n        sysRoleIndexService.updateOtherDefaultStatus(sysRoleIndex.getRoleCode(),sysRoleIndex.getStatus(),sysRoleIndex.getId());\n        sysRoleIndexService.cleanDefaultIndexCache();\n        return Result.OK(\"编辑成功!\");\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @AutoLog(value = \"角色首页配置-通过id删除\")\n    @Operation(summary = \"角色首页配置-通过id删除\")\n    @RequiresPermissions(\"system:roleindex:delete\")\n    @DeleteMapping(value = \"/delete\")\n    public Result<?> delete(@RequestParam(name = \"id\", required = true) String id) {\n        sysRoleIndexService.removeById(id);\n        return Result.OK(\"删除成功!\");\n    }\n\n    /**\n     * 批量删除\n     *\n     * @param ids\n     * @return\n     */\n    @AutoLog(value = \"角色首页配置-批量删除\")\n    @Operation(summary = \"角色首页配置-批量删除\")\n    @RequiresPermissions(\"system:roleindex:deleteBatch\")\n    @DeleteMapping(value = \"/deleteBatch\")\n    public Result<?> deleteBatch(@RequestParam(name = \"ids\", required = true) String ids) {\n        baseCommonService.addLog(\"批量删除用户， ids： \" +ids ,CommonConstant.LOG_TYPE_2, 3);\n        this.sysRoleIndexService.removeByIds(Arrays.asList(ids.split(\",\")));\n        return Result.OK(\"批量删除成功！\");\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    @AutoLog(value = \"角色首页配置-通过id查询\")\n    @Operation(summary = \"角色首页配置-通过id查询\")\n    @GetMapping(value = \"/queryById\")\n    public Result<?> queryById(@RequestParam(name = \"id\", required = true) String id) {\n        SysRoleIndex sysRoleIndex = sysRoleIndexService.getById(id);\n        return Result.OK(sysRoleIndex);\n    }\n\n    /**\n     * 导出excel\n     *\n     * @param request\n     * @param sysRoleIndex\n     */\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, SysRoleIndex sysRoleIndex) {\n        return super.exportXls(request, sysRoleIndex, SysRoleIndex.class, \"角色首页配置\");\n    }\n\n    /**\n     * 通过excel导入数据\n     *\n     * @param request\n     * @param response\n     * @return\n     */\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n        return super.importExcel(request, response, SysRoleIndex.class);\n    }\n\n    /**\n     * 通过code查询\n     *\n     * @param roleCode\n     * @return\n     */\n    @AutoLog(value = \"角色首页配置-通过code查询\")\n    @Operation(summary = \"角色首页配置-通过code查询\")\n    @GetMapping(value = \"/queryByCode\")\n    //@DynamicTable(value = DynamicTableConstant.SYS_ROLE_INDEX)\n    public Result<?> queryByCode(@RequestParam(name = \"roleCode\", required = true) String roleCode,HttpServletRequest request) {\n        SysRoleIndex sysRoleIndex = sysRoleIndexService.getOne(new LambdaQueryWrapper<SysRoleIndex>().eq(SysRoleIndex::getRoleCode, roleCode));\n        return Result.OK(sysRoleIndex);\n    }\n\n    /**\n     * 查询默认首页配置\n     */\n    @GetMapping(\"/queryDefIndex\")\n    public Result<SysRoleIndex> queryDefIndex() {\n        SysRoleIndex defIndexCfg = sysRoleIndexService.queryDefaultIndex();\n        return Result.OK(defIndexCfg);\n    }\n\n    /**\n     * 更新默认首页配置\n     */\n    @RequiresPermissions(\"system:permission:setDefIndex\")\n    @PutMapping(\"/updateDefIndex\")\n    public Result<?> updateDefIndex(\n            @RequestParam(\"url\") String url,\n            @RequestParam(\"component\") String component,\n            @RequestParam(\"isRoute\") Boolean isRoute\n    ) {\n        boolean success = sysRoleIndexService.updateDefaultIndex(url, component, isRoute);\n        if (success) {\n            return Result.OK(\"设置成功\");\n        } else {\n            return Result.error(\"设置失败\");\n        }\n    }\n    /**\n     * 切换默认门户\n     *\n     * @param sysRoleIndex\n     * @return\n     */\n    @PostMapping(value = \"/changeDefHome\")\n    public Result<?> changeDefHome(@RequestBody SysRoleIndex sysRoleIndex,HttpServletRequest request) {\n        String username = JwtUtil.getUserNameByToken(request);\n        sysRoleIndex.setRoleCode(username);\n        sysRoleIndexService.changeDefHome(sysRoleIndex);\n        // 代码逻辑说明: 切换完成后的homePath获取\n        String version = request.getHeader(CommonConstant.VERSION);\n        String homePath = null;\n        SysRoleIndex defIndexCfg = sysUserService.getDynamicIndexByUserRole(username, version);\n        if (defIndexCfg == null) {\n            defIndexCfg = sysRoleIndexService.initDefaultIndex();\n        }\n        if (oConvertUtils.isNotEmpty(version) && defIndexCfg != null && oConvertUtils.isNotEmpty(defIndexCfg.getUrl())) {\n            homePath = defIndexCfg.getUrl();\n            if (!homePath.startsWith(SymbolConstant.SINGLE_SLASH)) {\n                homePath = SymbolConstant.SINGLE_SLASH + homePath;\n            }\n        }\n        return Result.OK(homePath);\n    }\n    /**\n     * 获取门户类型\n     *\n     * @return\n     */\n    @GetMapping(value = \"/getCurrentHome\")\n    public Result<?> getCurrentHome(HttpServletRequest request) {\n        String username = JwtUtil.getUserNameByToken(request);\n        Object homeType = redisUtil.get(DefIndexConst.CACHE_TYPE + username);\n        return Result.OK(oConvertUtils.getString(homeType,DefIndexConst.HOME_TYPE_MENU));\n    }\n\n    /**\n     * 清除缓存\n     *\n     * @return\n     */\n    @RequestMapping(value = \"/cleanDefaultIndexCache\")\n    public Result<?> cleanDefaultIndexCache(HttpServletRequest request) {\n        sysRoleIndexService.cleanDefaultIndexCache();\n        return Result.OK();\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysTableWhiteListController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.apache.shiro.authz.annotation.RequiresRoles;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.modules.system.entity.SysTableWhiteList;\nimport org.jeecg.modules.system.service.ISysTableWhiteListService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport jakarta.servlet.http.HttpServletRequest;\n\n/**\n * @Description: 系统表白名单\n * @Author: jeecg-boot\n * @Date: 2023-09-12\n * @Version: V1.0\n */\n@Slf4j\n@Tag(name = \"系统表白名单\")\n@RestController\n@RequestMapping(\"/sys/tableWhiteList\")\npublic class SysTableWhiteListController extends JeecgController<SysTableWhiteList, ISysTableWhiteListService> {\n\n    @Autowired\n    private ISysTableWhiteListService sysTableWhiteListService;\n\n    /**\n     * 分页列表查询\n     *\n     * @param sysTableWhiteList\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    //@RequiresRoles(\"admin\")\n    @RequiresPermissions(\"system:tableWhite:list\")\n    @GetMapping(value = \"/list\")\n    public Result<?> queryPageList(\n            SysTableWhiteList sysTableWhiteList,\n            @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n            @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n            HttpServletRequest req\n    ) {\n        QueryWrapper<SysTableWhiteList> queryWrapper = QueryGenerator.initQueryWrapper(sysTableWhiteList, req.getParameterMap());\n        Page<SysTableWhiteList> page = new Page<>(pageNo, pageSize);\n        IPage<SysTableWhiteList> pageList = sysTableWhiteListService.page(page, queryWrapper);\n        return Result.OK(pageList);\n    }\n\n    /**\n     * 添加\n     *\n     * @param sysTableWhiteList\n     * @return\n     */\n    @AutoLog(value = \"系统表白名单-添加\")\n    @Operation(summary = \"系统表白名单-添加\")\n    //@RequiresRoles(\"admin\")\n    @RequiresPermissions(\"system:tableWhite:add\")\n    @PostMapping(value = \"/add\")\n    public Result<?> add(@RequestBody SysTableWhiteList sysTableWhiteList) {\n        if (sysTableWhiteListService.add(sysTableWhiteList)) {\n            return Result.OK(\"添加成功！\");\n        } else {\n            return Result.error(\"添加失败！\");\n        }\n    }\n\n    /**\n     * 编辑\n     *\n     * @param sysTableWhiteList\n     * @return\n     */\n    @AutoLog(value = \"系统表白名单-编辑\")\n    @Operation(summary = \"系统表白名单-编辑\")\n    //@RequiresRoles(\"admin\")\n    @RequiresPermissions(\"system:tableWhite:edit\")\n    @RequestMapping(value = \"/edit\", method = {RequestMethod.PUT, RequestMethod.POST})\n    public Result<?> edit(@RequestBody SysTableWhiteList sysTableWhiteList) {\n        if (sysTableWhiteListService.edit(sysTableWhiteList)) {\n            return Result.OK(\"编辑成功！\");\n        } else {\n            return Result.error(\"编辑失败！\");\n        }\n    }\n\n    /**\n     * 通过id删除\n     *\n     * @param id\n     * @return\n     */\n    @AutoLog(value = \"系统表白名单-通过id删除\")\n    @Operation(summary = \"系统表白名单-通过id删除\")\n//    @RequiresRoles(\"admin\")\n    @RequiresPermissions(\"system:tableWhite:delete\")\n    @DeleteMapping(value = \"/delete\")\n    public Result<?> delete(@RequestParam(name = \"id\") String id) {\n        if (sysTableWhiteListService.deleteByIds(id)) {\n            return Result.OK(\"删除成功！\");\n        } else {\n            return Result.error(\"删除失败！\");\n        }\n    }\n\n    /**\n     * 批量删除\n     *\n     * @param ids\n     * @return\n     */\n    @AutoLog(value = \"系统表白名单-批量删除\")\n    @Operation(summary = \"系统表白名单-批量删除\")\n//    @RequiresRoles(\"admin\")\n    @RequiresPermissions(\"system:tableWhite:deleteBatch\")\n    @DeleteMapping(value = \"/deleteBatch\")\n    public Result<?> deleteBatch(@RequestParam(name = \"ids\") String ids) {\n        if (sysTableWhiteListService.deleteByIds(ids)) {\n            return Result.OK(\"批量删除成功！\");\n        } else {\n            return Result.error(\"批量删除失败！\");\n        }\n    }\n\n    /**\n     * 通过id查询\n     *\n     * @param id\n     * @return\n     */\n    @AutoLog(value = \"系统表白名单-通过id查询\")\n    @Operation(summary = \"系统表白名单-通过id查询\")\n//    @RequiresRoles(\"admin\")\n    @RequiresPermissions(\"system:tableWhite:queryById\")\n    @GetMapping(value = \"/queryById\")\n    public Result<?> queryById(@RequestParam(name = \"id\", required = true) String id) {\n        SysTableWhiteList sysTableWhiteList = sysTableWhiteListService.getById(id);\n        return Result.OK(sysTableWhiteList);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysTenantController.java",
    "content": "package org.jeecg.modules.system.controller;\n\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport cn.hutool.core.util.RandomUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.SecurityUtils;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.aspect.annotation.PermissionData;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.PasswordUtil;\nimport org.jeecg.common.util.TokenUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.config.sign.annotation.SignatureCheck;\nimport org.jeecg.modules.base.service.BaseCommonService;\nimport org.jeecg.modules.system.entity.*;\nimport org.jeecg.modules.system.service.ISysTenantPackService;\nimport org.jeecg.modules.system.service.ISysTenantService;\nimport org.jeecg.modules.system.service.ISysUserService;\nimport org.jeecg.modules.system.service.ISysUserTenantService;\nimport org.jeecg.modules.system.service.ISysDepartService;\nimport org.jeecg.modules.system.vo.SysUserTenantVo;\nimport org.jeecg.modules.system.vo.tenant.TenantDepartAuthInfo;\nimport org.jeecg.modules.system.vo.tenant.TenantPackModel;\nimport org.jeecg.modules.system.vo.tenant.TenantPackUser;\nimport org.jeecg.modules.system.vo.tenant.TenantPackUserCount;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.util.*;\n\n/**\n * 租户配置信息\n * @author: jeecg-boot\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/sys/tenant\")\npublic class SysTenantController {\n\n    @Autowired\n    private ISysTenantService sysTenantService;\n\n    @Autowired\n    private ISysUserService sysUserService;\n\n    @Autowired\n    private ISysUserTenantService relationService;\n    \n    @Autowired\n    private ISysTenantPackService sysTenantPackService;\n    \n    @Autowired\n    private BaseCommonService baseCommonService;\n\n    @Autowired\n    private ISysDepartService sysDepartService;\n\n    /**\n     * 获取列表数据\n     * @param sysTenant\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @RequiresPermissions(\"system:tenant:list\")\n    @PermissionData(pageComponent = \"system/TenantList\")\n\t@RequestMapping(value = \"/list\", method = RequestMethod.GET)\n\tpublic Result<IPage<SysTenant>> queryPageList(SysTenant sysTenant,@RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,HttpServletRequest req) {\n\t\tResult<IPage<SysTenant>> result = new Result<IPage<SysTenant>>();\n        //---author:zhangyafei---date:20210916-----for: 租户管理添加日期范围查询---\n        Date beginDate=null;\n        Date endDate=null;\n        if(oConvertUtils.isNotEmpty(sysTenant)) {\n            beginDate=sysTenant.getBeginDate();\n            endDate=sysTenant.getEndDate();\n            sysTenant.setBeginDate(null);\n            sysTenant.setEndDate(null);\n        }\n        //---author:zhangyafei---date:20210916-----for: 租户管理添加日期范围查询---\n        QueryWrapper<SysTenant> queryWrapper = QueryGenerator.initQueryWrapper(sysTenant, req.getParameterMap());\n        //---author:zhangyafei---date:20210916-----for: 租户管理添加日期范围查询---\n        if(oConvertUtils.isNotEmpty(sysTenant)){\n            queryWrapper.ge(oConvertUtils.isNotEmpty(beginDate),\"begin_date\",beginDate);\n            queryWrapper.le(oConvertUtils.isNotEmpty(endDate),\"end_date\",endDate);\n        }\n        //---author:zhangyafei---date:20210916-----for: 租户管理添加日期范围查询---\n\t\tPage<SysTenant> page = new Page<SysTenant>(pageNo, pageSize);\n\t\tIPage<SysTenant> pageList = sysTenantService.page(page, queryWrapper);\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(pageList);\n\t\treturn result;\n\t}\n\n    /**\n     * 获取租户删除的列表\n     * @param sysTenant\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @GetMapping(\"/recycleBinPageList\")\n    @RequiresPermissions(\"system:tenant:recycleBinPageList\")\n    public Result<IPage<SysTenant>> recycleBinPageList(SysTenant sysTenant,@RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n                                                   @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,HttpServletRequest req){\n        Result<IPage<SysTenant>> result = new Result<IPage<SysTenant>>();\n        Page<SysTenant> page = new Page<SysTenant>(pageNo, pageSize);\n        IPage<SysTenant> pageList = sysTenantService.getRecycleBinPageList(page, sysTenant);\n        result.setSuccess(true);\n        result.setResult(pageList);\n        return result;\n    }\n    \n    /**\n     *   添加\n     * @param\n     * @return\n     */\n    @RequiresPermissions(\"system:tenant:add\")\n    @RequestMapping(value = \"/add\", method = RequestMethod.POST)\n    public Result<SysTenant> add(@RequestBody SysTenant sysTenant) {\n        Result<SysTenant> result = new Result();\n        if(sysTenant!=null && oConvertUtils.isNotEmpty(sysTenant.getId()) && sysTenantService.getById(sysTenant.getId())!=null){\n            return result.error500(\"该编号已存在!\");\n        }\n        try {\n            sysTenantService.saveTenant(sysTenant);\n            //添加默认产品包\n            sysTenantPackService.addTenantDefaultPack(sysTenant.getId());\n            result.success(\"添加成功！\");\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            result.error500(\"操作失败\");\n        }\n        return result;\n    }\n\n    /**\n     * [QQYUN-11032]【jeecg】租户套餐管理增加初始化套餐包按钮\n     * @param tenantId\n     * @return\n     * @author chenrui\n     * @date 2025/2/6 18:24\n     */\n    @RequiresPermissions(\"system:tenant:syncDefaultPack\")\n    @PostMapping(value = \"/syncDefaultPack\")\n    public Result<?> syncDefaultPack(@RequestParam(name=\"tenantId\",required=true) Integer tenantId) {\n        //同步默认产品包\n        sysTenantPackService.syncDefaultPack(tenantId);\n        return Result.OK(\"操作成功\");\n    }\n\n    /**\n     *  编辑\n     * @param\n     * @return\n     */\n    @RequiresPermissions(\"system:tenant:edit\")\n    @RequestMapping(value = \"/edit\", method ={RequestMethod.PUT, RequestMethod.POST})\n    public Result<SysTenant> edit(@RequestBody SysTenant tenant) {\n        Result<SysTenant> result = new Result();\n        SysTenant sysTenant = sysTenantService.getById(tenant.getId());\n        if(sysTenant==null) {\n           return result.error500(\"未找到对应实体\");\n        }\n        if(oConvertUtils.isEmpty(sysTenant.getHouseNumber())){\n            tenant.setHouseNumber(RandomUtil.randomStringUpper(6));\n        }\n        boolean ok = sysTenantService.updateById(tenant);\n        if(ok) {\n            result.success(\"修改成功!\");\n        }\n        return result;\n    }\n\n    /**\n     *   通过id删除\n     * @param id\n     * @return\n     */\n    @RequiresPermissions(\"system:tenant:delete\")\n    @RequestMapping(value = \"/delete\", method ={RequestMethod.DELETE, RequestMethod.POST})\n    public Result<?> delete(@RequestParam(name=\"id\",required=true) String id) {\n        //------------------------------------------------------------------\n        //如果是saas隔离的情况下，判断当前租户id是否是当前租户下的\n        if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n            //获取当前用户\n            LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n            SysTenant sysTenant = sysTenantService.getById(id);\n\n            String username = \"admin\";\n            String createdBy = sysUser.getUsername();\n            if (!sysTenant.getCreateBy().equals(createdBy) && !username.equals(createdBy)) {\n                baseCommonService.addLog(\"未经授权，不能删除非自己创建的租户，租户ID：\" + id + \"，操作人：\" + sysUser.getUsername(), CommonConstant.LOG_TYPE_2, CommonConstant.OPERATE_TYPE_3);\n                return Result.error(\"删除租户失败,当前操作人不是租户的创建人！\");\n            }\n        }\n        //------------------------------------------------------------------\n                \n        sysTenantService.removeTenantById(id);\n        return Result.ok(\"删除成功\");\n    }\n\n    /**\n     *  批量删除\n     * @param ids\n     * @return\n     */\n    @RequiresPermissions(\"system:tenant:deleteBatch\")\n    @RequestMapping(value = \"/deleteBatch\", method = RequestMethod.DELETE)\n    public Result<?> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n        Result<?> result = new Result<>();\n        if(oConvertUtils.isEmpty(ids)) {\n            result.error500(\"未选中租户！\");\n        }else {\n            String[] ls = ids.split(\",\");\n            // 过滤掉已被引用的租户\n            List<Integer> idList = new ArrayList<>();\n            for (String id : ls) {\n                //------------------------------------------------------------------\n                //如果是saas隔离的情况下，判断当前租户id是否是当前租户下的\n                if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n                    //获取当前用户\n                    LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n                    SysTenant sysTenant = sysTenantService.getById(id);\n\n                    String username = \"admin\";\n                    String createdBy = sysUser.getUsername();\n                    if (!sysTenant.getCreateBy().equals(createdBy) && !username.equals(createdBy)) {\n                        baseCommonService.addLog(\"未经授权，不能删除非自己创建的租户，租户ID：\" + id + \"，操作人：\" + sysUser.getUsername(), CommonConstant.LOG_TYPE_2, CommonConstant.OPERATE_TYPE_3);\n                        return Result.error(\"删除租户失败,当前操作人不是租户的创建人！\");\n                    }\n                }\n                //------------------------------------------------------------------\n                \n                idList.add(Integer.parseInt(id));\n            }\n            // 代码逻辑说明: 【QQYUN-5723】3、租户删除直接删除，不删除中间表------------\n            sysTenantService.removeByIds(idList);\n            result.success(\"删除成功！\");\n        }\n        return result;\n    }\n\n    /**\n     * 通过id查询\n     * @param id\n     * @return\n     */\n    @SignatureCheck\n    @RequestMapping(value = \"/queryById\", method = RequestMethod.GET)\n    public Result<SysTenant> queryById(@RequestParam(name=\"id\",required=true) String id) {\n        log.info(\"【敏感接口】查询租户信息，租户ID：{}\", id);\n        \n        Result<SysTenant> result = new Result<SysTenant>();\n        if(oConvertUtils.isEmpty(id)){\n            result.error500(\"参数为空！\");\n        }\n        //------------------------------------------------------------------------------------------------\n        //获取登录用户信息\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】, admin给特权可以管理所有租户\n        if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL && !\"admin\".equals(sysUser.getUsername())){\n            Integer loginSessionTenant = oConvertUtils.getInt(TenantContext.getTenant());\n            if(loginSessionTenant!=null && !loginSessionTenant.equals(Integer.valueOf(id))){\n                result.error500(\"无权限访问他人租户！\");\n                return result;\n            }\n        }\n        //------------------------------------------------------------------------------------------------\n        SysTenant sysTenant = sysTenantService.getById(id);\n        if(sysTenant==null) {\n            result.error500(\"未找到对应实体\");\n        }else {\n            result.setResult(sysTenant);\n            result.setSuccess(true);\n        }\n        return result;\n    }\n\n\n    /**\n     * 查询有效的 租户数据\n     * @return\n     */\n    @RequiresPermissions(\"system:tenant:queryList\")\n    @RequestMapping(value = \"/queryList\", method = RequestMethod.GET)\n    public Result<List<SysTenant>> queryList(@RequestParam(name=\"ids\",required=false) String ids) {\n        Result<List<SysTenant>> result = new Result<List<SysTenant>>();\n        LambdaQueryWrapper<SysTenant> query = new LambdaQueryWrapper<>();\n        query.eq(SysTenant::getStatus, 1);\n        if(oConvertUtils.isNotEmpty(ids)){\n            query.in(SysTenant::getId, ids.split(\",\"));\n        }\n        //此处查询忽略时间条件\n        List<SysTenant> ls = sysTenantService.list(query);\n        result.setSuccess(true);\n        result.setResult(ls);\n        return result;\n    }\n\n    /**\n     * 产品包分页列表查询\n     *\n     * @param sysTenantPack\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @GetMapping(value = \"/packList\")\n    @RequiresPermissions(\"system:tenant:packList\")\n    public Result<IPage<SysTenantPack>> queryPackPageList(SysTenantPack sysTenantPack,\n                                                          @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                                          @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                                          HttpServletRequest req) {\n        QueryWrapper<SysTenantPack> queryWrapper = QueryGenerator.initQueryWrapper(sysTenantPack, req.getParameterMap());\n        Page<SysTenantPack> page = new Page<SysTenantPack>(pageNo, pageSize);\n        IPage<SysTenantPack> pageList = sysTenantPackService.page(page, queryWrapper);\n        List<SysTenantPack> records = pageList.getRecords();\n        if (null != records && records.size() > 0) {\n            pageList.setRecords(sysTenantPackService.setPermissions(records));\n        }\n        return Result.OK(pageList);\n    }\n\n    /**\n     * 创建租户产品包\n     *\n     * @param sysTenantPack\n     * @return\n     */\n    @PostMapping(value = \"/addPackPermission\")\n    @RequiresPermissions(\"system:tenant:add:pack\")\n    public Result<String> addPackPermission(@RequestBody SysTenantPack sysTenantPack) {\n        sysTenantPackService.addPackPermission(sysTenantPack);\n        return Result.ok(\"创建租户产品包成功\");\n    }\n\n    /**\n     * 创建租户产品包\n     *\n     * @param sysTenantPack\n     * @return\n     */\n    @PutMapping(value = \"/editPackPermission\")\n    @RequiresPermissions(\"system:tenant:edit:pack\")\n    public Result<String> editPackPermission(@RequestBody SysTenantPack sysTenantPack) {\n        sysTenantPackService.editPackPermission(sysTenantPack);\n        return Result.ok(\"修改租户产品包成功\");\n    }\n\n    /**\n     * 批量删除用户菜单\n     *\n     * @param ids\n     * @return\n     */\n    @DeleteMapping(\"/deleteTenantPack\")\n    @RequiresPermissions(\"system:tenant:delete:pack\")\n    public Result<String> deleteTenantPack(@RequestParam(value = \"ids\") String ids) {\n        sysTenantPackService.deleteTenantPack(ids);\n        return Result.ok(\"删除租户产品包成功\");\n    }\n    \n\n\n    //===========【低代码应用，前端专用接口 —— 加入限制只能维护和查看自己拥有的租户】==========================================================\n    /**\n     *  查询当前用户的所有有效租户【低代码应用专用接口】\n     * @return\n     */\n    @RequestMapping(value = \"/getCurrentUserTenant\", method = RequestMethod.GET)\n    public Result<Map<String,Object>> getCurrentUserTenant() {\n        Result<Map<String,Object>> result = new Result<Map<String,Object>>();\n        try {\n            LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n            // 代码逻辑说明: [QQYUN-3371]租户逻辑改造，改成关系表------------\n            List<Integer> tenantIdList = relationService.getTenantIdsByUserId(sysUser.getId());\n            Map<String,Object> map = new HashMap(5);\n            if (null!=tenantIdList && tenantIdList.size()>0) {\n                // 该方法仅查询有效的租户，如果返回0个就说明所有的租户均无效。\n                List<SysTenant> tenantList = sysTenantService.queryEffectiveTenant(tenantIdList);\n                map.put(\"list\", tenantList);\n            }\n            result.setSuccess(true);\n            result.setResult(map);\n        }catch(Exception e) {\n            log.error(e.getMessage(), e);\n            result.error500(\"查询失败！\");\n        }\n        return result;\n    }\n\n    /**\n     * 邀请用户【低代码应用专用接口】\n     * @param ids\n     * @param phone\n     * @return\n     */\n    @SignatureCheck\n    @PutMapping(\"/invitationUserJoin\")\n    @RequiresPermissions(\"system:tenant:invitation:user\")\n    public Result<String> invitationUserJoin(@RequestParam(\"ids\") String ids,@RequestParam(value = \"phone\", required = false) String phone, @RequestParam(value = \"username\", required = false) String username){\n        if(oConvertUtils.isEmpty(phone) && oConvertUtils.isEmpty(username)){\n            return Result.error(\"手机号和用户账号不能同时为空！\");\n        }\n        sysTenantService.invitationUserJoin(ids,phone,username);\n        return Result.ok(\"邀请用户成功\");\n    }\n\n    /**\n     * 获取用户列表数据【低代码应用专用接口】\n     * @param user\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @RequestMapping(value = \"/getTenantUserList\", method = RequestMethod.GET)\n    @RequiresPermissions(\"system:tenant:user:list\")\n    public Result<IPage<SysUser>> getTenantUserList(SysUser user,\n                                                    @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n                                                    @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n                                                    @RequestParam(name=\"userTenantId\") String userTenantId,\n                                                    HttpServletRequest req) {\n        Result<IPage<SysUser>> result = new Result<>();\n        Page<SysUser> page = new Page<>(pageNo, pageSize);\n        Page<SysUser> pageList = relationService.getPageUserList(page,Integer.valueOf(userTenantId),user);\n        result.setSuccess(true);\n        result.setResult(pageList);\n        return result;\n    }\n\n    /**\n     * 请离用户租户【低代码应用专用接口】\n     * @param userIds\n     * @param tenantId\n     * @return\n     */\n    @PutMapping(\"/leaveTenant\")\n    @RequiresPermissions(\"system:tenant:leave\")\n    public Result<String> leaveTenant(@RequestParam(\"userIds\") String userIds,\n                                      @RequestParam(\"tenantId\") String tenantId){\n        Result<String> result = new Result<>();\n        //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL && !\"admin\".equals(sysUser.getUsername())){\n            Integer loginSessionTenant = oConvertUtils.getInt(TenantContext.getTenant());\n            if(loginSessionTenant!=null && !loginSessionTenant.equals(Integer.valueOf(tenantId))){\n                result.error500(\"无权限访问他人租户！\");\n                return result;\n            }\n        }\n        sysTenantService.leaveTenant(userIds,tenantId);\n        return Result.ok(\"请离成功\");\n    }\n\n    /**\n     *  编辑（只允许修改自己拥有的租户）【低代码应用专用接口】\n     * @param\n     * @return\n     */\n    @RequestMapping(value = \"/editOwnTenant\", method ={RequestMethod.PUT, RequestMethod.POST})\n    public Result<SysTenant> editOwnTenant(@RequestBody SysTenant tenant,HttpServletRequest req) {\n        Result<SysTenant> result = new Result();\n        String tenantId = TokenUtils.getTenantIdByRequest(req);\n        if(!tenantId.equals(tenant.getId().toString())){\n            return result.error500(\"无权修改他人租户！\");\n        }\n\n        SysTenant sysTenant = sysTenantService.getById(tenant.getId());\n        if(sysTenant==null) {\n            return result.error500(\"未找到对应实体\");\n        }\n        if(oConvertUtils.isEmpty(sysTenant.getHouseNumber())){\n            tenant.setHouseNumber(RandomUtil.randomStringUpper(6));\n        }\n        boolean ok = sysTenantService.updateById(tenant);\n        if(ok) {\n            result.success(\"修改成功!\");\n        }\n        return result;\n    }\n    \n    /**\n     * 创建租户并且将用户保存到中间表【低代码应用专用接口】\n     * @param sysTenant\n     */\n    @PostMapping(\"/saveTenantJoinUser\")\n    public Result<Integer> saveTenantJoinUser(@RequestBody SysTenant sysTenant){\n        Result<Integer> result = new Result<>();\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        Integer tenantId = sysTenantService.saveTenantJoinUser(sysTenant, sysUser.getId());\n        result.setSuccess(true);\n        result.setMessage(\"创建成功\");\n        result.setResult(tenantId);\n        return result;\n    }\n\n    /**\n     * 申请加入租户通过门牌号【低代码应用专用接口】\n     * @param sysTenant\n     */\n    @SignatureCheck\n    @PostMapping(\"/joinTenantByHouseNumber\")\n    public Result<Integer> joinTenantByHouseNumber(@RequestBody SysTenant sysTenant){\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        Integer tenantId = sysTenantService.joinTenantByHouseNumber(sysTenant, sysUser.getId());\n        Result<Integer> result = new Result<>();\n        if(tenantId != 0){\n            result.setMessage(\"申请加入组织成功\");\n            result.setSuccess(true);\n            result.setResult(tenantId);\n            return result;\n        }else{\n            result.setMessage(\"该门牌号不存在\");\n            result.setSuccess(false);\n            return result;\n        }\n    }\n    \n    /**\n     * 分页获取租户用户数据(vue3用户租户页面)【低代码应用专用接口】\n     *\n     * @param pageNo\n     * @param pageSize\n     * @param userTenantStatus\n     * @param type\n     * @param req\n     * @return\n     */\n    @GetMapping(\"/getUserTenantPageList\")\n    //@RequiresPermissions(\"system:tenant:tenantPageList\")\n    public Result<IPage<SysUserTenantVo>> getUserTenantPageList(@RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                                                @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                                                @RequestParam(name = \"userTenantStatus\") String userTenantStatus,\n                                                                @RequestParam(name = \"type\", required = false) String type,\n                                                                SysUser user,\n                                                                HttpServletRequest req) {\n        Page<SysUserTenantVo> page = new Page<SysUserTenantVo>(pageNo, pageSize);\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        String tenantId = oConvertUtils.getString(TenantContext.getTenant(), \"0\");\n        IPage<SysUserTenantVo> list = relationService.getUserTenantPageList(page, Arrays.asList(userTenantStatus.split(SymbolConstant.COMMA)), user, Integer.valueOf(tenantId));\n        return Result.ok(list);\n    }\n\n    /**\n     * 通过用户id获取租户列表【低代码应用专用接口】\n     *\n     * @param userTenantStatus 关系表的状态\n     * @return\n     */\n    @GetMapping(\"/getTenantListByUserId\")\n    //@RequiresPermissions(\"system:tenant:getTenantListByUserId\")\n    public Result<List<SysUserTenantVo>> getTenantListByUserId(@RequestParam(name = \"userTenantStatus\", required = false) String userTenantStatus) {\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        List<String> list = null;\n        if (oConvertUtils.isNotEmpty(userTenantStatus)) {\n            list = Arrays.asList(userTenantStatus.split(SymbolConstant.COMMA));\n        }\n        //租户状态，用户id,租户用户关系状态\n        List<SysUserTenantVo> sysTenant = relationService.getTenantListByUserId(sysUser.getId(), list);\n        return Result.ok(sysTenant);\n    }\n\n    /**\n     * 【敲敲云管理员】 同意申请者加入租户\n     * \n     * 更新用户租户关系状态【低代码应用专用接口】\n     */\n    @PutMapping(\"/updateUserTenantStatus\")\n    @RequiresPermissions(\"system:tenant:updateUserTenantStatus\")\n    public Result<String> updateUserTenantStatus(@RequestBody SysUserTenant userTenant) {\n        String tenantId = TenantContext.getTenant();\n        if (oConvertUtils.isEmpty(tenantId)) {\n            return Result.error(\"未找到当前租户信息\"); \n        }\n        relationService.updateUserTenantStatus(userTenant.getUserId(), tenantId, userTenant.getStatus());\n        return Result.ok(\"更新用户租户状态成功\");\n    }\n\n    /**\n     * 同意或者拒绝用户加入（敲敲云专用）\n     * @param userTenant\n     * @return\n     */\n    @PutMapping(\"/agreeOrRejectUserJoin\")\n    public Result<String> agreeOrRejectUserJoin(@RequestBody SysUserTenant userTenant) {\n        String tenantId = TenantContext.getTenant();\n        if (oConvertUtils.isEmpty(tenantId)) {\n            return Result.error(\"未找到当前租户信息\");\n        }\n        sysTenantPackService.izHaveManageUserAuth(tenantId);\n        relationService.updateUserTenantStatus(userTenant.getUserId(), tenantId, userTenant.getStatus());\n        return Result.ok(\"更新用户租户状态成功\");\n    }\n\n    /**\n     * 注销租户【低代码应用专用接口】\n     *\n     * @param sysTenant\n     * @return\n     */\n    @PutMapping(\"/cancelTenant\")\n    //@RequiresPermissions(\"system:tenant:cancelTenant\")\n    public Result<String> cancelTenant(@RequestBody SysTenant sysTenant,HttpServletRequest request) {\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        SysTenant tenant = sysTenantService.getById(sysTenant.getId());\n        if (null == tenant) {\n            return Result.error(\"未找到当前租户信息\");\n        }\n        if (!sysUser.getUsername().equals(tenant.getCreateBy())) {\n            return Result.error(\"无权限，只能注销自己创建的租户！\");\n        }\n        SysUser userById = sysUserService.getById(sysUser.getId());\n        String loginPassword = request.getParameter(\"loginPassword\");\n        String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(),loginPassword, userById.getSalt());\n        if (!passwordEncode.equals(userById.getPassword())) {\n            return Result.error(\"密码不正确\");\n        }\n        sysTenantService.removeById(sysTenant.getId());\n        return Result.ok(\"注销成功\");\n    }\n\n    /**\n     * 获取租户用户不同状态下的数量【低代码应用专用接口】\n     * @return\n     */\n    @GetMapping(\"/getTenantStatusCount\")\n    public Result<Long> getTenantStatusCount(@RequestParam(value = \"status\",defaultValue = \"1\") String status, HttpServletRequest req){\n        String tenantId = TokenUtils.getTenantIdByRequest(req);\n        if (null == tenantId) {\n            return Result.error(\"未找到当前租户信息\");\n        }\n        LambdaQueryWrapper<SysUserTenant> query = new LambdaQueryWrapper<>();\n        query.eq(SysUserTenant::getTenantId,tenantId);\n        query.eq(SysUserTenant::getStatus,status);\n        long count = relationService.count(query);\n        return Result.ok(count);\n    }\n\n    /**\n     * 用户取消租户申请【低代码应用专用接口】\n     * @param tenantId\n     * @return\n     */\n    @PutMapping(\"/cancelApplyTenant\")\n    public Result<String> cancelApplyTenant(@RequestParam(\"tenantId\") String tenantId){\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        sysTenantService.leaveTenant(sysUser.getId(),tenantId);\n        return Result.ok(\"取消申请成功\");\n    }\n\n    //===========【低代码应用，前端专用接口 —— 加入限制只能维护和查看自己拥有的租户】==========================================================\n\n    /**\n     * 彻底删除租户\n     * @param ids\n     * @return\n     */\n    @DeleteMapping(\"/deleteLogicDeleted\")\n    @RequiresPermissions(\"system:tenant:deleteTenantLogic\")\n    public Result<String> deleteTenantLogic(@RequestParam(\"ids\") String ids){\n        sysTenantService.deleteTenantLogic(ids);\n        return Result.ok(\"彻底删除成功\");\n    }\n\n    /**\n     * 还原删除的租户\n     * @param ids\n     * @return\n     */\n    @PutMapping(\"/revertTenantLogic\")\n    @RequiresPermissions(\"system:tenant:revertTenantLogic\")\n    public Result<String> revertTenantLogic(@RequestParam(\"ids\") String ids){\n        sysTenantService.revertTenantLogic(ids);\n        return Result.ok(\"还原成功\");\n    }\n\n    /**\n     * 退出租户【低代码应用专用接口】\n     * @param sysTenant\n     * @param request\n     * @return\n     */\n    @DeleteMapping(\"/exitUserTenant\")\n    public Result<String> exitUserTenant(@RequestBody SysTenant sysTenant,HttpServletRequest request){\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        //验证用户是否已存在\n        Integer count = relationService.userTenantIzExist(sysUser.getId(),sysTenant.getId());\n        if (count == 0) {\n            return Result.error(\"此租户下没有当前用户\");\n        }\n        //验证密码\n        String loginPassword = request.getParameter(\"loginPassword\");\n        SysUser userById = sysUserService.getById(sysUser.getId());\n        String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(),loginPassword, userById.getSalt());\n        if (!passwordEncode.equals(userById.getPassword())) {\n            return Result.error(\"密码不正确\");\n        }\n        //退出登录\n        sysTenantService.exitUserTenant(sysUser.getId(),sysUser.getUsername(),String.valueOf(sysTenant.getId()));\n        return Result.ok(\"退出租户成功\");\n    }\n\n    /**\n     * 变更租户拥有者【低代码应用专用接口】\n     * @param userId\n     * @return\n     */\n    @PostMapping(\"/changeOwenUserTenant\")\n    public Result<String> changeOwenUserTenant(@RequestParam(\"userId\") String userId,\n                                               @RequestParam(\"tenantId\") String tenantId){\n        sysTenantService.changeOwenUserTenant(userId,tenantId);\n        return Result.ok(\"退出租户成功\");\n    }\n\n    /**\n     * 邀请用户到租户,通过手机号匹配 【低代码应用专用接口】\n     * @param phone\n     * @param departId\n     * @return\n     */\n    @SignatureCheck\n    @RequiresPermissions(\"system:tenant:invitation:user\")\n    @PostMapping(\"/invitationUser\")\n    public Result<String> invitationUser(@RequestParam(name=\"phone\") String phone,\n                                         @RequestParam(name=\"departId\",defaultValue = \"\") String departId){\n        return sysTenantService.invitationUser(phone,departId);\n    }\n\n\n    /**\n     * 获取 租户产品包-3个默认admin的人员数量\n     * @param tenantId\n     * @return\n     */\n    @GetMapping(\"/loadAdminPackCount\")\n    public Result<List<TenantPackUserCount>> loadAdminPackCount(@RequestParam(\"tenantId\") Integer tenantId){\n        List<TenantPackUserCount> list = sysTenantService.queryTenantPackUserCount(tenantId);\n        return Result.ok(list);\n    }\n\n    /**\n     * 查询租户产品包信息\n     * @param packModel\n     * @return\n     */\n    @GetMapping(\"/getTenantPackInfo\")\n    public Result<TenantPackModel> getTenantPackInfo(TenantPackModel packModel){\n        TenantPackModel tenantPackModel = sysTenantService.queryTenantPack(packModel);\n        return Result.ok(tenantPackModel);\n    }\n\n\n    /**\n     * 添加用户和产品包的关系数据\n     * @param sysTenantPackUser\n     * @return\n     */\n    @PostMapping(\"/addTenantPackUser\")\n    public Result<?> addTenantPackUser(@RequestBody SysTenantPackUser sysTenantPackUser){\n        sysTenantService.addBatchTenantPackUser(sysTenantPackUser);\n        return Result.ok(\"操作成功！\");\n    }\n\n    /**\n     * 从产品包移除用户\n     * @param sysTenantPackUser\n     * @return\n     */\n    @PutMapping(\"/deleteTenantPackUser\")\n    public Result<?> deleteTenantPackUser(@RequestBody SysTenantPackUser sysTenantPackUser){\n        sysTenantService.deleteTenantPackUser(sysTenantPackUser);\n        return Result.ok(\"操作成功！\");\n    }\n\n\n    /**\n     * 修改申请状态\n     * @param sysTenant\n     * @return\n     */\n    @PutMapping(\"/updateApplyStatus\")\n    public Result<?> updateApplyStatus(@RequestBody SysTenant sysTenant){\n        SysTenant entity = this.sysTenantService.getById(sysTenant.getId());\n        if(entity==null){\n            return Result.error(\"租户不存在!\");\n        }\n        entity.setApplyStatus(sysTenant.getApplyStatus());\n        sysTenantService.updateById(entity);\n        return Result.ok(\"\");\n    }\n\n\n    /**\n     * 获取产品包人员申请列表\n     * @param tenantId\n     * @return\n     */\n    @GetMapping(\"/getTenantPackApplyUsers\")\n    public Result<?> getTenantPackApplyUsers(@RequestParam(\"tenantId\") Integer tenantId){\n        List<TenantPackUser> list = sysTenantService.getTenantPackApplyUsers(tenantId);\n        return Result.ok(list);\n    }\n\n    /**\n     * 个人 申请成为管理员\n     * @param sysTenantPackUser\n     * @return\n     */\n    @PostMapping(\"/doApplyTenantPackUser\")\n    public Result<?> doApplyTenantPackUser(@RequestBody SysTenantPackUser sysTenantPackUser){\n        sysTenantService.doApplyTenantPackUser(sysTenantPackUser);\n        return Result.ok(\"申请成功！\");\n    }\n\n    /**\n     * 申请通过 成为管理员\n     * @param sysTenantPackUser\n     * @return\n     */\n    @PutMapping(\"/passApply\")\n    public Result<?> passApply(@RequestBody SysTenantPackUser sysTenantPackUser){\n        sysTenantService.passApply(sysTenantPackUser);\n        return Result.ok(\"操作成功！\");\n    }\n\n    /**\n     *  拒绝申请 成为管理员\n     * @param sysTenantPackUser\n     * @return\n     */\n    @PutMapping(\"/deleteApply\")\n    public Result<?> deleteApply(@RequestBody SysTenantPackUser sysTenantPackUser){\n        sysTenantService.deleteApply(sysTenantPackUser);\n        return Result.ok(\"\");\n    }\n\n    /**\n     * 查看是否已经申请过了超级管理员\n     * @return\n     */\n    @GetMapping(\"/getApplySuperAdminCount\")\n    public Result<Long> getApplySuperAdminCount(){\n        Long count = sysTenantService.getApplySuperAdminCount();\n        return Result.ok(count);\n    }\n\n    /**\n     * 进入应用组织页面 查询租户信息及当前用户是否有 管理员的权限--\n     * @param id\n     * @return\n     */\n    @RequestMapping(value = \"/queryTenantAuthInfo\", method = RequestMethod.GET)\n    public Result<TenantDepartAuthInfo> queryTenantAuthInfo(@RequestParam(name=\"id\",required=true) String id) {\n        TenantDepartAuthInfo info = sysTenantService.getTenantDepartAuthInfo(Integer.parseInt(id));\n        return Result.ok(info);\n    }\n\n    /**\n     * 获取产品包下的用户列表(分页)\n     * @param tenantId\n     * @param packId\n     * @param status\n     * @param pageNo\n     * @param pageSize\n     * @return\n     */\n    @GetMapping(\"/queryTenantPackUserList\")\n    public Result<IPage<TenantPackUser>> queryTenantPackUserList(@RequestParam(\"tenantId\") String tenantId,\n                                                                 @RequestParam(\"packId\") String packId,\n                                                                 @RequestParam(\"status\") Integer status,\n                                                                 @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n                                                                 @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize){\n        Page<TenantPackUser> page = new Page<>(pageNo,pageSize);\n        IPage<TenantPackUser> pageList = sysTenantService.queryTenantPackUserList(tenantId,packId,status,page);\n        return Result.ok(pageList);\n    }\n\n    /**\n     * 获取当前租户下的部门和成员数量\n     */\n    @GetMapping(\"/getTenantCount\")\n    public Result<Map<String,Long>> getTenantCount(HttpServletRequest request){\n        Map<String,Long> map = new HashMap<>();\n        // 代码逻辑说明: 【QQYUN-7177】用户数量显示不正确---\n        if(oConvertUtils.isEmpty(TokenUtils.getTenantIdByRequest(request))){\n            return Result.error(\"当前租户为空，禁止访问！\");\n        }\n        Integer tenantId = oConvertUtils.getInt(TokenUtils.getTenantIdByRequest(request));\n        Long userCount = relationService.getUserCount(tenantId,CommonConstant.USER_TENANT_NORMAL);\n        map.put(\"userCount\",userCount);\n        LambdaQueryWrapper<SysDepart> departQuery = new LambdaQueryWrapper<>();\n        departQuery.eq(SysDepart::getDelFlag,String.valueOf(CommonConstant.DEL_FLAG_0));\n        departQuery.eq(SysDepart::getTenantId,tenantId);\n        //部门状态暂时没用，先注释掉\n        //departQuery.eq(SysDepart::getStatus,CommonConstant.STATUS_1);\n        long departCount = sysDepartService.count(departQuery);\n        map.put(\"departCount\",departCount);\n        return Result.ok(map);\n    }\n\n    /**\n     * 通过用户id获取租户列表（分页）\n     *\n     * @param sysUserTenantVo\n     * @return\n     */\n    @GetMapping(\"/getTenantPageListByUserId\")\n    public Result<IPage<SysTenant>> getTenantPageListByUserId(SysUserTenantVo sysUserTenantVo,\n                                                              @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n                                                              @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize) {\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        List<String> list = null;\n        String userTenantStatus = sysUserTenantVo.getUserTenantStatus();\n        if (oConvertUtils.isNotEmpty(userTenantStatus)) {\n            list = Arrays.asList(userTenantStatus.split(SymbolConstant.COMMA));\n        }\n        Page<SysTenant> page = new Page<>(pageNo,pageSize);\n        IPage<SysTenant> pageList = relationService.getTenantPageListByUserId(page,sysUser.getId(),list,sysUserTenantVo);\n        return Result.ok(pageList);\n    }\n\n    /** 【被邀请人使用】\n     * 同意或拒绝加入租户\n     */\n    @SignatureCheck\n    @PutMapping(\"/agreeOrRefuseJoinTenant\")\n    public Result<String> agreeOrRefuseJoinTenant(@RequestParam(\"tenantId\") Integer tenantId, \n                                                  @RequestParam(\"status\") String status){\n        //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        String userId = sysUser.getId();\n        SysTenant tenant = sysTenantService.getById(tenantId);\n        if(null == tenant){\n            return Result.error(\"不存在该组织\");\n        }\n        SysUserTenant sysUserTenant = relationService.getUserTenantByTenantId(userId, tenantId);\n        if (null == sysUserTenant) {\n            return Result.error(\"该用户不存在该组织中，无权修改\");\n        }\n        String content = \"\";\n        SysUser user = new SysUser();\n        user.setUsername(sysUserTenant.getCreateBy());\n        String realname = oConvertUtils.getString(sysUser.getRealname(),sysUser.getUsername());\n        //成功加入\n        if(CommonConstant.USER_TENANT_NORMAL.equals(status)){\n            //修改租户状态\n            relationService.agreeJoinTenant(userId,tenantId);\n            content = content + realname + \"已同意您发送的加入 \" + tenant.getName() + \" 的邀请\";\n            sysTenantService.sendMsgForAgreeAndRefuseJoin(user, content);\n            return Result.OK(\"您已同意该组织的邀请\");\n        }else if(CommonConstant.USER_TENANT_REFUSE.equals(status)){\n            //直接删除关系表即可\n            relationService.refuseJoinTenant(userId,tenantId);\n            content = content + realname + \"拒绝了您发送的加入 \" + tenant.getName() + \" 的邀请\";\n            sysTenantService.sendMsgForAgreeAndRefuseJoin(user, content);\n            return Result.OK(\"您已成功拒绝该组织的邀请\");\n        }\n        return Result.error(\"类型不匹配，禁止修改数据\");\n    }\n    \n    /**\n     * 目前只给敲敲云租户下删除用户使用\n     * \n     * 根据密码删除用户\n     */\n    @DeleteMapping(\"/deleteUserByPassword\")\n    public Result<String> deleteUserByPassword(@RequestBody SysUser sysUser,HttpServletRequest request){\n        Integer tenantId = oConvertUtils.getInteger(TokenUtils.getTenantIdByRequest(request), null);\n        sysTenantService.deleteUserByPassword(sysUser, tenantId);\n        return Result.ok(\"删除用户成功\");\n    }\n\n    /**\n     *  查询当前用户的所有有效租户【知识库专用接口】\n     * @return\n     */\n    @RequestMapping(value = \"/getCurrentUserTenantForFile\", method = RequestMethod.GET)\n    public Result<Map<String,Object>> getCurrentUserTenantForFile() {\n        Result<Map<String,Object>> result = new Result<Map<String,Object>>();\n        try {\n            LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n            List<SysTenant> tenantList = sysTenantService.getTenantListByUserId(sysUser.getId());\n            Map<String,Object> map = new HashMap<>(5);\n            //在开启saas租户隔离的时候并且租户数据不为空，则返回租户信息\n            if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL && CollectionUtil.isNotEmpty(tenantList)) {\n                map.put(\"list\", tenantList);\n            }\n            result.setSuccess(true);\n            result.setResult(map);\n        }catch(Exception e) {\n            log.error(e.getMessage(), e);\n            result.error500(\"查询失败！\");\n        }\n        return result;\n    }\n\n    /**\n     * 目前只给敲敲云人员与部门下的用户删除使用\n     *\n     * 删除用户\n     */\n    @DeleteMapping(\"/deleteUser\")\n    public Result<String> deleteUser(@RequestBody SysUser sysUser,HttpServletRequest request){\n        Integer tenantId = oConvertUtils.getInteger(TokenUtils.getTenantIdByRequest(request), null);\n        sysTenantService.deleteUser(sysUser, tenantId);\n        return Result.ok(\"删除用户成功\");\n    }\n\n    /**\n     * 根据租户id和用户id获取用户的产品包列表和当前用户下的产品包id\n     *\n     * @param tenantId\n     * @param request\n     * @return\n     */\n    @GetMapping(\"/listPackByTenantUserId\")\n    public Result<Map<String, Object>> listPackByTenantUserId(@RequestParam(\"tenantId\") String tenantId,\n                                                              @RequestParam(\"userId\") String userId,\n                                                              HttpServletRequest request) {\n        if (null == tenantId) {\n            return null;\n        }\n        List<SysTenantPack> list = sysTenantPackService.getPackListByTenantId(tenantId);\n        List<String> userPackIdList = sysTenantPackService.getPackIdByUserIdAndTenantId(userId, oConvertUtils.getInt(tenantId));\n        Map<String, Object> map = new HashMap<>(5);\n        map.put(\"packList\", list);\n        map.put(\"userPackIdList\", userPackIdList);\n        return Result.ok(map);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUploadController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.util.CommonUtils;\nimport org.jeecg.common.util.MinioUtil;\nimport org.jeecg.common.util.filter.SsrfFileTypeFilter;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.oss.entity.OssFile;\nimport org.jeecg.modules.oss.service.IOssFileService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\n\nimport jakarta.servlet.http.HttpServletRequest;\n\n/**\n * minio文件上传示例\n * @author: jeecg-boot\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/sys/upload\")\npublic class SysUploadController {\n    @Autowired\n    private IOssFileService ossFileService;\n\n    /**\n     * 上传\n     * @param request\n     */\n    @PostMapping(value = \"/uploadMinio\")\n    public Result<?> uploadMinio(HttpServletRequest request) throws Exception {\n        Result<?> result = new Result<>();\n        // 获取业务路径\n        String bizPath = request.getParameter(\"biz\");\n        // 获取上传文件对象\n        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n        MultipartFile file = multipartRequest.getFile(\"file\");\n        \n        // 文件安全校验，防止上传漏洞文件\n        SsrfFileTypeFilter.checkUploadFileType(file, bizPath);\n\n        if(oConvertUtils.isEmpty(bizPath)){\n            bizPath = \"\";\n        }\n        // 获取文件名\n        String orgName = file.getOriginalFilename();\n        orgName = CommonUtils.getFileName(orgName);\n        String fileUrl =  MinioUtil.upload(file,bizPath);\n        if(oConvertUtils.isEmpty(fileUrl)){\n            return Result.error(\"上传失败,请检查配置信息是否正确!\");\n        }\n        //保存文件信息\n        OssFile minioFile = new OssFile();\n        minioFile.setFileName(orgName);\n        minioFile.setUrl(fileUrl);\n        ossFileService.save(minioFile);\n        result.setMessage(fileUrl);\n        result.setSuccess(true);\n        return result;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java",
    "content": "package org.jeecg.modules.system.controller;\n\n\nimport cn.hutool.core.util.RandomUtil;\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.apache.shiro.SecurityUtils;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.apache.shiro.authz.annotation.RequiresRoles;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.aspect.annotation.PermissionData;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CacheConstant;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.PasswordConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.modules.redis.client.JeecgRedisClient;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.*;\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.modules.base.service.BaseCommonService;\nimport org.jeecg.modules.system.entity.*;\nimport org.jeecg.modules.system.excelstyle.ExcelExportSysUserStyle;\nimport org.jeecg.modules.system.model.DepartIdModel;\nimport org.jeecg.modules.system.model.SysUserSysDepPostModel;\nimport org.jeecg.modules.system.model.SysUserSysDepartModel;\nimport org.jeecg.modules.system.service.*;\nimport org.jeecg.modules.system.util.ImportSysUserCache;\nimport org.jeecg.modules.system.vo.SysDepartUsersVO;\nimport org.jeecg.modules.system.vo.SysUserExportVo;\nimport org.jeecg.modules.system.vo.SysUserRoleVO;\nimport org.jeecg.modules.system.vo.lowapp.DepartAndUserInfo;\nimport org.jeecg.modules.system.vo.lowapp.UpdateDepartInfo;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.enmus.ExcelType;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLEncoder;\nimport java.util.*;\nimport java.util.stream.Collectors;\n\n/**\n * <p>\n * 用户表 前端控制器\n * </p>\n *\n * @Author scott\n * @since 2018-12-20\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/sys/user\")\npublic class SysUserController {\n\n\t@Autowired\n\tprivate ISysUserService sysUserService;\n\n    @Autowired\n    private ISysDepartService sysDepartService;\n\n\t@Autowired\n\tprivate ISysUserRoleService sysUserRoleService;\n\n\t@Autowired\n\tprivate ISysUserDepartService sysUserDepartService;\n\n    @Autowired\n    private ISysDepartRoleUserService departRoleUserService;\n\n    @Autowired\n    private ISysDepartRoleService departRoleService;\n\n\t@Autowired\n\tprivate RedisUtil redisUtil;\n\n    @Value(\"${jeecg.path.upload}\")\n    private String upLoadPath;\n\n    @Autowired\n    private BaseCommonService baseCommonService;\n\n    @Autowired\n    private ISysPositionService sysPositionService;\n\n    @Autowired\n    private ISysUserTenantService userTenantService;\n\n    @Autowired\n    private JeecgRedisClient jeecgRedisClient;\n    @Autowired\n    private JeecgBaseConfig jeecgBaseConfig;\n    \n    /**\n     * 获取租户下用户数据（支持租户隔离）\n     * @param user\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @PermissionData(pageComponent = \"system/UserList\")\n\t@RequestMapping(value = \"/list\", method = RequestMethod.GET)\n\tpublic Result<IPage<SysUser>> queryPageList(SysUser user,@RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,HttpServletRequest req) {\n\t\tQueryWrapper<SysUser> queryWrapper = QueryGenerator.initQueryWrapper(user, req.getParameterMap());\n        //------------------------------------------------------------------------------------------------\n        //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n        if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n            String tenantId = oConvertUtils.getString(TenantContext.getTenant(), \"-1\");\n            List<String> userIds = userTenantService.getUserIdsByTenantId(Integer.valueOf(tenantId));\n            if (oConvertUtils.listIsNotEmpty(userIds)) {\n                queryWrapper.in(\"id\", userIds);\n            }else{\n                queryWrapper.eq(\"id\", \"通过租户查询不到任何用户\");\n            }\n        }\n        //------------------------------------------------------------------------------------------------\n        return sysUserService.queryPageList(req, queryWrapper, pageSize, pageNo);\n\t}\n\n    /**\n     * 获取系统用户数据（查询全部用户，不做租户隔离）\n     *\n     * @param user\n     * @param pageNo\n     * @param pageSize\n     * @param req\n     * @return\n     */\n    @RequiresPermissions(\"system:user:listAll\")\n    @RequestMapping(value = \"/listAll\", method = RequestMethod.GET)\n    public Result<IPage<SysUser>> queryAllPageList(SysUser user, @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                                   @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize, HttpServletRequest req) {\n        QueryWrapper<SysUser> queryWrapper = QueryGenerator.initQueryWrapper(user, req.getParameterMap());\n        return sysUserService.queryPageList(req, queryWrapper, pageSize, pageNo);\n    }\n\n    @RequiresPermissions(\"system:user:add\")\n\t@RequestMapping(value = \"/add\", method = RequestMethod.POST)\n\tpublic Result<SysUser> add(@RequestBody JSONObject jsonObject) {\n\t\tResult<SysUser> result = new Result<SysUser>();\n\t\tString selectedRoles = jsonObject.getString(\"selectedroles\");\n\t\tString selectedDeparts = jsonObject.getString(\"selecteddeparts\");\n\t\ttry {\n\t\t\tSysUser user = JSON.parseObject(jsonObject.toJSONString(), SysUser.class);\n\t\t\tuser.setCreateTime(new Date());//设置创建时间\n\t\t\tString salt = oConvertUtils.randomGen(8);\n\t\t\tuser.setSalt(salt);\n\t\t\tString passwordEncode = PasswordUtil.encrypt(user.getUsername(), user.getPassword(), salt);\n\t\t\tuser.setPassword(passwordEncode);\n\t\t\tuser.setStatus(1);\n\t\t\tuser.setDelFlag(CommonConstant.DEL_FLAG_0);\n\t\t\t//用户表字段org_code不能在这里设置他的值\n            user.setOrgCode(null);\n            user.setLastPwdUpdateTime(new Date());\n\t\t\t// 保存用户走一个service 保证事务\n            //获取租户ids\n            String relTenantIds = jsonObject.getString(\"relTenantIds\");\n            sysUserService.saveUser(user, selectedRoles, selectedDeparts, relTenantIds, false);\n            baseCommonService.addLog(\"添加用户，username： \" +user.getUsername() ,CommonConstant.LOG_TYPE_2, 2);\n\t\t\tresult.success(\"添加成功！\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\tresult.error500(\"操作失败\");\n\t\t}\n\t\treturn result;\n\t}\n\n    @RequiresPermissions(\"system:user:edit\")\n\t@RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n\tpublic Result<SysUser> edit(@RequestBody JSONObject jsonObject) {\n\t\tResult<SysUser> result = new Result<SysUser>();\n\t\ttry {\n\t\t\tSysUser sysUser = sysUserService.getById(jsonObject.getString(\"id\"));\n\t\t\tbaseCommonService.addLog(\"编辑用户，username： \" +sysUser.getUsername() ,CommonConstant.LOG_TYPE_2, 2);\n\t\t\tif(sysUser==null) {\n\t\t\t\tresult.error500(\"未找到对应实体\");\n\t\t\t}else {\n\t\t\t\tSysUser user = JSON.parseObject(jsonObject.toJSONString(), SysUser.class);\n\t\t\t\tuser.setUpdateTime(new Date());\n\t\t\t\t//String passwordEncode = PasswordUtil.encrypt(user.getUsername(), user.getPassword(), sysUser.getSalt());\n\t\t\t\tuser.setPassword(sysUser.getPassword());\n\t\t\t\tString roles = jsonObject.getString(\"selectedroles\");\n                String departs = jsonObject.getString(\"selecteddeparts\");\n                if(oConvertUtils.isEmpty(departs)){\n                    //vue3.0前端只传递了departIds\n                    departs=user.getDepartIds();\n                }\n                //用户表字段org_code不能在这里设置他的值\n                user.setOrgCode(null);\n                // 修改用户走一个service 保证事务\n                //获取租户ids\n                String relTenantIds = jsonObject.getString(\"relTenantIds\");\n                String updateFromPage = jsonObject.getString(\"updateFromPage\");\n                //update-begin---author:wangshuai---date:2025-11-12---for:【JHHB-776】用户编辑，应该从数据库查出老数据，页面传递什么字段，把这些字段覆盖数据库查询结果，再更新---\n                oConvertUtils.copyNonNullFields(user, sysUser);\n                sysUserService.editUser(sysUser, roles, departs, relTenantIds, updateFromPage);\n                //update-end---author:wangshuai---date:2025-11-12---for:【JHHB-776】用户编辑，应该从数据库查出老数据，页面传递什么字段，把这些字段覆盖数据库查询结果，再更新---\n\t\t\t\tresult.success(\"修改成功!\");\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\tresult.error500(\"操作失败\");\n\t\t}\n\t\treturn result;\n\t}\n\n    /**\n     * 添加用户【后台租户模式专用，敲敲云不要用这个】\n     *\n     * @param jsonObject\n     * @return\n     */\n    @RequiresPermissions(\"system:user:addTenantUser\")\n    @RequestMapping(value = \"/addTenantUser\", method = RequestMethod.POST)\n    public Result<SysUser> addTenantUser(@RequestBody JSONObject jsonObject) {\n        Result<SysUser> result = new Result<SysUser>();\n        String selectedRoles = jsonObject.getString(\"selectedroles\");\n        String selectedDeparts = jsonObject.getString(\"selecteddeparts\");\n        try {\n            SysUser user = JSON.parseObject(jsonObject.toJSONString(), SysUser.class);\n            user.setCreateTime(new Date());//设置创建时间\n            String salt = oConvertUtils.randomGen(8);\n            user.setSalt(salt);\n            String passwordEncode = PasswordUtil.encrypt(user.getUsername(), user.getPassword(), salt);\n            user.setPassword(passwordEncode);\n            user.setStatus(1);\n            user.setDelFlag(CommonConstant.DEL_FLAG_0);\n            //用户表字段org_code不能在这里设置他的值\n            user.setOrgCode(null);\n            // 保存用户走一个service 保证事务\n            //获取租户ids\n            String relTenantIds = jsonObject.getString(\"relTenantIds\");\n            sysUserService.saveUser(user, selectedRoles, selectedDeparts, relTenantIds, true);\n            baseCommonService.addLog(\"添加用户，username： \" + user.getUsername(), CommonConstant.LOG_TYPE_2, 2);\n            result.success(\"添加成功！\");\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            result.error500(\"操作失败\");\n        }\n        return result;\n    }\n\n\t/**\n\t * 删除用户\n\t */\n    @RequiresPermissions(\"system:user:delete\")\n\t@RequestMapping(value = \"/delete\", method = RequestMethod.DELETE)\n\tpublic Result<?> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\tbaseCommonService.addLog(\"删除用户，id： \" +id ,CommonConstant.LOG_TYPE_2, 3);\n        List<String> userNameList = sysUserService.userIdToUsername(Arrays.asList(id));\n\t\tthis.sysUserService.deleteUser(id);\n\n        if (!userNameList.isEmpty()) {\n            String joinedString = String.join(\",\", userNameList);\n        }\n\t\treturn Result.ok(\"删除用户成功\");\n\t}\n\n\t/**\n\t * 批量删除用户\n\t */\n    @RequiresPermissions(\"system:user:deleteBatch\")\n\t@RequestMapping(value = \"/deleteBatch\", method = RequestMethod.DELETE)\n\tpublic Result<?> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tbaseCommonService.addLog(\"批量删除用户， ids： \" +ids ,CommonConstant.LOG_TYPE_2, 3);\n        List<String> userNameList = sysUserService.userIdToUsername(Arrays.asList(ids.split(\",\")));\n\t\tthis.sysUserService.deleteBatchUsers(ids);\n\t\t\n        // 用户变更，触发同步工作流\n        if (!userNameList.isEmpty()) {\n            String joinedString = String.join(\",\", userNameList);\n        }\n\t\treturn Result.ok(\"批量删除用户成功\");\n\t}\n\n\t/**\n\t  * 冻结&解冻用户\n\t * @param jsonObject\n\t * @return\n\t */\n    @RequiresPermissions(\"system:user:frozenBatch\")\n\t@RequestMapping(value = \"/frozenBatch\", method = RequestMethod.PUT)\n\tpublic Result<SysUser> frozenBatch(@RequestBody JSONObject jsonObject) {\n\t\tResult<SysUser> result = new Result<SysUser>();\n\t\ttry {\n\t\t\tString ids = jsonObject.getString(\"ids\");\n\t\t\tsysUserService.checkUserAdminRejectDel(ids);\n\t\t\tString status = jsonObject.getString(\"status\");\n\t\t\tString[] arr = ids.split(\",\");\n            for (String id : arr) {\n\t\t\t\tif(oConvertUtils.isNotEmpty(id)) {\n                    // 代码逻辑说明: [QQYUN-5577]用户列表-冻结用户，再解冻之后，用户还是无法登陆，有缓存问题 #5066------------\n                    sysUserService.updateStatus(id,status);\n                }\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\tresult.error500(\"操作失败\"+e.getMessage());\n\t\t}\n\t\tresult.success(\"操作成功!\");\n\t\treturn result;\n\n    }\n    /**\n     * 重置为系统密码接口\n     * @param usernames\n     * @return\n     */\n    @RequiresRoles({\"admin\"})\n    @RequiresPermissions(\"system:user:resetPassword\")\n\t@RequestMapping(value = \"/resetPassword\", method = RequestMethod.PUT)\n\tpublic Result<SysUser> resetPassword(@RequestParam(name = \"usernames\") String usernames) {\n\t\tResult<SysUser> result = new Result<SysUser>();\n\t\ttry {\n            sysUserService.resetToSysPassword(usernames);\n            result.success(\"操作成功!\");\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\tresult.error500(e.getMessage());\n\t\t}\n\t\treturn result;\n\n    }\n\n    @RequiresPermissions(\"system:user:queryById\")\n    @RequestMapping(value = \"/queryById\", method = RequestMethod.GET)\n    public Result<SysUser> queryById(@RequestParam(name = \"id\", required = true) String id) {\n        Result<SysUser> result = new Result<SysUser>();\n        SysUser sysUser = sysUserService.getById(id);\n        if (sysUser == null) {\n            result.error500(\"未找到对应实体\");\n        } else {\n            result.setResult(sysUser);\n            result.setSuccess(true);\n        }\n        return result;\n    }\n\n    @RequiresPermissions(\"system:user:queryUserRole\")\n    @RequestMapping(value = \"/queryUserRole\", method = RequestMethod.GET)\n    public Result<List<String>> queryUserRole(@RequestParam(name = \"userid\", required = true) String userid) {\n        Result<List<String>> result = new Result<>();\n        List<String> list = new ArrayList<String>();\n        List<SysUserRole> userRole = sysUserRoleService.list(new QueryWrapper<SysUserRole>().lambda().eq(SysUserRole::getUserId, userid));\n        if (userRole == null || userRole.size() <= 0) {\n            result.error500(\"未找到用户相关角色信息\");\n        } else {\n            for (SysUserRole sysUserRole : userRole) {\n                list.add(sysUserRole.getRoleId());\n            }\n            result.setSuccess(true);\n            result.setResult(list);\n        }\n        return result;\n    }\n\n\n    /**\n\t  *  校验用户账号是否唯一<br>\n\t  *  可以校验其他 需要检验什么就传什么。。。\n     *\n     * @param sysUser\n     * @return\n     */\n    @RequestMapping(value = \"/checkOnlyUser\", method = RequestMethod.GET)\n    public Result<Boolean> checkOnlyUser(SysUser sysUser) {\n        Result<Boolean> result = new Result<>();\n        //如果此参数为false则程序发生异常\n        result.setResult(true);\n        try {\n            //通过传入信息查询新的用户信息\n            sysUser.setPassword(null);\n            SysUser user = sysUserService.getOne(new QueryWrapper<SysUser>(sysUser));\n            if (user != null) {\n                result.setSuccess(false);\n                result.setMessage(\"用户账号已存在\");\n                return result;\n            }\n\n        } catch (Exception e) {\n            result.setSuccess(false);\n            result.setMessage(e.getMessage());\n            return result;\n        }\n        result.setSuccess(true);\n        return result;\n    }\n\n    /**\n     * 修改密码\n     */\n    @RequiresPermissions(\"system:user:changepwd\")\n    @RequestMapping(value = \"/changePassword\", method = RequestMethod.PUT)\n    public Result<?> changePassword(@RequestBody SysUser sysUser, HttpServletRequest request) {\n        //-------------------------------------------------------------------------------------\n        //增加 check防止恶意刷短信接口\n        String clientIp = IpUtils.getIpAddr(request);\n        if(!DySmsLimit.canSendSms(clientIp)){\n            log.warn(\"-------- IP地址:{}, 短信接口请求太多，有攻击风险！\", clientIp);\n            return Result.error(\"短信接口请求太多，请稍后再试！\");\n        }\n        //-------------------------------------------------------------------------------------\n        SysUser u = this.sysUserService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUsername, sysUser.getUsername()));\n        if (u == null) {\n            return Result.error(\"用户不存在！\");\n        }\n        sysUser.setId(u.getId());\n        // 代码逻辑说明: [VUEN-234]修改密码添加敏感日志------------\n        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        baseCommonService.addLog(\"修改用户 \"+sysUser.getUsername()+\" 的密码，操作人： \" +loginUser.getUsername() ,CommonConstant.LOG_TYPE_2, 2);\n        return sysUserService.changePassword(sysUser);\n    }\n\n    /**\n     * 查询指定用户和部门关联的数据\n     *\n     * @param userId\n     * @return\n     */\n    @RequestMapping(value = \"/userDepartList\", method = RequestMethod.GET)\n    public Result<List<DepartIdModel>> getUserDepartsList(@RequestParam(name = \"userId\", required = true) String userId) {\n        Result<List<DepartIdModel>> result = new Result<>();\n        try {\n            List<DepartIdModel> depIdModelList = this.sysUserDepartService.queryDepartIdsOfUser(userId);\n            if (depIdModelList != null && depIdModelList.size() > 0) {\n                result.setSuccess(true);\n                result.setMessage(\"查找成功\");\n                result.setResult(depIdModelList);\n            } else {\n                result.setSuccess(false);\n                result.setMessage(\"查找失败\");\n            }\n            return result;\n        } catch (Exception e) {\n        \tlog.error(e.getMessage(), e);\n            result.setSuccess(false);\n            result.setMessage(\"查找过程中出现了异常: \" + e.getMessage());\n            return result;\n        }\n\n    }\n\n    /**\n     * 生成在添加用户情况下没有主键的问题,返回给前端,根据该id绑定部门数据\n     *\n     * @return\n     */\n    @RequestMapping(value = \"/generateUserId\", method = RequestMethod.GET)\n    public Result<String> generateUserId() {\n        Result<String> result = new Result<>();\n        //System.out.println(\"我执行了,生成用户ID==============================\");\n        String userId = UUID.randomUUID().toString().replace(\"-\", \"\");\n        result.setSuccess(true);\n        result.setResult(userId);\n        return result;\n    }\n\n    /**\n     * 根据部门id查询用户信息\n     *\n     * @param id\n     * @return\n     */\n    @RequestMapping(value = \"/queryUserByDepId\", method = RequestMethod.GET)\n    public Result<List<SysUser>> queryUserByDepId(@RequestParam(name = \"id\", required = true) String id,@RequestParam(name=\"realname\",required=false) String realname) {\n        Result<List<SysUser>> result = new Result<>();\n        //List<SysUser> userList = sysUserDepartService.queryUserByDepId(id);\n        SysDepart sysDepart = sysDepartService.getById(id);\n        List<SysUser> userList = sysUserDepartService.queryUserByDepCode(sysDepart.getOrgCode(),realname);\n\n        //批量查询用户的所属部门\n        //step.1 先拿到全部的 useids\n        //step.2 通过 useids，一次性查询用户的所属部门名字\n        List<String> userIds = userList.stream().map(SysUser::getId).collect(Collectors.toList());\n        if(userIds!=null && userIds.size()>0){\n            Map<String,String>  useDepNames = sysUserService.getDepNamesByUserIds(userIds);\n            userList.forEach(item->{\n                //TODO 临时借用这个字段用于页面展示\n                item.setOrgCodeTxt(useDepNames.get(item.getId()));\n            });\n        }\n\n        try {\n            result.setSuccess(true);\n            result.setResult(userList);\n            return result;\n        } catch (Exception e) {\n        \tlog.error(e.getMessage(), e);\n            result.setSuccess(false);\n            return result;\n        }\n    }\n\n    /**\n     * 用户选择组件 专用  根据用户账号或部门分页查询\n     * @param departId\n     * @param username\n     * @return\n     */\n    @RequestMapping(value = \"/queryUserComponentData\", method = RequestMethod.GET)\n    public Result<IPage<SysUser>> queryUserComponentData(\n            @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n            @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n            @RequestParam(name = \"departId\", required = false) String departId,\n            @RequestParam(name=\"realname\",required=false) String realname,\n            @RequestParam(name=\"username\",required=false) String username,\n            @RequestParam(name=\"isMultiTranslate\",required=false) String isMultiTranslate,\n            @RequestParam(name=\"id\",required = false) String id) {\n        // 代码逻辑说明: VUEN-1702【禁止问题】sql注入漏洞\n        String[] arr = new String[]{departId, realname, username, id};\n        SqlInjectionUtil.filterContent(arr, SymbolConstant.SINGLE_QUOTATION_MARK);\n        IPage<SysUser> pageList = sysUserDepartService.queryDepartUserPageList(departId, username, realname, pageSize, pageNo,id,isMultiTranslate);\n        return Result.OK(pageList);\n    }\n\n    /**\n     * 导出excel\n     *\n     * @param request\n     * @param sysUser\n     */\n    @RequiresPermissions(\"system:user:export\")\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(SysUser sysUser,HttpServletRequest request) {\n        // Step.1 组装查询条件\n        QueryWrapper<SysUser> queryWrapper = QueryGenerator.initQueryWrapper(sysUser, request.getParameterMap());\n        queryWrapper.ne(\"username\", \"_reserve_user_external\");\n        //Step.2 AutoPoi 导出Excel\n        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n        // 代码逻辑说明: [03]用户导出，如果选择数据则只导出相关数据--------------------\n        String selections = request.getParameter(\"selections\");\n       if(!oConvertUtils.isEmpty(selections)){\n           queryWrapper.in(\"id\",selections.split(\",\"));\n       }\n        //是否存在部门id\n        boolean izDepartId = true;\n        String departId = request.getParameter(\"departId\");\n        if (oConvertUtils.isNotEmpty(departId)) {\n            LambdaQueryWrapper<SysUserDepart> query = new LambdaQueryWrapper<>();\n            query.in(SysUserDepart::getDepId, Arrays.asList(departId.split(\",\")));\n            List<SysUserDepart> list = sysUserDepartService.list(query);\n            List<String> userIds = list.stream().map(SysUserDepart::getUserId).collect(Collectors.toList());\n            if (oConvertUtils.listIsNotEmpty(userIds)) {\n                queryWrapper.in(\"id\", userIds);\n            }else{\n                izDepartId = false;\n            }\n        }\n        List<SysUserExportVo> list = new ArrayList<>();\n        // 代码逻辑说明: 【JHHB-762】【用户管理】需要支持按组织架构查询用户---\n        if(izDepartId){\n            List<SysUser> pageList = sysUserService.list(queryWrapper);\n            list  = sysUserService.getDepartAndRoleExportMsg(pageList);\n        }\n        //导出文件名称\n        mv.addObject(NormalExcelConstants.FILE_NAME, \"用户列表\");\n        mv.addObject(NormalExcelConstants.CLASS, SysUserExportVo.class);\n\t\tLoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        ExportParams exportParams = new ExportParams(\"导入规则：\\n\" +\n                \"1. 用户名为必填项，仅支持新增数据导入；\\n\" +\n                \"2. 多个部门、角色或负责部门请用英文分号 ; 分隔，如：财务部;研发部；\\n\" +\n                \"3. 部门层级请用英文斜杠 / 分隔，如：北京公司/财务部/财务一部；\\n\" +\n                \"4. 部门类型需与部门层级一致，也用 / 分隔，如：公司/部门/部门 或 1/3/3，多个类型用 ; 分隔。机构类型编码：公司(1)，子公司(4)，部门(3)；\\n\" +\n                \"5. 部门根据用户名匹配，若存在多个则关联最新创建的部门，不存在时自动新增；\\n\" +\n                \"6. 负责部门与所属部门导入规则一致，若所属部门不包含负责部门，则不关联负责部门；\\n\" +\n                \"7. 用户主岗位导入时会在部门下自动创建新岗位，职级为空时默认不与岗位建立关联。\", \"导出人：\" + user.getRealname(), \"导出信息\");\n        exportParams.setTitleHeight((short)70);\n        exportParams.setStyle(ExcelExportSysUserStyle.class);\n        exportParams.setImageBasePath(upLoadPath);\n        //导出为xlsx\n        exportParams.setType(ExcelType.XSSF);\n        mv.addObject(NormalExcelConstants.PARAMS, exportParams);\n        mv.addObject(NormalExcelConstants.DATA_LIST, list);\n        //用户导出支持导出字段\n        String exportFields = request.getParameter(NormalExcelConstants.EXPORT_FIELDS);\n        if(oConvertUtils.isNotEmpty(exportFields)){\n            mv.addObject(NormalExcelConstants.EXPORT_FIELDS, exportFields);\n        }\n        return mv;\n    }\n\n    /**\n     * 通过excel导入数据\n     *\n     * @param request\n     * @param response\n     * @return\n     */\n    @RequiresPermissions(\"system:user:import\")\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response)throws IOException {\n        //return ImportOldUserUtil.importOldSysUser(request);\n        return sysUserService.importSysUser(request);\n    }\n\n    /**\n\t * @功能：根据id 批量查询\n\t * @param userIds\n\t * @return\n\t */\n\t@RequestMapping(value = \"/queryByIds\", method = RequestMethod.GET)\n\tpublic Result<Collection<SysUser>> queryByIds(@RequestParam(name = \"userIds\") String userIds) {\n\t\tResult<Collection<SysUser>> result = new Result<>();\n\t\tString[] userId = userIds.split(\",\");\n\t\tCollection<String> idList = Arrays.asList(userId);\n\t\tCollection<SysUser> userRole = sysUserService.listByIds(idList);\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(userRole);\n\t\treturn result;\n\t}\n\n\n    /**\n     * @功能：根据id 批量查询\n     * @param userNames\n     * @return\n     */\n    @RequestMapping(value = \"/queryByNames\", method = RequestMethod.GET)\n    public Result<Collection<SysUser>> queryByNames(@RequestParam(name = \"userNames\") String userNames) {\n        Result<Collection<SysUser>> result = new Result<>();\n        String[] names = userNames.split(\",\");\n        QueryWrapper<SysUser> queryWrapper=new QueryWrapper();\n        queryWrapper.lambda().in(true,SysUser::getUsername,names);\n        Collection<SysUser> userRole = sysUserService.list(queryWrapper);\n        result.setSuccess(true);\n        result.setResult(userRole);\n        return result;\n    }\n\n    /**\n     * @功能：根据userName查询用户以及部门信息\n     * @param userName\n     * @return\n     */\n    @RequestMapping(value = \"/queryUserAndDeptByName\", method = RequestMethod.GET)\n    public Result<Map<String,String>> queryUserAndDeptByName(@RequestParam(name = \"userName\") String userName) {\n        Map<String,String> userInfo= sysUserService.queryUserAndDeptByName(userName);\n        return Result.ok(userInfo);\n    }\n\n\t/**\n\t * 首页用户重置密码\n\t */\n    @RequiresPermissions(\"system:user:updatepwd\")\n    @RequestMapping(value = \"/updatePassword\", method = RequestMethod.PUT)\n\tpublic Result<?> updatePassword(@RequestBody JSONObject json) {\n\t\tString username = json.getString(\"username\");\n\t\tString oldpassword = json.getString(\"oldpassword\");\n\t\tString password = json.getString(\"password\");\n\t\tString confirmpassword = json.getString(\"confirmpassword\");\n        LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();\n        if(!sysUser.getUsername().equals(username)){\n            return Result.error(\"只允许修改自己的密码！\");\n        }\n\t\tSysUser user = this.sysUserService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUsername, username));\n\t\tif(user==null) {\n\t\t\treturn Result.error(\"用户不存在！\");\n\t\t}\n        // 代码逻辑说明: [VUEN-234]修改密码添加敏感日志------------\n        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        baseCommonService.addLog(\"修改密码，username： \" +loginUser.getUsername() ,CommonConstant.LOG_TYPE_2, 2);\n\t\treturn sysUserService.resetPassword(username,oldpassword,password,confirmpassword);\n\t}\n\n    @RequestMapping(value = \"/userRoleList\", method = RequestMethod.GET)\n    public Result<IPage<SysUser>> userRoleList(@RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n                                               @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize, HttpServletRequest req) {\n        Result<IPage<SysUser>> result = new Result<IPage<SysUser>>();\n        Page<SysUser> page = new Page<SysUser>(pageNo, pageSize);\n        String roleId = req.getParameter(\"roleId\");\n        String username = req.getParameter(\"username\");\n        String realname = req.getParameter(\"realname\");\n        IPage<SysUser> pageList = sysUserService.getUserByRoleId(page,roleId,username,realname);\n        result.setSuccess(true);\n        result.setResult(pageList);\n        return result;\n    }\n\n    /**\n     * 给指定角色添加用户\n     *\n     * @param\n     * @return\n     */\n    @RequiresPermissions(\"system:user:addUserRole\")\n    @RequestMapping(value = \"/addSysUserRole\", method = RequestMethod.POST)\n    public Result<String> addSysUserRole(@RequestBody SysUserRoleVO sysUserRoleVO) {\n        Result<String> result = new Result<String>();\n        //TODO 判断当前操作的角色是当前登录租户下的\n        try {\n            String sysRoleId = sysUserRoleVO.getRoleId();\n            for(String sysUserId:sysUserRoleVO.getUserIdList()) {\n                SysUserRole sysUserRole = new SysUserRole(sysUserId,sysRoleId);\n                QueryWrapper<SysUserRole> queryWrapper = new QueryWrapper<SysUserRole>();\n                queryWrapper.eq(\"role_id\", sysRoleId).eq(\"user_id\",sysUserId);\n                SysUserRole one = sysUserRoleService.getOne(queryWrapper);\n                if(one==null){\n                    sysUserRoleService.save(sysUserRole);\n                }\n\n            }\n            result.setMessage(\"添加成功!\");\n            result.setSuccess(true);\n            return result;\n        }catch(Exception e) {\n            log.error(e.getMessage(), e);\n            result.setSuccess(false);\n            result.setMessage(\"出错了: \" + e.getMessage());\n            return result;\n        }\n    }\n    /**\n     *   删除指定角色的用户关系\n     * @param\n     * @return\n     */\n    @RequiresPermissions(\"system:user:deleteRole\")\n    @RequestMapping(value = \"/deleteUserRole\", method = RequestMethod.DELETE)\n    public Result<SysUserRole> deleteUserRole(@RequestParam(name=\"roleId\") String roleId,\n                                                    @RequestParam(name=\"userId\",required=true) String userId\n    ) {\n        Result<SysUserRole> result = new Result<SysUserRole>();\n        try {\n            QueryWrapper<SysUserRole> queryWrapper = new QueryWrapper<SysUserRole>();\n            queryWrapper.eq(\"role_id\", roleId).eq(\"user_id\",userId);\n            sysUserRoleService.remove(queryWrapper);\n            result.success(\"删除成功!\");\n        }catch(Exception e) {\n            log.error(e.getMessage(), e);\n            result.error500(\"删除失败！\");\n        }\n        return result;\n    }\n\n    /**\n     * 批量删除指定角色的用户关系\n     *\n     * @param\n     * @return\n     */\n    @RequiresPermissions(\"system:user:deleteRoleBatch\")\n    @RequestMapping(value = \"/deleteUserRoleBatch\", method = RequestMethod.DELETE)\n    public Result<SysUserRole> deleteUserRoleBatch(\n            @RequestParam(name=\"roleId\") String roleId,\n            @RequestParam(name=\"userIds\",required=true) String userIds) {\n        Result<SysUserRole> result = new Result<SysUserRole>();\n        try {\n            QueryWrapper<SysUserRole> queryWrapper = new QueryWrapper<SysUserRole>();\n            queryWrapper.eq(\"role_id\", roleId).in(\"user_id\",Arrays.asList(userIds.split(\",\")));\n            sysUserRoleService.remove(queryWrapper);\n            result.success(\"删除成功!\");\n        }catch(Exception e) {\n            log.error(e.getMessage(), e);\n            result.error500(\"删除失败！\");\n        }\n        return result;\n    }\n\n    /**\n     * 部门用户列表\n     */\n    @RequestMapping(value = \"/departUserList\", method = RequestMethod.GET)\n    public Result<IPage<SysUser>> departUserList(@RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n                                                 @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize, HttpServletRequest req) {\n        Result<IPage<SysUser>> result = new Result<IPage<SysUser>>();\n        Page<SysUser> page = new Page<SysUser>(pageNo, pageSize);\n        String depId = req.getParameter(\"depId\");\n        String username = req.getParameter(\"username\");\n        //根据部门ID查询,当前和下级所有的部门IDS\n        List<String> subDepids = new ArrayList<>();\n        //部门id为空时，查询我的部门下所有用户\n        if(oConvertUtils.isEmpty(depId)){\n            LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n            int userIdentity = user.getUserIdentity() != null?user.getUserIdentity():CommonConstant.USER_IDENTITY_1;\n            // 代码逻辑说明: [QQYUN-10775]验证码可以复用 #7674------------\n            if(oConvertUtils.isNotEmpty(userIdentity) && userIdentity == CommonConstant.USER_IDENTITY_2\n                    && oConvertUtils.isNotEmpty(user.getDepartIds())) {\n                subDepids = sysDepartService.getMySubDepIdsByDepId(user.getDepartIds());\n            }\n        }else{\n            subDepids = sysDepartService.getSubDepIdsByDepId(depId);\n        }\n        if(subDepids != null && subDepids.size()>0){\n            IPage<SysUser> pageList = sysUserService.getUserByDepIds(page,subDepids,username);\n            //批量查询用户的所属部门\n            //step.1 先拿到全部的 useids\n            //step.2 通过 useids，一次性查询用户的所属部门名字\n            List<String> userIds = pageList.getRecords().stream().map(SysUser::getId).collect(Collectors.toList());\n            if(userIds!=null && userIds.size()>0){\n                Map<String, String> useDepNames = sysUserService.getDepNamesByUserIds(userIds);\n                pageList.getRecords().forEach(item -> {\n                    //批量查询用户的所属部门\n                    item.setOrgCode(useDepNames.get(item.getId()));\n                });\n            }\n            //设置租户id\n            page.setRecords(userTenantService.setUserTenantIds(page.getRecords()));\n            result.setSuccess(true);\n            result.setResult(pageList);\n        }else{\n            result.setSuccess(true);\n            result.setResult(null);\n        }\n        return result;\n    }\n\n\n    /**\n     * 根据 orgCode 查询用户，包括子部门下的用户\n     * 若某个用户包含多个部门，则会显示多条记录，可自行处理成单条记录\n     */\n    @GetMapping(\"/queryByOrgCode\")\n    public Result<?> queryByDepartId(\n            @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n            @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n            @RequestParam(name = \"orgCode\") String orgCode,\n            SysUser userParams\n    ) {\n        IPage<SysUserSysDepartModel> pageList = sysUserService.queryUserByOrgCode(orgCode, userParams, new Page(pageNo, pageSize));\n        return Result.ok(pageList);\n    }\n\n    /**\n     * 根据 orgCode 查询用户，包括子部门下的用户 【不包含岗位下的用户】\n     * 针对通讯录模块做的接口，将多个部门的用户合并成一条记录，并转成对前端友好的格式\n     */\n    @GetMapping(\"/queryByOrgCodeForAddressList\")\n    public Result<?> queryByOrgCodeForAddressList(\n            @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n            @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n            @RequestParam(name = \"orgCode\",required = false) String orgCode,\n            SysUser userParams\n    ) {\n        IPage page = new Page(pageNo, pageSize);\n        IPage<SysUserSysDepartModel> pageList = sysUserService.queryUserByOrgCode(orgCode, userParams, page);\n        List<SysUserSysDepartModel> list = pageList.getRecords();\n\n        // 记录所有出现过的 user, key = userId\n        Map<String, JSONObject> hasUser = new HashMap<>(list.size());\n\n        JSONArray resultJson = new JSONArray(list.size());\n\n        for (SysUserSysDepartModel item : list) {\n            String userId = item.getId();\n            // userId\n            JSONObject getModel = hasUser.get(userId);\n            // 之前已存在过该用户，直接合并数据\n            if (getModel != null) {\n                String departName = getModel.get(\"departName\").toString();\n                getModel.put(\"departName\", (departName + \" | \" + item.getDepartName()));\n            } else {\n                // 将用户对象转换为json格式，并将部门信息合并到 json 中\n                JSONObject json = JSON.parseObject(JSON.toJSONString(item));\n                json.remove(\"id\");\n                json.put(\"userId\", userId);\n                json.put(\"departId\", item.getDepartId());\n                json.put(\"departName\", item.getDepartName());\n//                json.put(\"avatar\", item.getSysUser().getAvatar());\n                resultJson.add(json);\n                hasUser.put(userId, json);\n            }\n        }\n\n        IPage<JSONObject> result = new Page<>(pageNo, pageSize, pageList.getTotal());\n        result.setRecords(resultJson.toJavaList(JSONObject.class));\n        return Result.ok(result);\n    }\n\n    /**\n     * 根据 orgCode 查询用户，包括公司、子公司、岗位部门下的用户\n     */\n    @GetMapping(\"/queryDepartPostByOrgCode\")\n    public Result<?> queryDepartPostByOrgCode(@RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                              @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                              @RequestParam(name = \"orgCode\",required = false) String orgCode,\n                                              SysUser userParams\n    ) {\n        IPage page = new Page(pageNo, pageSize);\n        IPage<SysUserSysDepPostModel> pageList = sysUserService.queryDepartPostUserByOrgCode(orgCode, userParams, page);\n        return Result.ok(pageList);\n    }\n\n    /**\n     * 根据 orgCode 查询用户信息（部门全路径，主岗位和兼职岗位的信息），包括公司、子公司、部门\n     */\n    @GetMapping(\"/queryDepartUserByOrgCode\")\n    public Result<IPage<SysUserSysDepPostModel>> queryDepartUserByOrgCode(@RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                              @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                              @RequestParam(name = \"orgCode\",required = false) String orgCode,\n                                              SysUser userParams\n    ) {\n        IPage page = new Page(pageNo, pageSize);\n        IPage<SysUserSysDepPostModel> pageList = sysUserService.queryDepartUserByOrgCode(orgCode, userParams, page);\n        return Result.ok(pageList);\n    }\n\n    /**\n     * 通讯录点击用户获取用户详情（包含用户基本信息、部门全路径、主岗位兼职岗位全路径）\n     * \n     * @param userId\n     * @return\n     */\n    @GetMapping(\"/getUserDetailByUserId\")\n    public Result<SysUserSysDepPostModel> getUserDetailByUserId(@RequestParam(name = \"userId\") String userId) {\n        Result<SysUserSysDepPostModel> result = new Result<SysUserSysDepPostModel>();\n        try {\n            SysUserSysDepPostModel sysDepPostModel = sysUserService.getUserDetailByUserId(userId);\n            result.setSuccess(true);\n            result.setResult(sysDepPostModel);\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            result.setSuccess(false);\n            result.setMessage(\"查询失败: \" + e.getMessage());\n        }\n        return result;\n    }\n    \n    /**\n     * 给指定部门添加对应的用户\n     */\n    @RequiresPermissions(\"system:user:editDepartWithUser\")\n    @RequestMapping(value = \"/editSysDepartWithUser\", method = RequestMethod.POST)\n    public Result<String> editSysDepartWithUser(@RequestBody SysDepartUsersVO sysDepartUsersVO) {\n        Result<String> result = new Result<String>();\n        try {\n            String sysDepId = sysDepartUsersVO.getDepId();\n            boolean updated = false;\n            for(String sysUserId:sysDepartUsersVO.getUserIdList()) {\n                SysUserDepart sysUserDepart = new SysUserDepart(null,sysUserId,sysDepId);\n                QueryWrapper<SysUserDepart> queryWrapper = new QueryWrapper<SysUserDepart>();\n                queryWrapper.eq(\"dep_id\", sysDepId).eq(\"user_id\",sysUserId);\n                SysUserDepart one = sysUserDepartService.getOne(queryWrapper);\n                if(one==null){\n                    updated = true;\n                    sysUserDepartService.save(sysUserDepart);\n                }\n            }\n            // 【JHHB-737】更新关系后清空用户缓存\n            if (updated) {\n                redisUtil.removeAll(CacheConstant.SYS_USERS_CACHE);\n            }\n            result.setMessage(\"添加成功!\");\n            result.setSuccess(true);\n            return result;\n        }catch(Exception e) {\n            log.error(e.getMessage(), e);\n            result.setSuccess(false);\n            result.setMessage(\"出错了: \" + e.getMessage());\n            return result;\n        }\n    }\n\n    /**\n     *   删除指定机构的用户关系\n     */\n    @RequiresPermissions(\"system:user:deleteUserInDepart\")\n    @RequestMapping(value = \"/deleteUserInDepart\", method = RequestMethod.DELETE)\n    public Result<SysUserDepart> deleteUserInDepart(@RequestParam(name=\"depId\") String depId,\n                                                    @RequestParam(name=\"userId\",required=true) String userId\n    ) {\n        Result<SysUserDepart> result = new Result<SysUserDepart>();\n        try {\n            QueryWrapper<SysUserDepart> queryWrapper = new QueryWrapper<SysUserDepart>();\n            queryWrapper.eq(\"dep_id\", depId).eq(\"user_id\",userId);\n            boolean b = sysUserDepartService.remove(queryWrapper);\n            if(b){\n                List<SysDepartRole> sysDepartRoleList = departRoleService.list(new QueryWrapper<SysDepartRole>().eq(\"depart_id\",depId));\n                List<String> roleIds = sysDepartRoleList.stream().map(SysDepartRole::getId).collect(Collectors.toList());\n                if(roleIds != null && roleIds.size()>0){\n                    QueryWrapper<SysDepartRoleUser> query = new QueryWrapper<>();\n                    query.eq(\"user_id\",userId).in(\"drole_id\",roleIds);\n                    departRoleUserService.remove(query);\n                }\n                result.success(\"删除成功!\");\n            }else{\n                result.error500(\"当前选中部门与用户无关联关系!\");\n            }\n        }catch(Exception e) {\n            log.error(e.getMessage(), e);\n            result.error500(\"删除失败！\");\n        }\n        return result;\n    }\n\n    /**\n     * 批量删除指定机构的用户关系\n     */\n    @RequiresPermissions(\"system:user:deleteUserInDepartBatch\")\n    @RequestMapping(value = \"/deleteUserInDepartBatch\", method = RequestMethod.DELETE)\n    public Result<SysUserDepart> deleteUserInDepartBatch(\n            @RequestParam(name=\"depId\") String depId,\n            @RequestParam(name=\"userIds\",required=true) String userIds) {\n        Result<SysUserDepart> result = new Result<SysUserDepart>();\n        try {\n            QueryWrapper<SysUserDepart> queryWrapper = new QueryWrapper<SysUserDepart>();\n            queryWrapper.eq(\"dep_id\", depId).in(\"user_id\",Arrays.asList(userIds.split(\",\")));\n            boolean b = sysUserDepartService.remove(queryWrapper);\n            if(b){\n                departRoleUserService.removeDeptRoleUser(Arrays.asList(userIds.split(\",\")),depId);\n            }else{\n                result.error500(\"删除失败，目标用户不在当前部门！\");\n                return result;\n            }\n            result.success(\"删除成功!\");\n        }catch(Exception e) {\n            log.error(e.getMessage(), e);\n            result.error500(\"删除失败！\");\n        }\n        return result;\n    }\n    \n    /**\n         *  查询当前用户的所有部门/当前部门编码\n     * @return\n     */\n    @RequestMapping(value = \"/getCurrentUserDeparts\", method = RequestMethod.GET)\n    public Result<Map<String,Object>> getCurrentUserDeparts() {\n        Result<Map<String,Object>> result = new Result<Map<String,Object>>();\n        try {\n        \tLoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();\n            List<SysDepart> list = this.sysDepartService.queryUserDeparts(sysUser.getId());\n            Map<String,Object> map = new HashMap(5);\n            map.put(\"list\", list);\n            map.put(\"orgCode\", sysUser.getOrgCode());\n            result.setSuccess(true);\n            result.setResult(map);\n        }catch(Exception e) {\n            log.error(e.getMessage(), e);\n            result.error500(\"查询失败！\");\n        }\n        return result;\n    }\n\n    \n\n\n\t/**\n\t * 用户注册接口\n\t * \n\t * @param jsonObject\n\t * @param user\n\t * @return\n\t */\n\t@PostMapping(\"/register\")\n\tpublic Result<JSONObject> userRegister(@RequestBody JSONObject jsonObject, SysUser user) {\n\t\tResult<JSONObject> result = new Result<JSONObject>();\n\t\tString phone = jsonObject.getString(\"phone\");\n\t\tString smscode = jsonObject.getString(\"smscode\");\n\n        // 代码逻辑说明: VUEN-2245 【漏洞】发现新漏洞待处理20220906\n\t\tString redisKey = CommonConstant.PHONE_REDIS_KEY_PRE+phone;\n\t\tObject code = redisUtil.get(redisKey);\n\n\t\tString username = jsonObject.getString(\"username\");\n\t\t//未设置用户名，则用手机号作为用户名\n\t\tif(oConvertUtils.isEmpty(username)){\n            username = phone;\n        }\n        //未设置密码，则随机生成一个密码\n\t\tString password = jsonObject.getString(\"password\");\n\t\tif(oConvertUtils.isEmpty(password)){\n            password = RandomUtil.randomString(8);\n        }\n\t\tString email = jsonObject.getString(\"email\");\n\t\tSysUser sysUser1 = sysUserService.getUserByName(username);\n\t\tif (sysUser1 != null) {\n\t\t\tresult.setMessage(\"用户名已注册\");\n\t\t\tresult.setSuccess(false);\n\t\t\treturn result;\n\t\t}\n\t\tSysUser sysUser2 = sysUserService.getUserByPhone(phone);\n\t\tif (sysUser2 != null) {\n\t\t\tresult.setMessage(\"该手机号已注册\");\n\t\t\tresult.setSuccess(false);\n\t\t\treturn result;\n\t\t}\n\n\t\tif(oConvertUtils.isNotEmpty(email)){\n            SysUser sysUser3 = sysUserService.getUserByEmail(email);\n            if (sysUser3 != null) {\n                result.setMessage(\"邮箱已被注册\");\n                result.setSuccess(false);\n                return result;\n            }\n        }\n        if(null == code){\n            result.setMessage(\"手机验证码失效，请重新获取\");\n            result.setSuccess(false);\n            return result;\n        }\n\t\tif (!smscode.equals(code.toString())) {\n\t\t\tresult.setMessage(\"手机验证码错误\");\n\t\t\tresult.setSuccess(false);\n\t\t\treturn result;\n\t\t}\n\n        String realname = jsonObject.getString(\"realname\");\n        if(oConvertUtils.isEmpty(realname)){\n            realname = username;\n        }\n        \n\t\ttry {\n\t\t\tuser.setCreateTime(new Date());// 设置创建时间\n\t\t\tString salt = oConvertUtils.randomGen(8);\n\t\t\tString passwordEncode = PasswordUtil.encrypt(username, password, salt);\n\t\t\tuser.setSalt(salt);\n\t\t\tuser.setUsername(username);\n\t\t\tuser.setRealname(realname);\n\t\t\tuser.setPassword(passwordEncode);\n\t\t\tuser.setEmail(email);\n\t\t\tuser.setPhone(phone);\n\t\t\tuser.setStatus(CommonConstant.USER_UNFREEZE);\n\t\t\tuser.setDelFlag(CommonConstant.DEL_FLAG_0);\n\t\t\tuser.setActivitiSync(CommonConstant.ACT_SYNC_1);\n            user.setLastPwdUpdateTime(new Date());\n\t\t\tsysUserService.addUserWithRole(user,\"\");//默认临时角色 test\n\t\t\tresult.success(\"注册成功\");\n\t\t} catch (Exception e) {\n\t\t\tresult.error500(\"注册失败\");\n\t\t}\n\t\treturn result;\n\t}\n\n//\t/**\n//\t * 根据用户名或手机号查询用户信息\n//\t * @param\n//\t * @return\n//\t */\n//\t@GetMapping(\"/querySysUser\")\n//\tpublic Result<Map<String, Object>> querySysUser(SysUser sysUser) {\n//\t\tString phone = sysUser.getPhone();\n//\t\tString username = sysUser.getUsername();\n//\t\tResult<Map<String, Object>> result = new Result<Map<String, Object>>();\n//\t\tMap<String, Object> map = new HashMap<String, Object>();\n//\t\tif (oConvertUtils.isNotEmpty(phone)) {\n//\t\t\tSysUser user = sysUserService.getUserByPhone(phone);\n//\t\t\tif(user!=null) {\n//\t\t\t\tmap.put(\"username\",user.getUsername());\n//\t\t\t\tmap.put(\"phone\",user.getPhone());\n//\t\t\t\tresult.setSuccess(true);\n//\t\t\t\tresult.setResult(map);\n//\t\t\t\treturn result;\n//\t\t\t}\n//\t\t}\n//\t\tif (oConvertUtils.isNotEmpty(username)) {\n//\t\t\tSysUser user = sysUserService.getUserByName(username);\n//\t\t\tif(user!=null) {\n//\t\t\t\tmap.put(\"username\",user.getUsername());\n//\t\t\t\tmap.put(\"phone\",user.getPhone());\n//\t\t\t\tresult.setSuccess(true);\n//\t\t\t\tresult.setResult(map);\n//\t\t\t\treturn result;\n//\t\t\t}\n//\t\t}\n//\t\tresult.setSuccess(false);\n//\t\tresult.setMessage(\"验证失败\");\n//\t\treturn result;\n//\t}\n\n\t/**\n\t * 用户手机号验证\n\t */\n\t@PostMapping(\"/phoneVerification\")\n\tpublic Result<Map<String,String>> phoneVerification(@RequestBody JSONObject jsonObject) {\n\t\tResult<Map<String,String>> result = new Result<Map<String,String>>();\n\t\tString phone = jsonObject.getString(\"phone\");\n\t\tString smscode = jsonObject.getString(\"smscode\");\n        // 代码逻辑说明: VUEN-2245 【漏洞】发现新漏洞待处理20220906\n        String redisKey = CommonConstant.PHONE_REDIS_KEY_PRE+phone;\n\t\tObject code = redisUtil.get(redisKey);\n        // 代码逻辑说明: 【issues/8567】严重：修改密码存在水平越权问题。---\n        if (null == code) {\n            result.setMessage(\"短信验证码失效！\");\n            result.setSuccess(false);\n            return result;\n        }\n        String smsCode = \"\";\n        if (code.toString().contains(\"code\")) {\n            smsCode = JSONObject.parseObject(code.toString()).getString(\"code\");\n        } else {\n            smsCode = code.toString();\n        }\n\t\tif (!smscode.equals(smsCode)) {\n\t\t\tresult.setMessage(\"手机验证码错误\");\n\t\t\tresult.setSuccess(false);\n\t\t\treturn result;\n\t\t}\n\t\t//设置有效时间\n\t\tredisUtil.set(redisKey, code,600);\n\n\t\t//新增查询用户名\n\t\tLambdaQueryWrapper<SysUser> query = new LambdaQueryWrapper<>();\n        query.eq(SysUser::getPhone,phone);\n        SysUser user = sysUserService.getOne(query);\n        Map<String,String> map = new HashMap(5);\n        map.put(\"smscode\",smscode);\n        if(null == user){\n            //前端根据文字做判断用户是否存在判断，不能修改\n            result.setMessage(\"用户信息不存在\");\n            result.setSuccess(false);\n            return result;\n        }\n        map.put(\"username\",user.getUsername());\n        result.setResult(map);\n\t\tresult.setSuccess(true);\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * 用户更改密码\n\t */\n\t@GetMapping(\"/passwordChange\")\n\tpublic Result<SysUser> passwordChange(@RequestParam(name=\"username\")String username,\n\t\t\t\t\t\t\t\t\t\t  @RequestParam(name=\"password\")String password,\n\t\t\t                              @RequestParam(name=\"smscode\")String smscode,\n\t\t\t                              @RequestParam(name=\"phone\") String phone) {\n        Result<SysUser> result = new Result<SysUser>();\n        if(oConvertUtils.isEmpty(username) || oConvertUtils.isEmpty(password) || oConvertUtils.isEmpty(smscode)  || oConvertUtils.isEmpty(phone) ) {\n            result.setMessage(\"重置密码失败！\");\n            result.setSuccess(false);\n            return result;\n        }\n\n        SysUser sysUser=new SysUser();\n        // 代码逻辑说明: VUEN-2245 【漏洞】发现新漏洞待处理20220906\n        String redisKey = CommonConstant.PHONE_REDIS_KEY_PRE+phone;\n        Object object= redisUtil.get(redisKey);\n        if(null==object) {\n        \tresult.setMessage(\"短信验证码失效！\");\n            result.setSuccess(false);\n            return result;\n        }\n\n        // 代码逻辑说明: 【issues/8567】严重：修改密码存在水平越权问题。---\n        String redisUsername = \"\";\n        if(object.toString().contains(\"code\")){\n            JSONObject jsonObject = JSONObject.parseObject(object.toString());\n            object = jsonObject.getString(\"code\");\n            redisUsername = jsonObject.getString(\"username\");\n        }\n        //验证是否为当前用户的\n        if(oConvertUtils.isNotEmpty(redisUsername) && !username.equals(redisUsername)){\n            result.setMessage(\"此验证码不是当前用户的！\");\n            result.setSuccess(false);\n            return result;\n        }\n        \n        if(!smscode.equals(object.toString())) {\n        \tresult.setMessage(\"短信验证码不匹配！\");\n            result.setSuccess(false);\n            return result;\n        }\n        sysUser = this.sysUserService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUsername,username).eq(SysUser::getPhone,phone));\n        if (sysUser == null) {\n            result.setMessage(\"当前用户和绑定的手机号不匹配，无法修改密码！\");\n            result.setSuccess(false);\n            return result;\n        } else {\n            String salt = oConvertUtils.randomGen(8);\n            sysUser.setSalt(salt);\n            String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt);\n            sysUser.setPassword(passwordEncode);\n            sysUser.setLastPwdUpdateTime(new Date());\n            this.sysUserService.updateById(sysUser);\n            // 代码逻辑说明: [VUEN-234]密码重置添加敏感日志------------\n            baseCommonService.addLog(\"重置 \"+username+\" 的密码，操作人： \" +sysUser.getUsername() ,CommonConstant.LOG_TYPE_2, 2);\n            result.setSuccess(true);\n            result.setMessage(\"密码重置完成！\");\n            //修改完密码后清空redis\n            redisUtil.removeAll(redisKey);\n            return result;\n        }\n    }\n\t\n\n\t/**\n\t * 根据TOKEN获取用户的部分信息（返回的数据是可供表单设计器使用的数据）\n\t * \n\t * @return\n\t */\n\t@GetMapping(\"/getUserSectionInfoByToken\")\n\tpublic Result<?> getUserSectionInfoByToken(HttpServletRequest request, @RequestParam(name = \"token\", required = false) String token) {\n\t\ttry {\n\t\t\tString username = null;\n\t\t\t// 如果没有传递token，就从header中获取token并获取用户信息\n\t\t\tif (oConvertUtils.isEmpty(token)) {\n\t\t\t\t username = JwtUtil.getUserNameByToken(request);\n\t\t\t} else {\n\t\t\t\t username = JwtUtil.getUsername(token);\t\t\t\t\n\t\t\t}\n\n\t\t\tlog.debug(\" ------ 通过令牌获取部分用户信息，当前用户： \" + username);\n\n\t\t\t// 根据用户名查询用户信息\n\t\t\tSysUser sysUser = sysUserService.getUserByName(username);\n\t\t\tMap<String, Object> map = new HashMap<String, Object>();\n\t\t\tmap.put(\"sysUserId\", sysUser.getId());\n\t\t\tmap.put(\"sysUserCode\", sysUser.getUsername()); // 当前登录用户登录账号\n\t\t\tmap.put(\"sysUserName\", sysUser.getRealname()); // 当前登录用户真实名称\n\t\t\tmap.put(\"sysOrgCode\", sysUser.getOrgCode()); // 当前登录用户部门编号\n\n            // 【QQYUN-12930】设置部门名称\n            if (oConvertUtils.isNotEmpty(sysUser.getOrgCode())) {\n                SysDepart sysDepart = sysDepartService.lambdaQuery().select(SysDepart::getDepartName).eq(SysDepart::getOrgCode, sysUser.getOrgCode()).one();\n                if (sysDepart != null) {\n                    map.put(\"sysOrgName\", sysDepart.getDepartName()); // 当前登录用户部门名称\n                }\n            }\n\n\t\t\tlog.debug(\" ------ 通过令牌获取部分用户信息，已获取的用户信息： \" + map);\n\n\t\t\treturn Result.ok(map);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\treturn Result.error(500, \"查询失败:\" + e.getMessage());\n\t\t}\n\t}\n\t\n\t/**\n\t * 【APP端接口】获取用户列表  根据用户名和真实名 模糊匹配\n\t * @param keyword\n\t * @param pageNo\n\t * @param pageSize\n\t * @return\n\t */\n\t@GetMapping(\"/appUserList\")\n\tpublic Result<?> appUserList(@RequestParam(name = \"keyword\", required = false) String keyword,\n            @RequestParam(name = \"username\", required = false) String username,\n\t\t\t@RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t@RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n            @RequestParam(name = \"syncFlow\", required = false) String syncFlow) {\n\t\ttry {\n\t\t\t//TODO 从查询效率上将不要用mp的封装的page分页查询 建议自己写分页语句\n\t\t\tLambdaQueryWrapper<SysUser> query = new LambdaQueryWrapper<SysUser>();\n\t\t\tif(oConvertUtils.isNotEmpty(syncFlow)){\n                query.eq(SysUser::getActivitiSync, CommonConstant.ACT_SYNC_1);\n            }\n\t\t\tquery.eq(SysUser::getDelFlag,CommonConstant.DEL_FLAG_0);\n\t\t\tif(oConvertUtils.isNotEmpty(username)){\n\t\t\t    if(username.contains(\",\")){\n                    query.in(SysUser::getUsername,username.split(\",\"));\n                }else{\n                    query.eq(SysUser::getUsername,username);\n                }\n            }else{\n                query.and(i -> i.like(SysUser::getUsername, keyword).or().like(SysUser::getRealname, keyword));\n            }\n\t\t\tPage<SysUser> page = new Page<>(pageNo, pageSize);\n\t\t\tIPage<SysUser> res = this.sysUserService.page(page, query);\n\t\t\treturn Result.ok(res);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\treturn Result.error(500, \"查询失败:\" + e.getMessage());\n\t\t}\n\t\t\n\t}\n\n    /**\n     * 获取被逻辑删除的用户列表，无分页\n     *\n     * @return logicDeletedUserList\n     */\n    @GetMapping(\"/recycleBin\")\n    public Result getRecycleBin() {\n        List<SysUser> logicDeletedUserList = sysUserService.queryLogicDeleted();\n        if (logicDeletedUserList.size() > 0) {\n            // 批量查询用户的所属部门\n            // step.1 先拿到全部的 userIds\n            List<String> userIds = logicDeletedUserList.stream().map(SysUser::getId).collect(Collectors.toList());\n            // step.2 通过 userIds，一次性查询用户的所属部门名字\n            Map<String, String> useDepNames = sysUserService.getDepNamesByUserIds(userIds);\n            logicDeletedUserList.forEach(item -> item.setOrgCode(useDepNames.get(item.getId())));\n        }\n        return Result.ok(logicDeletedUserList);\n    }\n\n    /**\n     * 还原被逻辑删除的用户\n     *\n     * @param jsonObject\n     * @return\n     */\n    @RequestMapping(value = \"/putRecycleBin\", method = RequestMethod.PUT)\n    public Result putRecycleBin(@RequestBody JSONObject jsonObject, HttpServletRequest request) {\n        String userIds = jsonObject.getString(\"userIds\");\n        if (StringUtils.isNotBlank(userIds)) {\n            SysUser updateUser = new SysUser();\n            updateUser.setUpdateBy(JwtUtil.getUserNameByToken(request));\n            updateUser.setUpdateTime(new Date());\n            sysUserService.revertLogicDeleted(Arrays.asList(userIds.split(\",\")), updateUser);\n        }\n        return Result.ok(\"还原成功\");\n    }\n\n    /**\n     * 彻底删除用户\n     *\n     * @param userIds 被删除的用户ID，多个id用半角逗号分割\n     * @return\n     */\n    @RequiresPermissions(\"system:user:deleteRecycleBin\")\n    @RequestMapping(value = \"/deleteRecycleBin\", method = RequestMethod.DELETE)\n    public Result deleteRecycleBin(@RequestParam(\"userIds\") String userIds) {\n        if (StringUtils.isNotBlank(userIds)) {\n            sysUserService.removeLogicDeleted(Arrays.asList(userIds.split(\",\")));\n        }\n        return Result.ok(\"删除成功\");\n    }\n\n\n    /**\n     * 移动端修改用户信息\n     * @param jsonObject\n     * @return\n     */\n    @RequiresPermissions(\"system:user:app:edit\")\n    @RequestMapping(value = \"/appEdit\", method = {RequestMethod.PUT,RequestMethod.POST})\n    public Result<SysUser> appEdit(HttpServletRequest request,@RequestBody JSONObject jsonObject) {\n        Result<SysUser> result = new Result<SysUser>();\n        try {\n            String username = JwtUtil.getUserNameByToken(request);\n            SysUser sysUser = sysUserService.getUserByName(username);\n            baseCommonService.addLog(\"移动端编辑用户，id： \" +jsonObject.getString(\"id\") ,CommonConstant.LOG_TYPE_2, 2);\n            String realname=jsonObject.getString(\"realname\");\n            String avatar=jsonObject.getString(\"avatar\");\n            String sex=jsonObject.getString(\"sex\");\n            String phone=jsonObject.getString(\"phone\");\n            String email=jsonObject.getString(\"email\");\n            Date birthday=jsonObject.getDate(\"birthday\");\n            SysUser userPhone = sysUserService.getUserByPhone(phone);\n            if(sysUser==null) {\n                result.error500(\"未找到对应用户!\");\n            }else {\n                if(userPhone!=null){\n                    String userPhonename = userPhone.getUsername();\n                    if(!userPhonename.equals(username)){\n                        result.error500(\"手机号已存在!\");\n                        return result;\n                    }\n                }\n                if(StringUtils.isNotBlank(realname)){\n                    sysUser.setRealname(realname);\n                }\n                if(StringUtils.isNotBlank(avatar)){\n                    sysUser.setAvatar(avatar);\n                }\n                if(StringUtils.isNotBlank(sex)){\n                    sysUser.setSex(Integer.parseInt(sex));\n                }\n                if(StringUtils.isNotBlank(phone)){\n                    sysUser.setPhone(phone);\n                }\n                if(StringUtils.isNotBlank(email)){\n                    // 代码逻辑说明: [VUEN-1528]积木官网邮箱重复，应该提示准确------------\n                    LambdaQueryWrapper<SysUser> emailQuery = new LambdaQueryWrapper<>();\n                    emailQuery.eq(SysUser::getEmail,email);\n                    long count = sysUserService.count(emailQuery);\n                    if (!email.equals(sysUser.getEmail()) && count!=0) {\n                        result.error500(\"保存失败，邮箱已存在!\");\n                        return result;\n                    }\n                    sysUser.setEmail(email);\n                }\n                if(null != birthday){\n                    sysUser.setBirthday(birthday);\n                }\n                sysUser.setUpdateTime(new Date());\n                sysUserService.updateById(sysUser);\n            }\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            result.error500(\"保存失败!\");\n        }\n        return result;\n    }\n    /**\n     * 移动端保存设备信息\n     * @param clientId\n     * @return\n     */\n    @RequestMapping(value = \"/saveClientId\", method = RequestMethod.GET)\n    public Result<SysUser> saveClientId(HttpServletRequest request,@RequestParam(value = \"clientId\",required = false)String clientId) {\n        Result<SysUser> result = new Result<SysUser>();\n        try {\n            String username = JwtUtil.getUserNameByToken(request);\n            SysUser sysUser = sysUserService.getUserByName(username);\n            if(sysUser==null) {\n                result.error500(\"未找到对应用户!\");\n            }else {\n                sysUserService.updateClientId(clientId,sysUser.getId());\n            }\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            result.error500(\"操作失败!\");\n        }\n        return result;\n    }\n    /**\n     * 根据userid获取用户信息和部门员工信息\n     *\n     * @return Result\n     */\n    @GetMapping(\"/queryChildrenByUsername\")\n    public Result queryChildrenByUsername(@RequestParam(\"userId\") String userId) {\n        //获取用户信息\n        Map<String,Object> map=new HashMap(5);\n        SysUser sysUser = sysUserService.getById(userId);\n        String username = sysUser.getUsername();\n        Integer identity = sysUser.getUserIdentity();\n        map.put(\"sysUser\",sysUser);\n        if(identity!=null && identity==2){\n            //获取部门用户信息\n            String departIds = sysUser.getDepartIds();\n            if(StringUtils.isNotBlank(departIds)){\n                List<String> departIdList = Arrays.asList(departIds.split(\",\"));\n                List<SysUser> childrenUser = sysUserService.queryByDepIds(departIdList,username);\n                map.put(\"children\",childrenUser);\n            }\n        }\n        return Result.ok(map);\n    }\n    /**\n     * 移动端查询部门用户信息\n     * @param departId\n     * @return\n     */\n    @GetMapping(\"/appQueryByDepartId\")\n    public Result<List<SysUser>> appQueryByDepartId(@RequestParam(name=\"departId\", required = false) String departId) {\n        Result<List<SysUser>> result = new Result<List<SysUser>>();\n        List<String> list=new ArrayList<String> ();\n        list.add(departId);\n        List<SysUser> childrenUser = sysUserService.queryByDepIds(list,null);\n        result.setResult(childrenUser);\n        return result;\n    }\n    /**\n     * 移动端查询用户信息(通过用户名模糊查询)\n     * @param keyword\n     * @return\n     */\n    @GetMapping(\"/appQueryUser\")\n    public Result<List<SysUser>> appQueryUser(@RequestParam(name = \"keyword\", required = false) String keyword,\n                                              @RequestParam(name = \"username\", required = false) String username,\n                                              @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n                                              @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,HttpServletRequest request) {\n        Result<List<SysUser>> result = new Result<List<SysUser>>();\n        LambdaQueryWrapper<SysUser> queryWrapper =new LambdaQueryWrapper<SysUser>();\n        // 外部模拟登陆临时账号，列表不显示\n        queryWrapper.ne(SysUser::getUsername,\"_reserve_user_external\");\n        //增加 username传参\n        if(oConvertUtils.isNotEmpty(username)){\n            if(username.contains(\",\")){\n                queryWrapper.in(SysUser::getUsername,username.split(\",\"));\n            }else{\n                queryWrapper.eq(SysUser::getUsername,username);\n            }\n        }else if(StringUtils.isNotBlank(keyword)){\n            queryWrapper.and(i -> i.like(SysUser::getUsername, keyword).or().like(SysUser::getRealname, keyword));\n        }\n        //------------------------------------------------------------------------------------------------\n        //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n        if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n            String tenantId = oConvertUtils.getString(TokenUtils.getTenantIdByRequest(request),\"-1\");\n            // 代码逻辑说明: [QQYUN-3371]租户逻辑改造，改成关系表------------\n            List<String> userIds = userTenantService.getUserIdsByTenantId(Integer.valueOf(tenantId));\n            if (oConvertUtils.listIsNotEmpty(userIds)) {\n                queryWrapper.in(SysUser::getId, userIds);\n            }\n        }\n        //------------------------------------------------------------------------------------------------\n        Page<SysUser> page = new Page<>(pageNo, pageSize);\n\n        // 代码逻辑说明: JHHB-812 【移动端】人员按照排序展示 选择人员，通讯录等 123正序排\n        queryWrapper.orderByAsc(SysUser::getSort);\n        queryWrapper.orderByDesc(SysUser::getCreateTime);\n\n        IPage<SysUser> pageList = this.sysUserService.page(page, queryWrapper);\n        //批量查询用户的所属部门\n        //step.1 先拿到全部的 useids\n        //step.2 通过 useids，一次性查询用户的所属部门名字\n        List<String> userIds = pageList.getRecords().stream().map(SysUser::getId).collect(Collectors.toList());\n        if(userIds!=null && userIds.size()>0){\n            Map<String,String>  useDepNames = sysUserService.getDepNamesByUserIds(userIds);\n            pageList.getRecords().forEach(item->{\n                item.setOrgCodeTxt(useDepNames.get(item.getId()));\n            });\n        }\n        result.setResult(pageList.getRecords());\n        return result;\n    }\n\n    /**\n     * 根据用户名修改手机号[该方法未使用]\n     * @param json\n     * @return\n     */\n    @RequestMapping(value = \"/updateMobile\", method = RequestMethod.PUT)\n    public Result<?> changMobile(@RequestBody JSONObject json,HttpServletRequest request) {\n        String smscode = json.getString(\"smscode\");\n        String phone = json.getString(\"phone\");\n        Result<SysUser> result = new Result<SysUser>();\n        //获取登录用户名\n        String username = JwtUtil.getUserNameByToken(request);\n        if(oConvertUtils.isEmpty(username) || oConvertUtils.isEmpty(smscode) || oConvertUtils.isEmpty(phone)) {\n            result.setMessage(\"修改手机号失败！\");\n            result.setSuccess(false);\n            return result;\n        }\n        // 代码逻辑说明: VUEN-2245 【漏洞】发现新漏洞待处理20220906\n        String redisKey = CommonConstant.PHONE_REDIS_KEY_PRE+phone;\n        Object object= redisUtil.get(redisKey);\n        if(null==object) {\n            result.setMessage(\"短信验证码失效！\");\n            result.setSuccess(false);\n            return result;\n        }\n        if(!smscode.equals(object.toString())) {\n            result.setMessage(\"短信验证码不匹配！\");\n            result.setSuccess(false);\n            return result;\n        }\n        SysUser user = sysUserService.getUserByName(username);\n        if(user==null) {\n            return Result.error(\"用户不存在！\");\n        }\n        user.setPhone(phone);\n        sysUserService.updateById(user);\n        return Result.ok(\"手机号设置成功!\");\n    }\n\n\n    /**\n     * 根据对象里面的属性值作in查询 属性可能会变 用户组件用到\n     * @param sysUser\n     * @return\n     */\n    @GetMapping(\"/getMultiUser\")\n    public List<SysUser> getMultiUser(SysUser sysUser){\n        QueryWrapper<SysUser> queryWrapper = QueryGenerator.initQueryWrapper(sysUser, null);\n        // 代码逻辑说明: [JTC-297]已冻结用户仍可设置为代理人------------\n        queryWrapper.eq(\"status\",Integer.parseInt(CommonConstant.STATUS_1));\n        List<SysUser> ls = this.sysUserService.list(queryWrapper);\n        for(SysUser user: ls){\n            user.setPassword(null);\n            user.setSalt(null);\n        }\n        return ls;\n    }\n    \n    /**\n     * 聊天 创建聊天组件专用  根据用户账号、用户姓名、部门id分页查询\n     * @param departId 部门id\n     * @param keyword 搜索值\n     * @return\n     */\n    @GetMapping(value = \"/getUserInformation\")\n    public Result<IPage<SysUser>> getUserInformation(\n            @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n            @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n            @RequestParam(name = \"departId\", required = false) String departId,\n            @RequestParam(name=\"keyword\",required=false) String keyword) {\n        //------------------------------------------------------------------------------------------------\n        Integer tenantId = null;\n        //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n        if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n            tenantId = oConvertUtils.getInt(TenantContext.getTenant(),0);\n        }\n        //------------------------------------------------------------------------------------------------\n        IPage<SysUser> pageList = sysUserDepartService.getUserInformation(tenantId,departId, keyword, pageSize, pageNo);\n        return Result.OK(pageList);\n    }\n\n    /**\n     * 简版流程用户选择组件\n     * @param departId 部门id\n     * @param roleId 角色id\n     * @param keyword 搜索值\n     * @return\n     */\n    @GetMapping(value = \"/selectUserList\")\n    public Result<IPage<SysUser>> selectUserList(\n            @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n            @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n            @RequestParam(name = \"departId\", required = false) String departId,\n            @RequestParam(name = \"roleId\", required = false) String roleId,\n            @RequestParam(name=\"keyword\",required=false) String keyword,\n            @RequestParam(name=\"excludeUserIdList\",required = false) String excludeUserIdList,\n            @RequestParam(name=\"includeUsernameList\",required = false) String includeUsernameList,\n            HttpServletRequest req) {\n        //------------------------------------------------------------------------------------------------\n        Integer tenantId = null;\n        //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n        if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n            String tenantStr = TenantContext.getTenant();\n            tenantId = oConvertUtils.getInteger(tenantStr, oConvertUtils.getInt(TokenUtils.getTenantIdByRequest(req), -1));\n            log.info(\"---------简流中选择用户接口，通过租户筛选，租户ID={}\", tenantId);\n        }\n        //------------------------------------------------------------------------------------------------\n        IPage<SysUser> pageList = sysUserDepartService.getUserInformation(tenantId, departId,roleId, keyword, pageSize, pageNo,excludeUserIdList,includeUsernameList);\n        return Result.OK(pageList);\n    }\n\n    /**\n     * 获取被逻辑删除的用户列表，无分页【低代码应用专用接口】\n     *\n     * @return List<SysUser>\n     */\n    @GetMapping(\"/getQuitList\")\n    public Result<List<SysUser>> getQuitList(HttpServletRequest req) {\n        Integer tenantId = oConvertUtils.getInt(TokenUtils.getTenantIdByRequest(req),0);\n        List<SysUser> quitList = sysUserService.getQuitList(tenantId);\n        if (null != quitList && quitList.size() > 0) {\n            // 批量查询用户的所属部门\n            // step.1 先拿到全部的 userIds\n            List<String> userIds = quitList.stream().map(SysUser::getId).collect(Collectors.toList());\n            // step.2 通过 userIds，一次性查询用户的所属部门名字\n            Map<String, String> useDepNames = sysUserService.getDepNamesByUserIds(userIds);\n            quitList.forEach(item -> item.setOrgCode(useDepNames.get(item.getId())));\n        }\n        return Result.ok(quitList);\n    }\n\n    /**\n     * 更新刪除状态和离职状态【低代码应用专用接口】\n     * @param jsonObject\n     * @return Result<String>\n     */\n    @PutMapping(\"/putCancelQuit\")\n    public Result<String> putCancelQuit(@RequestBody JSONObject jsonObject, HttpServletRequest request){\n        String userIds = jsonObject.getString(\"userIds\");\n        String usernames = jsonObject.getString(\"usernames\");\n        Integer tenantId = oConvertUtils.getInt(TokenUtils.getTenantIdByRequest(request),0);\n        //将状态改成未删除\n        if (StringUtils.isNotBlank(userIds)) {\n            userTenantService.putCancelQuit(Arrays.asList(userIds.split(SymbolConstant.COMMA)),tenantId);\n        }\n        return Result.ok(\"取消离职成功\");\n    }\n\n    /**\n     * 获取用户信息(vue3用户设置专用)【低代码应用专用接口】\n     * @return\n     */\n    @GetMapping(\"/login/setting/getUserData\")\n    public Result<SysUser> getUserData(HttpServletRequest request) {\n        String username = JwtUtil.getUserNameByToken(request);\n        SysUser user = sysUserService.getUserByName(username);\n        if(user==null) {\n            return Result.error(\"未找到该用户数据\");\n        }\n\n        //获取用户id通过职位数据\n        List<SysPosition> sysPositionList = sysPositionService.getPositionList(user.getId());\n        if(null != sysPositionList && sysPositionList.size()>0){\n            StringBuilder nameBuilder = new StringBuilder();\n            StringBuilder idBuilder = new StringBuilder();\n            String verticalBar = \" | \";\n            for (SysPosition sysPosition:sysPositionList){\n                nameBuilder.append(sysPosition.getName()).append(verticalBar);\n                idBuilder.append(sysPosition.getId()).append(SymbolConstant.COMMA);\n            }\n            String names = nameBuilder.toString();\n            if(oConvertUtils.isNotEmpty(names)){\n                names = names.substring(0,names.lastIndexOf(verticalBar));\n                user.setPostText(names);\n            }\n            //拼接职位id\n            String ids = idBuilder.toString();\n            if(oConvertUtils.isNotEmpty(ids)){\n                ids = ids.substring(0,ids.lastIndexOf(SymbolConstant.COMMA));\n                user.setPost(ids);\n            }\n        }\n        return Result.ok(user);\n    }\n\n    /**\n     * 用户编辑(vue3用户设置专用)【低代码应用专用接口】\n     * @param sysUser\n     * @return\n     */\n    @PostMapping(\"/login/setting/userEdit\")\n    @RequiresPermissions(\"system:user:setting:edit\")\n    public Result<String> userEdit(@RequestBody SysUser sysUser, HttpServletRequest request) {\n        String username = JwtUtil.getUserNameByToken(request);\n        SysUser user = sysUserService.getById(sysUser.getId());\n        if(user==null) {\n           return Result.error(\"未找到该用户数据\");\n        }\n        if(!username.equals(user.getUsername())){\n            return Result.error(\"只能修改自己的数据\");\n        }\n        sysUserService.updateById(sysUser);\n        return Result.ok(\"更新个人信息成功\");\n    }\n\n    /**\n     * 批量修改 【low-app】\n     * @param jsonObject\n     * @return\n     */\n    @PutMapping(\"/batchEditUsers\")\n    public Result<SysUser> batchEditUsers(@RequestBody JSONObject jsonObject) {\n        Result<SysUser> result = new Result<SysUser>();\n        try {\n            sysUserService.batchEditUsers(jsonObject);\n            result.setSuccess(true);\n            result.setMessage(\"操作成功！\");\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            result.error500(\"操作失败\");\n        }\n        return result;\n    }\n\n    /**\n     * 根据关键词搜索部门和用户【low-app】\n     * @param keyword\n     * @return\n     */\n    @GetMapping(\"/searchByKeyword\")\n    public Result<DepartAndUserInfo> searchByKeyword(@RequestParam(name=\"keyword\",required=false) String keyword) {\n        DepartAndUserInfo info = sysUserService.searchByKeyword(keyword);\n        return Result.ok(info);\n    }\n\n    /**\n     * 编辑部门前获取部门相关信息 【low-app】\n     * @param id\n     * @return\n     */\n    @GetMapping(\"/getUpdateDepartInfo\")\n    public Result<UpdateDepartInfo> getUpdateDepartInfo(@RequestParam(name=\"id\",required=false) String id) {\n        UpdateDepartInfo info = sysUserService.getUpdateDepartInfo(id);\n        return Result.ok(info);\n    }\n\n    /**\n     * 编辑部门 【low-app】\n     * @param updateDepartInfo\n     * @return\n     */\n    @PutMapping(\"/doUpdateDepartInfo\")\n    public Result<?> doUpdateDepartInfo(@RequestBody UpdateDepartInfo updateDepartInfo) {\n        sysUserService.doUpdateDepartInfo(updateDepartInfo);\n        return Result.ok();\n    }\n\n    /**\n     * 设置负责人 取消负责人\n     * @param json\n     * @return\n     */\n    @PutMapping(\"/changeDepartChargePerson\")\n    public Result<?> changeDepartChargePerson(@RequestBody JSONObject json) {\n        sysUserService.changeDepartChargePerson(json);\n        return Result.ok();\n    }\n\n    /**\n     * 修改租户下的用户【低代码应用专用接口】\n     * @param sysUser\n     * @param req\n     * @return\n     */\n    @RequestMapping(value = \"/editTenantUser\", method = {RequestMethod.PUT,RequestMethod.POST})\n    public Result<String> editTenantUser(@RequestBody SysUser sysUser,HttpServletRequest req){\n        Result<String> result = new Result<>();\n        String tenantId = TokenUtils.getTenantIdByRequest(req);\n        if(oConvertUtils.isEmpty(tenantId)){\n            return result.error500(\"无权修改他人信息！\");\n        }\n        LambdaQueryWrapper<SysUserTenant> query = new LambdaQueryWrapper<>();\n        query.eq(SysUserTenant::getTenantId,Integer.valueOf(tenantId));\n        query.eq(SysUserTenant::getUserId,sysUser.getId());\n        SysUserTenant one = userTenantService.getOne(query);\n        if(null == one){\n            return result.error500(\"非当前租户下的用户，不允许修改！\");\n        }\n        String departs = req.getParameter(\"selecteddeparts\");\n        sysUserService.editTenantUser(sysUser,tenantId,departs,null);\n        return Result.ok(\"修改成功\");\n    }\n\n    /**\n     * 切换租户时 需要修改 loginTenantId\n     * QQYUN-4491 【应用】一些小问题  1、上次选中登录的租户，下次登录未记忆\n     * @param sysUser\n     * @return\n     */\n    @PutMapping(\"/changeLoginTenantId\")\n    public Result<?> changeLoginTenantId(@RequestBody SysUser sysUser){\n        Result<String> result = new Result<>();\n        Integer tenantId = sysUser.getLoginTenantId();\n        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        String userId = loginUser.getId();\n        \n        // 判断 指定的租户ID是不是当前登录用户的租户\n        LambdaQueryWrapper<SysUserTenant> query = new LambdaQueryWrapper<>();\n        query.eq(SysUserTenant::getTenantId, tenantId);\n        query.eq(SysUserTenant::getUserId, userId);\n        SysUserTenant one = userTenantService.getOne(query);\n        if(null == one){\n            return result.error500(\"非租户下的用户，不允许修改！\");\n        }\n        \n        // 修改 loginTenantId\n        LambdaQueryWrapper<SysUser> update = new LambdaQueryWrapper<SysUser>()\n                .eq(SysUser::getId, userId);\n        SysUser updateUser = new SysUser();\n        updateUser.setLoginTenantId(tenantId);\n        sysUserService.update(updateUser, update);\n        return Result.ok();\n    } \n\n    /**\n     * 应用用户导出\n     * @param request\n     * @return\n     */\n    @RequestMapping(value = \"/exportAppUser\")\n    public ModelAndView exportAppUser(HttpServletRequest request) {\n        return sysUserService.exportAppUser(request);\n    }\n    \n   /**\n     * 应用用户导入\n     * @param request\n     * @return\n     */\n    @RequestMapping(value = \"/importAppUser\", method = RequestMethod.POST)\n    public Result<?> importAppUser(HttpServletRequest request, HttpServletResponse response)throws IOException {\n        return sysUserService.importAppUser(request);\n    }\n\n    /**\n     * 更改手机号（敲敲云个人设置专用）\n     *\n     * @param json\n     * @param request\n     */\n    @PutMapping(\"/changePhone\")\n    public Result<String> changePhone(@RequestBody JSONObject json, HttpServletRequest request){\n        //获取登录用户名\n        String username = JwtUtil.getUserNameByToken(request);\n        sysUserService.changePhone(json,username);\n        return Result.ok(\"修改手机号成功！\");\n    }\n\n    /**\n     * 发送短信验证码接口(修改手机号)\n     *\n     * @param jsonObject\n     * @return\n     */\n    @PostMapping(value = \"/sendChangePhoneSms\")\n    public Result<String> sendChangePhoneSms(@RequestBody JSONObject jsonObject, HttpServletRequest request) {\n        //获取登录用户名\n        String username = JwtUtil.getUserNameByToken(request);\n        String ipAddress = IpUtils.getIpAddr(request);\n        sysUserService.sendChangePhoneSms(jsonObject, username, ipAddress);\n        return Result.ok(\"发送验证码成功！\");\n    }\n\n    /**\n     * 发送注销用户手机号验证密码[敲敲云专用]\n     *\n     * @param jsonObject\n     * @return\n     */\n    @PostMapping(value = \"/sendLogOffPhoneSms\")\n    public Result<String> sendLogOffPhoneSms(@RequestBody JSONObject jsonObject, HttpServletRequest request) {\n        Result<String> result = new Result<>();\n        //获取登录用户名\n        String username = JwtUtil.getUserNameByToken(request);\n        String name = jsonObject.getString(\"username\");\n        if (oConvertUtils.isEmpty(name) || !name.equals(username)) {\n            result.setSuccess(false);\n            result.setMessage(\"发送验证码失败，用户不匹配！\");\n            return result;\n        }\n        String ipAddress = IpUtils.getIpAddr(request);\n        sysUserService.sendLogOffPhoneSms(jsonObject, username, ipAddress);\n        result.setSuccess(true);\n        result.setMessage(\"发送验证码成功！\");\n        return result;\n    }\n\n    /**\n     * 没有绑定手机号 直接修改密码\n     * @param oldPassword\n     * @param password\n     * @return\n     */\n    @PutMapping(\"/updatePasswordNotBindPhone\")\n    public Result<String> updatePasswordNotBindPhone(@RequestParam(value=\"oldPassword\") String oldPassword,\n                                                     @RequestParam(value=\"password\") String password,\n                                                     @RequestParam(value=\"username\") String username){\n        sysUserService.updatePasswordNotBindPhone(oldPassword, password, username);\n        return Result.OK(\"修改密码成功！\");\n    }\n\n    /**\n     * 根据部门岗位选择用户【部门岗位选择用户专用】\n     * @return\n     */\n    @GetMapping(\"/queryDepartPostUserPageList\")\n    public Result<IPage<SysUser>> queryDepartPostUserPageList( @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n                                                        @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n                                                        @RequestParam(name = \"departId\", required = false) String departId,\n                                                        @RequestParam(name=\"realname\",required=false) String realname,\n                                                        @RequestParam(name=\"username\",required=false) String username,\n                                                        @RequestParam(name=\"isMultiTranslate\",required=false) String isMultiTranslate,\n                                                        @RequestParam(name=\"id\",required = false) String id){\n        String[] arr = new String[]{departId, realname, username, id};\n        SqlInjectionUtil.filterContent(arr, SymbolConstant.SINGLE_QUOTATION_MARK);\n        IPage<SysUser> pageList = sysUserDepartService.queryDepartPostUserPageList(departId, username, realname, pageSize, pageNo,id,isMultiTranslate);\n        return Result.OK(pageList);\n    }\n\n    /**\n     * 获取上传文件的进度\n     * \n     * @param fileKey\n     * @param type\n     * @return\n     */\n    @GetMapping(\"/getUploadFileProgress\")\n    public Result<Double> getUploadFileProgress(@RequestParam(name = \"fileKey\") String fileKey,\n                                                @RequestParam(\"type\") String type){\n        Double progress = ImportSysUserCache.getImportSysUserMap(fileKey, type);\n        if(progress == 100){\n            ImportSysUserCache.removeImportLowAppMap(fileKey);\n        }\n        return Result.ok(progress);\n    }\n\n    /**\n     * 验证当前登录用户是否仍使用系统默认初始密码。\n     * 返回值说明:\n     *   yes_{URL编码后的默认密码} -> 用户当前密码为默认初始密码，前端需弹出强制修改提示\n     *   no -> 用户密码不是默认密码，或未开启默认密码检测开关\n     */\n    @GetMapping(\"/verifyIzDefaultPwd\")\n    public Result<String> verifyIzDefaultPwd() throws UnsupportedEncodingException {\n        // 未配置 Firewall 或已关闭默认密码检测开关 (enableDefaultPwdCheck=false) 时，直接返回 \"no\" 表示无需提示\n        if (jeecgBaseConfig.getFirewall() == null || Boolean.FALSE.equals((jeecgBaseConfig.getFirewall().getEnableDefaultPwdCheck()))) {\n            return Result.OK(\"no\");\n        }\n        \n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        SysUser user = sysUserService.getById(sysUser.getId());\n        String passwordEncode = PasswordUtil.encrypt(user.getUsername(), PasswordConstant.DEFAULT_PASSWORD, user.getSalt());\n        if(passwordEncode.equals(user.getPassword())){\n            String encode = URLEncoder.encode(PasswordConstant.DEFAULT_PASSWORD, \"UTF-8\");\n            return Result.OK(\"yes_\" + encode);\n        }\n        return Result.OK(\"no\");\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserOnlineController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport jakarta.annotation.Resource;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.apache.shiro.SecurityUtils;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CacheConstant;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.RedisUtil;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.base.service.BaseCommonService;\nimport org.jeecg.modules.system.service.ISysUserService;\nimport org.jeecg.modules.system.service.impl.SysBaseApiImpl;\nimport org.jeecg.modules.system.vo.SysUserOnlineVO;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.List;\n\n/**\n * @Description: 在线用户\n * @Author: chenli\n * @Date: 2020-06-07\n * @Version: V1.0\n */\n@RestController\n@RequestMapping(\"/sys/online\")\n@Slf4j\npublic class SysUserOnlineController {\n\n    @Autowired\n    private RedisUtil redisUtil;\n    @Autowired\n    public RedisTemplate redisTemplate;\n    @Autowired\n    public ISysUserService userService;\n    @Autowired\n    private SysBaseApiImpl sysBaseApi;\n    @Resource\n    private BaseCommonService baseCommonService;\n\n    @RequiresPermissions(\"system:online:list\")\n    @RequestMapping(value = \"/list\", method = RequestMethod.GET)\n    public Result<Page<SysUserOnlineVO>> list(@RequestParam(name=\"username\", required=false) String username,\n                                              @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,@RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize) {\n        Collection<String> keys = redisUtil.scan(CommonConstant.PREFIX_USER_TOKEN + \"*\");\n        List<SysUserOnlineVO> onlineList = new ArrayList<SysUserOnlineVO>();\n        for (String key : keys) {\n            String token = (String)redisUtil.get(key);\n            if (StringUtils.isNotEmpty(token)) {\n                SysUserOnlineVO online = new SysUserOnlineVO();\n                online.setToken(token);\n                //TODO 改成一次性查询\n                LoginUser loginUser = sysBaseApi.getUserByName(JwtUtil.getUsername(token));\n                if (loginUser != null && !\"_reserve_user_external\".equals(loginUser.getUsername())) {\n                    //验证用户名是否与传过来的用户名相同\n                    boolean isMatchUsername=true;\n                    //判断用户名是否为空，并且当前循环的用户不包含传过来的用户名，那么就设成false\n                    if(oConvertUtils.isNotEmpty(username) && !loginUser.getUsername().contains(username)){\n                        isMatchUsername = false;\n                    }\n                    if(isMatchUsername){\n                        BeanUtils.copyProperties(loginUser, online);\n                        onlineList.add(online);\n                    }\n                }\n            }\n        }\n        Collections.reverse(onlineList);\n\n        Page<SysUserOnlineVO> page = new Page<SysUserOnlineVO>(pageNo, pageSize);\n        int count = onlineList.size();\n        List<SysUserOnlineVO> pages = new ArrayList<>();\n        // 计算当前页第一条数据的下标\n        int currId = pageNo > 1 ? (pageNo - 1) * pageSize : 0;\n        for (int i = 0; i < pageSize && i < count - currId; i++) {\n            pages.add(onlineList.get(currId + i));\n        }\n        page.setSize(pageSize);\n        page.setCurrent(pageNo);\n        page.setTotal(count);\n        // 计算分页总页数\n        page.setPages(count % 10 == 0 ? count / 10 : count / 10 + 1);\n        page.setRecords(pages);\n\n        Result<Page<SysUserOnlineVO>> result = new Result<Page<SysUserOnlineVO>>();\n        result.setSuccess(true);\n        result.setResult(page);\n        return result;\n    }\n\n    /**\n     * 强退用户\n     */\n    @RequiresPermissions(\"system:online:forceLogout\")\n    @RequestMapping(value = \"/forceLogout\",method = RequestMethod.POST)\n    public Result<Object> forceLogout(@RequestBody SysUserOnlineVO online) {\n        //用户退出逻辑\n        if(oConvertUtils.isEmpty(online.getToken())) {\n            return Result.error(\"退出登录失败！\");\n        }\n        String username = JwtUtil.getUsername(online.getToken());\n        LoginUser sysUser = sysBaseApi.getUserByName(username);\n        if(sysUser!=null) {\n            baseCommonService.addLog(\"强制: \"+sysUser.getRealname()+\"退出成功！\", CommonConstant.LOG_TYPE_1, null,sysUser);\n            log.info(\" 强制  \"+sysUser.getRealname()+\"退出成功！ \");\n            //清空用户登录Token缓存\n            redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + online.getToken());\n            //清空用户登录Shiro权限缓存\n            redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + sysUser.getId());\n            //清空用户的缓存信息（包括部门信息），例如sys:cache:user::<username>\n            redisUtil.del(String.format(\"%s::%s\", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername()));\n            //调用shiro的logout\n            SecurityUtils.getSubject().logout();\n            return Result.ok(\"退出登录成功！\");\n        }else {\n            return Result.error(\"Token无效!\");\n        }\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.jeecg.dingtalk.api.core.response.Response;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.SecurityUtils;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\nimport org.jeecg.common.api.dto.message.MessageDTO;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.constant.enums.MessageTypeEnum;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.TokenUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.modules.system.entity.SysThirdAccount;\nimport org.jeecg.modules.system.entity.SysThirdAppConfig;\nimport org.jeecg.modules.system.service.ISysThirdAccountService;\nimport org.jeecg.modules.system.service.ISysThirdAppConfigService;\nimport org.jeecg.modules.system.service.impl.ThirdAppDingtalkServiceImpl;\nimport org.jeecg.modules.system.service.impl.ThirdAppWechatEnterpriseServiceImpl;\nimport org.jeecg.modules.system.vo.thirdapp.JwSysUserDepartVo;\nimport org.jeecg.modules.system.vo.thirdapp.JwUserDepartVo;\nimport org.jeecg.modules.system.vo.thirdapp.SyncInfoVo;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * 第三方App对接\n * @author: jeecg-boot\n */\n@Slf4j\n@RestController(\"thirdAppController\")\n@RequestMapping(\"/sys/thirdApp\")\npublic class ThirdAppController {\n\n    @Autowired\n    ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService;\n    @Autowired\n    ThirdAppDingtalkServiceImpl dingtalkService;\n\n    @Autowired\n    private ISysThirdAppConfigService appConfigService;\n\n    @Autowired\n    private ISysThirdAccountService sysThirdAccountService;\n\n    /**\n     * 获取启用的系统\n     */\n    @GetMapping(\"/getEnabledType\")\n    public Result getEnabledType() {\n        Map<String, Boolean> enabledMap = new HashMap(5);\n        int tenantId;\n        //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n        if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n            tenantId = oConvertUtils.getInt(TenantContext.getTenant(), -1);\n        } else {\n            tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n        }\n        //查询当前租户下的第三方配置\n        List<SysThirdAppConfig> list = appConfigService.getThirdConfigListByThirdType(tenantId);\n        //钉钉是否已配置\n        boolean dingConfig = false;\n        //企业微信是否已配置\n        boolean qywxConfig = false;\n        if(null != list && list.size()>0){\n            for (SysThirdAppConfig config:list) {\n                if(MessageTypeEnum.DD.getType().equals(config.getThirdType())){\n                    dingConfig = true;\n                    continue;\n                }\n                if(MessageTypeEnum.QYWX.getType().equals(config.getThirdType())){\n                    qywxConfig = true;\n                    continue;\n                }\n            }\n        }\n        enabledMap.put(\"wechatEnterprise\", qywxConfig);\n        enabledMap.put(\"dingtalk\", dingConfig);\n        return Result.OK(enabledMap);\n    }\n\n    /**\n     * 同步本地[用户]到【企业微信】\n     *\n     * @param ids\n     * @return\n     */\n    @GetMapping(\"/sync/wechatEnterprise/user/toApp\")\n    public Result syncWechatEnterpriseUserToApp(@RequestParam(value = \"ids\", required = false) String ids) {\n        //获取企业微信配置\n        Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(),0);\n        SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType());\n        if (null != config) {\n        // 代码逻辑说明: [QQYUN-3440]通过租户模式隔离 ------------\n            SyncInfoVo syncInfo = wechatEnterpriseService.syncLocalUserToThirdApp(ids);\n            if (syncInfo.getFailInfo().size() == 0) {\n                return Result.OK(\"同步成功\", syncInfo);\n            } else {\n                return Result.error(\"同步失败\", syncInfo);\n            }\n        }\n        return Result.error(\"企业微信尚未配置,请配置企业微信\");\n    }\n\n    /**\n     * 同步【企业微信】[用户]到本地\n     *\n     * @param ids 作废\n     * @return\n     */\n    @GetMapping(\"/sync/wechatEnterprise/user/toLocal\")\n    public Result syncWechatEnterpriseUserToLocal(@RequestParam(value = \"ids\", required = false) String ids) {\n        return Result.error(\"由于企业微信接口调整，同步到本地功能已失效\");\n\n//        if (thirdAppConfig.isWechatEnterpriseEnabled()) {\n//            SyncInfoVo syncInfo = wechatEnterpriseService.syncThirdAppUserToLocal();\n//            if (syncInfo.getFailInfo().size() == 0) {\n//                return Result.OK(\"同步成功\", syncInfo);\n//            } else {\n//                return Result.error(\"同步失败\", syncInfo);\n//            }\n//        }\n//        return Result.error(\"企业微信同步功能已禁用\");\n    }\n\n    /**\n     * 同步本地[部门]到【企业微信】\n     *\n     * @param ids\n     * @return\n     */\n    @GetMapping(\"/sync/wechatEnterprise/depart/toApp\")\n    public Result syncWechatEnterpriseDepartToApp(@RequestParam(value = \"ids\", required = false) String ids) {\n        //获取企业微信配置\n        Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(),0);\n        SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType());\n        if (null != config) {\n            SyncInfoVo syncInfo = wechatEnterpriseService.syncLocalDepartmentToThirdApp(ids);\n            if (syncInfo.getFailInfo().size() == 0) {\n                return Result.OK(\"同步成功\", null);\n            } else {\n                return Result.error(\"同步失败\", syncInfo);\n            }\n        }\n        return Result.error(\"企业微信尚未配置,请配置企业微信\");\n    }\n\n    /**\n     * 同步【企业微信】[部门]到本地\n     *\n     * @param ids\n     * @return\n     */\n    @GetMapping(\"/sync/wechatEnterprise/depart/toLocal\")\n    public Result syncWechatEnterpriseDepartToLocal(@RequestParam(value = \"ids\", required = false) String ids) {\n        return Result.error(\"由于企业微信接口调整，企业微信同步本地部门失效\");\n//        //获取企业微信配置\n//        Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(),0);\n//        SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType());\n//        if (null != config) {\n//            SyncInfoVo syncInfo = wechatEnterpriseService.syncThirdAppDepartmentToLocal(ids);\n//            if (syncInfo.getFailInfo().size() == 0) {\n//                return Result.OK(\"同步成功\", syncInfo);\n//            } else {\n//                return Result.error(\"同步失败\", syncInfo);\n//            }\n//        }\n//        return Result.error(\"企业微信尚未配置,请配置企业微信\");\n    }\n\n    /**\n     * 同步本地[部门]到【钉钉】\n     *\n     * @param ids\n     * @return\n     */\n    @GetMapping(\"/sync/dingtalk/depart/toApp\")\n    public Result syncDingtalkDepartToApp(@RequestParam(value = \"ids\", required = false) String ids) {\n        //获取钉钉配置\n        Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(),0);\n        SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType());\n        if (null != config) {\n            SyncInfoVo syncInfo = dingtalkService.syncLocalDepartmentToThirdApp(ids);\n            if (syncInfo.getFailInfo().size() == 0) {\n                return Result.OK(\"同步成功\", null);\n            } else {\n                return Result.error(\"同步失败\", syncInfo);\n            }\n        }\n        return Result.error(\"钉钉尚未配置,请配置钉钉\");\n    }\n\n//    /**\n//     * 同步【钉钉】[部门]到本地\n//     *\n//     * @param ids\n//     * @return\n//     */\n//   @GetMapping(\"/sync/dingtalk/depart/toLocal\")\n//    public Result syncDingtalkDepartToLocal(@RequestParam(value = \"ids\", required = false) String ids) {\n//        //获取钉钉配置\n//        Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(),0);\n//        SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType());\n//        if (null!= config) {\n//            SyncInfoVo syncInfo = dingtalkService.syncThirdAppDepartmentToLocal(ids);\n//            if (syncInfo.getFailInfo().size() == 0) {\n//                return Result.OK(\"同步成功\", syncInfo);\n//            } else {\n//                return Result.error(\"同步失败\", syncInfo);\n//            }\n//        }\n//        return Result.error(\"钉钉尚未配置,请配置钉钉\");\n//    }\n\n    /**\n     * 同步本地[用户]到【钉钉】\n     *\n     * @param ids\n     * @return\n     */\n    @GetMapping(\"/sync/dingtalk/user/toApp\")\n    public Result syncDingtalkUserToApp(@RequestParam(value = \"ids\", required = false) String ids) {\n        //获取钉钉配置\n        int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n        //根据租户id和第三方类别获取租户数据\n        SysThirdAppConfig appConfig = appConfigService.getThirdConfigByThirdType(tenantId,MessageTypeEnum.DD.getType());\n        if(null != appConfig){\n            SyncInfoVo syncInfo = dingtalkService.syncLocalUserToThirdApp(ids);\n            if (syncInfo.getFailInfo().size() == 0) {\n                return Result.OK(\"同步成功\", syncInfo);\n            } else {\n                return Result.error(\"同步失败\", syncInfo);\n            }\n        }\n        return Result.error(\"钉钉尚未配置,请配置钉钉\");\n    }\n\n//    /**\n//     * 同步【钉钉】[用户]到本地\n//     *\n//     * @param ids 作废\n//     * @return\n//     */\n//    @GetMapping(\"/sync/dingtalk/user/toLocal\")\n//    public Result syncDingtalkUserToLocal(@RequestParam(value = \"ids\", required = false) String ids) {\n//        //获取钉钉配置\n//        Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(),0);\n//        SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType());\n//        if (null != config) {\n//            SyncInfoVo syncInfo = dingtalkService.syncThirdAppUserToLocal();\n//            if (syncInfo.getFailInfo().size() == 0) {\n//                return Result.OK(\"同步成功\", syncInfo);\n//            } else {\n//                return Result.error(\"同步失败\", syncInfo);\n//            }\n//        }\n//        return Result.error(\"钉钉尚未配置,请配置钉钉\");\n//    }\n\n    /**\n     * 发送消息测试\n     *\n     * @return\n     */\n    @PostMapping(\"/sendMessageTest\")\n    public Result sendMessageTest(@RequestBody JSONObject params, HttpServletRequest request) {\n        /* 获取前台传递的参数 */\n        // 第三方app的类型\n        String app = params.getString(\"app\");\n        // 是否发送给全部人\n        boolean sendAll = params.getBooleanValue(\"sendAll\");\n        // 消息接收者，传sys_user表的username字段，多个用逗号分割\n        String receiver = params.getString(\"receiver\");\n        // 消息内容\n        String content = params.getString(\"content\");\n        // 租户id\n        int tenantId = oConvertUtils.getInt(TenantContext.getTenant(),0);\n\n        String fromUser = JwtUtil.getUserNameByToken(request);\n        String title = \"第三方APP消息测试\";\n        MessageDTO message = new MessageDTO(fromUser, receiver, title, content);\n        message.setToAll(sendAll);\n        // 代码逻辑说明: [QQYUN-3440]钉钉、企业微信通过租户模式隔离 ------------\n        String weChatType = MessageTypeEnum.QYWX.getType();\n        String dingType = MessageTypeEnum.DD.getType();\n        if (weChatType.toUpperCase().equals(app)) {\n            SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, weChatType);\n            if (null != config) {\n                JSONObject response = wechatEnterpriseService.sendMessageResponse(message, false);\n                return Result.OK(response);\n            }\n            return Result.error(\"企业微信尚未配置,请配置企业微信\");\n        } else if (dingType.toUpperCase().equals(app)) {\n            SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, dingType);\n            if (null != config) {\n                Response<String> response = dingtalkService.sendMessageResponse(message, false);\n                return Result.OK(response);\n            }\n            return Result.error(\"钉钉尚未配置,请配置钉钉\");\n        }\n        return Result.error(\"不识别的第三方APP\");\n    }\n\n    /**\n     * 撤回消息测试\n     *\n     * @return\n     */\n    @PostMapping(\"/recallMessageTest\")\n    public Result recallMessageTest(@RequestBody JSONObject params) {\n        /* 获取前台传递的参数 */\n        // 第三方app的类型\n        String app = params.getString(\"app\");\n        // 消息id\n        String msgTaskId = params.getString(\"msg_task_id\");\n        //租户id\n        int tenantId = oConvertUtils.getInt(TenantContext.getTenant(),0);\n        if (CommonConstant.WECHAT_ENTERPRISE.equals(app)) {\n            SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType());\n            if (null != config) {\n                return Result.error(\"企业微信不支持撤回消息\");\n            }\n            return Result.error(\"企业微信尚未配置,请配置企业微信\");\n        } else if (CommonConstant.DINGTALK.equals(app)) {\n            SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType());\n            if (null != config) {\n                Response<JSONObject> response = dingtalkService.recallMessageResponse(msgTaskId);\n                if (response.isSuccess()) {\n                    return Result.OK(\"撤回成功\", response);\n                } else {\n                    return Result.error(\"撤回失败：\" + response.getErrcode() + \"——\" + response.getErrmsg(), response);\n                }\n            }\n            return Result.error(\"钉钉尚未配置,请配置钉钉\");\n        }\n        return Result.error(\"不识别的第三方APP\");\n    }\n\n    //========================begin 应用低代码钉钉/企业微信同步用户部门专用 =============================\n    /**\n     * 添加第三方app配置\n     *\n     * @param appConfig\n     * @return\n     */\n    @RequestMapping(value = \"/addThirdAppConfig\", method = RequestMethod.POST)\n    public Result<String> addThirdAppConfig(@RequestBody SysThirdAppConfig appConfig) {\n        Result<String> result = new Result<>();\n        //根据当前登录租户id和第三方类别判断是否已经创建\n        Integer tenantId = oConvertUtils.isNotEmpty(appConfig.getTenantId()) ? appConfig.getTenantId() : oConvertUtils.getInt(TenantContext.getTenant(), 0);\n        SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, appConfig.getThirdType());\n        if (null != config) {\n            result.error500(\"操作失败,同一个租户下只允许绑定一个钉钉或者企业微信\");\n            return result;\n        }\n        String clientId = appConfig.getClientId();\n        //通过应用key获取第三方配置\n        List<SysThirdAppConfig> thirdAppConfigByClientId = appConfigService.getThirdAppConfigByClientId(clientId);\n        if(CollectionUtil.isNotEmpty(thirdAppConfigByClientId)){\n            result.error500(\"AppKey已存在，请勿重复添加\");\n            return result;\n        }\n        try {\n            appConfig.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(),0));\n            appConfigService.save(appConfig);\n            result.success(\"添加成功！\");\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            result.error500(\"操作失败\");\n        }\n        return result;\n    }\n\n    /**\n     * 编辑第三方app配置\n     *\n     * @param appConfig\n     * @return\n     */\n    @RequestMapping(value = \"/editThirdAppConfig\", method = {RequestMethod.PUT, RequestMethod.POST})\n    public Result<String> editThirdAppConfig(@RequestBody SysThirdAppConfig appConfig) {\n        Result<String> result = new Result<>();\n        SysThirdAppConfig config = appConfigService.getById(appConfig.getId());\n        if (null == config) {\n            result.error500(\"数据不存在\");\n            return result;\n        }\n        String clientId = appConfig.getClientId();\n        //如果编辑的应用key,和数据库中的不一致，需要判断应用key是否已存在\n        if(!clientId.equals(config.getClientId())){\n            //通过应用key获取第三方配置\n            List<SysThirdAppConfig> thirdAppConfigByClientId = appConfigService.getThirdAppConfigByClientId(clientId);\n            if(CollectionUtil.isNotEmpty(thirdAppConfigByClientId)){\n                result.error500(\"AppKey已存在，请勿重复添加\");\n                return result;\n            }\n        }\n        try {\n            appConfigService.updateById(appConfig);\n            result.success(\"修改成功！\");\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            result.error500(\"操作失败\");\n        }\n        return result;\n    }\n\n    /**\n     * 根据id删除第三方配置表\n     * @param id\n     * @return\n     */\n    @DeleteMapping(value = \"/deleteThirdAppConfig\")\n    @RequiresPermissions(\"system:third:config:delete\")\n    public Result<String> deleteThirdAppConfig(@RequestParam(name=\"id\",required=true) String id) {\n        Result<String> result = new Result<>();\n        SysThirdAppConfig config = appConfigService.getById(id);\n        if (null == config) {\n            result.error500(\"数据不存在\");\n            return result;\n        }\n        try {\n            appConfigService.removeById(id);\n            result.success(\"解绑成功！\");\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            result.error500(\"操作失败\");\n        }\n        return result;\n    }\n    \n\n    /**\n     * 根据租户id和第三方类型获取第三方app配置信息\n     *\n     * @param tenantId\n     * @param thirdType\n     * @return\n     */\n    @GetMapping(\"/getThirdConfigByTenantId\")\n    public Result<SysThirdAppConfig> getThirdAppByTenantId(@RequestParam(name = \"tenantId\", required = false) Integer tenantId,\n                                                           @RequestParam(name = \"thirdType\") String thirdType) {\n        if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n            if (tenantId == null) {\n                return Result.error(\"开启多租户模式，租户ID参数不允许为空！\");\n            }\n        } else {\n            //租户未传递，则采用平台的\n            if (tenantId == null) {\n                tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n            }\n        }\n        Result<SysThirdAppConfig> result = new Result<>();\n        LambdaQueryWrapper<SysThirdAppConfig> query = new LambdaQueryWrapper<>();\n        query.eq(SysThirdAppConfig::getThirdType,thirdType);\n        query.eq(SysThirdAppConfig::getTenantId,tenantId);\n        SysThirdAppConfig sysThirdAppConfig = appConfigService.getOne(query);\n        result.setSuccess(true);\n        result.setResult(sysThirdAppConfig);\n        return result;\n    }\n\n    /**\n     * 同步【钉钉】[部门和用户]到本地\n     *\n     * @param ids\n     * @return\n     */\n    @GetMapping(\"/sync/dingtalk/departAndUser/toLocal\")\n    public Result syncDingTalkDepartAndUserToLocal(@RequestParam(value = \"ids\", required = false) String ids) {\n        Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n        SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType());\n        if (null != config) {\n            SyncInfoVo syncInfo = dingtalkService.syncThirdAppDepartmentUserToLocal();\n            if (syncInfo.getFailInfo().size() == 0) {\n                return Result.OK(\"同步成功\", syncInfo);\n            } else {\n                return Result.error(\"同步失败\", syncInfo);\n            }\n        }\n        return Result.error(\"钉钉尚未配置,请配置钉钉\");\n    }\n    //========================end 应用低代码钉钉/企业微信同步用户部门专用 ========================\n\n\n    //========================begin 应用低代码账号设置第三方账号绑定 ================================\n    /**\n     * 获取第三方账号\n     * @param thirdType\n     * @return\n     */\n    @GetMapping(\"/getThirdAccountByUserId\")\n    public Result<List<SysThirdAccount>> getThirdAccountByUserId(@RequestParam(name=\"thirdType\") String thirdType){\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        LambdaQueryWrapper<SysThirdAccount> query = new LambdaQueryWrapper<>();\n        //根据id查询\n        query.eq(SysThirdAccount::getSysUserId,sysUser.getId());\n        //扫码登录只有租户为0\n        query.eq(SysThirdAccount::getTenantId,CommonConstant.TENANT_ID_DEFAULT_VALUE);\n        //根据第三方类别查询\n        if(oConvertUtils.isNotEmpty(thirdType)){\n            query.in(SysThirdAccount::getThirdType, Arrays.asList(thirdType.split(SymbolConstant.COMMA)));\n        }\n        List<SysThirdAccount> list = sysThirdAccountService.list(query);\n        return Result.ok(list);\n    }\n\n    /**\n     * 绑定第三方账号\n     * @return\n     */\n    @PostMapping(\"/bindThirdAppAccount\")\n    public Result<SysThirdAccount> bindThirdAppAccount(@RequestBody SysThirdAccount sysThirdAccount){\n        SysThirdAccount thirdAccount = sysThirdAccountService.bindThirdAppAccountByUserId(sysThirdAccount);\n        return Result.ok(thirdAccount);\n    }\n\n    /**\n     * 删除第三方用户信息\n     * @param sysThirdAccount\n     * @return\n     */\n    @DeleteMapping(\"/deleteThirdAccount\")\n    public Result<String> deleteThirdAccountById(@RequestBody SysThirdAccount sysThirdAccount){\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        if(!sysUser.getId().equals(sysThirdAccount.getSysUserId())){\n            return Result.error(\"无权修改他人信息\");\n        }\n        SysThirdAccount thirdAccount = sysThirdAccountService.getById(sysThirdAccount.getId());\n        if(null == thirdAccount){\n            return Result.error(\"未找到改第三方账户信息\");\n        }\n        sysThirdAccountService.removeById(thirdAccount.getId());\n        return Result.ok(\"解绑成功\");\n    }\n    //========================end 应用低代码账号设置第三方账号绑定 ================================\n\n    /**\n     * 获取企业微信绑定的用户信息\n     * @param request\n     * @return\n     */\n    @GetMapping(\"/getThirdUserByWechat\")\n    public Result<JwSysUserDepartVo> getThirdUserByWechat(HttpServletRequest request){\n        //获取企业微信配置\n        Integer tenantId = oConvertUtils.getInt(TokenUtils.getTenantIdByRequest(request),0);\n        SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType());\n        if (null != config) {\n            JwSysUserDepartVo list = wechatEnterpriseService.getThirdUserByWechat(tenantId);\n            return Result.ok(list);\n        }\n        return Result.error(\"企业微信尚未配置,请配置企业微信\"); \n    }\n\n    /**\n     * 同步企业微信部门和用户到本地\n     * @param jwUserDepartJson\n     * @param request\n     * @return\n     */\n    @GetMapping(\"/sync/wechatEnterprise/departAndUser/toLocal\")\n    public Result<SyncInfoVo> syncWechatEnterpriseDepartAndUserToLocal(@RequestParam(name = \"jwUserDepartJson\") String jwUserDepartJson,HttpServletRequest request){\n        int tenantId = oConvertUtils.getInt(TokenUtils.getTenantIdByRequest(request), 0);\n        SyncInfoVo syncInfoVo = wechatEnterpriseService.syncWechatEnterpriseDepartAndUserToLocal(jwUserDepartJson,tenantId);\n        return Result.ok(syncInfoVo);\n    }\n\n    /**\n     * 查询被绑定的企业微信用户\n     * @param request\n     * @return\n     */\n    @GetMapping(\"/getThirdUserBindByWechat\")\n    public Result<List<JwUserDepartVo>> getThirdUserBindByWechat(HttpServletRequest request){\n        int tenantId = oConvertUtils.getInt(TokenUtils.getTenantIdByRequest(request), 0);\n        List<JwUserDepartVo> jwSysUserDepartVos = wechatEnterpriseService.getThirdUserBindByWechat(tenantId);\n        return Result.ok(jwSysUserDepartVos);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdLoginController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport cn.hutool.core.util.RandomUtil;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.xkcoding.justauth.AuthRequestFactory;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.extern.slf4j.Slf4j;\nimport me.zhyd.oauth.model.AuthCallback;\nimport me.zhyd.oauth.model.AuthResponse;\nimport me.zhyd.oauth.request.AuthRequest;\nimport me.zhyd.oauth.utils.AuthStateUtils;\nimport me.zhyd.oauth.utils.StringUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.enums.MessageTypeEnum;\nimport org.jeecg.common.system.api.ISysBaseAPI;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.util.*;\nimport org.jeecg.modules.base.service.BaseCommonService;\nimport org.jeecg.modules.system.entity.SysDepart;\nimport org.jeecg.modules.system.entity.SysThirdAccount;\nimport org.jeecg.modules.system.entity.SysThirdAppConfig;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.model.ThirdLoginModel;\nimport org.jeecg.modules.system.service.ISysDictService;\nimport org.jeecg.modules.system.service.ISysThirdAccountService;\nimport org.jeecg.modules.system.service.ISysThirdAppConfigService;\nimport org.jeecg.modules.system.service.ISysUserService;\nimport org.jeecg.modules.system.service.ISysDepartService;\nimport org.jeecg.modules.system.service.impl.ThirdAppDingtalkServiceImpl;\nimport org.jeecg.modules.system.service.impl.ThirdAppWechatEnterpriseServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.ModelMap;\nimport org.springframework.web.bind.annotation.*;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLEncoder;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * @Author scott\n * @since 2018-12-17\n */\n@Controller\n@RequestMapping(\"/sys/thirdLogin\")\n@Slf4j\npublic class ThirdLoginController {\n\t@Autowired\n\tprivate ISysUserService sysUserService;\n\t@Autowired\n\tprivate ISysThirdAccountService sysThirdAccountService;\n\t@Autowired\n\tprivate ISysDictService sysDictService;\n\t@Autowired\n\tprivate BaseCommonService baseCommonService;\n\t@Autowired\n    private RedisUtil redisUtil;\n\t@Autowired\n\tprivate AuthRequestFactory factory;\n\t@Autowired\n\tprivate ISysDepartService sysDepartService;\n\n\t@Autowired\n\tprivate ThirdAppWechatEnterpriseServiceImpl thirdAppWechatEnterpriseService;\n\t@Autowired\n\tprivate ThirdAppDingtalkServiceImpl thirdAppDingtalkService;\n\n\t@Autowired\n\tprivate ISysThirdAppConfigService appConfigService;\n\n\t@Autowired\n\tpublic ISysBaseAPI sysBaseAPI;\n\n\t@RequestMapping(\"/render/{source}\")\n    public void render(@PathVariable(\"source\") String source, HttpServletResponse response) throws IOException {\n        log.info(\"第三方登录进入render：\" + source);\n        AuthRequest authRequest = factory.get(source);\n        String authorizeUrl = authRequest.authorize(AuthStateUtils.createState());\n        log.info(\"第三方登录认证地址：\" + authorizeUrl);\n        response.sendRedirect(authorizeUrl);\n    }\n\n\t@RequestMapping(\"/{source}/callback\")\n    public String loginThird(@PathVariable(\"source\") String source, AuthCallback callback,ModelMap modelMap) {\n\t\tlog.info(\"第三方登录进入callback：\" + source + \" params：\" + JSONObject.toJSONString(callback));\n        AuthRequest authRequest = factory.get(source);\n        AuthResponse response = authRequest.login(callback);\n        log.info(JSONObject.toJSONString(response));\n        Result<JSONObject> result = new Result<JSONObject>();\n        if(response.getCode()==2000) {\n\n        \tJSONObject data = JSONObject.parseObject(JSONObject.toJSONString(response.getData()));\n        \tString username = data.getString(\"username\");\n        \tString avatar = data.getString(\"avatar\");\n        \tString uuid = data.getString(\"uuid\");\n        \t//构造第三方登录信息存储对象\n\t\t\tThirdLoginModel tlm = new ThirdLoginModel(source, uuid, username, avatar);\n        \t//判断有没有这个人\n\t\t\t// 代码逻辑说明: 修改成查询第三方账户表\n        \tLambdaQueryWrapper<SysThirdAccount> query = new LambdaQueryWrapper<SysThirdAccount>();\n        \tquery.eq(SysThirdAccount::getThirdType, source);\n\t\t\t// 代码逻辑说明: 【QQYUN-6667】敲敲云，线上解绑重新绑定一直提示这个---\n        \tquery.eq(SysThirdAccount::getTenantId, CommonConstant.TENANT_ID_DEFAULT_VALUE);\n\t\t\tquery.and(q -> q.eq(SysThirdAccount::getThirdUserUuid, uuid).or().eq(SysThirdAccount::getThirdUserId, uuid));\n        \tList<SysThirdAccount> thridList = sysThirdAccountService.list(query);\n\t\t\tSysThirdAccount user = null;\n        \tif(thridList==null || thridList.size()==0) {\n\t\t\t\t//否则直接创建新账号\n\t\t\t\tuser = sysThirdAccountService.saveThirdUser(tlm,CommonConstant.TENANT_ID_DEFAULT_VALUE);\n        \t}else {\n        \t\t//已存在 只设置用户名 不设置头像\n        \t\tuser = thridList.get(0);\n        \t}\n        \t// 生成token\n\t\t\t// 代码逻辑说明: 从第三方登录查询是否存在用户id，不存在绑定手机号\n\t\t\tif(oConvertUtils.isNotEmpty(user.getSysUserId())) {\n\t\t\t\tString sysUserId = user.getSysUserId();\n\t\t\t\tSysUser sysUser = sysUserService.getById(sysUserId);\n\t\t\t\tString token = saveToken(sysUser);\n    \t\t\tmodelMap.addAttribute(\"token\", token);\n\t\t\t}else{\n\t\t\t\tmodelMap.addAttribute(\"token\", \"绑定手机号,\"+\"\"+uuid);\n\t\t\t}\n        }else{\n\t\t\tmodelMap.addAttribute(\"token\", \"登录失败\");\n\t\t}\n        result.setSuccess(false);\n        result.setMessage(\"第三方登录异常,请联系管理员\");\n        return \"thirdLogin\";\n    }\n\n\t/**\n\t * 创建新账号\n\t * @param model\n\t * @return\n\t */\n\t@PostMapping(\"/user/create\")\n\t@ResponseBody\n\tpublic Result<String> thirdUserCreate(@RequestBody ThirdLoginModel model) {\n\t\tlog.info(\"第三方登录创建新账号：\" );\n\t\tResult<String> res = new Result<>();\n\t\tObject operateCode = redisUtil.get(CommonConstant.THIRD_LOGIN_CODE);\n\t\tif(operateCode==null || !operateCode.toString().equals(model.getOperateCode())){\n\t\t\tres.setSuccess(false);\n\t\t\tres.setMessage(\"校验失败\");\n\t\t\treturn res;\n\t\t}\n\t\t//创建新账号\n\t\t// 代码逻辑说明: 修改成从第三方登录查出来的user_id，在查询用户表尽行token\n\t\tSysThirdAccount user = sysThirdAccountService.saveThirdUser(model,CommonConstant.TENANT_ID_DEFAULT_VALUE);\n\t\tif(oConvertUtils.isNotEmpty(user.getSysUserId())){\n\t\t\tString sysUserId = user.getSysUserId();\n\t\t\tSysUser sysUser = sysUserService.getById(sysUserId);\n\t\t\t// 生成token\n\t\t\tString token = saveToken(sysUser);\n\t\t\tres.setResult(token);\n\t\t\tres.setSuccess(true);\n\t\t}\n\t\treturn res;\n\t}\n\n\t/**\n\t * 绑定账号 需要设置密码 需要走一遍校验\n\t * @param json\n\t * @return\n\t */\n\t@PostMapping(\"/user/checkPassword\")\n\t@ResponseBody\n\tpublic Result<String> checkPassword(@RequestBody JSONObject json) {\n\t\tResult<String> result = new Result<>();\n\t\tObject operateCode = redisUtil.get(CommonConstant.THIRD_LOGIN_CODE);\n\t\tif(operateCode==null || !operateCode.toString().equals(json.getString(\"operateCode\"))){\n\t\t\tresult.setSuccess(false);\n\t\t\tresult.setMessage(\"校验失败\");\n\t\t\treturn result;\n\t\t}\n\t\tString username = json.getString(\"uuid\");\n\t\tSysUser user = this.sysUserService.getUserByName(username);\n\t\tif(user==null){\n\t\t\tresult.setMessage(\"用户未找到\");\n\t\t\tresult.setSuccess(false);\n\t\t\treturn result;\n\t\t}\n\t\tString password = json.getString(\"password\");\n\t\tString salt = user.getSalt();\n\t\tString passwordEncode = PasswordUtil.encrypt(user.getUsername(), password, salt);\n\t\tif(!passwordEncode.equals(user.getPassword())){\n\t\t\tresult.setMessage(\"密码不正确\");\n\t\t\tresult.setSuccess(false);\n\t\t\treturn result;\n\t\t}\n\n\t\tsysUserService.updateById(user);\n\t\tresult.setSuccess(true);\n\t\t// 生成token\n\t\tString token = saveToken(user);\n\t\tresult.setResult(token);\n\t\treturn result;\n\t}\n\n\tprivate String saveToken(SysUser user) {\n\t\t// 生成token\n\t\tString token = JwtUtil.sign(user.getUsername(), user.getPassword(), CommonConstant.CLIENT_TYPE_PC);\n\t\tredisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);\n\t\t// 设置超时时间\n\t\tredisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000);\n\t\treturn token;\n\t}\n\n\t/**\n\t * 第三方登录回调接口\n\t * @param token\n\t * @param thirdType\n\t * @return\n\t * @throws Exception\n\t */\n\t@SuppressWarnings(\"unchecked\")\n\t@RequestMapping(value = \"/getLoginUser/{token}/{thirdType}/{tenantId}\", method = RequestMethod.GET)\n\t@ResponseBody\n\tpublic Result<JSONObject> getThirdLoginUser(@PathVariable(\"token\") String token,@PathVariable(\"thirdType\") String thirdType,@PathVariable(\"tenantId\") String tenantId) throws Exception {\n\t\tResult<JSONObject> result = new Result<JSONObject>();\n\t\tString username = JwtUtil.getUsername(token);\n\t\t// 代码逻辑说明: [QQYUN-11021]三方登录接口通过token获取用户信息漏洞修复------------\n\t\tif (!TokenUtils.verifyToken(token, sysBaseAPI, redisUtil)) {\n\t\t\treturn Result.noauth(\"token验证失败\");\n\t\t}\n\t\t//1. 校验用户是否有效\n\t\tSysUser sysUser = sysUserService.getUserByName(username);\n\t\tresult = sysUserService.checkUserIsEffective(sysUser);\n\t\tif(!result.isSuccess()) {\n\t\t\treturn result;\n\t\t}\n\t\t// 代码逻辑说明: 如果真实姓名和头像不存在就取第三方登录的\n\t\tLambdaQueryWrapper<SysThirdAccount> query = new LambdaQueryWrapper<>();\n\t\tquery.eq(SysThirdAccount::getSysUserId,sysUser.getId());\n\t\tquery.eq(SysThirdAccount::getThirdType,thirdType);\n\t\tquery.eq(SysThirdAccount::getTenantId,oConvertUtils.getInt(tenantId,CommonConstant.TENANT_ID_DEFAULT_VALUE));\n\t\t// 代码逻辑说明: [QQYUN-4883]钉钉auth登录同一个租户下有同一个用户id------------\n\t\tList<SysThirdAccount> accountList = sysThirdAccountService.list(query);\n\t\tSysThirdAccount account = new SysThirdAccount();\n\t\tif(CollectionUtil.isNotEmpty(accountList)){\n\t\t\taccount = accountList.get(0);\n\t\t}\n\t\tif(oConvertUtils.isEmpty(sysUser.getRealname())){\n\t\t\tsysUser.setRealname(account.getRealname());\n\t\t}\n\t\tif(oConvertUtils.isEmpty(sysUser.getAvatar())){\n\t\t\tsysUser.setAvatar(account.getAvatar());\n\t\t}\n\t\tJSONObject obj = new JSONObject();\n\t\t//第三方登确定登录租户和部门逻辑\n\t\tthis.setUserTenantAndDepart(sysUser,obj,result);\t\t\n\t\t//用户登录信息\n\t\tobj.put(\"userInfo\", sysUser);\n\t\t//获取字典缓存【解决 #jeecg-boot/issues/3998】\n\t\tobj.put(\"sysAllDictItems\", sysDictService.queryAllDictItems());\n\t\t//token 信息\n\t\tobj.put(\"token\", token);\n\t\tresult.setResult(obj);\n\t\tresult.setSuccess(true);\n\t\tresult.setCode(200);\n\t\tbaseCommonService.addLog(\"用户名: \" + username + \",登录成功[第三方用户]！\", CommonConstant.LOG_TYPE_1, null);\n\t\treturn result;\n\t}\n\t/**\n\t * 第三方绑定手机号返回token\n\t *\n\t * @param jsonObject\n\t * @return\n\t */\n\t@Operation(summary=\"手机号登录接口\")\n\t@PostMapping(\"/bindingThirdPhone\")\n\t@ResponseBody\n\tpublic Result<String> bindingThirdPhone(@RequestBody JSONObject jsonObject) {\n\t\tResult<String> result = new Result<String>();\n\t\tString phone = jsonObject.getString(\"mobile\");\n\t\tString thirdUserUuid = jsonObject.getString(\"thirdUserUuid\");\n\t\t// 校验验证码\n\t\tString captcha = jsonObject.getString(\"captcha\");\n\t\t// 代码逻辑说明: VUEN-2245 【漏洞】发现新漏洞待处理20220906\n\t\tString redisKey = CommonConstant.PHONE_REDIS_KEY_PRE+phone;\n\t\tObject captchaCache = redisUtil.get(redisKey);\n\t\tif (oConvertUtils.isEmpty(captcha) || !captcha.equals(captchaCache)) {\n\t\t\tresult.setMessage(\"验证码错误\");\n\t\t\tresult.setSuccess(false);\n\t\t\treturn result;\n\t\t}\n\t\t//校验用户有效性\n\t\tSysUser sysUser = sysUserService.getUserByPhone(phone);\n\t\tif(sysUser != null){\n\t\t\t// 存在用户，直接绑定\n\t\t\tsysThirdAccountService.updateThirdUserId(sysUser,thirdUserUuid);\n\t\t}else{\n\t\t\t// 不存在手机号，创建用户\n\t\t\tsysUser = sysThirdAccountService.createUser(phone,thirdUserUuid,CommonConstant.TENANT_ID_DEFAULT_VALUE);\n\t\t}\n\t\tString token = saveToken(sysUser);\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(token);\n\t\treturn result;\n\t}\n\n\t/**\n\t * 企业微信/钉钉 OAuth2登录\n\t *\n\t * @param source\n\t * @param state\n\t * @return\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/oauth2/{source}/login\")\n\tpublic String oauth2LoginCallback(@PathVariable(\"source\") String source, @RequestParam(\"state\") String state, HttpServletRequest request, HttpServletResponse response,\n\t\t\t\t\t\t\t\t\t  @RequestParam(value = \"tenantId\",required = false,defaultValue = \"0\") String tenantId) throws Exception {\n\t\tString url;\n\t\t//应用id为空，说明没有配置lowAppId\n\t\tif(oConvertUtils.isEmpty(tenantId)){\n\t\t\treturn \"租户编码未配置\";\n\t\t}\n\t\tif (CommonConstant.WECHAT_ENTERPRISE.equalsIgnoreCase(source)) {\n\t\t\t//换成第三方app配置表\n\t\t\tSysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(Integer.valueOf(tenantId), MessageTypeEnum.QYWX.getType());\n\t\t\tif(null == config){\n\t\t\t\treturn \"还未配置企业微信应用，请配置企业微信应用\";\n\t\t\t}\n\t\t\tStringBuilder builder = new StringBuilder();\n\t\t\t// 构造企业微信OAuth2登录授权地址\n\t\t\tbuilder.append(\"https://open.weixin.qq.com/connect/oauth2/authorize\");\n\t\t\t// 企业的CorpID\n\t\t\tbuilder.append(\"?appid=\").append(config.getClientId());\n\t\t\t// 授权后重定向的回调链接地址，请使用urlencode对链接进行处理\n\t\t\tString redirectUri = CommonUtils.getBaseUrl(request)  + \"/sys/thirdLogin/oauth2/wechat_enterprise/callback?tenantId=\"+tenantId;;\n\t\t\tbuilder.append(\"&redirect_uri=\").append(URLEncoder.encode(redirectUri, \"UTF-8\"));\n\t\t\t// 返回类型，此时固定为：code\n\t\t\tbuilder.append(\"&response_type=code\");\n\t\t\t// 应用授权作用域。\n\t\t\t// snsapi_base：静默授权，可获取成员的的基础信息（UserId与DeviceId）；\n\t\t\tbuilder.append(\"&scope=snsapi_base\");\n\t\t\t// 重定向后会带上state参数，长度不可超过128个字节\n\t\t\tbuilder.append(\"&state=\").append(state);\n\t\t\t// 终端使用此参数判断是否需要带上身份信息\n\t\t\tbuilder.append(\"#wechat_redirect\");\n\t\t\turl = builder.toString();\n\t\t} else if (CommonConstant.DINGTALK.equalsIgnoreCase(source)) {\n\t\t\t//换成第三方app配置表\n\t\t\tSysThirdAppConfig appConfig = appConfigService.getThirdConfigByThirdType(Integer.valueOf(tenantId), MessageTypeEnum.DD.getType());\n\t\t\tif(null == appConfig){\n\t\t\t\treturn \"还未配置钉钉应用，请配置钉钉应用\";\n\t\t\t}\n\t\t\tStringBuilder builder = new StringBuilder();\n\t\t\t// 构造钉钉OAuth2登录授权地址\n\t\t\tbuilder.append(\"https://login.dingtalk.com/oauth2/auth\");\n\t\t\t// 授权通过/拒绝后回调地址。\n\t\t\t// 注意 需要与注册应用时登记的域名保持一致。\n\t\t\tString redirectUri = CommonUtils.getBaseUrl(request) + \"/sys/thirdLogin/oauth2/dingtalk/callback?tenantId=\"+tenantId;\n\t\t\tbuilder.append(\"?redirect_uri=\").append(URLEncoder.encode(redirectUri, \"UTF-8\"));\n\t\t\t// 固定值为code。\n\t\t\t// 授权通过后返回authCode。\n\t\t\tbuilder.append(\"&response_type=code\");\n\t\t\t// 步骤一中创建的应用详情中获取。\n\t\t\t// 企业内部应用：client_id为应用的AppKey。\n\t\t\tbuilder.append(\"&client_id=\").append(appConfig.getClientId());\n\t\t\t// 授权范围，授权页面显示的授权信息以应用注册时配置的为准。\n\t\t\t// openid：授权后可获得用户userid\n\t\t\tbuilder.append(\"&scope=openid\");\n\t\t\t// 跟随authCode原样返回。\n\t\t\tbuilder.append(\"&state=\").append(state);\n            // 代码逻辑说明: [issues/I5BOUF]oauth2 钉钉无法登录------------\n            builder.append(\"&prompt=\").append(\"consent\");\n            url = builder.toString();\n\t\t} else {\n\t\t\treturn \"不支持的source\";\n\t\t}\n\t\tlog.info(\"oauth2 login url:\" + url);\n\t\tresponse.sendRedirect(url);\n\t\treturn \"login…\";\n\t}\n\n    /**\n     * 企业微信/钉钉 OAuth2登录回调\n     *\n     * @param code\n     * @param state\n     * @param response\n     * @return\n     */\n\t@ResponseBody\n\t@GetMapping(\"/oauth2/{source}/callback\")\n\tpublic String oauth2LoginCallback(\n\t\t\t@PathVariable(\"source\") String source,\n\t\t\t// 企业微信返回的code\n\t\t\t@RequestParam(value = \"code\", required = false) String code,\n\t\t\t// 钉钉返回的code\n\t\t\t@RequestParam(value = \"authCode\", required = false) String authCode,\n\t\t\t@RequestParam(\"state\") String state,\n\t\t\t@RequestParam(name = \"tenantId\",defaultValue = \"0\") String tenantId,\n\t\t\tHttpServletResponse response) {\n        SysUser loginUser;\n        if (CommonConstant.WECHAT_ENTERPRISE.equalsIgnoreCase(source)) {\n            log.info(\"【企业微信】OAuth2登录进入callback：code=\" + code + \", state=\" + state);\n            loginUser = thirdAppWechatEnterpriseService.oauth2Login(code,Integer.valueOf(tenantId));\n            if (loginUser == null) {\n                return \"登录失败\";\n            }\n        } else if (CommonConstant.DINGTALK.equalsIgnoreCase(source)) {\n\t\t\tlog.info(\"【钉钉】OAuth2登录进入callback：authCode=\" + authCode + \", state=\" + state);\n\t\t\tloginUser = thirdAppDingtalkService.oauth2Login(authCode,Integer.valueOf(tenantId));\n\t\t\tif (loginUser == null) {\n\t\t\t\treturn \"登录失败\";\n\t\t\t}\n        } else {\n            return \"不支持的source\";\n        }\n        try {\n\t\t\t// 代码逻辑说明: 工作流发送消息 点击消息链接跳转办理页面\n\t\t\tString redirect = \"\";\n\t\t\tif (state.indexOf(\"?\") > 0) {\n\t\t\t\tString[] arr = state.split(\"\\\\?\");\n\t\t\t\tstate = arr[0];\n\t\t\t\tif(arr.length>1){\n\t\t\t\t\tredirect = arr[1];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tString token = saveToken(loginUser);\n\t\t\tstate += \"/oauth2-app/login?oauth2LoginToken=\" + URLEncoder.encode(token, \"UTF-8\") + \"&tenantId=\" + URLEncoder.encode(tenantId, \"UTF-8\");\n\t\t\t// 代码逻辑说明: [issues/I5BOUF]oauth2 钉钉无法登录------------\n\t\t\tstate += \"&thirdType=\" + source;\n\t\t\t//state += \"&thirdType=\" + \"wechat_enterprise\";\n\t\t\tif (redirect != null && redirect.length() > 0) {\n\t\t\t\tstate += \"&\" + redirect;\n\t\t\t}\n\n\t\t\tlog.info(\"OAuth2登录重定向地址: \" + state);\n            try {\n                response.sendRedirect(state);\n                return \"ok\";\n            } catch (IOException e) {\n                e.printStackTrace();\n                return \"重定向失败\";\n            }\n        } catch (UnsupportedEncodingException e) {\n            e.printStackTrace();\n            return \"解码失败\";\n        }\n    }\n\n\t/**\n\t * 注册账号并绑定第三方账号 【低代码应用专用接口】\n\t * @param jsonObject\n\t * @param user\n\t * @return\n\t */\n\t@ResponseBody\n\t@PutMapping(\"/registerBindThirdAccount\")\n\tpublic Result<String> registerBindThirdAccount(@RequestBody JSONObject jsonObject, SysUser user) {\n\t\t//手机号\n\t\tString phone = jsonObject.getString(\"phone\");\n\t\t//验证码\n\t\tString smscode = jsonObject.getString(\"smscode\");\n\t\tString redisKey = CommonConstant.PHONE_REDIS_KEY_PRE + phone;\n\t\tObject code = redisUtil.get(redisKey);\n\t\t//第三方uuid\n\t\tString thirdUserUuid = jsonObject.getString(\"thirdUserUuid\");\n\t\tString username = jsonObject.getString(\"username\");\n\t\t//未设置用户名，则用手机号作为用户名\n\t\tif (oConvertUtils.isEmpty(username)) {\n\t\t\tusername = phone;\n\t\t}\n\t\t//未设置密码，则随机生成一个密码\n\t\tString password = jsonObject.getString(\"password\");\n\t\tif (oConvertUtils.isEmpty(password)) {\n\t\t\tpassword = RandomUtil.randomString(8);\n\t\t}\n\t\tString email = jsonObject.getString(\"email\");\n\t\tSysUser sysUser1 = sysUserService.getUserByName(username);\n\t\tif (sysUser1 != null) {\n\t\t\treturn Result.error(\"用户名已注册\");\n\t\t}\n\t\tSysUser sysUser2 = sysUserService.getUserByPhone(phone);\n\t\tif (sysUser2 != null) {\n\t\t\treturn Result.error(\"该手机号已注册\");\n\t\t}\n\t\tif (oConvertUtils.isNotEmpty(email)) {\n\t\t\tSysUser sysUser3 = sysUserService.getUserByEmail(email);\n\t\t\tif (sysUser3 != null) {\n\t\t\t\treturn Result.error(\"邮箱已被注册\");\n\t\t\t}\n\t\t}\n\t\tif (null == code) {\n\t\t\treturn Result.error(\"手机验证码失效，请重新获取\");\n\t\t}\n\t\tif (!smscode.equals(code.toString())) {\n\t\t\treturn Result.error(\"手机验证码错误\");\n\t\t}\n\t\tString realname = jsonObject.getString(\"realname\");\n\t\tif (oConvertUtils.isEmpty(realname)) {\n\t\t\trealname = username;\n\t\t}\n\t\ttry {\n\t\t\t//保存用户表\n\t\t\tuser.setCreateTime(new Date());\n\t\t\tString salt = oConvertUtils.randomGen(8);\n\t\t\tString passwordEncode = PasswordUtil.encrypt(username, password, salt);\n\t\t\tuser.setSalt(salt);\n\t\t\tuser.setUsername(username);\n\t\t\tuser.setRealname(realname);\n\t\t\tuser.setPassword(passwordEncode);\n\t\t\tuser.setEmail(email);\n\t\t\tuser.setPhone(phone);\n\t\t\tuser.setStatus(CommonConstant.USER_UNFREEZE);\n\t\t\tuser.setDelFlag(CommonConstant.DEL_FLAG_0);\n\t\t\tuser.setActivitiSync(CommonConstant.ACT_SYNC_1);\n\t\t\tsysUserService.addUserWithRole(user, \"\");\n\t\t\t//保存第三方用户表\n\t\t\tsysThirdAccountService.updateThirdUserId(user, thirdUserUuid);\n\t\t\tString token = saveToken(user);\n\t\t\treturn Result.ok(token);\n\t\t} catch (Exception e) {\n\t\t\treturn Result.error(\"注册失败\");\n\t\t}\n\t}\n\n\t/**\n\t * 设置用户租户和部门信息\n\t *\n\t * @param sysUser\n\t * @param obj\n\t * @param result\n\t */\n\tprivate void setUserTenantAndDepart(SysUser sysUser, JSONObject obj, Result<JSONObject> result) {\n\t\t//1.设置登录租户\n\t\tsysUserService.setLoginTenant(sysUser, obj, sysUser.getUsername(), result);\n\t\t//2.设置登录部门\n\t\tString orgCode = sysUser.getOrgCode();\n\t\t//部门不为空还是用原来的部门code\n\t\tif(StringUtils.isEmpty(orgCode)){\n\t\t\tList<SysDepart> departs = sysDepartService.queryUserDeparts(sysUser.getId());\n\t\t\t//部门不为空取第一个作为当前登录部门\n\t\t\tif(CollectionUtil.isNotEmpty(departs)){\n\t\t\t\torgCode = departs.get(0).getOrgCode();\n\t\t\t\tsysUser.setOrgCode(orgCode);\n\t\t\t\tthis.sysUserService.updateUserDepart(sysUser.getUsername(), orgCode,null);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * 新版钉钉登录\n\t *\n\t * @param authCode\n\t * @param state\n\t * @param tenantId\n\t * @param response\n\t * @return\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/oauth2/dingding/login\")\n\tpublic String OauthDingDingLogin(@RequestParam(value = \"authCode\", required = false) String authCode,\n\t\t\t\t\t\t\t\t\t @RequestParam(\"state\") String state,\n\t\t\t\t\t\t\t\t\t @RequestParam(name = \"tenantId\",defaultValue = \"0\") String tenantId,\n\t\t\t\t\t\t\t\t\t HttpServletResponse response) {\n\t\tSysUser loginUser = thirdAppDingtalkService.oauthDingDingLogin(authCode,Integer.valueOf(tenantId));\n\t\ttry {\n\t\t\tString redirect = \"\";\n\t\t\tif (state.indexOf(\"?\") > 0) {\n\t\t\t\tString[] arr = state.split(\"\\\\?\");\n\t\t\t\tstate = arr[0];\n\t\t\t\tif(arr.length>1){\n\t\t\t\t\tredirect = arr[1];\n\t\t\t\t}\n\t\t\t}\n\t\t\tString token = saveToken(loginUser);\n\t\t\tstate += \"/oauth2-app/login?oauth2LoginToken=\" + URLEncoder.encode(token, \"UTF-8\") + \"&tenantId=\" + URLEncoder.encode(tenantId, \"UTF-8\");\n\t\t\tstate += \"&thirdType=DINGTALK\";\n\t\t\tif (redirect != null && redirect.length() > 0) {\n\t\t\t\tstate += \"&\" + redirect;\n\t\t\t}\n\t\t\tlog.info(\"OAuth2登录重定向地址: \" + state);\n\t\t\ttry {\n\t\t\t\tresponse.sendRedirect(state);\n\t\t\t\treturn \"ok\";\n\t\t\t} catch (IOException e) {\n\t\t\t\tlog.error(e.getMessage(),e);\n\t\t\t\treturn \"重定向失败\";\n\t\t\t}\n\t\t} catch (UnsupportedEncodingException e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t\treturn \"解码失败\";\n\t\t}\n\t}\n\n\t/**\n\t * 获取企业id和应用id\n\t * @param tenantId\n\t * @return\n\t */\n\t@ResponseBody\n\t@GetMapping(\"/get/corpId/clientId\")\n\tpublic Result<SysThirdAppConfig> getCorpIdClientId(@RequestParam(value = \"tenantId\", defaultValue = \"0\") String tenantId){\n\t\tResult<SysThirdAppConfig> result = new Result<>();\n\t\tSysThirdAppConfig sysThirdAppConfig = thirdAppDingtalkService.getCorpIdClientId(Integer.valueOf(tenantId));\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(sysThirdAppConfig);\n\t\treturn result;\n\t}\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/WechatVerifyController.java",
    "content": "package org.jeecg.modules.system.controller;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.jeecg.modules.system.util.XssUtils;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.PrintWriter;\n\n/**\n * @Description: 企业微信证书验证\n * @author: wangshuai\n * @date: 2023/12/6 10:42\n */\n@RestController\n@Slf4j\npublic class WechatVerifyController {\n\n    /**\n     * 企业微信验证\n     */\n    @RequestMapping(value = \"/WW_verify_{code}.txt\")\n    public void mpVerify(@PathVariable(\"code\") String code, HttpServletResponse response) {\n        if(StringUtils.isEmpty(code)){\n            log.error(\"企业微信证书验证失败！(code为空)\");\n            return;\n        }\n        try {\n            PrintWriter writer = response.getWriter();\n            code = XssUtils.scriptXss(code);\n            writer.write(code);\n            writer.close();\n        } catch (Exception e) {\n            log.error(\"企业微信证书验证失败！\");\n            log.error(e.getMessage(), e);\n            e.printStackTrace();\n        }\n    }\n}\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysAnnouncement.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Data;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\n\n/**\n * @Description: 系统通告表\n * @Author: jeecg-boot\n * @Date:  2019-01-02\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_announcement\")\npublic class SysAnnouncement implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * id\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    private java.lang.String id;\n    /**\n     * 标题\n     */\n    @Excel(name = \"标题\", width = 15)\n    private java.lang.String titile;\n    /**\n     * 内容\n     */\n    @Excel(name = \"内容\", width = 30)\n    private java.lang.String msgContent;\n    /**\n     * 开始时间\n     */\n    @Excel(name = \"开始时间\", width = 15, format = \"yyyy-MM-dd HH:mm:ss\")\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    private java.util.Date startTime;\n    /**\n     * 结束时间\n     */\n    @Excel(name = \"结束时间\", width = 15, format = \"yyyy-MM-dd HH:mm:ss\")\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    private java.util.Date endTime;\n    /**\n     * 发布人\n     */\n    @Excel(name = \"发布人\", width = 15)\n    @Dict(dictTable = \"sys_user\",dicCode = \"username\",dicText = \"realname\")\n    private java.lang.String sender;\n    /**\n     * 优先级（L低，M中，H高）\n     */\n    @Excel(name = \"优先级\", width = 15, dicCode = \"priority\")\n    @Dict(dicCode = \"priority\")\n    private java.lang.String priority;\n    \n    /**\n     * 消息类型1:通知公告2:系统消息\n     */\n    @Excel(name = \"消息类型\", width = 15, dicCode = \"msg_category\")\n    @Dict(dicCode = \"msg_category\")\n    private java.lang.String msgCategory;\n    /**\n     * 通告对象类型（USER:指定用户，ALL:全体用户）\n     */\n    @Excel(name = \"通告对象类型\", width = 15, dicCode = \"msg_type\")\n    @Dict(dicCode = \"msg_type\")\n    private java.lang.String msgType;\n    /**\n     * 发布状态（0未发布，1已发布，2已撤销）\n     */\n    @Excel(name = \"发布状态\", width = 15, dicCode = \"send_status\")\n    @Dict(dicCode = \"send_status\")\n    private java.lang.String sendStatus;\n    /**\n     * 发布时间\n     */\n    @Excel(name = \"发布时间\", width = 15, format = \"yyyy-MM-dd HH:mm:ss\")\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    private java.util.Date sendTime;\n    /**\n     * 撤销时间\n     */\n    @Excel(name = \"撤销时间\", width = 15, format = \"yyyy-MM-dd HH:mm:ss\")\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    private java.util.Date cancelTime;\n    /**\n     * 删除状态（0，正常，1已删除）\n     */\n    private java.lang.String delFlag;\n    /**\n     * 创建人\n     */\n    private java.lang.String createBy;\n    /**\n     * 创建时间\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    private java.util.Date createTime;\n    /**\n     * 更新人\n     */\n    private java.lang.String updateBy;\n    /**\n     * 更新时间\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    private java.util.Date updateTime;\n    /**\n     * 指定用户\n     **/\n    private java.lang.String userIds;\n    /**\n     * 业务类型(email:邮件 bpm:流程 tenant_invite:租户邀请)\n     */\n    private java.lang.String busType;\n    /**\n     * 业务id\n     */\n    private java.lang.String busId;\n    /**\n     * 打开方式 组件：component 路由：url\n     */\n    private java.lang.String openType;\n    /**\n     * 组件/路由 地址\n     */\n    private java.lang.String openPage;\n    /**\n     * 摘要/扩展业务参数\n     * \n     * 示例：\n     * 1 摘要值\n     *  放假安排\n     * 2 跳转流程的参数值\n     * {\"taskDetail\":true,\"procInsId\":\"1706547306004377602\",\"taskId\":\"task630958764530507776\"}\n     */\n    private java.lang.String msgAbstract;\n    /**\n     * 钉钉task_id，用于撤回消息\n     */\n    private String dtTaskId;\n\n    /**\n     * 阅读状态 1表示已经阅读\n     */\n    private transient String readFlag;\n\n    /**\n     * 标星状态 1表示标星\n     */\n    private transient String starFlag;\n\n    /**\n     * 发送记录ID\n     */\n    private transient String sendId;\n\n    /**租户ID*/\n    private java.lang.Integer tenantId;\n    \n    /** \n     * 枚举：org.jeecg.common.constant.enums.NoticeTypeEnum\n     * 通知类型(system:系统消息、file:知识库、flow:流程、plan:日程计划、meeting:会议)\n     */\n    private String noticeType;\n    /**附件字段*/\n    private java.lang.String files;\n    /**访问次数*/\n    private java.lang.Integer visitsNum;\n    /**是否置顶（0否 1是）*/\n    private java.lang.Integer izTop;\n    /**是否审批（0否 1是）*/\n    private java.lang.String izApproval;\n    /**流程状态*/\n    private java.lang.String bpmStatus;\n    /**消息归类*/\n    private java.lang.String msgClassify;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysAnnouncementSend.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\n\n/**\n * @Description: 用户通告阅读标记表\n * @Author: jeecg-boot\n * @Date:  2019-02-21\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_announcement_send\")\npublic class SysAnnouncementSend implements Serializable {\n    private static final long serialVersionUID = 1L;\n    \n\t/**id*/\n\t@TableId(type = IdType.ASSIGN_ID)\n\tprivate java.lang.String id;\n\t/**通告id*/\n\tprivate java.lang.String anntId;\n\t/**用户id*/\n\tprivate java.lang.String userId;\n\t/**阅读状态（0未读，1已读）*/\n\tprivate java.lang.Integer readFlag;\n\t/**阅读时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate java.util.Date readTime;\n\t/**创建人*/\n\tprivate java.lang.String createBy;\n\t/**创建时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate java.util.Date createTime;\n\t/**更新人*/\n\tprivate java.lang.String updateBy;\n\t/**更新时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate java.util.Date updateTime;\n\n\t/**\n\t * 是否标星 当值为1是标星消息\n\t */\n\tprivate String starFlag;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysAppVersion.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\n\n/**\n * @Description: app系统配置\n * @Author: jeecg-boot\n * @Date:   2021-07-07\n * @Version: V1.0\n * \n * e3e3NcxzbUiGa53YYVXxWc8ADo5ISgQGx/gaZwERF91oAryDlivjqBv3wqRArgChupi+Y/Gg/swwGEyL0PuVFg==\n */\n@Data\n@Accessors(chain = true)\n@EqualsAndHashCode(callSuper = false)\n@Schema(description=\"app系统配置\")\npublic class SysAppVersion implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n\t/**主键*/\n\t@TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"主键\")\n    private String id;\n\t/**创建人*/\n    @Schema(description = \"创建人\")\n    private String createBy;\n\t/**创建日期*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建日期\")\n    private java.util.Date createTime;\n\t/**更新人*/\n    @Schema(description = \"更新人\")\n    private String updateBy;\n\t/**更新日期*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"更新日期\")\n    private java.util.Date updateTime;\n\t/**所属部门*/\n    @Schema(description = \"所属部门\")\n    private String sysOrgCode;\n\t/**标题*/\n\t@Excel(name = \"标题\", width = 15)\n    @Schema(description = \"标题\")\n    private String appTitle;\n\t/**logo*/\n\t@Excel(name = \"logo\", width = 15)\n    @Schema(description = \"logo\")\n    private String appLogo;\n\t/**首页轮播图*/\n\t@Excel(name = \"首页轮播图\", width = 15)\n    @Schema(description = \"首页轮播图\")\n    private String carouselImgJson;\n\t/**首页菜单图*/\n\t@Excel(name = \"首页菜单图\", width = 15)\n    @Schema(description = \"首页菜单图\")\n    private String routeImgJson;\n    /**app版本*/\n    @Schema(description = \"版本\")\n    private String appVersion;\n    /**版本编码*/\n    @Schema(description = \"版本编码\")\n    private Integer versionNum;\n    /**app下载路径*/\n    @Schema(description = \"app下载路径\")\n    private String downloadUrl;\n    /**热更新路径*/\n    @Schema(description = \"热更新路径\")\n    private String wgtUrl;\n    /**热更新路径*/\n    @Schema(description = \"桌面端下载路径\")\n    private String webDownloadUrl;\n    /**更新内容*/\n    @Schema(description = \"更新内容\")\n    private String updateNote;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysCategory.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Data;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\n\n/**\n * @Description: 分类字典\n * @Author: jeecg-boot\n * @Date:   2019-05-29\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_category\")\npublic class SysCategory implements Serializable,Comparable<SysCategory>{\n    private static final long serialVersionUID = 1L;\n    \n\t/**主键*/\n\t@TableId(type = IdType.ASSIGN_ID)\n\tprivate java.lang.String id;\n\t/**父级节点*/\n\tprivate java.lang.String pid;\n\t/**类型名称*/\n\t@Excel(name = \"类型名称\", width = 15)\n\tprivate java.lang.String name;\n\t/**类型编码*/\n\t@Excel(name = \"类型编码\", width = 15)\n\tprivate java.lang.String code;\n\t/**创建人*/\n\tprivate java.lang.String createBy;\n\t/**创建日期*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate java.util.Date createTime;\n\t/**更新人*/\n\tprivate java.lang.String updateBy;\n\t/**更新日期*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate java.util.Date updateTime;\n\t/**所属部门*/\n\tprivate java.lang.String sysOrgCode;\n\t/**是否有子节点*/\n\t@Excel(name = \"是否有子节点(1:有)\", width = 15)\n\tprivate java.lang.String hasChild;\n\n\t/**租户ID*/\n\tprivate java.lang.Integer tenantId;\n\n\t@Override\n\tpublic int compareTo(SysCategory o) {\n\t\t//比较条件我们定的是按照code的长度升序\n\t\t// <0：当前对象比传入对象小。\n\t\t// =0：当前对象等于传入对象。\n\t\t// >0：当前对象比传入对象大。\n\t\tint\t s = this.code.length() - o.code.length();\n\t\treturn s;\n\t}\n\t@Override\n\tpublic String toString() {\n\t\treturn \"SysCategory [code=\" + code + \", name=\" + name + \"]\";\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysCheckRule.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.util.Date;\n\n/**\n * @Description: 编码校验规则\n * @Author: jeecg-boot\n * @Date: 2020-02-04\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_check_rule\")\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@Schema(description=\"编码校验规则\")\npublic class SysCheckRule {\n\n    /**\n     * 主键id\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"主键id\")\n    private String id;\n    /**\n     * 规则名称\n     */\n    @Excel(name = \"规则名称\", width = 15)\n    @Schema(description = \"规则名称\")\n    private String ruleName;\n    /**\n     * 规则Code\n     */\n    @Excel(name = \"规则Code\", width = 15)\n    @Schema(description = \"规则Code\")\n    private String ruleCode;\n    /**\n     * 规则JSON\n     */\n    @Excel(name = \"规则JSON\", width = 15)\n    @Schema(description = \"规则JSON\")\n    private String ruleJson;\n    /**\n     * 规则描述\n     */\n    @Excel(name = \"规则描述\", width = 15)\n    @Schema(description = \"规则描述\")\n    private String ruleDescription;\n    /**\n     * 更新人\n     */\n    @Excel(name = \"更新人\", width = 15)\n    @Schema(description = \"更新人\")\n    private String updateBy;\n    /**\n     * 更新时间\n     */\n    @Excel(name = \"更新时间\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"更新时间\")\n    private Date updateTime;\n    /**\n     * 创建人\n     */\n    @Excel(name = \"创建人\", width = 15)\n    @Schema(description = \"创建人\")\n    private String createBy;\n    /**\n     * 创建时间\n     */\n    @Excel(name = \"创建时间\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建时间\")\n    private Date createTime;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysComment.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @Description: 系统评论回复表\n * @Author: jeecg-boot\n * @Date:   2022-07-19\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_comment\")\n@Accessors(chain = true)\n@EqualsAndHashCode(callSuper = false)\n@Schema(description=\"系统评论回复表\")\npublic class SysComment implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n\t/**id*/\n\t@TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"id\")\n    private String id;\n\t/**表名*/\n\t@Excel(name = \"表名\", width = 15)\n    @Schema(description = \"表名\")\n    private String tableName;\n\t/**数据id*/\n\t@Excel(name = \"数据id\", width = 15)\n    @Schema(description = \"数据id\")\n    private String tableDataId;\n\t/**来源用户id*/\n\t@Excel(name = \"来源用户id\", width = 15)\n    @Schema(description = \"来源用户id\")\n    @Dict(dictTable = \"sys_user\", dicCode = \"id\", dicText = \"realname\")\n    private String fromUserId;\n\t/**发送给用户id(允许为空)*/\n\t@Excel(name = \"发送给用户id(允许为空)\", width = 15)\n    @Schema(description = \"发送给用户id(允许为空)\")\n    @Dict(dictTable = \"sys_user\", dicCode = \"id\", dicText = \"realname\")\n    private String toUserId;\n\t/**评论id(允许为空，不为空时，则为回复)*/\n\t@Excel(name = \"评论id(允许为空，不为空时，则为回复)\", width = 15)\n    @Schema(description = \"评论id(允许为空，不为空时，则为回复)\")\n    @Dict(dictTable = \"sys_comment\", dicCode = \"id\", dicText = \"comment_content\")\n    private String commentId;\n\t/**回复内容*/\n\t@Excel(name = \"回复内容\", width = 15)\n    @Schema(description = \"回复内容\")\n    private String commentContent;\n\t/**创建人*/\n    @Schema(description = \"创建人\")\n    private String createBy;\n\t/**创建日期*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建日期\")\n    private Date createTime;\n\t/**更新人*/\n    @Schema(description = \"更新人\")\n    private String updateBy;\n\t/**更新日期*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"更新日期\")\n    private Date updateTime;\n\n    /**\n     * 不是数据库字段，用于评论跳转\n     */\n    @TableField(exist = false)\n    private String tableId;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDataLog.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.config.mqtoken.UserTokenContext;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.springframework.util.StringUtils;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @Description: 系统数据日志\n * @author: jeecg-boot\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@Slf4j\npublic class SysDataLog implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\t\n\t@TableId(type = IdType.ASSIGN_ID)\n    /**\n     * id\n     */\n\tprivate String id;\n\n    /**\n     * 创建人登录名称\n     */\n\tprivate String createBy;\n\n    /**\n     * 创建人真实名称\n     */\n\tprivate String createName;\n\n    /**\n     * 创建日期\n     */\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate Date createTime;\n\n    /**\n     * 更新人登录名称\n     */\n\tprivate String updateBy;\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\n    /**\n     * 更新日期\n     */\n    private Date updateTime;\n\n    /**\n     * 表名\n     */\n    private String dataTable;\n\n    /**\n     * 数据ID\n     */\n    private String dataId;\n\n    /**\n     * 数据内容\n     */\n    private String dataContent;\n\n    /**\n     * 版本号\n     */\n    private String dataVersion;\n\n\n    /**\n     * 类型，用于表单评论记录日志 区分数据\n     */\n    private String type;\n\n    /**\n     * 通过 loginUser 设置 createName\n     */\n    public void autoSetCreateName() {\n        try {\n            LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n            this.setCreateName(sysUser.getRealname());\n        } catch (Exception e) {\n            // QQYUN-13669 进一步优化：解决某些异步场景下获取用户信息为空的问题\n            String token = UserTokenContext.getToken();\n            if (StringUtils.hasText(token)) {\n                this.setCreateName(JwtUtil.getUsername(token));\n            } else {\n                log.warn(\"SecurityUtils.getSubject() 获取用户信息异常：\" + e.getMessage());\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDataSource.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\n/**\n * @Description: 多数据源管理\n * @Author: jeecg-boot\n * @Date: 2019-12-25\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_data_source\")\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@Schema(description=\"多数据源管理\")\npublic class SysDataSource {\n\n    /**\n     * id\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"id\")\n    private java.lang.String id;\n    /**\n     * 数据源编码\n     */\n    @Excel(name = \"数据源编码\", width = 15)\n    @Schema(description = \"数据源编码\")\n    private java.lang.String code;\n    /**\n     * 数据源名称\n     */\n    @Excel(name = \"数据源名称\", width = 15)\n    @Schema(description = \"数据源名称\")\n    private java.lang.String name;\n    /**\n     * 描述\n     */\n    @Excel(name = \"备注\", width = 15)\n    @Schema(description = \"备注\")\n    private java.lang.String remark;\n    /**\n     * 数据库类型\n     */\n    @Dict(dicCode = \"database_type\")\n    @Excel(name = \"数据库类型\", width = 15, dicCode = \"database_type\")\n    @Schema(description = \"数据库类型\")\n    private java.lang.String dbType;\n    /**\n     * 驱动类\n     */\n    @Excel(name = \"驱动类\", width = 15)\n    @Schema(description = \"驱动类\")\n    private java.lang.String dbDriver;\n    /**\n     * 数据源地址\n     */\n    @Excel(name = \"数据源地址\", width = 15)\n    @Schema(description = \"数据源地址\")\n    private java.lang.String dbUrl;\n    /**\n     * 数据库名称\n     */\n    @Excel(name = \"数据库名称\", width = 15)\n    @Schema(description = \"数据库名称\")\n    private java.lang.String dbName;\n    /**\n     * 用户名\n     */\n    @Excel(name = \"用户名\", width = 15)\n    @Schema(description = \"用户名\")\n    private java.lang.String dbUsername;\n    /**\n     * 密码\n     */\n    @Excel(name = \"密码\", width = 15)\n    @Schema(description = \"密码\")\n    private java.lang.String dbPassword;\n    /**\n     * 创建人\n     */\n    @Schema(description = \"创建人\")\n    private java.lang.String createBy;\n    /**\n     * 创建日期\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建日期\")\n    private java.util.Date createTime;\n    /**\n     * 更新人\n     */\n    @Schema(description = \"更新人\")\n    private java.lang.String updateBy;\n    /**\n     * 更新日期\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"更新日期\")\n    private java.util.Date updateTime;\n    /**\n     * 所属部门\n     */\n    @Excel(name = \"所属部门\", width = 15)\n    @Schema(description = \"所属部门\")\n    private java.lang.String sysOrgCode;\n\n    /**租户ID*/\n    @Schema(description = \"租户ID\")\n    private java.lang.Integer tenantId;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDepart.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Data;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport java.util.Objects;\n\n/**\n * <p>\n * 部门表\n * <p>\n * \n * @Author Steve\n * @Since  2019-01-22\n */\n@Data\n@TableName(\"sys_depart\")\npublic class SysDepart implements Serializable {\n    private static final long serialVersionUID = 1L;\n    \n\t/**ID*/\n\t@TableId(type = IdType.ASSIGN_ID)\n\tprivate String id;\n\t/**父机构ID*/\n\tprivate String parentId;\n\t/**机构/部门名称*/\n\t@Excel(name=\"机构/部门名称\",width=15)\n\tprivate String departName;\n\t/**机构/部门路径名称（非持久化字段）*/\n\t@TableField(exist = false)\n\tprivate String departPathName;\n\t/**英文名*/\n\t@Excel(name=\"英文名\",width=15)\n\tprivate String departNameEn;\n\t/**缩写*/\n\tprivate String departNameAbbr;\n\t/**排序*/\n\t@Excel(name=\"排序\",width=15)\n\tprivate Integer departOrder;\n\t/**描述*/\n\t@Excel(name=\"描述\",width=15)\n\tprivate String description;\n\t/**机构类别 1=公司，2=组织机构，3=岗位 4=子公司*/\n\t@Excel(name=\"机构类别\",width=15,dicCode=\"org_category\")\n\tprivate String orgCategory;\n\t/**机构类型*/\n\tprivate String orgType;\n\t/**机构编码*/\n\t@Excel(name=\"机构编码\",width=15)\n\tprivate String orgCode;\n\t/**手机号*/\n\t@Excel(name=\"手机号\",width=15)\n\tprivate String mobile;\n\t/**传真*/\n\t@Excel(name=\"传真\",width=15)\n\tprivate String fax;\n\t/**地址*/\n\t@Excel(name=\"地址\",width=15)\n\tprivate String address;\n\t/**备注*/\n\t@Excel(name=\"备注\",width=15)\n\tprivate String memo;\n\t/**状态（1启用，0不启用）*/\n\t@Dict(dicCode = \"depart_status\")\n\tprivate String status;\n\t/**删除状态（0，正常，1已删除）*/\n\t@Dict(dicCode = \"del_flag\")\n\tprivate String delFlag;\n\t/**对接企业微信的ID*/\n\tprivate String qywxIdentifier;\n\t/**对接钉钉的部门ID*/\n\tprivate String dingIdentifier;\n\t/**创建人*/\n\tprivate String createBy;\n\t/**创建日期*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate Date createTime;\n\t/**更新人*/\n\tprivate String updateBy;\n\t/**更新日期*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate Date updateTime;\n\t/**租户ID*/\n\tprivate java.lang.Integer tenantId;\n\n\t/**是否有叶子节点: 1是0否*/\n\tprivate Integer izLeaf;\n\n    //update-begin---author:wangshuai ---date:20200308  for：[JTC-119]在部门管理菜单下设置部门负责人，新增字段负责人ids和旧的负责人ids\n    /**部门负责人的ids*/\n\t@TableField(exist = false)\n\tprivate String directorUserIds;\n    /**旧的部门负责人的ids(用于比较删除和新增)*/\n\t@TableField(exist = false)\n    private String oldDirectorUserIds;\n    //update-end---author:wangshuai ---date:20200308  for：[JTC-119]新增字段负责人ids和旧的负责人ids\n\n    /**\n     * 职级id\n     */\n    @Excel(name=\"职级\",width=15,dictTable = \"sys_position\", dicCode = \"id\", dicText = \"name\")\n    @Dict(dictTable = \"sys_position\", dicCode = \"id\", dicText = \"name\")\n    private String positionId;\n\n    /**\n     * 部门岗位id\n     */\n    @Excel(name=\"上级岗位\",width=15,dictTable = \"sys_depart\", dicCode = \"id\", dicText = \"depart_name\")\n    @Dict(dictTable = \"sys_depart\", dicCode = \"id\", dicText = \"depart_name\")\n    private String depPostParentId;\n    \n\t/**\n\t * 重写equals方法\n\t */\n    @Override\n    public boolean equals(Object o) {\n        if (this == o) {\n\t\t\treturn true;\n\t\t}\n        if (o == null || getClass() != o.getClass()) {\n\t\t\treturn false;\n\t\t}\n        if (!super.equals(o)) {\n\t\t\treturn false;\n\t\t}\n        SysDepart depart = (SysDepart) o;\n        return Objects.equals(id, depart.id) &&\n                Objects.equals(parentId, depart.parentId) &&\n                Objects.equals(departName, depart.departName) &&\n                Objects.equals(departNameEn, depart.departNameEn) &&\n                Objects.equals(departNameAbbr, depart.departNameAbbr) &&\n                Objects.equals(departOrder, depart.departOrder) &&\n                Objects.equals(description, depart.description) &&\n                Objects.equals(orgCategory, depart.orgCategory) &&\n                Objects.equals(orgType, depart.orgType) &&\n                Objects.equals(orgCode, depart.orgCode) &&\n                Objects.equals(mobile, depart.mobile) &&\n                Objects.equals(fax, depart.fax) &&\n                Objects.equals(address, depart.address) &&\n                Objects.equals(memo, depart.memo) &&\n                Objects.equals(status, depart.status) &&\n                Objects.equals(delFlag, depart.delFlag) &&\n                Objects.equals(createBy, depart.createBy) &&\n                Objects.equals(createTime, depart.createTime) &&\n                Objects.equals(updateBy, depart.updateBy) &&\n                Objects.equals(tenantId, depart.tenantId) &&\n                Objects.equals(updateTime, depart.updateTime);\n    }\n\n    /**\n     * 重写hashCode方法\n     */\n    @Override\n    public int hashCode() {\n        return Objects.hash(super.hashCode(), id, parentId, departName, \n        \t\tdepartNameEn, departNameAbbr, departOrder, description,orgCategory, \n        \t\torgType, orgCode, mobile, fax, address, memo, status, \n        \t\tdelFlag, createBy, createTime, updateBy, updateTime, tenantId);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDepartPermission.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableField;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\n\n/**\n * @Description: 部门权限表\n * @Author: jeecg-boot\n * @Date:   2020-02-11\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_depart_permission\")\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@Schema(description=\"部门权限表\")\npublic class SysDepartPermission {\n    \n\t/**id*/\n\t@TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"id\")\n\tprivate java.lang.String id;\n\t/**部门id*/\n\t@Excel(name = \"部门id\", width = 15)\n    @Schema(description = \"部门id\")\n\tprivate java.lang.String departId;\n\t/**权限id*/\n\t@Excel(name = \"权限id\", width = 15)\n    @Schema(description = \"权限id\")\n\tprivate java.lang.String permissionId;\n\t/**数据规则id*/\n\t@Schema(description = \"数据规则id\")\n\tprivate java.lang.String dataRuleIds;\n\n\tpublic SysDepartPermission() {\n\n\t}\n\n\tpublic SysDepartPermission(String departId, String permissionId) {\n\t\tthis.departId = departId;\n\t\tthis.permissionId = permissionId;\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDepartRole.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableField;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\n\n/**\n * @Description: 部门角色\n * @Author: jeecg-boot\n * @Date:   2020-02-12\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_depart_role\")\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@Schema(description=\"部门角色\")\npublic class SysDepartRole {\n    \n\t/**id*/\n\t@TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"id\")\n\tprivate java.lang.String id;\n\t/**部门id*/\n\t@Excel(name = \"部门id\", width = 15)\n\t@Schema(description = \"部门id\")\n\t@Dict(dictTable =\"sys_depart\",dicText = \"depart_name\",dicCode = \"id\")\n\tprivate java.lang.String departId;\n\t/**部门角色名称*/\n\t@Excel(name = \"部门角色名称\", width = 15)\n    @Schema(description = \"部门角色名称\")\n\tprivate java.lang.String roleName;\n\t/**部门角色编码*/\n\t@Excel(name = \"部门角色编码\", width = 15)\n    @Schema(description = \"部门角色编码\")\n\tprivate java.lang.String roleCode;\n\t/**描述*/\n\t@Excel(name = \"描述\", width = 15)\n    @Schema(description = \"描述\")\n\tprivate java.lang.String description;\n\t/**创建人*/\n\t@Excel(name = \"创建人\", width = 15)\n    @Schema(description = \"创建人\")\n\tprivate java.lang.String createBy;\n\t/**创建时间*/\n\t@Excel(name = \"创建时间\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建时间\")\n\tprivate java.util.Date createTime;\n\t/**更新人*/\n\t@Excel(name = \"更新人\", width = 15)\n    @Schema(description = \"更新人\")\n\tprivate java.lang.String updateBy;\n\t/**更新时间*/\n\t@Excel(name = \"更新时间\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"更新时间\")\n\tprivate java.util.Date updateTime;\n\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDepartRolePermission.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableField;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\n\n/**\n * @Description: 部门角色权限\n * @Author: jeecg-boot\n * @Date:   2020-02-12\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_depart_role_permission\")\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@Schema(description=\"部门角色权限\")\npublic class SysDepartRolePermission {\n    \n\t/**id*/\n\t@TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"id\")\n\tprivate java.lang.String id;\n\t/**部门id*/\n\t@Excel(name = \"部门id\", width = 15)\n    @Schema(description = \"部门id\")\n\tprivate java.lang.String departId;\n\t/**角色id*/\n\t@Excel(name = \"角色id\", width = 15)\n    @Schema(description = \"角色id\")\n\tprivate java.lang.String roleId;\n\t/**权限id*/\n\t@Excel(name = \"权限id\", width = 15)\n    @Schema(description = \"权限id\")\n\tprivate java.lang.String permissionId;\n\t/**dataRuleIds*/\n\t@Excel(name = \"dataRuleIds\", width = 15)\n    @Schema(description = \"dataRuleIds\")\n\tprivate java.lang.String dataRuleIds;\n\t/** 操作时间 */\n\t@Excel(name = \"操作时间\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t@Schema(description = \"操作时间\")\n\tprivate java.util.Date operateDate;\n\t/** 操作ip */\n\tprivate java.lang.String operateIp;\n\n\tpublic SysDepartRolePermission() {\n\t}\n\n\tpublic SysDepartRolePermission(String roleId, String permissionId) {\n\t\tthis.roleId = roleId;\n\t\tthis.permissionId = permissionId;\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDepartRoleUser.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableField;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\n\n/**\n * @Description: 部门角色人员信息\n * @Author: jeecg-boot\n * @Date:   2020-02-13\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_depart_role_user\")\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@Schema(description=\"部门角色人员信息\")\npublic class SysDepartRoleUser {\n    \n\t/**主键id*/\n\t@TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"主键id\")\n\tprivate java.lang.String id;\n\t/**用户id*/\n\t@Excel(name = \"用户id\", width = 15)\n    @Schema(description = \"用户id\")\n\tprivate java.lang.String userId;\n\t/**角色id*/\n\t@Excel(name = \"角色id\", width = 15)\n    @Schema(description = \"角色id\")\n\tprivate java.lang.String droleId;\n\n\tpublic SysDepartRoleUser() {\n\n\t}\n\n\tpublic SysDepartRoleUser(String userId, String droleId) {\n\t\tthis.userId = userId;\n\t\tthis.droleId = droleId;\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDict.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\n\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\n/**\n * <p>\n * 字典表\n * </p>\n *\n * @Author zhangweijian\n * @since 2018-12-28\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class SysDict implements Serializable {\n\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * id\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    private String id;\n    \n    /**\n     * [预留字段，暂时无用]\n     * 字典类型,0 string,1 number类型,2 boolean\n     * 前端js对stirng类型和number类型 boolean 类型敏感，需要区分。在select 标签匹配的时候会用到\n     * 默认为string类型\n     */\n    private Integer type;\n    \n    /**\n     * 字典名称\n     */\n    private String dictName;\n\n    /**\n     * 字典编码\n     */\n    private String dictCode;\n\n    /**\n     * 描述\n     */\n    private String description;\n\n    /**\n     * 删除状态\n     */\n    @TableLogic\n    private Integer delFlag;\n\n    /**\n     * 创建人\n     */\n    private String createBy;\n\n    /**\n     * 创建时间\n     */\n    private Date createTime;\n\n    /**\n     * 更新人\n     */\n    private String updateBy;\n\n    /**\n     * 更新时间\n     */\n    private Date updateTime;\n\n    /**租户ID*/\n    private java.lang.Integer tenantId;\n    \n    /** 关联的低代码应用ID */\n    private java.lang.String lowAppId;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDictItem.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.io.Serializable;\nimport java.math.BigDecimal;\nimport java.util.Date;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\n\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecgframework.poi.excel.annotation.Excel;\n\n/**\n * <p>\n *\n * </p>\n *\n * @Author zhangweijian\n * @since 2018-12-28\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class SysDictItem implements Serializable {\n\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * id\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    private String id;\n\n    /**\n     * 字典id\n     */\n    private String dictId;\n\n    /**\n     * 字典项文本\n     */\n    @Excel(name = \"字典项文本\", width = 20)\n    private String itemText;\n\n    /**\n     * 字典项值\n     */\n    @Excel(name = \"字典项值\", width = 30)\n    private String itemValue;\n\n    /**\n     * 描述\n     */\n    @Excel(name = \"描述\", width = 40)\n    private String description;\n\n    /**\n     * 排序\n     */\n    @Excel(name = \"排序\", width = 15,type=4)\n    private Integer sortOrder;\n\n\n    /**\n     * 状态（1启用 0不启用）\n     */\n    @Dict(dicCode = \"dict_item_status\")\n    private Integer status;\n\n    private String createBy;\n\n    private Date createTime;\n\n    private String updateBy;\n\n    private Date updateTime;\n\n    /**\n     * 字典项颜色 \n     */\n    private String itemColor;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysFillRule.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\n/**\n * @Description: 填值规则\n * @Author: jeecg-boot\n * @Date: 2019-11-07\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_fill_rule\")\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@Schema(description=\"填值规则\")\npublic class SysFillRule {\n\n    /**\n     * 主键ID\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"主键ID\")\n    private java.lang.String id;\n    /**\n     * 规则名称\n     */\n    @Excel(name = \"规则名称\", width = 15)\n    @Schema(description = \"规则名称\")\n    private java.lang.String ruleName;\n    /**\n     * 规则Code\n     */\n    @Excel(name = \"规则Code\", width = 15)\n    @Schema(description = \"规则Code\")\n    private java.lang.String ruleCode;\n    /**\n     * 规则实现类\n     */\n    @Excel(name = \"规则实现类\", width = 15)\n    @Schema(description = \"规则实现类\")\n    private java.lang.String ruleClass;\n    /**\n     * 规则参数\n     */\n    @Excel(name = \"规则参数\", width = 15)\n    @Schema(description = \"规则参数\")\n    private java.lang.String ruleParams;\n    /**\n     * 修改人\n     */\n    @Excel(name = \"修改人\", width = 15)\n    @Schema(description = \"修改人\")\n    private java.lang.String updateBy;\n    /**\n     * 修改时间\n     */\n    @Excel(name = \"修改时间\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"修改时间\")\n    private java.util.Date updateTime;\n    /**\n     * 创建人\n     */\n    @Excel(name = \"创建人\", width = 15)\n    @Schema(description = \"创建人\")\n    private java.lang.String createBy;\n    /**\n     * 创建时间\n     */\n    @Excel(name = \"创建时间\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建时间\")\n    private java.util.Date createTime;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysFormFile.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport java.util.Date;\n\n/**\n * @Description: 表单评论文件\n * @Author: jeecg-boot\n * @Date:   2022-07-21\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_form_file\")\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@Schema(description=\"表单评论文件\")\npublic class SysFormFile {\n    \n\t/**id*/\n\t@TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"id\")\n\tprivate String id;\n\t/**表名*/\n\t@Excel(name = \"表名\", width = 15)\n    @Schema(description = \"表名\")\n\tprivate String tableName;\n\t/**数据id*/\n\t@Excel(name = \"数据id\", width = 15)\n    @Schema(description = \"数据id\")\n\tprivate String tableDataId;\n\t/**关联文件id*/\n\t@Excel(name = \"关联文件id\", width = 15)\n    @Schema(description = \"关联文件id\")\n\tprivate String fileId;\n\t/**文档类型（folder:文件夹 excel:excel doc:word pp:ppt image:图片  archive:其他文档 video:视频）*/\n\t@Excel(name = \"文档类型（folder:文件夹 excel:excel doc:word pp:ppt image:图片  archive:其他文档 video:视频）\", width = 15)\n\t@Schema(description = \"文档类型（folder:文件夹 excel:excel doc:word pp:ppt image:图片  archive:其他文档 video:视频）\")\n\tprivate String fileType;\n\t/**创建人登录名称*/\n\t@Excel(name = \"创建人登录名称\", width = 15)\n    @Schema(description = \"创建人登录名称\")\n\tprivate String createBy;\n\t/**创建日期*/\n\t@Excel(name = \"创建日期\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建日期\")\n\tprivate Date createTime;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysGatewayRoute.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @Description: gateway路由管理\n * @Author: jeecg-boot\n * @Date:   2020-05-26\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_gateway_route\")\n@Accessors(chain = true)\n@EqualsAndHashCode(callSuper = false)\n@Schema(description=\"gateway路由管理\")\npublic class SysGatewayRoute implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    /**主键*/\n    @TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"主键\")\n    private String id;\n\n    /**routerKEy*/\n    @Schema(description = \"路由ID\")\n    private String routerId;\n\n    /**服务名*/\n    @Excel(name = \"服务名\", width = 15)\n    @Schema(description = \"服务名\")\n    private String name;\n\n    /**服务地址*/\n    @Excel(name = \"服务地址\", width = 15)\n    @Schema(description = \"服务地址\")\n    private String uri;\n\n    /**\n     * 断言配置\n     */\n    private String predicates;\n\n    /**\n     * 过滤配置\n     */\n    private String filters;\n\n    /**是否忽略前缀0-否 1-是*/\n    @Excel(name = \"忽略前缀\", width = 15)\n    @Schema(description = \"忽略前缀\")\n    @Dict(dicCode = \"yn\")\n    private Integer stripPrefix;\n\n    /**是否重试0-否 1-是*/\n    @Excel(name = \"是否重试\", width = 15)\n    @Schema(description = \"是否重试\")\n    @Dict(dicCode = \"yn\")\n    private Integer retryable;\n\n    /**是否为保留数据:0-否 1-是*/\n    @Excel(name = \"保留数据\", width = 15)\n    @Schema(description = \"保留数据\")\n    @Dict(dicCode = \"yn\")\n    private Integer persistable;\n\n    /**是否在接口文档中展示:0-否 1-是*/\n    @Excel(name = \"在接口文档中展示\", width = 15)\n    @Schema(description = \"在接口文档中展示\")\n    @Dict(dicCode = \"yn\")\n    private Integer showApi;\n\n    /**状态 1有效 0无效*/\n    @Excel(name = \"状态\", width = 15)\n    @Schema(description = \"状态\")\n    @Dict(dicCode = \"yn\")\n    private Integer status;\n\n    /**创建人*/\n    @Schema(description = \"创建人\")\n    private String createBy;\n    /**创建日期*/\n    @JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建日期\")\n    private Date createTime;\n\n    /**\n     * 删除状态（0未删除，1已删除）\n     */\n    @TableLogic\n    private Integer delFlag;\n    /*    *//**更新人*//*\n    @Schema(description = \"更新人\")\n    private String updateBy;\n    *//**更新日期*//*\n    @JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"更新日期\")\n    private Date updateTime;\n    *//**所属部门*//*\n    @Schema(description = \"所属部门\")\n    private String sysOrgCode;*/\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysLog.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.util.Date;\n\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport java.io.Serializable;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\n/**\n * <p>\n * 系统日志表\n * </p>\n *\n * @Author zhangweijian\n * @since 2018-12-26\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class SysLog implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\n\t/**\n\t * id\n\t */\n\t@TableId(type = IdType.ASSIGN_ID)\n\tprivate String id;\n\n\t/**\n\t * 创建人\n\t */\n\tprivate String createBy;\n\n\t/**\n\t * 创建时间\n\t */\n\t@Excel(name = \"创建时间\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n\t@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n\tprivate Date createTime;\n\n\t/**\n\t * 更新人\n\t */\n\tprivate String updateBy;\n\n\t/**\n\t * 更新时间\n\t */\n\tprivate Date updateTime;\n\n\t/**\n\t * 耗时\n\t */\n\t@Excel(name = \"耗时（毫秒）\", width = 15)\n\tprivate Long costTime;\n\n\t/**\n\t * IP\n\t */\n\t@Excel(name = \"IP\", width = 15)\n\tprivate String ip;\n\n\t/**\n\t * 请求参数\n\t */\n\tprivate String requestParam;\n\n\t/**\n\t * 请求类型\n\t */\n\tprivate String requestType;\n\n\t/**\n\t * 请求路径\n\t */\n\tprivate String requestUrl;\n\t/**\n\t * 请求方法\n\t */\n\tprivate String method;\n\n\t/**\n\t * 操作人用户名称\n\t */\n\tprivate String username;\n\t/**\n\t * 操作人用户账户\n\t */\n\t@Excel(name = \"操作人\", width = 15)\n\tprivate String userid;\n\t/**\n\t * 操作详细日志\n\t */\n\t@Excel(name = \"日志内容\", width = 50)\n\tprivate String logContent;\n\n\t/**\n\t * 日志类型（1登录日志，2操作日志）\n\t */\n\t@Dict(dicCode = \"log_type\")\n\tprivate Integer logType;\n\n\t/**\n\t * 操作类型（1查询，2添加，3修改，4删除,5导入，6导出）\n\t */\n\t@Dict(dicCode = \"operate_type\")\n\tprivate Integer operateType;\n\t\n\t/**\n\t * 客户终端类型 pc:电脑端 app:手机端 h5:移动网页端\n\t */\n\t@Excel(name = \"客户端类型\", width = 15, dicCode = \"client_type\")\n\t@Dict(dicCode = \"client_type\")\n\tprivate String clientType;\n\n\t/**\n\t * 租户ID\n\t */\n\tprivate Integer tenantId;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysPackPermission.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\n/**\n * @Description: 产品包菜单关系表\n * @Author: jeecg-boot\n * @Date:   2022-12-31\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_tenant_pack_perms\")\n@Accessors(chain = true)\n@EqualsAndHashCode(callSuper = false)\n@Schema(description=\"产品包菜单关系表\")\npublic class SysPackPermission implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n\t/**主键编号*/\n\t@TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"主键编号\")\n    private String id;\n\t/**租户产品包名称*/\n\t@Excel(name = \"租户产品包名称\", width = 15)\n    @Schema(description = \"租户产品包名称\")\n    private String packId;\n\t/**菜单id*/\n\t@Excel(name = \"菜单id\", width = 15)\n    @Schema(description = \"菜单id\")\n    private String permissionId;\n\t/**创建人*/\n    @Schema(description = \"创建人\")\n    private String createBy;\n\t/**创建时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n    @Schema(description = \"创建时间\")\n    private Date createTime;\n\t/**更新人*/\n    @Schema(description = \"更新人\")\n    private String updateBy;\n\t/**更新时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n    @Schema(description = \"更新时间\")\n    private Date updateTime;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysPermission.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecg.modules.system.constant.DefIndexConst;\n\n/**\n * <p>\n * 菜单权限表\n * </p>\n *\n * @Author scott\n * @since 2018-12-21\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class SysPermission implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\n\t/**\n\t * id\n\t */\n\t@TableId(type = IdType.ASSIGN_ID)\n\tprivate String id;\n\n\t/**\n\t * 父id\n\t */\n\tprivate String parentId;\n\n\t/**\n\t * 菜单名称\n\t */\n\tprivate String name;\n\n\t/**\n\t * 菜单权限编码，例如：“sys:schedule:list,sys:schedule:info”,多个逗号隔开\n\t */\n\tprivate String perms;\n\t/**\n\t * 权限策略1显示2禁用\n\t */\n\tprivate String permsType;\n\n\t/**\n\t * 菜单图标\n\t */\n\tprivate String icon;\n\n\t/**\n\t * 组件\n\t */\n\tprivate String component;\n\t\n\t/**\n\t * 组件名字\n\t */\n\tprivate String componentName;\n\n\t/**\n\t * 路径\n\t */\n\tprivate String url;\n\t/**\n\t * 一级菜单跳转地址\n\t */\n\tprivate String redirect;\n\n\t/**\n\t * 菜单排序\n\t */\n\tprivate Double sortNo;\n\n\t/**\n\t * 类型（0：一级菜单；1：子菜单 ；2：按钮权限）\n\t */\n\t@Dict(dicCode = \"menu_type\")\n\tprivate Integer menuType;\n\n\t/**\n\t * 是否叶子节点: 1:是  0:不是\n\t */\n\t@TableField(value=\"is_leaf\")\n\tprivate boolean leaf;\n\t\n\t/**\n\t * 是否路由菜单: 0:不是  1:是（默认值1）\n\t */\n\t@TableField(value=\"is_route\")\n\tprivate boolean route;\n\n\n\t/**\n\t * 是否缓存页面: 0:不是  1:是（默认值1）\n\t */\n\t@TableField(value=\"keep_alive\")\n\tprivate boolean keepAlive;\n\n\t/**\n\t * 描述\n\t */\n\tprivate String description;\n\n\t/**\n\t * 创建人\n\t */\n\tprivate String createBy;\n\n\t/**\n\t * 删除状态 0正常 1已删除\n\t */\n\tprivate Integer delFlag;\n\t\n\t/**\n\t * 是否配置菜单的数据权限 1是0否 默认0\n\t */\n\tprivate Integer ruleFlag;\n\t\n\t/**\n\t * 是否隐藏路由菜单: 0否,1是（默认值0）\n\t */\n\tprivate boolean hidden;\n\n\t/**\n\t * 是否隐藏Tab: 0否,1是（默认值0）\n\t */\n\tprivate boolean hideTab;\n\n\t/**\n\t * 创建时间\n\t */\n\tprivate Date createTime;\n\n\t/**\n\t * 更新人\n\t */\n\tprivate String updateBy;\n\n\t/**\n\t * 更新时间\n\t */\n\tprivate Date updateTime;\n\t\n\t/**按钮权限状态(0无效1有效)*/\n\tprivate java.lang.String status;\n\t\n\t/**alwaysShow*/\n    private boolean alwaysShow;\n\n\t/*update_begin author:wuxianquan date:20190908 for:实体增加字段 */\n    /** 外链菜单打开方式 0/内部打开 1/外部打开 */\n    private boolean internalOrExternal;\n\t/*update_end author:wuxianquan date:20190908 for:实体增加字段 */\n\n    public SysPermission() {\n    \t\n    }\n    public SysPermission(boolean index) {\n    \tif(index) {\n\t\t\tthis.id = \"9502685863ab87f0ad1134142788a385\";\n\t\t\tthis.name = DefIndexConst.DEF_INDEX_NAME;\n\t\t\tthis.component = DefIndexConst.DEF_INDEX_COMPONENT;\n\t\t\tthis.componentName = \"dashboard-analysis\";\n\t\t\tthis.url = DefIndexConst.DEF_INDEX_URL;\n        \tthis.icon=\"home\";\n        \tthis.menuType=0;\n        \tthis.sortNo=0.0;\n        \tthis.ruleFlag=0;\n        \tthis.delFlag=0;\n        \tthis.alwaysShow=false;\n        \tthis.route=true;\n        \tthis.keepAlive=true;\n        \tthis.leaf=true;\n        \tthis.hidden=false;\n    \t}\n    \t\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysPermissionDataRule.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\n\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\n/**\n * <p>\n * 菜单权限规则表\n * </p>\n *\n * @Author huangzhilin\n * @since 2019-03-29\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class SysPermissionDataRule implements Serializable {\n\t\n\tprivate static final long serialVersionUID = 1L;\n\t\n\t/**\n\t * id\n\t */\n\t@TableId(type = IdType.ASSIGN_ID)\n\tprivate String id;\n\t\n\t/**\n\t * 对应的菜单id\n\t */\n\tprivate String permissionId;\n\t\n\t/**\n\t * 规则名称\n\t */\n\tprivate String ruleName;\n\t\n\t/**\n\t * 字段\n\t */\n\tprivate String ruleColumn;\n\t\n\t/**\n\t * 条件\n\t */\n\tprivate String ruleConditions;\n\t\n\t/**\n\t * 规则值\n\t */\n\tprivate String ruleValue;\n\t\n\t/**\n\t * 状态值 1有效 0无效\n\t */\n\tprivate String status;\n\t\n\t/**\n\t * 创建时间\n\t */\n\tprivate Date createTime;\n\t\n\t/**\n\t * 创建人\n\t */\n\tprivate String createBy;\n\t\n\t/**\n\t * 修改时间\n\t */\n\tprivate Date updateTime;\n\t\n\t/**\n\t * 修改人\n\t */\n\tprivate String updateBy;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysPosition.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\n/**\n * @Description: 职务级别\n * @Author: jeecg-boot\n * @Date: 2019-09-19\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_position\")\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@Schema(description=\"职务级别表\")\npublic class SysPosition {\n\n    /**\n     * id\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"id\")\n    private java.lang.String id;\n    /**\n     * 职务编码\n     */\n    @Excel(name = \"职务编码\", width = 15)\n    @Schema(description = \"职务编码\")\n    private java.lang.String code;\n    /**\n     * 职务级别名称\n     */\n    @Excel(name = \"职务级别名称\", width = 15)\n    @Schema(description = \"职务级别名称\")\n    private java.lang.String name;\n    /**\n     * 职级\n     */\n    //@Excel(name = \"职级\", width = 15,dicCode =\"position_rank\")\n    @Schema(description = \"职务等级\")\n    private java.lang.Integer postLevel;\n    /**\n     * 公司id\n     */\n    @Schema(description = \"公司id\")\n    private java.lang.String companyId;\n    /**\n     * 创建人\n     */\n    @Schema(description = \"创建人\")\n    private java.lang.String createBy;\n    /**\n     * 创建时间\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建时间\")\n    private java.util.Date createTime;\n    /**\n     * 修改人\n     */\n    @Schema(description = \"修改人\")\n    private java.lang.String updateBy;\n    /**\n     * 修改时间\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"修改时间\")\n    private java.util.Date updateTime;\n    /**\n     * 组织机构编码\n     */\n    @Schema(description = \"组织机构编码\")\n    private java.lang.String sysOrgCode;\n\n    /**租户ID*/\n    @Schema(description = \"租户ID\")\n    private java.lang.Integer tenantId;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysRole.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.io.Serializable;\nimport java.time.LocalDateTime;\nimport java.util.Date;\n\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\n/**\n * <p>\n * 角色表\n * </p>\n *\n * @Author scott\n * @since 2018-12-19\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class SysRole implements Serializable {\n\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * id\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    private String id;\n    \n    /**\n     * 角色名称\n     */\n    @Excel(name=\"角色名\",width=15)\n    private String roleName;\n    \n    /**\n     * 角色编码\n     */\n    @Excel(name=\"角色编码\",width=15)\n    private String roleCode;\n    \n    /**\n          * 描述\n     */\n    @Excel(name=\"描述\",width=60)\n    private String description;\n\n    /**\n     * 创建人\n     */\n    private String createBy;\n\n    /**\n     * 创建时间\n     */\n    @JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    private Date createTime;\n\n    /**\n     * 更新人\n     */\n    private String updateBy;\n\n    /**\n     * 更新时间\n     */\n    @JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    private Date updateTime;\n\n    /**租户ID*/\n    private java.lang.Integer tenantId;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysRoleIndex.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableField;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\n\n/**\n * @Description: 角色首页配置\n * @Author: liusq\n * @Date:   2022-03-25\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_role_index\")\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@Schema(description=\"角色首页配置\")\npublic class SysRoleIndex {\n    \n\t/**id*/\n\t@TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"id\")\n\tprivate java.lang.String id;\n\t/**角色编码*/\n\t@Excel(name = \"角色编码\", width = 15)\n    @Schema(description = \"角色编码\")\n\tprivate java.lang.String roleCode;\n\t/**路由地址*/\n\t@Excel(name = \"路由地址\", width = 15)\n    @Schema(description = \"路由地址\")\n\tprivate java.lang.String url;\n\t/**路由地址*/\n\t@Excel(name = \"路由地址\", width = 15)\n    @Schema(description = \"组件\")\n\tprivate java.lang.String component;\n\t/**\n\t * 是否路由菜单: 0:不是  1:是（默认值1）\n\t */\n\t@Excel(name = \"是否路由菜单\", width = 15)\n\t@Schema(description = \"是否路由菜单\")\n\t@TableField(value=\"is_route\")\n\tprivate Boolean route;\n\t/**优先级*/\n\t@Excel(name = \"优先级\", width = 15)\n    @Schema(description = \"优先级\")\n\tprivate java.lang.Integer priority;\n\t/**路由地址*/\n\t@Excel(name = \"状态\", width = 15)\n\t@Schema(description = \"状态\")\n\tprivate java.lang.String status;\n\t/**创建人登录名称*/\n\t@Excel(name = \"创建人登录名称\", width = 15)\n    @Schema(description = \"创建人登录名称\")\n\tprivate java.lang.String createBy;\n\t/**创建日期*/\n\t@Excel(name = \"创建日期\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建日期\")\n\tprivate java.util.Date createTime;\n\t/**更新人登录名称*/\n\t@Excel(name = \"更新人登录名称\", width = 15)\n    @Schema(description = \"更新人登录名称\")\n\tprivate java.lang.String updateBy;\n\t/**更新日期*/\n\t@Excel(name = \"更新日期\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"更新日期\")\n\tprivate java.util.Date updateTime;\n\t/**所属部门*/\n\t@Excel(name = \"所属部门\", width = 15)\n    @Schema(description = \"所属部门\")\n\tprivate java.lang.String sysOrgCode;\n\n\t/**关联类型(ROLE:角色 USER:表示用户)*/\n    @Schema(description = \"关联类型\")\n\t@Excel(name = \"关联类型\", width = 15, dicCode = \"relation_type\")\n\t@Dict(dicCode = \"relation_type\")\n\tprivate java.lang.String relationType;\n\n\n\tpublic SysRoleIndex() {\n\n\t}\n\tpublic SysRoleIndex(String componentUrl){\n\t\tthis.component = componentUrl;\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysRolePermission.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.springframework.format.annotation.DateTimeFormat;\n\n/**\n * <p>\n * 角色权限表\n * </p>\n *\n * @Author scott\n * @since 2018-12-21\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class SysRolePermission implements Serializable {\n\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * id\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    private String id;\n    \n    /**\n     * 角色id\n     */\n    private String roleId;\n\n    /**\n     * 权限id\n     */\n    private String permissionId;\n    \n    /**\n     * 数据权限\n     */\n    private String dataRuleIds;\n\n    /**\n     * 操作时间\n     */\n    @JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    private Date operateDate;\n\n    /**\n     * 操作ip\n     */\n    private String operateIp;\n\n    public SysRolePermission() {\n   \t}\n       \n   \tpublic SysRolePermission(String roleId, String permissionId) {\n   \t\tthis.roleId = roleId;\n   \t\tthis.permissionId = permissionId;\n   \t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysTableWhiteList.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\n/**\n * @Description: 系统表白名单\n * @Author: jeecg-boot\n * @Date: 2023-09-12\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_table_white_list\")\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@Schema(description=\"系统表白名单\")\npublic class SysTableWhiteList {\n\n    /**\n     * 主键id\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"主键id\")\n    private java.lang.String id;\n    /**\n     * 允许的表名\n     */\n    @Excel(name = \"允许的表名\", width = 15)\n    @Schema(description = \"允许的表名\")\n    private java.lang.String tableName;\n    /**\n     * 允许的字段名，多个用逗号分割\n     */\n    @Excel(name = \"允许的字段名\", width = 15)\n    @Schema(description = \"允许的字段名\")\n    private java.lang.String fieldName;\n    /**\n     * 状态，1=启用，0=禁用\n     */\n    @Excel(name = \"状态\", width = 15)\n    @Schema(description = \"状态\")\n    private java.lang.String status;\n    /**\n     * 创建人\n     */\n    @Excel(name = \"创建人\", width = 15)\n    @Schema(description = \"创建人\")\n    private java.lang.String createBy;\n    /**\n     * 创建时间\n     */\n    @Excel(name = \"创建时间\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建时间\")\n    private java.util.Date createTime;\n    /**\n     * 更新人\n     */\n    @Excel(name = \"更新人\", width = 15)\n    @Schema(description = \"更新人\")\n    private java.lang.String updateBy;\n    /**\n     * 更新时间\n     */\n    @Excel(name = \"更新时间\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"更新时间\")\n    private java.util.Date updateTime;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysTenant.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Data;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * 租户信息\n * @author: jeecg-boot\n */\n@Data\n@TableName(\"sys_tenant\")\npublic class SysTenant implements Serializable {\n\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * 编码\n     */\n    private Integer id;\n    \n    /**\n     * 名称\n     */\n    private String name;\n    \n\n    /**\n     * 创建人\n     */\n    @Dict(dictTable =\"sys_user\",dicText = \"realname\",dicCode = \"username\")\n    private String createBy;\n\n    /**\n     * 创建时间\n     */\n    @JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    private Date createTime;\n\n    /**\n     * 开始时间\n     */\n    @JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    private Date beginDate;\n\n    /**\n     * 结束时间\n     */\n    @JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    private Date endDate;\n\n    /**\n     * 状态 1正常 0冻结\n     */\n    @Dict(dicCode = \"tenant_status\")\n    private Integer status;\n\n    /**\n     * 所属行业\n     */\n    @Dict(dicCode = \"trade\")\n    private String trade;\n\n    /**\n     * 公司规模\n     */\n    @Dict(dicCode = \"company_size\")\n    private String companySize;\n\n    /**\n     * 公司地址\n     */\n    private String companyAddress;\n\n    /**\n     * 公司logo\n     */\n    private String companyLogo;\n\n    /**\n     * 门牌号\n     */\n    private String houseNumber;\n\n    /**\n     * 工作地点\n     */\n    private String workPlace;\n\n    /**\n     * 二级域名(暂时无用,预留字段)\n     */\n    private String secondaryDomain;\n\n    /**\n     * 登录背景图片(暂时无用，预留字段)\n     */\n    private String loginBkgdImg;\n\n    /**\n     * 职级\n     */\n    @Dict(dicCode = \"company_rank\")\n    private String position;\n\n    /**\n     * 部门\n     */\n    @Dict(dicCode = \"company_department\")\n    private String department;\n    \n    @TableLogic\n    private Integer delFlag;\n\n    /**更新人登录名称*/\n    private String updateBy;\n    \n    /**更新日期*/\n    @JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    private Date updateTime;\n\n    /**\n     * 允许申请管理员 1允许 0不允许\n     */\n    private Integer applyStatus;\n    \n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysTenantPack.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\nimport com.baomidou.mybatisplus.annotation.*;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\n/**\n * @Description: 租户产品包\n * @Author: jeecg-boot\n * @Date:   2022-12-31\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_tenant_pack\")\n@Accessors(chain = true)\n@EqualsAndHashCode(callSuper = false)\n@Schema(description=\"租户产品包\")\npublic class SysTenantPack implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n\t/**主键id*/\n\t@TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"主键id\")\n    private String id;\n\t/**租户id*/\n\t@Excel(name = \"租户id\", width = 15)\n    @Schema(description = \"租户id\")\n    private Integer tenantId;\n\t/**产品包名*/\n\t@Excel(name = \"产品包名\", width = 15)\n    @Schema(description = \"产品包名\")\n    private String packName;\n\t/**开启状态(0 未开启 1开启)*/\n\t@Excel(name = \"开启状态(0 未开启 1开启)\", width = 15)\n    @Schema(description = \"开启状态(0 未开启 1开启)\")\n    private String status;\n\t/**备注*/\n\t@Excel(name = \"备注\", width = 15)\n    @Schema(description = \"备注\")\n    private String remarks;\n\t/**创建人*/\n    @Schema(description = \"创建人\")\n    private String createBy;\n\t/**创建时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n    @Schema(description = \"创建时间\")\n    private Date createTime;\n\t/**更新人*/\n    @Schema(description = \"更新人\")\n    private String updateBy;\n\t/**更新时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n    @Schema(description = \"更新时间\")\n    private Date updateTime;\n    /**产品包类型(default 默认产品包 custom 自定义产品包)*/\n    @Excel(name = \"产品包类型\", width = 15)\n    @Schema(description = \"产品包类型\")\n\tprivate String packType;\n\n    /**\n     * 是否自动分配给用户(0 否 1是)\n     */\n    @Excel(name = \"是否自动分配给用户(0 否 1是)\", width = 15)\n    @Schema(description = \"是否自动分配给用户\")\n    private String izSysn;\n    \n    /**菜单id 临时字段用于新增编辑菜单id传递*/\n    @TableField(exist = false)\n    private String permissionIds;\n    \n    \n    /**\n     * 编码\n     */\n    private String packCode;\n    \n    public SysTenantPack(){\n        \n    }\n\n    public SysTenantPack(Integer tenantId, String packName, String packCode){\n        this.tenantId = tenantId;\n        this.packCode = packCode;\n        this.packName = packName;\n        this.status = \"1\";\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysTenantPackUser.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\n\n/**\n * @Description: 租户产品包用户关系表\n * @Author: jeecg-boot\n * @Date:   2023-02-16\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_tenant_pack_user\")\n@Accessors(chain = true)\n@EqualsAndHashCode(callSuper = false)\n@Schema(description=\"租户产品包用户关系表\")\npublic class SysTenantPackUser implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    /**id*/\n    @TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"id\")\n    private java.lang.String id;\n    /**租户产品包ID*/\n    @Excel(name = \"租户产品包ID\", width = 15)\n    @Schema(description = \"租户产品包ID\")\n    private java.lang.String packId;\n    /**用户ID*/\n    @Excel(name = \"用户ID\", width = 15)\n    @Schema(description = \"用户ID\")\n    private java.lang.String userId;\n    /**租户ID*/\n    @Excel(name = \"租户ID\", width = 15)\n    @Schema(description = \"租户ID\")\n    private java.lang.Integer tenantId;\n    /**创建人*/\n    @Schema(description = \"创建人\")\n    private java.lang.String createBy;\n    /**创建时间*/\n    @JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n    @Schema(description = \"创建时间\")\n    private java.util.Date createTime;\n    /**更新人*/\n    @Schema(description = \"更新人\")\n    private java.lang.String updateBy;\n    /**更新时间*/\n    @JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n    @Schema(description = \"更新时间\")\n    private java.util.Date updateTime;\n\n    private transient String realname;\n\n    private transient String packName;\n\n    private transient String packCode;\n\n    /**\n     * 状态(申请状态0 正常状态1)\n     */\n    private Integer status;\n\n    public SysTenantPackUser(){\n        \n    }\n    public SysTenantPackUser(Integer tenantId, String packId, String userId) {\n        this.packId = packId;\n        this.userId = userId;\n        this.tenantId = tenantId;\n        this.status = 1;\n    }\n\n    public SysTenantPackUser(SysTenantPackUser param, String userId, String realname) {\n        this.userId = userId;\n        this.realname = realname;\n        this.packId = param.getPackId();\n        this.tenantId = param.getTenantId();\n        this.packName = param.getPackName();\n        this.status = 1;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysThirdAccount.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\n/**\n * @Description: 第三方登录账号表\n * @Author: jeecg-boot\n * @Date:   2020-11-17\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_third_account\")\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@Schema(description=\"第三方登录账号表\")\npublic class SysThirdAccount {\n \n\t/**编号*/\n\t@TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"编号\")\n\tprivate java.lang.String id;\n\t/**第三方登录id*/\n\t@Excel(name = \"第三方登录id\", width = 15)\n\t@Schema(description = \"第三方登录id\")\n\tprivate java.lang.String sysUserId;\n\t/**登录来源*/\n\t@Excel(name = \"登录来源\", width = 15)\n\t@Schema(description = \"登录来源\")\n\tprivate java.lang.String thirdType;\n\t/**头像*/\n\t@Excel(name = \"头像\", width = 15)\n\t@Schema(description = \"头像\")\n\tprivate java.lang.String avatar;\n\t/**状态(1-正常,2-冻结)*/\n\t@Excel(name = \"状态(1-正常,2-冻结)\", width = 15)\n\t@Schema(description = \"状态(1-正常,2-冻结)\")\n\tprivate java.lang.Integer status;\n\t/**删除状态(0-正常,1-已删除)*/\n\t@Excel(name = \"删除状态(0-正常,1-已删除)\", width = 15)\n\t@Schema(description = \"删除状态(0-正常,1-已删除)\")\n\tprivate java.lang.Integer delFlag;\n\t/**真实姓名*/\n\t@Excel(name = \"真实姓名\", width = 15)\n\t@Schema(description = \"真实姓名\")\n\tprivate java.lang.String realname;\n\t/**第三方用户uuid*/\n\t@Excel(name = \"第三方用户uuid\", width = 15)\n\t@Schema(description = \"第三方用户uuid\")\n\tprivate java.lang.String thirdUserUuid;\n\t/**第三方用户账号*/\n\t@Excel(name = \"第三方用户账号\", width = 15)\n\t@Schema(description = \"第三方用户账号\")\n\tprivate java.lang.String thirdUserId;\n    /**创建人*/\n    @Excel(name = \"创建人\", width = 15)\n    private java.lang.String createBy;\n    /**创建日期*/\n    @Excel(name = \"创建日期\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n    @JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    private java.util.Date createTime;\n    /**修改人*/\n    @Excel(name = \"修改人\", width = 15)\n    private java.lang.String updateBy;\n    /**修改日期*/\n    @Excel(name = \"修改日期\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n    @JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    private java.util.Date updateTime;\n\n\t/**租户id*/\n\tprivate java.lang.Integer tenantId;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysThirdAppConfig.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport java.util.Date;\n\n/**\n * @Description: 第三方配置表\n * @Author: jeecg-boot\n * @Date:   2023-02-03\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_third_app_config\")\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@Schema(description=\"第三方配置表\")\npublic class SysThirdAppConfig {\n\n    /**编号*/\n    @TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"编号\")\n    private String id;\n\n    /**租户id*/\n    @Excel(name = \"租户id\", width = 15)\n    @Schema(description = \"租户id\")\n    private Integer tenantId;\n\n    /**钉钉/企业微信第三方企业应用标识*/\n    @Excel(name = \"钉钉/企业微信第三方企业应用标识\", width = 15)\n    @Schema(description = \"钉钉/企业微信第三方企业应用标识\")\n    private String agentId;\n\n    /**钉钉/企业微信 应用id*/\n    @Excel(name = \"钉钉/企业微信 应用id\", width = 15)\n    @Schema(description = \"钉钉/企业微信 应用id\")\n    private String clientId;\n\n    /**钉钉/企业微信应用id对应的秘钥*/\n    @Excel(name = \"钉钉/企业微信应用id对应的秘钥\", width = 15)\n    @Schema(description = \"钉钉/企业微信应用id对应的秘钥\")\n    private String clientSecret;\n\n    /**钉钉企业id*/\n    @Excel(name = \"钉钉企业id\", width = 15)\n    @Schema(description = \"钉钉企业id\")\n    private String corpId;\n\n    /**第三方类别(dingtalk 钉钉 wechat_enterprise 企业微信)*/\n    @Excel(name = \"第三方类别(dingtalk 钉钉 wechat_enterprise 企业微信)\", width = 15)\n    @Schema(description = \"第三方类别(dingtalk 钉钉 wechat_enterprise 企业微信)\")\n    private String thirdType;\n\n    /**是否启用(0-否,1-是)*/\n    @Excel(name = \"是否启用(0-否,1-是)\", width = 15)\n    @Schema(description = \"是否启用(0-否,1-是)\")\n    private Integer status;\n\n    /**创建日期*/\n    @Excel(name = \"创建日期\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n    @JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    private Date createTime;\n\n    /**修改日期*/\n    @Excel(name = \"修改日期\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n    @JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    private Date updateTime;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUser.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.util.Date;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport java.io.Serializable;\n\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\n/**\n * <p>\n * 用户表\n * </p>\n *\n * @Author scott\n * @since 2018-12-20\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class SysUser implements Serializable {\n\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * id\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    private String id;\n\n    /**\n     * 登录账号\n     */\n    @Excel(name = \"登录账号\", width = 15)\n    private String username;\n\n    /**\n     * 真实姓名\n     */\n    @Excel(name = \"真实姓名\", width = 15)\n    private String realname;\n\n    /**\n     * 密码\n     */\n    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)\n    private String password;\n\n    /**\n     * md5密码盐\n     */\n    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)\n    private String salt;\n\n    /**\n     * 头像\n     */\n    @Excel(name = \"头像\", width = 15,type = 2)\n    private String avatar;\n\n    /**\n     * 生日\n     */\n    @Excel(name = \"生日\", width = 15, format = \"yyyy-MM-dd\")\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd\")\n    private Date birthday;\n\n    /**\n     * 性别（1：男 2：女）\n     */\n    @Excel(name = \"性别\", width = 15,dicCode=\"sex\")\n    @Dict(dicCode = \"sex\")\n    private Integer sex;\n\n    /**\n     * 电子邮件\n     */\n    @Excel(name = \"电子邮件\", width = 15)\n    private String email;\n\n    /**\n     * 电话\n     */\n    @Excel(name = \"电话\", width = 15)\n    private String phone;\n\n    /**\n     * 登录选择部门编码\n     */\n    private String orgCode;\n    /**\n     * 登录选择租户ID\n     */\n    private Integer loginTenantId;\n\n    /**部门名称*/\n    private transient String orgCodeTxt;\n\n    /**\n     * 状态(1：正常  2：冻结 ）\n     */\n    @Excel(name = \"状态\", width = 15,dicCode=\"user_status\")\n    @Dict(dicCode = \"user_status\")\n    private Integer status;\n\n    /**\n     * 删除状态（0，正常，1已删除）\n     */\n    @Excel(name = \"删除状态\", width = 15,dicCode=\"del_flag\")\n    @TableLogic\n    private Integer delFlag;\n\n    /**\n     * 工号，唯一键\n     */\n    @Excel(name = \"工号\", width = 15)\n    private String workNo;\n\n    /**\n     * 职务，关联职务表\n     */\n    @Excel(name = \"职务\", width = 15)\n    @Dict(dictTable =\"sys_position\",dicText = \"name\",dicCode = \"id\")\n    @TableField(exist = false)\n    private String post;\n\n    /**\n     * 座机号\n     */\n    @Excel(name = \"座机号\", width = 15)\n    private String telephone;\n\n    /**\n     * 创建人\n     */\n    private String createBy;\n\n    /**\n     * 创建时间\n     */\n    private Date createTime;\n\n    /**\n     * 更新人\n     */\n    private String updateBy;\n\n    /**\n     * 更新时间\n     */\n    private Date updateTime;\n    /**\n     * 同步工作流引擎1同步0不同步\n     */\n    private Integer activitiSync;\n\n    /**\n     * 身份（0 普通成员 1 上级）\n     */\n    @Excel(name=\"（1普通成员 2上级）\",width = 15)\n    private Integer userIdentity;\n\n    /**\n     * 负责部门\n     */\n    @Excel(name=\"负责部门\",width = 15,dictTable =\"sys_depart\",dicText = \"depart_name\",dicCode = \"id\")\n    @Dict(dictTable =\"sys_depart\",dicText = \"depart_name\",dicCode = \"id\")\n    private String departIds;\n\n    /**\n     * 多租户ids临时用，不持久化数据库(数据库字段不存在)\n     */\n    @TableField(exist = false)\n    private String relTenantIds;\n\n    /**设备id uniapp推送用*/\n    private String clientId;\n\n    /**\n     * 登录首页地址\n     */\n    @TableField(exist = false)\n    private String homePath;\n\n    /**\n     * 职位名称\n     */\n    @TableField(exist = false)\n    private String postText;\n\n    /**\n     * 流程状态\n     */\n    private String bpmStatus;\n\n    /**\n     * 是否已经绑定第三方\n     */\n    @TableField(exist = false)\n    private boolean izBindThird;\n\n    /**\n     * 个性签名\n     */\n    private String sign;\n\n    /**\n     * 是否开启个性签名\n     */\n    private Integer signEnable;\n\n    /**\n     * 主岗位\n     */\n    @Excel(name=\"主岗位\",width = 15,dictTable =\"sys_depart\",dicText = \"depart_name\",dicCode = \"id\")\n    @Dict(dictTable =\"sys_depart\",dicText = \"depart_name\",dicCode = \"id\")\n    private String mainDepPostId;\n\n    /**\n     * 兼职岗位\n     */\n    @Excel(name=\"兼职岗位\",width = 15,dictTable =\"sys_depart\",dicText = \"depart_name\",dicCode = \"id\")\n    @Dict(dictTable =\"sys_depart\",dicText = \"depart_name\",dicCode = \"id\")\n    @TableField(exist = false)\n    private String otherDepPostId;\n\n    /**\n     * 职务(字典)\n     */\n    @Excel(name = \"职务\", width = 15, dicCode = \"user_position\")\n    @Dict(dicCode = \"user_position\")\n    private String positionType;\n\n    /**\n     * 上一次修改密码的时间\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    private Date lastPwdUpdateTime;\n\n    /**\n     * 登录时，选择的部门，临时用，不持久化数据库(数据库字段不存在)\n     */\n    @TableField(exist = false)\n    private String loginOrgCode;\n\n    /**\n     * 排序\n     */\n    private Integer sort;\n    \n    /**\n     * 是否隐藏联系方式 0否1是\n     */\n    private String izHideContact;\n\n    /**\n     * 所属部门的id\n     */\n    @TableField(exist = false)\n    private String belongDepIds;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUserDepPost.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @Description: 部门岗位用户\n * @author: wangshuai\n * @date: 2025/9/5 11:45\n */\n@Data\n@TableName(\"sys_user_dep_post\")\npublic class SysUserDepPost implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * 主键id\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"主键id\")\n    private String id;\n    /**\n     * 用户id\n     */\n    @Schema(description = \"用户id\")\n    private String userId;\n    /**\n     * 部门岗位id\n     */\n    @Schema(description = \"部门岗位id\")\n    private String depId;\n\n    /**\n     * 创建人\n     */\n    @Schema(description = \"创建人\")\n    private String createBy;\n\n    /**\n     * 创建时间\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建时间\")\n    private Date createTime;\n    /**\n     * 更新人\n     */\n    @Schema(description = \"更新人\")\n    private String updateBy;\n    /**\n     * 更新时间\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"更新时间\")\n    private Date updateTime;\n    /**\n     * 机构编码\n     */\n    @Excel(name = \"机构编码\", width = 15)\n    @Schema(description = \"机构编码\")\n    private String orgCode;\n\n    public SysUserDepPost(String id, String userId, String depId) {\n        super();\n        this.id = id;\n        this.userId = userId;\n        this.depId = depId;\n    }\n\n    public SysUserDepPost(String userId, String departId) {\n        this.userId = userId;\n        this.depId = departId;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUserDepart.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.io.Serializable;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\n\nimport lombok.Data;\n\n/**\n * @Description: 用户部门\n * @author: jeecg-boot\n */\n@Data\n@TableName(\"sys_user_depart\")\npublic class SysUserDepart implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\t\n\t/**主键id*/\n    @TableId(type = IdType.ASSIGN_ID)\n\tprivate String id;\n\t/**用户id*/\n\tprivate String userId;\n\t/**部门id*/\n\tprivate String depId;\n\tpublic SysUserDepart(String id, String userId, String depId) {\n\t\tsuper();\n\t\tthis.id = id;\n\t\tthis.userId = userId;\n\t\tthis.depId = depId;\n\t}\n\n\tpublic SysUserDepart(String userId, String departId) {\n\t\tthis.userId = userId;\n\t\tthis.depId = departId;\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUserPosition.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.io.Serializable;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport java.util.Date;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\n\n/**\n * @Description: 用户职位关系表\n * @Author: jeecg-boot\n * @Date:   2023-02-14\n * @Version: V1.0\n */\n@Schema(description=\"用户职位关系表\")\n@Data\n@TableName(\"sys_user_position\")\npublic class SysUserPosition implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n\t/**主键*/\n\t@TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"主键\")\n    private String id;\n\t/**用户id*/\n\t@Excel(name = \"用户id\", width = 15)\n    @Schema(description = \"用户id\")\n    private String userId;\n\t/**职位id*/\n    @Schema(description = \"职位id\")\n    private String positionId;\n\t/**创建人*/\n    @Schema(description = \"创建人\")\n    private String createBy;\n\t/**创建时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n    @Schema(description = \"创建时间\")\n    private Date createTime;\n\t/**修改人*/\n    @Schema(description = \"修改人\")\n    private String updateBy;\n\t/**修改时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n    @Schema(description = \"修改时间\")\n    private Date updateTime;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUserRole.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.io.Serializable;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\n\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\n/**\n * <p>\n * 用户角色表\n * </p>\n *\n * @Author scott\n * @since 2018-12-21\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class SysUserRole implements Serializable {\n\n    private static final long serialVersionUID = 1L;\n\n    @TableId(type = IdType.ASSIGN_ID)\n    private String id;\n    \n    /**\n     * 用户id\n     */\n    private String userId;\n\n    /**\n     * 角色id\n     */\n    private String roleId;\n    \n    /**租户ID*/\n    private java.lang.Integer tenantId;\n    \n\tpublic SysUserRole() {\n\t}\n\n\tpublic SysUserRole(String userId, String roleId) {\n\t\tthis.userId = userId;\n\t\tthis.roleId = roleId;\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUserTenant.java",
    "content": "package org.jeecg.modules.system.entity;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\n/**\n * @Description: sys_user_tenant_relation\n * @Author: jeecg-boot\n * @Date:   2022-12-23\n * @Version: V1.0\n */\n@Data\n@TableName(\"sys_user_tenant\")\n@Accessors(chain = true)\n@EqualsAndHashCode(callSuper = false)\n@Schema(description=\"sys_user_tenant\")\npublic class SysUserTenant implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n\t/**主键id*/\n\t@TableId(type = IdType.ASSIGN_ID)\n    @Schema(description = \"主键id\")\n    private String id;\n\t/**用户id*/\n\t@Excel(name = \"用户id\", width = 15)\n    @Schema(description = \"用户id\")\n    private String userId;\n\t/**租户id*/\n\t@Excel(name = \"租户id\", width = 15)\n    @Schema(description = \"租户id\")\n    private Integer tenantId;\n\t/**状态(1 正常 2 冻结 3 待审核 4 拒绝)*/\n\t@Excel(name = \"状态(1 正常 2 冻结 3 待审核 4 拒绝)\", width = 15)\n    @Schema(description = \"状态(1 正常 2 冻结 3 待审核 4 拒绝)\")\n    private String status;\n\t/**创建人登录名称*/\n    @Schema(description = \"创建人登录名称\")\n    private String createBy;\n\t/**创建日期*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n    @Schema(description = \"创建日期\")\n    private Date createTime;\n\t/**更新人登录名称*/\n    @Schema(description = \"更新人登录名称\")\n    private String updateBy;\n\t/**更新日期*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n    @Schema(description = \"更新日期\")\n    private Date updateTime;\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/excelstyle/ExcelExportSysUserStyle.java",
    "content": "package org.jeecg.modules.system.excelstyle;\n\nimport org.apache.poi.ss.usermodel.*;\nimport org.jeecgframework.poi.excel.export.styler.ExcelExportStylerDefaultImpl;\n\n/**\n * @Description: 导入用户获取标题头部样式 覆盖默认样式\n *\n * @author: wangshuai\n * @date: 2025/8/28 14:05\n */\npublic class ExcelExportSysUserStyle extends ExcelExportStylerDefaultImpl {\n\n    public ExcelExportSysUserStyle(Workbook workbook) {\n        super(workbook);\n    }\n\n    /**\n     * 获取标题样式\n     *\n     * @param color\n     * @return\n     */\n    public CellStyle getHeaderStyle(short color) {\n        CellStyle titleStyle = this.workbook.createCellStyle();\n        Font font = this.workbook.createFont();\n        font.setFontHeightInPoints((short)12);\n        titleStyle.setFont(font);\n        titleStyle.setAlignment(HorizontalAlignment.LEFT);\n        titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);\n        titleStyle.setWrapText(true);\n        return titleStyle;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/job/UserUpadtePwdJob.java",
    "content": "package org.jeecg.modules.system.job;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.api.dto.message.MessageDTO;\nimport org.jeecg.common.constant.enums.NoticeTypeEnum;\nimport org.jeecg.common.system.api.ISysBaseAPI;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.service.ISysUserService;\nimport org.quartz.Job;\nimport org.quartz.JobExecutionContext;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Calendar;\nimport java.util.List;\n\n/**\n* @Description: 用户更新提醒job\n*\n* @author: wangshuai\n* @date: 2025/9/13 16:20\n*/\n@Slf4j\npublic class UserUpadtePwdJob implements Job {\n    \n    @Autowired\n    private  ISysBaseAPI sysBaseAPI;\n\n    @Autowired\n    private ISysUserService userService;\n\n    @Override\n    public void execute(JobExecutionContext context) {\n        //获取当前时间5个月前的时间\n        // 获取当前日期\n        Calendar calendar = Calendar.getInstance();\n        // 减去5个月\n        calendar.add(Calendar.MONTH, -5);\n        // 格式化输出\n        SimpleDateFormat sdf = new SimpleDateFormat(\"yyyy-MM-dd\");\n        String formattedDate = sdf.format(calendar.getTime());\n        String startTime = formattedDate + \" 00:00:00\";\n        String endTime = formattedDate + \" 23:59:59\";\n        LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();\n        queryWrapper.between(SysUser::getLastPwdUpdateTime, startTime, endTime);\n        queryWrapper.select(SysUser::getUsername,SysUser::getRealname);\n        List<SysUser> list = userService.list(queryWrapper);\n        if (CollectionUtil.isNotEmpty(list)){\n            for (SysUser sysUser : list) {\n                this.sendSysMessage(sysUser.getUsername(), sysUser.getRealname());\n            }\n        }\n    }\n    \n\n    /**\n     * 发送系统消息\n     */\n    private void sendSysMessage(String username, String realname) {\n        String fromUser = \"system\";\n        String title = \"尊敬的\"+realname+\"您的密码已经5个月未修改了，请修改密码\";\n        MessageDTO messageDTO = new MessageDTO(fromUser, username, title, title);\n        messageDTO.setNoticeType(NoticeTypeEnum.NOTICE_TYPE_PLAN.getValue());\n        sysBaseAPI.sendSysAnnouncement(messageDTO);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport java.util.Date;\nimport java.util.List;\n\nimport com.baomidou.mybatisplus.core.conditions.Wrapper;\nimport com.baomidou.mybatisplus.core.toolkit.Constants;\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.system.entity.SysAnnouncement;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\n\n/**\n * @Description: 系统通告表\n * @Author: jeecg-boot\n * @Date:  2019-01-02\n * @Version: V1.0\n */\npublic interface SysAnnouncementMapper extends BaseMapper<SysAnnouncement> {\n\n    /**\n     * 通过消息类型和用户id获取系统通告\n     * @param page\n     * @param userId 用户id\n     * @param msgCategory 消息类型\n     * @return\n     */\n\tList<SysAnnouncement> querySysCementListByUserId(Page<SysAnnouncement> page, @Param(\"userId\")String userId,@Param(\"msgCategory\")String msgCategory,\n                                                     @Param(\"tenantId\")Integer tenantId, @Param(\"beginDate\")Date beginDate);\n\n    /**\n     * 获取用户未读消息数量\n     *\n     * @param userId 用户id\n     * @param noticeType\n     * @return\n     */\n    Integer getUnreadMessageCountByUserId(@Param(\"userId\") String userId, @Param(\"beginDate\") Date beginDate, @Param(\"noticeType\") String noticeType);\n\n    /**\n     * 分页查询全部消息列表\n     * @param page\n     * @param userId\n     * @param fromUser\n     * @param beginDate\n     * @param endDate\n     * @param noticeType\n     * @return\n     */\n\tList<SysAnnouncement> queryAllMessageList(Page<SysAnnouncement> page, @Param(\"userId\")String userId, @Param(\"fromUser\")String fromUser, @Param(\"starFlag\")String starFlag, @Param(\"busType\")String busType, @Param(\"msgCategory\")String msgCategory, @Param(\"beginDate\")Date beginDate, @Param(\"endDate\")Date endDate, @Param(\"noticeType\") String noticeType);\n   \n    /**\n     * 查询用户未阅读的通知公告\n     * @param currDate\n     * @param userId\n     * @return\n     */\n    List<String> getNotSendedAnnouncementlist(@Param(\"currDate\") Date currDate, @Param(\"userId\")String userId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysAnnouncementSendMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport org.apache.ibatis.annotations.Select;\nimport org.jeecg.modules.system.entity.SysAnnouncementSend;\nimport org.jeecg.modules.system.model.AnnouncementSendModel;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\n\n/**\n * @Description: 用户通告阅读标记表\n * @Author: jeecg-boot\n * @Date:  2019-02-21\n * @Version: V1.0\n */\npublic interface SysAnnouncementSendMapper extends BaseMapper<SysAnnouncementSend> {\n\n\t/**\n\t * 获取我的消息\n\t * @param announcementSendModel\n\t * @param page\n\t * @return\n\t */\n\tpublic List<AnnouncementSendModel> getMyAnnouncementSendList(Page<AnnouncementSendModel> page,@Param(\"announcementSendModel\") AnnouncementSendModel announcementSendModel);\n\n\t/**\n\t * 获取一条记录\n\t * @param sendId\n\t * @return\n\t */\n\tAnnouncementSendModel getOne(@Param(\"sendId\") String sendId);\n\n\n\t/**\n\t * 修改为已读消息\n\t */\n\tvoid updateReaded(@Param(\"userId\") String userId, @Param(\"annoceIdList\") List<String> annoceIdList);\n\n\t/**\n\t * 清除所有未读消息\n\t * @param userId\n\t */\n\tvoid clearAllUnReadMessage(@Param(\"userId\") String userId);\n\n    /**\n     * 根据用户id和通告阅读表的id获取当前用户已阅读的数量\n     * \n     * @param id\n     * @param userId\n     */\n    @Select(\"select count(1) from sys_announcement_send where id=#{id} and user_id = #{userId} and read_flag = 1\")\n    long getReadCountByUserId(@Param(\"id\") String id, @Param(\"userId\") String userId);\n\n    /**\n     * 根据用户id和阅读表的id获取所有阅读的数据\n     * \n     * @param ids\n     * @param userId\n     * @return\n     */\n    List<String> getReadAnnSendByUserId(@Param(\"ids\") List<String> ids, @Param(\"userId\") String userId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysCategoryMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport com.baomidou.mybatisplus.annotation.InterceptorIgnore;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport org.apache.ibatis.annotations.Param;\nimport org.apache.ibatis.annotations.Select;\nimport org.jeecg.modules.system.entity.SysCategory;\nimport org.jeecg.modules.system.model.TreeSelectModel;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: 分类字典\n * @Author: jeecg-boot\n * @Date:   2019-05-29\n * @Version: V1.0\n */\npublic interface SysCategoryMapper extends BaseMapper<SysCategory> {\n\t\n\t/**\n\t * 根据父级ID查询树节点数据\n\t * @param pid\n     * @param query\n\t * @return\n\t */\n\tpublic List<TreeSelectModel> queryListByPid(@Param(\"pid\")  String pid,@Param(\"query\") Map<String, String> query);\n\n    /**\n     * 通过code查询分类字典表\n     * @param code\n     * @return\n     */\n\t@Select(\"SELECT ID FROM sys_category WHERE CODE = #{code,jdbcType=VARCHAR}\")\n\tpublic String queryIdByCode(@Param(\"code\")  String code);\n\t\n\t/**\n\t * 获取分类字典最大的code\n\t * @param page\n\t * @return\n\t */\n\t@InterceptorIgnore(tenantLine = \"true\")\n\t@Select(\"SELECT code FROM sys_category WHERE code IS NOT NULL AND pid=#{categoryPid} ORDER BY code DESC\")\n\tList<SysCategory> getMaxCategoryCodeByPage(@Param(\"page\") Page<SysCategory> page,@Param(\"categoryPid\") String categoryPid);\n\n\t@InterceptorIgnore(tenantLine = \"true\")\n\t@Select(\"SELECT code FROM sys_category WHERE ID = #{id}\")\n\tSysCategory selectSysCategoryById(@Param(\"id\") String id);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysCheckRuleMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.jeecg.modules.system.entity.SysCheckRule;\n\n/**\n * @Description: 编码校验规则\n * @Author: jeecg-boot\n * @Date: 2020-02-04\n * @Version: V1.0\n */\npublic interface SysCheckRuleMapper extends BaseMapper<SysCheckRule> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysCommentMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.system.entity.SysComment;\nimport org.jeecg.modules.system.vo.SysCommentFileVo;\nimport org.jeecg.modules.system.vo.SysCommentVO;\nimport org.jeecg.modules.system.vo.UserAvatar;\n\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * @Description: 系统评论回复表\n * @Author: jeecg-boot\n * @Date: 2022-07-19\n * @Version: V1.0\n */\npublic interface SysCommentMapper extends BaseMapper<SysComment> {\n\n    List<SysCommentVO> queryCommentList(@Param(\"tableName\") String tableName, @Param(\"formDataId\") String formDataId);\n\n    /**\n     * 根据表名和数据id查询表单文件\n     *\n     * @param tableName\n     * @param formDataId\n     * @return\n     */\n    List<SysCommentFileVo> queryFormFileList(@Param(\"tableName\") String tableName, @Param(\"formDataId\") String formDataId);\n\n    /**\n     * 根据用户名获取用户信息\n     * @param idSet\n     * @return\n     */\n    List<UserAvatar> queryUserAvatarList(@Param(\"idSet\") Set<String> idSet);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysDataLogMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.system.entity.SysDataLog;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: 系统数据日志Mapper接口\n * @author: jeecg-boot\n */\npublic interface SysDataLogMapper extends BaseMapper<SysDataLog>{\n\t/**\n\t * 通过表名及数据Id获取最大版本\n\t * @param tableName\n\t * @param dataId\n\t * @return\n\t */\n\tpublic String queryMaxDataVer(@Param(\"tableName\") String tableName,@Param(\"dataId\") String dataId);\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysDataSourceMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.jeecg.modules.system.entity.SysDataSource;\n\n/**\n * @Description: 多数据源管理\n * @Author: jeecg-boot\n * @Date: 2019-12-25\n * @Version: V1.0\n */\npublic interface SysDataSourceMapper extends BaseMapper<SysDataSource> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysDepartMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport com.baomidou.mybatisplus.annotation.InterceptorIgnore;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport org.apache.ibatis.annotations.Select;\nimport org.apache.ibatis.annotations.Update;\nimport org.jeecg.modules.system.entity.SysDepart;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.model.SysUserSysDepPostModel;\nimport org.jeecg.modules.system.vo.SysDepartExportVo;\nimport org.jeecg.modules.system.vo.SysDepartPositionVo;\nimport org.jeecg.modules.system.vo.SysUserDepVo;\nimport org.jeecg.modules.system.vo.lowapp.ExportDepartVo;\nimport org.springframework.data.repository.query.Param;\n\nimport java.util.List;\n\n/**\n * <p>\n * 部门 Mapper 接口\n * <p>\n * \n * @Author: Steve\n * @Since：   2019-01-22\n */\npublic interface SysDepartMapper extends BaseMapper<SysDepart> {\n\t\n\t/**\n\t * 根据用户ID查询部门集合\n     * @param userId 用户id\n     * @return List<SysDepart>\n\t */\n\tpublic List<SysDepart> queryUserDeparts(@Param(\"userId\") String userId);\n\n\t/**\n\t * 根据用户名查询部门\n\t *\n\t * @param username\n\t * @return\n\t */\n\tpublic List<SysDepart> queryDepartsByUsername(@Param(\"username\") String username);\n\t\n\t/**\n\t * 根据用户名查询部门\n\t *\n\t * @param userId\n\t * @return\n\t */\n\tpublic List<String> queryDepartsByUserId(@Param(\"userId\") String userId);\n\n    /**\n     * 通过部门编码获取部门id\n     * @param orgCode 部门编码\n     * @return String\n     */\n\t@Select(\"select id from sys_depart where org_code=#{orgCode}\")\n\tpublic String queryDepartIdByOrgCode(@Param(\"orgCode\") String orgCode);\n\t\n    /**\n     * 通过部门id，查询部门下的用户的账号\n     * @param departIds 部门ID集合\n     * @return String\n     */\n\tpublic List<String> queryUserAccountByDepartIds(@Param(\"departIds\") List<String> departIds);\n\n    /**\n     * 通过部门id 查询部门id,父id\n     * @param departId 部门id\n     * @return\n     */\n\t@Select(\"select id,parent_id from sys_depart where id=#{departId}\")\n\tpublic SysDepart getParentDepartId(@Param(\"departId\") String departId);\n\n\t/**\n\t *  根据部门Id查询,当前和下级所有部门IDS\n\t * @param departId\n\t * @return\n\t */\n\tList<String> getSubDepIdsByDepId(@Param(\"departId\") String departId);\n\n\t/**\n\t * 根据部门编码获取部门下所有IDS\n\t * @param orgCodes\n\t * @return\n\t */\n\tList<String> getSubDepIdsByOrgCodes(@org.apache.ibatis.annotations.Param(\"orgCodes\") String[] orgCodes);\n\n    /**\n     * 根据parent_id查询下级部门\n     * @param parentId 父id\n     * @return List<SysDepart>\n     */\n    List<SysDepart> queryTreeListByPid(@Param(\"parentId\") String parentId);\n\t/**\n\t * 根据id下级部门数量\n\t * @param parentId\n\t * @return\n\t */\n\t@Select(\"SELECT count(*) FROM sys_depart where del_flag ='0' AND parent_id = #{parentId,jdbcType=VARCHAR}\")\n    Integer queryCountByPid(@Param(\"parentId\")String parentId);\n\t/**\n\t * 根据OrgCod查询所属公司信息\n\t * @param orgCode\n\t * @return\n\t */\n\tSysDepart queryCompByOrgCode(@Param(\"orgCode\")String orgCode);\n\t/**\n\t * 根据id下级部门\n\t * @param parentId\n\t * @return\n\t */\n\t@Select(\"SELECT * FROM sys_depart where del_flag ='0' AND parent_id = #{parentId,jdbcType=VARCHAR}\")\n\tList<SysDepart> queryDeptByPid(@Param(\"parentId\")String parentId);\n\n\t/**\n\t * 通过父级id和租户id查询部门\n\t * @param parentId\n\t * @param tenantId\n\t * @return\n\t */\n\t@InterceptorIgnore(tenantLine = \"true\")\n\tList<SysDepart> queryBookDepTreeSync(@Param(\"parentId\") String parentId, @Param(\"tenantId\") Integer tenantId, @Param(\"departName\") String departName);\n\n\t@InterceptorIgnore(tenantLine = \"true\")\n\t@Select(\"SELECT * FROM sys_depart where id = #{id,jdbcType=VARCHAR}\")\n\tSysDepart getDepartById(@Param(\"id\") String id);\n\n\t@InterceptorIgnore(tenantLine = \"true\")\n\tList<SysDepart> getMaxCodeDepart(@Param(\"page\") Page<SysDepart> page, @Param(\"parentId\") String parentId);\n\n\t/**\n\t * 修改部门状态字段： 是否子节点\n\t * @param id 部门id\n\t * @param leaf 叶子节点\n\t * @return int\n\t */\n\t@Update(\"UPDATE sys_depart SET iz_leaf=#{leaf} WHERE id = #{id}\")\n\tint setMainLeaf(@Param(\"id\") String id, @Param(\"leaf\") Integer leaf);\n\n\t/**\n\t * 获取租户id和部门父id获取的部门数据\n\t * @param tenantId\n\t * @param parentId\n\t * @return\n\t */\n    List<ExportDepartVo> getDepartList(@Param(\"parentId\") String parentId, @Param(\"tenantId\") Integer tenantId);\n\n\t/**\n\t * 根据部门名称和租户id获取部门数据\n\t * @param departName\n\t * @param tenantId\n\t * @return\n\t */\n\tList<SysDepart> getDepartByName(@Param(\"departName\")String departName, @Param(\"tenantId\")Integer tenantId,@Param(\"parentId\") String parentId);\n\n\t/**\n\t * 根据部门id获取用户id和部门名称\n\t * @param userList\n\t * @return\n\t */\n\tList<SysUserDepVo> getUserDepartByTenantUserId(@Param(\"userList\") List<SysUser> userList, @Param(\"tenantId\") Integer tenantId);\n\n\t/**\n\t * 根据部门名称和租户id获取分页部门数据\n\t * @param page\n\t * @param departName\n\t * @param tenantId\n\t * @param parentId\n\t * @return\n\t */\n\tList<SysDepart> getDepartPageByName(@Param(\"page\") Page<SysDepart> page, @Param(\"departName\") String departName, @Param(\"tenantId\") Integer tenantId, @Param(\"parentId\") String parentId);\n\n\t/**\n\t * 获取租户id和部门父id获取的部门数据\n\t * @param tenantId\n\t * @param parentId\n\t * @return\n\t */\n    List<SysDepartExportVo> getSysDepartList(@Param(\"parentId\") String parentId,@Param(\"tenantId\") Integer tenantId, List<String> idList);\n\n    /**\n     * 根据多个部门id获取部门数据\n     * \n     * @param departIds\n     * @return\n     */\n    List<SysUserDepVo> getDepartByIds(List<String> departIds);\n\n    /**\n     * 根据用户id获取部门数据\n     *\n     * @param userList\n     * @return\n     */\n    @InterceptorIgnore(tenantLine = \"true\")\n    List<SysUserDepVo> getUserDepartByUserId(@Param(\"userList\")List<SysUser> userList);\n\n    /**\n     * 根据父级id/职级/部门id获取部门岗位信息\n     * \n     * @param parentId\n     * @param postLevel\n     * @param departId\n     */\n    List<SysDepart> getDepartPositionByParentId(@Param(\"parentId\") String parentId, @Param(\"postLevel\") Integer postLevel, @Param(\"departId\") String departId);\n\n    /**\n     * 根据父级id获取部门中的数据\n     * @param parentId\n     * @return\n     */\n    @Select(\"select id, depart_name, parent_id, iz_leaf, org_category, org_code, depart_order from sys_depart where parent_id = #{parentId} order by depart_order,create_time desc\")\n    List<SysDepart> getDepartByParentId(@Param(\"parentId\") String parentId);\n\n    /**\n     * 根据部门id查询部门信息\n     \n     * @param departId\n     * @return 部门岗位信息\n     */\n    SysDepartPositionVo getDepartPostByDepartId(@Param(\"departId\") String departId);\n\n    /**\n     * 根据父级部门id查询部门信息\n     \n     * @param orgCode\n     * @return 部门岗位信息\n     */\n    List<SysDepartPositionVo> getDepartPostByOrgCode(@Param(\"orgCode\") String orgCode);\n\n    /**\n     * 根据部门id获取部门code\n     * @param idList\n     * @return\n     */\n    List<String> getDepCodeByDepIds(@Param(\"idList\") List<String> idList);\n\n    /**\n     * 根据父级部门id和职务名称查找部门id\n     * \n     * @param parentId\n     * @param postName\n     * @return\n     */\n    String getDepIdByDepIdAndPostName(@Param(\"parentId\") String parentId, @Param(\"postName\") String postName);\n\n    /**\n     * 根据部门id 获取职级名称\n     * \n     * @param depId\n     * @return\n     */\n    String getPostNameByPostId(@Param(\"depId\") String depId);\n\n    /**\n     * 根据部门code获取部门数据\n     * \n     * @param orgCode\n     * @return\n     */\n    @Select(\"select depart_name, id, iz_leaf, org_category, parent_id, org_code from sys_depart where org_code = #{orgCode} order by depart_order,create_time desc\")\n    SysDepart queryDepartByOrgCode(@Param(\"orgCode\") String orgCode);\n\n    /**\n     * 根据部门父id获取部门岗位数据\n     * \n     * @param parentIds\n     * @return\n     */\n    List<SysDepart> getDepartPositionByParentIds(@Param(\"parentIds\") List<String> parentIds);\n\n    /**\n     * 根据用户id集合获取用户的兼职岗位信息\n     * \n     * @param userIdList\n     * @return\n     */\n    List<SysUserSysDepPostModel> getDepartOtherPostByUserIds(@Param(\"userIdList\") List<String> userIdList);\n\n    /**\n     * 获取没有父级id的部门数据\n     * \n     * @return\n     */\n    @Select(\"select id, org_code, depart_order from sys_depart where parent_id is null or parent_id = '' order by depart_order,create_time desc\")\n    List<SysDepart> getDepartNoParent();\n\n    /**\n     * 根据父级id统计子节点数量\n     * \n     * @param parentId\n     * @return\n     */\n    @Select(\"select count(1) from sys_depart where parent_id = #{parentId}\")\n    long countByParentId(@Param(\"parentId\") String parentId);\n\n\t/**\n\t * 根据用户名和分类查询\n\t * @param username\n\t * @param category\n\t * @return\n\t */\n\tList<SysDepart> queryDeptByUserAndCategory(@Param(\"username\")String username, @Param(\"category\")String category);\n\n    /**\n     * 获取负责部门\n     * \n     * @param page\n     * @param departId\n     * @return\n     */\n    List<SysUser> getDepartmentHead(@Param(\"page\") Page<SysUser> page, @Param(\"departId\") String departId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysDepartPermissionMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.system.entity.SysDepartPermission;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: 部门权限表\n * @Author: jeecg-boot\n * @Date:   2020-02-11\n * @Version: V1.0\n */\npublic interface SysDepartPermissionMapper extends BaseMapper<SysDepartPermission> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysDepartRoleMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.system.entity.SysDepartRole;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: 部门角色\n * @Author: jeecg-boot\n * @Date:   2020-02-12\n * @Version: V1.0\n */\npublic interface SysDepartRoleMapper extends BaseMapper<SysDepartRole> {\n    /**\n     * 根据用户id，部门id查询可授权所有部门角色\n     * @param orgCode\n     * @param userId\n     * @return\n     */\n    public List<SysDepartRole> queryDeptRoleByDeptAndUser(@Param(\"orgCode\") String orgCode, @Param(\"userId\") String userId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysDepartRolePermissionMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.system.entity.SysDepartRolePermission;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: 部门角色权限\n * @Author: jeecg-boot\n * @Date:   2020-02-12\n * @Version: V1.0\n */\npublic interface SysDepartRolePermissionMapper extends BaseMapper<SysDepartRolePermission> {\n\n    void deleteByRoleIds(@Param(\"ids\")List<String> ids);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysDepartRoleUserMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.system.entity.SysDepartRoleUser;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: 部门角色人员信息\n * @Author: jeecg-boot\n * @Date:   2020-02-13\n * @Version: V1.0\n */\npublic interface SysDepartRoleUserMapper extends BaseMapper<SysDepartRoleUser> {\n\n    void deleteByRoleIds(@Param(\"ids\")List<String> ids);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysDictItemMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport org.apache.ibatis.annotations.Select;\nimport org.jeecg.modules.system.entity.SysDictItem;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\nimport java.util.List;\n\n/**\n * <p>\n * Mapper 接口\n * </p>\n *\n * @Author zhangweijian\n * @since 2018-12-28\n */\npublic interface SysDictItemMapper extends BaseMapper<SysDictItem> {\n\n    /**\n     * 通过字典id查询字典项\n     * @param mainId 字典id\n     * @return\n     */\n    @Select(\"SELECT * FROM sys_dict_item WHERE DICT_ID = #{mainId} order by sort_order asc, item_value asc\")\n    public List<SysDictItem> selectItemsByMainId(String mainId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysDictMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport com.baomidou.mybatisplus.annotation.InterceptorIgnore;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport org.apache.ibatis.annotations.Param;\nimport org.apache.ibatis.annotations.Select;\nimport org.apache.ibatis.annotations.Update;\nimport org.jeecg.common.system.vo.DictModel;\nimport org.jeecg.common.system.vo.DictModelMany;\nimport org.jeecg.common.system.vo.DictQuery;\nimport org.jeecg.modules.system.entity.SysDict;\nimport org.jeecg.modules.system.model.DuplicateCheckVo;\nimport org.jeecg.modules.system.model.TreeSelectModel;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * <p>\n * 字典表 Mapper 接口\n * </p>\n *\n * @Author zhangweijian\n * @since 2018-12-28\n */\npublic interface SysDictMapper extends BaseMapper<SysDict> {\n\t\n\t/**\n\t * 重复检查SQL\n     * @param duplicateCheckVo\n\t * @return\n\t */\n\t@Deprecated\n\tpublic Long duplicateCheckCountSql(DuplicateCheckVo duplicateCheckVo);\n\n    /**\n     * 重复校验 sql语句\n     * @param duplicateCheckVo\n     * @return\n     */\n\t@Deprecated\n\tpublic Long duplicateCheckCountSqlNoDataId(DuplicateCheckVo duplicateCheckVo);\n\n    /**\n     * 通过字典code获取字典数据\n     * @param code 字典code\n     * @return  List<DictModel>\n     */\n\tpublic List<DictModel> queryDictItemsByCode(@Param(\"code\") String code);\n\n\t/**\n\t * 查询有效的数据字典项\n\t * @param code\n\t * @return\n\t */\n\tList<DictModel> queryEnableDictItemsByCode(@Param(\"code\") String code);\n\n\n\t/**\n\t * 通过多个字典code获取字典数据\n\t *\n\t * @param dictCodeList\n\t * @return\n\t */\n\tpublic List<DictModelMany> queryDictItemsByCodeList(@Param(\"dictCodeList\") List<String> dictCodeList);\n\n    /**\n     * 通过字典code获取字典数据\n     * @param code\n     * @param key\n     * @return\n     */\n\tpublic String queryDictTextByKey(@Param(\"code\") String code,@Param(\"key\") String key);\n\n\t/**\n\t * 可通过多个字典code查询翻译文本\n\t * @param dictCodeList 多个字典code\n\t * @param keys 数据列表\n\t * @return\n\t */\n\tList<DictModelMany> queryManyDictByKeys(@Param(\"dictCodeList\") List<String> dictCodeList, @Param(\"keys\") List<String> keys);\n\n\t/**\n\t * 查询系统所有字典项\n\t * @return\n\t */\n\tpublic List<DictModelMany> queryAllDictItems(List<Integer> tenantIdList);\n\t\n\t/**\n\t * 查询所有部门 作为字典信息 id -->value,departName -->text\n\t * @return\n\t */\n\tpublic List<DictModel> queryAllDepartBackDictModel();\n\t\n\t/**\n\t * 查询所有用户  作为字典信息 username -->value,realname -->text\n\t * @return\n\t */\n\tpublic List<DictModel> queryAllUserBackDictModel();\n\t\n\t/**\n\t  * 根据表名、显示字段名、存储字段名 查询树\n\t * @param table\n\t * @param text\n\t * @param code\n\t * @param pid\n\t * @param hasChildField\n     * @param query\n     * @param pidField\n\t * @return\n\t */\n\t@Deprecated\n\tList<TreeSelectModel> queryTreeList(@Param(\"query\") Map<String, String> query, @Param(\"table\") String table, @Param(\"text\") String text, @Param(\"code\") String code,\n\t\t\t\t\t\t\t\t\t\t@Param(\"pidField\") String pidField, @Param(\"pid\") String pid, @Param(\"hasChildField\") String hasChildField,\n\t\t\t\t\t\t\t\t\t\t@Param(\"converIsLeafVal\") int converIsLeafVal);\n\n\t/**\n\t * 删除\n\t * @param id\n\t */\n\t@Select(\"delete from sys_dict where id = #{id}\")\n\tpublic void deleteOneById(@Param(\"id\") String id);\n\n\t/**\n\t * 查询被逻辑删除的数据\n\t * @return\n\t */\n\t@Select(\"select * from sys_dict where del_flag = 1\")\n\tpublic List<SysDict> queryDeleteList();\n\n\t/**\n\t * 修改状态值\n\t * @param delFlag\n\t * @param id\n\t */\n\t@Update(\"update sys_dict set del_flag = #{flag,jdbcType=INTEGER} where id = #{id,jdbcType=VARCHAR}\")\n\tpublic void updateDictDelFlag(@Param(\"flag\") int delFlag, @Param(\"id\") String id);\n\n\n\t/**\n\t * 分页查询字典表数据\n\t * @param page\n\t * @param query\n\t * @return\n\t */\n\t@Deprecated\n\tpublic Page<DictModel> queryDictTablePageList(Page page, @Param(\"query\") DictQuery query);\n\n\n\t/**\n\t * 查询 字典表数据 支持查询条件 分页\n\t * @param page\n\t * @param table\n\t * @param text\n\t * @param code\n\t * @param filterSql\n\t * @return\n\t */\n\t@Deprecated\n\tIPage<DictModel> queryPageTableDictWithFilter(Page<DictModel> page, @Param(\"table\") String table, @Param(\"text\") String text, @Param(\"code\") String code, @Param(\"filterSql\") String filterSql);\n\n\t/**\n\t * 查询 字典表数据 支持查询条件 查询所有\n\t * @param table\n\t * @param text\n\t * @param code\n\t * @param filterSql\n\t * @return\n\t */\n\t@Deprecated\n\tList<DictModel> queryTableDictWithFilter(@Param(\"table\") String table, @Param(\"text\") String text, @Param(\"code\") String code, @Param(\"filterSql\") String filterSql);\n\n\t/**\n\t * 查询字典表的数据\n\t * @param table 表名\n\t * @param text   显示字段名\n\t * @param code   存储字段名\n\t * @param filterSql 条件sql\n\t * @param codeValues 存储字段值 作为查询条件in\n\t * @return\n\t */\n\t@Deprecated\n\tList<DictModel> queryTableDictByKeysAndFilterSql(@Param(\"table\") String table, @Param(\"text\") String text, @Param(\"code\") String code, @Param(\"filterSql\") String filterSql,  \n\t\t\t\t\t\t\t\t\t\t\t\t\t @Param(\"codeValues\") List<String> codeValues);\n\n\t/**\n\t * 根据应用id获取字典列表和详情\n\t * @param lowAppId\n\t * @param tenantId\n\t * @return\n\t */\n\t@InterceptorIgnore(tenantLine = \"true\")\n    List<SysDict> getDictListByLowAppId(@Param(\"lowAppId\") String lowAppId, @Param(\"tenantId\") Integer tenantId);\n\n\t/**\n\t * 查询被逻辑删除的数据（根据租户id）\n\t * @return\n\t */\n\t@Select(\"select * from sys_dict where del_flag = 1 and tenant_id = #{tenantId}\")\n\tList<SysDict> queryDeleteListBtTenantId(@Param(\"tenantId\") Integer tenantId);\n\n\t/**\n\t * 还原被逻辑删除的数据（根据id）\n\t * @param ids\n\t * @return\n\t */\n\tint revertLogicDeleted(@Param(\"ids\") List<String> ids);\n\n\t/**\n\t *  彻底删除的数据（根据ids）\n\t * @param ids\n\t * @return\n\t */\n    int removeLogicDeleted(@Param(\"ids\")List<String> ids);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysFillRuleMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.jeecg.modules.system.entity.SysFillRule;\n\n/**\n * @Description: 填值规则\n * @Author: jeecg-boot\n * @Date: 2019-11-07\n * @Version: V1.0\n */\npublic interface SysFillRuleMapper extends BaseMapper<SysFillRule> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysFormFileMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.jeecg.modules.system.entity.SysFormFile;\n\n/**\n * @Description: 表单评论文件\n * @Author: jeecg-boot\n * @Date: 2022-07-21\n * @Version: V1.0\n */\npublic interface SysFormFileMapper extends BaseMapper<SysFormFile> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysGatewayRouteMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.apache.ibatis.annotations.Select;\nimport org.jeecg.modules.system.entity.SysGatewayRoute;\n\nimport java.util.List;\n\n/**\n * @Description: gateway路由管理\n * @Author: jeecg-boot\n * @Date:   2020-05-26\n * @Version: V1.0\n */\npublic interface SysGatewayRouteMapper extends BaseMapper<SysGatewayRoute> {\n    /**\n     * 还原逻辑删除\n     * @param ids\n     */\n    int revertLogicDeleted(@Param(\"ids\") List<String> ids);\n\n    /**\n     *彻底删除\n     * @param ids\n     */\n    int deleteLogicDeleted(@Param(\"ids\") List<String> ids);\n\n    /**\n     * 查询删除的列表\n     * @return\n     */\n    @Select(\"select * from sys_gateway_route where del_flag = 1\")\n    List<SysGatewayRoute> queryDeleteList();\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysLogMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport java.util.Date;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.system.entity.SysLog;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * <p>\n * 系统日志表 Mapper 接口\n * </p>\n *\n * @Author zhangweijian\n * @since 2018-12-26\n */\npublic interface SysLogMapper extends BaseMapper<SysLog> {\n\n\t/**\n\t * 清空所有日志记录\n\t */\n\tpublic void removeAll();\n\n\t/**\n\t * 获取系统总访问次数\n\t *\n\t * @return Long\n\t */\n\tLong findTotalVisitCount();\n\n\t/**\n\t * 获取系统今日访问次数\n\t * @param dayStart 开始时间\n     * @param dayEnd 结束时间\n\t * @return Long\n\t */\n\tLong findTodayVisitCount(@Param(\"dayStart\") Date dayStart, @Param(\"dayEnd\") Date dayEnd);\n\n\t/**\n\t * 获取系统今日访问 IP数\n\t * @param dayStart 开始时间\n     * @param dayEnd 结束时间\n\t * @return Long\n\t */\n\tLong findTodayIp(@Param(\"dayStart\") Date dayStart, @Param(\"dayEnd\") Date dayEnd);\n\t\n\t/**\n\t *   首页：根据时间统计访问数量/ip数量\n\t * @param dayStart\n\t * @param dayEnd\n     * @param dbType\n\t * @return\n\t */\n\tList<Map<String,Object>> findVisitCount(@Param(\"dayStart\") Date dayStart, @Param(\"dayEnd\") Date dayEnd, @Param(\"dbType\") String dbType);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysPackPermissionMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.system.entity.SysPackPermission;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: 产品包菜单关系表\n * @Author: jeecg-boot\n * @Date:   2022-12-31\n * @Version: V1.0\n */\npublic interface SysPackPermissionMapper extends BaseMapper<SysPackPermission> {\n\n    /**\n     * 通过产品包id获取菜单id\n     * @param packId\n     * @return\n     */\n    List<String> getPermissionsByPackId(@Param(\"packId\") String packId);\n\n    /**\n     * 删除产品包对应的菜单权限\n     *\n     * @param tenantIdList\n     */\n    void deletePackPermByTenantIds(@Param(\"tenantIdList\") List<Integer> tenantIdList);\n    \n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysPermissionDataRuleMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.system.entity.SysPermissionDataRule;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * <p>\n * 权限规则 Mapper 接口\n * </p>\n *\n * @Author huangzhilin\n * @since 2019-04-01\n */\npublic interface SysPermissionDataRuleMapper extends BaseMapper<SysPermissionDataRule> {\n\t\n\t/**\n\t  * 根据用户名和权限id查询\n\t * @param username\n\t * @param permissionId\n\t * @return\n\t */\n\tpublic List<String> queryDataRuleIds(@Param(\"username\") String username,@Param(\"permissionId\") String permissionId);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysPermissionMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport java.util.List;\n\nimport com.baomidou.mybatisplus.annotation.InterceptorIgnore;\nimport org.apache.ibatis.annotations.Param;\nimport org.apache.ibatis.annotations.Select;\nimport org.apache.ibatis.annotations.Update;\nimport org.jeecg.modules.system.entity.SysPermission;\nimport org.jeecg.modules.system.model.TreeModel;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * <p>\n * 菜单权限表 Mapper 接口\n * </p>\n *\n * @Author scott\n * @since 2018-12-21\n */\npublic interface SysPermissionMapper extends BaseMapper<SysPermission> {\n\t/**\n\t   * 通过父菜单ID查询子菜单\n\t * @param parentId\n\t * @return\n\t */\n\tpublic List<TreeModel> queryListByParentId(@Param(\"parentId\") String parentId);\n\t\n\t/**\n\t * 根据用户查询用户权限\n     * @param userId 用户ID\n     * @return List<SysPermission>\n\t */\n\tpublic List<SysPermission> queryByUser(@Param(\"userId\") String userId);\n\t\n\t/**\n\t * 修改菜单状态字段： 是否子节点\n     * @param id 菜单id\n     * @param leaf 叶子节点\n     * @return int\n\t */\n\t@Update(\"update sys_permission set is_leaf=#{leaf} where id = #{id}\")\n\tpublic int setMenuLeaf(@Param(\"id\") String id,@Param(\"leaf\") int leaf);\n\n\t/**\n\t * 切换vue3菜单\n\t */\n\t@Update(\"alter table sys_permission rename to sys_permission_v2\")\n\tpublic void backupVue2Menu();\n\t@Update(\"alter table sys_permission_v3 rename to sys_permission\")\n\tpublic void changeVue3Menu();\n\t\n\t/**\n\t * 获取模糊匹配规则的数据权限URL\n     * @return List<String>\n\t */\n\t@Select(\"SELECT url FROM sys_permission WHERE del_flag = 0 and menu_type = 2 and url like '%*%'\")\n    public List<String> queryPermissionUrlWithStar();\n\n\n\t/**\n\t * 根据用户账号查询菜单权限\n\t * @param sysPermission\n\t * @param username\n\t * @return\n\t */\n\tpublic int queryCountByUsername(@Param(\"username\") String username, @Param(\"permission\") SysPermission sysPermission);\n\n\n\t/**\n\t * 查询部门权限数据\n\t * @param departId\n\t * @return\n\t */\n\tList<SysPermission> queryDepartPermissionList(@Param(\"departId\") String departId);\n\n\t/**\n\t * 根据用户名称和test角色id查询权限\n\t * @return\n\t */\n\t@InterceptorIgnore(tenantLine = \"true\")\n    List<SysPermission> queryPermissionByTestRoleId();\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysPositionMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport org.apache.ibatis.annotations.Select;\nimport org.jeecg.modules.system.entity.SysPosition;\nimport org.springframework.data.repository.query.Param;\n\nimport java.util.List;\n\n/**\n * @Description: 职务表\n * @Author: jeecg-boot\n * @Date: 2019-09-19\n * @Version: V1.0\n */\npublic interface SysPositionMapper extends BaseMapper<SysPosition> {\n\n    /**\n     * 通过用户id获取职位名称\n     * @param userId\n     * @return\n     */\n    List<SysPosition> getPositionList(@Param(\"userId\") String userId);\n\n    /**\n     * 通过职位id获取职位名称\n     * @param postList\n     * @return\n     */\n    List<SysPosition> getPositionName(@Param(\"postList\") List<String> postList);\n\n    /**\n     * 根据职位名称获取职位id\n     * @param name\n     * @return\n     */\n    @Select(\"SELECT id FROM sys_position WHERE name = #{name} AND tenant_id = #{tenantId} ORDER BY create_time DESC\")\n    List<String> getPositionIdByName(@Param(\"name\") String name, @Param(\"tenantId\") Integer tenantId, @Param(\"page\") Page<SysPosition> page);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysRoleIndexMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.system.entity.SysRoleIndex;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: 角色首页配置\n * @Author: jeecg-boot\n * @Date:   2022-03-25\n * @Version: V1.0\n */\npublic interface SysRoleIndexMapper extends BaseMapper<SysRoleIndex> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysRoleMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport com.baomidou.mybatisplus.annotation.InterceptorIgnore;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport org.apache.ibatis.annotations.Delete;\nimport org.apache.ibatis.annotations.Param;\nimport org.apache.ibatis.annotations.Select;\nimport org.jeecg.modules.system.entity.SysRole;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.vo.SysUserPositionVo;\n\nimport java.util.List;\n\n/**\n * <p>\n * 角色表 Mapper 接口\n * </p>\n *\n * @Author scott\n * @since 2018-12-19\n */\npublic interface SysRoleMapper extends BaseMapper<SysRole> {\n    /**\n     * 查询全部的角色（不做租户隔离）\n     * @param page\n     * @param role\n     * @return\n     */\n    @InterceptorIgnore(tenantLine = \"true\")\n    List<SysRole> listAllSysRole(@Param(\"page\") Page<SysRole> page, @Param(\"role\") SysRole role);\n\n    /**\n     * 查询角色是否存在不做租户隔离\n     *\n     * @param roleCode\n     * @return\n     */\n    @InterceptorIgnore(tenantLine = \"true\")\n    SysRole getRoleNoTenant(@Param(\"roleCode\") String roleCode);\n\n    /**\n     * 根据用户id查询用户拥有的角色Code\n     *\n     * @param userId\n     * @param tenantId\n     * @return\n     */\n    List<SysRole> getRoleCodeListByUserId(@Param(\"userId\") String userId, @Param(\"tenantId\") Integer tenantId);\n\n    /**\n     * 删除角色与用户关系\n     * @Author scott\n     * @Date 2019/12/13 16:12\n     * @param roleId\n     */\n    @Delete(\"delete from sys_user_role where role_id = #{roleId}\")\n    void deleteRoleUserRelation(@Param(\"roleId\") String roleId);\n\n\n    /**\n     * 删除角色与权限关系\n     * @Author scott\n     * @param roleId\n     * @Date 2019/12/13 16:12\n     */\n    @Delete(\"delete from sys_role_permission where role_id = #{roleId}\")\n    void deleteRolePermissionRelation(@Param(\"roleId\") String roleId);\n\n    /**\n     * 根据角色id和当前租户判断当前角色是否存在这个租户中\n     * @param id\n     * @return\n     */\n    @Select(\"select count(*) from sys_role where id=#{id} and tenant_id=#{tenantId}\")\n    Long getRoleCountByTenantId(@Param(\"id\") String id, @Param(\"tenantId\") Integer tenantId);\n\n    /**\n     * 根据用户id获取角色信息\n     * \n     * @param userList\n     * @return\n     */\n    List<SysUserPositionVo> getUserRoleByUserId(@Param(\"userList\") List<SysUser> userList);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysRolePermissionMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport org.jeecg.modules.system.entity.SysRolePermission;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * <p>\n * 角色权限表 Mapper 接口\n * </p>\n *\n * @Author scott\n * @since 2018-12-21\n */\npublic interface SysRolePermissionMapper extends BaseMapper<SysRolePermission> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysTableWhiteListMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.jeecg.modules.system.entity.SysTableWhiteList;\n\n/**\n * @Description: 系统表白名单\n * @Author: jeecg-boot\n * @Date: 2023-09-12\n * @Version: V1.0\n */\npublic interface SysTableWhiteListMapper extends BaseMapper<SysTableWhiteList> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysTenantMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport com.baomidou.mybatisplus.annotation.InterceptorIgnore;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport org.apache.ibatis.annotations.Param;\nimport org.apache.ibatis.annotations.Select;\nimport org.jeecg.modules.system.entity.SysTenant;\nimport org.jeecg.modules.system.vo.tenant.TenantPackUser;\nimport org.jeecg.modules.system.vo.tenant.TenantPackUserCount;\nimport org.jeecg.modules.system.vo.tenant.UserDepart;\nimport org.jeecg.modules.system.vo.tenant.UserPosition;\n\nimport java.util.List;\n\n/**\n * @Description: 租户mapper接口\n * @author: jeecg-boot\n */\npublic interface SysTenantMapper extends BaseMapper<SysTenant> {\n\n    /**\n     * 获取最大值id\n     */\n    @Select(\"select MAX(id) id FROM sys_tenant\")\n    Integer getMaxTenantId();\n    \n    /**\n     * 获取租户回收站的数据假删除\n     * @param page\n     * @param sysTenant\n     * @return\n     */\n    List<SysTenant> getRecycleBinPageList(@Param(\"page\") Page<SysTenant> page, @Param(\"sysTenant\") SysTenant sysTenant);\n    \n    /**\n     * 彻底删除租户\n     * @param tenantId\n     */\n    Integer deleteByTenantId(@Param(\"tenantIds\") List<Integer> tenantId);\n\n    /**\n     * 租户还原\n     * @param list\n     * @return\n     */\n    Integer revertTenantLogic(@Param(\"tenantIds\")List<Integer> list);\n\n    /**\n     * 用于统计 租户产品包的人员数量\n     * @param tenantId\n     * @return\n     */\n    List<TenantPackUserCount> queryTenantPackUserCount(@Param(\"tenantId\") Integer tenantId);\n\n    /**\n     * 查询人员是不是租户产品包的 超级管理员\n     * @param tenantId\n     * @param userId\n     * @return\n     */\n    Integer querySuperAdminCount(@Param(\"tenantId\") Integer tenantId, @Param(\"userId\") String userId);\n\n    /**\n     * 查询人员的产品包编码\n     * @param tenantId\n     * @param userId\n     * @return\n     */\n    List<String> queryUserPackCode(@Param(\"tenantId\") Integer tenantId, @Param(\"userId\") String userId);\n\n    /**\n     * 查询产品包关联的用户列表\n     * @param tenantId\n     * @param packId\n     * @param packUserStatus\n     * @return\n     */\n    List<TenantPackUser> queryPackUserList(@Param(\"tenantId\") Integer tenantId, @Param(\"packId\") String packId, @Param(\"packUserStatus\") Integer packUserStatus);\n\n\n    /**\n     * 根据用户ID 查询部门\n     * @param userIdList\n     * @return\n     */\n    List<UserDepart> queryUserDepartList(@Param(\"userIdList\") List<String> userIdList);\n\n    /**\n     * 根据用户ID 查询职位\n     * @param userIdList\n     * @return\n     */\n    List<UserPosition> queryUserPositionList(@Param(\"userIdList\") List<String> userIdList);\n\n    /**\n     * 查询产品包关联的用户列表\n     * @param page\n     * @param tenantId\n     * @param packId\n     * @param status\n     * @return\n     */\n    List<TenantPackUser> queryTenantPackUserList(@Param(\"page\") Page<TenantPackUser> page, @Param(\"tenantId\") String tenantId, @Param(\"packId\") String packId, @Param(\"status\") Integer status);\n\n\n    /**\n     * 根据租户ID 查询租户\n     * @param id\n     * @return\n     */\n    @Select(\"select * from sys_tenant where id = #{id}\")\n    SysTenant querySysTenant(@Param(\"id\") Integer id);\n\n    /**\n     * 查看是否已经申请过了超级管理员\n     * @param userId\n     * @param tenantId\n     * @return\n     */\n    Long getApplySuperAdminCount(@Param(\"userId\") String userId, @Param(\"tenantId\") Integer tenantId);\n\n    /**\n     * 租户是否存在\n     * @param tenantId\n     * @return\n     */\n    @Select(\"select count(1) from sys_tenant where id = #{tenantId} and del_flag = 0\")\n    Long tenantIzExist(@Param(\"tenantId\") Integer tenantId);\n\n    /**\n     * 根据用户id获取租户\n     * @param userId\n     * @return\n     */\n    List<SysTenant> getTenantListByUserId(@Param(\"userId\") String userId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysTenantPackMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport org.apache.ibatis.annotations.Select;\nimport org.jeecg.modules.system.entity.SysTenantPack;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: 租户产品包\n * @Author: jeecg-boot\n * @Date:   2022-12-31\n * @Version: V1.0\n */\npublic interface SysTenantPackMapper extends BaseMapper<SysTenantPack> {\n\n    /**\n     * 删除租户产品包\n     *\n     * @param tenantIdList\n     */\n    void deletePackByTenantIds(@Param(\"tenantIdList\") List<Integer> tenantIdList);\n\n    /**\n     * 根据租户id和产品包的code获取租户套餐id\n     *\n     * @param tenantId\n     */\n    @Select(\"select id from sys_tenant_pack where tenant_id = #{tenantId} and (pack_code not in('superAdmin','accountAdmin','appAdmin') or pack_code is null) and iz_sysn = '1'\")\n    List<String> getPackIdByPackCodeAndTenantId(@Param(\"tenantId\") Integer tenantId);\n\n    /**\n     * 是否为拥有管理用户权限【accountAdmin，superAdmin】\n     * @param tenantId\n     * @param userId\n     * @return\n     */\n    @Select(\"select count(1) from sys_tenant_pack_user where user_id = #{userId} and tenant_id = #{tenantId} and pack_id in(select id from sys_tenant_pack where tenant_id = #{tenantId} and pack_type = 'custom' and pack_code in('accountAdmin','superAdmin'))\")\n    long izHaveManageUserAuth(@Param(\"tenantId\") String tenantId,@Param(\"userId\") String userId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysTenantPackUserMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport com.baomidou.mybatisplus.annotation.InterceptorIgnore;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.apache.ibatis.annotations.Select;\nimport org.jeecg.modules.system.entity.SysTenantPack;\nimport org.jeecg.modules.system.entity.SysTenantPackUser;\n\nimport java.util.List;\n\n/**\n * @Description: 租户产品包用户关系\n * @Author: jeecg-boot\n * @Date:   2023-02-16\n * @Version: V1.0\n */\npublic interface SysTenantPackUserMapper extends BaseMapper<SysTenantPackUser> {\n\n\n    /**\n     * 查询租户下 特定角色的人员列表\n     * @param tenantId\n     * @param packCodeList\n     * @return\n     */\n    @InterceptorIgnore(tenantLine = \"true\")\n    List<String> queryTenantPackUserNameList(@Param(\"tenantId\") Integer tenantId, @Param(\"packCodeList\") List<String> packCodeList); \n\n    /**\n     * 判断当前用户在该租户下是否拥有管理员的权限\n     * @param userId\n     * @param tenantId\n     * @return\n     */\n    Long izHaveBuyAuth(@Param(\"userId\") String userId, @Param(\"tenantId\") Integer tenantId);\n\n    /**\n     * 根据租户id 删除租户产品包下的 用户\n     * @param tenantId\n     */\n    void deletePackUserByTenantId(@Param(\"tenantId\") Integer tenantId, @Param(\"userIds\") List<String> userIds);\n\n    /**\n     * 根据多个租户id 删除租户产品包下的 用户\n     * @param\n     */\n    void deletePackUserByTenantIds(@Param(\"tenantIds\") List<Integer> tenantIds);\n\n    /**\n     * 根据用户id和租户id获取当前租户用户下的产品包id\n     *\n     * @param tenantId\n     * @param userId\n     * @return\n     */\n    @Select(\"select pack_id from sys_tenant_pack_user where tenant_id = #{tenantId} and user_id = #{userId}\")\n    List<String> getPackIdByTenantIdAndUserId(@Param(\"tenantId\") Integer tenantId, @Param(\"userId\") String userId);\n    \n    /**\n     * 根据租户id获取用户的产品包列表\n     * \n     * @param tenantId\n     * @return\n     */\n    @Select(\"select id,pack_name,pack_code,pack_type from sys_tenant_pack where tenant_id = #{tenantId}\")\n    List<SysTenantPack> getPackListByTenantId(@Param(\"tenantId\") Integer tenantId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysThirdAccountMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.system.entity.SysThirdAccount;\nimport org.jeecg.modules.system.vo.thirdapp.JwUserDepartVo;\n\nimport java.util.List;\n\n/**\n * @Description: 第三方登录账号表\n * @Author: jeecg-boot\n * @Date: 2020-11-17\n * @Version: V1.0\n */\npublic interface SysThirdAccountMapper extends BaseMapper<SysThirdAccount> {\n\n    /**\n     * 通过 sysUsername 集合批量查询\n     *\n     * @param sysUsernameArr username集合\n     * @param thirdType       第三方类型\n     * @return\n     */\n    List<SysThirdAccount> selectThirdIdsByUsername(@Param(\"sysUsernameArr\") String[] sysUsernameArr, @Param(\"thirdType\") String thirdType, @Param(\"tenantId\") Integer tenantId);\n    \n    /**\n     * 查询被绑定的用户\n     * @param tenantId\n     * @param thirdType\n     * @return\n     */\n    List<JwUserDepartVo> getThirdUserBindByWechat(@Param(\"tenantId\") int tenantId, @Param(\"thirdType\") String thirdType);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysThirdAppConfigMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.jeecg.modules.system.entity.SysThirdAppConfig;\nimport org.springframework.data.repository.query.Param;\n\nimport java.util.List;\n\n/**\n * @Description: 第三方配置表\n * @Author: jeecg-boot\n * @Date:   2023-02-03\n * @Version: V1.0\n */\npublic interface SysThirdAppConfigMapper  extends BaseMapper<SysThirdAppConfig> {\n\n    /**\n     * 根据租户id获取钉钉/企业微信配置\n     * @param tenantId\n     * @return\n     */\n    List<SysThirdAppConfig> getThirdConfigListByThirdType(@Param(\"tenantId\") int tenantId);\n\n    /**\n     * 根据租户id和第三方类别获取第三方配置\n     * @param tenantId\n     * @param thirdType\n     * @return\n     */\n    SysThirdAppConfig getThirdConfigByThirdType(@Param(\"tenantId\") int tenantId, @Param(\"thirdType\") String thirdType);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserDepPostMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.apache.ibatis.annotations.Select;\nimport org.jeecg.modules.system.entity.SysUserDepPost;\n\nimport java.util.List;\n\n/**\n * @Description: 部门岗位用户关联表 Mapper\n * @author: wangshuai\n * @date: 2025/9/5 12:01\n */\npublic interface SysUserDepPostMapper extends BaseMapper<SysUserDepPost> {\n\n    /**\n     * 通过用户id查询部门岗位用户\n     *\n     * @param userId\n     * @return\n     */\n    @Select(\"select dep_id from sys_user_dep_post where user_id = #{userId}\")\n    List<String> getDepPostByUserId(@Param(\"userId\") String userId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserDepartMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport java.util.List;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport org.apache.ibatis.annotations.Param;\nimport org.apache.ibatis.annotations.Select;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.entity.SysUserDepart;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.jeecg.modules.system.model.SysUserSysDepPostModel;\n\n/**\n * @Description: 用户部门mapper接口\n * @author: jeecg-boot\n */\npublic interface SysUserDepartMapper extends BaseMapper<SysUserDepart>{\n\n    /**\n     * 通过用户id查询部门用户\n     * @param userId 用户id\n     * @return List<SysUserDepart>\n     */\n\tList<SysUserDepart> getUserDepartByUid(@Param(\"userId\") String userId);\n\n\t/**\n\t *  查询指定部门下的用户 并且支持用户真实姓名模糊查询\n\t * @param orgCode\n\t * @param realname\n\t * @return\n\t */\n\tList<SysUser> queryDepartUserList(@Param(\"orgCode\") String orgCode, @Param(\"realname\") String realname);\n\n\t/**\n\t * 根据部门查询部门用户\n\t * @param page\n\t * @param orgCode\n\t * @param username\n\t * @param realname\n\t * @return\n\t */\n\tIPage<SysUser> queryDepartUserPageList(Page<SysUser> page, @Param(\"orgCode\") String orgCode, @Param(\"username\") String username, @Param(\"realname\") String realname);\n\n    /**\n     * 获取用户信息\n     * @param page\n     * @param orgCode\n     * @param keyword\n     * @return\n     */\n    IPage<SysUser> getUserInformation(Page<SysUser> page,  @Param(\"orgCode\") String orgCode,  @Param(\"keyword\") String keyword,@Param(\"userId\") String userId);\n\n\n\t/**\n\t * 获取用户信息\n\t * @param page\n\t * @param orgCode\n\t * @param keyword\n\t * @return\n\t */\n\tIPage<SysUser> getProcessUserList(Page<SysUser> page,  @Param(\"orgCode\") String orgCode,  @Param(\"keyword\") String keyword,  @Param(\"tenantId\") Integer tenantId, @Param(\"excludeUserIdList\") List<String> excludeUserIdList);\n\n\t/**\n\t * 获取租户下的部门通过前台传过来的部门id\n\t * @param departIds\n\t * @param tenantId\n\t * @return\n\t */\n    List<String> getTenantDepart(@Param(\"departIds\") List<String> departIds, @Param(\"tenantId\") String tenantId);\n\n\t/**\n\t * 根据当前租户和用户id查询用户部门数据\n\t * @param userId\n\t * @param tenantId\n\t * @return\n\t */\n\tList<SysUserDepart> getTenantUserDepart(@Param(\"userId\") String userId, @Param(\"tenantId\") String tenantId);\n\n\t/**\n\t * 根据用户id和租户id,删除用户部门数据\n\t * @param userId\n\t * @param tenantId\n\t */\n\tvoid deleteUserDepart(@Param(\"userId\") String userId, @Param(\"tenantId\") String tenantId);\n\n\t/**\n\t * 通过部门id和租户id获取用户\n\t * @param departId\n\t * @param tenantId\n\t * @return\n\t */\n    List<SysUser> getUsersByDepartTenantId(@Param(\"departId\") String departId, @Param(\"tenantId\") Integer tenantId);\n\n\t/**\n\t * 根据用户id和部门id获取数量,用于查看用户是否存在用户部门关系表中\n\t * @param userId\n\t * @param departId\n\t * @return\n\t */\n\t@Select(\"SELECT COUNT(*) FROM sys_user_depart WHERE user_id = #{userId} AND dep_id = #{departId}\")\n    Long getCountByDepartIdAndUserId(String userId, String departId);\n\n    /**\n     * 通过用户id集合获取用户id和部门code\n     * \n     * @param userIdList\n     * @return\n     */\n    List<SysUserSysDepPostModel> getUserDepPostByUserIds(@Param(\"userIdList\") List<String> userIdList);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport com.baomidou.mybatisplus.core.conditions.Wrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.Constants;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport org.apache.ibatis.annotations.Param;\nimport org.apache.ibatis.annotations.Select;\nimport org.jeecg.modules.system.entity.SysUser;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.jeecg.modules.system.model.SysUserSysDepPostModel;\nimport org.jeecg.modules.system.model.SysUserSysDepartModel;\nimport org.jeecg.modules.system.vo.SysUserDepVo;\n\nimport java.util.List;\n\n/**\n * <p>\n * 用户表 Mapper 接口\n * </p>\n *\n * @Author scott\n * @since 2018-12-20\n */\npublic interface SysUserMapper extends BaseMapper<SysUser> {\n\t/**\n\t  * 通过用户账号查询用户信息\n\t * @param username\n\t * @return\n\t */\n\tpublic SysUser getUserByName(@Param(\"username\") String username);\n\t\n\t/**\n\t  * 通过用户账号查询用户Id\n\t * @param username\n\t * @return\n\t */\n\tpublic String getUserIdByName(@Param(\"username\") String username);\n\t\n\t/**\n\t  * 通过用户账号查询用户Id\n\t * @param userIds\n\t * @return\n\t */\n\tpublic List<String> getUsernameByIds(@Param(\"userIds\") List<String> userIds);\n\n\t/**\n\t *  根据部门Id查询用户信息\n\t * @param page\n\t * @param departId\n     * @param username 用户登录账户\n\t * @return\n\t */\n\tIPage<SysUser> getUserByDepId(Page page, @Param(\"departId\") String departId, @Param(\"username\") String username);\n\n\t/**\n\t * 根据部门和子部门下的所有用户账号\n\t *\n\t * @param orgCode 部门编码\n\t * @return\n\t */\n\tList<String> getUserAccountsByDepCode(@Param(\"orgCode\") String orgCode);\n\n\t/**\n\t *  根据用户Ids,查询用户所属部门名称信息\n\t * @param userIds\n\t * @return\n\t */\n\tList<SysUserDepVo> getDepNamesByUserIds(@Param(\"userIds\")List<String> userIds);\n\n\t/**\n\t *  根据部门Ids,查询部门下用户信息\n\t * @param page\n\t * @param departIds\n     * @param username 用户登录账户\n\t * @return\n\t */\n\tIPage<SysUser> getUserByDepIds(Page page, @Param(\"departIds\") List<String> departIds, @Param(\"username\") String username);\n\n\t/**\n\t * 根据角色Id查询用户信息\n\t * @param page\n\t * @param roleId 角色id\n     * @param username 用户登录账户\n     * @param realname 用户姓名\n\t * @return\n\t */\n\tIPage<SysUser> getUserByRoleId(Page page, @Param(\"roleId\") String roleId, @Param(\"username\") String username, @Param(\"realname\") String realname);\n\t\n\t/**\n\t * 根据用户名设置部门ID\n\t * @param username\n\t * @param orgCode\n\t */\n\tvoid updateUserDepart(@Param(\"username\") String username,@Param(\"orgCode\") String orgCode, @Param(\"loginTenantId\") Integer loginTenantId);\n\t\n\t/**\n\t * 根据手机号查询用户信息\n\t * @param phone\n\t * @return\n\t */\n\tpublic SysUser getUserByPhone(@Param(\"phone\") String phone);\n\t\n\t\n\t/**\n\t * 根据邮箱查询用户信息\n\t * @param email\n\t * @return\n\t */\n\tpublic SysUser getUserByEmail(@Param(\"email\")String email);\n\n\t/**\n\t * 根据 orgCode 查询用户，包括子部门下的用户\n\t *\n\t * @param page 分页对象, xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位(你可以继承Page实现自己的分页对象)\n\t * @param orgCode\n\t * @param userParams 用户查询条件，可为空\n\t * @return\n\t */\n\tList<SysUserSysDepartModel> getUserByOrgCode(IPage page, @Param(\"orgCode\") String orgCode, @Param(\"userParams\") SysUser userParams);\n\n\n    /**\n     * 查询 getUserByOrgCode 的Total\n     *\n     * @param orgCode\n     * @param userParams 用户查询条件，可为空\n     * @return\n     */\n    Integer getUserByOrgCodeTotal(@Param(\"orgCode\") String orgCode, @Param(\"userParams\") SysUser userParams);\n\n    /**\n     * 批量删除角色与用户关系\n     * @Author scott\n     * @Date 2019/12/13 16:10\n     * @param roleIdArray\n     */\n\tvoid deleteBathRoleUserRelation(@Param(\"roleIdArray\") String[] roleIdArray);\n\n    /**\n     * 批量删除角色与权限关系\n     * @Author scott\n     * @Date 2019/12/13 16:10\n     * @param roleIdArray\n     */\n\tvoid deleteBathRolePermissionRelation(@Param(\"roleIdArray\") String[] roleIdArray);\n\n\t/**\n\t * 查询被逻辑删除的用户\n     * @param wrapper\n     * @return List<SysUser>\n\t */\n\tList<SysUser> selectLogicDeleted(@Param(Constants.WRAPPER) Wrapper<SysUser> wrapper);\n\n\t/**\n\t * 还原被逻辑删除的用户\n     * @param userIds 用户id\n     * @param entity\n     * @return int\n\t */\n\tint revertLogicDeleted(@Param(\"userIds\") List<String> userIds, @Param(\"entity\") SysUser entity);\n\n\t/**\n\t * 彻底删除被逻辑删除的用户\n     * @param userIds 多个用户id\n     * @return int\n\t */\n\tint deleteLogicDeleted(@Param(\"userIds\") List<String> userIds);\n\n    /**\n     * 更新空字符串为null【此写法有sql注入风险，禁止随便用】\n     * @param fieldName\n     * @return int\n     */\n    @Deprecated\n    int updateNullByEmptyString(@Param(\"fieldName\") String fieldName);\n    \n\t/**\n\t *  根据部门Ids,查询部门下用户信息\n\t * @param departIds\n     * @param username 用户账户名称\n\t * @return\n\t */\n\tList<SysUser> queryByDepIds(@Param(\"departIds\")List<String> departIds,@Param(\"username\") String username);\n\n\t/**\n\t * 获取用户信息\n\t * @param page\n\t * @param roleId\n\t * @param keyword\n\t * @param userIdList\n\t * @return\n\t */\n\tIPage<SysUser> selectUserListByRoleId(Page<SysUser> page,  @Param(\"roleId\") String roleId,  @Param(\"keyword\") String keyword,  @Param(\"tenantId\") Integer tenantId, @Param(\"excludeUserIdList\") List<String> excludeUserIdList);\n\n    /**\n     * 更新刪除状态和离职状态\n     * @param userIds  存放用户id集合\n     * @param sysUser\n     * @return boolean\n     */\n    void updateStatusAndFlag(@Param(\"userIds\") List<String> userIds, @Param(\"sysUser\") SysUser sysUser);\n\n\t/**\n\t * 获取租户下的离职列表信息\n\t * @param tenantId\n\t * @return\n\t */\n\tList<SysUser> getTenantQuitList(@Param(\"tenantId\") Integer tenantId);\n\t\n\t/**\n\t * 获取租户下的有效用户ids\n\t * @param tenantId\n\t * @return\n\t */\n\tList<String> getTenantUserIdList(@Param(\"tenantId\") Integer tenantId);\n\t\n\t/**\n\t * 根据部门id和租户id获取用户数据 \n\t * @param departIds\n\t * @param tenantId\n\t * @return\n\t */\n\tList<SysUser> getUserByDepartsTenantId(@Param(\"departIds\") List<String> departIds,@Param(\"tenantId\") Integer tenantId);\n\n\t/**\n\t * 根据用户名和手机号获取用户\n\t * @param phone\n\t * @param username\n\t * @return\n\t */\n\t@Select(\"select id,phone from sys_user where phone = #{phone} and username = #{username}\")\n    SysUser getUserByNameAndPhone(@Param(\"phone\") String phone, @Param(\"username\") String username);\n\n    /**\n     * 查询部门、岗位下的用户 包括子部门下的用户\n     * \n     * @param page\n     * @param orgCode\n     * @param userParams\n     * @return\n     */\n    List<SysUserSysDepPostModel> queryDepartPostUserByOrgCode(@Param(\"page\") IPage page, @Param(\"orgCode\") String orgCode, @Param(\"userParams\") SysUser userParams);\n\n    /**\n     * 根据部门id和用户名获取部门岗位用户分页列表\n     * \n     * @param page\n     * @param userIdList\n     * @return\n     */\n    IPage<SysUser> getDepPostListByIdUserName(@Param(\"page\") Page<SysUser> page, @Param(\"userIdList\") List<String> userIdList, @Param(\"userId\") String userId, @Param(\"userName\") String userName, @Param(\"userNameList\") List<String> userNameList);\n\n    /**\n     * 根据部门id、用户名和真实姓名获取部门岗位用户分页列表\n     *\n     * @param page\n     * @param username\n     * @param realname\n     * @param orgCode\n     * @return\n     */\n    IPage<SysUser> getDepartPostListByIdUserRealName(@Param(\"page\") Page<SysUser> page, @Param(\"username\") String username, @Param(\"realname\") String realname, @Param(\"orgCode\") String orgCode);\n\n    /**\n     * 查询部门下的用户包括子部门下的用户\n     * \n     * @param page\n     * @param orgCode\n     * @param userParams\n     * @return\n     */\n    List<SysUserSysDepPostModel> queryDepartUserByOrgCode(@Param(\"page\") IPage page, @Param(\"orgCode\") String orgCode, @Param(\"userParams\") SysUser userParams);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserPositionMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport java.util.List;\n\nimport com.baomidou.mybatisplus.annotation.InterceptorIgnore;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport org.apache.ibatis.annotations.Delete;\nimport org.apache.ibatis.annotations.Select;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.entity.SysUserPosition;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.modules.system.vo.SysUserPositionVo;\n\n/**\n * @Description: 用户职位关系表\n * @Author: jeecg-boot\n * @Date:   2023-02-14\n * @Version: V1.0\n */\npublic interface SysUserPositionMapper extends BaseMapper<SysUserPosition> {\n\n    /**\n     * 获取职位用户列表\n     * @param page\n     * @param positionId\n     * @return\n     */\n    List<SysUser> getPositionUserList(@Param(\"page\") Page<SysUser> page, @Param(\"positionId\") String positionId);\n\n    /**\n     * 获取成员是否存在职位中\n     * @param userId\n     * @param positionId\n     * @return\n     */\n    @Select(\"SELECT count(*) FROM sys_user_position WHERE user_id = #{userId} and position_id = #{positionId}\")\n    Long getUserPositionCount(@Param(\"userId\") String userId, @Param(\"positionId\") String positionId);\n\n    /**\n     * 通过职位id删除用户职位关系表\n     * @param positionId\n     */\n    @Delete(\"DELETE FROM sys_user_position WHERE position_id = #{positionId} \")\n    void removeByPositionId(@Param(\"positionId\") String positionId);\n\n    /**\n     * 职位列表移除成员\n     * @param userIdList\n     * @param positionId\n     */\n    void removePositionUser(@Param(\"userIdList\") List<String> userIdList, @Param(\"positionId\") String positionId);\n\n    /**\n     * 根据用户id查询职位id\n     * @param userId\n     * @return\n     */\n    List<String> getPositionIdByUserId(@Param(\"userId\") String userId);\n\n\n    /**\n     * 根据用户ID和租户ID获取职位id\n     * @param userId\n     * @param tenantId\n     * @return\n     */\n    @InterceptorIgnore(tenantLine = \"true\")\n    List<String> getPositionIdByUserTenantId(@Param(\"userId\")String userId, @Param(\"tenantId\")Integer tenantId);\n\n    /**\n     * 根据用户id获取用户职位\n     * @param userIdList\n     * @param tenantId\n     * @return\n     */\n    List<SysUserPositionVo> getPositionIdByUsersTenantId(@Param(\"userIdList\") List<SysUser> userIdList, @Param(\"tenantId\") Integer tenantId);\n\n    /**\n     * 根据职位名称和租户id，删除用户职位关系表\n     * @param positionNames\n     * @param tenantId\n     * @param userId\n     */\n    void deleteUserPosByNameAndTenantId(@Param(\"positionNames\") List<String> positionNames, @Param(\"tenantId\") Integer tenantId, @Param(\"userId\") String userId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserRoleMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport java.util.List;\nimport org.apache.ibatis.annotations.Param;\nimport org.apache.ibatis.annotations.Select;\nimport org.jeecg.modules.system.entity.SysUserRole;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * <p>\n * 用户角色表 Mapper 接口\n * </p>\n *\n * @Author scott\n * @since 2018-12-21\n */\npublic interface SysUserRoleMapper extends BaseMapper<SysUserRole> {\n\n    /**\n     * 通过用户账号查询角色集合\n     * @param username 用户账号名称\n     * @return List<String>\n     */\n\t@Select(\"select role_code from sys_role where id in (select role_id from sys_user_role where user_id = (select id from sys_user where username=#{username}))\")\n\tList<String> getRoleByUserName(@Param(\"username\") String username);\n\t\n    /**\n     * 通过用户账号查询角色集合\n     * @param userId 用户id\n     * @return List<String>\n     */\n\t@Select(\"select role_code from sys_role where id in (select role_id from sys_user_role where user_id = #{userId})\")\n\tList<String> getRoleCodeByUserId(@Param(\"userId\") String userId);\n\n\t/**\n     * 通过用户账号查询角色Id集合\n     * @param username 用户账号名称\n     * @return List<String>\n     */\n\t@Select(\"select id from sys_role where id in (select role_id from sys_user_role where user_id = (select id from sys_user where username=#{username}))\")\n\tList<String> getRoleIdByUserName(@Param(\"username\") String username);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserTenantMapper.java",
    "content": "package org.jeecg.modules.system.mapper;\n\nimport java.util.List;\n\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport org.apache.ibatis.annotations.Delete;\nimport org.apache.ibatis.annotations.Param;\nimport org.apache.ibatis.annotations.Select;\nimport org.apache.ibatis.annotations.Update;\nimport org.jeecg.modules.system.entity.SysTenant;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.entity.SysUserTenant;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.jeecg.modules.system.vo.SysUserTenantVo;\nimport org.jeecg.modules.system.vo.thirdapp.JwUserDepartVo;\n\n/**\n * @Description: sys_user_tenant_relation\n * @Author: jeecg-boot\n * @Date:   2022-12-23\n * @Version: V1.0\n */\npublic interface SysUserTenantMapper extends BaseMapper<SysUserTenant> {\n\n    /**\n     * 通过租户id获取数据\n     * @param page\n     * @param userTenantId\n     * @return\n     */\n    List<SysUser> getPageUserList(@Param(\"page\") Page<SysUser> page,@Param(\"userTenantId\") Integer userTenantId,@Param(\"user\") SysUser user);\n\n    /**\n     * 根据租户id获取用户ids\n     * @param tenantId\n     * @return\n     */\n    List<String> getUserIdsByTenantId(@Param(\"tenantId\") Integer tenantId);\n\n    /**\n     * 通过用户id获取租户ids\n     * @param userId\n     * @return\n     */\n    List<Integer> getTenantIdsByUserId(@Param(\"userId\") String userId);\n\n\n    \n    //==============================================================================================================================\n    /**\n     * 通过用户id获取租户列表\n     * @param userId\n     * @return\n     */\n    List<SysUserTenantVo> getTenantListByUserId(@Param(\"userId\") String userId, @Param(\"userTenantStatus\") List<String> userTenantStatus);\n    \n    /**\n     * 通过状态、当前登录人的用户名，租户id，查询用户id\n     * @param tenantId\n     * @param statusList\n     * @param username\n     * @return\n     */\n    List<String> getUserIdsByCreateBy(@Param(\"tenantId\") Integer tenantId, @Param(\"userTenantStatus\")  List<String> statusList, @Param(\"username\") String username);\n\n    /**\n     * 联查用户和租户审核状态\n     * @param page\n     * @param status\n     * @param tenantId\n     * @return\n     */\n    List<SysUserTenantVo> getUserTenantPageList(@Param(\"page\") Page<SysUserTenantVo> page, @Param(\"status\") List<String> status, @Param(\"user\") SysUser user, @Param(\"tenantId\") Integer tenantId);\n\n    /**\n     * 根据用户id获取租户id，没有状态值(如获取租户已经存在，只不过是被拒绝或者审批中)\n     * @param userId\n     * @return\n     */\n    List<Integer> getTenantIdsNoStatus(@Param(\"userId\") String userId);\n    //==============================================================================================================================\n\n    /**\n     * 统计一个人创建了多少个租户\n     *\n     * @param userId\n     * @return\n     */\n    Integer countCreateTenantNum(String userId);\n\n    /**\n     * 取消离职\n     * @param userIds\n     * @param tenantId\n     */\n    void putCancelQuit(@Param(\"userIds\") List<String> userIds, @Param(\"tenantId\") Integer tenantId);\n\n    /**\n     * 判断当前用户是否已在该租户下面\n     * @param userId\n     * @param tenantId\n     */\n    Integer userTenantIzExist(@Param(\"userId\") String userId, @Param(\"tenantId\") int tenantId);\n\n    /**\n     * 查询未被注销的租户\n     * @param userId\n     * @return\n     */\n    List<SysTenant> getTenantNoCancel(@Param(\"userId\") String userId);\n\n    /**\n     * 根据用户id获取我的租户\n     * @param page\n     * @param userId\n     * @param userTenantStatus\n     * @return\n     */\n    List<SysTenant> getTenantPageListByUserId(@Param(\"page\") Page<SysTenant> page, @Param(\"userId\") String userId, @Param(\"userTenantStatus\") List<String> userTenantStatus,@Param(\"sysUserTenantVo\") SysUserTenantVo sysUserTenantVo);\n\n    /**\n     * 同意加入租户\n     * @param userId\n     * @param tenantId\n     */\n    @Update(\"update sys_user_tenant set status = '1' where user_id = #{userId} and tenant_id = #{tenantId}\")\n    void agreeJoinTenant(@Param(\"userId\") String userId, @Param(\"tenantId\") Integer tenantId);\n\n    /**\n     * 拒绝加入租户\n     * @param userId\n     * @param tenantId\n     */\n    @Delete(\"delete from sys_user_tenant where user_id = #{userId} and tenant_id = #{tenantId}\")\n    void refuseJoinTenant(@Param(\"userId\") String userId, @Param(\"tenantId\") Integer tenantId);\n\n    /**\n     * 根据用户id和租户id获取用户租户中间表信息\n     *\n     * @param userId\n     * @param tenantId\n     * @return\n     */\n    @Select(\"select id,user_id,tenant_id,create_by,status from sys_user_tenant where user_id = #{userId} and tenant_id = #{tenantId}\")\n    SysUserTenant getUserTenantByTenantId(@Param(\"userId\") String userId, @Param(\"tenantId\") Integer tenantId);\n\n    /**\n     * 删除租户下的用户\n     *\n     * @param tenantIds\n     */\n    void deleteUserByTenantId(@Param(\"tenantIds\") List<Integer> tenantIds);\n\n    /**\n     * 获取租户下的成员数量\n     *\n     * @param tenantId\n     * @param tenantStatus\n     * @return\n     */\n    Long getUserCount(Integer tenantId, String tenantStatus);\n    \n    /**\n     * 根据租户id和名称获取用户数据\n     * @param tenantId\n     * @return\n     */\n    List<JwUserDepartVo> getUsersByTenantIdAndName(@Param(\"tenantId\") Integer tenantId);\n\n    /**\n     * 根据多个用户id获取租户id\n     *\n     * @param userIds\n     * @return\n     */\n    List<Integer> getTenantIdsByUserIds(@Param(\"userIds\") List<String> userIds);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysAnnouncementMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysAnnouncementMapper\">\n\n\t<resultMap id=\"SysAnnouncement\" type=\"org.jeecg.modules.system.entity.SysAnnouncement\" >\n\t\t<result column=\"id\" property=\"id\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"titile\" property=\"titile\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"msg_content\" property=\"msgContent\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"start_time\" property=\"startTime\" jdbcType=\"TIMESTAMP\"/>\n\t\t<result column=\"end_time\" property=\"endTime\" jdbcType=\"TIMESTAMP\"/>\n\t\t<result column=\"sender\" property=\"sender\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"priority\" property=\"priority\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"msg_category\" property=\"msgCategory\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"msg_type\" property=\"msgType\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"send_status\" property=\"sendStatus\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"send_time\" property=\"sendTime\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"cancel_time\" property=\"cancelTime\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"del_flag\" property=\"delFlag\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"create_by\" property=\"createBy\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"create_time\" property=\"createTime\" jdbcType=\"TIMESTAMP\"/>\n\t\t<result column=\"update_by\" property=\"updateBy\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"update_time\" property=\"updateTime\" jdbcType=\"TIMESTAMP\"/>\n\t\t<result column=\"user_ids\" property=\"userIds\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"bus_type\" property=\"busType\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"bus_id\" property=\"busId\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"open_type\" property=\"openType\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"open_page\" property=\"openPage\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"files\" property=\"files\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"visits_num\" property=\"visitsNum\" jdbcType=\"INTEGER\"/>\n\t\t<result column=\"iz_top\" property=\"izTop\" jdbcType=\"INTEGER\"/>\n\n\t\t<result column=\"read_flag\" property=\"readFlag\" jdbcType=\"INTEGER\"/>\n\t\t<result column=\"star_flag\" property=\"starFlag\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"send_id\" property=\"sendId\" jdbcType=\"VARCHAR\"/>\n\t</resultMap>\n\t\n\t\n\t<select id=\"querySysCementListByUserId\" parameterType=\"String\"  resultMap=\"SysAnnouncement\">\n\t   select id,titile,create_time,priority,bus_id,open_type,open_page,sender,send_time,msg_content from sys_announcement \n\t   where send_status = '1' \n\t   and del_flag = '0' \n\t   and msg_category = #{msgCategory} \n\t   and create_time &gt;= #{beginDate}\n\t\t<if test=\"tenantId!=null and tenantId != 0\">\n\t\t\tand tenant_id = #{tenantId}\n\t\t</if>\n\t   and id IN ( select annt_id from sys_announcement_send where user_id = #{userId} and read_flag = 0 and create_time &gt;= #{beginDate})\n\t   order by create_time DESC\n\t</select>\n\n\t<!-- 获取用户未读消息数量 -->\n\t<select id=\"getUnreadMessageCountByUserId\" resultType=\"java.lang.Integer\">\n\t\t<!-- update by wangshuai 2024-07-02【TV360X-1682】撤销之后数量还显示，但是点开面板没有这条数据，他会一直显示有数据，需要联查判断已经发送的-->\n\t\tselect count(1) from sys_announcement_send sas\n\t\tright join sys_announcement sa on sas.annt_id = sa.id and sa.send_status = '1'\n\t    where sas.user_id = #{userId} and sas.read_flag = 0 and sas.create_time &gt;= #{beginDate}\n        <if test=\"noticeType != null and noticeType != ''\">\n            and sa.notice_type = #{noticeType}\n        </if>\n\t</select>\n\t\n\t<!-- 查询消息记录 -->\n\t<select id=\"queryAllMessageList\" resultMap=\"SysAnnouncement\">\n\t   select\n\t\t\ta.id,\n\t\t\ta.titile,\n\t\t\ta.msg_content,\n\t\t\ta.sender,\n\t\t\ta.priority,\n\t\t\ta.msg_category,\n\t\t\ta.msg_type,\n\t\t\ta.send_status,\n\t\t\ta.send_time,\n\t\t\ta.bus_type,\n\t\t\ta.bus_id,\n\t\t\ta.open_type,\n\t\t\ta.open_page,\n\t\t\ta.msg_abstract,\n\t\t\ta.dt_task_id,\n\t\t    a.files,\n\t\t    a.visits_num,\n\t\t    a.iz_top,\n\t   \t\tb.read_flag,\n\t   \t\tb.star_flag,\n\t   \t\tb.id as send_id\n\t   from sys_announcement a\n\t   join sys_announcement_send b on b.annt_id = a.id\n\t   where a.send_status = '1' and a.del_flag = '0' and b.user_id = #{userId}\n\t\t<if test=\"fromUser!=null and fromUser!=''\">\n\t\t\tand a.sender = #{fromUser}\n\t\t</if>\n\t\n\t\t<if test=\"beginDate!=null\">\n\t\t\tand a.create_time &gt;= #{beginDate}\n\t\t\tand b.create_time &gt;= #{beginDate}\n\t\t</if>\n\t\t<if test=\"endDate!=null\">\n\t\t\tand a.create_time &lt;= #{endDate}\n\t\t</if>\n\n\t\t<if test=\"starFlag!=null and starFlag!=''\">\n\t\t\tand b.star_flag = #{starFlag}\n\t\t</if>\n\t\t<if test=\"busType!=null and busType!=''\">\n\t\t\tand a.bus_type = #{busType}\n\t\t</if>\t\n        <if test=\"noticeType!=null and noticeType!=''\">\n\t\t\tand a.notice_type = #{noticeType}\n\t\t</if>\n\t\t<if test=\"msgCategory!=null and msgCategory!=''\">\n\t\t\tand a.msg_category = #{msgCategory}\n\t\t</if>\n\t\torder by a.iz_top DESC, b.read_flag ASC, a.create_time DESC\n\t</select>\n\n\t<!-- 查询用户未阅读的通知公告 -->\n\t<select id=\"getNotSendedAnnouncementlist\" resultType=\"java.lang.String\" parameterType=\"object\">\n\t\tSELECT\n\t\t\ta.id\n\t\tFROM\n\t\t\tsys_announcement a \n\t\tWHERE\n\t\t\ta.del_flag = '0' \n\t\t\tAND a.send_status = '1' \n\t\t\tAND a.msg_type = 'ALL' \n\t\t\tAND a.end_time >= #{currDate}\n\t\t\tAND a.id NOT IN (\n\t\t\tSELECT\n\t\t\t\tannt_id \n\t\t\tFROM\n\t\t\t\tsys_announcement_send \n\t\t\tWHERE\n\t\t\t\tuser_id = #{userId}\n\t\t\t)\n\t</select>\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysAnnouncementSendMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysAnnouncementSendMapper\">\n\t\n\t<resultMap id=\"AnnouncementSendModel\" type=\"org.jeecg.modules.system.model.AnnouncementSendModel\" >\n\t\t<result column=\"id\" property=\"id\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"annt_id\" property=\"anntId\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"user_id\" property=\"userId\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"titile\" property=\"titile\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"msg_content\" property=\"msgContent\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"sender\" property=\"sender\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"priority\" property=\"priority\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"msg_category\" property=\"msgCategory\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"send_time\" property=\"sendTime\" jdbcType=\"TIMESTAMP\"/>\n\t\t<result column=\"bus_id\" property=\"busId\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"bus_type\" property=\"busType\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"open_type\" property=\"openType\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"open_page\" property=\"openPage\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"files\" property=\"files\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"visits_num\" property=\"visitsNum\" jdbcType=\"INTEGER\"/>\n\t\t<result column=\"iz_top\" property=\"izTop\" jdbcType=\"INTEGER\"/>\n\t</resultMap>\n\t\n\t<select id=\"getMyAnnouncementSendList\" parameterType=\"Object\"  resultMap=\"AnnouncementSendModel\">\n\t   select\n\t   \t\tsas.id,\n\t   \t\tsas.annt_id,\n\t   \t\tsas.user_id,\n\t   \t\tsas.read_flag,\n\t   \t\tsa.titile as titile,\n\t   \t\tsa.msg_content as msg_content,\n\t   \t\tsa.sender as sender,\n\t   \t\tsa.priority as priority,\n\t   \t\tsa.msg_category,\n\t   \t\tsa.send_time as send_time,\n\t   \t\tsa.bus_id as bus_id,\n\t   \t\tsa.bus_type as bus_type,\n\t\t\tsa.open_type as open_type,\n\t\t\tsa.open_page as open_page,\n\t\t\tsa.msg_abstract,\n\t\t\tsa.files,\n\t\t\tsa.visits_num,\n\t\t    sa.iz_top,\n\t\t    sa.notice_type\n\t   from sys_announcement_send sas\n\t   left join sys_announcement sa ON sas.annt_id = sa.id\n\t   where sa.send_status = '1'\n\t   and sa.del_flag = '0'\n\t   and sas.user_id = #{announcementSendModel.userId}\n\t   <if test=\"announcementSendModel.titile !=null and announcementSendModel.titile != ''\">\n\t   \t\tand sa.titile LIKE concat(concat('%',#{announcementSendModel.titile}),'%')\n\t   </if>\n\t   <if test=\"announcementSendModel.sender !=null and announcementSendModel.sender != ''\">\n\t   \t\tand sa.sender LIKE concat(concat('%',#{announcementSendModel.sender}),'%')\n\t   </if>\n\t\t<if test=\"announcementSendModel.noticeType !=null and announcementSendModel.noticeType != ''\">\n\t\t\tand sa.notice_type = #{announcementSendModel.noticeType}\n\t\t</if>\n\t   <if test=\"announcementSendModel.noticeTypeList !=null and announcementSendModel.noticeTypeList.size() > 0\">\n\t\t   and sa.notice_type in\n\t\t   <foreach collection=\"announcementSendModel.noticeTypeList\" index=\"index\" item=\"noticeType\" open=\"(\" separator=\",\" close=\")\">\n\t\t\t   #{noticeType}\n\t\t   </foreach>\n\t   </if>\n\t   <if test=\"announcementSendModel.readFlag !=null\">\n\t   \t\tand sas.read_flag = #{announcementSendModel.readFlag}\n\t   </if>\n\t   <if test=\"announcementSendModel.busType !=null and announcementSendModel.busType != ''\">\n\t   \t\tand sa.bus_type = #{announcementSendModel.busType}\n\t   </if>\n\t\t<if test=\"announcementSendModel.bizSource !=null and announcementSendModel.bizSource =='isNoBpm'\">\n\t\t\tand (sa.bus_type != 'bpm' or sa.bus_type is null)\n\t\t</if>\n        <if test=\"announcementSendModel.msgCategory !=null and announcementSendModel.msgCategory != ''\">\n            and sa.msg_category = #{announcementSendModel.msgCategory}\n        </if>\n\t\t<if test=\"announcementSendModel.sendTimeBegin !=null and announcementSendModel.sendTimeBegin != '' \n\t\tand announcementSendModel.sendTimeEnd != '' and announcementSendModel.sendTimeEnd != ''\">\n\t\t\tand sa.send_time between #{announcementSendModel.sendTimeBegin} and #{announcementSendModel.sendTimeEnd}\n\t\t</if>\n\t   order by sa.iz_top DESC, sas.read_flag,sa.send_time desc\n\t</select>\n\n\n\n\t<!-- 查询一条消息 -->\n\t<select id=\"getOne\" parameterType=\"String\" resultMap=\"AnnouncementSendModel\">\n\t\tselect\n\t\tsas.id,\n\t\tsas.annt_id,\n\t\tsas.user_id,\n\t\tsas.read_flag,\n\t\tsa.titile as titile,\n\t\tsa.msg_content as msg_content,\n\t\tsa.sender as sender,\n\t\tsa.priority as priority,\n\t\tsa.msg_category,\n\t\tsa.send_time as send_time,\n\t\tsa.bus_id as bus_id,\n\t\tsa.open_type as open_type,\n\t\tsa.open_page as open_page,\n\t\tsa.msg_abstract\n\t\tfrom sys_announcement_send sas\n\t\tleft join sys_announcement sa ON sas.annt_id = sa.id\n\t\twhere sa.send_status = '1'\n\t\tand sa.del_flag = '0'\n\t\tand sas.id = #{sendId}\n\t</select>\n\n\n\t<!-- 修改为已读消息 -->\n\t<update id=\"updateReaded\">\n\t\tupdate sys_announcement_send set read_flag = 1\n\t\t where user_id = #{userId} \n\t\t\tand annt_id in\n\t\t<foreach collection=\"annoceIdList\" index=\"index\" item=\"id\" open=\"(\" separator=\",\" close=\")\">\n\t\t\t#{id}\n\t\t</foreach>\n\t</update>\n\t\n\t\n\t<!--清除所有未读消息-->\n\t<update id=\"clearAllUnReadMessage\">\n\t\tupdate sys_announcement_send set read_flag = 1\n\t\twhere user_id = #{userId} and read_flag = 0\n\t</update>\n\n    <!-- 根据用户id和阅读表的id获取所有阅读的数据 -->\n\t<select id=\"getReadAnnSendByUserId\" resultType=\"java.lang.String\">\n        select id from sys_announcement_send\n        where user_id = #{userId} and read_flag = 1\n        and id in\n        <foreach collection=\"ids\" index=\"index\" item=\"id\" open=\"(\" separator=\",\" close=\")\">\n            #{id}\n        </foreach>\n    </select>\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysCategoryMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysCategoryMapper\">\n\n\t<select id=\"queryListByPid\" parameterType=\"Object\" resultType=\"org.jeecg.modules.system.model.TreeSelectModel\">\n\t\tselect code,\n\t\t\t   name as \"title\",\n\t\t\t   id as \"key\",\n\t\t\t   (case when has_child = '1' then 0 else 1 end) as isLeaf,\n\t\t\t   pid as parentId\n\t\t\t   from sys_category\n\t\t\twhere pid = #{pid}\n\t\t\t<if test=\"query!= null\">\n\t\t\t\t<if test=\"query.code !=null and query.code != ''\">\n\t\t\t\t\tand code = #{query.code}\n\t\t\t\t</if>\n\n\t\t\t\t<if test=\"query.name !=null and query.name != ''\">\n\t\t\t\t\tand name = #{query.name}\n\t\t\t\t</if>\n\n\t\t\t\t<if test=\"query.id !=null and query.id != ''\">\n\t\t\t\t\tand id = #{query.id}\n\t\t\t\t</if>\n\n\t\t\t\t<if test=\"query.createBy !=null and query.createBy != ''\">\n\t\t\t\t\tand create_by = #{query.createBy}\n\t\t\t\t</if>\n\n\t\t\t\t<if test=\"query.sysOrgCode !=null and query.sysOrgCode != ''\">\n\t\t\t\t\tand sys_org_code = #{query.sysOrgCode}\n\t\t\t\t</if>\n\t\t\t</if>\n\t</select>\n\n\n</mapper>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysCheckRuleMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysCheckRuleMapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysCommentMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysCommentMapper\">\n\n    <resultMap id=\"commentResult\" type=\"org.jeecg.modules.system.vo.SysCommentVO\">\n        <id property=\"id\" column=\"id\" jdbcType=\"VARCHAR\"/>\n        <result property=\"tableName\" column=\"table_name\" jdbcType=\"VARCHAR\"/>\n        <result property=\"tableDataId\" column=\"table_data_id\" jdbcType=\"VARCHAR\"/>\n        <result property=\"fromUserId\" column=\"from_user_id\" jdbcType=\"VARCHAR\"/>\n        <result property=\"commentContent\" column=\"comment_content\" jdbcType=\"VARCHAR\"/>\n        <result property=\"createTime\" column=\"create_time\" jdbcType=\"TIMESTAMP\"/>\n        <result property=\"toUserId\" column=\"to_user_id\" jdbcType=\"VARCHAR\"/>\n        <result property=\"commentId\" column=\"comment_id\" jdbcType=\"VARCHAR\"/>\n        <!-- 8+6 -->\n        <collection property=\"fileList\" ofType=\"org.jeecg.modules.system.vo.SysCommentFileVo\" javaType=\"java.util.List\">\n            <result property=\"sysFormFileId\" column=\"sys_form_file_id\" jdbcType=\"VARCHAR\"/>\n            <result property=\"fileId\" column=\"file_id\" jdbcType=\"VARCHAR\"/>\n            <result property=\"name\" column=\"file_name\" jdbcType=\"VARCHAR\"/>\n            <result property=\"fileSize\" column=\"file_size\" jdbcType=\"VARCHAR\"/>\n            <result property=\"url\" column=\"url\" jdbcType=\"VARCHAR\"/>\n            <result property=\"type\" column=\"file_type\" jdbcType=\"VARCHAR\"/>\n            <result property=\"storeType\" column=\"store_type\" jdbcType=\"VARCHAR\"/>\n        </collection>\n    </resultMap>\n\n    <!-- 根据表名和数据id查询表单评论信息及文件 -->\n    <select id=\"queryCommentList\" resultMap=\"commentResult\">\n\t   select\n            a.id,\n            a.table_name,\n            a.table_data_id,\n            a.from_user_id,\n            a.comment_content,\n            a.create_time,\n            a.to_user_id,\n            a.comment_id,\n            b.id as sys_form_file_id,\n            c.id as file_id,\n            c.file_name,\n            c.file_size,\n            c.url,\n            c.file_type,\n            c.store_type\n         from sys_comment a\n         left join sys_form_file b on b.table_name = 'sys_comment' and b.table_data_id = a.id\n         left join sys_files c on b.file_id = c.id and c.del_flag = '0'\n\t   where a.table_name = #{tableName, jdbcType=VARCHAR}\n\t   and a.table_data_id = #{formDataId, jdbcType=VARCHAR}\n\t   order by a.create_time asc\n\t</select>\n\n    <!-- 根据表名和数据id查询表单文件 -->\n    <select id=\"queryFormFileList\" resultType=\"org.jeecg.modules.system.vo.SysCommentFileVo\">\n\t   select\n            b.id as sys_form_file_id,\n            c.id as file_id,\n            c.file_name as name,\n            c.file_size,\n            c.url,\n            c.file_type as type,\n            c.store_type\n         from sys_comment a\n         join sys_form_file b on b.table_name = 'sys_comment' and b.table_data_id = a.id\n         join sys_files c on b.file_id = c.id\n\t   where c.del_flag = '0'\n\t   and a.table_name = #{tableName, jdbcType=VARCHAR}\n\t   and a.table_data_id = #{formDataId, jdbcType=VARCHAR}\n\t   order by a.create_time asc\n\t</select>\n\n    <!-- 根据用户名获取用户信息 -->\n    <select id=\"queryUserAvatarList\" resultType=\"org.jeecg.modules.system.vo.UserAvatar\">\n\t   select id,  avatar, realname from sys_user\n        WHERE id IN \n        <foreach item=\"id\" collection=\"idSet\"  open=\"(\" separator=\",\" close=\")\">\n            #{id}\n        </foreach>\n\t</select>\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDataLogMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysDataLogMapper\">\n\t<!-- 通过表名及数据Id获取最大版本 -->\n\t<select id=\"queryMaxDataVer\" parameterType=\"String\"  resultType=\"String\">\n\t\tselect max(data_version) as mvn from sys_data_log \n\t\twhere data_table = #{tableName} and data_id =#{dataId}\n\t</select>\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDataSourceMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysDataSourceMapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysDepartMapper\">\n\n\t<select id=\"queryUserDeparts\" parameterType=\"String\" resultType=\"org.jeecg.modules.system.entity.SysDepart\">\n\t   select * from sys_depart where id IN ( select dep_id from sys_user_depart where user_id = #{userId} )\n\t</select>\n\n    <!-- 根据username查询所拥有的部门 -->\n    <select id=\"queryDepartsByUsername\" parameterType=\"String\" resultType=\"org.jeecg.modules.system.entity.SysDepart\">\n        SELECT *\n        FROM sys_depart\n        WHERE id IN (\n            SELECT dep_id\n            FROM sys_user_depart\n            WHERE user_id = (\n                SELECT id\n                FROM sys_user\n                WHERE username = #{username}\n            )\n        )\n    </select>\n    \n    <!-- 根据username查询所拥有的部门 -->\n    <select id=\"queryDepartsByUserId\" parameterType=\"String\" resultType=\"java.lang.String\">\n        SELECT id\n        FROM sys_depart\n        WHERE id IN (\n            SELECT dep_id\n            FROM sys_user_depart\n            WHERE user_id = #{userId}\n        )\n    </select>\n\n    <!-- 根据username和分类查询所拥有的部门/岗位/公司 -->\n    <select id=\"queryDeptByUserAndCategory\" parameterType=\"String\" resultType=\"org.jeecg.modules.system.entity.SysDepart\">\n        SELECT *\n        FROM sys_depart\n        WHERE id IN (\n            SELECT dep_id\n            FROM sys_user_depart\n            WHERE user_id = (\n                SELECT id\n                FROM sys_user\n                WHERE username = #{username}\n            )\n        )\n        <if test=\"category != null and category != ''\">\n            AND org_category = #{category}\n        </if>\n    </select>\n\n    <!-- 根据部门Id查询,当前和下级所有部门IDS -->\n    <select id=\"getSubDepIdsByDepId\" resultType=\"java.lang.String\">\n\t\tselect id from sys_depart where del_flag = '0' and org_code like concat((select org_code from sys_depart where id=#{departId}),'%')\n\t</select>\n\n    <!--根据部门编码获取我的部门下所有部门ids -->\n    <select id=\"getSubDepIdsByOrgCodes\" resultType=\"java.lang.String\">\n\t\tselect id from sys_depart where del_flag = '0' and\n        <foreach collection=\"orgCodes\" item=\"item\" index=\"index\"  open=\"(\" separator=\"or\" close=\")\">\n            org_code LIKE CONCAT(#{item},'%')\n        </foreach>\n\t</select>\n     <!--根据parent_id查询下级部门-->\n    <select id=\"queryTreeListByPid\" parameterType=\"Object\"  resultType=\"org.jeecg.modules.system.entity.SysDepart\">\n        SELECT * FROM  sys_depart where del_flag = '0'\n        <choose>\n            <when test=\"parentId != null and parentId != ''\">\n                AND parent_id =  #{parentId,jdbcType=VARCHAR}\n            </when>\n            <otherwise>\n                AND parent_id is null or parent_id=''\n            </otherwise>\n        </choose>\n        order by depart_order\n    </select>\n\n    <!-- 根据OrgCod查询公司信息 -->\n    <select id=\"queryCompByOrgCode\" resultType=\"org.jeecg.modules.system.entity.SysDepart\">\n\t\tselect * from sys_depart where del_flag = '0' and org_category='1' and org_code= #{orgCode,jdbcType=VARCHAR}\n\t</select>\n    \n    <!--通过父级id和租户id查询部门-->\n    <select id=\"queryBookDepTreeSync\" resultType=\"org.jeecg.modules.system.entity.SysDepart\">\n        SELECT * FROM sys_depart\n        WHERE\n        del_flag = '0'\n        <if test=\"tenantId != null\">\n            AND tenant_id = #{tenantId}\n        </if>\n        <choose>\n            <when test=\"parentId != null and parentId != ''\">\n                AND parent_id = #{parentId}\n            </when>\n            <otherwise>\n                <if test=\"departName == null or departName == ''\">\n                    AND (parent_id is null or parent_id='')\n                </if>\n            </otherwise>\n        </choose>\n        <if test=\"departName != null and departName != ''\">\n            <bind name=\"bindName\" value=\"'%'+departName+'%'\"/>\n            AND depart_name LIKE #{bindName}\n        </if>\n        ORDER BY depart_order DESC\n    </select>\n\n    <!--获取部门orgCode最大值的部门信息-->\n    <select id=\"getMaxCodeDepart\" resultType=\"org.jeecg.modules.system.entity.SysDepart\">\n        SELECT * FROM sys_depart\n        WHERE\n        <choose>\n            <when test=\"parentId != null and parentId != ''\">\n                parent_id = #{parentId}\n            </when>\n            <otherwise>\n                parent_id IS NULL OR parent_id=''\n            </otherwise>\n        </choose>\n        ORDER BY org_code DESC\n    </select>\n    \n    <!--获取父级部门的数据-->\n    <select id=\"getDepartList\" resultType=\"org.jeecg.modules.system.vo.lowapp.ExportDepartVo\">\n        SELECT id,depart_name,parent_id FROM sys_depart\n        WHERE\n        tenant_id = #{tenantId}\n        AND\n        <choose>\n            <when test=\"parentId != null and parentId != ''\">\n                parent_id = #{parentId}\n            </when>\n            <otherwise>\n                parent_id IS NULL OR parent_id=''\n            </otherwise>\n        </choose>\n        ORDER BY depart_order DESC\n    </select>\n    \n    <!--根据部门名称和租户id获取部门数据-->\n    <select id=\"getDepartByName\" resultType=\"org.jeecg.modules.system.entity.SysDepart\">\n        SELECT id,depart_name,org_code,parent_id FROM sys_depart \n        where\n        depart_name = #{departName}\n        <if test=\"null != tenantId and 0 != tenantId\">\n            and tenant_id = #{tenantId}\n        </if>\n        <if test=\"parentId != null and parentId != ''\">\n            and parent_id = #{parentId}\n        </if>\n        order by create_time desc\n    </select>\n    \n    <!--根据用户id获取用户id和部门名称-->\n    <select id=\"getUserDepartByTenantUserId\" resultType=\"org.jeecg.modules.system.vo.SysUserDepVo\">\n        SELECT sd.depart_name, sud.user_id, sd.id as deptId, sd.parent_id\n        FROM sys_depart sd\n        RIGHT JOIN sys_user_depart sud on sd.id = sud.dep_id and sd.del_flag = 0\n        WHERE sud.user_id IN\n        <foreach collection=\"userList\" index=\"index\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n            #{item.id}\n        </foreach>\n        AND sd.tenant_id = #{tenantId}\n        order by sd.org_code;\n    </select>\n    \n    <!--根据部门名称和租户id获取分页部门数据-->\n    <select id=\"getDepartPageByName\" resultType=\"org.jeecg.modules.system.entity.SysDepart\">\n        SELECT id,depart_name,org_code,parent_id FROM sys_depart\n        where\n        depart_name = #{departName}\n        and tenant_id = #{tenantId}\n        <if test=\"parentId != null and parentId != ''\">\n            and parent_id = #{parentId}\n        </if>\n        ORDER BY create_time DESC\n    </select>\n    \n    <!--通过部门id，查询部门下的用户的账号 -->\n    <select id=\"queryUserAccountByDepartIds\" resultType=\"java.lang.String\">\n        select username from sys_user where id in (select user_id from sys_user_depart where dep_id in\n        <foreach  item=\"item\" index=\"index\" collection=\"departIds\" open=\"(\" separator=\",\" close=\" )\">\n            #{item}\n        </foreach>\n        )\n    </select>\n    \n    <!--系统后台导出，根据父级id和租户id查询部门数据-->\n    <select id=\"getSysDepartList\" resultType=\"org.jeecg.modules.system.vo.SysDepartExportVo\">\n        SELECT id,depart_name,parent_id,depart_name_en,depart_order,description,org_category,org_code,mobile,fax,address,memo, position_id FROM sys_depart\n        WHERE\n        1=1\n        <if test=\"null != tenantId and 0 != tenantId\">\n            AND tenant_id = #{tenantId}\n        </if>\n        <if test=\"parentId != null and parentId != '' and parentId != '-1'\">\n            AND parent_id = #{parentId}\n        </if>\n        <if test=\"parentId == '-1'\">\n            AND (parent_id IS NULL OR parent_id='')\n        </if>\n        <if test=\"idList != null and !idList.isEmpty()\">\n            and id in\n            <foreach item=\"id\" index=\"index\" collection=\"idList\" open=\"(\" separator=\",\" close=\")\">\n                #{id}\n            </foreach>\n        </if>\n        ORDER BY depart_order DESC\n    </select>\n    \n    <!--根据多个部门id获取部门数据-->\n\t<select id=\"getDepartByIds\" resultType=\"org.jeecg.modules.system.vo.SysUserDepVo\">\n        SELECT id,depart_name,org_code,parent_id FROM sys_depart\n        where\n        1=1\n        <if test=\"departIds != null and !departIds.isEmpty()\">\n            and id in\n            <foreach item=\"id\" index=\"index\" collection=\"departIds\" open=\"(\" separator=\",\" close=\")\">\n                #{id}\n            </foreach>\n        </if>\n    </select>\n    \n    <!--根据用户id获取部门信息-->\n\t<select id=\"getUserDepartByUserId\" resultType=\"org.jeecg.modules.system.vo.SysUserDepVo\">\n        SELECT sd.depart_name, sud.user_id, sd.id as deptId, sd.parent_id, sd.org_category\n        FROM sys_depart sd\n        RIGHT JOIN sys_user_depart sud on sd.id = sud.dep_id and sd.del_flag = 0\n        WHERE sud.user_id IN\n        <foreach collection=\"userList\" index=\"index\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n            #{item.id}\n        </foreach>\n        order by sd.org_code;\n    </select>\n    \n    <!--根据父级id/职级/部门id获取部门岗位信息-->\n\t<select id=\"getDepartPositionByParentId\" resultType=\"org.jeecg.modules.system.entity.SysDepart\">\n        select sd.depart_name, sd.id, sd.iz_leaf, sd.org_category, sd.parent_id, sd.org_code from sys_depart sd left join sys_position sp on sd.position_id = sp.id\n        where sd.parent_id = #{parentId}\n        and sd.org_category = '3' \n        <if test=\"postLevel != null\">\n            and sp.post_level <![CDATA[ < ]]> #{postLevel}\n        </if>\n        <if test=\"departId != null and departId != ''\">\n            and sd.id != #{departId}\n        </if>\n        order by sd.depart_order,sd.create_time desc\n    </select>\n    \n    <!--根据部门id获取部门信息-->\n\t<select id=\"getDepartPostByDepartId\" resultType=\"org.jeecg.modules.system.vo.SysDepartPositionVo\">\n        select depart_name as positionName,id,iz_leaf,parent_id,org_category,org_code, dep_post_parent_id from sys_depart\n        where id = #{departId}\n    </select>\n    \n    <!--根据部门编码查询部门信息-->\n\t<select id=\"getDepartPostByOrgCode\" resultType=\"org.jeecg.modules.system.vo.SysDepartPositionVo\">\n        select depart_name as positionName,id,iz_leaf,parent_id,org_category,org_code, dep_post_parent_id from sys_depart\n        where org_code like #{orgCode} \n        and org_category = '3'\n        order by depart_order,create_time desc\n    </select>\n    \n    <!--根据部门id获取部门编码-->\n\t<select id=\"getDepCodeByDepIds\" resultType=\"java.lang.String\">\n        SELECT org_code\n        FROM sys_depart\n        WHERE id IN\n        <foreach collection=\"idList\" index=\"index\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n            #{item}\n        </foreach>\n    </select>\n    \n    <!--  根据父级部门id和职务名称查找部门id  -->\n\t<select id=\"getDepIdByDepIdAndPostName\" resultType=\"java.lang.String\">\n        SELECT id FROM sys_depart\n        WHERE parent_id = #{parentId} and depart_name = #{postName}\n    </select>\n\n    <!--根据部门id获取职级名称-->\n\t<select id=\"getPostNameByPostId\" resultType=\"java.lang.String\">\n        select sp.name from sys_depart sd join sys_position sp on sd.position_id = sp.id\n        where sd.id = #{depId}\n    </select>\n    \n    <!-- 根据部门父id获取部门岗位数据 -->\n\t<select id=\"getDepartPositionByParentIds\" resultType=\"org.jeecg.modules.system.entity.SysDepart\">\n        select sd.depart_name, sd.id, sd.iz_leaf, sd.org_category, sd.parent_id, sd.org_code from sys_depart sd left join sys_position sp on sd.position_id = sp.id\n        where sd.parent_id in\n        <foreach collection=\"parentIds\" index=\"index\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n            #{item}\n        </foreach>\n        and sd.org_category = '3'\n        order by sd.depart_order,sd.create_time desc\n    </select>\n    \n    <!-- 根据用户id集合获取用户的兼职岗位信息 -->\n\t<select id=\"getDepartOtherPostByUserIds\" resultType=\"org.jeecg.modules.system.model.SysUserSysDepPostModel\">\n        select sudp.user_id as id, sudp.dep_id as otherDepPostId, sd.org_code\n        from sys_user_dep_post sudp\n        join sys_depart sd on sudp.dep_id = sd.id\n        where sudp.user_id in\n        <foreach collection=\"userIdList\" index=\"index\" item=\"item\" open=\"(\" separator=\",\" close=\")\">\n            #{item}\n        </foreach>\n    </select>\n    \n    <!-- 获取负责部门 -->\n    <select id=\"getDepartmentHead\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n        select id, realname, avatar, sex, telephone, phone, main_dep_post_id, iz_hide_contact, sort, create_time from sys_user\n        where status = 1 and del_flag = 0\n        <bind name=\"bindDepartId\" value=\"departId+'%'\"/>\n        and depart_ids like #{bindDepartId}\n        order by sort,create_time desc\n    </select>\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartPermissionMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysDepartPermissionMapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartRoleMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysDepartRoleMapper\">\n\n    <!--根据用户id，部门id查询可授权所有部门角色 -->\n    <select id=\"queryDeptRoleByDeptAndUser\" resultType=\"org.jeecg.modules.system.entity.SysDepartRole\">\n        SELECT * FROM sys_depart_role WHERE depart_id IN (\n            SELECT id FROM sys_depart WHERE id IN (SELECT dep_id FROM sys_user_depart WHERE user_id=#{userId})\n            AND org_code LIKE CONCAT(#{orgCode},'%')\n        )\n    </select>\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartRolePermissionMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysDepartRolePermissionMapper\">\n\n    <delete id=\"deleteByRoleIds\">\n        DELETE FROM sys_depart_role_permission\n        WHERE role_id IN\n        <foreach collection=\"ids\" item=\"roleId\" open=\"(\" close=\")\" separator=\",\" >\n            #{roleId}\n        </foreach>\n    </delete>\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartRoleUserMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysDepartRoleUserMapper\">\n\n    <delete id=\"deleteByRoleIds\">\n        DELETE FROM sys_depart_role_user\n        WHERE drole_id IN\n        <foreach collection=\"ids\" item=\"roleId\" open=\"(\" close=\")\" separator=\",\" >\n            #{roleId}\n        </foreach>\n    </delete>\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictItemMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysDictItemMapper\">\n\n</mapper>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysDictMapper\">\n\n\t<!-- 通过字典code获取字典数据 -->\n\t<select id=\"queryDictItemsByCode\" parameterType=\"String\"  resultType=\"org.jeecg.common.system.vo.DictModel\">\n\t\t   select s.item_value as \"value\",s.item_text as \"text\",s.item_color as color from sys_dict_item s\n\t\t   where dict_id = (select id from sys_dict where dict_code = #{code})\n\t\t   order by s.sort_order asc, s.create_time DESC;\n\t</select>\n\n\t<!-- 通过字典code获取有效的字典数据项 -->\n\t<select id=\"queryEnableDictItemsByCode\" parameterType=\"String\"  resultType=\"org.jeecg.common.system.vo.DictModel\">\n\t\t   select s.item_value as \"value\",s.item_text as \"text\", s.item_color as \"color\" from sys_dict_item s\n\t\t   where dict_id = (select id from sys_dict where dict_code = #{code})\n\t\t   and s.status = 1\n\t\t   order by s.sort_order asc, s.create_time DESC;\n\t</select>\n\n\t<!-- 通过多个字典code获取字典数据 -->\n\t<select id=\"queryDictItemsByCodeList\" parameterType=\"java.util.List\" resultType=\"org.jeecg.common.system.vo.DictModelMany\">\n\t\tSELECT\n\t\t\tdict.dict_code,\n\t\t\titem.item_text AS \"text\",\n\t\t\titem.item_value AS \"value\",\n\t\t\titem.item_color AS \"color\"\n\t\tFROM\n\t\t\tsys_dict_item item\n\t\tINNER JOIN sys_dict dict ON dict.id = item.dict_id\n\t\tWHERE dict.dict_code IN (\n\t\t\t<foreach item=\"dictCode\" collection=\"dictCodeList\" separator=\",\">\n\t\t\t\t#{dictCode}\n\t\t\t</foreach>\n\t\t)\n\t\tORDER BY item.sort_order ASC\n\t</select>\n\n\t<!-- 通过字典code获取字典数据 -->\n\t<select id=\"queryDictTextByKey\" parameterType=\"String\"  resultType=\"String\">\n\t\t   select s.item_text from sys_dict_item s \n\t\t   where s.dict_id = (select id from sys_dict where dict_code = #{code})\n\t\t   and s.item_value = #{key}\n\t</select>\n\n\t<!-- 通过字典code获取字典数据，可批量查询 -->\n\t<select id=\"queryManyDictByKeys\" parameterType=\"String\"  resultType=\"org.jeecg.common.system.vo.DictModelMany\">\n\t\tSELECT\n\t\t\tdict.dict_code,\n\t\t\titem.item_text AS \"text\",\n\t\t\titem.item_value AS \"value\",\n\t\t\titem.item_color AS \"color\"\n\t\tFROM\n\t\t\tsys_dict_item item\n\t\tINNER JOIN sys_dict dict ON dict.id = item.dict_id\n\t\tWHERE dict.dict_code IN (\n\t\t\t<foreach item=\"dictCode\" collection=\"dictCodeList\" separator=\",\">\n\t\t\t\t#{dictCode}\n\t\t\t</foreach>\n\t\t)\n\t\tAND item.item_value IN (\n\t\t\t<foreach item=\"key\" collection=\"keys\" separator=\",\">\n\t\t\t\t#{key}\n\t\t\t</foreach>\n\t\t)\n\t</select>\n\t\n\t<!-- 获取全部字典项 -->\n\t<select id=\"queryAllDictItems\" resultType=\"org.jeecg.common.system.vo.DictModelMany\">\n\t\tSELECT\n\t\t\tdict.dict_code,\n\t\t\titem.item_text AS \"text\",\n\t\t\titem.item_value AS \"value\",\n\t\t\titem.item_color AS \"color\"\n\t\tFROM\n\t\t\tsys_dict_item item\n\t\tINNER JOIN sys_dict dict ON dict.id = item.dict_id\n\t\tWHERE dict.del_flag = 0\n\t\t<if test=\"tenantIdList!=null  and tenantIdList.size()>0\">\n\t\tAND  dict.tenant_id IN (\n\t\t\t<foreach item=\"tenantId\" collection=\"tenantIdList\" separator=\",\">\n\t\t\t\t#{tenantId}\n\t\t\t</foreach>\n\t\t)\n\t\t</if>\n\t\tAND item.status =1\n\t\torder by dict.dict_code, item.sort_order\n\t</select>\n\n\t<!-- 查询部门信息 作为字典数据 -->\n\t<select id=\"queryAllDepartBackDictModel\" resultType=\"org.jeecg.common.system.vo.DictModel\">\n\t\tselect id as \"value\",depart_name as \"text\" from sys_depart where del_flag = '0'\n\t</select>\n\n\t<!-- 查询用户信息 作为字典数据 -->\n\t<select id=\"queryAllUserBackDictModel\" resultType=\"org.jeecg.common.system.vo.DictModel\">\n\t\tselect username as \"value\",realname as \"text\" from sys_user where del_flag = '0'\n\t</select>\n\t\n\t\n\t<!-- *****************以下方法写法存在SQL注入风险***************** -->\n\n\t<!-- 重复校验 sql语句【已加入SQL注入check】 -->\n\t<sql id=\"checkDuplicateCountSqlFragment\">\n\t\tSELECT COUNT(1) FROM ${tableName} WHERE ${fieldName} = #{fieldVal}\n\t</sql>\n\t<select id=\"duplicateCheckCountSql\" resultType=\"Long\" parameterType=\"org.jeecg.modules.system.model.DuplicateCheckVo\">\n\t\t<include refid=\"checkDuplicateCountSqlFragment\"></include>\n\t\t AND id &lt;&gt; #{dataId}\n\t</select>\n\t<select id=\"duplicateCheckCountSqlNoDataId\" resultType=\"Long\" parameterType=\"org.jeecg.modules.system.model.DuplicateCheckVo\">\n\t\t<include refid=\"checkDuplicateCountSqlFragment\"></include>\n\t</select>\n\t\t\n\t<!-- 根据表名、显示字段名、存储字段名、父ID查询树   【已加入SQL注入check】 -->\n\t<select id=\"queryTreeList\" parameterType=\"Object\" resultType=\"org.jeecg.modules.system.model.TreeSelectModel\">\n\t\tselect ${text} as \"title\",\n\t\t\t   ${code} as \"key\",\n\t\t\t   <if test=\"hasChildField != null and hasChildField != ''\">\n\t\t\t\t   <choose>\n\t\t\t\t\t   <when test=\"converIsLeafVal!=null and converIsLeafVal==1\">\n\t\t\t\t\t\t   (case when ${hasChildField} = '1' then 0 else 1 end) as isLeaf,\n\t\t\t\t\t   </when>\n\t\t\t\t\t   <otherwise>\n\t\t\t\t\t\t   ${hasChildField} as isLeaf,\n\t\t\t\t\t   </otherwise>\n\t\t\t\t   </choose>\n\t\t\t   </if>\n\t\t\t   ${pidField} as parentId\n\t\t\t   from ${table}\n\t\t\t   where\n\t\t       <!-- 父ID条件 -->\n\t\t\t   <if test=\"query == null\">\n\t\t\t\t   <choose>\n\t\t\t\t\t   <when test=\"pid != null and pid != ''\">\n\t\t\t\t\t\t   ${pidField} = #{pid}\n\t\t\t\t\t   </when>\n\t\t\t\t\t   <otherwise>\n\t\t\t\t\t\t   (${pidField} = '' OR ${pidField} IS NULL)\n\t\t\t\t\t   </otherwise>\n\t\t\t\t   </choose>\n\t\t\t   </if>\n\t\t\t   <!-- 查询条件组装 -->\n\t\t\t   <if test=\"query!= null\">\n\t\t\t       1 = 1\n\t\t\t\t   <foreach collection=\"query.entrySet()\" item=\"value\"  index=\"key\" >\n\t\t\t\t\t   <choose>\n\t\t\t\t\t\t   <when test=\"key == 'tenant_id'\">\n\t\t\t\t\t\t\t   and tenant_id = #{value}\n\t\t\t\t\t\t   </when>\n\t\t\t               <when test=\"key == '_tableFilterSql'\">\n                               and ${value}\n                           </when>\n\t\t\t\t\t\t   <otherwise>\n\t\t\t\t\t\t\t   and ${key} LIKE #{value}\n\t\t\t\t\t\t   </otherwise>\n\t\t\t\t\t   </choose>\n\t\t\t\t   </foreach>\n\t\t\t\t\t <!-- 【issues/3709】自定义树查询条件没有处理父ID，没有树状结构了 -->\n\t\t\t\t\t <choose>\n\t\t\t\t\t\t <when test=\"pid != null and pid != ''\">\n\t\t\t\t\t\t\t and ${pidField} = #{pid}\n\t\t\t\t\t\t </when>\n\t\t\t\t\t\t <otherwise>\n\t\t\t\t\t\t\t and (${pidField} = '' OR ${pidField} IS NULL)\n\t\t\t\t\t\t </otherwise>\n\t\t\t\t\t </choose>\n\t\t\t   </if>\n\t</select>\n\n\t<!-- 分页查询字典表数据，支持text或code模糊查询匹配【已加入SQL注入check】 -->\n\t<select id=\"queryDictTablePageList\" parameterType=\"Object\" resultType=\"org.jeecg.common.system.vo.DictModel\">\n\t\tselect ${query.text} as \"text\", ${query.code} as \"value\" from ${query.table}\n\t\twhere\n\t\t<if test=\"query.keyword != null and query.keyword != ''\">\n\t\t\t<bind name=\"bindKeyword\" value=\"'%'+query.keyword+'%'\"/>\n\t\t\t (${query.text} like #{bindKeyword} or ${query.code} like #{bindKeyword})\n\t\t</if>\n\t\t<if test=\"query.codeValue != null and query.codeValue != ''\">\n\t\t\t ${query.code} = #{query.codeValue}\n\t\t</if>\n\t</select>\n\t\n\t<!--查询表字典数据，支持关键字和自定义查询条件【已加入SQL注入check】 -->\n\t<sql id=\"queryTableDictWithFilterSqlFragment\">\n\t\tselect ${text} as \"text\", ${code} as \"value\" from ${table}\n\t\t<if test=\"filterSql != null and filterSql != ''\">\n\t\t\twhere ${filterSql}\n\t\t</if>\n\t</sql>\n\t<!--查询表字典数据，分页返回-->\n\t<select id=\"queryPageTableDictWithFilter\" parameterType=\"String\"  resultType=\"org.jeecg.common.system.vo.DictModel\">\n\t\t<include refid=\"queryTableDictWithFilterSqlFragment\"></include>\n\t</select>\n\t<!--查询表字典数据，不分页返回-->\n\t<select id=\"queryTableDictWithFilter\" parameterType=\"String\"  resultType=\"org.jeecg.common.system.vo.DictModel\">\n\t\t<include refid=\"queryTableDictWithFilterSqlFragment\"></include>\n\t</select>\n\n\t<!-- 查询表字典的数据, 支持设置过滤条件和code值 精确匹配查询【已加入SQL注入check】 -->\n\t<select id=\"queryTableDictByKeysAndFilterSql\" parameterType=\"String\" resultType=\"org.jeecg.common.system.vo.DictModel\">\n\t\tselect ${text} as \"text\", ${code} as \"value\" from ${table} \n\t\twhere ${code} IN (\n\t\t<foreach item=\"key\" collection=\"codeValues\" separator=\",\">\n\t\t\t#{key}\n\t\t</foreach>\n\t\t)\n\t\t<if test=\"filterSql != null and filterSql != ''\">\n\t\t\tand ${filterSql}\n\t\t</if>\n\t</select>\n\n\t<!-- *****************以上方法写法存在SQL注入风险***************** -->\n\t\n\t<!--根据应用id获取字典列表和详情-->\n\t<select id=\"getDictListByLowAppId\" resultType=\"org.jeecg.modules.system.entity.SysDict\">\n\t\tselect id,dict_name,dict_code from sys_dict\n\t\twhere\n\t\tdel_flag = 0\n\t\tand low_app_id = #{lowAppId}\n\t\tand tenant_id = #{tenantId}\n\t</select>\n\n\t<!-- 还原被逻辑删除的字典 -->\n\t<update id=\"revertLogicDeleted\">\n\t\tUPDATE\n\t\tsys_dict\n\t\tSET\n\t\tdel_flag = 0\n\t\tWHERE\n\t\tdel_flag = 1\n\t\tAND id IN\n\t\t<foreach collection=\"ids\" item=\"dictId\" open=\"(\" close=\")\" separator=\",\" >\n\t\t\t#{dictId}\n\t\t</foreach>\n\t</update>\n\n\t<!-- 彻底删除字典 -->\n\t<delete id=\"removeLogicDeleted\">\n\t\tDELETE FROM sys_dict\n\t\tWHERE\n\t\tdel_flag = 1\n\t\tAND id IN\n\t\t<foreach collection=\"ids\" item=\"dictId\" open=\"(\" close=\")\" separator=\",\" >\n\t\t\t#{dictId}\n\t\t</foreach>\n\t</delete>\n\n</mapper>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysFillRuleMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysFillRuleMapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysGatewayRouteMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysGatewayRouteMapper\">\n\n    <!-- 还原被逻辑删除的路由 -->\n    <update id=\"revertLogicDeleted\">\n        UPDATE\n        sys_gateway_route\n        SET\n        del_flag = 0\n        WHERE\n        del_flag = 1\n        AND id IN\n        <foreach collection=\"ids\" item=\"routeId\" open=\"(\" close=\")\" separator=\",\" >\n            #{routeId}\n        </foreach>\n    </update>\n\n    <!-- 彻底删除路由 -->\n    <delete id=\"deleteLogicDeleted\">\n        DELETE FROM sys_gateway_route\n        WHERE\n        del_flag = 1\n        AND id IN\n        <foreach collection=\"ids\" item=\"routeId\" open=\"(\" close=\")\" separator=\",\" >\n            #{routeId}\n        </foreach>\n    </delete>\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysLogMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysLogMapper\">\n\n\t<!-- 清空所有日志记录 -->\n\t<delete id=\"removeAll\">\n\t\tDELETE FROM sys_log\n\t</delete>\n\t\n\t<!-- 获取访问总数 -->\n\t<select id=\"findTotalVisitCount\" resultType=\"long\">\n        select count(1) from sys_log where log_type = 1\n    </select>\n\n\t<!-- 获取今日访问总数 -->\n    <select id=\"findTodayVisitCount\" resultType=\"long\">\n        select count(1) from sys_log where log_type = 1 and create_time &gt;= #{dayStart} and create_time &lt; #{dayEnd}\n    </select>\n    \n\t<!-- 获取今日访问总IP数 -->\n    <select id=\"findTodayIp\" resultType=\"long\">\n        select count(distinct(ip)) from sys_log where log_type = 1 and create_time &gt;= #{dayStart} and create_time &lt; #{dayEnd}\n    </select>\n    \n   \t<!-- 首页访问统计 -->\n    <select id=\"findVisitCount\" resultType=\"java.util.HashMap\">\n       <if test=\"dbType == 'mysql' || dbType == 'mariadb'  || dbType == 'clickhouse'|| dbType == 'sqlite'\">\n         select count(*) as visit\n        \t   ,count(distinct(ip)) as ip\n        \t   ,DATE_FORMAT(create_time, '%Y-%m-%d') as tian\n        \t   ,DATE_FORMAT(create_time, '%m-%d') as type\n        \t   from sys_log \n         where log_type = 1 and create_time &gt;= #{dayStart} and create_time &lt; #{dayEnd}\n         group by tian,type\n         order by tian asc\n       </if>\n       <if test=\"dbType == 'oracle' || dbType == 'oracle12c' || dbType == 'dm'\">\n        select count(*) as visit\n        \t   ,count(distinct(ip)) as ip\n        \t   ,to_char(create_time, 'yyyy-mm-dd') as tian\n        \t   ,to_char(create_time, 'mm-dd') as type\n         from sys_log \n         where log_type = 1 and create_time &gt;= #{dayStart} and create_time &lt; #{dayEnd}\n         group by to_char(create_time, 'yyyy-mm-dd'),to_char(create_time, 'mm-dd') \n         order by to_char(create_time, 'yyyy-mm-dd') asc\n       </if>\n      <if test=\"dbType == 'postgresql' || dbType == 'kingbasees' || dbType == 'zenith'\">\n       select count(*) as visit\n        \t   ,count(distinct(ip)) as ip\n        \t   ,to_char(create_time, 'yyyy-mm-dd') as tian\n        \t   ,to_char(create_time, 'mm-dd') as type\n         from sys_log \n         where log_type = 1 and create_time &gt;= #{dayStart} and create_time &lt; #{dayEnd}\n         group by tian,type \n         order by tian asc \t   \n     </if>\n     <if test=\"dbType == 'sqlserver' || dbType == 'sqlserver2005'\">\n        select count(*) as visit\n        \t   ,count(distinct(ip)) as ip\n               ,CONVERT(varchar(100), create_time, 23) as tian\n        \t   ,RIGHT(CONVERT(varchar(100), create_time, 23),5) as type\n         from sys_log \n         where log_type = 1 and create_time &gt;= #{dayStart} and create_time &lt; #{dayEnd} \n         group by CONVERT(varchar(100), create_time, 23),RIGHT(CONVERT(varchar(100), create_time, 23),5)  \n         order by CONVERT(varchar(100), create_time, 23) asc\t  \n     </if>\n    </select>\n\n</mapper>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPackPermissionMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysPackPermissionMapper\">\n\n    <select id=\"getPermissionsByPackId\" resultType=\"java.lang.String\">\n        select permission_id from sys_tenant_pack_perms\n        where\n        pack_id = #{packId}\n    </select>\n\n    <!--删除产品包对应的菜单权限-->\n    <delete id=\"deletePackPermByTenantIds\">\n        delete from sys_tenant_pack_perms\n        where pack_id in(\n            select id from sys_tenant_pack where tenant_id in\n            <foreach collection=\"tenantIdList\" index=\"index\" item=\"tenantId\" open=\"(\" separator=\",\" close=\")\">\n                #{tenantId}\n            </foreach>\n        )\n    </delete>\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionDataRuleMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysPermissionDataRuleMapper\">\n\n\t<!--  查询权限 TODO 这里是不是可以不关联查找 sys_role 表 -->\n\t<select id=\"queryDataRuleIds\" resultType=\"java.lang.String\">\n\t\tselect data_rule_ids \n\t\t\tfrom sys_role_permission a \n\t\t\tjoin sys_permission b on a.permission_id = b.id\n\t\t\tjoin sys_role c on a.role_id = c.id\n\t\t\tjoin sys_user_role d on d.role_id = c.id\n\t\t\tjoin sys_user e on d.user_id = e.id\n\t\t\twhere e.username = #{username} and b.id =  #{permissionId}\n\t\t<!--update begin Author:lvdandan  Date:20200213 for：加入部门权限 -->\n\t\tunion\n\t\tselect data_rule_ids\n\t\t\tfrom sys_depart_role_permission a\n\t\t\tjoin sys_permission b on a.permission_id = b.id\n\t\t\tjoin sys_depart_role c on a.role_id = c.id\n\t\t\tjoin sys_depart_role_user d on d.drole_id = c.id\n\t\t\tjoin sys_user e on d.user_id = e.id\n\t\t\twhere e.username = #{username} and b.id = #{permissionId}\n\t\t<!--update end Author:lvdandan  Date:20200213 for：加入部门权限 -->\n\t</select>\n\n</mapper>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysPermissionMapper\">\n\n\n\t<resultMap id=\"TreeModel\" type=\"org.jeecg.modules.system.model.TreeModel\" >\n\t\t<result column=\"id\" property=\"key\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"name\" property=\"title\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"icon\" property=\"icon\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"parent_id\" property=\"parentId\" jdbcType=\"VARCHAR\"/>\n\t\t<result column=\"is_leaf\" property=\"isLeaf\" jdbcType=\"INTEGER\"/>\n\t</resultMap>\n\t\n\t<!-- 通过<resultMap>映射实体类属性名和表的字段名对应关系 -->\n\t<resultMap id=\"SysPermission\" type=\"org.jeecg.modules.system.entity.SysPermission\">\n\t   <!-- result属性映射非匹配字段 -->\n\t    <result column=\"is_route\" property=\"route\"/>\n\t    <result column=\"keep_alive\" property=\"keepAlive\"/>\n\t    <result column=\"is_leaf\" property=\"leaf\"/>\n\t</resultMap>\n\t\n\t\n\t<select id=\"queryListByParentId\" parameterType=\"Object\"  resultMap=\"TreeModel\">\n\t\t   SELECT   \n                   id\n                   ,parent_id\n                   ,name\n                   ,icon\n                   ,is_leaf\n\t\t   FROM   sys_permission\n\t\t<where>\n\t\t\t<choose>\n\t\t\t\t<when test=\"parentId != null and parentId != ''\">\n\t\t\t\t\tparent_id = #{parentId,jdbcType=VARCHAR}\n\t\t\t\t</when>\n\t\t\t\t<otherwise>\n\t\t\t\t\tparent_id is null\n\t\t\t\t</otherwise>\n\t\t\t</choose>\n\t\t</where>\n\t</select>\n\t\n\t<!-- 获取登录用户拥有的权限 -->\n\t<select id=\"queryByUser\" parameterType=\"Object\"  resultMap=\"SysPermission\">\n\t\t   SELECT * FROM (\n\t\t\t\tSELECT  p.id,\n\t\t\t\t\t\tp.parent_id,\n\t\t\t\t\t\tp.name,\n\t\t\t\t\t\tp.url,\n\t\t\t\t\t\tp.component,\n\t\t\t\t\t\tp.is_route,\n\t\t\t\t\t\tp.component_name,\n\t\t\t\t\t\tp.redirect,\n\t\t\t\t\t\tp.menu_type,\n\t\t\t\t\t\tp.perms,\n\t\t\t\t\t\tp.perms_type,\n\t\t\t\t\t\tp.sort_no,\n\t\t\t\t\t\tp.always_show,\n\t\t\t\t\t\tp.icon,\n\t\t\t\t\t\tp.is_leaf,\n\t\t\t\t\t\tp.keep_alive,\n\t\t\t\t\t\tp.hidden,\n\t\t\t\t\t\tp.hide_tab,\n\t\t\t\t\t\tp.rule_flag,\n\t\t\t\t\t\tp.status,\n\t\t\t\t\t\tp.internal_or_external\n\t\t\t   FROM  sys_permission p\n\t\t\t   WHERE p.del_flag = 0\n\t\t       AND  ( p.id in (\n\t\t\t   \t\tSELECT DISTINCT a.permission_id\n\t\t\t\t\tFROM sys_role_permission a\n\t\t\t\t\tJOIN sys_role b ON a.role_id = b.id\n\t\t\t\t\tJOIN sys_user_role c ON c.role_id = b.id AND c.user_id = #{userId,jdbcType=VARCHAR}\n\t\t\t\t\t)\n\t\t\t\t\tor (p.url like '%:code' and p.url like '/online%' and p.hidden = 1)\n\t\t\t\t\tor (p.url like '%:id' and p.url like '/online%' and p.hidden = 1)\n\t\t\t\t\tor p.url = '/online'\n\t\t       )\n\t\t\t<!--update begin Author:lvdandan  Date:20200213 for：加入部门权限 -->\n\t\t\t   UNION\n\t\t\t   SELECT   p.id,\n\t\t\t\t\t\tp.parent_id,\n\t\t\t\t\t\tp.name,\n\t\t\t\t\t\tp.url,\n\t\t\t\t\t\tp.component,\n\t\t\t\t\t\tp.is_route,\n\t\t\t\t\t\tp.component_name,\n\t\t\t\t\t\tp.redirect,\n\t\t\t\t\t\tp.menu_type,\n\t\t\t\t\t\tp.perms,\n\t\t\t\t\t\tp.perms_type,\n\t\t\t\t\t\tp.sort_no,\n\t\t\t\t\t\tp.always_show,\n\t\t\t\t\t\tp.icon,\n\t\t\t\t\t\tp.is_leaf,\n\t\t\t\t\t\tp.keep_alive,\n\t\t\t\t\t\tp.hidden,\n\t\t\t\t\t\tp.hide_tab,\n\t\t\t\t\t\tp.rule_flag,\n\t\t\t\t\t\tp.status,\n\t\t\t\t\t\tp.internal_or_external\n\t\t\tFROM  sys_permission p\n\t\t\tWHERE p.id in(\n\t\t        SELECT DISTINCT a.permission_id\n\t\t\t\tFROM  sys_depart_role_permission a\n\t\t\t\tINNER JOIN sys_depart_role b ON a.role_id = b.id\n\t\t\t\tINNER JOIN sys_depart_role_user c ON c.drole_id = b.id AND c.user_id = #{userId,jdbcType=VARCHAR}\n\t\t\t\t)\n\t\t\t   and p.del_flag = 0\n\t\t\t<!--update end Author:lvdandan  Date:20200213 for：加入部门权限 -->\n\t\t\t\n\t\t\t<!-- update begin Author: taoyan  Date:20200213 for：QQYUN-4303 【low app】 用户登录的时候 加载low app的套餐权限 加到用户信息 -->\n\t\t\tUNION\n\t\t\tSELECT  p.id,\n\t\t\t\t\tp.parent_id,\n\t\t\t\t\tp.name,\n\t\t\t\t\tp.url,\n\t\t\t\t\tp.component,\n\t\t\t\t\tp.is_route,\n\t\t\t\t\tp.component_name,\n\t\t\t\t\tp.redirect,\n\t\t\t\t\tp.menu_type,\n\t\t\t\t\tp.perms,\n\t\t\t\t\tp.perms_type,\n\t\t\t\t\tp.sort_no,\n\t\t\t\t\tp.always_show,\n\t\t\t\t\tp.icon,\n\t\t\t\t\tp.is_leaf,\n\t\t\t\t\tp.keep_alive,\n\t\t\t\t\tp.hidden,\n\t\t\t\t\tp.hide_tab,\n\t\t\t\t\tp.rule_flag,\n\t\t\t\t\tp.status,\n\t\t\t\t\tp.internal_or_external\n\t\t\tFROM  sys_permission p\n\t\t\tWHERE p.id in (\n\t\t\t\tSELECT distinct a.permission_id\n\t\t\t\tFROM sys_tenant_pack_perms a\n\t\t\t\tINNER JOIN sys_tenant_pack b ON a.pack_id = b.id AND b.STATUS = '1'\n\t\t\t\tINNER JOIN sys_tenant st ON st.id = b.tenant_id and st.del_flag = 0\n\t\t\t\tINNER JOIN sys_tenant_pack_user c ON c.pack_id = b.id AND c.STATUS = '1' AND c.user_id = #{userId,jdbcType=VARCHAR}\n\t\t\t)\n\t\t\tand p.del_flag = 0\n\t\t<!-- update end Author: taoyan  Date:20200213 for：QQYUN-4303 【low app】 用户登录的时候 加载low app的套餐权限 加到用户信息 -->\n\t\t\t\n\t\t   ) h order by h.sort_no ASC\n\t</select>\n\n\n\t<!-- 根据用户账号查询菜单权限 -->\n\t<select id=\"queryCountByUsername\" parameterType=\"Object\" resultType=\"int\">\n\t\tselect sum(cnt) from (\n\t\t  select count(*) as cnt\n\t\t\tfrom sys_role_permission a\n\t\t\tjoin sys_permission b on a.permission_id = b.id\n\t\t\tjoin sys_role c on a.role_id = c.id\n\t\t\tjoin sys_user_role d on d.role_id = c.id\n\t\t\tjoin sys_user e on d.user_id = e.id\n\t\t\twhere e.username = #{username}\n\t\t\t<if test=\"permission.id !=null and permission.id != ''\">\n\t\t\t\tand b.id =  #{permission.id}\n\t\t\t</if>\n\t\t\t<if test=\"permission.url !=null and permission.url != ''\">\n\t\t\t\tand b.url =  #{permission.url}\n\t\t\t</if>\n\t\tunion all\n\t\t  select count(*) as cnt\n\t\t\tfrom sys_permission z\n\t\t    join sys_depart_role_permission y on z.id = y.permission_id\n\t\t\tjoin sys_depart_role x on y.role_id = x.id\n\t\t\tjoin sys_depart_role_user w on w.drole_id = x.id\n\t\t\tjoin sys_user v on w.user_id = v.id\n\t\t\twhere v.username = #{username}\n\t\t\t<if test=\"permission.id !=null and permission.id != ''\">\n\t\t\t\tand z.id =  #{permission.id}\n\t\t\t</if>\n\t\t\t<if test=\"permission.url !=null and permission.url != ''\">\n\t\t\t\tand z.url =  #{permission.url}\n\t\t\t</if>\n\t\t) temp\n\t</select>\n\n\t<!-- 查询部门权限数据 -->\n\t<select id=\"queryDepartPermissionList\" parameterType=\"String\"  resultType=\"org.jeecg.modules.system.entity.SysPermission\">\n\t\tSELECT\n\t\t\tid,\n\t\t\tparent_id,\n\t\t\tname,\n\t\t\turl,\n\t\t\tcomponent,\n\t\t\tis_route,\n\t\t\tcomponent_name,\n\t\t\tredirect,\n\t\t\tmenu_type,\n\t\t\tperms,\n\t\t\tperms_type,\n\t\t\tsort_no,\n\t\t\talways_show,\n\t\t\ticon,\n\t\t\tis_leaf AS leaf,\n\t\t\tkeep_alive,\n\t\t\thidden,\n\t\t\thide_tab,\n\t\t\trule_flag,\n\t\t\tstatus,\n\t\t\tinternal_or_external\n\t\tFROM sys_permission\n\t\twhere del_flag = 0\n\t\tand id in (\n\t\t\tselect permission_id from sys_depart_permission where depart_id = #{departId}\n\t\t)\n\t\torder by sort_no ASC \n\t</select>\n\t\n\t<!--根据用户名称和test角色id查询权限-->\n\t<select id=\"queryPermissionByTestRoleId\" resultMap=\"SysPermission\">\n\t\tSELECT p.*\n\t\tFROM  sys_permission p\n\t\tWHERE exists(\n\t\t\t\t   select a.id from sys_role_permission a\n\t\t\t\t   join sys_role b on a.role_id = b.id\n\t\t\t\t   where p.id = a.permission_id AND b.id= 'ee8626f80f7c2619917b6236f3a7f02b'\n\t\t\t   )\n\t\t  and p.del_flag = 0\n\t</select>\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPositionMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysPositionMapper\">\n\n    <!--通过用户id获取职位数据-->\n    <select id=\"getPositionList\" resultType=\"org.jeecg.modules.system.entity.SysPosition\">\n        SELECT sp.name,sp.id FROM sys_position sp\n        INNER JOIN sys_user_position sup on sp.id = sup.position_id\n        WHERE\n        sup.user_id = #{userId}\n    </select>\n\n    <!--通过职位id获取职位名称-->\n    <select id=\"getPositionName\" resultType=\"org.jeecg.modules.system.entity.SysPosition\">\n        SELECT name FROM sys_position\n        WHERE\n        id IN\n        <foreach collection=\"postList\" index=\"index\" item=\"positionId\" open=\"(\" separator=\",\" close=\")\">\n            #{positionId}\n        </foreach>\n    </select>\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysRoleIndexMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysRoleIndexMapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysRoleMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysRoleMapper\">\n\n    <select id=\"listAllSysRole\" resultType=\"org.jeecg.modules.system.entity.SysRole\">\n        SELECT * from sys_role\n        WHERE 1=1\n        <if test=\"role.roleName!='' and role.roleName!=null\">\n            <bind name=\"bindKeyword\" value=\"'%'+role.roleName+'%'\"/>\n            AND role_name like #{bindKeyword}\n        </if>\n        <if test=\"role.roleCode!='' and role.roleCode!=null\">\n            <choose>\n                <when test=\"role.roleCode.indexOf(',') != -1\">\n                    AND role_code in\n                    <foreach item=\"item\" index=\"index\" collection=\"role.roleCode.split(',')\" open=\"(\" separator=\",\" close=\")\">\n                        #{item}\n                    </foreach>\n                </when>\n                <otherwise>\n                    <bind name=\"bindRoleCode\" value=\"'%'+role.roleCode+'%'\"/>\n                    AND role_code like #{bindRoleCode}\n                </otherwise>\n            </choose>\n        </if>\n        <!--增加id查询 for:【issues/7948】角色解决根据id查询回显不对-->\n        <if test=\"role.id!='' and role.id!=null\">\n            <choose>\n                <when test=\"role.id.indexOf(',') != -1\">\n                    AND id in\n                    <foreach item=\"item\" index=\"index\" collection=\"role.id.split(',')\" open=\"(\" separator=\",\" close=\")\">\n                        #{item}\n                    </foreach>\n                </when>\n                <otherwise>\n                    AND id = #{role.id}\n                </otherwise>\n            </choose>\n        </if>\n       order by create_time desc\n    </select>\n   \n\n    <select id=\"getRoleNoTenant\" resultType=\"org.jeecg.modules.system.entity.SysRole\">\n        SELECT * from sys_role\n        WHERE role_code = #{roleCode}\n    </select>\n\n    <!-- 根据用户id查询用户拥有的角色 -->\n    <select id=\"getRoleCodeListByUserId\" resultType=\"org.jeecg.modules.system.entity.SysRole\">\n        SELECT id, role_code from sys_role\n        WHERE id in (SELECT role_id from sys_user_role WHERE user_id = #{userId})\n        <if test=\"tenantId != null\">\n            AND tenant_id = #{tenantId}\n        </if>\n    </select>\n    \n    <!--根据用户id获取角色信息-->\n    <select id=\"getUserRoleByUserId\" resultType=\"org.jeecg.modules.system.vo.SysUserPositionVo\">\n        SELECT sr.role_name as name,sur.user_id FROM sys_role sr\n        RIGHT JOIN sys_user_role sur on sur.role_id = sr.id\n        WHERE sur.user_id IN\n        <foreach collection=\"userList\" index=\"index\" item=\"user\" open=\"(\" separator=\",\" close=\")\">\n            #{user.id}\n        </foreach>\n    </select>\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTableWhiteListMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysTableWhiteListMapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTenantMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysTenantMapper\">\n\n    <!--获取租户回收站的数据假删除-->\n    <select id=\"getRecycleBinPageList\" resultType=\"org.jeecg.modules.system.entity.SysTenant\">\n        SELECT id,name,company_logo,house_number,status FROM sys_tenant\n        WHERE\n        del_flag = 1\n        <if test=\"sysTenant.name!='' and sysTenant.name!=null\">\n            <bind name=\"name\" value=\"'%'+sysTenant.name+'%'\"/>\n            AND name like #{name}\n        </if>\n        <if test=\"sysTenant.houseNumber!='' and sysTenant.houseNumber!=null\">\n            <bind name=\"houseNumber\" value=\"'%'+sysTenant.houseNumber+'%'\"/>\n            AND house_number like #{houseNumber}\n        </if>\n    </select>\n\n    <!--彻底删除租户信息-->\n    <delete id=\"deleteByTenantId\">\n        DELETE FROM sys_tenant\n        WHERE\n        del_flag = 1\n        AND id in\n        <foreach collection=\"tenantIds\" index=\"index\" item=\"id\" open=\"(\" separator=\",\" close=\")\">\n            #{id}\n        </foreach>\n    </delete>\n    \n    <!--租户还原-->\n    <update id=\"revertTenantLogic\">\n        UPDATE sys_tenant set del_flag = 0\n        WHERE\n        del_flag = 1\n        AND id in\n        <foreach collection=\"tenantIds\" index=\"index\" item=\"id\" open=\"(\" separator=\",\" close=\")\">\n            #{id}\n        </foreach>\n    </update>\n\n    <!-- 用于统计 租户产品包的人员数量 -->\n    <select id=\"queryTenantPackUserCount\" resultType=\"org.jeecg.modules.system.vo.tenant.TenantPackUserCount\">\n        SELECT pack_code, count(*) as user_count FROM sys_tenant_pack a \n        join sys_tenant_pack_user b on a.id = b.pack_id\n        where a.tenant_id = #{tenantId} and b.tenant_id = #{tenantId}\n        and a.pack_code in ('superAdmin', 'accountAdmin', 'appAdmin')\n        and b.status = 1\n        group by a.pack_code\n    </select>\n\n    \n    <!-- 查询人员的产品包编码 -->\n    <select id=\"queryUserPackCode\" resultType=\"java.lang.String\">\n        SELECT a.pack_code FROM sys_tenant_pack a \n        join sys_tenant_pack_user b on a.id = b.pack_id\n        where a.tenant_id = #{tenantId} \n        and b.user_id = #{userId}\n        and b.status = 1\n    </select>\n\n    <!-- 查询人员是不是租户产品包的 超级管理员 -->\n    <select id=\"querySuperAdminCount\" resultType=\"java.lang.Integer\">\n        SELECT count(*) FROM sys_tenant_pack a \n        join sys_tenant_pack_user b on a.id = b.pack_id\n        where a.pack_code = 'superAdmin'\n        and a.tenant_id = #{tenantId} \n        and b.user_id = #{userId}\n        and b.status = 1\n    </select>\n\n    <!-- 查询产品包关联的用户列表 -->\n    <select id=\"queryPackUserList\" resultType=\"org.jeecg.modules.system.vo.tenant.TenantPackUser\">\n        SELECT c.id, c.username, c.realname, c.phone, c.avatar, a.pack_name, a.id as pack_id  FROM sys_user c\n        join sys_tenant_pack_user b on c.id = b.user_id\n        join sys_tenant_pack a on a.id = b.pack_id\n        join sys_user_tenant sut on a.tenant_id = sut.tenant_id and b.user_id = sut.user_id and sut.status = 1\n        where c.status = 1 \n        and c.del_flag = 0\n        and b.status = #{packUserStatus}\n        and a.tenant_id = #{tenantId}\n        <if test=\"packId!='' and packId!=null\">\n            and a.id = #{packId}\n        </if>\n    </select>\n\n\n    <!-- 根据用户ID 查询部门 -->\n    <select id=\"queryUserDepartList\" resultType=\"org.jeecg.modules.system.vo.tenant.UserDepart\">\n        SELECT c.id as user_id,a.depart_name  FROM sys_user c\n        join sys_user_depart b on c.id = b.user_id\n        join sys_depart a on a.id = b.dep_id\n        where c.status = 1 and c.del_flag = 0\n        and c.id in\n        <foreach collection=\"userIdList\" index=\"index\" item=\"id\" open=\"(\" separator=\",\" close=\")\">\n            #{id}\n        </foreach>\n    </select>\n\n    <!-- 根据用户ID 查询职位 -->\n    <select id=\"queryUserPositionList\" resultType=\"org.jeecg.modules.system.vo.tenant.UserPosition\">\n        SELECT c.id as user_id, name as position_name FROM sys_user c\n        join sys_user_position b on c.id = b.user_id\n        join sys_position a on a.id = b.position_id\n        where c.status = 1 and c.del_flag = 0\n        and c.id in\n        <foreach collection=\"userIdList\" index=\"index\" item=\"id\" open=\"(\" separator=\",\" close=\")\">\n            #{id}\n        </foreach>\n    </select>\n\n    <!--获取租户产品包用户列表-->\n    <select id=\"queryTenantPackUserList\" resultType=\"org.jeecg.modules.system.vo.tenant.TenantPackUser\">\n        SELECT c.id, c.username, c.realname, c.phone, c.avatar, a.pack_name, a.id as pack_id  FROM sys_user c\n        join sys_tenant_pack_user b on c.id = b.user_id\n        join sys_tenant_pack a on a.id = b.pack_id\n        where c.status = 1\n        and c.del_flag = 0\n        and b.status = #{status}\n        and a.tenant_id = #{tenantId}\n        <if test=\"packId!='' and packId!=null\">\n            and a.id = #{packId}\n        </if>\n    </select>\n    \n    <!--查看是否已经申请过了超级管理员-->\n    <select id=\"getApplySuperAdminCount\" resultType=\"java.lang.Long\">\n        SELECT count(*) FROM sys_tenant_pack a\n        join sys_tenant_pack_user b on a.id = b.pack_id\n        where a.pack_code = 'superAdmin'\n        and a.tenant_id = #{tenantId}\n        and b.user_id = #{userId}\n    </select>\n    \n    <!--根据用户id获取租户信息-->\n    <select id=\"getTenantListByUserId\" resultType=\"org.jeecg.modules.system.entity.SysTenant\">\n        SELECT st.id,st.name FROM sys_tenant st \n        LEFT JOIN sys_user_tenant sut on st.id= sut.tenant_id and st.status = 1 and sut.status='1'\n        WHERE sut.user_id = #{userId}\n    </select>\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTenantPackMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysTenantPackMapper\">\n\n    <!--删除租户产品包-->\n    <delete id=\"deletePackByTenantIds\">\n        delete from sys_tenant_pack\n        where tenant_id in\n        <foreach collection=\"tenantIdList\" index=\"index\" item=\"tenantId\" open=\"(\" separator=\",\" close=\")\">\n            #{tenantId}\n        </foreach>\n    </delete>\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysTenantPackUserMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysTenantPackUserMapper\">\n\n    <!-- 查询租户下 特定套餐角色的人员列表 -->\n    <select id=\"queryTenantPackUserNameList\" resultType=\"java.lang.String\">\n        select a.username from sys_user a \n        join sys_tenant_pack_user b on b.user_id = a.id \n        join sys_tenant_pack c on c.id = b.pack_id\n        where b.status = 1 and c.tenant_id = #{tenantId}\n        and c.pack_code IN (\n        <foreach item=\"packCode\" collection=\"packCodeList\" separator=\",\">\n            #{packCode}\n        </foreach>\n        )\n    </select>\n    \n    <!-- 判断当前用户在该租户下是否拥有管理员的权限 -->\n    <select id=\"izHaveBuyAuth\" resultType=\"java.lang.Long\">\n        SELECT count(1) from sys_tenant_pack_user stpu\n        left join sys_tenant_pack stp on stpu.pack_id = stp.id\n        WHERE stpu.tenant_id = #{tenantId}\n        and stpu.user_id = #{userId}\n        and stp.pack_code in('superAdmin','accountAdmin')\n    </select>\n\n    <!--根据租户id 删除租户产品包下的 用户-->\n    <delete id=\"deletePackUserByTenantId\">\n        delete from sys_tenant_pack_user where tenant_id = #{tenantId}\n        and user_id in\n        <foreach collection=\"userIds\" index=\"index\" item=\"userId\" open=\"(\" separator=\",\" close=\")\">\n            #{userId}\n        </foreach>\n    </delete>\n    \n    <!--根据多个租户id 删除租户产品包下的 用户-->\n    <delete id=\"deletePackUserByTenantIds\">\n        delete from sys_tenant_pack_user\n        where tenant_id in\n        <foreach collection=\"tenantIds\" index=\"index\" item=\"tenantId\" open=\"(\" separator=\",\" close=\")\">\n            #{tenantId}\n        </foreach>\n    </delete>\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysThirdAccountMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysThirdAccountMapper\">\n\n    <!-- 通过 sysUsername 集合批量查询 -->\n    <select id=\"selectThirdIdsByUsername\" resultType=\"org.jeecg.modules.system.entity.SysThirdAccount\">\n        SELECT third_user_id FROM sys_third_account\n        INNER JOIN sys_user ON sys_user.id = sys_third_account.sys_user_id\n        WHERE sys_third_account.third_type = #{thirdType}\n        <if test=\"null != tenantId and tenantId != 0\">\n           AND sys_third_account.tenant_id = #{tenantId}\n        </if>\n        AND\n        <!-- TODO in 查询数据量大的时候可能会报错 -->\n        <foreach collection=\"sysUsernameArr\" item=\"item\" open=\" sys_user.username IN (\" close=\")\" separator=\",\">#{item}</foreach>\n    </select>\n    \n    <!--查询被绑定的用户-->\n    <select id=\"getThirdUserBindByWechat\" resultType=\"org.jeecg.modules.system.vo.thirdapp.JwUserDepartVo\">\n        SELECT su.id userId, su.realname, su.avatar, sta.realname as wechatRealName, sta.third_user_id as wechatUserId, sta.id as thirdId\n        FROM sys_third_account sta \n        LEFT JOIN sys_user su on sta.sys_user_id = su.id\n        WHERE sta.tenant_id = #{tenantId}\n        AND sta.third_type = #{thirdType} \n    </select>\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysThirdAppConfigMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysThirdAppConfigMapper\">\n\n    <!--根据租户id获取钉钉/企业微信配置-->\n    <select id=\"getThirdConfigListByThirdType\" resultType=\"org.jeecg.modules.system.entity.SysThirdAppConfig\">\n        select * from sys_third_app_config\n        where tenant_id = #{tenantId}\n        and status = 1\n    </select>\n    \n    <!--根据租户id和第三方类别获取第三方配置-->\n    <select id=\"getThirdConfigByThirdType\" resultType=\"org.jeecg.modules.system.entity.SysThirdAppConfig\">\n        select * from sys_third_app_config\n        where tenant_id = #{tenantId}\n        and third_type = #{thirdType}\n        and status = 1\n    </select>\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserDepartMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysUserDepartMapper\">\n    <select id=\"getUserDepartByUid\" parameterType=\"String\" resultType=\"org.jeecg.modules.system.entity.SysUserDepart\">\n\t\tSELECT *\n\t\tFROM sys_user_depart\n\t\tWHERE user_id = #{userId, jdbcType=VARCHAR}\n    </select>\n\n\t<!-- 查询指定部门下的用户 并且支持用户账号模糊查询 -->\n\t<select id=\"queryDepartUserList\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n\t\tselect a.* from sys_user a\n\t\tjoin sys_user_depart b on b.user_id = a.id\n\t\tjoin sys_depart c on b.dep_id = c.id\n\t\t<bind name=\"bindOrgCode\" value=\"orgCode+'%'\"/>\n\t\twhere a.del_flag = 0 and c.org_code like #{bindOrgCode}\n\t\t<if test=\"realname!=null and realname!=''\">\n\t\t\t<!-- update by sunjianlei 20220119【#3348】SQL injection exists in /sys/user/queryUserByDepId；  -->\n\t\t\t<bind name=\"bindRealname\" value=\"'%'+realname+'%'\"/>\n\t\t\tand a.realname like #{bindRealname}\n\t\t</if>\n\t</select>\n\n\t<!-- 根据部门查询部门用户 分页 -->\n\t<select id=\"queryDepartUserPageList\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n\t\t<!-- update by wangshuai 2024-07-03【issues/6342】部门人员选择组件出现人员重复-->\n\t\tselect DISTINCT a.* from sys_user a\n\t\tleft join sys_user_depart b on b.user_id = a.id\n\t\tleft join sys_depart c on b.dep_id = c.id\n\t\t<bind name=\"bindOrgCode\" value=\"orgCode+'%'\"/>\n\t\twhere a.del_flag = 0 and a.status = 1 and c.org_code like #{bindOrgCode} and a.username!='_reserve_user_external'\n\t\t<if test=\"username!=null and username!=''\">\n\t\t\t<bind name=\"bindUsername\" value=\"'%'+username+'%'\"/>\n\t\t\tand a.username like #{bindUsername}\n\t\t</if>\n\t\t<if test=\"realname!=null and realname!=''\">\n\t\t    <bind name=\"bindRealname\" value=\"'%'+realname+'%'\"/>\n\t\t\tand a.realname like #{bindRealname}\n\t\t</if>\n\t\tORDER BY\n\t\ta.sort,a.create_time desc\n\t</select>\n\n    <!--获取用户信息（聊天专用）-->\n    <select id=\"getUserInformation\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n        select DISTINCT a.* from sys_user a\n        left join sys_user_depart b on b.user_id = a.id\n        left join sys_depart c on b.dep_id = c.id\n        <bind name=\"bindOrgCode\" value=\"orgCode+'%'\"/>\n        where\n          a.del_flag = 0 and a.status = 1\n          and c.org_code like #{bindOrgCode}\n          and a.username!='_reserve_user_external'\n          and a.id !=#{userId}\n        <if test=\"keyword!=null and keyword!=''\">\n            <bind name=\"bindKeyword\" value=\"'%'+keyword+'%'\"/>\n            and (a.username like #{bindKeyword} or a.realname like #{bindKeyword})\n        </if>\n    </select>\n\n\t<!--获取用户信息（简版流程专用）-->\n\t<select id=\"getProcessUserList\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n\t\tselect DISTINCT a.* from sys_user a\n\t\tleft join sys_user_depart b on b.user_id = a.id\n\t\tleft join sys_depart c on b.dep_id = c.id\n\t\t<bind name=\"bindOrgCode\" value=\"orgCode+'%'\"/>\n\t\twhere\n\t\ta.del_flag = 0 and a.status = 1\n\t\tand c.org_code like #{bindOrgCode}\n\t\tand a.username!='_reserve_user_external'\n\t\t<if test=\"keyword!=null and keyword!=''\">\n\t\t\t<bind name=\"bindKeyword\" value=\"'%'+keyword+'%'\"/>\n\t\t\tand (a.username like #{bindKeyword} or a.realname like #{bindKeyword})\n\t\t</if>\n\t\t<if test=\"tenantId!=null\">\n\t\t\tand a.id in (\n\t\t\t\tselect user_id from sys_user_tenant where tenant_id = #{tenantId} and status = '1'\n\t\t\t)\n\t\t</if>\n\t\t<!--【QQYUN-8239】用户角色，添加用户 返回2页数据，实际只显示一页 需要将不符合的用户id排除--> \n\t\t<if test=\"excludeUserIdList!=null and excludeUserIdList.size()>0\">\n\t\t\tand a.id not in\n\t\t\t<foreach collection=\"excludeUserIdList\" item=\"userId\" open=\"(\" close=\")\" separator=\",\">\n\t\t\t\t#{userId}\n\t\t\t</foreach>\n\t\t</if>\n\t\torder by a.sort, a.create_time desc\n\t</select>\n\t\n\t<!--获取租户下的部门-通过前台传过来的部门id-->\n    <select id=\"getTenantDepart\" resultType=\"java.lang.String\">\n\t\tselect id from sys_depart\n\t\twhere\n\t\tid in\n\t\t<foreach collection=\"departIds\" item=\"departId\" open=\"(\" close=\")\" separator=\",\" >\n\t\t\t#{departId}\n\t\t</foreach>\n\t\tand tenant_id = #{tenantId}\n\t</select>\n\t\n\t<!--根据当前租户和用户id查询用户部门数据-->\n\t<select id=\"getTenantUserDepart\" resultType=\"org.jeecg.modules.system.entity.SysUserDepart\">\n\t\tselect * from sys_user_depart\n\t\twhere\n\t\tuser_id = #{userId}\n\t\tand dep_id in(\n\t\t\tselect id from sys_depart where tenant_id = #{tenantId}\n\t\t)\n\t</select>\n\n\t<!--通过部门id和租户id获取用户-->\n\t<select id=\"getUsersByDepartTenantId\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n\t\tselect su.id,su.realname from sys_user_depart sud\n\t\tINNER JOIN sys_user su ON sud.user_id = su.id\n\t\tINNER JOIN sys_user_tenant sut ON su.id = sut.user_id\n\t\twhere\n\t\tsud.dep_id = #{departId}\n\t\tAND sut.tenant_id = #{tenantId}\n\t\tAND sut.status = '1'\n\t</select>\n\n\t<!--根据用户id和租户id,删除用户部门数据-->\n    <delete id=\"deleteUserDepart\">\n\t\tdelete from sys_user_depart\n\t\twhere\n\t\tuser_id = #{userId}\n\t\tand dep_id in(\n\t\t\tselect id from sys_depart where tenant_id = #{tenantId}\n\t\t)\n\t</delete>\n    \n    <!-- 通过用户id集合获取用户id和部门code -->\n    <select id=\"getUserDepPostByUserIds\" resultType=\"org.jeecg.modules.system.model.SysUserSysDepPostModel\">\n        select su.id,sd.org_code from sys_user_depart sud\n        JOIN sys_user su ON sud.user_id = su.id\n        JOIN sys_depart sd ON sud.dep_id = sd.id\n        where\n        sud.user_id in\n        <foreach collection=\"userIdList\" item=\"userId\" open=\"(\" close=\")\" separator=\",\">\n            #{userId}\n        </foreach>\n    </select>\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysUserMapper\">\n\n\t<!-- 根据用户名查询 -->\n\t<select id=\"getUserByName\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n\t\tselect * from  sys_user  where username = #{username} and del_flag = 0\n\t</select>\n\t\n\t<!-- 根据用户名查询用户ID -->\n\t<select id=\"getUserIdByName\" resultType=\"String\">\n\t\tselect id from  sys_user  where username = #{username} and del_flag = 0\n\t</select>\n\t\n\t<!-- 根据用户ids批量查询用户账号 -->\n\t<select id=\"getUsernameByIds\" resultType=\"String\">\n\t\tselect username from  sys_user  where del_flag = 0 and a.status = 1 and id in\n\t\t<foreach collection=\"userIds\" index=\"index\" item=\"id\" open=\"(\" separator=\",\" close=\")\">\n\t\t\t#{id}\n\t\t</foreach>\n\t</select>\n\n\t<!-- 根据部门Id查询 -->\n\t<select id=\"getUserByDepId\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n\t\tselect * from sys_user where del_flag = 0 and id in (select user_id from sys_user_depart where dep_id=#{departId})\n\t\t<if test=\"username!=null and username!=''\">\n\t\t\tand username = #{username}\n\t\t</if>\n\t</select>\n\n\t<!-- 查询部门和子部门下的所有用户账号 -->\n\t<select id=\"getUserAccountsByDepCode\" resultType=\"String\">\n\t\t<if test=\"orgCode != null\">\n\t\t\t<bind name=\"bindOrgCode\" value=\"orgCode+'%'\"/>\n\t\t</if>\n\t\tselect username from sys_user where del_flag = 0 and id in (select user_id from sys_user_depart where dep_id in (select id from sys_depart where org_code LIKE #{bindOrgCode}))\n\t</select>\n\n\t<!-- 查询用户的所属部门名称信息 -->\n\t<select id=\"getDepNamesByUserIds\" resultType=\"org.jeecg.modules.system.vo.SysUserDepVo\">\n\t\tselect d.depart_name,ud.user_id from sys_user_depart ud,sys_depart d where d.id = ud.dep_id and ud.user_id in\n\t\t<foreach collection=\"userIds\" index=\"index\" item=\"id\" open=\"(\" separator=\",\" close=\")\">\n\t\t\t#{id}\n\t\t</foreach>\n\t</select>\n\n\t<!-- 通过多个部门IDS，查询部门下的用户信息 -->\n\t<select id=\"getUserByDepIds\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n\t\tselect * from sys_user where del_flag = 0\n\t\t<if test=\"departIds!=null  and departIds.size()>0\">\n\t\t\tand id in (select user_id from sys_user_depart where dep_id in\n\t\t\t<foreach collection=\"departIds\" index=\"index\" item=\"id\" open=\"(\" separator=\",\" close=\")\">\n\t\t\t\t#{id}\n\t\t\t</foreach>\n\t\t\t)\n\t\t</if>\n\t\t<if test=\"username!=null and username!=''\">\n\t\t\tand username = #{username}\n\t\t</if>\n\t</select>\n\n\t<!-- 根据角色Id查询 -->\n\t<select id=\"getUserByRoleId\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n\t\tselect * from sys_user where del_flag = 0 and id in (select user_id from sys_user_role where role_id=#{roleId})\n\t\t<if test=\"username!=null and username!=''\">\n\t\t\tand username = #{username}\n\t\t</if>\n\t\t<if test=\"realname!=null and realname!=''\">\n\t\t\tand realname LIKE concat(concat('%',#{realname}),'%')\n\t\t</if>\n\t</select>\n\t\n\t<!--  修改用户部门code -->\n\t<update id=\"updateUserDepart\">\n\t\tUPDATE sys_user SET\n\t\t<if test=\"orgCode!=null and loginTenantId!=null\">\n\t\t\t org_code = #{orgCode, jdbcType=VARCHAR}\n\t\t\t,login_tenant_id = #{loginTenantId, jdbcType=VARCHAR}\n\t\t</if>\n\t\t<if test=\"orgCode==null and loginTenantId!=null\">\n\t\t\tlogin_tenant_id = #{loginTenantId, jdbcType=VARCHAR}\n\t\t</if>\n\t\t<if test=\"orgCode!=null and loginTenantId==null\">\n\t\t\torg_code = #{orgCode, jdbcType=VARCHAR}\n\t\t</if>\n\t\t<if test=\"orgCode==null and loginTenantId==null\">\n\t\t\torg_code = #{orgCode, jdbcType=VARCHAR}\n\t\t</if>\n\t\twhere username = #{username}\n\t</update>\n\n\t<!-- 根据手机号查询 -->\n\t<select id=\"getUserByPhone\"  resultType=\"org.jeecg.modules.system.entity.SysUser\">\n\t\tselect * from  sys_user  where phone = #{phone} and del_flag = 0\n\t</select>\n\t\n\t<!-- 根据邮箱查询用户信息 -->\n\t<select id=\"getUserByEmail\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n\tselect * from  sys_user  where email = #{email} and del_flag = 0\n\t</select>\n\n\t<!-- SQL片段：getUserByOrgCode 的 FROM 和 WHERE 部分 -->\n\t<sql id=\"getUserByOrgCodeFromSql\">\n\t\tFROM\n\t\tsys_depart\n\t\tINNER JOIN sys_user_depart ON sys_user_depart.dep_id = sys_depart.id\n\t\tINNER JOIN sys_user ON sys_user.id = sys_user_depart.user_id\n\t\tWHERE\n\t\t<if test=\"orgCode == null\">\n\t\t\t<bind name=\"bindOrgCode\" value=\"'%'\"/>\n\t\t</if>\n\t\t<if test=\"orgCode != null\">\n\t\t\t<bind name=\"bindOrgCode\" value=\"orgCode+'%'\"/>\n\t\t</if>\n\t\tsys_user.del_flag = 0 AND sys_depart.org_code LIKE #{bindOrgCode}\n\n\t\t<if test=\"userParams != null\">\n\t\t\t<if test=\"userParams.realname != null and userParams.realname != ''\">\n\t\t\t\tAND sys_user.realname LIKE concat(concat('%',#{userParams.realname}),'%')\n\t\t\t</if>\n\t\t\t<if test=\"userParams.workNo != null and userParams.workNo != ''\">\n\t\t\t\tAND sys_user.work_no LIKE concat(concat('%',#{userParams.workNo}),'%')\n\t\t\t</if>\n\t\t</if>\n\t</sql>\n\n\t<!-- 根据 orgCode 查询用户，包括子部门下的用户 -->\n\t<select id=\"getUserByOrgCode\" resultType=\"org.jeecg.modules.system.model.SysUserSysDepartModel\">\n\t\tSELECT\n\t\t\tsys_user.id AS id,\n\t\t\tsys_user.realname AS realname,\n\t\t\tsys_user.avatar AS avatar,\n\t\t\tsys_user.sex AS sex,\n\t\t\tsys_user.birthday AS birthday,\n\t\t\tsys_user.work_no AS workNo,\n\t\t\tsys_user.telephone AS telephone,\n\t\t\tsys_user.email AS email,\n\t\t\tsys_user.phone AS phone,\n\t\t\tsys_depart.id AS departId,\n\t\t\tsys_depart.depart_name AS departName\n\t\t<include refid=\"getUserByOrgCodeFromSql\"/>\n\t\tORDER BY\n            sys_user.sort,sys_user.create_time desc\n\t</select>\n\n\t<!-- 查询 getUserByOrgCode 的总数-->\n\t<select id=\"getUserByOrgCodeTotal\" resultType=\"java.lang.Integer\">\n\t\tSELECT COUNT(1) <include refid=\"getUserByOrgCodeFromSql\"/>\n\t</select>\n\n\t<!-- 批量删除角色的与用户关系-->\n\t<update id=\"deleteBathRoleUserRelation\">\n\t\tdelete from sys_user_role\n\t\twhere role_id in\n\t\t<foreach item=\"id\" collection=\"roleIdArray\" open=\"(\" separator=\",\" close=\")\">\n\t\t\t#{id}\n\t\t</foreach>\n\t</update>\n\t<!-- 批量删除角色的与权限关系-->\n\t<update id=\"deleteBathRolePermissionRelation\">\n\t\tdelete from sys_role_permission\n\t\twhere role_id in\n\t\t<foreach item=\"id\" collection=\"roleIdArray\" open=\"(\" separator=\",\" close=\")\">\n\t\t\t#{id}\n\t\t</foreach>\n\t</update>\n\n\t<!-- 查询被逻辑删除的用户 -->\n\t<select id=\"selectLogicDeleted\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n\t\tSELECT * FROM sys_user ${ew.customSqlSegment}\n\t</select>\n\n\t<!-- 更新被逻辑删除的用户 -->\n\t<update id=\"revertLogicDeleted\">\n\t\tUPDATE\n\t\t\tsys_user\n\t\tSET\n\t\t\tdel_flag = 0,\n\t\t\tupdate_by = #{entity.updateBy},\n\t\t\tupdate_time = #{entity.updateTime}\n\t\tWHERE\n\t\t\tdel_flag = 1\n\t\t\tAND id IN\n\t\t\t<foreach collection=\"userIds\" item=\"userId\" open=\"(\" close=\")\" separator=\",\" >\n\t\t\t\t#{userId}\n\t\t\t</foreach>\n\t</update>\n\n\t<!-- 彻底删除被逻辑删除的用户 -->\n\t<delete id=\"deleteLogicDeleted\">\n\t\tDELETE FROM sys_user WHERE del_flag = 1 AND id IN\n\t\t<foreach collection=\"userIds\" item=\"userId\" open=\"(\" close=\")\" separator=\",\" >\n\t\t\t#{userId}\n\t\t</foreach>\n\t</delete>\n\n\t<!-- 更新空字符串为null -->\n\t<update id=\"updateNullByEmptyString\">\n\t\tUPDATE sys_user\n\t\t<if test=\"fieldName == 'email'\">\n\t\t\tSET email = NULL WHERE email = ''\n\t\t</if>\n\t\t<if test=\"fieldName == 'phone'\">\n\t\t\tSET phone = NULL WHERE phone = ''\n\t\t</if>\n\t</update>\n\n\t<!-- 通过多个部门IDS，查询部门下的用户信息 -->\n\t<select id=\"queryByDepIds\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n\t\tselect * from sys_user where del_flag = 0\n\t\t<if test=\"departIds!=null  and departIds.size()>0\">\n\t\t\tand id in (select user_id from sys_user_depart where dep_id in\n\t\t\t<foreach collection=\"departIds\" index=\"index\" item=\"id\" open=\"(\" separator=\",\" close=\")\">\n\t\t\t\t#{id}\n\t\t\t</foreach>\n\t\t\t)\n\t\t</if>\n\t\t<if test=\"username!=null and username!=''\">\n\t\t\tand username != #{username}\n\t\t</if>\n\t</select>\n\n\t<!--根据角色查询用户-->\n\t<select id=\"selectUserListByRoleId\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n\t\tselect DISTINCT a.* from sys_user a\n\t\tleft join sys_user_role sur on sur.user_id = a.id\n\t\twhere\n\t\ta.del_flag = 0 and a.status = 1\n\t\tand a.username!='_reserve_user_external'\n\t\tand sur.role_id=#{roleId}\n\t\t<if test=\"keyword!=null and keyword!=''\">\n\t\t\t<bind name=\"bindKeyword\" value=\"'%'+keyword+'%'\"/>\n\t\t\tand (a.username like #{bindKeyword} or a.realname like #{bindKeyword})\n\t\t</if>\n\n\t\t<if test=\"tenantId!=null\">\n\t\t\tand a.id in (\n\t\t\t\tselect user_id from sys_user_tenant where tenant_id = #{tenantId} and status = '1'\n\t\t\t)\n\t\t</if>\n\t\t  \n\t\t<!--【QQYUN-8239】用户角色，添加用户 返回2页数据，实际只显示一页 需要将不符合的用户id排除-->\n\t\t<if test=\"excludeUserIdList!=null and excludeUserIdList.size()>0\">\n\t\t\tand a.id not in\n\t\t\t<foreach collection=\"excludeUserIdList\" item=\"userId\" open=\"(\" close=\")\" separator=\",\">\n\t\t\t\t#{userId}\n\t\t\t</foreach>\n\t\t</if>\n\t\torder by a.sort, a.create_time desc\n\t</select>\n\n\t<!--获取租户下的用户离职列表信息-->\n\t<select id=\"getTenantQuitList\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n\t\tselect su.id,su.username,su.realname,su.sex,su.avatar,su.create_time,sut.create_by from sys_user su\n\t\tjoin sys_user_tenant sut on sut.user_id = su.id and sut.status = '2'\n\t\twhere\n\t\tsu.status = 1\n\t\tand su.del_flag = 0\n\t\t<if test=\"tenantId != 0\">\n\t\t\tand sut.tenant_id = #{tenantId}\n\t\t</if>\n\t</select>\n\n\t<!--获取租户下的有效用户ids信息-->\n\t<select id=\"getTenantUserIdList\" resultType=\"java.lang.String\" parameterType=\"java.lang.Integer\">\n\t\tSELECT DISTINCT( su.id ) id\n\t\tFROM sys_user su\n\t\t<choose>\n\t\t\t<when test=\"tenantId!=null and tenantId != 0\">\n\t\t\t\tJOIN sys_user_tenant sut ON sut.user_id = su.id\n\t\t\t\tAND sut.STATUS = '1'\n\t\t\t\tAND sut.tenant_id = #{tenantId}\n\t\t\t\tAND su.STATUS = 1\n\t\t\t\tAND su.del_flag = 0\n\t\t\t</when>\n\t\t\t<otherwise>\n\t\t\t\tWHERE su.STATUS = 1\n\t\t\t\tAND su.del_flag = 0\n\t\t\t</otherwise>\n\t\t</choose>\n\t</select>\n\t\n  <!--更新刪除状态和离职状态-->\n  <update id=\"updateStatusAndFlag\">\n    UPDATE\n    sys_user\n    SET\n    del_flag = 0,\n    update_by = #{sysUser.updateBy},\n    update_time = #{sysUser.updateTime},\n    status = 1\n    WHERE\n    del_flag = 1\n    AND id IN\n    <foreach collection=\"userIds\" item=\"userId\" open=\"(\" close=\")\" separator=\",\" >\n      #{userId}\n    </foreach>\n  </update>\n\n\t<!--根据部门id获取用户数据-->\n\t<select id=\"getUserByDepartsTenantId\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n\t\tselect su.* from sys_user su\n\t\tjoin sys_user_tenant sut on su.id = sut.user_id\n\t\twhere su.del_flag = 0\n\t\t<if test=\"departIds!=null  and departIds.size()>0\">\n\t\t\tand su.id in (select user_id from sys_user_depart\n\t\t\twhere dep_id in\n\t\t\t<foreach collection=\"departIds\" index=\"index\" item=\"id\" open=\"(\" separator=\",\" close=\")\">\n\t\t\t\t#{id}\n\t\t\t</foreach>\n\t\t\t)\n\t\t</if>\n\t\tand sut.tenant_id=#{tenantId}\n        and sut.status = '1'\n\t</select>\n    \n\n    <!-- SQL片段：getDepPostListByIdUserName WHERE 部分 -->\n    <sql id=\"getDepPostListByIdUserNameSql\">\n        WHERE\n        su.status = 1\n        and su.del_flag = 0\n        and username <![CDATA[ != ]]> '_reserve_user_external'\n        <if test=\"userId!= null and userId != ''\">\n            and su.id = #{userId}\n        </if> \n        <if test=\"userName!= null and userName != ''\">\n            <bind name=\"bindUserName\" value=\"userName+'%'\"/>\n            and su.username like #{bindUserName}\n        </if>\n        <if test=\"userIdList != null and userIdList.size() > 0\">\n            <foreach item=\"idItem\" index=\"index\" collection=\"userIdList\" open=\" and su.id IN (\" separator=\",\" close=\")\">\n                #{idItem}\n            </foreach>\n        </if>\n        <if test=\"userNameList != null and userNameList.size() > 0\">\n            <foreach item=\"usernameItem\" index=\"index\" collection=\"userNameList\" open=\" and su.username IN (\" separator=\",\" close=\")\">\n                #{usernameItem}\n            </foreach>\n        </if>\n    </sql>\n    \n    <!-- 根据部门id和用户名获取部门岗位用户分页列表 -->\n\t<select id=\"getDepPostListByIdUserName\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n        SELECT su.* from\n        (\n            SELECT su.create_time,su.realname,su.username,su.phone,su.iz_hide_contact,su.sort FROM sys_user su\n            <include refid=\"getDepPostListByIdUserNameSql\"/>\n            union\n            select DISTINCT su.create_time,su.realname,su.username,su.phone,su.iz_hide_contact,su.sort FROM sys_user su\n            JOIN sys_user_dep_post sudp ON su.id = sudp.user_id\n            <include refid=\"getDepPostListByIdUserNameSql\"/>\n        ) su\n        order by su.sort,su.create_time desc\n    </select>\n\n    <!-- SQL片段：getDepartPostListByIdUserRealName WHERE部分 -->\n    <sql id=\"getDepartPostListByIdUserRealNameSql\">\n        WHERE\n        su.status = 1\n        and su.del_flag = 0\n        and username <![CDATA[ != ]]> '_reserve_user_external'\n        <if test=\"realname!= null and realname != ''\">\n            <bind name=\"bindRealname\" value=\"realname+'%'\"/>\n            and su.id like #{bindRealname}\n        </if>\n        <if test=\"username!= null and username != ''\">\n            <bind name=\"bindUserName\" value=\"username+'%'\"/>\n            and su.username like #{bindUserName}\n        </if>\n        <if test=\"orgCode!= null and orgCode != ''\">\n            <bind name=\"bindOrgCode\" value=\"orgCode+'%'\"/>\n            and sd.org_code like #{bindOrgCode}\n        </if>\n    </sql>\n    \n    <!-- 根据部门id、用户名和真实姓名获取部门岗位用户分页列表 -->\n\t<select id=\"getDepartPostListByIdUserRealName\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n        SELECT su.* from\n        (\n            SELECT su.create_time,su.realname,su.username,su.phone,su.iz_hide_contact,su.sort FROM sys_user su \n            join sys_depart sd on su.main_dep_post_id = sd.id\n            <include refid=\"getDepartPostListByIdUserRealNameSql\"/>\n            union\n            SELECT DISTINCT su.create_time,su.realname,su.username,su.phone,su.iz_hide_contact,su.sort FROM sys_user su \n            join sys_depart sd on su.main_dep_post_id = sd.id\n            join sys_user_dep_post sudp on su.id = sudp.user_id\n            <include refid=\"getDepartPostListByIdUserRealNameSql\"/>\n        ) su\n        order by su.sort,su.create_time desc\n    </select>\n\n    <!-- SQL片段：queryDepartPostUserByOrgCode WHERE部分 -->\n    <sql id=\"queryDepartPostUserByOrgCodeSql\">\n        WHERE\n        <if test=\"orgCode == null\">\n            <bind name=\"bindOrgCode\" value=\"'%'\"/>\n        </if>\n        <if test=\"orgCode != null\">\n            <bind name=\"bindOrgCode\" value=\"orgCode+'%'\"/>\n        </if>\n        su.del_flag = 0 AND sd.org_code LIKE #{bindOrgCode}\n        <if test=\"userParams != null\">\n            <if test=\"userParams.realname != null and userParams.realname != ''\">\n                <bind name=\"bindRealname\" value=\"'%'+ userParams.realname +'%'\"/>\n                AND su.realname LIKE bindRealname\n            </if>\n            <if test=\"userParams.workNo != null and userParams.workNo != ''\">\n                <bind name=\"bindWorkNo\" value=\"'%'+ userParams.workNo +'%'\"/>\n                AND su.work_no LIKE bindWorkNo\n            </if>\n        </if>\n    </sql>\n    <!-- 查询部门、岗位下的用户 包括子部门下的用户 -->\n\t<select id=\"queryDepartPostUserByOrgCode\" resultType=\"org.jeecg.modules.system.model.SysUserSysDepPostModel\">\n        SELECT su.* from\n        (\n            SELECT su.id, su.create_time, su.realname, su.username, su.phone, su.avatar, su.birthday, su.sex, su.email,\n            su.status, su.del_flag, su.telephone, su.activiti_sync, su.user_identity, su.depart_ids, su.main_dep_post_id,\n            su.sort,su.iz_hide_contact,su.position_type,su.work_no\n            FROM sys_user su join sys_user_depart sud on su.id = sud.user_id\n            join sys_depart sd on sud.dep_id = sd.id\n            <include refid=\"queryDepartPostUserByOrgCodeSql\"/>\n            union\n            SELECT su.id, su.create_time, su.realname, su.username, su.phone, su.avatar, su.birthday, su.sex, su.email,\n            su.status, su.del_flag, su.telephone, su.activiti_sync, su.user_identity, su.depart_ids, su.main_dep_post_id,\n            su.sort,su.iz_hide_contact,su.position_type,su.work_no\n            FROM sys_user su join sys_depart sd on su.main_dep_post_id = sd.id\n            <include refid=\"queryDepartPostUserByOrgCodeSql\"/>\n            union\n            SELECT su.id, su.create_time, su.realname, su.username, su.phone, su.avatar, su.birthday, su.sex, su.email,\n            su.status, su.del_flag, su.telephone, su.activiti_sync, su.user_identity, su.depart_ids, su.main_dep_post_id,\n            su.sort,su.iz_hide_contact,su.position_type,su.work_no\n            FROM sys_user su join sys_user_dep_post sudp on su.id = sudp.user_id\n            join sys_depart sd on sd.id = sudp.dep_id \n            <include refid=\"queryDepartPostUserByOrgCodeSql\"/>\n        ) su\n        order by su.sort,su.create_time desc\n    </select>\n    \n    <!--查询部门下的用户包括子部门下的用户-->\n\t<select id=\"queryDepartUserByOrgCode\" resultType=\"org.jeecg.modules.system.model.SysUserSysDepPostModel\">\n        SELECT DISTINCT su.id, su.realname, su.avatar, su.sex, su.birthday, su.telephone, su.email, su.phone, su.main_dep_post_id, su.iz_hide_contact, su.sort, su.create_time\n        FROM sys_user su join sys_user_depart sud on su.id = sud.user_id\n        join sys_depart sd on sud.dep_id = sd.id\n        where\n        su.status = 1\n        and su.del_flag = 0\n        and su.username <![CDATA[ != ]]> '_reserve_user_external'\n        <if test=\"orgCode == null\">\n            <bind name=\"bindOrgCode\" value=\"'%'\"/>\n        </if>\n        <if test=\"orgCode != null\">\n            <bind name=\"bindOrgCode\" value=\"orgCode+'%'\"/>\n        </if>\n        and sd.del_flag = 0 and sd.org_code LIKE #{bindOrgCode}\n        <if test=\"userParams != null\">\n            <if test=\"userParams.realname != null and userParams.realname != ''\">\n                <bind name=\"bindRealname\" value=\"'%'+ userParams.realname +'%'\"/>\n                and su.realname like #{bindRealname}\n            </if>\n        </if>\n        order by su.sort,su.create_time desc\n    </select>\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserPositionMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysUserPositionMapper\">\n\n    <!--获取职位用户列表-->\n    <select id=\"getPositionUserList\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n        SELECT su.realname,su.id,su.username,su.email,su.phone,su.work_no\n        FROM sys_user_position sup\n        INNER JOIN sys_user su on sup.user_id = su.id and su.del_flag = 0\n        WHERE\n        sup.position_id = #{positionId}\n        ORDER BY sup.create_time DESC\n    </select>\n\n    <!--根据用户id查询职位id-->\n    <select id=\"getPositionIdByUserId\" resultType=\"java.lang.String\">\n        SELECT position_id FROM sys_user_position\n        WHERE\n        user_id = #{userId}\n        ORDER BY create_time DESC\n    </select>\n\n    <!--根据用户ID和租户ID获取职位id-->\n    <select id=\"getPositionIdByUserTenantId\" resultType=\"java.lang.String\">\n        SELECT sp.id FROM sys_user_position sup\n        LEFT JOIN sys_position sp ON sup.position_id = sp.id\n        WHERE\n        sup.user_id = #{userId}\n       <if test=\"tenantId != null and tenantId != 0\">\n           AND sp.tenant_id = #{tenantId}\n       </if>\n        order by sup.create_time desc\n    </select>\n\n    <!--职位列表移除成员-->\n    <update id=\"removePositionUser\">\n        DELETE FROM sys_user_position\n        WHERE\n        position_id = #{positionId}\n        AND user_id IN\n        <foreach collection=\"userIdList\" index=\"index\" item=\"userId\" open=\"(\" separator=\",\" close=\")\">\n            #{userId}\n        </foreach>\n    </update>\n    \n    <!--根据用户id获取用户职位-->\n    <select id=\"getPositionIdByUsersTenantId\" resultType=\"org.jeecg.modules.system.vo.SysUserPositionVo\">\n        SELECT sp.name,sup.user_id FROM sys_position sp\n        RIGHT JOIN sys_user_position sup on sup.position_id = sp.id\n        WHERE sup.user_id IN\n        <foreach collection=\"userIdList\" index=\"index\" item=\"userIds\" open=\"(\" separator=\",\" close=\")\">\n            #{userIds.id}\n        </foreach>\n        AND sp.tenant_id = #{tenantId}\n    </select>\n    \n    <!--根据职位名称和租户id，删除用户职位关系表-->\n    <delete id=\"deleteUserPosByNameAndTenantId\">\n        DELETE FROM sys_user_position\n        WHERE user_id = #{userId} \n        AND position_id in ( \n            SELECT id FROM sys_position where name in\n            <foreach collection=\"positionNames\" index=\"index\" item=\"name\" open=\"(\" separator=\",\" close=\")\">\n                #{name}\n            </foreach>\n            AND tenant_id = #{tenantId}\n        )\n    </delete>\n</mapper>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserTenantMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.system.mapper.SysUserTenantMapper\">\n\n    <!-- 通过租户id获取数据 -->\n    <select id=\"getPageUserList\" resultType=\"org.jeecg.modules.system.entity.SysUser\">\n        SELECT su.id,su.username,su.realname,su.sex,su.phone FROM sys_user su\n        JOIN sys_user_tenant str ON str.user_id = su.id and str.status = '1'\n        WHERE su.del_flag = 0\n        <if test=\"userTenantId!=null\">\n            AND str.tenant_id = #{userTenantId}\n        </if>\n        <if test=\"user.username!='' and user.username!=null\">\n            <bind name=\"bindKeyword\" value=\"'%'+user.username+'%'\"/>\n            AND su.username like #{bindKeyword}\n        </if>\n        <if test=\"user.realname!='' and user.realname!=null\">\n            <bind name=\"bindRealName\" value=\"'%'+user.realname+'%'\"/>\n            AND su.realname like #{bindRealName}\n        </if>\n        ORDER BY su.create_time DESC\n    </select>\n\n    <!--根据租户id获取用户ids-->\n    <select id=\"getUserIdsByTenantId\" resultType=\"java.lang.String\">\n        SELECT user_id FROM sys_user_tenant\n        WHERE\n        status = '1'\n        and\n        tenant_id = #{tenantId}\n    </select>\n    \n    <!--通过用户id获取租户ids-->\n    <select id=\"getTenantIdsByUserId\" resultType=\"java.lang.Integer\">\n        SELECT tenant_id FROM sys_user_tenant\n        WHERE status = '1'\n        and user_id = #{userId}\n    </select>\n\n    <!--通过用户id获取租户列表-->\n    <select id=\"getTenantListByUserId\" resultType=\"org.jeecg.modules.system.vo.SysUserTenantVo\">\n        SELECT st.id as tenantUserId,st.name,st.trade,st.house_number,st.create_by,sut.status as userTenantStatus,sut.user_id as id\n        FROM sys_user_tenant sut\n        LEFT JOIN sys_tenant st ON sut.tenant_id = st.id\n        WHERE st.status = 1\n        AND st.del_flag = 0\n        AND sut.user_id = #{userId}\n        <if test=\"userTenantStatus!=null\">\n            AND sut.status in\n            <foreach collection=\"userTenantStatus\" index=\"index\" item=\"status\" open=\"(\" separator=\",\" close=\")\">\n                #{status}\n            </foreach>\n        </if>\n    </select>\n\n    <!--通过状态、当前登录人的用户名，租户id，查询用户id-->\n    <select id=\"getUserIdsByCreateBy\" resultType=\"java.lang.String\">\n        SELECT sut.user_id \n        FROM sys_user_tenant sut\n        JOIN sys_tenant st on sut.tenant_id = st.id\n        WHERE sut.tenant_id = #{tenantId}\n        AND st.del_flag = 0\n        <if test=\"userTenantStatus!=null\">\n            AND sut.status in\n            <foreach collection=\"userTenantStatus\" index=\"index\" item=\"status\" open=\"(\" separator=\",\" close=\")\">\n                #{status}\n            </foreach>\n        </if>\n    </select>\n    \n    <!--联查用户和租户审核状态-->\n    <select id=\"getUserTenantPageList\" resultType=\"org.jeecg.modules.system.vo.SysUserTenantVo\">\n        SELECT su.id,su.realname,su.username,su.email,su.phone,su.avatar,su.work_no,su.org_code,sut.status,su.create_time,st.create_by\n        FROM sys_user_tenant sut\n        RIGHT JOIN sys_user su on sut.user_id = su.id and su.del_flag = 0\n        JOIN sys_tenant st ON sut.tenant_id = st.id\n        WHERE sut.tenant_id = #{tenantId}\n        AND st.del_flag = 0\n        <if test=\"user.createBy!='' and user.createBy!=null\">\n            AND st.create_by = #{user.createBy}\n        </if>\n        <if test=\"user.username!='' and user.username!=null\">\n            <bind name=\"bindUserName\" value=\"'%'+user.username+'%'\"/>\n            AND su.username like #{bindUserName}\n        </if>\n        <if test=\"user.realname!='' and user.realname!=null\">\n            <bind name=\"bindRealName\" value=\"'%'+user.realname+'%'\"/>\n            AND su.realname like #{bindRealName}\n        </if>\n        <if test=\"user.sex!='' and user.sex!=null\">\n            AND su.sex = #{user.sex}\n        </if>\n        AND sut.status in\n        <foreach collection=\"status\" index=\"index\" item=\"status\" open=\"(\" separator=\",\" close=\")\">\n            #{status}\n        </foreach>\n    </select>\n    \n    <!--根据用户id获取租户id，没有状态-->\n    <select id=\"getTenantIdsNoStatus\" resultType=\"java.lang.Integer\">\n        SELECT tenant_id FROM sys_user_tenant\n        WHERE\n        user_id = #{userId}\n    </select>\n    \n    <!-- 统计一个人创建了多少个租户 -->\n    <select id=\"countCreateTenantNum\" resultType=\"java.lang.Integer\">\n        select count(*) count from sys_tenant where create_by = #{userId} and del_flag = 0 and status = 1\n    </select>\n\n    <!--判断当前用户是否已在该租户下面-->\n    <select id=\"userTenantIzExist\" resultType=\"java.lang.Integer\">\n        select count(*) count from sys_user_tenant\n        where\n        user_id = #{userId}\n        and tenant_id = #{tenantId}\n    </select>\n    \n    <!--查询未被注销的租户-->\n    <select id=\"getTenantNoCancel\" resultType=\"org.jeecg.modules.system.entity.SysTenant\">\n        SELECT st.id,st.name FROM sys_user_tenant sut\n        JOIN sys_tenant st ON sut.tenant_id = st.id AND st.del_flag = 0 AND st.status = 1\n        WHERE\n        user_id = #{userId}\n    </select>\n\n    <!--用户租户取消离职-->\n    <update id=\"putCancelQuit\">\n        update sys_user_tenant set status='1'\n        where\n        tenant_id = #{tenantId}\n        AND user_id in\n        <foreach collection=\"userIds\" index=\"index\" item=\"userId\" open=\"(\" separator=\",\" close=\")\">\n            #{userId}\n        </foreach>\n    </update>\n\n\n    <!--根据用户id获取我的租户-->\n    <select id=\"getTenantPageListByUserId\" resultType=\"org.jeecg.modules.system.entity.SysTenant\">\n        SELECT st.id,st.name,st.status,st.trade,st.company_size,st.company_address,st.company_logo,st.house_number,st.work_place,st.position,st.department,st.create_by FROM sys_user_tenant sut\n        JOIN sys_tenant st ON sut.tenant_id = st.id AND st.del_flag = 0 AND st.status = 1\n        WHERE sut.user_id = #{userId}\n        <if test=\"sysUserTenantVo.name != null and sysUserTenantVo.name != ''\">\n            <bind name=\"bindName\" value=\"'%'+sysUserTenantVo.name+'%'\"/>\n            AND st.name like #{bindName}\n        </if>\n        <if test=\"sysUserTenantVo.status != null and sysUserTenantVo.status!= ''\">\n            AND st.status = #{sysUserTenantVo.status}\n        </if>\n        AND sut.status in\n        <foreach collection=\"userTenantStatus\" index=\"index\" item=\"status\" open=\"(\" separator=\",\" close=\")\">\n            #{status}\n        </foreach>\n        order by st.create_time desc\n    </select>\n\n    <!-- 删除租户下的用户 -->\n    <delete id=\"deleteUserByTenantId\">\n        DELETE FROM sys_user_tenant\n        WHERE\n        tenant_id in\n        <foreach collection=\"tenantIds\" index=\"index\" item=\"tenantId\" open=\"(\" separator=\",\" close=\")\">\n            #{tenantId}\n        </foreach>\n    </delete>\n\n    <!-- 获取租户下的成员数量 -->\n    <select id=\"getUserCount\" resultType=\"java.lang.Long\">\n        SELECT count(1) FROM sys_user_tenant sut JOIN sys_user su on sut.user_id = su.id and su.del_flag = 0 and su.status = 1\n        WHERE sut.status = #{tenantStatus} \n        AND sut.tenant_id = #{tenantId}\n    </select>\n\n    <!--根据租户id和名称获取用户数据-->\n    <select id=\"getUsersByTenantIdAndName\" resultType=\"org.jeecg.modules.system.vo.thirdapp.JwUserDepartVo\">\n        SELECT su.id userId,su.realname,su.avatar\n        FROM sys_user_tenant sut\n        JOIN sys_tenant st ON sut.tenant_id = st.id and st.status = 1 and st.del_flag = 0\n        JOIN sys_user su ON sut.user_id = su.id and su.status = 1 and su.del_flag = 0\n        WHERE\n        sut.status = 1\n        AND sut.tenant_id = #{tenantId}\n    </select>\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/model/AnnouncementSendModel.java",
    "content": "package org.jeecg.modules.system.model;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Data;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * @Description: 用户通告阅读标记表\n * @Author: jeecg-boot\n * @Date:  2019-02-21\n * @Version: V1.0\n */\n@Data\npublic class AnnouncementSendModel implements Serializable {\n    private static final long serialVersionUID = 1L;\n    \n\t/**id*/\n\t@TableId(type = IdType.ASSIGN_ID)\n\tprivate java.lang.String id;\n\t/**通告id*/\n\tprivate java.lang.String anntId;\n\t/**用户id*/\n\tprivate java.lang.String userId;\n\t/**标题*/\n\tprivate java.lang.String titile;\n\t/**内容*/\n\tprivate java.lang.String msgContent;\n\t/**发布人*/\n\tprivate java.lang.String sender;\n\t/**优先级（L低，M中，H高）*/\n\tprivate java.lang.String priority;\n\t/**阅读状态*/\n\tprivate java.lang.Integer readFlag;\n\t/**发布时间*/\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\tprivate java.util.Date sendTime;\n\t/**页数*/\n\tprivate java.lang.Integer pageNo;\n\t/**大小*/\n\tprivate java.lang.Integer pageSize;\n    /**\n     * 消息类型1:通知公告2:系统消息\n     */\n    private java.lang.String msgCategory;\n\t/**\n\t * 业务id\n\t */\n\tprivate java.lang.String busId;\n\t/**\n\t * 业务类型\n\t */\n\tprivate java.lang.String busType;\n\t/**\n\t * 打开方式 组件：component 路由：url\n\t */\n\tprivate java.lang.String openType;\n\t/**\n\t * 组件/路由 地址\n\t */\n\tprivate java.lang.String openPage;\n\n\t/**\n\t * 业务类型查询（0.非bpm业务）\n\t */\n\tprivate java.lang.String bizSource;\n\n\t/**\n\t * 摘要\n\t */\n\tprivate java.lang.String msgAbstract;\n\n\t/**\n\t * 发布开始日期\n\t */\n\tprivate java.lang.String sendTimeBegin;\n\t\n\t/**\n\t * 发布结束日期\n\t */\n\tprivate java.lang.String sendTimeEnd;\n\t/**\n\t * 附件\n\t */\n\tprivate java.lang.String files;\n\t/**\n\t * 访问量\n\t */\n\tprivate java.lang.Integer visitsNum;\n\t/**\n\t * 是否置顶（0否 1是）\n\t */\n\tprivate java.lang.Integer izTop;\n\t/**\n\t * 通知类型(plan:日程计划 | flow:流程消息 | meeting:会议 | file:知识库 | collab:协同通知 | supe:督办通知 | attendance:考勤)\n\t */\n\tprivate java.lang.String noticeType;\n\t/**\n\t * 通告类型数组\n\t */\n\tprivate List<String> noticeTypeList;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/model/DepartIdModel.java",
    "content": "package org.jeecg.modules.system.model;\n\nimport java.io.Serializable;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.jeecg.modules.system.entity.SysDepart;\n\n/**\n * <p>\n * 部门表 封装树结构的部门的名称的实体类\n * <p>\n * \n * @Author Steve\n * @Since 2019-01-22 \n *\n */\npublic class DepartIdModel implements Serializable {\n\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * 主键ID\n     */\n    private String key;\n\n    /**\n     * 主键ID\n     */\n    private String value;\n    /**\n     * 部门编码\n     */\n    private String code;\n\n    /**\n     * 部门名称\n     */\n    private String title;\n    \n    List<DepartIdModel> children = new ArrayList<>();\n    \n    /**\n     * 将SysDepartTreeModel的部分数据放在该对象当中\n     * @param treeModel\n     * @return\n     */\n    public DepartIdModel convert(SysDepartTreeModel treeModel) {\n        this.key = treeModel.getId();\n        this.value = treeModel.getId();\n        this.title = treeModel.getDepartName();\n        return this;\n    }\n    \n    /**\n     * 该方法为用户部门的实现类所使用\n     * @param sysDepart\n     * @return\n     */\n    public DepartIdModel convertByUserDepart(SysDepart sysDepart) {\n        this.key = sysDepart.getId();\n        this.value = sysDepart.getId();\n        this.code = sysDepart.getOrgCode();\n        this.title = sysDepart.getDepartName();\n        return this;\n    } \n\n    public List<DepartIdModel> getChildren() {\n        return children;\n    }\n\n    public void setChildren(List<DepartIdModel> children) {\n        this.children = children;\n    }\n\n    public static long getSerialVersionUID() {\n        return serialVersionUID;\n    }\n\n    public String getKey() {\n        return key;\n    }\n\n    public void setKey(String key) {\n        this.key = key;\n    }\n\n    public String getValue() {\n        return value;\n    }\n\n    public void setValue(String value) {\n        this.value = value;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\n    }\n\n    public String getCode() {\n        return code;\n    }\n\n    public void setCode(String code) {\n        this.code = code;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/model/DuplicateCheckVo.java",
    "content": "package org.jeecg.modules.system.model;\n\nimport java.io.Serializable;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\n\n/**\n * @Title: DuplicateCheckVo\n * @Description: 重复校验VO\n * @Author 张代浩\n * @Date 2019-03-25\n * @Version V1.0\n */\n@Data\n@Schema(description=\"重复校验数据模型\")\npublic class DuplicateCheckVo implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\n\t/**\n\t * 表名\n\t */\n\t@Schema(description=\"表名\",name=\"tableName\",example=\"sys_log\")\n\tprivate String tableName;\n\t\n\t/**\n\t * 字段名\n\t */\n\t@Schema(description=\"字段名\",name=\"fieldName\",example=\"id\")\n\tprivate String fieldName;\n\t\n\t/**\n\t * 字段值\n\t */\n\t@Schema(description=\"字段值\",name=\"fieldVal\",example=\"1000\")\n\tprivate String fieldVal;\n\t\n\t/**\n\t * 数据ID\n\t*/\n\t@Schema(description=\"数据ID\",name=\"dataId\",example=\"2000\")\n\tprivate String dataId;\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/model/SysDepartTreeModel.java",
    "content": "package org.jeecg.modules.system.model;\n\nimport org.jeecg.modules.system.entity.SysDepart;\n\nimport java.io.Serializable;\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\nimport java.util.Objects;\n\n/**\n * <p>\n * 部门表 存储树结构数据的实体类\n * <p>\n * \n * @Author Steve\n * @Since 2019-01-22 \n */\npublic class SysDepartTreeModel implements Serializable{\n\t\n    private static final long serialVersionUID = 1L;\n    \n    /** 对应SysDepart中的id字段,前端数据树中的key*/\n    private String key;\n\n    /** 对应SysDepart中的id字段,前端数据树中的value*/\n    private String value;\n\n    /** 对应depart_name字段,前端数据树中的title*/\n    private String title;\n\n\n    private boolean isLeaf;\n    // 以下所有字段均与SysDepart相同\n    \n    private String id;\n\n    private String parentId;\n\n    private String departName;\n\n    private String departNameEn;\n\n    private String departNameAbbr;\n\n    private Integer departOrder;\n\n    private String description;\n    \n    private String orgCategory;\n\n    private String orgType;\n\n    private String orgCode;\n\n    private String mobile;\n\n    private String fax;\n\n    private String address;\n\n    private String memo;\n\n    private String status;\n\n    private String delFlag;\n\n    private String qywxIdentifier;\n\n    private String createBy;\n\n    private Date createTime;\n\n    private String updateBy;\n\n    private Date updateTime;\n\n    /**部门负责人ids\n     * [JTC-119]在部门管理菜单下设置部门负责人，新增字段部门负责人ids\n     * */\n    private String directorUserIds;\n    \n    /**职务*/\n    private String positionId;\n    \n    /**上级岗位id*/\n    private String depPostParentId;\n    \n    private List<SysDepartTreeModel> children = new ArrayList<>();\n\n\n    /**\n     * 将SysDepart对象转换成SysDepartTreeModel对象\n     * @param sysDepart\n     */\n\tpublic SysDepartTreeModel(SysDepart sysDepart) {\n\t\tthis.key = sysDepart.getId();\n        this.value = sysDepart.getId();\n        this.title = sysDepart.getDepartName();\n        this.id = sysDepart.getId();\n        this.parentId = sysDepart.getParentId();\n        this.departName = sysDepart.getDepartName();\n        this.departNameEn = sysDepart.getDepartNameEn();\n        this.departNameAbbr = sysDepart.getDepartNameAbbr();\n        this.departOrder = sysDepart.getDepartOrder();\n        this.description = sysDepart.getDescription();\n        this.orgCategory = sysDepart.getOrgCategory();\n        this.orgType = sysDepart.getOrgType();\n        this.orgCode = sysDepart.getOrgCode();\n        this.mobile = sysDepart.getMobile();\n        this.fax = sysDepart.getFax();\n        this.address = sysDepart.getAddress();\n        this.memo = sysDepart.getMemo();\n        this.status = sysDepart.getStatus();\n        this.delFlag = sysDepart.getDelFlag();\n        this.qywxIdentifier = sysDepart.getQywxIdentifier();\n        this.createBy = sysDepart.getCreateBy();\n        this.createTime = sysDepart.getCreateTime();\n        this.updateBy = sysDepart.getUpdateBy();\n        this.updateTime = sysDepart.getUpdateTime();\n        this.directorUserIds = sysDepart.getDirectorUserIds();\n        this.positionId = sysDepart.getPositionId();\n        this.depPostParentId = sysDepart.getDepPostParentId();\n        if(0 == sysDepart.getIzLeaf()){\n            this.isLeaf = false;\n        }else{\n            this.isLeaf = true;\n        }\n    }\n\n    public boolean getIsLeaf() {\n        return isLeaf;\n    }\n\n    public void setIsLeaf(boolean isleaf) {\n         this.isLeaf = isleaf;\n    }\n\n    public String getKey() {\n\t\treturn key;\n\t}\n\n\n\tpublic void setKey(String key) {\n\t\tthis.key = key;\n\t}\n\n\n\tpublic String getValue() {\n\t\treturn value;\n\t}\n\n\n\tpublic void setValue(String value) {\n\t\tthis.value = value;\n\t}\n\n\n\tpublic String getTitle() {\n\t\treturn title;\n\t}\n\n\n\tpublic void setTitle(String title) {\n\t\tthis.title = title;\n\t}\n\n\n\tpublic String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public List<SysDepartTreeModel> getChildren() {\n        return children;\n    }\n\n    public void setChildren(List<SysDepartTreeModel> children) {\n        if (children==null){\n            this.isLeaf=true;\n        }\n        this.children = children;\n    }\n\n    public String getParentId() {\n        return parentId;\n    }\n\n    public void setParentId(String parentId) {\n        this.parentId = parentId;\n    }\n\n    public static long getSerialVersionUID() {\n        return serialVersionUID;\n    }\n\n    public String getDepartName() {\n        return departName;\n    }\n\n    public void setDepartName(String departName) {\n        this.departName = departName;\n    }\n    \n    public String getOrgCategory() {\n\t\treturn orgCategory;\n\t}\n\n\tpublic void setOrgCategory(String orgCategory) {\n\t\tthis.orgCategory = orgCategory;\n\t}\n\n\tpublic String getOrgType() {\n        return orgType;\n    }\n\n    public void setOrgType(String orgType) {\n        this.orgType = orgType;\n    }\n\n    public String getOrgCode() {\n        return orgCode;\n    }\n\n    public void setOrgCode(String orgCode) {\n        this.orgCode = orgCode;\n    }\n\n    public String getMobile() {\n        return mobile;\n    }\n\n    public void setMobile(String mobile) {\n        this.mobile = mobile;\n    }\n\n    public String getFax() {\n        return fax;\n    }\n\n    public void setFax(String fax) {\n        this.fax = fax;\n    }\n\n    public String getAddress() {\n        return address;\n    }\n\n    public void setAddress(String address) {\n        this.address = address;\n    }\n\n    public String getMemo() {\n        return memo;\n    }\n\n    public void setMemo(String memo) {\n        this.memo = memo;\n    }\n\n    public String getDepartNameEn() {\n        return departNameEn;\n    }\n\n    public void setDepartNameEn(String departNameEn) {\n        this.departNameEn = departNameEn;\n    }\n\n    public String getDepartNameAbbr() {\n        return departNameAbbr;\n    }\n\n    public void setDepartNameAbbr(String departNameAbbr) {\n        this.departNameAbbr = departNameAbbr;\n    }\n\n    public Integer getDepartOrder() {\n        return departOrder;\n    }\n\n    public void setDepartOrder(Integer departOrder) {\n        this.departOrder = departOrder;\n    }\n\n    public String getDescription() {\n        return description;\n    }\n\n    public void setDescription(String description) {\n        this.description = description;\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getDelFlag() {\n        return delFlag;\n    }\n\n    public void setDelFlag(String delFlag) {\n        this.delFlag = delFlag;\n    }\n\n    public String getQywxIdentifier() {\n        return qywxIdentifier;\n    }\n\n    public void setQywxIdentifier(String qywxIdentifier) {\n        this.qywxIdentifier = qywxIdentifier;\n    }\n\n    public String getCreateBy() {\n        return createBy;\n    }\n\n    public void setCreateBy(String createBy) {\n        this.createBy = createBy;\n    }\n\n    public Date getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(Date createTime) {\n        this.createTime = createTime;\n    }\n\n    public String getUpdateBy() {\n        return updateBy;\n    }\n\n    public void setUpdateBy(String updateBy) {\n        this.updateBy = updateBy;\n    }\n\n    public Date getUpdateTime() {\n        return updateTime;\n    }\n\n    public void setUpdateTime(Date updateTime) {\n        this.updateTime = updateTime;\n    }\n\n    public SysDepartTreeModel() { }\n\n    public String getDirectorUserIds() {\n        return directorUserIds;\n    }\n\n    public void setDirectorUserIds(String directorUserIds) {\n        this.directorUserIds = directorUserIds;\n    }\n\n    public String getPositionId() {\n        return positionId;\n    }\n\n    public void setPositionId(String positionId) {\n        this.positionId = positionId;\n    }\n\n    public String getDepPostParentId() {\n        return depPostParentId;\n    }\n\n    public void setDepPostParentId(String depPostParentId) {\n        this.depPostParentId = depPostParentId;\n    }\n\n    /**\n     * 重写equals方法\n     */\n    @Override\n    public boolean equals(Object o) {\n        if (this == o) {\n\t\t\treturn true;\n\t\t}\n        if (o == null || getClass() != o.getClass()) {\n\t\t\treturn false;\n\t\t}\n        SysDepartTreeModel model = (SysDepartTreeModel) o;\n        return Objects.equals(id, model.id) &&\n                Objects.equals(parentId, model.parentId) &&\n                Objects.equals(departName, model.departName) &&\n                Objects.equals(departNameEn, model.departNameEn) &&\n                Objects.equals(departNameAbbr, model.departNameAbbr) &&\n                Objects.equals(departOrder, model.departOrder) &&\n                Objects.equals(description, model.description) &&\n                Objects.equals(orgCategory, model.orgCategory) &&\n                Objects.equals(orgType, model.orgType) &&\n                Objects.equals(orgCode, model.orgCode) &&\n                Objects.equals(mobile, model.mobile) &&\n                Objects.equals(fax, model.fax) &&\n                Objects.equals(address, model.address) &&\n                Objects.equals(memo, model.memo) &&\n                Objects.equals(status, model.status) &&\n                Objects.equals(delFlag, model.delFlag) &&\n                Objects.equals(qywxIdentifier, model.qywxIdentifier) &&\n                Objects.equals(createBy, model.createBy) &&\n                Objects.equals(createTime, model.createTime) &&\n                Objects.equals(updateBy, model.updateBy) &&\n                Objects.equals(updateTime, model.updateTime) &&\n                Objects.equals(directorUserIds, model.directorUserIds) &&\n                Objects.equals(positionId, model.positionId) &&\n                Objects.equals(depPostParentId, model.depPostParentId) &&\n                Objects.equals(children, model.children);\n    }\n    \n    /**\n     * 重写hashCode方法\n     */\n    @Override\n    public int hashCode() {\n\n        return Objects.hash(id, parentId, departName, departNameEn, departNameAbbr,\n        \t\tdepartOrder, description, orgCategory, orgType, orgCode, mobile, fax, address, \n        \t\tmemo, status, delFlag, qywxIdentifier, createBy, createTime, updateBy, updateTime,\n        \t\tchildren,directorUserIds, positionId, depPostParentId);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/model/SysDictTree.java",
    "content": "package org.jeecg.modules.system.model;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\nimport org.jeecg.modules.system.entity.SysDict;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\n\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\n/**\n * <p>\n * 字典表\n * </p>\n *\n * @Author zhangweijian\n * @since 2018-12-28\n */\n@Data\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\npublic class SysDictTree implements Serializable {\n\n    private static final long serialVersionUID = 1L;\n\n    private String key;\n\t\n\tprivate String title;\n\t\n    /**\n     * id\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    private String id;\n    /**\n     * 字典类型,0 string,1 number类型,2 boolean\n     * 前端js对stirng类型和number类型 boolean 类型敏感，需要区分。在select 标签匹配的时候会用到\n     * 默认为string类型\n     */\n    private Integer type;\n    \n    /**\n     * 字典名称\n     */\n    private String dictName;\n\n    /**\n     * 字典编码\n     */\n    private String dictCode;\n\n    /**\n     * 描述\n     */\n    private String description;\n\n    /**\n     * 删除状态\n     */\n    private Integer delFlag;\n\n    /**\n     * 创建人\n     */\n    private String createBy;\n\n    /**\n     * 创建时间\n     */\n    private Date createTime;\n\n    /**\n     * 更新人\n     */\n    private String updateBy;\n\n    /**\n     * 更新时间\n     */\n    private Date updateTime;\n    \n    public SysDictTree(SysDict node) {\n    \tthis.id = node.getId();\n\t\tthis.key = node.getId();\n\t\tthis.title = node.getDictName();\n\t\tthis.dictCode = node.getDictCode();\n\t\tthis.description = node.getDescription();\n\t\tthis.delFlag = node.getDelFlag();\n\t\tthis.type = node.getType();\n\t}\n    \n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/model/SysLoginModel.java",
    "content": "package org.jeecg.modules.system.model;\n\n\nimport io.swagger.v3.oas.annotations.media.Schema;\n\n/**\n * 登录表单\n *\n * @Author scott\n * @since  2019-01-18\n */\n@Schema(description=\"登录对象\")\npublic class SysLoginModel {\n\t@Schema(description = \"账号\")\n    private String username;\n\t@Schema(description = \"密码\")\n    private String password;\n\t@Schema(description = \"登录部门\")\n    private String loginOrgCode;\n\t@Schema(description = \"验证码\")\n    private String captcha;\n\t@Schema(description = \"验证码key\")\n    private String checkKey;\n\n    public String getUsername() {\n        return username;\n    }\n\n    public void setUsername(String username) {\n        this.username = username;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public void setPassword(String password) {\n        this.password = password;\n    }\n\n    public String getCaptcha() {\n        return captcha;\n    }\n\n    public void setCaptcha(String captcha) {\n        this.captcha = captcha;\n    }\n\n\tpublic String getCheckKey() {\n\t\treturn checkKey;\n\t}\n\n\tpublic void setCheckKey(String checkKey) {\n\t\tthis.checkKey = checkKey;\n\t}\n\n    public String getLoginOrgCode() {\n        return loginOrgCode;\n    }\n\n    public void setLoginOrgCode(String loginOrgCode) {\n        this.loginOrgCode = loginOrgCode;\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/model/SysPermissionTree.java",
    "content": "package org.jeecg.modules.system.model;\n\nimport java.io.Serializable;\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\nimport org.jeecg.modules.system.entity.SysPermission;\n\n/**\n * @Description: 菜单树，封装树结构\n * @author: jeecg-boot\n */\npublic class SysPermissionTree implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\n\t/**\n\t * id\n\t */\n\tprivate String id;\n\n\tprivate String key;\n\tprivate String title;\n\n\t/**\n\t * 父id\n\t */\n\tprivate String parentId;\n\n\t/**\n\t * 菜单名称\n\t */\n\tprivate String name;\n\n\t/**\n\t * 菜单权限编码\n\t */\n\tprivate String perms;\n\t/**\n\t * 权限策略1显示2禁用\n\t */\n\tprivate String permsType;\n\n\t/**\n\t * 菜单图标\n\t */\n\tprivate String icon;\n\n\t/**\n\t * 组件\n\t */\n\tprivate String component;\n\n\t/**\n\t * 组件名字\n\t */\n\tprivate String componentName;\n\n\t/**\n\t * 跳转网页链接\n\t */\n\tprivate String url;\n\t\n\t/**\n\t * 一级菜单跳转地址\n\t */\n\tprivate String redirect;\n\n\t/**\n\t * 菜单排序\n\t */\n\tprivate Double sortNo;\n\n\t/**\n\t * 类型（0：一级菜单；1：子菜单 ；2：按钮权限）\n\t */\n\tprivate Integer menuType;\n\n\t/**\n\t * 是否叶子节点: 1:是 0:不是\n\t */\n\tprivate boolean isLeaf;\n\t\n\t/**\n\t * 是否路由菜单: 0:不是  1:是（默认值1）\n\t */\n\tprivate boolean route;\n\n\n\t/**\n\t * 是否路缓存页面: 0:不是  1:是（默认值1）\n\t */\n\tprivate boolean keepAlive;\n\n\n\t/**\n\t * 描述\n\t */\n\tprivate String description;\n\n\t/**\n\t * 删除状态 0正常 1已删除\n\t */\n\tprivate Integer delFlag;\n\n\t/**\n\t * 创建人\n\t */\n\tprivate String createBy;\n\n\t/**\n\t * 创建时间\n\t */\n\tprivate Date createTime;\n\n\t/**\n\t * 更新人\n\t */\n\tprivate String updateBy;\n\n\t/**\n\t * 更新时间\n\t */\n\tprivate Date updateTime;\n\n\t/**alwaysShow*/\n    private boolean alwaysShow;\n    /**是否隐藏路由菜单: 0否,1是（默认值0）*/\n    private boolean hidden;\n    \n    /**按钮权限状态(0无效1有效)*/\n\tprivate java.lang.String status;\n\n\t/*update_begin author:wuxianquan date:20190908 for:model增加字段 */\n\t/** 外链菜单打开方式 0/内部打开 1/外部打开 */\n\tprivate boolean internalOrExternal;\n\t/*update_end author:wuxianquan date:20190908 for:model增加字段 */\n\n\t/*update_begin author:liusq date:20230601 for:【issues/4986】model增加hideTab字段 */\n\t/**\n\t * 是否隐藏Tab: 0否,1是（默认值0）\n\t */\n\tprivate boolean hideTab;\n\t/*update_end author:liusq date:20230601 for:【issues/4986】model增加hideTab字段 */\n\n\tpublic SysPermissionTree() {\n\t}\n\n\tpublic SysPermissionTree(SysPermission permission) {\n\t\tthis.key = permission.getId();\n\t\tthis.id = permission.getId();\n\t\tthis.perms = permission.getPerms();\n\t\tthis.permsType = permission.getPermsType();\n\t\tthis.component = permission.getComponent();\n\t\tthis.componentName = permission.getComponentName();\n\t\tthis.createBy = permission.getCreateBy();\n\t\tthis.createTime = permission.getCreateTime();\n\t\tthis.delFlag = permission.getDelFlag();\n\t\tthis.description = permission.getDescription();\n\t\tthis.icon = permission.getIcon();\n\t\tthis.isLeaf = permission.isLeaf();\n\t\tthis.menuType = permission.getMenuType();\n\t\tthis.name = permission.getName();\n\t\tthis.parentId = permission.getParentId();\n\t\tthis.sortNo = permission.getSortNo();\n\t\tthis.updateBy = permission.getUpdateBy();\n\t\tthis.updateTime = permission.getUpdateTime();\n\t\tthis.redirect = permission.getRedirect();\n\t\tthis.url = permission.getUrl();\n\t\tthis.hidden = permission.isHidden();\n\t\tthis.route = permission.isRoute();\n\t\tthis.keepAlive = permission.isKeepAlive();\n\t\tthis.alwaysShow= permission.isAlwaysShow();\n\t\t/*update_begin author:wuxianquan date:20190908 for:赋值 */\n\t\tthis.internalOrExternal = permission.isInternalOrExternal();\n\t\t/*update_end author:wuxianquan date:20190908 for:赋值 */\n\t\tthis.title=permission.getName();\n\t\t/*update_end author:liusq date:20230601 for:【issues/4986】model增加hideTab字段 */\n\t\tthis.hideTab = permission.isHideTab();\n\t\t/*update_end author:liusq date:20230601 for:【issues/4986】model增加hideTab字段 */\n\t\tif (!permission.isLeaf()) {\n\t\t\tthis.children = new ArrayList<SysPermissionTree>();\n\t\t}\n\t\tthis.status = permission.getStatus();\n\t}\n\n\tpublic String getTitle() {\n\t\treturn title;\n\t}\n\n\tpublic void setTitle(String title) {\n\t\tthis.title = title;\n\t}\n\n\tprivate List<SysPermissionTree> children;\n\n\tpublic boolean isLeaf() {\n\t\treturn isLeaf;\n\t}\n\n\tpublic void setLeaf(boolean leaf) {\n\t\tisLeaf = leaf;\n\t}\n\n\tpublic boolean isKeepAlive() {\n\t\treturn keepAlive;\n\t}\n\n\tpublic void setKeepAlive(boolean keepAlive) {\n\t\tthis.keepAlive = keepAlive;\n\t}\n\n\tpublic boolean isAlwaysShow() {\n\t\treturn alwaysShow;\n\t}\n\n\tpublic void setAlwaysShow(boolean alwaysShow) {\n\t\tthis.alwaysShow = alwaysShow;\n\t}\n\tpublic List<SysPermissionTree> getChildren() {\n\t\treturn children;\n\t}\n\n\tpublic void setChildren(List<SysPermissionTree> children) {\n\t\tthis.children = children;\n\t}\n\n\tpublic String getRedirect() {\n\t\treturn redirect;\n\t}\n\n\tpublic void setRedirect(String redirect) {\n\t\tthis.redirect = redirect;\n\t}\n\n\tpublic String getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(String id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getParentId() {\n\t\treturn parentId;\n\t}\n\n\tpublic void setParentId(String parentId) {\n\t\tthis.parentId = parentId;\n\t}\n\n\tpublic boolean isHidden() {\n\t\treturn hidden;\n\t}\n\n\tpublic void setHidden(boolean hidden) {\n\t\tthis.hidden = hidden;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\tpublic String getIcon() {\n\t\treturn icon;\n\t}\n\n\tpublic void setIcon(String icon) {\n\t\tthis.icon = icon;\n\t}\n\n\tpublic String getComponent() {\n\t\treturn component;\n\t}\n\n\tpublic void setComponent(String component) {\n\t\tthis.component = component;\n\t}\n\n\tpublic String getComponentName() {\n\t\treturn componentName;\n\t}\n\n\tpublic void setComponentName(String componentName) {\n\t\tthis.componentName = componentName;\n\t}\n\n\tpublic String getUrl() {\n\t\treturn url;\n\t}\n\n\tpublic void setUrl(String url) {\n\t\tthis.url = url;\n\t}\n\n\tpublic Double getSortNo() {\n\t\treturn sortNo;\n\t}\n\n\tpublic void setSortNo(Double sortNo) {\n\t\tthis.sortNo = sortNo;\n\t}\n\n\tpublic Integer getMenuType() {\n\t\treturn menuType;\n\t}\n\n\tpublic void setMenuType(Integer menuType) {\n\t\tthis.menuType = menuType;\n\t}\n\n\tpublic String getDescription() {\n\t\treturn description;\n\t}\n\n\tpublic void setDescription(String description) {\n\t\tthis.description = description;\n\t}\n\n\tpublic boolean isRoute() {\n\t\treturn route;\n\t}\n\n\tpublic void setRoute(boolean route) {\n\t\tthis.route = route;\n\t}\n\n\tpublic Integer getDelFlag() {\n\t\treturn delFlag;\n\t}\n\n\tpublic void setDelFlag(Integer delFlag) {\n\t\tthis.delFlag = delFlag;\n\t}\n\n\tpublic String getCreateBy() {\n\t\treturn createBy;\n\t}\n\n\tpublic void setCreateBy(String createBy) {\n\t\tthis.createBy = createBy;\n\t}\n\n\tpublic Date getCreateTime() {\n\t\treturn createTime;\n\t}\n\n\tpublic void setCreateTime(Date createTime) {\n\t\tthis.createTime = createTime;\n\t}\n\n\tpublic String getUpdateBy() {\n\t\treturn updateBy;\n\t}\n\n\tpublic void setUpdateBy(String updateBy) {\n\t\tthis.updateBy = updateBy;\n\t}\n\n\tpublic Date getUpdateTime() {\n\t\treturn updateTime;\n\t}\n\n\tpublic void setUpdateTime(Date updateTime) {\n\t\tthis.updateTime = updateTime;\n\t}\n\n\tpublic String getKey() {\n\t\treturn key;\n\t}\n\n\tpublic void setKey(String key) {\n\t\tthis.key = key;\n\t}\n\n\tpublic String getPerms() {\n\t\treturn perms;\n\t}\n\n\tpublic void setPerms(String perms) {\n\t\tthis.perms = perms;\n\t}\n\n\tpublic boolean getIsLeaf() {\n\t\treturn isLeaf;\n\t}\n\n\tpublic void setIsLeaf(boolean isLeaf) {\n\t\tthis.isLeaf = isLeaf;\n\t}\n\n\tpublic String getPermsType() {\n\t\treturn permsType;\n\t}\n\n\tpublic void setPermsType(String permsType) {\n\t\tthis.permsType = permsType;\n\t}\n\n\tpublic java.lang.String getStatus() {\n\t\treturn status;\n\t}\n\n\tpublic void setStatus(java.lang.String status) {\n\t\tthis.status = status;\n\t}\n\n\t/*update_begin author:wuxianquan date:20190908 for:get set方法 */\n\tpublic boolean isInternalOrExternal() {\n\t\treturn internalOrExternal;\n\t}\n\n\tpublic void setInternalOrExternal(boolean internalOrExternal) {\n\t\tthis.internalOrExternal = internalOrExternal;\n\t}\n\t/*update_end author:wuxianquan date:20190908 for:get set 方法 */\n\n\tpublic boolean isHideTab() {\n\t\treturn hideTab;\n\t}\n\n\tpublic void setHideTab(boolean hideTab) {\n\t\tthis.hideTab = hideTab;\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/model/SysUserSysDepPostModel.java",
    "content": "package org.jeecg.modules.system.model;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Data;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.util.Date;\n\n/**\n * @Description: 部门用户和部门岗位用户的Model\n * @author: wangshuai\n * @date: 2025/9/5 16:43\n */\n@Data\npublic class SysUserSysDepPostModel {\n    /**\n     * 用户ID\n     */\n    private String id;\n\n    /**\n     * 用户名\n     */\n    private String username;\n    \n    /* 真实姓名 */\n    private String realname;\n\n    /**\n     * 头像\n     */\n    @Excel(name = \"头像\", width = 15, type = 2)\n    private String avatar;\n    /**\n     * 生日\n     */\n    @Excel(name = \"生日\", width = 15, format = \"yyyy-MM-dd\")\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd\")\n    private Date birthday;\n\n    /**\n     * 性别（1：男 2：女）\n     */\n    @Excel(name = \"性别\", width = 15, dicCode = \"sex\")\n    @Dict(dicCode = \"sex\")\n    private Integer sex;\n\n    /**\n     * 电子邮件\n     */\n    @Excel(name = \"电子邮件\", width = 15)\n    private String email;\n\n    /**\n     * 电话\n     */\n    @Excel(name = \"电话\", width = 15)\n    private String phone;\n\n    /**\n     * 状态(1：正常  2：冻结 ）\n     */\n    @Excel(name = \"状态\", width = 15, dicCode = \"user_status\")\n    @Dict(dicCode = \"user_status\")\n    private Integer status;\n\n    /**\n     * 删除状态（0，正常，1已删除）\n     */\n    @Excel(name = \"删除状态\", width = 15, dicCode = \"del_flag\")\n    @TableLogic\n    private Integer delFlag;\n\n    /**\n     * 座机号\n     */\n    @Excel(name = \"座机号\", width = 15)\n    private String telephone;\n\n    /**\n     * 身份（0 普通成员 1 上级）\n     */\n    @Excel(name = \"（1普通成员 2上级）\", width = 15)\n    private Integer userIdentity;\n\n    /**\n     * 负责部门\n     */\n    @Excel(name = \"负责部门\", width = 15, dictTable = \"sys_depart\", dicText = \"depart_name\", dicCode = \"id\")\n    @Dict(dictTable = \"sys_depart\", dicText = \"depart_name\", dicCode = \"id\")\n    private String departIds;\n\n    /**\n     * 多租户ids临时用，不持久化数据库(数据库字段不存在)\n     */\n    private String relTenantIds;\n\n    /**\n     * 同步工作流引擎(1-同步 0-不同步)\n     */\n    private String activitiSync;\n    /**\n     * 主岗位\n     */\n    @Excel(name = \"主岗位\", width = 15, dictTable = \"sys_depart\", dicText = \"depart_name\", dicCode = \"id\")\n    @Dict(dictTable = \"sys_depart\", dicText = \"depart_name\", dicCode = \"id\")\n    private String mainDepPostId;\n\n    /**\n     * 兼职岗位\n     */\n    @Excel(name = \"兼职岗位\", width = 15, dictTable = \"sys_depart\", dicText = \"depart_name\", dicCode = \"id\")\n    @Dict(dictTable = \"sys_depart\", dicText = \"depart_name\", dicCode = \"id\")\n    @TableField(exist = false)\n    private String otherDepPostId;\n\n    /**\n     * 部门名称\n     */\n    private String departName;\n    /**\n     * 主岗位\n     */\n    private String postName;\n    \n    /**\n     * 兼职岗位\n     */\n    private String otherPostName;\n\n    /**\n     * 部门text\n     */\n    private String orgCodeTxt;\n\n    /**\n     * 职务\n     */\n    private String post;\n\n    /**\n     * 部门编码\n     */\n    private String orgCode;\n\n    /**\n     * 职务（字典）\n     */\n    private String positionType;\n\n    /**\n     * 排序\n     */\n    private Integer sort;\n\n    /**\n     * 是否隐藏联系方式 0否1是\n     */\n    private String izHideContact;\n\n    /**\n     * 工号\n     */\n    private String workNo;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/model/SysUserSysDepartModel.java",
    "content": "package org.jeecg.modules.system.model;\n\nimport lombok.Data;\nimport org.jeecg.modules.system.entity.SysDepart;\nimport org.jeecg.modules.system.entity.SysUser;\n\n/**\n * 包含 SysUser 和 SysDepart 的 Model\n *\n * @author sunjianlei\n */\n@Data\npublic class SysUserSysDepartModel {\n\n    private String id;\n    private String realname;\n    private String workNo;\n    private String post;\n    private String telephone;\n    private String email;\n    private String phone;\n    private String departId;\n    private String departName;\n    private String avatar;\n    private String sex;\n    private String birthday;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/model/ThirdLoginModel.java",
    "content": "package org.jeecg.modules.system.model;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * 第三方登录 信息存储\n * @author: jeecg-boot\n */\n@Data\npublic class ThirdLoginModel implements Serializable {\n    private static final long serialVersionUID = 4098628709290780891L;\n\n    /**\n     * 第三方登录 来源\n     */\n    private String source;\n\n    /**\n     * 第三方登录 uuid\n     */\n    private String uuid;\n\n    /**\n     * 第三方登录 username\n     */\n    private String username;\n\n    /**\n     * 第三方登录 头像\n     */\n    private String avatar;\n\n    /**\n     * 账号 后缀第三方登录 防止账号重复\n     */\n    private String suffix;\n\n    /**\n     * 操作码 防止被攻击\n     */\n    private String operateCode;\n\n    public ThirdLoginModel(){\n\n    }\n\n    /**\n     * 构造器\n     * @param source\n     * @param uuid\n     * @param username\n     * @param avatar\n     */\n    public ThirdLoginModel(String source,String uuid,String username,String avatar){\n        this.source = source;\n        this.uuid = uuid;\n        this.username = username;\n        this.avatar = avatar;\n    }\n\n    /**\n     * 获取登录账号名\n     * @return\n     */\n    public String getUserLoginAccount(){\n        if(suffix==null){\n            return this.uuid;\n        }\n        return this.uuid + this.suffix;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/model/TreeModel.java",
    "content": "package org.jeecg.modules.system.model;\n\nimport java.io.Serializable;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.jeecg.modules.system.entity.SysPermission;\n\n/**\n  * 树形列表用到\n  * @author: jeecg-boot\n */\npublic class TreeModel implements Serializable {\n\t\n\tprivate static final long serialVersionUID = 4013193970046502756L;\n\n\tprivate String key;\n\t\n\tprivate String title;\n\t\n\tprivate String slotTitle;\n\t\n\tprivate Boolean isLeaf;\n\t\n\tprivate String icon;\n\t\n\tprivate Integer ruleFlag;\n\t\n\tprivate Map<String,String> scopedSlots;\n\t\n\tpublic Map<String, String> getScopedSlots() {\n\t\treturn scopedSlots;\n\t}\n\n\tpublic void setScopedSlots(Map<String, String> scopedSlots) {\n\t\tthis.scopedSlots = scopedSlots;\n\t}\n\n\tpublic String getKey() {\n\t\treturn key;\n\t}\n\n\tpublic void setKey(String key) {\n\t\tthis.key = key;\n\t}\n\n\tpublic String getTitle() {\n\t\treturn title;\n\t}\n\n\tpublic void setTitle(String title) {\n\t\tthis.title = title;\n\t}\n\n\tpublic Boolean getIsLeaf() {\n\t\treturn isLeaf;\n\t}\n\n\tpublic void setIsLeaf(Boolean isLeaf) {\n\t\tthis.isLeaf = isLeaf;\n\t}\n\n\tpublic String getIcon() {\n\t\treturn icon;\n\t}\n\n\tpublic void setIcon(String icon) {\n\t\tthis.icon = icon;\n\t}\n\t\n\tprivate List<TreeModel> children;\n\n\tpublic List<TreeModel> getChildren() {\n\t\treturn children;\n\t}\n\n\tpublic void setChildren(List<TreeModel> children) {\n\t\tthis.children = children;\n\t}\n\n\tpublic TreeModel() {\n\t\t\n\t}\n\t\n\tpublic TreeModel(SysPermission permission) {\n\t\tthis.key = permission.getId();\n\t\tthis.icon = permission.getIcon();\n\t\tthis.parentId = permission.getParentId();\n\t\tthis.title = permission.getName();\n\t\tthis.slotTitle =  permission.getName();\n\t\tthis.value = permission.getId();\n\t\tthis.isLeaf = permission.isLeaf();\n\t\tthis.label = permission.getName();\n\t\tif(!permission.isLeaf()) {\n\t\t\tthis.children = new ArrayList<TreeModel>();\n\t\t}\n\t}\n\t \n\t public TreeModel(String key,String parentId,String slotTitle,Integer ruleFlag,boolean isLeaf) {\n    \tthis.key = key;\n    \tthis.parentId = parentId;\n    \tthis.ruleFlag=ruleFlag;\n    \tthis.slotTitle =  slotTitle;\n    \tMap<String,String> map = new HashMap(5);\n    \tmap.put(\"title\", \"hasDatarule\");\n    \tthis.scopedSlots = map;\n    \tthis.isLeaf = isLeaf;\n    \tthis.value = key;\n    \tif(!isLeaf) {\n    \t\tthis.children = new ArrayList<TreeModel>();\n    \t}\n    }\n\t \n\t private String parentId;\n\t\t\n\tprivate String label;\n\t\n\tprivate String value;\n\t\n\t\n\tpublic String getParentId() {\n\t\treturn parentId;\n\t}\n\n\tpublic void setParentId(String parentId) {\n\t\tthis.parentId = parentId;\n\t}\n\n\t/**\n\t * @return the label\n\t */\n\tpublic String getLabel() {\n\t\treturn label;\n\t}\n\n\t/**\n\t * @param label the label to set\n\t */\n\tpublic void setLabel(String label) {\n\t\tthis.label = label;\n\t}\n\n\t/**\n\t * @return the value\n\t */\n\tpublic String getValue() {\n\t\treturn value;\n\t}\n\n\t/**\n\t * @param value the value to set\n\t */\n\tpublic void setValue(String value) {\n\t\tthis.value = value;\n\t}\n\n\tpublic String getSlotTitle() {\n\t\treturn slotTitle;\n\t}\n\n\tpublic void setSlotTitle(String slotTitle) {\n\t\tthis.slotTitle = slotTitle;\n\t}\n\n\tpublic Integer getRuleFlag() {\n\t\treturn ruleFlag;\n\t}\n\n\tpublic void setRuleFlag(Integer ruleFlag) {\n\t\tthis.ruleFlag = ruleFlag;\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/model/TreeSelectModel.java",
    "content": "package org.jeecg.modules.system.model;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n  * 树形下拉框\n  * @author: jeecg-boot\n */\npublic class TreeSelectModel implements Serializable {\n\n\tprivate static final long serialVersionUID = 9016390975325574747L;\n\n\tprivate String key;\n\t\n\tprivate String title;\n\t/**\n\t * 是否叶子节点\n\t */\n\tprivate boolean isLeaf;\n\t\n\tprivate String icon;\n\t\n\tprivate String parentId;\n\t\n\tprivate String value;\n\t\n\tprivate String code;\n\t\n\tpublic String getValue() {\n\t\treturn value;\n\t}\n\n\tpublic void setValue(String value) {\n\t\tthis.value = value;\n\t}\n\n\tpublic String getParentId() {\n\t\treturn parentId;\n\t}\n\n\tpublic void setParentId(String parentId) {\n\t\tthis.parentId = parentId;\n\t}\n\n\tpublic String getKey() {\n\t\treturn key;\n\t}\n\n\tpublic void setKey(String key) {\n\t\tthis.key = key;\n\t}\n\n\tpublic String getTitle() {\n\t\treturn title;\n\t}\n\n\tpublic void setTitle(String title) {\n\t\tthis.title = title;\n\t}\n\n\tpublic boolean isLeaf() {\n\t\treturn isLeaf;\n\t}\n\n\tpublic void setLeaf(boolean isLeaf) {\n\t\tthis.isLeaf = isLeaf;\n\t}\n\n\tpublic String getIcon() {\n\t\treturn icon;\n\t}\n\n\tpublic void setIcon(String icon) {\n\t\tthis.icon = icon;\n\t}\n\n\tpublic String getCode() {\n\t\treturn code;\n\t}\n\n\tpublic void setCode(String code) {\n\t\tthis.code = code;\n\t}\n\t\n\tprivate List<TreeSelectModel> children;\n\n\tpublic List<TreeSelectModel> getChildren() {\n\t\treturn children;\n\t}\n\n\tpublic void setChildren(List<TreeSelectModel> children) {\n\t\tthis.children = children;\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/rule/CategoryCodeRule.java",
    "content": "package org.jeecg.modules.system.rule;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.handler.IFillRuleHandler;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.YouBianCodeUtil;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysCategory;\nimport org.jeecg.modules.system.mapper.SysCategoryMapper;\n\nimport java.util.List;\n\n/**\n * @Author scott\n * @Date 2019/12/9 11:32\n * @Description: 分类字典编码生成规则\n */\n@Slf4j\npublic class CategoryCodeRule implements IFillRuleHandler {\n\n    public static final String ROOT_PID_VALUE = \"0\";\n\n    @Override\n    public Object execute(JSONObject params, JSONObject formData) {\n        log.info(\"系统自定义编码规则[category_code_rule]，params：{} ，formData： {}\", params, formData);\n\n        String categoryPid = ROOT_PID_VALUE;\n        String categoryCode = null;\n\n        if (formData != null && formData.size() > 0) {\n            Object obj = formData.get(\"pid\");\n            if (oConvertUtils.isNotEmpty(obj)) {\n                categoryPid = obj.toString();\n            }\n        } else {\n            if (params != null) {\n                Object obj = params.get(\"pid\");\n                if (oConvertUtils.isNotEmpty(obj)) {\n                    categoryPid = obj.toString();\n                }\n            }\n        }\n\n        /*\n         * 分成三种情况\n         * 1.数据库无数据 调用YouBianCodeUtil.getNextYouBianCode(null);\n         * 2.添加子节点，无兄弟元素 YouBianCodeUtil.getSubYouBianCode(parentCode,null);\n         * 3.添加子节点有兄弟元素 YouBianCodeUtil.getNextYouBianCode(lastCode);\n         * */\n        //找同类 确定上一个最大的code值\n        SysCategoryMapper baseMapper = (SysCategoryMapper) SpringContextUtils.getBean(\"sysCategoryMapper\");\n        // 代码逻辑说明: 【issues/4846】开启saas多租户功能后，租户管理员在添加分类字典时，报错------------\n        Page<SysCategory> page = new Page<>(1,1);\n        List<SysCategory> list = baseMapper.getMaxCategoryCodeByPage(page,categoryPid);\n        if (list == null || list.size() == 0) {\n            if (ROOT_PID_VALUE.equals(categoryPid)) {\n                //情况1\n                categoryCode = YouBianCodeUtil.getNextYouBianCode(null);\n            } else {\n                //情况2\n                SysCategory parent = (SysCategory) baseMapper.selectSysCategoryById(categoryPid);\n                categoryCode = YouBianCodeUtil.getSubYouBianCode(parent.getCode(), null);\n            }\n        } else {\n            //情况3\n            categoryCode = YouBianCodeUtil.getNextYouBianCode(list.get(0).getCode());\n        }\n        return categoryCode;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/rule/OrderNumberRule.java",
    "content": "package org.jeecg.modules.system.rule;\n\nimport com.alibaba.fastjson.JSONObject;\nimport org.apache.commons.lang.StringUtils;\nimport org.apache.commons.lang.math.RandomUtils;\nimport org.jeecg.common.handler.IFillRuleHandler;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\n\n/**\n * 填值规则Demo：生成订单号\n * 【测试示例】\n */\npublic class OrderNumberRule implements IFillRuleHandler {\n\n    @Override\n    public Object execute(JSONObject params, JSONObject formData) {\n        String prefix = \"CN\";\n        //订单前缀默认为CN 如果规则参数不为空，则取自定义前缀\n        if (params != null) {\n            Object obj = params.get(\"prefix\");\n            if (obj != null) prefix = obj.toString();\n        }\n        SimpleDateFormat format = new SimpleDateFormat(\"yyyyMMddHHmmss\");\n        int random = RandomUtils.nextInt(90) + 10;\n        String value = prefix + format.format(new Date()) + random;\n        // 根据formData的值的不同，生成不同的订单号\n        String name = formData.getString(\"name\");\n        if (!StringUtils.isEmpty(name)) {\n            value += name;\n        }\n        return value;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/rule/OrgCodeRule.java",
    "content": "package org.jeecg.modules.system.rule;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport io.netty.util.internal.StringUtil;\nimport org.jeecg.common.handler.IFillRuleHandler;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.YouBianCodeUtil;\nimport org.jeecg.modules.system.entity.SysDepart;\nimport org.jeecg.modules.system.service.ISysDepartService;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * @Author scott\n * @Date 2019/12/9 11:33\n * @Description: 机构编码生成规则\n */\npublic class OrgCodeRule implements IFillRuleHandler {\n\n    @Override\n    public Object execute(JSONObject params, JSONObject formData) {\n        ISysDepartService sysDepartService = (ISysDepartService) SpringContextUtils.getBean(\"sysDepartServiceImpl\");\n\n        LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>();\n        LambdaQueryWrapper<SysDepart> query1 = new LambdaQueryWrapper<SysDepart>();\n        // 创建一个List集合,存储查询返回的所有SysDepart对象\n        List<SysDepart> departList = new ArrayList<>();\n        String[] strArray = new String[2];\n        //定义部门类型\n        String orgType = \"\";\n        // 定义新编码字符串\n        String newOrgCode = \"\";\n        // 定义旧编码字符串\n        String oldOrgCode = \"\";\n\n        String parentId = null;\n        if (formData != null && formData.size() > 0) {\n            Object obj = formData.get(\"parentId\");\n            if (obj != null) {\n                parentId = obj.toString();\n            }\n        } else {\n            if (params != null) {\n                Object obj = params.get(\"parentId\");\n                if (obj != null) {\n                    parentId = obj.toString();\n                }\n            }\n        }\n\n        //如果是最高级,则查询出同级的org_code, 调用工具类生成编码并返回\n        if (StringUtil.isNullOrEmpty(parentId)) {\n            // 线判断数据库中的表是否为空,空则直接返回初始编码\n            //获取最大值code的部门信息\n            // 代码逻辑说明: [QQYUN-4209]租户隔离下部门新建不了------------\n            Page<SysDepart> page = new Page<>(1,1);\n            IPage<SysDepart> pageList = sysDepartService.getMaxCodeDepart(page,\"\");\n            List<SysDepart> records = pageList.getRecords();\n            if (null==records || records.size()==0) {\n                strArray[0] = YouBianCodeUtil.getNextYouBianCode(null);\n                strArray[1] = \"1\";\n                return strArray;\n            } else {\n                SysDepart depart = records.get(0);\n                oldOrgCode = depart.getOrgCode();\n                orgType = depart.getOrgType();\n                newOrgCode = YouBianCodeUtil.getNextYouBianCode(oldOrgCode);\n            }\n        } else {//反之则查询出所有同级的部门,获取结果后有两种情况,有同级和没有同级\n            //获取自己部门最大值orgCode部门信息\n            // 代码逻辑说明: [QQYUN-4209]租户隔离下部门新建不了------------\n            Page<SysDepart> page = new Page<>(1,1);\n            IPage<SysDepart> pageList = sysDepartService.getMaxCodeDepart(page,parentId);\n            List<SysDepart> records = pageList.getRecords();\n            // 查询出父级部门\n            SysDepart depart = sysDepartService.getDepartById(parentId);\n            // 获取父级部门的Code\n            String parentCode = depart.getOrgCode();\n            // 根据父级部门类型算出当前部门的类型\n            orgType = String.valueOf(Integer.valueOf(depart.getOrgType()) + 1);\n            // 处理同级部门为null的情况\n            if (null == records || records.size()==0) {\n                // 直接生成当前的部门编码并返回\n                newOrgCode = YouBianCodeUtil.getSubYouBianCode(parentCode, null);\n            } else { //处理有同级部门的情况\n                // 获取同级部门的编码,利用工具类\n                String subCode = records.get(0).getOrgCode();\n                // 返回生成的当前部门编码\n                newOrgCode = YouBianCodeUtil.getSubYouBianCode(parentCode, subCode);\n            }\n        }\n        // 返回最终封装了部门编码和部门类型的数组\n        strArray[0] = newOrgCode;\n        strArray[1] = orgType;\n        return strArray;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/security/DictQueryBlackListHandler.java",
    "content": "package org.jeecg.modules.system.security;\n\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.common.util.security.AbstractQueryBlackListHandler;\nimport org.springframework.stereotype.Component;\n\nimport java.net.URLDecoder;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * 字典组件 执行sql前校验 只校验表字典\n * dictCodeString格式如：\n * table,text,code\n * table where xxx,text,code\n * table,text,code, where xxx\n *\n * @Author taoYan\n * @Date 2022/3/23 21:10\n **/\n@Component(\"dictQueryBlackListHandler\")\npublic class DictQueryBlackListHandler extends AbstractQueryBlackListHandler {\n\n    @Override\n    protected List<QueryTable> getQueryTableInfo(String dictCodeString) {\n        //针对转义字符进行解码\n        try {\n            if (dictCodeString.contains(\"%\")) {\n                dictCodeString = URLDecoder.decode(dictCodeString, \"UTF-8\");\n            }\n        } catch (Exception e) {\n            //e.printStackTrace();\n        }\n        dictCodeString = dictCodeString.trim();\n        \n        // 无论什么场景 第二、三个元素一定是表的字段，直接add\n        if (dictCodeString != null && dictCodeString.indexOf(SymbolConstant.COMMA) > 0) {\n            String[] arr = dictCodeString.split(SymbolConstant.COMMA);\n            if (arr.length != 3 && arr.length != 4) {\n                return null;\n            }\n            \n            //获取表名\n            String tableName = getTableName(arr[0]);\n            QueryTable table = new QueryTable(tableName, \"\");\n            // 无论什么场景 第二、三个元素一定是表的字段，直接add\n            //参数字段1\n            table.addField(arr[1].trim());\n            //参数字段2\n            String filed = arr[2].trim();\n            if (oConvertUtils.isNotEmpty(filed)) {\n                table.addField(filed);\n            }\n            List<QueryTable> list = new ArrayList<>();\n            list.add(table);\n            return list;\n        }\n        return null;\n    }\n\n    /**\n     * 取where前面的为：table name\n     *\n     * @param str\n     * @return\n     */\n    private String getTableName(String str) {\n        String[] arr = str.split(\"\\\\s+(?i)where\\\\s+\");\n        String tableName = arr[0].trim();\n        //【20230814】解决使用参数tableName=sys_user t&复测，漏洞仍然存在\n        if (tableName.contains(\".\")) {\n            tableName = tableName.substring(tableName.indexOf(\".\")+1, tableName.length()).trim();\n        }\n        if (tableName.contains(\" \")) {\n            tableName = tableName.substring(0, tableName.indexOf(\" \")).trim();\n        }\n        \n        //【issues/4393】 sys_user , (sys_user), sys_user%20, %60sys_user%60\n        String reg = \"\\\\s+|\\\\(|\\\\)|`\";\n        return tableName.replaceAll(reg, \"\");\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementSendService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport java.util.List;\n\nimport org.jeecg.modules.system.entity.SysAnnouncementSend;\nimport org.jeecg.modules.system.model.AnnouncementSendModel;\n\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * @Description: 用户通告阅读标记表\n * @Author: jeecg-boot\n * @Date:  2019-02-21\n * @Version: V1.0\n */\npublic interface ISysAnnouncementSendService extends IService<SysAnnouncementSend> {\n\n\t/**\n\t * 获取我的消息\n\t * @param announcementSendModel\n     * @param page 当前页数\n\t * @return\n\t */\n\tpublic Page<AnnouncementSendModel> getMyAnnouncementSendPage(Page<AnnouncementSendModel> page,AnnouncementSendModel announcementSendModel);\n\n\t/**\n\t * 根据消息发送记录ID获取消息内容\n\t * @return\n\t */\n\tAnnouncementSendModel getOne(String sendId);\n\t\n\n    /**\n     * 获取当前用户已阅读的内容\n     * \n     * @param id\n     * @return\n     */\n    long getReadCountByUserId(String id);\n\n    /**\n     * 根据多个id批量删除已阅读的数量\n     * \n     * @param ids\n     */\n    void deleteBatchByIds(String ids);\n\n\t/**\n\t * 根据id更新阅读状态\n\t * @param busId\n\t * @param busType\n\t */\n    void updateReadFlagByBusId(String busId, String busType);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysAnnouncementService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.system.entity.SysAnnouncement;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * @Description: 系统通告表\n * @Author: jeecg-boot\n * @Date:  2019-01-02\n * @Version: V1.0\n */\npublic interface ISysAnnouncementService extends IService<SysAnnouncement> {\n\n    /**\n     * 保存系统通告\n     * @param sysAnnouncement\n     */\n\tpublic void saveAnnouncement(SysAnnouncement sysAnnouncement);\n\n    /**\n     * 修改系统通告\n     * @param sysAnnouncement\n     * @return\n     */\n\tpublic boolean upDateAnnouncement(SysAnnouncement sysAnnouncement);\n\n    /**\n     * 保存系统通告\n     * @param title 标题\n     * @param msgContent 信息内容\n     */\n\tpublic void saveSysAnnouncement(String title, String msgContent);\n\n    /**\n     * 分页查询系统通告\n     * @param page 当前页数\n     * @param userId 用户id\n     * @param msgCategory 消息类型\n     * @return Page<SysAnnouncement>\n     */\n\tpublic Page<SysAnnouncement> querySysCementPageByUserId(Page<SysAnnouncement> page, String userId, String msgCategory, Integer tenantId, Date beginDate);\n\n    /**\n     * 获取用户未读消息数量\n     *\n     * @param userId     用户id\n     * @param noticeType 通知类型\n     * @return\n     */\n    public Integer getUnreadMessageCountByUserId(String userId, Date beginDate, String noticeType);\n\n\n    /**\n     *  补全当前登录用户的消息阅读记录 \n     * @作废无用 2023-09-19\n     */\n    @Deprecated\n\tvoid completeAnnouncementSendInfo();\n\n    /**\n     * 补全所有用户的推送公告关系数据\n     *\n     * @param commentId\n     * @param tenantId\n     */\n    void batchInsertSysAnnouncementSend(String commentId, Integer tenantId);\n    \n    /**\n     * 分页查询当前登录用户的消息， 并且标记哪些是未读消息\n     */\n    List<SysAnnouncement> querySysMessageList(int pageSize, int pageNo, String fromUser, String starFlag, String busType, String msgCategory, Date beginDate, Date endDate, String noticeType);\n\n    /**\n     * 修改为已读消息\n     */\n    void updateReaded(List<String> annoceIdList);\n\n\n    /**\n     * 清除所有未读消息\n     */\n    void clearAllUnReadMessage();\n\n    /**\n     * 查询用户未阅读的通知公告\n     * @param userId\n     * @return\n     */\n    public List<String> getNotSendedAnnouncementlist(String userId);\n\n    /**\n     * 添加访问次数\n     * @param id\n     * @param count\n     */\n    void updateVisitsNum(String id, int count);\n\n    /**\n     * 批量下载文件\n     * @param id\n     * @param request\n     * @param response\n     */\n    void downLoadFiles(String id, HttpServletRequest request, HttpServletResponse response);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysCategoryService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.modules.system.entity.SysCategory;\nimport org.jeecg.modules.system.model.TreeSelectModel;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @Description: 分类字典\n * @Author: jeecg-boot\n * @Date:   2019-05-29\n * @Version: V1.0\n */\npublic interface ISysCategoryService extends IService<SysCategory> {\n\n\t/**根节点父ID的值*/\n\tpublic static final String ROOT_PID_VALUE = \"0\";\n\n    /**\n     * 存在子节点\n     */\n    public static final String HAS_CHILD = \"1\";\n\n    /**\n     * 添加分类字典\n     * @param sysCategory\n     */\n\tvoid addSysCategory(SysCategory sysCategory);\n\n    /**\n     * 修改分类字典\n     * @param sysCategory\n     */\n\tvoid updateSysCategory(SysCategory sysCategory);\n\t\n\t/**\n     * 根据父级编码加载分类字典的数据\n\t * @param pcode\n\t * @return\n     * @throws JeecgBootException\n\t */\n\tpublic List<TreeSelectModel> queryListByCode(String pcode) throws JeecgBootException;\n\t\n\t/**\n\t  * 根据pid查询子节点集合\n\t * @param pid\n\t * @return\n\t */\n\tpublic List<TreeSelectModel> queryListByPid(String pid);\n\n\t/**\n\t * 根据pid查询子节点集合,支持查询条件\n\t * @param pid\n\t * @param condition\n\t * @return\n\t */\n\tpublic List<TreeSelectModel> queryListByPid(String pid, Map<String,String> condition);\n\n\t/**\n\t * 根据code查询id\n\t * @param code\n\t * @return\n\t */\n\tpublic String queryIdByCode(String code);\n\n\t/**\n\t * 删除节点时同时删除子节点及修改父级节点\n\t * @param ids\n\t */\n\tvoid deleteSysCategory(String ids);\n\n\t/**\n\t * 分类字典控件数据回显[表单页面]\n\t *\n\t * @param ids\n\t * @return\n\t */\n\tList<String> loadDictItem(String ids);\n\n\t/**\n\t * 分类字典控件数据回显[表单页面]\n\t *\n\t * @param ids\n\t * @param delNotExist 是否移除不存在的项，设为false如果某个key不存在数据库中，则直接返回key本身\n\t * @return\n\t */\n\tList<String> loadDictItem(String ids, boolean delNotExist);\n\n\t/**\n\t * 【仅导入使用】分类字典控件反向翻译\n\t *\n\t * @param names\n\t * @param delNotExist 是否移除不存在的项，设为false如果某个key不存在数据库中，则直接返回key本身\n\t * @return\n\t */\n\tList<String> loadDictItemByNames(String names, boolean delNotExist);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysCheckRuleService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.system.entity.SysCheckRule;\n\n/**\n * @Description: 编码校验规则\n * @Author: jeecg-boot\n * @Date: 2020-02-04\n * @Version: V1.0\n */\npublic interface ISysCheckRuleService extends IService<SysCheckRule> {\n\n    /**\n     * 通过 code 获取规则\n     *\n     * @param ruleCode\n     * @return\n     */\n    SysCheckRule getByCode(String ruleCode);\n\n\n    /**\n     * 通过用户设定的自定义校验规则校验传入的值\n     *\n     * @param checkRule\n     * @param value\n     * @return 返回 null代表通过校验，否则就是返回的错误提示文本\n     */\n    JSONObject checkValue(SysCheckRule checkRule, String value);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysCommentService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.system.entity.SysComment;\nimport org.jeecg.modules.system.vo.SysCommentFileVo;\nimport org.jeecg.modules.system.vo.SysCommentVO;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.util.List;\n\n/**\n * @Description: 系统评论回复表\n * @Author: jeecg-boot\n * @Date: 2022-07-19\n * @Version: V1.0\n */\npublic interface ISysCommentService extends IService<SysComment> {\n\n\n    /**\n     * 保存评论 返回评论ID\n     *\n     * @param sysComment\n     */\n    String saveOne(SysComment sysComment);\n\n    /**\n     * 删除\n     *\n     * @param id\n     */\n    void deleteOne(String id);\n\n    /**\n     * 根据表名和数据id查询表单评论及文件信息\n     *\n     * @param sysComment\n     * @return\n     */\n    List<SysCommentVO> queryFormCommentInfo(SysComment sysComment);\n\n\n    /**\n     * 保存文件+评论\n     *\n     * @param req\n     */\n    void saveOneFileComment(HttpServletRequest req);\n\n\n    /**\n     * 查询当前表单的文件列表\n     *\n     * @param tableName\n     * @param formDataId\n     * @return\n     */\n    List<SysCommentFileVo> queryFormFileList(String tableName, String formDataId);\n    /**\n     * app端 保存文件+评论\n     *\n     * @param request\n     */\n    void appSaveOneFileComment(HttpServletRequest request);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDataLogService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport org.jeecg.modules.system.entity.SysDataLog;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * @Description: 数据日志service接口\n * @author: jeecg-boot\n */\npublic interface ISysDataLogService extends IService<SysDataLog> {\n\t\n\t/**\n\t * 添加数据日志\n\t * @param tableName\n\t * @param dataId\n\t * @param dataContent\n\t */\n\tpublic void addDataLog(String tableName, String dataId, String dataContent);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDataSourceService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.modules.system.entity.SysDataSource;\n\n/**\n * @Description: 多数据源管理\n * @Author: jeecg-boot\n * @Date: 2019-12-25\n * @Version: V1.0\n */\npublic interface ISysDataSourceService extends IService<SysDataSource> {\n\n    /**\n     * 添加数据源\n     * @param sysDataSource\n     * @return\n     */\n    Result saveDataSource(SysDataSource sysDataSource);\n\n    /**\n     * 修改数据源\n     * @param sysDataSource\n     * @return\n     */\n    Result editDataSource(SysDataSource sysDataSource);\n\n\n    /**\n     * 删除数据源\n     * @param id\n     * @return\n     */\n    Result deleteDataSource(String id);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartPermissionService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport org.jeecg.modules.system.entity.SysDepartPermission;\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.system.entity.SysPermissionDataRule;\n\nimport java.util.List;\n\n/**\n * @Description: 部门权限表\n * @Author: jeecg-boot\n * @Date:   2020-02-11\n * @Version: V1.0\n */\npublic interface ISysDepartPermissionService extends IService<SysDepartPermission> {\n    /**\n     * 保存授权 将上次的权限和这次作比较 差异处理提高效率\n     * @param departId\n     * @param permissionIds\n     * @param lastPermissionIds\n     */\n    public void saveDepartPermission(String departId,String permissionIds,String lastPermissionIds);\n\n    /**\n     * 根据部门id，菜单id获取数据规则\n     * @param permissionId 菜单id\n     * @param departId 部门id\n     * @return\n     */\n    List<SysPermissionDataRule> getPermRuleListByDeptIdAndPermId(String departId,String permissionId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartRolePermissionService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport org.jeecg.modules.system.entity.SysDepartRolePermission;\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * @Description: 部门角色权限\n * @Author: jeecg-boot\n * @Date:   2020-02-12\n * @Version: V1.0\n */\npublic interface ISysDepartRolePermissionService extends IService<SysDepartRolePermission> {\n    /**\n     * 保存授权 将上次的权限和这次作比较 差异处理提高效率\n     * @param roleId\n     * @param permissionIds\n     * @param lastPermissionIds\n     */\n    public void saveDeptRolePermission(String roleId,String permissionIds,String lastPermissionIds);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartRoleService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport org.jeecg.modules.system.entity.SysDepartRole;\nimport com.baomidou.mybatisplus.extension.service.IService;\n\nimport java.util.List;\n\n/**\n * @Description: 部门角色\n * @Author: jeecg-boot\n * @Date:   2020-02-12\n * @Version: V1.0\n */\npublic interface ISysDepartRoleService extends IService<SysDepartRole> {\n\n    /**\n     * 根据用户id，部门id查询可授权所有部门角色\n     * @param orgCode\n     * @param userId\n     * @return\n     */\n    List<SysDepartRole> queryDeptRoleByDeptAndUser(String orgCode, String userId);\n\n    /**\n     *  删除部门角色和对应关联表信息\n     * @param ids\n     */\n    void deleteDepartRole(List<String> ids);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartRoleUserService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport org.jeecg.modules.system.entity.SysDepartRoleUser;\nimport com.baomidou.mybatisplus.extension.service.IService;\n\nimport java.util.List;\n\n/**\n * @Description: 部门角色人员信息\n * @Author: jeecg-boot\n * @Date:   2020-02-13\n * @Version: V1.0\n */\npublic interface ISysDepartRoleUserService extends IService<SysDepartRoleUser> {\n\n    /**\n     * 添加用户与部门关联\n     * @param userId 用户id\n     * @param newRoleId 新的角色id\n     * @param oldRoleId 旧的角色id\n     */\n    void deptRoleUserAdd(String userId,String newRoleId,String oldRoleId);\n\n    /**\n     * 取消用户与部门关联，删除关联关系\n     * @param userIds\n     * @param depId\n     */\n    void removeDeptRoleUser(List<String> userIds,String depId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.system.entity.SysDepart;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.model.DepartIdModel;\nimport org.jeecg.modules.system.model.SysDepartTreeModel;\nimport org.jeecg.modules.system.vo.SysChangeDepartVo;\nimport org.jeecg.modules.system.vo.SysDepartExportVo;\nimport org.jeecg.modules.system.vo.SysPositionSelectTreeVo;\nimport org.jeecg.modules.system.vo.lowapp.ExportDepartVo;\n\nimport java.util.List;\n\n/**\n * <p>\n * 部门表 服务实现类\n * <p>\n * \n * @Author:Steve\n * @Since：   2019-01-22\n */\npublic interface ISysDepartService extends IService<SysDepart>{\n\n    /**\n     * 查询我的部门信息,并分节点进行显示\n     * @param departIds 部门id\n     * @return\n     */\n    List<SysDepartTreeModel> queryMyDeptTreeList(String departIds);\n\n    /**\n     * 查询所有部门信息,并分节点进行显示\n     * @return\n     */\n    List<SysDepartTreeModel> queryTreeList();\n\n\n    /**\n     * 查询所有部门信息,并分节点进行显示\n     * @param ids 多个部门id\n     * @return\n     */\n    List<SysDepartTreeModel> queryTreeList(String ids);\n\n    /**\n     * 查询所有部门DepartId信息,并分节点进行显示\n     * @return\n     */\n    public List<DepartIdModel> queryDepartIdTreeList();\n\n    /**\n     * 保存部门数据\n     * @param sysDepart\n     * @param username 用户名\n     */\n    void saveDepartData(SysDepart sysDepart,String username);\n\n    /**\n     * 更新depart数据\n     * @param sysDepart\n     * @param username 用户名\n     * @return\n     */\n    Boolean updateDepartDataById(SysDepart sysDepart,String username);\n    \n    /**\n     * 删除depart数据\n     * @param id\n     * @return\n     */\n\t/* boolean removeDepartDataById(String id); */\n    \n    /**\n     * 根据关键字搜索相关的部门数据\n     *\n     * @param keyWord\n     * @param myDeptSearch\n     * @param departIds    多个部门id\n     * @param orgCategory\n     * @param depIds\n     * @return\n     */\n    List<SysDepartTreeModel> searchByKeyWord(String keyWord, String myDeptSearch, String departIds, String orgCategory, String depIds);\n    \n    /**\n     * 根据部门id删除并删除其可能存在的子级部门\n     * @param id\n     * @return\n     */\n    boolean delete(String id);\n    \n    /**\n     * 查询SysDepart集合\n     * @param userId\n     * @return\n     */\n\tpublic List<SysDepart> queryUserDeparts(String userId);\n\n    /**\n     * 根据用户名查询部门\n     *\n     * @param username\n     * @return\n     */\n    List<SysDepart> queryDepartsByUsername(String username);\n    \n    /**\n     * 根据用户ID查询部门\n     *\n     * @param userId\n     * @return\n     */\n    List<String> queryDepartsByUserId(String userId);\n\n\t /**\n     * 根据部门id批量删除并删除其可能存在的子级部门\n     * @param ids 多个部门id\n     * @return\n     */\n\tvoid deleteBatchWithChildren(List<String> ids);\n\n    /**\n     *  根据部门Id查询,当前和下级所有部门IDS\n     * @param departId\n     * @return\n     */\n    List<String> getSubDepIdsByDepId(String departId);\n\n    /**\n     * 获取我的部门下级所有部门IDS\n     * @param departIds 多个部门id\n     * @return\n     */\n    List<String> getMySubDepIdsByDepId(String departIds);\n    /**\n     * 根据关键字获取部门信息（通讯录）\n     * @param keyWord 搜索词\n     * @return\n     */\n    List<SysDepartTreeModel> queryTreeByKeyWord(String keyWord);\n    /**\n     * 获取我的部门下级所有部门\n     * @param parentId 父id\n     * @param ids 多个部门id\n     * @param primaryKey 主键字段（id或者orgCode）\n     * @return\n     */\n    List<SysDepartTreeModel> queryTreeListByPid(String parentId,String ids, String primaryKey);\n\n    /**\n     * 获取某个部门的所有父级部门的ID\n     *\n     * @param departId 根据departId查\n     * @return JSONObject\n     */\n    JSONObject queryAllParentIdByDepartId(String departId);\n\n    /**\n     * 获取某个部门的所有父级部门的ID\n     *\n     * @param orgCode 根据orgCode查\n     * @return JSONObject\n     */\n    JSONObject queryAllParentIdByOrgCode(String orgCode);\n    /**\n     * 获取公司信息\n     * @param orgCode 部门编码\n     * @return\n     */\n    SysDepart queryCompByOrgCode(String orgCode);\n    /**\n     * 获取下级部门\n     * @param pid\n     * @return\n     */\n    List<SysDepart> queryDeptByPid(String pid);\n\n    /**\n     * 获取我的部门已加入的公司\n     * @return\n     */\n    List<SysDepart> getMyDepartList();\n\n    /**\n     * 删除部门\n     * @param id\n     */\n    void deleteDepart(String id);\n\n    /**\n     * 通讯录通过租户id查询部门数据\n     * @param parentId\n     * @param tenantId\n     * @param departName\n     * @return\n     */\n    List<SysDepartTreeModel> queryBookDepTreeSync(String parentId, Integer tenantId, String departName);\n\n    /**\n     * 根据id查询部门信息\n     * @param parentId\n     * @return\n     */\n    SysDepart getDepartById(String parentId);\n\n    /**\n     * 根据id查询部门信息\n     * @param parentId\n     * @return\n     */\n    IPage<SysDepart> getMaxCodeDepart(Page<SysDepart> page, String parentId);\n\n    /**\n     * 更新叶子节点\n     * @param id\n     * @param izLeaf\n     */\n    void updateIzLeaf(String id, Integer izLeaf);\n\n    /**\n     * 获取导出部门的数据\n     * @param tenantId\n     * @return\n     */\n    List<ExportDepartVo> getExcelDepart(int tenantId);\n\n    void importExcel(List<ExportDepartVo> listSysDeparts, List<String> errorMessageList);\n\n    /**\n     * 根据租户id导出部门\n     * @param tenantId\n     * @param idList\n     * @return\n     */\n    List<SysDepartExportVo> getExportDepart(Integer tenantId, List<String> idList);\n\n    /**\n     * 导出系统部门excel\n     * @param listSysDeparts\n     * @param errorMessageList\n     */\n    void importSysDepart(List<SysDepartExportVo> listSysDeparts, List<String> errorMessageList);\n\n    /**\n     * 根据部门id和职级id获取岗位信息\n     *\n     * @param parentId\n     * @param departId\n     * @param positionId\n     */\n    List<SysPositionSelectTreeVo> getPositionByDepartId(String parentId, String departId, String positionId);\n\n    /**\n     * 获取职级关系\n     * @param departId\n     * @return\n     */\n    List<SysPositionSelectTreeVo> getRankRelation(String departId);\n\n    /**\n     * 异步查询部门和岗位接口\n     *\n     * @param parentId\n     * @param ids\n     * @param primaryKey\n     * @param departIds\n     * @return\n     */\n    List<SysDepartTreeModel> queryDepartAndPostTreeSync(String parentId, String ids, String primaryKey, String departIds,String orgName);\n\n    /**\n     * 根据部门code获取当前和上级部门名称\n     *\n     * @param orgCode\n     * @param depId\n     * @return\n     */\n    String getDepartPathNameByOrgCode(String orgCode, String depId);\n\n    /**\n     * 根据部门id获取部门下的岗位id\n     *\n     * @param depIds 当前选择的公司、子公司、部门id\n     * @return\n     */\n    String getDepPostIdByDepId(String depIds);\n\n    /**\n     * 调整部门位置\n     * \n     * @param changeDepartVo\n     * @return\n     */\n    void updateChangeDepart(SysChangeDepartVo changeDepartVo);\n\n    /**\n     * 获取部门负责人\n     * \n     * @param departId\n     * @param page\n     * @return\n     */\n    IPage<SysUser> getDepartmentHead(String departId, Page<SysUser> page);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDictItemService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport org.jeecg.modules.system.entity.SysDictItem;\nimport com.baomidou.mybatisplus.extension.service.IService;\n\nimport java.util.List;\n\n/**\n * <p>\n *  服务类\n * </p>\n *\n * @Author zhangweijian\n * @since 2018-12-28\n */\npublic interface ISysDictItemService extends IService<SysDictItem> {\n\n    /**\n     * 通过字典id查询字典项\n     * @param mainId 字典id\n     * @return\n     */\n    public List<SysDictItem> selectItemsByMainId(String mainId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysDictService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.common.system.vo.DictModel;\nimport org.jeecg.common.system.vo.DictQuery;\nimport org.jeecg.modules.system.entity.SysDict;\nimport org.jeecg.modules.system.entity.SysDictItem;\nimport org.jeecg.modules.system.model.DuplicateCheckVo;\nimport org.jeecg.modules.system.model.TreeSelectModel;\nimport org.jeecg.modules.system.vo.lowapp.SysDictVo;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * <p>\n * 字典表 服务类\n * </p>\n *\n * @Author zhangweijian\n * @since 2018-12-28\n */\npublic interface ISysDictService extends IService<SysDict> {\n\n\t/**\n\t *  校验数据是否可用，不存在重复数据\n\t *  \n\t * @param duplicateCheckVo\n\t * @return\n\t */\n\t@Deprecated\n\tpublic boolean duplicateCheckData(DuplicateCheckVo duplicateCheckVo);\n\n    /**\n     * 通过字典code获取字典数据\n     * @param code\n     * @return\n     */\n    public List<DictModel> queryDictItemsByCode(String code);\n\n\t/**\n\t * 查询有效的数据字典项\n\t * @param code\n\t * @return\n\t */\n\tList<DictModel> queryEnableDictItemsByCode(String code);\n\n\t/**\n\t * 通过多个字典code获取字典数据\n\t *\n\t * @param dictCodeList\n\t * @return key = 字典code，value=对应的字典选项\n\t */\n\tMap<String, List<DictModel>> queryDictItemsByCodeList(List<String> dictCodeList);\n\n    /**\n     * 登录加载系统字典\n     * @return\n     */\n    public Map<String,List<DictModel>> queryAllDictItems();\n\n    /**\n     * 查通过查询指定table的 text code 获取字典\n     * @param tableFilterSql\n     * @param text\n     * @param code\n     * @return\n     */\n    @Deprecated\n    List<DictModel> queryTableDictItemsByCode(String tableFilterSql, String text, String code);\n\n    /**\n     * 通过查询指定table的 text code 获取字典（指定查询条件）\n     * @param table\n     * @param text\n     * @param code\n     * @param filterSql\n     * @return\n     */\n    @Deprecated\n\tpublic List<DictModel> queryTableDictItemsByCodeAndFilter(String table, String text, String code, String filterSql);\n\n    /**\n     * 通过字典code及字典项的value获取字典文本\n     * @param code\n     * @param key\n     * @return\n     */\n    public String queryDictTextByKey(String code, String key);\n\n\t/**\n\t * 可通过多个字典code查询翻译文本\n\t * @param dictCodeList 多个字典code\n\t * @param keys 数据列表\n\t * @return\n\t */\n\tMap<String, List<DictModel>> queryManyDictByKeys(List<String> dictCodeList, List<String> keys);\n\n    /**\n     * 通过查询指定table的 text code key 获取字典值\n     * @param table\n     * @param text\n     * @param code\n     * @param key\n     * @return\n     */\n    @Deprecated\n\tString queryTableDictTextByKey(String table, String text, String code, String key);\n\n\t/**\n\t * 通过查询指定table的 text code key 获取字典值，可批量查询\n\t *\n\t * @param table\n\t * @param text\n\t * @param code\n\t * @param keys\n\t * @param dataSource 数据源\n\t * @return\n\t */\n\tList<DictModel> queryTableDictTextByKeys(String table, String text, String code, List<String> keys, String dataSource);\n\n    /**\n     * 通过查询指定table的 text code key 获取字典值，包含value\n     * @param table 表名\n     * @param text\n     * @param code\n     * @param keys\n     * @return\n     */\n\t@Deprecated\n\tList<String> queryTableDictByKeys(String table, String text, String code, String keys);\n\n    /**\n     * 通过查询指定table的 text code key 获取字典值，包含value\n     * @param table\n     * @param text\n     * @param code\n     * @param keys\n     * @param delNotExist\n     * @return\n     */\n\t@Deprecated\n\tList<String> queryTableDictByKeys(String table, String text, String code, String keys,boolean delNotExist);\n\n    /**\n     * 根据字典类型删除关联表中其对应的数据\n     *\n     * @param sysDict\n     * @return\n     */\n    boolean deleteByDictId(SysDict sysDict);\n\n    /**\n     * 添加一对多\n     * @param sysDict\n     * @param sysDictItemList\n     * @return Integer\n     */\n    public Integer saveMain(SysDict sysDict, List<SysDictItem> sysDictItemList);\n\n    /**\n\t * 查询所有部门 作为字典信息 id -->value,departName -->text\n\t * @return\n\t */\n\tpublic List<DictModel> queryAllDepartBackDictModel();\n\n\t/**\n\t * 查询所有用户  作为字典信息 username -->value,realname -->text\n\t * @return\n\t */\n\tpublic List<DictModel> queryAllUserBackDictModel();\n\n//\t/**\n//\t * 通过关键字查询字典表\n//\t * @param table\n//\t * @param text\n//\t * @param code\n//\t * @param keyword\n//\t * @return\n//\t */\n//\t@Deprecated\n//\tpublic List<DictModel> queryTableDictItems(String table, String text, String code,String keyword);\n\n\t/**\n\t * 查询字典表数据 只查询前10条\n\t * @param table\n\t * @param text\n\t * @param code\n\t * @param keyword\n     * @param condition\n     * @param pageSize 每页条数\n\t * @return\n\t */\n\t@Deprecated\n\tpublic List<DictModel> queryLittleTableDictItems(String table, String text, String code, String condition, String keyword, int pageNo, int pageSize);\n\n\t/**\n\t * 查询字典表所有数据\n\t * @param table\n\t * @param text\n\t * @param code\n\t * @param condition\n\t * @param keyword\n\t * @return\n\t */\n\t@Deprecated\n\tpublic List<DictModel> queryAllTableDictItems(String table, String text, String code, String condition, String keyword);\n\t/**\n\t  * 根据表名、显示字段名、存储字段名 查询树\n\t * @param table\n\t * @param text\n\t * @param code\n\t * @param pidField\n\t * @param pid\n\t * @param hasChildField\n     * @param query\n\t * @return\n\t */\n\t@Deprecated\n\tList<TreeSelectModel> queryTreeList(Map<String, String> query,String table, String text, String code, String pidField,String pid,String hasChildField,int converIsLeafVal);\n\n\t/**\n\t * 真实删除\n\t * @param id\n\t */\n\tpublic void deleteOneDictPhysically(String id);\n\n\t/**\n\t * 修改delFlag\n\t * @param delFlag\n\t * @param id\n\t */\n\tpublic void updateDictDelFlag(int delFlag,String id);\n\n\t/**\n\t * 查询被逻辑删除的数据\n\t * @return\n\t */\n\tpublic List<SysDict> queryDeleteList(String tenantId);\n\n\t/**\n\t * 分页查询\n\t * @param query\n\t * @param pageSize\n\t * @param pageNo\n\t * @return\n\t */\n\t@Deprecated\n\tpublic List<DictModel> queryDictTablePageList(DictQuery query,int pageSize, int pageNo);\n\n    /**\n     * 获取字典数据\n     * @param dictCode 字典code\n     * @param dictCode 表名,文本字段,code字段  | 举例：sys_user,realname,id\n     * @return\n     */\n    List<DictModel> getDictItems(String dictCode);\n\n    /**\n     * 【JSearchSelectTag下拉搜索组件专用接口】\n     * 大数据量的字典表 走异步加载  即前端输入内容过滤数据\n     *\n     * @param dictCode 字典code格式：table,text,code\n     * @param keyword\n     * @param pageNo\n     * @param pageSize 每页条数\n     * @return\n     */\n    List<DictModel> loadDict(String dictCode, String keyword, Integer pageNo, Integer pageSize);\n\n\t/**\n\t * 根据应用id获取字典列表和详情\n\t * @param lowAppId\n\t * @return\n\t */\n\tList<SysDictVo> getDictListByLowAppId(String lowAppId);\n\n\t/**\n\t * 创建字典\n\t * @param sysDictVo\n\t */\n\tString addDictByLowAppId(SysDictVo sysDictVo);\n\n\t/**\n\t * 编辑字典\n\t * @param sysDictVo\n\t */\n\tvoid editDictByLowAppId(SysDictVo sysDictVo);\n\n\t/**\n\t * 还原逻辑删除\n\t * @param ids\n\t */\n\tboolean revertLogicDeleted(List<String> ids);\n\n\t/**\n\t * 彻底删除数据\n\t * @param ids\n\t */\n\tboolean removeLogicDeleted(List<String> ids);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysFillRuleService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.system.entity.SysFillRule;\n\n/**\n * @Description: 填值规则\n * @Author: jeecg-boot\n * @Date: 2019-11-07\n * @Version: V1.0\n */\npublic interface ISysFillRuleService extends IService<SysFillRule> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysFormFileService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.system.entity.SysFormFile;\n\n/**\n * @Description: 表单评论文件\n * @Author: jeecg-boot\n * @Date: 2022-07-21\n * @Version: V1.0\n */\npublic interface ISysFormFileService extends IService<SysFormFile> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysGatewayRouteService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.system.entity.SysGatewayRoute;\n\nimport java.util.List;\n\n/**\n * @Description: gateway路由管理\n * @Author: jeecg-boot\n * @Date:   2020-05-26\n * @Version: V1.0\n */\npublic interface ISysGatewayRouteService extends IService<SysGatewayRoute> {\n\n    /**\n     * 添加所有的路由信息到redis\n     * @param key\n     */\n     void addRoute2Redis(String key);\n\n    /**\n     * 删除路由\n     * @param id\n     */\n     void deleteById(String id);\n\n    /**\n     * 保存路由配置\n     * @param array\n     */\n    void updateAll(JSONObject array);\n\n    /**\n     * 清空redis中的route信息\n     */\n    void clearRedis();\n\n    /**\n     * 还原逻辑删除\n     * @param ids\n     */\n    void revertLogicDeleted(List<String> ids);\n\n    /**\n     * 彻底删除\n     * @param ids\n     */\n    void deleteLogicDeleted(List<String> ids);\n\n    /**\n     * 复制路由\n     * @param id\n     * @return\n     */\n    SysGatewayRoute copyRoute(String id);\n\n    /**\n     * 获取删除列表\n     * @return\n     */\n    List<SysGatewayRoute> getDeletelist();\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysLogService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport java.util.Date;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.jeecg.modules.system.entity.SysLog;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * <p>\n * 系统日志表 服务类\n * </p>\n *\n * @Author zhangweijian\n * @since 2018-12-26\n */\npublic interface ISysLogService extends IService<SysLog> {\n\n\t/**\n\t * 清空所有日志记录\n\t */\n\tpublic void removeAll();\n\t\n\t/**\n\t * 获取系统总访问次数\n\t *\n\t * @return Long\n\t */\n\tLong findTotalVisitCount();\n\n\t/**\n\t * 获取系统今日访问次数\n     * @param dayStart\n\t * @param dayEnd\n\t * @return Long\n\t */\n\tLong findTodayVisitCount(Date dayStart, Date dayEnd);\n\n\t/**\n\t * 获取系统今日访问 IP数\n\t * @param dayStart 开始时间\n     * @param dayEnd 结束时间\n\t * @return Long\n\t */\n\tLong findTodayIp(Date dayStart, Date dayEnd);\n\t\n\t/**\n\t *   首页：根据时间统计访问数量/ip数量\n\t * @param dayStart\n\t * @param dayEnd\n\t * @return\n\t */\n\tList<Map<String,Object>> findVisitCount(Date dayStart, Date dayEnd);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysPackPermissionService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport org.jeecg.modules.system.entity.SysPackPermission;\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * @Description: 产品包菜单关系表\n * @Author: jeecg-boot\n * @Date:   2022-12-31\n * @Version: V1.0\n */\npublic interface ISysPackPermissionService extends IService<SysPackPermission> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysPermissionDataRuleService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport java.util.List;\n\nimport org.jeecg.modules.system.entity.SysPermissionDataRule;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * <p>\n * 菜单权限规则 服务类\n * </p>\n *\n * @Author huangzhilin\n * @since 2019-04-01\n */\npublic interface ISysPermissionDataRuleService extends IService<SysPermissionDataRule> {\n\n\t/**\n\t * 根据菜单id查询其对应的权限数据\n\t * \n\t * @param permissionId\n     * @return List<SysPermissionDataRule>\n\t */\n\tList<SysPermissionDataRule> getPermRuleListByPermId(String permissionId);\n\n\t/**\n\t * 根据页面传递的参数查询菜单权限数据\n\t * @param permRule\n\t * @return\n\t */\n\tList<SysPermissionDataRule> queryPermissionRule(SysPermissionDataRule permRule);\n\t\n\t\n\t/**\n\t  * 根据菜单ID和用户名查找数据权限配置信息\n\t * @param permissionId\n\t * @param username\n\t * @return\n\t */\n\tList<SysPermissionDataRule> queryPermissionDataRules(String username,String permissionId);\n\t\n\t/**\n\t * 新增菜单权限配置 修改菜单rule_flag\n\t * @param sysPermissionDataRule\n\t */\n\tpublic void savePermissionDataRule(SysPermissionDataRule sysPermissionDataRule);\n\t\n\t/**\n\t * 删除菜单权限配置 判断菜单还有无权限\n\t * @param dataRuleId\n\t */\n\tpublic void deletePermissionDataRule(String dataRuleId);\n\t\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysPermissionService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.modules.system.entity.SysPermission;\nimport org.jeecg.modules.system.model.TreeModel;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * <p>\n * 菜单权限表 服务类\n * </p>\n *\n * @Author scott\n * @since 2018-12-21\n */\npublic interface ISysPermissionService extends IService<SysPermission> {\n    /**\n     * 切换vue3菜单\n     */\n\tpublic void switchVue3Menu();\n\t\n    /**\n     * 通过父id查询菜单\n     * @param parentId 父id\n     * @return\n     */\n\tpublic List<TreeModel> queryListByParentId(String parentId);\n\t\n\t/**\n     * 真实删除\n     * @param id 菜单id\n     * @throws JeecgBootException\n     */\n\tpublic void deletePermission(String id) throws JeecgBootException;\n\t/**\n     * 逻辑删除\n     * @param id 菜单id\n     * @throws JeecgBootException\n     */\n\tpublic void deletePermissionLogical(String id) throws JeecgBootException;\n\n    /**\n     * 添加菜单\n     * @param sysPermission SysPermission对象\n     * @throws JeecgBootException\n     */\n\tpublic void addPermission(SysPermission sysPermission) throws JeecgBootException;\n\n    /**\n     * 编辑菜单\n     * @param sysPermission SysPermission对象\n     * @throws JeecgBootException\n     */\n\tpublic void editPermission(SysPermission sysPermission) throws JeecgBootException;\n\n    /**\n     * 获取登录用户拥有的权限\n     * @param username 用户名\n     * @return\n     */\n\tpublic List<SysPermission> queryByUser(String username);\n\t\n\t/**\n\t * 根据permissionId删除其关联的SysPermissionDataRule表中的数据\n\t * \n\t * @param id\n\t * @return\n\t */\n\tpublic void deletePermRuleByPermId(String id);\n\t\n\t/**\n\t  * 查询出带有特殊符号的菜单地址的集合\n\t * @return\n\t */\n\tpublic List<String> queryPermissionUrlWithStar();\n\n\t/**\n\t * 判断用户否拥有权限\n\t * @param username\n\t * @param sysPermission\n\t * @return\n\t */\n\tpublic boolean hasPermission(String username, SysPermission sysPermission);\n\n\t/**\n\t * 根据用户和请求地址判断是否有此权限\n\t * @param username\n\t * @param url\n\t * @return\n\t */\n\tpublic boolean hasPermission(String username, String url);\n\n\t/**\n\t * 查询部门权限数据\n\t * @param departId\n\t * @return\n\t */\n\tList<SysPermission> queryDepartPermissionList(String departId);\n\n\t/**\n\t * 检测地址是否存在(聚合路由的情况下允许使用子菜单路径作为父菜单的路由地址)\n\t * @param id\n\t * @param url\n\t * @param alwaysShow 是否是聚合路由\n\t * @return\n\t */\n\t boolean checkPermDuplication(String id, String url,Boolean alwaysShow);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysPositionService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.system.entity.SysPosition;\n\nimport java.util.List;\n\n/**\n * @Description: 职务表\n * @Author: jeecg-boot\n * @Date: 2019-09-19\n * @Version: V1.0\n */\npublic interface ISysPositionService extends IService<SysPosition> {\n\n    /**\n     * 通过code查询\n     * @param code 职务编码\n     * @return SysPosition\n     */\n    SysPosition getByCode(String code);\n\n    /**\n     * 通过用户id获取职位名称列表\n     * @param userId\n     * @return\n     */\n    List<SysPosition> getPositionList(String userId);\n\n    /**\n     * 获取职位名称\n     * @param postList\n     * @return\n     */\n    String getPositionName(List<String> postList);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysRoleIndexService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.system.entity.SysRoleIndex;\n\n/**\n * @Description: 角色首页配置\n * @Author: jeecg-boot\n * @Date: 2022-03-25\n * @Version: V1.0\n */\npublic interface ISysRoleIndexService extends IService<SysRoleIndex> {\n\n    /**\n     * 查询默认首页\n     *\n     * @return\n     */\n    SysRoleIndex queryDefaultIndex();\n\n    /**\n     * 更新默认首页\n     *\n     * @param url\n     * @param component\n     * @param isRoute   是否是路由页面\n     * @return\n     */\n    boolean updateDefaultIndex(String url, String component, boolean isRoute);\n\n    /**\n     * 创建最原始的默认首页配置\n     *\n     * @return\n     */\n    SysRoleIndex initDefaultIndex();\n\n    /**\n     * 清理默认首页的redis缓存\n     */\n    void cleanDefaultIndexCache();\n\n    /**\n     * 切换默认门户\n     * @param sysRoleIndex\n     */\n    void changeDefHome(SysRoleIndex sysRoleIndex);\n\n    /**\n     * 更新其他全局默认的状态值\n     *\n     * @param roleCode\n     * @param status\n     * @param id\n     */\n    void updateOtherDefaultStatus(String roleCode, String status, String id);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysRolePermissionService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport org.jeecg.modules.system.entity.SysRolePermission;\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * <p>\n * 角色权限表 服务类\n * </p>\n *\n * @Author scott\n * @since 2018-12-21\n */\npublic interface ISysRolePermissionService extends IService<SysRolePermission> {\n\t\n\t/**\n\t * 保存授权/先删后增\n\t * @param roleId\n\t * @param permissionIds\n\t */\n\tpublic void saveRolePermission(String roleId,String permissionIds);\n\t\n\t/**\n\t * 保存授权 将上次的权限和这次作比较 差异处理提高效率 \n\t * @param roleId\n\t * @param permissionIds\n\t * @param lastPermissionIds\n\t */\n\tpublic void saveRolePermission(String roleId,String permissionIds,String lastPermissionIds);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysRoleService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.modules.system.entity.SysRole;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport java.util.List;\n\n/**\n * <p>\n * 角色表 服务类\n * </p>\n *\n * @Author scott\n * @since 2018-12-19\n */\npublic interface ISysRoleService extends IService<SysRole> {\n    /**\n     * 查询全部的角色（不做租户隔离）\n     * @param page\n     * @param role\n     * @return\n     */\n    Page<SysRole> listAllSysRole(@Param(\"page\") Page<SysRole> page, SysRole role);\n\n    /**\n     * 查询角色是否存在不做租户隔离\n     *\n     * @param roleCode\n     * @return\n     */\n    SysRole getRoleNoTenant(@Param(\"roleCode\") String roleCode);\n    \n    /**\n     * 导入 excel ，检查 roleCode 的唯一性\n     *\n     * @param file\n     * @param params\n     * @return\n     * @throws Exception\n     */\n    Result importExcelCheckRoleCode(MultipartFile file, ImportParams params) throws Exception;\n\n    /**\n     * 删除角色\n     * @param roleid\n     * @return\n     */\n    public boolean deleteRole(String roleid);\n\n    /**\n     * 批量删除角色\n     * @param roleids\n     * @return\n     */\n    public boolean deleteBatchRole(String[] roleids);\n\n    /**\n     * 根据角色id和当前租户判断当前角色是否存在这个租户中\n     * @param id\n     * @return\n     */\n    Long getRoleCountByTenantId(String id, Integer tenantId);\n\n    /**\n     * 验证是否为admin角色\n     * \n     * @param ids\n     */\n    void checkAdminRoleRejectDel(String ids);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysTableWhiteListService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.system.entity.SysTableWhiteList;\n\nimport java.util.Map;\n\n/**\n * @Description: 系统表白名单\n * @Author: jeecg-boot\n * @Date: 2023-09-12\n * @Version: V1.0\n */\npublic interface ISysTableWhiteListService extends IService<SysTableWhiteList> {\n\n    /**\n     * 新增\n     *\n     * @param sysTableWhiteList\n     * @return\n     */\n    boolean add(SysTableWhiteList sysTableWhiteList);\n\n    /**\n     * 编辑\n     *\n     * @param sysTableWhiteList\n     * @return\n     */\n    boolean edit(SysTableWhiteList sysTableWhiteList);\n\n    /**\n     * 通过id删除，可批量删除\n     *\n     * @param ids 多个使用逗号分割\n     * @return\n     */\n    boolean deleteByIds(String ids);\n\n    /**\n     * 自动添加到数据库中\n     *\n     * @param tableName\n     * @param fieldName\n     * @return\n     */\n    SysTableWhiteList autoAdd(String tableName, String fieldName);\n\n    /**\n     * 以map的方式获取所有数据\n     * key=tableName，value=fieldName\n     *\n     * @return\n     */\n    Map<String, String> getAllConfigMap();\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysTenantPackService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport org.jeecg.modules.system.entity.SysTenantPack;\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.system.entity.SysTenantPackUser;\n\nimport java.util.List;\n\n/**\n * @Description: 租户产品包\n * @Author: jeecg-boot\n * @Date:   2022-12-31\n * @Version: V1.0\n */\npublic interface ISysTenantPackService extends IService<SysTenantPack> {\n\n    /**\n     * 新增产品包并将菜单插入关系表\n     * @param sysTenantPack\n     */\n    void addPackPermission(SysTenantPack sysTenantPack);\n\n    /**\n     * 设置菜单id\n     * @param records\n     * @return\n     */\n    List<SysTenantPack> setPermissions(List<SysTenantPack> records);\n\n    /**\n     * 编辑产品包并将菜单插入关系表\n     * @param sysTenantPack\n     */\n    void editPackPermission(SysTenantPack sysTenantPack);\n\n    /**\n     * 删除租户产品包\n     * @param ids\n     */\n    void deleteTenantPack(String ids);\n\n    /**\n     * 退出租户\n     * @param tenantId\n     * @param s\n     */\n    void exitTenant(String tenantId, String s);\n\n    /**\n     * 创建租户的时候默认创建3个 产品包\n     * @param tenantId\n     */\n    void addDefaultTenantPack(Integer tenantId);\n\n    /**\n     * 保存产品包\n     * @param sysTenantPack\n     */\n    String saveOne(SysTenantPack sysTenantPack);\n\n\n    /**\n     * 保存产品包和人员的关系\n     * @param sysTenantPackUser\n     */\n    void savePackUser(SysTenantPackUser sysTenantPackUser);\n\n    /**\n     * 根据租户ID和编码查询\n     * @param tenantId\n     * @param packCode\n     * @return\n     */\n    SysTenantPack getSysTenantPack(Integer tenantId ,String packCode);\n   \n    /**\n     * 添加由管理员创建的默认产品包\n     * @param id\n     */\n    void addTenantDefaultPack(Integer id);\n\n    /**\n     * 同步默认的套餐\n     * for [QQYUN-11032]【jeecg】租户套餐管理增加初始化套餐包按钮\n     * @param tenantId\n     * @author chenrui\n     * @date 2025/2/5 19:08\n     */\n    void syncDefaultPack(Integer tenantId);\n\n    /**\n     * 根据用户id和当前的租户id获取产品包的id\n     *\n     * @param userId\n     * @param tenantId\n     * @return\n     */\n    List<String> getPackIdByUserIdAndTenantId(String userId, Integer tenantId);\n\n    /**\n     * 根据租户id获取用户的产品包列表\n     *\n     * @param tenantId\n     * @return\n     */\n    List<SysTenantPack> getPackListByTenantId(String tenantId);\n\n    /**\n     * 是否为拥有管理用户权限【accountAdmin，superAdmin】\n     * \n     * @param tenantId\n     */\n    void izHaveManageUserAuth(String tenantId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysTenantService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.modules.system.entity.SysTenant;\nimport org.jeecg.modules.system.entity.SysTenantPackUser;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.vo.tenant.TenantDepartAuthInfo;\nimport org.jeecg.modules.system.vo.tenant.TenantPackModel;\nimport org.jeecg.modules.system.vo.tenant.TenantPackUser;\nimport org.jeecg.modules.system.vo.tenant.TenantPackUserCount;\n\nimport java.util.Collection;\nimport java.util.List;\n\n/**\n * @Description: 租户service接口\n * @author: jeecg-boot\n */\npublic interface ISysTenantService extends IService<SysTenant> {\n\n    /**\n     * 查询有效的租户\n     *\n     * @param idList\n     * @return\n     */\n    List<SysTenant> queryEffectiveTenant(Collection<Integer> idList);\n\n    /**\n     * 返回某个租户被多少个用户引用了\n     *\n     * @param id\n     * @return\n     */\n    Long countUserLinkTenant(String id);\n\n    /**\n     * 根据ID删除租户，会判断是否已被引用\n     *\n     * @param id\n     * @return\n     */\n    boolean removeTenantById(String id);\n\n    /**\n     * 邀请用户加入租户,通过手机号\n     * @param ids\n     * @param phone\n     * @param username\n     */\n    void invitationUserJoin(String ids, String phone,String username);\n\n    /**\n     * 请离用户（租户）\n     * @param userIds\n     * @param tenantId\n     */\n    void leaveTenant(String userIds, String tenantId);\n\n    /**\n     * 添加租户，并将创建的用户加入关系表\n     * @param sysTenant\n     * @param userId\n     */\n    Integer saveTenantJoinUser(SysTenant sysTenant, String userId);\n\n    /**\n     * 保存租户\n     * @param sysTenant\n     */\n    void saveTenant(SysTenant sysTenant);\n\n    /**\n     * 通过门牌号加入租户\n     * @param sysTenant\n     * @param userId\n     */\n    Integer joinTenantByHouseNumber(SysTenant sysTenant, String userId);\n\n    /**\n     * 统计一个人创建了多少个租户\n     * \n     * @param userId\n     * @return\n     */\n    Integer countCreateTenantNum(String userId);\n\n    /**\n     * 获取租户回收站的数据\n     * @param page\n     * @param sysTenant\n     * @return\n     */\n    IPage<SysTenant> getRecycleBinPageList(Page<SysTenant> page, SysTenant sysTenant);\n\n    /**\n     * 彻底删除租户\n     * @param ids\n     */\n    void deleteTenantLogic(String ids);\n\n    /**\n     * 还原租户\n     * @param ids\n     */\n    void revertTenantLogic(String ids);\n\n    /**\n     * 退出租户\n     * @param userId\n     * @param userId\n     * @param username\n     */\n    void exitUserTenant(String userId, String username, String tenantId);\n\n    /**\n     * 变更租户拥有者\n     * @param userId\n     * @param tenantId\n     */\n    void changeOwenUserTenant(String userId, String tenantId);\n\n    /**\n     * 邀请用户到租户。通过手机号匹配\n     * @param phone\n     * @param departId\n     * @return\n     */\n    Result<String> invitationUser(String phone, String departId);\n\n    /**\n     * 进入应用组织页面 查询用户是否有 超级管理员的权限\n     * @param tenantId\n     * @return\n     */\n    TenantDepartAuthInfo getTenantDepartAuthInfo(Integer tenantId);\n\n\n    /**\n     * 获取 租户产品包-3个默认admin的人员数量\n     * @param tenantId\n     * @return\n     */\n    List<TenantPackUserCount> queryTenantPackUserCount(Integer tenantId);\n\n    /**\n     * 查询租户产品包信息\n     * @param model\n     * @return\n     */\n    TenantPackModel queryTenantPack(TenantPackModel model);\n\n    /**\n     * 添加多个用户和产品包的关系数据\n     * @param sysTenantPackUser\n     */\n    void addBatchTenantPackUser(SysTenantPackUser sysTenantPackUser);\n\n    /**\n     * 添加用户和产品包的关系数据 带日志记录的\n     * @param sysTenantPackUser\n     */\n    void addTenantPackUser(SysTenantPackUser sysTenantPackUser);\n\n    /**\n     * 移除用户和产品包的关系数据 带日志记录的\n     * @param sysTenantPackUser\n     */\n    void deleteTenantPackUser(SysTenantPackUser sysTenantPackUser);\n\n\n    /**\n     * 查询申请的用户列表\n     */\n    List<TenantPackUser> getTenantPackApplyUsers(Integer tenantId);\n\n    /**\n     * 个人 申请成为管理员\n     * @param sysTenantPackUser\n     */\n    void doApplyTenantPackUser(SysTenantPackUser sysTenantPackUser);\n\n    /**\n     * 申请通过 成为管理员\n     * @param sysTenantPackUser\n     */\n    void passApply(SysTenantPackUser sysTenantPackUser);\n\n    /**\n     * 拒绝申请 成为管理员\n     * @param sysTenantPackUser\n     */\n    void deleteApply(SysTenantPackUser sysTenantPackUser);\n\n    /**\n     * 产品包用户列表\n     * @param tenantId\n     * @param packId\n     * @param status\n     * @param page\n     * @return\n     */\n    IPage<TenantPackUser> queryTenantPackUserList(String tenantId, String packId, Integer status, Page<TenantPackUser> page);\n\n    /**\n     * 查看是否已经申请过了管理员\n     * @return\n     */\n    Long getApplySuperAdminCount();\n\n    /**\n     * 发送同意或者拒绝消息\n     * \n     * @param user \n     * @param content \n     */\n    void sendMsgForAgreeAndRefuseJoin(SysUser user, String content);\n\n    /**\n     * 根据密码删除当前用户\n     * \n     * @param sysUser\n     * @param tenantId\n     */\n    void deleteUserByPassword(SysUser sysUser, Integer tenantId);\n\n    /**\n     * 根据用户id获取租户信息\n     * @param userId\n     * @return\n     */\n    List<SysTenant> getTenantListByUserId(String userId);\n\n    /**\n     * 删除用户\n     * @param sysUser\n     * @param tenantId\n     */\n    void deleteUser(SysUser sysUser, Integer tenantId);\n\n    /**\n     * 为用户添加租户下所有套餐\n     * @param userId\n     * @param tenantId\n     */\n    void addPackUser(String userId, String tenantId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysThirdAccountService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.system.entity.SysThirdAccount;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.model.ThirdLoginModel;\n\nimport java.util.List;\n\n/**\n * @Description: 第三方登录账号表\n * @Author: jeecg-boot\n * @Date:   2020-11-17\n * @Version: V1.0\n */\npublic interface ISysThirdAccountService extends IService<SysThirdAccount> {\n    /**\n     * 更新第三方账户信息\n     * @param sysUser SysUser对象\n     * @param thirdUserUuid 第三方id\n     */\n    void updateThirdUserId(SysUser sysUser,String thirdUserUuid);\n\n    /**\n     * 创建第三方用户\n     * @param phone 手机号\n     * @param thirdUserUuid 第三方id\n     * @return SysUser\n     */\n    SysUser createUser(String phone, String thirdUserUuid, Integer tenantId);\n\n    /**\n     * 根据本地userId查询数据\n     * @param sysUserId 用户id\n     * @param thirdType 第三方登录类型\n     * @return SysThirdAccount\n     */\n    SysThirdAccount getOneBySysUserId(String sysUserId, String thirdType);\n\n    /**\n     * 根据第三方userId查询数据\n     * @param thirdUserId 第三方id\n     * @param thirdType 第三方登录类型\n     * @return SysThirdAccount\n     */\n    SysThirdAccount getOneByThirdUserId(String thirdUserId, String thirdType);\n\n    /**\n     * 通过 sysUsername 集合批量查询\n     *\n     * @param sysUsernameArr username集合\n     * @param thirdType      第三方类型\n     * @return\n     */\n    List<SysThirdAccount> listThirdUserIdByUsername(String[] sysUsernameArr, String thirdType, Integer tenantId);\n\n    /**\n     * 创建新用户\n     *\n     * @param tlm 第三方登录信息\n     * @return SysThirdAccount\n     * @return tenantId 租户id\n     */\n    SysThirdAccount saveThirdUser(ThirdLoginModel tlm, Integer tenantId);\n\n    /**\n     * 绑定第三方账号(登录后根据用户id绑定第三方账号)\n     * @param sysThirdAccount\n     */\n    SysThirdAccount bindThirdAppAccountByUserId(SysThirdAccount sysThirdAccount);\n\n\n    /**\n     * 根据第三方 UUID和第三方类别获取第三方用户数据\n     * @param unionid\n     * @param thirdType\n     * @param tenantId\n     * @param thirdUserId\n     * @return\n     */\n    SysThirdAccount getOneByUuidAndThirdType(String unionid, String thirdType,Integer tenantId,String thirdUserId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysThirdAppConfigService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\n\nimport org.jeecg.modules.system.entity.SysThirdAppConfig;\n\nimport java.util.List;\n\n/**\n * @Description: 第三方配置表\n * @Author: jeecg-boot\n * @Date:   2023-02-03\n * @Version: V1.0\n */\npublic interface ISysThirdAppConfigService extends IService<SysThirdAppConfig>{\n\n    /**\n     * 根据租户id获取钉钉/企业微信配置\n     * @param tenantId\n     * @return\n     */\n    List<SysThirdAppConfig> getThirdConfigListByThirdType(int tenantId);\n\n    /**\n     * 根据租户id和第三方类别获取第三方配置\n     * @param tenantId\n     * @param thirdType\n     * @return\n     */\n    SysThirdAppConfig getThirdConfigByThirdType(Integer tenantId, String thirdType);\n\n    /**\n     * 根据应用key获取第三方表配置\n     * @param clientId\n     */\n    List<SysThirdAppConfig> getThirdAppConfigByClientId(String clientId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserDepPostService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.system.entity.SysUserDepPost;\n\n/**\n * @Description: 部门岗位用户表\n * @author: wangshuai\n * @date: 2025/9/5 11:45\n */\npublic interface ISysUserDepPostService extends IService<SysUserDepPost> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserDepartService.java",
    "content": "package org.jeecg.modules.system.service;\n\n\nimport java.util.List;\n\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.entity.SysUserDepart;\nimport org.jeecg.modules.system.model.DepartIdModel;\n\n\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * <p>\n * SysUserDpeart用户组织机构service\n * </p>\n * @Author ZhiLin\n *\n */\npublic interface ISysUserDepartService extends IService<SysUserDepart> {\n\t\n\n\t/**\n\t * 根据指定用户id查询部门信息\n\t * @param userId\n\t * @return\n\t */\n\tList<DepartIdModel> queryDepartIdsOfUser(String userId);\n\t\n\n\t/**\n\t * 根据部门id查询用户信息\n\t * @param depId\n\t * @return\n\t */\n\tList<SysUser> queryUserByDepId(String depId);\n  \t/**\n\t * 根据部门code，查询当前部门和下级部门的用户信息\n     * @param depCode 部门code\n     * @param realname 真实姓名\n     * @return List<SysUser>\n\t */\n\tList<SysUser> queryUserByDepCode(String depCode,String realname);\n\n\t/**\n\t * 用户组件数据查询\n\t * @param departId\n\t * @param username\n\t * @param pageSize\n\t * @param pageNo\n     * @param realname\n     * @param id\n     * @param isMultiTranslate 是否多字段翻译\n\t * @return\n\t */\n\tIPage<SysUser> queryDepartUserPageList(String departId, String username, String realname, int pageSize, int pageNo,String id,String isMultiTranslate);\n\n    /**\n     * 获取用户信息\n\t * @param tenantId\n     * @param departId\n     * @param keyword\n     * @param pageSize\n     * @param pageNo\n     * @return\n     */\n    IPage<SysUser> getUserInformation(Integer tenantId, String departId, String keyword, Integer pageSize, Integer pageNo);\n\n\t/**\n\t * 获取用户信息\n\t * @param tenantId\n\t * @param departId\n\t * @param roleId\n\t * @param keyword\n\t * @param pageSize\n\t * @param pageNo\n\t * @return\n\t */\n\tIPage<SysUser> getUserInformation(Integer tenantId,String departId,String roleId, String keyword, Integer pageSize, Integer pageNo, String excludeUserIdList, String includeUsernameList);\n\n\t/**\n\t * 通过部门id和租户id获取多个用户\n\t * @param departId\n\t * @param tenantId\n\t * @return\n\t */\n\tList<SysUser> getUsersByDepartTenantId(String departId,Integer tenantId);\n\n    /**\n     * 查询部门岗位下的用户\n     * \n     * @param departId\n     * @param username\n     * @param realname\n     * @param pageSize\n     * @param pageNo\n     * @param id\n     * @param isMultiTranslate\n     * @return\n     */\n    IPage<SysUser> queryDepartPostUserPageList(String departId, String username, String realname, Integer pageSize, Integer pageNo, String id, String isMultiTranslate);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserPositionService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.entity.SysUserPosition;\nimport com.baomidou.mybatisplus.extension.service.IService;\n/**\n * @Description: 用户职位关系表\n * @Author: jeecg-boot\n * @Date:   2023-02-14\n * @Version: V1.0\n */\npublic interface ISysUserPositionService extends IService<SysUserPosition> {\n\n    /**\n     * 获取职位用户列表\n     * @param page\n     * @param positionId\n     * @return\n     */\n    IPage<SysUser> getPositionUserList(Page<SysUser> page, String positionId);\n\n    /**\n     * 添加成员到用户职位关系表\n     * @param userIds\n     * @param positionId\n     */\n    void saveUserPosition(String userIds, String positionId);\n\n    /**\n     * 通过职位id删除用户职位关系表\n     * @param positionId\n     */\n    void removeByPositionId(String positionId);\n\n    /**\n     * 移除成员\n     * @param userIds\n     * @param positionId\n     */\n    void removePositionUser(String userIds, String positionId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserRoleService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport java.util.Map;\n\nimport org.jeecg.modules.system.entity.SysUserRole;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * <p>\n * 用户角色表 服务类\n * </p>\n *\n * @Author scott\n * @since 2018-12-21\n */\npublic interface ISysUserRoleService extends IService<SysUserRole> {\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.system.vo.SysUserCacheInfo;\nimport org.jeecg.modules.system.entity.SysRoleIndex;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.model.SysUserSysDepPostModel;\nimport org.jeecg.modules.system.model.SysUserSysDepartModel;\nimport org.jeecg.modules.system.vo.SysUserExportVo;\nimport org.jeecg.modules.system.vo.lowapp.DepartAndUserInfo;\nimport org.jeecg.modules.system.vo.lowapp.UpdateDepartInfo;\nimport org.springframework.transaction.annotation.Transactional;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\n\n/**\n * <p>\n * 用户表 服务类\n * </p>\n *\n * @Author scott\n * @since 2018-12-20\n */\npublic interface ISysUserService extends IService<SysUser> {\n\n\t/**\n\t * 查询用户数据列表\n\t * \n\t * @param req\n\t * @param queryWrapper\n\t * @param pageSize\n\t * @param pageNo\n\t * @return\n\t */\n\tResult<IPage<SysUser>> queryPageList(HttpServletRequest req, QueryWrapper<SysUser> queryWrapper, Integer pageSize, Integer pageNo);\n\t\n\t/**\n\t * 重置密码\n\t *\n\t * @param username\n\t * @param oldpassword\n\t * @param newpassword\n\t * @param confirmpassword\n\t * @return\n\t */\n\tpublic Result<?> resetPassword(String username, String oldpassword, String newpassword, String confirmpassword);\n\n\t/**\n\t * 修改密码\n\t *\n\t * @param sysUser\n\t * @return\n\t */\n\tpublic Result<?> changePassword(SysUser sysUser);\n\n\t/**\n\t * 删除用户\n\t * @param userId\n\t * @return\n\t */\n\tpublic boolean deleteUser(String userId);\n\n\t/**\n\t * 批量删除用户\n\t * @param userIds\n\t * @return\n\t */\n\tpublic boolean deleteBatchUsers(String userIds);\n\n    /**\n     * 根据用户名查询\n     * @param username 用户名\n     * @return SysUser\n     */\n\tpublic SysUser getUserByName(String username);\n\t\n\t/**\n\t * 添加用户和用户角色关系\n\t * @param user\n\t * @param roles\n\t */\n\tpublic void addUserWithRole(SysUser user,String roles);\n\t\n\t\n\t/**\n\t * 修改用户和用户角色关系\n\t * @param user\n\t * @param roles\n\t */\n\tpublic void editUserWithRole(SysUser user,String roles);\n\n\t/**\n\t * 获取用户的授权角色\n\t * @param username\n\t * @return\n\t */\n\tpublic List<String> getRole(String username);\n\n\t/**\n\t * 获取根据登录用户的角色获取动态首页\n\t *\n\t * @param username\n\t * @param version 前端UI版本\n\t * @return\n\t */\n\tpublic SysRoleIndex getDynamicIndexByUserRole(String username,String version);\n\t\n\t/**\n\t  * 查询用户信息包括 部门信息\n\t * @param username\n\t * @return\n\t */\n\t@Deprecated\n\tpublic SysUserCacheInfo getCacheUser(String username);\n\n\t/**\n\t * 根据部门Id查询\n\t * @param page\n     * @param departId 部门id\n     * @param username 用户账户名称\n\t * @return\n\t */\n\tpublic IPage<SysUser> getUserByDepId(Page<SysUser> page, String departId, String username);\n\n\t/**\n\t * 根据部门Ids查询\n\t * @param page\n     * @param departIds  部门id集合\n     * @param username 用户账户名称\n\t * @return\n\t */\n\tpublic IPage<SysUser> getUserByDepIds(Page<SysUser> page, List<String> departIds, String username);\n\n\t/**\n\t * 根据 userIds查询，查询用户所属部门的名称（多个部门名逗号隔开）\n\t * @param userIds\n\t * @return\n\t */\n\tpublic Map<String,String> getDepNamesByUserIds(List<String> userIds);\n\n    /**\n     * 根据部门 Id 和 QueryWrapper 查询\n     *\n     * @param page\n     * @param departId\n     * @param queryWrapper\n     * @return\n     */\n    // public IPage<SysUser> getUserByDepartIdAndQueryWrapper(Page<SysUser> page, String departId, QueryWrapper<SysUser> queryWrapper);\n\n\t/**\n\t * 根据 orgCode 查询用户，包括子部门下的用户\n\t *\n\t * @param orgCode\n\t * @param userParams 用户查询条件，可为空\n\t * @param page 分页参数\n\t * @return\n\t */\n\tIPage<SysUserSysDepartModel> queryUserByOrgCode(String orgCode, SysUser userParams, IPage page);\n\n\t/**\n\t * 根据角色Id查询\n\t * @param page\n     * @param roleId 角色id\n     * @param username 用户账户\n     * @param realname 用户姓名\n\t * @return\n\t */\n\tpublic IPage<SysUser> getUserByRoleId(Page<SysUser> page,String roleId, String username, String realname);\n\n\t/**\n\t * 通过用户名获取用户角色集合\n\t *\n\t * @param username 用户名\n\t * @return 角色集合\n\t */\n\tSet<String> getUserRolesSet(String username);\n\t\n\t/**\n\t * 通过用户名获取用户角色集合\n\t *\n\t * @param userId 用户id\n\t * @return 角色集合\n\t */\n\tSet<String> getUserRoleSetById(String userId);\n\n\t/**\n\t * 通过用户名获取用户权限集合\n\t *\n\t * @param userId 用户id\n\t * @return 权限集合\n\t */\n\tSet<String> getUserPermissionsSet(String userId);\n\t\n\t/**\n\t * 根据用户名设置部门ID\n\t * @param username\n\t * @param orgCode\n\t */\n\tvoid updateUserDepart(String username,String orgCode,Integer loginTenantId);\n\t\n\t/**\n\t * 根据手机号获取用户名和密码\n     * @param phone 手机号\n     * @return SysUser\n\t */\n\tpublic SysUser getUserByPhone(String phone);\n\n\n\t/**\n\t * 根据邮箱获取用户\n     * @param email 邮箱\n     * @return SysUser\n     */\n\tpublic SysUser getUserByEmail(String email);\n\n\n\t/**\n\t * 添加用户和用户部门关系\n\t * @param user\n\t * @param selectedParts\n\t */\n\tvoid addUserWithDepart(SysUser user, String selectedParts);\n\n\t/**\n\t * 编辑用户和用户部门关系\n\t * @param user\n\t * @param departs\n\t */\n\tvoid editUserWithDepart(SysUser user, String departs);\n\t\n\t/**\n\t   * 校验用户是否有效\n\t * @param sysUser\n\t * @return\n\t */\n\tResult checkUserIsEffective(SysUser sysUser);\n\n\t/**\n\t * 查询被逻辑删除的用户\n     * @return List<SysUser>\n\t */\n\tList<SysUser> queryLogicDeleted();\n\n\t/**\n\t * 查询被逻辑删除的用户（可拼装查询条件）\n     * @param wrapper\n     * @return List<SysUser>\n\t */\n\tList<SysUser> queryLogicDeleted(LambdaQueryWrapper<SysUser> wrapper);\n\n\t/**\n\t * 还原被逻辑删除的用户\n     * @param userIds  存放用户id集合\n     * @param updateEntity\n     * @return boolean\n\t */\n\tboolean revertLogicDeleted(List<String> userIds, SysUser updateEntity);\n\n\t/**\n\t * 彻底删除被逻辑删除的用户\n     * @param userIds 存放用户id集合\n     * @return boolean\n\t */\n\tboolean removeLogicDeleted(List<String> userIds);\n\n    /**\n     * 更新手机号、邮箱空字符串为 null\n     * @return boolean\n     */\n    @Transactional(rollbackFor = Exception.class)\n    boolean updateNullPhoneEmail();\n\n\t/**\n\t * 保存第三方用户信息\n\t * @param sysUser\n\t */\n\tvoid saveThirdUser(SysUser sysUser);\n\n\t/**\n\t * 根据部门Ids查询\n\t * @param departIds 部门id集合\n     * @param username 用户账户名称\n\t * @return\n\t */\n\tList<SysUser> queryByDepIds(List<String> departIds, String username);\n\n\t/**\n     * 保存用户\n     *\n     * @param user            用户\n     * @param selectedRoles   选择的角色id，多个以逗号隔开\n     * @param selectedDeparts 选择的部门id，多个以逗号隔开\n     * @param relTenantIds    多个租户id\n     * @param izSyncPack 是否需要同步租户套餐包\n     */\n\tvoid saveUser(SysUser user, String selectedRoles, String selectedDeparts, String relTenantIds, boolean izSyncPack);\n\n\t/**\n\t * 编辑用户\n\t * @param user 用户\n\t * @param roles 选择的角色id，多个以逗号隔开\n\t * @param departs 选择的部门id，多个以逗号隔开\n\t * @param relTenantIds 多个租户id\n\t * @param updateFromPage 更新来自的页面 [TV360X-1686]\n\t */\n\tvoid editUser(SysUser user, String roles, String departs, String relTenantIds, String updateFromPage);\n\n\t/**\n     * userId转为username\n     * @param userIdList\n     * @return List<String>\n     */\n\tList<String> userIdToUsername(Collection<String> userIdList);\n\n\n\t/**\n\t * 获取用户信息 字段信息是加密后的 【加密用户信息】\n\t * @param username\n\t * @return\n\t */\n\tLoginUser getEncodeUserInfo(String username);\n\n    /**\n     * 用户离职\n     * @param username\n     */\n    void userQuit(String username);\n\n    /**\n     * 获取离职人员列表\n\t * @param tenantId 租户id\n     * @return\n     */\n    List<SysUser> getQuitList(Integer tenantId);\n\n    /**\n     * 更新刪除状态和离职状态\n     * @param userIds  存放用户id集合\n     * @param sysUser\n     * @return boolean\n     */\n    void updateStatusAndFlag(List<String> userIds, SysUser sysUser);\n\n\t/**\n\t * 设置登录租户\n\t * @param sysUser\n\t * @return\n\t */\n\tResult<JSONObject>  setLoginTenant(SysUser sysUser, JSONObject obj, String username, Result<JSONObject> result);\n\n\t//--- author:taoyan date:20221231 for: QQYUN-3515【应用】应用下的组织机构管理功能，细节实现 ---\n\t/**\n\t * 批量编辑用户信息\n\t * @param json\n\t */\n\tvoid batchEditUsers(JSONObject json);\n\n\t/**\n\t * 根据关键词查询用户和部门\n\t * @param keyword\n\t * @return\n\t */\n\tDepartAndUserInfo searchByKeyword(String keyword);\n\n\t/**\n\t * 查询 部门修改的信息\n\t * @param departId\n\t * @return\n\t */\n\tUpdateDepartInfo getUpdateDepartInfo(String departId);\n\n\t/**\n\t * 修改部门相关信息\n\t * @param updateDepartInfo\n\t */\n\tvoid doUpdateDepartInfo(UpdateDepartInfo updateDepartInfo);\n\n\t/**\n\t * 设置负责人 取消负责人\n\t * @param json\n\t */\n\tvoid changeDepartChargePerson(JSONObject json);\n\t//--- author:taoyan date:20221231 for: QQYUN-3515【应用】应用下的组织机构管理功能，细节实现 ---\n\t\n\t/**\n\t * 编辑租户用户\n\t * @param sysUser\n\t * @param tenantId\n\t * @param departs\n\t */\n\tvoid editTenantUser(SysUser sysUser, String tenantId, String departs, String roles);\n\n/**\n\t * 修改用户账号状态\n\t * @param id 账号id\n\t * @param status 账号状态\n\t */\n\tvoid updateStatus(String id, String status);\n\n\t/**\n\t * 导出应用下的用户Excel\n\t * @param request\n\t * @return\n\t */\n\tModelAndView exportAppUser(HttpServletRequest request);\n\n\t/**\n\t * 导入应用下的用户\n\t * @param request\n\t * @return\n\t */\n\tResult<?> importAppUser(HttpServletRequest request);\n\n\t/**\n\t * 验证用户是否为管理员\n\t * @param ids\n\t */\n\tvoid checkUserAdminRejectDel(String ids);\n\n\t/**\n\t * 修改手机号\n\t * \n\t * @param json\n\t * @param username\n\t */\n    void changePhone(JSONObject json, String username);\n\n\t/**\n\t * 发送短信验证码\n\t * \n\t * @param jsonObject\n\t * @param username 用户名\n\t * @param ipAddress ip地址\n\t */\n\tvoid sendChangePhoneSms(JSONObject jsonObject, String username, String ipAddress);\n\n\t/**\n\t * 发送注销用户手机号验证密码[敲敲云专用]\n\t * @param jsonObject\n\t * @param username\n\t * @param ipAddress\n\t */\n\tvoid sendLogOffPhoneSms(JSONObject jsonObject, String username, String ipAddress);\n\n\t/**\n\t * 用户注销[敲敲云专用]\n\t * @param jsonObject\n\t * @param username\n\t */\n\tvoid userLogOff(JSONObject jsonObject, String username);\n\n    /**\n     * 获取部门和用户关系的导出信息\n     * @param pageList\n     */\n    List<SysUserExportVo> getDepartAndRoleExportMsg(List<SysUser> pageList);\n\n    /**\n     * 导入用户\n     *\n     * @param request\n     */\n    Result<?> importSysUser(HttpServletRequest request);\n\n    /**\n     * 没有绑定手机号 直接修改密码\n     *\n     * @param oldPassword\n     * @param password\n     * @param username\n     */\n    void updatePasswordNotBindPhone(String oldPassword, String password, String username);\n\n\t/**\n\t * 根据用户名称查询用户和部门信息\n\t * @param userName\n\t * @return\n\t */\n\tMap<String, String> queryUserAndDeptByName(String userName);\n\n    /**\n     * 查询部门、岗位下的用户 包括子部门下的用户\n     * \n     * @param orgCode\n     * @param userParams\n     * @param page\n     * @return\n     */\n    IPage<SysUserSysDepPostModel> queryDepartPostUserByOrgCode(String orgCode, SysUser userParams, IPage page);\n\n    /**\n     * 根据 orgCode 查询用户信息（部门全路径，主岗位和兼职岗位的信息），包括公司、子公司、部门\n     *\n     * @param orgCode\n     * @param userParams\n     * @param page\n     * @return\n     */\n    IPage<SysUserSysDepPostModel> queryDepartUserByOrgCode(String orgCode, SysUser userParams, IPage page);\n\n    /**\n     * 通讯录点击用户获取用户详情（包含用户基本信息、部门全路径、主岗位兼职岗位全路径）\n     *\n     * @param userId\n     * @return\n     */\n    SysUserSysDepPostModel getUserDetailByUserId(String userId);\n\n\t/**\n\t * 登录获取用户部门信息\n\t * @param jsonObject\n\t * @return\n\t */\n    Result loginGetUserDeparts(JSONObject jsonObject);\n\n\t/**\n\t * 根据用户名查询重置成系统密码\n\t * @param usernames\n\t */\n\tvoid resetToSysPassword(String usernames);\n\n\t/**\n\t * 更新用户设备ID\n\t * @param clientId\n\t * @param userId\n\t */\n    void updateClientId(String clientId,String userId);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserTenantService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport org.jeecg.modules.system.entity.SysTenant;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.entity.SysUserTenant;\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.system.vo.SysUserTenantVo;\n\nimport java.util.List;\n\n/**\n * @Description: sys_user_tenant_relation\n * @Author: jeecg-boot\n * @Date:   2022-12-23\n * @Version: V1.0\n */\npublic interface ISysUserTenantService extends IService<SysUserTenant> {\n\n    /**\n     * 通过租户id获取数据\n     * @param page\n     * @param userTenantId\n     * @param user\n     * @return\n     */\n    Page<SysUser> getPageUserList(Page<SysUser> page, Integer userTenantId, SysUser user);\n\n    /**\n     * 设置租户id\n     * @param records\n     * @return\n     */\n    List<SysUser> setUserTenantIds(List<SysUser> records);\n\n    /**\n     * 获取租户id获取用户ids\n     * @param tenantId\n     * @return\n     */\n    List<String> getUserIdsByTenantId(Integer tenantId);\n\n    /**\n     * 通过用户id获取租户ids\n     * @param userId\n     * @return\n     */\n    List<Integer> getTenantIdsByUserId(String userId);\n    \n    /**\n     * 通过用户id获取租户列表\n     * @param userId\n     * @param userTenantStatus\n     * @return\n     */\n    List<SysUserTenantVo> getTenantListByUserId(String userId, List<String>  userTenantStatus);\n    \n    /**\n     * 更新用户租户状态\n     * @param id\n     * @param tenantId\n     * @param userTenantStatus\n     */\n    void updateUserTenantStatus(String id, String tenantId, String userTenantStatus);\n\n    /**\n     * 联查用户和租户审核状态\n     * @param page\n     * @param status 租户用户状态，默认为1正常\n     * @param user\n     * @return\n     */\n    IPage<SysUserTenantVo> getUserTenantPageList(Page<SysUserTenantVo> page, List<String> status, SysUser user, Integer tenantId);\n\n    /**\n     * 取消离职\n     * @param userIds\n     * @param tenantId\n     */\n    void putCancelQuit(List<String> userIds, Integer tenantId);\n\n    /**\n     * 验证用户是否已存在\n     * @param userId\n     * @param tenantId\n     * @return\n     */\n    Integer userTenantIzExist(String userId, Integer tenantId);\n\n    /**\n     * 根据用户id获取我的租户\n     *\n     * @param page\n     * @param userId\n     * @param userTenantStatus\n     * @param sysUserTenantVo\n     * @return\n     */\n    IPage<SysTenant> getTenantPageListByUserId(Page<SysTenant> page, String userId, List<String> userTenantStatus,SysUserTenantVo sysUserTenantVo);\n\n    /**\n     * 同意加入租户\n     * @param userId\n     * @param tenantId\n     */\n    void agreeJoinTenant(String userId, Integer tenantId);\n\n    /**\n     * 拒绝加入租户\n     * @param userId\n     * @param tenantId\n     */\n    void refuseJoinTenant(String userId, Integer tenantId);\n\n    /**\n     * 根据用户id和租户id获取用户租户中间表信息\n     * @param userId\n     * @param tenantId\n     * @return\n     */\n    SysUserTenant getUserTenantByTenantId(String userId, Integer tenantId);\n\n    /**\n     * 获取租户下的成员数量\n     * @param tenantId\n     * @param tenantStatus\n     * @return\n     */\n    Long getUserCount(Integer tenantId, String tenantStatus);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/IThirdAppService.java",
    "content": "package org.jeecg.modules.system.service;\n\nimport org.jeecg.common.api.dto.message.MessageDTO;\nimport org.jeecg.modules.system.vo.thirdapp.SyncInfoVo;\n\nimport java.util.List;\n\n/**\n * 第三方App对接\n * @author: jeecg-boot\n */\npublic interface IThirdAppService {\n\n    /**\n     * 获取AccessToken\n     * @return String\n     */\n    String getAccessToken();\n\n    /**\n     * 将本地部门同步到第三方App<br>\n     * 同步方向：本地 --> 第三方APP\n     * 同步逻辑：<br>\n     * 1. 先判断是否同步过，有则修改，无则创建；<br>\n     * 2. 本地没有但第三方App里有则删除第三方App里的。\n     * @param ids\n     * @return 成功返回true\n     */\n    SyncInfoVo syncLocalDepartmentToThirdApp(String ids);\n\n//    /**\n//     * 将第三方App部门同步到本地<br>\n//     * 同步方向：第三方APP --> 本地\n//     * 同步逻辑：<br>\n//     * 1. 先判断是否同步过，有则修改，无则创建；<br>\n//     * 2. 本地没有但第三方App里有则删除第三方App里的。\n//     * @param ids\n//     * @return 成功返回true\n//     */\n//    SyncInfoVo syncThirdAppDepartmentToLocal(String ids);\n\n    /**\n     * 将本地用户同步到第三方App<br>\n     * 同步方向：本地 --> 第三方APP <br>\n     * 同步逻辑：先判断是否同步过，有则修改、无则创建<br>\n     * 注意：同步人员的状态，比如离职、禁用、逻辑删除等。\n     * (特殊点：1、目前逻辑特意做的不删除用户，防止企业微信提前上线，用户已经存在，但是平台无此用户。\n     *  企业微信支持禁用账号；钉钉不支持\n     *  2、企业微信里面是手机号激活，只能用户自己改，不允许通过接口改)\n     * @param ids\n     * @return 成功返回空数组，失败返回错误信息\n     */\n    SyncInfoVo syncLocalUserToThirdApp(String ids);\n\n//    /**\n//     * 将第三方App用户同步到本地<br>\n//     * 同步方向：第三方APP --> 本地 <br>\n//     * 同步逻辑：先判断是否同步过，有则修改、无则创建<br>\n//     * 注意：同步人员的状态，比如离职、禁用、逻辑删除等。\n//     *\n//     * @return 成功返回空数组，失败返回错误信息\n//     */\n//    SyncInfoVo syncThirdAppUserToLocal();\n\n    /**\n     * 根据本地用户ID，删除第三方APP的用户\n     *\n     * @param userIdList 本地用户ID列表\n     * @return 0表示成功，其他值表示失败\n     */\n    int removeThirdAppUser(List<String> userIdList);\n\n    /**\n     * 发送消息\n     *\n     * @param message\n     * @param verifyConfig 是否验证配置（未启用的APP会拒绝发送）\n     * @return\n     */\n    boolean sendMessage(MessageDTO message, boolean verifyConfig);\n\n    /**\n     * 发送消息\n     * @param message\n     * @return boolean\n     */\n    boolean sendMessage(MessageDTO message);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ImportFileServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.util.CommonUtils;\nimport org.jeecgframework.poi.excel.imports.base.ImportFileServiceI;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Service;\n\n/**\n * excel导入 实现类\n * @author: jeecg-boot\n */\n@Slf4j\n@Service\npublic class ImportFileServiceImpl implements ImportFileServiceI {\n\n    @Value(\"${jeecg.path.upload}\")\n    private String upLoadPath;\n\n    @Value(value=\"${jeecg.uploadType}\")\n    private String uploadType;\n\n    @Override\n    public String doUpload(byte[] data) {\n        return CommonUtils.uploadOnlineImage(data, upLoadPath, \"import\", uploadType);\n    }\n\n    @Override\n    public String doUpload(byte[] data, String saveUrl) {\n        // 代码逻辑说明: [QQYUN-10902]AutoPoi Excel表格导入有问题，还会报个错。 #7703------------\n        String bizPath = \"import\";\n        if(null != saveUrl && !saveUrl.isEmpty()){\n            bizPath = saveUrl;\n        }\n        return CommonUtils.uploadOnlineImage(data, upLoadPath, bizPath, uploadType);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementSendServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport java.util.Arrays;\nimport java.util.Date;\nimport java.util.List;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;\nimport com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;\nimport jakarta.annotation.Resource;\n\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysAnnouncement;\nimport org.jeecg.modules.system.entity.SysAnnouncementSend;\nimport org.jeecg.modules.system.mapper.SysAnnouncementMapper;\nimport org.jeecg.modules.system.mapper.SysAnnouncementSendMapper;\nimport org.jeecg.modules.system.model.AnnouncementSendModel;\nimport org.jeecg.modules.system.service.ISysAnnouncementSendService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\n\n/**\n * @Description: 用户通告阅读标记表\n * @Author: jeecg-boot\n * @Date:  2019-02-21\n * @Version: V1.0\n */\n@Service\npublic class SysAnnouncementSendServiceImpl extends ServiceImpl<SysAnnouncementSendMapper, SysAnnouncementSend> implements ISysAnnouncementSendService {\n\n\t@Resource\n\tprivate SysAnnouncementSendMapper sysAnnouncementSendMapper;\n\n    @Autowired\n    private SysAnnouncementMapper sysAnnouncementMapper;\n\n\t@Override\n\tpublic Page<AnnouncementSendModel> getMyAnnouncementSendPage(Page<AnnouncementSendModel> page,\n\t\t\tAnnouncementSendModel announcementSendModel) {\n\t\t return page.setRecords(sysAnnouncementSendMapper.getMyAnnouncementSendList(page, announcementSendModel));\n\t}\n\n\t@Override\n\tpublic AnnouncementSendModel getOne(String sendId) {\n\t\treturn sysAnnouncementSendMapper.getOne(sendId);\n\t}\n\n    /**\n     * 获取当前用户已阅读数量\n     * \n     * @param id\n     * @return\n     */\n    @Override\n    public long getReadCountByUserId(String id) {\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        return sysAnnouncementSendMapper.getReadCountByUserId(id, sysUser.getId());\n    }\n\n    /**\n     * 根据多个id批量删除已阅读的数量\n     * \n     * @param ids\n     */\n    @Override\n    public void deleteBatchByIds(String ids) {\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        //根据用户id和阅读表的id获取所有阅读的数据\n        List<String> sendIds = sysAnnouncementSendMapper.getReadAnnSendByUserId(Arrays.asList(ids.split(SymbolConstant.COMMA)),sysUser.getId());\n        if(CollectionUtil.isNotEmpty(sendIds)){\n            this.removeByIds(sendIds);\n        }\n    }\n\n    /**\n     * 根据busId更新阅读状态\n     * @param busId\n     * @param busType\n     */\n    @Override\n    public void updateReadFlagByBusId(String busId, String busType) {\n        SysAnnouncement announcement = sysAnnouncementMapper.selectOne(new QueryWrapper<SysAnnouncement>().eq(\"bus_type\",busType).eq(\"bus_id\",busId));\n        if(oConvertUtils.isNotEmpty(announcement)){\n            LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();\n            String userId = sysUser.getId();\n            LambdaUpdateWrapper<SysAnnouncementSend> updateWrapper = new UpdateWrapper().lambda();\n            updateWrapper.set(SysAnnouncementSend::getReadFlag, CommonConstant.HAS_READ_FLAG);\n            updateWrapper.set(SysAnnouncementSend::getReadTime, new Date());\n            updateWrapper.eq(SysAnnouncementSend::getAnntId,announcement.getId());\n            updateWrapper.eq(SysAnnouncementSend::getUserId,userId);\n            SysAnnouncementSend announcementSend = new SysAnnouncementSend();\n            sysAnnouncementSendMapper.update(announcementSend, updateWrapper);\n        }\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport cn.hutool.core.io.IoUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.compress.archivers.zip.Zip64Mode;\nimport org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;\nimport org.apache.commons.lang3.StringUtils;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.FileDownloadUtils;\nimport org.jeecg.common.util.filter.SsrfFileTypeFilter;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.modules.system.entity.SysAnnouncement;\nimport org.jeecg.modules.system.entity.SysAnnouncementSend;\nimport org.jeecg.modules.system.mapper.SysAnnouncementMapper;\nimport org.jeecg.modules.system.mapper.SysAnnouncementSendMapper;\nimport org.jeecg.modules.system.mapper.SysUserMapper;\nimport org.jeecg.modules.system.service.ISysAnnouncementSendService;\nimport org.jeecg.modules.system.service.ISysAnnouncementService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\nimport org.springframework.util.CollectionUtils;\n\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.*;\nimport java.net.URLEncoder;\nimport java.util.*;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.SynchronousQueue;\nimport java.util.concurrent.ThreadPoolExecutor;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * @Description: 系统通告表\n * @Author: jeecg-boot\n * @Date:  2019-01-02\n * @Version: V1.0\n */\n@Service\n@Slf4j\npublic class SysAnnouncementServiceImpl extends ServiceImpl<SysAnnouncementMapper, SysAnnouncement> implements ISysAnnouncementService {\n\t/**\n\t * 补数据改成后台模式\n\t */\n\tpublic static ExecutorService completeNoteThreadPool = new ThreadPoolExecutor(0, 1024, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());\n\t\n\t@Resource\n\tprivate SysAnnouncementMapper sysAnnouncementMapper;\n\t@Resource\n\tprivate SysUserMapper sysUserMapper;\n\t@Resource\n\tprivate SysAnnouncementSendMapper sysAnnouncementSendMapper;\n\t@Autowired\n\tprivate ISysAnnouncementSendService sysAnnouncementSendService;\n\t@Autowired\n\tprivate JeecgBaseConfig jeecgBaseConfig;\n\n\t@Transactional(rollbackFor = Exception.class)\n\t@Override\n\tpublic void saveAnnouncement(SysAnnouncement sysAnnouncement) {\n\t\tif(sysAnnouncement.getMsgType().equals(CommonConstant.MSG_TYPE_ALL)) {\n\t\t\tsysAnnouncementMapper.insert(sysAnnouncement);\n\t\t}else {\n\t\t\t// 1.插入通告表记录\n\t\t\tsysAnnouncementMapper.insert(sysAnnouncement);\n\t\t\t// 2.插入用户通告阅读标记表记录\n\t\t\tString userId = sysAnnouncement.getUserIds();\n            // 代码逻辑说明: [issues/5503]【公告】通知无法接收\n\t\t\tif(StringUtils.isNotBlank(userId) && userId.endsWith(\",\")){\n\t\t\t\tuserId = userId.substring(0, (userId.length()-1));\n\t\t\t}\n\t\t\tString[] userIds = userId.split(\",\");\n\t\t\tString anntId = sysAnnouncement.getId();\n\t\t\tDate refDate = new Date();\n\t\t\tfor(int i=0;i<userIds.length;i++) {\n\t\t\t\tSysAnnouncementSend announcementSend = new SysAnnouncementSend();\n\t\t\t\tannouncementSend.setAnntId(anntId);\n\t\t\t\tannouncementSend.setUserId(userIds[i]);\n\t\t\t\tannouncementSend.setReadFlag(CommonConstant.NO_READ_FLAG);\n\t\t\t\tannouncementSend.setReadTime(refDate);\n\t\t\t\tsysAnnouncementSendMapper.insert(announcementSend);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/**\n\t * @功能：编辑消息信息\n\t */\n\t@Transactional(rollbackFor = Exception.class)\n\t@Override\n\tpublic boolean upDateAnnouncement(SysAnnouncement sysAnnouncement) {\n\t\t// 1.更新系统信息表数据\n\t\tsysAnnouncementMapper.updateById(sysAnnouncement);\n\t\tString userId = sysAnnouncement.getUserIds();\n\t\tif(oConvertUtils.isNotEmpty(userId)&&sysAnnouncement.getMsgType().equals(CommonConstant.MSG_TYPE_UESR)) {\n\t\t\t// 2.补充新的通知用户数据\n\t\t\tString[] userIds = userId.substring(0, (userId.length()-1)).split(\",\");\n\t\t\tString anntId = sysAnnouncement.getId();\n\t\t\tDate refDate = new Date();\n\t\t\tfor(int i=0;i<userIds.length;i++) {\n\t\t\t\tLambdaQueryWrapper<SysAnnouncementSend> queryWrapper = new LambdaQueryWrapper<SysAnnouncementSend>();\n\t\t\t\tqueryWrapper.eq(SysAnnouncementSend::getAnntId, anntId);\n\t\t\t\tqueryWrapper.eq(SysAnnouncementSend::getUserId, userIds[i]);\n\t\t\t\tList<SysAnnouncementSend> announcementSends=sysAnnouncementSendMapper.selectList(queryWrapper);\n\t\t\t\tif(announcementSends.size()<=0) {\n\t\t\t\t\tSysAnnouncementSend announcementSend = new SysAnnouncementSend();\n\t\t\t\t\tannouncementSend.setAnntId(anntId);\n\t\t\t\t\tannouncementSend.setUserId(userIds[i]);\n\t\t\t\t\tannouncementSend.setReadFlag(CommonConstant.NO_READ_FLAG);\n\t\t\t\t\tannouncementSend.setReadTime(refDate);\n\t\t\t\t\tsysAnnouncementSendMapper.insert(announcementSend);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 3. 删除多余通知用户数据\n\t\t\tCollection<String> delUserIds = Arrays.asList(userIds);\n\t\t\tLambdaQueryWrapper<SysAnnouncementSend> queryWrapper = new LambdaQueryWrapper<SysAnnouncementSend>();\n\t\t\tqueryWrapper.notIn(SysAnnouncementSend::getUserId, delUserIds);\n\t\t\tqueryWrapper.eq(SysAnnouncementSend::getAnntId, anntId);\n\t\t\tsysAnnouncementSendMapper.delete(queryWrapper);\n\t\t}\n\t\treturn true;\n\t}\n\n    /**\n     * 流程执行完成保存消息通知\n     * @param title 标题\n     * @param msgContent 信息内容\n     */\n\t@Override\n\tpublic void saveSysAnnouncement(String title, String msgContent) {\n\t\tSysAnnouncement announcement = new SysAnnouncement();\n\t\tannouncement.setTitile(title);\n\t\tannouncement.setMsgContent(msgContent);\n\t\tannouncement.setSender(\"JEECG BOOT\");\n\t\tannouncement.setPriority(CommonConstant.PRIORITY_L);\n\t\tannouncement.setMsgType(CommonConstant.MSG_TYPE_ALL);\n\t\tannouncement.setSendStatus(CommonConstant.HAS_SEND);\n\t\tannouncement.setSendTime(new Date());\n\t\tannouncement.setDelFlag(CommonConstant.DEL_FLAG_0.toString());\n\t\tsysAnnouncementMapper.insert(announcement);\n\t}\n\n\t@Override\n\tpublic Page<SysAnnouncement> querySysCementPageByUserId(Page<SysAnnouncement> page, String userId, String msgCategory, Integer tenantId, Date beginDate) {\n\t\tif (page.getSize() == -1) {\n\t\t\treturn page.setRecords(sysAnnouncementMapper.querySysCementListByUserId(null, userId, msgCategory,tenantId,beginDate));\n\t\t} else {\n\t\t\treturn page.setRecords(sysAnnouncementMapper.querySysCementListByUserId(page, userId, msgCategory,tenantId,beginDate));\n\t\t}\n\t}\n\n\t@Override\n\tpublic Integer getUnreadMessageCountByUserId(String userId, Date beginDate, String noticeType) {\n\t\treturn sysAnnouncementMapper.getUnreadMessageCountByUserId(userId, beginDate, noticeType);\n\t}\n\n\t@Override\n\tpublic void completeAnnouncementSendInfo() {\n\t\tLoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\tString userId = sysUser.getId();\n\t\tList<String> announcementIds = this.getNotSendedAnnouncementlist(userId);\n\t\tList<SysAnnouncementSend> sysAnnouncementSendList = new ArrayList<>();\n\t\tif (!CollectionUtils.isEmpty(announcementIds)) {\n\t\t\tfor (String commentId : announcementIds) {\n\t\t\t\tSysAnnouncementSend announcementSend = new SysAnnouncementSend();\n\t\t\t\tannouncementSend.setAnntId(commentId);\n\t\t\t\tannouncementSend.setUserId(userId);\n\t\t\t\tannouncementSend.setReadFlag(CommonConstant.NO_READ_FLAG);\n\t\t\t\tsysAnnouncementSendList.add(announcementSend);\n\t\t\t}\n\t\t}\n\t\tif (!CollectionUtils.isEmpty(sysAnnouncementSendList)) {\n\t\t\tsysAnnouncementSendService.saveBatch(sysAnnouncementSendList);\n\t\t}\n\t}\n\n\t@Override\n\tpublic void batchInsertSysAnnouncementSend(String commentId, Integer tenantId) {\n\t\tif (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL && oConvertUtils.isNotEmpty(tenantId)) {\n\t\t\tlog.info(\"补全公告与用户的关系数据，租户ID = {}\", tenantId);\n\t\t} else {\n\t\t\ttenantId = null;\n\t\t}\n\t\t\n\t\tList<String> userIdList = sysUserMapper.getTenantUserIdList(tenantId);\n\t\tList<SysAnnouncementSend> sysAnnouncementSendList = new ArrayList<>();\n\t\tif (!CollectionUtils.isEmpty(userIdList)) {\n\t\t\tfor (String userId : userIdList) {\n\t\t\t\tSysAnnouncementSend announcementSend = new SysAnnouncementSend();\n\t\t\t\tannouncementSend.setAnntId(commentId);\n\t\t\t\tannouncementSend.setUserId(userId);\n\t\t\t\tannouncementSend.setReadFlag(CommonConstant.NO_READ_FLAG);\n\t\t\t\tsysAnnouncementSendList.add(announcementSend);\n\t\t\t}\n\t\t}\n\t\tif (!CollectionUtils.isEmpty(sysAnnouncementSendList)) {\n\t\t\tlog.info(\"补全公告与用户的关系数据，sysAnnouncementSendList size = {}\", sysAnnouncementSendList.size());\n\t\t\tsysAnnouncementSendService.saveBatch(sysAnnouncementSendList);\n\t\t}\n\t}\n\n\t@Override\n\tpublic List<SysAnnouncement> querySysMessageList(int pageSize, int pageNo, String fromUser, String starFlag, String busType, String msgCategory, Date beginDate, Date endDate, String noticeType) {\n//\t\t//1. 补全send表的数据\n//\t\tcompleteNoteThreadPool.execute(()->{\n//\t\t\tcompleteAnnouncementSendInfo();\n//\t\t});\n\t\t\n\t\tLoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\tlog.debug(\" 获取登录人 LoginUser id: {}\", sysUser.getId());\n\t\tPage<SysAnnouncement> page = new Page<SysAnnouncement>(pageNo,pageSize);\n\t\tList<SysAnnouncement> list = baseMapper.queryAllMessageList(page, sysUser.getId(), fromUser, starFlag, busType, msgCategory,beginDate, endDate, noticeType);\n\t\treturn list;\n\t}\n\n\t@Override\n\tpublic void updateReaded(List<String> annoceIdList) {\n\t\tLoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\tsysAnnouncementSendMapper.updateReaded(sysUser.getId(), annoceIdList);\n\t}\n\n\t@Override\n\tpublic void clearAllUnReadMessage() {\n\t\tLoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\tsysAnnouncementSendMapper.clearAllUnReadMessage(sysUser.getId());\n\t}\n\n\t/**\n\t * 查询用户未读的通知公告，防止SQL注入写法调整\n\t * @param userId\n\t * @return\n\t */\n\n\t@Override\n\tpublic List<String> getNotSendedAnnouncementlist(String userId) {\n\t\treturn sysAnnouncementMapper.getNotSendedAnnouncementlist(new Date(), userId);\n\t}\n\n\t/**\n\t * 更新访问量\n\t * @param id\n\t * @param increaseCount\n\t */\n\t@Override\n\tpublic void updateVisitsNum(String id, int increaseCount) {\n\t\tSysAnnouncement sysAnnouncement = sysAnnouncementMapper.selectById(id);\n\t\tif (oConvertUtils.isNotEmpty(sysAnnouncement)) {\n\t\t\tint visits = oConvertUtils.getInt(sysAnnouncement.getVisitsNum(), 0);\n\t\t\tint totalValue = increaseCount + visits;\n\t\t\tsysAnnouncement.setVisitsNum(totalValue);\n\t\t\tsysAnnouncementMapper.updateById(sysAnnouncement);\n\t\t\tlog.info(\"通知公告：{} 访问次数+1，总访问数量：{}\", sysAnnouncement.getTitile(), sysAnnouncement.getVisitsNum());\n\t\t}\n\t}\n\n\t/**\n\t * 批量下载文件\n\t * @param id\n\t * @param request\n\t * @param response\n\t */\n\t@Override\n\tpublic void downLoadFiles(String id, HttpServletRequest request, HttpServletResponse response) {\n\t\t// 参数校验\n\t\tif (oConvertUtils.isEmpty(id)) {\n\t\t\tresponse.setStatus(HttpServletResponse.SC_BAD_REQUEST);\n\t\t\treturn;\n\t\t}\n\n\t\t// 获取文章信息\n\t\tSysAnnouncement sysAnnouncement = this.baseMapper.selectById(id);\n\t\tif (oConvertUtils.isEmpty(sysAnnouncement)) {\n\t\t\tresponse.setStatus(HttpServletResponse.SC_NOT_FOUND);\n\t\t\treturn;\n\t\t}\n\t\t//设置HTTP响应头：准备文件下载\n\t\tresponse.reset();\n\t\tresponse.setCharacterEncoding(\"utf-8\");\n\t\tresponse.setContentType(\"application/force-download\");\n\t\tZipArchiveOutputStream zous = null;\n\t\ttry {\n\t\t\t// 生成ZIP文件名：使用文章标题+时间戳避免重名\n\t\t\tString title = sysAnnouncement.getTitile() + new Date().getTime();\n\t\t\tString zipName = URLEncoder.encode( title + \".zip\", \"UTF-8\").replaceAll(\"\\\\+\", \"%20\");\n\t\t\tresponse.setHeader(\"Content-Disposition\", \"attachment;filename*=utf-8''\" + zipName);\n\t\t\t// 创建ZIP输出流：直接输出到HTTP响应流\n\t\t\tzous = new ZipArchiveOutputStream(response.getOutputStream());\n\t\t\tzous.setUseZip64(Zip64Mode.AsNeeded);// 支持大文件\n\n\t\t\t// 批量下载文件\n\t\t\tString[] fileUrls = sysAnnouncement.getFiles().split(\",\");\n\t\t\t// 遍历所有文件URL\n\t\t\tfor (int i = 0; i < fileUrls.length; i++) {\n\t\t\t\tString fileUrl = fileUrls[i].trim();\n\t\t\t\tif (oConvertUtils.isEmpty(fileUrl)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// 【安全校验】防止路径遍历攻击\n\t\t\t\tSsrfFileTypeFilter.checkPathTraversal(fileUrl);\n\t\t\t\t// 生成ZIP内文件名：避免重名，添加序号\n\t\t\t\tString fileName = FileDownloadUtils.generateFileName(fileUrl, i, fileUrls.length);\n\t\t\t\tString uploadUrl = jeecgBaseConfig.getPath().getUpload();\n\t\t\t\t// 下载单个文件并添加到ZIP\n\t\t\t\tFileDownloadUtils.downLoadSingleFile(fileUrl,fileName,uploadUrl, zous);\n\t\t\t}\n\t\t\t// 完成ZIP写入\n\t\t\tzous.finish();\n\t\t\t// 刷新缓冲区确保数据发送\n\t\t\tresponse.flushBuffer();\n\t\t} catch (IOException e) {\n\t\t\tlog.error(\"文件下载失败\"+e.getMessage(), e);\n\t\t\tresponse.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);\n\t\t} finally {\n\t\t\t// 确保流关闭，防止资源泄漏\n\t\t\tIoUtil.close(zous);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.aliyuncs.exceptions.ClientException;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;\nimport com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.google.common.base.Joiner;\nimport com.jeecg.dingtalk.api.core.response.Response;\nimport freemarker.core.TemplateClassResolver;\nimport freemarker.template.Configuration;\nimport freemarker.template.Template;\nimport freemarker.template.TemplateException;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.apache.commons.lang3.ObjectUtils;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.api.dto.AiragFlowDTO;\nimport org.jeecg.common.api.dto.DataLogDTO;\nimport org.jeecg.common.api.dto.OnlineAuthDTO;\nimport org.jeecg.common.api.dto.PushMessageDTO;\nimport org.jeecg.common.api.dto.message.*;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.aspect.UrlMatchEnum;\nimport org.jeecg.common.constant.*;\nimport org.jeecg.common.constant.enums.*;\nimport org.jeecg.common.desensitization.util.SensitiveInfoUtil;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.api.ISysBaseAPI;\nimport org.jeecg.common.system.query.QueryCondition;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.query.QueryRuleEnum;\nimport org.jeecg.common.system.vo.*;\nimport org.jeecg.common.util.*;\nimport org.jeecg.common.util.dynamic.db.FreemarkerParseFactory;\nimport org.jeecg.config.firewall.SqlInjection.IDictTableWhiteListHandler;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.modules.airag.flow.service.IAiragFlowService;\nimport org.jeecg.modules.message.entity.SysMessageTemplate;\nimport org.jeecg.modules.message.handle.impl.DdSendMsgHandle;\nimport org.jeecg.modules.message.handle.impl.EmailSendMsgHandle;\nimport org.jeecg.modules.message.handle.impl.QywxSendMsgHandle;\nimport org.jeecg.modules.message.handle.impl.SystemSendMsgHandle;\nimport org.jeecg.modules.message.service.ISysMessageTemplateService;\nimport org.jeecg.modules.message.websocket.WebSocket;\nimport org.jeecg.modules.system.entity.*;\nimport org.jeecg.modules.system.mapper.*;\nimport org.jeecg.modules.system.service.*;\nimport org.jeecg.modules.system.util.SecurityUtil;\nimport org.jeecg.modules.system.vo.lowapp.SysDictVo;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.cache.annotation.Cacheable;\nimport org.springframework.http.HttpEntity;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.http.MediaType;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.stereotype.Service;\nimport org.springframework.ui.freemarker.FreeMarkerTemplateUtils;\nimport org.springframework.util.AntPathMatcher;\nimport org.springframework.util.CollectionUtils;\nimport org.springframework.util.PathMatcher;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.web.client.RestClientException;\nimport org.springframework.web.client.RestTemplate;\nimport org.springframework.web.servlet.mvc.method.annotation.SseEmitter;\n\nimport javax.sql.DataSource;\nimport java.io.IOException;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLDecoder;\nimport java.sql.Connection;\nimport java.sql.DatabaseMetaData;\nimport java.sql.SQLException;\nimport java.util.*;\nimport java.util.stream.Collectors;\n\n/**\n * @Description: 底层共通业务API，提供其他独立模块调用\n * @Author: scott\n * @Date:2019-4-20 \n * @Version:V1.0\n */\n@Slf4j\n@Service\npublic class SysBaseApiImpl implements ISysBaseAPI {\n\t/** 当前系统数据库类型 */\n\tprivate static String DB_TYPE = \"\";\n\n\t// uniapp 推送调用api地址\n\t@Value(\"${jeecg.unicloud.pushUrl:}\")\n\tprivate String jeecgPushUrl;\n\n\t@Autowired\n\tprivate RestTemplate restTemplate;\n\n\t@Autowired\n\tprivate ISysMessageTemplateService sysMessageTemplateService;\n\t@Resource\n\tprivate SysUserMapper userMapper;\n\t@Resource\n\tprivate SysUserRoleMapper sysUserRoleMapper;\n\t@Autowired\n\tprivate ISysDepartService sysDepartService;\n\t@Autowired\n\tprivate ISysDictService sysDictService;\n\t@Resource\n\tprivate SysAnnouncementMapper sysAnnouncementMapper;\n\t@Resource\n\tprivate SysAnnouncementSendMapper sysAnnouncementSendMapper;\n\t@Resource\n    private WebSocket webSocket;\n\t@Resource\n\tprivate SysRoleMapper roleMapper;\n\t@Resource\n\tprivate SysDepartMapper departMapper;\n\t@Resource\n\tprivate SysCategoryMapper categoryMapper;\n\t@Autowired\n\tprivate ISysDataSourceService dataSourceService;\n\t@Autowired\n\tprivate ISysUserDepartService sysUserDepartService;\n\t@Autowired\n\tprivate ISysUserDepPostService sysUserDepPostService;\n\t@Resource\n\tprivate SysPermissionMapper sysPermissionMapper;\n\t@Autowired\n\tprivate ISysPermissionDataRuleService sysPermissionDataRuleService;\n\t@Autowired\n\tprivate ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService;\n\t@Autowired\n\tprivate ThirdAppDingtalkServiceImpl dingtalkService;\n\t@Autowired\n\tISysCategoryService sysCategoryService;\n\t@Autowired\n\tprivate ISysUserService sysUserService;\n\t@Autowired\n\tprivate ISysDataLogService sysDataLogService;\n\t@Autowired\n\tprivate ISysRoleService sysRoleService;\n\t@Autowired\n\tprivate ISysUserTenantService sysUserTenantService;\n\n\t@Autowired\n\tprivate ISysUserRoleService sysUserRoleService;\n\n\t@Autowired\n\tprivate ISysUserPositionService sysUserPositionService;\n\n\t@Autowired\n\tprivate IDictTableWhiteListHandler dictTableWhiteListHandler;\n\n\t@Autowired\n\tprivate ISysAnnouncementService sysAnnouncementService;\n\n    @Autowired\n    IAiragFlowService airagFlowService;\n\n\t@Override\n\t//@SensitiveDecode\n\tpublic LoginUser getUserByName(String username) {\n\t\t// 代码逻辑说明: VUEN-1276 【v3流程图】测试bug 1、通过我发起的流程或者流程实例，查看历史，流程图预览问题\n\t\tif (oConvertUtils.isEmpty(username)) {\n\t\t\treturn null;\n\t\t}\n\t\tLoginUser user = sysUserService.getEncodeUserInfo(username);\n\n\t\t//相同类中方法间调用时脱敏解密 Aop会失效，获取用户信息太重要，此处采用原生解密方法，不采用@SensitiveDecodeAble注解方式\n\t\ttry {\n\t\t\tSensitiveInfoUtil.handlerObject(user, false);\n\t\t} catch (IllegalAccessException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\n\t\treturn user;\n\t}\n\n\n\t@Override\n\t@Cacheable(cacheNames=CommonConstant.SYS_USER_ID_MAPPING_CACHE, key=\"#username\")\n\tpublic String getUserIdByName(String username) {\n\t\tif (oConvertUtils.isEmpty(username)) {\n\t\t\treturn null;\n\t\t}\n\t\tString userId = userMapper.getUserIdByName(username);\n\t\treturn userId;\n\t}\n\t\n\n\t@Override\n\tpublic String translateDictFromTable(String table, String text, String code, String key) {\n\t\treturn sysDictService.queryTableDictTextByKey(table, text, code, key);\n\t}\n\n\t@Override\n\tpublic String translateDict(String code, String key) {\n\t\treturn sysDictService.queryDictTextByKey(code, key);\n\t}\n\n\t@Override\n\tpublic List<SysPermissionDataRuleModel> queryPermissionDataRule(String component, String requestPath, String username) {\n\t\tList<SysPermission> currentSyspermission = null;\n\t\tif(oConvertUtils.isNotEmpty(component)) {\n\t\t\t//1.通过注解属性pageComponent 获取菜单\n\t\t\tLambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>();\n\t\t\tquery.eq(SysPermission::getDelFlag,0);\n\t\t\tquery.eq(SysPermission::getComponent, component);\n\t\t\tcurrentSyspermission = sysPermissionMapper.selectList(query);\n\t\t}else {\n\t\t\t//1.直接通过前端请求地址查询菜单\n\t\t\tLambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>();\n\t\t\tquery.eq(SysPermission::getMenuType,2);\n\t\t\tquery.eq(SysPermission::getDelFlag,0);\n\t\t\t\n\t\t\t// 代码逻辑说明: 解决参数顺序问题\n\t\t\tList<String> allPossiblePaths = this.getOnlinePossiblePaths(requestPath);\n\t\t\tlog.debug(\"获取的菜单地址= {}\", allPossiblePaths.toString());\n\t\t\tif(allPossiblePaths.size()==1){\n\t\t\t\tquery.eq(SysPermission::getUrl, requestPath);\n\t\t\t}else{\n\t\t\t\tquery.in(SysPermission::getUrl, allPossiblePaths);\t\n\t\t\t}\n\t\t\t\n\t\t\tcurrentSyspermission = sysPermissionMapper.selectList(query);\n\t\t\t//2.未找到 再通过自定义匹配URL 获取菜单\n\t\t\tif(currentSyspermission==null || currentSyspermission.size()==0) {\n\t\t\t\t//通过自定义URL匹配规则 获取菜单（实现通过菜单配置数据权限规则，实际上针对获取数据接口进行数据规则控制）\n\t\t\t\tString userMatchUrl = UrlMatchEnum.getMatchResultByUrl(requestPath);\n\t\t\t\tLambdaQueryWrapper<SysPermission> queryQserMatch = new LambdaQueryWrapper<SysPermission>();\n\t\t\t\t// 代码逻辑说明:  online菜单如果配置成一级菜单 权限查询不到 取消menuType = 1\n\t\t\t\t//queryQserMatch.eq(SysPermission::getMenuType, 1);\n\t\t\t\tqueryQserMatch.eq(SysPermission::getDelFlag, 0);\n\t\t\t\tqueryQserMatch.eq(SysPermission::getUrl, userMatchUrl);\n\t\t\t\tif(oConvertUtils.isNotEmpty(userMatchUrl)){\n\t\t\t\t\tcurrentSyspermission = sysPermissionMapper.selectList(queryQserMatch);\n\t\t\t\t}\n\t\t\t}\n\t\t\t//3.未找到 再通过正则匹配获取菜单\n\t\t\tif(currentSyspermission==null || currentSyspermission.size()==0) {\n\t\t\t\t//通过正则匹配权限配置\n\t\t\t\tString regUrl = getRegexpUrl(requestPath);\n\t\t\t\tif(regUrl!=null) {\n\t\t\t\t\tcurrentSyspermission = sysPermissionMapper.selectList(new LambdaQueryWrapper<SysPermission>().eq(SysPermission::getMenuType,2).eq(SysPermission::getUrl, regUrl).eq(SysPermission::getDelFlag,0));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(currentSyspermission!=null && currentSyspermission.size()>0){\n\t\t\tList<SysPermissionDataRuleModel> dataRules = new ArrayList<SysPermissionDataRuleModel>();\n\t\t\tfor (SysPermission sysPermission : currentSyspermission) {\n\t\t\t\t// 代码逻辑说明: 数据权限规则编码不规范，项目存在相同包名和类名 #722\n\t\t\t\tList<SysPermissionDataRule> temp = sysPermissionDataRuleService.queryPermissionDataRules(username, sysPermission.getId());\n\t\t\t\tif(temp!=null && temp.size()>0) {\n\t\t\t\t\t//dataRules.addAll(temp);\n\t\t\t\t\tdataRules = oConvertUtils.entityListToModelList(temp,SysPermissionDataRuleModel.class);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn dataRules;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * 匹配前端传过来的地址 匹配成功返回正则地址\n\t * AntPathMatcher匹配地址\n\t *()* 匹配0个或多个字符\n\t *()**匹配0个或多个目录\n\t */\n\tprivate String getRegexpUrl(String url) {\n\t\tList<String> list = sysPermissionMapper.queryPermissionUrlWithStar();\n\t\tif(list!=null && list.size()>0) {\n\t\t\tfor (String p : list) {\n\t\t\t\tPathMatcher matcher = new AntPathMatcher();\n\t\t\t\tif(matcher.match(p, url)) {\n\t\t\t\t\treturn p;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic SysUserCacheInfo getCacheUser(String username) {\n\t\tSysUserCacheInfo info = new SysUserCacheInfo();\n\t\tinfo.setOneDepart(true);\n\t\tLoginUser user = this.getUserByName(username);\n\n//\t\ttry {\n//\t\t\t//相同类中方法间调用时脱敏@SensitiveDecodeAble解密 Aop失效处理\n//\t\t\tSensitiveInfoUtil.handlerObject(user, false);\n//\t\t} catch (IllegalAccessException e) {\n//\t\t\te.printStackTrace();\n//\t\t}\n\n\t\tif(user!=null) {\n\t\t\tinfo.setSysUserId(user.getId());\n\t\t\tinfo.setSysUserCode(user.getUsername());\n\t\t\tinfo.setSysUserName(user.getRealname());\n\t\t\tinfo.setSysOrgCode(user.getOrgCode());\n\t\t\tinfo.setSysOrgId(user.getOrgId());\n\t\t\tinfo.setSysRoleCode(user.getRoleCode());\n\t\t}else{\n\t\t\treturn null;\n\t\t}\n\t\t//多部门支持in查询\n\t\tList<SysDepart> list = departMapper.queryUserDeparts(user.getId());\n\t\tList<String> sysMultiOrgCode = new ArrayList<String>();\n\t\tif(list==null || list.size()==0) {\n\t\t\t//当前用户无部门\n\t\t\t//sysMultiOrgCode.add(\"0\");\n\t\t}else if(list.size()==1) {\n\t\t\tsysMultiOrgCode.add(list.get(0).getOrgCode());\n\t\t}else {\n\t\t\tinfo.setOneDepart(false);\n\t\t\tfor (SysDepart dpt : list) {\n\t\t\t\tsysMultiOrgCode.add(dpt.getOrgCode());\n\t\t\t}\n\t\t}\n\t\tinfo.setSysMultiOrgCode(sysMultiOrgCode);\n\t\treturn info;\n\t}\n\n\t@Override\n\tpublic LoginUser getUserById(String id) {\n\t\tif(oConvertUtils.isEmpty(id)) {\n\t\t\treturn null;\n\t\t}\n\t\tLoginUser loginUser = new LoginUser();\n\t\tSysUser sysUser = userMapper.selectById(id);\n\t\tif(sysUser==null) {\n\t\t\treturn null;\n\t\t}\n\t\tBeanUtils.copyProperties(sysUser, loginUser);\n\t\t//去掉用户敏感信息\n\t\tloginUser.setPassword(null);\n\t\tloginUser.setRelTenantIds(null);\n\t\tloginUser.setDepartIds(null);\n\t\treturn loginUser;\n\t}\n\n\t@Override\n\tpublic List<String> getRolesByUsername(String username) {\n\t\treturn sysUserRoleMapper.getRoleByUserName(username);\n\t}\n\t\n\t@Override\n\tpublic List<String> getRolesByUserId(String userId) {\n\t\treturn sysUserRoleMapper.getRoleCodeByUserId(userId);\n\t}\n\n\t@Override\n\tpublic List<String> getDepartIdsByUsername(String username) {\n\t\tList<SysDepart> list = sysDepartService.queryDepartsByUsername(username);\n\t\tList<String> result = new ArrayList<>(list.size());\n\t\tfor (SysDepart depart : list) {\n\t\t\tresult.add(depart.getId());\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t@Override\n\tpublic List<String> getDepartIdsByUserId(String userId) {\n\t\treturn sysDepartService.queryDepartsByUserId(userId);\n\t}\n\n\t@Override\n\tpublic Set<String> getDepartParentIdsByUsername(String username) {\n\t\tList<SysDepart> list = sysDepartService.queryDepartsByUsername(username);\n\t\tSet<String> result = new HashSet<>(list.size());\n\t\tfor (SysDepart depart : list) {\n\t\t\tresult.add(depart.getParentId());\n\t\t}\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic Set<String> getDepartParentIdsByDepIds(Set<String> depIds) {\n\t\tLambdaQueryWrapper<SysDepart> departQuery = new LambdaQueryWrapper<SysDepart>().in(SysDepart::getId, depIds);\n\t\tList<SysDepart> departList = departMapper.selectList(departQuery);\n\n\t\tif(CollectionUtils.isEmpty(departList)){\n\t\t\treturn null;\n\t\t}\n\t\tSet<String> parentIds = departList.stream()\n\t\t\t\t.map(SysDepart::getParentId)\n\t\t\t\t.collect(Collectors.toSet());\n\t\treturn parentIds;\n\t}\n\n\t@Override\n\tpublic List<String> getDepartNamesByUsername(String username) {\n\t\tList<SysDepart> list = sysDepartService.queryDepartsByUsername(username);\n\t\tList<String> result = new ArrayList<>(list.size());\n\t\tfor (SysDepart depart : list) {\n\t\t\tresult.add(depart.getDepartName());\n\t\t}\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic DictModel getParentDepartId(String departId) {\n\t\tSysDepart depart = departMapper.getParentDepartId(departId);\n\t\tDictModel model = new DictModel(depart.getId(),depart.getParentId());\n\t\treturn model;\n\t}\n\n\t@Override\n\t@Cacheable(value = CacheConstant.SYS_DICT_CACHE,key = \"#code\", unless = \"#result == null \")\n\tpublic List<DictModel> queryDictItemsByCode(String code) {\n\t\treturn sysDictService.queryDictItemsByCode(code);\n\t}\n\n\t@Override\n\t@Cacheable(value = CacheConstant.SYS_ENABLE_DICT_CACHE,key = \"#code\", unless = \"#result == null \")\n\tpublic List<DictModel> queryEnableDictItemsByCode(String code) {\n\t\treturn sysDictService.queryEnableDictItemsByCode(code);\n\t}\n\n\t@Override\n\tpublic List<DictModel> queryTableDictItemsByCode(String tableFilterSql, String text, String code) {\n\t\t//【Online+系统】字典表加权限控制机制逻辑，想法不错 LOWCOD-799\n\t\tif(tableFilterSql.indexOf(SymbolConstant.SYS_VAR_PREFIX)>=0){\n\t\t\ttableFilterSql = QueryGenerator.getSqlRuleValue(tableFilterSql);\n\t\t}\n\t\treturn sysDictService.queryTableDictItemsByCode(tableFilterSql, text, code);\n\t}\n\n\t@Override\n\tpublic List<DictModel> queryAllDepartBackDictModel() {\n\t\treturn sysDictService.queryAllDepartBackDictModel();\n\t}\n\n\t@Override\n\tpublic void sendSysAnnouncement(MessageDTO message) {\n\t\tthis.sendSysAnnouncement(message.getFromUser(),\n\t\t\t\tmessage.getToUser(),\n\t\t\t\tmessage.getTitle(),\n\t\t\t\tmessage.getContent(),\n\t\t\t\tmessage.getCategory(),\n                message.getNoticeType());\n\t\ttry {\n\t\t\t// 同步发送第三方APP消息\n\t\t\twechatEnterpriseService.sendMessage(message, true);\n\t\t\tdingtalkService.sendMessage(message, true);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"同步发送第三方APP消息失败！\", e);\n\t\t}\n\t}\n\n\t@Override\n\tpublic void sendBusAnnouncement(BusMessageDTO message) {\n\t\tsendBusAnnouncement(message.getFromUser(),\n\t\t\t\tmessage.getToUser(),\n\t\t\t\tmessage.getTitle(),\n\t\t\t\tmessage.getContent(),\n\t\t\t\tmessage.getCategory(),\n\t\t\t\tmessage.getBusType(),\n\t\t\t\tmessage.getBusId(),\n\t\t\t\tmessage.getNoticeType());\n\t\ttry {\n\t\t\t// 同步发送第三方APP消息\n\t\t\twechatEnterpriseService.sendMessage(message, true);\n\t\t\tdingtalkService.sendMessage(message, true);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"同步发送第三方APP消息失败！\", e);\n\t\t}\n\t}\n\n\t@Override\n\tpublic void sendTemplateAnnouncement(TemplateMessageDTO message) {\n\t\tString templateCode = message.getTemplateCode();\n\t\tString title = message.getTitle();\n\t\tMap<String,String> tmplateParam = message.getTemplateParam();\n\t\tString fromUser = message.getFromUser();\n\t\tString toUser = message.getToUser();\n\n\t\tList<SysMessageTemplate> sysSmsTemplates = sysMessageTemplateService.selectByCode(templateCode);\n\t\tif(sysSmsTemplates==null||sysSmsTemplates.size()==0){\n\t\t\tthrow new JeecgBootException(\"消息模板不存在，模板编码：\"+templateCode);\n\t\t}\n\t\tSysMessageTemplate sysSmsTemplate = sysSmsTemplates.get(0);\n\t\t//模板标题\n\t\ttitle = title==null?sysSmsTemplate.getTemplateName():title;\n\t\t//模板内容\n\t\tString content = sysSmsTemplate.getTemplateContent();\n\t\tif(tmplateParam!=null) {\n\t\t\tfor (Map.Entry<String, String> entry : tmplateParam.entrySet()) {\n\t\t\t\tString str = \"${\" + entry.getKey() + \"}\";\n\t\t\t\tif(oConvertUtils.isNotEmpty(title)){\n\t\t\t\t\ttitle = title.replace(str, entry.getValue());\n\t\t\t\t}\n\t\t\t\tcontent = content.replace(str, entry.getValue());\n\t\t\t}\n\t\t}\n\t\tString mobileOpenUrl = null;\n\t\tif(tmplateParam!=null && oConvertUtils.isNotEmpty(tmplateParam.get(CommonConstant.MSG_HREF_URL))){\n\t\t\tmobileOpenUrl = tmplateParam.get(CommonConstant.MSG_HREF_URL);\n\t\t}\n\t\tSysAnnouncement announcement = new SysAnnouncement();\n\t\tannouncement.setTitile(title);\n\t\tannouncement.setMsgContent(content);\n\t\tannouncement.setSender(fromUser);\n\t\tannouncement.setPriority(CommonConstant.PRIORITY_M);\n\t\tannouncement.setMsgType(CommonConstant.MSG_TYPE_UESR);\n\t\tannouncement.setSendStatus(CommonConstant.HAS_SEND);\n\t\tannouncement.setSendTime(new Date());\n\t\tannouncement.setMsgCategory(CommonConstant.MSG_CATEGORY_2);\n\t\tannouncement.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0));\n       // 代码逻辑说明: [QQYUN-12999]系统通知，系统通知时间更新，但是排到下面了\n\t\tannouncement.setIzTop(CommonConstant.IZ_TOP_0);\n  \t\tsysAnnouncementMapper.insert(announcement);\n\t\t// 2.插入用户通告阅读标记表记录\n\t\tString userId = toUser;\n\t\tString[] userIds = userId.split(\",\");\n\t\tString anntId = announcement.getId();\n\t\tfor(int i=0;i<userIds.length;i++) {\n\t\t\tif(oConvertUtils.isNotEmpty(userIds[i])) {\n\t\t\t\tSysUser sysUser = userMapper.getUserByName(userIds[i]);\n\t\t\t\tif(sysUser==null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tSysAnnouncementSend announcementSend = new SysAnnouncementSend();\n\t\t\t\tannouncementSend.setAnntId(anntId);\n\t\t\t\tannouncementSend.setUserId(sysUser.getId());\n\t\t\t\tannouncementSend.setReadFlag(CommonConstant.NO_READ_FLAG);\n\t\t\t\tsysAnnouncementSendMapper.insert(announcementSend);\n\t\t\t\tJSONObject obj = new JSONObject();\n\t\t\t\tobj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);\n\t\t\t\tobj.put(WebsocketConst.MSG_USER_ID, sysUser.getId());\n\t\t\t\tobj.put(WebsocketConst.MSG_ID, announcement.getId());\n\t\t\t\tobj.put(WebsocketConst.MSG_TXT, announcement.getTitile());\n\t\t\t\twebSocket.sendMessage(sysUser.getId(), obj.toJSONString());\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\t// 同步企业微信、钉钉的消息通知\n\t\t\tdingtalkService.sendActionCardMessage(announcement, mobileOpenUrl, true);\n\t\t\twechatEnterpriseService.sendTextCardMessage(announcement, mobileOpenUrl, true);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"同步发送第三方APP消息失败！\", e);\n\t\t}\n\n\t}\n\n\t@Override\n\tpublic void sendBusTemplateAnnouncement(BusTemplateMessageDTO message) {\n\t\tString templateCode = message.getTemplateCode();\n\t\tString title = message.getTitle();\n\t\tMap<String,String> tmplateParam = message.getTemplateParam();\n\t\tString fromUser = message.getFromUser();\n\t\tString toUser = message.getToUser();\n\t\tString busId = message.getBusId();\n\t\tString busType = message.getBusType();\n\n\t\tList<SysMessageTemplate> sysSmsTemplates = sysMessageTemplateService.selectByCode(templateCode);\n\t\tif(sysSmsTemplates==null||sysSmsTemplates.size()==0){\n\t\t\tthrow new JeecgBootException(\"消息模板不存在，模板编码：\"+templateCode);\n\t\t}\n\t\tSysMessageTemplate sysSmsTemplate = sysSmsTemplates.get(0);\n\t\t//模板标题\n\t\ttitle = title==null?sysSmsTemplate.getTemplateName():title;\n\t\t//模板内容\n\t\tString content = sysSmsTemplate.getTemplateContent();\n\t\tif(tmplateParam!=null) {\n\t\t\tfor (Map.Entry<String, String> entry : tmplateParam.entrySet()) {\n\t\t\t\tString str = \"${\" + entry.getKey() + \"}\";\n\t\t\t\tif (entry.getValue() != null) {\n\t\t\t\t\ttitle = title.replace(str, entry.getValue());\n\t\t\t\t\tcontent = content.replace(str, entry.getValue());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tSysAnnouncement announcement = new SysAnnouncement();\n\t\tannouncement.setTitile(title);\n\t\tannouncement.setMsgContent(content);\n\t\tannouncement.setSender(fromUser);\n\t\tannouncement.setPriority(CommonConstant.PRIORITY_M);\n\t\tannouncement.setMsgType(CommonConstant.MSG_TYPE_UESR);\n\t\tannouncement.setSendStatus(CommonConstant.HAS_SEND);\n\t\tannouncement.setSendTime(new Date());\n\t\t// 代码逻辑说明: [QQYUN-12999]系统通知，系统通知时间更新，但是排到下面了\n\t\tannouncement.setIzTop(CommonConstant.IZ_TOP_0);\n\t\tif(tmplateParam!=null && oConvertUtils.isNotEmpty(tmplateParam.get(CommonSendStatus.MSG_ABSTRACT_JSON))){\n\t\t\tannouncement.setMsgAbstract(tmplateParam.get(CommonSendStatus.MSG_ABSTRACT_JSON));\n\t\t}\n\t\tString mobileOpenUrl = null;\n\t\tif(tmplateParam!=null && oConvertUtils.isNotEmpty(tmplateParam.get(CommonConstant.MSG_HREF_URL))){\n\t\t\tmobileOpenUrl = tmplateParam.get(CommonConstant.MSG_HREF_URL);\n\t\t}\n\n\t\t// 如果传递扩展json，说明是个性化业务，有意见remark则设置为通知内容\n\t\tif(oConvertUtils.isJson(announcement.getMsgAbstract())) {\n\t\t\t// 获取announcement.getMsgAbstract()的字段remark\n\t\t\tJSONObject jsonObject = JSON.parseObject(announcement.getMsgAbstract());\n\t\t\tString remark = jsonObject.containsKey(\"remark\")? jsonObject.getString(\"remark\"): null;\n\t\t\tif(oConvertUtils.isNotEmpty(remark)){\n\t\t\t\tannouncement.setMsgContent(remark);\n\t\t\t}\n\t\t}\n\n\t\tannouncement.setMsgCategory(CommonConstant.MSG_CATEGORY_2);\n\t\tannouncement.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0));\n\t\tannouncement.setBusId(busId);\n\t\tannouncement.setBusType(busType);\n\t\tannouncement.setOpenType(SysAnnmentTypeEnum.getByType(busType).getOpenType());\n\t\tannouncement.setOpenPage(SysAnnmentTypeEnum.getByType(busType).getOpenPage());\n\t\tsysAnnouncementMapper.insert(announcement);\n\t\t// 2.插入用户通告阅读标记表记录\n\t\tString userId = toUser;\n\t\tString[] userIds = userId.split(\",\");\n\t\tString anntId = announcement.getId();\n\t\tfor(int i=0;i<userIds.length;i++) {\n\t\t\tif(oConvertUtils.isNotEmpty(userIds[i])) {\n\t\t\t\tSysUser sysUser = userMapper.getUserByName(userIds[i]);\n\t\t\t\tif(sysUser==null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tSysAnnouncementSend announcementSend = new SysAnnouncementSend();\n\t\t\t\tannouncementSend.setAnntId(anntId);\n\t\t\t\tannouncementSend.setUserId(sysUser.getId());\n\t\t\t\tannouncementSend.setReadFlag(CommonConstant.NO_READ_FLAG);\n\t\t\t\tsysAnnouncementSendMapper.insert(announcementSend);\n\t\t\t\tJSONObject obj = new JSONObject();\n\t\t\t\tobj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);\n\t\t\t\tobj.put(WebsocketConst.MSG_USER_ID, sysUser.getId());\n\t\t\t\tobj.put(WebsocketConst.MSG_ID, announcement.getId());\n\t\t\t\tobj.put(WebsocketConst.MSG_TXT, announcement.getTitile());\n\t\t\t\twebSocket.sendMessage(sysUser.getId(), obj.toJSONString());\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\t// 钉钉的消息通知\n\t\t\tdingtalkService.sendActionCardMessage(announcement, mobileOpenUrl, true);\n\t\t\t// 企业微信通知\n\t\t\twechatEnterpriseService.sendTextCardMessage(announcement, mobileOpenUrl, true);\n\t\t\t// Uniapp手机端消息推送\n\t\t\tPushMessageDTO pushMessageDTO = new PushMessageDTO();\n\t\t\tpushMessageDTO.setTitle(announcement.getTitile());\n\t\t\tpushMessageDTO.setContent(announcement.getMsgContent());\n\t\t\tpushMessageDTO.setPayload(new HashMap<>(message.getTemplateParam()));\n\t\t\tpushMessageDTO.setUsernames(Arrays.asList(toUser));\n\t\t\tthis.uniPushMsgToUser(pushMessageDTO);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"同步发送第三方APP消息失败！\", e);\n\t\t}\n\n\t}\n\n\t@Override\n\tpublic String parseTemplateByCode(TemplateDTO templateDTO) {\n\t\tString templateCode = templateDTO.getTemplateCode();\n\t\tMap<String, String> map = templateDTO.getTemplateParam();\n\t\tList<SysMessageTemplate> sysSmsTemplates = sysMessageTemplateService.selectByCode(templateCode);\n\t\tif(sysSmsTemplates==null||sysSmsTemplates.size()==0){\n\t\t\tthrow new JeecgBootException(\"消息模板不存在，模板编码：\"+templateCode);\n\t\t}\n\t\tSysMessageTemplate sysSmsTemplate = sysSmsTemplates.get(0);\n\t\t//模板内容\n\t\tString content = sysSmsTemplate.getTemplateContent();\n\t\tif(map!=null) {\n\t\t\tfor (Map.Entry<String, String> entry : map.entrySet()) {\n\t\t\t\tString str = \"${\" + entry.getKey() + \"}\";\n\t\t\t\tcontent = content.replace(str, entry.getValue());\n\t\t\t}\n\t\t}\n\t\treturn content;\n\t}\n\n\t@Override\n\tpublic void updateSysAnnounReadFlag(String busType, String busId) {\n\t\tSysAnnouncement announcement = sysAnnouncementMapper.selectOne(new QueryWrapper<SysAnnouncement>().eq(\"bus_type\",busType).eq(\"bus_id\",busId));\n\t\tif(announcement != null){\n\t\t\tLoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();\n\t\t\tString userId = sysUser.getId();\n\t\t\tLambdaUpdateWrapper<SysAnnouncementSend> updateWrapper = new UpdateWrapper().lambda();\n\t\t\tupdateWrapper.set(SysAnnouncementSend::getReadFlag, CommonConstant.HAS_READ_FLAG);\n\t\t\tupdateWrapper.set(SysAnnouncementSend::getReadTime, new Date());\n\t\t\tupdateWrapper.eq(SysAnnouncementSend::getAnntId,announcement.getId());\n\t\t\tupdateWrapper.eq(SysAnnouncementSend::getUserId,userId);\n\t\t\t//updateWrapper.last(\"where annt_id ='\"+announcement.getId()+\"' and user_id ='\"+userId+\"'\");\n\t\t\tSysAnnouncementSend announcementSend = new SysAnnouncementSend();\n\t\t\tsysAnnouncementSendMapper.update(announcementSend, updateWrapper);\n\t\t}\n\t}\n\n\t/**\n\t * 获取数据库类型\n\t * @param dataSource\n\t * @return\n\t * @throws SQLException\n\t */\n\tprivate String getDatabaseTypeByDataSource(DataSource dataSource) throws SQLException{\n\t\tif(\"\".equals(DB_TYPE)) {\n\t\t\tConnection connection = dataSource.getConnection();\n\t\t\ttry {\n\t\t\t\tDatabaseMetaData md = connection.getMetaData();\n\t\t\t\tString dbType = md.getDatabaseProductName().toLowerCase();\n\t\t\t\tif(dbType.indexOf(DataBaseConstant.DB_TYPE_MYSQL.toLowerCase())>=0) {\n\t\t\t\t\tDB_TYPE = DataBaseConstant.DB_TYPE_MYSQL;\n\t\t\t\t}else if(dbType.indexOf(DataBaseConstant.DB_TYPE_ORACLE.toLowerCase())>=0) {\n\t\t\t\t\tDB_TYPE = DataBaseConstant.DB_TYPE_ORACLE;\n\t\t\t\t}else if(dbType.indexOf(DataBaseConstant.DB_TYPE_SQLSERVER.toLowerCase())>=0||dbType.indexOf(DataBaseConstant.DB_TYPE_SQL_SERVER_BLANK)>=0) {\n\t\t\t\t\tDB_TYPE = DataBaseConstant.DB_TYPE_SQLSERVER;\n\t\t\t\t}else if(dbType.indexOf(DataBaseConstant.DB_TYPE_POSTGRESQL.toLowerCase())>=0) {\n\t\t\t\t\tDB_TYPE = DataBaseConstant.DB_TYPE_POSTGRESQL;\n\t\t\t\t}else if(dbType.indexOf(DataBaseConstant.DB_TYPE_MARIADB.toLowerCase())>=0) {\n\t\t\t\t\tDB_TYPE = DataBaseConstant.DB_TYPE_MARIADB;\n\t\t\t\t}else {\n\t\t\t\t\tlog.error(\"数据库类型:[\" + dbType + \"]不识别!\");\n\t\t\t\t\t//throw new JeecgBootException(\"数据库类型:[\"+dbType+\"]不识别!\");\n\t\t\t\t}\n\t\t\t} catch (Exception e) {\n\t\t\t\tlog.error(e.getMessage(), e);\n\t\t\t}finally {\n\t\t\t\tconnection.close();\n\t\t\t}\n\t\t}\n\t\treturn DB_TYPE;\n\n\t}\n\n\t@Override\n\tpublic List<DictModel> queryAllDict() {\n\t\t// 查询并排序\n\t\tQueryWrapper<SysDict> queryWrapper = new QueryWrapper<SysDict>();\n\t\tqueryWrapper.orderByAsc(\"create_time\");\n\t\tList<SysDict> dicts = sysDictService.list(queryWrapper);\n\t\t// 封装成 model\n\t\tList<DictModel> list = new ArrayList<DictModel>();\n\t\tfor (SysDict dict : dicts) {\n\t\t\tlist.add(new DictModel(dict.getDictCode(), dict.getDictName()));\n\t\t}\n\n\t\treturn list;\n\t}\n\n\t@Override\n\tpublic List<SysCategoryModel> queryAllSysCategory() {\n\t\tList<SysCategory> ls = categoryMapper.selectList(null);\n\t\tList<SysCategoryModel> res = oConvertUtils.entityListToModelList(ls,SysCategoryModel.class);\n\t\treturn res;\n\t}\n\n\t@Override\n\tpublic List<DictModel> queryFilterTableDictInfo(String table, String text, String code, String filterSql) {\n\t\treturn sysDictService.queryTableDictItemsByCodeAndFilter(table,text,code,filterSql);\n\t}\n\n\t@Override\n\tpublic List<String> queryTableDictByKeys(String table, String text, String code, String[] keyArray) {\n\t\treturn sysDictService.queryTableDictByKeys(table,text,code,Joiner.on(\",\").join(keyArray));\n\t}\n\n\t@Override\n\tpublic List<ComboModel> queryAllUserBackCombo() {\n\t\tList<ComboModel> list = new ArrayList<ComboModel>();\n\t\tList<SysUser> userList = userMapper.selectList(new QueryWrapper<SysUser>().eq(\"status\",1).eq(\"del_flag\",0));\n\t\tfor(SysUser user : userList){\n\t\t\tComboModel model = new ComboModel();\n\t\t\tmodel.setTitle(user.getRealname());\n\t\t\tmodel.setId(user.getId());\n\t\t\tmodel.setUsername(user.getUsername());\n\t\t\tlist.add(model);\n\t\t}\n\t\treturn list;\n\t}\n\n\t@Override\n\tpublic JSONObject queryAllUser(String userIds, Integer pageNo, Integer pageSize) {\n\t\tJSONObject json = new JSONObject();\n\t\tQueryWrapper<SysUser> queryWrapper = new QueryWrapper<SysUser>().eq(\"status\",1).eq(\"del_flag\",0);\n\t\tList<ComboModel> list = new ArrayList<ComboModel>();\n\t\tPage<SysUser> page = new Page<SysUser>(pageNo, pageSize);\n\t\tIPage<SysUser> pageList = userMapper.selectPage(page, queryWrapper);\n\t\tfor(SysUser user : pageList.getRecords()){\n\t\t\tComboModel model = new ComboModel();\n\t\t\tmodel.setUsername(user.getUsername());\n\t\t\tmodel.setTitle(user.getRealname());\n\t\t\tmodel.setId(user.getId());\n\t\t\tmodel.setEmail(user.getEmail());\n\t\t\tif(oConvertUtils.isNotEmpty(userIds)){\n\t\t\t\tString[] temp = userIds.split(\",\");\n\t\t\t\tfor(int i = 0; i<temp.length;i++){\n\t\t\t\t\tif(temp[i].equals(user.getId())){\n\t\t\t\t\t\tmodel.setChecked(true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tlist.add(model);\n\t\t}\n\t\tjson.put(\"list\",list);\n\t\tjson.put(\"total\",pageList.getTotal());\n\t\treturn json;\n\t}\n\n\tpublic List<ComboModel> queryAllRole() {\n\t\tList<ComboModel> list = new ArrayList<ComboModel>();\n\t\tList<SysRole> roleList = roleMapper.selectList(new QueryWrapper<SysRole>());\n\t\tfor(SysRole role : roleList){\n\t\t\tComboModel model = new ComboModel();\n\t\t\tmodel.setTitle(role.getRoleName());\n\t\t\tmodel.setId(role.getId());\n\t\t\tlist.add(model);\n\t\t}\n\t\treturn list;\n\t}\n\n    @Override\n    public List<ComboModel> queryAllRole(String[] roleIds) {\n        List<ComboModel> list = new ArrayList<ComboModel>();\n        List<SysRole> roleList = roleMapper.selectList(new QueryWrapper<SysRole>());\n        for(SysRole role : roleList){\n            ComboModel model = new ComboModel();\n            model.setTitle(role.getRoleName());\n            model.setId(role.getId());\n            model.setRoleCode(role.getRoleCode());\n            if(oConvertUtils.isNotEmpty(roleIds)) {\n                for (int i = 0; i < roleIds.length; i++) {\n                    if (roleIds[i].equals(role.getId())) {\n                        model.setChecked(true);\n                    }\n                }\n            }\n            list.add(model);\n        }\n        return list;\n    }\n\n\t@Override\n\tpublic List<String> getRoleIdsByUsername(String username) {\n\t\treturn sysUserRoleMapper.getRoleIdByUserName(username);\n\t}\n\n\t@Override\n\tpublic String getDepartIdsByOrgCode(String orgCode) {\n\t\treturn departMapper.queryDepartIdByOrgCode(orgCode);\n\t}\n\n\t@Override\n\tpublic List<SysDepartModel> getAllSysDepart() {\n\t\tList<SysDepartModel> departModelList = new ArrayList<SysDepartModel>();\n\t\tList<SysDepart> departList = departMapper.selectList(new QueryWrapper<SysDepart>().eq(\"del_flag\",\"0\"));\n\t\tfor(SysDepart depart : departList){\n\t\t\tSysDepartModel model = new SysDepartModel();\n\t\t\tBeanUtils.copyProperties(depart,model);\n\t\t\tdepartModelList.add(model);\n\t\t}\n\t\treturn departModelList;\n\t}\n\n\t@Override\n\tpublic DynamicDataSourceModel getDynamicDbSourceById(String dbSourceId) {\n\t\tSysDataSource dbSource = dataSourceService.getById(dbSourceId);\n\t\tif(dbSource!=null && StringUtils.isNotBlank(dbSource.getDbPassword())){\n\t\t\tString dbPassword = dbSource.getDbPassword();\n\t\t\tString decodedStr = SecurityUtil.jiemi(dbPassword);\n\t\t\tdbSource.setDbPassword(decodedStr);\n\t\t}\n\t\treturn new DynamicDataSourceModel(dbSource);\n\t}\n\n\t@Override\n\tpublic DynamicDataSourceModel getDynamicDbSourceByCode(String dbSourceCode) {\n\t\tSysDataSource dbSource = dataSourceService.getOne(new LambdaQueryWrapper<SysDataSource>().eq(SysDataSource::getCode, dbSourceCode));\n\t\tif(dbSource!=null && StringUtils.isNotBlank(dbSource.getDbPassword())){\n\t\t\tString dbPassword = dbSource.getDbPassword();\n\t\t\tString decodedStr = SecurityUtil.jiemi(dbPassword);\n\t\t\tdbSource.setDbPassword(decodedStr);\n\t\t}\n\t\treturn new DynamicDataSourceModel(dbSource);\n\t}\n\n\t@Override\n\tpublic List<String> getDeptHeadByDepId(String deptId) {\n\t\tlog.debug(\" getDeptHeadByDepId 根据部门ID获取负责人，deptId：{}\", deptId);\n\t\tif(oConvertUtils.isEmpty(deptId)){\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tQueryWrapper<SysUser> queryWrapper = new QueryWrapper<SysUser>().eq(\"status\", 1).eq(\"del_flag\", 0);\n\n\t\t// 支持逗号分割传递多个部门id\n\t\tif (oConvertUtils.isNotEmpty(deptId) && deptId.contains(SymbolConstant.COMMA)) {\n\t\t\tString[] vals = deptId.split(SymbolConstant.COMMA);\n\n\t\t\t// 先trim去除空格，再过滤空字符串，最后去重\n\t\t\tList<String> validDeptIds = Arrays.stream(vals)\n\t\t\t\t\t.map(String::trim)\n\t\t\t\t\t.filter(oConvertUtils::isNotEmpty)\n\t\t\t\t\t.distinct()  // 去重处理\n\t\t\t\t\t.collect(Collectors.toList());\n\n\t\t\tif (!validDeptIds.isEmpty()) {\n\t\t\t\tqueryWrapper.and(andWrapper -> {\n\t\t\t\t\tfor (int i = 0; i < validDeptIds.size(); i++) {\n\t\t\t\t\t\tandWrapper.like(\"depart_ids\", validDeptIds.get(i));\n\t\t\t\t\t\tif (i < validDeptIds.size() - 1) {\n\t\t\t\t\t\t\tandWrapper.or();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (oConvertUtils.isNotEmpty(deptId)) {\n\t\t\tqueryWrapper.like(\"depart_ids\", deptId.trim());  // 单个值也要trim\n\t\t}\n\n\t\tList<SysUser> userList = userMapper.selectList(queryWrapper);\n\n\t\t// 对结果也进行去重处理\n\t\treturn userList.stream()\n\t\t\t\t.map(SysUser::getUsername)\n\t\t\t\t.distinct()\n\t\t\t\t.collect(Collectors.toList());\n\t}\n\n\t@Override\n\tpublic void sendWebSocketMsg(String[] userIds, String cmd) {\n\t\tJSONObject obj = new JSONObject();\n\t\tobj.put(WebsocketConst.MSG_CMD, cmd);\n\t\twebSocket.sendMessage(userIds, obj.toJSONString());\n\t}\n\n\t@Override\n\tpublic List<UserAccountInfo> queryAllUserByIds(String[] userIds) {\n\t\tQueryWrapper<SysUser> queryWrapper = new QueryWrapper<SysUser>().eq(\"status\",1).eq(\"del_flag\",0);\n\t\tqueryWrapper.in(\"id\",userIds);\n\t\tList<UserAccountInfo> loginUsers = new ArrayList<>();\n\t\tList<SysUser> sysUsers = userMapper.selectList(queryWrapper);\n\t\tfor (SysUser user:sysUsers) {\n\t\t\tUserAccountInfo loginUser=new UserAccountInfo();\n\t\t\tBeanUtils.copyProperties(user, loginUser);\n\t\t\tloginUsers.add(loginUser);\n\t\t}\n\t\treturn loginUsers;\n\t}\n\n\t/**\n\t * 推送签到人员信息\n\t * @param userId\n\t */\n\t@Override\n\tpublic void meetingSignWebsocket(String userId) {\n\t\tJSONObject obj = new JSONObject();\n\t\tobj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_SIGN);\n\t\tobj.put(WebsocketConst.MSG_USER_ID,userId);\n\t\t//TODO 目前全部推送，后面修改\n\t\twebSocket.sendMessage(obj.toJSONString());\n\t}\n\n\t@Override\n\tpublic List<UserAccountInfo> queryUserByNames(String[] userNames) {\n\t\tQueryWrapper<SysUser> queryWrapper = new QueryWrapper<SysUser>().eq(\"status\",1).eq(\"del_flag\",0);\n\t\tqueryWrapper.in(\"username\",userNames);\n\t\tList<UserAccountInfo> loginUsers = new ArrayList<>();\n\t\tList<SysUser> sysUsers = userMapper.selectList(queryWrapper);\n\t\tfor (SysUser user:sysUsers) {\n\t\t\tUserAccountInfo loginUser=new UserAccountInfo();\n\t\t\tBeanUtils.copyProperties(user, loginUser);\n\t\t\tloginUsers.add(loginUser);\n\t\t}\n\t\treturn loginUsers;\n\t}\n\n\t@Override\n\tpublic List<JSONObject> queryUserBySuperQuery(String superQuery,String matchType) {\n\t\tList<JSONObject> result=new ArrayList<>();\n\t\tMap<String, String[]> parameterMap=new HashMap<>();\n\t\tparameterMap.put(\"superQueryMatchType\",new String[]{matchType});\n\t\tparameterMap.put(\"superQueryParams\",new String[]{superQuery});\n\t\tSysUser sysUser=new SysUser();\n\t\tQueryWrapper<SysUser> queryWrapper = QueryGenerator.initQueryWrapper(sysUser, parameterMap);\n\t\tList<SysUser> list= sysUserService.list(queryWrapper);\n\t\tif(ObjectUtils.isNotEmpty(list)){\n\t\t\n\t\t\t// 代码逻辑说明: QQYUN-5326【简流】获取组织人员 单/多 筛选条件 没有部门筛选\n\t\t\tString departKey = \"depart\";\n\t\t\tQueryCondition departCondition = null;\n\t\t\ttry {\n\t\t\t\tString temp = URLDecoder.decode(superQuery, \"UTF-8\");\n\t\t\t\tList<QueryCondition> conditions = JSON.parseArray(temp, QueryCondition.class);\n\t\t\t\tfor(QueryCondition condition: conditions){\n\t\t\t\t\tif(departKey.equals(condition.getField())){\n\t\t\t\t\t\tdepartCondition = condition;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (UnsupportedEncodingException e) {\n\t\t\t\tlog.error(\"查询用户信息，查询条件json转化失败\", e);\n\t\t\t}\n\t\t\t\n\t\t\tfor (SysUser user : list) {\n\t\t\t\tJSONObject userJson = JSONObject.parseObject(JSONObject.toJSONString(user));\n\t\t\t\tList<SysDepart> departList = sysDepartService.queryDepartsByUsername(user.getUsername());\n\t\t\t\tList<String> departIds = null;\n\t\t\t\tif(departList!=null && departList.size()>0){\n\t\t\t\t\tdepartIds = departList.stream().map(i->i.getId()).collect(Collectors.toList());\n\t\t\t\t\tList<String> departNames = departList.stream().map(i->i.getDepartName()).collect(Collectors.toList());\n\t\t\t\t\tuserJson.put(departKey, oConvertUtils.list2JSONArray(departIds));\n\t\t\t\t\tuserJson.put(departKey+\"_dictText\", String.join(\",\", departNames));\n\t\t\t\t}\n\t\t\t\tboolean flag = getDepartConditionResult(departCondition, departIds);\n\t\t\t\tif(flag){\n\t\t\t\t\tresult.add(userJson);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 判断用户的部门是否满足条件 -等于/不等于/在--中/不在--中/为空/不为空\n\t * QQYUN-5326【简流】获取组织人员 单/多 筛选条件 没有部门筛选\n\t * @param departCondition\n\t * @param departIds\n\t * @return\n\t */\n\tprivate boolean getDepartConditionResult(QueryCondition departCondition, List<String> departIds){\n\t\tif(departCondition == null){\n\t\t\treturn true;\n\t\t}\n\t\tQueryRuleEnum rule = QueryRuleEnum.getByValue(departCondition.getRule());\n\t\tString conditionVal = departCondition.getVal();\n\t\tif(rule == QueryRuleEnum.EMPTY){\n\t\t\tif(departIds==null || departIds.size()==0){\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}else if (rule == QueryRuleEnum.NOT_EMPTY){\n\t\t\tif(departIds!=null && departIds.size()>0){\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}else{\n\t\t\tif(oConvertUtils.isEmpty(conditionVal)){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif(departIds==null || departIds.size()==0){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tList<String> conditionList;\n\t\t\tif(conditionVal.startsWith(\"[\") && conditionVal.endsWith(\"]\")){\n\t\t\t\tconditionList = JSONArray.parseArray(conditionVal, String.class);\n\t\t\t}else{\n\t\t\t\tconditionList = new ArrayList<String>(Arrays.asList(conditionVal.split(\",\")));\n\t\t\t}\n\t\t\tif(rule == QueryRuleEnum.EQ){\n\t\t\t\tif(oConvertUtils.isEqList(conditionList, departIds)){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}else if(rule == QueryRuleEnum.NE){\n\t\t\t\tif(!oConvertUtils.isEqList(conditionList, departIds)){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}else if(rule == QueryRuleEnum.IN){\n\t\t\t\tif(oConvertUtils.isInList(departIds, conditionList)){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}else if(rule == QueryRuleEnum.NOT_IN){\n\t\t\t\tif(!oConvertUtils.isInList(departIds, conditionList)){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t@Override\n\tpublic JSONObject queryUserById(String id) {\n\t\tQueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();\n\t\tqueryWrapper.lambda().eq(true, SysUser::getId, id);\n\t\tSysUser sysUser = sysUserService.getOne(queryWrapper);\n\t\tif (ObjectUtils.isNotEmpty(sysUser)) {\n\t\t\treturn JSONObject.parseObject(JSONObject.toJSONString(sysUser));\n\t\t}\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic List<JSONObject> queryDeptBySuperQuery(String superQuery,String matchType) {\n\t\tList<JSONObject> result=new ArrayList<>();\n\t\tMap<String, String[]> parameterMap=new HashMap<>();\n\t\tparameterMap.put(\"superQueryMatchType\",new String[]{matchType});\n\t\tparameterMap.put(\"superQueryParams\",new String[]{superQuery});\n\t\tSysDepart sysDepart=new SysDepart();\n\t\tQueryWrapper<SysDepart> queryWrapper = QueryGenerator.initQueryWrapper(sysDepart, parameterMap);\n\t\tList<SysDepart> list= sysDepartService.list(queryWrapper);\n\t\tif(ObjectUtils.isNotEmpty(list)){\n\t\t\tfor (SysDepart depart: list) {\n\t\t\t\tresult.add(JSONObject.parseObject(JSONObject.toJSONString(depart)));\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic List<JSONObject> queryRoleBySuperQuery(String superQuery,String matchType) {\n\t\tList<JSONObject> result=new ArrayList<>();\n\t\tMap<String, String[]> parameterMap=new HashMap<>();\n\t\tparameterMap.put(\"superQueryMatchType\",new String[]{matchType});\n\t\tparameterMap.put(\"superQueryParams\",new String[]{superQuery});\n\t\tSysRole sysDepart=new SysRole();\n\t\tQueryWrapper<SysRole> queryWrapper = QueryGenerator.initQueryWrapper(sysDepart, parameterMap);\n\t\tList<SysRole> list= sysRoleService.list(queryWrapper);\n\t\tif(ObjectUtils.isNotEmpty(list)){\n\t\t\tfor (SysRole role: list) {\n\t\t\t\tresult.add(JSONObject.parseObject(JSONObject.toJSONString(role)));\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic List<String> selectUserIdByTenantId(String tenantId) {\n\t\tQueryWrapper queryWrapper=new QueryWrapper<SysUserTenant>();\n\t\tqueryWrapper.select(\"user_id\");\n\t\tqueryWrapper.eq(\"tenant_id\",tenantId);\n\t\treturn sysUserTenantService.listObjs(queryWrapper,e->e.toString());\n\t}\n\n\t@Override\n\tpublic SysDepartModel selectAllById(String id) {\n\t\tSysDepart sysDepart = sysDepartService.getById(id);\n\t\tSysDepartModel sysDepartModel = new SysDepartModel();\n\t\tBeanUtils.copyProperties(sysDepart,sysDepartModel);\n\t\treturn sysDepartModel;\n\t}\n\n\t@Override\n\tpublic List<String> queryDeptUsersByUserId(String userId) {\n\t\tList<String> userIds = new ArrayList<>();\n\t\tList<SysUserDepart> userDepartList = sysUserDepartService.list(new QueryWrapper<SysUserDepart>().eq(\"user_id\",userId));\n\t\tif(userDepartList != null){\n\t\t\t//查找所属公司\n\t\t\tString orgCodes = \"\";\n\t\t\tStringBuilder orgCodesBuilder = new StringBuilder();\n            orgCodesBuilder.append(orgCodes);\n\t\t\tfor(SysUserDepart userDepart : userDepartList){\n\t\t\t\t//查询所属公司编码\n\t\t\t\tSysDepart depart = sysDepartService.getById(userDepart.getDepId());\n\t\t\t\tint length = YouBianCodeUtil.ZHANWEI_LENGTH;\n\t\t\t\tString compyOrgCode = \"\";\n\t\t\t\tif(depart != null && depart.getOrgCode() != null){\n\t\t\t\t\tcompyOrgCode = depart.getOrgCode().substring(0,length);\n\t\t\t\t\tif(orgCodes.indexOf(compyOrgCode) == -1){\n                        orgCodesBuilder.append(SymbolConstant.COMMA).append(compyOrgCode);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n            orgCodes = orgCodesBuilder.toString();\n\t\t\tif(oConvertUtils.isNotEmpty(orgCodes)){\n\t\t\t\torgCodes = orgCodes.substring(1);\n\t\t\t\tList<String> listIds = departMapper.getSubDepIdsByOrgCodes(orgCodes.split(\",\"));\n\t\t\t\tList<SysUserDepart> userList = sysUserDepartService.list(new QueryWrapper<SysUserDepart>().in(\"dep_id\",listIds));\n\t\t\t\tfor(SysUserDepart userDepart : userList){\n\t\t\t\t\tif(!userIds.contains(userDepart.getUserId())){\n\t\t\t\t\t\tuserIds.add(userDepart.getUserId());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn userIds;\n\t}\n\n\t/**\n\t * 查询用户拥有的角色集合\n\t * @param username\n\t * @return\n\t */\n\t@Override\n\tpublic Set<String> getUserRoleSet(String username) {\n\t\t// 查询用户拥有的角色集合\n\t\tList<String> roles = sysUserRoleMapper.getRoleByUserName(username);\n\t\tlog.debug(\"-------通过数据库读取用户拥有的角色Rules------username： \" + username + \",Roles size: \" + (roles == null ? 0 : roles.size()));\n\t\treturn new HashSet<>(roles);\n\t}\n\t\n\t\n\t/**\n\t * 查询用户拥有的角色集合\n\t * @param useId\n\t * @return\n\t */\n\t@Override\n\tpublic Set<String> getUserRoleSetById(String useId) {\n\t\t// 查询用户拥有的角色集合\n\t\tList<String> roles = sysUserRoleMapper.getRoleCodeByUserId(useId);\n\t\tlog.debug(\"-------通过数据库读取用户拥有的角色Rules------useId： \" + useId + \",Roles size: \" + (roles == null ? 0 : roles.size()));\n\t\treturn new HashSet<>(roles);\n\t}\n\n\t/**\n\t * 查询用户拥有的权限集合\n\t * @param userId\n\t * @return\n\t */\n\t@Override\n\tpublic Set<String> getUserPermissionSet(String userId) {\n\t\tSet<String> permissionSet = new HashSet<>();\n\t\tList<SysPermission> permissionList = sysPermissionMapper.queryByUser(userId);\n\t\t//================= begin 开启租户的时候 如果没有test角色，默认加入test角色================\n\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\tif (permissionList == null) {\n\t\t\t\tpermissionList = new ArrayList<>();\n\t\t\t}\n\t\t\tList<SysPermission> testRoleList = sysPermissionMapper.queryPermissionByTestRoleId();\n\t\t\tpermissionList.addAll(testRoleList);\n\t\t}\n\t\t//================= end 开启租户的时候 如果没有test角色，默认加入test角色================\n\t\tfor (SysPermission po : permissionList) {\n//\t\t\t// TODO URL规则有问题？\n//\t\t\tif (oConvertUtils.isNotEmpty(po.getUrl())) {\n//\t\t\t\tpermissionSet.add(po.getUrl());\n//\t\t\t}\n\t\t\tif (oConvertUtils.isNotEmpty(po.getPerms())) {\n\t\t\t\tpermissionSet.add(po.getPerms());\n\t\t\t}\n\t\t}\n\t\tlog.debug(\"-------通过数据库读取用户拥有的权限Perms------userId： \"+ userId+\",Perms size: \"+ (permissionSet==null?0:permissionSet.size()) );\n\t\treturn permissionSet;\n\t}\n\n\t/**\n\t * 判断online菜单是否有权限\n\t * @param onlineAuthDTO\n\t * @return\n\t */\n\t@Override\n\tpublic boolean hasOnlineAuth(OnlineAuthDTO onlineAuthDTO) {\n\t\tString username = onlineAuthDTO.getUsername();\n\t\tList<String> possibleUrl = onlineAuthDTO.getPossibleUrl();\n\t\tString onlineFormUrl = onlineAuthDTO.getOnlineFormUrl();\n\t\t//查询菜单\n\t\tLambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>();\n\t\tquery.eq(SysPermission::getDelFlag, 0);\n\t\tquery.in(SysPermission::getUrl, possibleUrl);\n\t\tList<SysPermission> permissionList = sysPermissionMapper.selectList(query);\n\t\tif (permissionList == null || permissionList.size() == 0) {\n\t\t\t//没有配置菜单 找online表单菜单地址\n\t\t\tSysPermission sysPermission = new SysPermission();\n\t\t\tsysPermission.setUrl(onlineFormUrl);\n\t\t\tint count = sysPermissionMapper.queryCountByUsername(username, sysPermission);\n\t\t\tif(count<=0){\n\t\t\t\t// 代码逻辑说明: [QQYUN-7992]【online】工单申请下的online表单，未配置online表单开发菜单，操作报错无权限------------\n\t\t\t\tsysPermission.setUrl(onlineAuthDTO.getOnlineWorkOrderUrl());\n\t\t\t\tcount = sysPermissionMapper.queryCountByUsername(username, sysPermission);\n\t\t\t\tif(count<=0) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t//找到菜单了\n\t\t\tboolean has = false;\n\t\t\tfor (SysPermission p : permissionList) {\n\t\t\t\tint count = sysPermissionMapper.queryCountByUsername(username, p);\n\t\t\t\thas = has || (count>0);\n\t\t\t}\n\t\t\tif (!has) {\n\t\t\t\t//没有配置菜单 找online表单菜单地址\n\t\t\t\tSysPermission sysPermission = new SysPermission();\n\t\t\t\tsysPermission.setUrl(onlineFormUrl);\n\t\t\t\tint count = sysPermissionMapper.queryCountByUsername(username, sysPermission);\n\t\t\t\tif (count <= 0) {\n\t\t\t\t\t// 代码逻辑说明: [QQYUN-7992]【online】工单申请下的online表单，未配置online表单开发菜单，操作报错无权限------------\n\t\t\t\t\tsysPermission.setUrl(onlineAuthDTO.getOnlineWorkOrderUrl());\n\t\t\t\t\tcount = sysPermissionMapper.queryCountByUsername(username, sysPermission);\n\t\t\t\t\tif (count > 0) {\n\t\t\t\t\t\thas = true;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\thas = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn has;\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * 查询用户拥有的角色集合 common api 里面的接口实现\n\t * @param username\n\t * @return\n\t */\n\t@Override\n\tpublic Set<String> queryUserRoles(String username) {\n\t\treturn getUserRoleSet(username);\n\t}\n\n\t@Override\n\tpublic Set<String> queryUserRolesById(String userId) {\n\t\treturn getUserRoleSetById(userId);\n\t}\n\n\t/**\n\t * 查询用户拥有的权限集合 common api 里面的接口实现\n\t * @param userId\n\t * @return\n\t */\n\t@Override\n\tpublic Set<String> queryUserAuths(String userId) {\n\t\treturn getUserPermissionSet(userId);\n\t}\n\n\t/**\n\t * 36根据多个用户账号(逗号分隔)，查询返回多个用户信息\n\t * @param usernames\n\t * @return\n\t */\n\t@Override\n\tpublic List<JSONObject> queryUsersByUsernames(String usernames) {\n\t\tLambdaQueryWrapper<SysUser> queryWrapper =  new LambdaQueryWrapper<>();\n\t\tqueryWrapper.in(SysUser::getUsername,usernames.split(\",\"));\n\t\treturn JSON.parseArray(JSON.toJSONString(userMapper.selectList(queryWrapper))).toJavaList(JSONObject.class);\n\t}\n\n\t@Override\n\tpublic List<JSONObject> queryUsersByIds(String ids) {\n\t\tLambdaQueryWrapper<SysUser> queryWrapper =  new LambdaQueryWrapper<>();\n\t\tqueryWrapper.in(SysUser::getId,ids.split(\",\"));\n\t\treturn JSON.parseArray(JSON.toJSONString(userMapper.selectList(queryWrapper))).toJavaList(JSONObject.class);\n\t}\n\n\t/**\n\t * 37根据多个部门编码(逗号分隔)，查询返回多个部门信息\n\t * @param orgCodes\n\t * @return\n\t */\n\t@Override\n\tpublic List<JSONObject> queryDepartsByOrgcodes(String orgCodes) {\n\t\tLambdaQueryWrapper<SysDepart> queryWrapper =  new LambdaQueryWrapper<>();\n\t\tqueryWrapper.in(SysDepart::getOrgCode,orgCodes.split(\",\"));\n\t\treturn JSON.parseArray(JSON.toJSONString(sysDepartService.list(queryWrapper))).toJavaList(JSONObject.class);\n\t}\n\n\t@Override\n\tpublic List<JSONObject> queryDepartsByIds(String ids) {\n\t\tLambdaQueryWrapper<SysDepart> queryWrapper =  new LambdaQueryWrapper<>();\n\t\tqueryWrapper.in(SysDepart::getId,ids.split(\",\"));\n\t\treturn JSON.parseArray(JSON.toJSONString(sysDepartService.list(queryWrapper))).toJavaList(JSONObject.class);\n\t}\n\n\t/**\n     * 发消息\n     *\n     * @param fromUser\n     * @param toUser\n     * @param title\n     * @param msgContent\n     * @param setMsgCategory\n     * @param noticeType\n     */\n\tprivate void sendSysAnnouncement(String fromUser, String toUser, String title, String msgContent, String setMsgCategory, String noticeType) {\n\t\tSysAnnouncement announcement = new SysAnnouncement();\n\t\tannouncement.setTitile(title);\n\t\tannouncement.setMsgContent(msgContent);\n\t\tannouncement.setSender(fromUser);\n\t\tannouncement.setPriority(CommonConstant.PRIORITY_M);\n\t\tannouncement.setMsgType(CommonConstant.MSG_TYPE_UESR);\n\t\tannouncement.setSendStatus(CommonConstant.HAS_SEND);\n\t\tannouncement.setSendTime(new Date());\n\t\tannouncement.setMsgCategory(setMsgCategory);\n\t\tannouncement.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0));\n\t\t// 代码逻辑说明: [QQYUN-12999]系统通知，系统通知时间更新，但是排到下面了\n\t\tannouncement.setIzTop(CommonConstant.IZ_TOP_0);\n\t\tif(oConvertUtils.isEmpty(noticeType)){\n            noticeType = NoticeTypeEnum.NOTICE_TYPE_SYSTEM.getValue();\n        }\n        announcement.setNoticeType(noticeType);\n\t\tsysAnnouncementMapper.insert(announcement);\n\t\t// 2.插入用户通告阅读标记表记录\n\t\tString userId = toUser;\n\t\tString[] userIds = userId.split(\",\");\n\t\tString anntId = announcement.getId();\n\t\tfor(int i=0;i<userIds.length;i++) {\n\t\t\tif(oConvertUtils.isNotEmpty(userIds[i])) {\n\t\t\t\tSysUser sysUser = userMapper.getUserByName(userIds[i]);\n\t\t\t\tif(sysUser==null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tSysAnnouncementSend announcementSend = new SysAnnouncementSend();\n\t\t\t\tannouncementSend.setAnntId(anntId);\n\t\t\t\tannouncementSend.setUserId(sysUser.getId());\n\t\t\t\tannouncementSend.setReadFlag(CommonConstant.NO_READ_FLAG);\n\t\t\t\tsysAnnouncementSendMapper.insert(announcementSend);\n\t\t\t\tJSONObject obj = new JSONObject();\n\t\t\t\tobj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);\n\t\t\t\tobj.put(WebsocketConst.MSG_USER_ID, sysUser.getId());\n\t\t\t\tobj.put(WebsocketConst.MSG_ID, announcement.getId());\n\t\t\t\tobj.put(WebsocketConst.MSG_TXT, announcement.getTitile());\n\t\t\t\tobj.put(CommonConstant.NOTICE_TYPE, noticeType);\n\t\t\t\twebSocket.sendMessage(sysUser.getId(), obj.toJSONString());\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * 发消息 带业务参数\n\t * @param fromUser\n\t * @param toUser\n\t * @param title\n\t * @param msgContent\n\t * @param setMsgCategory\n\t * @param busType\n\t * @param busId\n\t * @param noticeType 消息类型,for [JHHB-136]【vue3】协同工作系统消息需要添加一个类型\n\t */\n\tprivate void sendBusAnnouncement(String fromUser, String toUser, String title, String msgContent, String setMsgCategory, String busType, String busId, String noticeType) {\n\t\tSysAnnouncement announcement = new SysAnnouncement();\n\t\tannouncement.setTitile(title);\n\t\tannouncement.setMsgContent(msgContent);\n\t\tannouncement.setSender(fromUser);\n\t\tannouncement.setPriority(CommonConstant.PRIORITY_M);\n\t\tannouncement.setMsgType(CommonConstant.MSG_TYPE_UESR);\n\t\tannouncement.setSendStatus(CommonConstant.HAS_SEND);\n\t\tannouncement.setSendTime(new Date());\n\t\tannouncement.setMsgCategory(setMsgCategory);\n\t\tannouncement.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0));\n\t\tannouncement.setBusId(busId);\n\t\tannouncement.setBusType(busType);\n\n\t\t// 代码逻辑说明: busType为空时，报错\n\t\tif(oConvertUtils.isNotEmpty(busType)){\n\t\t\tannouncement.setOpenType(SysAnnmentTypeEnum.getByType(busType).getOpenType());\n\t\t\tannouncement.setOpenPage(SysAnnmentTypeEnum.getByType(busType).getOpenPage());\n\t\t}\n\n\t\t// 代码逻辑说明: [JHHB-136]【vue3】协同工作系统消息需要添加一个类型------------\n\t\tif(oConvertUtils.isEmpty(noticeType)){\n\t\t\tnoticeType = NoticeTypeEnum.NOTICE_TYPE_FLOW.getValue();\n\t\t}\n\t\tannouncement.setNoticeType(noticeType);\n\t\t// 代码逻辑说明: [QQYUN-12999]系统通知，系统通知时间更新，但是排到下面了\n\t\tannouncement.setIzTop(CommonConstant.IZ_TOP_0);\n\t\tsysAnnouncementMapper.insert(announcement);\n\t\t// 2.插入用户通告阅读标记表记录\n\t\tString userId = toUser;\n\t\tString[] userIds = userId.split(\",\");\n\t\tString anntId = announcement.getId();\n\t\tfor(int i=0;i<userIds.length;i++) {\n\t\t\tif(oConvertUtils.isNotEmpty(userIds[i])) {\n\t\t\t\tSysUser sysUser = userMapper.getUserByName(userIds[i]);\n\t\t\t\tif(sysUser==null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tSysAnnouncementSend announcementSend = new SysAnnouncementSend();\n\t\t\t\tannouncementSend.setAnntId(anntId);\n\t\t\t\tannouncementSend.setUserId(sysUser.getId());\n\t\t\t\tannouncementSend.setReadFlag(CommonConstant.NO_READ_FLAG);\n\t\t\t\tsysAnnouncementSendMapper.insert(announcementSend);\n\t\t\t\tJSONObject obj = new JSONObject();\n\t\t\t\tobj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);\n\t\t\t\tobj.put(WebsocketConst.MSG_USER_ID, sysUser.getId());\n\t\t\t\tobj.put(WebsocketConst.MSG_ID, announcement.getId());\n\t\t\t\tobj.put(WebsocketConst.MSG_TXT, announcement.getTitile());\n\t\t\t\tobj.put(CommonConstant.NOTICE_TYPE, NoticeTypeEnum.NOTICE_TYPE_FLOW.getValue());\n\t\t\t\twebSocket.sendMessage(sysUser.getId(), obj.toJSONString());\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * 发送邮件消息\n\t * @param email\n\t * @param title\n\t * @param content\n\t */\n\t@Override\n\tpublic void sendEmailMsg(String email, String title, String content) {\n\t\t\tEmailSendMsgHandle emailHandle=new EmailSendMsgHandle();\n\t\t\temailHandle.sendMsg(email, title, content);\n\t}\n\t/**\n\t * 发送短信消息\n\t * @param phone 手机号\n\t * @param param 模版参数\n\t * @param dySmsEnum 短信模版\n\t */\n\t@Override\n\tpublic void sendSmsMsg(String phone, JSONObject param,DySmsEnum dySmsEnum) {\n        try {\n\t\t\tlog.info(\" 发送短信消息 phone = {}\", phone);\n\t\t\tlog.info(\" 发送短信消息 param = {}\", param);\n            DySmsHelper.sendSms(phone, param,dySmsEnum);\n        } catch (ClientException e) {\n\t\t\te.printStackTrace();\n        }\n    }\n\n\t/**\n\t * 发送html模版邮件消息\n\t * @param email\n\t * @param title\n\t * @param emailTemplateEnum\n\t * @param params\n\t */\n\t@Override\n\tpublic void sendHtmlTemplateEmail(String email, String title, EmailTemplateEnum emailTemplateEnum,JSONObject params) {\n\t\tEmailSendMsgHandle emailHandle=new EmailSendMsgHandle();\n\t\tString htmlText=\"\";\n\t\ttry{\n\t\t\t//获取模板实例\n\t\t\tConfiguration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);\n\t\t\t//设置模板文件的目录\n\t\t\tString url = emailTemplateEnum.getUrl();\n\t\t\tconfiguration.setClassForTemplateLoading(this.getClass(), url.substring(0,url.lastIndexOf(\"/\")));\n\t\t\tconfiguration.setDefaultEncoding(\"UTF-8\");\n\t\t\t//空值报错设置\n\t\t\tconfiguration.setClassicCompatible(true);\n\t\t\tconfiguration.setNewBuiltinClassResolver(TemplateClassResolver.SAFER_RESOLVER);\n\t\t\tTemplate template = configuration.getTemplate(url.substring(url.lastIndexOf(\"/\")));\n\t\t\t//解析模板文件\n\t\t\thtmlText= FreeMarkerTemplateUtils.processTemplateIntoString(template, params);\n\t\t}catch(IOException e){\n\t\t\te.printStackTrace();\n\t\t}catch(TemplateException e){\n\t\t\te.printStackTrace();\n\t\t}catch(Exception e){\n\t\t\te.printStackTrace();\n\t\t}\n\n\t\tlog.debug(\"Email Html Text：{}\", htmlText);\n\t\temailHandle.sendMsg(email, title, htmlText);\n\t}\n\n\t/**\n\t * 获取公司下级部门和所有用户id信息\n\t * @param orgCode\n\t * @return\n\t */\n\t@Override\n\tpublic List<Map> getDeptUserByOrgCode(String orgCode) {\n\t\t//1.获取公司信息\n\t\tSysDepart comp=sysDepartService.queryCompByOrgCode(orgCode);\n\t\tif(comp!=null){\n\t\t\t//2.获取公司下级部门\n\t\t\tList<SysDepart> departs=sysDepartService.queryDeptByPid(comp.getId());\n\t\t\t//3.获取部门下的人员信息\n\t\t\t List<Map> list=new ArrayList();\n\t\t\t //4.处理部门和下级用户数据\n\t\t\tfor (SysDepart dept:departs) {\n\t\t\t\tMap map=new HashMap(5);\n\t\t\t\t//部门名称\n\t\t\t\tString departName = dept.getDepartName();\n\t\t\t\t//根据部门编码获取下级部门id\n\t\t\t\tList<String> listIds = departMapper.getSubDepIdsByDepId(dept.getId());\n\t\t\t\t//根据下级部门ids获取下级部门的所有用户\n\t\t\t\tList<SysUserDepart> userList = sysUserDepartService.list(new QueryWrapper<SysUserDepart>().in(\"dep_id\",listIds));\n\t\t\t\tList<String> userIds = new ArrayList<>();\n\t\t\t\tfor(SysUserDepart userDepart : userList){\n\t\t\t\t\tif(!userIds.contains(userDepart.getUserId())){\n\t\t\t\t\t\tuserIds.add(userDepart.getUserId());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmap.put(\"name\",departName);\n\t\t\t\tmap.put(\"ids\",userIds);\n\t\t\t\tlist.add(map);\n\t\t\t}\n\t\t\treturn list;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * 查询分类字典翻译\n\t *\n\t * @param ids 分类字典表id\n\t * @return\n\t */\n\t@Override\n\tpublic List<String> loadCategoryDictItem(String ids) {\n\t\treturn sysCategoryService.loadDictItem(ids, false);\n\t}\n\n\t@Override\n\tpublic List<String> loadCategoryDictItemByNames(String names, boolean delNotExist) {\n\t\treturn sysCategoryService.loadDictItemByNames(names, delNotExist);\n\t}\n\n\t/**\n\t * 根据字典code加载字典text\n\t *\n\t * @param dictCode 顺序：tableName,text,code\n\t * @param keys     要查询的key\n\t * @return\n\t */\n\t@Override\n\tpublic List<String> loadDictItem(String dictCode, String keys) {\n\t\tString[] params = dictCode.split(\",\");\n\t\treturn sysDictService.queryTableDictByKeys(params[0], params[1], params[2], keys, false);\n\t}\n\n\t@Override\n\tpublic Map<String, String> copyLowAppDict(String originalAppId, String appId, String tenantId) {\n\t\tMap<String, String> dictCodeMapping = new HashMap<String, String>();\n\t\tList<SysDictVo> ls = sysDictService.getDictListByLowAppId(originalAppId);\n\t\tfor (SysDictVo vo : ls) {\n\t\t\tvo.setId(null);\n\t\t\tvo.setLowAppId(appId);\n\t\t\tvo.setTenantId(oConvertUtils.getInt(tenantId, null));\n\t\t\tString newDictCode = sysDictService.addDictByLowAppId(vo);\n\t\t\tdictCodeMapping.put(vo.getDictCode(), newDictCode);\n\t\t}\n\n\t\tlog.info(\" --- 批量复制应用下的字典到新租户下 —— 原应用ID:{}，新应用ID:{}，新租户ID：{}，字典个数：{} --- \", originalAppId, appId, tenantId, dictCodeMapping.size());\n\t\treturn dictCodeMapping;\n\t}\n\n\t/**\n\t * 根据字典code查询字典项\n\t *\n\t * @param dictCode 顺序：tableName,text,code\n\t * @param dictCode 要查询的key\n\t * @return\n\t */\n\t@Override\n\tpublic List<DictModel> getDictItems(String dictCode) {\n\t\tList<DictModel> ls = sysDictService.getDictItems(dictCode);\n\t\tif (ls == null) {\n\t\t\tls = new ArrayList<>();\n\t\t}\n\t\treturn ls;\n\t}\n\n\t/**\n\t * 根据多个字典code查询多个字典项\n\t *\n\t * @param dictCodeList\n\t * @return key = dictCode ； value=对应的字典项\n\t */\n\t@Override\n\tpublic Map<String, List<DictModel>> getManyDictItems(List<String> dictCodeList) {\n\t\treturn sysDictService.queryDictItemsByCodeList(dictCodeList);\n\t}\n\n\t/**\n\t * 【下拉搜索】\n\t * 大数据量的字典表 走异步加载，即前端输入内容过滤数据\n\t *\n\t * @param dictCode 字典code格式：table,text,code\n\t * @param keyword  过滤关键字\n\t * @return\n\t */\n\t@Override\n\tpublic List<DictModel> loadDictItemByKeyword(String dictCode, String keyword, Integer pageNo, Integer pageSize) {\n\t\treturn sysDictService.loadDict(dictCode, keyword,pageNo, pageSize);\n\t}\n\n\t@Override\n\tpublic Map<String, List<DictModel>> translateManyDict(String dictCodes, String keys) {\n\t\tList<String> dictCodeList = Arrays.asList(dictCodes.split(\",\"));\n\t\tList<String> values = Arrays.asList(keys.split(\",\"));\n\t\t// 代码逻辑说明: [issues/#5643]解决分布式下表字典跨库无法查询问题------------\n\t\treturn sysDictService.queryManyDictByKeys(dictCodeList, values);\n\t}\n\n\t// 代码逻辑说明: [issues/#5643]解决分布式下表字典跨库无法查询问题------------\n\t@Override\n\tpublic List<DictModel> translateDictFromTableByKeys(String table, String text, String code, String keys, String dataSource) {\n\t\treturn sysDictService.queryTableDictTextByKeys(table, text, code, Arrays.asList(keys.split(\",\")), dataSource);\n\t}\n\n\t//-------------------------------------流程节点发送模板消息-----------------------------------------------\n\t@Autowired\n\tprivate QywxSendMsgHandle qywxSendMsgHandle;\n\n\t@Autowired\n\tprivate SystemSendMsgHandle systemSendMsgHandle;\n\n\t@Autowired\n\tprivate EmailSendMsgHandle emailSendMsgHandle;\n\n\t@Autowired\n\tprivate DdSendMsgHandle ddSendMsgHandle;\n\n\t@Override\n\tpublic void sendTemplateMessage(MessageDTO message) {\n\t\tString messageType = message.getType();\n\t\tlog.debug(\" 【万能通用】推送消息 messageType = {}\", messageType);\n\t\t// 代码逻辑说明: 将模板解析代码移至消息发送, 而不是调用的地方\n\t\tString templateCode = message.getTemplateCode();\n\t\tif(oConvertUtils.isNotEmpty(templateCode)){\n\t\t\tSysMessageTemplate templateEntity = getTemplateEntity(templateCode);\n\t\t\tboolean isMarkdown = CommonConstant.MSG_TEMPLATE_TYPE_MD.equals(templateEntity.getTemplateType());\n\t\t\tString content = templateEntity.getTemplateContent();\n\t\t\tif(oConvertUtils.isNotEmpty(content) && null!=message.getData()){\n\t\t\t\tcontent = FreemarkerParseFactory.parseTemplateContent(content, message.getData(), isMarkdown);\n\t\t\t}\n\t\t\tmessage.setIsMarkdown(isMarkdown);\n\t\t\tmessage.setContent(content);\n\t\t}\n\t\tif(oConvertUtils.isEmpty(message.getContent())){\n\t\t\tlog.error(\"发送消息失败,消息内容为空！\");\n\t\t\tthrow new JeecgBootException(\"发送消息失败,消息内容为空！\");\n\t\t}\n\n\t\tif(MessageTypeEnum.XT.getType().equals(messageType)){\n\t\t\tif (message.isMarkdown()) {\n\t\t\t\t// 系统消息要解析Markdown\n\t\t\t\tmessage.setContent(HTMLUtils.parseMarkdown(message.getContent()));\n\t\t\t}\n\t\t\tsystemSendMsgHandle.sendMessage(message);\n\t\t}else if(MessageTypeEnum.YJ.getType().equals(messageType)){\n\t\t\tif (message.isMarkdown()) {\n\t\t\t\t// 邮件消息要解析Markdown\n\t\t\t\tmessage.setContent(HTMLUtils.parseMarkdown(message.getContent()));\n\t\t\t}\n\t\t\t// 代码逻辑说明: 【QQYUN-8523】敲敲云发邮件通知，不稳定---\n\t\t\tif(message.getIsTimeJob() != null && message.getIsTimeJob()){\n\t\t\t\temailSendMsgHandle.sendEmailMessage(message);\n\t\t\t}else{\n\t\t\t\temailSendMsgHandle.sendMessage(message);\n\t\t\t}\n\t\t}else if(MessageTypeEnum.DD.getType().equals(messageType)){\n\t\t\tddSendMsgHandle.sendMessage(message);\n\t\t}else if(MessageTypeEnum.QYWX.getType().equals(messageType)){\n\t\t\tqywxSendMsgHandle.sendMessage(message);\n\t\t}\n\t}\n\n\t@Override\n\tpublic String getTemplateContent(String code) {\n\t\tList<SysMessageTemplate> list = sysMessageTemplateService.selectByCode(code);\n\t\tif(list==null || list.size()==0){\n\t\t\treturn null;\n\t\t}\n\t\treturn list.get(0).getTemplateContent();\n\t}\n\n\t/**\n\t * 获取模板内容，解析markdown\n\t *\n\t * @param code\n\t * @return\n\t */\n\tpublic SysMessageTemplate getTemplateEntity(String code) {\n\t\tList<SysMessageTemplate> list = sysMessageTemplateService.selectByCode(code);\n\t\tif (list == null || list.size() == 0) {\n\t\t\treturn null;\n\t\t}\n\t\treturn list.get(0);\n\t}\n\n\t//-------------------------------------流程节点发送模板消息-----------------------------------------------\n\n\t@Override\n\tpublic void saveDataLog(DataLogDTO dataLogDto) {\n\t\ttry {\n\t\t\tSysDataLog entity = new SysDataLog();\n\t\t\tentity.setDataTable(dataLogDto.getTableName());\n\t\t\tentity.setDataId(dataLogDto.getDataId());\n\t\t\tentity.setDataContent(dataLogDto.getContent());\n\t\t\tentity.setType(dataLogDto.getType());\n\t\t\tentity.setDataVersion(\"1\");\n\t\t\tif (oConvertUtils.isNotEmpty(dataLogDto.getCreateName())) {\n\t\t\t\tentity.setCreateBy(dataLogDto.getCreateName());\n\t\t\t} else {\n\t\t\t\tentity.autoSetCreateName();\n\t\t\t}\n\t\t\tsysDataLogService.save(entity);\n\t\t} catch (Exception e) {\n\t\t\tlog.warn(e.getMessage(), e);\n\t\t\t//e.printStackTrace();\n\t\t}\n\t}\n\n    @Override\n    public void updateAvatar(LoginUser loginUser) {\n\t\tSysUser sysUser = new SysUser();\n\t\t// 创建UpdateWrapper对象\n\t\tUpdateWrapper<SysUser> updateWrapper = new UpdateWrapper<>();\n\t\tupdateWrapper.eq(\"id\", loginUser.getId()); // 设置更新条件\n\t\tsysUser.setAvatar(loginUser.getAvatar()); // 设置要更新的字段\n\t\tsysUserService.update(sysUser, updateWrapper);\n    }\n\n\t@Override\n\tpublic void sendAppChatSocket(String userId) {\n\t\tJSONObject obj = new JSONObject();\n\t\tobj.put(WebsocketConst.MSG_CMD, WebsocketConst.MSG_CHAT);\n\t\tobj.put(WebsocketConst.MSG_USER_ID, userId);\n\t\twebSocket.sendMessage(userId, obj.toJSONString());\n\t}\n\n\t@Override\n\tpublic String getRoleCodeById(String id) {\n\t\tSysRole role = roleMapper.selectById(id);\n\t\tif(role!=null){\n\t\t\treturn role.getRoleCode();\n\t\t}\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic List<DictModel> queryRoleDictByCode(String roleCodes) {\n\t\tif (oConvertUtils.isEmpty(roleCodes)) {\n\t\t\treturn new ArrayList<>();\n\t\t}\n\t\tList<String> codeList = Arrays.asList(roleCodes.split(\",\"));\n\t\tLambdaQueryWrapper<SysRole> queryWrapper = new LambdaQueryWrapper<>();\n\t\tqueryWrapper.in(SysRole::getRoleCode, codeList);\n\t\tList<SysRole> list = roleMapper.selectList(queryWrapper);\n\t\t// 转换成SysRoleVo\n\t\treturn list.stream().map(sysRole -> {\n\t\t\tDictModel model = new DictModel();\n\t\t\tmodel.setText(sysRole.getRoleName());\n\t\t\tmodel.setValue(sysRole.getRoleCode());\n\t\t\treturn model;\n\t\t}).collect(Collectors.toList());\n\t}\n\n\t@Override\n\tpublic List<String> queryUserIdsByDeptIds(List<String> deptIds) {\n\t\tQueryWrapper<SysUserDepart> queryWrapper = new QueryWrapper<>();\n\t\tqueryWrapper.lambda().select(SysUserDepart::getUserId).in(true,SysUserDepart::getDepId,deptIds);\n\t\treturn sysUserDepartService.listObjs(queryWrapper,e->e.toString());\n\t}\n\n\t@Override\n\tpublic List<String> queryUsernameByIds(List<String> userIds) {\n\t\treturn userMapper.getUsernameByIds(userIds);\n\t}\n\n    @Override\n    public List<String> queryUserIdsByCascadeDeptIds(List<String> deptIds) {\n        Set<String> userIds = new HashSet<>();\n        List<SysDepart> departs = sysDepartService.list(Wrappers.lambdaQuery(SysDepart.class)\n                .select(SysDepart::getOrgCode)\n                .in(SysDepart::getId, deptIds));\n        departs.forEach(depart -> {\n            List<SysUser> sysUsers = sysUserDepartService.queryUserByDepCode(depart.getOrgCode(), null);\n            if(oConvertUtils.isObjectNotEmpty(sysUsers)){\n                userIds.addAll(sysUsers.stream().map(SysUser::getId).collect(Collectors.toSet()));\n            }\n        });\n        return new ArrayList<>(userIds);\n    }\n\n    @Override\n\tpublic List<String> queryUserAccountsByDeptIds(List<String> deptIds) {\n\t\treturn departMapper.queryUserAccountByDepartIds(deptIds);\n\t}\n\n\t@Override\n\tpublic List<String> queryUserIdsByRoleds(List<String> roleCodes) {\n\t\tLambdaQueryWrapper<SysRole> query = new LambdaQueryWrapper<SysRole>()\n\t\t\t\t.in(SysRole::getRoleCode, roleCodes);\n\t\tList<SysRole> roleList = sysRoleService.list(query);\n\t\tif(roleList!=null && roleList.size()>0){\n\t\t\tList<String> idList = roleList.stream().map(role->role.getId()).collect(Collectors.toList());\n\t\t\tQueryWrapper<SysUserRole> queryWrapper = new QueryWrapper<>();\n\t\t\tqueryWrapper.lambda().select(SysUserRole::getUserId).in(true,SysUserRole::getRoleId, idList);\n\t\t\treturn sysUserRoleService.listObjs(queryWrapper,e->e.toString());\n\t\t}\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic List<String> queryUserIdsByDeptPostIds(List<String> deptPostIds) {\n\t\t// 1.查询兼职岗位对应的用户\n\t\tQueryWrapper<SysUserDepPost> queryWrapper = new QueryWrapper<>();\n\t\tqueryWrapper.lambda().select(SysUserDepPost::getUserId).in(true,SysUserDepPost::getDepId,deptPostIds);\n\t\tList<String> otherDepartPostUserIds = sysUserDepPostService.listObjs(queryWrapper,e->e.toString());\n\t\tlog.info(\"兼职岗位对应的用户 otherDepartPostUserIds = \"+ JSON.toJSONString(otherDepartPostUserIds));\n\n\t\t// 2.查询主岗位对应的用户\n\t\tQueryWrapper<SysUser> mainQueryWrapper = new QueryWrapper<>();\n\t\tmainQueryWrapper.lambda().select(SysUser::getId).eq(SysUser::getStatus,Integer.parseInt(CommonConstant.STATUS_1)).eq(SysUser::getDelFlag,CommonConstant.DEL_FLAG_0)\n\t\t\t\t.and(wrapper -> wrapper.in(SysUser::getMainDepPostId, deptPostIds));\n\t\tList<String> mainDepartPostUserIds =  sysUserService.listObjs(mainQueryWrapper,e->e.toString());\n\t\tlog.info(\"主岗位对应的用户 mainDepartPostUserIds = \"+ JSON.toJSONString(mainDepartPostUserIds));\n\t\t\n\t\t// 3.合并主岗位和兼职岗位对应的用户\n\t\tSet<String> userIdSet = new HashSet<>();\n\t\tif (otherDepartPostUserIds != null && !otherDepartPostUserIds.isEmpty()) {\n\t\t\tuserIdSet.addAll(otherDepartPostUserIds);\n\t\t}\n\t\tif (mainDepartPostUserIds != null && !mainDepartPostUserIds.isEmpty()) {\n\t\t\tuserIdSet.addAll(mainDepartPostUserIds);\n\t\t}\n\t\tlog.info(\"主岗位和兼职岗位，对应的用户 userIdSet = \"+ JSON.toJSONString(userIdSet));\n\t\treturn new ArrayList<>(userIdSet);\n\t}\n\n\t@Override\n\tpublic List<String> queryUsernameByDepartPositIds(List<String> deptPostIds) {\n\t\t// 1.查询兼职岗位对应的用户\n\t\tQueryWrapper<SysUserDepPost> otherQueryWrapper = new QueryWrapper<>();\n\t\totherQueryWrapper.lambda().select(SysUserDepPost::getUserId).in(true, SysUserDepPost::getDepId, deptPostIds);\n\t\tList<String> otherUserIds = sysUserDepPostService.listObjs(otherQueryWrapper, e -> e.toString());\n\t\tlog.info(\"兼职岗位对应的用户 otherUserIds = {}，size = {}\" + JSON.toJSONString(otherUserIds), oConvertUtils.getCollectionSize(otherUserIds));\n\n\t\t// 2.查询主岗位和兼职岗位，对应的用户\n\t\tQueryWrapper<SysUser> mainQueryWrapper = new QueryWrapper<>();\n\t\tmainQueryWrapper.lambda().select(SysUser::getUsername).eq(SysUser::getStatus, Integer.parseInt(CommonConstant.STATUS_1)).eq(SysUser::getDelFlag, CommonConstant.DEL_FLAG_0)\n\t\t\t\t.and(wrapper -> wrapper\n\t\t\t\t\t\t.in(SysUser::getMainDepPostId, deptPostIds)\n\t\t\t\t\t\t.or()\n\t\t\t\t\t\t.in(otherUserIds != null && !otherUserIds.isEmpty(), SysUser::getId, otherUserIds)\n\t\t\t\t);\n\t\tList<String> allUsernames = sysUserService.listObjs(mainQueryWrapper, e -> e.toString());\n\t\tlog.info(\"主岗位和兼职岗位，对应的用户账号 allUsernames = {}，size = {}\" ,JSON.toJSONString(allUsernames), oConvertUtils.getCollectionSize(allUsernames));\n\t\treturn allUsernames;\n\t}\n\n\t@Override\n\tpublic List<String> queryUserIdsByPositionIds(List<String> positionIds) {\n\t\tQueryWrapper<SysUserPosition> queryWrapper = new QueryWrapper<>();\n\t\tqueryWrapper.lambda().select(SysUserPosition::getUserId).in(true,SysUserPosition::getPositionId,positionIds);\n\t\treturn sysUserPositionService.listObjs(queryWrapper,e->e.toString());\n\t}\n\t\n\t/**\n\t * 获取带参数的报表地址，因为多个参数可能顺序会变，所以要将参数顺序重排，获取所有可能的地址集合\n\t * 如下：参数顺序调整使用in查询，就能查询出菜单数据\n\t *  /online/cgreport/1624393012494286850?name=1&age=16\n\t *  /online/cgreport/1624393012494286850?age=16&name=1\n\t * @param path\n\t * @return\n\t */\n\tprivate List<String> getOnlinePossiblePaths(String path){\n\t\tList<String> result = new ArrayList<>();\n\t\tlog.debug(\" path = \"+ path);\n\t\tif (path.indexOf(\"?\") >= 0 && (path.contains(\"/online/cgreport/\") || path.contains(\"/online/cgformList/\") || path.contains(\"/online/graphreport/\"))) {\n\t\t\t//包含?说明有多个参数\n\t\t\tString[] pathArray = path.split(\"\\\\?\");\n\t\t\tif(oConvertUtils.isNotEmpty(pathArray[1])){\n\t\t\t\tString[] params = pathArray[1].split(\"&\");\n\t\t\t\tif(params.length==1){\n\t\t\t\t\tresult.add(path);\n\t\t\t\t}else{\n\t\t\t\t\tresult = anm(pathArray[0], Arrays.asList(params));\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tresult.add(path);\n\t\t\t}\n\t\t}else{\n\t\t\tresult.add(path);\n\t\t}\n\t\treturn result;\n\t}\n\n\n\t/**\n\t * 获取数组元素的 不同排列 a(n,m)\n\t * @param list\n\t * @return\n\t */\n\tprivate List<String> anm(String baseUrl, List<String> list) {\n\t\tint len = list.size();\n\t\tint[] destArray = new int[len];\n\t\tfor (int i = 0; i < len; i++) {\n\t\t\tdestArray[i] = i;\n\t\t}\n\t\tint[] temp = new int[len];\n\t\tList<String> result = new ArrayList<>();\n\t\twhile (temp[0] < len) {\n\t\t\ttemp[temp.length - 1]++;\n\t\t\tfor (int i = temp.length - 1; i > 0; i--) {\n\t\t\t\tif (temp[i] == len) {\n\t\t\t\t\ttemp[i] = 0;\n\t\t\t\t\ttemp[i - 1]++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tint[] tt = temp.clone();\n\t\t\tArrays.sort(tt);\n\t\t\tif (!Arrays.equals(tt, destArray)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tString str = \"\";\n\t\t\tfor (int i = 0; i < len; i++) {\n\t\t\t\tif(i>0){\n\t\t\t\t\tstr += \"&\";\n\t\t\t\t}\n\t\t\t\tstr += list.get(temp[i]);\n\t\t\t}\n\t\t\tresult.add(baseUrl+\"?\"+str);\n\t\t}\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic List<String> getUserAccountsByDepCode(String orgCode) {\n\t\treturn userMapper.getUserAccountsByDepCode(orgCode);\n\t}\n\n\t@Override\n\tpublic boolean dictTableWhiteListCheckBySql(String selectSql) {\n\t\treturn dictTableWhiteListHandler.isPassBySql(selectSql);\n\t}\n\n\t@Override\n\tpublic boolean dictTableWhiteListCheckByDict(String tableOrDictCode, String... fields) {\n\t\tif (fields == null || fields.length == 0) {\n\t\t\treturn dictTableWhiteListHandler.isPassByDict(tableOrDictCode);\n\t\t} else {\n\t\t\treturn dictTableWhiteListHandler.isPassByDict(tableOrDictCode, fields);\n\t\t}\n\t}\n\n\t/**\n\t * 自动发布流程\n\t * @param dataId\n\t * @param currentUserName\n\t */\n\t@Override\n\tpublic void announcementAutoRelease(String dataId, String currentUserName) {\n\t\t//根据ID查询通知公告\n\t\tSysAnnouncement sysAnnouncement = sysAnnouncementService.getById(dataId);\n\t\t//流程通过后自动发布通告\n\t\tsysAnnouncement.setSendStatus(CommonSendStatus.PUBLISHED_STATUS_1);\n\t\tsysAnnouncement.setSendTime(new Date());\n\t\tsysAnnouncement.setSender(currentUserName);\n\t\tboolean ok = sysAnnouncementService.updateById(sysAnnouncement);\n\t\t//推送通知消息\n\t\tif(ok) {\n\t\t\tif(sysAnnouncement.getMsgType().equals(CommonConstant.MSG_TYPE_ALL)) {\n\t\t\t\t// 补全公告和用户之前的关系\n\t\t\t\tsysAnnouncementService.batchInsertSysAnnouncementSend(sysAnnouncement.getId(), sysAnnouncement.getTenantId());\n\n\t\t\t\t// 推送websocket通知\n\t\t\t\tJSONObject obj = new JSONObject();\n\t\t\t\tobj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_TOPIC);\n\t\t\t\tobj.put(WebsocketConst.MSG_ID, sysAnnouncement.getId());\n\t\t\t\tobj.put(WebsocketConst.MSG_TXT, sysAnnouncement.getTitile());\n\t\t\t\twebSocket.sendMessage(obj.toJSONString());\n\t\t\t}else {\n\t\t\t\t// 2.插入用户通告阅读标记表记录\n\t\t\t\tString userId = sysAnnouncement.getUserIds();\n\t\t\t\tString[] userIds = userId.substring(0, (userId.length()-1)).split(\",\");\n\t\t\t\tJSONObject obj = new JSONObject();\n\t\t\t\tobj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER);\n\t\t\t\tobj.put(WebsocketConst.MSG_ID, sysAnnouncement.getId());\n\t\t\t\tobj.put(WebsocketConst.MSG_TXT, sysAnnouncement.getTitile());\n\t\t\t\twebSocket.sendMessage(userIds, obj.toJSONString());\n\t\t\t}\n\t\t\ttry {\n\t\t\t\t// 同步企业微信、钉钉的消息通知\n\t\t\t\tResponse<String> dtResponse = dingtalkService.sendActionCardMessage(sysAnnouncement, null, true);\n\t\t\t\twechatEnterpriseService.sendTextCardMessage(sysAnnouncement, null,true);\n\n\t\t\t\tif (dtResponse != null && dtResponse.isSuccess()) {\n\t\t\t\t\tString taskId = dtResponse.getResult();\n\t\t\t\t\tsysAnnouncement.setDtTaskId(taskId);\n\t\t\t\t\tsysAnnouncementService.updateById(sysAnnouncement);\n\t\t\t\t}\n\t\t\t} catch (Exception e) {\n\t\t\t\tlog.error(\"同步发送第三方APP消息失败：\", e);\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tpublic SysDepartModel queryCompByOrgCode(String orgCode) {\n\t\tAssertUtils.assertNotEmpty(\"请输入部门编码\",orgCode);\n\t\tSysDepart comp = sysDepartService.queryCompByOrgCode(orgCode);\n\t\tif(comp == null) {\n\t\t\tlog.error(\"未查询到对应的公司信息\");\n\t\t\treturn null;\n\t\t}\n\t\tSysDepartModel respData = new SysDepartModel();\n\t\tBeanUtils.copyProperties(comp, respData);\n\t\treturn respData;\n\t}\n\n    /**\n     * 根据部门编码和层次查询上级公司\n     * \n     * @param orgCode 部门编码\n     * @param level 可以传空 默认为1 最小值为1\n     * @return\n     */\n    @Override\n    public SysDepartModel queryCompByOrgCodeAndLevel(String orgCode, Integer level) {\n        if (null == level || 0 == level) {\n            level = 1;\n        }\n        int codeNum = YouBianCodeUtil.ZHANWEI_LENGTH;\n\n        //先判断父级code\n        String parendCode = \"\";\n        if (orgCode.length() > codeNum) {\n            parendCode = orgCode.substring(0, codeNum);\n        } else {\n            return null;\n        }\n        //根据部门编码查询公司和子公司的数据\n        List<String> categoryList = new ArrayList<>();\n        categoryList.add(DepartCategoryEnum.DEPART_CATEGORY_COMPANY.getValue());\n        categoryList.add(DepartCategoryEnum.DEPART_CATEGORY_SUB_COMPANY.getValue());\n        LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<>();\n        query.like(SysDepart::getOrgCode, parendCode);\n        query.in(SysDepart::getOrgCategory, categoryList);\n        query.orderByAsc(SysDepart::getOrgType);\n        List<SysDepart> sysDepartList = sysDepartService.list(query);\n        if (!CollectionUtils.isEmpty(sysDepartList)) {\n            //获取上级公司\n            SysDepart depart = getParentCompanyByOrgCode(orgCode, sysDepartList, level, 1);\n            if(depart == null){\n                depart = sysDepartList.get(0);\n            }\n            SysDepartModel respData = new SysDepartModel();\n            BeanUtils.copyProperties(depart, respData);\n            return respData;\n        }\n        return null;\n    }\n\n    @Override\n    public Object runAiragFlow(AiragFlowDTO airagFlowDTO) {\n        if(oConvertUtils.isEmpty(airagFlowDTO.getFlowId())) {\n            throw new JeecgBootException(\"流程ID不能为空\");\n        }\n        Result<Object> o = (Result<Object>)airagFlowService.runFlow(airagFlowDTO);\n        return o.getResult();\n    }\n\n\t@Override\n\tpublic SseEmitter runAiragFlowStream(AiragFlowDTO airagFlowDTO) {\n\t\tif (oConvertUtils.isEmpty(airagFlowDTO.getFlowId())) {\n\t\t\tthrow new JeecgBootException(\"流程ID不能为空\");\n\t\t}\n\t\treturn airagFlowService.runFlowStream(airagFlowDTO);\n\t}\n\n\t/**\n\t * uniPush推送消息给APP用户\n\t * @param pushMessageDTO\n\t */\n\t@Override\n\tpublic void uniPushMsgToUser(PushMessageDTO pushMessageDTO) {\n\t\tlog.info(\"UniappPush推送URL:{}\", jeecgPushUrl);\n\t\ttry {\n\t\t\tif(oConvertUtils.isEmpty(jeecgPushUrl) || \"''\".equals(jeecgPushUrl) || \"??\".equals(jeecgPushUrl) ){\n\t\t\t\tlog.warn(\"yml配置项: jeecg.unicloud.pushUrl 未设置，APP消息UniPush推送功能未启用！\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// 获取推送的用户信息\n\t\t\tList<String> usernames = pushMessageDTO.getUsernames();\n\t\t\tList<String> userIds = pushMessageDTO.getUserIds();\n\n\t\t\t// 构建clientIds\n\t\t\tList<String> clientIds = getClientIds(usernames, userIds);\n\n\t\t\t// 构建请求参数\n\t\t\tMap<String, Object> requestBody = new HashMap<>();\n\t\t\trequestBody.put(\"title\", pushMessageDTO.getTitle());\n\t\t\trequestBody.put(\"content\", pushMessageDTO.getContent());\n\t\t\trequestBody.put(\"data\", pushMessageDTO.getPayload());\n\t\t\trequestBody.put(\"request_id\", String.valueOf(System.currentTimeMillis()));\n\n\t\t\tHttpHeaders headers = new HttpHeaders();\n\t\t\theaders.setContentType(MediaType.APPLICATION_JSON);\n\n\t\t\t// 全用户推送不需要clientIds，指定用户推送需要设置clientIds\n\t\t\tboolean isAllUserPush = CommonConstant.MSG_TYPE_ALL.equals(pushMessageDTO.getPushType());\n\t\t\tif (!isAllUserPush) {\n\t\t\t\tif (CollectionUtils.isEmpty(clientIds)) {\n\t\t\t\t\tlog.warn(\"UniPush消息推送clientIds为空\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\trequestBody.put(\"cids\", clientIds);\n\t\t\t}\n\n\t\t\t// 统一推送逻辑\n\t\t\tHttpEntity<Map<String, Object>> request = new HttpEntity<>(requestBody, headers);\n\t\t\tResponseEntity<Map> response = restTemplate.postForEntity(jeecgPushUrl, request, Map.class);\n\n\t\t\t// 统一处理响应\n\t\t\tString pushType = isAllUserPush ? \"全用户\" : \"单用户\";\n\t\t\tif (response.getStatusCode().is2xxSuccessful()) {\n\t\t\t\tlog.info(\"{} UniPush消息推送成功 返回response:{}\", pushType, response.getBody());\n\t\t\t} else {\n\t\t\t\tlog.error(\"{} UniPush消息推送失败 返回response:{}\", pushType, response.getBody());\n\t\t\t}\n\t\t} catch (RestClientException e) {\n\t\t\tlog.warn(\"UniAPP 消息推送异常：\"+ e.getMessage(), e);\n\t\t}\n\t}\n\t/**\n\t * 根据用户名或用户ID获取clientIds\n\t */\n\tprivate List<String> getClientIds(List<String> usernames, List<String> userIds) {\n\t\tif (!CollectionUtils.isEmpty(usernames)) {\n\t\t\treturn extractClientIds(this.queryUsersByUsernames(String.join(\",\", usernames)));\n\t\t} else if (!CollectionUtils.isEmpty(userIds)) {\n\t\t\treturn extractClientIds(this.queryUsersByIds(String.join(\",\", userIds)));\n\t\t}\n\t\treturn Collections.emptyList();\n\t}\n\n\t/**\n\t * 从用户信息中提取clientIds\n\t */\n\tprivate List<String> extractClientIds(List<JSONObject> users) {\n\t\treturn users.stream()\n\t\t\t\t.map(user -> user.getString(\"clientId\"))\n\t\t\t\t.filter(clientId -> oConvertUtils.isNotEmpty(clientId) && !clientId.trim().isEmpty())\n\t\t\t\t.collect(Collectors.toList());\n\t}\n\n\t/**\n     * 根据orgCode找上级\n     * \n     * @param orgCode\n     * @param sysDepartList\n     * @param level 指定那第几级 从下往上\n     * @param nowLevel\n     * @return\n     */\n    public SysDepart getParentCompanyByOrgCode(String orgCode,List<SysDepart> sysDepartList, int level, int nowLevel) {\n        //获取上一级公司的编码\n        String code = this.getPrefix(orgCode);\n        if(oConvertUtils.isEmpty(code)) {\n            return null;\n        }\n        List<SysDepart> list = sysDepartList.stream().filter(sysDepart -> sysDepart.getOrgCode().equals(code)).toList();\n        //判断去上级的级别\n        if(!CollectionUtils.isEmpty(list) && nowLevel == level) {\n            return list.get(0);\n        } else {\n            if(!CollectionUtils.isEmpty(list)) {\n                nowLevel++;\n            }\n            return getParentCompanyByOrgCode(code, sysDepartList, level, nowLevel);\n        }\n    }\n\n    /**\n     * 根据指定值获取编码前缀（每级固定YouBianCodeUtil.ZHANWEI_LENGTH位）\n     *\n     * @param fullCode 完整编码（如\"A01A01A01\"）\n     * @return 提取后的前缀编码（如\"A01A01\"）\n     */\n    private String getPrefix(String fullCode) {\n        if(fullCode.length() < YouBianCodeUtil.ZHANWEI_LENGTH){\n            return \"\";\n        }\n        // 计算总层级数,根据ZHANWEI_LENGTH\n        int totalLevels = fullCode.length() / YouBianCodeUtil.ZHANWEI_LENGTH;\n        int keepLevels = totalLevels - 1;\n        // 计算需要截取的长度（保留层级数 × YouBianCodeUtil.ZHANWEI_LENGTH）\n        int prefixLength = keepLevels * YouBianCodeUtil.ZHANWEI_LENGTH;\n        return prefixLength == 0 ? \"\" : fullCode.substring(0, prefixLength);\n    }\n\n    /**\n     * 根据部门code或部门id获取部门名称(当前和上级部门)\n     *\n     * @param orgCode 部门编码\n     * @param depId 部门id\n     * @return String 部门名称\n     */\n    @Override\n    public String getDepartPathNameByOrgCode(String orgCode, String depId) {\n        return sysDepartService.getDepartPathNameByOrgCode(orgCode, depId);\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysCategoryServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;\nimport com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.jeecg.common.constant.FillRuleConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.util.FillRuleUtil;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysCategory;\nimport org.jeecg.modules.system.mapper.SysCategoryMapper;\nimport org.jeecg.modules.system.model.TreeSelectModel;\nimport org.jeecg.modules.system.service.ISysCategoryService;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport java.util.*;\nimport java.util.stream.Collectors;\n\n/**\n * @Description: 分类字典\n * @Author: jeecg-boot\n * @Date:   2019-05-29\n * @Version: V1.0\n */\n@Service\npublic class SysCategoryServiceImpl extends ServiceImpl<SysCategoryMapper, SysCategory> implements ISysCategoryService {\n\n\t@Override\n\tpublic void addSysCategory(SysCategory sysCategory) {\n\t\tString categoryCode = \"\";\n\t\tString categoryPid = ISysCategoryService.ROOT_PID_VALUE;\n\t\tString parentCode = null;\n\t\tif(oConvertUtils.isNotEmpty(sysCategory.getPid())){\n\t\t\tcategoryPid = sysCategory.getPid();\n\n\t\t\t//PID 不是根节点 说明需要设置父节点 hasChild 为1\n\t\t\tif(!ISysCategoryService.ROOT_PID_VALUE.equals(categoryPid)){\n\t\t\t\tSysCategory parent = baseMapper.selectById(categoryPid);\n\t\t\t\tparentCode = parent.getCode();\n\t\t\t\tif(parent!=null && !ISysCategoryService.HAS_CHILD.equals(parent.getHasChild())){\n\t\t\t\t\tparent.setHasChild(ISysCategoryService.HAS_CHILD);\n\t\t\t\t\tbaseMapper.updateById(parent);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// 代码逻辑说明: 分类字典编码规则生成器做成公用配置\n\t\tJSONObject formData = new JSONObject();\n\t\tformData.put(\"pid\",categoryPid);\n\t\tcategoryCode = (String) FillRuleUtil.executeRule(FillRuleConstant.CATEGORY,formData);\n\t\tsysCategory.setCode(categoryCode);\n\t\tsysCategory.setPid(categoryPid);\n\t\tbaseMapper.insert(sysCategory);\n\t}\n\t\n\t@Override\n\tpublic void updateSysCategory(SysCategory sysCategory) {\n\t\tif(oConvertUtils.isEmpty(sysCategory.getPid())){\n\t\t\tsysCategory.setPid(ISysCategoryService.ROOT_PID_VALUE);\n\t\t}else{\n\t\t\t//如果当前节点父ID不为空 则设置父节点的hasChild 为1\n\t\t\tSysCategory parent = baseMapper.selectById(sysCategory.getPid());\n\t\t\tif(parent!=null && !ISysCategoryService.HAS_CHILD.equals(parent.getHasChild())){\n\t\t\t\tparent.setHasChild(ISysCategoryService.HAS_CHILD);\n\t\t\t\tbaseMapper.updateById(parent);\n\t\t\t}\n\t\t}\n\t\tbaseMapper.updateById(sysCategory);\n\t}\n\n\t@Override\n\tpublic List<TreeSelectModel> queryListByCode(String pcode) throws JeecgBootException{\n\t\tString pid = ROOT_PID_VALUE;\n\t\tif(oConvertUtils.isNotEmpty(pcode)) {\n\t\t\tList<SysCategory> list = baseMapper.selectList(new LambdaQueryWrapper<SysCategory>().eq(SysCategory::getCode, pcode));\n\t\t\tif(list==null || list.size() ==0) {\n\t\t\t\tthrow new JeecgBootException(\"该编码【\"+pcode+\"】不存在，请核实!\");\n\t\t\t}\n\t\t\tif(list.size()>1) {\n\t\t\t\tthrow new JeecgBootException(\"该编码【\"+pcode+\"】存在多个，请核实!\");\n\t\t\t}\n\t\t\tpid = list.get(0).getId();\n\t\t}\n\t\treturn baseMapper.queryListByPid(pid,null);\n\t}\n\n\t@Override\n\tpublic List<TreeSelectModel> queryListByPid(String pid) {\n\t\tif(oConvertUtils.isEmpty(pid)) {\n\t\t\tpid = ROOT_PID_VALUE;\n\t\t}\n\t\treturn baseMapper.queryListByPid(pid,null);\n\t}\n\n\t@Override\n\tpublic List<TreeSelectModel> queryListByPid(String pid, Map<String, String> condition) {\n\t\tif(oConvertUtils.isEmpty(pid)) {\n\t\t\tpid = ROOT_PID_VALUE;\n\t\t}\n\t\treturn baseMapper.queryListByPid(pid,condition);\n\t}\n\n\t@Override\n\tpublic String queryIdByCode(String code) {\n\t\treturn baseMapper.queryIdByCode(code);\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void deleteSysCategory(String ids) {\n\t\tString allIds = this.queryTreeChildIds(ids);\n\t\tString pids = this.queryTreePids(ids);\n\t\t//1.删除时将节点下所有子节点一并删除\n\t\tthis.baseMapper.deleteBatchIds(Arrays.asList(allIds.split(\",\")));\n\t\t//2.将父节点中已经没有下级的节点，修改为没有子节点\n\t\tif(oConvertUtils.isNotEmpty(pids)){\n\t\t\tLambdaUpdateWrapper<SysCategory> updateWrapper = new UpdateWrapper<SysCategory>()\n\t\t\t\t\t.lambda()\n\t\t\t\t\t.in(SysCategory::getId,Arrays.asList(pids.split(\",\")))\n\t\t\t\t\t.set(SysCategory::getHasChild,\"0\");\n\t\t\tthis.update(updateWrapper);\n\t\t}\n\t}\n\n\t/**\n\t * 查询节点下所有子节点\n\t * @param ids\n\t * @return\n\t */\n\tprivate String queryTreeChildIds(String ids) {\n\t\t//获取id数组\n\t\tString[] idArr = ids.split(\",\");\n\t\tStringBuffer sb = new StringBuffer();\n\t\tfor (String pidVal : idArr) {\n\t\t\tif(pidVal != null){\n\t\t\t\tif(!sb.toString().contains(pidVal)){\n\t\t\t\t\tif(sb.toString().length() > 0){\n\t\t\t\t\t\tsb.append(\",\");\n\t\t\t\t\t}\n\t\t\t\t\tsb.append(pidVal);\n\t\t\t\t\tthis.getTreeChildIds(pidVal,sb);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn sb.toString();\n\t}\n\n\t/**\n\t * 查询需修改标识的父节点ids\n\t * @param ids\n\t * @return\n\t */\n\tprivate String queryTreePids(String ids) {\n\t\tStringBuffer sb = new StringBuffer();\n\t\t//获取id数组\n\t\tString[] idArr = ids.split(\",\");\n\t\tfor (String id : idArr) {\n\t\t\tif(id != null){\n\t\t\t\tSysCategory category = this.baseMapper.selectById(id);\n\t\t\t\t//根据id查询pid值\n\t\t\t\tString metaPid = category.getPid();\n\t\t\t\t//查询此节点上一级是否还有其他子节点\n\t\t\t\tLambdaQueryWrapper<SysCategory> queryWrapper = new LambdaQueryWrapper<>();\n\t\t\t\tqueryWrapper.eq(SysCategory::getPid,metaPid);\n\t\t\t\tqueryWrapper.notIn(SysCategory::getId,Arrays.asList(idArr));\n\t\t\t\tList<SysCategory> dataList = this.baseMapper.selectList(queryWrapper);\n                boolean flag = (dataList == null || dataList.size()==0) && !Arrays.asList(idArr).contains(metaPid)\n                        && !sb.toString().contains(metaPid);\n                if(flag){\n\t\t\t\t\t//如果当前节点原本有子节点 现在木有了，更新状态\n\t\t\t\t\tsb.append(metaPid).append(\",\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(sb.toString().endsWith(SymbolConstant.COMMA)){\n\t\t\tsb = sb.deleteCharAt(sb.length() - 1);\n\t\t}\n\t\treturn sb.toString();\n\t}\n\n\t/**\n\t * 递归 根据父id获取子节点id\n\t * @param pidVal\n\t * @param sb\n\t * @return\n\t */\n\tprivate StringBuffer getTreeChildIds(String pidVal,StringBuffer sb){\n\t\tLambdaQueryWrapper<SysCategory> queryWrapper = new LambdaQueryWrapper<>();\n\t\tqueryWrapper.eq(SysCategory::getPid,pidVal);\n\t\tList<SysCategory> dataList = baseMapper.selectList(queryWrapper);\n\t\tif(dataList != null && dataList.size()>0){\n\t\t\tfor(SysCategory category : dataList) {\n\t\t\t\tif(!sb.toString().contains(category.getId())){\n\t\t\t\t\tsb.append(\",\").append(category.getId());\n\t\t\t\t}\n\t\t\t\tthis.getTreeChildIds(category.getId(), sb);\n\t\t\t}\n\t\t}\n\t\treturn sb;\n\t}\n\n\t@Override\n\tpublic List<String> loadDictItem(String ids) {\n\t\treturn this.loadDictItem(ids, true);\n\t}\n\n\t@Override\n\tpublic List<String> loadDictItem(String ids, boolean delNotExist) {\n\t\tString[] idArray = ids.split(\",\");\n\t\tLambdaQueryWrapper<SysCategory> query = new LambdaQueryWrapper<>();\n\t\tquery.in(SysCategory::getId, Arrays.asList(idArray));\n\t\t// 查询数据\n\t\tList<SysCategory> list = super.list(query);\n\t\t// 取出name并返回\n\t\tList<String> textList;\n\t\t// 代码逻辑说明: 新增delNotExist参数，设为false不删除数据库里不存在的key ----\n\t\tif (delNotExist) {\n\t\t\ttextList = list.stream().map(SysCategory::getName).collect(Collectors.toList());\n\t\t} else {\n\t\t\ttextList = new ArrayList<>();\n\t\t\tfor (String id : idArray) {\n\t\t\t\tList<SysCategory> res = list.stream().filter(i -> id.equals(i.getId())).collect(Collectors.toList());\n\t\t\t\ttextList.add(res.size() > 0 ? res.get(0).getName() : id);\n\t\t\t}\n\t\t}\n\t\treturn textList;\n\t}\n\n\t@Override\n\tpublic List<String> loadDictItemByNames(String names, boolean delNotExist) {\n\t\tList<String> nameList = Arrays.asList(names.split(SymbolConstant.COMMA));\n\t\tLambdaQueryWrapper<SysCategory> query = new LambdaQueryWrapper<>();\n\t\tquery.select(SysCategory::getId, SysCategory::getName);\n\t\tquery.in(SysCategory::getName, nameList);\n\t\t// 查询数据\n\t\tList<SysCategory> list = super.list(query);\n\t\t// 取出id并返回\n\t\treturn nameList.stream().map(name -> {\n\t\t\tSysCategory res = list.stream().filter(i -> name.equals(i.getName())).findFirst().orElse(null);\n\t\t\tif (res == null) {\n\t\t\t\treturn delNotExist ? null : name;\n\t\t\t}\n\t\t\treturn res.getId();\n\t\t}).filter(Objects::nonNull).collect(Collectors.toList());\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysCheckRuleServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.apache.commons.lang.StringUtils;\nimport org.jeecg.modules.system.entity.SysCheckRule;\nimport org.jeecg.modules.system.mapper.SysCheckRuleMapper;\nimport org.jeecg.modules.system.service.ISysCheckRuleService;\nimport org.springframework.stereotype.Service;\n\nimport java.util.regex.Pattern;\n\n/**\n * @Description: 编码校验规则\n * @Author: jeecg-boot\n * @Date: 2020-02-04\n * @Version: V1.0\n */\n@Service\npublic class SysCheckRuleServiceImpl extends ServiceImpl<SysCheckRuleMapper, SysCheckRule> implements ISysCheckRuleService {\n\n    /**\n     * 位数特殊符号，用于检查整个值，而不是裁剪某一段\n     */\n    private final String CHECK_ALL_SYMBOL = \"*\";\n\n    @Override\n    public SysCheckRule getByCode(String ruleCode) {\n        LambdaQueryWrapper<SysCheckRule> queryWrapper = new LambdaQueryWrapper<>();\n        queryWrapper.eq(SysCheckRule::getRuleCode, ruleCode);\n        return super.getOne(queryWrapper);\n    }\n\n    /**\n     * 通过用户设定的自定义校验规则校验传入的值\n     *\n     * @param checkRule\n     * @param value\n     * @return 返回 null代表通过校验，否则就是返回的错误提示文本\n     */\n    @Override\n    public JSONObject checkValue(SysCheckRule checkRule, String value) {\n        if (checkRule != null && StringUtils.isNotBlank(value)) {\n            String ruleJson = checkRule.getRuleJson();\n            if (StringUtils.isNotBlank(ruleJson)) {\n                // 开始截取的下标，根据规则的顺序递增，但是 * 号不计入递增范围\n                int beginIndex = 0;\n                JSONArray rules = JSON.parseArray(ruleJson);\n                for (int i = 0; i < rules.size(); i++) {\n                    JSONObject result = new JSONObject();\n                    JSONObject rule = rules.getJSONObject(i);\n                    // 位数\n                    String digits = rule.getString(\"digits\");\n                    result.put(\"digits\", digits);\n                    // 验证规则\n                    String pattern = rule.getString(\"pattern\");\n                    result.put(\"pattern\", pattern);\n                    // 未通过时的提示文本\n                    String message = rule.getString(\"message\");\n                    result.put(\"message\", message);\n\n                    // 根据用户设定的区间，截取字符串进行验证\n                    String checkValue;\n                    // 是否检查整个值而不截取\n                    if (CHECK_ALL_SYMBOL.equals(digits)) {\n                        checkValue = value;\n                    } else {\n                        int num = Integer.parseInt(digits);\n                        int endIndex = beginIndex + num;\n                        // 如果结束下标大于给定的值的长度，则取到最后一位\n                        endIndex = endIndex > value.length() ? value.length() : endIndex;\n                        // 如果开始下标大于结束下标，则说明用户还尚未输入到该位置，直接赋空值\n                        if (beginIndex > endIndex) {\n                            checkValue = \"\";\n                        } else {\n                            checkValue = value.substring(beginIndex, endIndex);\n                        }\n                        result.put(\"beginIndex\", beginIndex);\n                        result.put(\"endIndex\", endIndex);\n                        beginIndex += num;\n                    }\n                    result.put(\"checkValue\", checkValue);\n                    boolean passed = Pattern.matches(pattern, checkValue);\n                    result.put(\"passed\", passed);\n                    // 如果没有通过校验就返回错误信息\n                    if (!passed) {\n                        return result;\n                    }\n                }\n            }\n        }\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysCommentServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.IdWorker;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.jeecg.common.api.dto.message.MessageDTO;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.constant.enums.FileTypeEnum;\nimport org.jeecg.common.constant.enums.MessageTypeEnum;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.api.ISysBaseAPI;\nimport org.jeecg.common.system.vo.SysFilesModel;\nimport org.jeecg.common.util.CommonUtils;\nimport org.jeecg.common.util.RedisUtil;\nimport org.jeecg.common.util.filter.SsrfFileTypeFilter;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysComment;\nimport org.jeecg.modules.system.entity.SysFormFile;\nimport org.jeecg.modules.system.mapper.SysCommentMapper;\nimport org.jeecg.modules.system.mapper.SysFormFileMapper;\nimport org.jeecg.modules.system.service.ISysCommentService;\nimport org.jeecg.modules.system.vo.SysCommentFileVo;\nimport org.jeecg.modules.system.vo.SysCommentVO;\nimport org.jeecg.modules.system.vo.UserAvatar;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\nimport org.springframework.util.FileCopyUtils;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.*;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\n/**\n * @Description: 系统评论回复表\n * @Author: jeecg-boot\n * @Date: 2022-07-19\n * @Version: V1.0\n */\n@Service\npublic class SysCommentServiceImpl extends ServiceImpl<SysCommentMapper, SysComment> implements ISysCommentService {\n\n    @Autowired\n    private ISysBaseAPI sysBaseApi;\n\n    @Autowired\n    private SysFormFileMapper sysFormFileMapper;\n\n//    @Autowired\n//    private IEasyOaBaseApi easyOaBseApi;\n\n    @Autowired\n    private RedisUtil redisUtil;\n\n    @Value(value = \"${jeecg.path.upload}\")\n    private String uploadpath;\n\n    @Value(value = \"${jeecg.uploadType}\")\n    private String uploadType;\n\n    /**\n     * sysFormFile中的表名\n     */\n    private static final String SYS_FORM_FILE_TABLE_NAME = \"sys_comment\";\n\n    @Override\n    public List<SysCommentVO> queryFormCommentInfo(SysComment sysComment) {\n        String tableName = sysComment.getTableName();\n        String dataId = sysComment.getTableDataId();\n        //获取评论信息\n        List<SysCommentVO> list = this.baseMapper.queryCommentList(tableName, dataId);\n        // 获取评论相关人员\n        Set<String> personSet = new HashSet<>();\n        if(list!=null && list.size()>0){\n            for(SysCommentVO vo: list){\n                if(oConvertUtils.isNotEmpty(vo.getFromUserId())){\n                    personSet.add(vo.getFromUserId());    \n                }\n                if(oConvertUtils.isNotEmpty(vo.getToUserId())){\n                    personSet.add(vo.getToUserId());\n                }\n            }\n        }\n        if(personSet.size()>0){\n            //获取用户信息\n            Map<String, UserAvatar> userAvatarMap = queryUserAvatar(personSet);\n            for(SysCommentVO vo: list){\n                String formId = vo.getFromUserId();\n                String toId = vo.getToUserId();\n                // 设置头像、用户名\n                if(oConvertUtils.isNotEmpty(formId)){\n                    UserAvatar fromUser = userAvatarMap.get(formId);\n                    if(fromUser!=null){\n                        vo.setFromUserId_dictText(fromUser.getRealname());\n                        vo.setFromUserAvatar(fromUser.getAvatar());\n                    }\n                }\n                if(oConvertUtils.isNotEmpty(toId)){\n                    UserAvatar toUser = userAvatarMap.get(toId);\n                    if(toUser!=null){\n                        vo.setToUserId_dictText(toUser.getRealname());\n                        vo.setToUserAvatar(toUser.getAvatar());\n                    }\n                }\n            }\n        }\n        return list;\n    }\n\n    @Transactional(rollbackFor = Exception.class)\n    @Override\n    public void saveOneFileComment(HttpServletRequest request) {\n        String existFileId = request.getParameter(\"fileId\");\n        if(oConvertUtils.isEmpty(existFileId)){\n            String savePath = \"\";\n            // 获取业务路径\n            String bizPath = request.getParameter(\"biz\");\n            // 获取上传文件对象\n            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n            MultipartFile file = multipartRequest.getFile(\"file\");\n\n            // 文件安全校验，防止上传漏洞文件\n            try {\n                SsrfFileTypeFilter.checkUploadFileType(file, bizPath);\n            } catch (Exception e) {\n                throw new JeecgBootException(e);\n            }\n\n            if (oConvertUtils.isEmpty(bizPath)) {\n                bizPath = CommonConstant.UPLOAD_TYPE_OSS.equals(uploadType) ? \"upload\" : \"\";\n            }\n            if (CommonConstant.UPLOAD_TYPE_LOCAL.equals(uploadType)) {\n                savePath = this.uploadLocal(file, bizPath);\n            } else {\n                savePath = CommonUtils.upload(file, bizPath, uploadType);\n            }\n\n            String orgName = file.getOriginalFilename();\n            // 获取文件名\n            orgName = CommonUtils.getFileName(orgName);\n            //文件大小\n            long size = file.getSize();\n            //文件类型\n            String type = orgName.substring(orgName.lastIndexOf(\".\"), orgName.length());\n            FileTypeEnum fileType = FileTypeEnum.getByType(type);\n\n            //保存至 SysFiles\n            SysFilesModel sysFiles = new SysFilesModel();\n            sysFiles.setFileName(orgName);\n            sysFiles.setUrl(savePath);\n            sysFiles.setFileType(fileType.getValue());\n            sysFiles.setStoreType(\"temp\");\n            if (size > 0) {\n                sysFiles.setFileSize(Double.parseDouble(String.valueOf(size)));\n            }\n            String fileId = String.valueOf(IdWorker.getId());\n            sysFiles.setId(fileId);\n            String tenantId = oConvertUtils.getString(TenantContext.getTenant());\n            sysFiles.setTenantId(tenantId);\n//            //update-begin---author:wangshuai---date:2024-01-04---for:【QQYUN-7821】知识库后端迁移---\n//            easyOaBseApi.addSysFiles(sysFiles);\n//            //update-end---author:wangshuai---date:2024-01-04---for:【QQYUN-7821】知识库后端迁移---\n\n            //保存至 SysFormFile\n            String tableName = SYS_FORM_FILE_TABLE_NAME;\n            String tableDataId = request.getParameter(\"commentId\");\n            SysFormFile sysFormFile = new SysFormFile();\n            sysFormFile.setTableName(tableName);\n            sysFormFile.setFileType(fileType.getValue());\n            sysFormFile.setTableDataId(tableDataId);\n            sysFormFile.setFileId(fileId);\n            sysFormFileMapper.insert(sysFormFile);\n\n        }else{\n//            //update-begin---author:wangshuai---date:2024-01-04---for:【QQYUN-7821】知识库后端迁移---\n//            SysFilesModel sysFiles = easyOaBseApi.getFileById(existFileId);\n//            //update-end---author:wangshuai---date:2024-01-04---for:【QQYUN-7821】知识库后端迁移---\n//            if(sysFiles!=null){\n                //保存至 SysFormFile\n                String tableName = SYS_FORM_FILE_TABLE_NAME;\n                String tableDataId = request.getParameter(\"commentId\");\n                SysFormFile sysFormFile = new SysFormFile();\n                sysFormFile.setTableName(tableName);\n                sysFormFile.setFileType(\"\");\n                sysFormFile.setTableDataId(tableDataId);\n                sysFormFile.setFileId(existFileId);\n                sysFormFileMapper.insert(sysFormFile);\n//            }\n        }\n    }\n\n    /**\n     * app端回复评论保存文件\n     * @param request\n     */\n    @Transactional(rollbackFor = Exception.class)\n    @Override\n    public void appSaveOneFileComment(HttpServletRequest request) {\n\n        String orgName = request.getParameter(\"fileName\");\n        String fileSize = request.getParameter(\"fileSize\");\n        String savePath = request.getParameter(\"savePath\");\n        // 获取文件名\n        orgName = CommonUtils.getFileName(orgName);\n        //文件大小\n        long size = Long.valueOf(fileSize);\n        //文件类型\n        String type = orgName.substring(orgName.lastIndexOf(\".\"), orgName.length());\n        FileTypeEnum fileType = FileTypeEnum.getByType(type);\n\n        //保存至 SysFiles\n        SysFilesModel sysFiles = new SysFilesModel();\n        sysFiles.setFileName(orgName);\n        sysFiles.setUrl(savePath);\n        sysFiles.setFileType(fileType.getValue());\n        sysFiles.setStoreType(\"temp\");\n        if (size > 0) {\n            sysFiles.setFileSize(Double.parseDouble(String.valueOf(size)));\n        }\n        String defaultValue = \"0\";\n        String fileId = String.valueOf(IdWorker.getId());\n        sysFiles.setId(fileId);\n        String tenantId = oConvertUtils.getString(TenantContext.getTenant());\n        sysFiles.setTenantId(tenantId);\n//        //update-begin---author:wangshuai---date:2024-01-04---for:【QQYUN-7821】知识库后端迁移---\n//        easyOaBseApi.addSysFiles(sysFiles);\n//        //update-end---author:wangshuai---date:2024-01-04---for:【QQYUN-7821】知识库后端迁移---\n        //保存至 SysFormFile\n        String tableName = SYS_FORM_FILE_TABLE_NAME;\n        String tableDataId = request.getParameter(\"commentId\");\n        SysFormFile sysFormFile = new SysFormFile();\n        sysFormFile.setTableName(tableName);\n        sysFormFile.setFileType(fileType.getValue());\n        sysFormFile.setTableDataId(tableDataId);\n        sysFormFile.setFileId(fileId);\n        sysFormFileMapper.insert(sysFormFile);\n\n    }\n\n    @Override\n    public List<SysCommentFileVo> queryFormFileList(String tableName, String formDataId) {\n        List<SysCommentFileVo> list = baseMapper.queryFormFileList(tableName, formDataId);\n        return list;\n    }\n\n    @Override\n    public String saveOne(SysComment sysComment) {\n        this.save(sysComment);\n        //发送系统消息\n        String content = sysComment.getCommentContent();\n        if (content.indexOf(\"@\") >= 0) {\n            Set<String> set = getCommentUsername(content);\n            if (set.size() > 0) {\n                String users = String.join(\",\", set);\n                MessageDTO md = new MessageDTO();\n                md.setTitle(\"有人在表单评论中提到了你\");\n                md.setContent(content);\n                md.setToAll(false);\n                md.setToUser(users);\n                md.setFromUser(\"system\");\n                md.setType(MessageTypeEnum.XT.getType());\n\n                // 代码逻辑说明: QQYUN-4744【系统通知】6、系统通知@人后，对方看不到是哪个表单@的，没有超链接\n                String tableName = sysComment.getTableName();\n                String prefix = \"desform:\";\n                if (tableName != null) {\n                    // 表单设计器\n                    if (tableName.startsWith(prefix)) {\n                        Map<String, Object> data = new HashMap<>();\n                        data.put(CommonConstant.NOTICE_MSG_BUS_TYPE, \"comment\");\n                        JSONObject params = new JSONObject();\n                        params.put(\"code\", tableName.substring(prefix.length()));\n                        params.put(\"dataId\", sysComment.getTableDataId());\n                        params.put(\"type\", \"designForm\");\n                        data.put(CommonConstant.NOTICE_MSG_SUMMARY, params);\n                        md.setData(data);\n                    }\n                    // Online表单，判断是否携带id\n                    else if (oConvertUtils.isNotEmpty(sysComment.getTableId())) {\n                        Map<String, Object> data = new HashMap<>();\n                        data.put(CommonConstant.NOTICE_MSG_BUS_TYPE, \"comment\");\n                        JSONObject params = new JSONObject();\n                        params.put(\"code\", tableName);\n                        params.put(\"formId\", sysComment.getTableId());\n                        params.put(\"dataId\", sysComment.getTableDataId());\n                        params.put(\"type\", \"cgform\");\n                        data.put(CommonConstant.NOTICE_MSG_SUMMARY, params);\n                        md.setData(data);\n                    }\n                }\n                \n                sysBaseApi.sendTemplateMessage(md);\n            }\n        }\n        return sysComment.getId();\n    }\n\n    @Override\n    public void deleteOne(String id) {\n        this.removeById(id);\n        //还要删除关联文件\n        LambdaQueryWrapper<SysFormFile> query = new LambdaQueryWrapper<SysFormFile>()\n                .eq(SysFormFile::getTableDataId, id)\n                .eq(SysFormFile::getTableName, SYS_FORM_FILE_TABLE_NAME);\n        this.sysFormFileMapper.delete(query);\n    }\n\n    /**\n     * 通过正则获取评论中的用户账号\n     *\n     * @return\n     */\n    private Set<String> getCommentUsername(String content) {\n        Set<String> set = new HashSet<String>(3);\n        String reg = \"(@(.*?)\\\\[(.*?)\\\\])\";\n        Pattern p = Pattern.compile(reg);\n        Matcher m = p.matcher(content);\n        while (m.find()) {\n            if (m.groupCount() == 3) {\n                String username = m.group(3);\n                set.add(username);\n            }\n        }\n        return set;\n    }\n\n\n    /**\n     * 本地文件上传\n     *\n     * @param mf      文件\n     * @param bizPath 自定义路径\n     * @return\n     */\n    private String uploadLocal(MultipartFile mf, String bizPath) {\n        try {\n            // 文件安全校验，防止上传漏洞文件\n            SsrfFileTypeFilter.checkUploadFileType(mf, bizPath);\n        } catch (Exception e) {\n            throw new JeecgBootException(e);\n        }\n        \n        try {\n            String ctxPath = uploadpath;\n            String fileName = null;\n            File file = new File(ctxPath + File.separator + bizPath + File.separator);\n            if (!file.exists()) {\n                file.mkdirs();// 创建文件根目录\n            }\n            String orgName = mf.getOriginalFilename();// 获取文件名\n            orgName = CommonUtils.getFileName(orgName);\n            if (orgName.indexOf(\".\") != -1) {\n                fileName = orgName.substring(0, orgName.lastIndexOf(\".\")) + \"_\" + System.currentTimeMillis() + orgName.substring(orgName.indexOf(\".\"));\n            } else {\n                fileName = orgName + \"_\" + System.currentTimeMillis();\n            }\n            String savePath = file.getPath() + File.separator + fileName;\n            File savefile = new File(savePath);\n            FileCopyUtils.copy(mf.getBytes(), savefile);\n            String dbpath = null;\n            if (oConvertUtils.isNotEmpty(bizPath)) {\n                dbpath = bizPath + File.separator + fileName;\n            } else {\n                dbpath = fileName;\n            }\n            if (dbpath.contains(\"\\\\\")) {\n                dbpath = dbpath.replace(\"\\\\\", \"/\");\n            }\n            return dbpath;\n        } catch (IOException e) {\n            log.error(e.getMessage(), e);\n        }\n        return \"\";\n    }\n\n    /**\n     * 查询用户信息\n     * @param idSet\n     * @return\n     */\n    private Map<String, UserAvatar> queryUserAvatar(Set<String> idSet){\n        List<UserAvatar> list = this.baseMapper.queryUserAvatarList(idSet);\n        Map<String, UserAvatar> map = new HashMap<>();\n        if(list!=null && list.size()>0){\n            for(UserAvatar user: list){\n                map.put(user.getId(), user);\n            }\n        }\n        return map;\n    }\n    \n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDataLogServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport org.jeecg.modules.system.entity.SysDataLog;\nimport org.jeecg.modules.system.mapper.SysDataLogMapper;\nimport org.jeecg.modules.system.service.ISysDataLogService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\n\n/**\n * @Description: 系统数据日志实现类\n * @author: jeecg-boot\n */\n@Service\npublic class SysDataLogServiceImpl extends ServiceImpl<SysDataLogMapper,SysDataLog> implements ISysDataLogService {\n\t@Autowired\n\tprivate SysDataLogMapper logMapper;\n\n\t/**\n\t * 添加数据日志\n\t */\n\t@Override\n\tpublic void addDataLog(String tableName, String dataId, String dataContent) {\n\t\tString versionNumber = \"0\";\n\t\tString dataVersion = logMapper.queryMaxDataVer(tableName, dataId);\n\t\tif(dataVersion != null ) {\n\t\t\tversionNumber = String.valueOf(Integer.parseInt(dataVersion)+1);\n\t\t}\n\t\tSysDataLog log = new SysDataLog();\n\t\tlog.setDataTable(tableName);\n\t\tlog.setDataId(dataId);\n\t\tlog.setDataContent(dataContent);\n\t\tlog.setDataVersion(versionNumber);\n\t\tlog.autoSetCreateName();\n\t\tthis.save(log);\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDataSourceServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport com.baomidou.dynamic.datasource.DynamicRoutingDataSource;\nimport com.baomidou.dynamic.datasource.creator.DataSourceProperty;\nimport com.baomidou.dynamic.datasource.creator.druid.DruidDataSourceCreator;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.apache.commons.lang.StringUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.util.dynamic.db.DataSourceCachePool;\nimport org.jeecg.modules.system.entity.SysDataSource;\nimport org.jeecg.modules.system.mapper.SysDataSourceMapper;\nimport org.jeecg.modules.system.service.ISysDataSourceService;\nimport org.jeecg.modules.system.util.SecurityUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport javax.sql.DataSource;\n\n/**\n * @Description: 多数据源管理\n * @Author: jeecg-boot\n * @Date: 2019-12-25\n * @Version: V1.0\n */\n@Service\npublic class SysDataSourceServiceImpl extends ServiceImpl<SysDataSourceMapper, SysDataSource> implements ISysDataSourceService {\n\n    @Autowired\n    private DruidDataSourceCreator dataSourceCreator;\n\n    @Autowired\n    private DataSource dataSource;\n\n    @Override\n    public Result saveDataSource(SysDataSource sysDataSource) {\n        try {\n            long count = checkDbCode(sysDataSource.getCode());\n            if (count > 0) {\n                return Result.error(\"数据源编码已存在\");\n            }\n            String dbPassword = sysDataSource.getDbPassword();\n            if (StringUtils.isNotBlank(dbPassword)) {\n                String encrypt = SecurityUtil.jiami(dbPassword);\n                sysDataSource.setDbPassword(encrypt);\n            }\n            boolean result = save(sysDataSource);\n            if (result) {\n                //动态创建数据源\n                //addDynamicDataSource(sysDataSource, dbPassword);\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return Result.OK(\"添加成功！\");\n    }\n\n    @Override\n    public Result editDataSource(SysDataSource sysDataSource) {\n        try {\n            SysDataSource d = getById(sysDataSource.getId());\n            DataSourceCachePool.removeCache(d.getCode());\n            String dbPassword = sysDataSource.getDbPassword();\n            if (StringUtils.isNotBlank(dbPassword)) {\n                String encrypt = SecurityUtil.jiami(dbPassword);\n                sysDataSource.setDbPassword(encrypt);\n            }\n            Boolean result=updateById(sysDataSource);\n            if(result){\n                //先删除老的数据源\n               // removeDynamicDataSource(d.getCode());\n                //添加新的数据源\n                //addDynamicDataSource(sysDataSource,dbPassword);\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return Result.OK(\"编辑成功!\");\n    }\n\n    @Override\n    public Result deleteDataSource(String id) {\n        SysDataSource sysDataSource = getById(id);\n        DataSourceCachePool.removeCache(sysDataSource.getCode());\n        removeById(id);\n        return Result.OK(\"删除成功!\");\n    }\n\n    /**\n     * 动态添加数据源 【注册mybatis动态数据源】\n     *\n     * @param sysDataSource 添加数据源数据对象\n     * @param dbPassword    未加密的密码\n     */\n    private void addDynamicDataSource(SysDataSource sysDataSource, String dbPassword) {\n        DataSourceProperty dataSourceProperty = new DataSourceProperty();\n        dataSourceProperty.setUrl(sysDataSource.getDbUrl());\n        dataSourceProperty.setPassword(dbPassword);\n        dataSourceProperty.setDriverClassName(sysDataSource.getDbDriver());\n        dataSourceProperty.setUsername(sysDataSource.getDbUsername());\n        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;\n        DataSource dataSource = dataSourceCreator.createDataSource(dataSourceProperty);\n        try {\n            ds.addDataSource(sysDataSource.getCode(), dataSource);\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    /**\n     * 删除数据源\n     * @param code\n     */\n    private void removeDynamicDataSource(String code) {\n        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;\n        ds.removeDataSource(code);\n    }\n\n    /**\n     * 检查数据源编码是否存在\n     *\n     * @param dbCode\n     * @return\n     */\n    private long checkDbCode(String dbCode) {\n        QueryWrapper<SysDataSource> qw = new QueryWrapper();\n        qw.lambda().eq(true, SysDataSource::getCode, dbCode);\n        return count(qw);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartPermissionServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysDepartPermission;\nimport org.jeecg.modules.system.entity.SysDepartRole;\nimport org.jeecg.modules.system.entity.SysDepartRolePermission;\nimport org.jeecg.modules.system.entity.SysPermissionDataRule;\nimport org.jeecg.modules.system.mapper.SysDepartPermissionMapper;\nimport org.jeecg.modules.system.mapper.SysDepartRoleMapper;\nimport org.jeecg.modules.system.mapper.SysDepartRolePermissionMapper;\nimport org.jeecg.modules.system.mapper.SysPermissionDataRuleMapper;\nimport org.jeecg.modules.system.service.ISysDepartPermissionService;\nimport org.springframework.stereotype.Service;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport jakarta.annotation.Resource;\nimport java.util.*;\nimport java.util.stream.Collectors;\n\n/**\n * @Description: 部门权限表\n * @Author: jeecg-boot\n * @Date:   2020-02-11\n * @Version: V1.0\n */\n@Service\npublic class SysDepartPermissionServiceImpl extends ServiceImpl<SysDepartPermissionMapper, SysDepartPermission> implements ISysDepartPermissionService {\n    @Resource\n    private SysPermissionDataRuleMapper ruleMapper;\n\n    @Resource\n    private SysDepartRoleMapper sysDepartRoleMapper;\n\n    @Resource\n    private SysDepartRolePermissionMapper departRolePermissionMapper;\n\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public void saveDepartPermission(String departId, String permissionIds, String lastPermissionIds) {\n        //1.对比要新增的权限\n        List<String> add = getDiff(lastPermissionIds,permissionIds);\n        if(add!=null && add.size()>0) {\n            List<SysDepartPermission> list = new ArrayList<SysDepartPermission>();\n            for (String p : add) {\n                if(oConvertUtils.isNotEmpty(p)) {\n                    SysDepartPermission rolepms = new SysDepartPermission(departId, p);\n                    list.add(rolepms);\n                }\n            }\n            this.saveBatch(list);\n        }\n        //2.对比要删除的权限\n        List<String> delete = getDiff(permissionIds,lastPermissionIds);\n        if(delete!=null && delete.size()>0) {\n            for (String permissionId : delete) {\n                //2.1 删除部门对应的权限\n                this.remove(new QueryWrapper<SysDepartPermission>().lambda()\n                        .eq(SysDepartPermission::getDepartId, departId)\n                        .eq(SysDepartPermission::getPermissionId, permissionId));\n                //2.2 删除部门权限时，删除部门角色中已授权的权限\n                List<SysDepartRole> sysDepartRoleList = sysDepartRoleMapper.selectList(new LambdaQueryWrapper<SysDepartRole>().eq(SysDepartRole::getDepartId,departId));\n                List<String> roleIds = sysDepartRoleList.stream().map(SysDepartRole::getId).collect(Collectors.toList());\n                if(roleIds != null && roleIds.size()>0){\n                    departRolePermissionMapper.delete(new LambdaQueryWrapper<SysDepartRolePermission>()\n                            .eq(SysDepartRolePermission::getPermissionId,permissionId)\n                        // 代码逻辑说明: [issue/#5339]部门管理下部门赋权代码逻辑缺少判断条件\n                            .in(SysDepartRolePermission::getRoleId,roleIds)\n                    );\n                }\n            }\n        }\n    }\n\n    @Override\n    public List<SysPermissionDataRule> getPermRuleListByDeptIdAndPermId(String departId, String permissionId) {\n        SysDepartPermission departPermission = this.getOne(new QueryWrapper<SysDepartPermission>().lambda().eq(SysDepartPermission::getDepartId, departId).eq(SysDepartPermission::getPermissionId, permissionId));\n        if(departPermission != null && oConvertUtils.isNotEmpty(departPermission.getDataRuleIds())){\n            LambdaQueryWrapper<SysPermissionDataRule> query = new LambdaQueryWrapper<SysPermissionDataRule>();\n            query.in(SysPermissionDataRule::getId, Arrays.asList(departPermission.getDataRuleIds().split(\",\")));\n            query.orderByDesc(SysPermissionDataRule::getCreateTime);\n            List<SysPermissionDataRule> permRuleList = this.ruleMapper.selectList(query);\n            return permRuleList;\n        }else{\n            return null;\n        }\n    }\n\n    /**\n     * 从diff中找出main中没有的元素\n     * @param main\n     * @param diff\n     * @return\n     */\n    private List<String> getDiff(String main,String diff){\n        if(oConvertUtils.isEmpty(diff)) {\n            return null;\n        }\n        if(oConvertUtils.isEmpty(main)) {\n            return Arrays.asList(diff.split(\",\"));\n        }\n\n        String[] mainArr = main.split(\",\");\n        String[] diffArr = diff.split(\",\");\n        Map<String, Integer> map = new HashMap(5);\n        for (String string : mainArr) {\n            map.put(string, 1);\n        }\n        List<String> res = new ArrayList<String>();\n        for (String key : diffArr) {\n            if(oConvertUtils.isNotEmpty(key) && !map.containsKey(key)) {\n                res.add(key);\n            }\n        }\n        return res;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartRolePermissionServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport org.jeecg.common.util.IpUtils;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysDepartRolePermission;\nimport org.jeecg.modules.system.mapper.SysDepartRolePermissionMapper;\nimport org.jeecg.modules.system.service.ISysDepartRolePermissionService;\nimport org.springframework.stereotype.Service;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.util.*;\n\n/**\n * @Description: 部门角色权限\n * @Author: jeecg-boot\n * @Date:   2020-02-12\n * @Version: V1.0\n */\n@Service\npublic class SysDepartRolePermissionServiceImpl extends ServiceImpl<SysDepartRolePermissionMapper, SysDepartRolePermission> implements ISysDepartRolePermissionService {\n\n    @Override\n    public void saveDeptRolePermission(String roleId, String permissionIds, String lastPermissionIds) {\n        String ip = \"\";\n        try {\n            //获取request\n            HttpServletRequest request = SpringContextUtils.getHttpServletRequest();\n            //获取IP地址\n            ip = IpUtils.getIpAddr(request);\n        } catch (Exception e) {\n            ip = \"127.0.0.1\";\n        }\n        List<String> add = getDiff(lastPermissionIds,permissionIds);\n        if(add!=null && add.size()>0) {\n            List<SysDepartRolePermission> list = new ArrayList<SysDepartRolePermission>();\n            for (String p : add) {\n                if(oConvertUtils.isNotEmpty(p)) {\n                    SysDepartRolePermission rolepms = new SysDepartRolePermission(roleId, p);\n                    rolepms.setOperateDate(new Date());\n                    rolepms.setOperateIp(ip);\n                    list.add(rolepms);\n                }\n            }\n            this.saveBatch(list);\n        }\n\n        List<String> delete = getDiff(permissionIds,lastPermissionIds);\n        if(delete!=null && delete.size()>0) {\n            for (String permissionId : delete) {\n                this.remove(new QueryWrapper<SysDepartRolePermission>().lambda().eq(SysDepartRolePermission::getRoleId, roleId).eq(SysDepartRolePermission::getPermissionId, permissionId));\n            }\n        }\n    }\n\n    /**\n     * 从diff中找出main中没有的元素\n     * @param main\n     * @param diff\n     * @return\n     */\n    private List<String> getDiff(String main, String diff){\n        if(oConvertUtils.isEmpty(diff)) {\n            return null;\n        }\n        if(oConvertUtils.isEmpty(main)) {\n            return Arrays.asList(diff.split(\",\"));\n        }\n\n        String[] mainArr = main.split(\",\");\n        String[] diffArr = diff.split(\",\");\n        Map<String, Integer> map = new HashMap(5);\n        for (String string : mainArr) {\n            map.put(string, 1);\n        }\n        List<String> res = new ArrayList<String>();\n        for (String key : diffArr) {\n            if(oConvertUtils.isNotEmpty(key) && !map.containsKey(key)) {\n                res.add(key);\n            }\n        }\n        return res;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartRoleServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport org.jeecg.modules.system.entity.SysDepartRole;\nimport org.jeecg.modules.system.mapper.SysDepartRoleMapper;\nimport org.jeecg.modules.system.mapper.SysDepartRolePermissionMapper;\nimport org.jeecg.modules.system.mapper.SysDepartRoleUserMapper;\nimport org.jeecg.modules.system.service.ISysDepartRoleService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport java.util.List;\n\n/**\n * @Description: 部门角色\n * @Author: jeecg-boot\n * @Date:   2020-02-12\n * @Version: V1.0\n */\n@Service\npublic class SysDepartRoleServiceImpl extends ServiceImpl<SysDepartRoleMapper, SysDepartRole> implements ISysDepartRoleService {\n\n    @Autowired\n    SysDepartRolePermissionMapper sysDepartRolePermissionMapper;\n\n    @Autowired\n    SysDepartRoleUserMapper sysDepartRoleUserMapper;\n\n    @Override\n    public List<SysDepartRole> queryDeptRoleByDeptAndUser(String orgCode, String userId) {\n        return this.baseMapper.queryDeptRoleByDeptAndUser(orgCode,userId);\n    }\n\n    /**\n     * 删除部门角色和对应关联表信息\n     * @param ids\n     */\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public void deleteDepartRole(List<String> ids) {\n        this.baseMapper.deleteBatchIds(ids);\n        this.sysDepartRolePermissionMapper.deleteByRoleIds(ids);\n        this.sysDepartRoleUserMapper.deleteByRoleIds(ids);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartRoleUserServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysDepartRole;\nimport org.jeecg.modules.system.entity.SysDepartRoleUser;\nimport org.jeecg.modules.system.mapper.SysDepartRoleMapper;\nimport org.jeecg.modules.system.mapper.SysDepartRoleUserMapper;\nimport org.jeecg.modules.system.service.ISysDepartRoleUserService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport java.util.*;\nimport java.util.stream.Collectors;\n\n/**\n * @Description: 部门角色人员信息\n * @Author: jeecg-boot\n * @Date:   2020-02-13\n * @Version: V1.0\n */\n@Service\npublic class SysDepartRoleUserServiceImpl extends ServiceImpl<SysDepartRoleUserMapper, SysDepartRoleUser> implements ISysDepartRoleUserService {\n    @Autowired\n    private SysDepartRoleMapper sysDepartRoleMapper;\n\n    @Override\n    public void deptRoleUserAdd(String userId, String newRoleId, String oldRoleId) {\n        List<String> add = getDiff(oldRoleId,newRoleId);\n        if(add!=null && add.size()>0) {\n            List<SysDepartRoleUser> list = new ArrayList<>();\n            for (String roleId : add) {\n                if(oConvertUtils.isNotEmpty(roleId)) {\n                    SysDepartRoleUser rolepms = new SysDepartRoleUser(userId, roleId);\n                    list.add(rolepms);\n                }\n            }\n            this.saveBatch(list);\n        }\n        List<String> remove = getDiff(newRoleId,oldRoleId);\n        if(remove!=null && remove.size()>0) {\n            for (String roleId : remove) {\n                this.remove(new QueryWrapper<SysDepartRoleUser>().lambda().eq(SysDepartRoleUser::getUserId, userId).eq(SysDepartRoleUser::getDroleId, roleId));\n            }\n        }\n    }\n\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public void removeDeptRoleUser(List<String> userIds, String depId) {\n        for(String userId : userIds){\n            List<SysDepartRole> sysDepartRoleList = sysDepartRoleMapper.selectList(new QueryWrapper<SysDepartRole>().eq(\"depart_id\",depId));\n            List<String> roleIds = sysDepartRoleList.stream().map(SysDepartRole::getId).collect(Collectors.toList());\n            if(roleIds != null && roleIds.size()>0){\n                QueryWrapper<SysDepartRoleUser> query = new QueryWrapper<>();\n                query.eq(\"user_id\",userId).in(\"drole_id\",roleIds);\n                this.remove(query);\n            }\n        }\n    }\n\n    /**\n     * 从diff中找出main中没有的元素\n     * @param main\n     * @param diff\n     * @return\n     */\n    private List<String> getDiff(String main, String diff){\n        if(oConvertUtils.isEmpty(diff)) {\n            return null;\n        }\n        if(oConvertUtils.isEmpty(main)) {\n            return Arrays.asList(diff.split(\",\"));\n        }\n\n        String[] mainArr = main.split(\",\");\n        String[] diffArr = diff.split(\",\");\n        Map<String, Integer> map = new HashMap(5);\n        for (String string : mainArr) {\n            map.put(string, 1);\n        }\n        List<String> res = new ArrayList<String>();\n        for (String key : diffArr) {\n            if(oConvertUtils.isNotEmpty(key) && !map.containsKey(key)) {\n                res.add(key);\n            }\n        }\n        return res;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport cn.hutool.core.util.ArrayUtil;\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.IdWorker;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport io.netty.util.internal.StringUtil;\nimport org.apache.commons.lang.StringUtils;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.FillRuleConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.constant.enums.DepartCategoryEnum;\nimport org.jeecg.common.exception.JeecgBootBizTipException;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.*;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.modules.system.entity.*;\nimport org.jeecg.modules.system.mapper.*;\nimport org.jeecg.modules.system.model.DepartIdModel;\nimport org.jeecg.modules.system.model.SysDepartTreeModel;\nimport org.jeecg.modules.system.service.ISysDepartService;\nimport org.jeecg.modules.system.util.FindsDepartsChildrenUtil;\nimport org.jeecg.modules.system.vo.*;\nimport org.jeecg.modules.system.vo.lowapp.ExportDepartVo;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\nimport org.springframework.util.CollectionUtils;\n\nimport java.util.*;\nimport java.util.function.Consumer;\nimport java.util.stream.Collectors;\n\n/**\n * <p>\n * 部门表 服务实现类\n * <p>\n * \n * @Author Steve\n * @Since 2019-01-22\n */\n@Service\npublic class SysDepartServiceImpl extends ServiceImpl<SysDepartMapper, SysDepart> implements ISysDepartService {\n\n\t@Autowired\n\tprivate SysUserDepartMapper userDepartMapper;\n\t@Autowired\n\tprivate SysDepartRoleMapper sysDepartRoleMapper;\n\t@Autowired\n\tprivate SysDepartPermissionMapper departPermissionMapper;\n\t@Autowired\n\tprivate SysDepartRolePermissionMapper departRolePermissionMapper;\n\t@Autowired\n\tprivate SysDepartRoleUserMapper departRoleUserMapper;\n\t@Autowired\n\tprivate SysUserMapper sysUserMapper;\n\t@Autowired\n\tprivate SysDepartMapper departMapper;\n    @Autowired\n    private SysPositionMapper sysPositionMapper;\n    @Autowired\n    private RedisUtil redisUtil;\n    @Autowired\n    private SysUserDepPostMapper sysUserDepPostMapper;\n    \n\t@Override\n\tpublic List<SysDepartTreeModel> queryMyDeptTreeList(String departIds) {\n\t\t//根据部门id获取所负责部门\n\t\tLambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>();\n\t\tString[] codeArr = this.getMyDeptParentOrgCode(departIds);\n\t\t// 代码逻辑说明: 【QQYUN-7320】查询部门没数据，导致报错空指针---\n\t\tif(ArrayUtil.isEmpty(codeArr)){\n\t\t\treturn null;\n\t\t}\n\t\tfor(int i=0;i<codeArr.length;i++){\n\t\t\tquery.or().likeRight(SysDepart::getOrgCode,codeArr[i]);\n\t\t}\n\t\tquery.eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0.toString());\n        query.ne(SysDepart::getOrgCategory,DepartCategoryEnum.DEPART_CATEGORY_POST.getValue());\n\t\t//------------------------------------------------------------------------------------------------\n\t\t//是否开启系统管理模块的 SASS 控制\n\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\tquery.eq(SysDepart::getTenantId, oConvertUtils.getInt(TenantContext.getTenant(), 0));\n\t\t}\n\t\t//------------------------------------------------------------------------------------------------\n\t\t\n\t\tquery.orderByAsc(SysDepart::getDepartOrder);\n\t\t//将父节点ParentId设为null\n\t\tList<SysDepart> listDepts = this.list(query);\n\t\tfor(int i=0;i<codeArr.length;i++){\n\t\t\tfor(SysDepart dept : listDepts){\n\t\t\t\tif(dept.getOrgCode().equals(codeArr[i])){\n\t\t\t\t\tdept.setParentId(null);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// 调用wrapTreeDataToTreeList方法生成树状数据\n\t\tList<SysDepartTreeModel> listResult = FindsDepartsChildrenUtil.wrapTreeDataToTreeList(listDepts);\n\t\treturn listResult;\n\t}\n\n\t/**\n\t * queryTreeList 对应 queryTreeList 查询所有的部门数据,以树结构形式响应给前端\n\t */\n\t@Override\n\t//@Cacheable(value = CacheConstant.SYS_DEPARTS_CACHE)\n\tpublic List<SysDepartTreeModel> queryTreeList() {\n\t\tLambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>();\n\t\t//------------------------------------------------------------------------------------------------\n\t\t//是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\tquery.eq(SysDepart::getTenantId, oConvertUtils.getInt(TenantContext.getTenant(), 0));\n\t\t}   \n\t\t//------------------------------------------------------------------------------------------------\n\t\tquery.eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0.toString());\n        // 代码逻辑说明: 【QQYUN-13427】部门选择组件修改:需要过滤掉岗位 只保留 公司 子公司 部门---\n        query.ne(SysDepart::getOrgCategory, DepartCategoryEnum.DEPART_CATEGORY_POST.getValue());\n\t\tquery.orderByAsc(SysDepart::getDepartOrder);\n\t\tList<SysDepart> list = this.list(query);\n\t\t//设置用户id,让前台显示\n        this.setUserIdsByDepList(list);\n\t\t// 调用wrapTreeDataToTreeList方法生成树状数据\n\t\tList<SysDepartTreeModel> listResult = FindsDepartsChildrenUtil.wrapTreeDataToTreeList(list);\n\t\treturn listResult;\n\t}\n\n\t/**\n\t * queryTreeList 根据部门id查询,前端回显调用\n\t */\n\t@Override\n\tpublic List<SysDepartTreeModel> queryTreeList(String ids) {\n\t\tList<SysDepartTreeModel> listResult=new ArrayList<>();\n\t\tLambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>();\n\t\tquery.eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0.toString());\n        // 代码逻辑说明: 【QQYUN-13427】部门选择组件修改:需要过滤掉岗位 只保留 公司 子公司 部门---\n         query.ne(SysDepart::getOrgCategory,DepartCategoryEnum.DEPART_CATEGORY_POST.getValue());\n\t\tif(oConvertUtils.isNotEmpty(ids)){\n\t\t\tquery.in(true,SysDepart::getId,ids.split(\",\"));\n\t\t}\n\t\t//------------------------------------------------------------------------------------------------\n\t\t//是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\tquery.eq(SysDepart::getTenantId, oConvertUtils.getInt(TenantContext.getTenant(), 0));\n\t\t}\n\t\t//------------------------------------------------------------------------------------------------\n\t\tquery.orderByAsc(SysDepart::getDepartOrder);\n\t\tList<SysDepart> list= this.list(query);\n\t\tfor (SysDepart depart : list) {\n\t\t\tlistResult.add(new SysDepartTreeModel(depart));\n\t\t}\n\t\treturn  listResult;\n\n\t}\n\n\t//@Cacheable(value = CacheConstant.SYS_DEPART_IDS_CACHE)\n\t@Override\n\tpublic List<DepartIdModel> queryDepartIdTreeList() {\n\t\tLambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>();\n\t\tquery.eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0.toString());\n\t\t//------------------------------------------------------------------------------------------------\n\t\t//是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\tquery.eq(SysDepart::getTenantId, oConvertUtils.getInt(TenantContext.getTenant(), 0));\n\t\t}\n\t\t//------------------------------------------------------------------------------------------------\n\t\tquery.orderByAsc(SysDepart::getDepartOrder);\n\t\tList<SysDepart> list = this.list(query);\n\t\t// 调用wrapTreeDataToTreeList方法生成树状数据\n\t\tList<DepartIdModel> listResult = FindsDepartsChildrenUtil.wrapTreeDataToDepartIdTreeList(list);\n\t\treturn listResult;\n\t}\n\n\t/**\n\t * saveDepartData 对应 add 保存用户在页面添加的新的部门对象数据\n\t */\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void saveDepartData(SysDepart sysDepart, String username) {\n\t\tif (sysDepart != null && username != null) {\n\t\t\t// 代码逻辑说明: [QQYUN-4163]给部门表加个是否有子节点------------\n\t\t\tif (oConvertUtils.isEmpty(sysDepart.getParentId())) {\n\t\t\t\tsysDepart.setParentId(\"\");\n\t\t\t}else{\n\t\t\t\t//将父部门的设成不是叶子结点\n\t\t\t\tdepartMapper.setMainLeaf(sysDepart.getParentId(),CommonConstant.NOT_LEAF);\n\t\t\t}\n\t\t\t//String s = UUID.randomUUID().toString().replace(\"-\", \"\");\n\t\t\tsysDepart.setId(IdWorker.getIdStr(sysDepart));\n\t\t\t// 先判断该对象有无父级ID,有则意味着不是最高级,否则意味着是最高级\n\t\t\t// 获取父级ID\n\t\t\tString parentId = sysDepart.getParentId();\n\t\t\t// 代码逻辑说明: 部门编码规则生成器做成公用配置\n\t\t\tJSONObject formData = new JSONObject();\n\t\t\tformData.put(\"parentId\",parentId);\n\t\t\tString[] codeArray = (String[]) FillRuleUtil.executeRule(FillRuleConstant.DEPART,formData);\n\t\t\tsysDepart.setOrgCode(codeArray[0]);\n\t\t\tString orgType = codeArray[1];\n\t\t\tsysDepart.setOrgType(String.valueOf(orgType));\n\t\t\tsysDepart.setCreateTime(new Date());\n\t\t\tsysDepart.setDelFlag(CommonConstant.DEL_FLAG_0.toString());\n\t\t\t//新添加的部门是叶子节点\n\t\t\tsysDepart.setIzLeaf(CommonConstant.IS_LEAF);\n\t\t\t// 【QQYUN-7172】数据库默认值兼容\n\t\t\tif (oConvertUtils.isEmpty(sysDepart.getOrgCategory())) {\n\t\t\t\tif (oConvertUtils.isEmpty(sysDepart.getParentId())) {\n\t\t\t\t\tsysDepart.setOrgCategory(\"1\");\n\t\t\t\t} else {\n\t\t\t\t\tsysDepart.setOrgCategory(\"2\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.save(sysDepart);\n\t\t\t//新增部门的时候新增负责部门\n            if(oConvertUtils.isNotEmpty(sysDepart.getDirectorUserIds())){\n\t\t\t    this.addDepartByUserIds(sysDepart,sysDepart.getDirectorUserIds());\n            }\n         }\n\n\t}\n\t\n\t/**\n\t * saveDepartData 的调用方法,生成部门编码和部门类型（作废逻辑）\n\t * @deprecated\n\t * @param parentId\n\t * @return\n\t */\n\tprivate String[] generateOrgCode(String parentId) {\t\n\t\t\t\t// 代码逻辑说明: 组织机构添加数据代码调整\n\t\t\t\tLambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>();\n\t\t\t\tLambdaQueryWrapper<SysDepart> query1 = new LambdaQueryWrapper<SysDepart>();\n\t\t\t\tString[] strArray = new String[2];\n\t\t        // 创建一个List集合,存储查询返回的所有SysDepart对象\n\t\t        List<SysDepart> departList = new ArrayList<>();\n\t\t\t\t// 定义新编码字符串\n\t\t\t\tString newOrgCode = \"\";\n\t\t\t\t// 定义旧编码字符串\n\t\t\t\tString oldOrgCode = \"\";\n\t\t\t\t// 定义部门类型\n\t\t\t\tString orgType = \"\";\n\t\t\t\t// 如果是最高级,则查询出同级的org_code, 调用工具类生成编码并返回\n\t\t\t\tif (StringUtil.isNullOrEmpty(parentId)) {\n\t\t\t\t\t// 线判断数据库中的表是否为空,空则直接返回初始编码\n\t\t\t\t\tquery1.eq(SysDepart::getParentId, \"\").or().isNull(SysDepart::getParentId);\n\t\t\t\t\tquery1.orderByDesc(SysDepart::getOrgCode);\n\t\t\t\t\tdepartList = this.list(query1);\n\t\t\t\t\tif(departList == null || departList.size() == 0) {\n\t\t\t\t\t\tstrArray[0] = YouBianCodeUtil.getNextYouBianCode(null);\n\t\t\t\t\t\tstrArray[1] = \"1\";\n\t\t\t\t\t\treturn strArray;\n\t\t\t\t\t}else {\n\t\t\t\t\tSysDepart depart = departList.get(0);\n\t\t\t\t\toldOrgCode = depart.getOrgCode();\n\t\t\t\t\torgType = depart.getOrgType();\n\t\t\t\t\tnewOrgCode = YouBianCodeUtil.getNextYouBianCode(oldOrgCode);\n\t\t\t\t\t}\n\t\t\t\t} else { // 反之则查询出所有同级的部门,获取结果后有两种情况,有同级和没有同级\n\t\t\t\t\t// 封装查询同级的条件\n\t\t\t\t\tquery.eq(SysDepart::getParentId, parentId);\n\t\t\t\t\t// 降序排序\n\t\t\t\t\tquery.orderByDesc(SysDepart::getOrgCode);\n\t\t\t\t\t// 查询出同级部门的集合\n\t\t\t\t\tList<SysDepart> parentList = this.list(query);\n\t\t\t\t\t// 查询出父级部门\n\t\t\t\t\tSysDepart depart = this.getById(parentId);\n\t\t\t\t\t// 获取父级部门的Code\n\t\t\t\t\tString parentCode = depart.getOrgCode();\n\t\t\t\t\t// 根据父级部门类型算出当前部门的类型\n\t\t\t\t\torgType = String.valueOf(Integer.valueOf(depart.getOrgType()) + 1);\n\t\t\t\t\t// 处理同级部门为null的情况\n\t\t\t\t\tif (parentList == null || parentList.size() == 0) {\n\t\t\t\t\t\t// 直接生成当前的部门编码并返回\n\t\t\t\t\t\tnewOrgCode = YouBianCodeUtil.getSubYouBianCode(parentCode, null);\n\t\t\t\t\t} else { //处理有同级部门的情况\n\t\t\t\t\t\t// 获取同级部门的编码,利用工具类\n\t\t\t\t\t\tString subCode = parentList.get(0).getOrgCode();\n\t\t\t\t\t\t// 返回生成的当前部门编码\n\t\t\t\t\t\tnewOrgCode = YouBianCodeUtil.getSubYouBianCode(parentCode, subCode);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// 返回最终封装了部门编码和部门类型的数组\n\t\t\t\tstrArray[0] = newOrgCode;\n\t\t\t\tstrArray[1] = orgType;\n\t\t\t\treturn strArray;\n\t} \n\n\t\n\t/**\n\t * removeDepartDataById 对应 delete方法 根据ID删除相关部门数据\n\t * \n\t */\n\t/*\n\t * @Override\n\t * \n\t * @Transactional public boolean removeDepartDataById(String id) {\n\t * System.out.println(\"要删除的ID 为=============================>>>>>\"+id); boolean\n\t * flag = this.removeById(id); return flag; }\n\t */\n\n\t/**\n\t * updateDepartDataById 对应 edit 根据部门主键来更新对应的部门数据\n\t */\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic Boolean updateDepartDataById(SysDepart sysDepart, String username) {\n\t\tif (sysDepart != null && username != null) {\n\t\t\tsysDepart.setUpdateTime(new Date());\n\t\t\tsysDepart.setUpdateBy(username);\n            //验证部门类型\n            this.verifyOrgCategory(sysDepart);\n\t\t\tthis.updateById(sysDepart);\n\t\t\t//修改部门管理的时候，修改负责部门\n            this.updateChargeDepart(sysDepart);\n            //redis清除缓存key\n            redisUtil.removeAll(CommonConstant.DEPART_NAME_REDIS_KEY_PRE);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\n\t}\n\n    /**\n     * 验证部门类型\n     *\n     * @param sysDepart\n     */\n    private void verifyOrgCategory(SysDepart sysDepart) {\n        //update-begin---author:wangshuai---date:2025-08-21---for: 当部门类型为岗位的时候，需要查看是否存在下级，存在下级无法变更为岗位---\n        //如果是岗位的情况下，不能存在子级\n        if (oConvertUtils.isNotEmpty(sysDepart.getOrgCategory()) && DepartCategoryEnum.DEPART_CATEGORY_POST.getValue().equals(sysDepart.getOrgCategory())) {\n            long count = this.count(new QueryWrapper<SysDepart>().lambda().eq(SysDepart::getParentId, sysDepart.getId()));\n            if (count > 0) {\n                throw new JeecgBootBizTipException(\"当前子公司/部门下存在子级，无法变更为岗位!\");\n            }\n        }\n        //如果是子公司的情况下，则上级不能为部门或者岗位\n        if (oConvertUtils.isNotEmpty(sysDepart.getOrgCategory()) && DepartCategoryEnum.DEPART_CATEGORY_SUB_COMPANY.getValue().equals(sysDepart.getOrgCategory())\n                && oConvertUtils.isNotEmpty(sysDepart.getParentId())) {\n            LambdaQueryWrapper<SysDepart> queryWrapper = new LambdaQueryWrapper<>();\n            queryWrapper.eq(SysDepart::getId, sysDepart.getParentId());\n            queryWrapper.in(SysDepart::getOrgCategory, DepartCategoryEnum.DEPART_CATEGORY_POST.getValue(), DepartCategoryEnum.DEPART_CATEGORY_DEPART.getValue());\n            long count = this.count(queryWrapper);\n            if (count > 0) {\n                throw new JeecgBootBizTipException(\"当前父级为部门或岗位，无法变更为子公司!\");\n            }\n        }\n        //如果是部门的情况下，下级不能为子公司或者公司\n        if (oConvertUtils.isNotEmpty(sysDepart.getOrgCategory()) && DepartCategoryEnum.DEPART_CATEGORY_DEPART.getValue().equals(sysDepart.getOrgCategory())) {\n            LambdaQueryWrapper<SysDepart> queryWrapper = new LambdaQueryWrapper<>();\n            queryWrapper.eq(SysDepart::getParentId, sysDepart.getId());\n            queryWrapper.in(SysDepart::getOrgCategory, DepartCategoryEnum.DEPART_CATEGORY_COMPANY.getValue(), DepartCategoryEnum.DEPART_CATEGORY_SUB_COMPANY.getValue());\n            long count = this.count(queryWrapper);\n            if (count > 0) {\n                throw new JeecgBootBizTipException(\"当前子级存在子公司，无法变更为部门!\");\n            }\n        }\n    }\n    \n    @Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void deleteBatchWithChildren(List<String> ids) {\n\t\t//存放子级的id\n\t\tList<String> idList = new ArrayList<String>();\n\t\t//存放父级的id\n\t\tList<String> parentIdList = new ArrayList<>();\n\t\tfor(String id: ids) {\n\t\t\tidList.add(id);\n\t\t\t//此步骤是为了删除子级\n\t\t\tthis.checkChildrenExists(id, idList);\n\t\t\t// 代码逻辑说明: 【QQYUN-5757】批量删除部门时未正确置为叶子节点 ------------\n\t\t\tSysDepart depart = this.getDepartById(id);\n\t\t\tif (oConvertUtils.isNotEmpty(depart.getParentId())) {\n\t\t\t\tif (!parentIdList.contains(depart.getParentId())) {\n\t\t\t\t\tparentIdList.add(depart.getParentId());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.removeByIds(idList);\n\t\t//再删除前需要获取父级id，不然会一直为空\n\t\tthis.setParentDepartIzLeaf(parentIdList);\n\t\t//根据部门id获取部门角色id\n\t\tList<String> roleIdList = new ArrayList<>();\n\t\tLambdaQueryWrapper<SysDepartRole> query = new LambdaQueryWrapper<>();\n\t\tquery.select(SysDepartRole::getId).in(SysDepartRole::getDepartId, idList);\n\t\tList<SysDepartRole> depRoleList = sysDepartRoleMapper.selectList(query);\n\t\tfor(SysDepartRole deptRole : depRoleList){\n\t\t\troleIdList.add(deptRole.getId());\n\t\t}\n\t\t//根据部门id删除用户与部门关系\n\t\tuserDepartMapper.delete(new LambdaQueryWrapper<SysUserDepart>().in(SysUserDepart::getDepId,idList));\n\t\t//根据部门id删除部门授权\n\t\tdepartPermissionMapper.delete(new LambdaQueryWrapper<SysDepartPermission>().in(SysDepartPermission::getDepartId,idList));\n\t\t//根据部门id删除部门角色\n\t\tsysDepartRoleMapper.delete(new LambdaQueryWrapper<SysDepartRole>().in(SysDepartRole::getDepartId,idList));\n\t\tif(roleIdList != null && roleIdList.size()>0){\n\t\t\t//根据角色id删除部门角色授权\n\t\t\tdepartRolePermissionMapper.delete(new LambdaQueryWrapper<SysDepartRolePermission>().in(SysDepartRolePermission::getRoleId,roleIdList));\n\t\t\t//根据角色id删除部门角色用户信息\n\t\t\tdepartRoleUserMapper.delete(new LambdaQueryWrapper<SysDepartRoleUser>().in(SysDepartRoleUser::getDroleId,roleIdList));\n\t\t}\n        //删除岗位信息\n        this.deleteDepartPostByDepIds(idList);\n\t}\n\n\t@Override\n\tpublic List<String> getSubDepIdsByDepId(String departId) {\n\t\treturn this.baseMapper.getSubDepIdsByDepId(departId);\n\t}\n\n\t@Override\n\tpublic List<String> getMySubDepIdsByDepId(String departIds) {\n\t\t//根据部门id获取所负责部门\n\t\tString[] codeArr = this.getMyDeptParentOrgCode(departIds);\n\t\tif(codeArr==null || codeArr.length==0){\n\t\t\treturn null;\n\t\t}\n\t\treturn this.baseMapper.getSubDepIdsByOrgCodes(codeArr);\n\t}\n\n\t/**\n\t * <p>\n\t * 根据关键字搜索相关的部门数据\n\t * </p>\n\t */\n\t@Override\n\tpublic List<SysDepartTreeModel> searchByKeyWord(String keyWord, String myDeptSearch, String departIds, String orgCategory, String depIds) {\n\t\tLambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>();\n\t\tList<SysDepartTreeModel> newList = new ArrayList<>();\n\t\t//myDeptSearch不为空时为我的部门搜索，只搜索所负责部门\n\t\tif(!StringUtil.isNullOrEmpty(myDeptSearch)){\n\t\t\t//departIds 为空普通用户或没有管理部门\n\t\t\tif(StringUtil.isNullOrEmpty(departIds)){\n\t\t\t\treturn newList;\n\t\t\t}\n\t\t\t//根据部门id获取所负责部门\n\t\t\tString[] codeArr = this.getMyDeptParentOrgCode(departIds);\n\t\t\t// 代码逻辑说明: /issues/3311 当用户属于两个部门的时候，且这两个部门没有上下级关系，我的部门-部门名称查询条件模糊搜索失效！\n\t\t\tif (codeArr != null && codeArr.length > 0) {\n\t\t\t\tquery.nested(i -> {\n\t\t\t\t\tfor (String s : codeArr) {\n\t\t\t\t\t\ti.or().likeRight(SysDepart::getOrgCode, s);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tquery.eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0.toString());\n\t\t}\n\t\tquery.like(SysDepart::getDepartName, keyWord);\n        //需要根据部门类型进行数据筛选\n        if(oConvertUtils.isNotEmpty(orgCategory)){\n            query.in(SysDepart::getOrgCategory, Arrays.asList(orgCategory.split(SymbolConstant.COMMA)));\n        }else{\n            query.ne(SysDepart::getOrgCategory,DepartCategoryEnum.DEPART_CATEGORY_POST.getValue());\n        }\n        //如果前端传过来的部门id不为空的时候，说明是系统用户根据所属部门选择主岗位或者兼职岗位，需要进行数据过滤\n        if(oConvertUtils.isNotEmpty(depIds)){\n            List<String> codeList = baseMapper.getDepCodeByDepIds(Arrays.asList(depIds.split(SymbolConstant.COMMA)));\n            if(CollectionUtil.isNotEmpty(codeList)){\n                query.and(i -> {\n                    for (String code : codeList) {\n                        i.or().likeRight(SysDepart::getOrgCode,code);\n                    }\n                });\n            }\n        }\n        // 代码逻辑说明: [bugfree号]组织机构搜索回显优化--------------------\n\t\tSysDepartTreeModel model = new SysDepartTreeModel();\n\t\tList<SysDepart> departList = this.list(query);\n\t\tif(departList.size() > 0) {\n\t\t\tfor(SysDepart depart : departList) {\n\t\t\t\tmodel = new SysDepartTreeModel(depart);\n\t\t\t\tmodel.setChildren(null);\n\t\t\t\tnewList.add(model);\n\t\t\t}\n\t\t\treturn newList;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * 根据部门id删除并且删除其可能存在的子级任何部门\n\t */\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic boolean delete(String id) {\n\t\tList<String> idList = new ArrayList<>();\n\t\tidList.add(id);\n\t\tthis.checkChildrenExists(id, idList);\n\t\t//清空部门树内存\n\t\t//FindsDepartsChildrenUtil.clearDepartIdModel();\n\t\tboolean ok = this.removeByIds(idList);\n\t\t//根据部门id获取部门角色id\n\t\tList<String> roleIdList = new ArrayList<>();\n\t\tLambdaQueryWrapper<SysDepartRole> query = new LambdaQueryWrapper<>();\n\t\tquery.select(SysDepartRole::getId).in(SysDepartRole::getDepartId, idList);\n\t\tList<SysDepartRole> depRoleList = sysDepartRoleMapper.selectList(query);\n\t\tfor(SysDepartRole deptRole : depRoleList){\n\t\t\troleIdList.add(deptRole.getId());\n\t\t}\n\t\t//根据部门id删除用户与部门关系\n\t\tuserDepartMapper.delete(new LambdaQueryWrapper<SysUserDepart>().in(SysUserDepart::getDepId,idList));\n\t\t//根据部门id删除部门授权\n\t\tdepartPermissionMapper.delete(new LambdaQueryWrapper<SysDepartPermission>().in(SysDepartPermission::getDepartId,idList));\n\t\t//根据部门id删除部门角色\n\t\tsysDepartRoleMapper.delete(new LambdaQueryWrapper<SysDepartRole>().in(SysDepartRole::getDepartId,idList));\n\t\tif(roleIdList != null && roleIdList.size()>0){\n\t\t\t//根据角色id删除部门角色授权\n\t\t\tdepartRolePermissionMapper.delete(new LambdaQueryWrapper<SysDepartRolePermission>().in(SysDepartRolePermission::getRoleId,roleIdList));\n\t\t\t//根据角色id删除部门角色用户信息\n\t\t\tdepartRoleUserMapper.delete(new LambdaQueryWrapper<SysDepartRoleUser>().in(SysDepartRoleUser::getDroleId,roleIdList));\n\t\t}\n\t\treturn ok;\n\t}\n\t\n\t/**\n\t * delete 方法调用\n\t * @param id\n\t * @param idList\n\t */\n\tprivate void checkChildrenExists(String id, List<String> idList) {\t\n\t\tLambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>();\n\t\tquery.eq(SysDepart::getParentId,id);\n\t\tList<SysDepart> departList = this.list(query);\n\t\tif(departList != null && departList.size() > 0) {\n\t\t\tfor(SysDepart depart : departList) {\n\t\t\t\tidList.add(depart.getId());\n\t\t\t\tthis.checkChildrenExists(depart.getId(), idList);\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tpublic List<SysDepart> queryUserDeparts(String userId) {\n\t\tList<SysDepart> sysDeparts = baseMapper.queryUserDeparts(userId);\n\t\tsysDeparts.stream()\n\t\t\t.filter(depart -> oConvertUtils.isNotEmpty(depart) &&\n\t\t\t\t\toConvertUtils.isNotEmpty(depart.getOrgCode()))\n\t\t\t.forEach(depart -> {\n\t\t\t\tString orgCategory = depart.getOrgCategory();\n\t\t\t\tif(DepartCategoryEnum.DEPART_CATEGORY_DEPART.getValue().equalsIgnoreCase(orgCategory)){\n\t\t\t\t\tString departPathName = this.getDepartPathNameByOrgCode(depart.getOrgCode(), \"\");\n\t\t\t\t\tdepart.setDepartPathName(departPathName);\n\t\t\t\t}\n\t\t\t});\n\t\treturn sysDeparts;\n\t}\n\n\t@Override\n\tpublic List<SysDepart> queryDepartsByUsername(String username) {\n\t\treturn baseMapper.queryDepartsByUsername(username);\n\t}\n\t\n\t@Override\n\tpublic List<String> queryDepartsByUserId(String userId) {\n\t\tList<String> list = baseMapper.queryDepartsByUserId(userId);\n\t\treturn list;\n\t}\n\n\t/**\n\t * 根据用户所负责部门ids获取父级部门编码\n\t * @param departIds\n\t * @return\n\t */\n\tprivate String[] getMyDeptParentOrgCode(String departIds){\n\t\t//根据部门id查询所负责部门\n\t\tLambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>();\n\t\tquery.eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0.toString());\n\t\tif(oConvertUtils.isNotEmpty(departIds)){\n\t\t\tquery.in(SysDepart::getId, Arrays.asList(departIds.split(\",\")));\n\t\t}\n\t\t\n\t\t//------------------------------------------------------------------------------------------------\n\t\t//是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\tquery.eq(SysDepart::getTenantId, oConvertUtils.getInt(TenantContext.getTenant(), 0));\n\t\t}\n\t\t//------------------------------------------------------------------------------------------------\n\t\tquery.orderByAsc(SysDepart::getOrgCode);\n\t\tList<SysDepart> list = this.list(query);\n\t\t//查找根部门\n\t\tif(list == null || list.size()==0){\n\t\t\treturn null;\n\t\t}\n\t\tString orgCode = this.getMyDeptParentNode(list);\n\t\tString[] codeArr = orgCode.split(\",\");\n\t\treturn codeArr;\n\t}\n\n\t/**\n\t * 获取负责部门父节点\n\t * @param list\n\t * @return\n\t */\n\tprivate String getMyDeptParentNode(List<SysDepart> list){\n\t\tMap<String,String> map = new HashMap(5);\n\t\t//1.先将同一公司归类\n\t\tfor(SysDepart dept : list){\n\t\t\tString code = dept.getOrgCode().substring(0,3);\n\t\t\tif(map.containsKey(code)){\n\t\t\t\tString mapCode = map.get(code)+\",\"+dept.getOrgCode();\n\t\t\t\tmap.put(code,mapCode);\n\t\t\t}else{\n\t\t\t\tmap.put(code,dept.getOrgCode());\n\t\t\t}\n\t\t}\n\t\tStringBuffer parentOrgCode = new StringBuffer();\n\t\t//2.获取同一公司的根节点\n\t\tfor(String str : map.values()){\n\t\t\tString[] arrStr = str.split(\",\");\n\t\t\tparentOrgCode.append(\",\").append(this.getMinLengthNode(arrStr));\n\t\t}\n\t\treturn parentOrgCode.substring(1);\n\t}\n\n\t/**\n\t * 获取同一公司中部门编码长度最小的部门\n\t * @param str\n\t * @return\n\t */\n\tprivate String getMinLengthNode(String[] str){\n\t\tint min =str[0].length();\n\t\tStringBuilder orgCodeBuilder = new StringBuilder(str[0]);\n\t\tfor(int i =1;i<str.length;i++){\n\t\t\tif(str[i].length()<=min){\n\t\t\t\tmin = str[i].length();\n                orgCodeBuilder.append(SymbolConstant.COMMA).append(str[i]);\n\t\t\t}\n\t\t}\n\t\treturn orgCodeBuilder.toString();\n\t}\n    /**\n     * 获取部门树信息根据关键字\n     * @param keyWord\n     * @return\n     */\n    @Override\n    public List<SysDepartTreeModel> queryTreeByKeyWord(String keyWord) {\n        LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>();\n        query.eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0.toString());\n        query.orderByAsc(SysDepart::getDepartOrder);\n        List<SysDepart> list = this.list(query);\n        // 调用wrapTreeDataToTreeList方法生成树状数据\n        List<SysDepartTreeModel> listResult = FindsDepartsChildrenUtil.wrapTreeDataToTreeList(list);\n        List<SysDepartTreeModel> treelist =new ArrayList<>();\n        if(StringUtils.isNotBlank(keyWord)){\n            this.getTreeByKeyWord(keyWord,listResult,treelist);\n        }else{\n            return listResult;\n        }\n        return treelist;\n    }\n\n\t/**\n\t * 根据parentId查询部门树\n\t * @param parentId\n\t * @param ids 前端回显传递\n\t * @param primaryKey 主键字段（id或者orgCode）\n\t * @return\n\t */\n\t@Override\n\tpublic List<SysDepartTreeModel> queryTreeListByPid(String parentId,String ids, String primaryKey) {\n\t\tConsumer<LambdaQueryWrapper<SysDepart>> square = i -> {\n\t\t\tif (oConvertUtils.isNotEmpty(ids)) {\n\t\t\t\tif (CommonConstant.DEPART_KEY_ORG_CODE.equals(primaryKey)) {\n\t\t\t\t\ti.in(SysDepart::getOrgCode, ids.split(SymbolConstant.COMMA));\n\t\t\t\t} else {\n\t\t\t\t\ti.in(SysDepart::getId, ids.split(SymbolConstant.COMMA));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(oConvertUtils.isEmpty(parentId)){\n\t\t\t\t\ti.and(q->q.isNull(true,SysDepart::getParentId).or().eq(true,SysDepart::getParentId,\"\"));\n\t\t\t\t}else{\n\t\t\t\t\ti.eq(true,SysDepart::getParentId,parentId);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tLambdaQueryWrapper<SysDepart> lqw=new LambdaQueryWrapper<>();\n\t\t//------------------------------------------------------------------------------------------------\n\t\t//是否开启系统管理模块的 SASS 控制\n\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\tlqw.eq(SysDepart::getTenantId, oConvertUtils.getInt(TenantContext.getTenant(), 0));\n\t\t}\n\t\t//------------------------------------------------------------------------------------------------\n\t\tlqw.eq(true,SysDepart::getDelFlag,CommonConstant.DEL_FLAG_0.toString());\n        // 代码逻辑说明: 【QQYUN-13427】部门选择组件修改:需要过滤掉岗位 只保留 公司 子公司 部门---\n        lqw.ne(SysDepart::getOrgCategory,DepartCategoryEnum.DEPART_CATEGORY_POST.getValue());\n\t\tlqw.func(square);\n        // 代码逻辑说明: [VUEN-1143]排序不对，vue3和2应该都有问题，应该按照升序排------------\n\t\tlqw.orderByAsc(SysDepart::getDepartOrder);\n\t\tList<SysDepart> list = list(lqw);\n        //设置用户id,让前台显示\n        this.setUserIdsByDepList(list);\n\t\tList<SysDepartTreeModel> records = new ArrayList<>();\n\t\tfor (int i = 0; i < list.size(); i++) {\n\t\t\tSysDepart depart = list.get(i);\n            // 代码逻辑说明: 【QQYUN-13427】部门选择组件修改:需要过滤掉岗位 只保留 公司 子公司 部门---\n            long count = getNoDepartPostCount(depart.getId());\n            if(count == 0){\n                depart.setIzLeaf(CommonConstant.IS_LEAF);\n            }\n            SysDepartTreeModel treeModel = new SysDepartTreeModel(depart);\n            //TODO 异步树加载key拼接__+时间戳,以便于每次展开节点会刷新数据\n\t\t\t//treeModel.setKey(treeModel.getKey()+\"__\"+System.currentTimeMillis());\n            records.add(treeModel);\n        }\n\t\treturn records;\n\t}\n\n    /**\n     * 获取部门数量\n     * @param departId\n     * @return\n     */\n    private long getNoDepartPostCount(String departId) {\n        LambdaQueryWrapper<SysDepart> queryNoPosition = new LambdaQueryWrapper<>();\n        queryNoPosition.ne(SysDepart::getOrgCategory,DepartCategoryEnum.DEPART_CATEGORY_POST.getValue());\n        queryNoPosition.eq(SysDepart::getParentId,departId);\n        return this.count(queryNoPosition);\n    }\n\n    /**\n     * 部门管理异步树\n     *\n     * @param parentId\n     * @param ids\n     * @param primaryKey\n     * @param departIds\n     * @return\n     */\n    @Override\n    public List<SysDepartTreeModel> queryDepartAndPostTreeSync(String parentId, String ids, String primaryKey, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   String departIds, String orgName) {\n        Consumer<LambdaQueryWrapper<SysDepart>> square = i -> {\n            if (oConvertUtils.isNotEmpty(ids)) {\n                if (CommonConstant.DEPART_KEY_ORG_CODE.equals(primaryKey)) {\n                    i.in(SysDepart::getOrgCode, ids.split(SymbolConstant.COMMA));\n                } else {\n                    i.in(SysDepart::getId, ids.split(SymbolConstant.COMMA));\n                }\n            } else {\n                if(oConvertUtils.isEmpty(parentId)){\n                    // 代码逻辑说明: 如果前端传过来的部门id不为空的时候，说明是系统用户根据所属部门选择主岗位或者兼职岗位---\n                    if(oConvertUtils.isNotEmpty(departIds)){\n                        i.in(SysDepart::getId,Arrays.asList(departIds.split(SymbolConstant.COMMA)));\n                    }else{\n\t\t\t\t\t\tif(oConvertUtils.isEmpty(orgName)){\n                        \ti.and(q->q.isNull(true,SysDepart::getParentId).or().eq(true,SysDepart::getParentId,\"\"));\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\ti.like(SysDepart::getDepartName, orgName);\n\t\t\t\t\t\t}\n                    }\n                }else{\n                    i.eq(true,SysDepart::getParentId,parentId);\n                }\n            }\n        };\n        LambdaQueryWrapper<SysDepart> lqw=new LambdaQueryWrapper<>();\n        //是否开启系统管理模块的 SASS 控制\n        if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n            lqw.eq(SysDepart::getTenantId, oConvertUtils.getInt(TenantContext.getTenant(), 0));\n        }\n        lqw.eq(true,SysDepart::getDelFlag,CommonConstant.DEL_FLAG_0.toString());\n        lqw.func(square);\n        lqw.orderByAsc(SysDepart::getDepartOrder);\n        List<SysDepart> list = list(lqw);\n        //设置用户id,让前台显示\n        this.setUserIdsByDepList(list);\n        List<String> departIdList = new ArrayList<>();\n        //如果前端传过来的部门id不为空的时候，说明是系统用户根据所属部门选择主岗位或者兼职岗位\n        if(oConvertUtils.isNotEmpty(departIds) && oConvertUtils.isEmpty(parentId)){\n            departIdList = list.stream().map(SysDepart::getId).toList();\n        }\n        List<SysDepartTreeModel> records = new ArrayList<>();\n        for (int i = 0; i < list.size(); i++) {\n            SysDepart depart = list.get(i);\n            //如果部门id和父级部门id再同一列的时候，不用添加到树结构里面去了\n            if(oConvertUtils.isNotEmpty(departIds) && oConvertUtils.isEmpty(parentId)\n               && departIdList.contains(depart.getParentId())){\n                continue;\n            }\n            SysDepartTreeModel treeModel = new SysDepartTreeModel(depart);\n            records.add(treeModel);\n        }\n        return records;\n    }\n\n\t@Override\n\tpublic JSONObject queryAllParentIdByDepartId(String departId) {\n\t\tJSONObject result = new JSONObject();\n\t\tfor (String id : departId.split(SymbolConstant.COMMA)) {\n\t\t\tJSONObject all = this.queryAllParentId(\"id\", id);\n\t\t\tresult.put(id, all);\n\t\t}\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic JSONObject queryAllParentIdByOrgCode(String orgCode) {\n\t\tJSONObject result = new JSONObject();\n\t\tfor (String code : orgCode.split(SymbolConstant.COMMA)) {\n\t\t\tJSONObject all = this.queryAllParentId(\"org_code\", code);\n\t\t\tresult.put(code, all);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * 查询某个部门的所有父ID信息\n\t *\n\t * @param fieldName 字段名\n\t * @param value     值\n\t */\n\tprivate JSONObject queryAllParentId(String fieldName, String value) {\n\t\tJSONObject data = new JSONObject();\n\t\t// 父ID集合，有序\n\t\tdata.put(\"parentIds\", new JSONArray());\n\t\t// 父ID的部门数据，key是id，value是数据\n\t\tdata.put(\"parentMap\", new JSONObject());\n\t\tthis.queryAllParentIdRecursion(fieldName, value, data);\n\t\treturn data;\n\t}\n\n\t/**\n\t * 递归调用查询父部门接口\n\t */\n\tprivate void queryAllParentIdRecursion(String fieldName, String value, JSONObject data) {\n\t\tQueryWrapper<SysDepart> queryWrapper = new QueryWrapper<>();\n\t\tqueryWrapper.eq(fieldName, value);\n\t\tSysDepart depart = super.getOne(queryWrapper);\n\t\tif (depart != null) {\n\t\t\tdata.getJSONArray(\"parentIds\").add(0, depart.getId());\n\t\t\tdata.getJSONObject(\"parentMap\").put(depart.getId(), depart);\n\t\t\tif (oConvertUtils.isNotEmpty(depart.getParentId())) {\n\t\t\t\tthis.queryAllParentIdRecursion(\"id\", depart.getParentId(), data);\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tpublic SysDepart queryCompByOrgCode(String orgCode) {\n\t\tint length = YouBianCodeUtil.ZHANWEI_LENGTH;\n\t\tString compyOrgCode = orgCode.substring(0,length);\n\t\treturn this.baseMapper.queryCompByOrgCode(compyOrgCode);\n\t}\n\t/**\n\t * 根据id查询下级部门\n\t * @param pid\n\t * @return\n\t */\n\t@Override\n\tpublic List<SysDepart> queryDeptByPid(String pid) {\n\t\treturn this.baseMapper.queryDeptByPid(pid);\n\t}\n\t/**\n     * 根据关键字筛选部门信息\n     * @param keyWord\n     * @return\n     */\n    public void getTreeByKeyWord(String keyWord,List<SysDepartTreeModel> allResult,List<SysDepartTreeModel>  newResult){\n        for (SysDepartTreeModel model:allResult) {\n            if (model.getDepartName().contains(keyWord)){\n                newResult.add(model);\n                continue;\n            }else if(model.getChildren()!=null){\n                getTreeByKeyWord(keyWord,model.getChildren(),newResult);\n            }\n        }\n    }\n    \n    /**\n     * 通过用户id设置负责部门\n     * @param sysDepart SysDepart部门对象\n     * @param userIds 多个负责用户id\n     */\n    public void addDepartByUserIds(SysDepart sysDepart, String userIds) {\n        //获取部门id,保存到用户\n        String departId = sysDepart.getId();\n        //循环用户id\n        String[] userIdArray = userIds.split(\",\");\n        for (String userId:userIdArray) {\n            //查询用户表增加负责部门\n            SysUser sysUser = sysUserMapper.selectById(userId);\n            //如果部门id不为空，那么就需要拼接\n            if(oConvertUtils.isNotEmpty(sysUser.getDepartIds())){\n                if(!sysUser.getDepartIds().contains(departId)) {\n                    sysUser.setDepartIds(sysUser.getDepartIds() + \",\" + departId);\n                }\n            }else{\n                sysUser.setDepartIds(departId);\n            }\n            //设置身份为上级\n            sysUser.setUserIdentity(CommonConstant.USER_IDENTITY_2);\n            //跟新用户表\n            sysUserMapper.updateById(sysUser);\n            //判断当前用户是否包含所属部门\n            List<SysUserDepart> userDepartList = userDepartMapper.getUserDepartByUid(userId);\n            boolean isExistDepId = userDepartList.stream().anyMatch(item -> departId.equals(item.getDepId()));\n            //如果不存在需要设置所属部门\n            if(!isExistDepId){\n                userDepartMapper.insert(new SysUserDepart(userId,departId));\n            }\n        }\n    }\n    \n    /**\n     * 修改用户负责部门\n     * @param sysDepart SysDepart对象\n     */\n    private void updateChargeDepart(SysDepart sysDepart) {\n        //新的用户id\n        String directorIds = sysDepart.getDirectorUserIds();\n        //旧的用户id（数据库中存在的）\n        String oldDirectorIds = sysDepart.getOldDirectorUserIds();\n        String departId = sysDepart.getId();\n        //如果用户id为空,那么用户的负责部门id应该去除\n        if(oConvertUtils.isEmpty(directorIds)){\n            this.deleteChargeDepId(departId,null);\n        }else if(oConvertUtils.isNotEmpty(directorIds) && oConvertUtils.isEmpty(oldDirectorIds)){\n            //如果用户id不为空但是用户原来负责部门的用户id为空\n            this.addDepartByUserIds(sysDepart,directorIds);\n        }else{\n            //都不为空，需要比较，进行添加或删除\n            //找到新的负责部门用户id与原来负责部门的用户id，进行删除\n            List<String> userIdList = Arrays.stream(oldDirectorIds.split(\",\")).filter(item -> !directorIds.contains(item)).collect(Collectors.toList());\n            for (String userId:userIdList){\n                this.deleteChargeDepId(departId,userId);\n            }\n            //找到原来负责部门的用户id与新的负责部门用户id，进行新增\n            String addUserIds = Arrays.stream(directorIds.split(\",\")).filter(item -> !oldDirectorIds.contains(item)).collect(Collectors.joining(\",\"));\n            if(oConvertUtils.isNotEmpty(addUserIds)){\n                this.addDepartByUserIds(sysDepart,addUserIds); \n            }\n        }\n    }\n\n    /**\n     * 删除用户负责部门\n     * @param departId 部门id\n     * @param userId 用户id\n     */\n    private void deleteChargeDepId(String departId,String userId){\n        //先查询负责部门的用户id,因为负责部门的id使用逗号拼接起来的\n        LambdaQueryWrapper<SysUser> query = new LambdaQueryWrapper<>();\n        query.like(SysUser::getDepartIds,departId);\n        //删除全部的情况下用户id不存在\n        if(oConvertUtils.isNotEmpty(userId)){\n            query.eq(SysUser::getId,userId); \n        }\n        List<SysUser> userList = sysUserMapper.selectList(query);\n        for (SysUser sysUser:userList) {\n            //将不存在的部门id删除掉\n            String departIds = sysUser.getDepartIds();\n            List<String> list = new ArrayList<>(Arrays.asList(departIds.split(\",\")));\n            list.remove(departId);\n            //删除之后再将新的id用逗号拼接起来进行更新\n            String newDepartIds = String.join(\",\",list);\n            sysUser.setDepartIds(newDepartIds);\n            sysUserMapper.updateById(sysUser);\n        }\n    }\n\n    /**\n     * 通过部门集合为部门设置用户id，用于前台展示\n     * @param departList 部门集合\n     */\n    private void setUserIdsByDepList(List<SysDepart> departList) {\n        //查询负责部门不为空的情况\n        LambdaQueryWrapper<SysUser> query  = new LambdaQueryWrapper<>();\n        query.isNotNull(SysUser::getDepartIds);\n        List<SysUser> users = sysUserMapper.selectList(query);\n        Map<String,Object> map = new HashMap(5);\n        //先循环一遍找到不同的负责部门id\n        for (SysUser user:users) {\n            String departIds = user.getDepartIds();\n            String[] departIdArray = departIds.split(\",\");\n            for (String departId:departIdArray) {\n                //mao中包含部门key，负责用户直接拼接\n                if(map.containsKey(departId)){\n                    String userIds = map.get(departId) + \",\" + user.getId();\n                    map.put(departId,userIds);\n                }else{\n                    map.put(departId,user.getId());  \n                }\n            }\n        }\n        //循环部门集合找到部门id对应的负责用户\n        for (SysDepart sysDepart:departList) {\n            if(map.containsKey(sysDepart.getId())){\n                sysDepart.setDirectorUserIds(map.get(sysDepart.getId()).toString()); \n            }\n        }\n    }\n\n    /**\n     * 获取我的部门已加入的公司\n     * @return\n     */\n    @Override\n    public List<SysDepart> getMyDepartList() {\n        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        String userId = user.getId();\n        //字典code集合\n        List<String> list = new ArrayList<>();\n        //查询我加入的部门\n        List<SysDepart> sysDepartList = this.baseMapper.queryUserDeparts(userId);\n        for (SysDepart sysDepart : sysDepartList) {\n            //获取一级部门编码\n            String orgCode = sysDepart.getOrgCode();\n            if (YouBianCodeUtil.ZHANWEI_LENGTH <= orgCode.length()) {\n                int length = YouBianCodeUtil.ZHANWEI_LENGTH;\n                String companyOrgCode = orgCode.substring(0, length);\n                list.add(companyOrgCode);\n            }\n        }\n        //字典code集合不为空\n        if (oConvertUtils.isNotEmpty(list)) {\n            //查询一级部门的数据\n            LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<>();\n            query.select(SysDepart::getDepartName, SysDepart::getId, SysDepart::getOrgCode);\n            query.eq(SysDepart::getDelFlag, String.valueOf(CommonConstant.DEL_FLAG_0));\n            query.in(SysDepart::getOrgCode, list);\n            return this.baseMapper.selectList(query);\n        }\n        return null;\n    }\n\n\t@Override\n\tpublic void deleteDepart(String id) {\n    \t//删除部门设置父级的叶子结点\n\t\tthis.setIzLeaf(id);\n\t\tthis.delete(id);\n\t\t//删除部门用户关系表\n\t\tLambdaQueryWrapper<SysUserDepart> query = new LambdaQueryWrapper<SysUserDepart>()\n\t\t\t\t.eq(SysUserDepart::getDepId, id);\n\t\tthis.userDepartMapper.delete(query);\n\t}\n\n\t@Override\n\tpublic List<SysDepartTreeModel> queryBookDepTreeSync(String parentId, Integer tenantId, String departName) {\n\t\tList<SysDepart> list = departMapper.queryBookDepTreeSync(parentId,tenantId,departName);\n\t\tList<SysDepartTreeModel> records = new ArrayList<>();\n\t\tfor (int i = 0; i < list.size(); i++) {\n\t\t\tSysDepart depart = list.get(i);\n\t\t\tSysDepartTreeModel treeModel = new SysDepartTreeModel(depart);\n\t\t\trecords.add(treeModel);\n\t\t}\n\t\treturn records;\n\t}\n\n\t@Override\n\tpublic SysDepart getDepartById(String id) {\n\t\treturn departMapper.getDepartById(id);\n\t}\n\n\t@Override\n\tpublic IPage<SysDepart> getMaxCodeDepart(Page<SysDepart> page, String parentId) {\n\t\treturn page.setRecords(departMapper.getMaxCodeDepart(page,parentId));\n\t}\n\n\t@Override\n\tpublic void updateIzLeaf(String id, Integer izLeaf) {\n\t\tdepartMapper.setMainLeaf(id,izLeaf);\n\t}\n\n\t/**\n\t * 设置父级节点是否存在叶子结点\n\t * @param id\n\t */\n\tprivate void setIzLeaf(String id) {\n\t\tSysDepart depart = this.getDepartById(id);\n\t\tString parentId = depart.getParentId();\n\t\tif(oConvertUtils.isNotEmpty(parentId)){\n\t\t\tLong count = this.count(new QueryWrapper<SysDepart>().lambda().eq(SysDepart::getParentId, parentId));\n\t\t\tif(count == 1){\n\t\t\t\t//若父节点无其他子节点，则该父节点是叶子节点\n\t\t\t\tdepartMapper.setMainLeaf(parentId, CommonConstant.IS_LEAF);\n\t\t\t}\n\t\t}\n\t}\n\n\t//========================begin 零代码下部门与人员导出 ==================================================================\n\n\t@Override\n\tpublic List<ExportDepartVo> getExcelDepart(int tenantId) {\n\t\t//获取父级部门\n\t\tList<ExportDepartVo> parentDepart = departMapper.getDepartList(\"\",tenantId);\n\t\t//子部门\n\t\tList<ExportDepartVo> childrenDepart = new ArrayList<>();\n\t\t//把一级部门名称放在里面\n\t\tList<ExportDepartVo> exportDepartVoList = new ArrayList<>();\n\t\t//存放部门一级id避免重复\n\t\tList<String> departIdList = new ArrayList<>();\n\t\tfor (ExportDepartVo departVo:parentDepart) {\n\t\t\tdepartIdList.add(departVo.getId());\n\t\t\tdepartVo.setDepartNameUrl(departVo.getDepartName());\n\t\t\texportDepartVoList.add(departVo);\n\t\t\t//创建路径\n\t\t\tList<String> path = new ArrayList<>();\n\t\t\tpath.add(departVo.getDepartName());\n\t\t\t//创建子部门路径\n\t\t\tfindPath(departVo, path, tenantId,childrenDepart,departIdList);\n\t\t\tpath.clear();\n\t\t}\n\t\texportDepartVoList.addAll(childrenDepart);\n\t\tchildrenDepart.clear();\n\t\tdepartIdList.clear();\n\t\treturn exportDepartVoList;\n\t}\n\n\t/**\n\t * 寻找部门路径\n\t * @param departVo 部门vo\n\t * @param path 部门路径\n\t * @param tenantId 租户id\n\t * @param childrenDepart 子部门\n\t * @param departIdList 部门id集合\n\t */\n\tprivate void findPath(ExportDepartVo departVo, List<String> path,Integer tenantId,List<ExportDepartVo> childrenDepart,List<String> departIdList) {\n\t\t//获取租户id和部门父id获取的部门数据\n\t\tList<ExportDepartVo> departList = departMapper.getDepartList(departVo.getId(), tenantId);\n\t\t//部门为空判断\n\t\tif (departList == null || departList.size() <= 0) {\n\t\t\tif(!departIdList.contains(departVo.getId())){\n\t\t\t\tdepartVo.setDepartNameUrl(String.join(SymbolConstant.SINGLE_SLASH,path));\n\t\t\t\tchildrenDepart.add(departVo);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tfor (int i = 0; i < departList.size(); i++) {\n\t\t\tExportDepartVo exportDepartVo = departList.get(i);\n\t\t\t//存放子级路径\n\t\t\tList<String> cPath = new ArrayList<>();\n\t\t\tcPath.addAll(path);\n\t\t\tcPath.add(exportDepartVo.getDepartName());\n\t\t\tif(!departIdList.contains(departVo.getId())){\n\t\t\t\tdepartIdList.add(departVo.getId());\n\t\t\t\tdepartVo.setDepartNameUrl(String.join(SymbolConstant.SINGLE_SLASH,path));\n\t\t\t\tchildrenDepart.add(departVo);\n\t\t\t}\n\t\t\tfindPath(exportDepartVo,cPath ,tenantId, childrenDepart,departIdList);\n\t\t}\n\t}\n\t//========================end 零代码下部门与人员导出 ==================================================================\n\n\t//========================begin 零代码下部门与人员导入 ==================================================================\n\t@Override\n\tpublic void importExcel(List<ExportDepartVo> listSysDeparts, List<String> errorMessageList) {\n\t\tint num = 0;\n\t\tint tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n\t\t\n\t\t//部门路径排序\n\t\tCollections.sort(listSysDeparts, new Comparator<ExportDepartVo>() {\n\t\t\t@Override\n\t\t\tpublic int compare(ExportDepartVo o1, ExportDepartVo o2) {\n\t\t\t\tif(oConvertUtils.isNotEmpty(o1.getDepartNameUrl()) && oConvertUtils.isNotEmpty(o2.getDepartNameUrl())){\n\t\t\t\t\tint oldLength = o1.getDepartNameUrl().split(SymbolConstant.SINGLE_SLASH).length;\n\t\t\t\t\tint newLength = o2.getDepartNameUrl().split(SymbolConstant.SINGLE_SLASH).length;\n\t\t\t\t\treturn oldLength - newLength;\n\t\t\t\t}else{\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t//存放部门数据的map\n\t\tMap<String,SysDepart> departMap = new HashMap<>();\n\t\t//循环第二遍导入数据\n\t\tfor (ExportDepartVo exportDepartVo : listSysDeparts) {\n\t\t\tSysDepart sysDepart = new SysDepart();\n\t\t\t// orgCode编码长度\n\t\t\tint codeLength = YouBianCodeUtil.ZHANWEI_LENGTH;\n\t\t\tBoolean izExport = false;\n\t\t\ttry {\n\t\t\t\tizExport = this.addDepartByName(exportDepartVo.getDepartNameUrl(),exportDepartVo.getDepartName(),sysDepart,errorMessageList,tenantId,departMap,num);\n\t\t\t} catch (Exception e) {\n\t\t\t\t//没有查找到parentDept\n\t\t\t}\n\t\t\t//没有错误的时候才会导入数据\n\t\t\tif(izExport){\n\t\t\t\tsysDepart.setOrgType(sysDepart.getOrgCode().length()/codeLength+\"\");\n\t\t\t\tsysDepart.setDelFlag(CommonConstant.DEL_FLAG_0.toString());\n\t\t\t\tsysDepart.setOrgCategory(\"1\");\n\t\t\t\tsysDepart.setTenantId(tenantId);\n\t\t\t\tImportExcelUtil.importDateSaveOne(sysDepart, ISysDepartService.class, errorMessageList, num, CommonConstant.SQL_INDEX_UNIQ_DEPART_ORG_CODE);\n\t\t\t\tdepartMap.put(exportDepartVo.getDepartNameUrl(),sysDepart);\n\t\t\t}\n\t\t\tnum++;\n\t\t}\n\t}\n\n\t/**\n\t * 添加部门\n\t * @param departNameUrl 部门路径\n\t * @param departName 部门名称\n\t * @param sysDepart 部门类\n\t * @param errorMessageList 错误集合\n\t * @param tenantId 租户id\n\t * @param departMap 部门数组。避免存在部门信息再次查询 key 存放部门路径 value 存放部门对象\n\t * @param num 判断第几行有错误信息\n\t */\n\tprivate Boolean addDepartByName(String departNameUrl,String departName,SysDepart sysDepart,List<String> errorMessageList,Integer tenantId,Map<String,SysDepart> departMap, int num) {\n\t\tint lineNumber = num + 1;\n\t\tif(oConvertUtils.isEmpty(departNameUrl) && oConvertUtils.isEmpty(departName)){\n\t\t\t//部门路径为空\n\t\t\terrorMessageList.add(\"第 \" + lineNumber + \" 行：记录部门路径或者部门名称为空禁止导入\");\n\t\t\treturn false;\n\t\t}\n\t\t//获取部门名称路径\n\t\tString name = \"\";\n\t\tif(departNameUrl.contains(SymbolConstant.SINGLE_SLASH)){\n\t\t\t//获取分割的部门名称\n\t\t\tname = departNameUrl.substring(departNameUrl.lastIndexOf(SymbolConstant.SINGLE_SLASH)+1);\n\t\t}else{\n\t\t\tname = departNameUrl;\n\t\t}\n\t\t\n\t\tif(!name.equals(departName)){\n\t\t\t//部门名称已存在\n\t\t\terrorMessageList.add(\"第 \" + lineNumber + \" 行：记录部门路径:”\"+departNameUrl+\"“\"+\"和部门名称：“\"+departName+\"“不一致，请检查！\");\n\t\t\treturn false;\n\t\t}else{\n\t\t\tString parentId = \"\";\n\t\t\t//判断是否包含“/”\n\t\t\tif(departNameUrl.contains(SymbolConstant.SINGLE_SLASH)){\n\t\t\t\t//获取最后一个斜杠之前的路径\n\t\t\t\tString departNames = departNameUrl.substring(0,departNameUrl.lastIndexOf(SymbolConstant.SINGLE_SLASH));\n\t\t\t\t//判断是否已经包含部门路径\n\t\t\t\tif(departMap.containsKey(departNames)){\n\t\t\t\t\tSysDepart depart = departMap.get(departNames);\n\t\t\t\t\tif(null != depart){\n\t\t\t\t\t\tparentId = depart.getId();\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\t//分割斜杠路径，查看数据库中是否存在此路径\n\t\t\t\t\tString[] departNameUrls = departNameUrl.split(SymbolConstant.SINGLE_SLASH);\n\t\t\t\t\tString departUrlName = departNameUrls[0];\n\t\t\t\t\t//判断是否为最后一位\n\t\t\t\t\tint count = 0;\n\t\t\t\t\tSysDepart depart  = new SysDepart();\n\t\t\t\t\tdepart.setId(\"\");\n\t\t\t\t\tString parentIdByName = this.getDepartListByName(departUrlName,tenantId,depart,departNameUrls,count,departNameUrls.length-1,name,departMap);\n\t\t\t\t\t//如果parentId不为空\n\t\t\t\t\tif(oConvertUtils.isNotEmpty(parentIdByName)){\n\t\t\t\t\t\tparentId = parentIdByName;\n\t\t\t\t\t}else{\n\t\t\t\t\t\t//部门名称已存在\n\t\t\t\t\t\terrorMessageList.add(\"第 \" + lineNumber + \" 行：记录部门名称“\"+departName+\"”上级不存在，请检查！\");\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t//查询部门名称是否已存在\n\t\t\tSysDepart parentDept = null;\n\t\t\t// 代码逻辑说明: 一个租户部门名称可能有多个------------\n\t\t\tList<SysDepart> sysDepartList = departMapper.getDepartByName(departName,tenantId,parentId);\n\t\t\tif(CollectionUtil.isNotEmpty(sysDepartList)){\n\t\t\t\tparentDept = sysDepartList.get(0);\n\t\t\t}\n\t\t\tif(null != parentDept) {\n\t\t\t\t//部门名称已存在\n\t\t\t\terrorMessageList.add(\"第 \" + lineNumber + \" 行：记录部门名称“\"+departName+\"”已存在，请检查！\");\n\t\t\t\treturn false;\n\t\t\t}else{\n\t\t\t\tPage<SysDepart> page = new Page<>(1,1);\n\t\t\t\t//需要获取父级id，查看父级是否已经存在\n\t\t\t\t//获取一级部门的最大orgCode\n\t\t\t\tList<SysDepart> records = departMapper.getMaxCodeDepart(page, parentId);\n\t\t\t\tString newOrgCode = \"\";\n\t\t\t\tif(CollectionUtil.isNotEmpty(records)){\n\t\t\t\t\tnewOrgCode = YouBianCodeUtil.getNextYouBianCode(records.get(0).getOrgCode());\n\t\t\t\t}else{\n\t\t\t\t\t//查询父id\n\t\t\t\t\tif(oConvertUtils.isNotEmpty(parentId)){\n\t\t\t\t\t\tSysDepart departById = departMapper.getDepartById(parentId);\n\t\t\t\t\t\tnewOrgCode = YouBianCodeUtil.getSubYouBianCode(departById.getOrgCode(), null);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tnewOrgCode = YouBianCodeUtil.getNextYouBianCode(null);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(oConvertUtils.isNotEmpty(parentId)){\n\t\t\t\t\tthis.updateIzLeaf(parentId,CommonConstant.NOT_LEAF);\n\t\t\t\t\tsysDepart.setParentId(parentId);\n\t\t\t\t}\n\t\t\t\tsysDepart.setOrgCode(newOrgCode);\n\t\t\t\tsysDepart.setDepartName(departName);\n\t\t\t\treturn true;\n\t\t\t}\n\t\n\t\t}\n\t}\n\n\t/**\n\t * 获取部门名称url（下级）\n\t * @param departName 部门名称\n\t * @param tenantId 租户id\n\t * @param sysDepart 部门对象\n\t * @param count 部门路径下标\n\t * @param departNameUrls 部门路径\n\t * @param departNum 部门路径的数量\n\t * @param name 部门路径的数量\n\t * @param departMap 存放部门的数据 key 存放部门路径 value 存放部门对象\n\t */\n\tprivate String getDepartListByName(String departName, Integer tenantId, SysDepart sysDepart,String[] departNameUrls, int count, int departNum,String name,Map<String,SysDepart> departMap) {\n\t\t//递归查找下一级\n\t\t// 代码逻辑说明: 一个租户部门名称可能有多个------------\n\t\tSysDepart parentDept = null;\n\t\tList<SysDepart> departList = departMapper.getDepartByName(departName,tenantId,sysDepart.getId());\n\t\tif(CollectionUtil.isNotEmpty(departList)){\n\t\t\tparentDept = departList.get(0);\n\t\t}\n\t\t//判断是否包含/\n\t\tif(oConvertUtils.isNotEmpty(name)){\n\t\t\tname = name + SymbolConstant.SINGLE_SLASH + departName;\n\t\t}else{\n\t\t\tname = departName;\n\t\t}\n\t\tif(null != parentDept){\n\t\t\t//如果名称路径key不再在，添加一个，避免再次查询\n\t\t\tif(!departMap.containsKey(name)){\n\t\t\t\tdepartMap.put(name,parentDept);\n\t\t\t}\n\t\t\t//查询出来的部门名称和部门路径中的部门名称作比较，如果不存在直接返回空\n\t\t\tif(parentDept.getDepartName().equals(departNameUrls[count])){\n\t\t\t\tcount = count + 1;\n\t\t\t\t//数量和部门数量相等说明已经到最后一位了，直接返回部门id\n\t\t\t\tif(count == departNum){\n\t\t\t\t\treturn parentDept.getId();\n\t\t\t\t}else{\n\t\t\t\t\treturn this.getDepartListByName(departNameUrls[count],tenantId,parentDept,departNameUrls,count,departNum,name,departMap);\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t}else{\n\t\t\treturn \"\";\n\t\t}\n\t}\n\t//========================end 零代码下部门与人员导入 ==================================================================\n\n\t/**\n\t * 清空部门id\n\t *\n\t * @param parentIdList\n\t */\n\tprivate void setParentDepartIzLeaf(List<String> parentIdList) {\n\t\tif (CollectionUtil.isNotEmpty(parentIdList)) {\n\t\t\tfor (String parentId : parentIdList) {\n\t\t\t\t//查询父级id没有子级的时候跟新为叶子节点\n\t\t\t\tLambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<>();\n\t\t\t\tquery.eq(SysDepart::getParentId, parentId);\n\t\t\t\tLong count = departMapper.selectCount(query);\n\t\t\t\t//当子级都不存在时，设置当前部门为叶子节点\n\t\t\t\tif (count == 0) {\n\t\t\t\t\tdepartMapper.setMainLeaf(parentId, CommonConstant.IS_LEAF);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t//========================begin 系统下部门与人员导入 ==================================================================\n\t/**\n\t * 系统部门导出\n\t * @param tenantId\n\t * @param idList 需要查询部门sql的id集合\n\t * @return\n\t */\n\t@Override\n\tpublic List<SysDepartExportVo> getExportDepart(Integer tenantId, List<String> idList) {\n        String parentId = \"\";\n        if(CollectionUtil.isEmpty(idList)){\n            //-1代表父级部门为空的数据\n            parentId = \"-1\";\n        }\n\t\t//获取父级部门\n\t\tList<SysDepartExportVo> parentDepart = departMapper.getSysDepartList(parentId, tenantId, idList);\n\t\t//子部门\n\t\tList<SysDepartExportVo> childrenDepart = new ArrayList<>();\n\t\t//把一级部门名称放在里面\n\t\tList<SysDepartExportVo> exportDepartVoList = new ArrayList<>();\n\t\t//存放部门一级id避免重复\n\t\tList<String> departIdList = new ArrayList<>();\n\t\tfor (SysDepartExportVo sysDepart : parentDepart) {\n            if(CollectionUtil.isNotEmpty(departIdList) && departIdList.contains(sysDepart.getId())){\n                continue;\n            }\n\t\t\t//step 1.添加第一级部门\n\t\t\tdepartIdList.add(sysDepart.getId());\n\t\t\tsysDepart.setDepartNameUrl(sysDepart.getDepartName());\n\t\t\texportDepartVoList.add(sysDepart);\n\t\t\t//step 2.添加自己部门路径，用/分离\n\t\t\t//创建路径\n\t\t\tList<String> path = new ArrayList<>();\n\t\t\tpath.add(sysDepart.getDepartName());\n\t\t\t//创建子级部门路径\n            // 代码逻辑说明: 【JHHB-222】导出，选中最顶级部门，只能导出选中的部门---\n\t\t\tfindSysDepartPath(sysDepart, path, tenantId, childrenDepart, departIdList);\n\t\t\tpath.clear();\n\t\t}\n\t\texportDepartVoList.addAll(childrenDepart);\n\t\tchildrenDepart.clear();\n\t\tdepartIdList.clear();\n\t\treturn exportDepartVoList;\n\t}\n\n\t/**\n\t * 系统部门导入\n\t * @param listSysDeparts\n\t * @param errorMessageList\n\t */\n\t@Override\n\tpublic void importSysDepart(List<SysDepartExportVo> listSysDeparts, List<String> errorMessageList) {\n\t\tint num = 0;\n\t\tint tenantId = 0;\n\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n\t\t\ttenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n\t\t}\n\t\t//部门路径排序\n\t\tCollections.sort(listSysDeparts, new Comparator<SysDepartExportVo>() {\n\t\t\t@Override\n\t\t\tpublic int compare(SysDepartExportVo o1, SysDepartExportVo o2) {\n\t\t\t\tif(oConvertUtils.isNotEmpty(o1.getDepartNameUrl()) && oConvertUtils.isNotEmpty(o2.getDepartNameUrl())){\n\t\t\t\t\tint oldLength = o1.getDepartNameUrl().split(SymbolConstant.SINGLE_SLASH).length;\n\t\t\t\t\tint newLength = o2.getDepartNameUrl().split(SymbolConstant.SINGLE_SLASH).length;\n\t\t\t\t\treturn oldLength - newLength;\n\t\t\t\t}else{\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t//存放部门数据的map\n\t\tMap<String,SysDepart> departMap = new HashMap<>();\n\t\t// orgCode编码长度\n\t\tint codeLength = YouBianCodeUtil.ZHANWEI_LENGTH;\n\t\t//循环第二遍导入数据\n\t\tfor (SysDepartExportVo departExportVo : listSysDeparts) {\n\t\t\tSysDepart sysDepart = new SysDepart();\n\t\t\tboolean izExport = false;\n\t\t\ttry {\n\t\t\t\tizExport = this.addDepartByName(departExportVo.getDepartNameUrl(),departExportVo.getDepartName(),sysDepart,errorMessageList,tenantId,departMap,num);\n\t\t\t} catch (Exception e) {\n\t\t\t\t//没有查找到parentDept\n\t\t\t}\n\t\t\t//没有错误的时候才会导入数据\n\t\t\tif(izExport){\n\t\t\t\tif(oConvertUtils.isNotEmpty(departExportVo.getOrgCode())){\n\t\t\t\t\tSysDepart depart = this.baseMapper.queryCompByOrgCode(departExportVo.getOrgCode());\n\t\t\t\t\tif(null != depart){\n\t\t\t\t\t\tif(oConvertUtils.isNotEmpty(sysDepart.getParentId())){\n\t\t\t\t\t\t\t//更新上级部门为叶子节点\n\t\t\t\t\t\t\tthis.updateIzLeaf(sysDepart.getParentId(),CommonConstant.IS_LEAF);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//部门名称已存在\n\t\t\t\t\t\terrorMessageList.add(\"第 \" + num + \" 行：记录部门名称“\"+departExportVo.getDepartName()+\"”部门编码重复，请检查！\");\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tString departNameUrl = departExportVo.getDepartNameUrl();\n\t\t\t\t\t//包含/说明是多级\n\t\t\t\t\tif(departNameUrl.contains(SymbolConstant.SINGLE_SLASH)){\n\t\t\t\t\t\t//判断添加部门的规则是否和生成的一致\n\t\t\t\t\t\tif(!sysDepart.getOrgCode().equals(departExportVo.getOrgCode())){\n\t\t\t\t\t\t\tif(oConvertUtils.isNotEmpty(sysDepart.getParentId())){\n\t\t\t\t\t\t\t\t//更新上级部门为叶子节点\n\t\t\t\t\t\t\t\tthis.updateIzLeaf(sysDepart.getParentId(),CommonConstant.IS_LEAF);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t//部门名称已存在\n\t\t\t\t\t\t\terrorMessageList.add(\"第 \" + num + \" 行：记录部门名称“\"+departExportVo.getDepartName()+\"”部门编码规则不匹配，请检查！\");\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tsysDepart.setOrgCode(departExportVo.getOrgCode());\n\t\t\t\t\tif(oConvertUtils.isNotEmpty(sysDepart.getParentId())){\n\t\t\t\t\t    //上级\n\t\t\t\t\t\tsysDepart.setOrgType(\"2\");\n\t\t\t\t\t}else{\n\t\t\t\t\t\t//下级\n\t\t\t\t\t\tsysDepart.setOrgType(\"1\");\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\tsysDepart.setOrgType(sysDepart.getOrgCode().length()/codeLength+\"\");\n\t\t\t\t}\n\t\t\t\tsysDepart.setDelFlag(CommonConstant.DEL_FLAG_0.toString());\n\t\t\t\tsysDepart.setDepartNameEn(departExportVo.getDepartNameEn());\n\t\t\t\tsysDepart.setDepartOrder(departExportVo.getDepartOrder());\n\t\t\t\tsysDepart.setOrgCategory(oConvertUtils.getString(departExportVo.getOrgCategory(),\"1\"));\n\t\t\t\tsysDepart.setMobile(departExportVo.getMobile());\n\t\t\t\tsysDepart.setFax(departExportVo.getFax());\n\t\t\t\tsysDepart.setAddress(departExportVo.getAddress());\n\t\t\t\tsysDepart.setMemo(departExportVo.getMemo());\n                sysDepart.setPositionId(departExportVo.getPositionId());\n\t\t\t\tImportExcelUtil.importDateSaveOne(sysDepart, ISysDepartService.class, errorMessageList, num, CommonConstant.SQL_INDEX_UNIQ_DEPART_ORG_CODE);\n\t\t\t\tdepartMap.put(departExportVo.getDepartNameUrl(),sysDepart);\n\t\t\t}\n\t\t\tnum++;\n\t\t}\n\t}\n\n\t/**\n\t * 寻找部门路径\n\t *\n\t * @param departVo       部门vo\n\t * @param path           部门路径\n\t * @param tenantId       租户id\n\t * @param childrenDepart 子部门\n\t * @param departIdList   部门id集合\n\t */\n\tprivate void findSysDepartPath(SysDepartExportVo departVo, List<String> path, Integer tenantId, List<SysDepartExportVo> childrenDepart, List<String> departIdList) {\n\t\t//step 1.查询子部门的数据\n\t\t//获取租户id和部门父id获取的部门数据\n\t\tList<SysDepartExportVo> departList = departMapper.getSysDepartList(departVo.getId(), tenantId, null);\n\t\t//部门为空判断\n\t\tif (departList == null || departList.size() <= 0) {\n\t\t\t//判断最后一个子部门是否已拼接\n\t\t\tif (!departIdList.contains(departVo.getId())) {\n\t\t\t\tdepartVo.setDepartNameUrl(String.join(SymbolConstant.SINGLE_SLASH, path));\n\t\t\t\tchildrenDepart.add(departVo);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tfor (SysDepartExportVo exportDepartVo : departList) {\n\t\t\t//存放子级路径\n\t\t\tList<String> cPath = new ArrayList<>(path);\n\t\t\tcPath.add(exportDepartVo.getDepartName());\n\t\t\t//step 2.拼接子部门路径\n\t\t\tif (!departIdList.contains(departVo.getId())) {\n\t\t\t\tdepartIdList.add(departVo.getId());\n\t\t\t\tdepartVo.setDepartNameUrl(String.join(SymbolConstant.SINGLE_SLASH, path));\n\t\t\t\tchildrenDepart.add(departVo);\n\t\t\t}\n\t\t\t//step 3.递归查询子路径，直到找不到为止\n            // 代码逻辑说明: 【JHHB-222】导出，选中最顶级部门，只能导出选中的部门---\n\t\t\tfindSysDepartPath(exportDepartVo, cPath, tenantId, childrenDepart, departIdList);\n        }\n\t}\n\t//========================end 系统下部门与人员导入 ==================================================================\n\n\n    //=========================begin 部门岗位改造 ==================================================================\n    @Override\n    public List<SysPositionSelectTreeVo> getPositionByDepartId(String parentId, String departId, String positionId) {\n        //step1 根据职级获取当前岗位的级别\n        SysPosition sysPosition = sysPositionMapper.selectById(positionId);\n        if(null == sysPosition){\n            return null;\n        }\n        Integer postLevel = sysPosition.getPostLevel();\n        //先获取上级部门的信息\n        SysDepart sysDepart = baseMapper.getDepartById(parentId);\n        //step2 如果是总公司 即数据为空的时候，则说明没有上级领导了\n        if (null == sysDepart) {\n            return null;\n        }\n        \n        //可能是老数据\n        if(null == postLevel){\n            throw new JeecgBootBizTipException(\"当前选择职级的职务等级为空，请前往职务管理进行修改！\");\n        }\n        return this.getParentDepartPosition(sysDepart, postLevel, departId);\n    }\n    \n    /*\n     * 获取上级部门岗位 或者当前部门下级别高的\n     *\n     * @param sysDepart\n     * @param postLevel\n     * @param id\n     * @return\n     */\n    private List<SysPositionSelectTreeVo> getParentDepartPosition(SysDepart sysDepart, Integer postLevel, String id) {\n        //step1 先获取上级部门下的数据\n        //已经存在的code\n        List<String> existCodeList = new ArrayList<>();\n        List<SysPositionSelectTreeVo> departPosition = getDepartPosition(sysDepart, postLevel, id, existCodeList);\n        //step2 获取上级部门信息，一直获取到子公司或者总公司为止\n        //父级id不为空并且当前部门不是子公司或者总公司，则需要寻上顶级公司\n        // 代码逻辑说明: 【JHHB-501】三级子公司的董事长岗位，存在向一级公司总经理汇报的职级关系，现在无法配置---\n        String parentId = sysDepart.getParentId();\n        SysDepart depart = departMapper.getDepartById(parentId);\n        if(null != depart){\n            //获取长度\n            int codeNum = YouBianCodeUtil.ZHANWEI_LENGTH;\n            List<String> codeList = getCodeHierarchy(depart.getOrgCode(), codeNum);\n            if(null != codeList && codeList.size() > 1){\n                //需要将当前和上级部门的排除掉\n                existCodeList.add(codeList.get(codeList.size() - 1));\n                //从上向下找存在子级的code\n                List<SysPositionSelectTreeVo> parentDepartPost = this.getParentDepartPost(codeList, existCodeList);\n                //当前父级部门下存在职级必当前高的需要同事渲染\n                if (CollectionUtil.isNotEmpty(departPosition)) {\n                    departPosition.addAll(parentDepartPost);\n                    return buildTree(departPosition);\n                }else if(CollectionUtil.isNotEmpty(parentDepartPost)){\n                    return buildTree(parentDepartPost);\n                }\n            }\n        }\n        // 代码逻辑说明: 【JHHB-501】三级子公司的董事长岗位，存在向一级公司总经理汇报的职级关系，现在无法配置---\n        if(CollectionUtil.isNotEmpty(departPosition)){\n            return getSuperiorCompany(departPosition);\n        }\n        return null;\n    }\n\n    /**\n     * 获取上级公司\n     *\n     * @param departPosition\n     */\n    private List<SysPositionSelectTreeVo> getSuperiorCompany(List<SysPositionSelectTreeVo> departPosition) {\n        String parentId = departPosition.get(0).getParentId();\n        SysDepart depart = baseMapper.getDepartById(parentId);\n        if (null == depart) {\n            return departPosition;\n        }\n        List<SysPositionSelectTreeVo> childrenList = new ArrayList<>();\n        SysPositionSelectTreeVo childrenTreeModel = new SysPositionSelectTreeVo(depart);\n        childrenTreeModel.setChildren(departPosition);\n        childrenList.add(childrenTreeModel);\n        if (DepartCategoryEnum.DEPART_CATEGORY_COMPANY.getValue().equals(depart.getOrgCategory()) || DepartCategoryEnum.DEPART_CATEGORY_SUB_COMPANY.getValue().equals(depart.getOrgCategory())) {\n            return childrenList;\n        } else {\n            return this.getSuperiorCompany(childrenList);\n        }\n    }\n\n    /**\n     * 获取父级部门下的一级岗位\n     *\n     * @param codeList\n     * @param existCodeList 已存在的部门编码\n     */\n    private List<SysPositionSelectTreeVo> getParentDepartPost(List<String> codeList, List<String> existCodeList) {\n        List<SysPositionSelectTreeVo> list = new ArrayList<>();\n        for (String orgCode : codeList){\n            if(existCodeList.contains(orgCode)){\n                continue;\n            }\n            //当前部门\n            SysDepart depart = departMapper.queryDepartByOrgCode(orgCode);\n            SysPositionSelectTreeVo sysPositionSelectTreeVo = new SysPositionSelectTreeVo(depart);\n            sysPositionSelectTreeVo.setLeaf(false);\n            list.add(sysPositionSelectTreeVo);\n            //查找当前部门下一级部门存在岗位的部门信息\n            List<SysDepart> departByParentId = departMapper.getDepartByParentId(depart.getId());\n            List<String> parentIds = new ArrayList<>();\n            for (SysDepart sysDepart : departByParentId) {\n                list.add(new SysPositionSelectTreeVo(sysDepart));\n                // 代码逻辑说明: 上级岗位太慢，sql优化---\n                parentIds.add(sysDepart.getId());\n            }\n            // 代码逻辑说明: 上级岗位太慢，sql优化---\n            if(CollectionUtil.isNotEmpty(parentIds)){\n                //根据父级id获取部门岗位信息\n                List<SysDepart> departPositionList = departMapper.getDepartPositionByParentIds(parentIds);\n                if(CollectionUtil.isNotEmpty(departPositionList)){\n                    List<SysPositionSelectTreeVo> sysDepartTreeModels = sysDepartToTreeModel(departPositionList);\n                    list.addAll(sysDepartTreeModels);\n                }\n            }\n        }\n        return list; \n    }\n\n    /**\n     * 获取部门职务\n     *\n     * @param sysDepart\n     * @param postLevel\n     * @param existCodeList\n     */\n    private List<SysPositionSelectTreeVo> getDepartPosition(SysDepart sysDepart, Integer postLevel, String id, List<String> existCodeList) {\n        //step1 获取部门下的所有部门\n        String parentId = sysDepart.getParentId();\n        List<SysDepart> departList = baseMapper.getDepartByParentId(parentId);\n        List<SysPositionSelectTreeVo> treeModels = new ArrayList<>();\n        for (int i = 0; i < departList.size(); i++) {\n            SysDepart depart = departList.get(i);\n            existCodeList.add(depart.getOrgCode());\n            //如果是叶子节点说明没有岗位直接跳出循环\n            if (depart.getIzLeaf() == 1) {\n                if (DepartCategoryEnum.DEPART_CATEGORY_POST.getValue().equals(depart.getOrgCategory())) {\n                    SysPositionSelectTreeVo sysDepartTreeModel = new SysPositionSelectTreeVo(depart);\n                    treeModels.add(sysDepartTreeModel);\n                }\n                continue;\n            }\n            //step2 查找子部门下大于当前职别的数据\n            List<SysDepart> departParentPosition = baseMapper.getDepartPositionByParentId(depart.getId(), postLevel, id);\n            if (CollectionUtil.isNotEmpty(departParentPosition)) {\n                List<SysPositionSelectTreeVo> sysDepartTreeModels = sysDepartToTreeModel(departParentPosition);\n                SysPositionSelectTreeVo parentDepartTree = new SysPositionSelectTreeVo(depart);\n                parentDepartTree.setChildren(sysDepartTreeModels);\n                treeModels.add(parentDepartTree);\n            }\n        }\n        return treeModels;\n    }\n\n    /**\n     * 将SysDepart中的属性转到SysDepartTreeModel中\n     *\n     * @return\n     */\n    private List<SysPositionSelectTreeVo> sysDepartToTreeModel(List<SysDepart> sysDeparts) {\n        List<SysPositionSelectTreeVo> records = new ArrayList<>();\n        for (int i = 0; i < sysDeparts.size(); i++) {\n            SysDepart depart = sysDeparts.get(i);\n            SysPositionSelectTreeVo treeModel = new SysPositionSelectTreeVo(depart);\n            records.add(treeModel);\n        }\n        return records;\n    }\n\n    /**\n     * 获取公司或者子公司的id\n     *\n     * @param parentDepartId\n     * @return\n     */\n    private String getCompanyDepartId(String parentDepartId) {\n        SysDepart sysDepart = baseMapper.getDepartById(parentDepartId);\n        if (sysDepart != null) {\n            if (DepartCategoryEnum.DEPART_CATEGORY_COMPANY.getValue().equals(sysDepart.getOrgCategory()) || DepartCategoryEnum.DEPART_CATEGORY_SUB_COMPANY.getValue().equals(sysDepart.getOrgCategory())) {\n                return sysDepart.getId();\n            }\n            //如果不是公司或者子公司的时候，需要递归查询\n            if (oConvertUtils.isNotEmpty(sysDepart.getParentId())) {\n                return getCompanyDepartId(sysDepart.getParentId());\n            } else {\n                return parentDepartId;\n            }\n        } else {\n            return \"\";\n        }\n    }\n\n    @Override\n    public List<SysPositionSelectTreeVo> getRankRelation(String departId) {\n        //记录当前部门 key为部门id,value为部门名称\n        Map<String, String> departNameMap = new HashMap<>(5);\n        //step1 根据id查询部门信息\n        SysDepartPositionVo sysDepartPosition = baseMapper.getDepartPostByDepartId(departId);\n        if (null == sysDepartPosition) {\n            throw new JeecgBootBizTipException(\"当前所选部门数据为空\");\n        }\n        List<SysPositionSelectTreeVo> selectTreeVos = new ArrayList<>();\n        //step2 查看是否有子级部门，存在递归查询职位\n        if (!CommonConstant.IS_LEAF.equals(sysDepartPosition.getIzLeaf())) {\n            //获取子级职位根据部门编码\n            this.getChildrenDepartPositionByOrgCode(selectTreeVos, departNameMap, sysDepartPosition);\n            return buildTree(selectTreeVos);\n        }\n        return new ArrayList<>();\n    }\n\n    /**\n     * 获取子级职位根据部门编码\n     *\n     * @param selectTreeVos\n     * @param departNameMap\n     * @param sysDepartPosition\n     */\n    private void getChildrenDepartPositionByOrgCode(List<SysPositionSelectTreeVo> selectTreeVos, Map<String, String> departNameMap, SysDepartPositionVo sysDepartPosition) {\n        String orgCode = sysDepartPosition.getOrgCode();\n        //step1 根据父级id获取子级部门信息\n        List<SysDepartPositionVo> positionList = baseMapper.getDepartPostByOrgCode(orgCode + \"%\");\n        if (CollectionUtil.isNotEmpty(positionList)) {\n            for (SysDepartPositionVo position : positionList) {\n                //初始化map\n                if (departNameMap == null) {\n                    departNameMap = new HashMap<>(5);\n                }\n                SysDepart depart = baseMapper.getDepartById(position.getParentId());\n                if(null != depart){\n                    position.setDepartName(depart.getDepartName());\n                }\n                if(oConvertUtils.isNotEmpty(position.getDepPostParentId())){\n                    LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<>();\n                    query.eq(SysDepart::getId,position.getDepPostParentId());\n                    query.likeRight(SysDepart::getOrgCode,orgCode);\n                    Long count = baseMapper.selectCount(query);\n                    if(null== count || count == 0){\n                        position.setDepPostParentId(null);\n                    }\n                }\n                departNameMap.put(position.getParentId(), position.getPositionName());\n                //查看是否为部门岗位，不是则不需要处理\n                SysPositionSelectTreeVo treeVo = new SysPositionSelectTreeVo(position);\n                selectTreeVos.add(treeVo);\n            }\n        }\n    }\n\n\n    /**\n     * 构建树形结构，只返回没有父级的一级节点\n     */\n    public static List<SysPositionSelectTreeVo> buildTree(List<SysPositionSelectTreeVo> nodes) {\n        // 1. 去重：根据ID去重，保留第一个\n        Map<String, SysPositionSelectTreeVo> uniqueNodes = nodes.stream()\n                .filter(Objects::nonNull)\n                .filter(node -> node.getId() != null && !node.getId().trim().isEmpty())\n                .collect(Collectors.toMap(\n                        SysPositionSelectTreeVo::getId,\n                        node -> node,\n                        (existing, replacement) -> existing,\n                        LinkedHashMap::new\n                ));\n        // 2. 初始化所有节点的children列表\n        uniqueNodes.values().forEach(node -> {\n            if (node.getChildren() == null) {\n                node.setChildren(new ArrayList<>());\n            }\n        });\n        // 3. 构建树形结构\n        List<SysPositionSelectTreeVo> rootNodes = new ArrayList<>();\n        for (SysPositionSelectTreeVo node : uniqueNodes.values()) {\n            String parentId = node.getParentId();\n\n            if (parentId == null || parentId.trim().isEmpty()) {\n                // 根节点\n                rootNodes.add(node);\n            } else {\n                // 子节点，查找父节点\n                SysPositionSelectTreeVo parent = uniqueNodes.get(parentId);\n                if (parent != null) {\n                    parent.getChildren().add(node);\n                } else {\n                    // 父节点不存在，当作根节点处理\n                    rootNodes.add(node);\n                }\n            }\n        }\n        return rootNodes;\n    }\n\n    //=========================end 部门岗位改造 ==================================================================\n\n    @Override\n    public String getDepartPathNameByOrgCode(String orgCode, String depId) {\n        //部门id为空需要查询当前部门下的编码\n        if(oConvertUtils.isNotEmpty(depId)){\n            SysDepart departById = baseMapper.getDepartById(depId);\n            if(null != departById){\n                orgCode = departById.getOrgCode();\n            }\n        }\n        if(oConvertUtils.isEmpty(orgCode)){\n            return \"\";\n        }\n        //从redis 获取不为空直接返回\n        Object departName  = redisUtil.get(CommonConstant.DEPART_NAME_REDIS_KEY_PRE + orgCode);\n        if(null != departName){\n            return String.valueOf(departName);\n        }\n        //获取长度\n        int codeNum = YouBianCodeUtil.ZHANWEI_LENGTH;\n        List<String> list = this.getCodeHierarchy(orgCode, codeNum);\n        //根据部门编码查询公司和子公司的数据\n        LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<>();\n        query.in(SysDepart::getOrgCode, list);\n        query.orderByAsc(SysDepart::getOrgCode);\n        List<SysDepart> sysDepartList = departMapper.selectList(query);\n        if(!CollectionUtils.isEmpty(sysDepartList)){\n            //获取部门名称拼接返回给前台\n            // 代码逻辑说明: 【JHHB-631】【部门管理】存在缩写使用缩写来显示---\n            List<String> departNameList = sysDepartList.stream().map(item-> oConvertUtils.getString(item.getDepartNameAbbr(),item.getDepartName())).toList();\n            String departNames = String.join(\"/\", departNameList);\n            redisUtil.set(CommonConstant.DEPART_NAME_REDIS_KEY_PRE + orgCode,departNames);\n            return departNames;\n        }\n        return \"\";\n    }\n    \n    /**\n     * 获取编码及其所有上级编码\n     * \n     * @param code 完整编码，如 \"A01A01A01\"\n     * @param fixedLength 固定位数，如 3\n     * @return 包含所有上级编码的列表，如 ['A01','A01A01','A01A01A01']\n     */\n    public List<String> getCodeHierarchy(String code, int fixedLength) {\n        List<String> hierarchy = new ArrayList<>();\n        if (code == null || code.isEmpty() || fixedLength <= 0) {\n            return hierarchy;\n        }\n        // 检查编码长度是否能被固定位数整除\n        if (code.length() % fixedLength != 0) {\n            throw new IllegalArgumentException(\"编码长度必须能被固定位数整除\");\n        }\n        // 按固定位数分割并生成所有上级编码\n        for (int i = fixedLength; i <= code.length(); i += fixedLength) {\n            hierarchy.add(code.substring(0, i));\n        }\n        return hierarchy;\n    }\n\n    /**\n     * 根据多个部门id删除主岗位和兼职岗位\n     * \n     * @param idList\n     */\n    private void deleteDepartPostByDepIds(List<String> idList) {\n        //更新用户主岗位位空，使用LambdaUpdateWrapper，避免为空时受全局 updateStrategy 影响导致误更新\n        LambdaUpdateWrapper<SysUser> userQuery = new LambdaUpdateWrapper<>();\n        userQuery.in(SysUser::getMainDepPostId, idList);\n        userQuery.set(SysUser::getMainDepPostId, null);\n        sysUserMapper.update(userQuery);\n        //删除兼职岗位\n        LambdaQueryWrapper<SysUserDepPost> postQuery = new LambdaQueryWrapper<>();\n        postQuery.in(SysUserDepPost::getDepId, idList);\n        sysUserDepPostMapper.delete(postQuery);\n        //redis清除缓存key\n        redisUtil.removeAll(CommonConstant.DEPART_NAME_REDIS_KEY_PRE);\n    }\n\n    /**\n     * 根据部门id获取部门下的岗位id\n     *\n     * @param depIds 当前选择的公司、子公司、部门id\n     * @return\n     */\n    @Override\n    public String getDepPostIdByDepId(String depIds) {\n        if (oConvertUtils.isEmpty(depIds)) {\n            return \"\";\n        }\n        //step1 先根据部门id获取编码\n        List<SysUserDepVo> departIdList = departMapper.getDepartByIds(Arrays.asList(depIds.split(SymbolConstant.COMMA)));\n        if (CollectionUtil.isNotEmpty(departIdList)) {\n            //step2 根据部门编码查询岗位id\n            LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<>();\n            query.select(SysDepart::getId);\n            departIdList.forEach(item -> {\n                query.or(lq-> lq.likeRight(SysDepart::getOrgCode, item.getOrgCode()));\n            });\n            query.eq(SysDepart::getOrgCategory, DepartCategoryEnum.DEPART_CATEGORY_POST.getValue());\n            List<SysDepart> departList = departMapper.selectList(query);\n            //step3 返回部门id\n            if (CollectionUtil.isNotEmpty(departList)) {\n                return departList.stream().map(SysDepart::getId).collect(Collectors.joining(SymbolConstant.COMMA));\n            }\n        }\n        return \"\";\n    }\n\n    /**\n     * 变更部门位置\n     * \n     * @param changeDepartVo\n     * @return orgCode 部门id\n     */\n    @Transactional(rollbackFor = Exception.class)\n    @Override\n    public void updateChangeDepart(SysChangeDepartVo changeDepartVo) {\n        String dragId = changeDepartVo.getDragId();\n        // 1. 获取被拖拽的部门\n        SysDepart dragDept = baseMapper.getDepartById(dragId);\n        if (null == dragDept) {\n            throw new JeecgBootBizTipException(\"被拖拽的部门不存在\");\n        }\n        // 2. 获取目标部门\n        String dropId = changeDepartVo.getDropId();\n        SysDepart targetDept = baseMapper.getDepartById(dropId);\n        if (null == targetDept) {\n            throw new JeecgBootBizTipException(\"目标部门不存在\");\n        }\n        //3. 验证拖拽操作是否合法\n        validateDragOperation(dragDept, targetDept, changeDepartVo.getDropPosition());\n        //4. 根据dropPosition调整部门顺序\n        Integer dropPosition = changeDepartVo.getDropPosition();\n        switch (dropPosition) {\n            case -1:\n                // 拖拽到上方\n                moveToAbove(dragDept, targetDept);\n                break;\n            case 0:\n                // 拖拽到内部（作为子部门）\n                moveAsChild(dragDept, targetDept);\n                break;\n            case 1:\n                //拖拽到下方\n                moveToBelow(dragDept, targetDept, changeDepartVo.getSort());\n                break;\n            default:\n                throw new RuntimeException(\"无效的拖拽位置\");\n        }\n        //5. 清空缓存\n        redisUtil.removeAll(CommonConstant.DEPART_NAME_REDIS_KEY_PRE);\n    }\n\n    /**\n     * 验证拖拽操作是否合法\n     *\n     * @param dragDept     被拖拽的部门\n     * @param targetDept   目标部门\n     * @param dropPosition 拖拽位置\n     */\n    private void validateDragOperation(SysDepart dragDept, SysDepart targetDept, Integer dropPosition) {\n        // 禁止拖拽到自身\n        if (dragDept.getId().equals(targetDept.getId())) {\n            throw new RuntimeException(\"不能拖拽到自身\");\n        }\n        // 禁止拖拽到自身子部门\n        if (isDescendant(dragDept, targetDept.getId())) {\n            throw new RuntimeException(\"不能拖拽到自身子部门\");\n        }\n        //公司岗位判断\n        String orgCategory = targetDept.getOrgCategory();\n        String oldOrgCategory = dragDept.getOrgCategory();\n        //部门为公司\n        if(0 != dropPosition && DepartCategoryEnum.DEPART_CATEGORY_COMPANY.getValue().equals(orgCategory)){\n            //当前部门不能为子公司、部门和岗位\n            if(!DepartCategoryEnum.DEPART_CATEGORY_COMPANY.getValue().equals(oldOrgCategory)){\n                throw new JeecgBootBizTipException(\"当前部门类型为【\"+DepartCategoryEnum.getNameByValue(oldOrgCategory)+\"】,不允许移动到公司\");\n            }\n        }\n        //部门为岗位不允许移入\n        if(0 == dropPosition && DepartCategoryEnum.DEPART_CATEGORY_POST.getValue().equals(orgCategory)) {\n            throw new JeecgBootBizTipException(\"岗位不允许存在子级\");\n        }\n        //公司不能做为子级\n        if(oConvertUtils.isNotEmpty(targetDept.getParentId()) && DepartCategoryEnum.DEPART_CATEGORY_COMPANY.getValue().equals(oldOrgCategory)){\n            throw new JeecgBootBizTipException(\"公司不允许作为子级\");\n        }\n    }\n\n    /**\n     * 判断目标部门是否是被拖拽部门的子部门\n     */\n    private boolean isDescendant(SysDepart dragDept, String targetId) {\n        List<SysDepart> children = departMapper.getDepartByParentId(dragDept.getId());\n        for (SysDepart child : children) {\n            if (child.getId().equals(targetId)) {\n                return true;\n            }\n            if (isDescendant(child, targetId)) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * 拖拽到上方：将部门移动到目标部门上方(只有最上级 即公司才会走这个逻辑)\n     * @param dragDept   被拖拽的部门\n     * @param targetDept 目标部门\n     */\n    private void moveToAbove(SysDepart dragDept, SysDepart targetDept) {\n        // 获取目标部门同级的所有部门\n        List<SysDepart> siblings = departMapper.getDepartNoParent();\n        // 计算新的排序值\n        Integer newDepartOrder = targetDept.getDepartOrder();\n        // 更新被拖拽部门的排序值\n        dragDept.setDepartOrder(newDepartOrder);\n        // 更新被拖拽部门的排序值\n        dragDept.setDepartOrder(0);\n        if(CollectionUtil.isNotEmpty(siblings)){\n            // 计算新的排序值\n            this.computingSort(siblings,0,dragDept.getId());\n            // 保存所有更新的部门\n            this.updateBatchById(siblings);\n        }\n        departMapper.updateById(dragDept);\n    }\n\n    /**\n     * 拖拽到下方：将部门移动到目标部门下方\n     *\n     * @param dragDept   被拖拽的部门\n     * @param targetDept 目标部门\n     * @param sort 排序\n     */\n    private void moveToBelow(SysDepart dragDept, SysDepart targetDept, Integer sort) {\n        String parentId = targetDept.getParentId();\n        List<SysDepart> siblings = null;\n        if(oConvertUtils.isNotEmpty(parentId)){\n            // 获取目标部门同级的所有部门\n            siblings = departMapper.getDepartByParentId(parentId);\n        }else{\n            siblings = departMapper.getDepartNoParent(); \n        }\n        String oldParentId = dragDept.getParentId();\n        //判断父级部门id是否相同，不同则更新为目标部门的父部门id\n        if(oConvertUtils.isNotEmpty(dragDept.getParentId()) &&\n                oConvertUtils.isNotEmpty(parentId) &&\n                !dragDept.getParentId().equals(parentId)){\n            String oldOrgCode = dragDept.getOrgCode();\n            //设置父级id和部门code\n            this.setDepartParentAndOrgCode(dragDept, parentId);\n            //修改子级的部门编码\n            this.updateChildOrgCode(dragDept.getOrgCode(), oldOrgCode);\n        }\n        // 更新被拖拽部门的排序值\n        dragDept.setDepartOrder(sort);\n        if(CollectionUtil.isNotEmpty(siblings)){\n            // 计算新的排序值\n            this.computingSort(siblings,sort,dragDept.getId());\n            // 保存所有更新的部门\n            this.updateBatchById(siblings);\n        }\n        departMapper.updateById(dragDept);\n        if(oConvertUtils.isNotEmpty(oldParentId)){\n            long count = departMapper.countByParentId(oldParentId);\n            if(count == 0){\n                this.updateIzLeaf(oldParentId,CommonConstant.IS_LEAF);\n            }\n        }\n    }\n    \n    /**\n     * 拖拽到内部：将部门移动到目标部门内部（作为子部门）\n     */\n    private void moveAsChild(SysDepart dragDept, SysDepart targetDept) {\n        // 更新父部门ID\n        String parentId = targetDept.getId();\n        String oldParentId = dragDept.getParentId();\n        // 获取目标部门同级的所有部门\n        List<SysDepart> siblings = departMapper.getDepartByParentId(parentId);\n        //判断父级部门id是否相同，不同则更新为目标部门的父部门id\n        if(oConvertUtils.isNotEmpty(dragDept.getParentId()) &&\n                oConvertUtils.isNotEmpty(parentId) &&\n                !dragDept.getParentId().equals(parentId)){\n            String oldOrgCode = dragDept.getOrgCode();\n            //设置父级id和部门code\n            this.setDepartParentAndOrgCode(dragDept, parentId);\n            //修改子级的部门编码\n            this.updateChildOrgCode(dragDept.getOrgCode(), oldOrgCode);\n        }\n        //内部排序为0\n        Integer sort = 0;\n        // 设置新的排序值\n        dragDept.setDepartOrder(sort);\n        if(CollectionUtil.isNotEmpty(siblings)){\n            // 计算新的排序值\n            this.computingSort(siblings,sort,dragDept.getId());\n            // 保存所有更新的部门\n            this.updateBatchById(siblings);\n        }\n        departMapper.updateById(dragDept);\n        this.updateIzLeaf(parentId, CommonConstant.NOT_LEAF);\n        if(oConvertUtils.isNotEmpty(oldParentId)){\n            long count = departMapper.countByParentId(oldParentId);\n            if(count == 0){\n                this.updateIzLeaf(oldParentId,CommonConstant.IS_LEAF);\n            }\n        }\n    }\n\n    /**\n     * 计算排序值\n     *\n     * @param siblings\n     * @param sort\n     * @param id\n     */\n    private void computingSort(List<SysDepart> siblings, Integer sort, String id) {\n        for (int i = 0; i < siblings.size(); i++) {\n            SysDepart depart = siblings.get(i);\n            if(id.equals(depart.getId())){\n                continue;\n            }\n            //如果当前循环的sort大等于传入的sort值 则需要+1\n            if(i >= sort){\n                depart.setDepartOrder(sort + 1);\n                sort++;\n            } else {\n                depart.setDepartOrder(i);\n            }\n        }\n    }\n\n    /**\n     * 设置被拖拽部门的父级id和部门编码\n     *\n     * @param dragDept 被拖拽的部门\n     * @param parentId 目标部门的父级id\n     */\n    private void setDepartParentAndOrgCode(SysDepart dragDept, String parentId) {\n        // 更新父部门ID（与目标部门相同）\n        dragDept.setParentId(parentId);\n        Page<SysDepart> page = new Page<>(1, 1);\n        //需要获取父级id，查看父级是否已经存在\n        //获取一级部门的最大orgCode\n        List<SysDepart> records = departMapper.getMaxCodeDepart(page, parentId);\n        String newOrgCode = \"\";\n        if (CollectionUtil.isNotEmpty(records)) {\n            newOrgCode = YouBianCodeUtil.getNextYouBianCode(records.get(0).getOrgCode());\n        } else {\n            //查询父id\n            if (oConvertUtils.isNotEmpty(parentId)) {\n                SysDepart departById = departMapper.getDepartById(parentId);\n                newOrgCode = YouBianCodeUtil.getSubYouBianCode(departById.getOrgCode(), null);\n            } else {\n                newOrgCode = YouBianCodeUtil.getNextYouBianCode(null);\n            }\n        }\n        dragDept.setOrgCode(newOrgCode);\n    }\n\n    /**\n     * 修改子级的部门编码\n     *\n     * @param newOrgCode 当前父级新的部门编码\n     * @param oldOrgCode 当前父级旧的部门编码\n     */\n    private void updateChildOrgCode(String newOrgCode, String oldOrgCode) {\n        //查询当前部门下的所有子级部门\n        LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<>();\n        query.likeRight(SysDepart::getOrgCode, oldOrgCode);\n        query.orderByAsc(SysDepart::getDepartOrder);\n        query.orderByDesc(SysDepart::getCreateTime);\n        query.select(SysDepart::getId, SysDepart::getOrgCode);\n        List<SysDepart> childDeparts = departMapper.selectList(query);\n        if (CollectionUtil.isNotEmpty(childDeparts)) {\n            for (SysDepart depart : childDeparts) {\n                String orgCode = depart.getOrgCode();\n                if (orgCode.startsWith(oldOrgCode)) {\n                    orgCode = newOrgCode + orgCode.substring(oldOrgCode.length());\n                }\n                depart.setOrgCode(orgCode);\n            }\n        }\n        this.updateBatchById(childDeparts);\n    }\n\n    /**\n     * 获取部门负责人\n     *\n     * @param departId\n     * @param page\n     * @return\n     */\n    @Override\n    public IPage<SysUser> getDepartmentHead(String departId, Page<SysUser> page) {\n        List<SysUser> departmentHead = departMapper.getDepartmentHead(page, departId);\n        if(CollectionUtil.isNotEmpty(departmentHead)){\n            departmentHead.forEach(item->{\n                //兼职岗位\n                List<String> depPostList = sysUserDepPostMapper.getDepPostByUserId(item.getId());\n                if(CollectionUtil.isNotEmpty(depPostList)){\n                    item.setOtherDepPostId(StringUtils.join(depPostList.toArray(), SymbolConstant.COMMA));\n                }\n            });\n        }\n        return page.setRecords(departmentHead);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictItemServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport org.jeecg.modules.system.entity.SysDictItem;\nimport org.jeecg.modules.system.mapper.SysDictItemMapper;\nimport org.jeecg.modules.system.service.ISysDictItemService;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n/**\n * <p>\n * 服务实现类\n * </p>\n *\n * @Author zhangweijian\n * @since 2018-12-28\n */\n@Service\npublic class SysDictItemServiceImpl extends ServiceImpl<SysDictItemMapper, SysDictItem> implements ISysDictItemService {\n\n    @Autowired\n    private SysDictItemMapper sysDictItemMapper;\n\n    @Override\n    public List<SysDictItem> selectItemsByMainId(String mainId) {\n        return sysDictItemMapper.selectItemsByMainId(mainId);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport cn.hutool.core.util.RandomUtil;\nimport com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CacheConstant;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.DataBaseConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.api.ISysBaseAPI;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.util.ResourceUtil;\nimport org.jeecg.common.system.vo.DictModel;\nimport org.jeecg.common.system.vo.DictModelMany;\nimport org.jeecg.common.system.vo.DictQuery;\nimport org.jeecg.common.util.CommonUtils;\nimport org.jeecg.common.util.RedisUtil;\nimport org.jeecg.common.util.SqlInjectionUtil;\nimport org.jeecg.common.util.dynamic.db.DbTypeUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.modules.system.entity.SysDict;\nimport org.jeecg.modules.system.entity.SysDictItem;\nimport org.jeecg.modules.system.mapper.SysDictItemMapper;\nimport org.jeecg.modules.system.mapper.SysDictMapper;\nimport org.jeecg.modules.system.model.DuplicateCheckVo;\nimport org.jeecg.modules.system.model.TreeSelectModel;\nimport org.jeecg.modules.system.security.DictQueryBlackListHandler;\nimport org.jeecg.modules.system.service.ISysDictService;\nimport org.jeecg.modules.system.vo.lowapp.SysDictVo;\nimport org.mybatis.spring.MyBatisSystemException;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.cache.annotation.Cacheable;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\nimport org.springframework.util.CollectionUtils;\n\nimport java.util.*;\nimport java.util.stream.Collectors;\n\n/**\n * <p>\n * 字典表 服务实现类\n * </p>\n *\n * @Author zhangweijian\n * @since 2018-12-28\n */\n@Service\n@Slf4j\npublic class SysDictServiceImpl extends ServiceImpl<SysDictMapper, SysDict> implements ISysDictService {\n\n    @Autowired\n    private SysDictMapper sysDictMapper;\n    @Autowired\n    private SysDictItemMapper sysDictItemMapper;\n\t@Autowired\n\tprivate DictQueryBlackListHandler dictQueryBlackListHandler;\n\n\t@Lazy\n\t@Autowired\n\tprivate ISysBaseAPI sysBaseAPI;\n\t@Lazy\n\t@Autowired\n\tprivate RedisUtil redisUtil;\n\n\t@Override\n\tpublic boolean duplicateCheckData(DuplicateCheckVo duplicateCheckVo) {\n\t\tLong count = null;\n\n\t\t// 1.针对采用 ${}写法的表名和字段进行转义和check\n\t\tString table = SqlInjectionUtil.getSqlInjectTableName(duplicateCheckVo.getTableName());\n\t\tString fieldName = SqlInjectionUtil.getSqlInjectField(duplicateCheckVo.getFieldName());\n\t\tduplicateCheckVo.setTableName(table);\n\t\tduplicateCheckVo.setFieldName(fieldName);\n\t\t\n\t\t// 2.SQL注入check（只限制非法串改数据库）\n\t\t//关联表字典（举例：sys_user,realname,id）\n\t\tSqlInjectionUtil.filterContentMulti(table, fieldName);\n\n\t\tString checkSql = table + SymbolConstant.COMMA + fieldName + SymbolConstant.COMMA;\n\t\t// 【QQYUN-6533】表字典白名单check\n\t\tsysBaseAPI.dictTableWhiteListCheckByDict(table, fieldName);\n\t\t// 3.表字典黑名单check\n\t\tdictQueryBlackListHandler.isPass(checkSql);\n\n\t\t// 4.执行SQL 查询是否存在值\n\t\ttry{\n\t\t\t// 代码逻辑说明: [TV360X-49]postgres日期、年月日时分秒唯一校验报错------------\n\t\t\tif(DbTypeUtils.dbTypeIsPostgre(CommonUtils.getDatabaseTypeEnum())){\n\t\t\t\tduplicateCheckVo.setFieldName(\"CAST(\"+duplicateCheckVo.getFieldName()+\" as text)\");\n\t\t\t}\n\t\t\tif (StringUtils.isNotBlank(duplicateCheckVo.getDataId())) {\n\t\t\t\t// [1].编辑页面校验\n\t\t\t\tcount = sysDictMapper.duplicateCheckCountSql(duplicateCheckVo);\n\t\t\t} else {\n\t\t\t\t// [2].添加页面校验\n\t\t\t\tcount = sysDictMapper.duplicateCheckCountSqlNoDataId(duplicateCheckVo);\n\t\t\t}\n\t\t}catch(MyBatisSystemException e){\n\t\t\tlog.error(e.getMessage(), e);\n\t\t\tString errorCause = \"查询异常,请检查唯一校验的配置！\";\n\t\t\tthrow new JeecgBootException(errorCause);\n\t\t}\n\n\t\t// 4.返回结果\n\t\tif (count == null || count == 0) {\n\t\t\t// 该值可用\n\t\t\treturn true;\n\t\t} else {\n\t\t\t// 该值不可用\n\t\t\tlog.info(\"该值不可用，系统中已存在！\");\n\t\t\treturn false;\n\t\t}\n\t}\n\n\n\t/**\n\t * 通过查询指定code 获取字典\n\t * @param code\n\t * @return\n\t */\n\t@Override\n\t@Cacheable(value = CacheConstant.SYS_DICT_CACHE,key = \"#code\", unless = \"#result == null \")\n\tpublic List<DictModel> queryDictItemsByCode(String code) {\n\t\tlog.debug(\"无缓存dictCache的时候调用这里！\");\n\t\treturn sysDictMapper.queryDictItemsByCode(code);\n\t}\n\n\t@Override\n\t@Cacheable(value = CacheConstant.SYS_ENABLE_DICT_CACHE,key = \"#code\", unless = \"#result == null \")\n\tpublic List<DictModel> queryEnableDictItemsByCode(String code) {\n\t\tlog.debug(\"无缓存dictCache的时候调用这里！\");\n\t\treturn sysDictMapper.queryEnableDictItemsByCode(code);\n\t}\n\n\t@Override\n\tpublic Map<String, List<DictModel>> queryDictItemsByCodeList(List<String> dictCodeList) {\n\t\tList<DictModelMany> list = sysDictMapper.queryDictItemsByCodeList(dictCodeList);\n\t\tMap<String, List<DictModel>> dictMap = new HashMap(5);\n\t\tfor (DictModelMany dict : list) {\n\t\t\tList<DictModel> dictItemList = dictMap.computeIfAbsent(dict.getDictCode(), i -> new ArrayList<>());\n\t\t\t\n\t\t\t// 代码逻辑说明: QQYUN-5183【简流】多字段拼接-多选框、下拉框 等需要翻译的字段\n\t\t\t//dict.setDictCode(null);\n\t\t\t\n\t\t\tdictItemList.add(new DictModel(dict.getValue(), dict.getText(), dict.getColor()));\n\t\t}\n\t\treturn dictMap;\n\t}\n\n\t@Override\n\tpublic Map<String, List<DictModel>> queryAllDictItems() {\n\t\tlog.debug(\">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\");\n\t\tlong start = System.currentTimeMillis();\n\t\tMap<String, List<DictModel>> sysAllDictItems = new HashMap(5);\n\t\tList<Integer> tenantIds = null;\n\t\t//------------------------------------------------------------------------------------------------\n\t\t//是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n\t\tif (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n\t\t\ttenantIds = new ArrayList<>();\n\t\t\ttenantIds.add(0);\n\t\t\tif (TenantContext.getTenant() != null) {\n\t\t\t\ttenantIds.add(oConvertUtils.getInt(TenantContext.getTenant()));\n\t\t\t}\n\t\t}\n\t\t//------------------------------------------------------------------------------------------------\n\t\tList<DictModelMany> sysDictItemList = sysDictMapper.queryAllDictItems(tenantIds);\n\t\t// 使用groupingBy根据dictCode分组\n\t\tsysAllDictItems = sysDictItemList.stream()\n\t\t\t\t.collect(Collectors.groupingBy(DictModelMany::getDictCode,\n\t\t\t\t\t\tCollectors.mapping(d -> new DictModel(d.getValue(), d.getText(), d.getColor()), Collectors.toList())));\n\t\tlog.debug(\"      >>> 1 获取系统字典项耗时（SQL）：\" + (System.currentTimeMillis() - start) + \"毫秒\");\n\n\t\tMap<String, List<DictModel>> enumRes = ResourceUtil.getEnumDictData();\n\t\tsysAllDictItems.putAll(enumRes);\n\t\tlog.debug(\"      >>> 2 获取系统字典项耗时（Enum）：\" + (System.currentTimeMillis() - start) + \"毫秒\");\n\t\t\n\t\tlog.debug(\"      >>> end 获取系统字典库总耗时：\" + (System.currentTimeMillis() - start) + \"毫秒\");\n\t\tlog.debug(\">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\");\n\n\t\t//log.debug(\"-------登录加载系统字典-----\" + sysAllDictItems.toString());\n\t\treturn sysAllDictItems;\n\t}\n\n\t/**\n\t * 通过查询指定code 获取字典值text\n\t * @param code\n\t * @param key\n\t * @return\n\t */\n\n\t@Override\n\t@Cacheable(value = CacheConstant.SYS_DICT_CACHE,key = \"#code+':'+#key\", unless = \"#result == null \")\n\tpublic String queryDictTextByKey(String code, String key) {\n\t\tlog.debug(\"无缓存dictText的时候调用这里！\");\n\t\treturn sysDictMapper.queryDictTextByKey(code, key);\n\t}\n\n\t@Override\n\tpublic Map<String, List<DictModel>> queryManyDictByKeys(List<String> dictCodeList, List<String> keys) {\n\t\tList<DictModelMany> list = sysDictMapper.queryManyDictByKeys(dictCodeList, keys);\n\t\tMap<String, List<DictModel>> dictMap = new HashMap(5);\n\t\tfor (DictModelMany dict : list) {\n\t\t\tList<DictModel> dictItemList = dictMap.computeIfAbsent(dict.getDictCode(), i -> new ArrayList<>());\n\t\t\tdictItemList.add(new DictModel(dict.getValue(), dict.getText()));\n\t\t}\n\t\t// 代码逻辑说明: 系统字典数据应该包括自定义的java类-枚举\n\t\tMap<String, List<DictModel>> enumRes = ResourceUtil.queryManyDictByKeys(dictCodeList, keys);\n\t\tdictMap.putAll(enumRes);\n\t\treturn dictMap;\n\t}\n\n\t/**\n\t * 通过查询指定table的 text code 获取字典\n\t * dictTableCache采用redis缓存有效期10分钟\n\t * @param tableFilterSql\n\t * @param text\n\t * @param code\n\t * @return\n\t */\n\t@Override\n\t@Deprecated\n\tpublic List<DictModel> queryTableDictItemsByCode(String tableFilterSql, String text, String code) {\n\t\tlog.debug(\"无缓存dictTableList的时候调用这里！\");\n\t\tString str = tableFilterSql+\",\"+text+\",\"+code;\n\t\t// 【QQYUN-6533】表字典白名单check\n\t\tsysBaseAPI.dictTableWhiteListCheckByDict(tableFilterSql, text, code);\n\t\t// 1.表字典黑名单check\n\t\tif(!dictQueryBlackListHandler.isPass(str)){\n\t\t\tlog.error(dictQueryBlackListHandler.getError());\n\t\t\treturn null;\n\t\t}\n\n\t\t// 2.分割SQL获取表名和条件\n\t\tString table = null;\n\t\tString filterSql = null;\n\t\tif(tableFilterSql.toLowerCase().indexOf(DataBaseConstant.SQL_WHERE)>0){\n\t\t\tString[] arr = tableFilterSql.split(\" (?i)where \");\n\t\t\ttable = arr[0];\n\t\t\tfilterSql = oConvertUtils.getString(arr[1], null);\n\t\t}else{\n\t\t\ttable = tableFilterSql;\n\t\t}\n\t\t\n\t\t// 3.SQL注入check\n\t\tSqlInjectionUtil.filterContentMulti(table, text, code);\n\t\tSqlInjectionUtil.specialFilterContentForDictSql(filterSql);\n\t\t\n\t\t// 4.针对采用 ${}写法的表名和字段进行转义和check\n\t\ttable = SqlInjectionUtil.getSqlInjectTableName(table);\n\t\ttext = SqlInjectionUtil.getSqlInjectField(text);\n\t\tcode = SqlInjectionUtil.getSqlInjectField(code);\n\t\t\n\t\t//return sysDictMapper.queryTableDictItemsByCode(tableFilterSql,text,code);\n\t\ttable = table.toLowerCase();\n\t\treturn sysDictMapper.queryTableDictWithFilter(table,text,code,filterSql);\n\t}\n\n\t@Override\n\tpublic List<DictModel> queryTableDictItemsByCodeAndFilter(String table, String text, String code, String filterSql) {\n\t\tlog.debug(\"无缓存dictTableList的时候调用这里！\");\n\n\t\t// 1.SQL注入校验（只限制非法串改数据库）\n\t\tSqlInjectionUtil.specialFilterContentForDictSql(table);\n\t\tSqlInjectionUtil.filterContentMulti(text, code);\n\t\tSqlInjectionUtil.specialFilterContentForDictSql(filterSql);\n\t\t\n\t\tString str = table+\",\"+text+\",\"+code;\n\t\t// 【QQYUN-6533】表字典白名单check\n\t\tsysBaseAPI.dictTableWhiteListCheckByDict(table, text, code);\n\t\t// 2.表字典黑名单 Check\n\t\tif(!dictQueryBlackListHandler.isPass(str)){\n\t\t\tlog.error(dictQueryBlackListHandler.getError());\n\t\t\treturn null;\n\t\t}\n\n\t\t// 3.针对采用 ${}写法的表名和字段进行转义和check\n\t\ttable = SqlInjectionUtil.getSqlInjectTableName(table);\n\t\ttext = SqlInjectionUtil.getSqlInjectField(text);\n\t\tcode = SqlInjectionUtil.getSqlInjectField(code);\n\t\ttable = table.toLowerCase();\n\t\treturn sysDictMapper.queryTableDictWithFilter(table,text,code,filterSql);\n\t}\n\t\n\t/**\n\t * 通过查询指定table的 text code 获取字典值text\n\t * dictTableCache采用redis缓存有效期10分钟\n\t * @param table\n\t * @param text\n\t * @param code\n\t * @param key\n\t * @return\n\t */\n\t@Override\n\t@Cacheable(value = CacheConstant.SYS_DICT_TABLE_CACHE, unless = \"#result == null \")\n\tpublic String queryTableDictTextByKey(String table,String text,String code, String key) {\n\t\tlog.debug(\"无缓存dictTable的时候调用这里！\");\n\t\t\n\t\tString str = table+\",\"+text+\",\"+code;\n\t\t// 【QQYUN-6533】表字典白名单check\n\t\tsysBaseAPI.dictTableWhiteListCheckByDict(table, text, code);\n\t\t// 1.表字典黑名单check\n\t\tif(!dictQueryBlackListHandler.isPass(str)){\n\t\t\tlog.error(dictQueryBlackListHandler.getError());\n\t\t\treturn null;\n\t\t}\n\t\t// 2.sql注入check\n\t\tSqlInjectionUtil.filterContentMulti(table, text, code, key);\n\n\t\t// 3.针对采用 ${}写法的表名和字段进行转义和check\n\t\ttable = SqlInjectionUtil.getSqlInjectTableName(table);\n\t\ttext = SqlInjectionUtil.getSqlInjectField(text);\n\t\tcode = SqlInjectionUtil.getSqlInjectField(code);\n\t\t\n\t\tList<DictModel> dictModeList = sysDictMapper.queryTableDictByKeysAndFilterSql(table, text, code, null, Arrays.asList(key));\n\t\tif(CollectionUtils.isEmpty(dictModeList)){\n\t\t\treturn null;\n\t\t}else{\n\t\t\treturn dictModeList.get(0).getText();\n\t\t}\n\t\t\n\t\t//此方法删除（20230902）\n\t\t//return sysDictMapper.queryTableDictTextByKey(table,text,code,key);\n\t}\n\n\t@Override\n\tpublic List<DictModel> queryTableDictTextByKeys(String table, String text, String code, List<String> codeValues, String dataSource) {\n\t\tString str = table+\",\"+text+\",\"+code;\n\t\t//update-begin---author:chenrui ---date:20231221  for：[issues/#5643]解决分布式下表字典跨库无法查询问题------------\n\t\t// 是否自定义数据源\n\t\tboolean isCustomDataSource = oConvertUtils.isNotEmpty(dataSource);\n\t\t// 如果是自定义数据源就不检查表字典白名单\n\t\tif (!isCustomDataSource) {\n\t\t\t// 【QQYUN-6533】表字典白名单check\n\t\t\tsysBaseAPI.dictTableWhiteListCheckByDict(table, text, code);\n\t\t\t// 1.表字典黑名单check\n\t\t\tif (!dictQueryBlackListHandler.isPass(str)) {\n\t\t\t\tlog.error(dictQueryBlackListHandler.getError());\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\t// 2.分割SQL获取表名和条件\n\t\tString filterSql = null;\n\t\tif(table.toLowerCase().indexOf(DataBaseConstant.SQL_WHERE)>0){\n\t\t\tString[] arr = table.split(\" (?i)where \");\n\t\t\ttable = arr[0];\n\t\t\tfilterSql = arr[1];\n\t\t}\n\t\t\n\t\t// 3.SQL注入check\n\t\tSqlInjectionUtil.filterContentMulti(table, text, code);\n\t\tSqlInjectionUtil.specialFilterContentForDictSql(filterSql);\n\n\t\t// 4.针对采用 ${}写法的表名和字段进行转义和check\n\t\ttable = SqlInjectionUtil.getSqlInjectTableName(table);\n\t\ttext = SqlInjectionUtil.getSqlInjectField(text);\n\t\tcode = SqlInjectionUtil.getSqlInjectField(code);\n\n        // 切换为字典表的数据源\n        if (isCustomDataSource) {\n            DynamicDataSourceContextHolder.push(dataSource);\n        }\n\t\t//update-begin---author:jarysun ---date:20251020  for：[issues/#9002]解决表字典查询出现异常之后，数据源不能恢复问题------------\n\t\tList<DictModel> restData = null;\n\n\t\ttry {\n\t\t\trestData = sysDictMapper.queryTableDictByKeysAndFilterSql(table, text, code, filterSql, codeValues);\n\t\t} finally {\n\t\t\t// 清理自定义的数据源\n\t\t\tif (isCustomDataSource) {\n\t\t\t\tDynamicDataSourceContextHolder.clear();\n\t\t\t}\n\t\t}\n\t\t//update-end---author:jarysun ---date:20251020  for：[issues/#9002]解决表字典查询出现异常之后，数据源不能恢复问题------------\n\n\t\treturn restData;\n\t}\n\n\t@Override\n\tpublic List<String> queryTableDictByKeys(String table, String text, String code, String keys) {\n\t\tString str = table+\",\"+text+\",\"+code;\n\t\t// 【QQYUN-6533】表字典白名单check\n\t\tsysBaseAPI.dictTableWhiteListCheckByDict(table, text, code);\n\t\t// 1.表字典黑名单check\n\t\tif(!dictQueryBlackListHandler.isPass(str)){\n\t\t\tlog.error(dictQueryBlackListHandler.getError());\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\treturn this.queryTableDictByKeys(table, text, code, keys, true);\n\t}\n\n\t/**\n\t * 通过查询指定table的 text code 获取字典，包含text和value\n\t * dictTableCache采用redis缓存有效期10分钟\n\t * @param table\n\t * @param text\n\t * @param code\n\t * @param codeValuesStr (逗号分隔)\n\t * @param delNotExist 是否移除不存在的项，默认为true，设为false如果某个key不存在数据库中，则直接返回key本身\n\t * @return\n\t */\n\t@Override\n\tpublic List<String> queryTableDictByKeys(String table, String text, String code, String codeValuesStr, boolean delNotExist) {\n\t\tif(oConvertUtils.isEmpty(codeValuesStr)){\n\t\t\treturn null;\n\t\t}\n\n\t\t//1.分割sql获取表名 和 条件sql\n\t\tString filterSql = null;\n\t\tif(table.toLowerCase().indexOf(\"where\")!=-1){\n\t\t\tString[] arr = table.split(\" (?i)where \");\n\t\t\ttable = arr[0];\n\t\t\tfilterSql = arr[1];\n\t\t}\n\n\t\t// 2.SQL注入check\n\t\tSqlInjectionUtil.filterContentMulti(table, text, code);\n\t\tSqlInjectionUtil.specialFilterContentForDictSql(filterSql);\n\n\t\tString str = table+\",\"+text+\",\"+code;\n\t\t// 【QQYUN-6533】表字典白名单check\n\t\tsysBaseAPI.dictTableWhiteListCheckByDict(table, text, code);\n\t\t// 3.表字典黑名单check\n\t\tif(!dictQueryBlackListHandler.isPass(str)){\n\t\t\tlog.error(dictQueryBlackListHandler.getError());\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\t// 4.针对采用 ${}写法的表名和字段进行转义和check\n\t\ttable = SqlInjectionUtil.getSqlInjectTableName(table);\n\t\ttext = SqlInjectionUtil.getSqlInjectField(text);\n\t\tcode = SqlInjectionUtil.getSqlInjectField(code);\n\t\t\n\t\t//字典条件值\n\t\tString[] codeValues = codeValuesStr.split(\",\");\n\t\t// 5.查询字典数据\n\t\tList<DictModel> dicts = sysDictMapper.queryTableDictByKeysAndFilterSql(SqlInjectionUtil.getSqlInjectTableName(table), \n\t\t\t\tSqlInjectionUtil.getSqlInjectField(text), SqlInjectionUtil.getSqlInjectField(code), filterSql, Arrays.asList(codeValues));\n\t\t\n\t\tList<String> texts = new ArrayList<>(dicts.size());\n\t\t// 6.查询出来的顺序可能是乱的，需要排个序\n\t\tfor (String conditionalVal : codeValues) {\n\t\t\tList<DictModel> res = dicts.stream().filter(i -> conditionalVal.equals(i.getValue())).collect(Collectors.toList());\n\t\t\tif (res.size() > 0) {\n\t\t\t\ttexts.add(res.get(0).getText());\n\t\t\t} else if (!delNotExist) {\n\t\t\t\ttexts.add(conditionalVal);\n\t\t\t}\n\t\t}\n\t\treturn texts;\n\t}\n\n    /**\n     * 根据字典类型id删除关联表中其对应的数据\n     */\n    @Override\n    public boolean deleteByDictId(SysDict sysDict) {\n        sysDict.setDelFlag(CommonConstant.DEL_FLAG_1);\n        return  this.updateById(sysDict);\n    }\n\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public Integer saveMain(SysDict sysDict, List<SysDictItem> sysDictItemList) {\n\t\tint insert=0;\n    \ttry{\n\t\t\t insert = sysDictMapper.insert(sysDict);\n\t\t\tif (sysDictItemList != null) {\n\t\t\t\tfor (SysDictItem entity : sysDictItemList) {\n                    // 代码逻辑说明: [JTC-1168]如果字典项值为空，则字典项忽略导入------------\n\t\t\t\t    if(oConvertUtils.isEmpty(entity.getItemValue())){\n\t\t\t\t        return -1;\n                    }\n\t\t\t\t\tentity.setDictId(sysDict.getId());\n\t\t\t\t\tentity.setStatus(1);\n\t\t\t\t\tsysDictItemMapper.insert(entity);\n\t\t\t\t}\n\t\t\t}\n\t\t}catch(Exception e){\n\t\t\treturn insert;\n\t\t}\n\t\treturn insert;\n    }\n\n\t@Override\n\tpublic List<DictModel> queryAllDepartBackDictModel() {\n\t\treturn baseMapper.queryAllDepartBackDictModel();\n\t}\n\n\t@Override\n\tpublic List<DictModel> queryAllUserBackDictModel() {\n\t\treturn baseMapper.queryAllUserBackDictModel();\n\t}\n\t\n//\t@Override\n//\tpublic List<DictModel> queryTableDictItems(String table, String text, String code, String keyword) {\n//\t\treturn baseMapper.queryTableDictItems(table, text, code, \"%\"+keyword+\"%\");\n//\t}\n\n\t@Override\n\tpublic List<DictModel> queryLittleTableDictItems(String tableSql, String text, String code, String condition, String keyword, int pageNo, int pageSize) {\n\t\tint current = oConvertUtils.getInt(pageNo, 1);\n\t\tPage<DictModel> page = new Page<DictModel>(current, pageSize);\n\t\tpage.setSearchCount(false);\n\t\t\n\t\t//为了防止sql（jeecg提供了防注入的方法，可以在拼接 SQL 语句时自动对参数进行转义，避免SQL注入攻击）\n\t\t// 1. 针对采用 ${}写法的表名和字段进行转义和check\n\t\tString table = SqlInjectionUtil.getSqlInjectTableName(CommonUtils.getTableNameByTableSql(tableSql));\n\t\ttext = SqlInjectionUtil.getSqlInjectField(text);\n\t\tcode = SqlInjectionUtil.getSqlInjectField(code);\n\n\t\t// 2. 查询条件SQL (获取条件sql方法含sql注入校验)\n\t\tString filterSql = getFilterSql(tableSql, text, code, condition, keyword);\n\t\t\n\t\t// 3. 返回表字典数据\n\t\tIPage<DictModel> pageList = baseMapper.queryPageTableDictWithFilter(page, table, text, code, filterSql);\n\t\treturn pageList.getRecords();\n\t}\n\n\t/**\n\t * 获取条件语句 (下拉搜索组件 支持传入排序信息 查询排序)\n\t * \n\t * @param text\n\t * @param code\n\t * @param condition\n\t * @param keyword\n\t * @return\n\t */\n\tprivate String getFilterSql(String tableSql, String text, String code, String condition, String keyword){\n\t\tString filterSql = \"\";\n\t\tString keywordSql = null;\n\t\tString sqlWhere = \"where \";\n\t\tString sqlAnd = \" and \";\n\t\t\n\t\t//【JTC-631】判断如果 table 携带了 where 条件，那么就使用 and 查询，防止报错\n\t\tboolean tableHasWhere = tableSql.toLowerCase().contains(sqlWhere);\n        if (tableHasWhere) {\n\t\t\tsqlWhere = CommonUtils.getFilterSqlByTableSql(tableSql);\n\t\t}\n\n\t\t// 下拉搜索组件 支持传入排序信息 查询排序\n\t\tString orderField = \"\", orderType = \"\";\n\t\tif (oConvertUtils.isNotEmpty(keyword)) {\n\t\t\t// 关键字里面如果写入了 排序信息 xxxxx[orderby:create_time,desc]\n\t\t\tString orderKey = \"[orderby\";\n\t\t\tif (keyword.indexOf(orderKey) >= 0 && keyword.endsWith(\"]\")) {\n\t\t\t\tString orderInfo = keyword.substring(keyword.indexOf(orderKey) + orderKey.length() + 1, keyword.length() - 1);\n\t\t\t\tkeyword = keyword.substring(0, keyword.indexOf(orderKey));\n\t\t\t\tString[] orderInfoArray = orderInfo.split(SymbolConstant.COMMA);\n\t\t\t\torderField = orderInfoArray[0];\n\t\t\t\torderType = orderInfoArray[1];\n\t\t\t}\n\n\t\t\tif (oConvertUtils.isNotEmpty(keyword)) {\n\t\t\t\t// 判断是否是多选\n\t\t\t\tif (keyword.contains(SymbolConstant.COMMA)) {\n\t\t\t\t\t// 代码逻辑说明: JTC-529【表单设计器】 编辑页面报错，in参数采用双引号导致 ----\n\t\t\t\t\tString inKeywords = \"'\" + String.join(\"','\", keyword.split(\",\")) + \"'\";\n\t\t\t\t\tkeywordSql = \"(\" + text + \" in (\" + inKeywords + \") or \" + code + \" in (\" + inKeywords + \"))\";\n\t\t\t\t} else {\n\t\t\t\t\tkeywordSql = \"(\"+text + \" like '%\"+keyword+\"%' or \"+ code + \" like '%\"+keyword+\"%')\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t//下拉搜索组件 支持传入排序信息 查询排序\n\t\t// 代码逻辑说明: [QQYUN-8514]Online表单中 下拉搜索框 搜索时报sql错误，生成的SQL多了一个 “and\" ------------\n        if (oConvertUtils.isNotEmpty(condition) && oConvertUtils.isNotEmpty(keywordSql)) {\n            filterSql += sqlWhere + (tableHasWhere ? sqlAnd : \" \") + condition + sqlAnd + keywordSql;\n        } else if (oConvertUtils.isNotEmpty(condition)) {\n            filterSql += sqlWhere + (tableHasWhere ? sqlAnd : \" \") + condition;\n        } else if (oConvertUtils.isNotEmpty(keywordSql)) {\n            filterSql += sqlWhere + (tableHasWhere ? sqlAnd : \" \") + keywordSql;\n        } else if (tableHasWhere) {\n            filterSql += sqlWhere;\n        }\n\t\t// 增加排序逻辑\n\t\tif (oConvertUtils.isNotEmpty(orderField)) {\n\t\t\tfilterSql += \" order by \" + orderField + \" \" + orderType;\n\t\t}\n\n\t\t// 处理返回条件\n\t\t// 1.1 返回条件SQL（去掉开头的 where ）\n\t\tfinal String wherePrefix = \"(?i)where \"; // (?i) 表示不区分大小写\n\t\tString filterSqlString = filterSql.trim().replaceAll(wherePrefix, \"\");\n\t\t// 1.2 条件SQL进行漏洞 check\n\t\tSqlInjectionUtil.specialFilterContentForDictSql(filterSqlString);\n\t\t// 1.3 判断如何返回条件是 order by开头则前面拼上 1=1\n\t\tif (oConvertUtils.isNotEmpty(filterSqlString) && filterSqlString.trim().toUpperCase().startsWith(\"ORDER\")) {\n\t\t\tfilterSqlString = \" 1=1 \" + filterSqlString;\n\t\t}\n\t\treturn filterSqlString;\n\t}\n\t\n\t\n\t@Override\n\tpublic List<DictModel> queryAllTableDictItems(String table, String text, String code, String condition, String keyword) {\n\t\t// 1.获取条件sql\n\t\tString filterSql = getFilterSql(table, text, code, condition, keyword);\n\n\t\t// 为了防止sql（jeecg提供了防注入的方法，可以在拼接 SQL 语句时自动对参数进行转义，避免SQL注入攻击）\n\t\t// 2.针对采用 ${}写法的表名和字段进行转义和check\n\t\ttable = SqlInjectionUtil.getSqlInjectTableName(table);\n\t\ttext = SqlInjectionUtil.getSqlInjectField(text);\n\t\tcode = SqlInjectionUtil.getSqlInjectField(code);\n\t\t\n\t\tList<DictModel> ls = baseMapper.queryTableDictWithFilter(table, text, code, filterSql);\n    \treturn ls;\n\t}\n\n\t@Override\n\tpublic List<TreeSelectModel> queryTreeList(Map<String, String> query, String table, String text, String code, String pidField, String pid, String hasChildField, int converIsLeafVal) {\n\t\t//为了防止sql（jeecg提供了防注入的方法，可以在拼接 SQL 语句时自动对参数进行转义，避免SQL注入攻击）\n\t\t// 1.针对采用 ${}写法的表名和字段进行转义和check\n        //update-begin---author:chenrui ---date:20251015  for：[QQYUN-13741]【客户问题 南自】online表单自定义树 表后边加条件时 不生效------------\n        // 分割SQL获取表名和条件\n        String filterSql = null;\n        if(table.toLowerCase().indexOf(DataBaseConstant.SQL_WHERE)>0){\n            String[] arr = table.split(\" (?i)where \");\n            table = arr[0];\n            filterSql = oConvertUtils.getString(arr[1], null);\n        }\n        table = SqlInjectionUtil.getSqlInjectTableName(table);\n\t\ttext = SqlInjectionUtil.getSqlInjectField(text);\n\t\tcode = SqlInjectionUtil.getSqlInjectField(code);\n\t\tpidField = SqlInjectionUtil.getSqlInjectField(pidField);\n\t\thasChildField = SqlInjectionUtil.getSqlInjectField(hasChildField);\n\n\t\tif(oConvertUtils.isEmpty(text) || oConvertUtils.isEmpty(code)){\n\t\t\tlog.warn(\"text={}，code={}\", text, code);\n\t\t\tlog.warn(\"加载树字典参数有误，text和code不允许为空！\");\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\t// 2.检测最终SQL是否存在SQL注入风险\n\t\tString dictCode = table + \",\" + text + \",\" + code;\n\t\tSqlInjectionUtil.filterContentMulti(dictCode);\n        SqlInjectionUtil.specialFilterContentForDictSql(filterSql);\n\n\t\t// 【QQYUN-6533】表字典白名单check\n\t\tsysBaseAPI.dictTableWhiteListCheckByDict(table, text, code);\n\t\t// 3.表字典SQL表名黑名单 Check\n\t\tif(!dictQueryBlackListHandler.isPass(dictCode)){\n\t\t\tlog.error(\"Sql异常：{}\", dictQueryBlackListHandler.getError());\n\t\t\treturn null;\n\t\t}\n\t\t// 4.检测查询条件是否存在SQL注入\n\t\tMap<String, String> queryParams = queryParams = new HashMap<>(4);\n\t\tif (query != null) {\n\t\t\tfor (Map.Entry<String, String> searchItem : query.entrySet()) {\n\t\t\t\tString fieldName = searchItem.getKey();\n\t\t\t\tqueryParams.put(SqlInjectionUtil.getSqlInjectField(fieldName), searchItem.getValue());\n\t\t\t}\n\t\t}\n        // 代码逻辑说明: [QQYUN-13741]【客户问题 南自】online表单自定义树 表后边加条件时 不生效------------\n        if(oConvertUtils.isNotEmpty(filterSql)){\n            queryParams.put(\"_tableFilterSql\", filterSql);\n        }\n\t\t\n\t\treturn baseMapper.queryTreeList(queryParams, table, text, code, pidField, pid, hasChildField, converIsLeafVal);\n\t}\n\n\t@Override\n\tpublic void deleteOneDictPhysically(String id) {\n\t\tthis.baseMapper.deleteOneById(id);\n\t\tthis.sysDictItemMapper.delete(new LambdaQueryWrapper<SysDictItem>().eq(SysDictItem::getDictId,id));\n\t}\n\n\t@Override\n\tpublic void updateDictDelFlag(int delFlag, String id) {\n\t\tbaseMapper.updateDictDelFlag(delFlag,id);\n\t}\n\n\t@Override\n\tpublic List<SysDict> queryDeleteList(String tenantId) {\n\t\t// 代码逻辑说明: 【QQYUN-8340】回收站查找软删除记录时，没有判断是否启用多租户，造成可以查找并回收其他租户的数据 #5907---\n\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\tif(oConvertUtils.isEmpty(tenantId)){\n\t\t\t\treturn new ArrayList<>();\n\t\t\t}\n\t\t\treturn baseMapper.queryDeleteListBtTenantId(oConvertUtils.getInt(tenantId));\n\t\t}\n\t\treturn baseMapper.queryDeleteList();\n\t}\n\n\t@Override\n\tpublic List<DictModel> queryDictTablePageList(DictQuery query, int pageSize, int pageNo) {\n\t\tPage page = new Page(pageNo,pageSize,false);\n\t\t\n\t\t//为了防止sql（jeecg提供了防注入的方法，可以在拼接 SQL 语句时自动对参数进行转义，避免SQL注入攻击）\n\t\t// 1. 针对采用 ${}写法的表名和字段进行转义和check\n\t\tString table = SqlInjectionUtil.getSqlInjectTableName(query.getTable());\n\t\tString text = SqlInjectionUtil.getSqlInjectTableName(query.getText());\n\t\tString code = SqlInjectionUtil.getSqlInjectTableName(query.getCode());\n\t\tquery.setCode(table);\n\t\tquery.setTable(text);\n\t\tquery.setText(code);\n\t\t\n\t\tString dictCode = table+\",\"+text+\",\"+code;\n\t\t// 【QQYUN-6533】表字典白名单check\n\t\tsysBaseAPI.dictTableWhiteListCheckByDict(table, text, code);\n\t\t// 2.表字典黑名单check\n\t\tif(!dictQueryBlackListHandler.isPass(dictCode)){\n\t\t\tlog.error(dictQueryBlackListHandler.getError());\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\t// 3.SQL注入check\n\t\tSqlInjectionUtil.filterContentMulti(dictCode);\n\t\t\n\t\tPage<DictModel> pageList = baseMapper.queryDictTablePageList(page, query);\n\t\treturn pageList.getRecords();\n\t}\n\n\t@Override\n\tpublic List<DictModel> getDictItems(String dictCode) {\n\t\tList<DictModel> ls;\n\t\tif (dictCode.contains(SymbolConstant.COMMA)) {\n\t\t\t//关联表字典（举例：sys_user,realname,id）\n\t\t\tString[] params = dictCode.split(\",\");\n\t\t\tif (params.length < 3) {\n\t\t\t\t// 字典Code格式不正确\n\t\t\t\treturn null;\n\t\t\t}\n\t\n\t\t\tif (params.length == 4) {\n\t\t\t\tls = this.queryTableDictItemsByCodeAndFilter(params[0], params[1], params[2], params[3]);\n\t\t\t} else if (params.length == 3) {\n\t\t\t\tls = this.queryTableDictItemsByCode(params[0], params[1], params[2]);\n\t\t\t} else {\n\t\t\t\t// 字典Code格式不正确\n\t\t\t\treturn null;\n\t\t\t}\n\t\t} else {\n\t\t\t//字典表\n\t\t\tls = this.queryDictItemsByCode(dictCode);\n\t\t}\n\t\t// 代码逻辑说明: 字典获取可以获取枚举类的数据\n\t\tif (ls == null || ls.size() == 0) {\n\t\t\tMap<String, List<DictModel>> map = ResourceUtil.getEnumDictData();\n\t\t\tif (map.containsKey(dictCode)) {\n\t\t\t\treturn map.get(dictCode);\n\t\t\t}\n\t\t}\n\t\treturn ls;\n\t}\n\n\t@Override\n\tpublic List<DictModel> loadDict(String dictCode, String keyword, Integer pageNo, Integer pageSize) {\n\t\t// 【QQYUN-6533】表字典白名单check\n\t\tsysBaseAPI.dictTableWhiteListCheckByDict(dictCode);\n\t\t// 1.表字典黑名单check\n\t\tif(!dictQueryBlackListHandler.isPass(dictCode)){\n\t\t\tlog.error(dictQueryBlackListHandler.getError());\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\t// 2.字典SQL注入风险check\n\t\tSqlInjectionUtil.specialFilterContentForDictSql(dictCode);\n\n\t\tif (dictCode.contains(SymbolConstant.COMMA)) {\n\t\t\t// 代码逻辑说明: 下拉搜索不支持表名后加查询条件\n\t\t\tString[] params = dictCode.split(\",\");\n\t\t\tString condition = null;\n\t\t\tif (params.length != 3 && params.length != 4) {\n\t\t\t\t// 字典Code格式不正确\n\t\t\t\treturn null;\n\t\t\t} else if (params.length == 4) {\n\t\t\t\tcondition = params[3];\n\t\t\t\t// 代码逻辑说明: online表单下拉搜索框表字典配置#{sys_org_code}报错 #3500\n\t\t\t\tif(condition.indexOf(SymbolConstant.SYS_VAR_PREFIX)>=0){\n\t\t\t\t\tcondition =  QueryGenerator.getSqlRuleValue(condition);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 字典Code格式不正确 [表名为空]\n\t\t\tif(oConvertUtils.isEmpty(params[0])){\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tList<DictModel> ls;\n\t\t\tif (pageSize != null) {\n\t\t\t\tls = this.queryLittleTableDictItems(params[0], params[1], params[2], condition, keyword, pageNo,pageSize);\n\t\t\t} else {\n\t\t\t\tls = this.queryAllTableDictItems(params[0], params[1], params[2], condition, keyword);\n\t\t\t}\n\t\t\treturn ls;\n\t\t} else {\n\t\t\t// 字典Code格式不正确\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t@Override\n\tpublic List<SysDictVo> getDictListByLowAppId(String lowAppId) {\n\t\tint tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n\t\tList<SysDict> list =  baseMapper.getDictListByLowAppId(lowAppId,tenantId);\n\t\t//查询字典下面的字典项\n\t\tList<SysDictVo> dictVoList = new ArrayList<>();\n\t\tfor (SysDict dict:list) {\n\t\t\tSysDictVo dictVo = new SysDictVo();\n\t\t\tBeanUtils.copyProperties(dict,dictVo);\n\t\t\tList<SysDictItem> sysDictItems = sysDictItemMapper.selectItemsByMainId(dict.getId());\n\t\t\tdictVo.setDictItemsList(sysDictItems);\n\t\t\tdictVoList.add(dictVo);\n\t\t}\n\t\treturn dictVoList;\n\t}\n\n\t@Override\n\tpublic String addDictByLowAppId(SysDictVo sysDictVo) {\n\t\tString[] dictResult = this.addDict(sysDictVo.getDictName(),sysDictVo.getLowAppId(),sysDictVo.getTenantId());\n\t\tString id = dictResult[0];\n\t\tString code = dictResult[1];\n\t\tthis.addDictItem(id,sysDictVo.getDictItemsList());\n\t\treturn code;\n\t}\n\n\t@Override\n\tpublic void editDictByLowAppId(SysDictVo sysDictVo) {\n\t\tString id = sysDictVo.getId();\n\t\tSysDict dict = baseMapper.selectById(id);\n\t\tif(null == dict){\n\t\t\tthrow new JeecgBootException(\"字典数据不存在\");\n\t\t}\n\t\t//判断应用id和数据库中的是否一致，不一致不让修改\n\t\tif(!dict.getLowAppId().equals(sysDictVo.getLowAppId())){\n\t\t\tthrow new JeecgBootException(\"字典数据不存在\");\n\t\t}\n\t\tSysDict sysDict = new SysDict();\n\t\tsysDict.setDictName(sysDictVo.getDictName());\n\t\tsysDict.setId(id);\n\t\tbaseMapper.updateById(sysDict);\n\t\tthis.updateDictItem(id,sysDictVo.getDictItemsList());\n\t\t// 删除字典缓存\n\t\tredisUtil.removeAll(CacheConstant.SYS_DICT_CACHE + \"::\" + dict.getDictCode());\n\t}\n\n\t/**\n\t * 还原逻辑删除\n\t * @param ids\n\t */\n\t@Override\n\tpublic boolean revertLogicDeleted(List<String> ids) {\n\t\treturn baseMapper.revertLogicDeleted(ids) > 0;\n\t}\n\n\t/**\n\t * 彻底删除\n\t * @param ids\n\t * @return\n\t */\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic boolean removeLogicDeleted(List<String> ids) {\n\t\t// 1. 删除字典\n\t\tint line = this.baseMapper.removeLogicDeleted(ids);\n\t\t// 2. 删除字典选项配置\n\t\tline += this.sysDictItemMapper.delete(new LambdaQueryWrapper<SysDictItem>().in(SysDictItem::getDictId, ids));\n\t\treturn line > 0;\n\t}\n\n\t/**\n\t * 添加字典\n\t * @param dictName\n\t */\n\tprivate String[] addDict(String dictName,String lowAppId, Integer tenantId) {\n\t\tSysDict dict = new SysDict();\n\t\tdict.setDictName(dictName);\n\t\tdict.setDictCode(RandomUtil.randomString(10));\n\t\tdict.setDelFlag(Integer.valueOf(CommonConstant.STATUS_0));\n\t\tdict.setLowAppId(lowAppId);\n\t\tdict.setTenantId(tenantId);\n\t\tbaseMapper.insert(dict);\n\t\tString[] dictResult = new String[]{dict.getId(), dict.getDictCode()};\n\t\treturn dictResult;\n\t}\n\n\t/**\n\t * 添加字典子项\n\t * @param id\n\t * @param dictItemList\n\t */\n\tprivate void addDictItem(String id,List<SysDictItem> dictItemList) {\n\t\tif(null!=dictItemList && dictItemList.size()>0){\n\t\t\tfor (SysDictItem dictItem:dictItemList) {\n\t\t\t\tSysDictItem sysDictItem = new SysDictItem();\n\t\t\t\tBeanUtils.copyProperties(dictItem,sysDictItem);\n\t\t\t\tsysDictItem.setDictId(id);\n\t\t\t\tsysDictItem.setId(\"\");\n\t\t\t\tsysDictItem.setStatus(Integer.valueOf(CommonConstant.STATUS_1));\n\t\t\t\tsysDictItemMapper.insert(sysDictItem);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * 更新字典子项\n\t * @param id\n\t * @param dictItemList\n\t */\n\tprivate void updateDictItem(String id,List<SysDictItem> dictItemList){\n\t\t//先删除在新增 因为排序可能不一致\n\t\tLambdaQueryWrapper<SysDictItem> query = new LambdaQueryWrapper<>();\n\t\tquery.eq(SysDictItem::getDictId,id);\n\t\tsysDictItemMapper.delete(query);\n\t\t//新增子项\n\t\tthis.addDictItem(id,dictItemList);\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysFillRuleServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.jeecg.modules.system.entity.SysFillRule;\nimport org.jeecg.modules.system.mapper.SysFillRuleMapper;\nimport org.jeecg.modules.system.service.ISysFillRuleService;\nimport org.springframework.stereotype.Service;\n\n/**\n * @Description: 填值规则\n * @Author: jeecg-boot\n * @Date: 2019-11-07\n * @Version: V1.0\n */\n@Service(\"sysFillRuleServiceImpl\")\npublic class SysFillRuleServiceImpl extends ServiceImpl<SysFillRuleMapper, SysFillRule> implements ISysFillRuleService {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysFormFileServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.jeecg.modules.system.entity.SysFormFile;\nimport org.jeecg.modules.system.mapper.SysFormFileMapper;\nimport org.jeecg.modules.system.service.ISysFormFileService;\nimport org.springframework.stereotype.Service;\n\n\n/**\n * @Description: 表单评论文件\n * @Author: jeecg-boot\n * @Date: 2022-07-21\n * @Version: V1.0\n */\n@Service\npublic class SysFormFileServiceImpl extends ServiceImpl<SysFormFileMapper, SysFormFile> implements ISysFormFileService {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysGatewayRouteServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport cn.hutool.core.util.ObjectUtil;\nimport cn.hutool.core.util.RandomUtil;\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.common.constant.CacheConstant;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.GlobalConstants;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysGatewayRoute;\nimport org.jeecg.modules.system.mapper.SysGatewayRouteMapper;\nimport org.jeecg.modules.system.service.ISysGatewayRouteService;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * @Description: gateway路由管理\n * @Author: jeecg-boot\n * @Date: 2020-05-26\n * @Version: V1.0\n */\n@Service\n@Slf4j\npublic class SysGatewayRouteServiceImpl extends ServiceImpl<SysGatewayRouteMapper, SysGatewayRoute> implements ISysGatewayRouteService {\n\n    @Autowired\n    private RedisTemplate<String, Object> redisTemplate;\n\n    private static final String STRING_STATUS = \"status\";\n    private static final SimpleDateFormat dateFormat = new SimpleDateFormat(\"MMdd\");\n    @Override\n    public void addRoute2Redis(String key) {\n        List<SysGatewayRoute> ls = this.list(new LambdaQueryWrapper<SysGatewayRoute>());\n        redisTemplate.opsForValue().set(key, JSON.toJSONString(ls));\n    }\n\n    @Override\n    public void deleteById(String id) {\n        //1.将状态修改成禁用\n        SysGatewayRoute route = new SysGatewayRoute();\n        route.setId(id);\n        route.setStatus(0);\n        this.baseMapper.updateById(route);\n        this.removeById(id);\n        //2.刷新路由\n        this.resreshRouter(id);\n    }\n\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public void updateAll(JSONObject json) {\n        log.info(\"--gateway 路由配置修改--\");\n        try {\n            json = json.getJSONObject(\"router\");\n            String id = json.getString(\"id\");\n            // 代码逻辑说明: oracle路由网关新增小bug /issues/I4EV2J\n            SysGatewayRoute route;\n            if(oConvertUtils.isEmpty(id)){\n                route = new SysGatewayRoute();\n            }else{\n                route = getById(id);\n            }\n            if (ObjectUtil.isEmpty(route)) {\n                route = new SysGatewayRoute();\n            }\n            route.setRouterId(json.getString(\"routerId\"));\n            route.setName(json.getString(\"name\"));\n            route.setPredicates(json.getString(\"predicates\"));\n            //初始化删除状态\n            route.setDelFlag(CommonConstant.DEL_FLAG_0);\n            String filters = json.getString(\"filters\");\n            if (ObjectUtil.isEmpty(filters)) {\n                filters = \"[]\";\n            }\n            route.setFilters(filters);\n            route.setUri(json.getString(\"uri\"));\n            if (json.get(STRING_STATUS) == null) {\n                route.setStatus(1);\n            } else {\n                route.setStatus(json.getInteger(STRING_STATUS));\n            }\n            this.saveOrUpdate(route);\n            resreshRouter(null);\n        } catch (Exception e) {\n            log.error(\"路由配置解析失败\", e);\n            resreshRouter(null);\n            e.printStackTrace();\n        }\n    }\n\n    /**\n     * 更新redis路由缓存\n     */\n    private void resreshRouter(String delRouterId) {\n        //更新redis路由缓存\n        addRoute2Redis(CacheConstant.GATEWAY_ROUTES);\n        BaseMap params = new BaseMap();\n        params.put(GlobalConstants.HANDLER_NAME, GlobalConstants.LODER_ROUDER_HANDLER);\n        params.put(\"delRouterId\", delRouterId);\n        //刷新网关\n        redisTemplate.convertAndSend(GlobalConstants.REDIS_TOPIC_NAME, params);\n    }\n\n    @Override\n    public void clearRedis() {\n        redisTemplate.opsForValue().set(CacheConstant.GATEWAY_ROUTES, null);\n    }\n\n    /**\n     * 还原逻辑删除\n     * @param ids\n     */\n    @Override\n    public void revertLogicDeleted(List<String> ids) {\n        this.baseMapper.revertLogicDeleted(ids);\n        resreshRouter(null);\n    }\n\n    /**\n     * 彻底删除\n     * @param ids\n     */\n    @Override\n    public void deleteLogicDeleted(List<String> ids) {\n        this.baseMapper.deleteLogicDeleted(ids);\n        resreshRouter(ids.get(0));\n    }\n\n    /**\n     * 路由复制\n     * @param id\n     * @return\n     */\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public SysGatewayRoute copyRoute(String id) {\n        log.info(\"--gateway 路由复制--\");\n        SysGatewayRoute targetRoute = new SysGatewayRoute();\n        try {\n            SysGatewayRoute sourceRoute = this.baseMapper.selectById(id);\n            //1.复制路由\n            BeanUtils.copyProperties(sourceRoute,targetRoute);\n            //1.1 获取当前日期\n            String formattedDate = dateFormat.format(new Date());\n            String copyRouteName = sourceRoute.getName() + \"_copy_\";\n            //1.2 判断数据库是否存在\n            Long count = this.baseMapper.selectCount(new LambdaQueryWrapper<SysGatewayRoute>().eq(SysGatewayRoute::getName, copyRouteName + formattedDate));\n            //1.3 新的路由名称\n            copyRouteName +=  count > 0?RandomUtil.randomNumbers(4):formattedDate;\n\n            targetRoute.setId(null);\n            targetRoute.setName(copyRouteName);\n            targetRoute.setCreateTime(new Date());\n            targetRoute.setStatus(0);\n            targetRoute.setDelFlag(CommonConstant.DEL_FLAG_0);\n            this.baseMapper.insert(targetRoute);\n            //2.刷新路由\n            resreshRouter(null);\n        } catch (Exception e) {\n            log.error(\"路由配置解析失败\", e);\n            resreshRouter(null);\n            e.printStackTrace();\n        }\n        return targetRoute;\n    }\n\n    /**\n     * 查询删除列表\n     * @return\n     */\n    @Override\n    public List<SysGatewayRoute> getDeletelist() {\n        return baseMapper.queryDeleteList();\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysLogServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport java.sql.SQLException;\nimport java.util.Date;\nimport java.util.List;\nimport java.util.Map;\n\nimport jakarta.annotation.Resource;\n\nimport com.baomidou.mybatisplus.annotation.DbType;\nimport org.jeecg.common.system.api.ISysBaseAPI;\nimport org.jeecg.common.util.CommonUtils;\nimport org.jeecg.modules.system.entity.SysLog;\nimport org.jeecg.modules.system.mapper.SysLogMapper;\nimport org.jeecg.modules.system.service.ISysLogService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\n\n/**\n * <p>\n * 系统日志表 服务实现类\n * </p>\n *\n * @Author zhangweijian\n * @since 2018-12-26\n */\n@Service\npublic class SysLogServiceImpl extends ServiceImpl<SysLogMapper, SysLog> implements ISysLogService {\n\n\t@Resource\n\tprivate SysLogMapper sysLogMapper;\n\t\n\t/**\n\t * @功能：清空所有日志记录\n\t */\n\t@Override\n\tpublic void removeAll() {\n\t\tsysLogMapper.removeAll();\n\t}\n\n\t@Override\n\tpublic Long findTotalVisitCount() {\n\t\treturn sysLogMapper.findTotalVisitCount();\n\t}\n\n\t@Override\n\tpublic Long findTodayVisitCount(Date dayStart, Date dayEnd) {\n\t\treturn sysLogMapper.findTodayVisitCount(dayStart,dayEnd);\n\t}\n\n\t@Override\n\tpublic Long findTodayIp(Date dayStart, Date dayEnd) {\n\t\treturn sysLogMapper.findTodayIp(dayStart,dayEnd);\n\t}\n\n\t@Override\n\tpublic List<Map<String,Object>> findVisitCount(Date dayStart, Date dayEnd) {\n\t\tDbType dbType = CommonUtils.getDatabaseTypeEnum();\n\t\treturn sysLogMapper.findVisitCount(dayStart, dayEnd,dbType.getDb());\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysPackPermissionServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport org.jeecg.modules.system.entity.SysPackPermission;\nimport org.jeecg.modules.system.mapper.SysPackPermissionMapper;\nimport org.jeecg.modules.system.service.ISysPackPermissionService;\nimport org.springframework.stereotype.Service;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\n\n/**\n * @Description: 产品包菜单关系表\n * @Author: jeecg-boot\n * @Date:   2022-12-31\n * @Version: V1.0\n */\n@Service\npublic class SysPackPermissionServiceImpl extends ServiceImpl<SysPackPermissionMapper, SysPackPermission> implements ISysPackPermissionService {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionDataRuleImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\nimport jakarta.annotation.Resource;\n\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysPermission;\nimport org.jeecg.modules.system.entity.SysPermissionDataRule;\nimport org.jeecg.modules.system.mapper.SysPermissionDataRuleMapper;\nimport org.jeecg.modules.system.mapper.SysPermissionMapper;\nimport org.jeecg.modules.system.service.ISysPermissionDataRuleService;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\n\n/**\n * <p>\n * 菜单权限规则  服务实现类\n * </p>\n *\n * @Author huangzhilin\n * @since 2019-04-01\n */\n@Service\npublic class SysPermissionDataRuleImpl extends ServiceImpl<SysPermissionDataRuleMapper, SysPermissionDataRule>\n\t\timplements ISysPermissionDataRuleService {\n\n\t@Resource\n\tprivate SysPermissionMapper sysPermissionMapper;\n\n\t/**\n\t * 根据菜单id查询其对应的权限数据\n\t */\n\t@Override\n\tpublic List<SysPermissionDataRule> getPermRuleListByPermId(String permissionId) {\n\t\tLambdaQueryWrapper<SysPermissionDataRule> query = new LambdaQueryWrapper<SysPermissionDataRule>();\n\t\tquery.eq(SysPermissionDataRule::getPermissionId, permissionId);\n\t\tquery.orderByDesc(SysPermissionDataRule::getCreateTime);\n\t\tList<SysPermissionDataRule> permRuleList = this.list(query);\n\t\treturn permRuleList;\n\t}\n\n\t/**\n\t * 根据前端传递的权限名称和权限值参数来查询权限数据\n\t */\n\t@Override\n\tpublic List<SysPermissionDataRule> queryPermissionRule(SysPermissionDataRule permRule) {\n\t\tQueryWrapper<SysPermissionDataRule> queryWrapper = QueryGenerator.initQueryWrapper(permRule, null);\n\t\treturn this.list(queryWrapper);\n\t}\n\n\t@Override\n\tpublic List<SysPermissionDataRule> queryPermissionDataRules(String username,String permissionId) {\n\t\tList<String> idsList = this.baseMapper.queryDataRuleIds(username, permissionId);\n\t\t// 代码逻辑说明: 数据权限失效问题处理--------------------\n\t\tif(idsList==null || idsList.size()==0) {\n\t\t\treturn null;\n\t\t}\n\t\tSet<String> set = new HashSet<String>();\n\t\tfor (String ids : idsList) {\n\t\t\tif(oConvertUtils.isEmpty(ids)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tString[] arr = ids.split(\",\");\n\t\t\tfor (String id : arr) {\n\t\t\t\tif(oConvertUtils.isNotEmpty(id) && !set.contains(id)) {\n\t\t\t\t\tset.add(id);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(set.size()==0) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.baseMapper.selectList(new QueryWrapper<SysPermissionDataRule>().in(\"id\", set).eq(\"status\",CommonConstant.STATUS_1));\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void savePermissionDataRule(SysPermissionDataRule sysPermissionDataRule) {\n\t\tthis.save(sysPermissionDataRule);\n\t\tSysPermission permission = sysPermissionMapper.selectById(sysPermissionDataRule.getPermissionId());\n        boolean flag = permission != null && (permission.getRuleFlag() == null || permission.getRuleFlag().equals(CommonConstant.RULE_FLAG_0));\n        if(flag) {\n\t\t\tpermission.setRuleFlag(CommonConstant.RULE_FLAG_1);\n\t\t\tsysPermissionMapper.updateById(permission);\n\t\t}\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void deletePermissionDataRule(String dataRuleId) {\n\t\tSysPermissionDataRule dataRule = this.baseMapper.selectById(dataRuleId);\n\t\tif(dataRule!=null) {\n\t\t\tthis.removeById(dataRuleId);\n\t\t\tLong count =  this.baseMapper.selectCount(new LambdaQueryWrapper<SysPermissionDataRule>().eq(SysPermissionDataRule::getPermissionId, dataRule.getPermissionId()));\n\t\t\t//注:同一个事务中删除后再查询是会认为数据已被删除的 若事务回滚上述删除无效\n\t\t\tif(count==null || count==0) {\n\t\t\t\tSysPermission permission = sysPermissionMapper.selectById(dataRule.getPermissionId());\n\t\t\t\tif(permission!=null && permission.getRuleFlag().equals(CommonConstant.RULE_FLAG_1)) {\n\t\t\t\t\tpermission.setRuleFlag(CommonConstant.RULE_FLAG_0);\n\t\t\t\t\tsysPermissionMapper.updateById(permission);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.jeecg.common.constant.CacheConstant;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.modules.system.entity.SysPermission;\nimport org.jeecg.modules.system.entity.SysPermissionDataRule;\nimport org.jeecg.modules.system.entity.SysRoleIndex;\nimport org.jeecg.modules.system.mapper.SysDepartPermissionMapper;\nimport org.jeecg.modules.system.mapper.SysDepartRolePermissionMapper;\nimport org.jeecg.modules.system.mapper.SysPermissionMapper;\nimport org.jeecg.modules.system.mapper.SysRolePermissionMapper;\nimport org.jeecg.modules.system.model.TreeModel;\nimport org.jeecg.modules.system.service.ISysPermissionDataRuleService;\nimport org.jeecg.modules.system.service.ISysPermissionService;\nimport org.jeecg.modules.system.service.ISysRoleIndexService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.cache.annotation.CacheEvict;\nimport org.springframework.cache.annotation.Cacheable;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport jakarta.annotation.Resource;\nimport java.util.*;\n\n/**\n * <p>\n * 菜单权限表 服务实现类\n * </p>\n *\n * @Author scott\n * @since 2018-12-21\n */\n@Service\npublic class SysPermissionServiceImpl extends ServiceImpl<SysPermissionMapper, SysPermission> implements ISysPermissionService {\n\n\t@Resource\n\tprivate SysPermissionMapper sysPermissionMapper;\n\t\n\t@Resource\n\tprivate ISysPermissionDataRuleService permissionDataRuleService;\n\n\t@Resource\n\tprivate SysRolePermissionMapper sysRolePermissionMapper;\n\n\t@Resource\n\tprivate SysDepartPermissionMapper sysDepartPermissionMapper;\n\n\t@Resource\n\tprivate SysDepartRolePermissionMapper sysDepartRolePermissionMapper;\n\n\t@Autowired\n\tprivate ISysRoleIndexService roleIndexService;\n\n\t@Override\n\tpublic void switchVue3Menu() {\n\t\tsysPermissionMapper.backupVue2Menu();\n\t\tsysPermissionMapper.changeVue3Menu();\n\t}\n\n\t@Override\n\tpublic List<TreeModel> queryListByParentId(String parentId) {\n\t\treturn sysPermissionMapper.queryListByParentId(parentId);\n\t}\n\n\t/**\n\t  * 真实删除\n\t */\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\t@CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true)\n\tpublic void deletePermission(String id) throws JeecgBootException {\n\t\tSysPermission sysPermission = this.getById(id);\n\t\tif(sysPermission==null) {\n\t\t\tthrow new JeecgBootException(\"未找到菜单信息\");\n\t\t}\n\t\tString pid = sysPermission.getParentId();\n\t\tif(oConvertUtils.isNotEmpty(pid)) {\n\t\t\tLong count = this.count(new QueryWrapper<SysPermission>().lambda().eq(SysPermission::getParentId, pid));\n\t\t\tif(count==1) {\n\t\t\t\t//若父节点无其他子节点，则该父节点是叶子节点\n\t\t\t\tthis.sysPermissionMapper.setMenuLeaf(pid, 1);\n\t\t\t}\n\t\t}\n\t\tsysPermissionMapper.deleteById(id);\n\t\t// 该节点可能是子节点但也可能是其它节点的父节点,所以需要级联删除\n\t\tthis.removeChildrenBy(sysPermission.getId());\n\t\t//关联删除\n\t\tMap map = new HashMap(5);\n\t\tmap.put(\"permission_id\",id);\n\t\t//删除数据规则\n\t\tthis.deletePermRuleByPermId(id);\n\t\t//删除角色授权表\n\t\tsysRolePermissionMapper.deleteByMap(map);\n\t\t//删除部门权限表\n\t\tsysDepartPermissionMapper.deleteByMap(map);\n\t\t//删除部门角色授权\n\t\tsysDepartRolePermissionMapper.deleteByMap(map);\n\t}\n\t\n\t/**\n\t * 根据父id删除其关联的子节点数据\n\t * \n\t * @return\n\t */\n\tpublic void removeChildrenBy(String parentId) {\n\t\tLambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<>();\n\t\t// 封装查询条件parentId为主键,\n\t\tquery.eq(SysPermission::getParentId, parentId);\n\t\t// 查出该主键下的所有子级\n\t\tList<SysPermission> permissionList = this.list(query);\n\t\tif (permissionList != null && permissionList.size() > 0) {\n            // id\n\t\t\tString id = \"\";\n            // 查出的子级数量\n\t\t\tLong num = Long.valueOf(0);\n\t\t\t// 如果查出的集合不为空, 则先删除所有\n\t\t\tthis.remove(query);\n\t\t\t// 再遍历刚才查出的集合, 根据每个对象,查找其是否仍有子级\n\t\t\tfor (int i = 0, len = permissionList.size(); i < len; i++) {\n\t\t\t\tid = permissionList.get(i).getId();\n\t\t\t\tMap map = new HashMap(5);\n\t\t\t\tmap.put(\"permission_id\",id);\n\t\t\t\t//删除数据规则\n\t\t\t\tthis.deletePermRuleByPermId(id);\n\t\t\t\t//删除角色授权表\n\t\t\t\tsysRolePermissionMapper.deleteByMap(map);\n\t\t\t\t//删除部门权限表\n\t\t\t\tsysDepartPermissionMapper.deleteByMap(map);\n\t\t\t\t//删除部门角色授权\n\t\t\t\tsysDepartRolePermissionMapper.deleteByMap(map);\n\t\t\t\tnum = this.count(new LambdaQueryWrapper<SysPermission>().eq(SysPermission::getParentId, id));\n\t\t\t\t// 如果有, 则递归\n\t\t\t\tif (num > 0) {\n\t\t\t\t\tthis.removeChildrenBy(id);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/**\n\t  * 逻辑删除\n\t */\n\t@Override\n\t@CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true)\n\t//@CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true,condition=\"#sysPermission.menuType==2\")\n\tpublic void deletePermissionLogical(String id) throws JeecgBootException {\n\t\tSysPermission sysPermission = this.getById(id);\n\t\tif(sysPermission==null) {\n\t\t\tthrow new JeecgBootException(\"未找到菜单信息\");\n\t\t}\n\t\tString pid = sysPermission.getParentId();\n\t\tLong count = this.count(new QueryWrapper<SysPermission>().lambda().eq(SysPermission::getParentId, pid));\n\t\tif(count==1) {\n\t\t\t//若父节点无其他子节点，则该父节点是叶子节点\n\t\t\tthis.sysPermissionMapper.setMenuLeaf(pid, 1);\n\t\t}\n\t\tsysPermission.setDelFlag(1);\n\t\tthis.updateById(sysPermission);\n\t}\n\n\t@Override\n\t@CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true)\n\tpublic void addPermission(SysPermission sysPermission) throws JeecgBootException {\n\t\t//----------------------------------------------------------------------\n\t\t//判断是否是一级菜单，是的话清空父菜单\n\t\tif(CommonConstant.MENU_TYPE_0.equals(sysPermission.getMenuType())) {\n\t\t\tsysPermission.setParentId(null);\n\t\t}\n\t\t//----------------------------------------------------------------------\n\t\tString pid = sysPermission.getParentId();\n\t\tif(oConvertUtils.isNotEmpty(pid)) {\n\t\t\t//设置父节点不为叶子节点\n\t\t\tthis.sysPermissionMapper.setMenuLeaf(pid, 0);\n\t\t}\n\t\tsysPermission.setCreateTime(new Date());\n\t\tsysPermission.setDelFlag(0);\n\t\tsysPermission.setLeaf(true);\n\t\tthis.save(sysPermission);\n\t}\n\n\t@Override\n\t@CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true)\n\tpublic void editPermission(SysPermission sysPermission) throws JeecgBootException {\n\t\tSysPermission p = this.getById(sysPermission.getId());\n\t\t//TODO 该节点判断是否还有子节点\n\t\tif(p==null) {\n\t\t\tthrow new JeecgBootException(\"未找到菜单信息\");\n\t\t}else {\n\t\t\tsysPermission.setUpdateTime(new Date());\n\t\t\t//----------------------------------------------------------------------\n\t\t\t//Step1.判断是否是一级菜单，是的话清空父菜单ID\n\t\t\tif(CommonConstant.MENU_TYPE_0.equals(sysPermission.getMenuType())) {\n\t\t\t\tsysPermission.setParentId(\"\");\n\t\t\t}\n\t\t\t//Step2.判断菜单下级是否有菜单，无则设置为叶子节点\n\t\t\tLong count = this.count(new QueryWrapper<SysPermission>().lambda().eq(SysPermission::getParentId, sysPermission.getId()));\n\t\t\tif(count==0) {\n\t\t\t\tsysPermission.setLeaf(true);\n\t\t\t}\n\t\t\t//----------------------------------------------------------------------\n\t\t\tthis.updateById(sysPermission);\n\t\t\t\n\t\t\t//如果当前菜单的父菜单变了，则需要修改新父菜单和老父菜单的，叶子节点状态\n\t\t\tString pid = sysPermission.getParentId();\n            boolean flag = (oConvertUtils.isNotEmpty(pid) && !pid.equals(p.getParentId())) || oConvertUtils.isEmpty(pid)&&oConvertUtils.isNotEmpty(p.getParentId());\n            if (flag) {\n\t\t\t\t//a.设置新的父菜单不为叶子节点\n\t\t\t\tthis.sysPermissionMapper.setMenuLeaf(pid, 0);\n\t\t\t\t//b.判断老的菜单下是否还有其他子菜单，没有的话则设置为叶子节点\n\t\t\t\tLong cc = this.count(new QueryWrapper<SysPermission>().lambda().eq(SysPermission::getParentId, p.getParentId()));\n\t\t\t\tif(cc==0) {\n\t\t\t\t\tif(oConvertUtils.isNotEmpty(p.getParentId())) {\n\t\t\t\t\t\tthis.sysPermissionMapper.setMenuLeaf(p.getParentId(), 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\n\t\t\t// 同步更改默认菜单\n\t\t\tSysRoleIndex defIndexCfg = this.roleIndexService.queryDefaultIndex();\n\t\t\tboolean isDefIndex = defIndexCfg.getUrl().equals(p.getUrl());\n\t\t\tif (isDefIndex) {\n\t\t\t\tthis.roleIndexService.updateDefaultIndex(sysPermission.getUrl(), sysPermission.getComponent(), sysPermission.isRoute());\n\t\t\t}\n\n\t\t}\n\t\t\n\t}\n\n\t@Override\n\tpublic List<SysPermission> queryByUser(String userId) {\n\t\tList<SysPermission> permissionList = this.sysPermissionMapper.queryByUser(userId);\n\t\t//================= begin 开启租户的时候 如果没有test角色，默认加入test角色================\n\t\tif (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n\t\t\tif (permissionList == null) {\n\t\t\t\tpermissionList = new ArrayList<>();\n\t\t\t}\n\t\t\tList<SysPermission> testRoleList = sysPermissionMapper.queryPermissionByTestRoleId();\n\t\t\t// 代码逻辑说明: [QQYUN-5168]【vue3】为什么出现两个菜单 菜单根据id去重\n\t\t\tfor (SysPermission permission: testRoleList) {\n\t\t\t\tboolean hasPerm = permissionList.stream().anyMatch(a->a.getId().equals(permission.getId()));\n\t\t\t\tif(!hasPerm){\n\t\t\t\t\tpermissionList.add(permission);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t//================= end 开启租户的时候 如果没有test角色，默认加入test角色================\n\t\treturn permissionList;\n\t}\n\n\t/**\n\t * 根据permissionId删除其关联的SysPermissionDataRule表中的数据\n\t */\n\t@Override\n\tpublic void deletePermRuleByPermId(String id) {\n\t\tLambdaQueryWrapper<SysPermissionDataRule> query = new LambdaQueryWrapper<>();\n\t\tquery.eq(SysPermissionDataRule::getPermissionId, id);\n\t\tLong countValue = this.permissionDataRuleService.count(query);\n\t\tif(countValue > 0) {\n\t\t\tthis.permissionDataRuleService.remove(query);\t\n\t\t}\n\t}\n\n\t/**\n\t  *   获取模糊匹配规则的数据权限URL\n\t */\n\t@Override\n\t@Cacheable(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE)\n\tpublic List<String> queryPermissionUrlWithStar() {\n\t\treturn this.baseMapper.queryPermissionUrlWithStar();\n\t}\n\n\t@Override\n\tpublic boolean hasPermission(String username, SysPermission sysPermission) {\n\t\tint count = baseMapper.queryCountByUsername(username,sysPermission);\n\t\tif(count>0){\n\t\t\treturn true;\n\t\t}else{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t@Override\n\tpublic boolean hasPermission(String username, String url) {\n\t\tSysPermission sysPermission = new SysPermission();\n\t\tsysPermission.setUrl(url);\n\t\tint count = baseMapper.queryCountByUsername(username,sysPermission);\n\t\tif(count>0){\n\t\t\treturn true;\n\t\t}else{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t@Override\n\tpublic List<SysPermission> queryDepartPermissionList(String departId) {\n\t\treturn sysPermissionMapper.queryDepartPermissionList(departId);\n\t}\n\n\t@Override\n\tpublic boolean checkPermDuplication(String id, String url,Boolean alwaysShow) {\n\t\tQueryWrapper<SysPermission> qw=new QueryWrapper();\n\t\tqw.lambda().eq(true,SysPermission::getUrl,url).ne(oConvertUtils.isNotEmpty(id),SysPermission::getId,id).eq(true,SysPermission::isAlwaysShow,alwaysShow);\n\t\treturn count(qw)==0;\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysPositionServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.modules.system.entity.SysPosition;\nimport org.jeecg.modules.system.mapper.SysPositionMapper;\nimport org.jeecg.modules.system.service.ISysPositionService;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n/**\n * @Description: 职务表\n * @Author: jeecg-boot\n * @Date: 2019-09-19\n * @Version: V1.0\n */\n@Service\npublic class SysPositionServiceImpl extends ServiceImpl<SysPositionMapper, SysPosition> implements ISysPositionService {\n\n    @Override\n    public SysPosition getByCode(String code) {\n        LambdaQueryWrapper<SysPosition> queryWrapper = new LambdaQueryWrapper<>();\n        queryWrapper.eq(SysPosition::getCode, code);\n        return super.getOne(queryWrapper);\n    }\n\n    @Override\n    public List<SysPosition> getPositionList(String userId) {\n        return this.baseMapper.getPositionList(userId);\n    }\n\n    @Override\n    public String getPositionName(List<String> postList) {\n        List<SysPosition> positionNameList = this.baseMapper.getPositionName(postList);\n        if (null != positionNameList && positionNameList.size()>0) {\n            return positionNameList.stream().map(SysPosition::getName).collect(Collectors.joining(SymbolConstant.COMMA));\n        }\n        return \"\";\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysRoleIndexServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.util.RedisUtil;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.constant.DefIndexConst;\nimport org.jeecg.modules.system.entity.SysRoleIndex;\nimport org.jeecg.modules.system.mapper.SysRoleIndexMapper;\nimport org.jeecg.modules.system.service.ISysRoleIndexService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.cache.annotation.Cacheable;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.CollectionUtils;\n\nimport java.util.List;\n/**\n * @Description: 角色首页配置\n * @Author: jeecg-boot\n * @Date: 2022-03-25\n * @Version: V1.0\n */\n@Service(\"sysRoleIndexServiceImpl\")\npublic class SysRoleIndexServiceImpl extends ServiceImpl<SysRoleIndexMapper, SysRoleIndex> implements ISysRoleIndexService {\n\n    @Autowired\n    private RedisUtil redisUtil;\n\n    @Override\n    @Cacheable(cacheNames = DefIndexConst.CACHE_KEY, key = \"'\" + DefIndexConst.DEF_INDEX_ALL + \"'\")\n    public SysRoleIndex queryDefaultIndex() {\n        LambdaQueryWrapper<SysRoleIndex> queryWrapper = new LambdaQueryWrapper<>();\n        queryWrapper.eq(SysRoleIndex::getRoleCode, DefIndexConst.DEF_INDEX_ALL);\n        queryWrapper.eq(SysRoleIndex::getStatus, CommonConstant.STATUS_1);\n        SysRoleIndex entity = super.getOne(queryWrapper);\n        // 保证不为空\n        if (entity == null) {\n            entity = this.initDefaultIndex();\n        }\n        return entity;\n    }\n\n    @Override\n    public boolean updateDefaultIndex(String url, String component, boolean isRoute) {\n        // 1. 先查询出配置信息\n        LambdaQueryWrapper<SysRoleIndex> queryWrapper = new LambdaQueryWrapper<>();\n        queryWrapper.eq(SysRoleIndex::getRoleCode, DefIndexConst.DEF_INDEX_ALL);\n        SysRoleIndex entity = super.getOne(queryWrapper);\n        boolean success = false;\n        // 2. 如果不存在则新增\n        if (entity == null) {\n            entity = this.newDefIndexConfig(url, component, isRoute);\n            success = super.save(entity);\n        } else {\n            // 3. 如果存在则更新\n            entity.setUrl(url);\n            entity.setComponent(component);\n            entity.setRoute(isRoute);\n            entity.setRelationType(CommonConstant.HOME_RELATION_DEFAULT);\n            success = super.updateById(entity);\n        }\n        // 4. 清理缓存\n        if (success) {\n            this.cleanDefaultIndexCache();\n        }\n        return success;\n    }\n\n    @Override\n    public SysRoleIndex initDefaultIndex() {\n        return this.newDefIndexConfig(DefIndexConst.DEF_INDEX_URL, DefIndexConst.DEF_INDEX_COMPONENT, true);\n    }\n\n    /**\n     * 创建默认首页配置\n     *\n     * @param indexComponent\n     * @return\n     */\n    private SysRoleIndex newDefIndexConfig(String indexUrl, String indexComponent, boolean isRoute) {\n        SysRoleIndex entity = new SysRoleIndex();\n        entity.setRoleCode(DefIndexConst.DEF_INDEX_ALL);\n        entity.setUrl(indexUrl);\n        entity.setComponent(indexComponent);\n        entity.setRoute(isRoute);\n        entity.setStatus(CommonConstant.STATUS_1);\n        entity.setRelationType(CommonConstant.HOME_RELATION_DEFAULT);\n        return entity;\n    }\n\n    @Override\n    public void cleanDefaultIndexCache() {\n        redisUtil.del(DefIndexConst.CACHE_KEY + \"::\" + DefIndexConst.DEF_INDEX_ALL);\n    }\n\n    /**\n     * 切换默认门户\n     * @param sysRoleIndex\n     */\n    @Override\n    public void changeDefHome(SysRoleIndex sysRoleIndex) {\n        // 1. 先查询出配置信息\n        String username = sysRoleIndex.getRoleCode();\n        //当前状态(1:工作台/门户 0：菜单默认)\n        String status = sysRoleIndex.getStatus();\n        LambdaQueryWrapper<SysRoleIndex> queryWrapper = new LambdaQueryWrapper<>();\n        queryWrapper.eq(SysRoleIndex::getRoleCode, username);\n        queryWrapper.eq(SysRoleIndex::getRelationType,CommonConstant.HOME_RELATION_USER);\n        queryWrapper.orderByAsc(SysRoleIndex::getPriority);\n        List<SysRoleIndex> list = super.list(queryWrapper);\n        boolean success = false;\n        if(CommonConstant.STATUS_1.equalsIgnoreCase(status)){\n            // 2. 如果存在则编辑\n            if (!CollectionUtils.isEmpty(list)) {\n                sysRoleIndex.setId(list.get(0).getId());\n                sysRoleIndex.setStatus(CommonConstant.STATUS_1);\n                sysRoleIndex.setRoute(true);\n                success = super.updateById(sysRoleIndex);\n            } else {\n                // 3. 如果不存在则新增\n                sysRoleIndex.setRelationType(CommonConstant.HOME_RELATION_USER);\n                sysRoleIndex.setStatus(CommonConstant.STATUS_1);\n                sysRoleIndex.setRoute(true);\n                success = super.save(sysRoleIndex);\n            }\n        }else {\n            // 0：菜单默认，则是菜单默认首页\n            if (!CollectionUtils.isEmpty(list)) {\n                //将用户级别的首页配置状态设置成0\n                for (int i = 0; i < list.size(); i++) {\n                    SysRoleIndex roleIndex = list.get(i);\n                    roleIndex.setStatus(CommonConstant.STATUS_0);\n                    success = super.updateById(roleIndex);\n                }\n            }\n        }\n        // 4. 清理缓存\n        if (success) {\n            this.cleanDefaultIndexCache();\n            redisUtil.del(DefIndexConst.CACHE_TYPE + username);\n        }\n        // 5. 缓存类型\n        //当前地址\n        String url = sysRoleIndex.getUrl();\n        //首页类型(默认首页)\n        String type = DefIndexConst.HOME_TYPE_MENU;\n        if(oConvertUtils.isNotEmpty(url) && CommonConstant.STATUS_1.equalsIgnoreCase(status)){\n           type = url.contains(DefIndexConst.HOME_TYPE_SYSTEM) ? DefIndexConst.HOME_TYPE_SYSTEM : DefIndexConst.HOME_TYPE_PERSONAL;\n        }\n        redisUtil.set(DefIndexConst.CACHE_TYPE + username,type);\n    }\n\n    /**\n     * 更新其他全局默认的状态值\n     *\n     * @param roleCode\n     * @param status\n     * @param id\n     */\n    @Override\n    public void updateOtherDefaultStatus(String roleCode, String status, String id) {\n        //roleCode是全局默认\n        if(oConvertUtils.isNotEmpty(roleCode) && DefIndexConst.DEF_INDEX_ALL.equals(roleCode)){\n            //状态为开启状态\n            if(oConvertUtils.isNotEmpty(status) && CommonConstant.STATUS_1.equals(status)){\n                LambdaQueryWrapper<SysRoleIndex> queryWrapper = new LambdaQueryWrapper<>();\n                queryWrapper.eq(SysRoleIndex::getRoleCode,roleCode);\n                queryWrapper.eq(SysRoleIndex::getStatus,CommonConstant.STATUS_1);\n                queryWrapper.ne(SysRoleIndex::getId,id);\n                queryWrapper.select(SysRoleIndex::getId);\n                List<SysRoleIndex> list = this.list(queryWrapper);\n                if(CollectionUtil.isNotEmpty(list)){\n                    list.forEach(sysRoleIndex -> {\n                        sysRoleIndex.setStatus(CommonConstant.STATUS_0);\n                    });\n                    this.updateBatchById(list);\n                }\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysRolePermissionServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport java.util.*;\n\nimport org.jeecg.common.util.IpUtils;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysRolePermission;\nimport org.jeecg.modules.system.mapper.SysRolePermissionMapper;\nimport org.jeecg.modules.system.service.ISysRolePermissionService;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\n\nimport org.springframework.stereotype.Service;\n\nimport jakarta.servlet.http.HttpServletRequest;\n\n/**\n * <p>\n * 角色权限表 服务实现类\n * </p>\n *\n * @Author scott\n * @since 2018-12-21\n */\n@Service\npublic class SysRolePermissionServiceImpl extends ServiceImpl<SysRolePermissionMapper, SysRolePermission> implements ISysRolePermissionService {\n\n\t@Override\n\tpublic void saveRolePermission(String roleId, String permissionIds) {\n\t\tString ip = \"\";\n\t\ttry {\n\t\t\t//获取request\n\t\t\tHttpServletRequest request = SpringContextUtils.getHttpServletRequest();\n\t\t\t//获取IP地址\n\t\t\tip = IpUtils.getIpAddr(request);\n\t\t} catch (Exception e) {\n\t\t\tip = \"127.0.0.1\";\n\t\t}\n\t\tLambdaQueryWrapper<SysRolePermission> query = new QueryWrapper<SysRolePermission>().lambda().eq(SysRolePermission::getRoleId, roleId);\n\t\tthis.remove(query);\n\t\tList<SysRolePermission> list = new ArrayList<SysRolePermission>();\n        String[] arr = permissionIds.split(\",\");\n\t\tfor (String p : arr) {\n\t\t\tif(oConvertUtils.isNotEmpty(p)) {\n\t\t\t\tSysRolePermission rolepms = new SysRolePermission(roleId, p);\n\t\t\t\trolepms.setOperateDate(new Date());\n\t\t\t\trolepms.setOperateIp(ip);\n\t\t\t\tlist.add(rolepms);\n\t\t\t}\n\t\t}\n\t\tthis.saveBatch(list);\n\t}\n\n\t@Override\n\tpublic void saveRolePermission(String roleId, String permissionIds, String lastPermissionIds) {\n\t\tString ip = \"\";\n\t\ttry {\n\t\t\t//获取request\n\t\t\tHttpServletRequest request = SpringContextUtils.getHttpServletRequest();\n\t\t\t//获取IP地址\n\t\t\tip = IpUtils.getIpAddr(request);\n\t\t} catch (Exception e) {\n\t\t\tip = \"127.0.0.1\";\n\t\t}\n\t\tList<String> add = getDiff(lastPermissionIds,permissionIds);\n\t\tif(add!=null && add.size()>0) {\n\t\t\tList<SysRolePermission> list = new ArrayList<SysRolePermission>();\n\t\t\tfor (String p : add) {\n\t\t\t\tif(oConvertUtils.isNotEmpty(p)) {\n\t\t\t\t\tSysRolePermission rolepms = new SysRolePermission(roleId, p);\n\t\t\t\t\trolepms.setOperateDate(new Date());\n\t\t\t\t\trolepms.setOperateIp(ip);\n\t\t\t\t\tlist.add(rolepms);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.saveBatch(list);\n\t\t}\n\t\t\n\t\tList<String> delete = getDiff(permissionIds,lastPermissionIds);\n\t\tif(delete!=null && delete.size()>0) {\n\t\t\tfor (String permissionId : delete) {\n\t\t\t\tthis.remove(new QueryWrapper<SysRolePermission>().lambda().eq(SysRolePermission::getRoleId, roleId).eq(SysRolePermission::getPermissionId, permissionId));\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/**\n\t * 从diff中找出main中没有的元素\n\t * @param main\n\t * @param diff\n\t * @return\n\t */\n\tprivate List<String> getDiff(String main,String diff){\n\t\tif(oConvertUtils.isEmpty(diff)) {\n\t\t\treturn null;\n\t\t}\n\t\tif(oConvertUtils.isEmpty(main)) {\n\t\t\treturn Arrays.asList(diff.split(\",\"));\n\t\t}\n\t\t\n\t\tString[] mainArr = main.split(\",\");\n\t\tString[] diffArr = diff.split(\",\");\n\t\tMap<String, Integer> map = new HashMap(5);\n\t\tfor (String string : mainArr) {\n\t\t\tmap.put(string, 1);\n\t\t}\n\t\tList<String> res = new ArrayList<String>();\n\t\tfor (String key : diffArr) {\n\t\t\tif(oConvertUtils.isNotEmpty(key) && !map.containsKey(key)) {\n\t\t\t\tres.add(key);\n\t\t\t}\n\t\t}\n\t\treturn res;\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysRoleServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.util.ImportExcelUtil;\nimport org.jeecg.modules.system.entity.SysRole;\nimport org.jeecg.modules.system.mapper.SysRoleMapper;\nimport org.jeecg.modules.system.mapper.SysUserMapper;\nimport org.jeecg.modules.system.service.ISysRoleService;\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\n/**\n * <p>\n * 角色表 服务实现类\n * </p>\n *\n * @Author scott\n * @since 2018-12-19\n */\n@Service\npublic class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements ISysRoleService {\n    @Autowired\n    SysRoleMapper sysRoleMapper;\n    @Autowired\n    SysUserMapper sysUserMapper;\n\n    \n    @Override\n    public Page<SysRole> listAllSysRole(Page<SysRole> page, SysRole role) {\n        return page.setRecords(sysRoleMapper.listAllSysRole(page,role));\n    }\n\n    @Override\n    public SysRole getRoleNoTenant(String roleCode) {\n        return sysRoleMapper.getRoleNoTenant(roleCode);\n    }\n\n    @Override\n    public Result importExcelCheckRoleCode(MultipartFile file, ImportParams params) throws Exception {\n        List<Object> listSysRoles = ExcelImportUtil.importExcel(file.getInputStream(), SysRole.class, params);\n        int totalCount = listSysRoles.size();\n        List<String> errorStrs = new ArrayList<>();\n\n        // 去除 listSysRoles 中重复的数据\n        for (int i = 0; i < listSysRoles.size(); i++) {\n            String roleCodeI =((SysRole)listSysRoles.get(i)).getRoleCode();\n            for (int j = i + 1; j < listSysRoles.size(); j++) {\n                String roleCodeJ =((SysRole)listSysRoles.get(j)).getRoleCode();\n                // 发现重复数据\n                if (roleCodeI.equals(roleCodeJ)) {\n                    errorStrs.add(\"第 \" + (j + 1) + \" 行的 roleCode 值：\" + roleCodeI + \" 已存在，忽略导入\");\n                    listSysRoles.remove(j);\n                    break;\n                }\n            }\n        }\n        // 去掉 sql 中的重复数据\n        Integer errorLines=0;\n        Integer successLines=0;\n        List<String> list = ImportExcelUtil.importDateSave(listSysRoles, ISysRoleService.class, errorStrs, CommonConstant.SQL_INDEX_UNIQ_SYS_ROLE_CODE);\n         errorLines+=list.size();\n         successLines+=(listSysRoles.size()-errorLines);\n        return ImportExcelUtil.imporReturnRes(errorLines,successLines,list);\n    }\n\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public boolean deleteRole(String roleid) {\n        //1.删除角色和用户关系\n        sysRoleMapper.deleteRoleUserRelation(roleid);\n        //2.删除角色和权限关系\n        sysRoleMapper.deleteRolePermissionRelation(roleid);\n        //3.删除角色\n        this.removeById(roleid);\n        return true;\n    }\n\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public boolean deleteBatchRole(String[] roleIds) {\n        //1.删除角色和用户关系\n        sysUserMapper.deleteBathRoleUserRelation(roleIds);\n        //2.删除角色和权限关系\n        sysUserMapper.deleteBathRolePermissionRelation(roleIds);\n        //3.删除角色\n        this.removeByIds(Arrays.asList(roleIds));\n        return true;\n    }\n\n    @Override\n    public Long getRoleCountByTenantId(String id, Integer tenantId) {\n        return sysRoleMapper.getRoleCountByTenantId(id,tenantId);\n    }\n\n    @Override\n    public void checkAdminRoleRejectDel(String ids) {\n        LambdaQueryWrapper<SysRole> query = new  LambdaQueryWrapper<>();\n        query.in(SysRole::getId,Arrays.asList(ids.split(SymbolConstant.COMMA)));\n        query.eq(SysRole::getRoleCode,\"admin\");\n        Long adminRoleCount = sysRoleMapper.selectCount(query);\n        if(adminRoleCount>0){\n            throw new JeecgBootException(\"admin角色，不允许删除！\");\n        }\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysTableWhiteListServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.firewall.SqlInjection.IDictTableWhiteListHandler;\nimport org.jeecg.modules.system.entity.SysTableWhiteList;\nimport org.jeecg.modules.system.mapper.SysTableWhiteListMapper;\nimport org.jeecg.modules.system.service.ISysTableWhiteListService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.stereotype.Service;\n\nimport java.util.*;\n\n/**\n * @Description: 系统表白名单\n * @Author: jeecg-boot\n * @Date: 2023-09-12\n * @Version: V1.0\n */\n@Slf4j\n@Service\npublic class SysTableWhiteListServiceImpl extends ServiceImpl<SysTableWhiteListMapper, SysTableWhiteList> implements ISysTableWhiteListService {\n\n    @Lazy\n    @Autowired\n    IDictTableWhiteListHandler whiteListHandler;\n\n    @Override\n    public boolean add(SysTableWhiteList sysTableWhiteList) {\n        this.checkEntity(sysTableWhiteList);\n        if (super.save(sysTableWhiteList)) {\n            // 清空缓存\n            whiteListHandler.clear();\n            return true;\n        }\n        return false;\n    }\n\n    @Override\n    public boolean edit(SysTableWhiteList sysTableWhiteList) {\n        this.checkEntity(sysTableWhiteList);\n        if (super.updateById(sysTableWhiteList)) {\n            // 清空缓存\n            whiteListHandler.clear();\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * 检查需要新增或更新的实体是否符合规范\n     *\n     * @param sysTableWhiteList\n     */\n    private void checkEntity(SysTableWhiteList sysTableWhiteList) {\n        if (sysTableWhiteList == null) {\n            throw new JeecgBootException(\"操作失败，实体为空！\");\n        }\n        if (oConvertUtils.isEmpty(sysTableWhiteList.getTableName())) {\n            throw new JeecgBootException(\"操作失败，表名不能为空！\");\n        }\n        if (oConvertUtils.isEmpty(sysTableWhiteList.getFieldName())) {\n            throw new JeecgBootException(\"操作失败，字段名不能为空！\");\n        }\n        // 将表名和字段名转换成小写\n        sysTableWhiteList.setTableName(sysTableWhiteList.getTableName().toLowerCase());\n        sysTableWhiteList.setFieldName(sysTableWhiteList.getFieldName().toLowerCase());\n        // 如果status为空，则默认启用\n        if (oConvertUtils.isEmpty(sysTableWhiteList.getStatus())) {\n            sysTableWhiteList.setStatus(CommonConstant.STATUS_1);\n        }\n    }\n\n    @Override\n    public boolean deleteByIds(String ids) {\n        if (oConvertUtils.isEmpty(ids)) {\n            return false;\n        }\n        List<String> idList = Arrays.asList(ids.split(\",\"));\n        if (super.removeByIds(idList)) {\n            // 清空缓存\n            whiteListHandler.clear();\n            return true;\n        }\n        return false;\n    }\n\n    @Override\n    public SysTableWhiteList autoAdd(String tableName, String fieldName) {\n        if (oConvertUtils.isEmpty(tableName)) {\n            throw new JeecgBootException(\"操作失败，表名不能为空！\");\n        }\n        if (oConvertUtils.isEmpty(fieldName)) {\n            throw new JeecgBootException(\"操作失败，字段名不能为空！\");\n        }\n        // 统一转换成小写\n        tableName = tableName.toLowerCase();\n        fieldName = fieldName.toLowerCase();\n        // 查询是否已经存在\n        LambdaQueryWrapper<SysTableWhiteList> queryWrapper = new LambdaQueryWrapper<>();\n        queryWrapper.eq(SysTableWhiteList::getTableName, tableName);\n        SysTableWhiteList getEntity = super.getOne(queryWrapper);\n        if (getEntity != null) {\n            // 如果已经存在，并且已禁用，则抛出异常\n            if (CommonConstant.STATUS_0.equals(getEntity.getStatus())) {\n                throw new JeecgBootException(\"[白名单] 表名已存在，但是已被禁用，请先启用！tableName=\" + tableName);\n            }\n            // 合并字段\n            Set<String> oldFieldSet = new HashSet<>(Arrays.asList(getEntity.getFieldName().split(\",\")));\n            Set<String> newFieldSet = new HashSet<>(Arrays.asList(fieldName.split(\",\")));\n            oldFieldSet.addAll(newFieldSet);\n            getEntity.setFieldName(String.join(\",\", oldFieldSet));\n            this.checkEntity(getEntity);\n            super.updateById(getEntity);\n            log.info(\"修改表单白名单项，表名：{}，oldFieldSet： {}，newFieldSet：{}\", tableName, oldFieldSet.toArray(), newFieldSet.toArray());\n            return getEntity;\n        } else {\n            // 新增白名单项\n            SysTableWhiteList saveEntity = new SysTableWhiteList();\n            saveEntity.setTableName(tableName);\n            saveEntity.setFieldName(fieldName);\n            saveEntity.setStatus(CommonConstant.STATUS_1);\n            this.checkEntity(saveEntity);\n            super.save(saveEntity);\n            log.info(\"新增表单白名单项: 表名：{}，配置 > {}\", tableName, saveEntity.toString());\n            return saveEntity;\n        }\n    }\n\n    @Override\n    public Map<String, String> getAllConfigMap() {\n        Map<String, String> map = new HashMap<>();\n        List<SysTableWhiteList> allData = super.list();\n        for (SysTableWhiteList item : allData) {\n            // 只有启用的才放入map\n            if (CommonConstant.STATUS_1.equals(item.getStatus())) {\n                // 表名和字段名都转成小写，防止大小写不一致\n                map.put(item.getTableName().toLowerCase(), item.getFieldName().toLowerCase());\n            }\n        }\n        return map;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysTenantPackServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\nimport cn.hutool.core.collection.CollectionUtil;\nimport cn.hutool.core.util.RandomUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.constant.TenantConstant;\nimport org.jeecg.common.exception.JeecgBootBizTipException;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.aop.TenantLog;\nimport org.jeecg.modules.system.entity.SysPackPermission;\nimport org.jeecg.modules.system.entity.SysTenantPack;\nimport org.jeecg.modules.system.entity.SysTenantPackUser;\nimport org.jeecg.modules.system.entity.SysUserTenant;\nimport org.jeecg.modules.system.mapper.*;\nimport org.jeecg.modules.system.service.ISysTenantPackService;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport java.util.*;\nimport java.util.stream.Collectors;\n\n/**\n * @Description: 租户产品包\n * @Author: jeecg-boot\n * @Date: 2022-12-31\n * @Version: V1.0\n */\n@Service\npublic class SysTenantPackServiceImpl extends ServiceImpl<SysTenantPackMapper, SysTenantPack> implements ISysTenantPackService {\n\n    @Autowired\n    private SysTenantPackMapper sysTenantPackMapper;\n\n    @Autowired\n    private SysTenantPackUserMapper sysTenantPackUserMapper;\n\n    @Autowired\n    private SysPackPermissionMapper sysPackPermissionMapper;\n\n    @Autowired\n    private SysRoleMapper sysRoleMapper;\n\n    @Autowired\n    private SysUserTenantMapper sysUserTenantMapper;\n    \n    @Override\n    public void addPackPermission(SysTenantPack sysTenantPack) {\n        //如果是默认租户套餐包，则需要设置code编码，再编辑默认套餐找自定义套餐的时候用到\n        if(CommonConstant.TENANT_PACK_DEFAULT.equals(sysTenantPack.getPackType())){\n            String packCode = CommonConstant.TENANT_PACK_DEFAULT + RandomUtil.randomNumbers(4).toLowerCase();\n            sysTenantPack.setPackCode(packCode);\n        }\n        sysTenantPackMapper.insert(sysTenantPack);\n        String permissionIds = sysTenantPack.getPermissionIds();\n        if (oConvertUtils.isNotEmpty(permissionIds)) {\n            String packId = sysTenantPack.getId();\n            String[] permissionIdArray = permissionIds.split(SymbolConstant.COMMA);\n            for (String permissionId : permissionIdArray) {\n                this.addPermission(packId, permissionId);\n            }\n        }\n\n        //如果是自定义套餐包的情况下再将新增套餐和用户关系\n        if(!CommonConstant.TENANT_PACK_DEFAULT.equals(sysTenantPack.getPackType())) {\n            //如果需要自动分配给用户时候再去添加用户与套餐的关系数据\n            if(oConvertUtils.isNotEmpty(sysTenantPack.getIzSysn()) && CommonConstant.STATUS_1.equals(sysTenantPack.getIzSysn())) {\n                //根据租户id和套餐id添加用户与套餐关系数据\n                this.addPackUserByPackTenantId(sysTenantPack.getTenantId(), sysTenantPack.getId());\n            }\n        }\n    }\n\n    /**\n     * 根据租户id和套餐id添加用户与套餐关系数据\n     *\n     * @param tenantId\n     * @param packId\n     */\n    private void addPackUserByPackTenantId(Integer tenantId, String packId) {\n        if (null != tenantId && tenantId != 0) {\n            List<String> userIds = sysUserTenantMapper.getUserIdsByTenantId(tenantId);\n            if (CollectionUtil.isNotEmpty(userIds)) {\n                // 查询已存在的用户\n                LambdaQueryWrapper<SysTenantPackUser> query = new LambdaQueryWrapper<>();\n                query.eq(SysTenantPackUser::getTenantId, tenantId);\n                query.eq(SysTenantPackUser::getPackId, packId);\n                query.in(SysTenantPackUser::getUserId, userIds);\n                List<SysTenantPackUser> existingUsers = sysTenantPackUserMapper.selectList(query);\n                // 提取已存在的用户ID\n                List<String> existingUserIds = existingUsers.stream()\n                        .map(SysTenantPackUser::getUserId)\n                        .toList();\n                // 过滤出需要新增的用户ID\n                List<String> newUserIds = userIds.stream()\n                        .filter(userId -> !existingUserIds.contains(userId))\n                        .toList();\n                for (String userId : newUserIds) {\n                    SysTenantPackUser tenantPackUser = new SysTenantPackUser(tenantId, packId, userId);\n                    sysTenantPackUserMapper.insert(tenantPackUser);\n                }\n            }\n        }\n    }\n\n    @Override\n    public List<SysTenantPack> setPermissions(List<SysTenantPack> records) {\n        for (SysTenantPack pack : records) {\n            List<String> permissionIds = sysPackPermissionMapper.getPermissionsByPackId(pack.getId());\n            if (null != permissionIds && permissionIds.size() > 0) {\n                String ids = String.join(SymbolConstant.COMMA, permissionIds);\n                pack.setPermissionIds(ids);\n            }\n        }\n        return records;\n    }\n\n    @Override\n    public void editPackPermission(SysTenantPack sysTenantPack) {\n        //数据库汇总的id\n        List<String> oldPermissionIds = sysPackPermissionMapper.getPermissionsByPackId(sysTenantPack.getId());\n        //前台传过来的需要修改的id\n        String permissionIds = sysTenantPack.getPermissionIds();\n        //如果传过来的菜单id为空，那么就删除数据库中所有菜单\n        if (oConvertUtils.isEmpty(permissionIds)) {\n            this.deletePackPermission(sysTenantPack.getId(), null);\n            //如果是默认套餐包，需要删除其他关联默认产品包下的角色与菜单的关系\n            if(CommonConstant.TENANT_PACK_DEFAULT.equals(sysTenantPack.getPackType())){\n                this.deleteDefaultPackPermission(sysTenantPack.getPackCode(), null);\n            }\n        } else if (oConvertUtils.isNotEmpty(permissionIds) && oConvertUtils.isEmpty(oldPermissionIds)) {\n            //如果传过来的菜单id不为空但是数据库的菜单id为空，那么就新增\n            this.addPermission(sysTenantPack.getId(), permissionIds);\n            //如果是默认套餐包，需要新增其他关联默认产品包下的角色与菜单的关系\n            if(CommonConstant.TENANT_PACK_DEFAULT.equals(sysTenantPack.getPackType())){\n                this.addDefaultPackPermission(sysTenantPack.getPackCode(), permissionIds);\n            }\n        } else {\n            //都不为空，需要比较，进行添加或删除\n            if (oConvertUtils.isNotEmpty(oldPermissionIds)) {\n                //找到新的租户id与原来的租户id不同之处，进行删除\n                List<String> permissionList = oldPermissionIds.stream().filter(item -> !permissionIds.contains(item)).collect(Collectors.toList());\n                if (permissionList.size() > 0) {\n                    for (String permission : permissionList) {\n                        this.deletePackPermission(sysTenantPack.getId(), permission);\n                        //如果是默认套餐包，需要删除其他关联默认产品包下的角色与菜单的关系\n                        if(CommonConstant.TENANT_PACK_DEFAULT.equals(sysTenantPack.getPackType())){\n                            this.deleteDefaultPackPermission(sysTenantPack.getPackCode(), permission);\n                        }\n                    }\n                }\n\n                //找到原来菜单id与新的菜单id不同之处,进行新增\n                List<String> permissionAddList = Arrays.stream(permissionIds.split(SymbolConstant.COMMA)).filter(item -> !oldPermissionIds.contains(item)).collect(Collectors.toList());\n                if (permissionAddList.size() > 0) {\n                    for (String permission : permissionAddList) {\n                        this.addPermission(sysTenantPack.getId(), permission);\n                        //如果是默认套餐包，需要新增其他关联默认产品包下的角色与菜单的关系\n                        if(CommonConstant.TENANT_PACK_DEFAULT.equals(sysTenantPack.getPackType())){\n                            this.addDefaultPackPermission(sysTenantPack.getPackCode(), permission);\n                        }\n                    }\n                }\n            }\n        }\n        sysTenantPackMapper.updateById(sysTenantPack);\n        //如果是默认套餐包，则更新和当前匹配默认套餐包匹配的数据\n        if(CommonConstant.TENANT_PACK_DEFAULT.equals(sysTenantPack.getPackType())){\n            //同步同 packCode 下的相关套餐包数据\n            this.syncRelatedPackDataByDefaultPack(sysTenantPack);\n        }\n\n        //如果是自定义套餐包的情况下再将新增套餐和用户关系\n        if(!CommonConstant.TENANT_PACK_DEFAULT.equals(sysTenantPack.getPackType())) {\n            //如果需要自动分配给用户时候再去添加用户与套餐的关系数据\n            if(oConvertUtils.isNotEmpty(sysTenantPack.getIzSysn()) && CommonConstant.STATUS_1.equals(sysTenantPack.getIzSysn())) {\n                //根据租户id和套餐id添加用户与套餐关系数据\n                this.addPackUserByPackTenantId(sysTenantPack.getTenantId(), sysTenantPack.getId());\n            }\n        }\n    }\n\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public void deleteTenantPack(String ids) {\n        String[] idsArray = ids.split(SymbolConstant.COMMA);\n        for (String id : idsArray) {\n            this.deletePackPermission(id,null);\n            //删除产品包下面的用户\n            this.deletePackUser(id);\n            sysTenantPackMapper.deleteById(id);\n        }\n    }\n\n    @Override\n    public void exitTenant(String tenantId, String userId) {\n        this.getById(tenantId);\n    }\n\n    @Override\n    public void addDefaultTenantPack(Integer tenantId) {\n        ISysTenantPackService currentService = SpringContextUtils.getApplicationContext().getBean(ISysTenantPackService.class);\n        // 创建租户超级管理员\n        SysTenantPack superAdminPack = new SysTenantPack(tenantId, \"超级管理员\", TenantConstant.SUPER_ADMIN);\n        superAdminPack.setIzSysn(CommonConstant.STATUS_0);\n        //step.1 创建租户套餐包（超级管理员）\n        LambdaQueryWrapper<SysTenantPack> query = new LambdaQueryWrapper<>();\n        query.eq(SysTenantPack::getTenantId,tenantId);\n        query.eq(SysTenantPack::getPackCode, TenantConstant.SUPER_ADMIN);\n        SysTenantPack sysTenantPackSuperAdmin = currentService.getOne(query);\n        String packId = \"\";\n        if(null == sysTenantPackSuperAdmin){\n            packId = currentService.saveOne(superAdminPack);\n        }else{\n            packId = sysTenantPackSuperAdmin.getId();\n        }\n        //step.1.2 补充人员与套餐包的关系数据\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        SysTenantPackUser packUser = new SysTenantPackUser(tenantId, packId, sysUser.getId());\n        packUser.setRealname(sysUser.getRealname());\n        packUser.setPackName(superAdminPack.getPackName());\n        currentService.savePackUser(packUser);\n        \n        //step.2 创建租户套餐包(组织账户管理员)和 添加人员关系数据\n        query.eq(SysTenantPack::getTenantId,tenantId);\n        query.eq(SysTenantPack::getPackCode, TenantConstant.ACCOUNT_ADMIN);\n        SysTenantPack sysTenantPackAccountAdmin = currentService.getOne(query);\n        if(null == sysTenantPackAccountAdmin){\n            // 创建超级管理员\n            SysTenantPack accountAdminPack = new SysTenantPack(tenantId, \"组织账户管理员\", TenantConstant.ACCOUNT_ADMIN);\n            accountAdminPack.setIzSysn(CommonConstant.STATUS_0);\n            currentService.saveOne(accountAdminPack);\n        }\n\n        //step.3 创建租户套餐包(组织应用管理员)\n        query.eq(SysTenantPack::getTenantId,tenantId);\n        query.eq(SysTenantPack::getPackCode, TenantConstant.APP_ADMIN);\n        SysTenantPack sysTenantPackAppAdmin = currentService.getOne(query);\n        if(null == sysTenantPackAppAdmin){\n            // 创建超级管理员\n            SysTenantPack appAdminPack = new SysTenantPack(tenantId, \"组织应用管理员\", TenantConstant.APP_ADMIN);\n            appAdminPack.setIzSysn(CommonConstant.STATUS_0);\n            currentService.saveOne(appAdminPack);\n        }\n        \n    }\n\n    @TenantLog(2)\n    @Override\n    public String saveOne(SysTenantPack sysTenantPack) {\n        sysTenantPackMapper.insert(sysTenantPack);\n        return sysTenantPack.getId();\n    }\n\n    @TenantLog(2)\n    @Override\n    public void savePackUser(SysTenantPackUser sysTenantPackUser) {\n        sysTenantPackUser.setStatus(1);\n        sysTenantPackUserMapper.insert(sysTenantPackUser);\n    }\n\n    @Override\n    public SysTenantPack getSysTenantPack(Integer tenantId, String packCode) {\n        LambdaQueryWrapper<SysTenantPack> query = new LambdaQueryWrapper<SysTenantPack>()\n                .eq(SysTenantPack::getPackCode, packCode)\n                .eq(SysTenantPack::getTenantId, tenantId);\n        List<SysTenantPack> list = baseMapper.selectList(query);\n        if(list!=null && list.size()>0){\n            SysTenantPack pack = list.get(0);\n            if(pack!=null && pack.getId()!=null){\n                return pack;\n            }\n        }\n        return null;\n    }\n\n    /**\n     * 添加菜单\n     *\n     * @param packId\n     * @param permissionId\n     */\n    public void addPermission(String packId, String permissionId) {\n        SysPackPermission permission = new SysPackPermission();\n        permission.setPermissionId(permissionId);\n        permission.setPackId(packId);\n        sysPackPermissionMapper.insert(permission);\n    }\n\n    /**\n     * 根据包名id和菜单id删除关系表\n     *\n     * @param packId\n     * @param permissionId\n     */\n    public void deletePackPermission(String packId, String permissionId) {\n        LambdaQueryWrapper<SysPackPermission> query = new LambdaQueryWrapper<>();\n        query.eq(SysPackPermission::getPackId, packId);\n        if (oConvertUtils.isNotEmpty(permissionId)) {\n            query.eq(SysPackPermission::getPermissionId, permissionId);\n        }\n        sysPackPermissionMapper.delete(query);\n    }\n\n    @Override\n    public void addTenantDefaultPack(Integer tenantId) {\n        LambdaQueryWrapper<SysTenantPack> query = new LambdaQueryWrapper<>();\n        query.eq(SysTenantPack::getPackType,\"default\");\n        List<SysTenantPack> sysTenantPacks = sysTenantPackMapper.selectList(query);\n        // 取当前租户用户列表\n        List<String> userIds = sysUserTenantMapper.getUserIdsByTenantId(tenantId);\n        for (SysTenantPack sysTenantPack: sysTenantPacks) {\n            // 代码逻辑说明: 【QQYUN-14007】演示系统，初始化租户套餐很慢---\n            syncDefaultPack2CurrentTenant(tenantId, sysTenantPack, userIds);\n        }\n    }\n\n    @Override\n    public void syncDefaultPack(Integer tenantId) {\n        // 查询默认套餐包\n        LambdaQueryWrapper<SysTenantPack> query = new LambdaQueryWrapper<>();\n        query.eq(SysTenantPack::getPackType,\"default\");\n        List<SysTenantPack> sysDefaultTenantPacks = sysTenantPackMapper.selectList(query);\n        // 查询当前租户套餐包\n        query = new LambdaQueryWrapper<>();\n        query.eq(SysTenantPack::getPackType,\"custom\");\n        query.eq(SysTenantPack::getTenantId, tenantId);\n        List<SysTenantPack> currentTenantPacks = sysTenantPackMapper.selectList(query);\n        // 代码逻辑说明: 【QQYUN-14007】演示系统，初始化租户套餐很慢---\n        Map<String, SysTenantPack> currentTenantPackMap;\n        if (oConvertUtils.listIsNotEmpty(currentTenantPacks)) {\n            currentTenantPackMap = currentTenantPacks.stream().collect(Collectors.toMap(SysTenantPack::getPackName, o -> o, (existing, replacement) -> existing));\n        } else {\n            currentTenantPackMap = new HashMap<String, SysTenantPack>();\n        }\n        // 预取当前租户用户列表，避免在循环中重复查询\n        List<String> userIds = sysUserTenantMapper.getUserIdsByTenantId(tenantId);\n        // 计算需要同步的默认套餐包列表\n        List<SysTenantPack> packsToSync = sysDefaultTenantPacks.stream()\n                .filter(p -> !currentTenantPackMap.containsKey(p.getPackName()))\n                .collect(Collectors.toList());\n\n        // 并行同步缺失的套餐包\n        packsToSync.parallelStream().forEach(defaultPacks -> {\n            syncDefaultPack2CurrentTenant(tenantId, defaultPacks, userIds);\n        });\n    }\n\n    /**\n     * 同步默认套餐包到当前租户\n     * for [QQYUN-11032]【jeecg】租户套餐管理增加初始化套餐包按钮\n     * @param tenantId 目标租户\n     * @param defaultPacks 默认套餐包\n     * @author chenrui\n     * @date 2025/2/5 19:41\n     */\n    private void syncDefaultPack2CurrentTenant(Integer tenantId, SysTenantPack defaultPacks, List<String> userIds) {\n        SysTenantPack pack = new SysTenantPack();\n        BeanUtils.copyProperties(defaultPacks,pack);\n        pack.setTenantId(tenantId);\n        pack.setPackType(\"custom\");\n        pack.setId(\"\");\n        sysTenantPackMapper.insert(pack);\n        List<String> permissionsByPackId = sysPackPermissionMapper.getPermissionsByPackId(defaultPacks.getId());\n        List<SysPackPermission> permissionList = new ArrayList<>();\n        for (String permission:permissionsByPackId) {\n            SysPackPermission packPermission = new SysPackPermission();\n            packPermission.setPackId(pack.getId());\n            packPermission.setPermissionId(permission);\n            permissionList.add(packPermission);\n        }\n        if(CollectionUtil.isNotEmpty(permissionList)){\n            sysPackPermissionMapper.insert(permissionList);\n        }\n        //如果需要自动分配给用户时候再去添加用户与套餐的关系数据\n        if(oConvertUtils.isNotEmpty(defaultPacks.getIzSysn()) && CommonConstant.STATUS_1.equals(defaultPacks.getIzSysn())) {\n            List<SysTenantPackUser> packUserList = new ArrayList<>();\n            if (oConvertUtils.isNotEmpty(userIds)) {\n                for (String userId : userIds) {\n                    //根据租户id和套餐id添加用户与套餐关系数据\n                    SysTenantPackUser tenantPackUser = new SysTenantPackUser(tenantId, pack.getId(), userId);\n                    packUserList.add(tenantPackUser);\n                }\n                sysTenantPackUserMapper.insert(packUserList);\n            }\n        }\n    }\n\n    /**\n     * 删除产品包下面的用户\n     * @param packId\n     */\n    private void deletePackUser(String packId) {\n        LambdaQueryWrapper<SysTenantPackUser> query = new LambdaQueryWrapper<>();\n        query.eq(SysTenantPackUser::getPackId, packId);\n        sysTenantPackUserMapper.delete(query);\n    }\n\n    @Override\n    public List<String> getPackIdByUserIdAndTenantId(String userId, Integer tenantId) {\n        return sysTenantPackUserMapper.getPackIdByTenantIdAndUserId(tenantId, userId);\n    }\n\n    @Override\n    public List<SysTenantPack> getPackListByTenantId(String tenantId) {\n        return sysTenantPackUserMapper.getPackListByTenantId(oConvertUtils.getInt(tenantId));\n    }\n\n    /**\n     * 根据套餐包的code 新增其他关联默认产品包下的角色与菜单的关系\n     *\n     * @param packCode\n     * @param permission\n     */\n    private void addDefaultPackPermission(String packCode, String permission) {\n        if (oConvertUtils.isEmpty(packCode)) {\n            return;\n        }\n        //查询当前匹配非默认套餐包的其他默认套餐包\n        LambdaQueryWrapper<SysTenantPack> query = new LambdaQueryWrapper<>();\n        query.ne(SysTenantPack::getPackType, CommonConstant.TENANT_PACK_DEFAULT);\n        query.eq(SysTenantPack::getPackCode, packCode);\n        List<SysTenantPack> otherDefaultPacks = sysTenantPackMapper.selectList(query);\n        for (SysTenantPack pack : otherDefaultPacks) {\n            //新增套餐包用户菜单权限\n            this.addPermission(pack.getId(), permission);\n        }\n    }\n\n    /**\n     * 根据套餐包的code 删除其他关联默认套餐包下的角色与菜单的关系\n     *\n     * @param packCode\n     * @param permissionId\n     */\n    private void deleteDefaultPackPermission(String packCode, String permissionId) {\n        if (oConvertUtils.isEmpty(packCode)) {\n            return;\n        }\n        //查询当前匹配非默认套餐包的其他默认套餐包\n        LambdaQueryWrapper<SysTenantPack> query = new LambdaQueryWrapper<>();\n        query.ne(SysTenantPack::getPackType, CommonConstant.TENANT_PACK_DEFAULT);\n        query.eq(SysTenantPack::getPackCode, packCode);\n        List<SysTenantPack> defaultPacks = sysTenantPackMapper.selectList(query);\n        for (SysTenantPack pack : defaultPacks) {\n            //删除套餐权限\n            deletePackPermission(pack.getId(), permissionId);\n        }\n    }\n\n    /**\n     * 同步同 packCode 下的相关套餐包数据\n     *\n     * @param sysTenantPack\n     */\n    private void syncRelatedPackDataByDefaultPack(SysTenantPack sysTenantPack) {\n        //查询与默认套餐相同code的套餐\n        LambdaQueryWrapper<SysTenantPack> query = new LambdaQueryWrapper<>();\n        query.ne(SysTenantPack::getPackType, CommonConstant.TENANT_PACK_DEFAULT);\n        query.eq(SysTenantPack::getPackCode, sysTenantPack.getPackCode());\n        List<SysTenantPack> relatedPacks = sysTenantPackMapper.selectList(query);\n        for (SysTenantPack pack : relatedPacks) {\n            //更新自定义套餐\n            pack.setPackName(sysTenantPack.getPackName());\n            pack.setStatus(sysTenantPack.getStatus());\n            pack.setRemarks(sysTenantPack.getRemarks());\n            pack.setIzSysn(sysTenantPack.getIzSysn());\n            sysTenantPackMapper.updateById(pack);\n            //同步默认套餐报下的所有用户已\n            if (oConvertUtils.isNotEmpty(sysTenantPack.getIzSysn()) && CommonConstant.STATUS_1.equals(sysTenantPack.getIzSysn())) {\n                this.addPackUserByPackTenantId(pack.getTenantId(), pack.getId());\n            }\n        }\n    }\n\n\n    /**\n     * 是否为拥有管理用户权限【accountAdmin，superAdmin】\n     * @param tenantId\n     */\n    @Override\n    public void izHaveManageUserAuth(String tenantId) {\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        long count = sysTenantPackMapper.izHaveManageUserAuth(tenantId,sysUser.getId());\n        if(count == 0){\n            throw new JeecgBootBizTipException(\"你不是当前租户的组织账户管理员或超级管理员，无法进行此操作！\");\n        }\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysTenantServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport cn.hutool.core.util.RandomUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.collections.CollectionUtils;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.api.dto.message.BusMessageDTO;\nimport org.jeecg.common.api.dto.message.MessageDTO;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CacheConstant;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.exception.JeecgBootBizTipException;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.api.ISysBaseAPI;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.DateUtils;\nimport org.jeecg.common.util.PasswordUtil;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.constant.enums.SysAnnmentTypeEnum;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.aop.TenantLog;\nimport org.jeecg.modules.system.entity.*;\nimport org.jeecg.modules.system.mapper.*;\nimport org.jeecg.modules.system.service.ISysTenantPackService;\nimport org.jeecg.modules.system.service.ISysTenantService;\nimport org.jeecg.modules.system.service.ISysUserService;\nimport org.jeecg.modules.system.vo.tenant.*;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.NoSuchBeanDefinitionException;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.cache.annotation.CacheEvict;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.stereotype.Service;\n\nimport java.util.*;\nimport java.util.stream.Collectors;\n\n/**\n * @Description: 租户实现类\n * @author: jeecg-boot\n */\n@Service(\"sysTenantServiceImpl\")\n@Slf4j\npublic class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant> implements ISysTenantService {\n\n    @Autowired\n    ISysUserService userService;\n    @Autowired\n    private SysUserTenantMapper userTenantMapper;\n    @Autowired\n    private SysTenantMapper tenantMapper;\n\n    @Autowired\n    private ISysTenantPackService sysTenantPackService;\n\n    @Autowired\n    private SysTenantPackUserMapper sysTenantPackUserMapper;\n\n    @Autowired\n    private ISysBaseAPI sysBaseApi;\n    \n    @Autowired\n    private SysUserDepartMapper sysUserDepartMapper;\n\n    @Autowired\n    private SysTenantPackMapper sysTenantPackMapper;\n    \n    @Autowired\n    private SysPackPermissionMapper sysPackPermissionMapper;\n\n    @Override\n    public List<SysTenant> queryEffectiveTenant(Collection<Integer> idList) {\n        if(oConvertUtils.listIsEmpty(idList)){\n            return null;\n        }\n        \n        LambdaQueryWrapper<SysTenant> queryWrapper = new LambdaQueryWrapper<>();\n        queryWrapper.in(SysTenant::getId, idList);\n        queryWrapper.eq(SysTenant::getStatus, Integer.valueOf(CommonConstant.STATUS_1));\n        //此处查询忽略时间条件\n        return super.list(queryWrapper);\n    }\n\n    @Override\n    public Long countUserLinkTenant(String id) {\n        LambdaQueryWrapper<SysUserTenant> query = new LambdaQueryWrapper<>();\n        query.eq(SysUserTenant::getTenantId,id);\n        query.eq(SysUserTenant::getStatus,CommonConstant.STATUS_1);\n        // 查找出已被关联的用户数量\n        return userTenantMapper.selectCount(query);\n    }\n\n    @Override\n    public boolean removeTenantById(String id) {\n        // 查找出已被关联的用户数量\n        return super.removeById(Integer.parseInt(id));\n    }\n\n    @Override\n    @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)\n    public void invitationUserJoin(String ids, String phone,String username) {\n        String[] idArray = ids.split(SymbolConstant.COMMA);\n        String userId = null;\n        SysUser userByPhone = null;\n        // 代码逻辑说明: 【QQYUN-4605】后台的邀请谁加入租户，没办法选不是租户下的用户，通过手机号邀请------------\n        if(oConvertUtils.isNotEmpty(phone)){\n            userByPhone = userService.getUserByPhone(phone);\n            //说明用户不存在\n            if(null == userByPhone){\n                throw new JeecgBootException(\"当前用户不存在，请核对手机号\");\n            }\n            userId = userByPhone.getId();\n        }else{\n            userByPhone = userService.getUserByName(username);\n            //说明用户不存在\n            if(null == userByPhone){\n                throw new JeecgBootException(\"当前用户不存在，请核对手机号\");\n            }\n            userId = userByPhone.getId();\n        }\n\n        //循环租户id\n        for (String id:idArray) {\n            //获取被邀请人是否已存在\n            SysUserTenant userTenant = userTenantMapper.getUserTenantByTenantId(userId, Integer.valueOf(id));\n            if(null == userTenant){\n                SysUserTenant relation = new SysUserTenant();\n                relation.setUserId(userId);\n                relation.setTenantId(Integer.valueOf(id));\n                relation.setStatus(CommonConstant.USER_TENANT_NORMAL);\n                userTenantMapper.insert(relation);\n                //给当前用户添加租户下的所有套餐\n                this.addPackUser(userId,id);\n                //邀请用户加入租户，发送消息\n                this.sendInvitationTenantMessage(userByPhone,id);\n            }else{\n                // 代码逻辑说明: 【QQYUN-5885】邀请用户加入提示不准确------------\n                String tenantErrorInfo = getTenantErrorInfo(userTenant.getStatus());\n                String errMsg = \"手机号用户:\" + userByPhone.getPhone() + \" 昵称：\" + userByPhone.getRealname() + \"，\" + tenantErrorInfo;\n                throw new JeecgBootException(errMsg);\n            }\n        }\n    }\n\n    /**\n     * 低代码下发送邀请加入租户消息\n     * \n     * @param user\n     * @param id\n     */\n    private void sendInvitationTenantMessage(SysUser user, String id) {\n        LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();\n        // 发消息\n        SysTenant sysTenant = this.baseMapper.querySysTenant((Integer.valueOf(id)));\n        MessageDTO messageDTO = new MessageDTO();\n        messageDTO.setToAll(false);\n        messageDTO.setToUser(user.getUsername());\n        messageDTO.setFromUser(\"system\");\n        String title = sysUser.getRealname() + \" 邀请您加入了 \"+sysTenant.getName()+\"。\";\n        messageDTO.setTitle(title);\n        Map<String, Object> data = new HashMap<>();\n        messageDTO.setData(data);\n        messageDTO.setContent(title);\n        messageDTO.setType(\"system\");\n        messageDTO.setCategory(CommonConstant.MSG_CATEGORY_1);\n        sysBaseApi.sendSysAnnouncement(messageDTO);\n    }\n\n    @Override\n    @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)\n    public void leaveTenant(String userIds, String tenantId) {\n        String[] userIdArray = userIds.split(SymbolConstant.COMMA);\n        for (String userId:userIdArray) {\n            // 代码逻辑说明: [QQYUN-3371]租户逻辑改造，改成关系表------------\n            LambdaQueryWrapper<SysUserTenant> query = new LambdaQueryWrapper<>();\n            query.eq(SysUserTenant::getTenantId,tenantId);\n            query.eq(SysUserTenant::getUserId,userId);\n            userTenantMapper.delete(query);\n            //代码逻辑说明: 【QQYUN-13720】移出用户当前租户，没有系统提醒---\n            // 给移除人员发送消息\n            SysTenantPackUser sysTenantPackUser = new SysTenantPackUser();\n            sysTenantPackUser.setTenantId(Integer.valueOf(tenantId));\n            sysTenantPackUser.setUserId(userId);\n            sendMsgForDelete(sysTenantPackUser);\n        }\n        //租户移除用户，直接删除用户租户产品包\n        sysTenantPackUserMapper.deletePackUserByTenantId(Integer.valueOf(tenantId),Arrays.asList(userIds.split(SymbolConstant.COMMA)));\n    }\n\n    @Override\n    @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)\n    public Integer saveTenantJoinUser(SysTenant sysTenant, String userId) {\n        //添加租户\n        this.saveTenant(sysTenant);\n        \n        // 添加租户产品包\n        Integer tenantId = sysTenant.getId();\n        sysTenantPackService.addDefaultTenantPack(tenantId);\n        \n        //添加租户到关系表\n        return tenantId;\n    }\n\n    @Override\n    public void saveTenant(SysTenant sysTenant){\n        //获取租户id\n        sysTenant.setId(this.tenantIdGenerate());\n        sysTenant.setHouseNumber(RandomUtil.randomStringUpper(6));\n        sysTenant.setDelFlag(CommonConstant.DEL_FLAG_0);\n        this.save(sysTenant);\n        //代码逻辑说明:【QQYUN-5723】1、把当前创建人加入到租户关系里面------------\n        //当前登录人的id\n        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        this.saveTenantRelation(sysTenant.getId(),loginUser.getId());\n    }\n\n    @Override\n    @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)\n    public Integer joinTenantByHouseNumber(SysTenant sysTenant, String userId) {\n        LambdaQueryWrapper<SysTenant> query = new LambdaQueryWrapper<>();\n        query.eq(SysTenant::getHouseNumber,sysTenant.getHouseNumber());\n        SysTenant one = this.getOne(query);\n        //需要返回租户id(用于前台更新缓存),返回0则代表当前租户门牌号不存在\n        if(null == one){\n            return 0;\n        }else{\n            LambdaQueryWrapper<SysUserTenant> relationQuery = new LambdaQueryWrapper<>();\n            relationQuery.eq(SysUserTenant::getTenantId,one.getId());\n            relationQuery.eq(SysUserTenant::getUserId,userId);\n            SysUserTenant relation = userTenantMapper.selectOne(relationQuery);\n            if(relation != null){\n                String msg = \"\";\n                if(CommonConstant.USER_TENANT_UNDER_REVIEW.equals(relation.getStatus())){\n                    msg = \",状态:审核中\";\n                }else if(CommonConstant.USER_TENANT_REFUSE.equals(relation.getStatus())){\n                    throw new JeecgBootBizTipException(\"管理员已拒绝您加入租户,请联系租户管理员\");\n                }else if(CommonConstant.USER_TENANT_QUIT.equals(relation.getStatus())){\n                    msg = \",状态:已离职\";\n                }\n                throw new JeecgBootBizTipException(\"您已是该租户成员\"+msg);\n            }\n            //用户加入门牌号审核中状态\n            SysUserTenant tenant = new SysUserTenant();\n            tenant.setTenantId(one.getId());\n            tenant.setUserId(userId);\n            tenant.setStatus(CommonConstant.USER_TENANT_UNDER_REVIEW);\n            userTenantMapper.insert(tenant);\n\n            // QQYUN-4526【应用】组织加入通知\n            sendMsgForApplyJoinTenant(userId, one);\n            return tenant.getTenantId();\n        }\n    }\n\n    @Override\n    public Integer countCreateTenantNum(String userId) {\n        return this.userTenantMapper.countCreateTenantNum(userId);\n    }\n\n    @Override\n    public IPage<SysTenant> getRecycleBinPageList(Page<SysTenant> page, SysTenant sysTenant) {\n        return page.setRecords(tenantMapper.getRecycleBinPageList(page,sysTenant));\n    }\n\n    @Override\n    @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)\n    public void deleteTenantLogic(String ids) {\n        String[] idArray = ids.split(SymbolConstant.COMMA);\n        List<Integer> list = new ArrayList<>();\n        //转成int类型\n        for (String id:idArray) {\n            list.add(Integer.valueOf(id));\n        }\n        //删除租户\n        tenantMapper.deleteByTenantId(list);\n        //删除租户下的用户\n        userTenantMapper.deleteUserByTenantId(list);\n\n        //删除租户下的产品包\n        this.deleteTenantPackByTenantId(list);\n    }\n\n    @Override\n    public void revertTenantLogic(String ids) {\n        String[] idArray = ids.split(SymbolConstant.COMMA);\n        List<Integer> list = new ArrayList<>();\n        //转成int类型\n        for (String id:idArray) {\n            list.add(Integer.valueOf(id));\n        }\n        //还原租户\n        tenantMapper.revertTenantLogic(list);\n    }\n\n    /**\n     * 添加租户到关系表\n     * @param tenantId\n     * @param userId\n     */\n    @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)\n    public Integer saveTenantRelation(Integer tenantId,String userId) {\n        SysUserTenant relation = new SysUserTenant();\n        relation.setTenantId(tenantId);\n        relation.setUserId(userId);\n        relation.setStatus(CommonConstant.USER_TENANT_NORMAL);\n        userTenantMapper.insert(relation);\n        return relation.getTenantId();\n    }\n\n    /**\n     * 获取租户id\n     * @return\n     */\n   public int tenantIdGenerate(){\n       synchronized (this){\n           //获取最大值id\n           // 代码逻辑说明: 数据库没有租户的时候，如果为空的话会报错sql返回类型不匹配------------\n           int maxTenantId = oConvertUtils.getInt(tenantMapper.getMaxTenantId(),0);\n           if(maxTenantId >= 1000){\n               return maxTenantId + 1;\n           }else{\n               return 1000;\n           }\n       }\n   }\n\n\n    @Override\n    public void exitUserTenant(String userId, String username, String tenantId) {\n        int tId = Integer.parseInt(tenantId);\n        //获取所有租户信息\n        List<String> userIdsByTenantId = userTenantMapper.getUserIdsByTenantId(tId);\n        //查询当前租户是否为拥有者\n        SysTenant sysTenant = tenantMapper.selectById(tId);\n        //如果是拥有着\n        if (username.equals(sysTenant.getCreateBy())) {\n            //判断当前租户信息位数\n            if (null != userIdsByTenantId && userIdsByTenantId.size() > 1) {\n                //需要指配拥有者\n                throw new JeecgBootException(\"assignedOwen\");\n            } else if (null != userIdsByTenantId && userIdsByTenantId.size() == 1) {\n                //只有拥有者的时候需要去注销租户\n                throw new JeecgBootException(\"cancelTenant\");\n            } else {\n                throw new JeecgBootException(\"退出租户失败，租户信息已不存在\");\n            }\n        } else {\n            //不是拥有者直接删除\n            this.leaveTenant(userId, tenantId);\n            this.leveUserProcess(userId, tenantId);\n        }\n    }\n\n    @Override\n    public void changeOwenUserTenant(String userId, String tId) {\n        //查询当前用户是否存在该租户下\n        // 代码逻辑说明: 租户id应该是传过来的，不应该是当前租户的------------\n        int tenantId = oConvertUtils.getInt(tId, 0);\n        SysTenant sysTenant = tenantMapper.selectById(tenantId);\n        if(null == sysTenant){\n            throw new JeecgBootException(\"退出租户失败，不存在此租户\");\n        }\n        String createBy = sysTenant.getCreateBy();\n        Integer count = userTenantMapper.userTenantIzExist(userId, tenantId);\n        if (count == 0) {\n            throw new JeecgBootException(\"退出租户失败，此租户下没有该用户\");\n        }\n        //获取用户信息\n        SysUser user = userService.getById(userId);\n        //变更拥有者\n        SysTenant tenant = new SysTenant();\n        tenant.setCreateBy(user.getUsername());\n        tenant.setId(tenantId);\n        tenantMapper.updateById(tenant);\n        //删除当前登录用户的租户信息\n        //update-begin---author:wangshuai ---date:20230705  for：旧拥有者退出后，需要将就拥有者的用户租户关系改成已离职------------\n        //获取原创建人的用户id\n        SysUser userByName = userService.getUserByName(createBy);\n        LambdaQueryWrapper<SysUserTenant> query = new LambdaQueryWrapper<>();\n        query.eq(SysUserTenant::getUserId,userByName.getId());\n        query.eq(SysUserTenant::getTenantId,tenantId);\n        SysUserTenant userTenant = new SysUserTenant();\n        userTenant.setStatus(CommonConstant.USER_TENANT_QUIT);\n        userTenantMapper.update(userTenant,query);\n        //离职流程\n        this.leveUserProcess(userId, String.valueOf(tenantId));\n    }\n\n    /**\n     * 触发离职流程\n     *\n     * @param userId\n     * @param tenantId\n     * @param tenantId\n     */\n    private void leveUserProcess(String userId, String tenantId) {\n        LoginUser userInfo = new LoginUser();\n        SysUser user = userService.getById(userId);\n    }\n\n    @Override\n    public Result<String> invitationUser(String phone, String departId) {\n        Result<String> result = new Result<>();\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\n        //1、查询用户信息,判断用户是否存在\n        SysUser userByPhone = userService.getUserByPhone(phone);\n        if(null == userByPhone){\n            result.setSuccess(false);\n            result.setMessage(\"用户不存在\");\n            return result;\n        }\n        int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n\n        //2.判断当前邀请人是否存在租户列表中\n        Integer userCount = userTenantMapper.userTenantIzExist(sysUser.getId(), tenantId);\n        if(userCount == 0){\n            result.setSuccess(false);\n            result.setMessage(\"当前管理员没有邀请权限\");\n            return result;\n        }\n\n        //3.插入到租户信息，已存在的不予许插入\n        //获取被邀请人是否已存在\n        SysUserTenant sysUserTenant = userTenantMapper.getUserTenantByTenantId(userByPhone.getId(), tenantId);\n        //用户已存在\n        if(null != sysUserTenant){\n            result.setSuccess(false);\n            String tenantErrorInfo = getTenantErrorInfo(sysUserTenant.getStatus());\n            String msg = \"手机号用户:\" + userByPhone.getPhone() + \" 昵称：\" + userByPhone.getRealname() + \"，\" + tenantErrorInfo;\n            result.setMessage(msg);\n            return result;\n        }\n\n        //4.需要用户手动同意加入\n        String status = CommonConstant.USER_TENANT_INVITE;\n\n        //5.当前用户不存在租户中,就需要将用户添加到租户中\n        SysUserTenant tenant = new SysUserTenant();\n        tenant.setTenantId(tenantId);\n        tenant.setUserId(userByPhone.getId());\n        tenant.setStatus(status);\n        userTenantMapper.insert(tenant);\n        result.setSuccess(true);\n        result.setMessage(\"邀请成员成功，成员同意后方可加入\");\n\n        //6.保存用户部门关系\n        if(oConvertUtils.isNotEmpty(departId)){\n            //保存用户部门关系\n            this.saveUserDepart(userByPhone.getId(),departId);\n        }\n        \n        //  QQYUN-4527【应用】邀请成员加入组织，发送消息提醒\n        sendMsgForInvitation(userByPhone, tenantId, sysUser.getRealname());\n        return result;\n    }\n\n    @Override\n    public TenantDepartAuthInfo getTenantDepartAuthInfo(Integer tenantId) {\n        SysTenant sysTenant = this.getById(tenantId);\n        if(sysTenant==null) {\n            return null;\n        }\n\n        TenantDepartAuthInfo info = new TenantDepartAuthInfo();\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        String userId = sysUser.getId();\n        boolean superAdmin = false;\n        // 查询pack表\n        List<String> packCodeList = baseMapper.queryUserPackCode(tenantId, userId);\n        if(packCodeList==null || packCodeList.size()==0){\n            //如果没有数据 判断租户创建人是不是当前用户\n            if(sysTenant.getCreateBy().equals(sysUser.getUsername())){\n                sysTenantPackService.addDefaultTenantPack(tenantId);\n                superAdmin = true;\n            }else{\n                superAdmin = false;\n            }\n        }\n        if(superAdmin == false){\n            List<TenantPackUserCount> packCountList = baseMapper.queryTenantPackUserCount(tenantId);\n            info.setPackCountList(packCountList);\n        }\n        info.setSysTenant(sysTenant);\n        info.setSuperAdmin(superAdmin);\n        info.setPackCodes(packCodeList);\n        return info;\n    }\n\n    @Override\n    public List<TenantPackUserCount> queryTenantPackUserCount(Integer tenantId) {\n        return baseMapper.queryTenantPackUserCount(tenantId);\n    }\n\n    @Override\n    public TenantPackModel queryTenantPack(TenantPackModel model) {\n        Integer tenantId = model.getTenantId();\n        String packCode = model.getPackCode();\n\n        SysTenantPack sysTenantPack = sysTenantPackService.getSysTenantPack(tenantId, packCode);\n        if(sysTenantPack!=null){\n            TenantPackModel tenantPackModel = new TenantPackModel();\n            tenantPackModel.setPackName(sysTenantPack.getPackName());\n            tenantPackModel.setPackId(sysTenantPack.getId());\n            // 查询用户\n            List<TenantPackUser> userList = getTenantPackUserList(tenantId, sysTenantPack.getId(), 1);\n            tenantPackModel.setUserList(userList);\n            return tenantPackModel;\n        }\n        return null;\n    }\n\n    @Override\n    public void addBatchTenantPackUser(SysTenantPackUser sysTenantPackUser) {\n        String userIds = sysTenantPackUser.getUserId();\n        if(oConvertUtils.isNotEmpty(userIds)){\n            ISysTenantService currentService = SpringContextUtils.getApplicationContext().getBean(ISysTenantService.class);\n            String realNames = sysTenantPackUser.getRealname();\n            String[] userIdArray = userIds.split(\",\");\n            String[] realNameArray = realNames.split(\",\");\n            for(int i=0;i<userIdArray.length;i++){\n                String userId = userIdArray[i];\n                String realName = realNameArray[i];\n                SysTenantPackUser entity = new SysTenantPackUser(sysTenantPackUser, userId, realName);\n                LambdaQueryWrapper<SysTenantPackUser> query = new LambdaQueryWrapper<SysTenantPackUser>()\n                        .eq(SysTenantPackUser::getTenantId, entity.getTenantId())\n                        .eq(SysTenantPackUser::getPackId, entity.getPackId())\n                        .eq(SysTenantPackUser::getUserId, entity.getUserId());\n                SysTenantPackUser packUser = sysTenantPackUserMapper.selectOne(query);\n                if(packUser==null || packUser.getId()==null){\n                    currentService.addTenantPackUser(entity);\n                }else{\n                    if(packUser.getStatus()==0){\n                        packUser.setPackName(entity.getPackName());\n                        packUser.setRealname(realName);\n                        currentService.addTenantPackUser(packUser);\n                    }\n                }\n            }\n        }\n    }\n\n    @TenantLog(2)\n    @Override\n    public void addTenantPackUser(SysTenantPackUser sysTenantPackUser) {\n        if(sysTenantPackUser.getId()==null){\n            sysTenantPackUserMapper.insert(sysTenantPackUser);\n        }else{\n            sysTenantPackUser.setStatus(1);\n            sysTenantPackUserMapper.updateById(sysTenantPackUser);\n        }\n    }\n\n    @TenantLog(4)\n    @Override\n    public void deleteTenantPackUser(SysTenantPackUser sysTenantPackUser) {\n        LambdaQueryWrapper<SysTenantPackUser> query = new LambdaQueryWrapper<SysTenantPackUser>()\n                .eq(SysTenantPackUser::getUserId, sysTenantPackUser.getUserId())\n                .eq(SysTenantPackUser::getPackId, sysTenantPackUser.getPackId());\n        sysTenantPackUserMapper.delete(query);\n\n        // QQYUN-4525【组织管理】管理员 2.管理员权限被移除时，给移除人员发送消息\n        sendMsgForDelete(sysTenantPackUser);\n    }\n\n    @Override\n    public List<TenantPackUser> getTenantPackApplyUsers(Integer tenantId) {\n        return getTenantPackUserList(tenantId, null, 0);\n    }\n\n    /**\n     * 获取租户下 某个产品包的用户\n     * 或者是 租户下产品包的申请用户\n     * @param tenantId\n     * @param packId\n     * @param packUserStatus\n     * @return\n     */\n    private List<TenantPackUser> getTenantPackUserList(Integer tenantId, String packId, Integer packUserStatus){\n        // 查询用户\n        List<TenantPackUser> userList = baseMapper.queryPackUserList(tenantId, packId, packUserStatus);\n        if(userList!=null && userList.size()>0){\n            List<String> userIdList = userList.stream().map(i->i.getId()).collect(Collectors.toList());\n            // 部门\n            List<UserDepart> depList = baseMapper.queryUserDepartList(userIdList);\n            // 职位 TODO\n            // 遍历用户 往用户中添加 部门信息和职位信息\n            for(TenantPackUser user: userList){\n                for(UserDepart dep: depList){\n                    if(user.getId().equals(dep.getUserId())){\n                        user.addDepart(dep.getDepartName());\n                    }\n                }\n            }\n        }\n        return userList;\n    }\n\n    @Override\n    public void doApplyTenantPackUser(SysTenantPackUser sysTenantPackUser) {\n        LambdaQueryWrapper<SysTenantPack> query1 = new LambdaQueryWrapper<SysTenantPack>()\n                .eq(SysTenantPack::getTenantId, sysTenantPackUser.getTenantId())\n                .eq(SysTenantPack::getPackCode, sysTenantPackUser.getPackCode());\n        SysTenantPack pack = sysTenantPackService.getOne(query1);\n        if(pack!=null){\n            sysTenantPackUser.setStatus(0);\n            sysTenantPackUser.setPackId(pack.getId());\n            LambdaQueryWrapper<SysTenantPackUser> query = new LambdaQueryWrapper<SysTenantPackUser>()\n                    .eq(SysTenantPackUser::getTenantId, sysTenantPackUser.getTenantId())\n                    .eq(SysTenantPackUser::getPackId, sysTenantPackUser.getPackId())\n                    .eq(SysTenantPackUser::getUserId, sysTenantPackUser.getUserId());\n            Long count = sysTenantPackUserMapper.selectCount(query);\n            if(count==null || count==0){\n                sysTenantPackUserMapper.insert(sysTenantPackUser);\n            }\n            // QQYUN-4524【组织关联】管理员 1.管理员权限申请-> 给相关管理员 发送通知消息\n            sendMsgForApply(sysTenantPackUser.getUserId(), pack);\n        }\n    }\n\n    /**\n     * 申请管理员权限发消息\n     * @param userId\n     * @param pack\n     */\n    private void sendMsgForApply(String userId, SysTenantPack pack){\n        // 发消息\n        SysUser user = userService.getById(userId);\n        Integer tenantId = pack.getTenantId();\n        SysTenant sysTenant = this.baseMapper.querySysTenant(tenantId);\n        String packCode = pack.getPackCode();\n\n        List<String> packCodeList = Arrays.asList(packCode.split(\",\"));\n        List<String> userList = sysTenantPackUserMapper.queryTenantPackUserNameList(tenantId, packCodeList);\n        MessageDTO messageDTO = new MessageDTO();\n        messageDTO.setToAll(false);\n        messageDTO.setToUser(String.join(\",\", userList));\n        messageDTO.setFromUser(\"system\");\n        String title = user.getRealname()+\" 申请加入 \"+sysTenant.getName()+\" 的\"+pack.getPackName()+\"的成员。\";\n        messageDTO.setTitle(title);\n        Map<String, Object> data = new HashMap<>();\n        messageDTO.setData(data);\n        messageDTO.setContent(title);\n        messageDTO.setType(\"system\");\n        sysBaseApi.sendTemplateMessage(messageDTO);\n    }\n\n    /**\n     * 移除管理员权限发消息\n     * @param sysTenantPackUser\n     */\n    private void sendMsgForDelete(SysTenantPackUser sysTenantPackUser){\n        // 发消息\n        SysUser user = userService.getById(sysTenantPackUser.getUserId());\n        SysTenant sysTenant = this.baseMapper.querySysTenant(sysTenantPackUser.getTenantId());\n        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        MessageDTO messageDTO = new MessageDTO();\n        messageDTO.setToAll(false);\n        messageDTO.setToUser(user.getUsername());\n        //低代码下移出用户已做提醒，用户移出没有套餐包名称的概念\n        String title = \"\";\n        if(oConvertUtils.isNotEmpty(sysTenantPackUser.getPackName())){\n            title = \"您已被 \"+loginUser.getRealname()+\" 从 \"+sysTenant.getName()+\"的\"+sysTenantPackUser.getPackName()+\"中移除。\";\n        } else {\n            title = \"您已被 \"+loginUser.getRealname()+\" 从 \"+sysTenant.getName() + \"中移除。\";\n        }\n        messageDTO.setTitle(title);\n        messageDTO.setFromUser(\"system\");\n        Map<String, Object> data = new HashMap<>();\n        data.put(\"realname\", loginUser.getRealname());\n        data.put(\"tenantName\", sysTenant.getName());\n        data.put(\"packName\", sysTenantPackUser.getPackName());\n        messageDTO.setData(data);\n        messageDTO.setType(\"system\");\n        messageDTO.setContent(title);\n        sysBaseApi.sendTemplateMessage(messageDTO);\n    }\n\n    /**\n     * 加入组织申请 发消息\n     * @param userId\n     * @param sysTenant\n     */\n    private void sendMsgForApplyJoinTenant(String userId, SysTenant sysTenant){\n        // 发消息\n        SysUser user = userService.getById(userId);\n        // 给超级管理员 和组织管理员发消息\n        String codes = \"superAdmin,accountAdmin\";\n        List<String> packCodeList = Arrays.asList(codes.split(\",\"));\n        List<String> userList = sysTenantPackUserMapper.queryTenantPackUserNameList(sysTenant.getId(), packCodeList);\n        MessageDTO messageDTO = new MessageDTO();\n        messageDTO.setToAll(false);\n        messageDTO.setToUser(String.join(\",\", userList));\n        messageDTO.setFromUser(\"system\");\n        String title = user.getRealname()+\" 申请加入 \"+sysTenant.getName()+\"。\";\n        messageDTO.setTitle(title);\n        Map<String, Object> data = new HashMap<>();\n        messageDTO.setData(data);\n        messageDTO.setType(\"system\");\n        messageDTO.setContent(title);\n        sysBaseApi.sendTemplateMessage(messageDTO);\n    }\n\n    /**\n     *  邀请成员 发消息\n     * @param user\n     * @param tenantId\n     * @param realname\n     */\n    private void sendMsgForInvitation(SysUser user, Integer tenantId, String realname){\n        // 发消息\n        SysTenant sysTenant = this.baseMapper.querySysTenant(tenantId);\n        BusMessageDTO messageDTO = new BusMessageDTO();\n        messageDTO.setToAll(false);\n        messageDTO.setToUser(user.getUsername());\n        messageDTO.setFromUser(\"system\");\n        // 代码逻辑说明: 【QQYUN-5730】租户邀请加入提示消息应该显示邀请人的名字------------\n        String title = realname + \" 邀请您加入 \"+sysTenant.getName()+\"。\";\n        messageDTO.setTitle(title);\n        Map<String, Object> data = new HashMap<>();\n        messageDTO.setData(data);\n        messageDTO.setContent(title);\n        messageDTO.setType(\"system\");\n        // 代码逻辑说明: 【QQYUN-7168】邀请成员时，会报错，但实际已经邀请成功了---\n        messageDTO.setCategory(CommonConstant.MSG_CATEGORY_1);\n        // 代码逻辑说明: 【QQYUN-5726】邀请加入租户加个按钮直接跳转过去------------\n        messageDTO.setBusType(SysAnnmentTypeEnum.TENANT_INVITE.getType());\n        sysBaseApi.sendBusAnnouncement(messageDTO);\n    }\n\n\n    @Override\n    public void passApply(SysTenantPackUser sysTenantPackUser) {\n        LambdaQueryWrapper<SysTenantPackUser> query = new LambdaQueryWrapper<SysTenantPackUser>()\n                .eq(SysTenantPackUser::getTenantId, sysTenantPackUser.getTenantId())\n                .eq(SysTenantPackUser::getPackId, sysTenantPackUser.getPackId())\n                .eq(SysTenantPackUser::getUserId, sysTenantPackUser.getUserId());\n        SysTenantPackUser packUser = sysTenantPackUserMapper.selectOne(query);\n        if(packUser!=null && packUser.getId()!=null && packUser.getStatus()==0){\n            ISysTenantService currentService = SpringContextUtils.getApplicationContext().getBean(ISysTenantService.class);\n            packUser.setPackName(sysTenantPackUser.getPackName());\n            packUser.setRealname(sysTenantPackUser.getRealname());\n            currentService.addTenantPackUser(packUser);\n            \n            //超级管理员成功加入发送系统消息\n            SysTenant sysTenant = tenantMapper.selectById(sysTenantPackUser.getTenantId());\n            String content = \" 您已成功加入\"+sysTenant.getName()+\"的超级管理员的成员。\";\n            SysUser sysUser = userService.getById(sysTenantPackUser.getUserId());\n            this.sendMsgForAgreeAndRefuseJoin(sysUser,content);\n        }\n    }\n\n    @Override\n    public void deleteApply(SysTenantPackUser sysTenantPackUser) {\n        LambdaQueryWrapper<SysTenantPackUser> query = new LambdaQueryWrapper<SysTenantPackUser>()\n                .eq(SysTenantPackUser::getTenantId, sysTenantPackUser.getTenantId())\n                .eq(SysTenantPackUser::getPackId, sysTenantPackUser.getPackId())\n                .eq(SysTenantPackUser::getUserId, sysTenantPackUser.getUserId());\n        SysTenantPackUser packUser = sysTenantPackUserMapper.selectOne(query);\n        if(packUser!=null && packUser.getId()!=null && packUser.getStatus()==0){\n            sysTenantPackUserMapper.deleteById(packUser.getId());\n            //超级管理员拒绝加入发送系统消息\n            SysTenant sysTenant = tenantMapper.selectById(sysTenantPackUser.getTenantId());\n            String content = \" 管理员已拒绝您加入\"+sysTenant.getName()+\"的超级管理员的成员请求。\";\n            SysUser sysUser = userService.getById(sysTenantPackUser.getUserId());\n            this.sendMsgForAgreeAndRefuseJoin(sysUser,content);\n        }\n    }\n\n    @Override\n    public IPage<TenantPackUser> queryTenantPackUserList(String tenantId, String packId,Integer status, Page<TenantPackUser> page) {\n        // 查询用户\n        List<TenantPackUser> userList = baseMapper.queryTenantPackUserList(page,tenantId, packId,status);\n        // 获取产品包下用户部门和职位\n        userList = getPackUserPositionAndDepart(userList);\n        return page.setRecords(userList);\n    }\n\n    /**\n     * 获取用户职位和部门\n     * @param userList\n     * @return\n     */\n    private List<TenantPackUser> getPackUserPositionAndDepart(List<TenantPackUser> userList) {\n        if(userList!=null && userList.size()>0){\n            List<String> userIdList = userList.stream().map(i->i.getId()).collect(Collectors.toList());\n            // 部门\n            List<UserDepart> depList = baseMapper.queryUserDepartList(userIdList);\n            // 职位\n            List<UserPosition> userPositions = baseMapper.queryUserPositionList(userIdList);\n            // 遍历用户 往用户中添加 部门信息和职位信息\n            for (TenantPackUser user : userList) {\n                //添加部门\n                for (UserDepart dep : depList) {\n                    if (user.getId().equals(dep.getUserId())) {\n                        user.addDepart(dep.getDepartName());\n                    }\n                }\n                //添加职位\n                for (UserPosition userPosition : userPositions) {\n                    if (user.getId().equals(userPosition.getUserId())) {\n                        user.addPosition(userPosition.getPositionName());\n                    }\n                }\n            }\n        }\n        return userList;\n    }\n\n\n    /**\n     * 保存用户部门关系\n     * @param userId\n     * @param departId\n     */\n    private void saveUserDepart(String userId, String departId) {\n        //根据用户id和部门id获取数量,用于查看用户是否存在用户部门关系表中\n        Long count = sysUserDepartMapper.getCountByDepartIdAndUserId(userId,departId);\n        if(count == 0){\n            SysUserDepart sysUserDepart = new SysUserDepart(userId,departId);\n            sysUserDepartMapper.insert(sysUserDepart);\n        }\n    }\n    \n    @Override\n    public Long getApplySuperAdminCount() {\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n        return baseMapper.getApplySuperAdminCount(sysUser.getId(),tenantId);\n    }\n\n    /**\n     * 同意或拒绝加入超级管理员 发消息\n     * @param user\n     * @param content\n     */\n    public void sendMsgForAgreeAndRefuseJoin(SysUser user, String content){\n        // 发消息\n        MessageDTO messageDTO = new MessageDTO();\n        messageDTO.setToAll(false);\n        messageDTO.setToUser(user.getUsername());\n        messageDTO.setFromUser(\"system\");\n        messageDTO.setTitle(content);\n        Map<String, Object> data = new HashMap<>();\n        messageDTO.setData(data);\n        messageDTO.setContent(content);\n        messageDTO.setType(\"system\");\n        sysBaseApi.sendTemplateMessage(messageDTO);\n    }\n\n    /**\n     * 获取租户错误提示信息\n     *\n     * @param status\n     * @return\n     */\n    private String getTenantErrorInfo(String status) {\n        String content = \"已在租户中，无需邀请！\";\n        if (CommonConstant.USER_TENANT_QUIT.equals(status)) {\n            content = \"已离职！\";\n        } else if (CommonConstant.USER_TENANT_UNDER_REVIEW.equals(status)) {\n            content = \"租户管理员审核中！\";\n        } else if (CommonConstant.USER_TENANT_REFUSE.equals(status)) {\n            content = \"租户管理员已拒绝！\";\n        } else if (CommonConstant.USER_TENANT_INVITE.equals(status)) {\n            content = \"已被邀请，待用户同意！\";\n        }\n        return content;\n    }\n\n    /**\n     * 删除租户下的产品包\n     *\n     * @param tenantIdList\n     */\n    private void deleteTenantPackByTenantId(List<Integer> tenantIdList) {\n        //1.删除产品包下的用户\n        sysTenantPackUserMapper.deletePackUserByTenantIds(tenantIdList);\n        //2.删除产品包对应的菜单权限\n        sysPackPermissionMapper.deletePackPermByTenantIds(tenantIdList);\n        //3.删除产品包\n        sysTenantPackMapper.deletePackByTenantIds(tenantIdList);\n    }\n\n    @Override\n    public void deleteUserByPassword(SysUser sysUser, Integer tenantId) {\n        //被删除人的用户id\n        String userId = sysUser.getId();\n        //被删除人的密码\n        String password = sysUser.getPassword();\n        //当前登录用户\n        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        //step1 判断当前用户是否为当前租户的管理员(只有超级管理员和账号管理员可以删除)\n        Long isHaveAdmin = sysTenantPackUserMapper.izHaveBuyAuth(user.getId(), tenantId);\n        if(null == isHaveAdmin || 0 == isHaveAdmin){\n            throw new JeecgBootException(\"您不是当前组织的管理员，无法删除用户！\");\n        }\n        //step2 离职状态下，并且无其他组织情况下，可以删除\n        SysUserTenant sysUserTenant = userTenantMapper.getUserTenantByTenantId(userId, tenantId);\n        if(null == sysUserTenant || !CommonConstant.USER_TENANT_QUIT.equals(sysUserTenant.getStatus())){\n            throw new JeecgBootException(\"用户没有离职，不允许删除！\"); \n        }\n        List<Integer> tenantIdsByUserId = userTenantMapper.getTenantIdsByUserId(userId);\n        if(CollectionUtils.isNotEmpty(tenantIdsByUserId) && tenantIdsByUserId.size()>0){\n            throw new JeecgBootException(\"用户尚有未退出的组织，无法删除！\");\n        }\n        //step3 当天创建的用户和创建人可以删除\n        SysUser sysUserData = userService.getById(userId);\n        if(!sysUserData.getCreateBy().equals(user.getUsername())){\n            throw new JeecgBootException(\"您不是该用户的创建人，无法删除！\");\n        }\n        \n        // 代码逻辑说明: 【QQYUN-11839】删除用户，需要输入被删除用户的密码，这逻辑对吗？不应该是管理员的密码吗---\n        this.verifyCreateTimeAndPassword(sysUserData,password);\n\n        //step5 逻辑删除用户\n        userService.deleteUser(userId);\n        //step6 真实删除用户\n        userService.removeLogicDeleted(Collections.singletonList(userId));\n    }\n\n    /**\n     * 验证创建时间和密码\n     * \n     * @param sysUser\n     * @param password\n     */\n    private void verifyCreateTimeAndPassword(SysUser sysUser,String password) {\n        if(null == sysUser){\n            throw new JeecgBootException(\"该用户不存在，无法删除！\");\n        }\n        //step1 验证创建时间\n        //当前登录用户\n        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        Date createTime = sysUser.getCreateTime();\n        boolean sameDay = DateUtils.isSameDay(createTime, new Date());\n        if(!sameDay){\n            throw new JeecgBootException(\"用户不是今天创建的，无法删除！\");\n        }\n        //step2 验证密码\n        //获取admin的用户\n        SysUser adminUser = userService.getById(user.getId());\n        String passwordEncode = PasswordUtil.encrypt(adminUser.getUsername(), password, adminUser.getSalt());\n        if(!passwordEncode.equals(adminUser.getPassword())){\n            throw new JeecgBootException(\"您输入的密码不正确，无法删除该用户！\");\n        }\n    }\n\n    @Override\n    public List<SysTenant> getTenantListByUserId(String userId) {\n        return tenantMapper.getTenantListByUserId(userId);\n    }\n\n    @Override\n    public void deleteUser(SysUser sysUser, Integer tenantId) {\n        //被删除人的用户id\n        String userId = sysUser.getId();\n        //被删除人的密码\n        String password = sysUser.getPassword();\n        //当前登录用户\n        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        //step1 判断当前用户是否为当前租户的创建者才可以删除\n        SysTenant sysTenant = this.getById(tenantId);\n        if(null == sysTenant || !user.getUsername().equals(sysTenant.getCreateBy())){\n            throw new JeecgBootException(\"您不是当前组织的创建者，无法删除用户！\");\n        }\n        //step2 判断除了当前组织之外是否还有加入了其他组织\n        LambdaQueryWrapper<SysUserTenant> query = new LambdaQueryWrapper<>();\n        query.eq(SysUserTenant::getUserId,userId);\n        query.ne(SysUserTenant::getTenantId,tenantId);\n        List<SysUserTenant> sysUserTenants = userTenantMapper.selectList(query);\n        if(CollectionUtils.isNotEmpty(sysUserTenants)){\n            throw new JeecgBootException(\"该用户还存在于其它组织中，无法删除用户！\");\n        }\n        //step3 验证创建时间和密码\n        SysUser sysUserData = userService.getById(userId);\n        this.verifyCreateTimeAndPassword(sysUserData,password);\n        //step4 真实删除用户\n        userService.deleteUser(userId);\n        userService.removeLogicDeleted(Collections.singletonList(userId));\n    }\n\n    /**\n     * 为用户添加租户下所有套餐\n     *\n     * @param userId   用户id\n     * @param tenantId 租户id\n     */\n    public void addPackUser(String userId, String tenantId) {\n        //根据租户id和产品包的code获取租户套餐id\n        List<String> packIds = sysTenantPackMapper.getPackIdByPackCodeAndTenantId(oConvertUtils.getInt(tenantId));\n        if (CollectionUtil.isNotEmpty(packIds)) {\n            for (String packId : packIds) {\n                SysTenantPackUser sysTenantPackUser = new SysTenantPackUser();\n                sysTenantPackUser.setUserId(userId);\n                sysTenantPackUser.setTenantId(oConvertUtils.getInt(tenantId));\n                sysTenantPackUser.setPackId(packId);\n                sysTenantPackUser.setStatus(CommonConstant.STATUS_1_INT);\n                try {\n                    this.addTenantPackUser(sysTenantPackUser);\n                } catch (Exception e) {\n                    log.warn(\"添加用户套餐包失败，原因：\" + e.getMessage());\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport com.jeecg.dingtalk.api.base.JdtBaseAPI;\nimport com.jeecg.dingtalk.api.core.response.Response;\nimport com.jeecg.dingtalk.api.core.vo.AccessToken;\nimport com.jeecg.dingtalk.api.user.JdtUserAPI;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.DateUtils;\nimport org.jeecg.common.util.PasswordUtil;\nimport org.jeecg.common.util.UUIDGenerator;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysRole;\nimport org.jeecg.modules.system.entity.SysThirdAccount;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.entity.SysUserRole;\nimport org.jeecg.modules.system.mapper.SysRoleMapper;\nimport org.jeecg.modules.system.mapper.SysThirdAccountMapper;\nimport org.jeecg.modules.system.mapper.SysUserMapper;\nimport org.jeecg.modules.system.mapper.SysUserRoleMapper;\nimport org.jeecg.modules.system.model.ThirdLoginModel;\nimport org.jeecg.modules.system.service.ISysThirdAccountService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Service;\n\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * @Description: 第三方登录账号表\n * @Author: jeecg-boot\n * @Date:   2020-11-17\n * @Version: V1.0\n */\n@Service\n@Slf4j\npublic class SysThirdAccountServiceImpl extends ServiceImpl<SysThirdAccountMapper, SysThirdAccount> implements ISysThirdAccountService {\n    \n    @Autowired\n    private  SysThirdAccountMapper sysThirdAccountMapper;\n    \n    @Autowired\n    private SysUserMapper sysUserMapper;\n    @Autowired\n    private SysRoleMapper sysRoleMapper;\n    @Autowired\n    private SysUserRoleMapper sysUserRoleMapper;\n    \n    @Value(\"${justauth.type.DINGTALK.client-id:}\")\n    private String dingTalkClientId;   \n    @Value(\"${justauth.type.DINGTALK.client-secret:}\")\n    private String dingTalkClientSecret;\n    \n    @Override\n    public void updateThirdUserId(SysUser sysUser,String thirdUserUuid) {\n        //修改第三方登录账户表使其进行添加用户id\n        LambdaQueryWrapper<SysThirdAccount> query = new LambdaQueryWrapper<>();\n        query.eq(SysThirdAccount::getThirdUserUuid,thirdUserUuid);\n        //扫码登录更新用户创建的时候存的是默认租户，更新的时候也需要根据默认租户来查询，同一个公司下UUID是一样的，不同应用需要区分租户。\n        query.eq(SysThirdAccount::getTenantId,CommonConstant.TENANT_ID_DEFAULT_VALUE);\n        SysThirdAccount account = sysThirdAccountMapper.selectOne(query);\n        SysThirdAccount sysThirdAccount = new SysThirdAccount();\n        sysThirdAccount.setSysUserId(sysUser.getId());\n        //根据当前用户id和登录方式查询第三方登录表\n        LambdaQueryWrapper<SysThirdAccount> thirdQuery = new LambdaQueryWrapper<>();\n        thirdQuery.eq(SysThirdAccount::getSysUserId,sysUser.getId());\n        thirdQuery.eq(SysThirdAccount::getThirdType,account.getThirdType());\n        thirdQuery.eq(SysThirdAccount::getThirdUserUuid,thirdUserUuid);\n        thirdQuery.eq(SysThirdAccount::getTenantId,CommonConstant.TENANT_ID_DEFAULT_VALUE);\n        SysThirdAccount sysThirdAccounts = sysThirdAccountMapper.selectOne(thirdQuery);\n        if(sysThirdAccounts!=null){\n            sysThirdAccount.setThirdUserId(sysThirdAccounts.getThirdUserId());\n            sysThirdAccountMapper.deleteById(sysThirdAccounts.getId());\n        }\n        //更新用户账户表sys_user_id\n        sysThirdAccountMapper.update(sysThirdAccount,query);\n    }\n    \n    @Override\n    public SysUser createUser(String phone, String thirdUserUuid, Integer tenantId) {\n       //先查询第三方，获取登录方式\n        LambdaQueryWrapper<SysThirdAccount> query = new LambdaQueryWrapper<>();\n        query.eq(SysThirdAccount::getThirdUserUuid,thirdUserUuid);\n        query.eq(SysThirdAccount::getTenantId,tenantId);\n        SysThirdAccount account = sysThirdAccountMapper.selectOne(query);\n        //通过用户名查询数据库是否已存在\n        SysUser userByName = sysUserMapper.getUserByName(thirdUserUuid);\n        if(null!=userByName){\n            //如果账号存在的话，则自动加上一个时间戳\n            String format = DateUtils.yyyymmddhhmmss.get().format(new Date());\n            thirdUserUuid = thirdUserUuid + format;\n        }\n        //添加用户\n        SysUser user = new SysUser();\n        user.setActivitiSync(CommonConstant.ACT_SYNC_1);\n        user.setDelFlag(CommonConstant.DEL_FLAG_0);\n        user.setStatus(1);\n        user.setUsername(thirdUserUuid);\n        user.setPhone(phone);\n        //设置初始密码\n        String salt = oConvertUtils.randomGen(8);\n        user.setSalt(salt);\n        String passwordEncode = PasswordUtil.encrypt(user.getUsername(), \"123456\", salt);\n        user.setPassword(passwordEncode);\n        user.setRealname(account.getRealname());\n        user.setAvatar(account.getAvatar());\n        String s = this.saveThirdUser(user);\n        //更新用户第三方账户表的userId\n        SysThirdAccount sysThirdAccount = new SysThirdAccount();\n        sysThirdAccount.setSysUserId(s);\n        sysThirdAccount.setTenantId(tenantId);\n        sysThirdAccountMapper.update(sysThirdAccount,query);\n        return user;\n    }\n    \n    public String saveThirdUser(SysUser sysUser) {\n        //保存用户\n        String userid = UUIDGenerator.generate();\n        sysUser.setId(userid);\n        sysUserMapper.insert(sysUser);\n        //获取第三方角色\n        SysRole sysRole = sysRoleMapper.selectOne(new LambdaQueryWrapper<SysRole>().eq(SysRole::getRoleCode, \"third_role\"));\n        //保存用户角色\n        SysUserRole userRole = new SysUserRole();\n        userRole.setRoleId(sysRole.getId());\n        userRole.setUserId(userid);\n        sysUserRoleMapper.insert(userRole);\n        return userid;\n    }\n\n    @Override\n    public SysThirdAccount getOneBySysUserId(String sysUserId, String thirdType) {\n        LambdaQueryWrapper<SysThirdAccount> queryWrapper = new LambdaQueryWrapper<>();\n        log.info(\"getSysUserId: {} ,getThirdType: {}\",sysUserId,thirdType);\n        queryWrapper.eq(SysThirdAccount::getSysUserId, sysUserId);\n        queryWrapper.eq(SysThirdAccount::getThirdType, thirdType);\n        return super.getOne(queryWrapper);\n    }\n\n    @Override\n    public SysThirdAccount getOneByThirdUserId(String thirdUserId, String thirdType) {\n        LambdaQueryWrapper<SysThirdAccount> queryWrapper = new LambdaQueryWrapper<>();\n        queryWrapper.eq(SysThirdAccount::getThirdUserId, thirdUserId);\n        queryWrapper.eq(SysThirdAccount::getThirdType, thirdType);\n        return super.getOne(queryWrapper);\n    }\n\n    @Override\n    public List<SysThirdAccount> listThirdUserIdByUsername(String[] sysUsernameArr, String thirdType, Integer tenantId) {\n        return sysThirdAccountMapper.selectThirdIdsByUsername(sysUsernameArr, thirdType,tenantId);\n    }\n\n    @Override\n    public SysThirdAccount saveThirdUser(ThirdLoginModel tlm, Integer tenantId) {\n        SysThirdAccount user = new SysThirdAccount();\n        user.setDelFlag(CommonConstant.DEL_FLAG_0);\n        user.setStatus(1);\n        user.setThirdType(tlm.getSource());\n        user.setAvatar(tlm.getAvatar());\n        user.setRealname(tlm.getUsername());\n        user.setThirdUserUuid(tlm.getUuid());\n        user.setTenantId(tenantId);\n        //=============begin 判断如果是钉钉的情况下，需要将第三方的用户id查询出来，发送模板的时候有用==========\n        if(CommonConstant.DINGTALK.toLowerCase().equals(tlm.getSource())){\n            AccessToken accessToken = JdtBaseAPI.getAccessToken(dingTalkClientId, dingTalkClientSecret);\n            Response<String> getUserIdRes = JdtUserAPI.getUseridByUnionid(tlm.getUuid(), accessToken.getAccessToken());\n            if (getUserIdRes.isSuccess()) {\n                user.setThirdUserId(getUserIdRes.getResult());\n            }else{\n                user.setThirdUserId(tlm.getUuid());\n            }\n        //=============end 判断如果是钉钉的情况下，需要将第三方的用户id查询出来，发送模板的时候有用==========\n        }else{\n            user.setThirdUserId(tlm.getUuid());\n        }\n        super.save(user);\n        return user;\n    }\n\n    @Override\n    public SysThirdAccount bindThirdAppAccountByUserId(SysThirdAccount sysThirdAccount) {\n        String thirdUserUuid = sysThirdAccount.getThirdUserUuid();\n        String thirdType = sysThirdAccount.getThirdType();\n        //获取当前登录用户\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        //当前第三方用户已被其他用户所绑定\n        SysThirdAccount oneByThirdUserId = this.getOneByUuidAndThirdType(thirdUserUuid, thirdType,CommonConstant.TENANT_ID_DEFAULT_VALUE, null);\n        if(null != oneByThirdUserId){\n            //如果不为空，并且第三方表和当前登录的用户一致，直接返回\n            if(oConvertUtils.isNotEmpty(oneByThirdUserId.getSysUserId()) && oneByThirdUserId.getSysUserId().equals(sysUser.getId())){\n                return oneByThirdUserId;\n            }else if(oConvertUtils.isNotEmpty(oneByThirdUserId.getSysUserId())){\n                //如果第三方表的用户id不为空，那就说明已经绑定过了\n                throw new JeecgBootException(\"该敲敲云账号已被其它第三方账号绑定,请解绑或绑定其它敲敲云账号\");\n            }else{\n                //更新第三方表信息用户id\n                oneByThirdUserId.setSysUserId(sysUser.getId());\n                oneByThirdUserId.setThirdType(thirdType);\n                sysThirdAccountMapper.updateById(oneByThirdUserId);\n                return oneByThirdUserId;\n            }\n        }else{\n            throw new JeecgBootException(\"账号绑定失败,请稍后重试\");\n        }\n    }\n\n    @Override\n    public SysThirdAccount getOneByUuidAndThirdType(String unionid, String thirdType,Integer tenantId,String thirdUserId) {\n        LambdaQueryWrapper<SysThirdAccount> queryWrapper = new LambdaQueryWrapper<>();\n        queryWrapper.eq(SysThirdAccount::getThirdType, thirdType);\n        // 代码逻辑说明: 如果第三方用户id为空那么就不走第三方用户查询逻辑，因为扫码登录third_user_id是唯一的，没有重复的情况---\n        if(oConvertUtils.isNotEmpty(thirdUserId)){\n            queryWrapper.and((wrapper) ->wrapper.eq(SysThirdAccount::getThirdUserUuid,unionid).or().eq(SysThirdAccount::getThirdUserId,thirdUserId));\n        }else{\n            queryWrapper.eq(SysThirdAccount::getThirdUserUuid, unionid);\n        }\n        queryWrapper.eq(SysThirdAccount::getTenantId, tenantId);\n        return super.getOne(queryWrapper);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAppConfigServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.modules.system.entity.SysThirdAppConfig;\nimport org.jeecg.modules.system.mapper.SysThirdAppConfigMapper;\nimport org.jeecg.modules.system.service.ISysThirdAppConfigService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n/**\n * @Description: 第三方配置表\n * @Author: jeecg-boot\n * @Date:   2023-02-03\n * @Version: V1.0\n */\n@Service\n@Slf4j\npublic class SysThirdAppConfigServiceImpl extends ServiceImpl<SysThirdAppConfigMapper, SysThirdAppConfig> implements ISysThirdAppConfigService {\n\n    @Autowired\n    private SysThirdAppConfigMapper configMapper;\n\n    @Override\n    public List<SysThirdAppConfig> getThirdConfigListByThirdType(int tenantId) {\n        return configMapper.getThirdConfigListByThirdType(tenantId);\n    }\n\n    @Override\n    public SysThirdAppConfig getThirdConfigByThirdType(Integer tenantId, String thirdType) {\n        return configMapper.getThirdConfigByThirdType(tenantId,thirdType);\n    }\n\n    @Override\n    public List<SysThirdAppConfig> getThirdAppConfigByClientId(String clientId) {\n        LambdaQueryWrapper<SysThirdAppConfig> query = new LambdaQueryWrapper<>();\n        query.eq(SysThirdAppConfig::getClientId,clientId);\n        List<SysThirdAppConfig> sysThirdAppConfigs = configMapper.selectList(query);\n        return sysThirdAppConfigs;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepPostServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.jeecg.modules.system.entity.SysUserDepPost;\nimport org.jeecg.modules.system.mapper.SysUserDepPostMapper;\nimport org.jeecg.modules.system.service.ISysUserDepPostService;\nimport org.springframework.stereotype.Service;\n\n/**\n * @Description: 部门岗位用户实现类\n * @author: wangshuai\n * @date: 2025/9/5 11:46\n */\n@Service\npublic class SysUserDepPostServiceImpl extends ServiceImpl<SysUserDepPostMapper, SysUserDepPost> implements ISysUserDepPostService {\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepartServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.apache.commons.lang3.StringUtils;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.constant.enums.DepartCategoryEnum;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.modules.system.entity.SysDepart;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.entity.SysUserDepart;\nimport org.jeecg.modules.system.mapper.SysUserDepartMapper;\nimport org.jeecg.modules.system.mapper.SysUserMapper;\nimport org.jeecg.modules.system.mapper.SysUserTenantMapper;\nimport org.jeecg.modules.system.model.DepartIdModel;\nimport org.jeecg.modules.system.service.ISysDepartService;\nimport org.jeecg.modules.system.service.ISysUserDepartService;\nimport org.jeecg.modules.system.service.ISysUserService;\nimport org.jeecg.modules.system.vo.SysUserDepVo;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.stereotype.Service;\n\nimport java.util.*;\nimport java.util.stream.Collectors;\n\n/**\n * <P>\n * 用户部门表实现类\n * <p/>\n * @Author ZhiLin\n *@since 2019-02-22\n */\n@Service\npublic class SysUserDepartServiceImpl extends ServiceImpl<SysUserDepartMapper, SysUserDepart> implements ISysUserDepartService {\n\t@Autowired\n\tprivate ISysDepartService sysDepartService;\n\t@Lazy\n\t@Autowired\n\tprivate ISysUserService sysUserService;\n\t@Autowired\n\tprivate SysUserMapper sysUserMapper;\n\t@Autowired\n    private SysUserTenantMapper userTenantMapper;\n\t\n\n\t/**\n\t * 根据用户id查询部门信息\n\t */\n\t@Override\n\tpublic List<DepartIdModel> queryDepartIdsOfUser(String userId) {\n\t\tLambdaQueryWrapper<SysUserDepart> queryUserDep = new LambdaQueryWrapper<SysUserDepart>();\n\t\tLambdaQueryWrapper<SysDepart> queryDep = new LambdaQueryWrapper<SysDepart>();\n\t\ttry {\n            queryUserDep.eq(SysUserDepart::getUserId, userId);\n\t\t\tList<String> depIdList = new ArrayList<>();\n\t\t\tList<DepartIdModel> depIdModelList = new ArrayList<>();\n\t\t\tList<SysUserDepart> userDepList = this.list(queryUserDep);\n\t\t\tif(userDepList != null && userDepList.size() > 0) {\n\t\t\tfor(SysUserDepart userDepart : userDepList) {\n\t\t\t\t\tdepIdList.add(userDepart.getDepId());\n\t\t\t\t}\n\n\t\t\t// 代码逻辑说明: 判断是否开启租户saas模式，开启需要根据当前租户查询------------\n\t\t\tif (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n\t\t\t\tInteger tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n\t\t\t\tqueryDep.eq(SysDepart::getTenantId,tenantId);\n\t\t\t}\n\t\t\t\n\t\t\tqueryDep.in(SysDepart::getId, depIdList);\n\t\t\tList<SysDepart> depList = sysDepartService.list(queryDep);\n\t\t\t//jeecg-boot/issues/3906\n\t\t\tif(depList != null && depList.size() > 0) {\n\t\t\t\tfor(SysDepart depart : depList) {\n\t\t\t\t\tdepIdModelList.add(new DepartIdModel().convertByUserDepart(depart));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn depIdModelList;\n\t\t\t}\n\t\t}catch(Exception e) {\n\t\t\te.fillInStackTrace();\n\t\t}\n\t\treturn null;\n\t\t\n\t\t\n\t}\n\n\n\t/**\n\t * 根据部门id查询用户信息\n\t */\n\t@Override\n\tpublic List<SysUser> queryUserByDepId(String depId) {\n\t\tLambdaQueryWrapper<SysUserDepart> queryUserDep = new LambdaQueryWrapper<SysUserDepart>();\n\t\tqueryUserDep.eq(SysUserDepart::getDepId, depId);\n\t\tList<String> userIdList = new ArrayList<>();\n\t\tList<SysUserDepart> uDepList = this.list(queryUserDep);\n\t\tif(uDepList != null && uDepList.size() > 0) {\n\t\t\tfor(SysUserDepart uDep : uDepList) {\n\t\t\t\tuserIdList.add(uDep.getUserId());\n\t\t\t}\n\t\t\tList<SysUser> userList = (List<SysUser>) sysUserMapper.selectBatchIds(userIdList);\n\t\t\tif(CollectionUtil.isNotEmpty(userList)){\n\n\t\t\t\t// 代码逻辑说明: JHHB-812 人员按照排序展示\n\t\t\t\tuserList.sort(Comparator.comparing(SysUser::getSort,\n\t\t\t\t\t\tComparator.nullsFirst(Comparator.naturalOrder())));\n\n\t\t\t\t// 代码逻辑说明: 接口调用查询返回结果不能返回密码相关信息\n\t\t\t\tfor (SysUser sysUser : userList) {\n\t\t\t\t\tsysUser.setSalt(\"\");\n\t\t\t\t\tsysUser.setPassword(\"\");\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn userList;\n\t\t}\n\t\treturn new ArrayList<SysUser>();\n\t}\n\n\t/**\n\t * 根据部门code，查询当前部门和下级部门的 用户信息\n\t */\n\t@Override\n\tpublic List<SysUser> queryUserByDepCode(String depCode,String realname) {\n\t\t// 代码逻辑说明: 根据部门选择用户接口代码优化\n\t\tif(oConvertUtils.isNotEmpty(realname)){\n\t\t\trealname = realname.trim();\n\t\t}\n\t\tList<SysUser> userList = this.baseMapper.queryDepartUserList(depCode, realname);\n\t\tMap<String, SysUser> map = new HashMap(5);\n\t\tfor (SysUser sysUser : userList) {\n\t\t\t// 返回的用户数据去掉密码信息\n\t\t\tsysUser.setSalt(\"\");\n\t\t\tsysUser.setPassword(\"\");\n\t\t\tmap.put(sysUser.getId(), sysUser);\n\t\t}\n\t\treturn new ArrayList<SysUser>(map.values());\n\n\t}\n\n\t/**\n\t *\n\t * @param departId\n\t * @param username\n\t * @param realname\n\t * @param pageSize\n\t * @param pageNo\n\t * @param id\n\t * @param isMultiTranslate 是否多字段翻译\n\t * @return\n\t */\n\t@Override\n\tpublic IPage<SysUser> queryDepartUserPageList(String departId, String username, String realname, int pageSize, int pageNo,String id,String isMultiTranslate) {\n\t\tIPage<SysUser> pageList = null;\n\t\t// 部门ID不存在 直接查询用户表即可\n\t\tPage<SysUser> page = new Page<SysUser>(pageNo, pageSize);\n\t\tif(oConvertUtils.isEmpty(departId)){\n\t\t\tLambdaQueryWrapper<SysUser> query = new LambdaQueryWrapper<>();\n            // 代码逻辑说明: [JTC-297]已冻结用户仍可设置为代理人------------\n            query.eq(SysUser::getStatus,Integer.parseInt(CommonConstant.STATUS_1));\n\t\t\t// 代码逻辑说明: 逗号分割多个用户翻译问题------------\n\t\t\tif(oConvertUtils.isNotEmpty(username)){\n\t\t\t\tString COMMA = \",\";\n\t\t\t\tif(oConvertUtils.isNotEmpty(isMultiTranslate) && username.contains(COMMA)){\n\t\t\t\t\tString[] usernameArr = username.split(COMMA);\n\t\t\t\t\tquery.in(SysUser::getUsername,usernameArr);\n\t\t\t\t}else {\n\t\t\t\t\tquery.like(SysUser::getUsername, username);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 代码逻辑说明: JHHB-304 流程转办 人员选择时，加姓名搜索------------\n\t\t\tif(oConvertUtils.isNotEmpty(realname)){\n\t\t\t\tString COMMA = \",\";\n\t\t\t\tif(oConvertUtils.isNotEmpty(isMultiTranslate) && realname.contains(COMMA)){\n\t\t\t\t\tString[] realnameArr = realname.split(COMMA);\n\t\t\t\t\tquery.in(SysUser::getRealname,realnameArr);\n\t\t\t\t}else {\n\t\t\t\t\tquery.like(SysUser::getRealname, realname);\n\t\t\t\t}\n\t\t\t}\n\n            // 代码逻辑说明: [VUEN-1238]邮箱回复时，发送到显示的为用户id------------\n            if(oConvertUtils.isNotEmpty(id)){\n\t\t\t\t// 代码逻辑说明: 【TV360X-1482】写信，选择用户后第一次回显没翻译------------\n\t\t\t\tString COMMA = \",\";\n\t\t\t\tif(oConvertUtils.isNotEmpty(isMultiTranslate) && id.contains(COMMA)){\n\t\t\t\t\tString[] idArr = id.split(COMMA);\n\t\t\t\t\tquery.in(SysUser::getId, Arrays.asList(idArr));\n\t\t\t\t}else {\n\t\t\t\t\tquery.eq(SysUser::getId, id);\n\t\t\t\t}\n            }\n            // 代码逻辑说明: [VUEN-2121]临时用户不能直接显示------------\n            query.ne(SysUser::getUsername,\"_reserve_user_external\");\n            // 代码逻辑说明: 【JHHB-765】需要能设置排序---\n            query.orderByAsc(SysUser::getSort);\n            query.orderByDesc(SysUser::getCreateTime);\n            //------------------------------------------------------------------------------------------------\n\t\t\t//是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n\t\t\tif (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n\t\t\t\tString tenantId = oConvertUtils.getString(TenantContext.getTenant(), \"0\");\n                // 代码逻辑说明: [QQYUN-3371]租户逻辑改造，改成关系表------------\n\t\t\t\tList<String> userIdList = userTenantMapper.getUserIdsByTenantId(Integer.valueOf(tenantId));\n\t\t\t\tif(null!=userIdList && userIdList.size()>0){\n                    query.in(SysUser::getId,userIdList);\n                }\n\t\t\t}\n\t\t\t//------------------------------------------------------------------------------------------------\n\t\t\tpageList = sysUserMapper.selectPage(page, query);\n\t\t}else{\n\t\t\t// 有部门ID 需要走自定义sql\n\t\t\tSysDepart sysDepart = sysDepartService.getById(departId);\n\t\t\tpageList = this.baseMapper.queryDepartUserPageList(page, sysDepart.getOrgCode(), username, realname);\n\t\t}\n\t\tList<SysUser> userList = pageList.getRecords();\n\t\tif(userList!=null && userList.size()>0){\n\t\t\tList<String> userIds = userList.stream().map(SysUser::getId).collect(Collectors.toList());\n\t\t\tMap<String, SysUser> map = new LinkedHashMap(5);\n\t\t\tif(userIds!=null && userIds.size()>0){\n\t\t\t\t// 查部门名称\n\t\t\t\tMap<String,String>  useDepNames = this.getDepNamesByUserIds(userIds);\n\t\t\t\tuserList.forEach(item->{\n\t\t\t\t\t//TODO 临时借用这个字段用于页面展示\n\t\t\t\t\titem.setOrgCodeTxt(useDepNames.get(item.getId()));\n\t\t\t\t\titem.setSalt(\"\");\n\t\t\t\t\titem.setPassword(\"\");\n\t\t\t\t\t// 去重\n\t\t\t\t\tmap.put(item.getId(), item);\n\t\t\t\t});\n\t\t\t}\n\t\t\tpageList.setRecords(new ArrayList<SysUser>(map.values()));\n\t\t}\n\t\treturn pageList;\n\t}\n\n    @Override\n    public IPage<SysUser> getUserInformation(Integer tenantId, String departId, String keyword, Integer pageSize, Integer pageNo) {\n        IPage<SysUser> pageList = null;\n        // 部门ID不存在 直接查询用户表即可\n        Page<SysUser> page = new Page<>(pageNo, pageSize);\n        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n        if(oConvertUtils.isEmpty(departId)){\n            LambdaQueryWrapper<SysUser> query = new LambdaQueryWrapper<>();\n            query.eq(SysUser::getStatus,Integer.parseInt(CommonConstant.STATUS_1));\n            query.ne(SysUser::getUsername,\"_reserve_user_external\");\n\n\t\t\t// 支持租户隔离\n\t\t\tif (tenantId != null) {\n\t\t\t\tList<String> userIds = userTenantMapper.getUserIdsByTenantId(tenantId);\n\t\t\t\tif(oConvertUtils.listIsNotEmpty(userIds)){\n\t\t\t\t\tquery.in(SysUser::getId, userIds);\n\t\t\t\t}else{\n\t\t\t\t\tquery.eq(SysUser::getId,\"通过租户ID查不到用户\");\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n            //排除自己\n            query.ne(SysUser::getId,sysUser.getId());\n\t\t\tif(StringUtils.isNotEmpty(keyword)){\n\t\t\t\t//这个语法可以将or用括号包起来，避免数据查不到\n\t\t\t\tquery.and((wrapper) -> wrapper.like(SysUser::getUsername, keyword).or().like(SysUser::getRealname,keyword));\n\t\t\t}\n            pageList = sysUserMapper.selectPage(page, query);\n        }else{\n            // 有部门ID 需要走自定义sql\n            SysDepart sysDepart = sysDepartService.getById(departId);\n            // 代码逻辑说明: 部门排除自己------------\n            pageList = this.baseMapper.getUserInformation(page, sysDepart.getOrgCode(), keyword,sysUser.getId());\n        }\n        return pageList;\n    }\n\n\t@Override\n\tpublic IPage<SysUser> getUserInformation(Integer tenantId, String departId,String roleId, String keyword, Integer pageSize, Integer pageNo, String excludeUserIdList, String includeUsernameList) {\n\t\tIPage<SysUser> pageList = null;\n\t\t// 部门ID不存在 直接查询用户表即可\n\t\tPage<SysUser> page = new Page<>(pageNo, pageSize);\n\t\tLoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\t\n\t\tList<String> userIdList = new ArrayList<>();\n\t\tList<String> inUsernameList = new ArrayList<>();\n\t\tif(oConvertUtils.isNotEmpty(excludeUserIdList)){\n\t\t\tuserIdList = Arrays.asList(excludeUserIdList.split(SymbolConstant.COMMA));\n\t\t}\n\t\tif(oConvertUtils.isNotEmpty(includeUsernameList)){\n\t\t\tinUsernameList = Arrays.asList(includeUsernameList.split(SymbolConstant.COMMA));\n\t\t}\n\t\tif(oConvertUtils.isNotEmpty(departId)){\n\t\t\t// 有部门ID 需要走自定义sql\n\t\t\tSysDepart sysDepart = sysDepartService.getById(departId);\n\t\t\t// 代码逻辑说明: 【QQYUN-8239】用户角色，添加用户 返回2页数据，实际只显示一页---\n\t\t\tpageList = this.baseMapper.getProcessUserList(page, sysDepart.getOrgCode(), keyword, tenantId, userIdList);\n\t\t} else if (oConvertUtils.isNotEmpty(roleId)) {\n\t\t\t// 代码逻辑说明: 【QQYUN-8239】用户角色，添加用户 返回2页数据，实际只显示一页---\n\t\t\tpageList = this.sysUserMapper.selectUserListByRoleId(page, roleId, keyword, tenantId,userIdList);\n\t\t} else{\n\t\t\tLambdaQueryWrapper<SysUser> query = new LambdaQueryWrapper<>();\n\t\t\tquery.eq(SysUser::getStatus,Integer.parseInt(CommonConstant.STATUS_1));\n\t\t\tquery.ne(SysUser::getUsername,\"_reserve_user_external\");\n\t\t\tif(inUsernameList!=null && inUsernameList.size()>0){\n\t\t\t\tquery.in(SysUser::getUsername, inUsernameList);\n\t\t\t}\n\t\t\n\t\t\t// 代码逻辑说明: 【QQYUN-8239】用户角色，添加用户 返回2页数据，实际只显示一页---\n\t\t\tif(oConvertUtils.isNotEmpty(excludeUserIdList)){\n\t\t\t\tquery.notIn(SysUser::getId,Arrays.asList(excludeUserIdList.split(SymbolConstant.COMMA)));\n\t\t\t}\n\t\t\t// 支持租户隔离\n\t\t\tif (tenantId != null) {\n\t\t\t\tList<String> userIds = userTenantMapper.getUserIdsByTenantId(tenantId);\n\t\t\t\tif(oConvertUtils.listIsNotEmpty(userIds)){\n\t\t\t\t\tquery.in(SysUser::getId, userIds);\n\t\t\t\t}else{\n\t\t\t\t\tquery.eq(SysUser::getId,\"通过租户ID查不到用户\");\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif(StringUtils.isNotEmpty(keyword)){\n\t\t\t\t//这个语法可以将or用括号包起来，避免数据查不到\n\t\t\t\tquery.and((wrapper) -> wrapper.like(SysUser::getUsername, keyword).or().like(SysUser::getRealname,keyword));\n\t\t\t}\n\n\t\t\t// 【JHHB-811】添加排序\n\t\t\tquery.orderByAsc(SysUser::getSort).orderByDesc(SysUser::getCreateTime);\n\n\t\t\tpageList = sysUserMapper.selectPage(page, query);\n\t\t}\n\t\t// 批量查询用户的所属部门\n\t\t// step.1 先拿到全部的 useids\n\t\t// step.2 通过 useids，一次性查询用户的所属部门名字\n\t\tList<String> userIds = pageList.getRecords().stream().map(SysUser::getId).collect(Collectors.toList());\n\t\tif (userIds.size() > 0) {\n\t\t\tMap<String, String> useDepNames = sysUserService.getDepNamesByUserIds(userIds);\n\t\t\tpageList.getRecords().forEach(item -> item.setOrgCodeTxt(useDepNames.get(item.getId())));\n\t\t}\n\t\treturn pageList;\n\t}\n\n\t@Override\n\tpublic List<SysUser> getUsersByDepartTenantId(String departId, Integer tenantId) {\n\t\treturn baseMapper.getUsersByDepartTenantId(departId,tenantId);\n\t}\n\n\t/**\n\t * 升级SpringBoot2.6.6,不允许循环依赖\n\t * @param userIds\n\t * @return\n\t */\n\tprivate Map<String, String> getDepNamesByUserIds(List<String> userIds) {\n\t\tList<SysUserDepVo> list = sysUserMapper.getDepNamesByUserIds(userIds);\n\n\t\tMap<String, String> res = new HashMap(5);\n\t\tlist.forEach(item -> {\n\t\t\t\t\tif (res.get(item.getUserId()) == null) {\n\t\t\t\t\t\tres.put(item.getUserId(), item.getDepartName());\n\t\t\t\t\t} else {\n\t\t\t\t\t\tres.put(item.getUserId(), res.get(item.getUserId()) + \",\" + item.getDepartName());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t);\n\t\treturn res;\n\t}\n\n\n    /**\n     * 查询部门岗位下的用户\n     * @param departId\n     * @param username\n     * @param realname\n     * @param pageSize\n     * @param pageNo\n     * @param id\n     * @param isMultiTranslate\n     * @return\n     */\n    @Override\n    public IPage<SysUser> queryDepartPostUserPageList(String departId, String username, String realname, Integer pageSize, Integer pageNo, String id, String isMultiTranslate) {\n        Page<SysUser> page = new Page<SysUser>(pageNo, pageSize);\n        if (oConvertUtils.isEmpty(departId)) {\n            // 部门ID不存在 直接查询用户表即可\n            return getDepPostListByIdUserName(username,id,isMultiTranslate,page);\n        } else {\n            // 有部门ID 需要走部门岗位用户查询\n            return getDepartPostListByIdUserRealName(departId,username,realname,page);\n        }\n    }\n\n    /**\n     * 根据部门id和用户名获取部门岗位用户分页列表\n     *\n     * @param id\n     * @param username\n     * @param isMultiTranslate\n     * @param page\n     * @return\n     */\n    private IPage<SysUser> getDepPostListByIdUserName(String username, String id, String isMultiTranslate, Page<SysUser> page) {\n        //需要查询部门下的用户，故将写成自定义sql，非Lambda表达式的用法\n        List<String> userIdList = new ArrayList<>();\n        List<String> userNameList = new ArrayList<>();\n        String userId = \"\";\n        String userName = \"\";\n        if (oConvertUtils.isNotEmpty(username)) {\n            String COMMA = \",\";\n            if (oConvertUtils.isNotEmpty(isMultiTranslate) && username.contains(COMMA)) {\n                String[] usernameArr = username.split(COMMA);\n                userNameList.addAll(Arrays.asList(usernameArr));\n            } else {\n                userName = username;\n            }\n        }\n        if (oConvertUtils.isNotEmpty(id)) {\n            String COMMA = \",\";\n            if (oConvertUtils.isNotEmpty(isMultiTranslate) && id.contains(COMMA)) {\n                String[] idArr = id.split(COMMA);\n                userIdList.addAll(Arrays.asList(idArr));\n            } else {\n                userId = \"\";\n            }\n        }\n        //------------------------------------------------------------------------------------------------\n        //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n        if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n            String tenantId = oConvertUtils.getString(TenantContext.getTenant(), \"0\");\n            List<String> userIdsList = userTenantMapper.getUserIdsByTenantId(Integer.valueOf(tenantId));\n            if (null != userIdsList && !userIdsList.isEmpty()) {\n                userIdList.addAll(userIdsList);\n            }\n        }\n        //------------------------------------------------------------------------------------------------\n        return sysUserMapper.getDepPostListByIdUserName(page,userIdList,userId,userName,userNameList);\n    }\n\n    /**\n     * 根据部门id、用户名和真实姓名获取部门岗位用户分页列表\n     *\n     * @param departId\n     * @param username\n     * @param realname\n     * @param page\n     * @return\n     */\n    private IPage<SysUser> getDepartPostListByIdUserRealName(String departId, String username, String realname, Page<SysUser> page) {\n        SysDepart sysDepart = sysDepartService.getById(departId);\n        return sysUserMapper.getDepartPostListByIdUserRealName(page, username, realname, sysDepart.getOrgCode());\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserPositionServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysPosition;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.entity.SysUserPosition;\nimport org.jeecg.modules.system.mapper.SysUserMapper;\nimport org.jeecg.modules.system.mapper.SysUserPositionMapper;\nimport org.jeecg.modules.system.service.ISysUserPositionService;\nimport org.springframework.stereotype.Service;\n\nimport java.util.*;\nimport java.util.stream.Collectors;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n/**\n * @Description: 用户职位关系表\n * @Author: jeecg-boot\n * @Date: 2023-02-14\n * @Version: V1.0\n */\n@Service\npublic class SysUserPositionServiceImpl extends ServiceImpl<SysUserPositionMapper, SysUserPosition> implements ISysUserPositionService {\n\n    @Autowired\n    private SysUserPositionMapper sysUserPositionMapper;\n\n    @Autowired\n    private SysUserMapper userMapper;\n\n    @Override\n    public IPage<SysUser> getPositionUserList(Page<SysUser> page, String positionId) {\n        return page.setRecords(sysUserPositionMapper.getPositionUserList(page, positionId));\n    }\n\n    @Override\n    public void saveUserPosition(String userIds, String positionId) {\n        String[] userIdArray = userIds.split(SymbolConstant.COMMA);\n        //存在的用户\n        StringBuilder userBuilder = new StringBuilder();\n        for (String userId : userIdArray) {\n            //获取成员是否存在于职位中\n            Long count = sysUserPositionMapper.getUserPositionCount(userId, positionId);\n            if (count == 0) {\n                //插入到用户职位关系表里面\n                SysUserPosition userPosition = new SysUserPosition();\n                userPosition.setPositionId(positionId);\n                userPosition.setUserId(userId);\n                sysUserPositionMapper.insert(userPosition);\n            } else {\n                userBuilder.append(userId).append(SymbolConstant.COMMA);\n            }\n        }\n        //如果用户id存在，说明已存在用户职位关系表中,提示用户已存在\n        String uIds = userBuilder.toString();\n        if (oConvertUtils.isNotEmpty(uIds)) {\n            //查询用户列表\n            List<SysUser> sysUsers = userMapper.selectBatchIds(Arrays.asList(uIds.split(SymbolConstant.COMMA)));\n            String realnames = sysUsers.stream().map(SysUser::getRealname).collect(Collectors.joining(SymbolConstant.COMMA));\n            throw new JeecgBootException(realnames + \"已存在该职位中\");\n        }\n    }\n\n    @Override\n    public void removeByPositionId(String positionId) {\n        sysUserPositionMapper.removeByPositionId(positionId);\n    }\n\n    @Override\n    public void removePositionUser(String userIds, String positionId) {\n        String[] userIdArray = userIds.split(SymbolConstant.COMMA);\n\t\tsysUserPositionMapper.removePositionUser(Arrays.asList(userIdArray),positionId);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserRoleServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport java.util.IdentityHashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.jeecg.modules.system.entity.SysRole;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.entity.SysUserRole;\nimport org.jeecg.modules.system.mapper.SysUserRoleMapper;\nimport org.jeecg.modules.system.service.ISysRoleService;\nimport org.jeecg.modules.system.service.ISysUserRoleService;\nimport org.jeecg.modules.system.service.ISysUserService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\n\n/**\n * <p>\n * 用户角色表 服务实现类\n * </p>\n *\n * @Author scott\n * @since 2018-12-21\n */\n@Service\npublic class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUserRole> implements ISysUserRoleService {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport cn.hutool.core.util.RandomUtil;\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.aliyuncs.exceptions.ClientException;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;\nimport com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.CollectionUtils;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.apache.commons.lang3.ObjectUtils;\nimport org.apache.shiro.SecurityUtils;\nimport org.apache.shiro.UnavailableSecurityManagerException;\nimport org.jeecg.common.api.dto.message.MessageDTO;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CacheConstant;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.FillRuleConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.constant.PasswordConstant;\nimport org.jeecg.common.constant.enums.*;\nimport org.jeecg.common.desensitization.annotation.SensitiveEncode;\nimport org.jeecg.common.exception.JeecgBootBizTipException;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.system.vo.SysUserCacheInfo;\nimport org.jeecg.common.util.*;\nimport org.jeecg.common.util.encryption.AesEncryptUtil;\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.modules.base.service.BaseCommonService;\nimport org.jeecg.modules.message.handle.impl.SystemSendMsgHandle;\nimport org.jeecg.modules.system.entity.*;\nimport org.jeecg.modules.system.mapper.*;\nimport org.jeecg.modules.system.model.SysLoginModel;\nimport org.jeecg.modules.system.model.SysUserSysDepPostModel;\nimport org.jeecg.modules.system.model.SysUserSysDepartModel;\nimport org.jeecg.modules.system.service.*;\nimport org.jeecg.modules.system.util.ImportSysUserCache;\nimport org.jeecg.modules.system.vo.*;\nimport org.jeecg.modules.system.vo.lowapp.AppExportUserVo;\nimport org.jeecg.modules.system.vo.lowapp.DepartAndUserInfo;\nimport org.jeecg.modules.system.vo.lowapp.DepartInfo;\nimport org.jeecg.modules.system.vo.lowapp.UpdateDepartInfo;\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.jetbrains.annotations.Nullable;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.NoSuchBeanDefinitionException;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.cache.annotation.CacheEvict;\nimport org.springframework.cache.annotation.Cacheable;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.io.IOException;\nimport java.util.*;\nimport java.util.stream.Collectors;\n\n/**\n * <p>\n * 用户表 服务实现类\n * </p>\n *\n * @Author: scott\n * @Date: 2018-12-20\n */\n@Service\n@Slf4j\npublic class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService {\n\t\n\t@Autowired\n\tprivate SysUserMapper userMapper;\n\t@Autowired\n\tprivate SysPermissionMapper sysPermissionMapper;\n\t@Autowired\n\tprivate SysUserRoleMapper sysUserRoleMapper;\n\t@Autowired\n\tprivate SysUserDepartMapper sysUserDepartMapper;\n\t@Autowired\n\tprivate SysDepartMapper sysDepartMapper;\n\t@Autowired\n\tprivate SysRoleMapper sysRoleMapper;\n\t@Autowired\n\tprivate SysDepartRoleUserMapper departRoleUserMapper;\n\t@Autowired\n\tprivate SysDepartRoleMapper sysDepartRoleMapper;\n\t@Resource\n\tprivate BaseCommonService baseCommonService;\n\t@Autowired\n\tprivate SysThirdAccountMapper sysThirdAccountMapper;\n\t@Autowired\n\tThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService;\n\t@Autowired\n\tThirdAppDingtalkServiceImpl dingtalkService;\n\t@Autowired\n\tISysRoleIndexService sysRoleIndexService;\n\t@Autowired\n\tSysTenantMapper sysTenantMapper;\n\t@Autowired\n    private SysUserTenantMapper relationMapper;\n\t@Autowired\n    private SysUserTenantMapper userTenantMapper;\n\t@Autowired\n\tprivate SysUserPositionMapper sysUserPositionMapper;\n\t@Autowired\n\tprivate SysPositionMapper sysPositionMapper;\n\t@Autowired\n\tprivate SystemSendMsgHandle systemSendMsgHandle;\n\t\n\t@Autowired\n\tprivate ISysThirdAccountService sysThirdAccountService;\n\t@Autowired\n\tprivate RedisUtil redisUtil;\n    \n    @Autowired\n    private SysTenantPackUserMapper packUserMapper;\n    \n    @Autowired\n    private SysUserDepPostMapper depPostMapper;\n\n\t@Autowired\n\tprivate JeecgBaseConfig jeecgBaseConfig;\n\n\t/**\n\t * 管理员账号\n\t */\n\tpublic static final String[] ADMIN_ACCOUNT = new String[]{\"admin\"};\n\n\t@Override\n\tpublic Result<IPage<SysUser>> queryPageList(HttpServletRequest req, QueryWrapper<SysUser> queryWrapper, Integer pageSize, Integer pageNo) {\n\t\tResult<IPage<SysUser>> result = new Result<IPage<SysUser>>();\n\t\t//部门ID\n\t\tString departId = req.getParameter(\"departId\");\n\t\tif (oConvertUtils.isNotEmpty(departId)) {\n            //代码逻辑说明:【JHHB-762】用户管理需要支持按组织架构查询用户（支持多选）---\n            //兼容多个部门id\n            LambdaQueryWrapper<SysUserDepart> query = new LambdaQueryWrapper<>();\n            if(departId.contains(SymbolConstant.COMMA)) {\n                query.in(SysUserDepart::getDepId, Arrays.asList(departId.split(SymbolConstant.COMMA)));\n            } else {\n                query.eq(SysUserDepart::getDepId, departId);\n            }\n            List<SysUserDepart> list = sysUserDepartMapper.selectList(query);\n\t\t\tList<String> userIds = list.stream().map(SysUserDepart::getUserId).collect(Collectors.toList());\n\t\t\t// 代码逻辑说明: [issues/I4XTYB]查询用户时，当部门id 下没有分配用户时接口报错------------\n\t\t\tif (oConvertUtils.listIsNotEmpty(userIds)) {\n\t\t\t\tqueryWrapper.in(\"id\", userIds);\n\t\t\t} else {\n\t\t\t\treturn Result.OK();\n\t\t\t}\n\t\t}\n\t\t//用户ID\n\t\tString code = req.getParameter(\"code\");\n\t\tif (oConvertUtils.isNotEmpty(code)) {\n\t\t\tqueryWrapper.in(\"id\", Arrays.asList(code.split(\",\")));\n\t\t\tpageSize = code.split(\",\").length;\n\t\t}\n\n\t\t// 代码逻辑说明: JTC-372 【用户冻结问题】 online授权、用户组件，选择用户都能看到被冻结的用户\n\t\tString status = req.getParameter(\"status\");\n\t\tif (oConvertUtils.isNotEmpty(status)) {\n\t\t\tqueryWrapper.eq(\"status\", Integer.parseInt(status));\n\t\t}\n\n\t\t// 代码逻辑说明: 【QQYUN-8110】在线通讯录支持设置权限(只能看分配的技术支持)---\n\t\tString tenantId = TokenUtils.getTenantIdByRequest(req);\n\t\tString lowAppId = TokenUtils.getLowAppIdByRequest(req);\n//\t\tObject bean = ResourceUtil.getImplementationClass(DataEnhanceEnum.getClassPath(tenantId,lowAppId));\n//\t\tif(null != bean){\n//\t\t\tUserFilterEnhance userEnhanceService = (UserFilterEnhance) bean;\n//\t\t\tLoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n//\t\t\tList<String> userIds = userEnhanceService.getUserIds(sysUser.getId());\n//\t\t\tif(CollectionUtil.isNotEmpty(userIds)){\n//\t\t\t\tqueryWrapper.in(\"id\", userIds);\n//\t\t\t}\n//\t\t}\n\t\t\n\t\t//TODO 外部模拟登陆临时账号，列表不显示\n\t\tqueryWrapper.ne(\"username\", \"_reserve_user_external\");\n        // 代码逻辑说明: 【JHHB-765】需要能设置排序---\n        queryWrapper.orderByAsc(\"sort\");\n        queryWrapper.orderByDesc(\"create_time\");\n\t\tPage<SysUser> page = new Page<SysUser>(pageNo, pageSize);\n\t\tIPage<SysUser> pageList = this.page(page, queryWrapper);\n\n\t\t//批量查询用户的所属部门\n\t\t//step.1 先拿到全部的 useids\n\t\t//step.2 通过 useids，一次性查询用户的所属部门名字\n\t\tList<String> userIds = pageList.getRecords().stream().map(SysUser::getId).collect(Collectors.toList());\n\t\tif (userIds != null && userIds.size() > 0) {\n\t\t\tMap<String, String> useDepNames = this.getDepNamesByUserIds(userIds);\n\t\t\tpageList.getRecords().forEach(item -> {\n\t\t\t\titem.setOrgCodeTxt(useDepNames.get(item.getId()));\n\t\t\t\t//增加所属部门id,前台需要展示\n                List<String> departs = sysDepartMapper.queryDepartsByUserId(item.getId());\n                if(oConvertUtils.isNotEmpty(departs)){\n                    item.setBelongDepIds(String.join(SymbolConstant.COMMA, departs));\n                }\n\t\t\t\t//查询用户的租户ids\n\t\t\t\tList<Integer> list = userTenantMapper.getTenantIdsByUserId(item.getId());\n\t\t\t\tif (oConvertUtils.isNotEmpty(list)) {\n\t\t\t\t\titem.setRelTenantIds(StringUtils.join(list.toArray(), SymbolConstant.COMMA));\n\t\t\t\t} else {\n\t\t\t\t\titem.setRelTenantIds(\"\");\n\t\t\t\t}\n\t\t\t\tInteger posTenantId = null;\n\t\t\t\tif (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n\t\t\t\t\tposTenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);;\t\t\n\t\t\t\t}\n\t\t\t\t//查询用户职位关系表(获取租户下面的)\n\t\t\t\t// 代码逻辑说明: 【QQYUN-7028】用户职务保存后未回显---\n\t\t\t\tList<String> positionList =  sysUserPositionMapper.getPositionIdByUserTenantId(item.getId(),posTenantId);\n\t\t\t\titem.setPost(CommonUtils.getSplitText(positionList,SymbolConstant.COMMA));\n\t\t\t\t\n\t\t\t\t//是否根据租户隔离(敲敲云用户列表专用，用于展示是否同步钉钉)\n\t\t\t\tif (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n\t\t\t\t\t//查询账号表是否已同步钉钉\n\t\t\t\t\tLambdaQueryWrapper<SysThirdAccount> query = new LambdaQueryWrapper<>();\n\t\t\t\t\tquery.eq(SysThirdAccount::getSysUserId,item.getId());\n\t\t\t\t\tquery.eq(SysThirdAccount::getTenantId, tenantId);\n\t\t\t\t\t//目前只有同步钉钉\n\t\t\t\t\tquery.eq(SysThirdAccount::getThirdType, MessageTypeEnum.DD.getType());\n\t\t\t\t\t//不为空代表已同步钉钉\n\t\t\t\t\tList<SysThirdAccount> account = sysThirdAccountService.list(query);\n\t\t\t\t\tif(CollectionUtil.isNotEmpty(account)){\n\t\t\t\t\t\titem.setIzBindThird(true);\n\t\t\t\t\t}\n\t\t\t\t}\n                //查询部门的兼职岗位\n                List<String> depPostList = depPostMapper.getDepPostByUserId(item.getId());\n                if(CollectionUtil.isNotEmpty(depPostList)){\n                    item.setOtherDepPostId(StringUtils.join(depPostList.toArray(), SymbolConstant.COMMA));\n                }\n            });\n\t\t}\n\n\t\tresult.setSuccess(true);\n\t\tresult.setResult(pageList);\n\t\t//log.info(pageList.toString());\n\t\treturn result;\n\t}\n\n\n    @Override\n    @CacheEvict(value = {CacheConstant.SYS_USERS_CACHE}, allEntries = true)\n    public Result<?> resetPassword(String username, String oldpassword, String newpassword, String confirmpassword) {\n        SysUser user = userMapper.getUserByName(username);\n        String passwordEncode = PasswordUtil.encrypt(username, oldpassword, user.getSalt());\n        if (!user.getPassword().equals(passwordEncode)) {\n            return Result.error(\"旧密码输入错误!\");\n        }\n        if (oConvertUtils.isEmpty(newpassword)) {\n            return Result.error(\"新密码不允许为空!\");\n        }\n        if (!newpassword.equals(confirmpassword)) {\n            return Result.error(\"两次输入密码不一致!\");\n        }\n        String password = PasswordUtil.encrypt(username, newpassword, user.getSalt());\n        this.userMapper.update(new SysUser().setPassword(password), new LambdaQueryWrapper<SysUser>().eq(SysUser::getId, user.getId()));\n        return Result.ok(\"密码重置成功!\");\n    }\n\n    @Override\n    @CacheEvict(value = {CacheConstant.SYS_USERS_CACHE}, allEntries = true)\n    public Result<?> changePassword(SysUser sysUser) {\n        String salt = oConvertUtils.randomGen(8);\n        sysUser.setSalt(salt);\n        String password = sysUser.getPassword();\n        String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt);\n        sysUser.setPassword(passwordEncode);\n        sysUser.setLastPwdUpdateTime(new Date());\n        this.userMapper.updateById(sysUser);\n        return Result.ok(\"密码修改成功!\");\n    }\n\n    @Override\n    @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic boolean deleteUser(String userId) {\n\t\t//1.验证当前用户是管理员账号 admin\n\t\t//验证用户是否为管理员\n\t\tthis.checkUserAdminRejectDel(userId);\n\t\t\n\t\t//2.删除用户\n\t\tthis.removeById(userId);\n\t\treturn false;\n\t}\n\n\t@Override\n    @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic boolean deleteBatchUsers(String userIds) {\n\t\t//1.验证当前用户是管理员账号 admin\n\t\tthis.checkUserAdminRejectDel(userIds);\n\t\t//2.删除用户\n\t\tthis.removeByIds(Arrays.asList(userIds.split(\",\")));\n\t\treturn false;\n\t}\n\n\t@Override\n\tpublic SysUser getUserByName(String username) {\n\t\tSysUser sysUser = userMapper.getUserByName(username);\n\t\t//查询用户的租户ids\n\t\tif(sysUser!=null){\n\t\t\tList<Integer> list = userTenantMapper.getTenantIdsByUserId(sysUser.getId());\n\t\t\tif (oConvertUtils.isNotEmpty(list)) {\n\t\t\t\tsysUser.setRelTenantIds(StringUtils.join(list.toArray(), SymbolConstant.COMMA));\n\t\t\t} else {\n\t\t\t\tsysUser.setRelTenantIds(\"\");\n\t\t\t}\n\t\t}\n\t\treturn sysUser;\n\t}\n\t\n\t\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void addUserWithRole(SysUser user, String roles) {\n\t\tthis.save(user);\n\t\tif(oConvertUtils.isNotEmpty(roles)) {\n\t\t\tString[] arr = roles.split(\",\");\n\t\t\tfor (String roleId : arr) {\n\t\t\t\tSysUserRole userRole = new SysUserRole(user.getId(), roleId);\n\t\t\t\tsysUserRoleMapper.insert(userRole);\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\t@CacheEvict(value= {CacheConstant.SYS_USERS_CACHE}, allEntries=true)\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void editUserWithRole(SysUser user, String roles) {\n\t\tthis.updateById(user);\n\t\t//先删后加\n\t\tsysUserRoleMapper.delete(new QueryWrapper<SysUserRole>().lambda().eq(SysUserRole::getUserId, user.getId()));\n\t\tif(oConvertUtils.isNotEmpty(roles)) {\n\t\t\tString[] arr = roles.split(\",\");\n\t\t\tfor (String roleId : arr) {\n\t\t\t\tSysUserRole userRole = new SysUserRole(user.getId(), roleId);\n\t\t\t\tsysUserRoleMapper.insert(userRole);\n\t\t\t}\n\t\t}\n\t}\n\n\n\t@Override\n\tpublic List<String> getRole(String username) {\n\t\treturn sysUserRoleMapper.getRoleByUserName(username);\n\t}\n\n\t/**\n\t * 获取动态首页路由配置\n\t *\n\t * @param username\n\t * @param version\n\t * @return\n\t */\n\t@Override\n\tpublic SysRoleIndex getDynamicIndexByUserRole(String username, String version) {\n\t\tSysRoleIndex roleIndex = new SysRoleIndex();\n\t\t//只有 X-Version=v3 的时候，才读取sys_role_index表获取角色首页配置\n\t\tboolean isV3 = CommonConstant.VERSION_V3.equals(version);\n\t\tif (isV3) {\n\t\t\t//1.先查询 用户USER级别 的所有首页配置\n\t\t\tif(oConvertUtils.isNotEmpty(username)){\n\t\t\t\tLambdaQueryWrapper<SysRoleIndex> routeIndexUserQuery = new LambdaQueryWrapper<>();\n\t\t\t\t//角色首页状态0：未开启  1：开启\n\t\t\t\trouteIndexUserQuery.eq(SysRoleIndex::getStatus, CommonConstant.STATUS_1);\n\t\t\t\trouteIndexUserQuery.eq(SysRoleIndex::getRelationType, CommonConstant.HOME_RELATION_USER);\n\t\t\t\trouteIndexUserQuery.eq(SysRoleIndex::getRoleCode, username);\n\t\t\t\t//优先级正序排序\n\t\t\t\trouteIndexUserQuery.orderByAsc(SysRoleIndex::getPriority);\n\t\t\t\tList<SysRoleIndex> list = sysRoleIndexService.list(routeIndexUserQuery);\n\t\t\t\tif (CollectionUtils.isNotEmpty(list)) {\n\t\t\t\t\troleIndex = list.get(0);\n\t\t\t\t}else{\n\t\t\t\t   //2.用户没有配置，再查询 角色ROLE级别 的所有首页配置\n\t\t\t\t\tLambdaQueryWrapper<SysRoleIndex> routeIndexQuery = new LambdaQueryWrapper<>();\n\t\t\t\t\t//角色首页状态0：未开启  1：开启\n\t\t\t\t\trouteIndexQuery.eq(SysRoleIndex::getStatus, CommonConstant.STATUS_1);\n\t\t\t\t\t//角色所有首页配置\n\t\t\t\t\trouteIndexQuery.eq(SysRoleIndex::getRelationType, CommonConstant.HOME_RELATION_ROLE);\n\t\t\t\t\t//当前用户角色\n\t\t\t\t\tList<String> roles = sysUserRoleMapper.getRoleByUserName(username);\n\t\t\t\t\tString componentUrl = RoleIndexConfigEnum.getIndexByRoles(roles);\n\t\t\t\t\troleIndex = new SysRoleIndex(componentUrl);\n\t\t\t\t\t//用户所有角色\n\t\t\t\t\t// 代码逻辑说明: [QQYUN-13187]【新用户登录报错】没有添加角色时 报错\n\t\t\t\t\tif(CollectionUtil.isNotEmpty(roles)){\n\t\t\t\t\t\trouteIndexQuery.in(SysRoleIndex::getRoleCode, roles);\n\t\t\t\t\t}\n\t\t\t\t\t//优先级正序排序\n\t\t\t\t\trouteIndexQuery.orderByAsc(SysRoleIndex::getPriority);\n\t\t\t\t\tlist = sysRoleIndexService.list(routeIndexQuery);\n\t\t\t\t\tif (CollectionUtils.isNotEmpty(list)) {\n\t\t\t\t\t\troleIndex = list.get(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (oConvertUtils.isEmpty(roleIndex.getComponent())) {\n\t\t\tif (isV3) {\n\t\t\t\t// 如果角色没有配置首页，则使用默认首页\n\t\t\t\treturn sysRoleIndexService.queryDefaultIndex();\n\t\t\t} else {\n\t\t\t\t// 非v3返回null\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\treturn roleIndex;\n\t}\n\n\t/**\n\t * 通过用户名获取用户角色集合\n\t * @param username 用户名\n     * @return 角色集合\n\t */\n\t@Override\n\tpublic Set<String> getUserRolesSet(String username) {\n\t\t// 查询用户拥有的角色集合\n\t\tList<String> roles = sysUserRoleMapper.getRoleByUserName(username);\n\t\tlog.info(\"-------通过数据库读取用户拥有的角色Rules------username： \" + username + \",Roles size: \" + (roles == null ? 0 : roles.size()));\n\t\treturn new HashSet<>(roles);\n\t}\n\t\n\t/**\n\t * 通过用户名获取用户角色集合\n\t * @param userId 用户ID\n     * @return 角色集合\n\t */\n\t@Override\n\tpublic Set<String> getUserRoleSetById(String userId) {\n\t\t// 查询用户拥有的角色集合\n\t\tList<String> roles = sysUserRoleMapper.getRoleCodeByUserId(userId);\n\t\tlog.info(\"-------通过数据库读取用户拥有的角色Rules------userId： \" + userId + \",Roles size: \" + (roles == null ? 0 : roles.size()));\n\t\treturn new HashSet<>(roles);\n\t}\n\n\t/**\n\t * 通过用户名获取用户权限集合\n\t *\n\t * @param userId 用户ID\n\t * @return 权限集合\n\t */\n\t@Override\n\tpublic Set<String> getUserPermissionsSet(String userId) {\n\t\tSet<String> permissionSet = new HashSet<>();\n\t\tList<SysPermission> permissionList = sysPermissionMapper.queryByUser(userId);\n\t\t//================= begin 开启租户的时候 如果没有test角色，默认加入test角色================\n\t\tif (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n\t\t\tif (permissionList == null) {\n\t\t\t\tpermissionList = new ArrayList<>();\n\t\t\t}\n\t\t\tList<SysPermission> testRoleList = sysPermissionMapper.queryPermissionByTestRoleId();\n\t\t\tpermissionList.addAll(testRoleList);\n\t\t}\n\t\t//================= end 开启租户的时候 如果没有test角色，默认加入test角色================\n\t\tfor (SysPermission po : permissionList) {\n//\t\t\t// TODO URL规则有问题？\n//\t\t\tif (oConvertUtils.isNotEmpty(po.getUrl())) {\n//\t\t\t\tpermissionSet.add(po.getUrl());\n//\t\t\t}\n\t\t\tif (oConvertUtils.isNotEmpty(po.getPerms())) {\n\t\t\t\tpermissionSet.add(po.getPerms());\n\t\t\t}\n\t\t}\n\t\tlog.info(\"-------通过数据库读取用户拥有的权限Perms------userId： \"+ userId+\",Perms size: \"+ (permissionSet==null?0:permissionSet.size()) );\n\t\treturn permissionSet;\n\t}\n\n\t/**\n\t * 升级SpringBoot2.6.6,不允许循环依赖\n\t * @author:qinfeng\n\t * @update: 2022-04-07\n\t * @param username\n\t * @return\n\t */\n\t@Override\n\tpublic SysUserCacheInfo getCacheUser(String username) {\n\t\tSysUserCacheInfo info = new SysUserCacheInfo();\n\t\tinfo.setOneDepart(true);\n\t\tif(oConvertUtils.isEmpty(username)) {\n\t\t\treturn null;\n\t\t}\n\n\t\t//查询用户信息\n\t\tSysUser sysUser = userMapper.getUserByName(username);\n\t\tif(sysUser!=null) {\n\t\t\tinfo.setSysUserCode(sysUser.getUsername());\n\t\t\tinfo.setSysUserName(sysUser.getRealname());\n\t\t\tinfo.setSysOrgCode(sysUser.getOrgCode());\n\t\t}\n\t\t\n\t\t//多部门支持in查询\n\t\tList<SysDepart> list = sysDepartMapper.queryUserDeparts(sysUser.getId());\n\t\tList<String> sysMultiOrgCode = new ArrayList<String>();\n\t\tif(list==null || list.size()==0) {\n\t\t\t//当前用户无部门\n\t\t\t//sysMultiOrgCode.add(\"0\");\n\t\t}else if(list.size()==1) {\n\t\t\tsysMultiOrgCode.add(list.get(0).getOrgCode());\n\t\t}else {\n\t\t\tinfo.setOneDepart(false);\n\t\t\tfor (SysDepart dpt : list) {\n\t\t\t\tsysMultiOrgCode.add(dpt.getOrgCode());\n\t\t\t}\n\t\t}\n\t\tinfo.setSysMultiOrgCode(sysMultiOrgCode);\n\t\t\n\t\treturn info;\n\t}\n\n    /**\n     * 根据部门Id查询\n     * @param page\n     * @param departId 部门id\n     * @param username 用户账户名称\n     * @return\n     */\n\t@Override\n\tpublic IPage<SysUser> getUserByDepId(Page<SysUser> page, String departId,String username) {\n\t\treturn userMapper.getUserByDepId(page, departId,username);\n\t}\n\n\t@Override\n\tpublic IPage<SysUser> getUserByDepIds(Page<SysUser> page, List<String> departIds, String username) {\n\t\treturn userMapper.getUserByDepIds(page, departIds,username);\n\t}\n\n\t@Override\n\tpublic Map<String, String> getDepNamesByUserIds(List<String> userIds) {\n\t\tList<SysUserDepVo> list = this.baseMapper.getDepNamesByUserIds(userIds);\n\n\t\tMap<String, String> res = new HashMap(5);\n\t\tlist.forEach(item -> {\n\t\t\t\t\tif (res.get(item.getUserId()) == null) {\n\t\t\t\t\t\tres.put(item.getUserId(), item.getDepartName());\n\t\t\t\t\t} else {\n\t\t\t\t\t\tres.put(item.getUserId(), res.get(item.getUserId()) + \",\" + item.getDepartName());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t);\n\t\treturn res;\n\t}\n\n/*\t@Override\n\tpublic IPage<SysUser> getUserByDepartIdAndQueryWrapper(Page<SysUser> page, String departId, QueryWrapper<SysUser> queryWrapper) {\n\t\tLambdaQueryWrapper<SysUser> lambdaQueryWrapper = queryWrapper.lambda();\n\n\t\tlambdaQueryWrapper.eq(SysUser::getDelFlag, CommonConstant.DEL_FLAG_0);\n        lambdaQueryWrapper.inSql(SysUser::getId, \"SELECT user_id FROM sys_user_depart WHERE dep_id = '\" + departId + \"'\");\n\n        return userMapper.selectPage(page, lambdaQueryWrapper);\n\t}*/\n\n\t@Override\n\tpublic IPage<SysUserSysDepartModel> queryUserByOrgCode(String orgCode, SysUser userParams, IPage page) {\n\t\tList<SysUserSysDepartModel> list = baseMapper.getUserByOrgCode(page, orgCode, userParams);\n\t\t//根据部门orgCode查询部门，需要将职位id进行传递\n\t\tfor (SysUserSysDepartModel model:list) {\n\t\t\tList<String> positionList = sysUserPositionMapper.getPositionIdByUserId(model.getId());\n\t\t\tmodel.setPost(CommonUtils.getSplitText(positionList,SymbolConstant.COMMA));\n\t\t}\n\t\tInteger total = baseMapper.getUserByOrgCodeTotal(orgCode, userParams);\n\n\t\tIPage<SysUserSysDepartModel> result = new Page<>(page.getCurrent(), page.getSize(), total);\n\t\tresult.setRecords(list);\n\n\t\treturn result;\n\t}\n\n    /**\n     * 根据角色Id查询\n     * @param page\n     * @param roleId 角色id\n     * @param username 用户账户名称\n     * @param realname 用户姓名\n     * @return\n     */\n\t@Override\n\tpublic IPage<SysUser> getUserByRoleId(Page<SysUser> page, String roleId, String username, String realname) {\n\t\t// 代码逻辑说明: [QQYUN-3980]组织管理中 职位功能 职位表加租户id 加职位-用户关联表------------\n\t\tIPage<SysUser> userRoleList = userMapper.getUserByRoleId(page, roleId, username,realname);\n\t\tList<SysUser> records = userRoleList.getRecords();\n\t\tif (null != records && records.size() > 0) {\n\t\t\tList<String> userIds = records.stream().map(SysUser::getId).collect(Collectors.toList());\n\t\t\tMap<String, String> useDepNames = this.getDepNamesByUserIds(userIds);\n\t\t\tfor (SysUser sysUser : userRoleList.getRecords()) {\n\t\t\t\t//设置部门\n\t\t\t\tsysUser.setOrgCodeTxt(useDepNames.get(sysUser.getId()));\n\t\t\t\t//设置用户职位id\n\t\t\t\tthis.userPositionId(sysUser);\n\t\t\t}\n\t\t}\n\t\treturn userRoleList;\n\t}\n\n\n\t@Override\n\t@CacheEvict(value= {CacheConstant.SYS_USERS_CACHE}, key=\"#username\")\n\tpublic void updateUserDepart(String username,String orgCode,Integer loginTenantId) {\n\t\tbaseMapper.updateUserDepart(username, orgCode,loginTenantId);\n\t}\n\n\n\t@Override\n\tpublic SysUser getUserByPhone(String phone) {\n\t\treturn userMapper.getUserByPhone(phone);\n\t}\n\n\n\t@Override\n\tpublic SysUser getUserByEmail(String email) {\n\t\treturn userMapper.getUserByEmail(email);\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void addUserWithDepart(SysUser user, String selectedParts) {\n//\t\tthis.save(user);  //保存角色的时候已经添加过一次了\n\t\tif(oConvertUtils.isNotEmpty(selectedParts)) {\n\t\t\tString[] arr = selectedParts.split(\",\");\n\t\t\tfor (String deaprtId : arr) {\n\t\t\t\tSysUserDepart userDeaprt = new SysUserDepart(user.getId(), deaprtId);\n\t\t\t\tsysUserDepartMapper.insert(userDeaprt);\n\t\t\t}\n\t\t}\n\t}\n\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\t@CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)\n\tpublic void editUserWithDepart(SysUser user, String departs) {\n        //更新角色的时候已经更新了一次了，可以再跟新一次\n\t\tthis.updateById(user);\n\t\tString[] arr = {};\n\t\tif(oConvertUtils.isNotEmpty(departs)){\n\t\t\tarr = departs.split(\",\");\n\t\t}\n\t\t//查询已关联部门\n\t\tList<SysUserDepart> userDepartList = sysUserDepartMapper.selectList(new QueryWrapper<SysUserDepart>().lambda().eq(SysUserDepart::getUserId, user.getId()));\n\t\tif(userDepartList != null && userDepartList.size()>0){\n\t\t\tfor(SysUserDepart depart : userDepartList ){\n\t\t\t\t//修改已关联部门删除部门用户角色关系\n\t\t\t\tif(!Arrays.asList(arr).contains(depart.getDepId())){\n\t\t\t\t\tList<SysDepartRole> sysDepartRoleList = sysDepartRoleMapper.selectList(\n\t\t\t\t\t\t\tnew QueryWrapper<SysDepartRole>().lambda().eq(SysDepartRole::getDepartId,depart.getDepId()));\n\t\t\t\t\tList<String> roleIds = sysDepartRoleList.stream().map(SysDepartRole::getId).collect(Collectors.toList());\n\t\t\t\t\tif(roleIds != null && roleIds.size()>0){\n\t\t\t\t\t\tdepartRoleUserMapper.delete(new QueryWrapper<SysDepartRoleUser>().lambda().eq(SysDepartRoleUser::getUserId, user.getId())\n\t\t\t\t\t\t\t\t.in(SysDepartRoleUser::getDroleId,roleIds));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t//先删后加\n\t\tsysUserDepartMapper.delete(new QueryWrapper<SysUserDepart>().lambda().eq(SysUserDepart::getUserId, user.getId()));\n\t\tif(oConvertUtils.isNotEmpty(departs)) {\n\t\t\tfor (String departId : arr) {\n\t\t\t\tSysUserDepart userDepart = new SysUserDepart(user.getId(), departId);\n\t\t\t\tsysUserDepartMapper.insert(userDepart);\n\t\t\t}\n\t\t}\n\t}\n\n\n\t/**\n\t   * 校验用户是否有效\n\t * @param sysUser\n\t * @return\n\t */\n\t@Override\n\tpublic Result<?> checkUserIsEffective(SysUser sysUser) {\n\t\tResult<?> result = new Result<Object>();\n\t\t//情况1：根据用户信息查询，该用户不存在\n\t\tif (sysUser == null) {\n\t\t\tresult.error500(\"该用户不存在，请注册\");\n\t\t\tbaseCommonService.addLog(\"用户登录失败，用户不存在！\", CommonConstant.LOG_TYPE_1, null);\n\t\t\treturn result;\n\t\t}\n\t\t//情况2：根据用户信息查询，该用户已注销\n\t\t// 代码逻辑说明: if条件永远为falsebug------------\n\t\tif (CommonConstant.DEL_FLAG_1.equals(sysUser.getDelFlag())) {\n\t\t\tbaseCommonService.addLog(\"用户登录失败，用户名:\" + sysUser.getUsername() + \"已注销！\", CommonConstant.LOG_TYPE_1, null);\n\t\t\tresult.error500(\"该用户已注销\");\n\t\t\treturn result;\n\t\t}\n\t\t//情况3：根据用户信息查询，该用户已冻结\n\t\tif (CommonConstant.USER_FREEZE.equals(sysUser.getStatus())) {\n\t\t\tbaseCommonService.addLog(\"用户登录失败，用户名:\" + sysUser.getUsername() + \"已冻结！\", CommonConstant.LOG_TYPE_1, null);\n\t\t\tresult.error500(\"该用户已冻结\");\n\t\t\treturn result;\n\t\t}\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic List<SysUser> queryLogicDeleted() {\n        // 代码逻辑说明: 回收站查询未离职的------------\n        LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();\n        wrapper.ne(SysUser::getStatus, CommonConstant.USER_QUIT);\n        return this.queryLogicDeleted(wrapper);\n    }\n\n\t@Override\n\tpublic List<SysUser> queryLogicDeleted(LambdaQueryWrapper<SysUser> wrapper) {\n\t\tif (wrapper == null) {\n\t\t\twrapper = new LambdaQueryWrapper<>();\n\t\t}\n\t\twrapper.eq(SysUser::getDelFlag, CommonConstant.DEL_FLAG_1);\n\t\treturn userMapper.selectLogicDeleted(wrapper);\n\t}\n\n\t@Override\n\t@CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)\n\tpublic boolean revertLogicDeleted(List<String> userIds, SysUser updateEntity) {\n\t\treturn userMapper.revertLogicDeleted(userIds, updateEntity) > 0;\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic boolean removeLogicDeleted(List<String> userIds) {\n\t\t// 1. 删除用户\n\t\tint line = userMapper.deleteLogicDeleted(userIds);\n\t\t// 2. 删除用户部门关系\n\t\tline += sysUserDepartMapper.delete(new LambdaQueryWrapper<SysUserDepart>().in(SysUserDepart::getUserId, userIds));\n\t\t//3. 删除用户角色关系\n\t\tline += sysUserRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>().in(SysUserRole::getUserId, userIds));\n\t\t//4.同步删除第三方App的用户\n\t\ttry {\n\t\t\tdingtalkService.removeThirdAppUser(userIds);\n\t\t\twechatEnterpriseService.removeThirdAppUser(userIds);\n\t\t} catch (Exception e) {\n\t\t\tlog.error(\"同步删除第三方App的用户失败：\", e);\n\t\t}\n\t\t//5. 删除第三方用户表（因为第4步需要用到第三方用户表，所以在他之后删）\n\t\tline += sysThirdAccountMapper.delete(new LambdaQueryWrapper<SysThirdAccount>().in(SysThirdAccount::getSysUserId, userIds));\n\n\t\t//6. 删除租户用户中间表的数据\n\t\tline += userTenantMapper.delete(new LambdaQueryWrapper<SysUserTenant>().in(SysUserTenant::getUserId,userIds));\n\t\t\n\t\treturn line != 0;\n\t}\n\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    public boolean updateNullPhoneEmail() {\n        userMapper.updateNullByEmptyString(\"email\");\n        userMapper.updateNullByEmptyString(\"phone\");\n        return true;\n    }\n\n\t@Override\n\tpublic void saveThirdUser(SysUser sysUser) {\n\t\t//保存用户\n\t\tString userid = UUIDGenerator.generate();\n\t\tsysUser.setId(userid);\n\t\tbaseMapper.insert(sysUser);\n\t\t//获取第三方角色\n\t\tSysRole sysRole = sysRoleMapper.selectOne(new LambdaQueryWrapper<SysRole>().eq(SysRole::getRoleCode, \"third_role\"));\n\t\t//保存用户角色\n\t\tSysUserRole userRole = new SysUserRole();\n\t\tuserRole.setRoleId(sysRole.getId());\n\t\tuserRole.setUserId(userid);\n\t\tsysUserRoleMapper.insert(userRole);\n\t}\n\n\t@Override\n\tpublic List<SysUser> queryByDepIds(List<String> departIds, String username) {\n\t\treturn userMapper.queryByDepIds(departIds,username);\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void saveUser(SysUser user, String selectedRoles, String selectedDeparts, String relTenantIds, boolean izSyncPack) {\n        if(null == user.getSort()){\n            user.setSort(CommonConstant.DEFAULT_USER_SORT);\n        }\n        //step.1 保存用户\n\t\tthis.save(user);\n\t\t//获取用户保存前台传过来的租户id并添加到租户\n        this.saveUserTenant(user.getId(),relTenantIds, izSyncPack);\n\t\t//step.2 保存角色\n\t\tif(oConvertUtils.isNotEmpty(selectedRoles)) {\n\t\t\tString[] arr = selectedRoles.split(\",\");\n\t\t\tfor (String roleId : arr) {\n\t\t\t\tSysUserRole userRole = new SysUserRole(user.getId(), roleId);\n\t\t\t\tsysUserRoleMapper.insert(userRole);\n\t\t\t}\n\t\t}\n\t\t\n\t\t//step.3 保存所属部门\n\t\tif(oConvertUtils.isNotEmpty(selectedDeparts)) {\n\t\t\tString[] arr = selectedDeparts.split(\",\");\n\t\t\tfor (String deaprtId : arr) {\n\t\t\t\tSysUserDepart userDeaprt = new SysUserDepart(user.getId(), deaprtId);\n\t\t\t\tsysUserDepartMapper.insert(userDeaprt);\n\t\t\t}\n\t\t}\n\n\t\t//step.4 保存职位\n\t\tthis.saveUserPosition(user.getId(),user.getPost());\n        //step5 保存兼职岗位\n        this.saveUserOtherDepPost(user.getId(),user.getOtherDepPostId());\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\t@CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)\n\tpublic void editUser(SysUser user, String roles, String departs, String relTenantIds, String updateFromPage) {\n\t\t//获取用户编辑前台传过来的租户id\n        this.editUserTenants(user.getId(),relTenantIds);\n        if(null == user.getSort()){\n            user.setSort(CommonConstant.DEFAULT_USER_SORT);\n        }\n\t\t//step.1 修改用户基础信息\n\t\tthis.updateById(user);\n\t\t//step.2 修改角色\n\t\tif (oConvertUtils.isEmpty(updateFromPage) || !\"deptUsers\".equalsIgnoreCase(updateFromPage)) {\n\t\t\t// 处理用户角色 先删后加 , 如果是在部门用户页面修改用户,不处理用户角色,因为该页面无法编辑用户角色.\n\t\t\tsysUserRoleMapper.delete(new QueryWrapper<SysUserRole>().lambda().eq(SysUserRole::getUserId, user.getId()));\n\t\t\tif (oConvertUtils.isNotEmpty(roles)) {\n\t\t\t\tString[] arr = roles.split(\",\");\n\t\t\t\tfor (String roleId : arr) {\n\t\t\t\t\tSysUserRole userRole = new SysUserRole(user.getId(), roleId);\n\t\t\t\t\tsysUserRoleMapper.insert(userRole);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//step.3 修改部门\n\t\tString[] arr = {};\n\t\tif(oConvertUtils.isNotEmpty(departs)){\n\t\t\tarr = departs.split(\",\");\n\t\t}\n\t\t//查询已关联部门\n\t\tList<SysUserDepart> userDepartList = sysUserDepartMapper.selectList(new QueryWrapper<SysUserDepart>().lambda().eq(SysUserDepart::getUserId, user.getId()));\n\t\tif(userDepartList != null && userDepartList.size()>0){\n\t\t\tfor(SysUserDepart depart : userDepartList ){\n\t\t\t\t//修改已关联部门删除部门用户角色关系\n\t\t\t\tif(!Arrays.asList(arr).contains(depart.getDepId())){\n\t\t\t\t\tList<SysDepartRole> sysDepartRoleList = sysDepartRoleMapper.selectList(\n\t\t\t\t\t\t\tnew QueryWrapper<SysDepartRole>().lambda().eq(SysDepartRole::getDepartId,depart.getDepId()));\n\t\t\t\t\tList<String> roleIds = sysDepartRoleList.stream().map(SysDepartRole::getId).collect(Collectors.toList());\n\t\t\t\t\tif(roleIds != null && roleIds.size()>0){\n\t\t\t\t\t\tdepartRoleUserMapper.delete(new QueryWrapper<SysDepartRoleUser>().lambda().eq(SysDepartRoleUser::getUserId, user.getId())\n\t\t\t\t\t\t\t\t.in(SysDepartRoleUser::getDroleId,roleIds));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t//先删后加\n\t\tsysUserDepartMapper.delete(new QueryWrapper<SysUserDepart>().lambda().eq(SysUserDepart::getUserId, user.getId()));\n\t\tif(oConvertUtils.isNotEmpty(departs)) {\n\t\t\tfor (String departId : arr) {\n\t\t\t\tSysUserDepart userDepart = new SysUserDepart(user.getId(), departId);\n\t\t\t\tsysUserDepartMapper.insert(userDepart);\n\t\t\t}\n\t\t}\n\t\t//step.4 修改手机号和邮箱\n\t\t// 更新手机号、邮箱空字符串为 null\n\t\tuserMapper.updateNullByEmptyString(\"email\");\n\t\tuserMapper.updateNullByEmptyString(\"phone\");\n\n\t\t//step.5 修改职位\n\t\tthis.editUserPosition(user.getId(),user.getPost());\n\n        //代码逻辑说明: 兼职岗位改造成中间表的方式---\n        //step6 修改兼职岗位\n        //先删后加\n        depPostMapper.delete(new QueryWrapper<SysUserDepPost>().lambda().eq(SysUserDepPost::getUserId, user.getId()));\n        this.saveUserOtherDepPost(user.getId(),user.getOtherDepPostId());\n\t}\n\n\n    /**\n     * 保存兼职岗位\n     *\n     * @param userId\n     * @param otherDepPostId\n     */\n    private void saveUserOtherDepPost(String userId, String otherDepPostId) {\n        if (oConvertUtils.isNotEmpty(otherDepPostId)) {\n            String[] depPostId = otherDepPostId.split(SymbolConstant.COMMA);\n            for (String postId : depPostId) {\n                SysUserDepPost userPosition = new SysUserDepPost(userId, postId);\n                depPostMapper.insert(userPosition);\n            }\n        }\n    }\n\n\t@Override\n\tpublic List<String> userIdToUsername(Collection<String> userIdList) {\n\t\tLambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();\n\t\tqueryWrapper.in(SysUser::getId, userIdList);\n\t\tList<SysUser> userList = super.list(queryWrapper);\n\t\treturn userList.stream().map(SysUser::getUsername).collect(Collectors.toList());\n\t}\n\n\t@Override\n\t@Cacheable(cacheNames=CacheConstant.SYS_USERS_CACHE, key=\"#username\")\n\t@SensitiveEncode\n\tpublic LoginUser getEncodeUserInfo(String username){\n\t\tif(oConvertUtils.isEmpty(username)) {\n\t\t\treturn null;\n\t\t}\n\t\tLoginUser loginUser = new LoginUser();\n\t\tSysUser sysUser = userMapper.getUserByName(username);\n\t\t//查询用户的租户ids\n\t\tthis.setUserTenantIds(sysUser);\n\t\t//设置职位id\n\t\tthis.userPositionId(sysUser);\n\t\tif(sysUser==null) {\n\t\t\treturn null;\n\t\t}\n\t\tBeanUtils.copyProperties(sysUser, loginUser);\n\t\t// 查询当前登录用户的部门id\n\t\tloginUser.setOrgId(this.getDepartIdByOrCode(sysUser.getOrgCode()));\n\t\t// 查询当前登录用户的角色code（多个逗号分割）\n\t\tloginUser.setRoleCode(this.getJoinRoleCodeByUserId(sysUser.getId()));\n\t\treturn loginUser;\n\t}\n\n    @Override\n    @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)\n    @Transactional(rollbackFor = Exception.class)\n    public void userQuit(String username) {\n        SysUser sysUser = userMapper.getUserByName(username);\n        if(null == sysUser){\n            throw new JeecgBootException(\"离职失败，该用户已不存在\");\n        }\n\t\t// 代码逻辑说明: [QQYUN-3951]租户用户离职重构------------\n\t\tint tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n\t\t//更新用户租户表的状态为离职状态\n\t\tif(tenantId==0){\n\t\t\tthrow new JeecgBootException(\"离职失败，租户不存在\");\n\t\t}\n\t\tLambdaQueryWrapper<SysUserTenant> query = new LambdaQueryWrapper<>();\n\t\tquery.eq(SysUserTenant::getUserId,sysUser.getId());\n\t\tquery.eq(SysUserTenant::getTenantId,tenantId);\n\t\tSysUserTenant userTenant = new SysUserTenant();\n\t\tuserTenant.setStatus(CommonConstant.USER_TENANT_QUIT);\n\t\tuserTenantMapper.update(userTenant,query);\n    }\n\n    @Override\n    public List<SysUser> getQuitList(Integer tenantId) {\n        return userMapper.getTenantQuitList(tenantId);\n    }\n\n    @Override\n    public void updateStatusAndFlag(List<String> userIds, SysUser sysUser) {\n        userMapper.updateStatusAndFlag(userIds,sysUser);\n    }\n\n\t/**\n\t * 设置登录租户\n\t * @param sysUser\n\t * @return\n\t */\n\t@Override\n\tpublic Result<JSONObject>  setLoginTenant(SysUser sysUser, JSONObject obj, String username, Result<JSONObject> result){\n\t\t//用户有哪些租户\n//\t\tList<SysTenant> tenantList = null;\n\t\t// 代码逻辑说明: [QQYUN-3371]租户逻辑改造，改成关系表\n\t\tList<SysTenant> tenantList = relationMapper.getTenantNoCancel(sysUser.getId());\n\t\tobj.put(\"tenantList\", tenantList);\n//\t\tif (null!=tenantIdList && tenantIdList.size()>0) {\n//\t\t\t//-------------------------------------------------------------------------------------\n//\t\t\t//查询有效的租户集合\n//\t\t\tLambdaQueryWrapper<SysTenant> queryWrapper = new LambdaQueryWrapper<>();\n//\t\t\tqueryWrapper.in(SysTenant::getId, tenantIdList);\n//\t\t\tqueryWrapper.eq(SysTenant::getStatus, Integer.valueOf(CommonConstant.STATUS_1));\n//\t\t\ttenantList = sysTenantMapper.selectList(queryWrapper);\n//\t\t\t//-------------------------------------------------------------------------------------\n//\n//\t\t\tif (tenantList.size() == 0) {\n//\t\t\t\treturn result.error500(\"与该用户关联的租户均已被冻结，无法登录！\");\n//\t\t\t} else {\n//\t\t\t\tobj.put(\"tenantList\", tenantList);\n//\t\t\t}\n//\t\t}\n\n\n\t\t//登录会话租户ID，有效性重置\n\t\tif (tenantList != null && tenantList.size() > 0) {\n\t\t\tif (tenantList.size() == 1) {\n\t\t\t\tsysUser.setLoginTenantId(tenantList.get(0).getId());\n\t\t\t} else {\n\t\t\t\tList<SysTenant> listAfterFilter = tenantList.stream().filter(s -> s.getId().equals(sysUser.getLoginTenantId())).collect(Collectors.toList());\n\t\t\t\tif (listAfterFilter == null || listAfterFilter.size() == 0) {\n\t\t\t\t\t//如果上次登录租户ID，在用户拥有的租户集合里面没有了，则随机取用户拥有的第一个租户ID\n\t\t\t\t\tsysUser.setLoginTenantId(tenantList.get(0).getId());\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t//无租户的时候，设置为 0\n\t\t\tsysUser.setLoginTenantId(0);\n\t\t}\n\t\t//设置用户登录缓存租户\n\t\tthis.updateUserDepart(username, null,sysUser.getLoginTenantId());\n\t\tlog.debug(\" 登录接口用户的租户ID = {}\", sysUser.getLoginTenantId());\n\t\tif(sysUser.getLoginTenantId()!=null){\n\t\t\t//登录的时候需要手工设置下会话中的租户ID,不然登录接口无法通过租户隔离查询到数据\n\t\t\tTenantContext.setTenant(sysUser.getLoginTenantId()+\"\");\n\t\t}\n\t\treturn null;\n\t}\n\n\n    /**\n     * 获取租户id\n     * @param sysUser\n     */\n    private void setUserTenantIds(SysUser sysUser) {\n\t\tif(ObjectUtils.isNotEmpty(sysUser)) {\n\t\t\tList<Integer> list  = relationMapper.getTenantIdsNoStatus(sysUser.getId());\n\t\t\tif(null!=list && list.size()>0){\n\t\t\t\tsysUser.setRelTenantIds(StringUtils.join(list.toArray(), \",\"));\n\t\t\t}else{\n\t\t\t\tsysUser.setRelTenantIds(\"\");\n\t\t\t}\n\t\t}\n    }\n\n    /**\n     * 保存租户\n     *\n     * @param userId\n     * @param relTenantIds\n     * @param izSyncPack 是否需要将用户同步当前产品包下\n     */\n    private void saveUserTenant(String userId, String relTenantIds, boolean izSyncPack) {\n        if (oConvertUtils.isNotEmpty(relTenantIds)) {\n            String[] tenantIds = relTenantIds.split(SymbolConstant.COMMA);\n            for (String tenantId : tenantIds) {\n                SysUserTenant relation = new SysUserTenant();\n                relation.setUserId(userId);\n                relation.setTenantId(Integer.valueOf(tenantId));\n                relation.setStatus(CommonConstant.STATUS_1);\n                \n\t\t\t\tLambdaQueryWrapper sysUserTenantQueryWrapper = new LambdaQueryWrapper<SysUserTenant>()\n\t\t\t\t\t\t.eq(SysUserTenant::getUserId, userId)\n\t\t\t\t\t\t.eq(SysUserTenant::getTenantId,Integer.valueOf(tenantId));\n\t\t\t\tSysUserTenant tenantPresent = relationMapper.selectOne(sysUserTenantQueryWrapper);\n\t\t\t\tif (tenantPresent != null) {\n\t\t\t\t\ttenantPresent.setStatus(CommonConstant.STATUS_1);\n\t\t\t\t\trelationMapper.updateById(tenantPresent);\n\t\t\t\t}else{\n\t\t\t\t\trelationMapper.insert(relation);\n                    ISysTenantService currentService = SpringContextUtils.getApplicationContext().getBean(ISysTenantService.class);\n                    //默认添加当前用户到租户套餐中\n                    currentService.addPackUser(userId,tenantId);\n\t\t\t\t}\n            }\n        }else{\n\t\t\t//是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】\n\t\t\tif (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n\t\t\t\t// 代码逻辑说明: 判断当前用户是否在当前租户里面，如果不存在在新增------------\n\t\t\t\tString tenantId = TenantContext.getTenant();\n\t\t\t\tif(oConvertUtils.isNotEmpty(tenantId)){\n\t\t\t\t\tInteger count = relationMapper.userTenantIzExist(userId, Integer.parseInt(tenantId));\n\t\t\t\t\tif(count == 0){\n\t\t\t\t\t\tSysUserTenant relation = new SysUserTenant();\n\t\t\t\t\t\trelation.setUserId(userId);\n\t\t\t\t\t\trelation.setTenantId(Integer.parseInt(tenantId));\n\t\t\t\t\t\trelation.setStatus(CommonConstant.STATUS_1);\n\t\t\t\t\t\trelationMapper.insert(relation);\n                        if(izSyncPack){\n                            ISysTenantService currentService = SpringContextUtils.getApplicationContext().getBean(ISysTenantService.class);\n                            //自动为用户，添加租户下所有套餐\n                            currentService.addPackUser(userId,tenantId);\n                        }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n    }\n\n    /**\n     * 编辑租户\n     * @param userId\n     * @param relTenantIds\n     */\n    private void editUserTenants(String userId, String relTenantIds) {\n        LambdaQueryWrapper<SysUserTenant> query = new LambdaQueryWrapper<>();\n        query.eq(SysUserTenant::getUserId, userId);\n        //数据库的租户id\n\t\tList<Integer> oldTenantIds = relationMapper.getTenantIdsByUserId(userId);\n        //如果传过来的租户id为空，那么就删除租户\n        if (oConvertUtils.isEmpty(relTenantIds) && CollectionUtils.isNotEmpty(oldTenantIds)) {\n            this.deleteTenantByUserId(userId, null);\n        } else if (oConvertUtils.isNotEmpty(relTenantIds) && CollectionUtils.isEmpty(oldTenantIds)) {\n            //如果传过来的租户id不为空但是数据库的租户id为空，那么就新增\n            this.saveUserTenant(userId, relTenantIds, false);\n        } else {\n\t\t\t//都不为空，需要比较，进行添加或删除\n\t\t\tif(oConvertUtils.isNotEmpty(relTenantIds) && CollectionUtils.isNotEmpty(oldTenantIds)){\n\t\t\t\t//找到新的租户id与原来的租户id不同之处，进行删除\n\t\t\t\tString[] relTenantIdArray = relTenantIds.split(SymbolConstant.COMMA);\n\t\t\t\tList<String> relTenantIdList = Arrays.asList(relTenantIdArray);\n\t\t\t\t\n\t\t\t\tList<Integer> deleteTenantIdList = oldTenantIds.stream().filter(item -> !relTenantIdList.contains(item.toString())).collect(Collectors.toList());\n\t\t\t\tfor (Integer tenantId : deleteTenantIdList) {\n\t\t\t\t\tthis.deleteTenantByUserId(userId, tenantId);\n\t\t\t\t}\n\t\t\t\t//找到原来租户的用户id与新的租户id不同之处，进行新增\n\t\t\t\tString tenantIds = relTenantIdList.stream().filter(item -> !oldTenantIds.contains(Integer.valueOf(item))).collect(Collectors.joining(\",\"));\n\t\t\t\tthis.saveUserTenant(userId, tenantIds, false);\n\t\t\t}\n        }\n    }\n\n    /**\n     * 删除租户通过用户id\n     * @param tenantId\n     * @param userId\n     */\n    private void deleteTenantByUserId(String userId,Integer tenantId){\n        LambdaQueryWrapper<SysUserTenant> query = new LambdaQueryWrapper<>();\n        query.eq(SysUserTenant::getUserId, userId);\n        if(oConvertUtils.isNotEmpty(tenantId)){\n            query.eq(SysUserTenant::getTenantId, tenantId);\n        }\n        relationMapper.delete(query);\n        //删除产品包用户关联\n        LambdaQueryWrapper<SysTenantPackUser> packUserQuery = new LambdaQueryWrapper<>();\n        packUserQuery.eq(SysTenantPackUser::getUserId, userId);\n        if(oConvertUtils.isNotEmpty(tenantId)){\n            packUserQuery.eq(SysTenantPackUser::getTenantId, tenantId);\n        }\n        packUserMapper.delete(packUserQuery);\n    }\n\n\n\n\t@Override\n\tpublic void batchEditUsers(JSONObject json) {\n\t\tString userIds = json.getString(\"userIds\");\n\t\tList<String> idList = JSONArray.parseArray(userIds, String.class);\n\t\t//部门\n\t\tString selecteddeparts = json.getString(\"selecteddeparts\");\n\t\t//职位\n\t\tString post = json.getString(\"post\");\n\t\t//工作地点? 没有这个字段\n\t\tString workAddress = json.getString(\"workAddress\");\n\t\t//批量修改用户职位\n\t\tif(oConvertUtils.isNotEmpty(post)) {\n\t\t\t//修改职位用户关系表\n\t\t\tfor (String userId:idList) {\n\t\t\t\tthis.editUserPosition(userId,post);\n\t\t\t}\n\t\t}\n\t\tif(oConvertUtils.isNotEmpty(selecteddeparts)) {\n\t\t\t//查询当前租户的部门列表\n\t\t\tInteger currentTenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n\t\t\tLambdaQueryWrapper<SysDepart> departQuery = new LambdaQueryWrapper<SysDepart>()\n\t\t\t\t\t.eq(SysDepart::getTenantId, currentTenantId);\n\t\t\tList<SysDepart> departList = sysDepartMapper.selectList(departQuery);\n\t\t\tif(departList==null || departList.size()==0){\n\t\t\t\tlog.error(\"batchEditUsers 根据租户ID没有找到部门>\"+currentTenantId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tList<String> departIdList = new ArrayList<String>();\n\t\t\tfor(SysDepart depart: departList){\n\t\t\t\tif(depart!=null){\n\t\t\t\t\tString id = depart.getId();\n\t\t\t\t\tif(oConvertUtils.isNotEmpty(id)){\n\t\t\t\t\t\tdepartIdList.add(id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t//删除人员的部门关联\n\t\t\tLambdaQueryWrapper<SysUserDepart> query = new LambdaQueryWrapper<SysUserDepart>()\n\t\t\t\t\t.in(SysUserDepart::getUserId, idList)\n\t\t\t\t\t.in(SysUserDepart::getDepId, departIdList);\n\t\t\tsysUserDepartMapper.delete(query);\n\t\t\t\n\t\t\tString[] arr = selecteddeparts.split(\",\");\n\t\t\t\n\t\t\t//再新增\n\t\t\tfor (String deaprtId : arr) {\n\t\t\t\tfor(String userId: idList){\n\t\t\t\t\tSysUserDepart userDepart = new SysUserDepart(userId, deaprtId);\n\t\t\t\t\tsysUserDepartMapper.insert(userDepart);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tpublic DepartAndUserInfo searchByKeyword(String keyword) {\n\t\tDepartAndUserInfo departAndUserInfo = new DepartAndUserInfo();\n\t\tif(oConvertUtils.isNotEmpty(keyword)){\n\t\t\tLambdaQueryWrapper<SysUser> query1 = new LambdaQueryWrapper<SysUser>()\n\t\t\t\t\t.like(SysUser::getRealname, keyword);\n\t\t\tString str = oConvertUtils.getString(TenantContext.getTenant(), \"0\");\n\t\t\tInteger tenantId = Integer.valueOf(str);\n\t\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\t\tList<String> userIds = userTenantMapper.getUserIdsByTenantId(tenantId);\n\t\t\t\tif (oConvertUtils.listIsNotEmpty(userIds)) {\n\t\t\t\t\tquery1.in(SysUser::getId, userIds);\n\t\t\t\t}else{\n\t\t\t\t\tquery1.eq(SysUser::getId, \"\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tList<SysUser> list1 = this.baseMapper.selectList(query1);\n\t\t\tif(list1!=null && list1.size()>0){\n\t\t\t\tList<UserAvatar> userList = list1.stream().map(v -> new UserAvatar(v)).collect(Collectors.toList());\n\t\t\t\tdepartAndUserInfo.setUserList(userList);\n\t\t\t}\n\n\t\t\tLambdaQueryWrapper<SysDepart> query2 = new LambdaQueryWrapper<SysDepart>()\n\t\t\t\t\t.like(SysDepart::getDepartName, keyword);\n\t\t\tif(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n\t\t\t\tquery2.eq(SysDepart::getTenantId, tenantId);\n\t\t\t}\n\t\t\tList<SysDepart> list2 = sysDepartMapper.selectList(query2);\n\t\t\tif(list2!=null && list2.size()>0){\n\t\t\t\tList<DepartInfo> departList = new ArrayList<>();\n\t\t\t\tfor(SysDepart depart: list2){\n\t\t\t\t\tList<String> orgName = new ArrayList<>();\n\t\t\t\t\tList<String> orgId = new ArrayList<>();\n\t\t\t\t\tgetParentDepart(depart, orgName, orgId);\n\t\t\t\t\tDepartInfo departInfo = new DepartInfo();\n\t\t\t\t\tdepartInfo.setId(depart.getId());\n\t\t\t\t\tdepartInfo.setOrgId(orgId);\n\t\t\t\t\tdepartInfo.setOrgName(orgName);\n\t\t\t\t\tdepartList.add(departInfo);\n\t\t\t\t}\n\t\t\t\tdepartAndUserInfo.setDepartList(departList);\n\t\t\t}\n\t\t}\n\t\treturn departAndUserInfo;\n\t}\n\n\t@Override\n\tpublic UpdateDepartInfo getUpdateDepartInfo(String departId) {\n\t\tSysDepart depart = sysDepartMapper.selectById(departId);\n\t\tif(depart!=null){\n\t\t\tUpdateDepartInfo info = new UpdateDepartInfo(depart);\n\t\t\tList<SysDepart> subList = sysDepartMapper.queryDeptByPid(departId);\n\t\t\tif(subList!=null && subList.size()>0){\n\t\t\t\tinfo.setHasSub(true);\n\t\t\t}\n\t\t\t//获取部门负责人信息\n\t\t\tLambdaQueryWrapper<SysUser> query = new LambdaQueryWrapper<SysUser>()\n\t\t\t\t\t.eq(SysUser::getUserIdentity, 2)\n\t\t\t\t\t.like(SysUser::getDepartIds, depart.getId());\n\t\t\tList<SysUser> userList = this.baseMapper.selectList(query);\n\t\t\tif(userList!=null && userList.size()>0){\n\t\t\t\tList<String> idList = userList.stream().map(i -> i.getId()).collect(Collectors.toList());\n\t\t\t\tinfo.setChargePersonList(idList);\n\t\t\t}\n\t\t\treturn info;\n\t\t}\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic void doUpdateDepartInfo(UpdateDepartInfo info) {\n\t\tString departId = info.getDepartId();\n\t\tSysDepart depart = sysDepartMapper.selectById(departId);\n\t\tif(depart!=null){\n\t\t\t//修改部门信息-上级和部门名称\n\t\t\tif(!depart.getParentId().equals(info.getParentId())){\n\t\t\t\tString pid = info.getParentId();\n\t\t\t\tSysDepart parentDepart = sysDepartMapper.selectById(pid);\n\t\t\t\tif(parentDepart!=null){\n\t\t\t\t\tString orgCode = getNextOrgCode(pid);\n\t\t\t\t\tdepart.setOrgCode(orgCode);\n\t\t\t\t\tdepart.setParentId(pid);\n\t\t\t\t}\n\t\t\t}\n\t\t\tdepart.setDepartName(info.getDepartName());\n\t\t\tsysDepartMapper.updateById(depart);\n\t\t\t//先查询这个部门的负责人\n\t\t\tList<SysUser> departChargeUsers = queryDepartChargePersons(departId);\n\t\t\tList<String> departChargeUserIdList = departChargeUsers.stream().map(i -> i.getId()).collect(Collectors.toList());\n\t\t\t//修改部门负责人\n\t\t\tList<String> userIdList = info.getChargePersonList();\n\t\t\tif(userIdList!=null && userIdList.size()>0){\n\t\t\t\tfor(String userId: userIdList){\n\t\t\t\t\tSysUser user = this.baseMapper.selectById(userId);\n\t\t\t\t\tif(user!=null){\n\t\t\t\t\t\tdepartChargeUserIdList.remove(user.getId());\n\t\t\t\t\t\tuser.setUserIdentity(2);\n\t\t\t\t\t\tString departIds = user.getDepartIds();\n\t\t\t\t\t\tif(oConvertUtils.isEmpty(departIds)){\n\t\t\t\t\t\t\tuser.setDepartIds(departId);\n\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\tList<String> list = new ArrayList<String>(Arrays.asList(departIds.split(\",\")));\n\t\t\t\t\t\t\tif(list.indexOf(departId)>=0){\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tlist.add(departId);\n\t\t\t\t\t\t\t\tString newDepartIds = String.join(\",\", list);\n\t\t\t\t\t\t\t\tuser.setDepartIds(newDepartIds);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.baseMapper.updateById(user);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t// 代码逻辑说明: 部门负责人不能被删除------------\n\t\t\t\tthis.removeDepartmentManager(departChargeUserIdList,departChargeUsers,departId);\n\t\t\t}else{\n\t\t\t\tif(CollectionUtil.isNotEmpty(departChargeUsers)){\n\t\t\t\t\t//前端传过来用户列表id为空，说明数据库的负责部门人员均需要删除\n\t\t\t\t\tthis.removeDepartmentManager(departChargeUserIdList,departChargeUsers,departId);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate List<SysUser> queryDepartChargePersons(String departId){\n    \tList<SysUser> result = new ArrayList<>();\n\t\t// 代码逻辑说明: 部门负责人不能被删除------------\n\t\tLambdaQueryWrapper<SysUser> userQuery = new LambdaQueryWrapper<>();\n\t\tuserQuery.like(SysUser::getDepartIds,departId);\n\t\tList<SysUser> userList = userMapper.selectList(userQuery);\n\t\tif(userList!=null && userList.size()>0){\n\t\t\tfor(SysUser user: userList){\n\t\t\t\tInteger identity = user.getUserIdentity();\n\t\t\t\tString deps = user.getDepartIds();\n\t\t\t\tif(identity!=null && identity==2){\n\t\t\t\t\tif(oConvertUtils.isNotEmpty(deps)){\n\t\t\t\t\t\tif(deps.indexOf(departId)>=0){\n\t\t\t\t\t\t\tresult.add(user);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n    \treturn result;\n\t}\n\t\n\t/**\n\t * 变更父级部门 修改编码\n\t * @param parentId\n\t * @return\n\t */\n\tprivate String getNextOrgCode(String parentId){\n\t\tJSONObject formData = new JSONObject();\n\t\tformData.put(\"parentId\",parentId);\n\t\tString[] codeArray = (String[]) FillRuleUtil.executeRule(FillRuleConstant.DEPART, formData);\n\t\treturn codeArray[0];\n\t}\n\n\t@Override\n\tpublic void changeDepartChargePerson(JSONObject json) {\n\t\tString userId = json.getString(\"userId\");\n\t\tString departId = json.getString(\"departId\");\n\t\tboolean status  = json.getBoolean(\"status\");\n\t\tSysUser user = this.getById(userId);\n\t\tif(user!=null){\n\t\t\tString ids = user.getDepartIds();\n\t\t\tif(status==true){\n\t\t\t\t//设置部门负责人\n\t\t\t\tif(oConvertUtils.isEmpty(ids)){\n\t\t\t\t\t//设置为上级\n\t\t\t\t\tuser.setUserIdentity(CommonConstant.USER_IDENTITY_2);\n\t\t\t\t\tuser.setDepartIds(departId);\n\t\t\t\t}else{\n\t\t\t\t\tList<String> list = new ArrayList<String>(Arrays.asList(ids.split(\",\")));\n\t\t\t\t\tif(list.indexOf(departId)>=0){\n\t\t\t\t\t\t//啥也不干\n\t\t\t\t\t}else{\n\t\t\t\t\t\tlist.add(departId);\n\t\t\t\t\t\tString newIds = String.join(\",\", list);\n\t\t\t\t\t\t//设置为上级\n\t\t\t\t\t\tuser.setUserIdentity(CommonConstant.USER_IDENTITY_2);\n\t\t\t\t\t\tuser.setDepartIds(newIds);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\t// 取消负责人\n\t\t\t\tif(oConvertUtils.isNotEmpty(ids)){\n\t\t\t\t\tList<String> list = new ArrayList<String>();\n\t\t\t\t\tfor(String temp: ids.split(\",\")){\n\t\t\t\t\t\tif(oConvertUtils.isEmpty(temp)){\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(!temp.equals(departId)){\n\t\t\t\t\t\t\tlist.add(temp);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tString newIds = \"\";\n\t\t\t\t\tif(list.size()>0){\n\t\t\t\t\t\tnewIds = String.join(\",\", list);\n\t\t\t\t\t}else{\n\t\t\t\t\t\t//负责部门为空时，说明已经是普通用户\n\t\t\t\t\t\tuser.setUserIdentity(CommonConstant.USER_IDENTITY_1);\n\t\t\t\t\t}\n\t\t\t\t\tuser.setDepartIds(newIds);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.updateById(user);\n\t\t}\n\t}\n\n\t/**\n\t * 找上级部门\n\t * @param depart\n\t * @param orgName\n\t * @param orgId\n\t */\n\tprivate void getParentDepart(SysDepart depart,List<String> orgName,List<String> orgId){\n\t\tString pid = depart.getParentId();\n\t\torgName.add(0, depart.getDepartName());\n\t\torgId.add(0, depart.getId());\n\t\tif(oConvertUtils.isNotEmpty(pid)){\n\t\t\tSysDepart temp = sysDepartMapper.selectById(pid);\n\t\t\tgetParentDepart(temp, orgName, orgId);\n\t\t}\n\t}\n\t\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\t@CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)\n\tpublic void editTenantUser(SysUser sysUser, String tenantId, String departs, String roles) {\n\t\tSysUser user = new SysUser();\n\t\tuser.setWorkNo(sysUser.getWorkNo());\n\t\tuser.setId(sysUser.getId());\n\t\tthis.updateById(user);\n\t\t// 代码逻辑说明: 【QQYUN-5251】人员与部门：部门删除不掉------------\n\t\tif(oConvertUtils.isEmpty(departs)){\n\t\t\t//直接删除用户下的的租户部门\n\t\t\tsysUserDepartMapper.deleteUserDepart(user.getId(),tenantId);\n\t\t}else{\n\t\t\t//修改租户用户下的部门\n\t\t\tthis.updateTenantDepart(user, tenantId, departs);\n\t\t}\n\t\t//修改用户下的职位\n\t\tthis.editUserPosition(sysUser.getId(),sysUser.getPost());\n\t}\n\n\t/**\n\t * 修改账号状态\n\t * @param id 账号id\n\t * @param status 账号状态\n\t */\n\t@Override\n\t@CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)\n\tpublic void updateStatus(String id, String status) {\n\t\tuserMapper.update(new SysUser().setStatus(Integer.parseInt(status)),\n\t\t\t\tnew UpdateWrapper<SysUser>().lambda().eq(SysUser::getId,id));\n\t}\n\n\t/**\n\t * 修改租户下的部门\n\t * @param departs\n\t */\n\tpublic void updateTenantDepart(SysUser user, String tenantId, String departs) {\n\t\tList<String> departList = new ArrayList<>();\n\t\tlong startTime = System.currentTimeMillis();\n\t\tif (oConvertUtils.isNotEmpty(departs)) {\n\t\t\t//获取当前租户下的部门id,根据前台\n\t\t\tdepartList = sysUserDepartMapper.getTenantDepart(Arrays.asList(departs.split(SymbolConstant.COMMA)), tenantId);\n\t\t}\n\t\tlong endTime = System.currentTimeMillis();\n\t\tSystem.out.println(\"查询用户部门用时：\" + (endTime - startTime) + \"ms\");\n\t\t//查询当前租户下部门和用户已关联的部门\n\t\tList<SysUserDepart> userDepartList = sysUserDepartMapper.getTenantUserDepart(user.getId(), tenantId);\n\t\tif (userDepartList != null && userDepartList.size() > 0 && departList.size() > 0) {\n\t\t\tfor (SysUserDepart depart : userDepartList) {\n\t\t\t\t//修改已关联部门删除部门用户角色关系\n\t\t\t\tif (!departList.contains(depart.getDepId())) {\n\t\t\t\t\tList<SysDepartRole> sysDepartRoleList = sysDepartRoleMapper.selectList(\n\t\t\t\t\t\t\tnew QueryWrapper<SysDepartRole>().lambda().eq(SysDepartRole::getDepartId, depart.getDepId()));\n\t\t\t\t\tList<String> roleIds = sysDepartRoleList.stream().map(SysDepartRole::getId).collect(Collectors.toList());\n\t\t\t\t\tif (roleIds.size() > 0) {\n\t\t\t\t\t\tdepartRoleUserMapper.delete(new QueryWrapper<SysDepartRoleUser>().lambda().eq(SysDepartRoleUser::getUserId, user.getId())\n\t\t\t\t\t\t\t\t.in(SysDepartRoleUser::getDroleId, roleIds));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlong endTime1 = System.currentTimeMillis();\n\t\tSystem.out.println(\"修改部门角色用时：\" + (endTime1 - startTime) + \"ms\");\n\t\t\n\t\tif (departList.size() > 0) {\n\t\t\t//删除用户下的部门\n\t\t\tsysUserDepartMapper.deleteUserDepart(user.getId(), tenantId);\n\t\t\tfor (String departId : departList) {\n\t\t\t\t//添加部门\n\t\t\t\tSysUserDepart userDepart = new SysUserDepart(user.getId(), departId);\n\t\t\t\tsysUserDepartMapper.insert(userDepart);\n\t\t\t}\n\t\t}\n\t\tlong endTime2 = System.currentTimeMillis();\n\t\tSystem.out.println(\"修改用户部门用时：\" + (endTime2 - startTime) + \"ms\");\n\t}\n\n\t/**\n\t * 保存用户职位\n\t *\n\t * @param userId\n\t * @param positionIds\n\t */\n\tprivate void saveUserPosition(String userId, String positionIds) {\n\t\tif (oConvertUtils.isNotEmpty(positionIds)) {\n\t\t\tString[] positionIdArray = positionIds.split(SymbolConstant.COMMA);\n\t\t\tfor (String postId : positionIdArray) {\n\t\t\t\tSysUserPosition userPosition = new SysUserPosition();\n\t\t\t\tuserPosition.setUserId(userId);\n\t\t\t\tuserPosition.setPositionId(postId);\n\t\t\t\tsysUserPositionMapper.insert(userPosition);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * 编辑用户职位\n\t *\n\t * @param userId\n\t * @param positionIds\n\t */\n\tprivate void editUserPosition(String userId, String positionIds) {\n\t\t//先删除\n\t\tLambdaQueryWrapper<SysUserPosition> query = new LambdaQueryWrapper<>();\n\t\tquery.eq(SysUserPosition::getUserId, userId);\n\t\tsysUserPositionMapper.delete(query);\n\t\t//后新增数据\n\t\tthis.saveUserPosition(userId, positionIds);\n\t}\n\n\t/**\n\t * 设置用户职位id(已逗号拼接起来)\n\t * @param sysUser\n\t */\n\tprivate void userPositionId(SysUser sysUser) {\n\t\tif(null != sysUser){\n\t\t\tList<String> positionList = sysUserPositionMapper.getPositionIdByUserId(sysUser.getId());\n\t\t\tsysUser.setPost(CommonUtils.getSplitText(positionList,SymbolConstant.COMMA));\n\t\t}\n\t}\n\n\t/**\n\t * 查询用户当前登录部门的id\n\t *\n\t * @param orgCode\n\t */\n\tprivate @Nullable String getDepartIdByOrCode(String orgCode) {\n\t\tif (oConvertUtils.isEmpty(orgCode)) {\n\t\t\treturn null;\n\t\t}\n\t\tLambdaQueryWrapper<SysDepart> queryWrapper = new LambdaQueryWrapper<>();\n\t\tqueryWrapper.eq(SysDepart::getOrgCode, orgCode);\n\t\tqueryWrapper.select(SysDepart::getId);\n\t\tSysDepart depart = sysDepartMapper.selectOne(queryWrapper);\n\t\tif (depart == null || oConvertUtils.isEmpty(depart.getId())) {\n\t\t\treturn null;\n\t\t}\n\t\treturn depart.getId();\n\t}\n\n\t/**\n\t * 查询用户的角色code（多个逗号分割）\n\t *\n\t * @param userId\n\t */\n\tprivate @Nullable String getJoinRoleCodeByUserId(String userId) {\n\t\tif (oConvertUtils.isEmpty(userId)) {\n\t\t\treturn null;\n\t\t}\n\t\t// 判断是否开启saas模式，根据租户id过滤\n\t\tInteger tenantId = null;\n\t\tif (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n\t\t\t// 开启了但是没有租户ID，默认-1，使其查询不到任何数据\n\t\t\ttenantId = oConvertUtils.getInt(TenantContext.getTenant(), -1);\n\t\t}\n\t\tList<SysRole> roleList = sysRoleMapper.getRoleCodeListByUserId(userId, tenantId);\n\t\tif (CollectionUtils.isEmpty(roleList)) {\n\t\t\treturn null;\n\t\t}\n\t\treturn roleList.stream().map(SysRole::getRoleCode).collect(Collectors.joining(SymbolConstant.COMMA));\n\t}\n\n\t/**\n\t * 移除部门负责人\n\t * @param departChargeUserIdList\n\t * @param departChargeUsers\n\t * @param departId\n\t */\n\tprivate void removeDepartmentManager(List<String> departChargeUserIdList,List<SysUser> departChargeUsers,String departId){\n\t\t//移除部门负责人\n\t\tfor(String chargeUserId: departChargeUserIdList){\n\t\t\tfor(SysUser chargeUser: departChargeUsers){\n\t\t\t\tif(chargeUser.getId().equals(chargeUserId)){\n\t\t\t\t\tString departIds = chargeUser.getDepartIds();\n\t\t\t\t\tList<String> list = new ArrayList<String>(Arrays.asList(departIds.split(\",\")));\n\t\t\t\t\tlist.remove(departId);\n\t\t\t\t\tString newDepartIds = String.join(\",\", list);\n\t\t\t\t\tchargeUser.setDepartIds(newDepartIds);\n\t\t\t\t\tthis.baseMapper.updateById(chargeUser);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t//======================================= begin 用户与部门 用户列表导出 =========================================\n\t@Override\n\tpublic ModelAndView exportAppUser(HttpServletRequest request) {\n\t\tInteger tenantId = oConvertUtils.getInt(TenantContext.getTenant());\n\t\t// Step.1 组装查询条件，导出选中的部门id数据\n\t\tString departIds = request.getParameter(\"departIds\");\n\t\tList<String> list = new ArrayList<>();\n\t\tif(oConvertUtils.isNotEmpty(departIds)){\n\t\t\tlist = Arrays.asList(departIds.split(SymbolConstant.COMMA));\n\t\t}\n\t\t//查询用户数据\n\t\tList<SysUser> userList = userMapper.getUserByDepartsTenantId(list, tenantId);\n        //获取部门名称\n        List<SysUserDepVo> userDepVos = new ArrayList<>();\n        if(CollectionUtil.isNotEmpty(userList)){\n            userDepVos = sysDepartMapper.getUserDepartByTenantUserId(userList, tenantId);\n        }\n\t\t//获取职位\n\t\tList<SysUserPositionVo> positionVos = sysUserPositionMapper.getPositionIdByUsersTenantId(userList, tenantId);\n\t\t// step2 根据用户id进行分类\n\t\t//循环用户数据将数据整合导出\n\t\tList<AppExportUserVo> exportUserVoList = new ArrayList<>();\n\t\tfor (SysUser sysUser : userList) {\n\t\t\tAppExportUserVo exportUserVo = new AppExportUserVo();\n\t\t\tBeanUtils.copyProperties(sysUser, exportUserVo);\n            // 代码逻辑说明: 【QQYUN-10926】组织管理——用户导出时，部门没有导出上下级关系---\n            Map<String, String> departMap = this.getDepartNamesAndCategory(userDepVos, sysUser);\n            String departNames = departMap.get(\"departNames\");\n            exportUserVo.setDepart(departNames.toString());\n\t\t\tString posNames = positionVos.stream().filter(item -> item.getUserId().equals(sysUser.getId())).map(SysUserPositionVo::getName).collect(Collectors.joining(SymbolConstant.SEMICOLON));\n\t\t\texportUserVo.setPosition(posNames);\n\t\t\texportUserVoList.add(exportUserVo);\n\t\t}\n\t\t//step3 封装导出excel参数\n\t\tModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n\t\t//导出文件名称\n\t\tmv.addObject(NormalExcelConstants.FILE_NAME, \"用户列表\");\n\t\tmv.addObject(NormalExcelConstants.CLASS, AppExportUserVo.class);\n\t\tLoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\tExportParams exportParams = new ExportParams(\"导入规则：\\n\" +\n\t\t\t\t\"1、存在用户编号时，数据会根据用户编号进行匹配，匹配成功后只会更新职位和工号;\\n\" +\n\t\t\t\t\"2、不存在用户编号时，支持手机号、邮箱、姓名、部们、职位、工号导入,其中手机号必填;\\n\" +\n\t\t\t\t\"3、上下级部门用英文字符 / 连接，如 财务部/财务一部，多个部门或者职位用英文字符 ; 进行连接,如 财务部;研发部\", \"导出人:\" + user.getRealname(), \"导出信息\");\n\t\tmv.addObject(NormalExcelConstants.PARAMS, exportParams);\n\t\tmv.addObject(NormalExcelConstants.DATA_LIST, exportUserVoList);\n\t\treturn mv;\n\t}\n\n    /**\n     * 获取部门名称和部门类型\n     * for：【QQYUN-10926】组织管理——用户导出时，部门没有导出上下级关系\n     *\n     * @param userDepVos\n     * @param sysUser\n     * @return\n     */\n    private Map<String,String> getDepartNamesAndCategory(List<SysUserDepVo> userDepVos, SysUser sysUser) {\n        List<SysUserDepVo> SysUserDepVoList = userDepVos.stream().filter(item -> item.getUserId().equals(sysUser.getId()))\n                .map(item -> {\n                    SysUserDepVo userDepVo = new SysUserDepVo();\n                    userDepVo.setUserId(item.getUserId());\n                    userDepVo.setDeptId(item.getDeptId());\n                    userDepVo.setDepartName(item.getDepartName());\n                    userDepVo.setParentId(item.getParentId());\n                    userDepVo.setOrgCategory(DepartCategoryEnum.getNameByValue(item.getOrgCategory()));\n                    return userDepVo;\n                }).collect(Collectors.toList());\n        //循环SysUserDepVoList,如果存在父级id的情况下，需要将父级id的部门名称查询出来\n        StringBuilder departNames = new StringBuilder();\n        StringBuilder departOrgCategorys = new StringBuilder();\n        for (SysUserDepVo sysUserDepVo : SysUserDepVoList) {\n            if(oConvertUtils.isEmpty(sysUserDepVo.getDepartName())){\n                continue;\n            }\n            //用于查询父级的部门名称\n            List<String> departNameList = new LinkedList<>();\n            //用于查询父级的部门类型\n            List<String> departOrgCategoryList = new LinkedList<>();\n            departNameList.add(sysUserDepVo.getDepartName());\n            departOrgCategoryList.add(sysUserDepVo.getOrgCategory());\n            if (StringUtils.isNotEmpty(sysUserDepVo.getParentId())) {\n                //递归查询部门名称\n                this.getDepartNameByParentId(sysUserDepVo.getParentId(), departNameList, departOrgCategoryList);\n            }\n            Collections.reverse(departNameList);\n            Collections.reverse(departOrgCategoryList);\n            String departName = departNameList.stream().collect(Collectors.joining(SymbolConstant.SINGLE_SLASH));\n            if (StringUtils.isNotEmpty(departNames.toString())) {\n                departNames.append(SymbolConstant.SEMICOLON);\n            }\n            departNames.append(departName);\n            String orgCatrgory = departOrgCategoryList.stream().collect(Collectors.joining(SymbolConstant.SINGLE_SLASH));\n            if (StringUtils.isNotEmpty(departOrgCategorys.toString())) {\n                departOrgCategorys.append(SymbolConstant.SEMICOLON);\n            }\n            departOrgCategorys.append(orgCatrgory);\n        }\n        // 代码逻辑说明: 【QQYUN-13617】导入时 部门添加层级不对了---\n        Map<String,String> map = new HashMap<>();\n        map.put(\"departNames\", departNames.toString());\n        map.put(\"departOrgCategorys\",departOrgCategorys.toString());\n        return map;\n    }\n\n    /**\n     * 根据父级id查询父级的部门名称和部门类型\n     * for：【QQYUN-10926】组织管理——用户导出时，部门没有导出上下级关系\n     *\n     * @param parentId\n     * @param departNameList\n     * @param departOrgCategoryList\n     */\n    private void getDepartNameByParentId(String parentId, List<String> departNameList, List<String> departOrgCategoryList) {\n        SysDepart parentDepartId = sysDepartMapper.getDepartById(parentId);\n        if (null != parentDepartId) {\n            departNameList.add(parentDepartId.getDepartName());\n            departOrgCategoryList.add(DepartCategoryEnum.getNameByValue(parentDepartId.getOrgCategory()));\n            if (StringUtils.isNotEmpty(parentDepartId.getParentId())) {\n                this.getDepartNameByParentId(parentDepartId.getParentId(), departNameList, departOrgCategoryList);\n            }\n        }\n    }\n\n    //======================================= end 用户与部门 用户列表导出 =========================================\n\n\t//======================================= begin 用户与部门 用户列表导入 =========================================\n\t@Override\n\tpublic Result<?> importAppUser(HttpServletRequest request) {\n\t\tMultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n\t\tMap<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n\t\tInteger tenantId = oConvertUtils.getInt(TenantContext.getTenant());\n\t\tSysTenant sysTenant = sysTenantMapper.selectById(tenantId);\n\t\t// 错误信息\n\t\tList<String> errorMessage = new ArrayList<>();\n\t\tint successLines = 0, errorLines = 0;\n\t\tfor (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n\t\t\tMultipartFile file = entity.getValue();\n\t\t\tImportParams params = new ImportParams();\n\t\t\tparams.setTitleRows(2);\n\t\t\tparams.setHeadRows(1);\n\t\t\tparams.setNeedSave(true);\n\t\t\t//存放职位的map;key为名称 value为职位id。避免多次导入和查询\n\t\t\tMap<String, String> positionMap = new HashMap<>();\n\t\t\t//存放部门的map;key为名称 value为SysDepart对象。避免多次导入和查询\n\t\t\tMap<String, SysDepart> departMap = new HashMap<>();\n\t\t\ttry {\n\t\t\t\tList<AppExportUserVo> listSysUsers = ExcelImportUtil.importExcel(file.getInputStream(), AppExportUserVo.class, params);\n\t\t\t\tfor (int i = 0; i < listSysUsers.size(); i++) {\n\t\t\t\t\t//记录现在是多少行\n\t\t\t\t\tint lineNumber = i + 1;\n\t\t\t\t\t//记录是编辑还是添加\n\t\t\t\t\tboolean isEdit = false;\n\t\t\t\t\tAppExportUserVo sysUserExcel = listSysUsers.get(i);\n\t\t\t\t\tString id = sysUserExcel.getId();\n\t\t\t\t\tString workNo = sysUserExcel.getWorkNo();\n\t\t\t\t\tString email = sysUserExcel.getEmail();\n\t\t\t\t\tString phone = sysUserExcel.getPhone();\n\t\t\t\t\tString realname = sysUserExcel.getRealname();\n\t\t\t\t\tString depart = sysUserExcel.getDepart();\n\t\t\t\t\tString position = sysUserExcel.getPosition();\n\t\t\t\t\tSysUser sysUser = new SysUser();\n\t\t\t\t\t//判断id是否存在，如果存在的话就是更新\n\t\t\t\t\tif (oConvertUtils.isNotEmpty(id)) {\n\t\t\t\t\t\tSysUser user = userMapper.selectById(id);\n\t\t\t\t\t\tif (null == user) {\n\t\t\t\t\t\t\terrorLines++;\n\t\t\t\t\t\t\terrorMessage.add(\"第 \" + lineNumber + \" 行：用户不存在，请查看编号是否已修改，忽略导入。\");\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tisEdit = true;\n\t\t\t\t\t\tsysUser.setId(id);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t//处理租户中是否已存在，用户是否已存在，已存在的用户直接更新\n\t\t\t\t\t\tisEdit = false;\n\t\t\t\t\t}\n\t\t\t\t\tif (oConvertUtils.isNotEmpty(workNo)) {\n\t\t\t\t\t\tsysUser.setWorkNo(workNo);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (isEdit) {\n\t\t\t\t\t\t\tuserMapper.updateById(sysUser);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (oConvertUtils.isEmpty(phone)) {\n\t\t\t\t\t\t\t\terrorMessage.add(\"第 \" + lineNumber + \" 行：手机号为空，忽略导入。\");\n\t\t\t\t\t\t\t\terrorLines++;\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tSysUser userByPhone = userMapper.getUserByPhone(phone);\n\t\t\t\t\t\t\tif (null != userByPhone) {\n\t\t\t\t\t\t\t\t//查看看是否已经存在此租户中，存在禁止导入，否则直接更新即可\n\t\t\t\t\t\t\t\tInteger tenantCount = userTenantMapper.userTenantIzExist(userByPhone.getId(), tenantId);\n\t\t\t\t\t\t\t\tif (tenantCount > 0) {\n\t\t\t\t\t\t\t\t\terrorMessage.add(\"第 \" + lineNumber + \" 行：成员已存在该组织中，如果列表中不存在，请确认该成员是否在审核中或者已离职，忽略导入。\");\n\t\t\t\t\t\t\t\t\terrorLines++;\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsysUser.setId(userByPhone.getId());\n\t\t\t\t\t\t\t\tuserMapper.updateById(sysUser);\n\t\t\t\t\t\t\t\tthis.addUserTenant(sysUser.getId(), tenantId, userByPhone.getUsername(),sysTenant.getName());\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// 密码默认为 “租户门牌号+手机号”\n\t\t\t\t\t\t\t\tString password = sysTenant.getHouseNumber()+phone;\n\t\t\t\t\t\t\t\tString salt = oConvertUtils.randomGen(8);\n\t\t\t\t\t\t\t\tsysUser.setSalt(salt);\n\t\t\t\t\t\t\t\t// 密码加密加盐\n\t\t\t\t\t\t\t\tString passwordEncode = PasswordUtil.encrypt(phone, password, salt);\n\t\t\t\t\t\t\t\tsysUser.setPassword(passwordEncode);\n\t\t\t\t\t\t\t\tsysUser.setUsername(phone);\n\t\t\t\t\t\t\t\tsysUser.setRealname(oConvertUtils.getString(realname,phone));\n\t\t\t\t\t\t\t\tsysUser.setEmail(email);\n\t\t\t\t\t\t\t\tsysUser.setPhone(phone);\n\t\t\t\t\t\t\t\tsysUser.setStatus(CommonConstant.DEL_FLAG_1);\n\t\t\t\t\t\t\t\tsysUser.setDelFlag(CommonConstant.DEL_FLAG_0);\n\t\t\t\t\t\t\t\tsysUser.setCreateTime(new Date());\n\t\t\t\t\t\t\t\tuserMapper.insert(sysUser);\n\t\t\t\t\t\t\t\tthis.addUserTenant(sysUser.getId(), tenantId, sysUser.getUsername(),sysTenant.getName());\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//新增或编辑职位\n\t\t\t\t\t\tif (oConvertUtils.isNotEmpty(position)) {\n\t\t\t\t\t\t\tthis.addOrEditPosition(sysUser.getId(), position, isEdit, tenantId, positionMap);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//新增的时候才可以添加部门\n\t\t\t\t\t\tif (!isEdit) {\n\t\t\t\t\t\t\t//新增或编辑部门\n\t\t\t\t\t\t\tthis.addOrEditDepart(sysUser.getId(), depart, tenantId, departMap);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsuccessLines++;\n\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\terrorLines++;\n\t\t\t\t\t\tString message = e.getMessage().toLowerCase();\n\n\t\t\t\t\t\t// 通过索引名判断出错信息\n\t\t\t\t\t\tif (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_USER_USERNAME)) {\n\t\t\t\t\t\t\terrorMessage.add(\"第 \" + lineNumber + \" 行：用户名已经存在，忽略导入。\");\n\t\t\t\t\t\t} else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_USER_WORK_NO)) {\n\t\t\t\t\t\t\terrorMessage.add(\"第 \" + lineNumber + \" 行：工号已经存在，忽略导入。\");\n\t\t\t\t\t\t} else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_USER_PHONE)) {\n\t\t\t\t\t\t\terrorMessage.add(\"第 \" + lineNumber + \" 行：手机号已经存在，忽略导入。\");\n\t\t\t\t\t\t} else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_USER_EMAIL)) {\n\t\t\t\t\t\t\terrorMessage.add(\"第 \" + lineNumber + \" 行：电子邮件已经存在，忽略导入。\");\n\t\t\t\t\t\t} else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_USER)) {\n\t\t\t\t\t\t\terrorMessage.add(\"第 \" + lineNumber + \" 行：违反表唯一性约束。\");\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\terrorMessage.add(\"第 \" + lineNumber + \" 行：未知错误，忽略导入\");\n\t\t\t\t\t\t\tlog.error(e.getMessage(), e);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (Exception e) {\n\t\t\t\terrorMessage.add(\"发生异常：\" + e.getMessage());\n\t\t\t\tlog.error(e.getMessage(), e);\n\t\t\t} finally {\n\t\t\t\ttry {\n\t\t\t\t\tfile.getInputStream().close();\n\t\t\t\t} catch (IOException e) {\n\t\t\t\t\tlog.error(e.getMessage(), e);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\treturn ImportExcelUtil.imporReturnRes(errorLines, successLines, errorMessage);\n\t\t} catch (IOException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * 新增或者编辑职位\n\t *\n\t * @param userId      用户id\n\t * @param position    职位名称 已/拼接\n\t * @param isEdit      新增或编辑\n\t * @param positionMap 职位map key为name，value为职位id\n\t */\n\tprivate void addOrEditPosition(String userId, String position, Boolean isEdit, Integer tenantId, Map<String, String> positionMap) {\n\t\tPage<SysPosition> page = new Page<>(1, 1);\n\t\tString[] positions = position.split(SymbolConstant.SEMICOLON);\n\t\tList<String> positionList = Arrays.asList(positions);\n\t\tpositionList = positionList.stream().distinct().collect(Collectors.toList());\n\t\t//删除当前租户下的职位，根据职位名称、租户id、用户id\n\t\tsysUserPositionMapper.deleteUserPosByNameAndTenantId(positionList, tenantId, userId);\n\t\t//循环需要添加或修改的数据\n\t\tfor (String pos : positionList) {\n\t\t\tString posId = \"\";\n\t\t\tif (positionMap.containsKey(pos)) {\n\t\t\t\tposId = positionMap.get(pos);\n\t\t\t} else {\n\t\t\t\tList<String> namePage = sysPositionMapper.getPositionIdByName(pos, tenantId, page);\n\t\t\t\tif (CollectionUtil.isNotEmpty(namePage)) {\n\t\t\t\t\tposId = namePage.get(0);\n\t\t\t\t\tpositionMap.put(pos, posId);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//职位id不为空直接新增\n\t\t\tif (oConvertUtils.isNotEmpty(posId)) {\n\t\t\t\tthis.addSysUserPosition(userId, posId);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//不是编辑的情况下职位才会新增\n\t\t\tif (!isEdit) {\n\t\t\t\t//新增职位和用户职位关系\n\t\t\t\tSysPosition sysPosition = new SysPosition();\n\t\t\t\tsysPosition.setName(pos);\n\t\t\t\tsysPosition.setCode(RandomUtil.randomString(10));\n\t\t\t\tsysPosition.setTenantId(tenantId);\n\t\t\t\tsysPositionMapper.insert(sysPosition);\n\t\t\t\tpositionMap.put(pos, sysPosition.getId());\n\t\t\t\tthis.addSysUserPosition(userId, sysPosition.getId());\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * 添加用户职位\n\t */\n\tprivate void addSysUserPosition(String userId, String positionId) {\n\t\tLong count = sysUserPositionMapper.getUserPositionCount(userId, positionId);\n\t\tif(count == 0){\n\t\t\tSysUserPosition userPosition = new SysUserPosition();\n\t\t\tuserPosition.setUserId(userId);\n\t\t\tuserPosition.setPositionId(positionId);\n\t\t\tsysUserPositionMapper.insert(userPosition);\n\t\t}\n\t}\n\n\t/**\n\t * 新增或编辑部门\n\t *\n\t * @param userId    用户id\n\t * @param depart    部门名称\n\t * @param tenantId  租户id\n\t * @param departMap 存放部门的map;key为名称 value为SysDepart对象。\n\t */\n\tprivate void addOrEditDepart(String userId, String depart, Integer tenantId, Map<String, SysDepart> departMap) {\n\t\t//批量将部门和用户信息建立关联关系\n\t\tif (StringUtils.isNotEmpty(depart)) {\n\t\t\tPage<SysDepart> page = new Page<>(1, 1);\n\t\t\t//多个部门分离开\n\t\t\tString[] departNames = depart.split(SymbolConstant.SEMICOLON);\n\t\t\tList<String> departNameList = Arrays.asList(departNames);\n\t\t\tdepartNameList = departNameList.stream().distinct().collect(Collectors.toList());\n\t\t\tfor (String departName : departNameList) {\n                //部门id\n                String parentId = \"\";\n\t\t\t\tString[] names = departName.split(SymbolConstant.SINGLE_SLASH);\n\t\t\t\t//部门名称拼接\n\t\t\t\tString nameStr = \"\";\n\t\t\t\tfor (int i = 0; i < names.length; i++) {\n\t\t\t\t\tString name = names[i];\n\t\t\t\t\t//拼接name\n\t\t\t\t\tif (oConvertUtils.isNotEmpty(nameStr)) {\n\t\t\t\t\t\tnameStr = nameStr + SymbolConstant.SINGLE_SLASH + name;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnameStr = name;\n\t\t\t\t\t}\n\t\t\t\t\tSysDepart sysDepart = null;\n\t\t\t\t\t//判断map中是否存在该部门名称\n\t\t\t\t\tif (departMap.containsKey(nameStr)) {\n\t\t\t\t\t\tsysDepart = departMap.get(nameStr);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t//不存在需要去查询\n\t\t\t\t\t\tList<SysDepart> departPageByName = sysDepartMapper.getDepartPageByName(page, name, tenantId, parentId);\n\t\t\t\t\t\t//部门为空需要新增部门\n\t\t\t\t\t\tif (CollectionUtil.isEmpty(departPageByName)) {\n\t\t\t\t\t\t\tJSONObject formData = new JSONObject();\n\t\t\t\t\t\t\tformData.put(\"parentId\", parentId);\n\t\t\t\t\t\t\tString[] codeArray = (String[]) FillRuleUtil.executeRule(FillRuleConstant.DEPART, formData);\n\t\t\t\t\t\t\tsysDepart = new SysDepart();\n\t\t\t\t\t\t\tsysDepart.setParentId(parentId);\n\t\t\t\t\t\t\tsysDepart.setOrgCode(codeArray[0]);\n\t\t\t\t\t\t\tsysDepart.setOrgType(codeArray[1]);\n\t\t\t\t\t\t\tsysDepart.setTenantId(tenantId);\n\t\t\t\t\t\t\tsysDepart.setDepartName(name);\n\t\t\t\t\t\t\tsysDepart.setIzLeaf(CommonConstant.IS_LEAF);\n\t\t\t\t\t\t\tsysDepart.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0));\n\t\t\t\t\t\t\tsysDepart.setStatus(CommonConstant.STATUS_1);\n\t\t\t\t\t\t\tsysDepartMapper.insert(sysDepart);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsysDepart = departPageByName.get(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//父级id不为空那么就将父级部门改成不是叶子节点\n\t\t\t\t\t\tif (oConvertUtils.isNotEmpty(parentId)) {\n\t\t\t\t\t\t\tsysDepartMapper.setMainLeaf(parentId, CommonConstant.NOT_LEAF);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparentId = sysDepart.getId();\n\t\t\t\t\t\tdepartMap.put(nameStr, sysDepart);\n\t\t\t\t\t}\n\t\t\t\t\t//最后一位新增部门用户关系表\n\t\t\t\t\tif (i == names.length - 1) {\n\t\t\t\t\t\tLong count = sysUserDepartMapper.getCountByDepartIdAndUserId(userId, sysDepart.getId());\n\t\t\t\t\t\tif(count == 0){\n\t\t\t\t\t\t\tSysUserDepart userDepart = new SysUserDepart(userId, sysDepart.getId());\n\t\t\t\t\t\t\tsysUserDepartMapper.insert(userDepart);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * 添加用户租户\n\t *\n\t * @param userId\n\t * @param tenantId\n\t * @param invitedUsername 被邀请人的账号\n\t * @param tenantName 租户名称 \n\t */\n\tprivate void addUserTenant(String userId, Integer tenantId, String invitedUsername, String tenantName) {\n\t\tSysUserTenant userTenant = new SysUserTenant();\n\t\tuserTenant.setTenantId(tenantId);\n\t\tuserTenant.setUserId(userId);\n\t\tuserTenant.setStatus(CommonConstant.USER_TENANT_INVITE);\n\t\tuserTenantMapper.insert(userTenant);\n\t\t//发送系统消息通知\n\t\tLoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\t\tMessageDTO messageDTO = new MessageDTO();\n\t\tString title = sysUser.getRealname() + \" 邀请您加入 \" + tenantName + \"。\";\n\t\tmessageDTO.setTitle(title);\n\t\tMap<String, Object> data = new HashMap<>();\n\t\t// 代码逻辑说明: 【QQYUN-8425】用户导入成功后 消息提醒 跳转至同意页面---\n\t\tdata.put(CommonConstant.NOTICE_MSG_BUS_TYPE,SysAnnmentTypeEnum.TENANT_INVITE.getType());\n\t\tmessageDTO.setData(data);\n\t\tmessageDTO.setContent(title);\n\t\tmessageDTO.setToUser(invitedUsername);\n\t\tmessageDTO.setFromUser(\"system\");\n\t\tsystemSendMsgHandle.sendMessage(messageDTO);\n\t}\n\t//======================================= end 用户与部门 用户列表导入 =========================================\n\t\n\t@Override\n\tpublic void checkUserAdminRejectDel(String userIds) {\n\t\tLambdaQueryWrapper<SysUser> query = new LambdaQueryWrapper<>();\n\t\tquery.in(SysUser::getId,Arrays.asList(userIds.split(SymbolConstant.COMMA)));\n\t\tquery.eq(SysUser::getUsername,\"admin\");\n\t\tLong adminRoleCount = this.baseMapper.selectCount(query);\n\t\t//大于0说明存在管理员用户，不允许删除\n\t\tif(adminRoleCount>0){\n\t\t\tthrow new JeecgBootException(\"admin用户，不允许删除！\");\n\t\t}\n\t}\n\n\t@Override\n\tpublic void changePhone(JSONObject json, String username) {\n\t\tString smscode = json.getString(\"smscode\");\n\t\tString phone = json.getString(\"phone\");\n\t\tString type = json.getString(\"type\");\n\t\tif(oConvertUtils.isEmpty(phone)){\n\t\t\tthrow new JeecgBootException(\"请填写原手机号！\");\n\t\t}\n\t\tif(oConvertUtils.isEmpty(smscode)){\n\t\t\tthrow new JeecgBootException(\"请填写验证码！\");\n\t\t}\n\t\t//step1 验证原手机号是否和当前用户匹配\n\t\tSysUser sysUser = userMapper.getUserByNameAndPhone(phone,username);\n\t\tif (null == sysUser){\n\t\t\tthrow new JeecgBootException(\"原手机号不匹配，无法修改密码！\");\n\t\t}\n\t\t//step2 根据类型判断是验证原手机号的验证码还是新手机号的验证码\n\t\t//验证原手机号\n\t\tif(CommonConstant.VERIFY_ORIGINAL_PHONE.equals(type)){\n\t\t\tthis.verifyPhone(phone, smscode);\n\t\t}else if(CommonConstant.UPDATE_PHONE.equals(type)){\n\t\t\t//修改手机号\n\t\t\tString newPhone = json.getString(\"newPhone\");\n\t\t\t//需要验证新手机号和原手机号是否一致，一致不让修改\n\t\t\tif(newPhone.equals(phone)){\n\t\t\t\tthrow new JeecgBootException(\"新手机号与原手机号一致，无法修改！\");\n\t\t\t}\n\t\t\tthis.verifyPhone(newPhone, smscode);\n\t\t\t//step3 新手机号验证码验证成功之后即可修改手机号\n\t\t\tsysUser.setPhone(newPhone);\n\t\t\tuserMapper.updateById(sysUser);\n\t\t}\n\t}\n\t\n\t/**\n\t * 验证手机号\n\t *\n\t * @param phone\n\t * @param smsCode\n\t * @return\n\t */\n\tpublic void verifyPhone(String phone, String smsCode){\n\t\tString phoneKey = CommonConstant.CHANGE_PHONE_REDIS_KEY_PRE + phone;\n\t\tObject phoneCode = redisUtil.get(phoneKey);\n\t\tif(null == phoneCode){\n\t\t\tthrow new JeecgBootException(\"验证码失效，请重新发送验证码！\");\n\t\t}\n\t\tif(!smsCode.equals(phoneCode.toString())) {\n\t\t\tthrow new JeecgBootException(\"短信验证码不匹配！\");\n\t\t}\n\t\t//验证完成之后清空手机验证码\n\t\tredisUtil.removeAll(phoneKey);\n\t}\n\t\n\t@Override\n\tpublic void sendChangePhoneSms(JSONObject jsonObject, String username, String ipAddress) {\n\t\tString type = jsonObject.getString(\"type\");\n\t\tString phone = jsonObject.getString(\"phone\");\n\t\tif(oConvertUtils.isEmpty(phone)){\n\t\t\tthrow new JeecgBootException(\"请填写手机号！\");\n\t\t}\n\t\t//step1 根据类型判断是发送旧手机号验证码还是新的手机号验证码\n\t\tif(CommonConstant.VERIFY_ORIGINAL_PHONE.equals(type)){\n\t\t\t//step2 旧手机号验证码需要验证手机号是否匹配\n\t\t\tSysUser sysUser = userMapper.getUserByNameAndPhone(phone, username);\n\t\t\tif(null == sysUser){\n\t\t\t\tthrow new JeecgBootException(\"旧手机号不匹配，无法修改手机号！\");\n\t\t\t}\n\t\t}else if(CommonConstant.UPDATE_PHONE.equals(type)){\n\t\t\t//step3 新手机号需要验证手机号码是否已注册过\n\t\t\tSysUser userByPhone = userMapper.getUserByPhone(phone);\n\t\t\tif(null != userByPhone){\n\t\t\t\tthrow new JeecgBootException(\"手机号已被注册，请尝试其他手机号！\");\n\t\t\t}\n\t\t}\n\t\t//step4 发送短信验证码\n\t\tString redisKey = CommonConstant.CHANGE_PHONE_REDIS_KEY_PRE+phone;\n\t\tthis.sendPhoneSms(phone, ipAddress,redisKey);\n\t}\n\n\t@Override\n\tpublic void sendLogOffPhoneSms(JSONObject jsonObject, String username, String ipAddress) {\n\t\tString phone = jsonObject.getString(\"phone\");\n\t\t//通过用户名查询数据库中的手机号\n\t\tSysUser userByNameAndPhone = userMapper.getUserByNameAndPhone(phone, username);\n\t\tif (null == userByNameAndPhone) {\n\t\t\tthrow new JeecgBootException(\"当前用户手机号不匹配，无法修改！\");\n\t\t}\n\t\tString code = CommonConstant.LOG_OFF_PHONE_REDIS_KEY_PRE + phone;\n\t\tthis.sendPhoneSms(phone, ipAddress, code);\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void userLogOff(JSONObject jsonObject, String username) {\n\t\tString phone = jsonObject.getString(\"phone\");\n\t\tString smsCode = jsonObject.getString(\"smscode\");\n\t\t//通过用户名查询数据库中的手机号\n\t\tSysUser userByNameAndPhone = userMapper.getUserByNameAndPhone(phone, username);\n\t\tif (null == userByNameAndPhone) {\n\t\t\tthrow new JeecgBootException(\"当前用户手机号不匹配，无法注销！\");\n\t\t}\n\t\tString code = CommonConstant.LOG_OFF_PHONE_REDIS_KEY_PRE + phone;\n\t\tObject redisSmdCode = redisUtil.get(code);\n\t\tif (null == redisSmdCode) {\n\t\t\tthrow new JeecgBootException(\"验证码失效，无法注销！\");\n\t\t}\n\t\tif (!redisSmdCode.toString().equals(smsCode)) {\n\t\t\tthrow new JeecgBootException(\"验证码不匹配，无法注销！\");\n\t\t}\n\t\tthis.deleteUser(userByNameAndPhone.getId());\n\t\tredisUtil.removeAll(code);\n\t\tredisUtil.removeAll(CacheConstant.SYS_USERS_CACHE + phone);\n\t}\n\n\t/**\n\t * 发送短信验证码\n\t * @param phone\n\t */\n\tprivate void sendPhoneSms(String phone, String clientIp,String redisKey) {\n\t\tObject object = redisUtil.get(redisKey);\n\n\t\tif (object != null) {\n\t\t\tthrow new JeecgBootException(\"验证码10分钟内，仍然有效！\");\n\t\t}\n\n\t\t//增加 check防止恶意刷短信接口\n\t\tif(!DySmsLimit.canSendSms(clientIp)){\n\t\t\tlog.warn(\"--------[警告] IP地址:{}, 短信接口请求太多-------\", clientIp);\n\t\t\tthrow new JeecgBootException(\"短信接口请求太多，请稍后再试！\", CommonConstant.PHONE_SMS_FAIL_CODE);\n\t\t}\n\t\t\n\t\t//随机数\n\t\tString captcha = RandomUtil.randomNumbers(6);\n\t\tJSONObject obj = new JSONObject();\n\t\tobj.put(\"code\", captcha);\n\t\ttry {\n\t\t\tboolean sendSmsSuccess = DySmsHelper.sendSms(phone, obj, DySmsEnum.LOGIN_TEMPLATE_CODE);\n\t\t\tif(!sendSmsSuccess){\n\t\t\t\tthrow new JeecgBootException(\"短信验证码发送失败,请稍后重试！\");\n\t\t\t}\n\t\t\t//验证码10分钟内有效\n\t\t\tredisUtil.set(redisKey, captcha, 600);\n\t\t} catch (ClientException e) {\n\t\t\tlog.error(e.getMessage(),e);\n\t\t\tthrow new JeecgBootException(\"短信接口未配置，请联系管理员！\");\n\t\t}\n\t}\n\n    //================================================= begin 低代码部门导入导出 ================================================================\n    @Override\n    public List<SysUserExportVo> getDepartAndRoleExportMsg(List<SysUser> userList) {\n        List<SysUserExportVo> list = new ArrayList<>();\n        if (CollectionUtil.isNotEmpty(userList)) {\n            //获取部门\n            List<SysUserDepVo> userDepVos = sysDepartMapper.getUserDepartByUserId(userList);\n            //获取角色\n            List<SysUserPositionVo> sysRoles = sysRoleMapper.getUserRoleByUserId(userList);\n            //存放职位名称的map，key：主岗位的id value: 职级的名称\n            Map<String, String> postNameMap = new HashMap<>();\n            //组装数据并返回\n            for (SysUser sysUser : userList) {\n                SysUserExportVo userExportVo = new SysUserExportVo();\n                BeanUtils.copyProperties(sysUser, userExportVo);\n                // 代码逻辑说明: 【QQYUN-13617】导入时 部门添加层级不对了---\n                Map<String, String> departMap = this.getDepartNamesAndCategory(userDepVos, sysUser);\n                String departNames = departMap.get(\"departNames\");\n                userExportVo.setDepartNames(departNames);\n                userExportVo.setOrgCategorys(departMap.get(\"departOrgCategorys\"));\n                String departIds = sysUser.getDepartIds();\n                if (oConvertUtils.isNotEmpty(departIds)) {\n                    List<SysUserDepVo> depVoList = sysDepartMapper.getDepartByIds(Arrays.asList(departIds.split(\",\")));\n                    Map<String, String> departMaps = this.getDepartNamesAndCategory(userDepVos, sysUser);\n                    userExportVo.setDepartIds(departMaps.get(\"departNames\"));\n                }\n                String posNames = sysRoles.stream().filter(item -> item.getUserId().equals(sysUser.getId())).map(SysUserPositionVo::getName).collect(Collectors.joining(SymbolConstant.SEMICOLON));\n                userExportVo.setRoleNames(posNames);\n                if (null != sysUser.getMainDepPostId()) {\n                    String postName = \"\";\n                    if (null != postNameMap && postNameMap.containsKey(sysUser.getMainDepPostId())) {\n                        postName = postNameMap.get(sysUser.getMainDepPostId());\n                    } else {\n                        postName = sysDepartMapper.getPostNameByPostId(sysUser.getMainDepPostId());\n                    }\n                    userExportVo.setPostName(postName);\n                    postNameMap.put(sysUser.getMainDepPostId(), postName);\n                }\n                // 代码逻辑说明: 兼职岗位改造成中间表的方式---\n                List<String> depPost = depPostMapper.getDepPostByUserId(sysUser.getId());\n                if(CollectionUtil.isNotEmpty(depPost)){\n                    userExportVo.setOtherDepPostId(String.join(SymbolConstant.COMMA, depPost));\n                }\n                list.add(userExportVo);\n            }\n        }\n        return list;\n    }\n\n    @Override\n    public Result<?> importSysUser(HttpServletRequest request) {\n        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n        String fileKey = multipartRequest.getParameter(\"fileKey\");\n        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n        // 错误信息\n        List<String> errorMessage = new ArrayList<>();\n        int successLines = 0, errorLines = 0;\n        //存放部门的map;key为名称 value为SysDepart对象。避免多次导入和查询\n        Map<String, SysDepart> departMap = new HashMap<>();\n        //职级map key: 职级名称 value: 职级id\n        Map<String, String> positionMap = new HashMap<>();\n        //岗位map key：岗位名称 + 部门id value：岗位（部门id）\n        Map<String,String> postMap = new HashMap<>();\n        String tenantId = TokenUtils.getTenantIdByRequest(request);\n        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n            MultipartFile file = entity.getValue();// 获取上传文件对象\n            ImportParams params = new ImportParams();\n            params.setTitleRows(2);\n            params.setHeadRows(1);\n            params.setNeedSave(true);\n            try {\n                List<SysUserImportVo> listSysUsers = ExcelImportUtil.importExcel(file.getInputStream(), SysUserImportVo.class, params);\n                ImportSysUserCache.setImportSysUserMap(fileKey,0,listSysUsers.size(),\"user\");\n                for (int i = 0; i < listSysUsers.size(); i++) {\n                    SysUserImportVo sysUserExcel = listSysUsers.get(i);\n                    SysUser sysUser = new SysUser();\n                    BeanUtils.copyProperties(sysUserExcel, sysUser);\n                    if (oConvertUtils.isEmpty(sysUser.getUsername())) {\n                        errorLines += 1;\n                        int lineNumber = i + 1;\n                        errorMessage.add(\"第 \" + lineNumber + \" 行：用户账号为空，忽略导入。\");\n                        continue;\n                    }\n                    try {\n                        String username = sysUser.getUsername();\n                        //根据用户名程序，为空则添加用户\n                        SysUser userByName = userMapper.getUserByName(username);\n                        if (null != userByName) {\n                            errorLines += 1;\n                            int lineNumber = i + 1;\n                            errorMessage.add(\"第 \" + lineNumber + \" 行：用户名已经存在，忽略导入。\");\n                            continue;\n                        } else {\n                            // 密码默认为 “123456”\n                            sysUser.setPassword(PasswordConstant.DEFAULT_PASSWORD);\n                            // 密码加密加盐\n                            String salt = oConvertUtils.randomGen(8);\n                            sysUser.setSalt(salt);\n                            String passwordEncode = PasswordUtil.encrypt(sysUserExcel.getUsername(), sysUser.getPassword(), salt);\n                            sysUser.setPassword(passwordEncode);\n                            sysUser.setActivitiSync(CommonConstant.ACT_SYNC_1);\n                            if(null == sysUser.getDelFlag()){\n                                sysUser.setDelFlag(CommonConstant.DEL_FLAG_0);\n                            }\n                            if(null == sysUser.getStatus()){\n                                sysUser.setStatus(CommonConstant.STATUS_1_INT);\n                            }\n                            this.save(sysUser);\n                        }\n                        //添加部门\n                        String departNames = sysUserExcel.getDepartNames();\n                        String orgCategorys = sysUserExcel.getOrgCategorys();\n                        //新增或编辑部门\n                        Integer tenantIdInt = 0;\n                        if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n                            tenantIdInt = oConvertUtils.getInt(tenantId, 0);\n                        }\n                        this.lowAddOrEditDepart(sysUser.getId(), departNames, tenantIdInt, departMap, orgCategorys, sysUserExcel.getPostName(), sysUserExcel.getMainDepPostId(),postMap,positionMap, sysUserExcel.getOtherDepPostId());\n                        //新增或编辑角色\n                        String roleNames = sysUserExcel.getRoleNames();\n                        this.saveOrEditRole(sysUser.getId(), roleNames, tenantIdInt);\n                        //新增或编辑职位\n                       /* String position = sysUserExcel.getPost();\n                        if (oConvertUtils.isNotEmpty(position)) {\n                            this.addOrEditPosition(sysUser.getId(), position, false, tenantIdInt, positionMap);\n                        }*/\n                        //添加负责部门\n                        this.saveChargeDepart(sysUser, sysUserExcel.getDepartIds(), departMap);\n                        successLines++;\n                    } catch (Exception e) {\n                        errorLines++;\n                        String message = e.getMessage().toLowerCase();\n                        int lineNumber = i + 1;\n                        // 通过索引名判断出错信息\n                        if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_USER_USERNAME)) {\n                            errorMessage.add(\"第 \" + lineNumber + \" 行：用户名已经存在，忽略导入。\");\n                        } else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_USER_WORK_NO)) {\n                            errorMessage.add(\"第 \" + lineNumber + \" 行：工号已经存在，忽略导入。\");\n                        } else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_USER_PHONE)) {\n                            errorMessage.add(\"第 \" + lineNumber + \" 行：手机号已经存在，忽略导入。\");\n                        } else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_USER_EMAIL)) {\n                            errorMessage.add(\"第 \" + lineNumber + \" 行：电子邮件已经存在，忽略导入。\");\n                        } else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_USER)) {\n                            errorMessage.add(\"第 \" + lineNumber + \" 行：违反表唯一性约束。\");\n                        } else {\n                            errorMessage.add(\"第 \" + lineNumber + \" 行：未知错误，忽略导入\");\n                            log.error(e.getMessage(), e);\n                        }\n                    }\n                    ImportSysUserCache.setImportSysUserMap(fileKey,i,listSysUsers.size(),\"user\");\n                }\n            } catch (Exception e) {\n                ImportSysUserCache.removeImportLowAppMap(fileKey);\n                errorMessage.add(\"发生异常：\" + e.getMessage());\n                log.error(e.getMessage(), e);\n            } finally {\n                try {\n                    file.getInputStream().close();\n                } catch (IOException e) {\n                    ImportSysUserCache.removeImportLowAppMap(fileKey);\n                    log.error(e.getMessage(), e);\n                }\n            }\n        }\n        try {\n            departMap.clear();\n            departMap = null;\n            //最终导入完成\n            ImportSysUserCache.setImportSysUserMap(fileKey,1,1,\"user\");\n            return ImportExcelUtil.imporReturnRes(errorLines, successLines, errorMessage);\n        } catch (IOException e) {\n            ImportSysUserCache.removeImportLowAppMap(fileKey);\n            throw new RuntimeException(e);\n        }\n    }\n\n    //================================================================ begin 【用户导入】导入时 部门添加层级不对了======================================================================\n    /**\n     * 低代码下添加部门和用户\n     *\n     * @param userId          用户id\n     * @param depart          部门名称\n     * @param tenantId        租户id\n     * @param departMap       存放部门的map;key为名称 value为SysDepart对象。\n     * @param orgCategorys    部门类型\n     * @param postName        职级名称\n     * @param mainDepPostName 主岗位名称\n     * @param postMap         key: 岗位名称 + 部门id value：岗位（部门id）\n     * @param positionMap     key: 职级名称  value: 职级id\n     * @param otherDepPostName 兼职岗位名称\n     * @Description 和敲敲云分割处理，原因：因低代码岗位等改造，有级别，故添加部门分开处理\n     */\n    private void lowAddOrEditDepart(String userId, String depart, Integer tenantId, Map<String, SysDepart> departMap, String orgCategorys, String postName, String mainDepPostName, Map<String, String> postMap, Map<String, String> positionMap, String otherDepPostName) {\n        //批量将部门和用户信息建立关联关系\n        if (StringUtils.isNotEmpty(depart)) {\n            Page<SysDepart> page = new Page<>(1, 1);\n            //多个部门分离开\n            String[] departNames = depart.split(SymbolConstant.SEMICOLON);\n            List<String> departNameList = Arrays.asList(departNames);\n            //部门类型\n            List<String> categoryList = new ArrayList<>();\n            if (oConvertUtils.isNotEmpty(orgCategorys)) {\n                categoryList = Arrays.asList(orgCategorys.split(SymbolConstant.SEMICOLON));\n            }\n            departNameList = departNameList.stream().distinct().collect(Collectors.toList());\n            //当下部门循环下标\n            int index = 0;\n            //是否已导入岗位，岗位只导入第一个部门下\n            boolean izImportPost = false;\n            for (String departName : departNameList) {\n                //部门id\n                String parentId = \"\";\n                String[] names = departName.split(SymbolConstant.SINGLE_SLASH);\n                //部门名称拼接\n                String nameStr = \"\";\n                //部门类型\n                String[] orgCategory = null;\n                if (categoryList != null && categoryList.size() > index) {\n                    orgCategory = categoryList.get(index).split(SymbolConstant.SINGLE_SLASH);\n                }\n                for (int i = 0; i < names.length; i++) {\n                    String name = names[i];\n                    //拼接name\n                    if (oConvertUtils.isNotEmpty(nameStr)) {\n                        nameStr = nameStr + SymbolConstant.SINGLE_SLASH + name;\n                    } else {\n                        nameStr = name;\n                    }\n                    SysDepart sysDepart = null;\n                    //默认部门\n                    String category = DepartCategoryEnum.DEPART_CATEGORY_DEPART.getValue();\n                    if (null != orgCategory && orgCategory.length > i) {\n                        category = orgCategory[i];\n                    }\n                    //判断map中是否存在该部门名称\n                    if (departMap.containsKey(nameStr)) {\n                        sysDepart = departMap.get(nameStr);\n                        parentId = sysDepart.getId();\n                    } else {\n                        //不存在需要去查询\n                        List<SysDepart> departPageByName = sysDepartMapper.getDepartPageByName(page, name, tenantId, parentId);\n                        //部门为空需要新增部门\n                        if (CollectionUtil.isEmpty(departPageByName)) {\n                            JSONObject formData = new JSONObject();\n                            formData.put(\"parentId\", parentId);\n                            String[] codeArray = (String[]) FillRuleUtil.executeRule(FillRuleConstant.DEPART, formData);\n                            sysDepart = new SysDepart();\n                            sysDepart.setParentId(parentId);\n                            sysDepart.setOrgCode(codeArray[0]);\n                            sysDepart.setOrgType(codeArray[1]);\n                            sysDepart.setTenantId(tenantId);\n                            sysDepart.setDepartName(name);\n                            sysDepart.setIzLeaf(CommonConstant.IS_LEAF);\n                            sysDepart.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0));\n                            sysDepart.setStatus(CommonConstant.STATUS_1);\n                            sysDepart.setOrgCategory(DepartCategoryEnum.getValueByName(category));\n                            sysDepartMapper.insert(sysDepart);\n                        } else {\n                            sysDepart = departPageByName.get(0);\n                        }\n                        //父级id不为空那么就将父级部门改成不是叶子节点\n                        if (oConvertUtils.isNotEmpty(parentId)) {\n                            sysDepartMapper.setMainLeaf(parentId, CommonConstant.NOT_LEAF);\n                        }\n                        parentId = sysDepart.getId();\n                        departMap.put(nameStr, sysDepart);\n                    }\n                    //最后一位新增部门用户关系表\n                    if (i == names.length - 1 && !izImportPost) {\n                        Long count = sysUserDepartMapper.getCountByDepartIdAndUserId(userId, sysDepart.getId());\n                        if (count == 0) {\n                            SysUserDepart userDepart = new SysUserDepart(userId, sysDepart.getId());\n                            sysUserDepartMapper.insert(userDepart);\n                        }\n                        //添加岗位\n                        if (oConvertUtils.isNotEmpty(mainDepPostName)) {\n                            this.insertDepartPost(userId, parentId ,postName, mainDepPostName, postMap, tenantId, positionMap);\n                        }\n                        //添加兼职岗位\n                        if(oConvertUtils.isNotEmpty(otherDepPostName)){\n                            this.insertOtherDepartPost(userId,parentId,postName, otherDepPostName, postMap, tenantId, positionMap);\n                        }\n                        izImportPost = true;\n                    }\n                }\n                index++;\n            }\n        }\n    }\n\n    /**\n     * 添加部门岗位\n     *\n     * @param mainDepPost 岗位名称\n     * @param userId      用户id\n     * @param departId    部门id【上级部门id】\n     * @param postName    职级名称\n     * @param mainDepPostName    岗位名称\n     * @param postMap     岗位map key：岗位名称 + 部门id value：岗位（部门id）\n     * @param tenantId    租户id\n     * @param postionMap  职级map key: 职级名称 value: 职级id\n     */\n    private void insertDepartPost(String userId, String depId, String postName, String mainDepPostName, Map<String, String> postMap, Integer tenantId, Map<String, String> postionMap) {\n        if(mainDepPostName.contains(SymbolConstant.COMMA)){\n            mainDepPostName = mainDepPostName.split(SymbolConstant.COMMA)[0];\n        }\n        //当前部门下已经存在岗位就不需要再次添加岗位了\n        if (null == postMap || !postMap.containsKey(mainDepPostName + depId)) {\n            //根据父级部门id和职务名称查找岗位id\n            String departId = sysDepartMapper.getDepIdByDepIdAndPostName(depId, postName);\n            //不存在新增岗位\n            if (oConvertUtils.isEmpty(departId) ) {\n                //添加部门岗位信息\n                departId = this.addCommontDepartPost(depId, tenantId, mainDepPostName, postionMap, postName, postMap);\n            }\n            if(oConvertUtils.isNotEmpty(departId)){\n                //更新用户主岗位\n                SysUser user = new SysUser();\n                user.setId(userId);\n                user.setMainDepPostId(departId);\n                userMapper.updateById(user); \n            }\n        }\n    }\n\n    /**\n     * 导入通用添加部门岗位方法\n     *\n     * @param depId\n     * @param tenantId\n     * @param mainDepPostName\n     * @param postionMap\n     * @param postName\n     * @param map\n     * @param postMap\n     * @return\n     */\n    private String addCommontDepartPost(String depId, Integer tenantId, String mainDepPostName, Map<String, String> postionMap, String postName, Map<String, String> postMap) {\n        //新增岗位\n        SysDepart sysDepart = new SysDepart();\n        JSONObject formData = new JSONObject();\n        formData.put(\"parentId\", depId);\n        String[] codeArray = (String[]) FillRuleUtil.executeRule(FillRuleConstant.DEPART, formData);\n        sysDepart.setParentId(depId);\n        sysDepart.setOrgCode(codeArray[0]);\n        sysDepart.setOrgType(codeArray[1]);\n        sysDepart.setTenantId(tenantId);\n        sysDepart.setDepartName(mainDepPostName);\n        sysDepart.setIzLeaf(CommonConstant.IS_LEAF);\n        sysDepart.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0));\n        sysDepart.setStatus(CommonConstant.STATUS_1);\n        sysDepart.setOrgCategory(DepartCategoryEnum.DEPART_CATEGORY_POST.getValue());\n        //获取职级id\n        String positionId = \"\";\n        if (postionMap.containsKey(postName)) {\n            positionId = postionMap.get(postName);\n        } else {\n            //根据租户id和职级名称获取职级id\n            positionId = this.getSysPosition(tenantId, postName);\n        }\n        sysDepart.setPositionId(positionId);\n        postionMap.put(postName, positionId);\n        sysDepartMapper.insert(sysDepart);\n        sysDepartMapper.setMainLeaf(depId, CommonConstant.NOT_LEAF);\n        postMap.put(mainDepPostName + depId, sysDepart.getId());\n        //需要将用户表的主岗位进行关联\n        return sysDepart.getId();\n    }\n\n    /**\n     * 添加兼职岗位\n     *\n     * @param userId           用户id\n     * @param departId         部门id【上级部门id】\n     * @param postName         职级名称\n     * @param otherDepPostName 兼职岗位名称\n     * @param postMap          岗位map key：岗位名称 + 部门id value：岗位（部门id）\n     * @param tenantId         租户id\n     * @param postionMap       职级map key: 职级名称 value: 职级id\n     */\n    private void insertOtherDepartPost(String userId, String depId, String postName, String otherDepPostName, Map<String, String> postMap, Integer tenantId, Map<String, String> positionMap) {\n        String[] otherDepPostNames = otherDepPostName.split(SymbolConstant.SEMICOLON);\n        for (int i = 0; i < otherDepPostNames.length; i++) {\n            //当前部门下已经存在岗位就不需要再次添加岗位了\n            String departId = \"\";\n            if (null == postMap || !postMap.containsKey(otherDepPostNames[i] + depId)) {\n                //不存在时新增部门岗位\n                departId = this.addCommontDepartPost(depId, tenantId, otherDepPostNames[i], positionMap, postName, postMap);\n            } else {\n                departId = postMap.get(otherDepPostNames[i] + depId);\n            }\n            //插入用岗位第三方中间表\n            if (oConvertUtils.isNotEmpty(departId)) {\n                try {\n                    SysUserDepPost depPost = new SysUserDepPost(userId, departId);\n                    depPostMapper.insert(depPost);\n                } catch (Exception e) {\n                    log.error(\"当前岗位插入失败：\" + e.getMessage(), e);\n                }\n            }\n        }\n    }\n\n    /**\n     * 获取职务信息\n     *\n     * @param tenantId\n     * @param postName\n     * @return\n     */\n    private String getSysPosition(Integer tenantId, String postName) {\n        tenantId = oConvertUtils.getInt(tenantId,0);\n        Page<SysPosition> page = new Page<>(1, 1);\n        List<String> namePage = sysPositionMapper.getPositionIdByName(postName, tenantId, page);\n        if (CollectionUtil.isNotEmpty(namePage)) {\n            return namePage.get(0);\n        }\n        return \"\";\n    }\n    //================================================================ end 【用户导入】导入时 部门添加层级不对了======================================================================\n    \n    private void saveChargeDepart(SysUser sysUser, String departIds, Map<String, SysDepart> departMap) {\n        //判断那些部门没有，即没有加入到部门，则不能成为负责部门人员\n        if (oConvertUtils.isEmpty(departIds)) {\n            return;\n        }\n        //多个部门用;分隔开\n        String[] split = departIds.split(SymbolConstant.SEMICOLON);\n        //负责部门id\n        StringBuilder departIdBulider = new StringBuilder();\n        for (String name : split) {\n            if (departMap.containsKey(name)) {\n                SysDepart sysDepart = departMap.get(name);\n                departIdBulider.append(sysDepart.getId()).append(\",\");\n            }\n        }\n        // 检查并删除最后一个逗号\n        if (departIdBulider.length() > 0 && departIdBulider.charAt(departIdBulider.length() - 1) == ',') {\n            departIdBulider.deleteCharAt(departIdBulider.length() - 1);\n        }\n        SysUser user = new SysUser();\n        user.setId(sysUser.getId());\n        user.setDepartIds(departIdBulider.toString());\n        this.updateById(user);\n    }\n\n    /**\n     * 保存或编辑角色\n     *\n     * @param userId\n     * @param roleNames\n     * @param tenantIdInt\n     */\n    private void saveOrEditRole(String userId, String roleNames, Integer tenantIdInt) {\n        if (oConvertUtils.isEmpty(roleNames)) {\n            return;\n        }\n        String[] roleNameArray = roleNames.split(SymbolConstant.SEMICOLON);\n        //删除用户下的角色\n        LambdaQueryWrapper<SysUserRole> deleteQuery = new LambdaQueryWrapper<>();\n        deleteQuery.eq(SysUserRole::getUserId, userId);\n        sysUserRoleMapper.delete(deleteQuery);\n        //通过名字获取角色\n        LambdaQueryWrapper<SysRole> roleQuery = new LambdaQueryWrapper<>();\n        roleQuery.orderByDesc(SysRole::getCreateTime);\n        if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n            roleQuery.eq(SysRole::getTenantId, tenantIdInt);\n        }\n        for (String roleName : roleNameArray) {\n            roleQuery.eq(SysRole::getRoleName, roleName);\n            List<SysRole> sysRoles = sysRoleMapper.selectList(roleQuery);\n            String roleId = \"\";\n            if (CollectionUtil.isNotEmpty(sysRoles)) {\n                roleId = sysRoles.get(0).getId();\n            } else {\n                SysRole sysRole = new SysRole();\n                sysRole.setRoleName(roleName);\n                sysRole.setRoleCode(RandomUtil.randomString(10));\n                sysRoleMapper.insert(sysRole);\n                roleId = sysRole.getId();\n            }\n            SysUserRole sysUserRole = new SysUserRole();\n            sysUserRole.setUserId(userId);\n            sysUserRole.setRoleId(roleId);\n            sysUserRoleMapper.insert(sysUserRole);\n        }\n    }\n    //================================================= end 低代码部门导入导出 ================================================================\n\n    @Override\n    public void updatePasswordNotBindPhone(String oldPassword, String password, String username) {\n        LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();\n        //step1 只能修改自己的密码\n        if(!sysUser.getUsername().equals(username)){\n            throw new JeecgBootBizTipException(\"只允许修改自己的密码！\");\n        }\n        //step2 用户不存在禁止修改密码\n        SysUser user = this.getUserByName(username);\n        if(null == user){\n            throw new JeecgBootBizTipException(\"用户不存在，无法修改密码！\");\n        }\n        //setp3 如果手机号存在需要用手机号修改密码的方式\n        if(oConvertUtils.isNotEmpty(user.getPhone())){\n            throw new JeecgBootBizTipException(\"手机号不为空，请根据手机号进行修改密码操作！\");\n        }\n        //step4 判断旧密码是否正确\n        String passwordEncode = PasswordUtil.encrypt(username, oldPassword, user.getSalt());\n        if (!user.getPassword().equals(passwordEncode)) {\n            throw new JeecgBootBizTipException(\"旧密码输入错误!\");\n        }\n        if (oConvertUtils.isEmpty(password)) {\n            throw new JeecgBootBizTipException(\"新密码不允许为空!\");\n        }\n        //step5 修改密码\n        String newPassWord = PasswordUtil.encrypt(username, password, user.getSalt());\n        this.userMapper.update(new SysUser().setPassword(newPassWord).setLastPwdUpdateTime(new Date()), new LambdaQueryWrapper<SysUser>().eq(SysUser::getId, user.getId()));\n    }\n\n\t/**\n\t *\n\t * @param userName\n\t * @return\n\t */\n\t@Override\n\tpublic Map<String, String> queryUserAndDeptByName(String userName) {\n\t\t// 返回用户和部门信息（根据需求调整）\n\t\tMap<String, String> result = new HashMap<>();\n\t\tSysUser user = this.getUserByName(userName);\n\t\tresult.put(\"userId\", user.getId());\n\t\tresult.put(\"username\", user.getUsername());\n\t\t//用户的部门信息\n\t\tString orgCode = user.getOrgCode();\n\t\tif (oConvertUtils.isEmpty(orgCode)) {\n\t\t\treturn result;\n\t\t}\n\n\t\t// 查询公司部门\n\t\tString companyName  = Optional.ofNullable(sysDepartMapper.queryCompByOrgCode(orgCode))\n\t\t\t\t.map(SysDepart::getDepartName)\n\t\t\t\t.orElse(\"\");\n\n\t\t// 查询用户部门并匹配\n\t\tString userDeptName = sysDepartMapper.queryDepartsByUsername(userName).stream()\n\t\t\t\t.filter(depart -> orgCode.equals(depart.getOrgCode()))\n\t\t\t\t.findFirst()\n\t\t\t\t.map(SysDepart::getDepartName)\n\t\t\t\t.orElse(\"\");\n\n\t\t// 设置部门显示文本\n\t\tString compDepart;\n\t\tif (StringUtils.isNotEmpty(companyName) && StringUtils.isNotEmpty(userDeptName)) {\n\t\t\tcompDepart = companyName.equals(userDeptName)\n\t\t\t\t\t? companyName\n\t\t\t\t\t: companyName + \"-\" + userDeptName;\n\t\t} else {\n\t\t\tcompDepart = StringUtils.isNotEmpty(companyName) ? companyName : userDeptName;\n\t\t}\n\t\tresult.put(\"compDepart\", compDepart);\n\t\treturn result;\n\t}\n\n    /**\n     * 查询部门、岗位下的用户 包括子部门下的用户\n     * \n     * @param orgCode\n     * @param userParams\n     * @param page\n     * @return\n     */\n    @Override\n    public IPage<SysUserSysDepPostModel> queryDepartPostUserByOrgCode(String orgCode, SysUser userParams, IPage page) {\n        List<SysUserSysDepPostModel> sysDepartModels = baseMapper.queryDepartPostUserByOrgCode(page, orgCode, userParams);\n        if(CollectionUtil.isNotEmpty(sysDepartModels)){\n            List<String> userIds = sysDepartModels.stream().map(SysUserSysDepPostModel::getId).toList();\n            //获取部门名称\n            Map<String, String> useDepNames = this.getDepNamesByUserIds(userIds);\n            sysDepartModels.forEach(item -> {\n                List<String> positionList = sysUserPositionMapper.getPositionIdByUserId(item.getId());\n                item.setPost(CommonUtils.getSplitText(positionList,SymbolConstant.COMMA));\n                item.setOrgCodeTxt(useDepNames.get(item.getId()));\n                //查询用户的租户ids\n                List<Integer> list = userTenantMapper.getTenantIdsByUserId(item.getId());\n                if (oConvertUtils.isNotEmpty(list)) {\n                    item.setRelTenantIds(StringUtils.join(list.toArray(), SymbolConstant.COMMA));\n                } else {\n                    item.setRelTenantIds(\"\");\n                }\n                //兼职岗位\n                List<String> depPostList = depPostMapper.getDepPostByUserId(item.getId());\n                if(CollectionUtil.isNotEmpty(depPostList)){\n                    item.setOtherDepPostId(StringUtils.join(depPostList.toArray(), SymbolConstant.COMMA));\n                }\n            });\n        }\n        return page.setRecords(sysDepartModels);\n    }\n\n    /**\n     * 据 orgCode 查询用户信息（部门全路径，主岗位和兼职岗位的信息），包括公司、子公司、部门\n     *\n     * @param orgCode\n     * @param userParams\n     * @param page\n     * @return\n     */\n    @Override\n    public IPage<SysUserSysDepPostModel> queryDepartUserByOrgCode(String orgCode, SysUser userParams, IPage page) {\n        List<SysUserSysDepPostModel> sysDepartModels = baseMapper.queryDepartUserByOrgCode(page, orgCode, userParams);\n        //用户id\n        List<String> userIdList = sysDepartModels.stream().map(SysUserSysDepPostModel::getId).toList();\n        if (CollectionUtil.isNotEmpty(userIdList)) {\n            //根据用户ids获取部门名称 key 用户id value 部门名称\n            Map<String, String> departNameMap = this.getDepartNamesByUserIds(userIdList, SymbolConstant.COMMA);\n            //获取兼职岗位\n            Map<String, String> departPostMap = this.getDepartOtherPostByUserIds(userIdList, SymbolConstant.COMMA);\n            ISysDepartService service = SpringContextUtils.getBean(SysDepartServiceImpl.class);\n            sysDepartModels.forEach(item -> {\n                item.setDepartName(departNameMap.get(item.getId()));\n                item.setOtherPostName(departPostMap.get(item.getId()));\n                //获取主岗位全路径\n                if (oConvertUtils.isNotEmpty(item.getMainDepPostId())) {\n                    SysDepart departById = sysDepartMapper.getDepartById(item.getMainDepPostId());\n                    if (null != departById) {\n                        String departPathName = service.getDepartPathNameByOrgCode(departById.getOrgCode(), \"\");\n                        item.setPostName(departPathName);\n                    }\n                }\n            });\n        }\n        return page.setRecords(sysDepartModels);\n    }\n\n    /**\n     * 通讯录点击用户获取用户详情（包含用户基本信息、部门全路径、主岗位兼职岗位全路径）\n     *\n     * @param userId\n     * @return\n     */\n    @Override\n    public SysUserSysDepPostModel getUserDetailByUserId(String userId) {\n        SysUser sysUser = baseMapper.selectById(userId);\n        if (null != sysUser) {\n            SysUserSysDepPostModel userModel = new SysUserSysDepPostModel();\n            BeanUtils.copyProperties(sysUser, userModel);\n            //获取部门名称\n            List<String> userIds = new ArrayList<>();\n            userIds.add(userId);\n            Map<String, String> departNameMap = this.getDepartNamesByUserIds(userIds, \"__\");\n            userModel.setDepartName(departNameMap.get(userId));\n            ISysDepartService service = SpringContextUtils.getBean(SysDepartServiceImpl.class);\n            //获取主岗位全路径\n            if (oConvertUtils.isNotEmpty(sysUser.getMainDepPostId())) {\n                SysDepart departById = sysDepartMapper.getDepartById(sysUser.getMainDepPostId());\n                if (null != departById) {\n                    String departPathName = service.getDepartPathNameByOrgCode(departById.getOrgCode(), \"\");\n                    userModel.setPostName(departPathName);\n                }\n            }\n            //获取兼职岗位全路径\n            Map<String, String> departPostMap = this.getDepartOtherPostByUserIds(userIds, \"__\");\n            userModel.setOtherPostName(departPostMap.get(userId));\n            return userModel;\n        }\n        return null;\n    }\n\n\t/**\n\t * 登录获取用户部门信息\n\t * @param jsonObject\n\t * @return\n\t */\n\t@Override\n\tpublic Result loginGetUserDeparts(JSONObject jsonObject) {\n\t\tResult result = new Result<>();\n\t\t//返回内容\n\t\tJSONObject obj = new JSONObject(new LinkedHashMap<>());\n\t\t// 登录方式 phone:手机 account:账号密码\n\t\tString loginType = jsonObject.getString(\"loginType\");\n\t\tString username = jsonObject.getString(\"username\");\n\t\tString source = oConvertUtils.getString(jsonObject.getString(\"source\"),\"PC\");\n\t\t// 手机号登录校验\n\t\tif(\"phone\".equalsIgnoreCase(loginType)){\n\t\t\tString phone = jsonObject.getString(\"mobile\");\n\t\t\t//1.校验用户有效性\n\t\t\tSysUser sysUser = baseMapper.getUserByPhone(phone);\n\t\t\tresult = this.checkUserIsEffective(sysUser);\n\t\t\tif(!result.isSuccess()) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\t//2.校验验证码\n\t\t\tString smscode = jsonObject.getString(\"smscode\");\n\t\t\tString redisKey = CommonConstant.PHONE_REDIS_KEY_PRE+phone;\n\t\t\tObject code = redisUtil.get(redisKey);\n\t\t\tif (!smscode.equals(code)) {\n\t\t\t\treturn Result.error(\"手机验证码错误\");\n\t\t\t}\n\t\t\t//3.当前登录账号\n\t\t\tusername = sysUser.getUsername();\n\t\t\tString orgCode = sysUser.getOrgCode();\n\t\t\tobj.put(\"currentOrgCode\", orgCode);\n\t\t}else{\n\t\t\tString password  = AesEncryptUtil.resolvePassword(jsonObject.getString(\"password\"));\n\t\t\tlog.debug(\"登录密码，原始密码:{}，解密密码:{}\" , jsonObject.getString(\"password\"), password);\n            // 手机端没有验证码，不做校验\n\t\t\tif(!\"APP\".equalsIgnoreCase(source)){\n\t\t\t\t// step.1 验证码check\n\t\t\t\tSysLoginModel sysLoginModel = new SysLoginModel();\n\t\t\t\tString inputCode = jsonObject.getString(\"inputCode\");\n\t\t\t\tString checkKey = jsonObject.getString(\"checkKey\");\n\t\t\t\tsysLoginModel.setCaptcha(inputCode);\n\t\t\t\tsysLoginModel.setCheckKey(checkKey);\n\t\t\t\tif (inputCode == null) {\n\t\t\t\t\tresult.error500(\"验证码无效\");\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tString lowerCaseCaptcha = inputCode.toLowerCase();\n\t\t\t\tString keyPrefix = Md5Util.md5Encode(sysLoginModel.getCheckKey() + jeecgBaseConfig.getSignatureSecret(), \"utf-8\");\n\t\t\t\tString realKey = keyPrefix + lowerCaseCaptcha;\n\t\t\t\tObject checkCode = redisUtil.get(realKey);\n\t\t\t\tif (checkCode == null || !checkCode.toString().equals(lowerCaseCaptcha)) {\n\t\t\t\t\tlog.warn(\"验证码错误，key= {} , Ui checkCode= {}, Redis checkCode = {}\", sysLoginModel.getCheckKey(), lowerCaseCaptcha, checkCode);\n\t\t\t\t\tresult.error500(\"验证码错误\");\n\t\t\t\t\tresult.setCode(HttpStatus.PRECONDITION_FAILED.value());\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// step.2 校验用户是否存在且有效\n\t\t\tSysUser sysUser = baseMapper.getUserByName(username);\n\t\t\tresult = this.checkUserIsEffective(sysUser);\n\t\t\tif(!result.isSuccess()) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\t// step.3 校验用户名或密码是否正确\n\t\t\tString userpassword = PasswordUtil.encrypt(username, password, sysUser.getSalt());\n\t\t\tString syspassword = sysUser.getPassword();\n\t\t\tif (!syspassword.equals(userpassword)) {\n\t\t\t\tresult.error500(\"用户名或密码错误\");\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tString orgCode = sysUser.getOrgCode();\n\t\t\tobj.put(\"currentOrgCode\", orgCode);\n\t\t}\n\t\t//  step.4 获取用户部门信息，仅限部门\n\t\tList<SysDepart> departList = sysDepartMapper.queryDeptByUserAndCategory(username,DepartCategoryEnum.DEPART_CATEGORY_DEPART.getValue());\n\t\tif (CollectionUtil.isNotEmpty(departList)) {\n\t\t\tISysDepartService service = SpringContextUtils.getBean(SysDepartServiceImpl.class);\n\t\t\tList<Map<String, String>> departs = departList.stream()\n\t\t\t\t.filter(depart -> oConvertUtils.isNotEmpty(depart) &&\n\t\t\t\t\t\toConvertUtils.isNotEmpty(depart.getOrgCode()))\n\t\t\t\t.map(depart -> {\n\t\t\t\t\tString departName = depart.getDepartNameAbbr();\n\t\t\t\t\t//简称是空的情况下，查询全路径名称\n\t\t\t\t\tif(oConvertUtils.isEmpty(departName)){\n\t\t\t\t\t\tdepartName = service.getDepartPathNameByOrgCode(depart.getOrgCode(), \"\");\n\t\t\t\t\t}\n\t\t\t\t\tMap<String, String> map = new HashMap<>();\n\t\t\t\t\tmap.put(\"orgCode\", depart.getOrgCode());\n\t\t\t\t\tmap.put(\"departName\", departName);\n\t\t\t\t\treturn map;\n\t\t\t\t})\n\t\t\t\t.collect(Collectors.toList());\n\t\t\tobj.put(\"departs\", departs);\n\t\t}\n\t\tresult.setResult(obj);\n\t\treturn result;\n\t}\n\n\t/**\n\t * 批量重置密码为系统密码\n\t * @param usernames\n\t */\n\t@Override\n\tpublic void resetToSysPassword(String usernames) {\n\t\t//1.判断是否存在admin账户\n\t\tif(hasAdminIntersection(usernames)){\n\t\t\tthrow new JeecgBootException(\"所选用户中包含管理员，管理员账号不允许重置密码！！\");\n\t\t}\n\t\tList<String> userArr = Arrays.asList(usernames.split(\",\"));\n\t\tuserArr.stream().forEach(username -> {\n\t\t\tif(oConvertUtils.isNotEmpty(username)){\n\t\t\t\tString salt = oConvertUtils.randomGen(8);\n\t\t\t\tString passwordEncode = PasswordUtil.encrypt(username, PasswordConstant.DEFAULT_PASSWORD, salt);\n\t\t\t\t//重置密码\n\t\t\t\tUpdateWrapper<SysUser> updateWrapper = new UpdateWrapper<>();\n\t\t\t\tupdateWrapper\n\t\t\t\t\t\t.eq(\"username\", username)\n\t\t\t\t\t\t.set(\"last_pwd_update_time\", new Date())\n\t\t\t\t\t\t.set(\"password\", passwordEncode)\n\t\t\t\t\t\t.set(\"salt\", salt);\n\t\t\t\tthis.baseMapper.update(null, updateWrapper);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * 更新设备信息\n\t * @param clientId\n\t * @param userId\n\t */\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void updateClientId(String clientId,String userId) {\n\t\t//解绑之前的设备账户\n\t\tif(oConvertUtils.isNotEmpty(clientId)){\n\t\t\tUpdateWrapper<SysUser> updateWrapper = new UpdateWrapper<>();\n\t\t\tupdateWrapper\n\t\t\t\t\t.eq(\"client_id\", clientId)\n\t\t\t\t\t.set(\"client_id\", null);\n\t\t\tthis.baseMapper.update(null, updateWrapper);\n\t\t}\n\t\t//设置新的绑定\n\t\tSysUser sysUser = new SysUser();\n\t\tsysUser.setClientId(clientId);\n\t\tsysUser.setId(userId);\n\t\tthis.baseMapper.updateById(sysUser);\n\t}\n\n\t/**\n\t * 是否有交集\n\t */\n\tpublic static boolean hasAdminIntersection(String usernames) {\n\t\tif (oConvertUtils.isEmpty(usernames)) {\n\t\t\treturn false;\n\t\t}\n\t\t// 使用HashSet提高查找效率\n\t\tSet<String> adminSet = Arrays.stream(ADMIN_ACCOUNT)\n\t\t\t\t.map(String::toLowerCase)\n\t\t\t\t.collect(Collectors.toSet());\n\n\t\treturn Arrays.stream(usernames.split(SymbolConstant.COMMA))\n\t\t\t\t.map(String::trim)\n\t\t\t\t.map(String::toLowerCase)\n\t\t\t\t.anyMatch(adminSet::contains);\n\t}\n\t/**\n     * 根据用户ids获取部门名称\n     *\n     * @param userIdList\n     * @param symbol\n     * @return\n     */\n    private Map<String, String> getDepartOtherPostByUserIds(List<String> userIdList, String symbol) {\n        Map<String, String> departPostMap = new HashMap<>();\n        List<SysUserSysDepPostModel> departPost = sysDepartMapper.getDepartOtherPostByUserIds(userIdList);\n        if (CollectionUtil.isNotEmpty(departPost)) {\n            ISysDepartService service = SpringContextUtils.getBean(SysDepartServiceImpl.class);\n            departPost.forEach(item -> {\n                if (oConvertUtils.isNotEmpty(item.getId()) && oConvertUtils.isNotEmpty(item.getOtherDepPostId())) {\n                    String postName = service.getDepartPathNameByOrgCode(item.getOrgCode(), \"\");\n                    if (departPostMap.containsKey(item.getId())) {\n                        departPostMap.put(item.getId(), departPostMap.get(item.getId()) + symbol + postName);\n                    } else {\n                        departPostMap.put(item.getId(), postName);\n                    }\n                }\n            });\n        }\n        return departPostMap;\n    }\n\n    /**\n     * 根据用户ids获取部门名称\n     *\n     * @param userIdList\n     * @param symbol\n     * @return\n     */\n    private Map<String, String> getDepartNamesByUserIds(List<String> userIdList, String symbol) {\n        Map<String, String> userOrgCodeMap = new HashMap<>();\n        if (CollectionUtil.isNotEmpty(userIdList)) {\n            List<SysUserSysDepPostModel> userDepPosts = sysUserDepartMapper.getUserDepPostByUserIds(userIdList);\n            if (CollectionUtil.isNotEmpty(userDepPosts)) {\n                ISysDepartService service = SpringContextUtils.getBean(SysDepartServiceImpl.class);\n                userDepPosts.forEach(item -> {\n                    if (oConvertUtils.isNotEmpty(item.getId()) && oConvertUtils.isNotEmpty(item.getOrgCode())) {\n                        String departNamePath = service.getDepartPathNameByOrgCode(item.getOrgCode(), \"\");\n                        if (userOrgCodeMap.containsKey(item.getId())) {\n                            userOrgCodeMap.put(item.getId(), userOrgCodeMap.get(item.getId()) + symbol + departNamePath);\n                        } else {\n                            userOrgCodeMap.put(item.getId(), departNamePath);\n                        }\n                    }\n                });\n            }\n        }\n        return userOrgCodeMap;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserTenantServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport org.apache.commons.lang.StringUtils;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.constant.CacheConstant;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.util.CommonUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysTenant;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.entity.SysUserTenant;\nimport org.jeecg.modules.system.mapper.SysTenantPackUserMapper;\nimport org.jeecg.modules.system.mapper.SysUserMapper;\nimport org.jeecg.modules.system.mapper.SysUserPositionMapper;\nimport org.jeecg.modules.system.mapper.SysUserTenantMapper;\nimport org.jeecg.modules.system.service.ISysUserTenantService;\nimport org.jeecg.modules.system.vo.SysUserDepVo;\nimport org.jeecg.modules.system.vo.SysUserTenantVo;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.NoSuchBeanDefinitionException;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.cache.annotation.CacheEvict;\nimport org.springframework.context.annotation.Lazy;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\n/**\n * @Description: sys_user_tenant_relation\n * @Author: jeecg-boot\n * @Date:   2022-12-23\n * @Version: V1.0\n */\n@Service\npublic class SysUserTenantServiceImpl extends ServiceImpl<SysUserTenantMapper, SysUserTenant> implements ISysUserTenantService {\n\n    @Autowired\n    private SysUserTenantMapper userTenantMapper;\n    \n    @Autowired\n    private SysUserMapper userMapper;\n\n    @Autowired\n    private SysUserPositionMapper userPositionMapper;\n\n    @Autowired\n    private SysTenantPackUserMapper packUserMapper;\n\n    @Override\n    public Page<SysUser> getPageUserList(Page<SysUser> page, Integer userTenantId, SysUser user) {\n        return page.setRecords(userTenantMapper.getPageUserList(page,userTenantId,user));\n    }\n\n    @Override\n    public List<SysUser> setUserTenantIds(List<SysUser> records) {\n        if(null == records || records.size() == 0){\n            return records;\n        }\n        for (SysUser sysUser:records) {\n            //查询租户id\n            List<Integer> list = userTenantMapper.getTenantIdsByUserId(sysUser.getId());\n            if(oConvertUtils.isNotEmpty(list)){\n                sysUser.setRelTenantIds(StringUtils.join(list.toArray(), SymbolConstant.COMMA));\n            }else{\n                sysUser.setRelTenantIds(\"\");\n            }\n        }\n        return records;\n    }\n\n    @Override\n    public List<String> getUserIdsByTenantId(Integer tenantId) {\n        return userTenantMapper.getUserIdsByTenantId(tenantId);\n    }\n\n    @Override\n    public List<Integer> getTenantIdsByUserId(String userId) {\n        return userTenantMapper.getTenantIdsByUserId(userId);\n    }\n\n    @Override\n    public List<SysUserTenantVo> getTenantListByUserId(String userId, List<String> userTenantStatus) {\n        List<SysUserTenantVo> tenantListByUserId = userTenantMapper.getTenantListByUserId(userId, userTenantStatus);\n        // 代码逻辑说明: 【QQYUN-7283】1.已经是会员的租户，不是管理员时，没有购买按钮---\n        String noVip = \"default\";\n        tenantListByUserId.forEach((item) ->{\n            if(oConvertUtils.isNotEmpty(item.getMemberType()) && !noVip.equals(item.getMemberType())){\n                //查询是不是管理员\n                Long count = packUserMapper.izHaveBuyAuth(item.getId(), Integer.valueOf(item.getTenantUserId()));\n                if(count!=0){\n                    item.setTenantAdmin(true);\n                }\n            }\n        });\n        return tenantListByUserId;\n    }\n\n    @Override\n    public void updateUserTenantStatus(String id, String tenantId, String userTenantStatus) {\n        if (oConvertUtils.isEmpty(tenantId)) {\n            throw new JeecgBootException(\"租户数据为空\");\n        }\n        LambdaQueryWrapper<SysUserTenant> query = new LambdaQueryWrapper<>();\n        query.eq(SysUserTenant::getUserId, id);\n        query.eq(SysUserTenant::getTenantId, Integer.valueOf(tenantId));\n        SysUserTenant userTenant = userTenantMapper.selectOne(query);\n        if (null == userTenant) {\n            throw new JeecgBootException(\"租户数据为空\");\n        }\n        SysUserTenant tenant = new SysUserTenant();\n        tenant.setStatus(userTenantStatus);\n        this.update(tenant, query);\n    }\n\n    @Override\n    public IPage<SysUserTenantVo> getUserTenantPageList(Page<SysUserTenantVo> page, List<String> status, SysUser user, Integer tenantId) {\n        List<SysUserTenantVo> tenantPageList = userTenantMapper.getUserTenantPageList(page, status, user, tenantId);\n        List<String> userIds = tenantPageList.stream().map(SysUserTenantVo::getId).collect(Collectors.toList());\n        if (userIds != null && userIds.size() > 0) {\n            Map<String, String> useDepNames = this.getDepNamesByUserIds(userIds);\n            tenantPageList.forEach(item -> {\n                item.setOrgCodeTxt(useDepNames.get(item.getId()));\n                //查询用户的租户ids\n                List<Integer> list = userTenantMapper.getTenantIdsNoStatus(item.getId());\n                if (oConvertUtils.isNotEmpty(list)) {\n                    item.setRelTenantIds(StringUtils.join(list.toArray(), SymbolConstant.COMMA));\n                } else {\n                    item.setRelTenantIds(\"\");\n                }\n                //查询用户职位，将租户id传到前台\n                List<String> positionList = userPositionMapper.getPositionIdByUserId(item.getId());\n                item.setPost(CommonUtils.getSplitText(positionList,SymbolConstant.COMMA));\n            });\n        }\n        return page.setRecords(tenantPageList);\n    }\n\n    /**\n     * 根据用户id获取部门名称\n     *\n     * @param userIds\n     * @return\n     */\n    public Map<String, String> getDepNamesByUserIds(List<String> userIds) {\n        List<SysUserDepVo> list = userMapper.getDepNamesByUserIds(userIds);\n        Map<String, String> res = new HashMap(5);\n        list.forEach(item -> {\n                    if (res.get(item.getUserId()) == null) {\n                        res.put(item.getUserId(), item.getDepartName());\n                    } else {\n                        res.put(item.getUserId(), res.get(item.getUserId()) + \",\" + item.getDepartName());\n                    }\n                }\n        );\n        return res;\n    }\n\n    @Override\n    @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)\n    @Transactional(rollbackFor = Exception.class)\n    public void putCancelQuit(List<String> userIds, Integer tenantId) {\n        userTenantMapper.putCancelQuit(userIds, tenantId);\n    }\n\n    @Override\n    public Integer userTenantIzExist(String userId, Integer tenantId) {\n        return userTenantMapper.userTenantIzExist(userId,tenantId);\n    }\n\n    @Override\n    public IPage<SysTenant> getTenantPageListByUserId(Page<SysTenant> page, String userId, List<String> userTenantStatus,SysUserTenantVo sysUserTenantVo) {\n        return page.setRecords(userTenantMapper.getTenantPageListByUserId(page,userId,userTenantStatus,sysUserTenantVo));\n    }\n\n    @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)\n    @Override\n    public void agreeJoinTenant(String userId, Integer tenantId) {\n        userTenantMapper.agreeJoinTenant(userId,tenantId);\n    }\n\n    @Override\n    public void refuseJoinTenant(String userId, Integer tenantId) {\n        userTenantMapper.refuseJoinTenant(userId,tenantId);\n    }\n\n    @Override\n    public SysUserTenant getUserTenantByTenantId(String userId, Integer tenantId) {\n        return userTenantMapper.getUserTenantByTenantId(userId,tenantId);\n    }\n\n    @Override\n    public Long getUserCount(Integer tenantId, String tenantStatus) {\n        return userTenantMapper.getUserCount(tenantId,tenantStatus);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppDingtalkServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport cn.hutool.core.util.ObjectUtil;\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.jeecg.dingtalk.api.base.JdtBaseAPI;\nimport com.jeecg.dingtalk.api.core.response.Response;\nimport com.jeecg.dingtalk.api.core.util.HttpUtil;\nimport com.jeecg.dingtalk.api.core.vo.AccessToken;\nimport com.jeecg.dingtalk.api.core.vo.PageResult;\nimport com.jeecg.dingtalk.api.department.JdtDepartmentAPI;\nimport com.jeecg.dingtalk.api.department.vo.Department;\nimport com.jeecg.dingtalk.api.message.JdtMessageAPI;\nimport com.jeecg.dingtalk.api.message.vo.ActionCardMessage;\nimport com.jeecg.dingtalk.api.message.vo.MarkdownMessage;\nimport com.jeecg.dingtalk.api.message.vo.Message;\nimport com.jeecg.dingtalk.api.message.vo.TextMessage;\nimport com.jeecg.dingtalk.api.oauth2.JdtOauth2API;\nimport com.jeecg.dingtalk.api.oauth2.vo.ContactUser;\nimport com.jeecg.dingtalk.api.user.JdtUserAPI;\nimport com.jeecg.dingtalk.api.user.body.GetUserListBody;\nimport com.jeecg.dingtalk.api.user.vo.User;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.jeecg.common.api.dto.message.MessageDTO;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.constant.enums.MessageTypeEnum;\nimport org.jeecg.common.exception.JeecgBootBizTipException;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.util.*;\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.modules.system.entity.*;\nimport org.jeecg.modules.system.mapper.*;\nimport org.jeecg.modules.system.model.SysDepartTreeModel;\nimport org.jeecg.modules.system.model.ThirdLoginModel;\nimport org.jeecg.modules.system.service.*;\nimport org.jeecg.modules.system.vo.thirdapp.JdtDepartmentTreeVo;\nimport org.jeecg.modules.system.vo.thirdapp.SyncInfoVo;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.dao.DuplicateKeyException;\nimport org.springframework.stereotype.Service;\n\nimport java.util.*;\nimport java.util.stream.Collectors;\n\n\n/**\n * 第三方App对接：钉钉实现类\n * @author: jeecg-boot\n */\n@Slf4j\n@Service\npublic class ThirdAppDingtalkServiceImpl implements IThirdAppService {\n\n    @Autowired\n    JeecgBaseConfig jeecgBaseConfig;\n    @Autowired\n    private ISysDepartService sysDepartService;\n    @Autowired\n    private SysUserMapper userMapper;\n    @Autowired\n    private ISysThirdAccountService sysThirdAccountService;\n    @Autowired\n    private ISysUserDepartService sysUserDepartService;\n    @Autowired\n    private ISysPositionService sysPositionService;\n    @Autowired\n    private SysAnnouncementSendMapper sysAnnouncementSendMapper;\n    @Autowired\n    private SysThirdAppConfigMapper configMapper;\n    @Autowired\n    private SysUserTenantMapper userTenantMapper;\n    @Autowired\n    private SysTenantMapper tenantMapper;\n\n    /**\n     * 第三方APP类型，当前固定为 dingtalk\n     */\n    public final String THIRD_TYPE = \"dingtalk\";\n\n    @Override\n    public String getAccessToken() {\n        // 代码逻辑说明: [QQYUN-3440]新建企业微信和钉钉配置表，通过租户模式隔离------------\n        SysThirdAppConfig config = getDingThirdAppConfig();\n        if(null != config){\n            return getTenantAccessToken(config);\n        }\n        log.warn(\"租户下未配置钉钉\");\n        return null;\n    }\n\n    // update：2022-1-21，updateBy：sunjianlei; for 【JTC-704】【钉钉】部门同步成功，实际没成，后台提示ip白名单\n    @Override\n    public SyncInfoVo syncLocalDepartmentToThirdApp(String ids) {\n        SyncInfoVo syncInfo = new SyncInfoVo();\n        String accessToken = this.getAccessToken();\n        if (accessToken == null) {\n            syncInfo.addFailInfo(\"accessToken获取失败！\");\n            return syncInfo;\n        }\n        // 获取【钉钉】所有的部门\n        List<Response<Department>> departments = JdtDepartmentAPI.listAllResponse(accessToken);\n        // 删除钉钉有但本地没有的部门（以本地部门数据为主）（钉钉不能创建同名部门，只能先删除）\n        List<SysDepart> sysDepartList = sysDepartService.list();\n        for1:\n        for (Response<Department> departmentRes : departments) {\n            // 判断部门是否查询成功\n            if (!departmentRes.isSuccess()) {\n                syncInfo.addFailInfo(departmentRes.getErrmsg());\n                // 88 是 ip 不在白名单的错误码，如果遇到此错误码，后面的操作都可以不用进行了，因为肯定都是失败的\n                if (new Integer(88).equals(departmentRes.getErrcode())) {\n                    return syncInfo;\n                }\n                continue;\n            }\n            Department department = departmentRes.getResult();\n            for (SysDepart depart : sysDepartList) {\n                // id相同，代表已存在，不删除\n                String sourceIdentifier = department.getSource_identifier();\n                if (sourceIdentifier != null && sourceIdentifier.equals(depart.getId())) {\n                    continue for1;\n                }\n            }\n            // 循环到此说明本地没有，删除\n            int deptId = department.getDept_id();\n            // 钉钉不允许删除带有用户的部门，所以需要判断下，将有用户的部门的用户移动至根部门\n            Response<List<String>> userIdRes = JdtUserAPI.getUserListIdByDeptId(deptId, accessToken);\n            if (userIdRes.isSuccess() && userIdRes.getResult().size() > 0) {\n                for (String userId : userIdRes.getResult()) {\n                    User updateUser = new User();\n                    updateUser.setUserid(userId);\n                    updateUser.setDept_id_list(1);\n                    JdtUserAPI.update(updateUser, accessToken);\n                }\n            }\n            JdtDepartmentAPI.delete(deptId, accessToken);\n        }\n        // 获取本地所有部门树结构\n        List<SysDepartTreeModel> sysDepartsTree = sysDepartService.queryTreeList();\n        // -- 钉钉不能创建新的顶级部门，所以新的顶级部门的parentId就为1\n        Department parent = new Department();\n        parent.setDept_id(1);\n        // 递归同步部门\n        departments = JdtDepartmentAPI.listAllResponse(accessToken);\n        this.syncDepartmentRecursion(sysDepartsTree, departments, parent, accessToken, syncInfo);\n        return syncInfo;\n    }\n\n    /**\n     * 递归同步部门到本地\n     * @param sysDepartsTree\n     * @param departments\n     * @param parent\n     * @param accessToken\n     * @param syncInfo\n     */\n    public void syncDepartmentRecursion(List<SysDepartTreeModel> sysDepartsTree, List<Response<Department>> departments, Department parent, String accessToken, SyncInfoVo syncInfo) {\n        if (sysDepartsTree != null && sysDepartsTree.size() != 0) {\n            for1:\n            for (SysDepartTreeModel depart : sysDepartsTree) {\n                for (Response<Department> departmentRes : departments) {\n                    // 判断部门是否查询成功\n                    if (!departmentRes.isSuccess()) {\n                        syncInfo.addFailInfo(departmentRes.getErrmsg());\n                        continue;\n                    }\n                    Department department = departmentRes.getResult();\n                    // id相同，代表已存在，执行修改操作\n                    String sourceIdentifier = department.getSource_identifier();\n                    if (sourceIdentifier != null && sourceIdentifier.equals(depart.getId())) {\n                        this.sysDepartToDtDepartment(depart, department, parent.getDept_id());\n                        Response<JSONObject> response = JdtDepartmentAPI.update(department, accessToken);\n                        if (response.isSuccess()) {\n                            // 紧接着同步子级\n                            this.syncDepartmentRecursion(depart.getChildren(), departments, department, accessToken, syncInfo);\n                        }\n                        // 收集错误信息\n                        this.syncDepartCollectErrInfo(response, depart, syncInfo);\n                        // 跳出外部循环\n                        continue for1;\n                    }\n                }\n                // 循环到此说明是新部门，直接调接口创建\n                Department newDepartment = this.sysDepartToDtDepartment(depart, parent.getDept_id());\n                Response<Integer> response = JdtDepartmentAPI.create(newDepartment, accessToken);\n                // 创建成功，将返回的id绑定到本地\n                if (response.getResult() != null) {\n                    Department newParent = new Department();\n                    newParent.setDept_id(response.getResult());\n                    // 紧接着同步子级\n                    this.syncDepartmentRecursion(depart.getChildren(), departments, newParent, accessToken, syncInfo);\n                }\n                // 收集错误信息\n                this.syncDepartCollectErrInfo(response, depart, syncInfo);\n            }\n        }\n    }\n\n//    @Override\n//    public SyncInfoVo syncThirdAppDepartmentToLocal(String ids) {\n//        SyncInfoVo syncInfo = new SyncInfoVo();\n//        String accessToken = this.getAccessToken();\n//        if (accessToken == null) {\n//            syncInfo.addFailInfo(\"accessToken获取失败！\");\n//            return syncInfo;\n//        }\n//        // 获取【钉钉】所有的部门\n//        List<Department> departments = JdtDepartmentAPI.listAll(accessToken);\n//        String username = JwtUtil.getUserNameByToken(SpringContextUtils.getHttpServletRequest());\n//        List<JdtDepartmentTreeVo> departmentTreeList = JdtDepartmentTreeVo.listToTree(departments);\n//        // 递归同步部门\n//        this.syncDepartmentToLocalRecursion(departmentTreeList, null, username, syncInfo, accessToken,false);\n//        return syncInfo;\n//    }\n\n    public void syncDepartmentToLocalRecursion(List<JdtDepartmentTreeVo> departmentTreeList, String sysParentId, String username, SyncInfoVo syncInfo, String accessToken,Boolean syncUser,Integer tenantId) {\n\n        if (departmentTreeList != null && departmentTreeList.size() != 0) {\n            // 记录已经同步过的用户id，当有多个部门的情况时，只同步一次\n            Set<String> syncedUserIdSet = new HashSet<>();\n            for (JdtDepartmentTreeVo departmentTree : departmentTreeList) {\n                LambdaQueryWrapper<SysDepart> queryWrapper = new LambdaQueryWrapper<>();\n                // 根据 source_identifier 字段查询\n                // 代码逻辑说明: 【issues/6017】钉钉同步部门时没有最顶层的部门名，同步用户时，用户没有部门信息---\n                queryWrapper.and(item -> item.eq(SysDepart::getId, departmentTree.getSource_identifier()).or().eq(SysDepart::getDingIdentifier,oConvertUtils.getString(departmentTree.getDept_id())));\n                SysDepart sysDepart = sysDepartService.getOne(queryWrapper);\n                if (sysDepart != null) {\n                    //  执行更新操作\n                    SysDepart updateSysDepart = this.dtDepartmentToSysDepart(departmentTree, sysDepart);\n                    if (sysParentId != null) {\n                        updateSysDepart.setParentId(sysParentId);\n                        //更新父级部门不是叶子结点\n                        sysDepartService.updateIzLeaf(sysParentId,CommonConstant.NOT_LEAF);\n                    }\n                    try {\n                        sysDepartService.updateDepartDataById(updateSysDepart, username);\n                        String str = String.format(\"部门 %s 更新成功！\", updateSysDepart.getDepartName());\n                        syncInfo.addSuccessInfo(str);\n                    } catch (Exception e) {\n                        this.syncDepartCollectErrInfo(e, departmentTree, syncInfo);\n                    }\n                    if (departmentTree.hasChildren()) {\n                        // 紧接着同步子级\n                        this.syncDepartmentToLocalRecursion(departmentTree.getChildren(), updateSysDepart.getId(), username, syncInfo, accessToken,syncUser,tenantId);\n                    }\n                    //判断是否需要同步用户\n                    if(syncUser){\n                        this.addDepartUser(updateSysDepart.getId(),departmentTree.getDept_id(), accessToken, syncInfo, syncedUserIdSet,tenantId);\n                    }\n                } else {\n                    //  执行新增操作\n                    SysDepart newSysDepart = this.dtDepartmentToSysDepart(departmentTree, null);\n                    if (sysParentId != null) {\n                        newSysDepart.setParentId(sysParentId);\n                        // 2 = 组织机构\n                        newSysDepart.setOrgCategory(\"2\");\n                    } else {\n                        // 1 = 公司\n                        newSysDepart.setOrgCategory(\"1\");\n                    }\n                    try {\n                        if(oConvertUtils.isEmpty(departmentTree.getParent_id())){\n                            newSysDepart.setDingIdentifier(departmentTree.getDept_id().toString());\n                        }\n                        newSysDepart.setTenantId(tenantId);\n                        sysDepartService.saveDepartData(newSysDepart, username);\n                        // 更新钉钉 source_identifier\n                        Department updateDtDepart = new Department();\n                        updateDtDepart.setDept_id(departmentTree.getDept_id());\n                        updateDtDepart.setSource_identifier(newSysDepart.getId());\n                        //为空说明是最顶级部门，最顶级部门不允许修改操作\n                        if(oConvertUtils.isNotEmpty(newSysDepart.getParentId())){\n                            Response response = JdtDepartmentAPI.update(updateDtDepart, accessToken);\n                            if (!response.isSuccess()) {\n                                throw new RuntimeException(response.getErrmsg());\n                            }\n                        }\n                        String str = String.format(\"部门 %s 创建成功！\", newSysDepart.getDepartName());\n                        syncInfo.addSuccessInfo(str);\n                        //判断是否需要同步用户\n                        if(syncUser){\n                            this.addDepartUser(newSysDepart.getId(),departmentTree.getDept_id(), accessToken, syncInfo, syncedUserIdSet,tenantId);\n                        }\n                    } catch (Exception e) {\n                        this.syncDepartCollectErrInfo(e, departmentTree, syncInfo);\n                    }\n                    // 紧接着同步子级\n                    if (departmentTree.hasChildren()) {\n                        this.syncDepartmentToLocalRecursion(departmentTree.getChildren(), newSysDepart.getId(), username, syncInfo, accessToken,syncUser,tenantId);\n                    }\n                }\n            }\n        }\n    }\n\n    private boolean syncDepartCollectErrInfo(Exception e, Department department, SyncInfoVo syncInfo) {\n        String msg;\n        if (e instanceof DuplicateKeyException) {\n            msg = e.getCause().getMessage();\n        } else {\n            msg = e.getMessage();\n        }\n        String str = String.format(\"部门 %s(%s) 同步失败！错误信息：%s\", department.getName(), department.getDept_id(), msg);\n        syncInfo.addFailInfo(str);\n        return false;\n    }\n\n    /**\n     * 【同步部门】收集同步过程中的错误信息\n     */\n    private boolean syncDepartCollectErrInfo(Response<?> response, SysDepartTreeModel depart, SyncInfoVo syncInfo) {\n        if (!response.isSuccess()) {\n            String str = String.format(\"部门 %s(%s) 同步失败！错误码：%s——%s\", depart.getDepartName(), depart.getOrgCode(), response.getErrcode(), response.getErrmsg());\n            syncInfo.addFailInfo(str);\n            return false;\n        } else {\n            String str = String.format(\"部门户 %s(%s) 同步成功！\", depart.getDepartName(), depart.getOrgCode());\n            syncInfo.addSuccessInfo(str);\n            return true;\n        }\n    }\n\n    @Override\n    public SyncInfoVo syncLocalUserToThirdApp(String ids) {\n        SyncInfoVo syncInfo = new SyncInfoVo();\n        String accessToken = this.getAccessToken();\n        if (accessToken == null) {\n            syncInfo.addFailInfo(\"accessToken获取失败！\");\n            return syncInfo;\n        }\n        List<SysUser> sysUsers;\n        if (StringUtils.isNotBlank(ids)) {\n            String[] idList = ids.split(\",\");\n            LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();\n            queryWrapper.in(SysUser::getId, (Object[]) idList);\n            // 获取本地指定用户\n            sysUsers = userMapper.selectList(queryWrapper);\n        } else {\n            // 获取本地所有用户\n            sysUsers = userMapper.selectList(Wrappers.emptyWrapper());\n        }\n        // 查询钉钉所有的部门，用于同步用户和部门的关系\n        List<Department> allDepartment = JdtDepartmentAPI.listAll(accessToken);\n\n        for (SysUser sysUser : sysUsers) {\n            // 外部模拟登陆临时账号，不同步\n            if (\"_reserve_user_external\".equals(sysUser.getUsername())) {\n                continue;\n            }\n            // 钉钉用户信息，不为null代表已同步过\n            Response<User> dtUserInfo;\n            /*\n             * 判断是否同步过的逻辑：\n             * 1. 查询 sys_third_account（第三方账号表）是否有数据，如果有代表已同步\n             * 2. 本地表里没有，就先用手机号判断，不通过再用username(用户账号)判断。\n             */\n            SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneBySysUserId(sysUser.getId(), THIRD_TYPE);\n            if (sysThirdAccount != null && oConvertUtils.isNotEmpty(sysThirdAccount.getThirdUserId())) {\n                // sys_third_account 表匹配成功，通过第三方userId查询出第三方userInfo\n                dtUserInfo = JdtUserAPI.getUserById(sysThirdAccount.getThirdUserId(), accessToken);\n            } else {\n                // 手机号匹配\n                Response<String> thirdUserId = JdtUserAPI.getUseridByMobile(sysUser.getPhone(), accessToken);\n                // 手机号匹配成功\n                if (thirdUserId.isSuccess() && oConvertUtils.isNotEmpty(thirdUserId.getResult())) {\n                    // 通过查询到的userId查询用户详情\n                    dtUserInfo = JdtUserAPI.getUserById(thirdUserId.getResult(), accessToken);\n                } else {\n                    // 手机号匹配失败，尝试使用username匹配\n                    dtUserInfo = JdtUserAPI.getUserById(sysUser.getUsername(), accessToken);\n                }\n            }\n            String dtUserId;\n            // api 接口是否执行成功\n            boolean apiSuccess;\n            // 已同步就更新，否则就创建\n            if (dtUserInfo != null && dtUserInfo.isSuccess() && dtUserInfo.getResult() != null) {\n                User dtUser = dtUserInfo.getResult();\n                dtUserId = dtUser.getUserid();\n                User updateQwUser = this.sysUserToDtUser(sysUser, dtUser, allDepartment);\n                Response<JSONObject> updateRes = JdtUserAPI.update(updateQwUser, accessToken);\n                // 收集成功/失败信息\n                apiSuccess = this.syncUserCollectErrInfo(updateRes, sysUser, syncInfo);\n            } else {\n                User newQwUser = this.sysUserToDtUser(sysUser, allDepartment);\n                Response<String> createRes = JdtUserAPI.create(newQwUser, accessToken);\n                dtUserId = createRes.getResult();\n                // 收集成功/失败信息\n                apiSuccess = this.syncUserCollectErrInfo(createRes, sysUser, syncInfo);\n            }\n\n            // api 接口执行成功，并且 sys_third_account 表匹配失败，就向 sys_third_account 里插入一条数据\n            boolean flag = (sysThirdAccount == null || oConvertUtils.isEmpty(sysThirdAccount.getThirdUserId()));\n            if (apiSuccess && flag) {\n                if (sysThirdAccount == null) {\n                    sysThirdAccount = new SysThirdAccount();\n                    sysThirdAccount.setSysUserId(sysUser.getId());\n                    sysThirdAccount.setStatus(1);\n                    sysThirdAccount.setDelFlag(0);\n                    sysThirdAccount.setThirdType(THIRD_TYPE);\n                }\n                // 设置第三方app用户ID\n                sysThirdAccount.setThirdUserId(dtUserId);\n                sysThirdAccountService.saveOrUpdate(sysThirdAccount);\n            }\n        }\n        return syncInfo;\n    }\n\n//    @Override\n//    public SyncInfoVo syncThirdAppUserToLocal() {\n//        SyncInfoVo syncInfo = new SyncInfoVo();\n//        String accessToken = this.getAccessToken();\n//        if (accessToken == null) {\n//            syncInfo.addFailInfo(\"accessToken获取失败！\");\n//            return syncInfo;\n//        }\n//\n//        // 获取本地用户\n//        List<SysUser> sysUsersList = userMapper.selectList(Wrappers.emptyWrapper());\n//\n//        // 查询钉钉所有的部门，用于同步用户和部门的关系\n//        List<Department> allDepartment = JdtDepartmentAPI.listAll(accessToken);\n//        // 根据钉钉部门查询所有钉钉用户，用于反向同步到本地\n//        List<User> ddUserList = this.getDtAllUserByDepartment(allDepartment, accessToken);\n//        // 记录已经同步过的用户id，当有多个部门的情况时，只同步一次\n//        Set<String> syncedUserIdSet = new HashSet<>();\n//\n//        for (User dtUserInfo : ddUserList) {\n//            if (syncedUserIdSet.contains(dtUserInfo.getUserid())) {\n//                continue;\n//            }\n//            syncedUserIdSet.add(dtUserInfo.getUserid());\n//            SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByThirdUserId(dtUserInfo.getUserid(), THIRD_TYPE);\n//            List<SysUser> collect = sysUsersList.stream().filter(user -> (dtUserInfo.getMobile().equals(user.getPhone()) || dtUserInfo.getUserid().equals(user.getUsername()))\n//                                                                 ).collect(Collectors.toList());\n//            if (collect != null && collect.size() > 0) {\n//                SysUser sysUserTemp = collect.get(0);\n//                // 循环到此说明用户匹配成功，进行更新操作\n//                SysUser updateSysUser = this.dtUserToSysUser(dtUserInfo, sysUserTemp);\n//                try {\n//                    userMapper.updateById(updateSysUser);\n//                    String str = String.format(\"用户 %s(%s) 更新成功！\", updateSysUser.getRealname(), updateSysUser.getUsername());\n//                    syncInfo.addSuccessInfo(str);\n//                } catch (Exception e) {\n//                    this.syncUserCollectErrInfo(e, dtUserInfo, syncInfo);\n//                }\n//                //第三方账号关系表\n//                this.thirdAccountSaveOrUpdate(sysThirdAccount, updateSysUser.getId(), dtUserInfo.getUserid());\n//            }else{\n//                // 如果没有匹配到用户，则走创建逻辑\n//                SysUser newSysUser = this.dtUserToSysUser(dtUserInfo);\n//                try {\n//                    userMapper.insert(newSysUser);\n//                    String str = String.format(\"用户 %s(%s) 创建成功！\", newSysUser.getRealname(), newSysUser.getUsername());\n//                    syncInfo.addSuccessInfo(str);\n//                } catch (Exception e) {\n//                    this.syncUserCollectErrInfo(e, dtUserInfo, syncInfo);\n//                }\n//                //第三方账号关系表\n//                this.thirdAccountSaveOrUpdate(null, newSysUser.getId(), dtUserInfo.getUserid());\n//            }\n//        }\n//        return syncInfo;\n//    }\n\n//    private List<User> getDtAllUserByDepartment(List<Department> allDepartment, String accessToken) {\n//        // 根据钉钉部门查询所有钉钉用户，用于反向同步到本地\n//        List<User> userList = new ArrayList<>();\n//        for (Department department : allDepartment) {\n//            this.getUserListByDeptIdRecursion(department.getDept_id(), 0, userList, accessToken);\n//        }\n//        return userList;\n//    }\n\n    /**\n     * 递归查询所有用户\n     */\n    private void getUserListByDeptIdRecursion(int deptId, int cursor, List<User> userList, String accessToken) {\n        // 根据钉钉部门查询所有钉钉用户，用于反向同步到本地\n        GetUserListBody getUserListBody = new GetUserListBody(deptId, cursor, 100);\n        Response<PageResult<User>> response = JdtUserAPI.getUserListByDeptId(getUserListBody, accessToken);\n        if (response.isSuccess()) {\n            PageResult<User> page = response.getResult();\n            userList.addAll(page.getList());\n            if (page.getHas_more()) {\n                this.getUserListByDeptIdRecursion(deptId, page.getNext_cursor(), userList, accessToken);\n            }\n        }\n    }\n\n    /**\n     * 保存或修改第三方登录表\n     *\n     * @param sysThirdAccount 第三方账户表对象，为null就新增数据，否则就修改\n     * @param sysUserId       本地系统用户ID\n     * @param user            钉钉用户\n     */\n    private void thirdAccountSaveOrUpdate(SysThirdAccount sysThirdAccount, String sysUserId, User user, Integer tenantId) {\n        if (sysThirdAccount == null) {\n            sysThirdAccount = new SysThirdAccount();\n            sysThirdAccount.setSysUserId(sysUserId);\n            sysThirdAccount.setThirdUserUuid(user.getUnionid());\n            sysThirdAccount.setStatus(1);\n            sysThirdAccount.setTenantId(tenantId);\n            sysThirdAccount.setDelFlag(0);\n            sysThirdAccount.setThirdType(THIRD_TYPE);\n        }\n        sysThirdAccount.setThirdUserId(user.getUserid());\n        if(oConvertUtils.isEmpty(sysThirdAccount.getRealname())){\n            sysThirdAccount.setRealname(user.getName());\n        }\n        sysThirdAccountService.saveOrUpdate(sysThirdAccount);\n    }\n\n    /**\n     * 【同步用户】收集同步过程中的错误信息\n     */\n    private boolean syncUserCollectErrInfo(Response<?> response, SysUser sysUser, SyncInfoVo syncInfo) {\n        if (!response.isSuccess()) {\n            String str = String.format(\"用户 %s(%s) 同步失败！错误码：%s——%s\", sysUser.getUsername(), sysUser.getRealname(), response.getErrcode(), response.getErrmsg());\n            syncInfo.addFailInfo(str);\n            return false;\n        } else {\n            String str = String.format(\"用户 %s(%s) 同步成功！\", sysUser.getUsername(), sysUser.getRealname());\n            syncInfo.addSuccessInfo(str);\n            return true;\n        }\n    }\n\n    /**\n     * 【同步用户】收集同步过程中的错误信息\n     */\n    private boolean syncUserCollectErrInfo(Exception e, User dtUser, SyncInfoVo syncInfo) {\n        String msg;\n        if (e instanceof DuplicateKeyException) {\n            msg = e.getCause().getMessage();\n            String emailUniq = \"uniq_sys_user_email\";\n            if(msg.contains(emailUniq)){\n                msg = \"邮箱重复，请更换邮箱\";\n            }\n            String workNoUniq=\"uniq_sys_user_work_no\";\n            if(msg.contains(workNoUniq)){\n                msg = \"工号重复，请更换工号\";\n            }\n        } else {\n            msg = e.getMessage();\n        }\n        String str = String.format(\"用户 %s(%s) 同步失败！错误信息：%s\", dtUser.getUserid(), dtUser.getName(), msg);\n        syncInfo.addFailInfo(str);\n        return false;\n    }\n\n\n    /**\n     * 【同步用户】将SysUser转为【钉钉】的User对象（创建新用户）\n     */\n    private User sysUserToDtUser(SysUser sysUser, List<Department> allDepartment) {\n        User user = new User();\n        // 通过 username 来关联\n        user.setUserid(sysUser.getUsername());\n        return this.sysUserToDtUser(sysUser, user, allDepartment);\n    }\n\n    /**\n     * 【同步用户】将SysUser转为【钉钉】的User对象（更新旧用户）\n     */\n    private User sysUserToDtUser(SysUser sysUser, User user, List<Department> allDepartment) {\n        user.setName(sysUser.getRealname());\n        user.setMobile(sysUser.getPhone());\n        user.setTelephone(sysUser.getTelephone());\n        user.setJob_number(sysUser.getWorkNo());\n        // 职务翻译\n        //获取用户职位名称\n        List<SysPosition> positionList = sysPositionService.getPositionList(sysUser.getId());\n        if(null != positionList && positionList.size()>0){\n            String positionName = positionList.stream().map(SysPosition::getName).collect(Collectors.joining(SymbolConstant.COMMA));\n            user.setTitle(positionName);\n        }\n        user.setEmail(sysUser.getEmail());\n        // 查询并同步用户部门关系\n        List<SysDepart> departList = this.getUserDepart(sysUser);\n        if (departList != null) {\n            List<Integer> departmentIdList = new ArrayList<>();\n            for (SysDepart sysDepart : departList) {\n                // 企业微信的部门id\n                Department department = this.getDepartmentByDepartId(sysDepart.getId(), allDepartment);\n                if (department != null) {\n                    departmentIdList.add(department.getDept_id());\n                }\n            }\n            user.setDept_id_list(departmentIdList.toArray(new Integer[]{}));\n            user.setDept_order_list(null);\n        }\n        if (oConvertUtils.isEmpty(user.getDept_id_list())) {\n            // 没有找到匹配部门，同步到根部门下\n            user.setDept_id_list(1);\n            user.setDept_order_list(null);\n        }\n        // --- 钉钉没有逻辑删除功能\n        // sysUser.getDelFlag()\n        // --- 钉钉没有冻结、启用禁用功能\n        // sysUser.getStatus()\n        return user;\n    }\n\n\n    /**\n     * 【同步用户】将【钉钉】的User对象转为SysUser（创建新用户）\n     */\n    private SysUser dtUserToSysUser(User dtUser) {\n        SysUser sysUser = new SysUser();\n        sysUser.setDelFlag(0);\n        // 通过 username 来关联\n        sysUser.setUsername(dtUser.getMobile());\n        // 密码默认为为手机号加门牌号，随机加盐\n        String password = \"\", salt = oConvertUtils.randomGen(8);\n        int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n        if(tenantId>0){\n            SysTenant tenant = tenantMapper.selectById(tenantId);\n            password = tenant.getHouseNumber()+dtUser.getMobile();\n        }else{\n            password = dtUser.getMobile();\n        }\n        String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt);\n        sysUser.setSalt(salt);\n        sysUser.setPassword(passwordEncode);\n        // 代码逻辑说明: 钉钉同步到本地的人员没有状态，导致同步之后无法登录 #I3ZC2L\n        sysUser.setStatus(1);\n        sysUser.setLastPwdUpdateTime(new Date());\n        return this.dtUserToSysUser(dtUser, sysUser);\n    }\n\n    /**\n     * 【同步用户】将【钉钉】的User对象转为SysUser（更新旧用户）\n     */\n    private SysUser dtUserToSysUser(User dtUser, SysUser oldSysUser) {\n        SysUser sysUser = new SysUser();\n        BeanUtils.copyProperties(oldSysUser, sysUser);\n        sysUser.setTelephone(dtUser.getTelephone());\n        //如果真实姓名为空的情况下，才会改真实姓名\n        if(oConvertUtils.isEmpty(oldSysUser.getRealname())){\n            sysUser.setRealname(dtUser.getName());\n        }\n        // 因为唯一键约束的原因，如果原数据和旧数据相同，就不更新\n        if (oConvertUtils.isNotEmpty(dtUser.getEmail()) && !dtUser.getEmail().equals(sysUser.getEmail())) {\n            sysUser.setEmail(dtUser.getEmail());\n        } else {\n            sysUser.setEmail(null);\n        }\n        // 因为唯一键约束的原因，如果原数据和旧数据相同，就不更新\n        if (oConvertUtils.isNotEmpty(dtUser.getMobile()) && !dtUser.getMobile().equals(sysUser.getPhone())) {\n            sysUser.setPhone(dtUser.getMobile());\n        } else {\n            sysUser.setPhone(null);\n        }\n        // 设置工号，如果工号为空，则使用username\n        if (oConvertUtils.isEmpty(dtUser.getJob_number())) {\n            sysUser.setWorkNo(dtUser.getUserid());\n        } else {\n            sysUser.setWorkNo(dtUser.getJob_number());\n        }\n        // --- 钉钉没有逻辑删除功能\n        // sysUser.getDelFlag()\n        // --- 钉钉没有冻结、启用禁用功能\n        // sysUser.getStatus()\n        return sysUser;\n    }\n\n\n    /**\n     * 查询用户和部门的关系\n     */\n    private List<SysDepart> getUserDepart(SysUser sysUser) {\n        // 根据用户部门关系表查询出用户的部门\n        LambdaQueryWrapper<SysUserDepart> queryWrapper = new LambdaQueryWrapper<>();\n        queryWrapper.eq(SysUserDepart::getUserId, sysUser.getId());\n        List<SysUserDepart> sysUserDepartList = sysUserDepartService.list(queryWrapper);\n        if (sysUserDepartList.size() == 0) {\n            return null;\n        }\n        // 根据用户部门\n        LambdaQueryWrapper<SysDepart> departQueryWrapper = new LambdaQueryWrapper<>();\n        List<String> departIdList = sysUserDepartList.stream().map(SysUserDepart::getDepId).collect(Collectors.toList());\n        departQueryWrapper.in(SysDepart::getId, departIdList);\n        List<SysDepart> departList = sysDepartService.list(departQueryWrapper);\n        return departList.size() == 0 ? null : departList;\n    }\n\n    /**\n     * 根据sysDepartId查询钉钉的部门\n     */\n    private Department getDepartmentByDepartId(String departId, List<Department> allDepartment) {\n        for (Department department : allDepartment) {\n            if (departId.equals(department.getSource_identifier())) {\n                return department;\n            }\n        }\n        return null;\n    }\n\n\n    /**\n     * 【同步部门】将SysDepartTreeModel转为【钉钉】的Department对象（创建新部门）\n     */\n    private Department sysDepartToDtDepartment(SysDepartTreeModel departTree, Integer parentId) {\n        Department department = new Department();\n        department.setSource_identifier(departTree.getId());\n        return this.sysDepartToDtDepartment(departTree, department, parentId);\n    }\n\n    /**\n     * 【同步部门】将SysDepartTreeModel转为【钉钉】的Department对象\n     */\n    private Department sysDepartToDtDepartment(SysDepartTreeModel departTree, Department department, Integer parentId) {\n        department.setName(departTree.getDepartName());\n        department.setParent_id(parentId);\n        department.setOrder(departTree.getDepartOrder());\n        return department;\n    }\n\n\n    /**\n     * 【同步部门】将【钉钉】的Department对象转为SysDepartTreeModel\n     */\n    private SysDepart dtDepartmentToSysDepart(Department department, SysDepart departTree) {\n        SysDepart sysDepart = new SysDepart();\n        if (departTree != null) {\n            BeanUtils.copyProperties(departTree, sysDepart);\n        }\n        sysDepart.setDepartName(department.getName());\n        sysDepart.setDepartOrder(department.getOrder());\n        sysDepart.setDingIdentifier(department.getSource_identifier());\n        return sysDepart;\n    }\n\n    @Override\n    public int removeThirdAppUser(List<String> userIdList) {\n        // 判断启用状态\n        SysThirdAppConfig appConfig = getDingThirdAppConfig();\n        if (null == appConfig) {\n            return -1;\n        }\n        int count = 0;\n        if (userIdList != null && userIdList.size() > 0) {\n            // 代码逻辑说明: [QQYUN-3440]新建企业微信和钉钉配置表，通过租户模式隔离------------\n            String accessToken = this.getTenantAccessToken(appConfig);\n            if (accessToken == null) {\n                return count;\n            }\n            LambdaQueryWrapper<SysThirdAccount> queryWrapper = new LambdaQueryWrapper<>();\n            queryWrapper.eq(SysThirdAccount::getThirdType, THIRD_TYPE);\n            queryWrapper.in(SysThirdAccount::getSysUserId, userIdList);\n            // 根据userId，获取第三方用户的id\n            List<SysThirdAccount> thirdAccountList = sysThirdAccountService.list(queryWrapper);\n            List<String> thirdUserIdList = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList());\n\n            for (String thirdUserId : thirdUserIdList) {\n                if (oConvertUtils.isNotEmpty(thirdUserId)) {\n                    // 没有批量删除的接口\n                    Response<JSONObject> response = JdtUserAPI.delete(thirdUserId, accessToken);\n                    if (response.getErrcode() == 0) {\n                        count++;\n                    }\n                }\n            }\n        }\n        return count;\n\n    }\n\n    @Override\n    public boolean sendMessage(MessageDTO message) {\n        return this.sendMessage(message, false);\n    }\n\n    /**\n     * 发送消息\n     *\n     * @param message\n     * @param verifyConfig\n     * @return\n     */\n    @Override\n    public boolean sendMessage(MessageDTO message, boolean verifyConfig) {\n        Response<String> response;\n        if (message.isMarkdown()) {\n            response = this.sendMarkdownResponse(message, verifyConfig);\n        } else {\n            response = this.sendMessageResponse(message, verifyConfig);\n        }\n        if (response != null) {\n            return response.isSuccess();\n        }\n        return false;\n    }\n\n    /**\n     * 发送Markdown消息\n     * @param message\n     * @param verifyConfig\n     * @return\n     */\n    public Response<String> sendMarkdownResponse(MessageDTO message, boolean verifyConfig) {\n        SysThirdAppConfig config = this.getDingThirdAppConfig();\n        if (verifyConfig && null == config) {\n            return null;\n        }\n        String accessToken = this.getAccessToken();\n        if (accessToken == null) {\n            return null;\n        }\n        // 封装钉钉消息\n        String title = message.getTitle();\n        String content = message.getContent();\n        String agentId = config.getAgentId();\n        Message<MarkdownMessage> mdMessage = new Message<>(agentId, new MarkdownMessage(title, content));\n        if (message.getToAll()) {\n            mdMessage.setTo_all_user(true);\n        } else {\n            String[] toUsers = message.getToUser().split(\",\");\n            // 通过第三方账号表查询出第三方userId\n            int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), CommonConstant.TENANT_ID_DEFAULT_VALUE);\n            List<SysThirdAccount> thirdAccountList = sysThirdAccountService.listThirdUserIdByUsername(toUsers, THIRD_TYPE,tenantId);\n            List<String> dtUserIds = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList());\n            mdMessage.setUserid_list(dtUserIds);\n        }\n        return JdtMessageAPI.sendMarkdownMessage(mdMessage, accessToken);\n    }\n\n    public Response<String> sendMessageResponse(MessageDTO message, boolean verifyConfig) {\n        SysThirdAppConfig config = this.getDingThirdAppConfig();\n        if (verifyConfig && null == config) {\n            return null;\n        }\n        String accessToken = this.getAccessToken();\n        if (accessToken == null) {\n            return null;\n        }\n        // 封装钉钉消息\n        String content = message.getContent();\n        String agentId = config.getAgentId();\n        Message<TextMessage> textMessage = new Message<>(agentId, new TextMessage(content));\n        if (message.getToAll()) {\n            textMessage.setTo_all_user(true);\n        } else {\n            String[] toUsers = message.getToUser().split(\",\");\n            // 通过第三方账号表查询出第三方userId\n            int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), CommonConstant.TENANT_ID_DEFAULT_VALUE);\n            List<SysThirdAccount> thirdAccountList = sysThirdAccountService.listThirdUserIdByUsername(toUsers, THIRD_TYPE, tenantId);\n            List<String> dtUserIds = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList());\n            textMessage.setUserid_list(dtUserIds);\n        }\n        return JdtMessageAPI.sendTextMessage(textMessage, accessToken);\n    }\n\n    public boolean recallMessage(String msgTaskId) {\n        Response<JSONObject> response = this.recallMessageResponse(msgTaskId);\n        if (response == null) {\n            return false;\n        }\n        return response.isSuccess();\n    }\n\n    /**\n     * 撤回消息\n     *\n     * @param msgTaskId\n     * @return\n     */\n    public Response<JSONObject> recallMessageResponse(String msgTaskId) {\n        // 代码逻辑说明: [QQYUN-3440]新建企业微信和钉钉配置表，通过租户模式隔离------------\n        SysThirdAppConfig config = this.getDingThirdAppConfig();\n        String accessToken = this.getTenantAccessToken(config);\n        if (accessToken == null) {\n            return null;\n        }\n        String agentId = config.getAgentId();\n        return JdtMessageAPI.recallMessage(agentId, msgTaskId, accessToken);\n    }\n\n    /**\n     * 发送卡片消息（SysAnnouncement定制）\n     *\n     * @param announcement\n     * @param ddMobileUrl 钉钉打开网页地址\n     * @param verifyConfig 是否验证配置（未启用的APP会拒绝发送）\n     * @return\n     */\n    public Response<String> sendActionCardMessage(SysAnnouncement announcement, String ddMobileUrl, boolean verifyConfig) {\n        // 代码逻辑说明: [QQYUN-3440]新建企业微信和钉钉配置表，通过租户模式隔离------------\n        SysThirdAppConfig config = this.getDingThirdAppConfig();\n        if (verifyConfig && null == config) {\n            return null;\n        }\n        String accessToken = this.getTenantAccessToken(config);\n        if (accessToken == null) {\n            return null;\n        }\n        String agentId = config.getAgentId();\n        String emptySuffix = null;\n        if (oConvertUtils.isNotEmpty(announcement.getMsgAbstract())) {\n            String msgAbstract = announcement.getMsgAbstract().trim();\n            log.info(\"获取钉钉通知参数，msgAbstract: {}\", msgAbstract);\n            if (msgAbstract.startsWith(\"{\") && msgAbstract.endsWith(\"}\")) {\n                //如果摘要存的是业务扩展参数json，则取公告内容\n                emptySuffix = announcement.getMsgContent();\n            } else {\n                //如果摘要不为空且是文本格式，则使用摘要\n                emptySuffix = msgAbstract;\n            }\n        } else {\n            emptySuffix = \"空\";\n        }\n        \n        String markdown = \"### \" + announcement.getTitile() + \"\\n\" + emptySuffix;\n        log.info(\"钉钉推送参数, markdown: {}\", markdown);\n        ActionCardMessage actionCard = new ActionCardMessage(markdown);\n        actionCard.setTitle(announcement.getTitile());\n        actionCard.setSingle_title(\"详情\");\n        String baseUrl = null;\n        //优先通过请求获取basepath，获取不到读取 jeecg.domainUrl.pc\n        try {\n            baseUrl = RestUtil.getBaseUrl();\n        } catch (Exception e) {\n            log.warn(e.getMessage());\n            baseUrl =  jeecgBaseConfig.getDomainUrl().getPc();\n            //e.printStackTrace();\n        }\n\n        log.info(\"获取钉钉打开网页地址，参数 ddMobileUrl: {}\", ddMobileUrl);\n        String ddSingleUrl = null;\n        if (oConvertUtils.isNotEmpty(ddMobileUrl)) {\n            ddSingleUrl = ddMobileUrl;\n        } else {\n            ddSingleUrl = baseUrl + \"/sys/annountCement/show/\" + announcement.getId();\n        }\n        actionCard.setSingle_url(ddSingleUrl);\n        log.info(\"获取钉钉打开网页地址，最终地址 ddSingleUrl: {}\", ddSingleUrl);\n        \n        Message<ActionCardMessage> actionCardMessage = new Message<>(agentId, actionCard);\n        if (CommonConstant.MSG_TYPE_ALL.equals(announcement.getMsgType())) {\n            actionCardMessage.setTo_all_user(true);\n            return JdtMessageAPI.sendActionCardMessage(actionCardMessage, accessToken);\n        } else {\n            // 将userId转为username\n            String[] userIds = null;\n            String userId = announcement.getUserIds();\n            if(oConvertUtils.isNotEmpty(userId)){\n                userIds = userId.substring(0, (userId.length() - 1)).split(\",\");\n            }else{\n                LambdaQueryWrapper<SysAnnouncementSend> queryWrapper = new LambdaQueryWrapper<>();\n                queryWrapper.eq(SysAnnouncementSend::getAnntId, announcement.getId());\n                SysAnnouncementSend sysAnnouncementSend = sysAnnouncementSendMapper.selectOne(queryWrapper);\n                userIds = new String[] {sysAnnouncementSend.getUserId()};\n            }\n\n            if(userIds!=null){\n                LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();\n                queryWrapper.in(SysUser::getId, userIds);\n                List<SysUser> userList = userMapper.selectList(queryWrapper);\n                String[] usernameList = userList.stream().map(SysUser::getUsername).toArray(String[] :: new);\n\n                // 通过第三方账号表查询出第三方userId\n                int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), CommonConstant.TENANT_ID_DEFAULT_VALUE);\n                List<SysThirdAccount> thirdAccountList = sysThirdAccountService.listThirdUserIdByUsername(usernameList, THIRD_TYPE, tenantId);\n                List<String> dtUserIds = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList());\n                actionCardMessage.setUserid_list(dtUserIds);\n                return JdtMessageAPI.sendActionCardMessage(actionCardMessage, accessToken);\n            }\n        }\n        return null;\n    }\n\n    /**\n     * OAuth2登录，成功返回登录的SysUser，失败返回null\n     */\n    public SysUser oauth2Login(String authCode,Integer tenantId) {\n        this.tenantIzExist(tenantId);\n        // 代码逻辑说明: [QQYUN-3440]新建企业微信和钉钉配置表，通过租户模式隔离------------\n        SysThirdAppConfig dtConfig = configMapper.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType());\n        // 1. 根据免登授权码获取用户 AccessToken\n        String userAccessToken = JdtOauth2API.getUserAccessToken(dtConfig.getClientId(), dtConfig.getClientSecret(), authCode);\n        if (userAccessToken == null) {\n            log.error(\"oauth2Login userAccessToken is null\");\n            throw new JeecgBootException(\"请查看应用key和应用秘钥是否正确，组织ID是否匹配\");\n        }\n        // 2. 根据用户 AccessToken 获取当前用户的基本信息（不包括userId）\n        ContactUser contactUser = JdtOauth2API.getContactUsers(\"me\", userAccessToken);\n        if (contactUser == null) {\n            log.error(\"oauth2Login contactUser is null\");\n            throw new JeecgBootException(\"获取钉钉用户信息失败\");\n        }\n        String unionId = contactUser.getUnionId();\n        // 3. 根据获取到的 unionId 换取用户 userId\n        String accessToken = this.getTenantAccessToken(dtConfig);\n        if (accessToken == null) {\n            log.error(\"oauth2Login accessToken is null\");\n            throw new JeecgBootException(\"请查看应用key和应用秘钥是否正确，组织ID是否匹配\");\n        }\n        Response<String> getUserIdRes = JdtUserAPI.getUseridByUnionid(unionId, accessToken);\n        if (!getUserIdRes.isSuccess()) {\n            log.error(\"oauth2Login getUseridByUnionid failed: \" + JSON.toJSONString(getUserIdRes));\n            throw new JeecgBootException(\"获取钉钉用户信息失败\");\n        }\n        String appUserId = getUserIdRes.getResult();\n        log.info(\"appUserId: \" + appUserId);\n        if (appUserId != null) {\n            // 判断第三方用户表有没有这个人\n            LambdaQueryWrapper<SysThirdAccount> queryWrapper = new LambdaQueryWrapper<>();\n            queryWrapper.eq(SysThirdAccount::getThirdType, THIRD_TYPE);\n            queryWrapper.eq(SysThirdAccount::getTenantId, tenantId);\n            // 代码逻辑说明: auth登录需要联查一下---\n            queryWrapper.and((wrapper)->wrapper.eq(SysThirdAccount::getThirdUserUuid,appUserId).or().eq(SysThirdAccount::getThirdUserId,appUserId));\n            SysThirdAccount thirdAccount = sysThirdAccountService.getOne(queryWrapper);\n            if (thirdAccount != null) {\n                return this.getSysUserByThird(thirdAccount, null, appUserId, accessToken,tenantId);\n            } else {\n                // 直接创建新账号\n                User appUser = JdtUserAPI.getUserById(appUserId, accessToken).getResult();\n                //代码逻辑说明: [QQYUN-4883]钉钉auth登录同一个租户下有同一个用户id------------\n                //应该存uuid\n                ThirdLoginModel tlm = new ThirdLoginModel(THIRD_TYPE, appUser.getUnionid(), appUser.getName(), appUser.getAvatar());\n                thirdAccount = sysThirdAccountService.saveThirdUser(tlm,tenantId);\n                return this.getSysUserByThird(thirdAccount, appUser, null, null,tenantId);\n            }\n        }\n        return null;\n    }\n\n    /**\n     * 根据第三方账号获取本地账号，如果不存在就创建\n     *\n     * @param thirdAccount\n     * @param appUser\n     * @param appUserId\n     * @param accessToken\n     * @param tenantId\n     * @return\n     */\n    private SysUser getSysUserByThird(SysThirdAccount thirdAccount, User appUser, String appUserId, String accessToken, Integer tenantId) {\n        String sysUserId = thirdAccount.getSysUserId();\n        if (oConvertUtils.isNotEmpty(sysUserId)) {\n            return userMapper.selectById(sysUserId);\n        } else {\n            // 如果没有 sysUserId ，说明没有绑定账号，获取到手机号之后进行绑定\n            if (appUser == null) {\n                appUser = JdtUserAPI.getUserById(appUserId, accessToken).getResult();\n            }\n            // 判断系统里是否有这个手机号的用户\n            SysUser sysUser = userMapper.getUserByPhone(appUser.getMobile());\n            if (sysUser != null) {\n                thirdAccount.setAvatar(appUser.getAvatar());\n                thirdAccount.setRealname(appUser.getName());\n                thirdAccount.setThirdUserId(appUser.getUserid());\n                // 代码逻辑说明: [QQYUN-4883]钉钉auth登录同一个租户下有同一个用户id------------\n                thirdAccount.setThirdUserUuid(appUser.getUnionid());\n                thirdAccount.setSysUserId(sysUser.getId());\n                sysThirdAccountService.updateById(thirdAccount);\n                return sysUser;\n            } else {\n                // 没有就走创建逻辑\n                return sysThirdAccountService.createUser(appUser.getMobile(), appUser.getUnionid(),tenantId);\n            }\n\n        }\n    }\n\n    //========================begin 应用低代码钉钉同步用户部门专用 ====================\n\n    /**\n     * 根据类型和租户id获取钉钉配置\n     * @return\n     */\n    private SysThirdAppConfig getDingThirdAppConfig(){\n        int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n        this.tenantIzExist(tenantId);\n        return configMapper.getThirdConfigByThirdType(tenantId,MessageTypeEnum.DD.getType());\n    }\n\n    /**\n     * 获取钉钉accessToken\n     * @param config\n     * @return\n     */\n    private String getTenantAccessToken(SysThirdAppConfig config) {\n        if(null == config){\n            return null;\n        }\n        AccessToken accessToken = JdtBaseAPI.getAccessToken(config.getClientId(), config.getClientSecret());\n        if (accessToken != null) {\n            return accessToken.getAccessToken();\n        }\n        log.warn(\"获取AccessToken失败\");\n        return null;\n    }\n\n    /**\n     * 添加或保存用户租户\n     * @param userId\n     * @param isUpdate 是否是新增\n     */\n    private void createUserTenant(String userId,Boolean isUpdate){\n        if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n            int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n            //判断当前用户是否已在该租户下面\n            Integer count = userTenantMapper.userTenantIzExist(userId, tenantId);\n            //count 为0 新增租户用户,否则不用新增\n            if(count == 0){\n                SysUserTenant userTenant = new SysUserTenant();\n                userTenant.setTenantId(tenantId);\n                userTenant.setUserId(userId);\n                userTenant.setStatus(isUpdate?CommonConstant.USER_TENANT_UNDER_REVIEW:CommonConstant.USER_TENANT_NORMAL);\n                userTenantMapper.insert(userTenant);\n            }\n        }\n    }\n\n    /**\n     * 同步用户和部门\n     * @return\n     */\n    public SyncInfoVo syncThirdAppDepartmentUserToLocal() {\n        SyncInfoVo syncInfo = new SyncInfoVo();\n        String accessToken = this.getAccessToken();\n        if (accessToken == null) {\n            syncInfo.addFailInfo(\"accessToken获取失败！\");\n            return syncInfo;\n        }\n        // 获取【钉钉】所有的部门\n        List<Department> departments = JdtDepartmentAPI.listAll(accessToken);\n        // 代码逻辑说明: 【TV360X-1316】钉钉同步提示消息不正确---\n        if(departments.isEmpty()){\n            throw new JeecgBootBizTipException(\"请查看配置参数和白名单是否配置！\");\n        }\n        String username = JwtUtil.getUserNameByToken(SpringContextUtils.getHttpServletRequest());\n        List<JdtDepartmentTreeVo> departmentTreeList = JdtDepartmentTreeVo.listToTree(departments);\n        int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n        // 递归同步部门\n        this.syncDepartmentToLocalRecursion(departmentTreeList, null, username, syncInfo, accessToken,true,tenantId);\n        return syncInfo;\n    }\n\n\n    /**\n     * 添加用户及用户部门关系\n     * @param departId 部门id\n     * @param dingDepartId 钉钉部门id\n     * @param accessToken\n     * @param syncInfo\n     * @param syncedUserIdSet\n     */\n    private void addDepartUser(String departId, Integer dingDepartId, String accessToken, SyncInfoVo syncInfo, Set<String> syncedUserIdSet, Integer tenantId) {\n        List<User> userList = new ArrayList<>();\n        getUserListByDeptIdRecursion(dingDepartId, 0, userList, accessToken);\n        for (User user : userList) {\n            if (syncedUserIdSet.contains(user.getUserid())) {\n                //需要同步用户部门\n                this.syncAddOrUpdateUserDepart(user.getUserid(),departId);\n                continue;\n            }\n            syncedUserIdSet.add(user.getUserid());\n            SysUser userByPhone = userMapper.getUserByPhone(user.getMobile());\n            SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByUuidAndThirdType(user.getUnionid(), THIRD_TYPE,tenantId,user.getUserid());\n            if (null != userByPhone) {\n                // 循环到此说明用户匹配成功，进行更新操作\n                SysUser updateSysUser = this.dtUserToSysUser(user, userByPhone);\n                try {\n                    userMapper.updateById(updateSysUser);\n                    String str = String.format(\"用户 %s(%s) 更新成功！\", updateSysUser.getRealname(), updateSysUser.getUsername());\n                    // 代码逻辑说明: 【TV360X-1317】钉钉同步 同步成功之后 重复提示---\n                    if(!syncInfo.getSuccessInfo().contains(str)){\n                        syncInfo.addSuccessInfo(str);\n                    }\n                } catch (Exception e) {\n                    this.syncUserCollectErrInfo(e, user, syncInfo);\n                }\n                //第三方账号关系表\n                this.thirdAccountSaveOrUpdate(sysThirdAccount, updateSysUser.getId(), user, tenantId);\n                //创建当前租户\n                this.createUserTenant(updateSysUser.getId(),true);\n                //需要同步用户部门\n                this.syncAddOrUpdateUserDepart(updateSysUser.getId(),departId);\n            } else {\n                // 如果没有匹配到用户，则走创建逻辑\n                SysUser newSysUser = this.dtUserToSysUser(user);\n                try {\n                    userMapper.insert(newSysUser);\n                    String str = String.format(\"用户 %s(%s) 创建成功！\", newSysUser.getRealname(), newSysUser.getUsername());\n                    syncInfo.addSuccessInfo(str);\n                } catch (Exception e) {\n                    this.syncUserCollectErrInfo(e, user, syncInfo);\n                }\n                //第三方账号关系表\n                this.thirdAccountSaveOrUpdate(sysThirdAccount, newSysUser.getId(), user,tenantId);\n                //创建当前租户\n                this.createUserTenant(newSysUser.getId(),false);\n                //需要同步用户部门\n                this.syncAddOrUpdateUserDepart(newSysUser.getId(),departId);\n            }\n        }\n    }\n\n    /**\n     * 通过用户id和部门id新增用户部门关系表\n     * @param userId\n     * @param departId\n     */\n    private void syncAddOrUpdateUserDepart(String userId, String departId) {\n        //查询用户是否在部门里面\n        LambdaQueryWrapper<SysUserDepart> query = new LambdaQueryWrapper<>();\n        query.eq(SysUserDepart::getDepId,departId);\n        query.eq(SysUserDepart::getUserId,userId);\n        long count = sysUserDepartService.count(query);\n        if(count == 0){\n            //不存在，则新增部门用户关系\n            SysUserDepart sysUserDepart = new SysUserDepart(null,userId,departId);\n            sysUserDepartService.save(sysUserDepart);\n        }\n    }\n\n    //========================end 应用低代码钉钉同步用户部门专用 ====================\n\n    /**\n     * 验证租户是否存在\n     * @param tenantId\n     */\n    public void tenantIzExist(Integer tenantId){\n        if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){\n            Long count = tenantMapper.tenantIzExist(tenantId);\n            if(ObjectUtil.isEmpty(count) || 0 == count){\n                throw new JeecgBootException(\"租户ID:\" + tenantId + \"无效，平台中不存在！\");\n            }\n        }\n    }\n\n    //=================================== begin 新版钉钉登录 ============================================\n    /**\n     * 钉钉登录获取用户信息\n     * 【QQYUN-9421】钉钉登录后打开了敲敲云，换其他账号登录后，再打开敲敲云显示的是原来账号的应用\n     * @param authCode\n     * @param tenantId\n     * @return\n     */\n    public SysUser oauthDingDingLogin(String authCode, Integer tenantId) {\n        Long count = tenantMapper.tenantIzExist(tenantId);\n        if(ObjectUtil.isEmpty(count) || 0 == count){\n            throw new JeecgBootException(\"租户不存在！\");\n        }\n        SysThirdAppConfig config = configMapper.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType());\n        String accessToken = this.getTenantAccessToken(config);\n        if(StringUtils.isEmpty(accessToken)){\n            throw new JeecgBootBizTipException(\"accessToken获取失败\");\n        }\n        String getUserInfoUrl = \"https://oapi.dingtalk.com/topapi/v2/user/getuserinfo?access_token=\" + accessToken;\n        Map<String,String> params = new HashMap<>();\n        params.put(\"code\",authCode);\n        Response<JSONObject> userInfoResponse = HttpUtil.post(getUserInfoUrl, JSON.toJSONString(params));\n        if (userInfoResponse.isSuccess()) {\n            String userId = userInfoResponse.getResult().getString(\"userid\");\n            // 判断第三方用户表有没有这个人\n            LambdaQueryWrapper<SysThirdAccount> queryWrapper = new LambdaQueryWrapper<>();\n            queryWrapper.eq(SysThirdAccount::getThirdType, THIRD_TYPE);\n            queryWrapper.eq(SysThirdAccount::getTenantId, tenantId);\n            queryWrapper.and((wrapper)->wrapper.eq(SysThirdAccount::getThirdUserUuid,userId).or().eq(SysThirdAccount::getThirdUserId,userId));\n            SysThirdAccount thirdAccount = sysThirdAccountService.getOne(queryWrapper);\n            if (thirdAccount != null) {\n                return this.getSysUserByThird(thirdAccount, null, userId, accessToken, tenantId);\n            }else{\n                throw new JeecgBootException(\"该用户没有同步，请先同步！\");\n            }\n        }\n        return null;\n    }\n\n    /**\n     * 根据租户id获取企业id和应用id\n     * 【QQYUN-9421】钉钉登录后打开了敲敲云，换其他账号登录后，再打开敲敲云显示的是原来账号的应用\n     * @param tenantId\n     */\n    public SysThirdAppConfig getCorpIdClientId(Integer tenantId) {\n        LambdaQueryWrapper<SysThirdAppConfig> queryWrapper = new LambdaQueryWrapper<>();\n        queryWrapper.eq(SysThirdAppConfig::getThirdType, THIRD_TYPE);\n        queryWrapper.eq(SysThirdAppConfig::getTenantId, tenantId);\n        queryWrapper.select(SysThirdAppConfig::getCorpId,SysThirdAppConfig::getClientId);\n        return configMapper.selectOne(queryWrapper);\n    }\n    //=================================== end 新版钉钉登录 ============================================\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java",
    "content": "package org.jeecg.modules.system.service.impl;\n\nimport cn.hutool.core.util.ObjectUtil;\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.jeecg.qywx.api.base.JwAccessTokenAPI;\nimport com.jeecg.qywx.api.core.common.AccessToken;\nimport com.jeecg.qywx.api.department.JwDepartmentAPI;\nimport com.jeecg.qywx.api.department.vo.DepartMsgResponse;\nimport com.jeecg.qywx.api.department.vo.Department;\nimport com.jeecg.qywx.api.message.JwMessageAPI;\nimport com.jeecg.qywx.api.message.vo.*;\nimport com.jeecg.qywx.api.user.JwUserAPI;\nimport com.jeecg.qywx.api.user.vo.User;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.apache.http.HttpEntity;\nimport org.apache.http.client.config.RequestConfig;\nimport org.apache.http.client.methods.CloseableHttpResponse;\nimport org.apache.http.client.methods.HttpPost;\nimport org.apache.http.entity.ContentType;\nimport org.apache.http.entity.StringEntity;\nimport org.apache.http.impl.client.CloseableHttpClient;\nimport org.apache.http.impl.client.HttpClients;\nimport org.apache.http.util.EntityUtils;\nimport org.jeecg.common.api.dto.message.MessageDTO;\nimport org.jeecg.common.config.TenantContext;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.constant.enums.MessageTypeEnum;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.system.util.JwtUtil;\nimport org.jeecg.common.util.PasswordUtil;\nimport org.jeecg.common.util.RestUtil;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.jeecg.config.mybatis.MybatisPlusSaasConfig;\nimport org.jeecg.modules.system.entity.*;\nimport org.jeecg.modules.system.mapper.*;\nimport org.jeecg.modules.system.model.SysDepartTreeModel;\nimport org.jeecg.modules.system.service.*;\nimport org.jeecg.modules.system.vo.thirdapp.JwDepartmentTreeVo;\nimport org.jeecg.modules.system.vo.thirdapp.JwSysUserDepartVo;\nimport org.jeecg.modules.system.vo.thirdapp.JwUserDepartVo;\nimport org.jeecg.modules.system.vo.thirdapp.SyncInfoVo;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.dao.DuplicateKeyException;\nimport org.springframework.stereotype.Service;\n\nimport java.io.IOException;\nimport java.util.*;\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport java.util.stream.Collectors;\n\n/**\n * 第三方App对接：企业微信实现类\n * @author: jeecg-boot\n */\n@Slf4j\n@Service\npublic class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService {\n\n    @Autowired\n    JeecgBaseConfig jeecgBaseConfig;\n    @Autowired\n    private ISysDepartService sysDepartService;\n    @Autowired\n    private SysUserMapper userMapper;\n    @Autowired\n    private ISysThirdAccountService sysThirdAccountService;\n    @Autowired\n    private ISysUserDepartService sysUserDepartService;\n    @Autowired\n    private ISysPositionService sysPositionService;\n    @Autowired\n    private SysAnnouncementSendMapper sysAnnouncementSendMapper;\n    @Autowired\n    private SysThirdAppConfigMapper configMapper;\n    @Autowired\n    private SysTenantMapper sysTenantMapper;\n    @Autowired\n    private SysUserTenantMapper sysUserTenantMapper;\n    @Autowired\n    private SysThirdAccountMapper sysThirdAccountMapper;\n    @Autowired\n    private SysTenantMapper tenantMapper;\n    \n    \n    /**\n     * errcode\n     */\n    private static final String ERR_CODE = \"errcode\";\n\n    /**\n     * 第三方APP类型，当前固定为 wechat_enterprise\n     */\n    public final String THIRD_TYPE = \"wechat_enterprise\";\n\n    @Override\n    public String getAccessToken() {\n        // 代码逻辑说明: [QQYUN-3440]新建企业微信和钉钉配置表，通过租户模式隔离------------\n        SysThirdAppConfig config = this.getWeChatThirdAppConfig();\n        String corpId = config.getClientId();\n        String secret = config.getClientSecret();\n        AccessToken accessToken = JwAccessTokenAPI.getAccessToken(corpId, secret);\n        if (accessToken != null) {\n            return accessToken.getAccesstoken();\n        }\n        log.warn(\"获取AccessToken失败\");\n        return null;\n    }\n\n    /** 获取APPToken，新版企业微信的秘钥是分开的 */\n    public String getAppAccessToken(SysThirdAppConfig config) {\n        // 代码逻辑说明: [QQYUN-3440]新建企业微信和钉钉配置表，通过租户模式隔离------------\n        String corpId = config.getClientId();\n        // 如果没有配置APP秘钥，就说明是老企业，可以通用秘钥\n        String secret = config.getClientSecret();\n\n        AccessToken accessToken = JwAccessTokenAPI.getAccessToken(corpId, secret);\n        if (accessToken != null) {\n            return accessToken.getAccesstoken();\n        }\n        log.warn(\"获取AccessToken失败\");\n        return null;\n    }\n\n    @Override\n    public SyncInfoVo syncLocalDepartmentToThirdApp(String ids) {\n        SyncInfoVo syncInfo = new SyncInfoVo();\n        String accessToken = this.getAccessToken();\n        if (accessToken == null) {\n            syncInfo.addFailInfo(\"accessToken获取失败！\");\n            return syncInfo;\n        }\n        // 获取企业微信所有的部门\n        List<Department> departments = JwDepartmentAPI.getAllDepartment(accessToken);\n        if (departments == null) {\n            syncInfo.addFailInfo(\"获取企业微信所有部门失败！\");\n            return syncInfo;\n        }\n        // 删除企业微信有但本地没有的部门（以本地部门数据为主）(以为企业微信不能创建同名部门，所以只能先删除）\n        List<JwDepartmentTreeVo> departmentTreeList = JwDepartmentTreeVo.listToTree(departments);\n        this.deleteDepartRecursion(departmentTreeList, accessToken, true);\n        // 获取本地所有部门树结构\n        List<SysDepartTreeModel> sysDepartsTree = sysDepartService.queryTreeList();\n        // -- 企业微信不能创建新的顶级部门，所以新的顶级部门的parentId就为1\n        Department parent = new Department();\n        parent.setId(\"1\");\n        // 递归同步部门\n        departments = JwDepartmentAPI.getAllDepartment(accessToken);\n        this.syncDepartmentRecursion(sysDepartsTree, departments, parent, accessToken);\n        return syncInfo;\n    }\n\n    /**\n     * 递归删除部门以及子部门，由于企业微信不允许删除带有成员和子部门的部门，所以需要递归删除下子部门，然后把部门成员移动端根部门下\n     * @param children\n     * @param accessToken\n     * @param ifLocal\n     */\n    private void deleteDepartRecursion(List<JwDepartmentTreeVo> children, String accessToken, boolean ifLocal) {\n        for (JwDepartmentTreeVo departmentTree : children) {\n            String depId = departmentTree.getId();\n            // 过滤根部门\n            if (!\"1\".equals(depId)) {\n                // 判断本地是否有该部门\n                if (ifLocal) {\n                    LambdaQueryWrapper<SysDepart> queryWrapper = new LambdaQueryWrapper<>();\n                    queryWrapper.eq(SysDepart::getQywxIdentifier, depId);\n                    SysDepart sysDepart = sysDepartService.getOne(queryWrapper);\n                    // 本地有该部门，不删除\n                    if (sysDepart != null) {\n                        if (departmentTree.hasChildren()) {\n                            this.deleteDepartRecursion(departmentTree.getChildren(), accessToken, true);\n                        }\n                        continue;\n                    }\n                }\n                // 判断是否有成员，有就移动到根部门\n                List<User> departUserList = JwUserAPI.getUsersByDepartid(depId, \"1\", null, accessToken);\n                if (departUserList != null && departUserList.size() > 0) {\n                    for (User user : departUserList) {\n                        User updateUser = new User();\n                        updateUser.setUserid(user.getUserid());\n                        updateUser.setDepartment(new Integer[]{1});\n                        JwUserAPI.updateUser(updateUser, accessToken);\n                    }\n                }\n                // 有子部门优先删除子部门\n                if (departmentTree.hasChildren()) {\n                    this.deleteDepartRecursion(departmentTree.getChildren(), accessToken, false);\n                }\n                // 执行删除操作\n                JwDepartmentAPI.deleteDepart(depId, accessToken);\n            }\n        }\n    }\n\n    /**\n     * 递归同步部门到第三方APP\n     * @param sysDepartsTree\n     * @param departments\n     * @param parent\n     * @param accessToken\n     */\n    private void syncDepartmentRecursion(List<SysDepartTreeModel> sysDepartsTree, List<Department> departments, Department parent, String accessToken) {\n        if (sysDepartsTree != null && sysDepartsTree.size() != 0) {\n            for1:\n            for (SysDepartTreeModel depart : sysDepartsTree) {\n                for (Department department : departments) {\n                    // id相同，代表已存在，执行修改操作\n                    if (department.getId().equals(depart.getQywxIdentifier())) {\n                        this.sysDepartToQwDepartment(depart, department, parent.getId());\n                        JwDepartmentAPI.updateDepart(department, accessToken);\n                        // 紧接着同步子级\n                        this.syncDepartmentRecursion(depart.getChildren(), departments, department, accessToken);\n                        // 跳出外部循环\n                        continue for1;\n                    }\n                }\n                // 循环到此说明是新部门，直接调接口创建\n                Department newDepartment = this.sysDepartToQwDepartment(depart, parent.getId());\n                DepartMsgResponse response = JwDepartmentAPI.createDepartment(newDepartment, accessToken);\n                // 创建成功，将返回的id绑定到本地\n                if (response != null && response.getId() != null) {\n                    SysDepart sysDepart = new SysDepart();\n                    sysDepart.setId(depart.getId());\n                    sysDepart.setQywxIdentifier(response.getId().toString());\n                    sysDepartService.updateById(sysDepart);\n                    Department newParent = new Department();\n                    newParent.setId(response.getId().toString());\n                    // 紧接着同步子级\n                    this.syncDepartmentRecursion(depart.getChildren(), departments, newParent, accessToken);\n                }\n                // 收集错误信息\n//                this.syncUserCollectErrInfo(errCode, sysUser, errInfo);\n            }\n        }\n    }\n\n    public SyncInfoVo syncThirdAppDepartmentToLocal(Integer tenantId, Map<String,String> map) {\n        SyncInfoVo syncInfo = new SyncInfoVo();\n        String accessToken = this.getAccessToken();\n        if (accessToken == null) {\n            syncInfo.addFailInfo(\"accessToken获取失败！\");\n            return syncInfo;\n        }\n        // 获取企业微信所有的部门\n        List<Department> departments = JwDepartmentAPI.getAllDepartment(accessToken);\n        if (departments == null) {\n            syncInfo.addFailInfo(\"企业微信部门信息获取失败！\");\n            return syncInfo;\n        }\n        String username = JwtUtil.getUserNameByToken(SpringContextUtils.getHttpServletRequest());\n        // 将list转为tree\n        List<JwDepartmentTreeVo> departmentTreeList = JwDepartmentTreeVo.listToTree(departments);\n        // 递归同步部门\n        this.syncDepartmentToLocalRecursion(departmentTreeList, null, username, syncInfo, tenantId, map);\n        return syncInfo;\n    }\n\n    /**\n     * 递归同步部门到本地\n     */\n    private void syncDepartmentToLocalRecursion(List<JwDepartmentTreeVo> departmentTreeList, String sysParentId, String username, SyncInfoVo syncInfo,Integer tenantId, Map<String,String> map) {\n        if (departmentTreeList != null && departmentTreeList.size() != 0) {\n            for (JwDepartmentTreeVo departmentTree : departmentTreeList) {\n                String depId = departmentTree.getId();\n                LambdaQueryWrapper<SysDepart> queryWrapper = new LambdaQueryWrapper<>();\n                // 根据 qywxIdentifier 字段和租户id查询，租户id默认为0\n                queryWrapper.eq(SysDepart::getQywxIdentifier, depId);\n                queryWrapper.eq(SysDepart::getTenantId, tenantId);\n                SysDepart sysDepart = sysDepartService.getOne(queryWrapper);\n                if (sysDepart != null) {\n                    //  执行更新操作\n                    SysDepart updateSysDepart = this.qwDepartmentToSysDepart(departmentTree, sysDepart);\n                    // 代码逻辑说明: 【issues/6017】企业微信同步部门时没有最顶层的部门名，同步用户时，用户没有部门信息---\n                    if (sysParentId != null && !\"0\".equals(sysParentId)) {\n                        updateSysDepart.setParentId(sysParentId);\n                    }\n                    try {\n                        sysDepartService.updateDepartDataById(updateSysDepart, username);\n                        String str = String.format(\"部门 %s 更新成功！\", updateSysDepart.getDepartName());\n                        syncInfo.addSuccessInfo(str);\n                        map.put(depId,updateSysDepart.getId());\n                    } catch (Exception e) {\n                        this.syncDepartCollectErrInfo(e, departmentTree, syncInfo);\n                    }\n                    if (departmentTree.hasChildren()) {\n                        // 紧接着同步子级\n                        this.syncDepartmentToLocalRecursion(departmentTree.getChildren(), updateSysDepart.getId(), username, syncInfo, tenantId, map);\n                    }\n                } else {\n                    // 执行新增操作\n                    SysDepart newSysDepart = this.qwDepartmentToSysDepart(departmentTree, null);\n                    if (sysParentId != null && !\"0\".equals(sysParentId)) {\n                        newSysDepart.setParentId(sysParentId);\n                        // 2 = 组织机构\n                        newSysDepart.setOrgCategory(\"2\");\n                    } else {\n                        // 1 = 公司\n                        newSysDepart.setOrgCategory(\"1\");\n                    }\n                    newSysDepart.setTenantId(tenantId);\n                    try {\n                        sysDepartService.saveDepartData(newSysDepart, username);\n                        String str = String.format(\"部门 %s 创建成功！\", newSysDepart.getDepartName());\n                        syncInfo.addSuccessInfo(str);\n                        map.put(depId,newSysDepart.getId());\n                    } catch (Exception e) {\n                        this.syncDepartCollectErrInfo(e, departmentTree, syncInfo);\n                    }\n                    // 紧接着同步子级\n                    if (departmentTree.hasChildren()) {\n                        this.syncDepartmentToLocalRecursion(departmentTree.getChildren(), newSysDepart.getId(), username, syncInfo, tenantId, map);\n                    }\n                }\n            }\n        }\n    }\n\n    @Override\n    public SyncInfoVo syncLocalUserToThirdApp(String ids) {\n        SyncInfoVo syncInfo = new SyncInfoVo();\n        String accessToken = this.getAccessToken();\n        if (accessToken == null) {\n            syncInfo.addFailInfo(\"accessToken获取失败！\");\n            return syncInfo;\n        }\n        // 获取企业微信所有的用户\n//        List<User> qwUsers = JwUserAPI.getDetailUsersByDepartid(\"1\", null, null, accessToken);\n        // 获取企业微信所有的用户（只能获取userid）\n        List<User> qwUsers = JwUserAPI.getUserIdList(accessToken);\n\n        if (qwUsers == null) {\n            syncInfo.addFailInfo(\"企业微信用户列表查询失败！\");\n            return syncInfo;\n        }\n        List<SysUser> sysUsers;\n        if (StringUtils.isNotBlank(ids)) {\n            String[] idList = ids.split(\",\");\n            LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();\n            queryWrapper.in(SysUser::getId, (Object[]) idList);\n            // 获取本地指定用户\n            sysUsers = userMapper.selectList(queryWrapper);\n        } else {\n            // 获取本地所有用户\n            sysUsers = userMapper.selectList(Wrappers.emptyWrapper());\n        }\n\n        // 循环判断新用户和需要更新的用户\n        for1:\n        for (SysUser sysUser : sysUsers) {\n            // 外部模拟登陆临时账号，不同步\n            if (\"_reserve_user_external\".equals(sysUser.getUsername())) {\n                continue;\n            }\n            /*\n             * 判断是否同步过的逻辑：\n             * 1. 查询 sys_third_account（第三方账号表）是否有数据，如果有代表已同步\n             * 2. 本地表里没有，就先用手机号判断，不通过再用username判断。\n             */\n            User qwUser;\n            SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneBySysUserId(sysUser.getId(), THIRD_TYPE);\n            for (User qwUserTemp : qwUsers) {\n                if (sysThirdAccount == null || oConvertUtils.isEmpty(sysThirdAccount.getThirdUserId()) || !sysThirdAccount.getThirdUserId().equals(qwUserTemp.getUserid())) {\n                    // sys_third_account 表匹配失败，尝试用手机号匹配\n                    // 新版企业微信调整了API，现在只能通过userid来判断是否同步过了\n//                    String phone = sysUser.getPhone();\n//                    if (!(oConvertUtils.isEmpty(phone) || phone.equals(qwUserTemp.getMobile()))) {\n                        // 手机号匹配失败，再尝试用username匹配\n                        String username = sysUser.getUsername();\n                        if (!(oConvertUtils.isEmpty(username) || username.equals(qwUserTemp.getUserid()))) {\n                            // username 匹配失败，直接跳到下一次循环继续\n                            continue;\n                        }\n//                    }\n                }\n                // 循环到此说明用户匹配成功，进行更新操作\n                qwUser = this.sysUserToQwUser(sysUser, qwUserTemp);\n                int errCode = JwUserAPI.updateUser(qwUser, accessToken);\n                // 收集错误信息\n                this.syncUserCollectErrInfo(errCode, sysUser, syncInfo);\n                this.thirdAccountSaveOrUpdate(sysThirdAccount, sysUser.getId(), qwUser.getUserid(),qwUser.getName(), null);\n                // 更新完成，直接跳到下一次外部循环继续\n                continue for1;\n            }\n            // 循环到此说明是新用户，直接调接口创建\n            qwUser = this.sysUserToQwUser(sysUser);\n            int errCode = JwUserAPI.createUser(qwUser, accessToken);\n            // 收集错误信息\n            boolean apiSuccess = this.syncUserCollectErrInfo(errCode, sysUser, syncInfo);\n            if (apiSuccess) {\n                this.thirdAccountSaveOrUpdate(sysThirdAccount, sysUser.getId(), qwUser.getUserid(),qwUser.getName(), null);\n            }\n        }\n        return syncInfo;\n    }\n\n//    @Override\n//    public SyncInfoVo syncThirdAppUserToLocal() {\n//        SyncInfoVo syncInfo = new SyncInfoVo();\n//        String accessToken = this.getAccessToken();\n//        if (accessToken == null) {\n//            syncInfo.addFailInfo(\"accessToken获取失败！\");\n//            return syncInfo;\n//        }\n//        // 获取企业微信所有的用户\n//        List<User> qwUsersList = JwUserAPI.getDetailUsersByDepartid(\"1\", null, null, accessToken);\n//        if (qwUsersList == null) {\n//            syncInfo.addFailInfo(\"企业微信用户列表查询失败！\");\n//            return syncInfo;\n//        }\n//        //查询本地用户\n//        List<SysUser> sysUsersList = userMapper.selectList(Wrappers.emptyWrapper());\n//        // 循环判断新用户和需要更新的用户\n//        for (User qwUser : qwUsersList) {\n//            /*\n//             * 判断是否同步过的逻辑：\n//             * 1. 查询 sys_third_account（第三方账号表）是否有数据，如果有代表已同步\n//             * 2. 本地表里没有，就先用手机号判断，不通过再用username判断。\n//             */\n//            SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByThirdUserId(qwUser.getUserid(), THIRD_TYPE);\n//            List<SysUser> collect = sysUsersList.stream().filter(user -> (qwUser.getMobile().equals(user.getPhone()) || qwUser.getUserid().equals(user.getUsername()))\n//                                                                ).collect(Collectors.toList());\n//\n//            if (collect != null && collect.size() > 0) {\n//                SysUser sysUserTemp = collect.get(0);\n//                // 循环到此说明用户匹配成功，进行更新操作\n//                SysUser updateSysUser = this.qwUserToSysUser(qwUser, sysUserTemp);\n//                try {\n//                    userMapper.updateById(updateSysUser);\n//                    String str = String.format(\"用户 %s(%s) 更新成功！\", updateSysUser.getRealname(), updateSysUser.getUsername());\n//                    syncInfo.addSuccessInfo(str);\n//                } catch (Exception e) {\n//                    this.syncUserCollectErrInfo(e, qwUser, syncInfo);\n//                }\n//\n//                this.thirdAccountSaveOrUpdate(sysThirdAccount, updateSysUser.getId(), qwUser.getUserid());\n//                // 更新完成，直接跳到下一次外部循环继续\n//            }else{\n//                // 没匹配到用户则走新增逻辑\n//                SysUser newSysUser = this.qwUserToSysUser(qwUser);\n//                try {\n//                    userMapper.insert(newSysUser);\n//                    String str = String.format(\"用户 %s(%s) 创建成功！\", newSysUser.getRealname(), newSysUser.getUsername());\n//                    syncInfo.addSuccessInfo(str);\n//                } catch (Exception e) {\n//                    this.syncUserCollectErrInfo(e, qwUser, syncInfo);\n//                }\n//                this.thirdAccountSaveOrUpdate(sysThirdAccount, newSysUser.getId(), qwUser.getUserid());\n//            }\n//        }\n//        return syncInfo;\n//    }\n\n    /**\n     * 保存或修改第三方登录表\n     *\n     * @param sysThirdAccount 第三方账户表对象，为null就新增数据，否则就修改\n     * @param sysUserId       本地系统用户ID\n     * @param qwUserId        企业微信用户ID\n     * @param wechatRealName  企业微信用户真实姓名\n     */\n    private void thirdAccountSaveOrUpdate(SysThirdAccount sysThirdAccount, String sysUserId, String qwUserId, String wechatRealName, Integer tenantId) {\n        if (sysThirdAccount == null) {\n            sysThirdAccount = new SysThirdAccount();\n            sysThirdAccount.setSysUserId(sysUserId);\n            sysThirdAccount.setStatus(1);\n            sysThirdAccount.setDelFlag(0);\n            sysThirdAccount.setThirdType(THIRD_TYPE);\n            if(oConvertUtils.isNotEmpty(tenantId)){\n                sysThirdAccount.setTenantId(tenantId);\n            }\n        }\n        sysThirdAccount.setThirdUserId(qwUserId);\n        sysThirdAccount.setThirdUserUuid(qwUserId);\n        sysThirdAccount.setRealname(wechatRealName);\n        sysThirdAccountService.saveOrUpdate(sysThirdAccount);\n    }\n\n    /**\n     * 【同步用户】收集同步过程中的错误信息\n     */\n    private boolean syncUserCollectErrInfo(int errCode, SysUser sysUser, SyncInfoVo syncInfo) {\n        if (errCode != 0) {\n            String msg = \"\";\n            // https://open.work.weixin.qq.com/api/doc/90000/90139/90313\n            switch (errCode) {\n                case 40003:\n                    msg = \"无效的UserID\";\n                    break;\n                case 60129:\n                    msg = \"手机和邮箱不能都为空\";\n                    break;\n                case 60102:\n                    msg = \"UserID已存在\";\n                    break;\n                case 60103:\n                    msg = \"手机号码不合法\";\n                    break;\n                case 60104:\n                    msg = \"手机号码已存在\";\n                    break;\n                default:\n            }\n            String str = String.format(\"用户 %s(%s) 同步失败！错误码：%s——%s\", sysUser.getUsername(), sysUser.getRealname(), errCode, msg);\n            syncInfo.addFailInfo(str);\n            return false;\n        } else {\n            String str = String.format(\"用户 %s(%s) 同步成功！\", sysUser.getUsername(), sysUser.getRealname());\n            syncInfo.addSuccessInfo(str);\n            return true;\n        }\n    }\n\n    private boolean syncUserCollectErrInfo(Exception e, User qwUser, SyncInfoVo syncInfo) {\n        String msg;\n        if (e instanceof DuplicateKeyException) {\n            msg = e.getCause().getMessage();\n        } else {\n            msg = e.getMessage();\n        }\n        String str = String.format(\"用户 %s(%s) 同步失败！错误信息：%s\", qwUser.getUserid(), qwUser.getName(), msg);\n        syncInfo.addFailInfo(str);\n        return false;\n    }\n\n    private boolean syncDepartCollectErrInfo(Exception e, Department department, SyncInfoVo syncInfo) {\n        String msg;\n        if (e instanceof DuplicateKeyException) {\n            msg = e.getCause().getMessage();\n        } else {\n            msg = e.getMessage();\n        }\n        String str = String.format(\"部门 %s(%s) 同步失败！错误信息：%s\", department.getName(), department.getId(), msg);\n        syncInfo.addFailInfo(str);\n        return false;\n    }\n\n    /**\n     * 【同步用户】将SysUser转为企业微信的User对象（创建新用户）\n     */\n    private User sysUserToQwUser(SysUser sysUser) {\n        User user = new User();\n        // 通过 username 来关联\n        user.setUserid(sysUser.getUsername());\n        return this.sysUserToQwUser(sysUser, user);\n    }\n\n    /**\n     * 【同步用户】将SysUser转为企业微信的User对象（更新旧用户）\n     */\n    private User sysUserToQwUser(SysUser sysUser, User user) {\n        user.setName(sysUser.getRealname());\n        user.setMobile(sysUser.getPhone());\n        // 查询并同步用户部门关系\n        List<SysDepart> departList = this.getUserDepart(sysUser);\n        if (departList != null) {\n            List<Integer> departmentIdList = new ArrayList<>();\n            // 企业微信 1表示为上级，0表示非上级\n            List<Integer> isLeaderInDept = new ArrayList<>();\n            // 当前用户管理的部门\n            List<String> manageDepartIdList = new ArrayList<>();\n            if (oConvertUtils.isNotEmpty(sysUser.getDepartIds())) {\n                manageDepartIdList = Arrays.asList(sysUser.getDepartIds().split(\",\"));\n            }\n            for (SysDepart sysDepart : departList) {\n                // 企业微信的部门id\n                if (oConvertUtils.isNotEmpty(sysDepart.getQywxIdentifier())) {\n                    try {\n                        departmentIdList.add(Integer.parseInt(sysDepart.getQywxIdentifier()));\n                    } catch (NumberFormatException ignored) {\n                        continue;\n                    }\n                    // 判断用户身份，是否为上级\n                    if (CommonConstant.USER_IDENTITY_2.equals(sysUser.getUserIdentity())) {\n                        // 判断当前部门是否为该用户管理的部门\n                        isLeaderInDept.add(manageDepartIdList.contains(sysDepart.getId()) ? 1 : 0);\n                    } else {\n                        isLeaderInDept.add(0);\n                    }\n                }\n            }\n            user.setDepartment(departmentIdList.toArray(new Integer[]{}));\n            // 个数必须和参数department的个数一致，表示在所在的部门内是否为上级。1表示为上级，0表示非上级。在审批等应用里可以用来标识上级审批人\n            user.setIs_leader_in_dept(isLeaderInDept.toArray(new Integer[]{}));\n        }\n        if (user.getDepartment() == null || user.getDepartment().length == 0) {\n            // 没有找到匹配部门，同步到根部门下\n            user.setDepartment(new Integer[]{1});\n            user.setIs_leader_in_dept(new Integer[]{0});\n        }\n        // 职务翻译\n        // 代码逻辑说明: [QQYUN-3980]组织管理中 职位功能 职位表加租户id 加职位-用户关联表------------\n        List<SysPosition> positionList = sysPositionService.getPositionList(sysUser.getId());\n        if(null != positionList && positionList.size()>0){\n            String positionName = positionList.stream().map(SysPosition::getName).collect(Collectors.joining(SymbolConstant.COMMA));\n            user.setPosition(positionName);\n        }\n        if (sysUser.getSex() != null) {\n            user.setGender(sysUser.getSex().toString());\n        }\n        user.setEmail(sysUser.getEmail());\n        // 启用/禁用成员（状态），规则不同，需要转换\n        // 企业微信规则：1表示启用成员，0表示禁用成员\n        // JEECG规则：1正常，2冻结\n        if (sysUser.getStatus() != null) {\n            if (CommonConstant.USER_UNFREEZE.equals(sysUser.getStatus()) || CommonConstant.USER_FREEZE.equals(sysUser.getStatus())) {\n                user.setEnable(sysUser.getStatus() == 1 ? 1 : 0);\n            } else {\n                user.setEnable(1);\n            }\n        }\n        // 座机号\n        user.setTelephone(sysUser.getTelephone());\n        // --- 企业微信没有逻辑删除的功能\n        // 代码逻辑说明: 本地逻辑删除的用户，在企业微信里禁用 -----\n        if (CommonConstant.DEL_FLAG_1.equals(sysUser.getDelFlag())) {\n            user.setEnable(0);\n        }\n\n        return user;\n    }\n\n    /**\n     * 查询用户和部门的关系\n     */\n    private List<SysDepart> getUserDepart(SysUser sysUser) {\n        // 根据用户部门关系表查询出用户的部门\n        LambdaQueryWrapper<SysUserDepart> queryWrapper = new LambdaQueryWrapper<>();\n        queryWrapper.eq(SysUserDepart::getUserId, sysUser.getId());\n        List<SysUserDepart> sysUserDepartList = sysUserDepartService.list(queryWrapper);\n        if (sysUserDepartList.size() == 0) {\n            return null;\n        }\n        // 根据用户部门\n        LambdaQueryWrapper<SysDepart> departQueryWrapper = new LambdaQueryWrapper<>();\n        List<String> departIdList = sysUserDepartList.stream().map(SysUserDepart::getDepId).collect(Collectors.toList());\n        departQueryWrapper.in(SysDepart::getId, departIdList);\n        List<SysDepart> departList = sysDepartService.list(departQueryWrapper);\n        return departList.size() == 0 ? null : departList;\n    }\n\n    /**\n     * 【同步用户】将企业微信的User对象转为SysUser（创建新用户）\n     */\n    private SysUser qwUserToSysUser(User user) {\n        SysUser sysUser = new SysUser();\n        sysUser.setDelFlag(0);\n        sysUser.setStatus(1);\n        // 通过 username 来关联\n        sysUser.setUsername(user.getUserid());\n        // 密码默认为 “123456”，随机加盐\n        String password = \"123456\", salt = oConvertUtils.randomGen(8);\n        String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt);\n        sysUser.setSalt(salt);\n        sysUser.setPassword(passwordEncode);\n        return this.qwUserToSysUser(user, sysUser);\n    }\n\n    /**\n     * 【同步用户】将企业微信的User对象转为SysUser（更新旧用户）\n     */\n    private SysUser qwUserToSysUser(User qwUser, SysUser oldSysUser) {\n        SysUser sysUser = new SysUser();\n        BeanUtils.copyProperties(oldSysUser, sysUser);\n        sysUser.setRealname(qwUser.getName());\n        sysUser.setPost(qwUser.getPosition());\n        // 设置工号，由于企业微信没有工号的概念，所以只能用 userId 代替\n        if (oConvertUtils.isEmpty(sysUser.getWorkNo())) {\n            sysUser.setWorkNo(qwUser.getUserid());\n        }\n        try {\n            sysUser.setSex(Integer.parseInt(qwUser.getGender()));\n        } catch (NumberFormatException ignored) {\n        }\n        // 因为唯一键约束的原因，如果原数据和旧数据相同，就不更新\n        if (oConvertUtils.isNotEmpty(qwUser.getEmail()) && !qwUser.getEmail().equals(sysUser.getEmail())) {\n            sysUser.setEmail(qwUser.getEmail());\n        } else {\n            sysUser.setEmail(null);\n        }\n        // 因为唯一键约束的原因，如果原数据和旧数据相同，就不更新\n        if (oConvertUtils.isNotEmpty(qwUser.getMobile()) && !qwUser.getMobile().equals(sysUser.getPhone())) {\n            sysUser.setPhone(qwUser.getMobile());\n        } else {\n            sysUser.setPhone(null);\n        }\n\n        // 启用/禁用成员（状态），规则不同，需要转换\n        // 企业微信规则：1表示启用成员，0表示禁用成员\n        // JEECG规则：1正常，2冻结\n        if (qwUser.getEnable() != null) {\n            sysUser.setStatus(qwUser.getEnable() == 1 ? 1 : 2);\n        }\n        // 座机号\n        sysUser.setTelephone(qwUser.getTelephone());\n\n        // --- 企业微信没有逻辑删除的功能\n        // sysUser.setDelFlag()\n        return sysUser;\n    }\n\n    /**\n     * 【同步部门】将SysDepartTreeModel转为企业微信的Department对象（创建新部门）\n     */\n    private Department sysDepartToQwDepartment(SysDepartTreeModel departTree, String parentId) {\n        Department department = new Department();\n        return this.sysDepartToQwDepartment(departTree, department, parentId);\n    }\n\n    /**\n     * 【同步部门】将SysDepartTreeModel转为企业微信的Department对象\n     */\n    private Department sysDepartToQwDepartment(SysDepartTreeModel departTree, Department department, String parentId) {\n        department.setName(departTree.getDepartName());\n        department.setParentid(parentId);\n        if (departTree.getDepartOrder() != null) {\n            department.setOrder(departTree.getDepartOrder().toString());\n        }\n        return department;\n    }\n\n\n    /**\n     * 【同步部门】将企业微信的Department对象转为SysDepart\n     */\n    private SysDepart qwDepartmentToSysDepart(Department department, SysDepart oldSysDepart) {\n        SysDepart sysDepart = new SysDepart();\n        if (oldSysDepart != null) {\n            BeanUtils.copyProperties(oldSysDepart, sysDepart);\n        }\n        sysDepart.setQywxIdentifier(department.getId());\n        sysDepart.setDepartName(department.getName());\n        try {\n            sysDepart.setDepartOrder(Integer.parseInt(department.getOrder()));\n        } catch (NumberFormatException ignored) {\n        }\n        return sysDepart;\n    }\n\n    @Override\n    public int removeThirdAppUser(List<String> userIdList) {\n        // 判断启用状态\n        SysThirdAppConfig config = this.getWeChatThirdAppConfig();\n        if (null == config) {\n            return -1;\n        }\n        int count = 0;\n        if (userIdList != null && userIdList.size() > 0) {\n            String accessToken = this.getAccessToken();\n            if (accessToken == null) {\n                return count;\n            }\n            LambdaQueryWrapper<SysThirdAccount> queryWrapper = new LambdaQueryWrapper<>();\n            queryWrapper.eq(SysThirdAccount::getThirdType, THIRD_TYPE);\n            queryWrapper.in(SysThirdAccount::getSysUserId, userIdList);\n            // 根据userId，获取第三方用户的id\n            List<SysThirdAccount> thirdAccountList = sysThirdAccountService.list(queryWrapper);\n            List<String> thirdUserIdList = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList());\n\n            for (String thirdUserId : thirdUserIdList) {\n                if (oConvertUtils.isNotEmpty(thirdUserId)) {\n                    // 没有批量删除的接口\n                    int err = JwUserAPI.deleteUser(thirdUserId, accessToken);\n                    if (err == 0) {\n                        count++;\n                    }\n                }\n            }\n        }\n        return count;\n    }\n\n    @Override\n    public boolean sendMessage(MessageDTO message) {\n        return this.sendMessage(message, false);\n    }\n\n    @Override\n    public boolean sendMessage(MessageDTO message, boolean verifyConfig) {\n        JSONObject response;\n        if (message.isMarkdown()) {\n            response = this.sendMarkdownResponse(message, verifyConfig);\n        } else {\n            response = this.sendMessageResponse(message, verifyConfig);\n        }\n        if (response != null) {\n            return response.getIntValue(\"errcode\") == 0;\n        }\n        return false;\n    }\n\n    public JSONObject sendMessageResponse(MessageDTO message, boolean verifyConfig) {\n        SysThirdAppConfig config = this.getWeChatThirdAppConfig();\n        if (verifyConfig && null == config) {\n            return null;\n        }\n        String accessToken = this.getAppAccessToken(config);\n        if (accessToken == null) {\n            return null;\n        }\n        Text text = new Text();\n        text.setMsgtype(\"text\");\n        text.setTouser(this.getTouser(message.getToUser(), message.getToAll()));\n        TextEntity entity = new TextEntity();\n        entity.setContent(message.getContent());\n        text.setText(entity);\n        text.setAgentid(Integer.parseInt(config.getAgentId()));\n        return JwMessageAPI.sendTextMessage(text, accessToken);\n    }\n\n    public JSONObject sendMarkdownResponse(MessageDTO message, boolean verifyConfig) {\n        SysThirdAppConfig config = this.getWeChatThirdAppConfig();\n        if (verifyConfig && null == config) {\n            return null;\n        }\n        String accessToken = this.getAppAccessToken(config);\n        if (accessToken == null) {\n            return null;\n        }\n        Markdown markdown = new Markdown();\n        markdown.setTouser(this.getTouser(message.getToUser(), message.getToAll()));\n        MarkdownEntity entity = new MarkdownEntity();\n        entity.setContent(message.getContent());\n        markdown.setMarkdown(entity);\n        markdown.setAgentid(Integer.parseInt(config.getAgentId()));\n        return JwMessageAPI.sendMarkdownMessage(markdown, accessToken);\n    }\n\n    /**\n     * 发送文本卡片消息（SysAnnouncement定制）\n     *\n     * @param announcement\n     * @param verifyConfig 是否验证配置（未启用的APP会拒绝发送）\n     * @return\n     */\n    public JSONObject sendTextCardMessage(SysAnnouncement announcement,String mobileOpenUrl, boolean verifyConfig) {\n        SysThirdAppConfig config = this.getWeChatThirdAppConfig();\n        if (verifyConfig && null == config) {\n            return null;\n        }\n        String accessToken = this.getAppAccessToken(config);\n        if (accessToken == null) {\n            return null;\n        }\n        TextCard textCard = new TextCard();\n        textCard.setAgentid(Integer.parseInt(config.getAgentId()));\n        boolean isToAll = CommonConstant.MSG_TYPE_ALL.equals(announcement.getMsgType());\n        String usernameString = \"\";\n        if (!isToAll) {\n            // 将userId转为username\n            String userId = announcement.getUserIds();\n            String[] userIds = null;\n            if(oConvertUtils.isNotEmpty(userId)){\n                userIds = userId.substring(0, (userId.length() - 1)).split(\",\");\n            }else{\n                LambdaQueryWrapper<SysAnnouncementSend> queryWrapper = new LambdaQueryWrapper<>();\n                queryWrapper.eq(SysAnnouncementSend::getAnntId, announcement.getId());\n                SysAnnouncementSend sysAnnouncementSend = sysAnnouncementSendMapper.selectOne(queryWrapper);\n                userIds = new String[] {sysAnnouncementSend.getUserId()};\n            }\n\n            LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();\n            queryWrapper.in(SysUser::getId, userIds);\n            List<SysUser> userList = userMapper.selectList(queryWrapper);\n            List<String> usernameList = userList.stream().map(SysUser::getUsername).collect(Collectors.toList());\n            usernameString = String.join(\",\", usernameList);\n        }\n\n        textCard.setTouser(this.getTouser(usernameString, isToAll));\n        TextCardEntity entity = new TextCardEntity();\n        entity.setTitle(announcement.getTitile());\n        \n        //update-begin---author:scott ---date:2025-08-05  for：【QQYUN-13257】【h5】催办、抄送消息，在企业微信中显示json乱码---\n        // 判断announcement.getMsgAbstract()值是json格式\n        if(oConvertUtils.isJson(announcement.getMsgAbstract()) && oConvertUtils.isNotEmpty(mobileOpenUrl)){\n            entity.setDescription(announcement.getMsgContent());\n            entity.setUrl(mobileOpenUrl);\n        }else{\n            entity.setDescription(oConvertUtils.getString(announcement.getMsgAbstract(),\"空\"));\n            entity.setUrl(geQywxtAnnouncementUrl(announcement));\n        }\n        \n        textCard.setTextcard(entity);\n        return JwMessageAPI.sendTextCardMessage(textCard, accessToken);\n    }\n\n    \n    /**\n     * 获取企业微信的公告链接\n     *\n     * @return\n     */\n    private String geQywxtAnnouncementUrl(SysAnnouncement announcement){\n        String baseUrl = null;\n        //优先通过请求获取basepath，获取不到读取 jeecg.domainUrl.pc\n        try {\n            baseUrl = RestUtil.getBaseUrl();\n        } catch (Exception e) {\n            log.warn(e.getMessage());\n            baseUrl =  jeecgBaseConfig.getDomainUrl().getPc();\n            //e.printStackTrace();\n        }\n       return baseUrl + \"/sys/annountCement/show/\" + announcement.getId();\n    }\n\n    private String getTouser(String origin, boolean toAll) {\n        if (toAll) {\n            return \"@all\";\n        } else {\n            String[] toUsers = origin.split(\",\");\n            // 通过第三方账号表查询出第三方userId\n            int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), CommonConstant.TENANT_ID_DEFAULT_VALUE);\n            List<SysThirdAccount> thirdAccountList = sysThirdAccountService.listThirdUserIdByUsername(toUsers, THIRD_TYPE,tenantId);\n            List<String> toUserList = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList());\n            // 多个接收者用‘|’分隔\n            return String.join(\"|\", toUserList);\n        }\n    }\n\n    /**\n     * 根据第三方登录获取到的code来获取第三方app的用户ID\n     *\n     * @param code\n     * @return\n     */\n    public Map<String,String> getUserIdByThirdCode(String code, String accessToken) {\n        JSONObject response = JwUserAPI.getUserInfoByCode(code, accessToken);\n        if (response != null) {\n            Map<String,String> map = new HashMap<>(5);\n            log.info(\"response: \" + response.toJSONString());\n            if (response.getIntValue(ERR_CODE) == 0) {\n                //将userTicket也返回，用于获取手机号\n                String userTicket = response.getString(\"user_ticket\");\n                String appUserId = response.getString(\"UserId\");\n                map.put(\"userTicket\",userTicket);\n                map.put(\"appUserId\",appUserId);\n                return map;\n            }\n        }\n        return null;\n    }\n\n    /**\n     * OAuth2登录，成功返回登录的SysUser，失败返回null\n     */\n    public SysUser oauth2Login(String code,Integer tenantId) {\n        Long count = tenantMapper.tenantIzExist(tenantId);\n        if(ObjectUtil.isEmpty(count) || 0 == count){\n            throw new JeecgBootException(\"租户不存在！\");\n        }\n        // 代码逻辑说明: [QQYUN-3440]新建企业微信和钉钉配置表，通过租户模式隔离------------\n        SysThirdAppConfig config = configMapper.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType());\n        String accessToken = this.getAppAccessToken(config);\n        if (accessToken == null) {\n            return null;\n        }\n        Map<String,String> map = this.getUserIdByThirdCode(code, accessToken);\n        if (null != map) {\n            //企业微信需要通过userTicket获取用户信息\n            String appUserId = map.get(\"appUserId\");\n            String userTicket = map.get(\"userTicket\");\n            // 判断第三方用户表有没有这个人\n            LambdaQueryWrapper<SysThirdAccount> queryWrapper = new LambdaQueryWrapper<>();\n            queryWrapper.eq(SysThirdAccount::getThirdUserId, appUserId);\n            queryWrapper.eq(SysThirdAccount::getThirdType, THIRD_TYPE);\n            queryWrapper.eq(SysThirdAccount::getTenantId, tenantId);\n            SysThirdAccount thirdAccount = sysThirdAccountService.getOne(queryWrapper);\n            if (thirdAccount != null) {\n                return this.getSysUserByThird(thirdAccount, null, appUserId, accessToken, userTicket,tenantId);\n            } else {\n                throw new JeecgBootException(\"该用户尚未同步，请同步后再次登录！\");\n            }\n        }\n        return null;\n    }\n\n    /**\n     * 根据第三方账号获取本地账号，如果不存在就创建\n     *\n     * @param thirdAccount\n     * @param appUser\n     * @param appUserId\n     * @param accessToken\n     * @param userTicket 获取访问用户敏感信息\n     * @return\n     */\n    private SysUser getSysUserByThird(SysThirdAccount thirdAccount, User appUser, String appUserId, String accessToken, String userTicket,Integer tenantId) {\n        String sysUserId = thirdAccount.getSysUserId();\n        if (oConvertUtils.isNotEmpty(sysUserId)) {\n            return userMapper.selectById(sysUserId);\n        } else {\n            // 如果没有 sysUserId ，说明没有绑定账号，获取到手机号之后进行绑定\n            if (appUser == null) {\n                appUser = this.getUserByUserTicket(userTicket, accessToken);\n            }\n            // 判断系统里是否有这个手机号的用户\n            SysUser sysUser = userMapper.getUserByPhone(appUser.getMobile());\n            if (sysUser != null) {\n                thirdAccount.setAvatar(appUser.getAvatar());\n                thirdAccount.setRealname(appUser.getName());\n                thirdAccount.setThirdUserId(appUser.getUserid());\n                thirdAccount.setThirdUserUuid(appUser.getUserid());\n                thirdAccount.setSysUserId(sysUser.getId());\n                sysThirdAccountService.updateById(thirdAccount);\n                return sysUser;\n            } else {\n                // 没有就走创建逻辑\n                return sysThirdAccountService.createUser(appUser.getMobile(), appUser.getUserid(),tenantId);\n            }\n\n        }\n    }\n\n    /**\n     * 根据类型和租户id获取企业微信配置\n     * @return\n     */\n    private SysThirdAppConfig getWeChatThirdAppConfig(){\n        int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n        return configMapper.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType());\n    }\n\n    /**\n     * 获取企业微信第三方用户信息\n     * @param userTicket\n     * @param accessToken\n     * @return\n     */\n    private User getUserByUserTicket(String userTicket, String accessToken){\n        Map<String, String> map = new HashMap<>(5);\n        map.put(\"user_ticket\",userTicket);\n        //建立连接\n        CloseableHttpClient httpClient = null;\n        CloseableHttpResponse httpResponse = null;\n        try {\n            httpClient = HttpClients.createDefault();\n            HttpPost httpPost = new HttpPost(\"https://qyapi.weixin.qq.com/cgi-bin/auth/getuserdetail?access_token=\"+accessToken);\n            RequestConfig requestConfig = RequestConfig.custom()\n             .setConnectTimeout(10000).setConnectionRequestTimeout(10000).setSocketTimeout(10000)\n             .build();\n            httpPost.setConfig(requestConfig);\n            httpPost.setEntity(new StringEntity(JSONObject.toJSONString(map), ContentType.create(\"application/json\", \"utf-8\")));\n            httpResponse = httpClient.execute(httpPost);\n            // 从响应对象中获取响应内容\n            HttpEntity entity = httpResponse.getEntity();\n            String result = EntityUtils.toString(entity);\n            JSONObject jsonObject = JSONObject.parseObject(result);\n            Integer errcode = jsonObject.getInteger(\"errcode\");\n            if(0 == errcode){\n                return JSONObject.toJavaObject(jsonObject, User.class);\n            }\n        } catch (IOException e) {\n            log.error(e.getMessage(), e);\n        }\n        return null;\n    }\n\n    /**\n     * 获取企业微信绑定的用户信息\n     * @return\n     */\n    public JwSysUserDepartVo getThirdUserByWechat(Integer tenantId) {\n        JwSysUserDepartVo sysUserDepartVo = new JwSysUserDepartVo();\n        //step1 获取用户id和部门id\n        String accessToken = this.getAccessToken();\n        if (accessToken == null) {\n            throw new JeecgBootException(\"accessToken获取失败！\");\n        }\n        //获取当前租户下的用户\n        List<JwUserDepartVo> userList = sysUserTenantMapper.getUsersByTenantIdAndName(tenantId);\n        // 获取企业微信所有的用户（只能获取userid）\n        List<User> qwUsers = JwUserAPI.getUsersByDepartid(\"1\",\"1\",null,accessToken);\n        if(oConvertUtils.isEmpty(qwUsers)){\n            throw new JeecgBootException(\"企业微信下没查询到用户！\");\n        }\n        List<String> userIds = new ArrayList<>();\n        List<JwUserDepartVo> userWechatList = new ArrayList<>();\n\n        for (int i = 0; i < qwUsers.size(); i++) {\n            User user = qwUsers.get(i);\n            String userId = qwUsers.get(i).getUserid();\n            //保证用户唯一\n            if(!userIds.contains(userId)){\n                //step2 查看是否已经同步过了,同步过的不做处理\n                SysThirdAccount oneBySysUserId = sysThirdAccountService.getOneByUuidAndThirdType(userId, THIRD_TYPE,tenantId, userId);\n                if(null != oneBySysUserId){\n                    userIds.add(qwUsers.get(i).getUserid());\n                    userList = userList.stream().filter(item -> !item.getUserId().equals(oneBySysUserId.getSysUserId())).collect(Collectors.toList());;\n                    continue;\n                }\n                AtomicBoolean excludeUser = new AtomicBoolean(false);\n                if(ObjectUtil.isNotEmpty(qwUsers)){\n                    //step3 通过名称匹配敲敲云\n                    userList.forEach(item ->{\n                        if(item.getRealName().equals(user.getName())){\n                            item.setWechatUserId(user.getUserid());\n                            item.setWechatRealName(user.getName());\n                            if(ObjectUtil.isNotEmpty(user.getDepartment())){\n                                item.setWechatDepartId(Arrays.toString(user.getDepartment()));\n                            }\n                            excludeUser.set(true);\n                        }\n                    });\n                    userIds.add(user.getUserid());\n                }\n                if(!excludeUser.get()){\n                    JwUserDepartVo userDepartVo = new JwUserDepartVo();\n                    userDepartVo.setWechatRealName(user.getName());\n                    userDepartVo.setWechatUserId(user.getUserid());\n                    if(ObjectUtil.isNotEmpty(user.getDepartment())){\n                        userDepartVo.setWechatDepartId(Arrays.toString(user.getDepartment()));\n                    }\n                    userWechatList.add(userDepartVo);\n                }\n            }\n        }\n        //step4 返回用户信息\n        sysUserDepartVo.setUserList(userWechatList);\n        sysUserDepartVo.setJwUserDepartVos(userList);\n        return sysUserDepartVo;\n    }\n\n    /**\n     * 同步企业微信和部门\n     * @param jwUserDepartJson\n     * @return\n     */\n    public SyncInfoVo syncWechatEnterpriseDepartAndUserToLocal(String jwUserDepartJson, Integer tenantId) {\n        //step 1 同步部门\n        //存放部门id的map\n        Map<String,String> idsMap = new HashMap<>();\n        SyncInfoVo syncInfoVo = this.syncThirdAppDepartmentToLocal(tenantId, idsMap);\n        //step 2 同步用户及用户部门\n        this.syncDepartAndUser(syncInfoVo, tenantId, idsMap, jwUserDepartJson);\n        //step 3 返回同步成功或者同步失败的消息\n        return syncInfoVo;\n    }\n\n    /**\n     * 同步用户和部门\n     *  @param syncInfoVo 存放错误信息的日志\n     * @param tenantId 租户id\n     * @param idsMap 部门id集合 key为企业微信的id value 为系统部门的id\n     * @param jwUserDepartJson\n     */\n    private void syncDepartAndUser(SyncInfoVo syncInfoVo, Integer tenantId, Map<String, String> idsMap, String jwUserDepartJson) {\n        if (oConvertUtils.isNotEmpty(jwUserDepartJson)) {\n            JSONArray jsonArray = JSONObject.parseArray(jwUserDepartJson);\n            for (Object object : jsonArray) {\n                JSONObject jsonObject = JSONObject.parseObject(object.toString());\n                Object userId = jsonObject.get(\"userId\");\n                String wechatUserId = jsonObject.getString(\"wechatUserId\");\n                String wechatRealName = jsonObject.getString(\"wechatRealName\");\n                Object wechatDepartId = jsonObject.get(\"wechatDepartId\");\n                String sysUserId = \"\";\n                //step 1 新建或更新用户\n                //用户id为空说明需要创建用户\n                if (null == userId) {\n                    SysTenant sysTenant = sysTenantMapper.selectById(tenantId);\n                    String houseNumber = \"\";\n                    //空说明没有租户直接用用户名\n                    if (null != sysTenant) {\n                        houseNumber = sysTenant.getHouseNumber();\n                    }\n                    //用户名和密码用门牌号+用户id的格式，避免用户名重复\n                    String username = houseNumber + wechatUserId;\n                    //新建用户\n                    sysUserId = this.saveUser(username, wechatRealName, syncInfoVo, wechatUserId);\n                } else {\n                    //根据id查询用户\n                    SysUser sysUser = userMapper.selectById(userId.toString());\n                    if (null != sysUser) {\n                        sysUserId = sysUser.getId();\n                        //如果真实姓名为空的情况下，才会改真实姓名\n                        if(oConvertUtils.isEmpty(sysUser.getRealname())){\n                            sysUser.setRealname(wechatRealName);\n                            //更新用户\n                            userMapper.updateById(sysUser);\n                        }\n                        String str = String.format(\"用户 %s(%s) 更新成功！\", sysUser.getRealname(), sysUser.getUsername());\n                        syncInfoVo.addSuccessInfo(str);\n                    }else{\n                       syncInfoVo.addFailInfo(\"企业微信用户 \"+wechatRealName+\" 对应的组织用户没有匹配到！\");\n                       continue; \n                    }\n                }\n                if (oConvertUtils.isNotEmpty(sysUserId)) {\n                    //step 2 新增租户用户表\n                    this.createUserTenant(sysUserId,false,tenantId);\n                    //step 3 新建或更新第三方账号表\n                    SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByUuidAndThirdType(wechatUserId, THIRD_TYPE, tenantId, wechatUserId);\n                    this.thirdAccountSaveOrUpdate(sysThirdAccount,sysUserId,wechatUserId,wechatRealName,tenantId);\n                    //step 4 新建或更新用户部门关系表\n                    if(oConvertUtils.isNotEmpty(wechatDepartId)){\n                        String wechatDepartIds = wechatDepartId.toString();\n                        String[] departIds = wechatDepartIds.substring(1, wechatDepartIds.length() - 1).split(\",\");\n                        this.userDepartSaveOrUpdate(idsMap,sysUserId,departIds);\n                    }\n                }\n            }\n        } else {\n            syncInfoVo.addFailInfo(\"用户同同步失败，请查看企业微信是否存在用户！\");\n        }\n\n    }\n    \n    /**\n     * 保存用户\n     *\n     * @param username 用户名\n     * @param wechatRealName 企业微信用户真实姓名\n     * @param syncInfo 存放成功或失败的信息\n     * @param wechatUserId wechatUserId 企业微信对应的id\n     * @return\n     */\n    private String saveUser(String username, String wechatRealName, SyncInfoVo syncInfo, String wechatUserId) {\n        SysUser sysUser = new SysUser();\n        sysUser.setRealname(wechatRealName);\n        sysUser.setPassword(username);\n        sysUser.setUsername(username);\n        sysUser.setDelFlag(CommonConstant.DEL_FLAG_0);\n        //设置创建时间\n        sysUser.setCreateTime(new Date());\n        String salt = oConvertUtils.randomGen(8);\n        sysUser.setSalt(salt);\n        String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), sysUser.getPassword(), salt);\n        sysUser.setPassword(passwordEncode);\n        sysUser.setStatus(1);\n        sysUser.setDelFlag(CommonConstant.DEL_FLAG_0);\n        //用户表字段org_code不能在这里设置他的值\n        sysUser.setOrgCode(null);\n        try {\n            userMapper.insert(sysUser);\n            String str = String.format(\"用户 %s(%s) 创建成功！\", sysUser.getRealname(), sysUser.getUsername());\n            syncInfo.addSuccessInfo(str);\n            return sysUser.getId();\n        } catch (Exception e) {\n            User user = new User();\n            user.setUserid(wechatUserId);\n            user.setName(wechatRealName);\n            this.syncUserCollectErrInfo(e, user, syncInfo);\n        }\n\n        return \"\";\n    }\n\n    /**\n     * 新增用户租户\n     *\n     * @param userId\n     * @param isUpdate 是否是新增\n     * @param tenantId\n     */\n    private void createUserTenant(String userId, Boolean isUpdate, Integer tenantId) {\n        if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) {\n            //判断当前用户是否已在该租户下面\n            Integer count = sysUserTenantMapper.userTenantIzExist(userId, tenantId);\n            //count 为0 新增租户用户,否则不用新增\n            if (count == 0) {\n                SysUserTenant userTenant = new SysUserTenant();\n                userTenant.setTenantId(tenantId);\n                userTenant.setUserId(userId);\n                userTenant.setStatus(isUpdate ? CommonConstant.USER_TENANT_UNDER_REVIEW : CommonConstant.USER_TENANT_NORMAL);\n                sysUserTenantMapper.insert(userTenant);\n            }\n        }\n    }\n\n    /**\n     * 新建或更新用户部门关系表\n     * @param idsMap 部门id集合 key为企业微信的id value 为系统部门的id\n     * @param sysUserId 系统对应的用户id\n     */\n    private void userDepartSaveOrUpdate(Map<String, String> idsMap, String sysUserId, String[] departIds) {\n        LambdaQueryWrapper<SysUserDepart> query = new LambdaQueryWrapper<>();\n        query.eq(SysUserDepart::getUserId,sysUserId);\n        for (String departId:departIds) {\n            departId = departId.trim();\n            if(idsMap.containsKey(departId)){\n                String value = idsMap.get(departId);\n                //查询用户是否在部门里面\n                query.eq(SysUserDepart::getDepId,value);\n                long count = sysUserDepartService.count(query);\n                if(count == 0){\n                    //不存在，则新增部门用户关系\n                    SysUserDepart sysUserDepart = new SysUserDepart(null,sysUserId,value);\n                    sysUserDepartService.save(sysUserDepart);\n                }\n            }    \n        }\n    }\n\n    public List<JwUserDepartVo> getThirdUserBindByWechat(int tenantId) {\n        return sysThirdAccountMapper.getThirdUserBindByWechat(tenantId,THIRD_TYPE);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/util/FindsDepartsChildrenUtil.java",
    "content": "package org.jeecg.modules.system.util;\n\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.util.RedisUtil;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysDepart;\nimport org.jeecg.modules.system.model.DepartIdModel;\nimport org.jeecg.modules.system.model.SysDepartTreeModel;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * <P>\n * 对应部门的表,处理并查找树级数据\n * <P>\n * \n * @Author: Steve\n * @Date: 2019-01-22\n */\npublic class FindsDepartsChildrenUtil {\n\n\t//部门树信息-树结构\n\t//private static List<SysDepartTreeModel> sysDepartTreeList = new ArrayList<SysDepartTreeModel>();\n\t\n\t//部门树id-树结构\n    //private static List<DepartIdModel> idList = new ArrayList<>();\n\n\n    /**\n     * queryTreeList的子方法 ====1=====\n     * 该方法是s将SysDepart类型的list集合转换成SysDepartTreeModel类型的集合\n     */\n    public static List<SysDepartTreeModel> wrapTreeDataToTreeList(List<SysDepart> recordList) {\n        // 在该方法每请求一次,都要对全局list集合进行一次清理\n        //idList.clear();\n    \tList<DepartIdModel> idList = new ArrayList<DepartIdModel>();\n        List<SysDepartTreeModel> records = new ArrayList<>();\n        for (int i = 0; i < recordList.size(); i++) {\n            SysDepart depart = recordList.get(i);\n            records.add(new SysDepartTreeModel(depart));\n        }\n        List<SysDepartTreeModel> tree = findChildren(records, idList);\n        setEmptyChildrenAsNull(tree);\n        return tree;\n    }\n\n    /**\n     * 获取 DepartIdModel\n     * @param recordList\n     * @return\n     */\n    public static List<DepartIdModel> wrapTreeDataToDepartIdTreeList(List<SysDepart> recordList) {\n        // 在该方法每请求一次,都要对全局list集合进行一次清理\n        //idList.clear();\n        List<DepartIdModel> idList = new ArrayList<DepartIdModel>();\n        List<SysDepartTreeModel> records = new ArrayList<>();\n        for (int i = 0; i < recordList.size(); i++) {\n            SysDepart depart = recordList.get(i);\n            records.add(new SysDepartTreeModel(depart));\n        }\n        findChildren(records, idList);\n        return idList;\n    }\n\n    /**\n     * queryTreeList的子方法 ====2=====\n     * 该方法是找到并封装顶级父类的节点到TreeList集合\n     */\n    private static List<SysDepartTreeModel> findChildren(List<SysDepartTreeModel> recordList,\n                                                         List<DepartIdModel> departIdList) {\n\n        List<SysDepartTreeModel> treeList = new ArrayList<>();\n        for (int i = 0; i < recordList.size(); i++) {\n            SysDepartTreeModel branch = recordList.get(i);\n            if (oConvertUtils.isEmpty(branch.getParentId())) {\n                treeList.add(branch);\n                DepartIdModel departIdModel = new DepartIdModel().convert(branch);\n                departIdList.add(departIdModel);\n            }\n        }\n        getGrandChildren(treeList,recordList,departIdList);\n        \n        //idList = departIdList;\n        return treeList;\n    }\n\n    /**\n     * queryTreeList的子方法====3====\n     *该方法是找到顶级父类下的所有子节点集合并封装到TreeList集合\n     */\n    private static void getGrandChildren(List<SysDepartTreeModel> treeList,List<SysDepartTreeModel> recordList,List<DepartIdModel> idList) {\n\n        for (int i = 0; i < treeList.size(); i++) {\n            SysDepartTreeModel model = treeList.get(i);\n            DepartIdModel idModel = idList.get(i);\n            for (int i1 = 0; i1 < recordList.size(); i1++) {\n                SysDepartTreeModel m = recordList.get(i1);\n                if (m.getParentId()!=null && m.getParentId().equals(model.getId())) {\n                    model.getChildren().add(m);\n                    DepartIdModel dim = new DepartIdModel().convert(m);\n                    idModel.getChildren().add(dim);\n                }\n            }\n            getGrandChildren(treeList.get(i).getChildren(), recordList, idList.get(i).getChildren());\n        }\n\n    }\n    \n\n    /**\n     * queryTreeList的子方法 ====4====\n     * 该方法是将子节点为空的List集合设置为Null值\n     */\n    private static void setEmptyChildrenAsNull(List<SysDepartTreeModel> treeList) {\n\n        for (int i = 0; i < treeList.size(); i++) {\n            SysDepartTreeModel model = treeList.get(i);\n            if (model.getChildren().size() == 0) {\n                model.setChildren(null);\n                model.setIsLeaf(true);\n            }else{\n                setEmptyChildrenAsNull(model.getChildren());\n                model.setIsLeaf(false);\n            }\n        }\n        // sysDepartTreeList = treeList;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/util/HttpFileToMultipartFileUtil.java",
    "content": "package org.jeecg.modules.system.util;\n\nimport org.apache.commons.fileupload.FileItem;\nimport org.apache.commons.fileupload.FileItemFactory;\nimport org.apache.commons.fileupload.disk.DiskFileItemFactory;\nimport org.jeecg.common.util.MyCommonsMultipartFile;\nimport org.springframework.web.multipart.MultipartFile;\n\nimport java.io.*;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\n\n/**\n * @Description: http文件转MultipartFile\n * @author: wangshuai\n * @date: 2025/11/5 17:55\n */\npublic class HttpFileToMultipartFileUtil {\n\n    /**\n     * 获取\n     *\n     * @param fileUrl\n     * @param filename\n     * @return\n     * @throws Exception\n     */\n    public static MultipartFile httpFileToMultipartFile(String fileUrl, String filename) throws Exception {\n        byte[] bytes = downloadImageData(fileUrl);\n        return convertByteToMultipartFile(bytes, filename);\n    }\n\n    /**\n     * 下载图片数据\n     */\n    private static byte[] downloadImageData(String fileUrl) throws IOException {\n        URL url = new URL(fileUrl);\n        HttpURLConnection connection = (HttpURLConnection) url.openConnection();\n\n        connection.setRequestMethod(\"GET\");\n        connection.setConnectTimeout(5000);\n        connection.setReadTimeout(10000);\n        connection.setRequestProperty(\"User-Agent\",\n                \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36\");\n        connection.setRequestProperty(\"Accept\", \"image/*\");\n\n        int responseCode = connection.getResponseCode();\n        if (responseCode != HttpURLConnection.HTTP_OK) {\n            throw new IOException(\"HTTP请求失败，响应码: \" + responseCode);\n        }\n\n        try (InputStream inputStream = connection.getInputStream();\n             ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {\n\n            byte[] buffer = new byte[4096];\n            int bytesRead;\n\n            while ((bytesRead = inputStream.read(buffer)) != -1) {\n                outputStream.write(buffer, 0, bytesRead);\n            }\n\n            return outputStream.toByteArray();\n        } finally {\n            connection.disconnect();\n        }\n    }\n\n    /**\n     * byte转 MultipartFile\n     *\n     * @param data\n     * @param fileName\n     * @return\n     */\n    private static MultipartFile convertByteToMultipartFile(byte[] data, String fileName) {\n        FileItemFactory factory = new DiskFileItemFactory();\n        FileItem item = factory.createItem(fileName, \"application/octet-stream\", true, fileName);\n\n        try (OutputStream os = item.getOutputStream();\n             ByteArrayInputStream bis = new ByteArrayInputStream(data)) {\n            byte[] buffer = new byte[8192];\n            int bytesRead;\n            while ((bytesRead = bis.read(buffer)) != -1) {\n                os.write(buffer, 0, bytesRead);\n            }\n        } catch (IOException e) {\n            throw new RuntimeException(\"字节数组转换失败\", e);\n        }\n\n        try {\n            return new MyCommonsMultipartFile(item);\n        } catch (IOException e) {\n            throw new RuntimeException(e);\n        }\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/util/ImportOldUserUtil.java",
    "content": "package org.jeecg.modules.system.util;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang.StringUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.util.ImportExcelUtil;\nimport org.jeecg.common.util.PasswordUtil;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.entity.SysUserDepart;\nimport org.jeecg.modules.system.service.ISysUserDepartService;\nimport org.jeecg.modules.system.service.ISysUserService;\nimport org.jeecg.modules.system.service.impl.SysUserDepartServiceImpl;\nimport org.jeecg.modules.system.service.impl.SysUserServiceImpl;\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @Description: 旧版导入\n * @author: wangshuai\n * @date: 2025/4/2 10:19\n */\n@Slf4j\npublic class ImportOldUserUtil {\n\n    public static Result<?> importOldSysUser(HttpServletRequest request) throws IOException {\n        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n        // 错误信息\n        List<String> errorMessage = new ArrayList<>();\n        int successLines = 0, errorLines = 0;\n        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n            MultipartFile file = entity.getValue();// 获取上传文件对象\n            ImportParams params = new ImportParams();\n            params.setTitleRows(2);\n            params.setHeadRows(1);\n            params.setNeedSave(true);\n            try {\n                List<SysUser> listSysUsers = ExcelImportUtil.importExcel(file.getInputStream(), SysUser.class, params);\n                for (int i = 0; i < listSysUsers.size(); i++) {\n                    SysUser sysUserExcel = listSysUsers.get(i);\n                    if (StringUtils.isBlank(sysUserExcel.getPassword())) {\n                        // 密码默认为 “123456”\n                        sysUserExcel.setPassword(\"123456\");\n                    }\n                    // 密码加密加盐\n                    String salt = oConvertUtils.randomGen(8);\n                    sysUserExcel.setSalt(salt);\n                    String passwordEncode = PasswordUtil.encrypt(sysUserExcel.getUsername(), sysUserExcel.getPassword(), salt);\n                    sysUserExcel.setPassword(passwordEncode);\n                    try {\n                        ISysUserService service = SpringContextUtils.getBean(SysUserServiceImpl.class);\n                        service.save(sysUserExcel);\n                        successLines++;\n                    } catch (Exception e) {\n                        errorLines++;\n                        String message = e.getMessage().toLowerCase();\n                        int lineNumber = i + 1;\n                        // 通过索引名判断出错信息\n                        if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_USER_USERNAME)) {\n                            errorMessage.add(\"第 \" + lineNumber + \" 行：用户名已经存在，忽略导入。\");\n                        } else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_USER_WORK_NO)) {\n                            errorMessage.add(\"第 \" + lineNumber + \" 行：工号已经存在，忽略导入。\");\n                        } else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_USER_PHONE)) {\n                            errorMessage.add(\"第 \" + lineNumber + \" 行：手机号已经存在，忽略导入。\");\n                        } else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_USER_EMAIL)) {\n                            errorMessage.add(\"第 \" + lineNumber + \" 行：电子邮件已经存在，忽略导入。\");\n                        } else if (message.contains(CommonConstant.SQL_INDEX_UNIQ_SYS_USER)) {\n                            errorMessage.add(\"第 \" + lineNumber + \" 行：违反表唯一性约束。\");\n                        } else {\n                            errorMessage.add(\"第 \" + lineNumber + \" 行：未知错误，忽略导入\");\n                            log.error(e.getMessage(), e);\n                        }\n                    }\n                    // 批量将部门和用户信息建立关联关系\n                    String departIds = sysUserExcel.getDepartIds();\n                    if (StringUtils.isNotBlank(departIds)) {\n                        String userId = sysUserExcel.getId();\n                        String[] departIdArray = departIds.split(\",\");\n                        List<SysUserDepart> userDepartList = new ArrayList<>(departIdArray.length);\n                        for (String departId : departIdArray) {\n                            userDepartList.add(new SysUserDepart(userId, departId));\n                        }\n                        ISysUserDepartService service = SpringContextUtils.getBean(SysUserDepartServiceImpl.class);\n                        service.saveBatch(userDepartList);\n                    }\n\n                }\n            } catch (Exception e) {\n                errorMessage.add(\"发生异常：\" + e.getMessage());\n                log.error(e.getMessage(), e);\n            } finally {\n                try {\n                    file.getInputStream().close();\n                } catch (IOException e) {\n                    log.error(e.getMessage(), e);\n                }\n            }\n        }\n        return ImportExcelUtil.imporReturnRes(errorLines, successLines, errorMessage);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/util/ImportSysUserCache.java",
    "content": "package org.jeecg.modules.system.util;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * @Description: 导入缓存类，为了前台显示进度\n * @author: wangshuai\n * @date: 2025/9/6 14:09\n */\npublic class ImportSysUserCache {\n\n    private static final Map<String, Double> importSysUserMap = new HashMap<>();\n\n    /**\n     * 获取导入的列\n     *\n     * @param key\n     * @param type user 用户 可扩展\n     * @return\n     */\n    public static Double getImportSysUserMap(String key, String type) {\n        if (importSysUserMap.containsKey(key + \"__\" + type)) {\n            return importSysUserMap.get(key + \"__\" + type);\n        }\n        return 0.0;\n    }\n\n    /**\n     * 设置导入缓存\n     *\n     * @param key    前村传过来的随机key\n     * @param num    导入行数\n     * @param length 总长度\n     * @param type   导入类型 user 用户列表\n     */\n    public static void setImportSysUserMap(String key, int num, int length, String type) {\n        double percent = (num * 100.0) / length;\n        if(num == length){\n            percent = 100;\n        }\n        importSysUserMap.put(key + \"__\" + type, percent);\n    }\n\n    /**\n     * 移除导入缓存\n     *\n     * @param key\n     */\n    public static void removeImportLowAppMap(String key) {\n        importSysUserMap.remove(key);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/util/PermissionDataUtil.java",
    "content": "package org.jeecg.modules.system.util;\n\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.SymbolConstant;\nimport org.jeecg.common.util.SpringContextUtils;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysPermission;\nimport org.jeecg.modules.system.entity.SysRoleIndex;\nimport org.jeecg.modules.system.service.ISysRoleIndexService;\n\nimport java.util.List;\n\n/**\n * @Author: scott\n * @Date: 2019-04-03\n */\npublic class PermissionDataUtil {\n\n    /**\n     * 路径：views/\n     */\n    private static final String PATH_VIEWS = \"views/\";\n\n    /**\n     * 路径：src/views/\n     */\n    private static final String PATH_SRC_VIEWS = \"src/views/\";\n\n    /**\n     * .vue后缀\n     */\n    private static final String VUE_SUFFIX = \".vue\";\n\n\t/**\n\t * 智能处理错误数据，简化用户失误操作\n\t * \n\t * @param permission\n\t */\n\tpublic static SysPermission intelligentProcessData(SysPermission permission) {\n\t\tif (permission == null) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// 组件\n\t\tif (oConvertUtils.isNotEmpty(permission.getComponent())) {\n\t\t\tString component = permission.getComponent();\n\t\t\tif (component.startsWith(SymbolConstant.SINGLE_SLASH)) {\n\t\t\t\tcomponent = component.substring(1);\n\t\t\t}\n\t\t\tif (component.startsWith(PATH_VIEWS)) {\n\t\t\t\tcomponent = component.replaceFirst(PATH_VIEWS, \"\");\n\t\t\t}\n\t\t\tif (component.startsWith(PATH_SRC_VIEWS)) {\n\t\t\t\tcomponent = component.replaceFirst(PATH_SRC_VIEWS, \"\");\n\t\t\t}\n\t\t\tif (component.endsWith(VUE_SUFFIX)) {\n\t\t\t\tcomponent = component.replace(VUE_SUFFIX, \"\");\n\t\t\t}\n\t\t\tpermission.setComponent(component);\n\t\t}\n\t\t\n\t\t// 请求URL\n\t\tif (oConvertUtils.isNotEmpty(permission.getUrl())) {\n\t\t\tString url = permission.getUrl();\n\t\t\tif (url.endsWith(VUE_SUFFIX)) {\n\t\t\t\turl = url.replace(VUE_SUFFIX, \"\");\n\t\t\t}\n\t\t\tif (!url.startsWith(CommonConstant.STR_HTTP) && !url.startsWith(SymbolConstant.SINGLE_SLASH)&&!url.trim().startsWith(SymbolConstant.DOUBLE_LEFT_CURLY_BRACKET)) {\n\t\t\t\turl = SymbolConstant.SINGLE_SLASH + url;\n\t\t\t}\n\t\t\tpermission.setUrl(url);\n\t\t}\n\t\t\n\t\t// 一级菜单默认组件\n\t\tif (0 == permission.getMenuType() && oConvertUtils.isEmpty(permission.getComponent())) {\n\t\t\t// 一级菜单默认组件\n\t\t\tpermission.setComponent(\"layouts/RouteView\");\n\t\t}\n\t\treturn permission;\n\t}\n\t\n\t/**\n\t * 如果没有index页面 需要new 一个放到list中\n\t * @param metaList\n\t */\n\tpublic static void addIndexPage(List<SysPermission> metaList) {\n\t\tboolean hasIndexMenu = false;\n\t\tSysRoleIndex defIndexCfg = PermissionDataUtil.getDefIndexConfig();\n\t\tfor (SysPermission sysPermission : metaList) {\n\t\t\tif(defIndexCfg.getUrl().equals(sysPermission.getUrl())) {\n\t\t\t\thasIndexMenu = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif(!hasIndexMenu) {\n\t\t\tmetaList.add(0,new SysPermission(true));\n\t\t}\n\t}\n\n\t/**\n\t * 判断是否授权首页\n\t * @param metaList\n\t * @return\n\t */\n\tpublic static boolean hasIndexPage(List<SysPermission> metaList, SysRoleIndex defIndexCfg){\n\t\tboolean hasIndexMenu = false;\n\t\tfor (SysPermission sysPermission : metaList) {\n\t\t\tif(defIndexCfg.getUrl().equals(sysPermission.getUrl())) {\n\t\t\t\thasIndexMenu = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn hasIndexMenu;\n\t}\n\n\t/**\n\t * 通过id判断是否授权某个页面\n\t *\n\t * @param metaList\n\t * @return\n\t */\n\tpublic static boolean hasMenuById(List<SysPermission> metaList, String id) {\n\t\tfor (SysPermission sysPermission : metaList) {\n\t\t\tif (id.equals(sysPermission.getId())) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * 获取默认首页配置\n\t */\n\tpublic static SysRoleIndex getDefIndexConfig() {\n\t\tISysRoleIndexService sysRoleIndexService = SpringContextUtils.getBean(ISysRoleIndexService.class);\n\t\treturn sysRoleIndexService.queryDefaultIndex();\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/util/RandImageUtil.java",
    "content": "package org.jeecg.modules.system.util;\n\nimport javax.imageio.ImageIO;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.awt.*;\nimport java.awt.image.BufferedImage;\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.security.NoSuchAlgorithmException;\nimport java.security.SecureRandom;\nimport java.util.Base64;\nimport java.util.Random;\n\n/**\n * 登录验证码工具类\n * @date  2025-09-11\n * @author AI优化\n */\npublic class RandImageUtil {\n\n    // 静态初始化块，解决无头环境字体配置问题\n    static {\n        System.setProperty(\"java.awt.headless\", \"true\");\n    }\n\n    public static final String KEY = \"JEECG_LOGIN_KEY\";\n\n    /** 验证码图片宽度 */\n    private static final int WIDTH = 105;\n    \n    /** 验证码图片高度 */\n    private static final int HEIGHT = 35;\n    \n    /** 干扰线数量 */\n    private static final int INTERFERENCE_LINE_COUNT = 200;\n    \n    /** 干扰线宽度 */\n    private static final int LINE_WIDTH = 2;\n    \n    /** 图片格式 */\n    private static final String IMG_FORMAT = \"JPEG\";\n    \n    /** base64 图片前缀 */\n    private static final String BASE64_PREFIX = \"data:image/jpg;base64,\";\n    \n    /** 字符间距 */\n    private static final int CHAR_SPACING = 23;\n    \n    /** 字体大小 */\n    private static final int FONT_SIZE = 24;\n    \n    /** 字符Y轴偏移 */\n    private static final int CHAR_Y_OFFSET = 26;\n    \n    /** 字符X轴起始偏移 */\n    private static final int CHAR_X_OFFSET = 8;\n\n    /**\n     * 直接通过response输出验证码图片\n     * \n     * @param response HTTP响应对象\n     * @param verifyCode 验证码字符串\n     * @throws IOException 输出异常\n     */\n    public static void generate(HttpServletResponse response, String verifyCode) throws IOException {\n        if (response == null || verifyCode == null || verifyCode.trim().isEmpty()) {\n            throw new IllegalArgumentException(\"参数不能为空\");\n        }\n        \n        try {\n            BufferedImage image = createVerifyCodeImage(verifyCode);\n            ImageIO.write(image, IMG_FORMAT, response.getOutputStream());\n        } catch (Exception e) {\n            throw new IOException(\"生成验证码图片失败\", e);\n        }\n    }\n\n    /**\n     * 生成验证码的base64字符串\n     * \n     * @param verifyCode 验证码字符串\n     * @return base64编码的图片字符串\n     * @throws IOException 生成异常\n     */\n    public static String generate(String verifyCode) throws IOException {\n        if (verifyCode == null || verifyCode.trim().isEmpty()) {\n            throw new IllegalArgumentException(\"验证码不能为空\");\n        }\n        \n        try {\n            BufferedImage image = createVerifyCodeImage(verifyCode);\n            \n            try (ByteArrayOutputStream byteStream = new ByteArrayOutputStream()) {\n                ImageIO.write(image, IMG_FORMAT, byteStream);\n                byte[] bytes = byteStream.toByteArray();\n                String base64 = Base64.getEncoder().encodeToString(bytes).trim();\n                // 清理换行符\n                base64 = base64.replaceAll(\"[\\r\\n]\", \"\");\n                return BASE64_PREFIX + base64;\n            }\n        } catch (Exception e) {\n            throw new IOException(\"生成验证码base64失败\", e);\n        }\n    }\n\n    /**\n     * 创建验证码图像\n     * \n     * @param verifyCode 验证码字符串\n     * @return 验证码图像\n     */\n    private static BufferedImage createVerifyCodeImage(String verifyCode) {\n        BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);\n        Graphics2D graphics = null;\n        \n        try {\n            graphics = (Graphics2D) image.getGraphics();\n            \n            // 设置图形渲染质量\n            setupRenderingHints(graphics);\n            \n            // 绘制背景\n            drawBackground(graphics);\n            \n            // 绘制边框\n            drawBorder(graphics);\n            \n            // 获取安全的随机数生成器\n            SecureRandom random = createSecureRandom();\n            \n            // 绘制干扰线\n            drawInterferenceLines(graphics, random);\n            \n            // 绘制验证码字符\n            drawVerifyCodeText(graphics, verifyCode);\n            \n        } catch (Exception e) {\n            // 如果绘制失败，创建简单的错误图像\n            return createErrorImage(verifyCode);\n        } finally {\n            if (graphics != null) {\n                graphics.dispose();\n            }\n        }\n        \n        return image;\n    }\n\n    /**\n     * 设置图形渲染质量\n     */\n    private static void setupRenderingHints(Graphics2D graphics) {\n        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);\n        graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);\n        graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);\n    }\n\n    /**\n     * 绘制白色背景\n     */\n    private static void drawBackground(Graphics2D graphics) {\n        graphics.setColor(Color.WHITE);\n        graphics.fillRect(0, 0, WIDTH, HEIGHT);\n    }\n\n    /**\n     * 绘制边框\n     */\n    private static void drawBorder(Graphics2D graphics) {\n        graphics.setColor(Color.GRAY);\n        graphics.drawRect(0, 0, WIDTH - 1, HEIGHT - 1);\n    }\n\n    /**\n     * 创建安全的随机数生成器\n     */\n    private static SecureRandom createSecureRandom() {\n        try {\n            return SecureRandom.getInstance(\"SHA1PRNG\");\n        } catch (NoSuchAlgorithmException e) {\n            return new SecureRandom();\n        }\n    }\n\n    /**\n     * 绘制干扰线\n     */\n    private static void drawInterferenceLines(Graphics2D graphics, SecureRandom random) {\n        for (int i = 0; i < INTERFERENCE_LINE_COUNT; i++) {\n            graphics.setColor(getRandomColor(150, 200, random));\n            \n            // 确保干扰线在边框内\n            int x1 = random.nextInt(WIDTH - LINE_WIDTH - 1) + 1;\n            int y1 = random.nextInt(HEIGHT - LINE_WIDTH - 1) + 1;\n            int x2 = x1 + random.nextInt(LINE_WIDTH);\n            int y2 = y1 + random.nextInt(LINE_WIDTH);\n            \n            graphics.drawLine(x1, y1, x2, y2);\n        }\n    }\n\n    /**\n     * 绘制验证码文本\n     */\n    private static void drawVerifyCodeText(Graphics2D graphics, String verifyCode) {\n        graphics.setColor(Color.BLACK);\n        Font font = createSafeFont();\n        graphics.setFont(font);\n        \n        for (int i = 0; i < verifyCode.length(); i++) {\n            char character = verifyCode.charAt(i);\n            int x = i * CHAR_SPACING + CHAR_X_OFFSET;\n            graphics.drawString(String.valueOf(character), x, CHAR_Y_OFFSET);\n        }\n    }\n\n    /**\n     * 创建安全的字体，避免字体配置问题\n     */\n    private static Font createSafeFont() {\n        // 使用逻辑字体名称，在所有平台都可用\n        String[] safeFontNames = {Font.SERIF, Font.SANS_SERIF, Font.MONOSPACED, \"Dialog\"};\n        \n        for (String fontName : safeFontNames) {\n            try {\n                Font font = new Font(fontName, Font.BOLD, FONT_SIZE);\n                if (font.getFamily() != null) {\n                    return font;\n                }\n            } catch (Exception e) {\n                // 继续尝试下一个字体\n            }\n        }\n        \n        // 最后的回退方案\n        return new Font(Font.MONOSPACED, Font.BOLD, FONT_SIZE);\n    }\n\n    /**\n     * 创建错误图像（当正常绘制失败时使用）\n     */\n    private static BufferedImage createErrorImage(String verifyCode) {\n        BufferedImage errorImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);\n        Graphics2D graphics = null;\n        \n        try {\n            graphics = (Graphics2D) errorImage.getGraphics();\n            \n            // 白色背景\n            graphics.setColor(Color.WHITE);\n            graphics.fillRect(0, 0, WIDTH, HEIGHT);\n            \n            // 黑色边框\n            graphics.setColor(Color.BLACK);\n            graphics.drawRect(0, 0, WIDTH - 1, HEIGHT - 1);\n            \n            // 尝试绘制验证码\n            try {\n                graphics.setFont(new Font(Font.MONOSPACED, Font.BOLD, 20));\n                graphics.setColor(Color.BLUE);\n                for (int i = 0; i < verifyCode.length(); i++) {\n                    graphics.drawString(String.valueOf(verifyCode.charAt(i)), \n                                      i * CHAR_SPACING + CHAR_X_OFFSET, CHAR_Y_OFFSET);\n                }\n            } catch (Exception fontException) {\n                // 如果连基本字体都失败，显示ERROR\n                graphics.setColor(Color.RED);\n                graphics.drawString(\"ERROR\", 10, 20);\n            }\n        } finally {\n            if (graphics != null) {\n                graphics.dispose();\n            }\n        }\n        \n        return errorImage;\n    }\n\n    /**\n     * 获取指定范围内的随机颜色\n     * \n     * @param minColorValue 最小颜色值\n     * @param maxColorValue 最大颜色值\n     * @param random 随机数生成器\n     * @return 随机颜色\n     */\n    private static Color getRandomColor(int minColorValue, int maxColorValue, Random random) {\n        // 确保颜色值在有效范围内\n        int min = Math.max(0, Math.min(minColorValue, 255));\n        int max = Math.max(min, Math.min(maxColorValue, 255));\n        \n        int range = max - min;\n        if (range == 0) {\n            return new Color(min, min, min);\n        }\n        \n        int red = min + random.nextInt(range);\n        int green = min + random.nextInt(range);\n        int blue = min + random.nextInt(range);\n        \n        return new Color(red, green, blue);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/util/SecurityUtil.java",
    "content": "package org.jeecg.modules.system.util;\n\n\nimport cn.hutool.core.util.CharsetUtil;\nimport cn.hutool.crypto.symmetric.SymmetricAlgorithm;\nimport cn.hutool.crypto.symmetric.SymmetricCrypto;\n\n/**\n * @Description: 密码加密解密\n * @author: lsq\n * @date: 2020年09月07日 14:26\n */\npublic class SecurityUtil {\n    /**加密key*/\n    private static String key = \"JEECGBOOT1423670\";\n\n    //---AES加密---------begin---------\n    /**加密\n     * @param content\n     * @return\n     */\n    public static String jiami(String content) {\n            SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key.getBytes());\n            String encryptResultStr = aes.encryptHex(content);\n            return encryptResultStr;\n    }\n\n    /**解密\n     * @param encryptResultStr\n     * @return\n     */\n    public static String jiemi(String encryptResultStr){\n        SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key.getBytes());\n        //解密为字符串\n        String decryptResult = aes.decryptStr(encryptResultStr, CharsetUtil.CHARSET_UTF_8);\n        return  decryptResult;\n    }\n    //---AES加密---------end---------\n    /**\n     * 主函数\n     */\n    public static void main(String[] args) {\n        String content=\"test1111\";\n        String encrypt = jiami(content);\n        System.out.println(encrypt);\n        //构建\n        String decrypt = jiemi(encrypt);\n        //解密为字符串\n        System.out.println(decrypt);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/util/XssUtils.java",
    "content": "package org.jeecg.modules.system.util;\n\nimport org.springframework.web.util.HtmlUtils;\n\nimport java.util.regex.Pattern;\n\n/**\n * @Description: 工具类XSSUtils，现在的做法是替换成空字符，CSDN的是进行转义，比如文字开头的\"<\"转成&lt;\n * @author: lsq\n * @date: 2021年07月26日 19:13\n */\npublic class XssUtils {\n\n    private static Pattern[] patterns = new Pattern[]{\n        //Script fragments\n        Pattern.compile(\"<script>(.*?)</script>\", Pattern.CASE_INSENSITIVE),\n        //src='...'\n        Pattern.compile(\"src[\\r\\n]*=[\\r\\n]*\\\\\\'(.*?)\\\\\\'\", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),\n        Pattern.compile(\"src[\\r\\n]*=[\\r\\n]*\\\\\\\"(.*?)\\\\\\\"\", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),\n        //script tags\n        Pattern.compile(\"</script>\", Pattern.CASE_INSENSITIVE),\n        Pattern.compile(\"<script(.*?)>\", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),\n        //eval(...)\n        Pattern.compile(\"eval\\\\((.*?)\\\\)\", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),\n        //expression(...)\n        Pattern.compile(\"e­xpression\\\\((.*?)\\\\)\", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),\n        //javascript:...\n        Pattern.compile(\"javascript:\", Pattern.CASE_INSENSITIVE),\n        //vbscript:...\n        Pattern.compile(\"vbscript:\", Pattern.CASE_INSENSITIVE),\n        //onload(...)=...\n        Pattern.compile(\"onload(.*?)=\", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),\n    };\n\n    public static String scriptXss(String value) {\n        if (value != null) {\n            value = value.replaceAll(\" \", \"\");\n            for(Pattern scriptPattern: patterns){\n                value = scriptPattern.matcher(value).replaceAll(\"\");\n            }\n        }\n        return HtmlUtils.htmlEscape(value);\n    }\n\n    public static void main(String[] args) {\n        String s = scriptXss(\"<img  src=x onload=alert(111).*?><script></script>javascript:eval()\\\\\\\\.\");\n        System.err.println(\"s======>\" + s);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysChangeDepartVo.java",
    "content": "package org.jeecg.modules.system.vo;\n\nimport lombok.Data;\n\n/**\n* @Description: 部门修改替换类\n*\n* @author: wangshuai\n* @date: 2025/9/28 18:52\n*/\n@Data\npublic class SysChangeDepartVo {\n    /**\n     * 最终停止的部门id\n     */\n    private String dropId;\n\n    /**\n     * 拖拽的部门id\n     */\n    private String dragId;\n\n    /**\n     * 拖拽位置（-1上方 1下方 0子级）\n     */\n    private Integer dropPosition;\n\n    /**\n     * 当前位置\n     */\n    private Integer sort;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysCommentFileVo.java",
    "content": "package org.jeecg.modules.system.vo;\n\nimport lombok.Data;\n\n/**\n * @Description: 文档VO\n * @Author: jeecg-boot\n * @Date: 2022-07-21\n * @Version: V1.0\n */\n@Data\npublic class SysCommentFileVo {\n\n    /**\n     * sys_files id\n     */\n    private String fileId;\n    /**\n     * sys_form_file id\n     */\n    private String sysFormFileId;\n    /**\n     * 文件名称\n     */\n    private String name;\n\n    private Double fileSize;\n\n    /**\n     * 文件地址\n     */\n    private String url;\n\n    /**\n     * 文档类型（folder:文件夹 excel:excel doc:word pp:ppt image:图片  archive:其他文档 video:视频）\n     */\n    private String type;\n\n    /**\n     * 文件上传类型(temp/本地上传(临时文件) manage/知识库)\n     */\n    private String storeType;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysCommentVO.java",
    "content": "package org.jeecg.modules.system.vo;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * @Description: VO 评论信息+文件信息\n * @Author: jeecg-boot\n * @Date: 2022-07-19\n * @Version: V1.0\n */\n@Data\npublic class SysCommentVO implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * id\n     */\n    private String id;\n    /**\n     * 表名\n     */\n    private String tableName;\n    /**\n     * 数据id\n     */\n    private String tableDataId;\n    /**\n     * 来源用户id\n     */\n    private String fromUserId;\n    /**\n     * 回复内容\n     */\n    private String commentContent;\n    /**\n     * 创建日期\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @Schema(description = \"创建日期\")\n    private Date createTime;\n\n    /**\n     * 文件信息\n     */\n    private List<SysCommentFileVo> fileList;\n\n    /**\n     * 发送给用户id(允许为空)\n     */\n    @Dict(dictTable = \"sys_user\", dicCode = \"id\", dicText = \"realname\")\n    private String toUserId;\n    \n    /**\n     * 评论id(允许为空，不为空时，则为回复)\n     */\n    private String commentId;\n\n    /**\n     * 发消息人的realname\n     */\n    private String fromUserId_dictText;\n\n    /**\n     * 被回复消息人的realname\n     */\n    private String toUserId_dictText;\n\n    /**\n     * 发消息人的头像\n     */\n    private String fromUserAvatar;\n\n    /**\n     * 被回复消息人的头像\n     */\n    private String toUserAvatar;\n    \n    public SysCommentVO() {\n\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysDepartExportVo.java",
    "content": "package org.jeecg.modules.system.vo;\n\nimport lombok.Data;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecgframework.poi.excel.annotation.Excel;\n\n@Data\npublic class SysDepartExportVo {\n    /**部门路径*/\n    @Excel(name=\"部门路径\",width=50)\n    private String departNameUrl;\n    /**机构/部门名称*/\n    @Excel(name=\"部门名称\",width=50)\n    private String departName;\n    /**id*/\n    private String id;\n    /**父级id*/\n    private String parentId;\n    /**英文名*/\n    @Excel(name=\"英文名\",width=15)\n    private String departNameEn;\n    /**排序*/\n    @Excel(name=\"排序\",width=15)\n    private Integer departOrder;\n    /**描述*/\n    @Excel(name=\"描述\",width=15)\n    private String description;\n    /**机构类别 1=公司，2=组织机构，3=岗位*/\n    @Excel(name=\"机构类别\",width=15,dicCode=\"org_category\")\n    private String orgCategory;\n    /** 职级id */\n    @Excel(name=\"职级\",width=15,dictTable = \"sys_position\", dicCode = \"id\", dicText = \"name\")\n    private String positionId;\n    /**机构编码*/\n    @Excel(name=\"机构编码\",width=15)\n    private String orgCode;\n    /**手机号*/\n    @Excel(name=\"手机号\",width=15)\n    private String mobile;\n    /**传真*/\n    @Excel(name=\"传真\",width=15)\n    private String fax;\n    /**地址*/\n    @Excel(name=\"地址\",width=15)\n    private String address;\n    /**备注*/\n    @Excel(name=\"备注\",width=15)\n    private String memo;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysDepartPositionVo.java",
    "content": "package org.jeecg.modules.system.vo;\n\nimport lombok.Data;\n\n/**\n* @Description: 部门职务\n*\n* @author: wangshuai\n* @date: 2025/8/18 10:11\n*/\n@Data\npublic class SysDepartPositionVo {\n\n    /**\n     * 部门id\n     */\n    private String id;\n\n    /**\n     * 是否为叶子节点(数据返回)\n     */\n    private Integer izLeaf;\n    \n    /**\n     * 部门名称\n     */\n    private String departName;\n\n    /**\n     * 职务名称\n     */\n    private String positionName;\n\n    /**\n     * 父级id\n     */\n    private String parentId;\n\n    /**\n     * 部门编码\n     */\n    private String orgCode;\n\n    /**\n     * 机构类型\n     */\n    private String orgCategory;\n\n    /**\n     * 上级岗位id\n     */\n    private String depPostParentId;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysDepartUsersVO.java",
    "content": "package org.jeecg.modules.system.vo;\n\nimport java.io.Serializable;\nimport java.util.List;\n\nimport lombok.Data;\n\n/**\n * @Description: 系统部门VO\n * @author: jeecg-boot\n */\n@Data\npublic class SysDepartUsersVO implements Serializable{\n\tprivate static final long serialVersionUID = 1L;\n\t\n\t/**部门id*/\n\tprivate String depId;\n\t/**对应的用户id集合*/\n\tprivate List<String> userIdList;\n\tpublic SysDepartUsersVO(String depId, List<String> userIdList) {\n\t\tsuper();\n\t\tthis.depId = depId;\n\t\tthis.userIdList = userIdList;\n\t}\n\n\tpublic SysDepartUsersVO(){\n\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysDictPage.java",
    "content": "package org.jeecg.modules.system.vo;\n\nimport lombok.Data;\nimport org.jeecg.modules.system.entity.SysDictItem;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.jeecgframework.poi.excel.annotation.ExcelCollection;\n\nimport java.util.List;\n\n/**\n * @Description: 系统字典分页\n * @author: jeecg-boot\n */\n@Data\npublic class SysDictPage {\n\n    /**\n     * 主键\n     */\n    private String id;\n    /**\n     * 字典名称\n     */\n    @Excel(name = \"字典名称\", width = 20)\n    private String dictName;\n\n    /**\n     * 字典编码\n     */\n    @Excel(name = \"字典编码\", width = 30)\n    private String dictCode;\n    /**\n     * 删除状态\n     */\n    private Integer delFlag;\n    /**\n     * 描述\n     */\n    @Excel(name = \"描述\", width = 30)\n    private String description;\n\n    @ExcelCollection(name = \"字典列表\")\n    private List<SysDictItem> sysDictItemList;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysPositionSelectTreeVo.java",
    "content": "package org.jeecg.modules.system.vo;\n\nimport lombok.Data;\nimport org.jeecg.common.constant.enums.DepartCategoryEnum;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.modules.system.entity.SysDepart;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n* @Description: 岗位下拉选择树\n*\n* @author: wangshuai\n* @date: 2025/8/18 9:40\n*/\n@Data\npublic class SysPositionSelectTreeVo {\n    /** 对应SysDepart中的id字段,前端数据树中的value*/\n    private String value;\n\n    /** 对应depart_name字段,前端数据树中的title*/\n    private String title;\n    private boolean isLeaf;\n    /** 是否显示复选框 */\n    private boolean checkable;\n    /** 是否禁用 */\n    private boolean disabled;\n    // 以下所有字段均与SysDepart相同\n    private String id;\n    /**父级id*/\n    private String parentId;\n    /**部门类别*/\n    private String orgCategory;\n    /**部门编码*/\n    private String orgCode;\n    \n    private List<SysPositionSelectTreeVo> children = new ArrayList<>();\n\n    /**\n     * 将SysDepart对象转换成SysDepartTreeModel对象\n     * @param sysDepart\n     */\n    public SysPositionSelectTreeVo(SysDepart sysDepart) {\n        this.value = sysDepart.getId();\n        this.title = sysDepart.getDepartName();\n        this.id = sysDepart.getId();\n        this.parentId = sysDepart.getParentId();\n        this.orgCategory = sysDepart.getOrgCategory();\n        this.orgCode = sysDepart.getOrgCode();\n        if(0 == sysDepart.getIzLeaf()){\n            this.isLeaf = false;\n        }else{\n            this.isLeaf = true;\n        }\n        if(DepartCategoryEnum.DEPART_CATEGORY_POST.getValue().equals(sysDepart.getOrgCategory())){\n            this.checkable = true;\n            this.disabled = false;\n        }else{\n            this.checkable = false;\n            this.disabled = true;\n        }\n    }\n\n    public SysPositionSelectTreeVo(SysDepartPositionVo position) {\n        this.value = position.getId();\n        if(oConvertUtils.isNotEmpty(position.getDepartName())){\n            this.title = position.getPositionName() + \"(\"+position.getDepartName()+\")\";\n        }else{\n            this.title = position.getPositionName();\n        }\n        this.id = position.getId();\n        this.parentId = position.getDepPostParentId();\n        this.orgCategory = \"3\";\n        if(0 == position.getIzLeaf()){\n            this.isLeaf = false;\n        }else{\n            this.isLeaf = true;\n        }\n        this.checkable = true;\n        this.disabled = false;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysUserDepVo.java",
    "content": "package org.jeecg.modules.system.vo;\n\nimport lombok.Data;\n\n/**\n * @Author qinfeng\n * @Date 2020/1/2 21:58\n * @Description:\n * @Version 1.0\n */\n@Data\npublic class SysUserDepVo {\n    private String userId;\n    private String departName;\n    /**\n     * 部门id\n     */\n    private String deptId;\n\n    /**\n     * 部门的父级id\n     */\n    private String parentId;\n\n    /**\n     * 部门类型\n     */\n    private String orgCategory;\n\n    /**\n     * 职级\n     */\n    private String positionId;\n\n    /**\n     * 部门编码\n     */\n    private String orgCode;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysUserExportVo.java",
    "content": "package org.jeecg.modules.system.vo;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Data;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.util.Date;\n\n/**\n * @Description: 低代码用户导出\n * @author: wangshuai\n * @date: 2025/3/28 12:01\n */\n@Data\npublic class SysUserExportVo {\n\n    /**\n     * 登录账号\n     */\n    @Excel(name = \"登录账号\", width = 15)\n    private String username;\n\n    /**\n     * 真实姓名\n     */\n    @Excel(name = \"真实姓名\", width = 15)\n    private String realname;\n\n    /**\n     * 头像\n     */\n    @Excel(name = \"头像\", width = 15, type = 2)\n    private String avatar;\n\n    /**\n     * 生日\n     */\n    @Excel(name = \"生日\", width = 15, format = \"yyyy-MM-dd\")\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd\")\n    private Date birthday;\n\n    /**\n     * 性别（1：男 2：女）\n     */\n    @Excel(name = \"性别\", width = 15, dicCode = \"sex\")\n    private Integer sex;\n\n    /**\n     * 电子邮件\n     */\n    @Excel(name = \"电子邮件\", width = 15)\n    private String email;\n\n    /**\n     * 电话\n     */\n    @Excel(name = \"电话\", width = 15)\n    private String phone;\n\n    /**\n     * 状态(1：正常  2：冻结 ）\n     */\n    @Excel(name = \"状态\", width = 15, dicCode = \"user_status\")\n    private Integer status;\n\n    /**\n     * 删除状态（0，正常，1已删除）\n     */\n    @Excel(name = \"删除状态\", width = 15, dicCode = \"del_flag\")\n    private Integer delFlag;\n\n    /**\n     * 工号，唯一键\n     */\n    @Excel(name = \"工号\", width = 15)\n    private String workNo;\n    \n    /**\n     * 主岗位\n     */\n    @Excel(name=\"主岗位\",width = 15,dictTable =\"sys_depart\",dicText = \"depart_name\",dicCode = \"id\")\n    @Dict(dictTable =\"sys_depart\",dicText = \"depart_name\",dicCode = \"id\")\n    private String mainDepPostId;\n\n    /**\n     * 职级\n     */\n    @Excel(name=\"职级\", width = 15)\n    private String postName;\n\n    /**\n     * 兼职岗位\n     */\n    @Excel(name=\"兼职岗位\",width = 15,dictTable =\"sys_depart\",dicText = \"depart_name\",dicCode = \"id\")\n    @Dict(dictTable =\"sys_depart\",dicText = \"depart_name\",dicCode = \"id\")\n    private String otherDepPostId;\n\n    /**\n     * 座机号\n     */\n    @Excel(name = \"座机号\", width = 15)\n    private String telephone;\n\n\n    /**\n     * 身份（0 普通成员 1 上级）\n     */\n    @Excel(name = \"（1普通成员 2上级）\", width = 15)\n    private Integer userIdentity;\n\n    /**\n     * 角色名称\n     */\n    @Excel(name = \"角色\", width = 15)\n    private String roleNames;\n\n    /**\n     * 部门名称\n     */\n    @Excel(name = \"所属部门\", width = 15)\n    private String departNames;\n\n    /**\n     * 机构类型\n     * 公司(1)、部门(2)、岗位(3)、子公司(4)\n     */\n    @Excel(name = \"部门类型(1-公司,2-部门,3-岗位,4-子公司)\",width = 15)\n    private String orgCategorys;\n\n    /**\n     * 负责部门\n     */\n    @Excel(name = \"负责部门\", width = 15)\n    private String departIds;\n\n    /**\n     * 职务\n     */\n    @Excel(name=\"职务\", dicCode = \"user_position\")\n    private String positionType;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysUserImportVo.java",
    "content": "package org.jeecg.modules.system.vo;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Data;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.util.Date;\n\n/**\n * @Description: 低代码用户导入\n * @author: wangshuai\n * @date: 2025/8/27 11:58\n */\n@Data\npublic class SysUserImportVo {\n\n    /**\n     * 登录账号\n     */\n    @Excel(name = \"登录账号\", width = 15)\n    private String username;\n\n    /**\n     * 真实姓名\n     */\n    @Excel(name = \"真实姓名\", width = 15)\n    private String realname;\n\n    /**\n     * 头像\n     */\n    @Excel(name = \"头像\", width = 15, type = 2)\n    private String avatar;\n\n    /**\n     * 生日\n     */\n    @Excel(name = \"生日\", width = 15, format = \"yyyy-MM-dd\")\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd\")\n    private Date birthday;\n\n    /**\n     * 性别（1：男 2：女）\n     */\n    @Excel(name = \"性别\", width = 15, dicCode = \"sex\")\n    private Integer sex;\n\n    /**\n     * 电子邮件\n     */\n    @Excel(name = \"电子邮件\", width = 15)\n    private String email;\n\n    /**\n     * 电话\n     */\n    @Excel(name = \"电话\", width = 15)\n    private String phone;\n\n    /**\n     * 状态(1：正常  2：冻结 ）\n     */\n    @Excel(name = \"状态\", width = 15, dicCode = \"user_status\")\n    private Integer status;\n\n    /**\n     * 删除状态（0，正常，1已删除）\n     */\n    @Excel(name = \"删除状态\", width = 15, dicCode = \"del_flag\")\n    private Integer delFlag;\n\n    /**\n     * 工号，唯一键\n     */\n    @Excel(name = \"工号\", width = 15)\n    private String workNo;\n    \n    /**\n     * 主岗位\n     */\n    @Excel(name=\"主岗位\",width = 15)\n    private String mainDepPostId;\n\n    /**\n     * 兼职岗位\n     */\n    @Excel(name=\"兼职岗位\",width = 15)\n    private String otherDepPostId;\n\n    /**\n     * 职级\n     */\n    @Excel(name=\"职级\", width = 15)\n    private String postName;\n    \n    /**\n     * 身份（0 普通成员 1 上级）\n     */\n    @Excel(name = \"（1普通成员 2上级）\", width = 15)\n    private Integer userIdentity;\n\n    /**\n     * 角色名称\n     */\n    @Excel(name = \"角色\", width = 15)\n    private String roleNames;\n\n    /**\n     * 部门名称\n     */\n    @Excel(name = \"所属部门\", width = 15)\n    private String departNames;\n\n    /**\n     * 机构类型\n     * 公司(1)、部门(2)、岗位(3)、子公司(4)\n     */\n    @Excel(name = \"部门类型(1-公司,2-部门,3-岗位,4-子公司)\",width = 15)\n    private String orgCategorys;\n\n    /**\n     * 负责部门\n     */\n    @Excel(name = \"负责部门\", width = 15)\n    private String departIds;\n    \n    /**\n     * 职务\n     */\n    @Excel(name=\"职务\", dicCode = \"user_position\")\n    private String positionType;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysUserOnlineVO.java",
    "content": "package org.jeecg.modules.system.vo;\n\nimport java.util.Date;\n\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\n\nimport lombok.Data;\n\n/**\n *\n * @Author: chenli\n * @Date: 2020-06-07\n * @Version: V1.0\n */\n@Data\npublic class SysUserOnlineVO {\n    /**\n     * 会话id\n     */\n    private String id;\n\n    /**\n     * 会话编号\n     */\n    private String token;\n\n    /**\n     * 用户名\n     */\n    private String username;\n\n    /**\n     * 用户名\n     */\n    private String realname;\n\n    /**\n     * 头像\n     */\n    private String avatar;\n\n    /**\n     * 生日\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd\")\n    private Date birthday;\n\n    /**\n     * 性别（1：男 2：女）\n     */\n    @Dict(dicCode = \"sex\")\n    private Integer sex;\n\n    /**\n     * 手机号\n     */\n    private String phone;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysUserPositionVo.java",
    "content": "package org.jeecg.modules.system.vo;\n\nimport lombok.Data;\n\n/**\n* @Description: 用户职位实体类\n*\n* @author: wangshuai\n* @date: 2023/6/14 16:41\n*/\n@Data\npublic class SysUserPositionVo {\n    \n    /**职位id*/\n    private String id;\n\n    /**职务名称*/\n    private String name;\n    \n    /**用户id*/\n    private String userId;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysUserRoleCountVo.java",
    "content": "package org.jeecg.modules.system.vo;\n\nimport lombok.Data;\n\n/**\n * @Description:\n * @author: wangshuai\n * @date: 2022年12月07日 16:41\n */\n@Data\npublic class SysUserRoleCountVo {\n    /**\n     * 角色id\n     */\n    private String id;\n    /**\n     * 角色名称\n     */\n    private String roleName;\n    /**\n     * 角色描述\n     */\n    private String description;\n    /**\n     * 角色编码\n     */\n    private String roleCode;\n    /**\n     * 角色下的用户数量\n     */\n    private Long count;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysUserRoleVO.java",
    "content": "package org.jeecg.modules.system.vo;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * @Description: 用户角色vo\n * @author: jeecg-boot\n */\n@Data\npublic class SysUserRoleVO implements Serializable{\n\tprivate static final long serialVersionUID = 1L;\n\n\t/**部门id*/\n\tprivate String roleId;\n\t/**对应的用户id集合*/\n\tprivate List<String> userIdList;\n\n\tpublic SysUserRoleVO() {\n\t\tsuper();\n\t}\n\n\tpublic SysUserRoleVO(String roleId, List<String> userIdList) {\n\t\tsuper();\n\t\tthis.roleId = roleId;\n\t\tthis.userIdList = userIdList;\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysUserTenantVo.java",
    "content": "package org.jeecg.modules.system.vo;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Data;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.util.Date;\n\n/**\n * @Description: 用户租户类(用户数据租户数据)\n * @author: wangshuai\n * @date: 2023年01月08日 17:27\n */\n@Data\npublic class SysUserTenantVo {\n\n    /**\n     * 用户id\n     */\n    private String id;\n\n    /**\n     * 用户账号\n     */\n    private String username;\n\n    /**\n     * 用户昵称\n     */\n    private String realname;\n\n    /**\n     * 工号\n     */\n    private String workNo;\n    \n    /**\n     * 邮箱\n     */\n    private String email; \n    \n    /**\n     * 手机号\n     */\n    private String phone;   \n    \n    /**\n     * 头像\n     */\n    private String avatar;\n\n    /**\n     * 创建日期\n     */\n    @JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n    private Date createTime;\n    \n    /**\n     * 职位\n     */\n    @Dict(dictTable =\"sys_position\",dicText = \"name\",dicCode = \"id\")\n    private String post;\n\n    /**\n     * 审核状态\n     */\n    private String status;\n\n    /**\n     * 部门名称\n     */\n    private String orgCodeTxt;\n\n    /**\n     * 部门code\n     */\n    private String orgCode;\n\n    /**\n     * 租户id\n     */\n    private String relTenantIds;\n\n    /**\n     * 租户创建人\n     */\n    private String createBy;\n\n    /**\n     * 用户租户状态\n     */\n    private String userTenantStatus;\n\n    /**\n     * 用户租户id\n     */\n    private String tenantUserId;\n\n    /**\n     * 租户名称\n     */\n    private String name;\n\n    /**\n     * 所属行业\n     */\n    @Dict(dicCode = \"trade\")\n    private String trade;\n    \n    /**\n     * 门牌号\n     */\n    private String houseNumber;\n\n    /**\n     * 是否为会员\n     */\n    private String memberType;\n\n    /**\n     * 是否为租户管理员\n     */\n    private Boolean tenantAdmin = false;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/UserAvatar.java",
    "content": "package org.jeecg.modules.system.vo;\n\nimport lombok.Data;\nimport org.jeecg.modules.system.entity.SysUser;\n\n/**\n *  用户名和头像信息\n * @Author taoYan\n * @Date 2022/8/8 17:06\n **/\n@Data\npublic class UserAvatar {\n    \n    private String id;\n    \n    private String realname;\n    \n    private String avatar;\n    \n    public UserAvatar(){\n        \n    }\n    public UserAvatar(SysUser sysUser){\n        this.id = sysUser.getId();\n        this.realname = sysUser.getRealname();\n        this.avatar = sysUser.getAvatar();\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/lowapp/AppExportUserVo.java",
    "content": "package org.jeecg.modules.system.vo.lowapp;\n\nimport lombok.Data;\nimport org.jeecgframework.poi.excel.annotation.Excel;\n\nimport java.util.Date;\n\n/**\n* @Description: 应用用户与部门 用户导出/导入实体类\n*\n* @author: wangshuai\n* @date: 2023/6/14 16:42\n*/\n@Data\npublic class AppExportUserVo {\n\n    /**用户编号*/\n    @Excel(name=\"用户编号\",width=30)\n    private String id;\n\n    /**姓名*/\n    @Excel(name=\"姓名\",width=30)\n    private String realname;\n    \n    /**职位*/\n    @Excel(name = \"职位\",width = 30)\n    private String position;\n\n    /**部门*/\n    @Excel(name = \"部门\",width = 30)\n    private String depart;\n\n    /**工号*/\n    @Excel(name = \"工号\",width = 30)\n    private String workNo;\n    \n    /**手机号*/\n    @Excel(name = \"手机号\",width = 30)\n    private String phone;\n    \n    /**邮箱*/\n    @Excel(name = \"邮箱\",width = 30)\n    private String email;\n\n    /**加入时间*/\n    @Excel(name = \"加入时间\",width = 30, format = \"yyyy-MM-dd\")\n    private Date createTime;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/lowapp/DepartAndUserInfo.java",
    "content": "package org.jeecg.modules.system.vo.lowapp;\n\nimport lombok.Data;\nimport org.jeecg.modules.system.vo.UserAvatar;\n\nimport java.io.Serializable;\nimport java.util.List;\n\n/**\n * 用户或者部门的信息\n * 用于 成员与部门 的搜索\n * @Author taoYan\n * @Date 2022/12/30 10:47\n **/\n@Data\npublic class DepartAndUserInfo implements Serializable {\n    private static final long serialVersionUID = 1L;\n    \n    List<UserAvatar> userList;\n    \n    List<DepartInfo> departList;\n    \n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/lowapp/DepartInfo.java",
    "content": "package org.jeecg.modules.system.vo.lowapp;\n\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * @Author taoYan\n * @Date 2022/12/30 10:52\n **/\n@Data\npublic class DepartInfo {\n\n    private String id;\n\n    /**\n     * 上级名称-下级名称\n     */\n    private List<String> orgName;\n\n    /**\n     * 上级ID-下级ID\n     */\n    private List<String> orgId;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/lowapp/ExportDepartVo.java",
    "content": "package org.jeecg.modules.system.vo.lowapp;\n\nimport lombok.Data;\nimport org.jeecgframework.poi.excel.annotation.Excel;\n\n@Data\npublic class ExportDepartVo {\n    /**部门路径*/\n    @Excel(name=\"部门路径\",width=50)\n    private String departNameUrl;\n    /**机构/部门名称*/\n    @Excel(name=\"部门名称\",width=50)\n    private String departName;\n    /**id*/\n    private String id;\n    /**父级id*/\n    private String parentId;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/lowapp/SysDictVo.java",
    "content": "package org.jeecg.modules.system.vo.lowapp;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport lombok.Data;\nimport org.jeecg.modules.system.entity.SysDict;\nimport org.jeecg.modules.system.entity.SysDictItem;\n\nimport java.util.List;\n\n@Data\npublic class SysDictVo {\n    /**\n     * 字典id\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    private String id;\n\n    /**\n     * 字典名称\n     */\n    private String dictName;\n\n    /**\n     * 字典编码\n     */\n    private String dictCode;\n\n    /**\n     * 应用id\n     */\n    private String lowAppId;\n    \n    /**\n     * 租户ID\n     */\n    private Integer tenantId;\n\n    /**\n     * 字典子项\n     */\n    private List<SysDictItem> dictItemsList;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/lowapp/UpdateDepartInfo.java",
    "content": "package org.jeecg.modules.system.vo.lowapp;\n\nimport lombok.Data;\nimport org.jeecg.modules.system.entity.SysDepart;\n\nimport java.util.List;\n\n/**\n * @Author taoYan\n * @Date 2022/12/30 16:25\n **/\n@Data\npublic class UpdateDepartInfo {\n    \n    private String departId;\n    \n    private String departName;\n    \n    private String parentId;\n    \n    private Boolean hasSub;\n    \n    public UpdateDepartInfo(){\n        \n    }\n\n    public UpdateDepartInfo(SysDepart depart){\n        this.departId = depart.getId();\n        this.departName = depart.getDepartName();\n        this.parentId = depart.getParentId();\n        this.hasSub = false;\n    }\n\n    /**\n     * 部门负责人ID\n     */\n    private List<String> chargePersonList;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/tenant/TenantDepartAuthInfo.java",
    "content": "package org.jeecg.modules.system.vo.tenant;\n\nimport lombok.Data;\nimport org.jeecg.modules.system.entity.SysTenant;\n\nimport java.util.List;\n\n/**\n * 进入租户组织页面 查询租户信息及操作权限\n * @Author taoYan\n * @Date 2023/2/16 16:18\n **/\n@Data\npublic class TenantDepartAuthInfo {\n\n    /**\n     * 当前用户是不是 超级管理员\n     */\n    private boolean superAdmin;\n\n    /**\n     * 租户信息\n     */\n    private SysTenant sysTenant;\n\n    /**\n     * 统计租户产品包人员数量\n     */\n    private List<TenantPackUserCount> packCountList;\n\n    /**\n     * 租户产品包 编码(这个编码只有3个admin产品包有，便于区分)\n     */\n    private List<String> packCodes;\n    \n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/tenant/TenantPackAuth.java",
    "content": "package org.jeecg.modules.system.vo.tenant;\n\nimport lombok.Data;\n\n/**\n * 租户产品包 关联权限详情\n * @Author taoYan\n * @Date 2023/2/16 21:02\n **/\n@Data\npublic class TenantPackAuth {\n\n    /**\n     * 一级菜单\n     */\n    private String category;\n\n    /**\n     * 权限菜单名称\n     */\n    private String authName;\n\n\n    /**\n     * 权限菜单描述\n     */\n    private String authNote;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/tenant/TenantPackModel.java",
    "content": "package org.jeecg.modules.system.vo.tenant;\n\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * 租户产品包信息\n *  包括+ 用户信息 + 权限信息\n * @Author taoYan\n * @Date 2023/2/16 21:01\n **/\n@Data\npublic class TenantPackModel {\n\n    /**\n     * 租户Id\n     */\n    private Integer tenantId;\n    /**\n     * 产品包编码\n     */\n    private String packCode;\n\n    /**\n     * 产品包ID\n     */\n    private String packId;\n\n    /**\n     * 产品包名称\n     */\n    private String packName;\n\n    /**\n     * 产品包 权限信息\n     */\n    private List<TenantPackAuth> authList;\n\n    /**\n     * 产品包 用户列表\n     */\n    private List<TenantPackUser> userList;\n\n    /**\n     * 状态 正常状态1 申请状态0\n     */\n    private Integer packUserStatus;\n    \n    public Integer getPackUserStatus(){\n        if(packUserStatus==null){\n            return 1;\n        }\n        return packUserStatus; \n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/tenant/TenantPackUser.java",
    "content": "package org.jeecg.modules.system.vo.tenant;\n\nimport lombok.Data;\n\nimport java.util.HashSet;\nimport java.util.Set;\n\n/**\n * 用户产品包 关联的用户信息\n * @Author taoYan\n * @Date 2023/2/16 21:02\n **/\n@Data\npublic class TenantPackUser {\n    /**\n     * 用户ID\n     */\n    private String id;\n    \n    private String username;\n    \n    private String realname;\n    \n    private String avatar;\n    \n    private String phone;\n\n    /**\n     * 多个 部门名称集合\n     */\n    private Set<String> departNames;\n\n    /**\n     * 多个 职位名称集合\n     */\n    private Set<String> positionNames;\n\n    /**\n     * 租户产品包名称\n     */\n    private String packName;\n\n    /**\n     * 租户产品包ID\n     */\n    private String packId;\n    \n    public void addDepart(String name){\n        if(departNames==null){\n            departNames = new HashSet<>();\n        }\n        departNames.add(name);\n    }\n\n\n    public void addPosition(String name){\n        if(positionNames==null){\n            positionNames = new HashSet<>();\n        }\n        positionNames.add(name);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/tenant/TenantPackUserCount.java",
    "content": "package org.jeecg.modules.system.vo.tenant;\n\nimport lombok.Data;\n\n/**\n * 用于统计 租户产品包的人员数量\n * @Author taoYan\n * @Date 2023/2/16 15:59\n **/\n@Data\npublic class TenantPackUserCount {\n\n    /**\n     * 租户产品包编码\n     */\n    private String packCode;\n\n    /**\n     * 用户数量\n     */\n    private String userCount;\n    \n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/tenant/UserDepart.java",
    "content": "package org.jeecg.modules.system.vo.tenant;\n\nimport lombok.Data;\n\n/**\n * 用户与部门信息\n * @Author taoYan\n * @Date 2023/2/17 10:10\n **/\n@Data\npublic class UserDepart {\n\n    /**\n     * 用户ID\n     */\n    private String userId;\n\n    /**\n     * 部门名称\n     */\n    private String departName;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/tenant/UserPosition.java",
    "content": "package org.jeecg.modules.system.vo.tenant;\n\nimport lombok.Data;\n\n/**\n * 用户与职位信息\n * @Author taoYan\n * @Date 2023/2/17 10:10\n **/\n@Data\npublic class UserPosition {\n\n    /**\n     * 用户ID\n     */\n    private String userId;\n\n    /**\n     * 职位名称\n     */\n    private String positionName;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JdtDepartmentTreeVo.java",
    "content": "package org.jeecg.modules.system.vo.thirdapp;\n\nimport com.jeecg.dingtalk.api.department.vo.Department;\nimport org.springframework.beans.BeanUtils;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\n\n/**\n * 钉钉树结构的部门\n *\n * @author sunjianlei\n */\npublic class JdtDepartmentTreeVo extends Department {\n\n    private List<JdtDepartmentTreeVo> children;\n\n    public List<JdtDepartmentTreeVo> getChildren() {\n        return children;\n    }\n\n    public JdtDepartmentTreeVo setChildren(List<JdtDepartmentTreeVo> children) {\n        this.children = children;\n        return this;\n    }\n\n    public JdtDepartmentTreeVo(Department department) {\n        BeanUtils.copyProperties(department, this);\n    }\n\n    /**\n     * 是否有子项\n     */\n    public boolean hasChildren() {\n        return children != null && children.size() > 0;\n    }\n\n    @Override\n    public String toString() {\n        return \"JwDepartmentTree{\" +\n                \"children=\" + children +\n                \"} \" + super.toString();\n    }\n\n    /**\n     * 静态辅助方法，将list转为tree结构\n     */\n    public static List<JdtDepartmentTreeVo> listToTree(List<Department> allDepartment) {\n        // 先找出所有的父级\n        List<JdtDepartmentTreeVo> treeList = getByParentId(1, allDepartment);\n        Optional<Department> departmentOptional = allDepartment.stream().filter(item -> item.getParent_id() == null).findAny();\n        Department department = new Department();\n        //判断是否找到数据\n        if(departmentOptional.isPresent()){\n            department = departmentOptional.get();\n        }\n        getChildrenRecursion(treeList, allDepartment);\n        // 代码逻辑说明: 【issues/6017】钉钉同步部门时没有最顶层的部门名，同步用户时，用户没有部门信息---\n        JdtDepartmentTreeVo treeVo = new JdtDepartmentTreeVo(department);\n        treeVo.setChildren(treeList);\n        List<JdtDepartmentTreeVo> list = new ArrayList<>();\n        list.add(treeVo);\n        return list;\n    }\n\n    private static List<JdtDepartmentTreeVo> getByParentId(Integer parentId, List<Department> allDepartment) {\n        List<JdtDepartmentTreeVo> list = new ArrayList<>();\n        for (Department department : allDepartment) {\n            if (parentId.equals(department.getParent_id())) {\n                list.add(new JdtDepartmentTreeVo(department));\n            }\n        }\n        return list;\n    }\n\n    private static void getChildrenRecursion(List<JdtDepartmentTreeVo> treeList, List<Department> allDepartment) {\n        for (JdtDepartmentTreeVo departmentTree : treeList) {\n            // 递归寻找子级\n            List<JdtDepartmentTreeVo> children = getByParentId(departmentTree.getDept_id(), allDepartment);\n            if (children.size() > 0) {\n                departmentTree.setChildren(children);\n                getChildrenRecursion(children, allDepartment);\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JwDepartmentTreeVo.java",
    "content": "package org.jeecg.modules.system.vo.thirdapp;\n\nimport com.jeecg.qywx.api.department.vo.Department;\nimport org.springframework.beans.BeanUtils;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\n\n/**\n * 企业微信树结构的部门\n *\n * @author sunjianlei\n */\npublic class JwDepartmentTreeVo extends Department {\n\n    private List<JwDepartmentTreeVo> children;\n\n    public List<JwDepartmentTreeVo> getChildren() {\n        return children;\n    }\n\n    public JwDepartmentTreeVo setChildren(List<JwDepartmentTreeVo> children) {\n        this.children = children;\n        return this;\n    }\n\n    public JwDepartmentTreeVo(Department department) {\n        BeanUtils.copyProperties(department, this);\n    }\n\n    /**\n     * 是否有子项\n     */\n    public boolean hasChildren() {\n        return children != null && children.size() > 0;\n    }\n\n    @Override\n    public String toString() {\n        return \"JwDepartmentTree{\" +\n                \"children=\" + children +\n                \"} \" + super.toString();\n    }\n\n    /**\n     * 静态辅助方法，将list转为tree结构\n     */\n    public static List<JwDepartmentTreeVo> listToTree(List<Department> allDepartment) {\n        // 先找出所有的父级\n        List<JwDepartmentTreeVo> treeList = getByParentId(\"1\", allDepartment);\n        Optional<Department> departmentOptional = allDepartment.stream().filter(item -> \"0\".equals(item.getParentid())).findAny();\n        Department department = new Department();\n        //判断是否找到数据\n        if(departmentOptional.isPresent()){\n            department = departmentOptional.get();\n        }\n        getChildrenRecursion(treeList, allDepartment);\n        // 代码逻辑说明: 【issues/6017】企业微信同步部门时没有最顶层的部门名，同步用户时，用户没有部门信息---\n        JwDepartmentTreeVo treeVo = new JwDepartmentTreeVo(department);\n        treeVo.setChildren(treeList);\n        List<JwDepartmentTreeVo> list = new ArrayList<>();\n        list.add(treeVo);\n        return list;\n    }\n\n    private static List<JwDepartmentTreeVo> getByParentId(String parentId, List<Department> allDepartment) {\n        List<JwDepartmentTreeVo> list = new ArrayList<>();\n        for (Department department : allDepartment) {\n            if (parentId.equals(department.getParentid())) {\n                list.add(new JwDepartmentTreeVo(department));\n            }\n        }\n        return list;\n    }\n\n    private static void getChildrenRecursion(List<JwDepartmentTreeVo> treeList, List<Department> allDepartment) {\n        for (JwDepartmentTreeVo departmentTree : treeList) {\n            // 递归寻找子级\n            List<JwDepartmentTreeVo> children = getByParentId(departmentTree.getId(), allDepartment);\n            if (children.size() > 0) {\n                departmentTree.setChildren(children);\n                getChildrenRecursion(children, allDepartment);\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JwSysUserDepartVo.java",
    "content": "package org.jeecg.modules.system.vo.thirdapp;\n\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * 企业微信的实现类\n */\n@Data\npublic class JwSysUserDepartVo {\n\n    /**\n     * 企业微信和用户的映射类\n     */\n    private List<JwUserDepartVo> jwUserDepartVos;\n\n    /**\n     * 用户列表\n     */\n    private List<JwUserDepartVo> userList;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JwUserDepartVo.java",
    "content": "package org.jeecg.modules.system.vo.thirdapp;\n\nimport lombok.Data;\n\n/**\n* @Description: 企业微信用户同步工具类\n*\n* @author: wangshuai\n* @date: 2023/11/28 18:17\n*/\n@Data\npublic class JwUserDepartVo {\n    \n    /**\n     * 用户id\n     */\n    private String userId;\n\n    /**\n     * 用户头像\n     */\n    private String avatar;\n\n    /**\n     * 真实姓名\n     */\n    private String realName;\n\n    /**\n     * 企业微信的名字\n     */\n    private String wechatRealName;\n\n    /**\n     * 企业微信对应的部门\n     */\n    private String wechatDepartId;\n\n    /**\n     * 企业微信对应的用户id\n     */\n    private String wechatUserId;\n\n    /**\n     * 第三方id\n     */\n    private String thirdId;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/SyncInfoVo.java",
    "content": "package org.jeecg.modules.system.vo.thirdapp;\n\nimport lombok.Data;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * 同步结果信息，包含成功的信息和失败的信息\n *\n * @author sunjianlei\n */\n@Data\npublic class SyncInfoVo {\n\n    /**\n     * 成功的信息\n     */\n    private List<String> successInfo;\n    /**\n     * 失败的信息\n     */\n    private List<String> failInfo;\n\n    public SyncInfoVo() {\n        this.successInfo = new ArrayList<>();\n        this.failInfo = new ArrayList<>();\n    }\n\n    public SyncInfoVo(List<String> successInfo, List<String> failInfo) {\n        this.successInfo = successInfo;\n        this.failInfo = failInfo;\n    }\n\n    public SyncInfoVo addSuccessInfo(String info) {\n        this.successInfo.add(info);\n        return this;\n    }\n\n    public SyncInfoVo addFailInfo(String info) {\n        this.failInfo.add(info);\n        return this;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai",
    "content": "package ${bussiPackage}.${entityPackage}.controller;\n\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport java.io.IOException;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLDecoder;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.jeecg.common.util.oConvertUtils;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\nimport java.util.Date;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport org.springframework.web.servlet.ModelAndView;\nimport com.alibaba.fastjson.JSON;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\n\n /**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Slf4j\n@Tag(name=\"${tableVo.ftlDescription}\")\n@RestController\n@RequestMapping(\"/${entityPackage}/${entityName?uncap_first}\")\npublic class ${entityName}Controller extends JeecgController<${entityName}, I${entityName}Service> {\n\t@Autowired\n\tprivate I${entityName}Service ${entityName?uncap_first}Service;\n\t\n\t/**\n\t * 分页列表查询\n\t *\n\t * @param ${entityName?uncap_first}\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-分页列表查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-分页列表查询\")\n\t@GetMapping(value = \"/list\")\n\tpublic Result<?> queryPageList(${entityName} ${entityName?uncap_first},\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t   HttpServletRequest req) {\n\t\tQueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap());\n\t\tPage<${entityName}> page = new Page<${entityName}>(pageNo, pageSize);\n\t\tIPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper);\n\t\treturn Result.OK(pageList);\n\t}\n\t\n\t/**\n\t * 添加\n\t *\n\t * @param ${entityName?uncap_first}\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-添加\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-添加\")\n\t@PostMapping(value = \"/add\")\n\tpublic Result<?> add(@RequestBody ${entityName} ${entityName?uncap_first}) {\n\t\t${entityName?uncap_first}Service.save(${entityName?uncap_first});\n\t\treturn Result.OK(\"添加成功！\");\n\t}\n\t\n\t/**\n\t * 编辑\n\t *\n\t * @param ${entityName?uncap_first}\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-编辑\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-编辑\")\n\t@RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n\tpublic Result<?> edit(@RequestBody ${entityName} ${entityName?uncap_first}) {\n\t\t${entityName?uncap_first}Service.updateById(${entityName?uncap_first});\n\t\treturn Result.OK(\"编辑成功!\");\n\t}\n\t\n\t/**\n\t * 通过id删除\n\t *\n\t * @param id\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-通过id删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id删除\")\n\t@DeleteMapping(value = \"/delete\")\n\tpublic Result<?> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${entityName?uncap_first}Service.removeById(id);\n\t\treturn Result.OK(\"删除成功!\");\n\t}\n\t\n\t/**\n\t * 批量删除\n\t *\n\t * @param ids\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-批量删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-批量删除\")\n\t@DeleteMapping(value = \"/deleteBatch\")\n\tpublic Result<?> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tthis.${entityName?uncap_first}Service.removeByIds(Arrays.asList(ids.split(\",\")));\n\t\treturn Result.OK(\"批量删除成功！\");\n\t}\n\t\n\t/**\n\t * 通过id查询\n\t *\n\t * @param id\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-通过id查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id查询\")\n\t@GetMapping(value = \"/queryById\")\n\tpublic Result<?> queryById(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${entityName} ${entityName?uncap_first} = ${entityName?uncap_first}Service.getById(id);\n\t\treturn Result.OK(${entityName?uncap_first});\n\t}\n\n  /**\n   * 导出excel\n   *\n   * @param request\n   * @param ${entityName?uncap_first}\n   */\n  @RequestMapping(value = \"/exportXls\")\n  public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) {\n      return super.exportXls(request, ${entityName?uncap_first}, ${entityName}.class, \"${tableVo.ftlDescription}\");\n  }\n\n  /**\n   * 通过excel导入数据\n   *\n   * @param request\n   * @param response\n   * @return\n   */\n  @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n  public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n      return super.importExcel(request, response, ${entityName}.class);\n  }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai",
    "content": "package ${bussiPackage}.${entityPackage}.entity;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Data\n@TableName(\"${tableName}\")\n@EqualsAndHashCode(callSuper = false)\n@Accessors(chain = true)\n@Schema(description=\"${tableVo.ftlDescription}\")\npublic class ${entityName} {\n    \n    <#list originalColumns as po>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t@TableId(type = IdType.ASSIGN_ID)\n\t<#else>\n  <#if po.fieldType =='java.util.Date'>\n\t<#if po.fieldDbType =='date'>\n\t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t<#elseif po.fieldDbType =='datetime'>\n\t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n\t<#else>\n\t@Excel(name = \"${po.filedComment}\", width = 15)\n  </#if>\n  </#if>\n    @Schema(description = \"${po.filedComment}\")\n\tprivate <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType}</#if> ${po.fieldName};\n\t</#list>\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai",
    "content": "package ${bussiPackage}.${entityPackage}.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface ${entityName}Mapper extends BaseMapper<${entityName}> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service;\n\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface I${entityName}Service extends IService<${entityName}> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service.impl;\n\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport ${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper;\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\nimport org.springframework.stereotype.Service;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Service\npublic class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/uniapp/${entityName}Form.vuei",
    "content": "<template>\n    <view>\n        <!--标题和返回-->\n\t\t<cu-custom :bgColor=\"NavBarColor\" isBack :backRouterName=\"backRouteName\">\n\t\t\t<block slot=\"backText\">返回</block>\n\t\t\t<block slot=\"content\">${tableVo.ftlDescription}</block>\n\t\t</cu-custom>\n\t\t <!--表单区域-->\n\t\t<view>\n\t\t\t<form>\n    <#list columns as po><#rt/>\n    <#if po.fieldName !='id'><#rt/>\n         <#if po.fieldType =='date'>\n              <my-date label=\"${po.filedComment}：\" fields=\"day\" v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\"></my-date>\n         <#elseif po.fieldType =='datetime'>\n              <my-date label=\"${po.filedComment}：\" v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\"></my-date>\n         <#else>\n              <view class=\"cu-form-group\">\n                <view class=\"flex align-center\">\n                  <view class=\"title\"><text space=\"ensp\">${po.filedComment}：</text></view>\n                  <input <#if \"int,decimal,double,\"?contains(po.fieldType)>type=\"number\"</#if> placeholder=\"请输入${po.filedComment}\" v-model=\"model.${po.fieldName}\"/>\n                </view>\n              </view>\n        </#if>\n    </#if>\n    </#list>\n\t\t\t\t<view class=\"padding\">\n\t\t\t\t\t<button class=\"cu-btn block bg-blue margin-tb-sm lg\" @click=\"onSubmit\">\n\t\t\t\t\t\t<text v-if=\"loading\" class=\"cuIcon-loading2 cuIconfont-spin\"></text>提交\n\t\t\t\t\t</button>\n\t\t\t\t</view>\n\t\t\t</form>\n\t\t</view>\n    </view>\n</template>\n\n<script>\n    import myDate from '@/components/my-componets/my-date.vue'\n\n    export default {\n        name: \"${entityName}Form\",\n        components:{myDate},\n        props:{\n          formData:{\n              type:Object,\n              default:() => ({}),\n              required:false\n          }\n        },\n        data(){\n            return {\n\t\t\t\tCustomBar: this.CustomBar,\n\t\t\t\tNavBarColor: this.NavBarColor,\n\t\t\t\tloading:false,\n                model: {},\n                backRouteName:'index',\n                url: {\n                  queryById: \"/${entityPackage}/${entityName?uncap_first}/queryById\",\n                  add: \"/${entityPackage}/${entityName?uncap_first}/add\",\n                  edit: \"/${entityPackage}/${entityName?uncap_first}/edit\",\n                },\n            }\n        },\n        created(){\n             this.initFormData();\n        },\n        methods:{\n           initFormData(){\n               if(this.formData){\n                    let dataId = this.formData.dataId;\n                    this.$http.get(this.url.queryById,{params:{id:dataId}}).then((res)=>{\n                        if(res.data.success){\n                            console.log(\"表单数据\",res);\n                            this.model = res.data.result;\n                        }\n                    })\n                }\n            },\n            onSubmit() {\n                let myForm = {...this.model};\n                this.loading = true;\n                let url = myForm.id?this.url.edit:this.url.add;\n\t\t\t\tthis.$http.post(url,myForm).then(res=>{\n\t\t\t\t   console.log(\"res\",res)\n\t\t\t\t   this.loading = false\n\t\t\t\t   this.$Router.push({name:this.backRouteName})\n\t\t\t\t}).catch(()=>{\n\t\t\t\t\tthis.loading = false\n\t\t\t\t});\n            }\n        }\n    }\n</script>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/uniapp/${entityName}List.vuei",
    "content": "<template>\n\t<view>\n\t   <!--标题和返回-->\n\t\t<cu-custom :bgColor=\"NavBarColor\" isBack>\n\t\t\t<block slot=\"backText\">返回</block>\n\t\t\t<block slot=\"content\">${tableVo.ftlDescription}</block>\n\t\t</cu-custom>\n\t\t<!--滚动加载列表-->\n\t\t<mescroll-body ref=\"mescrollRef\" bottom=\"88\"  @init=\"mescrollInit\" :up=\"upOption\" :down=\"downOption\" @down=\"downCallback\" @up=\"upCallback\">\n\t\t    <view class=\"cu-list menu\">\n\t\t\t\t<view class=\"cu-item\" v-for=\"(item,index) in list\" :key=\"index\" @click=\"goHome\">\n\t\t\t\t\t<view class=\"flex\" style=\"width:100%\">\n                        <text class=\"text-lg\" style=\"color: #000;\">\n                             {{ item.createBy}}\n                        </text>\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t</mescroll-body>\n\t</view>\n</template>\n\n<script>\n\timport MescrollMixin from \"@/components/mescroll-uni/mescroll-mixins.js\";\n\timport Mixin from \"@/common/mixin/Mixin.js\";\n\n\texport default {\n\t\tname: '${tableVo.ftlDescription}',\n\t\tmixins: [MescrollMixin,Mixin],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tCustomBar:this.CustomBar,\n\t\t\t\tNavBarColor:this.NavBarColor,\n\t\t\t\turl: \"/${entityPackage}/${entityName?uncap_first}/list\",\n\t\t\t};\n\t\t},\n\t\tmethods: {\n\t\t\tgoHome(){\n                this.$Router.push({name: \"index\"})\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei",
    "content": "<template>\n  <a-card :bordered=\"false\">\n\n    <!-- 查询区域 -->\n    <div class=\"table-page-search-wrapper\">\n      <a-form layout=\"inline\" @keyup.enter.native=\"searchQuery\">\n        <a-row :gutter=\"24\">\n\n<#list columns as po>\n<#if po.fieldName !='id' && po_index<= tableVo.searchFieldNum>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <a-form-item label=\"${po.filedComment}\">\n              <a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n            </a-form-item>\n          </a-col>\n<#elseif po_index == 2>\n        <template v-if=\"toggleSearchStatus\">\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <a-form-item label=\"${po.filedComment}\">\n              <a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n            </a-form-item>\n          </a-col>\n<#elseif po.fieldName !='id' && po_index< 5>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <a-form-item label=\"${po.filedComment}\">\n              <a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n            </a-form-item>\n          </a-col>\n<#else>\n</#if>\n</#list>\n        <#if (columns?size>1) >\n          </template>\n        </#if>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left;overflow: hidden;\" class=\"table-page-search-submitButtons\">\n              <a-button type=\"primary\" @click=\"searchQuery\" icon=\"search\">查询</a-button>\n              <a-button type=\"primary\" @click=\"searchReset\" icon=\"reload\" style=\"margin-left: 8px\">重置</a-button>\n              <a @click=\"handleToggleSearch\" style=\"margin-left: 8px\">\n                {{ toggleSearchStatus ? '收起' : '展开' }}\n                <a-icon :type=\"toggleSearchStatus ? 'up' : 'down'\"/>\n              </a>\n            </span>\n          </a-col>\n\n        </a-row>\n      </a-form>\n    </div>\n\n    <!-- 操作按钮区域 -->\n    <div class=\"table-operator\">\n      <a-button @click=\"handleAdd\" type=\"primary\" icon=\"plus\">新增</a-button>\n      <a-button type=\"primary\" icon=\"download\" @click=\"handleExportXls('${tableVo.ftlDescription}')\">导出</a-button>\n      <a-upload name=\"file\" :showUploadList=\"false\" :multiple=\"false\" :headers=\"tokenHeader\" :action=\"importExcelUrl\" @change=\"handleImportExcel\">\n        <a-button type=\"primary\" icon=\"import\">导入</a-button>\n      </a-upload>\n      <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n        <a-menu slot=\"overlay\">\n          <a-menu-item key=\"1\" @click=\"batchDel\"><a-icon type=\"delete\"/>删除</a-menu-item>\n        </a-menu>\n        <a-button style=\"margin-left: 8px\"> 批量操作 <a-icon type=\"down\" /></a-button>\n      </a-dropdown>\n    </div>\n\n    <!-- table区域-begin -->\n    <div>\n      <div class=\"ant-alert ant-alert-info\" style=\"margin-bottom: 16px;\">\n        <i class=\"anticon anticon-info-circle ant-alert-icon\"></i> 已选择 <a style=\"font-weight: 600\">{{ selectedRowKeys.length }}</a>项\n        <a style=\"margin-left: 24px\" @click=\"onClearSelected\">清空</a>\n      </div>\n\n      <a-table\n        ref=\"table\"\n        size=\"middle\"\n        bordered\n        rowKey=\"id\"\n        :columns=\"columns\"\n        :dataSource=\"dataSource\"\n        :pagination=\"ipagination\"\n        :loading=\"loading\"\n        class=\"j-table-force-nowrap\"\n        :rowSelection=\"{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}\"\n        @change=\"handleTableChange\">\n\n        <span slot=\"action\" slot-scope=\"text, record\">\n          <a @click=\"handleEdit(record)\">编辑</a>\n\n          <a-divider type=\"vertical\" />\n          <a-dropdown>\n            <a class=\"ant-dropdown-link\">更多 <a-icon type=\"down\" /></a>\n            <a-menu slot=\"overlay\">\n              <a-menu-item>\n                <a-popconfirm title=\"确定删除吗?\" @confirm=\"() => handleDelete(record.id)\">\n                  <a>删除</a>\n                </a-popconfirm>\n              </a-menu-item>\n            </a-menu>\n          </a-dropdown>\n        </span>\n\n      </a-table>\n    </div>\n    <!-- table区域-end -->\n\n    <!-- 表单区域 -->\n    <${entityName?uncap_first}-modal ref=\"modalForm\" @ok=\"modalFormOk\"></${entityName?uncap_first}-modal>\n  </a-card>\n</template>\n\n<script>\n  import '@/assets/less/TableExpand.less'\n  import ${entityName}Modal from './modules/${entityName}Modal'\n  import { JeecgListMixin } from '@/mixins/JeecgListMixin'\n\n  export default {\n    name: \"${entityName}List\",\n    mixins:[JeecgListMixin],\n    components: {\n      ${entityName}Modal\n    },\n    data () {\n      return {\n        description: '${tableVo.ftlDescription}管理页面',\n        // 表头\n        columns: [\n          {\n            title: '#',\n            dataIndex: '',\n            key:'rowIndex',\n            width:60,\n            align:\"center\",\n            customRender:function (t,r,index) {\n              return parseInt(index)+1;\n            }\n           },\n          <#list columns as po>\n           <#if po.fieldName !='id'>\n\t\t   {\n            title: '${po.filedComment}',\n            align:\"center\",\n            dataIndex: '${po.fieldName}'\n           },\n\t\t   </#if>\n\t\t  </#list>\n          {\n            title: '操作',\n            dataIndex: 'action',\n            align:\"center\",\n            scopedSlots: { customRender: 'action' },\n          }\n        ],\n\t\turl: {\n          list: \"/${entityPackage}/${entityName?uncap_first}/list\",\n          delete: \"/${entityPackage}/${entityName?uncap_first}/delete\",\n          deleteBatch: \"/${entityPackage}/${entityName?uncap_first}/deleteBatch\",\n          exportXlsUrl: \"${entityPackage}/${entityName?uncap_first}/exportXls\",\n          importExcelUrl: \"${entityPackage}/${entityName?uncap_first}/importExcel\",\n       },\n    }\n  },\n  computed: {\n    importExcelUrl: function(){\n      <#noparse>return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;</#noparse>\n    }\n  },\n    methods: {\n     \n    }\n  }\n</script>\n<style scoped>\n  @import '~@assets/less/common.less';\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei",
    "content": "<template>\n  <j-modal\n    :title=\"title\"\n    :width=\"800\"\n    :visible=\"visible\"\n    :confirmLoading=\"confirmLoading\"\n    switchFullscreen\n    @ok=\"handleOk\"\n    @cancel=\"handleCancel\"\n    cancelText=\"关闭\">\n    \n    <a-spin :spinning=\"confirmLoading\">\n      <a-form-model ref=\"form\" :model=\"model\" :rules=\"validatorRules\">\n      \n<#list columns as po><#rt/>\n<#if po.fieldName !='id'><#rt/>\n        <a-form-model-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" prop=\"${po.fieldName}\" label=\"${po.filedComment}\">\n          <#if po.fieldType =='date'>\n          <a-date-picker v-model=\"model.${po.fieldName}\"/>\n          <#elseif po.fieldType =='datetime'>\n          <a-date-picker showTime valueFormat='YYYY-MM-DD HH:mm:ss' v-model=\"model.${po.fieldName}\" />\n          <#elseif \"int,decimal,double,\"?contains(po.fieldType)>\n          <a-input-number v-model=\"model.${po.fieldName}\"/>\n          <#else>\n          <a-input placeholder=\"请输入${po.filedComment}\" v-model=\"model.${po.fieldName}\" />\n          </#if>\n        </a-form-model-item>\n</#if>\n</#list>\n\t\t\n      </a-form-model>\n    </a-spin>\n  </j-modal>\n</template>\n\n<script>\n  import { httpAction } from '@/api/manage'\n  import moment from \"moment\"\n\n  export default {\n    name: \"${entityName}Modal\",\n    data () {\n      return {\n        title:\"操作\",\n        visible: false,\n        model: {},\n        labelCol: {\n          xs: { span: 24 },\n          sm: { span: 5 },\n        },\n        wrapperCol: {\n          xs: { span: 24 },\n          sm: { span: 16 },\n        },\n\n        confirmLoading: false,\n        validatorRules:{\n        <#list columns as po>\n        <#if po.fieldName !='id'>\n        <#if po.nullable =='N'>\n        ${po.fieldName}:[{ required: true, message: '请输入${po.filedComment}!' }],\n        </#if>\n        </#if>\n\t    </#list>\n        },\n        url: {\n          add: \"/${entityPackage}/${entityName?uncap_first}/add\",\n          edit: \"/${entityPackage}/${entityName?uncap_first}/edit\",\n        },\n      }\n    },\n    created () {\n    },\n    methods: {\n      add () {\n        //初始化默认值\n        this.edit({});\n      },\n      edit (record) {\n        this.model = Object.assign({}, record);\n        this.visible = true;\n      },\n      close () {\n        this.$emit('close');\n        this.visible = false;\n        this.$refs.form.clearValidate();\n      },\n      handleOk () {\n        const that = this;\n        // 触发表单验证\n         this.$refs.form.validate(valid => {\n          if (valid) {\n            that.confirmLoading = true;\n            let httpurl = '';\n            let method = '';\n            if(!this.model.id){\n              httpurl+=this.url.add;\n              method = 'post';\n            }else{\n              httpurl+=this.url.edit;\n               method = 'put';\n            }\n            httpAction(httpurl,this.model,method).then((res)=>{\n              if(res.success){\n                that.$message.success(res.message);\n                that.$emit('ok');\n              }else{\n                that.$message.warning(res.message);\n              }\n            }).finally(() => {\n              that.confirmLoading = false;\n              that.close();\n            })\n          }else{\n             return false;\n          }\n        })\n      },\n      handleCancel () {\n        this.close()\n      },\n\n\n    }\n  }\n</script>\n\n<style lang=\"less\" scoped>\n\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal__Style#Drawer.vuei",
    "content": "<template>\n  <a-drawer\n      :title=\"title\"\n      :width=\"800\"\n      placement=\"right\"\n      :closable=\"false\"\n      @close=\"close\"\n      :visible=\"visible\">\n\n    <a-spin :spinning=\"confirmLoading\">\n      <a-form-model ref=\"form\" :model=\"model\" :rules=\"validatorRules\">\n      \n<#list columns as po><#rt/>\n<#if po.fieldName !='id'><#rt/>\n        <a-form-model-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" prop=\"${po.fieldName}\" label=\"${po.filedComment}\">\n          <#if po.fieldType =='date'>\n          <a-date-picker v-model=\"model.${po.fieldName}\" />\n          <#elseif po.fieldType =='datetime'>\n          <a-date-picker showTime valueFormat='YYYY-MM-DD HH:mm:ss' v-model=\"model.${po.fieldName}\" />\n          <#elseif \"int,decimal,double,\"?contains(po.fieldType)>\n          <a-input-number v-model=\"model.${po.fieldName}\" />\n          <#else>\n          <a-input placeholder=\"请输入${po.filedComment}\" v-model=\"model.${po.fieldName}\" />\n          </#if>\n        </a-form-model-item>\n</#if>\n</#list>\n\t\t\n      </a-form-model>\n    </a-spin>\n\n    <div class=\"drawer-bootom-button\">\n      <a-button type=\"primary\" @click=\"handleOk\">确定</a-button>\n      <a-button type=\"primary\" @click=\"handleCancel\">取消</a-button>\n    </div>\n  </a-drawer>\n</template>\n\n<script>\n  import { httpAction } from '@/api/manage'\n  import moment from \"moment\"\n\n  export default {\n    name: \"${entityName}Modal\",\n    data () {\n      return {\n        title:\"操作\",\n        visible: false,\n        model: {},\n        labelCol: {\n          xs: { span: 24 },\n          sm: { span: 5 },\n        },\n        wrapperCol: {\n          xs: { span: 24 },\n          sm: { span: 16 },\n        },\n\n        confirmLoading: false,\n        validatorRules:{\n        <#list columns as po>\n        <#if po.fieldName !='id'>\n        <#if po.nullable =='N'>\n        ${po.fieldName}:[{ required: true, message: '请输入${po.filedComment}!' }],\n        </#if>\n        </#if>\n\t    </#list>\n        },\n        url: {\n          add: \"/${entityPackage}/${entityName?uncap_first}/add\",\n          edit: \"/${entityPackage}/${entityName?uncap_first}/edit\",\n        },\n      }\n    },\n    created () {\n    },\n    methods: {\n      add () {\n        //初始化默认值\n        this.edit({});\n      },\n      edit (record) {\n        this.model = Object.assign({}, record);\n        this.visible = true;\n      },\n      close () {\n        this.$emit('close');\n        this.visible = false;\n        this.$refs.form.clearValidate();\n      },\n      handleOk () {\n        const that = this;\n        // 触发表单验证\n        this.$refs.form.validate(valid => {\n          if (valid) {\n            that.confirmLoading = true;\n            let httpurl = '';\n            let method = '';\n            if(!this.model.id){\n              httpurl+=this.url.add;\n              method = 'post';\n            }else{\n              httpurl+=this.url.edit;\n               method = 'put';\n            }\n            httpAction(httpurl,this.model,method).then((res)=>{\n              if(res.success){\n                that.$message.success(res.message);\n                that.$emit('ok');\n              }else{\n                that.$message.warning(res.message);\n              }\n            }).finally(() => {\n              that.confirmLoading = false;\n              that.close();\n            })\n          }else{\n            return false;\n         }\n        })\n      },\n      handleCancel () {\n        this.close()\n      },\n\n\n    }\n  }\n</script>\n\n<style lang=\"less\" scoped>\n  /**Button按钮间距*/\n  .ant-btn {\n    margin-left: 30px;\n    margin-bottom: 30px;\n    float: right;\n  }\n /**抽屉按钮样式*/\n  .drawer-bootom-button {\n    position: absolute;\n    bottom: -8px;\n    width: 100%;\n    border-top: 1px solid #e8e8e8;\n    padding: 10px 16px;\n    text-align: right;\n    left: 0;\n    background: #fff;\n    border-radius: 0 0 2px 2px;\n  }\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei",
    "content": "<template>\n  <div>\n    <!--引用表格-->\n   <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n     <!--插槽:table标题-->\n          <template #tableTitle>\n             <a-button type=\"primary\" @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\"> 新增</a-button>\n             <a-button  type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n             <j-upload-button  type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n             <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n                 <template #overlay>\n                    <a-menu>\n                      <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                        <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                        删除\n                      </a-menu-item>\n                    </a-menu>\n                  </template>\n                  <a-button>批量操作\n                    <Icon icon=\"mdi:chevron-down\"></Icon>\n                  </a-button>\n            </a-dropdown>\n          </template>\n       <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\"/>\n      </template>\n    </BasicTable>\n\n    <!-- 表单区域 -->\n    <${entityName}Modal @register=\"registerModal\" @success=\"handleSuccess\"></${entityName}Modal>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"${entityPackage}-${entityName?uncap_first}\" setup>\n  import {ref, computed, unref} from 'vue';\n  import {BasicTable, useTable, TableAction} from '/@/components/Table';\n  import {useModal} from '/@/components/Modal';\n  import { useListPage } from '/@/hooks/system/useListPage'\n  import ${entityName}Modal from './modules/${entityName}Modal.vue'\n  import {columns, searchFormSchema} from './${entityName}.data';\n  import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './${entityName}.api';\n\n  //注册model\n  const [registerModal, {openModal}] = useModal();\n  //注册table数据\n  const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({\n       tableProps:{\n            title: '${tableVo.ftlDescription}',\n            api: list,\n            columns,\n            canResize:true,\n            formConfig: {\n               labelWidth: 120,\n               schemas: searchFormSchema,\n               autoSubmitOnEnter:true,\n               showAdvancedButton:true,\n             },\n            actionColumn: {\n                width: 120,\n             },\n        },\n        exportConfig: {\n             name:\"${tableVo.ftlDescription}\",\n             url: getExportUrl,\n           },\n           importConfig: {\n             url: getImportUrl\n           },\n   })\n\n   const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext\n\n   /**\n    * 新增事件\n    */\n   function handleAdd() {\n     openModal(true, {\n       isUpdate: false,\n       showFooter: true,\n     });\n   }\n   /**\n    * 编辑事件\n    */\n  function handleEdit(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: true,\n     });\n   }\n   /**\n    * 详情\n   */\n  function handleDetail(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: false,\n     });\n   }\n   /**\n    * 删除事件\n    */\n   async function handleDelete(record) {\n     await deleteOne({id: record.id}, reload);\n   }\n   /**\n    * 批量删除事件\n    */\n   async function batchHandleDelete() {\n     await batchDelete({ids: selectedRowKeys.value}, reload);\n   }\n   /**\n    * 成功回调\n    */\n   function handleSuccess({isUpdate, values}) {\n      reload();\n   }\n   /**\n      * 操作栏\n      */\n   function getTableAction(record){\n       return [\n         {\n           label: '编辑',\n           onClick: handleEdit.bind(null, record),\n         }\n       ]\n     }\n     /**\n       * 下拉操作栏\n       */\n    function getDropDownAction(record){\n      return [\n           {\n             label: '详情',\n             onClick: handleDetail.bind(null, record),\n           }, {\n             label: '删除',\n             popConfirm: {\n               title: '是否确认删除',\n               confirm: handleDelete.bind(null, record),\n             }\n           }\n      ]\n    }\n</script>\n<style scoped>\n\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi",
    "content": "import {defHttp} from '/@/utils/http/axios';\nimport {Modal} from 'ant-design-vue';\n\nenum Api {\n  list = '/${entityPackage}/${entityName?uncap_first}/list',\n  save='/${entityPackage}/${entityName?uncap_first}/add',\n  edit='/${entityPackage}/${entityName?uncap_first}/edit',\n  deleteOne = '/${entityPackage}/${entityName?uncap_first}/delete',\n  deleteBatch = '/${entityPackage}/${entityName?uncap_first}/deleteBatch',\n  importExcel = '/${entityPackage}/${entityName?uncap_first}/importExcel',\n  exportXls = '/${entityPackage}/${entityName?uncap_first}/exportXls',\n}\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) =>\n  defHttp.get({url: Api.list, params});\n\n/**\n * 删除单个\n * @param params\n * @param handleSuccess\n */\nexport const deleteOne = (params,handleSuccess) => {\n  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n/**\n * 批量删除\n * @param params\n * @param handleSuccess\n */\nexport const batchDelete = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n/**\n * 保存或者更新\n * @param params\n * @param isUpdate 是否是更新数据\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({url: url, params});\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi",
    "content": "import {BasicColumn} from '/@/components/Table';\nimport {FormSchema} from '/@/components/Table';\nimport { rules} from '/@/utils/helper/validator';\nimport { render } from '/@/utils/common/renderUtils';\n\nexport const columns: BasicColumn[] = [\n <#list columns as po>\n   <#if po.fieldName !='id'>\n   {\n    title: '${po.filedComment}',\n    dataIndex: '${po.fieldName}'\n   },\n   </#if>\n </#list>\n];\n\nexport const searchFormSchema: FormSchema[] = [\n<#list columns as po>\n<#if po.fieldName !='id' && po_index<= tableVo.searchFieldNum>\n {\n    label: '${po.filedComment}',\n    field: '${po.fieldName}',\n     <#if po.fieldType =='date'>\n    component: 'DatePicker'\n     <#elseif po.fieldType =='datetime'>\n    component: 'TimePicker'\n     <#elseif \"int,decimal,double,\"?contains(po.fieldType)>\n    component: 'InputNumber'\n     <#else>\n    component: 'Input'\n    </#if>\n  },\n</#if>\n</#list>\n];\n\nexport const formSchema: FormSchema[] = [\n  // TODO 主键隐藏字段，目前写死为ID\n  {label: '', field: 'id', component: 'Input', show: false},\n<#list columns as po><#rt/>\n  {\n    label: '${po.filedComment}',\n    field: '${po.fieldName}',\n     <#if po.fieldType =='date'>\n    component: 'DatePicker'\n     <#elseif po.fieldType =='datetime'>\n    component: 'DatePicker',\n    componentProps: {\n      showTime: true,\n      valueFormat: 'YYYY-MM-DD hh:mm:ss',\n    },\n     <#elseif \"int,decimal,double,\"?contains(po.fieldType)>\n    component: 'InputNumber',\n     <#else>\n    component: 'Input',\n    </#if>\n    <#if po.fieldName =='id'><#rt/>\n    show:false,\n    </#if>\n  },\n</#list>\n];\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue3/modules/${entityName}Modal.vuei",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"title\" @ok=\"handleSubmit\" width=\"40%\">\n         <BasicForm @register=\"registerForm\"/>\n     </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n    import {ref, computed, unref} from 'vue';\n    import {BasicModal, useModalInner} from '/@/components/Modal';\n    import {BasicForm, useForm} from '/@/components/Form/index';\n    import {formSchema} from '../${entityName}.data';\n    import {saveOrUpdate} from '../${entityName}.api';\n    // Emits声明\n    const emit = defineEmits(['register','success']);\n    const isUpdate = ref(true);\n    //表单配置\n    const [registerForm, {resetFields, setFieldsValue, validate}] = useForm({\n        labelWidth: 150,\n        schemas: formSchema,\n        showActionButtonGroup: false,\n    });\n    //表单赋值\n    const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {\n        //重置表单\n        await resetFields();\n        setModalProps({confirmLoading: false,showCancelBtn:data?.showFooter,showOkBtn:data?.showFooter});\n        isUpdate.value = !!data?.isUpdate;\n        if (unref(isUpdate)) {\n            //表单赋值\n            await setFieldsValue({\n                ...data.record,\n            });\n        }\n    });\n    //设置标题\n    const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));\n    //表单提交事件\n    async function handleSubmit(v) {\n        try {\n            let values = await validate();\n            setModalProps({confirmLoading: true});\n            //提交表单\n            await saveOrUpdate(values, isUpdate.value);\n            //关闭弹窗\n            closeModal();\n            //刷新列表\n            emit('success', {isUpdate: isUpdate.value, values});\n        } finally {\n            setModalProps({confirmLoading: false});\n        }\n    }\n</script>\n\n<style lang=\"less\" scoped>\n\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/controller/${entityPackage}/${entityName}Controller.javai",
    "content": "package ${bussiPackage}.controller.${entityPackage};\n\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport java.io.IOException;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLDecoder;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\n\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.util.oConvertUtils;\nimport ${bussiPackage}.entity.${entityPackage}.${entityName};\nimport ${bussiPackage}.service.${entityPackage}.I${entityName}Service;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\n\nimport lombok.extern.slf4j.Slf4j;\n\nimport com.alibaba.fastjson.JSON;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport org.jeecg.common.aspect.annotation.AutoLog;\n\n /**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Tag(name=\"${tableVo.ftlDescription}\")\n@RestController\n@RequestMapping(\"/${entityPackage}/${entityName?uncap_first}\")\n@Slf4j\npublic class ${entityName}Controller extends JeecgController<${entityName}, I${entityName}Service> {\n\t@Autowired\n\tprivate I${entityName}Service ${entityName?uncap_first}Service;\n\t\n\t/**\n\t * 分页列表查询\n\t *\n\t * @param ${entityName?uncap_first}\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-分页列表查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-分页列表查询\")\n\t@GetMapping(value = \"/list\")\n\tpublic Result<?> queryPageList(${entityName} ${entityName?uncap_first},\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t       @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t   HttpServletRequest req) {\n\t\tQueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap());\n\t\tPage<${entityName}> page = new Page<${entityName}>(pageNo, pageSize);\n\t\tIPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper);\n\t\treturn Result.OK(pageList);\n\n\t}\n\t\n\t/**\n\t *   添加\n\t * @param ${entityName?uncap_first}\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-添加\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-添加\")\n\t@PostMapping(value = \"/add\")\n\tpublic Result<?> add(@RequestBody ${entityName} ${entityName?uncap_first}) {\n\t\t${entityName?uncap_first}Service.save(${entityName?uncap_first});\n\t\treturn Result.OK(\"添加成功！\");\n\t}\n\t\n\t/**\n\t *  编辑\n\t *\n\t * @param ${entityName?uncap_first}\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-编辑\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-编辑\")\n\t@RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n\tpublic Result<?> edit(@RequestBody ${entityName} ${entityName?uncap_first}) {\n\t\t${entityName?uncap_first}Service.updateById(${entityName?uncap_first});\n\t\treturn Result.OK(\"编辑成功!\");\n\t}\n\t\n\t/**\n\t *  通过id删除\n\t * @param id\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-通过id删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id删除\")\n\t@DeleteMapping(value = \"/delete\")\n\tpublic Result<?> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${entityName?uncap_first}Service.removeById(id);\n\t\treturn Result.OK(\"删除成功!\");\n\t}\n\t\n\t/**\n\t *  批量删除\n\t *\n\t * @param ids\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-批量删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-批量删除\")\n\t@DeleteMapping(value = \"/deleteBatch\")\n\tpublic Result<?> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tthis.${entityName?uncap_first}Service.removeByIds(Arrays.asList(ids.split(\",\")));\n\t\treturn Result.OK(\"批量删除成功！\");\n\t}\n\t\n\t/**\n\t * 通过id查询\n     *\n\t * @param id\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-通过id查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id查询\")\n\t@GetMapping(value = \"/queryById\")\n\tpublic Result<?> queryById(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${entityName} ${entityName?uncap_first} = ${entityName?uncap_first}Service.getById(id);\n\t\treturn Result.OK(${entityName?uncap_first});\n\t}\n\n\t/**\n     * 导出excel\n     *\n     * @param request\n     * @param ${entityName?uncap_first}\n     */\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) {\n        return super.exportXls(request, ${entityName?uncap_first}, ${entityName}.class, \"${tableVo.ftlDescription}\");\n    }\n\n    /**\n     * 通过excel导入数据\n     *\n     * @param request\n     * @param response\n     * @return\n     */\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n        return super.importExcel(request, response, ${entityName}.class);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/entity/${entityPackage}/${entityName}.javai",
    "content": "package ${bussiPackage}.entity.${entityPackage};\n\nimport java.io.Serializable;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport lombok.Data;\nimport java.util.Date;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport io.swagger.v3.oas.annotations.media.Schema;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Data\n@TableName(\"${tableName}\")\n@Schema(description=\"${tableVo.ftlDescription}\")\npublic class ${entityName} implements Serializable {\n    private static final long serialVersionUID = 1L;\n    \n    <#list originalColumns as po>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t@TableId(type = IdType.ASSIGN_ID)\n\t<#else>\n    <#if po.fieldType =='java.util.Date'>\n      <#if po.fieldDbType =='date'>\n    @Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n    @JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n      <#elseif po.fieldDbType =='datetime'>\n    @Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n    @JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n      </#if>\n    <#else>\n    @Excel(name = \"${po.filedComment}\", width = 15)\n    </#if>\n  </#if>\n\t@Schema(description = \"${po.filedComment}\")\n\tprivate <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType}</#if> ${po.fieldName};\n\t</#list>\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/mapper/${entityPackage}/${entityName}Mapper.javai",
    "content": "package ${bussiPackage}.mapper.${entityPackage};\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport ${bussiPackage}.entity.${entityPackage}.${entityName};\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface ${entityName}Mapper extends BaseMapper<${entityName}> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/mapper/${entityPackage}/xml/${entityName}Mapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"${bussiPackage}.mapper.${entityPackage}.${entityName}Mapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/service/${entityPackage}/I${entityName}Service.javai",
    "content": "package ${bussiPackage}.service.${entityPackage};\n\nimport ${bussiPackage}.entity.${entityPackage}.${entityName};\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface I${entityName}Service extends IService<${entityName}> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/service/${entityPackage}/impl/${entityName}ServiceImpl.javai",
    "content": "package ${bussiPackage}.service.${entityPackage}.impl;\n\nimport ${bussiPackage}.entity.${entityPackage}.${entityName};\nimport ${bussiPackage}.mapper.${entityPackage}.${entityName}Mapper;\nimport ${bussiPackage}.service.${entityPackage}.I${entityName}Service;\nimport org.springframework.stereotype.Service;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Service\npublic class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/${entityName}List.vuei",
    "content": "<template>\n  <a-card :bordered=\"false\">\n\n    <!-- 查询区域 -->\n    <div class=\"table-page-search-wrapper\">\n      <a-form layout=\"inline\" @keyup.enter.native=\"searchQuery\">\n        <a-row :gutter=\"24\">\n\n<#list columns as po>\n<#if po.fieldName !='id' && po_index<= tableVo.searchFieldNum>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <a-form-item label=\"${po.filedComment}\">\n              <a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n            </a-form-item>\n          </a-col>\n<#elseif po_index == 2>\n        <template v-if=\"toggleSearchStatus\">\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <a-form-item label=\"${po.filedComment}\">\n              <a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n            </a-form-item>\n          </a-col>\n<#elseif po.fieldName !='id' && po_index< 5>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <a-form-item label=\"${po.filedComment}\">\n              <a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n            </a-form-item>\n          </a-col>\n<#else>\n</#if>\n</#list>\n        <#if (columns?size>1) >\n          </template>\n        </#if>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left;overflow: hidden;\" class=\"table-page-search-submitButtons\">\n              <a-button type=\"primary\" @click=\"searchQuery\" icon=\"search\">查询</a-button>\n              <a-button type=\"primary\" @click=\"searchReset\" icon=\"reload\" style=\"margin-left: 8px\">重置</a-button>\n              <a @click=\"handleToggleSearch\" style=\"margin-left: 8px\">\n                {{ toggleSearchStatus ? '收起' : '展开' }}\n                <a-icon :type=\"toggleSearchStatus ? 'up' : 'down'\"/>\n              </a>\n            </span>\n          </a-col>\n\n        </a-row>\n      </a-form>\n    </div>\n\n    <!-- 操作按钮区域 -->\n    <div class=\"table-operator\">\n      <a-button @click=\"handleAdd\" type=\"primary\" icon=\"plus\">新增</a-button>\n      <a-button type=\"primary\" icon=\"download\" @click=\"handleExportXls('${tableVo.ftlDescription}')\">导出</a-button>\n      <a-upload name=\"file\" :showUploadList=\"false\" :multiple=\"false\" :headers=\"tokenHeader\" :action=\"importExcelUrl\" @change=\"handleImportExcel\">\n        <a-button type=\"primary\" icon=\"import\">导入</a-button>\n      </a-upload>\n      <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n        <a-menu slot=\"overlay\">\n          <a-menu-item key=\"1\" @click=\"batchDel\"><a-icon type=\"delete\"/>删除</a-menu-item>\n        </a-menu>\n        <a-button style=\"margin-left: 8px\"> 批量操作 <a-icon type=\"down\" /></a-button>\n      </a-dropdown>\n    </div>\n\n    <!-- table区域-begin -->\n    <div>\n      <div class=\"ant-alert ant-alert-info\" style=\"margin-bottom: 16px;\">\n        <i class=\"anticon anticon-info-circle ant-alert-icon\"></i> 已选择 <a style=\"font-weight: 600\">{{ selectedRowKeys.length }}</a>项\n        <a style=\"margin-left: 24px\" @click=\"onClearSelected\">清空</a>\n      </div>\n\n      <a-table\n        ref=\"table\"\n        size=\"middle\"\n        bordered\n        rowKey=\"id\"\n        :columns=\"columns\"\n        :dataSource=\"dataSource\"\n        :pagination=\"ipagination\"\n        :loading=\"loading\"\n        class=\"j-table-force-nowrap\"\n        :rowSelection=\"{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}\"\n        @change=\"handleTableChange\">\n\n        <span slot=\"action\" slot-scope=\"text, record\">\n          <a @click=\"handleEdit(record)\">编辑</a>\n\n          <a-divider type=\"vertical\" />\n          <a-dropdown>\n            <a class=\"ant-dropdown-link\">更多 <a-icon type=\"down\" /></a>\n            <a-menu slot=\"overlay\">\n              <a-menu-item>\n                <a-popconfirm title=\"确定删除吗?\" @confirm=\"() => handleDelete(record.id)\">\n                  <a>删除</a>\n                </a-popconfirm>\n              </a-menu-item>\n            </a-menu>\n          </a-dropdown>\n        </span>\n\n      </a-table>\n    </div>\n    <!-- table区域-end -->\n\n    <!-- 表单区域 -->\n    <${entityName?uncap_first}-modal ref=\"modalForm\" @ok=\"modalFormOk\"></${entityName?uncap_first}-modal>\n  </a-card>\n</template>\n\n<script>\n  import '@/assets/less/TableExpand.less'\n  import ${entityName}Modal from './modules/${entityName}Modal'\n  import { JeecgListMixin } from '@/mixins/JeecgListMixin'\n\n  export default {\n    name: \"${entityName}List\",\n    mixins:[JeecgListMixin],\n    components: {\n      ${entityName}Modal\n    },\n    data () {\n      return {\n        description: '${tableVo.ftlDescription}管理页面',\n        // 表头\n        columns: [\n          {\n            title: '#',\n            dataIndex: '',\n            key:'rowIndex',\n            width:60,\n            align:\"center\",\n            customRender:function (t,r,index) {\n              return parseInt(index)+1;\n            }\n           },\n          <#list columns as po>\n           <#if po.fieldName !='id'>\n\t\t   {\n            title: '${po.filedComment}',\n            align:\"center\",\n            dataIndex: '${po.fieldName}'\n           },\n\t\t   </#if>\n\t\t  </#list>\n          {\n            title: '操作',\n            dataIndex: 'action',\n            align:\"center\",\n            scopedSlots: { customRender: 'action' },\n          }\n        ],\n\t\turl: {\n          list: \"/${entityPackage}/${entityName?uncap_first}/list\",\n          delete: \"/${entityPackage}/${entityName?uncap_first}/delete\",\n          deleteBatch: \"/${entityPackage}/${entityName?uncap_first}/deleteBatch\",\n          exportXlsUrl: \"${entityPackage}/${entityName?uncap_first}/exportXls\",\n          importExcelUrl: \"${entityPackage}/${entityName?uncap_first}/importExcel\",\n       },\n    }\n  },\n  computed: {\n    importExcelUrl: function(){\n      <#noparse>return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;</#noparse>\n    }\n  },\n    methods: {\n\n    }\n  }\n</script>\n<style scoped>\n  @import '~@assets/less/common.less';\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/modules/${entityName}Modal.vuei",
    "content": "<template>\n  <j-modal\n    :title=\"title\"\n    :width=\"800\"\n    :visible=\"visible\"\n    :confirmLoading=\"confirmLoading\"\n    switchFullscreen\n    @ok=\"handleOk\"\n    @cancel=\"handleCancel\"\n    cancelText=\"关闭\">\n\n    <a-spin :spinning=\"confirmLoading\">\n      <a-form :form=\"form\">\n\n<#list columns as po><#rt/>\n<#if po.fieldName !='id'><#rt/>\n        <a-form-item\n          :labelCol=\"labelCol\"\n          :wrapperCol=\"wrapperCol\"\n          label=\"${po.filedComment}\">\n          <#if po.fieldType =='date'>\n          <a-date-picker v-decorator=\"[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]\" />\n          <#elseif po.fieldType =='datetime'>\n          <a-date-picker showTime format='YYYY-MM-DD HH:mm:ss' v-decorator=\"[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]\" />\n          <#elseif \"int,decimal,double,\"?contains(po.fieldType)>\n          <a-input-number v-decorator=\"[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]\" />\n          <#else>\n          <a-input placeholder=\"请输入${po.filedComment}\" v-decorator=\"['${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]\" />\n          </#if>\n        </a-form-item>\n</#if>\n</#list>\n\n      </a-form>\n    </a-spin>\n  </j-modal>\n</template>\n\n<script>\n  import { httpAction } from '@/api/manage'\n  import pick from 'lodash.pick'\n  import moment from \"moment\"\n\n  export default {\n    name: \"${entityName}Modal\",\n    data () {\n      return {\n        title:\"操作\",\n        visible: false,\n        model: {},\n        labelCol: {\n          xs: { span: 24 },\n          sm: { span: 5 },\n        },\n        wrapperCol: {\n          xs: { span: 24 },\n          sm: { span: 16 },\n        },\n\n        confirmLoading: false,\n        form: this.$form.createForm(this),\n        validatorRules:{\n        <#list columns as po>\n        <#if po.fieldName !='id'>\n        <#if po.nullable =='N'>\n        ${po.fieldName}:{rules: [{ required: true, message: '请输入${po.filedComment}!' }]},\n        </#if>\n        </#if>\n\t    </#list>\n        },\n        url: {\n          add: \"/${entityPackage}/${entityName?uncap_first}/add\",\n          edit: \"/${entityPackage}/${entityName?uncap_first}/edit\",\n        },\n      }\n    },\n    created () {\n    },\n    methods: {\n      add () {\n        this.edit({});\n      },\n      edit (record) {\n        this.form.resetFields();\n        this.model = Object.assign({}, record);\n        this.visible = true;\n        this.$nextTick(() => {\n          this.form.setFieldsValue(pick(this.model<#list columns as po><#if po.fieldName !='id' && po.fieldType?index_of(\"date\")==-1>,'${po.fieldName}'</#if></#list>))\n\t\t  //时间格式化\n          <#list columns as po>\n          <#if po.fieldName !='id' && po.fieldType?index_of(\"date\")!=-1>\n          this.form.setFieldsValue({${po.fieldName}:this.model.${po.fieldName}?moment(this.model.${po.fieldName}):null})\n          </#if>\n          </#list>\n        });\n\n      },\n      close () {\n        this.$emit('close');\n        this.visible = false;\n      },\n      handleOk () {\n        const that = this;\n        // 触发表单验证\n        this.form.validateFields((err, values) => {\n          if (!err) {\n            that.confirmLoading = true;\n            let httpurl = '';\n            let method = '';\n            if(!this.model.id){\n              httpurl+=this.url.add;\n              method = 'post';\n            }else{\n              httpurl+=this.url.edit;\n               method = 'put';\n            }\n            let formData = Object.assign(this.model, values);\n            //时间格式化\n            <#list columns as po>\n            <#if po.fieldName !='id' && po.fieldType =='date'>\n            formData.${po.fieldName} = formData.${po.fieldName}?formData.${po.fieldName}.format():null;\n            <#elseif po.fieldName !='id' && po.fieldType =='datetime'>\n            formData.${po.fieldName} = formData.${po.fieldName}?formData.${po.fieldName}.format('YYYY-MM-DD HH:mm:ss'):null;\n            </#if>\n            </#list>\n\n            console.log(formData)\n            httpAction(httpurl,formData,method).then((res)=>{\n              if(res.success){\n                that.$message.success(res.message);\n                that.$emit('ok');\n              }else{\n                that.$message.warning(res.message);\n              }\n            }).finally(() => {\n              that.confirmLoading = false;\n              that.close();\n            })\n\n\n\n          }\n        })\n      },\n      handleCancel () {\n        this.close()\n      },\n\n\n    }\n  }\n</script>\n\n<style lang=\"less\" scoped>\n\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/modules/${entityName}Modal__Style#Drawer.vuei",
    "content": "<template>\n  <a-drawer\n      :title=\"title\"\n      :width=\"800\"\n      placement=\"right\"\n      :closable=\"false\"\n      @close=\"close\"\n      :visible=\"visible\"\n  >\n\n    <a-spin :spinning=\"confirmLoading\">\n      <a-form :form=\"form\">\n      \n<#list columns as po><#rt/>\n<#if po.fieldName !='id'><#rt/>\n        <a-form-item\n          :labelCol=\"labelCol\"\n          :wrapperCol=\"wrapperCol\"\n          label=\"${po.filedComment}\">\n          <#if po.fieldType =='date'>\n          <a-date-picker v-decorator=\"[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]\" />\n          <#elseif po.fieldType =='datetime'>\n          <a-date-picker showTime format='YYYY-MM-DD HH:mm:ss' v-decorator=\"[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]\" />\n          <#elseif \"int,decimal,double,\"?contains(po.fieldType)>\n          <a-input-number v-decorator=\"[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]\" />\n          <#else>\n          <a-input placeholder=\"请输入${po.filedComment}\" v-decorator=\"['${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]\" />\n          </#if>\n        </a-form-item>\n</#if>\n</#list>\n\t\t\n      </a-form>\n    </a-spin>\n    <a-button type=\"primary\" @click=\"handleOk\">确定</a-button>\n    <a-button type=\"primary\" @click=\"handleCancel\">取消</a-button>\n  </a-drawer>\n</template>\n\n<script>\n  import { httpAction } from '@/api/manage'\n  import pick from 'lodash.pick'\n  import moment from \"moment\"\n\n  export default {\n    name: \"${entityName}Modal\",\n    data () {\n      return {\n        title:\"操作\",\n        visible: false,\n        model: {},\n        labelCol: {\n          xs: { span: 24 },\n          sm: { span: 5 },\n        },\n        wrapperCol: {\n          xs: { span: 24 },\n          sm: { span: 16 },\n        },\n\n        confirmLoading: false,\n        form: this.$form.createForm(this),\n        validatorRules:{\n        <#list columns as po>\n        <#if po.fieldName !='id'>\n        <#if po.nullable =='N'>\n        ${po.fieldName}:{rules: [{ required: true, message: '请输入${po.filedComment}!' }]},\n        </#if>\n        </#if>\n\t    </#list>\n        },\n        url: {\n          add: \"/${entityPackage}/${entityName?uncap_first}/add\",\n          edit: \"/${entityPackage}/${entityName?uncap_first}/edit\",\n        },\n      }\n    },\n    created () {\n    },\n    methods: {\n      add () {\n        this.edit({});\n      },\n      edit (record) {\n        this.form.resetFields();\n        this.model = Object.assign({}, record);\n        this.visible = true;\n        this.$nextTick(() => {\n          this.form.setFieldsValue(pick(this.model<#list columns as po><#if po.fieldName !='id' && po.fieldType?index_of(\"date\")==-1>,'${po.fieldName}'</#if></#list>))\n\t\t  //时间格式化\n          <#list columns as po>\n          <#if po.fieldName !='id' && po.fieldType?index_of(\"date\")!=-1>\n          this.form.setFieldsValue({${po.fieldName}:this.model.${po.fieldName}?moment(this.model.${po.fieldName}):null})\n          </#if>\n          </#list>\n        });\n\n      },\n      close () {\n        this.$emit('close');\n        this.visible = false;\n      },\n      handleOk () {\n        const that = this;\n        // 触发表单验证\n        this.form.validateFields((err, values) => {\n          if (!err) {\n            that.confirmLoading = true;\n            let httpurl = '';\n            let method = '';\n            if(!this.model.id){\n              httpurl+=this.url.add;\n              method = 'post';\n            }else{\n              httpurl+=this.url.edit;\n               method = 'put';\n            }\n            let formData = Object.assign(this.model, values);\n            //时间格式化\n            <#list columns as po>\n            <#if po.fieldName !='id' && po.fieldType =='date'>\n            formData.${po.fieldName} = formData.${po.fieldName}?formData.${po.fieldName}.format():null;\n            <#elseif po.fieldName !='id' && po.fieldType =='datetime'>\n            formData.${po.fieldName} = formData.${po.fieldName}?formData.${po.fieldName}.format('YYYY-MM-DD HH:mm:ss'):null;\n            </#if>\n            </#list>\n            \n            console.log(formData)\n            httpAction(httpurl,formData,method).then((res)=>{\n              if(res.success){\n                that.$message.success(res.message);\n                that.$emit('ok');\n              }else{\n                that.$message.warning(res.message);\n              }\n            }).finally(() => {\n              that.confirmLoading = false;\n              that.close();\n            })\n\n\n\n          }\n        })\n      },\n      handleCancel () {\n        this.close()\n      },\n\n\n    }\n  }\n</script>\n\n<style lang=\"less\" scoped>\n/** Button按钮间距 */\n  .ant-btn {\n    margin-left: 30px;\n    margin-bottom: 30px;\n    float: right;\n  }\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue3/${entityPackage}/${entityName}List.vuei",
    "content": "<template>\n  <div>\n    <!--引用表格-->\n   <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n     <!--插槽:table标题-->\n          <template #tableTitle>\n             <a-button type=\"primary\" @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\"> 新增</a-button>\n             <a-button  type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n             <j-upload-button  type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n             <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n                 <template #overlay>\n                    <a-menu>\n                      <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                        <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                        删除\n                      </a-menu-item>\n                    </a-menu>\n                  </template>\n                  <a-button>批量操作\n                    <Icon icon=\"mdi:chevron-down\"></Icon>\n                  </a-button>\n            </a-dropdown>\n          </template>\n       <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\"/>\n      </template>\n    </BasicTable>\n\n    <!-- 表单区域 -->\n    <${entityName}Modal @register=\"registerModal\" @success=\"handleSuccess\"></${entityName}Modal>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"${entityPackage}-${entityName?uncap_first}\" setup>\n  import {ref, computed, unref} from 'vue';\n  import {BasicTable, useTable, TableAction} from '/@/components/Table';\n  import {useModal} from '/@/components/Modal';\n  import { useListPage } from '/@/hooks/system/useListPage'\n  import ${entityName}Modal from './modules/${entityName}Modal.vue'\n  import {columns, searchFormSchema} from './${entityName}.data';\n  import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './${entityName}.api';\n\n  //注册model\n  const [registerModal, {openModal}] = useModal();\n  //注册table数据\n  const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({\n       tableProps:{\n            title: '${tableVo.ftlDescription}',\n            api: list,\n            columns,\n            canResize:true,\n            formConfig: {\n               labelWidth: 120,\n               schemas: searchFormSchema,\n               autoSubmitOnEnter:true,\n               showAdvancedButton:true,\n             },\n            actionColumn: {\n                width: 120,\n             },\n        },\n        exportConfig: {\n             name:\"${tableVo.ftlDescription}\",\n             url: getExportUrl,\n           },\n           importConfig: {\n             url: getImportUrl\n           },\n   })\n\n   const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext\n\n   /**\n    * 新增事件\n    */\n   function handleAdd() {\n     openModal(true, {\n       isUpdate: false,\n       showFooter: true,\n     });\n   }\n   /**\n    * 编辑事件\n    */\n  function handleEdit(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: true,\n     });\n   }\n   /**\n    * 详情\n   */\n  function handleDetail(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: false,\n     });\n   }\n   /**\n    * 删除事件\n    */\n   async function handleDelete(record) {\n     await deleteOne({id: record.id}, reload);\n   }\n   /**\n    * 批量删除事件\n    */\n   async function batchHandleDelete() {\n     await batchDelete({ids: selectedRowKeys.value}, reload);\n   }\n   /**\n    * 成功回调\n    */\n   function handleSuccess({isUpdate, values}) {\n      reload();\n   }\n   /**\n      * 操作栏\n      */\n   function getTableAction(record){\n       return [\n         {\n           label: '编辑',\n           onClick: handleEdit.bind(null, record),\n         }\n       ]\n     }\n     /**\n       * 下拉操作栏\n       */\n    function getDropDownAction(record){\n      return [\n           {\n             label: '详情',\n             onClick: handleDetail.bind(null, record),\n           }, {\n             label: '删除',\n             popConfirm: {\n               title: '是否确认删除',\n               confirm: handleDelete.bind(null, record),\n             }\n           }\n      ]\n    }\n</script>\n<style scoped>\n\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue3/${entityPackage}/${entityName}__api.tsi",
    "content": "import {defHttp} from '/@/utils/http/axios';\nimport {Modal} from 'ant-design-vue';\n\nenum Api {\n  list = '/${entityPackage}/${entityName?uncap_first}/list',\n  save='/${entityPackage}/${entityName?uncap_first}/add',\n  edit='/${entityPackage}/${entityName?uncap_first}/edit',\n  deleteOne = '/${entityPackage}/${entityName?uncap_first}/delete',\n  deleteBatch = '/${entityPackage}/${entityName?uncap_first}/deleteBatch',\n  importExcel = '/${entityPackage}/${entityName?uncap_first}/importExcel',\n  exportXls = '/${entityPackage}/${entityName?uncap_first}/exportXls',\n}\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) =>\n  defHttp.get({url: Api.list, params});\n\n/**\n * 删除单个\n * @param params\n * @param handleSuccess\n */\nexport const deleteOne = (params,handleSuccess) => {\n  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n/**\n * 批量删除\n * @param params\n * @param handleSuccess\n */\nexport const batchDelete = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n/**\n * 保存或者更新\n * @param params\n * @param isUpdate 是否是更新数据\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({url: url, params});\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue3/${entityPackage}/${entityName}__data.tsi",
    "content": "import {BasicColumn} from '/@/components/Table';\nimport {FormSchema} from '/@/components/Table';\nimport { rules} from '/@/utils/helper/validator';\nimport { render } from '/@/utils/common/renderUtils';\n\nexport const columns: BasicColumn[] = [\n <#list columns as po>\n   <#if po.fieldName !='id'>\n   {\n    title: '${po.filedComment}',\n    dataIndex: '${po.fieldName}'\n   },\n   </#if>\n </#list>\n];\n\nexport const searchFormSchema: FormSchema[] = [\n<#list columns as po>\n<#if po.fieldName !='id' && po_index<= tableVo.searchFieldNum>\n {\n    label: '${po.filedComment}',\n    field: '${po.fieldName}',\n     <#if po.fieldType =='date'>\n    component: 'DatePicker'\n     <#elseif po.fieldType =='datetime'>\n    component: 'TimePicker'\n     <#elseif \"int,decimal,double,\"?contains(po.fieldType)>\n    component: 'InputNumber'\n     <#else>\n    component: 'Input'\n    </#if>\n  },\n</#if>\n</#list>\n];\n\nexport const formSchema: FormSchema[] = [\n  // TODO 主键隐藏字段，目前写死为ID\n  {label: '', field: 'id', component: 'Input', show: false},\n<#list columns as po><#rt/>\n  {\n    label: '${po.filedComment}',\n    field: '${po.fieldName}',\n     <#if po.fieldType =='date'>\n    component: 'DatePicker'\n     <#elseif po.fieldType =='datetime'>\n    component: 'DatePicker',\n    componentProps: {\n      showTime: true,\n      valueFormat: 'YYYY-MM-DD hh:mm:ss',\n    },\n     <#elseif \"int,decimal,double,\"?contains(po.fieldType)>\n    component: 'InputNumber',\n     <#else>\n    component: 'Input',\n    </#if>\n    <#if po.fieldName =='id'><#rt/>\n    show:false,\n    </#if>\n  },\n</#list>\n];\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue3/${entityPackage}/modules/${entityName}Modal.vuei",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"title\" @ok=\"handleSubmit\" width=\"40%\">\n         <BasicForm @register=\"registerForm\"/>\n     </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n    import {ref, computed, unref} from 'vue';\n    import {BasicModal, useModalInner} from '/@/components/Modal';\n    import {BasicForm, useForm} from '/@/components/Form/index';\n    import {formSchema} from '../${entityName}.data';\n    import {saveOrUpdate} from '../${entityName}.api';\n    // Emits声明\n    const emit = defineEmits(['register','success']);\n    const isUpdate = ref(true);\n    //表单配置\n    const [registerForm, {resetFields, setFieldsValue, validate}] = useForm({\n        labelWidth: 150,\n        schemas: formSchema,\n        showActionButtonGroup: false,\n    });\n    //表单赋值\n    const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {\n        //重置表单\n        await resetFields();\n        setModalProps({confirmLoading: false,showCancelBtn:data?.showFooter,showOkBtn:data?.showFooter});\n        isUpdate.value = !!data?.isUpdate;\n        if (unref(isUpdate)) {\n            //表单赋值\n            await setFieldsValue({\n                ...data.record,\n            });\n        }\n    });\n    //设置标题\n    const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));\n    //表单提交事件\n    async function handleSubmit(v) {\n        try {\n            let values = await validate();\n            setModalProps({confirmLoading: true});\n            //提交表单\n            await saveOrUpdate(values, isUpdate.value);\n            //关闭弹窗\n            closeModal();\n            //刷新列表\n            emit('success', {isUpdate: isUpdate.value, values});\n        } finally {\n            setModalProps({confirmLoading: false});\n        }\n    }\n</script>\n\n<style lang=\"less\" scoped>\n\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai",
    "content": "package ${bussiPackage}.${entityPackage}.controller;\n\nimport java.io.UnsupportedEncodingException;\nimport java.io.IOException;\nimport java.net.URLDecoder;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\n\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.util.oConvertUtils;\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport ${bussiPackage}.${entityPackage}.vo.${entityName}Page;\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.service.I${sub.entityName}Service;\n</#list>\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\nimport com.alibaba.fastjson.JSON;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport org.jeecg.common.aspect.annotation.AutoLog;\n\n /**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Tag(name=\"${tableVo.ftlDescription}\")\n@RestController\n@RequestMapping(\"/${entityPackage}/${entityName?uncap_first}\")\n@Slf4j\npublic class ${entityName}Controller {\n\t@Autowired\n\tprivate I${entityName}Service ${entityName?uncap_first}Service;\n\t<#list subTables as sub>\n\t@Autowired\n\tprivate I${sub.entityName}Service ${sub.entityName?uncap_first}Service;\n\t</#list>\n\t\n\t/**\n\t * 分页列表查询\n\t *\n\t * @param ${entityName?uncap_first}\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-分页列表查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-分页列表查询\")\n\t@GetMapping(value = \"/list\")\n\tpublic Result<?> queryPageList(${entityName} ${entityName?uncap_first},\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t   HttpServletRequest req) {\n\t\tQueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap());\n\t\tPage<${entityName}> page = new Page<${entityName}>(pageNo, pageSize);\n\t\tIPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper);\n\t\treturn Result.OK(pageList);\n\t}\n\t\n\t/**\n\t * 添加\n\t *\n\t * @param ${entityName?uncap_first}Page\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-添加\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-添加\")\n\t@PostMapping(value = \"/add\")\n\tpublic Result<?> add(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) {\n\t\t${entityName} ${entityName?uncap_first} = new ${entityName}();\n\t\tBeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first});\n\t\t${entityName?uncap_first}Service.saveMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>);\n\t\treturn Result.OK(\"添加成功!\");\n\t}\n\t\n\t/**\n\t * 编辑\n\t *\n\t * @param ${entityName?uncap_first}Page\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-编辑\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-编辑\")\n\t@RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n\tpublic Result<?> edit(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) {\n\t\t${entityName} ${entityName?uncap_first} = new ${entityName}();\n\t\tBeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first});\n\t\t${entityName?uncap_first}Service.updateMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>);\n\t\treturn Result.OK(\"编辑成功!\");\n\t}\n\t\n\t/**\n\t * 通过id删除\n\t *\n\t * @param id\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-通过id删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id删除\")\n\t@DeleteMapping(value = \"/delete\")\n\tpublic Result<?> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t    ${entityName?uncap_first}Service.delMain(id);\n\t\treturn Result.OK(\"删除成功!\");\n\t}\n\t\n\t/**\n\t * 批量删除\n\t *\n\t * @param ids\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-批量删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-批量删除\")\n\t@DeleteMapping(value = \"/deleteBatch\")\n\tpublic Result<?> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tthis.${entityName?uncap_first}Service.delBatchMain(Arrays.asList(ids.split(\",\")));\n\t\treturn Result.OK(\"批量删除成功！\");\n\t}\n\t\n\t/**\n\t * 通过id查询\n     *\n\t * @param id\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-通过id查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id查询\")\n\t@GetMapping(value = \"/queryById\")\n\tpublic Result<?> queryById(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${entityName} ${entityName?uncap_first} = ${entityName?uncap_first}Service.getById(id);\n\t\treturn Result.OK(${entityName?uncap_first});\n\t}\n\t\n\t<#list subTables as sub>\n\t/**\n\t * 通过id查询\n     *\n\t * @param id\n\t * @return\n\t */\n\t@AutoLog(value = \"${sub.ftlDescription}-通过主表ID查询\")\n\t@Operation(summary=\"${sub.ftlDescription}-通过主表ID查询\")\n\t@GetMapping(value = \"/query${sub.entityName}ByMainId\")\n\tpublic Result<?> query${sub.entityName}ListByMainId(@RequestParam(name=\"id\",required=true) String id) {\n\t\tList<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(id);\n\t\treturn Result.OK(${sub.entityName?uncap_first}List);\n\t}\n\t</#list>\n\n  /**\n   * 导出excel\n   *\n   * @param request\n   * @param ${entityName?uncap_first}\n   */\n  @RequestMapping(value = \"/exportXls\")\n  public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) {\n      // Step.1 组装查询条件\n      QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap());\n      LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\n      //Step.2 获取导出数据\n      List<${entityName}Page> pageList = new ArrayList<${entityName}Page>();\n      List<${entityName}> ${entityName?uncap_first}List = ${entityName?uncap_first}Service.list(queryWrapper);\n      for (${entityName} temp : ${entityName?uncap_first}List) {\n          ${entityName}Page vo = new ${entityName}Page();\n          BeanUtils.copyProperties(temp, vo);\n          <#list subTables as sub>\n          List<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(temp.getId());\n          vo.set${sub.entityName}List(${sub.entityName?uncap_first}List);\n          </#list>\n          pageList.add(vo);\n      }\n      //Step.3 调用AutoPoi导出Excel\n      ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n      mv.addObject(NormalExcelConstants.FILE_NAME, \"${tableVo.ftlDescription}\");\n      mv.addObject(NormalExcelConstants.CLASS, ${entityName}Page.class);\n      mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(\"${tableVo.ftlDescription}数据\", \"导出人:\"+sysUser.getRealname(), \"${tableVo.ftlDescription}\"));\n      mv.addObject(NormalExcelConstants.DATA_LIST, pageList);\n      return mv;\n  }\n\n  /**\n   * 通过excel导入数据\n   *\n   * @param request\n   * @param response\n   * @return\n   */\n  @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n  public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n      MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n      Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n      for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n          MultipartFile file = entity.getValue();// 获取上传文件对象\n          ImportParams params = new ImportParams();\n          params.setTitleRows(2);\n          params.setHeadRows(1);\n          params.setNeedSave(true);\n          try {\n              List<${entityName}Page> list = ExcelImportUtil.importExcel(file.getInputStream(), ${entityName}Page.class, params);\n              for (${entityName}Page page : list) {\n                  ${entityName} po = new ${entityName}();\n                  BeanUtils.copyProperties(page, po);\n                  ${entityName?uncap_first}Service.saveMain(po, <#list subTables as sub>page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>);\n              }\n              return Result.OK(\"文件导入成功！数据行数:\" + list.size());\n          } catch (Exception e) {\n              log.error(e.getMessage(),e);\n              return Result.error(\"文件导入失败:\"+e.getMessage());\n          } finally {\n              try {\n                  file.getInputStream().close();\n              } catch (IOException e) {\n                  e.printStackTrace();\n              }\n          }\n      }\n      return Result.OK(\"文件导入失败！\");\n  }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai",
    "content": "package ${bussiPackage}.${entityPackage}.entity;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport io.swagger.v3.oas.annotations.media.Schema;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Data\n@TableName(\"${tableName}\")\n@Schema(description=\"${tableVo.ftlDescription}\")\npublic class ${entityName} implements Serializable {\n    private static final long serialVersionUID = 1L;\n    \n    <#list originalColumns as po>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t@TableId(type = IdType.ASSIGN_ID)\n\t</#if>\n  <#if po.fieldType =='java.util.Date'>\n\t<#if po.fieldDbType =='date'>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t<#elseif po.fieldDbType =='datetime'>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n  </#if>\n\t@Schema(description = \"${po.filedComment}\")\n\tprivate <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType}</#if> ${po.fieldName};\n\t</#list>\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}.java\npackage ${bussiPackage}.${entityPackage}.entity;\n\nimport java.io.Serializable;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport java.util.Date;\nimport io.swagger.v3.oas.annotations.media.Schema;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Data\n@TableName(\"${subTab.tableName}\")\n@Schema(description=\"${tableVo.ftlDescription}\")\npublic class ${subTab.entityName} implements Serializable {\n    private static final long serialVersionUID = 1L;\n    \n    <#list subTab.originalColumns as po>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t@TableId(type = IdType.ASSIGN_ID)\n\t<#else>\n  <#if po.fieldType =='java.util.Date'>\n\t<#if po.fieldDbType =='date'>\n\t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t<#elseif po.fieldDbType =='datetime'>\n\t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n\t<#else>\n\t<#if !subTab.foreignKeys?seq_contains(po.fieldName?cap_first)>\n    @Excel(name = \"${po.filedComment}\", width = 15)\n    </#if>\n  </#if>\n  </#if>\n\t@Schema(description = \"${po.filedComment}\")\n\tprivate <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType}</#if> ${po.fieldName};\n\t</#list>\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai",
    "content": "package ${bussiPackage}.${entityPackage}.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface ${entityName}Mapper extends BaseMapper<${entityName}> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}Mapper.java\npackage ${bussiPackage}.${entityPackage}.mapper;\n\nimport java.util.List;\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface ${subTab.entityName}Mapper extends BaseMapper<${subTab.entityName}> {\n\n\tpublic boolean deleteByMainId(String mainId);\n    \n\tpublic List<${subTab.entityName}> selectByMainId(String mainId);\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml",
    "content": "<#list subTables as subTab>\n<#assign originalForeignKeys = subTab.originalForeignKeys>\n#segment#${subTab.entityName}Mapper.xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper\">\n\n\t<delete id=\"deleteByMainId\" parameterType=\"java.lang.String\">\n\t\tDELETE \n\t\tFROM  ${subTab.tableName} \n\t\tWHERE\n\t\t<#list originalForeignKeys as key>\n\t\t<#if key?lower_case?index_of(\"${primaryKeyField}\")!=-1>\n\t\t\t ${key} = ${r'#'}{${primaryKeyField}} <#rt/>\n\t\t<#else>\n\t\t\t ${key} = ${r'#'}{${key}} <#rt/>\n\t\t</#if>\n\t\t<#if key_has_next>AND</#if>\n\t\t</#list>\n\t</delete>\n\t\n\t<select id=\"selectByMainId\" parameterType=\"java.lang.String\" resultType=\"${bussiPackage}.${entityPackage}.entity.${subTab.entityName}\">\n\t\tSELECT * \n\t\tFROM  ${subTab.tableName}\n\t\tWHERE\n\t\t<#list originalForeignKeys as key>\n\t\t<#if key?lower_case?index_of(\"${primaryKeyField}\")!=-1>\n\t\t\t ${key} = ${r'#'}{${primaryKeyField}} <#rt/>\n\t\t<#else>\n\t\t\t ${key} = ${r'#'}{${key}} <#rt/>\n\t\t</#if>\n\t\t<#if key_has_next>AND</#if>\n\t\t</#list>\n\t</select>\n</mapper>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service;\n\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport java.io.Serializable;\nimport java.util.Collection;\nimport java.util.List;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface I${entityName}Service extends IService<${entityName}> {\n\n\t/**\n\t * 添加一对多\n\t * \n\t */\n\tpublic void saveMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) ;\n\t\n\t/**\n\t * 修改一对多\n\t * \n\t */\n\tpublic void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>);\n\t\n\t/**\n\t * 删除一对多\n\t */\n\tpublic void delMain (String id);\n\t\n\t/**\n\t * 批量删除一对多\n\t */\n\tpublic void delBatchMain (Collection<? extends Serializable> idList);\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai",
    "content": "<#list subTables as subTab>\n#segment#I${subTab.entityName}Service.java\npackage ${bussiPackage}.${entityPackage}.service;\n\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport java.util.List;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface I${subTab.entityName}Service extends IService<${subTab.entityName}> {\n\n\tpublic List<${subTab.entityName}> selectByMainId(String mainId);\n}\n</#list>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service.impl;\n\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.mapper.${sub.entityName}Mapper;\n</#list>\nimport ${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper;\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.transaction.annotation.Transactional;\nimport java.io.Serializable;\nimport java.util.List;\nimport java.util.Collection;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Service\npublic class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service {\n\n\t@Autowired\n\tprivate ${entityName}Mapper ${entityName?uncap_first}Mapper;\n\t<#list subTables as sub>\n\t@Autowired\n\tprivate ${sub.entityName}Mapper ${sub.entityName?uncap_first}Mapper;\n\t</#list>\n\t\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void saveMain(${entityName} ${entityName?uncap_first}, <#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) {\n\t\t${entityName?uncap_first}Mapper.insert(${entityName?uncap_first});\n\t\t<#list subTables as sub>\n\t\tfor(${sub.entityName} entity:${sub.entityName?uncap_first}List) {\n\t\t\t<#list sub.foreignKeys as key>\n\t\t\t//外键设置\n\t\t\t<#if key?lower_case?index_of(\"${primaryKeyField}\")!=-1>\n\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}());\n\t\t\t<#else>\n\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${key}());\n\t\t\t</#if>\n\t\t\t</#list>\n\t\t\t${sub.entityName?uncap_first}Mapper.insert(entity);\n\t\t}\n\t\t</#list>\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) {\n\t\t${entityName?uncap_first}Mapper.updateById(${entityName?uncap_first});\n\t\t\n\t\t//1.先删除子表数据\n\t\t<#list subTables as sub>\n\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(${entityName?uncap_first}.getId());\n\t\t</#list>\n\t\t\n\t\t//2.子表数据重新插入\n\t\t<#list subTables as sub>\n\t\tfor(${sub.entityName} entity:${sub.entityName?uncap_first}List) {\n\t\t\t<#list sub.foreignKeys as key>\n\t\t\t//外键设置\n\t\t\t<#if key?lower_case?index_of(\"${primaryKeyField}\")!=-1>\n\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}());\n\t\t\t<#else>\n\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${key}());\n\t\t\t</#if>\n\t\t\t</#list>\n\t\t\t${sub.entityName?uncap_first}Mapper.insert(entity);\n\t\t}\n\t\t</#list>\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void delMain(String id) {\n\t\t<#list subTables as sub>\n\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(id);\n\t\t</#list>\n\t\t${entityName?uncap_first}Mapper.deleteById(id);\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void delBatchMain(Collection<? extends Serializable> idList) {\n\t\tfor(Serializable id:idList) {\n\t\t\t<#list subTables as sub>\n\t\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(id.toString());\n\t\t\t</#list>\n\t\t\t${entityName?uncap_first}Mapper.deleteById(id);\n\t\t}\n\t}\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}ServiceImpl.java\npackage ${bussiPackage}.${entityPackage}.service.impl;\n\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport ${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper;\nimport ${bussiPackage}.${entityPackage}.service.I${subTab.entityName}Service;\nimport org.springframework.stereotype.Service;\nimport java.util.List;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Service\npublic class ${subTab.entityName}ServiceImpl extends ServiceImpl<${subTab.entityName}Mapper, ${subTab.entityName}> implements I${subTab.entityName}Service {\n\t\n\t@Autowired\n\tprivate ${subTab.entityName}Mapper ${subTab.entityName?uncap_first}Mapper;\n\t\n\t@Override\n\tpublic List<${subTab.entityName}> selectByMainId(String mainId) {\n\t\treturn ${subTab.entityName?uncap_first}Mapper.selectByMainId(mainId);\n\t}\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai",
    "content": "package ${bussiPackage}.${entityPackage}.vo;\n\nimport java.util.List;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport lombok.Data;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.jeecgframework.poi.excel.annotation.ExcelCollection;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport java.util.Date;\nimport io.swagger.v3.oas.annotations.media.Schema;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Data\n@Schema(description=\"${tableVo.ftlDescription}\")\npublic class ${entityName}Page {\n\t\n    <#list originalColumns as po>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t<#else>\n    <#if po.fieldType =='java.util.Date'>\n  \t<#if po.fieldDbType =='date'>\n  \t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n  \t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n  \t<#elseif po.fieldDbType =='datetime'>\n  \t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n  \t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n  \t</#if>\n  \t<#else>\n  \t@Excel(name = \"${po.filedComment}\", width = 15)\n    </#if>\n  </#if>\n\tprivate <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType}</#if> ${po.fieldName};\n\t</#list>\n\t\n\t<#list subTables as sub>\n\t@ExcelCollection(name=\"${sub.ftlDescription}\")\n\t@Schema(description = \"${sub.ftlDescription}\")\n\tprivate List<${sub.entityName}> ${sub.entityName?uncap_first}List;\n\t</#list>\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei",
    "content": "<template>\n  <a-card :bordered=\"false\">\n\n    <!-- 查询区域 -->\n    <div class=\"table-page-search-wrapper\">\n      <a-form layout=\"inline\" @keyup.enter.native=\"searchQuery\">\n        <a-row :gutter=\"24\">\n<#list columns as po><#rt/>\n<#if po.fieldName !='id' && po_index<= tableVo.searchFieldNum>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <a-form-item label=\"${po.filedComment}\">\n              <a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n            </a-form-item>\n          </a-col>\n</#if>\n</#list>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left;overflow: hidden;\" class=\"table-page-search-submitButtons\">\n              <a-button type=\"primary\" @click=\"searchQuery\" icon=\"search\">查询</a-button>\n              <a-button type=\"primary\" @click=\"searchReset\" icon=\"reload\" style=\"margin-left: 8px\">重置</a-button>\n            </span>\n          </a-col>\n\n        </a-row>\n      </a-form>\n    </div>\n\n    <!-- 操作按钮区域 -->\n    <div class=\"table-operator\">\n      <a-button @click=\"handleAdd\" type=\"primary\" icon=\"plus\">新增</a-button>\n      <a-button type=\"primary\" icon=\"download\" @click=\"handleExportXls('${tableVo.ftlDescription}')\">导出</a-button>\n      <a-upload name=\"file\" :showUploadList=\"false\" :multiple=\"false\" :headers=\"tokenHeader\" :action=\"importExcelUrl\" @change=\"handleImportExcel\">\n        <a-button type=\"primary\" icon=\"import\">导入</a-button>\n      </a-upload>\n      <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n        <a-menu slot=\"overlay\">\n          <a-menu-item key=\"1\" @click=\"batchDel\"><a-icon type=\"delete\"/>删除</a-menu-item>\n        </a-menu>\n        <a-button style=\"margin-left: 8px\"> 批量操作 <a-icon type=\"down\" /></a-button>\n      </a-dropdown>\n    </div>\n\n    <!-- table区域-begin -->\n    <div>\n      <div class=\"ant-alert ant-alert-info\" style=\"margin-bottom: 16px;\">\n        <i class=\"anticon anticon-info-circle ant-alert-icon\"></i>\n        <span>已选择</span>\n        <a style=\"font-weight: 600\">\n          {{ selectedRowKeys.length }}\n        </a>\n        <span>项</span>\n        <a style=\"margin-left: 24px\" @click=\"onClearSelected\">清空</a>\n      </div>\n\n      <a-table\n        ref=\"table\"\n        size=\"middle\"\n        bordered\n        rowKey=\"id\"\n        :columns=\"columns\"\n        :dataSource=\"dataSource\"\n        :pagination=\"ipagination\"\n        :loading=\"loading\"\n        :rowSelection=\"{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}\"\n        @change=\"handleTableChange\">\n\n        <span slot=\"action\" slot-scope=\"text, record\">\n          <a @click=\"handleEdit(record)\">编辑</a>\n\n          <a-divider type=\"vertical\" />\n          <a-dropdown>\n            <a class=\"ant-dropdown-link\">更多 <a-icon type=\"down\" /></a>\n            <a-menu slot=\"overlay\">\n              <a-menu-item>\n                <a-popconfirm title=\"确定删除吗?\" @confirm=\"() => handleDelete(record.id)\">\n                  <a>删除</a>\n                </a-popconfirm>\n              </a-menu-item>\n            </a-menu>\n          </a-dropdown>\n        </span>\n\n      </a-table>\n    </div>\n    <!-- table区域-end -->\n\n    <!-- 表单区域 -->\n    <${entityName?uncap_first}-modal ref=\"modalForm\" @ok=\"modalFormOk\"/>\n\n  </a-card>\n</template>\n\n<script>\n\n  import { JeecgListMixin } from '@/mixins/JeecgListMixin'\n  import ${entityName}Modal from './modules/${entityName}Modal'\n\n  export default {\n    name: \"${entityName}List\",\n    mixins: [JeecgListMixin],\n    components: {\n      ${entityName}Modal\n    },\n    data () {\n      return {\n        description: '${tableVo.ftlDescription}管理页面',\n        // 表头\n        columns: [\n          {\n            title: '#',\n            dataIndex: '',\n            key: 'rowIndex',\n            width: 60,\n            align: \"center\",\n            customRender:function (t, r, index) {\n              return parseInt(index)+1;\n            }\n          },\n<#list columns as po><#rt/>\n  <#if po.fieldName !='id'>\n          {\n            title: '${po.filedComment}',\n            align:\"center\",\n            dataIndex: '${po.fieldName}'\n          },\n  </#if>\n</#list>\n          {\n            title: '操作',\n            dataIndex: 'action',\n            align:\"center\",\n            scopedSlots: { customRender: 'action' },\n          }\n        ],\n        // 请求参数\n    \turl: {\n              list: \"/${entityPackage}/${entityName?uncap_first}/list\",\n              delete: \"/${entityPackage}/${entityName?uncap_first}/delete\",\n              deleteBatch: \"/${entityPackage}/${entityName?uncap_first}/deleteBatch\",\n              exportXlsUrl: \"${entityPackage}/${entityName?uncap_first}/exportXls\",\n              importExcelUrl: \"${entityPackage}/${entityName?uncap_first}/importExcel\",\n           },\n        }\n      },\n      computed: {\n        importExcelUrl: function(){\n          <#noparse>return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;</#noparse>\n        }\n      },\n\n\n    methods: {\n\n      initDictConfig() {\n      }\n\n    }\n  }\n</script>\n<style scoped>\n  @import '~@assets/less/common.less'\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei",
    "content": "<template>\n <a-spin :spinning=\"confirmLoading\">\n      <!-- 主表单区域 -->\n      <a-form-model ref=\"form\" :model=\"model\" :rules=\"validatorRules\">\n<#list columns as po><#rt/>\n  <#if po_index % 2 == 0 ><#rt/>\n        <a-row>\n    <#if po.fieldName !='id'>\n      <#list [po_index, po_index+1] as idx><#rt/>\n        <#if idx lt columns?size>\n          <a-col :xs=\"24\" :sm=\"12\">\n            <a-form-model-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" prop=\"${columns[idx].fieldName}\" label=\"${columns[idx].filedComment}\">\n            <#if columns[idx].fieldType =='date'>\n              <a-date-picker placeholder=\"请输入${columns[idx].filedComment}\" style=\"width:100%\" v-model=\"model.${columns[idx].fieldName}\"/>\n            <#elseif columns[idx].fieldType =='datetime'>\n              <a-date-picker placeholder=\"请输入${columns[idx].filedComment}\" style=\"width:100%\" :showTime=\"true\" valueFormat=\"YYYY-MM-DD HH:mm:ss\" v-model=\"model.${columns[idx].fieldName}\"/>\n            <#elseif \"int,decimal,double,\"?contains(columns[idx].fieldType)>\n              <a-input-number placeholder=\"请输入${columns[idx].filedComment}\" style=\"width:100%\" v-model=\"model.${columns[idx].fieldName}\"/>\n            <#else>\n              <a-input placeholder=\"请输入${columns[idx].filedComment}\" v-model=\"model.${columns[idx].fieldName}\"/>\n            </#if>\n            </a-form-model-item>\n          </a-col>\n        </#if>\n      </#list><#rt/>\n    </#if><#rt/>\n        </a-row>\n  </#if><#rt/>\n</#list>\n      </a-form-model>\n\n      <!-- 子表单区域 -->\n      <a-tabs v-model=\"activeKey\" @change=\"handleChangeTabs\">\n<#list subTables as sub><#rt/>\n        <a-tab-pane tab=\"${sub.ftlDescription}\" :key=\"refKeys[${sub_index}]\" :forceRender=\"true\">\n          <j-editable-table\n            :ref=\"refKeys[${sub_index}]\"\n            :loading=\"${sub.entityName?uncap_first}Table.loading\"\n            :columns=\"${sub.entityName?uncap_first}Table.columns\"\n            :dataSource=\"${sub.entityName?uncap_first}Table.dataSource\"\n            :maxHeight=\"300\"\n            :rowNumber=\"true\"\n            :rowSelection=\"true\"\n            :actionButton=\"true\"/>\n        </a-tab-pane>\n</#list>\n      </a-tabs>\n    </a-spin>\n</template>\n\n<script>\n\n    import { FormTypes } from '@/utils/JEditableTableUtil'\n    import { JEditableTableModelMixin } from '@/mixins/JEditableTableModelMixin'\n\n    export default {\n      name: '${entityName}Form',\n      mixins: [JEditableTableModelMixin],\n      data() {\n        return {\n          // 新增时子表默认添加几行空数据\n          addDefaultRowNum: 1,\n          model: {\n          //设置默认值\n           },\n          validatorRules: {\n  <#list columns as po>\n    <#if po.fieldName !='id'>\n      <#if po.nullable =='N'>\n            ${po.fieldName}: [{ required: true, message: '请输入${po.filedComment}!' }],\n      </#if>\n    </#if>\n  </#list>\n          },\n          refKeys: [<#list subTables as sub>'${sub.entityName?uncap_first}', </#list>],\n          activeKey: '${subTables[0].entityName?uncap_first}',\n  <#list subTables as sub><#rt/>\n          // ${sub.ftlDescription}\n          ${sub.entityName?uncap_first}Table: {\n            loading: false,\n            dataSource: [],\n            columns: [\n  <#list sub.colums as col><#rt/>\n      <#if col.filedComment !='外键'>\n              {\n                title: '${col.filedComment}',\n                key: '${col.fieldName}',\n        <#if col.fieldType =='date'>\n                type: FormTypes.date,\n        <#elseif col.fieldType =='datetime'>\n                type: FormTypes.datetime,\n        <#elseif \"int,decimal,double,\"?contains(col.fieldType)>\n                type: FormTypes.inputNumber,\n        <#else>\n                type: FormTypes.input,\n        </#if>\n                defaultValue: '',\n                placeholder: '请输入${'$'}{title}',\n        <#if col.nullable =='N'>\n                validateRules: [{ required: true, message: '${'$'}{title}不能为空' }],\n        </#if>\n              },\n      </#if>\n  </#list>\n            ]\n          },\n  </#list>\n          url: {\n            add: \"/${entityPackage}/${entityName?uncap_first}/add\",\n            edit: \"/${entityPackage}/${entityName?uncap_first}/edit\",\n  <#list subTables as sub><#rt/>\n            ${sub.entityName?uncap_first}: {\n              list: '/${entityPackage}/${entityName?uncap_first}/query${sub.entityName}ByMainId'\n            },\n  </#list>\n          }\n        }\n      },\n      methods: {\n        /** 调用完edit()方法之后会自动调用此方法 */\n        editAfter() {\n          // 加载子表数据\n          if (this.model.id) {\n            let params = { id: this.model.id }\n  <#list subTables as sub><#rt/>\n            this.requestSubTableData(this.url.${sub.entityName?uncap_first}.list, params, this.${sub.entityName?uncap_first}Table)\n  </#list>\n          }\n        },\n\n        /** 整理成formData */\n        classifyIntoFormData(allValues) {\n          let main = Object.assign(this.model, allValues.formValue)\n          return {\n            ...main, // 展开\n  <#list subTables as sub><#rt/>\n            ${sub.entityName?uncap_first}List: allValues.tablesValue[${sub_index}].values,\n  </#list>\n          }\n        }\n      }\n    }\n</script>\n\n<style scoped>\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei",
    "content": "<template>\n  <j-modal\n    :title=\"title\"\n    :width=\"1200\"\n    :visible=\"visible\"\n    :maskClosable=\"false\"\n    switchFullscreen\n    @ok=\"handleOk\"\n    @cancel=\"handleCancel\">\n     <${Format.humpToShortbar(entityName)}-form ref=\"realForm\" @ok=\"submitCallback\"/>\n  </j-modal>\n</template>\n\n<script>\n\n import ${entityName}Form from './${entityName}Form'\n export default {\n     name: '${entityName}Modal',\n     components: {\n       ${entityName}Form\n     },\n     data() {\n       return {\n         title:'',\n         visible: false,\n         disableSubmit: false\n       }\n     },\n     methods:{\n       add () {\n         this.visible=true\n         this.$nextTick(()=>{\n           this.$refs.realForm.add();\n         })\n       },\n       edit (record) {\n         this.visible=true\n         this.$nextTick(()=>{\n           this.$refs.realForm.edit(record);\n         })\n       },\n       close () {\n         this.$emit('close');\n         this.visible = false;\n       },\n       handleOk () {\n         this.$refs.realForm.handleOk();\n       },\n       submitCallback(){\n         this.$emit('ok');\n         this.visible = false;\n       },\n       handleCancel () {\n         this.close()\n       }\n     }\n   }\n</script>\n\n<style scoped>\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei",
    "content": "<template>\n   <div>\n    <!--引用表格-->\n   <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n     <!--插槽:table标题-->\n      <template #tableTitle>\n          <a-button type=\"primary\" @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\"> 新增</a-button>\n          <a-button  type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n          <j-upload-button  type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n          <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n              <template #overlay>\n                <a-menu>\n                  <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                    <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                    删除\n                  </a-menu-item>\n                </a-menu>\n              </template>\n              <a-button>批量操作\n                <Icon icon=\"mdi:chevron-down\"></Icon>\n              </a-button>\n        </a-dropdown>\n      </template>\n       <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\"/>\n      </template>\n    </BasicTable>\n    <!-- 表单区域 -->\n    <${entityName}Modal @register=\"registerModal\" @success=\"handleSuccess\"></${entityName}Modal>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import {ref, computed, unref} from 'vue';\n  import {BasicTable, useTable, TableAction} from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage'\n  import {useModal} from '/@/components/Modal';\n  import ${entityName}Modal from './modules/${entityName}Modal.vue'\n  import {columns, searchFormSchema} from './${entityName}.data';\n  import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './${entityName}.api';\n  //注册model\n  const [registerModal, {openModal}] = useModal();\n   //注册table数据\n  const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({\n      tableProps:{\n           title: '${tableVo.ftlDescription}',\n           api: list,\n           columns,\n           canResize:true,\n           formConfig: {\n                labelWidth: 120,\n                schemas: searchFormSchema,\n                autoSubmitOnEnter:true,\n                showAdvancedButton:true,\n            },\n            actionColumn: {\n               width: 120,\n            },\n        },\n        exportConfig: {\n            name:\"${tableVo.ftlDescription}\",\n            url: getExportUrl,\n        },\n        importConfig: {\n            url: getImportUrl\n        },\n    })\n\n  const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext\n\n   /**\n    * 新增事件\n    */\n  function handleAdd() {\n     openModal(true, {\n       isUpdate: false,\n       showFooter: true,\n     });\n  }\n   /**\n    * 编辑事件\n    */\n  function handleEdit(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: true,\n     });\n   }\n   /**\n    * 详情\n   */\n  function handleDetail(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: false,\n     });\n   }\n   /**\n    * 删除事件\n    */\n  async function handleDelete(record) {\n     await deleteOne({id: record.id}, reload);\n   }\n   /**\n    * 批量删除事件\n    */\n  async function batchHandleDelete() {\n     await batchDelete({ids: selectedRowKeys.value}, reload);\n   }\n   /**\n    * 成功回调\n    */\n  function handleSuccess() {\n      reload();\n   }\n   /**\n      * 操作栏\n      */\n  function getTableAction(record){\n       return [\n         {\n           label: '编辑',\n           onClick: handleEdit.bind(null, record),\n         }\n       ]\n   }\n     /**\n        * 下拉操作栏\n        */\n  function getDropDownAction(record){\n      return [\n           {\n             label: '详情',\n             onClick: handleDetail.bind(null, record),\n           }, {\n             label: '删除',\n             popConfirm: {\n               title: '是否确认删除',\n               confirm: handleDelete.bind(null, record),\n             }\n           }\n      ]\n   }\n</script>\n\n<style scoped>\n\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi",
    "content": "import {defHttp} from '/@/utils/http/axios';\nimport {Modal} from 'ant-design-vue';\n\nenum Api {\n  list = '/${entityPackage}/${entityName?uncap_first}/list',\n  save='/${entityPackage}/${entityName?uncap_first}/add',\n  edit='/${entityPackage}/${entityName?uncap_first}/edit',\n  deleteOne = '/${entityPackage}/${entityName?uncap_first}/delete',\n  deleteBatch = '/${entityPackage}/${entityName?uncap_first}/deleteBatch',\n  importExcel = '/${entityPackage}/${entityName?uncap_first}/importExcel',\n  exportXls = '/${entityPackage}/${entityName?uncap_first}/exportXls',\n<#list subTables as sub><#rt/>\n  ${sub.entityName?uncap_first}List = '/${entityPackage}/${entityName?uncap_first}/query${sub.entityName}ByMainId',\n</#list>\n}\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n<#list subTables as sub><#rt/>\n/**\n * 查询子表数据\n * @param params\n */\nexport const ${sub.entityName?uncap_first}List = Api.${sub.entityName?uncap_first}List;\n</#list>\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) =>\n  defHttp.get({url: Api.list, params});\n\n/**\n * 删除单个\n * @param params\n * @param handleSuccess\n */\nexport const deleteOne = (params,handleSuccess) => {\n  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n/**\n * 批量删除\n * @param params\n * @param handleSuccess\n */\nexport const batchDelete = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n/**\n * 保存或者更新\n * @param params\n * @param isUpdate 是否是更新数据\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({url: url, params});\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi",
    "content": "import {BasicColumn} from '/@/components/Table';\nimport {FormSchema} from '/@/components/Table';\nimport { rules} from '/@/utils/helper/validator';\nimport { render } from '/@/utils/common/renderUtils';\nimport {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types'\n//列表数据\nexport const columns: BasicColumn[] = [\n <#list columns as po>\n   <#if po.fieldName !='id'>\n   {\n    title: '${po.filedComment}',\n    align:\"center\",\n    <#if po.classType=='date'>\n    dataIndex: '${po.fieldName}',\n    customRender:({text}) =>{\n      return !text?\"\":(text.length>10?text.substr(0,10):text)\n    },\n   <#else>\n    dataIndex: '${po.fieldName}'\n   </#if>\n   },\n   </#if>\n </#list>\n];\n//查询数据\nexport const searchFormSchema: FormSchema[] = [\n<#list columns as po>\n<#if po.fieldName !='id' && po_index<= tableVo.searchFieldNum>\n {\n    label: '${po.filedComment}',\n    field: '${po.fieldName}',\n     <#if po.fieldType =='date'>\n    component: 'DatePicker'\n     <#elseif po.fieldType =='datetime'>\n    component: 'TimePicker'\n     <#elseif \"int,decimal,double,\"?contains(po.fieldType)>\n    component: 'InputNumber'\n     <#else>\n    component: 'Input'\n    </#if>\n  },\n</#if>\n</#list>\n];\n\nexport const formSchema: FormSchema[] = [\n  // TODO 主键隐藏字段，目前写死为ID\n  {label: '', field: 'id', component: 'Input', show: false},\n<#list columns as po><#rt/>\n  {\n    label: '${po.filedComment}',\n    field: '${po.fieldName}',\n     <#if po.fieldType =='date'>\n    component: 'DatePicker'\n     <#elseif po.fieldType =='datetime'>\n    component: 'DatePicker',\n    componentProps: {\n      showTime: true,\n      valueFormat: 'YYYY-MM-DD hh:mm:ss',\n    },\n     <#elseif \"int,decimal,double,\"?contains(po.fieldType)>\n    component: 'InputNumber',\n     <#else>\n    component: 'Input',\n    </#if>\n    <#if po.fieldName =='id'><#rt/>\n    show:false,\n    </#if>\n  },\n</#list>\n];\n//子表表格配置\n<#list subTables as sub>\nexport const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [\n<#-- 循环子表的列 开始 -->\n<#list sub.colums as col><#rt/>\n<#if col.filedComment !='外键' >\n    {\n      title: '${col.filedComment}',\n       key: '${col.fieldName}',\n<#if col.fieldType =='date'>\n      type: JVxeTypes.date,\n<#elseif col.fieldType =='datetime'>\n      type: JVxeTypes.datetime,\n<#elseif \"int,decimal,double,\"?contains(col.fieldType)>\n      type: JVxeTypes.inputNumber,\n<#else>\n      type: JVxeTypes.input,\n</#if>\n      width:\"200px\",\n      placeholder: '请输入${'$'}{title}',\n      defaultValue: '',\n<#-- 子表的校验 -->\n<#if col.nullable =='N'>\n      validateRules: [{ required: true, message: '${'$'}{title}不能为空' }],\n</#if>\n    },\n</#if>\n</#list>\n<#-- 循环子表的列 结束 -->\n  ]\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue3/modules/${entityName}Modal.vuei",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"title\" @ok=\"handleSubmit\" width=\"1000px\">\n      <BasicForm @register=\"registerForm\" ref=\"formRef\"/>\n  <!-- 子表单区域 -->\n      <a-tabs v-model:activeKey=\"activeKey\" @change=\"handleChangeTabs\">\n<#list subTables as sub><#rt/>\n  <#assign refKey = sub.entityName?uncap_first/>\n        <a-tab-pane tab=\"${sub.ftlDescription}\" key=\"${refKey}\" :forceRender=\"true\">\n            <JVxeTable\n              keep-source\n              resizable\n              ref=\"${refKey}\"\n              :loading=\"${sub.entityName?uncap_first}Table.loading\"\n              :columns=\"${sub.entityName?uncap_first}Table.columns\"\n              :dataSource=\"${sub.entityName?uncap_first}Table.dataSource\"\n              :height=\"340\"\n              :rowNumber=\"true\"\n              :rowSelection=\"true\"\n              :toolbar=\"true\"\n              />\n        </a-tab-pane>\n</#list>\n      </a-tabs>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n    import {ref, computed, unref,reactive} from 'vue';\n    import {BasicModal, useModalInner} from '/@/components/Modal';\n    import {BasicForm, useForm} from '/@/components/Form/index';\n    import { useJvxeMethod } from '/@/hooks/system/useJvxeMethods.ts'\n    import {formSchema<#list subTables as sub>,${sub.entityName?uncap_first}Columns</#list>} from '../${entityName}.data';\n    import {saveOrUpdate<#list subTables as sub>,${sub.entityName?uncap_first}List</#list>} from '../${entityName}.api';\n    import { VALIDATE_FAILED } from '/@/utils/common/vxeUtils'\n    // Emits声明\n    const emit = defineEmits(['register','success']);\n    const isUpdate = ref(true);\n    const refKeys = ref([<#list subTables as sub>'${sub.entityName?uncap_first}', </#list>]);\n    <#assign hasOne2Many = false>\n    const activeKey = ref('${subTables[0].entityName?uncap_first}');\n<#list subTables as sub>\n    const ${sub.entityName?uncap_first} = ref();\n</#list>\n    const tableRefs = {<#list subTables as sub>${sub.entityName?uncap_first},</#list>};\n   <#list subTables as sub>\n    const ${sub.entityName?uncap_first}Table = reactive({\n          loading: false,\n          dataSource: [],\n          columns:${sub.entityName?uncap_first}Columns\n    })\n   </#list>\n    //表单配置\n    const [registerForm, {setProps,resetFields, setFieldsValue, validate}] = useForm({\n        labelWidth: 150,\n        schemas: formSchema,\n        showActionButtonGroup: false,\n    });\n     //表单赋值\n    const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {\n        //重置表单\n        await reset();\n        setModalProps({confirmLoading: false,showCancelBtn:data?.showFooter,showOkBtn:data?.showFooter});\n        isUpdate.value = !!data?.isUpdate;\n        if (unref(isUpdate)) {\n            //表单赋值\n            await setFieldsValue({\n                ...data.record,\n            });\n            <#list subTables as sub><#rt/>\n             requestSubTableData(${sub.entityName?uncap_first}List, {id:data?.record?.id}, ${sub.entityName?uncap_first}Table)\n            </#list>\n        }\n        // 隐藏底部时禁用整个表单\n       setProps({ disabled: !data?.showFooter })\n    });\n    //方法配置\n    const [handleChangeTabs,handleSubmit,requestSubTableData,formRef] = useJvxeMethod(requestAddOrEdit,classifyIntoFormData,tableRefs,activeKey,refKeys);\n\n    //设置标题\n    const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));\n\n    async function reset(){\n      await resetFields();\n      activeKey.value = '${subTables[0].entityName?uncap_first}';\n      <#list subTables as sub>\n      ${sub.entityName?uncap_first}Table.dataSource = [];\n      </#list>\n    }\n    function classifyIntoFormData(allValues) {\n         let main = Object.assign({}, allValues.formValue)\n         return {\n           ...main, // 展开\n <#assign subManyIndex = 0>\n <#list subTables as sub><#rt/>\n           ${sub.entityName?uncap_first}List: allValues.tablesValue[${subManyIndex}].tableData,\n           <#assign subManyIndex = subManyIndex+1>\n </#list>\n         }\n       }\n\n    //表单提交事件\n    async function requestAddOrEdit(values) {\n        try {\n            setModalProps({confirmLoading: true});\n            //提交表单\n            await saveOrUpdate(values, isUpdate.value);\n            //关闭弹窗\n            closeModal();\n            //刷新列表\n            emit('success');\n        } finally {\n            setModalProps({confirmLoading: false});\n        }\n    }\n</script>\n\n<style lang=\"less\" scoped>\n\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai",
    "content": "package ${bussiPackage}.${entityPackage}.controller;\n\nimport java.io.UnsupportedEncodingException;\nimport java.io.IOException;\nimport java.net.URLDecoder;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.util.oConvertUtils;\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport ${bussiPackage}.${entityPackage}.vo.${entityName}Page;\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.service.I${sub.entityName}Service;\n</#list>\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\nimport com.alibaba.fastjson.JSON;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport org.jeecg.common.aspect.annotation.AutoLog;\n\n /**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Tag(name=\"${tableVo.ftlDescription}\")\n@RestController\n@RequestMapping(\"/${entityPackage}/${entityName?uncap_first}\")\n@Slf4j\npublic class ${entityName}Controller {\n\t@Autowired\n\tprivate I${entityName}Service ${entityName?uncap_first}Service;\n\t<#list subTables as sub>\n\t@Autowired\n\tprivate I${sub.entityName}Service ${sub.entityName?uncap_first}Service;\n\t</#list>\n\t\n\t/**\n\t * 分页列表查询\n\t *\n\t * @param ${entityName?uncap_first}\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-分页列表查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-分页列表查询\")\n\t@GetMapping(value = \"/list\")\n\tpublic Result<?> queryPageList(${entityName} ${entityName?uncap_first},\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t   HttpServletRequest req) {\n\t\tQueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap());\n\t\tPage<${entityName}> page = new Page<${entityName}>(pageNo, pageSize);\n\t\tIPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper);\n\t\treturn Result.OK(pageList);\n\t}\n\t\n\t/**\n\t *   添加\n\t *\n\t * @param ${entityName?uncap_first}Page\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-添加\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-添加\")\n\t@PostMapping(value = \"/add\")\n\tpublic Result<?> add(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) {\n       ${entityName} ${entityName?uncap_first} = new ${entityName}();\n\t\tBeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first});\n\t\t${entityName?uncap_first}Service.save(${entityName?uncap_first});\n\t\treturn Result.OK(\"添加成功！\");\n\t}\n\t\n\t/**\n\t *  编辑\n\t *\n\t * @param ${entityName?uncap_first}Page\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-编辑\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-\")\n\t@RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n\tpublic Result<?> edit(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) {\n\t\t${entityName} ${entityName?uncap_first} = new ${entityName}();\n\t\tBeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first});\n\t\t${entityName?uncap_first}Service.updateById(${entityName?uncap_first});\n\t\treturn Result.OK(\"编辑成功!\");\n\t}\n\t\n\t/**\n\t *   通过id删除\n\t *\n\t * @param id\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-通过id删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id删除\")\n\t@DeleteMapping(value = \"/delete\")\n\tpublic Result<?> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${entityName?uncap_first}Service.delMain(id);\n\t\treturn Result.OK(\"删除成功!\");\n\t}\n\t\n\t/**\n\t *  批量删除\n\t *\n\t * @param ids\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-批量删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-批量删除\")\n\t@DeleteMapping(value = \"/deleteBatch\")\n\tpublic Result<?> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t    this.${entityName?uncap_first}Service.removeByIds(Arrays.asList(ids.split(\",\")));\n\t\treturn Result.OK(\"批量删除成功！\");\n\t}\n\t\n\t/**\n\t * 通过id查询\n\t *\n\t * @param id\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-通过id查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id查询\")\n\t@GetMapping(value = \"/queryById\")\n\tpublic Result<?> queryById(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${entityName} ${entityName?uncap_first} = ${entityName?uncap_first}Service.getById(id);\n\t\treturn Result.OK(${entityName?uncap_first});\n\t}\n\t\n\t//===========================以下是子表信息操作相关API====================================\n\t\n\t<#list subTables as sub>\n\t/**\n\t * 通过主表id查询${sub.ftlDescription}\n\t *\n  \t * @param ${sub.entityName?uncap_first}\n\t * @return\n\t */\n\t@AutoLog(value = \"${sub.ftlDescription}-通过主表id查询\")\n\t@Operation(summary=\"${sub.ftlDescription}-通过主表id查询\")\n\t <#--  update-begin--Author:kangxiaolin  Date:20190905 for：[442]主子表分开维护，生成的代码子表的分页改为真实的分页--------------------          \t -->\n\t@GetMapping(value = \"/list${sub.entityName}ByMainId\")\n\tpublic Result<?> list${sub.entityName}ByMainId(${sub.entityName} ${sub.entityName?uncap_first},\n                \t\t\t\t\t\t\t\t  @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n                \t\t\t\t\t\t\t\t  @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n                \t\t\t\t\t\t\t\t  HttpServletRequest req) {\n        if(<#list sub.foreignKeys as key><#rt/>\n                <#if key?lower_case?index_of(\"${primaryKeyField}\")!=-1><#rt/>\n                     <#if key_index == 0><#rt/>\n${sub.entityName?uncap_first}.get${key?cap_first}()!=null<#rt/>\n                     <#else><#rt/>\n|| ${sub.entityName?uncap_first}.get${key?cap_first}()!=null<#rt/>\n                     </#if><#rt/>\n                 <#else><#rt/>\n                   <#if key_index == 0><#rt/>\n${sub.entityName?uncap_first}.get${key}()!=null<#rt/>\n                     <#else><#rt/>\n|| ${sub.entityName?uncap_first}.get${key}()!=null<#rt/>\n                   </#if><#rt/>\n                </#if>\n         </#list><#rt/>\n) {\n            QueryWrapper<${sub.entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${sub.entityName?uncap_first}, req.getParameterMap());\n            Page<${sub.entityName}> page = new Page<${sub.entityName}>(pageNo, pageSize);\n            IPage<${sub.entityName}> pageList =  ${sub.entityName?uncap_first}Service.page(page, queryWrapper);\n            return Result.OK(pageList);\n        }else{\n            return Result.OK();\n        }\n    }\n    <#--   update-end--Author:kangxiaolin  Date:20190905 for：[442]主子表分开维护，生成的代码子表的分页改为真实的分页--------------------          \t -->\n\t\n\t/**\n     * 添加${sub.ftlDescription}\n     *\n     * @param ${sub.entityName?uncap_first}\n     * @return\n     */\n    @AutoLog(value = \"${sub.ftlDescription}-添加\")\n    @Operation(summary=\"${sub.ftlDescription}-添加\")\n    @PostMapping(value = \"/add${sub.entityName}\")\n    public Result<?> add${sub.entityName}(@RequestBody ${sub.entityName} ${sub.entityName?uncap_first}) {\n        ${sub.entityName?uncap_first}Service.save(${sub.entityName?uncap_first});\n        return Result.OK(\"添加${sub.ftlDescription}成功！\");\n    }\n    \n    /**\n     * 编辑${sub.ftlDescription}\n     *\n     * @param ${sub.entityName?uncap_first}\n     * @return\n     */\n    @AutoLog(value = \"${sub.ftlDescription}-编辑\")\n    @Operation(summary=\"${sub.ftlDescription}-编辑\")\n    @RequestMapping(value = \"/edit${sub.entityName}\", method = {RequestMethod.PUT,RequestMethod.POST})\n    public Result<?> edit${sub.entityName}(@RequestBody ${sub.entityName} ${sub.entityName?uncap_first}) {\n        ${sub.entityName?uncap_first}Service.updateById(${sub.entityName?uncap_first});\n        return Result.OK(\"编辑${sub.ftlDescription}成功！\");\n    }\n    \n    /**\n     * 通过id删除${sub.ftlDescription}\n     *\n     * @param id\n     * @return\n     */\n    @AutoLog(value = \"${sub.ftlDescription}-通过id删除\")\n    @Operation(summary=\"${sub.ftlDescription}-通过id删除\")\n    @DeleteMapping(value = \"/delete${sub.entityName}\")\n    public Result<?> delete${sub.entityName}(@RequestParam(name = \"id\", required = true) String id) {\n       ${sub.entityName?uncap_first}Service.removeById(id);\n        return Result.OK(\"删除${sub.ftlDescription}成功！\");\n    }\n\t\n\t/**\n     * 批量删除${sub.ftlDescription}\n     *\n     * @param ids\n     * @return\n     */\n    @AutoLog(value = \"${sub.ftlDescription}-批量删除\")\n    @Operation(summary=\"${sub.ftlDescription}-批量删除\")\n    @DeleteMapping(value = \"/deleteBatch${sub.entityName}\")\n    public Result<?> deleteBatch${sub.entityName}(@RequestParam(name = \"ids\", required = true) String ids) {\n        if (ids == null || \"\".equals(ids.trim())) {\n            return Result.error(\"参数不识别！\");\n        } \n        this.${sub.entityName?uncap_first}Service.removeByIds(Arrays.asList(ids.split(\",\")));\n       \treturn Result.OK(\"批量删除成功！\");\n\n    }\n    \n\t</#list>\n\n    /**\n    * 导出excel\n    *\n    * @param request\n    * @param ${entityName?uncap_first}\n    */\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) {\n      // Step.1 组装查询条件\n      QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap());\n      LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\n      //Step.2 获取导出数据\n      List<${entityName}Page> pageList = new ArrayList<${entityName}Page>();\n      List<${entityName}> ${entityName?uncap_first}List = ${entityName?uncap_first}Service.list(queryWrapper);\n      for (${entityName} temp : ${entityName?uncap_first}List) {\n          ${entityName}Page vo = new ${entityName}Page();\n          BeanUtils.copyProperties(temp, vo);\n          <#list subTables as sub>\n          List<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(temp.getId());\n          vo.set${sub.entityName}List(${sub.entityName?uncap_first}List);\n          </#list>\n          pageList.add(vo);\n      }\n      //Step.3 调用AutoPoi导出Excel\n      ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n      mv.addObject(NormalExcelConstants.FILE_NAME, \"${tableVo.ftlDescription}\");\n      mv.addObject(NormalExcelConstants.CLASS, ${entityName}Page.class);\n      mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(\"${tableVo.ftlDescription}数据\", \"导出人:\"+sysUser.getRealname(), \"${tableVo.ftlDescription}\"));\n      mv.addObject(NormalExcelConstants.DATA_LIST, pageList);\n      return mv;\n    }\n\n    /**\n    * 通过excel导入数据\n    *\n    * @param request\n    * @param response\n    * @return\n    */\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n      MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n      Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n      for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n          MultipartFile file = entity.getValue();// 获取上传文件对象\n          ImportParams params = new ImportParams();\n          params.setTitleRows(2);\n          params.setHeadRows(1);\n          params.setNeedSave(true);\n          try {\n              List<${entityName}Page> list = ExcelImportUtil.importExcel(file.getInputStream(), ${entityName}Page.class, params);\n              for (${entityName}Page page : list) {\n                  ${entityName} po = new ${entityName}();\n                  BeanUtils.copyProperties(page, po);\n                  ${entityName?uncap_first}Service.saveMain(po, <#list subTables as sub>page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>);\n              }\n              return Result.OK(\"文件导入成功！数据行数:\" + list.size());\n          } catch (Exception e) {\n              log.error(e.getMessage(),e);\n              return Result.error(\"文件导入失败:\"+e.getMessage());\n          } finally {\n              try {\n                  file.getInputStream().close();\n              } catch (IOException e) {\n                  e.printStackTrace();\n              }\n          }\n      }\n      return Result.OK(\"文件导入失败！\");\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai",
    "content": "package ${bussiPackage}.${entityPackage}.entity;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport io.swagger.v3.oas.annotations.media.Schema;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Data\n@TableName(\"${tableName}\")\n@Schema(description=\"${tableVo.ftlDescription}\")\npublic class ${entityName} implements Serializable {\n    private static final long serialVersionUID = 1L;\n    \n    <#list originalColumns as po>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t@TableId(type = IdType.ASSIGN_ID)\n\t</#if>\n  <#if po.fieldType =='java.util.Date'>\n\t<#if po.fieldDbType =='date'>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t<#elseif po.fieldDbType =='datetime'>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n  </#if>\n\t@Schema(description = \"${po.filedComment}\")\n\tprivate <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType}</#if> ${po.fieldName};\n\t</#list>\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}.java\npackage ${bussiPackage}.${entityPackage}.entity;\n\nimport java.io.Serializable;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport io.swagger.v3.oas.annotations.media.Schema;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Data\n@TableName(\"${subTab.tableName}\")\n@Schema(description=\"${tableVo.ftlDescription}\")\npublic class ${subTab.entityName} implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    <#list subTab.originalColumns as po>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t@TableId(type = IdType.ASSIGN_ID)\n\t<#else>\n  <#if po.fieldType =='java.util.Date'>\n\t<#if po.fieldDbType =='date'>\n\t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t<#elseif po.fieldDbType =='datetime'>\n\t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n\t<#else>\n\t<#if !subTab.foreignKeys?seq_contains(po.fieldName?cap_first)>\n    @Excel(name = \"${po.filedComment}\", width = 15)\n    </#if>\n  </#if>\n  </#if>\n\t@Schema(description = \"${po.filedComment}\")\n\tprivate <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType}</#if> ${po.fieldName};\n\t</#list>\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai",
    "content": "package ${bussiPackage}.${entityPackage}.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface ${entityName}Mapper extends BaseMapper<${entityName}> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}Mapper.java\npackage ${bussiPackage}.${entityPackage}.mapper;\n\nimport java.util.List;\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface ${subTab.entityName}Mapper extends BaseMapper<${subTab.entityName}> {\n\n\tpublic boolean deleteByMainId(String mainId);\n    \n\tpublic List<${subTab.entityName}> selectByMainId(String mainId);\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml",
    "content": "<#list subTables as subTab>\n<#assign originalForeignKeys = subTab.originalForeignKeys>\n#segment#${subTab.entityName}Mapper.xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper\">\n\n\t<delete id=\"deleteByMainId\" parameterType=\"java.lang.String\">\n\t\tDELETE \n\t\tFROM  ${subTab.tableName} \n\t\tWHERE\n\t\t<#list originalForeignKeys as key>\n\t\t<#if key?lower_case?index_of(\"${primaryKeyField}\")!=-1>\n\t\t\t ${key} = ${r'#'}{${primaryKeyField}} <#rt/>\n\t\t<#else>\n\t\t\t ${key} = ${r'#'}{${key}} <#rt/>\n\t\t</#if>\n\t\t<#if key_has_next>AND</#if>\n\t\t</#list>\n\t</delete>\n\t\n\t<select id=\"selectByMainId\" parameterType=\"java.lang.String\" resultType=\"${bussiPackage}.${entityPackage}.entity.${subTab.entityName}\">\n\t\tSELECT * \n\t\tFROM  ${subTab.tableName}\n\t\tWHERE\n\t\t<#list originalForeignKeys as key>\n\t\t<#if key?lower_case?index_of(\"${primaryKeyField}\")!=-1>\n\t\t\t ${key} = ${r'#'}{${primaryKeyField}} <#rt/>\n\t\t<#else>\n\t\t\t ${key} = ${r'#'}{${key}} <#rt/>\n\t\t</#if>\n\t\t<#if key_has_next>AND</#if>\n\t\t</#list>\n\t</select>\n</mapper>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service;\n\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport java.io.Serializable;\nimport java.util.Collection;\nimport java.util.List;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface I${entityName}Service extends IService<${entityName}> {\n\n\t/**\n\t * 添加一对多\n\t * \n\t */\n\tpublic void saveMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) ;\n\t\n\t/**\n\t * 修改一对多\n\t * \n\t */\n\tpublic void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>);\n\t\n\t/**\n\t * 删除一对多\n\t */\n\tpublic void delMain (String id);\n\t\n\t/**\n\t * 批量删除一对多\n\t */\n\tpublic void delBatchMain (Collection<? extends Serializable> idList);\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai",
    "content": "<#list subTables as subTab>\n#segment#I${subTab.entityName}Service.java\npackage ${bussiPackage}.${entityPackage}.service;\n\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport java.util.List;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface I${subTab.entityName}Service extends IService<${subTab.entityName}> {\n\n\tpublic List<${subTab.entityName}> selectByMainId(String mainId);\n}\n</#list>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service.impl;\n\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.mapper.${sub.entityName}Mapper;\n</#list>\nimport ${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper;\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.transaction.annotation.Transactional;\nimport java.io.Serializable;\nimport java.util.List;\nimport java.util.Collection;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Service\npublic class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service {\n\n\t@Autowired\n\tprivate ${entityName}Mapper ${entityName?uncap_first}Mapper;\n\t<#list subTables as sub>\n\t@Autowired\n\tprivate ${sub.entityName}Mapper ${sub.entityName?uncap_first}Mapper;\n\t</#list>\n\t\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void saveMain(${entityName} ${entityName?uncap_first}, <#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) {\n\t\t${entityName?uncap_first}Mapper.insert(${entityName?uncap_first});\n\t\t<#list subTables as sub>\n\t\tfor(${sub.entityName} entity:${sub.entityName?uncap_first}List) {\n\t\t\t<#list sub.foreignKeys as key>\n\t\t\t//外键设置\n\t\t\t<#if key?lower_case?index_of(\"${primaryKeyField}\")!=-1>\n\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}());\n\t\t\t<#else>\n\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${key}());\n\t\t\t</#if>\n\t\t\t</#list>\n\t\t\t${sub.entityName?uncap_first}Mapper.insert(entity);\n\t\t}\n\t\t</#list>\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) {\n\t\t${entityName?uncap_first}Mapper.updateById(${entityName?uncap_first});\n\t\t\n\t\t//1.先删除子表数据\n\t\t<#list subTables as sub>\n\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(${entityName?uncap_first}.getId());\n\t\t</#list>\n\t\t\n\t\t//2.子表数据重新插入\n\t\t<#list subTables as sub>\n\t\tfor(${sub.entityName} entity:${sub.entityName?uncap_first}List) {\n\t\t\t<#list sub.foreignKeys as key>\n\t\t\t//外键设置\n\t\t\t<#if key?lower_case?index_of(\"${primaryKeyField}\")!=-1>\n\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}());\n\t\t\t<#else>\n\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${key}());\n\t\t\t</#if>\n\t\t\t</#list>\n\t\t\t${sub.entityName?uncap_first}Mapper.insert(entity);\n\t\t}\n\t\t</#list>\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void delMain(String id) {\n\t\t<#list subTables as sub>\n\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(id);\n\t\t</#list>\n\t\t${entityName?uncap_first}Mapper.deleteById(id);\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void delBatchMain(Collection<? extends Serializable> idList) {\n\t\tfor(Serializable id:idList) {\n\t\t\t<#list subTables as sub>\n\t\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(id.toString());\n\t\t\t</#list>\n\t\t\t${entityName?uncap_first}Mapper.deleteById(id);\n\t\t}\n\t}\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}ServiceImpl.java\npackage ${bussiPackage}.${entityPackage}.service.impl;\n\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport ${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper;\nimport ${bussiPackage}.${entityPackage}.service.I${subTab.entityName}Service;\nimport org.springframework.stereotype.Service;\nimport java.util.List;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Service\npublic class ${subTab.entityName}ServiceImpl extends ServiceImpl<${subTab.entityName}Mapper, ${subTab.entityName}> implements I${subTab.entityName}Service {\n\t\n\t@Autowired\n\tprivate ${subTab.entityName}Mapper ${subTab.entityName?uncap_first}Mapper;\n\t\n\t@Override\n\tpublic List<${subTab.entityName}> selectByMainId(String mainId) {\n\t\treturn ${subTab.entityName?uncap_first}Mapper.selectByMainId(mainId);\n\t}\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai",
    "content": "package ${bussiPackage}.${entityPackage}.vo;\n\nimport java.util.List;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport lombok.Data;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.jeecgframework.poi.excel.annotation.ExcelCollection;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport io.swagger.v3.oas.annotations.media.Schema;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Data\n@Schema(description=\"${tableVo.ftlDescription}\")\npublic class ${entityName}Page {\n\n    <#list originalColumns as po>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t<#else>\n    <#if po.fieldType =='java.util.Date'>\n  \t<#if po.fieldDbType =='date'>\n  \t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n  \t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n  \t<#elseif po.fieldDbType =='datetime'>\n  \t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n  \t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n  \t</#if>\n  \t<#else>\n  \t@Excel(name = \"${po.filedComment}\", width = 15)\n    </#if>\n  </#if>\n\tprivate <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType}</#if> ${po.fieldName};\n\t</#list>\n\n\t<#list subTables as sub>\n\t@ExcelCollection(name=\"${sub.ftlDescription}\")\n\t@Schema(description = \"${sub.ftlDescription}\")\n\tprivate List<${sub.entityName}> ${sub.entityName?uncap_first}List;\n\t</#list>\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei",
    "content": "<template>\n  <a-card :bordered=\"false\">\n\n    <!-- 查询区域 -->\n    <div class=\"table-page-search-wrapper\">\n      <a-form layout=\"inline\" @keyup.enter.native=\"searchQuery\">\n        <a-row :gutter=\"24\">\n<#list columns as po><#rt/>\n<#if po.fieldName !='id' && po_index<= tableVo.searchFieldNum>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <a-form-item label=\"${po.filedComment}\">\n              <a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n            </a-form-item>\n          </a-col>\n</#if>\n</#list>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left;overflow: hidden;\" class=\"table-page-search-submitButtons\">\n              <a-button type=\"primary\" @click=\"searchQuery\" icon=\"search\">查询</a-button>\n              <a-button type=\"primary\" @click=\"searchReset\" icon=\"reload\" style=\"margin-left: 8px\">重置</a-button>\n            </span>\n          </a-col>\n\n        </a-row>\n      </a-form>\n    </div>\n\n    <!-- 操作按钮区域 -->\n    <div class=\"table-operator\">\n      <a-button @click=\"handleAdd\" type=\"primary\" icon=\"plus\">新增</a-button>\n      <a-button type=\"primary\" icon=\"download\" @click=\"handleExportXls('${tableVo.ftlDescription}')\">导出</a-button>\n      <a-upload name=\"file\" :showUploadList=\"false\" :multiple=\"false\" :headers=\"tokenHeader\" :action=\"importExcelUrl\" @change=\"handleImportExcel\">\n        <a-button type=\"primary\" icon=\"import\">导入</a-button>\n      </a-upload>\n      <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n        <a-menu slot=\"overlay\">\n          <a-menu-item key=\"1\" @click=\"batchDel\">\n          <a-icon type=\"delete\"/>删除\n          </a-menu-item>\n        </a-menu>\n        <a-button style=\"margin-left: 8px\"> 批量操作 \n          <a-icon type=\"down\" />\n        </a-button>\n      </a-dropdown>\n    </div>\n\n    <!-- table区域-begin -->\n    <div>\n      <div class=\"ant-alert ant-alert-info\" style=\"margin-bottom: 16px;\">\n        <i class=\"anticon anticon-info-circle ant-alert-icon\"></i>\n        <span>已选择</span>\n        <a style=\"font-weight: 600\">\n          {{ selectedRowKeys.length }}\n        </a>\n        <span>项</span>\n        <a style=\"margin-left: 24px\" @click=\"onClearSelected\">清空</a>\n      </div>\n\n      <a-table\n        ref=\"table\"\n        size=\"middle\"\n        bordered\n        rowKey=\"id\"\n        :columns=\"columns\"\n        :dataSource=\"dataSource\"\n        :pagination=\"ipagination\"\n        :loading=\"loading\"\n        :rowSelection=\"{selectedRowKeys: selectedRowKeys, onChange: onSelectChange,type:type}\"\n        @change=\"handleTableChange\"\n        :customRow=\"clickThenCheck\">\n\n        <span slot=\"action\" slot-scope=\"text, record\">\n          <a @click=\"handleEdit(record)\">编辑</a>\n\n          <a-divider type=\"vertical\" />\n          <a-popconfirm title=\"确定删除吗?\" @confirm=\"() => handleDelete(record.id)\">\n            <a>删除</a>\n          </a-popconfirm>\n        </span>\n\n      </a-table>\n    </div>\n    <!-- table区域-end -->\n    \n    <a-tabs defaultActiveKey=\"1\">\n    <#list subTables as sub><#rt/>\n      <a-tab-pane tab=\"${sub.ftlDescription}\" :key=\"refKeys[${sub_index}]\" :forceRender=\"true\">\n        <${sub.entityName?uncap_first}-List ref=\"${sub.entityName}List\"></${sub.entityName?uncap_first}-List>\n      </a-tab-pane>\n\t</#list>\n    </a-tabs>\n\n    <!-- 表单区域 -->\n    <${entityName?uncap_first}-modal ref=\"modalForm\" @ok=\"modalFormOk\"/>\n\n  </a-card>\n</template>\n\n<script>\n  import { JeecgListMixin } from '@/mixins/JeecgListMixin'\n  import ${entityName}Modal from './modules/${entityName}Modal'\n  import {deleteAction} from '@/api/manage'\n  <#list subTables as sub><#rt/>\n  import ${sub.entityName}List from './${sub.entityName}List'\n  import ${sub.entityName}Modal from './modules/${sub.entityName}Modal'\n  </#list>\n\n  export default {\n    name: \"${entityName}List\",\n    mixins: [JeecgListMixin],\n    components: {\n      ${entityName}Modal,\n    <#list subTables as sub><#rt/>\n      ${sub.entityName}Modal,\n      ${sub.entityName}List,\n\t</#list>\n    },\n    data () {\n      return {\n        refKeys: [<#list subTables as sub>'${sub.entityName?uncap_first}', </#list>],\n        description: '${tableVo.ftlDescription}管理页面',\n        // 表头\n        columns: [\n          {\n            title: '#',\n            dataIndex: '',\n            key: 'rowIndex',\n            width: 60,\n            align: \"center\",\n            customRender:function (t, r, index) {\n              return parseInt(index)+1;\n            }\n          },\n<#list columns as po><#rt/>\n  <#if po.fieldName !='id'>\n          {\n            title: '${po.filedComment}',\n            align:\"center\",\n            dataIndex: '${po.fieldName}'\n          },\n  </#if>\n</#list>\n          {\n            title: '操作',\n            dataIndex: 'action',\n            align:\"center\",\n            scopedSlots: { customRender: 'action' },\n          }\n        ],\n \n        //操作url\n        type: \"radio\",\n        url: {\n          list: \"/${entityPackage}/${entityName?uncap_first}/list\",\n          delete: \"/${entityPackage}/${entityName?uncap_first}/delete\",\n          deleteBatch: \"/${entityPackage}/${entityName?uncap_first}/deleteBatch\",\n          exportXlsUrl: \"${entityPackage}/${entityName?uncap_first}/exportXls\",\n          importExcelUrl: \"${entityPackage}/${entityName?uncap_first}/importExcel\",\n         },\n      }\n    },\n    computed: {\n      importExcelUrl: function(){\n        <#noparse>return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;</#noparse>\n      }\n    },\n    methods: {\n\t\tclickThenCheck(record) {\n        return {\n          on: {\n            click: () => {\n              this.onSelectChange(record.id.split(\",\"), [record]);\n            }\n          }\n        };\n      },\n      onSelectChange(selectedRowKeys, selectionRows) {\n        this.selectedRowKeys = selectedRowKeys;\n        this.selectionRows = selectionRows;\n        <#list subTables as sub><#rt/>\n        this.$refs.${sub.entityName}List.getMain(this.selectedRowKeys[0]);\n        </#list>\n      },\n      onClearSelected() {\n        this.selectedRowKeys = [];\n        this.selectionRows = [];\n        <#list subTables as sub><#rt/>\n        this.$refs.${sub.entityName}List.queryParam.mainId = null;\n        this.$refs.${sub.entityName}List.loadData();\n        this.$refs.${sub.entityName}List.selectedRowKeys = [];\n        this.$refs.${sub.entityName}List.selectionRows = [];\n        </#list>\n      },\n\n      handleDelete: function (id) {\n        var that = this;\n        deleteAction(that.url.delete, {id: id}).then((res) => {\n          if (res.success) {\n            that.$message.success(res.message);\n            that.loadData();\n            <#list subTables as sub><#rt/>\n            this.$refs.${sub.entityName}List.loadData();\n            </#list>\n          } else {\n            that.$message.warning(res.message);\n          }\n        });\n      },\n      searchQuery:function(){\n        this.selectedRowKeys = [];\n        this.selectionRows = [];\n        <#list subTables as sub><#rt/>\n        this.$refs.${sub.entityName}List.queryParam.mainId = null;\n        this.$refs.${sub.entityName}List.loadData();\n        this.$refs.${sub.entityName}List.selectedRowKeys = [];\n        this.$refs.${sub.entityName}List.selectionRows = [];\n        </#list>\n        this.loadData();\n      }\n    }\n  }\n</script>\n<style scoped>\n  @import '~@assets/less/common.less'\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/[1-n]List.vuei",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}List.vue\n<template>\n  <a-card :bordered=\"false\">\n\n    <!-- 操作按钮区域 -->\n    <div class=\"table-operator\" :md=\"24\" :sm=\"24\" style=\"margin: 0px 0px 20px 0px\">\n      <a-button @click=\"handleAdd\" type=\"primary\" icon=\"plus\">新增</a-button>\n\n      <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n        <a-menu slot=\"overlay\">\n          <a-menu-item key=\"1\" @click=\"batchDel\">\n            <a-icon type=\"delete\"/>删除\n          </a-menu-item>\n        </a-menu>\n        <a-button style=\"margin-left: 8px\"> 批量操作\n          <a-icon type=\"down\"/>\n        </a-button>\n      </a-dropdown>\n    </div>\n\n    <!-- table区域-begin -->\n    <div>\n      <div class=\"ant-alert ant-alert-info\" style=\"margin-bottom: 16px;\">\n        <i class=\"anticon anticon-info-circle ant-alert-icon\"></i> 已选择 <a style=\"font-weight: 600\">{{ selectedRowKeys.length }}</a>项\n        <a style=\"margin-left: 24px\" @click=\"onClearSelected\">清空</a>\n      </div>\n\n      <a-table\n        ref=\"table\"\n        size=\"middle\"\n        bordered\n        rowKey=\"id\"\n        :columns=\"columns\"\n        :dataSource=\"dataSource\"\n        :pagination=\"ipagination\"\n        :loading=\"loading\"\n        :rowSelection=\"{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}\"\n        @change=\"handleTableChange\">\n\n        <span slot=\"action\" slot-scope=\"text, record\">\n          <a @click=\"handleEdit(record)\">编辑</a>\n          <a-divider type=\"vertical\"/>\n          <a-dropdown>\n            <a class=\"ant-dropdown-link\">\n              更多 <a-icon type=\"down\"/>\n            </a>\n            <a-menu slot=\"overlay\">\n              <a-menu-item>\n                <a href=\"javascript:;\" @click=\"handleDetail(record)\">详情</a>\n              </a-menu-item>\n              <a-menu-item>\n                <a-popconfirm title=\"确定删除吗?\" @confirm=\"() => handleDelete(record.id)\">\n                  <a>删除</a>\n                </a-popconfirm>\n              </a-menu-item>\n            </a-menu>\n          </a-dropdown>\n        </span>\n\n      </a-table>\n    </div>\n    <!-- table区域-end -->\n\n    <!-- 表单区域 -->\n    <${subTab.entityName}-modal ref=\"modalForm\" @ok=\"modalFormOk\"/>\n  </a-card>\n</template>\n\n<script>\n  import ${subTab.entityName}Modal from './modules/${subTab.entityName}Modal'\n  import {JeecgListMixin} from '@/mixins/JeecgListMixin'\n  import {getAction} from '@/api/manage'\n\n  export default {\n    name: \"${subTab.entityName}List\",\n    mixins: [JeecgListMixin],\n    components: {\n      ${subTab.entityName}Modal,\n    },\n    data() {\n      return {\n        description: '信息',\n        // 表头\n        columns: [\n        <#list subTab.colums as po><#rt/>\n  <#if po.fieldName !='id' && subTab.foreignKeys[0]?uncap_first != po.fieldName>\n          {\n            title: '${po.filedComment}',\n            align:\"center\",\n            dataIndex: '${po.fieldName}'\n          },\n  </#if>\n</#list>\n         {\n          title: '操作',\n          key: 'operation',\n          align: \"center\",\n          width: 130,\n          scopedSlots: {customRender: 'action'},\n        }],\n        url: {\n          list: \"/${entityPackage}/${entityName?uncap_first}/list${subTab.entityName}ByMainId\",\n          delete: \"/${entityPackage}/${entityName?uncap_first}/delete${subTab.entityName}\",\n          deleteBatch: \"/${entityPackage}/${entityName?uncap_first}/deleteBatch${subTab.entityName}\",\n        }\n      }\n    },\n    methods: {\n      loadData(arg) {\n        if (arg === 1) {\n          this.ipagination.current = 1;\n        }\n        var params = this.getQueryParams();\n        <#-- update-begin--Author:kangxiaolin  Date:20190905 for：[442]主子表分开维护，生成的代码子表的分页改为真实的分页-------------------- -->\n        getAction(this.url.list, {  <#list subTab.foreignKeys as key>  <#if key?lower_case?index_of(\"${primaryKeyField}\")!=-1>${key?uncap_first} </#if>                  </#list>   : params.mainId\n        , pageNo : this.ipagination.current, pageSize :this.ipagination.pageSize}).then((res) => {\n          if (res.success) {\n           this.dataSource = res.result.records;\n           this.ipagination.total = res.result.total;\n          } else {\n            this.dataSource = null;\n          }\n        })\n         <#-- update-end--Author:kangxiaolin  Date:20190905 for：[442]主子表分开维护，生成的代码子表的分页改为真实的分页-------------------- -->\n      },\n      getMain(mainId) {\n        this.queryParam.mainId = mainId;\n        this.loadData(1);\n      },\n      handleAdd: function () {\n        this.$refs.modalForm.add(this.queryParam.mainId);\n        this.$refs.modalForm.title = \"添加${subTab.ftlDescription}\";\n      },\n    }\n  }\n</script>\n<style scoped>\n  .ant-card {\n    margin-left: -30px;\n    margin-right: -30px;\n  }\n</style>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei",
    "content": "<template>\n  <j-modal\n    :title=\"title\"\n    :width=\"1000\"\n    :visible=\"visible\"\n    :confirmLoading=\"confirmLoading\"\n    switchFullscreen\n    @ok=\"handleOk\"\n    @cancel=\"handleCancel\">\n    <a-spin :spinning=\"confirmLoading\">\n      <!-- 主表单区域 -->\n      <a-form :form=\"form\">\n\t\t<#list columns as po><#rt/>\n        <#if po.fieldName !='id'><#rt/>\n        <a-form-item\n          :labelCol=\"labelCol\"\n          :wrapperCol=\"wrapperCol\"\n          label=\"${po.filedComment}\">\n          <#if po.fieldType =='date'>\n          <a-date-picker v-decorator=\"[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]\" />\n          <#elseif po.fieldType =='datetime'>\n          <a-date-picker showTime format=\"YYYY-MM-DD HH:mm:ss\" v-decorator=\"[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]\" />\n          <#elseif \"int,decimal,double,\"?contains(po.fieldType)>\n          <a-input-number v-decorator=\"[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]\" />\n          <#else>\n          <a-input placeholder=\"请输入${po.filedComment}\" v-decorator=\"['${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]\" />\n          </#if>\n        </a-form-item>\n        </#if>\n        </#list>\n      </a-form>\n    </a-spin>\n  </j-modal>\n</template>\n\n<script>\n  import {httpAction} from '@/api/manage'\n  import JDate from '@/components/jeecg/JDate'\n  import pick from 'lodash.pick'\n  import moment from \"moment\"\n\n  export default {\n    name: '${entityName}Modal',\n    components: {\n      JDate\n    },\n    data() {\n      return {\n        title: \"操作\",\n        visible: false,\n        model: {},\n        labelCol: {\n          xs: {span: 24},\n          sm: {span: 5},\n        },\n        wrapperCol: {\n          xs: {span: 24},\n          sm: {span: 16},\n        },\n        confirmLoading: false,\n        form: this.$form.createForm(this),\n        validatorRules: {\n<#list columns as po>\n  <#if po.fieldName !='id'>\n    <#if po.nullable =='N'>\n          ${po.fieldName}: { rules: [{ required: true, message: '请输入${po.filedComment}!' }] },\n    </#if>\n  </#if>\n</#list>\n        },\n        url: {\n          add: \"/${entityPackage}/${entityName?uncap_first}/add\",\n          edit: \"/${entityPackage}/${entityName?uncap_first}/edit\",\n<#list subTables as sub><#rt/>\n          ${sub.entityName?uncap_first}List: '/${entityPackage}/${entityName?uncap_first}/query${sub.entityName}ByMainId',\n</#list>\n        }\n      }\n    },\n    methods: {\n      add() {\n        this.edit({});\n      },\n      edit(record) {\n        this.form.resetFields();\n        this.model = Object.assign({}, record);\n        //初始化明细表数据\n        console.log(this.model.id)\n        this.visible = true;\n        this.$nextTick(() => {\n          this.form.setFieldsValue(pick(this.model, <#list columns as col>'${col.fieldName}', </#list>))\n          // 时间格式化\n<#list columns as col><#rt/>\n\t<#if col.fieldName !='id' && (col.fieldType =='date' || col.fieldType =='datetime')>\n          this.form.setFieldsValue({ ${col.fieldName}: this.model.${col.fieldName} ? moment(this.model.${col.fieldName}) : null })\n\t</#if>\n</#list>  \n        });\n      },\n      close() {\n        this.$emit('close');\n        this.visible = false;\n      },\n      handleOk() {\n        const that = this;\n        // 触发表单验证\n        this.form.validateFields((err, values) => {\n          if (!err) {\n            that.confirmLoading = true;\n            let httpurl = '';\n            let method = '';\n            if (!this.model.id) {\n              httpurl += this.url.add;\n              method = 'post';\n            } else {\n              httpurl += this.url.edit;\n              method = 'put';\n            }\n            let formData = Object.assign(this.model, values);\n            //时间格式化\n            <#list columns as po>\n            <#if po.fieldName !='id' && po.fieldType =='date'>\n            formData.${po.fieldName} = formData.${po.fieldName}?formData.${po.fieldName}.format():null;\n            <#elseif po.fieldName !='id' && po.fieldType =='datetime'>\n            formData.${po.fieldName} = formData.${po.fieldName}?formData.${po.fieldName}.format('YYYY-MM-DD HH:mm:ss'):null;\n            </#if>\n            </#list>\n            httpAction(httpurl, formData, method).then((res) => {\n              if (res.success) {\n                 that.$message.success(res.message);\n                 that.$emit('ok');\n               } else {\n                 that.$message.warning(res.message);\n               }\n             }).finally(() => {\n               that.confirmLoading = false;\n               that.close();\n             })\n           }\n        })\n      },\n      handleCancel() {\n        this.close()\n      }\n    }\n  }\n</script>\n\n<style scoped>\n  .ant-btn {\n    padding: 0 10px;\n    margin-left: 3px;\n  }\n\n  .ant-form-item-control {\n    line-height: 0px;\n  }\n\n  /** 主表单行间距 */\n  .ant-form .ant-form-item {\n    margin-bottom: 10px;\n  }\n\n  /** Tab页面行间距 */\n  .ant-tabs-content .ant-form-item {\n    margin-bottom: 0px;\n  }\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Modal.vuei",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}Modal.vue\n<template>\n  <j-modal\n    :title=\"title\"\n    :width=\"800\"\n    :visible=\"visible\"\n    :okButtonProps=\"{ props: {disabled: disableSubmit} }\"\n    :confirmLoading=\"confirmLoading\"\n    switchFullscreen\n    @ok=\"handleOk\"\n    @cancel=\"handleCancel\"\n    cancelText=\"关闭\">\n    <a-spin :spinning=\"confirmLoading\">\n      <a-form :form=\"form\">\n<#list subTab.colums as po><#rt/>\n\n<#if po.fieldName !='id' && po.filedComment !='外键'><#rt/>\n        <a-form-item\n          :labelCol=\"labelCol\"\n          :wrapperCol=\"wrapperCol\"\n          label=\"${po.filedComment}\"\n          <#if subTab.foreignKeys[0]?uncap_first == po.fieldName>\n          :hidden=\"hiding\"\n          </#if>\n          hasFeedback>\n          <#if po.fieldType =='date'>\n          <a-date-picker v-decorator=\"[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]\" />\n          <#elseif po.fieldType =='datetime'>\n          <a-date-picker showTime format=\"YYYY-MM-DD HH:mm:ss\" v-decorator=\"[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]\" />\n          <#elseif \"int,decimal,double,\"?contains(po.fieldType)>\n          <a-input-number v-decorator=\"[ '${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]\" />\n          <#else>\n          <#if subTab.foreignKeys[0]?uncap_first == po.fieldName>\n          <a-input placeholder=\"请输入${po.filedComment}\" v-decorator=\"['${po.fieldName}', {'initialValue':this.mainId}]\" />\n          <#else>\n          <a-input placeholder=\"请输入${po.filedComment}\" v-decorator=\"['${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]\" />\n          </#if>\n          </#if>\n        </a-form-item>\n</#if>\n</#list>\n      </a-form>\n    </a-spin>\n  </j-modal>\n</template>\n\n<script>\n  import {httpAction} from '@/api/manage'\n  import pick from 'lodash.pick'\n  import moment from 'moment'\n  import JDate from '@/components/jeecg/JDate'\n\n  export default {\n    components: {\n      JDate\n    },\n    name: '${subTab.entityName}Modal',\n    data() {\n      return {\n        title: '操作',\n        visible: false,\n        model: {},\n        labelCol: {\n          xs: {span: 24},\n          sm: {span: 5}\n        },\n        wrapperCol: {\n          xs: {span: 24},\n          sm: {span: 16}\n        },\n        moment,\n        format: 'YYYY-MM-DD HH:mm:ss',\n        disableSubmit: false,\n        mainId: '',\n        hiding: false,\n        confirmLoading: false,\n        form: this.$form.createForm(this),\n        validatorRules: {\n  <#list subTab.colums as po>\n  <#if po.fieldName !='id' && subTab.foreignKeys[0]?uncap_first != po.fieldName>\n    <#if po.nullable =='N'>\n          ${po.fieldName}: { rules: [{ required: true, message: '请输入${po.filedComment}!' }] },\n    </#if>\n  </#if>\n</#list>\n        },\n        url: {\n          add: '/${entityPackage}/${entityName?uncap_first}/add${subTab.entityName}',\n          edit: '/${entityPackage}/${entityName?uncap_first}/edit${subTab.entityName}'\n        }\n      }\n    },\n    created() {\n    },\n    methods: {\n      add(mainId) {\n        if (mainId) {\n          this.edit({mainId}, '')\n        } else {\n          this.$message.warning('请选择一条数据')\n        }\n      },\n      detail(record) {\n        this.edit(record, 'd')\n      },\n      edit(record, v) {\n        if (v == 'e') {\n          this.hiding = false;\n          this.disableSubmit = false;\n        } else if (v == 'd') {\n          this.hiding = false;\n          this.disableSubmit = true;\n        } else {\n          this.hiding = true;\n          this.disableSubmit = false;\n        }\n        this.form.resetFields();\n        this.mainId = record.mainId;\n        this.model = Object.assign({}, record);\n        this.visible = true;\n        this.$nextTick(() => {\n          this.form.setFieldsValue(pick(this.model, <#list subTab.colums as col>'${col.fieldName}', </#list>))\n          // 时间格式化\n<#list subTab.colums as col><#rt/>\n\t<#if col.fieldName !='id' && (col.fieldType =='date' || col.fieldType =='datetime')>\n          this.form.setFieldsValue({ ${col.fieldName}: this.model.${col.fieldName} ? moment(this.model.${col.fieldName}) : null })\n\t</#if>\n</#list>  \n        })\n      },\n      close() {\n        this.$emit('close');\n        this.visible = false;\n      },\n      handleOk() {\n        const that = this;\n        // 触发表单验证\n        this.form.validateFields((err, values) => {\n          if (!err) {\n            that.confirmLoading = true;\n            let httpurl = '';\n            let method = '';\n            if (!this.model.id) {\n              httpurl += this.url.add;\n              method = 'post';\n            } else {\n              httpurl += this.url.edit;\n              method = 'put';\n            }\n            let formData = Object.assign(this.model, values);\n            //时间格式化\n            <#list subTab.colums as po>\n            <#if po.fieldName !='id' && po.fieldType =='date'>\n            formData.${po.fieldName} = formData.${po.fieldName}?formData.${po.fieldName}.format():null;\n            <#elseif po.fieldName !='id' && po.fieldType =='datetime'>\n            formData.${po.fieldName} = formData.${po.fieldName}?formData.${po.fieldName}.format('YYYY-MM-DD HH:mm:ss'):null;\n            </#if>\n            </#list>\n            httpAction(httpurl, formData, method).then((res) => {\n              if (res.success) {\n                that.$message.success(res.message);\n                that.$emit('ok');\n              } else {\n                that.$message.warning(res.message);\n              }\n            }).finally(() => {\n              that.confirmLoading = false;\n              that.close();\n            })\n          }\n        })\n      },\n      handleCancel() {\n        this.close();\n      }\n    }\n  }\n</script>\n\n<style scoped>\n\n</style>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei",
    "content": "<template>\n   <div>\n    <!--引用表格-->\n   <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n     <!--插槽:table标题-->\n      <template #tableTitle>\n          <a-button type=\"primary\" @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\"> 新增</a-button>\n          <a-button  type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n          <j-upload-button  type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n          <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n              <template #overlay>\n                <a-menu>\n                  <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                    <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                    删除\n                  </a-menu-item>\n                </a-menu>\n              </template>\n              <a-button>批量操作\n                <Icon icon=\"mdi:chevron-down\"></Icon>\n              </a-button>\n        </a-dropdown>\n      </template>\n       <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\"/>\n      </template>\n    </BasicTable>\n    <a-tabs :defaultActiveKey=\"refKeys[0]\" style=\"margin: 10px\">\n        <#list subTables as sub><#rt/>\n          <a-tab-pane tab=\"${sub.ftlDescription}\" :key=\"refKeys[${sub_index}]\" :forceRender=\"true\">\n            <${sub.entityName}List></${sub.entityName}List>\n          </a-tab-pane>\n    \t</#list>\n    </a-tabs>\n\n    <!-- 表单区域 -->\n    <${entityName}Modal @register=\"registerModal\" @success=\"handleSuccess\"></${entityName}Modal>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import {ref, computed, unref,provide} from 'vue';\n  import {BasicTable, useTable, TableAction} from '/@/components/Table';\n<#list subTables as sub><#rt/>\n  import ${sub.entityName}List from './${sub.entityName}List.vue'\n</#list>\n  import { useListPage } from '/@/hooks/system/useListPage'\n  import {useModal} from '/@/components/Modal';\n  import ${entityName}Modal from './modules/${entityName}Modal.vue'\n  import {columns, searchFormSchema} from './${entityName}.data';\n  import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './${entityName}.api';\n\n  const refKeys = ref([<#list subTables as sub>'${sub.entityName?uncap_first}', </#list>]);\n  //注册model\n  const [registerModal, {openModal}] = useModal();\n   //注册table数据\n  const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({\n      tableProps:{\n           title: '${tableVo.ftlDescription}',\n           api: list,\n           columns,\n           canResize: true,\n           rowSelection: {type: 'radio'},\n           formConfig: {\n                labelWidth: 120,\n                schemas: searchFormSchema,\n                autoSubmitOnEnter:true,\n                showAdvancedButton:true,\n            },\n            actionColumn: {\n               width: 120,\n            },\n        },\n        exportConfig: {\n            name:\"${tableVo.ftlDescription}\",\n            url: getExportUrl,\n        },\n        importConfig: {\n            url: getImportUrl\n        },\n    })\n\n  const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext\n\n  const mainId = computed(() => (unref(selectedRowKeys).length > 0 ? unref(selectedRowKeys)[0] : ''));\n\n  //下发 orderId,子组件接收\n  provide('mainId', mainId);\n\n   /**\n    * 新增事件\n    */\n  function handleAdd() {\n     openModal(true, {\n       isUpdate: false,\n       showFooter: true,\n     });\n  }\n   /**\n    * 编辑事件\n    */\n  function handleEdit(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: true,\n     });\n   }\n   /**\n    * 详情\n   */\n  function handleDetail(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: false,\n     });\n   }\n   /**\n    * 删除事件\n    */\n  async function handleDelete(record) {\n     await deleteOne({id: record.id}, reload);\n   }\n   /**\n    * 批量删除事件\n    */\n  async function batchHandleDelete() {\n     await batchDelete({ids: selectedRowKeys.value}, reload);\n   }\n   /**\n    * 成功回调\n    */\n  function handleSuccess() {\n      reload();\n   }\n   /**\n      * 操作栏\n      */\n  function getTableAction(record){\n       return [\n         {\n           label: '编辑',\n           onClick: handleEdit.bind(null, record),\n         }\n       ]\n   }\n     /**\n        * 下拉操作栏\n        */\n  function getDropDownAction(record){\n      return [\n           {\n             label: '详情',\n             onClick: handleDetail.bind(null, record),\n           }, {\n             label: '删除',\n             popConfirm: {\n               title: '是否确认删除',\n               confirm: handleDelete.bind(null, record),\n             }\n           }\n      ]\n   }\n</script>\n\n<style scoped>\n\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi",
    "content": "import {defHttp} from '/@/utils/http/axios';\nimport {Modal} from 'ant-design-vue';\n\nenum Api {\n  list = '/${entityPackage}/${entityName?uncap_first}/list',\n  save='/${entityPackage}/${entityName?uncap_first}/add',\n  edit='/${entityPackage}/${entityName?uncap_first}/edit',\n  deleteOne = '/${entityPackage}/${entityName?uncap_first}/delete',\n  deleteBatch = '/${entityPackage}/${entityName?uncap_first}/deleteBatch',\n  importExcel = '/${entityPackage}/${entityName?uncap_first}/importExcel',\n  exportXls = '/${entityPackage}/${entityName?uncap_first}/exportXls',\n<#list subTables as sub><#rt/>\n  ${sub.entityName?uncap_first}List = '/${entityPackage}/${entityName?uncap_first}/list${sub.entityName}ByMainId',\n  ${sub.entityName?uncap_first}Save='/${entityPackage}/${entityName?uncap_first}/add${sub.entityName}',\n  ${sub.entityName?uncap_first}Edit='/${entityPackage}/${entityName?uncap_first}/edit${sub.entityName}',\n  ${sub.entityName?uncap_first}Delete = '/${entityPackage}/${entityName?uncap_first}/delete${sub.entityName}',\n  ${sub.entityName?uncap_first}DeleteBatch = '/${entityPackage}/${entityName?uncap_first}/deleteBatch${sub.entityName}',\n</#list>\n}\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) =>\n  defHttp.get({url: Api.list, params});\n\n/**\n * 删除单个\n * @param params\n * @param handleSuccess\n */\nexport const deleteOne = (params,handleSuccess) => {\n  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n/**\n * 批量删除\n * @param params\n * @param handleSuccess\n */\nexport const batchDelete = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n/**\n * 保存或者更新\n * @param params\n * @param isUpdate 是否是更新数据\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({url: url, params});\n}\n\n<#list subTables as sub><#rt/>\n/**\n * 列表接口\n * @param params\n */\nexport const ${sub.entityName?uncap_first}List = (params) =>\n  defHttp.get({url: Api.${sub.entityName?uncap_first}List, params});\n\n/**\n * 删除单个\n */\nexport const ${sub.entityName?uncap_first}Delete = (params,handleSuccess) => {\n  return defHttp.delete({url: Api.${sub.entityName?uncap_first}Delete, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n/**\n * 批量删除\n * @param params\n */\nexport const  ${sub.entityName?uncap_first}DeleteBatch = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({url: Api. ${sub.entityName?uncap_first}DeleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n/**\n * 保存或者更新\n * @param params\n */\nexport const ${sub.entityName?uncap_first}Save = (params, isUpdate) => {\n  let url = isUpdate ? Api.${sub.entityName?uncap_first}Edit : Api.${sub.entityName?uncap_first}Save;\n  return defHttp.post({url: url, params});\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi",
    "content": "import {BasicColumn} from '/@/components/Table';\nimport {FormSchema} from '/@/components/Table';\nimport { rules} from '/@/utils/helper/validator';\nimport { render } from '/@/utils/common/renderUtils';\n//列表数据\nexport const columns: BasicColumn[] = [\n <#list columns as po>\n   <#if po.fieldName !='id'>\n   {\n    title: '${po.filedComment}',\n    align:\"center\",\n    <#if po.classType=='date'>\n    dataIndex: '${po.fieldName}',\n    customRender:({text}) =>{\n      return !text?\"\":(text.length>10?text.substr(0,10):text)\n    },\n   <#else>\n    dataIndex: '${po.fieldName}'\n   </#if>\n   },\n   </#if>\n </#list>\n];\n//查询数据\nexport const searchFormSchema: FormSchema[] = [\n<#list columns as po>\n<#if po.fieldName !='id' && po_index<= tableVo.searchFieldNum>\n {\n    label: '${po.filedComment}',\n    field: '${po.fieldName}',\n     <#if po.fieldType =='date'>\n    component: 'DatePicker'\n     <#elseif po.fieldType =='datetime'>\n    component: 'TimePicker'\n     <#elseif \"int,decimal,double,\"?contains(po.fieldType)>\n    component: 'InputNumber'\n     <#else>\n    component: 'Input'\n    </#if>\n  },\n</#if>\n</#list>\n];\n\nexport const formSchema: FormSchema[] = [\n  // TODO 主键隐藏字段，目前写死为ID\n  {label: '', field: 'id', component: 'Input', show: false},\n<#list columns as po><#rt/>\n  {\n    label: '${po.filedComment}',\n    field: '${po.fieldName}',\n     <#if po.fieldType =='date'>\n    component: 'DatePicker'\n     <#elseif po.fieldType =='datetime'>\n    component: 'DatePicker',\n    componentProps: {\n      showTime: true,\n      valueFormat: 'YYYY-MM-DD hh:mm:ss',\n    },\n     <#elseif \"int,decimal,double,\"?contains(po.fieldType)>\n    component: 'InputNumber',\n     <#else>\n    component: 'Input',\n    </#if>\n    <#if po.fieldName =='id'><#rt/>\n    show:false,\n    </#if>\n  },\n</#list>\n];\n\n//子表表格配置\n<#list subTables as sub>\n//列表数据\nexport const ${sub.entityName?uncap_first}Columns: BasicColumn[] = [\n <#list sub.colums as po><#rt/>\n   <#if po.fieldName !='id' && sub.foreignKeys[0]?uncap_first != po.fieldName>\n   {\n    title: '${po.filedComment}',\n    align:\"center\",\n    <#if po.classType=='date'>\n    dataIndex: '${po.fieldName}',\n    customRender:({text}) =>{\n      return !text?\"\":(text.length>10?text.substr(0,10):text)\n    },\n   <#else>\n    dataIndex: '${po.fieldName}',\n   </#if>\n   },\n   </#if>\n </#list>\n];\n\nexport const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [\n   // TODO 主键隐藏字段，目前写死为ID\n   {label: '', field: 'id', component: 'Input', show: false},\n<#-- 循环子表的列 开始 -->\n<#list sub.colums as po><#rt/>\n<#if po.filedComment !='外键' >\n   {\n       label: '${po.filedComment}',\n       field: '${po.fieldName}',\n        <#if po.fieldType =='date'>\n       component: 'DatePicker',\n        <#elseif po.fieldType =='datetime'>\n       component: 'DatePicker',\n       componentProps: {\n         showTime: true,\n         valueFormat: 'YYYY-MM-DD hh:mm:ss',\n       },\n        <#elseif \"int,decimal,double,\"?contains(po.fieldType)>\n       component: 'InputNumber',\n        <#else>\n       component: 'Input',\n       </#if>\n       <#if po.fieldName =='id'><#rt/>\n       show:false,\n       </#if>\n     },\n</#if>\n</#list>\n<#-- 循环子表的列 结束 -->\n  ]\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue3/[1-n]List.vuei",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}List.vue\n<template>\n  <div>\n     <!--table区域-begin-->\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--插槽:table标题-->\n       <template #tableTitle>\n           <a-button type=\"primary\" @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\"> 新增</a-button>\n           <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n               <template #overlay>\n                 <a-menu>\n                   <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                     <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                     删除\n                   </a-menu-item>\n                 </a-menu>\n               </template>\n               <a-button>批量操作\n                 <Icon icon=\"mdi:chevron-down\"></Icon>\n               </a-button>\n         </a-dropdown>\n       </template>\n        <!--操作栏-->\n       <template #action=\"{ record }\">\n         <TableAction :actions=\"getTableAction(record)\"/>\n       </template>\n     </BasicTable>\n    <!-- table区域-end -->\n\n    <!-- 表单区域 -->\n    <${subTab.entityName}Modal @register=\"registerModal\" @success=\"handleSuccess\"/>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import {ref, computed, unref, watch, inject} from 'vue';\n  import ${subTab.entityName}Modal from './modules/${subTab.entityName}Modal.vue'\n  import {BasicTable, useTable, TableAction} from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage'\n  import {useModal} from '/@/components/Modal';\n  import {isEmpty} from \"/@/utils/is\";\n  import {useMessage} from '/@/hooks/web/useMessage';\n  import {${subTab.entityName?uncap_first}Columns} from './${entityName}.data';\n  import {${subTab.entityName?uncap_first}List, ${subTab.entityName?uncap_first}Delete, ${subTab.entityName?uncap_first}DeleteBatch} from './${entityName}.api';\n //提示弹窗\n  const $message = useMessage()\n  //接收主表id\n  const mainId = inject('mainId') || '';\n  //查询参数\n  const searchInfo = ref({});\n  //注册model\n  const [registerModal, {openModal}] = useModal();\n // 列表页面公共参数、方法\n  const {prefixCls, tableContext} = useListPage({\n        tableProps: {\n            api: ${subTab.entityName?uncap_first}List,\n            columns: ${subTab.entityName?uncap_first}Columns,\n            canResize: true,\n            useSearchForm: false,\n            searchInfo,\n            actionColumn: {\n                width: 180,\n            }\n        },\n    });\n\n    //注册table数据\n    const [registerTable, {reload}, {rowSelection, selectedRowKeys}] = tableContext;\n\n    watch(mainId, () => {\n            searchInfo.value['${subTab.foreignKeys[0]?uncap_first}'] = unref(mainId);\n            reload();\n        }\n    );\n\n    /**\n     * 新增事件\n     */\n    function handleAdd() {\n        if (isEmpty(unref(mainId))) {\n            $message.createMessage.warning('请选择一个主表信息')\n            return;\n        }\n        openModal(true, {\n            isUpdate: false,\n            showFooter: true,\n        });\n    }\n\n    /**\n     * 编辑事件\n     */\n    async function handleEdit(record: Recordable) {\n        openModal(true, {\n            record,\n            isUpdate: true,\n            showFooter: true,\n        });\n    }\n\n    /**\n     * 删除事件\n     */\n    async function handleDelete(record) {\n        await ${subTab.entityName?uncap_first}Delete({id: record.id}, reload);\n    }\n\n    /**\n     * 批量删除事件\n     */\n    async function batchHandleDelete() {\n        await ${subTab.entityName?uncap_first}DeleteBatch({ids: selectedRowKeys.value}, () => {\n            selectedRowKeys.value = []\n            reload()\n        })\n    }\n\n    /**\n     * 成功回调\n     */\n    function handleSuccess() {\n        reload();\n    }\n\n    /**\n     * 操作栏\n     */\n    function getTableAction(record) {\n        return [\n            {\n                label: '编辑',\n                onClick: handleEdit.bind(null, record),\n            }, {\n                label: '删除',\n                popConfirm: {\n                    title: '是否确认删除',\n                    confirm: handleDelete.bind(null, record),\n                },\n            }\n        ]\n    }\n</script>\n<style scoped>\n\n</style>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue3/modules/${entityName}Modal.vuei",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"title\" @ok=\"handleSubmit\" width=\"40%\">\n         <BasicForm @register=\"registerForm\"/>\n     </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n    import {ref, computed, unref} from 'vue';\n    import {BasicModal, useModalInner} from '/@/components/Modal';\n    import {BasicForm, useForm} from '/@/components/Form/index';\n    import {formSchema} from '../${entityName}.data';\n    import {saveOrUpdate} from '../${entityName}.api';\n    // Emits声明\n    const emit = defineEmits(['register','success']);\n    const isUpdate = ref(true);\n    //表单配置\n    const [registerForm, {resetFields, setFieldsValue, validate}] = useForm({\n        labelWidth: 150,\n        schemas: formSchema,\n        showActionButtonGroup: false,\n    });\n    //表单赋值\n    const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {\n        //重置表单\n        await resetFields();\n        setModalProps({confirmLoading: false,showCancelBtn:data?.showFooter,showOkBtn:data?.showFooter});\n        isUpdate.value = !!data?.isUpdate;\n        if (unref(isUpdate)) {\n            //表单赋值\n            await setFieldsValue({\n                ...data.record,\n            });\n        }\n    });\n    //设置标题\n    const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));\n    //表单提交事件\n    async function handleSubmit(v) {\n        try {\n            let values = await validate();\n            setModalProps({confirmLoading: true});\n            //提交表单\n            await saveOrUpdate(values, isUpdate.value);\n            //关闭弹窗\n            closeModal();\n            //刷新列表\n            emit('success');\n        } finally {\n            setModalProps({confirmLoading: false});\n        }\n    }\n</script>\n\n<style lang=\"less\" scoped>\n\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue3/modules/[1-n]Modal.vuei",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}Modal.vue\n<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"title\" @ok=\"handleSubmit\" width=\"40%\">\n         <BasicForm @register=\"registerForm\"/>\n     </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n    import {ref, computed, unref,inject} from 'vue';\n    import {BasicModal, useModalInner} from '/@/components/Modal';\n    import {BasicForm, useForm} from '/@/components/Form/index';\n    import {${subTab.entityName?uncap_first}FormSchema} from '../${entityName}.data';\n    import {${subTab.entityName?uncap_first}Save} from '../${entityName}.api';\n    // Emits声明\n    const emit = defineEmits(['register','success']);\n    //接收主表id\n    const mainId = inject('mainId');\n    const isUpdate = ref(true);\n    //表单配置\n    const [registerForm, {resetFields, setFieldsValue, validate}] = useForm({\n        labelWidth: 150,\n        schemas: ${subTab.entityName?uncap_first}FormSchema,\n        showActionButtonGroup: false,\n    });\n    //表单赋值\n    const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {\n        //重置表单\n        await resetFields();\n        setModalProps({confirmLoading: false});\n        isUpdate.value = !!data?.isUpdate;\n        if (unref(isUpdate)) {\n            //表单赋值\n            await setFieldsValue({\n                ...data.record,\n            });\n        }\n    });\n    //设置标题\n    const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));\n    //表单提交事件\n    async function handleSubmit(v) {\n        try {\n            let values = await validate();\n            setModalProps({confirmLoading: true});\n            if (unref(mainId)) {\n                values['${subTab.foreignKeys[0]?uncap_first}'] = unref(mainId);\n            }\n            //提交表单\n            await ${subTab.entityName?uncap_first}Save(values, isUpdate.value);\n            //关闭弹窗\n            closeModal();\n            //刷新列表\n            emit('success');\n        } finally {\n            setModalProps({confirmLoading: false});\n        }\n    }\n</script>\n\n<style scoped>\n\n</style>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/blob.ftl",
    "content": "<#if po.fieldDbType=='Blob'>\n    private transient java.lang.String ${po.fieldName}String;\n\n    private byte[] ${po.fieldName};\n\n    public byte[] get${po.fieldName?cap_first}(){\n        if(${po.fieldName}String==null){\n            return null;\n        }\n        try {\n            return ${po.fieldName}String.getBytes(\"UTF-8\");\n        } catch (UnsupportedEncodingException e) {\n            e.printStackTrace();\n        }\n        return null;\n    }\n\n    public String get${po.fieldName?cap_first}String(){\n        if(${po.fieldName}==null || ${po.fieldName}.length==0){\n            return \"\";\n        }\n        try {\n            return new String(${po.fieldName},\"UTF-8\");\n        } catch (UnsupportedEncodingException e) {\n            e.printStackTrace();\n        }\n        return \"\";\n    }\n<#elseif po.classType=='switch'>\n    <#assign switch_extend_arr=['Y','N']>\n    <#if po.dictField?default(\"\")?contains(\"[\")>\n        <#assign switch_extend_arr=po.dictField?eval>\n    </#if>\n    <#list switch_extend_arr as a>\n        <#if a_index == 0>\n            <#assign switch_extend_arr1=a>\n        <#else>\n            <#assign switch_extend_arr2=a>\n        </#if>\n    </#list>\n    @Excel(name = \"${po.filedComment}\", width = 15,replace = {\"是_${switch_extend_arr1}\",\"否_${switch_extend_arr2}\"} )\n    @Schema(description = \"${po.filedComment}\")\n    private ${po.fieldType} ${po.fieldName};\n<#elseif po.classType=='pca'>\n    @Excel(name = \"${po.filedComment}\", width = 15,exportConvert=true,importConvert = true )\n    @Schema(description = \"${po.filedComment}\")\n    private ${po.fieldType} ${po.fieldName};\n\n    public String convertis${po.fieldName?cap_first}() {\n        return SpringContextUtils.getBean(ProvinceCityArea.class).getText(${po.fieldName});\n    }\n\n    public void convertset${po.fieldName?cap_first}(String text) {\n        this.${po.fieldName} = SpringContextUtils.getBean(ProvinceCityArea.class).getCode(text);\n    }\n<#elseif po.classType=='cat_tree'>\n    <#assign list_field_dictCode=', dictTable = \"sys_category\", dicText = \"name\", dicCode = \"id\"'>\n    @Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n    @Schema(description = \"${po.filedComment}\")\n    private ${po.fieldType} ${po.fieldName};\n<#else>\n    @Schema(description = \"${po.filedComment}\")\n  <#if po.fieldDbName == 'del_flag'>\n    @TableLogic\n  </#if>\n    private ${po.fieldType} ${po.fieldName};\n</#if>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/native/vue3NativeComponents.ftl",
    "content": "<#if need_select_tag>\n      JDictSelectTag,\n</#if>\n<#if need_switch>\n      JSwitch,\n</#if>\n<#if need_multi>\n      JSelectMultiple,\n</#if>\n<#if need_search>\n      JSearchSelect,\n</#if>\n<#if need_popup>\n      JPopup,\n</#if>\n<#if need_popup_dict>\n      JPopupDict,\n</#if>\n<#if need_category>\n      JCategorySelect,\n</#if>\n<#if need_dept>\n      JSelectDept,\n</#if>\n<#if need_dept_user>\n<#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n      JSelectUser,\n<#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n</#if>\n<#if need_select_tree>\n      JTreeSelect,\n</#if>\n<#if need_time>\n      TimePicker,\n</#if>\n<#if need_pca>\n      JAreaLinkage,\n</#if>\n<#if need_upload>\n      JUpload,\n</#if>\n<#if need_image_upload>\n      JImageUpload,\n</#if>\n<#if need_markdown>\n      JMarkdownEditor,\n</#if>\n<#if need_editor>\n      JEditor,\n</#if>\n<#if need_checkbox>\n      JCheckbox,\n</#if>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/native/vue3NativeForm.ftl",
    "content": "<#include \"/common/utils.ftl\">\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if po.isShow =='Y' && po.fieldName != 'id' && po.fieldName !='delFlag' && isNotPidField(tableVo, po.fieldDbName)>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n\t\t\t\t\t\t<a-col :span=\"${form_span}\">\n\t\t\t\t\t\t\t<a-form-item label=\"${po.filedComment}\" v-bind=\"validateInfos.${autoStringSuffixForModel(po)}\" id=\"${formEntityName}-${autoStringSuffixForModel(po)}\" name=\"${autoStringSuffixForModel(po)}\">\n\t\t\t\t\t<#if po.classType =='date'>\n\t\t\t\t\t\t\t\t<a-date-picker placeholder=\"请选择${po.filedComment}\" <#if po.extendParams?exists && po.extendParams.picker?exists>picker=\"${po.extendParams.picker}\"</#if> v-model:value=\"formData.${po.fieldName}\" value-format=\"YYYY-MM-DD\"  style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if> allow-clear />\n\t\t\t\t\t<#elseif po.classType =='datetime'>\n\t\t\t\t\t\t\t\t<a-date-picker placeholder=\"请选择${po.filedComment}\"  v-model:value=\"formData.${po.fieldName}\" showTime value-format=\"YYYY-MM-DD HH:mm:ss\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if> allow-clear />\n\t\t\t\t\t<#elseif po.classType =='time'>\n\t\t\t\t\t\t\t\t<#assign need_time = true>\n\t\t\t\t\t\t\t\t<time-picker placeholder=\"请选择${po.filedComment}\" value-format=\"HH:mm:ss\"  v-model:value=\"formData.${po.fieldName}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if> allow-clear />\n\t\t\t\t\t<#elseif po.classType =='popup'>\n\t\t\t\t\t\t\t\t<#assign need_popup = true>\n\t\t\t\t\t\t\t\t<#assign sourceFields = po.dictField?default(\"\")?trim?split(\",\")/>\n\t\t\t\t\t\t\t\t<#assign targetFields = po.dictText?default(\"\")?trim?split(\",\")/>\n\t\t\t\t\t\t\t\t<j-popup\n\t\t\t\t\t\t\t\t\tplaceholder=\"请选择${po.filedComment}\"\n\t\t\t\t\t\t\t\t\tv-model:value=\"formData.${po.fieldName}\"\n\t\t\t\t\t\t\t\t\tcode=\"${po.dictTable}\"\n\t\t\t\t\t\t\t\t\t:fieldConfig=\"[\n\t\t\t\t\t\t\t\t\t\t<#list sourceFields as fieldName>\n\t\t\t\t\t\t\t\t\t\t{ source: '${fieldName}', target: '${dashedToCamel(targetFields[fieldName_index])}' },\n\t\t\t\t\t\t\t\t\t\t</#list>\n\t\t\t\t\t\t\t\t\t]\"\n\t\t\t\t\t\t\t\t\t:multi=\"${po.extendParams.popupMulti?c}\"\n\t\t\t\t\t\t\t\t\t:setFieldsValue=\"setFieldsValue\"\n\t\t\t\t\t\t\t\t\t<#if po.readonly=='Y'>disabled</#if><#rt> allow-clear />\n\t\t\t\t\t<#elseif po.classType =='popup_dict'>\n\t\t\t\t\t\t\t\t<#assign need_popup_dict = true>\n\t\t\t\t\t\t\t\t<#assign sourceFields = po.dictField?default(\"\")?trim?split(\",\")/>\n\t\t\t\t\t\t\t\t<#assign targetFields = po.dictText?default(\"\")?trim?split(\",\")/>\n\t\t\t\t\t\t\t\t<j-popup-dict\n\t\t\t\t\t\t\t\t\tplaceholder=\"请选择${po.filedComment}\"\n\t\t\t\t\t\t\t\t\tv-model:value=\"formData.${po.fieldName}\"\n\t\t\t\t\t\t\t\t\tdictCode=\"${po.dictTable},${po.dictText},${po.dictField}\"\n\t\t\t\t\t\t\t\t\t:multi=\"${po.extendParams.popupMulti?c}\" <#if po.readonly=='Y'>disabled</#if> />\n\t\t\t\t\t<#elseif po.classType =='sel_depart'>\n\t\t\t\t\t\t\t\t<#assign need_dept = true>\n\t\t\t\t\t\t\t\t<j-select-dept v-model:value=\"formData.${po.fieldName}\"  <#if po.extendParams?exists && po.extendParams.text?exists>labelKey=\"${po.extendParams.text}\"</#if> <#if po.extendParams?exists && po.extendParams.store?exists>rowKey=\"${po.extendParams.store}\"</#if>   <#if po.readonly=='Y'>disabled</#if> :multiple=\"${po.extendParams.multi?default('true')}\" checkStrictly <#if po.readonly=='Y'>disabled</#if> allow-clear />\n\t\t\t\t\t<#elseif po.classType =='switch'>\n\t\t\t\t\t\t\t\t<#assign need_switch = true>\n\t\t\t\t\t\t\t\t<j-switch v-model:value=\"formData.${po.fieldName}\" <#if po.dictField != 'is_open'>:options=\"${po.dictField}\"</#if> <#if po.readonly=='Y'>disabled</#if>></j-switch>\n\t\t\t\t\t<#elseif po.classType =='pca'>\n\t\t\t\t\t\t\t\t<#assign need_pca = true>\n\t\t\t\t\t\t\t\t<j-area-linkage v-model:value=\"formData.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" saveCode=\"region\" <#if po.readonly=='Y'>disabled</#if> allow-clear />\n\t\t\t\t\t<#elseif po.classType =='markdown'>\n\t\t\t\t\t\t\t\t<#assign need_markdown = true>\n\t\t\t\t\t\t\t\t<j-markdown-editor v-model:value=\"formData.${autoStringSuffixForModel(po)}\" id=\"${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>></j-markdown-editor>\n\t\t\t\t\t<#elseif po.classType =='password'>\n\t\t\t\t\t\t\t\t<a-input-password v-model:value=\"formData.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if> allow-clear />\n\t\t\t\t\t<#elseif po.classType =='sel_user'>\n\t\t\t\t\t\t\t\t<#assign need_dept_user = true>\n\t\t\t\t\t\t<#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n\t\t\t\t\t\t<j-select-user v-model:value=\"formData.${po.fieldName}\"  <#if po.extendParams?exists && po.extendParams.text?exists>labelKey=\"${po.extendParams.text}\"</#if> <#if po.extendParams?exists && po.extendParams.store?exists>rowKey=\"${po.extendParams.store}\"</#if>  <#if po.readonly=='Y'>disabled</#if> allow-clear />\n\t\t\t\t\t\t<#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n\t\t\t\t\t<#elseif po.classType =='textarea'>\n\t\t\t\t\t\t\t\t<a-textarea v-model:value=\"formData.${autoStringSuffixForModel(po)}\" :rows=\"4\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t\t\t\t\t<#elseif po.classType=='radio'>\n\t\t\t\t\t <#assign need_select_tag = true>\n\t\t\t\t\t\t\t\t<j-dict-select-tag type='radio' v-model:value=\"formData.${po.fieldName}\" dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if> allow-clear />\n\t\t\t\t\t<#elseif po.classType=='list'>\n\t\t\t\t\t\t\t\t<#assign need_select_tag = true>\n\t\t\t\t\t\t\t\t<j-dict-select-tag v-model:value=\"formData.${po.fieldName}\" dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if> allow-clear />\n\t\t\t\t\t<#elseif po.classType=='list_multi'>\n\t\t\t\t\t\t\t\t<#assign need_multi = true>\n\t\t\t\t\t\t\t\t<j-select-multiple type=\"${po.classType}\" v-model:value=\"formData.${po.fieldName}\" dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if> :triggerChange=\"false\"/>\n\t\t\t\t\t <#elseif po.classType=='checkbox'>\n\t\t\t\t\t\t\t\t<#assign need_checkbox = true>\n\t\t\t\t\t\t\t\t<j-checkbox type=\"${po.classType}\" v-model:value=\"formData.${po.fieldName}\" dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if> allow-clear />\n\t\t\t\t\t<#elseif po.classType=='sel_search'>\n\t\t\t\t\t\t\t\t<#assign need_search = true>\n\t\t\t\t\t\t\t\t<j-search-select v-model:value=\"formData.${po.fieldName}\" dict=\"${form_field_dictCode}\" <#if po.readonly=='Y'>disabled</#if> allow-clear />\n\t\t\t\t\t\t<#elseif po.classType=='cat_tree'>\n\t\t\t\t\t\t\t<#assign need_category = true>\n\t\t\t\t\t\t\t\t<j-category-select v-model:value=\"formData.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\" placeholder=\"请选择${po.filedComment}\" <#if po.dictText?default(\"\")?trim?length gt 1>back=\"${dashedToCamel(po.dictText)}\"</#if> <#if po.readonly=='Y'>disabled</#if> @change=\"(value) => handleFormChange('${po.fieldName}', value)\" allow-clear />\n\t\t\t\t\t<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n\t\t\t\t\t\t\t\t<a-input-number v-model:value=\"formData.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t\t\t\t\t<#elseif po.classType=='file'>\n\t\t\t\t\t\t\t\t<#assign need_upload = true>\n\t\t\t\t\t\t\t\t<j-upload v-model:value=\"formData.${po.fieldName}\"  <#if po.readonly=='Y'>disabled</#if> <#if po.uploadnum??>:maxCount=${po.uploadnum}</#if>></j-upload>\n\t\t\t\t\t<#elseif po.classType=='image'>\n\t\t\t\t\t\t\t\t<#assign need_image_upload = true>\n\t\t\t\t\t\t\t\t<j-image-upload <#if po.uploadnum??>:fileMax=${po.uploadnum}<#else>:fileMax=\"0\"</#if> v-model:value=\"formData.${po.fieldName}\" <#if po.readonly=='Y'>disabled</#if>></j-image-upload>\n\t\t\t\t\t<#elseif po.classType=='umeditor'>\n\t\t\t\t\t\t\t\t<#assign need_editor = true>\n\t\t\t\t\t\t\t\t<j-editor v-model:value=\"formData.${autoStringSuffixForModel(po)}\" <#if po.readonly=='Y'>disabled</#if> :autoFocus=\"false\"/>\n\t\t\t\t\t\t<#elseif po.fieldDbType=='Blob'>\n\t\t\t\t\t\t\t\t<a-input v-model:value=\"formData.${autoStringSuffixForModel(po)}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if> allow-clear ></a-input>\n\t\t\t\t\t\t<#elseif po.classType == 'sel_tree'>\n\t\t\t\t\t\t\t\t<#assign need_select_tree = true>\n\t\t\t\t\t\t\t\t<j-tree-select\n\t\t\t\t\t\t\t\t\t<#if po.dictText??>\n\t\t\t\t\t\t\t\t\t<#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n\t\t\t\t\t\t\t\t\tdict=\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\"\n\t\t\t\t\t\t\t\t\t<#elseif po.dictText?split(',')[1]??>\n\t\t\t\t\t\t\t\t\tpidField=\"${po.dictText?split(',')[1]}\"\n\t\t\t\t\t\t\t\t\t<#elseif po.dictText?split(',')[3]??>\n\t\t\t\t\t\t\t\t\thasChildField=\"${po.dictText?split(',')[3]}\"\n\t\t\t\t\t\t\t\t\t</#if>\n\t\t\t\t\t\t\t\t\t</#if>\n\t\t\t\t\t\t\t\t\tpidValue=\"${po.dictField}\"\n\t\t\t\t\t\t\t\t\t<#if po.readonly=='Y'>disabled</#if>\n\t\t\t\t\t\t\t\t\tv-model:value=\"formData.${po.fieldName}\"\n\t\t\t\t\t\t\t\t\t@change=\"(value) => handleFormChange('${po.fieldName}', value)\" allow-clear >\n\t\t\t\t\t\t\t\t</j-tree-select>\n\t\t\t\t\t<#else>\n\t\t\t\t\t\t\t\t<a-input v-model:value=\"formData.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if> allow-clear ></a-input>\n\t\t\t\t</#if>\n\t\t\t\t\t\t\t</a-form-item>\n\t\t\t\t\t\t</a-col>\n</#if>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/native/vue3NativeImport.ftl",
    "content": "<#if need_select_tag>\n  import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';\n</#if>\n<#if need_switch>\n  import JSwitch from '/@/components/Form/src/jeecg/components/JSwitch.vue';\n</#if>\n<#if need_multi>\n  import JSelectMultiple from '/@/components/Form/src/jeecg/components/JSelectMultiple.vue';\n</#if>\n<#if need_search>\n  import JSearchSelect from '/@/components/Form/src/jeecg/components/JSearchSelect.vue';\n</#if>\n<#if need_popup>\n  import JPopup from '/@/components/Form/src/jeecg/components/JPopup.vue';\n</#if>\n<#if need_popup_dict>\n  import JPopupDict from '/@/components/Form/src/jeecg/components/JPopupDict.vue';\n</#if>\n<#if need_category>\n  import JCategorySelect from '/@/components/Form/src/jeecg/components/JCategorySelect.vue';\n</#if>\n<#if need_dept>\n  import JSelectDept from '/@/components/Form/src/jeecg/components/JSelectDept.vue';\n</#if>\n<#if need_dept_user>\n<#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n  import JSelectUser from '/@/components/Form/src/jeecg/components/JSelectUser.vue';\n<#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n</#if>\n<#if need_select_tree>\n  import JTreeSelect from '/@/components/Form/src/jeecg/components/JTreeSelect.vue';\n</#if>\n<#if need_time>\n  import { TimePicker } from 'ant-design-vue';\n</#if>\n<#if need_pca>\n  import JAreaLinkage from '/@/components/Form/src/jeecg/components/JAreaLinkage.vue';\n</#if>\n<#if need_upload>\n  import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue';\n</#if>\n<#if need_image_upload>\n  import JImageUpload from '/@/components/Form/src/jeecg/components/JImageUpload.vue';\n</#if>\n<#if need_markdown>\n  import JMarkdownEditor from '/@/components/Form/src/jeecg/components/JMarkdownEditor.vue';\n</#if>\n<#if need_editor>\n  import JEditor from '/@/components/Form/src/jeecg/components/JEditor.vue';\n</#if>\n<#if need_checkbox>\n  import JCheckbox from \"/@/components/Form/src/jeecg/components/JCheckbox.vue\";\n</#if>\n<#if need_range_number>\n  import JRangeNumber from \"/@/components/Form/src/jeecg/components/JRangeNumber.vue\";\n</#if>\n<#if is_like>\n  import JInput from \"/@/components/Form/src/jeecg/components/JInput.vue\";\n</#if>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/native/vue3NativeSearch.ftl",
    "content": "<#include \"/common/utils.ftl\">\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if po.isQuery=='Y' && po.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#assign query_flag=true>\n\t<#if query_field_no==2>\n          <template v-if=\"toggleSearchStatus\">\n\t</#if>\n\t<#assign query_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n\t    <#assign need_select_tag = true>\n        <#assign need_multi = true>\n\t    <#assign query_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t    <#assign need_select_tag = true>\n        <#assign need_multi = true>\n\t    <#assign query_field_dictCode=\"${po.dictField}\">\n\t</#if>\n\t<#if po.queryMode=='single'>\n          <#if query_field_no gt 1>  </#if><a-col :lg=\"6\">\n            <#if query_field_no gt 1>  </#if><a-form-item name=\"${autoStringSuffixForModel(po)}\">\n              <#if query_field_no gt 1>  </#if><template #label><span title=\"${po.filedComment}\"><#if po.filedComment?default(\"\")?trim?length gt 4>${po.filedComment?substring(0,4)}<#else>${po.filedComment}</#if></span></template>\n            <#if po.classType=='sel_search'>\n              <#if query_field_no gt 1>  </#if><j-search-select placeholder=\"请选择${po.filedComment}\" v-model:value=\"queryParam.${po.fieldName}\" dict=\"${po.dictTable},${po.dictText},${po.dictField}\" allow-clear />\n            <#elseif po.classType=='sel_user'>\n              <#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n              <#if query_field_no gt 1>  </#if><j-select-user placeholder=\"请选择${po.filedComment}\" v-model:value=\"queryParam.${po.fieldName}\" @change=\"(value)=>handleFormJoinChange('${po.fieldName}',value)\" allow-clear />\n              <#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n            <#elseif po.classType=='switch'>\n              <#if query_field_no gt 1>  </#if><j-switch placeholder=\"请选择${po.filedComment}\" v-model:value=\"queryParam.${po.fieldName}\" <#if po.dictField!= 'is_open'>:options=\"${po.dictField}\"</#if> query />\n            <#elseif po.classType=='sel_depart'>\n              <#if query_field_no gt 1>  </#if><j-select-dept placeholder=\"请选择${po.filedComment}\" v-model:value=\"queryParam.${po.fieldName}\" checkStrictly allow-clear />\n            <#elseif po.classType=='list_multi'>\n              <#if query_field_no gt 1>  </#if><j-select-multiple placeholder=\"请选择${po.filedComment}\" dictCode=\"${query_field_dictCode?default(\"\")}\" v-model:value=\"queryParam.${po.fieldName}\" allow-clear />\n            <#elseif po.classType=='cat_tree'>\n              <#if query_field_no gt 1>  </#if><j-category-select placeholder=\"请选择${po.filedComment}\" v-model:value=\"queryParam.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\" @change=\"(value) => handleFormChange('${po.fieldName}', value)\" allow-clear />\n            <#elseif po.classType=='date'>\n              <#if query_field_no gt 1>  </#if><a-date-picker valueFormat=\"YYYY-MM-DD\" placeholder=\"请选择${po.filedComment}\" <#if po.extendParams?exists && po.extendParams.picker?exists>picker=\"${po.extendParams.picker}\"</#if> v-model:value=\"queryParam.${po.fieldName}\" allow-clear />\n            <#elseif po.classType=='datetime'>\n              <#if query_field_no gt 1>  </#if><a-date-picker showTime valueFormat=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择${po.filedComment}\" v-model:value=\"queryParam.${po.fieldName}\" allow-clear />\n            <#elseif po.classType=='time'>\n              <#if query_field_no gt 1>  </#if><time-picker valueFormat=\"HH:mm:ss\" placeholder=\"请选择${po.filedComment}\" v-model:value=\"queryParam.${po.fieldName}\" allow-clear />\n            <#elseif po.classType=='pca'>\n              <#if query_field_no gt 1>  </#if><j-area-linkage v-model:value=\"queryParam.${po.fieldName}\" placeholder=\"请选择${po.filedComment}\" saveCode=\"region\" @change=\"(value)=>handleFormJoinChange('${po.fieldName}',value)\" allow-clear />\n            <#elseif po.classType=='sel_tree'>\n              <#if query_field_no gt 1>  </#if><j-tree-select v-model:value=\"queryParam.${po.fieldName}\" placeholder=\"请选择${po.filedComment}\" <#if po.dictText??><#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>dict=\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\" <#elseif po.dictText?split(',')[1]??>pidField:\"${po.dictText?split(',')[1]}\", <#elseif po.dictText?split(',')[3]??>hasChildField:\"${po.dictText?split(',')[3]}\"</#if> </#if>pidValue=\"${po.dictField}\" allow-clear />\n            <#elseif po.classType=='popup'>\n              <#assign sourceFields = po.dictField?default(\"\")?trim?split(\",\")/>\n              <#assign targetFields = po.dictText?default(\"\")?trim?split(\",\")/>\n              <#if query_field_no gt 1>  </#if><j-popup\n                <#if query_field_no gt 1>  </#if>placeholder=\"请选择${po.filedComment}\" \n                <#if query_field_no gt 1>  </#if>v-model:value=\"queryParam.${po.fieldName}\" \n                <#if query_field_no gt 1>  </#if>code=\"${po.dictTable}\"\n                <#if query_field_no gt 1>  </#if>:fieldConfig=\"[\n                <#list sourceFields as fieldName>\n                  <#if query_field_no gt 1>  </#if>{ source: '${fieldName}', target: '${dashedToCamel(targetFields[fieldName_index])}' },\n                </#list>\n                <#if query_field_no gt 1>  </#if>]\"\n                <#if query_field_no gt 1>  </#if>:multi=\"${po.extendParams.popupMulti?c}\"\n                <#if query_field_no gt 1>  </#if>:setFieldsValue=\"setFieldsValue\" allow-clear />\n            <#elseif po.classType=='popup_dict'>\n                <#if query_field_no gt 1>  </#if><j-popup-dict\n                <#if query_field_no gt 1>  </#if>placeholder=\"请选择${po.filedComment}\"\n                <#if query_field_no gt 1>  </#if>v-model:value=\"queryParam.${po.fieldName}\"\n                <#if query_field_no gt 1>  </#if>dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\"\n                <#if query_field_no gt 1>  </#if>:multi=\"${po.extendParams.popupMulti?c}\"\n                <#if query_field_no gt 1>  </#if><#if po.readonly=='Y'>disabled</#if> />\n            <#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>\n             <#--  ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->\n             <#if po.dictTable?default(\"\")?trim?length gt 1>\n              <#if query_field_no gt 1>  </#if><j-select-multiple placeholder=\"请选择${po.filedComment}\" v-model:value=\"queryParam.${po.fieldName}\" dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\" allow-clear />\n              <#elseif po.dictField?default(\"\")?trim?length gt 1>\n              <#if query_field_no gt 1>  </#if><j-select-multiple placeholder=\"请选择${po.filedComment}\" v-model:value=\"queryParam.${po.fieldName}\" dictCode=\"${po.dictField}\" allow-clear />\n              <#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入${po.filedComment}\" v-model:value=\"queryParam.${po.fieldName}\" allow-clear ></a-input>\n             </#if>\n            <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n              <#if query_field_no gt 1>  </#if><a-input-number placeholder=\"请输入${po.filedComment}\" v-model:value=\"queryParam.${po.fieldName}\"></a-input-number>           \n            <#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入${po.filedComment}\" v-model:value=\"queryParam.${autoStringSuffixForModel(po)}\" allow-clear ></a-input>\n          </#if>\n            <#if query_field_no gt 1>  </#if></a-form-item>\n          <#if query_field_no gt 1>  </#if></a-col>\n    <#elseif po.queryMode=='like'>\n        <#if query_field_no gt 1>  </#if><a-col :lg=\"6\">\n        <#if query_field_no gt 1>  </#if><a-form-item name=\"${autoStringSuffixForModel(po)}\">\n        <#if query_field_no gt 1>  </#if><template #label><span title=\"${po.filedComment}\"><#if po.filedComment?default(\"\")?trim?length gt 4>${po.filedComment?substring(0,4)}<#else>${po.filedComment}</#if></span></template>\n            <#if query_field_no gt 1>  </#if><JInput v-model:value=\"queryParam.${po.fieldName}\"/>\n        <#if query_field_no gt 1>  </#if></a-form-item>\n        <#if query_field_no gt 1>  </#if></a-col>\n\t<#else>\n          <#if query_field_no gt 1>  </#if><a-col :lg=\"6\">\n            <#if query_field_no gt 1>  </#if><a-form-item name=\"${autoStringSuffixForModel(po)}\">\n              <#if query_field_no gt 1>  </#if><template #label><span title=\"${po.filedComment}\"><#if po.filedComment?default(\"\")?trim?length gt 4>${po.filedComment?substring(0,4)}<#else>${po.filedComment}</#if></span></template>\n      <#if po.classType=='date'>\n              <#if query_field_no gt 1>  </#if><a-range-picker value-format=\"YYYY-MM-DD\" <#if po.extendParams?exists && po.extendParams.picker?exists>picker=\"${po.extendParams.picker}\"</#if> v-model:value=\"queryParam.${po.fieldName}\" class=\"query-group-cust\"/>\n      <#elseif po.classType=='time'>\n              <#if query_field_no gt 1>  </#if><a-time-range-picker value-format=\"HH:mm:ss\" v-model:value=\"queryParam.${po.fieldName}\" class=\"query-group-cust\" />\n      <#elseif po.classType=='datetime'>\n              <#if query_field_no gt 1>  </#if><a-range-picker showTime value-format=\"YYYY-MM-DD HH:mm:ss\" v-model:value=\"queryParam.${po.fieldName}\" class=\"query-group-cust\"/>\n      <#else>\n              <#if query_field_no gt 1>  </#if><JRangeNumber v-model:value=\"queryParam.${po.fieldName}\" class=\"query-group-cust\"></JRangeNumber>\n      </#if>\n            <#if query_field_no gt 1>  </#if></a-form-item>\n          <#if query_field_no gt 1>  </#if></a-col>\n  </#if>\n      <#assign query_field_no=query_field_no+1>\n  </#if>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/native/vueNativeSearchStyle.ftl",
    "content": "  <#-- 原生查询区域样式 -->\n  .jeecg-basic-table-form-container {\n    padding: 0;\n    .table-page-search-submitButtons {\n      display: block;\n      margin-bottom: 24px;\n      white-space: nowrap;\n    }\n    .query-group-cust{\n      min-width: 100px !important;\n    }\n    .query-group-split-cust{\n      width: 30px;\n      display: inline-block;\n      text-align: center\n    }\n    .ant-form-item:not(.ant-form-item-with-help){\n      margin-bottom: 16px;\n      height: 32px;\n    }\n    :deep(.ant-picker),:deep(.ant-input-number){\n      width: 100%;\n    }\n  }\n  "
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/vue3Jvxepopup.ftl",
    "content": "<#assign sourceFields = col.dictField?default(\"\")?trim?split(\",\")/>\n<#assign targetFields = col.dictText?default(\"\")?trim?split(\",\")/>\n      type: JVxeTypes.popup,\n      popupCode:\"${col.dictTable}\",\n      fieldConfig: [\n    <#list sourceFields as fieldName>\n        { source: '${fieldName}', target: '${dashedToCamel(targetFields[fieldName_index])}' },\n    </#list>\n      ],\n    <#if col.readonly=='Y'>\n        disabled:true,\n    </#if>\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/vue3SearchStyle.ftl",
    "content": "  <#-- 非原生查询区域样式 -->\n  :deep(.ant-picker),:deep(.ant-input-number){\n    width: 100%;\n  }\n  "
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/form/vue3popup.ftl",
    "content": "<#assign sourceFields = po.dictField?default(\"\")?trim?split(\",\")/>\n<#assign targetFields = po.dictText?default(\"\")?trim?split(\",\")/>\n    component: 'JPopup',\n    componentProps: ({ formActionType }) => {\n        const {setFieldsValue} = formActionType;\n        return{\n            setFieldsValue:setFieldsValue,\n            code:\"${po.dictTable}\",\n            fieldConfig: [\n                <#list sourceFields as fieldName>\n                { source: '${fieldName}', target: '${dashedToCamel(targetFields[fieldName_index])}' },\n                </#list>\n            ],\n            multi:${po.extendParams.popupMulti?c}\n        }\n    },\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/init/initValue.ftl",
    "content": "<#list columns as po>\n    <#if po.isShow == 'Y'>\n        <#if po.fieldName != 'id'>\n            <#if po.defaultVal??>\n                <#if po.fieldDbType==\"BigDecimal\" || po.fieldDbType==\"double\" || po.fieldDbType==\"int\">\n            ${po.fieldName}:${po.defaultVal},\n                <#else>\n            ${po.fieldName}:\"${po.defaultVal}\",\n                </#if>\n            </#if>\n        </#if>\n    </#if>\n</#list>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/init/initValueSub.ftl",
    "content": "<#list sub.colums as po>\n    <#if po.isShow == 'Y'>\n        <#if po.fieldName != 'id'>\n            <#if po.defaultVal??>\n                <#if po.fieldDbType==\"BigDecimal\" || po.fieldDbType==\"double\" || po.fieldDbType==\"int\">\n            ${po.fieldName}:${po.defaultVal},\n                <#else>\n            ${po.fieldName}:\"${po.defaultVal}\",\n                </#if>\n            </#if>\n        </#if>\n    </#if>\n</#list>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/init/native/vue3NativeInitValue.ftl",
    "content": "<#list columns as po>\n <#if po.isShow == 'Y' && po.fieldName != 'id'>\n  <#if po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n    ${po.fieldName}: <#if po.defaultVal??>${po.defaultVal}<#else>undefined</#if>,\n  <#elseif po.fieldDbType=='Blob'>\n    ${po.fieldName}String: <#if po.defaultVal??>'${po.defaultVal}'<#else>''</#if>,\n  <#else>\n    ${po.fieldName}: <#if po.defaultVal??>'${po.defaultVal}'<#else>''</#if>,   \n  </#if>\n </#if>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/init/native/vue3NativeMainInitValue.ftl",
    "content": "<#list columns as po>\n <#if po.isShow == 'Y' && po.fieldName != 'id'>\n  <#if po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n        ${po.fieldName}: <#if po.defaultVal??>${po.defaultVal}<#else>undefined</#if>,\n  <#elseif po.fieldDbType=='Blob'>\n        ${po.fieldName}String: <#if po.defaultVal??>'${po.defaultVal}'<#else>''</#if>,\n  <#else>\n        ${po.fieldName}: <#if po.defaultVal??>'${po.defaultVal}'<#else>''</#if>,   \n  </#if>\n </#if>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/init/native/vue3NativeSubInitValue.ftl",
    "content": "<#list sub.colums as po>\n <#if po.isShow == 'Y' && po.fieldName != 'id'>\n  <#if po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n        ${po.fieldName}: <#if po.defaultVal??>${po.defaultVal}<#else>undefined</#if>,\n  <#elseif po.fieldDbType=='Blob'>\n        ${po.fieldName}String: <#if po.defaultVal??>'${po.defaultVal}'<#else>''</#if>,\n  <#else>\n        ${po.fieldName}: <#if po.defaultVal??>'${po.defaultVal}'<#else>''</#if>,   \n  </#if>\n </#if>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/sql/menu_insert.ftl",
    "content": "-- 注意：该页面对应的前台目录为views/${entityPackagePath}文件夹下\n-- 如果你想更改到其他目录，请修改sql中component字段对应的值\n\n<#assign mainId = \"${.now?long}01\">\n<#assign addId = \"${.now?long}02\">\n<#assign editId = \"${.now?long}03\">\n<#assign delId = \"${.now?long}04\">\n<#assign batchDelId = \"${.now?long}05\">\n<#assign exportId = \"${.now?long}06\">\n<#assign importId = \"${.now?long}07\">\n\n-- 主菜单\nINSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description, status, del_flag, rule_flag, create_by, create_time, update_by, update_time, internal_or_external)\nVALUES ('${mainId}', NULL, '${tableVo.ftlDescription}', '/${entityPackagePath}/${entityName?uncap_first}List', '${entityPackagePath}/${entityName}List', NULL, NULL, 0, NULL, '1', 0.00, 0, NULL, 1, 0, 0, 0, 0, NULL, '1', 0, 0, 'admin', '${.now?string[\"yyyy-MM-dd HH:mm:ss\"]}', NULL, NULL, 0);\n\n-- 新增\nINSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)\nVALUES ('${addId}', '${mainId}', '添加${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${entityPackage}:${tableName}:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string[\"yyyy-MM-dd HH:mm:ss\"]}', NULL, NULL, 0, 0, '1', 0);\n\n-- 编辑\nINSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)\nVALUES ('${editId}', '${mainId}', '编辑${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${entityPackage}:${tableName}:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string[\"yyyy-MM-dd HH:mm:ss\"]}', NULL, NULL, 0, 0, '1', 0);\n\n-- 删除\nINSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)\nVALUES ('${delId}', '${mainId}', '删除${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${entityPackage}:${tableName}:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string[\"yyyy-MM-dd HH:mm:ss\"]}', NULL, NULL, 0, 0, '1', 0);\n\n-- 批量删除\nINSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)\nVALUES ('${batchDelId}', '${mainId}', '批量删除${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${entityPackage}:${tableName}:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string[\"yyyy-MM-dd HH:mm:ss\"]}', NULL, NULL, 0, 0, '1', 0);\n\n-- 导出excel\nINSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)\nVALUES ('${exportId}', '${mainId}', '导出excel_${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${entityPackage}:${tableName}:exportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string[\"yyyy-MM-dd HH:mm:ss\"]}', NULL, NULL, 0, 0, '1', 0);\n\n-- 导入excel\nINSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)\nVALUES ('${importId}', '${mainId}', '导入excel_${tableVo.ftlDescription}', NULL, NULL, 0, NULL, NULL, 2, '${entityPackage}:${tableName}:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '${.now?string[\"yyyy-MM-dd HH:mm:ss\"]}', NULL, NULL, 0, 0, '1', 0);\n\n-- 角色授权（以 admin 角色为例，role_id 可替换）\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('${.now?long}08', 'f6817f48af4fb3af11b9e8bf182f618b', '${mainId}', NULL, '${.now?string[\"yyyy-MM-dd HH:mm:ss\"]}', '127.0.0.1');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('${.now?long}09', 'f6817f48af4fb3af11b9e8bf182f618b', '${addId}', NULL, '${.now?string[\"yyyy-MM-dd HH:mm:ss\"]}', '127.0.0.1');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('${.now?long}10', 'f6817f48af4fb3af11b9e8bf182f618b', '${editId}', NULL, '${.now?string[\"yyyy-MM-dd HH:mm:ss\"]}', '127.0.0.1');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('${.now?long}11', 'f6817f48af4fb3af11b9e8bf182f618b', '${delId}', NULL, '${.now?string[\"yyyy-MM-dd HH:mm:ss\"]}', '127.0.0.1');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('${.now?long}12', 'f6817f48af4fb3af11b9e8bf182f618b', '${batchDelId}', NULL, '${.now?string[\"yyyy-MM-dd HH:mm:ss\"]}', '127.0.0.1');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('${.now?long}13', 'f6817f48af4fb3af11b9e8bf182f618b', '${exportId}', NULL, '${.now?string[\"yyyy-MM-dd HH:mm:ss\"]}', '127.0.0.1');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('${.now?long}14', 'f6817f48af4fb3af11b9e8bf182f618b', '${importId}', NULL, '${.now?string[\"yyyy-MM-dd HH:mm:ss\"]}', '127.0.0.1');"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/utils.ftl",
    "content": "<#---->\n<#-- freemarker 的一些工具方法 -->\n<#---->\n<#-- 驼峰转其他字符 -->\n<#-- @param str       待转换的文本 -->\n<#-- @param character 要转换成的字符 -->\n<#-- @param case      转换大小写（normal 不转换，lower 小写，upper 大写） -->\n<#function camelToChar(str, character, case='normal')>\n  <#assign text=str?replace(\"([a-z])([A-Z]+)\",\"$1${character}$2\",\"r\")/>\n  <#if case==\"upper\">\n    <#return text?upper_case>\n  <#elseif case==\"lower\">\n    <#return text?lower_case>\n  <#else>\n    <#return text>\n  </#if>\n</#function>\n<#--下划线转驼峰-->\n<#function dashedToCamel(str)>\n    <#assign text=\"\"/>\n    <#assign strlist = str?split(\"_\")/>\n    <#list strlist as v>\n        <#assign text=text+v?cap_first/>\n    </#list>\n    <#return text?uncap_first>\n</#function>\n<#-- 驼峰转下划线 -->\n<#function camelToDashed(str, case='lower')>\n  <#return camelToChar(str, \"_\", case)>\n</#function>\n<#---->\n<#-- 驼峰转横线 -->\n<#function camelToHorizontal(str, case='normal')>\n  <#return camelToChar(str, \"-\", case)>\n</#function>\n<#---->\n<#-- 获取 v-model 属性 -->\n<#function getVModel po,suffix=\"\">\n  <#return \"v-model=\\\"queryParam.${po.fieldName}${suffix}\\\"\">\n</#function>\n<#-- 获取 placeholder 属性 -->\n<#function getPlaceholder po,prefix,fillComment=true>\n  <#if fillComment>\n    <#return \"placeholder=\\\"${prefix}${po.filedComment}\\\"\">\n  <#else>\n    <#return \"placeholder=\\\"${prefix}\\\"\">\n  </#if>\n</#function>\n<#-- ** 判断某字段是否配置了校验 * -->\n<#function poHasCheck po>\n  <#if (po.fieldValidType!'')?trim?length gt 0 || po.nullable == 'N'>\n    <#if po.fieldName != 'id'>\n      <#if po.nullable == 'N'\n      || po.fieldValidType == '*'\n      || po.fieldValidType == 'only'\n      || po.fieldValidType == 'n6-16'\n      || po.fieldValidType == '*6-16'\n      || po.fieldValidType == 's6-18'\n      || po.fieldValidType == 'url'\n      || po.fieldValidType == 'e'\n      || po.fieldValidType == 'm'\n      || po.fieldValidType == 'p'\n      || po.fieldValidType == 's'\n      || po.fieldValidType == 'n'\n      || po.fieldValidType == 'z'\n      || po.fieldValidType == 'money'\n      || po.fieldValidType != ''\n      >\n        <#return true>\n      </#if>\n    </#if>\n  </#if>\n  <#return false>\n</#function>\n<#-- ** 如果配置了校验就显示 validatorRules * -->\n<#function autoWriteRules po>\n  <#if poHasCheck(po)>\n    <#return \", validatorRules.${po.fieldName}\">\n  <#else>\n    <#return \"\">\n  </#if>\n</#function>\n\n<#-- ** 如果Blob就显示 String * -->\n<#function autoStringSuffix po>\n  <#if  po.fieldDbType=='Blob'>\n    <#return \"'${po.fieldName}String'\">\n  <#else>\n    <#return \"'${po.fieldName}'\">\n  </#if>\n</#function>\n\n<#-- ** 如果Blob就显示model方式 String * -->\n<#function autoStringSuffixForModel po>\n    <#if  po.fieldDbType=='Blob'>\n        <#return \"${po.fieldName}String\">\n    <#else>\n        <#return \"${po.fieldName}\">\n    </#if>\n</#function>\n\n<#-- ** 高级查询生成 * -->\n<#function superQueryFieldList po>\n    <#assign superQuery_dictTable=\"\">\n    <#assign superQuery_dictText=\"\">\n    <#if po.dictTable?default(\"\")?trim?length gt 1>\n        <#assign superQuery_dictTable=\"${po.dictTable}\">\n    </#if>\n    <#if po.dictText?default(\"\")?trim?length gt 1>\n        <#assign superQuery_dictText=\"${po.dictText}\">\n    </#if>\n  <#if po.classType==\"popup\">\n      <#return \"{type:'${po.classType}',value:'${po.fieldName}',text:'${po.filedComment}', popup:{code:'${po.dictTable}',field:'${po.dictField?split(',')[0]}',orgFields:'${po.dictField?split(',')[0]}',destFields:'${po.dictText?split(',')[0]}'}}\">\n  <#elseif po.classType==\"sel_user\" || po.classType==\"sel_depart\" || po.classType==\"datetime\" || po.classType==\"date\" || po.classType==\"pca\" || po.classType==\"switch\">\n      <#return \"{type:'${po.classType}',value:'${po.fieldName}',text:'${po.filedComment}'}\">\n  <#else>\n      <#if po.classType==\"sel_search\" || po.classType==\"list_multi\">\n          <#return \"{type:'${po.classType}',value:'${po.fieldName}',text:'${po.filedComment}',dictTable:\\\"${superQuery_dictTable}\\\", dictText:'${superQuery_dictText}', dictCode:'${po.dictField}'}\">\n      <#elseif po.dictTable?? && po.dictTable!=\"\" && po.classType!=\"sel_tree\" && po.classType!=\"cat_tree\" && po.classType!=\"link_down\">\n          <#return \"{type:'${po.fieldDbType}',value:'${po.fieldName}',text:'${po.filedComment}',dictCode:\\\"${po.dictTable},${po.dictText},${po.dictField}\\\"}\">\n      <#elseif po.dictField?? && po.classType!=\"sel_tree\" && po.classType!=\"cat_tree\" && po.classType!=\"link_down\">\n          <#return \"{type:'${po.fieldDbType}',value:'${po.fieldName}',text:'${po.filedComment}',dictCode:'${po.dictField}'}\">\n      <#elseif po.fieldDbType==\"Text\">\n          <#return \"{type:'string',value:'${po.fieldName}',text:'${po.filedComment}'}\">\n      <#elseif po.fieldDbType==\"Blob\">\n          <#return \"{type:'byte',value:'${po.fieldName}',text:'${po.filedComment}'}\">\n      <#elseif po.fieldDbType==\"BigDecimal\" || po.fieldDbType==\"double\">\n          <#return \"{type:'number',value:'${po.fieldName}',text:'${po.filedComment}'}\">\n      <#else>\n          <#return \"{type:'${po.fieldDbType}',value:'${po.fieldName}',text:'${po.filedComment}'}\">\n      </#if>\n  </#if>\n</#function>\n<#-- update-begin---author:chenrui ---date:20231228  for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n<#-- ** 高级查询生成(Vue3 * -->\n<#function superQueryFieldListForVue3(po,order)>\n<#-- 高级查询日期格式化 -->\n    <#assign picker=''>\n    <#if po.extendParams?exists && po.extendParams.picker?exists>\n        <#assign picker='fieldExtendJson:\"{\\\\\"picker\\\\\":\\\\\"${po.extendParams.picker}\\\\\"}\",'>\n    </#if>\n<#-- 字段展示/DB类型 -->\n    <#assign baseAttrs=\"view: '${po.classType}', type: 'string',\">\n    <#if po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n        <#assign baseAttrs=\"view: 'number', type: 'number',\">\n    </#if>\n\n<#-- 特殊类型控件扩展字段 -->\n    <#assign extAttrs=\"\">\n    <#assign dictCode=\"\">\n    <#if po.dictTable?default('')?trim?length gt 1 && po.dictText?default('')?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n        <#-- update-begin---author:chenrui ---date:20231228  for:fix 带条件字典存在单引号导致js编译错误---------- -->\n        <#assign dictCode=\"dictTable: \\\"${po.dictTable}\\\", dictCode: '${po.dictField}', dictText: '${po.dictText}'\">\n        <#-- update-begin---author:chenrui ---date:20231228  for:fix 带条件字典存在单引号导致js编译错误---------- -->\n    <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign dictCode=\"dictCode: '${po.dictField}'\">\n    <#else>\n        <#assign dictCode=\"dictCode: ''\">\n    </#if>\n\n    <#if po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='checkbox' || po.classType=='radio'>\n        <#assign extAttrs=\"${dictCode},\">\n    <#elseif po.classType=='cat_tree'>\n    <#-- 分类字典树 -->\n        <#-- update-begin---author:chenrui ---date:20240109  for：[issue/5787]增加非空判断防止代码生成时空指针异常---------- -->\n        <#assign extAttrs=\"pcode: '${po.dictField?default('')}',\">\n        <#-- update-end---author:chenrui ---date:20240109  for：[issue/5787]增加非空判断防止代码生成时空指针异常---------- -->\n    <#elseif po.classType=='sel_tree'>\n    <#-- 自定义树 -->\n        <#if po.dictText??>\n        <#-- dictText示例:id,pid,name,has_child -->\n            <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n                <#assign extAttrs=\"dict: '${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}'\">\n            <#elseif po.dictText?split(',')[1]??>\n                <#assign extAttrs=\"pidField: '${po.dictText?split(',')[1]}'\">\n            <#elseif po.dictText?split(',')[3]??>\n                <#assign extAttrs=\"hasChildField: '${po.dictText?split(',')[3]}'\">\n            </#if>\n        </#if>\n        <#-- update-begin---author:chenrui ---date:20240109  for：[issue/5787]增加非空判断防止代码生成时空指针异常---------- -->\n        <#assign extAttrs=\"${extAttrs}, pidValue: '${po.dictField?default('')}',\">\n        <#-- update-end---author:chenrui ---date:20240109  for：[issue/5787]增加非空判断防止代码生成时空指针异常---------- -->\n    <#elseif po.classType=='popup'>\n    <#-- popup -->\n        <#-- update-begin---author:chenrui ---date:20240109  for：[issue/5787]增加非空判断防止代码生成时空指针异常---------- -->\n        <#if po.dictText?default(\"\")?trim?length gt 1 && po.dictText?index_of(',') gt 0 && po.dictField?default(\"\")?trim?length gt 1>\n        <#-- update-begin---author:chenrui ---date:20240109  for：[issue/5787]增加非空判断防止代码生成时空指针异常---------- -->\n        <#-- 如果有多个回填字段,找到popup字段对应的来源字段 -->\n            <#assign orgFieldIx=po.dictText?split(',')?seq_index_of(po.fieldDbName)>\n            <#assign orgField=po.dictField?split(',')[orgFieldIx]>\n        <#else>\n            <#assign orgField=po.dictField?default(\"\")>\n        </#if>\n        <#assign extAttrs=\"code: '${po.dictTable?default('')}', orgFields: '${orgField}', destFields: '${po.fieldName}', popupMulti: false,\">\n    </#if>\n\n    <#return \"${po.fieldName}: {title: '${po.filedComment}',order: ${order},${baseAttrs}${extAttrs}${picker}}\" >\n</#function>\n<#-- update-end---author:chenrui ---date:20231228  for:[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n\n\n<#-- vue3 获取表单modal的宽度-->\n<#function getModalWidth fieldRowNum>\n    <#assign modal_width = 800>\n    <#if fieldRowNum==2>\n        <#assign modal_width = 896>\n    <#elseif fieldRowNum==3>\n        <#assign modal_width = 1024>\n    <#elseif fieldRowNum==4>\n        <#assign modal_width = 1280>\n    </#if>\n    <#return modal_width>\n</#function>\n\n<#-- vue3 获取表单 colspan -->\n<#function getFormSpan fieldRowNum>\n    <#assign form_span = 24>\n    <#if fieldRowNum==2>\n        <#assign form_span = 12>\n    <#elseif fieldRowNum==3>\n        <#assign form_span = 8>\n    <#elseif fieldRowNum==4>\n        <#assign form_span = 6>\n    </#if>\n    <#return form_span>\n</#function>\n\n<#-- vue3 native 判断字段名不是 pidField  -->\n<#function isNotPidField(tableVo, fieldDbName) >\n  <#assign flag = true>\n  <#if tableVo??>\n    <#if tableVo.extendParams??>\n      <#if tableVo.extendParams.pidField?default(\"\")?trim == fieldDbName>\n        <#assign flag = false>\n      </#if>\n    </#if>\n  </#if>\n  <#return flag>\n</#function>\n\n<#-- vue3 native 获取范围字段 -->\n<#function getRangeField(columns) >\n  <#assign rangeField = \"\">\n  <#list columns as po>\n      <#if po.isQuery=='Y'>\n          <#if po.queryMode=='group'>\n              <#if po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal' || po.classType=='time' || po.classType=='date' || po.classType=='datetime'>\n                  <#assign rangeField = rangeField + \"${po.fieldName},\">\n              </#if>\n          </#if>\n      </#if>\n  </#list>\n  <#return rangeField>\n</#function>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/validatorRulesTemplate/core.ftl",
    "content": "<#include \"/common/utils.ftl\">\n<#if po.isShow == 'Y' && poHasCheck(po)>\n    <#if po.fieldName != 'id'>\n           ${po.fieldName}: [\n        <#assign fieldValidType = po.fieldValidType!''>\n    <#-- 非空校验 -->\n        <#if po.nullable == 'N' || fieldValidType == '*'>\n              { required: true, message: '请输入${po.filedComment}!'},\n        <#elseif fieldValidType!=''>\n              { required: false},\n        </#if>\n    <#-- 唯一校验 -->\n        <#if fieldValidType == 'only'>\n              { validator: (rule, value, callback) => validateDuplicateValue(<#if sub?default(\"\")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'</#if>, '${po.fieldDbName}', value, this.model.id, callback)},\n        <#-- 6到16位数字 -->\n        <#elseif fieldValidType == 'n6-16'>\n              { pattern: /^\\d{6,16}$|^(?=\\d+\\.\\d+)[\\d.]{7,17}$/, message: '请输入6到16位数字!'},\n        <#-- 6到16位任意字符 -->\n        <#elseif fieldValidType == '*6-16'>\n              { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},\n        <#-- 6到18位字符串 -->\n        <#elseif fieldValidType == 's6-18'>\n          { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},\n        <#-- 网址 -->\n        <#elseif fieldValidType == 'url'>\n              { pattern: /^((ht|f)tps?):\\/\\/[\\w\\-]+(\\.[\\w\\-]+)+([\\w\\-.,@?^=%&:\\/~+#]*[\\w\\-@?^=%&\\/~+#])?$/, message: '请输入正确的网址!'},\n        <#-- 电子邮件 -->\n        <#elseif fieldValidType == 'e'>\n              { pattern: /^([\\w]+\\.*)([\\w]+)@[\\w]+\\.\\w{3}(\\.\\w{2}|)$/, message: '请输入正确的电子邮件!'},\n        <#-- 手机号码 -->\n        <#elseif fieldValidType == 'm'>\n              { pattern: /^1[3456789]\\d{9}$/, message: '请输入正确的手机号码!'},\n        <#-- 邮政编码 -->\n        <#elseif fieldValidType == 'p'>\n              { pattern: /^[0-9]\\d{5}$/, message: '请输入正确的邮政编码!'},\n        <#-- 字母 -->\n        <#elseif fieldValidType == 's'>\n              { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},\n        <#-- 数字 -->\n        <#elseif fieldValidType == 'n'>\n              { pattern: /^-?\\d+\\.?\\d*$/, message: '请输入数字!'},\n        <#-- 整数 -->\n        <#elseif fieldValidType == 'z'>\n              { pattern: /^-?\\d+$/, message: '请输入整数!'},\n        <#-- 金额 -->\n        <#elseif fieldValidType == 'money'>\n              { pattern: /^(([1-9][0-9]*)|([0]\\.\\d{0,2}|[1-9][0-9]*\\.\\d{0,2}))$/, message: '请输入正确的金额!'},\n        <#-- 正则校验 -->\n        <#elseif fieldValidType != '' && fieldValidType != '*'>\n              { pattern: '${fieldValidType}', message: '不符合校验规则!'},\n        <#-- 无校验 -->\n        <#else>\n            <#t>\n        </#if>\n           ],\n    </#if>\n</#if>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/validatorRulesTemplate/main.ftl",
    "content": "        validatorRules: {\n<#list columns as po>\n  <#include \"core.ftl\">\n</#list>\n        },\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/validatorRulesTemplate/native/vue3CoreNative.ftl",
    "content": "<#assign fieldValidType = po.fieldValidType!''>\n<#-- 非空校验 -->\n<#if po.nullable == 'N' || fieldValidType == '*'>\n{ required: true, message: '请输入${po.filedComment}!'}<#rt>,\n<#elseif fieldValidType!=''>\n{ required: false}<#rt>,\n</#if>\n<#-- 唯一校验 -->\n<#if fieldValidType == 'only'>\n { validator: ${po.fieldName}Duplicatevalidate }<#rt>\n<#-- 6到16位数字 -->\n<#elseif fieldValidType == 'n6-16'>\n { pattern: /^\\d{6,16}$|^(?=\\d+\\.\\d+)[\\d.]{7,17}$/, message: '请输入6到16位数字!'}<#rt>,\n<#-- 6到16位任意字符 -->\n<#elseif fieldValidType == '*6-16'>\n { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'}<#rt>,\n<#-- 6到18位字符串 -->\n<#elseif fieldValidType == 's6-18'>\n { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},<#rt>,\n<#-- 网址 -->\n<#elseif fieldValidType == 'url'>\n { pattern: /^((ht|f)tps?):\\/\\/[\\w\\-]+(\\.[\\w\\-]+)+([\\w\\-.,@?^=%&:\\/~+#]*[\\w\\-@?^=%&\\/~+#])?$/, message: '请输入正确的网址!'}<#rt>,\n<#-- 电子邮件 -->\n<#elseif fieldValidType == 'e'>\n { pattern: /^([\\w]+\\.*)([\\w]+)@[\\w]+\\.\\w{3}(\\.\\w{2}|)$/, message: '请输入正确的电子邮件!'}<#rt>,\n<#-- 手机号码 -->\n<#elseif fieldValidType == 'm'>\n { pattern: /^1[3456789]\\d{9}$/, message: '请输入正确的手机号码!'}<#rt>,\n<#-- 邮政编码 -->\n<#elseif fieldValidType == 'p'>\n { pattern: /^[0-9]\\d{5}$/, message: '请输入正确的邮政编码!'}<#rt>,\n<#-- 字母 -->\n<#elseif fieldValidType == 's'>\n { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'}<#rt>,\n<#-- 数字 -->\n<#elseif fieldValidType == 'n'>\n { pattern: /^-?\\d+\\.?\\d*$/, message: '请输入数字!'}<#rt>,\n<#-- 整数 -->\n<#elseif fieldValidType == 'z'>\n { pattern: /^-?\\d+$/, message: '请输入整数!'}<#rt>,\n<#-- 金额 -->\n<#elseif fieldValidType == 'money'>\n { pattern: /^(([1-9][0-9]*)|([0]\\.\\d{0,2}|[1-9][0-9]*\\.\\d{0,2}))$/, message: '请输入正确的金额!'}<#rt>,\n<#-- 正则校验 -->\n<#elseif fieldValidType != '' && fieldValidType != '*'>\n { pattern: '${fieldValidType}', message: '不符合校验规则!'}<#rt>,\n<#else>\n\t<#t>\n</#if>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/validatorRulesTemplate/native/vue3MainNative.ftl",
    "content": "<#include \"/common/utils.ftl\">\n<#list columns as po>\n  <#if po.isShow == 'Y' && poHasCheck(po)>\n    ${po.fieldName}: [<#include \"vue3CoreNative.ftl\">],\n  </#if>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/validatorRulesTemplate/sub-vue3.ftl",
    "content": "<#include \"/common/utils.ftl\">\n    <#if col.isShow == 'Y' && poHasCheck(col)>\n        validateRules: [\n        <#if col.fieldName != 'id'>\n            <#assign subFieldValidType = col.fieldValidType!''>\n        <#-- 非空校验 -->\n            <#if col.nullable == 'N' || subFieldValidType == '*'>\n          { required: true, message: '${'$'}{title}不能为空' },\n            <#elseif subFieldValidType!=''>\n          { required: false},\n            </#if>\n        <#-- 其他情况下，只要有值就被认为是正则校验 -->\n            <#if subFieldValidType?length gt 0>\n            <#assign subMessage = '格式不正确'>\n            <#if subFieldValidType == 'only' >\n                <#assign subMessage = '不能重复'>\n            </#if>\n          { pattern: \"${subFieldValidType}\", message: \"${'$'}{title}${subMessage}\" }\n                <#t>\n            </#if>\n        </#if>\n        ],\n    </#if>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/common/validatorRulesTemplate/sub.ftl",
    "content": "        validatorRules: {\n<#list sub.colums as po>\n  <#include \"core.ftl\">\n</#list>\n        },\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai",
    "content": "package ${bussiPackage}.${entityPackage}.controller;\n\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\nimport java.io.IOException;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLDecoder;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.query.QueryRuleEnum;\nimport org.jeecg.common.util.oConvertUtils;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\n\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport org.springframework.web.servlet.ModelAndView;\nimport com.alibaba.fastjson.JSON;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\n<#assign bpm_flag=false>\n<#assign has_multi_query_field=false>\n<#list originalColumns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')>\n   <#assign has_multi_query_field=true>\n</#if>\n</#list>\n<#assign enhanceJavaList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.enhanceJavaList??>\n  <#assign enhanceJavaList = tableVo.extendParams.enhanceJavaList?filter(enhance -> enhance??)>\n</#if>\n /**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Tag(name=\"${tableVo.ftlDescription}\")\n@RestController\n@RequestMapping(\"/${entityPackagePath}/${entityName?uncap_first}\")\n@Slf4j\npublic class ${entityName}Controller extends JeecgController<${entityName}, I${entityName}Service> {\n\t@Autowired\n\tprivate I${entityName}Service ${entityName?uncap_first}Service;\n\t\n\t/**\n\t * 分页列表查询\n\t *\n\t * @param ${entityName?uncap_first}\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t//@AutoLog(value = \"${tableVo.ftlDescription}-分页列表查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-分页列表查询\")\n\t@GetMapping(value = \"/list\")\n\tpublic Result<IPage<${entityName}>> queryPageList(${entityName} ${entityName?uncap_first},\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t   HttpServletRequest req) {\n\n<#if enhanceJavaList?size gt 0>\n <#list enhanceJavaList as enhanceJava>\n <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'>\n       //TODO 查询前触发的方法，代码生成后，请手工实现增强类逻辑;\n       //${entityName?uncap_first}Service.beforeQuery()\n </#if>\n </#list>\n</#if>\n\n    <#if has_multi_query_field>\n        // 自定义查询规则\n        Map<String, QueryRuleEnum> customeRuleMap = new HashMap<>();\n        // 自定义多选的查询规则为：LIKE_WITH_OR\n    <#list originalColumns as po>\n        <#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')>\n        customeRuleMap.put(\"${po.fieldName}\", QueryRuleEnum.LIKE_WITH_OR);\n        </#if>\n    </#list>\n        QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap(),customeRuleMap);\n    <#else>\n        QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap());\n    </#if>\n\t\tPage<${entityName}> page = new Page<${entityName}>(pageNo, pageSize);\n\t\tIPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper);\n<#if enhanceJavaList?size gt 0>\n <#list enhanceJavaList as enhanceJava>\n <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'>\n      //TODO 查询后触发的方法，代码生成后，请手工实现增强类逻辑;\n      //${entityName?uncap_first}Service.afterQuery()\n </#if>\n </#list>\n</#if>\n\t\treturn Result.OK(pageList);\n\t}\n\t\n\t/**\n\t *   添加\n\t *\n\t * @param ${entityName?uncap_first}\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-添加\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-添加\")\n\t@RequiresPermissions(\"${entityPackage}:${tableName}:add\")\n\t@PostMapping(value = \"/add\")\n\tpublic Result<String> add(@RequestBody ${entityName} ${entityName?uncap_first}) {\n<#if enhanceJavaList?size gt 0>\n  <#list enhanceJavaList as enhanceJava>\n  <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='start'  && enhanceJava.activeStatus=='1'>\n      //TODO 新增前的处理方法，代码生成后，请手工实现增强类逻辑;\n      //${entityName?uncap_first}Service.beforeAdd()\n  </#if>\n  </#list>\n</#if>\n\t    <#if bpm_flag>\n        ${entityName?uncap_first}.setBpmStatus(\"1\");\n\t    </#if>\n\t\t${entityName?uncap_first}Service.save(${entityName?uncap_first});\n\n<#if enhanceJavaList?size gt 0>\n  <#list enhanceJavaList as enhanceJava>\n  <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='end'  && enhanceJava.activeStatus=='1'>\n       //TODO 新增后的处理方法，代码生成后，请手工实现增强类逻辑;\n       //${entityName?uncap_first}Service.afterAdd()\n  </#if>\n  </#list>\n</#if>\n\t\treturn Result.OK(\"添加成功！\");\n\t}\n\t\n\t/**\n\t *  编辑\n\t *\n\t * @param ${entityName?uncap_first}\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-编辑\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-编辑\")\n\t@RequiresPermissions(\"${entityPackage}:${tableName}:edit\")\n\t@RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n\tpublic Result<String> edit(@RequestBody ${entityName} ${entityName?uncap_first}) {\n<#if enhanceJavaList?size gt 0>\n  <#list enhanceJavaList as enhanceJava>\n  <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='start'  && enhanceJava.activeStatus=='1'>\n       //TODO 编辑前，代码生成后，请手工实现增强类逻辑;\n       //${entityName?uncap_first}Service.beforeEdit()\n  </#if>\n  </#list>\n</#if>\n\t\t${entityName?uncap_first}Service.updateById(${entityName?uncap_first});\n<#if enhanceJavaList?size gt 0>\n  <#list enhanceJavaList as enhanceJava>\n  <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'>\n      //TODO 编辑后，代码生成后，请手工实现增强类逻辑;\n      //${entityName?uncap_first}Service.afterEdit()\n  </#if>\n  </#list>\n</#if>\n\t\treturn Result.OK(\"编辑成功!\");\n\t}\n\t\n\t/**\n\t *   通过id删除\n\t *\n\t * @param id\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-通过id删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id删除\")\n\t@RequiresPermissions(\"${entityPackage}:${tableName}:delete\")\n\t@DeleteMapping(value = \"/delete\")\n\tpublic Result<String> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${entityName?uncap_first}Service.removeById(id);\n\t\treturn Result.OK(\"删除成功!\");\n\t}\n\t\n\t/**\n\t *  批量删除\n\t *\n\t * @param ids\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-批量删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-批量删除\")\n\t@RequiresPermissions(\"${entityPackage}:${tableName}:deleteBatch\")\n\t@DeleteMapping(value = \"/deleteBatch\")\n\tpublic Result<String> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tthis.${entityName?uncap_first}Service.removeByIds(Arrays.asList(ids.split(\",\")));\n\t\treturn Result.OK(\"批量删除成功!\");\n\t}\n\t\n\t/**\n\t * 通过id查询\n\t *\n\t * @param id\n\t * @return\n\t */\n\t//@AutoLog(value = \"${tableVo.ftlDescription}-通过id查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id查询\")\n\t@GetMapping(value = \"/queryById\")\n\tpublic Result<${entityName}> queryById(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${entityName} ${entityName?uncap_first} = ${entityName?uncap_first}Service.getById(id);\n\t\tif(${entityName?uncap_first}==null) {\n\t\t\treturn Result.error(\"未找到对应数据\");\n\t\t}\n\t\treturn Result.OK(${entityName?uncap_first});\n\t}\n\n    /**\n    * 导出excel\n    *\n    * @param request\n    * @param ${entityName?uncap_first}\n    */\n    @RequiresPermissions(\"${entityPackage}:${tableName}:exportXls\")\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) {\n<#if enhanceJavaList?size gt 0>\n <#list enhanceJavaList as enhanceJava>\n <#if enhanceJava.buttonCode=='export' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'>\n      //TODO 导出前，代码生成后，请手工实现增强类逻辑;\n      //${entityName?uncap_first}Service.beforeExport()\n </#if>\n </#list>\n</#if>\n        return super.exportXls(request, ${entityName?uncap_first}, ${entityName}.class, \"${tableVo.ftlDescription}\");\n    }\n\n    /**\n      * 通过excel导入数据\n    *\n    * @param request\n    * @param response\n    * @return\n    */\n    @RequiresPermissions(\"${entityPackage}:${tableName}:importExcel\")\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n    <#if enhanceJavaList?size gt 0>\n     <#list enhanceJavaList as enhanceJava>\n     <#if enhanceJava.buttonCode=='import' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'>\n          //TODO 导入前，代码生成后，请手工实现增强类逻辑;\n          //${entityName?uncap_first}Service.beforeImport()\n     </#if>\n     </#list>\n    </#if>\n        return super.importExcel(request, response, ${entityName}.class);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai",
    "content": "<#include \"/common/utils.ftl\">\npackage ${bussiPackage}.${entityPackage}.entity;\n\nimport java.io.Serializable;\nimport java.io.UnsupportedEncodingException;\nimport java.util.Date;\nimport java.math.BigDecimal;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport org.jeecg.common.constant.ProvinceCityArea;\nimport org.jeecg.common.util.SpringContextUtils;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Data\n@TableName(\"${tableName}\")\n@Accessors(chain = true)\n@EqualsAndHashCode(callSuper = false)\n@Schema(description=\"${tableVo.ftlDescription}\")\npublic class ${entityName} implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    <#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']>\n    <#assign excel_ignore_classType_arr=['pca','switch','cat_tree']>\n    <#list originalColumns as po>\n    <#-- 生成字典Code -->\n    <#assign list_field_dictCode=\"\">\n    <#if po.classType='sel_user'>\n      <#assign list_field_dictCode=', dictTable = \"sys_user\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"realname\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"username\\\")?trim)}\"'>\n    <#elseif po.classType='sel_depart'>\n      <#assign list_field_dictCode=', dictTable = \"sys_depart\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"depart_name\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"id\\\")?trim)}\"'>\n    <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>\n      <#if po.dictTable?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText}\", dicCode = \"${po.dictField}\"'>\n      <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dicCode = \"${po.dictField}\"'>\n      </#if>\n    <#elseif po.classType=='sel_tree'>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText?split(\",\")[2]}\", dicCode = \"${po.dictText?split(\",\")[0]}\"'>\n     <#elseif po.classType=='link_table'>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicCode = \"${po.dictField}\", dicText = \"${po.dictText?split(\",\")[0]}\"'>\n    </#if>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t@TableId(type = IdType.ASSIGN_ID)\n\t<#else>\n  \t\t<#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'>\n\t\t\t<#if po.classType=='date'>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t\t\t<#else>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t\t\t</#if>\n\t\t<#else>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\") && !excel_ignore_classType_arr?seq_contains(\"${po.classType}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n\t</#if>\n  \t\t</#if>\n      <#if list_field_dictCode?length gt 1>\n\t@Dict(${list_field_dictCode?substring(2)})\n      </#if>\n  \t\t<#--  <#if po.classType!='popup'>\n  \t\t\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n  \t@Dict(dicCode=\"${po.dictField}\",dicText=\"${po.dictText}\",dictTable=\"${po.dictTable}\")\n  \t\t\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n  \t@Dict(dicCode=\"${po.dictField}\")\n  \t\t\t</#if>\n  \t\t</#if>-->\n    </#if>\n    <#include \"/common/blob.ftl\">\n\t</#list>\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai",
    "content": "package ${bussiPackage}.${entityPackage}.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface ${entityName}Mapper extends BaseMapper<${entityName}> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service;\n\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface I${entityName}Service extends IService<${entityName}> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service.impl;\n\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport ${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper;\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\nimport org.springframework.stereotype.Service;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Service\npublic class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/uniapp/${entityName}Form.vue",
    "content": "<template>\n    <view>\n        <!--标题和返回-->\n\t\t<cu-custom :bgColor=\"NavBarColor\" isBack :backRouterName=\"backRouteName\">\n\t\t\t<block slot=\"backText\">返回</block>\n\t\t\t<block slot=\"content\">${tableVo.ftlDescription}</block>\n\t\t</cu-custom>\n\t\t <!--表单区域-->\n\t\t<view>\n\t\t\t<form>\n    <#list columns as po><#rt/>\n    <#if po.fieldName !='id'><#rt/>\n         <#if po.classType =='date'>\n              <my-date label=\"${po.filedComment}：\" fields=\"day\" v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\"></my-date>\n         <#elseif po.classType =='datetime'>\n              <my-date label=\"${po.filedComment}：\" v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\"></my-date>\n         <#else>\n              <view class=\"cu-form-group\">\n                <view class=\"flex align-center\">\n                  <view class=\"title\"><text space=\"ensp\">${po.filedComment}：</text></view>\n                  <input <#if \"int,BigDecimal,double,\"?contains(po.fieldDbType)>type=\"number\"</#if> placeholder=\"请输入${po.filedComment}\" v-model=\"model.${po.fieldName}\"/>\n                </view>\n              </view>\n        </#if>\n    </#if>\n    </#list>\n\t\t\t\t<view class=\"padding\">\n\t\t\t\t\t<button class=\"cu-btn block bg-blue margin-tb-sm lg\" @click=\"onSubmit\">\n\t\t\t\t\t\t<text v-if=\"loading\" class=\"cuIcon-loading2 cuIconfont-spin\"></text>提交\n\t\t\t\t\t</button>\n\t\t\t\t</view>\n\t\t\t</form>\n\t\t</view>\n    </view>\n</template>\n\n<script>\n    import myDate from '@/components/my-componets/my-date.vue'\n\n    export default {\n        name: \"${entityName}Form\",\n        components:{ myDate },\n        props:{\n          formData:{\n              type:Object,\n              default:()=>{},\n              required:false\n          }\n        },\n        data(){\n            return {\n\t\t\t\tCustomBar: this.CustomBar,\n\t\t\t\tNavBarColor: this.NavBarColor,\n\t\t\t\tloading:false,\n                model: {},\n                backRouteName:'index',\n                url: {\n                  queryById: \"/${entityPackagePath}/${entityName?uncap_first}/queryById\",\n                  add: \"/${entityPackagePath}/${entityName?uncap_first}/add\",\n                  edit: \"/${entityPackagePath}/${entityName?uncap_first}/edit\",\n                },\n            }\n        },\n        created(){\n             this.initFormData();\n        },\n        methods:{\n           initFormData(){\n               if(this.formData){\n                    let dataId = this.formData.dataId;\n                    this.$http.get(this.url.queryById,{params:{id:dataId}}).then((res)=>{\n                        if(res.data.success){\n                            console.log(\"表单数据\",res);\n                            this.model = res.data.result;\n                        }\n                    })\n                }\n            },\n            onSubmit() {\n                let myForm = {...this.model};\n                this.loading = true;\n                let url = myForm.id?this.url.edit:this.url.add;\n\t\t\t\tthis.$http.post(url,myForm).then(res=>{\n\t\t\t\t   console.log(\"res\",res)\n\t\t\t\t   this.loading = false\n\t\t\t\t   this.$Router.push({name:this.backRouteName})\n\t\t\t\t}).catch(()=>{\n\t\t\t\t\tthis.loading = false\n\t\t\t\t});\n            }\n        }\n    }\n</script>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/uniapp/${entityName}List.vue",
    "content": "<template>\n\t<view>\n\t   <!--标题和返回-->\n\t\t<cu-custom :bgColor=\"NavBarColor\" isBack>\n\t\t\t<block slot=\"backText\">返回</block>\n\t\t\t<block slot=\"content\">${tableVo.ftlDescription}</block>\n\t\t</cu-custom>\n\t\t<!--滚动加载列表-->\n\t\t<mescroll-body ref=\"mescrollRef\" bottom=\"88\"  @init=\"mescrollInit\" :up=\"upOption\" :down=\"downOption\" @down=\"downCallback\" @up=\"upCallback\">\n\t\t    <view class=\"cu-list menu\">\n\t\t\t\t<view class=\"cu-item\" v-for=\"(item,index) in list\" :key=\"index\" @click=\"goHome\">\n\t\t\t\t\t<view class=\"flex\" style=\"width:100%\">\n                        <text class=\"text-lg\" style=\"color: #000;\">\n                             {{ item.createBy}}\n                        </text>\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t</mescroll-body>\n\t</view>\n</template>\n\n<script>\n\timport MescrollMixin from \"@/components/mescroll-uni/mescroll-mixins.js\";\n\timport Mixin from \"@/common/mixin/Mixin.js\";\n\n\texport default {\n\t\tname: '${tableVo.ftlDescription}',\n\t\tmixins: [MescrollMixin,Mixin],\n\t\tdata() {\n\t\t\treturn {\n\t\t\t\tCustomBar:this.CustomBar,\n\t\t\t\tNavBarColor:this.NavBarColor,\n\t\t\t\turl: \"/${entityPackagePath}/${entityName?uncap_first}/list\",\n\t\t\t};\n\t\t},\n\t\tmethods: {\n\t\t\tgoHome(){\n                this.$Router.push({name: \"index\"})\n\t\t\t}\n\t\t}\n\t}\n</script>\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/uniapp3/${entityName}Data.tsi",
    "content": "import { render } from '@/common/renderUtils';\n//列表数据\nexport const columns = [\n <#list columns as po>\n   <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n   {\n    title: '${po.filedComment}',\n    align:\"center\",\n    <#if po.sort=='Y'>\n    sorter: true,\n    </#if>\n    <#if po.classType=='date'>\n    dataIndex: '${po.fieldName}',\n    <#elseif po.fieldDbType=='Blob'>\n    dataIndex: '${po.fieldName}String'\n    <#elseif po.classType=='umeditor'>\n    dataIndex: '${po.fieldName}',\n    <#elseif po.classType=='pca'>\n    dataIndex: '${po.fieldName}',\n    <#elseif po.classType=='file'>\n    dataIndex: '${po.fieldName}',\n    <#elseif po.classType=='image'>\n    dataIndex: '${po.fieldName}',\n    customRender:render.renderImage,\n    <#elseif po.classType=='switch'>\n    dataIndex: '${po.fieldName}',\n    <#assign switch_extend_arr=['Y','N']>\n    <#if po.dictField?default(\"\")?contains(\"[\")>\n    <#assign switch_extend_arr=po.dictField?eval>\n    </#if>\n    <#list switch_extend_arr as a>\n    <#if a_index == 0>\n    <#assign switch_extend_arr1=a>\n    <#else>\n    <#assign switch_extend_arr2=a>\n    </#if>\n    </#list>\n    customRender:({text}) => {\n       return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}])\n     },\n    <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict'>\n    dataIndex: '${po.fieldName}_dictText'\n    <#else>\n    dataIndex: '${po.fieldName}'\n    </#if>\n   },\n   </#if>\n </#list>\n];"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/uniapp3/${entityName}Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<route lang=\"json5\" type=\"page\">\n{\nlayout: 'default',\nstyle: {\nnavigationStyle: 'custom',\nnavigationBarTitleText: '${tableVo.ftlDescription}',\n},\n}\n</route>\n<template>\n<#assign onlyFields = []>\n  <PageLayout :navTitle=\"navTitle\" :backRouteName=\"backRouteName\">\n    <scroll-view class=\"scrollArea\" scroll-y>\n      <view class=\"form-container\">\n        <wd-form ref=\"form\" :model=\"myFormData\">\n          <wd-cell-group border>\n      <#list columns as po><#rt/>\n      <#assign form_field_dictCode=\"\">\n      \t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n      \t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n      \t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n      \t\t<#assign form_field_dictCode=\"${po.dictField}\">\n      \t</#if>\n          <view class=\"{ 'mt-14px': ${po_index % 2} == 0 }\">\n              <#if po.fieldName !='id' && po.isShow =='Y' && po.fieldName !='delFlag'><#rt/>\n              <#if po.classType =='image'>\n               <!-- 图片 -->\n            <wd-cell\n                :title=\"get4Label('${po.filedComment}')\"\n                title-width=\"100px\"\n                <#if po.nullable == 'N'>\n                :required=\"true\"\n                </#if>\n             >\n              <online-image\n                  v-model:value=\"myFormData[${autoStringSuffix(po)}]\"\n                  name=${autoStringSuffix(po)}\n                  <#if po.uploadnum??>\n                  :maxNum=\"${po.uploadnum}\"\n                  </#if>\n              />\n            </wd-cell>\n            <#elseif po.classType =='file'>\n             <wd-cell\n                :title=\"get4Label('${po.filedComment}')\"\n                title-width=\"100px\"\n                <#if po.nullable == 'N'>\n                :required=\"true\"\n                </#if>\n             >\n\n            <online-file-custom\n            v-model:value=\"myFormData[${autoStringSuffix(po)}]\"\n            name=${autoStringSuffix(po)}\n            ></online-file-custom>\n            </wd-cell>\n            <#elseif po.classType =='datetime' || po.classType =='time'>\n              <DateTime\n                  :label=\"get4Label('${po.filedComment}')\"\n                  labelWidth=\"100px\"\n                  type=\"${po.classType}\"\n                  <#if po.classType =='datetime'>\n                  format=\"YYYY-MM-DD HH:mm:ss\"\n                  <#else>\n                  format=\"HH:mm:ss\"\n                 </#if>\n                  name=${autoStringSuffix(po)}\n                  v-model=\"myFormData[${autoStringSuffix(po)}]\"\n              ></DateTime>\n            <#elseif po.classType =='date'>\n              <online-date\n                  :label=\"get4Label('${po.filedComment}')\"\n                  labelWidth=\"100px\"\n                  <#if po.extendParams?exists && po.extendParams.picker?exists>\n                  :type=\"getDateExtendType('${po.extendParams.picker}')\"\n                  <#else>\n                  type=\"${po.classType}\"\n                  </#if>\n                  name=${autoStringSuffix(po)}\n                  v-model:value=\"myFormData[${autoStringSuffix(po)}]\"\n              ></online-date>\n              <#elseif po.classType =='switch'>\n<#assign switch_extend_arr=['Y','N']>\n<#if po.dictField?default(\"\")?contains(\"[\")>\n<#assign switch_extend_arr=po.dictField?eval>\n</#if>\n        <!-- 开关 -->\n              <wd-cell\n                :label=\"get4Label('${po.filedComment}')\"\n                name=${autoStringSuffix(po)}\n                title-width=\"100px\"\n                center\n              >\n                <wd-switch\n                  :label=\"get4Label('${po.filedComment}')\"\n                  name=${autoStringSuffix(po)}\n                  size=\"18px\"\n                  v-model=\"myFormData[${autoStringSuffix(po)}]\"\n                  active-value=\"${switch_extend_arr[0]}\"\n                  inactive-value=\"${switch_extend_arr[1]}\"\n                />\n             </wd-cell>\n            <#elseif po.classType =='list' || po.classType =='sel_search'>\n              <online-select\n                :label=\"get4Label('${po.filedComment}')\"\n                 labelWidth=\"100px\"\n                 type=\"${po.classType}\"\n                 name=${autoStringSuffix(po)}\n                 dict=\"${form_field_dictCode}\"\n                v-model=\"myFormData[${autoStringSuffix(po)}]\"\n              ></online-select>\n            <#elseif po.classType =='checkbox'>\n              <online-checkbox\n                :label=\"get4Label('${po.filedComment}')\"\n                 labelWidth=\"100px\"\n                 type=\"${po.classType}\"\n                 name=${autoStringSuffix(po)}\n                 dict=\"${form_field_dictCode}\"\n                v-model=\"myFormData[${autoStringSuffix(po)}]\"\n              ></online-checkbox>\n            <#elseif po.classType =='radio'>\n              <online-radio\n                :label=\"get4Label('${po.filedComment}')\"\n                 labelWidth=\"100px\"\n                 type=\"${po.classType}\"\n                 name=${autoStringSuffix(po)}\n                 dict=\"${form_field_dictCode}\"\n                v-model=\"myFormData[${autoStringSuffix(po)}]\"\n              ></online-radio>\n            <#elseif po.classType =='list_multi'>\n              <online-multi\n                :label=\"get4Label('${po.filedComment}')\"\n                 labelWidth=\"100px\"\n                 type=\"${po.classType}\"\n                 name=${autoStringSuffix(po)}\n                 dict=\"${form_field_dictCode}\"\n                v-model=\"myFormData[${autoStringSuffix(po)}]\"\n              ></online-multi>\n            <#elseif po.classType =='textarea' || po.classType =='markdown'  || po.classType =='umeditor'>\n              <wd-textarea\n                :label=\"get4Label('${po.filedComment}')\"\n                 labelWidth=\"100px\"\n                 type=\"${po.classType}\"\n                 name=${autoStringSuffix(po)}\n                 prop=${autoStringSuffix(po)}\n                 clearable\n                 :maxlength=\"300\"\n                v-model=\"myFormData[${autoStringSuffix(po)}]\"\n              ></wd-textarea>\n            <#elseif po.classType =='password'>\n              <wd-input\n                :label=\"get4Label('${po.filedComment}')\"\n                 labelWidth=\"100px\"\n                 show-password\n                 name=${autoStringSuffix(po)}\n                 prop=${autoStringSuffix(po)}\n                 clearable\n                v-model=\"myFormData[${autoStringSuffix(po)}]\"\n              ></wd-input>\n            <#elseif po.classType =='pca'>\n              <online-pca\n                :label=\"get4Label('${po.filedComment}')\"\n                 labelWidth=\"100px\"\n                 name=${autoStringSuffix(po)}\n                 prop=${autoStringSuffix(po)}\n                 clearable\n                v-model:value=\"myFormData[${autoStringSuffix(po)}]\"\n              ></online-pca>\n            <#elseif po.classType =='popup_dict'>\n             <PopupDict\n                  labelWidth=\"100px\"\n                 :label=\"get4Label('${po.filedComment}')\"\n                 v-model=\"myFormData[${autoStringSuffix(po)}]\"\n                 :multi=\"${po.extendParams.popupMulti?c}\"\n                 dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\"\n               ></PopupDict>\n            <#elseif po.classType =='popup'>\n            <#assign sourceFields = po.dictField?default(\"\")?trim?split(\",\")/>\n            <#assign targetFields = po.dictText?default(\"\")?trim?split(\",\")/>\n             <Popup\n                labelWidth=\"100px\"\n                :label=\"get4Label('${po.filedComment}')\"\n                v-model=\"myFormData[${autoStringSuffix(po)}]\"\n                :multi=\"${po.extendParams.popupMulti?c}\"\n                code=\"${po.dictTable}\"\n                :setFieldsValue=\"setFieldsValue\"\n                :fieldConfig=\"[\n                    <#list sourceFields as fieldName>\n                    { source: '${fieldName}', target: '${dashedToCamel(targetFields[fieldName_index])}' },\n                    </#list>\n                ]\"\n              ></Popup>\n            <#elseif po.classType =='link_table'>\n             <online-popup-link-record\n                :label=\"get4Label('${po.filedComment}')\"\n                labelWidth=\"100px\"\n                 name=${autoStringSuffix(po)}\n                :formSchema=\"getFormSchema('${po.dictTable}','${po.dictField}','${po.dictText}')\"\n                v-model:value=\"myFormData[${autoStringSuffix(po)}]\"\n              ></online-popup-link-record>\n            <#elseif po.classType =='sel_user'>\n            <select-user\n                labelWidth=\"100px\"\n                :label=\"get4Label('${po.filedComment}')\"\n                 name=${autoStringSuffix(po)}\n                 v-model=\"myFormData[${autoStringSuffix(po)}]\"\n                 <#if po.extendParams?exists && po.extendParams.text?exists>labelKey=\"${po.extendParams.text}\"</#if>\n                 <#if po.extendParams?exists && po.extendParams.store?exists>rowKey=\"${po.extendParams.store}\"</#if>\n              ></select-user>\n            <#elseif po.classType =='sel_depart'>\n              <select-dept\n                labelWidth=\"100px\"\n                :label=\"get4Label('${po.filedComment}')\"\n                name=${autoStringSuffix(po)}\n                v-model=\"myFormData[${autoStringSuffix(po)}]\"\n                <#if po.extendParams?exists && po.extendParams.text?exists>labelKey=\"${po.extendParams.text}\"</#if>\n                <#if po.extendParams?exists && po.extendParams.store?exists>rowKey=\"${po.extendParams.store}\"</#if>\n                :multiple=\"${po.extendParams.multi?default('true')}\"\n              ></select-dept>\n            <#elseif po.classType =='cat_tree'>\n            <CategorySelect\n                labelWidth=\"100px\"\n                :label=\"get4Label('${po.filedComment}')\"\n                v-model=\"myFormData[${autoStringSuffix(po)}]\"\n                pcode=\"${po.dictField?default(\"\")}\"\n              ></CategorySelect>\n            <#elseif po.classType =='sel_tree'>\n            <TreeSelect\n                labelWidth=\"100px\"\n                :label=\"get4Label('${po.filedComment}')\"\n                 v-model=\"myFormData[${autoStringSuffix(po)}]\"\n                <#if po.dictText??>\n                <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n                dict=\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\"\n                <#elseif po.dictText?split(',')[1]??>\n                pidField=\"${po.dictText?split(',')[1]}\"\n                <#elseif po.dictText?split(',')[3]??>\n                hasChildField=\"${po.dictText?split(',')[3]}\"\n                </#if>\n                </#if>\n                :pidValue=\"`${po.dictField}`\"\n              ></TreeSelect>\n            <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n               <wd-input\n                   label-width=\"100px\"\n                   v-model=\"myFormData[${autoStringSuffix(po)}]\"\n                   :label=\"get4Label('${po.filedComment}')\"\n                   name=${autoStringSuffix(po)}\n                   prop=${autoStringSuffix(po)}\n                   placeholder=\"请选择${po.filedComment}\"\n                   inputMode=\"numeric\"\n                   :rules=\"[\n                   <#if po.fieldName != 'id'>\n                    <#assign fieldValidType = po.fieldValidType!''>\n                        <#-- 非空校验 -->\n                       <#if po.nullable == 'N' || fieldValidType == '*'>\n                             { required: true, message: '请输入${po.filedComment}!'},\n                       <#elseif fieldValidType!=''>\n                             { required: false},\n                       </#if>\n                       <#-- 6到16位数字 -->\n                       <#if fieldValidType == 'n6-16'>\n                             { pattern: /^\\d{6,16}$|^(?=\\d+\\.\\d+)[\\d.]{7,17}$/, message: '请输入6到16位数字!'},\n                       <#-- 6到16位任意字符 -->\n                       <#elseif fieldValidType == '*6-16'>\n                             { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},\n                       <#-- 6到18位字母 -->\n                       <#elseif fieldValidType == 's6-18'>\n                             { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},\n                       <#-- 网址 -->\n                       <#elseif fieldValidType == 'url'>\n                             { pattern: /^((ht|f)tps?):\\/\\/[\\w\\-]+(\\.[\\w\\-]+)+([\\w\\-.,@?^=%&:\\/~+#]*[\\w\\-@?^=%&\\/~+#])?$/, message: '请输入正确的网址!'},\n                       <#-- 电子邮件 -->\n                       <#elseif fieldValidType == 'e'>\n                             { pattern: /^([\\w]+\\.*)([\\w]+)@[\\w]+\\.\\w{3}(\\.\\w{2}|)$/, message: '请输入正确的电子邮件!'},\n                       <#-- 手机号码 -->\n                       <#elseif fieldValidType == 'm'>\n                             { pattern: /^1[3456789]\\d{9}$/, message: '请输入正确的手机号码!'},\n                       <#-- 邮政编码 -->\n                       <#elseif fieldValidType == 'p'>\n                             { pattern: /^[0-9]\\d{5}$/, message: '请输入正确的邮政编码!'},\n                       <#-- 字母 -->\n                       <#elseif fieldValidType == 's'>\n                             { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},\n                       <#-- 数字 -->\n                       <#elseif fieldValidType == 'n'>\n                             { pattern: /^-?\\d+\\.?\\d*$/, message: '请输入数字!'},\n                       <#-- 整数 -->\n                       <#elseif fieldValidType == 'z'>\n                             { pattern: /^-?\\d+$/, message: '请输入整数!'},\n                       <#-- 金额 -->\n                       <#elseif fieldValidType == 'money'>\n                             { pattern: /^(([1-9][0-9]*)|([0]\\.\\d{0,2}|[1-9][0-9]*\\.\\d{0,2}))$/, message: '请输入正确的金额!'},\n                       <#-- 唯一校验 -->\n                       <#elseif fieldValidType != '' && fieldValidType == 'only'>\n                          <#assign onlyFields = onlyFields + [autoStringSuffix(po)]>\n                       <#-- 正则校验 -->\n                       <#elseif fieldValidType != '' && fieldValidType != '*'>\n                             { pattern: /${fieldValidType}/, message: '不符合校验规则!'},\n                       <#-- 无校验 -->\n                       <#else>\n                           <#t>\n                       </#if>\n                     </#if>\n                   ]\"\n                   clearable\n              />\n            <#else>\n              <wd-input\n                  label-width=\"100px\"\n                  v-model=\"myFormData[${autoStringSuffix(po)}]\"\n                  :label=\"get4Label('${po.filedComment}')\"\n                  name=${autoStringSuffix(po)}\n                  prop=${autoStringSuffix(po)}\n                  placeholder=\"请选择${po.filedComment}\"\n                  :rules=\"[\n                 <#if po.fieldName != 'id'>\n                     <#assign fieldValidType = po.fieldValidType!''>\n                             <#-- 非空校验 -->\n                            <#if po.nullable == 'N' || fieldValidType == '*'>\n                                  { required: true, message: '请输入${po.filedComment}!'},\n                            <#elseif fieldValidType!=''>\n                                  { required: false},\n                            </#if>\n                            <#-- 6到16位数字 -->\n                            <#if fieldValidType == 'n6-16'>\n                                  { pattern: /^\\d{6,16}$|^(?=\\d+\\.\\d+)[\\d.]{7,17}$/, message: '请输入6到16位数字!'},\n                            <#-- 6到16位任意字符 -->\n                            <#elseif fieldValidType == '*6-16'>\n                                  { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},\n                            <#-- 6到18位字母 -->\n                            <#elseif fieldValidType == 's6-18'>\n                                  { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},\n                            <#-- 网址 -->\n                            <#elseif fieldValidType == 'url'>\n                                  { pattern: /^((ht|f)tps?):\\/\\/[\\w\\-]+(\\.[\\w\\-]+)+([\\w\\-.,@?^=%&:\\/~+#]*[\\w\\-@?^=%&\\/~+#])?$/, message: '请输入正确的网址!'},\n                            <#-- 电子邮件 -->\n                            <#elseif fieldValidType == 'e'>\n                                  { pattern: /^([\\w]+\\.*)([\\w]+)@[\\w]+\\.\\w{3}(\\.\\w{2}|)$/, message: '请输入正确的电子邮件!'},\n                            <#-- 手机号码 -->\n                            <#elseif fieldValidType == 'm'>\n                                  { pattern: /^1[3456789]\\d{9}$/, message: '请输入正确的手机号码!'},\n                            <#-- 邮政编码 -->\n                            <#elseif fieldValidType == 'p'>\n                                  { pattern: /^[0-9]\\d{5}$/, message: '请输入正确的邮政编码!'},\n                            <#-- 字母 -->\n                            <#elseif fieldValidType == 's'>\n                                  { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},\n                            <#-- 数字 -->\n                            <#elseif fieldValidType == 'n'>\n                                  { pattern: /^-?\\d+\\.?\\d*$/, message: '请输入数字!'},\n                            <#-- 整数 -->\n                            <#elseif fieldValidType == 'z'>\n                                  { pattern: /^-?\\d+$/, message: '请输入整数!'},\n                            <#-- 金额 -->\n                            <#elseif fieldValidType == 'money'>\n                                  { pattern: /^(([1-9][0-9]*)|([0]\\.\\d{0,2}|[1-9][0-9]*\\.\\d{0,2}))$/, message: '请输入正确的金额!'},\n                            <#-- 唯一校验 -->\n                            <#elseif fieldValidType != '' && fieldValidType == 'only'>\n                                <#assign onlyFields = onlyFields + [autoStringSuffix(po)]>\n                            <#-- 正则校验 -->\n                            <#elseif fieldValidType != '' && fieldValidType != '*'>\n                                  { pattern:  /${fieldValidType}/, message: '不符合校验规则!'},\n                            <#-- 无校验 -->\n                            <#else>\n                                <#t>\n                            </#if>\n                      </#if>\n                  ]\"\n                  clearable\n              />\n            </#if>\n          </#if>\n        </view>\n       </#list>\n          </wd-cell-group>\n        </wd-form>\n      </view>\n    </scroll-view>\n    <view class=\"footer\">\n      <wd-button :disabled=\"loading\" block :loading=\"loading\" @click=\"handleSubmit\">提交</wd-button>\n    </view>\n  </PageLayout>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onLoad } from '@dcloudio/uni-app'\nimport { http } from '@/utils/http'\nimport { useToast } from 'wot-design-uni'\nimport { useRouter } from '@/plugin/uni-mini-router'\nimport { ref, onMounted, computed,reactive } from 'vue'\nimport OnlineImage from '@/components/online/view/online-image.vue'\nimport OnlineFile from '@/components/online/view/online-file.vue'\nimport OnlineFileCustom from '@/components/online/view/online-file-custom.vue'\nimport OnlineSelect from '@/components/online/view/online-select.vue'\nimport OnlineTime from '@/components/online/view/online-time.vue'\nimport OnlineDate from '@/components/online/view/online-date.vue'\nimport OnlineRadio from '@/components/online/view/online-radio.vue'\nimport OnlineCheckbox from '@/components/online/view/online-checkbox.vue'\nimport OnlineMulti from '@/components/online/view/online-multi.vue'\nimport OnlinePopupLinkRecord from '@/components/online/view/online-popup-link-record.vue'\nimport OnlinePca from '@/components/online/view/online-pca.vue'\nimport SelectDept from '@/components/SelectDept/SelectDept.vue'\nimport SelectUser from '@/components/SelectUser/SelectUser.vue'\nimport {duplicateCheck} from \"@/service/api\";\ndefineOptions({\n  name: '${entityName}Form',\n  options: {\n    styleIsolation: 'shared',\n  },\n})\nconst toast = useToast()\nconst router = useRouter()\nconst form = ref(null)\n// 定义响应式数据\nconst myFormData = reactive({})\nconst loading = ref(false)\nconst navTitle = ref('新增')\nconst dataId = ref('')\nconst backRouteName = ref('${entityName}List')\n// 定义 initForm 方法\nconst initForm = (item) => {\n  console.log('initForm item', item)\n  if(item?.dataId){\n    dataId.value = item.dataId;\n    navTitle.value = item.dataId?'编辑':'新增';\n    initData();\n  }\n}\n// 初始化数据\nconst initData = () => {\n  http.get(\"/${entityPackagePath}/${entityName?uncap_first}/queryById\",{id:dataId.value}).then((res) => {\n    if (res.success) {\n      let obj = res.result\n      Object.assign(myFormData, { ...obj })\n    }else{\n      toast.error(res?.message || '表单加载失败！')\n    }\n  })\n}\nconst handleSuccess = () => {\n  uni.$emit('refreshList');\n  router.back()\n}\n/**\n * 校验唯一\n * @param values\n * @returns {boolean}\n */\nasync function fieldCheck(values: any) {\n   const onlyField = [\n     <#list onlyFields as field>\n       ${field}<#sep>, </#sep>\n     </#list>\n   ];\n   for (const field of onlyField) {\n      if (values[field]) {\n          // 仅校验有值的字段\n          const res: any = await duplicateCheck({\n              tableName: '${tableName}',\n              fieldName: field,  // 使用处理后的字段名\n              fieldVal: values[field],\n              dataId: values.id,\n          });\n          if (!res.success) {\n              toast.warning(res.message);\n              return true;  // 校验失败\n          }\n      }\n   }\n   return false;  // 校验通过\n}\n// 提交表单\nconst handleSubmit = async () => {\n // 判断字段必填和正则\n  if (await fieldCheck(myFormData)) {\n    return\n  }\n  let url = dataId.value?'/${entityPackagePath}/${entityName?uncap_first}/edit':'/${entityPackagePath}/${entityName?uncap_first}/add';\n  form.value\n    .validate()\n    .then(({ valid, errors }) => {\n      if (valid) {\n        loading.value = true;\n        http.post(url,myFormData).then((res) => {\n          loading.value = false;\n          if (res.success) {\n            toast.success('保存成功');\n            handleSuccess()\n          }else{\n            toast.error(res?.message || '表单保存失败！')\n          }\n        })\n      }\n    })\n    .catch((error) => {\n      console.log(error, 'error')\n      loading.value = false;\n    })\n}\n// 标题\nconst get4Label = computed(() => {\n  return (label) => {\n    return label && label.length > 4 ? label.substring(0, 4) : label;\n  }\n})\n\n// 标题\nconst getFormSchema = computed(() => {\n  return (dictTable,dictCode,dictText) => {\n    return {\n      dictCode,\n      dictTable,\n      dictText\n    };\n  }\n})\n/**\n * 获取日期控件的扩展类型\n * @param picker\n * @returns {string}\n */\nconst getDateExtendType = (picker: string) => {\n    let mapField = {\n      month: 'year-month',\n      year: 'year',\n      quarter: 'quarter',\n      week: 'week',\n      day: 'date',\n    }\n    return picker && mapField[picker]\n      ? mapField[picker]\n      : 'date'\n}\n//设置pop返回值\nconst setFieldsValue = (data) => {\n   Object.assign(myFormData, {...data })\n}\n// onLoad 生命周期钩子\nonLoad((option) => {\n  initForm(option)\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.footer {\n  width: 100%;\n  padding: 10px 20px;\n  padding-bottom: calc(constant(safe-area-inset-bottom) + 10px);\n  padding-bottom: calc(env(safe-area-inset-bottom) + 10px);\n}\n:deep(.wd-cell__label) {\n  font-size: 14px;\n  color: #444;\n}\n:deep(.wd-cell__value) {\n  text-align: left;\n}\n</style>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/uniapp3/${entityName}List.vuei",
    "content": "<route lang=\"json5\" type=\"page\">\n{\nlayout: 'default',\nstyle: {\nnavigationBarTitleText: '${tableVo.ftlDescription}',\nnavigationStyle: 'custom',\n},\n}\n</route>\n<template>\n  <PageLayout navTitle=\"${tableVo.ftlDescription}\"  backRouteName=\"index\" routeMethod=\"pushTab\">\n    <view class=\"wrap\">\n      <z-paging\n          ref=\"paging\"\n          :fixed=\"false\"\n          v-model=\"dataList\"\n          @query=\"queryList\"\n          :default-page-size=\"15\"\n      >\n        <template v-for=\"item in dataList\" :key=\"item.id\">\n          <wd-swipe-action>\n            <view class=\"list\" @click=\"handleEdit(item)\">\n              <template v-for=\"(cItem, cIndex) in columns\" :key=\"cIndex\">\n                <view v-if=\"cIndex < 3\" class=\"box\" :style=\"getBoxStyle\">\n                  <view class=\"field ellipsis\">{{ cItem.title }}</view>\n                  <view class=\"value cu-text-grey\">{{ item[cItem.dataIndex] }}</view>\n                </view>\n              </template>\n            </view>\n            <template #right>\n              <view class=\"action\">\n                <view class=\"button\" @click=\"handleAction('del', item)\">删除</view>\n              </view>\n            </template>\n          </wd-swipe-action>\n        </template>\n      </z-paging>\n      <view class=\"add u-iconfont u-icon-add\" @click=\"handleAdd\"></view>\n    </view>\n  </PageLayout>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted, computed } from 'vue'\nimport { http } from '@/utils/http'\nimport usePageList from '@/hooks/usePageList'\nimport {columns} from './${entityName}Data';\ndefineOptions({\n  name: '${entityName}List',\n  options: {\n    styleIsolation: 'shared',\n  }\n})\n//分页加载配置\nlet { toast, router, paging, dataList, queryList } = usePageList('/${entityPackagePath}/${entityName?uncap_first}/list');\n\n//样式\nconst getBoxStyle = computed(() => {\n  return { width: \"calc(33% - 5px)\" }\n})\n\n// 其他操作\nconst handleAction = (val, item) => {\n  if (val == 'del') {\n    http.delete(\"/${entityPackagePath}/${entityName?uncap_first}/delete?id=\"+item.id,{id:item.id}).then((res) => {\n      toast.success('删除成功~')\n      paging.value.reload()\n    })\n  }\n}\n\n// go 新增页\nconst handleAdd = () => {\n  router.push({\n    name: '${entityName}Form'\n  })\n}\n\n//go 编辑页\nconst handleEdit = (record) => {\n  router.push({\n    name: '${entityName}Form',\n    params: {dataId: record.id},\n  })\n}\n\nonMounted(() => {\n  // 监听刷新列表事件\n  uni.$on('refreshList', () => {\n    queryList(1,10)\n  })\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.wrap {\n  height: 100%;\n}\n:deep(.wd-swipe-action) {\n  margin-top: 10px;\n  background-color: #fff;\n}\n.list {\n  padding: 10px 10px;\n  width: 100%;\n  text-align: left;\n  display: flex;\n  justify-content: space-between;\n  .box {\n    width: 33%;\n    .field {\n      margin-bottom: 10px;\n      line-height: 20px;\n    }\n  }\n}\n.action {\n  width: 60px;\n  height: 100%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  .button {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    flex: 1;\n    height: 100%;\n    color: #fff;\n    &:first-child {\n      background-color: #fa4350;\n    }\n  }\n}\n.add {\n  height: 70upx;\n  width: 70upx;\n  text-align: center;\n  line-height: 70upx;\n  background-color: #fff;\n  border-radius: 50%;\n  position: fixed;\n  bottom: 80upx;\n  right: 30upx;\n  box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1);\n  color: #666;\n}\n</style>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n  <a-card :bordered=\"false\">\n    <!-- 查询区域 -->\n    <div class=\"table-page-search-wrapper\">\n      <a-form layout=\"inline\" @keyup.enter.native=\"searchQuery\">\n        <a-row :gutter=\"24\">\n<#assign query_field_no=0>\n<#assign query_flag=false>\n<#assign list_need_dict=false>\n<#assign list_need_category=false>\n<#assign list_need_pca=false>\n<#assign list_need_switch=false>\n<#assign bpm_flag=false>\n\n<#-- 开始循环 -->\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.isQuery=='Y'>\n<#assign query_flag=true>\n\t<#if query_field_no==2>\n          <template v-if=\"toggleSearchStatus\">\n\t</#if>\n\t<#assign query_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n\t    <#assign query_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n    <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign query_field_dictCode=\"${po.dictField}\">\n    </#if>\n\t<#if po.queryMode=='single'>\n          <#if query_field_no gt 1>  </#if><a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <#if query_field_no gt 1>  </#if><a-form-item label=\"${po.filedComment}\">\n            <#if po.classType=='sel_search'>\n              <#if query_field_no gt 1>  </#if><j-search-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dict=\"${po.dictTable},${po.dictText},${po.dictField}\"/>\n            <#elseif po.classType=='sel_user'>\n              <#if query_field_no gt 1>  </#if><j-select-user-by-dep placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"/>\n            <#elseif po.classType=='switch'>\n              <#if query_field_no gt 1>  </#if><j-switch placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" <#if po.dictField!= 'is_open'>:options=\"${po.dictField}\"</#if> query></j-switch>\n            <#elseif po.classType=='sel_depart'>\n              <#if query_field_no gt 1>  </#if><j-select-depart placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"/>\n            <#elseif po.classType=='list_multi'>\n              <#if query_field_no gt 1>  </#if><j-multi-select-tag placeholder=\"请选择${po.filedComment}\" dictCode=\"${query_field_dictCode?default(\"\")}\" v-model=\"queryParam.${po.fieldName}\"/>\n            <#elseif po.classType=='cat_tree'>\n              <#if query_field_no gt 1>  </#if><j-category-select placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\"/>\n\t\t\t<#elseif po.classType=='date'>\n              <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></j-date>\n\t\t\t<#elseif po.classType=='datetime'>\n              <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></j-date>\n            <#elseif po.classType=='pca'>\n              <#if query_field_no gt 1>  </#if><j-area-linkage type=\"cascader\" v-model=\"queryParam.${po.fieldName}\" placeholder=\"请选择省市区\"/>\n            <#elseif po.classType=='popup'>\n              <#if query_field_no gt 1>  </#if><j-popup placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" code=\"${po.dictTable}\" org-fields=\"${po.dictField}\" dest-fields=\"${po.dictText}\" :field=\"getPopupField('${po.dictText}')\" :multi=\"${po.extendParams.popupMulti?c}\"/>\n\t\t\t<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>\n\t\t\t<#--  ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->\n\t\t\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n              <#if query_field_no gt 1>  </#if><j-dict-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\"/>\n\t\t\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n              <#if query_field_no gt 1>  </#if><j-dict-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dictCode=\"${po.dictField}\"/>\n\t\t\t<#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n\t\t\t</#if>\n\t\t\t<#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n\t\t\t</#if>\n            <#if query_field_no gt 1>  </#if></a-form-item>\n          <#if query_field_no gt 1>  </#if></a-col>\n\t<#else>\n          <#if query_field_no gt 1>  </#if><a-col :xl=\"10\" :lg=\"11\" :md=\"12\" :sm=\"24\">\n            <#if query_field_no gt 1>  </#if><a-form-item label=\"${po.filedComment}\">\n\t\t\t<#if po.classType=='date'>\n              <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择开始日期\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></j-date>\n              <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n              <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择结束日期\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></j-date>\n\t\t\t<#elseif po.classType=='datetime'>\n              <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择开始时间\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></j-date>\n              <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n              <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择结束时间\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></j-date>\n\t\t\t<#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入最小值\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></a-input>\n              <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入最大值\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></a-input>\n\t\t\t</#if>\n            <#if query_field_no gt 1>  </#if></a-form-item>\n          <#if query_field_no gt 1>  </#if></a-col>\n\t</#if>\n<#assign query_field_no=query_field_no+1>\n</#if>\n<#if !list_need_dict && po.fieldShowType!='popup' && po.dictField?default(\"\")?trim?length gt 1>\n<#assign list_need_dict=true>\n</#if>\n<#if po.classType=='cat_tree' && po.dictText?default(\"\")?trim?length == 0>\n<#assign list_need_category=true>\n</#if>\n<#if po.classType=='pca'>\n<#assign list_need_pca=true>\n</#if>\n<#if po.classType=='switch'>\n<#assign list_need_switch=true>\n</#if>\n</#list>\n<#-- 结束循环 -->\n<#t>\n<#if query_field_no gt 2>\n          </template>\n</#if>\n<#if query_flag>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left;overflow: hidden;\" class=\"table-page-search-submitButtons\">\n              <a-button type=\"primary\" @click=\"searchQuery\" icon=\"search\">查询</a-button>\n              <a-button type=\"primary\" @click=\"searchReset\" icon=\"reload\" style=\"margin-left: 8px\">重置</a-button>\n              <a @click=\"handleToggleSearch\" style=\"margin-left: 8px\">\n                {{ toggleSearchStatus ? '收起' : '展开' }}\n                <a-icon :type=\"toggleSearchStatus ? 'up' : 'down'\"/>\n              </a>\n            </span>\n          </a-col>\n</#if>\n        </a-row>\n      </a-form>\n    </div>\n    <!-- 查询区域-END -->\n\n    <!-- 操作按钮区域 -->\n    <div class=\"table-operator\">\n      <a-button @click=\"handleAdd\" type=\"primary\" icon=\"plus\">新增</a-button>\n      <a-button type=\"primary\" icon=\"download\" @click=\"handleExportXls('${tableVo.ftlDescription}')\">导出</a-button>\n      <a-upload name=\"file\" :showUploadList=\"false\" :multiple=\"false\" :headers=\"tokenHeader\" :action=\"importExcelUrl\" @change=\"handleImportExcel\">\n        <a-button type=\"primary\" icon=\"import\">导入</a-button>\n      </a-upload>\n      <!-- 高级查询区域 -->\n      <j-super-query :fieldList=\"superFieldList\" ref=\"superQueryModal\" @handleSuperQuery=\"handleSuperQuery\"></j-super-query>\n      <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n        <a-menu slot=\"overlay\">\n          <a-menu-item key=\"1\" @click=\"batchDel\"><a-icon type=\"delete\"/>删除</a-menu-item>\n        </a-menu>\n        <a-button style=\"margin-left: 8px\"> 批量操作 <a-icon type=\"down\" /></a-button>\n      </a-dropdown>\n    </div>\n\n    <!-- table区域-begin -->\n    <div>\n      <div class=\"ant-alert ant-alert-info\" style=\"margin-bottom: 16px;\">\n        <i class=\"anticon anticon-info-circle ant-alert-icon\"></i> 已选择 <a style=\"font-weight: 600\">{{ selectedRowKeys.length }}</a>项\n        <a style=\"margin-left: 24px\" @click=\"onClearSelected\">清空</a>\n      </div>\n\n      <a-table\n        ref=\"table\"\n        size=\"middle\"\n        <#if tableVo.extendParams.scroll=='1'>\n        :scroll=\"{x:true}\"\n        </#if>\n        bordered\n        rowKey=\"id\"\n        :columns=\"columns\"\n        :dataSource=\"dataSource\"\n        :pagination=\"ipagination\"\n        :loading=\"loading\"\n        :rowSelection=\"{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}\"\n        class=\"j-table-force-nowrap\"\n        @change=\"handleTableChange\">\n\n        <template slot=\"htmlSlot\" slot-scope=\"text\">\n          <div v-html=\"text\"></div>\n        </template>\n        <template slot=\"imgSlot\" slot-scope=\"text,record\">\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无图片</span>\n          <img v-else :src=\"getImgView(text)\" :preview=\"record.id\" height=\"25px\" alt=\"\" style=\"max-width:80px;font-size: 12px;font-style: italic;\"/>\n        </template>\n        <#if list_need_pca>\n        <template slot=\"pcaSlot\" slot-scope=\"text\">\n          <div>{{ getPcaText(text) }}</div>\n        </template>\n        </#if>\n        <template slot=\"fileSlot\" slot-scope=\"text\">\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n          <a-button\n            v-else\n            :ghost=\"true\"\n            type=\"primary\"\n            icon=\"download\"\n            size=\"small\"\n            @click=\"downloadFile(text)\">\n            下载\n          </a-button>\n        </template>\n\n        <span slot=\"action\" slot-scope=\"text, record\">\n          <a @click=\"handleEdit(record)\">编辑</a>\n\n          <a-divider type=\"vertical\" />\n          <a-dropdown>\n            <a class=\"ant-dropdown-link\">更多 <a-icon type=\"down\" /></a>\n            <a-menu slot=\"overlay\">\n              <a-menu-item>\n                <a @click=\"handleDetail(record)\">详情</a>\n              </a-menu-item>\n              <#if bpm_flag>\n              <a-menu-item v-if=\"record.bpmStatus === '1'\">\n                <a @click=\"startProcess(record)\">发起流程</a>\n              </a-menu-item>\n              </#if>\n              <a-menu-item>\n                <a-popconfirm title=\"确定删除吗?\" @confirm=\"() => handleDelete(record.id)\">\n                  <a>删除</a>\n                </a-popconfirm>\n              </a-menu-item>\n            </a-menu>\n          </a-dropdown>\n        </span>\n\n      </a-table>\n    </div>\n\n    <${Format.humpToShortbar(entityName)}-modal ref=\"modalForm\" @ok=\"modalFormOk\"></${Format.humpToShortbar(entityName)}-modal>\n  </a-card>\n</template>\n\n<script>\n\n  import '@/assets/less/TableExpand.less'\n  import { mixinDevice } from '@/utils/mixin'\n  import { JeecgListMixin } from '@/mixins/JeecgListMixin'\n  import ${entityName}Modal from './modules/${entityName}Modal'\n  <#if bpm_flag>\n  import { postAction } from '@/api/manage'\n  </#if>\n  <#if list_need_category>\n  import { loadCategoryData } from '@/api/api'\n  </#if>\n  <#if list_need_dict>\n  import {filterMultiDictText} from '@/components/dict/JDictSelectUtil'\n  </#if>\n  <#if list_need_pca>\n  import Area from '@/components/_util/Area'\n  </#if>\n\n  export default {\n    name: '${entityName}List',\n    mixins:[JeecgListMixin, mixinDevice],\n    components: {\n      ${entityName}Modal\n    },\n    data () {\n      return {\n        description: '${tableVo.ftlDescription}管理页面',\n        // 表头\n        columns: [\n          {\n            title: '#',\n            dataIndex: '',\n            key:'rowIndex',\n            width:60,\n            align:\"center\",\n            customRender:function (t,r,index) {\n              return parseInt(index)+1;\n            }\n          },\n    <#assign showColNum=0>\n\t<#list columns as po>\n\t<#if po.isShowList =='Y' && po.fieldName !='id'>\n\t<#assign showColNum=showColNum+1>\n          {\n            title:'${po.filedComment}',\n            align:\"center\",\n            <#if po.sort=='Y'>\n            sorter: true,\n            </#if>\n            <#if po.classType=='date'>\n            dataIndex: '${po.fieldName}',\n            customRender:function (text) {\n              return !text?\"\":(text.length>10?text.substr(0,10):text)\n            }\n            <#elseif po.fieldDbType=='Blob'>\n            dataIndex: '${po.fieldName}String'\n            <#elseif po.classType=='umeditor'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'htmlSlot'}\n            <#elseif po.classType=='pca'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'pcaSlot'}\n            <#elseif po.classType=='file'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'fileSlot'}\n            <#elseif po.classType=='image'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'imgSlot'}\n            <#elseif po.classType=='switch'>\n            dataIndex: '${po.fieldName}',\n            customRender: (text) => (text ? filterMultiDictText(this.dictOptions['${po.fieldName}'], text) : ''),\n            <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user'>\n            dataIndex: '${po.fieldName}_dictText'\n            <#elseif po.classType=='cat_tree'>\n            <#if list_need_category>\n            dataIndex: '${po.fieldName}',\n            customRender: (text) => (text ? filterMultiDictText(this.dictOptions['${po.fieldName}'], text) : '')\n            <#else>\n            dataIndex: '${po.fieldName}',\n            customRender: (text, record) => (text ? record['${dashedToCamel(po.dictText)}'] : '')\n            </#if>\n\t\t\t<#else>\n            dataIndex: '${po.fieldName}'\n\t\t\t</#if>\n          },\n     </#if>\n     </#list>\n          {\n            title: '操作',\n            dataIndex: 'action',\n            align:\"center\",\n            <#if tableVo.extendParams.scroll=='1'>\n            fixed:\"right\",\n            width:147,\n            </#if>\n            scopedSlots: { customRender: 'action' }\n          }\n        ],\n        url: {\n          list: \"/${entityPackagePath}/${entityName?uncap_first}/list\",\n          delete: \"/${entityPackagePath}/${entityName?uncap_first}/delete\",\n          deleteBatch: \"/${entityPackagePath}/${entityName?uncap_first}/deleteBatch\",\n          exportXlsUrl: \"/${entityPackagePath}/${entityName?uncap_first}/exportXls\",\n          importExcelUrl: \"${entityPackagePath}/${entityName?uncap_first}/importExcel\",\n          <#if bpm_flag>startProcess: '/act/process/extActProcess/startMutilProcess'</#if>\n        },\n        <#if bpm_flag>\n        //代码生成后需手动设置流程编码\n        flowCode: 'dev_${tableName}_001',\n        </#if>\n        dictOptions:{},\n        <#if list_need_pca>\n        pcaData:'',\n        </#if>\n        superFieldList:[],\n      }\n    },\n    created() {\n    <#if list_need_pca>\n      this.pcaData = new Area()\n    </#if>\n    <#if list_need_switch>\n    <#list columns as po>\n    <#if po.classType=='switch'>\n      <#assign switch_extend_arr=['Y','N']>\n      <#if po.dictField?default(\"\")?contains(\"[\")>\n        <#assign switch_extend_arr=po.dictField?eval>\n      </#if>\n      <#list switch_extend_arr as a>\n       <#if a_index == 0>\n       <#assign switch_extend_arr1=a>\n       <#else>\n       <#assign switch_extend_arr2=a>\n       </#if>\n      </#list>\n      this.$set(this.dictOptions, '${po.fieldName}', [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}])\n    </#if>\n    </#list>\n    </#if>\n    this.getSuperFieldList();\n    },\n    computed: {\n      importExcelUrl: function(){\n        <#noparse>return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;</#noparse>\n      },\n    },\n    methods: {\n    <#if list_need_pca>\n      getPcaText(code){\n        return this.pcaData.getText(code);\n      },\n    </#if>\n      <#if bpm_flag>\n      startProcess(record){\n        this.$confirm({\n          title:'提示',\n          content:'确认提交流程吗?',\n          onOk:()=>{\n            let params = {\n              flowCode: this.flowCode,\n              id: record.id,\n              formUrl: '${entityPackagePath}/modules/${entityName}Form',\n              formUrlMobile: ''\n            }\n            postAction(this.url.startProcess, params).then(res=>{\n              if(res.success){\n                this.$message.success(res.message);\n                this.loadData();\n                this.onClearSelected();\n              }else{\n                this.$message.warning(res.message);\n              }\n            }).catch((e)=>{\n              this.$message.warning('不识别的请求!');\n            })\n          }\n        })\n      },\n      </#if>\n      initDictConfig(){\n      <#list columns as po>\n      <#if (po.isQuery=='Y' || po.isShowList=='Y') && po.classType!='popup'>\n        <#if po.classType=='cat_tree' && list_need_category==true>\n        loadCategoryData({code:'${po.dictField?default(\"\")}'}).then((res) => {\n          if (res.success) {\n            this.$set(this.dictOptions, '${po.fieldName}', res.result)\n          }\n        })\n        </#if>\n      </#if>\n      </#list>\n      },\n      getSuperFieldList(){\n        let fieldList=[];\n         <#list columns as po>\n        fieldList.push(${superQueryFieldList(po)})\n         </#list>\n        this.superFieldList = fieldList\n      }\n    }\n  }\n</script>\n<style scoped>\n  @import '~@assets/less/common.less';\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql",
    "content": "<#include \"/common/sql/menu_insert.ftl\">"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n  <a-spin :spinning=\"confirmLoading\">\n    <j-form-container :disabled=\"formDisabled\">\n      <a-form-model ref=\"form\" :model=\"model\" :rules=\"validatorRules\" slot=\"detail\">\n        <a-row>\n<#assign form_popup = false>\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign bpm_flag=false>\n<#assign form_span = 24>\n<#if tableVo.fieldRowNum==2>\n<#assign form_span = 12>\n<#elseif tableVo.fieldRowNum==3>\n<#assign form_span = 8>\n<#elseif tableVo.fieldRowNum==4>\n<#assign form_span = 6>\n</#if>\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.isShow =='Y' && po.fieldName != 'id'>\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n          <a-col :span=\"${form_span}\">\n            <a-form-model-item label=\"${po.filedComment}\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" prop=\"${autoStringSuffixForModel(po)}\">\n\t<#if po.classType =='date'>\n              <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\"  style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='datetime'>\n              <j-date placeholder=\"请选择${po.filedComment}\"  v-model=\"model.${po.fieldName}\" :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='time'>\n              <j-time placeholder=\"请选择${po.filedComment}\"  v-model=\"model.${po.fieldName}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='popup'>\n\t    <#assign form_popup=true>\n              <j-popup\n                v-model=\"model.${po.fieldName}\"\n                field=\"${po.fieldName}\"\n                org-fields=\"${po.dictField}\"\n                dest-fields=\"${Format.underlineToHump(po.dictText)}\"\n                code=\"${po.dictTable}\"\n                :multi=\"${po.extendParams.popupMulti?c}\"\n                @input=\"popupCallback\"\n                <#if po.readonly=='Y'>disabled</#if>/>\n    <#elseif po.classType =='sel_depart'>\n              <j-select-depart v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if> />\n<#elseif po.classType =='switch'>\n              <j-switch v-model=\"model.${po.fieldName}\" <#if po.dictField != 'is_open'>:options=\"${po.dictField}\"</#if> <#if po.readonly=='Y'>disabled</#if>></j-switch>\n\t<#elseif po.classType =='pca'>\n             <j-area-linkage type=\"cascader\" v-model=\"model.${po.fieldName}\" placeholder=\"请输入省市区\" <#if po.readonly=='Y'>disabled</#if> />\n\t<#elseif po.classType =='markdown'>\n              <j-markdown-editor v-model=\"model.${autoStringSuffixForModel(po)}\" id=\"${po.fieldName}\"></j-markdown-editor>\n    <#elseif po.classType =='password'>\n              <a-input-password v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='sel_user'>\n              <j-select-user-by-dep v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='textarea'>\n              <a-textarea v-model=\"model.${autoStringSuffixForModel(po)}\" rows=\"4\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='list' || po.classType=='radio'>\n              <j-dict-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\" dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='list_multi' || po.classType=='checkbox'>\n              <j-multi-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\" dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='sel_search'>\n              <j-search-select-tag v-model=\"model.${po.fieldName}\" dict=\"${form_field_dictCode}\" <#if po.readonly=='Y'>disabled</#if> />\n    <#elseif po.classType=='cat_tree'>\n    \t<#assign form_cat_tree = true>\n              <j-category-select v-model=\"model.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\" placeholder=\"请选择${po.filedComment}\" <#if po.dictText?default(\"\")?trim?length gt 1>back=\"${dashedToCamel(po.dictText)}\" @change=\"handleCategoryChange\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n    \t<#if po.dictText?default(\"\")?trim?length gt 1>\n    \t<#assign form_cat_back = \"${po.dictText}\">\n    \t</#if>\n\t<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n              <a-input-number v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='file'>\n              <j-upload v-model=\"model.${po.fieldName}\"  <#if po.readonly=='Y'>disabled</#if> <#if po.uploadnum??>:number=${po.uploadnum}</#if>></j-upload>\n\t<#elseif po.classType=='image'>\n              <j-image-upload isMultiple <#if po.uploadnum??>:number=${po.uploadnum}</#if> v-model=\"model.${po.fieldName}\" <#if po.readonly=='Y'>disabled</#if>></j-image-upload>\n\t<#elseif po.classType=='umeditor'>\n              <j-editor v-model=\"model.${autoStringSuffixForModel(po)}\" <#if po.readonly=='Y'>disabled</#if>/>\n    <#elseif po.fieldDbType=='Blob'>\n              <a-input v-model=\"model.${autoStringSuffixForModel(po)}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>></a-input>\n\t\t<#elseif po.classType == 'sel_tree'>\n  \t          <j-tree-select\n                ref=\"treeSelect\"\n                placeholder=\"请选择${po.filedComment}\"\n                v-model=\"model.${po.fieldName}\"\n                <#if po.dictText??>\n                <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n                dict=\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\"\n                <#elseif po.dictText?split(',')[1]??>\n                pidField=\"${po.dictText?split(',')[1]}\"\n                <#elseif po.dictText?split(',')[3]??>\n                hasChildField=\"${po.dictText?split(',')[3]}\"\n                </#if>\n                </#if>\n                pidValue=\"${po.dictField}\"\n                <#if po.readonly=='Y'>disabled</#if>>\n              </j-tree-select>\n\t<#else>\n              <a-input v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if> ></a-input>\n    </#if>\n            </a-form-model-item>\n          </a-col>\n</#if>\n</#list>\n      <#if bpm_flag>\n          <a-col v-if=\"showFlowSubmitButton\" :span=\"24\" style=\"width: 100%;text-align: center;\">\n            <a-button icon=\"check\" style=\"width: 126px\" type=\"primary\" @click=\"submitForm\">提 交</a-button>\n          </a-col>\n     </#if>\n        </a-row>\n      </a-form-model>\n    </j-form-container>\n  </a-spin>\n</template>\n\n<script>\n\n  import { httpAction, getAction } from '@/api/manage'\n  import { validateDuplicateValue } from '@/utils/util'\n\n  export default {\n    name: '${entityName}Form',\n    components: {\n    },\n    props: {\n     <#if bpm_flag>\n      //流程表单data\n      formData: {\n        type: Object,\n        default: () => ({}),\n        required: false\n      },\n      //表单模式：true流程表单 false普通表单\n      formBpm: {\n        type: Boolean,\n        default: false,\n        required: false\n      },\n       </#if>\n      //表单禁用\n      disabled: {\n        type: Boolean,\n        default: false,\n        required: false\n      }\n    },\n    data () {\n      return {\n        model:{\n            <#include \"/common/init/initValue.ftl\">\n         },\n        labelCol: {\n          xs: { span: 24 },\n          sm: { span: 5 },\n        },\n        wrapperCol: {\n          xs: { span: 24 },\n          sm: { span: 16 },\n        },\n        confirmLoading: false,\n        <#include \"/common/validatorRulesTemplate/main.ftl\">\n        url: {\n          add: \"/${entityPackagePath}/${entityName?uncap_first}/add\",\n          edit: \"/${entityPackagePath}/${entityName?uncap_first}/edit\",\n          queryById: \"/${entityPackagePath}/${entityName?uncap_first}/queryById\"\n        }\n      }\n    },\n    computed: {\n      formDisabled(){\n       <#if bpm_flag>\n        if(this.formBpm===true){\n          if(this.formData.disabled===false){\n            return false\n          }\n          return true\n        }\n        </#if>\n        return this.disabled\n      },\n       <#if bpm_flag>\n      showFlowSubmitButton(){\n        if(this.formBpm===true){\n          if(this.formData.disabled===false){\n            return true\n          }\n        }\n        return false\n      }\n     </#if>\n    },\n    created () {\n       //备份model原始值\n      this.modelDefault = JSON.parse(JSON.stringify(this.model));\n      <#if bpm_flag>\n      //如果是流程中表单，则需要加载流程表单data\n      this.showFlowData();\n      </#if>\n    },\n    methods: {\n      add () {\n        this.edit(this.modelDefault);\n      },\n      edit (record) {\n        this.model = Object.assign({}, record);\n        this.visible = true;\n      },\n        <#if bpm_flag>\n      //渲染流程表单数据\n      showFlowData(){\n        if(this.formBpm === true){\n          let params = {id:this.formData.dataId};\n          getAction(this.url.queryById,params).then((res)=>{\n            if(res.success){\n              this.edit (res.result);\n            }\n          });\n        }\n      },\n       </#if>\n      submitForm () {\n        const that = this;\n        // 触发表单验证\n        this.$refs.form.validate(valid => {\n          if (valid) {\n            that.confirmLoading = true;\n            let httpurl = '';\n            let method = '';\n            if(!this.model.id){\n              httpurl+=this.url.add;\n              method = 'post';\n            }else{\n              httpurl+=this.url.edit;\n               method = 'put';\n            }\n            httpAction(httpurl,this.model,method).then((res)=>{\n              if(res.success){\n                that.$message.success(res.message);\n                that.$emit('ok');\n              }else{\n                that.$message.warning(res.message);\n              }\n            }).finally(() => {\n              that.confirmLoading = false;\n            })\n          }\n         \n        })\n      },\n       <#if form_popup>\n      popupCallback(value,row){\n         this.model = Object.assign(this.model, row);\n      },\n       </#if>\n      <#if form_cat_tree>\n      handleCategoryChange(value,backObj){\n         this.model = Object.assign(this.model, backObj);\n      }\n      </#if>\n    }\n  }\n</script>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<#assign modal_width = 800>\n<#if tableVo.fieldRowNum==2>\n  <#assign modal_width = 896>\n<#elseif tableVo.fieldRowNum==3>\n  <#assign modal_width = 1024>\n<#elseif tableVo.fieldRowNum==4>\n  <#assign modal_width = 1280>\n</#if>\n<template>\n  <j-modal\n    :title=\"title\"\n    :width=\"width\"\n    :visible=\"visible\"\n    switchFullscreen\n    @ok=\"handleOk\"\n    :okButtonProps=\"{ class:{'jee-hidden': disableSubmit} }\"\n    @cancel=\"handleCancel\"\n    cancelText=\"关闭\">\n    <${Format.humpToShortbar(entityName)}-form ref=\"realForm\" @ok=\"submitCallback\" :disabled=\"disableSubmit\"></${Format.humpToShortbar(entityName)}-form>\n  </j-modal>\n</template>\n\n<script>\n\n  import ${entityName}Form from './${entityName}Form'\n  export default {\n    name: '${entityName}Modal',\n    components: {\n      ${entityName}Form\n    },\n    data () {\n      return {\n        title:'',\n        width:${modal_width},\n        visible: false,\n        disableSubmit: false\n      }\n    },\n    methods: {\n      add () {\n        this.visible=true\n        this.$nextTick(()=>{\n          this.$refs.realForm.add();\n        })\n      },\n      edit (record) {\n        this.visible=true\n        this.$nextTick(()=>{\n          this.$refs.realForm.edit(record);\n        })\n      },\n      close () {\n        this.$emit('close');\n        this.visible = false;\n      },\n      handleOk () {\n        this.$refs.realForm.submitForm();\n      },\n      submitCallback(){\n        this.$emit('ok');\n        this.visible = false;\n      },\n      handleCancel () {\n        this.close()\n      }\n    }\n  }\n</script>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal__Style#Drawer.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<#assign modal_width = 800>\n<#if tableVo.fieldRowNum==2>\n  <#assign modal_width = 896>\n<#elseif tableVo.fieldRowNum==3>\n  <#assign modal_width = 1024>\n<#elseif tableVo.fieldRowNum==4>\n  <#assign modal_width = 1280>\n</#if>\n<template>\n  <a-drawer\n    :title=\"title\"\n    :width=\"width\"\n    placement=\"right\"\n    :closable=\"false\"\n    @close=\"close\"\n    destroyOnClose\n    :visible=\"visible\">\n    <${Format.humpToShortbar(entityName)}-form ref=\"realForm\" @ok=\"submitCallback\" :disabled=\"disableSubmit\" normal></${Format.humpToShortbar(entityName)}-form>\n    <div class=\"drawer-footer\">\n      <a-button @click=\"handleCancel\" style=\"margin-bottom: 0;\">关闭</a-button>\n      <a-button v-if=\"!disableSubmit\"  @click=\"handleOk\" type=\"primary\" style=\"margin-bottom: 0;\">提交</a-button>\n    </div>\n  </a-drawer>\n</template>\n\n<script>\n\n  import ${entityName}Form from './${entityName}Form'\n\n  export default {\n    name: '${entityName}Modal',\n    components: {\n      ${entityName}Form\n    },\n    data () {\n      return {\n        title:\"操作\",\n        width:${modal_width},\n        visible: false,\n        disableSubmit: false\n      }\n    },\n    methods: {\n      add () {\n        this.visible=true\n        this.$nextTick(()=>{\n          this.$refs.realForm.add();\n        })\n      },\n      edit (record) {\n        this.visible=true\n        this.$nextTick(()=>{\n          this.$refs.realForm.edit(record);\n        });\n      },\n      close () {\n        this.$emit('close');\n        this.visible = false;\n      },\n      submitCallback(){\n        this.$emit('ok');\n        this.visible = false;\n      },\n      handleOk () {\n        this.$refs.realForm.submitForm();\n      },\n      handleCancel () {\n        this.close()\n      }\n    }\n  }\n</script>\n\n<style lang=\"less\" scoped>\n/** Button按钮间距 */\n  .ant-btn {\n    margin-left: 30px;\n    margin-bottom: 30px;\n    float: right;\n  }\n  .drawer-footer{\n    position: absolute;\n    bottom: -8px;\n    width: 100%;\n    border-top: 1px solid #e8e8e8;\n    padding: 10px 16px;\n    text-align: right;\n    left: 0;\n    background: #fff;\n    border-radius: 0 0 2px 2px;\n  }\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei",
    "content": "﻿<template>\n  <div>\n<#assign list_need_category=false>\n<#assign list_need_pca=false>\n<#assign list_has_popup_dict=false>\n<#assign bpm_flag=false>\n\n<#-- 开始循环 -->\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.classType=='cat_tree' && po.dictText?default(\"\")?trim?length == 0>\n<#assign list_need_category=true>\n</#if>\n<#if po.classType=='popup_dict'>\n<#assign list_has_popup_dict=true>\n</#if>\n<#if po.classType=='pca'>\n<#assign list_need_pca=true>\n</#if>\n</#list>\n<#assign buttonList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n  <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n</#if>\n<#-- 结束循环 -->\n    <!--引用表格-->\n   <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n     <!--插槽:table标题-->\n      <template #tableTitle>\n          <a-button type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:add'\" @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\"> 新增</a-button>\n          <a-button  type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:exportXls'\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n          <j-upload-button type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:importExcel'\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n   <#if buttonList?size gt 0>\n    <#list buttonList as btn>\n       <#if btn.buttonStyle == 'button'>\n         <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"ant-design:${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n       </#if>\n     </#list>\n   </#if>\n\n          <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n              <template #overlay>\n                <a-menu>\n                  <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                    <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                    删除\n                  </a-menu-item>\n                </a-menu>\n              </template>\n              <a-button v-auth=\"'${entityPackage}:${tableName}:deleteBatch'\">批量操作\n                <Icon icon=\"mdi:chevron-down\"></Icon>\n              </a-button>\n        </a-dropdown>\n        <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n        <!-- 高级查询 -->\n        <super-query :config=\"superQueryConfig\" @search=\"handleSuperQuery\" />\n        <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n      </template>\n       <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\"/>\n      </template>\n      <!--字段回显插槽-->\n      <template v-slot:bodyCell=\"{ column, record, index, text }\">\n      <#list columns as po>\n        <#if po.classType=='umeditor' || po.classType=='pca' || po.classType=='file'>\n        <template v-if=\"column.dataIndex==='${po.fieldName}'\">\n        <#if po.classType=='umeditor'>\n          <!--富文本件字段回显插槽-->\n          <div v-html=\"text\"></div>\n        </#if>\n        <#if po.classType=='pca'>\n          <!--省市区字段回显插槽-->\n          {{ getAreaTextByCode(text) }}\n        </#if>\n        <#if po.classType=='file'>\n          <!--文件字段回显插槽-->\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n          <a-button v-else :ghost=\"true\" type=\"primary\" preIcon=\"ant-design:download-outlined\" size=\"small\" @click=\"downloadFile(text)\">下载</a-button>\n        </#if>\n        </template>\n        </#if>\n      </#list>\n      </template>\n    </BasicTable>\n    <!-- 表单区域 -->\n    <${entityName}Modal @register=\"registerModal\" @success=\"handleSuccess\"></${entityName}Modal>\n   <#if bpm_flag==true>\n    <!-- 审批记录 -->\n    <BpmPictureModal @register=\"registerBpmModal\" />\n   </#if>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"${entityPackage}-${entityName?uncap_first}\" setup>\n  import {ref, reactive, computed, unref} from 'vue';\n  import {BasicTable, useTable, TableAction} from '/@/components/Table';\n  import {useModal} from '/@/components/Modal';\n  import { useListPage } from '/@/hooks/system/useListPage'\n  import ${entityName}Modal from './components/${entityName}Modal.vue'\n  import {columns, searchFormSchema, superQuerySchema} from './${entityName}.data';\n  import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './${entityName}.api';\n  import { downloadFile } from '/@/utils/common/renderUtils';\n  import { useUserStore } from '/@/store/modules/user';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  <#if list_need_pca>\n  import { getAreaTextByCode } from '/@/components/Form/src/utils/Area';\n  </#if>\n  <#if list_need_category>\n  import { loadCategoryData } from '/@/api/common/api'\n  import { getAuthCache, setAuthCache } from '/@/utils/auth';\n  import { DB_DICT_DATA_KEY } from '/@/enums/cacheEnum';\n  </#if>\n  <#if list_has_popup_dict>\n import {getPopDictByCode} from \"@/utils/dict\";\n import {filterMultiDictText} from \"@/utils/dict/JDictSelectUtil\";\n  </#if>\n  import { getDateByPicker } from '/@/utils';\n  //日期个性化选择\n  const fieldPickers = reactive({\n  <#list columns as po>\n    <#if po.extendParams?exists && po.extendParams.picker?exists>\n    ${po.fieldName}: '${po.extendParams.picker}',\n    </#if>\n  </#list>\n  });\n  <#if bpm_flag==true>\n  import { startProcess } from '/@/api/common/api';\n  const [registerBpmModal, { openModal: bpmPicModal }] = useModal();\n  </#if>\n  const queryParam = reactive<any>({});\n  const checkedKeys = ref<Array<string | number>>([]);\n  const userStore = useUserStore();\n  const { createMessage } = useMessage();\n  //注册model\n  const [registerModal, {openModal}] = useModal();\n  //注册table数据\n  const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({\n      tableProps:{\n           title: '${tableVo.ftlDescription}',\n           api: list,\n           columns,\n           canResize:true,\n           formConfig: {\n              //labelWidth: 120,\n              schemas: searchFormSchema,\n              autoSubmitOnEnter:true,\n              showAdvancedButton:true,\n              fieldMapToNumber: [\n              <#list columns as po>\n              <#if po.isQuery=='Y'>\n              <#if po.queryMode=='group'>\n              <#-- update-begin---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n              <#if po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal' || po.classType=='time'>\n              <#-- update-end---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n                 ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end']],\n              </#if>\n              </#if>\n              </#if>\n              </#list>\n              ],\n              fieldMapToTime: [\n              <#list columns as po>\n              <#if po.isQuery=='Y'>\n              <#if po.queryMode=='group'>\n              <#if po.classType=='date'>\n                 ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end'], 'YYYY-MM-DD'],\n              <#elseif po.classType=='datetime'>\n                 ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end'], 'YYYY-MM-DD HH:mm:ss'],\n              </#if>\n              </#if>\n              </#if>\n              </#list>\n              ],\n            },\n           actionColumn: {\n               width: 120,\n               fixed:'right'\n            },\n            beforeFetch: (params) => {\n              if (params && fieldPickers) {\n                for (let key in fieldPickers) {\n                  if (params[key]) {\n                    params[key] = getDateByPicker(params[key], fieldPickers[key]);\n                  }\n                }\n              }\n              return Object.assign(params, queryParam);\n            },\n            <#if list_has_popup_dict>\n            afterFetch: afterFetch\n            </#if>\n      },\n       exportConfig: {\n            name:\"${tableVo.ftlDescription}\",\n            url: getExportUrl,\n            params: queryParam,\n          },\n          importConfig: {\n            url: getImportUrl,\n            success: handleSuccess\n          },\n  })\n\n  const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext\n\n<#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n  // 高级查询配置\n  const superQueryConfig = reactive(superQuerySchema);\n\n  /**\n   * 高级查询事件\n   */\n  function handleSuperQuery(params) {\n    Object.keys(params).map((k) => {\n      queryParam[k] = params[k];\n    });\n    reload();\n  }\n<#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n   /**\n    * 新增事件\n    */\n  function handleAdd() {\n     openModal(true, {\n       isUpdate: false,\n       showFooter: true,\n     });\n  }\n   /**\n    * 编辑事件\n    */\n  function handleEdit(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: true,\n     });\n   }\n   /**\n    * 详情\n   */\n  function handleDetail(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: false,\n     });\n   }\n   /**\n    * 删除事件\n    */\n  async function handleDelete(record) {\n     await deleteOne({id: record.id}, handleSuccess);\n   }\n   /**\n    * 批量删除事件\n    */\n  async function batchHandleDelete() {\n     await batchDelete({ids: selectedRowKeys.value}, handleSuccess);\n   }\n   /**\n    * 成功回调\n    */\n  function handleSuccess() {\n      (selectedRowKeys.value = []) && reload();\n   }\n   /**\n      * 操作栏\n      */\n  function getTableAction(record){\n       return [\n         {\n           label: '编辑',\n           onClick: handleEdit.bind(null, record),\n           auth: '${entityPackage}:${tableName}:edit'\n         }\n       ]\n   }\n     /**\n        * 下拉操作栏\n        */\n  function getDropDownAction(record){\n<#if bpm_flag==true>\n       let dropDownAction = [\n         {\n           label: '详情',\n           onClick: handleDetail.bind(null, record),\n         }, {\n           label: '删除',\n           popConfirm: {\n             title: '是否确认删除',\n             confirm: handleDelete.bind(null, record),\n             placement: 'topLeft',\n           },\n           auth: '${entityPackage}:${tableName}:delete'\n         },\n         {\n           label: '审批进度',\n           onClick: handlePreviewPic.bind(null, record),\n           ifShow: !!record.bpmStatus && record.bpmStatus !== '1',\n         }\n <#if buttonList?size gt 0>\n     <#list buttonList as btn>\n        <#if btn.buttonStyle == 'link'>\n        ,{\n           label: '${btn.buttonName}',\n           onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n         }\n        </#if>\n      </#list>\n  </#if>\n       ];\n       if(record.bpmStatus == '1'){\n         dropDownAction.push({\n           label: '发起流程',\n           popConfirm: {\n             title: '确认提交流程吗？',\n             confirm: handleProcess.bind(null, record),\n             placement: 'topLeft',\n           }\n         })\n       }\n       return dropDownAction;\n<#else>\n       return [\n         {\n           label: '详情',\n           onClick: handleDetail.bind(null, record),\n         }, {\n           label: '删除',\n           popConfirm: {\n             title: '是否确认删除',\n             confirm: handleDelete.bind(null, record),\n             placement: 'topLeft',\n           },\n           auth: '${entityPackage}:${tableName}:delete'\n         }\n      <#if buttonList?size gt 0>\n         <#list buttonList as btn>\n          <#if btn.buttonStyle == 'link'>\n          ,{\n             label: '${btn.buttonName}',\n             onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n          }\n          </#if>\n         </#list>\n      </#if>\n       ]\n</#if>\n   }\n\n  <#if bpm_flag==true>\n  /**\n   * 提交流程\n   */\n  async function handleProcess(record) {\n    let params = {\n      flowCode: 'dev_${tableName}_001',\n      id: record.id,\n      formUrl: '${entityPackagePath}/components/${entityName}Form',\n      formUrlMobile: ''\n    }\n    await startProcess(params);\n    handleSuccess();\n  }\n    /**\n     * 审批进度\n     */\n    async function handlePreviewPic(record) {\n      bpmPicModal(true, {\n        flowCode: 'dev_${tableName}_001',\n        dataId: record.id,\n      });\n    }\n  </#if>\n\n<#if buttonList?size gt 0>\n  <#list buttonList as btn>\n  <#if btn.buttonStyle=='button'>\n     function handle${btn.buttonCode?cap_first}(){\n        createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n     }\n  </#if>\n   <#if btn.buttonStyle=='link'>\n    function handle${btn.buttonCode?cap_first}(record){\n      createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n    }\n   </#if>\n  </#list>\n</#if>\n\n    <#if list_need_category>\n   /**\n    * 初始化字典配置\n   */\n    function initDictConfig(){\n     <#list columns as po>\n     <#if (po.isQuery=='Y' || po.isShowList=='Y') && po.classType!='popup'>\n       <#if po.classType=='cat_tree' && list_need_category==true>\n       loadCategoryData({code:'${po.dictField?default(\"\")}'}).then((res) => {\n         if (res) {\n             const allDictDate = userStore.getAllDictItems;\n             if(!allDictDate['${po.dictField?default(\"\")}']){\n               userStore.setAllDictItems({...allDictDate,'${po.dictField?default(\"\")}':res});\n             }\n         }\n       })\n       </#if>\n     </#if>\n     </#list>\n   }\n   initDictConfig();\n    </#if>\n\n    <#if list_has_popup_dict>\n   /**\n    * 翻译Popup字典配置\n   */\n    async function afterFetch(records){\n <#list columns as po>\n    <#if po.isQuery=='Y' || po.isShowList=='Y'>\n      <#if po.classType=='popup_dict' && list_has_popup_dict==true>\n      const ${po.fieldName}Keys = [...new Set(records.map((item) => item['${po.fieldName}']).flatMap((item) => item && item.split(',')))];\n      if(${po.fieldName}Keys && ${po.fieldName}Keys.length){\n       const dictOptions = await getPopDictByCode(${po.fieldName}Keys.join(','), '${po.dictTable},${po.dictField},${po.dictText}');\n       records.forEach((item) => {\n         item['${po.fieldName}_dictText'] = filterMultiDictText(dictOptions, item['${po.fieldName}']);\n       });\n      }\n      </#if>\n    </#if>\n </#list>\n     return records;\n   }\n    </#if>\n</script>\n\n<style lang=\"less\" scoped>\n<#include \"/common/form/vue3SearchStyle.ftl\">\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi",
    "content": "import {defHttp} from '/@/utils/http/axios';\nimport { useMessage } from \"/@/hooks/web/useMessage\";\n\nconst { createConfirm } = useMessage();\n\nenum Api {\n  list = '/${entityPackagePath}/${entityName?uncap_first}/list',\n  save='/${entityPackagePath}/${entityName?uncap_first}/add',\n  edit='/${entityPackagePath}/${entityName?uncap_first}/edit',\n  deleteOne = '/${entityPackagePath}/${entityName?uncap_first}/delete',\n  deleteBatch = '/${entityPackagePath}/${entityName?uncap_first}/deleteBatch',\n  importExcel = '/${entityPackagePath}/${entityName?uncap_first}/importExcel',\n  exportXls = '/${entityPackagePath}/${entityName?uncap_first}/exportXls',\n}\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) =>\n  defHttp.get({url: Api.list, params});\n\n/**\n * 删除单个\n */\nexport const deleteOne = (params,handleSuccess) => {\n  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n/**\n * 批量删除\n * @param params\n */\nexport const batchDelete = (params, handleSuccess) => {\n  createConfirm({\n    iconType: 'warning',\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n/**\n * 保存或者更新\n * @param params\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({url: url, params});\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi",
    "content": "<#include \"/common/utils.ftl\">\nimport {BasicColumn} from '/@/components/Table';\nimport {FormSchema} from '/@/components/Table';\nimport { rules} from '/@/utils/helper/validator';\nimport { render } from '/@/utils/common/renderUtils';\nimport { getWeekMonthQuarterYear } from '/@/utils';\n//列表数据\nexport const columns: BasicColumn[] = [\n <#list columns as po>\n   <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n   <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   {\n    title: '${po.filedComment}',\n    align:\"center\",\n    <#if po.sort=='Y'>\n    sorter: true,\n   </#if>\n    <#if po.classType=='date'>\n    dataIndex: '${po.fieldName}',\n    customRender:({text}) =>{\n      text = !text ? \"\" : (text.length > 10 ? text.substr(0,10) : text);\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      if(text) {\n        return getWeekMonthQuarterYear(text)['${po.extendParams.picker}'];\n      } else {\n        return text;\n      }\n      <#else>\n      return text;\n      </#if>\n    },\n    <#elseif po.fieldDbType=='Blob'>\n    dataIndex: '${po.fieldName}String'\n    <#elseif po.classType=='umeditor'>\n    dataIndex: '${po.fieldName}',\n    <#elseif po.classType=='pca'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='file'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='image'>\n    dataIndex: '${po.fieldName}',\n    customRender:render.renderImage,\n   <#elseif po.classType=='switch'>\n    dataIndex: '${po.fieldName}',\n<#assign switch_extend_arr=['Y','N']>\n<#if po.dictField?default(\"\")?contains(\"[\")>\n<#assign switch_extend_arr=po.dictField?eval>\n</#if>\n<#list switch_extend_arr as a>\n<#if a_index == 0>\n<#assign switch_extend_arr1=a>\n<#else>\n<#assign switch_extend_arr2=a>\n</#if>\n</#list>\n    customRender:({text}) => {\n       return  render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}])\n     },\n   <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict' || po.classType=='link_table'>\n    dataIndex: '${po.fieldName}_dictText'\n   <#elseif po.classType=='cat_tree'>\n    dataIndex: '${po.fieldName}',\n    <#if po.dictText?default(\"\")?trim?length == 0>\n    customRender:({text}) => {\n       return  render.renderCategoryTree(text,'${po.dictField?default(\"\")}')\n   },\n   <#else>\n    customRender: ({text, record}) => (text ? record['${po.dictText}'] : '')\n   </#if>\n   <#else>\n    dataIndex: '${po.fieldName}'\n   </#if>\n   },\n   </#if>\n </#list>\n];\n//查询数据\nexport const searchFormSchema: FormSchema[] = [\n<#-- 开始循环 -->\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if po.isQuery=='Y' && po.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#assign query_flag=true>\n\t<#assign query_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n\t    <#assign query_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n    <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign query_field_dictCode=\"${po.dictField}\">\n    </#if>\n<#if po.queryMode=='single'>\n\t{\n      label: \"${po.filedComment}\",\n      field: ${autoStringSuffix(po)},\n<#if po.classType=='sel_search'>\n      component: 'JSearchSelect',\n      componentProps:{\n         dict:\"${query_field_dictCode}\"\n      },\n<#elseif po.classType=='sel_user'>\n<#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n      component: 'JSelectUser',\n      componentProps:{\n      <#if po.extendParams?exists && po.extendParams.text?exists>\n         labelKey: '${po.extendParams.text}',\n      </#if>\n      <#if po.extendParams?exists && po.extendParams.store?exists>\n          rowKey: '${po.extendParams.store}',\n      </#if>\n      },\n<#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n<#elseif po.classType=='switch'>\n      component: 'JSwitch',\n      componentProps:{\n           query:true,\n           <#if po.dictField != 'is_open'>\n           options:${po.dictField}\n           </#if>\n       },\n <#elseif po.classType=='sel_depart'>\n      component: 'JSelectDept',\n      componentProps:{\n      <#if po.extendParams?exists && po.extendParams.text?exists>\n         labelKey: '${po.extendParams.text}',\n      </#if>\n      <#if po.extendParams?exists && po.extendParams.store?exists>\n          rowKey: '${po.extendParams.store}',\n      </#if>\n      },\n <#elseif po.classType=='list_multi'>\n      component: 'JSelectMultiple',\n      componentProps:{\n     <#if po.dictTable?default(\"\")?trim?length gt 1>\n        dictCode:\"${po.dictTable},${po.dictText},${po.dictField}\",\n     <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        dictCode:\"${po.dictField}\",\n     </#if>\n        triggerChange: true\n     },\n <#elseif po.classType=='cat_tree'>\n      component: 'JCategorySelect',\n      componentProps:{\n          pcode:\"${po.dictField?default(\"\")}\",//back和事件未添加，暂时有问题\n      },\n<#elseif po.classType=='date'>\n      component: 'DatePicker',\n      componentProps: {\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        picker: '${po.extendParams.picker}',\n        </#if>\n        valueFormat: 'YYYY-MM-DD'\n      },\n<#elseif po.classType=='datetime'>\n      component: 'DatePicker',\n      componentProps: {\n         showTime:true,\n         valueFormat: 'YYYY-MM-DD HH:mm:ss'\n       },\n <#elseif po.classType =='time'>\n     component: 'TimePicker',\n     componentProps: {\n       valueFormat: 'HH:mm:ss'\n     },\n<#elseif po.classType=='pca'>\n      component: 'JAreaLinkage',\n      componentProps: {\n        saveCode: 'region',\n      },\n<#elseif po.classType=='popup'>\n    <#include \"/common/form/vue3popup.ftl\">\n<#elseif po.classType=='popup_dict'>\n      component: 'JPopupDict',\n      componentProps: {\n        placeholder: '请选择${po.filedComment}',\n        dictCode: '${po.dictTable},${po.dictText},${po.dictField}',\n        multi: ${po.extendParams.popupMulti?c}\n      },\n<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>\n<#--  ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->\n      component: 'JSelectMultiple',\n      componentProps:{\n       <#if po.dictTable?default(\"\")?trim?length gt 1>\n          dictCode:\"${po.dictTable},${po.dictText},${po.dictField}\"\n       <#elseif po.dictField?default(\"\")?trim?length gt 1>\n          dictCode:\"${po.dictField}\"\n        </#if>\n      },\n<#elseif po.classType == 'sel_tree'>\n      component: 'JTreeSelect',\n      componentProps:{\n          <#if po.dictText??>\n          <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n          dict:\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\",\n          <#elseif po.dictText?split(',')[1]??>\n          pidField:\"${po.dictText?split(',')[1]}\",\n          <#elseif po.dictText?split(',')[3]??>\n          hasChildField:\"${po.dictText?split(',')[3]}\",\n          </#if>\n          </#if>\n          pidValue:\"${po.dictField}\",\n      },\n<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n      component: 'InputNumber',\n<#else>\n      component: 'Input',\n</#if>\n      //colProps: {span: 6},\n \t},\n<#elseif po.queryMode=='like'>\n  {\n    label: \"${po.filedComment}\",\n    field: \"${po.fieldName}\",\n    component: 'JInput',\n  },\n<#else>\n     {\n      label: \"${po.filedComment}\",\n      field: \"${po.fieldName}\",\n<#if po.classType=='date'>\n      component: 'RangePicker',\n      componentProps: {\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        picker: '${po.extendParams.picker}',\n        </#if>\n        valueType: 'Date',\n      },\n<#elseif po.classType=='datetime'>\n      component: 'RangePicker',\n      componentProps: {\n          valueType: 'Date',\n          showTime:true\n      },\n<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n      component: 'JRangeNumber',\n<#-- update-begin---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n<#elseif po.classType=='time'>\n      component: 'RangeTime',\n<#-- update-end---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n<#else>\n      component: 'Input', //TODO 范围查询\n</#if>\n      //colProps: {span: 6},\n\t},\n</#if>\n</#if>\n</#list>\n<#-- 结束循环 -->\n];\n//表单数据\nexport const formSchema: FormSchema[] = [\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign bpm_flag=false>\n<#assign id_exists = false>\n<#list columns as po><#rt/>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.fieldDbName == 'id'>\n\t<#assign id_exists = true>\n</#if>\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if po.isShow =='Y' && po.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n  {\n    label: '${po.filedComment}',\n    field: ${autoStringSuffix(po)},\n    <#-- update-begin-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n    <#if po.defaultVal??>\n    <#if po.fieldDbType==\"BigDecimal\" || po.fieldDbType==\"double\" || po.fieldDbType==\"int\">\n    defaultValue: ${po.defaultVal},\n    <#else>\n    defaultValue: \"${po.defaultVal}\",\n    </#if>\n    </#if>\n    <#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n    <#if po.classType =='date'>\n    component: 'DatePicker',\n    componentProps: {\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      picker: '${po.extendParams.picker}',\n      </#if>\n      valueFormat: 'YYYY-MM-DD'\n    },\n     <#elseif po.classType =='datetime'>\n    component: 'DatePicker',\n    componentProps: {\n       showTime: true,\n       valueFormat: 'YYYY-MM-DD HH:mm:ss'\n     },\n     <#elseif po.classType =='time'>\n    component: 'TimePicker',\n    componentProps: {\n      valueFormat: 'HH:mm:ss'\n    },\n    <#elseif po.classType =='popup'>\n    <#include \"/common/form/vue3popup.ftl\">\n    <#elseif po.classType=='popup_dict'>\n    component: 'JPopupDict',\n    componentProps: {\n      placeholder: '请选择${po.filedComment}',\n      dictCode: '${po.dictTable},${po.dictText},${po.dictField}',\n      multi: ${po.extendParams.popupMulti?c}\n    },\n     <#elseif po.classType =='sel_depart'>\n     component: 'JSelectDept',\n     componentProps:{\n      <#if po.extendParams?exists && po.extendParams.text?exists>\n         labelKey: '${po.extendParams.text}',\n      </#if>\n      <#if po.extendParams?exists && po.extendParams.store?exists>\n          rowKey: '${po.extendParams.store}',\n      </#if>\n      },\n     <#elseif po.classType =='switch'>\n     component: 'JSwitch',\n     componentProps:{\n         <#if po.dictField != 'is_open'>\n         options:${po.dictField}\n         </#if>\n     },\n     <#elseif po.classType =='pca'>\n    component: 'JAreaLinkage',\n    componentProps: {\n      saveCode: 'region',\n    },\n    <#elseif po.classType =='markdown'>\n    component: 'JMarkdownEditor',//注意string转换问题\n     <#elseif po.classType =='password'>\n    component: 'InputPassword',\n     <#elseif po.classType =='sel_user'>\n    <#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n    component: 'JSelectUser',\n    <#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n    componentProps:{\n  <#if po.extendParams?exists && po.extendParams.text?exists>\n      labelKey: '${po.extendParams.text}',\n  </#if>\n  <#if po.extendParams?exists && po.extendParams.store?exists>\n      rowKey: '${po.extendParams.store}',\n  </#if>\n    },\n    <#elseif po.classType =='textarea'>\n    component: 'InputTextArea',\n    <#elseif po.classType=='list'>\n    component: 'JDictSelectTag',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\",\n     <#if po.fieldDbType=='int'>\n        stringToNumber: true\n     </#if>\n     },\n    <#elseif po.classType=='radio'>\n    component: 'JDictSelectTag',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\",\n        type: \"radio\",\n     <#if po.fieldDbType=='int'>\n        stringToNumber: true\n     </#if>\n     },\n    <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- -->\n    <#elseif po.classType=='list_multi'>\n    component: 'JSelectMultiple',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n    <#elseif po.classType=='checkbox'>\n    component: 'JCheckbox',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n     <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- -->\n    <#elseif po.classType=='sel_search'>\n    component: 'JSearchSelect',\n    componentProps:{\n       dict:\"${form_field_dictCode}\"\n    },\n<#elseif po.classType=='cat_tree'>\n    <#assign form_cat_tree = true>\n    component: 'JCategorySelect',\n    componentProps:{\n       pcode:\"${po.dictField?default(\"\")}\", //TODO back和事件未添加，暂时有问题\n    },\n    <#if po.dictText?default(\"\")?trim?length gt 1>\n    <#assign form_cat_back = \"${po.dictText}\">\n    </#if>\n    <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n    component: 'InputNumber',\n    <#elseif po.classType=='file'>\n    component: 'JUpload',\n    componentProps:{\n    <#if po.uploadnum??>\n       maxCount:${po.uploadnum}\n   </#if>\n     },\n <#elseif po.classType=='image'>\n     component: 'JImageUpload',\n     componentProps:{\n     <#if po.uploadnum??>\n        fileMax:${po.uploadnum}\n     <#else>\n        fileMax: 0\n     </#if>\n      },\n  <#elseif po.classType=='umeditor'>\n    component: 'JEditor',\n  <#elseif po.classType == 'sel_tree'>\n    component: 'JTreeSelect',\n    componentProps:{\n        <#if po.dictText??>\n        <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n        dict:\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\",\n        <#elseif po.dictText?split(',')[1]??>\n        pidField:\"${po.dictText?split(',')[1]}\",\n        <#elseif po.dictText?split(',')[3]??>\n        hasChildField:\"${po.dictText?split(',')[3]}\",\n        </#if>\n        </#if>\n        pidValue:\"${po.dictField}\",\n    },\n  <#elseif po.classType=='link_table'>\n    component: 'JLinkTableCard',\n    componentProps: {\n     valueField: '${po.dictField}',\n     textField: '${po.dictText}',\n     tableName: '${po.dictTable}',\n     multi: <#if (po.queryMode!\"\") == \"multi\">true<#else>false</#if>\n    },\n   <#else>\n    component: 'Input',\n    </#if>\n    <#if po.isShow == 'Y' && poHasCheck(po)>\n    dynamicRules: ({model,schema}) => {\n    <#if po.fieldName != 'id'>\n    <#assign fieldValidType = po.fieldValidType!''>\n          return [\n            <#-- 非空校验 -->\n           <#if po.nullable == 'N' || fieldValidType == '*'>\n                 { required: true, message: '请输入${po.filedComment}!'},\n           <#elseif fieldValidType!=''>\n                 { required: false},\n           </#if>\n       <#-- 唯一校验 -->\n           <#if fieldValidType == 'only'>\n                 {...rules.duplicateCheckRule(<#if sub?default(\"\")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'</#if>, '${po.fieldDbName}',model,schema)[0]},\n           <#-- 6到16位数字 -->\n           <#elseif fieldValidType == 'n6-16'>\n                 { pattern: /^\\d{6,16}$|^(?=\\d+\\.\\d+)[\\d.]{7,17}$/, message: '请输入6到16位数字!'},\n           <#-- 6到16位任意字符 -->\n           <#elseif fieldValidType == '*6-16'>\n                 { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},\n           <#-- 6到18位字母 -->\n           <#elseif fieldValidType == 's6-18'>\n                 { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},\n           <#-- 网址 -->\n           <#elseif fieldValidType == 'url'>\n                 { pattern: /^((ht|f)tps?):\\/\\/[\\w\\-]+(\\.[\\w\\-]+)+([\\w\\-.,@?^=%&:\\/~+#]*[\\w\\-@?^=%&\\/~+#])?$/, message: '请输入正确的网址!'},\n           <#-- 电子邮件 -->\n           <#elseif fieldValidType == 'e'>\n                 { pattern: /^([\\w]+\\.*)([\\w]+)@[\\w]+\\.\\w{3}(\\.\\w{2}|)$/, message: '请输入正确的电子邮件!'},\n           <#-- 手机号码 -->\n           <#elseif fieldValidType == 'm'>\n                 { pattern: /^1[3456789]\\d{9}$/, message: '请输入正确的手机号码!'},\n           <#-- 邮政编码 -->\n           <#elseif fieldValidType == 'p'>\n                 { pattern: /^[0-9]\\d{5}$/, message: '请输入正确的邮政编码!'},\n           <#-- 字母 -->\n           <#elseif fieldValidType == 's'>\n                 { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},\n           <#-- 数字 -->\n           <#elseif fieldValidType == 'n'>\n                 { pattern: /^-?\\d+\\.?\\d*$/, message: '请输入数字!'},\n           <#-- 整数 -->\n           <#elseif fieldValidType == 'z'>\n                 { pattern: /^-?\\d+$/, message: '请输入整数!'},\n           <#-- 金额 -->\n           <#elseif fieldValidType == 'money'>\n                 { pattern: /^(([1-9][0-9]*)|([0]\\.\\d{0,2}|[1-9][0-9]*\\.\\d{0,2}))$/, message: '请输入正确的金额!'},\n           <#-- 正则校验 -->\n           <#elseif fieldValidType != '' && fieldValidType != '*'>\n                 { pattern: '${fieldValidType}', message: '不符合校验规则!'},\n           <#-- 无校验 -->\n           <#else>\n               <#t>\n           </#if>\n          ];\n     </#if>\n     },\n    </#if>\n    <#if po.readonly=='Y'>\n    dynamicDisabled:true\n    </#if>\n  },\n</#if>\n</#list>\n<#if id_exists == false>\n\t// TODO 主键隐藏字段，目前写死为ID\n\t{\n\t  label: '',\n\t  field: 'id',\n\t  component: 'Input',\n\t  show: false\n\t},\n</#if>\n];\n\n<#-- update-begin-author:chenrui date:2023-12-28 for:[QQYUN-7527]vue3代码生成默认带上高级查询 -->\n// 高级查询数据\nexport const superQuerySchema = {\n  <#list columns as po>\n  <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n  <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  ${superQueryFieldListForVue3(po,po_index)},\n  </#if>\n  </#list>\n};\n<#-- update-end-author:chenrui date:2023-12-28 for:[QQYUN-7527]vue3代码生成默认带上高级查询 -->\n\n/**\n* 流程表单调用这个方法获取formSchema\n* @param param\n*/\nexport function getBpmFormSchema(_formData): FormSchema[]{\n  // 默认和原始表单保持一致 如果流程中配置了权限数据，这里需要单独处理formSchema\n  return formSchema;\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql",
    "content": "<#include \"/common/sql/menu_insert.ftl\">"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n    <div style=\"min-height: 400px\">\n        <BasicForm @register=\"registerForm\"></BasicForm>\n        <div style=\"width: 100%;text-align: center\" v-if=\"!formDisabled\">\n            <a-button @click=\"submitForm\" pre-icon=\"ant-design:check\" type=\"primary\">提 交</a-button>\n        </div>\n    </div>\n</template>\n\n<script lang=\"ts\">\n    import {BasicForm, useForm} from '/@/components/Form/index';\n    import {computed, defineComponent} from 'vue';\n    import {defHttp} from '/@/utils/http/axios';\n    import { propTypes } from '/@/utils/propTypes';\n    import {getBpmFormSchema} from '../${entityName}.data';\n    import {saveOrUpdate} from '../${entityName}.api';\n    \n    export default defineComponent({\n        name: \"${entityName}Form\",\n        components:{\n            BasicForm\n        },\n        props:{\n            formData: propTypes.object.def({}),\n            formBpm: propTypes.bool.def(true),\n        },\n        setup(props){\n            const [registerForm, { setFieldsValue, setProps, getFieldsValue }] = useForm({\n                labelWidth: 150,\n                schemas: getBpmFormSchema(props.formData),\n                showActionButtonGroup: false,\n                baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}}\n            });\n\n            const formDisabled = computed(()=>{\n                if(props.formData.disabled === false){\n                    return false;\n                }\n                return true;\n            });\n\n            let formData = {};\n            const queryByIdUrl = '/${entityPackagePath}/${entityName?uncap_first}/queryById';\n            async function initFormData(){\n                let params = {id: props.formData.dataId};\n                const data = await defHttp.get({url: queryByIdUrl, params});\n                formData = {...data}\n                //设置表单的值\n                await setFieldsValue(formData);\n                //默认是禁用\n                await setProps({disabled: formDisabled.value})\n            }\n\n            async function submitForm() {\n                let data = getFieldsValue();\n                let params = Object.assign({}, formData, data);\n                console.log('表单数据', params)\n                await saveOrUpdate(params, true)\n            }\n\n            initFormData();\n            \n            return {\n                registerForm,\n                formDisabled,\n                submitForm,\n            }\n        }\n    });\n</script>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<#assign buttonList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n  <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n</#if>\n<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" destroyOnClose :title=\"title\" :maxHeight=\"500\" :width=\"${getModalWidth(tableVo.fieldRowNum?default(1))}\" @ok=\"handleSubmit\">\n      <BasicForm @register=\"registerForm\" name=\"${entityName}Form\" />\n<#if buttonList?? && buttonList?size gt 0>\n   <template #insertFooter>\n    <#list buttonList as btn>\n     <#if btn.buttonStyle=='form'>\n       <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"ant-design:${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n     </#if>\n    </#list>\n   </template>\n</#if>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n    import {ref, computed, unref, reactive} from 'vue';\n    import {BasicModal, useModalInner} from '/@/components/Modal';\n    import {BasicForm, useForm} from '/@/components/Form/index';\n    import {formSchema} from '../${entityName}.data';\n    import {saveOrUpdate} from '../${entityName}.api';\n    import { useMessage } from '/@/hooks/web/useMessage';\n    import { getDateByPicker } from '/@/utils';\n    const { createMessage } = useMessage();\n    // Emits声明\n    const emit = defineEmits(['register','success']);\n    const isUpdate = ref(true);\n    const isDetail = ref(false);\n    //表单配置\n    const [registerForm, { setProps,resetFields, setFieldsValue, validate, scrollToField }] = useForm({\n        <#if tableVo.fieldRowNum == 1>\n        labelWidth: 150,\n        </#if>\n        schemas: formSchema,\n        showActionButtonGroup: false,\n        baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}},\n        baseRowStyle: { padding: \"0 20px\" }\n    });\n    //表单赋值\n    const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {\n        //重置表单\n        await resetFields();\n        setModalProps({confirmLoading: false,showCancelBtn:!!data?.showFooter,showOkBtn:!!data?.showFooter});\n        isUpdate.value = !!data?.isUpdate;\n        isDetail.value = !!data?.showFooter;\n        if (unref(isUpdate)) {\n            //表单赋值\n            await setFieldsValue({\n                ...data.record,\n            });\n        }\n        // 隐藏底部时禁用整个表单\n       setProps({ disabled: !data?.showFooter })\n    });\n    //日期个性化选择\n    const fieldPickers = reactive({\n    <#list columns as po>\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      ${po.fieldName}: '${po.extendParams.picker}',\n      </#if>\n    </#list>\n    });\n    //设置标题\n    const title = computed(() => (!unref(isUpdate) ? '新增' : !unref(isDetail) ? '详情' : '编辑'));\n    //表单提交事件\n    async function handleSubmit(v) {\n        try {\n            let values = await validate();\n            // 预处理日期数据\n            changeDateValue(values);\n            setModalProps({confirmLoading: true});\n            //提交表单\n            await saveOrUpdate(values, isUpdate.value);\n            //关闭弹窗\n            closeModal();\n            //刷新列表\n            emit('success');\n        } catch ({ errorFields }) {\n           if (errorFields) {\n             const firstField = errorFields[0];\n             if (firstField) {\n               scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });\n             }\n           }\n           return Promise.reject(errorFields);\n        } finally {\n            setModalProps({confirmLoading: false});\n        }\n    }\n\n    /**\n     * 处理日期值\n     * @param formData 表单数据\n     */\n    const changeDateValue = (formData) => {\n        if (formData && fieldPickers) {\n            for (let key in fieldPickers) {\n                if (formData[key]) {\n                    formData[key] = getDateByPicker(formData[key], fieldPickers[key]);\n                }\n            }\n        }\n    };\n\n<#if buttonList?size gt 0>\n  <#list buttonList as btn>\n      <#if btn.buttonStyle=='form'>\n         function handle${btn.buttonCode?cap_first}(){\n            createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n         }\n      </#if>\n  </#list>\n</#if>\n</script>\n\n<style lang=\"less\" scoped>\n\t/** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-calendar-picker) {\n    width: 100%;\n  }\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei",
    "content": "﻿<#include \"/common/utils.ftl\">\n<template>\n  <div class=\"p-2\">\n<#assign query_field_no=0>  \n<#assign need_category = false>\n<#assign need_pca = false>\n<#assign need_search = false>\n<#assign need_dept_user = false>\n<#assign need_switch = false>\n<#assign need_dept = false>\n<#assign need_multi = false>\n<#assign need_popup = false>\n<#assign need_popup_dict = false>\n<#assign need_select_tag = false>\n<#assign need_select_tree = false>\n<#assign need_time = false>\n<#assign bpm_flag=false>\n<#assign need_markdown = false>\n<#assign need_upload = false>\n<#assign need_image_upload = false>\n<#assign need_editor = false>\n<#assign need_checkbox = false>\n<#assign need_range_number = false>\n<#assign is_range = false>\n<#assign query_flag = false>\n<#assign buttonList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n  <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n</#if>\n<#assign is_like = false>\n    <!--查询区域-->\n    <div class=\"jeecg-basic-table-form-container\">\n      <a-form ref=\"formRef\" @keyup.enter.native=\"searchQuery\" :model=\"queryParam\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\">\n        <a-row :gutter=\"24\">\n<#-- 开始循环 -->\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.classType=='cat_tree' && po.dictText?default(\"\")?trim?length == 0>\n<#assign need_category=true>\n</#if>\n<#if po.classType=='pca'>\n<#assign need_pca=true>\n</#if>\n<#if po.classType=='sel_search'>\n<#assign need_search = true>\n</#if>\n<#if po.classType=='sel_user'>\n<#assign need_dept_user = true>\n</#if>\n<#if po.classType=='sel_depart'>\n<#assign need_dept = true>\n</#if>\n<#if po.classType=='switch'>\n<#assign need_switch = true>\n</#if>\n<#if po.classType=='list_multi'>\n<#assign need_multi = true>\n</#if>\n<#if po.classType=='popup'>\n<#assign need_popup = true>\n</#if>\n<#if po.classType=='popup_dict'>\n<#assign need_popup_dict = true>\n</#if>\n<#if po.classType=='sel_tree'>\n<#assign need_select_tree = true>\n</#if>\n<#if po.classType=='time'>\n<#assign need_time = true>\n</#if>\n<#if po.queryMode=='group' && (po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal')>\n<#assign need_range_number = true>\n</#if>\n<#if po.queryMode=='group'>\n<#assign is_range = true>\n</#if>\n<#if po.queryMode=='like'>\n<#assign is_like = true>\n</#if>\n  <#include \"/common/form/native/vue3NativeSearch.ftl\">\n</#list>\n<#if query_field_no gt 2>\n          </template>\n</#if>\n<#if query_flag>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left; overflow: hidden\" class=\"table-page-search-submitButtons\">\n              <a-col :lg=\"6\">\n                <a-button type=\"primary\" preIcon=\"ant-design:search-outlined\" @click=\"searchQuery\">查询</a-button>\n                <a-button type=\"primary\" preIcon=\"ant-design:reload-outlined\" @click=\"searchReset\" style=\"margin-left: 8px\">重置</a-button>\n                <a @click=\"toggleSearchStatus = !toggleSearchStatus\" style=\"margin-left: 8px\">\n                  {{ toggleSearchStatus ? '收起' : '展开' }}\n                  <Icon :icon=\"toggleSearchStatus ? 'ant-design:up-outlined' : 'ant-design:down-outlined'\" />\n                </a>\n              </a-col>\n            </span>\n          </a-col>\n</#if>\n        </a-row>\n      </a-form>\n    </div>\n<#-- 结束循环 -->\n    <!--引用表格-->\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-button type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:add'\"  @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\"> 新增</a-button>\n        <a-button  type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:exportXls'\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n        <j-upload-button  type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:importExcel'\"  preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n <#if buttonList?size gt 0>\n    <#list buttonList as btn>\n       <#if btn.buttonStyle == 'button'>\n         <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"ant-design:${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n       </#if>\n     </#list>\n   </#if>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button v-auth=\"'${entityPackage}:${tableName}:deleteBatch'\">批量操作\n            <Icon icon=\"mdi:chevron-down\"></Icon>\n          </a-button>\n        </a-dropdown>\n        <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n        <!-- 高级查询 -->\n        <super-query :config=\"superQueryConfig\" @search=\"handleSuperQuery\" />\n        <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\"/>\n      </template>\n      <template v-slot:bodyCell=\"{ column, record, index, text }\">\n      <#list columns as po>\n        <#if po.classType=='umeditor' || po.classType=='pca' || po.classType=='file'>\n        <template v-if=\"column.dataIndex==='${po.fieldName}'\">\n        <#if po.classType=='umeditor'>\n          <!--富文本件字段回显插槽-->\n          <div v-html=\"text\"></div>\n        </#if>\n        <#if po.classType=='pca'>\n          <!--省市区字段回显插槽-->\n          {{ getAreaTextByCode(text) }}\n        </#if>\n        <#if po.classType=='file'>\n          <!--文件字段回显插槽-->\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n          <a-button v-else :ghost=\"true\" type=\"primary\" preIcon=\"ant-design:download-outlined\" size=\"small\" @click=\"downloadFile(text)\">下载</a-button>\n        </#if>\n        </template>\n        </#if>\n      </#list>\n      </template>\n    </BasicTable>\n    <!-- 表单区域 -->\n    <${entityName}Modal ref=\"registerModal\" @success=\"handleSuccess\"></${entityName}Modal>\n    <#if bpm_flag==true>\n    <!-- 审批记录 -->\n    <BpmPictureModal @register=\"registerBpmModal\" />\n   </#if>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"${entityPackage}-${entityName?uncap_first}\" setup>\n  import { ref, reactive } from 'vue';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { columns, superQuerySchema } from './${entityName}.data';\n  import { list, deleteOne, batchDelete, getImportUrl, getExportUrl } from './${entityName}.api';\n  import { downloadFile } from '/@/utils/common/renderUtils';\n  import ${entityName}Modal from './components/${entityName}Modal.vue'\n  import { useUserStore } from '/@/store/modules/user';\n  import { useMessage } from '/@/hooks/web/useMessage';\n   import {useModal} from '/@/components/Modal';\n  <#include \"/common/form/native/vue3NativeImport.ftl\">\n<#if need_category>\n  import { loadCategoryData } from '/@/api/common/api';\n  import { getAuthCache, setAuthCache } from '/@/utils/auth';\n  import { DB_DICT_DATA_KEY } from '/@/enums/cacheEnum';\n</#if>\n<#if need_pca>\n  import { getAreaTextByCode } from '/@/components/Form/src/utils/Area';\n</#if>\n  import { getDateByPicker } from '/@/utils';\n  <#if need_popup_dict>\n import {getPopDictByCode} from \"@/utils/dict\";\n import {filterMultiDictText} from \"@/utils/dict/JDictSelectUtil\";\n  </#if>\n  <#if bpm_flag==true>\n  import { startProcess } from '/@/api/common/api';\n  const [registerBpmModal, { openModal: bpmPicModal }] = useModal();\n  </#if>\n  <#if is_range>\n  import { cloneDeep } from \"lodash-es\";\n  </#if>\n\n  const fieldPickers = reactive({\n  <#list columns as po>\n    <#if po.extendParams?exists && po.extendParams.picker?exists>\n    ${po.fieldName}: '${po.extendParams.picker}',\n    </#if>\n  </#list>\n  });\n\n  const formRef = ref();\n  const queryParam = reactive<any>({});\n  const toggleSearchStatus = ref<boolean>(false);\n  const registerModal = ref();\n  const userStore = useUserStore();\n  const { createMessage } = useMessage();\n  //注册table数据\n  const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({\n    tableProps: {\n      title: '${tableVo.ftlDescription}',\n      api: list,\n      columns,\n      canResize:true,\n      useSearchForm: false,\n      actionColumn: {\n        width: 120,\n        fixed: 'right',\n      },\n      beforeFetch: async (params) => {\n       <#if is_range>\n        let rangerQuery = await setRangeQuery();\n        return Object.assign(params, rangerQuery);\n       <#else>\n        for (let key in fieldPickers) {\n          if (queryParam[key] && fieldPickers[key]) {\n            queryParam[key] = getDateByPicker(queryParam[key], fieldPickers[key]);\n          }\n        }\n        return Object.assign(params, queryParam);\n       </#if>\n      },\n      <#if need_popup_dict>\n      afterFetch: afterFetch\n      </#if>\n    },\n    exportConfig: {\n      name: \"${tableVo.ftlDescription}\",\n      url: getExportUrl,\n      <#if is_range>\n      params: setRangeQuery,\n      <#else>\n      params: queryParam,\n      </#if>\n    },\n\t  importConfig: {\n\t    url: getImportUrl,\n\t    success: handleSuccess\n\t  },\n  });\n  const [registerTable, { reload, collapseAll, updateTableDataRecord, findTableDataRecord, getDataSource }, { rowSelection, selectedRowKeys }] = tableContext;\n  const labelCol = reactive({\n    xs:24,\n    sm:4,\n    xl:6,\n    xxl:4\n  });\n  const wrapperCol = reactive({\n    xs: 24,\n    sm: 20,\n  });\n\n<#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n  // 高级查询配置\n  const superQueryConfig = reactive(superQuerySchema);\n\n  /**\n   * 高级查询事件\n   */\n  function handleSuperQuery(params) {\n    Object.keys(params).map((k) => {\n      queryParam[k] = params[k];\n    });\n    searchQuery();\n  }\n<#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n\n  /**\n   * 新增事件\n   */\n  function handleAdd() {\n    registerModal.value.disableSubmit = false;\n    registerModal.value.add();\n  }\n  \n  /**\n   * 编辑事件\n   */\n  function handleEdit(record: Recordable) {\n    registerModal.value.disableSubmit = false;\n    registerModal.value.edit(record);\n  }\n   \n  /**\n   * 详情\n   */\n  function handleDetail(record: Recordable) {\n    registerModal.value.disableSubmit = true;\n    registerModal.value.edit(record);\n  }\n   \n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteOne({ id: record.id }, handleSuccess);\n  }\n   \n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDelete({ ids: selectedRowKeys.value }, handleSuccess);\n  }\n   \n  /**\n   * 成功回调\n   */\n  function handleSuccess() {\n    (selectedRowKeys.value = []) && reload();\n  }\n   \n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n        auth: '${entityPackage}:${tableName}:edit'\n      },\n    ];\n  }\n   \n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record) {\n    <#if bpm_flag==true>\n    let dropDownAction = [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      }, {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft',\n        },\n        auth: '${entityPackage}:${tableName}:delete'\n      },\n        {\n          label: '审批进度',\n          onClick: handlePreviewPic.bind(null, record),\n          ifShow: !!record.bpmStatus && record.bpmStatus !== '1',\n        }\n <#if buttonList?size gt 0>\n     <#list buttonList as btn>\n        <#if btn.buttonStyle == 'link'>\n        ,{\n           label: '${btn.buttonName}',\n           onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n         }\n        </#if>\n      </#list>\n  </#if>\n    ];\n    if(record.bpmStatus == '1'){\n      dropDownAction.push({\n        label: '发起流程',\n        popConfirm: {\n          title: '确认提交流程吗？',\n          confirm: handleProcess.bind(null, record),\n          placement: 'topLeft',\n        }\n      })\n    }\n    return dropDownAction;\n    <#else>\n    return [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      }, {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft',\n        },\n        auth: '${entityPackage}:${tableName}:delete'\n      }\n<#if buttonList?size gt 0>\n   <#list buttonList as btn>\n      <#if btn.buttonStyle == 'link'>\n      ,{\n         label: '${btn.buttonName}',\n         onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n       }\n      </#if>\n    </#list>\n</#if>\n    ]\n    </#if>\n  }\n\n  /**\n   * 查询\n   */\n  function searchQuery() {\n    reload();\n  }\n  \n  /**\n   * 重置\n   */\n  function searchReset() {\n    formRef.value.resetFields();\n    selectedRowKeys.value = [];\n    //刷新数据\n    reload();\n  }\n  \n  <#if need_popup>\n  /**\n   *  popup组件值改变事件\n   */\n  function setFieldsValue(map) {\n    Object.keys(map).map((key) => {\n      queryParam[key] = map[key];\n    });\n  }\n  </#if>\n\n  <#if need_pca || need_dept_user>\n  /**\n   * form点击事件(以逗号分割)\n   * @param key\n   * @param value\n   */\n  function handleFormJoinChange(key, value) {\n    if (typeof value != 'string') {\n      queryParam[key] = value.join(',');\n    }\n  }\n  </#if>\n\n  <#if bpm_flag==true>\n  /**\n   * 提交流程\n   */\n  async function handleProcess(record) {\n    let params = {\n      flowCode: 'dev_${tableName}_001',\n      id: record.id,\n      formUrl: '${entityPackagePath}/components/${entityName}Form',\n      formUrlMobile: ''\n    }\n    await startProcess(params);\n    handleSuccess();\n  }\n   /**\n   * 审批进度\n   */\n  async function handlePreviewPic(record) {\n    bpmPicModal(true, {\n      flowCode: 'dev_${tableName}_001',\n      dataId: record.id,\n    });\n  }\n  </#if>\n\n<#if buttonList?size gt 0>\n  <#list buttonList as btn>\n  <#if btn.buttonStyle=='button'>\n     function handle${btn.buttonCode?cap_first}(){\n        createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n     }\n  </#if>\n   <#if btn.buttonStyle=='link'>\n    function handle${btn.buttonCode?cap_first}(record){\n      createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n    }\n   </#if>\n  </#list>\n</#if>\n\n  <#if need_category>\n  /**\n   * form点击事件\n   * @param value\n   */\n  function handleFormChange(key, value) {\n    queryParam[key] = value;\n  }\n  \n  /**\n   * 初始化字典配置\n   */\n  function initDictConfig() {\n  <#list columns as po>\n  <#if (po.isQuery=='Y' || po.isShowList=='Y') && po.classType!='popup'>\n    <#if po.classType=='cat_tree' && need_category==true>\n    loadCategoryData({code:'${po.dictField?default(\"\")}'}).then((res) => {\n      if (res) {\n        const allDictDate = userStore.getAllDictItems;\n        if(!allDictDate['${po.dictField?default(\"\")}']){\n          userStore.setAllDictItems({...allDictDate,'${po.dictField?default(\"\")}':res});\n        }\n      }\n    });\n     </#if>\n   </#if>\n   </#list>\n  }\n  initDictConfig();\n    </#if>\n  <#if is_range>\n  \n  let rangeField = '${getRangeField(columns)}'\n  \n  /**\n   * 设置范围查询条件\n   */\n  async function setRangeQuery(){\n    let queryParamClone = cloneDeep(queryParam);\n    if (rangeField) {\n      let fieldsValue = rangeField.split(',');\n      fieldsValue.forEach(item => {\n        if (queryParamClone[item]) {\n          let range = queryParamClone[item];\n          queryParamClone[item+'_begin'] = range[0];\n          queryParamClone[item+'_end'] = range[1];\n          delete queryParamClone[item];\n        } else {\n          queryParamClone[item+'_begin'] = '';\n          queryParamClone[item+'_end'] = '';\n        }\n      })\n    }\n    return queryParamClone;\n  }\n  </#if>\n\n <#if need_popup_dict>\n /**\n  * 翻译Popup字典配置\n */\n  async function afterFetch(records){\n<#list columns as po>\n  <#if po.isQuery=='Y' || po.isShowList=='Y'>\n    <#if po.classType=='popup_dict'>\n    const ${po.fieldName}Keys = [...new Set(records.map((item) => item['${po.fieldName}']).flatMap((item) => item && item.split(',')))];\n    if(${po.fieldName}Keys && ${po.fieldName}Keys.length){\n     const dictOptions = await getPopDictByCode(${po.fieldName}Keys.join(','), '${po.dictTable},${po.dictField},${po.dictText}');\n     records.forEach((item) => {\n       item['${po.fieldName}_dictText'] = filterMultiDictText(dictOptions, item['${po.fieldName}']);\n     });\n    }\n    </#if>\n  </#if>\n</#list>\n   return records;\n }\n  </#if>\n</script>\n\n<style lang=\"less\" scoped>\n<#include \"/common/form/native/vueNativeSearchStyle.ftl\">\n</style>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { useMessage } from \"/@/hooks/web/useMessage\";\n\nconst { createConfirm } = useMessage();\n\nenum Api {\n  list = '/${entityPackagePath}/${entityName?uncap_first}/list',\n  save='/${entityPackagePath}/${entityName?uncap_first}/add',\n  edit='/${entityPackagePath}/${entityName?uncap_first}/edit',\n  deleteOne = '/${entityPackagePath}/${entityName?uncap_first}/delete',\n  deleteBatch = '/${entityPackagePath}/${entityName?uncap_first}/deleteBatch',\n  importExcel = '/${entityPackagePath}/${entityName?uncap_first}/importExcel',\n  exportXls = '/${entityPackagePath}/${entityName?uncap_first}/exportXls',\n}\n\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) => defHttp.get({ url: Api.list, params });\n\n/**\n * 删除单个\n * @param params\n * @param handleSuccess\n */\nexport const deleteOne = (params,handleSuccess) => {\n  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n\n/**\n * 批量删除\n * @param params\n * @param handleSuccess\n */\nexport const batchDelete = (params, handleSuccess) => {\n  createConfirm({\n    iconType: 'warning',\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n\n/**\n * 保存或者更新\n * @param params\n * @param isUpdate\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({ url: url, params }, { isTransformResponse: false });\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi",
    "content": "<#include \"/common/utils.ftl\">\nimport {BasicColumn} from '/@/components/Table';\nimport {FormSchema} from '/@/components/Table';\nimport { rules} from '/@/utils/helper/validator';\nimport { render } from '/@/utils/common/renderUtils';\nimport { getWeekMonthQuarterYear } from '/@/utils';\n//列表数据\nexport const columns: BasicColumn[] = [\n <#list columns as po>\n   <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n   <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  {\n    title: '${po.filedComment}',\n    align: \"center\",\n    <#if po.sort=='Y'>\n    sorter: true,\n   </#if>\n    <#if po.classType=='date'>\n    dataIndex: '${po.fieldName}',\n    customRender:({text}) =>{\n      text = !text ? \"\" : (text.length > 10 ? text.substr(0,10) : text);\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      if(text) {\n        return getWeekMonthQuarterYear(text)['${po.extendParams.picker}'];\n      } else {\n        return text;\n      }\n      <#else>\n      return text;\n      </#if>\n    },\n    <#elseif po.fieldDbType=='Blob'>\n    dataIndex: '${po.fieldName}String'\n    <#elseif po.classType=='umeditor'>\n    dataIndex: '${po.fieldName}',\n    <#elseif po.classType=='pca'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='file'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='image'>\n    dataIndex: '${po.fieldName}',\n    customRender: render.renderImage,\n   <#elseif po.classType=='switch'>\n    dataIndex: '${po.fieldName}',\n<#assign switch_extend_arr=['Y','N']>\n<#if po.dictField?default(\"\")?contains(\"[\")>\n<#assign switch_extend_arr=po.dictField?eval>\n</#if>\n<#list switch_extend_arr as a>\n<#if a_index == 0>\n<#assign switch_extend_arr1=a>\n<#else>\n<#assign switch_extend_arr2=a>\n</#if>\n</#list>\n    customRender:({text}) => {\n       return  render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}]);\n     },\n   <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict'>\n    dataIndex: '${po.fieldName}_dictText'\n   <#elseif po.classType=='cat_tree'>\n    dataIndex: '${po.fieldName}',\n    <#if po.dictText?default(\"\")?trim?length == 0>\n    customRender:({text}) => {\n       return render.renderCategoryTree(text,'${po.dictField?default(\"\")}');\n   },\n   <#else>\n    customRender: ({text, record}) => (text ? record['${po.dictText}'] : '');\n   </#if>\n   <#else>\n    dataIndex: '${po.fieldName}'\n   </#if>\n  },\n   </#if>\n </#list>\n];\n\n<#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n// 高级查询数据\nexport const superQuerySchema = {\n  <#list columns as po>\n  <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n  <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  ${superQueryFieldListForVue3(po,po_index)},\n  </#if>\n  </#list>\n};\n<#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql",
    "content": "<#include \"/common/sql/menu_insert.ftl\">"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n  <a-spin :spinning=\"confirmLoading\">\n    <JFormContainer :disabled=\"disabled\">\n      <template #detail>\n        <a-form ref=\"formRef\" class=\"antd-modal-form\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" name=\"${entityName}Form\">\n          <a-row>\n<#assign need_category = false>\n<#assign bpm_flag=false>\n<#assign need_pca = false>\n<#assign need_search = false>\n<#assign need_dept_user = false>\n<#assign need_switch = false>\n<#assign need_dept = false>\n<#assign need_multi = false>\n<#assign need_popup = false>\n<#assign need_popup_dict = false>\n<#assign need_select_tag = false>\n<#assign need_select_tree = false>\n<#assign need_time = false>\n<#assign need_markdown = false>\n<#assign need_upload = false>\n<#assign need_image_upload = false>\n<#assign need_editor = false>\n<#assign need_checkbox = false>\n<#assign hasOnlyValidate = false> \n<#assign need_range_number = false>\n<#assign is_like = false>\n<#assign form_span = 24>\n<#if tableVo.fieldRowNum==2>\n<#assign form_span = 12>\n<#elseif tableVo.fieldRowNum==3>\n<#assign form_span = 8>\n<#elseif tableVo.fieldRowNum==4>\n<#assign form_span = 6>\n</#if>\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>        \n<#if po.isShow == 'Y' && po.fieldValidType?default(\"\") == 'only'>\n      <#assign hasOnlyValidate = true>\n</#if>\n  <#assign formEntityName>${entityName}Form</#assign>\n  <#include \"/common/form/native/vue3NativeForm.ftl\">\n</#list>\n        <#if bpm_flag>\n            <a-col v-if=\"showFlowSubmitButton\" :span=\"24\" style=\"width: 100%;text-align: center;\">\n              <a-button preIcon=\"ant-design:check-outlined\" style=\"width: 126px\" type=\"primary\" @click=\"submitForm\">提 交</a-button>\n            </a-col>\n        </#if>\n          </a-row>\n        </a-form>\n      </template>\n    </JFormContainer>\n  </a-spin>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  <#include \"/common/form/native/vue3NativeImport.ftl\">\n  import { getDateByPicker, getValueType } from '/@/utils';\n  import { saveOrUpdate } from '../${entityName}.api';\n  import { Form } from 'ant-design-vue';\n  import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';\n  <#if hasOnlyValidate == true>\n  import { duplicateValidate } from '/@/utils/helper/validator'\n  </#if>\n  <#if bpm_flag>\n  import { usePermission } from '/@/hooks/web/usePermission';\n  const { isDisabledAuth, hasPermission, initBpmFormData } = usePermission();\n  </#if>\n  const props = defineProps({\n    formDisabled: { type: Boolean, default: false },\n    formData: { type: Object, default: () => ({})},\n    formBpm: { type: Boolean, default: true }\n  });\n  const formRef = ref();\n  const useForm = Form.useForm;\n  const emit = defineEmits(['register', 'ok']);\n  const formData = reactive<Record<string, any>>({\n    id: '',\n    <#include \"/common/init/native/vue3NativeInitValue.ftl\">\n  });\n  const { createMessage } = useMessage();\n  const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });\n  const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });\n  const confirmLoading = ref<boolean>(false);\n  //表单验证\n  const validatorRules = reactive({\n  <#include \"/common/validatorRulesTemplate/native/vue3MainNative.ftl\">\n  });\n  const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });\n  //日期个性化选择\n  const fieldPickers = reactive({\n  <#list columns as po>\n    <#if po.extendParams?exists && po.extendParams.picker?exists>\n    ${po.fieldName}: '${po.extendParams.picker}',\n    </#if>\n  </#list>\n  });\n\n  // 表单禁用\n  const disabled = computed(()=>{\n    if(props.formBpm === true){\n      if(props.formData.disabled === false){\n        return false;\n      }else{\n        return true;\n      }\n    }\n    return props.formDisabled;\n  });\n\n  <#if bpm_flag>\n  onMounted(()=>{\n    initBpmFormData(props.formData);\n    initFormData();\n  });\n  //渲染流程表单数据\n  const queryByIdUrl = '/${entityPackagePath}/${entityName?uncap_first}/queryById';\n  async function initFormData(){\n    if(props.formBpm === true){\n      let params = {id: props.formData.dataId};\n      const data = await defHttp.get({url: queryByIdUrl, params});\n      //设置表单的值\n      edit({...data});\n    }\n  }\n  // 是否显示提交按钮\n  const showFlowSubmitButton = computed(()=>{\n    if(props.formBpm === true){\n      if(props.formData.disabled === false){\n        return true\n      }\n    }\n    return false\n  });\n  </#if>\n  \n  /**\n   * 新增\n   */\n  function add() {\n    edit({});\n  }\n\n  /**\n   * 编辑\n   */\n  function edit(record) {\n    nextTick(() => {\n      resetFields();\n      const tmpData = {};\n      Object.keys(formData).forEach((key) => {\n        if(record.hasOwnProperty(key)){\n          tmpData[key] = record[key]\n        }\n      })\n      //赋值\n      Object.assign(formData, tmpData);\n    });\n  }\n\n  /**\n   * 提交数据\n   */\n  async function submitForm() {\n    try {\n      // 触发表单验证\n      await validate();\n    } catch ({ errorFields }) {\n      if (errorFields) {\n        const firstField = errorFields[0];\n        if (firstField) {\n          formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });\n        }\n      }\n      return Promise.reject(errorFields);\n    }\n    confirmLoading.value = true;\n    const isUpdate = ref<boolean>(false);\n    //时间格式化\n    let model = formData;\n    if (model.id) {\n      isUpdate.value = true;\n    }\n    //循环数据\n    for (let data in model) {\n      // 更新个性化日期选择器的值\n      model[data] = getDateByPicker(model[data], fieldPickers[data]);\n      //如果该数据是数组并且是字符串类型\n      if (model[data] instanceof Array) {\n        let valueType = getValueType(formRef.value.getProps, data);\n        //如果是字符串类型的需要变成以逗号分割的字符串\n        if (valueType === 'string') {\n          model[data] = model[data].join(',');\n        }\n      }\n    }\n    await saveOrUpdate(model, isUpdate.value)\n      .then((res) => {\n        if (res.success) {\n          createMessage.success(res.message);\n          emit('ok');\n        } else {\n          createMessage.warning(res.message);\n        }\n      })\n      .finally(() => {\n        confirmLoading.value = false;\n      });\n  }\n\n\t<#if need_popup>\n  /**\n   *  popup组件值改变事件\n   */\n  function setFieldsValue(map) {\n    Object.keys(map).map((key) => {\n      formData[key] = map[key];\n    });\n  }\n\t</#if>\n\n\t<#if need_category || need_select_tree>\n  /**\n   * 值改变事件触发\n   * @param key\n   * @param value\n   */\n  function handleFormChange(key, value) {\n    formData[key] = value;\n  }\n  </#if>\n <#list columns as po>\n  <#if po.isShow == 'Y' && po.fieldValidType?default(\"\") == 'only'>\n  async function ${po.fieldName}Duplicatevalidate(_r, value) {\n    return duplicateValidate('${tableName}', '${po.fieldDbName}', value, formData.id || '')\n  }\n  </#if>\n  </#list>\n  defineExpose({\n    add,\n    edit,\n    submitForm,\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .antd-modal-form {\n    padding: 14px 20px;\n  }\n</style>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/one/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n<#assign buttonList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n  <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n</#if>\n  <j-modal :title=\"title\" maxHeight=\"500px\" :width=\"${getModalWidth(tableVo.fieldRowNum?default(1))}\" :visible=\"visible\" @ok=\"handleOk\" :okButtonProps=\"{ class: { 'jee-hidden': disableSubmit } }\" @cancel=\"handleCancel\" cancelText=\"关闭\">\n    <${entityName}Form ref=\"registerForm\" @ok=\"submitCallback\" :formDisabled=\"disableSubmit\" :formBpm=\"false\"></${entityName}Form>\n   <template #footer>\n      <#if buttonList?? && buttonList?size gt 0>\n      <#list buttonList as btn>\n       <#if btn.buttonStyle=='form'>\n         <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"ant-design:${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n       </#if>\n      </#list>\n      </#if>\n     <a-button @click=\"handleCancel\">取消</a-button>\n     <a-button :class=\"{ 'jee-hidden': disableSubmit }\" type=\"primary\" @click=\"handleOk\">确认</a-button>\n   </template>\n  </j-modal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, nextTick, defineExpose } from 'vue';\n  import ${entityName}Form from './${entityName}Form.vue'\n  import JModal from '/@/components/Modal/src/JModal/JModal.vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  const { createMessage } = useMessage();\n  const title = ref<string>('');\n  const width = ref<number>(800);\n  const visible = ref<boolean>(false);\n  const disableSubmit = ref<boolean>(false);\n  const registerForm = ref();\n  const emit = defineEmits(['register', 'success']);\n\n  /**\n   * 新增\n   */\n  function add() {\n    title.value = '新增';\n    visible.value = true;\n    nextTick(() => {\n      registerForm.value.add();\n    });\n  }\n  \n  /**\n   * 编辑\n   * @param record\n   */\n  function edit(record) {\n    title.value = disableSubmit.value ? '详情' : '编辑';\n    visible.value = true;\n    nextTick(() => {\n      registerForm.value.edit(record);\n    });\n  }\n  \n  /**\n   * 确定按钮点击事件\n   */\n  function handleOk() {\n    registerForm.value.submitForm();\n  }\n\n  /**\n   * form保存回调事件\n   */\n  function submitCallback() {\n    handleCancel();\n    emit('success');\n  }\n\n  /**\n   * 取消按钮回调事件\n   */\n  function handleCancel() {\n    visible.value = false;\n  }\n<#if buttonList?size gt 0>\n  <#list buttonList as btn>\n      <#if btn.buttonStyle=='form'>\n         function handle${btn.buttonCode?cap_first}(){\n            createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n         }\n      </#if>\n  </#list>\n</#if>\n  defineExpose({\n    add,\n    edit,\n    disableSubmit,\n  });\n</script>\n\n<style lang=\"less\">\n  /**隐藏样式-modal确定按钮 */\n  .jee-hidden {\n    display: none !important;\n  }\n</style>\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai",
    "content": "package ${bussiPackage}.${entityPackage}.controller;\n\nimport java.io.UnsupportedEncodingException;\nimport java.io.IOException;\nimport java.net.URLDecoder;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\n\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecgframework.poi.excel.entity.enmus.ExcelType;\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport ${bussiPackage}.${entityPackage}.vo.${entityName}Page;\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.service.I${sub.entityName}Service;\n</#list>\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\nimport com.alibaba.fastjson.JSON;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\n<#assign bpm_flag=false>\n<#list originalColumns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n</#list>\n\n /**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Tag(name=\"${tableVo.ftlDescription}\")\n@RestController\n@RequestMapping(\"/${entityPackagePath}/${entityName?uncap_first}\")\n@Slf4j\npublic class ${entityName}Controller {\n\t@Autowired\n\tprivate I${entityName}Service ${entityName?uncap_first}Service;\n\t<#list subTables as sub>\n\t@Autowired\n\tprivate I${sub.entityName}Service ${sub.entityName?uncap_first}Service;\n\t</#list>\n\t\n\t/**\n\t * 分页列表查询\n\t *\n\t * @param ${entityName?uncap_first}\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t//@AutoLog(value = \"${tableVo.ftlDescription}-分页列表查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-分页列表查询\")\n\t@GetMapping(value = \"/list\")\n\tpublic Result<IPage<${entityName}>> queryPageList(${entityName} ${entityName?uncap_first},\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t   HttpServletRequest req) {\n\t\tQueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap());\n\t\tPage<${entityName}> page = new Page<${entityName}>(pageNo, pageSize);\n\t\tIPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper);\n\t\treturn Result.OK(pageList);\n\t}\n\t\n\t/**\n\t *   添加\n\t *\n\t * @param ${entityName?uncap_first}Page\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-添加\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-添加\")\n\t@RequiresPermissions(\"${entityPackage}:${tableName}:add\")\n\t@PostMapping(value = \"/add\")\n\tpublic Result<String> add(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) {\n\t\t${entityName} ${entityName?uncap_first} = new ${entityName}();\n\t\tBeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first});\n\t\t<#if bpm_flag>\n        ${entityName?uncap_first}.setBpmStatus(\"1\");\n        </#if>\n\t\t${entityName?uncap_first}Service.saveMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>);\n\t\treturn Result.OK(\"添加成功！\");\n\t}\n\t\n\t/**\n\t *  编辑\n\t *\n\t * @param ${entityName?uncap_first}Page\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-编辑\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-编辑\")\n\t@RequiresPermissions(\"${entityPackage}:${tableName}:edit\")\n\t@RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n\tpublic Result<String> edit(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) {\n\t\t${entityName} ${entityName?uncap_first} = new ${entityName}();\n\t\tBeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first});\n\t\t${entityName} ${entityName?uncap_first}Entity = ${entityName?uncap_first}Service.getById(${entityName?uncap_first}.getId());\n\t\tif(${entityName?uncap_first}Entity==null) {\n\t\t\treturn Result.error(\"未找到对应数据\");\n\t\t}\n\t\t${entityName?uncap_first}Service.updateMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>);\n\t\treturn Result.OK(\"编辑成功!\");\n\t}\n\t\n\t/**\n\t *   通过id删除\n\t *\n\t * @param id\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-通过id删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id删除\")\n\t@RequiresPermissions(\"${entityPackage}:${tableName}:delete\")\n\t@DeleteMapping(value = \"/delete\")\n\tpublic Result<String> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${entityName?uncap_first}Service.delMain(id);\n\t\treturn Result.OK(\"删除成功!\");\n\t}\n\t\n\t/**\n\t *  批量删除\n\t *\n\t * @param ids\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-批量删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-批量删除\")\n\t@RequiresPermissions(\"${entityPackage}:${tableName}:deleteBatch\")\n\t@DeleteMapping(value = \"/deleteBatch\")\n\tpublic Result<String> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tthis.${entityName?uncap_first}Service.delBatchMain(Arrays.asList(ids.split(\",\")));\n\t\treturn Result.OK(\"批量删除成功！\");\n\t}\n\t\n\t/**\n\t * 通过id查询\n\t *\n\t * @param id\n\t * @return\n\t */\n\t//@AutoLog(value = \"${tableVo.ftlDescription}-通过id查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id查询\")\n\t@GetMapping(value = \"/queryById\")\n\tpublic Result<${entityName}> queryById(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${entityName} ${entityName?uncap_first} = ${entityName?uncap_first}Service.getById(id);\n\t\tif(${entityName?uncap_first}==null) {\n\t\t\treturn Result.error(\"未找到对应数据\");\n\t\t}\n\t\treturn Result.OK(${entityName?uncap_first});\n\n\t}\n\t\n\t<#list subTables as sub>\n\t/**\n\t * 通过id查询\n\t *\n\t * @param id\n\t * @return\n\t */\n\t//@AutoLog(value = \"${sub.ftlDescription}通过主表ID查询\")\n\t@Operation(summary=\"${sub.ftlDescription}主表ID查询\")\n\t@GetMapping(value = \"/query${sub.entityName}ByMainId\")\n\tpublic Result<List<${sub.entityName}>> query${sub.entityName}ListByMainId(@RequestParam(name=\"id\",required=true) String id) {\n\t\tList<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(id);\n\t\treturn Result.OK(${sub.entityName?uncap_first}List);\n\t}\n\t</#list>\n\n    /**\n    * 导出excel\n    *\n    * @param request\n    * @param ${entityName?uncap_first}\n    */\n    @RequiresPermissions(\"${entityPackage}:${tableName}:exportXls\")\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) {\n      // Step.1 组装查询条件查询数据\n      QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap());\n      LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\n      //配置选中数据查询条件\n      String selections = request.getParameter(\"selections\");\n      if(oConvertUtils.isNotEmpty(selections)) {\n          List<String> selectionList = Arrays.asList(selections.split(\",\"));\n          queryWrapper.in(\"id\",selectionList);\n      }\n      //Step.2 获取导出数据\n      List<${entityName}> ${entityName?uncap_first}List = ${entityName?uncap_first}Service.list(queryWrapper);\n\n      // Step.3 组装pageList\n      List<${entityName}Page> pageList = new ArrayList<${entityName}Page>();\n      for (${entityName} main : ${entityName?uncap_first}List) {\n          ${entityName}Page vo = new ${entityName}Page();\n          BeanUtils.copyProperties(main, vo);\n          <#list subTables as sub>\n          List<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(main.getId());\n          vo.set${sub.entityName}List(${sub.entityName?uncap_first}List);\n          </#list>\n          pageList.add(vo);\n      }\n\n      // Step.4 AutoPoi 导出Excel\n      ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n      mv.addObject(NormalExcelConstants.FILE_NAME, \"${tableVo.ftlDescription}列表\");\n      mv.addObject(NormalExcelConstants.CLASS, ${entityName}Page.class);\n      mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(\"${tableVo.ftlDescription}数据\", \"导出人:\"+sysUser.getRealname(), \"${tableVo.ftlDescription}\", ExcelType.XSSF));\n      mv.addObject(NormalExcelConstants.DATA_LIST, pageList);\n      return mv;\n    }\n\n    /**\n    * 通过excel导入数据\n    *\n    * @param request\n    * @param response\n    * @return\n    */\n    @RequiresPermissions(\"${entityPackage}:${tableName}:importExcel\")\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n      MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n      Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n      for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n          // 获取上传文件对象\n          MultipartFile file = entity.getValue();\n          ImportParams params = new ImportParams();\n          params.setTitleRows(2);\n          params.setHeadRows(1);\n          params.setNeedSave(true);\n          try {\n              List<${entityName}Page> list = ExcelImportUtil.importExcel(file.getInputStream(), ${entityName}Page.class, params);\n              for (${entityName}Page page : list) {\n                  ${entityName} po = new ${entityName}();\n                  BeanUtils.copyProperties(page, po);\n                  ${entityName?uncap_first}Service.saveMain(po, <#list subTables as sub>page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>);\n              }\n              return Result.OK(\"文件导入成功！数据行数:\" + list.size());\n          } catch (Exception e) {\n              log.error(e.getMessage(),e);\n              return Result.error(\"文件导入失败:\"+e.getMessage());\n          } finally {\n              try {\n                  file.getInputStream().close();\n              } catch (IOException e) {\n                  e.printStackTrace();\n              }\n          }\n      }\n      return Result.OK(\"文件导入失败！\");\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai",
    "content": "<#include \"/common/utils.ftl\">\npackage ${bussiPackage}.${entityPackage}.entity;\n\nimport java.io.Serializable;\nimport java.io.UnsupportedEncodingException;\nimport java.util.Date;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport io.swagger.v3.oas.annotations.media.Schema;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Schema(description=\"${tableVo.ftlDescription}\")\n@Data\n@TableName(\"${tableName}\")\npublic class ${entityName} implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']>\n    <#list originalColumns as po>\n    <#-- 生成字典Code -->\n    <#assign list_field_dictCode=\"\">\n    <#if po.classType='sel_user'>\n      <#assign list_field_dictCode=', dictTable = \"sys_user\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"realname\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"username\\\")?trim)}\"'>\n    <#elseif po.classType='sel_depart'>\n      <#assign list_field_dictCode=', dictTable = \"sys_depart\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"depart_name\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"id\\\")?trim)}\"'>\n    <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>\n      <#if po.dictTable?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText}\", dicCode = \"${po.dictField}\"'>\n      <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dicCode = \"${po.dictField}\"'>\n    </#if>\n    <#elseif po.classType=='sel_tree'>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText?split(\",\")[2]}\", dicCode = \"${po.dictText?split(\",\")[0]}\"'>\n    </#if>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t@TableId(type = IdType.ASSIGN_ID)\n\t<#else>\n\t\t<#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'>\n\t\t\t<#if po.classType=='date'>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t\t\t<#else>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t\t\t</#if>\n\t\t<#else>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n\t</#if>\n\t\t</#if>\n      <#if list_field_dictCode?length gt 1>\n    @Dict(${list_field_dictCode?substring(2)})\n      </#if>\n\t</#if>\n    <#-- 大字段转换 -->\n     <#include \"/common/blob.ftl\">\n\t</#list>\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai",
    "content": "<#include \"/common/utils.ftl\">\n<#list subTables as subTab>\n#segment#${subTab.entityName}.java\npackage ${bussiPackage}.${entityPackage}.entity;\n\nimport java.io.Serializable;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport java.util.Date;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport java.io.UnsupportedEncodingException;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Schema(description=\"${subTab.ftlDescription}\")\n@Data\n@TableName(\"${subTab.tableName}\")\npublic class ${subTab.entityName} implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']>\n    <#list subTab.originalColumns as po>\n\t<#-- 生成字典Code -->\n\t<#assign list_field_dictCode=\"\">\n\t<#if po.classType='sel_user'>\n\t\t<#assign list_field_dictCode=', dictTable = \"sys_user\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"realname\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"username\\\")?trim)}\"'>\n\t<#elseif po.classType='sel_depart'>\n\t\t<#assign list_field_dictCode=', dictTable = \"sys_depart\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"depart_name\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"id\\\")?trim)}\"'>\n\t<#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>\n\t\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n\t\t\t<#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText}\", dicCode = \"${po.dictField}\"'>\n\t\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t\t<#assign list_field_dictCode=', dicCode = \"${po.dictField}\"'>\n\t\t<#elseif po.classType=='sel_tree'>\n\t\t\t<#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText?split(\",\")[2]}\", dicCode = \"${po.dictText?split(\",\")[0]}\"'>\n\t\t</#if>\n\t</#if>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t@TableId(type = IdType.ASSIGN_ID)\n\t<#else>\n\t\t<#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'>\n\t\t\t<#if po.classType=='date'>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n    </#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t\t\t<#else>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t\t\t</#if>\n\t\t<#elseif !subTab.foreignKeys?seq_contains(po.fieldName?cap_first)>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n\t</#if>\n\t\t</#if>\n\t</#if>\n\t <#-- 大字段转换 -->\n     <#include \"/common/blob.ftl\">\n\t</#list>\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai",
    "content": "package ${bussiPackage}.${entityPackage}.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface ${entityName}Mapper extends BaseMapper<${entityName}> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}Mapper.java\npackage ${bussiPackage}.${entityPackage}.mapper;\n\nimport java.util.List;\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Param;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface ${subTab.entityName}Mapper extends BaseMapper<${subTab.entityName}> {\n\n  /**\n   * 通过主表id删除子表数据\n   *\n   * @param mainId 主表id\n   * @return boolean\n   */\n\tpublic boolean deleteByMainId(@Param(\"mainId\") String mainId);\n\n  /**\n   * 通过主表id查询子表数据\n   *\n   * @param mainId 主表id\n   * @return List<${subTab.entityName}>\n   */\n\tpublic List<${subTab.entityName}> selectByMainId(@Param(\"mainId\") String mainId);\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml",
    "content": "<#list subTables as subTab>\n<#assign originalForeignKeys = subTab.originalForeignKeys>\n#segment#${subTab.entityName}Mapper.xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper\">\n\n\t<delete id=\"deleteByMainId\" parameterType=\"java.lang.String\">\n\t\tDELETE \n\t\tFROM  ${subTab.tableName} \n\t\tWHERE\n\t\t<#list originalForeignKeys as key>\n\t\t\t ${key} = ${r'#'}{mainId} <#rt/>\n\t\t</#list>\n\t</delete>\n\t\n\t<select id=\"selectByMainId\" parameterType=\"java.lang.String\" resultType=\"${bussiPackage}.${entityPackage}.entity.${subTab.entityName}\">\n\t\tSELECT * \n\t\tFROM  ${subTab.tableName}\n\t\tWHERE\n\t\t<#list originalForeignKeys as key>\n\t\t\t ${key} = ${r'#'}{mainId} <#rt/>\n\t\t</#list>\n\t</select>\n</mapper>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service;\n\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport java.io.Serializable;\nimport java.util.Collection;\nimport java.util.List;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface I${entityName}Service extends IService<${entityName}> {\n\n\t/**\n\t * 添加一对多\n\t *\n\t * @param ${entityName?uncap_first}\n\t <#list subTables as sub>\n\t * @param ${sub.entityName?uncap_first}List\n   </#list>\n\t */\n\tpublic void saveMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) ;\n\t\n\t/**\n\t * 修改一对多\n\t *\n\t * @param ${entityName?uncap_first}\n\t <#list subTables as sub>\n\t * @param ${sub.entityName?uncap_first}List\n\t </#list>\n\t */\n\tpublic void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>);\n\t\n\t/**\n\t * 删除一对多\n\t *\n\t * @param id\n\t */\n\tpublic void delMain (String id);\n\t\n\t/**\n\t * 批量删除一对多\n\t *\n\t * @param idList\n\t */\n\tpublic void delBatchMain (Collection<? extends Serializable> idList);\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai",
    "content": "<#list subTables as subTab>\n#segment#I${subTab.entityName}Service.java\npackage ${bussiPackage}.${entityPackage}.service;\n\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport java.util.List;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface I${subTab.entityName}Service extends IService<${subTab.entityName}> {\n\n  /**\n   * 通过主表id查询子表数据\n   *\n   * @param mainId 主表id\n   * @return List<${subTab.entityName}>\n   */\n\tpublic List<${subTab.entityName}> selectByMainId(String mainId);\n}\n</#list>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service.impl;\n\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.mapper.${sub.entityName}Mapper;\n</#list>\nimport ${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper;\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.transaction.annotation.Transactional;\nimport java.io.Serializable;\nimport java.util.List;\nimport java.util.Collection;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Service\npublic class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service {\n\n\t@Autowired\n\tprivate ${entityName}Mapper ${entityName?uncap_first}Mapper;\n\t<#list subTables as sub>\n\t@Autowired\n\tprivate ${sub.entityName}Mapper ${sub.entityName?uncap_first}Mapper;\n\t</#list>\n\t\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void saveMain(${entityName} ${entityName?uncap_first}, <#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) {\n\t\t${entityName?uncap_first}Mapper.insert(${entityName?uncap_first});\n\t\t<#list subTables as sub>\n\t\tif(${sub.entityName?uncap_first}List!=null && ${sub.entityName?uncap_first}List.size()>0) {\n\t\t\tfor(${sub.entityName} entity:${sub.entityName?uncap_first}List) {\n\t\t\t\t<#list sub.foreignKeys as key>\n\t\t\t\t//外键设置\n\t\t\t\t<#if key?lower_case?index_of(\"${primaryKeyField}\")!=-1>\n\t\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}());\n\t\t\t\t<#else>\n\t\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${key}());\n\t\t\t\t</#if>\n\t\t\t\t</#list>\n\t\t\t\t${sub.entityName?uncap_first}Mapper.insert(entity);\n\t\t\t}\n\t\t}\n\t\t</#list>\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) {\n\t\t${entityName?uncap_first}Mapper.updateById(${entityName?uncap_first});\n\t\t\n\t\t//1.先删除子表数据\n\t\t<#list subTables as sub>\n\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(${entityName?uncap_first}.getId());\n\t\t</#list>\n\t\t\n\t\t//2.子表数据重新插入\n\t\t<#list subTables as sub>\n\t\tif(${sub.entityName?uncap_first}List!=null && ${sub.entityName?uncap_first}List.size()>0) {\n\t\t\tfor(${sub.entityName} entity:${sub.entityName?uncap_first}List) {\n\t\t\t\t<#list sub.foreignKeys as key>\n\t\t\t\t//外键设置\n\t\t\t\t<#if key?lower_case?index_of(\"${primaryKeyField}\")!=-1>\n\t\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}());\n\t\t\t\t<#else>\n\t\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${key}());\n\t\t\t\t</#if>\n\t\t\t\t</#list>\n\t\t\t\t${sub.entityName?uncap_first}Mapper.insert(entity);\n\t\t\t}\n\t\t}\n\t\t</#list>\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void delMain(String id) {\n\t\t<#list subTables as sub>\n\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(id);\n\t\t</#list>\n\t\t${entityName?uncap_first}Mapper.deleteById(id);\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void delBatchMain(Collection<? extends Serializable> idList) {\n\t\tfor(Serializable id:idList) {\n\t\t\t<#list subTables as sub>\n\t\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(id.toString());\n\t\t\t</#list>\n\t\t\t${entityName?uncap_first}Mapper.deleteById(id);\n\t\t}\n\t}\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}ServiceImpl.java\npackage ${bussiPackage}.${entityPackage}.service.impl;\n\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport ${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper;\nimport ${bussiPackage}.${entityPackage}.service.I${subTab.entityName}Service;\nimport org.springframework.stereotype.Service;\nimport java.util.List;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Service\npublic class ${subTab.entityName}ServiceImpl extends ServiceImpl<${subTab.entityName}Mapper, ${subTab.entityName}> implements I${subTab.entityName}Service {\n\t\n\t@Autowired\n\tprivate ${subTab.entityName}Mapper ${subTab.entityName?uncap_first}Mapper;\n\t\n\t@Override\n\tpublic List<${subTab.entityName}> selectByMainId(String mainId) {\n\t\treturn ${subTab.entityName?uncap_first}Mapper.selectByMainId(mainId);\n\t}\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai",
    "content": "package ${bussiPackage}.${entityPackage}.vo;\n\nimport java.util.List;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport lombok.Data;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.jeecgframework.poi.excel.annotation.ExcelEntity;\nimport org.jeecgframework.poi.excel.annotation.ExcelCollection;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport java.util.Date;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport io.swagger.v3.oas.annotations.media.Schema;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Data\n@Schema(description=\"${tableVo.ftlDescription}\")\npublic class ${entityName}Page {\n\n\t<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']>\n    <#list originalColumns as po>\n    <#-- 生成字典Code -->\n    <#assign list_field_dictCode=\"\">\n    <#if po.classType='sel_user'>\n      <#assign list_field_dictCode=', dictTable = \"sys_user\", dicText = \"realname\", dicCode = \"username\"'>\n    <#elseif po.classType='sel_depart'>\n      <#assign list_field_dictCode=', dictTable = \"sys_depart\", dicText = \"depart_name\", dicCode = \"id\"'>\n    <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>\n      <#if po.dictTable?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText}\", dicCode = \"${po.dictField}\"'>\n      <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dicCode = \"${po.dictField}\"'>\n      </#if>\n    </#if>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t<#else>\n\t\t<#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'>\n\t\t\t<#if po.classType=='date'>\n\t<#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t\t\t<#else>\n\t<#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t\t\t</#if>\n\t\t<#else>\n\t<#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n\t</#if>\n\t\t</#if>\n        <#if list_field_dictCode?length gt 1>\n    @Dict(${list_field_dictCode?substring(2)})\n        </#if>\n\t</#if>\n\t@Schema(description = \"${po.filedComment}\")\n\t<#if po.fieldDbType=='Blob'>\n    private java.lang.String ${po.fieldName}String;\n    <#else>\n    private ${po.fieldType} ${po.fieldName};\n    </#if>\n\t</#list>\n\n\t<#list subTables as sub>\n\t@ExcelCollection(name=\"${sub.ftlDescription}\")\n\t@Schema(description = \"${sub.ftlDescription}\")\n\tprivate List<${sub.entityName}> ${sub.entityName?uncap_first}List;\n\t</#list>\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei",
    "content": "<template>\n  <a-card :bordered=\"false\">\n    <!-- 查询区域 -->\n    <div class=\"table-page-search-wrapper\">\n      <a-form layout=\"inline\" @keyup.enter.native=\"searchQuery\">\n        <a-row :gutter=\"24\">\n<#assign query_field_no=0>\n<#assign query_flag=false>\n<#assign list_need_dict=false>\n<#assign list_need_category=false>\n<#assign list_need_pca=false>\n<#assign bpm_flag=false>\n\n<#-- 开始循环 -->\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.isQuery=='Y'>\n<#assign query_flag=true>\n\t<#if query_field_no==2>\n          <template v-if=\"toggleSearchStatus\">\n\t</#if>\n\t<#assign query_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n\t    <#assign query_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n    <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign query_field_dictCode=\"${po.dictField}\">\n    </#if>\n\t<#if po.queryMode=='single'>\n          <#if query_field_no gt 1>  </#if><a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <#if query_field_no gt 1>  </#if><a-form-item label=\"${po.filedComment}\">\n            <#if po.classType=='sel_search'>\n              <#if query_field_no gt 1>  </#if><j-search-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dict=\"${po.dictTable},${po.dictText},${po.dictField}\"/>\n            <#elseif po.classType=='sel_user'>\n              <#if query_field_no gt 1>  </#if><j-select-user-by-dep placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"/>\n            <#elseif po.classType=='sel_depart'>\n              <#if query_field_no gt 1>  </#if><j-select-depart placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"/>\n            <#elseif po.classType=='list_multi'>\n              <#if query_field_no gt 1>  </#if><j-multi-select-tag placeholder=\"请选择${po.filedComment}\" dictCode=\"${query_field_dictCode?default(\"\")}\" v-model=\"queryParam.${po.fieldName}\"/>\n            <#elseif po.classType=='cat_tree'>\n              <#if query_field_no gt 1>  </#if><j-category-select placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\"/>\n\t\t\t<#elseif po.classType=='date'>\n              <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></j-date>\n\t\t\t<#elseif po.classType=='datetime'>\n              <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></j-date>\n            <#elseif po.classType=='pca'>\n              <#if query_field_no gt 1>  </#if><j-area-linkage type=\"cascader\" v-model=\"queryParam.${po.fieldName}\" placeholder=\"请选择省市区\"/>\n            <#elseif po.classType=='popup'>\n              <#if query_field_no gt 1>  </#if><j-popup placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" code=\"${po.dictTable}\" org-fields=\"${po.dictField}\" dest-fields=\"${po.dictText}\" :field=\"getPopupField('${po.dictText}')\" :multi=\"${po.extendParams.popupMulti?c}\"/>\n\t\t\t<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>\n\t\t\t<#--  ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->\n\t\t\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n              <#if query_field_no gt 1>  </#if><j-dict-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\"/>\n\t\t\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n              <#if query_field_no gt 1>  </#if><j-dict-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dictCode=\"${po.dictField}\"/>\n\t\t\t<#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n\t\t\t</#if>\n\t\t\t<#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n\t\t\t</#if>\n            <#if query_field_no gt 1>  </#if></a-form-item>\n          <#if query_field_no gt 1>  </#if></a-col>\n\t<#else>\n          <#if query_field_no gt 1>  </#if><a-col :xl=\"10\" :lg=\"11\" :md=\"12\" :sm=\"24\">\n            <#if query_field_no gt 1>  </#if><a-form-item label=\"${po.filedComment}\">\n\t\t\t<#if po.classType=='date'>\n              <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择开始日期\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></j-date>\n              <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n              <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择结束日期\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></j-date>\n\t\t\t<#elseif po.classType=='datetime'>\n              <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择开始时间\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></j-date>\n              <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n              <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择结束时间\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></j-date>\n\t\t\t<#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入最小值\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></a-input>\n              <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入最大值\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></a-input>\n\t\t\t</#if>\n            <#if query_field_no gt 1>  </#if></a-form-item>\n          <#if query_field_no gt 1>  </#if></a-col>\n\t</#if>\n<#assign query_field_no=query_field_no+1>\n</#if>\n<#if !list_need_dict && po.fieldShowType!='popup' && po.dictField?default(\"\")?trim?length gt 1>\n<#assign list_need_dict=true>\n</#if>\n<#if po.classType=='cat_tree' && po.dictText?default(\"\")?trim?length == 0>\n<#assign list_need_category=true>\n</#if>\n<#if po.classType=='pca'>\n<#assign list_need_pca=true>\n</#if>\n</#list>\n<#-- 结束循环 -->\n<#t>\n<#if query_field_no gt 2>\n          </template>\n</#if>\n<#if query_flag>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left;overflow: hidden;\" class=\"table-page-search-submitButtons\">\n              <a-button type=\"primary\" @click=\"searchQuery\" icon=\"search\">查询</a-button>\n              <a-button type=\"primary\" @click=\"searchReset\" icon=\"reload\" style=\"margin-left: 8px\">重置</a-button>\n              <a @click=\"handleToggleSearch\" style=\"margin-left: 8px\">\n                {{ toggleSearchStatus ? '收起' : '展开' }}\n                <a-icon :type=\"toggleSearchStatus ? 'up' : 'down'\"/>\n              </a>\n            </span>\n          </a-col>\n</#if>\n        </a-row>\n      </a-form>\n    </div>\n    <!-- 查询区域-END -->\n    \n    <!-- 操作按钮区域 -->\n    <div class=\"table-operator\">\n      <a-button @click=\"handleAdd\" type=\"primary\" icon=\"plus\">新增</a-button>\n      <a-button type=\"primary\" icon=\"download\" @click=\"handleExportXls('${tableVo.ftlDescription}')\">导出</a-button>\n      <a-upload name=\"file\" :showUploadList=\"false\" :multiple=\"false\" :headers=\"tokenHeader\" :action=\"importExcelUrl\" @change=\"handleImportExcel\">\n        <a-button type=\"primary\" icon=\"import\">导入</a-button>\n      </a-upload>\n      <!-- 高级查询区域 -->\n      <j-super-query :fieldList=\"superFieldList\" ref=\"superQueryModal\" @handleSuperQuery=\"handleSuperQuery\"></j-super-query>\n      <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n        <a-menu slot=\"overlay\">\n          <a-menu-item key=\"1\" @click=\"batchDel\"><a-icon type=\"delete\"/>删除</a-menu-item>\n        </a-menu>\n        <a-button style=\"margin-left: 8px\"> 批量操作 <a-icon type=\"down\" /></a-button>\n      </a-dropdown>\n    </div>\n\n    <!-- table区域-begin -->\n    <div>\n      <div class=\"ant-alert ant-alert-info\" style=\"margin-bottom: 16px;\">\n        <i class=\"anticon anticon-info-circle ant-alert-icon\"></i> 已选择 <a style=\"font-weight: 600\">{{ selectedRowKeys.length }}</a>项\n        <a style=\"margin-left: 24px\" @click=\"onClearSelected\">清空</a>\n      </div>\n\n      <a-table\n        ref=\"table\"\n        size=\"middle\"\n        bordered\n        rowKey=\"id\"\n        class=\"j-table-force-nowrap\"\n        :scroll=\"{x:true}\"\n        :columns=\"columns\"\n        :dataSource=\"dataSource\"\n        :pagination=\"ipagination\"\n        :loading=\"loading\"\n        :rowSelection=\"{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}\"\n        @change=\"handleTableChange\">\n\n        <template slot=\"htmlSlot\" slot-scope=\"text\">\n          <div v-html=\"text\"></div>\n        </template>\n        <template slot=\"imgSlot\" slot-scope=\"text,record\">\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无图片</span>\n          <img v-else :src=\"getImgView(text)\" :preview=\"record.id\" height=\"25px\" alt=\"\" style=\"max-width:80px;font-size: 12px;font-style: italic;\"/>\n        </template>\n        <template slot=\"fileSlot\" slot-scope=\"text\">\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n          <a-button\n            v-else\n            :ghost=\"true\"\n            type=\"primary\"\n            icon=\"download\"\n            size=\"small\"\n            @click=\"downloadFile(text)\">\n            下载\n          </a-button>\n        </template>\n        <#if list_need_pca>\n        <template slot=\"pcaSlot\" slot-scope=\"text\">\n          <div>{{ getPcaText(text) }}</div>\n        </template>\n        </#if>\n\n        <span slot=\"action\" slot-scope=\"text, record\">\n          <a @click=\"handleEdit(record)\">编辑</a>\n\n          <a-divider type=\"vertical\" />\n          <a-dropdown>\n            <a class=\"ant-dropdown-link\">更多 <a-icon type=\"down\" /></a>\n            <a-menu slot=\"overlay\">\n              <a-menu-item>\n                <a @click=\"handleDetail(record)\">详情</a>\n              </a-menu-item>\n              <#if bpm_flag>\n                <a-menu-item v-if=\"record.bpmStatus === '1'\">\n                <a @click=\"startProcess(record)\">发起流程</a>\n              </a-menu-item>\n              </#if>\n              <a-menu-item>\n                <a-popconfirm title=\"确定删除吗?\" @confirm=\"() => handleDelete(record.id)\">\n                  <a>删除</a>\n                </a-popconfirm>\n              </a-menu-item>\n            </a-menu>\n          </a-dropdown>\n        </span>\n\n      </a-table>\n    </div>\n\n    <${Format.humpToShortbar(entityName)}-modal ref=\"modalForm\" @ok=\"modalFormOk\"/>\n  </a-card>\n</template>\n\n<script>\n\n  import { JeecgListMixin } from '@/mixins/JeecgListMixin'\n  import ${entityName}Modal from './modules/${entityName}Modal'\n  <#if list_need_category>\n  import { loadCategoryData } from '@/api/api'\n  </#if>\n  <#if list_need_dict>\n  import {filterMultiDictText} from '@/components/dict/JDictSelectUtil'\n  </#if>\n  <#if list_need_pca>\n  import Area from '@/components/_util/Area'\n  </#if>\n  import '@/assets/less/TableExpand.less'\n  <#if bpm_flag>\n  import { postAction } from '@/api/manage'\n  </#if>\n\n  export default {\n    name: \"${entityName}List\",\n    mixins:[JeecgListMixin],\n    components: {\n      ${entityName}Modal\n    },\n    data () {\n      return {\n        description: '${tableVo.ftlDescription}管理页面',\n        // 表头\n        columns: [\n          {\n            title: '#',\n            dataIndex: '',\n            key:'rowIndex',\n            width:60,\n            align:\"center\",\n            customRender:function (t,r,index) {\n              return parseInt(index)+1;\n            }\n          },\n    <#assign showColNum=0>\n\t<#list columns as po>\n\t<#if po.isShowList =='Y'>\n\t<#assign showColNum=showColNum+1>\n          {\n            title:'${po.filedComment}',\n            align:\"center\",\n            <#if po.sort=='Y'>\n            sorter: true,\n            </#if>\n            <#if po.classType=='date'>\n            dataIndex: '${po.fieldName}',\n            customRender:function (text) {\n              return !text?\"\":(text.length>10?text.substr(0,10):text)\n            }\n            <#elseif po.fieldDbType=='Blob'>\n            dataIndex: '${po.fieldName}String'\n            <#elseif po.classType=='umeditor'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'htmlSlot'}\n            <#elseif po.classType=='file'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'fileSlot'}\n            <#elseif po.classType=='pca'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'pcaSlot'}\n            <#elseif po.classType=='image'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'imgSlot'}\n            <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user'>\n            dataIndex: '${po.fieldName}_dictText'\n            <#elseif po.classType=='cat_tree'>\n            <#if list_need_category>\n            dataIndex: '${po.fieldName}',\n            customRender: (text) => (text ? filterMultiDictText(this.dictOptions['${po.fieldName}'], text) : '')\n            <#else>\n            dataIndex: '${po.fieldName}',\n            customRender: (text, record) => (text ? record['${po.dictText}'] : '')\n            </#if>\n            <#elseif po.classType=='switch'>\n            dataIndex: '${po.fieldName}',\n            <#if po.dictField != 'is_open'>\n            customRender: (text) => (!text ? \"\" : (text == ${po.dictField}[0] ? \"是\" : \"否\"))\n            <#else>\n            customRender: (text) => (!text ? \"\" : (text == \"Y\" ? \"是\" : \"否\"))\n            </#if>\n\t\t\t<#else>\n            dataIndex: '${po.fieldName}'\n\t\t\t</#if>\n          },\n     </#if>\n     </#list>\n          {\n            title: '操作',\n            dataIndex: 'action',\n            align:\"center\",\n            fixed:\"right\",\n            width:147,\n            scopedSlots: { customRender: 'action' },\n          }\n        ],\n        url: {\n          list: \"/${entityPackagePath}/${entityName?uncap_first}/list\",\n          delete: \"/${entityPackagePath}/${entityName?uncap_first}/delete\",\n          deleteBatch: \"/${entityPackagePath}/${entityName?uncap_first}/deleteBatch\",\n          exportXlsUrl: \"/${entityPackagePath}/${entityName?uncap_first}/exportXls\",\n          importExcelUrl: \"${entityPackagePath}/${entityName?uncap_first}/importExcel\",\n          <#if bpm_flag>startProcess: '/act/process/extActProcess/startMutilProcess'</#if>\n        },\n        <#if bpm_flag>\n        flowCode: 'dev_${tableName}_001',\n        </#if>\n        dictOptions:{},\n        superFieldList:[],\n      }\n    },\n    created() {\n      <#if list_need_pca>\n      this.pcaData = new Area()\n      </#if>\n      this.getSuperFieldList();\n    },\n    computed: {\n      importExcelUrl: function(){\n        <#noparse>return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;</#noparse>\n      }\n    },\n    methods: {\n      <#if list_need_pca>\n      getPcaText(code){\n        return this.pcaData.getText(code);\n      },\n      </#if>\n      initDictConfig(){\n      <#list columns as po>\n      <#if (po.isQuery=='Y' || po.isShowList=='Y') && po.classType!='popup'>\n        <#if po.classType=='cat_tree' && list_need_category==true>\n        loadCategoryData({code:\"${po.dictField?default('')}\"}).then((res) => {\n          if (res.success) {\n            this.$set(this.dictOptions, '${po.fieldName}', res.result)\n          }\n        })\n        </#if>\n      </#if>  \n      </#list>\n      },\n      <#if bpm_flag>\n      startProcess(record){\n        this.$confirm({\n          title:'提示',\n          content:'确认提交流程吗?',\n          onOk:()=>{\n            let params = {\n              flowCode: this.flowCode,\n              id: record.id,\n              formUrl: '${entityPackagePath}/modules/${entityName}Form',\n              formUrlMobile: ''\n            }\n            postAction(this.url.startProcess, params).then(res=>{\n              if(res.success){\n                this.$message.success(res.message);\n                this.loadData();\n                this.onClearSelected();\n              }else{\n                this.$message.warning(res.message);\n              }\n            }).catch((e)=>{\n              this.$message.warning('不识别的请求!');\n            })\n          }\n        })\n      },\n      </#if>\n      getSuperFieldList(){\n        <#include \"/common/utils.ftl\">\n        let fieldList=[];\n         <#list columns as po>\n         fieldList.push(${superQueryFieldList(po)})\n         </#list>\n        this.superFieldList = fieldList\n      }\n    }\n  }\n</script>\n<style scoped>\n  @import '~@assets/less/common.less';\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql",
    "content": "<#include \"/common/sql/menu_insert.ftl\">"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n  <a-spin :spinning=\"confirmLoading\">\n    <j-form-container :disabled=\"formDisabled\">\n      <!-- 主表单区域 -->\n      <a-form-model ref=\"form\" :model=\"model\" :rules=\"validatorRules\" slot=\"detail\">\n        <a-row>\n<#assign form_popup = false>\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign bpm_flag=false>\n<#assign form_span = 24>\n<#if tableVo.fieldRowNum==2>\n    <#assign form_span = 12>\n<#elseif tableVo.fieldRowNum==3>\n    <#assign form_span = 8>\n<#elseif tableVo.fieldRowNum==4>\n    <#assign form_span = 6>\n</#if>\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.isShow =='Y' && po.fieldName != 'id'>\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n          <a-col :span=\"${form_span}\" >\n            <a-form-model-item label=\"${po.filedComment}\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" prop=\"${autoStringSuffixForModel(po)}\">\n\t<#if po.classType =='date'>\n              <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='datetime'>\n              <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='time'>\n               <j-time placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='popup'>\n\t      <#assign form_popup=true>\n              <j-popup\n                v-model=\"model.${po.fieldName}\"\n                 field=\"${po.fieldName}\"\n                org-fields=\"${po.dictField}\"\n                dest-fields=\"${Format.underlineToHump(po.dictText)}\"\n                code=\"${po.dictTable}\"\n                :multi=\"${po.extendParams.popupMulti?c}\"\n                @input=\"popupCallback\"\n                <#if po.readonly=='Y'>disabled</#if>/>\n    <#elseif po.classType =='sel_depart'>\n              <j-select-depart v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if> />\n<#elseif po.classType =='switch'>\n              <j-switch v-model=\"model.${po.fieldName}\" <#if po.dictField != 'is_open'>:options=\"${po.dictField}\"</#if> <#if po.readonly=='Y'>disabled</#if>></j-switch>\n\t<#elseif po.classType =='pca'>\n\t\t      <j-area-linkage type=\"cascader\" v-model=\"model.${po.fieldName}\" placeholder=\"请输入省市区\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='markdown'>\n\t          <j-markdown-editor v-model=\"model.${autoStringSuffixForModel(po)}\" id=\"${po.fieldName}\"></j-markdown-editor>\n    <#elseif po.classType =='password'>\n\t          <a-input-password v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='sel_user'>\n              <j-select-user-by-dep v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='textarea'>\n              <a-textarea v-model=\"model.${autoStringSuffixForModel(po)}\" rows=\"4\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='list' || po.classType=='radio'>\n              <j-dict-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\" dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='list_multi' || po.classType=='checkbox'>\n              <j-multi-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\" dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='sel_search'>\n              <j-search-select-tag v-model=\"model.${po.fieldName}\" dict=\"${form_field_dictCode}\" <#if po.readonly=='Y'>disabled</#if> />\n    <#elseif po.classType=='cat_tree'>\n         <#assign form_cat_tree = true>\n              <j-category-select v-model=\"model.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\" placeholder=\"请选择${po.filedComment}\" <#if po.dictText?default(\"\")?trim?length gt 1>back=\"${dashedToCamel(po.dictText)}\" @change=\"handleCategoryChange\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n    \t<#if po.dictText?default(\"\")?trim?length gt 1>\n    \t<#assign form_cat_back = \"${po.dictText}\">\n    \t</#if>\n\t<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n              <a-input-number v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='file'>\n              <j-upload v-model=\"model.${po.fieldName}\" <#if po.readonly=='Y'>disabled</#if> <#if po.uploadnum??>:number=${po.uploadnum}</#if>></j-upload>\n\t<#elseif po.classType=='image'>\n              <j-image-upload isMultiple <#if po.uploadnum??>:number=${po.uploadnum}</#if> v-model=\"model.${po.fieldName}\" <#if po.readonly=='Y'>disabled</#if>></j-image-upload>\n\t<#elseif po.classType=='umeditor'>\n              <j-editor v-model=\"model.${autoStringSuffixForModel(po)}\" <#if po.readonly=='Y'>disabled</#if>/>\n    <#elseif po.fieldDbType=='Blob'>\n              <a-input v-model=\"model.${autoStringSuffixForModel(po)}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>></a-input>\n\t\t<#elseif po.classType == 'sel_tree'>\n  \t          <j-tree-select\n                ref=\"treeSelect\"\n                placeholder=\"请选择${po.filedComment}\"\n                v-model=\"model.${po.fieldName}\"\n                <#if po.dictText??>\n                <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n                dict=\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\"\n                <#elseif po.dictText?split(',')[1]??>\n                pidField=\"${po.dictText?split(',')[1]}\"\n                <#elseif po.dictText?split(',')[3]??>\n                hasChildField=\"${po.dictText?split(',')[3]}\"\n                </#if>\n                </#if>\n                pidValue=\"${po.dictField}\"\n                <#if po.readonly=='Y'>disabled</#if>>\n              </j-tree-select>\n\t<#else>\n              <a-input v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>></a-input>\n    </#if>\n            </a-form-model-item>\n          </a-col>\n</#if>\n</#list>\n        </a-row>\n      </a-form-model>\n    </j-form-container>\n      <!-- 子表单区域 -->\n    <a-tabs v-model=\"activeKey\" @change=\"handleChangeTabs\">\n<#list subTables as sub><#rt/>\n  <#if sub.foreignRelationType =='1'>\n      <a-tab-pane tab=\"${sub.ftlDescription}\" :key=\"refKeys[${sub_index}]\" :forceRender=\"true\">\n        <${Format.humpToShortbar(sub.entityName)}-form ref=\"${sub.entityName?uncap_first}Form\" @validateError=\"validateError\" :disabled=\"formDisabled\"></${Format.humpToShortbar(sub.entityName)}-form>\n      </a-tab-pane>\n      \n  <#else>\n      <a-tab-pane tab=\"${sub.ftlDescription}\" :key=\"refKeys[${sub_index}]\" :forceRender=\"true\">\n        <j-editable-table\n          :ref=\"refKeys[${sub_index}]\"\n          :loading=\"${sub.entityName?uncap_first}Table.loading\"\n          :columns=\"${sub.entityName?uncap_first}Table.columns\"\n          :dataSource=\"${sub.entityName?uncap_first}Table.dataSource\"\n          :maxHeight=\"300\"\n          :disabled=\"formDisabled\"\n          :rowNumber=\"true\"\n          :rowSelection=\"true\"\n          :actionButton=\"true\"/>\n      </a-tab-pane>\n  </#if>\n</#list>\n    </a-tabs>\n    <#if bpm_flag>\n    <a-row v-if=\"showFlowSubmitButton\" style=\"text-align: center;width: 100%;margin-top: 16px;\"><a-button icon=\"check\" style=\"width: 126px\" type=\"primary\" @click=\"handleOk\">提 交</a-button></a-row>\n     </#if>\n  </a-spin>\n</template>\n\n<script>\n\n  import { getAction } from '@/api/manage'\n  import { FormTypes,getRefPromise,VALIDATE_NO_PASSED } from '@/utils/JEditableTableUtil'\n  import { JEditableTableModelMixin } from '@/mixins/JEditableTableModelMixin'\n  import { validateDuplicateValue } from '@/utils/util'\n  <#list subTables as sub>\n  <#if sub.foreignRelationType =='1'>\n  import ${sub.entityName}Form from './${sub.entityName}Form.vue'\n  </#if>\n  </#list>\n\n  export default {\n    name: '${entityName}Form',\n    mixins: [JEditableTableModelMixin],\n    components: {\n    <#list subTables as sub>\n    <#if sub.foreignRelationType =='1'>\n      ${sub.entityName}Form,\n    </#if>\n    </#list>\n    },\n    data() {\n      return {\n        labelCol: {\n          xs: { span: 24 },\n          sm: { span: 5 },\n        },\n        wrapperCol: {\n          xs: { span: 24 },\n          sm: { span: 16 },\n        },\n        model:{\n        <#include \"/common/init/initValue.ftl\">\n        },\n        // 新增时子表默认添加几行空数据\n        addDefaultRowNum: 1,\n        <#include \"/common/validatorRulesTemplate/main.ftl\">\n        refKeys: [<#list subTables as sub>'${sub.entityName?uncap_first}', </#list>],\n        <#assign hasOne2Many = false>\n        tableKeys:[<#list subTables as sub><#if sub.foreignRelationType =='0'>'${sub.entityName?uncap_first}', <#assign hasOne2Many = true></#if></#list>],\n        activeKey: '${subTables[0].entityName?uncap_first}',\n<#list subTables as sub><#rt/>\n        // ${sub.ftlDescription}\n        ${sub.entityName?uncap_first}Table: {\n          loading: false,\n          dataSource: [],\n          columns: [\n<#if sub.foreignRelationType =='0'>\n<#assign popupBackFields = \"\">\n\n<#-- 循环子表的列 开始 -->\n<#list sub.colums as col><#rt/>\n<#if col.isShow =='Y'>\n    <#if col.filedComment !='外键' >\n            {\n              title: '${col.filedComment}',\n              key: '${autoStringSuffixForModel(col)}',\n      <#if col.classType =='date'>\n              type: FormTypes.date,\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif col.classType =='datetime'>\n              type: FormTypes.datetime,\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif \"int,decimal,double,\"?contains(col.classType)>\n              type: FormTypes.inputNumber,\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif col.classType =='list' || col.classType =='radio'>\n              type: FormTypes.select,\n              <#if col.dictTable?default(\"\")?trim?length gt 1>\n              dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n              <#else>\n              dictCode:\"${col.dictField}\",\n              </#if>\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif col.classType =='list_multi' || col.classType =='checkbox'>\n              type: FormTypes.list_multi,\n              <#if col.dictTable?default(\"\")?trim?length gt 1>\n              dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n              <#else>\n              dictCode:\"${col.dictField}\",\n              </#if>\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif col.classType =='switch'>\n              type: FormTypes.checkbox,\n              <#if col.dictField == 'is_open'>\n              customValue: ['Y', 'N'],\n              <#else>\n              customValue: ${col.dictField},\n              </#if>\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif col.classType =='sel_search'>\n              type: FormTypes.sel_search,\n              <#if col.dictTable?default(\"\")?trim?length gt 1>\n              dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n              <#else>\n              dictCode:\"${col.dictField}\",\n              </#if>\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n        <#elseif col.classType =='sel_depart'>\n              type: FormTypes.sel_depart,\n              <#if col.extendParams.multiSelect?default(true) == false>\n              multi: false,\n              </#if>\n              <#if col.extendParams.store?default(\"\")?trim?length gt 1>\n              store: \"${col.extendParams.store}\",\n              </#if>\n              <#if col.extendParams.text?default(\"\")?trim?length gt 1>\n              text: \"${col.extendParams.text}\",\n              </#if>\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n        <#elseif col.classType =='sel_user'>\n              type: FormTypes.sel_user,\n              <#if col.extendParams.multiSelect?default(true) == false>\n              multi: false,\n              </#if>\n              <#if col.extendParams.store?default(\"\")?trim?length gt 1>\n              store: \"${col.extendParams.store}\",\n              </#if>\n              <#if col.extendParams.text?default(\"\")?trim?length gt 1>\n              text: \"${col.extendParams.text}\",\n              </#if>\n              <#if col.readonly=='Y'>\n              disabled: true,\n              </#if>\n      <#elseif col.classType =='image'>\n              type: FormTypes.image,\n              token:true,\n              responseName:\"message\",\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n              <#if col.uploadnum??>\n              number: ${col.uploadnum},\n              </#if>\n      <#elseif col.classType =='file'>\n              type: FormTypes.file,\n              token:true,\n              responseName:\"message\",\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n              <#if col.uploadnum??>\n              number: ${col.uploadnum},\n              </#if>\n      <#elseif col.classType =='popup'>\n        <#if popupBackFields?length gt 0>\n            <#assign popupBackFields = \"${popupBackFields}\"+\",\"+\"${col.dictText}\">\n        <#else>\n            <#assign popupBackFields = \"${col.dictText}\">\n        </#if>\n              type: FormTypes.popup,\n              popupCode:\"${col.dictTable}\",\n              destFields:\"${Format.underlineToHump(col.dictText)}\",\n              orgFields:\"${col.dictField}\",\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif col.fieldDbType=='int' || col.fieldDbType=='long' || col.fieldDbType=='double' || col.fieldDbType=='BigDecimal'>\n              type: FormTypes.inputNumber,\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#else>\n              type: FormTypes.input,\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      </#if>\n      <#if col.classType =='list_multi' || col.classType =='checkbox'>\n              width:\"250px\",\n      <#else>\n              width:\"200px\",\n      </#if>\n      <#if col.classType =='file'>\n              placeholder: '请选择文件',\n      <#else>\n              placeholder: '请输入${'$'}{title}',\n      </#if>\n      <#if col.defaultVal??>\n        <#if col.fieldDbType==\"BigDecimal\" || col.fieldDbType==\"double\" || col.fieldDbType==\"int\">\n              defaultValue:${col.defaultVal},\n              <#else>\n              defaultValue:\"${col.defaultVal}\",\n        </#if>\n      <#else>\n              defaultValue:'',\n      </#if>\n      <#-- 子表的校验 -->\n      <#assign subFieldValidType = col.fieldValidType!''>\n      <#-- 非空校验 -->\n      <#if col.nullable == 'N' || subFieldValidType == '*'>\n              validateRules: [{ required: true, message: '${'$'}{title}不能为空' }],\n      <#-- 其他情况下，只要有值就被认为是正则校验 -->\n      <#elseif subFieldValidType?length gt 0>\n        <#assign subMessage = '格式不正确'>\n        <#if subFieldValidType == 'only' >\n          <#assign subMessage = '不能重复'>\n        </#if>\n              validateRules: [{ pattern: \"${subFieldValidType}\", message: \"${'$'}{title}${subMessage}\" }],\n      </#if>\n            },\n    </#if>\n</#if>\n</#list>\n<#-- 循环子表的列 结束 -->\n\n<#-- 处理popup的隐藏列 -->\n<#if popupBackFields?length gt 0>\n<#list popupBackFields?split(\",\") as item>\n<#if item?length gt 0>\n<#assign tempItemFlag = true>\n\n<#list sub.colums as col>\n<#if col.isShow =='Y' && col.fieldName == item>\n<#assign tempItemFlag = false>\n</#if>\n</#list>\n<#if tempItemFlag>\n            {\n              title: '${item}',\n              key: '${item}',\n              type:\"hidden\"\n            },\n</#if>\n</#if>\n</#list>\n</#if>\n</#if>\n          ]\n        },\n</#list>\n        url: {\n          add: \"/${entityPackagePath}/${entityName?uncap_first}/add\",\n          edit: \"/${entityPackagePath}/${entityName?uncap_first}/edit\",\n          queryById: \"/${entityPackagePath}/${entityName?uncap_first}/queryById\",\n<#list subTables as sub><#rt/>\n          ${sub.entityName?uncap_first}: {\n            list: '/${entityPackagePath}/${entityName?uncap_first}/query${sub.entityName}ByMainId'\n          },\n</#list>\n        }\n      }\n    },\n    props: {\n    <#if bpm_flag>\n      //流程表单data\n      formData: {\n        type: Object,\n        default: () => ({}),\n        required: false\n      },\n      //表单模式：false流程表单 true普通表单\n      formBpm: {\n        type: Boolean,\n        default: false,\n        required: false\n      },\n       </#if>\n      //表单禁用\n      disabled: {\n        type: Boolean,\n        default: false,\n        required: false\n      }\n    },\n    computed: {\n      formDisabled(){\n       <#if bpm_flag>\n        if(this.formBpm===true){\n          if(this.formData.disabled===false){\n            return false\n          }\n          return true\n        }\n         </#if>\n        return this.disabled\n      },\n       <#if bpm_flag>\n      showFlowSubmitButton(){\n        if(this.formBpm===true){\n          if(this.formData.disabled===false){\n            return true\n          }\n        }\n        return false\n      }\n        </#if>\n    },\n    created () {\n     <#if bpm_flag>\n      //如果是流程中表单，则需要加载流程表单data\n      this.showFlowData();\n       </#if>\n    },\n    methods: {\n      addBefore(){\n<#list subTables as sub><#rt/>\n  <#if sub.foreignRelationType =='1'>\n        this.$refs.${sub.entityName?uncap_first}Form.clearFormData()\n  <#else>\n        this.${sub.entityName?uncap_first}Table.dataSource=[]\n  </#if>\n</#list>\n      },\n      getAllTable() {\n        <#if hasOne2Many==true>\n        let values = this.tableKeys.map(key => getRefPromise(this, key))\n        return Promise.all(values)\n        <#else>\n        return new Promise(resolve => {\n          resolve([]);\n        })\n        </#if>\n      },\n      /** 调用完edit()方法之后会自动调用此方法 */\n      editAfter() {\n        this.$nextTick(() => {\n<#list subTables as sub><#rt/>\n<#if sub.foreignRelationType =='1'>\n          this.$refs.${sub.entityName?uncap_first}Form.initFormData(this.url.${sub.entityName?uncap_first}.list,this.model.id)\n</#if>\n</#list>         \n        })\n        // 加载子表数据\n        if (this.model.id) {\n          let params = { id: this.model.id }\n<#list subTables as sub><#rt/>\n<#if sub.foreignRelationType =='0'>\n          this.requestSubTableData(this.url.${sub.entityName?uncap_first}.list, params, this.${sub.entityName?uncap_first}Table)\n</#if>\n</#list>\n        }\n      },\n      //校验所有一对一子表表单\n      validateSubForm(allValues){\n          return new Promise((resolve,reject)=>{\n            Promise.all([\n        <#list subTables as sub><#rt/>\n          <#if sub.foreignRelationType =='1'>\n                this.$refs.${sub.entityName?uncap_first}Form.validate(${sub_index}),\n          </#if>\n        </#list>\n            ]).then(() => {\n              resolve(allValues)\n            }).catch(e => {\n              if (e.error === VALIDATE_NO_PASSED) {\n                // 如果有未通过表单验证的子表，就自动跳转到它所在的tab\n                this.activeKey = e.index == null ? this.activeKey : this.refKeys[e.index]\n              } else {\n                console.error(e)\n              }\n            })\n          })\n      },\n      /** 整理成formData */\n      classifyIntoFormData(allValues) {\n        let main = Object.assign(this.model, allValues.formValue)\n        return {\n          ...main, // 展开\n<#assign subManyIndex = 0>\n<#list subTables as sub><#rt/>\n<#if sub.foreignRelationType =='0'>\n          ${sub.entityName?uncap_first}List: allValues.tablesValue[${subManyIndex}].values,\n          <#assign subManyIndex = subManyIndex+1>\n<#else>\n          ${sub.entityName?uncap_first}List: this.$refs.${sub.entityName?uncap_first}Form.getFormData(),\n</#if>\n</#list>\n        }\n      },\n        <#if bpm_flag>\n      //渲染流程表单数据\n      showFlowData(){\n        if(this.formBpm === true){\n          let params = {id:this.formData.dataId};\n          getAction(this.url.queryById,params).then((res)=>{\n            if(res.success){\n              this.edit (res.result);\n            }\n          })\n        }\n      },\n        </#if>\n      validateError(msg){\n        this.$message.error(msg)\n      },\n    <#if form_popup>\n     popupCallback(value,row){\n       this.model = Object.assign(this.model, row);\n     },\n    </#if>\n   <#if form_cat_tree>\n     handleCategoryChange(value,backObj){\n      this.model = Object.assign(this.model, backObj);\n      }\n   </#if>\n\n    }\n  }\n</script>\n\n<style scoped>\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n  <j-modal\n    :title=\"title\"\n    :width=\"1200\"\n    :visible=\"visible\"\n    :maskClosable=\"false\"\n    switchFullscreen\n    @ok=\"handleOk\"\n    :okButtonProps=\"{ class:{'jee-hidden': disableSubmit} }\"\n    @cancel=\"handleCancel\">\n    <${Format.humpToShortbar(entityName)}-form ref=\"realForm\" @ok=\"submitCallback\" :disabled=\"disableSubmit\"/>\n  </j-modal>\n</template>\n\n<script>\n\n  import ${entityName}Form from './${entityName}Form'\n\n  export default {\n    name: '${entityName}Modal',\n    components: {\n      ${entityName}Form\n    },\n    data() {\n      return {\n        title:'',\n        width:800,\n        visible: false,\n        disableSubmit: false\n      }\n    },\n    methods:{\n      add () {\n        this.visible=true\n        this.$nextTick(()=>{\n          this.$refs.realForm.add();\n        })\n      },\n      edit (record) {\n        this.visible=true\n        this.$nextTick(()=>{\n          this.$refs.realForm.edit(record);\n        })\n      },\n      close () {\n        this.$emit('close');\n        this.visible = false;\n      },\n      handleOk () {\n        this.$refs.realForm.handleOk();\n      },\n      submitCallback(){\n        this.$emit('ok');\n        this.visible = false;\n      },\n      handleCancel () {\n        this.close()\n      }\n    }\n  }\n</script>\n\n<style scoped>\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<#list subTables as sub>\n<#if sub.foreignRelationType=='1'>\n#segment#${sub.entityName}Form.vue\n<template>\n  <j-form-container :disabled=\"disabled\">\n      <a-form-model ref=\"form\" :model=\"model\" :rules=\"validatorRules\" slot=\"detail\">\n        <a-row>\n<#assign form_popup = false>\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign form_span = 24>\n<#if tableVo.fieldRowNum == 2>\n  <#assign form_span = 12>\n<#elseif tableVo.fieldRowNum==3>\n  <#assign form_span = 8>\n<#elseif tableVo.fieldRowNum==4>\n  <#assign form_span = 6>\n</#if>\n<#list sub.colums as po>\n<#if po.isShow =='Y' && po.fieldName != 'id'>\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n          <a-col :span=\"${form_span}\">\n            <a-form-model-item label=\"${po.filedComment}\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" prop=\"${autoStringSuffixForModel(po)}\">\n\t<#if po.classType =='date'>\n              <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\"/>\n\t<#elseif po.classType =='datetime'>\n              <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" style=\"width: 100%\"/>\n\t<#elseif po.classType =='time'>\n              <j-time placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='popup'>\n\t      <#assign form_popup=true>\n              <j-popup\n                v-model=\"model.${po.fieldName}\"\n                field=\"${po.fieldName}\"\n                org-fields=\"${po.dictField}\"\n                dest-fields=\"${Format.underlineToHump(po.dictText)}\"\n                code=\"${po.dictTable}\"\n                :multi=\"${po.extendParams.popupMulti?c}\"\n                @input=\"popupCallback\"/>\n    <#elseif po.classType =='sel_depart'>\n              <j-select-depart v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if> />\n<#elseif po.classType =='switch'>\n              <j-switch v-model=\"model.${po.fieldName}\" <#if po.dictField!= 'is_open'>:options=\"${po.dictField}\"</#if>></j-switch>\n\t<#elseif po.classType =='pca'>\n\t\t      <j-area-linkage type=\"cascader\" v-model=\"model.${po.fieldName}\" placeholder=\"请输入省市区\"/>\n\t<#elseif po.classType =='markdown'>\n\t          <j-markdown-editor v-model=\"model.${autoStringSuffixForModel(po)}\" id=\"${po.fieldName}\"></j-markdown-editor>\n    <#elseif po.classType =='password'>\n\t          <a-input-password v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\"/>\n\t<#elseif po.classType =='sel_user'>\n              <j-select-user-by-dep v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='textarea'>\n              <a-textarea v-model=\"model.${autoStringSuffixForModel(po)}\"  rows=\"4\" placeholder=\"请输入${po.filedComment}\"/>\n\t<#elseif po.classType=='list' || po.classType=='radio'>\n              <j-dict-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\" dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\"/>\n\t<#elseif po.classType=='list_multi' || po.classType=='checkbox'>\n              <j-multi-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\" dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\"/>\n\t<#elseif po.classType=='sel_search'>\n              <j-search-select-tag v-model=\"model.${po.fieldName}\" dict=\"${form_field_dictCode}\" />\n    <#elseif po.classType=='cat_tree'>\n    \t<#assign form_cat_tree = true>\n              <j-category-select v-model=\"model.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\" placeholder=\"请选择${po.filedComment}\" <#if po.dictText?default(\"\")?trim?length gt 1>back=\"${dashedToCamel(po.dictText)}\" @change=\"handleCategoryChange\"</#if>/>\n    \t<#if po.dictText?default(\"\")?trim?length gt 1>\n    \t<#assign form_cat_back = \"${po.dictText}\">\n    \t</#if>\n\t<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n              <a-input-number v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" style=\"width: 100%\"/>\n\t<#elseif po.classType=='file'>\n              <j-upload v-model=\"model.${po.fieldName}\"></j-upload>\n\t<#elseif po.classType=='image'>\n              <j-image-upload isMultiple v-model=\"model.${po.fieldName}\"></j-image-upload>\n\t<#elseif po.classType=='umeditor'>\n              <j-editor v-model=\"model.${autoStringSuffixForModel(po)}\"/>\n    <#elseif po.fieldDbType=='Blob'>\n              <a-input v-model=\"model.${autoStringSuffixForModel(po)}\" placeholder=\"请输入${po.filedComment}\"></a-input>\n\t<#else>\n              <a-input v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\"></a-input>\n    </#if>\n            </a-form-model-item>\n          </a-col>\n</#if>\n</#list>\n        </a-row>\n      </a-form-model>\n  </j-form-container>\n</template>\n<script>\n  import { getAction } from '@/api/manage'\n  import { validateDuplicateValue } from '@/utils/util'\n import { VALIDATE_NO_PASSED } from '@/utils/JEditableTableUtil'\n  export default {\n    name: '${sub.entityName}Form',\n    components: {\n    },\n    props:{\n      disabled: {\n        type: Boolean,\n        default: false,\n        required: false\n      }\n    },\n    data () {\n      return {\n        model:{\n         <#include \"/common/init/initValueSub.ftl\">\n        },\n        labelCol: {\n          xs: { span: 24 },\n          sm: { span: 5 },\n        },\n        wrapperCol: {\n          xs: { span: 24 },\n          sm: { span: 16 },\n        },\n        <#include \"/common/validatorRulesTemplate/sub.ftl\">\n        confirmLoading: false,\n      }\n    },\n     created () {\n      //备份model原始值\n      this.modelDefault = JSON.parse(JSON.stringify(this.model));\n    },\n    methods:{\n      initFormData(url,id){\n        this.clearFormData()\n        if(!id){\n          this.edit(this.modelDefault)\n        }else{\n          getAction(url,{id:id}).then(res=>{\n            if(res.success){\n              let records = res.result\n              if(records && records.length>0){\n                this.edit(records[0])\n              }\n            }\n          })\n        }\n      },\n      edit(record){\n        this.model = Object.assign({}, record)\n        console.log(\"${sub.entityName}Form-edit\",this.model);\n      },\n      getFormData(){\n        let formdata_arr = []\n        this.$refs.form.validate(valid => {\n          if (valid) {\n            let isNullObj = true\n            Object.keys(this.model).forEach(key=>{\n              if(this.model[key]){\n                isNullObj = false\n              }\n            })\n            if(!isNullObj){\n              formdata_arr.push(this.model)\n            }\n          }else{\n            this.$emit(\"validateError\",\"${sub.ftlDescription}表单校验未通过\");\n          }\n        })\n        return formdata_arr;\n      },\n      validate(index){\n          return new Promise((resolve, reject) => {\n            // 验证主表表单\n           this.$refs.form.validate(valid => {\n              !valid ? reject({ error: VALIDATE_NO_PASSED ,index}) : resolve()\n            })\n          }).then(values => {\n            return Promise.resolve()\n          }).catch(error => {\n            return Promise.reject(error)\n          })\n        },\n       <#if form_popup>\n      popupCallback(value,row){\n        this.model = Object.assign(this.model, row);\n      },\n       </#if>\n      clearFormData(){\n        this.$refs.form.clearValidate()\n      },\n      <#if form_cat_tree>\n      handleCategoryChange(value,backObj){\n        this.model = Object.assign(backObj,this.model);\n      }\n      </#if>\n    }\n  }\n</script>\n</#if>\n</#list>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai",
    "content": "package ${bussiPackage}.${entityPackage}.controller;\n\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\nimport java.io.IOException;\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLDecoder;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.common.system.vo.SelectTreeModel;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\n\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport org.springframework.web.servlet.ModelAndView;\nimport com.alibaba.fastjson.JSON;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\n\n /**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n<#assign pidFieldName = \"\">\n<#list originalColumns as po>\n<#if po.fieldDbName == tableVo.extendParams.pidField>\n<#assign pidFieldName = po.fieldName>\n</#if>\n</#list>\n<#assign enhanceJavaList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.enhanceJavaList??>\n  <#assign enhanceJavaList = tableVo.extendParams.enhanceJavaList?filter(enhance -> enhance??)>\n</#if>\n@Tag(name=\"${tableVo.ftlDescription}\")\n@RestController\n@RequestMapping(\"/${entityPackagePath}/${entityName?uncap_first}\")\n@Slf4j\npublic class ${entityName}Controller extends JeecgController<${entityName}, I${entityName}Service>{\n\t@Autowired\n\tprivate I${entityName}Service ${entityName?uncap_first}Service;\n\n\t/**\n\t * 分页列表查询\n\t *\n\t * @param ${entityName?uncap_first}\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t//@AutoLog(value = \"${tableVo.ftlDescription}-分页列表查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-分页列表查询\")\n\t@GetMapping(value = \"/rootList\")\n\tpublic Result<IPage<${entityName}>> queryPageList(${entityName} ${entityName?uncap_first},\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t   HttpServletRequest req) {\n\t\t<#if enhanceJavaList?size gt 0>\n         <#list enhanceJavaList as enhanceJava>\n         <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'>\n               //TODO 查询前触发的方法，代码生成后，请手工实现增强类逻辑;\n               //${entityName?uncap_first}Service.beforeQuery()\n         </#if>\n         </#list>\n        </#if>\n\t\tString hasQuery = req.getParameter(\"hasQuery\");\n        if(hasQuery != null && \"true\".equals(hasQuery)){\n            QueryWrapper<${entityName}> queryWrapper =  QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap());\n            List<${entityName}> list = ${entityName?uncap_first}Service.queryTreeListNoPage(queryWrapper);\n            IPage<${entityName}> pageList = new Page<>(1, 10, list.size());\n            pageList.setRecords(list);\n            return Result.OK(pageList);\n        }else{\n            String parentId = ${entityName?uncap_first}.get${pidFieldName?cap_first}();\n            if (oConvertUtils.isEmpty(parentId)) {\n                parentId = \"0\";\n            }\n            ${entityName?uncap_first}.set${pidFieldName?cap_first}(null);\n            QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap());\n            // 使用 eq 防止模糊查询\n            queryWrapper.eq(\"${Format.humpToUnderline(pidFieldName)}\", parentId);\n            Page<${entityName}> page = new Page<${entityName}>(pageNo, pageSize);\n            IPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper);\n        <#if enhanceJavaList?size gt 0>\n         <#list enhanceJavaList as enhanceJava>\n         <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'>\n                 //TODO 查询后触发的方法，代码生成后，请手工实现增强类逻辑;\n                 //${entityName?uncap_first}Service.afterQuery()\n         </#if>\n         </#list>\n        </#if>\n            return Result.OK(pageList);\n        }\n\t}\n\n\t /**\n\t  * 【vue3专用】加载节点的子数据\n\t  *\n\t  * @param pid\n\t  * @return\n\t  */\n\t @RequestMapping(value = \"/loadTreeChildren\", method = RequestMethod.GET)\n\t public Result<List<SelectTreeModel>> loadTreeChildren(@RequestParam(name = \"pid\") String pid) {\n\t\t Result<List<SelectTreeModel>> result = new Result<>();\n\t\t try {\n\t\t\t List<SelectTreeModel> ls = ${entityName?uncap_first}Service.queryListByPid(pid);\n\t\t\t result.setResult(ls);\n\t\t\t result.setSuccess(true);\n\t\t } catch (Exception e) {\n\t\t\t e.printStackTrace();\n\t\t\t result.setMessage(e.getMessage());\n\t\t\t result.setSuccess(false);\n\t\t }\n\t\t return result;\n\t }\n\n\t /**\n\t  * 【vue3专用】加载一级节点/如果是同步 则所有数据\n\t  *\n\t  * @param async\n\t  * @param pcode\n\t  * @return\n\t  */\n\t @RequestMapping(value = \"/loadTreeRoot\", method = RequestMethod.GET)\n\t public Result<List<SelectTreeModel>> loadTreeRoot(@RequestParam(name = \"async\") Boolean async, @RequestParam(name = \"pcode\") String pcode) {\n\t\t Result<List<SelectTreeModel>> result = new Result<>();\n\t\t try {\n\t\t\t List<SelectTreeModel> ls = ${entityName?uncap_first}Service.queryListByCode(pcode);\n\t\t\t if (!async) {\n\t\t\t\t loadAllChildren(ls);\n\t\t\t }\n\t\t\t result.setResult(ls);\n\t\t\t result.setSuccess(true);\n\t\t } catch (Exception e) {\n\t\t\t e.printStackTrace();\n\t\t\t result.setMessage(e.getMessage());\n\t\t\t result.setSuccess(false);\n\t\t }\n\t\t return result;\n\t }\n\n\t /**\n\t  * 【vue3专用】递归求子节点 同步加载用到\n\t  *\n\t  * @param ls\n\t  */\n\t private void loadAllChildren(List<SelectTreeModel> ls) {\n\t\t for (SelectTreeModel tsm : ls) {\n\t\t\t List<SelectTreeModel> temp = ${entityName?uncap_first}Service.queryListByPid(tsm.getKey());\n\t\t\t if (temp != null && temp.size() > 0) {\n\t\t\t\t tsm.setChildren(temp);\n\t\t\t\t loadAllChildren(temp);\n\t\t\t }\n\t\t }\n\t }\n\n\t /**\n      * 获取子数据\n      * @param ${entityName?uncap_first}\n      * @param req\n      * @return\n      */\n\t//@AutoLog(value = \"${tableVo.ftlDescription}-获取子数据\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-获取子数据\")\n\t@GetMapping(value = \"/childList\")\n\tpublic Result<IPage<${entityName}>> queryPageList(${entityName} ${entityName?uncap_first},HttpServletRequest req) {\n\t\tQueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap());\n\t\tList<${entityName}> list = ${entityName?uncap_first}Service.list(queryWrapper);\n\t\tIPage<${entityName}> pageList = new Page<>(1, 10, list.size());\n        pageList.setRecords(list);\n\t\treturn Result.OK(pageList);\n\t}\n\n    /**\n      * 批量查询子节点\n      * @param parentIds 父ID（多个采用半角逗号分割）\n      * @return 返回 IPage\n      * @param parentIds\n      * @return\n      */\n\t//@AutoLog(value = \"${tableVo.ftlDescription}-批量获取子数据\")\n    @Operation(summary=\"${tableVo.ftlDescription}-批量获取子数据\")\n    @GetMapping(\"/getChildListBatch\")\n    public Result getChildListBatch(@RequestParam(\"parentIds\") String parentIds) {\n        try {\n            QueryWrapper<${entityName}> queryWrapper = new QueryWrapper<>();\n            List<String> parentIdList = Arrays.asList(parentIds.split(\",\"));\n            queryWrapper.in(\"${Format.humpToUnderline(pidFieldName)}\", parentIdList);\n            List<${entityName}> list = ${entityName?uncap_first}Service.list(queryWrapper);\n            IPage<${entityName}> pageList = new Page<>(1, 10, list.size());\n            pageList.setRecords(list);\n            return Result.OK(pageList);\n        } catch (Exception e) {\n            log.error(e.getMessage(), e);\n            return Result.error(\"批量查询子节点失败：\" + e.getMessage());\n        }\n    }\n\t\n\t/**\n\t *   添加\n\t *\n\t * @param ${entityName?uncap_first}\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-添加\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-添加\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:add\")\n\t@PostMapping(value = \"/add\")\n\tpublic Result<String> add(@RequestBody ${entityName} ${entityName?uncap_first}) {\n\t\t<#if enhanceJavaList?size gt 0>\n          <#list enhanceJavaList as enhanceJava>\n          <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='start'  && enhanceJava.activeStatus=='1'>\n              //TODO 新增前的处理方法，代码生成后，请手工实现增强类逻辑;\n             //${entityName?uncap_first}Service.beforeAdd()\n          </#if>\n          </#list>\n        </#if>\n\t\t${entityName?uncap_first}Service.add${entityName}(${entityName?uncap_first});\n\t\t<#if enhanceJavaList?size gt 0>\n          <#list enhanceJavaList as enhanceJava>\n          <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='end'  && enhanceJava.activeStatus=='1'>\n              //TODO 新增后的处理方法，代码生成后，请手工实现增强类逻辑;\n              //${entityName?uncap_first}Service.afterAdd()\n           </#if>\n          </#list>\n        </#if>\n\t\treturn Result.OK(\"添加成功！\");\n\t}\n\t\n\t/**\n\t *  编辑\n\t *\n\t * @param ${entityName?uncap_first}\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-编辑\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-编辑\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:edit\")\n\t@RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n\tpublic Result<String> edit(@RequestBody ${entityName} ${entityName?uncap_first}) {\n<#if enhanceJavaList?size gt 0>\n  <#list enhanceJavaList as enhanceJava>\n  <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='start'  && enhanceJava.activeStatus=='1'>\n       //TODO 编辑前，代码生成后，请手工实现增强类逻辑;\n       //${entityName?uncap_first}Service.beforeEdit()\n  </#if>\n  </#list>\n</#if>\n\t\t${entityName?uncap_first}Service.update${entityName}(${entityName?uncap_first});\n<#if enhanceJavaList?size gt 0>\n  <#list enhanceJavaList as enhanceJava>\n  <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'>\n      //TODO 编辑后，代码生成后，请手工实现增强类逻辑;\n      //${entityName?uncap_first}Service.afterEdit()\n  </#if>\n  </#list>\n</#if>\n\t\treturn Result.OK(\"编辑成功!\");\n\t}\n\t\n\t/**\n\t *   通过id删除\n\t *\n\t * @param id\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-通过id删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id删除\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:delete\")\n\t@DeleteMapping(value = \"/delete\")\n\tpublic Result<String> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${entityName?uncap_first}Service.delete${entityName}(id);\n\t\treturn Result.OK(\"删除成功!\");\n\t}\n\t\n\t/**\n\t *  批量删除\n\t *\n\t * @param ids\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-批量删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-批量删除\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:deleteBatch\")\n\t@DeleteMapping(value = \"/deleteBatch\")\n\tpublic Result<String> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tthis.${entityName?uncap_first}Service.removeByIds(Arrays.asList(ids.split(\",\")));\n\t\treturn Result.OK(\"批量删除成功！\");\n\t}\n\t\n\t/**\n\t * 通过id查询\n\t *\n\t * @param id\n\t * @return\n\t */\n\t//@AutoLog(value = \"${tableVo.ftlDescription}-通过id查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id查询\")\n\t@GetMapping(value = \"/queryById\")\n\tpublic Result<${entityName}> queryById(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${entityName} ${entityName?uncap_first} = ${entityName?uncap_first}Service.getById(id);\n\t\tif(${entityName?uncap_first}==null) {\n\t\t\treturn Result.error(\"未找到对应数据\");\n\t\t}\n\t\treturn Result.OK(${entityName?uncap_first});\n\t}\n\n    /**\n    * 导出excel\n    *\n    * @param request\n    * @param ${entityName?uncap_first}\n    */\n    @RequiresPermissions(\"${entityPackage}:${tableName}:exportXls\")\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) {\n<#if enhanceJavaList?size gt 0>\n <#list enhanceJavaList as enhanceJava>\n <#if enhanceJava.buttonCode=='export' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'>\n      //TODO 导出前，代码生成后，请手工实现增强类逻辑;\n      //${entityName?uncap_first}Service.beforeExport()\n </#if>\n </#list>\n</#if>\n\t\treturn super.exportXls(request, ${entityName?uncap_first}, ${entityName}.class, \"${tableVo.ftlDescription}\");\n    }\n\n    /**\n      * 通过excel导入数据\n    *\n    * @param request\n    * @param response\n    * @return\n    */\n    @RequiresPermissions(\"${entityPackage}:${tableName}:importExcel\")\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n<#if enhanceJavaList?size gt 0>\n <#list enhanceJavaList as enhanceJava>\n <#if enhanceJava.buttonCode=='import' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'>\n      //TODO 导入前，代码生成后，请手工实现增强类逻辑;\n      //${entityName?uncap_first}Service.beforeImport()\n </#if>\n </#list>\n</#if>\n\t\treturn super.importExcel(request, response, ${entityName}.class);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai",
    "content": "<#include \"/common/utils.ftl\">\npackage ${bussiPackage}.${entityPackage}.entity;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport java.math.BigDecimal;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport org.jeecg.common.constant.ProvinceCityArea;\nimport org.jeecg.common.util.SpringContextUtils;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.jeecg.common.aspect.annotation.Dict;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport java.io.UnsupportedEncodingException;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Data\n@TableName(\"${tableName}\")\n@Schema(description=\"${tableVo.ftlDescription}\")\npublic class ${entityName} implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']>\n<#assign excel_ignore_classType_arr=['pca','switch','cat_tree']>\n    <#list originalColumns as po>\n\t<#-- 生成字典Code -->\n\t<#assign list_field_dictCode=\"\">\n\t<#if po.classType='sel_user'>\n\t\t<#assign list_field_dictCode=', dictTable = \"sys_user\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"realname\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"username\\\")?trim)}\"'>\n\t<#elseif po.classType='sel_depart'>\n\t\t<#assign list_field_dictCode=', dictTable = \"sys_depart\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"depart_name\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"id\\\")?trim)}\"'>\n\t<#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>\n\t\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n\t\t\t<#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText}\", dicCode = \"${po.dictField}\"'>\n\t\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t\t<#assign list_field_dictCode=', dicCode = \"${po.dictField}\"'>\n\t</#if>\n\t<#elseif po.classType=='sel_tree'>\n\t\t<#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText?split(\",\")[2]}\", dicCode = \"${po.dictText?split(\",\")[0]}\"'>\n\t <#elseif po.classType=='link_table'>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicCode = \"${po.dictField}\", dicText = \"${po.dictText?split(\",\")[0]}\"'>\n\t</#if>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t@TableId(type = IdType.ASSIGN_ID)\n\t<#else>\n  \t\t<#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'>\n\t\t\t<#if po.classType=='date'>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t\t\t<#else>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t\t\t</#if>\n\t\t<#else>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")  && !excel_ignore_classType_arr?seq_contains(\"${po.classType}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n\t</#if>\n  \t\t</#if>\n  \t\t<#--  <#if po.classType!='popup'>\n  \t\t\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n  \t@Dict(dicCode=\"${po.dictField}\",dicText=\"${po.dictText}\",dictTable=\"${po.dictTable}\")\n  \t\t\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n  \t@Dict(dicCode=\"${po.dictField}\")\n  \t\t\t</#if>\n  \t\t</#if>-->\n\t\t<#if list_field_dictCode?length gt 1>\n\t@Dict(${list_field_dictCode?substring(2)})\n\t\t</#if>\n    </#if>\n\t<#-- 大字段转换 -->\n\t<#include \"/common/blob.ftl\">\n\t</#list>\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai",
    "content": "package ${bussiPackage}.${entityPackage}.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.jeecg.common.system.vo.SelectTreeModel;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface ${entityName}Mapper extends BaseMapper<${entityName}> {\n\n\t/**\n\t * 编辑节点状态\n\t * @param id\n\t * @param status\n\t */\n\tvoid updateTreeNodeStatus(@Param(\"id\") String id,@Param(\"status\") String status);\n\n\t/**\n\t * 【vue3专用】根据父级ID查询树节点数据\n\t *\n\t * @param pid\n\t * @param query\n\t * @return\n\t */\n\tList<SelectTreeModel> queryListByPid(@Param(\"pid\") String pid, @Param(\"query\") Map<String, String> query);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml",
    "content": "<#assign hasChildrenField = \"\">\n<#assign pidFieldName = \"\">\n<#assign textFieldName = \"\">\n<#assign textDbFieldName = \"\">\n<#assign pidDbFieldName = \"\">\n<#list originalColumns as po>\n  <#if po.fieldDbName == tableVo.extendParams.hasChildren>\n    <#assign hasChildrenField = po.fieldName>\n  </#if>\n  <#-- begin 【vue3专用】 -->\n  <#if po.fieldDbName == tableVo.extendParams.pidField>\n    <#assign pidFieldName = po.fieldName>\n    <#assign pidDbFieldName = po.fieldDbName>\n  </#if>\n  <#if po.fieldDbName == tableVo.extendParams.textField>\n    <#assign textFieldName = po.fieldName>\n    <#assign textDbFieldName = po.fieldDbName>\n  </#if>\n  <#-- end 【vue3专用】 -->\n</#list>\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper\">\n\n\t<update id=\"updateTreeNodeStatus\" parameterType=\"java.lang.String\">\n\t\tupdate ${tableName} set ${Format.humpToUnderline(hasChildrenField)} = ${r'#'}{status} where id = ${r'#'}{id}\n\t</update>\n\n  \t<!-- 【vue3专用】 -->\n\t<select id=\"queryListByPid\" parameterType=\"java.lang.Object\" resultType=\"org.jeecg.common.system.vo.SelectTreeModel\">\n\t\tselect\n\t\t  id as \"key\",\n\t\t  ${textDbFieldName} as \"title\",\n\t\t  (case when ${Format.humpToUnderline(hasChildrenField)} = '1' then 0 else 1 end) as isLeaf,\n\t\t  ${pidDbFieldName} as parentId\n\t\tfrom ${tableName}\n\t\twhere ${pidDbFieldName} = ${r'#'}{pid}\n\t\t<if test=\"query != null\">\n\t\t\t<foreach collection=\"query.entrySet()\" item=\"value\" index=\"key\">\n\t\t\t\tand ${r'$'}{key} = ${r'#'}{value}\n\t\t\t</foreach>\n\t\t</if>\n\t</select>\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service;\n\nimport org.jeecg.common.system.vo.SelectTreeModel;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.common.exception.JeecgBootException;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport java.util.List;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface I${entityName}Service extends IService<${entityName}> {\n\n\t/**根节点父ID的值*/\n\tpublic static final String ROOT_PID_VALUE = \"0\";\n\t\n\t/**树节点有子节点状态值*/\n\tpublic static final String HASCHILD = \"1\";\n\t\n\t/**树节点无子节点状态值*/\n\tpublic static final String NOCHILD = \"0\";\n\n\t/**\n\t * 新增节点\n\t *\n\t * @param ${entityName?uncap_first}\n\t */\n\tvoid add${entityName}(${entityName} ${entityName?uncap_first});\n\t\n\t/**\n   * 修改节点\n   *\n   * @param ${entityName?uncap_first}\n   * @throws JeecgBootException\n   */\n\tvoid update${entityName}(${entityName} ${entityName?uncap_first}) throws JeecgBootException;\n\t\n\t/**\n\t * 删除节点\n\t *\n\t * @param id\n   * @throws JeecgBootException\n\t */\n\tvoid delete${entityName}(String id) throws JeecgBootException;\n\n\t  /**\n\t   * 查询所有数据，无分页\n\t   *\n\t   * @param queryWrapper\n\t   * @return List<${entityName}>\n\t   */\n    List<${entityName}> queryTreeListNoPage(QueryWrapper<${entityName}> queryWrapper);\n\n\t/**\n\t * 【vue3专用】根据父级编码加载分类字典的数据\n\t *\n\t * @param parentCode\n\t * @return\n\t */\n\tList<SelectTreeModel> queryListByCode(String parentCode);\n\n\t/**\n\t * 【vue3专用】根据pid查询子节点集合\n\t *\n\t * @param pid\n\t * @return\n\t */\n\tList<SelectTreeModel> queryListByPid(String pid);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service.impl;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport org.jeecg.common.exception.JeecgBootException;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecg.common.system.vo.SelectTreeModel;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport ${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper;\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport org.springframework.transaction.annotation.Transactional;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\n<#assign pidFieldName = \"\">\n<#assign hasChildrenField = \"\">\n<#list originalColumns as po>\n<#if po.fieldDbName == tableVo.extendParams.pidField>\n<#assign pidFieldName = po.fieldName>\n</#if>\n<#if po.fieldDbName == tableVo.extendParams.hasChildren>\n<#assign hasChildrenField = po.fieldName>\n</#if>\n</#list>\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Service\npublic class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service {\n\n\t@Override\n\tpublic void add${entityName}(${entityName} ${entityName?uncap_first}) {\n\t   //新增时设置hasChild为0\n\t    ${entityName?uncap_first}.set${hasChildrenField?cap_first}(I${entityName}Service.NOCHILD);\n\t\tif(oConvertUtils.isEmpty(${entityName?uncap_first}.get${pidFieldName?cap_first}())){\n\t\t\t${entityName?uncap_first}.set${pidFieldName?cap_first}(I${entityName}Service.ROOT_PID_VALUE);\n\t\t}else{\n\t\t\t//如果当前节点父ID不为空 则设置父节点的hasChildren 为1\n\t\t\t${entityName} parent = baseMapper.selectById(${entityName?uncap_first}.get${pidFieldName?cap_first}());\n\t\t\tif(parent!=null && !\"1\".equals(parent.get${hasChildrenField?cap_first}())){\n\t\t\t\tparent.set${hasChildrenField?cap_first}(\"1\");\n\t\t\t\tbaseMapper.updateById(parent);\n\t\t\t}\n\t\t}\n\t\tbaseMapper.insert(${entityName?uncap_first});\n\t}\n\t\n\t@Override\n\tpublic void update${entityName}(${entityName} ${entityName?uncap_first}) {\n\t\t${entityName} entity = this.getById(${entityName?uncap_first}.getId());\n\t\tif(entity==null) {\n\t\t\tthrow new JeecgBootException(\"未找到对应实体\");\n\t\t}\n\t\tString old_pid = entity.get${pidFieldName?cap_first}();\n\t\tString new_pid = ${entityName?uncap_first}.get${pidFieldName?cap_first}();\n\t\tif(!old_pid.equals(new_pid)) {\n\t\t\tupdateOldParentNode(old_pid);\n\t\t\tif(oConvertUtils.isEmpty(new_pid)){\n\t\t\t\t${entityName?uncap_first}.set${pidFieldName?cap_first}(I${entityName}Service.ROOT_PID_VALUE);\n\t\t\t}\n\t\t\tif(!I${entityName}Service.ROOT_PID_VALUE.equals(${entityName?uncap_first}.get${pidFieldName?cap_first}())) {\n\t\t\t\tbaseMapper.updateTreeNodeStatus(${entityName?uncap_first}.get${pidFieldName?cap_first}(), I${entityName}Service.HASCHILD);\n\t\t\t}\n\t\t}\n\t\tbaseMapper.updateById(${entityName?uncap_first});\n\t}\n\t\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void delete${entityName}(String id) throws JeecgBootException {\n\t\t//查询选中节点下所有子节点一并删除\n        id = this.queryTreeChildIds(id);\n        if(id.indexOf(\",\")>0) {\n            StringBuffer sb = new StringBuffer();\n            String[] idArr = id.split(\",\");\n            for (String idVal : idArr) {\n                if(idVal != null){\n                    ${entityName} ${entityName?uncap_first} = this.getById(idVal);\n                    String pidVal = ${entityName?uncap_first}.get${pidFieldName?cap_first}();\n                    //查询此节点上一级是否还有其他子节点\n                    List<${entityName}> dataList = baseMapper.selectList(new QueryWrapper<${entityName}>().eq(\"${tableVo.extendParams.pidField}\", pidVal).notIn(\"id\",Arrays.asList(idArr)));\n                    boolean flag = (dataList == null || dataList.size() == 0) && !Arrays.asList(idArr).contains(pidVal) && !sb.toString().contains(pidVal);\n                    if(flag){\n                        //如果当前节点原本有子节点 现在木有了，更新状态\n                        sb.append(pidVal).append(\",\");\n                    }\n                }\n            }\n            //批量删除节点\n            baseMapper.deleteBatchIds(Arrays.asList(idArr));\n            //修改已无子节点的标识\n            String[] pidArr = sb.toString().split(\",\");\n            for(String pid : pidArr){\n                this.updateOldParentNode(pid);\n            }\n        }else{\n            ${entityName} ${entityName?uncap_first} = this.getById(id);\n            if(${entityName?uncap_first}==null) {\n                throw new JeecgBootException(\"未找到对应实体\");\n            }\n            updateOldParentNode(${entityName?uncap_first}.get${pidFieldName?cap_first}());\n            baseMapper.deleteById(id);\n        }\n\t}\n\t\n\t@Override\n    public List<${entityName}> queryTreeListNoPage(QueryWrapper<${entityName}> queryWrapper) {\n        List<${entityName}> dataList = baseMapper.selectList(queryWrapper);\n        List<${entityName}> mapList = new ArrayList<>();\n        for(${entityName} data : dataList){\n            String pidVal = data.get${pidFieldName?cap_first}();\n            //递归查询子节点的根节点\n            if(pidVal != null && !I${entityName}Service.NOCHILD.equals(pidVal)){\n                ${entityName} rootVal = this.getTreeRoot(pidVal);\n                if(rootVal != null && !mapList.contains(rootVal)){\n                    mapList.add(rootVal);\n                }\n            }else{\n                if(!mapList.contains(data)){\n                    mapList.add(data);\n                }\n            }\n        }\n        return mapList;\n    }\n\n    @Override\n    public List<SelectTreeModel> queryListByCode(String parentCode) {\n        String pid = ROOT_PID_VALUE;\n        if (oConvertUtils.isNotEmpty(parentCode)) {\n            LambdaQueryWrapper<${entityName}> queryWrapper = new LambdaQueryWrapper<>();\n            queryWrapper.eq(${entityName}::get${pidFieldName?cap_first}, parentCode);\n            List<${entityName}> list = baseMapper.selectList(queryWrapper);\n            if (list == null || list.size() == 0) {\n                throw new JeecgBootException(\"该编码【\" + parentCode + \"】不存在，请核实!\");\n            }\n            if (list.size() > 1) {\n                throw new JeecgBootException(\"该编码【\" + parentCode + \"】存在多个，请核实!\");\n            }\n            pid = list.get(0).getId();\n        }\n        return baseMapper.queryListByPid(pid, null);\n    }\n\n    @Override\n    public List<SelectTreeModel> queryListByPid(String pid) {\n        if (oConvertUtils.isEmpty(pid)) {\n            pid = ROOT_PID_VALUE;\n        }\n        return baseMapper.queryListByPid(pid, null);\n    }\n\n\t/**\n\t * 根据所传pid查询旧的父级节点的子节点并修改相应状态值\n\t * @param pid\n\t */\n\tprivate void updateOldParentNode(String pid) {\n\t\tif(!I${entityName}Service.ROOT_PID_VALUE.equals(pid)) {\n\t\t\tLong count = baseMapper.selectCount(new QueryWrapper<${entityName}>().eq(\"${tableVo.extendParams.pidField}\", pid));\n\t\t\tif(count==null || count<=1) {\n\t\t\t\tbaseMapper.updateTreeNodeStatus(pid, I${entityName}Service.NOCHILD);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n     * 递归查询节点的根节点\n     * @param pidVal\n     * @return\n     */\n    private ${entityName} getTreeRoot(String pidVal){\n        ${entityName} data =  baseMapper.selectById(pidVal);\n        if(data != null && !I${entityName}Service.ROOT_PID_VALUE.equals(data.get${pidFieldName?cap_first}()) && !data.get${pidFieldName?cap_first}().equals(data.getId())){\n            return this.getTreeRoot(data.get${pidFieldName?cap_first}());\n        }else{\n            return data;\n        }\n    }\n\n    /**\n     * 根据id查询所有子节点id\n     * @param ids\n     * @return\n     */\n    private String queryTreeChildIds(String ids) {\n        //获取id数组\n        String[] idArr = ids.split(\",\");\n        StringBuffer sb = new StringBuffer();\n        for (String pidVal : idArr) {\n            if(pidVal != null){\n                if(!sb.toString().contains(pidVal)){\n                    if(sb.toString().length() > 0){\n                        sb.append(\",\");\n                    }\n                    sb.append(pidVal);\n                    this.getTreeChildIds(pidVal,sb);\n                }\n            }\n        }\n        return sb.toString();\n    }\n\n    /**\n     * 递归查询所有子节点\n     * @param pidVal\n     * @param sb\n     * @return\n     */\n    private StringBuffer getTreeChildIds(String pidVal,StringBuffer sb){\n        List<${entityName}> dataList = baseMapper.selectList(new QueryWrapper<${entityName}>().eq(\"${tableVo.extendParams.pidField}\", pidVal));\n        if(dataList != null && dataList.size()>0){\n            for(${entityName} tree : dataList) {\n                if(!sb.toString().contains(tree.getId())){\n                    sb.append(\",\").append(tree.getId());\n                }\n                this.getTreeChildIds(tree.getId(),sb);\n            }\n        }\n        return sb;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei",
    "content": "<#assign pidFieldName = \"\">\n<#assign hasChildrenField = \"\">\n<#list originalColumns as po>\n<#if po.fieldDbName == tableVo.extendParams.pidField>\n<#assign pidFieldName = po.fieldName>\n</#if>\n<#if po.fieldDbName == tableVo.extendParams.hasChildren>\n<#assign hasChildrenField = po.fieldName>\n</#if>\n</#list>\n<template>\n  <a-card :bordered=\"false\">\n    <!-- 查询区域 -->\n    <div class=\"table-page-search-wrapper\">\n      <a-form layout=\"inline\" @keyup.enter.native=\"searchQuery\">\n        <a-row :gutter=\"24\">\n    <#assign query_field_no=0>\n    <#assign query_flag=false>\n    <#assign list_need_dict=false>\n    <#assign list_need_category=false>\n    <#assign list_need_pca=false>\n    <#assign bpm_flag=false>\n\n    <#-- 开始循环 -->\n    <#list columns as po>\n    <#if po.fieldDbName=='bpm_status'>\n      <#assign bpm_flag=true>\n    </#if>\n    <#if po.isQuery=='Y'>\n    <#assign query_flag=true>\n    \t<#if query_field_no==2>\n              <template v-if=\"toggleSearchStatus\">\n    \t</#if>\n    \t<#assign query_field_dictCode=\"\">\n    \t<#if po.dictTable?default(\"\")?trim?length gt 1>\n    \t    <#assign query_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n        <#elseif po.dictField?default(\"\")?trim?length gt 1>\n            <#assign query_field_dictCode=\"${po.dictField}\">\n        </#if>\n    \t<#if po.queryMode=='single'>\n          <#if query_field_no gt 1>  </#if><a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <#if query_field_no gt 1>  </#if><a-form-item label=\"${po.filedComment}\">\n            <#if po.classType=='sel_search'>\n              <#if query_field_no gt 1>  </#if><j-search-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dict=\"${po.dictTable},${po.dictText},${po.dictField}\"/>\n            <#elseif po.classType=='sel_user'>\n              <#if query_field_no gt 1>  </#if><j-select-user-by-dep placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"/>\n            <#elseif po.classType=='switch'>\n              <#if query_field_no gt 1>  </#if><j-switch placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" <#if po.dictField!= 'is_open'>:options=\"${po.dictField}\"</#if> query></j-switch>\n            <#elseif po.classType=='sel_depart'>\n              <#if query_field_no gt 1>  </#if><j-select-depart placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"/>\n            <#elseif po.classType=='list_multi'>\n              <#if query_field_no gt 1>  </#if><j-multi-select-tag placeholder=\"请选择${po.filedComment}\" dictCode=\"${query_field_dictCode?default(\"\")}\" v-model=\"queryParam.${po.fieldName}\"/>\n            <#elseif po.classType=='cat_tree'>\n              <#if query_field_no gt 1>  </#if><j-category-select placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\"/>\n            <#elseif po.classType=='date'>\n              <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></j-date>\n            <#elseif po.classType=='datetime'>\n              <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></j-date>\n            <#elseif po.classType=='pca'>\n              <#if query_field_no gt 1>  </#if><j-area-linkage type=\"cascader\" v-model=\"queryParam.${po.fieldName}\" placeholder=\"请选择省市区\"/>\n            <#elseif po.classType=='popup'>\n              <#if query_field_no gt 1>  </#if><j-popup placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" code=\"${po.dictTable}\" org-fields=\"${po.dictField}\" dest-fields=\"${po.dictText}\" :field=\"getPopupField('${po.dictText}')\" :multi=\"${po.extendParams.popupMulti?c}\"/>\n            <#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>\n            <#--  ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->\n            <#if po.dictTable?default(\"\")?trim?length gt 1>\n              <#if query_field_no gt 1>  </#if><j-dict-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\"/>\n            <#elseif po.dictField?default(\"\")?trim?length gt 1>\n              <#if query_field_no gt 1>  </#if><j-dict-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dictCode=\"${po.dictField}\"/>\n            <#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n            </#if>\n            <#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n            </#if>\n            <#if query_field_no gt 1>  </#if></a-form-item>\n          <#if query_field_no gt 1>  </#if></a-col>\n    <#else>\n          <#if query_field_no gt 1>  </#if><a-col :xl=\"10\" :lg=\"11\" :md=\"12\" :sm=\"24\">\n            <#if query_field_no gt 1>  </#if><a-form-item label=\"${po.filedComment}\">\n            <#if po.classType=='date'>\n              <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择开始日期\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></j-date>\n              <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n              <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择结束日期\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></j-date>\n            <#elseif po.classType=='datetime'>\n              <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择开始时间\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></j-date>\n              <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n              <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择结束时间\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></j-date>\n            <#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入最小值\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></a-input>\n              <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入最大值\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></a-input>\n            </#if>\n            <#if query_field_no gt 1>  </#if></a-form-item>\n          <#if query_field_no gt 1>  </#if></a-col>\n    \t</#if>\n    <#assign query_field_no=query_field_no+1>\n    </#if>\n    <#if !list_need_dict && po.fieldShowType!='popup' && po.dictField?default(\"\")?trim?length gt 1>\n    <#assign list_need_dict=true>\n    </#if>\n    <#if po.classType=='cat_tree' && po.dictText?default(\"\")?trim?length == 0>\n    <#assign list_need_category=true>\n    </#if>\n    <#if po.classType=='pca'>\n    <#assign list_need_pca=true>\n    </#if>\n    </#list>\n    <#-- 结束循环 -->\n    <#t>\n    <#if query_field_no gt 2>\n              </template>\n    </#if>\n    <#if query_flag>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left;overflow: hidden;\" class=\"table-page-search-submitButtons\">\n              <a-button type=\"primary\" @click=\"searchQuery\" icon=\"search\">查询</a-button>\n              <a-button type=\"primary\" @click=\"searchReset\" icon=\"reload\" style=\"margin-left: 8px\">重置</a-button>\n              <a @click=\"handleToggleSearch\" style=\"margin-left: 8px\">\n                {{ toggleSearchStatus ? '收起' : '展开' }}\n                <a-icon :type=\"toggleSearchStatus ? 'up' : 'down'\"/>\n              </a>\n            </span>\n          </a-col>\n    </#if>\n        </a-row>\n      </a-form>\n    </div>\n    <!-- 查询区域-END -->\n\n    <!-- 操作按钮区域 -->\n    <div class=\"table-operator\">\n      <a-button @click=\"handleAdd\" type=\"primary\" icon=\"plus\">新增</a-button>\n      <a-button type=\"primary\" icon=\"download\" @click=\"handleExportXls('${tableVo.ftlDescription}')\">导出</a-button>\n      <a-upload name=\"file\" :showUploadList=\"false\" :multiple=\"false\" :headers=\"tokenHeader\" :action=\"importExcelUrl\" @change=\"handleImportExcel\">\n        <a-button type=\"primary\" icon=\"import\">导入</a-button>\n      </a-upload>\n      <!-- 高级查询区域 -->\n      <j-super-query :fieldList=\"superFieldList\" ref=\"superQueryModal\" @handleSuperQuery=\"handleSuperQuery\"></j-super-query>\n      <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n        <a-menu slot=\"overlay\">\n          <a-menu-item key=\"1\" @click=\"batchDel\"><a-icon type=\"delete\"/>删除</a-menu-item>\n        </a-menu>\n        <a-button style=\"margin-left: 8px\"> 批量操作 <a-icon type=\"down\" /></a-button>\n      </a-dropdown>\n    </div>\n\n    <!-- table区域-begin -->\n    <div>\n      <div class=\"ant-alert ant-alert-info\" style=\"margin-bottom: 16px;\">\n        <i class=\"anticon anticon-info-circle ant-alert-icon\"></i> 已选择 <a style=\"font-weight: 600\">{{ selectedRowKeys.length }}</a>项\n        <a style=\"margin-left: 24px\" @click=\"onClearSelected\">清空</a>\n      </div>\n\n      <a-table\n        ref=\"table\"\n        size=\"middle\"\n        rowKey=\"id\"\n        class=\"j-table-force-nowrap\"\n        :scroll=\"{x:true}\"\n        :columns=\"columns\"\n        :dataSource=\"dataSource\"\n        :pagination=\"ipagination\"\n        :loading=\"loading\"\n        :expandedRowKeys=\"expandedRowKeys\"\n        @change=\"handleTableChange\"\n        @expand=\"handleExpand\"\n        v-bind=\"tableProps\">\n\n        <template slot=\"imgSlot\" slot-scope=\"text,record\">\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无图片</span>\n          <img v-else :src=\"getImgView(text)\" :preview=\"record.id\" height=\"25px\" alt=\"\" style=\"max-width:80px;font-size: 12px;font-style: italic;\"/>\n        </template>\n        <template slot=\"fileSlot\" slot-scope=\"text\">\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n          <a-button\n            v-else\n            :ghost=\"true\"\n            type=\"primary\"\n            icon=\"download\"\n            size=\"small\"\n            @click=\"downloadFile(text)\">\n            下载\n          </a-button>\n        </template>\n\n        <span slot=\"action\" slot-scope=\"text, record\">\n          <a @click=\"handleEdit(record)\">编辑</a>\n\n          <a-divider type=\"vertical\" />\n          <a-dropdown>\n            <a class=\"ant-dropdown-link\">更多 <a-icon type=\"down\" /></a>\n            <a-menu slot=\"overlay\">\n              <a-menu-item>\n                <a @click=\"handleAddChild(record)\">添加下级</a>\n              </a-menu-item>\n              <a-menu-item>\n                <a-popconfirm title=\"确定删除吗?\" @confirm=\"() => handleDeleteNode(record.id)\" placement=\"topLeft\">\n                  <a>删除</a>\n                </a-popconfirm>\n              </a-menu-item>\n            </a-menu>\n          </a-dropdown>\n        </span>\n\n      </a-table>\n    </div>\n\n    <${entityName?uncap_first}-modal ref=\"modalForm\" @ok=\"modalFormOk\"></${entityName?uncap_first}-modal>\n  </a-card>\n</template>\n\n<script>\n\n  import { getAction, deleteAction } from '@/api/manage'\n  import { JeecgListMixin } from '@/mixins/JeecgListMixin'\n  import ${entityName}Modal from './modules/${entityName}Modal'\n  import {filterMultiDictText} from '@/components/dict/JDictSelectUtil'\n  import { filterObj } from '@/utils/util';\n  <#if list_need_category>\n  import { loadCategoryData } from '@/api/api'\n  </#if>\n  <#if list_need_pca>\n  import Area from '@/components/_util/Area'\n  </#if>\n\n  export default {\n    name: \"${entityName}List\",\n    mixins:[JeecgListMixin],\n    components: {\n      ${entityName}Modal\n    },\n    data () {\n      return {\n        description: '${tableVo.ftlDescription}管理页面',\n        // 表头\n        columns: [\n    <#list columns as po>\n    <#if po.fieldDbName==tableVo.extendParams.textField>\n          {\n            title:'${po.filedComment}',\n            align:\"left\",\n            dataIndex: '${po.fieldName}'\n          },\n    </#if>\n    </#list>\n\t<#list columns as po>\n\t<#if po.isShowList =='Y'>\n\t<#if po.fieldDbName!=tableVo.extendParams.textField && po.fieldName!=pidFieldName>\n          {\n            title:'${po.filedComment}',\n            align:\"left\",\n            <#if po.sort=='Y'>\n            sorter: true,\n            </#if>\n            <#if po.classType=='date'>\n            dataIndex: '${po.fieldName}',\n            customRender:function (text) {\n              return !text?\"\":(text.length>10?text.substr(0,10):text)\n            }\n            <#elseif po.classType=='file'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'fileSlot'}\n            <#elseif po.fieldDbType=='Blob'>\n            dataIndex: '${po.fieldName}String'\n            <#elseif po.classType=='image'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'imgSlot'}\n            <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user'>\n            dataIndex: '${po.fieldName}_dictText'\n            <#elseif po.classType=='switch'>\n            dataIndex: '${po.fieldName}',\n            <#if po.dictField != 'is_open'>\n            customRender: (text) => (!text ? \"\" : (text == ${po.dictField}[0] ? \"是\" : \"否\"))\n            <#else>\n            customRender: (text) => (!text ? \"\" : (text == \"Y\" ? \"是\" : \"否\"))\n            </#if>\n            <#elseif po.classType=='cat_tree'>\n            <#if list_need_category>\n            dataIndex: '${po.fieldName}',\n            customRender: (text) => (text ? filterMultiDictText(this.dictOptions['${po.fieldName}'], text) : '')\n            <#else>\n            dataIndex: '${po.fieldName}',\n            customRender: (text, record) => (text ? record['${po.dictText}'] : '')\n            </#if>\n\t\t\t<#else>\n            dataIndex: '${po.fieldName}'\n\t\t\t</#if>\n          },\n     </#if>\n     </#if>\n     </#list>\n          {\n            title: '操作',\n            dataIndex: 'action',\n            align:\"center\",\n            fixed:\"right\",\n            width:147,\n            scopedSlots: { customRender: 'action' },\n          }\n        ],\n        url: {\n          list: \"/${entityPackagePath}/${entityName?uncap_first}/rootList\",\n          childList: \"/${entityPackagePath}/${entityName?uncap_first}/childList\",\n          getChildListBatch: \"/${entityPackagePath}/${entityName?uncap_first}/getChildListBatch\",\n          delete: \"/${entityPackagePath}/${entityName?uncap_first}/delete\",\n          deleteBatch: \"/${entityPackagePath}/${entityName?uncap_first}/deleteBatch\",\n          exportXlsUrl: \"/${entityPackagePath}/${entityName?uncap_first}/exportXls\",\n          importExcelUrl: \"${entityPackagePath}/${entityName?uncap_first}/importExcel\",\n        },\n        expandedRowKeys:[],\n        hasChildrenField:\"${hasChildrenField}\",\n        pidField:\"${pidFieldName}\",\n        dictOptions: {},\n        loadParent: false,\n        superFieldList:[],\n      }\n    },\n    created() {\n      this.getSuperFieldList();\n    },\n    computed: {\n      importExcelUrl(){\n        <#noparse>return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;</#noparse>\n      },\n      tableProps() {\n        let _this = this\n        return {\n          // 列表项是否可选择\n          rowSelection: {\n            selectedRowKeys: _this.selectedRowKeys,\n            onChange: (selectedRowKeys) => _this.selectedRowKeys = selectedRowKeys\n          }\n        }\n      }\n    },\n    methods: {\n      loadData(arg){\n        if(arg==1){\n          this.ipagination.current=1\n        }\n        this.loading = true\n        let params = this.getQueryParams()\n        params.hasQuery = 'true'\n        getAction(this.url.list,params).then(res=>{\n          if(res.success){\n            let result = res.result\n            if(Number(result.total)>0){\n              this.ipagination.total = Number(result.total)\n              this.dataSource = this.getDataByResult(res.result.records)\n              return this.loadDataByExpandedRows(this.dataSource)\n            }else{\n              this.ipagination.total=0\n              this.dataSource=[]\n            }\n          }else{\n            this.$message.warning(res.message)\n          }\n        }).finally(()=>{\n          this.loading = false\n        })\n      },\n      // 根据已展开的行查询数据（用于保存后刷新时异步加载子级的数据）\n      loadDataByExpandedRows(dataList) {\n        if (this.expandedRowKeys.length > 0) {\n          return getAction(this.url.getChildListBatch,{ parentIds: this.expandedRowKeys.join(',') }).then(res=>{\n            if (res.success && res.result.records.length>0) {\n              //已展开的数据批量子节点\n              let records = res.result.records\n              const listMap = new Map();\n              for (let item of records) {\n                let pid = item[this.pidField];\n                if (this.expandedRowKeys.join(',').includes(pid)) {\n                 let mapList = listMap.get(pid);\n                  if (mapList == null) {\n                    mapList = [];\n                  }\n                  mapList.push(item);\n                  listMap.set(pid, mapList);\n                }\n              }\n              let childrenMap = listMap;\n              let fn = (list) => {\n                if(list) {\n                  list.forEach(data => {\n                    if (this.expandedRowKeys.includes(data.id)) {\n                      data.children = this.getDataByResult(childrenMap.get(data.id))\n                      fn(data.children)\n                    }\n                  })\n                }\n              }\n              fn(dataList)\n            }\n          })\n        } else {\n          return Promise.resolve()\n        }\n      },\n      getQueryParams(arg) {\n        //获取查询条件\n        let sqp = {}\n        let param = {}\n        if(this.superQueryParams){\n          sqp['superQueryParams']=encodeURI(this.superQueryParams)\n          sqp['superQueryMatchType'] = this.superQueryMatchType\n        }\n        if(arg){\n          param = Object.assign(sqp, this.isorter ,this.filters);\n        }else{\n          param = Object.assign(sqp, this.queryParam, this.isorter ,this.filters);\n        }\n        if(JSON.stringify(this.queryParam) === \"{}\" || arg){\n          param.hasQuery = 'false'\n        }else{\n          param.hasQuery = 'true'\n        }\n        param.field = this.getQueryField();\n        param.pageNo = this.ipagination.current;\n        param.pageSize = this.ipagination.pageSize;\n        return filterObj(param);\n      },\n      searchReset() {\n        //重置\n        this.expandedRowKeys = []\n        this.queryParam = {}\n        this.loadData(1);\n      },\n      getDataByResult(result){\n        if(result){\n          return result.map(item=>{\n            //判断是否标记了带有子节点\n            if(item[this.hasChildrenField]=='1'){\n              let loadChild = { id: item.id+'_loadChild', name: 'loading...', isLoading: true }\n              item.children = [loadChild]\n            }\n            return item\n          })\n        }\n      },\n      handleExpand(expanded, record){\n        // 判断是否是展开状态\n        if (expanded) {\n          this.expandedRowKeys.push(record.id)\n          if (record.children.length>0 && record.children[0].isLoading === true) {\n            let params = this.getQueryParams(1);//查询条件\n            params[this.pidField] = record.id\n            params.hasQuery = 'false'\n            params.superQueryParams=\"\"\n            getAction(this.url.childList,params).then((res)=>{\n              if(res.success){\n                if(res.result.records){\n                  record.children = this.getDataByResult(res.result.records)\n                  this.dataSource = [...this.dataSource]\n                }else{\n                  record.children=''\n                  record.hasChildrenField='0'\n                }\n              }else{\n                this.$message.warning(res.message)\n              }\n            })\n          }\n        }else{\n          let keyIndex = this.expandedRowKeys.indexOf(record.id)\n          if(keyIndex>=0){\n            this.expandedRowKeys.splice(keyIndex, 1);\n          }\n        }\n      },\n      handleAddChild(record){\n        this.loadParent = true\n        let obj = {}\n        obj[this.pidField] = record['id']\n        this.$refs.modalForm.add(obj);\n      },\n      handleDeleteNode(id) {\n        if(!this.url.delete){\n          this.$message.error(\"请设置url.delete属性!\")\n          return\n        }\n        var that = this;\n        deleteAction(that.url.delete, {id: id}).then((res) => {\n          if (res.success) {\n             that.loadData(1)\n          } else {\n            that.$message.warning(res.message);\n          }\n        });\n      },\n      batchDel(){\n        if(this.selectedRowKeys.length<=0){\n          this.$message.warning('请选择一条记录！');\n          return false;\n        }else{\n          let ids = \"\";\n          let that = this;\n          that.selectedRowKeys.forEach(function(val) {\n            ids+=val+\",\";\n          });\n          that.$confirm({\n            title:\"确认删除\",\n            content:\"是否删除选中数据?\",\n            onOk: function(){\n              that.handleDeleteNode(ids)\n              that.onClearSelected();\n            }\n          });\n        }\n      },\n      getSuperFieldList(){\n        <#include \"/common/utils.ftl\">\n        let fieldList=[];\n         <#list columns as po>\n        fieldList.push(${superQueryFieldList(po)})\n         </#list>\n        this.superFieldList = fieldList\n      }\n    }\n  }\n</script>\n<style scoped>\n  @import '~@assets/less/common.less';\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql",
    "content": "<#include \"/common/sql/menu_insert.ftl\">"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n  <j-modal\n    :title=\"title\"\n    :width=\"width\"\n    :visible=\"visible\"\n    :confirmLoading=\"confirmLoading\"\n    switchFullscreen\n    @ok=\"handleOk\"\n    @cancel=\"handleCancel\"\n    cancelText=\"关闭\">\n    <a-spin :spinning=\"confirmLoading\">\n      <a-form-model ref=\"form\" :model=\"model\" :rules=\"validatorRules\">\n<#assign pidFieldName = \"\">\n<#assign form_popup = false>\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#list columns as po>\n<#if po.isShow =='Y'>\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n        <a-form-model-item label=\"${po.filedComment}\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" prop=\"${autoStringSuffixForModel(po)}\">\n\t<#if po.fieldDbName == tableVo.extendParams.pidField>\n\t\t<#assign pidFieldName = po.fieldName>\n          <j-tree-select\n            ref=\"treeSelect\"\n            placeholder=\"请选择${po.filedComment}\"\n            v-model=\"model.${po.fieldName}\"\n            dict=\"${tableVo.tableName},${tableVo.extendParams.textField},id\"\n            pidField=\"${tableVo.extendParams.pidField}\"\n            pidValue=\"0\"\n            hasChildField=\"${tableVo.extendParams.hasChildren}\"\n            <#if po.readonly=='Y'>disabled</#if>>\n          </j-tree-select>\n\t<#elseif po.classType =='date'>\n          <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='datetime'>\n          <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='time'>\n          <j-time placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='switch'>\n          <j-switch v-model=\"model.${po.fieldName}\" <#if po.dictField != 'is_open'>:options=\"${po.dictField}\"</#if>></j-switch>\n\t<#elseif po.classType =='popup'>\n\t     <#assign form_popup=true>\n          <j-popup\n            v-model=\"model.${po.fieldName}\"\n            field=\"${po.fieldName}\"\n            org-fields=\"${po.dictField}\"\n            dest-fields=\"${Format.underlineToHump(po.dictText)}\"\n            code=\"${po.dictTable}\"\n            :multi=\"${po.extendParams.popupMulti?c}\"\n            @input=\"popupCallback\"\n            <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='sel_depart'>\n          <j-select-depart v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if> />\n\t<#elseif po.classType =='sel_user'>\n          <j-select-user-by-dep v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='textarea'>\n          <a-textarea v-model=\"model.${autoStringSuffixForModel(po)}\" rows=\"4\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='list' || po.classType=='radio'>\n          <j-dict-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\"  dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='list_multi' || po.classType=='checkbox'>\n          <j-multi-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\"  dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n          <a-input-number v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='file'>\n          <j-upload v-model=\"model.${po.fieldName}\"  <#if po.readonly=='Y'>disabled</#if> <#if po.uploadnum??>:number=${po.uploadnum}</#if>></j-upload>\n\t<#elseif po.classType=='image'>\n          <j-image-upload isMultiple <#if po.uploadnum??>:number=${po.uploadnum}</#if> v-model=\"model.${po.fieldName}\" <#if po.readonly=='Y'>disabled</#if>></j-image-upload>\n  <#elseif po.classType=='sel_search'>\n          <j-search-select-tag v-model=\"model.${po.fieldName}\" dict=\"${form_field_dictCode}\" <#if po.readonly=='Y'>disabled</#if> />\n\t<#elseif po.classType=='cat_tree'>\n      <#assign form_cat_tree = true>\n          <j-category-select v-model=\"model.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\" placeholder=\"请选择${po.filedComment}\" <#if po.dictText?default(\"\")?trim?length gt 1>back=\"${dashedToCamel(po.dictText)}\" @change=\"handleCategoryChange\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n      <#if po.dictText?default(\"\")?trim?length gt 1>\n      <#assign form_cat_back = \"${po.dictText}\">\n      </#if>\n  <#elseif po.classType =='pca'>\n          <j-area-linkage type=\"cascader\" v-model=\"model.${po.fieldName}\" placeholder=\"请输入省市区\" <#if po.readonly=='Y'>disabled</#if> />\n\t<#elseif po.classType=='umeditor'>\n          <j-editor v-model=\"model.${autoStringSuffixForModel(po)}\" <#if po.readonly=='Y'>disabled</#if>/>\n  <#elseif po.classType =='markdown'>\n          <j-markdown-editor v-model=\"model.${autoStringSuffixForModel(po)}\" id=\"${po.fieldName}\"></j-markdown-editor>\n\t<#elseif po.classType == 'sel_tree'>\n\t          <j-tree-select\n              ref=\"treeSelect\"\n              placeholder=\"请选择${po.filedComment}\"\n              v-model=\"model.${po.fieldName}\"\n              <#if po.dictText??>\n              <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n              dict=\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\"\n              <#elseif po.dictText?split(',')[1]??>\n              pidField=\"${po.dictText?split(',')[1]}\"\n              <#elseif po.dictText?split(',')[3]??>\n              hasChildField=\"${po.dictText?split(',')[3]}\"\n              </#if>\n              </#if>\n              pidValue=\"${po.dictField}\"\n              <#if po.readonly=='Y'>disabled</#if>>\n            </j-tree-select>\n\t<#else>\n          <a-input v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>></a-input>\n    </#if>\n        </a-form-model-item>\n</#if>\n</#list>    \n        \n      </a-form-model>\n    </a-spin>\n  </j-modal>\n</template>\n\n<script>\n\n  import { httpAction } from '@/api/manage'\n  import { validateDuplicateValue } from '@/utils/util'\n  export default {\n    name: \"${entityName}Modal\",\n    components: { \n    },\n    data () {\n      return {\n        title:\"操作\",\n        width:800,\n        visible: false,\n        model:{\n           <#include \"/common/init/initValue.ftl\">\n         },\n        labelCol: {\n          xs: { span: 24 },\n          sm: { span: 5 },\n        },\n        wrapperCol: {\n          xs: { span: 24 },\n          sm: { span: 16 },\n        },\n\n        confirmLoading: false,\n        <#include \"/common/validatorRulesTemplate/main.ftl\">\n        url: {\n          add: \"/${entityPackagePath}/${entityName?uncap_first}/add\",\n          edit: \"/${entityPackagePath}/${entityName?uncap_first}/edit\",\n        },\n        expandedRowKeys:[],\n        pidField:\"${pidFieldName}\"\n     \n      }\n    },\n    created () {\n       //备份model原始值\n       this.modelDefault = JSON.parse(JSON.stringify(this.model));\n    },\n    methods: {\n      add (obj) {\n        this.modelDefault.${pidFieldName}=''\n        this.edit(Object.assign(this.modelDefault , obj));\n      },\n      edit (record) {\n        this.model = Object.assign({}, record);\n        this.visible = true;\n      },\n      close () {\n        this.$emit('close');\n        this.visible = false;\n        this.$refs.form.clearValidate()\n      },\n      handleOk () {\n        const that = this;\n        // 触发表单验证\n       this.$refs.form.validate(valid => {\n          if (valid) {\n            that.confirmLoading = true;\n            let httpurl = '';\n            let method = '';\n            if(!this.model.id){\n              httpurl+=this.url.add;\n              method = 'post';\n            }else{\n              httpurl+=this.url.edit;\n               method = 'put';\n            }\n             if(this.model.id && this.model.id === this.model[this.pidField]){\n              that.$message.warning(\"父级节点不能选择自己\");\n              that.confirmLoading = false;\n              return;\n            }\n            httpAction(httpurl,this.model,method).then((res)=>{\n              if(res.success){\n                that.$message.success(res.message);\n                this.$emit('ok');\n              }else{\n                that.$message.warning(res.message);\n              }\n            }).finally(() => {\n              that.confirmLoading = false;\n              that.close();\n            })\n          }else{\n             return false\n          }\n        })\n      },\n      handleCancel () {\n        this.close()\n      },\n      <#if form_popup>\n      popupCallback(value,row){\n         this.model = Object.assign(this.model, row);\n      },\n      </#if>\n      <#if form_cat_tree>\n      handleCategoryChange(value,backObj){\n        this.model = Object.assign(this.model, backObj);\n       },\n      </#if>\n      submitSuccess(formData,flag){\n        if(!formData.id){\n          let treeData = this.$refs.treeSelect.getCurrTreeData()\n          this.expandedRowKeys=[]\n          this.getExpandKeysByPid(formData[this.pidField],treeData,treeData)\n          this.$emit('ok',formData,this.expandedRowKeys.reverse());\n        }else{\n          this.$emit('ok',formData,flag);\n        }\n      },\n      getExpandKeysByPid(pid,arr,all){\n        if(pid && arr && arr.length>0){\n          for(let i=0;i<arr.length;i++){\n            if(arr[i].key==pid){\n              this.expandedRowKeys.push(arr[i].key)\n              this.getExpandKeysByPid(arr[i]['parentId'],all,all)\n            }else{\n              this.getExpandKeysByPid(pid,arr[i].children,all)\n            }\n          }\n        }\n      }\n      \n      \n    }\n  }\n</script>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei",
    "content": "﻿<#include \"/common/utils.ftl\">\n<#assign pidFieldName = \"\">\n<#assign hasChildrenField = \"\">\n<#assign bpm_flag=false>\n<#assign list_has_popup_dict=false>\n<#list originalColumns as po>\n  <#if po.fieldDbName == tableVo.extendParams.pidField>\n    <#assign pidFieldName = po.fieldName>\n  </#if>\n  <#if po.fieldDbName == tableVo.extendParams.hasChildren>\n    <#assign hasChildrenField = po.fieldName>\n  </#if>\n</#list>\n<#assign list_need_pca=false>\n<#assign buttonList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n  <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n</#if>\n<#-- 开始循环 -->\n<#list columns as po>\n  <#if po.fieldDbName=='bpm_status'>\n    <#assign bpm_flag=true>\n  </#if>\n<#if po.classType=='pca'>\n<#assign list_need_pca=true>\n</#if>\n<#if po.classType=='popup_dict'>\n<#assign list_has_popup_dict=true>\n</#if>\n</#list>\n<template>\n  <div>\n    <!--引用表格-->\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\" :expandedRowKeys=\"expandedRowKeys\" @expand=\"handleExpand\" @fetch-success=\"onFetchSuccess\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n          <a-button type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:add'\" @click=\"handleCreate\" preIcon=\"ant-design:plus-outlined\"> 新增</a-button>\n          <a-button  type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:exportXls'\"  preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n          <j-upload-button  type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:importExcel'\"  preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n       <#if buttonList?size gt 0>\n        <#list buttonList as btn>\n           <#if btn.buttonStyle == 'button'>\n             <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n           </#if>\n         </#list>\n       </#if>\n          <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button  v-auth=\"'${entityPackage}:${tableName}:deleteBatch'\">批量操作\n            <Icon icon=\"ant-design:down-outlined\"></Icon>\n          </a-button>\n        </a-dropdown>\n        <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n        <!-- 高级查询 -->\n        <super-query :config=\"superQueryConfig\" @search=\"handleSuperQuery\" />\n        <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\"/>\n      </template>\n      <!--字段回显插槽-->\n      <template v-slot:bodyCell=\"{ column, record, index, text }\">\n      <#list columns as po>\n        <#if po.classType=='umeditor' || po.classType=='pca' || po.classType=='file'>\n        <template v-if=\"column.dataIndex==='${po.fieldName}'\">\n        <#if po.classType=='umeditor'>\n          <!--富文本件字段回显插槽-->\n          <div v-html=\"text\"></div>\n        </#if>\n        <#if po.classType=='pca'>\n          <!--省市区字段回显插槽-->\n          {{ getAreaTextByCode(text) }}\n        </#if>\n        <#if po.classType=='file'>\n          <!--文件字段回显插槽-->\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n          <a-button v-else :ghost=\"true\" type=\"primary\" preIcon=\"ant-design:download-outlined\" size=\"small\" @click=\"downloadFile(text)\">下载</a-button>\n        </#if>\n        </template>\n        </#if>\n      </#list>\n      </template>\n    </BasicTable>\n    <!--字典弹窗-->\n    <${entityName}Modal @register=\"registerModal\" @success=\"handleSuccess\"/>\n   <#if bpm_flag==true>\n      <!-- 审批记录 -->\n      <BpmPictureModal @register=\"registerBpmModal\" />\n     </#if>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"${entityPackage}-${entityName?uncap_first}\" setup>\n  //ts语法\n  import {ref, reactive, computed, unref, toRaw, nextTick} from 'vue';\n  import {BasicTable, TableAction} from '/@/components/Table';\n  import {useModal} from '/@/components/Modal';\n  import { useListPage } from '/@/hooks/system/useListPage'\n  import ${entityName}Modal from './components/${entityName}Modal.vue';\n  import {columns, searchFormSchema, superQuerySchema} from './${entityName}.data';\n  import { downloadFile } from '/@/utils/common/renderUtils';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import {list, delete${entityName}, batchDelete${entityName}, getExportUrl,getImportUrl, getChildList,getChildListBatch} from './${entityName}.api';\n  <#if list_need_pca>\n  import { getAreaTextByCode } from '/@/components/Form/src/utils/Area';\n  </#if>\n  <#if list_has_popup_dict>\n   import {getPopDictByCode} from \"@/utils/dict\";\n   import {filterMultiDictText} from \"@/utils/dict/JDictSelectUtil\";\n  </#if>\n  import { getDateByPicker } from '/@/utils';\n  //日期个性化选择\n  const fieldPickers = reactive({\n  <#list columns as po>\n    <#if po.extendParams?exists && po.extendParams.picker?exists>\n    ${po.fieldName}: '${po.extendParams.picker}',\n    </#if>\n  </#list>\n  });\n  <#if bpm_flag==true>\n  import { startProcess } from '/@/api/common/api';\n  const [registerBpmModal, { openModal: bpmPicModal }] = useModal();\n  </#if>\n    const { createMessage } = useMessage();\n  const queryParam = reactive<any>({});\n  const expandedRowKeys = ref([]);\n  //字典model\n  const [registerModal, {openModal}] = useModal();\n   //注册table数据\n  const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({\n    tableProps:{\n         api: list,\n         title: '${tableVo.ftlDescription}',\n         columns,\n         canResize:true,\n         <#-- update-begin---author:chenrui ---date:20231228  for：[issue/#5658] 树表复选框与展开按钮重叠问题---------- -->\n         isTreeTable: true,\n         <#-- update-end---author:chenrui ---date:20231228  for：[issue/#5658] 树表复选框与展开按钮重叠问题---------- -->\n         formConfig: {\n           //labelWidth: 120,\n           schemas: searchFormSchema,\n           autoSubmitOnEnter:true,\n           showAdvancedButton:true,\n           fieldMapToNumber: [\n           <#list columns as po>\n           <#if po.isQuery=='Y'>\n           <#if po.queryMode=='group'>\n              <#-- update-begin---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n              <#if po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal' || po.classType=='time'>\n              <#-- update-end---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n              ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end']],\n           </#if>\n           </#if>\n           </#if>\n           </#list>\n           ],\n           fieldMapToTime: [\n           <#list columns as po>\n           <#if po.isQuery=='Y'>\n           <#if po.queryMode=='group'>\n           <#if po.classType=='date'>\n              ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end'], 'YYYY-MM-DD'],\n           <#elseif po.classType=='datetime'>\n              ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end'], 'YYYY-MM-DD HH:mm:ss'],\n           </#if>\n           </#if>\n           </#if>\n           </#list>\n           ],\n         },\n         actionColumn: {\n           width: 240,\n           fixed:'right'\n         },\n         beforeFetch: (params) => {\n           if (params && fieldPickers) {\n             for (let key in fieldPickers) {\n               if (params[key]) {\n                 params[key] = getDateByPicker(params[key], fieldPickers[key]);\n               }\n             }\n           }\n           params.hasQuery = \"true\";\n           return Object.assign(params, queryParam);\n         },\n         <#if list_has_popup_dict>\n         afterFetch: afterFetch\n         </#if>\n    },\n     exportConfig: {\n          name:\"${tableVo.ftlDescription}\",\n          url: getExportUrl,\n          params: queryParam,\n        },\n        importConfig: {\n          url: getImportUrl,\n          success: importSuccess\n        },\n    })\n\n  const [registerTable, {reload, collapseAll, updateTableDataRecord, findTableDataRecord,getDataSource},{ rowSelection, selectedRowKeys }] = tableContext\n\n<#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n  // 高级查询配置\n  const superQueryConfig = reactive(superQuerySchema);\n\n  /**\n   * 高级查询事件\n   */\n  function handleSuperQuery(params) {\n    Object.keys(params).map((k) => {\n      queryParam[k] = params[k];\n    });\n    reload();\n  }\n<#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n\n  /**\n   * 新增事件\n   */\n  function handleCreate() {\n    openModal(true, {\n      isUpdate: false,\n    });\n  }\n\n  /**\n   * 编辑事件\n   */\n  async function handleEdit(record) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n\n  /**\n   * 详情\n   */\n  async function handleDetail(record) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n      hideFooter: true,\n    });\n  }\n\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await delete${entityName}({id: record.id}, importSuccess);\n  }\n\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    const ids = selectedRowKeys.value.filter(item => !item.includes('loadChild'))\n    await batchDelete${entityName}({id: ids}, importSuccess);\n  }\n  /**\n   * 导入\n   */\n   function importSuccess() {\n    (selectedRowKeys.value = []) && reload();\n  }\n  /**\n   * 添加下级\n   */\n  function handleAddSub(record) {\n    openModal(true, {\n      record,\n      isUpdate: false,\n    });\n  }\n  /**\n   * 成功回调\n   */\n  async function handleSuccess({isUpdate, values, expandedArr, changeParent}) {\n    if (isUpdate) {\n      if (changeParent) {\n        reload();\n      } else {\n        let data = await list({ id: values.id, pageSize: 1, pageNo: 1, ${pidFieldName}: values['${pidFieldName}'] });\n        if (data && data.records && data.records.length > 0) {\n          // 编辑回调\n          updateTableDataRecord(values.id, data.records[0]);\n        }else{\n          updateTableDataRecord(values.id, values);\n        }\n      }\n    } else {\n        if(!values['id'] || !values['${pidFieldName}']){\n            //新增根节点\n            reload();\n        }else{\n            //新增子集\n            expandedRowKeys.value = [];\n            for (let key of unref(expandedArr)) {\n                await expandTreeNode(key)\n            }\n        }\n    }\n  }\n\n  /**\n   * 接口请求成功后回调\n   */\n  function onFetchSuccess(result) {\n      getDataByResult(result.items)&&loadDataByExpandedRows();\n  }\n  /**\n   * 根据已展开的行查询数据（用于保存后刷新时异步加载子级的数据）\n   */\n  async function loadDataByExpandedRows() {\n      if (unref(expandedRowKeys).length > 0) {\n          const res = await getChildListBatch({ parentIds: unref(expandedRowKeys).join(',')});\n          if (res.success && res.result.records.length>0) {\n              //已展开的数据批量子节点\n              let records = res.result.records\n              const listMap = new Map();\n              for (let item of records) {\n                  let pid = item['${pidFieldName}'];\n                  if (unref(expandedRowKeys).includes(pid)) {\n                      let mapList = listMap.get(pid);\n                      if (mapList == null) {\n                          mapList = [];\n                      }\n                      mapList.push(item);\n                      listMap.set(pid, mapList);\n                  }\n              }\n              let childrenMap = listMap;\n              let fn = (list) => {\n                  if(list) {\n                      list.forEach(data => {\n                          if (unref(expandedRowKeys).includes(data.id)) {\n                              data.children = getDataByResult(childrenMap.get(data.id))\n                              fn(data.children)\n                          }\n                      })\n                  }\n              };\n              fn(getDataSource())\n          }\n      }\n  }\n  /**\n   * 处理数据集\n   */\n  function getDataByResult(result){\n      if(result && result.length>0){\n          return result.map(item=>{\n              //判断是否标记了带有子节点\n              if(item[\"hasChild\"]=='1'){\n                  let loadChild = { id: item.id+'_loadChild', name: 'loading...', isLoading: true }\n                  item.children = [loadChild]\n              }\n              return item\n          })\n      }\n  }\n  /**\n   *树节点展开合并\n   * */\n  async function handleExpand(expanded, record) {\n    // 判断是否是展开状态，展开状态(expanded)并且存在子集(children)并且未加载过(isLoading)的就去查询子节点数据\n    if (expanded) {\n       expandedRowKeys.value.push(record.id)\n      if (record.children.length > 0 && !!record.children[0].isLoading) {\n        let result = await getChildList({${pidFieldName}: record.id});\n        result=result.records?result.records:result;\n        if (result && result.length > 0) {\n          record.children = getDataByResult(result);\n        } else {\n          record.children = null\n          record.hasChild = '0'\n        }\n      }\n    } else {\n      let keyIndex = expandedRowKeys.value.indexOf(record.id)\n      if (keyIndex >= 0) {\n        expandedRowKeys.value.splice(keyIndex, 1);\n      }\n    }\n  }\n  /**\n   *操作表格后处理树节点展开合并\n   * */\n  async function expandTreeNode(key) {\n    let record = findTableDataRecord(key)\n    expandedRowKeys.value.push(key);\n      let result = await getChildList({${pidFieldName}: key});\n      if (result && result.length > 0) {\n          record.children = getDataByResult(result);\n      } else {\n          record.children = null\n          record.hasChild = '0'\n      }\n      updateTableDataRecord(key, record);\n  }\n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n        auth: '${entityPackage}:${tableName}:edit'\n      },\n      {\n        label: '添加下级',\n        onClick: handleAddSub.bind(null, {${pidFieldName}: record.id}),\n      }\n    ]\n  }\n   /**\n    * 下拉操作栏\n    */\n   function getDropDownAction(record){\n     <#if bpm_flag==true>\n     let dropDownAction = [\n       {\n         label: '详情',\n         onClick: handleDetail.bind(null, record),\n       }, {\n         label: '删除',\n         popConfirm: {\n           title: '是否确认删除',\n           confirm: handleDelete.bind(null, record),\n           placement: 'topLeft'\n         },\n         auth: '${entityPackage}:${tableName}:delete'\n       },{\n            label: '审批进度',\n            onClick: handlePreviewPic.bind(null, record),\n            ifShow: !!record.bpmStatus && record.bpmStatus !== '1',\n          }\n   <#if buttonList?size gt 0>\n       <#list buttonList as btn>\n          <#if btn.buttonStyle == 'link'>\n          ,{\n             label: '${btn.buttonName}',\n             onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n           }\n          </#if>\n        </#list>\n    </#if>\n     ];\n     if(record.bpmStatus == '1' || !record.bpmStatus){\n       dropDownAction.push({\n         label: '发起流程',\n         popConfirm: {\n           title: '确认提交流程吗？',\n           confirm: handleProcess.bind(null, record),\n           placement: 'topLeft',\n         }\n       })\n     }\n     return dropDownAction;\n     <#else>\n     return [\n       {\n         label: '详情',\n         onClick: handleDetail.bind(null, record),\n       }, {\n         label: '删除',\n         popConfirm: {\n           title: '确定删除吗?',\n           confirm: handleDelete.bind(null, record),\n           placement: 'topLeft'\n         },\n         auth: '${entityPackage}:${tableName}:delete'\n       }\n  <#if buttonList?size gt 0>\n      <#list buttonList as btn>\n         <#if btn.buttonStyle == 'link'>\n         ,{\n            label: '${btn.buttonName}',\n            onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n          }\n         </#if>\n       </#list>\n   </#if>\n     ]\n     </#if>\n   }\n\n  <#if bpm_flag==true>\n  /**\n   * 提交流程\n   */\n  async function handleProcess(record) {\n    let params = {\n      flowCode: 'dev_${tableName}_001',\n      id: record.id,\n      formUrl: '${entityPackagePath}/components/${entityName}Form',\n      formUrlMobile: ''\n    }\n    await startProcess(params);\n    await reload();\n  }\n\n    /**\n       * 审批进度\n       */\n      async function handlePreviewPic(record) {\n        bpmPicModal(true, {\n          flowCode: 'dev_${tableName}_001',\n          dataId: record.id,\n        });\n      }\n  </#if>\n <#if list_has_popup_dict>\n   /**\n    * 翻译Popup字典配置\n   */\n    async function afterFetch(records){\n <#list columns as po>\n    <#if po.isQuery=='Y' || po.isShowList=='Y'>\n      <#if po.classType=='popup_dict' && list_has_popup_dict==true>\n      const ${po.fieldName}Keys = [...new Set(records.map((item) => item['${po.fieldName}']).flatMap((item) => item && item.split(',')))];\n      if(${po.fieldName}Keys && ${po.fieldName}Keys.length){\n       const dictOptions = await getPopDictByCode(${po.fieldName}Keys.join(','), '${po.dictTable},${po.dictField},${po.dictText}');\n       records.forEach((item) => {\n         item['${po.fieldName}_dictText'] = filterMultiDictText(dictOptions, item['${po.fieldName}']);\n       });\n      }\n      </#if>\n    </#if>\n </#list>\n     return records;\n   }\n    </#if>\n\n<#if buttonList?size gt 0>\n  <#list buttonList as btn>\n  <#if btn.buttonStyle=='button'>\n     function handle${btn.buttonCode?cap_first}(){\n        createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n     }\n  </#if>\n   <#if btn.buttonStyle=='link'>\n    function handle${btn.buttonCode?cap_first}(record){\n      createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n    }\n   </#if>\n  </#list>\n</#if>\n</script>\n\n<style lang=\"less\" scoped>\n<#include \"/common/form/vue3SearchStyle.ftl\">\n</style>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi",
    "content": "import {defHttp} from \"/@/utils/http/axios\";\nimport { useMessage } from \"/@/hooks/web/useMessage\";\n\nconst { createConfirm } = useMessage();\n\nenum Api {\n  list = '/${entityPackagePath}/${entityName?uncap_first}/rootList',\n  save='/${entityPackagePath}/${entityName?uncap_first}/add',\n  edit='/${entityPackagePath}/${entityName?uncap_first}/edit',\n  delete${entityName} = '/${entityPackagePath}/${entityName?uncap_first}/delete',\n  importExcel = '/${entityPackagePath}/${entityName?uncap_first}/importExcel',\n  exportXls = '/${entityPackagePath}/${entityName?uncap_first}/exportXls',\n  loadTreeData = '/${entityPackagePath}/${entityName?uncap_first}/loadTreeRoot',\n  getChildList = '/${entityPackagePath}/${entityName?uncap_first}/childList',\n  getChildListBatch = '/${entityPackagePath}/${entityName?uncap_first}/getChildListBatch',\n}\n\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n/**\n * 导入api\n * @param params\n */\nexport const getImportUrl = Api.importExcel;\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) =>\n  defHttp.get({url: Api.list, params});\n/**\n * 删除\n */\nexport const delete${entityName} = (params,handleSuccess) => {\n  return defHttp.delete({url: Api.delete${entityName}, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n/**\n * 批量删除\n * @param params\n */\nexport const batchDelete${entityName} = (params, handleSuccess) => {\n  createConfirm({\n    iconType: 'warning',\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({url: Api.delete${entityName}, data: params}, {joinParamsToUrl: true}).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n/**\n * 保存或者更新\n * @param params\n */\nexport const saveOrUpdateDict = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({url: url, params});\n}\n/**\n * 查询全部树形节点数据\n * @param params\n */\nexport const loadTreeData = (params) =>\n  defHttp.get({url: Api.loadTreeData,params});\n/**\n * 查询子节点数据\n * @param params\n */\nexport const getChildList = (params) =>\n  defHttp.get({url: Api.getChildList, params});\n/**\n * 批量查询子节点数据\n * @param params\n */\nexport const getChildListBatch = (params) =>\n  defHttp.get({url: Api.getChildListBatch, params},{isTransformResponse:false});\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi",
    "content": "<#include \"/common/utils.ftl\">\nimport {BasicColumn} from '/@/components/Table';\nimport {FormSchema} from '/@/components/Table';\nimport { rules} from '/@/utils/helper/validator';\nimport { render } from '/@/utils/common/renderUtils';\nimport { getWeekMonthQuarterYear } from '/@/utils';\n//列表数据\nexport const columns: BasicColumn[] = [\n <#list columns as po>\n   <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n   <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   {\n    title: '${po.filedComment}',\n    <#if po.fieldDbName == tableVo.extendParams.textField>\n    align: 'left',\n    <#else>\n    align: 'center',\n    </#if>\n    <#if po.sort=='Y'>\n    sorter: true,\n   </#if>\n    <#if po.classType=='date'>\n    dataIndex: '${po.fieldName}',\n    customRender:({text}) =>{\n      text = !text ? \"\" : (text.length > 10 ? text.substr(0,10) : text);\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      if(text) {\n        return getWeekMonthQuarterYear(text)['${po.extendParams.picker}'];\n      } else {\n        return text;\n      }\n      <#else>\n      return text;\n      </#if>\n    },\n    <#elseif po.fieldDbType=='Blob'>\n    dataIndex: '${po.fieldName}String'\n    <#elseif po.classType=='umeditor'>\n    dataIndex: '${po.fieldName}',\n    <#elseif po.classType=='pca'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='file'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='image'>\n    dataIndex: '${po.fieldName}',\n    customRender:render.renderImage,\n   <#elseif po.classType=='switch'>\n    dataIndex: '${po.fieldName}',\n<#assign switch_extend_arr=['Y','N']>\n<#if po.dictField?default(\"\")?contains(\"[\")>\n<#assign switch_extend_arr=po.dictField?eval>\n</#if>\n<#list switch_extend_arr as a>\n<#if a_index == 0>\n<#assign switch_extend_arr1=a>\n<#else>\n<#assign switch_extend_arr2=a>\n</#if>\n</#list>\n    customRender:({text}) => {\n       return  render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}])\n     },\n   <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict'  || po.classType=='link_table'>\n    dataIndex: '${po.fieldName}_dictText'\n   <#elseif po.classType=='cat_tree'>\n    dataIndex: '${po.fieldName}',\n    <#if po.dictText?default(\"\")?trim?length == 0>\n    customRender:({text}) => {\n       return  render.renderCategoryTree(text,'${po.dictField?default(\"\")}')\n   },\n   <#else>\n    customRender: ({text, record}) => (text ? record['${po.dictText}'] : '')\n   </#if>\n   <#else>\n    dataIndex: '${po.fieldName}'\n   </#if>\n   },\n   </#if>\n </#list>\n];\n//查询数据\nexport const searchFormSchema: FormSchema[] = [\n<#-- 开始循环 -->\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if po.isQuery=='Y' && po.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#assign query_flag=true>\n\t<#assign query_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n\t    <#assign query_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n    <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign query_field_dictCode=\"${po.dictField}\">\n    </#if>\n<#if po.queryMode=='single'>\n\t{\n      label: \"${po.filedComment}\",\n      field: \"${po.fieldName}\",\n<#if po.classType=='sel_search'>\n      component: 'JSearchSelect',\n      componentProps:{\n         dict:\"${query_field_dictCode}\"\n      },\n<#elseif po.classType=='sel_user'>\n<#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n      component: 'JSelectUser',\n<#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n      componentProps:{\n      <#if po.extendParams?exists && po.extendParams.text?exists>\n          labelKey: '${po.extendParams.text}',\n      </#if>\n      <#if po.extendParams?exists && po.extendParams.store?exists>\n          rowKey: '${po.extendParams.store}',\n      </#if>\n        },\n<#elseif po.classType=='switch'>\n      component: 'JSwitch',\n      componentProps:{\n           <#if po.dictField != 'is_open'>\n           options:\"${po.dictField}\"\n           </#if>\n       },\n <#elseif po.classType=='sel_depart'>\n      component: 'JSelectDept',\n      componentProps:{\n    <#if po.extendParams?exists && po.extendParams.text?exists>\n        labelKey: '${po.extendParams.text}',\n    </#if>\n    <#if po.extendParams?exists && po.extendParams.store?exists>\n        rowKey: '${po.extendParams.store}',\n    </#if>\n      },\n <#elseif po.classType=='list_multi'>\n      component: 'JSelectMultiple',\n       componentProps:{\n      <#if po.dictTable?default(\"\")?trim?length gt 1>\n         dictCode:\"${po.dictTable},${po.dictText},${po.dictField}\",\n      <#elseif po.dictField?default(\"\")?trim?length gt 1>\n         dictCode:\"${po.dictField}\",\n      </#if>\n         triggerChange: true\n      },\n <#elseif po.classType=='cat_tree'>\n      component: 'JCategorySelect',\n      componentProps:{\n          pcode:\"${po.dictField?default(\"\")}\",//back和事件未添加，暂时有问题\n      },\n<#elseif po.classType=='date'>\n      component: 'DatePicker',\n      componentProps: {\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        picker: '${po.extendParams.picker}',\n        </#if>\n        valueFormat: 'YYYY-MM-DD'\n      },     \n<#elseif po.classType=='datetime'>\n      component: 'DatePicker',\n      componentProps: {\n         showTime:true\n       },\n<#elseif po.classType=='datetime'>\n     component: 'DatePicker',\n     componentProps: {\n        showTime:true,\n        valueFormat: 'YYYY-MM-DD HH:mm:ss'\n      },\n<#elseif po.classType=='pca'>\n      component: 'JAreaLinkage',\n      componentProps: {\n        saveCode: 'region',\n      },\n<#elseif po.classType=='popup'>\n    <#include \"/common/form/vue3popup.ftl\">\n<#elseif po.classType=='popup_dict'>\n      component: 'JPopupDict',\n      componentProps: {\n        placeholder: '请选择${po.filedComment}',\n        dictCode: '${po.dictTable},${po.dictText},${po.dictField}',\n        multi: ${po.extendParams.popupMulti?c}\n      },\n<#elseif po.classType == 'sel_tree'>\n      component: 'JTreeSelect',\n      componentProps:{\n         <#if po.dictText??>\n           <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n         dict:\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\",\n           </#if>\n           <#if po.dictText?split(',')[1]??>\n         pidField:\"${po.dictText?split(',')[1]}\",\n           </#if>\n           <#if po.dictText?split(',')[3]??>\n         hasChildField:\"${po.dictText?split(',')[3]}\",\n           </#if>\n           </#if>\n         pidValue:\"${po.dictField}\",\n     },\n<#elseif po.classType=='link_table'>\n     component: 'JLinkTableCard',\n     componentProps: {\n      valueField: '${po.dictField}',\n      textField: '${po.dictText}',\n      tableName: '${po.dictTable}',\n      multi: <#if (po.queryMode!\"\") == \"multi\">true<#else>false</#if>\n     },\n<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>\n<#--  ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->\n      component: 'JSelectMultiple',\n      componentProps:{\n       <#if po.dictTable?default(\"\")?trim?length gt 1>\n          dictCode:\"${po.dictTable},${po.dictText},${po.dictField}\"\n       <#elseif po.dictField?default(\"\")?trim?length gt 1>\n          dictCode:\"${po.dictField}\"\n        </#if>\n      },\n<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n      component: 'InputNumber',\n<#else>\n      component: 'Input',\n</#if>\n      //colProps: {span: 6},\n     },\n<#elseif po.queryMode=='like'>\n  {\n    label: \"${po.filedComment}\",\n    field: \"${po.fieldName}\",\n    component: 'JInput',\n  },\n<#else>\n     {\n      label: \"${po.filedComment}\",\n      field: \"${po.fieldName}\",\n<#if po.classType=='date'>\n      component: 'RangePicker',\n      componentProps: {\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        picker: '${po.extendParams.picker}',\n        </#if>\n        valueType: 'Date',\n      },\n<#elseif po.classType=='datetime'>\n      component: 'RangePicker',\n      componentProps: {\n          valueType: 'Date',\n          showTime:true\n      },\n<#elseif po.classType == 'time'>\n      component: 'TimePicker',\n      componentProps:{\n        valueFormat: 'HH:mm:ss',\n      },\n<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n      component: 'JRangeNumber',\n<#-- update-begin---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n<#elseif po.classType=='time'>\n      component: 'RangeTime',\n<#-- update-end---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n<#else>\n      component: 'Input', //TODO 范围查询\n</#if>\n      //colProps: {span: 6},\n\t},\n</#if>\n</#if>\n</#list>\n<#-- 结束循环 -->\n];\n//表单数据\nexport const formSchema: FormSchema[] = [\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign bpm_flag=false>\n<#assign id_exists = false>\n<#list columns as po><#rt/>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.fieldDbName == 'id'>\n\t<#assign id_exists = true>\n</#if>\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if po.isShow =='Y' && po.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n  {\n    label: '${po.filedComment}',\n    field: ${autoStringSuffix(po)},\n<#-- update-begin-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n    <#if po.defaultVal??>\n    <#if po.fieldDbType==\"BigDecimal\" || po.fieldDbType==\"double\" || po.fieldDbType==\"int\">\n    defaultValue: ${po.defaultVal},\n    <#else>\n    defaultValue: \"${po.defaultVal}\",\n    </#if>\n    </#if>\n<#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n    <#if po.fieldDbName == tableVo.extendParams.pidField>\n    component: 'JTreeSelect',\n    componentProps: {\n      dict: \"${tableVo.tableName},${tableVo.extendParams.textField},id\",\n      pidField: \"${tableVo.extendParams.pidField}\",\n      pidValue: \"0\",\n      hasChildField: \"${tableVo.extendParams.hasChildren}\",\n    },\n    <#elseif po.classType =='date'>\n    component: 'DatePicker',\n    componentProps: {\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      picker: '${po.extendParams.picker}',\n      </#if>\n      valueFormat: 'YYYY-MM-DD'\n    },    \n     <#elseif po.classType =='datetime'>\n    component: 'DatePicker',\n    componentProps: {\n       showTime:true,\n       valueFormat: 'YYYY-MM-DD HH:mm:ss'\n     },\n    <#elseif po.classType =='time'>\n    component: 'TimePicker',\n    componentProps:{\n      valueFormat: 'HH:mm:ss',\n    },\n    <#elseif po.classType =='popup'>\n    <#include \"/common/form/vue3popup.ftl\">\n    <#elseif po.classType=='popup_dict'>\n    component: 'JPopupDict',\n    componentProps: {\n      placeholder: '请选择${po.filedComment}',\n      dictCode: '${po.dictTable},${po.dictText},${po.dictField}',\n      multi: ${po.extendParams.popupMulti?c}\n    },\n     <#elseif po.classType =='sel_depart'>\n     component: 'JSelectDept',\n     componentProps:{\n   <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   </#if>\n   <#if po.extendParams?exists && po.extendParams.store?exists>\n       rowKey: '${po.extendParams.store}',\n   </#if>\n     },\n     <#elseif po.classType =='switch'>\n     component: 'JSwitch',\n     componentProps:{\n         <#if po.dictField != 'is_open'>\n         options:${po.dictField}\n         </#if>\n     },\n     <#elseif po.classType =='pca'>\n     component: 'JAreaLinkage',\n     componentProps: {\n       saveCode: 'region',\n     },\n    <#elseif po.classType =='markdown'>\n    component: 'JMarkdownEditor',//注意string转换问题\n     <#elseif po.classType =='password'>\n    component: 'InputPassword',\n     <#elseif po.classType =='sel_user'>\n<#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n    component: 'JSelectUser',\n<#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n    componentProps:{\n  <#if po.extendParams?exists && po.extendParams.text?exists>\n      labelKey: '${po.extendParams.text}',\n  </#if>\n  <#if po.extendParams?exists && po.extendParams.store?exists>\n      rowKey: '${po.extendParams.store}',\n  </#if>\n    },\n    <#elseif po.classType =='textarea'>\n    component: 'InputTextArea',\n    <#elseif po.classType=='list'>\n    component: 'JDictSelectTag',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\",\n     <#if po.fieldDbType=='int'>\n        stringToNumber: true\n     </#if>\n     },\n    <#elseif po.classType=='radio'>\n    component: 'JDictSelectTag',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\",\n        type: \"radio\",\n    <#if po.fieldDbType=='int'>\n        stringToNumber: true\n     </#if>\n     },\n     <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- -->\n    <#elseif po.classType=='list_multi'>\n    component: 'JSelectMultiple',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n    <#elseif po.classType=='checkbox'>\n    component: 'JCheckbox',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n     <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- -->\n    <#elseif po.classType=='sel_search'>\n    component: 'JSearchSelect',\n    componentProps:{\n       dict:\"${form_field_dictCode}\"\n    },\n<#elseif po.classType=='cat_tree'>\n    <#assign form_cat_tree = true>\n    component: 'JCategorySelect',\n    componentProps:{\n       pcode:\"${po.dictField?default(\"\")}\", //TODO back和事件未添加，暂时有问题\n    },\n    <#if po.dictText?default(\"\")?trim?length gt 1>\n    <#assign form_cat_back = \"${po.dictText}\">\n    </#if>\n    <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n    component: 'InputNumber',\n    <#elseif po.classType=='file'>\n    component: 'JUpload',\n    componentProps:{\n    <#if po.uploadnum??>\n       maxCount:${po.uploadnum}\n   </#if>\n     },\n <#elseif po.classType=='image'>\n     component: 'JImageUpload',\n     componentProps:{\n     <#if po.uploadnum??>\n        fileMax:${po.uploadnum}\n     <#else>\n        fileMax: 0\n     </#if>\n      },\n  <#elseif po.classType=='umeditor'>\n    component: 'JEditor',\n  <#elseif po.classType == 'sel_tree'>\n    component: 'JTreeSelect',\n    componentProps:{\n        <#if po.dictText??>\n          <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n        dict:\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\",\n          </#if>\n          <#if po.dictText?split(',')[1]??>\n        pidField:\"${po.dictText?split(',')[1]}\",\n          </#if>\n          <#if po.dictText?split(',')[3]??>\n        hasChildField:\"${po.dictText?split(',')[3]}\",\n          </#if>\n        </#if>\n        pidValue:\"${po.dictField}\",\n    },\n   <#else>\n    component: 'Input',\n    </#if>\n     <#include \"/common/utils.ftl\">\n    <#if po.isShow == 'Y' && poHasCheck(po)>\n    dynamicRules: ({model,schema}) => {\n    <#if po.fieldName != 'id'>\n    <#assign fieldValidType = po.fieldValidType!''>\n          return [\n            <#-- 非空校验 -->\n           <#if po.nullable == 'N' || fieldValidType == '*'>\n                 { required: true, message: '请输入${po.filedComment}!'},\n           <#elseif fieldValidType!=''>\n                 { required: false},\n           </#if>\n       <#-- 唯一校验 -->\n           <#if fieldValidType == 'only'>\n                 {...rules.duplicateCheckRule(<#if sub?default(\"\")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'</#if>, '${po.fieldDbName}',model,schema)[0]},\n           <#-- 6到16位数字 -->\n           <#elseif fieldValidType == 'n6-16'>\n                 { pattern: /^\\d{6,16}$|^(?=\\d+\\.\\d+)[\\d.]{7,17}$/, message: '请输入6到16位数字!'},\n           <#-- 6到16位任意字符 -->\n           <#elseif fieldValidType == '*6-16'>\n                 { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},\n           <#-- 6到18位字母 -->\n           <#elseif fieldValidType == 's6-18'>\n                 { pattern:/^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},\n           <#-- 网址 -->\n           <#elseif fieldValidType == 'url'>\n                 { pattern: /^((ht|f)tps?):\\/\\/[\\w\\-]+(\\.[\\w\\-]+)+([\\w\\-.,@?^=%&:\\/~+#]*[\\w\\-@?^=%&\\/~+#])?$/, message: '请输入正确的网址!'},\n           <#-- 电子邮件 -->\n           <#elseif fieldValidType == 'e'>\n                 { pattern: /^([\\w]+\\.*)([\\w]+)@[\\w]+\\.\\w{3}(\\.\\w{2}|)$/, message: '请输入正确的电子邮件!'},\n           <#-- 手机号码 -->\n           <#elseif fieldValidType == 'm'>\n                 { pattern: /^1[3456789]\\d{9}$/, message: '请输入正确的手机号码!'},\n           <#-- 邮政编码 -->\n           <#elseif fieldValidType == 'p'>\n                 { pattern: /^[0-9]\\d{5}$/, message: '请输入正确的邮政编码!'},\n           <#-- 字母 -->\n           <#elseif fieldValidType == 's'>\n                 { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},\n           <#-- 数字 -->\n           <#elseif fieldValidType == 'n'>\n                 { pattern: /^-?\\d+\\.?\\d*$/, message: '请输入数字!'},\n           <#-- 整数 -->\n           <#elseif fieldValidType == 'z'>\n                 { pattern: /^-?\\d+$/, message: '请输入整数!'},\n           <#-- 金额 -->\n           <#elseif fieldValidType == 'money'>\n                 { pattern: /^(([1-9][0-9]*)|([0]\\.\\d{0,2}|[1-9][0-9]*\\.\\d{0,2}))$/, message: '请输入正确的金额!'},\n           <#-- 正则校验 -->\n           <#elseif fieldValidType != '' && fieldValidType != '*'>\n                 { pattern: '${fieldValidType}', message: '不符合校验规则!'},\n           <#-- 无校验 -->\n           <#else>\n               <#t>\n           </#if>\n          ];\n     </#if>\n     },\n    </#if>\n    <#if po.readonly=='Y'>\n    dynamicDisabled:true\n    </#if>\n  },\n</#if>\n</#list>\n<#if id_exists == false>\n\t// TODO 主键隐藏字段，目前写死为ID\n\t{\n\t  label: '',\n\t  field: 'id',\n\t  component: 'Input',\n\t  show: false\n\t},\n</#if>\n];\n\n<#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n// 高级查询数据\nexport const superQuerySchema = {\n  <#list columns as po>\n  <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n  <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  ${superQueryFieldListForVue3(po,po_index)},\n  </#if>\n  </#list>\n};\n<#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n\n\n/**\n* 流程表单调用这个方法获取formSchema\n* @param param\n*/\nexport function getBpmFormSchema(_formData): FormSchema[]{\n  // 默认和原始表单保持一致 如果流程中配置了权限数据，这里需要单独处理formSchema\n  return formSchema;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql",
    "content": "<#include \"/common/sql/menu_insert.ftl\">"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n    <div style=\"min-height: 400px\">\n        <BasicForm @register=\"registerForm\"></BasicForm>\n        <div style=\"width: 100%;text-align: center\" v-if=\"!formDisabled\">\n            <a-button @click=\"submitForm\" pre-icon=\"ant-design:check\" type=\"primary\">提 交</a-button>\n        </div>\n    </div>\n</template>\n\n<script lang=\"ts\">\n    import {BasicForm, useForm} from '/@/components/Form/index';\n    import {computed, defineComponent} from 'vue';\n    import {defHttp} from '/@/utils/http/axios';\n    import { propTypes } from '/@/utils/propTypes';\n    import {getBpmFormSchema} from '../${entityName}.data';\n    import {saveOrUpdateDict} from '../${entityName}.api';\n    \n    export default defineComponent({\n        name: \"${entityName}Form\",\n        components:{\n            BasicForm\n        },\n        props:{\n            formData: propTypes.object.def({}),\n            formBpm: propTypes.bool.def(true),\n        },\n        setup(props){\n            const [registerForm, { setFieldsValue, setProps, getFieldsValue }] = useForm({\n                labelWidth: 150,\n                schemas: getBpmFormSchema(props.formData),\n                showActionButtonGroup: false,\n                baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}},\n            });\n\n            const formDisabled = computed(()=>{\n                if(props.formData.disabled === false){\n                    return false;\n                }\n                return true;\n            });\n\n            let formData = {};\n            const queryByIdUrl = '/${entityPackagePath}/${entityName?uncap_first}/queryById';\n            async function initFormData(){\n                let params = {id: props.formData.dataId};\n                const data = await defHttp.get({url: queryByIdUrl, params});\n                formData = {...data}\n                //设置表单的值\n                await setFieldsValue(formData);\n                //默认是禁用\n                await setProps({disabled: formDisabled.value})\n            }\n\n            async function submitForm() {\n                let data = getFieldsValue();\n                let params = Object.assign({}, formData, data);\n                console.log('表单数据', params)\n                await saveOrUpdateDict(params, true)\n            }\n\n            initFormData();\n            \n            return {\n                registerForm,\n                formDisabled,\n                submitForm,\n            }\n        }\n    });\n</script>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei",
    "content": "﻿<#include \"/common/utils.ftl\">\n<#assign pidFieldName = \"\">\n<#assign hasChildrenField = \"\">\n<#list originalColumns as po>\n  <#if po.fieldDbName == tableVo.extendParams.pidField>\n    <#assign pidFieldName = po.fieldName>\n  </#if>\n  <#if po.fieldDbName == tableVo.extendParams.hasChildren>\n    <#assign hasChildrenField = po.fieldName>\n  </#if>\n</#list>\n<#assign buttonList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n  <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n</#if>\n<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" destroyOnClose :maxHeight=\"500\" :width=\"${getModalWidth(tableVo.fieldRowNum?default(1))}\" :title=\"getTitle\" @ok=\"handleSubmit\">\n    <BasicForm @register=\"registerForm\" name=\"${entityName}Form\" />\n  <#if buttonList?? && buttonList?size gt 0>\n     <template #insertFooter>\n      <#list buttonList as btn>\n       <#if btn.buttonStyle=='form'>\n         <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n       </#if>\n      </#list>\n     </template>\n  </#if>\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import {ref, computed, unref, reactive} from 'vue';\n  import {BasicModal, useModalInner} from '/@/components/Modal';\n  import {BasicForm, useForm} from '/@/components/Form';\n  import {formSchema} from '../${entityName}.data';\n  import {loadTreeData, saveOrUpdateDict} from '../${entityName}.api';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { getDateByPicker } from '/@/utils';\n  //日期个性化选择\n  const fieldPickers = reactive({\n  <#list columns as po>\n    <#if po.extendParams?exists && po.extendParams.picker?exists>\n    ${po.fieldName}: '${po.extendParams.picker}',\n    </#if>\n  </#list>\n  });\n  const { createMessage } = useMessage();\n  // 获取emit\n  const emit = defineEmits(['register', 'success']);\n  const isUpdate = ref(true);\n  const isDetail = ref(false);\n  const expandedRowKeys = ref([]);\n  const treeData = ref([]);\n  // 当前编辑的数据\n  let model:Nullable<Recordable> = null;\n  //表单配置\n  const [registerForm, { setProps,resetFields, setFieldsValue, validate, updateSchema, scrollToField }] = useForm({\n    schemas: formSchema,\n    showActionButtonGroup: false,\n    baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}},\n    labelCol: {\n      xs: { span: 24 },\n      sm: { span: 4 },\n    },\n    wrapperCol: {\n      xs: { span: 24 },\n      sm: { span: 18 },\n    },\n    baseRowStyle: { padding: \"0 20px\" }\n  });\n  //表单赋值\n  const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    expandedRowKeys.value = [];\n    setModalProps({confirmLoading: false, minHeight: 80 ,showOkBtn: !!!data?.hideFooter});\n    isUpdate.value = !!data?.isUpdate;\n    isDetail.value = !!data?.showFooter;\n    if (data?.record) {\n      model = data.record;\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n      updateSchema([\n        {\n          field: '${pidFieldName}',\n          componentProps: { hiddenNodeKey: data.record.id },\n        },\n      ]);\n    } else {\n      model = null;\n      updateSchema([\n        {\n          field: '${pidFieldName}',\n          componentProps: { hiddenNodeKey: '' },\n        },\n      ]);\n    }\n    //父级节点树信息\n    treeData.value = await loadTreeData({'async': false,'pcode':''});\n    // 隐藏底部时禁用整个表单\n    setProps({ disabled: !!data?.hideFooter })\n  });\n  //设置标题\n  const getTitle = computed(() => (!unref(isUpdate) ? '新增' : !unref(isDetail) ? '详情' : '编辑'));\n\n  /**\n   * 根据pid获取展开的节点\n   * @param pid\n   * @param arr\n   */\n  function getExpandKeysByPid(pid,arr){\n    if(pid && arr && arr.length>0){\n      for(let i=0;i<arr.length;i++){\n        if(arr[i].key==pid && unref(expandedRowKeys).indexOf(pid)<0){\n          expandedRowKeys.value.push(arr[i].key);\n          getExpandKeysByPid(arr[i]['parentId'],unref(treeData))\n        }else{\n          getExpandKeysByPid(pid,arr[i].children)\n        }\n      }\n    }\n  }\n  //表单提交事件\n  async function handleSubmit() {\n    try {\n      let values = await validate();\n      // 预处理日期数据\n      changeDateValue(values);\n      setModalProps({confirmLoading: true});\n      //提交表单\n      await saveOrUpdateDict(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //展开的节点信息\n      await getExpandKeysByPid(values['${pidFieldName}'],unref(treeData))\n      //刷新列表(isUpdate:是否编辑;values:表单信息;expandedArr:展开的节点信息)\n      emit('success', {\n        isUpdate: unref(isUpdate),\n        values: {...values},\n        expandedArr: unref(expandedRowKeys).reverse(),\n        // 是否更改了父级节点\n        changeParent: model != null && (model['${pidFieldName}'] != values['${pidFieldName}']),\n      });\n    } catch ({ errorFields }) {\n      if (errorFields) {\n        const firstField = errorFields[0];\n        if (firstField) {\n          scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });\n        }\n      }\n      return Promise.reject(errorFields);\n    } finally {\n      setModalProps({confirmLoading: false});\n    }\n  }\n\n  /**\n   * 处理日期值\n   * @param formData 表单数据\n   */\n  const changeDateValue = (formData) => {\n      if (formData && fieldPickers) {\n          for (let key in fieldPickers) {\n              if (formData[key]) {\n                  formData[key] = getDateByPicker(formData[key], fieldPickers[key]);\n              }\n          }\n      }\n  };\n\n<#if buttonList?size gt 0>\n<#list buttonList as btn>\n    <#if btn.buttonStyle=='form'>\n       function handle${btn.buttonCode?cap_first}(){\n          createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n       }\n    </#if>\n</#list>\n</#if>\n</script>\n<style lang=\"less\" scoped>\n\t/** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-calendar-picker) {\n    width: 100%;\n  }\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei",
    "content": "﻿<#include \"/common/utils.ftl\">\n<template>\n  <div class=\"p-2\">\n<#assign pidFieldName = \"\">\n<#assign hasChildrenField = \"\">\n<#list originalColumns as po>\n  <#if po.fieldDbName == tableVo.extendParams.pidField>\n    <#assign pidFieldName = po.fieldName>\n  </#if>\n  <#if po.fieldDbName == tableVo.extendParams.hasChildren>\n    <#assign hasChildrenField = po.fieldName>\n  </#if>\n</#list>  \n<#assign query_field_no=0>  \n<#assign need_category = false>\n<#assign need_pca = false>\n<#assign need_search = false>\n<#assign need_dept_user = false>\n<#assign need_switch = false>\n<#assign need_dept = false>\n<#assign need_multi = false>\n<#assign need_popup = false>\n<#assign need_popup_dict = false>\n<#assign need_select_tag = false>\n<#assign need_select_tree = false>\n<#assign need_time = false>\n<#assign bpm_flag=false>\n<#assign need_markdown = false>\n<#assign need_upload = false>\n<#assign need_image_upload = false>\n<#assign need_editor = false>\n<#assign need_checkbox = false>\n<#assign need_range_number = false>\n<#assign is_range = false>\n<#assign is_like = false>\n<#assign buttonList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n  <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n</#if>\n<#assign query_flag = false>\n    <!--查询区域-->\n    <div class=\"jeecg-basic-table-form-container\">\n      <a-form @keyup.enter.native=\"searchQuery\" :model=\"queryParam\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\">\n        <a-row :gutter=\"24\">\n<#-- 开始循环 -->\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.classType=='cat_tree' && po.dictText?default(\"\")?trim?length == 0>\n<#assign need_category=true>\n</#if>\n<#if po.classType=='pca'>\n<#assign need_pca=true>\n</#if>\n<#if po.classType=='sel_search'>\n<#assign need_search = true>\n</#if>\n<#if po.classType=='sel_user'>\n<#assign need_dept_user = true>\n</#if>\n<#if po.classType=='sel_depart'>\n<#assign need_dept = true>\n</#if>\n<#if po.classType=='switch'>\n<#assign need_switch = true>\n</#if>\n<#if po.classType=='list_multi'>\n<#assign need_multi = true>\n</#if>\n<#if po.classType=='popup'>\n<#assign need_popup = true>\n</#if>\n<#if po.classType=='popup_dict'>\n<#assign need_popup_dict = true>\n</#if>\n<#if po.classType=='sel_tree'>\n<#assign need_select_tree = true>\n</#if>\n<#if po.classType=='time'>\n<#assign need_time = true>\n</#if>\n<#if po.queryMode=='group' && (po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal')>\n<#assign need_range_number = true>\n</#if>\n<#if po.queryMode=='group'>\n<#assign is_range = true>\n</#if>\n<#if po.queryMode=='like'>\n<#assign is_like = true>\n</#if>\n  <#include \"/common/form/native/vue3NativeSearch.ftl\">\n</#list>\n<#if query_field_no gt 2>\n          </template>\n</#if>\n<#if query_flag>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left; overflow: hidden\" class=\"table-page-search-submitButtons\">\n              <a-col :lg=\"6\">\n                <a-button type=\"primary\" preIcon=\"ant-design:search-outlined\" @click=\"searchQuery\">查询</a-button>\n                <a-button type=\"primary\" preIcon=\"ant-design:reload-outlined\" @click=\"searchReset\" style=\"margin-left: 8px\">重置</a-button>\n                <a @click=\"toggleSearchStatus = !toggleSearchStatus\" style=\"margin-left: 8px\">\n                  {{ toggleSearchStatus ? '收起' : '展开' }}\n                  <Icon :icon=\"toggleSearchStatus ? 'ant-design:up-outlined' : 'ant-design:down-outlined'\" />\n                </a>\n              </a-col>\n            </span>\n          </a-col>\n</#if>\n        </a-row>\n      </a-form>\n    </div>\n<#-- 结束循环 -->\n    <!--引用表格-->\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\" :expandedRowKeys=\"expandedRowKeys\" @expand=\"handleExpand\" @fetch-success=\"onFetchSuccess\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-button type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:add'\"  @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\"> 新增</a-button>\n        <a-button  type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:exportXls'\"  preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n        <j-upload-button  type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:importExcel'\"  preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n   <#if buttonList?size gt 0>\n    <#list buttonList as btn>\n       <#if btn.buttonStyle == 'button'>\n         <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"ant-design:${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n       </#if>\n     </#list>\n   </#if>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button v-auth=\"'${entityPackage}:${tableName}:deleteBatch'\"\n            >批量操作\n            <Icon icon=\"ant-design:down-outlined\"></Icon>\n          </a-button>\n        </a-dropdown>\n        <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n        <!-- 高级查询 -->\n        <super-query :config=\"superQueryConfig\" @search=\"handleSuperQuery\" />\n        <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\" />\n      </template>\n      <!--字段回显插槽-->\n      <template v-slot:bodyCell=\"{ column, record, index, text }\">\n      <#list columns as po>\n        <#if po.classType=='umeditor' || po.classType=='pca' || po.classType=='file'>\n        <template v-if=\"column.dataIndex==='${po.fieldName}'\">\n        <#if po.classType=='umeditor'>\n          <!--富文本件字段回显插槽-->\n          <div v-html=\"text\"></div>\n        </#if>\n        <#if po.classType=='pca'>\n          <!--省市区字段回显插槽-->\n          {{ getAreaTextByCode(text) }}\n        </#if>\n        <#if po.classType=='file'>\n          <!--文件字段回显插槽-->\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n          <a-button v-else :ghost=\"true\" type=\"primary\" preIcon=\"ant-design:download-outlined\" size=\"small\" @click=\"downloadFile(text)\">下载</a-button>\n        </#if>\n        </template>\n        </#if>\n      </#list>\n      </template>\n    </BasicTable>\n    <!-- 表单区域 -->\n    <${entityName}Modal ref=\"registerModal\" @success=\"handleSuccess\"></${entityName}Modal>\n    <#if bpm_flag==true>\n      <!-- 审批记录 -->\n      <BpmPictureModal @register=\"registerBpmModal\" />\n    </#if>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"${entityPackage}-${entityName?uncap_first}\" setup>\n  import { ref, reactive, unref } from 'vue';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { columns, superQuerySchema } from './${entityName}.data';\n  import {list, delete${entityName}, batchDelete${entityName}, getExportUrl,getImportUrl, getChildList,getChildListBatch} from './${entityName}.api';\n  import { downloadFile } from '/@/utils/common/renderUtils';\n  import ${entityName}Modal from './components/${entityName}Modal.vue'\n  import { useMessage } from '/@/hooks/web/useMessage';\n  <#include \"/common/form/native/vue3NativeImport.ftl\">\n<#if need_category>\n  import { loadCategoryData } from '/@/api/common/api';\n  import { getAuthCache, setAuthCache } from '/@/utils/auth';\n  import { DB_DICT_DATA_KEY } from '/@/enums/cacheEnum';\n</#if>\n<#if need_pca>\n  import { getAreaTextByCode } from '/@/components/Form/src/utils/Area';\n</#if>\n  import { getDateByPicker } from '/@/utils';\n  <#if need_popup_dict>\n import {getPopDictByCode} from \"@/utils/dict\";\n import {filterMultiDictText} from \"@/utils/dict/JDictSelectUtil\";\n  </#if>\n<#if is_range>\n  import { cloneDeep } from \"lodash-es\";\n</#if>\n  <#if bpm_flag==true>\n  import { startProcess } from '/@/api/common/api';\n  const [registerBpmModal, { openModal: bpmPicModal }] = useModal();\n  </#if>\n  const fieldPickers = reactive({\n  <#list columns as po>\n    <#if po.extendParams?exists && po.extendParams.picker?exists>\n    ${po.fieldName}: '${po.extendParams.picker}',\n    </#if>\n  </#list>\n  });\n  const { createMessage } = useMessage();\n  const expandedRowKeys = ref([]);\n  const queryParam = ref<any>({});\n  const toggleSearchStatus = ref<boolean>(false);\n  const registerModal = ref();\n  //注册table数据\n  const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({\n    tableProps: {\n      title: '${tableVo.ftlDescription}',\n      api: list,\n      columns,\n      canResize:true,\n      useSearchForm: false,\n      isTreeTable: true,\n      actionColumn: {\n        width: 120,\n        fixed: 'right',\n      },\n      beforeFetch: async (params) => {\n        params.hasQuery = \"true\";\n       <#if is_range>\n        let rangerQuery = await setRangeQuery();\n        return Object.assign(params, rangerQuery);\n       <#else>\n        for (let key in fieldPickers) {\n          if (queryParam[key] && fieldPickers[key]) {\n            queryParam[key] = getDateByPicker(queryParam[key], fieldPickers[key]);\n          }\n        }\n        return Object.assign(params, queryParam.value);\n       </#if>\n      },\n      <#if need_popup_dict>\n      afterFetch: afterFetch\n      </#if>\n    },\n    exportConfig: {\n      name: \"${tableVo.ftlDescription}\",\n      url: getExportUrl,\n    },\n\t  importConfig: {\n\t    url: getImportUrl,\n\t    success: success\n\t  },\n  });\n  const [registerTable, {reload, collapseAll, updateTableDataRecord, findTableDataRecord,getDataSource},{ rowSelection, selectedRowKeys }] = tableContext\n  const labelCol = reactive({\n    xs:24,\n    sm:4,\n    xl:6,\n    xxl:4\n  });\n  const wrapperCol = reactive({\n    xs: 24,\n    sm: 20,\n  });\n\n<#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n  // 高级查询配置\n  const superQueryConfig = reactive(superQuerySchema);\n\n  /**\n   * 高级查询事件\n   */\n  function handleSuperQuery(params) {\n    Object.keys(params).map((k) => {\n      queryParam.value[k] = params[k];\n    });\n    reload();\n  }\n<#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n\n  /**\n   * 新增事件\n   */\n  function handleAdd() {\n    registerModal.value.disableSubmit = false;\n    registerModal.value.add();\n  }\n\n  /**\n   * 编辑事件\n   */\n  async function handleEdit(record) {\n    registerModal.value.disableSubmit = false;\n    registerModal.value.edit(record);\n  }\n\n  /**\n   * 详情\n   */\n  async function handleDetail(record) {\n    registerModal.value.disableSubmit = true;\n    registerModal.value.edit(record);\n  }\n\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await delete${entityName}({ id: record.id }, success);\n  }\n\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    const ids = selectedRowKeys.value.filter((item) => !item.includes('loadChild'));\n    await batchDelete${entityName}({ id: ids }, success);\n  }\n  \n  /**\n   * 成功回调刷新页面\n   */\n  function success() {\n    (selectedRowKeys.value = []) && reload();\n  }\n\n  /**\n   * 添加下级\n   */\n  function handleAddSub(record) {\n    registerModal.value.disableSubmit = false;\n    registerModal.value.add(record);\n  }\n\n  /**\n   * 成功回调\n   */\n  async function handleSuccess({ isUpdate, values, expandedArr, changeParent }) {\n    if (isUpdate) {\n      if (changeParent) {\n        reload();\n      } else {\n        let data = await list({ id: values.id, pageSize: 1, pageNo: 1, ${pidFieldName}: values['${pidFieldName}'] });\n        if (data && data.records && data.records.length > 0) {\n          // 编辑回调\n          updateTableDataRecord(values.id, data.records[0]);\n        }else{\n          updateTableDataRecord(values.id, values);\n        }\n      }\n    } else {\n      if (!values['id'] || !values['pid']) {\n        //新增根节点\n        reload();\n      } else {\n        //新增子集\n        expandedRowKeys.value = [];\n        for (let key of unref(expandedArr)) {\n          await expandTreeNode(key);\n        }\n      }\n    }\n  }\n   \n  /**\n   * 接口请求成功后回调\n   */\n  function onFetchSuccess(result) {\n    getDataByResult(result.items) && loadDataByExpandedRows();\n  }\n   \n  /**\n   * 根据已展开的行查询数据（用于保存后刷新时异步加载子级的数据）\n   */\n  async function loadDataByExpandedRows() {\n    if (unref(expandedRowKeys).length > 0) {\n      const res = await getChildListBatch({ parentIds: unref(expandedRowKeys).join(',') });\n      if (res.success && res.result.records.length > 0) {\n        //已展开的数据批量子节点\n        let records = res.result.records;\n        const listMap = new Map();\n        for (let item of records) {\n          let pid = item['${pidFieldName}'];\n          if (unref(expandedRowKeys).includes(pid)) {\n            let mapList = listMap.get(pid);\n            if (mapList == null) {\n              mapList = [];\n            }\n            mapList.push(item);\n            listMap.set(pid, mapList);\n          }\n        }\n        let childrenMap = listMap;\n        let fn = (list) => {\n          if (list) {\n            list.forEach((data) => {\n              if (unref(expandedRowKeys).includes(data.id)) {\n                data.children = getDataByResult(childrenMap.get(data.id));\n                fn(data.children);\n              }\n            });\n          }\n        };\n        fn(getDataSource());\n      }\n    }\n  }\n   \n  /**\n   * 处理数据集\n   */\n  function getDataByResult(result) {\n    if (result && result.length > 0) {\n      return result.map((item) => {\n        //判断是否标记了带有子节点\n        if (item['hasChild'] == '1') {\n          let loadChild = { id: item.id + '_loadChild', name: 'loading...', isLoading: true };\n          item.children = [loadChild];\n        }\n        return item;\n      });\n    }\n  }\n   \n  /**\n   *树节点展开合并\n   */\n  async function handleExpand(expanded, record) {\n    // 判断是否是展开状态，展开状态(expanded)并且存在子集(children)并且未加载过(isLoading)的就去查询子节点数据\n    if (expanded) {\n      expandedRowKeys.value.push(record.id);\n      if (record.children.length > 0 && !!record.children[0].isLoading) {\n        let result = await getChildList({ ${pidFieldName}: record.id});\n        result = result.records ? result.records : result;\n        if (result && result.length > 0) {\n          record.children = getDataByResult(result);\n        } else {\n          record.children = null;\n          record.hasChild = '0';\n        }\n      }\n    } else {\n      let keyIndex = expandedRowKeys.value.indexOf(record.id);\n      if (keyIndex >= 0) {\n        expandedRowKeys.value.splice(keyIndex, 1);\n      }\n    }\n  }\n   \n  /**\n   * 操作表格后处理树节点展开合并\n   */\n  async function expandTreeNode(key) {\n    let record = findTableDataRecord(key);\n    expandedRowKeys.value.push(key);\n    let result = await getChildList({ ${pidFieldName}: key });\n    if (result && result.length > 0) {\n      record.children = getDataByResult(result);\n    } else {\n      record.children = null;\n      record.hasChild = '0';\n    }\n    updateTableDataRecord(key, record);\n  }  \n   \n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n        auth: '${entityPackage}:${tableName}:edit'\n      }\n    ];\n  }\n\n\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record){\n    <#if bpm_flag==true>\n    let dropDownAction = [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      },\n      {\n        label: '添加下级',\n        onClick: handleAddSub.bind(null, { pid: record.id }),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '确定删除吗?',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft'\n        },\n        auth: '${entityPackage}:${tableName}:delete'\n      },\n       {\n         label: '审批进度',\n         onClick: handlePreviewPic.bind(null, record),\n         ifShow: !!record.bpmStatus && record.bpmStatus !== '1',\n       }\n<#if buttonList?size gt 0>\n    <#list buttonList as btn>\n       <#if btn.buttonStyle == 'link'>\n       ,{\n          label: '${btn.buttonName}',\n          onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n        }\n       </#if>\n     </#list>\n </#if>\n    ];\n    if(record.bpmStatus == '1' || !record.bpmStatus){\n      dropDownAction.push({\n        label: '发起流程',\n        popConfirm: {\n          title: '确认提交流程吗？',\n          confirm: handleProcess.bind(null, record),\n          placement: 'topLeft',\n        }\n      })\n    }\n    return dropDownAction;\n    <#else>\n    return [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      },\n      {\n        label: '添加下级',\n        onClick: handleAddSub.bind(null, { pid: record.id }),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '确定删除吗?',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft',\n        },\n        auth: '${entityPackage}:${tableName}:delete'\n      }\n<#if buttonList?size gt 0>\n   <#list buttonList as btn>\n      <#if btn.buttonStyle == 'link'>\n      ,{\n         label: '${btn.buttonName}',\n         onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n       }\n      </#if>\n    </#list>\n</#if>\n    ];\n    </#if>\n  }\n\n  <#if bpm_flag==true>\n  /**\n   * 提交流程\n   */\n  async function handleProcess(record) {\n    let params = {\n      flowCode: 'dev_${tableName}_001',\n      id: record.id,\n      formUrl: '${entityPackagePath}/components/${entityName}Form',\n      formUrlMobile: ''\n    }\n    await startProcess(params);\n    await reload();\n  }\n   /**\n   * 审批进度\n   */\n  async function handlePreviewPic(record) {\n    bpmPicModal(true, {\n      flowCode: 'dev_${tableName}_001',\n      dataId: record.id,\n    });\n  }\n  </#if>\n<#if buttonList?size gt 0>\n  <#list buttonList as btn>\n  <#if btn.buttonStyle=='button'>\n     function handle${btn.buttonCode?cap_first}(){\n        createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n     }\n  </#if>\n   <#if btn.buttonStyle=='link'>\n    function handle${btn.buttonCode?cap_first}(record){\n      createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n    }\n   </#if>\n  </#list>\n</#if>\n\n  /**\n   * 查询\n   */\n  function searchQuery() {\n    reload();\n  }\n  \n  /**\n   * 重置\n   */\n  function searchReset() {\n    queryParam.value = {};\n    selectedRowKeys.value = [];\n    //刷新数据\n    reload();\n  }\n  \n  <#if need_popup>\n  /**\n   *  popup组件值改变事件\n   */\n  function setFieldsValue(map) {\n    Object.keys(map).map((key) => {\n      queryParam.value[key] = map[key];\n    });\n  }\n  </#if>\n\n  <#if need_pca || need_dept_user>\n  /**\n   * form点击事件(以逗号分割)\n   * @param key\n   * @param value\n   */\n  function handleFormJoinChange(key, value) {\n    if (typeof value != 'string') {\n      queryParam.value[key] = value.join(',');\n    }\n  }\n  </#if>\n\n  <#if need_category>\n  /**\n   * form点击事件\n   * @param value\n   */\n  function handleFormChange(key, value) {\n    queryParam.value[key] = value;\n  }\n  \n  /**\n   * 初始化字典配置\n   */\n  function initDictConfig() {\n  <#list columns as po>\n  <#if (po.isQuery=='Y' || po.isShowList=='Y') && po.classType!='popup'>\n    <#if po.classType=='cat_tree' && need_category==true>\n    loadCategoryData({code:'${po.dictField?default(\"\")}'}).then((res) => {\n      if (res) {\n        let allDictDate = getAuthCache(DB_DICT_DATA_KEY);\n        if(!allDictDate['${po.dictField?default(\"\")}']){\n          Object.assign(allDictDate,{'${po.dictField?default(\"\")}':res})\n        }\n        setAuthCache(DB_DICT_DATA_KEY,allDictDate)\n      }\n    });\n     </#if>\n   </#if>\n   </#list>\n  }\n  initDictConfig();\n    </#if>\n  <#if is_range>\n  \n  let rangeField = '${getRangeField(columns)}'\n  \n  /**\n   * 设置范围查询条件\n   */\n  async function setRangeQuery(){\n    let queryParamClone = cloneDeep(queryParam.value);\n    if (rangeField) {\n      let fieldsValue = rangeField.split(',');\n      fieldsValue.forEach(item => {\n        if (queryParamClone[item]) {\n          let range = queryParamClone[item];\n          queryParamClone[item+'_begin'] = range[0];\n          queryParamClone[item+'_end'] = range[1];\n          delete queryParamClone[item];\n        } else {\n          queryParamClone[item+'_begin'] = '';\n          queryParamClone[item+'_end'] = '';\n        }\n      })\n    }\n    return queryParamClone;\n  }\n  </#if>\n\n   <#if need_popup_dict>\n     /**\n      * 翻译Popup字典配置\n     */\n      async function afterFetch(records){\n   <#list columns as po>\n      <#if po.isQuery=='Y' || po.isShowList=='Y'>\n        <#if po.classType=='popup_dict'>\n        const ${po.fieldName}Keys = [...new Set(records.map((item) => item['${po.fieldName}']).flatMap((item) => item && item.split(',')))];\n        if(${po.fieldName}Keys && ${po.fieldName}Keys.length){\n         const dictOptions = await getPopDictByCode(${po.fieldName}Keys.join(','), '${po.dictTable},${po.dictField},${po.dictText}');\n         records.forEach((item) => {\n           item['${po.fieldName}_dictText'] = filterMultiDictText(dictOptions, item['${po.fieldName}']);\n         });\n        }\n        </#if>\n      </#if>\n   </#list>\n       return records;\n     }\n  </#if>\n</script>\n\n<style lang=\"less\" scoped>\n<#include \"/common/form/native/vueNativeSearchStyle.ftl\">\n</style>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi",
    "content": "import { defHttp } from \"/@/utils/http/axios\";\nimport { useMessage } from \"/@/hooks/web/useMessage\";\n\nconst { createConfirm } = useMessage();\n\nenum Api {\n  list = '/${entityPackagePath}/${entityName?uncap_first}/rootList',\n  save='/${entityPackagePath}/${entityName?uncap_first}/add',\n  edit='/${entityPackagePath}/${entityName?uncap_first}/edit',\n  delete${entityName} = '/${entityPackagePath}/${entityName?uncap_first}/delete',\n  importExcel = '/${entityPackagePath}/${entityName?uncap_first}/importExcel',\n  exportXls = '/${entityPackagePath}/${entityName?uncap_first}/exportXls',\n  loadTreeData = '/${entityPackagePath}/${entityName?uncap_first}/loadTreeRoot',\n  getChildList = '/${entityPackagePath}/${entityName?uncap_first}/childList',\n  getChildListBatch = '/${entityPackagePath}/${entityName?uncap_first}/getChildListBatch',\n}\n\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n\n/**\n * 导入api\n * @param params\n */\nexport const getImportUrl = Api.importExcel;\n\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) => defHttp.get({ url: Api.list, params });\n\n/**\n * 删除\n * @param params\n * @param handleSuccess\n */\nexport const delete${entityName} = (params,handleSuccess) => {\n  return defHttp.delete({ url: Api.delete${entityName}, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n}\n\n/**\n * 批量删除\n * @param params\n * @param handleSuccess\n */\nexport const batchDelete${entityName} = (params, handleSuccess) => {\n  createConfirm({\n    iconType: 'warning',\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.delete${entityName}, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n\n/**\n * 保存或者更新\n * @param params\n * @param isUpdate\n */\nexport const saveOrUpdateDict = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({ url: url, params },{ isTransformResponse:false });\n}\n\n/**\n * 查询全部树形节点数据\n * @param params\n */\nexport const loadTreeData = (params) => defHttp.get({ url: Api.loadTreeData,params });\n\n/**\n * 查询子节点数据\n * @param params\n */\nexport const getChildList = (params) => defHttp.get({ url: Api.getChildList, params });\n  \n/**\n * 批量查询子节点数据\n * @param params\n */\nexport const getChildListBatch = (params) => defHttp.get({ url: Api.getChildListBatch, params },{ isTransformResponse:false });\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi",
    "content": "<#include \"/common/utils.ftl\">\nimport {BasicColumn} from '/@/components/Table';\nimport {FormSchema} from '/@/components/Table';\nimport { rules} from '/@/utils/helper/validator';\nimport { render } from '/@/utils/common/renderUtils';\nimport { getWeekMonthQuarterYear } from '/@/utils';\n//列表数据\nexport const columns: BasicColumn[] = [\n <#list columns as po>\n   <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n   <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  {\n    title: '${po.filedComment}',\n    <#if po.fieldDbName == tableVo.extendParams.textField>\n    align: 'left',\n    <#else>\n    align: 'center',\n    </#if>\n    <#if po.sort=='Y'>\n    sorter: true,\n   </#if>\n    <#if po.classType=='date'>\n    dataIndex: '${po.fieldName}',\n    customRender:({text}) =>{\n      text = !text ? \"\" : (text.length > 10 ? text.substr(0,10) : text);\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      if(text) {\n        return getWeekMonthQuarterYear(text)['${po.extendParams.picker}'];\n      } else {\n        return text;\n      }\n      <#else>\n      return text;\n      </#if>\n    },\n    <#elseif po.fieldDbType=='Blob'>\n    dataIndex: '${po.fieldName}String'\n    <#elseif po.classType=='umeditor'>\n    dataIndex: '${po.fieldName}',\n    <#elseif po.classType=='pca'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='file'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='image'>\n    dataIndex: '${po.fieldName}',\n    customRender: render.renderImage,\n   <#elseif po.classType=='switch'>\n    dataIndex: '${po.fieldName}',\n<#assign switch_extend_arr=['Y','N']>\n<#if po.dictField?default(\"\")?contains(\"[\")>\n<#assign switch_extend_arr=po.dictField?eval>\n</#if>\n<#list switch_extend_arr as a>\n<#if a_index == 0>\n<#assign switch_extend_arr1=a>\n<#else>\n<#assign switch_extend_arr2=a>\n</#if>\n</#list>\n    customRender:({text}) => {\n       return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}]);\n    },\n   <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict'>\n    dataIndex: '${po.fieldName}_dictText'\n   <#elseif po.classType=='cat_tree'>\n    dataIndex: '${po.fieldName}',\n    <#if po.dictText?default(\"\")?trim?length == 0>\n    customRender:({text}) => {\n       return render.renderCategoryTree(text,'${po.dictField?default(\"\")}');\n   },\n   <#else>\n    customRender: ({text, record}) => (text ? record['${po.dictText}'] : '');\n   </#if>\n   <#else>\n    dataIndex: '${po.fieldName}'\n   </#if>\n  },\n   </#if>\n </#list>\n];\n\n<#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n// 高级查询数据\nexport const superQuerySchema = {\n  <#list columns as po>\n  <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n  <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  ${superQueryFieldListForVue3(po,po_index)},\n  </#if>\n  </#list>\n};\n<#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql",
    "content": "<#include \"/common/sql/menu_insert.ftl\">"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n  <a-spin :spinning=\"confirmLoading\">\n    <JFormContainer :disabled=\"disabled\">\n      <template #detail>\n        <a-form ref=\"formRef\" class=\"antd-modal-form\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" name=\"${entityName}Form\">\n          <a-row>\n<#assign need_category = false>\n<#assign bpm_flag=false>\n<#assign need_pca = false>\n<#assign need_search = false>\n<#assign need_dept_user = false>\n<#assign need_switch = false>\n<#assign need_dept = false>\n<#assign need_multi = false>\n<#assign need_popup = false>\n<#assign need_popup_dict = false>\n<#assign need_select_tag = false>\n<#assign need_select_tree = false>\n<#assign need_time = false>\n<#assign need_markdown = false>\n<#assign need_upload = false>\n<#assign need_image_upload = false>\n<#assign need_editor = false>\n<#assign need_checkbox = false>\n<#assign need_range_number = false>\n<#assign is_like = false>\n<#assign pidFieldName = \"\">\n<#assign hasOnlyValidate = false>\n<#assign form_span = 24>\n<#if tableVo.fieldRowNum==2>\n<#assign form_span = 12>\n<#elseif tableVo.fieldRowNum==3>\n<#assign form_span = 8>\n<#elseif tableVo.fieldRowNum==4>\n<#assign form_span = 6>\n</#if>\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.isShow == 'Y' && po.fieldValidType?default(\"\") == 'only'>\n  <#assign hasOnlyValidate = true>\n</#if>\n          <#if po.fieldDbName == tableVo.extendParams.pidField>\n                <#assign pidFieldName = po.fieldName>\n                <#assign need_select_tree = true>\n            <a-col :span=\"${form_span}\">\n              <a-form-item label=\"父级节点\" v-bind=\"validateInfos.${autoStringSuffixForModel(po)}\">\n                <j-tree-select\n                  placeholder=\"请选择${po.filedComment}\"\n                  v-model:value=\"formData.${po.fieldName}\"\n                  dict=\"${tableVo.tableName},${tableVo.extendParams.textField},id\"\n                  pidField=\"${tableVo.extendParams.pidField}\"\n                  pidValue=\"0\"\n                  hasChildField=\"${tableVo.extendParams.hasChildren}\"\n                  :hiddenNodeKey=\"hiddenNodeKey\"\n                  <#if po.readonly=='Y'>disabled<#else>:disabled=\"disabled\"</#if>>\n                </j-tree-select>\n              </a-form-item>\n            </a-col>\n          </#if>    \n  <#assign formEntityName>${entityName}Form</#assign>\n  <#include \"/common/form/native/vue3NativeForm.ftl\">\n</#list>\n          <#if bpm_flag>\n            <a-col v-if=\"showFlowSubmitButton\" :span=\"24\" style=\"width: 100%;text-align: center;\">\n              <a-button preIcon=\"ant-design:check-outlined\" style=\"width: 126px\" type=\"primary\" @click=\"submitForm\">提 交</a-button>\n            </a-col>\n          </#if>\n          </a-row>\n        </a-form>\n      </template>\n    </JFormContainer>\n  </a-spin>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, reactive, defineExpose, nextTick, unref, defineProps, computed, onMounted } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  <#include \"/common/form/native/vue3NativeImport.ftl\">\n  import { getDateByPicker, getValueType } from '/@/utils';\n  import {loadTreeData, saveOrUpdateDict} from '../${entityName}.api';\n  import { Form } from 'ant-design-vue';\n  import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';\n  <#if hasOnlyValidate == true>\n  import { duplicateValidate } from '/@/utils/helper/validator'\n  </#if>\n  <#if bpm_flag>\n  import { usePermission } from '/@/hooks/web/usePermission';\n  const { isDisabledAuth, hasPermission, initBpmFormData } = usePermission();\n  </#if>\n  const useForm = Form.useForm;\n  const formRef = ref();\n  const isUpdate = ref(true);\n  const expandedRowKeys = ref([]);\n  const treeData = ref([]);\n  const pidField = ref<string>('pid');\n  const emit = defineEmits(['register', 'ok']);\n  let model: Nullable<Recordable> = null;\n  const formData = reactive<Record<string, any>>({\n    id: '',\n    <#include \"/common/init/native/vue3NativeInitValue.ftl\">\n  });\n  const { createMessage } = useMessage();\n  const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });\n  const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });\n  const confirmLoading = ref<boolean>(false);\n  //需要隐藏的key\n  const hiddenNodeKey = ref<string>('');\n  //表单验证\n  const validatorRules = reactive({\n  <#include \"/common/validatorRulesTemplate/native/vue3MainNative.ftl\">\n  });\n  const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });\n  //日期个性化选择\n  const fieldPickers = reactive({\n  <#list columns as po>\n    <#if po.extendParams?exists && po.extendParams.picker?exists>\n    ${po.fieldName}: '${po.extendParams.picker}',\n    </#if>\n  </#list>\n  });\n  const props = defineProps({\n    formDisabled: { type: Boolean, default: false },\n    formData: { type: Object, default: () => ({}) },\n    formBpm: { type: Boolean, default: true }\n  });\n\n  // 表单禁用\n  const disabled = computed(()=>{\n    if(props.formBpm === true){\n      if(props.formData.disabled === false){\n        return false;\n      }else{\n        return true;\n      }\n    }\n    return props.formDisabled;\n  });\n\n  <#if bpm_flag>\n  onMounted(()=>{\n    initBpmFormData(props.formData);\n    initFormData();\n  });\n  //渲染流程表单数据\n  const queryByIdUrl = '/${entityPackagePath}/${entityName?uncap_first}/queryById';\n  async function initFormData(){\n    if(props.formBpm === true){\n      let params = {id: props.formData.dataId};\n      const data = await defHttp.get({url: queryByIdUrl, params});\n      //设置表单的值\n      edit({...data});\n    }\n  }\n  // 是否显示提交按钮\n  const showFlowSubmitButton = computed(()=>{\n    if(props.formBpm === true){\n      if(props.formData.disabled === false){\n        return true\n      }\n    }\n    return false\n  });\n  </#if>\n  \n  /**\n   * 新增\n   */\n  function add(obj = {}) {\n    edit(obj);\n  }\n\n  /**\n   * 编辑\n   */\n  function edit(record) {\n    nextTick(async () => {\n      resetFields();\n      expandedRowKeys.value = [];\n      treeData.value = await loadTreeData({ async: false, pcode: '' });\n      const tmpData = {};\n      Object.keys(formData).forEach((key) => {\n        if(record.hasOwnProperty(key)){\n          tmpData[key] = record[key]\n        }\n      })\n      //赋值\n      Object.assign(formData,tmpData);\n      if(tmpData.id) {\n        hiddenNodeKey.value = tmpData.id;\n      } else {\n        hiddenNodeKey.value = \"\";\n      }\n      model = tmpData\n    });\n  }\n\n  /**\n   * 根据pid获取展开的节点\n   * @param pid\n   * @param arr\n   */\n  function getExpandKeysByPid(pid, arr) {\n    if (pid && arr && arr.length > 0) {\n      for (let i = 0; i < arr.length; i++) {\n        if (arr[i].key == pid && unref(expandedRowKeys).indexOf(pid) < 0) {\n          expandedRowKeys.value.push(arr[i].key);\n          getExpandKeysByPid(arr[i]['parentId'], unref(treeData));\n        } else {\n          getExpandKeysByPid(pid, arr[i].children);\n        }\n      }\n    }\n  }\n\n  /**\n   * 提交数据\n   */\n  async function submitForm() {\n    try {\n      // 触发表单验证\n      await validate();\n    } catch ({ errorFields }) {\n      if (errorFields) {\n        const firstField = errorFields[0];\n        if (firstField) {\n          formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });\n        }\n      }\n      return Promise.reject(errorFields);\n    }\n    confirmLoading.value = true;\n    const isUpdate = ref<boolean>(false);\n    //时间格式化\n    if (formData.id) {\n      isUpdate.value = true;\n    }\n    //循环数据\n    for (let data in formData) {\n      // 更新个性化日期选择器的值\n      model[data] = getDateByPicker(model[data], fieldPickers[data]);\n      //如果该数据是数组并且是字符串类型\n      if (formData[data] instanceof Array) {\n        let valueType = getValueType(formRef.value.getProps, data);\n        //如果是字符串类型的需要变成以逗号分割的字符串\n        if (valueType === 'string') {\n          formData[data] = formData[data].join(',');\n        }\n      }\n    }\n    await saveOrUpdateDict(formData, isUpdate.value)\n      .then(async (res) => {\n        if (res.success) {\n          await getExpandKeysByPid(formData['${pidFieldName}'], unref(treeData));\n          delete formData['children'];\n          emit('ok', {\n            isUpdate: unref(isUpdate),\n            values: { ...formData },\n            expandedArr: unref(expandedRowKeys).reverse(),\n            // 是否更改了父级节点\n            changeParent: model != null && model['${pidFieldName}'] != formData['${pidFieldName}'],\n          });\n          createMessage.success(res.message);\n        } else {\n          createMessage.warning(res.message);\n        }\n      })\n      .finally(() => {\n        confirmLoading.value = false;\n      });\n  }\n\n\t<#if need_popup>\n  /**\n   *  popup组件值改变事件\n   */\n  function setFieldsValue(map) {\n    Object.keys(map).map((key) => {\n      formData[key] = map[key];\n    });\n  }\n\t</#if>\n\n\t<#if need_category || need_select_tree>\n  /**\n   * 值改变事件触发\n   * @param key\n   * @param value\n   */\n  function handleFormChange(key, value) {\n    formData[key] = value;\n  }\n  </#if>\n\n  <#list columns as po>\n  <#if po.isShow == 'Y' && po.fieldValidType?default(\"\") == 'only'>\n  async function ${po.fieldName}Duplicatevalidate(_r, value) {\n    return duplicateValidate('${tableName}', '${po.fieldDbName}', value, formData.id || '')\n  }\n  </#if>\n  </#list>\n  defineExpose({\n    add,\n    edit,\n    submitForm,\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .antd-modal-form {\n    padding: 14px 20px;\n  }\n</style>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/default/tree/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n<#assign buttonList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n  <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n</#if>\n  <j-modal :title=\"title\" maxHeight=\"500px\" :width=\"${getModalWidth(tableVo.fieldRowNum?default(1))}\" :visible=\"visible\" @ok=\"handleOk\" :okButtonProps=\"{ class: { 'jee-hidden': disableSubmit } }\" @cancel=\"handleCancel\" cancelText=\"关闭\">\n    <${entityName}Form ref=\"registerForm\" @ok=\"submitCallback\" :formDisabled=\"disableSubmit\" :formBpm=\"false\"></${entityName}Form>\n    <template #footer>\n       <#if buttonList?? && buttonList?size gt 0>\n       <#list buttonList as btn>\n        <#if btn.buttonStyle=='form'>\n          <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"ant-design:${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n        </#if>\n       </#list>\n       </#if>\n      <a-button @click=\"handleCancel\">取消</a-button>\n      <a-button :class=\"{ 'jee-hidden': disableSubmit }\" type=\"primary\" @click=\"handleOk\">确认</a-button>\n    </template>\n  </j-modal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, nextTick, defineExpose } from 'vue';\n  import ${entityName}Form from './${entityName}Form.vue'\n  import JModal from '/@/components/Modal/src/JModal/JModal.vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  const { createMessage } = useMessage();\n\n  const title = ref<string>('');\n  const width = ref<number>(800);\n  const visible = ref<boolean>(false);\n  const disableSubmit = ref<boolean>(false);\n  const registerForm = ref();\n  const emit = defineEmits(['register', 'success']);\n  \n  /**\n   * 新增\n   */\n  function add(obj={}) {\n    title.value = '新增';\n    visible.value = true;\n    nextTick(() => {\n      registerForm.value.add(obj);\n    });\n  }\n  \n  /**\n   * 编辑\n   * @param record\n   */\n  function edit(record) {\n    title.value = disableSubmit.value ? '详情' : '编辑';\n    visible.value = true;\n    nextTick(() => {\n      registerForm.value.edit(record);\n    });\n  }\n  \n  /**\n   * 确定按钮点击事件\n   */\n  function handleOk() {\n    registerForm.value.submitForm();\n  }\n\n  /**\n   * form保存回调事件\n   */\n  function submitCallback({ isUpdate, values, expandedArr, changeParent }) {\n    handleCancel();\n    emit('success', {\n      isUpdate: isUpdate,\n      values: values,\n      expandedArr: expandedArr,\n      // 是否更改了父级节点\n      changeParent: changeParent,\n    });\n  }\n  \n  /**\n   * 取消按钮回调事件\n   */\n  function handleCancel() {\n    visible.value = false;\n  }\n\n  defineExpose({\n    add,\n    edit,\n    disableSubmit,\n  });\n</script>\n\n<style lang=\"less\">\n  /**隐藏样式-modal确定按钮 */\n  .jee-hidden {\n    display: none !important;\n  }\n</style>\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai",
    "content": "package ${bussiPackage}.${entityPackage}.controller;\n\nimport org.jeecg.common.system.query.QueryGenerator;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport org.jeecg.common.system.query.QueryRuleEnum;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.common.api.vo.Result;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport org.springframework.web.servlet.ModelAndView;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecgframework.poi.excel.entity.enmus.ExcelType;\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.service.I${sub.entityName}Service;\n</#list>\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport java.io.IOException;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\n<#assign has_multi_query_field=false>\n<#list originalColumns as po>\n<#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')>\n   <#assign has_multi_query_field=true>\n</#if>\n</#list>\n<#assign enhanceJavaList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.enhanceJavaList??>\n  <#assign enhanceJavaList = tableVo.extendParams.enhanceJavaList?filter(enhance -> enhance??)>\n</#if>\n /**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Tag(name=\"${tableVo.ftlDescription}\")\n@RestController\n@RequestMapping(\"/${entityPackagePath}/${entityName?uncap_first}\")\n@Slf4j\npublic class ${entityName}Controller extends JeecgController<${entityName}, I${entityName}Service> {\n\n\t@Autowired\n\tprivate I${entityName}Service ${entityName?uncap_first}Service;\n\t<#list subTables as sub>\n\n\t@Autowired\n\tprivate I${sub.entityName}Service ${sub.entityName?uncap_first}Service;\n\t</#list>\n\n\n\t/*---------------------------------主表处理-begin-------------------------------------*/\n\n\t/**\n\t * 分页列表查询\n\t * @param ${entityName?uncap_first}\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t//@AutoLog(value = \"${tableVo.ftlDescription}-分页列表查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-分页列表查询\")\n\t@GetMapping(value = \"/list\")\n\tpublic Result<IPage<${entityName}>> queryPageList(${entityName} ${entityName?uncap_first},\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t   HttpServletRequest req) {\n    <#if enhanceJavaList?size gt 0>\n     <#list enhanceJavaList as enhanceJava>\n     <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'>\n           //TODO 查询前触发的方法，代码生成后，请手工实现增强类逻辑;\n           //${entityName?uncap_first}Service.beforeQuery()\n     </#if>\n     </#list>\n    </#if>\n    <#if has_multi_query_field>\n        // 自定义查询规则\n        Map<String, QueryRuleEnum> customeRuleMap = new HashMap<>();\n        // 自定义多选的查询规则为：LIKE_WITH_OR\n    <#list originalColumns as po>\n        <#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')>\n        customeRuleMap.put(\"${po.fieldName}\", QueryRuleEnum.LIKE_WITH_OR);\n        </#if>\n    </#list>\n        QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap(),customeRuleMap);\n    <#else>\n      \tQueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap());\n    </#if>\n\t\tPage<${entityName}> page = new Page<${entityName}>(pageNo, pageSize);\n\t\tIPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper);\n<#if enhanceJavaList?size gt 0>\n <#list enhanceJavaList as enhanceJava>\n <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'>\n      //TODO 查询后触发的方法，代码生成后，请手工实现增强类逻辑;\n       //${entityName?uncap_first}Service.afterQuery()\n </#if>\n </#list>\n</#if>\n\t\treturn Result.OK(pageList);\n\t}\n\n\t/**\n     *   添加\n     * @param ${entityName?uncap_first}\n     * @return\n     */\n    @AutoLog(value = \"${tableVo.ftlDescription}-添加\")\n    @Operation(summary=\"${tableVo.ftlDescription}-添加\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:add\")\n    @PostMapping(value = \"/add\")\n    public Result<String> add(@RequestBody ${entityName} ${entityName?uncap_first}) {\n     <#if enhanceJavaList?size gt 0>\n       <#list enhanceJavaList as enhanceJava>\n       <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='start'  && enhanceJava.activeStatus=='1'>\n           //TODO 新增前的处理方法，代码生成后，请手工实现增强类逻辑;\n           //${entityName?uncap_first}Service.beforeAdd()\n       </#if>\n       </#list>\n     </#if>\n        ${entityName?uncap_first}Service.save(${entityName?uncap_first});\n<#if enhanceJavaList?size gt 0>\n  <#list enhanceJavaList as enhanceJava>\n  <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='end'  && enhanceJava.activeStatus=='1'>\n       //TODO 新增后的处理方法，代码生成后，请手工实现增强类逻辑;\n       //${entityName?uncap_first}Service.afterAdd()\n   </#if>\n  </#list>\n</#if>\n        return Result.OK(\"添加成功！\");\n    }\n\n    /**\n     *  编辑\n     * @param ${entityName?uncap_first}\n     * @return\n     */\n    @AutoLog(value = \"${tableVo.ftlDescription}-编辑\")\n    @Operation(summary=\"${tableVo.ftlDescription}-编辑\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:edit\")\n    @RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n    public Result<String> edit(@RequestBody ${entityName} ${entityName?uncap_first}) {\n<#if enhanceJavaList?size gt 0>\n  <#list enhanceJavaList as enhanceJava>\n  <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='start'  && enhanceJava.activeStatus=='1'>\n       //TODO 编辑前，代码生成后，请手工实现增强类逻辑;\n       //${entityName?uncap_first}Service.beforeEdit()\n  </#if>\n  </#list>\n</#if>\n        ${entityName?uncap_first}Service.updateById(${entityName?uncap_first});\n<#if enhanceJavaList?size gt 0>\n  <#list enhanceJavaList as enhanceJava>\n  <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'>\n      //TODO 编辑后，代码生成后，请手工实现增强类逻辑;\n      //${entityName?uncap_first}Service.afterEdit()\n  </#if>\n  </#list>\n</#if>\n        return Result.OK(\"编辑成功!\");\n    }\n\n    /**\n     * 通过id删除\n     * @param id\n     * @return\n     */\n    @AutoLog(value = \"${tableVo.ftlDescription}-通过id删除\")\n    @Operation(summary=\"${tableVo.ftlDescription}-通过id删除\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:delete\")\n    @DeleteMapping(value = \"/delete\")\n    public Result<String> delete(@RequestParam(name=\"id\",required=true) String id) {\n        ${entityName?uncap_first}Service.delMain(id);\n        return Result.OK(\"删除成功!\");\n    }\n\n    /**\n     * 批量删除\n     * @param ids\n     * @return\n     */\n    @AutoLog(value = \"${tableVo.ftlDescription}-批量删除\")\n    @Operation(summary=\"${tableVo.ftlDescription}-批量删除\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:deleteBatch\")\n    @DeleteMapping(value = \"/deleteBatch\")\n    public Result<String> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n        this.${entityName?uncap_first}Service.delBatchMain(Arrays.asList(ids.split(\",\")));\n        return Result.OK(\"批量删除成功!\");\n    }\n\n    /**\n     * 导出\n     * @return\n     */\n    @RequiresPermissions(\"${entityPackage}:${tableName}:exportXls\")\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) {\n <#if enhanceJavaList?size gt 0>\n  <#list enhanceJavaList as enhanceJava>\n  <#if enhanceJava.buttonCode=='export' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'>\n       //TODO 导出前，代码生成后，请手工实现增强类逻辑;\n       //${entityName?uncap_first}Service.beforeExport()\n  </#if>\n  </#list>\n </#if>\n        return super.exportXls(request, ${entityName?uncap_first}, ${entityName}.class, \"${tableVo.ftlDescription}\");\n    }\n\n    /**\n     * 导入\n     * @return\n     */\n    @RequiresPermissions(\"${entityPackage}:${tableName}:importExcel\")\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n       <#if enhanceJavaList?size gt 0>\n        <#list enhanceJavaList as enhanceJava>\n        <#if enhanceJava.buttonCode=='import' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'>\n             //TODO 导入前，代码生成后，请手工实现增强类逻辑;\n             //${entityName?uncap_first}Service.beforeImport()\n        </#if>\n        </#list>\n       </#if>\n        return super.importExcel(request, response, ${entityName}.class);\n    }\n\t/*---------------------------------主表处理-end-------------------------------------*/\n\t\n\t<#list subTables as sub>\n\n    /*--------------------------------子表处理-${sub.ftlDescription}-begin----------------------------------------------*/\n\t/**\n\t * 通过主表ID查询\n\t * @return\n\t */\n\t//@AutoLog(value = \"${sub.ftlDescription}-通过主表ID查询\")\n\t@Operation(summary=\"${sub.ftlDescription}-通过主表ID查询\")\n\t@GetMapping(value = \"/list${sub.entityName}ByMainId\")\n    public Result<IPage<${sub.entityName}>> list${sub.entityName}ByMainId(${sub.entityName} ${sub.entityName?uncap_first},\n                                                    @RequestParam(name = \"pageNo\", defaultValue = \"1\") Integer pageNo,\n                                                    @RequestParam(name = \"pageSize\", defaultValue = \"10\") Integer pageSize,\n                                                    HttpServletRequest req) {\n        QueryWrapper<${sub.entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${sub.entityName?uncap_first}, req.getParameterMap());\n        Page<${sub.entityName}> page = new Page<${sub.entityName}>(pageNo, pageSize);\n        IPage<${sub.entityName}> pageList = ${sub.entityName?uncap_first}Service.page(page, queryWrapper);\n        return Result.OK(pageList);\n    }\n\n\t/**\n\t * 添加\n\t * @param ${sub.entityName?uncap_first}\n\t * @return\n\t */\n\t@AutoLog(value = \"${sub.ftlDescription}-添加\")\n\t@Operation(summary=\"${sub.ftlDescription}-添加\")\n\t@PostMapping(value = \"/add${sub.entityName}\")\n\tpublic Result<String> add${sub.entityName}(@RequestBody ${sub.entityName} ${sub.entityName?uncap_first}) {\n\t\t${sub.entityName?uncap_first}Service.save(${sub.entityName?uncap_first});\n\t\treturn Result.OK(\"添加成功！\");\n\t}\n\n    /**\n\t * 编辑\n\t * @param ${sub.entityName?uncap_first}\n\t * @return\n\t */\n\t@AutoLog(value = \"${sub.ftlDescription}-编辑\")\n\t@Operation(summary=\"${sub.ftlDescription}-编辑\")\n\t@RequestMapping(value = \"/edit${sub.entityName}\", method = {RequestMethod.PUT,RequestMethod.POST})\n\tpublic Result<String> edit${sub.entityName}(@RequestBody ${sub.entityName} ${sub.entityName?uncap_first}) {\n\t\t${sub.entityName?uncap_first}Service.updateById(${sub.entityName?uncap_first});\n\t\treturn Result.OK(\"编辑成功!\");\n\t}\n\n\t/**\n\t * 通过id删除\n\t * @param id\n\t * @return\n\t */\n\t@AutoLog(value = \"${sub.ftlDescription}-通过id删除\")\n\t@Operation(summary=\"${sub.ftlDescription}-通过id删除\")\n\t@DeleteMapping(value = \"/delete${sub.entityName}\")\n\tpublic Result<String> delete${sub.entityName}(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${sub.entityName?uncap_first}Service.removeById(id);\n\t\treturn Result.OK(\"删除成功!\");\n\t}\n\n\t/**\n\t * 批量删除\n\t * @param ids\n\t * @return\n\t */\n\t@AutoLog(value = \"${sub.ftlDescription}-批量删除\")\n\t@Operation(summary=\"${sub.ftlDescription}-批量删除\")\n\t@DeleteMapping(value = \"/deleteBatch${sub.entityName}\")\n\tpublic Result<String> deleteBatch${sub.entityName}(@RequestParam(name=\"ids\",required=true) String ids) {\n\t    this.${sub.entityName?uncap_first}Service.removeByIds(Arrays.asList(ids.split(\",\")));\n\t\treturn Result.OK(\"批量删除成功!\");\n\t}\n\n    /**\n     * 导出\n     * @return\n     */\n    @RequestMapping(value = \"/export${sub.entityName}\")\n    public ModelAndView export${sub.entityName}(HttpServletRequest request, ${sub.entityName} ${sub.entityName?uncap_first}) {\n\t\t // Step.1 组装查询条件\n\t\t QueryWrapper<${sub.entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${sub.entityName?uncap_first}, request.getParameterMap());\n\t\t LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\n\t\t // Step.2 获取导出数据\n\t\t List<${sub.entityName}> pageList = ${sub.entityName?uncap_first}Service.list(queryWrapper);\n\t\t List<${sub.entityName}> exportList = null;\n\n\t\t // 过滤选中数据\n\t\t String selections = request.getParameter(\"selections\");\n\t\t if (oConvertUtils.isNotEmpty(selections)) {\n\t\t\t List<String> selectionList = Arrays.asList(selections.split(\",\"));\n\t\t\t exportList = pageList.stream().filter(item -> selectionList.contains(item.getId())).collect(Collectors.toList());\n\t\t } else {\n\t\t\t exportList = pageList;\n\t\t }\n\n\t\t // Step.3 AutoPoi 导出Excel\n\t\t ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n\t\t //此处设置的filename无效,前端会重更新设置一下\n\t\t mv.addObject(NormalExcelConstants.FILE_NAME, \"${sub.ftlDescription}\");\n\t\t mv.addObject(NormalExcelConstants.CLASS, ${sub.entityName}.class);\n\t\t mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(\"${sub.ftlDescription}报表\", \"导出人:\" + sysUser.getRealname(), \"${sub.ftlDescription}\", ExcelType.XSSF));\n\t\t mv.addObject(NormalExcelConstants.DATA_LIST, exportList);\n\t\t return mv;\n    }\n\n    /**\n     * 导入\n     * @return\n     */\n    @RequestMapping(value = \"/import${sub.entityName}/{mainId}\")\n    public Result<?> import${sub.entityName}(HttpServletRequest request, HttpServletResponse response, @PathVariable(\"mainId\") String mainId) {\n\t\t MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n\t\t Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n\t\t for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n       // 获取上传文件对象\n\t\t\t MultipartFile file = entity.getValue();\n\t\t\t ImportParams params = new ImportParams();\n\t\t\t params.setTitleRows(2);\n\t\t\t params.setHeadRows(1);\n\t\t\t params.setNeedSave(true);\n\t\t\t try {\n\t\t\t\t List<${sub.entityName}> list = ExcelImportUtil.importExcel(file.getInputStream(), ${sub.entityName}.class, params);\n\t\t\t\t for (${sub.entityName} temp : list) {\n\t\t\t\t\t<#list sub.foreignKeys as key>\n                    temp.set${key?cap_first}(mainId);\n                    </#list>\n\t\t\t\t }\n\t\t\t\t long start = System.currentTimeMillis();\n\t\t\t\t ${sub.entityName?uncap_first}Service.saveBatch(list);\n\t\t\t\t log.info(\"消耗时间\" + (System.currentTimeMillis() - start) + \"毫秒\");\n\t\t\t\t return Result.OK(\"文件导入成功！数据行数：\" + list.size());\n\t\t\t } catch (Exception e) {\n\t\t\t\t log.error(e.getMessage(), e);\n\t\t\t\t return Result.error(\"文件导入失败:\" + e.getMessage());\n\t\t\t } finally {\n\t\t\t\t try {\n\t\t\t\t\t file.getInputStream().close();\n\t\t\t\t } catch (IOException e) {\n\t\t\t\t\t e.printStackTrace();\n\t\t\t\t }\n\t\t\t }\n\t\t }\n\t\t return Result.error(\"文件导入失败！\");\n    }\n\n    /*--------------------------------子表处理-${sub.ftlDescription}-end----------------------------------------------*/\n\t</#list>\n\n\n\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai",
    "content": "<#include \"/common/utils.ftl\">\npackage ${bussiPackage}.${entityPackage}.entity;\n\nimport java.io.Serializable;\nimport java.io.UnsupportedEncodingException;\nimport java.util.Date;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.jeecg.common.constant.ProvinceCityArea;\nimport org.jeecg.common.util.SpringContextUtils;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecg.common.aspect.annotation.Dict;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Data\n@TableName(\"${tableName}\")\n@Schema(description=\"${tableVo.ftlDescription}\")\npublic class ${entityName} implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    <#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']>\n     <#assign excel_ignore_classType_arr=['pca','switch','cat_tree']>\n    <#list originalColumns as po>\n    <#-- 生成字典Code -->\n    <#assign list_field_dictCode=\"\">\n    <#if po.classType='sel_user'>\n      <#assign list_field_dictCode=', dictTable = \"sys_user\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"realname\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"username\\\")?trim)}\"'>\n    <#elseif po.classType='sel_depart'>\n      <#assign list_field_dictCode=', dictTable = \"sys_depart\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"depart_name\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"id\\\")?trim)}\"'>\n    <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>\n      <#if po.dictTable?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText}\", dicCode = \"${po.dictField}\"'>\n      <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dicCode = \"${po.dictField}\"'>\n    </#if>\n    <#elseif po.classType=='sel_tree'>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText?split(\",\")[2]}\", dicCode = \"${po.dictText?split(\",\")[0]}\"'>\n    <#elseif po.classType=='link_table'>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicCode = \"${po.dictField}\", dicText = \"${po.dictText?split(\",\")[0]}\"'>\n    </#if>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t@TableId(type = IdType.ASSIGN_ID)\n\t<#else>\n\t\t<#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'>\n\t\t\t<#if po.classType=='date'>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n    @Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n    </#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t\t\t<#else>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n    @Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t\t\t</#if>\n\t\t<#else>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\") && !excel_ignore_classType_arr?seq_contains(\"${po.classType}\")>\n    @Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n    </#if>\n\t\t</#if>\n        <#if list_field_dictCode?length gt 1>\n    @Dict(${list_field_dictCode?substring(2)})\n        </#if>\n\t</#if>\n    <#include \"/common/blob.ftl\">\n\t</#list>\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai",
    "content": "<#include \"/common/utils.ftl\">\n<#list subTables as subTab>\n#segment#${subTab.entityName}.java\npackage ${bussiPackage}.${entityPackage}.entity;\n\nimport java.io.Serializable;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecg.common.constant.ProvinceCityArea;\nimport org.jeecg.common.util.SpringContextUtils;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport java.util.Date;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport java.io.UnsupportedEncodingException;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Data\n@TableName(\"${subTab.tableName}\")\n@Schema(description=\"${subTab.ftlDescription}\")\npublic class ${subTab.entityName} implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    <#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']>\n     <#assign excel_ignore_classType_arr=['pca','switch','cat_tree']>\n<#list subTab.originalColumns as po>\n    <#-- 生成字典Code -->\n    <#assign list_field_dictCode=\"\">\n    <#if po.classType='sel_user'>\n        <#assign list_field_dictCode=', dictTable = \"sys_user\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"realname\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"username\\\")?trim)}\"'>\n    <#elseif po.classType='sel_depart'>\n        <#assign list_field_dictCode=', dictTable = \"sys_depart\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"depart_name\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"id\\\")?trim)}\"'>\n    <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>\n        <#if po.dictTable?default(\"\")?trim?length gt 1>\n            <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText}\", dicCode = \"${po.dictField}\"'>\n        <#elseif po.dictField?default(\"\")?trim?length gt 1>\n            <#assign list_field_dictCode=', dicCode = \"${po.dictField}\"'>\n        <#elseif po.classType=='sel_tree'>\n            <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText?split(\",\")[2]}\", dicCode = \"${po.dictText?split(\",\")[0]}\"'>\n        </#if>\n    <#elseif po.classType=='link_table'>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicCode = \"${po.dictField}\", dicText = \"${po.dictText?split(\",\")[0]}\"'>\n    </#if>\n\t/**${po.filedComment}*/\n<#if po.fieldName == primaryKeyField>\n\t@TableId(type = IdType.ASSIGN_ID)\n<#else>\n\t<#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'>\n\t\t<#if po.classType=='date'>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t\t<#else>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t\t</#if>\n\t<#elseif !subTab.foreignKeys?seq_contains(po.fieldName?cap_first)>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")  && !excel_ignore_classType_arr?seq_contains(\"${po.classType}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n\t</#if>\n\t</#if>\n</#if>\n  <#if list_field_dictCode?length gt 1>\n    @Dict(${list_field_dictCode?substring(2)})\n  </#if>\n\t<#-- 大字段转换 -->\n    <#include \"/common/blob.ftl\">\n</#list>\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai",
    "content": "package ${bussiPackage}.${entityPackage}.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface ${entityName}Mapper extends BaseMapper<${entityName}> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}Mapper.java\npackage ${bussiPackage}.${entityPackage}.mapper;\n\nimport java.util.List;\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Param;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface ${subTab.entityName}Mapper extends BaseMapper<${subTab.entityName}> {\n\n\t/**\n\t * 通过主表id删除子表数据\n\t *\n\t * @param mainId 主表id\n\t * @return boolean\n\t */\n\tpublic boolean deleteByMainId(@Param(\"mainId\") String mainId);\n\n   /**\n    * 通过主表id查询子表数据\n    *\n    * @param mainId 主表id\n    * @return List<${subTab.entityName}>\n    */\n\tpublic List<${subTab.entityName}> selectByMainId(@Param(\"mainId\") String mainId);\n\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml",
    "content": "<#list subTables as subTab>\n<#assign originalForeignKeys = subTab.originalForeignKeys>\n#segment#${subTab.entityName}Mapper.xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper\">\n\n\t<delete id=\"deleteByMainId\" parameterType=\"java.lang.String\">\n\t\tDELETE \n\t\tFROM  ${subTab.tableName} \n\t\tWHERE\n\t\t<#list originalForeignKeys as key>\n\t\t\t ${key} = ${r'#'}{mainId} <#rt/>\n\t\t</#list>\n\n\t</delete>\n\t\n\t<select id=\"selectByMainId\" parameterType=\"java.lang.String\" resultType=\"${bussiPackage}.${entityPackage}.entity.${subTab.entityName}\">\n\t\tSELECT * \n\t\tFROM  ${subTab.tableName}\n\t\tWHERE\n\t\t<#list originalForeignKeys as key>\n\t\t\t ${key} = ${r'#'}{mainId} <#rt/>\n\t\t</#list>\n\n\t</select>\n</mapper>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service;\n\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport java.io.Serializable;\nimport java.util.Collection;\nimport java.util.List;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface I${entityName}Service extends IService<${entityName}> {\n\n\t/**\n\t * 删除一对多\n\t *\n\t * @param id\n\t */\n\tpublic void delMain (String id);\n\t\n\t/**\n\t * 批量删除一对多\n\t *\n\t * @param idList\n\t */\n\tpublic void delBatchMain (Collection<? extends Serializable> idList);\n\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai",
    "content": "<#list subTables as subTab>\n#segment#I${subTab.entityName}Service.java\npackage ${bussiPackage}.${entityPackage}.service;\n\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport java.util.List;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface I${subTab.entityName}Service extends IService<${subTab.entityName}> {\n\n  /**\n   * 通过主表id查询子表数据\n   *\n   * @param mainId\n   * @return List<${subTab.entityName}>\n   */\n\tpublic List<${subTab.entityName}> selectByMainId(String mainId);\n}\n</#list>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service.impl;\n\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.mapper.${sub.entityName}Mapper;\n</#list>\nimport ${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper;\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.transaction.annotation.Transactional;\nimport java.io.Serializable;\nimport java.util.List;\nimport java.util.Collection;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Service\npublic class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service {\n\n\t@Autowired\n\tprivate ${entityName}Mapper ${entityName?uncap_first}Mapper;\n\t<#list subTables as sub>\n\t@Autowired\n\tprivate ${sub.entityName}Mapper ${sub.entityName?uncap_first}Mapper;\n\t</#list>\n\t\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void delMain(String id) {\n\t\t<#list subTables as sub>\n\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(id);\n\t\t</#list>\n\t\t${entityName?uncap_first}Mapper.deleteById(id);\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void delBatchMain(Collection<? extends Serializable> idList) {\n\t\tfor(Serializable id:idList) {\n\t\t\t<#list subTables as sub>\n\t\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(id.toString());\n\t\t\t</#list>\n\t\t\t${entityName?uncap_first}Mapper.deleteById(id);\n\t\t}\n\t}\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}ServiceImpl.java\npackage ${bussiPackage}.${entityPackage}.service.impl;\n\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport ${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper;\nimport ${bussiPackage}.${entityPackage}.service.I${subTab.entityName}Service;\nimport org.springframework.stereotype.Service;\nimport java.util.List;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Service\npublic class ${subTab.entityName}ServiceImpl extends ServiceImpl<${subTab.entityName}Mapper, ${subTab.entityName}> implements I${subTab.entityName}Service {\n\t\n\t@Autowired\n\tprivate ${subTab.entityName}Mapper ${subTab.entityName?uncap_first}Mapper;\n\t\n\t@Override\n\tpublic List<${subTab.entityName}> selectByMainId(String mainId) {\n\t\treturn ${subTab.entityName?uncap_first}Mapper.selectByMainId(mainId);\n\t}\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n  <a-card :bordered=\"false\">\n    <!-- 查询区域 -->\n    <div class=\"table-page-search-wrapper\">\n      <a-form layout=\"inline\" @keyup.enter.native=\"searchQuery\">\n        <a-row :gutter=\"24\">\n<#assign query_field_no=0>\n<#assign query_flag=false>\n<#assign list_need_dict=false>\n<#assign list_need_category=false>\n<#assign list_need_pca=false>\n<#assign subMainFieldMap={}>\n<#-- 开始循环 -->\n<#list columns as po>\n<#if po.isQuery=='Y'>\n<#assign query_flag=true>\n\t<#if query_field_no==2>\n          <template v-if=\"toggleSearchStatus\">\n\t</#if>\n\t<#assign query_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n\t    <#assign query_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n    <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign query_field_dictCode=\"${po.dictField}\">\n    </#if>\n\t<#if po.queryMode=='single'>\n          <#if query_field_no gt 1>  </#if><a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <#if query_field_no gt 1>  </#if><a-form-item label=\"${po.filedComment}\">\n            <#if po.classType=='sel_search'>\n              <#if query_field_no gt 1>  </#if><j-search-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dict=\"${po.dictTable},${po.dictText},${po.dictField}\"/>\n            <#elseif po.classType=='sel_user'>\n              <#if query_field_no gt 1>  </#if><j-select-user-by-dep placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"/>\n            <#elseif po.classType=='sel_depart'>\n              <#if query_field_no gt 1>  </#if><j-select-depart placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"/>\n            <#elseif po.classType=='list_multi'>\n              <#if query_field_no gt 1>  </#if><j-multi-select-tag placeholder=\"请选择${po.filedComment}\" dictCode=\"${query_field_dictCode?default(\"\")}\" v-model=\"queryParam.${po.fieldName}\"/>\n            <#elseif po.classType=='cat_tree'>\n              <#if query_field_no gt 1>  </#if><j-category-select placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\"/>\n\t\t\t<#elseif po.classType=='date'>\n              <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></j-date>\n\t\t\t<#elseif po.classType=='datetime'>\n              <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></j-date>\n            <#elseif po.classType=='pca'>\n              <#if query_field_no gt 1>  </#if><j-area-linkage type=\"cascader\" v-model=\"queryParam.${po.fieldName}\" placeholder=\"请选择省市区\"/>\n            <#elseif po.classType=='popup'>\n              <#if query_field_no gt 1>  </#if><j-popup placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" code=\"${po.dictTable}\" org-fields=\"${po.dictField}\" dest-fields=\"${po.dictText}\" :field=\"getPopupField('${po.dictText}')\" :multi=\"${po.extendParams.popupMulti?c}\"/>\n\t\t\t<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>\n\t\t\t<#--  ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->\n\t\t\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n              <#if query_field_no gt 1>  </#if><j-dict-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\"/>\n\t\t\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n              <#if query_field_no gt 1>  </#if><j-dict-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dictCode=\"${po.dictField}\"/>\n\t\t\t<#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n\t\t\t</#if>\n\t\t\t<#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n\t\t\t</#if>\n            <#if query_field_no gt 1>  </#if></a-form-item>\n          <#if query_field_no gt 1>  </#if></a-col>\n\t<#else>\n          <#if query_field_no gt 1>  </#if><a-col :xl=\"10\" :lg=\"11\" :md=\"12\" :sm=\"24\">\n            <#if query_field_no gt 1>  </#if><a-form-item label=\"${po.filedComment}\">\n\t\t\t<#if po.classType=='date'>\n              <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择开始日期\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></j-date>\n              <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n              <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择结束日期\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></j-date>\n\t\t\t<#elseif po.classType=='datetime'>\n              <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择开始时间\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></j-date>\n              <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n              <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择结束时间\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></j-date>\n\t\t\t<#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入最小值\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></a-input>\n              <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入最大值\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></a-input>\n\t\t\t</#if>\n            <#if query_field_no gt 1>  </#if></a-form-item>\n          <#if query_field_no gt 1>  </#if></a-col>\n\t</#if>\n<#assign query_field_no=query_field_no+1>\n</#if>\n<#if !list_need_dict && po.fieldShowType!='popup' && po.dictField?default(\"\")?trim?length gt 1>\n<#assign list_need_dict=true>\n</#if>\n<#if po.classType=='cat_tree' && po.dictText?default(\"\")?trim?length == 0>\n<#assign list_need_category=true>\n</#if>\n<#if po.classType=='pca'>\n<#assign list_need_pca=true>\n</#if>\n</#list>\n<#-- 结束循环 -->\n<#t>\n<#if query_field_no gt 2>\n          </template>\n</#if>\n<#if query_flag>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left;overflow: hidden;\" class=\"table-page-search-submitButtons\">\n              <a-button type=\"primary\" @click=\"searchQuery\" icon=\"search\">查询</a-button>\n              <a-button type=\"primary\" @click=\"searchReset\" icon=\"reload\" style=\"margin-left: 8px\">重置</a-button>\n              <a @click=\"handleToggleSearch\" style=\"margin-left: 8px\">\n                {{ toggleSearchStatus ? '收起' : '展开' }}\n                <a-icon :type=\"toggleSearchStatus ? 'up' : 'down'\"/>\n              </a>\n            </span>\n          </a-col>\n</#if>\n        </a-row>\n      </a-form>\n    </div>\n    <!-- 查询区域-END -->\n    \n    <!-- 操作按钮区域 -->\n    <div class=\"table-operator\">\n      <a-button @click=\"handleAdd\" type=\"primary\" icon=\"plus\">新增</a-button>\n      <a-button type=\"primary\" icon=\"download\" @click=\"handleExportXls('${tableVo.ftlDescription}')\">导出</a-button>\n      <a-upload name=\"file\" :showUploadList=\"false\" :multiple=\"false\" :headers=\"tokenHeader\" :action=\"importExcelUrl\" @change=\"handleImportExcel\">\n        <a-button type=\"primary\" icon=\"import\">导入</a-button>\n      </a-upload>\n      <!-- 高级查询区域 -->\n      <j-super-query :fieldList=\"superFieldList\" ref=\"superQueryModal\" @handleSuperQuery=\"handleSuperQuery\"></j-super-query>\n    </div>\n\n    <!-- table区域-begin -->\n    <div>\n      <div class=\"ant-alert ant-alert-info\" style=\"margin-bottom: 16px;\">\n        <i class=\"anticon anticon-info-circle ant-alert-icon\"></i> 已选择 <a style=\"font-weight: 600\">{{ selectedRowKeys.length }}</a>项\n        <a style=\"margin-left: 24px\" @click=\"onClearSelected\">清空</a>\n      </div>\n\n      <a-table\n        ref=\"table\"\n        size=\"middle\"\n        bordered\n        rowKey=\"id\"\n        class=\"j-table-force-nowrap\"\n        :scroll=\"{x:true}\"\n        :columns=\"columns\"\n        :dataSource=\"dataSource\"\n        :pagination=\"ipagination\"\n        :loading=\"loading\"\n        :rowSelection=\"{selectedRowKeys: selectedRowKeys, onChange: onSelectChange, type:'radio'}\"\n        :customRow=\"clickThenSelect\"\n        @change=\"handleTableChange\">\n\n        <template slot=\"htmlSlot\" slot-scope=\"text\">\n          <div v-html=\"text\"></div>\n        </template>\n        <template slot=\"imgSlot\" slot-scope=\"text,record\">\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无图片</span>\n          <img v-else :src=\"getImgView(text)\" :preview=\"record.id\" height=\"25px\" alt=\"\" style=\"max-width:80px;font-size: 12px;font-style: italic;\"/>\n        </template>\n        <template slot=\"fileSlot\" slot-scope=\"text\">\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n          <a-button\n            v-else\n            :ghost=\"true\"\n            type=\"primary\"\n            icon=\"download\"\n            size=\"small\"\n            @click=\"downloadFile(text)\">\n            下载\n          </a-button>\n        </template>\n        <#if list_need_pca>\n        <template slot=\"pcaSlot\" slot-scope=\"text\">\n          <div>{{ getPcaText(text) }}</div>\n        </template>\n        </#if>\n\n        <span slot=\"action\" slot-scope=\"text, record\">\n          <a @click=\"handleEdit(record)\">编辑</a>\n\n          <a-divider type=\"vertical\" />\n          <a-dropdown>\n            <a class=\"ant-dropdown-link\">更多 <a-icon type=\"down\" /></a>\n            <a-menu slot=\"overlay\">\n              <a-menu-item>\n                <a-popconfirm title=\"确定删除吗?\" @confirm=\"() => handleDelete(record.id)\">\n                  <a>删除</a>\n                </a-popconfirm>\n              </a-menu-item>\n            </a-menu>\n          </a-dropdown>\n        </span>\n\n      </a-table>\n    </div>\n\n    <a-tabs defaultActiveKey=\"1\">\n    <#assign sub_seq=1>\n    <#list subTables as sub>\n      <a-tab-pane tab=\"${sub.ftlDescription}\" key=\"${sub_seq}\" <#if sub_seq gt 1>forceRender</#if>>\n        <${sub.entityName}List :mainId=\"${sub.entityName?uncap_first}MainId\" />\n      </a-tab-pane>\n    <#assign sub_seq=sub_seq+1>\n    </#list>\n    </a-tabs>\n\n    <${entityName?uncap_first}-modal ref=\"modalForm\" @ok=\"modalFormOk\"></${entityName?uncap_first}-modal>\n  </a-card>\n</template>\n\n<script>\n\n  import { JeecgListMixin } from '@/mixins/JeecgListMixin'\n  import ${entityName}Modal from './modules/${entityName}Modal'\n  import { getAction } from '@/api/manage'\n  <#list subTables as sub>\n  import ${sub.entityName}List from './${sub.entityName}List'\n  </#list>\n  <#if list_need_category>\n  import { loadCategoryData } from '@/api/api'\n  </#if>\n  <#if list_need_dict>\n  import {initDictOptions,filterMultiDictText} from '@/components/dict/JDictSelectUtil'\n  </#if>\n  <#if list_need_pca>\n  import Area from '@/components/_util/Area'\n  </#if>\n  import '@/assets/less/TableExpand.less'\n\n  export default {\n    name: \"${entityName}List\",\n    mixins:[JeecgListMixin],\n    components: {\n      <#list subTables as sub>\n      ${sub.entityName}List,\n      </#list>\n      ${entityName}Modal\n    },\n    data () {\n      return {\n        description: '${tableVo.ftlDescription}管理页面',\n        // 表头\n        columns: [\n    <#assign showColNum=0>\n\t<#list columns as po>\n\t<#if po.isShowList =='Y'>\n\t<#assign showColNum=showColNum+1>\n          {\n            title:'${po.filedComment}',\n            align:\"center\",\n            <#if po.sort=='Y'>\n            sorter: true,\n            </#if>\n            <#if po.classType=='date'>\n            dataIndex: '${po.fieldName}',\n            customRender:function (text) {\n              return !text?\"\":(text.length>10?text.substr(0,10):text)\n            }\n            <#elseif po.fieldDbType=='Blob'>\n            dataIndex: '${po.fieldName}String'\n            <#elseif po.classType=='umeditor'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'htmlSlot'}\n            <#elseif po.classType=='pca'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'pcaSlot'}\n            <#elseif po.classType=='file'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'fileSlot'}\n            <#elseif po.classType=='image'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'imgSlot'}\n\t\t\t<#elseif po.classType=='sel_tree' || po.classType=='sel_search' || po.classType=='list_multi' || po.classType=='list' || po.classType=='radio' || po.classType=='checkbox' ||  po.classType=='sel_depart'>\n            dataIndex: '${po.fieldName}_dictText',\n            <#elseif po.classType=='switch'>\n            dataIndex: '${po.fieldName}',\n            <#if po.dictField != 'is_open'>\n            customRender: (text) => (!text ? \"\" : (text == ${po.dictField}[0] ? \"是\" : \"否\"))\n            <#else>\n            customRender: (text) => (!text ? \"\" : (text == \"Y\" ? \"是\" : \"否\"))\n            </#if>\n            <#elseif po.classType=='cat_tree'>\n            <#if list_need_category>\n            dataIndex: '${po.fieldName}',\n            customRender:(text)=>{\n              if(!text){\n                return ''\n              }else{\n                return filterMultiDictText(this.dictOptions['${po.fieldName}'], text+\"\")\n              }\n            }\n            <#else>\n            dataIndex: '${po.fieldName}',\n            customRender:(text,record)=>{\n              if(!text){\n                return ''\n              }else{\n                return record['${po.dictText}']\n              }\n            }\n            </#if>\n\t\t\t<#else>\n            dataIndex: '${po.fieldName}'\n\t\t\t</#if>\n          },\n     </#if>\n     </#list>\n          {\n            title: '操作',\n            dataIndex: 'action',\n            align:\"center\",\n            fixed:\"right\",\n            width:147,\n            scopedSlots: { customRender: 'action' },\n          }\n        ],\n        url: {\n          list: \"/${entityPackagePath}/${entityName?uncap_first}/list\",\n          delete: \"/${entityPackagePath}/${entityName?uncap_first}/delete\",\n          deleteBatch: \"/${entityPackagePath}/${entityName?uncap_first}/deleteBatch\",\n          exportXlsUrl: \"/${entityPackagePath}/${entityName?uncap_first}/exportXls\",\n          importExcelUrl: \"${entityPackagePath}/${entityName?uncap_first}/importExcel\",\n        },\n        dictOptions:{\n         <#list columns as po>\n         <#if (po.isQuery=='Y' || po.isShowList=='Y')>\n         <#if  po.classType='sel_depart' || po.classType=='list_multi' || po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>\n         ${po.fieldName}:[],\n         </#if>\n         </#if>\n         </#list>\n        },\n        /* 分页参数 */\n        ipagination:{\n          current: 1,\n          pageSize: 5,\n          pageSizeOptions: ['5', '10', '50'],\n          showTotal: (total, range) => {\n            return range[0] + \"-\" + range[1] + \" 共\" + total + \"条\"\n          },\n          showQuickJumper: true,\n          showSizeChanger: true,\n          total: 0\n        },\n        selectedMainId:'',\n        superFieldList:[],\n        <#list subTables as sub>\n        <#if sub?? && (sub.foreignMainKeys)??>\n          <#list sub.foreignMainKeys as key>\n            <#assign subMainFieldMap += {\"${sub.entityName?uncap_first}MainId\": \"${dashedToCamel(key)}\"}>\n          </#list>\n        ${sub.entityName?uncap_first}MainId: '',\n        </#if>\n        </#list>\n      }\n    },\n    created() {\n      <#if list_need_pca>\n      this.pcaData = new Area()\n      </#if>\n      this.getSuperFieldList();\n    },\n    computed: {\n      importExcelUrl: function(){\n        <#noparse>return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;</#noparse>\n      }\n    },\n    methods: {\n      <#if list_need_pca>\n      getPcaText(code){\n        return this.pcaData.getText(code);\n      },\n      </#if>\n      initDictConfig(){\n      <#list columns as po>\n      <#if (po.isQuery=='Y' || po.isShowList=='Y') && po.classType!='popup'>\n        <#if po.classType='sel_depart'>\n        initDictOptions('sys_depart,depart_name,id').then((res) => {\n          if (res.success) {\n            this.$set(this.dictOptions, '${po.fieldName}', res.result)\n          }\n        })\n        <#elseif po.classType=='cat_tree' && list_need_category==true>\n        loadCategoryData({code:\"${po.dictField}\"}).then((res) => {\n          if (res.success) {\n            this.$set(this.dictOptions, '${po.fieldName}', res.result)\n          }\n        })\n        <#elseif po.classType=='radio' || po.classType=='checkbox'>\n        \t<#assign list_field_dictCode=\"\">\n\t        <#if po.dictTable?default(\"\")?trim?length gt 1>\n\t\t\t\t<#assign list_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t\t    <#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t\t\t<#assign list_field_dictCode=\"${po.dictField}\">\n\t\t    </#if>\n        initDictOptions('${list_field_dictCode}').then((res) => {\n          if (res.success) {\n            this.$set(this.dictOptions, '${po.fieldName}', res.result)\n          }\n        })\n        </#if>\n      </#if>  \n      </#list>\n      },\n      clickThenSelect(record) {\n        return {\n          on: {\n            click: () => {\n              this.onSelectChange(record.id.split(\",\"), [record]);\n            }\n          }\n        }\n      },\n      onClearSelected() {\n        this.selectedRowKeys = [];\n        this.selectionRows = [];\n        this.selectedMainId=''\n      },\n      onSelectChange(selectedRowKeys, selectionRows) {\n        this.selectedMainId=selectedRowKeys[0]\n        this.selectedRowKeys = selectedRowKeys;\n        this.selectionRows = selectionRows;\n        <#list subMainFieldMap as key,value>\n        this.${key} = selectionRows[0]['${value}']\n        </#list>\n      },\n      loadData(arg) {\n        if(!this.url.list){\n          this.$message.error(\"请设置url.list属性!\")\n          return\n        }\n        //加载数据 若传入参数1则加载第一页的内容\n        if (arg === 1) {\n          this.ipagination.current = 1;\n        }\n        this.onClearSelected()\n        var params = this.getQueryParams();//查询条件\n        this.loading = true;\n        getAction(this.url.list, params).then((res) => {\n          if (res.success) {\n            this.dataSource = res.result.records;\n            this.ipagination.total = res.result.total;\n          }\n          if(res.code===510){\n            this.$message.warning(res.message)\n          }\n          this.loading = false;\n        })\n      },\n      getSuperFieldList(){\n        let fieldList=[];\n         <#list columns as po>\n        fieldList.push(${superQueryFieldList(po)})\n         </#list>\n        this.superFieldList = fieldList\n      }\n    }\n  }\n</script>\n<style scoped>\n  @import '~@assets/less/common.less'\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql",
    "content": "<#include \"/common/sql/menu_insert.ftl\">"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/[1-n]List.vuei",
    "content": "<#list subTables as sub>\n#segment#${sub.entityName}List.vue\n<template>\n  <a-card :bordered=\"false\" :class=\"'cust-erp-sub-tab'\">\n    <!-- 查询区域 -->\n    <div class=\"table-page-search-wrapper\">\n      <a-form layout=\"inline\" @keyup.enter.native=\"searchQuery\">\n        <a-row :gutter=\"24\">\n          <#assign query_field_no=0>\n          <#assign query_flag=false>\n          <#assign list_need_dict=false>\n          <#assign list_need_category=false>\n          <#assign list_need_pca=false>\n          <#assign subMainFieldMap={}>\n          <#-- 开始循环 -->\n          <#list sub.colums as po>\n          <#if po.isQuery=='Y'>\n          <#assign query_flag=true>\n          <#if query_field_no==2>\n          <template v-if=\"toggleSearchStatus\">\n            </#if>\n            <#assign query_field_dictCode=\"\">\n            <#if po.dictTable?default(\"\")?trim?length gt 1>\n              <#assign query_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n            <#elseif po.dictField?default(\"\")?trim?length gt 1>\n              <#assign query_field_dictCode=\"${po.dictField}\">\n            </#if>\n            <#if po.queryMode=='single'>\n              <#if query_field_no gt 1>  </#if><a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n              <#if query_field_no gt 1>  </#if><a-form-item label=\"${po.filedComment}\">\n              <#if po.classType=='sel_search'>\n                <#if query_field_no gt 1>  </#if><j-search-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dict=\"${po.dictTable},${po.dictText},${po.dictField}\"/>\n              <#elseif po.classType=='sel_user'>\n                <#if query_field_no gt 1>  </#if><j-select-user-by-dep placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"/>\n              <#elseif po.classType=='sel_depart'>\n                <#if query_field_no gt 1>  </#if><j-select-depart placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"/>\n              <#elseif po.classType=='list_multi'>\n                <#if query_field_no gt 1>  </#if><j-multi-select-tag placeholder=\"请选择${po.filedComment}\" dictCode=\"${query_field_dictCode?default(\"\")}\" v-model=\"queryParam.${po.fieldName}\"/>\n              <#elseif po.classType=='cat_tree'>\n                <#if query_field_no gt 1>  </#if><j-category-select placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\"/>\n              <#elseif po.classType=='date'>\n                <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></j-date>\n              <#elseif po.classType=='datetime'>\n                <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></j-date>\n              <#elseif po.classType=='pca'>\n                <#if query_field_no gt 1>  </#if><j-area-linkage type=\"cascader\" v-model=\"queryParam.${po.fieldName}\" placeholder=\"请选择省市区\"/>\n              <#elseif po.classType=='popup'>\n                <#if query_field_no gt 1>  </#if><j-popup placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" code=\"${po.dictTable}\" org-fields=\"${po.dictField}\" dest-fields=\"${po.dictText}\" :field=\"getPopupField('${po.dictText}')\" :multi=\"${po.extendParams.popupMulti?c}\"/>\n              <#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>\n              <#--  ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->\n                <#if po.dictTable?default(\"\")?trim?length gt 1>\n                  <#if query_field_no gt 1>  </#if><j-dict-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\"/>\n                <#elseif po.dictField?default(\"\")?trim?length gt 1>\n                  <#if query_field_no gt 1>  </#if><j-dict-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dictCode=\"${po.dictField}\"/>\n                <#else>\n                  <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n                </#if>\n              <#else>\n                <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n              </#if>\n              <#if query_field_no gt 1>  </#if></a-form-item>\n              <#if query_field_no gt 1>  </#if></a-col>\n            <#else>\n              <#if query_field_no gt 1>  </#if><a-col :xl=\"10\" :lg=\"11\" :md=\"12\" :sm=\"24\">\n              <#if query_field_no gt 1>  </#if><a-form-item label=\"${po.filedComment}\">\n              <#if po.classType=='date'>\n                <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择开始日期\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></j-date>\n                <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n                <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择结束日期\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></j-date>\n              <#elseif po.classType=='datetime'>\n                <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择开始时间\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></j-date>\n                <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n                <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择结束时间\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></j-date>\n              <#else>\n                <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入最小值\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></a-input>\n                <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n                <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入最大值\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></a-input>\n              </#if>\n              <#if query_field_no gt 1>  </#if></a-form-item>\n              <#if query_field_no gt 1>  </#if></a-col>\n            </#if>\n            <#assign query_field_no=query_field_no+1>\n            </#if>\n            <#if !list_need_dict && po.fieldShowType!='popup' && po.dictField?default(\"\")?trim?length gt 1>\n              <#assign list_need_dict=true>\n            </#if>\n            <#if po.classType=='cat_tree' && po.dictText?default(\"\")?trim?length == 0>\n              <#assign list_need_category=true>\n            </#if>\n            <#if po.classType=='pca'>\n              <#assign list_need_pca=true>\n            </#if>\n            </#list>\n            <#-- 结束循环 -->\n            <#t>\n            <#if query_field_no gt 2>\n          </template>\n          </#if>\n          <#if query_flag>\n            <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left;overflow: hidden;\" class=\"table-page-search-submitButtons\">\n              <a-button type=\"primary\" @click=\"searchQuery\" icon=\"search\">查询</a-button>\n              <a-button type=\"primary\" @click=\"searchReset\" icon=\"reload\" style=\"margin-left: 8px\">重置</a-button>\n              <a @click=\"handleToggleSearch\" style=\"margin-left: 8px\">\n                {{ toggleSearchStatus ? '收起' : '展开' }}\n                <a-icon :type=\"toggleSearchStatus ? 'up' : 'down'\"/>\n              </a>\n            </span>\n            </a-col>\n          </#if>\n        </a-row>\n      </a-form>\n    </div>\n    <!-- 查询区域-END -->\n\n    <!-- 操作按钮区域 -->\n    <div class=\"table-operator\" v-if=\"mainId\">\n      <a-button @click=\"handleAdd\" type=\"primary\" icon=\"plus\">新增</a-button>\n      <a-button type=\"primary\" icon=\"download\" @click=\"handleExportXls('${sub.ftlDescription}')\">导出</a-button>\n      <a-upload\n        name=\"file\"\n        :showUploadList=\"false\"\n        :multiple=\"false\"\n        :headers=\"tokenHeader\"\n        :action=\"importExcelUrl\"\n        @change=\"handleImportExcel\">\n          <a-button type=\"primary\" icon=\"import\">导入</a-button>\n      </a-upload>\n      <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n        <a-menu slot=\"overlay\">\n          <a-menu-item key=\"1\" @click=\"batchDel\"><a-icon type=\"delete\"/>删除</a-menu-item>\n        </a-menu>\n        <a-button style=\"margin-left: 8px\"> 批量操作 <a-icon type=\"down\" /></a-button>\n      </a-dropdown>\n    </div>\n\n    <!-- table区域-begin -->\n    <div>\n      <div class=\"ant-alert ant-alert-info\" style=\"margin-bottom: 16px;\">\n        <i class=\"anticon anticon-info-circle ant-alert-icon\"></i> 已选择 <a style=\"font-weight: 600\">{{ selectedRowKeys.length }}</a>项\n        <a style=\"margin-left: 24px\" @click=\"onClearSelected\">清空</a>\n      </div>\n\n      <a-table\n        ref=\"table\"\n        size=\"middle\"\n        bordered\n        rowKey=\"id\"\n        :scroll=\"{x:true}\"\n        :columns=\"columns\"\n        :dataSource=\"dataSource\"\n        :pagination=\"ipagination\"\n        :loading=\"loading\"\n        :rowSelection=\"{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}\"\n        @change=\"handleTableChange\">\n\n        <template slot=\"htmlSlot\" slot-scope=\"text\">\n          <div v-html=\"text\"></div>\n        </template>\n        <template slot=\"imgSlot\" slot-scope=\"text,record\">\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无图片</span>\n          <img v-else :src=\"getImgView(text)\" :preview=\"record.id\" height=\"25px\" alt=\"\" style=\"max-width:80px;font-size: 12px;font-style: italic;\"/>\n        </template>\n        <template slot=\"fileSlot\" slot-scope=\"text\">\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n          <a-button\n            v-else\n            :ghost=\"true\"\n            type=\"primary\"\n            icon=\"download\"\n            size=\"small\"\n            @click=\"downloadFile(text)\">\n            下载\n          </a-button>\n        </template>\n\n        <span slot=\"action\" slot-scope=\"text, record\">\n          <a @click=\"handleEdit(record)\">编辑</a>\n          <a-divider type=\"vertical\" />\n          <a-popconfirm title=\"确定删除吗?\" @confirm=\"() => handleDelete(record.id)\">\n            <a>删除</a>\n          </a-popconfirm>\n        </span>\n\n      </a-table>\n    </div>\n\n    <${sub.entityName?uncap_first}-modal ref=\"modalForm\" @ok=\"modalFormOk\" :mainId=\"mainId\"></${sub.entityName?uncap_first}-modal>\n  </a-card>\n</template>\n\n<script>\n\n  import { JeecgListMixin } from '@/mixins/JeecgListMixin'\n  import ${sub.entityName}Modal from './modules/${sub.entityName}Modal'\n\n  export default {\n    name: \"${sub.entityName}List\",\n    mixins:[JeecgListMixin],\n    components: { ${sub.entityName}Modal },\n    props:{\n      mainId:{\n        type:String,\n        default:'',\n        required:false\n      }\n    },\n    watch:{\n      mainId:{\n        immediate: true,\n        handler(val) {\n          if(!this.mainId){\n            this.clearList()\n          }else{\n            <#list sub.foreignKeys as key>\n            this.queryParam['${key?uncap_first}'] = val\n            </#list>\n            this.loadData(1);\n          }\n        }\n      }\n    },\n    data () {\n      return {\n        description: '${tableVo.ftlDescription}管理页面',\n        disableMixinCreated:true,\n        // 表头\n        columns: [\n          {\n            title: '#',\n            dataIndex: '',\n            key:'rowIndex',\n            width:60,\n            align:\"center\",\n            customRender:function (t,r,index) {\n              return parseInt(index)+1;\n            }\n          },\n    <#assign showColNum=0>\n\t<#list sub.originalColumns as po>\n\t<#if po.isShowList =='Y'>\n\t<#assign showColNum=showColNum+1>\n          {\n            title:'${po.filedComment}',\n            align:\"center\",\n            <#if po.sort=='Y'>\n            sorter: true,\n            </#if>\n            <#if po.classType=='date'>\n            dataIndex: '${po.fieldName}',\n            customRender:function (text) {\n              return !text?\"\":(text.length>10?text.substr(0,10):text)\n            }\n            <#elseif po.fieldDbType=='Blob'>\n            dataIndex: '${po.fieldName}String'\n            <#elseif po.classType=='umeditor'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'htmlSlot'}\n            <#elseif po.classType=='file'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'fileSlot'}\n            <#elseif po.classType=='image'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'imgSlot'}\n            <#elseif po.classType =='list' || po.classType =='radio' || po.classType =='list_multi' || po.classType =='checkbox' || po.classType =='sel_search' || po.classType =='cat_tree' || po.classType =='sel_depart'>\n            dataIndex: '${po.fieldName}_dictText',\n\t\t\t<#elseif po.classType=='switch'>\n            dataIndex: '${po.fieldName}',\n            <#if po.dictField != 'is_open'>\n            customRender: (text) => (!text ? \"\" : (text == ${po.dictField}[0] ? \"是\" : \"否\"))\n            <#else>\n            customRender: (text) => (!text ? \"\" : (text == \"Y\" ? \"是\" : \"否\"))\n            </#if>\n\t\t\t<#else>\n            dataIndex: '${po.fieldName}'\n\t\t\t</#if>\n          },\n     </#if>\n     </#list>\n          {\n            title: '操作',\n            dataIndex: 'action',\n            align:\"center\",\n            fixed:\"right\",\n            width:147,\n            scopedSlots: { customRender: 'action' },\n          }\n        ],\n        url: {\n          list: \"/${entityPackagePath}/${entityName?uncap_first}/list${sub.entityName}ByMainId\",\n          delete: \"/${entityPackagePath}/${entityName?uncap_first}/delete${sub.entityName}\",\n          deleteBatch: \"/${entityPackagePath}/${entityName?uncap_first}/deleteBatch${sub.entityName}\",\n          exportXlsUrl: \"/${entityPackagePath}/${entityName?uncap_first}/export${sub.entityName}\",\n          importUrl: \"/${entityPackagePath}/${entityName?uncap_first}/import${sub.entityName}\",\n        },\n        dictOptions:{\n         <#list columns as po>\n         <#if (po.isQuery=='Y' || po.isShowList=='Y')>\n         <#if  po.classType='sel_depart' || po.classType=='list_multi' || po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>\n         ${po.fieldName}:[],\n         </#if>\n         </#if>\n         </#list>\n        }\n      }\n    },\n    created() {\n    },\n    computed: {\n      importExcelUrl(){\n        return `${'$'}{window._CONFIG['domianURL']}/${'$'}{this.url.importUrl}/${'$'}{this.mainId}`;\n      }\n    },\n    methods: {\n      clearList(){\n        this.dataSource=[]\n        this.selectedRowKeys=[]\n        this.ipagination.current = 1\n      }\n\n    }\n  }\n</script>\n<style scoped>\n  @import '~@assets/less/common.less'\n</style>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n  <j-modal\n    :title=\"title\"\n    :width=\"width\"\n    :visible=\"visible\"\n    :confirmLoading=\"confirmLoading\"\n    switchFullscreen\n    @ok=\"handleOk\"\n    @cancel=\"handleCancel\"\n    cancelText=\"关闭\">\n    <a-spin :spinning=\"confirmLoading\">\n      <a-form-model ref=\"form\" :model=\"model\" :rules=\"validatorRules\">\n        <a-row>\n<#assign form_popup = false>\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign form_span = 24>\n<#list columns as po>\n<#if po.isShow =='Y' && po.fieldName != 'id'>\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n          <a-col :span=\"${form_span}\">\n            <a-form-model-item label=\"${po.filedComment}\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" prop=\"${autoStringSuffixForModel(po)}\">\n\t<#if po.classType =='date'>\n              <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='datetime'>\n              <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='time'>\n               <j-time placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='popup'>\n\t      <#assign form_popup=true>\n              <j-popup\n                v-model=\"model.${po.fieldName}\"\n               field=\"${po.fieldName}\"\n                org-fields=\"${po.dictField}\"\n                dest-fields=\"${Format.underlineToHump(po.dictText)}\"\n                code=\"${po.dictTable}\"\n                :multi=\"${po.extendParams.popupMulti?c}\"\n                @input=\"popupCallback\"\n                <#if po.readonly=='Y'>disabled</#if>/>\n    <#elseif po.classType =='sel_depart'>\n              <j-select-depart v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if> />\n<#elseif po.classType =='switch'>\n              <j-switch v-model=\"model.${po.fieldName}\" <#if po.dictField!= 'is_open'>:options=\"${po.dictField}\"</#if> <#if po.readonly=='Y'>disabled</#if>></j-switch>\n\t<#elseif po.classType =='pca'>\n\t\t      <j-area-linkage type=\"cascader\" v-model=\"model.${po.fieldName}\" placeholder=\"请输入省市区\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='markdown'>\n\t          <j-markdown-editor v-model=\"model.${autoStringSuffixForModel(po)}\" id=\"${po.fieldName}\"></j-markdown-editor>\n    <#elseif po.classType =='password'>\n\t          <a-input-password v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='sel_user'>\n              <j-select-user-by-dep v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='textarea'>\n              <a-textarea v-model=\"model.${autoStringSuffixForModel(po)}\" rows=\"4\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='list' || po.classType=='radio'>\n              <j-dict-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\" dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='list_multi' || po.classType=='checkbox'>\n              <j-multi-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\" dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='sel_search'>\n              <j-search-select-tag v-model=\"model.${po.fieldName}\" dict=\"${form_field_dictCode}\" <#if po.readonly=='Y'>disabled</#if> />\n    <#elseif po.classType=='cat_tree'>\n    \t<#assign form_cat_tree = true>\n              <j-category-select v-model=\"model.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\" placeholder=\"请选择${po.filedComment}\" <#if po.dictText?default(\"\")?trim?length gt 1>back=\"${dashedToCamel(po.dictText)}\" @change=\"handleCategoryChange\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n    \t<#if po.dictText?default(\"\")?trim?length gt 1>\n    \t<#assign form_cat_back = \"${po.dictText}\">\n    \t</#if>\n\t<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n              <a-input-number v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='file'>\n              <j-upload v-model=\"model.${po.fieldName}\" <#if po.readonly=='Y'>disabled</#if> <#if po.uploadnum??>:number=${po.uploadnum}</#if>></j-upload>\n\t<#elseif po.classType=='image'>\n              <j-image-upload isMultiple <#if po.uploadnum??>:number=${po.uploadnum}</#if> v-model=\"model.${po.fieldName}\" <#if po.readonly=='Y'>disabled</#if>></j-image-upload>\n\t<#elseif po.classType=='umeditor'>\n              <j-editor v-model=\"model.${autoStringSuffixForModel(po)}\" <#if po.readonly=='Y'>disabled</#if>/>\n    <#elseif po.fieldDbType=='Blob'>\n              <a-input v-model=\"model.${autoStringSuffixForModel(po)}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>></a-input>\n    <#elseif po.classType == 'sel_tree'>\n              <j-tree-select\n                ref=\"treeSelect\"\n                placeholder=\"请选择${po.filedComment}\"\n                v-model=\"model.${po.fieldName}\"\n                <#if po.dictText??>\n                <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n                dict=\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\"\n                <#elseif po.dictText?split(',')[1]??>\n                pidField=\"${po.dictText?split(',')[1]}\"\n                <#elseif po.dictText?split(',')[3]??>\n                hasChildField=\"${po.dictText?split(',')[3]}\"\n                </#if>\n                </#if>\n                pidValue=\"${po.dictField}\"\n                <#if po.readonly=='Y'>disabled</#if>>\n              </j-tree-select>\n\t<#else>\n              <a-input v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>></a-input>\n    </#if>\n            </a-form-model-item>\n          </a-col>\n</#if>\n</#list>\n        </a-row>\n      </a-form-model>\n    </a-spin>\n  </j-modal>\n</template>\n\n<script>\n\n  import { httpAction } from '@/api/manage'\n  import { validateDuplicateValue } from '@/utils/util'\n\n  export default {\n    name: \"${entityName}Modal\",\n    components: { \n    },\n    data () {\n      return {\n        title:\"操作\",\n        width:800,\n        visible: false,\n        model:{\n        <#include \"/common/init/initValue.ftl\">\n        },\n        labelCol: {\n          xs: { span: 24 },\n          sm: { span: 5 },\n        },\n        wrapperCol: {\n          xs: { span: 24 },\n          sm: { span: 16 },\n        },\n\n        confirmLoading: false,\n        <#include \"/common/validatorRulesTemplate/main.ftl\">\n        url: {\n          add: \"/${entityPackagePath}/${entityName?uncap_first}/add\",\n          edit: \"/${entityPackagePath}/${entityName?uncap_first}/edit\",\n        }\n     \n      }\n    },\n    created () {\n    //备份model原始值\n      this.modelDefault = JSON.parse(JSON.stringify(this.model));\n    },\n    methods: {\n      add () {\n        this.edit(this.modelDefault);\n      },\n      edit (record) {\n        this.model = Object.assign({}, record);\n        this.visible = true;\n      },\n      close () {\n        this.$emit('close');\n        this.visible = false;\n        this.$refs.form.clearValidate();\n      },\n      handleOk () {\n        const that = this;\n        // 触发表单验证\n        this.$refs.form.validate(valid => {\n          if (valid) {\n            that.confirmLoading = true;\n            let httpurl = '';\n            let method = '';\n            if(!this.model.id){\n              httpurl+=this.url.add;\n              method = 'post';\n            }else{\n              httpurl+=this.url.edit;\n               method = 'put';\n            }\n            httpAction(httpurl,this.model,method).then((res)=>{\n              if(res.success){\n                that.$message.success(res.message);\n                that.$emit('ok');\n              }else{\n                that.$message.warning(res.message);\n              }\n            }).finally(() => {\n              that.confirmLoading = false;\n              that.close();\n            })\n          }else{\n             return false\n          }\n        })\n      },\n      handleCancel () {\n        this.close()\n      },\n       <#if form_popup>\n      popupCallback(value,row){\n        this.model = Object.assign(this.model, row);\n      },\n       </#if>\n      <#if form_cat_tree>\n      handleCategoryChange(value,backObj){\n        this.model = Object.assign(backObj,this.model);\n      }\n      </#if>\n\n      \n    }\n  }\n</script>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Modal.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<#list subTables as sub>\n#segment#${sub.entityName}Modal.vue\n<template>\n  <j-modal\n    :title=\"title\"\n    :width=\"width\"\n    :visible=\"visible\"\n    :confirmLoading=\"confirmLoading\"\n    switchFullscreen\n    @ok=\"handleOk\"\n    @cancel=\"handleCancel\"\n    cancelText=\"关闭\">\n    <a-spin :spinning=\"confirmLoading\">\n      <a-form-model ref=\"form\" :model=\"model\" :rules=\"validatorRules\">\n        <a-row>\n<#assign form_popup = false>\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign form_span = 24>\n<#list sub.originalColumns as po>\n<#if po.isShow =='Y' && po.fieldName != 'id'>\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n          <a-col :span=\"${form_span}\">\n            <a-form-model-item label=\"${po.filedComment}\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" prop=\"${autoStringSuffixForModel(po)}\">\n\t<#if po.classType =='date'>\n              <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='datetime'>\n              <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='time'>\n               <j-time placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='popup'>\n\t     <#assign form_popup=true>\n              <j-popup\n                v-model=\"model.${po.fieldName}\"\n                field=\"${po.fieldName}\"\n                org-fields=\"${po.dictField}\"\n                dest-fields=\"${Format.underlineToHump(po.dictText)}\"\n                code=\"${po.dictTable}\"\n                :multi=\"${po.extendParams.popupMulti?c}\"\n                @input=\"popupCallback\"\n                <#if po.readonly=='Y'>disabled</#if>/>\n    <#elseif po.classType =='sel_depart'>\n              <j-select-depart v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if> />\n<#elseif po.classType =='switch'>\n              <j-switch v-model=\"model.${po.fieldName}\"<#if po.dictField!= 'is_open'>:options=\"${po.dictField}\"</#if> <#if po.readonly=='Y'>disabled</#if>></j-switch>\n\t<#elseif po.classType =='pca'>\n\t\t      <j-area-linkage type=\"cascader\" v-model=\"model.${po.fieldName}\"placeholder=\"请输入省市区\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='markdown'>\n\t          <j-markdown-editor v-model=\"model.${autoStringSuffixForModel(po)}\" id=\"${po.fieldName}\"></j-markdown-editor>\n    <#elseif po.classType =='password'>\n\t          <a-input-password v-model=\"model.${po.fieldName}\"placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='sel_user'>\n              <j-select-user-by-dep v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='textarea'>\n              <a-textarea v-model=\"model.${autoStringSuffixForModel(po)}\" rows=\"4\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='list' || po.classType=='radio'>\n              <j-dict-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\" dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='list_multi' || po.classType=='checkbox'>\n              <j-multi-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\" dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='sel_search'>\n              <j-search-select-tag v-model=\"model.${po.fieldName}\"dict=\"${form_field_dictCode}\" <#if po.readonly=='Y'>disabled</#if>/>\n    <#elseif po.classType=='cat_tree'>\n    \t<#assign form_cat_tree = true>\n              <j-category-select v-model=\"model.${po.fieldName}\"pcode=\"${po.dictField?default(\"\")}\" placeholder=\"请选择${po.filedComment}\" <#if po.dictText?default(\"\")?trim?length gt 1>back=\"${dashedToCamel(po.dictText)}\" @change=\"handleCategoryChange\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n    \t<#if po.dictText?default(\"\")?trim?length gt 1>\n    \t<#assign form_cat_back = \"${po.dictText}\">\n    \t</#if>\n\t<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n              <a-input-number v-model=\"model.${po.fieldName}\"placeholder=\"请输入${po.filedComment}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='file'>\n              <j-upload v-model=\"model.${po.fieldName}\" <#if po.readonly=='Y'>disabled</#if> <#if po.uploadnum??>:number=${po.uploadnum}</#if>></j-upload>\n\t<#elseif po.classType=='image'>\n              <j-image-upload isMultiple <#if po.uploadnum??>:number=${po.uploadnum}</#if> v-model=\"model.${po.fieldName}\"<#if po.readonly=='Y'>disabled</#if>></j-image-upload>\n\t<#elseif po.classType=='umeditor'>\n              <j-editor v-model=\"model.${autoStringSuffixForModel(po)}\" <#if po.readonly=='Y'>disabled</#if>/>\n    <#elseif po.fieldDbType=='Blob'>\n              <a-input v-model=\"model.${autoStringSuffixForModel(po)}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>></a-input>\n\t<#else>\n              <a-input v-model=\"model.${po.fieldName}\"placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>></a-input>\n    </#if>\n            </a-form-model-item>\n          </a-col>\n</#if>\n</#list>\n        </a-row>\n      </a-form-model>\n    </a-spin>\n  </j-modal>\n</template>\n\n<script>\n\n  import { httpAction } from '@/api/manage'\n  import { validateDuplicateValue } from '@/utils/util'\n\n  export default {\n    name: \"${sub.entityName}Modal\",\n    components: {\n    },\n    props:{\n      mainId:{\n        type:String,\n        required:false,\n        default:''\n      }\n    },\n    data () {\n      return {\n        title:\"操作\",\n        width:800,\n        visible: false,\n        model:{\n        <#include \"/common/init/initValueSub.ftl\">\n        },\n        labelCol: {\n          xs: { span: 24 },\n          sm: { span: 5 },\n        },\n        wrapperCol: {\n          xs: { span: 24 },\n          sm: { span: 16 },\n        },\n\n        confirmLoading: false,\n        <#include \"/common/validatorRulesTemplate/sub.ftl\">\n        url: {\n          add: \"/${entityPackagePath}/${entityName?uncap_first}/add${sub.entityName}\",\n          edit: \"/${entityPackagePath}/${entityName?uncap_first}/edit${sub.entityName}\",\n        }\n\n      }\n    },\n    created () {\n    //备份model原始值\n      this.modelDefault = JSON.parse(JSON.stringify(this.model));\n    },\n    methods: {\n      add () {\n        this.edit(this.modelDefault);\n      },\n      edit (record) {\n        this.model = Object.assign({}, record);\n        this.visible = true;\n      },\n      close () {\n        this.$emit('close');\n        this.visible = false;\n        this.$refs.form.clearValidate();\n      },\n      handleOk () {\n        const that = this;\n        // 触发表单验证\n        this.$refs.form.validate(valid => {\n          if (valid) {\n            that.confirmLoading = true;\n            let httpurl = '';\n            let method = '';\n            if(!this.model.id){\n              httpurl+=this.url.add;\n              method = 'post';\n            }else{\n              httpurl+=this.url.edit;\n               method = 'put';\n            }\n            <#list sub.foreignKeys as key>\n            this.model['${key?uncap_first}'] = this.mainId\n            </#list>\n            httpAction(httpurl,this.model,method).then((res)=>{\n              if(res.success){\n                that.$message.success(res.message);\n                that.$emit('ok');\n              }else{\n                that.$message.warning(res.message);\n              }\n            }).finally(() => {\n              that.confirmLoading = false;\n              that.close();\n            })\n          }else{\n             return false\n          }\n        })\n      },\n      handleCancel () {\n        this.close()\n      },\n      <#if form_popup>\n      popupCallback(value,row){\n       this.model = Object.assign(this.model, row);\n      },\n       </#if>\n      <#if form_cat_tree>\n      handleCategoryChange(value,backObj){\n        this.model = Object.assign(this.model,backObj);\n      }\n      </#if>\n\n\n    }\n  }\n</script>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei",
    "content": "﻿<template>\n  <div class=\"p-2 cgformErpList\">\n<#assign list_need_category=false>\n<#assign list_need_pca=false>\n<#assign bpm_flag=false>\n<#assign list_has_popup_dict=false>\n<#-- 开始循环 -->\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.classType=='cat_tree' && po.dictText?default(\"\")?trim?length == 0>\n<#assign list_need_category=true>\n</#if>\n<#if po.classType=='pca'>\n<#assign list_need_pca=true>\n</#if>\n<#if po.classType=='popup_dict'>\n<#assign list_has_popup_dict=true>\n</#if>\n</#list>\n<#-- 结束循环 -->\n<#assign buttonList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n  <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n</#if>\n    <div class=\"content\">\n      <!--引用表格-->\n      <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n        <!--插槽:table标题-->\n        <template #tableTitle>\n          <a-button type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:add'\"  @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\"> 新增</a-button>\n          <a-button type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:exportXls'\"  preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n          <j-upload-button type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:importExcel'\"  preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n    <#if buttonList?size gt 0>\n      <#list buttonList as btn>\n         <#if btn.buttonStyle == 'button'>\n           <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"ant-design:${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n         </#if>\n       </#list>\n     </#if>\n          <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n            <template #overlay>\n              <a-menu>\n                <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                  <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                  删除\n                </a-menu-item>\n              </a-menu>\n            </template>\n            <a-button  v-auth=\"'${entityPackage}:${tableName}:deleteBatch'\">批量操作\n              <Icon icon=\"mdi:chevron-down\"></Icon>\n            </a-button>\n          </a-dropdown>\n        <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n          <!-- 高级查询 -->\n          <super-query :config=\"superQueryConfig\" @search=\"handleSuperQuery\" />\n        <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n        </template>\n        <!--操作栏-->\n        <template #action=\"{ record }\">\n          <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\"/>\n        </template>\n        <!--字段回显插槽-->\n        <template v-slot:bodyCell=\"{ column, record, index, text }\">\n        <#list columns as po>\n          <#if po.classType=='umeditor' || po.classType=='pca' || po.classType=='file'>\n          <template v-if=\"column.dataIndex==='${po.fieldName}'\">\n          <#if po.classType=='umeditor'>\n            <!--富文本件字段回显插槽-->\n            <div v-html=\"text\"></div>\n          </#if>\n          <#if po.classType=='pca'>\n            <!--省市区字段回显插槽-->\n            {{ getAreaTextByCode(text) }}\n          </#if>\n          <#if po.classType=='file'>\n            <!--文件字段回显插槽-->\n            <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n            <a-button v-else :ghost=\"true\" type=\"primary\" preIcon=\"ant-design:download-outlined\" size=\"small\" @click=\"downloadFile(text)\">下载</a-button>\n          </#if>\n          </template>\n          </#if>\n        </#list>\n        </template>\n      </BasicTable>\n      <!--子表表格tab-->\n      <a-tabs defaultActiveKey=\"1\" style=\"margin: 10px\">\n        <#assign sub_seq=1>\n        <#list subTables as sub>\n        <a-tab-pane tab=\"${sub.ftlDescription}\" key=\"${sub_seq}\" <#if sub_seq gt 1>forceRender</#if>>\n          <${sub.entityName}List />\n        </a-tab-pane>\n        <#assign sub_seq=sub_seq+1>\n        </#list>\n      </a-tabs>\n    </div>\n    <!-- 表单区域 -->\n    <${entityName}Modal @register=\"registerModal\" @success=\"handleSuccess\"></${entityName}Modal>\n    <#if bpm_flag==true>\n      <!-- 审批记录 -->\n      <BpmPictureModal @register=\"registerBpmModal\" />\n     </#if>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"${entityPackage}-${entityName?uncap_first}\" setup>\n  import {ref, reactive, computed, unref,provide} from 'vue';\n  import {BasicTable, useTable, TableAction} from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage'\n  import {useModal} from '/@/components/Modal';\n  import ${entityName}Modal from './components/${entityName}Modal.vue'\n  import { useUserStore } from '/@/store/modules/user';\n  import { useMessage } from '/@/hooks/web/useMessage';\n<#list subTables as sub>\n  import ${sub.entityName}List from './${sub.entityName}List.vue'\n</#list>\n  import {columns, searchFormSchema, superQuerySchema} from './${entityName}.data';\n  import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './${entityName}.api';\n  import {downloadFile} from '/@/utils/common/renderUtils';\n <#if list_need_pca>\n  import { getAreaTextByCode } from '/@/components/Form/src/utils/Area';\n  </#if>\n  <#if list_need_category>\n<#if list_has_popup_dict>\n  import {getPopDictByCode} from \"@/utils/dict\";\n  import {filterMultiDictText} from \"@/utils/dict/JDictSelectUtil\";\n</#if>\n  import { loadCategoryData } from '/@/api/common/api'\n  import { getAuthCache, setAuthCache } from '/@/utils/auth';\n  import { DB_DICT_DATA_KEY } from '/@/enums/cacheEnum';\n  </#if>\n  import { getDateByPicker } from '/@/utils';\n  //日期个性化选择\n  const fieldPickers = reactive({\n  <#list columns as po>\n    <#if po.extendParams?exists && po.extendParams.picker?exists>\n    ${po.fieldName}: '${po.extendParams.picker}',\n    </#if>\n  </#list>\n  });\n  <#if bpm_flag==true>\n  import { startProcess } from '/@/api/common/api';\n  const [registerBpmModal, { openModal: bpmPicModal }] = useModal();\n  </#if>\n  const queryParam = reactive<any>({});\n  const { createMessage } = useMessage();\n  //注册model\n  const [registerModal, {openModal}] = useModal();\n   //注册table数据\n  const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({\n      tableProps:{\n           title: '${tableVo.ftlDescription}',\n           api: list,\n           columns,\n           canResize: true,\n           maxHeight: 300,\n           clickToRowSelect: true,\n           rowSelection: {type: 'radio'},\n           formConfig: {\n                schemas: searchFormSchema,\n                fieldMapToNumber: [\n                   <#list columns as po>\n                   <#if po.isQuery=='Y'>\n                   <#if po.queryMode=='group'>\n                   <#-- update-begin---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n                   <#if po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal' || po.classType=='time'>\n                   <#-- update-end---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n                   ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end']],\n                   </#if>\n                   </#if>\n                   </#if>\n                   </#list>\n                ],\n                fieldMapToTime: [\n                <#list columns as po>\n                <#if po.isQuery=='Y'>\n                <#if po.queryMode=='group'>\n                <#if po.classType=='date'>\n                   ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end'], 'YYYY-MM-DD'],\n                <#elseif po.classType=='datetime'>\n                   ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end'], 'YYYY-MM-DD HH:mm:ss'],\n                </#if>\n                </#if>\n                </#if>\n                </#list>\n                ],\n            },\n           actionColumn: {\n               width: 120,\n               fixed:'right'\n           },\n           beforeFetch: (params) => {\n              if (params && fieldPickers) {\n                for (let key in fieldPickers) {\n                  if (params[key]) {\n                    params[key] = getDateByPicker(params[key], fieldPickers[key]);\n                  }\n                }\n              }\n             return Object.assign(params, queryParam);\n           },\n            <#if list_has_popup_dict>\n           afterFetch: afterFetch,\n           </#if>\n           pagination:{\n               current: 1,\n               pageSize: 5,\n               pageSizeOptions: ['5', '10', '20'],\n           }\n        },\n        exportConfig: {\n            name:\"${tableVo.ftlDescription}\",\n            url: getExportUrl,\n            params: queryParam,\n        },\n        importConfig: {\n            url: getImportUrl,\n            success: handleSuccess\n        },\n    })\n  const userStore = useUserStore();\n  const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext\n\n  const mainId = computed(() => (unref(selectedRowKeys).length > 0 ? unref(selectedRowKeys)[0] : ''));\n  //下发 mainId,子组件接收\n  provide('mainId', mainId);\n\n<#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n    // 高级查询配置\n    const superQueryConfig = reactive(superQuerySchema);\n\n  /**\n   * 高级查询事件\n   */\n  function handleSuperQuery(params) {\n    Object.keys(params).map((k) => {\n      queryParam[k] = params[k];\n    });\n    reload();\n  }\n<#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n\n   /**\n    * 新增事件\n    */\n  function handleAdd() {\n     openModal(true, {\n       isUpdate: false,\n       showFooter: true,\n     });\n  }\n   /**\n    * 编辑事件\n    */\n  function handleEdit(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: true,\n     });\n   }\n   /**\n    * 详情\n   */\n  function handleDetail(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: false,\n     });\n   }\n   /**\n    * 删除事件\n    */\n  async function handleDelete(record) {\n     await deleteOne({id: record.id}, handleSuccess);\n   }\n   /**\n    * 批量删除事件\n    */\n  async function batchHandleDelete() {\n     await batchDelete({ids: selectedRowKeys.value},handleSuccess);\n   }\n   /**\n    * 成功回调\n    */\n  function handleSuccess() {\n      (selectedRowKeys.value = []) && reload();\n   }\n   /**\n      * 操作栏\n      */\n  function getTableAction(record){\n       return [\n         {\n           label: '编辑',\n           onClick: handleEdit.bind(null, record),\n           auth: '${entityPackage}:${tableName}:edit'\n         }\n       ]\n   }\n\n  <#if bpm_flag==true>\n  /**\n   * 提交流程\n   */\n  async function handleProcess(record) {\n    let params = {\n      flowCode: 'dev_${tableName}_001',\n      id: record.id,\n      formUrl: '${entityPackagePath}/modules/${entityName}Form',\n      formUrlMobile: ''\n    }\n    await startProcess(params);\n    handleSuccess();\n  }\n  /**\n   * 审批进度\n   */\n  async function handlePreviewPic(record) {\n    bpmPicModal(true, {\n      flowCode: 'dev_${tableName}_001',\n      dataId: record.id,\n    });\n  }\n  </#if>\n\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record){\n    <#if bpm_flag==true>\n    let dropDownAction = [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      }, {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft'\n        },\n        auth: '${entityPackage}:${tableName}:delete'\n      },\n        {\n          label: '审批进度',\n          onClick: handlePreviewPic.bind(null, record),\n          ifShow: !!record.bpmStatus && record.bpmStatus !== '1',\n        }\n<#if buttonList?size gt 0>\n      <#list buttonList as btn>\n         <#if btn.buttonStyle == 'link'>\n         ,{\n            label: '${btn.buttonName}',\n            onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n          }\n         </#if>\n       </#list>\n</#if>\n    ];\n    if(record.bpmStatus == '1'){\n      dropDownAction.push({\n        label: '发起流程',\n        popConfirm: {\n          title: '确认提交流程吗？',\n          confirm: handleProcess.bind(null, record),\n        }\n      })\n    }\n    return dropDownAction;\n    <#else>\n    return [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      }, {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft'\n        },\n        auth: '${entityPackage}:${tableName}:delete'\n      }\n  <#if buttonList?size gt 0>\n    <#list buttonList as btn>\n       <#if btn.buttonStyle == 'link'>\n       ,{\n          label: '${btn.buttonName}',\n          onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n        }\n       </#if>\n     </#list>\n  </#if>\n    ]\n    </#if>\n  }\n\n    <#if list_need_category>\n   /**\n    * 初始化字典配置\n   */\n    function initDictConfig(){\n     <#list columns as po>\n     <#if (po.isQuery=='Y' || po.isShowList=='Y') && po.classType!='popup'>\n       <#if po.classType=='cat_tree' && list_need_category==true>\n       loadCategoryData({code:'${po.dictField?default(\"\")}'}).then((res) => {\n         if (res) {\n           const allDictDate = userStore.getAllDictItems;\n           if(!allDictDate['${po.dictField?default(\"\")}']){\n             userStore.setAllDictItems({...allDictDate,'${po.dictField?default(\"\")}':res});\n           }\n         }\n       })\n       </#if>\n     </#if>\n     </#list>\n   }\n   initDictConfig();\n    </#if>\n\n<#if list_has_popup_dict>\n   /**\n    * 翻译Popup字典配置\n   */\n    async function afterFetch(records){\n <#list columns as po>\n    <#if po.isQuery=='Y' || po.isShowList=='Y'>\n      <#if po.classType=='popup_dict' && list_has_popup_dict==true>\n      const ${po.fieldName}Keys = [...new Set(records.map((item) => item['${po.fieldName}']).flatMap((item) => item && item.split(',')))];\n      if(${po.fieldName}Keys && ${po.fieldName}Keys.length){\n       const dictOptions = await getPopDictByCode(${po.fieldName}Keys.join(','), '${po.dictTable},${po.dictField},${po.dictText}');\n       records.forEach((item) => {\n         item['${po.fieldName}_dictText'] = filterMultiDictText(dictOptions, item['${po.fieldName}']);\n       });\n      }\n      </#if>\n    </#if>\n </#list>\n     return records;\n   }\n</#if>\n\n<#if buttonList?size gt 0>\n  <#list buttonList as btn>\n  <#if btn.buttonStyle=='button'>\n   function handle${btn.buttonCode?cap_first}(){\n     createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n   }\n  </#if>\n   <#if btn.buttonStyle=='link'>\n   function handle${btn.buttonCode?cap_first}(record){\n    createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n   }\n   </#if>\n  </#list>\n</#if>\n</script>\n\n<style lang=\"less\" scoped>\n  html[data-theme='light'] {\n    .cgformErpList {\n      height: 100%;\n      .content {\n        background-color: #fff;\n      }\n    }\n  }\n  \n  <#include \"/common/form/vue3SearchStyle.ftl\">\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi",
    "content": "import {defHttp} from '/@/utils/http/axios';\nimport { useMessage } from \"/@/hooks/web/useMessage\";\n\nconst { createConfirm } = useMessage();\n\nenum Api {\n  list = '/${entityPackagePath}/${entityName?uncap_first}/list',\n  save='/${entityPackagePath}/${entityName?uncap_first}/add',\n  edit='/${entityPackagePath}/${entityName?uncap_first}/edit',\n  deleteOne = '/${entityPackagePath}/${entityName?uncap_first}/delete',\n  deleteBatch = '/${entityPackagePath}/${entityName?uncap_first}/deleteBatch',\n  importExcel = '/${entityPackagePath}/${entityName?uncap_first}/importExcel',\n  exportXls = '/${entityPackagePath}/${entityName?uncap_first}/exportXls',\n<#list subTables as sub><#rt/>\n  ${sub.entityName?uncap_first}List = '/${entityPackagePath}/${entityName?uncap_first}/list${sub.entityName}ByMainId',\n  ${sub.entityName?uncap_first}Save='/${entityPackagePath}/${entityName?uncap_first}/add${sub.entityName}',\n  ${sub.entityName?uncap_first}Edit='/${entityPackagePath}/${entityName?uncap_first}/edit${sub.entityName}',\n  ${sub.entityName?uncap_first}Delete = '/${entityPackagePath}/${entityName?uncap_first}/delete${sub.entityName}',\n  ${sub.entityName?uncap_first}DeleteBatch = '/${entityPackagePath}/${entityName?uncap_first}/deleteBatch${sub.entityName}',\n</#list>\n}\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) =>\n  defHttp.get({url: Api.list, params});\n\n/**\n * 删除单个\n */\nexport const deleteOne = (params,handleSuccess) => {\n  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n/**\n * 批量删除\n * @param params\n */\nexport const batchDelete = (params, handleSuccess) => {\n  createConfirm({\n    iconType: 'warning',\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n/**\n * 保存或者更新\n * @param params\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({url: url, params});\n}\n<#list subTables as sub><#rt/>\n  <#assign myForeignKeys=''>\n  <#list sub.foreignKeys as key>\n    <#assign myForeignKeys='${key?uncap_first}'>\n  </#list>\n/**\n * 列表接口\n * @param params\n */\nexport const ${sub.entityName?uncap_first}List = (params) => {\n  if(params['${myForeignKeys}']){\n    return defHttp.get({url: Api.${sub.entityName?uncap_first}List, params});\n  }\n  return Promise.resolve({});\n}\n\n\n/**\n * 删除单个\n */\nexport const ${sub.entityName?uncap_first}Delete = (params,handleSuccess) => {\n  return defHttp.delete({url: Api.${sub.entityName?uncap_first}Delete, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n/**\n * 批量删除\n * @param params\n */\nexport const ${sub.entityName?uncap_first}DeleteBatch = (params, handleSuccess) => {\n  createConfirm({\n    iconType: 'warning',\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({url: Api.${sub.entityName?uncap_first}DeleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n/**\n * 保存或者更新\n * @param params\n */\nexport const  ${sub.entityName?uncap_first}SaveOrUpdate = (params, isUpdate) => {\n  let url = isUpdate ? Api.${sub.entityName?uncap_first}Edit : Api.${sub.entityName?uncap_first}Save;\n  return defHttp.post({url: url, params});\n}\n/**\n * 导入\n */\nexport const ${sub.entityName?uncap_first}ImportUrl = '/${entityPackagePath}/${entityName?uncap_first}/import${sub.entityName}'\n\n/**\n * 导出\n */\nexport const ${sub.entityName?uncap_first}ExportXlsUrl = '/${entityPackagePath}/${entityName?uncap_first}/export${sub.entityName}'\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi",
    "content": "<#include \"/common/utils.ftl\">\nimport {BasicColumn} from '/@/components/Table';\nimport {FormSchema} from '/@/components/Table';\nimport { rules} from '/@/utils/helper/validator';\nimport { render } from '/@/utils/common/renderUtils';\nimport { getWeekMonthQuarterYear } from '/@/utils';\n//列表数据\nexport const columns: BasicColumn[] = [\n <#list columns as po>\n   <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n   <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   {\n    title: '${po.filedComment}',\n    align:\"center\",\n    <#if po.sort=='Y'>\n    sorter: true,\n   </#if>\n    <#if po.classType=='date'>\n    dataIndex: '${po.fieldName}',\n    customRender:({text}) =>{\n      text = !text ? \"\" : (text.length > 10 ? text.substr(0,10) : text);\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      if(text) {\n        return getWeekMonthQuarterYear(text)['${po.extendParams.picker}'];\n      } else {\n        return text;\n      }\n      <#else>\n      return text;\n      </#if>\n    },\n    <#elseif po.fieldDbType=='Blob'>\n    dataIndex: '${po.fieldName}String'\n    <#elseif po.classType=='umeditor'>\n    dataIndex: '${po.fieldName}',\n    <#elseif po.classType=='pca'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='file'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='image'>\n    dataIndex: '${po.fieldName}',\n    customRender:render.renderImage,\n   <#elseif po.classType=='switch'>\n    dataIndex: '${po.fieldName}',\n<#assign switch_extend_arr=['Y','N']>\n<#if po.dictField?default(\"\")?contains(\"[\")>\n<#assign switch_extend_arr=po.dictField?eval>\n</#if>\n<#list switch_extend_arr as a>\n<#if a_index == 0>\n<#assign switch_extend_arr1=a>\n<#else>\n<#assign switch_extend_arr2=a>\n</#if>\n</#list>\n    customRender:({text}) => {\n       return  render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}])\n     },\n   <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict' || po.classType=='link_table'>\n    dataIndex: '${po.fieldName}_dictText'\n   <#elseif po.classType=='cat_tree'>\n    dataIndex: '${po.fieldName}',\n    <#if po.dictText?default(\"\")?trim?length == 0>\n    customRender:({text}) => {\n       return  render.renderCategoryTree(text,'${po.dictField?default(\"\")}')\n   },\n   <#else>\n    customRender: (text, record) => (text ? record['${po.dictText}'] : '')\n   </#if>\n   <#else>\n    dataIndex: '${po.fieldName}'\n   </#if>\n   },\n   </#if>\n </#list>\n];\n//查询数据\nexport const searchFormSchema: FormSchema[] = [\n<#-- 开始循环 -->\n<#list columns as po>\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if po.isQuery=='Y' && po.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#assign query_flag=true>\n\t<#assign query_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n\t    <#assign query_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n    <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign query_field_dictCode=\"${po.dictField}\">\n    </#if>\n<#if po.queryMode=='single'>\n\t{\n      label: \"${po.filedComment}\",\n      field: \"${po.fieldName}\",\n<#if po.classType=='sel_search'>\n      component: 'JSearchSelect',\n      componentProps:{\n         dict:\"${query_field_dictCode}\"\n      },\n<#elseif po.classType=='sel_user'>\n<#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n      component: 'JSelectUser',\n<#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n      componentProps:{\n      <#if po.extendParams?exists && po.extendParams.text?exists>\n          labelKey: '${po.extendParams.text}',\n      </#if>\n      <#if po.extendParams?exists && po.extendParams.store?exists>\n          rowKey: '${po.extendParams.store}',\n      </#if>\n        },\n<#elseif po.classType=='switch'>\n      component: 'JSwitch',\n      componentProps:{\n           query:true,\n           <#if po.dictField != 'is_open'>\n           options:${po.dictField}\n           </#if>\n       },\n <#elseif po.classType=='sel_depart'>\n      component: 'JSelectDept',\n      componentProps:{\n    <#if po.extendParams?exists && po.extendParams.text?exists>\n        labelKey: '${po.extendParams.text}',\n    </#if>\n    <#if po.extendParams?exists && po.extendParams.store?exists>\n        rowKey: '${po.extendParams.store}',\n    </#if>\n      },\n <#elseif po.classType=='list_multi'>\n      component: 'JSelectMultiple',\n      componentProps:{\n     <#if po.dictTable?default(\"\")?trim?length gt 1>\n        dictCode:\"${po.dictTable},${po.dictText},${po.dictField}\",\n     <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        dictCode:\"${po.dictField}\",\n     </#if>\n        triggerChange: true\n     },\n <#elseif po.classType=='cat_tree'>\n      component: 'JCategorySelect',\n      componentProps:{\n          pcode:\"${po.dictField?default(\"\")}\",//back和事件未添加，暂时有问题\n      },\n<#elseif po.classType=='date'>\n      component: 'DatePicker',\n      componentProps: {\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        picker: '${po.extendParams.picker}',\n        </#if>\n        valueFormat: 'YYYY-MM-DD'\n      },      \n<#elseif po.classType=='datetime'>\n      component: 'DatePicker',\n      componentProps: {\n         showTime:true,\n         valueFormat: 'YYYY-MM-DD HH:mm:ss'\n      },\n<#elseif po.classType=='pca'>\n      component: 'JAreaLinkage',\n      componentProps: {\n        saveCode: 'region',\n      },\n<#elseif po.classType=='popup'>\n    <#include \"/common/form/vue3popup.ftl\">\n<#elseif po.classType=='popup_dict'>\n      component: 'JPopupDict',\n      componentProps: {\n        placeholder: '请选择${po.filedComment}',\n        dictCode: '${po.dictTable},${po.dictText},${po.dictField}',\n        multi: ${po.extendParams.popupMulti?c}\n      },\n<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>\n<#--  ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->\n      component: 'JSelectMultiple',\n      componentProps:{\n       <#if po.dictTable?default(\"\")?trim?length gt 1>\n          dictCode:\"${po.dictTable},${po.dictText},${po.dictField}\"\n       <#elseif po.dictField?default(\"\")?trim?length gt 1>\n          dictCode:\"${po.dictField}\"\n        </#if>\n      },\n<#elseif po.classType == 'sel_tree'>\n      component: 'JTreeSelect',\n      componentProps:{\n          <#if po.dictText??>\n          <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n          dict:\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\",\n          <#elseif po.dictText?split(',')[1]??>\n          pidField:\"${po.dictText?split(',')[1]}\",\n          <#elseif po.dictText?split(',')[3]??>\n          hasChildField:\"${po.dictText?split(',')[3]}\",\n          </#if>\n          </#if>\n          pidValue:\"${po.dictField}\",\n      },\n<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n      component: 'InputNumber',\n<#else>\n      component: 'Input',\n</#if>\n      //colProps: {span: 6},\n \t},\n<#elseif po.queryMode=='like'>\n  {\n    label: \"${po.filedComment}\",\n    field: \"${po.fieldName}\",\n    component: 'JInput',\n  },\n<#else>\n     {\n      label: \"${po.filedComment}\",\n      field: \"${po.fieldName}\",\n<#if po.classType=='date'>\n      component: 'RangePicker',\n      componentProps: {\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        picker: '${po.extendParams.picker}',\n        </#if>\n        valueType: 'Date',\n      },\n<#elseif po.classType=='datetime'>\n      component: 'RangePicker',\n      componentProps: {\n          valueType: 'Date',\n          showTime:true\n      },\n<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n      component: 'JRangeNumber',\n<#-- update-begin---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n<#elseif po.classType=='time'>\n      component: 'RangeTime',\n<#-- update-end---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n<#else>\n      component: 'Input', //TODO 范围查询\n</#if>\n      //colProps: {span: 6},\n\t},\n</#if>\n</#if>\n</#list>\n<#-- 结束循环 -->\n];\n\n//表单数据\nexport const formSchema: FormSchema[] = [\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign bpm_flag=false>\n<#assign id_exists = false>\n<#list columns as po><#rt/>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.fieldDbName == 'id'>\n\t<#assign id_exists = true>\n</#if>\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if po.isShow =='Y' && po.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n  {\n    label: '${po.filedComment}',\n    field: ${autoStringSuffix(po)},\n<#-- update-begin-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n  <#if po.defaultVal??>\n    <#if po.fieldDbType==\"BigDecimal\" || po.fieldDbType==\"double\" || po.fieldDbType==\"int\">\n    defaultValue: ${po.defaultVal},\n    <#else>\n    defaultValue: \"${po.defaultVal}\",\n    </#if>\n  </#if>\n<#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n    <#if po.classType =='date'>\n    component: 'DatePicker',\n    componentProps: {\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        picker: '${po.extendParams.picker}',\n        </#if>\n      valueFormat: 'YYYY-MM-DD'\n    },\n     <#elseif po.classType =='datetime'>\n    component: 'DatePicker',\n    componentProps: {\n       showTime:true,\n       valueFormat: 'YYYY-MM-DD HH:mm:ss'\n     },\n     <#elseif po.classType =='time'>\n    component: 'TimePicker',\n    componentProps: {\n      valueFormat: 'HH:mm:ss'\n    },\n    <#elseif po.classType =='popup'>\n    <#include \"/common/form/vue3popup.ftl\">\n    <#elseif po.classType=='popup_dict'>\n    component: 'JPopupDict',\n    componentProps: {\n      placeholder: '请选择${po.filedComment}',\n      dictCode: '${po.dictTable},${po.dictText},${po.dictField}',\n      multi: ${po.extendParams.popupMulti?c}\n    },\n     <#elseif po.classType =='sel_depart'>\n     component: 'JSelectDept',\n     componentProps:{\n   <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   </#if>\n   <#if po.extendParams?exists && po.extendParams.store?exists>\n       rowKey: '${po.extendParams.store}',\n   </#if>\n     },\n     <#elseif po.classType =='switch'>\n     component: 'JSwitch',\n     componentProps:{\n         <#if po.dictField != 'is_open'>\n         options:${po.dictField}\n         </#if>\n     },\n     <#elseif po.classType =='pca'>\n    component: 'JAreaLinkage',\n    componentProps: {\n      saveCode: 'region',\n    },\n    <#elseif po.classType =='markdown'>\n    component: 'JMarkdownEditor',//注意string转换问题\n     <#elseif po.classType =='password'>\n    component: 'InputPassword',\n     <#elseif po.classType =='sel_user'>\n<#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n    component: 'JSelectUser',\n<#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n    componentProps:{\n    <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   <#else>\n       labelKey:'realname',\n    </#if>\n    <#if po.extendParams?exists && po.extendParams.store?exists>\n        rowKey: '${po.extendParams.store}',\n    </#if>\n     },\n    <#elseif po.classType =='textarea'>\n    component: 'InputTextArea',//TODO 注意string转换问题\n    <#elseif po.classType=='list'>\n    component: 'JDictSelectTag',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\",\n     <#if po.fieldDbType=='int'>\n        stringToNumber: true\n     </#if>\n     },\n    <#elseif po.classType=='radio'>\n    component: 'JDictSelectTag',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\",\n        type: \"radio\",\n     <#if po.fieldDbType=='int'>\n        stringToNumber: true\n     </#if>\n     },\n     <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- -->\n    <#elseif po.classType=='list_multi'>\n    component: 'JSelectMultiple',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n    <#elseif po.classType=='checkbox'>\n    component: 'JCheckbox',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n     <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- -->\n    <#elseif po.classType=='sel_search'>\n    component: 'JSearchSelect',\n    componentProps:{\n       dict:\"${form_field_dictCode}\"\n    },\n<#elseif po.classType=='cat_tree'>\n    <#assign form_cat_tree = true>\n    component: 'JCategorySelect',\n    componentProps:{\n       pcode:\"${po.dictField?default(\"\")}\", //TODO back和事件未添加，暂时有问题\n    },\n    <#if po.dictText?default(\"\")?trim?length gt 1>\n    <#assign form_cat_back = \"${po.dictText}\">\n    </#if>\n    <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n    component: 'InputNumber',\n    <#elseif po.classType=='file'>\n    component: 'JUpload',\n    componentProps:{\n    <#if po.uploadnum??>\n       maxCount:${po.uploadnum}\n   </#if>\n     },\n <#elseif po.classType=='image'>\n     component: 'JImageUpload',\n     componentProps:{\n     <#if po.uploadnum??>\n        fileMax:${po.uploadnum}\n     <#else>\n        fileMax: 0\n    </#if>\n      },\n  <#elseif po.classType=='umeditor'>\n    component: 'JEditor',\n  <#elseif po.classType == 'sel_tree'>\n    component: 'JTreeSelect',\n    componentProps:{\n        <#if po.dictText??>\n        <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n        dict:\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\",\n        <#elseif po.dictText?split(',')[1]??>\n        pidField:\"${po.dictText?split(',')[1]}\",\n        <#elseif po.dictText?split(',')[3]??>\n        hasChildField:\"${po.dictText?split(',')[3]}\",\n        </#if>\n        </#if>\n        pidValue:\"${po.dictField}\",\n    },\n <#elseif po.classType=='link_table'>\n    component: 'JLinkTableCard',\n    componentProps: {\n     valueField: '${po.dictField}',\n     textField: '${po.dictText}',\n     tableName: '${po.dictTable}',\n     multi: <#if (po.queryMode!\"\") == \"multi\">true<#else>false</#if>\n    },\n   <#else>\n    component: 'Input',\n    </#if>\n     <#include \"/common/utils.ftl\">\n    <#if po.isShow == 'Y' && poHasCheck(po)>\n    dynamicRules: ({model,schema}) => {\n    <#if po.fieldName != 'id'>\n    <#assign fieldValidType = po.fieldValidType!''>\n          return [\n            <#-- 非空校验 -->\n           <#if po.nullable == 'N' || fieldValidType == '*'>\n                 { required: true, message: '请输入${po.filedComment}!'},\n           <#elseif fieldValidType!=''>\n                 { required: false},\n           </#if>\n       <#-- 唯一校验 -->\n           <#if fieldValidType == 'only'>\n                 {...rules.duplicateCheckRule(<#if sub?default(\"\")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'</#if>, '${po.fieldDbName}',model,schema)[0]},\n           <#-- 6到16位数字 -->\n           <#elseif fieldValidType == 'n6-16'>\n                 { pattern: /^\\d{6,16}$|^(?=\\d+\\.\\d+)[\\d.]{7,17}$/, message: '请输入6到16位数字!'},\n           <#-- 6到16位任意字符 -->\n           <#elseif fieldValidType == '*6-16'>\n                 { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},\n           <#-- 6到18位字母 -->\n           <#elseif fieldValidType == 's6-18'>\n                 { pattern:/^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},\n           <#-- 网址 -->\n           <#elseif fieldValidType == 'url'>\n                 { pattern: /^((ht|f)tps?):\\/\\/[\\w\\-]+(\\.[\\w\\-]+)+([\\w\\-.,@?^=%&:\\/~+#]*[\\w\\-@?^=%&\\/~+#])?$/, message: '请输入正确的网址!'},\n           <#-- 电子邮件 -->\n           <#elseif fieldValidType == 'e'>\n                 { pattern: /^([\\w]+\\.*)([\\w]+)@[\\w]+\\.\\w{3}(\\.\\w{2}|)$/, message: '请输入正确的电子邮件!'},\n           <#-- 手机号码 -->\n           <#elseif fieldValidType == 'm'>\n                 { pattern: /^1[3456789]\\d{9}$/, message: '请输入正确的手机号码!'},\n           <#-- 邮政编码 -->\n           <#elseif fieldValidType == 'p'>\n                 { pattern: /^[0-9]\\d{5}$/, message: '请输入正确的邮政编码!'},\n           <#-- 字母 -->\n           <#elseif fieldValidType == 's'>\n                 { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},\n           <#-- 数字 -->\n           <#elseif fieldValidType == 'n'>\n                 { pattern: /^-?\\d+\\.?\\d*$/, message: '请输入数字!'},\n           <#-- 整数 -->\n           <#elseif fieldValidType == 'z'>\n                 { pattern: /^-?\\d+$/, message: '请输入整数!'},\n           <#-- 金额 -->\n           <#elseif fieldValidType == 'money'>\n                 { pattern: /^(([1-9][0-9]*)|([0]\\.\\d{0,2}|[1-9][0-9]*\\.\\d{0,2}))$/, message: '请输入正确的金额!'},\n           <#-- 正则校验 -->\n           <#elseif fieldValidType != '' && fieldValidType != '*'>\n                 { pattern: '${fieldValidType}', message: '不符合校验规则!'},\n           <#-- 无校验 -->\n           <#else>\n               <#t>\n           </#if>\n          ];\n     </#if>\n     },\n    </#if>\n    <#if po.readonly=='Y'>\n    dynamicDisabled:true,\n    </#if>\n  },\n</#if>\n</#list>\n<#if id_exists == false>\n\t// TODO 主键隐藏字段，目前写死为ID\n\t{\n\t  label: '',\n\t  field: 'id',\n\t  component: 'Input',\n\t  show: false\n\t},\n</#if>\n];\n\n<#list subTables as sub>\n//子表列表数据\nexport const ${sub.entityName?uncap_first}Columns: BasicColumn[] = [\n <#list sub.originalColumns as po>\n   <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n   <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   {\n    title: '${po.filedComment}',\n    align:\"center\",\n    <#if po.sort=='Y'>\n    sorter: true,\n   </#if>\n    <#if po.classType=='date'>\n    dataIndex: '${po.fieldName}',\n    customRender:({text}) =>{\n      text = !text ? \"\" : (text.length > 10 ? text.substr(0,10) : text);\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      if(text) {\n        return getWeekMonthQuarterYear(text)['${po.extendParams.picker}'];\n      } else {\n        return text;\n      }\n      <#else>\n      return text;\n      </#if>\n    },\n    <#elseif po.fieldDbType=='Blob'>\n    dataIndex: '${po.fieldName}String'\n    <#elseif po.classType=='umeditor'>\n    dataIndex: '${po.fieldName}',\n    <#elseif po.classType=='pca'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='file'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='image'>\n    dataIndex: '${po.fieldName}',\n    customRender:render.renderImage,\n   <#elseif po.classType=='switch'>\n    dataIndex: '${po.fieldName}',\n<#assign switch_extend_arr=['Y','N']>\n<#if po.dictField?default(\"\")?contains(\"[\")>\n<#assign switch_extend_arr=po.dictField?eval>\n</#if>\n<#list switch_extend_arr as a>\n<#if a_index == 0>\n<#assign switch_extend_arr1=a>\n<#else>\n<#assign switch_extend_arr2=a>\n</#if>\n</#list>\n    customRender:({text}) => {\n       return  render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}])\n     },\n   <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='link_table'>\n    dataIndex: '${po.fieldName}_dictText'\n   <#elseif po.classType=='cat_tree'>\n    dataIndex: '${po.fieldName}',\n    <#if po.dictText?default(\"\")?trim?length == 0>\n    customRender:({text}) => {\n       return  render.renderCategoryTree(text,'${po.dictField?default(\"\")}')\n   },\n   <#else>\n    customRender: ({text, record}) => (text ? record['${po.dictText}'] : '')\n   </#if>\n   <#else>\n    dataIndex: '${po.fieldName}'\n   </#if>\n   },\n   </#if>\n </#list>\n];\n//子表表单数据\nexport const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign bpm_flag=false>\n<#list sub.originalColumns as po><#rt/>\n<#if po.fieldName == 'id'>\n  // TODO 子表隐藏字段，目前写死为ID\n  {\n    label: '',\n    field: 'id',\n    component: 'Input',\n    show: false\n  },\n</#if>\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if po.isShow =='Y' && po.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n  {\n    label: '${po.filedComment}',\n    field: ${autoStringSuffix(po)},\n<#-- update-begin-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n  <#if po.defaultVal??>\n    <#if po.fieldDbType==\"BigDecimal\" || po.fieldDbType==\"double\" || po.fieldDbType==\"int\">\n    defaultValue: ${po.defaultVal},\n    <#else>\n    defaultValue: \"${po.defaultVal}\",\n    </#if>\n  </#if>\n<#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n    <#if po.classType =='date'>\n    component: 'DatePicker',\n    componentProps: {\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        picker: '${po.extendParams.picker}',\n        </#if>\n      valueFormat: 'YYYY-MM-DD'\n    },\n     <#elseif po.classType =='datetime'>\n    component: 'DatePicker',\n    componentProps: {\n       showTime:true,\n       valueFormat: 'YYYY-MM-DD HH:mm:ss'\n     },\n     <#elseif po.classType =='time'>\n    component: 'TimePicker',\n    componentProps: {\n      valueFormat: 'HH:mm:ss'\n    },\n    <#elseif po.classType =='popup'>\n    <#include \"/common/form/vue3popup.ftl\">\n    <#elseif po.classType=='popup_dict'>\n    component: 'JPopupDict',\n    componentProps: {\n      placeholder: '请选择${po.filedComment}',\n      dictCode: '${po.dictTable},${po.dictText},${po.dictField}',\n      multi: ${po.extendParams.popupMulti?c}\n    },\n     <#elseif po.classType =='sel_depart'>\n     component: 'JSelectDept',\n     componentProps:{\n   <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   </#if>\n   <#if po.extendParams?exists && po.extendParams.store?exists>\n       rowKey: '${po.extendParams.store}',\n   </#if>\n     },\n     <#elseif po.classType =='switch'>\n     component: 'JSwitch',\n     componentProps:{\n         <#if po.dictField != 'is_open'>\n         options:${po.dictField}\n         </#if>\n     },\n     <#elseif po.classType =='pca'>\n    component: 'JAreaLinkage',\n    componentProps: {\n      saveCode: 'region',\n    },\n    <#elseif po.classType =='markdown'>\n    component: 'JMarkdownEditor',//注意string转换问题\n     <#elseif po.classType =='password'>\n    component: 'InputPassword',\n     <#elseif po.classType =='sel_user'>\n<#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n    component: 'JSelectUser',\n<#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n     componentProps:{\n        <#if po.extendParams?exists && po.extendParams.text?exists>\n           labelKey: '${po.extendParams.text}',\n       <#else>\n           labelKey:'realname',\n        </#if>\n        <#if po.extendParams?exists && po.extendParams.store?exists>\n            rowKey: '${po.extendParams.store}',\n        </#if>\n         },\n    <#elseif po.classType =='textarea'>\n    component: 'InputTextArea',\n    <#elseif po.classType=='list' || po.classType=='radio'>\n    component: 'JDictSelectTag',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\",\n     <#if po.fieldDbType=='int'>\n        stringToNumber: true\n     </#if>\n     },\n     <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- -->\n    <#elseif po.classType=='list_multi'>\n    component: 'JSelectMultiple',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n    <#elseif po.classType=='checkbox'>\n    component: 'JCheckbox',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n     <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- -->\n    <#elseif po.classType=='sel_search'>\n    component: 'JSearchSelect',\n    componentProps:{\n       dict:\"${form_field_dictCode}\"\n    },\n<#elseif po.classType=='cat_tree'>\n    <#assign form_cat_tree = true>\n    component: 'JCategorySelect',\n    componentProps:{\n       pcode:\"${po.dictField?default(\"\")}\", //TODO back和事件未添加，暂时有问题\n    },\n    <#if po.dictText?default(\"\")?trim?length gt 1>\n    <#assign form_cat_back = \"${po.dictText}\">\n    </#if>\n    <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n    component: 'InputNumber',\n    <#elseif po.classType=='file'>\n    component: 'JUpload',\n    componentProps:{\n    <#if po.uploadnum??>\n       maxCount:${po.uploadnum}\n   </#if>\n     },\n <#elseif po.classType=='image'>\n     component: 'JImageUpload',\n     componentProps:{\n     <#if po.uploadnum??>\n        fileMax:${po.uploadnum}\n     <#else>\n        fileMax: 0\n     </#if>\n    },\n  <#elseif po.classType=='umeditor'>\n    component: 'JEditor',\n  <#elseif po.classType == 'sel_tree'>\n    component: 'JTreeSelect',\n    componentProps:{\n        <#if po.dictText??>\n        <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n        dict:\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\",\n        <#elseif po.dictText?split(',')[1]??>\n        pidField:\"${po.dictText?split(',')[1]}\",\n        <#elseif po.dictText?split(',')[3]??>\n        hasChildField:\"${po.dictText?split(',')[3]}\",\n        </#if>\n        </#if>\n        pidValue:\"${po.dictField}\",\n    },\n <#elseif po.classType=='link_table'>\n    component: 'JLinkTableCard',\n    componentProps: {\n     valueField: '${po.dictField}',\n     textField: '${po.dictText}',\n     tableName: '${po.dictTable}',\n     multi: <#if (po.queryMode!\"\") == \"multi\">true<#else>false</#if>\n    },\n   <#else>\n    component: 'Input',\n    </#if>\n     <#include \"/common/utils.ftl\">\n    <#if po.isShow == 'Y' && poHasCheck(po)>\n    dynamicRules: ({model,schema}) => {\n    <#if po.fieldName != 'id'>\n    <#assign fieldValidType = po.fieldValidType!''>\n          return [\n            <#-- 非空校验 -->\n           <#if po.nullable == 'N' || fieldValidType == '*'>\n                 { required: true, message: '请输入${po.filedComment}!'},\n           <#elseif fieldValidType!=''>\n                 { required: false},\n           </#if>\n       <#-- 唯一校验 -->\n           <#if fieldValidType == 'only'>\n                 {...rules.duplicateCheckRule(<#if sub?default(\"\")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'</#if>, '${po.fieldDbName}',model,schema)[0]},\n           <#-- 6到16位数字 -->\n           <#elseif fieldValidType == 'n6-16'>\n                 { pattern: /^\\d{6,16}$|^(?=\\d+\\.\\d+)[\\d.]{7,17}$/, message: '请输入6到16位数字!'},\n           <#-- 6到16位任意字符 -->\n           <#elseif fieldValidType == '*6-16'>\n                 { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},\n           <#-- 6到18位字母 -->\n           <#elseif fieldValidType == 's6-18'>\n                 { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},\n           <#-- 网址 -->\n           <#elseif fieldValidType == 'url'>\n                 { pattern: /^((ht|f)tps?):\\/\\/[\\w\\-]+(\\.[\\w\\-]+)+([\\w\\-.,@?^=%&:\\/~+#]*[\\w\\-@?^=%&\\/~+#])?$/, message: '请输入正确的网址!'},\n           <#-- 电子邮件 -->\n           <#elseif fieldValidType == 'e'>\n                 { pattern: /^([\\w]+\\.*)([\\w]+)@[\\w]+\\.\\w{3}(\\.\\w{2}|)$/, message: '请输入正确的电子邮件!'},\n           <#-- 手机号码 -->\n           <#elseif fieldValidType == 'm'>\n                 { pattern: /^1[3456789]\\d{9}$/, message: '请输入正确的手机号码!'},\n           <#-- 邮政编码 -->\n           <#elseif fieldValidType == 'p'>\n                 { pattern: /^[0-9]\\d{5}$/, message: '请输入正确的邮政编码!'},\n           <#-- 字母 -->\n           <#elseif fieldValidType == 's'>\n                 { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},\n           <#-- 数字 -->\n           <#elseif fieldValidType == 'n'>\n                 { pattern: /^-?\\d+\\.?\\d*$/, message: '请输入数字!'},\n           <#-- 整数 -->\n           <#elseif fieldValidType == 'z'>\n                 { pattern: /^-?\\d+$/, message: '请输入整数!'},\n           <#-- 金额 -->\n           <#elseif fieldValidType == 'money'>\n                 { pattern: /^(([1-9][0-9]*)|([0]\\.\\d{0,2}|[1-9][0-9]*\\.\\d{0,2}))$/, message: '请输入正确的金额!'},\n           <#-- 正则校验 -->\n           <#elseif fieldValidType != '' && fieldValidType != '*'>\n                 { pattern: '${fieldValidType}', message: '不符合校验规则!'},\n           <#-- 无校验 -->\n           <#else>\n               <#t>\n           </#if>\n          ];\n     </#if>\n     },\n    </#if>\n    <#if po.readonly=='Y'>\n    dynamicDisabled:true,\n    </#if>\n  },\n</#if>\n</#list>\n];\n</#list>\n\n<#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n// 高级查询数据\nexport const superQuerySchema = {\n  <#list columns as po>\n  <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n  <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  ${superQueryFieldListForVue3(po,po_index)},\n  </#if>\n  </#list>\n};\n<#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql",
    "content": "<#include \"/common/sql/menu_insert.ftl\">"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/[1-n]List.vuei",
    "content": "<#list subTables as sub>\n#segment#${sub.entityName}List.vue\n<template>\n <div>\n     <!--引用表格-->\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\" :searchInfo=\"searchInfo\">\n      <!--插槽:table标题-->\n       <template #tableTitle>\n           <a-button type=\"primary\" @click=\"handleCreate\" preIcon=\"ant-design:plus-outlined\" v-if=\"mainId!=''\"> 新增</a-button>\n           <a-button  type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\" v-if=\"mainId!=''\"> 导出</a-button>\n           <j-upload-button  type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\" v-if=\"mainId!=''\">导入</j-upload-button>\n           <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n               <template #overlay>\n                 <a-menu>\n                   <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                     <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                     删除\n                   </a-menu-item>\n                 </a-menu>\n               </template>\n               <a-button>批量操作\n                 <Icon icon=\"mdi:chevron-down\"></Icon>\n               </a-button>\n         </a-dropdown>\n       </template>\n        <!--操作栏-->\n       <template #action=\"{ record }\">\n         <TableAction :actions=\"getTableAction(record)\"/>\n       </template>\n       <!--字段回显插槽-->\n       <template v-slot:bodyCell=\"{ column, record, index, text }\">\n       <#list sub.originalColumns as po>\n         <#if po.classType=='umeditor' || po.classType=='pca' || po.classType=='file'>\n         <template v-if=\"column.dataIndex==='${po.fieldName}'\">\n         <#if po.classType=='umeditor'>\n           <!--富文本件字段回显插槽-->\n           <div v-html=\"text\"></div>\n         </#if>\n         <#if po.classType=='file'>\n           <!--文件字段回显插槽-->\n           <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n           <a-button v-else :ghost=\"true\" type=\"primary\" preIcon=\"ant-design:download-outlined\" size=\"small\" @click=\"downloadFile(text)\">下载</a-button>\n         </#if>\n         </template>\n        </#if>\n       </#list>\n       </template>\n     </BasicTable>\n\n      <${sub.entityName}Modal @register=\"registerModal\" @success=\"handleSuccess\"/>\n   </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import {ref, computed, unref,inject,watch} from 'vue';\n  import {BasicTable, useTable, TableAction} from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage'\n  import {useModal} from '/@/components/Modal';\n  import ${sub.entityName}Modal from './components/${sub.entityName}Modal.vue'\n  import {${sub.entityName?uncap_first}Columns} from './${entityName}.data';\n  import {${sub.entityName?uncap_first}List, ${sub.entityName?uncap_first}Delete, ${sub.entityName?uncap_first}DeleteBatch, ${sub.entityName?uncap_first}ExportXlsUrl, ${sub.entityName?uncap_first}ImportUrl } from './${entityName}.api';\n  import {isEmpty} from \"/@/utils/is\";\n  import {useMessage} from '/@/hooks/web/useMessage';\n  import {downloadFile} from '/@/utils/common/renderUtils';\n\n    //接收主表id\n    const mainId = inject('mainId') || '';\n    //提示弹窗\n    const $message = useMessage()\n    //弹窗model\n    const [registerModal, {openModal}] = useModal();\n    const searchInfo = {};\n    // 列表页面公共参数、方法\n    const {prefixCls, tableContext, onImportXls, onExportXls} = useListPage({\n        tableProps: {\n            api: ${sub.entityName?uncap_first}List,\n            columns: ${sub.entityName?uncap_first}Columns,\n            canResize: true,\n            useSearchForm: false,\n            actionColumn: {\n                width: 180,\n                fixed:'right'\n            },\n            pagination:{\n                current: 1,\n                pageSize: 5,\n                pageSizeOptions: ['5', '10', '20'],\n            }\n        },\n        exportConfig: {\n            name: '${sub.ftlDescription}',\n            url: ${sub.entityName?uncap_first}ExportXlsUrl,\n            params: {\n                <#list sub.foreignKeys as key>\n                '${key?uncap_first}': mainId\n                </#list>\n            }\n        },\n        importConfig: {\n            url: ()=>{\n                return ${sub.entityName?uncap_first}ImportUrl + '/' + unref(mainId)\n            }\n        }\n    });\n\n    //注册table数据\n    const [registerTable, {reload<#if sub.foreignRelationType =='1'>,getDataSource</#if>}, {rowSelection, selectedRowKeys}] = tableContext;\n\n    watch(mainId, () => {\n     <#list sub.foreignKeys as key>\n         searchInfo['${key?uncap_first}'] = unref(mainId);\n     </#list>\n         reload();\n      }\n    );\n\n    /**\n     * 新增事件\n     */\n    function handleCreate() {\n        if (isEmpty(unref(mainId))) {\n            $message.createMessage.warning('请选择一个主表信息')\n            return;\n        }\n        <#if sub.foreignRelationType =='1'>\n        let dataSource = getDataSource();\n        if(dataSource.length  >=  1){\n            $message.createMessage.warning('一对一子表只能添加一条数据')\n            return;\n        }\n        </#if>\n        openModal(true, {\n            isUpdate: false,\n            showFooter: true,\n        });\n    }\n\n    /**\n     * 编辑事件\n     */\n    async function handleEdit(record: Recordable) {\n        openModal(true, {\n            record,\n            isUpdate: true,\n            showFooter: true,\n        });\n    }\n\n    /**\n     * 删除事件\n     */\n    async function handleDelete(record) {\n        await ${sub.entityName?uncap_first}Delete({id: record.id}, handleSuccess);\n    }\n\n    /**\n     * 批量删除事件\n     */\n    async function batchHandleDelete() {\n        await ${sub.entityName?uncap_first}DeleteBatch({ids: selectedRowKeys.value}, handleSuccess)\n    }\n\n    /**\n     * 成功回调\n     */\n    function handleSuccess() {\n        (selectedRowKeys.value = []) && reload();\n    }\n\n    /**\n     * 操作栏\n     */\n    function getTableAction(record) {\n        return [\n            {\n                label: '编辑',\n                onClick: handleEdit.bind(null, record),\n            }, {\n                label: '删除',\n                popConfirm: {\n                    title: '是否确认删除',\n                    confirm: handleDelete.bind(null, record),\n                    placement: 'topLeft',\n                },\n            }\n        ]\n    }\n</script>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n<#assign buttonList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n  <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n</#if>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" destroyOnClose :title=\"title\" :maxHeight=\"500\" :width=\"${getModalWidth(tableVo.fieldRowNum?default(1))}\" @ok=\"handleSubmit\">\n      <BasicForm @register=\"registerForm\" name=\"${entityName}Form\" />\n  <#if buttonList?? && buttonList?size gt 0>\n     <template #insertFooter>\n      <#list buttonList as btn>\n       <#if btn.buttonStyle=='form'>\n         <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"ant-design:${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n       </#if>\n      </#list>\n     </template>\n  </#if>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n    import {ref, computed, unref, reactive} from 'vue';\n    import {BasicModal, useModalInner} from '/@/components/Modal';\n    import {BasicForm, useForm} from '/@/components/Form/index';\n    import {formSchema} from '../${entityName}.data';\n    import {saveOrUpdate} from '../${entityName}.api';\n    import { useMessage } from '/@/hooks/web/useMessage';\n    import { getDateByPicker } from '/@/utils';\n    //日期个性化选择\n    const fieldPickers = reactive({\n    <#list columns as po>\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      ${po.fieldName}: '${po.extendParams.picker}',\n      </#if>\n    </#list>\n    });\n    const { createMessage } = useMessage();\n    // Emits声明\n    const emit = defineEmits(['register','success']);\n    const isUpdate = ref(true);\n    const isDetail = ref(false);\n    //表单配置\n    const [registerForm, { setProps,resetFields, setFieldsValue, validate, scrollToField }] = useForm({\n        <#if tableVo.fieldRowNum == 1>\n        labelWidth: 150,\n        </#if>\n        schemas: formSchema,\n        showActionButtonGroup: false,\n        baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}},\n        baseRowStyle: { padding: \"0 20px\" }\n    });\n    //表单赋值\n    const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {\n        //重置表单\n        await resetFields();\n        setModalProps({confirmLoading: false,showCancelBtn:!!data?.showFooter,showOkBtn:!!data?.showFooter});\n        isUpdate.value = !!data?.isUpdate;\n        isDetail.value = !!data?.showFooter;\n        if (unref(isUpdate)) {\n            //表单赋值\n            await setFieldsValue({\n                ...data.record,\n            });\n        }\n        // 隐藏底部时禁用整个表单\n       setProps({ disabled: !data?.showFooter })\n    });\n    //设置标题\n    const title = computed(() => (!unref(isUpdate) ? '新增' : !unref(isDetail) ? '详情' : '编辑'));\n    //表单提交事件\n    async function handleSubmit(v) {\n        try {\n            let values = await validate();\n            // 预处理日期数据\n            changeDateValue(values);\n            setModalProps({confirmLoading: true});\n            //提交表单\n            await saveOrUpdate(values, isUpdate.value);\n            //关闭弹窗\n            closeModal();\n            //刷新列表\n            emit('success');\n        } catch ({ errorFields }) {\n          if (errorFields) {\n            const firstField = errorFields[0];\n            if (firstField) {\n              scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });\n            }\n          }\n          return Promise.reject(errorFields);\n        } finally {\n            setModalProps({confirmLoading: false});\n        }\n    }\n\n    /**\n     * 处理日期值\n     * @param formData 表单数据\n     */\n    const changeDateValue = (formData) => {\n        if (formData && fieldPickers) {\n            for (let key in fieldPickers) {\n                if (formData[key]) {\n                    formData[key] = getDateByPicker(formData[key], fieldPickers[key]);\n                }\n            }\n        }\n    };\n<#if buttonList?size gt 0>\n  <#list buttonList as btn>\n      <#if btn.buttonStyle=='form'>\n         function handle${btn.buttonCode?cap_first}(){\n            createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n         }\n      </#if>\n  </#list>\n</#if>\n</script>\n\n<style lang=\"less\" scoped>\n\t/** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-calendar-picker) {\n    width: 100%;\n  }\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Modal.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<#list subTables as sub>\n#segment#${sub.entityName}Modal.vue\n<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" destroyOnClose :title=\"title\" :maxHeight=\"500\" :width=\"${getModalWidth(tableVo.fieldRowNum?default(1))}\" @ok=\"handleSubmit\">\n      <BasicForm @register=\"registerForm\" name=\"${sub.entityName}Form\" />\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n    import {ref, computed, unref,inject, reactive} from 'vue';\n    import {BasicModal, useModalInner} from '/@/components/Modal';\n    import {BasicForm, useForm} from '/@/components/Form/index';\n    import {${sub.entityName?uncap_first}FormSchema} from '../${entityName}.data';\n    import {${sub.entityName?uncap_first}SaveOrUpdate} from '../${entityName}.api';\n    import { getDateByPicker } from '/@/utils';\n    //日期个性化选择\n    const fieldPickers = reactive({\n    <#list sub.colums as po>\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      ${po.fieldName}: '${po.extendParams.picker}',\n      </#if>\n    </#list>\n    });\n\n    //接收主表id\n    const mainId = inject('mainId');\n    // Emits声明\n    const emit = defineEmits(['register','success']);\n    const isUpdate = ref(true);\n    const isDetail = ref(false);\n    //表单配置\n    const [registerForm, { setProps,resetFields, setFieldsValue, validate, scrollToField }] = useForm({\n        <#if tableVo.fieldRowNum == 1>\n        labelWidth: 150,\n        </#if>\n        schemas: ${sub.entityName?uncap_first}FormSchema,\n        showActionButtonGroup: false,\n        baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}},\n        baseRowStyle: { padding: \"0 20px\" }\n    });\n    //表单赋值\n    const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {\n        //重置表单\n        await resetFields();\n        setModalProps({confirmLoading: false,showCancelBtn:!!data?.showFooter,showOkBtn:!!data?.showFooter});\n        isUpdate.value = !!data?.isUpdate;\n        isDetail.value = !!data?.showFooter;\n        if (unref(isUpdate)) {\n            //表单赋值\n            await setFieldsValue({\n                ...data.record,\n            });\n        }\n        // 隐藏底部时禁用整个表单\n       setProps({ disabled: !data?.showFooter })\n    });\n    //设置标题\n    const title = computed(() => (!unref(isUpdate) ? '新增' : !unref(isDetail) ? '详情' : '编辑'));\n    //表单提交事件\n    async function handleSubmit(v) {\n        try {\n            let values = await validate();\n            // 预处理日期数据\n            changeDateValue(values);\n            setModalProps({confirmLoading: true});\n            if (unref(mainId)) {\n             <#list sub.foreignKeys as key>\n                values['${key?uncap_first}'] = unref(mainId);\n             </#list>\n             }\n            //提交表单\n            await ${sub.entityName?uncap_first}SaveOrUpdate(values, isUpdate.value);\n            //关闭弹窗\n            closeModal();\n            //刷新列表\n            emit('success');\n        } catch ({ errorFields }) {\n          if (errorFields) {\n            const firstField = errorFields[0];\n            if (firstField) {\n              scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });\n            }\n          }\n        } finally {\n            setModalProps({confirmLoading: false});\n        }\n    }\n\n    /**\n     * 处理日期值\n     * @param formData 表单数据\n     */\n    const changeDateValue = (formData) => {\n      if (formData && fieldPickers) {\n          for (let key in fieldPickers) {\n              if (formData[key]) {\n                  formData[key] = getDateByPicker(formData[key], fieldPickers[key]);\n              }\n          }\n      }\n    };\n</script>\n<style lang=\"less\" scoped>\n\t/** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-calendar-picker) {\n    width: 100%;\n  }\n</style>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n  <div class=\"p-2 erpNativeList\">\n    <#assign query_field_no=0>\n    <#assign need_category = false>\n    <#assign need_pca = false>\n    <#assign need_search = false>\n    <#assign need_dept_user = false>\n    <#assign need_switch = false>\n    <#assign need_dept = false>\n    <#assign need_multi = false>\n    <#assign need_popup = false>\n    <#assign need_popup_dict = false>\n    <#assign need_select_tag = false>\n    <#assign need_select_tree = false>\n    <#assign need_time = false>\n    <#assign bpm_flag=false>\n    <#assign need_markdown = false>\n    <#assign need_upload = false>\n    <#assign need_image_upload = false>\n    <#assign need_editor = false>\n    <#assign need_checkbox = false>\n    <#assign query_flag = false>\n    <#assign need_range_number = false>\n    <#assign is_range = false>\n    <#assign is_like = false>\n    <#assign buttonList=[]>\n    <#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n      <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n    </#if>\n    <!--查询区域-->\n    <div class=\"jeecg-basic-table-form-container\">\n      <a-form ref=\"formRef\" @keyup.enter.native=\"reload\" :model=\"queryParam\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\">\n        <a-row :gutter=\"24\">\n          <#-- 开始循环 -->\n          <#list columns as po>\n            <#if po.fieldDbName=='bpm_status'>\n              <#assign bpm_flag=true>\n            </#if>\n            <#if po.isQuery=='Y'>\n              <#assign query_flag=true>\n            </#if>\n            <#if po.classType=='cat_tree' && po.dictText?default(\"\")?trim?length == 0>\n              <#assign need_category=true>\n            </#if>\n            <#if po.classType=='pca'>\n              <#assign need_pca=true>\n            </#if>\n            <#if po.classType=='sel_search'>\n              <#assign need_search = true>\n            </#if>\n            <#if po.classType=='sel_user'>\n              <#assign need_dept_user = true>\n            </#if>\n            <#if po.classType=='sel_depart'>\n              <#assign need_dept = true>\n            </#if>\n            <#if po.classType=='switch'>\n              <#assign need_switch = true>\n            </#if>\n            <#if po.classType=='list_multi'>\n              <#assign need_multi = true>\n            </#if>\n            <#if po.classType=='popup'>\n              <#assign need_popup = true>\n            </#if>\n            <#if po.classType=='popup_dict'>\n              <#assign need_popup_dict = true>\n            </#if>\n            <#if po.classType=='sel_tree'>\n              <#assign need_select_tree = true>\n            </#if>\n            <#if po.classType=='time'>\n              <#assign need_time = true>\n            </#if>\n            <#if po.queryMode='group' && (po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal')>\n              <#assign need_range_number = true>\n            </#if>\n            <#if po.queryMode='group'>\n              <#assign is_range = true>\n            </#if>\n            <#if po.queryMode='like'>\n              <#assign is_like = true>\n            </#if>\n            <#include \"/common/form/native/vue3NativeSearch.ftl\">\n          </#list>\n          <#if query_field_no gt 2>\n          </template>\n</#if>\n<#if query_flag>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left; overflow: hidden\" class=\"table-page-search-submitButtons\">\n              <a-col :lg=\"6\">\n                <a-button type=\"primary\" preIcon=\"ant-design:search-outlined\" @click=\"reload\">查询</a-button>\n                <a-button preIcon=\"ant-design:reload-outlined\" @click=\"searchReset\" style=\"margin-left: 8px\">重置</a-button>\n                <a @click=\"toggleSearchStatus = !toggleSearchStatus\" style=\"margin-left: 8px\">\n                  {{ toggleSearchStatus ? '收起' : '展开' }}\n                  <Icon :icon=\"toggleSearchStatus ? 'ant-design:up-outlined' : 'ant-design:down-outlined'\" />\n                </a>\n              </a-col>\n            </span>\n          </a-col>\n</#if>\n        </a-row>\n      </a-form>\n    </div>\n<#-- 结束循环 -->\n  <div class=\"content\">\n    <!--引用表格-->\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-button type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:add'\"  @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\"> 新增</a-button>\n        <a-button type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:exportXls'\"  preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n        <j-upload-button type=\"primary\"  v-auth=\"'${entityPackage}:${tableName}:importExcel'\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n  <#if buttonList?size gt 0>\n   <#list buttonList as btn>\n      <#if btn.buttonStyle == 'button'>\n        <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"ant-design:${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n      </#if>\n    </#list>\n  </#if>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button  v-auth=\"'${entityPackage}:${tableName}:deleteBatch'\"\n            >批量操作\n            <Icon icon=\"mdi:chevron-down\"></Icon>\n          </a-button>\n        </a-dropdown>\n        <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n        <!-- 高级查询 -->\n        <super-query :config=\"superQueryConfig\" @search=\"handleSuperQuery\" />\n        <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\" />\n      </template>\n      <!--字段回显插槽-->\n      <template v-slot:bodyCell=\"{ column, record, index, text }\">\n       <#list columns as po>\n        <#if po.classType=='umeditor' || po.classType=='pca' || po.classType=='file'>\n        <template v-if=\"column.dataIndex==='${po.fieldName}'\">\n         <#if po.classType=='umeditor'>\n          <!--富文本件字段回显插槽-->\n          <div v-html=\"text\"></div>\n         </#if>\n         <#if po.classType=='file'>\n          <!--文件字段回显插槽-->\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n          <a-button v-else :ghost=\"true\" type=\"primary\" preIcon=\"ant-design:download-outlined\" size=\"small\" @click=\"downloadFile(text)\">下载</a-button>\n         </#if>\n         <#if po.classType=='pca'>\n           <!--省市区字段回显插槽-->\n           {{ getAreaTextByCode(text) }}\n         </#if>\n        </template>\n        </#if>\n       </#list>\n      </template>\n    </BasicTable>\n    <!--子表表格tab-->\n    <a-tabs defaultActiveKey=\"1\" style=\"margin: 10px\">\n      <#assign sub_seq=1>\n      <#list subTables as sub>\n      <a-tab-pane tab=\"${sub.ftlDescription}\" key=\"${sub_seq}\" <#if sub_seq gt 1>forceRender</#if>>\n        <${sub.entityName}List />\n      </a-tab-pane>\n      <#assign sub_seq=sub_seq+1>\n      </#list>\n     </a-tabs>\n  </div>\n    <!-- 表单区域 -->\n    <${entityName}Modal ref=\"registerModal\" @success=\"handleSuccess\" />\n    <#if bpm_flag==true>\n      <!-- 审批记录 -->\n      <BpmPictureModal @register=\"registerBpmModal\" />\n    </#if>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"${entityPackage}-${entityName?uncap_first}\" setup>\n  import { ref, reactive, computed, unref, provide } from 'vue';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage'\n  import {useModal} from '/@/components/Modal';\n  import ${entityName}Modal from './components/${entityName}Modal.vue'\n  import { columns, superQuerySchema } from './${entityName}.data';\n  import { list, deleteOne, batchDelete, getImportUrl,getExportUrl } from './${entityName}.api';\n  import { downloadFile } from '/@/utils/common/renderUtils';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  <#include \"/common/form/native/vue3NativeImport.ftl\">\n<#if need_pca>\n  import { getAreaTextByCode } from '/@/components/Form/src/utils/Area';\n</#if>\n  <#if need_category>\n  import { loadCategoryData } from '/@/api/common/api'\n  import { getAuthCache, setAuthCache } from '/@/utils/auth';\n  import { DB_DICT_DATA_KEY } from '/@/enums/cacheEnum';\n  </#if>\n  import { getDateByPicker } from '/@/utils';\n  <#if bpm_flag==true>\n  import { startProcess } from '/@/api/common/api';\n\n  const [registerBpmModal, { openModal: bpmPicModal }] = useModal();\n  </#if>\n  <#list subTables as sub>\n  import ${sub.entityName}List from './${sub.entityName}List.vue'\n  </#list>\n  import { useUserStore } from '/@/store/modules/user';\n  <#if is_range>\n  import { cloneDeep } from \"lodash-es\";\n  </#if>\n<#if need_popup_dict>\n  import {getPopDictByCode} from \"@/utils/dict\";\n  import {filterMultiDictText} from \"@/utils/dict/JDictSelectUtil\";\n</#if>\n\n  const fieldPickers = reactive({\n  <#list columns as po>\n    <#if po.extendParams?exists && po.extendParams.picker?exists>\n    ${po.fieldName}: '${po.extendParams.picker}',\n    </#if>\n  </#list>\n  });\n  const formRef = ref();\n  const queryParam = reactive<any>({});\n  const checkedKeys = ref<Array<string | number>>([]);\n  const registerModal = ref();\n  const userStore = useUserStore();\n  const { createMessage } = useMessage();\n   //注册table数据\n  const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({\n    tableProps:{\n      title: '${tableVo.ftlDescription}',\n      api: list,\n      columns,\n      canResize:true,\n      maxHeight: 300,\n      useSearchForm: false,\n      clickToRowSelect: true,\n      rowSelection: {type: 'radio'},\n      actionColumn: {\n        width: 120,\n        fixed:'right'\n      },\n      beforeFetch: async (params) => {\n       <#if is_range>\n        let rangerQuery = await setRangeQuery();\n        return Object.assign(params, rangerQuery);\n       <#else>\n        for (let key in fieldPickers) {\n          if (queryParam[key] && fieldPickers[key]) {\n            queryParam[key] = getDateByPicker(queryParam[key], fieldPickers[key]);\n          }\n        }\n        return Object.assign(params, queryParam);\n       </#if>\n      },\n      <#if need_popup_dict>\n      afterFetch: afterFetch,\n      </#if>\n      pagination: {\n        current: 1,\n        pageSize: 5,\n        pageSizeOptions: ['5', '10', '20'],\n      },\n    },\n    exportConfig: {\n      name:\"${tableVo.ftlDescription}\",\n      url: getExportUrl,\n      <#if is_range>\n      params: setRangeQuery,\n      <#else>\n      params: queryParam,\n      </#if>\n    },\n    importConfig: {\n      url: getImportUrl,\n      success: handleSuccess,\n    },\n  })\n\n  const [registerTable, { reload },{ rowSelection, selectedRowKeys }] = tableContext\n  const mainId = computed(() => (unref(selectedRowKeys).length > 0 ? unref(selectedRowKeys)[0] : ''));\n  //下发 mainId,子组件接收\n  provide('mainId', mainId);\n\n<#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n  // 高级查询配置\n  const superQueryConfig = reactive(superQuerySchema);\n\n  /**\n   * 高级查询事件\n   */\n  function handleSuperQuery(params) {\n    Object.keys(params).map((k) => {\n      queryParam[k] = params[k];\n    });\n    reload();\n  }\n<#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n\n  /**\n   * 新增事件\n   */\n  function handleAdd() {\n    registerModal.value.disableSubmit = false;\n    registerModal.value.add();\n  }\n  \n  /**\n   * 编辑事件\n   */\n  function handleEdit(record: Recordable) {\n     registerModal.value.disableSubmit = false;\n     registerModal.value.edit(record);\n  }\n  \n  /**\n   * 详情事件\n   */\n  function handleDetail(record: Recordable) {\n    registerModal.value.disableSubmit = true;\n    registerModal.value.edit(record);\n  }\n  \n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteOne({id: record.id}, handleSuccess);\n  }\n  \n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDelete({ids: selectedRowKeys.value},handleSuccess);\n  }\n  \n  /**\n   * 成功回调\n   */\n  function handleSuccess() {\n    (selectedRowKeys.value = []) && reload();\n  }\n  \n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n        auth: '${entityPackage}:${tableName}:edit'\n      },\n    ];\n  }\n  \n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record){\n    <#if bpm_flag==true>\n    let dropDownAction = [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      }, {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft'\n        },\n        auth: '${entityPackage}:${tableName}:delete'\n      },\n    {\n      label: '审批进度',\n      onClick: handlePreviewPic.bind(null, record),\n      ifShow: !!record.bpmStatus && record.bpmStatus !== '1',\n    },\n<#if buttonList?size gt 0>\n <#list buttonList as btn>\n    <#if btn.buttonStyle == 'link'>\n    ,{\n       label: '${btn.buttonName}',\n       onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n     }\n    </#if>\n  </#list>\n</#if>\n    ];\n    if(record.bpmStatus == '1' || !record.bpmStatus){\n      dropDownAction.push({\n        label: '发起流程',\n         popConfirm: {\n           title: '确认提交流程吗？',\n           confirm: handleProcess.bind(null, record),\n           placement: 'topLeft',\n         }\n      })\n    }\n    return dropDownAction;\n    <#else>\n    return [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft'\n        },\n        auth: '${entityPackage}:${tableName}:delete'\n      }\n <#if buttonList?size gt 0>\n       <#list buttonList as btn>\n        <#if btn.buttonStyle == 'link'>\n        ,{\n           label: '${btn.buttonName}',\n           onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n        }\n        </#if>\n       </#list>\n</#if>\n    ];\n   </#if>\n  }\n\n  <#if bpm_flag==true>\n  /**\n   * 提交流程\n   */\n  async function handleProcess(record) {\n    let params = {\n      flowCode: 'dev_${tableName}_001',\n      id: record.id,\n      formUrl: '${entityPackagePath}/components/${entityName}Form',\n      formUrlMobile: ''\n    }\n    await startProcess(params);\n    handleSuccess();\n  }\n   /**\n       * 审批进度\n       */\n      async function handlePreviewPic(record) {\n        bpmPicModal(true, {\n          flowCode: 'dev_${tableName}_001',\n          dataId: record.id,\n        });\n      }\n  </#if>\n  <#if buttonList?size gt 0>\n    <#list buttonList as btn>\n    <#if btn.buttonStyle=='button'>\n       function handle${btn.buttonCode?cap_first}(){\n          createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n       }\n    </#if>\n     <#if btn.buttonStyle=='link'>\n      function handle${btn.buttonCode?cap_first}(record){\n        createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n      }\n     </#if>\n    </#list>\n  </#if>\n  <#if need_category>\n  /**\n   * form点击事件\n   * @param value\n   */\n  function handleFormChange(key, value) {\n    queryParam[key] = value;\n  }\n  \n  /**\n   * 初始化字典配置\n   */\n  function initDictConfig(){\n  <#list columns as po>\n   <#if (po.isQuery=='Y' || po.isShowList=='Y') && po.classType!='popup'>\n    <#if po.classType=='cat_tree' && need_category==true>\n    loadCategoryData({code:'${po.dictField?default(\"\")}'}).then((res) => {\n      if (res) {\n        const allDictDate = userStore.getAllDictItems;\n        if(!allDictDate['${po.dictField?default(\"\")}']){\n          userStore.setAllDictItems({...allDictDate,'${po.dictField?default(\"\")}':res});\n        }\n      }\n    })\n    </#if>\n   </#if>\n  </#list>\n  }\n  initDictConfig();\n </#if>\n<#if need_popup_dict>\n    /**\n    * 翻译Popup字典配置\n    */\n    async function afterFetch(records){\n    <#list columns as po>\n    <#if po.isQuery=='Y' || po.isShowList=='Y'>\n      <#if po.classType=='popup_dict' && need_popup_dict==true>\n      const ${po.fieldName}Keys = [...new Set(records.map((item) => item['${po.fieldName}']).flatMap((item) => item && item.split(',')))];\n      if(${po.fieldName}Keys && ${po.fieldName}Keys.length){\n       const dictOptions = await getPopDictByCode(${po.fieldName}Keys.join(','), '${po.dictTable},${po.dictField},${po.dictText}');\n       records.forEach((item) => {\n         item['${po.fieldName}_dictText'] = filterMultiDictText(dictOptions, item['${po.fieldName}']);\n       });\n      }\n      </#if>\n    </#if>\n    </#list>\n     return records;\n}\n</#if>\n  /* ----------------------以下为原生查询需要添加的-------------------------- */\n  const toggleSearchStatus = ref<boolean>(false);\n  const labelCol = reactive({\n    xs:24,\n    sm:4,\n    xl:6,\n    xxl:4\n  });\n  const wrapperCol = reactive({\n    xs: 24,\n    sm: 20,\n  });\n  \n  /**\n   * 重置\n   */\n  function searchReset() {\n    formRef.value.resetFields();\n    selectedRowKeys.value = [];\n    //刷新数据\n    reload();\n  }\n  \n  <#if need_popup>\n  /**\n   *  popup组件值改变事件\n   */\n  function setFieldsValue(map) {\n    Object.keys(map).map((key) => {\n      queryParam[key] = map[key];\n    });\n  }\n  </#if>\n\n  <#if need_pca || need_dept_user>\n  /**\n   * form点击事件(以逗号分割)\n   * @param key\n   * @param value\n   */\n  function handleFormJoinChange(key, value) {\n    if (typeof value != 'string') {\n      queryParam[key] = value.join(',');\n    }\n  }\n  </#if>\n  <#if is_range>\n  \n  let rangeField = '${getRangeField(columns)}'\n  \n  /**\n   * 设置范围查询条件\n   */\n  async function setRangeQuery(){\n    let queryParamClone = cloneDeep(queryParam);\n    if (rangeField) {\n      let fieldsValue = rangeField.split(',');\n      fieldsValue.forEach(item => {\n        if (queryParamClone[item]) {\n          let range = queryParamClone[item];\n          queryParamClone[item+'_begin'] = range[0];\n          queryParamClone[item+'_end'] = range[1];\n          delete queryParamClone[item];\n        } else {\n          queryParamClone[item+'_begin'] = '';\n          queryParamClone[item+'_end'] = '';\n        }\n      })\n    }\n    return queryParamClone;\n  }\n  </#if>\n</script>\n<style lang=\"less\" scoped>\n<#include \"/common/form/native/vueNativeSearchStyle.ftl\">\n  .erpNativeList {\n      height: 100%;\n      .content {\n        background-color: #fff;\n      }\n  }\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi",
    "content": "import {defHttp} from '/@/utils/http/axios';\nimport { useMessage } from \"/@/hooks/web/useMessage\";\n\nconst { createConfirm } = useMessage();\n\nenum Api {\n  list = '/${entityPackagePath}/${entityName?uncap_first}/list',\n  save= '/${entityPackagePath}/${entityName?uncap_first}/add',\n  edit= '/${entityPackagePath}/${entityName?uncap_first}/edit',\n  deleteOne = '/${entityPackagePath}/${entityName?uncap_first}/delete',\n  deleteBatch = '/${entityPackagePath}/${entityName?uncap_first}/deleteBatch',\n  importExcel = '/${entityPackagePath}/${entityName?uncap_first}/importExcel',\n  exportXls = '/${entityPackagePath}/${entityName?uncap_first}/exportXls',\n<#list subTables as sub><#rt/>\n  ${sub.entityName?uncap_first}List = '/${entityPackagePath}/${entityName?uncap_first}/list${sub.entityName}ByMainId',\n  ${sub.entityName?uncap_first}Save= '/${entityPackagePath}/${entityName?uncap_first}/add${sub.entityName}',\n  ${sub.entityName?uncap_first}Edit= '/${entityPackagePath}/${entityName?uncap_first}/edit${sub.entityName}',\n  ${sub.entityName?uncap_first}Delete = '/${entityPackagePath}/${entityName?uncap_first}/delete${sub.entityName}',\n  ${sub.entityName?uncap_first}DeleteBatch = '/${entityPackagePath}/${entityName?uncap_first}/deleteBatch${sub.entityName}',\n</#list>\n}\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) =>\n  defHttp.get({ url: Api.list, params });\n\n/**\n * 删除单个\n */\nexport const deleteOne = (params,handleSuccess) => {\n  return defHttp.delete({ url: Api.deleteOne, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n}\n\n/**\n * 批量删除\n * @param params\n */\nexport const batchDelete = (params, handleSuccess) => {\n  createConfirm({\n    iconType: 'warning',\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n\n/**\n * 保存或者更新\n * @param params\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({ url: url, params },{ isTransformResponse: false });\n}\n<#list subTables as sub><#rt/>\n  <#assign myForeignKeys=''>\n  <#list sub.foreignKeys as key>\n    <#assign myForeignKeys='${key?uncap_first}'>\n  </#list>\n  \n/**\n * 列表接口\n * @param params\n */\nexport const ${sub.entityName?uncap_first}List = (params) => {\n  if(params['${myForeignKeys}']){\n    return defHttp.get({ url: Api.${sub.entityName?uncap_first}List, params });\n  }\n  return Promise.resolve({});\n}\n\n/**\n * 删除单个\n */\nexport const ${sub.entityName?uncap_first}Delete = (params,handleSuccess) => {\n  return defHttp.delete({ url: Api.${sub.entityName?uncap_first}Delete, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n}\n\n/**\n * 批量删除\n * @param params\n */\nexport const ${sub.entityName?uncap_first}DeleteBatch = (params, handleSuccess) => {\n  createConfirm({\n    iconType: 'warning',\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.${sub.entityName?uncap_first}DeleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n\n/**\n * 保存或者更新\n * @param params\n */\nexport const  ${sub.entityName?uncap_first}SaveOrUpdate = (params, isUpdate) => {\n  let url = isUpdate ? Api.${sub.entityName?uncap_first}Edit : Api.${sub.entityName?uncap_first}Save;\n  return defHttp.post({ url: url, params },{ isTransformResponse: false });\n}\n\n/**\n * 导入\n */\nexport const ${sub.entityName?uncap_first}ImportUrl = '/${entityPackagePath}/${entityName?uncap_first}/import${sub.entityName}'\n\n/**\n * 导出\n */\nexport const ${sub.entityName?uncap_first}ExportXlsUrl = '/${entityPackagePath}/${entityName?uncap_first}/export${sub.entityName}'\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi",
    "content": "<#include \"/common/utils.ftl\">\nimport {BasicColumn} from '/@/components/Table';\nimport {FormSchema} from '/@/components/Table';\nimport { rules} from '/@/utils/helper/validator';\nimport { render } from '/@/utils/common/renderUtils';\nimport { getWeekMonthQuarterYear } from '/@/utils';\n//列表数据\nexport const columns: BasicColumn[] = [\n <#list columns as po>\n  <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n  <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  {\n    title: '${po.filedComment}',\n    align:\"center\",\n    <#if po.sort=='Y'>\n    sorter: true,\n   </#if>\n    <#if po.classType=='date'>\n    dataIndex: '${po.fieldName}',\n    customRender:({text}) =>{\n      text = !text ? \"\" : (text.length > 10 ? text.substr(0,10) : text);\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      if(text) {\n        return getWeekMonthQuarterYear(text)['${po.extendParams.picker}'];\n      } else {\n        return text;\n      }\n      <#else>\n      return text;\n      </#if>\n    },\n    <#elseif po.fieldDbType=='Blob'>\n    dataIndex: '${po.fieldName}String'\n    <#elseif po.classType=='umeditor'>\n    dataIndex: '${po.fieldName}',\n    <#elseif po.classType=='pca'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='file'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='image'>\n    dataIndex: '${po.fieldName}',\n    customRender:render.renderImage,\n   <#elseif po.classType=='switch'>\n    dataIndex: '${po.fieldName}',\n<#assign switch_extend_arr=['Y','N']>\n<#if po.dictField?default(\"\")?contains(\"[\")>\n<#assign switch_extend_arr=po.dictField?eval>\n</#if>\n<#list switch_extend_arr as a>\n<#if a_index == 0>\n<#assign switch_extend_arr1=a>\n<#else>\n<#assign switch_extend_arr2=a>\n</#if>\n</#list>\n    customRender:({text}) => {\n      return render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}])\n    },\n   <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict'>\n    dataIndex: '${po.fieldName}_dictText'\n   <#elseif po.classType=='cat_tree'>\n    dataIndex: '${po.fieldName}',\n    <#if po.dictText?default(\"\")?trim?length == 0>\n    customRender:({text}) => {\n      return render.renderCategoryTree(text,'${po.dictField?default(\"\")}')\n   },\n   <#else>\n    customRender: (text, record) => (text ? record['${po.dictText}'] : '')\n   </#if>\n   <#else>\n    dataIndex: '${po.fieldName}'\n   </#if>\n  },\n   </#if>\n </#list>\n];\n\n<#list subTables as sub>\n//子表列表数据\nexport const ${sub.entityName?uncap_first}Columns: BasicColumn[] = [\n <#list sub.originalColumns as po>\n   <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n   <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  {\n    title: '${po.filedComment}',\n    align:\"center\",\n    <#if po.sort=='Y'>\n    sorter: true,\n   </#if>\n    <#if po.classType=='date'>\n    dataIndex: '${po.fieldName}',\n    customRender:({text}) =>{\n      return !text?\"\":(text.length>10?text.substr(0,10):text)\n    },\n    <#elseif po.fieldDbType=='Blob'>\n    dataIndex: '${po.fieldName}String'\n    <#elseif po.classType=='umeditor'>\n    dataIndex: '${po.fieldName}',\n    <#elseif po.classType=='pca'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='file'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='image'>\n    dataIndex: '${po.fieldName}',\n    customRender:render.renderImage,\n   <#elseif po.classType=='switch'>\n    dataIndex: '${po.fieldName}',\n<#assign switch_extend_arr=['Y','N']>\n<#if po.dictField?default(\"\")?contains(\"[\")>\n<#assign switch_extend_arr=po.dictField?eval>\n</#if>\n<#list switch_extend_arr as a>\n<#if a_index == 0>\n<#assign switch_extend_arr1=a>\n<#else>\n<#assign switch_extend_arr2=a>\n</#if>\n</#list>\n    customRender:({text}) => {\n      return  render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}])\n    },\n   <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict'>\n    dataIndex: '${po.fieldName}_dictText'\n   <#elseif po.classType=='cat_tree'>\n    dataIndex: '${po.fieldName}',\n    <#if po.dictText?default(\"\")?trim?length == 0>\n    customRender:({text}) => {\n      return  render.renderCategoryTree(text,'${po.dictField?default(\"\")}')\n    },\n   <#else>\n    customRender: ({text, record}) => (text ? record['${po.dictText}'] : '')\n   </#if>\n   <#else>\n    dataIndex: '${po.fieldName}'\n   </#if>\n  },\n   </#if>\n </#list>\n];\n</#list>\n\n<#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n// 高级查询数据\nexport const superQuerySchema = {\n  <#list columns as po>\n  <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n  <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  ${superQueryFieldListForVue3(po,po_index)},\n  </#if>\n  </#list>\n};\n<#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql",
    "content": "<#include \"/common/sql/menu_insert.ftl\">"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/[1-n]List.vuei",
    "content": "<#list subTables as sub>\n#segment#${sub.entityName}List.vue\n<#assign need_pca = false>\n<#assign is_like = false>\n<template>\n <div class=\"p-2\">\n   <#-- 结束循环 -->\n    <!--引用表格-->\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-button type=\"primary\" @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\" v-if=\"mainId!=''\"> 新增</a-button>\n        <a-button  type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\" v-if=\"mainId!=''\"> 导出</a-button>\n        <j-upload-button  type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\" v-if=\"mainId!=''\">导入</j-upload-button>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button>批量操作\n            <Icon icon=\"mdi:chevron-down\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\"/>\n      </template>\n      <!--字段回显插槽-->\n      <template v-slot:bodyCell=\"{ column, record, index, text }\">\n       <#list sub.originalColumns as po>\n        <#if po.classType=='umeditor' || po.classType=='pca' || po.classType=='file'>\n        <template v-if=\"column.dataIndex==='${po.fieldName}'\">\n         <#if po.classType=='umeditor'>\n          <!--富文本件字段回显插槽-->\n          <div v-html=\"text\"></div>\n         </#if>\n         <#if po.classType=='file'>\n          <!--文件字段回显插槽-->\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n          <a-button v-else :ghost=\"true\" type=\"primary\" preIcon=\"ant-design:download-outlined\" size=\"small\" @click=\"downloadFile(text)\">下载</a-button>\n         </#if>\n         <#if po.classType=='pca'>\n           <#assign need_pca = true>\n           <!--省市区字段回显插槽-->\n           {{ getAreaTextByCode(text) }}\n         </#if>\n        </template>\n        </#if>\n       </#list>\n      </template>\n    </BasicTable>\n\n    <${sub.entityName}Modal ref=\"registerModal\" @success=\"handleSuccess\"/>\n   </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, reactive, unref, inject, watch } from 'vue';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage'\n  import ${sub.entityName}Modal from './components/${sub.entityName}Modal.vue'\n  import { ${sub.entityName?uncap_first}Columns } from './${entityName}.data';\n  import { ${sub.entityName?uncap_first}List, ${sub.entityName?uncap_first}Delete, ${sub.entityName?uncap_first}DeleteBatch, ${sub.entityName?uncap_first}ExportXlsUrl, ${sub.entityName?uncap_first}ImportUrl } from './${entityName}.api';\n  import { isEmpty } from \"/@/utils/is\";\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { downloadFile } from '/@/utils/common/renderUtils';\n<#if need_pca>\n  import { getAreaTextByCode } from '/@/components/Form/src/utils/Area';\n</#if>\n  \n  const toggleSearchStatus = ref<boolean>(false);\n  //接收主表id\n  const mainId = inject('mainId') || '';\n  //提示弹窗\n  const $message = useMessage()\n  const queryParam = {};\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext, onImportXls, onExportXls } = useListPage({\n    tableProps: {\n      api: ${sub.entityName?uncap_first}List,\n      columns: ${sub.entityName?uncap_first}Columns,\n      canResize: true,\n      useSearchForm: false,\n      actionColumn: {\n        width: 180,\n        fixed:'right'\n      },\n      beforeFetch: (params) => {\n        return Object.assign(params, queryParam);\n      },\n    },\n    exportConfig: {\n      name: '${sub.ftlDescription}',\n      url: ${sub.entityName?uncap_first}ExportXlsUrl,\n      params: {\n        <#list sub.foreignKeys as key>\n        '${key?uncap_first}': mainId\n         </#list>\n      }\n    },\n    importConfig: {\n      url: ()=>{\n        return ${sub.entityName?uncap_first}ImportUrl + '/' + unref(mainId)\n      }\n    }\n  });\n\n  //注册table数据\n  const [registerTable, { reload<#if sub.foreignRelationType =='1'>,getDataSource</#if>}, { rowSelection, selectedRowKeys }] = tableContext;\n  const registerModal = ref();\n  const formRef = ref();\n  const labelCol = reactive({\n    xs:24,\n    sm:4,\n    xl:6,\n    xxl:4\n  });\n  const wrapperCol = reactive({\n    xs: 24,\n    sm: 20,\n  });\n  \n  /**\n   * 新增事件\n   */\n  function handleAdd() {\n    if (isEmpty(unref(mainId))) {\n        $message.createMessage.warning('请选择一个主表信息')\n        return;\n    }\n    <#if sub.foreignRelationType =='1'>\n    let dataSource = getDataSource();\n    if(dataSource.length >= 1){\n      $message.createMessage.warning('一对一子表只能添加一条数据')\n      return;\n    }\n    </#if>\n    registerModal.value.disableSubmit = false;\n    registerModal.value.add();\n  }\n\n  /**\n   * 编辑事件\n   */\n  async function handleEdit(record: Recordable) {\n    registerModal.value.disableSubmit = false;\n    registerModal.value.edit(record);\n  }\n\n  /**\n   * 详情事件\n   */\n  function handleDetail(record: Recordable) {\n    registerModal.value.disableSubmit = true;\n    registerModal.value.edit(record);\n  }\n  \n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await ${sub.entityName?uncap_first}Delete({id: record.id}, handleSuccess);\n  }\n\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await ${sub.entityName?uncap_first}DeleteBatch({ids: selectedRowKeys.value}, handleSuccess);\n  }\n\n  /**\n   * 成功回调\n   */\n  function handleSuccess() {\n    (selectedRowKeys.value = []) && reload();\n  }\n\n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n    ]\n  }\n  \n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record){\n    return [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n  \n  /**\n   * 重置\n   */\n  function searchReset() {\n    formRef.value.resetFields();\n    selectedRowKeys.value = [];\n    //刷新数据\n    reload();\n  }\n  \n  watch(mainId, () => {\n    <#list sub.foreignKeys as key>\n    queryParam['${key?uncap_first}'] = unref(mainId);\n    </#list>\n    reload();\n  });\n</script>\n<style lang=\"less\" scoped>\n  .jeecg-basic-table-form-container {\n    padding: 0;\n    .table-page-search-submitButtons {\n      display: block;\n      margin-bottom: 24px;\n      white-space: nowrap;\n    }\n    .query-group-cust{\n      min-width: 100px !important;\n    }\n    .query-group-split-cust{\n      width: 30px;\n      display: inline-block;\n      text-align: center\n    }\n  }\n</style>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n  <a-spin :spinning=\"confirmLoading\">\n    <JFormContainer :disabled=\"disabled\">\n      <template #detail>\n        <a-form ref=\"formRef\" class=\"antd-modal-form\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" name=\"${entityName}Form\">\n          <a-row>\n<#assign need_category = false>\n<#assign bpm_flag=false>\n<#assign need_pca = false>\n<#assign need_search = false>\n<#assign need_dept_user = false>\n<#assign need_switch = false>\n<#assign need_dept = false>\n<#assign need_multi = false>\n<#assign need_popup = false>\n<#assign need_popup_dict = false>\n<#assign need_select_tag = false>\n<#assign need_select_tree = false>\n<#assign need_time = false>\n<#assign need_markdown = false>\n<#assign need_upload = false>\n<#assign need_image_upload = false>\n<#assign need_editor = false>\n<#assign need_checkbox = false>\n<#assign hasOnlyValidate = false> \n<#assign need_range_number = false>\n<#assign is_like = false>\n<#assign form_span = 24>\n<#if tableVo.fieldRowNum==2>\n<#assign form_span = 12>\n<#elseif tableVo.fieldRowNum==3>\n<#assign form_span = 8>\n<#elseif tableVo.fieldRowNum==4>\n<#assign form_span = 6>\n</#if>\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>        \n<#if po.isShow == 'Y' && po.fieldValidType?default(\"\") == 'only'>\n      <#assign hasOnlyValidate = true>\n</#if>\n  <#assign formEntityName>${entityName}Form</#assign>\n  <#include \"/common/form/native/vue3NativeForm.ftl\">\n</#list>\n            <#if bpm_flag>\n            <a-col v-if=\"showFlowSubmitButton\" :span=\"24\" style=\"width: 100%;text-align: center;\">\n              <a-button preIcon=\"ant-design:check-outlined\" style=\"width: 126px\" type=\"primary\" @click=\"submitForm\">提 交</a-button>\n            </a-col>\n            </#if>\n          </a-row>\n        </a-form>\n      </template>\n    </JFormContainer>\n  </a-spin>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  <#include \"/common/form/native/vue3NativeImport.ftl\">\n  import { getDateByPicker, getValueType } from '/@/utils';\n  import { saveOrUpdate } from '../${entityName}.api';\n  import { Form } from 'ant-design-vue';\n  import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';\n  <#if hasOnlyValidate == true>\n  import { duplicateValidate } from '/@/utils/helper/validator'\n  </#if>\n  \n  const props = defineProps({\n    formDisabled: { type: Boolean, default: false },\n    formData: { type: Object, default: () => ({}) },\n    formBpm: { type: Boolean, default: true }\n  });\n  const useForm = Form.useForm;\n  const emit = defineEmits(['register', 'ok']);\n  const formData = reactive<Record<string, any>>({\n    id: '',\n    <#include \"/common/init/native/vue3NativeMainInitValue.ftl\">\n  });\n  const { createMessage } = useMessage();\n  const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });\n  const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });\n  const confirmLoading = ref<boolean>(false);\n  //表单验证\n  const validatorRules = reactive({\n  <#include \"/common/validatorRulesTemplate/native/vue3MainNative.ftl\">\n  });\n  const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });\n  //日期个性化选择\n  const fieldPickers = reactive({\n  <#list columns as po>\n    <#if po.extendParams?exists && po.extendParams.picker?exists>\n    ${po.fieldName}: '${po.extendParams.picker}',\n    </#if>\n  </#list>\n  });\n  const formRef = ref();\n  // 表单禁用\n  const disabled = computed(()=>{\n    if(props.formBpm === true){\n      if(props.formData.disabled === false){\n        return false;\n      }else{\n        return true;\n      }\n    }\n    return props.formDisabled;\n  });\n\n  <#if bpm_flag>\n  onMounted(()=>{\n    initFormData();\n  });\n  //渲染流程表单数据\n  const queryByIdUrl = '/${entityPackagePath}/${entityName?uncap_first}/queryById';\n  async function initFormData(){\n    if(props.formBpm === true){\n      let params = {id: props.formData.dataId};\n      const data = await defHttp.get({url: queryByIdUrl, params});\n      //设置表单的值\n      edit({...data});\n    }\n  }\n  // 是否显示提交按钮\n  const showFlowSubmitButton = computed(()=>{\n    if(props.formBpm === true){\n      if(props.formData.disabled === false){\n        return true\n      }\n    }\n    return false\n  });\n  </#if>\n  \n  /**\n   * 新增\n   */\n  function add() {\n    edit({});\n  }\n\n  /**\n   * 编辑\n   */\n  function edit(record) {\n    nextTick(() => {\n      resetFields();\n      const tmpData = {};\n      Object.keys(formData).forEach((key) => {\n        if(record.hasOwnProperty(key)){\n          tmpData[key] = record[key]\n        }\n      })\n      //赋值\n      Object.assign(formData,tmpData);\n    });\n  }\n\n  /**\n   * 提交数据\n   */\n  async function submitForm() {\n    try {\n      // 触发表单验证\n      await validate();\n    } catch ({ errorFields }) {\n      if (errorFields) {\n        const firstField = errorFields[0];\n        if (firstField) {\n          formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });\n        }\n      }\n      return Promise.reject(errorFields);\n    }\n    confirmLoading.value = true;\n    const isUpdate = ref<boolean>(false);\n    //时间格式化\n    let model = formData;\n    if (model.id) {\n      isUpdate.value = true;\n    }\n    //循环数据\n    for (let data in model) {\n      // 更新个性化日期选择器的值\n      model[data] = getDateByPicker(model[data], fieldPickers[data]);\n      //如果该数据是数组并且是字符串类型\n      if (model[data] instanceof Array) {\n        let valueType = getValueType(formRef.value.getProps, data);\n        //如果是字符串类型的需要变成以逗号分割的字符串\n        if (valueType === 'string') {\n          model[data] = model[data].join(',');\n        }\n      }\n    }\n    await saveOrUpdate(model, isUpdate.value)\n      .then((res) => {\n        if (res.success) {\n          createMessage.success(res.message);\n          emit('ok');\n        } else {\n          createMessage.warning(res.message);\n        }\n      })\n      .finally(() => {\n        confirmLoading.value = false;\n      });\n  }\n\n\t<#if need_popup>\n  /**\n   *  popup组件值改变事件\n   */\n  function setFieldsValue(map) {\n    Object.keys(map).map((key) => {\n      formData[key] = map[key];\n    });\n  }\n\t</#if>\n\n\t<#if need_category || need_select_tree>\n  /**\n   * 值改变事件触发\n   * @param key\n   * @param value\n   */\n  function handleFormChange(key, value) {\n    formData[key] = value;\n  }\n  </#if>\n <#list columns as po>\n  <#if po.isShow == 'Y' && po.fieldValidType?default(\"\") == 'only'>\n  async function ${po.fieldName}Duplicatevalidate(_r, value) {\n    return duplicateValidate('${tableName}', '${po.fieldDbName}', value, formData.id || '')\n  }\n  </#if>\n  </#list>\n  defineExpose({\n    add,\n    edit,\n    submitForm,\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .antd-modal-form {\n    padding: 14px 20px;\n  }\n</style>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n<#assign buttonList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n  <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n</#if>\n  <j-modal :title=\"title\" maxHeight=\"500px\" :width=\"${getModalWidth(tableVo.fieldRowNum?default(1))}\" :visible=\"visible\" @ok=\"handleOk\" :okButtonProps=\"{ class: { 'jee-hidden': disableSubmit } }\" @cancel=\"handleCancel\" cancelText=\"关闭\">\n    <${entityName}Form ref=\"registerForm\" @ok=\"submitCallback\" :formDisabled=\"disableSubmit\" :formBpm=\"false\"></${entityName}Form>\n  <template #footer>\n    <#if buttonList?? && buttonList?size gt 0>\n    <#list buttonList as btn>\n     <#if btn.buttonStyle=='form'>\n       <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"ant-design:${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n     </#if>\n    </#list>\n    </#if>\n   <a-button @click=\"handleCancel\">取消</a-button>\n   <a-button :class=\"{ 'jee-hidden': disableSubmit }\" type=\"primary\" @click=\"handleOk\">确认</a-button>\n </template>\n    </j-modal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, nextTick, defineExpose } from 'vue';\n  import ${entityName}Form from './${entityName}Form.vue'\n  import JModal from '/@/components/Modal/src/JModal/JModal.vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  const { createMessage } = useMessage();\n\n  const title = ref<string>('');\n  const width = ref<number>(800);\n  const visible = ref<boolean>(false);\n  const disableSubmit = ref<boolean>(false);\n  const registerForm = ref();\n  const emit = defineEmits(['register', 'success']);\n\n  /**\n   * 新增\n   */\n  function add() {\n    title.value = '新增';\n    visible.value = true;\n    nextTick(() => {\n      registerForm.value.add();\n    });\n  }\n  \n  /**\n   * 编辑\n   * @param record\n   */\n  function edit(record) {\n    title.value = disableSubmit.value ? '详情' : '编辑';\n    visible.value = true;\n    nextTick(() => {\n      registerForm.value.edit(record);\n    });\n  }\n  \n  /**\n   * 确定按钮点击事件\n   */\n  function handleOk() {\n    registerForm.value.submitForm();\n  }\n\n  /**\n   * form保存回调事件\n   */\n  function submitCallback() {\n    handleCancel();\n    emit('success');\n  }\n\n  /**\n   * 取消按钮回调事件\n   */\n  function handleCancel() {\n    visible.value = false;\n  }\n\n<#if buttonList?size gt 0>\n  <#list buttonList as btn>\n      <#if btn.buttonStyle=='form'>\n         function handle${btn.buttonCode?cap_first}(){\n            createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n         }\n      </#if>\n  </#list>\n</#if>\n\n  defineExpose({\n    add,\n    edit,\n    disableSubmit,\n  });\n</script>\n\n<style>\n  /**隐藏样式-modal确定按钮 */\n  .jee-hidden {\n    display: none !important;\n  }\n</style>\n<style lang=\"less\" scoped></style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/[1-n]Form.vuei",
    "content": "<#list subTables as sub>\n#segment#${sub.entityName}Form.vue\n<#include \"/common/utils.ftl\">\n<#assign need_category = false>\n<#assign bpm_flag=false>\n<#assign need_pca = false>\n<#assign need_search = false>\n<#assign need_dept_user = false>\n<#assign need_switch = false>\n<#assign need_dept = false>\n<#assign need_multi = false>\n<#assign need_popup = false>\n<#assign need_popup_dict = false>\n<#assign need_select_tag = false>\n<#assign need_select_tree = false>\n<#assign need_time = false>\n<#assign need_markdown = false>\n<#assign need_upload = false>\n<#assign need_image_upload = false>\n<#assign need_editor = false>\n<#assign need_checkbox = false>\n<#assign need_range_number = false>\n<#assign is_like = false>\n<#assign form_span = 24>\n<#if tableVo.fieldRowNum==2>\n  <#assign form_span = 12>\n<#elseif tableVo.fieldRowNum==3>\n  <#assign form_span = 8>\n<#elseif tableVo.fieldRowNum==4>\n  <#assign form_span = 6>\n</#if>\n  <#assign hasOnlyValidate = false>\n<template>\n  <a-spin :spinning=\"confirmLoading\">\n    <JFormContainer :disabled=\"disabled\">\n      <template #detail>\n        <a-form class=\"antd-modal-form\" v-bind=\"formItemLayout\" ref=\"formRef\" name=\"${sub.entityName}Form\">\n          <a-row>\n            <#list sub.colums as po>\n              <#if po.isShow == 'Y' && po.fieldValidType?default(\"\") == 'only'>\n                <#assign hasOnlyValidate = true>\n              </#if>\n              <#if po.fieldDbName=='bpm_status'>\n                <#assign bpm_flag=true>\n              </#if>\n              <#assign formEntityName>${sub.entityName}</#assign>\n              <#include \"/common/form/native/vue3NativeForm.ftl\">\n            </#list>\n          </a-row>\n        </a-form>\n      </template>\n    </JFormContainer>\n  </a-spin>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, reactive, defineExpose, nextTick, onMounted, inject, defineProps, unref } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  <#include \"/common/form/native/vue3NativeImport.ftl\">\n  import { getDateByPicker, getValueType } from '/@/utils';\n  import { ${sub.entityName?uncap_first}SaveOrUpdate } from '../${entityName}.api';\n  import { Form } from 'ant-design-vue';\n  import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';\n  <#if hasOnlyValidate == true>\n  import { duplicateValidate } from '/@/utils/helper/validator'\n  </#if>\n\n  //接收主表id\n  const mainId = inject('mainId');\n  const formRef = ref();\n  const useForm = Form.useForm;\n  const emit = defineEmits(['register', 'ok']);\n  const formData = reactive<Record<string, any>>({\n    id: '',\n    <#include \"/common/init/native/vue3NativeSubInitValue.ftl\">\n  });\n  const { createMessage } = useMessage();\n  const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });\n  const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });\n  const confirmLoading = ref<boolean>(false);\n  //表单验证\n  const validatorRules = {\n   <#list sub.colums as po>\n   <#if po.isShow == 'Y' && poHasCheck(po)>\n    ${po.fieldName}: [<#include \"/common/validatorRulesTemplate/native/vue3CoreNative.ftl\">],\n   </#if>\n   </#list>\n  };\n  const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });\n  //日期个性化选择\n  const fieldPickers = reactive({\n  <#list sub.colums as po>\n    <#if po.extendParams?exists && po.extendParams.picker?exists>\n    ${po.fieldName}: '${po.extendParams.picker}',\n    </#if>\n  </#list>\n  });\n  const props = defineProps({\n    disabled: { type: Boolean, default: false },\n  });\n  const formItemLayout = {\n    labelCol: { xs: { span: 24 }, sm: { span: 5 } },\n    wrapperCol: { xs: { span: 24 }, sm: { span: 16 } },\n  };\n  \n  /**\n   * 新增\n   */\n  function add() {\n    edit({});\n  }\n\n  /**\n   * 编辑\n   */\n  function edit(record) {\n    nextTick(() => {\n      resetFields();\n      const tmpData = {};\n      Object.keys(formData).forEach((key) => {\n        if(record.hasOwnProperty(key)){\n          tmpData[key] = record[key]\n        }\n      })\n      //赋值\n      Object.assign(formData,tmpData);\n    });\n  }\n\n  /**\n   * 提交数据\n   */\n  async function submitForm() {\n    // 触发表单验证\n    try {\n      // 触发表单验证\n      await validate();\n    } catch ({ errorFields }) {\n      if (errorFields) {\n        const firstField = errorFields[0];\n        if (firstField) {\n          formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });\n        }\n      }\n      return Promise.reject(errorFields);\n    }\n    confirmLoading.value = true;\n    const isUpdate = ref<boolean>(false);\n    //时间格式化\n    let model = formData;\n    if (model.id) {\n      isUpdate.value = true;\n    }\n   \n    //循环数据\n    for (let data in model) {\n      // 更新个性化日期选择器的值\n      model[data] = getDateByPicker(model[data], fieldPickers[data]);\n      //如果该数据是数组并且是字符串类型\n      if (model[data] instanceof Array) {\n        let valueType = getValueType(formRef.value.getProps, data);\n        //如果是字符串类型的需要变成以逗号分割的字符串\n        if (valueType === 'string') {\n          model[data] = model[data].join(',');\n        }\n      }\n    }\n    if (unref(mainId)) {\n      <#list sub.foreignKeys as key>\n      model['${key?uncap_first}'] = unref(mainId);\n      </#list>\n    }\n    await ${sub.entityName?uncap_first}SaveOrUpdate(model, isUpdate.value)\n      .then((res) => {\n        if (res.success) {\n          createMessage.success(res.message);\n          emit('ok');\n        } else {\n          createMessage.warning(res.message);\n        }\n      })\n      .finally(() => {\n        confirmLoading.value = false;\n      });\n  }\n\n  <#if need_popup>\n  /**`\n   *  popup组件值改变事件\n   */\n  function setFieldsValue(map) {\n    Object.keys(map).map((key) => {\n      formData[key] = map[key];\n    });\n  }\n  </#if>\n\n  <#if need_category || need_select_tree>\n  /**\n   * 值改变事件触发\n   * @param key\n   * @param value\n   */\n  function handleFormChange(key, value) {\n    formData[key] = value;\n  }\n  </#if>\n  <#list sub.colums as po>\n  <#if po.isShow == 'Y' && po.fieldValidType?default(\"\") == 'only'>\n    async function ${po.fieldName}Duplicatevalidate(_r, value) {\n      return duplicateValidate('${sub.tableName}', '${po.fieldDbName}', value, formData.id || '')\n    }\n  </#if>\n  </#list>\n  defineExpose({\n    add,\n    edit,\n    submitForm,\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .antd-modal-form {\n    padding: 14px 20px;\n  }\n</style>\n</#list>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/erp/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/[1-n]Modal.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<#list subTables as sub>\n#segment#${sub.entityName}Modal.vue\n<template>\n  <j-modal :title=\"title\" maxHeight=\"500px\" :width=\"${getModalWidth(tableVo.fieldRowNum?default(1))}\" :visible=\"visible\" @ok=\"handleOk\" :okButtonProps=\"{ class: { 'jee-hidden': disableSubmit } }\" @cancel=\"handleCancel\" cancelText=\"关闭\">\n      <${sub.entityName}Form ref=\"registerForm\" @ok=\"submitCallback\" :formDisabled=\"disableSubmit\" :formBpm=\"false\"></${sub.entityName}Form>\n  </j-modal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, computed, unref, inject, nextTick, defineExpose } from 'vue';\n  import ${sub.entityName}Form from './${sub.entityName}Form.vue'\n  import JModal from '/@/components/Modal/src/JModal/JModal.vue';\n  \n  const title = ref<string>('');\n  const width = ref<number>(800);\n  const visible = ref<boolean>(false);\n  const disableSubmit = ref<boolean>(false);\n  const registerForm = ref();\n  const emit = defineEmits(['register', 'success']);\n  \n  /**\n   * 新增\n   */\n  function add() {\n    title.value = '新增';\n    visible.value = true;\n    nextTick(() => {\n      registerForm.value.add();\n    });\n  }\n  \n  /**\n   * 编辑\n   * @param record\n   */\n  function edit(record) {\n    title.value = disableSubmit.value ? '详情' : '编辑';\n    visible.value = true;\n    nextTick(() => {\n      registerForm.value.edit(record);\n    });\n  }\n  /**\n   * 确定按钮点击事件\n   */\n  function handleOk() {\n    registerForm.value.submitForm();\n  }\n  \n  /**\n   * form保存回调事件\n   */\n  function submitCallback() {\n    handleCancel();\n    emit('success');\n  }\n  \n  /**\n   * 取消按钮回调事件\n   */\n  function handleCancel() {\n    visible.value = false;\n  }\n  \n  defineExpose({\n    add,\n    edit,\n    disableSubmit,\n  });\n</script>\n<style lang=\"less\">\n  /**隐藏样式-modal确定按钮 */\n  .jee-hidden {\n    display: none !important;\n  }\n</style>\n<style lang=\"less\" scoped></style>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai",
    "content": "package ${bussiPackage}.${entityPackage}.controller;\n\nimport java.io.UnsupportedEncodingException;\nimport java.io.IOException;\nimport java.net.URLDecoder;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.HashMap;\nimport java.util.stream.Collectors;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\n\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.query.QueryRuleEnum;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecgframework.poi.excel.entity.enmus.ExcelType;\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport ${bussiPackage}.${entityPackage}.vo.${entityName}Page;\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.service.I${sub.entityName}Service;\n</#list>\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\nimport com.alibaba.fastjson.JSON;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\n<#assign has_multi_query_field=false>\n<#list originalColumns as po>\n<#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')>\n   <#assign has_multi_query_field=true>\n</#if>\n</#list>\n<#assign enhanceJavaList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.enhanceJavaList??>\n  <#assign enhanceJavaList = tableVo.extendParams.enhanceJavaList?filter(enhance -> enhance??)>\n</#if>\n /**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Tag(name=\"${tableVo.ftlDescription}\")\n@RestController\n@RequestMapping(\"/${entityPackagePath}/${entityName?uncap_first}\")\n@Slf4j\npublic class ${entityName}Controller {\n\t@Autowired\n\tprivate I${entityName}Service ${entityName?uncap_first}Service;\n\t<#list subTables as sub>\n\t@Autowired\n\tprivate I${sub.entityName}Service ${sub.entityName?uncap_first}Service;\n\t</#list>\n\t\n\t/**\n\t * 分页列表查询\n\t *\n\t * @param ${entityName?uncap_first}\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t//@AutoLog(value = \"${tableVo.ftlDescription}-分页列表查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-分页列表查询\")\n\t@GetMapping(value = \"/list\")\n\tpublic Result<IPage<${entityName}>> queryPageList(${entityName} ${entityName?uncap_first},\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t   HttpServletRequest req) {\n   <#if enhanceJavaList?size gt 0>\n    <#list enhanceJavaList as enhanceJava>\n    <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'>\n          //TODO 查询前触发的方法，代码生成后，请手工实现增强类逻辑;\n          //${entityName?uncap_first}Service.beforeQuery()\n    </#if>\n    </#list>\n   </#if>\n   <#if has_multi_query_field>\n       // 自定义查询规则\n       Map<String, QueryRuleEnum> customeRuleMap = new HashMap<>();\n       // 自定义多选的查询规则为：LIKE_WITH_OR\n   <#list originalColumns as po>\n       <#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')>\n       customeRuleMap.put(\"${po.fieldName}\", QueryRuleEnum.LIKE_WITH_OR);\n       </#if>\n   </#list>\n        QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap(),customeRuleMap);\n   <#else>\n        QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap());\n   </#if>\n\t\tPage<${entityName}> page = new Page<${entityName}>(pageNo, pageSize);\n\t\tIPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper);\n   <#if enhanceJavaList?size gt 0>\n     <#list enhanceJavaList as enhanceJava>\n     <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'>\n          //TODO 查询后触发的方法，代码生成后，请手工实现增强类逻辑;\n           //${entityName?uncap_first}Service.afterQuery()\n     </#if>\n     </#list>\n   </#if>\n\t\treturn Result.OK(pageList);\n\t}\n\t\n\t/**\n\t *   添加\n\t *\n\t * @param ${entityName?uncap_first}Page\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-添加\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-添加\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:add\")\n\t@PostMapping(value = \"/add\")\n\tpublic Result<String> add(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) {\n    <#if enhanceJavaList?size gt 0>\n      <#list enhanceJavaList as enhanceJava>\n      <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='start'  && enhanceJava.activeStatus=='1'>\n          //TODO 新增前的处理方法，代码生成后，请手工实现增强类逻辑;\n          //${entityName?uncap_first}Service.beforeAdd()\n      </#if>\n      </#list>\n    </#if>\n\t\t${entityName} ${entityName?uncap_first} = new ${entityName}();\n\t\tBeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first});\n\t\t${entityName?uncap_first}Service.saveMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>);\n    <#if enhanceJavaList?size gt 0>\n      <#list enhanceJavaList as enhanceJava>\n      <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='end'  && enhanceJava.activeStatus=='1'>\n           //TODO 新增后的处理方法，代码生成后，请手工实现增强类逻辑;\n           //${entityName?uncap_first}Service.afterAdd()\n       </#if>\n      </#list>\n    </#if>\n\t\treturn Result.OK(\"添加成功！\");\n\t}\n\t\n\t/**\n\t *  编辑\n\t *\n\t * @param ${entityName?uncap_first}Page\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-编辑\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-编辑\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:edit\")\n\t@RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n\tpublic Result<String> edit(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) {\n    <#if enhanceJavaList?size gt 0>\n      <#list enhanceJavaList as enhanceJava>\n      <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='start'  && enhanceJava.activeStatus=='1'>\n           //TODO 编辑前，代码生成后，请手工实现增强类逻辑;\n           //${entityName?uncap_first}Service.beforeEdit()\n      </#if>\n      </#list>\n    </#if>\n\t\t${entityName} ${entityName?uncap_first} = new ${entityName}();\n\t\tBeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first});\n\t\t${entityName} ${entityName?uncap_first}Entity = ${entityName?uncap_first}Service.getById(${entityName?uncap_first}.getId());\n\t\tif(${entityName?uncap_first}Entity==null) {\n\t\t\treturn Result.error(\"未找到对应数据\");\n\t\t}\n\t\t${entityName?uncap_first}Service.updateMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>);\n\t<#if enhanceJavaList?size gt 0>\n      <#list enhanceJavaList as enhanceJava>\n      <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'>\n          //TODO 编辑后，代码生成后，请手工实现增强类逻辑;\n          //${entityName?uncap_first}Service.afterEdit()\n      </#if>\n      </#list>\n    </#if>\n\t\treturn Result.OK(\"编辑成功!\");\n\t}\n\t\n\t/**\n\t *   通过id删除\n\t *\n\t * @param id\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-通过id删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id删除\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:delete\")\n\t@DeleteMapping(value = \"/delete\")\n\tpublic Result<String> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${entityName?uncap_first}Service.delMain(id);\n\t\treturn Result.OK(\"删除成功!\");\n\t}\n\t\n\t/**\n\t *  批量删除\n\t *\n\t * @param ids\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-批量删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-批量删除\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:deleteBatch\")\n\t@DeleteMapping(value = \"/deleteBatch\")\n\tpublic Result<String> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tthis.${entityName?uncap_first}Service.delBatchMain(Arrays.asList(ids.split(\",\")));\n\t\treturn Result.OK(\"批量删除成功！\");\n\t}\n\t\n\t/**\n\t * 通过id查询\n\t *\n\t * @param id\n\t * @return\n\t */\n\t//@AutoLog(value = \"${tableVo.ftlDescription}-通过id查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id查询\")\n\t@GetMapping(value = \"/queryById\")\n\tpublic Result<${entityName}> queryById(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${entityName} ${entityName?uncap_first} = ${entityName?uncap_first}Service.getById(id);\n\t\tif(${entityName?uncap_first}==null) {\n\t\t\treturn Result.error(\"未找到对应数据\");\n\t\t}\n\t\treturn Result.OK(${entityName?uncap_first});\n\n\t}\n\t\n\t<#list subTables as sub>\n\t/**\n\t * 通过id查询\n\t *\n\t * @param id\n\t * @return\n\t */\n\t//@AutoLog(value = \"${sub.ftlDescription}-通过主表ID查询\")\n\t@Operation(summary=\"${sub.ftlDescription}-通过主表ID查询\")\n\t@GetMapping(value = \"/query${sub.entityName}ByMainId\")\n\tpublic Result<IPage<${sub.entityName}>> query${sub.entityName}ListByMainId(@RequestParam(name=\"id\",required=true) String id) {\n\t\tList<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(id);\n\t\t<#-- 包裹分页对象，用于翻译注解 -->\n\t\tIPage <${sub.entityName}> page = new Page<>();\n\t\tpage.setRecords(${sub.entityName?uncap_first}List);\n\t\tpage.setTotal(${sub.entityName?uncap_first}List.size());\n\t\treturn Result.OK(page);\n\t}\n\t</#list>\n\n    /**\n    * 导出excel\n    *\n    * @param request\n    * @param ${entityName?uncap_first}\n    */\n    @RequiresPermissions(\"${entityPackage}:${tableName}:exportXls\")\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) {\n      <#if enhanceJavaList?size gt 0>\n       <#list enhanceJavaList as enhanceJava>\n       <#if enhanceJava.buttonCode=='export' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'>\n            //TODO 导出前，代码生成后，请手工实现增强类逻辑;\n            //${entityName?uncap_first}Service.beforeExport()\n       </#if>\n       </#list>\n      </#if>\n      // Step.1 组装查询条件查询数据\n      QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap());\n      LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\n     //配置选中数据查询条件\n      String selections = request.getParameter(\"selections\");\n      if(oConvertUtils.isNotEmpty(selections)) {\n           List<String> selectionList = Arrays.asList(selections.split(\",\"));\n           queryWrapper.in(\"id\",selectionList);\n      }\n      //Step.2 获取导出数据\n      List<${entityName}>  ${entityName?uncap_first}List = ${entityName?uncap_first}Service.list(queryWrapper);\n\n      // Step.3 组装pageList\n      List<${entityName}Page> pageList = new ArrayList<${entityName}Page>();\n      for (${entityName} main : ${entityName?uncap_first}List) {\n          ${entityName}Page vo = new ${entityName}Page();\n          BeanUtils.copyProperties(main, vo);\n          <#list subTables as sub>\n          List<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(main.getId());\n          vo.set${sub.entityName}List(${sub.entityName?uncap_first}List);\n          </#list>\n          pageList.add(vo);\n      }\n\n      // Step.4 AutoPoi 导出Excel\n      ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n      mv.addObject(NormalExcelConstants.FILE_NAME, \"${tableVo.ftlDescription}列表\");\n      mv.addObject(NormalExcelConstants.CLASS, ${entityName}Page.class);\n      mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(\"${tableVo.ftlDescription}数据\", \"导出人:\"+sysUser.getRealname(), \"${tableVo.ftlDescription}\", ExcelType.XSSF));\n      mv.addObject(NormalExcelConstants.DATA_LIST, pageList);\n      return mv;\n    }\n\n    /**\n    * 通过excel导入数据\n    *\n    * @param request\n    * @param response\n    * @return\n    */\n    @RequiresPermissions(\"${entityPackage}:${tableName}:importExcel\")\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n   <#if enhanceJavaList?size gt 0>\n       <#list enhanceJavaList as enhanceJava>\n       <#if enhanceJava.buttonCode=='import' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'>\n            //TODO 导入前，代码生成后，请手工实现增强类逻辑;\n            //${entityName?uncap_first}Service.beforeImport()\n       </#if>\n       </#list>\n  </#if>\n      MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n      Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n      for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n          // 获取上传文件对象\n          MultipartFile file = entity.getValue();\n          ImportParams params = new ImportParams();\n          params.setTitleRows(2);\n          params.setHeadRows(1);\n          params.setNeedSave(true);\n          try {\n              List<${entityName}Page> list = ExcelImportUtil.importExcel(file.getInputStream(), ${entityName}Page.class, params);\n              for (${entityName}Page page : list) {\n                  ${entityName} po = new ${entityName}();\n                  BeanUtils.copyProperties(page, po);\n                  ${entityName?uncap_first}Service.saveMain(po, <#list subTables as sub>page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>);\n              }\n              return Result.OK(\"文件导入成功！数据行数:\" + list.size());\n          } catch (Exception e) {\n              log.error(e.getMessage(),e);\n              return Result.error(\"文件导入失败:\"+e.getMessage());\n          } finally {\n              try {\n                  file.getInputStream().close();\n              } catch (IOException e) {\n                  e.printStackTrace();\n              }\n          }\n      }\n      return Result.OK(\"文件导入失败！\");\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai",
    "content": "<#include \"/common/utils.ftl\">\npackage ${bussiPackage}.${entityPackage}.entity;\n\nimport java.io.Serializable;\nimport java.io.UnsupportedEncodingException;\nimport java.util.Date;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport org.jeecg.common.constant.ProvinceCityArea;\nimport org.jeecg.common.util.SpringContextUtils;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.jeecg.common.aspect.annotation.Dict;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Schema(description=\"${tableVo.ftlDescription}\")\n@Data\n@TableName(\"${tableName}\")\npublic class ${entityName} implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n <#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']>\n  <#assign excel_ignore_classType_arr=['pca','switch','cat_tree']>\n    <#list originalColumns as po>\n    <#-- 生成字典Code -->\n    <#assign list_field_dictCode=\"\">\n    <#if po.classType='sel_user'>\n      <#assign list_field_dictCode=', dictTable = \"sys_user\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"realname\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"username\\\")?trim)}\"'>\n    <#elseif po.classType='sel_depart'>\n      <#assign list_field_dictCode=', dictTable = \"sys_depart\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"depart_name\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"id\\\")?trim)}\"'>\n    <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>\n      <#if po.dictTable?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText}\", dicCode = \"${po.dictField}\"'>\n      <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dicCode = \"${po.dictField}\"'>\n    </#if>\n    <#elseif po.classType=='sel_tree'>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText?split(\",\")[2]}\", dicCode = \"${po.dictText?split(\",\")[0]}\"'>\n    <#elseif po.classType=='link_table'>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicCode = \"${po.dictField}\", dicText = \"${po.dictText?split(\",\")[0]}\"'>\n    </#if>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t@TableId(type = IdType.ASSIGN_ID)\n\t<#else>\n\t\t<#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'>\n\t\t\t<#if po.classType=='date'>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t\t\t<#else>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t\t\t</#if>\n\t\t<#else>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\") && !excel_ignore_classType_arr?seq_contains(\"${po.classType}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n\t</#if>\n\t\t</#if>\n      <#if list_field_dictCode?length gt 1>\n    @Dict(${list_field_dictCode?substring(2)})\n      </#if>\n\t</#if>\n    <#include \"/common/blob.ftl\">\n\t</#list>\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai",
    "content": "<#include \"/common/utils.ftl\">\n<#list subTables as subTab>\n#segment#${subTab.entityName}.java\npackage ${bussiPackage}.${entityPackage}.entity;\n\nimport java.io.Serializable;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport org.jeecg.common.constant.ProvinceCityArea;\nimport org.jeecg.common.util.SpringContextUtils;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport java.util.Date;\nimport org.jeecg.common.aspect.annotation.Dict;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport java.io.UnsupportedEncodingException;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Schema(description=\"${subTab.ftlDescription}\")\n@Data\n@TableName(\"${subTab.tableName}\")\npublic class ${subTab.entityName} implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']>\n <#assign excel_ignore_classType_arr=['pca','switch','cat_tree']>\n    <#list subTab.originalColumns as po>\n\t<#-- 生成字典Code -->\n\t<#assign list_field_dictCode=\"\">\n\t<#if po.classType='sel_user'>\n\t\t<#assign list_field_dictCode=', dictTable = \"sys_user\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"realname\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"username\\\")?trim)}\"'>\n\t<#elseif po.classType='sel_depart'>\n\t\t<#assign list_field_dictCode=', dictTable = \"sys_depart\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"depart_name\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"id\\\")?trim)}\"'>\n\t<#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>\n\t\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n\t\t\t<#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText}\", dicCode = \"${po.dictField}\"'>\n\t\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t\t<#assign list_field_dictCode=', dicCode = \"${po.dictField}\"'>\n\t\t<#elseif po.classType=='sel_tree'>\n\t\t\t<#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText?split(\",\")[2]}\", dicCode = \"${po.dictText?split(\",\")[0]}\"'>\n\t\t</#if>\n\t<#elseif po.classType=='link_table'>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicCode = \"${po.dictField}\", dicText = \"${po.dictText?split(\",\")[0]}\"'>\n\t</#if>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t@TableId(type = IdType.ASSIGN_ID)\n\t<#else>\n\t\t<#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'>\n\t\t\t<#if po.classType=='date'>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t\t\t<#else>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t\t\t</#if>\n\t\t<#elseif !subTab.foreignKeys?seq_contains(po.fieldName?cap_first)>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\") && !excel_ignore_classType_arr?seq_contains(\"${po.classType}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n\t</#if>\n\t\t</#if>\n\t</#if>\n  <#if list_field_dictCode?length gt 1>\n\t@Dict(${list_field_dictCode?substring(2)})\n  </#if>\n\t<#-- 大字段转换 -->\n    <#include \"/common/blob.ftl\">\n\t</#list>\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai",
    "content": "package ${bussiPackage}.${entityPackage}.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface ${entityName}Mapper extends BaseMapper<${entityName}> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}Mapper.java\npackage ${bussiPackage}.${entityPackage}.mapper;\n\nimport java.util.List;\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Param;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface ${subTab.entityName}Mapper extends BaseMapper<${subTab.entityName}> {\n\n\t/**\n\t * 通过主表id删除子表数据\n\t *\n\t * @param mainId 主表id\n\t * @return boolean\n\t */\n\tpublic boolean deleteByMainId(@Param(\"mainId\") String mainId);\n\n  /**\n   * 通过主表id查询子表数据\n   *\n   * @param mainId 主表id\n   * @return List<${subTab.entityName}>\n   */\n\tpublic List<${subTab.entityName}> selectByMainId(@Param(\"mainId\") String mainId);\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml",
    "content": "<#list subTables as subTab>\n<#assign originalForeignKeys = subTab.originalForeignKeys>\n#segment#${subTab.entityName}Mapper.xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper\">\n\n\t<delete id=\"deleteByMainId\" parameterType=\"java.lang.String\">\n\t\tDELETE \n\t\tFROM  ${subTab.tableName} \n\t\tWHERE\n\t\t<#list originalForeignKeys as key>\n\t\t\t ${key} = ${r'#'}{mainId} <#rt/>\n\t\t</#list>\n\t</delete>\n\t\n\t<select id=\"selectByMainId\" parameterType=\"java.lang.String\" resultType=\"${bussiPackage}.${entityPackage}.entity.${subTab.entityName}\">\n\t\tSELECT * \n\t\tFROM  ${subTab.tableName}\n\t\tWHERE\n\t\t<#list originalForeignKeys as key>\n\t\t\t ${key} = ${r'#'}{mainId} <#rt/>\n\t\t</#list>\n\t</select>\n</mapper>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service;\n\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport java.io.Serializable;\nimport java.util.Collection;\nimport java.util.List;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface I${entityName}Service extends IService<${entityName}> {\n\n\t/**\n\t * 添加一对多\n\t *\n\t * @param ${entityName?uncap_first}\n\t <#list subTables as sub>\n\t * @param ${sub.entityName?uncap_first}List\n\t </#list>\n\t */\n\tpublic void saveMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) ;\n\t\n\t/**\n\t * 修改一对多\n\t *\n\t * @param ${entityName?uncap_first}\n\t <#list subTables as sub>\n\t * @param ${sub.entityName?uncap_first}List\n\t </#list>\n\t */\n\tpublic void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>);\n\t\n\t/**\n\t * 删除一对多\n\t *\n\t * @param id\n\t */\n\tpublic void delMain (String id);\n\t\n\t/**\n\t * 批量删除一对多\n\t *\n\t * @param idList\n\t */\n\tpublic void delBatchMain (Collection<? extends Serializable> idList);\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai",
    "content": "<#list subTables as subTab>\n#segment#I${subTab.entityName}Service.java\npackage ${bussiPackage}.${entityPackage}.service;\n\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport java.util.List;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface I${subTab.entityName}Service extends IService<${subTab.entityName}> {\n\n\t/**\n\t * 通过主表id查询子表数据\n\t *\n\t * @param mainId 主表id\n\t * @return List<${subTab.entityName}>\n\t */\n\tpublic List<${subTab.entityName}> selectByMainId(String mainId);\n}\n</#list>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service.impl;\n\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.mapper.${sub.entityName}Mapper;\n</#list>\nimport ${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper;\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.transaction.annotation.Transactional;\nimport java.io.Serializable;\nimport java.util.List;\nimport java.util.Collection;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Service\npublic class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service {\n\n\t@Autowired\n\tprivate ${entityName}Mapper ${entityName?uncap_first}Mapper;\n\t<#list subTables as sub>\n\t@Autowired\n\tprivate ${sub.entityName}Mapper ${sub.entityName?uncap_first}Mapper;\n\t</#list>\n\t\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void saveMain(${entityName} ${entityName?uncap_first}, <#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) {\n\t\t${entityName?uncap_first}Mapper.insert(${entityName?uncap_first});\n\t\t<#list subTables as sub>\n\t\tif(${sub.entityName?uncap_first}List!=null && ${sub.entityName?uncap_first}List.size()>0) {\n\t\t\tfor(${sub.entityName} entity:${sub.entityName?uncap_first}List) {\n\t\t\t\t<#list sub.foreignKeys as key>\n\t\t\t\t//外键设置\n\t\t\t\t<#if key?lower_case?index_of(\"${primaryKeyField}\")!=-1>\n\t\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}());\n\t\t\t\t<#else>\n\t\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${key}());\n\t\t\t\t</#if>\n\t\t\t\t</#list>\n\t\t\t\t${sub.entityName?uncap_first}Mapper.insert(entity);\n\t\t\t}\n\t\t}\n\t\t</#list>\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) {\n\t\t${entityName?uncap_first}Mapper.updateById(${entityName?uncap_first});\n\t\t\n\t\t//1.先删除子表数据\n\t\t<#list subTables as sub>\n\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(${entityName?uncap_first}.getId());\n\t\t</#list>\n\t\t\n\t\t//2.子表数据重新插入\n\t\t<#list subTables as sub>\n\t\tif(${sub.entityName?uncap_first}List!=null && ${sub.entityName?uncap_first}List.size()>0) {\n\t\t\tfor(${sub.entityName} entity:${sub.entityName?uncap_first}List) {\n\t\t\t\t<#list sub.foreignKeys as key>\n\t\t\t\t//外键设置\n\t\t\t\t<#if key?lower_case?index_of(\"${primaryKeyField}\")!=-1>\n\t\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}());\n\t\t\t\t<#else>\n\t\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${key}());\n\t\t\t\t</#if>\n\t\t\t\t</#list>\n\t\t\t\t${sub.entityName?uncap_first}Mapper.insert(entity);\n\t\t\t}\n\t\t}\n\t\t</#list>\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void delMain(String id) {\n\t\t<#list subTables as sub>\n\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(id);\n\t\t</#list>\n\t\t${entityName?uncap_first}Mapper.deleteById(id);\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void delBatchMain(Collection<? extends Serializable> idList) {\n\t\tfor(Serializable id:idList) {\n\t\t\t<#list subTables as sub>\n\t\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(id.toString());\n\t\t\t</#list>\n\t\t\t${entityName?uncap_first}Mapper.deleteById(id);\n\t\t}\n\t}\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}ServiceImpl.java\npackage ${bussiPackage}.${entityPackage}.service.impl;\n\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport ${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper;\nimport ${bussiPackage}.${entityPackage}.service.I${subTab.entityName}Service;\nimport org.springframework.stereotype.Service;\nimport java.util.List;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Service\npublic class ${subTab.entityName}ServiceImpl extends ServiceImpl<${subTab.entityName}Mapper, ${subTab.entityName}> implements I${subTab.entityName}Service {\n\t\n\t@Autowired\n\tprivate ${subTab.entityName}Mapper ${subTab.entityName?uncap_first}Mapper;\n\t\n\t@Override\n\tpublic List<${subTab.entityName}> selectByMainId(String mainId) {\n\t\treturn ${subTab.entityName?uncap_first}Mapper.selectByMainId(mainId);\n\t}\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai",
    "content": "package ${bussiPackage}.${entityPackage}.vo;\n\nimport java.util.List;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport lombok.Data;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.jeecgframework.poi.excel.annotation.ExcelEntity;\nimport org.jeecgframework.poi.excel.annotation.ExcelCollection;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport java.util.Date;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecg.common.constant.ProvinceCityArea;\nimport org.jeecg.common.util.SpringContextUtils;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Data\n@Schema(description=\"${tableVo.ftlDescription}\")\npublic class ${entityName}Page {\n\n<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']>\n<#assign excel_ignore_classType_arr=['pca','switch','cat_tree']>\n    <#list originalColumns as po>\n    <#-- 生成字典Code -->\n    <#assign list_field_dictCode=\"\">\n    <#if po.classType='sel_user'>\n      <#assign list_field_dictCode=', dictTable = \"sys_user\", dicText = \"realname\", dicCode = \"username\"'>\n    <#elseif po.classType='sel_depart'>\n      <#assign list_field_dictCode=', dictTable = \"sys_depart\", dicText = \"depart_name\", dicCode = \"id\"'>\n    <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>\n      <#if po.dictTable?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText}\", dicCode = \"${po.dictField}\"'>\n      <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dicCode = \"${po.dictField}\"'>\n      <#elseif po.classType=='cat_tree'>\n        <#assign list_field_dictCode=', dictTable = \"sys_category\", dicText = \"name\", dicCode = \"id\"'>\n      </#if>\n    </#if>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t<#else>\n\t\t<#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'>\n\t\t\t<#if po.classType=='date'>\n\t<#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t\t\t<#else>\n\t<#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t\t\t</#if>\n\t\t<#else>\n\t<#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")  && !excel_ignore_classType_arr?seq_contains(\"${po.classType}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n\t</#if>\n\t<#if list_field_dictCode?length gt 1   && !excel_ignore_classType_arr?seq_contains(\"${po.classType}\")>\n    @Dict(${list_field_dictCode?substring(2)})\n    </#if>\n\t\t</#if>\n\t</#if>\n\t@Schema(description = \"${po.filedComment}\")\n    <#if po.fieldDbType=='Blob'>\n    private java.lang.String ${po.fieldName}String;\n    <#elseif po.classType=='pca'>\n    @Excel(name = \"${po.filedComment}\", width = 15,exportConvert=true,importConvert = true )\n    private ${po.fieldType} ${po.fieldName};\n\n    public String convertis${po.fieldName?cap_first}() {\n        return SpringContextUtils.getBean(ProvinceCityArea.class).getText(${po.fieldName});\n    }\n\n    public void convertset${po.fieldName?cap_first}(String text) {\n        this.${po.fieldName} = SpringContextUtils.getBean(ProvinceCityArea.class).getCode(text);\n    }\n    <#elseif po.classType=='cat_tree'>\n    @Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n    private ${po.fieldType} ${po.fieldName};\n    <#elseif po.classType=='switch'>\n    <#assign switch_extend_arr=['Y','N']>\n    <#if po.dictField?default(\"\")?contains(\"[\")>\n        <#assign switch_extend_arr=po.dictField?eval>\n    </#if>\n    <#list switch_extend_arr as a>\n        <#if a_index == 0>\n            <#assign switch_extend_arr1=a>\n        <#else>\n            <#assign switch_extend_arr2=a>\n        </#if>\n    </#list>\n    @Excel(name = \"${po.filedComment}\", width = 15,replace = {\"是_${switch_extend_arr1}\",\"否_${switch_extend_arr2}\"} )\n    private ${po.fieldType} ${po.fieldName};\n    <#else>\n    private ${po.fieldType} ${po.fieldName};\n    </#if>\n\t</#list>\n\t\n\t<#list subTables as sub>\n\t@ExcelCollection(name=\"${sub.ftlDescription}\")\n\t@Schema(description = \"${sub.ftlDescription}\")\n\tprivate List<${sub.entityName}> ${sub.entityName?uncap_first}List;\n\t</#list>\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei",
    "content": "<#-- noinspection JSDuplicatedDeclaration,RequiredAttributes,NpmUsedModulesInstalled -->\n<#-- ** 引入全局工具方法 ** -->\n<#include \"/common/utils.ftl\">\n<#-- ** 定义全局使用的变量 ** -->\n<#-- 是否有查询条件 -->\n<#assign query_flag=false>\n<#-- 是否有下拉查询条件 -->\n<#assign query_field_select=false>\n<#-- 是否有日期查询条件 -->\n<#assign query_field_date=false>\n<#-- 是否有字典 -->\n<#assign list_need_dict=false>\n<#-- 是否有分类字典 -->\n<#assign list_need_category=false>\n<#-- 是否有省市区 -->\n<#assign list_need_pca=false>\n<#-- 是否有用户选择 -->\n<#assign query_sel_user=false>\n<#-- 是否有部门选择 -->\n<#assign query_sel_dep=false>\n<#-- 是否有下拉多选框 -->\n<#assign query_sel_multi=false>\n<#-- 是否有下拉搜索框 -->\n<#assign query_sel_search=false>\n<#-- 是否有省市区组件 -->\n<#assign query_field_pca=false>\n<#-- 是否有分类字典树 -->\n<#assign query_sel_cat=false>\n<template>\n  <a-card class=\"j-inner-table-wrapper\" :bordered=\"false\">\n\n    <!-- 查询区域 begin -->\n    <div class=\"table-page-search-wrapper\">\n      <a-form layout=\"inline\">\n        <a-row :gutter=\"24\">\n<#-- 查询区域 开始循环 -->\n<#assign query_field_index=0>\n<#list columns as po>\n  <#if po.isQuery=='Y'>\n  \t<#assign query_field_dictCode=\"\">\n    <#if po.dictTable?default(\"\")?trim?length gt 1>\n      <#assign query_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n    <#elseif po.dictField?default(\"\")?trim?length gt 1>\n      <#assign query_field_dictCode=\"${po.dictField}\">\n    </#if>\n    <#assign query_flag=true>\n    <#-- 定义组件可能会需要的属性 -->\n    <#assign attr_showTime=\"show-time date-format=\\\"YYYY-MM-DD HH:mm:ss\\\"\">\n    <#assign indent=\"\">\n    <#-- 将index>=2的查询条件隐藏起来 -->\n    <#if query_field_index==2>\n      <#-- 由于多了一层标签，所以需要多一层缩进 -->\n      <#assign indent=\"  \">\n          <template v-if=\"toggleSearchStatus\">\n    </#if>\n          <#-- update-begin-author:taoyan date:20220303 for: /issues/3420 内嵌风格，datetime控件样式异常 -->\n          <#if po.queryMode?default(\"\")?trim=='group' && po.classType=='datetime'>\n          ${indent}<a-col :xl=\"10\" :lg=\"12\" :md=\"12\" :sm=\"24\">\n          <#else>\n          ${indent}<a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n          </#if>\n          <#-- update-end-author:taoyan date:20220303 for: /issues/3420 内嵌风格，datetime控件样式异常 -->\n            ${indent}<a-form-item label=\"${po.filedComment}\">\n    <#-- 普通查询 -->\n    <#if po.queryMode=='single'>\n      <#-- 日期组件 -->\n      <#if po.classType=='date'>\n        <#assign query_field_date=true>\n              ${indent}<j-date ${getVModel(po)} ${getPlaceholder(po,\"请选择\")}/>\n      <#-- 日期时间组件 -->\n      <#elseif po.classType=='datetime'>\n        <#assign query_field_date=true>\n              ${indent}<j-date ${getVModel(po)} ${getPlaceholder(po,\"请选择\")} ${attr_showTime}/>\n      <#-- 下拉组件 -->\n      <#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>\n        <#assign query_field_select=true>\n        <#-- 下拉或是单选，判断数据字典是表字典还是普通字典 -->\n        <#if (po.dictTable!\"\")?trim?length gt 1>\n          ${indent}<j-dict-select-tag ${getVModel(po)} ${getPlaceholder(po,\"请选择\")} dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\"/>\n        <#elseif (po.dictField!\"\")?trim?length gt 1>\n          ${indent}<j-dict-select-tag ${getVModel(po)} ${getPlaceholder(po,\"请选择\")} dictCode=\"${po.dictField}\"/>\n        <#else>\n          ${indent}<a-input ${getVModel(po)} ${getPlaceholder(po,\"请输入\")}/>\n        </#if>\n      <#-- 用户选择组件 -->\n      <#elseif po.classType=='sel_user'>\n      <#assign query_sel_user=true>\n             ${indent}<j-select-user-by-dep placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"/>\n      <#-- 部门选择组件 -->\n      <#elseif po.classType=='sel_depart'>\n      <#assign query_sel_dep=true>\n             ${indent}<j-select-depart placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"/>\n      <#elseif po.classType=='list_multi'>\n      <#-- 下拉多选框组件 -->\n      <#assign query_sel_multi=true>\n             ${indent}<j-multi-select-tag placeholder=\"请选择${po.filedComment}\" dictCode=\"${query_field_dictCode?default(\"\")}\" v-model=\"queryParam.${po.fieldName}\"/>\n      <#-- popup组件 -->\n      <#elseif po.classType=='popup'>\n             ${indent}<j-popup placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" code=\"${po.dictTable}\" org-fields=\"${po.dictField}\" dest-fields=\"${po.dictText}\" :field=\"getPopupField('${po.dictText}')\" :multi=\"${po.extendParams.popupMulti?c}\"/>\n      <#-- 下拉搜索框 -->\n     <#elseif po.classType=='sel_search'>\n     <#assign query_sel_search=true>\n             ${indent}<j-search-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dict=\"${po.dictTable},${po.dictText},${po.dictField}\"/>\n     <#elseif po.classType=='pca'>\n     <#assign query_field_pca=true>\n             ${indent}<j-area-linkage type=\"cascader\" v-model=\"queryParam.${po.fieldName}\" placeholder=\"请选择省市区\"/>\n     <#elseif po.classType=='cat_tree'>\n     <#assign query_sel_cat=true>\n             ${indent}<j-category-select placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\"/>\n      <#-- 其他都归为输入框组件 -->\n      <#else>\n             ${indent}<a-input ${getVModel(po)} ${getPlaceholder(po,\"请输入\")}/>\n      </#if>\n    <#-- 范围查询 -->\n    <#else>\n      <#-- 范围日期组件 -->\n      <#if po.classType=='date'>\n        <#assign query_field_date=true>\n          ${indent}<j-date class=\"query-group-cust\" ${getVModel(po, \"_begin\")} ${getPlaceholder(po, \"请选择开始日期\",false)}/>\n          ${indent}<span class=\"query-group-split-cust\"></span>\n          ${indent}<j-date class=\"query-group-cust\" ${getVModel(po, \"_end\")} ${getPlaceholder(po, \"请选择结束日期\",false)}/>\n      <#-- 范围日期时间组件 -->\n      <#elseif po.classType=='datetime'>\n        <#assign query_field_date=true>\n          ${indent}<j-date class=\"query-group-cust\" ${getVModel(po, \"_begin\")} ${getPlaceholder(po, \"请选择开始时间\",false)} ${attr_showTime}/>\n          ${indent}<span class=\"query-group-split-cust\"></span>\n          ${indent}<j-date class=\"query-group-cust\" ${getVModel(po, \"_end\")} ${getPlaceholder(po, \"请选择结束时间\",false)} ${attr_showTime}/>\n      <#-- 其他都归为范围输入框组件 -->\n      <#else>\n          ${indent}<a-input class=\"query-group-cust\" ${getVModel(po, \"_begin\")} ${getPlaceholder(po, \"请输入最开始值\",false)}/>\n          ${indent}<span class=\"query-group-split-cust\"></span>\n          ${indent}<a-input class=\"query-group-cust\" ${getVModel(po, \"_end\")} ${getPlaceholder(po, \"请输入最结束值\",false)}/>\n      </#if>\n    </#if>\n            ${indent}</a-form-item>\n          ${indent}</a-col>\n    <#assign query_field_index=query_field_index+1>\n  </#if>\n  <#-- 判断是否需要字典 -->\n  <#if !list_need_dict && po.fieldShowType != 'popup' && (po.dictField!\"\")?trim?length gt 1>\n    <#assign list_need_dict=true>\n  </#if>\n  <#-- 判断是否需要分类字典 -->\n  <#if po.classType == 'cat_tree' && (po.dictText!\"\")?trim?length == 0>\n    <#assign list_need_category=true>\n  </#if>\n   <#-- 判断是否需要省市区 -->\n  <#if po.classType=='pca'>\n  <#assign list_need_pca=true>\n  </#if>\n</#list>\n<#-- 查询区域-结束循环 -->\n<#if query_field_index gt 2>\n          </template>\n</#if>\n<#if query_flag>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span class=\"table-page-search-submitButtons table-operator\">\n              <a-button type=\"primary\" icon=\"search\" @click=\"searchQuery\">查询</a-button>\n              <a-button type=\"primary\" icon=\"reload\" @click=\"searchReset\">重置</a-button>\n              <a @click=\"handleToggleSearch\" style=\"margin-left: 8px\">\n                <span>{{ toggleSearchStatus ? '收起' : '展开' }}</span>\n                <a-icon :type=\"toggleSearchStatus ? 'up' : 'down'\"/>\n              </a>\n            </span>\n          </a-col>\n</#if>\n        </a-row>\n      </a-form>\n    </div>\n    <!-- 查询区域 end -->\n\n    <!-- 操作按钮区域 begin -->\n    <div class=\"table-operator\">\n      <a-button type=\"primary\" icon=\"plus\" @click=\"handleAdd\">新增</a-button>\n      <a-button type=\"primary\" icon=\"download\" @click=\"handleExportXls('${tableVo.ftlDescription}')\">导出</a-button>\n      <a-upload name=\"file\" :showUploadList=\"false\" :multiple=\"false\" :headers=\"tokenHeader\" :action=\"importExcelUrl\" @change=\"handleImportExcel\">\n        <a-button type=\"primary\" icon=\"import\">导入</a-button>\n      </a-upload>\n      <!-- 高级查询区域 -->\n      <j-super-query :fieldList=\"superFieldList\" ref=\"superQueryModal\" @handleSuperQuery=\"handleSuperQuery\"></j-super-query>\n      <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n        <a-menu slot=\"overlay\">\n          <a-menu-item key=\"1\" @click=\"batchDel\">\n            <a-icon type=\"delete\"/>\n            <span>删除</span>\n          </a-menu-item>\n        </a-menu>\n        <a-button>\n          <span>批量操作</span>\n          <a-icon type=\"down\"/>\n        </a-button>\n      </a-dropdown>\n    </div>\n    <!-- 操作按钮区域 end -->\n\n    <!-- table区域 begin -->\n    <div>\n\n      <a-alert type=\"info\" showIcon style=\"margin-bottom: 16px;\">\n        <template slot=\"message\">\n          <span>已选择</span>\n          <a style=\"font-weight: 600;padding: 0 4px;\">{{ selectedRowKeys.length }}</a>\n          <span>项</span>\n          <a style=\"margin-left: 24px\" @click=\"onClearSelected\">清空</a>\n        </template>\n      </a-alert>\n\n      <a-table\n        ref=\"table\"\n        size=\"middle\"\n        bordered\n        rowKey=\"id\"\n        class=\"j-table-force-nowrap\"\n        :scroll=\"{x:true}\"\n        :loading=\"loading\"\n        :columns=\"columns\"\n        :dataSource=\"dataSource\"\n        :pagination=\"ipagination\"\n        :expandedRowKeys=\"expandedRowKeys\"\n        :rowSelection=\"{selectedRowKeys, onChange: onSelectChange}\"\n        @expand=\"handleExpand\"\n        @change=\"handleTableChange\"\n      >\n\n        <!-- 内嵌table区域 begin -->\n        <template slot=\"expandedRowRender\" slot-scope=\"record\">\n          <a-tabs tabPosition=\"top\">\n<#list subTables as sub>\n            <a-tab-pane tab=\"${sub.ftlDescription}\" key=\"${sub.entityName?uncap_first}\" forceRender>\n  <#assign subTableCompName=camelToHorizontal(\"${sub.entityName?uncap_first}\", \"lower\")/>\n              <${subTableCompName}-sub-table :record=\"record\"/>\n            </a-tab-pane>\n</#list>\n          </a-tabs>\n        </template>\n        <!-- 内嵌table区域 end -->\n\n        <template slot=\"htmlSlot\" slot-scope=\"text\">\n          <div v-html=\"text\"></div>\n        </template>\n\n        <template slot=\"imgSlot\" slot-scope=\"text,record\">\n          <div style=\"font-size: 12px;font-style: italic;\">\n            <span v-if=\"!text\">无图片</span>\n            <img v-else :src=\"getImgView(text)\" :preview=\"record.id\" alt=\"\" style=\"max-width:80px;height:25px;\"/>\n          </div>\n        </template>\n\n        <#if list_need_pca>\n        <template slot=\"pcaSlot\" slot-scope=\"text\">\n          <div>{{ getPcaText(text) }}</div>\n        </template>\n        </#if>\n\n        <template slot=\"fileSlot\" slot-scope=\"text\">\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n          <a-button\n            v-else\n            ghost\n            type=\"primary\"\n            icon=\"download\"\n            size=\"small\"\n            @click=\"downloadFile(text)\"\n          >\n            <span>下载</span>\n          </a-button>\n        </template>\n\n        <template slot=\"action\" slot-scope=\"text, record\">\n          <a @click=\"handleEdit(record)\">编辑</a>\n          <a-divider type=\"vertical\"/>\n          <a-dropdown>\n            <a class=\"ant-dropdown-link\">更多 <a-icon type=\"down\" /></a>\n            <a-menu slot=\"overlay\">\n              <a-menu-item>\n                <a-popconfirm title=\"确定删除吗?\" @confirm=\"handleDelete(record.id)\">\n                  <a>删除</a>\n                </a-popconfirm>\n              </a-menu-item>\n            </a-menu>\n          </a-dropdown>\n\n        </template>\n\n      </a-table>\n    </div>\n    <!-- table区域 end -->\n\n    <!-- 表单区域 -->\n<#assign modalForm=camelToHorizontal(\"${entityName?uncap_first}\", \"lower\")/>\n    <${modalForm}-modal ref=\"modalForm\" @ok=\"modalFormOk\"/>\n\n  </a-card>\n</template>\n\n<script>\n\n  import { JeecgListMixin } from '@/mixins/JeecgListMixin'\n  import ${entityName}Modal from './modules/${entityName}Modal'\n<#list subTables as sub>\n  import ${sub.entityName}SubTable from './subTables/${sub.entityName}SubTable'\n</#list>\n<#if query_field_select>\n  import JDictSelectTag from '@/components/dict/JDictSelectTag.vue'\n</#if>\n<#if query_field_date>\n  import JDate from '@/components/jeecg/JDate.vue'\n</#if>\n<#if list_need_dict>\n  import {filterMultiDictText} from '@/components/dict/JDictSelectUtil'\n</#if>\n<#if list_need_category>\n  import { loadCategoryData } from '@/api/api'\n</#if>\n<#if query_sel_user>\n  import JSelectUserByDep from '@/components/jeecgbiz/JSelectUserByDep'\n</#if>\n<#if query_sel_dep>\n  import JSelectDepart from '@/components/jeecgbiz/JSelectDepart'\n</#if>\n<#if query_sel_multi>\n  import JMultiSelectTag from '@/components/dict/JMultiSelectTag'\n</#if>\n<#if query_sel_search>\n  import JSearchSelectTag from '@/components/dict/JSearchSelectTag'\n</#if>\n<#if query_field_pca>\n  import JAreaLinkage from '@comp/jeecg/JAreaLinkage'\n</#if>\n<#if query_sel_cat>\n  import JCategorySelect from '@comp/jeecg/JCategorySelect'\n</#if>\n <#if list_need_pca>\n  import Area from '@/components/_util/Area'\n  </#if>\n  import '@/assets/less/TableExpand.less'\n\n  export default {\n    name: '${entityName}List',\n    mixins: [JeecgListMixin],\n    components: {\n      ${entityName}Modal,\n<#list subTables as sub>\n      ${sub.entityName}SubTable,\n</#list>\n<#if query_field_date>\n      JDate,\n</#if>\n<#if query_field_select>\n      JDictSelectTag,\n</#if>\n<#if query_sel_user>\n      JSelectUserByDep,\n</#if>\n<#if query_sel_dep>\n      JSelectDepart,\n</#if>\n<#if query_sel_multi>\n      JMultiSelectTag,\n</#if>\n<#if query_sel_search>\n      JSearchSelectTag,\n</#if>\n<#if query_field_pca>\n      JAreaLinkage,\n</#if>\n<#if query_sel_cat>\n      JCategorySelect,\n</#if>\n    },\n    data() {\n      return {\n        description: '${tableVo.ftlDescription}列表管理页面',\n        // 表头\n        columns: [\n          {\n            title: '#',\n            key: 'rowIndex',\n            width: 60,\n            align: 'center',\n            customRender: (t, r, index) => parseInt(index) + 1\n          },\n<#-- begin 遍历表头 -->\n<#list columns as po>\n  <#if po.isShowList == 'Y'>\n          {\n            title: '${po.filedComment}',\n            align: 'center',\n            <#if po.sort=='Y'>\n            sorter: true,\n            </#if>\n    <#if po.classType == 'date'>\n            dataIndex: '${po.fieldName}',\n    <#elseif po.fieldDbType=='Blob'>\n           dataIndex: '${po.fieldName}String'\n    <#elseif po.classType=='umeditor'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'htmlSlot'}\n    <#elseif po.classType=='pca'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'pcaSlot'}\n    <#elseif po.classType=='file'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'fileSlot'}\n    <#elseif po.classType=='image'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'imgSlot'}\n    <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user'>\n            dataIndex: '${po.fieldName}_dictText'\n    <#elseif po.classType=='cat_tree'>\n      <#if list_need_category>\n            dataIndex: '${po.fieldName}',\n            customRender: (text) => (text ? filterMultiDictText(this.dictOptions['${po.fieldName}'], text) : '')\n      <#else>\n            dataIndex: '${po.fieldName}',\n            customRender: (text, record) => (text ? record['${dashedToCamel(po.dictText)}'] : '')\n      </#if>\n    <#elseif po.classType=='switch'>\n            dataIndex: '${po.fieldName}',\n            <#if po.dictField != 'is_open'>\n            customRender: (text) => (!text ? \"\" : (text == ${po.dictField}[0] ? \"是\" : \"否\"))\n            <#else>\n            customRender: (text) => (!text ? \"\" : (text == \"Y\" ? \"是\" : \"否\"))\n            </#if>\n    <#else>\n            dataIndex: '${po.fieldName}',\n    </#if>\n          },\n  </#if>\n</#list>\n<#-- end 遍历表头 -->\n          {\n            title: '操作',\n            dataIndex: 'action',\n            align: 'center',\n            width:147,\n            scopedSlots: { customRender: 'action' },\n          },\n        ],\n        // 字典选项\n        dictOptions: {},\n        // 展开的行test\n        expandedRowKeys: [],\n<#assign urlPrefix=\"/${entityPackagePath}/${entityName?uncap_first}\">\n        url: {\n          list: '${urlPrefix}/list',\n          delete: '${urlPrefix}/delete',\n          deleteBatch: '${urlPrefix}/deleteBatch',\n          exportXlsUrl: '${urlPrefix}/exportXls',\n          importExcelUrl: '${urlPrefix}/importExcel',\n        },\n        <#if list_need_pca>\n        pcaData:'',\n        </#if>\n        superFieldList:[],\n      }\n    },\n    created() {\n      <#if list_need_pca>\n      this.pcaData = new Area()\n      </#if>\n      this.getSuperFieldList();\n    },\n    computed: {\n      importExcelUrl() {\n        return window._CONFIG['domianURL'] + this.url.importExcelUrl\n      }\n    },\n    methods: {\n     <#if list_need_pca>\n      getPcaText(code){\n        return this.pcaData.getText(code);\n      },\n     </#if>\n      initDictConfig() {\n<#list columns as po>\n  <#if (po.isQuery=='Y' || po.isShowList=='Y') && po.classType!='popup'>\n    <#if po.classType=='cat_tree' && list_need_category==true>\n        loadCategoryData({ code: \"${po.dictField?default('')}\" }).then((res) => {\n          if (res.success) {\n            this.$set(this.dictOptions, '${po.fieldName}', res.result)\n          }\n        })\n    </#if>\n  </#if>\n</#list>\n      },\n\n      handleExpand(expanded, record) {\n        this.expandedRowKeys = []\n        if (expanded === true) {\n          this.expandedRowKeys.push(record.id)\n        }\n      },\n      getSuperFieldList(){\n        <#include \"/common/utils.ftl\">\n        let fieldList=[];\n         <#list columns as po>\n        fieldList.push(${superQueryFieldList(po)})\n         </#list>\n        this.superFieldList = fieldList\n      }\n    }\n  }\n</script>\n<style lang=\"less\" scoped>\n  @import '~@assets/less/common.less';\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql",
    "content": "<#include \"/common/sql/menu_insert.ftl\">"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n   <a-spin :spinning=\"confirmLoading\">\n     <j-form-container :disabled=\"formDisabled\">\n       <!-- 主表单区域 -->\n       <a-form-model ref=\"form\" :model=\"model\" :rules=\"validatorRules\" slot=\"detail\">\n         <a-row>\n<#assign form_popup = false>\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign bpm_flag=false>\n<#assign form_span = 24>\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.isShow =='Y' && po.fieldName != 'id'>\n<#assign form_field_dictCode=\"\">\n  <#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n          <a-col :xs=\"24\" :sm=\"12\">\n            <a-form-model-item label=\"${po.filedComment}\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" prop=\"${autoStringSuffixForModel(po)}\">\n\t<#if po.classType =='date'>\n              <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='datetime'>\n              <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='time'>\n              <j-time placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='popup'>\n\t    <#assign form_popup=true>\n              <j-popup\n                v-model=\"model.${po.fieldName}\"\n                field=\"${po.fieldName}\"\n                org-fields=\"${po.dictField}\"\n                dest-fields=\"${Format.underlineToHump(po.dictText)}\"\n                code=\"${po.dictTable}\"\n                :multi=\"${po.extendParams.popupMulti?c}\"\n                @input=\"popupCallback\"\n                <#if po.readonly=='Y'>disabled</#if>/>\n    <#elseif po.classType =='sel_depart'>\n              <j-select-depart v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if> />\n<#elseif po.classType =='switch'>\n              <j-switch v-model=\"model.${po.fieldName}\" <#if po.dictField!= 'is_open'>:options=\"${po.dictField}\"</#if> <#if po.readonly=='Y'>disabled</#if>></j-switch>\n\t<#elseif po.classType =='pca'>\n\t\t      <j-area-linkage type=\"cascader\" v-model=\"model.${po.fieldName}\" placeholder=\"请输入省市区\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='markdown'>\n\t          <j-markdown-editor v-model=\"model.${autoStringSuffixForModel(po)}\" id=\"${po.fieldName}\"></j-markdown-editor>\n    <#elseif po.classType =='password'>\n\t          <a-input-password v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='sel_user'>\n              <j-select-user-by-dep v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='textarea'>\n              <a-textarea v-decorator=\"[${autoStringSuffix(po)}${autoWriteRules(po)}]\" rows=\"4\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='list' || po.classType=='radio'>\n              <j-dict-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\"  dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='list_multi' || po.classType=='checkbox'>\n              <j-multi-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\"  dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='sel_search'>\n              <j-search-select-tag v-model=\"model.${po.fieldName}\" dict=\"${form_field_dictCode}\" <#if po.readonly=='Y'>disabled</#if>/>\n    <#elseif po.classType=='cat_tree'>\n    \t<#assign form_cat_tree = true>\n              <j-category-select v-model=\"model.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\" placeholder=\"请选择${po.filedComment}\" <#if po.dictText?default(\"\")?trim?length gt 1>back=\"${dashedToCamel(po.dictText)}\" @change=\"handleCategoryChange\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n    \t<#if po.dictText?default(\"\")?trim?length gt 1>\n    \t<#assign form_cat_back = \"${po.dictText}\">\n    \t</#if>\n\t<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n              <a-input-number v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='file'>\n              <j-upload v-model=\"model.${po.fieldName}\"  <#if po.readonly=='Y'>disabled</#if> <#if po.uploadnum??>:number=${po.uploadnum}</#if>></j-upload>\n\t<#elseif po.classType=='image'>\n              <j-image-upload isMultiple <#if po.uploadnum??>:number=${po.uploadnum}</#if> v-model=\"model.${po.fieldName}\" <#if po.readonly=='Y'>disabled</#if>></j-image-upload>\n\t<#elseif po.classType=='umeditor'>\n              <j-editor v-model=\"model.${autoStringSuffixForModel(po)}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t\t<#elseif po.classType == 'sel_tree'>\n  \t          <j-tree-select\n                ref=\"treeSelect\"\n                placeholder=\"请选择${po.filedComment}\"\n                v-model=\"model.${po.fieldName}\"\n                <#if po.dictText??>\n                <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n                dict=\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\"\n                <#elseif po.dictText?split(',')[1]??>\n                pidField=\"${po.dictText?split(',')[1]}\"\n                <#elseif po.dictText?split(',')[3]??>\n                hasChildField=\"${po.dictText?split(',')[3]}\"\n                </#if>\n                </#if>\n                pidValue=\"${po.dictField}\"\n                <#if po.readonly=='Y'>disabled</#if>>\n              </j-tree-select>\n\t<#else>\n              <a-input v-model=\"model.${autoStringSuffixForModel(po)}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>></a-input>\n    </#if>\n            </a-form-model-item>\n          </a-col>\n</#if>\n</#list>\n        </a-row>\n      </a-form-model>\n     </j-form-container>\n      <!-- 子表单区域 -->\n      <a-tabs v-model=\"activeKey\" @change=\"handleChangeTabs\">\n<#list subTables as sub><#rt/>\n  <#if sub.foreignRelationType =='1'>\n        <a-tab-pane tab=\"${sub.ftlDescription}\" :key=\"refKeys[${sub_index}]\" :forceRender=\"true\">\n          <${Format.humpToShortbar(sub.entityName)}-form ref=\"${sub.entityName?uncap_first}Form\" @validateError=\"validateError\" :disabled=\"formDisabled\"></${Format.humpToShortbar(sub.entityName)}-form>\n        </a-tab-pane>\n\n  <#else>\n        <a-tab-pane tab=\"${sub.ftlDescription}\" :key=\"refKeys[${sub_index}]\" :forceRender=\"true\">\n          <j-editable-table\n            :ref=\"refKeys[${sub_index}]\"\n            :loading=\"${sub.entityName?uncap_first}Table.loading\"\n            :columns=\"${sub.entityName?uncap_first}Table.columns\"\n            :dataSource=\"${sub.entityName?uncap_first}Table.dataSource\"\n            :maxHeight=\"300\"\n            :disabled=\"formDisabled\"\n            :rowNumber=\"true\"\n            :rowSelection=\"true\"\n            :actionButton=\"true\"/>\n        </a-tab-pane>\n  </#if>\n</#list>\n      </a-tabs>\n       <#if bpm_flag>\n       <a-row v-if=\"showFlowSubmitButton\" style=\"text-align: center;width: 100%;margin-top: 16px;\"><a-button icon=\"check\" style=\"width: 126px\" type=\"primary\" @click=\"handleOk\">提 交</a-button></a-row>\n       </#if>\n    </a-spin>\n</template>\n\n<script>\n\n  import { FormTypes,getRefPromise,VALIDATE_NO_PASSED } from '@/utils/JEditableTableUtil'\n  import { JEditableTableModelMixin } from '@/mixins/JEditableTableModelMixin'\n  import { validateDuplicateValue } from '@/utils/util'\n  <#list subTables as sub>\n  <#if sub.foreignRelationType =='1'>\n  import ${sub.entityName}Form from './${sub.entityName}Form.vue'\n  </#if>\n  </#list>\n\n  export default {\n    name: '${entityName}Form',\n    mixins: [JEditableTableModelMixin],\n    components: {\n    <#list subTables as sub>\n    <#if sub.foreignRelationType =='1'>\n    ${sub.entityName}Form,\n    </#if>\n    </#list>\n    },\n    data() {\n      return {\n        labelCol: {\n          xs: { span: 24 },\n          sm: { span: 5 },\n        },\n        wrapperCol: {\n          xs: { span: 24 },\n          sm: { span: 16 },\n        },\n        model:{\n        <#include \"/common/init/initValue.ftl\">\n        },\n         <#include \"/common/validatorRulesTemplate/main.ftl\">\n        // 新增时子表默认添加几行空数据\n        addDefaultRowNum: 1,\n        refKeys: [<#list subTables as sub>'${sub.entityName?uncap_first}', </#list>],\n        tableKeys:[<#list subTables as sub><#if sub.foreignRelationType =='0'>'${sub.entityName?uncap_first}', </#if></#list>],\n        activeKey: '${subTables[0].entityName?uncap_first}',\n<#list subTables as sub><#rt/>\n        // ${sub.ftlDescription}\n        ${sub.entityName?uncap_first}Table: {\n          loading: false,\n          dataSource: [],\n          columns: [\n<#if sub.foreignRelationType =='0'>\n<#assign popupBackFields = \"\">\n\n<#-- 循环子表的列 开始 -->\n<#list sub.colums as col><#rt/>\n<#if col.isShow =='Y'>\n    <#if col.filedComment !='外键' >\n            {\n              title: '${col.filedComment}',\n              key: '${autoStringSuffixForModel(col)}',\n      <#if col.classType =='date'>\n              type: FormTypes.date,\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif col.classType =='datetime'>\n              type: FormTypes.datetime,\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif \"int,decimal,double,\"?contains(col.classType)>\n              type: FormTypes.inputNumber,\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif col.classType =='list' || col.classType =='radio'>\n              type: FormTypes.select,\n              <#if col.dictTable?default(\"\")?trim?length gt 1>\n              dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n              <#else>\n              dictCode:\"${col.dictField}\",\n              </#if>\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif col.classType =='list_multi' || col.classType =='checkbox'>\n              type: FormTypes.list_multi,\n              <#if col.dictTable?default(\"\")?trim?length gt 1>\n              dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n              <#else>\n              dictCode:\"${col.dictField}\",\n              </#if>\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif col.classType =='switch'>\n              type: FormTypes.checkbox,\n              <#if col.dictField == 'is_open'>\n              customValue: ['Y', 'N'],\n              <#else>\n              customValue: ${col.dictField},\n              </#if>\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif col.classType =='sel_search'>\n              type: FormTypes.sel_search,\n              <#if col.dictTable?default(\"\")?trim?length gt 1>\n              dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n              <#else>\n              dictCode:\"${col.dictField}\",\n              </#if>\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n        <#elseif col.classType =='sel_depart'>\n              type: FormTypes.sel_depart,\n              <#if col.extendParams.multiSelect?default(true) == false>\n              multi: false,\n              </#if>\n              <#if col.extendParams.store?default(\"\")?trim?length gt 1>\n              store: \"${col.extendParams.store}\",\n              </#if>\n              <#if col.extendParams.text?default(\"\")?trim?length gt 1>\n              text: \"${col.extendParams.text}\",\n              </#if>\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n        <#elseif col.classType =='sel_user'>\n              type: FormTypes.sel_user,\n              <#if col.extendParams.multiSelect?default(true) == false>\n              multi: false,\n              </#if>\n              <#if col.extendParams.store?default(\"\")?trim?length gt 1>\n              store: \"${col.extendParams.store}\",\n              </#if>\n              <#if col.extendParams.text?default(\"\")?trim?length gt 1>\n              text: \"${col.extendParams.text}\",\n              </#if>\n              <#if col.readonly=='Y'>\n              disabled: true,\n              </#if>\n      <#elseif col.classType =='image'>\n              type: FormTypes.image,\n              token:true,\n              responseName:\"message\",\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n              <#if col.uploadnum??>\n              number: ${col.uploadnum},\n              </#if>\n      <#elseif col.classType =='file'>\n              type: FormTypes.file,\n              token:true,\n              responseName:\"message\",\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n              <#if col.uploadnum??>\n              number: ${col.uploadnum},\n              </#if>\n      <#elseif col.classType =='popup'>\n        <#if popupBackFields?length gt 0>\n            <#assign popupBackFields = \"${popupBackFields}\"+\",\"+\"${col.dictText}\">\n        <#else>\n            <#assign popupBackFields = \"${col.dictText}\">\n        </#if>\n              type: FormTypes.popup,\n              popupCode:\"${col.dictTable}\",\n              destFields:\"${col.dictText}\",\n              orgFields:\"${col.dictField}\",\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#else>\n              type: FormTypes.input,\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      </#if>\n      <#if col.classType =='list_multi' || col.classType =='checkbox'>\n              width:\"250px\",\n      <#else>\n              width:\"200px\",\n      </#if>\n      <#if col.classType =='file'>\n              placeholder: '请选择文件',\n      <#else>\n              placeholder: '请输入${'$'}{title}',\n      </#if>\n      <#if col.defaultVal??>\n        <#if col.fieldDbType==\"BigDecimal\" || col.fieldDbType==\"double\" || col.fieldDbType==\"int\">\n              defaultValue:${col.defaultVal},\n              <#else>\n              defaultValue:\"${col.defaultVal}\",\n        </#if>\n      <#else>\n              defaultValue:'',\n      </#if>\n      <#-- 子表的校验 -->\n      <#assign subFieldValidType = col.fieldValidType!''>\n      <#-- 非空校验 -->\n      <#if col.nullable == 'N' || subFieldValidType == '*'>\n              validateRules: [{ required: true, message: '${'$'}{title}不能为空' }],\n      <#-- 其他情况下，只要有值就被认为是正则校验 -->\n      <#elseif subFieldValidType?length gt 0>\n        <#assign subMessage = '格式不正确'>\n        <#if subFieldValidType == 'only' >\n          <#assign subMessage = '不能重复'>\n        </#if>\n              validateRules: [{ pattern: \"${subFieldValidType}\", message: \"${'$'}{title}${subMessage}\" }],\n      </#if>\n            },\n    </#if>\n</#if>\n</#list>\n<#-- 循环子表的列 结束 -->\n\n<#-- 处理popup的隐藏列 -->\n<#if popupBackFields?length gt 0>\n<#list popupBackFields?split(\",\") as item>\n<#if item?length gt 0>\n<#assign tempItemFlag = true>\n\n<#list sub.colums as col>\n<#if col.isShow =='Y' && col.fieldName == item>\n<#assign tempItemFlag = false>\n</#if>\n</#list>\n<#if tempItemFlag>\n            {\n              title: '${item}',\n              key: '${item}',\n              type:\"hidden\"\n            },\n</#if>\n</#if>\n</#list>\n</#if>\n</#if>\n          ]\n        },\n</#list>\n        url: {\n          add: \"/${entityPackagePath}/${entityName?uncap_first}/add\",\n          edit: \"/${entityPackagePath}/${entityName?uncap_first}/edit\",\n<#list subTables as sub><#rt/>\n          ${sub.entityName?uncap_first}: {\n            list: '/${entityPackagePath}/${entityName?uncap_first}/query${sub.entityName}ByMainId'\n          },\n</#list>\n        }\n      }\n    },\n    props: {\n     <#if bpm_flag>\n      //流程表单data\n      formData: {\n        type: Object,\n        default: () => ({}),\n        required: false\n      },\n      //表单模式：false流程表单 true普通表单\n      formBpm: {\n        type: Boolean,\n        default: false,\n        required: false\n      },\n      </#if>\n      //表单禁用\n      disabled: {\n        type: Boolean,\n        default: false,\n        required: false\n      }\n    },\n    computed: {\n      formDisabled(){\n       <#if bpm_flag>\n        if(this.formBpm===true){\n          if(this.formData.disabled===false){\n            return false\n          }\n          return true\n        }\n         </#if>\n        return this.disabled\n      },\n       <#if bpm_flag>\n      showFlowSubmitButton(){\n        if(this.formBpm===true){\n          if(this.formData.disabled===false){\n            return true\n          }\n        }\n        return false\n      }\n       </#if>\n    },\n    created () {\n     <#if bpm_flag>\n      //如果是流程中表单，则需要加载流程表单data\n      this.showFlowData();\n       </#if>\n    },\n    methods: {\n     addBefore(){\n    <#list subTables as sub><#rt/>\n      <#if sub.foreignRelationType =='1'>\n            this.$refs.${sub.entityName?uncap_first}Form.clearFormData()\n      <#else>\n            this.${sub.entityName?uncap_first}Table.dataSource=[]\n      </#if>\n    </#list>\n      },\n      getAllTable() {\n        let values = this.tableKeys.map(key => getRefPromise(this, key))\n        return Promise.all(values)\n      },\n      /** 调用完edit()方法之后会自动调用此方法 */\n      editAfter() {\n        this.$nextTick(() => {\n<#list subTables as sub><#rt/>\n<#if sub.foreignRelationType =='1'>\n          this.$refs.${sub.entityName?uncap_first}Form.initFormData(this.url.${sub.entityName?uncap_first}.list,this.model.id)\n</#if>\n</#list>\n        })\n        // 加载子表数据\n        if (this.model.id) {\n          let params = { id: this.model.id }\n<#list subTables as sub><#rt/>\n<#if sub.foreignRelationType =='0'>\n          this.requestSubTableData(this.url.${sub.entityName?uncap_first}.list, params, this.${sub.entityName?uncap_first}Table)\n</#if>\n</#list>\n        }\n      },\n      //校验所有一对一子表表单\n    validateSubForm(allValues){\n        return new Promise((resolve,reject)=>{\n          Promise.all([\n      <#list subTables as sub><#rt/>\n        <#if sub.foreignRelationType =='1'>\n              this.$refs.${sub.entityName?uncap_first}Form.validate(${sub_index}),\n        </#if>\n      </#list>\n          ]).then(() => {\n            resolve(allValues)\n          }).catch(e => {\n            if (e.error === VALIDATE_NO_PASSED) {\n              // 如果有未通过表单验证的子表，就自动跳转到它所在的tab\n              this.activeKey = e.index == null ? this.activeKey : this.refKeys[e.index]\n            } else {\n              console.error(e)\n            }\n          })\n        })\n    },\n      /** 整理成formData */\n      classifyIntoFormData(allValues) {\n        let main = Object.assign(this.model, allValues.formValue)\n\n        return {\n          ...main, // 展开\n<#assign subManyIndex = 0>\n<#list subTables as sub><#rt/>\n<#if sub.foreignRelationType =='0'>\n          ${sub.entityName?uncap_first}List: allValues.tablesValue[${subManyIndex}].values,\n<#assign subManyIndex = subManyIndex+1>\n<#else>\n          ${sub.entityName?uncap_first}List: this.$refs.${sub.entityName?uncap_first}Form.getFormData(),\n</#if>\n</#list>\n        }\n      },\n        <#if bpm_flag>\n      //渲染流程表单数据\n     showFlowData(){\n        if(this.formBpm === true){\n            let params = {id:this.formData.dataId};\n            getAction(this.url.queryById,params).then((res)=>{\n              if(res.success){\n                this.edit (res.result);\n              }\n            })\n         }\n      },\n       </#if>\n      validateError(msg){\n        this.$message.error(msg)\n      },\n     close() {\n        this.visible = false\n        this.$emit('close')\n        this.$refs.form.clearValidate();\n      },\n     <#if form_popup>\n     popupCallback(value,row){\n        this.model = Object.assign(this.model, row);\n     },\n    </#if>\n   <#if form_cat_tree>\n     handleCategoryChange(value,backObj){\n       this.model = Object.assign(this.model, backObj);\n      }\n   </#if>\n\n    }\n  }\n</script>\n\n<style scoped>\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n  <j-modal\n    :title=\"title\"\n    :width=\"1200\"\n    :visible=\"visible\"\n    :maskClosable=\"false\"\n    switchFullscreen\n    @ok=\"handleOk\"\n    :okButtonProps=\"{ class:{'jee-hidden': disableSubmit} }\"\n    @cancel=\"handleCancel\">\n    <${Format.humpToShortbar(entityName)}-form ref=\"realForm\" @ok=\"submitCallback\" :disabled=\"disableSubmit\"/>\n  </j-modal>\n</template>\n\n<script>\n  import ${entityName}Form from './${entityName}Form'\n  export default {\n    name: '${entityName}Modal',\n    components: {\n      ${entityName}Form\n    },\n    data() {\n      return {\n        title:'',\n        visible: false,\n        disableSubmit: false\n      }\n    },\n    methods:{\n      add () {\n        this.visible=true\n        this.$nextTick(()=>{\n          this.$refs.realForm.add();\n        })\n      },\n      edit (record) {\n        this.visible=true\n        this.$nextTick(()=>{\n          this.$refs.realForm.edit(record);\n        })\n      },\n      close () {\n        this.$emit('close');\n        this.visible = false;\n      },\n      handleOk () {\n        this.$refs.realForm.handleOk();\n      },\n      submitCallback(){\n        this.$emit('ok');\n        this.visible = false;\n      },\n      handleCancel () {\n        this.close()\n      }\n    }\n  }\n</script>\n\n<style scoped>\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<#list subTables as sub>\n<#if sub.foreignRelationType=='1'>\n#segment#${sub.entityName}Form.vue\n<template>\n  <j-form-container :disabled=\"disabled\">\n    <a-form-model ref=\"form\" :model=\"model\" :rules=\"validatorRules\" slot=\"detail\">\n      <a-row>\n<#assign form_popup = false>\n<#list sub.colums as po>\n<#if po.isShow =='Y'>\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n        <a-col :xs=\"24\" :sm=\"12\">\n          <a-form-model-item label=\"${po.filedComment}\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" prop=\"${autoStringSuffixForModel(po)}\">\n\t<#if po.classType =='date'>\n            <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\"/>\n\t<#elseif po.classType =='datetime'>\n            <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" style=\"width: 100%\"/>\n\t<#elseif po.classType =='time'>\n             <j-time placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='popup'>\n\t      <#assign form_popup=true>\n            <j-popup\n              v-model=\"model.${po.fieldName}\"\n              field=\"${po.fieldName}\"\n              org-fields=\"${po.dictField}\"\n              dest-fields=\"${Format.underlineToHump(po.dictText)}\"\n              code=\"${po.dictTable}\"\n              :multi=\"${po.extendParams.popupMulti?c}\"\n              @input=\"popupCallback\"/>\n    <#elseif po.classType =='switch'>\n            <j-switch v-model=\"model.${po.fieldName}\" <#if po.dictField!= 'is_open'>:options=\"${po.dictField}\"</#if>></j-switch>\n\t<#elseif po.classType =='sel_depart'>\n            <j-select-depart v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if> />\n\t<#elseif po.classType =='sel_user'>\n            <j-select-user-by-dep v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='textarea'>\n            <a-textarea v-model=\"model.${autoStringSuffixForModel(po)}\" rows=\"4\" placeholder=\"请输入${po.filedComment}\"/>\n\t<#elseif po.classType=='list' || po.classType=='radio'>\n            <j-dict-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\"  dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\"/>\n\t<#elseif po.classType=='list_multi' || po.classType=='checkbox'>\n            <j-multi-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\"  dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\"/>\n\t<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n            <a-input-number v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" style=\"width: 100%\"/>\n\t<#elseif po.classType=='file'>\n            <j-upload v-model=\"model.${po.fieldName}\" ></j-upload>\n    <#elseif po.classType=='image'>\n            <j-image-upload isMultiple v-model=\"model.${po.fieldName}\"></j-image-upload>\n\t<#else>\n            <a-input v-model=\"model.${autoStringSuffixForModel(po)}\" placeholder=\"请输入${po.filedComment}\"></a-input>\n    </#if>\n          </a-form-model-item>\n        </a-col>\n</#if>\n</#list>    \n      </a-row>\n    </a-form-model>\n </j-form-container>\n</template>\n<script>\n  import { getAction } from '@/api/manage'\n  import { validateDuplicateValue } from '@/utils/util'\n  import { VALIDATE_NO_PASSED } from '@/utils/JEditableTableUtil'\n\n  export default {\n    name: '${sub.entityName}Form',\n    components: { \n    },\n    props:{\n      disabled: {\n        type: Boolean,\n        default: false,\n        required: false\n      }\n    },\n    data () {\n      return {\n        model:{\n        <#include \"/common/init/initValueSub.ftl\">\n        },\n        labelCol: {\n          xs: { span: 24 },\n          sm: { span: 5 },\n        },\n        wrapperCol: {\n          xs: { span: 24 },\n          sm: { span: 16 },\n        },\n        <#include \"/common/validatorRulesTemplate/sub.ftl\">\n        confirmLoading: false,\n      }\n    },\n    created () {\n    //备份model原始值\n      this.modelDefault = JSON.parse(JSON.stringify(this.model));\n    },\n    methods:{\n      initFormData(url,id){\n        this.clearFormData()\n        if(!id){\n          this.edit(this.modelDefault);\n        }else{\n          getAction(url,{id:id}).then(res=>{\n            if(res.success){\n              let records = res.result.records\n              if(records && records.length>0){\n                this.edit(records[0])\n              }\n            }\n          })\n        }\n      },\n      edit(record){\n        this.model = Object.assign({}, record)\n      },\n      getFormData(){\n        let formdata_arr = []\n         this.$refs.form.validate(valid => {\n          if (valid) {\n            let isNullObj = true\n            Object.keys(this.model).forEach(key=>{\n              if(this.model[key]){\n                isNullObj = false\n              }\n            })\n            if(!isNullObj){\n              formdata_arr.push(this.model)\n            }\n          }else{\n            this.$emit(\"validateError\",\"${sub.ftlDescription}表单校验未通过\");\n            return false\n          }\n        })\n        return formdata_arr;\n      },\n      validate(index){\n        return new Promise((resolve, reject) => {\n          // 验证主表表单\n         this.$refs.form.validate(valid => {\n            !valid ? reject({ error: VALIDATE_NO_PASSED ,index}) : resolve()\n          })\n        }).then(values => {\n          return Promise.resolve()\n        }).catch(error => {\n          return Promise.reject(error)\n        })\n\n      },\n      <#if form_popup>\n      popupCallback(value,row){\n        this.model = Object.assign(this.model, row);\n      },\n      </#if>\n      clearFormData(){\n        this.$refs.form.clearValidate()\n      }\n    \n    }\n  }\n</script>\n</#if>\n</#list>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue/subTables/[1-n]SubTable.vuei",
    "content": "<#--noinspection JSDuplicatedDeclaration-->\n<#list subTables as sub>\n#segment#${sub.entityName}SubTable.vue\n<template>\n  <a-table\n    rowKey=\"id\"\n    size=\"middle\"\n    bordered\n    :loading=\"loading\"\n    :columns=\"columns\"\n    :dataSource=\"dataSource\"\n    :pagination=\"false\"\n  >\n\n    <template slot=\"htmlSlot\" slot-scope=\"text\">\n      <div v-html=\"text\"></div>\n    </template>\n\n    <template slot=\"imgSlot\" slot-scope=\"text,record\">\n      <div style=\"font-size: 12px;font-style: italic;\">\n        <span v-if=\"!text\">无图片</span>\n        <img v-else :src=\"getImgView(text)\" :preview=\"record.id\" alt=\"\" style=\"max-width:80px;height:25px;\"/>\n      </div>\n    </template>\n\n    <template slot=\"fileSlot\" slot-scope=\"text\">\n      <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n      <a-button\n              v-else\n              ghost\n              type=\"primary\"\n              icon=\"download\"\n              size=\"small\"\n              @click=\"downloadFile(text)\"\n      >\n        <span>下载</span>\n      </a-button>\n    </template>\n\n  </a-table>\n</template>\n\n<script>\n  import { getAction } from '@api/manage'\n  import { JeecgListMixin } from '@/mixins/JeecgListMixin'\n\n  export default {\n    name: '${sub.entityName}SubTable',\n    mixins: [JeecgListMixin],\n    props: {\n      record: {\n        type: Object,\n        default: null,\n      }\n    },\n    data() {\n      return {\n        description: '${sub.ftlDescription}内嵌列表',\n        disableMixinCreated: true,\n        loading: false,\n        dataSource: [],\n        columns: [\n<#-- begin 遍历表头 -->\n<#list sub.originalColumns as po>\n  <#if po.isShowList == 'Y'>\n          {\n            title: '${po.filedComment}',\n            align: 'center',\n    <#if po.classType == 'date'>\n            dataIndex: '${po.fieldName}',\n     <#elseif po.fieldDbType=='Blob'>\n           dataIndex: '${po.fieldName}String'\n    <#elseif po.classType=='umeditor'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'htmlSlot'}\n    <#elseif po.classType=='file'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'fileSlot'}\n    <#elseif po.classType=='image'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'imgSlot'}\n    <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user'>\n            dataIndex: '${po.fieldName}_dictText'\n    <#elseif po.classType=='cat_tree'>\n      <#if list_need_category>\n            dataIndex: '${po.fieldName}',\n            customRender: (text) => (text ? filterMultiDictText(this.dictOptions['${po.fieldName}'], text) : '')\n      <#else>\n            dataIndex: '${po.fieldName}',\n            customRender: (text, record) => (text ? record['${po.dictText}'] : '')\n      </#if>\n      <#elseif po.classType=='switch'>\n            dataIndex: '${po.fieldName}',\n            <#if po.dictField != 'is_open'>\n            customRender: (text) => (!text ? \"\" : (text == ${po.dictField}[0] ? \"是\" : \"否\"))\n            <#else>\n            customRender: (text) => (!text ? \"\" : (text == \"Y\" ? \"是\" : \"否\"))\n            </#if>\n    <#else>\n            dataIndex: '${po.fieldName}',\n    </#if>\n          },\n  </#if>\n</#list>\n<#-- end 遍历表头 -->\n        ],\n<#assign urlPrefix=\"/${entityPackagePath}/${entityName?uncap_first}\">\n        url: {\n          listByMainId: '${urlPrefix}/query${sub.entityName}ByMainId',\n        },\n      }\n    },\n    watch: {\n      record: {\n        immediate: true,\n        handler() {\n          if (this.record != null) {\n            this.loadData(this.record)\n          }\n        }\n      }\n    },\n    methods: {\n\n      loadData(record) {\n        this.loading = true\n        this.dataSource = []\n        getAction(this.url.listByMainId, {\n          id: record.id\n        }).then((res) => {\n          if (res.success) {\n            this.dataSource = res.result.records\n          }\n        }).finally(() => {\n          this.loading = false\n        })\n      },\n\n    },\n  }\n</script>\n\n<style scoped>\n\n</style>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei",
    "content": "﻿<#-- ** 引入全局工具方法 ** -->\n<#include \"/common/utils.ftl\">\n<template>\n  <div>\n<#assign list_need_category=false>\n<#assign list_need_pca=false>\n<#assign bpm_flag=false>\n<#assign list_has_popup_dict=false>\n<#assign buttonList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n  <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n</#if>\n<#-- 开始循环 -->\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.classType=='cat_tree' && po.dictText?default(\"\")?trim?length == 0>\n<#assign list_need_category=true>\n</#if>\n<#if po.classType=='pca'>\n<#assign list_need_pca=true>\n</#if>\n<#if po.classType=='popup_dict'>\n<#assign list_has_popup_dict=true>\n</#if>\n</#list>\n<#-- 结束循环 -->\n    <!--引用表格-->\n   <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\" :expandedRowKeys=\"expandedRowKeys\"  @expand=\"handleExpand\">\n      <!-- 内嵌table区域 begin -->\n           <template #expandedRowRender=\"{record}\">\n             <a-tabs tabPosition=\"top\">\n   <#list subTables as sub>\n               <a-tab-pane tab=\"${sub.ftlDescription}\" key=\"${sub.entityName?uncap_first}\" forceRender>\n                  <${sub.entityName?uncap_first}SubTable v-if=\"expandedRowKeys.includes(record.id)\" :id=\"record.id\" />\n               </a-tab-pane>\n   </#list>\n             </a-tabs>\n           </template>\n     <!-- 内嵌table区域 end -->\n     <!--插槽:table标题-->\n      <template #tableTitle>\n          <a-button type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:add'\"  @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\"> 新增</a-button>\n          <a-button  type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:exportXls'\"  preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n          <j-upload-button  type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:importExcel'\"  preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n     <#if buttonList?size gt 0>\n      <#list buttonList as btn>\n         <#if btn.buttonStyle == 'button'>\n           <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n         </#if>\n       </#list>\n     </#if>\n          <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n              <template #overlay>\n                <a-menu>\n                  <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                    <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                    删除\n                  </a-menu-item>\n                </a-menu>\n              </template>\n              <a-button  v-auth=\"'${entityPackage}:${tableName}:deleteBatch'\">批量操作\n                <Icon icon=\"mdi:chevron-down\"></Icon>\n              </a-button>\n        </a-dropdown>\n        <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n        <!-- 高级查询 -->\n        <super-query :config=\"superQueryConfig\" @search=\"handleSuperQuery\" />\n        <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n      </template>\n       <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\"/>\n      </template>\n      <!--字段回显插槽-->\n      <template v-slot:bodyCell=\"{ column, record, index, text }\">\n      <#list columns as po>\n        <#if po.classType=='umeditor' || po.classType=='pca' || po.classType=='file'>\n        <template v-if=\"column.dataIndex==='${po.fieldName}'\">\n        <#if po.classType=='umeditor'>\n          <!--富文本件字段回显插槽-->\n          <div v-html=\"text\"></div>\n        </#if>\n        <#if po.classType=='pca'>\n          <!--省市区字段回显插槽-->\n          {{ getAreaTextByCode(text) }}\n        </#if>\n        <#if po.classType=='file'>\n          <!--文件字段回显插槽-->\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n          <a-button v-else :ghost=\"true\" type=\"primary\" preIcon=\"ant-design:download-outlined\" size=\"small\" @click=\"downloadFile(text)\">下载</a-button>\n        </#if>\n        </template>\n        </#if>\n      </#list>\n      </template>\n    </BasicTable>\n    <!-- 表单区域 -->\n    <${entityName}Modal @register=\"registerModal\" @success=\"handleSuccess\"></${entityName}Modal>\n    <#if bpm_flag==true>\n      <!-- 审批记录 -->\n      <BpmPictureModal @register=\"registerBpmModal\" />\n     </#if>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"${entityPackage}-${entityName?uncap_first}\" setup>\n  import {ref, reactive, computed, unref} from 'vue';\n  import {BasicTable, useTable, TableAction} from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage'\n  import {useModal} from '/@/components/Modal';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import ${entityName}Modal from './components/${entityName}Modal.vue'\n  <#list subTables as sub>\n  import ${sub.entityName}SubTable from './subTables/${sub.entityName}SubTable.vue'\n  </#list>\n  import {columns, searchFormSchema, superQuerySchema} from './${entityName}.data';\n  import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './${entityName}.api';\n  import {downloadFile} from '/@/utils/common/renderUtils';\n  <#if list_need_pca>\n  import { getAreaTextByCode } from '/@/components/Form/src/utils/Area';\n  </#if>\n  <#if list_need_category>\n  import { loadCategoryData } from '/@/api/common/api'\n  import { getAuthCache, setAuthCache } from '/@/utils/auth';\n  import { DB_DICT_DATA_KEY } from '/@/enums/cacheEnum';\n  </#if>\n  <#if bpm_flag==true>\n  import { startProcess } from '/@/api/common/api';\n\n  const [registerBpmModal, { openModal: bpmPicModal }] = useModal();\n  </#if>\n  <#if list_has_popup_dict>\n   import {getPopDictByCode} from \"@/utils/dict\";\n   import {filterMultiDictText} from \"@/utils/dict/JDictSelectUtil\";\n  </#if>\n  import { getDateByPicker } from '/@/utils';\n  //日期个性化选择\n  const fieldPickers = reactive({\n  <#list columns as po>\n    <#if po.extendParams?exists && po.extendParams.picker?exists>\n    ${po.fieldName}: '${po.extendParams.picker}',\n    </#if>\n  </#list>\n  });\n  import { useUserStore } from '/@/store/modules/user';\n  const queryParam = reactive<any>({});\n   // 展开key\n  const expandedRowKeys = ref<any[]>([]);\n  //注册model\n  const [registerModal, {openModal}] = useModal();\n  const { createMessage } = useMessage();\n  const userStore = useUserStore();\n   //注册table数据\n  const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({\n      tableProps:{\n           title: '${tableVo.ftlDescription}',\n           api: list,\n           columns,\n           canResize:true,\n           formConfig: {\n                //labelWidth: 120,\n                schemas: searchFormSchema,\n                autoSubmitOnEnter:true,\n                showAdvancedButton:true,\n                fieldMapToNumber: [\n                   <#list columns as po>\n                   <#if po.isQuery=='Y'>\n                   <#if po.queryMode=='group'>\n                   <#-- update-begin---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n                   <#if po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal' || po.classType=='time'>\n                   <#-- update-end---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n                   ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end']],\n                   </#if>\n                   </#if>\n                   </#if>\n                   </#list>\n                ],\n                fieldMapToTime: [\n                <#list columns as po>\n                <#if po.isQuery=='Y'>\n                <#if po.queryMode=='group'>\n                <#if po.classType=='date'>\n                   ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end'], 'YYYY-MM-DD'],\n                <#elseif po.classType=='datetime'>\n                   ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end'], 'YYYY-MM-DD HH:mm:ss'],\n                </#if>\n                </#if>\n                </#if>\n                </#list>\n                ],\n            },\n           actionColumn: {\n               width: 120,\n               fixed:'right'\n           },\n           beforeFetch: (params) => {\n              if (params && fieldPickers) {\n                for (let key in fieldPickers) {\n                  if (params[key]) {\n                    params[key] = getDateByPicker(params[key], fieldPickers[key]);\n                  }\n                }\n              }\n             return Object.assign(params, queryParam);\n           },\n           <#if list_has_popup_dict>\n           afterFetch: afterFetch\n           </#if>\n        },\n        exportConfig: {\n            name:\"${tableVo.ftlDescription}\",\n            url: getExportUrl,\n            params: queryParam,\n        },\n        importConfig: {\n            url: getImportUrl,\n            success: handleSuccess\n        },\n    })\n\n  const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext\n\n   <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n   // 高级查询配置\n   const superQueryConfig = reactive(superQuerySchema);\n\n   /**\n   * 高级查询事件\n   */\n   function handleSuperQuery(params) {\n     Object.keys(params).map((k) => {\n       queryParam[k] = params[k];\n     });\n     reload();\n   }\n   <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n\n   /**\n     * 展开事件\n     * */\n   function handleExpand(expanded, record){\n        expandedRowKeys.value=[];\n        if (expanded === true) {\n           expandedRowKeys.value.push(record.id)\n        }\n    }\n   /**\n    * 新增事件\n    */\n  function handleAdd() {\n     openModal(true, {\n       isUpdate: false,\n       showFooter: true,\n     });\n  }\n   /**\n    * 编辑事件\n    */\n  function handleEdit(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: true,\n     });\n   }\n   /**\n    * 详情\n   */\n  function handleDetail(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: false,\n     });\n   }\n   /**\n    * 删除事件\n    */\n  async function handleDelete(record) {\n     await deleteOne({id: record.id}, handleSuccess);\n   }\n   /**\n    * 批量删除事件\n    */\n  async function batchHandleDelete() {\n     await batchDelete({ids: selectedRowKeys.value},handleSuccess);\n   }\n   /**\n    * 成功回调\n    */\n  function handleSuccess() {\n      (selectedRowKeys.value = []) && reload();\n   }\n   /**\n      * 操作栏\n      */\n  function getTableAction(record){\n       return [\n         {\n           label: '编辑',\n           onClick: handleEdit.bind(null, record),\n           auth: '${entityPackage}:${tableName}:edit'\n         }\n       ]\n   }\n\n  <#if bpm_flag==true>\n  /**\n   * 提交流程\n   */\n  async function handleProcess(record) {\n    let params = {\n      flowCode: 'dev_${tableName}_001',\n      id: record.id,\n      formUrl: '${entityPackagePath}/components/${entityName}Form',\n      formUrlMobile: ''\n    }\n    await startProcess(params);\n    handleSuccess();\n  }\n  /**\n   * 审批进度\n   */\n  async function handlePreviewPic(record) {\n    bpmPicModal(true, {\n      flowCode: 'dev_${tableName}_001',\n      dataId: record.id,\n    });\n  }\n  </#if>\n\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record){\n    <#if bpm_flag==true>\n    let dropDownAction = [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      }, {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft'\n        },\n        auth: '${entityPackage}:${tableName}:delete'\n      },\n    {\n      label: '审批进度',\n      onClick: handlePreviewPic.bind(null, record),\n      ifShow: !!record.bpmStatus && record.bpmStatus !== '1',\n    }\n<#if buttonList?size gt 0>\n <#list buttonList as btn>\n    <#if btn.buttonStyle == 'link'>\n    ,{\n       label: '${btn.buttonName}',\n       onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n     }\n    </#if>\n </#list>\n</#if>\n    ];\n    if(record.bpmStatus == '1' || !record.bpmStatus){\n      dropDownAction.push({\n        label: '发起流程',\n        popConfirm: {\n          title: '确认提交流程吗？',\n          confirm: handleProcess.bind(null, record),\n          placement: 'topLeft',\n        }\n      })\n    }\n    return dropDownAction;\n    <#else>\n    return [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      }, {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft'\n        },\n        auth: '${entityPackage}:${tableName}:delete'\n      }\n  <#if buttonList?size gt 0>\n   <#list buttonList as btn>\n      <#if btn.buttonStyle == 'link'>\n      ,{\n         label: '${btn.buttonName}',\n         onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n       }\n      </#if>\n   </#list>\n  </#if>\n    ]\n    </#if>\n  }\n\n    <#if list_need_category>\n   /**\n    * 初始化字典配置\n   */\n    function initDictConfig(){\n     <#list columns as po>\n     <#if (po.isQuery=='Y' || po.isShowList=='Y') && po.classType!='popup'>\n       <#if po.classType=='cat_tree' && list_need_category==true>\n       loadCategoryData({code:'${po.dictField?default(\"\")}'}).then((res) => {\n         if (res) {\n            const allDictDate = userStore.getAllDictItems;\n            if(!allDictDate['${po.dictField?default(\"\")}']){\n              userStore.setAllDictItems({...allDictDate,'${po.dictField?default(\"\")}':res});\n            }\n         }\n       })\n       </#if>\n     </#if>\n     </#list>\n   }\n   initDictConfig();\n    </#if>\n\n    <#if list_has_popup_dict>\n   /**\n    * 翻译Popup字典配置\n   */\n    async function afterFetch(records){\n <#list columns as po>\n    <#if po.isQuery=='Y' || po.isShowList=='Y'>\n      <#if po.classType=='popup_dict' && list_has_popup_dict==true>\n      const ${po.fieldName}Keys = [...new Set(records.map((item) => item['${po.fieldName}']).flatMap((item) => item && item.split(',')))];\n      if(${po.fieldName}Keys && ${po.fieldName}Keys.length){\n       const dictOptions = await getPopDictByCode(${po.fieldName}Keys.join(','), '${po.dictTable},${po.dictField},${po.dictText}');\n       records.forEach((item) => {\n         item['${po.fieldName}_dictText'] = filterMultiDictText(dictOptions, item['${po.fieldName}']);\n       });\n      }\n      </#if>\n    </#if>\n </#list>\n     return records;\n   }\n    </#if>\n\n<#if buttonList?size gt 0>\n  <#list buttonList as btn>\n  <#if btn.buttonStyle=='button'>\n     function handle${btn.buttonCode?cap_first}(){\n        createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n     }\n  </#if>\n   <#if btn.buttonStyle=='link'>\n    function handle${btn.buttonCode?cap_first}(record){\n      createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n    }\n   </#if>\n  </#list>\n</#if>\n</script>\n\n<style lang=\"less\" scoped>\n<#include \"/common/form/vue3SearchStyle.ftl\">\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi",
    "content": "import {defHttp} from '/@/utils/http/axios';\nimport { useMessage } from \"/@/hooks/web/useMessage\";\n\nconst { createConfirm } = useMessage();\n\nenum Api {\n  list = '/${entityPackagePath}/${entityName?uncap_first}/list',\n  save='/${entityPackagePath}/${entityName?uncap_first}/add',\n  edit='/${entityPackagePath}/${entityName?uncap_first}/edit',\n  deleteOne = '/${entityPackagePath}/${entityName?uncap_first}/delete',\n  deleteBatch = '/${entityPackagePath}/${entityName?uncap_first}/deleteBatch',\n  importExcel = '/${entityPackagePath}/${entityName?uncap_first}/importExcel',\n  exportXls = '/${entityPackagePath}/${entityName?uncap_first}/exportXls',\n<#list subTables as sub><#rt/>\n  ${sub.entityName?uncap_first}List = '/${entityPackagePath}/${entityName?uncap_first}/query${sub.entityName}ByMainId',\n</#list>\n}\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n<#list subTables as sub><#rt/>\n/**\n * 子表单查询接口\n * @param params\n */\nexport const query${sub.entityName} = Api.${sub.entityName?uncap_first}List\n</#list>\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) =>\n  defHttp.get({url: Api.list, params});\n\n/**\n * 删除单个\n */\nexport const deleteOne = (params,handleSuccess) => {\n  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n/**\n * 批量删除\n * @param params\n */\nexport const batchDelete = (params, handleSuccess) => {\n  createConfirm({\n    iconType: 'warning',\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n/**\n * 保存或者更新\n * @param params\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({url: url, params});\n}\n<#list subTables as sub><#rt/>\n/**\n * 子表列表接口\n * @param params\n */\nexport const ${sub.entityName?uncap_first}List = (params) =>\n  defHttp.get({url: Api.${sub.entityName?uncap_first}List, params},{isTransformResponse:false});\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi",
    "content": "<#include \"/common/utils.ftl\">\nimport {BasicColumn} from '/@/components/Table';\nimport {FormSchema} from '/@/components/Table';\nimport { rules} from '/@/utils/helper/validator';\nimport { render } from '/@/utils/common/renderUtils';\nimport {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types'\nimport { getWeekMonthQuarterYear } from '/@/utils';\n//列表数据\nexport const columns: BasicColumn[] = [\n <#list columns as po>\n   <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n   <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   {\n    title: '${po.filedComment}',\n    align:\"center\",\n    <#if po.sort=='Y'>\n    sorter: true,\n   </#if>\n    <#if po.classType=='date'>\n    dataIndex: '${po.fieldName}',\n    customRender:({text}) =>{\n      text = !text ? \"\" : (text.length > 10 ? text.substr(0,10) : text);\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      if(text) {\n        return getWeekMonthQuarterYear(text)['${po.extendParams.picker}'];\n      } else {\n        return text;\n      }\n      <#else>\n      return text;\n      </#if>\n    },\n    <#elseif po.fieldDbType=='Blob'>\n    dataIndex: '${po.fieldName}String'\n    <#elseif po.classType=='umeditor'>\n    dataIndex: '${po.fieldName}',\n    <#elseif po.classType=='pca'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='file'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='image'>\n    dataIndex: '${po.fieldName}',\n    customRender:render.renderImage,\n   <#elseif po.classType=='switch'>\n    dataIndex: '${po.fieldName}',\n<#assign switch_extend_arr=['Y','N']>\n<#if po.dictField?default(\"\")?contains(\"[\")>\n<#assign switch_extend_arr=po.dictField?eval>\n</#if>\n<#list switch_extend_arr as a>\n<#if a_index == 0>\n<#assign switch_extend_arr1=a>\n<#else>\n<#assign switch_extend_arr2=a>\n</#if>\n</#list>\n    customRender:({text}) => {\n       return  render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}])\n     },\n   <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict' || po.classType=='link_table'>\n    dataIndex: '${po.fieldName}_dictText'\n   <#elseif po.classType=='cat_tree'>\n    dataIndex: '${po.fieldName}',\n    <#if po.dictText?default(\"\")?trim?length == 0>\n    customRender:({text}) => {\n       return  render.renderCategoryTree(text,'${po.dictField?default(\"\")}')\n   },\n   <#else>\n    customRender: ({text, record}) => (text ? record['${po.dictText}'] : '')\n   </#if>\n   <#else>\n    dataIndex: '${po.fieldName}'\n   </#if>\n   },\n   </#if>\n </#list>\n];\n//查询数据\nexport const searchFormSchema: FormSchema[] = [\n<#-- 开始循环 -->\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if po.isQuery=='Y' && po.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#assign query_flag=true>\n\t<#assign query_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n\t    <#assign query_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n    <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign query_field_dictCode=\"${po.dictField}\">\n    </#if>\n<#if po.queryMode=='single'>\n\t{\n      label: \"${po.filedComment}\",\n      field: ${autoStringSuffix(po)},\n<#if po.classType=='sel_search'>\n      component: 'JSearchSelect',\n      componentProps:{\n         dict:\"${query_field_dictCode}\"\n      },\n<#elseif po.classType=='sel_user'>\n<#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n      component: 'JSelectUser',\n<#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n     componentProps:{\n   <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   </#if>\n   <#if po.extendParams?exists && po.extendParams.store?exists>\n       rowKey: '${po.extendParams.store}',\n   </#if>\n     },\n<#elseif po.classType=='switch'>\n      component: 'JSwitch',\n      componentProps:{\n           query:true,\n           <#if po.dictField != 'is_open'>\n           options:${po.dictField}\n           </#if>\n       },\n <#elseif po.classType=='sel_depart'>\n      component: 'JSelectDept',\n      componentProps:{\n   <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   </#if>\n   <#if po.extendParams?exists && po.extendParams.store?exists>\n       rowKey: '${po.extendParams.store}',\n   </#if>\n      },\n <#elseif po.classType=='list_multi'>\n      component: 'JSelectMultiple',\n       componentProps:{\n      <#if po.dictTable?default(\"\")?trim?length gt 1>\n         dictCode:\"${po.dictTable},${po.dictText},${po.dictField}\",\n      <#elseif po.dictField?default(\"\")?trim?length gt 1>\n         dictCode:\"${po.dictField}\",\n      </#if>\n         triggerChange: true\n      },\n <#elseif po.classType=='cat_tree'>\n      component: 'JCategorySelect',\n      componentProps:{\n          pcode:\"${po.dictField?default(\"\")}\",//back和事件未添加，暂时有问题\n      },\n<#elseif po.classType=='date'>\n      component: 'DatePicker',\n      componentProps: {\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        picker: '${po.extendParams.picker}',\n        </#if>\n        valueFormat: 'YYYY-MM-DD'\n      },      \n<#elseif po.classType=='datetime'>\n      component: 'DatePicker',\n      componentProps: {\n         showTime:true,\n         valueFormat: 'YYYY-MM-DD HH:mm:ss'\n       },\n<#elseif po.classType=='pca'>\n      component: 'JAreaLinkage',\n      componentProps: {\n        saveCode: 'region',\n      },\n<#elseif po.classType=='popup'>\n    <#include \"/common/form/vue3popup.ftl\">\n<#elseif po.classType=='popup_dict'>\n      component: 'JPopupDict',\n      componentProps: {\n        placeholder: '请选择${po.filedComment}',\n        dictCode: '${po.dictTable},${po.dictText},${po.dictField}',\n        multi: ${po.extendParams.popupMulti?c}\n      },\n<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>\n<#--  ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->\n      component: 'JSelectMultiple',\n      componentProps:{\n       <#if po.dictTable?default(\"\")?trim?length gt 1>\n          dictCode:\"${po.dictTable},${po.dictText},${po.dictField}\"\n       <#elseif po.dictField?default(\"\")?trim?length gt 1>\n          dictCode:\"${po.dictField}\"\n        </#if>\n      },\n<#elseif po.classType == 'sel_tree'>\n      component: 'JTreeSelect',\n      componentProps:{\n          <#if po.dictText??>\n          <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n          dict:\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\",\n          <#elseif po.dictText?split(',')[1]??>\n          pidField:\"${po.dictText?split(',')[1]}\",\n          <#elseif po.dictText?split(',')[3]??>\n          hasChildField:\"${po.dictText?split(',')[3]}\",\n          </#if>\n          </#if>\n          pidValue:\"${po.dictField}\",\n      },\n<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n      component: 'InputNumber',\n<#else>\n      component: 'Input',\n</#if>\n      //colProps: {span: 6},\n \t},\n<#elseif po.queryMode=='like'>\n  {\n    label: \"${po.filedComment}\",\n    field: \"${po.fieldName}\",\n    component: 'JInput',\n  },\n<#else>\n     {\n      label: \"${po.filedComment}\",\n      field: \"${po.fieldName}\",\n<#if po.classType=='date'>\n      component: 'RangePicker',\n      componentProps: {\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        picker: '${po.extendParams.picker}',\n        </#if>\n        valueType: 'Date',\n      },\n<#elseif po.classType=='datetime'>\n      component: 'RangePicker',\n      componentProps: {\n          valueType: 'Date',\n          showTime:true\n      },\n<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n      component: 'JRangeNumber',\n<#-- update-begin---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n<#elseif po.classType=='time'>\n      component: 'RangeTime',\n<#-- update-end---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n<#else>\n      component: 'Input', //TODO 范围查询\n</#if>\n      //colProps: {span: 6},\n\t},\n</#if>\n</#if>\n</#list>\n<#-- 结束循环 -->\n];\n//表单数据\nexport const formSchema: FormSchema[] = [\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign bpm_flag=false>\n<#assign id_exists = false>\n<#list columns as po><#rt/>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.fieldDbName == 'id'>\n\t<#assign id_exists = true>\n</#if>\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if po.isShow =='Y' && po.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n  {\n    label: '${po.filedComment}',\n    field: ${autoStringSuffix(po)},\n<#-- update-begin-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n  <#if po.defaultVal??>\n    <#if po.fieldDbType==\"BigDecimal\" || po.fieldDbType==\"double\" || po.fieldDbType==\"int\">\n    defaultValue: ${po.defaultVal},\n    <#else>\n    defaultValue: \"${po.defaultVal}\",\n    </#if>\n  </#if>\n<#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n    <#if po.classType =='date'>\n    component: 'DatePicker',\n    componentProps: {\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        picker: '${po.extendParams.picker}',\n        </#if>\n      valueFormat: 'YYYY-MM-DD'\n    },\n     <#elseif po.classType =='datetime'>\n    component: 'DatePicker',\n    componentProps: {\n       showTime:true,\n       valueFormat: 'YYYY-MM-DD HH:mm:ss'\n     },\n     <#elseif po.classType =='time'>\n    component: 'TimePicker',\n    componentProps: {\n      valueFormat: 'HH:mm:ss'\n    },\n    <#elseif po.classType =='popup'>\n    <#include \"/common/form/vue3popup.ftl\">\n    <#elseif po.classType=='popup_dict'>\n    component: 'JPopupDict',\n    componentProps: {\n      placeholder: '请选择${po.filedComment}',\n      dictCode: '${po.dictTable},${po.dictText},${po.dictField}',\n      multi: ${po.extendParams.popupMulti?c}\n    },\n    <#elseif po.classType =='sel_depart'>\n     component: 'JSelectDept',\n     componentProps:{\n   <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   </#if>\n   <#if po.extendParams?exists && po.extendParams.store?exists>\n       rowKey: '${po.extendParams.store}',\n   </#if>\n     },\n     <#elseif po.classType =='switch'>\n     component: 'JSwitch',\n     componentProps:{\n         <#if po.dictField != 'is_open'>\n         options:${po.dictField}\n         </#if>\n     },\n     <#elseif po.classType =='pca'>\n    component: 'JAreaLinkage',\n    componentProps: {\n      saveCode: 'region',\n    },\n    <#elseif po.classType =='markdown'>\n    component: 'JMarkdownEditor',//注意string转换问题\n     <#elseif po.classType =='password'>\n    component: 'InputPassword',\n     <#elseif po.classType =='sel_user'>\n<#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n    component: 'JSelectUser',\n<#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n     componentProps:{\n   <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   </#if>\n   <#if po.extendParams?exists && po.extendParams.store?exists>\n       rowKey: '${po.extendParams.store}',\n   </#if>\n     },\n    <#elseif po.classType =='textarea'>\n    component: 'InputTextArea',\n    <#elseif po.classType=='list'>\n    component: 'JDictSelectTag',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\",\n     <#if po.fieldDbType=='int'>\n        stringToNumber: true\n     </#if>\n     },\n    <#elseif po.classType=='radio'>\n    component: 'JDictSelectTag',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\",\n        type: \"radio\",\n     <#if po.fieldDbType=='int'>\n        stringToNumber: true\n     </#if>\n     },\n     <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- -->\n    <#elseif po.classType=='list_multi'>\n    component: 'JSelectMultiple',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n    <#elseif po.classType=='checkbox'>\n    component: 'JCheckbox',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n     <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- -->\n    <#elseif po.classType=='sel_search'>\n    component: 'JSearchSelect',\n    componentProps:{\n       dict:\"${form_field_dictCode}\"\n    },\n<#elseif po.classType=='cat_tree'>\n    <#assign form_cat_tree = true>\n    component: 'JCategorySelect',\n    componentProps:{\n       pcode:\"${po.dictField?default(\"\")}\", //TODO back和事件未添加，暂时有问题\n    },\n    <#if po.dictText?default(\"\")?trim?length gt 1>\n    <#assign form_cat_back = \"${po.dictText}\">\n    </#if>\n    <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n    component: 'InputNumber',\n    <#elseif po.classType=='file'>\n    component: 'JUpload',\n    componentProps:{\n    <#if po.uploadnum??>\n       maxCount:${po.uploadnum}\n   </#if>\n     },\n <#elseif po.classType=='image'>\n     component: 'JImageUpload',\n     componentProps:{\n     <#if po.uploadnum??>\n        fileMax:${po.uploadnum}\n     <#else>\n        fileMax: 0\n     </#if>\n      },\n  <#elseif po.classType=='umeditor'>\n    component: 'JEditor',\n  <#elseif po.classType == 'sel_tree'>\n    component: 'JTreeSelect',\n    componentProps:{\n        <#if po.dictText??>\n        <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n        dict:\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\",\n        <#elseif po.dictText?split(',')[1]??>\n        pidField:\"${po.dictText?split(',')[1]}\",\n        <#elseif po.dictText?split(',')[3]??>\n        hasChildField:\"${po.dictText?split(',')[3]}\",\n        </#if>\n        </#if>\n        pidValue:\"${po.dictField}\",\n    },\n<#elseif po.classType=='link_table'>\n  component: 'JLinkTableCard',\n  componentProps: {\n    valueField: '${po.dictField}',\n    textField: '${po.dictText}',\n    tableName: '${po.dictTable}',\n    multi: <#if (po.queryMode!\"\") == \"multi\">true<#else>false</#if>\n  },\n   <#else>\n    component: 'Input',\n    </#if>\n     <#include \"/common/utils.ftl\">\n    <#if po.isShow == 'Y' && poHasCheck(po)>\n    dynamicRules: ({model,schema}) => {\n    <#if po.fieldName != 'id'>\n    <#assign fieldValidType = po.fieldValidType!''>\n          return [\n            <#-- 非空校验 -->\n           <#if po.nullable == 'N' || fieldValidType == '*'>\n                 { required: true, message: '请输入${po.filedComment}!'},\n           <#elseif fieldValidType!=''>\n                 { required: false},\n           </#if>\n       <#-- 唯一校验 -->\n           <#if fieldValidType == 'only'>\n                 {...rules.duplicateCheckRule(<#if sub?default(\"\")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'</#if>, '${po.fieldDbName}',model,schema)[0]},\n           <#-- 6到16位数字 -->\n           <#elseif fieldValidType == 'n6-16'>\n                 { pattern: /^\\d{6,16}$|^(?=\\d+\\.\\d+)[\\d.]{7,17}$/, message: '请输入6到16位数字!'},\n           <#-- 6到16位任意字符 -->\n           <#elseif fieldValidType == '*6-16'>\n                 { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},\n           <#-- 6到18位字母 -->\n           <#elseif fieldValidType == 's6-18'>\n                 { pattern:/^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},\n           <#-- 网址 -->\n           <#elseif fieldValidType == 'url'>\n                 { pattern: /^((ht|f)tps?):\\/\\/[\\w\\-]+(\\.[\\w\\-]+)+([\\w\\-.,@?^=%&:\\/~+#]*[\\w\\-@?^=%&\\/~+#])?$/, message: '请输入正确的网址!'},\n           <#-- 电子邮件 -->\n           <#elseif fieldValidType == 'e'>\n                 { pattern: /^([\\w]+\\.*)([\\w]+)@[\\w]+\\.\\w{3}(\\.\\w{2}|)$/, message: '请输入正确的电子邮件!'},\n           <#-- 手机号码 -->\n           <#elseif fieldValidType == 'm'>\n                 { pattern: /^1[3456789]\\d{9}$/, message: '请输入正确的手机号码!'},\n           <#-- 邮政编码 -->\n           <#elseif fieldValidType == 'p'>\n                 { pattern: /^[0-9]\\d{5}$/, message: '请输入正确的邮政编码!'},\n           <#-- 字母 -->\n           <#elseif fieldValidType == 's'>\n                 { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},\n           <#-- 数字 -->\n           <#elseif fieldValidType == 'n'>\n                 { pattern: /^-?\\d+\\.?\\d*$/, message: '请输入数字!'},\n           <#-- 整数 -->\n           <#elseif fieldValidType == 'z'>\n                 { pattern: /^-?\\d+$/, message: '请输入整数!'},\n           <#-- 金额 -->\n           <#elseif fieldValidType == 'money'>\n                 { pattern: /^(([1-9][0-9]*)|([0]\\.\\d{0,2}|[1-9][0-9]*\\.\\d{0,2}))$/, message: '请输入正确的金额!'},\n           <#-- 正则校验 -->\n           <#elseif fieldValidType != '' && fieldValidType != '*'>\n                 { pattern: '${fieldValidType}', message: '不符合校验规则!'},\n           <#-- 无校验 -->\n           <#else>\n               <#t>\n           </#if>\n          ];\n     </#if>\n     },\n    </#if>\n    <#if po.readonly=='Y'>\n    dynamicDisabled:true\n    </#if>\n  },\n</#if>\n</#list>\n<#if id_exists == false>\n\t// TODO 主键隐藏字段，目前写死为ID\n\t{\n\t  label: '',\n\t  field: 'id',\n\t  component: 'Input',\n\t  show: false\n\t},\n</#if>\n];\n//子表单数据\n<#list subTables as sub>\n//子表列表数据\nexport const ${sub.entityName?uncap_first}Columns: BasicColumn[] = [\n <#list sub.originalColumns as po>\n   <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n   <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   {\n    title: '${po.filedComment}',\n    align:\"center\",\n    <#if po.sort=='Y'>\n    sorter: true,\n   </#if>\n    <#if po.classType=='date'>\n    dataIndex: '${po.fieldName}',\n    customRender:({text}) =>{\n      return !text?\"\":(text.length>10?text.substr(0,10):text)\n    },\n    <#elseif po.fieldDbType=='Blob'>\n    dataIndex: '${po.fieldName}String'\n    <#elseif po.classType=='umeditor'>\n    dataIndex: '${po.fieldName}',\n    <#elseif po.classType=='pca'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='file'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='image'>\n    dataIndex: '${po.fieldName}',\n    customRender:render.renderImage,\n   <#elseif po.classType=='switch'>\n    dataIndex: '${po.fieldName}',\n<#assign switch_extend_arr=['Y','N']>\n<#if po.dictField?default(\"\")?contains(\"[\")>\n<#assign switch_extend_arr=po.dictField?eval>\n</#if>\n<#list switch_extend_arr as a>\n<#if a_index == 0>\n<#assign switch_extend_arr1=a>\n<#else>\n<#assign switch_extend_arr2=a>\n</#if>\n</#list>\n    customRender:({text}) => {\n       return  render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}])\n     },\n   <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict' || po.classType=='link_table'>\n    dataIndex: '${po.fieldName}_dictText'\n   <#elseif po.classType=='cat_tree'>\n    dataIndex: '${po.fieldName}',\n    <#if po.dictText?default(\"\")?trim?length == 0>\n    customRender:({text}) => {\n       return  render.renderCategoryTree(text,'${po.dictField?default(\"\")}')\n   },\n   <#else>\n    customRender: ({text, record}) => (text ? record['${po.dictText}'] : '')\n   </#if>\n   <#else>\n    dataIndex: '${po.fieldName}'\n   </#if>\n   },\n   </#if>\n </#list>\n];\n<#if sub.foreignRelationType =='1'>\nexport const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign bpm_flag=false>\n<#assign sub_id_exists=false>\n<#list sub.colums as po><#rt/>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.fieldDbName=='id'>\n  <#assign sub_id_exists=true>\n</#if>\n<#if po.isShow =='Y'>\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n  {\n    label: '${po.filedComment}',\n    field: ${autoStringSuffix(po)},\n<#-- update-begin-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n  <#if po.defaultVal??>\n    <#if po.fieldDbType==\"BigDecimal\" || po.fieldDbType==\"double\" || po.fieldDbType==\"int\">\n    defaultValue: ${po.defaultVal},\n    <#else>\n    defaultValue: \"${po.defaultVal}\",\n    </#if>\n  </#if>\n<#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n    <#if po.classType =='date'>\n    component: 'DatePicker',\n    componentProps: {\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      picker: '${po.extendParams.picker}',\n      </#if>\n      valueFormat: 'YYYY-MM-DD'\n    },    \n     <#elseif po.classType =='datetime'>\n    component: 'DatePicker',\n    componentProps: {\n       showTime:true,\n       valueFormat: 'YYYY-MM-DD HH:mm:ss'\n     },\n     <#elseif po.classType =='time'>\n    component: 'TimePicker',\n    componentProps: {\n      valueFormat: 'HH:mm:ss'\n    },\n    <#elseif po.classType =='popup'>\n    <#include \"/common/form/vue3popup.ftl\">\n    <#elseif po.classType=='popup_dict'>\n    component: 'JPopupDict',\n    componentProps: {\n      placeholder: '请选择${po.filedComment}',\n      dictCode: '${po.dictTable},${po.dictText},${po.dictField}',\n      multi: ${po.extendParams.popupMulti?c}\n    },\n     <#elseif po.classType =='sel_depart'>\n     component: 'JSelectDept',\n     componentProps:{\n   <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   </#if>\n   <#if po.extendParams?exists && po.extendParams.store?exists>\n       rowKey: '${po.extendParams.store}',\n   </#if>\n     },\n     <#elseif po.classType =='switch'>\n     component: 'JSwitch',\n     componentProps:{\n         <#if po.dictField != 'is_open'>\n         options:${po.dictField}\n         </#if>\n     },\n     <#elseif po.classType =='pca'>\n    component: 'JAreaLinkage',\n    componentProps: {\n      saveCode: 'region',\n    },\n    <#elseif po.classType =='markdown'>\n    component: 'JMarkdownEditor',//注意string转换问题\n     <#elseif po.classType =='password'>\n    component: 'InputPassword',\n     <#elseif po.classType =='sel_user'>\n<#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n    component: 'JSelectUser',\n<#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n     componentProps:{\n   <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   </#if>\n   <#if po.extendParams?exists && po.extendParams.store?exists>\n       rowKey: '${po.extendParams.store}',\n   </#if>\n     },\n    <#elseif po.classType =='textarea'>\n    component: 'InputTextArea',\n    <#elseif po.classType=='list'>\n    component: 'JDictSelectTag',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\",\n     <#if po.fieldDbType=='int'>\n        stringToNumber: true\n     </#if>\n     },\n    <#elseif po.classType=='radio'>\n    component: 'JDictSelectTag',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\",\n        type: \"radio\",\n     <#if po.fieldDbType=='int'>\n        stringToNumber: true\n     </#if>\n     },\n     <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- -->\n    <#elseif po.classType=='list_multi'>\n    component: 'JSelectMultiple',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n    <#elseif po.classType=='checkbox'>\n    component: 'JCheckbox',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n     <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- -->\n    <#elseif po.classType=='sel_search'>\n    component: 'JSearchSelect',\n    componentProps:{\n       dict:\"${form_field_dictCode}\"\n    },\n<#elseif po.classType=='cat_tree'>\n    <#assign form_cat_tree = true>\n    component: 'JCategorySelect',\n    componentProps:{\n       pcode:\"${po.dictField?default(\"\")}\", //TODO back和事件未添加，暂时有问题\n    },\n    <#if po.dictText?default(\"\")?trim?length gt 1>\n    <#assign form_cat_back = \"${po.dictText}\">\n    </#if>\n    <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n    component: 'InputNumber',\n    <#elseif po.classType=='file'>\n    component: 'JUpload',\n    componentProps:{\n    <#if po.uploadnum??>\n       maxCount:${po.uploadnum}\n   </#if>\n     },\n <#elseif po.classType=='image'>\n     component: 'JImageUpload',\n     componentProps:{\n     <#if po.uploadnum??>\n        fileMax:${po.uploadnum}\n     <#else>\n        fileMax: 0\n     </#if>\n    },\n  <#elseif po.classType=='umeditor'>\n    component: 'JEditor',\n  <#elseif po.classType == 'sel_tree'>\n    component: 'JTreeSelect',\n    componentProps:{\n        <#if po.dictText??>\n        <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n        dict:\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\",\n        <#elseif po.dictText?split(',')[1]??>\n        pidField:\"${po.dictText?split(',')[1]}\",\n        <#elseif po.dictText?split(',')[3]??>\n        hasChildField:\"${po.dictText?split(',')[3]}\",\n        </#if>\n        </#if>\n        pidValue:\"${po.dictField}\",\n    },\n<#elseif po.classType=='link_table'>\n    component: 'JLinkTableCard',\n    componentProps: {\n        valueField: '${po.dictField}',\n        textField: '${po.dictText}',\n        tableName: '${po.dictTable}',\n        multi: <#if (po.queryMode!\"\") == \"multi\">true<#else>false</#if>\n    },\n   <#else>\n    component: 'Input',\n    </#if>\n     <#include \"/common/utils.ftl\">\n    <#if po.isShow == 'Y' && poHasCheck(po)>\n    dynamicRules: ({model,schema}) => {\n    <#if po.fieldName != 'id'>\n    <#assign fieldValidType = po.fieldValidType!''>\n          return [\n            <#-- 非空校验 -->\n           <#if po.nullable == 'N' || fieldValidType == '*'>\n                 { required: true, message: '请输入${po.filedComment}!'},\n           <#elseif fieldValidType!=''>\n                 { required: false},\n           </#if>\n       <#-- 唯一校验 -->\n           <#if fieldValidType == 'only'>\n                 {...rules.duplicateCheckRule(<#if sub?default(\"\")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'</#if>, '${po.fieldDbName}',model,schema)[0]},\n           <#-- 6到16位数字 -->\n           <#elseif fieldValidType == 'n6-16'>\n                 { pattern: /^\\d{6,16}$|^(?=\\d+\\.\\d+)[\\d.]{7,17}$/, message: '请输入6到16位数字!'},\n           <#-- 6到16位任意字符 -->\n           <#elseif fieldValidType == '*6-16'>\n                 { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},\n           <#-- 6到18位字母 -->\n           <#elseif fieldValidType == 's6-18'>\n                 { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},\n           <#-- 网址 -->\n           <#elseif fieldValidType == 'url'>\n                 { pattern: /^((ht|f)tps?):\\/\\/[\\w\\-]+(\\.[\\w\\-]+)+([\\w\\-.,@?^=%&:\\/~+#]*[\\w\\-@?^=%&\\/~+#])?$/, message: '请输入正确的网址!'},\n           <#-- 电子邮件 -->\n           <#elseif fieldValidType == 'e'>\n                 { pattern: /^([\\w]+\\.*)([\\w]+)@[\\w]+\\.\\w{3}(\\.\\w{2}|)$/, message: '请输入正确的电子邮件!'},\n           <#-- 手机号码 -->\n           <#elseif fieldValidType == 'm'>\n                 { pattern: /^1[3456789]\\d{9}$/, message: '请输入正确的手机号码!'},\n           <#-- 邮政编码 -->\n           <#elseif fieldValidType == 'p'>\n                 { pattern: /^[0-9]\\d{5}$/, message: '请输入正确的邮政编码!'},\n           <#-- 字母 -->\n           <#elseif fieldValidType == 's'>\n                 { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},\n           <#-- 数字 -->\n           <#elseif fieldValidType == 'n'>\n                 { pattern: /^-?\\d+\\.?\\d*$/, message: '请输入数字!'},\n           <#-- 整数 -->\n           <#elseif fieldValidType == 'z'>\n                 { pattern: /^-?\\d+$/, message: '请输入整数!'},\n           <#-- 金额 -->\n           <#elseif fieldValidType == 'money'>\n                 { pattern: /^(([1-9][0-9]*)|([0]\\.\\d{0,2}|[1-9][0-9]*\\.\\d{0,2}))$/, message: '请输入正确的金额!'},\n           <#-- 正则校验 -->\n           <#elseif fieldValidType != '' && fieldValidType != '*'>\n                 { pattern: '${fieldValidType}', message: '不符合校验规则!'},\n           <#-- 无校验 -->\n           <#else>\n               <#t>\n           </#if>\n          ];\n     </#if>\n     },\n    </#if>\n    <#if po.readonly=='Y'>\n    dynamicDisabled:true\n    </#if>\n  },\n</#if>\n</#list>\n<#if sub_id_exists == false>\n\t{\n\t  label: '',\n\t  field: 'id',\n\t  component: 'Input',\n\t  show: false\n\t},\n</#if>\n];\n</#if>\n</#list>\n//子表表格配置\n<#list subTables as sub>\n<#if sub.foreignRelationType =='0'>\nexport const ${sub.entityName?uncap_first}JVxeColumns: JVxeColumn[] = [\n<#assign popupBackFields = \"\">\n\n<#-- 循环子表的列 开始 -->\n<#list sub.colums as col><#rt/>\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if col.isShow =='Y' && col.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if col.filedComment !='外键' >\n    {\n      title: '${col.filedComment}',\n      key: '${autoStringSuffixForModel(col)}',\n<#if col.classType =='date'>\n      type: JVxeTypes.date,\n      <#if col.extendParams?exists && col.extendParams.picker?exists>\n      picker: '${col.extendParams.picker}',\n      </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='datetime'>\n      type: JVxeTypes.datetime,\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='time'>\n      type: JVxeTypes.time,\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='textarea'>\n      type: JVxeTypes.textarea,\n       <#if col.readonly=='Y'>\n      disabled:true,\n       </#if>\n<#elseif col.classType =='list' || col.classType =='radio'>\n      type: JVxeTypes.select,\n      options:[],\n      <#if col.dictTable?default(\"\")?trim?length gt 1>\n      dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n      <#else>\n      dictCode:\"${col.dictField}\",\n      </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='list_multi' || col.classType =='checkbox'>\n      type: JVxeTypes.selectMultiple,\n      options:[],\n      <#if col.dictTable?default(\"\")?trim?length gt 1>\n      dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n      <#else>\n      dictCode:\"${col.dictField}\",\n      </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='sel_search'>\n      type: JVxeTypes.selectSearch,\n      <#if col.dictTable?default(\"\")?trim?length gt 1>\n      dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n      <#else>\n      dictCode:\"${col.dictField}\",\n      </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='sel_depart'>\n      type: JVxeTypes.departSelect,\n      props:{\n    <#if col.extendParams?exists && col.extendParams.text?exists>\n        labelKey: '${col.extendParams.text}',\n    </#if>\n    <#if col.extendParams?exists && col.extendParams.store?exists>\n        rowKey: '${col.extendParams.store}',\n    </#if>\n      },\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='sel_user'>\n      type: JVxeTypes.userSelect,\n      props:{\n    <#if col.extendParams?exists && col.extendParams.text?exists>\n        labelKey: '${col.extendParams.text}',\n    </#if>\n    <#if col.extendParams?exists && col.extendParams.store?exists>\n        rowKey: '${col.extendParams.store}',\n    </#if>\n      },\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='image'>\n      type: JVxeTypes.image,\n      token:true,\n      responseName:\"message\",\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n      <#if col.uploadnum??>\n      number: ${col.uploadnum},\n      </#if>\n<#elseif col.classType =='file'>\n      type: JVxeTypes.file,\n      token:true,\n      responseName:\"message\",\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n      <#if col.uploadnum??>\n      number: ${col.uploadnum},\n      </#if>\n<#elseif col.classType =='switch'>\n      type: JVxeTypes.checkbox,\n       <#if col.dictField == 'is_open'>\n      customValue: ['Y', 'N'],\n        <#else>\n      customValue: ${col.dictField},\n        </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType=='pca'>\n      type: JVxeTypes.pca,\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='popup'>\n<#if popupBackFields?length gt 0>\n    <#assign popupBackFields = \"${popupBackFields}\"+\",\"+\"${col.dictText}\">\n<#else>\n    <#assign popupBackFields = \"${col.dictText}\">\n</#if>\n    <#include \"/common/form/vue3Jvxepopup.ftl\">\n<#-- update-begin-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对，数字或者金额类型 -->\n<#-- elseif \"int,decimal,double,\"?contains(col.classType) -->\n<#elseif col.fieldDbType=='int' || col.fieldDbType=='long' || col.fieldDbType=='double' || col.fieldDbType=='BigDecimal'>\n<#-- update-end-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对，数字或者金额类型 -->\n      type: JVxeTypes.inputNumber,\n    <#if col.readonly=='Y'>\n      disabled:true,\n    </#if>\n<#else>\n      type: JVxeTypes.input,\n       <#if col.readonly=='Y'>\n      disabled:true,\n       </#if>\n</#if>\n<#if col.classType =='list_multi' || col.classType =='checkbox'>\n      width:\"250px\",\n<#else>\n      width:\"200px\",\n</#if>\n<#if col.classType =='file'>\n      placeholder: '请选择文件',\n<#else>\n      placeholder: '请输入${'$'}{title}',\n</#if>\n<#if col.defaultVal??>\n<#if col.fieldDbType==\"BigDecimal\" || col.fieldDbType==\"double\" || col.fieldDbType==\"int\">\n      defaultValue:${col.defaultVal},\n      <#else>\n      defaultValue:\"${col.defaultVal}\",\n</#if>\n<#else>\n      defaultValue:'',\n</#if>\n<#-- 子表的校验 -->\n <#include \"/common/validatorRulesTemplate/sub-vue3.ftl\">\n    },\n</#if>\n</#if>\n</#list>\n<#-- 循环子表的列 结束 -->\n  ]\n</#if>\n</#list>\n\n<#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n// 高级查询数据\nexport const superQuerySchema = {\n  <#list columns as po>\n  <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n  <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  ${superQueryFieldListForVue3(po,po_index)},\n  </#if>\n  </#list>\n  //子表高级查询\n  <#list subTables as sub>\n  ${sub.entityName?uncap_first}: {\n    title: '${sub.ftlDescription}',\n    view: 'table',\n    fields: {\n      <#list sub.colums as subCol>\n        <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n        <#if subCol.isShowList =='Y' && subCol.fieldName !='id' && subCol.fieldName !='delFlag'>\n        <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n        ${superQueryFieldListForVue3(subCol,subCol_index)},\n        </#if>\n      </#list>\n    }\n  },\n  </#list>\n};\n<#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n\n/**\n* 流程表单调用这个方法获取formSchema\n* @param param\n*/\nexport function getBpmFormSchema(_formData): FormSchema[]{\n  // 默认和原始表单保持一致 如果流程中配置了权限数据，这里需要单独处理formSchema\n  return formSchema;\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql",
    "content": "<#include \"/common/sql/menu_insert.ftl\">"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n  <div>\n    <BasicForm @register=\"registerForm\" ref=\"formRef\"/>\n  <!-- 子表单区域 -->\n    <a-tabs v-model:activeKey=\"activeKey\" animated @change=\"handleChangeTabs\">\n<#list subTables as sub><#rt/>\n  <#assign refKey = sub.entityName?uncap_first/>\n  <#if sub.foreignRelationType =='1'>\n      <a-tab-pane tab=\"${sub.ftlDescription}\" key=\"${refKey}\" :forceRender=\"true\">\n        <${sub.entityName}Form ref=\"${sub.entityName?uncap_first}Form\" :disabled=\"formDisabled\"></${sub.entityName}Form>\n      </a-tab-pane>\n\n  <#else>\n      <a-tab-pane tab=\"${sub.ftlDescription}\" key=\"${refKey}\" :forceRender=\"true\">\n        <JVxeTable\n          v-if=\"${sub.entityName?uncap_first}Table.show\"      \n          keep-source\n          resizable\n          ref=\"${refKey}\"\n          :loading=\"${sub.entityName?uncap_first}Table.loading\"\n          :columns=\"${sub.entityName?uncap_first}Table.columns\"\n          :dataSource=\"${sub.entityName?uncap_first}Table.dataSource\"\n          :height=\"340\"\n          :disabled=\"formDisabled\"\n          :rowNumber=\"true\"\n          :rowSelection=\"true\"\n          :toolbar=\"true\"\n          />\n      </a-tab-pane>\n  </#if>\n</#list>\n    </a-tabs>\n    <div style=\"width: 100%;text-align: center;margin-top: 10px;\" v-if=\"showFlowSubmitButton\">\n      <a-button preIcon=\"ant-design:check-outlined\" style=\"width: 126px\" type=\"primary\" @click=\"handleSubmit\">提 交</a-button>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n    import { defHttp } from '/@/utils/http/axios';\n    import {ref, computed, unref,reactive, onMounted, defineProps } from 'vue';\n    import {BasicForm, useForm} from '/@/components/Form/index';\n    import { JVxeTable } from '/@/components/jeecg/JVxeTable'\n    import { useJvxeMethod } from '/@/hooks/system/useJvxeMethods.ts'\n    <#list subTables as sub>\n      <#if sub.foreignRelationType =='1'>\n    import ${sub.entityName}Form from './${sub.entityName}Form.vue'\n      </#if>\n    </#list>\n    import {formSchema<#list subTables as sub><#if sub.foreignRelationType =='0'>,${sub.entityName?uncap_first}JVxeColumns</#if></#list>} from '../${entityName}.data';\n    import {saveOrUpdate<#list subTables as sub>,query${sub.entityName}</#list>} from '../${entityName}.api';\n    import { VALIDATE_FAILED } from '/@/utils/common/vxeUtils'\n    const isUpdate = ref(true);\n    \n    const refKeys = ref([<#list subTables as sub>'${sub.entityName?uncap_first}', </#list>]);\n    <#assign hasOne2Many = false>\n    <#assign hasOne2One = false>\n    const activeKey = ref('${subTables[0].entityName?uncap_first}');\n<#list subTables as sub>\n<#if sub.foreignRelationType =='0'>\n <#assign hasOne2Many = true>\n    const ${sub.entityName?uncap_first} = ref();\n</#if>\n<#if sub.foreignRelationType =='1'>\n <#assign hasOne2One = true>\n    const ${sub.entityName?uncap_first}Form = ref();\n</#if>\n</#list>\n    const tableRefs = {<#list subTables as sub><#if sub.foreignRelationType =='0'>${sub.entityName?uncap_first}, <#assign hasOne2Many = true></#if></#list>};\n   <#list subTables as sub>\n   <#if sub.foreignRelationType =='0'>\n    const ${sub.entityName?uncap_first}Table = reactive({\n          loading: false,\n          dataSource: [],\n          columns:${sub.entityName?uncap_first}JVxeColumns,\n          show: false\n    })\n    </#if>\n   </#list>\n\n    const props = defineProps({\n      formData: { type: Object, default: ()=>{} },\n      formBpm: { type: Boolean, default: true }\n    });\n    const formDisabled = computed(()=>{\n      if(props.formBpm === true){\n        if(props.formData.disabled === false){\n          return false;\n        }\n      }\n      return true;\n    });\n    // 是否显示提交按钮\n    const showFlowSubmitButton = computed(()=>{\n      if(props.formBpm === true){\n        if(props.formData.disabled === false){\n          return true\n        }\n      }\n      return false\n    });\n    \n    //表单配置\n    const [registerForm, {setProps,resetFields, setFieldsValue, validate}] = useForm({\n        labelWidth: 150,\n        schemas: formSchema,\n        showActionButtonGroup: false,\n        baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}}\n    });\n\n    onMounted(()=>{\n      initFormData();\n    });\n    //渲染流程表单数据\n    const queryByIdUrl = '/${entityPackagePath}/${entityName?uncap_first}/queryById';\n    async function initFormData(){\n      if(props.formBpm === true){\n        await reset();\n        let params = {id: props.formData.dataId};\n        const data = await defHttp.get({url: queryByIdUrl, params});\n        //表单赋值\n        await setFieldsValue({\n          ...data\n        });\n        <#list subTables as sub><#rt/>\n        <#if sub.foreignRelationType =='1'>\n        ${sub.entityName?uncap_first}Form.value.initFormData(query${sub.entityName}, data.id)\n        </#if>\n        </#list>\n        <#list subTables as sub><#rt/>\n        <#if sub.foreignRelationType =='0'>\n        requestSubTableData(query${sub.entityName}, {id: data.id}, ${sub.entityName?uncap_first}Table, ()=>{\n          ${sub.entityName?uncap_first}Table.show = true;\n        });\n        </#if>\n        </#list>\n        // 隐藏底部时禁用整个表单\n        setProps({ disabled: formDisabled.value })\n      }\n    }\n    \n    //方法配置\n    const [handleChangeTabs,handleSubmit,requestSubTableData,formRef] = useJvxeMethod(requestAddOrEdit,classifyIntoFormData,tableRefs,activeKey,refKeys<#if hasOne2One==true>,validateSubForm</#if>);\n\n    async function reset(){\n      await resetFields();\n      activeKey.value = '${subTables[0].entityName?uncap_first}';\n      <#list subTables as sub>\n        <#if sub.foreignRelationType =='0'>\n      ${sub.entityName?uncap_first}Table.dataSource = [];\n        </#if>\n        <#if sub.foreignRelationType =='1'>\n      ${sub.entityName?uncap_first}Form.value.resetFields();\n        </#if>\n      </#list>\n    }\n    function classifyIntoFormData(allValues) {\n         let main = Object.assign({}, allValues.formValue)\n         return {\n           ...main, // 展开\n <#assign subManyIndex = 0>\n <#list subTables as sub><#rt/>\n <#if sub.foreignRelationType =='0'>\n           ${sub.entityName?uncap_first}List: allValues.tablesValue[${subManyIndex}].tableData,\n           <#assign subManyIndex = subManyIndex+1>\n <#else>\n           ${sub.entityName?uncap_first}List: ${sub.entityName?uncap_first}Form.value.getFormData(),\n </#if>\n </#list>\n         }\n       }\n      <#if hasOne2One==true>\n     //校验所有一对一子表表单\n     function validateSubForm(allValues){\n         return new Promise((resolve,reject)=>{\n             Promise.all([\n             <#list subTables as sub><#rt/>\n            <#if sub.foreignRelationType =='1'>\n                  ${sub.entityName?uncap_first}Form.value.validateForm(${sub_index}),\n            </#if>\n          </#list>\n             ]).then(() => {\n                 resolve(allValues)\n             }).catch(e => {\n                 if (e.error === VALIDATE_FAILED) {\n                     // 如果有未通过表单验证的子表，就自动跳转到它所在的tab\n                     activeKey.value = e.index == null ? unref(activeKey) : refKeys.value[e.index]\n                 } else {\n                     console.error(e)\n                 }\n             })\n         })\n     }\n    </#if>\n    //表单提交事件\n    async function requestAddOrEdit(values) {\n      //提交表单\n      await saveOrUpdate(values, true);\n    }\n</script>\n\n<style lang=\"less\" scoped>\n\t/** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-calendar-picker) {\n    width: 100%;\n  }\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei",
    "content": "﻿<#include \"/common/utils.ftl\">\n<template>\n<#assign buttonList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n  <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n</#if>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" destroyOnClose :title=\"title\" :maxHeight=\"500\" :width=\"${getModalWidth(tableVo.fieldRowNum?default(1))}\" @ok=\"handleSubmit\">\n      <BasicForm @register=\"registerForm\" ref=\"formRef\" name=\"${entityName}Form\" />\n      <!-- 子表单区域 -->\n      <a-tabs v-model:activeKey=\"activeKey\" animated @change=\"handleChangeTabs\" class=\"jeecg-tab\">\n  <#list subTables as sub><#rt/>\n    <#assign refKey = sub.entityName?uncap_first/>\n    <#if sub.foreignRelationType =='1'>\n        <a-tab-pane tab=\"${sub.ftlDescription}\" key=\"${refKey}\" :forceRender=\"true\">\n          <${sub.entityName}Form ref=\"${sub.entityName?uncap_first}Form\" :disabled=\"formDisabled\"></${sub.entityName}Form>\n        </a-tab-pane>\n  \n    <#else>\n        <a-tab-pane tab=\"${sub.ftlDescription}\" key=\"${refKey}\" :forceRender=\"true\">\n          <JVxeTable\n            keep-source\n            resizable\n            ref=\"${refKey}\"\n            :loading=\"${sub.entityName?uncap_first}Table.loading\"\n            :columns=\"${sub.entityName?uncap_first}Table.columns\"\n            :dataSource=\"${sub.entityName?uncap_first}Table.dataSource\"\n            :height=\"340\"\n            :disabled=\"formDisabled\"\n            :rowNumber=\"true\"\n            :rowSelection=\"true\"\n            :toolbar=\"true\"\n            />\n        </a-tab-pane>\n    </#if>\n  </#list>\n      </a-tabs>\n\n  <#if buttonList?? && buttonList?size gt 0>\n     <template #insertFooter>\n      <#list buttonList as btn>\n       <#if btn.buttonStyle=='form'>\n         <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n       </#if>\n      </#list>\n     </template>\n  </#if>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n    import {ref, computed, unref,reactive} from 'vue';\n    import {BasicModal, useModalInner} from '/@/components/Modal';\n    import {BasicForm, useForm} from '/@/components/Form/index';\n    import { JVxeTable } from '/@/components/jeecg/JVxeTable'\n    import { useJvxeMethod } from '/@/hooks/system/useJvxeMethods.ts'\n    <#list subTables as sub>\n      <#if sub.foreignRelationType =='1'>\n    import ${sub.entityName}Form from './${sub.entityName}Form.vue'\n      </#if>\n    </#list>\n    import {formSchema<#list subTables as sub><#if sub.foreignRelationType =='0'>,${sub.entityName?uncap_first}JVxeColumns</#if></#list>} from '../${entityName}.data';\n    import {saveOrUpdate<#list subTables as sub>,query${sub.entityName}</#list>} from '../${entityName}.api';\n    import { VALIDATE_FAILED } from '/@/utils/common/vxeUtils'\n    import { useMessage } from '/@/hooks/web/useMessage';\n    import { getDateByPicker } from '/@/utils';\n    //日期个性化选择\n    const fieldPickers = reactive({\n    <#list columns as po>\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      ${po.fieldName}: '${po.extendParams.picker}',\n      </#if>\n    </#list>\n    });\n    <#list subTables as sub>\n      <#if sub.foreignRelationType =='0'>\n      const ${sub.entityName?uncap_first}FieldPickers = reactive({\n      <#list sub.colums as po>\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        ${po.fieldName}: '${po.extendParams.picker}',\n        </#if>\n      </#list>\n      });\n      </#if>\n    </#list>\n    const { createMessage } = useMessage();\n    // Emits声明\n    const emit = defineEmits(['register','success']);\n    const isUpdate = ref(true);\n    const formDisabled = ref(false);\n    const refKeys = ref([<#list subTables as sub>'${sub.entityName?uncap_first}', </#list>]);\n    <#assign hasOne2Many = false>\n    <#assign hasOne2One = false>\n    const activeKey = ref('${subTables[0].entityName?uncap_first}');\n<#list subTables as sub>\n<#if sub.foreignRelationType =='0'>\n <#assign hasOne2Many = true>\n    const ${sub.entityName?uncap_first} = ref();\n</#if>\n<#if sub.foreignRelationType =='1'>\n <#assign hasOne2One = true>\n    const ${sub.entityName?uncap_first}Form = ref();\n</#if>\n</#list>\n    const tableRefs = {<#list subTables as sub><#if sub.foreignRelationType =='0'>${sub.entityName?uncap_first}, <#assign hasOne2Many = true></#if></#list>};\n   <#list subTables as sub>\n   <#if sub.foreignRelationType =='0'>\n    const ${sub.entityName?uncap_first}Table = reactive({\n          loading: false,\n          dataSource: [],\n          columns:${sub.entityName?uncap_first}JVxeColumns\n    })\n    </#if>\n   </#list>\n    //表单配置\n    const [registerForm, {setProps,resetFields, setFieldsValue, validate}] = useForm({\n        <#if tableVo.fieldRowNum == 1>\n        labelWidth: 150,\n        </#if>\n        schemas: formSchema,\n        showActionButtonGroup: false,\n        baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}},\n        baseRowStyle: { padding: \"0 20px\"}\n    });\n     //表单赋值\n    const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {\n        //重置表单\n        await reset();\n        setModalProps({confirmLoading: false,showCancelBtn:data?.showFooter,showOkBtn:data?.showFooter});\n        isUpdate.value = !!data?.isUpdate;\n        formDisabled.value = !data?.showFooter;\n        if (unref(isUpdate)) {\n            //表单赋值\n            await setFieldsValue({\n                ...data.record,\n            });\n            <#list subTables as sub><#rt/>\n            <#if sub.foreignRelationType =='1'>\n             ${sub.entityName?uncap_first}Form.value.initFormData(query${sub.entityName},data?.record?.id)\n            </#if>\n            </#list>\n            <#list subTables as sub><#rt/>\n            <#if sub.foreignRelationType =='0'>\n             requestSubTableData(query${sub.entityName}, {id:data?.record?.id}, ${sub.entityName?uncap_first}Table)\n            </#if>\n            </#list>\n        }\n        // 隐藏底部时禁用整个表单\n       setProps({ disabled: !data?.showFooter })\n    });\n    //方法配置\n    const [handleChangeTabs,handleSubmit,requestSubTableData,formRef] = useJvxeMethod(requestAddOrEdit,classifyIntoFormData,tableRefs,activeKey,refKeys<#if hasOne2One==true>,validateSubForm</#if>);\n\n    //设置标题\n    const title = computed(() => (!unref(isUpdate) ? '新增' : !unref(formDisabled) ? '编辑' : '详情'));\n\n    async function reset(){\n      await resetFields();\n      activeKey.value = '${subTables[0].entityName?uncap_first}';\n      <#list subTables as sub>\n        <#if sub.foreignRelationType =='0'>\n      ${sub.entityName?uncap_first}Table.dataSource = [];\n        </#if>\n        <#if sub.foreignRelationType =='1'>\n      ${sub.entityName?uncap_first}Form.value.resetFields();\n        </#if>\n      </#list>\n    }\n    function classifyIntoFormData(allValues) {\n         let main = Object.assign({}, allValues.formValue)\n         return {\n           ...main, // 展开\n <#assign subManyIndex = 0>\n <#list subTables as sub><#rt/>\n <#if sub.foreignRelationType =='0'>\n           ${sub.entityName?uncap_first}List: allValues.tablesValue[${subManyIndex}].tableData,\n           <#assign subManyIndex = subManyIndex+1>\n <#else>\n           ${sub.entityName?uncap_first}List: ${sub.entityName?uncap_first}Form.value.getFormData(),\n </#if>\n </#list>\n         }\n       }\n      <#if hasOne2One==true>\n     //校验所有一对一子表表单\n     function validateSubForm(allValues){\n         return new Promise((resolve,reject)=>{\n             Promise.all([\n             <#list subTables as sub><#rt/>\n            <#if sub.foreignRelationType =='1'>\n                  ${sub.entityName?uncap_first}Form.value.validateForm(${sub_index}),\n            </#if>\n          </#list>\n             ]).then(() => {\n                 resolve(allValues)\n             }).catch(e => {\n                 if (e.error === VALIDATE_FAILED) {\n                     // 如果有未通过表单验证的子表，就自动跳转到它所在的tab\n                     activeKey.value = e.index == null ? unref(activeKey) : refKeys.value[e.index]\n                     if (e.errorFields) {\n                       const firstField = e.errorFields[0];\n                       if (firstField) {\n                         e.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });\n                       }\n                     }\n                 } else {\n                     console.error(e)\n                 }\n             })\n         })\n     }\n    </#if>\n    //表单提交事件\n    async function requestAddOrEdit(values) {\n        try {\n            // 预处理日期数据\n            changeDateValue(values);\n            setModalProps({confirmLoading: true});\n            //提交表单\n            await saveOrUpdate(values, isUpdate.value);\n            //关闭弹窗\n            closeModal();\n            //刷新列表\n            emit('success');\n        } finally {\n            setModalProps({confirmLoading: false});\n        }\n    }\n\n    /**\n     * 处理日期值\n     * @param formData 表单数据\n     */\n    const changeDateValue = (formData) => {\n      if (formData && fieldPickers) {\n          for (let key in fieldPickers) {\n              if (formData[key]) {\n                  formData[key] = getDateByPicker(formData[key], fieldPickers[key]);\n              }\n          }\n      }\n      <#list subTables as sub>\n        <#if sub.foreignRelationType =='0'>\n      if(formData && formData.${sub.entityName?uncap_first}List && formData.${sub.entityName?uncap_first}List.length > 0){\n          formData.${sub.entityName?uncap_first}List.forEach(subFormData=>{\n              for (let key in ${sub.entityName?uncap_first}FieldPickers) {\n                  if (subFormData[key]) {\n                      subFormData[key] = getDateByPicker(subFormData[key], ${sub.entityName?uncap_first}FieldPickers[key]);\n                  }\n              }\n          })\n      }\n        </#if>\n      </#list>\n    };\n<#if buttonList?size gt 0>\n  <#list buttonList as btn>\n      <#if btn.buttonStyle=='form'>\n         function handle${btn.buttonCode?cap_first}(){\n            createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n         }\n      </#if>\n  </#list>\n</#if>\n</script>\n\n<style lang=\"less\" scoped>\n\t/** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-calendar-picker) {\n    width: 100%;\n  }\n  \n  .jeecg-tab {\n    padding: 0 20px;\n  }\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<#list subTables as sub>\n<#if sub.foreignRelationType=='1'>\n#segment#${sub.entityName}Form.vue\n<template>\n    <BasicForm @register=\"registerForm\" name=\"${sub.entityName}Form\" class=\"basic-modal-form\" />\n</template>\n<script lang=\"ts\">\n    import {defineComponent} from 'vue';\n    import {BasicForm, useForm} from '/@/components/Form/index';\n    import {${sub.entityName?uncap_first}FormSchema} from '../${entityName}.data';\n    import {defHttp} from '/@/utils/http/axios';\n    import { VALIDATE_FAILED } from '/@/utils/common/vxeUtils'\n\n    export default defineComponent({\n        name:\"${sub.entityName}Form\",\n        components: {BasicForm},\n        emits:['register'],\n        props:{\n            disabled: {\n                type: Boolean,\n                default: false\n            }\n        },\n        setup(props,{emit}) {\n            const [registerForm, { setProps, resetFields, setFieldsValue, getFieldsValue, validate, scrollToField }] = useForm({\n                <#if tableVo.fieldRowNum == 1>\n                labelWidth: 150,\n                </#if>\n                schemas: ${sub.entityName?uncap_first}FormSchema,\n                showActionButtonGroup: false,\n                baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}}\n            });\n            /**\n            *初始化加载数据\n            */\n            function initFormData(url,id){\n                if(id){\n                     defHttp.get({url,params:{id}},{isTransformResponse:false}).then(res=>{\n                       res.success && setFieldsValue({...res.result.records[0]});\n                    })\n                }\n                setProps({disabled: props.disabled})\n            }\n\n            /**\n             *获取表单数据\n             */\n            function getFormData(){\n                let formData = getFieldsValue();\n                Object.keys(formData).map(k=>{\n                    if(formData[k] instanceof Array){\n                        formData[k] = formData[k].join(',')\n                    }\n                });\n                return [formData];\n            }\n\n            /**\n            *表单校验\n            */\n            function validateForm(index){\n                return new Promise((resolve, reject) => {\n                    // 验证子表表单\n                    validate().then(()=>{\n                        return resolve()\n                    }).catch(({ errorFields })=> {\n                        return reject({ error: VALIDATE_FAILED ,index, errorFields: errorFields, scrollToField: scrollToField })\n                    })\n                })\n            }\n            return {\n                registerForm,\n                resetFields,\n                initFormData,\n                getFormData,\n                validateForm\n            }\n        }\n    })\n</script>\n<style lang=\"less\" scoped>\n  .basic-modal-form {\n    overflow: auto;\n    height: 340px;\n  }\n</style>\n</#if>\n</#list>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/inner-table/onetomany/java/${bussiPackage}/${entityPackage}/vue3/subTables/[1-n]SubTable.vuei",
    "content": "<#--noinspection JSDuplicatedDeclaration-->\n<#list subTables as sub>\n#segment#${sub.entityName}SubTable.vue\n<template>\n  <div>\n  <#assign list_need_category=false>\n  <#assign list_need_pca=false>\n  <#assign bpm_flag=false>\n\n  <#-- 开始循环 -->\n  <#list columns as po>\n  <#if po.fieldDbName=='bpm_status'>\n    <#assign bpm_flag=true>\n  </#if>\n  <#if po.classType=='cat_tree' && po.dictText?default(\"\")?trim?length == 0>\n  <#assign list_need_category=true>\n  </#if>\n  <#if po.classType=='pca'>\n  <#assign list_need_pca=true>\n  </#if>\n  </#list>\n  <#-- 结束循环 -->\n      <!--引用表格-->\n     <BasicTable bordered size=\"middle\" :loading=\"loading\" rowKey=\"id\" :canResize=\"true\" :columns=\"${sub.entityName?uncap_first}Columns\" :dataSource=\"dataSource\" :pagination=\"false\">\n        <!--字段回显插槽-->\n        <template v-slot:bodyCell=\"{ column, record, index, text }\">\n        <#list sub.originalColumns as po>\n          <#if po.classType=='umeditor' || po.classType=='pca' || po.classType=='file'>\n          <template v-if=\"column.dataIndex==='${po.fieldName}'\">\n          <#if po.classType=='umeditor'>\n            <!--富文本件字段回显插槽-->\n            <div v-html=\"text\"></div>\n          </#if>\n          <#if po.classType=='file'>\n            <!--文件字段回显插槽-->\n            <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n            <a-button v-else :ghost=\"true\" type=\"primary\" preIcon=\"ant-design:download-outlined\" size=\"small\" @click=\"downloadFile(text)\">下载</a-button>\n          </#if>\n          </template>\n          </#if>\n        </#list>\n        </template>\n      </BasicTable>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import {ref,watchEffect} from 'vue';\n  import {BasicTable} from '/@/components/Table';\n  import {${sub.entityName?uncap_first}Columns} from '../${entityName}.data';\n  import {${sub.entityName?uncap_first}List} from '../${entityName}.api';\n  import { downloadFile } from '/@/utils/common/renderUtils';\n\n  const props = defineProps({\n    id: {\n       type: String,\n       default: '',\n     },\n  })\n\n  const loading = ref(false);\n  const dataSource = ref([]);\n\n  watchEffect(() => {\n      props.id && loadData(props.id);\n   });\n\n   function loadData(id) {\n         dataSource.value = []\n         loading.value = true\n          ${sub.entityName?uncap_first}List({id}).then((res) => {\n           if (res.success) {\n              dataSource.value = res.result.records\n           }\n         }).finally(() => {\n           loading.value = false\n         })\n    }\n</script>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai",
    "content": "package ${bussiPackage}.${entityPackage}.controller;\n\nimport java.io.UnsupportedEncodingException;\nimport java.io.IOException;\nimport java.net.URLDecoder;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\nimport java.util.HashMap;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\n\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.query.QueryRuleEnum;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecgframework.poi.excel.entity.enmus.ExcelType;\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport ${bussiPackage}.${entityPackage}.vo.${entityName}Page;\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.service.I${sub.entityName}Service;\n</#list>\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\nimport com.alibaba.fastjson.JSON;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\n\n<#assign bpm_flag=false>\n<#assign has_multi_query_field=false>\n<#list originalColumns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n</#list>\n\n<#assign has_multi_query_field=false>\n<#list originalColumns as po>\n<#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')>\n   <#assign has_multi_query_field=true>\n</#if>\n</#list>\n<#assign enhanceJavaList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.enhanceJavaList??>\n  <#assign enhanceJavaList = tableVo.extendParams.enhanceJavaList?filter(enhance -> enhance??)>\n</#if>\n /**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Tag(name=\"${tableVo.ftlDescription}\")\n@RestController\n@RequestMapping(\"/${entityPackagePath}/${entityName?uncap_first}\")\n@Slf4j\npublic class ${entityName}Controller {\n\t@Autowired\n\tprivate I${entityName}Service ${entityName?uncap_first}Service;\n\t<#list subTables as sub>\n\t@Autowired\n\tprivate I${sub.entityName}Service ${sub.entityName?uncap_first}Service;\n\t</#list>\n\t\n\t/**\n\t * 分页列表查询\n\t *\n\t * @param ${entityName?uncap_first}\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t//@AutoLog(value = \"${tableVo.ftlDescription}-分页列表查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-分页列表查询\")\n\t@GetMapping(value = \"/list\")\n\tpublic Result<IPage<${entityName}>> queryPageList(${entityName} ${entityName?uncap_first},\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t   HttpServletRequest req) {\n    <#if enhanceJavaList?size gt 0>\n     <#list enhanceJavaList as enhanceJava>\n     <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'>\n           //TODO 查询前触发的方法，代码生成后，请手工实现增强类逻辑;\n           //${entityName?uncap_first}Service.beforeQuery()\n     </#if>\n     </#list>\n    </#if>\n    <#if has_multi_query_field>\n        // 自定义查询规则\n        Map<String, QueryRuleEnum> customeRuleMap = new HashMap<>();\n        // 自定义多选的查询规则为：LIKE_WITH_OR\n    <#list originalColumns as po>\n        <#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')>\n        customeRuleMap.put(\"${po.fieldName}\", QueryRuleEnum.LIKE_WITH_OR);\n        </#if>\n    </#list>\n        QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap(),customeRuleMap);\n    <#else>\n        QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap());\n    </#if>\n\t\tPage<${entityName}> page = new Page<${entityName}>(pageNo, pageSize);\n\t\tIPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper);\n\t<#if enhanceJavaList?size gt 0>\n     <#list enhanceJavaList as enhanceJava>\n     <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'>\n          //TODO 查询后触发的方法，代码生成后，请手工实现增强类逻辑;\n           //${entityName?uncap_first}Service.afterQuery()\n     </#if>\n     </#list>\n    </#if>\n\t\treturn Result.OK(pageList);\n\t}\n\t\n\t/**\n\t *   添加\n\t *\n\t * @param ${entityName?uncap_first}Page\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-添加\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-添加\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:add\")\n\t@PostMapping(value = \"/add\")\n\tpublic Result<String> add(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) {\n    <#if enhanceJavaList?size gt 0>\n      <#list enhanceJavaList as enhanceJava>\n      <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='start'  && enhanceJava.activeStatus=='1'>\n          //TODO 新增前的处理方法，代码生成后，请手工实现增强类逻辑;\n          //${entityName?uncap_first}Service.beforeAdd()\n      </#if>\n      </#list>\n    </#if>\n\t\t${entityName} ${entityName?uncap_first} = new ${entityName}();\n\t\tBeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first});\n\t\t<#if bpm_flag>\n        ${entityName?uncap_first}.setBpmStatus(\"1\");\n        </#if>\n\t\t${entityName?uncap_first}Service.saveMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>);\n\t<#if enhanceJavaList?size gt 0>\n      <#list enhanceJavaList as enhanceJava>\n      <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='end'  && enhanceJava.activeStatus=='1'>\n           //TODO 新增后的处理方法，代码生成后，请手工实现增强类逻辑;\n           //${entityName?uncap_first}Service.afterAdd()\n       </#if>\n      </#list>\n    </#if>\n\t\treturn Result.OK(\"添加成功！\");\n\t}\n\t\n\t/**\n\t *  编辑\n\t *\n\t * @param ${entityName?uncap_first}Page\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-编辑\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-编辑\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:edit\")\n\t@RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n\tpublic Result<String> edit(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) {\n    <#if enhanceJavaList?size gt 0>\n      <#list enhanceJavaList as enhanceJava>\n      <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='start'  && enhanceJava.activeStatus=='1'>\n           //TODO 编辑前，代码生成后，请手工实现增强类逻辑;\n           //${entityName?uncap_first}Service.beforeEdit()\n      </#if>\n      </#list>\n    </#if>\n\t\t${entityName} ${entityName?uncap_first} = new ${entityName}();\n\t\tBeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first});\n\t\t${entityName} ${entityName?uncap_first}Entity = ${entityName?uncap_first}Service.getById(${entityName?uncap_first}.getId());\n\t\tif(${entityName?uncap_first}Entity==null) {\n\t\t\treturn Result.error(\"未找到对应数据\");\n\t\t}\n\t\t${entityName?uncap_first}Service.updateMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>);\n    <#if enhanceJavaList?size gt 0>\n      <#list enhanceJavaList as enhanceJava>\n      <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'>\n          //TODO 编辑后，代码生成后，请手工实现增强类逻辑;\n          //${entityName?uncap_first}Service.afterEdit()\n      </#if>\n      </#list>\n    </#if>\n\t\treturn Result.OK(\"编辑成功!\");\n\t}\n\t\n\t/**\n\t *   通过id删除\n\t *\n\t * @param id\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-通过id删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id删除\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:delete\")\n\t@DeleteMapping(value = \"/delete\")\n\tpublic Result<String> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${entityName?uncap_first}Service.delMain(id);\n\t\treturn Result.OK(\"删除成功!\");\n\t}\n\t\n\t/**\n\t *  批量删除\n\t *\n\t * @param ids\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-批量删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-批量删除\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:deleteBatch\")\n\t@DeleteMapping(value = \"/deleteBatch\")\n\tpublic Result<String> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tthis.${entityName?uncap_first}Service.delBatchMain(Arrays.asList(ids.split(\",\")));\n\t\treturn Result.OK(\"批量删除成功！\");\n\t}\n\t\n\t/**\n\t * 通过id查询\n\t *\n\t * @param id\n\t * @return\n\t */\n\t//@AutoLog(value = \"${tableVo.ftlDescription}-通过id查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id查询\")\n\t@GetMapping(value = \"/queryById\")\n\tpublic Result<${entityName}> queryById(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${entityName} ${entityName?uncap_first} = ${entityName?uncap_first}Service.getById(id);\n\t\tif(${entityName?uncap_first}==null) {\n\t\t\treturn Result.error(\"未找到对应数据\");\n\t\t}\n\t\treturn Result.OK(${entityName?uncap_first});\n\n\t}\n\t\n\t<#list subTables as sub>\n\t/**\n\t * 通过id查询\n\t *\n\t * @param id\n\t * @return\n\t */\n\t//@AutoLog(value = \"${sub.ftlDescription}通过主表ID查询\")\n\t@Operation(summary=\"${sub.ftlDescription}主表ID查询\")\n\t@GetMapping(value = \"/query${sub.entityName}ByMainId\")\n\tpublic Result<List<${sub.entityName}>> query${sub.entityName}ListByMainId(@RequestParam(name=\"id\",required=true) String id) {\n\t\tList<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(id);\n\t\treturn Result.OK(${sub.entityName?uncap_first}List);\n\t}\n\t</#list>\n\n    /**\n    * 导出excel\n    *\n    * @param request\n    * @param ${entityName?uncap_first}\n    */\n    @RequiresPermissions(\"${entityPackage}:${tableName}:exportXls\")\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) {\n      <#if enhanceJavaList?size gt 0>\n       <#list enhanceJavaList as enhanceJava>\n       <#if enhanceJava.buttonCode=='export' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'>\n            //TODO 导出前，代码生成后，请手工实现增强类逻辑;\n            //${entityName?uncap_first}Service.beforeExport()\n       </#if>\n       </#list>\n      </#if>\n\n      // Step.1 组装查询条件查询数据\n      QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap());\n      LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\n      //配置选中数据查询条件\n      String selections = request.getParameter(\"selections\");\n      if(oConvertUtils.isNotEmpty(selections)) {\n         List<String> selectionList = Arrays.asList(selections.split(\",\"));\n         queryWrapper.in(\"id\",selectionList);\n      }\n      //Step.2 获取导出数据\n      List<${entityName}> ${entityName?uncap_first}List = ${entityName?uncap_first}Service.list(queryWrapper);\n\n      // Step.3 组装pageList\n      List<${entityName}Page> pageList = new ArrayList<${entityName}Page>();\n      for (${entityName} main : ${entityName?uncap_first}List) {\n          ${entityName}Page vo = new ${entityName}Page();\n          BeanUtils.copyProperties(main, vo);\n          <#list subTables as sub>\n          List<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(main.getId());\n          vo.set${sub.entityName}List(${sub.entityName?uncap_first}List);\n          </#list>\n          pageList.add(vo);\n      }\n\n      // Step.4 AutoPoi 导出Excel\n      ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n      mv.addObject(NormalExcelConstants.FILE_NAME, \"${tableVo.ftlDescription}列表\");\n      mv.addObject(NormalExcelConstants.CLASS, ${entityName}Page.class);\n      mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(\"${tableVo.ftlDescription}数据\", \"导出人:\"+sysUser.getRealname(), \"${tableVo.ftlDescription}\", ExcelType.XSSF));\n      mv.addObject(NormalExcelConstants.DATA_LIST, pageList);\n      return mv;\n    }\n\n    /**\n    * 通过excel导入数据\n    *\n    * @param request\n    * @param response\n    * @return\n    */\n    @RequiresPermissions(\"${entityPackage}:${tableName}:importExcel\")\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n  <#if enhanceJavaList?size gt 0>\n      <#list enhanceJavaList as enhanceJava>\n      <#if enhanceJava.buttonCode=='import' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'>\n           //TODO 导入前，代码生成后，请手工实现增强类逻辑;\n           //${entityName?uncap_first}Service.beforeImport()\n      </#if>\n      </#list>\n  </#if>\n      MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n      Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n      for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n          // 获取上传文件对象\n          MultipartFile file = entity.getValue();\n          ImportParams params = new ImportParams();\n          params.setTitleRows(2);\n          params.setHeadRows(1);\n          params.setNeedSave(true);\n          try {\n              List<${entityName}Page> list = ExcelImportUtil.importExcel(file.getInputStream(), ${entityName}Page.class, params);\n              for (${entityName}Page page : list) {\n                  ${entityName} po = new ${entityName}();\n                  BeanUtils.copyProperties(page, po);\n                  ${entityName?uncap_first}Service.saveMain(po, <#list subTables as sub>page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>);\n              }\n              return Result.OK(\"文件导入成功！数据行数:\" + list.size());\n          } catch (Exception e) {\n              log.error(e.getMessage(),e);\n              return Result.error(\"文件导入失败:\"+e.getMessage());\n          } finally {\n              try {\n                  file.getInputStream().close();\n              } catch (IOException e) {\n                  e.printStackTrace();\n              }\n          }\n      }\n      return Result.OK(\"文件导入失败！\");\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai",
    "content": "<#include \"/common/utils.ftl\">\npackage ${bussiPackage}.${entityPackage}.entity;\n\nimport java.io.Serializable;\nimport java.io.UnsupportedEncodingException;\nimport java.util.Date;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport org.jeecg.common.constant.ProvinceCityArea;\nimport org.jeecg.common.util.SpringContextUtils;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.jeecg.common.aspect.annotation.Dict;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Schema(description=\"${tableVo.ftlDescription}\")\n@Data\n@TableName(\"${tableName}\")\npublic class ${entityName} implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']>\n<#assign excel_ignore_classType_arr=['pca','switch','cat_tree']>\n    <#list originalColumns as po>\n    <#-- 生成字典Code -->\n    <#assign list_field_dictCode=\"\">\n    <#if po.classType='sel_user'>\n      <#assign list_field_dictCode=', dictTable = \"sys_user\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"realname\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"username\\\")?trim)}\"'>\n    <#elseif po.classType='sel_depart'>\n      <#assign list_field_dictCode=', dictTable = \"sys_depart\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"depart_name\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"id\\\")?trim)}\"'>\n    <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>\n      <#if po.dictTable?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText}\", dicCode = \"${po.dictField}\"'>\n      <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dicCode = \"${po.dictField}\"'>\n    </#if>\n    <#elseif po.classType=='sel_tree'>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText?split(\",\")[2]}\", dicCode = \"${po.dictText?split(\",\")[0]}\"'>\n    <#elseif po.classType=='link_table'>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicCode = \"${po.dictField}\", dicText = \"${po.dictText?split(\",\")[0]}\"'>\n    </#if>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t@TableId(type = IdType.ASSIGN_ID)\n\t<#else>\n\t\t<#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'>\n\t\t\t<#if po.classType=='date'>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t\t\t<#else>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t\t\t</#if>\n\t\t<#else>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\") && !excel_ignore_classType_arr?seq_contains(\"${po.classType}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n\t</#if>\n\t\t</#if>\n      <#if list_field_dictCode?length gt 1>\n    @Dict(${list_field_dictCode?substring(2)})\n      </#if>\n\t</#if>\n    <#include \"/common/blob.ftl\">\n\t</#list>\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai",
    "content": "<#include \"/common/utils.ftl\">\n<#list subTables as subTab>\n#segment#${subTab.entityName}.java\npackage ${bussiPackage}.${entityPackage}.entity;\n\nimport java.io.Serializable;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport org.jeecg.common.constant.ProvinceCityArea;\nimport org.jeecg.common.util.SpringContextUtils;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport java.util.Date;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport java.io.UnsupportedEncodingException;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Schema(description=\"${subTab.ftlDescription}\")\n@Data\n@TableName(\"${subTab.tableName}\")\npublic class ${subTab.entityName} implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']>\n <#assign excel_ignore_classType_arr=['pca','switch','cat_tree']>\n    <#list subTab.originalColumns as po>\n\t<#-- 生成字典Code -->\n\t<#assign list_field_dictCode=\"\">\n\t<#if po.classType='sel_user'>\n\t\t<#assign list_field_dictCode=', dictTable = \"sys_user\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"realname\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"username\\\")?trim)}\"'>\n\t<#elseif po.classType='sel_depart'>\n\t\t<#assign list_field_dictCode=', dictTable = \"sys_depart\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"depart_name\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"id\\\")?trim)}\"'>\n\t<#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>\n\t\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n\t\t\t<#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText}\", dicCode = \"${po.dictField}\"'>\n\t\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t\t<#assign list_field_dictCode=', dicCode = \"${po.dictField}\"'>\n\t\t<#elseif po.classType=='sel_tree'>\n\t\t\t<#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText?split(\",\")[2]}\", dicCode = \"${po.dictText?split(\",\")[0]}\"'>\n\t\t</#if>\n    <#elseif po.classType=='link_table'>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicCode = \"${po.dictField}\", dicText = \"${po.dictText?split(\",\")[0]}\"'>\n\t</#if>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t@TableId(type = IdType.ASSIGN_ID)\n\t<#else>\n\t\t<#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'>\n\t\t\t<#if po.classType=='date'>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n    </#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t\t\t<#else>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t\t\t</#if>\n\t\t<#elseif !subTab.foreignKeys?seq_contains(po.fieldName?cap_first)>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\") && !excel_ignore_classType_arr?seq_contains(\"${po.classType}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n\t</#if>\n\t\t</#if>\n\t</#if>\n\t<#-- 大字段转换 -->\n    <#include \"/common/blob.ftl\">\n\t</#list>\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai",
    "content": "package ${bussiPackage}.${entityPackage}.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface ${entityName}Mapper extends BaseMapper<${entityName}> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}Mapper.java\npackage ${bussiPackage}.${entityPackage}.mapper;\n\nimport java.util.List;\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Param;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface ${subTab.entityName}Mapper extends BaseMapper<${subTab.entityName}> {\n\n\t/**\n\t * 通过主表id删除子表数据\n\t *\n\t * @param mainId 主表id\n\t * @return boolean\n\t */\n\tpublic boolean deleteByMainId(@Param(\"mainId\") String mainId);\n\n  /**\n   * 通过主表id查询子表数据\n   *\n   * @param mainId 主表id\n   * @return List<${subTab.entityName}>\n   */\n\tpublic List<${subTab.entityName}> selectByMainId(@Param(\"mainId\") String mainId);\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml",
    "content": "<#list subTables as subTab>\n<#assign originalForeignKeys = subTab.originalForeignKeys>\n#segment#${subTab.entityName}Mapper.xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper\">\n\n\t<delete id=\"deleteByMainId\" parameterType=\"java.lang.String\">\n\t\tDELETE \n\t\tFROM  ${subTab.tableName} \n\t\tWHERE\n\t\t<#list originalForeignKeys as key>\n\t\t\t ${key} = ${r'#'}{mainId} <#rt/>\n\t\t</#list>\n\t</delete>\n\t\n\t<select id=\"selectByMainId\" parameterType=\"java.lang.String\" resultType=\"${bussiPackage}.${entityPackage}.entity.${subTab.entityName}\">\n\t\tSELECT * \n\t\tFROM  ${subTab.tableName}\n\t\tWHERE\n\t\t<#list originalForeignKeys as key>\n\t\t\t ${key} = ${r'#'}{mainId} <#rt/>\n\t\t</#list>\n\t</select>\n</mapper>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service;\n\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport java.io.Serializable;\nimport java.util.Collection;\nimport java.util.List;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface I${entityName}Service extends IService<${entityName}> {\n\n\t/**\n\t * 添加一对多\n\t *\n\t * @param ${entityName?uncap_first}\n\t <#list subTables as sub>\n\t * @param ${sub.entityName?uncap_first}List\n\t </#list>\n\t */\n\tpublic void saveMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) ;\n\t\n\t/**\n\t * 修改一对多\n\t *\n   * @param ${entityName?uncap_first}\n   <#list subTables as sub>\n   * @param ${sub.entityName?uncap_first}List\n   </#list>\n\t */\n\tpublic void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>);\n\t\n\t/**\n\t * 删除一对多\n\t *\n\t * @param id\n\t */\n\tpublic void delMain (String id);\n\t\n\t/**\n\t * 批量删除一对多\n\t *\n\t * @param idList\n\t */\n\tpublic void delBatchMain (Collection<? extends Serializable> idList);\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai",
    "content": "<#list subTables as subTab>\n#segment#I${subTab.entityName}Service.java\npackage ${bussiPackage}.${entityPackage}.service;\n\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport java.util.List;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface I${subTab.entityName}Service extends IService<${subTab.entityName}> {\n\n\t/**\n\t * 通过主表id查询子表数据\n\t *\n\t * @param mainId 主表id\n\t * @return List<${subTab.entityName}>\n\t */\n\tpublic List<${subTab.entityName}> selectByMainId(String mainId);\n}\n</#list>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service.impl;\n\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.mapper.${sub.entityName}Mapper;\n</#list>\nimport ${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper;\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.transaction.annotation.Transactional;\nimport java.io.Serializable;\nimport java.util.List;\nimport java.util.Collection;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Service\npublic class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service {\n\n\t@Autowired\n\tprivate ${entityName}Mapper ${entityName?uncap_first}Mapper;\n\t<#list subTables as sub>\n\t@Autowired\n\tprivate ${sub.entityName}Mapper ${sub.entityName?uncap_first}Mapper;\n\t</#list>\n\t\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void saveMain(${entityName} ${entityName?uncap_first}, <#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) {\n\t\t${entityName?uncap_first}Mapper.insert(${entityName?uncap_first});\n\t\t<#list subTables as sub>\n\t\tif(${sub.entityName?uncap_first}List!=null && ${sub.entityName?uncap_first}List.size()>0) {\n\t\t\tfor(${sub.entityName} entity:${sub.entityName?uncap_first}List) {\n\t\t\t\t<#list sub.foreignKeys as key>\n\t\t\t\t//外键设置\n\t\t\t\t<#if key?lower_case?index_of(\"${primaryKeyField}\")!=-1>\n\t\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}());\n\t\t\t\t<#else>\n\t\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${key}());\n\t\t\t\t</#if>\n\t\t\t\t</#list>\n\t\t\t\t${sub.entityName?uncap_first}Mapper.insert(entity);\n\t\t\t}\n\t\t}\n\t\t</#list>\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) {\n\t\t${entityName?uncap_first}Mapper.updateById(${entityName?uncap_first});\n\t\t\n\t\t//1.先删除子表数据\n\t\t<#list subTables as sub>\n\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(${entityName?uncap_first}.getId());\n\t\t</#list>\n\t\t\n\t\t//2.子表数据重新插入\n\t\t<#list subTables as sub>\n\t\tif(${sub.entityName?uncap_first}List!=null && ${sub.entityName?uncap_first}List.size()>0) {\n\t\t\tfor(${sub.entityName} entity:${sub.entityName?uncap_first}List) {\n\t\t\t\t<#list sub.foreignKeys as key>\n\t\t\t\t//外键设置\n\t\t\t\t<#if key?lower_case?index_of(\"${primaryKeyField}\")!=-1>\n\t\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}());\n\t\t\t\t<#else>\n\t\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${key}());\n\t\t\t\t</#if>\n\t\t\t\t</#list>\n\t\t\t\t${sub.entityName?uncap_first}Mapper.insert(entity);\n\t\t\t}\n\t\t}\n\t\t</#list>\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void delMain(String id) {\n\t\t<#list subTables as sub>\n\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(id);\n\t\t</#list>\n\t\t${entityName?uncap_first}Mapper.deleteById(id);\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void delBatchMain(Collection<? extends Serializable> idList) {\n\t\tfor(Serializable id:idList) {\n\t\t\t<#list subTables as sub>\n\t\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(id.toString());\n\t\t\t</#list>\n\t\t\t${entityName?uncap_first}Mapper.deleteById(id);\n\t\t}\n\t}\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}ServiceImpl.java\npackage ${bussiPackage}.${entityPackage}.service.impl;\n\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport ${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper;\nimport ${bussiPackage}.${entityPackage}.service.I${subTab.entityName}Service;\nimport org.springframework.stereotype.Service;\nimport java.util.List;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Service\npublic class ${subTab.entityName}ServiceImpl extends ServiceImpl<${subTab.entityName}Mapper, ${subTab.entityName}> implements I${subTab.entityName}Service {\n\t\n\t@Autowired\n\tprivate ${subTab.entityName}Mapper ${subTab.entityName?uncap_first}Mapper;\n\t\n\t@Override\n\tpublic List<${subTab.entityName}> selectByMainId(String mainId) {\n\t\treturn ${subTab.entityName?uncap_first}Mapper.selectByMainId(mainId);\n\t}\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai",
    "content": "package ${bussiPackage}.${entityPackage}.vo;\n\nimport java.util.List;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport lombok.Data;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.jeecgframework.poi.excel.annotation.ExcelEntity;\nimport org.jeecgframework.poi.excel.annotation.ExcelCollection;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport java.util.Date;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecg.common.constant.ProvinceCityArea;\nimport org.jeecg.common.util.SpringContextUtils;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Data\n@Schema(description=\"${tableVo.ftlDescription}\")\npublic class ${entityName}Page {\n\n\t<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']>\n\t<#assign excel_ignore_classType_arr=['pca','switch','cat_tree']>\n    <#list originalColumns as po>\n    <#-- 生成字典Code -->\n    <#assign list_field_dictCode=\"\">\n    <#if po.classType='sel_user'>\n      <#assign list_field_dictCode=', dictTable = \"sys_user\", dicText = \"realname\", dicCode = \"username\"'>\n    <#elseif po.classType='sel_depart'>\n      <#assign list_field_dictCode=', dictTable = \"sys_depart\", dicText = \"depart_name\", dicCode = \"id\"'>\n    <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>\n      <#if po.dictTable?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText}\", dicCode = \"${po.dictField}\"'>\n      <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dicCode = \"${po.dictField}\"'>\n      </#if>\n      <#elseif po.classType=='cat_tree'>\n          <#assign list_field_dictCode=', dictTable = \"sys_category\", dicText = \"name\", dicCode = \"id\"'>\n    </#if>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t<#else>\n\t\t<#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'>\n\t\t\t<#if po.classType=='date'>\n\t<#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t\t\t<#else>\n\t<#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t\t\t</#if>\n\t\t<#else>\n\t<#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")  && !excel_ignore_classType_arr?seq_contains(\"${po.classType}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n\t</#if>\n\t\t</#if>\n        <#if list_field_dictCode?length gt 1  && !excel_ignore_classType_arr?seq_contains(\"${po.classType}\")>\n    @Dict(${list_field_dictCode?substring(2)})\n        </#if>\n\t</#if>\n\t@Schema(description = \"${po.filedComment}\")\n    <#if po.fieldDbType=='Blob'>\n    private java.lang.String ${po.fieldName}String;\n    <#elseif po.classType=='pca'>\n    @Excel(name = \"${po.filedComment}\", width = 15,exportConvert=true,importConvert = true )\n    private ${po.fieldType} ${po.fieldName};\n\n    public String convertis${po.fieldName?cap_first}() {\n        return SpringContextUtils.getBean(ProvinceCityArea.class).getText(${po.fieldName});\n    }\n\n    public void convertset${po.fieldName?cap_first}(String text) {\n        this.${po.fieldName} = SpringContextUtils.getBean(ProvinceCityArea.class).getCode(text);\n    }\n    <#elseif po.classType=='cat_tree'>\n    @Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n    private ${po.fieldType} ${po.fieldName};\n    <#elseif po.classType=='switch'>\n    <#assign switch_extend_arr=['Y','N']>\n    <#if po.dictField?default(\"\")?contains(\"[\")>\n        <#assign switch_extend_arr=po.dictField?eval>\n    </#if>\n    <#list switch_extend_arr as a>\n        <#if a_index == 0>\n            <#assign switch_extend_arr1=a>\n        <#else>\n            <#assign switch_extend_arr2=a>\n        </#if>\n    </#list>\n    @Excel(name = \"${po.filedComment}\", width = 15,replace = {\"是_${switch_extend_arr1}\",\"否_${switch_extend_arr2}\"} )\n    private ${po.fieldType} ${po.fieldName};\n    <#else>\n    private ${po.fieldType} ${po.fieldName};\n    </#if>\n\t</#list>\n\n\t<#list subTables as sub>\n\t@ExcelCollection(name=\"${sub.ftlDescription}\")\n\t@Schema(description = \"${sub.ftlDescription}\")\n\tprivate List<${sub.entityName}> ${sub.entityName?uncap_first}List;\n\t</#list>\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei",
    "content": "<template>\n  <a-card :bordered=\"false\">\n    <!-- 查询区域 -->\n    <div class=\"table-page-search-wrapper\">\n      <a-form layout=\"inline\" @keyup.enter.native=\"searchQuery\">\n        <a-row :gutter=\"24\">\n<#assign query_field_no=0>\n<#assign list_need_dict=false>\n<#assign list_need_category=false>\n<#assign list_need_pca=false>\n<#assign query_flag=false>\n<#assign bpm_flag=false>\n\n<#-- 开始循环 -->\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.isQuery=='Y'>\n<#assign query_flag=true>\n\t<#if query_field_no==2>\n          <template v-if=\"toggleSearchStatus\">\n\t</#if>\n\t<#assign query_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n\t    <#assign query_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n    <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign query_field_dictCode=\"${po.dictField}\">\n    </#if>\n\t<#if po.queryMode=='single'>\n          <#if query_field_no gt 1>  </#if><a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <#if query_field_no gt 1>  </#if><a-form-item label=\"${po.filedComment}\">\n            <#if po.classType=='sel_search'>\n              <#if query_field_no gt 1>  </#if><j-search-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dict=\"${po.dictTable},${po.dictText},${po.dictField}\"/>\n            <#elseif po.classType=='sel_user'>\n              <#if query_field_no gt 1>  </#if><j-select-user-by-dep placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"/>\n            <#elseif po.classType=='sel_depart'>\n              <#if query_field_no gt 1>  </#if><j-select-depart placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"/>\n            <#elseif po.classType=='list_multi'>\n              <#if query_field_no gt 1>  </#if><j-multi-select-tag placeholder=\"请选择${po.filedComment}\" dictCode=\"${query_field_dictCode?default(\"\")}\" v-model=\"queryParam.${po.fieldName}\"/>\n            <#elseif po.classType=='cat_tree'>\n              <#if query_field_no gt 1>  </#if><j-category-select placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\"/>\n\t\t\t<#elseif po.classType=='date'>\n              <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></j-date>\n\t\t\t<#elseif po.classType=='datetime'>\n              <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></j-date>\n            <#elseif po.classType=='pca'>\n              <#if query_field_no gt 1>  </#if><j-area-linkage type=\"cascader\" v-model=\"queryParam.${po.fieldName}\" placeholder=\"请选择省市区\"/>\n            <#elseif po.classType=='popup'>\n              <#if query_field_no gt 1>  </#if><j-popup placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" code=\"${po.dictTable}\" org-fields=\"${po.dictField}\" dest-fields=\"${po.dictText}\" :field=\"getPopupField('${po.dictText}')\" :multi=\"${po.extendParams.popupMulti?c}\"/>\n\t\t\t<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>\n\t\t\t<#--  ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->\n\t\t\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n              <#if query_field_no gt 1>  </#if><j-dict-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\"/>\n\t\t\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n              <#if query_field_no gt 1>  </#if><j-dict-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dictCode=\"${po.dictField}\"/>\n\t\t\t<#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n\t\t\t</#if>\n\t\t\t<#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n\t\t\t</#if>\n            <#if query_field_no gt 1>  </#if></a-form-item>\n          <#if query_field_no gt 1>  </#if></a-col>\n\t<#else>\n          <#if query_field_no gt 1>  </#if><a-col :xl=\"10\" :lg=\"11\" :md=\"12\" :sm=\"24\">\n            <#if query_field_no gt 1>  </#if><a-form-item label=\"${po.filedComment}\">\n\t\t\t<#if po.classType=='date'>\n              <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择开始日期\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></j-date>\n              <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n              <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择结束日期\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></j-date>\n\t\t\t<#elseif po.classType=='datetime'>\n              <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择开始时间\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></j-date>\n              <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n              <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择结束时间\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></j-date>\n\t\t\t<#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入最小值\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></a-input>\n              <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入最大值\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></a-input>\n\t\t\t</#if>\n            <#if query_field_no gt 1>  </#if></a-form-item>\n          <#if query_field_no gt 1>  </#if></a-col>\n\t</#if>\n<#assign query_field_no=query_field_no+1>\n</#if>\n<#if !list_need_dict && po.fieldShowType!='popup' && po.dictField?default(\"\")?trim?length gt 1>\n<#assign list_need_dict=true>\n</#if>\n<#if po.classType=='cat_tree' && po.dictText?default(\"\")?trim?length == 0>\n<#assign list_need_category=true>\n</#if>\n<#if po.classType=='pca'>\n<#assign list_need_pca=true>\n</#if>\n</#list>\n<#-- 结束循环 -->\n<#t>\n<#if query_field_no gt 2>\n          </template>\n</#if>\n<#if query_flag>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left;overflow: hidden;\" class=\"table-page-search-submitButtons\">\n              <a-button type=\"primary\" @click=\"searchQuery\" icon=\"search\">查询</a-button>\n              <a-button type=\"primary\" @click=\"searchReset\" icon=\"reload\" style=\"margin-left: 8px\">重置</a-button>\n              <a @click=\"handleToggleSearch\" style=\"margin-left: 8px\">\n                {{ toggleSearchStatus ? '收起' : '展开' }}\n                <a-icon :type=\"toggleSearchStatus ? 'up' : 'down'\"/>\n              </a>\n            </span>\n          </a-col>\n</#if>\n        </a-row>\n      </a-form>\n    </div>\n    <!-- 查询区域-END -->\n    \n    <!-- 操作按钮区域 -->\n    <div class=\"table-operator\">\n      <a-button @click=\"handleAdd\" type=\"primary\" icon=\"plus\">新增</a-button>\n      <a-button type=\"primary\" icon=\"download\" @click=\"handleExportXls('${tableVo.ftlDescription}')\">导出</a-button>\n      <a-upload name=\"file\" :showUploadList=\"false\" :multiple=\"false\" :headers=\"tokenHeader\" :action=\"importExcelUrl\" @change=\"handleImportExcel\">\n        <a-button type=\"primary\" icon=\"import\">导入</a-button>\n      </a-upload>\n      <!-- 高级查询区域 -->\n      <j-super-query :fieldList=\"superFieldList\" ref=\"superQueryModal\" @handleSuperQuery=\"handleSuperQuery\"></j-super-query>\n      <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n        <a-menu slot=\"overlay\">\n          <a-menu-item key=\"1\" @click=\"batchDel\"><a-icon type=\"delete\"/>删除</a-menu-item>\n        </a-menu>\n        <a-button style=\"margin-left: 8px\"> 批量操作 <a-icon type=\"down\" /></a-button>\n      </a-dropdown>\n    </div>\n\n    <!-- table区域-begin -->\n    <div>\n      <div class=\"ant-alert ant-alert-info\" style=\"margin-bottom: 16px;\">\n        <i class=\"anticon anticon-info-circle ant-alert-icon\"></i> 已选择 <a style=\"font-weight: 600\">{{ selectedRowKeys.length }}</a>项\n        <a style=\"margin-left: 24px\" @click=\"onClearSelected\">清空</a>\n      </div>\n\n      <a-table\n        ref=\"table\"\n        size=\"middle\"\n        bordered\n        rowKey=\"id\"\n        class=\"j-table-force-nowrap\"\n        :scroll=\"{x:true}\"\n        :columns=\"columns\"\n        :dataSource=\"dataSource\"\n        :pagination=\"ipagination\"\n        :loading=\"loading\"\n        :rowSelection=\"{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}\"\n        @change=\"handleTableChange\">\n\n        <template slot=\"htmlSlot\" slot-scope=\"text\">\n          <div v-html=\"text\"></div>\n        </template>\n        <template slot=\"imgSlot\" slot-scope=\"text,record\">\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无图片</span>\n          <img v-else :src=\"getImgView(text)\" :preview=\"record.id\" height=\"25px\" alt=\"\" style=\"max-width:80px;font-size: 12px;font-style: italic;\"/>\n        </template>\n        <template slot=\"fileSlot\" slot-scope=\"text\">\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n          <a-button\n            v-else\n            :ghost=\"true\"\n            type=\"primary\"\n            icon=\"download\"\n            size=\"small\"\n            @click=\"downloadFile(text)\">\n            下载\n          </a-button>\n        </template>\n        <#if list_need_pca>\n        <template slot=\"pcaSlot\" slot-scope=\"text\">\n          <div>{{ getPcaText(text) }}</div>\n        </template>\n        </#if>\n\n        <span slot=\"action\" slot-scope=\"text, record\">\n          <a @click=\"handleEdit(record)\">编辑</a>\n\n          <a-divider type=\"vertical\" />\n          <a-dropdown>\n            <a class=\"ant-dropdown-link\">更多 <a-icon type=\"down\" /></a>\n            <a-menu slot=\"overlay\">\n              <a-menu-item>\n                <a @click=\"handleDetail(record)\">详情</a>\n              </a-menu-item>\n              <#if bpm_flag>\n                <a-menu-item v-if=\"record.bpmStatus === '1'\">\n                <a @click=\"startProcess(record)\">发起流程</a>\n              </a-menu-item>\n              </#if>\n              <a-menu-item>\n                <a-popconfirm title=\"确定删除吗?\" @confirm=\"() => handleDelete(record.id)\">\n                  <a>删除</a>\n                </a-popconfirm>\n              </a-menu-item>\n            </a-menu>\n          </a-dropdown>\n        </span>\n\n      </a-table>\n    </div>\n\n    <${Format.humpToShortbar(entityName)}-modal ref=\"modalForm\" @ok=\"modalFormOk\"/>\n  </a-card>\n</template>\n\n<script>\n\n  import { JeecgListMixin } from '@/mixins/JeecgListMixin'\n  import ${entityName}Modal from './modules/${entityName}Modal'\n  <#if list_need_category>\n  import { loadCategoryData } from '@/api/api'\n  </#if>\n  <#if list_need_dict>\n  import {filterMultiDictText} from '@/components/dict/JDictSelectUtil'\n  </#if>\n  <#if list_need_pca>\n  import Area from '@/components/_util/Area'\n  </#if>\n  import '@/assets/less/TableExpand.less'\n  <#if bpm_flag>\n  import { postAction } from '@/api/manage'\n  </#if>\n\n  export default {\n    name: \"${entityName}List\",\n    mixins:[JeecgListMixin],\n    components: {\n      ${entityName}Modal\n    },\n    data () {\n      return {\n        description: '${tableVo.ftlDescription}管理页面',\n        // 表头\n        columns: [\n          {\n            title: '#',\n            dataIndex: '',\n            key:'rowIndex',\n            width:60,\n            align:\"center\",\n            customRender:function (t,r,index) {\n              return parseInt(index)+1;\n            }\n          },\n    <#assign showColNum=0>\n\t<#list columns as po>\n\t<#if po.isShowList =='Y'>\n\t<#assign showColNum=showColNum+1>\n          {\n            title:'${po.filedComment}',\n            align:\"center\",\n            <#if po.sort=='Y'>\n            sorter: true,\n            </#if>\n            <#if po.classType=='date'>\n            dataIndex: '${po.fieldName}',\n            customRender:function (text) {\n              return !text?\"\":(text.length>10?text.substr(0,10):text)\n            }\n            <#elseif po.fieldDbType=='Blob'>\n            dataIndex: '${po.fieldName}String'\n            <#elseif po.classType=='umeditor'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'htmlSlot'}\n            <#elseif po.classType=='file'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'fileSlot'}\n            <#elseif po.classType=='pca'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'pcaSlot'}\n            <#elseif po.classType=='image'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'imgSlot'}\n            <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user'>\n            dataIndex: '${po.fieldName}_dictText'\n            <#elseif po.classType=='cat_tree'>\n            <#if list_need_category>\n            dataIndex: '${po.fieldName}',\n            customRender: (text) => (text ? filterMultiDictText(this.dictOptions['${po.fieldName}'], text) : '')\n            <#else>\n            dataIndex: '${po.fieldName}',\n            customRender: (text, record) => (text ? record['${po.dictText}'] : '')\n            </#if>\n            <#elseif po.classType=='switch'>\n            dataIndex: '${po.fieldName}',\n            <#if po.dictField != 'is_open'>\n            customRender: (text) => (!text ? \"\" : (text == ${po.dictField}[0] ? \"是\" : \"否\"))\n            <#else>\n            customRender: (text) => (!text ? \"\" : (text == \"Y\" ? \"是\" : \"否\"))\n            </#if>\n\t\t\t<#else>\n            dataIndex: '${po.fieldName}'\n\t\t\t</#if>\n          },\n     </#if>\n     </#list>\n          {\n            title: '操作',\n            dataIndex: 'action',\n            align:\"center\",\n            fixed:\"right\",\n            width:147,\n            scopedSlots: { customRender: 'action' },\n          }\n        ],\n        url: {\n          list: \"/${entityPackagePath}/${entityName?uncap_first}/list\",\n          delete: \"/${entityPackagePath}/${entityName?uncap_first}/delete\",\n          deleteBatch: \"/${entityPackagePath}/${entityName?uncap_first}/deleteBatch\",\n          exportXlsUrl: \"/${entityPackagePath}/${entityName?uncap_first}/exportXls\",\n          importExcelUrl: \"${entityPackagePath}/${entityName?uncap_first}/importExcel\",\n          <#if bpm_flag>startProcess: '/act/process/extActProcess/startMutilProcess'</#if>\n        },\n        <#if bpm_flag>\n        flowCode: 'dev_${tableName}_001',\n        </#if>\n        dictOptions:{},\n        superFieldList:[],\n      }\n    },\n    created() {\n      <#if list_need_pca>\n      this.pcaData = new Area()\n      </#if>\n      this.getSuperFieldList();\n    },\n    computed: {\n      importExcelUrl: function(){\n        <#noparse>return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;</#noparse>\n      }\n    },\n    methods: {\n      <#if list_need_pca>\n      getPcaText(code){\n        return this.pcaData.getText(code);\n      },\n      </#if>\n      initDictConfig(){\n      <#list columns as po>\n      <#if (po.isQuery=='Y' || po.isShowList=='Y') && po.classType!='popup'>\n        <#if po.classType=='cat_tree' && list_need_category==true>\n        loadCategoryData({code:\"${po.dictField?default('')}\"}).then((res) => {\n          if (res.success) {\n            this.$set(this.dictOptions, '${po.fieldName}', res.result)\n          }\n        })\n        </#if>\n      </#if>  \n      </#list>\n      },\n      <#if bpm_flag>\n      startProcess(record){\n        this.$confirm({\n          title:'提示',\n          content:'确认提交流程吗?',\n          onOk:()=>{\n            let params = {\n              flowCode: this.flowCode,\n              id: record.id,\n              formUrl: '${entityPackagePath}/modules/${entityName}Form',\n              formUrlMobile: ''\n            }\n            postAction(this.url.startProcess, params).then(res=>{\n              if(res.success){\n                this.$message.success(res.message);\n                this.loadData();\n                this.onClearSelected();\n              }else{\n                this.$message.warning(res.message);\n              }\n            }).catch((e)=>{\n              this.$message.warning('不识别的请求!');\n            })\n          }\n        })\n      },\n      </#if>\n      getSuperFieldList(){\n        <#include \"/common/utils.ftl\">\n        let fieldList=[];\n         <#list columns as po>\n        fieldList.push(${superQueryFieldList(po)})\n         </#list>\n        this.superFieldList = fieldList\n      }\n    }\n  }\n</script>\n<style scoped>\n  @import '~@assets/less/common.less';\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql",
    "content": "<#include \"/common/sql/menu_insert.ftl\">"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n  <a-spin :spinning=\"confirmLoading\">\n    <j-form-container :disabled=\"formDisabled\">\n      <!-- 主表单区域 -->\n      <a-form-model ref=\"form\" :model=\"model\" :rules=\"validatorRules\" slot=\"detail\">\n        <a-row>\n<#assign form_popup = false>\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign bpm_flag=false>\n<#assign form_span = 24>\n<#if tableVo.fieldRowNum==2>\n    <#assign form_span = 12>\n<#elseif tableVo.fieldRowNum==3>\n    <#assign form_span = 8>\n<#elseif tableVo.fieldRowNum==4>\n    <#assign form_span = 6>\n</#if>\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.isShow =='Y' && po.fieldName != 'id'>\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n          <a-col :span=\"${form_span}\" >\n            <a-form-model-item label=\"${po.filedComment}\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" prop=\"${autoStringSuffixForModel(po)}\">\n\t<#if po.classType =='date'>\n              <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='datetime'>\n              <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='time'>\n             <j-time placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='popup'>\n\t     <#assign form_popup=true>\n              <j-popup\n                v-model=\"model.${po.fieldName}\"\n                field=\"${po.fieldName}\"\n                org-fields=\"${po.dictField}\"\n                dest-fields=\"${Format.underlineToHump(po.dictText)}\"\n                code=\"${po.dictTable}\"\n                :multi=\"${po.extendParams.popupMulti?c}\"\n                @input=\"popupCallback\"\n                <#if po.readonly=='Y'>disabled</#if>/>\n    <#elseif po.classType =='sel_depart'>\n              <j-select-depart v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if> />\n<#elseif po.classType =='switch'>\n              <j-switch v-model=\"model.${po.fieldName}\" <#if po.dictField != 'is_open'>:options=\"${po.dictField}\"</#if> <#if po.readonly=='Y'>disabled</#if>></j-switch>\n\t<#elseif po.classType =='pca'>\n\t\t      <j-area-linkage type=\"cascader\" v-model=\"model.${po.fieldName}\" placeholder=\"请输入省市区\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='markdown'>\n\t          <j-markdown-editor v-model=\"model.${autoStringSuffixForModel(po)}\" id=\"${po.fieldName}\"></j-markdown-editor>\n    <#elseif po.classType =='password'>\n\t          <a-input-password v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='sel_user'>\n              <j-select-user-by-dep v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='textarea'>\n              <a-textarea v-model=\"model.${autoStringSuffixForModel(po)}\" rows=\"4\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='list' || po.classType=='radio'>\n              <j-dict-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\" dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='list_multi' || po.classType=='checkbox'>\n              <j-multi-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\" dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='sel_search'>\n              <j-search-select-tag v-model=\"model.${po.fieldName}\" dict=\"${form_field_dictCode}\" <#if po.readonly=='Y'>disabled</#if>/>\n    <#elseif po.classType=='cat_tree'>\n    \t<#assign form_cat_tree = true>\n              <j-category-select v-model=\"model.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\" placeholder=\"请选择${po.filedComment}\" <#if po.dictText?default(\"\")?trim?length gt 1>back=\"${dashedToCamel(po.dictText)}\" @change=\"handleCategoryChange\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n    \t<#if po.dictText?default(\"\")?trim?length gt 1>\n    \t<#assign form_cat_back = \"${po.dictText}\">\n    \t</#if>\n\t<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n              <a-input-number v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType=='file'>\n              <j-upload v-model=\"model.${autoStringSuffixForModel(po)}\" <#if po.readonly=='Y'>disabled</#if> <#if po.uploadnum??>:number=${po.uploadnum}</#if>></j-upload>\n\t<#elseif po.classType=='image'>\n              <j-image-upload isMultiple <#if po.uploadnum??>:number=${po.uploadnum}</#if> v-model=\"model.${po.fieldName}\" <#if po.readonly=='Y'>disabled</#if>></j-image-upload>\n\t<#elseif po.classType=='umeditor'>\n              <j-editor v-model=\"model.${autoStringSuffixForModel(po)}\" <#if po.readonly=='Y'>disabled</#if>/>\n\t\t<#elseif po.classType == 'sel_tree'>\n  \t          <j-tree-select\n                ref=\"treeSelect\"\n                placeholder=\"请选择${po.filedComment}\"\n                v-model=\"model.${autoStringSuffixForModel(po)}\"\n                <#if po.dictText??>\n                <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n                dict=\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\"\n                <#elseif po.dictText?split(',')[1]??>\n                pidField=\"${po.dictText?split(',')[1]}\"\n                <#elseif po.dictText?split(',')[3]??>\n                hasChildField=\"${po.dictText?split(',')[3]}\"\n                </#if>\n                </#if>\n                pidValue=\"${po.dictField}\"\n                <#if po.readonly=='Y'>disabled</#if>>\n              </j-tree-select>\n\t<#else>\n              <a-input v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>></a-input>\n    </#if>\n            </a-form-model-item>\n          </a-col>\n</#if>\n</#list>\n        </a-row>\n      </a-form-model>\n    </j-form-container>\n      <!-- 子表单区域 -->\n    <a-tabs v-model=\"activeKey\" @change=\"handleChangeTabs\">\n<#list subTables as sub><#rt/>\n  <#if sub.foreignRelationType =='1'>\n      <a-tab-pane tab=\"${sub.ftlDescription}\" :key=\"refKeys[${sub_index}]\" :forceRender=\"true\">\n        <${Format.humpToShortbar(sub.entityName)}-form ref=\"${sub.entityName?uncap_first}Form\" @validateError=\"validateError\" :disabled=\"formDisabled\"></${Format.humpToShortbar(sub.entityName)}-form>\n      </a-tab-pane>\n      \n  <#else>\n      <a-tab-pane tab=\"${sub.ftlDescription}\" :key=\"refKeys[${sub_index}]\" :forceRender=\"true\">\n        <j-vxe-table\n          keep-source\n          :ref=\"refKeys[${sub_index}]\"\n          :loading=\"${sub.entityName?uncap_first}Table.loading\"\n          :columns=\"${sub.entityName?uncap_first}Table.columns\"\n          :dataSource=\"${sub.entityName?uncap_first}Table.dataSource\"\n          :maxHeight=\"300\"\n          :disabled=\"formDisabled\"\n          :rowNumber=\"true\"\n          :rowSelection=\"true\"\n          :toolbar=\"true\"\n          />\n      </a-tab-pane>\n  </#if>\n</#list>\n    </a-tabs>\n    <#if bpm_flag>\n    <a-row v-if=\"showFlowSubmitButton\" style=\"text-align: center;width: 100%;margin-top: 16px;\"><a-button icon=\"check\" style=\"width: 126px\" type=\"primary\" @click=\"handleOk\">提 交</a-button></a-row>\n    </#if>\n  </a-spin>\n</template>\n\n<script>\n\n  import { getAction } from '@/api/manage'\n  import { JVxeTableModelMixin } from '@/mixins/JVxeTableModelMixin.js'\n  import { JVXETypes } from '@/components/jeecg/JVxeTable'\n  import { getRefPromise,VALIDATE_FAILED} from '@/components/jeecg/JVxeTable/utils/vxeUtils.js'\n  import { validateDuplicateValue } from '@/utils/util'\n  import JFormContainer from '@/components/jeecg/JFormContainer'\n  <#list subTables as sub>\n  <#if sub.foreignRelationType =='1'>\n  import ${sub.entityName}Form from './${sub.entityName}Form.vue'\n  </#if>\n  </#list>\n\n  export default {\n    name: '${entityName}Form',\n    mixins: [JVxeTableModelMixin],\n    components: {\n      JFormContainer,\n    <#list subTables as sub>\n    <#if sub.foreignRelationType =='1'>\n      ${sub.entityName}Form,\n    </#if>\n    </#list>\n    },\n    data() {\n      return {\n        labelCol: {\n          xs: { span: 24 },\n          sm: { span: 5 },\n        },\n        wrapperCol: {\n          xs: { span: 24 },\n          sm: { span: 16 },\n        },\n        model:{\n           <#include \"/common/init/initValue.ftl\">\n         },\n        // 新增时子表默认添加几行空数据\n        addDefaultRowNum: 1,\n        <#include \"/common/validatorRulesTemplate/main.ftl\">\n        refKeys: [<#list subTables as sub>'${sub.entityName?uncap_first}', </#list>],\n        <#assign hasOne2Many = false>\n        tableKeys:[<#list subTables as sub><#if sub.foreignRelationType =='0'>'${sub.entityName?uncap_first}', <#assign hasOne2Many = true></#if></#list>],\n        activeKey: '${subTables[0].entityName?uncap_first}',\n<#list subTables as sub><#rt/>\n        // ${sub.ftlDescription}\n        ${sub.entityName?uncap_first}Table: {\n          loading: false,\n          dataSource: [],\n          columns: [\n<#if sub.foreignRelationType =='0'>\n<#assign popupBackFields = \"\">\n\n<#-- 循环子表的列 开始 -->\n<#list sub.colums as col><#rt/>\n<#if col.isShow =='Y'>\n    <#if col.filedComment !='外键' >\n            {\n              title: '${col.filedComment}',\n              key: '${autoStringSuffixForModel(col)}',\n      <#if col.classType =='date'>\n              type: JVXETypes.date,\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif col.classType =='datetime'>\n              type: JVXETypes.datetime,\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n       <#elseif col.classType =='textarea'>\n               type: JVXETypes.textarea,\n               <#if col.readonly=='Y'>\n               disabled:true,\n               </#if>\n      <#elseif \"int,decimal,double,\"?contains(col.classType)>\n              type: JVXETypes.inputNumber,\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif col.classType =='list' || col.classType =='radio'>\n              type: JVXETypes.select,\n              options:[],\n              <#if col.dictTable?default(\"\")?trim?length gt 1>\n              dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n              <#else>\n              dictCode:\"${col.dictField}\",\n              </#if>\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif col.classType =='list_multi' || col.classType =='checkbox'>\n              type: JVXETypes.selectMultiple,\n              options:[],\n              <#if col.dictTable?default(\"\")?trim?length gt 1>\n              dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n              <#else>\n              dictCode:\"${col.dictField}\",\n              </#if>\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif col.classType =='sel_search'>\n              type: JVXETypes.selectSearch,\n              <#if col.dictTable?default(\"\")?trim?length gt 1>\n              dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n              <#else>\n              dictCode:\"${col.dictField}\",\n              </#if>\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif col.classType =='sel_depart'>\n              type: JVXETypes.departSelect,\n              <#if col.extendParams.multiSelect?default(true) == false>\n              multi: false,\n              </#if>\n              <#if col.extendParams.store?default(\"\")?trim?length gt 1>\n              store: \"${col.extendParams.store}\",\n              </#if>\n              <#if col.extendParams.text?default(\"\")?trim?length gt 1>\n              text: \"${col.extendParams.text}\",\n              </#if>\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif col.classType =='sel_user'>\n              type: JVXETypes.userSelect,\n              <#if col.extendParams.multiSelect?default(true) == false>\n              multi: false,\n              </#if>\n              <#if col.extendParams.store?default(\"\")?trim?length gt 1>\n              store: \"${col.extendParams.store}\",\n              </#if>\n              <#if col.extendParams.text?default(\"\")?trim?length gt 1>\n              text: \"${col.extendParams.text}\",\n              </#if>\n              <#if col.readonly=='Y'>\n              disabled: true,\n              </#if>\n      <#elseif col.classType =='image'>\n              type: JVXETypes.image,\n              token:true,\n              responseName:\"message\",\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n              <#if col.uploadnum??>\n              number: ${col.uploadnum},\n              </#if>\n      <#elseif col.classType =='file'>\n              type: JVXETypes.file,\n              token:true,\n              responseName:\"message\",\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n              <#if col.uploadnum??>\n              number: ${col.uploadnum},\n              </#if>\n      <#elseif col.classType =='switch'>\n              type: JVXETypes.checkbox,\n               <#if col.dictField == 'is_open'>\n                customValue: ['Y', 'N'],\n                <#else>\n                customValue: ${col.dictField},\n                </#if>\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#elseif col.classType =='popup'>\n        <#if popupBackFields?length gt 0>\n            <#assign popupBackFields = \"${popupBackFields}\"+\",\"+\"${col.dictText}\">\n        <#else>\n            <#assign popupBackFields = \"${col.dictText}\">\n        </#if>\n              type: JVXETypes.popup,\n              popupCode:\"${col.dictTable}\",\n              field:\"${col.dictField}\",\n              orgFields:\"${col.dictField}\",\n              destFields:\"${Format.underlineToHump(col.dictText)}\",\n              <#if col.readonly=='Y'>\n              disabled:true,\n              </#if>\n      <#else>\n               type: JVXETypes.input,\n               <#if col.readonly=='Y'>\n               disabled:true,\n               </#if>\n      </#if>\n      <#if col.classType =='list_multi' || col.classType =='checkbox'>\n              width:\"250px\",\n      <#else>\n              width:\"200px\",\n      </#if>\n      <#if col.classType =='file'>\n              placeholder: '请选择文件',\n      <#else>\n              placeholder: '请输入${'$'}{title}',\n      </#if>\n      <#if col.defaultVal??>\n        <#if col.fieldDbType==\"BigDecimal\" || col.fieldDbType==\"double\" || col.fieldDbType==\"int\">\n              defaultValue:${col.defaultVal},\n              <#else>\n              defaultValue:\"${col.defaultVal}\",\n        </#if>\n      <#else>\n              defaultValue:'',\n      </#if>\n      <#-- 子表的校验 -->\n      <#assign subFieldValidType = col.fieldValidType!''>\n      <#-- 非空校验 -->\n      <#if col.nullable == 'N' || subFieldValidType == '*'>\n              validateRules: [{ required: true, message: '${'$'}{title}不能为空' }],\n      <#-- 其他情况下，只要有值就被认为是正则校验 -->\n      <#elseif subFieldValidType?length gt 0>\n        <#assign subMessage = '格式不正确'>\n        <#if subFieldValidType == 'only' >\n          <#assign subMessage = '不能重复'>\n        </#if>\n              validateRules: [{ pattern: \"${subFieldValidType}\", message: \"${'$'}{title}${subMessage}\" }],\n      </#if>\n            },\n    </#if>\n</#if>\n</#list>\n<#-- 循环子表的列 结束 -->\n\n<#-- 处理popup的隐藏列 -->\n<#if popupBackFields?length gt 0>\n<#list popupBackFields?split(\",\") as item>\n<#if item?length gt 0>\n<#assign tempItemFlag = true>\n\n<#list sub.colums as col>\n<#if col.isShow =='Y' && col.fieldName == item>\n<#assign tempItemFlag = false>\n</#if>\n</#list>\n<#if tempItemFlag>\n            {\n              title: '${item}',\n              key: '${item}',\n              type:\"hidden\"\n            },\n</#if>\n</#if>\n</#list>\n</#if>\n</#if>\n          ]\n        },\n</#list>\n        url: {\n          add: \"/${entityPackagePath}/${entityName?uncap_first}/add\",\n          edit: \"/${entityPackagePath}/${entityName?uncap_first}/edit\",\n          queryById: \"/${entityPackagePath}/${entityName?uncap_first}/queryById\",\n<#list subTables as sub><#rt/>\n          ${sub.entityName?uncap_first}: {\n            list: '/${entityPackagePath}/${entityName?uncap_first}/query${sub.entityName}ByMainId'\n          },\n</#list>\n        }\n      }\n    },\n    props: {\n    <#if bpm_flag>\n      //流程表单data\n      formData: {\n        type: Object,\n        default: () => ({}),\n        required: false\n      },\n      //表单模式：false流程表单 true普通表单\n      formBpm: {\n        type: Boolean,\n        default: false,\n        required: false\n      },\n      </#if>\n      //表单禁用\n      disabled: {\n        type: Boolean,\n        default: false,\n        required: false\n      }\n    },\n    computed: {\n      formDisabled(){\n         <#if bpm_flag>\n        if(this.formBpm===true){\n          if(this.formData.disabled===false){\n            return false\n          }\n          return true\n        }\n         </#if>\n        return this.disabled\n      },\n       <#if bpm_flag>\n      showFlowSubmitButton(){\n        if(this.formBpm===true){\n          if(this.formData.disabled===false){\n            return true\n          }\n        }\n        return false\n      }\n      </#if>\n    },\n    created () {\n     <#if bpm_flag>\n      //如果是流程中表单，则需要加载流程表单data\n      this.showFlowData();\n     </#if>\n    },\n    methods: {\n      addBefore(){\n<#list subTables as sub><#rt/>\n  <#if sub.foreignRelationType =='1'>\n        this.$refs.${sub.entityName?uncap_first}Form.clearFormData()\n  <#else>\n        this.${sub.entityName?uncap_first}Table.dataSource=[]\n  </#if>\n</#list>\n      },\n      getAllTable() {\n        <#if hasOne2Many==true>\n        let values = this.tableKeys.map(key => getRefPromise(this, key))\n        return Promise.all(values)\n        <#else>\n        return new Promise(resolve => {\n          resolve([]);\n        })\n        </#if>\n      },\n      /** 调用完edit()方法之后会自动调用此方法 */\n      editAfter() {\n        this.$nextTick(() => {\n<#list subTables as sub><#rt/>\n<#if sub.foreignRelationType =='1'>\n          this.$refs.${sub.entityName?uncap_first}Form.initFormData(this.url.${sub.entityName?uncap_first}.list,this.model.id)\n</#if>\n</#list>         \n        })\n        // 加载子表数据\n        if (this.model.id) {\n          let params = { id: this.model.id }\n<#list subTables as sub><#rt/>\n<#if sub.foreignRelationType =='0'>\n          this.requestSubTableData(this.url.${sub.entityName?uncap_first}.list, params, this.${sub.entityName?uncap_first}Table)\n</#if>\n</#list>\n        }\n      },\n      //校验所有一对一子表表单\n        validateSubForm(allValues){\n            return new Promise((resolve,reject)=>{\n              Promise.all([\n          <#list subTables as sub><#rt/>\n            <#if sub.foreignRelationType =='1'>\n                  this.$refs.${sub.entityName?uncap_first}Form.validate(${sub_index}),\n            </#if>\n          </#list>\n              ]).then(() => {\n                resolve(allValues)\n              }).catch(e => {\n                if (e.error === VALIDATE_FAILED) {\n                  // 如果有未通过表单验证的子表，就自动跳转到它所在的tab\n                  this.activeKey = e.index == null ? this.activeKey : this.refKeys[e.index]\n                } else {\n                  console.error(e)\n                }\n              })\n            })\n        },\n      /** 整理成formData */\n      classifyIntoFormData(allValues) {\n        let main = Object.assign(this.model, allValues.formValue)\n        return {\n          ...main, // 展开\n<#assign subManyIndex = 0>\n<#list subTables as sub><#rt/>\n<#if sub.foreignRelationType =='0'>\n          ${sub.entityName?uncap_first}List: allValues.tablesValue[${subManyIndex}].tableData,\n          <#assign subManyIndex = subManyIndex+1>\n<#else>\n          ${sub.entityName?uncap_first}List: this.$refs.${sub.entityName?uncap_first}Form.getFormData(),\n</#if>\n</#list>\n        }\n      },\n      <#if bpm_flag>\n      //渲染流程表单数据\n      showFlowData(){\n        if(this.formBpm === true){\n          let params = {id:this.formData.dataId};\n          getAction(this.url.queryById,params).then((res)=>{\n            if(res.success){\n              this.edit (res.result);\n            }\n          })\n        }\n      },\n      </#if>\n      validateError(msg){\n        this.$message.error(msg)\n      },\n     <#if form_popup>\n     popupCallback(value,row){\n      this.model = Object.assign(this.model, row);\n     },\n    </#if>\n   <#if form_cat_tree>\n     handleCategoryChange(value,backObj){\n      this.model = Object.assign(this.model, backObj);\n      }\n   </#if>\n\n    }\n  }\n</script>\n\n<style scoped>\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n  <j-modal\n    :title=\"title\"\n    :width=\"1200\"\n    :visible=\"visible\"\n    :maskClosable=\"false\"\n    switchFullscreen\n    @ok=\"handleOk\"\n    :okButtonProps=\"{ class:{'jee-hidden': disableSubmit} }\"\n    @cancel=\"handleCancel\">\n    <${Format.humpToShortbar(entityName)}-form ref=\"realForm\" @ok=\"submitCallback\" :disabled=\"disableSubmit\"/>\n  </j-modal>\n</template>\n\n<script>\n\n  import ${entityName}Form from './${entityName}Form'\n\n  export default {\n    name: '${entityName}Modal',\n    components: {\n      ${entityName}Form\n    },\n    data() {\n      return {\n        title:'',\n        width:800,\n        visible: false,\n        disableSubmit: false\n      }\n    },\n    methods:{\n      add () {\n        this.visible=true\n        this.$nextTick(()=>{\n          this.$refs.realForm.add();\n        })\n      },\n      edit (record) {\n        this.visible=true\n        this.$nextTick(()=>{\n          this.$refs.realForm.edit(record);\n        })\n      },\n      close () {\n        this.$emit('close');\n        this.visible = false;\n      },\n      handleOk () {\n        this.$refs.realForm.handleOk();\n      },\n      submitCallback(){\n        this.$emit('ok');\n        this.visible = false;\n      },\n      handleCancel () {\n        this.close()\n      }\n    }\n  }\n</script>\n\n<style scoped>\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<#list subTables as sub>\n<#if sub.foreignRelationType=='1'>\n#segment#${sub.entityName}Form.vue\n<template>\n  <j-form-container :disabled=\"disabled\">\n      <a-form-model ref=\"form\" :model=\"model\" :rules=\"validatorRules\" slot=\"detail\">\n        <a-row>\n<#assign form_popup = false>\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign form_span = 24>\n<#if tableVo.fieldRowNum == 2>\n  <#assign form_span = 12>\n<#elseif tableVo.fieldRowNum==3>\n  <#assign form_span = 8>\n<#elseif tableVo.fieldRowNum==4>\n  <#assign form_span = 6>\n</#if>\n<#list sub.colums as po>\n<#if po.isShow =='Y' && po.fieldName != 'id'>\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n          <a-col :span=\"${form_span}\">\n            <a-form-model-item label=\"${po.filedComment}\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" prop=\"${autoStringSuffixForModel(po)}\">\n\t<#if po.classType =='date'>\n              <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\"  style=\"width: 100%\"/>\n\t<#elseif po.classType =='datetime'>\n              <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\"  :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" style=\"width: 100%\"/>\n\t<#elseif po.classType =='time'>\n              <j-time placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\"  style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='popup'>\n\t    <#assign form_popup=true>\n              <j-popup\n                v-model=\"model.${po.fieldName}\"\n                field=\"${po.fieldName}\"\n                org-fields=\"${po.dictField}\"\n                dest-fields=\"${Format.underlineToHump(po.dictText)}\"\n                code=\"${po.dictTable}\"\n                :multi=\"${po.extendParams.popupMulti?c}\"\n                @input=\"popupCallback\"/>\n    <#elseif po.classType =='sel_depart'>\n              <j-select-depart v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if> />\n<#elseif po.classType =='switch'>\n              <j-switch v-model=\"model.${po.fieldName}\" <#if po.dictField!= 'is_open'>:options=\"${po.dictField}\"</#if>></j-switch>\n\t<#elseif po.classType =='pca'>\n\t\t      <j-area-linkage type=\"cascader\" v-model=\"model.${po.fieldName}\" placeholder=\"请输入省市区\"/>\n\t<#elseif po.classType =='markdown'>\n\t          <j-markdown-editor v-model=\"model.${autoStringSuffixForModel(po)}\" id=\"${po.fieldName}\"></j-markdown-editor>\n    <#elseif po.classType =='password'>\n\t          <a-input-password v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\"/>\n\t<#elseif po.classType =='sel_user'>\n              <j-select-user-by-dep v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='textarea'>\n              <a-textarea v-model=\"model.${autoStringSuffixForModel(po)}\" rows=\"4\" placeholder=\"请输入${po.filedComment}\"/>\n\t<#elseif po.classType=='list' || po.classType=='radio'>\n              <j-dict-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\"  dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\"/>\n\t<#elseif po.classType=='list_multi' || po.classType=='checkbox'>\n              <j-multi-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\"  dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\"/>\n\t<#elseif po.classType=='sel_search'>\n              <j-search-select-tag v-model=\"model.${po.fieldName}\" dict=\"${form_field_dictCode}\" />\n    <#elseif po.classType=='cat_tree'>\n    \t<#assign form_cat_tree = true>\n              <j-category-select v-model=\"model.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\" placeholder=\"请选择${po.filedComment}\" <#if po.dictText?default(\"\")?trim?length gt 1>back=\"${dashedToCamel(po.dictText)}\" @change=\"handleCategoryChange\"</#if>/>\n    \t<#if po.dictText?default(\"\")?trim?length gt 1>\n    \t<#assign form_cat_back = \"${po.dictText}\">\n    \t</#if>\n\t<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n              <a-input-number v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" style=\"width: 100%\"/>\n\t<#elseif po.classType=='file'>\n              <j-upload v-model=\"model.${po.fieldName}\" ></j-upload>\n\t<#elseif po.classType=='image'>\n              <j-image-upload isMultiple v-model=\"model.${po.fieldName}\"></j-image-upload>\n\t<#elseif po.classType=='umeditor'>\n              <j-editor v-model=\"model.${autoStringSuffixForModel(po)}\"/>\n\t<#else>\n              <a-input v-model=\"model.${autoStringSuffixForModel(po)}\" placeholder=\"请输入${po.filedComment}\"></a-input>\n    </#if>\n            </a-form-model-item>\n          </a-col>\n</#if>\n</#list>\n        </a-row>\n      </a-form-model>\n  </j-form-container>\n</template>\n<script>\n  import { getAction } from '@/api/manage'\n  import { validateDuplicateValue } from '@/utils/util'\n  import JFormContainer from '@/components/jeecg/JFormContainer'\n import { VALIDATE_FAILED } from '@/components/jeecg/JVxeTable/utils/vxeUtils.js'\n  export default {\n    name: '${sub.entityName}Form',\n    components: {\n      JFormContainer\n    },\n    props:{\n      disabled: {\n        type: Boolean,\n        default: false,\n        required: false\n      }\n    },\n    data () {\n      return {\n        model:{\n         <#include \"/common/init/initValueSub.ftl\">\n        },\n        labelCol: {\n          xs: { span: 24 },\n          sm: { span: 5 },\n        },\n        wrapperCol: {\n          xs: { span: 24 },\n          sm: { span: 16 },\n        },\n        <#include \"/common/validatorRulesTemplate/sub.ftl\">\n        confirmLoading: false,\n      }\n    },\n    created () {\n    //备份model原始值\n      this.modelDefault = JSON.parse(JSON.stringify(this.model));\n    },\n    methods:{\n      initFormData(url,id){\n        this.clearFormData()\n        if(!id){\n          this.edit(this.modelDefault)\n        }else{\n          getAction(url,{id:id}).then(res=>{\n            if(res.success){\n              let records = res.result\n              if(records && records.length>0){\n                this.edit(records[0])\n              }\n            }\n          })\n        }\n      },\n      edit(record){\n        this.model = Object.assign({}, record)\n      },\n      getFormData(){\n        let formdata_arr = []\n        this.$refs.form.validate(valid => {\n          if (valid) {\n            let isNullObj = true\n            Object.keys(this.model).forEach(key=>{\n              if(this.model[key]){\n                isNullObj = false\n              }\n            })\n            if(!isNullObj){\n              formdata_arr.push(this.model)\n            }\n          }else{\n            this.$emit(\"validateError\",\"${sub.ftlDescription}表单校验未通过\");\n          }\n        })\n        return formdata_arr;\n      },\n       validate(index){\n        return new Promise((resolve, reject) => {\n          // 验证主表表单\n         this.$refs.form.validate(valid => {\n            !valid ? reject({ error: VALIDATE_FAILED ,index}) : resolve()\n          })\n        }).then(values => {\n          return Promise.resolve()\n        }).catch(error => {\n          return Promise.reject(error)\n        })\n\n      },\n      <#if form_popup>\n      popupCallback(value,row){\n       this.model = Object.assign(this.model, row);\n      },\n      </#if>\n      clearFormData(){\n        this.$refs.form.clearValidate()\n      },\n      <#if form_cat_tree>\n      handleCategoryChange(value,backObj){\n      }\n      </#if>\n    }\n  }\n</script>\n</#if>\n</#list>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei",
    "content": "﻿<template>\n  <div>\n<#assign list_need_category=false>\n<#assign list_need_pca=false>\n<#assign bpm_flag=false>\n<#assign list_has_popup_dict=false>\n<#assign buttonList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n  <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n</#if>\n<#-- 开始循环 -->\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.classType=='cat_tree' && po.dictText?default(\"\")?trim?length == 0>\n<#assign list_need_category=true>\n</#if>\n<#if po.classType=='pca'>\n<#assign list_need_pca=true>\n</#if>\n<#if po.classType=='popup_dict'>\n<#assign list_has_popup_dict=true>\n</#if>\n</#list>\n<#-- 结束循环 -->\n    <!--引用表格-->\n   <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n     <!--插槽:table标题-->\n      <template #tableTitle>\n          <a-button type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:add'\"  @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\"> 新增</a-button>\n          <a-button  type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:exportXls'\"  preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n          <j-upload-button  type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:importExcel'\"  preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n     <#if buttonList?size gt 0>\n      <#list buttonList as btn>\n         <#if btn.buttonStyle == 'button'>\n           <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n         </#if>\n       </#list>\n     </#if>\n          <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n              <template #overlay>\n                <a-menu>\n                  <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                    <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                    删除\n                  </a-menu-item>\n                </a-menu>\n              </template>\n              <a-button v-auth=\"'${entityPackage}:${tableName}:deleteBatch'\">批量操作\n                <Icon icon=\"mdi:chevron-down\"></Icon>\n              </a-button>\n        </a-dropdown>\n        <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n        <!-- 高级查询 -->\n        <super-query :config=\"superQueryConfig\" @search=\"handleSuperQuery\" />\n        <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n      </template>\n       <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\"/>\n      </template>\n      <!--字段回显插槽-->\n      <template v-slot:bodyCell=\"{ column, record, index, text }\">\n      <#list columns as po>\n        <#if po.classType=='umeditor' || po.classType=='pca' || po.classType=='file'>\n        <template v-if=\"column.dataIndex==='${po.fieldName}'\">\n        <#if po.classType=='umeditor'>\n          <!--富文本件字段回显插槽-->\n          <div v-html=\"text\"></div>\n        </#if>\n        <#if po.classType=='pca'>\n          <!--省市区字段回显插槽-->\n          {{ getAreaTextByCode(text) }}\n        </#if>\n        <#if po.classType=='file'>\n          <!--文件字段回显插槽-->\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n          <a-button v-else :ghost=\"true\" type=\"primary\" preIcon=\"ant-design:download-outlined\" size=\"small\" @click=\"downloadFile(text)\">下载</a-button>\n        </#if>\n        </template>\n        </#if>\n      </#list>\n      </template>\n    </BasicTable>\n    <!-- 表单区域 -->\n    <${entityName}Modal @register=\"registerModal\" @success=\"handleSuccess\"></${entityName}Modal>\n    <#if bpm_flag==true>\n      <!-- 审批记录 -->\n      <BpmPictureModal @register=\"registerBpmModal\" />\n    </#if>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"${entityPackage}-${entityName?uncap_first}\" setup>\n  import {ref, reactive, computed, unref} from 'vue';\n  import {BasicTable, useTable, TableAction} from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage'\n  import {useModal} from '/@/components/Modal';\n  import ${entityName}Modal from './components/${entityName}Modal.vue'\n  import {columns, searchFormSchema, superQuerySchema} from './${entityName}.data';\n  import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './${entityName}.api';\n  import {downloadFile} from '/@/utils/common/renderUtils';\n  import { useUserStore } from '/@/store/modules/user';\n  import { useMessage } from '/@/hooks/web/useMessage';\n<#if list_need_pca>\n  import { getAreaTextByCode } from '/@/components/Form/src/utils/Area';\n</#if>\n  <#if list_need_category>\n  import { loadCategoryData } from '/@/api/common/api'\n  import { getAuthCache, setAuthCache } from '/@/utils/auth';\n  import { DB_DICT_DATA_KEY } from '/@/enums/cacheEnum';\n  </#if>\n<#if list_has_popup_dict>\n  import {getPopDictByCode} from \"@/utils/dict\";\n  import {filterMultiDictText} from \"@/utils/dict/JDictSelectUtil\";\n</#if>\n  import { getDateByPicker } from '/@/utils';\n  //日期个性化选择\n  const fieldPickers = reactive({\n  <#list columns as po>\n    <#if po.extendParams?exists && po.extendParams.picker?exists>\n    ${po.fieldName}: '${po.extendParams.picker}',\n    </#if>\n  </#list>\n  });\n  <#if bpm_flag==true>\n  import { startProcess } from '/@/api/common/api';\n\n  const [registerBpmModal, { openModal: bpmPicModal }] = useModal();\n  </#if>\n  const queryParam = reactive<any>({});\n  const checkedKeys = ref<Array<string | number>>([]);\n  const userStore = useUserStore();\n  const { createMessage } = useMessage();\n  //注册model\n  const [registerModal, {openModal}] = useModal();\n   //注册table数据\n  const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({\n      tableProps:{\n           title: '${tableVo.ftlDescription}',\n           api: list,\n           columns,\n           canResize:true,\n           formConfig: {\n                //labelWidth: 120,\n                schemas: searchFormSchema,\n                autoSubmitOnEnter:true,\n                showAdvancedButton:true,\n                fieldMapToNumber: [\n                   <#list columns as po>\n                   <#if po.isQuery=='Y'>\n                   <#if po.queryMode=='group'>\n                   <#-- update-begin---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n                   <#if po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal' || po.classType=='time'>\n                   <#-- update-end---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n                   ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end']],\n                   </#if>\n                   </#if>\n                   </#if>\n                   </#list>\n                ],\n                fieldMapToTime: [\n                <#list columns as po>\n                <#if po.isQuery=='Y'>\n                <#if po.queryMode=='group'>\n                <#if po.classType=='date'>\n                   ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end'], 'YYYY-MM-DD'],\n                <#elseif po.classType=='datetime'>\n                   ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end'], 'YYYY-MM-DD HH:mm:ss'],\n                </#if>\n                </#if>\n                </#if>\n                </#list>\n                ],\n            },\n           actionColumn: {\n               width: 120,\n               fixed:'right'\n           },\n           beforeFetch: (params) => {\n              if (params && fieldPickers) {\n                for (let key in fieldPickers) {\n                  if (params[key]) {\n                    params[key] = getDateByPicker(params[key], fieldPickers[key]);\n                  }\n                }\n              }\n             return Object.assign(params, queryParam);\n           },\n           <#if list_has_popup_dict>\n           afterFetch: afterFetch\n           </#if>\n        },\n        exportConfig: {\n            name:\"${tableVo.ftlDescription}\",\n            url: getExportUrl,\n            params: queryParam,\n        },\n        importConfig: {\n            url: getImportUrl,\n            success: handleSuccess\n        },\n    })\n\n  const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext\n\n<#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n  // 高级查询配置\n  const superQueryConfig = reactive(superQuerySchema);\n\n  /**\n   * 高级查询事件\n   */\n  function handleSuperQuery(params) {\n    Object.keys(params).map((k) => {\n      queryParam[k] = params[k];\n    });\n    reload();\n  }\n<#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n\n   /**\n    * 新增事件\n    */\n  function handleAdd() {\n     openModal(true, {\n       isUpdate: false,\n       showFooter: true,\n     });\n  }\n   /**\n    * 编辑事件\n    */\n  function handleEdit(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: true,\n     });\n   }\n   /**\n    * 详情\n   */\n  function handleDetail(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: false,\n     });\n   }\n   /**\n    * 删除事件\n    */\n  async function handleDelete(record) {\n     await deleteOne({id: record.id}, handleSuccess);\n   }\n   /**\n    * 批量删除事件\n    */\n  async function batchHandleDelete() {\n     await batchDelete({ids: selectedRowKeys.value},handleSuccess);\n   }\n   /**\n    * 成功回调\n    */\n  function handleSuccess() {\n      (selectedRowKeys.value = []) && reload();\n   }\n   /**\n      * 操作栏\n      */\n  function getTableAction(record){\n       return [\n         {\n           label: '编辑',\n           onClick: handleEdit.bind(null, record),\n           auth: '${entityPackage}:${tableName}:edit'\n         }\n       ]\n   }\n\n  <#if bpm_flag==true>\n  /**\n   * 提交流程\n   */\n  async function handleProcess(record) {\n    let params = {\n      flowCode: 'dev_${tableName}_001',\n      id: record.id,\n      formUrl: '${entityPackagePath}/components/${entityName}Form',\n      formUrlMobile: ''\n    }\n    await startProcess(params);\n    handleSuccess();\n  }\n\n   /**\n   * 审批进度\n   */\n  async function handlePreviewPic(record) {\n    bpmPicModal(true, {\n      flowCode: 'dev_${tableName}_001',\n      dataId: record.id,\n    });\n  }\n  </#if>\n\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record){\n    <#if bpm_flag==true>\n    let dropDownAction = [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      }, {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft'\n        },\n        auth: '${entityPackage}:${tableName}:delete'\n      },\n        {\n          label: '审批进度',\n          onClick: handlePreviewPic.bind(null, record),\n          ifShow: !!record.bpmStatus && record.bpmStatus !== '1',\n        }\n <#if buttonList?size gt 0>\n     <#list buttonList as btn>\n        <#if btn.buttonStyle == 'link'>\n        ,{\n           label: '${btn.buttonName}',\n           onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n         }\n        </#if>\n      </#list>\n  </#if>\n    ];\n    if(record.bpmStatus == '1' || !record.bpmStatus){\n      dropDownAction.push({\n        label: '发起流程',\n        popConfirm: {\n          title: '确认提交流程吗？',\n          confirm: handleProcess.bind(null, record),\n          placement: 'topLeft',\n        }\n      })\n    }\n    return dropDownAction;\n    <#else>\n    return [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      }, {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft'\n        },\n        auth: '${entityPackage}:${tableName}:delete'\n      }\n   <#if buttonList?size gt 0>\n       <#list buttonList as btn>\n          <#if btn.buttonStyle == 'link'>\n          ,{\n             label: '${btn.buttonName}',\n             onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n           }\n          </#if>\n        </#list>\n    </#if>\n    ]\n    </#if>\n  }\n\n    <#if list_need_category>\n   /**\n    * 初始化字典配置\n   */\n    function initDictConfig(){\n     <#list columns as po>\n     <#if (po.isQuery=='Y' || po.isShowList=='Y') && po.classType!='popup'>\n       <#if po.classType=='cat_tree' && list_need_category==true>\n       loadCategoryData({code:'${po.dictField?default(\"\")}'}).then((res) => {\n         if (res) {\n            const allDictDate = userStore.getAllDictItems;\n            if(!allDictDate['${po.dictField?default(\"\")}']){\n              userStore.setAllDictItems({...allDictDate,'${po.dictField?default(\"\")}':res});\n            }\n         }\n       })\n       </#if>\n     </#if>\n     </#list>\n   }\n   initDictConfig();\n    </#if>\n\n    <#if list_has_popup_dict>\n   /**\n    * 翻译Popup字典配置\n   */\n    async function afterFetch(records){\n <#list columns as po>\n    <#if po.isQuery=='Y' || po.isShowList=='Y'>\n      <#if po.classType=='popup_dict' && list_has_popup_dict==true>\n      const ${po.fieldName}Keys = [...new Set(records.map((item) => item['${po.fieldName}']).flatMap((item) => item && item.split(',')))];\n      if(${po.fieldName}Keys && ${po.fieldName}Keys.length){\n       const dictOptions = await getPopDictByCode(${po.fieldName}Keys.join(','), '${po.dictTable},${po.dictField},${po.dictText}');\n       records.forEach((item) => {\n         item['${po.fieldName}_dictText'] = filterMultiDictText(dictOptions, item['${po.fieldName}']);\n       });\n      }\n      </#if>\n    </#if>\n </#list>\n     return records;\n   }\n    </#if>\n\n<#if buttonList?size gt 0>\n  <#list buttonList as btn>\n  <#if btn.buttonStyle=='button'>\n     function handle${btn.buttonCode?cap_first}(){\n        createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n     }\n  </#if>\n   <#if btn.buttonStyle=='link'>\n    function handle${btn.buttonCode?cap_first}(record){\n      createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n    }\n   </#if>\n  </#list>\n</#if>\n</script>\n\n<style lang=\"less\" scoped>\n<#include \"/common/form/vue3SearchStyle.ftl\">\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi",
    "content": "import {defHttp} from '/@/utils/http/axios';\nimport { useMessage } from \"/@/hooks/web/useMessage\";\n\nconst { createConfirm } = useMessage();\n\nenum Api {\n  list = '/${entityPackagePath}/${entityName?uncap_first}/list',\n  save='/${entityPackagePath}/${entityName?uncap_first}/add',\n  edit='/${entityPackagePath}/${entityName?uncap_first}/edit',\n  deleteOne = '/${entityPackagePath}/${entityName?uncap_first}/delete',\n  deleteBatch = '/${entityPackagePath}/${entityName?uncap_first}/deleteBatch',\n  importExcel = '/${entityPackagePath}/${entityName?uncap_first}/importExcel',\n  exportXls = '/${entityPackagePath}/${entityName?uncap_first}/exportXls',\n<#list subTables as sub><#rt/>\n  ${sub.entityName?uncap_first}List = '/${entityPackagePath}/${entityName?uncap_first}/query${sub.entityName}ByMainId',\n</#list>\n}\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n<#list subTables as sub><#rt/>\n/**\n * 查询子表数据\n * @param params\n */\nexport const ${sub.entityName?uncap_first}List = Api.${sub.entityName?uncap_first}List;\n</#list>\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) =>\n  defHttp.get({url: Api.list, params});\n\n/**\n * 删除单个\n */\nexport const deleteOne = (params,handleSuccess) => {\n  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n/**\n * 批量删除\n * @param params\n */\nexport const batchDelete = (params, handleSuccess) => {\n  createConfirm({\n    iconType: 'warning',\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n/**\n * 保存或者更新\n * @param params\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({url: url, params});\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi",
    "content": "<#include \"/common/utils.ftl\">\nimport {BasicColumn} from '/@/components/Table';\nimport {FormSchema} from '/@/components/Table';\nimport { rules} from '/@/utils/helper/validator';\nimport { render } from '/@/utils/common/renderUtils';\nimport {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types'\nimport { getWeekMonthQuarterYear } from '/@/utils';\n//列表数据\nexport const columns: BasicColumn[] = [\n <#list columns as po>\n   <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n   <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   {\n    title: '${po.filedComment}',\n    align:\"center\",\n    <#if po.sort=='Y'>\n    sorter: true,\n   </#if>\n    <#if po.classType=='date'>\n    dataIndex: '${po.fieldName}',\n    customRender:({text}) =>{\n      text = !text ? \"\" : (text.length > 10 ? text.substr(0,10) : text);\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      if(text) {\n        return getWeekMonthQuarterYear(text)['${po.extendParams.picker}'];\n      } else {\n        return text;\n      }\n      <#else>\n      return text;\n      </#if>\n    },\n    <#elseif po.fieldDbType=='Blob'>\n    dataIndex: '${po.fieldName}String'\n    <#elseif po.classType=='umeditor'>\n    dataIndex: '${po.fieldName}',\n    <#elseif po.classType=='pca'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='file'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='image'>\n    dataIndex: '${po.fieldName}',\n    customRender:render.renderImage,\n   <#elseif po.classType=='switch'>\n    dataIndex: '${po.fieldName}',\n<#assign switch_extend_arr=['Y','N']>\n<#if po.dictField?default(\"\")?contains(\"[\")>\n<#assign switch_extend_arr=po.dictField?eval>\n</#if>\n<#list switch_extend_arr as a>\n<#if a_index == 0>\n<#assign switch_extend_arr1=a>\n<#else>\n<#assign switch_extend_arr2=a>\n</#if>\n</#list>\n    customRender:({text}) => {\n       return  render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}])\n     },\n   <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict'>\n    dataIndex: '${po.fieldName}_dictText'\n   <#elseif po.classType=='cat_tree'>\n    dataIndex: '${po.fieldName}',\n    <#if po.dictText?default(\"\")?trim?length == 0>\n    customRender:({text}) => {\n       return  render.renderCategoryTree(text,'${po.dictField?default(\"\")}')\n   },\n   <#else>\n    customRender: ({text, record}) => (text ? record['${po.dictText}'] : '')\n   </#if>\n   <#else>\n    dataIndex: '${po.fieldName}'\n   </#if>\n   },\n   </#if>\n </#list>\n];\n//查询数据\nexport const searchFormSchema: FormSchema[] = [\n<#-- 开始循环 -->\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if po.isQuery=='Y' && po.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#assign query_flag=true>\n\t<#assign query_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n\t    <#assign query_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n    <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign query_field_dictCode=\"${po.dictField}\">\n    </#if>\n<#if po.queryMode=='single'>\n\t{\n      label: \"${po.filedComment}\",\n      field: \"${po.fieldName}\",\n<#if po.classType=='sel_search'>\n      component: 'JSearchSelect',\n      componentProps:{\n         dict:\"${query_field_dictCode}\"\n      },\n<#elseif po.classType=='sel_user'>\n<#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n      component: 'JSelectUser',\n<#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n     componentProps:{\n   <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   </#if>\n   <#if po.extendParams?exists && po.extendParams.store?exists>\n       rowKey: '${po.extendParams.store}',\n   </#if>\n     },\n<#elseif po.classType=='switch'>\n      component: 'JSwitch',\n      componentProps:{\n           query:true,\n           <#if po.dictField != 'is_open'>\n           options:${po.dictField}\n           </#if>\n       },\n <#elseif po.classType=='sel_depart'>\n      component: 'JSelectDept',\n      componentProps:{\n   <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   </#if>\n   <#if po.extendParams?exists && po.extendParams.store?exists>\n       rowKey: '${po.extendParams.store}',\n   </#if>\n      },\n <#elseif po.classType=='list_multi'>\n      component: 'JSelectMultiple',\n      componentProps:{\n        <#if po.dictTable?default(\"\")?trim?length gt 1>\n           dictCode:\"${po.dictTable},${po.dictText},${po.dictField}\",\n        <#elseif po.dictField?default(\"\")?trim?length gt 1>\n           dictCode:\"${po.dictField}\",\n        </#if>\n           triggerChange: true\n      },\n <#elseif po.classType=='cat_tree'>\n      component: 'JCategorySelect',\n      componentProps:{\n          pcode:\"${po.dictField?default(\"\")}\",//back和事件未添加，暂时有问题\n      },\n<#elseif po.classType=='date'>\n      component: 'DatePicker',\n      componentProps: {\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        picker: '${po.extendParams.picker}',\n        </#if>\n        valueFormat: 'YYYY-MM-DD'\n      },      \n<#elseif po.classType=='datetime'>\n      component: 'DatePicker',\n      componentProps: {\n         showTime:true,\n         valueFormat: 'YYYY-MM-DD HH:mm:ss'\n       },\n<#elseif po.classType=='pca'>\n      component: 'JAreaLinkage',\n      componentProps: {\n        saveCode: 'region',\n      },\n<#elseif po.classType=='popup'>\n    <#include \"/common/form/vue3popup.ftl\">\n<#elseif po.classType=='popup_dict'>\n    component: 'JPopupDict',\n    componentProps: {\n      placeholder: '请选择${po.filedComment}',\n      dictCode: '${po.dictTable},${po.dictText},${po.dictField}',\n      multi: ${po.extendParams.popupMulti?c}\n    },\n<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>\n<#--  ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->\n      component: 'JSelectMultiple',\n      componentProps:{\n       <#if po.dictTable?default(\"\")?trim?length gt 1>\n          dictCode:\"${po.dictTable},${po.dictText},${po.dictField}\"\n       <#elseif po.dictField?default(\"\")?trim?length gt 1>\n          dictCode:\"${po.dictField}\"\n        </#if>\n      },\n<#elseif po.classType == 'sel_tree'>\n      component: 'JTreeSelect',\n      componentProps:{\n          <#if po.dictText??>\n          <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n          dict:\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\",\n          <#elseif po.dictText?split(',')[1]??>\n          pidField:\"${po.dictText?split(',')[1]}\",\n          <#elseif po.dictText?split(',')[3]??>\n          hasChildField:\"${po.dictText?split(',')[3]}\",\n          </#if>\n          </#if>\n          pidValue:\"${po.dictField}\",\n      },\n<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n      component: 'InputNumber',\n<#else>\n      component: 'Input',\n</#if>\n      //colProps: {span: 6},\n \t},\n<#elseif po.queryMode=='like'>\n  {\n    label: \"${po.filedComment}\",\n    field: \"${po.fieldName}\",\n    component: 'JInput',\n  },\n<#else>\n     {\n      label: \"${po.filedComment}\",\n      field: \"${po.fieldName}\",\n<#if po.classType=='date'>\n      component: 'RangePicker',\n      componentProps: {\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        picker: '${po.extendParams.picker}',\n        </#if>\n        valueType: 'Date',\n      },\n<#elseif po.classType=='datetime'>\n      component: 'RangePicker',\n      componentProps: {\n          valueType: 'Date',\n          showTime:true\n      },\n<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n      component: 'JRangeNumber',\n<#-- update-begin---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n<#elseif po.classType=='time'>\n      component: 'RangeTime',\n<#-- update-end---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n<#else>\n      component: 'Input', //TODO 范围查询\n</#if>\n      //colProps: {span: 6},\n\t},\n</#if>\n</#if>\n</#list>\n<#-- 结束循环 -->\n];\n//表单数据\nexport const formSchema: FormSchema[] = [\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign bpm_flag=false>\n<#assign id_exists = false>\n<#list columns as po><#rt/>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.fieldDbName == 'id'>\n\t<#assign id_exists = true>\n</#if>\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if po.isShow =='Y' && po.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n  {\n    label: '${po.filedComment}',\n    field: ${autoStringSuffix(po)},\n<#-- update-begin-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n  <#if po.defaultVal??>\n    <#if po.fieldDbType==\"BigDecimal\" || po.fieldDbType==\"double\" || po.fieldDbType==\"int\">\n    defaultValue: ${po.defaultVal},\n    <#else>\n    defaultValue: \"${po.defaultVal}\",\n    </#if>\n  </#if>\n<#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n    <#if po.classType =='date'>\n    component: 'DatePicker',\n    componentProps:{\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        picker: '${po.extendParams.picker}',\n        </#if>\n      valueFormat: 'YYYY-MM-DD'\n    },    \n     <#elseif po.classType =='datetime'>\n    component: 'DatePicker',\n    componentProps: {\n       showTime:true,\n       valueFormat: 'YYYY-MM-DD HH:mm:ss'\n     },\n     <#elseif po.classType =='time'>\n    component: 'TimePicker',\n    componentProps: {\n      valueFormat: 'HH:mm:ss'\n    },\n    <#elseif po.classType =='popup'>\n    <#include \"/common/form/vue3popup.ftl\">\n    <#elseif po.classType=='popup_dict'>\n    component: 'JPopupDict',\n    componentProps: {\n      placeholder: '请选择${po.filedComment}',\n      dictCode: '${po.dictTable},${po.dictText},${po.dictField}',\n      multi: ${po.extendParams.popupMulti?c}\n    },\n     <#elseif po.classType =='sel_depart'>\n     component: 'JSelectDept',\n     componentProps:{\n   <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   </#if>\n   <#if po.extendParams?exists && po.extendParams.store?exists>\n       rowKey: '${po.extendParams.store}',\n   </#if>\n     },\n     <#elseif po.classType =='switch'>\n     component: 'JSwitch',\n     componentProps:{\n         <#if po.dictField != 'is_open'>\n         options:${po.dictField}\n         </#if>\n     },\n     <#elseif po.classType =='pca'>\n    component: 'JAreaLinkage',\n    componentProps: {\n      saveCode: 'region',\n    },\n    <#elseif po.classType =='markdown'>\n    component: 'JMarkdownEditor',//注意string转换问题\n     <#elseif po.classType =='password'>\n    component: 'InputPassword',\n     <#elseif po.classType =='sel_user'>\n<#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件------------- -->\n    component: 'JSelectUser',\n<#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件------------- -->\n     componentProps:{\n   <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   </#if>\n   <#if po.extendParams?exists && po.extendParams.store?exists>\n       rowKey: '${po.extendParams.store}',\n   </#if>\n     },\n    <#elseif po.classType =='textarea'>\n    component: 'InputTextArea',\n    <#elseif po.classType=='list'>\n    component: 'JDictSelectTag',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\",\n     <#if po.fieldDbType=='int'>\n        stringToNumber: true\n     </#if>\n     },\n    <#elseif po.classType=='radio'>\n    component: 'JDictSelectTag',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\",\n        type: \"radio\",\n     <#if po.fieldDbType=='int'>\n        stringToNumber: true\n     </#if>\n     },\n     <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- -->\n    <#elseif po.classType=='list_multi'>\n    component: 'JSelectMultiple',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n    <#elseif po.classType=='checkbox'>\n    component: 'JCheckbox',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n     <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- -->\n    <#elseif po.classType=='sel_search'>\n    component: 'JSearchSelect',\n    componentProps:{\n       dict:\"${form_field_dictCode}\"\n    },\n<#elseif po.classType=='cat_tree'>\n    <#assign form_cat_tree = true>\n    component: 'JCategorySelect',\n    componentProps:{\n       pcode:\"${po.dictField?default(\"\")}\", //TODO back和事件未添加，暂时有问题\n    },\n    <#if po.dictText?default(\"\")?trim?length gt 1>\n    <#assign form_cat_back = \"${po.dictText}\">\n    </#if>\n    <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n    component: 'InputNumber',\n    <#elseif po.classType=='file'>\n    component: 'JUpload',\n    componentProps:{\n    <#if po.uploadnum??>\n       maxCount:${po.uploadnum}\n   </#if>\n     },\n <#elseif po.classType=='image'>\n     component: 'JImageUpload',\n     componentProps:{\n     <#if po.uploadnum??>\n        fileMax:${po.uploadnum}\n     <#else>\n        fileMax: 0\n     </#if>\n      },\n  <#elseif po.classType=='umeditor'>\n    component: 'JEditor',\n  <#elseif po.classType == 'sel_tree'>\n    component: 'JTreeSelect',\n    componentProps:{\n        <#if po.dictText??>\n        <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n        dict:\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\",\n        <#elseif po.dictText?split(',')[1]??>\n        pidField:\"${po.dictText?split(',')[1]}\",\n        <#elseif po.dictText?split(',')[3]??>\n        hasChildField:\"${po.dictText?split(',')[3]}\",\n        </#if>\n        </#if>\n        pidValue:\"${po.dictField}\",\n    },\n  <#elseif po.classType=='link_table'>\n    component: 'JLinkTableCard',\n    componentProps: {\n      valueField: '${po.dictField}',\n      textField: '${po.dictText}',\n      tableName: '${po.dictTable}',\n      multi: <#if (po.queryMode!\"\") == \"multi\">true<#else>false</#if>\n    },\n   <#else>\n    component: 'Input',\n    </#if>\n     <#include \"/common/utils.ftl\">\n    <#if po.isShow == 'Y' && poHasCheck(po)>\n    dynamicRules: ({model,schema}) => {\n    <#if po.fieldName != 'id'>\n    <#assign fieldValidType = po.fieldValidType!''>\n          return [\n            <#-- 非空校验 -->\n           <#if po.nullable == 'N' || fieldValidType == '*'>\n                 { required: true, message: '请输入${po.filedComment}!'},\n           <#elseif fieldValidType!=''>\n                 { required: false},\n           </#if>\n       <#-- 唯一校验 -->\n           <#if fieldValidType == 'only'>\n                 {...rules.duplicateCheckRule(<#if sub?default(\"\")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'</#if>, '${po.fieldDbName}',model,schema)[0]},\n           <#-- 6到16位数字 -->\n           <#elseif fieldValidType == 'n6-16'>\n                 { pattern: /^\\d{6,16}$|^(?=\\d+\\.\\d+)[\\d.]{7,17}$/, message: '请输入6到16位数字!'},\n           <#-- 6到16位任意字符 -->\n           <#elseif fieldValidType == '*6-16'>\n                 { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},\n           <#-- 6到18位字母 -->\n           <#elseif fieldValidType == 's6-18'>\n                 { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},\n           <#-- 网址 -->\n           <#elseif fieldValidType == 'url'>\n                 { pattern: /^((ht|f)tps?):\\/\\/[\\w\\-]+(\\.[\\w\\-]+)+([\\w\\-.,@?^=%&:\\/~+#]*[\\w\\-@?^=%&\\/~+#])?$/, message: '请输入正确的网址!'},\n           <#-- 电子邮件 -->\n           <#elseif fieldValidType == 'e'>\n                 { pattern: /^([\\w]+\\.*)([\\w]+)@[\\w]+\\.\\w{3}(\\.\\w{2}|)$/, message: '请输入正确的电子邮件!'},\n           <#-- 手机号码 -->\n           <#elseif fieldValidType == 'm'>\n                 { pattern: /^1[3456789]\\d{9}$/, message: '请输入正确的手机号码!'},\n           <#-- 邮政编码 -->\n           <#elseif fieldValidType == 'p'>\n                 { pattern: /^[0-9]\\d{5}$/, message: '请输入正确的邮政编码!'},\n           <#-- 字母 -->\n           <#elseif fieldValidType == 's'>\n                 { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},\n           <#-- 数字 -->\n           <#elseif fieldValidType == 'n'>\n                 { pattern: /^-?\\d+\\.?\\d*$/, message: '请输入数字!'},\n           <#-- 整数 -->\n           <#elseif fieldValidType == 'z'>\n                 { pattern: /^-?\\d+$/, message: '请输入整数!'},\n           <#-- 金额 -->\n           <#elseif fieldValidType == 'money'>\n                 { pattern: /^(([1-9][0-9]*)|([0]\\.\\d{0,2}|[1-9][0-9]*\\.\\d{0,2}))$/, message: '请输入正确的金额!'},\n           <#-- 正则校验 -->\n           <#elseif fieldValidType != '' && fieldValidType != '*'>\n                 { pattern: '${fieldValidType}', message: '不符合校验规则!'},\n           <#-- 无校验 -->\n           <#else>\n               <#t>\n           </#if>\n          ];\n     </#if>\n     },\n    </#if>\n    <#if po.readonly=='Y'>\n    dynamicDisabled:true\n    </#if>\n  },\n</#if>\n</#list>\n<#if id_exists == false>\n\t// TODO 主键隐藏字段，目前写死为ID\n\t{\n\t  label: '',\n\t  field: 'id',\n\t  component: 'Input',\n\t  show: false\n\t},\n</#if>\n];\n//子表单数据\n<#list subTables as sub>\n<#if sub.foreignRelationType =='1'>\nexport const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign bpm_flag=false>\n<#assign sub_id_exists=false>\n<#list sub.colums as po><#rt/>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.fieldDbName=='id'>\n  <#assign sub_id_exists=true>\n</#if>\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if po.isShow =='Y' && po.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n  {\n    label: '${po.filedComment}',\n    field: ${autoStringSuffix(po)},\n<#-- update-begin-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n  <#if po.defaultVal??>\n    <#if po.fieldDbType==\"BigDecimal\" || po.fieldDbType==\"double\" || po.fieldDbType==\"int\">\n    defaultValue: ${po.defaultVal},\n    <#else>\n    defaultValue: \"${po.defaultVal}\",\n    </#if>\n  </#if>\n<#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n    <#if po.classType =='date'>\n    component: 'DatePicker',\n    componentProps: {\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      picker: '${po.extendParams.picker}',\n      </#if>\n      valueFormat: 'YYYY-MM-DD'\n    },   \n     <#elseif po.classType =='datetime'>\n    component: 'DatePicker',\n    componentProps: {\n       showTime:true,\n       valueFormat: 'YYYY-MM-DD HH:mm:ss'\n     },\n     <#elseif po.classType =='time'>\n    component: 'TimePicker',\n    componentProps: {\n      valueFormat: 'HH:mm:ss'\n    },\n    <#elseif po.classType =='popup'>\n    <#include \"/common/form/vue3popup.ftl\">\n    <#elseif po.classType=='popup_dict'>\n    component: 'JPopupDict',\n    componentProps: {\n      placeholder: '请选择${po.filedComment}',\n      dictCode: '${po.dictTable},${po.dictText},${po.dictField}',\n      multi: ${po.extendParams.popupMulti?c}\n    },\n     <#elseif po.classType =='sel_depart'>\n     component: 'JSelectDept',\n     <#elseif po.classType =='switch'>\n     component: 'JSwitch',\n     componentProps:{\n         <#if po.dictField != 'is_open'>\n         options:${po.dictField}\n         </#if>\n     },\n     <#elseif po.classType =='pca'>\n    component: 'JAreaLinkage',\n    componentProps: {\n      saveCode: 'region',\n    },\n    <#elseif po.classType =='markdown'>\n    component: 'JMarkdownEditor',//注意string转换问题\n     <#elseif po.classType =='password'>\n    component: 'InputPassword',\n     <#elseif po.classType =='sel_user'>\n<#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件------------- -->\n    component: 'JSelectUser',\n<#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件------------- -->\n    componentProps:{\n        labelKey:'realname',\n     },\n    <#elseif po.classType =='textarea'>\n    component: 'InputTextArea',\n    <#elseif po.classType=='list'>\n    component: 'JDictSelectTag',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\",\n     <#if po.fieldDbType=='int'>\n        stringToNumber: true\n     </#if>\n     },\n    <#elseif po.classType=='radio'>\n    component: 'JDictSelectTag',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\",\n        type: \"radio\",\n      <#if po.fieldDbType=='int'>\n        stringToNumber: true\n      </#if>\n     },\n    <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- -->\n    <#elseif po.classType=='list_multi'>\n    component: 'JSelectMultiple',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n    <#elseif po.classType=='checkbox'>\n    component: 'JCheckbox',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n     <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- -->\n    <#elseif po.classType=='sel_search'>\n    component: 'JSearchSelect',\n    componentProps:{\n       dict:\"${form_field_dictCode}\"\n    },\n<#elseif po.classType=='cat_tree'>\n    <#assign form_cat_tree = true>\n    component: 'JCategorySelect',\n    componentProps:{\n       pcode:\"${po.dictField?default(\"\")}\", //TODO back和事件未添加，暂时有问题\n    },\n    <#if po.dictText?default(\"\")?trim?length gt 1>\n    <#assign form_cat_back = \"${po.dictText}\">\n    </#if>\n    <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n    component: 'InputNumber',\n    <#elseif po.classType=='file'>\n    component: 'JUpload',\n    componentProps:{\n    <#if po.uploadnum??>\n       maxCount:${po.uploadnum}\n   </#if>\n     },\n <#elseif po.classType=='image'>\n     component: 'JImageUpload',\n     componentProps:{\n     <#if po.uploadnum??>\n        fileMax:${po.uploadnum}\n     <#else>\n        fileMax: 0\n     </#if>\n    },\n  <#elseif po.classType=='umeditor'>\n    component: 'JEditor',\n  <#elseif po.classType == 'sel_tree'>\n    component: 'JTreeSelect',\n    componentProps:{\n        <#if po.dictText??>\n        <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n        dict:\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\",\n        <#elseif po.dictText?split(',')[1]??>\n        pidField:\"${po.dictText?split(',')[1]}\",\n        <#elseif po.dictText?split(',')[3]??>\n        hasChildField:\"${po.dictText?split(',')[3]}\",\n        </#if>\n        </#if>\n        pidValue:\"${po.dictField}\",\n    },\n  <#elseif po.classType=='link_table'>\n    component: 'JLinkTableCard',\n    componentProps: {\n      valueField: '${po.dictField}',\n      textField: '${po.dictText}',\n      tableName: '${po.dictTable}',\n      multi: <#if (po.queryMode!\"\") == \"multi\">true<#else>false</#if>\n    },\n   <#else>\n    component: 'Input',\n    </#if>\n     <#include \"/common/utils.ftl\">\n    <#if po.isShow == 'Y' && poHasCheck(po)>\n    dynamicRules: ({model,schema}) => {\n    <#if po.fieldName != 'id'>\n    <#assign fieldValidType = po.fieldValidType!''>\n          return [\n            <#-- 非空校验 -->\n           <#if po.nullable == 'N' || fieldValidType == '*'>\n                 { required: true, message: '请输入${po.filedComment}!'},\n           <#elseif fieldValidType!=''>\n                 { required: false},\n           </#if>\n       <#-- 唯一校验 -->\n           <#if fieldValidType == 'only'>\n                 {...rules.duplicateCheckRule(<#if sub?default(\"\")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'</#if>, '${po.fieldDbName}',model,schema)[0]},\n           <#-- 6到16位数字 -->\n           <#elseif fieldValidType == 'n6-16'>\n                 { pattern: /^\\d{6,16}$|^(?=\\d+\\.\\d+)[\\d.]{7,17}$/, message: '请输入6到16位数字!'},\n           <#-- 6到16位任意字符 -->\n           <#elseif fieldValidType == '*6-16'>\n                 { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},\n           <#-- 6到18位字母 -->\n           <#elseif fieldValidType == 's6-18'>\n                 { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},\n           <#-- 网址 -->\n           <#elseif fieldValidType == 'url'>\n                 { pattern: /^((ht|f)tps?):\\/\\/[\\w\\-]+(\\.[\\w\\-]+)+([\\w\\-.,@?^=%&:\\/~+#]*[\\w\\-@?^=%&\\/~+#])?$/, message: '请输入正确的网址!'},\n           <#-- 电子邮件 -->\n           <#elseif fieldValidType == 'e'>\n                 { pattern: /^([\\w]+\\.*)([\\w]+)@[\\w]+\\.\\w{3}(\\.\\w{2}|)$/, message: '请输入正确的电子邮件!'},\n           <#-- 手机号码 -->\n           <#elseif fieldValidType == 'm'>\n                 { pattern: /^1[3456789]\\d{9}$/, message: '请输入正确的手机号码!'},\n           <#-- 邮政编码 -->\n           <#elseif fieldValidType == 'p'>\n                 { pattern: /^[0-9]\\d{5}$/, message: '请输入正确的邮政编码!'},\n           <#-- 字母 -->\n           <#elseif fieldValidType == 's'>\n                 { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},\n           <#-- 数字 -->\n           <#elseif fieldValidType == 'n'>\n                 { pattern: /^-?\\d+\\.?\\d*$/, message: '请输入数字!'},\n           <#-- 整数 -->\n           <#elseif fieldValidType == 'z'>\n                 { pattern: /^-?\\d+$/, message: '请输入整数!'},\n           <#-- 金额 -->\n           <#elseif fieldValidType == 'money'>\n                 { pattern: /^(([1-9][0-9]*)|([0]\\.\\d{0,2}|[1-9][0-9]*\\.\\d{0,2}))$/, message: '请输入正确的金额!'},\n           <#-- 正则校验 -->\n           <#elseif fieldValidType != '' && fieldValidType != '*'>\n                 { pattern: '${fieldValidType}', message: '不符合校验规则!'},\n           <#-- 无校验 -->\n           <#else>\n               <#t>\n           </#if>\n          ];\n     </#if>\n     },\n    </#if>\n    <#if po.readonly=='Y'>\n    dynamicDisabled:true\n    </#if>\n  },\n</#if>\n</#list>\n<#if sub_id_exists == false>\n\t{\n\t  label: '',\n\t  field: 'id',\n\t  component: 'Input',\n\t  show: false\n\t},\n</#if>\n];\n</#if>\n</#list>\n//子表表格配置\n<#list subTables as sub>\n<#if sub.foreignRelationType =='0'>\nexport const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [\n<#assign popupBackFields = \"\">\n\n<#-- 循环子表的列 开始 -->\n<#list sub.colums as col><#rt/>\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if col.isShow =='Y' && col.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if col.filedComment !='外键' >\n    {\n      title: '${col.filedComment}',\n      key: '${autoStringSuffixForModel(col)}',\n<#if col.classType =='date'>\n      type: JVxeTypes.date,\n      <#if col.extendParams?exists && col.extendParams.picker?exists>\n      picker: '${col.extendParams.picker}',\n      </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='datetime'>\n      type: JVxeTypes.datetime,\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='time'>\n      type: JVxeTypes.time,\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='textarea'>\n      type: JVxeTypes.textarea,\n       <#if col.readonly=='Y'>\n      disabled:true,\n       </#if>\n<#elseif col.classType =='list' || col.classType =='radio'>\n      type: JVxeTypes.select,\n      options:[],\n      <#if col.dictTable?default(\"\")?trim?length gt 1>\n      dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n      <#else>\n      dictCode:\"${col.dictField}\",\n      </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='list_multi' || col.classType =='checkbox'>\n      type: JVxeTypes.selectMultiple,\n      options:[],\n      <#if col.dictTable?default(\"\")?trim?length gt 1>\n      dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n      <#else>\n      dictCode:\"${col.dictField}\",\n      </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='sel_search'>\n      type: JVxeTypes.selectSearch,\n      <#if col.dictTable?default(\"\")?trim?length gt 1>\n      dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n      <#else>\n      dictCode:\"${col.dictField}\",\n      </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='sel_depart'>\n      type: JVxeTypes.departSelect,\n      props:{\n    <#if col.extendParams?exists && col.extendParams.text?exists>\n        labelKey: '${col.extendParams.text}',\n    </#if>\n    <#if col.extendParams?exists && col.extendParams.store?exists>\n        rowKey: '${col.extendParams.store}',\n    </#if>\n      },\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='sel_user'>\n      type: JVxeTypes.userSelect,\n      props:{\n    <#if col.extendParams?exists && col.extendParams.text?exists>\n        labelKey: '${col.extendParams.text}',\n    </#if>\n    <#if col.extendParams?exists && col.extendParams.store?exists>\n        rowKey: '${col.extendParams.store}',\n    </#if>\n      },\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='image'>\n      type: JVxeTypes.image,\n      token:true,\n      responseName:\"message\",\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n      <#if col.uploadnum??>\n      number: ${col.uploadnum},\n      </#if>\n<#elseif col.classType =='file'>\n      type: JVxeTypes.file,\n      token:true,\n      responseName:\"message\",\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n      <#if col.uploadnum??>\n      number: ${col.uploadnum},\n      </#if>\n<#elseif col.classType =='switch'>\n      type: JVxeTypes.checkbox,\n       <#if col.dictField == 'is_open'>\n      customValue: ['Y', 'N'],\n        <#else>\n      customValue: ${col.dictField},\n        </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType=='pca'>\n      type: JVxeTypes.pca,\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='popup'>\n<#if popupBackFields?length gt 0>\n    <#assign popupBackFields = \"${popupBackFields}\"+\",\"+\"${col.dictText}\">\n<#else>\n    <#assign popupBackFields = \"${col.dictText}\">\n</#if>\n    <#include \"/common/form/vue3Jvxepopup.ftl\">\n<#-- update-begin-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对，数字或者金额类型 -->\n<#-- elseif \"int,decimal,double,\"?contains(col.classType) -->\n<#elseif col.fieldDbType=='int' || col.fieldDbType=='long' || col.fieldDbType=='double' || col.fieldDbType=='BigDecimal'>\n<#-- update-end-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对，数字或者金额类型 -->\n      type: JVxeTypes.inputNumber,\n    <#if col.readonly=='Y'>\n      disabled:true,\n    </#if>\n<#else>\n      type: JVxeTypes.input,\n       <#if col.readonly=='Y'>\n      disabled:true,\n       </#if>\n</#if>\n<#if col.classType =='list_multi' || col.classType =='checkbox'>\n      width:\"250px\",\n<#else>\n      width:\"200px\",\n</#if>\n<#if col.classType =='file'>\n      placeholder: '请选择文件',\n<#else>\n      placeholder: '请输入${'$'}{title}',\n</#if>\n<#if col.defaultVal??>\n<#if col.fieldDbType==\"BigDecimal\" || col.fieldDbType==\"double\" || col.fieldDbType==\"int\">\n      defaultValue:${col.defaultVal},\n      <#else>\n      defaultValue:\"${col.defaultVal}\",\n</#if>\n<#else>\n      defaultValue:'',\n</#if>\n<#-- 子表的校验 -->\n <#include \"/common/validatorRulesTemplate/sub-vue3.ftl\">\n    },\n</#if>\n</#if>\n</#list>\n<#-- 循环子表的列 结束 -->\n  ]\n</#if>\n</#list>\n\n\n<#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n// 高级查询数据\nexport const superQuerySchema = {\n  <#list columns as po>\n  <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n  <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  ${superQueryFieldListForVue3(po,po_index)},\n  </#if>\n  </#list>\n  //子表高级查询\n  <#list subTables as sub>\n  ${sub.entityName?uncap_first}: {\n    title: '${sub.ftlDescription}',\n    view: 'table',\n    fields: {\n      <#list sub.colums as subCol>\n        <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n        <#if subCol.isShowList =='Y' && subCol.fieldName !='id' && subCol.fieldName !='delFlag'>\n        <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n        ${superQueryFieldListForVue3(subCol,subCol_index)},\n        </#if>\n      </#list>\n    }\n  },\n  </#list>\n};\n<#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n\n/**\n* 流程表单调用这个方法获取formSchema\n* @param param\n*/\nexport function getBpmFormSchema(_formData): FormSchema[]{\n// 默认和原始表单保持一致 如果流程中配置了权限数据，这里需要单独处理formSchema\n  return formSchema;\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql",
    "content": "<#include \"/common/sql/menu_insert.ftl\">\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n  <div>\n    <BasicForm @register=\"registerForm\" ref=\"formRef\"/>\n    <!-- 子表单区域 -->\n    <a-tabs v-model:activeKey=\"activeKey\" animated  @change=\"handleChangeTabs\">\n    <#list subTables as sub><#rt/>\n      <#assign refKey = sub.entityName?uncap_first/>\n      <#if sub.foreignRelationType =='1'>\n      <a-tab-pane tab=\"${sub.ftlDescription}\" key=\"${refKey}\" :forceRender=\"true\">\n        <${sub.entityName}Form ref=\"${sub.entityName?uncap_first}Form\" :disabled=\"formDisabled\"></${sub.entityName}Form>\n      </a-tab-pane>\n      <#else>\n      <a-tab-pane tab=\"${sub.ftlDescription}\" key=\"${refKey}\" :forceRender=\"true\">\n        <JVxeTable\n          keep-source\n          resizable\n          ref=\"${refKey}\"\n          v-if=\"${sub.entityName?uncap_first}Table.show\"\n          :loading=\"${sub.entityName?uncap_first}Table.loading\"\n          :columns=\"${sub.entityName?uncap_first}Table.columns\"\n          :dataSource=\"${sub.entityName?uncap_first}Table.dataSource\"\n          :height=\"340\"\n          :rowNumber=\"true\"\n          :rowSelection=\"true\"\n          :disabled=\"formDisabled\"\n          :toolbar=\"true\"\n        />\n      </a-tab-pane>\n      </#if>\n    </#list>\n    </a-tabs>\n\n    <div style=\"width: 100%;text-align: center\" v-if=\"!formDisabled\">\n      <a-button @click=\"handleSubmit\" pre-icon=\"ant-design:check\" type=\"primary\">提 交</a-button>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\">\n\n  import {BasicForm, useForm} from '/@/components/Form/index';\n  import { computed, defineComponent, reactive, ref, unref } from 'vue';\n  import {defHttp} from '/@/utils/http/axios';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useJvxeMethod } from '/@/hooks/system/useJvxeMethods';\n  import { VALIDATE_FAILED } from '/@/utils/common/vxeUtils';\n  <#list subTables as sub>\n  <#if sub.foreignRelationType =='1'>\n  import ${sub.entityName}Form from './${sub.entityName}Form.vue'\n  </#if>\n  </#list>\n  import {getBpmFormSchema<#list subTables as sub><#if sub.foreignRelationType =='0'>,${sub.entityName?uncap_first}Columns</#if></#list>} from '../${entityName}.data';\n  import {saveOrUpdate<#list subTables as sub>,${sub.entityName?uncap_first}List</#list>} from '../${entityName}.api';\n\n  export default defineComponent({\n    name: \"${entityName}Form\",\n    components:{\n      BasicForm,\n      <#list subTables as sub>\n      <#if sub.foreignRelationType =='1'>\n      ${sub.entityName}Form,\n      </#if>\n      </#list>\n    },\n    props:{\n      formData: propTypes.object.def({}),\n      formBpm: propTypes.bool.def(true),\n    },\n    setup(props){\n      const [registerForm, { setFieldsValue, setProps }] = useForm({\n        labelWidth: 150,\n        schemas: getBpmFormSchema(props.formData),\n        showActionButtonGroup: false,\n        baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}}\n      });\n\n      const formDisabled = computed(()=>{\n        if(props.formData.disabled === false){\n          return false;\n        }\n        return true;\n      });\n\n      <#assign hasOne2Many = false>\n      <#assign hasOne2One = false>\n      const refKeys = ref([<#list subTables as sub>'${sub.entityName?uncap_first}', </#list>]);\n      const activeKey = ref('${subTables[0].entityName?uncap_first}');\n      <#list subTables as sub>\n      <#if sub.foreignRelationType =='0'>\n      <#assign hasOne2Many = true>\n      const ${sub.entityName?uncap_first} = ref();\n      </#if>\n      <#if sub.foreignRelationType =='1'>\n      <#assign hasOne2One = true>\n      const ${sub.entityName?uncap_first}Form = ref();\n      </#if>\n      </#list>\n      const tableRefs = {<#list subTables as sub><#if sub.foreignRelationType =='0'>${sub.entityName?uncap_first}, <#assign hasOne2Many = true></#if></#list>};\n      <#list subTables as sub>\n      <#if sub.foreignRelationType =='0'>\n      const ${sub.entityName?uncap_first}Table = reactive({\n        loading: false,\n        dataSource: [],\n        columns:${sub.entityName?uncap_first}Columns,\n        show: false\n      })\n      </#if>\n      </#list>\n\n      const [handleChangeTabs,handleSubmit,requestSubTableData,formRef] = useJvxeMethod(requestAddOrEdit,classifyIntoFormData,tableRefs,activeKey,refKeys,validateSubForm);\n\n      function classifyIntoFormData(allValues) {\n        let main = Object.assign({}, allValues.formValue)\n        return {\n          ...main, // 展开\n          <#assign subManyIndex = 0>\n          <#list subTables as sub><#rt/>\n          <#if sub.foreignRelationType =='0'>\n          ${sub.entityName?uncap_first}List: allValues.tablesValue[${subManyIndex}].tableData,\n          <#assign subManyIndex = subManyIndex+1>\n          <#else>\n          ${sub.entityName?uncap_first}List: ${sub.entityName?uncap_first}Form.value.getFormData(),\n          </#if>\n          </#list>\n        }\n      }\n      <#if hasOne2One==true>\n      //校验所有一对一子表表单\n      function validateSubForm(allValues){\n        return new Promise((resolve, _reject)=>{\n          Promise.all([\n            <#list subTables as sub><#rt/>\n            <#if sub.foreignRelationType =='1'>\n            ${sub.entityName?uncap_first}Form.value.validateForm(${sub_index}),\n            </#if>\n            </#list>\n          ]).then(() => {\n            resolve(allValues)\n          }).catch(e => {\n            if (e.error === VALIDATE_FAILED) {\n              // 如果有未通过表单验证的子表，就自动跳转到它所在的tab\n              activeKey.value = e.index == null ? unref(activeKey) : refKeys.value[e.index]\n            } else {\n              console.error(e)\n            }\n          })\n        })\n      }\n      </#if>\n\n      //表单提交事件\n      async function requestAddOrEdit(values) {\n        await saveOrUpdate(values, true);\n      }\n\n      const queryByIdUrl = '/${entityPackagePath}/${entityName?uncap_first}/queryById';\n      async function initFormData(){\n        let params = {id: props.formData.dataId};\n        const data = await defHttp.get({url: queryByIdUrl, params});\n        //设置表单的值\n        await setFieldsValue({...data});\n        <#list subTables as sub>\n        <#if sub.foreignRelationType =='0'>\n        requestSubTableData(${sub.entityName?uncap_first}List, {id: data.id}, ${sub.entityName?uncap_first}Table, ()=>{\n          ${sub.entityName?uncap_first}Table.show = true;\n        });\n        </#if>\n        <#if sub.foreignRelationType =='1'>\n        ${sub.entityName?uncap_first}Form.value.initFormData(${sub.entityName?uncap_first}List, data.id);\n        </#if>\n        </#list>\n        //默认是禁用\n        await setProps({disabled: formDisabled.value})\n      }\n\n      initFormData();\n\n      return {\n        registerForm,\n        formDisabled,\n        formRef,\n        handleSubmit,\n        activeKey,\n        handleChangeTabs,\n        <#list subTables as sub>\n        <#if sub.foreignRelationType =='0'>\n        ${sub.entityName?uncap_first},\n        </#if>\n        <#if sub.foreignRelationType =='1'>\n        ${sub.entityName?uncap_first}Form,\n        </#if>\n        </#list>\n        <#list subTables as sub>\n        <#if sub.foreignRelationType =='0'>\n        ${sub.entityName?uncap_first}Table,\n        </#if>\n        </#list>\n      }\n    }\n  });\n</script>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei",
    "content": "﻿<#include \"/common/utils.ftl\">\n<template>\n<#assign buttonList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n  <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n</#if>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" destroyOnClose :title=\"title\" :maxHeight=\"500\" :width=\"${getModalWidth(tableVo.fieldRowNum?default(1))}\" @ok=\"handleSubmit\">\n    <BasicForm @register=\"registerForm\" ref=\"formRef\" name=\"${entityName}Form\"/>\n    <!-- 子表单区域 -->\n    <a-tabs v-model:activeKey=\"activeKey\" animated @change=\"handleChangeTabs\" class=\"jeecg-tab\">\n<#list subTables as sub><#rt/>\n  <#assign refKey = sub.entityName?uncap_first/>\n  <#if sub.foreignRelationType =='1'>\n      <a-tab-pane tab=\"${sub.ftlDescription}\" key=\"${refKey}\" :forceRender=\"true\">\n        <${sub.entityName}Form ref=\"${sub.entityName?uncap_first}Form\" :disabled=\"formDisabled\"></${sub.entityName}Form>\n      </a-tab-pane>\n\n  <#else>\n      <a-tab-pane tab=\"${sub.ftlDescription}\" key=\"${refKey}\" :forceRender=\"true\">\n        <JVxeTable\n          keep-source\n          resizable\n          ref=\"${refKey}\"\n          :loading=\"${sub.entityName?uncap_first}Table.loading\"\n          :columns=\"${sub.entityName?uncap_first}Table.columns\"\n          :dataSource=\"${sub.entityName?uncap_first}Table.dataSource\"\n          :height=\"340\"\n          :rowNumber=\"true\"\n          :rowSelection=\"true\"\n          :disabled=\"formDisabled\"\n          :toolbar=\"true\"\n          />\n      </a-tab-pane>\n  </#if>\n</#list>\n    </a-tabs>\n    <#if buttonList?? && buttonList?size gt 0>\n       <template #insertFooter>\n        <#list buttonList as btn>\n         <#if btn.buttonStyle=='form'>\n           <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n         </#if>\n        </#list>\n       </template>\n    </#if>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n    import {ref, computed, unref,reactive} from 'vue';\n    import {BasicModal, useModalInner} from '/@/components/Modal';\n    import {BasicForm, useForm} from '/@/components/Form/index';\n    import { JVxeTable } from '/@/components/jeecg/JVxeTable'\n    import { useJvxeMethod } from '/@/hooks/system/useJvxeMethods.ts'\n    <#list subTables as sub>\n      <#if sub.foreignRelationType =='1'>\n    import ${sub.entityName}Form from './${sub.entityName}Form.vue'\n      </#if>\n    </#list>\n    import {formSchema<#list subTables as sub><#if sub.foreignRelationType =='0'>,${sub.entityName?uncap_first}Columns</#if></#list>} from '../${entityName}.data';\n    import {saveOrUpdate<#list subTables as sub>,${sub.entityName?uncap_first}List</#list>} from '../${entityName}.api';\n    import { VALIDATE_FAILED } from '/@/utils/common/vxeUtils'\n    import { useMessage } from '/@/hooks/web/useMessage';\n    import { getDateByPicker } from '/@/utils';\n    //日期个性化选择\n    const fieldPickers = reactive({\n    <#list columns as po>\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      ${po.fieldName}: '${po.extendParams.picker}',\n      </#if>\n    </#list>\n    });\n    <#list subTables as sub>\n      <#if sub.foreignRelationType =='0'>\n      const ${sub.entityName?uncap_first}FieldPickers = reactive({\n      <#list sub.colums as po>\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        ${po.fieldName}: '${po.extendParams.picker}',\n        </#if>\n      </#list>\n      });\n      </#if>\n    </#list>\n    const { createMessage } = useMessage();\n    // Emits声明\n    const emit = defineEmits(['register','success']);\n    const isUpdate = ref(true);\n    const formDisabled = ref(false);\n    const refKeys = ref([<#list subTables as sub>'${sub.entityName?uncap_first}', </#list>]);\n    <#assign hasOne2Many = false>\n    <#assign hasOne2One = false>\n    const activeKey = ref('${subTables[0].entityName?uncap_first}');\n<#list subTables as sub>\n<#if sub.foreignRelationType =='0'>\n <#assign hasOne2Many = true>\n    const ${sub.entityName?uncap_first} = ref();\n</#if>\n<#if sub.foreignRelationType =='1'>\n <#assign hasOne2One = true>\n    const ${sub.entityName?uncap_first}Form = ref();\n</#if>\n</#list>\n    const tableRefs = {<#list subTables as sub><#if sub.foreignRelationType =='0'>${sub.entityName?uncap_first}, <#assign hasOne2Many = true></#if></#list>};\n   <#list subTables as sub>\n   <#if sub.foreignRelationType =='0'>\n    const ${sub.entityName?uncap_first}Table = reactive({\n          loading: false,\n          dataSource: [],\n          columns:${sub.entityName?uncap_first}Columns,\n          baseRowStyle: { padding: \"0 20px\"}\n    })\n    </#if>\n   </#list>\n    //表单配置\n    const [registerForm, {setProps,resetFields, setFieldsValue, validate}] = useForm({\n        <#if tableVo.fieldRowNum == 1>\n        labelWidth: 150,\n        </#if>\n        schemas: formSchema,\n        showActionButtonGroup: false,\n        baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}},\n        baseRowStyle: { padding: \"0 20px\" }\n    });\n     //表单赋值\n    const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {\n        //重置表单\n        await reset();\n        setModalProps({confirmLoading: false,showCancelBtn:data?.showFooter,showOkBtn:data?.showFooter});\n        isUpdate.value = !!data?.isUpdate;\n        formDisabled.value = !data?.showFooter;\n        if (unref(isUpdate)) {\n            //表单赋值\n            await setFieldsValue({\n                ...data.record,\n            });\n            <#list subTables as sub><#rt/>\n            <#if sub.foreignRelationType =='1'>\n             ${sub.entityName?uncap_first}Form.value.initFormData(${sub.entityName?uncap_first}List,data?.record?.id)\n            </#if>\n            </#list>\n            <#list subTables as sub><#rt/>\n            <#if sub.foreignRelationType =='0'>\n             requestSubTableData(${sub.entityName?uncap_first}List, {id:data?.record?.id}, ${sub.entityName?uncap_first}Table)\n            </#if>\n            </#list>\n        }\n        // 隐藏底部时禁用整个表单\n       setProps({ disabled: !data?.showFooter })\n    });\n    //方法配置\n    const [handleChangeTabs,handleSubmit,requestSubTableData,formRef] = useJvxeMethod(requestAddOrEdit,classifyIntoFormData,tableRefs,activeKey,refKeys<#if hasOne2One==true>,validateSubForm</#if>);\n\n    //设置标题\n    const title = computed(() => (!unref(isUpdate) ? '新增' : !unref(formDisabled) ? '编辑' : '详情'));\n\n    async function reset(){\n      await resetFields();\n      activeKey.value = '${subTables[0].entityName?uncap_first}';\n      <#list subTables as sub>\n        <#if sub.foreignRelationType =='0'>\n      ${sub.entityName?uncap_first}Table.dataSource = [];\n        </#if>\n        <#if sub.foreignRelationType =='1'>\n      ${sub.entityName?uncap_first}Form.value.resetFields();\n        </#if>\n      </#list>\n    }\n    function classifyIntoFormData(allValues) {\n         let main = Object.assign({}, allValues.formValue)\n         return {\n           ...main, // 展开\n <#assign subManyIndex = 0>\n <#list subTables as sub><#rt/>\n <#if sub.foreignRelationType =='0'>\n           ${sub.entityName?uncap_first}List: allValues.tablesValue[${subManyIndex}].tableData,\n           <#assign subManyIndex = subManyIndex+1>\n <#else>\n           ${sub.entityName?uncap_first}List: ${sub.entityName?uncap_first}Form.value.getFormData(),\n </#if>\n </#list>\n         }\n       }\n      <#if hasOne2One==true>\n     //校验所有一对一子表表单\n     function validateSubForm(allValues){\n         return new Promise((resolve,reject)=>{\n             Promise.all([\n             <#list subTables as sub><#rt/>\n            <#if sub.foreignRelationType =='1'>\n                  ${sub.entityName?uncap_first}Form.value.validateForm(${sub_index}),\n            </#if>\n          </#list>\n             ]).then(() => {\n                 resolve(allValues)\n             }).catch(e => {\n                 if (e.error === VALIDATE_FAILED) {\n                     // 如果有未通过表单验证的子表，就自动跳转到它所在的tab\n                     activeKey.value = e.index == null ? unref(activeKey) : refKeys.value[e.index]\n                     if (e.errorFields) {\n                       const firstField = e.errorFields[0];\n                       if (firstField) {\n                         e.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });\n                       }\n                     }\n                 } else {\n                     console.error(e)\n                 }\n             })\n         })\n     }\n    </#if>\n    //表单提交事件\n    async function requestAddOrEdit(values) {\n        try {\n            // 预处理日期数据\n            changeDateValue(values);\n            setModalProps({confirmLoading: true});\n            //提交表单\n            await saveOrUpdate(values, isUpdate.value);\n            //关闭弹窗\n            closeModal();\n            //刷新列表\n            emit('success');\n        } finally {\n            setModalProps({confirmLoading: false});\n        }\n    }\n\n    /**\n     * 处理日期值\n     * @param formData 表单数据\n     */\n    const changeDateValue = (formData) => {\n      if (formData && fieldPickers) {\n          for (let key in fieldPickers) {\n              if (formData[key]) {\n                  formData[key] = getDateByPicker(formData[key], fieldPickers[key]);\n              }\n          }\n      }\n      <#list subTables as sub>\n        <#if sub.foreignRelationType =='0'>\n      if(formData && formData.${sub.entityName?uncap_first}List && formData.${sub.entityName?uncap_first}List.length > 0){\n          formData.${sub.entityName?uncap_first}List.forEach(subFormData=>{\n              for (let key in ${sub.entityName?uncap_first}FieldPickers) {\n                  if (subFormData[key]) {\n                      subFormData[key] = getDateByPicker(subFormData[key], ${sub.entityName?uncap_first}FieldPickers[key]);\n                  }\n              }\n          })\n      }\n        </#if>\n      </#list>\n    };\n<#if buttonList?size gt 0>\n  <#list buttonList as btn>\n      <#if btn.buttonStyle=='form'>\n         function handle${btn.buttonCode?cap_first}(){\n            createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n         }\n      </#if>\n  </#list>\n</#if>\n</script>\n\n<style lang=\"less\" scoped>\n\t/** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-calendar-picker) {\n    width: 100%;\n  }\n  \n  .jeecg-tab {\n    padding: 0 20px;\n  }\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<#list subTables as sub>\n<#if sub.foreignRelationType=='1'>\n#segment#${sub.entityName}Form.vue\n<template>\n    <BasicForm @register=\"registerForm\" name=\"${sub.entityName}Form\" class=\"basic-modal-form\"/>\n</template>\n<script lang=\"ts\">\n    import {defineComponent} from 'vue';\n    import {BasicForm, useForm} from '/@/components/Form/index';\n    import {${sub.entityName?uncap_first}FormSchema} from '../${entityName}.data';\n    import {defHttp} from '/@/utils/http/axios';\n    import { VALIDATE_FAILED } from '/@/utils/common/vxeUtils'\n\n    export default defineComponent({\n        name:\"${sub.entityName}Form\",\n        components: {BasicForm},\n        emits:['register'],\n        props:{\n            disabled: {\n                type: Boolean,\n                default: false\n            }\n        },\n        setup(props,{emit}) {\n            const [registerForm, { setProps, resetFields, setFieldsValue, getFieldsValue, validate, scrollToField }] = useForm({\n                <#if tableVo.fieldRowNum == 1>\n                labelWidth: 150,\n                </#if>\n                schemas: ${sub.entityName?uncap_first}FormSchema,\n                showActionButtonGroup: false,\n                baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}}\n            });\n            /**\n            *初始化加载数据\n            */\n            function initFormData(url,id){\n                if(id){\n                     defHttp.get({url,params:{id}},{isTransformResponse:false}).then(res=>{\n                       res.success && setFieldsValue({...res.result[0]});\n                    })\n                }\n                setProps({disabled: props.disabled})\n            }\n           /**\n            *获取表单数据\n            */\n            function getFormData(){\n               let formData = getFieldsValue();\n               Object.keys(formData).map(k=>{\n                    if(formData[k] instanceof Array){\n                        formData[k] = formData[k].join(',')\n                    }\n               });\n               return [formData];\n            }\n            /**\n            *表单校验\n            */\n            function validateForm(index){\n                return new Promise((resolve, reject) => {\n                    // 验证子表表单\n                    validate().then(()=>{\n                        return resolve()\n                    }).catch(({ errorFields }) => {\n                      return reject({ error: VALIDATE_FAILED, index, errorFields: errorFields, scrollToField: scrollToField });\n                    });\n                })\n            }\n            return {\n                registerForm,\n                resetFields,\n                initFormData,\n                getFormData,\n                validateForm\n            }\n        }\n    })\n</script>\n<style lang=\"less\" scoped>\n  .basic-modal-form {\n    overflow: auto;\n    height: 340px;\n  }\n</style>\n</#if>\n</#list>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}List.vuei",
    "content": "﻿<#include \"/common/utils.ftl\">\n<template>\n  <div class=\"p-2\">\n    <#assign query_field_no=0>\n    <#assign need_category = false>\n    <#assign need_pca = false>\n    <#assign need_search = false>\n    <#assign need_dept_user = false>\n    <#assign need_switch = false>\n    <#assign need_dept = false>\n    <#assign need_multi = false>\n    <#assign need_popup = false>\n    <#assign need_popup_dict = false>\n    <#assign need_select_tag = false>\n    <#assign need_select_tree = false>\n    <#assign need_time = false>\n    <#assign bpm_flag=false>\n    <#assign need_markdown = false>\n    <#assign need_upload = false>\n    <#assign need_image_upload = false>\n    <#assign need_editor = false>\n    <#assign need_checkbox = false>\n    <#assign query_flag = false>\n    <#assign need_range_number = false>\n    <#assign is_range = false>\n    <#assign is_like = false>\n    <#assign buttonList=[]>\n    <#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n      <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n    </#if>\n    <!--查询区域-->\n    <div class=\"jeecg-basic-table-form-container\">\n      <a-form ref=\"formRef\" @keyup.enter.native=\"reload\" :model=\"queryParam\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\">\n        <a-row :gutter=\"24\">\n          <#-- 开始循环 -->\n          <#list columns as po>\n            <#if po.fieldDbName=='bpm_status'>\n              <#assign bpm_flag=true>\n            </#if>\n            <#if po.isQuery=='Y'>\n              <#assign query_flag=true>\n            </#if>\n            <#if po.classType=='cat_tree' && po.dictText?default(\"\")?trim?length == 0>\n              <#assign need_category=true>\n            </#if>\n            <#if po.classType=='pca'>\n              <#assign need_pca=true>\n            </#if>\n            <#if po.classType=='sel_search'>\n              <#assign need_search = true>\n            </#if>\n            <#if po.classType=='sel_user'>\n              <#assign need_dept_user = true>\n            </#if>\n            <#if po.classType=='sel_depart'>\n              <#assign need_dept = true>\n            </#if>\n            <#if po.classType=='switch'>\n              <#assign need_switch = true>\n            </#if>\n            <#if po.classType=='list_multi'>\n              <#assign need_multi = true>\n            </#if>\n            <#if po.classType=='popup'>\n              <#assign need_popup = true>\n            </#if>\n            <#if po.classType=='popup_dict'>\n              <#assign need_popup_dict = true>\n            </#if>\n            <#if po.classType=='sel_tree'>\n              <#assign need_select_tree = true>\n            </#if>\n            <#if po.classType=='time'>\n              <#assign need_time = true>\n            </#if>\n            <#if po.queryMode=='group' && (po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal')>\n              <#assign need_range_number = true>\n            </#if>\n            <#if po.queryMode=='group'>\n              <#assign is_range = true>\n            </#if>\n            <#if po.queryMode=='like'>\n              <#assign is_like = true>\n            </#if>\n            <#include \"/common/form/native/vue3NativeSearch.ftl\">\n          </#list>\n          <#if query_field_no gt 2>\n          </template>\n</#if>\n<#if query_flag>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left; overflow: hidden\" class=\"table-page-search-submitButtons\">\n              <a-col :lg=\"6\">\n                <a-button type=\"primary\" preIcon=\"ant-design:search-outlined\" @click=\"reload\">查询</a-button>\n                <a-button preIcon=\"ant-design:reload-outlined\" @click=\"searchReset\" style=\"margin-left: 8px\">重置</a-button>\n                <a @click=\"toggleSearchStatus = !toggleSearchStatus\" style=\"margin-left: 8px\">\n                  {{ toggleSearchStatus ? '收起' : '展开' }}\n                  <Icon :icon=\"toggleSearchStatus ? 'ant-design:up-outlined' : 'ant-design:down-outlined'\" />\n                </a>\n              </a-col>\n            </span>\n          </a-col>\n</#if>\n        </a-row>\n      </a-form>\n    </div>\n<#-- 结束循环 -->\n    <!--引用表格-->\n   <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n     <!--插槽:table标题-->\n      <template #tableTitle>\n          <a-button type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:add'\"  @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\"> 新增</a-button>\n          <a-button  type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:exportXls'\"  preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n          <j-upload-button  type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:importExcel'\"  preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n     <#if buttonList?size gt 0>\n      <#list buttonList as btn>\n         <#if btn.buttonStyle == 'button'>\n           <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n         </#if>\n       </#list>\n     </#if>\n          <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n              <template #overlay>\n                <a-menu>\n                  <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                    <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                    删除\n                  </a-menu-item>\n                </a-menu>\n              </template>\n              <a-button v-auth=\"'${entityPackage}:${tableName}:deleteBatch'\">批量操作\n                <Icon icon=\"mdi:chevron-down\"></Icon>\n              </a-button>\n        </a-dropdown>\n        <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n        <!-- 高级查询 -->\n        <super-query :config=\"superQueryConfig\" @search=\"handleSuperQuery\" />\n        <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n      </template>\n       <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\"/>\n      </template>\n      <!--字段回显插槽-->\n      <template v-slot:bodyCell=\"{ column, record, index, text }\">\n      <#list columns as po>\n        <#if po.classType=='umeditor' || po.classType=='pca' || po.classType=='file'>\n        <template v-if=\"column.dataIndex==='${po.fieldName}'\">\n        <#if po.classType=='umeditor'>\n          <!--富文本件字段回显插槽-->\n          <div v-html=\"text\"></div>\n        </#if>\n        <#if po.classType=='pca'>\n          <!--省市区字段回显插槽-->\n          {{ getAreaTextByCode(text) }}\n        </#if>\n        <#if po.classType=='file'>\n          <!--文件字段回显插槽-->\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n          <a-button v-else :ghost=\"true\" type=\"primary\" preIcon=\"ant-design:download-outlined\" size=\"small\" @click=\"downloadFile(text)\">下载</a-button>\n        </#if>\n        </template>\n        </#if>\n      </#list>\n      </template>\n    </BasicTable>\n    <!-- 表单区域 -->\n    <${entityName}Modal @register=\"registerModal\" @success=\"handleSuccess\"></${entityName}Modal>\n    <#if bpm_flag==true>\n      <!-- 审批记录 -->\n      <BpmPictureModal @register=\"registerBpmModal\" />\n     </#if>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"${entityPackage}-${entityName?uncap_first}\" setup>\n  import {ref, reactive, computed, unref} from 'vue';\n  import {BasicTable, useTable, TableAction} from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage'\n  import {useModal} from '/@/components/Modal';\n  import ${entityName}Modal from './components/${entityName}Modal.vue'\n  import {columns, superQuerySchema} from './${entityName}.data';\n  import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './${entityName}.api';\n  import {downloadFile} from '/@/utils/common/renderUtils';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  <#include \"/common/form/native/vue3NativeImport.ftl\">\n<#if need_pca>\n  import { getAreaTextByCode } from '/@/components/Form/src/utils/Area';\n</#if>\n  <#if need_category>\n  import { loadCategoryData } from '/@/api/common/api'\n  import { getAuthCache, setAuthCache } from '/@/utils/auth';\n  import { DB_DICT_DATA_KEY } from '/@/enums/cacheEnum';\n  </#if>\n  <#if bpm_flag==true>\n  import { startProcess } from '/@/api/common/api';\n\n  const [registerBpmModal, { openModal: bpmPicModal }] = useModal();\n  </#if>\n  <#if is_range>\n  import { cloneDeep } from \"lodash-es\";\n  </#if>\n<#if need_popup_dict>\n  import {getPopDictByCode} from \"@/utils/dict\";\n  import {filterMultiDictText} from \"@/utils/dict/JDictSelectUtil\";\n</#if>\n  import { getDateByPicker } from '/@/utils';\n  import { useUserStore } from '/@/store/modules/user';\n\n  const fieldPickers = reactive({\n  <#list columns as po>\n    <#if po.extendParams?exists && po.extendParams.picker?exists>\n    ${po.fieldName}: '${po.extendParams.picker}',\n    </#if>\n  </#list>\n  });\n  const formRef = ref();\n  const queryParam = reactive<any>({});\n  const checkedKeys = ref<Array<string | number>>([]);\n  //注册model\n  const [registerModal, {openModal}] = useModal();\n  const userStore = useUserStore();\n  const { createMessage } = useMessage();\n   //注册table数据\n  const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({\n      tableProps:{\n           title: '${tableVo.ftlDescription}',\n           api: list,\n           columns,\n           canResize:true,\n           useSearchForm: false,\n           actionColumn: {\n               width: 120,\n               fixed:'right'\n           },\n           beforeFetch: async (params) => {\n            <#if is_range>\n             let rangerQuery = await setRangeQuery();\n             return Object.assign(params, rangerQuery);\n            <#else>\n             for (let key in fieldPickers) {\n                if (queryParam[key] && fieldPickers[key]) {\n                  queryParam[key] = getDateByPicker(queryParam[key], fieldPickers[key]);\n                }\n             }\n             return Object.assign(params, queryParam);\n            </#if>\n           },\n           <#if need_popup_dict>\n           afterFetch: afterFetch,\n           </#if>\n        },\n        exportConfig: {\n            name:\"${tableVo.ftlDescription}\",\n            url: getExportUrl,\n          <#if is_range>\n            params: setRangeQuery,\n          <#else>\n            params: queryParam,\n          </#if>\n        },\n        importConfig: {\n            url: getImportUrl,\n            success: handleSuccess\n        },\n    })\n\n  const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext\n\n<#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n  // 高级查询配置\n  const superQueryConfig = reactive(superQuerySchema);\n\n  /**\n   * 高级查询事件\n   */\n  function handleSuperQuery(params) {\n    Object.keys(params).map((k) => {\n      queryParam[k] = params[k];\n    });\n    reload();\n  }\n<#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n\n   /**\n    * 新增事件\n    */\n  function handleAdd() {\n     openModal(true, {\n       isUpdate: false,\n       showFooter: true,\n     });\n  }\n   /**\n    * 编辑事件\n    */\n  function handleEdit(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: true,\n     });\n   }\n   /**\n    * 详情\n   */\n  function handleDetail(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: false,\n     });\n   }\n   /**\n    * 删除事件\n    */\n  async function handleDelete(record) {\n     await deleteOne({id: record.id}, handleSuccess);\n   }\n   /**\n    * 批量删除事件\n    */\n  async function batchHandleDelete() {\n     await batchDelete({ids: selectedRowKeys.value},handleSuccess);\n   }\n   /**\n    * 成功回调\n    */\n  function handleSuccess() {\n      (selectedRowKeys.value = []) && reload();\n   }\n   /**\n      * 操作栏\n      */\n  function getTableAction(record){\n       return [\n         {\n           label: '编辑',\n           onClick: handleEdit.bind(null, record),\n           auth: '${entityPackage}:${tableName}:edit'\n         }\n       ]\n   }\n     /**\n        * 下拉操作栏\n        */\n  function getDropDownAction(record){\n       <#if bpm_flag==true>\n       let dropDownAction = [\n         {\n           label: '详情',\n           onClick: handleDetail.bind(null, record),\n         }, {\n           label: '删除',\n           popConfirm: {\n             title: '是否确认删除',\n             confirm: handleDelete.bind(null, record)\n           },\n           auth: '${entityPackage}:${tableName}:delete'\n         },\n           {\n             label: '审批进度',\n             onClick: handlePreviewPic.bind(null, record),\n             ifShow: !!record.bpmStatus && record.bpmStatus !== '1',\n           }\n   <#if buttonList?size gt 0>\n        <#list buttonList as btn>\n           <#if btn.buttonStyle == 'link'>\n           ,{\n              label: '${btn.buttonName}',\n              onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n            }\n           </#if>\n         </#list>\n     </#if>\n       ];\n       if(record.bpmStatus == '1' || !record.bpmStatus){\n         dropDownAction.push({\n           label: '发起流程',\n           popConfirm: {\n             title: '确认提交流程吗？',\n             confirm: handleProcess.bind(null, record),\n             placement: 'topLeft',\n           }\n         })\n       }\n       return dropDownAction;\n       <#else>\n       return [\n         {\n           label: '详情',\n           onClick: handleDetail.bind(null, record),\n         }, {\n           label: '删除',\n           popConfirm: {\n             title: '是否确认删除',\n             confirm: handleDelete.bind(null, record),\n             placement: 'topLeft'\n           },\n           auth: '${entityPackage}:${tableName}:delete'\n         }\n\n  <#if buttonList?size gt 0>\n     <#list buttonList as btn>\n        <#if btn.buttonStyle == 'link'>\n        ,{\n           label: '${btn.buttonName}',\n           onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n         }\n        </#if>\n      </#list>\n  </#if>\n       ]\n       </#if>\n   }\n\n  <#if bpm_flag==true>\n  /**\n   * 提交流程\n   */\n  async function handleProcess(record) {\n    let params = {\n      flowCode: 'dev_${tableName}_001',\n      id: record.id,\n      formUrl: '${entityPackagePath}/components/${entityName}Form',\n      formUrlMobile: ''\n    }\n    await startProcess(params);\n    handleSuccess();\n  }\n\n  /**\n   * 审批进度\n   */\n  async function handlePreviewPic(record) {\n    bpmPicModal(true, {\n      flowCode: 'dev_${tableName}_001',\n      dataId: record.id,\n    });\n  }\n  </#if>\n\n  <#if buttonList?size gt 0>\n    <#list buttonList as btn>\n    <#if btn.buttonStyle=='button'>\n       function handle${btn.buttonCode?cap_first}(){\n          createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n       }\n    </#if>\n     <#if btn.buttonStyle=='link'>\n      function handle${btn.buttonCode?cap_first}(record){\n        createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n      }\n     </#if>\n    </#list>\n  </#if>\n\n    <#if need_category>\n  /**\n   * form点击事件\n   * @param value\n   */\n  function handleFormChange(key, value) {\n    queryParam[key] = value;\n  }\n   /**\n    * 初始化字典配置\n   */\n    function initDictConfig(){\n     <#list columns as po>\n     <#if (po.isQuery=='Y' || po.isShowList=='Y') && po.classType!='popup'>\n       <#if po.classType=='cat_tree' && need_category==true>\n       loadCategoryData({code:'${po.dictField?default(\"\")}'}).then((res) => {\n         if (res) {\n            const allDictDate = userStore.getAllDictItems;\n            if(!allDictDate['${po.dictField?default(\"\")}']){\n              userStore.setAllDictItems({...allDictDate,'${po.dictField?default(\"\")}':res});\n            }\n         }\n       })\n       </#if>\n     </#if>\n     </#list>\n   }\n   initDictConfig();\n    </#if>\n\n    <#if need_popup_dict>\n   /**\n    * 翻译Popup字典配置\n   */\n    async function afterFetch(records){\n <#list columns as po>\n    <#if po.isQuery=='Y' || po.isShowList=='Y'>\n      <#if po.classType=='popup_dict'>\n      const ${po.fieldName}Keys = [...new Set(records.map((item) => item['${po.fieldName}']).flatMap((item) => item && item.split(',')))];\n      if(${po.fieldName}Keys && ${po.fieldName}Keys.length){\n       const dictOptions = await getPopDictByCode(${po.fieldName}Keys.join(','), '${po.dictTable},${po.dictField},${po.dictText}');\n       records.forEach((item) => {\n         item['${po.fieldName}_dictText'] = filterMultiDictText(dictOptions, item['${po.fieldName}']);\n       });\n      }\n      </#if>\n    </#if>\n </#list>\n     return records;\n   }\n    </#if>\n  /* ----------------------以下为原生查询需要添加的-------------------------- */\n  const toggleSearchStatus = ref<boolean>(false);\n  const labelCol = reactive({\n    xs:24,\n    sm:4,\n    xl:6,\n    xxl:4\n  });\n  const wrapperCol = reactive({\n    xs: 24,\n    sm: 20,\n  });\n  /**\n   * 重置\n   */\n  function searchReset() {\n    formRef.value.resetFields();\n    selectedRowKeys.value = [];\n    //刷新数据\n    reload();\n  }\n  <#if need_popup>\n  /**\n   *  popup组件值改变事件\n   */\n  function setFieldsValue(map) {\n    Object.keys(map).map((key) => {\n      queryParam[key] = map[key];\n    });\n  }\n  </#if>\n\n  <#if need_pca || need_dept_user>\n  /**\n   * form点击事件(以逗号分割)\n   * @param key\n   * @param value\n   */\n  function handleFormJoinChange(key, value) {\n    if (typeof value != 'string') {\n      queryParam[key] = value.join(',');\n    }\n  }\n  </#if>\n  <#if is_range>\n  \n  let rangeField = '${getRangeField(columns)}'\n  \n  /**\n   * 设置范围查询条件\n   */\n  async function setRangeQuery(){\n    let queryParamClone = cloneDeep(queryParam);\n    if (rangeField) {\n      let fieldsValue = rangeField.split(',');\n      fieldsValue.forEach(item => {\n        if (queryParamClone[item]) {\n          let range = queryParamClone[item];\n          queryParamClone[item+'_begin'] = range[0];\n          queryParamClone[item+'_end'] = range[1];\n          delete queryParamClone[item];\n        } else {\n          queryParamClone[item+'_begin'] = '';\n          queryParamClone[item+'_end'] = '';\n        }\n      })\n    }\n    return queryParamClone;\n  }\n  </#if>\n</script>\n<style lang=\"less\" scoped>\n<#include \"/common/form/native/vueNativeSearchStyle.ftl\">\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__api.tsi",
    "content": "import {defHttp} from '/@/utils/http/axios';\nimport { useMessage } from \"/@/hooks/web/useMessage\";\n\nconst { createConfirm } = useMessage();\n\nenum Api {\n  list = '/${entityPackagePath}/${entityName?uncap_first}/list',\n  save='/${entityPackagePath}/${entityName?uncap_first}/add',\n  edit='/${entityPackagePath}/${entityName?uncap_first}/edit',\n  deleteOne = '/${entityPackagePath}/${entityName?uncap_first}/delete',\n  deleteBatch = '/${entityPackagePath}/${entityName?uncap_first}/deleteBatch',\n  importExcel = '/${entityPackagePath}/${entityName?uncap_first}/importExcel',\n  exportXls = '/${entityPackagePath}/${entityName?uncap_first}/exportXls',\n  queryDataById = '/${entityPackagePath}/${entityName?uncap_first}/queryById',\n<#list subTables as sub><#rt/>\n  ${sub.entityName?uncap_first}List = '/${entityPackagePath}/${entityName?uncap_first}/query${sub.entityName}ByMainId',\n</#list>\n}\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n\n<#list subTables as sub><#rt/>\n/**\n * 查询子表数据\n * @param params\n */\nexport const query${sub.entityName}ListByMainId = (id) => defHttp.get({url: Api.${sub.entityName?uncap_first}List, params:{ id }});\n</#list>\n\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) =>\n  defHttp.get({url: Api.list, params});\n\n/**\n * 删除单个\n */\nexport const deleteOne = (params,handleSuccess) => {\n  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n/**\n * 批量删除\n * @param params\n */\nexport const batchDelete = (params, handleSuccess) => {\n  createConfirm({\n    iconType: 'warning',\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n/**\n * 保存或者更新\n * @param params\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({url: url, params});\n}\n\n/**\n* 根据id查询数据\n* @param params\n*/\nexport const queryDataById = (id) => defHttp.get({url: Api.queryDataById, params:{ id }});\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/${entityName}__data.tsi",
    "content": "<#include \"/common/utils.ftl\">\nimport {BasicColumn} from '/@/components/Table';\nimport {FormSchema} from '/@/components/Table';\nimport { rules} from '/@/utils/helper/validator';\nimport { render } from '/@/utils/common/renderUtils';\nimport {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types'\nimport { getWeekMonthQuarterYear } from '/@/utils';\n//列表数据\nexport const columns: BasicColumn[] = [\n <#list columns as po>\n   <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n   <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   {\n    title: '${po.filedComment}',\n    align:\"center\",\n    <#if po.sort=='Y'>\n    sorter: true,\n   </#if>\n    <#if po.classType=='date'>\n    dataIndex: '${po.fieldName}',\n    customRender:({text}) =>{\n      text = !text ? \"\" : (text.length > 10 ? text.substr(0,10) : text);\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      if(text) {\n        return getWeekMonthQuarterYear(text)['${po.extendParams.picker}'];\n      } else {\n        return text;\n      }\n      <#else>\n      return text;\n      </#if>\n    },\n    <#elseif po.fieldDbType=='Blob'>\n    dataIndex: '${po.fieldName}String'\n    <#elseif po.classType=='umeditor'>\n    dataIndex: '${po.fieldName}',\n    <#elseif po.classType=='pca'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='file'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='image'>\n    dataIndex: '${po.fieldName}',\n    customRender:render.renderImage,\n   <#elseif po.classType=='switch'>\n    dataIndex: '${po.fieldName}',\n<#assign switch_extend_arr=['Y','N']>\n<#if po.dictField?default(\"\")?contains(\"[\")>\n<#assign switch_extend_arr=po.dictField?eval>\n</#if>\n<#list switch_extend_arr as a>\n<#if a_index == 0>\n<#assign switch_extend_arr1=a>\n<#else>\n<#assign switch_extend_arr2=a>\n</#if>\n</#list>\n    customRender:({text}) => {\n       return  render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}])\n     },\n   <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict'>\n    dataIndex: '${po.fieldName}_dictText'\n   <#elseif po.classType=='cat_tree'>\n    dataIndex: '${po.fieldName}',\n    <#if po.dictText?default(\"\")?trim?length == 0>\n    customRender:({text}) => {\n       return  render.renderCategoryTree(text,'${po.dictField?default(\"\")}')\n   },\n   <#else>\n    customRender: ({text, record}) => (text ? record['${po.dictText}'] : '')\n   </#if>\n   <#else>\n    dataIndex: '${po.fieldName}'\n   </#if>\n   },\n   </#if>\n </#list>\n];\n\n//子表表格配置\n<#list subTables as sub>\n<#if sub.foreignRelationType =='0'>\nexport const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [\n<#assign popupBackFields = \"\">\n\n<#-- 循环子表的列 开始 -->\n<#list sub.colums as col><#rt/>\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if col.isShow =='Y' && col.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if col.filedComment !='外键' >\n    {\n      title: '${col.filedComment}',\n      key: '${autoStringSuffixForModel(col)}',\n<#if col.classType =='date'>\n      type: JVxeTypes.date,\n      <#if col.extendParams?exists && col.extendParams.picker?exists>\n      picker: '${col.extendParams.picker}',\n      </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='datetime'>\n      type: JVxeTypes.datetime,\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='time'>\n      type: JVxeTypes.time,\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='textarea'>\n      type: JVxeTypes.textarea,\n       <#if col.readonly=='Y'>\n      disabled:true,\n       </#if>\n<#elseif col.classType =='list' || col.classType =='radio'>\n      type: JVxeTypes.select,\n      options:[],\n      <#if col.dictTable?default(\"\")?trim?length gt 1>\n      dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n      <#else>\n      dictCode:\"${col.dictField}\",\n      </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='list_multi' || col.classType =='checkbox'>\n      type: JVxeTypes.selectMultiple,\n      options:[],\n      <#if col.dictTable?default(\"\")?trim?length gt 1>\n      dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n      <#else>\n      dictCode:\"${col.dictField}\",\n      </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='sel_search'>\n      type: JVxeTypes.selectSearch,\n      <#if col.dictTable?default(\"\")?trim?length gt 1>\n      dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n      <#else>\n      dictCode:\"${col.dictField}\",\n      </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='sel_depart'>\n      type: JVxeTypes.departSelect,\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='sel_user'>\n      type: JVxeTypes.userSelect,\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='image'>\n      type: JVxeTypes.image,\n      token:true,\n      responseName:\"message\",\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n      <#if col.uploadnum??>\n      number: ${col.uploadnum},\n      </#if>\n<#elseif col.classType =='file'>\n      type: JVxeTypes.file,\n      token:true,\n      responseName:\"message\",\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n      <#if col.uploadnum??>\n      number: ${col.uploadnum},\n      </#if>\n<#elseif col.classType =='switch'>\n      type: JVxeTypes.checkbox,\n       <#if col.dictField == 'is_open'>\n      customValue: ['Y', 'N'],\n        <#else>\n      customValue: ${col.dictField},\n        </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType=='pca'>\n      type: JVxeTypes.pca,\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='popup'>\n<#if popupBackFields?length gt 0>\n    <#assign popupBackFields = \"${popupBackFields}\"+\",\"+\"${col.dictText}\">\n<#else>\n    <#assign popupBackFields = \"${col.dictText}\">\n</#if>\n    <#include \"/common/form/vue3Jvxepopup.ftl\">\n<#-- update-begin-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对，数字或者金额类型 -->\n<#-- elseif \"int,decimal,double,\"?contains(col.classType) -->\n<#elseif col.fieldDbType=='int' || col.fieldDbType=='long' || col.fieldDbType=='double' || col.fieldDbType=='BigDecimal'>\n<#-- update-end-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对，数字或者金额类型 -->\n      type: JVxeTypes.inputNumber,\n    <#if col.readonly=='Y'>\n      disabled:true,\n    </#if>\n<#else>\n      type: JVxeTypes.input,\n       <#if col.readonly=='Y'>\n      disabled:true,\n       </#if>\n</#if>\n<#if col.classType =='list_multi' || col.classType =='checkbox'>\n      width:\"250px\",\n<#else>\n      width:\"200px\",\n</#if>\n<#if col.classType =='file'>\n      placeholder: '请选择文件',\n<#else>\n      placeholder: '请输入${'$'}{title}',\n</#if>\n<#if col.defaultVal??>\n<#if col.fieldDbType==\"BigDecimal\" || col.fieldDbType==\"double\" || col.fieldDbType==\"int\">\n      defaultValue:${col.defaultVal},\n      <#else>\n      defaultValue:\"${col.defaultVal}\",\n</#if>\n<#else>\n      defaultValue:'',\n</#if>\n<#-- 子表的校验 -->\n <#include \"/common/validatorRulesTemplate/sub-vue3.ftl\">\n    },\n</#if>\n</#if>\n</#list>\n<#-- 循环子表的列 结束 -->\n  ]\n</#if>\n</#list>\n\n<#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n// 高级查询数据\nexport const superQuerySchema = {\n  <#list columns as po>\n  <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n  <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  ${superQueryFieldListForVue3(po,po_index)},\n  </#if>\n  </#list>\n  //子表高级查询\n  <#list subTables as sub>\n  ${sub.entityName?uncap_first}: {\n    title: '${sub.ftlDescription}',\n    view: 'table',\n    fields: {\n      <#list sub.colums as subCol>\n        <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n        <#if subCol.isShowList =='Y' && subCol.fieldName !='id' && subCol.fieldName !='delFlag'>\n        <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n        ${superQueryFieldListForVue3(subCol,subCol_index)},\n        </#if>\n      </#list>\n    }\n  },\n  </#list>\n};\n<#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/V${currentDate}_1__menu_insert_${entityName}.sql",
    "content": "<#include \"/common/sql/menu_insert.ftl\">"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<#assign need_category = false>\n<#assign bpm_flag=false>\n<#assign need_pca = false>\n<#assign need_search = false>\n<#assign need_dept_user = false>\n<#assign need_switch = false>\n<#assign need_dept = false>\n<#assign need_multi = false>\n<#assign need_popup = false>\n<#assign need_popup_dict = false>\n<#assign need_select_tag = false>\n<#assign need_select_tree = false>\n<#assign need_time = false>\n<#assign need_markdown = false>\n<#assign need_upload = false>\n<#assign need_image_upload = false>\n<#assign need_editor = false>\n<#assign need_checkbox = false>\n<#assign need_range_number = false>\n<#assign is_like = false>\n<#assign form_span = 24>\n<#if tableVo.fieldRowNum==2>\n    <#assign form_span = 12>\n<#elseif tableVo.fieldRowNum==3>\n    <#assign form_span = 8>\n<#elseif tableVo.fieldRowNum==4>\n    <#assign form_span = 6>\n</#if>\n<#assign hasOne2manyTable = false>\n<#assign subTabActiveKey = ''>\n<#assign subMainFieldMap={}>\n<#assign subTableColumnsKey=[]>\n<#assign hasOnlyValidate = false>\n<template>\n  <a-spin :spinning=\"loading\">\n    <JFormContainer :disabled=\"disabled\">\n      <template #detail>\n        <a-form v-bind=\"formItemLayout\" name=\"${entityName}Form\" ref=\"formRef\" class=\"jeecg-native-form\">\n          <a-row>\n            <#list columns as po>\n              <#if po.isShow == 'Y' && po.fieldValidType?default(\"\") == 'only'>\n                <#assign hasOnlyValidate = true>\n              </#if>\n              <#if po.fieldDbName=='bpm_status'>\n                  <#assign bpm_flag=true>\n              </#if>\n      <#assign formEntityName>${entityName}Form</#assign>\n      <#include \"/common/form/native/vue3NativeForm.ftl\">\n            </#list>\n          </a-row>\n        </a-form>\n      </template>\n    </JFormContainer>\n\n\t\t<!-- 子表单区域 -->\n    <a-tabs v-model:activeKey=\"activeKey\" animated style=\"overflow:hidden;\" class=\"jeecg-native-tab\">\n<#list subTables as sub><#rt/>\n      <#if sub.foreignRelationType =='1'>\n      <a-tab-pane class=\"sub-one-form\" tab=\"${sub.ftlDescription}\" key=\"${sub.entityName?uncap_first}\" :forceRender=\"true\">\n      <#else>\n      <a-tab-pane tab=\"${sub.ftlDescription}\" key=\"${sub.entityName?uncap_first}\" :forceRender=\"true\">\n      </#if>\n\t\t\t  <#if sub.foreignRelationType =='1'>\n        <${Format.humpToShortbar(sub.entityName)}-form ref=\"${sub.entityName?uncap_first}FormRef\" :disabled=\"disabled\"></${Format.humpToShortbar(sub.entityName)}-form>\n\t\t\t  <#else>\n        <j-vxe-table\n          :keep-source=\"true\"\n          resizable\n          ref=\"${sub.entityName?uncap_first}TableRef\"\n          :loading=\"${sub.entityName?uncap_first}Table.loading\"\n          :columns=\"${sub.entityName?uncap_first}Table.columns\"\n          :dataSource=\"${sub.entityName?uncap_first}Table.dataSource\"\n          :height=\"340\"\n          :disabled=\"disabled\"\n          :rowNumber=\"true\"\n          :rowSelection=\"true\"\n          :toolbar=\"true\"/>\n\t\t\t  </#if>\n      </a-tab-pane>\n</#list>\n    </a-tabs>\n    <#if bpm_flag>\n    <div v-if=\"showFlowSubmitButton\" :span=\"24\" style=\"width: 100%;text-align: center;margin-top: 10px\">\n      <a-button preIcon=\"ant-design:check-outlined\" style=\"width: 126px\" type=\"primary\" @click=\"submitForm\">提 交</a-button>\n    </div>\n    </#if>\n  </a-spin>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, ref, reactive, computed, toRaw, onMounted } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { useValidateAntFormAndTable } from '/@/hooks/system/useJvxeMethods';\n  import { <#list subTables as sub><#if sub.foreignRelationType =='0'>query${sub.entityName}ListByMainId, </#if></#list>queryDataById, saveOrUpdate } from '../${entityName}.api';\n  <#list subTables as sub>\n  <#if sub.foreignRelationType =='1'>\n  import ${sub.entityName}Form from './${sub.entityName}Form.vue'\n\t<#else>\n  <#assign hasOne2manyTable = true>\n  <#assign subTableColumnsKey += ['${sub.entityName?uncap_first}Columns']>\n  </#if>\n\t<#if sub?? && (sub.foreignMainKeys)??>\n    <#list sub.foreignMainKeys as key>\n      <#assign subMainFieldMap += {\"${sub.entityName}\": \"${dashedToCamel(key)}\"}>\n    </#list>\n  </#if>\n  </#list>\n  <#if hasOne2manyTable == true>\n  import { JVxeTable } from '/@/components/jeecg/JVxeTable';\n  import {<#list subTableColumnsKey as columnsKey><#if columnsKey_index gt 0>, </#if>${columnsKey}</#list>} from '../${entityName}.data';\n  </#if>\n  <#include \"/common/form/native/vue3NativeImport.ftl\">\n  <#if hasOnlyValidate == true>\n  import { duplicateValidate } from '/@/utils/helper/validator'\n  </#if>\n  import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';\n  import { Form } from 'ant-design-vue';\n  import { getDateByPicker } from '/@/utils';\n  import dayjs from 'dayjs';\n  const useForm = Form.useForm;\n\n  export default defineComponent({\n    name: \"${entityName}Form\",\n    components:{\n\t\t\t<#include \"/common/form/native/vue3NativeComponents.ftl\">\n\t\t\t<#if hasOne2manyTable == true>\n      JVxeTable,\n\t\t\t</#if>\n\t\t\tJFormContainer,\n<#list subTables as sub>\n\t<#if sub.foreignRelationType =='1'>\n      ${sub.entityName}Form,\n\t</#if>\n</#list>\n    },\n    props:{\n      formDisabled:{\n        type: Boolean,\n        default: false\n      },\n      formData: { type: Object, default: ()=>{} },\n      formBpm: { type: Boolean, default: true }\n    },\n    emits:['success'],\n    setup(props, {emit}) {\n      const loading = ref(false);\n      const formRef = ref();\n      <#list subTables as sub>\n      <#if sub_index == 0>\n      <#assign subTabActiveKey = '${sub.entityName?uncap_first}'>\n      </#if>\n      <#if sub.foreignRelationType =='1'>\n      const ${sub.entityName?uncap_first}FormRef = ref();\n      <#else>\n      const ${sub.entityName?uncap_first}TableRef = ref();\n      const ${sub.entityName?uncap_first}Table = reactive<Record<string, any>>({\n        loading: false,\n        columns: ${sub.entityName?uncap_first}Columns,\n        dataSource: []\n      });\n      </#if>\n      </#list>\n      const activeKey = ref('${subTabActiveKey}');\n      const formData = reactive<Record<string, any>>({\n        id: '',\n        <#include \"/common/init/native/vue3NativeMainInitValue.ftl\">\n      });\n\n      //表单验证\n      const validatorRules = reactive({\n      <#list columns as po>\n      <#if po.isShow == 'Y' && poHasCheck(po)>\n        ${po.fieldName}: [<#include \"/common/validatorRulesTemplate/native/vue3CoreNative.ftl\">],\n      </#if>\n      </#list>\n      });\n      const {resetFields, validate, validateInfos} = useForm(formData, validatorRules, {immediate: false});\n      //日期个性化选择\n      const fieldPickers = reactive({\n      <#list columns as po>\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        ${po.fieldName}: '${po.extendParams.picker}',\n        </#if>\n      </#list>\n      });\n      const dbData = {};\n      const formItemLayout = {\n        labelCol: {xs: {span: 24}, sm: {span: 5}},\n        wrapperCol: {xs: {span: 24}, sm: {span: 16}},\n      };\n\n      // 表单禁用\n      const disabled = computed(()=>{\n        if(props.formBpm === true){\n          if(props.formData.disabled === false){\n            return false;\n          }else{\n            return true;\n          }\n        }\n        return props.formDisabled;\n      });\n\n      <#if bpm_flag>\n      onMounted(()=>{\n        initFormData();\n      });\n      //渲染流程表单数据\n      const queryByIdUrl = '/${entityPackagePath}/${entityName?uncap_first}/queryById';\n      async function initFormData(){\n        if(props.formBpm === true){\n          let params = {id: props.formData.dataId};\n          const row = await defHttp.get({url: queryByIdUrl, params});\n          //设置表单的值\n          Object.keys(row).map(k => {\n            formData[k] = row[k];\n          });\n          //子表数据\n          <#list subTables as sub>\n          <#if sub.foreignRelationType =='1'>\n          await ${sub.entityName?uncap_first}FormRef.value.initFormData(row['${subMainFieldMap[sub.entityName]}']);\n          <#else>\n          const ${sub.entityName?uncap_first}DataList = await query${sub.entityName}ListByMainId(row['${subMainFieldMap[sub.entityName]}']);\n          ${sub.entityName?uncap_first}Table.dataSource = [...${sub.entityName?uncap_first}DataList];\n          </#if>\n          </#list>\n        }\n      }\n      // 是否显示提交按钮\n      const showFlowSubmitButton = computed(()=>{\n        if(props.formBpm === true){\n          if(props.formData.disabled === false){\n            return true\n          }\n        }\n        return false\n      });\n      </#if>\n      \n\n      function add() {\n        resetFields();\n        <#list subTables as sub>\n        <#if sub.foreignRelationType =='1'>\n        ${sub.entityName?uncap_first}FormRef.value.initFormData();\n        <#else>\n        ${sub.entityName?uncap_first}Table.dataSource = [];\n        </#if>\n        </#list>\n      }\n\n      async function edit(row) {\n        //主表数据\n        await queryMainData(row.id);\n        //子表数据\n        <#list subTables as sub>\n        <#if sub.foreignRelationType =='1'>\n        await ${sub.entityName?uncap_first}FormRef.value.initFormData(row['${subMainFieldMap[sub.entityName]}']);\n        <#else>\n        const ${sub.entityName?uncap_first}DataList = await query${sub.entityName}ListByMainId(row['${subMainFieldMap[sub.entityName]}']);\n        ${sub.entityName?uncap_first}Table.dataSource = [...${sub.entityName?uncap_first}DataList];\n        </#if>\n        </#list>\n      }\n\n      async function queryMainData(id) {\n        const row = await queryDataById(id);\n        resetFields();\n        const tmpData = {};\n        Object.keys(formData).forEach((key) => {\n          if(row.hasOwnProperty(key)){\n            tmpData[key] = row[key]\n          }\n        })\n        //赋值\n        Object.assign(formData,tmpData);\n      }\n\n      const {getSubFormAndTableData, transformData} = useValidateAntFormAndTable(activeKey, {\n        <#list subTables as sub>\n        <#if sub.foreignRelationType =='1'>\n        '${sub.entityName?uncap_first}': ${sub.entityName?uncap_first}FormRef,\n        <#else>\n        '${sub.entityName?uncap_first}': ${sub.entityName?uncap_first}TableRef,\n        </#if>\n        </#list>\n      });\n\n      async function getFormData() {\n        try {\n          // 触发表单验证\n          await validate();\n        } catch ({ errorFields }) {\n          if (errorFields) {\n            const firstField = errorFields[0];\n            if (firstField) {\n              formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });\n            }\n          }\n          return Promise.reject(errorFields);\n        }\n        return transformData(toRaw(formData))\n      }\n\n      async function submitForm() {\n        const mainData = await getFormData();\n        const subData = await getSubFormAndTableData();\n        // 预处理日期数据\n        changeDateValue(mainData, subData);\n        const values = Object.assign({}, dbData, mainData, subData);\n        console.log('表单提交数据', values)\n        const isUpdate = values.id ? true : false\n        await saveOrUpdate(values, isUpdate);\n        //关闭弹窗\n        emit('success');\n      }\n      \n      function setFieldsValue(values) {\n        if(values){\n          Object.keys(values).map(k=>{\n            formData[k] = values[k];\n          });\n        }\n      }\n\n      /**\n       * 处理日期值\n       * @param formData 表单数据\n       */\n      const changeDateValue = (mainData, subData) => {\n        for (let key in mainData) {\n          // 更新个性化日期选择器的值\n          mainData[key] = getDateByPicker(mainData[key], fieldPickers[key]);\n        }\n        <#list subTables as sub>\n          <#if sub.foreignRelationType =='0'>\n        if(subData.${sub.entityName?uncap_first}List && subData.${sub.entityName?uncap_first}List.length > 0){\n          ${sub.entityName?uncap_first}Columns.forEach(subFormField => {\n            if(subFormField && subFormField.picker && subFormField.key){\n              let subPicker = subFormField.picker;\n              const subFieldName = subFormField.key\n              subData.${sub.entityName?uncap_first}List.forEach(subFormData=>{\n                if (subPicker === 'year') {\n                  subFormData[subFieldName] = dayjs(subFormData[subFieldName]).set('month', 0).set('date', 1).format('YYYY-MM-DD');\n                } else if (subPicker === 'month') {\n                  subFormData[subFieldName] = dayjs(subFormData[subFieldName]).set('date', 1).format('YYYY-MM-DD');\n                } else if (subPicker === 'week') {\n                  subFormData[subFieldName] = dayjs(subFormData[subFieldName]).startOf('week').format('YYYY-MM-DD');\n                }\n              })\n            }\n          })\n        }\n          </#if>\n        </#list>\n      };\n\n      /**\n       * 值改变事件触发-树控件回调\n       * @param key\n       * @param value\n       */\n      function handleFormChange(key, value) {\n        formData[key] = value;\n      }\n\n      <#list columns as po>\n      <#if po.isShow == 'Y' && po.fieldValidType?default(\"\") == 'only'>\n      async function ${po.fieldName}Duplicatevalidate(_r, value) {\n        return duplicateValidate('${tableName}', '${po.fieldDbName}', value, formData.id || '')\n      }\n      </#if>\n      </#list>\n\n      return {\n        <#list subTables as sub>\n        <#if sub.foreignRelationType =='1'>\n        ${sub.entityName?uncap_first}FormRef,\n        <#else>\n        ${sub.entityName?uncap_first}TableRef,\n        ${sub.entityName?uncap_first}Table,\n        </#if>\n        </#list>\n        validatorRules,\n        validateInfos,\n        activeKey,\n        loading,\n        formData,\n        setFieldsValue,\n        handleFormChange,\n        formItemLayout,\n        disabled,\n        <#if bpm_flag>\n        showFlowSubmitButton,\n        </#if>\n        getFormData,\n        submitForm,\n        add,\n        edit,\n        formRef,\n      }\n    }\n  });\n</script>\n<style lang=\"less\" scoped>\n  .ant-tabs-tabpane.sub-one-form {\n    max-height: 340px;\n    overflow: auto;\n  }\n  .jeecg-native-form,\n  .jeecg-native-tab {\n    padding: 0 20px;\n  }\n</style>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/${entityName}Modal.vuei",
    "content": "﻿<#include \"/common/utils.ftl\">\n<template>\n<#assign buttonList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n  <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n</#if>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"title\" maxHeight=\"500px\" :width=\"${getModalWidth(tableVo.fieldRowNum?default(1))}\" @ok=\"handleSubmit\">\n    <${Format.humpToShortbar(entityName)}-form ref=\"formComponent\" :formDisabled=\"formDisabled\" :formBpm=\"false\" @success=\"submitSuccess\"></${Format.humpToShortbar(entityName)}-form>\n<#if buttonList?? && buttonList?size gt 0>\n   <template #insertFooter>\n    <#list buttonList as btn>\n     <#if btn.buttonStyle=='form'>\n       <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n     </#if>\n    </#list>\n   </template>\n</#if>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\">\n  import { ref, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import ${entityName}Form from './${entityName}Form.vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  const { createMessage } = useMessage();\n  export default {\n    name: \"TestCgMainVxeModal\",\n    components:{\n      BasicModal,\n      ${entityName}Form\n    },\n    emits:['register','success'],\n    setup(_p, {emit}){\n      const formComponent = ref()\n      const isUpdate = ref(true);\n      const formDisabled = ref(false);\n      const title = ref('')\n\n      //表单赋值\n      const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {\n        setModalProps({confirmLoading: false,showCancelBtn:data?.showFooter,showOkBtn:data?.showFooter});\n        isUpdate.value = !!data?.isUpdate;\n        formDisabled.value = !data?.showFooter;\n        title.value = data?.isUpdate ? (unref(formDisabled) ? '详情' : '编辑') : '新增';\n        if (unref(isUpdate)) {\n          formComponent.value.edit(data.record)\n        }else{\n          formComponent.value.add()\n        }\n      });\n\n      function handleSubmit() {\n        formComponent.value.submitForm();\n      }\n\n      function submitSuccess(){\n        emit('success');\n        closeModal();\n      }\n<#if buttonList?size gt 0>\n  <#list buttonList as btn>\n      <#if btn.buttonStyle=='form'>\n         function handle${btn.buttonCode?cap_first}(){\n            createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n         }\n      </#if>\n  </#list>\n</#if>\n      return {\n        registerModal,\n        title,\n        formComponent,\n        formDisabled,\n        handleSubmit,\n        submitSuccess,\n<#if buttonList?size gt 0>\n  <#list buttonList as btn>\n      <#if btn.buttonStyle=='form'>\n        handle${btn.buttonCode?cap_first},\n      </#if>\n  </#list>\n</#if>\n      }\n    }\n  }\n</script>\n<style lang=\"less\" scoped>\n\t/** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-calendar-picker) {\n    width: 100%;\n  }\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/jvxe/onetomany/java/${bussiPackage}/${entityPackage}/vue3Native/components/[1-n]Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<#list subTables as sub>\n<#if sub.foreignRelationType=='1'>\n#segment#${sub.entityName}Form.vue\n<#include \"/common/utils.ftl\">\n<#assign need_category = false>\n<#assign bpm_flag=false>\n<#assign need_pca = false>\n<#assign need_search = false>\n<#assign need_dept_user = false>\n<#assign need_switch = false>\n<#assign need_dept = false>\n<#assign need_multi = false>\n<#assign need_popup = false>\n<#assign need_popup_dict = false>\n<#assign need_select_tag = false>\n<#assign need_select_tree = false>\n<#assign need_time = false>\n<#assign need_markdown = false>\n<#assign need_upload = false>\n<#assign need_image_upload = false>\n<#assign need_editor = false>\n<#assign need_checkbox = false>\n<#assign need_range_number = false>\n<#assign is_like = false>\n<#assign form_span = 24>\n<#if tableVo.fieldRowNum==2>\n  <#assign form_span = 12>\n<#elseif tableVo.fieldRowNum==3>\n  <#assign form_span = 8>\n<#elseif tableVo.fieldRowNum==4>\n  <#assign form_span = 6>\n</#if>\n  <#assign hasOnlyValidate = false>\n<template>\n  <a-spin :spinning=\"loading\">\n    <JFormContainer :disabled=\"disabled\">\n      <template #detail>\n        <a-form v-bind=\"formItemLayout\" name=\"${sub.entityName}Form\" ref=\"formRef\" class=\"antd-modal-form\">\n          <a-row>\n            <#list sub.colums as po>\n              <#if po.isShow == 'Y' && po.fieldValidType?default(\"\") == 'only'>\n                <#assign hasOnlyValidate = true>\n              </#if>\n              <#if po.fieldDbName=='bpm_status'>\n                <#assign bpm_flag=true>\n              </#if>\n              <#assign formEntityName>${sub.entityName}Form</#assign>\n              <#include \"/common/form/native/vue3NativeForm.ftl\">\n            </#list>\n          </a-row>\n        </a-form>\n      </template>\n    </JFormContainer>\n  </a-spin>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, ref, reactive, toRaw } from 'vue';\n  import { query${sub.entityName}ListByMainId } from '../${entityName}.api';\n<#include \"/common/form/native/vue3NativeImport.ftl\">\n<#if hasOnlyValidate == true>\n  import { duplicateValidate } from '/@/utils/helper/validator'\n</#if>\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';  \n  import { Form } from 'ant-design-vue';\n  const useForm = Form.useForm;\n\n  export default defineComponent({\n    name: '${sub.entityName}Form',\n    components:{\n    <#include \"/common/form/native/vue3NativeComponents.ftl\">\n    JFormContainer,\n    },\n    props:{\n      disabled:{\n        type: Boolean,\n        default: false\n      }\n    },\n    setup(){\n      const { createMessage } = useMessage();\n      const isForm = true;\n      const loading = ref(false);\n      const formRef = ref();\n      const formData = reactive<Record<string, any>>({\n        id: '',\n        <#include \"/common/init/native/vue3NativeSubInitValue.ftl\">\n      });\n      //表单验证\n      const validatorRules = reactive({\n    <#list sub.colums as po>\n    <#if po.isShow == 'Y' && poHasCheck(po)>\n        ${po.fieldName}: [<#include \"/common/validatorRulesTemplate/native/vue3CoreNative.ftl\">],\n    </#if>\n    </#list>\n      })\n      const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, {immediate: false});\n      const formItemLayout = {\n        labelCol: { xs: { span: 24 }, sm: { span: 5 } },\n        wrapperCol: { xs: { span: 24 }, sm: { span: 16 } },\n      };\n\n      async function initFormData(mainId) {\n        resetFields();\n        let tmpData = {}\n        if(mainId){\n          let list = await query${sub.entityName}ListByMainId(mainId);\n          if(list && list.length>0){\n            let temp = list[0];\n            Object.keys(formData).forEach((key) => {\n              if(temp.hasOwnProperty(key)){\n                tmpData[key] = temp[key]\n              }\n            })\n          }\n        }\n        //赋值\n        Object.assign(formData,tmpData);\n      }\n\n      async function getFormData() {\n        try {\n          // 触发表单验证\n          await validate();\n        } catch ({ errorFields }) {\n          if (errorFields) {\n            const firstField = errorFields[0];\n            if (firstField) {\n              formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });\n            }\n          }\n          return Promise.reject(errorFields);\n        }\n        let subFormData = toRaw(formData);\n        if(Object.keys(subFormData).length>0){\n          return subFormData\n        }\n        return false;\n      }\n\n      function setFieldsValue(values) {\n        if(values){\n          Object.keys(values).map(k=>{\n            formData[k] = values[k];\n          });\n        }\n      }\n\n      /**\n       * 值改变事件触发-树控件回调\n       * @param key\n       * @param value\n       */\n      function handleFormChange(key, value) {\n        formData[key] = value;\n      }\n\n    <#list sub.colums as po>\n    <#if po.isShow == 'Y' && po.fieldValidType?default(\"\") == 'only'>\n      async function ${po.fieldName}Duplicatevalidate(_r, value) {\n        return duplicateValidate('${sub.tableName}', '${po.fieldDbName}', value, formData.id || '')\n      }\n    </#if>\n    </#list>\n\n      return {\n        loading,\n        formData,\n        formItemLayout,\n        initFormData,\n        getFormData,\n        setFieldsValue,\n        handleFormChange,\n        isForm,\n        validateInfos,\n        formRef,\n      }\n    }\n  });\n</script>\n<style lang=\"less\" scoped></style>\n</#if>\n</#list>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai",
    "content": "package ${bussiPackage}.${entityPackage}.controller;\n\nimport java.io.UnsupportedEncodingException;\nimport java.io.IOException;\nimport java.net.URLDecoder;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\nimport java.util.HashMap;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\n\nimport org.jeecgframework.poi.excel.ExcelImportUtil;\nimport org.jeecgframework.poi.excel.def.NormalExcelConstants;\nimport org.jeecgframework.poi.excel.entity.ExportParams;\nimport org.jeecgframework.poi.excel.entity.ImportParams;\nimport org.jeecgframework.poi.excel.view.JeecgEntityExcelView;\nimport org.jeecg.common.system.vo.LoginUser;\nimport org.apache.shiro.SecurityUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.system.query.QueryGenerator;\nimport org.jeecg.common.system.query.QueryRuleEnum;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.jeecgframework.poi.excel.entity.enmus.ExcelType;\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport ${bussiPackage}.${entityPackage}.vo.${entityName}Page;\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.service.I${sub.entityName}Service;\n</#list>\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport org.springframework.web.servlet.ModelAndView;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.multipart.MultipartHttpServletRequest;\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.extern.slf4j.Slf4j;\nimport com.alibaba.fastjson.JSON;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.apache.shiro.authz.annotation.RequiresPermissions;\n<#assign has_multi_query_field=false>\n<#list originalColumns as po>\n<#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')>\n   <#assign has_multi_query_field=true>\n</#if>\n</#list>\n<#assign enhanceJavaList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.enhanceJavaList??>\n  <#assign enhanceJavaList = tableVo.extendParams.enhanceJavaList?filter(enhance -> enhance??)>\n</#if>\n /**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Tag(name=\"${tableVo.ftlDescription}\")\n@RestController\n@RequestMapping(\"/${entityPackagePath}/${entityName?uncap_first}\")\n@Slf4j\npublic class ${entityName}Controller {\n\t@Autowired\n\tprivate I${entityName}Service ${entityName?uncap_first}Service;\n\t<#list subTables as sub>\n\t@Autowired\n\tprivate I${sub.entityName}Service ${sub.entityName?uncap_first}Service;\n\t</#list>\n\t\n\t/**\n\t * 分页列表查询\n\t *\n\t * @param ${entityName?uncap_first}\n\t * @param pageNo\n\t * @param pageSize\n\t * @param req\n\t * @return\n\t */\n\t//@AutoLog(value = \"${tableVo.ftlDescription}-分页列表查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-分页列表查询\")\n\t@GetMapping(value = \"/list\")\n\tpublic Result<IPage<${entityName}>> queryPageList(${entityName} ${entityName?uncap_first},\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageNo\", defaultValue=\"1\") Integer pageNo,\n\t\t\t\t\t\t\t\t   @RequestParam(name=\"pageSize\", defaultValue=\"10\") Integer pageSize,\n\t\t\t\t\t\t\t\t   HttpServletRequest req) {\n    <#if enhanceJavaList?size gt 0>\n     <#list enhanceJavaList as enhanceJava>\n     <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'>\n           //TODO 查询前触发的方法，代码生成后，请手工实现增强类逻辑;\n           //${entityName?uncap_first}Service.beforeQuery()\n     </#if>\n     </#list>\n    </#if>\n    <#if has_multi_query_field>\n        // 自定义查询规则\n        Map<String, QueryRuleEnum> customeRuleMap = new HashMap<>();\n        // 自定义多选的查询规则为：LIKE_WITH_OR\n    <#list originalColumns as po>\n        <#if po.isQuery=='Y' && (po.classType=='list' || po.classType=='list_multi' || po.classType=='radio' || po.classType=='checkbox')>\n        customeRuleMap.put(\"${po.fieldName}\", QueryRuleEnum.LIKE_WITH_OR);\n        </#if>\n    </#list>\n        QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap(),customeRuleMap);\n    <#else>\n        QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap());\n    </#if>\n\t\tPage<${entityName}> page = new Page<${entityName}>(pageNo, pageSize);\n\t\tIPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper);\n    <#if enhanceJavaList?size gt 0>\n     <#list enhanceJavaList as enhanceJava>\n     <#if enhanceJava.buttonCode=='query' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'>\n          //TODO 查询后触发的方法，代码生成后，请手工实现增强类逻辑;\n           //${entityName?uncap_first}Service.afterQuery()\n     </#if>\n     </#list>\n    </#if>\n\t\treturn Result.OK(pageList);\n\t}\n\t\n\t/**\n\t *   添加\n\t *\n\t * @param ${entityName?uncap_first}Page\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-添加\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-添加\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:add\")\n\t@PostMapping(value = \"/add\")\n\tpublic Result<String> add(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) {\n    <#if enhanceJavaList?size gt 0>\n      <#list enhanceJavaList as enhanceJava>\n      <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='start'  && enhanceJava.activeStatus=='1'>\n          //TODO 新增前的处理方法，代码生成后，请手工实现增强类逻辑;\n          //${entityName?uncap_first}Service.beforeAdd()\n      </#if>\n      </#list>\n    </#if>\n\t\t${entityName} ${entityName?uncap_first} = new ${entityName}();\n\t\tBeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first});\n\t\t${entityName?uncap_first}Service.saveMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>);\n\t<#if enhanceJavaList?size gt 0>\n      <#list enhanceJavaList as enhanceJava>\n      <#if enhanceJava.buttonCode=='add' && enhanceJava.event=='end'  && enhanceJava.activeStatus=='1'>\n           //TODO 新增后的处理方法，代码生成后，请手工实现增强类逻辑;\n           //${entityName?uncap_first}Service.afterAdd()\n       </#if>\n      </#list>\n    </#if>\n\t\treturn Result.OK(\"添加成功！\");\n\t}\n\t\n\t/**\n\t *  编辑\n\t *\n\t * @param ${entityName?uncap_first}Page\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-编辑\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-编辑\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:edit\")\n\t@RequestMapping(value = \"/edit\", method = {RequestMethod.PUT,RequestMethod.POST})\n\tpublic Result<String> edit(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) {\n    <#if enhanceJavaList?size gt 0>\n      <#list enhanceJavaList as enhanceJava>\n      <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='start'  && enhanceJava.activeStatus=='1'>\n           //TODO 编辑前，代码生成后，请手工实现增强类逻辑;\n           //${entityName?uncap_first}Service.beforeEdit()\n      </#if>\n      </#list>\n    </#if>\n\t\t${entityName} ${entityName?uncap_first} = new ${entityName}();\n\t\tBeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first});\n\t\t${entityName} ${entityName?uncap_first}Entity = ${entityName?uncap_first}Service.getById(${entityName?uncap_first}.getId());\n\t\tif(${entityName?uncap_first}Entity==null) {\n\t\t\treturn Result.error(\"未找到对应数据\");\n\t\t}\n\t\t${entityName?uncap_first}Service.updateMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>);\n\t<#if enhanceJavaList?size gt 0>\n      <#list enhanceJavaList as enhanceJava>\n      <#if enhanceJava.buttonCode=='edit' && enhanceJava.event=='end' && enhanceJava.activeStatus=='1'>\n          //TODO 编辑后，代码生成后，请手工实现增强类逻辑;\n          //${entityName?uncap_first}Service.afterEdit()\n      </#if>\n      </#list>\n    </#if>\n\t\treturn Result.OK(\"编辑成功!\");\n\t}\n\t\n\t/**\n\t *   通过id删除\n\t *\n\t * @param id\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-通过id删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id删除\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:delete\")\n\t@DeleteMapping(value = \"/delete\")\n\tpublic Result<String> delete(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${entityName?uncap_first}Service.delMain(id);\n\t\treturn Result.OK(\"删除成功!\");\n\t}\n\t\n\t/**\n\t *  批量删除\n\t *\n\t * @param ids\n\t * @return\n\t */\n\t@AutoLog(value = \"${tableVo.ftlDescription}-批量删除\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-批量删除\")\n    @RequiresPermissions(\"${entityPackage}:${tableName}:deleteBatch\")\n\t@DeleteMapping(value = \"/deleteBatch\")\n\tpublic Result<String> deleteBatch(@RequestParam(name=\"ids\",required=true) String ids) {\n\t\tthis.${entityName?uncap_first}Service.delBatchMain(Arrays.asList(ids.split(\",\")));\n\t\treturn Result.OK(\"批量删除成功！\");\n\t}\n\t\n\t/**\n\t * 通过id查询\n\t *\n\t * @param id\n\t * @return\n\t */\n\t//@AutoLog(value = \"${tableVo.ftlDescription}-通过id查询\")\n\t@Operation(summary=\"${tableVo.ftlDescription}-通过id查询\")\n\t@GetMapping(value = \"/queryById\")\n\tpublic Result<${entityName}> queryById(@RequestParam(name=\"id\",required=true) String id) {\n\t\t${entityName} ${entityName?uncap_first} = ${entityName?uncap_first}Service.getById(id);\n\t\tif(${entityName?uncap_first}==null) {\n\t\t\treturn Result.error(\"未找到对应数据\");\n\t\t}\n\t\treturn Result.OK(${entityName?uncap_first});\n\n\t}\n\t\n\t<#list subTables as sub>\n\t/**\n\t * 通过id查询\n\t *\n\t * @param id\n\t * @return\n\t */\n\t//@AutoLog(value = \"${sub.ftlDescription}通过主表ID查询\")\n\t@Operation(summary=\"${sub.ftlDescription}主表ID查询\")\n\t@GetMapping(value = \"/query${sub.entityName}ByMainId\")\n\tpublic Result<List<${sub.entityName}>> query${sub.entityName}ListByMainId(@RequestParam(name=\"id\",required=true) String id) {\n\t\tList<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(id);\n\t\treturn Result.OK(${sub.entityName?uncap_first}List);\n\t}\n\t</#list>\n\n    /**\n    * 导出excel\n    *\n    * @param request\n    * @param ${entityName?uncap_first}\n    */\n    @RequiresPermissions(\"${entityPackage}:${tableName}:exportXls\")\n    @RequestMapping(value = \"/exportXls\")\n    public ModelAndView exportXls(HttpServletRequest request, ${entityName} ${entityName?uncap_first}) {\n  <#if enhanceJavaList?size gt 0>\n   <#list enhanceJavaList as enhanceJava>\n   <#if enhanceJava.buttonCode=='export' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'>\n        //TODO 导出前，代码生成后，请手工实现增强类逻辑;\n        //${entityName?uncap_first}Service.beforeExport()\n   </#if>\n   </#list>\n  </#if>\n\n      // Step.1 组装查询条件查询数据\n      QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap());\n      LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();\n\n      //配置选中数据查询条件\n       String selections = request.getParameter(\"selections\");\n       if(oConvertUtils.isNotEmpty(selections)) {\n            List<String> selectionList = Arrays.asList(selections.split(\",\"));\n            queryWrapper.in(\"id\",selectionList);\n       }\n       //Step.2 获取导出数据\n       List<${entityName}> ${entityName?uncap_first}List = ${entityName?uncap_first}Service.list(queryWrapper);\n\n      // Step.3 组装pageList\n      List<${entityName}Page> pageList = new ArrayList<${entityName}Page>();\n      for (${entityName} main : ${entityName?uncap_first}List) {\n          ${entityName}Page vo = new ${entityName}Page();\n          BeanUtils.copyProperties(main, vo);\n          <#list subTables as sub>\n          List<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(main.getId());\n          vo.set${sub.entityName}List(${sub.entityName?uncap_first}List);\n          </#list>\n          pageList.add(vo);\n      }\n\n      // Step.4 AutoPoi 导出Excel\n      ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());\n      mv.addObject(NormalExcelConstants.FILE_NAME, \"${tableVo.ftlDescription}列表\");\n      mv.addObject(NormalExcelConstants.CLASS, ${entityName}Page.class);\n      mv.addObject(NormalExcelConstants.PARAMS, new ExportParams(\"${tableVo.ftlDescription}数据\", \"导出人:\"+sysUser.getRealname(), \"${tableVo.ftlDescription}\", ExcelType.XSSF));\n      mv.addObject(NormalExcelConstants.DATA_LIST, pageList);\n      return mv;\n    }\n\n    /**\n    * 通过excel导入数据\n    *\n    * @param request\n    * @param response\n    * @return\n    */\n    @RequiresPermissions(\"${entityPackage}:${tableName}:importExcel\")\n    @RequestMapping(value = \"/importExcel\", method = RequestMethod.POST)\n    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {\n      <#if enhanceJavaList?size gt 0>\n      <#list enhanceJavaList as enhanceJava>\n      <#if enhanceJava.buttonCode=='import' && enhanceJava.event=='start' && enhanceJava.activeStatus=='1'>\n           //TODO 导入前，代码生成后，请手工实现增强类逻辑;\n           //${entityName?uncap_first}Service.beforeImport()\n      </#if>\n      </#list>\n      </#if>\n      MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;\n      Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();\n      for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {\n          // 获取上传文件对象\n          MultipartFile file = entity.getValue();\n          ImportParams params = new ImportParams();\n          params.setTitleRows(2);\n          params.setHeadRows(1);\n          params.setNeedSave(true);\n          try {\n              List<${entityName}Page> list = ExcelImportUtil.importExcel(file.getInputStream(), ${entityName}Page.class, params);\n              for (${entityName}Page page : list) {\n                  ${entityName} po = new ${entityName}();\n                  BeanUtils.copyProperties(page, po);\n                  ${entityName?uncap_first}Service.saveMain(po, <#list subTables as sub>page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>);\n              }\n              return Result.OK(\"文件导入成功！数据行数:\" + list.size());\n          } catch (Exception e) {\n              log.error(e.getMessage(),e);\n              return Result.error(\"文件导入失败:\"+e.getMessage());\n          } finally {\n              try {\n                  file.getInputStream().close();\n              } catch (IOException e) {\n                  e.printStackTrace();\n              }\n          }\n      }\n      return Result.OK(\"文件导入失败！\");\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai",
    "content": "<#include \"/common/utils.ftl\">\npackage ${bussiPackage}.${entityPackage}.entity;\n\nimport java.io.Serializable;\nimport java.io.UnsupportedEncodingException;\nimport java.util.Date;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport org.jeecg.common.constant.ProvinceCityArea;\nimport org.jeecg.common.util.SpringContextUtils;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.jeecg.common.aspect.annotation.Dict;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Schema(description=\"${tableVo.ftlDescription}\")\n@Data\n@TableName(\"${tableName}\")\npublic class ${entityName} implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']>\n <#assign excel_ignore_classType_arr=['pca','switch','cat_tree']>\n    <#list originalColumns as po>\n    <#-- 生成字典Code -->\n    <#assign list_field_dictCode=\"\">\n    <#if po.classType='sel_user'>\n      <#assign list_field_dictCode=', dictTable = \"sys_user\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"realname\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"username\\\")?trim)}\"'>\n    <#elseif po.classType='sel_depart'>\n      <#assign list_field_dictCode=', dictTable = \"sys_depart\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"depart_name\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"id\\\")?trim)}\"'>\n    <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>\n      <#if po.dictTable?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText}\", dicCode = \"${po.dictField}\"'>\n      <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dicCode = \"${po.dictField}\"'>\n    </#if>\n    <#elseif po.classType=='sel_tree'>\n       <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText?split(\",\")[2]}\", dicCode = \"${po.dictText?split(\",\")[0]}\"'>\n    <#elseif po.classType=='link_table'>\n       <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicCode = \"${po.dictField}\", dicText = \"${po.dictText?split(\",\")[0]}\"'>\n    </#if>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t@TableId(type = IdType.ASSIGN_ID)\n\t<#else>\n\t\t<#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'>\n\t\t\t<#if po.classType=='date'>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t\t\t<#else>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t\t\t</#if>\n\t\t<#else>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\") && !excel_ignore_classType_arr?seq_contains(\"${po.classType}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n\t</#if>\n\t\t</#if>\n      <#if list_field_dictCode?length gt 1>\n    @Dict(${list_field_dictCode?substring(2)})\n      </#if>\n\t</#if>\n    <#include \"/common/blob.ftl\">\n\t</#list>\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai",
    "content": "<#include \"/common/utils.ftl\">\n<#list subTables as subTab>\n#segment#${subTab.entityName}.java\npackage ${bussiPackage}.${entityPackage}.entity;\n\nimport java.io.Serializable;\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport org.jeecg.common.constant.ProvinceCityArea;\nimport org.jeecg.common.util.SpringContextUtils;\nimport lombok.Data;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport java.util.Date;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport java.io.UnsupportedEncodingException;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Schema(description=\"${subTab.ftlDescription}\")\n@Data\n@TableName(\"${subTab.tableName}\")\npublic class ${subTab.entityName} implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']>\n <#assign excel_ignore_classType_arr=['pca','switch','cat_tree']>\n    <#list subTab.originalColumns as po>\n\t<#-- 生成字典Code -->\n\t<#assign list_field_dictCode=\"\">\n\t<#if po.classType='sel_user'>\n\t\t<#assign list_field_dictCode=', dictTable = \"sys_user\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"realname\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"username\\\")?trim)}\"'>\n\t<#elseif po.classType='sel_depart'>\n\t\t<#assign list_field_dictCode=', dictTable = \"sys_depart\", dicText = \"${camelToDashed(po.extendParams.text?default(\\\"depart_name\\\")?trim)}\", dicCode = \"${camelToDashed(po.extendParams.store?default(\\\"id\\\")?trim)}\"'>\n\t<#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>\n\t\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n\t\t\t<#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText}\", dicCode = \"${po.dictField}\"'>\n\t\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t\t<#assign list_field_dictCode=', dicCode = \"${po.dictField}\"'>\n\t\t<#elseif po.classType=='sel_tree'>\n\t\t\t<#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText?split(\",\")[2]}\", dicCode = \"${po.dictText?split(\",\")[0]}\"'>\n\t\t</#if>\n    <#elseif po.classType=='link_table'>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicCode = \"${po.dictField}\", dicText = \"${po.dictText?split(\",\")[0]}\"'>\n\t</#if>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t@TableId(type = IdType.ASSIGN_ID)\n\t<#else>\n\t\t<#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'>\n\t\t\t<#if po.classType=='date'>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n    </#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t\t\t<#else>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t\t\t</#if>\n\t\t<#elseif !subTab.foreignKeys?seq_contains(po.fieldName?cap_first)>\n    <#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\") && !excel_ignore_classType_arr?seq_contains(\"${po.classType}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n\t</#if>\n\t\t</#if>\n\t</#if>\n\t<#-- 大字段转换 -->\n    <#include \"/common/blob.ftl\">\n\t</#list>\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai",
    "content": "package ${bussiPackage}.${entityPackage}.mapper;\n\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Param;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface ${entityName}Mapper extends BaseMapper<${entityName}> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}Mapper.java\npackage ${bussiPackage}.${entityPackage}.mapper;\n\nimport java.util.List;\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Param;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface ${subTab.entityName}Mapper extends BaseMapper<${subTab.entityName}> {\n\n\t/**\n\t * 通过主表id删除子表数据\n\t *\n\t * @param mainId 主表id\n\t * @return boolean\n\t */\n\tpublic boolean deleteByMainId(@Param(\"mainId\") String mainId);\n\n  /**\n   * 通过主表id查询子表数据\n   *\n   * @param mainId 主表id\n   * @return List<${subTab.entityName}>\n   */\n\tpublic List<${subTab.entityName}> selectByMainId(@Param(\"mainId\") String mainId);\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper\">\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml",
    "content": "<#list subTables as subTab>\n<#assign originalForeignKeys = subTab.originalForeignKeys>\n#segment#${subTab.entityName}Mapper.xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper\">\n\n\t<delete id=\"deleteByMainId\" parameterType=\"java.lang.String\">\n\t\tDELETE \n\t\tFROM  ${subTab.tableName} \n\t\tWHERE\n\t\t<#list originalForeignKeys as key>\n\t\t\t ${key} = ${r'#'}{mainId} <#rt/>\n\t\t</#list>\n\t</delete>\n\t\n\t<select id=\"selectByMainId\" parameterType=\"java.lang.String\" resultType=\"${bussiPackage}.${entityPackage}.entity.${subTab.entityName}\">\n\t\tSELECT * \n\t\tFROM  ${subTab.tableName}\n\t\tWHERE\n\t\t<#list originalForeignKeys as key>\n\t\t\t ${key} = ${r'#'}{mainId} <#rt/>\n\t\t</#list>\n\t</select>\n</mapper>\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service;\n\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport java.io.Serializable;\nimport java.util.Collection;\nimport java.util.List;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface I${entityName}Service extends IService<${entityName}> {\n\n\t/**\n\t * 添加一对多\n\t *\n\t * @param ${entityName?uncap_first}\n\t <#list subTables as sub>\n\t * @param ${sub.entityName?uncap_first}List\n\t </#list>\n\t */\n\tpublic void saveMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) ;\n\t\n\t/**\n\t * 修改一对多\n\t *\n\t * @param ${entityName?uncap_first}\n\t <#list subTables as sub>\n\t * @param ${sub.entityName?uncap_first}List\n\t </#list>\n\t */\n\tpublic void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>);\n\t\n\t/**\n\t * 删除一对多\n\t *\n\t * @param id\n\t */\n\tpublic void delMain (String id);\n\t\n\t/**\n\t * 批量删除一对多\n\t *\n\t * @param idList\n\t */\n\tpublic void delBatchMain (Collection<? extends Serializable> idList);\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai",
    "content": "<#list subTables as subTab>\n#segment#I${subTab.entityName}Service.java\npackage ${bussiPackage}.${entityPackage}.service;\n\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport java.util.List;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\npublic interface I${subTab.entityName}Service extends IService<${subTab.entityName}> {\n\n\t/**\n\t * 通过主表id查询子表数据\n\t *\n\t * @param mainId 主表id\n\t * @return List<${subTab.entityName}>\n\t */\n\tpublic List<${subTab.entityName}> selectByMainId(String mainId);\n}\n</#list>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai",
    "content": "package ${bussiPackage}.${entityPackage}.service.impl;\n\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.mapper.${sub.entityName}Mapper;\n</#list>\nimport ${bussiPackage}.${entityPackage}.mapper.${entityName}Mapper;\nimport ${bussiPackage}.${entityPackage}.service.I${entityName}Service;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.transaction.annotation.Transactional;\nimport java.io.Serializable;\nimport java.util.List;\nimport java.util.Collection;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Service\npublic class ${entityName}ServiceImpl extends ServiceImpl<${entityName}Mapper, ${entityName}> implements I${entityName}Service {\n\n\t@Autowired\n\tprivate ${entityName}Mapper ${entityName?uncap_first}Mapper;\n\t<#list subTables as sub>\n\t@Autowired\n\tprivate ${sub.entityName}Mapper ${sub.entityName?uncap_first}Mapper;\n\t</#list>\n\t\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void saveMain(${entityName} ${entityName?uncap_first}, <#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) {\n\t\t${entityName?uncap_first}Mapper.insert(${entityName?uncap_first});\n\t\t<#list subTables as sub>\n\t\tif(${sub.entityName?uncap_first}List!=null && ${sub.entityName?uncap_first}List.size()>0) {\n\t\t\tfor(${sub.entityName} entity:${sub.entityName?uncap_first}List) {\n\t\t\t\t<#list sub.foreignKeys as key>\n\t\t\t\t//外键设置\n\t\t\t\t<#if key?lower_case?index_of(\"${primaryKeyField}\")!=-1>\n\t\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}());\n\t\t\t\t<#else>\n\t\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${key}());\n\t\t\t\t</#if>\n\t\t\t\t</#list>\n\t\t\t\t${sub.entityName?uncap_first}Mapper.insert(entity);\n\t\t\t}\n\t\t}\n\t\t</#list>\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) {\n\t\t${entityName?uncap_first}Mapper.updateById(${entityName?uncap_first});\n\t\t\n\t\t//1.先删除子表数据\n\t\t<#list subTables as sub>\n\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(${entityName?uncap_first}.getId());\n\t\t</#list>\n\t\t\n\t\t//2.子表数据重新插入\n\t\t<#list subTables as sub>\n\t\tif(${sub.entityName?uncap_first}List!=null && ${sub.entityName?uncap_first}List.size()>0) {\n\t\t\tfor(${sub.entityName} entity:${sub.entityName?uncap_first}List) {\n\t\t\t\t<#list sub.foreignKeys as key>\n\t\t\t\t//外键设置\n\t\t\t\t<#if key?lower_case?index_of(\"${primaryKeyField}\")!=-1>\n\t\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}());\n\t\t\t\t<#else>\n\t\t\t\tentity.set${key?cap_first}(${entityName?uncap_first}.get${key}());\n\t\t\t\t</#if>\n\t\t\t\t</#list>\n\t\t\t\t${sub.entityName?uncap_first}Mapper.insert(entity);\n\t\t\t}\n\t\t}\n\t\t</#list>\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void delMain(String id) {\n\t\t<#list subTables as sub>\n\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(id);\n\t\t</#list>\n\t\t${entityName?uncap_first}Mapper.deleteById(id);\n\t}\n\n\t@Override\n\t@Transactional(rollbackFor = Exception.class)\n\tpublic void delBatchMain(Collection<? extends Serializable> idList) {\n\t\tfor(Serializable id:idList) {\n\t\t\t<#list subTables as sub>\n\t\t\t${sub.entityName?uncap_first}Mapper.deleteByMainId(id.toString());\n\t\t\t</#list>\n\t\t\t${entityName?uncap_first}Mapper.deleteById(id);\n\t\t}\n\t}\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai",
    "content": "<#list subTables as subTab>\n#segment#${subTab.entityName}ServiceImpl.java\npackage ${bussiPackage}.${entityPackage}.service.impl;\n\nimport ${bussiPackage}.${entityPackage}.entity.${subTab.entityName};\nimport ${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper;\nimport ${bussiPackage}.${entityPackage}.service.I${subTab.entityName}Service;\nimport org.springframework.stereotype.Service;\nimport java.util.List;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.springframework.beans.factory.annotation.Autowired;\n\n/**\n * @Description: ${subTab.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Service\npublic class ${subTab.entityName}ServiceImpl extends ServiceImpl<${subTab.entityName}Mapper, ${subTab.entityName}> implements I${subTab.entityName}Service {\n\t\n\t@Autowired\n\tprivate ${subTab.entityName}Mapper ${subTab.entityName?uncap_first}Mapper;\n\t\n\t@Override\n\tpublic List<${subTab.entityName}> selectByMainId(String mainId) {\n\t\treturn ${subTab.entityName?uncap_first}Mapper.selectByMainId(mainId);\n\t}\n}\n</#list>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai",
    "content": "package ${bussiPackage}.${entityPackage}.vo;\n\nimport java.util.List;\nimport ${bussiPackage}.${entityPackage}.entity.${entityName};\n<#list subTables as sub>\nimport ${bussiPackage}.${entityPackage}.entity.${sub.entityName};\n</#list>\nimport lombok.Data;\nimport org.jeecgframework.poi.excel.annotation.Excel;\nimport org.jeecgframework.poi.excel.annotation.ExcelEntity;\nimport org.jeecgframework.poi.excel.annotation.ExcelCollection;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport org.springframework.format.annotation.DateTimeFormat;\nimport java.util.Date;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.jeecg.common.constant.ProvinceCityArea;\nimport org.jeecg.common.util.SpringContextUtils;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\n\n/**\n * @Description: ${tableVo.ftlDescription}\n * @Author: jeecg-boot\n * @Date:   ${.now?string[\"yyyy-MM-dd\"]}\n * @Version: V1.0\n */\n@Data\n@Schema(description=\"${tableVo.ftlDescription}\")\npublic class ${entityName}Page {\n\n\t<#assign excel_ignore_arr=['createBy','createTime','updateBy','updateTime','sysOrgCode']>\n\t<#assign excel_ignore_classType_arr=['pca','switch','cat_tree']>\n    <#list originalColumns as po>\n    <#-- 生成字典Code -->\n    <#assign list_field_dictCode=\"\">\n    <#if po.classType='sel_user'>\n      <#assign list_field_dictCode=', dictTable = \"sys_user\", dicText = \"realname\", dicCode = \"username\"'>\n    <#elseif po.classType='sel_depart'>\n      <#assign list_field_dictCode=', dictTable = \"sys_depart\", dicText = \"depart_name\", dicCode = \"id\"'>\n    <#elseif po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox'>\n      <#if po.dictTable?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dictTable = \"${po.dictTable}\", dicText = \"${po.dictText}\", dicCode = \"${po.dictField}\"'>\n      <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign list_field_dictCode=', dicCode = \"${po.dictField}\"'>\n      <#elseif po.classType=='cat_tree'>\n         <#assign list_field_dictCode=', dictTable = \"sys_category\", dicText = \"name\", dicCode = \"id\"'>\n      </#if>\n    </#if>\n\t/**${po.filedComment}*/\n\t<#if po.fieldName == primaryKeyField>\n\t<#else>\n\t\t<#if po.fieldDbType =='Date' || po.fieldDbType =='Datetime'>\n\t\t\t<#if po.classType=='date'>\n\t<#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15, format = \"yyyy-MM-dd\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd\")\n\t\t\t<#else>\n\t<#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 20, format = \"yyyy-MM-dd HH:mm:ss\")\n\t</#if>\n\t@JsonFormat(timezone = \"GMT+8\",pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n\t\t\t</#if>\n\t\t<#else>\n\t<#if !excel_ignore_arr?seq_contains(\"${po.fieldName}\")  && !excel_ignore_classType_arr?seq_contains(\"${po.classType}\")>\n\t@Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n\t</#if>\n\t\t</#if>\n        <#if list_field_dictCode?length gt 1  && !excel_ignore_classType_arr?seq_contains(\"${po.classType}\")>\n    @Dict(${list_field_dictCode?substring(2)})\n        </#if>\n\t</#if>\n\t@Schema(description = \"${po.filedComment}\")\n    <#if po.fieldDbType=='Blob'>\n    private java.lang.String ${po.fieldName}String;\n    <#elseif po.classType=='pca'>\n    @Excel(name = \"${po.filedComment}\", width = 15,exportConvert=true,importConvert = true )\n    private ${po.fieldType} ${po.fieldName};\n\n    public String convertis${po.fieldName?cap_first}() {\n        return SpringContextUtils.getBean(ProvinceCityArea.class).getText(${po.fieldName});\n    }\n\n    public void convertset${po.fieldName?cap_first}(String text) {\n        this.${po.fieldName} = SpringContextUtils.getBean(ProvinceCityArea.class).getCode(text);\n    }\n    <#elseif po.classType=='cat_tree'>\n    @Excel(name = \"${po.filedComment}\", width = 15${list_field_dictCode})\n    private ${po.fieldType} ${po.fieldName};\n    <#elseif po.classType=='switch'>\n    <#assign switch_extend_arr=['Y','N']>\n    <#if po.dictField?default(\"\")?contains(\"[\")>\n        <#assign switch_extend_arr=po.dictField?eval>\n    </#if>\n    <#list switch_extend_arr as a>\n        <#if a_index == 0>\n            <#assign switch_extend_arr1=a>\n        <#else>\n            <#assign switch_extend_arr2=a>\n        </#if>\n    </#list>\n    @Excel(name = \"${po.filedComment}\", width = 15,replace = {\"是_${switch_extend_arr1}\",\"否_${switch_extend_arr2}\"} )\n    private ${po.fieldType} ${po.fieldName};\n    <#else>\n    private ${po.fieldType} ${po.fieldName};\n    </#if>\n\t</#list>\n\n\t<#list subTables as sub>\n\t@ExcelCollection(name=\"${sub.ftlDescription}\")\n\t@Schema(description = \"${sub.ftlDescription}\")\n\tprivate List<${sub.entityName}> ${sub.entityName?uncap_first}List;\n\t</#list>\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei",
    "content": "<template>\n  <a-card :bordered=\"false\">\n    <!-- 查询区域 -->\n    <div class=\"table-page-search-wrapper\">\n      <a-form layout=\"inline\" @keyup.enter.native=\"searchQuery\">\n        <a-row :gutter=\"24\">\n<#assign query_field_no=0>\n<#assign query_flag=false>\n<#assign list_need_pca=false>\n<#assign list_need_dict=false>\n<#assign list_need_category=false>\n<#-- 开始循环 -->\n<#list columns as po>\n<#if po.isQuery=='Y'>\n<#assign query_flag=true>\n\t<#if query_field_no==2>\n          <template v-if=\"toggleSearchStatus\">\n\t</#if>\n\t<#assign query_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n\t    <#assign query_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n    <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign query_field_dictCode=\"${po.dictField}\">\n    </#if>\n\t<#if po.queryMode=='single'>\n          <#if query_field_no gt 1>  </#if><a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <#if query_field_no gt 1>  </#if><a-form-item label=\"${po.filedComment}\">\n            <#if po.classType=='sel_search'>\n              <#if query_field_no gt 1>  </#if><j-search-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dict=\"${po.dictTable},${po.dictText},${po.dictField}\"/>\n            <#elseif po.classType=='sel_user'>\n              <#if query_field_no gt 1>  </#if><j-select-user-by-dep placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"/>\n            <#elseif po.classType=='sel_depart'>\n              <#if query_field_no gt 1>  </#if><j-select-depart placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"/>\n            <#elseif po.classType=='list_multi'>\n              <#if query_field_no gt 1>  </#if><j-multi-select-tag placeholder=\"请选择${po.filedComment}\" dictCode=\"${query_field_dictCode?default(\"\")}\" v-model=\"queryParam.${po.fieldName}\"/>\n            <#elseif po.classType=='cat_tree'>\n              <#if query_field_no gt 1>  </#if><j-category-select placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\"/>\n\t\t\t<#elseif po.classType=='date'>\n              <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></j-date>\n\t\t\t<#elseif po.classType=='datetime'>\n              <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></j-date>\n            <#elseif po.classType=='pca'>\n              <#if query_field_no gt 1>  </#if><j-area-linkage type=\"cascader\" v-model=\"queryParam.${po.fieldName}\" placeholder=\"请选择省市区\"/>\n            <#elseif po.classType=='popup'>\n              <#if query_field_no gt 1>  </#if><j-popup placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" code=\"${po.dictTable}\" org-fields=\"${po.dictField}\" dest-fields=\"${po.dictText}\" :field=\"getPopupField('${po.dictText}')\" :multi=\"${po.extendParams.popupMulti?c}\"/>\n\t\t\t<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>\n\t\t\t<#--  ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->\n\t\t\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n              <#if query_field_no gt 1>  </#if><j-dict-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\"/>\n\t\t\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n              <#if query_field_no gt 1>  </#if><j-dict-select-tag placeholder=\"请选择${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\" dictCode=\"${po.dictField}\"/>\n\t\t\t<#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n\t\t\t</#if>\n\t\t\t<#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入${po.filedComment}\" v-model=\"queryParam.${po.fieldName}\"></a-input>\n\t\t\t</#if>\n            <#if query_field_no gt 1>  </#if></a-form-item>\n          <#if query_field_no gt 1>  </#if></a-col>\n\t<#else>\n          <#if query_field_no gt 1>  </#if><a-col :xl=\"10\" :lg=\"11\" :md=\"12\" :sm=\"24\">\n            <#if query_field_no gt 1>  </#if><a-form-item label=\"${po.filedComment}\">\n\t\t\t<#if po.classType=='date'>\n              <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择开始日期\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></j-date>\n              <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n              <#if query_field_no gt 1>  </#if><j-date placeholder=\"请选择结束日期\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></j-date>\n\t\t\t<#elseif po.classType=='datetime'>\n              <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择开始时间\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></j-date>\n              <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n              <#if query_field_no gt 1>  </#if><j-date :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" placeholder=\"请选择结束时间\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></j-date>\n\t\t\t<#else>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入最小值\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_begin\"></a-input>\n              <#if query_field_no gt 1>  </#if><span class=\"query-group-split-cust\"></span>\n              <#if query_field_no gt 1>  </#if><a-input placeholder=\"请输入最大值\" class=\"query-group-cust\" v-model=\"queryParam.${po.fieldName}_end\"></a-input>\n\t\t\t</#if>\n            <#if query_field_no gt 1>  </#if></a-form-item>\n          <#if query_field_no gt 1>  </#if></a-col>\n\t</#if>\n<#assign query_field_no=query_field_no+1>\n</#if>\n<#if !list_need_dict && po.fieldShowType!='popup' && po.dictField?default(\"\")?trim?length gt 1>\n<#assign list_need_dict=true>\n</#if>\n<#if po.classType=='cat_tree' && po.dictText?default(\"\")?trim?length == 0>\n<#assign list_need_category=true>\n</#if>\n<#if po.classType=='pca'>\n<#assign list_need_pca=true>\n</#if>\n</#list>\n<#-- 结束循环 -->\n<#t>\n<#if query_field_no gt 2>\n          </template>\n</#if>\n<#if query_flag>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left;overflow: hidden;\" class=\"table-page-search-submitButtons\">\n              <a-button type=\"primary\" @click=\"searchQuery\" icon=\"search\">查询</a-button>\n              <a-button type=\"primary\" @click=\"searchReset\" icon=\"reload\" style=\"margin-left: 8px\">重置</a-button>\n              <a @click=\"handleToggleSearch\" style=\"margin-left: 8px\">\n                {{ toggleSearchStatus ? '收起' : '展开' }}\n                <a-icon :type=\"toggleSearchStatus ? 'up' : 'down'\"/>\n              </a>\n            </span>\n          </a-col>\n</#if>\n        </a-row>\n      </a-form>\n    </div>\n    <!-- 查询区域-END -->\n    \n    <!-- 操作按钮区域 -->\n    <div class=\"table-operator\">\n      <a-button @click=\"handleAdd\" type=\"primary\" icon=\"plus\">新增</a-button>\n      <a-button type=\"primary\" icon=\"download\" @click=\"handleExportXls('${tableVo.ftlDescription}')\">导出</a-button>\n      <a-upload name=\"file\" :showUploadList=\"false\" :multiple=\"false\" :headers=\"tokenHeader\" :action=\"importExcelUrl\" @change=\"handleImportExcel\">\n        <a-button type=\"primary\" icon=\"import\">导入</a-button>\n      </a-upload>\n      <!-- 高级查询区域 -->\n      <j-super-query :fieldList=\"superFieldList\" ref=\"superQueryModal\" @handleSuperQuery=\"handleSuperQuery\"></j-super-query>\n      <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n        <a-menu slot=\"overlay\">\n          <a-menu-item key=\"1\" @click=\"batchDel\"><a-icon type=\"delete\"/>删除</a-menu-item>\n        </a-menu>\n        <a-button style=\"margin-left: 8px\"> 批量操作 <a-icon type=\"down\" /></a-button>\n      </a-dropdown>\n    </div>\n\n    <!-- table区域-begin -->\n    <div>\n      <div class=\"ant-alert ant-alert-info\" style=\"margin-bottom: 16px;\">\n        <i class=\"anticon anticon-info-circle ant-alert-icon\"></i> 已选择 <a style=\"font-weight: 600\">{{ selectedRowKeys.length }}</a>项\n        <a style=\"margin-left: 24px\" @click=\"onClearSelected\">清空</a>\n      </div>\n\n      <a-table\n        ref=\"table\"\n        size=\"middle\"\n        bordered\n        rowKey=\"id\"\n        class=\"j-table-force-nowrap\"\n        :scroll=\"{x:true}\"\n        :columns=\"columns\"\n        :dataSource=\"dataSource\"\n        :pagination=\"ipagination\"\n        :loading=\"loading\"\n        :rowSelection=\"{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}\"\n        @change=\"handleTableChange\">\n\n        <template slot=\"htmlSlot\" slot-scope=\"text\">\n          <div v-html=\"text\"></div>\n        </template>\n        <template slot=\"imgSlot\" slot-scope=\"text,record\">\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无图片</span>\n          <img v-else :src=\"getImgView(text)\" :preview=\"record.id\" height=\"25px\" alt=\"\" style=\"max-width:80px;font-size: 12px;font-style: italic;\"/>\n        </template>\n        <template slot=\"fileSlot\" slot-scope=\"text\">\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n          <a-button\n            v-else\n            :ghost=\"true\"\n            type=\"primary\"\n            icon=\"download\"\n            size=\"small\"\n            @click=\"uploadFile(text)\">\n            下载\n          </a-button>\n        </template>\n        <#if list_need_pca>\n        <template slot=\"pcaSlot\" slot-scope=\"text\">\n          <div>{{ getPcaText(text) }}</div>\n        </template>\n        </#if>\n\n        <span slot=\"action\" slot-scope=\"text, record\">\n          <a @click=\"handleEdit(record)\">编辑</a>\n\n          <a-divider type=\"vertical\" />\n          <a-dropdown>\n            <a class=\"ant-dropdown-link\">更多 <a-icon type=\"down\" /></a>\n            <a-menu slot=\"overlay\">\n              <a-menu-item>\n                <a-popconfirm title=\"确定删除吗?\" @confirm=\"() => handleDelete(record.id)\">\n                  <a>删除</a>\n                </a-popconfirm>\n              </a-menu-item>\n            </a-menu>\n          </a-dropdown>\n        </span>\n\n      </a-table>\n    </div>\n\n    <${entityName?uncap_first}-modal ref=\"modalForm\" @ok=\"modalFormOk\"></${entityName?uncap_first}-modal>\n  </a-card>\n</template>\n\n<script>\n\n  import { JeecgListMixin } from '@/mixins/JeecgListMixin'\n  import ${entityName}Modal from './modules/${entityName}Modal'\n  <#if list_need_category>\n  import { loadCategoryData } from '@/api/api'\n  </#if>\n  <#if list_need_dict>\n  import {filterMultiDictText} from '@/components/dict/JDictSelectUtil'\n  </#if>\n  <#if list_need_pca>\n  import Area from '@/components/_util/Area'\n  </#if>\n  import '@/assets/less/TableExpand.less'\n\n  export default {\n    name: \"${entityName}List\",\n    mixins:[JeecgListMixin],\n    components: {\n      ${entityName}Modal\n    },\n    data () {\n      return {\n        description: '${tableVo.ftlDescription}管理页面',\n        // 表头\n        columns: [\n          {\n            title: '#',\n            dataIndex: '',\n            key:'rowIndex',\n            width:60,\n            align:\"center\",\n            customRender:function (t,r,index) {\n              return parseInt(index)+1;\n            }\n          },\n    <#assign showColNum=0>\n\t<#list columns as po>\n\t<#if po.isShowList =='Y'>\n\t<#assign showColNum=showColNum+1>\n          {\n            title:'${po.filedComment}',\n            align:\"center\",\n            <#if po.sort=='Y'>\n            sorter: true,\n            </#if>\n            <#if po.classType=='date'>\n            dataIndex: '${po.fieldName}',\n            customRender:function (text) {\n              return !text?\"\":(text.length>10?text.substr(0,10):text)\n            }\n            <#elseif po.fieldDbType=='Blob'>\n            dataIndex: '${po.fieldName}String'\n            <#elseif po.classType=='umeditor'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'htmlSlot'}\n            <#elseif po.classType=='file'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'fileSlot'}\n            <#elseif po.classType=='pca'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'pcaSlot'}\n            <#elseif po.classType=='image'>\n            dataIndex: '${po.fieldName}',\n            scopedSlots: {customRender: 'imgSlot'}\n            <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user'>\n            dataIndex: '${po.fieldName}_dictText'\n            <#elseif po.classType=='cat_tree'>\n            <#if list_need_category>\n            dataIndex: '${po.fieldName}',\n            customRender: (text) => (text ? filterMultiDictText(this.dictOptions['${po.fieldName}'], text) : '')\n            <#else>\n            dataIndex: '${po.fieldName}',\n            customRender: (text, record) => (text ? record['${po.dictText}'] : '')\n            </#if>\n            <#elseif po.classType=='switch'>\n            dataIndex: '${po.fieldName}',\n            <#if  po.dictField != 'is_open'>\n            customRender: (text) => (!text ? \"\" : (text == ${po.dictField}[0] ? \"是\" : \"否\"))\n            <#else>\n            customRender: (text) => (!text ? \"\" : (text == \"Y\" ? \"是\" : \"否\"))\n            </#if>\n\t\t\t<#else>\n            dataIndex: '${po.fieldName}'\n\t\t\t</#if>\n          },\n     </#if>\n     </#list>\n          {\n            title: '操作',\n            dataIndex: 'action',\n            align:\"center\",\n            fixed:\"right\",\n            width:147,\n            scopedSlots: { customRender: 'action' },\n          }\n        ],\n        url: {\n          list: \"/${entityPackagePath}/${entityName?uncap_first}/list\",\n          delete: \"/${entityPackagePath}/${entityName?uncap_first}/delete\",\n          deleteBatch: \"/${entityPackagePath}/${entityName?uncap_first}/deleteBatch\",\n          exportXlsUrl: \"/${entityPackagePath}/${entityName?uncap_first}/exportXls\",\n          importExcelUrl: \"${entityPackagePath}/${entityName?uncap_first}/importExcel\",\n        },\n        dictOptions:{},\n        superFieldList:[],\n      }\n    },\n    created() {\n      <#if list_need_pca>\n      this.pcaData = new Area()\n      </#if>\n      this.getSuperFieldList();\n    },\n    computed: {\n      importExcelUrl: function(){\n        <#noparse>return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;</#noparse>\n      }\n    },\n    methods: {\n      <#if list_need_pca>\n      getPcaText(code){\n        return this.pcaData.getText(code);\n      },\n      </#if>\n      initDictConfig(){\n      <#list columns as po>\n      <#if (po.isQuery=='Y' || po.isShowList=='Y') && po.classType!='popup'>\n        <#if po.classType=='cat_tree' && list_need_category==true>\n        loadCategoryData({code:\"${po.dictField?default('')}\"}).then((res) => {\n          if (res.success) {\n            this.$set(this.dictOptions, '${po.fieldName}', res.result)\n          }\n        })\n        </#if>\n      </#if>  \n      </#list>\n      },\n      getSuperFieldList(){\n        <#include \"/common/utils.ftl\">\n        let fieldList=[];\n         <#list columns as po>\n        fieldList.push(${superQueryFieldList(po)})\n         </#list>\n        this.superFieldList = fieldList\n      }\n\n    }\n  }\n</script>\n<style scoped>\n  @import '~@assets/less/common.less';\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/V${currentDate}_1__menu_insert_${entityName}.sql",
    "content": "<#include \"/common/sql/menu_insert.ftl\">"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n<a-spin :spinning=\"confirmLoading\">\n<#assign form_popup = false>\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign form_span = 24>\n\n   <a-tabs v-model=\"activeKey\" @change=\"handleChangeTabs\">\n   <!--主表区域 -->\n    <a-tab-pane tab=\"${tableVo.ftlDescription}\" :key=\"refKeys[0]\" :forceRender=\"true\" :class=\"'jeecg-tabs-top'\" :animated=\"false\">\n         <a-form-model ref=\"form\" :model=\"model\" :rules=\"validatorRules\">\n           <a-row>\n        <#list columns as po>\n        <#if po.isShow =='Y' && po.fieldName != 'id'>\n        <#assign form_field_dictCode=\"\">\n            <#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n                <#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n            <#elseif po.dictField?default(\"\")?trim?length gt 1>\n                <#assign form_field_dictCode=\"${po.dictField}\">\n            </#if>\n                  <a-col :xs=\"24\" :sm=\"12\">\n                    <a-form-model-item label=\"${po.filedComment}\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" prop=\"${autoStringSuffixForModel(po)}\">\n            <#if po.classType =='date'>\n                      <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n            <#elseif po.classType =='datetime'>\n                      <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n            <#elseif po.classType =='time'>\n                      <j-time placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n            <#elseif po.classType =='popup'>\n                 <#assign form_popup=true>\n                      <j-popup\n                        v-model=\"model.${po.fieldName}\"\n                        field=\"${po.fieldName}\"\n                        org-fields=\"${po.dictField}\"\n                        dest-fields=\"${Format.underlineToHump(po.dictText)}\"\n                        code=\"${po.dictTable}\"\n                        :multi=\"${po.extendParams.popupMulti?c}\"\n                        @input=\"popupCallback\"\n                        <#if po.readonly=='Y'>disabled</#if>/>\n            <#elseif po.classType =='sel_depart'>\n                      <j-select-depart v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if> />\n           <#elseif po.classType =='switch'>\n                      <j-switch v-model=\"model.${po.fieldName}\" <#if po.dictField!= 'is_open'>:options=\"${po.dictField}\"</#if> <#if po.readonly=='Y'>disabled</#if>></j-switch>\n            <#elseif po.classType =='pca'>\n                      <j-area-linkage type=\"cascader\" v-model=\"model.${po.fieldName}\" placeholder=\"请输入省市区\" <#if po.readonly=='Y'>disabled</#if>/>\n            <#elseif po.classType =='markdown'>\n                      <j-markdown-editor v-model=\"model.${autoStringSuffixForModel(po)}\" id=\"${po.fieldName}\"></j-markdown-editor>\n            <#elseif po.classType =='password'>\n                      <a-input-password v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n            <#elseif po.classType =='sel_user'>\n                      <j-select-user-by-dep v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n            <#elseif po.classType =='textarea'>\n                      <a-textarea v-model=\"model.${autoStringSuffixForModel(po)}\" rows=\"4\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n            <#elseif po.classType=='list' || po.classType=='radio'>\n                      <j-dict-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\"  dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n            <#elseif po.classType=='list_multi' || po.classType=='checkbox'>\n                      <j-multi-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\"  dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>/>\n            <#elseif po.classType=='sel_search'>\n                      <j-search-select-tag v-model=\"model.${po.fieldName}\" dict=\"${form_field_dictCode}\" <#if po.readonly=='Y'>disabled</#if>/>\n            <#elseif po.classType=='cat_tree'>\n                <#assign form_cat_tree = true>\n                      <j-category-select v-model=\"model.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\" placeholder=\"请选择${po.filedComment}\" <#if po.dictText?default(\"\")?trim?length gt 1>back=\"${dashedToCamel(po.dictText)}\" @change=\"handleCategoryChange\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n                <#if po.dictText?default(\"\")?trim?length gt 1>\n                <#assign form_cat_back = \"${po.dictText}\">\n                </#if>\n            <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n                      <a-input-number v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n            <#elseif po.classType=='file'>\n                      <j-upload v-model=\"model.${po.fieldName}\"  <#if po.readonly=='Y'>disabled</#if> <#if po.uploadnum??>:number=${po.uploadnum}</#if>></j-upload>\n            <#elseif po.classType=='image'>\n                      <j-image-upload isMultiple <#if po.uploadnum??>:number=${po.uploadnum}</#if> v-model=\"model.${po.fieldName}\" <#if po.readonly=='Y'>disabled</#if>></j-image-upload>\n            <#elseif po.classType=='umeditor'>\n                      <j-editor v-model=\"model.${po.fieldName}\" <#if po.readonly=='Y'>disabled</#if>/>\n            <#elseif po.classType == 'sel_tree'>\n                      <j-tree-select\n                      ref=\"treeSelect\"\n                      placeholder=\"请选择${po.filedComment}\"\n                      v-model=\"model.${po.fieldName}\"\n                      <#if po.dictText??>\n                      <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n                      dict=\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\"\n                      <#elseif po.dictText?split(',')[1]??>\n                      pidField=\"${po.dictText?split(',')[1]}\"\n                      <#elseif po.dictText?split(',')[3]??>\n                      hasChildField=\"${po.dictText?split(',')[3]}\"\n                      </#if>\n                      </#if>\n                      pidValue=\"${po.dictField}\"\n                      <#if po.readonly=='Y'>disabled</#if>>\n                    </j-tree-select>\n            <#else>\n                      <a-input v-model=\"model.${autoStringSuffixForModel(po)}\" placeholder=\"请输入${po.filedComment}\" <#if po.readonly=='Y'>disabled</#if>></a-input>\n            </#if>\n                    </a-form-model-item>\n                  </a-col>\n        </#if>\n        </#list>\n\n                </a-row>\n              </a-form-model>\n\n     </a-tab-pane>\n   <!--子表单区域 -->\n<#list subTables as sub><#rt/>\n<#if sub.foreignRelationType =='1'>\n     <a-tab-pane tab=\"${sub.ftlDescription}\" :key=\"refKeys[${sub_index+1}]\" :forceRender=\"true\">\n       <${Format.humpToShortbar(sub.entityName)}-form ref=\"${sub.entityName?uncap_first}Form\" @validateError=\"validateError\"></${Format.humpToShortbar(sub.entityName)}-form>\n     </a-tab-pane>\n\n<#else>\n     <a-tab-pane tab=\"${sub.ftlDescription}\" :key=\"refKeys[${sub_index+1}]\" :forceRender=\"true\">\n       <j-editable-table\n         :ref=\"refKeys[${sub_index+1}]\"\n         :loading=\"${sub.entityName?uncap_first}Table.loading\"\n         :columns=\"${sub.entityName?uncap_first}Table.columns\"\n         :dataSource=\"${sub.entityName?uncap_first}Table.dataSource\"\n         :maxHeight=\"300\"\n         :rowNumber=\"true\"\n         :rowSelection=\"true\"\n         :actionButton=\"true\"/>\n     </a-tab-pane>\n\n</#if>\n</#list>\n   </a-tabs>\n\n </a-spin>\n</template>\n\n<script>\n\nimport { FormTypes,getRefPromise } from '@/utils/JEditableTableUtil'\nimport { JEditableTableModelMixin } from '@/mixins/JEditableTableModelMixin'\nimport { validateDuplicateValue } from '@/utils/util'\nimport { VALIDATE_NO_PASSED, validateFormModelAndTables } from '@/utils/JEditableTableUtil'\n<#list subTables as sub>\n<#if sub.foreignRelationType =='1'>\nimport ${sub.entityName}Form from './${sub.entityName}Form.vue'\n</#if>\n</#list>\n\nexport default {\n name: '${entityName}Forml',\n mixins: [JEditableTableModelMixin],\n components: {\n <#list subTables as sub>\n <#if sub.foreignRelationType =='1'>\n ${sub.entityName}Form,\n </#if>\n </#list>\n },\n data() {\n   return {\n     labelCol: {\n       xs: { span: 24 },\n       sm: { span: 5 },\n     },\n     wrapperCol: {\n       xs: { span: 24 },\n       sm: { span: 16 },\n     },\n     // 新增时子表默认添加几行空数据\n     addDefaultRowNum: 1,\n     model:{\n       <#include \"/common/init/initValue.ftl\">\n     },\n     <#include \"/common/validatorRulesTemplate/main.ftl\">\n     refKeys: ['${tableVo.entityName?uncap_first}',<#list subTables as sub>'${sub.entityName?uncap_first}', </#list>],\n     <#assign hasOne2Many = false>\n     tableKeys:[<#list subTables as sub><#if sub.foreignRelationType =='0'>'${sub.entityName?uncap_first}', <#assign hasOne2Many = true></#if></#list>],\n     activeKey: '${tableVo.entityName?uncap_first}',\n<#list subTables as sub><#rt/>\n     // ${sub.ftlDescription}\n     ${sub.entityName?uncap_first}Table: {\n       loading: false,\n       dataSource: [],\n       columns: [\n<#if sub.foreignRelationType =='0'>\n<#assign popupBackFields = \"\">\n\n<#-- 循环子表的列 开始 -->\n<#list sub.colums as col><#rt/>\n<#if col.isShow =='Y'>\n <#if col.filedComment !='外键' >\n         {\n           title: '${col.filedComment}',\n           key: '${autoStringSuffixForModel(col)}',\n   <#if col.classType =='date'>\n           type: FormTypes.date,\n           <#if col.readonly=='Y'>\n           disabled:true,\n           </#if>\n   <#elseif col.classType =='datetime'>\n           type: FormTypes.datetime,\n           <#if col.readonly=='Y'>\n           disabled:true,\n           </#if>\n   <#elseif \"int,decimal,double,\"?contains(col.classType)>\n           type: FormTypes.inputNumber,\n           <#if col.readonly=='Y'>\n           disabled:true,\n           </#if>\n   <#elseif col.classType =='list' || col.classType =='radio'>\n           type: FormTypes.select,\n           <#if col.dictTable?default(\"\")?trim?length gt 1>\n           dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n           <#else>\n           dictCode:\"${col.dictField}\",\n           </#if>\n           <#if col.readonly=='Y'>\n           disabled:true,\n           </#if>\n   <#elseif col.classType =='list_multi' || col.classType =='checkbox'>\n           type: FormTypes.list_multi,\n           <#if col.dictTable?default(\"\")?trim?length gt 1>\n           dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n           <#else>\n           dictCode:\"${col.dictField}\",\n           </#if>\n           <#if col.readonly=='Y'>\n           disabled:true,\n           </#if>\n   <#elseif col.classType =='sel_search'>\n           type: FormTypes.sel_search,\n           <#if col.dictTable?default(\"\")?trim?length gt 1>\n           dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n           <#else>\n           dictCode:\"${col.dictField}\",\n           </#if>\n           <#if col.readonly=='Y'>\n           disabled:true,\n           </#if>\n   <#elseif col.classType =='sel_depart'>\n           type: FormTypes.sel_depart,\n          <#if col.extendParams.multiSelect?default(true) == false>\n          multi: false,\n          </#if>\n          <#if col.extendParams.store?default(\"\")?trim?length gt 1>\n          store: \"${col.extendParams.store}\",\n          </#if>\n          <#if col.extendParams.text?default(\"\")?trim?length gt 1>\n          text: \"${col.extendParams.text}\",\n          </#if>\n          <#if col.readonly=='Y'>\n          disabled:true,\n          </#if>\n   <#elseif col.classType =='sel_user'>\n          type: FormTypes.sel_user,\n          <#if col.extendParams.multiSelect?default(true) == false>\n          multi: false,\n          </#if>\n          <#if col.extendParams.store?default(\"\")?trim?length gt 1>\n          store: \"${col.extendParams.store}\",\n          </#if>\n          <#if col.extendParams.text?default(\"\")?trim?length gt 1>\n          text: \"${col.extendParams.text}\",\n          </#if>\n          <#if col.readonly=='Y'>\n          disabled: true,\n          </#if>\n   <#elseif col.classType =='switch'>\n           type: FormTypes.checkbox,\n           <#if col.dictField == 'is_open'>\n           customValue: ['Y', 'N'],\n           <#else>\n           customValue: ${col.dictField},\n           </#if>\n           <#if col.readonly=='Y'>\n           disabled:true,\n           </#if>\n   <#elseif col.classType =='image'>\n           type: FormTypes.image,\n           token:true,\n           responseName:\"message\",\n           <#if col.readonly=='Y'>\n           disabled:true,\n           </#if>\n           <#if col.uploadnum??>\n           number: ${col.uploadnum},\n           </#if>\n   <#elseif col.classType =='file'>\n           type: FormTypes.file,\n           token:true,\n           responseName:\"message\",\n           <#if col.readonly=='Y'>\n           disabled:true,\n           </#if>\n           <#if col.uploadnum??>\n           number: ${col.uploadnum},\n           </#if>\n   <#elseif col.classType =='popup'>\n     <#if popupBackFields?length gt 0>\n         <#assign popupBackFields = \"${popupBackFields}\"+\",\"+\"${col.dictText}\">\n     <#else>\n         <#assign popupBackFields = \"${col.dictText}\">\n     </#if>\n           type: FormTypes.popup,\n           popupCode:\"${col.dictTable}\",\n           destFields:\"${Format.underlineToHump(col.dictText)}\",\n           orgFields:\"${col.dictField}\",\n           <#if col.readonly=='Y'>\n           disabled:true,\n           </#if>\n   <#elseif col.fieldDbType=='int' || col.fieldDbType=='long' || col.fieldDbType=='double' || col.fieldDbType=='BigDecimal'>\n           type: FormTypes.inputNumber,\n           <#if col.readonly=='Y'>\n           disabled:true,\n           </#if>\n   <#else>\n           type: FormTypes.input,\n           <#if col.readonly=='Y'>\n           disabled:true,\n           </#if>\n   </#if>\n   <#if col.classType =='list_multi' || col.classType =='checkbox'>\n           width:\"250px\",\n   <#else>\n           width:\"200px\",\n   </#if>\n   <#if col.classType =='file'>\n           placeholder: '请选择文件',\n   <#else>\n           placeholder: '请输入${'$'}{title}',\n   </#if>\n   <#if col.defaultVal??>\n     <#if col.fieldDbType==\"BigDecimal\" || col.fieldDbType==\"double\" || col.fieldDbType==\"int\">\n           defaultValue:${col.defaultVal},\n           <#else>\n           defaultValue:\"${col.defaultVal}\",\n     </#if>\n   <#else>\n           defaultValue:'',\n   </#if>\n   <#-- 子表的校验 -->\n   <#assign subFieldValidType = col.fieldValidType!''>\n   <#-- 非空校验 -->\n   <#if col.nullable == 'N' || subFieldValidType == '*'>\n           validateRules: [{ required: true, message: '${'$'}{title}不能为空' }],\n   <#-- 其他情况下，只要有值就被认为是正则校验 -->\n   <#elseif subFieldValidType?length gt 0>\n     <#assign subMessage = '格式不正确'>\n     <#if subFieldValidType == 'only' >\n       <#assign subMessage = '不能重复'>\n     </#if>\n           validateRules: [{ pattern: \"${subFieldValidType}\", message: \"${'$'}{title}${subMessage}\" }],\n   </#if>\n         },\n </#if>\n</#if>\n</#list>\n<#-- 循环子表的列 结束 -->\n\n<#-- 处理popup的隐藏列 -->\n<#if popupBackFields?length gt 0>\n<#list popupBackFields?split(\",\") as item>\n<#if item?length gt 0>\n<#assign tempItemFlag = true>\n\n<#list sub.colums as col>\n<#if col.isShow =='Y' && col.fieldName == item>\n<#assign tempItemFlag = false>\n</#if>\n</#list>\n<#if tempItemFlag>\n         {\n           title: '${item}',\n           key: '${item}',\n           type:\"hidden\"\n         },\n</#if>\n</#if>\n</#list>\n</#if>\n</#if>\n       ]\n     },\n</#list>\n     url: {\n       add: \"/${entityPackagePath}/${entityName?uncap_first}/add\",\n       edit: \"/${entityPackagePath}/${entityName?uncap_first}/edit\",\n        ${tableVo.entityName?uncap_first}: {\n         list: '/${entityPackagePath}/${entityName?uncap_first}/queryById'\n        },\n<#list subTables as sub><#rt/>\n       ${sub.entityName?uncap_first}: {\n         list: '/${entityPackagePath}/${entityName?uncap_first}/query${sub.entityName}ByMainId'\n       },\n</#list>\n     }\n   }\n },\n methods: {\n   getAllTable() {\n     <#if hasOne2Many==true>\n     let values = this.tableKeys.map(key => getRefPromise(this, key))\n     return Promise.all(values)\n     <#else>\n     return new Promise(resolve => {\n       resolve([]);\n     })\n     </#if>\n   },\n   /** 调用完edit()方法之后会自动调用此方法 */\n   editAfter() {\n     this.$nextTick(() => {\n<#list subTables as sub><#rt/>\n<#if sub.foreignRelationType =='1'>\n       this.$refs.${sub.entityName?uncap_first}Form.initFormData(this.url.${sub.entityName?uncap_first}.list,this.model.id)\n</#if>\n</#list>\n     })\n     // 加载子表数据\n     if (this.model.id) {\n       let params = { id: this.model.id }\n<#list subTables as sub><#rt/>\n<#if sub.foreignRelationType =='0'>\n       this.requestSubTableData(this.url.${sub.entityName?uncap_first}.list, params, this.${sub.entityName?uncap_first}Table)\n</#if>\n</#list>\n     }\n   },\n   //校验所有一对一子表表单\n   validateSubForm(allValues){\n     return new Promise((resolve,reject)=>{\n       Promise.all([\n   <#list subTables as sub><#rt/>\n     <#if sub.foreignRelationType =='1'>\n           this.$refs.${sub.entityName?uncap_first}Form.validate(${sub_index}),\n     </#if>\n   </#list>\n       ]).then(() => {\n         resolve(allValues)\n       }).catch(e => {\n         reject(e)\n       })\n     })\n   },\n   /** 整理成formData */\n   classifyIntoFormData(allValues) {\n     let main = Object.assign(this.model, allValues.formValue)\n     return {\n       ...main, // 展开\n<#assign subManyIndex = 0>\n<#list subTables as sub><#rt/>\n<#if sub.foreignRelationType =='0'>\n       ${sub.entityName?uncap_first}List: allValues.tablesValue[${subManyIndex}].values,\n       <#assign subManyIndex = subManyIndex+1>\n<#else>\n       ${sub.entityName?uncap_first}List: this.$refs.${sub.entityName?uncap_first}Form.getFormData(),\n</#if>\n</#list>\n     }\n   },\n    /** 确定按钮点击事件 */\n     handleOk() {\n       /** 触发表单验证 */\n       this.getAllTable().then(tables => {\n          return validateFormModelAndTables(this.$refs.form,this.model, tables)\n       }).then(allValues => {\n         /** 一次性验证一对一的所有子表 */\n         return this.validateSubForm(allValues)\n       }).then(allValues => {\n         if (typeof this.classifyIntoFormData !== 'function') {\n           throw this.throwNotFunction('classifyIntoFormData')\n         }\n         console.log(\"this.classifyIntoFormData\",typeof this.classifyIntoFormData)\n         let formData = this.classifyIntoFormData(allValues)\n\n         // 发起请求\n         return this.request(formData)\n       }).catch(e => {\n         if (e.error === VALIDATE_NO_PASSED) {\n           // 如果有未通过表单验证的子表，就自动跳转到它所在的tab\n           this.activeKey = e.index == null ? this.refKeys[0] : this.refKeys[e.index+1]\n         } else {\n           console.error(e)\n         }\n       })\n     },\n   validateError(msg){\n     this.$message.error(msg)\n   },\n close() {\n   this.visible = false\n   this.$emit('close')\n   this.$refs.form.clearValidate();\n },\n  <#if form_popup>\n  popupCallback(value,row){\n    this.model = Object.assign(this.model, row);\n  },\n  </#if>\n<#if form_cat_tree>\n  handleCategoryChange(value,backObj){\n    this.model = Object.assign(this.model, backObj);\n   }\n</#if>\n\n }\n}\n</script>\n\n<style scoped>\n    /** tab panel 中有下拉框/日期 这类带下拉效果的，需要加此样式 */\n    /deep/ .jeecg-tabs-top {\n        overflow: visible;\n    }\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n  <j-modal\n    :width=\"1200\"\n    :visible=\"visible\"\n    :maskClosable=\"false\"\n    switchFullscreen\n    @ok=\"handleOk\"\n    @cancel=\"handleCancel\">\n     <${Format.humpToShortbar(entityName)}-form ref=\"realForm\" @ok=\"submitCallback\" :disabled=\"disableSubmit\"/>\n </j-modal>\n</template>\n\n<script>\n\n  import ${entityName}Form from './${entityName}Form'\n\n  export default {\n    name: '${entityName}Modal',\n    components: {\n      ${entityName}Form\n    },\n    data() {\n      return {\n        title:'',\n        visible: false,\n        disableSubmit: false\n      }\n    },\n    methods:{\n      add () {\n        this.visible=true\n        this.$nextTick(()=>{\n          this.$refs.realForm.add();\n        })\n      },\n      edit (record) {\n        this.visible=true\n        this.$nextTick(()=>{\n          this.$refs.realForm.edit(record);\n        })\n      },\n      close () {\n        this.$emit('close');\n        this.visible = false;\n      },\n      handleOk () {\n        this.$refs.realForm.handleOk();\n      },\n      submitCallback(){\n        this.$emit('ok');\n        this.visible = false;\n      },\n      handleCancel () {\n        this.close()\n      }\n    }\n  }\n</script>\n\n<style scoped>\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<#list subTables as sub>\n<#if sub.foreignRelationType=='1'>\n#segment#${sub.entityName}Form.vue\n<template>\n  <j-form-container :disabled=\"disabled\">\n      <a-form-model ref=\"form\" :model=\"model\" :rules=\"validatorRules\" slot=\"detail\">\n        <a-row>\n<#assign form_popup = false>\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign form_span = 24>\n<#if tableVo.fieldRowNum == 2>\n  <#assign form_span = 12>\n<#elseif tableVo.fieldRowNum==3>\n  <#assign form_span = 8>\n<#elseif tableVo.fieldRowNum==4>\n  <#assign form_span = 6>\n</#if>\n<#list sub.colums as po>\n<#if po.isShow =='Y' && po.fieldName != 'id'>\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n          <a-col :span=\"${form_span}\">\n            <a-form-model-item label=\"${po.filedComment}\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" prop=\"${autoStringSuffixForModel(po)}\">\n\t<#if po.classType =='date'>\n              <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\"/>\n\t<#elseif po.classType =='datetime'>\n              <j-date placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" :show-time=\"true\" date-format=\"YYYY-MM-DD HH:mm:ss\" style=\"width: 100%\"/>\n\t<#elseif po.classType =='time'>\n              <j-time placeholder=\"请选择${po.filedComment}\" v-model=\"model.${po.fieldName}\" style=\"width: 100%\" <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='popup'>\n\t       <#assign form_popup=true>\n              <j-popup\n                v-model=\"model.${po.fieldName}\"\n                field=\"${po.fieldName}\"\n                org-fields=\"${po.dictField}\"\n                dest-fields=\"${Format.underlineToHump(po.dictText)}\"\n                code=\"${po.dictTable}\"\n                :multi=\"${po.extendParams.popupMulti?c}\"\n                @input=\"popupCallback\"/>\n    <#elseif po.classType =='sel_depart'>\n              <j-select-depart v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if> />\n<#elseif po.classType =='switch'>\n              <j-switch v-model=\"model.${po.fieldName}\" <#if po.dictField!= 'is_open'>:options=\"${po.dictField}\"</#if>></j-switch>\n\t<#elseif po.classType =='pca'>\n\t\t      <j-area-linkage type=\"cascader\" v-model=\"model.${po.fieldName}\" placeholder=\"请输入省市区\"/>\n\t<#elseif po.classType =='markdown'>\n\t          <j-markdown-editor v-model=\"model.${autoStringSuffixForModel(po)}\" id=\"${po.fieldName}\"></j-markdown-editor>\n    <#elseif po.classType =='password'>\n\t          <a-input-password v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\"/>\n\t<#elseif po.classType =='sel_user'>\n              <j-select-user-by-dep v-model=\"model.${po.fieldName}\" :multi=\"${po.extendParams.multi?default('true')}\"<#if po.extendParams.store?default(\"\")?trim?length gt 0> store=\"${po.extendParams.store}\"</#if><#if po.extendParams.text?default(\"\")?trim?length gt 0> text=\"${po.extendParams.text}\"</#if> <#if po.readonly=='Y'>disabled</#if>/>\n\t<#elseif po.classType =='textarea'>\n              <a-textarea v-model=\"model.${autoStringSuffixForModel(po)}\" rows=\"4\" placeholder=\"请输入${po.filedComment}\"/>\n\t<#elseif po.classType=='list' || po.classType=='radio'>\n              <j-dict-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\" dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\"/>\n\t<#elseif po.classType=='list_multi' || po.classType=='checkbox'>\n              <j-multi-select-tag type=\"${po.classType}\" v-model=\"model.${po.fieldName}\" dictCode=\"${form_field_dictCode}\" placeholder=\"请选择${po.filedComment}\"/>\n\t<#elseif po.classType=='sel_search'>\n              <j-search-select-tag v-model=\"model.${po.fieldName}\" dict=\"${form_field_dictCode}\" />\n    <#elseif po.classType=='cat_tree'>\n    \t<#assign form_cat_tree = true>\n              <j-category-select v-model=\"model.${po.fieldName}\" pcode=\"${po.dictField?default(\"\")}\" placeholder=\"请选择${po.filedComment}\" <#if po.dictText?default(\"\")?trim?length gt 1>back=\"${dashedToCamel(po.dictText)}\" @change=\"handleCategoryChange\"</#if>/>\n    \t<#if po.dictText?default(\"\")?trim?length gt 1>\n    \t<#assign form_cat_back = \"${po.dictText}\">\n    \t</#if>\n\t<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n              <a-input-number v-model=\"model.${po.fieldName}\" placeholder=\"请输入${po.filedComment}\" style=\"width: 100%\"/>\n\t<#elseif po.classType=='file'>\n              <j-upload v-model=\"model.${po.fieldName}\"></j-upload>\n\t<#elseif po.classType=='image'>\n              <j-image-upload isMultiple v-model=\"model.${po.fieldName}\"></j-image-upload>\n\t<#elseif po.classType=='umeditor'>\n              <j-editor v-model=\"model.${autoStringSuffixForModel(po)}\"/>\n\t<#else>\n              <a-input v-model=\"model.${autoStringSuffixForModel(po)}\" placeholder=\"请输入${po.filedComment}\"></a-input>\n    </#if>\n            </a-form-model-item>\n          </a-col>\n</#if>\n</#list>\n        </a-row>\n      </a-form-model>\n  </j-form-container>\n</template>\n<script>\n  import { getAction } from '@/api/manage'\n  import { validateDuplicateValue } from '@/utils/util'\n  import JFormContainer from '@/components/jeecg/JFormContainer'\n  import { VALIDATE_NO_PASSED } from '@/utils/JEditableTableUtil'\n\n  export default {\n    name: '${sub.entityName}Form',\n    components: {\n      JFormContainer\n    },\n    props:{\n      disabled: {\n        type: Boolean,\n        default: false,\n        required: false\n      }\n    },\n    data () {\n      return {\n        model: {\n        <#include \"/common/init/initValueSub.ftl\">\n        },\n        labelCol: {\n          xs: { span: 24 },\n          sm: { span: 5 },\n        },\n        wrapperCol: {\n          xs: { span: 24 },\n          sm: { span: 16 },\n        },\n        <#include \"/common/validatorRulesTemplate/sub.ftl\">\n        confirmLoading: false,\n      }\n    },\n    created () {\n     //备份model原始值\n      this.modelDefault = JSON.parse(JSON.stringify(this.model));\n    },\n    methods:{\n      initFormData(url,id){\n        this.clearFormData()\n        if(!id){\n         this.edit(this.modelDefault);\n        }else{\n          getAction(url,{id:id}).then(res=>{\n            if(res.success){\n              let records = res.result\n              if(records && records.length>0){\n                this.edit(records[0])\n              }\n            }\n          })\n        }\n      },\n      edit(record){\n        this.model = Object.assign({}, record)\n        console.log(\"${sub.entityName}Form-edit\",this.model);\n      },\n      getFormData(){\n        let formdata_arr = []\n        this.$refs.form.validate(valid => {\n          if (valid) {\n            let isNullObj = true\n            Object.keys(this.model).forEach(key=>{\n              if( this.model[key]){\n                isNullObj = false\n              }\n            })\n            if(!isNullObj){\n              formdata_arr.push(this.model)\n            }\n          }else{\n            this.$emit(\"validateError\",\"${sub.ftlDescription}表单校验未通过\");\n            return false\n          }\n        })\n        return formdata_arr;\n      },\n      validate(index){\n        return new Promise((resolve, reject) => {\n          // 验证主表表单\n         this.$refs.form.validate(valid => {\n            !valid ? reject({ error: VALIDATE_NO_PASSED ,index}) : resolve()\n          })\n        }).then(values => {\n          return Promise.resolve()\n        }).catch(error => {\n          return Promise.reject(error)\n        })\n      },\n      <#if form_popup>\n      popupCallback(value,row){\n      this.model = Object.assign(this.model, row);\n      },\n       </#if>\n      clearFormData(){\n        this.$refs.form.clearValidate()\n      },\n      <#if form_cat_tree>\n      handleCategoryChange(value,backObj){\n        this.model = Object.assign(this.model,backObj);\n      }\n      </#if>\n    }\n  }\n</script>\n</#if>\n</#list>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}List.vuei",
    "content": "﻿<template>\n  <div>\n<#assign list_need_category=false>\n<#assign list_need_pca=false>\n<#assign bpm_flag=false>\n<#assign list_has_popup_dict=false>\n<#assign buttonList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n  <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n</#if>\n<#-- 开始循环 -->\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.classType=='cat_tree' && po.dictText?default(\"\")?trim?length == 0>\n<#assign list_need_category=true>\n</#if>\n<#if po.classType=='pca'>\n<#assign list_need_pca=true>\n</#if>\n<#if po.classType=='popup_dict'>\n<#assign list_has_popup_dict=true>\n</#if>\n</#list>\n<#-- 结束循环 -->\n    <!--引用表格-->\n   <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n     <!--插槽:table标题-->\n      <template #tableTitle>\n          <a-button type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:add'\"  @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\"> 新增</a-button>\n          <a-button  type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:exportXls'\"  preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n          <j-upload-button  type=\"primary\" v-auth=\"'${entityPackage}:${tableName}:importExcel'\"  preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n     <#if buttonList?size gt 0>\n      <#list buttonList as btn>\n         <#if btn.buttonStyle == 'button'>\n           <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n         </#if>\n       </#list>\n     </#if>\n          <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n              <template #overlay>\n                <a-menu>\n                  <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                    <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                    删除\n                  </a-menu-item>\n                </a-menu>\n              </template>\n              <a-button v-auth=\"'${entityPackage}:${tableName}:deleteBatch'\">批量操作\n                <Icon icon=\"mdi:chevron-down\"></Icon>\n              </a-button>\n        </a-dropdown>\n        <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n        <!-- 高级查询 -->\n        <super-query :config=\"superQueryConfig\" @search=\"handleSuperQuery\" />\n        <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n      </template>\n       <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\"/>\n      </template>\n      <!--字段回显插槽-->\n      <template v-slot:bodyCell=\"{ column, record, index, text }\">\n      <#list columns as po>\n        <#if po.classType=='umeditor' || po.classType=='pca' || po.classType=='file'>\n        <template v-if=\"column.dataIndex==='${po.fieldName}'\">\n        <#if po.classType=='umeditor'>\n          <!--富文本件字段回显插槽-->\n          <div v-html=\"text\"></div>\n        </#if>\n        <#if po.classType=='pca'>\n          <!--省市区字段回显插槽-->\n          {{ getAreaTextByCode(text) }}\n        </#if>\n        <#if po.classType=='file'>\n          <!--文件字段回显插槽-->\n          <span v-if=\"!text\" style=\"font-size: 12px;font-style: italic;\">无文件</span>\n          <a-button v-else :ghost=\"true\" type=\"primary\" preIcon=\"ant-design:download-outlined\" size=\"small\" @click=\"downloadFile(text)\">下载</a-button>\n        </#if>\n        </template>\n        </#if>\n      </#list>\n      </template>\n    </BasicTable>\n    <!-- 表单区域 -->\n    <${entityName}Modal @register=\"registerModal\" @success=\"handleSuccess\"></${entityName}Modal>\n    <#if bpm_flag==true>\n      <!-- 审批记录 -->\n      <BpmPictureModal @register=\"registerBpmModal\" />\n     </#if>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"${entityPackage}-${entityName?uncap_first}\" setup>\n  import {ref, reactive, computed, unref} from 'vue';\n  import {BasicTable, useTable, TableAction} from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage'\n  import {useModal} from '/@/components/Modal';\n  import ${entityName}Modal from './components/${entityName}Modal.vue'\n  import {columns, searchFormSchema, superQuerySchema} from './${entityName}.data';\n  import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './${entityName}.api';\n  import {downloadFile} from '/@/utils/common/renderUtils';\n  import { useUserStore } from '/@/store/modules/user';\n  import { useMessage } from '/@/hooks/web/useMessage';\n<#if list_need_pca>\n  import { getAreaTextByCode } from '/@/components/Form/src/utils/Area';\n</#if>\n  <#if list_need_category>\n  import { loadCategoryData } from '/@/api/common/api'\n  import { getAuthCache, setAuthCache } from '/@/utils/auth';\n  import { DB_DICT_DATA_KEY } from '/@/enums/cacheEnum';\n  </#if>\n<#if list_has_popup_dict>\n  import {getPopDictByCode} from \"@/utils/dict\";\n  import {filterMultiDictText} from \"@/utils/dict/JDictSelectUtil\";\n</#if>\n  import { getDateByPicker } from '/@/utils';\n  //日期个性化选择\n  const fieldPickers = reactive({\n  <#list columns as po>\n    <#if po.extendParams?exists && po.extendParams.picker?exists>\n    ${po.fieldName}: '${po.extendParams.picker}',\n    </#if>\n  </#list>\n  });\n  <#if bpm_flag==true>\n  import { startProcess } from '/@/api/common/api';\n\n  const [registerBpmModal, { openModal: bpmPicModal }] = useModal();\n  </#if>\n  const queryParam = reactive<any>({});\n  const userStore = useUserStore();\n  const { createMessage } = useMessage();\n  const checkedKeys = ref<Array<string | number>>([]);\n  //注册model\n  const [registerModal, {openModal}] = useModal();\n   //注册table数据\n  const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({\n      tableProps:{\n           title: '${tableVo.ftlDescription}',\n           api: list,\n           columns,\n           canResize:true,\n           formConfig: {\n                //labelWidth: 120,\n                schemas: searchFormSchema,\n                autoSubmitOnEnter:true,\n                showAdvancedButton:true,\n                fieldMapToNumber: [\n                   <#list columns as po>\n                   <#if po.isQuery=='Y'>\n                   <#if po.queryMode=='group'>\n                   <#-- update-begin---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n                   <#if po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal' || po.classType=='time'>\n                   <#-- update-end---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n                   ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end']],\n                   </#if>\n                   </#if>\n                   </#if>\n                   </#list>\n                ],\n                fieldMapToTime: [\n                <#list columns as po>\n                <#if po.isQuery=='Y'>\n                <#if po.queryMode=='group'>\n                <#if po.classType=='date'>\n                   ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end'], 'YYYY-MM-DD'],\n                <#elseif po.classType=='datetime'>\n                   ['${po.fieldName}', ['${po.fieldName}_begin', '${po.fieldName}_end'], 'YYYY-MM-DD HH:mm:ss'],\n                </#if>\n                </#if>\n                </#if>\n                </#list>\n                ],\n            },\n           actionColumn: {\n               width: 120,\n               fixed:'right'\n           },\n           beforeFetch: (params) => {\n              if (params && fieldPickers) {\n                  for (let key in fieldPickers) {\n                      if (params[key]) {\n                          params[key] = getDateByPicker(params[key], fieldPickers[key]);\n                      }\n                  }\n              }\n             return Object.assign(params, queryParam);\n           },\n           <#if list_has_popup_dict>\n           afterFetch: afterFetch\n           </#if>\n        },\n        exportConfig: {\n            name:\"${tableVo.ftlDescription}\",\n            url: getExportUrl,\n            params: queryParam,\n        },\n        importConfig: {\n            url: getImportUrl,\n            success: handleSuccess\n        },\n    })\n\n  const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext\n\n<#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n  // 高级查询配置\n  const superQueryConfig = reactive(superQuerySchema);\n\n  /**\n   * 高级查询事件\n   */\n  function handleSuperQuery(params) {\n    Object.keys(params).map((k) => {\n      queryParam[k] = params[k];\n    });\n    reload();\n  }\n<#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n   /**\n    * 新增事件\n    */\n  function handleAdd() {\n     openModal(true, {\n       isUpdate: false,\n       showFooter: true,\n     });\n  }\n   /**\n    * 编辑事件\n    */\n  function handleEdit(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: true,\n     });\n   }\n   /**\n    * 详情\n   */\n  function handleDetail(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: false,\n     });\n   }\n   /**\n    * 删除事件\n    */\n  async function handleDelete(record) {\n     await deleteOne({id: record.id}, handleSuccess);\n   }\n   /**\n    * 批量删除事件\n    */\n  async function batchHandleDelete() {\n     await batchDelete({ids: selectedRowKeys.value}, handleSuccess);\n   }\n   /**\n    * 成功回调\n    */\n  function handleSuccess() {\n      (selectedRowKeys.value = []) && reload();\n   }\n   /**\n      * 操作栏\n      */\n  function getTableAction(record){\n       return [\n         {\n           label: '编辑',\n           onClick: handleEdit.bind(null, record),\n           auth: '${entityPackage}:${tableName}:edit'\n         }\n       ]\n   }\n\n  <#if bpm_flag==true>\n  /**\n   * 提交流程\n   */\n  async function handleProcess(record) {\n    let params = {\n      flowCode: 'dev_${tableName}_001',\n      id: record.id,\n      formUrl: '${entityPackagePath}/components/${entityName}Form',\n      formUrlMobile: ''\n    }\n    await startProcess(params);\n    handleSuccess();\n  }\n\n /**\n   * 审批进度\n   */\n  async function handlePreviewPic(record) {\n    bpmPicModal(true, {\n      flowCode: 'dev_${tableName}_001',\n      dataId: record.id,\n    });\n  }\n  </#if>\n\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record){\n    <#if bpm_flag==true>\n    let dropDownAction = [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      }, {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft'\n        },\n        auth: '${entityPackage}:${tableName}:delete'\n      },\n        {\n          label: '审批进度',\n          onClick: handlePreviewPic.bind(null, record),\n          ifShow: !!record.bpmStatus && record.bpmStatus !== '1',\n        }\n <#if buttonList?size gt 0>\n     <#list buttonList as btn>\n        <#if btn.buttonStyle == 'link'>\n        ,{\n           label: '${btn.buttonName}',\n           onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n         }\n        </#if>\n      </#list>\n  </#if>\n    ];\n    if(record.bpmStatus == '1' || !record.bpmStatus){\n      dropDownAction.push({\n        label: '发起流程',\n        popConfirm: {\n          title: '确认提交流程吗？',\n          confirm: handleProcess.bind(null, record),\n          placement: 'topLeft',\n        }\n      })\n    }\n    return dropDownAction;\n    <#else>\n    return [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      }, {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft'\n        },\n        auth: '${entityPackage}:${tableName}:delete'\n      }\n<#if buttonList?size gt 0>\n   <#list buttonList as btn>\n      <#if btn.buttonStyle == 'link'>\n      ,{\n         label: '${btn.buttonName}',\n         onClick: handle${btn.buttonCode?cap_first}.bind(null, record),\n       }\n      </#if>\n    </#list>\n</#if>\n    ]\n    </#if>\n  }\n\n    <#if list_need_category>\n   /**\n    * 初始化字典配置\n   */\n    function initDictConfig(){\n     <#list columns as po>\n     <#if (po.isQuery=='Y' || po.isShowList=='Y') && po.classType!='popup'>\n       <#if po.classType=='cat_tree' && list_need_category==true>\n       loadCategoryData({code:'${po.dictField?default(\"\")}'}).then((res) => {\n         if (res) {\n           const allDictDate = userStore.getAllDictItems;\n           if(!allDictDate['${po.dictField?default(\"\")}']){\n             userStore.setAllDictItems({...allDictDate,'${po.dictField?default(\"\")}':res});\n           }\n         }\n       })\n       </#if>\n     </#if>\n     </#list>\n   }\n   initDictConfig();\n    </#if>\n\n    <#if list_has_popup_dict>\n   /**\n    * 翻译Popup字典配置\n   */\n    async function afterFetch(records){\n <#list columns as po>\n    <#if po.isQuery=='Y' || po.isShowList=='Y'>\n      <#if po.classType=='popup_dict' && list_has_popup_dict==true>\n      const ${po.fieldName}Keys = [...new Set(records.map((item) => item['${po.fieldName}']).flatMap((item) => item && item.split(',')))];\n      if(${po.fieldName}Keys && ${po.fieldName}Keys.length){\n       const dictOptions = await getPopDictByCode(${po.fieldName}Keys.join(','), '${po.dictTable},${po.dictField},${po.dictText}');\n       records.forEach((item) => {\n         item['${po.fieldName}_dictText'] = filterMultiDictText(dictOptions, item['${po.fieldName}']);\n       });\n      }\n      </#if>\n    </#if>\n </#list>\n     return records;\n   }\n    </#if>\n\n<#if buttonList?size gt 0>\n  <#list buttonList as btn>\n  <#if btn.buttonStyle=='button'>\n     function handle${btn.buttonCode?cap_first}(){\n        createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n     }\n  </#if>\n   <#if btn.buttonStyle=='link'>\n    function handle${btn.buttonCode?cap_first}(record){\n      createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n    }\n   </#if>\n  </#list>\n</#if>\n</script>\n\n<style lang=\"less\" scoped>\n<#include \"/common/form/vue3SearchStyle.ftl\">\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__api.tsi",
    "content": "import {defHttp} from '/@/utils/http/axios';\nimport { useMessage } from \"/@/hooks/web/useMessage\";\n\nconst { createConfirm } = useMessage();\n\nenum Api {\n  list = '/${entityPackagePath}/${entityName?uncap_first}/list',\n  save='/${entityPackagePath}/${entityName?uncap_first}/add',\n  edit='/${entityPackagePath}/${entityName?uncap_first}/edit',\n  deleteOne = '/${entityPackagePath}/${entityName?uncap_first}/delete',\n  deleteBatch = '/${entityPackagePath}/${entityName?uncap_first}/deleteBatch',\n  importExcel = '/${entityPackagePath}/${entityName?uncap_first}/importExcel',\n  exportXls = '/${entityPackagePath}/${entityName?uncap_first}/exportXls',\n<#list subTables as sub><#rt/>\n  ${sub.entityName?uncap_first}List = '/${entityPackagePath}/${entityName?uncap_first}/query${sub.entityName}ByMainId',\n</#list>\n}\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n<#list subTables as sub><#rt/>\n/**\n * 查询子表数据\n * @param params\n */\nexport const ${sub.entityName?uncap_first}List = Api.${sub.entityName?uncap_first}List;\n</#list>\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) =>\n  defHttp.get({url: Api.list, params});\n\n/**\n * 删除单个\n */\nexport const deleteOne = (params,handleSuccess) => {\n  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n/**\n * 批量删除\n * @param params\n */\nexport const batchDelete = (params, handleSuccess) => {\n  createConfirm({\n    iconType: 'warning',\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n/**\n * 保存或者更新\n * @param params\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({url: url, params});\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/${entityName}__data.tsi",
    "content": "<#include \"/common/utils.ftl\">\nimport {BasicColumn} from '/@/components/Table';\nimport {FormSchema} from '/@/components/Table';\nimport { rules} from '/@/utils/helper/validator';\nimport { render } from '/@/utils/common/renderUtils';\nimport {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types'\nimport { getWeekMonthQuarterYear } from '/@/utils';\n//列表数据\nexport const columns: BasicColumn[] = [\n <#list columns as po>\n   <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n   <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n   {\n    title: '${po.filedComment}',\n    align:\"center\",\n    <#if po.sort=='Y'>\n    sorter: true,\n   </#if>\n    <#if po.classType=='date'>\n    dataIndex: '${po.fieldName}',\n    customRender:({text}) =>{\n      text = !text ? \"\" : (text.length > 10 ? text.substr(0,10) : text);\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      if(text) {\n        return getWeekMonthQuarterYear(text)['${po.extendParams.picker}'];\n      } else {\n        return text;\n      }\n      <#else>\n      return text;\n      </#if>\n    },\n    <#elseif po.fieldDbType=='Blob'>\n    dataIndex: '${po.fieldName}String'\n    <#elseif po.classType=='umeditor'>\n    dataIndex: '${po.fieldName}',\n    <#elseif po.classType=='pca'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='file'>\n    dataIndex: '${po.fieldName}',\n   <#elseif po.classType=='image'>\n    dataIndex: '${po.fieldName}',\n    customRender:render.renderImage,\n   <#elseif po.classType=='switch'>\n    dataIndex: '${po.fieldName}',\n<#assign switch_extend_arr=['Y','N']>\n<#if po.dictField?default(\"\")?contains(\"[\")>\n<#assign switch_extend_arr=po.dictField?eval>\n</#if>\n<#list switch_extend_arr as a>\n<#if a_index == 0>\n<#assign switch_extend_arr1=a>\n<#else>\n<#assign switch_extend_arr2=a>\n</#if>\n</#list>\n    customRender:({text}) => {\n       return  render.renderSwitch(text, [{text:'是',value:'${switch_extend_arr1}'},{text:'否',value:'${switch_extend_arr2}'}])\n     },\n   <#elseif po.classType == 'sel_tree' || po.classType=='list' || po.classType=='list_multi' || po.classType=='sel_search' || po.classType=='radio' || po.classType=='checkbox' || po.classType=='sel_depart' || po.classType=='sel_user' || po.classType=='popup_dict' || po.classType=='link_table'>\n    dataIndex: '${po.fieldName}_dictText'\n   <#elseif po.classType=='cat_tree'>\n    dataIndex: '${po.fieldName}',\n    <#if po.dictText?default(\"\")?trim?length == 0>\n    customRender:({text}) => {\n       return  render.renderCategoryTree(text,'${po.dictField?default(\"\")}')\n   },\n   <#else>\n    customRender: ({text, record}) => (text ? record['${po.dictText}'] : '')\n   </#if>\n   <#else>\n    dataIndex: '${po.fieldName}'\n   </#if>\n   },\n   </#if>\n </#list>\n];\n//查询数据\nexport const searchFormSchema: FormSchema[] = [\n<#-- 开始循环 -->\n<#list columns as po>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if po.isQuery=='Y' && po.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#assign query_flag=true>\n\t<#assign query_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1>\n\t    <#assign query_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n    <#elseif po.dictField?default(\"\")?trim?length gt 1>\n        <#assign query_field_dictCode=\"${po.dictField}\">\n    </#if>\n<#if po.queryMode=='single'>\n\t{\n      label: \"${po.filedComment}\",\n      field: \"${po.fieldName}\",\n<#if po.classType=='sel_search'>\n      component: 'JSearchSelect',\n      componentProps:{\n         dict:\"${query_field_dictCode}\"\n      },\n<#elseif po.classType=='sel_user'>\n<#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n      component: 'JSelectUser',\n<#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n     componentProps:{\n   <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   </#if>\n   <#if po.extendParams?exists && po.extendParams.store?exists>\n       rowKey: '${po.extendParams.store}',\n   </#if>\n     },\n<#elseif po.classType=='switch'>\n      component: 'JSwitch',\n      componentProps:{\n           query:true,\n           <#if po.dictField != 'is_open'>\n           options:${po.dictField}\n           </#if>\n       },\n <#elseif po.classType=='sel_depart'>\n      component: 'JSelectDept',\n      componentProps:{\n   <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   </#if>\n   <#if po.extendParams?exists && po.extendParams.store?exists>\n       rowKey: '${po.extendParams.store}',\n   </#if>\n      },\n <#elseif po.classType=='list_multi'>\n      component: 'JSelectMultiple',\n      componentProps:{\n      <#if po.dictTable?default(\"\")?trim?length gt 1>\n         dictCode:\"${po.dictTable},${po.dictText},${po.dictField}\",\n      <#elseif po.dictField?default(\"\")?trim?length gt 1>\n         dictCode:\"${po.dictField}\",\n      </#if>\n         triggerChange: true\n      },\n <#elseif po.classType=='cat_tree'>\n      component: 'JCategorySelect',\n      componentProps:{\n          pcode:\"${po.dictField?default(\"\")}\",//back和事件未添加，暂时有问题\n      },\n<#elseif po.classType=='date'>\n      component: 'DatePicker',\n      componentProps: {\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        picker: '${po.extendParams.picker}',\n        </#if>\n        valueFormat: 'YYYY-MM-DD'\n      },\n<#elseif po.classType=='datetime'>\n      component: 'DatePicker',\n      componentProps: {\n         showTime:true,\n         valueFormat: 'YYYY-MM-DD HH:mm:ss'\n       },\n<#elseif po.classType=='pca'>\n      component: 'JAreaLinkage',\n      componentProps: {\n        saveCode: 'region',\n      },\n<#elseif po.classType=='popup'>\n    <#include \"/common/form/vue3popup.ftl\">\n<#elseif po.classType=='popup_dict'>\n      component: 'JPopupDict',\n      componentProps: {\n        placeholder: '请选择${po.filedComment}',\n        dictCode: '${po.dictTable},${po.dictText},${po.dictField}',\n        multi: ${po.extendParams.popupMulti?c}\n      },\n<#elseif po.classType=='list' || po.classType=='radio' || po.classType=='checkbox'>\n<#--  ---------------------------下拉或是单选 判断数据字典是表字典还是普通字典------------------------------- -->\n      component: 'JSelectMultiple',\n      componentProps:{\n       <#if po.dictTable?default(\"\")?trim?length gt 1>\n          dictCode:\"${po.dictTable},${po.dictText},${po.dictField}\"\n       <#elseif po.dictField?default(\"\")?trim?length gt 1>\n          dictCode:\"${po.dictField}\"\n        </#if>\n      },\n<#elseif po.classType == 'sel_tree'>\n      component: 'JTreeSelect',\n      componentProps:{\n          <#if po.dictText??>\n          <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n          dict:\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\",\n          <#elseif po.dictText?split(',')[1]??>\n          pidField:\"${po.dictText?split(',')[1]}\",\n          <#elseif po.dictText?split(',')[3]??>\n          hasChildField:\"${po.dictText?split(',')[3]}\",\n          </#if>\n          </#if>\n          pidValue:\"${po.dictField}\",\n      },\n<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n      component: 'InputNumber',\n<#else>\n      component: 'Input',\n</#if>\n      //colProps: {span: 6},\n \t},\n<#elseif po.queryMode=='like'>\n  {\n    label: \"${po.filedComment}\",\n    field: \"${po.fieldName}\",\n    component: 'JInput',\n  },\n<#else>\n     {\n      label: \"${po.filedComment}\",\n      field: \"${po.fieldName}\",\n<#if po.classType=='date'>\n      component: 'RangePicker',\n      componentProps: {\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        picker: '${po.extendParams.picker}',\n        </#if>\n        valueType: 'Date',\n      },\n<#elseif po.classType=='datetime'>\n      component: 'RangePicker',\n      componentProps: {\n          valueType: 'Date',\n          showTime:true\n      },\n<#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n      component: 'JRangeNumber',\n<#-- update-begin---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n<#elseif po.classType=='time'>\n      component: 'RangeTime',\n<#-- update-end---author:chenrui ---date:20240527  for：[TV360X-388]时间范围查询控件---------- -->\n<#else>\n      component: 'Input', //TODO 范围查询\n</#if>\n      //colProps: {span: 6},\n\t},\n</#if>\n</#if>\n</#list>\n<#-- 结束循环 -->\n];\n//表单数据\nexport const formSchema: FormSchema[] = [\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign bpm_flag=false>\n<#assign id_exists = false>\n<#list columns as po><#rt/>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.fieldDbName == 'id'>\n\t<#assign id_exists = true>\n</#if>\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if po.isShow =='Y' && po.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n  {\n    label: '${po.filedComment}',\n    field: ${autoStringSuffix(po)},\n<#-- update-begin-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n  <#if po.defaultVal??>\n    <#if po.fieldDbType==\"BigDecimal\" || po.fieldDbType==\"double\" || po.fieldDbType==\"int\">\n    defaultValue: ${po.defaultVal},\n    <#else>\n    defaultValue: \"${po.defaultVal}\",\n    </#if>\n  </#if>\n<#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n    <#if po.classType =='date'>\n    component: 'DatePicker',\n    componentProps: {\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      picker: '${po.extendParams.picker}',\n      </#if>\n      valueFormat: 'YYYY-MM-DD'\n    },    \n     <#elseif po.classType =='datetime'>\n    component: 'DatePicker',\n    componentProps: {\n       showTime:true,\n       valueFormat: 'YYYY-MM-DD HH:mm:ss'\n     },\n     <#elseif po.classType =='time'>\n    component: 'TimePicker',\n    componentProps: {\n      valueFormat: 'HH:mm:ss'\n    },    \n    <#elseif po.classType =='popup'>\n    <#include \"/common/form/vue3popup.ftl\">\n    <#elseif po.classType=='popup_dict'>\n    component: 'JPopupDict',\n    componentProps: {\n      placeholder: '请选择${po.filedComment}',\n      dictCode: '${po.dictTable},${po.dictText},${po.dictField}',\n      multi: ${po.extendParams.popupMulti?c}\n    },\n     <#elseif po.classType =='sel_depart'>\n     component: 'JSelectDept',\n     componentProps:{\n   <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   </#if>\n   <#if po.extendParams?exists && po.extendParams.store?exists>\n       rowKey: '${po.extendParams.store}',\n   </#if>\n     },\n     <#elseif po.classType =='switch'>\n     component: 'JSwitch',\n     componentProps:{\n         <#if po.dictField != 'is_open'>\n         options:${po.dictField}\n         </#if>\n     },\n     <#elseif po.classType =='pca'>\n    component: 'JAreaLinkage',\n    componentProps: {\n      saveCode: 'region',\n    },\n    <#elseif po.classType =='markdown'>\n    component: 'JMarkdownEditor',//注意string转换问题\n     <#elseif po.classType =='password'>\n    component: 'InputPassword',\n     <#elseif po.classType =='sel_user'>\n<#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n    component: 'JSelectUser',\n<#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n     componentProps:{\n   <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   </#if>\n   <#if po.extendParams?exists && po.extendParams.store?exists>\n       rowKey: '${po.extendParams.store}',\n   </#if>\n     },\n    <#elseif po.classType =='textarea'>\n    component: 'InputTextArea',\n    <#elseif po.classType=='list'>\n    component: 'JDictSelectTag',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\",\n    <#if po.fieldDbType=='int'>\n        stringToNumber: true\n    </#if>\n     },\n    <#elseif po.classType=='radio'>\n    component: 'JDictSelectTag',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\",\n        type: \"radio\",\n     <#if po.fieldDbType=='int'>\n        stringToNumber: true\n     </#if>\n     },\n     <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- -->\n    <#elseif po.classType=='list_multi'>\n    component: 'JSelectMultiple',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n    <#elseif po.classType=='checkbox'>\n    component: 'JCheckbox',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n     <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- -->\n    <#elseif po.classType=='sel_search'>\n    component: 'JSearchSelect',\n    componentProps:{\n       dict:\"${form_field_dictCode}\"\n    },\n<#elseif po.classType=='cat_tree'>\n    <#assign form_cat_tree = true>\n    component: 'JCategorySelect',\n    componentProps:{\n       pcode:\"${po.dictField?default(\"\")}\", //TODO back和事件未添加，暂时有问题\n    },\n    <#if po.dictText?default(\"\")?trim?length gt 1>\n    <#assign form_cat_back = \"${po.dictText}\">\n    </#if>\n    <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n    component: 'InputNumber',\n    <#elseif po.classType=='file'>\n    component: 'JUpload',\n    componentProps:{\n    <#if po.uploadnum??>\n       maxCount:${po.uploadnum}\n   </#if>\n     },\n <#elseif po.classType=='image'>\n     component: 'JImageUpload',\n     componentProps:{\n     <#if po.uploadnum??>\n        fileMax:${po.uploadnum}\n     <#else>\n        fileMax: 0\n     </#if>\n      },\n  <#elseif po.classType=='umeditor'>\n    component: 'JEditor',\n  <#elseif po.classType == 'sel_tree'>\n    component: 'JTreeSelect',\n    componentProps:{\n        <#if po.dictText??>\n        <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n        dict:\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\",\n        <#elseif po.dictText?split(',')[1]??>\n        pidField:\"${po.dictText?split(',')[1]}\",\n        <#elseif po.dictText?split(',')[3]??>\n        hasChildField:\"${po.dictText?split(',')[3]}\",\n        </#if>\n        </#if>\n        pidValue:\"${po.dictField}\",\n    },\n   <#elseif po.classType=='link_table'>\n   component: 'JLinkTableCard',\n   componentProps: {\n     valueField: '${po.dictField}',\n     textField: '${po.dictText}',\n     tableName: '${po.dictTable}',\n     multi: <#if (po.queryMode!\"\") == \"multi\">true<#else>false</#if>\n   },\n   <#else>\n    component: 'Input',\n    </#if>\n     <#include \"/common/utils.ftl\">\n    <#if po.isShow == 'Y' && poHasCheck(po)>\n    dynamicRules: ({model,schema}) => {\n    <#if po.fieldName != 'id'>\n    <#assign fieldValidType = po.fieldValidType!''>\n          return [\n            <#-- 非空校验 -->\n           <#if po.nullable == 'N' || fieldValidType == '*'>\n                 { required: true, message: '请输入${po.filedComment}!'},\n           <#elseif fieldValidType!=''>\n                 { required: false},\n           </#if>\n       <#-- 唯一校验 -->\n           <#if fieldValidType == 'only'>\n                 {...rules.duplicateCheckRule(<#if sub?default(\"\")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'</#if>, '${po.fieldDbName}',model,schema)[0]},\n           <#-- 6到16位数字 -->\n           <#elseif fieldValidType == 'n6-16'>\n                 { pattern: /^\\d{6,16}$|^(?=\\d+\\.\\d+)[\\d.]{7,17}$/, message: '请输入6到16位数字!'},\n           <#-- 6到16位任意字符 -->\n           <#elseif fieldValidType == '*6-16'>\n                 { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},\n           <#-- 6到18位字母 -->\n           <#elseif fieldValidType == 's6-18'>\n                 { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},\n           <#-- 网址 -->\n           <#elseif fieldValidType == 'url'>\n                 { pattern: /^((ht|f)tps?):\\/\\/[\\w\\-]+(\\.[\\w\\-]+)+([\\w\\-.,@?^=%&:\\/~+#]*[\\w\\-@?^=%&\\/~+#])?$/, message: '请输入正确的网址!'},\n           <#-- 电子邮件 -->\n           <#elseif fieldValidType == 'e'>\n                 { pattern: /^([\\w]+\\.*)([\\w]+)@[\\w]+\\.\\w{3}(\\.\\w{2}|)$/, message: '请输入正确的电子邮件!'},\n           <#-- 手机号码 -->\n           <#elseif fieldValidType == 'm'>\n                 { pattern: /^1[3456789]\\d{9}$/, message: '请输入正确的手机号码!'},\n           <#-- 邮政编码 -->\n           <#elseif fieldValidType == 'p'>\n                 { pattern: /^[0-9]\\d{5}$/, message: '请输入正确的邮政编码!'},\n           <#-- 字母 -->\n           <#elseif fieldValidType == 's'>\n                 { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},\n           <#-- 数字 -->\n           <#elseif fieldValidType == 'n'>\n                 { pattern: /^-?\\d+\\.?\\d*$/, message: '请输入数字!'},\n           <#-- 整数 -->\n           <#elseif fieldValidType == 'z'>\n                 { pattern: /^-?\\d+$/, message: '请输入整数!'},\n           <#-- 金额 -->\n           <#elseif fieldValidType == 'money'>\n                 { pattern: /^(([1-9][0-9]*)|([0]\\.\\d{0,2}|[1-9][0-9]*\\.\\d{0,2}))$/, message: '请输入正确的金额!'},\n           <#-- 正则校验 -->\n           <#elseif fieldValidType != '' && fieldValidType != '*'>\n                 { pattern: '${fieldValidType}', message: '不符合校验规则!'},\n           <#-- 无校验 -->\n           <#else>\n               <#t>\n           </#if>\n          ];\n     </#if>\n     },\n    </#if>\n    <#if po.readonly=='Y'>\n    dynamicDisabled:true\n    </#if>\n  },\n</#if>\n</#list>\n<#if id_exists == false>\n\t// TODO 主键隐藏字段，目前写死为ID\n\t{\n\t  label: '',\n\t  field: 'id',\n\t  component: 'Input',\n\t  show: false\n\t},\n</#if>\n];\n//子表单数据\n<#list subTables as sub>\n<#if sub.foreignRelationType =='1'>\nexport const ${sub.entityName?uncap_first}FormSchema: FormSchema[] = [\n<#assign form_cat_tree = false>\n<#assign form_cat_back = \"\">\n<#assign bpm_flag=false>\n<#assign sub_id_exists = false>\n<#list sub.colums as po><#rt/>\n<#if po.fieldDbName=='bpm_status'>\n  <#assign bpm_flag=true>\n</#if>\n<#if po.fieldDbName == 'id'>\n\t<#assign sub_id_exists = true>\n</#if>\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if po.isShow =='Y' && po.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#assign form_field_dictCode=\"\">\n\t<#if po.dictTable?default(\"\")?trim?length gt 1 && po.dictText?default(\"\")?trim?length gt 1 && po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictTable},${po.dictText},${po.dictField}\">\n\t<#elseif po.dictField?default(\"\")?trim?length gt 1>\n\t\t<#assign form_field_dictCode=\"${po.dictField}\">\n\t</#if>\n  {\n    label: '${po.filedComment}',\n    field: ${autoStringSuffix(po)},\n<#-- update-begin-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n  <#if po.defaultVal??>\n    <#if po.fieldDbType==\"BigDecimal\" || po.fieldDbType==\"double\" || po.fieldDbType==\"int\">\n    defaultValue: ${po.defaultVal},\n    <#else>\n    defaultValue: \"${po.defaultVal}\",\n    </#if>\n  </#if>\n<#-- update-end-author:taoyan date:2022-6-24 for: VUEN-1190【代码生成】默认值未生成 -->\n    <#if po.classType =='date'>\n    component: 'DatePicker',\n    componentProps: {\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      picker: '${po.extendParams.picker}',\n      </#if>\n      valueFormat: 'YYYY-MM-DD'\n    },\n     <#elseif po.classType =='datetime'>\n    component: 'DatePicker',\n    componentProps: {\n       showTime:true,\n       valueFormat: 'YYYY-MM-DD HH:mm:ss'\n     },\n     <#elseif po.classType =='time'>\n    component: 'TimePicker',\n    componentProps: {\n      valueFormat: 'HH:mm:ss'\n    },\n    <#elseif po.classType =='popup'>\n    <#include \"/common/form/vue3popup.ftl\">\n    <#elseif po.classType=='popup_dict'>\n    component: 'JPopupDict',\n    componentProps: {\n      placeholder: '请选择${po.filedComment}',\n      dictCode: '${po.dictTable},${po.dictText},${po.dictField}',\n      multi: ${po.extendParams.popupMulti?c}\n    },\n     <#elseif po.classType =='sel_depart'>\n     component: 'JSelectDept',\n     componentProps:{\n   <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   </#if>\n   <#if po.extendParams?exists && po.extendParams.store?exists>\n       rowKey: '${po.extendParams.store}',\n   </#if>\n     },\n     <#elseif po.classType =='switch'>\n     component: 'JSwitch',\n     componentProps:{\n         <#if po.dictField != 'is_open'>\n         options:${po.dictField}\n         </#if>\n     },\n     <#elseif po.classType =='pca'>\n    component: 'JAreaLinkage',\n    componentProps: {\n      saveCode: 'region',\n    },\n    <#elseif po.classType =='markdown'>\n    component: 'JMarkdownEditor',//注意string转换问题\n     <#elseif po.classType =='password'>\n    component: 'InputPassword',\n     <#elseif po.classType =='sel_user'>\n<#-- update-begin---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n    component: 'JSelectUser',\n<#-- update-end---author:chenrui ---date:20240102  for：[issue/#5711]修复用户选择组件在生成代码后变成部门用户选择组件---------- -->\n     componentProps:{\n   <#if po.extendParams?exists && po.extendParams.text?exists>\n       labelKey: '${po.extendParams.text}',\n   </#if>\n   <#if po.extendParams?exists && po.extendParams.store?exists>\n       rowKey: '${po.extendParams.store}',\n   </#if>\n     },\n    <#elseif po.classType =='textarea'>\n    component: 'InputTextArea',\n    <#elseif po.classType=='list'>\n    component: 'JDictSelectTag',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\",\n     <#if po.fieldDbType=='int'>\n        stringToNumber: true\n     </#if>\n     },\n    <#elseif po.classType=='radio'>\n    component: 'JDictSelectTag',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\",\n        type: \"radio\",\n      <#if po.fieldDbType=='int'>\n        stringToNumber: true\n      </#if>\n     },\n     <#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选---------- -->\n    <#elseif po.classType=='list_multi'>\n    component: 'JSelectMultiple',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n    <#elseif po.classType=='checkbox'>\n    component: 'JCheckbox',\n    componentProps:{\n        dictCode:\"${form_field_dictCode}\"\n     },\n     <#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7583] Vue3风格表单页面多选控件渲染成了下拉多选----------- -->\n    <#elseif po.classType=='sel_search'>\n    component: 'JSearchSelect',\n    componentProps:{\n       dict:\"${form_field_dictCode}\"\n    },\n<#elseif po.classType=='cat_tree'>\n    <#assign form_cat_tree = true>\n    component: 'JCategorySelect',\n    componentProps:{\n       pcode:\"${po.dictField?default(\"\")}\", //TODO back和事件未添加，暂时有问题\n    },\n    <#if po.dictText?default(\"\")?trim?length gt 1>\n    <#assign form_cat_back = \"${po.dictText}\">\n    </#if>\n    <#elseif po.fieldDbType=='int' || po.fieldDbType=='long' || po.fieldDbType=='double' || po.fieldDbType=='BigDecimal'>\n    component: 'InputNumber',\n    <#elseif po.classType=='file'>\n    component: 'JUpload',\n    componentProps:{\n    <#if po.uploadnum??>\n       maxCount:${po.uploadnum}\n   </#if>\n     },\n <#elseif po.classType=='image'>\n     component: 'JImageUpload',\n     componentProps:{\n     <#if po.uploadnum??>\n        fileMax:${po.uploadnum}\n     <#else>\n        fileMax: 0\n     </#if>\n      },\n  <#elseif po.classType=='umeditor'>\n    component: 'JEditor',\n  <#elseif po.classType == 'sel_tree'>\n    component: 'JTreeSelect',\n    componentProps:{\n        <#if po.dictText??>\n        <#if po.dictText?split(',')[2]?? && po.dictText?split(',')[0]??>\n        dict:\"${po.dictTable},${po.dictText?split(',')[2]},${po.dictText?split(',')[0]}\",\n        <#elseif po.dictText?split(',')[1]??>\n        pidField:\"${po.dictText?split(',')[1]}\",\n        <#elseif po.dictText?split(',')[3]??>\n        hasChildField:\"${po.dictText?split(',')[3]}\",\n        </#if>\n        </#if>\n        pidValue:\"${po.dictField}\",\n    },\n  <#elseif po.classType=='link_table'>\n    component: 'JLinkTableCard',\n    componentProps: {\n      valueField: '${po.dictField}',\n      textField: '${po.dictText}',\n      tableName: '${po.dictTable}',\n      multi: <#if (po.queryMode!\"\") == \"multi\">true<#else>false</#if>\n    },\n   <#else>\n    component: 'Input',\n    </#if>\n     <#include \"/common/utils.ftl\">\n    <#if po.isShow == 'Y' && poHasCheck(po)>\n    dynamicRules: ({model,schema}) => {\n    <#if po.fieldName != 'id'>\n    <#assign fieldValidType = po.fieldValidType!''>\n          return [\n            <#-- 非空校验 -->\n           <#if po.nullable == 'N' || fieldValidType == '*'>\n                 { required: true, message: '请输入${po.filedComment}!'},\n           <#elseif fieldValidType!=''>\n                 { required: false},\n           </#if>\n       <#-- 唯一校验 -->\n           <#if fieldValidType == 'only'>\n                 {...rules.duplicateCheckRule(<#if sub?default(\"\")?trim?length gt 1>'${sub.tableName}'<#else>'${tableName}'</#if>, '${po.fieldDbName}',model,schema)[0]},\n           <#-- 6到16位数字 -->\n           <#elseif fieldValidType == 'n6-16'>\n                 { pattern: /^\\d{6,16}$|^(?=\\d+\\.\\d+)[\\d.]{7,17}$/, message: '请输入6到16位数字!'},\n           <#-- 6到16位任意字符 -->\n           <#elseif fieldValidType == '*6-16'>\n                 { pattern: /^.{6,16}$/, message: '请输入6到16位任意字符!'},\n           <#-- 6到18位字母 -->\n           <#elseif fieldValidType == 's6-18'>\n                 { pattern: /^[a-z|A-Z]{6,18}$/, message: '请输入6到18位字母!'},\n           <#-- 网址 -->\n           <#elseif fieldValidType == 'url'>\n                 { pattern: /^((ht|f)tps?):\\/\\/[\\w\\-]+(\\.[\\w\\-]+)+([\\w\\-.,@?^=%&:\\/~+#]*[\\w\\-@?^=%&\\/~+#])?$/, message: '请输入正确的网址!'},\n           <#-- 电子邮件 -->\n           <#elseif fieldValidType == 'e'>\n                 { pattern: /^([\\w]+\\.*)([\\w]+)@[\\w]+\\.\\w{3}(\\.\\w{2}|)$/, message: '请输入正确的电子邮件!'},\n           <#-- 手机号码 -->\n           <#elseif fieldValidType == 'm'>\n                 { pattern: /^1[3456789]\\d{9}$/, message: '请输入正确的手机号码!'},\n           <#-- 邮政编码 -->\n           <#elseif fieldValidType == 'p'>\n                 { pattern: /^[0-9]\\d{5}$/, message: '请输入正确的邮政编码!'},\n           <#-- 字母 -->\n           <#elseif fieldValidType == 's'>\n                 { pattern: /^[A-Z|a-z]+$/, message: '请输入字母!'},\n           <#-- 数字 -->\n           <#elseif fieldValidType == 'n'>\n                 { pattern: /^-?\\d+\\.?\\d*$/, message: '请输入数字!'},\n           <#-- 整数 -->\n           <#elseif fieldValidType == 'z'>\n                 { pattern: /^-?\\d+$/, message: '请输入整数!'},\n           <#-- 金额 -->\n           <#elseif fieldValidType == 'money'>\n                 { pattern: /^(([1-9][0-9]*)|([0]\\.\\d{0,2}|[1-9][0-9]*\\.\\d{0,2}))$/, message: '请输入正确的金额!'},\n           <#-- 正则校验 -->\n           <#elseif fieldValidType != '' && fieldValidType != '*'>\n                 { pattern: '${fieldValidType}', message: '不符合校验规则!'},\n           <#-- 无校验 -->\n           <#else>\n               <#t>\n           </#if>\n          ];\n     </#if>\n     },\n    </#if>\n    <#if po.readonly=='Y'>\n    dynamicDisabled:true\n    </#if>\n  },\n</#if>\n</#list>\n<#if sub_id_exists == false>\n\t{\n\t  label: '',\n\t  field: 'id',\n\t  component: 'Input',\n\t  show: false\n\t},\n</#if>\n];\n</#if>\n</#list>\n//子表表格配置\n<#list subTables as sub>\n<#if sub.foreignRelationType =='0'>\nexport const ${sub.entityName?uncap_first}Columns: JVxeColumn[] = [\n<#assign popupBackFields = \"\">\n\n<#-- 循环子表的列 开始 -->\n<#list sub.colums as col><#rt/>\n<#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if col.isShow =='Y' && col.fieldName !='delFlag'>\n<#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n<#if col.filedComment !='外键' >\n    {\n      title: '${col.filedComment}',\n      key: '${autoStringSuffixForModel(col)}',\n<#if col.classType =='date'>\n      type: JVxeTypes.date,\n      <#if col.extendParams?exists && col.extendParams.picker?exists>\n      picker: '${col.extendParams.picker}',\n      </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='datetime'>\n      type: JVxeTypes.datetime,\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='time'>\n      type: JVxeTypes.time,\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='textarea'>\n      type: JVxeTypes.textarea,\n       <#if col.readonly=='Y'>\n      disabled:true,\n       </#if>\n<#elseif col.classType =='list' || col.classType =='radio'>\n      type: JVxeTypes.select,\n      options:[],\n      <#if col.dictTable?default(\"\")?trim?length gt 1>\n      dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n      <#else>\n      dictCode:\"${col.dictField}\",\n      </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='list_multi' || col.classType =='checkbox'>\n      type: JVxeTypes.selectMultiple,\n      options:[],\n      <#if col.dictTable?default(\"\")?trim?length gt 1>\n      dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n      <#else>\n      dictCode:\"${col.dictField}\",\n      </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='sel_search'>\n      type: JVxeTypes.selectSearch,\n      <#if col.dictTable?default(\"\")?trim?length gt 1>\n      dictCode:\"${col.dictTable},${col.dictText},${col.dictField}\",\n      <#else>\n      dictCode:\"${col.dictField}\",\n      </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='sel_depart'>\n      type: JVxeTypes.departSelect,\n      props:{\n    <#if col.extendParams?exists && col.extendParams.text?exists>\n        labelKey: '${col.extendParams.text}',\n    </#if>\n    <#if col.extendParams?exists && col.extendParams.store?exists>\n        rowKey: '${col.extendParams.store}',\n    </#if>\n      },\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='sel_user'>\n      type: JVxeTypes.userSelect,\n      props:{\n    <#if col.extendParams?exists && col.extendParams.text?exists>\n        labelKey: '${col.extendParams.text}',\n    </#if>\n    <#if col.extendParams?exists && col.extendParams.store?exists>\n        rowKey: '${col.extendParams.store}',\n    </#if>\n      },\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='image'>\n      type: JVxeTypes.image,\n      token:true,\n      responseName:\"message\",\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n      <#if col.uploadnum??>\n      number: ${col.uploadnum},\n      </#if>\n<#elseif col.classType =='file'>\n      type: JVxeTypes.file,\n      token:true,\n      responseName:\"message\",\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n      <#if col.uploadnum??>\n      number: ${col.uploadnum},\n      </#if>\n<#elseif col.classType =='switch'>\n      type: JVxeTypes.checkbox,\n       <#if col.dictField == 'is_open'>\n      customValue: ['Y', 'N'],\n        <#else>\n      customValue: ${col.dictField},\n        </#if>\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType=='pca'>\n      type: JVxeTypes.pca,\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n<#elseif col.classType =='popup'>\n<#if popupBackFields?length gt 0>\n    <#assign popupBackFields = \"${popupBackFields}\"+\",\"+\"${col.dictText}\">\n<#else>\n    <#assign popupBackFields = \"${col.dictText}\">\n</#if>\n    <#include \"/common/form/vue3Jvxepopup.ftl\">\n<#-- update-begin-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对，数字或者金额类型 -->\n<#-- elseif \"int,decimal,double,\"?contains(col.classType) -->\n<#elseif col.fieldDbType=='int' || col.fieldDbType=='long' || col.fieldDbType=='double' || col.fieldDbType=='BigDecimal'>\n<#-- update-end-author:taoyan date:20220523 for: VUEN-1084 【vue3】online表单测试发现的新问题 20、一对多列字段类型生成的不对，数字或者金额类型 -->\n      type: JVxeTypes.inputNumber,\n    <#if col.readonly=='Y'>\n      disabled:true,\n    </#if>\n<#else>\n      type: JVxeTypes.input,\n      <#if col.readonly=='Y'>\n      disabled:true,\n      </#if>\n</#if>\n<#if col.classType =='list_multi' || col.classType =='checkbox'>\n      width:\"250px\",\n<#else>\n      width:\"200px\",\n</#if>\n<#if col.classType =='file'>\n      placeholder: '请选择文件',\n<#else>\n      placeholder: '请输入${'$'}{title}',\n</#if>\n<#if col.defaultVal??>\n<#if col.fieldDbType==\"BigDecimal\" || col.fieldDbType==\"double\" || col.fieldDbType==\"int\">\n      defaultValue:${col.defaultVal},\n      <#else>\n      defaultValue:\"${col.defaultVal}\",\n</#if>\n<#else>\n      defaultValue:'',\n</#if>\n<#-- 子表的校验 -->\n <#include \"/common/validatorRulesTemplate/sub-vue3.ftl\">\n    },\n</#if>\n</#if>\n</#list>\n<#-- 循环子表的列 结束 -->\n  ]\n</#if>\n</#list>\n\n<#-- update-begin---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->\n// 高级查询数据\nexport const superQuerySchema = {\n  <#list columns as po>\n  <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  <#if po.isShowList =='Y' && po.fieldName !='id' && po.fieldName !='delFlag'>\n  <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n  ${superQueryFieldListForVue3(po,po_index)},\n  </#if>\n  </#list>\n  //子表高级查询\n  <#list subTables as sub>\n  ${sub.entityName?uncap_first}: {\n    title: '${sub.ftlDescription}',\n    view: 'table',\n    fields: {\n      <#list sub.colums as subCol>\n        <#-- update-begin---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n        <#if subCol.isShowList =='Y' && subCol.fieldName !='id' && subCol.fieldName !='delFlag'>\n        <#-- update-end---author:chenrui ---date:20240108  for：[issues/5755]vue代码不加入逻辑删除字段---------- -->\n        ${superQueryFieldListForVue3(subCol,subCol_index)},\n        </#if>\n      </#list>\n    }\n  },\n  </#list>\n};\n<#-- update-end---author:chenrui ---date:20231228  for：[QQYUN-7527]vue3代码生成默认带上高级查询---------- -->"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/V${currentDate}_1__menu_insert_${entityName}.sql",
    "content": "<#include \"/common/sql/menu_insert.ftl\">"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<template>\n  <div>\n  <!-- 子表单区域 -->\n    <a-tabs v-model:activeKey=\"activeKey\" animated @change=\"handleChangeTabs\">\n     <!--主表区域 -->\n     <a-tab-pane tab=\"${tableVo.ftlDescription}\" :key=\"refKeys[0]\" :forceRender=\"true\" :style=\"tabsStyle\">\n       <BasicForm @register=\"registerForm\" ref=\"formRef\"/>\n     </a-tab-pane>\n  <!--子表单区域 -->\n<#list subTables as sub><#rt/>\n  <#assign refKey = sub.entityName?uncap_first/>\n  <#if sub.foreignRelationType =='1'>\n      <a-tab-pane tab=\"${sub.ftlDescription}\" key=\"${refKey}\" :forceRender=\"true\" :style=\"tabsStyle\">\n        <${sub.entityName}Form ref=\"${sub.entityName?uncap_first}Form\" :disabled=\"formDisabled\"></${sub.entityName}Form>\n      </a-tab-pane>\n\n  <#else>\n      <a-tab-pane tab=\"${sub.ftlDescription}\" key=\"${refKey}\" :forceRender=\"true\" :style=\"tabsStyle\">\n        <JVxeTable\n          keep-source\n          resizable\n          ref=\"${refKey}\"\n          v-if=\"${sub.entityName?uncap_first}Table.show\"\n          :loading=\"${sub.entityName?uncap_first}Table.loading\"\n          :columns=\"${sub.entityName?uncap_first}Table.columns\"\n          :dataSource=\"${sub.entityName?uncap_first}Table.dataSource\"\n          :height=\"340\"\n          :disabled=\"formDisabled\"\n          :rowNumber=\"true\"\n          :rowSelection=\"true\"\n          :toolbar=\"true\"\n          />\n      </a-tab-pane>\n  </#if>\n</#list>\n    </a-tabs>\n\n    <div style=\"width: 100%;text-align: center;margin-top: 10px;\" v-if=\"showFlowSubmitButton\">\n      <a-button preIcon=\"ant-design:check-outlined\" style=\"width: 126px\" type=\"primary\" @click=\"handleSubmit\">提 交</a-button>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n    import { defHttp } from '/@/utils/http/axios';\n    import {ref, computed, unref,reactive, onMounted, defineProps } from 'vue';\n    import {BasicForm, useForm} from '/@/components/Form/index';\n    import { JVxeTable } from '/@/components/jeecg/JVxeTable'\n    import { useJvxeMethod } from '/@/hooks/system/useJvxeMethods.ts'\n    <#list subTables as sub>\n      <#if sub.foreignRelationType =='1'>\n    import ${sub.entityName}Form from './${sub.entityName}Form.vue'\n      </#if>\n    </#list>\n    import {formSchema<#list subTables as sub><#if sub.foreignRelationType =='0'>,${sub.entityName?uncap_first}Columns</#if></#list>} from '../${entityName}.data';\n    import {saveOrUpdate<#list subTables as sub>,${sub.entityName?uncap_first}List</#list>} from '../${entityName}.api';\n    import { VALIDATE_FAILED } from '/@/utils/common/vxeUtils'\n    const refKeys = ref(['${tableVo.entityName?uncap_first}',<#list subTables as sub>'${sub.entityName?uncap_first}', </#list>]);\n    <#assign hasOne2Many = false>\n    <#assign hasOne2One = false>\n    const activeKey = ref('${tableVo.entityName?uncap_first}');\n<#list subTables as sub>\n<#if sub.foreignRelationType =='0'>\n <#assign hasOne2Many = true>\n    const ${sub.entityName?uncap_first} = ref();\n</#if>\n<#if sub.foreignRelationType =='1'>\n <#assign hasOne2One = true>\n    const ${sub.entityName?uncap_first}Form = ref();\n</#if>\n</#list>\n    const tableRefs = {<#list subTables as sub><#if sub.foreignRelationType =='0'>${sub.entityName?uncap_first}, <#assign hasOne2Many = true></#if></#list>};\n   <#list subTables as sub>\n   <#if sub.foreignRelationType =='0'>\n    const ${sub.entityName?uncap_first}Table = reactive({\n          loading: false,\n          dataSource: [],\n          columns:${sub.entityName?uncap_first}Columns,\n          show: false\n    })\n    </#if>\n   </#list>\n\n    const props = defineProps({\n      formData: { type: Object, default: ()=>{} },\n      formBpm: { type: Boolean, default: true }\n    });\n    const formDisabled = computed(()=>{\n      if(props.formBpm === true){\n        if(props.formData.disabled === false){\n          return false;\n        }\n      }\n      return true;\n    });\n    // 是否显示提交按钮\n    const showFlowSubmitButton = computed(()=>{\n      if(props.formBpm === true){\n        if(props.formData.disabled === false){\n          return true\n        }\n      }\n      return false\n    });\n    \n    //表单配置\n    const [registerForm, {setProps,resetFields, setFieldsValue, validate}] = useForm({\n        labelWidth: 150,\n        schemas: formSchema,\n        showActionButtonGroup: false,\n        baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}}\n    });\n\n    onMounted(()=>{\n      initFormData();\n    });\n    //渲染流程表单数据\n    const queryByIdUrl = '/${entityPackagePath}/${entityName?uncap_first}/queryById';\n    async function initFormData(){\n      if(props.formBpm === true){\n        await reset();\n        let params = {id: props.formData.dataId};\n        const data = await defHttp.get({url: queryByIdUrl, params});\n        //表单赋值\n        await setFieldsValue({\n          ...data\n        });\n        <#list subTables as sub><#rt/>\n        <#if sub.foreignRelationType =='1'>\n        ${sub.entityName?uncap_first}Form.value.initFormData(${sub.entityName?uncap_first}List, data.id)\n        </#if>\n        </#list>\n        <#list subTables as sub><#rt/>\n        <#if sub.foreignRelationType =='0'>\n        requestSubTableData(${sub.entityName?uncap_first}List, {id: data.id}, ${sub.entityName?uncap_first}Table, ()=>{\n          ${sub.entityName?uncap_first}Table.show = true;\n        })\n        </#if>\n        </#list>\n        // 隐藏底部时禁用整个表单\n        setProps({ disabled: formDisabled.value })\n      }\n    }\n\n    //方法配置\n    const [handleChangeTabs,handleSubmit,requestSubTableData,formRef] = useJvxeMethod(requestAddOrEdit,classifyIntoFormData,tableRefs,activeKey,refKeys<#if hasOne2One==true>,validateSubForm</#if>);\n    // 弹窗tabs滚动区域的高度\n    const tabsStyle = computed(() => {\n      let height: Nullable<string> = null\n      let minHeight = '100px'\n      // 弹窗wrapper\n      <#-- update-begin-author:taoyan date:2022-11-14 for:VUEN-2674 【代码生成】对接流程表单 附加单据显示问题 5.多tab生成代码后，新增 没有滚动条，只能填写部分字段 --> \n      let overflow = 'auto';\n      return {height, minHeight, overflow};\n      <#-- update-end-author:taoyan date:2022-11-14 for:VUEN-2674 【代码生成】对接流程表单 附加单据显示问题 5.多tab生成代码后，新增 没有滚动条，只能填写部分字段 -->\n    })\n\n    async function reset(){\n      await resetFields();\n      activeKey.value = '${tableVo.entityName?uncap_first}';\n      <#list subTables as sub>\n        <#if sub.foreignRelationType =='0'>\n      ${sub.entityName?uncap_first}Table.dataSource = [];\n        </#if>\n        <#if sub.foreignRelationType =='1'>\n      ${sub.entityName?uncap_first}Form.value.resetFields();\n        </#if>\n      </#list>\n    }\n    function classifyIntoFormData(allValues) {\n         let main = Object.assign({}, allValues.formValue)\n         return {\n           ...main, // 展开\n <#assign subManyIndex = 0>\n <#list subTables as sub><#rt/>\n <#if sub.foreignRelationType =='0'>\n           ${sub.entityName?uncap_first}List: allValues.tablesValue[${subManyIndex}].tableData,\n           <#assign subManyIndex = subManyIndex+1>\n <#else>\n           ${sub.entityName?uncap_first}List: ${sub.entityName?uncap_first}Form.value.getFormData(),\n </#if>\n </#list>\n         }\n       }\n      <#if hasOne2One==true>\n     //校验所有一对一子表表单\n     function validateSubForm(allValues){\n         return new Promise((resolve,reject)=>{\n             Promise.all([\n             <#list subTables as sub><#rt/>\n            <#if sub.foreignRelationType =='1'>\n                  ${sub.entityName?uncap_first}Form.value.validateForm(${sub_index+1}),\n            </#if>\n          </#list>\n             ]).then(() => {\n                 resolve(allValues)\n             }).catch(e => {\n                 if (e.error === VALIDATE_FAILED) {\n                     // 如果有未通过表单验证的子表，就自动跳转到它所在的tab\n                     activeKey.value = e.index == null ? unref(activeKey) : refKeys.value[e.index]\n                 } else {\n                     console.error(e)\n                 }\n             })\n         })\n     }\n    </#if>\n    //表单提交事件\n    async function requestAddOrEdit(values) {\n      //提交表单\n      await saveOrUpdate(values, true);\n    }\n</script>\n\n<style lang=\"less\" scoped>\n  /** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-calendar-picker) {\n    width: 100%;\n  }\n</style>\n\n<style lang=\"less\">\n// Online表单Tab风格专属样式\n.j-cgform-tab-modal {\n  .ant-modal-header {\n    padding-top: 8px;\n    padding-bottom: 8px;\n    border-bottom: none !important;\n  }\n\n  .ant-modal .ant-modal-body > .scrollbar,\n  .ant-tabs-nav .ant-tabs-tab {\n    padding-top: 0;\n  }\n\n  .ant-tabs-top-bar {\n    width: calc(100% - 55px);\n    position: relative;\n    left: -14px;\n  }\n\n  .ant-tabs .ant-tabs-top-content > .ant-tabs-tabpane {\n    overflow: hidden auto;\n  }\n}\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/${entityName}Modal.vuei",
    "content": "﻿<#include \"/common/utils.ftl\">\n<template>\n<#assign buttonList=[]>\n<#if tableVo.extendParams?? && tableVo.extendParams.cgButtonList??>\n  <#assign buttonList = tableVo.extendParams.cgButtonList?filter(btn -> btn??)>\n</#if>\n  <BasicModal ref=\"modalRef\" destroyOnClose wrapClassName=\"j-cgform-tab-modal\" v-bind=\"$attrs\" @register=\"registerModal\" :maxHeight=\"500\" :width=\"${getModalWidth(tableVo.fieldRowNum?default(1))}\" @ok=\"handleSubmit\">\n    <!-- 标题区域 -->\n     <template #title>\n        <div class=\"titleArea\">\n          <div class=\"title\">{{ title }}</div>\n          <div class=\"right\">\n            <a-radio-group v-model:value=\"activeKey\">\n              <template v-for=\"(item, index) in tabNav\" :key=\"index\">\n                <a-radio-button :value=\"item.tableName\">{{ item.tableTxt }}</a-radio-button>\n              </template>\n            </a-radio-group>\n          </div>\n        </div>\n     </template>\n     <!--表单区域 -->\n     <div class=\"contentArea\">\n       <!--主表区域 -->\n        <BasicForm @register=\"registerForm\" ref=\"formRef\" v-show=\"activeKey == refKeys[0]\" name=\"${entityName}Form\"/>\n       <!--子表区域 -->\n     <#list subTables as sub><#rt/>\n       <#assign refKey = sub.entityName?uncap_first/>\n       <#if sub.foreignRelationType =='1'>\n         <${sub.entityName}Form ref=\"${sub.entityName?uncap_first}Form\" :disabled=\"formDisabled\" v-show=\"activeKey == '${refKey}'\"></${sub.entityName}Form>\n       <#else>\n         <JVxeTable\n           v-show=\"activeKey == '${refKey}'\"\n           keep-source\n           resizable\n           ref=\"${refKey}\"\n           :loading=\"${sub.entityName?uncap_first}Table.loading\"\n           :columns=\"${sub.entityName?uncap_first}Table.columns\"\n           :dataSource=\"${sub.entityName?uncap_first}Table.dataSource\"\n           :height=\"340\"\n           :disabled=\"formDisabled\"\n           :rowNumber=\"true\"\n           :rowSelection=\"true\"\n           :toolbar=\"true\"\n           />\n       </#if>\n     </#list>\n     </div>\n <#if buttonList?? && buttonList?size gt 0>\n    <template #insertFooter>\n     <#list buttonList as btn>\n      <#if btn.buttonStyle=='form'>\n        <a-button type=\"primary\" @click=\"handle${btn.buttonCode?cap_first}\" <#if btn.buttonIcon??> preIcon=\"${btn.buttonIcon}\" </#if>>${btn.buttonName}</a-button>\n      </#if>\n     </#list>\n    </template>\n </#if>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n    import {ref, computed, unref,reactive} from 'vue';\n    import {BasicModal, useModalInner} from '/@/components/Modal';\n    import {BasicForm, useForm} from '/@/components/Form/index';\n    import { JVxeTable } from '/@/components/jeecg/JVxeTable'\n    import { useJvxeMethod } from '/@/hooks/system/useJvxeMethods.ts'\n    <#list subTables as sub>\n      <#if sub.foreignRelationType =='1'>\n    import ${sub.entityName}Form from './${sub.entityName}Form.vue'\n      </#if>\n    </#list>\n    import {formSchema<#list subTables as sub><#if sub.foreignRelationType =='0'>,${sub.entityName?uncap_first}Columns</#if></#list>} from '../${entityName}.data';\n    import {saveOrUpdate<#list subTables as sub>,${sub.entityName?uncap_first}List</#list>} from '../${entityName}.api';\n    import { VALIDATE_FAILED } from '/@/utils/common/vxeUtils'\n    import { useMessage } from '/@/hooks/web/useMessage';\n    import { getDateByPicker } from '/@/utils';\n    //日期个性化选择\n    const fieldPickers = reactive({\n    <#list columns as po>\n      <#if po.extendParams?exists && po.extendParams.picker?exists>\n      ${po.fieldName}: '${po.extendParams.picker}',\n      </#if>\n    </#list>\n    });\n    <#list subTables as sub>\n      <#if sub.foreignRelationType =='0'>\n      const ${sub.entityName?uncap_first}FieldPickers = reactive({\n      <#list sub.colums as po>\n        <#if po.extendParams?exists && po.extendParams.picker?exists>\n        ${po.fieldName}: '${po.extendParams.picker}',\n        </#if>\n      </#list>\n      });\n      </#if>\n    </#list>\n    const { createMessage } = useMessage();\n    // Emits声明\n    const emit = defineEmits(['register','success']);\n    const isUpdate = ref(true);\n    const formDisabled = ref(false);\n    const modalRef = ref();\n    const refKeys = ref(['${tableVo.entityName?uncap_first}',<#list subTables as sub>'${sub.entityName?uncap_first}', </#list>]);\n    const tabNav = ref<any>([\n      { tableName: '${tableVo.entityName?uncap_first}', tableTxt: '${tableVo.ftlDescription}' },\n      <#list subTables as sub>\n       { tableName: '${sub.entityName?uncap_first}', tableTxt: '${sub.ftlDescription}' },\n      </#list>\n    ]);\n    <#assign hasOne2Many = false>\n    <#assign hasOne2One = false>\n    const activeKey = ref('${tableVo.entityName?uncap_first}');\n<#list subTables as sub>\n<#if sub.foreignRelationType =='0'>\n <#assign hasOne2Many = true>\n    const ${sub.entityName?uncap_first} = ref();\n</#if>\n<#if sub.foreignRelationType =='1'>\n <#assign hasOne2One = true>\n    const ${sub.entityName?uncap_first}Form = ref();\n</#if>\n</#list>\n    const tableRefs = {<#list subTables as sub><#if sub.foreignRelationType =='0'>${sub.entityName?uncap_first}, <#assign hasOne2Many = true></#if></#list>};\n   <#list subTables as sub>\n   <#if sub.foreignRelationType =='0'>\n    const ${sub.entityName?uncap_first}Table = reactive({\n          loading: false,\n          dataSource: [],\n          columns:${sub.entityName?uncap_first}Columns\n    })\n    </#if>\n   </#list>\n    //表单配置\n    const [registerForm, {setProps,resetFields, setFieldsValue, validate}] = useForm({\n        <#if tableVo.fieldRowNum == 1>\n        labelWidth: 150,\n        </#if>\n        schemas: formSchema,\n        showActionButtonGroup: false,\n        baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}}\n    });\n     //表单赋值\n    const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {\n        //重置表单\n        await reset();\n        setModalProps({confirmLoading: false,showCancelBtn:data?.showFooter,showOkBtn:data?.showFooter});\n        isUpdate.value = !!data?.isUpdate;\n        formDisabled.value = !data?.showFooter;\n        if (unref(isUpdate)) {\n            //表单赋值\n            await setFieldsValue({\n                ...data.record,\n            });\n            <#list subTables as sub><#rt/>\n            <#if sub.foreignRelationType =='1'>\n             ${sub.entityName?uncap_first}Form.value.initFormData(${sub.entityName?uncap_first}List,data?.record?.id)\n            </#if>\n            </#list>\n            <#list subTables as sub><#rt/>\n            <#if sub.foreignRelationType =='0'>\n             requestSubTableData(${sub.entityName?uncap_first}List, {id:data?.record?.id}, ${sub.entityName?uncap_first}Table)\n            </#if>\n            </#list>\n        }\n        // 隐藏底部时禁用整个表单\n       setProps({ disabled: !data?.showFooter })\n    });\n    //方法配置\n    const [handleChangeTabs,handleSubmit,requestSubTableData,formRef] = useJvxeMethod(requestAddOrEdit,classifyIntoFormData,tableRefs,activeKey,refKeys<#if hasOne2One==true>,validateSubForm</#if>);\n    // 弹窗tabs滚动区域的高度\n    const tabsStyle = computed(() => {\n      let height: Nullable<string> = null\n      let minHeight = '100px'\n      let maxHeight: Nullable<string> = '500px'\n      // 弹窗wrapper\n      let modalWrapperRef = modalRef.value?.modalWrapperRef\n      if (modalWrapperRef) {\n        if (modalWrapperRef.fullScreen) {\n          height = 'calc(' + modalWrapperRef.spinStyle.height + ' - 50px)';\n          maxHeight = null\n        }\n      }\n      <#-- update-begin-author:taoyan date:2022-11-14 for:VUEN-2674 【代码生成】对接流程表单 附加单据显示问题 5.多tab生成代码后，新增 没有滚动条，只能填写部分字段 -->\n      let overflow = 'auto';\n      return {height, minHeight, maxHeight, overflow};\n      <#-- update-end-author:taoyan date:2022-11-14 for:VUEN-2674 【代码生成】对接流程表单 附加单据显示问题 5.多tab生成代码后，新增 没有滚动条，只能填写部分字段 -->\n    })\n    //设置标题\n    const title = computed(() => (!unref(isUpdate) ? '新增' : !unref(formDisabled) ? '编辑' : '详情'));\n    //重置\n    async function reset(){\n      await resetFields();\n      activeKey.value = '${tableVo.entityName?uncap_first}';\n      <#list subTables as sub>\n        <#if sub.foreignRelationType =='0'>\n      ${sub.entityName?uncap_first}Table.dataSource = [];\n        </#if>\n        <#if sub.foreignRelationType =='1'>\n      ${sub.entityName?uncap_first}Form.value.resetFields();\n        </#if>\n      </#list>\n    }\n    function classifyIntoFormData(allValues) {\n         let main = Object.assign({}, allValues.formValue)\n         return {\n           ...main, // 展开\n <#assign subManyIndex = 0>\n <#list subTables as sub><#rt/>\n <#if sub.foreignRelationType =='0'>\n           ${sub.entityName?uncap_first}List: allValues.tablesValue[${subManyIndex}].tableData,\n           <#assign subManyIndex = subManyIndex+1>\n <#else>\n           ${sub.entityName?uncap_first}List: ${sub.entityName?uncap_first}Form.value.getFormData(),\n </#if>\n </#list>\n         }\n       }\n      <#if hasOne2One==true>\n     //校验所有一对一子表表单\n     function validateSubForm(allValues){\n         return new Promise((resolve,reject)=>{\n             Promise.all([\n             <#list subTables as sub><#rt/>\n            <#if sub.foreignRelationType =='1'>\n                  ${sub.entityName?uncap_first}Form.value.validateForm(${sub_index+1}),\n            </#if>\n          </#list>\n             ]).then(() => {\n                 resolve(allValues)\n             }).catch(e => {\n                 if (e.error === VALIDATE_FAILED) {\n                     // 如果有未通过表单验证的子表，就自动跳转到它所在的tab\n                     activeKey.value = e.index == null ? unref(activeKey) : refKeys.value[e.index]\n                     if (e.errorFields) {\n                       const firstField = e.errorFields[0];\n                       if (firstField) {\n                         e.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });\n                       }\n                     }\n                 } else {\n                     console.error(e)\n                 }\n             })\n         })\n     }\n    </#if>\n    //表单提交事件\n    async function requestAddOrEdit(values) {\n        try {\n            // 预处理日期数据\n            changeDateValue(values);\n            setModalProps({confirmLoading: true});\n            //提交表单\n            await saveOrUpdate(values, isUpdate.value);\n            //关闭弹窗\n            closeModal();\n            //刷新列表\n            emit('success');\n        } finally {\n            setModalProps({confirmLoading: false});\n        }\n    }\n\n    /**\n     * 处理日期值\n     * @param formData 表单数据\n     */\n    const changeDateValue = (formData) => {\n      if (formData && fieldPickers) {\n          for (let key in fieldPickers) {\n              if (formData[key]) {\n                  formData[key] = getDateByPicker(formData[key], fieldPickers[key]);\n              }\n          }\n      }\n      <#list subTables as sub>\n        <#if sub.foreignRelationType =='0'>\n      if(formData && formData.${sub.entityName?uncap_first}List && formData.${sub.entityName?uncap_first}List.length > 0){\n          formData.${sub.entityName?uncap_first}List.forEach(subFormData=>{\n              for (let key in ${sub.entityName?uncap_first}FieldPickers) {\n                  if (subFormData[key]) {\n                      subFormData[key] = getDateByPicker(subFormData[key], ${sub.entityName?uncap_first}FieldPickers[key]);\n                  }\n              }\n          })\n      }\n        </#if>\n      </#list>\n    };\n<#if buttonList?size gt 0>\n  <#list buttonList as btn>\n      <#if btn.buttonStyle=='form'>\n         function handle${btn.buttonCode?cap_first}(){\n            createMessage.info('点击了${btn.buttonName}按钮，对应的业务逻辑需自行实现!');\n         }\n      </#if>\n  </#list>\n</#if>\n</script>\n\n<style lang=\"less\" scoped>\n  /** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-calendar-picker) {\n    width: 100%;\n  }\n\n  .titleArea {\n    display: flex;\n    align-content: center;\n    padding-right: 70px;\n    .title {\n      margin-right: 16px;\n      line-height: 32px;\n    }\n    .right {\n      overflow-x: auto;\n      overflow-y: hidden;\n      flex: 1;\n      white-space: nowrap;\n      .ant-radio-group {\n       font-weight: normal;\n      }\n    }\n  }\n\n  html[data-theme='light'] {\n      .right {\n        .ant-radio-group {\n          :deep(.ant-radio-button-wrapper:not(.ant-radio-button-wrapper-checked)) {\n            color: #555;\n          }\n        }\n      }\n    }\n</style>\n\n<style lang=\"less\">\n// Online表单Tab风格专属样式\n.j-cgform-tab-modal {\n   .contentArea {\n      padding: 20px 1.5% 0;\n    }\n\n     //.ant-modal-header {\n     //  padding-top: 8px;\n     //  padding-bottom: 8px;\n     //  border-bottom: none !important;\n     //}\n\n  .ant-modal .ant-modal-body > .scrollbar,\n  .ant-tabs-nav .ant-tabs-tab {\n    padding-top: 0;\n  }\n\n  .ant-tabs-top-bar {\n    width: calc(100% - 55px);\n    position: relative;\n    left: -14px;\n  }\n\n  .ant-tabs .ant-tabs-top-content > .ant-tabs-tabpane {\n    overflow: hidden auto;\n  }\n}\n</style>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/jeecg/code-template-online/tab/onetomany/java/${bussiPackage}/${entityPackage}/vue3/components/[1-n]Form.vuei",
    "content": "<#include \"/common/utils.ftl\">\n<#list subTables as sub>\n<#if sub.foreignRelationType=='1'>\n#segment#${sub.entityName}Form.vue\n<template>\n    <BasicForm @register=\"registerForm\" name=\"${sub.entityName}Form\" class=\"basic-modal-form\" />\n</template>\n<script lang=\"ts\">\n    import {defineComponent} from 'vue';\n    import {BasicForm, useForm} from '/@/components/Form/index';\n    import {${sub.entityName?uncap_first}FormSchema} from '../${entityName}.data';\n    import {defHttp} from '/@/utils/http/axios';\n    import { VALIDATE_FAILED } from '/@/utils/common/vxeUtils'\n\n    export default defineComponent({\n        name:\"${sub.entityName}Form\",\n        components: {BasicForm},\n        emits:['register'],\n        props:{\n            disabled: {\n                type: Boolean,\n                default: false\n            }\n        },\n        setup(props,{emit}) {\n            const [registerForm, { setProps, resetFields, setFieldsValue, getFieldsValue, validate, scrollToField }] = useForm({\n                <#if tableVo.fieldRowNum == 1>\n                labelWidth: 150,\n                </#if>\n                schemas: ${sub.entityName?uncap_first}FormSchema,\n                showActionButtonGroup: false,\n                baseColProps: {span: ${getFormSpan(tableVo.fieldRowNum?default(1))}}\n            });\n            /**\n            *初始化加载数据\n            */\n            function initFormData(url,id){\n                if(id){\n                     defHttp.get({url,params:{id}},{isTransformResponse:false}).then(res=>{\n                       res.success && setFieldsValue({...res.result[0]});\n                    })\n                }\n                setProps({disabled: props.disabled})\n            }\n           /**\n            *获取表单数据\n            */\n            function getFormData(){\n               let formData = getFieldsValue();\n               Object.keys(formData).map(k=>{\n                   if(formData[k] instanceof Array){\n                       formData[k] = formData[k].join(',')\n                   }\n               });\n               return [formData];\n            }\n            /**\n            *表单校验\n            */\n            function validateForm(index){\n                return new Promise((resolve, reject) => {\n                    // 验证子表表单\n                    validate().then(()=>{\n                        return resolve()\n                    }).catch(({ errorFields }) => {\n                      return reject({ error: VALIDATE_FAILED , index, errorFields: errorFields, scrollToField: scrollToField });\n                    });\n                })\n            }\n            return {\n                registerForm,\n                resetFields,\n                initFormData,\n                getFormData,\n                validateForm\n            }\n        }\n    })\n</script>\n<style lang=\"less\" scoped>\n  .basic-modal-form {\n    overflow: auto;\n    height: 340px;\n  }\n</style>\n</#if>\n</#list>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/static/demo1.html",
    "content": "demo1"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/static/generic/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/static/generic/build/pdf.js",
    "content": "/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */\n/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/*jshint globalstrict: false */\n/* globals PDFJS */\n\n// Initializing PDFJS global object (if still undefined)\nif (typeof PDFJS === 'undefined') {\n  (typeof window !== 'undefined' ? window : this).PDFJS = {};\n}\n\nPDFJS.version = '1.1.159';\nPDFJS.build = '82536f8';\n\n(function pdfjsWrapper() {\n  // Use strict in our context only - users might not want it\n  'use strict';\n\n/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */\n/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals Cmd, ColorSpace, Dict, MozBlobBuilder, Name, PDFJS, Ref, URL,\n           Promise */\n\n'use strict';\n\nvar globalScope = (typeof window === 'undefined') ? this : window;\n\nvar isWorker = (typeof window === 'undefined');\n\nvar FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];\n\nvar TextRenderingMode = {\n  FILL: 0,\n  STROKE: 1,\n  FILL_STROKE: 2,\n  INVISIBLE: 3,\n  FILL_ADD_TO_PATH: 4,\n  STROKE_ADD_TO_PATH: 5,\n  FILL_STROKE_ADD_TO_PATH: 6,\n  ADD_TO_PATH: 7,\n  FILL_STROKE_MASK: 3,\n  ADD_TO_PATH_FLAG: 4\n};\n\nvar ImageKind = {\n  GRAYSCALE_1BPP: 1,\n  RGB_24BPP: 2,\n  RGBA_32BPP: 3\n};\n\nvar AnnotationType = {\n  WIDGET: 1,\n  TEXT: 2,\n  LINK: 3\n};\n\nvar StreamType = {\n  UNKNOWN: 0,\n  FLATE: 1,\n  LZW: 2,\n  DCT: 3,\n  JPX: 4,\n  JBIG: 5,\n  A85: 6,\n  AHX: 7,\n  CCF: 8,\n  RL: 9\n};\n\nvar FontType = {\n  UNKNOWN: 0,\n  TYPE1: 1,\n  TYPE1C: 2,\n  CIDFONTTYPE0: 3,\n  CIDFONTTYPE0C: 4,\n  TRUETYPE: 5,\n  CIDFONTTYPE2: 6,\n  TYPE3: 7,\n  OPENTYPE: 8,\n  TYPE0: 9,\n  MMTYPE1: 10\n};\n\n// The global PDFJS object exposes the API\n// In production, it will be declared outside a global wrapper\n// In development, it will be declared here\nif (!globalScope.PDFJS) {\n  globalScope.PDFJS = {};\n}\n\nglobalScope.PDFJS.pdfBug = false;\n\nPDFJS.VERBOSITY_LEVELS = {\n  errors: 0,\n  warnings: 1,\n  infos: 5\n};\n\n// All the possible operations for an operator list.\nvar OPS = PDFJS.OPS = {\n  // Intentionally start from 1 so it is easy to spot bad operators that will be\n  // 0's.\n  dependency: 1,\n  setLineWidth: 2,\n  setLineCap: 3,\n  setLineJoin: 4,\n  setMiterLimit: 5,\n  setDash: 6,\n  setRenderingIntent: 7,\n  setFlatness: 8,\n  setGState: 9,\n  save: 10,\n  restore: 11,\n  transform: 12,\n  moveTo: 13,\n  lineTo: 14,\n  curveTo: 15,\n  curveTo2: 16,\n  curveTo3: 17,\n  closePath: 18,\n  rectangle: 19,\n  stroke: 20,\n  closeStroke: 21,\n  fill: 22,\n  eoFill: 23,\n  fillStroke: 24,\n  eoFillStroke: 25,\n  closeFillStroke: 26,\n  closeEOFillStroke: 27,\n  endPath: 28,\n  clip: 29,\n  eoClip: 30,\n  beginText: 31,\n  endText: 32,\n  setCharSpacing: 33,\n  setWordSpacing: 34,\n  setHScale: 35,\n  setLeading: 36,\n  setFont: 37,\n  setTextRenderingMode: 38,\n  setTextRise: 39,\n  moveText: 40,\n  setLeadingMoveText: 41,\n  setTextMatrix: 42,\n  nextLine: 43,\n  showText: 44,\n  showSpacedText: 45,\n  nextLineShowText: 46,\n  nextLineSetSpacingShowText: 47,\n  setCharWidth: 48,\n  setCharWidthAndBounds: 49,\n  setStrokeColorSpace: 50,\n  setFillColorSpace: 51,\n  setStrokeColor: 52,\n  setStrokeColorN: 53,\n  setFillColor: 54,\n  setFillColorN: 55,\n  setStrokeGray: 56,\n  setFillGray: 57,\n  setStrokeRGBColor: 58,\n  setFillRGBColor: 59,\n  setStrokeCMYKColor: 60,\n  setFillCMYKColor: 61,\n  shadingFill: 62,\n  beginInlineImage: 63,\n  beginImageData: 64,\n  endInlineImage: 65,\n  paintXObject: 66,\n  markPoint: 67,\n  markPointProps: 68,\n  beginMarkedContent: 69,\n  beginMarkedContentProps: 70,\n  endMarkedContent: 71,\n  beginCompat: 72,\n  endCompat: 73,\n  paintFormXObjectBegin: 74,\n  paintFormXObjectEnd: 75,\n  beginGroup: 76,\n  endGroup: 77,\n  beginAnnotations: 78,\n  endAnnotations: 79,\n  beginAnnotation: 80,\n  endAnnotation: 81,\n  paintJpegXObject: 82,\n  paintImageMaskXObject: 83,\n  paintImageMaskXObjectGroup: 84,\n  paintImageXObject: 85,\n  paintInlineImageXObject: 86,\n  paintInlineImageXObjectGroup: 87,\n  paintImageXObjectRepeat: 88,\n  paintImageMaskXObjectRepeat: 89,\n  paintSolidColorImageMask: 90,\n  constructPath: 91\n};\n\n// A notice for devs. These are good for things that are helpful to devs, such\n// as warning that Workers were disabled, which is important to devs but not\n// end users.\nfunction info(msg) {\n  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.infos) {\n    console.log('Info: ' + msg);\n  }\n}\n\n// Non-fatal warnings.\nfunction warn(msg) {\n  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.warnings) {\n    console.log('Warning: ' + msg);\n  }\n}\n\n// Fatal errors that should trigger the fallback UI and halt execution by\n// throwing an exception.\nfunction error(msg) {\n  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.errors) {\n    console.log('Error: ' + msg);\n    console.log(backtrace());\n  }\n  UnsupportedManager.notify(UNSUPPORTED_FEATURES.unknown);\n  throw new Error(msg);\n}\n\nfunction backtrace() {\n  try {\n    throw new Error();\n  } catch (e) {\n    return e.stack ? e.stack.split('\\n').slice(2).join('\\n') : '';\n  }\n}\n\nfunction assert(cond, msg) {\n  if (!cond) {\n    error(msg);\n  }\n}\n\nvar UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = {\n  unknown: 'unknown',\n  forms: 'forms',\n  javaScript: 'javaScript',\n  smask: 'smask',\n  shadingPattern: 'shadingPattern',\n  font: 'font'\n};\n\nvar UnsupportedManager = PDFJS.UnsupportedManager =\n  (function UnsupportedManagerClosure() {\n  var listeners = [];\n  return {\n    listen: function (cb) {\n      listeners.push(cb);\n    },\n    notify: function (featureId) {\n      warn('Unsupported feature \"' + featureId + '\"');\n      for (var i = 0, ii = listeners.length; i < ii; i++) {\n        listeners[i](featureId);\n      }\n    }\n  };\n})();\n\n// Combines two URLs. The baseUrl shall be absolute URL. If the url is an\n// absolute URL, it will be returned as is.\nfunction combineUrl(baseUrl, url) {\n  if (!url) {\n    return baseUrl;\n  }\n  if (/^[a-z][a-z0-9+\\-.]*:/i.test(url)) {\n    return url;\n  }\n  var i;\n  if (url.charAt(0) === '/') {\n    // absolute path\n    i = baseUrl.indexOf('://');\n    if (url.charAt(1) === '/') {\n      ++i;\n    } else {\n      i = baseUrl.indexOf('/', i + 3);\n    }\n    return baseUrl.substring(0, i) + url;\n  } else {\n    // relative path\n    var pathLength = baseUrl.length;\n    i = baseUrl.lastIndexOf('#');\n    pathLength = i >= 0 ? i : pathLength;\n    i = baseUrl.lastIndexOf('?', pathLength);\n    pathLength = i >= 0 ? i : pathLength;\n    var prefixLength = baseUrl.lastIndexOf('/', pathLength);\n    return baseUrl.substring(0, prefixLength + 1) + url;\n  }\n}\n\n// Validates if URL is safe and allowed, e.g. to avoid XSS.\nfunction isValidUrl(url, allowRelative) {\n  if (!url) {\n    return false;\n  }\n  // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1)\n  // scheme = ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\n  var protocol = /^[a-z][a-z0-9+\\-.]*(?=:)/i.exec(url);\n  if (!protocol) {\n    return allowRelative;\n  }\n  protocol = protocol[0].toLowerCase();\n  switch (protocol) {\n    case 'http':\n    case 'https':\n    case 'ftp':\n    case 'mailto':\n    case 'tel':\n      return true;\n    default:\n      return false;\n  }\n}\nPDFJS.isValidUrl = isValidUrl;\n\nfunction shadow(obj, prop, value) {\n  Object.defineProperty(obj, prop, { value: value,\n                                     enumerable: true,\n                                     configurable: true,\n                                     writable: false });\n  return value;\n}\nPDFJS.shadow = shadow;\n\nvar PasswordResponses = PDFJS.PasswordResponses = {\n  NEED_PASSWORD: 1,\n  INCORRECT_PASSWORD: 2\n};\n\nvar PasswordException = (function PasswordExceptionClosure() {\n  function PasswordException(msg, code) {\n    this.name = 'PasswordException';\n    this.message = msg;\n    this.code = code;\n  }\n\n  PasswordException.prototype = new Error();\n  PasswordException.constructor = PasswordException;\n\n  return PasswordException;\n})();\nPDFJS.PasswordException = PasswordException;\n\nvar UnknownErrorException = (function UnknownErrorExceptionClosure() {\n  function UnknownErrorException(msg, details) {\n    this.name = 'UnknownErrorException';\n    this.message = msg;\n    this.details = details;\n  }\n\n  UnknownErrorException.prototype = new Error();\n  UnknownErrorException.constructor = UnknownErrorException;\n\n  return UnknownErrorException;\n})();\nPDFJS.UnknownErrorException = UnknownErrorException;\n\nvar InvalidPDFException = (function InvalidPDFExceptionClosure() {\n  function InvalidPDFException(msg) {\n    this.name = 'InvalidPDFException';\n    this.message = msg;\n  }\n\n  InvalidPDFException.prototype = new Error();\n  InvalidPDFException.constructor = InvalidPDFException;\n\n  return InvalidPDFException;\n})();\nPDFJS.InvalidPDFException = InvalidPDFException;\n\nvar MissingPDFException = (function MissingPDFExceptionClosure() {\n  function MissingPDFException(msg) {\n    this.name = 'MissingPDFException';\n    this.message = msg;\n  }\n\n  MissingPDFException.prototype = new Error();\n  MissingPDFException.constructor = MissingPDFException;\n\n  return MissingPDFException;\n})();\nPDFJS.MissingPDFException = MissingPDFException;\n\nvar UnexpectedResponseException =\n    (function UnexpectedResponseExceptionClosure() {\n  function UnexpectedResponseException(msg, status) {\n    this.name = 'UnexpectedResponseException';\n    this.message = msg;\n    this.status = status;\n  }\n\n  UnexpectedResponseException.prototype = new Error();\n  UnexpectedResponseException.constructor = UnexpectedResponseException;\n\n  return UnexpectedResponseException;\n})();\nPDFJS.UnexpectedResponseException = UnexpectedResponseException;\n\nvar NotImplementedException = (function NotImplementedExceptionClosure() {\n  function NotImplementedException(msg) {\n    this.message = msg;\n  }\n\n  NotImplementedException.prototype = new Error();\n  NotImplementedException.prototype.name = 'NotImplementedException';\n  NotImplementedException.constructor = NotImplementedException;\n\n  return NotImplementedException;\n})();\n\nvar MissingDataException = (function MissingDataExceptionClosure() {\n  function MissingDataException(begin, end) {\n    this.begin = begin;\n    this.end = end;\n    this.message = 'Missing data [' + begin + ', ' + end + ')';\n  }\n\n  MissingDataException.prototype = new Error();\n  MissingDataException.prototype.name = 'MissingDataException';\n  MissingDataException.constructor = MissingDataException;\n\n  return MissingDataException;\n})();\n\nvar XRefParseException = (function XRefParseExceptionClosure() {\n  function XRefParseException(msg) {\n    this.message = msg;\n  }\n\n  XRefParseException.prototype = new Error();\n  XRefParseException.prototype.name = 'XRefParseException';\n  XRefParseException.constructor = XRefParseException;\n\n  return XRefParseException;\n})();\n\n\nfunction bytesToString(bytes) {\n  assert(bytes !== null && typeof bytes === 'object' &&\n         bytes.length !== undefined, 'Invalid argument for bytesToString');\n  var length = bytes.length;\n  var MAX_ARGUMENT_COUNT = 8192;\n  if (length < MAX_ARGUMENT_COUNT) {\n    return String.fromCharCode.apply(null, bytes);\n  }\n  var strBuf = [];\n  for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) {\n    var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);\n    var chunk = bytes.subarray(i, chunkEnd);\n    strBuf.push(String.fromCharCode.apply(null, chunk));\n  }\n  return strBuf.join('');\n}\n\nfunction stringToBytes(str) {\n  assert(typeof str === 'string', 'Invalid argument for stringToBytes');\n  var length = str.length;\n  var bytes = new Uint8Array(length);\n  for (var i = 0; i < length; ++i) {\n    bytes[i] = str.charCodeAt(i) & 0xFF;\n  }\n  return bytes;\n}\n\nfunction string32(value) {\n  return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,\n                             (value >> 8) & 0xff, value & 0xff);\n}\n\nfunction log2(x) {\n  var n = 1, i = 0;\n  while (x > n) {\n    n <<= 1;\n    i++;\n  }\n  return i;\n}\n\nfunction readInt8(data, start) {\n  return (data[start] << 24) >> 24;\n}\n\nfunction readUint16(data, offset) {\n  return (data[offset] << 8) | data[offset + 1];\n}\n\nfunction readUint32(data, offset) {\n  return ((data[offset] << 24) | (data[offset + 1] << 16) |\n         (data[offset + 2] << 8) | data[offset + 3]) >>> 0;\n}\n\n// Lazy test the endianness of the platform\n// NOTE: This will be 'true' for simulated TypedArrays\nfunction isLittleEndian() {\n  var buffer8 = new Uint8Array(2);\n  buffer8[0] = 1;\n  var buffer16 = new Uint16Array(buffer8.buffer);\n  return (buffer16[0] === 1);\n}\n\nObject.defineProperty(PDFJS, 'isLittleEndian', {\n  configurable: true,\n  get: function PDFJS_isLittleEndian() {\n    return shadow(PDFJS, 'isLittleEndian', isLittleEndian());\n  }\n});\n\n  // Lazy test if the userAgant support CanvasTypedArrays\nfunction hasCanvasTypedArrays() {\n  var canvas = document.createElement('canvas');\n  canvas.width = canvas.height = 1;\n  var ctx = canvas.getContext('2d');\n  var imageData = ctx.createImageData(1, 1);\n  return (typeof imageData.data.buffer !== 'undefined');\n}\n\nObject.defineProperty(PDFJS, 'hasCanvasTypedArrays', {\n  configurable: true,\n  get: function PDFJS_hasCanvasTypedArrays() {\n    return shadow(PDFJS, 'hasCanvasTypedArrays', hasCanvasTypedArrays());\n  }\n});\n\nvar Uint32ArrayView = (function Uint32ArrayViewClosure() {\n\n  function Uint32ArrayView(buffer, length) {\n    this.buffer = buffer;\n    this.byteLength = buffer.length;\n    this.length = length === undefined ? (this.byteLength >> 2) : length;\n    ensureUint32ArrayViewProps(this.length);\n  }\n  Uint32ArrayView.prototype = Object.create(null);\n\n  var uint32ArrayViewSetters = 0;\n  function createUint32ArrayProp(index) {\n    return {\n      get: function () {\n        var buffer = this.buffer, offset = index << 2;\n        return (buffer[offset] | (buffer[offset + 1] << 8) |\n          (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0;\n      },\n      set: function (value) {\n        var buffer = this.buffer, offset = index << 2;\n        buffer[offset] = value & 255;\n        buffer[offset + 1] = (value >> 8) & 255;\n        buffer[offset + 2] = (value >> 16) & 255;\n        buffer[offset + 3] = (value >>> 24) & 255;\n      }\n    };\n  }\n\n  function ensureUint32ArrayViewProps(length) {\n    while (uint32ArrayViewSetters < length) {\n      Object.defineProperty(Uint32ArrayView.prototype,\n        uint32ArrayViewSetters,\n        createUint32ArrayProp(uint32ArrayViewSetters));\n      uint32ArrayViewSetters++;\n    }\n  }\n\n  return Uint32ArrayView;\n})();\n\nvar IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];\n\nvar Util = PDFJS.Util = (function UtilClosure() {\n  function Util() {}\n\n  var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];\n\n  // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids\n  // creating many intermediate strings.\n  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {\n    rgbBuf[1] = r;\n    rgbBuf[3] = g;\n    rgbBuf[5] = b;\n    return rgbBuf.join('');\n  };\n\n  // Concatenates two transformation matrices together and returns the result.\n  Util.transform = function Util_transform(m1, m2) {\n    return [\n      m1[0] * m2[0] + m1[2] * m2[1],\n      m1[1] * m2[0] + m1[3] * m2[1],\n      m1[0] * m2[2] + m1[2] * m2[3],\n      m1[1] * m2[2] + m1[3] * m2[3],\n      m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n      m1[1] * m2[4] + m1[3] * m2[5] + m1[5]\n    ];\n  };\n\n  // For 2d affine transforms\n  Util.applyTransform = function Util_applyTransform(p, m) {\n    var xt = p[0] * m[0] + p[1] * m[2] + m[4];\n    var yt = p[0] * m[1] + p[1] * m[3] + m[5];\n    return [xt, yt];\n  };\n\n  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {\n    var d = m[0] * m[3] - m[1] * m[2];\n    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n    return [xt, yt];\n  };\n\n  // Applies the transform to the rectangle and finds the minimum axially\n  // aligned bounding box.\n  Util.getAxialAlignedBoundingBox =\n    function Util_getAxialAlignedBoundingBox(r, m) {\n\n    var p1 = Util.applyTransform(r, m);\n    var p2 = Util.applyTransform(r.slice(2, 4), m);\n    var p3 = Util.applyTransform([r[0], r[3]], m);\n    var p4 = Util.applyTransform([r[2], r[1]], m);\n    return [\n      Math.min(p1[0], p2[0], p3[0], p4[0]),\n      Math.min(p1[1], p2[1], p3[1], p4[1]),\n      Math.max(p1[0], p2[0], p3[0], p4[0]),\n      Math.max(p1[1], p2[1], p3[1], p4[1])\n    ];\n  };\n\n  Util.inverseTransform = function Util_inverseTransform(m) {\n    var d = m[0] * m[3] - m[1] * m[2];\n    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d,\n      (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];\n  };\n\n  // Apply a generic 3d matrix M on a 3-vector v:\n  //   | a b c |   | X |\n  //   | d e f | x | Y |\n  //   | g h i |   | Z |\n  // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],\n  // with v as [X,Y,Z]\n  Util.apply3dTransform = function Util_apply3dTransform(m, v) {\n    return [\n      m[0] * v[0] + m[1] * v[1] + m[2] * v[2],\n      m[3] * v[0] + m[4] * v[1] + m[5] * v[2],\n      m[6] * v[0] + m[7] * v[1] + m[8] * v[2]\n    ];\n  };\n\n  // This calculation uses Singular Value Decomposition.\n  // The SVD can be represented with formula A = USV. We are interested in the\n  // matrix S here because it represents the scale values.\n  Util.singularValueDecompose2dScale =\n    function Util_singularValueDecompose2dScale(m) {\n\n    var transpose = [m[0], m[2], m[1], m[3]];\n\n    // Multiply matrix m with its transpose.\n    var a = m[0] * transpose[0] + m[1] * transpose[2];\n    var b = m[0] * transpose[1] + m[1] * transpose[3];\n    var c = m[2] * transpose[0] + m[3] * transpose[2];\n    var d = m[2] * transpose[1] + m[3] * transpose[3];\n\n    // Solve the second degree polynomial to get roots.\n    var first = (a + d) / 2;\n    var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;\n    var sx = first + second || 1;\n    var sy = first - second || 1;\n\n    // Scale values are the square roots of the eigenvalues.\n    return [Math.sqrt(sx), Math.sqrt(sy)];\n  };\n\n  // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)\n  // For coordinate systems whose origin lies in the bottom-left, this\n  // means normalization to (BL,TR) ordering. For systems with origin in the\n  // top-left, this means (TL,BR) ordering.\n  Util.normalizeRect = function Util_normalizeRect(rect) {\n    var r = rect.slice(0); // clone rect\n    if (rect[0] > rect[2]) {\n      r[0] = rect[2];\n      r[2] = rect[0];\n    }\n    if (rect[1] > rect[3]) {\n      r[1] = rect[3];\n      r[3] = rect[1];\n    }\n    return r;\n  };\n\n  // Returns a rectangle [x1, y1, x2, y2] corresponding to the\n  // intersection of rect1 and rect2. If no intersection, returns 'false'\n  // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]\n  Util.intersect = function Util_intersect(rect1, rect2) {\n    function compare(a, b) {\n      return a - b;\n    }\n\n    // Order points along the axes\n    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),\n        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),\n        result = [];\n\n    rect1 = Util.normalizeRect(rect1);\n    rect2 = Util.normalizeRect(rect2);\n\n    // X: first and second points belong to different rectangles?\n    if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||\n        (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {\n      // Intersection must be between second and third points\n      result[0] = orderedX[1];\n      result[2] = orderedX[2];\n    } else {\n      return false;\n    }\n\n    // Y: first and second points belong to different rectangles?\n    if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||\n        (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {\n      // Intersection must be between second and third points\n      result[1] = orderedY[1];\n      result[3] = orderedY[2];\n    } else {\n      return false;\n    }\n\n    return result;\n  };\n\n  Util.sign = function Util_sign(num) {\n    return num < 0 ? -1 : 1;\n  };\n\n  Util.appendToArray = function Util_appendToArray(arr1, arr2) {\n    Array.prototype.push.apply(arr1, arr2);\n  };\n\n  Util.prependToArray = function Util_prependToArray(arr1, arr2) {\n    Array.prototype.unshift.apply(arr1, arr2);\n  };\n\n  Util.extendObj = function extendObj(obj1, obj2) {\n    for (var key in obj2) {\n      obj1[key] = obj2[key];\n    }\n  };\n\n  Util.getInheritableProperty = function Util_getInheritableProperty(dict,\n                                                                     name) {\n    while (dict && !dict.has(name)) {\n      dict = dict.get('Parent');\n    }\n    if (!dict) {\n      return null;\n    }\n    return dict.get(name);\n  };\n\n  Util.inherit = function Util_inherit(sub, base, prototype) {\n    sub.prototype = Object.create(base.prototype);\n    sub.prototype.constructor = sub;\n    for (var prop in prototype) {\n      sub.prototype[prop] = prototype[prop];\n    }\n  };\n\n  Util.loadScript = function Util_loadScript(src, callback) {\n    var script = document.createElement('script');\n    var loaded = false;\n    script.setAttribute('src', src);\n    if (callback) {\n      script.onload = function() {\n        if (!loaded) {\n          callback();\n        }\n        loaded = true;\n      };\n    }\n    document.getElementsByTagName('head')[0].appendChild(script);\n  };\n\n  return Util;\n})();\n\n/**\n * PDF page viewport created based on scale, rotation and offset.\n * @class\n * @alias PDFJS.PageViewport\n */\nvar PageViewport = PDFJS.PageViewport = (function PageViewportClosure() {\n  /**\n   * @constructor\n   * @private\n   * @param viewBox {Array} xMin, yMin, xMax and yMax coordinates.\n   * @param scale {number} scale of the viewport.\n   * @param rotation {number} rotations of the viewport in degrees.\n   * @param offsetX {number} offset X\n   * @param offsetY {number} offset Y\n   * @param dontFlip {boolean} if true, axis Y will not be flipped.\n   */\n  function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) {\n    this.viewBox = viewBox;\n    this.scale = scale;\n    this.rotation = rotation;\n    this.offsetX = offsetX;\n    this.offsetY = offsetY;\n\n    // creating transform to convert pdf coordinate system to the normal\n    // canvas like coordinates taking in account scale and rotation\n    var centerX = (viewBox[2] + viewBox[0]) / 2;\n    var centerY = (viewBox[3] + viewBox[1]) / 2;\n    var rotateA, rotateB, rotateC, rotateD;\n    rotation = rotation % 360;\n    rotation = rotation < 0 ? rotation + 360 : rotation;\n    switch (rotation) {\n      case 180:\n        rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1;\n        break;\n      case 90:\n        rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0;\n        break;\n      case 270:\n        rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0;\n        break;\n      //case 0:\n      default:\n        rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1;\n        break;\n    }\n\n    if (dontFlip) {\n      rotateC = -rotateC; rotateD = -rotateD;\n    }\n\n    var offsetCanvasX, offsetCanvasY;\n    var width, height;\n    if (rotateA === 0) {\n      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;\n      width = Math.abs(viewBox[3] - viewBox[1]) * scale;\n      height = Math.abs(viewBox[2] - viewBox[0]) * scale;\n    } else {\n      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;\n      width = Math.abs(viewBox[2] - viewBox[0]) * scale;\n      height = Math.abs(viewBox[3] - viewBox[1]) * scale;\n    }\n    // creating transform for the following operations:\n    // translate(-centerX, -centerY), rotate and flip vertically,\n    // scale, and translate(offsetCanvasX, offsetCanvasY)\n    this.transform = [\n      rotateA * scale,\n      rotateB * scale,\n      rotateC * scale,\n      rotateD * scale,\n      offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,\n      offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY\n    ];\n\n    this.width = width;\n    this.height = height;\n    this.fontScale = scale;\n  }\n  PageViewport.prototype = /** @lends PDFJS.PageViewport.prototype */ {\n    /**\n     * Clones viewport with additional properties.\n     * @param args {Object} (optional) If specified, may contain the 'scale' or\n     * 'rotation' properties to override the corresponding properties in\n     * the cloned viewport.\n     * @returns {PDFJS.PageViewport} Cloned viewport.\n     */\n    clone: function PageViewPort_clone(args) {\n      args = args || {};\n      var scale = 'scale' in args ? args.scale : this.scale;\n      var rotation = 'rotation' in args ? args.rotation : this.rotation;\n      return new PageViewport(this.viewBox.slice(), scale, rotation,\n                              this.offsetX, this.offsetY, args.dontFlip);\n    },\n    /**\n     * Converts PDF point to the viewport coordinates. For examples, useful for\n     * converting PDF location into canvas pixel coordinates.\n     * @param x {number} X coordinate.\n     * @param y {number} Y coordinate.\n     * @returns {Object} Object that contains 'x' and 'y' properties of the\n     * point in the viewport coordinate space.\n     * @see {@link convertToPdfPoint}\n     * @see {@link convertToViewportRectangle}\n     */\n    convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {\n      return Util.applyTransform([x, y], this.transform);\n    },\n    /**\n     * Converts PDF rectangle to the viewport coordinates.\n     * @param rect {Array} xMin, yMin, xMax and yMax coordinates.\n     * @returns {Array} Contains corresponding coordinates of the rectangle\n     * in the viewport coordinate space.\n     * @see {@link convertToViewportPoint}\n     */\n    convertToViewportRectangle:\n      function PageViewport_convertToViewportRectangle(rect) {\n      var tl = Util.applyTransform([rect[0], rect[1]], this.transform);\n      var br = Util.applyTransform([rect[2], rect[3]], this.transform);\n      return [tl[0], tl[1], br[0], br[1]];\n    },\n    /**\n     * Converts viewport coordinates to the PDF location. For examples, useful\n     * for converting canvas pixel location into PDF one.\n     * @param x {number} X coordinate.\n     * @param y {number} Y coordinate.\n     * @returns {Object} Object that contains 'x' and 'y' properties of the\n     * point in the PDF coordinate space.\n     * @see {@link convertToViewportPoint}\n     */\n    convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {\n      return Util.applyInverseTransform([x, y], this.transform);\n    }\n  };\n  return PageViewport;\n})();\n\nvar PDFStringTranslateTable = [\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,\n  0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,\n  0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,\n  0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC\n];\n\nfunction stringToPDFString(str) {\n  var i, n = str.length, strBuf = [];\n  if (str[0] === '\\xFE' && str[1] === '\\xFF') {\n    // UTF16BE BOM\n    for (i = 2; i < n; i += 2) {\n      strBuf.push(String.fromCharCode(\n        (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1)));\n    }\n  } else {\n    for (i = 0; i < n; ++i) {\n      var code = PDFStringTranslateTable[str.charCodeAt(i)];\n      strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));\n    }\n  }\n  return strBuf.join('');\n}\n\nfunction stringToUTF8String(str) {\n  return decodeURIComponent(escape(str));\n}\n\nfunction utf8StringToString(str) {\n  return unescape(encodeURIComponent(str));\n}\n\nfunction isEmptyObj(obj) {\n  for (var key in obj) {\n    return false;\n  }\n  return true;\n}\n\nfunction isBool(v) {\n  return typeof v === 'boolean';\n}\n\nfunction isInt(v) {\n  return typeof v === 'number' && ((v | 0) === v);\n}\n\nfunction isNum(v) {\n  return typeof v === 'number';\n}\n\nfunction isString(v) {\n  return typeof v === 'string';\n}\n\nfunction isName(v) {\n  return v instanceof Name;\n}\n\nfunction isCmd(v, cmd) {\n  return v instanceof Cmd && (cmd === undefined || v.cmd === cmd);\n}\n\nfunction isDict(v, type) {\n  if (!(v instanceof Dict)) {\n    return false;\n  }\n  if (!type) {\n    return true;\n  }\n  var dictType = v.get('Type');\n  return isName(dictType) && dictType.name === type;\n}\n\nfunction isArray(v) {\n  return v instanceof Array;\n}\n\nfunction isStream(v) {\n  return typeof v === 'object' && v !== null && v.getBytes !== undefined;\n}\n\nfunction isArrayBuffer(v) {\n  return typeof v === 'object' && v !== null && v.byteLength !== undefined;\n}\n\nfunction isRef(v) {\n  return v instanceof Ref;\n}\n\n/**\n * Promise Capability object.\n *\n * @typedef {Object} PromiseCapability\n * @property {Promise} promise - A promise object.\n * @property {function} resolve - Fullfills the promise.\n * @property {function} reject - Rejects the promise.\n */\n\n/**\n * Creates a promise capability object.\n * @alias PDFJS.createPromiseCapability\n *\n * @return {PromiseCapability} A capability object contains:\n * - a Promise, resolve and reject methods.\n */\nfunction createPromiseCapability() {\n  var capability = {};\n  capability.promise = new Promise(function (resolve, reject) {\n    capability.resolve = resolve;\n    capability.reject = reject;\n  });\n  return capability;\n}\n\nPDFJS.createPromiseCapability = createPromiseCapability;\n\n/**\n * Polyfill for Promises:\n * The following promise implementation tries to generally implement the\n * Promise/A+ spec. Some notable differences from other promise libaries are:\n * - There currently isn't a seperate deferred and promise object.\n * - Unhandled rejections eventually show an error if they aren't handled.\n *\n * Based off of the work in:\n * https://bugzilla.mozilla.org/show_bug.cgi?id=810490\n */\n(function PromiseClosure() {\n  if (globalScope.Promise) {\n    // Promises existing in the DOM/Worker, checking presence of all/resolve\n    if (typeof globalScope.Promise.all !== 'function') {\n      globalScope.Promise.all = function (iterable) {\n        var count = 0, results = [], resolve, reject;\n        var promise = new globalScope.Promise(function (resolve_, reject_) {\n          resolve = resolve_;\n          reject = reject_;\n        });\n        iterable.forEach(function (p, i) {\n          count++;\n          p.then(function (result) {\n            results[i] = result;\n            count--;\n            if (count === 0) {\n              resolve(results);\n            }\n          }, reject);\n        });\n        if (count === 0) {\n          resolve(results);\n        }\n        return promise;\n      };\n    }\n    if (typeof globalScope.Promise.resolve !== 'function') {\n      globalScope.Promise.resolve = function (value) {\n        return new globalScope.Promise(function (resolve) { resolve(value); });\n      };\n    }\n    if (typeof globalScope.Promise.reject !== 'function') {\n      globalScope.Promise.reject = function (reason) {\n        return new globalScope.Promise(function (resolve, reject) {\n          reject(reason);\n        });\n      };\n    }\n    if (typeof globalScope.Promise.prototype.catch !== 'function') {\n      globalScope.Promise.prototype.catch = function (onReject) {\n        return globalScope.Promise.prototype.then(undefined, onReject);\n      };\n    }\n    return;\n  }\n  var STATUS_PENDING = 0;\n  var STATUS_RESOLVED = 1;\n  var STATUS_REJECTED = 2;\n\n  // In an attempt to avoid silent exceptions, unhandled rejections are\n  // tracked and if they aren't handled in a certain amount of time an\n  // error is logged.\n  var REJECTION_TIMEOUT = 500;\n\n  var HandlerManager = {\n    handlers: [],\n    running: false,\n    unhandledRejections: [],\n    pendingRejectionCheck: false,\n\n    scheduleHandlers: function scheduleHandlers(promise) {\n      if (promise._status === STATUS_PENDING) {\n        return;\n      }\n\n      this.handlers = this.handlers.concat(promise._handlers);\n      promise._handlers = [];\n\n      if (this.running) {\n        return;\n      }\n      this.running = true;\n\n      setTimeout(this.runHandlers.bind(this), 0);\n    },\n\n    runHandlers: function runHandlers() {\n      var RUN_TIMEOUT = 1; // ms\n      var timeoutAt = Date.now() + RUN_TIMEOUT;\n      while (this.handlers.length > 0) {\n        var handler = this.handlers.shift();\n\n        var nextStatus = handler.thisPromise._status;\n        var nextValue = handler.thisPromise._value;\n\n        try {\n          if (nextStatus === STATUS_RESOLVED) {\n            if (typeof handler.onResolve === 'function') {\n              nextValue = handler.onResolve(nextValue);\n            }\n          } else if (typeof handler.onReject === 'function') {\n              nextValue = handler.onReject(nextValue);\n              nextStatus = STATUS_RESOLVED;\n\n              if (handler.thisPromise._unhandledRejection) {\n                this.removeUnhandeledRejection(handler.thisPromise);\n              }\n          }\n        } catch (ex) {\n          nextStatus = STATUS_REJECTED;\n          nextValue = ex;\n        }\n\n        handler.nextPromise._updateStatus(nextStatus, nextValue);\n        if (Date.now() >= timeoutAt) {\n          break;\n        }\n      }\n\n      if (this.handlers.length > 0) {\n        setTimeout(this.runHandlers.bind(this), 0);\n        return;\n      }\n\n      this.running = false;\n    },\n\n    addUnhandledRejection: function addUnhandledRejection(promise) {\n      this.unhandledRejections.push({\n        promise: promise,\n        time: Date.now()\n      });\n      this.scheduleRejectionCheck();\n    },\n\n    removeUnhandeledRejection: function removeUnhandeledRejection(promise) {\n      promise._unhandledRejection = false;\n      for (var i = 0; i < this.unhandledRejections.length; i++) {\n        if (this.unhandledRejections[i].promise === promise) {\n          this.unhandledRejections.splice(i);\n          i--;\n        }\n      }\n    },\n\n    scheduleRejectionCheck: function scheduleRejectionCheck() {\n      if (this.pendingRejectionCheck) {\n        return;\n      }\n      this.pendingRejectionCheck = true;\n      setTimeout(function rejectionCheck() {\n        this.pendingRejectionCheck = false;\n        var now = Date.now();\n        for (var i = 0; i < this.unhandledRejections.length; i++) {\n          if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) {\n            var unhandled = this.unhandledRejections[i].promise._value;\n            var msg = 'Unhandled rejection: ' + unhandled;\n            if (unhandled.stack) {\n              msg += '\\n' + unhandled.stack;\n            }\n            warn(msg);\n            this.unhandledRejections.splice(i);\n            i--;\n          }\n        }\n        if (this.unhandledRejections.length) {\n          this.scheduleRejectionCheck();\n        }\n      }.bind(this), REJECTION_TIMEOUT);\n    }\n  };\n\n  function Promise(resolver) {\n    this._status = STATUS_PENDING;\n    this._handlers = [];\n    try {\n      resolver.call(this, this._resolve.bind(this), this._reject.bind(this));\n    } catch (e) {\n      this._reject(e);\n    }\n  }\n  /**\n   * Builds a promise that is resolved when all the passed in promises are\n   * resolved.\n   * @param {array} array of data and/or promises to wait for.\n   * @return {Promise} New dependant promise.\n   */\n  Promise.all = function Promise_all(promises) {\n    var resolveAll, rejectAll;\n    var deferred = new Promise(function (resolve, reject) {\n      resolveAll = resolve;\n      rejectAll = reject;\n    });\n    var unresolved = promises.length;\n    var results = [];\n    if (unresolved === 0) {\n      resolveAll(results);\n      return deferred;\n    }\n    function reject(reason) {\n      if (deferred._status === STATUS_REJECTED) {\n        return;\n      }\n      results = [];\n      rejectAll(reason);\n    }\n    for (var i = 0, ii = promises.length; i < ii; ++i) {\n      var promise = promises[i];\n      var resolve = (function(i) {\n        return function(value) {\n          if (deferred._status === STATUS_REJECTED) {\n            return;\n          }\n          results[i] = value;\n          unresolved--;\n          if (unresolved === 0) {\n            resolveAll(results);\n          }\n        };\n      })(i);\n      if (Promise.isPromise(promise)) {\n        promise.then(resolve, reject);\n      } else {\n        resolve(promise);\n      }\n    }\n    return deferred;\n  };\n\n  /**\n   * Checks if the value is likely a promise (has a 'then' function).\n   * @return {boolean} true if value is thenable\n   */\n  Promise.isPromise = function Promise_isPromise(value) {\n    return value && typeof value.then === 'function';\n  };\n\n  /**\n   * Creates resolved promise\n   * @param value resolve value\n   * @returns {Promise}\n   */\n  Promise.resolve = function Promise_resolve(value) {\n    return new Promise(function (resolve) { resolve(value); });\n  };\n\n  /**\n   * Creates rejected promise\n   * @param reason rejection value\n   * @returns {Promise}\n   */\n  Promise.reject = function Promise_reject(reason) {\n    return new Promise(function (resolve, reject) { reject(reason); });\n  };\n\n  Promise.prototype = {\n    _status: null,\n    _value: null,\n    _handlers: null,\n    _unhandledRejection: null,\n\n    _updateStatus: function Promise__updateStatus(status, value) {\n      if (this._status === STATUS_RESOLVED ||\n          this._status === STATUS_REJECTED) {\n        return;\n      }\n\n      if (status === STATUS_RESOLVED &&\n          Promise.isPromise(value)) {\n        value.then(this._updateStatus.bind(this, STATUS_RESOLVED),\n                   this._updateStatus.bind(this, STATUS_REJECTED));\n        return;\n      }\n\n      this._status = status;\n      this._value = value;\n\n      if (status === STATUS_REJECTED && this._handlers.length === 0) {\n        this._unhandledRejection = true;\n        HandlerManager.addUnhandledRejection(this);\n      }\n\n      HandlerManager.scheduleHandlers(this);\n    },\n\n    _resolve: function Promise_resolve(value) {\n      this._updateStatus(STATUS_RESOLVED, value);\n    },\n\n    _reject: function Promise_reject(reason) {\n      this._updateStatus(STATUS_REJECTED, reason);\n    },\n\n    then: function Promise_then(onResolve, onReject) {\n      var nextPromise = new Promise(function (resolve, reject) {\n        this.resolve = resolve;\n        this.reject = reject;\n      });\n      this._handlers.push({\n        thisPromise: this,\n        onResolve: onResolve,\n        onReject: onReject,\n        nextPromise: nextPromise\n      });\n      HandlerManager.scheduleHandlers(this);\n      return nextPromise;\n    },\n\n    catch: function Promise_catch(onReject) {\n      return this.then(undefined, onReject);\n    }\n  };\n\n  globalScope.Promise = Promise;\n})();\n\nvar StatTimer = (function StatTimerClosure() {\n  function rpad(str, pad, length) {\n    while (str.length < length) {\n      str += pad;\n    }\n    return str;\n  }\n  function StatTimer() {\n    this.started = {};\n    this.times = [];\n    this.enabled = true;\n  }\n  StatTimer.prototype = {\n    time: function StatTimer_time(name) {\n      if (!this.enabled) {\n        return;\n      }\n      if (name in this.started) {\n        warn('Timer is already running for ' + name);\n      }\n      this.started[name] = Date.now();\n    },\n    timeEnd: function StatTimer_timeEnd(name) {\n      if (!this.enabled) {\n        return;\n      }\n      if (!(name in this.started)) {\n        warn('Timer has not been started for ' + name);\n      }\n      this.times.push({\n        'name': name,\n        'start': this.started[name],\n        'end': Date.now()\n      });\n      // Remove timer from started so it can be called again.\n      delete this.started[name];\n    },\n    toString: function StatTimer_toString() {\n      var i, ii;\n      var times = this.times;\n      var out = '';\n      // Find the longest name for padding purposes.\n      var longest = 0;\n      for (i = 0, ii = times.length; i < ii; ++i) {\n        var name = times[i]['name'];\n        if (name.length > longest) {\n          longest = name.length;\n        }\n      }\n      for (i = 0, ii = times.length; i < ii; ++i) {\n        var span = times[i];\n        var duration = span.end - span.start;\n        out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\\n';\n      }\n      return out;\n    }\n  };\n  return StatTimer;\n})();\n\nPDFJS.createBlob = function createBlob(data, contentType) {\n  if (typeof Blob !== 'undefined') {\n    return new Blob([data], { type: contentType });\n  }\n  // Blob builder is deprecated in FF14 and removed in FF18.\n  var bb = new MozBlobBuilder();\n  bb.append(data);\n  return bb.getBlob(contentType);\n};\n\nPDFJS.createObjectURL = (function createObjectURLClosure() {\n  // Blob/createObjectURL is not available, falling back to data schema.\n  var digits =\n    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\n  return function createObjectURL(data, contentType) {\n    if (!PDFJS.disableCreateObjectURL &&\n        typeof URL !== 'undefined' && URL.createObjectURL) {\n      var blob = PDFJS.createBlob(data, contentType);\n      return URL.createObjectURL(blob);\n    }\n\n    var buffer = 'data:' + contentType + ';base64,';\n    for (var i = 0, ii = data.length; i < ii; i += 3) {\n      var b1 = data[i] & 0xFF;\n      var b2 = data[i + 1] & 0xFF;\n      var b3 = data[i + 2] & 0xFF;\n      var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);\n      var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;\n      var d4 = i + 2 < ii ? (b3 & 0x3F) : 64;\n      buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];\n    }\n    return buffer;\n  };\n})();\n\nfunction MessageHandler(name, comObj) {\n  this.name = name;\n  this.comObj = comObj;\n  this.callbackIndex = 1;\n  this.postMessageTransfers = true;\n  var callbacksCapabilities = this.callbacksCapabilities = {};\n  var ah = this.actionHandler = {};\n\n  ah['console_log'] = [function ahConsoleLog(data) {\n    console.log.apply(console, data);\n  }];\n  ah['console_error'] = [function ahConsoleError(data) {\n    console.error.apply(console, data);\n  }];\n  ah['_unsupported_feature'] = [function ah_unsupportedFeature(data) {\n    UnsupportedManager.notify(data);\n  }];\n\n  comObj.onmessage = function messageHandlerComObjOnMessage(event) {\n    var data = event.data;\n    if (data.isReply) {\n      var callbackId = data.callbackId;\n      if (data.callbackId in callbacksCapabilities) {\n        var callback = callbacksCapabilities[callbackId];\n        delete callbacksCapabilities[callbackId];\n        if ('error' in data) {\n          callback.reject(data.error);\n        } else {\n          callback.resolve(data.data);\n        }\n      } else {\n        error('Cannot resolve callback ' + callbackId);\n      }\n    } else if (data.action in ah) {\n      var action = ah[data.action];\n      if (data.callbackId) {\n        Promise.resolve().then(function () {\n          return action[0].call(action[1], data.data);\n        }).then(function (result) {\n          comObj.postMessage({\n            isReply: true,\n            callbackId: data.callbackId,\n            data: result\n          });\n        }, function (reason) {\n          comObj.postMessage({\n            isReply: true,\n            callbackId: data.callbackId,\n            error: reason\n          });\n        });\n      } else {\n        action[0].call(action[1], data.data);\n      }\n    } else {\n      error('Unknown action from worker: ' + data.action);\n    }\n  };\n}\n\nMessageHandler.prototype = {\n  on: function messageHandlerOn(actionName, handler, scope) {\n    var ah = this.actionHandler;\n    if (ah[actionName]) {\n      error('There is already an actionName called \"' + actionName + '\"');\n    }\n    ah[actionName] = [handler, scope];\n  },\n  /**\n   * Sends a message to the comObj to invoke the action with the supplied data.\n   * @param {String} actionName Action to call.\n   * @param {JSON} data JSON data to send.\n   * @param {Array} [transfers] Optional list of transfers/ArrayBuffers\n   */\n  send: function messageHandlerSend(actionName, data, transfers) {\n    var message = {\n      action: actionName,\n      data: data\n    };\n    this.postMessage(message, transfers);\n  },\n  /**\n   * Sends a message to the comObj to invoke the action with the supplied data.\n   * Expects that other side will callback with the response.\n   * @param {String} actionName Action to call.\n   * @param {JSON} data JSON data to send.\n   * @param {Array} [transfers] Optional list of transfers/ArrayBuffers.\n   * @returns {Promise} Promise to be resolved with response data.\n   */\n  sendWithPromise:\n    function messageHandlerSendWithPromise(actionName, data, transfers) {\n    var callbackId = this.callbackIndex++;\n    var message = {\n      action: actionName,\n      data: data,\n      callbackId: callbackId\n    };\n    var capability = createPromiseCapability();\n    this.callbacksCapabilities[callbackId] = capability;\n    try {\n      this.postMessage(message, transfers);\n    } catch (e) {\n      capability.reject(e);\n    }\n    return capability.promise;\n  },\n  /**\n   * Sends raw message to the comObj.\n   * @private\n   * @param message {Object} Raw message.\n   * @param transfers List of transfers/ArrayBuffers, or undefined.\n   */\n  postMessage: function (message, transfers) {\n    if (transfers && this.postMessageTransfers) {\n      this.comObj.postMessage(message, transfers);\n    } else {\n      this.comObj.postMessage(message);\n    }\n  }\n};\n\nfunction loadJpegStream(id, imageUrl, objs) {\n  var img = new Image();\n  img.onload = (function loadJpegStream_onloadClosure() {\n    objs.resolve(id, img);\n  });\n  img.onerror = (function loadJpegStream_onerrorClosure() {\n    objs.resolve(id, null);\n    warn('Error during JPEG image loading');\n  });\n  img.src = imageUrl;\n}\n\n\n/**\n * The maximum allowed image size in total pixels e.g. width * height. Images\n * above this value will not be drawn. Use -1 for no limit.\n * @var {number}\n */\nPDFJS.maxImageSize = (PDFJS.maxImageSize === undefined ?\n                      -1 : PDFJS.maxImageSize);\n\n/**\n * The url of where the predefined Adobe CMaps are located. Include trailing\n * slash.\n * @var {string}\n */\nPDFJS.cMapUrl = (PDFJS.cMapUrl === undefined ? null : PDFJS.cMapUrl);\n\n/**\n * Specifies if CMaps are binary packed.\n * @var {boolean}\n */\nPDFJS.cMapPacked = PDFJS.cMapPacked === undefined ? false : PDFJS.cMapPacked;\n\n/**\n * By default fonts are converted to OpenType fonts and loaded via font face\n * rules. If disabled, the font will be rendered using a built in font renderer\n * that constructs the glyphs with primitive path commands.\n * @var {boolean}\n */\nPDFJS.disableFontFace = (PDFJS.disableFontFace === undefined ?\n                         false : PDFJS.disableFontFace);\n\n/**\n * Path for image resources, mainly for annotation icons. Include trailing\n * slash.\n * @var {string}\n */\nPDFJS.imageResourcesPath = (PDFJS.imageResourcesPath === undefined ?\n                            '' : PDFJS.imageResourcesPath);\n\n/**\n * Disable the web worker and run all code on the main thread. This will happen\n * automatically if the browser doesn't support workers or sending typed arrays\n * to workers.\n * @var {boolean}\n */\nPDFJS.disableWorker = (PDFJS.disableWorker === undefined ?\n                       false : PDFJS.disableWorker);\n\n/**\n * Path and filename of the worker file. Required when the worker is enabled in\n * development mode. If unspecified in the production build, the worker will be\n * loaded based on the location of the pdf.js file.\n * @var {string}\n */\nPDFJS.workerSrc = (PDFJS.workerSrc === undefined ? null : PDFJS.workerSrc);\n\n/**\n * Disable range request loading of PDF files. When enabled and if the server\n * supports partial content requests then the PDF will be fetched in chunks.\n * Enabled (false) by default.\n * @var {boolean}\n */\nPDFJS.disableRange = (PDFJS.disableRange === undefined ?\n                      false : PDFJS.disableRange);\n\n/**\n * Disable streaming of PDF file data. By default PDF.js attempts to load PDF\n * in chunks. This default behavior can be disabled.\n * @var {boolean}\n */\nPDFJS.disableStream = (PDFJS.disableStream === undefined ?\n                       false : PDFJS.disableStream);\n\n/**\n * Disable pre-fetching of PDF file data. When range requests are enabled PDF.js\n * will automatically keep fetching more data even if it isn't needed to display\n * the current page. This default behavior can be disabled.\n *\n * NOTE: It is also necessary to disable streaming, see above,\n *       in order for disabling of pre-fetching to work correctly.\n * @var {boolean}\n */\nPDFJS.disableAutoFetch = (PDFJS.disableAutoFetch === undefined ?\n                          false : PDFJS.disableAutoFetch);\n\n/**\n * Enables special hooks for debugging PDF.js.\n * @var {boolean}\n */\nPDFJS.pdfBug = (PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug);\n\n/**\n * Enables transfer usage in postMessage for ArrayBuffers.\n * @var {boolean}\n */\nPDFJS.postMessageTransfers = (PDFJS.postMessageTransfers === undefined ?\n                              true : PDFJS.postMessageTransfers);\n\n/**\n * Disables URL.createObjectURL usage.\n * @var {boolean}\n */\nPDFJS.disableCreateObjectURL = (PDFJS.disableCreateObjectURL === undefined ?\n                                false : PDFJS.disableCreateObjectURL);\n\n/**\n * Disables WebGL usage.\n * @var {boolean}\n */\nPDFJS.disableWebGL = (PDFJS.disableWebGL === undefined ?\n                      true : PDFJS.disableWebGL);\n\n/**\n * Disables fullscreen support, and by extension Presentation Mode,\n * in browsers which support the fullscreen API.\n * @var {boolean}\n */\nPDFJS.disableFullscreen = (PDFJS.disableFullscreen === undefined ?\n                           false : PDFJS.disableFullscreen);\n\n/**\n * Enables CSS only zooming.\n * @var {boolean}\n */\nPDFJS.useOnlyCssZoom = (PDFJS.useOnlyCssZoom === undefined ?\n                        false : PDFJS.useOnlyCssZoom);\n\n/**\n * Controls the logging level.\n * The constants from PDFJS.VERBOSITY_LEVELS should be used:\n * - errors\n * - warnings [default]\n * - infos\n * @var {number}\n */\nPDFJS.verbosity = (PDFJS.verbosity === undefined ?\n                   PDFJS.VERBOSITY_LEVELS.warnings : PDFJS.verbosity);\n\n/**\n * The maximum supported canvas size in total pixels e.g. width * height.\n * The default value is 4096 * 4096. Use -1 for no limit.\n * @var {number}\n */\nPDFJS.maxCanvasPixels = (PDFJS.maxCanvasPixels === undefined ?\n                         16777216 : PDFJS.maxCanvasPixels);\n\n/**\n * Opens external links in a new window if enabled. The default behavior opens\n * external links in the PDF.js window.\n * @var {boolean}\n */\nPDFJS.openExternalLinksInNewWindow = (\n  PDFJS.openExternalLinksInNewWindow === undefined ?\n    false : PDFJS.openExternalLinksInNewWindow);\n\n/**\n * Document initialization / loading parameters object.\n *\n * @typedef {Object} DocumentInitParameters\n * @property {string}     url   - The URL of the PDF.\n * @property {TypedArray|Array|string} data - Binary PDF data. Use typed arrays\n *   (Uint8Array) to improve the memory usage. If PDF data is BASE64-encoded,\n *   use atob() to convert it to a binary string first.\n * @property {Object}     httpHeaders - Basic authentication headers.\n * @property {boolean}    withCredentials - Indicates whether or not cross-site\n *   Access-Control requests should be made using credentials such as cookies\n *   or authorization headers. The default is false.\n * @property {string}     password - For decrypting password-protected PDFs.\n * @property {TypedArray} initialData - A typed array with the first portion or\n *   all of the pdf data. Used by the extension since some data is already\n *   loaded before the switch to range requests.\n * @property {number}     length - The PDF file length. It's used for progress\n *   reports and range requests operations.\n * @property {PDFDataRangeTransport} range\n */\n\n/**\n * @typedef {Object} PDFDocumentStats\n * @property {Array} streamTypes - Used stream types in the document (an item\n *   is set to true if specific stream ID was used in the document).\n * @property {Array} fontTypes - Used font type in the document (an item is set\n *   to true if specific font ID was used in the document).\n */\n\n/**\n * This is the main entry point for loading a PDF and interacting with it.\n * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR)\n * is used, which means it must follow the same origin rules that any XHR does\n * e.g. No cross domain requests without CORS.\n *\n * @param {string|TypedArray|DocumentInitParameters|PDFDataRangeTransport} src\n * Can be a url to where a PDF is located, a typed array (Uint8Array)\n * already populated with data or parameter object.\n *\n * @param {PDFDataRangeTransport} pdfDataRangeTransport (deprecated) It is used\n * if you want to manually serve range requests for data in the PDF.\n *\n * @param {function} passwordCallback (deprecated) It is used to request a\n * password if wrong or no password was provided. The callback receives two\n * parameters: function that needs to be called with new password and reason\n * (see {PasswordResponses}).\n *\n * @param {function} progressCallback (deprecated) It is used to be able to\n * monitor the loading progress of the PDF file (necessary to implement e.g.\n * a loading bar). The callback receives an {Object} with the properties:\n * {number} loaded and {number} total.\n *\n * @return {PDFDocumentLoadingTask}\n */\nPDFJS.getDocument = function getDocument(src,\n                                         pdfDataRangeTransport,\n                                         passwordCallback,\n                                         progressCallback) {\n  var task = new PDFDocumentLoadingTask();\n\n  // Support of the obsolete arguments (for compatibility with API v1.0)\n  if (pdfDataRangeTransport) {\n    if (!(pdfDataRangeTransport instanceof PDFDataRangeTransport)) {\n      // Not a PDFDataRangeTransport instance, trying to add missing properties.\n      pdfDataRangeTransport = Object.create(pdfDataRangeTransport);\n      pdfDataRangeTransport.length = src.length;\n      pdfDataRangeTransport.initialData = src.initialData;\n    }\n    src = Object.create(src);\n    src.range = pdfDataRangeTransport;\n  }\n  task.onPassword = passwordCallback || null;\n  task.onProgress = progressCallback || null;\n\n  var workerInitializedCapability, transport;\n  var source;\n  if (typeof src === 'string') {\n    source = { url: src };\n  } else if (isArrayBuffer(src)) {\n    source = { data: src };\n  } else if (src instanceof PDFDataRangeTransport) {\n    source = { range: src };\n  } else {\n    if (typeof src !== 'object') {\n      error('Invalid parameter in getDocument, need either Uint8Array, ' +\n        'string or a parameter object');\n    }\n    if (!src.url && !src.data && !src.range) {\n      error('Invalid parameter object: need either .data, .range or .url');\n    }\n\n    source = src;\n  }\n\n  var params = {};\n  for (var key in source) {\n    if (key === 'url' && typeof window !== 'undefined') {\n      // The full path is required in the 'url' field.\n      params[key] = combineUrl(window.location.href, source[key]);\n      continue;\n    } else if (key === 'range') {\n      continue;\n    } else if (key === 'data' && !(source[key] instanceof Uint8Array)) {\n      // Converting string or array-like data to Uint8Array.\n      var pdfBytes = source[key];\n      if (typeof pdfBytes === 'string') {\n        params[key] = stringToBytes(pdfBytes);\n      } else if (typeof pdfBytes === 'object' && pdfBytes !== null &&\n                 !isNaN(pdfBytes.length)) {\n        params[key] = new Uint8Array(pdfBytes);\n      } else {\n        error('Invalid PDF binary data: either typed array, string or ' +\n              'array-like object is expected in the data property.');\n      }\n      continue;\n    }\n    params[key] = source[key];\n  }\n\n  workerInitializedCapability = createPromiseCapability();\n  transport = new WorkerTransport(workerInitializedCapability, source.range);\n  workerInitializedCapability.promise.then(function transportInitialized() {\n    transport.fetchDocument(task, params);\n  });\n\n  return task;\n};\n\n/**\n * PDF document loading operation.\n * @class\n */\nvar PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() {\n  /** @constructs PDFDocumentLoadingTask */\n  function PDFDocumentLoadingTask() {\n    this._capability = createPromiseCapability();\n\n    /**\n     * Callback to request a password if wrong or no password was provided.\n     * The callback receives two parameters: function that needs to be called\n     * with new password and reason (see {PasswordResponses}).\n     */\n    this.onPassword = null;\n\n    /**\n     * Callback to be able to monitor the loading progress of the PDF file\n     * (necessary to implement e.g. a loading bar). The callback receives\n     * an {Object} with the properties: {number} loaded and {number} total.\n     */\n    this.onProgress = null;\n  }\n\n  PDFDocumentLoadingTask.prototype =\n      /** @lends PDFDocumentLoadingTask.prototype */ {\n    /**\n     * @return {Promise}\n     */\n    get promise() {\n      return this._capability.promise;\n    },\n\n    // TODO add cancel or abort method\n\n    /**\n     * Registers callbacks to indicate the document loading completion.\n     *\n     * @param {function} onFulfilled The callback for the loading completion.\n     * @param {function} onRejected The callback for the loading failure.\n     * @return {Promise} A promise that is resolved after the onFulfilled or\n     *                   onRejected callback.\n     */\n    then: function PDFDocumentLoadingTask_then(onFulfilled, onRejected) {\n      return this.promise.then.apply(this.promise, arguments);\n    }\n  };\n\n  return PDFDocumentLoadingTask;\n})();\n\n/**\n * Abstract class to support range requests file loading.\n * @class\n */\nvar PDFDataRangeTransport = (function pdfDataRangeTransportClosure() {\n  /**\n   * @constructs PDFDataRangeTransport\n   * @param {number} length\n   * @param {Uint8Array} initialData\n   */\n  function PDFDataRangeTransport(length, initialData) {\n    this.length = length;\n    this.initialData = initialData;\n\n    this._rangeListeners = [];\n    this._progressListeners = [];\n    this._progressiveReadListeners = [];\n    this._readyCapability = createPromiseCapability();\n  }\n  PDFDataRangeTransport.prototype =\n      /** @lends PDFDataRangeTransport.prototype */ {\n    addRangeListener:\n        function PDFDataRangeTransport_addRangeListener(listener) {\n      this._rangeListeners.push(listener);\n    },\n\n    addProgressListener:\n        function PDFDataRangeTransport_addProgressListener(listener) {\n      this._progressListeners.push(listener);\n    },\n\n    addProgressiveReadListener:\n        function PDFDataRangeTransport_addProgressiveReadListener(listener) {\n      this._progressiveReadListeners.push(listener);\n    },\n\n    onDataRange: function PDFDataRangeTransport_onDataRange(begin, chunk) {\n      var listeners = this._rangeListeners;\n      for (var i = 0, n = listeners.length; i < n; ++i) {\n        listeners[i](begin, chunk);\n      }\n    },\n\n    onDataProgress: function PDFDataRangeTransport_onDataProgress(loaded) {\n      this._readyCapability.promise.then(function () {\n        var listeners = this._progressListeners;\n        for (var i = 0, n = listeners.length; i < n; ++i) {\n          listeners[i](loaded);\n        }\n      }.bind(this));\n    },\n\n    onDataProgressiveRead:\n        function PDFDataRangeTransport_onDataProgress(chunk) {\n      this._readyCapability.promise.then(function () {\n        var listeners = this._progressiveReadListeners;\n        for (var i = 0, n = listeners.length; i < n; ++i) {\n          listeners[i](chunk);\n        }\n      }.bind(this));\n    },\n\n    transportReady: function PDFDataRangeTransport_transportReady() {\n      this._readyCapability.resolve();\n    },\n\n    requestDataRange:\n        function PDFDataRangeTransport_requestDataRange(begin, end) {\n      throw new Error('Abstract method PDFDataRangeTransport.requestDataRange');\n    }\n  };\n  return PDFDataRangeTransport;\n})();\n\nPDFJS.PDFDataRangeTransport = PDFDataRangeTransport;\n\n/**\n * Proxy to a PDFDocument in the worker thread. Also, contains commonly used\n * properties that can be read synchronously.\n * @class\n */\nvar PDFDocumentProxy = (function PDFDocumentProxyClosure() {\n  function PDFDocumentProxy(pdfInfo, transport) {\n    this.pdfInfo = pdfInfo;\n    this.transport = transport;\n  }\n  PDFDocumentProxy.prototype = /** @lends PDFDocumentProxy.prototype */ {\n    /**\n     * @return {number} Total number of pages the PDF contains.\n     */\n    get numPages() {\n      return this.pdfInfo.numPages;\n    },\n    /**\n     * @return {string} A unique ID to identify a PDF. Not guaranteed to be\n     * unique.\n     */\n    get fingerprint() {\n      return this.pdfInfo.fingerprint;\n    },\n    /**\n     * @param {number} pageNumber The page number to get. The first page is 1.\n     * @return {Promise} A promise that is resolved with a {@link PDFPageProxy}\n     * object.\n     */\n    getPage: function PDFDocumentProxy_getPage(pageNumber) {\n      return this.transport.getPage(pageNumber);\n    },\n    /**\n     * @param {{num: number, gen: number}} ref The page reference. Must have\n     *   the 'num' and 'gen' properties.\n     * @return {Promise} A promise that is resolved with the page index that is\n     * associated with the reference.\n     */\n    getPageIndex: function PDFDocumentProxy_getPageIndex(ref) {\n      return this.transport.getPageIndex(ref);\n    },\n    /**\n     * @return {Promise} A promise that is resolved with a lookup table for\n     * mapping named destinations to reference numbers.\n     *\n     * This can be slow for large documents: use getDestination instead\n     */\n    getDestinations: function PDFDocumentProxy_getDestinations() {\n      return this.transport.getDestinations();\n    },\n    /**\n     * @param {string} id The named destination to get.\n     * @return {Promise} A promise that is resolved with all information\n     * of the given named destination.\n     */\n    getDestination: function PDFDocumentProxy_getDestination(id) {\n      return this.transport.getDestination(id);\n    },\n    /**\n     * @return {Promise} A promise that is resolved with a lookup table for\n     * mapping named attachments to their content.\n     */\n    getAttachments: function PDFDocumentProxy_getAttachments() {\n      return this.transport.getAttachments();\n    },\n    /**\n     * @return {Promise} A promise that is resolved with an array of all the\n     * JavaScript strings in the name tree.\n     */\n    getJavaScript: function PDFDocumentProxy_getJavaScript() {\n      return this.transport.getJavaScript();\n    },\n    /**\n     * @return {Promise} A promise that is resolved with an {Array} that is a\n     * tree outline (if it has one) of the PDF. The tree is in the format of:\n     * [\n     *  {\n     *   title: string,\n     *   bold: boolean,\n     *   italic: boolean,\n     *   color: rgb array,\n     *   dest: dest obj,\n     *   items: array of more items like this\n     *  },\n     *  ...\n     * ].\n     */\n    getOutline: function PDFDocumentProxy_getOutline() {\n      return this.transport.getOutline();\n    },\n    /**\n     * @return {Promise} A promise that is resolved with an {Object} that has\n     * info and metadata properties.  Info is an {Object} filled with anything\n     * available in the information dictionary and similarly metadata is a\n     * {Metadata} object with information from the metadata section of the PDF.\n     */\n    getMetadata: function PDFDocumentProxy_getMetadata() {\n      return this.transport.getMetadata();\n    },\n    /**\n     * @return {Promise} A promise that is resolved with a TypedArray that has\n     * the raw data from the PDF.\n     */\n    getData: function PDFDocumentProxy_getData() {\n      return this.transport.getData();\n    },\n    /**\n     * @return {Promise} A promise that is resolved when the document's data\n     * is loaded. It is resolved with an {Object} that contains the length\n     * property that indicates size of the PDF data in bytes.\n     */\n    getDownloadInfo: function PDFDocumentProxy_getDownloadInfo() {\n      return this.transport.downloadInfoCapability.promise;\n    },\n    /**\n     * @return {Promise} A promise this is resolved with current stats about\n     * document structures (see {@link PDFDocumentStats}).\n     */\n    getStats: function PDFDocumentProxy_getStats() {\n      return this.transport.getStats();\n    },\n    /**\n     * Cleans up resources allocated by the document, e.g. created @font-face.\n     */\n    cleanup: function PDFDocumentProxy_cleanup() {\n      this.transport.startCleanup();\n    },\n    /**\n     * Destroys current document instance and terminates worker.\n     */\n    destroy: function PDFDocumentProxy_destroy() {\n      this.transport.destroy();\n    }\n  };\n  return PDFDocumentProxy;\n})();\n\n/**\n * Page text content.\n *\n * @typedef {Object} TextContent\n * @property {array} items - array of {@link TextItem}\n * @property {Object} styles - {@link TextStyles} objects, indexed by font\n *                    name.\n */\n\n/**\n * Page text content part.\n *\n * @typedef {Object} TextItem\n * @property {string} str - text content.\n * @property {string} dir - text direction: 'ttb', 'ltr' or 'rtl'.\n * @property {array} transform - transformation matrix.\n * @property {number} width - width in device space.\n * @property {number} height - height in device space.\n * @property {string} fontName - font name used by pdf.js for converted font.\n */\n\n/**\n * Text style.\n *\n * @typedef {Object} TextStyle\n * @property {number} ascent - font ascent.\n * @property {number} descent - font descent.\n * @property {boolean} vertical - text is in vertical mode.\n * @property {string} fontFamily - possible font family\n */\n\n/**\n * Page render parameters.\n *\n * @typedef {Object} RenderParameters\n * @property {Object} canvasContext - A 2D context of a DOM Canvas object.\n * @property {PDFJS.PageViewport} viewport - Rendering viewport obtained by\n *                                calling of PDFPage.getViewport method.\n * @property {string} intent - Rendering intent, can be 'display' or 'print'\n *                    (default value is 'display').\n * @property {Object} imageLayer - (optional) An object that has beginLayout,\n *                    endLayout and appendImage functions.\n * @property {function} continueCallback - (deprecated) A function that will be\n *                      called each time the rendering is paused.  To continue\n *                      rendering call the function that is the first argument\n *                      to the callback.\n */\n\n/**\n * PDF page operator list.\n *\n * @typedef {Object} PDFOperatorList\n * @property {Array} fnArray - Array containing the operator functions.\n * @property {Array} argsArray - Array containing the arguments of the\n *                               functions.\n */\n\n/**\n * Proxy to a PDFPage in the worker thread.\n * @class\n */\nvar PDFPageProxy = (function PDFPageProxyClosure() {\n  function PDFPageProxy(pageIndex, pageInfo, transport) {\n    this.pageIndex = pageIndex;\n    this.pageInfo = pageInfo;\n    this.transport = transport;\n    this.stats = new StatTimer();\n    this.stats.enabled = !!globalScope.PDFJS.enableStats;\n    this.commonObjs = transport.commonObjs;\n    this.objs = new PDFObjects();\n    this.cleanupAfterRender = false;\n    this.pendingDestroy = false;\n    this.intentStates = {};\n  }\n  PDFPageProxy.prototype = /** @lends PDFPageProxy.prototype */ {\n    /**\n     * @return {number} Page number of the page. First page is 1.\n     */\n    get pageNumber() {\n      return this.pageIndex + 1;\n    },\n    /**\n     * @return {number} The number of degrees the page is rotated clockwise.\n     */\n    get rotate() {\n      return this.pageInfo.rotate;\n    },\n    /**\n     * @return {Object} The reference that points to this page. It has 'num' and\n     * 'gen' properties.\n     */\n    get ref() {\n      return this.pageInfo.ref;\n    },\n    /**\n     * @return {Array} An array of the visible portion of the PDF page in the\n     * user space units - [x1, y1, x2, y2].\n     */\n    get view() {\n      return this.pageInfo.view;\n    },\n    /**\n     * @param {number} scale The desired scale of the viewport.\n     * @param {number} rotate Degrees to rotate the viewport. If omitted this\n     * defaults to the page rotation.\n     * @return {PDFJS.PageViewport} Contains 'width' and 'height' properties\n     * along with transforms required for rendering.\n     */\n    getViewport: function PDFPageProxy_getViewport(scale, rotate) {\n      if (arguments.length < 2) {\n        rotate = this.rotate;\n      }\n      return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0);\n    },\n    /**\n     * @return {Promise} A promise that is resolved with an {Array} of the\n     * annotation objects.\n     */\n    getAnnotations: function PDFPageProxy_getAnnotations() {\n      if (this.annotationsPromise) {\n        return this.annotationsPromise;\n      }\n\n      var promise = this.transport.getAnnotations(this.pageIndex);\n      this.annotationsPromise = promise;\n      return promise;\n    },\n    /**\n     * Begins the process of rendering a page to the desired context.\n     * @param {RenderParameters} params Page render parameters.\n     * @return {RenderTask} An object that contains the promise, which\n     *                      is resolved when the page finishes rendering.\n     */\n    render: function PDFPageProxy_render(params) {\n      var stats = this.stats;\n      stats.time('Overall');\n\n      // If there was a pending destroy cancel it so no cleanup happens during\n      // this call to render.\n      this.pendingDestroy = false;\n\n      var renderingIntent = (params.intent === 'print' ? 'print' : 'display');\n\n      if (!this.intentStates[renderingIntent]) {\n        this.intentStates[renderingIntent] = {};\n      }\n      var intentState = this.intentStates[renderingIntent];\n\n      // If there's no displayReadyCapability yet, then the operatorList\n      // was never requested before. Make the request and create the promise.\n      if (!intentState.displayReadyCapability) {\n        intentState.receivingOperatorList = true;\n        intentState.displayReadyCapability = createPromiseCapability();\n        intentState.operatorList = {\n          fnArray: [],\n          argsArray: [],\n          lastChunk: false\n        };\n\n        this.stats.time('Page Request');\n        this.transport.messageHandler.send('RenderPageRequest', {\n          pageIndex: this.pageNumber - 1,\n          intent: renderingIntent\n        });\n      }\n\n      var internalRenderTask = new InternalRenderTask(complete, params,\n                                                      this.objs,\n                                                      this.commonObjs,\n                                                      intentState.operatorList,\n                                                      this.pageNumber);\n      internalRenderTask.useRequestAnimationFrame = renderingIntent !== 'print';\n      if (!intentState.renderTasks) {\n        intentState.renderTasks = [];\n      }\n      intentState.renderTasks.push(internalRenderTask);\n      var renderTask = internalRenderTask.task;\n\n      // Obsolete parameter support\n      if (params.continueCallback) {\n        renderTask.onContinue = params.continueCallback;\n      }\n\n      var self = this;\n      intentState.displayReadyCapability.promise.then(\n        function pageDisplayReadyPromise(transparency) {\n          if (self.pendingDestroy) {\n            complete();\n            return;\n          }\n          stats.time('Rendering');\n          internalRenderTask.initalizeGraphics(transparency);\n          internalRenderTask.operatorListChanged();\n        },\n        function pageDisplayReadPromiseError(reason) {\n          complete(reason);\n        }\n      );\n\n      function complete(error) {\n        var i = intentState.renderTasks.indexOf(internalRenderTask);\n        if (i >= 0) {\n          intentState.renderTasks.splice(i, 1);\n        }\n\n        if (self.cleanupAfterRender) {\n          self.pendingDestroy = true;\n        }\n        self._tryDestroy();\n\n        if (error) {\n          internalRenderTask.capability.reject(error);\n        } else {\n          internalRenderTask.capability.resolve();\n        }\n        stats.timeEnd('Rendering');\n        stats.timeEnd('Overall');\n      }\n\n      return renderTask;\n    },\n\n    /**\n     * @return {Promise} A promise resolved with an {@link PDFOperatorList}\n     * object that represents page's operator list.\n     */\n    getOperatorList: function PDFPageProxy_getOperatorList() {\n      function operatorListChanged() {\n        if (intentState.operatorList.lastChunk) {\n          intentState.opListReadCapability.resolve(intentState.operatorList);\n        }\n      }\n\n      var renderingIntent = 'oplist';\n      if (!this.intentStates[renderingIntent]) {\n        this.intentStates[renderingIntent] = {};\n      }\n      var intentState = this.intentStates[renderingIntent];\n\n      if (!intentState.opListReadCapability) {\n        var opListTask = {};\n        opListTask.operatorListChanged = operatorListChanged;\n        intentState.receivingOperatorList = true;\n        intentState.opListReadCapability = createPromiseCapability();\n        intentState.renderTasks = [];\n        intentState.renderTasks.push(opListTask);\n        intentState.operatorList = {\n          fnArray: [],\n          argsArray: [],\n          lastChunk: false\n        };\n\n        this.transport.messageHandler.send('RenderPageRequest', {\n          pageIndex: this.pageIndex,\n          intent: renderingIntent\n        });\n      }\n      return intentState.opListReadCapability.promise;\n    },\n\n    /**\n     * @return {Promise} That is resolved a {@link TextContent}\n     * object that represent the page text content.\n     */\n    getTextContent: function PDFPageProxy_getTextContent() {\n      return this.transport.messageHandler.sendWithPromise('GetTextContent', {\n        pageIndex: this.pageNumber - 1\n      });\n    },\n    /**\n     * Destroys resources allocated by the page.\n     */\n    destroy: function PDFPageProxy_destroy() {\n      this.pendingDestroy = true;\n      this._tryDestroy();\n    },\n    /**\n     * For internal use only. Attempts to clean up if rendering is in a state\n     * where that's possible.\n     * @ignore\n     */\n    _tryDestroy: function PDFPageProxy__destroy() {\n      if (!this.pendingDestroy ||\n          Object.keys(this.intentStates).some(function(intent) {\n            var intentState = this.intentStates[intent];\n            return (intentState.renderTasks.length !== 0 ||\n                    intentState.receivingOperatorList);\n          }, this)) {\n        return;\n      }\n\n      Object.keys(this.intentStates).forEach(function(intent) {\n        delete this.intentStates[intent];\n      }, this);\n      this.objs.clear();\n      this.annotationsPromise = null;\n      this.pendingDestroy = false;\n    },\n    /**\n     * For internal use only.\n     * @ignore\n     */\n    _startRenderPage: function PDFPageProxy_startRenderPage(transparency,\n                                                            intent) {\n      var intentState = this.intentStates[intent];\n      // TODO Refactor RenderPageRequest to separate rendering\n      // and operator list logic\n      if (intentState.displayReadyCapability) {\n        intentState.displayReadyCapability.resolve(transparency);\n      }\n    },\n    /**\n     * For internal use only.\n     * @ignore\n     */\n    _renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk,\n                                                            intent) {\n      var intentState = this.intentStates[intent];\n      var i, ii;\n      // Add the new chunk to the current operator list.\n      for (i = 0, ii = operatorListChunk.length; i < ii; i++) {\n        intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);\n        intentState.operatorList.argsArray.push(\n          operatorListChunk.argsArray[i]);\n      }\n      intentState.operatorList.lastChunk = operatorListChunk.lastChunk;\n\n      // Notify all the rendering tasks there are more operators to be consumed.\n      for (i = 0; i < intentState.renderTasks.length; i++) {\n        intentState.renderTasks[i].operatorListChanged();\n      }\n\n      if (operatorListChunk.lastChunk) {\n        intentState.receivingOperatorList = false;\n        this._tryDestroy();\n      }\n    }\n  };\n  return PDFPageProxy;\n})();\n\n/**\n * For internal use only.\n * @ignore\n */\nvar WorkerTransport = (function WorkerTransportClosure() {\n  function WorkerTransport(workerInitializedCapability, pdfDataRangeTransport) {\n    this.pdfDataRangeTransport = pdfDataRangeTransport;\n    this.workerInitializedCapability = workerInitializedCapability;\n    this.commonObjs = new PDFObjects();\n\n    this.loadingTask = null;\n\n    this.pageCache = [];\n    this.pagePromises = [];\n    this.downloadInfoCapability = createPromiseCapability();\n\n    // If worker support isn't disabled explicit and the browser has worker\n    // support, create a new web worker and test if it/the browser fullfills\n    // all requirements to run parts of pdf.js in a web worker.\n    // Right now, the requirement is, that an Uint8Array is still an Uint8Array\n    // as it arrives on the worker. Chrome added this with version 15.\n    if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') {\n      var workerSrc = PDFJS.workerSrc;\n      if (!workerSrc) {\n        error('No PDFJS.workerSrc specified');\n      }\n\n      try {\n        // Some versions of FF can't create a worker on localhost, see:\n        // https://bugzilla.mozilla.org/show_bug.cgi?id=683280\n        var worker = new Worker(workerSrc);\n        var messageHandler = new MessageHandler('main', worker);\n        this.messageHandler = messageHandler;\n\n        messageHandler.on('test', function transportTest(data) {\n          var supportTypedArray = data && data.supportTypedArray;\n          if (supportTypedArray) {\n            this.worker = worker;\n            if (!data.supportTransfers) {\n              PDFJS.postMessageTransfers = false;\n            }\n            this.setupMessageHandler(messageHandler);\n            workerInitializedCapability.resolve();\n          } else {\n            this.setupFakeWorker();\n          }\n        }.bind(this));\n\n        var testObj = new Uint8Array([PDFJS.postMessageTransfers ? 255 : 0]);\n        // Some versions of Opera throw a DATA_CLONE_ERR on serializing the\n        // typed array. Also, checking if we can use transfers.\n        try {\n          messageHandler.send('test', testObj, [testObj.buffer]);\n        } catch (ex) {\n          info('Cannot use postMessage transfers');\n          testObj[0] = 0;\n          messageHandler.send('test', testObj);\n        }\n        return;\n      } catch (e) {\n        info('The worker has been disabled.');\n      }\n    }\n    // Either workers are disabled, not supported or have thrown an exception.\n    // Thus, we fallback to a faked worker.\n    this.setupFakeWorker();\n  }\n  WorkerTransport.prototype = {\n    destroy: function WorkerTransport_destroy() {\n      this.pageCache = [];\n      this.pagePromises = [];\n      var self = this;\n      this.messageHandler.sendWithPromise('Terminate', null).then(function () {\n        FontLoader.clear();\n        if (self.worker) {\n          self.worker.terminate();\n        }\n      });\n    },\n\n    setupFakeWorker: function WorkerTransport_setupFakeWorker() {\n      globalScope.PDFJS.disableWorker = true;\n\n      if (!PDFJS.fakeWorkerFilesLoadedCapability) {\n        PDFJS.fakeWorkerFilesLoadedCapability = createPromiseCapability();\n        // In the developer build load worker_loader which in turn loads all the\n        // other files and resolves the promise. In production only the\n        // pdf.worker.js file is needed.\n        Util.loadScript(PDFJS.workerSrc, function() {\n          PDFJS.fakeWorkerFilesLoadedCapability.resolve();\n        });\n      }\n      PDFJS.fakeWorkerFilesLoadedCapability.promise.then(function () {\n        warn('Setting up fake worker.');\n        // If we don't use a worker, just post/sendMessage to the main thread.\n        var fakeWorker = {\n          postMessage: function WorkerTransport_postMessage(obj) {\n            fakeWorker.onmessage({data: obj});\n          },\n          terminate: function WorkerTransport_terminate() {}\n        };\n\n        var messageHandler = new MessageHandler('main', fakeWorker);\n        this.setupMessageHandler(messageHandler);\n\n        // If the main thread is our worker, setup the handling for the messages\n        // the main thread sends to it self.\n        PDFJS.WorkerMessageHandler.setup(messageHandler);\n\n        this.workerInitializedCapability.resolve();\n      }.bind(this));\n    },\n\n    setupMessageHandler:\n      function WorkerTransport_setupMessageHandler(messageHandler) {\n      this.messageHandler = messageHandler;\n\n      function updatePassword(password) {\n        messageHandler.send('UpdatePassword', password);\n      }\n\n      var pdfDataRangeTransport = this.pdfDataRangeTransport;\n      if (pdfDataRangeTransport) {\n        pdfDataRangeTransport.addRangeListener(function(begin, chunk) {\n          messageHandler.send('OnDataRange', {\n            begin: begin,\n            chunk: chunk\n          });\n        });\n\n        pdfDataRangeTransport.addProgressListener(function(loaded) {\n          messageHandler.send('OnDataProgress', {\n            loaded: loaded\n          });\n        });\n\n        pdfDataRangeTransport.addProgressiveReadListener(function(chunk) {\n          messageHandler.send('OnDataRange', {\n            chunk: chunk\n          });\n        });\n\n        messageHandler.on('RequestDataRange',\n          function transportDataRange(data) {\n            pdfDataRangeTransport.requestDataRange(data.begin, data.end);\n          }, this);\n      }\n\n      messageHandler.on('GetDoc', function transportDoc(data) {\n        var pdfInfo = data.pdfInfo;\n        this.numPages = data.pdfInfo.numPages;\n        var pdfDocument = new PDFDocumentProxy(pdfInfo, this);\n        this.pdfDocument = pdfDocument;\n        this.loadingTask._capability.resolve(pdfDocument);\n      }, this);\n\n      messageHandler.on('NeedPassword',\n                        function transportNeedPassword(exception) {\n        var loadingTask = this.loadingTask;\n        if (loadingTask.onPassword) {\n          return loadingTask.onPassword(updatePassword,\n                                        PasswordResponses.NEED_PASSWORD);\n        }\n        loadingTask._capability.reject(\n          new PasswordException(exception.message, exception.code));\n      }, this);\n\n      messageHandler.on('IncorrectPassword',\n                        function transportIncorrectPassword(exception) {\n        var loadingTask = this.loadingTask;\n        if (loadingTask.onPassword) {\n          return loadingTask.onPassword(updatePassword,\n                                        PasswordResponses.INCORRECT_PASSWORD);\n        }\n        loadingTask._capability.reject(\n          new PasswordException(exception.message, exception.code));\n      }, this);\n\n      messageHandler.on('InvalidPDF', function transportInvalidPDF(exception) {\n        this.loadingTask._capability.reject(\n          new InvalidPDFException(exception.message));\n      }, this);\n\n      messageHandler.on('MissingPDF', function transportMissingPDF(exception) {\n        this.loadingTask._capability.reject(\n          new MissingPDFException(exception.message));\n      }, this);\n\n      messageHandler.on('UnexpectedResponse',\n                        function transportUnexpectedResponse(exception) {\n        this.loadingTask._capability.reject(\n          new UnexpectedResponseException(exception.message, exception.status));\n      }, this);\n\n      messageHandler.on('UnknownError',\n                        function transportUnknownError(exception) {\n        this.loadingTask._capability.reject(\n          new UnknownErrorException(exception.message, exception.details));\n      }, this);\n\n      messageHandler.on('DataLoaded', function transportPage(data) {\n        this.downloadInfoCapability.resolve(data);\n      }, this);\n\n      messageHandler.on('PDFManagerReady', function transportPage(data) {\n        if (this.pdfDataRangeTransport) {\n          this.pdfDataRangeTransport.transportReady();\n        }\n      }, this);\n\n      messageHandler.on('StartRenderPage', function transportRender(data) {\n        var page = this.pageCache[data.pageIndex];\n\n        page.stats.timeEnd('Page Request');\n        page._startRenderPage(data.transparency, data.intent);\n      }, this);\n\n      messageHandler.on('RenderPageChunk', function transportRender(data) {\n        var page = this.pageCache[data.pageIndex];\n\n        page._renderPageChunk(data.operatorList, data.intent);\n      }, this);\n\n      messageHandler.on('commonobj', function transportObj(data) {\n        var id = data[0];\n        var type = data[1];\n        if (this.commonObjs.hasData(id)) {\n          return;\n        }\n\n        switch (type) {\n          case 'Font':\n            var exportedData = data[2];\n\n            var font;\n            if ('error' in exportedData) {\n              var error = exportedData.error;\n              warn('Error during font loading: ' + error);\n              this.commonObjs.resolve(id, error);\n              break;\n            } else {\n              font = new FontFaceObject(exportedData);\n            }\n\n            FontLoader.bind(\n              [font],\n              function fontReady(fontObjs) {\n                this.commonObjs.resolve(id, font);\n              }.bind(this)\n            );\n            break;\n          case 'FontPath':\n            this.commonObjs.resolve(id, data[2]);\n            break;\n          default:\n            error('Got unknown common object type ' + type);\n        }\n      }, this);\n\n      messageHandler.on('obj', function transportObj(data) {\n        var id = data[0];\n        var pageIndex = data[1];\n        var type = data[2];\n        var pageProxy = this.pageCache[pageIndex];\n        var imageData;\n        if (pageProxy.objs.hasData(id)) {\n          return;\n        }\n\n        switch (type) {\n          case 'JpegStream':\n            imageData = data[3];\n            loadJpegStream(id, imageData, pageProxy.objs);\n            break;\n          case 'Image':\n            imageData = data[3];\n            pageProxy.objs.resolve(id, imageData);\n\n            // heuristics that will allow not to store large data\n            var MAX_IMAGE_SIZE_TO_STORE = 8000000;\n            if (imageData && 'data' in imageData &&\n                imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) {\n              pageProxy.cleanupAfterRender = true;\n            }\n            break;\n          default:\n            error('Got unknown object type ' + type);\n        }\n      }, this);\n\n      messageHandler.on('DocProgress', function transportDocProgress(data) {\n        var loadingTask = this.loadingTask;\n        if (loadingTask.onProgress) {\n          loadingTask.onProgress({\n            loaded: data.loaded,\n            total: data.total\n          });\n        }\n      }, this);\n\n      messageHandler.on('PageError', function transportError(data) {\n        var page = this.pageCache[data.pageNum - 1];\n        var intentState = page.intentStates[data.intent];\n        if (intentState.displayReadyCapability) {\n          intentState.displayReadyCapability.reject(data.error);\n        } else {\n          error(data.error);\n        }\n      }, this);\n\n      messageHandler.on('JpegDecode', function(data) {\n        var imageUrl = data[0];\n        var components = data[1];\n        if (components !== 3 && components !== 1) {\n          return Promise.reject(\n            new Error('Only 3 components or 1 component can be returned'));\n        }\n\n        return new Promise(function (resolve, reject) {\n          var img = new Image();\n          img.onload = function () {\n            var width = img.width;\n            var height = img.height;\n            var size = width * height;\n            var rgbaLength = size * 4;\n            var buf = new Uint8Array(size * components);\n            var tmpCanvas = createScratchCanvas(width, height);\n            var tmpCtx = tmpCanvas.getContext('2d');\n            tmpCtx.drawImage(img, 0, 0);\n            var data = tmpCtx.getImageData(0, 0, width, height).data;\n            var i, j;\n\n            if (components === 3) {\n              for (i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {\n                buf[j] = data[i];\n                buf[j + 1] = data[i + 1];\n                buf[j + 2] = data[i + 2];\n              }\n            } else if (components === 1) {\n              for (i = 0, j = 0; i < rgbaLength; i += 4, j++) {\n                buf[j] = data[i];\n              }\n            }\n            resolve({ data: buf, width: width, height: height});\n          };\n          img.onerror = function () {\n            reject(new Error('JpegDecode failed to load image'));\n          };\n          img.src = imageUrl;\n        });\n      });\n    },\n\n    fetchDocument: function WorkerTransport_fetchDocument(loadingTask, source) {\n      this.loadingTask = loadingTask;\n\n      source.disableAutoFetch = PDFJS.disableAutoFetch;\n      source.disableStream = PDFJS.disableStream;\n      source.chunkedViewerLoading = !!this.pdfDataRangeTransport;\n      if (this.pdfDataRangeTransport) {\n        source.length = this.pdfDataRangeTransport.length;\n        source.initialData = this.pdfDataRangeTransport.initialData;\n      }\n      this.messageHandler.send('GetDocRequest', {\n        source: source,\n        disableRange: PDFJS.disableRange,\n        maxImageSize: PDFJS.maxImageSize,\n        cMapUrl: PDFJS.cMapUrl,\n        cMapPacked: PDFJS.cMapPacked,\n        disableFontFace: PDFJS.disableFontFace,\n        disableCreateObjectURL: PDFJS.disableCreateObjectURL,\n        verbosity: PDFJS.verbosity\n      });\n    },\n\n    getData: function WorkerTransport_getData() {\n      return this.messageHandler.sendWithPromise('GetData', null);\n    },\n\n    getPage: function WorkerTransport_getPage(pageNumber, capability) {\n      if (pageNumber <= 0 || pageNumber > this.numPages ||\n          (pageNumber|0) !== pageNumber) {\n        return Promise.reject(new Error('Invalid page request'));\n      }\n\n      var pageIndex = pageNumber - 1;\n      if (pageIndex in this.pagePromises) {\n        return this.pagePromises[pageIndex];\n      }\n      var promise = this.messageHandler.sendWithPromise('GetPage', {\n        pageIndex: pageIndex\n      }).then(function (pageInfo) {\n        var page = new PDFPageProxy(pageIndex, pageInfo, this);\n        this.pageCache[pageIndex] = page;\n        return page;\n      }.bind(this));\n      this.pagePromises[pageIndex] = promise;\n      return promise;\n    },\n\n    getPageIndex: function WorkerTransport_getPageIndexByRef(ref) {\n      return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref });\n    },\n\n    getAnnotations: function WorkerTransport_getAnnotations(pageIndex) {\n      return this.messageHandler.sendWithPromise('GetAnnotations',\n        { pageIndex: pageIndex });\n    },\n\n    getDestinations: function WorkerTransport_getDestinations() {\n      return this.messageHandler.sendWithPromise('GetDestinations', null);\n    },\n\n    getDestination: function WorkerTransport_getDestination(id) {\n      return this.messageHandler.sendWithPromise('GetDestination', { id: id } );\n    },\n\n    getAttachments: function WorkerTransport_getAttachments() {\n      return this.messageHandler.sendWithPromise('GetAttachments', null);\n    },\n\n    getJavaScript: function WorkerTransport_getJavaScript() {\n      return this.messageHandler.sendWithPromise('GetJavaScript', null);\n    },\n\n    getOutline: function WorkerTransport_getOutline() {\n      return this.messageHandler.sendWithPromise('GetOutline', null);\n    },\n\n    getMetadata: function WorkerTransport_getMetadata() {\n      return this.messageHandler.sendWithPromise('GetMetadata', null).\n        then(function transportMetadata(results) {\n        return {\n          info: results[0],\n          metadata: (results[1] ? new PDFJS.Metadata(results[1]) : null)\n        };\n      });\n    },\n\n    getStats: function WorkerTransport_getStats() {\n      return this.messageHandler.sendWithPromise('GetStats', null);\n    },\n\n    startCleanup: function WorkerTransport_startCleanup() {\n      this.messageHandler.sendWithPromise('Cleanup', null).\n        then(function endCleanup() {\n        for (var i = 0, ii = this.pageCache.length; i < ii; i++) {\n          var page = this.pageCache[i];\n          if (page) {\n            page.destroy();\n          }\n        }\n        this.commonObjs.clear();\n        FontLoader.clear();\n      }.bind(this));\n    }\n  };\n  return WorkerTransport;\n\n})();\n\n/**\n * A PDF document and page is built of many objects. E.g. there are objects\n * for fonts, images, rendering code and such. These objects might get processed\n * inside of a worker. The `PDFObjects` implements some basic functions to\n * manage these objects.\n * @ignore\n */\nvar PDFObjects = (function PDFObjectsClosure() {\n  function PDFObjects() {\n    this.objs = {};\n  }\n\n  PDFObjects.prototype = {\n    /**\n     * Internal function.\n     * Ensures there is an object defined for `objId`.\n     */\n    ensureObj: function PDFObjects_ensureObj(objId) {\n      if (this.objs[objId]) {\n        return this.objs[objId];\n      }\n\n      var obj = {\n        capability: createPromiseCapability(),\n        data: null,\n        resolved: false\n      };\n      this.objs[objId] = obj;\n\n      return obj;\n    },\n\n    /**\n     * If called *without* callback, this returns the data of `objId` but the\n     * object needs to be resolved. If it isn't, this function throws.\n     *\n     * If called *with* a callback, the callback is called with the data of the\n     * object once the object is resolved. That means, if you call this\n     * function and the object is already resolved, the callback gets called\n     * right away.\n     */\n    get: function PDFObjects_get(objId, callback) {\n      // If there is a callback, then the get can be async and the object is\n      // not required to be resolved right now\n      if (callback) {\n        this.ensureObj(objId).capability.promise.then(callback);\n        return null;\n      }\n\n      // If there isn't a callback, the user expects to get the resolved data\n      // directly.\n      var obj = this.objs[objId];\n\n      // If there isn't an object yet or the object isn't resolved, then the\n      // data isn't ready yet!\n      if (!obj || !obj.resolved) {\n        error('Requesting object that isn\\'t resolved yet ' + objId);\n      }\n\n      return obj.data;\n    },\n\n    /**\n     * Resolves the object `objId` with optional `data`.\n     */\n    resolve: function PDFObjects_resolve(objId, data) {\n      var obj = this.ensureObj(objId);\n\n      obj.resolved = true;\n      obj.data = data;\n      obj.capability.resolve(data);\n    },\n\n    isResolved: function PDFObjects_isResolved(objId) {\n      var objs = this.objs;\n\n      if (!objs[objId]) {\n        return false;\n      } else {\n        return objs[objId].resolved;\n      }\n    },\n\n    hasData: function PDFObjects_hasData(objId) {\n      return this.isResolved(objId);\n    },\n\n    /**\n     * Returns the data of `objId` if object exists, null otherwise.\n     */\n    getData: function PDFObjects_getData(objId) {\n      var objs = this.objs;\n      if (!objs[objId] || !objs[objId].resolved) {\n        return null;\n      } else {\n        return objs[objId].data;\n      }\n    },\n\n    clear: function PDFObjects_clear() {\n      this.objs = {};\n    }\n  };\n  return PDFObjects;\n})();\n\n/**\n * Allows controlling of the rendering tasks.\n * @class\n */\nvar RenderTask = (function RenderTaskClosure() {\n  function RenderTask(internalRenderTask) {\n    this._internalRenderTask = internalRenderTask;\n\n    /**\n     * Callback for incremental rendering -- a function that will be called\n     * each time the rendering is paused.  To continue rendering call the\n     * function that is the first argument to the callback.\n     * @type {function}\n     */\n    this.onContinue = null;\n  }\n\n  RenderTask.prototype = /** @lends RenderTask.prototype */ {\n    /**\n     * Promise for rendering task completion.\n     * @return {Promise}\n     */\n    get promise() {\n      return this._internalRenderTask.capability.promise;\n    },\n\n    /**\n     * Cancels the rendering task. If the task is currently rendering it will\n     * not be cancelled until graphics pauses with a timeout. The promise that\n     * this object extends will resolved when cancelled.\n     */\n    cancel: function RenderTask_cancel() {\n      this._internalRenderTask.cancel();\n    },\n\n    /**\n     * Registers callbacks to indicate the rendering task completion.\n     *\n     * @param {function} onFulfilled The callback for the rendering completion.\n     * @param {function} onRejected The callback for the rendering failure.\n     * @return {Promise} A promise that is resolved after the onFulfilled or\n     *                   onRejected callback.\n     */\n    then: function RenderTask_then(onFulfilled, onRejected) {\n      return this.promise.then.apply(this.promise, arguments);\n    }\n  };\n\n  return RenderTask;\n})();\n\n/**\n * For internal use only.\n * @ignore\n */\nvar InternalRenderTask = (function InternalRenderTaskClosure() {\n\n  function InternalRenderTask(callback, params, objs, commonObjs, operatorList,\n                              pageNumber) {\n    this.callback = callback;\n    this.params = params;\n    this.objs = objs;\n    this.commonObjs = commonObjs;\n    this.operatorListIdx = null;\n    this.operatorList = operatorList;\n    this.pageNumber = pageNumber;\n    this.running = false;\n    this.graphicsReadyCallback = null;\n    this.graphicsReady = false;\n    this.useRequestAnimationFrame = false;\n    this.cancelled = false;\n    this.capability = createPromiseCapability();\n    this.task = new RenderTask(this);\n    // caching this-bound methods\n    this._continueBound = this._continue.bind(this);\n    this._scheduleNextBound = this._scheduleNext.bind(this);\n    this._nextBound = this._next.bind(this);\n  }\n\n  InternalRenderTask.prototype = {\n\n    initalizeGraphics:\n        function InternalRenderTask_initalizeGraphics(transparency) {\n\n      if (this.cancelled) {\n        return;\n      }\n      if (PDFJS.pdfBug && 'StepperManager' in globalScope &&\n          globalScope.StepperManager.enabled) {\n        this.stepper = globalScope.StepperManager.create(this.pageNumber - 1);\n        this.stepper.init(this.operatorList);\n        this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();\n      }\n\n      var params = this.params;\n      this.gfx = new CanvasGraphics(params.canvasContext, this.commonObjs,\n                                    this.objs, params.imageLayer);\n\n      this.gfx.beginDrawing(params.viewport, transparency);\n      this.operatorListIdx = 0;\n      this.graphicsReady = true;\n      if (this.graphicsReadyCallback) {\n        this.graphicsReadyCallback();\n      }\n    },\n\n    cancel: function InternalRenderTask_cancel() {\n      this.running = false;\n      this.cancelled = true;\n      this.callback('cancelled');\n    },\n\n    operatorListChanged: function InternalRenderTask_operatorListChanged() {\n      if (!this.graphicsReady) {\n        if (!this.graphicsReadyCallback) {\n          this.graphicsReadyCallback = this._continueBound;\n        }\n        return;\n      }\n\n      if (this.stepper) {\n        this.stepper.updateOperatorList(this.operatorList);\n      }\n\n      if (this.running) {\n        return;\n      }\n      this._continue();\n    },\n\n    _continue: function InternalRenderTask__continue() {\n      this.running = true;\n      if (this.cancelled) {\n        return;\n      }\n      if (this.task.onContinue) {\n        this.task.onContinue.call(this.task, this._scheduleNextBound);\n      } else {\n        this._scheduleNext();\n      }\n    },\n\n    _scheduleNext: function InternalRenderTask__scheduleNext() {\n      if (this.useRequestAnimationFrame) {\n        window.requestAnimationFrame(this._nextBound);\n      } else {\n        Promise.resolve(undefined).then(this._nextBound);\n      }\n    },\n\n    _next: function InternalRenderTask__next() {\n      if (this.cancelled) {\n        return;\n      }\n      this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList,\n                                        this.operatorListIdx,\n                                        this._continueBound,\n                                        this.stepper);\n      if (this.operatorListIdx === this.operatorList.argsArray.length) {\n        this.running = false;\n        if (this.operatorList.lastChunk) {\n          this.gfx.endDrawing();\n          this.callback();\n        }\n      }\n    }\n\n  };\n\n  return InternalRenderTask;\n})();\n\n\nvar Metadata = PDFJS.Metadata = (function MetadataClosure() {\n  function fixMetadata(meta) {\n    return meta.replace(/>\\\\376\\\\377([^<]+)/g, function(all, codes) {\n      var bytes = codes.replace(/\\\\([0-3])([0-7])([0-7])/g,\n                                function(code, d1, d2, d3) {\n        return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);\n      });\n      var chars = '';\n      for (var i = 0; i < bytes.length; i += 2) {\n        var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);\n        chars += code >= 32 && code < 127 && code !== 60 && code !== 62 &&\n          code !== 38 && false ? String.fromCharCode(code) :\n          '&#x' + (0x10000 + code).toString(16).substring(1) + ';';\n      }\n      return '>' + chars;\n    });\n  }\n\n  function Metadata(meta) {\n    if (typeof meta === 'string') {\n      // Ghostscript produces invalid metadata\n      meta = fixMetadata(meta);\n\n      var parser = new DOMParser();\n      meta = parser.parseFromString(meta, 'application/xml');\n    } else if (!(meta instanceof Document)) {\n      error('Metadata: Invalid metadata object');\n    }\n\n    this.metaDocument = meta;\n    this.metadata = {};\n    this.parse();\n  }\n\n  Metadata.prototype = {\n    parse: function Metadata_parse() {\n      var doc = this.metaDocument;\n      var rdf = doc.documentElement;\n\n      if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') { // Wrapped in <xmpmeta>\n        rdf = rdf.firstChild;\n        while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf') {\n          rdf = rdf.nextSibling;\n        }\n      }\n\n      var nodeName = (rdf) ? rdf.nodeName.toLowerCase() : null;\n      if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes()) {\n        return;\n      }\n\n      var children = rdf.childNodes, desc, entry, name, i, ii, length, iLength;\n      for (i = 0, length = children.length; i < length; i++) {\n        desc = children[i];\n        if (desc.nodeName.toLowerCase() !== 'rdf:description') {\n          continue;\n        }\n\n        for (ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) {\n          if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text') {\n            entry = desc.childNodes[ii];\n            name = entry.nodeName.toLowerCase();\n            this.metadata[name] = entry.textContent.trim();\n          }\n        }\n      }\n    },\n\n    get: function Metadata_get(name) {\n      return this.metadata[name] || null;\n    },\n\n    has: function Metadata_has(name) {\n      return typeof this.metadata[name] !== 'undefined';\n    }\n  };\n\n  return Metadata;\n})();\n\n\n// <canvas> contexts store most of the state we need natively.\n// However, PDF needs a bit more state, which we store here.\n\n// Minimal font size that would be used during canvas fillText operations.\nvar MIN_FONT_SIZE = 16;\n// Maximum font size that would be used during canvas fillText operations.\nvar MAX_FONT_SIZE = 100;\nvar MAX_GROUP_SIZE = 4096;\n\n// Heuristic value used when enforcing minimum line widths.\nvar MIN_WIDTH_FACTOR = 0.65;\n\nvar COMPILE_TYPE3_GLYPHS = true;\nvar MAX_SIZE_TO_COMPILE = 1000;\n\nvar FULL_CHUNK_HEIGHT = 16;\n\nfunction createScratchCanvas(width, height) {\n  var canvas = document.createElement('canvas');\n  canvas.width = width;\n  canvas.height = height;\n  return canvas;\n}\n\nfunction addContextCurrentTransform(ctx) {\n  // If the context doesn't expose a `mozCurrentTransform`, add a JS based one.\n  if (!ctx.mozCurrentTransform) {\n    ctx._originalSave = ctx.save;\n    ctx._originalRestore = ctx.restore;\n    ctx._originalRotate = ctx.rotate;\n    ctx._originalScale = ctx.scale;\n    ctx._originalTranslate = ctx.translate;\n    ctx._originalTransform = ctx.transform;\n    ctx._originalSetTransform = ctx.setTransform;\n\n    ctx._transformMatrix = ctx._transformMatrix || [1, 0, 0, 1, 0, 0];\n    ctx._transformStack = [];\n\n    Object.defineProperty(ctx, 'mozCurrentTransform', {\n      get: function getCurrentTransform() {\n        return this._transformMatrix;\n      }\n    });\n\n    Object.defineProperty(ctx, 'mozCurrentTransformInverse', {\n      get: function getCurrentTransformInverse() {\n        // Calculation done using WolframAlpha:\n        // http://www.wolframalpha.com/input/?\n        //   i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}}\n\n        var m = this._transformMatrix;\n        var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];\n\n        var ad_bc = a * d - b * c;\n        var bc_ad = b * c - a * d;\n\n        return [\n          d / ad_bc,\n          b / bc_ad,\n          c / bc_ad,\n          a / ad_bc,\n          (d * e - c * f) / bc_ad,\n          (b * e - a * f) / ad_bc\n        ];\n      }\n    });\n\n    ctx.save = function ctxSave() {\n      var old = this._transformMatrix;\n      this._transformStack.push(old);\n      this._transformMatrix = old.slice(0, 6);\n\n      this._originalSave();\n    };\n\n    ctx.restore = function ctxRestore() {\n      var prev = this._transformStack.pop();\n      if (prev) {\n        this._transformMatrix = prev;\n        this._originalRestore();\n      }\n    };\n\n    ctx.translate = function ctxTranslate(x, y) {\n      var m = this._transformMatrix;\n      m[4] = m[0] * x + m[2] * y + m[4];\n      m[5] = m[1] * x + m[3] * y + m[5];\n\n      this._originalTranslate(x, y);\n    };\n\n    ctx.scale = function ctxScale(x, y) {\n      var m = this._transformMatrix;\n      m[0] = m[0] * x;\n      m[1] = m[1] * x;\n      m[2] = m[2] * y;\n      m[3] = m[3] * y;\n\n      this._originalScale(x, y);\n    };\n\n    ctx.transform = function ctxTransform(a, b, c, d, e, f) {\n      var m = this._transformMatrix;\n      this._transformMatrix = [\n        m[0] * a + m[2] * b,\n        m[1] * a + m[3] * b,\n        m[0] * c + m[2] * d,\n        m[1] * c + m[3] * d,\n        m[0] * e + m[2] * f + m[4],\n        m[1] * e + m[3] * f + m[5]\n      ];\n\n      ctx._originalTransform(a, b, c, d, e, f);\n    };\n\n    ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {\n      this._transformMatrix = [a, b, c, d, e, f];\n\n      ctx._originalSetTransform(a, b, c, d, e, f);\n    };\n\n    ctx.rotate = function ctxRotate(angle) {\n      var cosValue = Math.cos(angle);\n      var sinValue = Math.sin(angle);\n\n      var m = this._transformMatrix;\n      this._transformMatrix = [\n        m[0] * cosValue + m[2] * sinValue,\n        m[1] * cosValue + m[3] * sinValue,\n        m[0] * (-sinValue) + m[2] * cosValue,\n        m[1] * (-sinValue) + m[3] * cosValue,\n        m[4],\n        m[5]\n      ];\n\n      this._originalRotate(angle);\n    };\n  }\n}\n\nvar CachedCanvases = (function CachedCanvasesClosure() {\n  var cache = {};\n  return {\n    getCanvas: function CachedCanvases_getCanvas(id, width, height,\n                                                 trackTransform) {\n      var canvasEntry;\n      if (cache[id] !== undefined) {\n        canvasEntry = cache[id];\n        canvasEntry.canvas.width = width;\n        canvasEntry.canvas.height = height;\n        // reset canvas transform for emulated mozCurrentTransform, if needed\n        canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0);\n      } else {\n        var canvas = createScratchCanvas(width, height);\n        var ctx = canvas.getContext('2d');\n        if (trackTransform) {\n          addContextCurrentTransform(ctx);\n        }\n        cache[id] = canvasEntry = {canvas: canvas, context: ctx};\n      }\n      return canvasEntry;\n    },\n    clear: function () {\n      for (var id in cache) {\n        var canvasEntry = cache[id];\n        // Zeroing the width and height causes Firefox to release graphics\n        // resources immediately, which can greatly reduce memory consumption.\n        canvasEntry.canvas.width = 0;\n        canvasEntry.canvas.height = 0;\n        delete cache[id];\n      }\n    }\n  };\n})();\n\nfunction compileType3Glyph(imgData) {\n  var POINT_TO_PROCESS_LIMIT = 1000;\n\n  var width = imgData.width, height = imgData.height;\n  var i, j, j0, width1 = width + 1;\n  var points = new Uint8Array(width1 * (height + 1));\n  var POINT_TYPES =\n      new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]);\n\n  // decodes bit-packed mask data\n  var lineSize = (width + 7) & ~7, data0 = imgData.data;\n  var data = new Uint8Array(lineSize * height), pos = 0, ii;\n  for (i = 0, ii = data0.length; i < ii; i++) {\n    var mask = 128, elem = data0[i];\n    while (mask > 0) {\n      data[pos++] = (elem & mask) ? 0 : 255;\n      mask >>= 1;\n    }\n  }\n\n  // finding iteresting points: every point is located between mask pixels,\n  // so there will be points of the (width + 1)x(height + 1) grid. Every point\n  // will have flags assigned based on neighboring mask pixels:\n  //   4 | 8\n  //   --P--\n  //   2 | 1\n  // We are interested only in points with the flags:\n  //   - outside corners: 1, 2, 4, 8;\n  //   - inside corners: 7, 11, 13, 14;\n  //   - and, intersections: 5, 10.\n  var count = 0;\n  pos = 0;\n  if (data[pos] !== 0) {\n    points[0] = 1;\n    ++count;\n  }\n  for (j = 1; j < width; j++) {\n    if (data[pos] !== data[pos + 1]) {\n      points[j] = data[pos] ? 2 : 1;\n      ++count;\n    }\n    pos++;\n  }\n  if (data[pos] !== 0) {\n    points[j] = 2;\n    ++count;\n  }\n  for (i = 1; i < height; i++) {\n    pos = i * lineSize;\n    j0 = i * width1;\n    if (data[pos - lineSize] !== data[pos]) {\n      points[j0] = data[pos] ? 1 : 8;\n      ++count;\n    }\n    // 'sum' is the position of the current pixel configuration in the 'TYPES'\n    // array (in order 8-1-2-4, so we can use '>>2' to shift the column).\n    var sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);\n    for (j = 1; j < width; j++) {\n      sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) +\n            (data[pos - lineSize + 1] ? 8 : 0);\n      if (POINT_TYPES[sum]) {\n        points[j0 + j] = POINT_TYPES[sum];\n        ++count;\n      }\n      pos++;\n    }\n    if (data[pos - lineSize] !== data[pos]) {\n      points[j0 + j] = data[pos] ? 2 : 4;\n      ++count;\n    }\n\n    if (count > POINT_TO_PROCESS_LIMIT) {\n      return null;\n    }\n  }\n\n  pos = lineSize * (height - 1);\n  j0 = i * width1;\n  if (data[pos] !== 0) {\n    points[j0] = 8;\n    ++count;\n  }\n  for (j = 1; j < width; j++) {\n    if (data[pos] !== data[pos + 1]) {\n      points[j0 + j] = data[pos] ? 4 : 8;\n      ++count;\n    }\n    pos++;\n  }\n  if (data[pos] !== 0) {\n    points[j0 + j] = 4;\n    ++count;\n  }\n  if (count > POINT_TO_PROCESS_LIMIT) {\n    return null;\n  }\n\n  // building outlines\n  var steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);\n  var outlines = [];\n  for (i = 0; count && i <= height; i++) {\n    var p = i * width1;\n    var end = p + width;\n    while (p < end && !points[p]) {\n      p++;\n    }\n    if (p === end) {\n      continue;\n    }\n    var coords = [p % width1, i];\n\n    var type = points[p], p0 = p, pp;\n    do {\n      var step = steps[type];\n      do {\n        p += step;\n      } while (!points[p]);\n\n      pp = points[p];\n      if (pp !== 5 && pp !== 10) {\n        // set new direction\n        type = pp;\n        // delete mark\n        points[p] = 0;\n      } else { // type is 5 or 10, ie, a crossing\n        // set new direction\n        type = pp & ((0x33 * type) >> 4);\n        // set new type for \"future hit\"\n        points[p] &= (type >> 2 | type << 2);\n      }\n\n      coords.push(p % width1);\n      coords.push((p / width1) | 0);\n      --count;\n    } while (p0 !== p);\n    outlines.push(coords);\n    --i;\n  }\n\n  var drawOutline = function(c) {\n    c.save();\n    // the path shall be painted in [0..1]x[0..1] space\n    c.scale(1 / width, -1 / height);\n    c.translate(0, -height);\n    c.beginPath();\n    for (var i = 0, ii = outlines.length; i < ii; i++) {\n      var o = outlines[i];\n      c.moveTo(o[0], o[1]);\n      for (var j = 2, jj = o.length; j < jj; j += 2) {\n        c.lineTo(o[j], o[j+1]);\n      }\n    }\n    c.fill();\n    c.beginPath();\n    c.restore();\n  };\n\n  return drawOutline;\n}\n\nvar CanvasExtraState = (function CanvasExtraStateClosure() {\n  function CanvasExtraState(old) {\n    // Are soft masks and alpha values shapes or opacities?\n    this.alphaIsShape = false;\n    this.fontSize = 0;\n    this.fontSizeScale = 1;\n    this.textMatrix = IDENTITY_MATRIX;\n    this.textMatrixScale = 1;\n    this.fontMatrix = FONT_IDENTITY_MATRIX;\n    this.leading = 0;\n    // Current point (in user coordinates)\n    this.x = 0;\n    this.y = 0;\n    // Start of text line (in text coordinates)\n    this.lineX = 0;\n    this.lineY = 0;\n    // Character and word spacing\n    this.charSpacing = 0;\n    this.wordSpacing = 0;\n    this.textHScale = 1;\n    this.textRenderingMode = TextRenderingMode.FILL;\n    this.textRise = 0;\n    // Default fore and background colors\n    this.fillColor = '#000000';\n    this.strokeColor = '#000000';\n    this.patternFill = false;\n    // Note: fill alpha applies to all non-stroking operations\n    this.fillAlpha = 1;\n    this.strokeAlpha = 1;\n    this.lineWidth = 1;\n    this.activeSMask = null; // nonclonable field (see the save method below)\n\n    this.old = old;\n  }\n\n  CanvasExtraState.prototype = {\n    clone: function CanvasExtraState_clone() {\n      return Object.create(this);\n    },\n    setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {\n      this.x = x;\n      this.y = y;\n    }\n  };\n  return CanvasExtraState;\n})();\n\nvar CanvasGraphics = (function CanvasGraphicsClosure() {\n  // Defines the time the executeOperatorList is going to be executing\n  // before it stops and shedules a continue of execution.\n  var EXECUTION_TIME = 15;\n  // Defines the number of steps before checking the execution time\n  var EXECUTION_STEPS = 10;\n\n  function CanvasGraphics(canvasCtx, commonObjs, objs, imageLayer) {\n    this.ctx = canvasCtx;\n    this.current = new CanvasExtraState();\n    this.stateStack = [];\n    this.pendingClip = null;\n    this.pendingEOFill = false;\n    this.res = null;\n    this.xobjs = null;\n    this.commonObjs = commonObjs;\n    this.objs = objs;\n    this.imageLayer = imageLayer;\n    this.groupStack = [];\n    this.processingType3 = null;\n    // Patterns are painted relative to the initial page/form transform, see pdf\n    // spec 8.7.2 NOTE 1.\n    this.baseTransform = null;\n    this.baseTransformStack = [];\n    this.groupLevel = 0;\n    this.smaskStack = [];\n    this.smaskCounter = 0;\n    this.tempSMask = null;\n    if (canvasCtx) {\n      // NOTE: if mozCurrentTransform is polyfilled, then the current state of\n      // the transformation must already be set in canvasCtx._transformMatrix.\n      addContextCurrentTransform(canvasCtx);\n    }\n    this.cachedGetSinglePixelWidth = null;\n  }\n\n  function putBinaryImageData(ctx, imgData) {\n    if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) {\n      ctx.putImageData(imgData, 0, 0);\n      return;\n    }\n\n    // Put the image data to the canvas in chunks, rather than putting the\n    // whole image at once.  This saves JS memory, because the ImageData object\n    // is smaller. It also possibly saves C++ memory within the implementation\n    // of putImageData(). (E.g. in Firefox we make two short-lived copies of\n    // the data passed to putImageData()). |n| shouldn't be too small, however,\n    // because too many putImageData() calls will slow things down.\n    //\n    // Note: as written, if the last chunk is partial, the putImageData() call\n    // will (conceptually) put pixels past the bounds of the canvas.  But\n    // that's ok; any such pixels are ignored.\n\n    var height = imgData.height, width = imgData.width;\n    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n\n    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n    var srcPos = 0, destPos;\n    var src = imgData.data;\n    var dest = chunkImgData.data;\n    var i, j, thisChunkHeight, elemsInThisChunk;\n\n    // There are multiple forms in which the pixel data can be passed, and\n    // imgData.kind tells us which one this is.\n    if (imgData.kind === ImageKind.GRAYSCALE_1BPP) {\n      // Grayscale, 1 bit per pixel (i.e. black-and-white).\n      var srcLength = src.byteLength;\n      var dest32 = PDFJS.hasCanvasTypedArrays ? new Uint32Array(dest.buffer) :\n        new Uint32ArrayView(dest);\n      var dest32DataLength = dest32.length;\n      var fullSrcDiff = (width + 7) >> 3;\n      var white = 0xFFFFFFFF;\n      var black = (PDFJS.isLittleEndian || !PDFJS.hasCanvasTypedArrays) ?\n        0xFF000000 : 0x000000FF;\n      for (i = 0; i < totalChunks; i++) {\n        thisChunkHeight =\n          (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n        destPos = 0;\n        for (j = 0; j < thisChunkHeight; j++) {\n          var srcDiff = srcLength - srcPos;\n          var k = 0;\n          var kEnd = (srcDiff > fullSrcDiff) ? width : srcDiff * 8 - 7;\n          var kEndUnrolled = kEnd & ~7;\n          var mask = 0;\n          var srcByte = 0;\n          for (; k < kEndUnrolled; k += 8) {\n            srcByte = src[srcPos++];\n            dest32[destPos++] = (srcByte & 128) ? white : black;\n            dest32[destPos++] = (srcByte & 64) ? white : black;\n            dest32[destPos++] = (srcByte & 32) ? white : black;\n            dest32[destPos++] = (srcByte & 16) ? white : black;\n            dest32[destPos++] = (srcByte & 8) ? white : black;\n            dest32[destPos++] = (srcByte & 4) ? white : black;\n            dest32[destPos++] = (srcByte & 2) ? white : black;\n            dest32[destPos++] = (srcByte & 1) ? white : black;\n          }\n          for (; k < kEnd; k++) {\n             if (mask === 0) {\n               srcByte = src[srcPos++];\n               mask = 128;\n             }\n\n            dest32[destPos++] = (srcByte & mask) ? white : black;\n            mask >>= 1;\n          }\n        }\n        // We ran out of input. Make all remaining pixels transparent.\n        while (destPos < dest32DataLength) {\n          dest32[destPos++] = 0;\n        }\n\n        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n      }\n    } else if (imgData.kind === ImageKind.RGBA_32BPP) {\n      // RGBA, 32-bits per pixel.\n\n      j = 0;\n      elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;\n      for (i = 0; i < fullChunks; i++) {\n        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n        srcPos += elemsInThisChunk;\n\n        ctx.putImageData(chunkImgData, 0, j);\n        j += FULL_CHUNK_HEIGHT;\n      }\n      if (i < totalChunks) {\n        elemsInThisChunk = width * partialChunkHeight * 4;\n        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n        ctx.putImageData(chunkImgData, 0, j);\n      }\n\n    } else if (imgData.kind === ImageKind.RGB_24BPP) {\n      // RGB, 24-bits per pixel.\n      thisChunkHeight = FULL_CHUNK_HEIGHT;\n      elemsInThisChunk = width * thisChunkHeight;\n      for (i = 0; i < totalChunks; i++) {\n        if (i >= fullChunks) {\n          thisChunkHeight = partialChunkHeight;\n          elemsInThisChunk = width * thisChunkHeight;\n        }\n\n        destPos = 0;\n        for (j = elemsInThisChunk; j--;) {\n          dest[destPos++] = src[srcPos++];\n          dest[destPos++] = src[srcPos++];\n          dest[destPos++] = src[srcPos++];\n          dest[destPos++] = 255;\n        }\n        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n      }\n    } else {\n      error('bad image kind: ' + imgData.kind);\n    }\n  }\n\n  function putBinaryImageMask(ctx, imgData) {\n    var height = imgData.height, width = imgData.width;\n    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n\n    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n    var srcPos = 0;\n    var src = imgData.data;\n    var dest = chunkImgData.data;\n\n    for (var i = 0; i < totalChunks; i++) {\n      var thisChunkHeight =\n        (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n\n      // Expand the mask so it can be used by the canvas.  Any required\n      // inversion has already been handled.\n      var destPos = 3; // alpha component offset\n      for (var j = 0; j < thisChunkHeight; j++) {\n        var mask = 0;\n        for (var k = 0; k < width; k++) {\n          if (!mask) {\n            var elem = src[srcPos++];\n            mask = 128;\n          }\n          dest[destPos] = (elem & mask) ? 0 : 255;\n          destPos += 4;\n          mask >>= 1;\n        }\n      }\n      ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n    }\n  }\n\n  function copyCtxState(sourceCtx, destCtx) {\n    var properties = ['strokeStyle', 'fillStyle', 'fillRule', 'globalAlpha',\n                      'lineWidth', 'lineCap', 'lineJoin', 'miterLimit',\n                      'globalCompositeOperation', 'font'];\n    for (var i = 0, ii = properties.length; i < ii; i++) {\n      var property = properties[i];\n      if (sourceCtx[property] !== undefined) {\n        destCtx[property] = sourceCtx[property];\n      }\n    }\n    if (sourceCtx.setLineDash !== undefined) {\n      destCtx.setLineDash(sourceCtx.getLineDash());\n      destCtx.lineDashOffset =  sourceCtx.lineDashOffset;\n    } else if (sourceCtx.mozDashOffset !== undefined) {\n      destCtx.mozDash = sourceCtx.mozDash;\n      destCtx.mozDashOffset = sourceCtx.mozDashOffset;\n    }\n  }\n\n  function composeSMaskBackdrop(bytes, r0, g0, b0) {\n    var length = bytes.length;\n    for (var i = 3; i < length; i += 4) {\n      var alpha = bytes[i];\n      if (alpha === 0) {\n        bytes[i - 3] = r0;\n        bytes[i - 2] = g0;\n        bytes[i - 1] = b0;\n      } else if (alpha < 255) {\n        var alpha_ = 255 - alpha;\n        bytes[i - 3] = (bytes[i - 3] * alpha + r0 * alpha_) >> 8;\n        bytes[i - 2] = (bytes[i - 2] * alpha + g0 * alpha_) >> 8;\n        bytes[i - 1] = (bytes[i - 1] * alpha + b0 * alpha_) >> 8;\n      }\n    }\n  }\n\n  function composeSMaskAlpha(maskData, layerData) {\n    var length = maskData.length;\n    var scale = 1 / 255;\n    for (var i = 3; i < length; i += 4) {\n      var alpha = maskData[i];\n      layerData[i] = (layerData[i] * alpha * scale) | 0;\n    }\n  }\n\n  function composeSMaskLuminosity(maskData, layerData) {\n    var length = maskData.length;\n    for (var i = 3; i < length; i += 4) {\n      var y = (maskData[i - 3] * 77) +  // * 0.3 / 255 * 0x10000\n              (maskData[i - 2] * 152) + // * 0.59 ....\n              (maskData[i - 1] * 28);   // * 0.11 ....\n      layerData[i] = (layerData[i] * y) >> 16;\n    }\n  }\n\n  function genericComposeSMask(maskCtx, layerCtx, width, height,\n                               subtype, backdrop) {\n    var hasBackdrop = !!backdrop;\n    var r0 = hasBackdrop ? backdrop[0] : 0;\n    var g0 = hasBackdrop ? backdrop[1] : 0;\n    var b0 = hasBackdrop ? backdrop[2] : 0;\n\n    var composeFn;\n    if (subtype === 'Luminosity') {\n      composeFn = composeSMaskLuminosity;\n    } else {\n      composeFn = composeSMaskAlpha;\n    }\n\n    // processing image in chunks to save memory\n    var PIXELS_TO_PROCESS = 1048576;\n    var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width));\n    for (var row = 0; row < height; row += chunkSize) {\n      var chunkHeight = Math.min(chunkSize, height - row);\n      var maskData = maskCtx.getImageData(0, row, width, chunkHeight);\n      var layerData = layerCtx.getImageData(0, row, width, chunkHeight);\n\n      if (hasBackdrop) {\n        composeSMaskBackdrop(maskData.data, r0, g0, b0);\n      }\n      composeFn(maskData.data, layerData.data);\n\n      maskCtx.putImageData(layerData, 0, row);\n    }\n  }\n\n  function composeSMask(ctx, smask, layerCtx) {\n    var mask = smask.canvas;\n    var maskCtx = smask.context;\n\n    ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY,\n                     smask.offsetX, smask.offsetY);\n\n    var backdrop = smask.backdrop || null;\n    if (WebGLUtils.isEnabled) {\n      var composed = WebGLUtils.composeSMask(layerCtx.canvas, mask,\n        {subtype: smask.subtype, backdrop: backdrop});\n      ctx.setTransform(1, 0, 0, 1, 0, 0);\n      ctx.drawImage(composed, smask.offsetX, smask.offsetY);\n      return;\n    }\n    genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height,\n                        smask.subtype, backdrop);\n    ctx.drawImage(mask, 0, 0);\n  }\n\n  var LINE_CAP_STYLES = ['butt', 'round', 'square'];\n  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];\n  var NORMAL_CLIP = {};\n  var EO_CLIP = {};\n\n  CanvasGraphics.prototype = {\n\n    beginDrawing: function CanvasGraphics_beginDrawing(viewport, transparency) {\n      // For pdfs that use blend modes we have to clear the canvas else certain\n      // blend modes can look wrong since we'd be blending with a white\n      // backdrop. The problem with a transparent backdrop though is we then\n      // don't get sub pixel anti aliasing on text, so we fill with white if\n      // we can.\n      var width = this.ctx.canvas.width;\n      var height = this.ctx.canvas.height;\n      if (transparency) {\n        this.ctx.clearRect(0, 0, width, height);\n      } else {\n        this.ctx.mozOpaque = true;\n        this.ctx.save();\n        this.ctx.fillStyle = 'rgb(255, 255, 255)';\n        this.ctx.fillRect(0, 0, width, height);\n        this.ctx.restore();\n      }\n\n      var transform = viewport.transform;\n\n      this.ctx.save();\n      this.ctx.transform.apply(this.ctx, transform);\n\n      this.baseTransform = this.ctx.mozCurrentTransform.slice();\n\n      if (this.imageLayer) {\n        this.imageLayer.beginLayout();\n      }\n    },\n\n    executeOperatorList: function CanvasGraphics_executeOperatorList(\n                                    operatorList,\n                                    executionStartIdx, continueCallback,\n                                    stepper) {\n      var argsArray = operatorList.argsArray;\n      var fnArray = operatorList.fnArray;\n      var i = executionStartIdx || 0;\n      var argsArrayLen = argsArray.length;\n\n      // Sometimes the OperatorList to execute is empty.\n      if (argsArrayLen === i) {\n        return i;\n      }\n\n      var chunkOperations = (argsArrayLen - i > EXECUTION_STEPS &&\n                             typeof continueCallback === 'function');\n      var endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;\n      var steps = 0;\n\n      var commonObjs = this.commonObjs;\n      var objs = this.objs;\n      var fnId;\n\n      while (true) {\n        if (stepper !== undefined && i === stepper.nextBreakPoint) {\n          stepper.breakIt(i, continueCallback);\n          return i;\n        }\n\n        fnId = fnArray[i];\n\n        if (fnId !== OPS.dependency) {\n          this[fnId].apply(this, argsArray[i]);\n        } else {\n          var deps = argsArray[i];\n          for (var n = 0, nn = deps.length; n < nn; n++) {\n            var depObjId = deps[n];\n            var common = depObjId[0] === 'g' && depObjId[1] === '_';\n            var objsPool = common ? commonObjs : objs;\n\n            // If the promise isn't resolved yet, add the continueCallback\n            // to the promise and bail out.\n            if (!objsPool.isResolved(depObjId)) {\n              objsPool.get(depObjId, continueCallback);\n              return i;\n            }\n          }\n        }\n\n        i++;\n\n        // If the entire operatorList was executed, stop as were done.\n        if (i === argsArrayLen) {\n          return i;\n        }\n\n        // If the execution took longer then a certain amount of time and\n        // `continueCallback` is specified, interrupt the execution.\n        if (chunkOperations && ++steps > EXECUTION_STEPS) {\n          if (Date.now() > endTime) {\n            continueCallback();\n            return i;\n          }\n          steps = 0;\n        }\n\n        // If the operatorList isn't executed completely yet OR the execution\n        // time was short enough, do another execution round.\n      }\n    },\n\n    endDrawing: function CanvasGraphics_endDrawing() {\n      this.ctx.restore();\n      CachedCanvases.clear();\n      WebGLUtils.clear();\n\n      if (this.imageLayer) {\n        this.imageLayer.endLayout();\n      }\n    },\n\n    // Graphics state\n    setLineWidth: function CanvasGraphics_setLineWidth(width) {\n      this.current.lineWidth = width;\n      this.ctx.lineWidth = width;\n    },\n    setLineCap: function CanvasGraphics_setLineCap(style) {\n      this.ctx.lineCap = LINE_CAP_STYLES[style];\n    },\n    setLineJoin: function CanvasGraphics_setLineJoin(style) {\n      this.ctx.lineJoin = LINE_JOIN_STYLES[style];\n    },\n    setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {\n      this.ctx.miterLimit = limit;\n    },\n    setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {\n      var ctx = this.ctx;\n      if (ctx.setLineDash !== undefined) {\n        ctx.setLineDash(dashArray);\n        ctx.lineDashOffset = dashPhase;\n      } else {\n        ctx.mozDash = dashArray;\n        ctx.mozDashOffset = dashPhase;\n      }\n    },\n    setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {\n      // Maybe if we one day fully support color spaces this will be important\n      // for now we can ignore.\n      // TODO set rendering intent?\n    },\n    setFlatness: function CanvasGraphics_setFlatness(flatness) {\n      // There's no way to control this with canvas, but we can safely ignore.\n      // TODO set flatness?\n    },\n    setGState: function CanvasGraphics_setGState(states) {\n      for (var i = 0, ii = states.length; i < ii; i++) {\n        var state = states[i];\n        var key = state[0];\n        var value = state[1];\n\n        switch (key) {\n          case 'LW':\n            this.setLineWidth(value);\n            break;\n          case 'LC':\n            this.setLineCap(value);\n            break;\n          case 'LJ':\n            this.setLineJoin(value);\n            break;\n          case 'ML':\n            this.setMiterLimit(value);\n            break;\n          case 'D':\n            this.setDash(value[0], value[1]);\n            break;\n          case 'RI':\n            this.setRenderingIntent(value);\n            break;\n          case 'FL':\n            this.setFlatness(value);\n            break;\n          case 'Font':\n            this.setFont(value[0], value[1]);\n            break;\n          case 'CA':\n            this.current.strokeAlpha = state[1];\n            break;\n          case 'ca':\n            this.current.fillAlpha = state[1];\n            this.ctx.globalAlpha = state[1];\n            break;\n          case 'BM':\n            if (value && value.name && (value.name !== 'Normal')) {\n              var mode = value.name.replace(/([A-Z])/g,\n                function(c) {\n                  return '-' + c.toLowerCase();\n                }\n              ).substring(1);\n              this.ctx.globalCompositeOperation = mode;\n              if (this.ctx.globalCompositeOperation !== mode) {\n                warn('globalCompositeOperation \"' + mode +\n                     '\" is not supported');\n              }\n            } else {\n              this.ctx.globalCompositeOperation = 'source-over';\n            }\n            break;\n          case 'SMask':\n            if (this.current.activeSMask) {\n              this.endSMaskGroup();\n            }\n            this.current.activeSMask = value ? this.tempSMask : null;\n            if (this.current.activeSMask) {\n              this.beginSMaskGroup();\n            }\n            this.tempSMask = null;\n            break;\n        }\n      }\n    },\n    beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() {\n\n      var activeSMask = this.current.activeSMask;\n      var drawnWidth = activeSMask.canvas.width;\n      var drawnHeight = activeSMask.canvas.height;\n      var cacheId = 'smaskGroupAt' + this.groupLevel;\n      var scratchCanvas = CachedCanvases.getCanvas(\n        cacheId, drawnWidth, drawnHeight, true);\n\n      var currentCtx = this.ctx;\n      var currentTransform = currentCtx.mozCurrentTransform;\n      this.ctx.save();\n\n      var groupCtx = scratchCanvas.context;\n      groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY);\n      groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY);\n      groupCtx.transform.apply(groupCtx, currentTransform);\n\n      copyCtxState(currentCtx, groupCtx);\n      this.ctx = groupCtx;\n      this.setGState([\n        ['BM', 'Normal'],\n        ['ca', 1],\n        ['CA', 1]\n      ]);\n      this.groupStack.push(currentCtx);\n      this.groupLevel++;\n    },\n    endSMaskGroup: function CanvasGraphics_endSMaskGroup() {\n      var groupCtx = this.ctx;\n      this.groupLevel--;\n      this.ctx = this.groupStack.pop();\n\n      composeSMask(this.ctx, this.current.activeSMask, groupCtx);\n      this.ctx.restore();\n    },\n    save: function CanvasGraphics_save() {\n      this.ctx.save();\n      var old = this.current;\n      this.stateStack.push(old);\n      this.current = old.clone();\n      this.current.activeSMask = null;\n    },\n    restore: function CanvasGraphics_restore() {\n      if (this.stateStack.length !== 0) {\n        if (this.current.activeSMask !== null) {\n          this.endSMaskGroup();\n        }\n\n        this.current = this.stateStack.pop();\n        this.ctx.restore();\n\n        this.cachedGetSinglePixelWidth = null;\n      }\n    },\n    transform: function CanvasGraphics_transform(a, b, c, d, e, f) {\n      this.ctx.transform(a, b, c, d, e, f);\n\n      this.cachedGetSinglePixelWidth = null;\n    },\n\n    // Path\n    constructPath: function CanvasGraphics_constructPath(ops, args) {\n      var ctx = this.ctx;\n      var current = this.current;\n      var x = current.x, y = current.y;\n      for (var i = 0, j = 0, ii = ops.length; i < ii; i++) {\n        switch (ops[i] | 0) {\n          case OPS.rectangle:\n            x = args[j++];\n            y = args[j++];\n            var width = args[j++];\n            var height = args[j++];\n            if (width === 0) {\n              width = this.getSinglePixelWidth();\n            }\n            if (height === 0) {\n              height = this.getSinglePixelWidth();\n            }\n            var xw = x + width;\n            var yh = y + height;\n            this.ctx.moveTo(x, y);\n            this.ctx.lineTo(xw, y);\n            this.ctx.lineTo(xw, yh);\n            this.ctx.lineTo(x, yh);\n            this.ctx.lineTo(x, y);\n            this.ctx.closePath();\n            break;\n          case OPS.moveTo:\n            x = args[j++];\n            y = args[j++];\n            ctx.moveTo(x, y);\n            break;\n          case OPS.lineTo:\n            x = args[j++];\n            y = args[j++];\n            ctx.lineTo(x, y);\n            break;\n          case OPS.curveTo:\n            x = args[j + 4];\n            y = args[j + 5];\n            ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3],\n                              x, y);\n            j += 6;\n            break;\n          case OPS.curveTo2:\n            ctx.bezierCurveTo(x, y, args[j], args[j + 1],\n                              args[j + 2], args[j + 3]);\n            x = args[j + 2];\n            y = args[j + 3];\n            j += 4;\n            break;\n          case OPS.curveTo3:\n            x = args[j + 2];\n            y = args[j + 3];\n            ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y);\n            j += 4;\n            break;\n          case OPS.closePath:\n            ctx.closePath();\n            break;\n        }\n      }\n      current.setCurrentPoint(x, y);\n    },\n    closePath: function CanvasGraphics_closePath() {\n      this.ctx.closePath();\n    },\n    stroke: function CanvasGraphics_stroke(consumePath) {\n      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;\n      var ctx = this.ctx;\n      var strokeColor = this.current.strokeColor;\n      // Prevent drawing too thin lines by enforcing a minimum line width.\n      ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR,\n                               this.current.lineWidth);\n      // For stroke we want to temporarily change the global alpha to the\n      // stroking alpha.\n      ctx.globalAlpha = this.current.strokeAlpha;\n      if (strokeColor && strokeColor.hasOwnProperty('type') &&\n          strokeColor.type === 'Pattern') {\n        // for patterns, we transform to pattern space, calculate\n        // the pattern, call stroke, and restore to user space\n        ctx.save();\n        ctx.strokeStyle = strokeColor.getPattern(ctx, this);\n        ctx.stroke();\n        ctx.restore();\n      } else {\n        ctx.stroke();\n      }\n      if (consumePath) {\n        this.consumePath();\n      }\n      // Restore the global alpha to the fill alpha\n      ctx.globalAlpha = this.current.fillAlpha;\n    },\n    closeStroke: function CanvasGraphics_closeStroke() {\n      this.closePath();\n      this.stroke();\n    },\n    fill: function CanvasGraphics_fill(consumePath) {\n      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;\n      var ctx = this.ctx;\n      var fillColor = this.current.fillColor;\n      var isPatternFill = this.current.patternFill;\n      var needRestore = false;\n\n      if (isPatternFill) {\n        ctx.save();\n        ctx.fillStyle = fillColor.getPattern(ctx, this);\n        needRestore = true;\n      }\n\n      if (this.pendingEOFill) {\n        if (ctx.mozFillRule !== undefined) {\n          ctx.mozFillRule = 'evenodd';\n          ctx.fill();\n          ctx.mozFillRule = 'nonzero';\n        } else {\n          try {\n            ctx.fill('evenodd');\n          } catch (ex) {\n            // shouldn't really happen, but browsers might think differently\n            ctx.fill();\n          }\n        }\n        this.pendingEOFill = false;\n      } else {\n        ctx.fill();\n      }\n\n      if (needRestore) {\n        ctx.restore();\n      }\n      if (consumePath) {\n        this.consumePath();\n      }\n    },\n    eoFill: function CanvasGraphics_eoFill() {\n      this.pendingEOFill = true;\n      this.fill();\n    },\n    fillStroke: function CanvasGraphics_fillStroke() {\n      this.fill(false);\n      this.stroke(false);\n\n      this.consumePath();\n    },\n    eoFillStroke: function CanvasGraphics_eoFillStroke() {\n      this.pendingEOFill = true;\n      this.fillStroke();\n    },\n    closeFillStroke: function CanvasGraphics_closeFillStroke() {\n      this.closePath();\n      this.fillStroke();\n    },\n    closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {\n      this.pendingEOFill = true;\n      this.closePath();\n      this.fillStroke();\n    },\n    endPath: function CanvasGraphics_endPath() {\n      this.consumePath();\n    },\n\n    // Clipping\n    clip: function CanvasGraphics_clip() {\n      this.pendingClip = NORMAL_CLIP;\n    },\n    eoClip: function CanvasGraphics_eoClip() {\n      this.pendingClip = EO_CLIP;\n    },\n\n    // Text\n    beginText: function CanvasGraphics_beginText() {\n      this.current.textMatrix = IDENTITY_MATRIX;\n      this.current.textMatrixScale = 1;\n      this.current.x = this.current.lineX = 0;\n      this.current.y = this.current.lineY = 0;\n    },\n    endText: function CanvasGraphics_endText() {\n      var paths = this.pendingTextPaths;\n      var ctx = this.ctx;\n      if (paths === undefined) {\n        ctx.beginPath();\n        return;\n      }\n\n      ctx.save();\n      ctx.beginPath();\n      for (var i = 0; i < paths.length; i++) {\n        var path = paths[i];\n        ctx.setTransform.apply(ctx, path.transform);\n        ctx.translate(path.x, path.y);\n        path.addToPath(ctx, path.fontSize);\n      }\n      ctx.restore();\n      ctx.clip();\n      ctx.beginPath();\n      delete this.pendingTextPaths;\n    },\n    setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {\n      this.current.charSpacing = spacing;\n    },\n    setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {\n      this.current.wordSpacing = spacing;\n    },\n    setHScale: function CanvasGraphics_setHScale(scale) {\n      this.current.textHScale = scale / 100;\n    },\n    setLeading: function CanvasGraphics_setLeading(leading) {\n      this.current.leading = -leading;\n    },\n    setFont: function CanvasGraphics_setFont(fontRefName, size) {\n      var fontObj = this.commonObjs.get(fontRefName);\n      var current = this.current;\n\n      if (!fontObj) {\n        error('Can\\'t find font for ' + fontRefName);\n      }\n\n      current.fontMatrix = (fontObj.fontMatrix ?\n                            fontObj.fontMatrix : FONT_IDENTITY_MATRIX);\n\n      // A valid matrix needs all main diagonal elements to be non-zero\n      // This also ensures we bypass FF bugzilla bug #719844.\n      if (current.fontMatrix[0] === 0 ||\n          current.fontMatrix[3] === 0) {\n        warn('Invalid font matrix for font ' + fontRefName);\n      }\n\n      // The spec for Tf (setFont) says that 'size' specifies the font 'scale',\n      // and in some docs this can be negative (inverted x-y axes).\n      if (size < 0) {\n        size = -size;\n        current.fontDirection = -1;\n      } else {\n        current.fontDirection = 1;\n      }\n\n      this.current.font = fontObj;\n      this.current.fontSize = size;\n\n      if (fontObj.isType3Font) {\n        return; // we don't need ctx.font for Type3 fonts\n      }\n\n      var name = fontObj.loadedName || 'sans-serif';\n      var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :\n                                 (fontObj.bold ? 'bold' : 'normal');\n\n      var italic = fontObj.italic ? 'italic' : 'normal';\n      var typeface = '\"' + name + '\", ' + fontObj.fallbackName;\n\n      // Some font backends cannot handle fonts below certain size.\n      // Keeping the font at minimal size and using the fontSizeScale to change\n      // the current transformation matrix before the fillText/strokeText.\n      // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227\n      var browserFontSize = size < MIN_FONT_SIZE ? MIN_FONT_SIZE :\n                            size > MAX_FONT_SIZE ? MAX_FONT_SIZE : size;\n      this.current.fontSizeScale = size / browserFontSize;\n\n      var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;\n      this.ctx.font = rule;\n    },\n    setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {\n      this.current.textRenderingMode = mode;\n    },\n    setTextRise: function CanvasGraphics_setTextRise(rise) {\n      this.current.textRise = rise;\n    },\n    moveText: function CanvasGraphics_moveText(x, y) {\n      this.current.x = this.current.lineX += x;\n      this.current.y = this.current.lineY += y;\n    },\n    setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {\n      this.setLeading(-y);\n      this.moveText(x, y);\n    },\n    setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {\n      this.current.textMatrix = [a, b, c, d, e, f];\n      this.current.textMatrixScale = Math.sqrt(a * a + b * b);\n\n      this.current.x = this.current.lineX = 0;\n      this.current.y = this.current.lineY = 0;\n    },\n    nextLine: function CanvasGraphics_nextLine() {\n      this.moveText(0, this.current.leading);\n    },\n\n    paintChar: function CanvasGraphics_paintChar(character, x, y) {\n      var ctx = this.ctx;\n      var current = this.current;\n      var font = current.font;\n      var textRenderingMode = current.textRenderingMode;\n      var fontSize = current.fontSize / current.fontSizeScale;\n      var fillStrokeMode = textRenderingMode &\n        TextRenderingMode.FILL_STROKE_MASK;\n      var isAddToPathSet = !!(textRenderingMode &\n        TextRenderingMode.ADD_TO_PATH_FLAG);\n\n      var addToPath;\n      if (font.disableFontFace || isAddToPathSet) {\n        addToPath = font.getPathGenerator(this.commonObjs, character);\n      }\n\n      if (font.disableFontFace) {\n        ctx.save();\n        ctx.translate(x, y);\n        ctx.beginPath();\n        addToPath(ctx, fontSize);\n        if (fillStrokeMode === TextRenderingMode.FILL ||\n            fillStrokeMode === TextRenderingMode.FILL_STROKE) {\n          ctx.fill();\n        }\n        if (fillStrokeMode === TextRenderingMode.STROKE ||\n            fillStrokeMode === TextRenderingMode.FILL_STROKE) {\n          ctx.stroke();\n        }\n        ctx.restore();\n      } else {\n        if (fillStrokeMode === TextRenderingMode.FILL ||\n            fillStrokeMode === TextRenderingMode.FILL_STROKE) {\n          ctx.fillText(character, x, y);\n        }\n        if (fillStrokeMode === TextRenderingMode.STROKE ||\n            fillStrokeMode === TextRenderingMode.FILL_STROKE) {\n          ctx.strokeText(character, x, y);\n        }\n      }\n\n      if (isAddToPathSet) {\n        var paths = this.pendingTextPaths || (this.pendingTextPaths = []);\n        paths.push({\n          transform: ctx.mozCurrentTransform,\n          x: x,\n          y: y,\n          fontSize: fontSize,\n          addToPath: addToPath\n        });\n      }\n    },\n\n    get isFontSubpixelAAEnabled() {\n      // Checks if anti-aliasing is enabled when scaled text is painted.\n      // On Windows GDI scaled fonts looks bad.\n      var ctx = document.createElement('canvas').getContext('2d');\n      ctx.scale(1.5, 1);\n      ctx.fillText('I', 0, 10);\n      var data = ctx.getImageData(0, 0, 10, 10).data;\n      var enabled = false;\n      for (var i = 3; i < data.length; i += 4) {\n        if (data[i] > 0 && data[i] < 255) {\n          enabled = true;\n          break;\n        }\n      }\n      return shadow(this, 'isFontSubpixelAAEnabled', enabled);\n    },\n\n    showText: function CanvasGraphics_showText(glyphs) {\n      var current = this.current;\n      var font = current.font;\n      if (font.isType3Font) {\n        return this.showType3Text(glyphs);\n      }\n\n      var fontSize = current.fontSize;\n      if (fontSize === 0) {\n        return;\n      }\n\n      var ctx = this.ctx;\n      var fontSizeScale = current.fontSizeScale;\n      var charSpacing = current.charSpacing;\n      var wordSpacing = current.wordSpacing;\n      var fontDirection = current.fontDirection;\n      var textHScale = current.textHScale * fontDirection;\n      var glyphsLength = glyphs.length;\n      var vertical = font.vertical;\n      var defaultVMetrics = font.defaultVMetrics;\n      var widthAdvanceScale = fontSize * current.fontMatrix[0];\n\n      var simpleFillText =\n        current.textRenderingMode === TextRenderingMode.FILL &&\n        !font.disableFontFace;\n\n      ctx.save();\n      ctx.transform.apply(ctx, current.textMatrix);\n      ctx.translate(current.x, current.y + current.textRise);\n\n      if (fontDirection > 0) {\n        ctx.scale(textHScale, -1);\n      } else {\n        ctx.scale(textHScale, 1);\n      }\n\n      var lineWidth = current.lineWidth;\n      var scale = current.textMatrixScale;\n      if (scale === 0 || lineWidth === 0) {\n        var fillStrokeMode = current.textRenderingMode &\n          TextRenderingMode.FILL_STROKE_MASK;\n        if (fillStrokeMode === TextRenderingMode.STROKE ||\n            fillStrokeMode === TextRenderingMode.FILL_STROKE) {\n          this.cachedGetSinglePixelWidth = null;\n          lineWidth = this.getSinglePixelWidth() * MIN_WIDTH_FACTOR;\n        }\n      } else {\n        lineWidth /= scale;\n      }\n\n      if (fontSizeScale !== 1.0) {\n        ctx.scale(fontSizeScale, fontSizeScale);\n        lineWidth /= fontSizeScale;\n      }\n\n      ctx.lineWidth = lineWidth;\n\n      var x = 0, i;\n      for (i = 0; i < glyphsLength; ++i) {\n        var glyph = glyphs[i];\n        if (glyph === null) {\n          // word break\n          x += fontDirection * wordSpacing;\n          continue;\n        } else if (isNum(glyph)) {\n          x += -glyph * fontSize * 0.001;\n          continue;\n        }\n\n        var restoreNeeded = false;\n        var character = glyph.fontChar;\n        var accent = glyph.accent;\n        var scaledX, scaledY, scaledAccentX, scaledAccentY;\n        var width = glyph.width;\n        if (vertical) {\n          var vmetric, vx, vy;\n          vmetric = glyph.vmetric || defaultVMetrics;\n          vx = glyph.vmetric ? vmetric[1] : width * 0.5;\n          vx = -vx * widthAdvanceScale;\n          vy = vmetric[2] * widthAdvanceScale;\n\n          width = vmetric ? -vmetric[0] : width;\n          scaledX = vx / fontSizeScale;\n          scaledY = (x + vy) / fontSizeScale;\n        } else {\n          scaledX = x / fontSizeScale;\n          scaledY = 0;\n        }\n\n        if (font.remeasure && width > 0 && this.isFontSubpixelAAEnabled) {\n          // some standard fonts may not have the exact width, trying to\n          // rescale per character\n          var measuredWidth = ctx.measureText(character).width * 1000 /\n            fontSize * fontSizeScale;\n          var characterScaleX = width / measuredWidth;\n          restoreNeeded = true;\n          ctx.save();\n          ctx.scale(characterScaleX, 1);\n          scaledX /= characterScaleX;\n        }\n\n        if (simpleFillText && !accent) {\n          // common case\n          ctx.fillText(character, scaledX, scaledY);\n        } else {\n          this.paintChar(character, scaledX, scaledY);\n          if (accent) {\n            scaledAccentX = scaledX + accent.offset.x / fontSizeScale;\n            scaledAccentY = scaledY - accent.offset.y / fontSizeScale;\n            this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY);\n          }\n        }\n\n        var charWidth = width * widthAdvanceScale + charSpacing * fontDirection;\n        x += charWidth;\n\n        if (restoreNeeded) {\n          ctx.restore();\n        }\n      }\n      if (vertical) {\n        current.y -= x * textHScale;\n      } else {\n        current.x += x * textHScale;\n      }\n      ctx.restore();\n    },\n\n    showType3Text: function CanvasGraphics_showType3Text(glyphs) {\n      // Type3 fonts - each glyph is a \"mini-PDF\"\n      var ctx = this.ctx;\n      var current = this.current;\n      var font = current.font;\n      var fontSize = current.fontSize;\n      var fontDirection = current.fontDirection;\n      var charSpacing = current.charSpacing;\n      var wordSpacing = current.wordSpacing;\n      var textHScale = current.textHScale * fontDirection;\n      var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX;\n      var glyphsLength = glyphs.length;\n      var isTextInvisible =\n        current.textRenderingMode === TextRenderingMode.INVISIBLE;\n      var i, glyph, width;\n\n      if (isTextInvisible || fontSize === 0) {\n        return;\n      }\n\n      ctx.save();\n      ctx.transform.apply(ctx, current.textMatrix);\n      ctx.translate(current.x, current.y);\n\n      ctx.scale(textHScale, fontDirection);\n\n      for (i = 0; i < glyphsLength; ++i) {\n        glyph = glyphs[i];\n        if (glyph === null) {\n          // word break\n          this.ctx.translate(wordSpacing, 0);\n          current.x += wordSpacing * textHScale;\n          continue;\n        } else if (isNum(glyph)) {\n          var spacingLength = -glyph * 0.001 * fontSize;\n          this.ctx.translate(spacingLength, 0);\n          current.x += spacingLength * textHScale;\n          continue;\n        }\n\n        var operatorList = font.charProcOperatorList[glyph.operatorListId];\n        if (!operatorList) {\n          warn('Type3 character \\\"' + glyph.operatorListId +\n               '\\\" is not available');\n          continue;\n        }\n        this.processingType3 = glyph;\n        this.save();\n        ctx.scale(fontSize, fontSize);\n        ctx.transform.apply(ctx, fontMatrix);\n        this.executeOperatorList(operatorList);\n        this.restore();\n\n        var transformed = Util.applyTransform([glyph.width, 0], fontMatrix);\n        width = transformed[0] * fontSize + charSpacing;\n\n        ctx.translate(width, 0);\n        current.x += width * textHScale;\n      }\n      ctx.restore();\n      this.processingType3 = null;\n    },\n\n    // Type3 fonts\n    setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {\n      // We can safely ignore this since the width should be the same\n      // as the width in the Widths array.\n    },\n    setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth,\n                                                                        yWidth,\n                                                                        llx,\n                                                                        lly,\n                                                                        urx,\n                                                                        ury) {\n      // TODO According to the spec we're also suppose to ignore any operators\n      // that set color or include images while processing this type3 font.\n      this.ctx.rect(llx, lly, urx - llx, ury - lly);\n      this.clip();\n      this.endPath();\n    },\n\n    // Color\n    getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) {\n      var pattern;\n      if (IR[0] === 'TilingPattern') {\n        var color = IR[1];\n        pattern = new TilingPattern(IR, color, this.ctx, this.objs,\n                                    this.commonObjs, this.baseTransform);\n      } else {\n        pattern = getShadingPatternFromIR(IR);\n      }\n      return pattern;\n    },\n    setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) {\n      this.current.strokeColor = this.getColorN_Pattern(arguments);\n    },\n    setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) {\n      this.current.fillColor = this.getColorN_Pattern(arguments);\n      this.current.patternFill = true;\n    },\n    setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {\n      var color = Util.makeCssRgb(r, g, b);\n      this.ctx.strokeStyle = color;\n      this.current.strokeColor = color;\n    },\n    setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {\n      var color = Util.makeCssRgb(r, g, b);\n      this.ctx.fillStyle = color;\n      this.current.fillColor = color;\n      this.current.patternFill = false;\n    },\n\n    shadingFill: function CanvasGraphics_shadingFill(patternIR) {\n      var ctx = this.ctx;\n\n      this.save();\n      var pattern = getShadingPatternFromIR(patternIR);\n      ctx.fillStyle = pattern.getPattern(ctx, this, true);\n\n      var inv = ctx.mozCurrentTransformInverse;\n      if (inv) {\n        var canvas = ctx.canvas;\n        var width = canvas.width;\n        var height = canvas.height;\n\n        var bl = Util.applyTransform([0, 0], inv);\n        var br = Util.applyTransform([0, height], inv);\n        var ul = Util.applyTransform([width, 0], inv);\n        var ur = Util.applyTransform([width, height], inv);\n\n        var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);\n        var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);\n        var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);\n        var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);\n\n        this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);\n      } else {\n        // HACK to draw the gradient onto an infinite rectangle.\n        // PDF gradients are drawn across the entire image while\n        // Canvas only allows gradients to be drawn in a rectangle\n        // The following bug should allow us to remove this.\n        // https://bugzilla.mozilla.org/show_bug.cgi?id=664884\n\n        this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);\n      }\n\n      this.restore();\n    },\n\n    // Images\n    beginInlineImage: function CanvasGraphics_beginInlineImage() {\n      error('Should not call beginInlineImage');\n    },\n    beginImageData: function CanvasGraphics_beginImageData() {\n      error('Should not call beginImageData');\n    },\n\n    paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix,\n                                                                        bbox) {\n      this.save();\n      this.baseTransformStack.push(this.baseTransform);\n\n      if (isArray(matrix) && 6 === matrix.length) {\n        this.transform.apply(this, matrix);\n      }\n\n      this.baseTransform = this.ctx.mozCurrentTransform;\n\n      if (isArray(bbox) && 4 === bbox.length) {\n        var width = bbox[2] - bbox[0];\n        var height = bbox[3] - bbox[1];\n        this.ctx.rect(bbox[0], bbox[1], width, height);\n        this.clip();\n        this.endPath();\n      }\n    },\n\n    paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {\n      this.restore();\n      this.baseTransform = this.baseTransformStack.pop();\n    },\n\n    beginGroup: function CanvasGraphics_beginGroup(group) {\n      this.save();\n      var currentCtx = this.ctx;\n      // TODO non-isolated groups - according to Rik at adobe non-isolated\n      // group results aren't usually that different and they even have tools\n      // that ignore this setting. Notes from Rik on implmenting:\n      // - When you encounter an transparency group, create a new canvas with\n      // the dimensions of the bbox\n      // - copy the content from the previous canvas to the new canvas\n      // - draw as usual\n      // - remove the backdrop alpha:\n      // alphaNew = 1 - (1 - alpha)/(1 - alphaBackdrop) with 'alpha' the alpha\n      // value of your transparency group and 'alphaBackdrop' the alpha of the\n      // backdrop\n      // - remove background color:\n      // colorNew = color - alphaNew *colorBackdrop /(1 - alphaNew)\n      if (!group.isolated) {\n        info('TODO: Support non-isolated groups.');\n      }\n\n      // TODO knockout - supposedly possible with the clever use of compositing\n      // modes.\n      if (group.knockout) {\n        warn('Knockout groups not supported.');\n      }\n\n      var currentTransform = currentCtx.mozCurrentTransform;\n      if (group.matrix) {\n        currentCtx.transform.apply(currentCtx, group.matrix);\n      }\n      assert(group.bbox, 'Bounding box is required.');\n\n      // Based on the current transform figure out how big the bounding box\n      // will actually be.\n      var bounds = Util.getAxialAlignedBoundingBox(\n                    group.bbox,\n                    currentCtx.mozCurrentTransform);\n      // Clip the bounding box to the current canvas.\n      var canvasBounds = [0,\n                          0,\n                          currentCtx.canvas.width,\n                          currentCtx.canvas.height];\n      bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];\n      // Use ceil in case we're between sizes so we don't create canvas that is\n      // too small and make the canvas at least 1x1 pixels.\n      var offsetX = Math.floor(bounds[0]);\n      var offsetY = Math.floor(bounds[1]);\n      var drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);\n      var drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);\n      var scaleX = 1, scaleY = 1;\n      if (drawnWidth > MAX_GROUP_SIZE) {\n        scaleX = drawnWidth / MAX_GROUP_SIZE;\n        drawnWidth = MAX_GROUP_SIZE;\n      }\n      if (drawnHeight > MAX_GROUP_SIZE) {\n        scaleY = drawnHeight / MAX_GROUP_SIZE;\n        drawnHeight = MAX_GROUP_SIZE;\n      }\n\n      var cacheId = 'groupAt' + this.groupLevel;\n      if (group.smask) {\n        // Using two cache entries is case if masks are used one after another.\n        cacheId +=  '_smask_' + ((this.smaskCounter++) % 2);\n      }\n      var scratchCanvas = CachedCanvases.getCanvas(\n        cacheId, drawnWidth, drawnHeight, true);\n      var groupCtx = scratchCanvas.context;\n\n      // Since we created a new canvas that is just the size of the bounding box\n      // we have to translate the group ctx.\n      groupCtx.scale(1 / scaleX, 1 / scaleY);\n      groupCtx.translate(-offsetX, -offsetY);\n      groupCtx.transform.apply(groupCtx, currentTransform);\n\n      if (group.smask) {\n        // Saving state and cached mask to be used in setGState.\n        this.smaskStack.push({\n          canvas: scratchCanvas.canvas,\n          context: groupCtx,\n          offsetX: offsetX,\n          offsetY: offsetY,\n          scaleX: scaleX,\n          scaleY: scaleY,\n          subtype: group.smask.subtype,\n          backdrop: group.smask.backdrop\n        });\n      } else {\n        // Setup the current ctx so when the group is popped we draw it at the\n        // right location.\n        currentCtx.setTransform(1, 0, 0, 1, 0, 0);\n        currentCtx.translate(offsetX, offsetY);\n        currentCtx.scale(scaleX, scaleY);\n      }\n      // The transparency group inherits all off the current graphics state\n      // except the blend mode, soft mask, and alpha constants.\n      copyCtxState(currentCtx, groupCtx);\n      this.ctx = groupCtx;\n      this.setGState([\n        ['BM', 'Normal'],\n        ['ca', 1],\n        ['CA', 1]\n      ]);\n      this.groupStack.push(currentCtx);\n      this.groupLevel++;\n    },\n\n    endGroup: function CanvasGraphics_endGroup(group) {\n      this.groupLevel--;\n      var groupCtx = this.ctx;\n      this.ctx = this.groupStack.pop();\n      // Turn off image smoothing to avoid sub pixel interpolation which can\n      // look kind of blurry for some pdfs.\n      if (this.ctx.imageSmoothingEnabled !== undefined) {\n        this.ctx.imageSmoothingEnabled = false;\n      } else {\n        this.ctx.mozImageSmoothingEnabled = false;\n      }\n      if (group.smask) {\n        this.tempSMask = this.smaskStack.pop();\n      } else {\n        this.ctx.drawImage(groupCtx.canvas, 0, 0);\n      }\n      this.restore();\n    },\n\n    beginAnnotations: function CanvasGraphics_beginAnnotations() {\n      this.save();\n      this.current = new CanvasExtraState();\n    },\n\n    endAnnotations: function CanvasGraphics_endAnnotations() {\n      this.restore();\n    },\n\n    beginAnnotation: function CanvasGraphics_beginAnnotation(rect, transform,\n                                                             matrix) {\n      this.save();\n\n      if (isArray(rect) && 4 === rect.length) {\n        var width = rect[2] - rect[0];\n        var height = rect[3] - rect[1];\n        this.ctx.rect(rect[0], rect[1], width, height);\n        this.clip();\n        this.endPath();\n      }\n\n      this.transform.apply(this, transform);\n      this.transform.apply(this, matrix);\n    },\n\n    endAnnotation: function CanvasGraphics_endAnnotation() {\n      this.restore();\n    },\n\n    paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {\n      var domImage = this.objs.get(objId);\n      if (!domImage) {\n        warn('Dependent image isn\\'t ready yet');\n        return;\n      }\n\n      this.save();\n\n      var ctx = this.ctx;\n      // scale the image to the unit square\n      ctx.scale(1 / w, -1 / h);\n\n      ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,\n                    0, -h, w, h);\n      if (this.imageLayer) {\n        var currentTransform = ctx.mozCurrentTransformInverse;\n        var position = this.getCanvasPosition(0, 0);\n        this.imageLayer.appendImage({\n          objId: objId,\n          left: position[0],\n          top: position[1],\n          width: w / currentTransform[0],\n          height: h / currentTransform[3]\n        });\n      }\n      this.restore();\n    },\n\n    paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(img) {\n      var ctx = this.ctx;\n      var width = img.width, height = img.height;\n      var fillColor = this.current.fillColor;\n      var isPatternFill = this.current.patternFill;\n\n      var glyph = this.processingType3;\n\n      if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) {\n        if (width <= MAX_SIZE_TO_COMPILE && height <= MAX_SIZE_TO_COMPILE) {\n          glyph.compiled =\n            compileType3Glyph({data: img.data, width: width, height: height});\n        } else {\n          glyph.compiled = null;\n        }\n      }\n\n      if (glyph && glyph.compiled) {\n        glyph.compiled(ctx);\n        return;\n      }\n\n      var maskCanvas = CachedCanvases.getCanvas('maskCanvas', width, height);\n      var maskCtx = maskCanvas.context;\n      maskCtx.save();\n\n      putBinaryImageMask(maskCtx, img);\n\n      maskCtx.globalCompositeOperation = 'source-in';\n\n      maskCtx.fillStyle = isPatternFill ?\n                          fillColor.getPattern(maskCtx, this) : fillColor;\n      maskCtx.fillRect(0, 0, width, height);\n\n      maskCtx.restore();\n\n      this.paintInlineImageXObject(maskCanvas.canvas);\n    },\n\n    paintImageMaskXObjectRepeat:\n      function CanvasGraphics_paintImageMaskXObjectRepeat(imgData, scaleX,\n                                                          scaleY, positions) {\n      var width = imgData.width;\n      var height = imgData.height;\n      var fillColor = this.current.fillColor;\n      var isPatternFill = this.current.patternFill;\n\n      var maskCanvas = CachedCanvases.getCanvas('maskCanvas', width, height);\n      var maskCtx = maskCanvas.context;\n      maskCtx.save();\n\n      putBinaryImageMask(maskCtx, imgData);\n\n      maskCtx.globalCompositeOperation = 'source-in';\n\n      maskCtx.fillStyle = isPatternFill ?\n                          fillColor.getPattern(maskCtx, this) : fillColor;\n      maskCtx.fillRect(0, 0, width, height);\n\n      maskCtx.restore();\n\n      var ctx = this.ctx;\n      for (var i = 0, ii = positions.length; i < ii; i += 2) {\n        ctx.save();\n        ctx.transform(scaleX, 0, 0, scaleY, positions[i], positions[i + 1]);\n        ctx.scale(1, -1);\n        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height,\n          0, -1, 1, 1);\n        ctx.restore();\n      }\n    },\n\n    paintImageMaskXObjectGroup:\n      function CanvasGraphics_paintImageMaskXObjectGroup(images) {\n      var ctx = this.ctx;\n\n      var fillColor = this.current.fillColor;\n      var isPatternFill = this.current.patternFill;\n      for (var i = 0, ii = images.length; i < ii; i++) {\n        var image = images[i];\n        var width = image.width, height = image.height;\n\n        var maskCanvas = CachedCanvases.getCanvas('maskCanvas', width, height);\n        var maskCtx = maskCanvas.context;\n        maskCtx.save();\n\n        putBinaryImageMask(maskCtx, image);\n\n        maskCtx.globalCompositeOperation = 'source-in';\n\n        maskCtx.fillStyle = isPatternFill ?\n                            fillColor.getPattern(maskCtx, this) : fillColor;\n        maskCtx.fillRect(0, 0, width, height);\n\n        maskCtx.restore();\n\n        ctx.save();\n        ctx.transform.apply(ctx, image.transform);\n        ctx.scale(1, -1);\n        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height,\n                      0, -1, 1, 1);\n        ctx.restore();\n      }\n    },\n\n    paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {\n      var imgData = this.objs.get(objId);\n      if (!imgData) {\n        warn('Dependent image isn\\'t ready yet');\n        return;\n      }\n\n      this.paintInlineImageXObject(imgData);\n    },\n\n    paintImageXObjectRepeat:\n      function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY,\n                                                          positions) {\n      var imgData = this.objs.get(objId);\n      if (!imgData) {\n        warn('Dependent image isn\\'t ready yet');\n        return;\n      }\n\n      var width = imgData.width;\n      var height = imgData.height;\n      var map = [];\n      for (var i = 0, ii = positions.length; i < ii; i += 2) {\n        map.push({transform: [scaleX, 0, 0, scaleY, positions[i],\n                 positions[i + 1]], x: 0, y: 0, w: width, h: height});\n      }\n      this.paintInlineImageXObjectGroup(imgData, map);\n    },\n\n    paintInlineImageXObject:\n      function CanvasGraphics_paintInlineImageXObject(imgData) {\n      var width = imgData.width;\n      var height = imgData.height;\n      var ctx = this.ctx;\n\n      this.save();\n      // scale the image to the unit square\n      ctx.scale(1 / width, -1 / height);\n\n      var currentTransform = ctx.mozCurrentTransformInverse;\n      var a = currentTransform[0], b = currentTransform[1];\n      var widthScale = Math.max(Math.sqrt(a * a + b * b), 1);\n      var c = currentTransform[2], d = currentTransform[3];\n      var heightScale = Math.max(Math.sqrt(c * c + d * d), 1);\n\n      var imgToPaint, tmpCanvas;\n      // instanceof HTMLElement does not work in jsdom node.js module\n      if (imgData instanceof HTMLElement || !imgData.data) {\n        imgToPaint = imgData;\n      } else {\n        tmpCanvas = CachedCanvases.getCanvas('inlineImage', width, height);\n        var tmpCtx = tmpCanvas.context;\n        putBinaryImageData(tmpCtx, imgData);\n        imgToPaint = tmpCanvas.canvas;\n      }\n\n      var paintWidth = width, paintHeight = height;\n      var tmpCanvasId = 'prescale1';\n      // Vertial or horizontal scaling shall not be more than 2 to not loose the\n      // pixels during drawImage operation, painting on the temporary canvas(es)\n      // that are twice smaller in size\n      while ((widthScale > 2 && paintWidth > 1) ||\n             (heightScale > 2 && paintHeight > 1)) {\n        var newWidth = paintWidth, newHeight = paintHeight;\n        if (widthScale > 2 && paintWidth > 1) {\n          newWidth = Math.ceil(paintWidth / 2);\n          widthScale /= paintWidth / newWidth;\n        }\n        if (heightScale > 2 && paintHeight > 1) {\n          newHeight = Math.ceil(paintHeight / 2);\n          heightScale /= paintHeight / newHeight;\n        }\n        tmpCanvas = CachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight);\n        tmpCtx = tmpCanvas.context;\n        tmpCtx.clearRect(0, 0, newWidth, newHeight);\n        tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight,\n                                     0, 0, newWidth, newHeight);\n        imgToPaint = tmpCanvas.canvas;\n        paintWidth = newWidth;\n        paintHeight = newHeight;\n        tmpCanvasId = tmpCanvasId === 'prescale1' ? 'prescale2' : 'prescale1';\n      }\n      ctx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight,\n                                0, -height, width, height);\n\n      if (this.imageLayer) {\n        var position = this.getCanvasPosition(0, -height);\n        this.imageLayer.appendImage({\n          imgData: imgData,\n          left: position[0],\n          top: position[1],\n          width: width / currentTransform[0],\n          height: height / currentTransform[3]\n        });\n      }\n      this.restore();\n    },\n\n    paintInlineImageXObjectGroup:\n      function CanvasGraphics_paintInlineImageXObjectGroup(imgData, map) {\n      var ctx = this.ctx;\n      var w = imgData.width;\n      var h = imgData.height;\n\n      var tmpCanvas = CachedCanvases.getCanvas('inlineImage', w, h);\n      var tmpCtx = tmpCanvas.context;\n      putBinaryImageData(tmpCtx, imgData);\n\n      for (var i = 0, ii = map.length; i < ii; i++) {\n        var entry = map[i];\n        ctx.save();\n        ctx.transform.apply(ctx, entry.transform);\n        ctx.scale(1, -1);\n        ctx.drawImage(tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h,\n                      0, -1, 1, 1);\n        if (this.imageLayer) {\n          var position = this.getCanvasPosition(entry.x, entry.y);\n          this.imageLayer.appendImage({\n            imgData: imgData,\n            left: position[0],\n            top: position[1],\n            width: w,\n            height: h\n          });\n        }\n        ctx.restore();\n      }\n    },\n\n    paintSolidColorImageMask:\n      function CanvasGraphics_paintSolidColorImageMask() {\n        this.ctx.fillRect(0, 0, 1, 1);\n    },\n\n    // Marked content\n\n    markPoint: function CanvasGraphics_markPoint(tag) {\n      // TODO Marked content.\n    },\n    markPointProps: function CanvasGraphics_markPointProps(tag, properties) {\n      // TODO Marked content.\n    },\n    beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {\n      // TODO Marked content.\n    },\n    beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(\n                                        tag, properties) {\n      // TODO Marked content.\n    },\n    endMarkedContent: function CanvasGraphics_endMarkedContent() {\n      // TODO Marked content.\n    },\n\n    // Compatibility\n\n    beginCompat: function CanvasGraphics_beginCompat() {\n      // TODO ignore undefined operators (should we do that anyway?)\n    },\n    endCompat: function CanvasGraphics_endCompat() {\n      // TODO stop ignoring undefined operators\n    },\n\n    // Helper functions\n\n    consumePath: function CanvasGraphics_consumePath() {\n      var ctx = this.ctx;\n      if (this.pendingClip) {\n        if (this.pendingClip === EO_CLIP) {\n          if (ctx.mozFillRule !== undefined) {\n            ctx.mozFillRule = 'evenodd';\n            ctx.clip();\n            ctx.mozFillRule = 'nonzero';\n          } else {\n            try {\n              ctx.clip('evenodd');\n            } catch (ex) {\n              // shouldn't really happen, but browsers might think differently\n              ctx.clip();\n            }\n          }\n        } else {\n          ctx.clip();\n        }\n        this.pendingClip = null;\n      }\n      ctx.beginPath();\n    },\n    getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) {\n      if (this.cachedGetSinglePixelWidth === null) {\n        var inverse = this.ctx.mozCurrentTransformInverse;\n        // max of the current horizontal and vertical scale\n        this.cachedGetSinglePixelWidth = Math.sqrt(Math.max(\n          (inverse[0] * inverse[0] + inverse[1] * inverse[1]),\n          (inverse[2] * inverse[2] + inverse[3] * inverse[3])));\n      }\n      return this.cachedGetSinglePixelWidth;\n    },\n    getCanvasPosition: function CanvasGraphics_getCanvasPosition(x, y) {\n        var transform = this.ctx.mozCurrentTransform;\n        return [\n          transform[0] * x + transform[2] * y + transform[4],\n          transform[1] * x + transform[3] * y + transform[5]\n        ];\n    }\n  };\n\n  for (var op in OPS) {\n    CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op];\n  }\n\n  return CanvasGraphics;\n})();\n\n\nvar WebGLUtils = (function WebGLUtilsClosure() {\n  function loadShader(gl, code, shaderType) {\n    var shader = gl.createShader(shaderType);\n    gl.shaderSource(shader, code);\n    gl.compileShader(shader);\n    var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n    if (!compiled) {\n      var errorMsg = gl.getShaderInfoLog(shader);\n      throw new Error('Error during shader compilation: ' + errorMsg);\n    }\n    return shader;\n  }\n  function createVertexShader(gl, code) {\n    return loadShader(gl, code, gl.VERTEX_SHADER);\n  }\n  function createFragmentShader(gl, code) {\n    return loadShader(gl, code, gl.FRAGMENT_SHADER);\n  }\n  function createProgram(gl, shaders) {\n    var program = gl.createProgram();\n    for (var i = 0, ii = shaders.length; i < ii; ++i) {\n      gl.attachShader(program, shaders[i]);\n    }\n    gl.linkProgram(program);\n    var linked = gl.getProgramParameter(program, gl.LINK_STATUS);\n    if (!linked) {\n      var errorMsg = gl.getProgramInfoLog(program);\n      throw new Error('Error during program linking: ' + errorMsg);\n    }\n    return program;\n  }\n  function createTexture(gl, image, textureId) {\n    gl.activeTexture(textureId);\n    var texture = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n\n    // Set the parameters so we can render any size image.\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\n    // Upload the image into the texture.\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n    return texture;\n  }\n\n  var currentGL, currentCanvas;\n  function generateGL() {\n    if (currentGL) {\n      return;\n    }\n    currentCanvas = document.createElement('canvas');\n    currentGL = currentCanvas.getContext('webgl',\n      { premultipliedalpha: false });\n  }\n\n  var smaskVertexShaderCode = '\\\n  attribute vec2 a_position;                                    \\\n  attribute vec2 a_texCoord;                                    \\\n                                                                \\\n  uniform vec2 u_resolution;                                    \\\n                                                                \\\n  varying vec2 v_texCoord;                                      \\\n                                                                \\\n  void main() {                                                 \\\n    vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0;   \\\n    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \\\n                                                                \\\n    v_texCoord = a_texCoord;                                    \\\n  }                                                             ';\n\n  var smaskFragmentShaderCode = '\\\n  precision mediump float;                                      \\\n                                                                \\\n  uniform vec4 u_backdrop;                                      \\\n  uniform int u_subtype;                                        \\\n  uniform sampler2D u_image;                                    \\\n  uniform sampler2D u_mask;                                     \\\n                                                                \\\n  varying vec2 v_texCoord;                                      \\\n                                                                \\\n  void main() {                                                 \\\n    vec4 imageColor = texture2D(u_image, v_texCoord);           \\\n    vec4 maskColor = texture2D(u_mask, v_texCoord);             \\\n    if (u_backdrop.a > 0.0) {                                   \\\n      maskColor.rgb = maskColor.rgb * maskColor.a +             \\\n                      u_backdrop.rgb * (1.0 - maskColor.a);     \\\n    }                                                           \\\n    float lum;                                                  \\\n    if (u_subtype == 0) {                                       \\\n      lum = maskColor.a;                                        \\\n    } else {                                                    \\\n      lum = maskColor.r * 0.3 + maskColor.g * 0.59 +            \\\n            maskColor.b * 0.11;                                 \\\n    }                                                           \\\n    imageColor.a *= lum;                                        \\\n    imageColor.rgb *= imageColor.a;                             \\\n    gl_FragColor = imageColor;                                  \\\n  }                                                             ';\n\n  var smaskCache = null;\n\n  function initSmaskGL() {\n    var canvas, gl;\n\n    generateGL();\n    canvas = currentCanvas;\n    currentCanvas = null;\n    gl = currentGL;\n    currentGL = null;\n\n    // setup a GLSL program\n    var vertexShader = createVertexShader(gl, smaskVertexShaderCode);\n    var fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode);\n    var program = createProgram(gl, [vertexShader, fragmentShader]);\n    gl.useProgram(program);\n\n    var cache = {};\n    cache.gl = gl;\n    cache.canvas = canvas;\n    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');\n    cache.positionLocation = gl.getAttribLocation(program, 'a_position');\n    cache.backdropLocation = gl.getUniformLocation(program, 'u_backdrop');\n    cache.subtypeLocation = gl.getUniformLocation(program, 'u_subtype');\n\n    var texCoordLocation = gl.getAttribLocation(program, 'a_texCoord');\n    var texLayerLocation = gl.getUniformLocation(program, 'u_image');\n    var texMaskLocation = gl.getUniformLocation(program, 'u_mask');\n\n    // provide texture coordinates for the rectangle.\n    var texCoordBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n      0.0,  0.0,\n      1.0,  0.0,\n      0.0,  1.0,\n      0.0,  1.0,\n      1.0,  0.0,\n      1.0,  1.0]), gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(texCoordLocation);\n    gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);\n\n    gl.uniform1i(texLayerLocation, 0);\n    gl.uniform1i(texMaskLocation, 1);\n\n    smaskCache = cache;\n  }\n\n  function composeSMask(layer, mask, properties) {\n    var width = layer.width, height = layer.height;\n\n    if (!smaskCache) {\n      initSmaskGL();\n    }\n    var cache = smaskCache,canvas = cache.canvas, gl = cache.gl;\n    canvas.width = width;\n    canvas.height = height;\n    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n    gl.uniform2f(cache.resolutionLocation, width, height);\n\n    if (properties.backdrop) {\n      gl.uniform4f(cache.resolutionLocation, properties.backdrop[0],\n                   properties.backdrop[1], properties.backdrop[2], 1);\n    } else {\n      gl.uniform4f(cache.resolutionLocation, 0, 0, 0, 0);\n    }\n    gl.uniform1i(cache.subtypeLocation,\n                 properties.subtype === 'Luminosity' ? 1 : 0);\n\n    // Create a textures\n    var texture = createTexture(gl, layer, gl.TEXTURE0);\n    var maskTexture = createTexture(gl, mask, gl.TEXTURE1);\n\n\n    // Create a buffer and put a single clipspace rectangle in\n    // it (2 triangles)\n    var buffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n      0, 0,\n      width, 0,\n      0, height,\n      0, height,\n      width, 0,\n      width, height]), gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(cache.positionLocation);\n    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n    // draw\n    gl.clearColor(0, 0, 0, 0);\n    gl.enable(gl.BLEND);\n    gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n    gl.clear(gl.COLOR_BUFFER_BIT);\n\n    gl.drawArrays(gl.TRIANGLES, 0, 6);\n\n    gl.flush();\n\n    gl.deleteTexture(texture);\n    gl.deleteTexture(maskTexture);\n    gl.deleteBuffer(buffer);\n\n    return canvas;\n  }\n\n  var figuresVertexShaderCode = '\\\n  attribute vec2 a_position;                                    \\\n  attribute vec3 a_color;                                       \\\n                                                                \\\n  uniform vec2 u_resolution;                                    \\\n  uniform vec2 u_scale;                                         \\\n  uniform vec2 u_offset;                                        \\\n                                                                \\\n  varying vec4 v_color;                                         \\\n                                                                \\\n  void main() {                                                 \\\n    vec2 position = (a_position + u_offset) * u_scale;          \\\n    vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0;     \\\n    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \\\n                                                                \\\n    v_color = vec4(a_color / 255.0, 1.0);                       \\\n  }                                                             ';\n\n  var figuresFragmentShaderCode = '\\\n  precision mediump float;                                      \\\n                                                                \\\n  varying vec4 v_color;                                         \\\n                                                                \\\n  void main() {                                                 \\\n    gl_FragColor = v_color;                                     \\\n  }                                                             ';\n\n  var figuresCache = null;\n\n  function initFiguresGL() {\n    var canvas, gl;\n\n    generateGL();\n    canvas = currentCanvas;\n    currentCanvas = null;\n    gl = currentGL;\n    currentGL = null;\n\n    // setup a GLSL program\n    var vertexShader = createVertexShader(gl, figuresVertexShaderCode);\n    var fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode);\n    var program = createProgram(gl, [vertexShader, fragmentShader]);\n    gl.useProgram(program);\n\n    var cache = {};\n    cache.gl = gl;\n    cache.canvas = canvas;\n    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');\n    cache.scaleLocation = gl.getUniformLocation(program, 'u_scale');\n    cache.offsetLocation = gl.getUniformLocation(program, 'u_offset');\n    cache.positionLocation = gl.getAttribLocation(program, 'a_position');\n    cache.colorLocation = gl.getAttribLocation(program, 'a_color');\n\n    figuresCache = cache;\n  }\n\n  function drawFigures(width, height, backgroundColor, figures, context) {\n    if (!figuresCache) {\n      initFiguresGL();\n    }\n    var cache = figuresCache, canvas = cache.canvas, gl = cache.gl;\n\n    canvas.width = width;\n    canvas.height = height;\n    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n    gl.uniform2f(cache.resolutionLocation, width, height);\n\n    // count triangle points\n    var count = 0;\n    var i, ii, rows;\n    for (i = 0, ii = figures.length; i < ii; i++) {\n      switch (figures[i].type) {\n        case 'lattice':\n          rows = (figures[i].coords.length / figures[i].verticesPerRow) | 0;\n          count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6;\n          break;\n        case 'triangles':\n          count += figures[i].coords.length;\n          break;\n      }\n    }\n    // transfer data\n    var coords = new Float32Array(count * 2);\n    var colors = new Uint8Array(count * 3);\n    var coordsMap = context.coords, colorsMap = context.colors;\n    var pIndex = 0, cIndex = 0;\n    for (i = 0, ii = figures.length; i < ii; i++) {\n      var figure = figures[i], ps = figure.coords, cs = figure.colors;\n      switch (figure.type) {\n        case 'lattice':\n          var cols = figure.verticesPerRow;\n          rows = (ps.length / cols) | 0;\n          for (var row = 1; row < rows; row++) {\n            var offset = row * cols + 1;\n            for (var col = 1; col < cols; col++, offset++) {\n              coords[pIndex] = coordsMap[ps[offset - cols - 1]];\n              coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1];\n              coords[pIndex + 2] = coordsMap[ps[offset - cols]];\n              coords[pIndex + 3] = coordsMap[ps[offset - cols] + 1];\n              coords[pIndex + 4] = coordsMap[ps[offset - 1]];\n              coords[pIndex + 5] = coordsMap[ps[offset - 1] + 1];\n              colors[cIndex] = colorsMap[cs[offset - cols - 1]];\n              colors[cIndex + 1] = colorsMap[cs[offset - cols - 1] + 1];\n              colors[cIndex + 2] = colorsMap[cs[offset - cols - 1] + 2];\n              colors[cIndex + 3] = colorsMap[cs[offset - cols]];\n              colors[cIndex + 4] = colorsMap[cs[offset - cols] + 1];\n              colors[cIndex + 5] = colorsMap[cs[offset - cols] + 2];\n              colors[cIndex + 6] = colorsMap[cs[offset - 1]];\n              colors[cIndex + 7] = colorsMap[cs[offset - 1] + 1];\n              colors[cIndex + 8] = colorsMap[cs[offset - 1] + 2];\n\n              coords[pIndex + 6] = coords[pIndex + 2];\n              coords[pIndex + 7] = coords[pIndex + 3];\n              coords[pIndex + 8] = coords[pIndex + 4];\n              coords[pIndex + 9] = coords[pIndex + 5];\n              coords[pIndex + 10] = coordsMap[ps[offset]];\n              coords[pIndex + 11] = coordsMap[ps[offset] + 1];\n              colors[cIndex + 9] = colors[cIndex + 3];\n              colors[cIndex + 10] = colors[cIndex + 4];\n              colors[cIndex + 11] = colors[cIndex + 5];\n              colors[cIndex + 12] = colors[cIndex + 6];\n              colors[cIndex + 13] = colors[cIndex + 7];\n              colors[cIndex + 14] = colors[cIndex + 8];\n              colors[cIndex + 15] = colorsMap[cs[offset]];\n              colors[cIndex + 16] = colorsMap[cs[offset] + 1];\n              colors[cIndex + 17] = colorsMap[cs[offset] + 2];\n              pIndex += 12;\n              cIndex += 18;\n            }\n          }\n          break;\n        case 'triangles':\n          for (var j = 0, jj = ps.length; j < jj; j++) {\n            coords[pIndex] = coordsMap[ps[j]];\n            coords[pIndex + 1] = coordsMap[ps[j] + 1];\n            colors[cIndex] = colorsMap[cs[i]];\n            colors[cIndex + 1] = colorsMap[cs[j] + 1];\n            colors[cIndex + 2] = colorsMap[cs[j] + 2];\n            pIndex += 2;\n            cIndex += 3;\n          }\n          break;\n      }\n    }\n\n    // draw\n    if (backgroundColor) {\n      gl.clearColor(backgroundColor[0] / 255, backgroundColor[1] / 255,\n                    backgroundColor[2] / 255, 1.0);\n    } else {\n      gl.clearColor(0, 0, 0, 0);\n    }\n    gl.clear(gl.COLOR_BUFFER_BIT);\n\n    var coordsBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(cache.positionLocation);\n    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n    var colorsBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(cache.colorLocation);\n    gl.vertexAttribPointer(cache.colorLocation, 3, gl.UNSIGNED_BYTE, false,\n                           0, 0);\n\n    gl.uniform2f(cache.scaleLocation, context.scaleX, context.scaleY);\n    gl.uniform2f(cache.offsetLocation, context.offsetX, context.offsetY);\n\n    gl.drawArrays(gl.TRIANGLES, 0, count);\n\n    gl.flush();\n\n    gl.deleteBuffer(coordsBuffer);\n    gl.deleteBuffer(colorsBuffer);\n\n    return canvas;\n  }\n\n  function cleanup() {\n    if (smaskCache && smaskCache.canvas) {\n      smaskCache.canvas.width = 0;\n      smaskCache.canvas.height = 0;\n    }\n    if (figuresCache && figuresCache.canvas) {\n      figuresCache.canvas.width = 0;\n      figuresCache.canvas.height = 0;\n    }\n    smaskCache = null;\n    figuresCache = null;\n  }\n\n  return {\n    get isEnabled() {\n      if (PDFJS.disableWebGL) {\n        return false;\n      }\n      var enabled = false;\n      try {\n        generateGL();\n        enabled = !!currentGL;\n      } catch (e) { }\n      return shadow(this, 'isEnabled', enabled);\n    },\n    composeSMask: composeSMask,\n    drawFigures: drawFigures,\n    clear: cleanup\n  };\n})();\n\n\nvar ShadingIRs = {};\n\nShadingIRs.RadialAxial = {\n  fromIR: function RadialAxial_fromIR(raw) {\n    var type = raw[1];\n    var colorStops = raw[2];\n    var p0 = raw[3];\n    var p1 = raw[4];\n    var r0 = raw[5];\n    var r1 = raw[6];\n    return {\n      type: 'Pattern',\n      getPattern: function RadialAxial_getPattern(ctx) {\n        var grad;\n        if (type === 'axial') {\n          grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);\n        } else if (type === 'radial') {\n          grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);\n        }\n\n        for (var i = 0, ii = colorStops.length; i < ii; ++i) {\n          var c = colorStops[i];\n          grad.addColorStop(c[0], c[1]);\n        }\n        return grad;\n      }\n    };\n  }\n};\n\nvar createMeshCanvas = (function createMeshCanvasClosure() {\n  function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {\n    // Very basic Gouraud-shaded triangle rasterization algorithm.\n    var coords = context.coords, colors = context.colors;\n    var bytes = data.data, rowSize = data.width * 4;\n    var tmp;\n    if (coords[p1 + 1] > coords[p2 + 1]) {\n      tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp;\n    }\n    if (coords[p2 + 1] > coords[p3 + 1]) {\n      tmp = p2; p2 = p3; p3 = tmp; tmp = c2; c2 = c3; c3 = tmp;\n    }\n    if (coords[p1 + 1] > coords[p2 + 1]) {\n      tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp;\n    }\n    var x1 = (coords[p1] + context.offsetX) * context.scaleX;\n    var y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;\n    var x2 = (coords[p2] + context.offsetX) * context.scaleX;\n    var y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;\n    var x3 = (coords[p3] + context.offsetX) * context.scaleX;\n    var y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;\n    if (y1 >= y3) {\n      return;\n    }\n    var c1r = colors[c1], c1g = colors[c1 + 1], c1b = colors[c1 + 2];\n    var c2r = colors[c2], c2g = colors[c2 + 1], c2b = colors[c2 + 2];\n    var c3r = colors[c3], c3g = colors[c3 + 1], c3b = colors[c3 + 2];\n\n    var minY = Math.round(y1), maxY = Math.round(y3);\n    var xa, car, cag, cab;\n    var xb, cbr, cbg, cbb;\n    var k;\n    for (var y = minY; y <= maxY; y++) {\n      if (y < y2) {\n        k = y < y1 ? 0 : y1 === y2 ? 1 : (y1 - y) / (y1 - y2);\n        xa = x1 - (x1 - x2) * k;\n        car = c1r - (c1r - c2r) * k;\n        cag = c1g - (c1g - c2g) * k;\n        cab = c1b - (c1b - c2b) * k;\n      } else {\n        k = y > y3 ? 1 : y2 === y3 ? 0 : (y2 - y) / (y2 - y3);\n        xa = x2 - (x2 - x3) * k;\n        car = c2r - (c2r - c3r) * k;\n        cag = c2g - (c2g - c3g) * k;\n        cab = c2b - (c2b - c3b) * k;\n      }\n      k = y < y1 ? 0 : y > y3 ? 1 : (y1 - y) / (y1 - y3);\n      xb = x1 - (x1 - x3) * k;\n      cbr = c1r - (c1r - c3r) * k;\n      cbg = c1g - (c1g - c3g) * k;\n      cbb = c1b - (c1b - c3b) * k;\n      var x1_ = Math.round(Math.min(xa, xb));\n      var x2_ = Math.round(Math.max(xa, xb));\n      var j = rowSize * y + x1_ * 4;\n      for (var x = x1_; x <= x2_; x++) {\n        k = (xa - x) / (xa - xb);\n        k = k < 0 ? 0 : k > 1 ? 1 : k;\n        bytes[j++] = (car - (car - cbr) * k) | 0;\n        bytes[j++] = (cag - (cag - cbg) * k) | 0;\n        bytes[j++] = (cab - (cab - cbb) * k) | 0;\n        bytes[j++] = 255;\n      }\n    }\n  }\n\n  function drawFigure(data, figure, context) {\n    var ps = figure.coords;\n    var cs = figure.colors;\n    var i, ii;\n    switch (figure.type) {\n      case 'lattice':\n        var verticesPerRow = figure.verticesPerRow;\n        var rows = Math.floor(ps.length / verticesPerRow) - 1;\n        var cols = verticesPerRow - 1;\n        for (i = 0; i < rows; i++) {\n          var q = i * verticesPerRow;\n          for (var j = 0; j < cols; j++, q++) {\n            drawTriangle(data, context,\n              ps[q], ps[q + 1], ps[q + verticesPerRow],\n              cs[q], cs[q + 1], cs[q + verticesPerRow]);\n            drawTriangle(data, context,\n              ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow],\n              cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]);\n          }\n        }\n        break;\n      case 'triangles':\n        for (i = 0, ii = ps.length; i < ii; i += 3) {\n          drawTriangle(data, context,\n            ps[i], ps[i + 1], ps[i + 2],\n            cs[i], cs[i + 1], cs[i + 2]);\n        }\n        break;\n      default:\n        error('illigal figure');\n        break;\n    }\n  }\n\n  function createMeshCanvas(bounds, combinesScale, coords, colors, figures,\n                            backgroundColor) {\n    // we will increase scale on some weird factor to let antialiasing take\n    // care of \"rough\" edges\n    var EXPECTED_SCALE = 1.1;\n    // MAX_PATTERN_SIZE is used to avoid OOM situation.\n    var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough\n\n    var offsetX = Math.floor(bounds[0]);\n    var offsetY = Math.floor(bounds[1]);\n    var boundsWidth = Math.ceil(bounds[2]) - offsetX;\n    var boundsHeight = Math.ceil(bounds[3]) - offsetY;\n\n    var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] *\n      EXPECTED_SCALE)), MAX_PATTERN_SIZE);\n    var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] *\n      EXPECTED_SCALE)), MAX_PATTERN_SIZE);\n    var scaleX = boundsWidth / width;\n    var scaleY = boundsHeight / height;\n\n    var context = {\n      coords: coords,\n      colors: colors,\n      offsetX: -offsetX,\n      offsetY: -offsetY,\n      scaleX: 1 / scaleX,\n      scaleY: 1 / scaleY\n    };\n\n    var canvas, tmpCanvas, i, ii;\n    if (WebGLUtils.isEnabled) {\n      canvas = WebGLUtils.drawFigures(width, height, backgroundColor,\n                                      figures, context);\n\n      // https://bugzilla.mozilla.org/show_bug.cgi?id=972126\n      tmpCanvas = CachedCanvases.getCanvas('mesh', width, height, false);\n      tmpCanvas.context.drawImage(canvas, 0, 0);\n      canvas = tmpCanvas.canvas;\n    } else {\n      tmpCanvas = CachedCanvases.getCanvas('mesh', width, height, false);\n      var tmpCtx = tmpCanvas.context;\n\n      var data = tmpCtx.createImageData(width, height);\n      if (backgroundColor) {\n        var bytes = data.data;\n        for (i = 0, ii = bytes.length; i < ii; i += 4) {\n          bytes[i] = backgroundColor[0];\n          bytes[i + 1] = backgroundColor[1];\n          bytes[i + 2] = backgroundColor[2];\n          bytes[i + 3] = 255;\n        }\n      }\n      for (i = 0; i < figures.length; i++) {\n        drawFigure(data, figures[i], context);\n      }\n      tmpCtx.putImageData(data, 0, 0);\n      canvas = tmpCanvas.canvas;\n    }\n\n    return {canvas: canvas, offsetX: offsetX, offsetY: offsetY,\n            scaleX: scaleX, scaleY: scaleY};\n  }\n  return createMeshCanvas;\n})();\n\nShadingIRs.Mesh = {\n  fromIR: function Mesh_fromIR(raw) {\n    //var type = raw[1];\n    var coords = raw[2];\n    var colors = raw[3];\n    var figures = raw[4];\n    var bounds = raw[5];\n    var matrix = raw[6];\n    //var bbox = raw[7];\n    var background = raw[8];\n    return {\n      type: 'Pattern',\n      getPattern: function Mesh_getPattern(ctx, owner, shadingFill) {\n        var scale;\n        if (shadingFill) {\n          scale = Util.singularValueDecompose2dScale(ctx.mozCurrentTransform);\n        } else {\n          // Obtain scale from matrix and current transformation matrix.\n          scale = Util.singularValueDecompose2dScale(owner.baseTransform);\n          if (matrix) {\n            var matrixScale = Util.singularValueDecompose2dScale(matrix);\n            scale = [scale[0] * matrixScale[0],\n                     scale[1] * matrixScale[1]];\n          }\n        }\n\n\n        // Rasterizing on the main thread since sending/queue large canvases\n        // might cause OOM.\n        var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords,\n          colors, figures, shadingFill ? null : background);\n\n        if (!shadingFill) {\n          ctx.setTransform.apply(ctx, owner.baseTransform);\n          if (matrix) {\n            ctx.transform.apply(ctx, matrix);\n          }\n        }\n\n        ctx.translate(temporaryPatternCanvas.offsetX,\n                      temporaryPatternCanvas.offsetY);\n        ctx.scale(temporaryPatternCanvas.scaleX,\n                  temporaryPatternCanvas.scaleY);\n\n        return ctx.createPattern(temporaryPatternCanvas.canvas, 'no-repeat');\n      }\n    };\n  }\n};\n\nShadingIRs.Dummy = {\n  fromIR: function Dummy_fromIR() {\n    return {\n      type: 'Pattern',\n      getPattern: function Dummy_fromIR_getPattern() {\n        return 'hotpink';\n      }\n    };\n  }\n};\n\nfunction getShadingPatternFromIR(raw) {\n  var shadingIR = ShadingIRs[raw[0]];\n  if (!shadingIR) {\n    error('Unknown IR type: ' + raw[0]);\n  }\n  return shadingIR.fromIR(raw);\n}\n\nvar TilingPattern = (function TilingPatternClosure() {\n  var PaintType = {\n    COLORED: 1,\n    UNCOLORED: 2\n  };\n\n  var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough\n\n  function TilingPattern(IR, color, ctx, objs, commonObjs, baseTransform) {\n    this.operatorList = IR[2];\n    this.matrix = IR[3] || [1, 0, 0, 1, 0, 0];\n    this.bbox = IR[4];\n    this.xstep = IR[5];\n    this.ystep = IR[6];\n    this.paintType = IR[7];\n    this.tilingType = IR[8];\n    this.color = color;\n    this.objs = objs;\n    this.commonObjs = commonObjs;\n    this.baseTransform = baseTransform;\n    this.type = 'Pattern';\n    this.ctx = ctx;\n  }\n\n  TilingPattern.prototype = {\n    createPatternCanvas: function TilinPattern_createPatternCanvas(owner) {\n      var operatorList = this.operatorList;\n      var bbox = this.bbox;\n      var xstep = this.xstep;\n      var ystep = this.ystep;\n      var paintType = this.paintType;\n      var tilingType = this.tilingType;\n      var color = this.color;\n      var objs = this.objs;\n      var commonObjs = this.commonObjs;\n\n      info('TilingType: ' + tilingType);\n\n      var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3];\n\n      var topLeft = [x0, y0];\n      // we want the canvas to be as large as the step size\n      var botRight = [x0 + xstep, y0 + ystep];\n\n      var width = botRight[0] - topLeft[0];\n      var height = botRight[1] - topLeft[1];\n\n      // Obtain scale from matrix and current transformation matrix.\n      var matrixScale = Util.singularValueDecompose2dScale(this.matrix);\n      var curMatrixScale = Util.singularValueDecompose2dScale(\n        this.baseTransform);\n      var combinedScale = [matrixScale[0] * curMatrixScale[0],\n        matrixScale[1] * curMatrixScale[1]];\n\n      // MAX_PATTERN_SIZE is used to avoid OOM situation.\n      // Use width and height values that are as close as possible to the end\n      // result when the pattern is used. Too low value makes the pattern look\n      // blurry. Too large value makes it look too crispy.\n      width = Math.min(Math.ceil(Math.abs(width * combinedScale[0])),\n        MAX_PATTERN_SIZE);\n\n      height = Math.min(Math.ceil(Math.abs(height * combinedScale[1])),\n        MAX_PATTERN_SIZE);\n\n      var tmpCanvas = CachedCanvases.getCanvas('pattern', width, height, true);\n      var tmpCtx = tmpCanvas.context;\n      var graphics = new CanvasGraphics(tmpCtx, commonObjs, objs);\n      graphics.groupLevel = owner.groupLevel;\n\n      this.setFillAndStrokeStyleToContext(tmpCtx, paintType, color);\n\n      this.setScale(width, height, xstep, ystep);\n      this.transformToScale(graphics);\n\n      // transform coordinates to pattern space\n      var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]];\n      graphics.transform.apply(graphics, tmpTranslate);\n\n      this.clipBbox(graphics, bbox, x0, y0, x1, y1);\n\n      graphics.executeOperatorList(operatorList);\n      return tmpCanvas.canvas;\n    },\n\n    setScale: function TilingPattern_setScale(width, height, xstep, ystep) {\n      this.scale = [width / xstep, height / ystep];\n    },\n\n    transformToScale: function TilingPattern_transformToScale(graphics) {\n      var scale = this.scale;\n      var tmpScale = [scale[0], 0, 0, scale[1], 0, 0];\n      graphics.transform.apply(graphics, tmpScale);\n    },\n\n    scaleToContext: function TilingPattern_scaleToContext() {\n      var scale = this.scale;\n      this.ctx.scale(1 / scale[0], 1 / scale[1]);\n    },\n\n    clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) {\n      if (bbox && isArray(bbox) && bbox.length === 4) {\n        var bboxWidth = x1 - x0;\n        var bboxHeight = y1 - y0;\n        graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);\n        graphics.clip();\n        graphics.endPath();\n      }\n    },\n\n    setFillAndStrokeStyleToContext:\n      function setFillAndStrokeStyleToContext(context, paintType, color) {\n        switch (paintType) {\n          case PaintType.COLORED:\n            var ctx = this.ctx;\n            context.fillStyle = ctx.fillStyle;\n            context.strokeStyle = ctx.strokeStyle;\n            break;\n          case PaintType.UNCOLORED:\n            var cssColor = Util.makeCssRgb(color[0], color[1], color[2]);\n            context.fillStyle = cssColor;\n            context.strokeStyle = cssColor;\n            break;\n          default:\n            error('Unsupported paint type: ' + paintType);\n        }\n      },\n\n    getPattern: function TilingPattern_getPattern(ctx, owner) {\n      var temporaryPatternCanvas = this.createPatternCanvas(owner);\n\n      ctx = this.ctx;\n      ctx.setTransform.apply(ctx, this.baseTransform);\n      ctx.transform.apply(ctx, this.matrix);\n      this.scaleToContext();\n\n      return ctx.createPattern(temporaryPatternCanvas, 'repeat');\n    }\n  };\n\n  return TilingPattern;\n})();\n\n\nPDFJS.disableFontFace = false;\n\nvar FontLoader = {\n  insertRule: function fontLoaderInsertRule(rule) {\n    var styleElement = document.getElementById('PDFJS_FONT_STYLE_TAG');\n    if (!styleElement) {\n      styleElement = document.createElement('style');\n      styleElement.id = 'PDFJS_FONT_STYLE_TAG';\n      document.documentElement.getElementsByTagName('head')[0].appendChild(\n        styleElement);\n    }\n\n    var styleSheet = styleElement.sheet;\n    styleSheet.insertRule(rule, styleSheet.cssRules.length);\n  },\n\n  clear: function fontLoaderClear() {\n    var styleElement = document.getElementById('PDFJS_FONT_STYLE_TAG');\n    if (styleElement) {\n      styleElement.parentNode.removeChild(styleElement);\n    }\n    this.nativeFontFaces.forEach(function(nativeFontFace) {\n      document.fonts.delete(nativeFontFace);\n    });\n    this.nativeFontFaces.length = 0;\n  },\n  get loadTestFont() {\n    // This is a CFF font with 1 glyph for '.' that fills its entire width and\n    // height.\n    return shadow(this, 'loadTestFont', atob(\n      'T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQ' +\n      'AABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwA' +\n      'AAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbm' +\n      'FtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAA' +\n      'AADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6A' +\n      'ABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAA' +\n      'MQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAA' +\n      'AAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAA' +\n      'AAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQ' +\n      'AAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMA' +\n      'AQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAA' +\n      'EAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAA' +\n      'AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAA' +\n      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +\n      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +\n      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +\n      'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAA' +\n      'AAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgc' +\n      'A/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF' +\n      'hYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQA' +\n      'AAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAg' +\n      'ABAAAAAAAAAAAD6AAAAAAAAA=='\n    ));\n  },\n\n  loadTestFontId: 0,\n\n  loadingContext: {\n    requests: [],\n    nextRequestId: 0\n  },\n\n  isSyncFontLoadingSupported: (function detectSyncFontLoadingSupport() {\n    if (isWorker) {\n      return false;\n    }\n\n    // User agent string sniffing is bad, but there is no reliable way to tell\n    // if font is fully loaded and ready to be used with canvas.\n    var userAgent = window.navigator.userAgent;\n    var m = /Mozilla\\/5.0.*?rv:(\\d+).*? Gecko/.exec(userAgent);\n    if (m && m[1] >= 14) {\n      return true;\n    }\n    // TODO other browsers\n    if (userAgent === 'node') {\n      return true;\n    }\n    return false;\n  })(),\n\n  nativeFontFaces: [],\n\n  isFontLoadingAPISupported: (!isWorker && typeof document !== 'undefined' &&\n                              !!document.fonts),\n\n  addNativeFontFace: function fontLoader_addNativeFontFace(nativeFontFace) {\n    this.nativeFontFaces.push(nativeFontFace);\n    document.fonts.add(nativeFontFace);\n  },\n\n  bind: function fontLoaderBind(fonts, callback) {\n    assert(!isWorker, 'bind() shall be called from main thread');\n\n    var rules = [];\n    var fontsToLoad = [];\n    var fontLoadPromises = [];\n    for (var i = 0, ii = fonts.length; i < ii; i++) {\n      var font = fonts[i];\n\n      // Add the font to the DOM only once or skip if the font\n      // is already loaded.\n      if (font.attached || font.loading === false) {\n        continue;\n      }\n      font.attached = true;\n\n      if (this.isFontLoadingAPISupported) {\n        var nativeFontFace = font.createNativeFontFace();\n        if (nativeFontFace) {\n          fontLoadPromises.push(nativeFontFace.loaded);\n        }\n      } else {\n        var rule = font.bindDOM();\n        if (rule) {\n          rules.push(rule);\n          fontsToLoad.push(font);\n        }\n      }\n    }\n\n    var request = FontLoader.queueLoadingCallback(callback);\n    if (this.isFontLoadingAPISupported) {\n      Promise.all(fontsToLoad).then(function() {\n        request.complete();\n      });\n    } else if (rules.length > 0 && !this.isSyncFontLoadingSupported) {\n      FontLoader.prepareFontLoadEvent(rules, fontsToLoad, request);\n    } else {\n      request.complete();\n    }\n  },\n\n  queueLoadingCallback: function FontLoader_queueLoadingCallback(callback) {\n    function LoadLoader_completeRequest() {\n      assert(!request.end, 'completeRequest() cannot be called twice');\n      request.end = Date.now();\n\n      // sending all completed requests in order how they were queued\n      while (context.requests.length > 0 && context.requests[0].end) {\n        var otherRequest = context.requests.shift();\n        setTimeout(otherRequest.callback, 0);\n      }\n    }\n\n    var context = FontLoader.loadingContext;\n    var requestId = 'pdfjs-font-loading-' + (context.nextRequestId++);\n    var request = {\n      id: requestId,\n      complete: LoadLoader_completeRequest,\n      callback: callback,\n      started: Date.now()\n    };\n    context.requests.push(request);\n    return request;\n  },\n\n  prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules,\n                                                                fonts,\n                                                                request) {\n      /** Hack begin */\n      // There's currently no event when a font has finished downloading so the\n      // following code is a dirty hack to 'guess' when a font is\n      // ready. It's assumed fonts are loaded in order, so add a known test\n      // font after the desired fonts and then test for the loading of that\n      // test font.\n\n      function int32(data, offset) {\n        return (data.charCodeAt(offset) << 24) |\n               (data.charCodeAt(offset + 1) << 16) |\n               (data.charCodeAt(offset + 2) << 8) |\n               (data.charCodeAt(offset + 3) & 0xff);\n      }\n\n      function spliceString(s, offset, remove, insert) {\n        var chunk1 = s.substr(0, offset);\n        var chunk2 = s.substr(offset + remove);\n        return chunk1 + insert + chunk2;\n      }\n\n      var i, ii;\n\n      var canvas = document.createElement('canvas');\n      canvas.width = 1;\n      canvas.height = 1;\n      var ctx = canvas.getContext('2d');\n\n      var called = 0;\n      function isFontReady(name, callback) {\n        called++;\n        // With setTimeout clamping this gives the font ~100ms to load.\n        if(called > 30) {\n          warn('Load test font never loaded.');\n          callback();\n          return;\n        }\n        ctx.font = '30px ' + name;\n        ctx.fillText('.', 0, 20);\n        var imageData = ctx.getImageData(0, 0, 1, 1);\n        if (imageData.data[3] > 0) {\n          callback();\n          return;\n        }\n        setTimeout(isFontReady.bind(null, name, callback));\n      }\n\n      var loadTestFontId = 'lt' + Date.now() + this.loadTestFontId++;\n      // Chromium seems to cache fonts based on a hash of the actual font data,\n      // so the font must be modified for each load test else it will appear to\n      // be loaded already.\n      // TODO: This could maybe be made faster by avoiding the btoa of the full\n      // font by splitting it in chunks before hand and padding the font id.\n      var data = this.loadTestFont;\n      var COMMENT_OFFSET = 976; // has to be on 4 byte boundary (for checksum)\n      data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length,\n                          loadTestFontId);\n      // CFF checksum is important for IE, adjusting it\n      var CFF_CHECKSUM_OFFSET = 16;\n      var XXXX_VALUE = 0x58585858; // the \"comment\" filled with 'X'\n      var checksum = int32(data, CFF_CHECKSUM_OFFSET);\n      for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {\n        checksum = (checksum - XXXX_VALUE + int32(loadTestFontId, i)) | 0;\n      }\n      if (i < loadTestFontId.length) { // align to 4 bytes boundary\n        checksum = (checksum - XXXX_VALUE +\n                    int32(loadTestFontId + 'XXX', i)) | 0;\n      }\n      data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum));\n\n      var url = 'url(data:font/opentype;base64,' + btoa(data) + ');';\n      var rule = '@font-face { font-family:\"' + loadTestFontId + '\";src:' +\n                 url + '}';\n      FontLoader.insertRule(rule);\n\n      var names = [];\n      for (i = 0, ii = fonts.length; i < ii; i++) {\n        names.push(fonts[i].loadedName);\n      }\n      names.push(loadTestFontId);\n\n      var div = document.createElement('div');\n      div.setAttribute('style',\n                       'visibility: hidden;' +\n                       'width: 10px; height: 10px;' +\n                       'position: absolute; top: 0px; left: 0px;');\n      for (i = 0, ii = names.length; i < ii; ++i) {\n        var span = document.createElement('span');\n        span.textContent = 'Hi';\n        span.style.fontFamily = names[i];\n        div.appendChild(span);\n      }\n      document.body.appendChild(div);\n\n      isFontReady(loadTestFontId, function() {\n        document.body.removeChild(div);\n        request.complete();\n      });\n      /** Hack end */\n  }\n};\n\nvar FontFaceObject = (function FontFaceObjectClosure() {\n  function FontFaceObject(name, file, properties) {\n    this.compiledGlyphs = {};\n    if (arguments.length === 1) {\n      // importing translated data\n      var data = arguments[0];\n      for (var i in data) {\n        this[i] = data[i];\n      }\n      return;\n    }\n  }\n  FontFaceObject.prototype = {\n    createNativeFontFace: function FontFaceObject_createNativeFontFace() {\n      if (!this.data) {\n        return null;\n      }\n\n      if (PDFJS.disableFontFace) {\n        this.disableFontFace = true;\n        return null;\n      }\n\n      var nativeFontFace = new FontFace(this.loadedName, this.data, {});\n\n      FontLoader.addNativeFontFace(nativeFontFace);\n\n      if (PDFJS.pdfBug && 'FontInspector' in globalScope &&\n          globalScope['FontInspector'].enabled) {\n        globalScope['FontInspector'].fontAdded(this);\n      }\n      return nativeFontFace;\n    },\n\n    bindDOM: function FontFaceObject_bindDOM() {\n      if (!this.data) {\n        return null;\n      }\n\n      if (PDFJS.disableFontFace) {\n        this.disableFontFace = true;\n        return null;\n      }\n\n      var data = bytesToString(new Uint8Array(this.data));\n      var fontName = this.loadedName;\n\n      // Add the font-face rule to the document\n      var url = ('url(data:' + this.mimetype + ';base64,' +\n                 window.btoa(data) + ');');\n      var rule = '@font-face { font-family:\"' + fontName + '\";src:' + url + '}';\n      FontLoader.insertRule(rule);\n\n      if (PDFJS.pdfBug && 'FontInspector' in globalScope &&\n          globalScope['FontInspector'].enabled) {\n        globalScope['FontInspector'].fontAdded(this, url);\n      }\n\n      return rule;\n    },\n\n    getPathGenerator: function FontLoader_getPathGenerator(objs, character) {\n      if (!(character in this.compiledGlyphs)) {\n        var js = objs.get(this.loadedName + '_path_' + character);\n        /*jshint -W054 */\n        this.compiledGlyphs[character] = new Function('c', 'size', js);\n      }\n      return this.compiledGlyphs[character];\n    }\n  };\n  return FontFaceObject;\n})();\n\n\nvar ANNOT_MIN_SIZE = 10; // px\n\nvar AnnotationUtils = (function AnnotationUtilsClosure() {\n  // TODO(mack): This dupes some of the logic in CanvasGraphics.setFont()\n  function setTextStyles(element, item, fontObj) {\n\n    var style = element.style;\n    style.fontSize = item.fontSize + 'px';\n    style.direction = item.fontDirection < 0 ? 'rtl': 'ltr';\n\n    if (!fontObj) {\n      return;\n    }\n\n    style.fontWeight = fontObj.black ?\n      (fontObj.bold ? 'bolder' : 'bold') :\n      (fontObj.bold ? 'bold' : 'normal');\n    style.fontStyle = fontObj.italic ? 'italic' : 'normal';\n\n    var fontName = fontObj.loadedName;\n    var fontFamily = fontName ? '\"' + fontName + '\", ' : '';\n    // Use a reasonable default font if the font doesn't specify a fallback\n    var fallbackName = fontObj.fallbackName || 'Helvetica, sans-serif';\n    style.fontFamily = fontFamily + fallbackName;\n  }\n\n  function initContainer(item, drawBorder) {\n    var container = document.createElement('section');\n    var cstyle = container.style;\n    var width = item.rect[2] - item.rect[0];\n    var height = item.rect[3] - item.rect[1];\n\n    var bWidth = item.borderWidth || 0;\n    if (bWidth) {\n      width = width - 2 * bWidth;\n      height = height - 2 * bWidth;\n      cstyle.borderWidth = bWidth + 'px';\n      var color = item.color;\n      if (drawBorder && color) {\n        cstyle.borderStyle = 'solid';\n        cstyle.borderColor = Util.makeCssRgb(Math.round(color[0] * 255),\n                                             Math.round(color[1] * 255),\n                                             Math.round(color[2] * 255));\n      }\n    }\n    cstyle.width = width + 'px';\n    cstyle.height = height + 'px';\n    return container;\n  }\n\n  function getHtmlElementForTextWidgetAnnotation(item, commonObjs) {\n    var element = document.createElement('div');\n    var width = item.rect[2] - item.rect[0];\n    var height = item.rect[3] - item.rect[1];\n    element.style.width = width + 'px';\n    element.style.height = height + 'px';\n    element.style.display = 'table';\n\n    var content = document.createElement('div');\n    content.textContent = item.fieldValue;\n    var textAlignment = item.textAlignment;\n    content.style.textAlign = ['left', 'center', 'right'][textAlignment];\n    content.style.verticalAlign = 'middle';\n    content.style.display = 'table-cell';\n\n    var fontObj = item.fontRefName ?\n      commonObjs.getData(item.fontRefName) : null;\n    setTextStyles(content, item, fontObj);\n\n    element.appendChild(content);\n\n    return element;\n  }\n\n  function getHtmlElementForTextAnnotation(item) {\n    var rect = item.rect;\n\n    // sanity check because of OOo-generated PDFs\n    if ((rect[3] - rect[1]) < ANNOT_MIN_SIZE) {\n      rect[3] = rect[1] + ANNOT_MIN_SIZE;\n    }\n    if ((rect[2] - rect[0]) < ANNOT_MIN_SIZE) {\n      rect[2] = rect[0] + (rect[3] - rect[1]); // make it square\n    }\n\n    var container = initContainer(item, false);\n    container.className = 'annotText';\n\n    var image  = document.createElement('img');\n    image.style.height = container.style.height;\n    image.style.width = container.style.width;\n    var iconName = item.name;\n    image.src = PDFJS.imageResourcesPath + 'annotation-' +\n      iconName.toLowerCase() + '.svg';\n    image.alt = '[{{type}} Annotation]';\n    image.dataset.l10nId = 'text_annotation_type';\n    image.dataset.l10nArgs = JSON.stringify({type: iconName});\n\n    var contentWrapper = document.createElement('div');\n    contentWrapper.className = 'annotTextContentWrapper';\n    contentWrapper.style.left = Math.floor(rect[2] - rect[0] + 5) + 'px';\n    contentWrapper.style.top = '-10px';\n\n    var content = document.createElement('div');\n    content.className = 'annotTextContent';\n    content.setAttribute('hidden', true);\n\n    var i, ii;\n    if (item.hasBgColor) {\n      var color = item.color;\n\n      // Enlighten the color (70%)\n      var BACKGROUND_ENLIGHT = 0.7;\n      var r = BACKGROUND_ENLIGHT * (1.0 - color[0]) + color[0];\n      var g = BACKGROUND_ENLIGHT * (1.0 - color[1]) + color[1];\n      var b = BACKGROUND_ENLIGHT * (1.0 - color[2]) + color[2];\n      content.style.backgroundColor = Util.makeCssRgb((r * 255) | 0,\n                                                      (g * 255) | 0,\n                                                      (b * 255) | 0);\n    }\n\n    var title = document.createElement('h1');\n    var text = document.createElement('p');\n    title.textContent = item.title;\n\n    if (!item.content && !item.title) {\n      content.setAttribute('hidden', true);\n    } else {\n      var e = document.createElement('span');\n      var lines = item.content.split(/(?:\\r\\n?|\\n)/);\n      for (i = 0, ii = lines.length; i < ii; ++i) {\n        var line = lines[i];\n        e.appendChild(document.createTextNode(line));\n        if (i < (ii - 1)) {\n          e.appendChild(document.createElement('br'));\n        }\n      }\n      text.appendChild(e);\n\n      var pinned = false;\n\n      var showAnnotation = function showAnnotation(pin) {\n        if (pin) {\n          pinned = true;\n        }\n        if (content.hasAttribute('hidden')) {\n          container.style.zIndex += 1;\n          content.removeAttribute('hidden');\n        }\n      };\n\n      var hideAnnotation = function hideAnnotation(unpin) {\n        if (unpin) {\n          pinned = false;\n        }\n        if (!content.hasAttribute('hidden') && !pinned) {\n          container.style.zIndex -= 1;\n          content.setAttribute('hidden', true);\n        }\n      };\n\n      var toggleAnnotation = function toggleAnnotation() {\n        if (pinned) {\n          hideAnnotation(true);\n        } else {\n          showAnnotation(true);\n        }\n      };\n\n      image.addEventListener('click', function image_clickHandler() {\n        toggleAnnotation();\n      }, false);\n      image.addEventListener('mouseover', function image_mouseOverHandler() {\n        showAnnotation();\n      }, false);\n      image.addEventListener('mouseout', function image_mouseOutHandler() {\n        hideAnnotation();\n      }, false);\n\n      content.addEventListener('click', function content_clickHandler() {\n        hideAnnotation(true);\n      }, false);\n    }\n\n    content.appendChild(title);\n    content.appendChild(text);\n    contentWrapper.appendChild(content);\n    container.appendChild(image);\n    container.appendChild(contentWrapper);\n\n    return container;\n  }\n\n  function getHtmlElementForLinkAnnotation(item) {\n    var container = initContainer(item, true);\n    container.className = 'annotLink';\n\n    var link = document.createElement('a');\n    link.href = link.title = item.url || '';\n    if (item.url && PDFJS.openExternalLinksInNewWindow) {\n      link.target = '_blank';\n    }\n\n    container.appendChild(link);\n\n    return container;\n  }\n\n  function getHtmlElement(data, objs) {\n    switch (data.annotationType) {\n      case AnnotationType.WIDGET:\n        return getHtmlElementForTextWidgetAnnotation(data, objs);\n      case AnnotationType.TEXT:\n        return getHtmlElementForTextAnnotation(data);\n      case AnnotationType.LINK:\n        return getHtmlElementForLinkAnnotation(data);\n      default:\n        throw new Error('Unsupported annotationType: ' + data.annotationType);\n    }\n  }\n\n  return {\n    getHtmlElement: getHtmlElement\n  };\n})();\nPDFJS.AnnotationUtils = AnnotationUtils;\n\n\nvar SVG_DEFAULTS = {\n  fontStyle: 'normal',\n  fontWeight: 'normal',\n  fillColor: '#000000'\n};\n\nvar convertImgDataToPng = (function convertImgDataToPngClosure() {\n  var PNG_HEADER =\n    new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);\n\n  var CHUNK_WRAPPER_SIZE = 12;\n\n  var crcTable = new Int32Array(256);\n  for (var i = 0; i < 256; i++) {\n    var c = i;\n    for (var h = 0; h < 8; h++) {\n      if (c & 1) {\n        c = 0xedB88320 ^ ((c >> 1) & 0x7fffffff);\n      } else {\n        c = (c >> 1) & 0x7fffffff;\n      }\n    }\n    crcTable[i] = c;\n  }\n\n  function crc32(data, start, end) {\n    var crc = -1;\n    for (var i = start; i < end; i++) {\n      var a = (crc ^ data[i]) & 0xff;\n      var b = crcTable[a];\n      crc = (crc >>> 8) ^ b;\n    }\n    return crc ^ -1;\n  }\n\n  function writePngChunk(type, body, data, offset) {\n    var p = offset;\n    var len = body.length;\n\n    data[p] = len >> 24 & 0xff;\n    data[p + 1] = len >> 16 & 0xff;\n    data[p + 2] = len >> 8 & 0xff;\n    data[p + 3] = len & 0xff;\n    p += 4;\n\n    data[p] = type.charCodeAt(0) & 0xff;\n    data[p + 1] = type.charCodeAt(1) & 0xff;\n    data[p + 2] = type.charCodeAt(2) & 0xff;\n    data[p + 3] = type.charCodeAt(3) & 0xff;\n    p += 4;\n\n    data.set(body, p);\n    p += body.length;\n\n    var crc = crc32(data, offset + 4, p);\n\n    data[p] = crc >> 24 & 0xff;\n    data[p + 1] = crc >> 16 & 0xff;\n    data[p + 2] = crc >> 8 & 0xff;\n    data[p + 3] = crc & 0xff;\n  }\n\n  function adler32(data, start, end) {\n    var a = 1;\n    var b = 0;\n    for (var i = start; i < end; ++i) {\n      a = (a + (data[i] & 0xff)) % 65521;\n      b = (b + a) % 65521;\n    }\n    return (b << 16) | a;\n  }\n\n  function encode(imgData, kind) {\n    var width = imgData.width;\n    var height = imgData.height;\n    var bitDepth, colorType, lineSize;\n    var bytes = imgData.data;\n\n    switch (kind) {\n      case ImageKind.GRAYSCALE_1BPP:\n        colorType = 0;\n        bitDepth = 1;\n        lineSize = (width + 7) >> 3;\n        break;\n      case ImageKind.RGB_24BPP:\n        colorType = 2;\n        bitDepth = 8;\n        lineSize = width * 3;\n        break;\n      case ImageKind.RGBA_32BPP:\n        colorType = 6;\n        bitDepth = 8;\n        lineSize = width * 4;\n        break;\n      default:\n        throw new Error('invalid format');\n    }\n\n    // prefix every row with predictor 0\n    var literals = new Uint8Array((1 + lineSize) * height);\n    var offsetLiterals = 0, offsetBytes = 0;\n    var y, i;\n    for (y = 0; y < height; ++y) {\n      literals[offsetLiterals++] = 0; // no prediction\n      literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize),\n                   offsetLiterals);\n      offsetBytes += lineSize;\n      offsetLiterals += lineSize;\n    }\n\n    if (kind === ImageKind.GRAYSCALE_1BPP) {\n      // inverting for B/W\n      offsetLiterals = 0;\n      for (y = 0; y < height; y++) {\n        offsetLiterals++; // skipping predictor\n        for (i = 0; i < lineSize; i++) {\n          literals[offsetLiterals++] ^= 0xFF;\n        }\n      }\n    }\n\n    var ihdr = new Uint8Array([\n      width >> 24 & 0xff,\n      width >> 16 & 0xff,\n      width >> 8 & 0xff,\n      width & 0xff,\n      height >> 24 & 0xff,\n      height >> 16 & 0xff,\n      height >> 8 & 0xff,\n      height & 0xff,\n      bitDepth, // bit depth\n      colorType, // color type\n      0x00, // compression method\n      0x00, // filter method\n      0x00 // interlace method\n    ]);\n\n    var len = literals.length;\n    var maxBlockLength = 0xFFFF;\n\n    var deflateBlocks = Math.ceil(len / maxBlockLength);\n    var idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4);\n    var pi = 0;\n    idat[pi++] = 0x78; // compression method and flags\n    idat[pi++] = 0x9c; // flags\n\n    var pos = 0;\n    while (len > maxBlockLength) {\n      // writing non-final DEFLATE blocks type 0 and length of 65535\n      idat[pi++] = 0x00;\n      idat[pi++] = 0xff;\n      idat[pi++] = 0xff;\n      idat[pi++] = 0x00;\n      idat[pi++] = 0x00;\n      idat.set(literals.subarray(pos, pos + maxBlockLength), pi);\n      pi += maxBlockLength;\n      pos += maxBlockLength;\n      len -= maxBlockLength;\n    }\n\n    // writing non-final DEFLATE blocks type 0\n    idat[pi++] = 0x01;\n    idat[pi++] = len & 0xff;\n    idat[pi++] = len >> 8 & 0xff;\n    idat[pi++] = (~len & 0xffff) & 0xff;\n    idat[pi++] = (~len & 0xffff) >> 8 & 0xff;\n    idat.set(literals.subarray(pos), pi);\n    pi += literals.length - pos;\n\n    var adler = adler32(literals, 0, literals.length); // checksum\n    idat[pi++] = adler >> 24 & 0xff;\n    idat[pi++] = adler >> 16 & 0xff;\n    idat[pi++] = adler >> 8 & 0xff;\n    idat[pi++] = adler & 0xff;\n\n    // PNG will consists: header, IHDR+data, IDAT+data, and IEND.\n    var pngLength = PNG_HEADER.length + (CHUNK_WRAPPER_SIZE * 3) +\n                    ihdr.length + idat.length;\n    var data = new Uint8Array(pngLength);\n    var offset = 0;\n    data.set(PNG_HEADER, offset);\n    offset += PNG_HEADER.length;\n    writePngChunk('IHDR', ihdr, data, offset);\n    offset += CHUNK_WRAPPER_SIZE + ihdr.length;\n    writePngChunk('IDATA', idat, data, offset);\n    offset += CHUNK_WRAPPER_SIZE + idat.length;\n    writePngChunk('IEND', new Uint8Array(0), data, offset);\n\n    return PDFJS.createObjectURL(data, 'image/png');\n  }\n\n  return function convertImgDataToPng(imgData) {\n    var kind = (imgData.kind === undefined ?\n                ImageKind.GRAYSCALE_1BPP : imgData.kind);\n    return encode(imgData, kind);\n  };\n})();\n\nvar SVGExtraState = (function SVGExtraStateClosure() {\n  function SVGExtraState() {\n    this.fontSizeScale = 1;\n    this.fontWeight = SVG_DEFAULTS.fontWeight;\n    this.fontSize = 0;\n\n    this.textMatrix = IDENTITY_MATRIX;\n    this.fontMatrix = FONT_IDENTITY_MATRIX;\n    this.leading = 0;\n\n    // Current point (in user coordinates)\n    this.x = 0;\n    this.y = 0;\n\n    // Start of text line (in text coordinates)\n    this.lineX = 0;\n    this.lineY = 0;\n\n    // Character and word spacing\n    this.charSpacing = 0;\n    this.wordSpacing = 0;\n    this.textHScale = 1;\n    this.textRise = 0;\n\n    // Default foreground and background colors\n    this.fillColor = SVG_DEFAULTS.fillColor;\n    this.strokeColor = '#000000';\n\n    this.fillAlpha = 1;\n    this.strokeAlpha = 1;\n    this.lineWidth = 1;\n    this.lineJoin = '';\n    this.lineCap = '';\n    this.miterLimit = 0;\n\n    this.dashArray = [];\n    this.dashPhase = 0;\n\n    this.dependencies = [];\n\n    // Clipping\n    this.clipId = '';\n    this.pendingClip = false;\n\n    this.maskId = '';\n  }\n\n  SVGExtraState.prototype = {\n    clone: function SVGExtraState_clone() {\n      return Object.create(this);\n    },\n    setCurrentPoint: function SVGExtraState_setCurrentPoint(x, y) {\n      this.x = x;\n      this.y = y;\n    }\n  };\n  return SVGExtraState;\n})();\n\nvar SVGGraphics = (function SVGGraphicsClosure() {\n  function createScratchSVG(width, height) {\n    var NS = 'http://www.w3.org/2000/svg';\n    var svg = document.createElementNS(NS, 'svg:svg');\n    svg.setAttributeNS(null, 'version', '1.1');\n    svg.setAttributeNS(null, 'width', width + 'px');\n    svg.setAttributeNS(null, 'height', height + 'px');\n    svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);\n    return svg;\n  }\n\n  function opListToTree(opList) {\n    var opTree = [];\n    var tmp = [];\n    var opListLen = opList.length;\n\n    for (var x = 0; x < opListLen; x++) {\n      if (opList[x].fn === 'save') {\n        opTree.push({'fnId': 92, 'fn': 'group', 'items': []});\n        tmp.push(opTree);\n        opTree = opTree[opTree.length - 1].items;\n        continue;\n      }\n\n      if(opList[x].fn === 'restore') {\n        opTree = tmp.pop();\n      } else {\n        opTree.push(opList[x]);\n      }\n    }\n    return opTree;\n  }\n\n  /**\n   * Formats float number.\n   * @param value {number} number to format.\n   * @returns {string}\n   */\n  function pf(value) {\n    if (value === (value | 0)) { // integer number\n      return value.toString();\n    }\n    var s = value.toFixed(10);\n    var i = s.length - 1;\n    if (s[i] !== '0') {\n      return s;\n    }\n    // removing trailing zeros\n    do {\n      i--;\n    } while (s[i] === '0');\n    return s.substr(0, s[i] === '.' ? i : i + 1);\n  }\n\n  /**\n   * Formats transform matrix. The standard rotation, scale and translate\n   * matrices are replaced by their shorter forms, and for identity matrix\n   * returns empty string to save the memory.\n   * @param m {Array} matrix to format.\n   * @returns {string}\n   */\n  function pm(m) {\n    if (m[4] === 0 && m[5] === 0) {\n      if (m[1] === 0 && m[2] === 0) {\n        if (m[0] === 1 && m[3] === 1) {\n          return '';\n        }\n        return 'scale(' + pf(m[0]) + ' ' + pf(m[3]) + ')';\n      }\n      if (m[0] === m[3] && m[1] === -m[2]) {\n        var a = Math.acos(m[0]) * 180 / Math.PI;\n        return 'rotate(' + pf(a) + ')';\n      }\n    } else {\n      if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) {\n        return 'translate(' + pf(m[4]) + ' ' + pf(m[5]) + ')';\n      }\n    }\n    return 'matrix(' + pf(m[0]) + ' ' + pf(m[1]) + ' ' + pf(m[2]) + ' ' +\n      pf(m[3]) + ' ' + pf(m[4]) + ' ' + pf(m[5]) + ')';\n  }\n\n  function SVGGraphics(commonObjs, objs) {\n    this.current = new SVGExtraState();\n    this.transformMatrix = IDENTITY_MATRIX; // Graphics state matrix\n    this.transformStack = [];\n    this.extraStack = [];\n    this.commonObjs = commonObjs;\n    this.objs = objs;\n    this.pendingEOFill = false;\n\n    this.embedFonts = false;\n    this.embeddedFonts = {};\n    this.cssStyle = null;\n  }\n\n  var NS = 'http://www.w3.org/2000/svg';\n  var XML_NS = 'http://www.w3.org/XML/1998/namespace';\n  var XLINK_NS = 'http://www.w3.org/1999/xlink';\n  var LINE_CAP_STYLES = ['butt', 'round', 'square'];\n  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];\n  var clipCount = 0;\n  var maskCount = 0;\n\n  SVGGraphics.prototype = {\n    save: function SVGGraphics_save() {\n      this.transformStack.push(this.transformMatrix);\n      var old = this.current;\n      this.extraStack.push(old);\n      this.current = old.clone();\n    },\n\n    restore: function SVGGraphics_restore() {\n      this.transformMatrix = this.transformStack.pop();\n      this.current = this.extraStack.pop();\n\n      this.tgrp = document.createElementNS(NS, 'svg:g');\n      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));\n      this.pgrp.appendChild(this.tgrp);\n    },\n\n    group: function SVGGraphics_group(items) {\n      this.save();\n      this.executeOpTree(items);\n      this.restore();\n    },\n\n    loadDependencies: function SVGGraphics_loadDependencies(operatorList) {\n      var fnArray = operatorList.fnArray;\n      var fnArrayLen = fnArray.length;\n      var argsArray = operatorList.argsArray;\n\n      var self = this;\n      for (var i = 0; i < fnArrayLen; i++) {\n        if (OPS.dependency === fnArray[i]) {\n          var deps = argsArray[i];\n          for (var n = 0, nn = deps.length; n < nn; n++) {\n            var obj = deps[n];\n            var common = obj.substring(0, 2) === 'g_';\n            var promise;\n            if (common) {\n              promise = new Promise(function(resolve) {\n                self.commonObjs.get(obj, resolve);\n              });\n            } else {\n              promise = new Promise(function(resolve) {\n                self.objs.get(obj, resolve);\n              });\n            }\n            this.current.dependencies.push(promise);\n          }\n        }\n      }\n      return Promise.all(this.current.dependencies);\n    },\n\n    transform: function SVGGraphics_transform(a, b, c, d, e, f) {\n      var transformMatrix = [a, b, c, d, e, f];\n      this.transformMatrix = PDFJS.Util.transform(this.transformMatrix,\n                                                  transformMatrix);\n\n      this.tgrp = document.createElementNS(NS, 'svg:g');\n      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));\n    },\n\n    getSVG: function SVGGraphics_getSVG(operatorList, viewport) {\n      this.svg = createScratchSVG(viewport.width, viewport.height);\n      this.viewport = viewport;\n\n      return this.loadDependencies(operatorList).then(function () {\n        this.transformMatrix = IDENTITY_MATRIX;\n        this.pgrp = document.createElementNS(NS, 'svg:g'); // Parent group\n        this.pgrp.setAttributeNS(null, 'transform', pm(viewport.transform));\n        this.tgrp = document.createElementNS(NS, 'svg:g'); // Transform group\n        this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));\n        this.defs = document.createElementNS(NS, 'svg:defs');\n        this.pgrp.appendChild(this.defs);\n        this.pgrp.appendChild(this.tgrp);\n        this.svg.appendChild(this.pgrp);\n        var opTree = this.convertOpList(operatorList);\n        this.executeOpTree(opTree);\n        return this.svg;\n      }.bind(this));\n    },\n\n    convertOpList: function SVGGraphics_convertOpList(operatorList) {\n      var argsArray = operatorList.argsArray;\n      var fnArray = operatorList.fnArray;\n      var fnArrayLen  = fnArray.length;\n      var REVOPS = [];\n      var opList = [];\n\n      for (var op in OPS) {\n        REVOPS[OPS[op]] = op;\n      }\n\n      for (var x = 0; x < fnArrayLen; x++) {\n        var fnId = fnArray[x];\n        opList.push({'fnId' : fnId, 'fn': REVOPS[fnId], 'args': argsArray[x]});\n      }\n      return opListToTree(opList);\n    },\n\n    executeOpTree: function SVGGraphics_executeOpTree(opTree) {\n      var opTreeLen = opTree.length;\n      for(var x = 0; x < opTreeLen; x++) {\n        var fn = opTree[x].fn;\n        var fnId = opTree[x].fnId;\n        var args = opTree[x].args;\n\n        switch (fnId | 0) {\n          case OPS.beginText:\n            this.beginText();\n            break;\n          case OPS.setLeading:\n            this.setLeading(args);\n            break;\n          case OPS.setLeadingMoveText:\n            this.setLeadingMoveText(args[0], args[1]);\n            break;\n          case OPS.setFont:\n            this.setFont(args);\n            break;\n          case OPS.showText:\n            this.showText(args[0]);\n            break;\n          case OPS.showSpacedText:\n            this.showText(args[0]);\n            break;\n          case OPS.endText:\n            this.endText();\n            break;\n          case OPS.moveText:\n            this.moveText(args[0], args[1]);\n            break;\n          case OPS.setCharSpacing:\n            this.setCharSpacing(args[0]);\n            break;\n          case OPS.setWordSpacing:\n            this.setWordSpacing(args[0]);\n            break;\n          case OPS.setHScale:\n            this.setHScale(args[0]);\n            break;\n          case OPS.setTextMatrix:\n            this.setTextMatrix(args[0], args[1], args[2],\n                               args[3], args[4], args[5]);\n            break;\n          case OPS.setLineWidth:\n            this.setLineWidth(args[0]);\n            break;\n          case OPS.setLineJoin:\n            this.setLineJoin(args[0]);\n            break;\n          case OPS.setLineCap:\n            this.setLineCap(args[0]);\n            break;\n          case OPS.setMiterLimit:\n            this.setMiterLimit(args[0]);\n            break;\n          case OPS.setFillRGBColor:\n            this.setFillRGBColor(args[0], args[1], args[2]);\n            break;\n          case OPS.setStrokeRGBColor:\n            this.setStrokeRGBColor(args[0], args[1], args[2]);\n            break;\n          case OPS.setDash:\n            this.setDash(args[0], args[1]);\n            break;\n          case OPS.setGState:\n            this.setGState(args[0]);\n            break;\n          case OPS.fill:\n            this.fill();\n            break;\n          case OPS.eoFill:\n            this.eoFill();\n            break;\n          case OPS.stroke:\n            this.stroke();\n            break;\n          case OPS.fillStroke:\n            this.fillStroke();\n            break;\n          case OPS.eoFillStroke:\n            this.eoFillStroke();\n            break;\n          case OPS.clip:\n            this.clip('nonzero');\n            break;\n          case OPS.eoClip:\n            this.clip('evenodd');\n            break;\n          case OPS.paintSolidColorImageMask:\n            this.paintSolidColorImageMask();\n            break;\n          case OPS.paintJpegXObject:\n            this.paintJpegXObject(args[0], args[1], args[2]);\n            break;\n          case OPS.paintImageXObject:\n            this.paintImageXObject(args[0]);\n            break;\n          case OPS.paintInlineImageXObject:\n            this.paintInlineImageXObject(args[0]);\n            break;\n          case OPS.paintImageMaskXObject:\n            this.paintImageMaskXObject(args[0]);\n            break;\n          case OPS.paintFormXObjectBegin:\n            this.paintFormXObjectBegin(args[0], args[1]);\n            break;\n          case OPS.paintFormXObjectEnd:\n            this.paintFormXObjectEnd();\n            break;\n          case OPS.closePath:\n            this.closePath();\n            break;\n          case OPS.closeStroke:\n            this.closeStroke();\n            break;\n          case OPS.closeFillStroke:\n            this.closeFillStroke();\n            break;\n          case OPS.nextLine:\n            this.nextLine();\n            break;\n          case OPS.transform:\n            this.transform(args[0], args[1], args[2], args[3],\n                           args[4], args[5]);\n            break;\n          case OPS.constructPath:\n            this.constructPath(args[0], args[1]);\n            break;\n          case OPS.endPath:\n            this.endPath();\n            break;\n          case 92:\n            this.group(opTree[x].items);\n            break;\n          default:\n            warn('Unimplemented method '+ fn);\n            break;\n        }\n      }\n    },\n\n    setWordSpacing: function SVGGraphics_setWordSpacing(wordSpacing) {\n      this.current.wordSpacing = wordSpacing;\n    },\n\n    setCharSpacing: function SVGGraphics_setCharSpacing(charSpacing) {\n      this.current.charSpacing = charSpacing;\n    },\n\n    nextLine: function SVGGraphics_nextLine() {\n      this.moveText(0, this.current.leading);\n    },\n\n    setTextMatrix: function SVGGraphics_setTextMatrix(a, b, c, d, e, f) {\n      var current = this.current;\n      this.current.textMatrix = this.current.lineMatrix = [a, b, c, d, e, f];\n\n      this.current.x = this.current.lineX = 0;\n      this.current.y = this.current.lineY = 0;\n\n      current.xcoords = [];\n      current.tspan = document.createElementNS(NS, 'svg:tspan');\n      current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);\n      current.tspan.setAttributeNS(null, 'font-size',\n                                   pf(current.fontSize) + 'px');\n      current.tspan.setAttributeNS(null, 'y', pf(-current.y));\n\n      current.txtElement = document.createElementNS(NS, 'svg:text');\n      current.txtElement.appendChild(current.tspan);\n    },\n\n    beginText: function SVGGraphics_beginText() {\n      this.current.x = this.current.lineX = 0;\n      this.current.y = this.current.lineY = 0;\n      this.current.textMatrix = IDENTITY_MATRIX;\n      this.current.lineMatrix = IDENTITY_MATRIX;\n      this.current.tspan = document.createElementNS(NS, 'svg:tspan');\n      this.current.txtElement = document.createElementNS(NS, 'svg:text');\n      this.current.txtgrp = document.createElementNS(NS, 'svg:g');\n      this.current.xcoords = [];\n    },\n\n    moveText: function SVGGraphics_moveText(x, y) {\n      var current = this.current;\n      this.current.x = this.current.lineX += x;\n      this.current.y = this.current.lineY += y;\n\n      current.xcoords = [];\n      current.tspan = document.createElementNS(NS, 'svg:tspan');\n      current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);\n      current.tspan.setAttributeNS(null, 'font-size',\n                                   pf(current.fontSize) + 'px');\n      current.tspan.setAttributeNS(null, 'y', pf(-current.y));\n    },\n\n    showText: function SVGGraphics_showText(glyphs) {\n      var current = this.current;\n      var font = current.font;\n      var fontSize = current.fontSize;\n\n      if (fontSize === 0) {\n        return;\n      }\n\n      var charSpacing = current.charSpacing;\n      var wordSpacing = current.wordSpacing;\n      var fontDirection = current.fontDirection;\n      var textHScale = current.textHScale * fontDirection;\n      var glyphsLength = glyphs.length;\n      var vertical = font.vertical;\n      var widthAdvanceScale = fontSize * current.fontMatrix[0];\n\n      var x = 0, i;\n      for (i = 0; i < glyphsLength; ++i) {\n        var glyph = glyphs[i];\n        if (glyph === null) {\n          // word break\n          x += fontDirection * wordSpacing;\n          continue;\n        } else if (isNum(glyph)) {\n          x += -glyph * fontSize * 0.001;\n          continue;\n        }\n        current.xcoords.push(current.x + x * textHScale);\n\n        var width = glyph.width;\n        var character = glyph.fontChar;\n        var charWidth = width * widthAdvanceScale + charSpacing * fontDirection;\n        x += charWidth;\n\n        current.tspan.textContent += character;\n      }\n      if (vertical) {\n        current.y -= x * textHScale;\n      } else {\n        current.x += x * textHScale;\n      }\n\n      current.tspan.setAttributeNS(null, 'x',\n                                   current.xcoords.map(pf).join(' '));\n      current.tspan.setAttributeNS(null, 'y', pf(-current.y));\n      current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);\n      current.tspan.setAttributeNS(null, 'font-size',\n                                   pf(current.fontSize) + 'px');\n      if (current.fontStyle !== SVG_DEFAULTS.fontStyle) {\n        current.tspan.setAttributeNS(null, 'font-style', current.fontStyle);\n      }\n      if (current.fontWeight !== SVG_DEFAULTS.fontWeight) {\n        current.tspan.setAttributeNS(null, 'font-weight', current.fontWeight);\n      }\n      if (current.fillColor !== SVG_DEFAULTS.fillColor) {\n        current.tspan.setAttributeNS(null, 'fill', current.fillColor);\n      }\n\n      current.txtElement.setAttributeNS(null, 'transform',\n                                        pm(current.textMatrix) +\n                                        ' scale(1, -1)' );\n      current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve');\n      current.txtElement.appendChild(current.tspan);\n      current.txtgrp.appendChild(current.txtElement);\n\n      this.tgrp.appendChild(current.txtElement);\n\n    },\n\n    setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) {\n      this.setLeading(-y);\n      this.moveText(x, y);\n    },\n\n    addFontStyle: function SVGGraphics_addFontStyle(fontObj) {\n      if (!this.cssStyle) {\n        this.cssStyle = document.createElementNS(NS, 'svg:style');\n        this.cssStyle.setAttributeNS(null, 'type', 'text/css');\n        this.defs.appendChild(this.cssStyle);\n      }\n\n      var url = PDFJS.createObjectURL(fontObj.data, fontObj.mimetype);\n      this.cssStyle.textContent +=\n        '@font-face { font-family: \"' + fontObj.loadedName + '\";' +\n        ' src: url(' + url + '); }\\n';\n    },\n\n    setFont: function SVGGraphics_setFont(details) {\n      var current = this.current;\n      var fontObj = this.commonObjs.get(details[0]);\n      var size = details[1];\n      this.current.font = fontObj;\n\n      if (this.embedFonts && fontObj.data &&\n          !this.embeddedFonts[fontObj.loadedName]) {\n        this.addFontStyle(fontObj);\n        this.embeddedFonts[fontObj.loadedName] = fontObj;\n      }\n\n      current.fontMatrix = (fontObj.fontMatrix ?\n                            fontObj.fontMatrix : FONT_IDENTITY_MATRIX);\n\n      var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :\n                                 (fontObj.bold ? 'bold' : 'normal');\n      var italic = fontObj.italic ? 'italic' : 'normal';\n\n      if (size < 0) {\n        size = -size;\n        current.fontDirection = -1;\n      } else {\n        current.fontDirection = 1;\n      }\n      current.fontSize = size;\n      current.fontFamily = fontObj.loadedName;\n      current.fontWeight = bold;\n      current.fontStyle = italic;\n\n      current.tspan = document.createElementNS(NS, 'svg:tspan');\n      current.tspan.setAttributeNS(null, 'y', pf(-current.y));\n      current.xcoords = [];\n    },\n\n    endText: function SVGGraphics_endText() {\n      if (this.current.pendingClip) {\n        this.cgrp.appendChild(this.tgrp);\n        this.pgrp.appendChild(this.cgrp);\n      } else {\n        this.pgrp.appendChild(this.tgrp);\n      }\n      this.tgrp = document.createElementNS(NS, 'svg:g');\n      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));\n    },\n\n    // Path properties\n    setLineWidth: function SVGGraphics_setLineWidth(width) {\n      this.current.lineWidth = width;\n    },\n    setLineCap: function SVGGraphics_setLineCap(style) {\n      this.current.lineCap = LINE_CAP_STYLES[style];\n    },\n    setLineJoin: function SVGGraphics_setLineJoin(style) {\n      this.current.lineJoin = LINE_JOIN_STYLES[style];\n    },\n    setMiterLimit: function SVGGraphics_setMiterLimit(limit) {\n      this.current.miterLimit = limit;\n    },\n    setStrokeRGBColor: function SVGGraphics_setStrokeRGBColor(r, g, b) {\n      var color = Util.makeCssRgb(r, g, b);\n      this.current.strokeColor = color;\n    },\n    setFillRGBColor: function SVGGraphics_setFillRGBColor(r, g, b) {\n      var color = Util.makeCssRgb(r, g, b);\n      this.current.fillColor = color;\n      this.current.tspan = document.createElementNS(NS, 'svg:tspan');\n      this.current.xcoords = [];\n    },\n    setDash: function SVGGraphics_setDash(dashArray, dashPhase) {\n      this.current.dashArray = dashArray;\n      this.current.dashPhase = dashPhase;\n    },\n\n    constructPath: function SVGGraphics_constructPath(ops, args) {\n      var current = this.current;\n      var x = current.x, y = current.y;\n      current.path = document.createElementNS(NS, 'svg:path');\n      var d = [];\n      var opLength = ops.length;\n\n      for (var i = 0, j = 0; i < opLength; i++) {\n        switch (ops[i] | 0) {\n          case OPS.rectangle:\n            x = args[j++];\n            y = args[j++];\n            var width = args[j++];\n            var height = args[j++];\n            var xw = x + width;\n            var yh = y + height;\n            d.push('M', pf(x), pf(y), 'L', pf(xw) , pf(y), 'L', pf(xw), pf(yh),\n                   'L', pf(x), pf(yh), 'Z');\n            break;\n          case OPS.moveTo:\n            x = args[j++];\n            y = args[j++];\n            d.push('M', pf(x), pf(y));\n            break;\n          case OPS.lineTo:\n            x = args[j++];\n            y = args[j++];\n            d.push('L', pf(x) , pf(y));\n            break;\n          case OPS.curveTo:\n            x = args[j + 4];\n            y = args[j + 5];\n            d.push('C', pf(args[j]), pf(args[j + 1]), pf(args[j + 2]),\n                   pf(args[j + 3]), pf(x), pf(y));\n            j += 6;\n            break;\n          case OPS.curveTo2:\n            x = args[j + 2];\n            y = args[j + 3];\n            d.push('C', pf(x), pf(y), pf(args[j]), pf(args[j + 1]),\n                   pf(args[j + 2]), pf(args[j + 3]));\n            j += 4;\n            break;\n          case OPS.curveTo3:\n            x = args[j + 2];\n            y = args[j + 3];\n            d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y),\n                   pf(x), pf(y));\n            j += 4;\n            break;\n          case OPS.closePath:\n            d.push('Z');\n            break;\n        }\n      }\n      current.path.setAttributeNS(null, 'd', d.join(' '));\n      current.path.setAttributeNS(null, 'stroke-miterlimit',\n                                  pf(current.miterLimit));\n      current.path.setAttributeNS(null, 'stroke-linecap', current.lineCap);\n      current.path.setAttributeNS(null, 'stroke-linejoin', current.lineJoin);\n      current.path.setAttributeNS(null, 'stroke-width',\n                                  pf(current.lineWidth) + 'px');\n      current.path.setAttributeNS(null, 'stroke-dasharray',\n                                  current.dashArray.map(pf).join(' '));\n      current.path.setAttributeNS(null, 'stroke-dashoffset',\n                                  pf(current.dashPhase) + 'px');\n      current.path.setAttributeNS(null, 'fill', 'none');\n\n      this.tgrp.appendChild(current.path);\n      if (current.pendingClip) {\n        this.cgrp.appendChild(this.tgrp);\n        this.pgrp.appendChild(this.cgrp);\n      } else {\n        this.pgrp.appendChild(this.tgrp);\n      }\n      // Saving a reference in current.element so that it can be addressed\n      // in 'fill' and 'stroke'\n      current.element = current.path;\n      current.setCurrentPoint(x, y);\n    },\n\n    endPath: function SVGGraphics_endPath() {\n      var current = this.current;\n      if (current.pendingClip) {\n        this.cgrp.appendChild(this.tgrp);\n        this.pgrp.appendChild(this.cgrp);\n      } else {\n        this.pgrp.appendChild(this.tgrp);\n      }\n      this.tgrp = document.createElementNS(NS, 'svg:g');\n      this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));\n    },\n\n    clip: function SVGGraphics_clip(type) {\n      var current = this.current;\n      // Add current path to clipping path\n      current.clipId = 'clippath' + clipCount;\n      clipCount++;\n      this.clippath = document.createElementNS(NS, 'svg:clipPath');\n      this.clippath.setAttributeNS(null, 'id', current.clipId);\n      var clipElement = current.element.cloneNode();\n      if (type === 'evenodd') {\n        clipElement.setAttributeNS(null, 'clip-rule', 'evenodd');\n      } else {\n        clipElement.setAttributeNS(null, 'clip-rule', 'nonzero');\n      }\n      this.clippath.setAttributeNS(null, 'transform', pm(this.transformMatrix));\n      this.clippath.appendChild(clipElement);\n      this.defs.appendChild(this.clippath);\n\n      // Create a new group with that attribute\n      current.pendingClip = true;\n      this.cgrp = document.createElementNS(NS, 'svg:g');\n      this.cgrp.setAttributeNS(null, 'clip-path',\n                               'url(#' + current.clipId + ')');\n      this.pgrp.appendChild(this.cgrp);\n    },\n\n    closePath: function SVGGraphics_closePath() {\n      var current = this.current;\n      var d = current.path.getAttributeNS(null, 'd');\n      d += 'Z';\n      current.path.setAttributeNS(null, 'd', d);\n    },\n\n    setLeading: function SVGGraphics_setLeading(leading) {\n      this.current.leading = -leading;\n    },\n\n    setTextRise: function SVGGraphics_setTextRise(textRise) {\n      this.current.textRise = textRise;\n    },\n\n    setHScale: function SVGGraphics_setHScale(scale) {\n      this.current.textHScale = scale / 100;\n    },\n\n    setGState: function SVGGraphics_setGState(states) {\n      for (var i = 0, ii = states.length; i < ii; i++) {\n        var state = states[i];\n        var key = state[0];\n        var value = state[1];\n\n        switch (key) {\n          case 'LW':\n            this.setLineWidth(value);\n            break;\n          case 'LC':\n            this.setLineCap(value);\n            break;\n          case 'LJ':\n            this.setLineJoin(value);\n            break;\n          case 'ML':\n            this.setMiterLimit(value);\n            break;\n          case 'D':\n            this.setDash(value[0], value[1]);\n            break;\n          case 'RI':\n            break;\n          case 'FL':\n            break;\n          case 'Font':\n            this.setFont(value);\n            break;\n          case 'CA':\n            break;\n          case 'ca':\n            break;\n          case 'BM':\n            break;\n          case 'SMask':\n            break;\n        }\n      }\n    },\n\n    fill: function SVGGraphics_fill() {\n      var current = this.current;\n      current.element.setAttributeNS(null, 'fill', current.fillColor);\n    },\n\n    stroke: function SVGGraphics_stroke() {\n      var current = this.current;\n      current.element.setAttributeNS(null, 'stroke', current.strokeColor);\n      current.element.setAttributeNS(null, 'fill', 'none');\n    },\n\n    eoFill: function SVGGraphics_eoFill() {\n      var current = this.current;\n      current.element.setAttributeNS(null, 'fill', current.fillColor);\n      current.element.setAttributeNS(null, 'fill-rule', 'evenodd');\n    },\n\n    fillStroke: function SVGGraphics_fillStroke() {\n      // Order is important since stroke wants fill to be none.\n      // First stroke, then if fill needed, it will be overwritten.\n      this.stroke();\n      this.fill();\n    },\n\n    eoFillStroke: function SVGGraphics_eoFillStroke() {\n      this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd');\n      this.fillStroke();\n    },\n\n    closeStroke: function SVGGraphics_closeStroke() {\n      this.closePath();\n      this.stroke();\n    },\n\n    closeFillStroke: function SVGGraphics_closeFillStroke() {\n      this.closePath();\n      this.fillStroke();\n    },\n\n    paintSolidColorImageMask:\n        function SVGGraphics_paintSolidColorImageMask() {\n      var current = this.current;\n      var rect = document.createElementNS(NS, 'svg:rect');\n      rect.setAttributeNS(null, 'x', '0');\n      rect.setAttributeNS(null, 'y', '0');\n      rect.setAttributeNS(null, 'width', '1px');\n      rect.setAttributeNS(null, 'height', '1px');\n      rect.setAttributeNS(null, 'fill', current.fillColor);\n      this.tgrp.appendChild(rect);\n    },\n\n    paintJpegXObject: function SVGGraphics_paintJpegXObject(objId, w, h) {\n      var current = this.current;\n      var imgObj = this.objs.get(objId);\n      var imgEl = document.createElementNS(NS, 'svg:image');\n      imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src);\n      imgEl.setAttributeNS(null, 'width', imgObj.width + 'px');\n      imgEl.setAttributeNS(null, 'height', imgObj.height + 'px');\n      imgEl.setAttributeNS(null, 'x', '0');\n      imgEl.setAttributeNS(null, 'y', pf(-h));\n      imgEl.setAttributeNS(null, 'transform',\n                           'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')');\n\n      this.tgrp.appendChild(imgEl);\n      if (current.pendingClip) {\n        this.cgrp.appendChild(this.tgrp);\n        this.pgrp.appendChild(this.cgrp);\n      } else {\n        this.pgrp.appendChild(this.tgrp);\n      }\n    },\n\n    paintImageXObject: function SVGGraphics_paintImageXObject(objId) {\n      var imgData = this.objs.get(objId);\n      if (!imgData) {\n        warn('Dependent image isn\\'t ready yet');\n        return;\n      }\n      this.paintInlineImageXObject(imgData);\n    },\n\n    paintInlineImageXObject:\n        function SVGGraphics_paintInlineImageXObject(imgData, mask) {\n      var current = this.current;\n      var width = imgData.width;\n      var height = imgData.height;\n\n      var imgSrc = convertImgDataToPng(imgData);\n      var cliprect = document.createElementNS(NS, 'svg:rect');\n      cliprect.setAttributeNS(null, 'x', '0');\n      cliprect.setAttributeNS(null, 'y', '0');\n      cliprect.setAttributeNS(null, 'width', pf(width));\n      cliprect.setAttributeNS(null, 'height', pf(height));\n      current.element = cliprect;\n      this.clip('nonzero');\n      var imgEl = document.createElementNS(NS, 'svg:image');\n      imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgSrc);\n      imgEl.setAttributeNS(null, 'x', '0');\n      imgEl.setAttributeNS(null, 'y', pf(-height));\n      imgEl.setAttributeNS(null, 'width', pf(width) + 'px');\n      imgEl.setAttributeNS(null, 'height', pf(height) + 'px');\n      imgEl.setAttributeNS(null, 'transform',\n                           'scale(' + pf(1 / width) + ' ' +\n                           pf(-1 / height) + ')');\n      if (mask) {\n        mask.appendChild(imgEl);\n      } else {\n        this.tgrp.appendChild(imgEl);\n      }\n      if (current.pendingClip) {\n        this.cgrp.appendChild(this.tgrp);\n        this.pgrp.appendChild(this.cgrp);\n      } else {\n        this.pgrp.appendChild(this.tgrp);\n      }\n    },\n\n    paintImageMaskXObject:\n        function SVGGraphics_paintImageMaskXObject(imgData) {\n      var current = this.current;\n      var width = imgData.width;\n      var height = imgData.height;\n      var fillColor = current.fillColor;\n\n      current.maskId = 'mask' + maskCount++;\n      var mask = document.createElementNS(NS, 'svg:mask');\n      mask.setAttributeNS(null, 'id', current.maskId);\n\n      var rect = document.createElementNS(NS, 'svg:rect');\n      rect.setAttributeNS(null, 'x', '0');\n      rect.setAttributeNS(null, 'y', '0');\n      rect.setAttributeNS(null, 'width', pf(width));\n      rect.setAttributeNS(null, 'height', pf(height));\n      rect.setAttributeNS(null, 'fill', fillColor);\n      rect.setAttributeNS(null, 'mask', 'url(#' + current.maskId +')');\n      this.defs.appendChild(mask);\n      this.tgrp.appendChild(rect);\n\n      this.paintInlineImageXObject(imgData, mask);\n    },\n\n    paintFormXObjectBegin:\n        function SVGGraphics_paintFormXObjectBegin(matrix, bbox) {\n      this.save();\n\n      if (isArray(matrix) && matrix.length === 6) {\n        this.transform(matrix[0], matrix[1], matrix[2],\n                       matrix[3], matrix[4], matrix[5]);\n      }\n\n      if (isArray(bbox) && bbox.length === 4) {\n        var width = bbox[2] - bbox[0];\n        var height = bbox[3] - bbox[1];\n\n        var cliprect = document.createElementNS(NS, 'svg:rect');\n        cliprect.setAttributeNS(null, 'x', bbox[0]);\n        cliprect.setAttributeNS(null, 'y', bbox[1]);\n        cliprect.setAttributeNS(null, 'width', pf(width));\n        cliprect.setAttributeNS(null, 'height', pf(height));\n        this.current.element = cliprect;\n        this.clip('nonzero');\n        this.endPath();\n      }\n    },\n\n    paintFormXObjectEnd:\n        function SVGGraphics_paintFormXObjectEnd() {\n      this.restore();\n    }\n  };\n  return SVGGraphics;\n})();\n\nPDFJS.SVGGraphics = SVGGraphics;\n\n\n}).call((typeof window === 'undefined') ? this : window);\n\nif (!PDFJS.workerSrc && typeof document !== 'undefined') {\n  // workerSrc is not set -- using last script url to define default location\n  PDFJS.workerSrc = (function () {\n    'use strict';\n    var scriptTagContainer = document.body ||\n                             document.getElementsByTagName('head')[0];\n    var pdfjsSrc = scriptTagContainer.lastChild.src;\n    return pdfjsSrc && pdfjsSrc.replace(/\\.js$/i, '.worker.js');\n  })();\n}\n\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/static/generic/build/pdf.worker.js",
    "content": "/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */\n/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/*jshint globalstrict: false */\n/* globals PDFJS */\n\n// Initializing PDFJS global object (if still undefined)\nif (typeof PDFJS === 'undefined') {\n  (typeof window !== 'undefined' ? window : this).PDFJS = {};\n}\n\nPDFJS.version = '1.1.159';\nPDFJS.build = '82536f8';\n\n(function pdfjsWrapper() {\n  // Use strict in our context only - users might not want it\n  'use strict';\n\n/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */\n/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals Cmd, ColorSpace, Dict, MozBlobBuilder, Name, PDFJS, Ref, URL,\n           Promise */\n\n'use strict';\n\nvar globalScope = (typeof window === 'undefined') ? this : window;\n\nvar isWorker = (typeof window === 'undefined');\n\nvar FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];\n\nvar TextRenderingMode = {\n  FILL: 0,\n  STROKE: 1,\n  FILL_STROKE: 2,\n  INVISIBLE: 3,\n  FILL_ADD_TO_PATH: 4,\n  STROKE_ADD_TO_PATH: 5,\n  FILL_STROKE_ADD_TO_PATH: 6,\n  ADD_TO_PATH: 7,\n  FILL_STROKE_MASK: 3,\n  ADD_TO_PATH_FLAG: 4\n};\n\nvar ImageKind = {\n  GRAYSCALE_1BPP: 1,\n  RGB_24BPP: 2,\n  RGBA_32BPP: 3\n};\n\nvar AnnotationType = {\n  WIDGET: 1,\n  TEXT: 2,\n  LINK: 3\n};\n\nvar StreamType = {\n  UNKNOWN: 0,\n  FLATE: 1,\n  LZW: 2,\n  DCT: 3,\n  JPX: 4,\n  JBIG: 5,\n  A85: 6,\n  AHX: 7,\n  CCF: 8,\n  RL: 9\n};\n\nvar FontType = {\n  UNKNOWN: 0,\n  TYPE1: 1,\n  TYPE1C: 2,\n  CIDFONTTYPE0: 3,\n  CIDFONTTYPE0C: 4,\n  TRUETYPE: 5,\n  CIDFONTTYPE2: 6,\n  TYPE3: 7,\n  OPENTYPE: 8,\n  TYPE0: 9,\n  MMTYPE1: 10\n};\n\n// The global PDFJS object exposes the API\n// In production, it will be declared outside a global wrapper\n// In development, it will be declared here\nif (!globalScope.PDFJS) {\n  globalScope.PDFJS = {};\n}\n\nglobalScope.PDFJS.pdfBug = false;\n\nPDFJS.VERBOSITY_LEVELS = {\n  errors: 0,\n  warnings: 1,\n  infos: 5\n};\n\n// All the possible operations for an operator list.\nvar OPS = PDFJS.OPS = {\n  // Intentionally start from 1 so it is easy to spot bad operators that will be\n  // 0's.\n  dependency: 1,\n  setLineWidth: 2,\n  setLineCap: 3,\n  setLineJoin: 4,\n  setMiterLimit: 5,\n  setDash: 6,\n  setRenderingIntent: 7,\n  setFlatness: 8,\n  setGState: 9,\n  save: 10,\n  restore: 11,\n  transform: 12,\n  moveTo: 13,\n  lineTo: 14,\n  curveTo: 15,\n  curveTo2: 16,\n  curveTo3: 17,\n  closePath: 18,\n  rectangle: 19,\n  stroke: 20,\n  closeStroke: 21,\n  fill: 22,\n  eoFill: 23,\n  fillStroke: 24,\n  eoFillStroke: 25,\n  closeFillStroke: 26,\n  closeEOFillStroke: 27,\n  endPath: 28,\n  clip: 29,\n  eoClip: 30,\n  beginText: 31,\n  endText: 32,\n  setCharSpacing: 33,\n  setWordSpacing: 34,\n  setHScale: 35,\n  setLeading: 36,\n  setFont: 37,\n  setTextRenderingMode: 38,\n  setTextRise: 39,\n  moveText: 40,\n  setLeadingMoveText: 41,\n  setTextMatrix: 42,\n  nextLine: 43,\n  showText: 44,\n  showSpacedText: 45,\n  nextLineShowText: 46,\n  nextLineSetSpacingShowText: 47,\n  setCharWidth: 48,\n  setCharWidthAndBounds: 49,\n  setStrokeColorSpace: 50,\n  setFillColorSpace: 51,\n  setStrokeColor: 52,\n  setStrokeColorN: 53,\n  setFillColor: 54,\n  setFillColorN: 55,\n  setStrokeGray: 56,\n  setFillGray: 57,\n  setStrokeRGBColor: 58,\n  setFillRGBColor: 59,\n  setStrokeCMYKColor: 60,\n  setFillCMYKColor: 61,\n  shadingFill: 62,\n  beginInlineImage: 63,\n  beginImageData: 64,\n  endInlineImage: 65,\n  paintXObject: 66,\n  markPoint: 67,\n  markPointProps: 68,\n  beginMarkedContent: 69,\n  beginMarkedContentProps: 70,\n  endMarkedContent: 71,\n  beginCompat: 72,\n  endCompat: 73,\n  paintFormXObjectBegin: 74,\n  paintFormXObjectEnd: 75,\n  beginGroup: 76,\n  endGroup: 77,\n  beginAnnotations: 78,\n  endAnnotations: 79,\n  beginAnnotation: 80,\n  endAnnotation: 81,\n  paintJpegXObject: 82,\n  paintImageMaskXObject: 83,\n  paintImageMaskXObjectGroup: 84,\n  paintImageXObject: 85,\n  paintInlineImageXObject: 86,\n  paintInlineImageXObjectGroup: 87,\n  paintImageXObjectRepeat: 88,\n  paintImageMaskXObjectRepeat: 89,\n  paintSolidColorImageMask: 90,\n  constructPath: 91\n};\n\n// A notice for devs. These are good for things that are helpful to devs, such\n// as warning that Workers were disabled, which is important to devs but not\n// end users.\nfunction info(msg) {\n  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.infos) {\n    console.log('Info: ' + msg);\n  }\n}\n\n// Non-fatal warnings.\nfunction warn(msg) {\n  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.warnings) {\n    console.log('Warning: ' + msg);\n  }\n}\n\n// Fatal errors that should trigger the fallback UI and halt execution by\n// throwing an exception.\nfunction error(msg) {\n  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.errors) {\n    console.log('Error: ' + msg);\n    console.log(backtrace());\n  }\n  UnsupportedManager.notify(UNSUPPORTED_FEATURES.unknown);\n  throw new Error(msg);\n}\n\nfunction backtrace() {\n  try {\n    throw new Error();\n  } catch (e) {\n    return e.stack ? e.stack.split('\\n').slice(2).join('\\n') : '';\n  }\n}\n\nfunction assert(cond, msg) {\n  if (!cond) {\n    error(msg);\n  }\n}\n\nvar UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = {\n  unknown: 'unknown',\n  forms: 'forms',\n  javaScript: 'javaScript',\n  smask: 'smask',\n  shadingPattern: 'shadingPattern',\n  font: 'font'\n};\n\nvar UnsupportedManager = PDFJS.UnsupportedManager =\n  (function UnsupportedManagerClosure() {\n  var listeners = [];\n  return {\n    listen: function (cb) {\n      listeners.push(cb);\n    },\n    notify: function (featureId) {\n      warn('Unsupported feature \"' + featureId + '\"');\n      for (var i = 0, ii = listeners.length; i < ii; i++) {\n        listeners[i](featureId);\n      }\n    }\n  };\n})();\n\n// Combines two URLs. The baseUrl shall be absolute URL. If the url is an\n// absolute URL, it will be returned as is.\nfunction combineUrl(baseUrl, url) {\n  if (!url) {\n    return baseUrl;\n  }\n  if (/^[a-z][a-z0-9+\\-.]*:/i.test(url)) {\n    return url;\n  }\n  var i;\n  if (url.charAt(0) === '/') {\n    // absolute path\n    i = baseUrl.indexOf('://');\n    if (url.charAt(1) === '/') {\n      ++i;\n    } else {\n      i = baseUrl.indexOf('/', i + 3);\n    }\n    return baseUrl.substring(0, i) + url;\n  } else {\n    // relative path\n    var pathLength = baseUrl.length;\n    i = baseUrl.lastIndexOf('#');\n    pathLength = i >= 0 ? i : pathLength;\n    i = baseUrl.lastIndexOf('?', pathLength);\n    pathLength = i >= 0 ? i : pathLength;\n    var prefixLength = baseUrl.lastIndexOf('/', pathLength);\n    return baseUrl.substring(0, prefixLength + 1) + url;\n  }\n}\n\n// Validates if URL is safe and allowed, e.g. to avoid XSS.\nfunction isValidUrl(url, allowRelative) {\n  if (!url) {\n    return false;\n  }\n  // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1)\n  // scheme = ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\n  var protocol = /^[a-z][a-z0-9+\\-.]*(?=:)/i.exec(url);\n  if (!protocol) {\n    return allowRelative;\n  }\n  protocol = protocol[0].toLowerCase();\n  switch (protocol) {\n    case 'http':\n    case 'https':\n    case 'ftp':\n    case 'mailto':\n    case 'tel':\n      return true;\n    default:\n      return false;\n  }\n}\nPDFJS.isValidUrl = isValidUrl;\n\nfunction shadow(obj, prop, value) {\n  Object.defineProperty(obj, prop, { value: value,\n                                     enumerable: true,\n                                     configurable: true,\n                                     writable: false });\n  return value;\n}\nPDFJS.shadow = shadow;\n\nvar PasswordResponses = PDFJS.PasswordResponses = {\n  NEED_PASSWORD: 1,\n  INCORRECT_PASSWORD: 2\n};\n\nvar PasswordException = (function PasswordExceptionClosure() {\n  function PasswordException(msg, code) {\n    this.name = 'PasswordException';\n    this.message = msg;\n    this.code = code;\n  }\n\n  PasswordException.prototype = new Error();\n  PasswordException.constructor = PasswordException;\n\n  return PasswordException;\n})();\nPDFJS.PasswordException = PasswordException;\n\nvar UnknownErrorException = (function UnknownErrorExceptionClosure() {\n  function UnknownErrorException(msg, details) {\n    this.name = 'UnknownErrorException';\n    this.message = msg;\n    this.details = details;\n  }\n\n  UnknownErrorException.prototype = new Error();\n  UnknownErrorException.constructor = UnknownErrorException;\n\n  return UnknownErrorException;\n})();\nPDFJS.UnknownErrorException = UnknownErrorException;\n\nvar InvalidPDFException = (function InvalidPDFExceptionClosure() {\n  function InvalidPDFException(msg) {\n    this.name = 'InvalidPDFException';\n    this.message = msg;\n  }\n\n  InvalidPDFException.prototype = new Error();\n  InvalidPDFException.constructor = InvalidPDFException;\n\n  return InvalidPDFException;\n})();\nPDFJS.InvalidPDFException = InvalidPDFException;\n\nvar MissingPDFException = (function MissingPDFExceptionClosure() {\n  function MissingPDFException(msg) {\n    this.name = 'MissingPDFException';\n    this.message = msg;\n  }\n\n  MissingPDFException.prototype = new Error();\n  MissingPDFException.constructor = MissingPDFException;\n\n  return MissingPDFException;\n})();\nPDFJS.MissingPDFException = MissingPDFException;\n\nvar UnexpectedResponseException =\n    (function UnexpectedResponseExceptionClosure() {\n  function UnexpectedResponseException(msg, status) {\n    this.name = 'UnexpectedResponseException';\n    this.message = msg;\n    this.status = status;\n  }\n\n  UnexpectedResponseException.prototype = new Error();\n  UnexpectedResponseException.constructor = UnexpectedResponseException;\n\n  return UnexpectedResponseException;\n})();\nPDFJS.UnexpectedResponseException = UnexpectedResponseException;\n\nvar NotImplementedException = (function NotImplementedExceptionClosure() {\n  function NotImplementedException(msg) {\n    this.message = msg;\n  }\n\n  NotImplementedException.prototype = new Error();\n  NotImplementedException.prototype.name = 'NotImplementedException';\n  NotImplementedException.constructor = NotImplementedException;\n\n  return NotImplementedException;\n})();\n\nvar MissingDataException = (function MissingDataExceptionClosure() {\n  function MissingDataException(begin, end) {\n    this.begin = begin;\n    this.end = end;\n    this.message = 'Missing data [' + begin + ', ' + end + ')';\n  }\n\n  MissingDataException.prototype = new Error();\n  MissingDataException.prototype.name = 'MissingDataException';\n  MissingDataException.constructor = MissingDataException;\n\n  return MissingDataException;\n})();\n\nvar XRefParseException = (function XRefParseExceptionClosure() {\n  function XRefParseException(msg) {\n    this.message = msg;\n  }\n\n  XRefParseException.prototype = new Error();\n  XRefParseException.prototype.name = 'XRefParseException';\n  XRefParseException.constructor = XRefParseException;\n\n  return XRefParseException;\n})();\n\n\nfunction bytesToString(bytes) {\n  assert(bytes !== null && typeof bytes === 'object' &&\n         bytes.length !== undefined, 'Invalid argument for bytesToString');\n  var length = bytes.length;\n  var MAX_ARGUMENT_COUNT = 8192;\n  if (length < MAX_ARGUMENT_COUNT) {\n    return String.fromCharCode.apply(null, bytes);\n  }\n  var strBuf = [];\n  for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) {\n    var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);\n    var chunk = bytes.subarray(i, chunkEnd);\n    strBuf.push(String.fromCharCode.apply(null, chunk));\n  }\n  return strBuf.join('');\n}\n\nfunction stringToBytes(str) {\n  assert(typeof str === 'string', 'Invalid argument for stringToBytes');\n  var length = str.length;\n  var bytes = new Uint8Array(length);\n  for (var i = 0; i < length; ++i) {\n    bytes[i] = str.charCodeAt(i) & 0xFF;\n  }\n  return bytes;\n}\n\nfunction string32(value) {\n  return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,\n                             (value >> 8) & 0xff, value & 0xff);\n}\n\nfunction log2(x) {\n  var n = 1, i = 0;\n  while (x > n) {\n    n <<= 1;\n    i++;\n  }\n  return i;\n}\n\nfunction readInt8(data, start) {\n  return (data[start] << 24) >> 24;\n}\n\nfunction readUint16(data, offset) {\n  return (data[offset] << 8) | data[offset + 1];\n}\n\nfunction readUint32(data, offset) {\n  return ((data[offset] << 24) | (data[offset + 1] << 16) |\n         (data[offset + 2] << 8) | data[offset + 3]) >>> 0;\n}\n\n// Lazy test the endianness of the platform\n// NOTE: This will be 'true' for simulated TypedArrays\nfunction isLittleEndian() {\n  var buffer8 = new Uint8Array(2);\n  buffer8[0] = 1;\n  var buffer16 = new Uint16Array(buffer8.buffer);\n  return (buffer16[0] === 1);\n}\n\nObject.defineProperty(PDFJS, 'isLittleEndian', {\n  configurable: true,\n  get: function PDFJS_isLittleEndian() {\n    return shadow(PDFJS, 'isLittleEndian', isLittleEndian());\n  }\n});\n\n  // Lazy test if the userAgant support CanvasTypedArrays\nfunction hasCanvasTypedArrays() {\n  var canvas = document.createElement('canvas');\n  canvas.width = canvas.height = 1;\n  var ctx = canvas.getContext('2d');\n  var imageData = ctx.createImageData(1, 1);\n  return (typeof imageData.data.buffer !== 'undefined');\n}\n\nObject.defineProperty(PDFJS, 'hasCanvasTypedArrays', {\n  configurable: true,\n  get: function PDFJS_hasCanvasTypedArrays() {\n    return shadow(PDFJS, 'hasCanvasTypedArrays', hasCanvasTypedArrays());\n  }\n});\n\nvar Uint32ArrayView = (function Uint32ArrayViewClosure() {\n\n  function Uint32ArrayView(buffer, length) {\n    this.buffer = buffer;\n    this.byteLength = buffer.length;\n    this.length = length === undefined ? (this.byteLength >> 2) : length;\n    ensureUint32ArrayViewProps(this.length);\n  }\n  Uint32ArrayView.prototype = Object.create(null);\n\n  var uint32ArrayViewSetters = 0;\n  function createUint32ArrayProp(index) {\n    return {\n      get: function () {\n        var buffer = this.buffer, offset = index << 2;\n        return (buffer[offset] | (buffer[offset + 1] << 8) |\n          (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0;\n      },\n      set: function (value) {\n        var buffer = this.buffer, offset = index << 2;\n        buffer[offset] = value & 255;\n        buffer[offset + 1] = (value >> 8) & 255;\n        buffer[offset + 2] = (value >> 16) & 255;\n        buffer[offset + 3] = (value >>> 24) & 255;\n      }\n    };\n  }\n\n  function ensureUint32ArrayViewProps(length) {\n    while (uint32ArrayViewSetters < length) {\n      Object.defineProperty(Uint32ArrayView.prototype,\n        uint32ArrayViewSetters,\n        createUint32ArrayProp(uint32ArrayViewSetters));\n      uint32ArrayViewSetters++;\n    }\n  }\n\n  return Uint32ArrayView;\n})();\n\nvar IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];\n\nvar Util = PDFJS.Util = (function UtilClosure() {\n  function Util() {}\n\n  var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];\n\n  // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids\n  // creating many intermediate strings.\n  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {\n    rgbBuf[1] = r;\n    rgbBuf[3] = g;\n    rgbBuf[5] = b;\n    return rgbBuf.join('');\n  };\n\n  // Concatenates two transformation matrices together and returns the result.\n  Util.transform = function Util_transform(m1, m2) {\n    return [\n      m1[0] * m2[0] + m1[2] * m2[1],\n      m1[1] * m2[0] + m1[3] * m2[1],\n      m1[0] * m2[2] + m1[2] * m2[3],\n      m1[1] * m2[2] + m1[3] * m2[3],\n      m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n      m1[1] * m2[4] + m1[3] * m2[5] + m1[5]\n    ];\n  };\n\n  // For 2d affine transforms\n  Util.applyTransform = function Util_applyTransform(p, m) {\n    var xt = p[0] * m[0] + p[1] * m[2] + m[4];\n    var yt = p[0] * m[1] + p[1] * m[3] + m[5];\n    return [xt, yt];\n  };\n\n  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {\n    var d = m[0] * m[3] - m[1] * m[2];\n    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n    return [xt, yt];\n  };\n\n  // Applies the transform to the rectangle and finds the minimum axially\n  // aligned bounding box.\n  Util.getAxialAlignedBoundingBox =\n    function Util_getAxialAlignedBoundingBox(r, m) {\n\n    var p1 = Util.applyTransform(r, m);\n    var p2 = Util.applyTransform(r.slice(2, 4), m);\n    var p3 = Util.applyTransform([r[0], r[3]], m);\n    var p4 = Util.applyTransform([r[2], r[1]], m);\n    return [\n      Math.min(p1[0], p2[0], p3[0], p4[0]),\n      Math.min(p1[1], p2[1], p3[1], p4[1]),\n      Math.max(p1[0], p2[0], p3[0], p4[0]),\n      Math.max(p1[1], p2[1], p3[1], p4[1])\n    ];\n  };\n\n  Util.inverseTransform = function Util_inverseTransform(m) {\n    var d = m[0] * m[3] - m[1] * m[2];\n    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d,\n      (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];\n  };\n\n  // Apply a generic 3d matrix M on a 3-vector v:\n  //   | a b c |   | X |\n  //   | d e f | x | Y |\n  //   | g h i |   | Z |\n  // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],\n  // with v as [X,Y,Z]\n  Util.apply3dTransform = function Util_apply3dTransform(m, v) {\n    return [\n      m[0] * v[0] + m[1] * v[1] + m[2] * v[2],\n      m[3] * v[0] + m[4] * v[1] + m[5] * v[2],\n      m[6] * v[0] + m[7] * v[1] + m[8] * v[2]\n    ];\n  };\n\n  // This calculation uses Singular Value Decomposition.\n  // The SVD can be represented with formula A = USV. We are interested in the\n  // matrix S here because it represents the scale values.\n  Util.singularValueDecompose2dScale =\n    function Util_singularValueDecompose2dScale(m) {\n\n    var transpose = [m[0], m[2], m[1], m[3]];\n\n    // Multiply matrix m with its transpose.\n    var a = m[0] * transpose[0] + m[1] * transpose[2];\n    var b = m[0] * transpose[1] + m[1] * transpose[3];\n    var c = m[2] * transpose[0] + m[3] * transpose[2];\n    var d = m[2] * transpose[1] + m[3] * transpose[3];\n\n    // Solve the second degree polynomial to get roots.\n    var first = (a + d) / 2;\n    var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;\n    var sx = first + second || 1;\n    var sy = first - second || 1;\n\n    // Scale values are the square roots of the eigenvalues.\n    return [Math.sqrt(sx), Math.sqrt(sy)];\n  };\n\n  // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)\n  // For coordinate systems whose origin lies in the bottom-left, this\n  // means normalization to (BL,TR) ordering. For systems with origin in the\n  // top-left, this means (TL,BR) ordering.\n  Util.normalizeRect = function Util_normalizeRect(rect) {\n    var r = rect.slice(0); // clone rect\n    if (rect[0] > rect[2]) {\n      r[0] = rect[2];\n      r[2] = rect[0];\n    }\n    if (rect[1] > rect[3]) {\n      r[1] = rect[3];\n      r[3] = rect[1];\n    }\n    return r;\n  };\n\n  // Returns a rectangle [x1, y1, x2, y2] corresponding to the\n  // intersection of rect1 and rect2. If no intersection, returns 'false'\n  // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]\n  Util.intersect = function Util_intersect(rect1, rect2) {\n    function compare(a, b) {\n      return a - b;\n    }\n\n    // Order points along the axes\n    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),\n        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),\n        result = [];\n\n    rect1 = Util.normalizeRect(rect1);\n    rect2 = Util.normalizeRect(rect2);\n\n    // X: first and second points belong to different rectangles?\n    if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||\n        (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {\n      // Intersection must be between second and third points\n      result[0] = orderedX[1];\n      result[2] = orderedX[2];\n    } else {\n      return false;\n    }\n\n    // Y: first and second points belong to different rectangles?\n    if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||\n        (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {\n      // Intersection must be between second and third points\n      result[1] = orderedY[1];\n      result[3] = orderedY[2];\n    } else {\n      return false;\n    }\n\n    return result;\n  };\n\n  Util.sign = function Util_sign(num) {\n    return num < 0 ? -1 : 1;\n  };\n\n  Util.appendToArray = function Util_appendToArray(arr1, arr2) {\n    Array.prototype.push.apply(arr1, arr2);\n  };\n\n  Util.prependToArray = function Util_prependToArray(arr1, arr2) {\n    Array.prototype.unshift.apply(arr1, arr2);\n  };\n\n  Util.extendObj = function extendObj(obj1, obj2) {\n    for (var key in obj2) {\n      obj1[key] = obj2[key];\n    }\n  };\n\n  Util.getInheritableProperty = function Util_getInheritableProperty(dict,\n                                                                     name) {\n    while (dict && !dict.has(name)) {\n      dict = dict.get('Parent');\n    }\n    if (!dict) {\n      return null;\n    }\n    return dict.get(name);\n  };\n\n  Util.inherit = function Util_inherit(sub, base, prototype) {\n    sub.prototype = Object.create(base.prototype);\n    sub.prototype.constructor = sub;\n    for (var prop in prototype) {\n      sub.prototype[prop] = prototype[prop];\n    }\n  };\n\n  Util.loadScript = function Util_loadScript(src, callback) {\n    var script = document.createElement('script');\n    var loaded = false;\n    script.setAttribute('src', src);\n    if (callback) {\n      script.onload = function() {\n        if (!loaded) {\n          callback();\n        }\n        loaded = true;\n      };\n    }\n    document.getElementsByTagName('head')[0].appendChild(script);\n  };\n\n  return Util;\n})();\n\n/**\n * PDF page viewport created based on scale, rotation and offset.\n * @class\n * @alias PDFJS.PageViewport\n */\nvar PageViewport = PDFJS.PageViewport = (function PageViewportClosure() {\n  /**\n   * @constructor\n   * @private\n   * @param viewBox {Array} xMin, yMin, xMax and yMax coordinates.\n   * @param scale {number} scale of the viewport.\n   * @param rotation {number} rotations of the viewport in degrees.\n   * @param offsetX {number} offset X\n   * @param offsetY {number} offset Y\n   * @param dontFlip {boolean} if true, axis Y will not be flipped.\n   */\n  function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) {\n    this.viewBox = viewBox;\n    this.scale = scale;\n    this.rotation = rotation;\n    this.offsetX = offsetX;\n    this.offsetY = offsetY;\n\n    // creating transform to convert pdf coordinate system to the normal\n    // canvas like coordinates taking in account scale and rotation\n    var centerX = (viewBox[2] + viewBox[0]) / 2;\n    var centerY = (viewBox[3] + viewBox[1]) / 2;\n    var rotateA, rotateB, rotateC, rotateD;\n    rotation = rotation % 360;\n    rotation = rotation < 0 ? rotation + 360 : rotation;\n    switch (rotation) {\n      case 180:\n        rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1;\n        break;\n      case 90:\n        rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0;\n        break;\n      case 270:\n        rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0;\n        break;\n      //case 0:\n      default:\n        rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1;\n        break;\n    }\n\n    if (dontFlip) {\n      rotateC = -rotateC; rotateD = -rotateD;\n    }\n\n    var offsetCanvasX, offsetCanvasY;\n    var width, height;\n    if (rotateA === 0) {\n      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;\n      width = Math.abs(viewBox[3] - viewBox[1]) * scale;\n      height = Math.abs(viewBox[2] - viewBox[0]) * scale;\n    } else {\n      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;\n      width = Math.abs(viewBox[2] - viewBox[0]) * scale;\n      height = Math.abs(viewBox[3] - viewBox[1]) * scale;\n    }\n    // creating transform for the following operations:\n    // translate(-centerX, -centerY), rotate and flip vertically,\n    // scale, and translate(offsetCanvasX, offsetCanvasY)\n    this.transform = [\n      rotateA * scale,\n      rotateB * scale,\n      rotateC * scale,\n      rotateD * scale,\n      offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,\n      offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY\n    ];\n\n    this.width = width;\n    this.height = height;\n    this.fontScale = scale;\n  }\n  PageViewport.prototype = /** @lends PDFJS.PageViewport.prototype */ {\n    /**\n     * Clones viewport with additional properties.\n     * @param args {Object} (optional) If specified, may contain the 'scale' or\n     * 'rotation' properties to override the corresponding properties in\n     * the cloned viewport.\n     * @returns {PDFJS.PageViewport} Cloned viewport.\n     */\n    clone: function PageViewPort_clone(args) {\n      args = args || {};\n      var scale = 'scale' in args ? args.scale : this.scale;\n      var rotation = 'rotation' in args ? args.rotation : this.rotation;\n      return new PageViewport(this.viewBox.slice(), scale, rotation,\n                              this.offsetX, this.offsetY, args.dontFlip);\n    },\n    /**\n     * Converts PDF point to the viewport coordinates. For examples, useful for\n     * converting PDF location into canvas pixel coordinates.\n     * @param x {number} X coordinate.\n     * @param y {number} Y coordinate.\n     * @returns {Object} Object that contains 'x' and 'y' properties of the\n     * point in the viewport coordinate space.\n     * @see {@link convertToPdfPoint}\n     * @see {@link convertToViewportRectangle}\n     */\n    convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {\n      return Util.applyTransform([x, y], this.transform);\n    },\n    /**\n     * Converts PDF rectangle to the viewport coordinates.\n     * @param rect {Array} xMin, yMin, xMax and yMax coordinates.\n     * @returns {Array} Contains corresponding coordinates of the rectangle\n     * in the viewport coordinate space.\n     * @see {@link convertToViewportPoint}\n     */\n    convertToViewportRectangle:\n      function PageViewport_convertToViewportRectangle(rect) {\n      var tl = Util.applyTransform([rect[0], rect[1]], this.transform);\n      var br = Util.applyTransform([rect[2], rect[3]], this.transform);\n      return [tl[0], tl[1], br[0], br[1]];\n    },\n    /**\n     * Converts viewport coordinates to the PDF location. For examples, useful\n     * for converting canvas pixel location into PDF one.\n     * @param x {number} X coordinate.\n     * @param y {number} Y coordinate.\n     * @returns {Object} Object that contains 'x' and 'y' properties of the\n     * point in the PDF coordinate space.\n     * @see {@link convertToViewportPoint}\n     */\n    convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {\n      return Util.applyInverseTransform([x, y], this.transform);\n    }\n  };\n  return PageViewport;\n})();\n\nvar PDFStringTranslateTable = [\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,\n  0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,\n  0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,\n  0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC\n];\n\nfunction stringToPDFString(str) {\n  var i, n = str.length, strBuf = [];\n  if (str[0] === '\\xFE' && str[1] === '\\xFF') {\n    // UTF16BE BOM\n    for (i = 2; i < n; i += 2) {\n      strBuf.push(String.fromCharCode(\n        (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1)));\n    }\n  } else {\n    for (i = 0; i < n; ++i) {\n      var code = PDFStringTranslateTable[str.charCodeAt(i)];\n      strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));\n    }\n  }\n  return strBuf.join('');\n}\n\nfunction stringToUTF8String(str) {\n  return decodeURIComponent(escape(str));\n}\n\nfunction utf8StringToString(str) {\n  return unescape(encodeURIComponent(str));\n}\n\nfunction isEmptyObj(obj) {\n  for (var key in obj) {\n    return false;\n  }\n  return true;\n}\n\nfunction isBool(v) {\n  return typeof v === 'boolean';\n}\n\nfunction isInt(v) {\n  return typeof v === 'number' && ((v | 0) === v);\n}\n\nfunction isNum(v) {\n  return typeof v === 'number';\n}\n\nfunction isString(v) {\n  return typeof v === 'string';\n}\n\nfunction isName(v) {\n  return v instanceof Name;\n}\n\nfunction isCmd(v, cmd) {\n  return v instanceof Cmd && (cmd === undefined || v.cmd === cmd);\n}\n\nfunction isDict(v, type) {\n  if (!(v instanceof Dict)) {\n    return false;\n  }\n  if (!type) {\n    return true;\n  }\n  var dictType = v.get('Type');\n  return isName(dictType) && dictType.name === type;\n}\n\nfunction isArray(v) {\n  return v instanceof Array;\n}\n\nfunction isStream(v) {\n  return typeof v === 'object' && v !== null && v.getBytes !== undefined;\n}\n\nfunction isArrayBuffer(v) {\n  return typeof v === 'object' && v !== null && v.byteLength !== undefined;\n}\n\nfunction isRef(v) {\n  return v instanceof Ref;\n}\n\n/**\n * Promise Capability object.\n *\n * @typedef {Object} PromiseCapability\n * @property {Promise} promise - A promise object.\n * @property {function} resolve - Fullfills the promise.\n * @property {function} reject - Rejects the promise.\n */\n\n/**\n * Creates a promise capability object.\n * @alias PDFJS.createPromiseCapability\n *\n * @return {PromiseCapability} A capability object contains:\n * - a Promise, resolve and reject methods.\n */\nfunction createPromiseCapability() {\n  var capability = {};\n  capability.promise = new Promise(function (resolve, reject) {\n    capability.resolve = resolve;\n    capability.reject = reject;\n  });\n  return capability;\n}\n\nPDFJS.createPromiseCapability = createPromiseCapability;\n\n/**\n * Polyfill for Promises:\n * The following promise implementation tries to generally implement the\n * Promise/A+ spec. Some notable differences from other promise libaries are:\n * - There currently isn't a seperate deferred and promise object.\n * - Unhandled rejections eventually show an error if they aren't handled.\n *\n * Based off of the work in:\n * https://bugzilla.mozilla.org/show_bug.cgi?id=810490\n */\n(function PromiseClosure() {\n  if (globalScope.Promise) {\n    // Promises existing in the DOM/Worker, checking presence of all/resolve\n    if (typeof globalScope.Promise.all !== 'function') {\n      globalScope.Promise.all = function (iterable) {\n        var count = 0, results = [], resolve, reject;\n        var promise = new globalScope.Promise(function (resolve_, reject_) {\n          resolve = resolve_;\n          reject = reject_;\n        });\n        iterable.forEach(function (p, i) {\n          count++;\n          p.then(function (result) {\n            results[i] = result;\n            count--;\n            if (count === 0) {\n              resolve(results);\n            }\n          }, reject);\n        });\n        if (count === 0) {\n          resolve(results);\n        }\n        return promise;\n      };\n    }\n    if (typeof globalScope.Promise.resolve !== 'function') {\n      globalScope.Promise.resolve = function (value) {\n        return new globalScope.Promise(function (resolve) { resolve(value); });\n      };\n    }\n    if (typeof globalScope.Promise.reject !== 'function') {\n      globalScope.Promise.reject = function (reason) {\n        return new globalScope.Promise(function (resolve, reject) {\n          reject(reason);\n        });\n      };\n    }\n    if (typeof globalScope.Promise.prototype.catch !== 'function') {\n      globalScope.Promise.prototype.catch = function (onReject) {\n        return globalScope.Promise.prototype.then(undefined, onReject);\n      };\n    }\n    return;\n  }\n  var STATUS_PENDING = 0;\n  var STATUS_RESOLVED = 1;\n  var STATUS_REJECTED = 2;\n\n  // In an attempt to avoid silent exceptions, unhandled rejections are\n  // tracked and if they aren't handled in a certain amount of time an\n  // error is logged.\n  var REJECTION_TIMEOUT = 500;\n\n  var HandlerManager = {\n    handlers: [],\n    running: false,\n    unhandledRejections: [],\n    pendingRejectionCheck: false,\n\n    scheduleHandlers: function scheduleHandlers(promise) {\n      if (promise._status === STATUS_PENDING) {\n        return;\n      }\n\n      this.handlers = this.handlers.concat(promise._handlers);\n      promise._handlers = [];\n\n      if (this.running) {\n        return;\n      }\n      this.running = true;\n\n      setTimeout(this.runHandlers.bind(this), 0);\n    },\n\n    runHandlers: function runHandlers() {\n      var RUN_TIMEOUT = 1; // ms\n      var timeoutAt = Date.now() + RUN_TIMEOUT;\n      while (this.handlers.length > 0) {\n        var handler = this.handlers.shift();\n\n        var nextStatus = handler.thisPromise._status;\n        var nextValue = handler.thisPromise._value;\n\n        try {\n          if (nextStatus === STATUS_RESOLVED) {\n            if (typeof handler.onResolve === 'function') {\n              nextValue = handler.onResolve(nextValue);\n            }\n          } else if (typeof handler.onReject === 'function') {\n              nextValue = handler.onReject(nextValue);\n              nextStatus = STATUS_RESOLVED;\n\n              if (handler.thisPromise._unhandledRejection) {\n                this.removeUnhandeledRejection(handler.thisPromise);\n              }\n          }\n        } catch (ex) {\n          nextStatus = STATUS_REJECTED;\n          nextValue = ex;\n        }\n\n        handler.nextPromise._updateStatus(nextStatus, nextValue);\n        if (Date.now() >= timeoutAt) {\n          break;\n        }\n      }\n\n      if (this.handlers.length > 0) {\n        setTimeout(this.runHandlers.bind(this), 0);\n        return;\n      }\n\n      this.running = false;\n    },\n\n    addUnhandledRejection: function addUnhandledRejection(promise) {\n      this.unhandledRejections.push({\n        promise: promise,\n        time: Date.now()\n      });\n      this.scheduleRejectionCheck();\n    },\n\n    removeUnhandeledRejection: function removeUnhandeledRejection(promise) {\n      promise._unhandledRejection = false;\n      for (var i = 0; i < this.unhandledRejections.length; i++) {\n        if (this.unhandledRejections[i].promise === promise) {\n          this.unhandledRejections.splice(i);\n          i--;\n        }\n      }\n    },\n\n    scheduleRejectionCheck: function scheduleRejectionCheck() {\n      if (this.pendingRejectionCheck) {\n        return;\n      }\n      this.pendingRejectionCheck = true;\n      setTimeout(function rejectionCheck() {\n        this.pendingRejectionCheck = false;\n        var now = Date.now();\n        for (var i = 0; i < this.unhandledRejections.length; i++) {\n          if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) {\n            var unhandled = this.unhandledRejections[i].promise._value;\n            var msg = 'Unhandled rejection: ' + unhandled;\n            if (unhandled.stack) {\n              msg += '\\n' + unhandled.stack;\n            }\n            warn(msg);\n            this.unhandledRejections.splice(i);\n            i--;\n          }\n        }\n        if (this.unhandledRejections.length) {\n          this.scheduleRejectionCheck();\n        }\n      }.bind(this), REJECTION_TIMEOUT);\n    }\n  };\n\n  function Promise(resolver) {\n    this._status = STATUS_PENDING;\n    this._handlers = [];\n    try {\n      resolver.call(this, this._resolve.bind(this), this._reject.bind(this));\n    } catch (e) {\n      this._reject(e);\n    }\n  }\n  /**\n   * Builds a promise that is resolved when all the passed in promises are\n   * resolved.\n   * @param {array} array of data and/or promises to wait for.\n   * @return {Promise} New dependant promise.\n   */\n  Promise.all = function Promise_all(promises) {\n    var resolveAll, rejectAll;\n    var deferred = new Promise(function (resolve, reject) {\n      resolveAll = resolve;\n      rejectAll = reject;\n    });\n    var unresolved = promises.length;\n    var results = [];\n    if (unresolved === 0) {\n      resolveAll(results);\n      return deferred;\n    }\n    function reject(reason) {\n      if (deferred._status === STATUS_REJECTED) {\n        return;\n      }\n      results = [];\n      rejectAll(reason);\n    }\n    for (var i = 0, ii = promises.length; i < ii; ++i) {\n      var promise = promises[i];\n      var resolve = (function(i) {\n        return function(value) {\n          if (deferred._status === STATUS_REJECTED) {\n            return;\n          }\n          results[i] = value;\n          unresolved--;\n          if (unresolved === 0) {\n            resolveAll(results);\n          }\n        };\n      })(i);\n      if (Promise.isPromise(promise)) {\n        promise.then(resolve, reject);\n      } else {\n        resolve(promise);\n      }\n    }\n    return deferred;\n  };\n\n  /**\n   * Checks if the value is likely a promise (has a 'then' function).\n   * @return {boolean} true if value is thenable\n   */\n  Promise.isPromise = function Promise_isPromise(value) {\n    return value && typeof value.then === 'function';\n  };\n\n  /**\n   * Creates resolved promise\n   * @param value resolve value\n   * @returns {Promise}\n   */\n  Promise.resolve = function Promise_resolve(value) {\n    return new Promise(function (resolve) { resolve(value); });\n  };\n\n  /**\n   * Creates rejected promise\n   * @param reason rejection value\n   * @returns {Promise}\n   */\n  Promise.reject = function Promise_reject(reason) {\n    return new Promise(function (resolve, reject) { reject(reason); });\n  };\n\n  Promise.prototype = {\n    _status: null,\n    _value: null,\n    _handlers: null,\n    _unhandledRejection: null,\n\n    _updateStatus: function Promise__updateStatus(status, value) {\n      if (this._status === STATUS_RESOLVED ||\n          this._status === STATUS_REJECTED) {\n        return;\n      }\n\n      if (status === STATUS_RESOLVED &&\n          Promise.isPromise(value)) {\n        value.then(this._updateStatus.bind(this, STATUS_RESOLVED),\n                   this._updateStatus.bind(this, STATUS_REJECTED));\n        return;\n      }\n\n      this._status = status;\n      this._value = value;\n\n      if (status === STATUS_REJECTED && this._handlers.length === 0) {\n        this._unhandledRejection = true;\n        HandlerManager.addUnhandledRejection(this);\n      }\n\n      HandlerManager.scheduleHandlers(this);\n    },\n\n    _resolve: function Promise_resolve(value) {\n      this._updateStatus(STATUS_RESOLVED, value);\n    },\n\n    _reject: function Promise_reject(reason) {\n      this._updateStatus(STATUS_REJECTED, reason);\n    },\n\n    then: function Promise_then(onResolve, onReject) {\n      var nextPromise = new Promise(function (resolve, reject) {\n        this.resolve = resolve;\n        this.reject = reject;\n      });\n      this._handlers.push({\n        thisPromise: this,\n        onResolve: onResolve,\n        onReject: onReject,\n        nextPromise: nextPromise\n      });\n      HandlerManager.scheduleHandlers(this);\n      return nextPromise;\n    },\n\n    catch: function Promise_catch(onReject) {\n      return this.then(undefined, onReject);\n    }\n  };\n\n  globalScope.Promise = Promise;\n})();\n\nvar StatTimer = (function StatTimerClosure() {\n  function rpad(str, pad, length) {\n    while (str.length < length) {\n      str += pad;\n    }\n    return str;\n  }\n  function StatTimer() {\n    this.started = {};\n    this.times = [];\n    this.enabled = true;\n  }\n  StatTimer.prototype = {\n    time: function StatTimer_time(name) {\n      if (!this.enabled) {\n        return;\n      }\n      if (name in this.started) {\n        warn('Timer is already running for ' + name);\n      }\n      this.started[name] = Date.now();\n    },\n    timeEnd: function StatTimer_timeEnd(name) {\n      if (!this.enabled) {\n        return;\n      }\n      if (!(name in this.started)) {\n        warn('Timer has not been started for ' + name);\n      }\n      this.times.push({\n        'name': name,\n        'start': this.started[name],\n        'end': Date.now()\n      });\n      // Remove timer from started so it can be called again.\n      delete this.started[name];\n    },\n    toString: function StatTimer_toString() {\n      var i, ii;\n      var times = this.times;\n      var out = '';\n      // Find the longest name for padding purposes.\n      var longest = 0;\n      for (i = 0, ii = times.length; i < ii; ++i) {\n        var name = times[i]['name'];\n        if (name.length > longest) {\n          longest = name.length;\n        }\n      }\n      for (i = 0, ii = times.length; i < ii; ++i) {\n        var span = times[i];\n        var duration = span.end - span.start;\n        out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\\n';\n      }\n      return out;\n    }\n  };\n  return StatTimer;\n})();\n\nPDFJS.createBlob = function createBlob(data, contentType) {\n  if (typeof Blob !== 'undefined') {\n    return new Blob([data], { type: contentType });\n  }\n  // Blob builder is deprecated in FF14 and removed in FF18.\n  var bb = new MozBlobBuilder();\n  bb.append(data);\n  return bb.getBlob(contentType);\n};\n\nPDFJS.createObjectURL = (function createObjectURLClosure() {\n  // Blob/createObjectURL is not available, falling back to data schema.\n  var digits =\n    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\n  return function createObjectURL(data, contentType) {\n    if (!PDFJS.disableCreateObjectURL &&\n        typeof URL !== 'undefined' && URL.createObjectURL) {\n      var blob = PDFJS.createBlob(data, contentType);\n      return URL.createObjectURL(blob);\n    }\n\n    var buffer = 'data:' + contentType + ';base64,';\n    for (var i = 0, ii = data.length; i < ii; i += 3) {\n      var b1 = data[i] & 0xFF;\n      var b2 = data[i + 1] & 0xFF;\n      var b3 = data[i + 2] & 0xFF;\n      var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);\n      var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;\n      var d4 = i + 2 < ii ? (b3 & 0x3F) : 64;\n      buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];\n    }\n    return buffer;\n  };\n})();\n\nfunction MessageHandler(name, comObj) {\n  this.name = name;\n  this.comObj = comObj;\n  this.callbackIndex = 1;\n  this.postMessageTransfers = true;\n  var callbacksCapabilities = this.callbacksCapabilities = {};\n  var ah = this.actionHandler = {};\n\n  ah['console_log'] = [function ahConsoleLog(data) {\n    console.log.apply(console, data);\n  }];\n  ah['console_error'] = [function ahConsoleError(data) {\n    console.error.apply(console, data);\n  }];\n  ah['_unsupported_feature'] = [function ah_unsupportedFeature(data) {\n    UnsupportedManager.notify(data);\n  }];\n\n  comObj.onmessage = function messageHandlerComObjOnMessage(event) {\n    var data = event.data;\n    if (data.isReply) {\n      var callbackId = data.callbackId;\n      if (data.callbackId in callbacksCapabilities) {\n        var callback = callbacksCapabilities[callbackId];\n        delete callbacksCapabilities[callbackId];\n        if ('error' in data) {\n          callback.reject(data.error);\n        } else {\n          callback.resolve(data.data);\n        }\n      } else {\n        error('Cannot resolve callback ' + callbackId);\n      }\n    } else if (data.action in ah) {\n      var action = ah[data.action];\n      if (data.callbackId) {\n        Promise.resolve().then(function () {\n          return action[0].call(action[1], data.data);\n        }).then(function (result) {\n          comObj.postMessage({\n            isReply: true,\n            callbackId: data.callbackId,\n            data: result\n          });\n        }, function (reason) {\n          comObj.postMessage({\n            isReply: true,\n            callbackId: data.callbackId,\n            error: reason\n          });\n        });\n      } else {\n        action[0].call(action[1], data.data);\n      }\n    } else {\n      error('Unknown action from worker: ' + data.action);\n    }\n  };\n}\n\nMessageHandler.prototype = {\n  on: function messageHandlerOn(actionName, handler, scope) {\n    var ah = this.actionHandler;\n    if (ah[actionName]) {\n      error('There is already an actionName called \"' + actionName + '\"');\n    }\n    ah[actionName] = [handler, scope];\n  },\n  /**\n   * Sends a message to the comObj to invoke the action with the supplied data.\n   * @param {String} actionName Action to call.\n   * @param {JSON} data JSON data to send.\n   * @param {Array} [transfers] Optional list of transfers/ArrayBuffers\n   */\n  send: function messageHandlerSend(actionName, data, transfers) {\n    var message = {\n      action: actionName,\n      data: data\n    };\n    this.postMessage(message, transfers);\n  },\n  /**\n   * Sends a message to the comObj to invoke the action with the supplied data.\n   * Expects that other side will callback with the response.\n   * @param {String} actionName Action to call.\n   * @param {JSON} data JSON data to send.\n   * @param {Array} [transfers] Optional list of transfers/ArrayBuffers.\n   * @returns {Promise} Promise to be resolved with response data.\n   */\n  sendWithPromise:\n    function messageHandlerSendWithPromise(actionName, data, transfers) {\n    var callbackId = this.callbackIndex++;\n    var message = {\n      action: actionName,\n      data: data,\n      callbackId: callbackId\n    };\n    var capability = createPromiseCapability();\n    this.callbacksCapabilities[callbackId] = capability;\n    try {\n      this.postMessage(message, transfers);\n    } catch (e) {\n      capability.reject(e);\n    }\n    return capability.promise;\n  },\n  /**\n   * Sends raw message to the comObj.\n   * @private\n   * @param message {Object} Raw message.\n   * @param transfers List of transfers/ArrayBuffers, or undefined.\n   */\n  postMessage: function (message, transfers) {\n    if (transfers && this.postMessageTransfers) {\n      this.comObj.postMessage(message, transfers);\n    } else {\n      this.comObj.postMessage(message);\n    }\n  }\n};\n\nfunction loadJpegStream(id, imageUrl, objs) {\n  var img = new Image();\n  img.onload = (function loadJpegStream_onloadClosure() {\n    objs.resolve(id, img);\n  });\n  img.onerror = (function loadJpegStream_onerrorClosure() {\n    objs.resolve(id, null);\n    warn('Error during JPEG image loading');\n  });\n  img.src = imageUrl;\n}\n\n\n\n\nvar NetworkManager = (function NetworkManagerClosure() {\n\n  var OK_RESPONSE = 200;\n  var PARTIAL_CONTENT_RESPONSE = 206;\n\n  function NetworkManager(url, args) {\n    this.url = url;\n    args = args || {};\n    this.isHttp = /^https?:/i.test(url);\n    this.httpHeaders = (this.isHttp && args.httpHeaders) || {};\n    this.withCredentials = args.withCredentials || false;\n    this.getXhr = args.getXhr ||\n      function NetworkManager_getXhr() {\n        return new XMLHttpRequest();\n      };\n\n    this.currXhrId = 0;\n    this.pendingRequests = {};\n    this.loadedRequests = {};\n  }\n\n  function getArrayBuffer(xhr) {\n    var data = xhr.response;\n    if (typeof data !== 'string') {\n      return data;\n    }\n    var length = data.length;\n    var array = new Uint8Array(length);\n    for (var i = 0; i < length; i++) {\n      array[i] = data.charCodeAt(i) & 0xFF;\n    }\n    return array.buffer;\n  }\n\n  NetworkManager.prototype = {\n    requestRange: function NetworkManager_requestRange(begin, end, listeners) {\n      var args = {\n        begin: begin,\n        end: end\n      };\n      for (var prop in listeners) {\n        args[prop] = listeners[prop];\n      }\n      return this.request(args);\n    },\n\n    requestFull: function NetworkManager_requestFull(listeners) {\n      return this.request(listeners);\n    },\n\n    request: function NetworkManager_request(args) {\n      var xhr = this.getXhr();\n      var xhrId = this.currXhrId++;\n      var pendingRequest = this.pendingRequests[xhrId] = {\n        xhr: xhr\n      };\n\n      xhr.open('GET', this.url);\n      xhr.withCredentials = this.withCredentials;\n      for (var property in this.httpHeaders) {\n        var value = this.httpHeaders[property];\n        if (typeof value === 'undefined') {\n          continue;\n        }\n        xhr.setRequestHeader(property, value);\n      }\n      if (this.isHttp && 'begin' in args && 'end' in args) {\n        var rangeStr = args.begin + '-' + (args.end - 1);\n        xhr.setRequestHeader('Range', 'bytes=' + rangeStr);\n        pendingRequest.expectedStatus = 206;\n      } else {\n        pendingRequest.expectedStatus = 200;\n      }\n\n      if (args.onProgressiveData) {\n        // Some legacy browsers might throw an exception.\n        try {\n          xhr.responseType = 'moz-chunked-arraybuffer';\n        } catch(e) {}\n        if (xhr.responseType === 'moz-chunked-arraybuffer') {\n          pendingRequest.onProgressiveData = args.onProgressiveData;\n          pendingRequest.mozChunked = true;\n        } else {\n          xhr.responseType = 'arraybuffer';\n        }\n      } else {\n        xhr.responseType = 'arraybuffer';\n      }\n\n      if (args.onError) {\n        xhr.onerror = function(evt) {\n          args.onError(xhr.status);\n        };\n      }\n      xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);\n      xhr.onprogress = this.onProgress.bind(this, xhrId);\n\n      pendingRequest.onHeadersReceived = args.onHeadersReceived;\n      pendingRequest.onDone = args.onDone;\n      pendingRequest.onError = args.onError;\n      pendingRequest.onProgress = args.onProgress;\n\n      xhr.send(null);\n\n      return xhrId;\n    },\n\n    onProgress: function NetworkManager_onProgress(xhrId, evt) {\n      var pendingRequest = this.pendingRequests[xhrId];\n      if (!pendingRequest) {\n        // Maybe abortRequest was called...\n        return;\n      }\n\n      if (pendingRequest.mozChunked) {\n        var chunk = getArrayBuffer(pendingRequest.xhr);\n        pendingRequest.onProgressiveData(chunk);\n      }\n\n      var onProgress = pendingRequest.onProgress;\n      if (onProgress) {\n        onProgress(evt);\n      }\n    },\n\n    onStateChange: function NetworkManager_onStateChange(xhrId, evt) {\n      var pendingRequest = this.pendingRequests[xhrId];\n      if (!pendingRequest) {\n        // Maybe abortRequest was called...\n        return;\n      }\n\n      var xhr = pendingRequest.xhr;\n      if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {\n        pendingRequest.onHeadersReceived();\n        delete pendingRequest.onHeadersReceived;\n      }\n\n      if (xhr.readyState !== 4) {\n        return;\n      }\n\n      if (!(xhrId in this.pendingRequests)) {\n        // The XHR request might have been aborted in onHeadersReceived()\n        // callback, in which case we should abort request\n        return;\n      }\n\n      delete this.pendingRequests[xhrId];\n\n      // success status == 0 can be on ftp, file and other protocols\n      if (xhr.status === 0 && this.isHttp) {\n        if (pendingRequest.onError) {\n          pendingRequest.onError(xhr.status);\n        }\n        return;\n      }\n      var xhrStatus = xhr.status || OK_RESPONSE;\n\n      // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2:\n      // \"A server MAY ignore the Range header\". This means it's possible to\n      // get a 200 rather than a 206 response from a range request.\n      var ok_response_on_range_request =\n          xhrStatus === OK_RESPONSE &&\n          pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;\n\n      if (!ok_response_on_range_request &&\n          xhrStatus !== pendingRequest.expectedStatus) {\n        if (pendingRequest.onError) {\n          pendingRequest.onError(xhr.status);\n        }\n        return;\n      }\n\n      this.loadedRequests[xhrId] = true;\n\n      var chunk = getArrayBuffer(xhr);\n      if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {\n        var rangeHeader = xhr.getResponseHeader('Content-Range');\n        var matches = /bytes (\\d+)-(\\d+)\\/(\\d+)/.exec(rangeHeader);\n        var begin = parseInt(matches[1], 10);\n        pendingRequest.onDone({\n          begin: begin,\n          chunk: chunk\n        });\n      } else if (pendingRequest.onProgressiveData) {\n        pendingRequest.onDone(null);\n      } else {\n        pendingRequest.onDone({\n          begin: 0,\n          chunk: chunk\n        });\n      }\n    },\n\n    hasPendingRequests: function NetworkManager_hasPendingRequests() {\n      for (var xhrId in this.pendingRequests) {\n        return true;\n      }\n      return false;\n    },\n\n    getRequestXhr: function NetworkManager_getXhr(xhrId) {\n      return this.pendingRequests[xhrId].xhr;\n    },\n\n    isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) {\n      return !!(this.pendingRequests[xhrId].onProgressiveData);\n    },\n\n    isPendingRequest: function NetworkManager_isPendingRequest(xhrId) {\n      return xhrId in this.pendingRequests;\n    },\n\n    isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) {\n      return xhrId in this.loadedRequests;\n    },\n\n    abortAllRequests: function NetworkManager_abortAllRequests() {\n      for (var xhrId in this.pendingRequests) {\n        this.abortRequest(xhrId | 0);\n      }\n    },\n\n    abortRequest: function NetworkManager_abortRequest(xhrId) {\n      var xhr = this.pendingRequests[xhrId].xhr;\n      delete this.pendingRequests[xhrId];\n      xhr.abort();\n    }\n  };\n\n  return NetworkManager;\n})();\n\n\nvar ChunkedStream = (function ChunkedStreamClosure() {\n  function ChunkedStream(length, chunkSize, manager) {\n    this.bytes = new Uint8Array(length);\n    this.start = 0;\n    this.pos = 0;\n    this.end = length;\n    this.chunkSize = chunkSize;\n    this.loadedChunks = [];\n    this.numChunksLoaded = 0;\n    this.numChunks = Math.ceil(length / chunkSize);\n    this.manager = manager;\n    this.progressiveDataLength = 0;\n    this.lastSuccessfulEnsureByteChunk = -1;  // a single-entry cache\n  }\n\n  // required methods for a stream. if a particular stream does not\n  // implement these, an error should be thrown\n  ChunkedStream.prototype = {\n\n    getMissingChunks: function ChunkedStream_getMissingChunks() {\n      var chunks = [];\n      for (var chunk = 0, n = this.numChunks; chunk < n; ++chunk) {\n        if (!this.loadedChunks[chunk]) {\n          chunks.push(chunk);\n        }\n      }\n      return chunks;\n    },\n\n    getBaseStreams: function ChunkedStream_getBaseStreams() {\n      return [this];\n    },\n\n    allChunksLoaded: function ChunkedStream_allChunksLoaded() {\n      return this.numChunksLoaded === this.numChunks;\n    },\n\n    onReceiveData: function ChunkedStream_onReceiveData(begin, chunk) {\n      var end = begin + chunk.byteLength;\n\n      assert(begin % this.chunkSize === 0, 'Bad begin offset: ' + begin);\n      // Using this.length is inaccurate here since this.start can be moved\n      // See ChunkedStream.moveStart()\n      var length = this.bytes.length;\n      assert(end % this.chunkSize === 0 || end === length,\n             'Bad end offset: ' + end);\n\n      this.bytes.set(new Uint8Array(chunk), begin);\n      var chunkSize = this.chunkSize;\n      var beginChunk = Math.floor(begin / chunkSize);\n      var endChunk = Math.floor((end - 1) / chunkSize) + 1;\n      var curChunk;\n\n      for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) {\n        if (!this.loadedChunks[curChunk]) {\n          this.loadedChunks[curChunk] = true;\n          ++this.numChunksLoaded;\n        }\n      }\n    },\n\n    onReceiveProgressiveData:\n        function ChunkedStream_onReceiveProgressiveData(data) {\n      var position = this.progressiveDataLength;\n      var beginChunk = Math.floor(position / this.chunkSize);\n\n      this.bytes.set(new Uint8Array(data), position);\n      position += data.byteLength;\n      this.progressiveDataLength = position;\n      var endChunk = position >= this.end ? this.numChunks :\n                     Math.floor(position / this.chunkSize);\n      var curChunk;\n      for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) {\n        if (!this.loadedChunks[curChunk]) {\n          this.loadedChunks[curChunk] = true;\n          ++this.numChunksLoaded;\n        }\n      }\n    },\n\n    ensureByte: function ChunkedStream_ensureByte(pos) {\n      var chunk = Math.floor(pos / this.chunkSize);\n      if (chunk === this.lastSuccessfulEnsureByteChunk) {\n        return;\n      }\n\n      if (!this.loadedChunks[chunk]) {\n        throw new MissingDataException(pos, pos + 1);\n      }\n      this.lastSuccessfulEnsureByteChunk = chunk;\n    },\n\n    ensureRange: function ChunkedStream_ensureRange(begin, end) {\n      if (begin >= end) {\n        return;\n      }\n\n      if (end <= this.progressiveDataLength) {\n        return;\n      }\n\n      var chunkSize = this.chunkSize;\n      var beginChunk = Math.floor(begin / chunkSize);\n      var endChunk = Math.floor((end - 1) / chunkSize) + 1;\n      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {\n        if (!this.loadedChunks[chunk]) {\n          throw new MissingDataException(begin, end);\n        }\n      }\n    },\n\n    nextEmptyChunk: function ChunkedStream_nextEmptyChunk(beginChunk) {\n      var chunk, n;\n      for (chunk = beginChunk, n = this.numChunks; chunk < n; ++chunk) {\n        if (!this.loadedChunks[chunk]) {\n          return chunk;\n        }\n      }\n      // Wrap around to beginning\n      for (chunk = 0; chunk < beginChunk; ++chunk) {\n        if (!this.loadedChunks[chunk]) {\n          return chunk;\n        }\n      }\n      return null;\n    },\n\n    hasChunk: function ChunkedStream_hasChunk(chunk) {\n      return !!this.loadedChunks[chunk];\n    },\n\n    get length() {\n      return this.end - this.start;\n    },\n\n    get isEmpty() {\n      return this.length === 0;\n    },\n\n    getByte: function ChunkedStream_getByte() {\n      var pos = this.pos;\n      if (pos >= this.end) {\n        return -1;\n      }\n      this.ensureByte(pos);\n      return this.bytes[this.pos++];\n    },\n\n    getUint16: function ChunkedStream_getUint16() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      if (b0 === -1 || b1 === -1) {\n        return -1;\n      }\n      return (b0 << 8) + b1;\n    },\n\n    getInt32: function ChunkedStream_getInt32() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      var b2 = this.getByte();\n      var b3 = this.getByte();\n      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n    },\n\n    // returns subarray of original buffer\n    // should only be read\n    getBytes: function ChunkedStream_getBytes(length) {\n      var bytes = this.bytes;\n      var pos = this.pos;\n      var strEnd = this.end;\n\n      if (!length) {\n        this.ensureRange(pos, strEnd);\n        return bytes.subarray(pos, strEnd);\n      }\n\n      var end = pos + length;\n      if (end > strEnd) {\n        end = strEnd;\n      }\n      this.ensureRange(pos, end);\n\n      this.pos = end;\n      return bytes.subarray(pos, end);\n    },\n\n    peekByte: function ChunkedStream_peekByte() {\n      var peekedByte = this.getByte();\n      this.pos--;\n      return peekedByte;\n    },\n\n    peekBytes: function ChunkedStream_peekBytes(length) {\n      var bytes = this.getBytes(length);\n      this.pos -= bytes.length;\n      return bytes;\n    },\n\n    getByteRange: function ChunkedStream_getBytes(begin, end) {\n      this.ensureRange(begin, end);\n      return this.bytes.subarray(begin, end);\n    },\n\n    skip: function ChunkedStream_skip(n) {\n      if (!n) {\n        n = 1;\n      }\n      this.pos += n;\n    },\n\n    reset: function ChunkedStream_reset() {\n      this.pos = this.start;\n    },\n\n    moveStart: function ChunkedStream_moveStart() {\n      this.start = this.pos;\n    },\n\n    makeSubStream: function ChunkedStream_makeSubStream(start, length, dict) {\n      this.ensureRange(start, start + length);\n\n      function ChunkedStreamSubstream() {}\n      ChunkedStreamSubstream.prototype = Object.create(this);\n      ChunkedStreamSubstream.prototype.getMissingChunks = function() {\n        var chunkSize = this.chunkSize;\n        var beginChunk = Math.floor(this.start / chunkSize);\n        var endChunk = Math.floor((this.end - 1) / chunkSize) + 1;\n        var missingChunks = [];\n        for (var chunk = beginChunk; chunk < endChunk; ++chunk) {\n          if (!this.loadedChunks[chunk]) {\n            missingChunks.push(chunk);\n          }\n        }\n        return missingChunks;\n      };\n      var subStream = new ChunkedStreamSubstream();\n      subStream.pos = subStream.start = start;\n      subStream.end = start + length || this.end;\n      subStream.dict = dict;\n      return subStream;\n    },\n\n    isStream: true\n  };\n\n  return ChunkedStream;\n})();\n\nvar ChunkedStreamManager = (function ChunkedStreamManagerClosure() {\n\n  function ChunkedStreamManager(length, chunkSize, url, args) {\n    this.stream = new ChunkedStream(length, chunkSize, this);\n    this.length = length;\n    this.chunkSize = chunkSize;\n    this.url = url;\n    this.disableAutoFetch = args.disableAutoFetch;\n    var msgHandler = this.msgHandler = args.msgHandler;\n\n    if (args.chunkedViewerLoading) {\n      msgHandler.on('OnDataRange', this.onReceiveData.bind(this));\n      msgHandler.on('OnDataProgress', this.onProgress.bind(this));\n      this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) {\n        msgHandler.send('RequestDataRange', { begin: begin, end: end });\n      };\n    } else {\n\n      var getXhr = function getXhr() {\n        return new XMLHttpRequest();\n      };\n      this.networkManager = new NetworkManager(this.url, {\n        getXhr: getXhr,\n        httpHeaders: args.httpHeaders,\n        withCredentials: args.withCredentials\n      });\n      this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) {\n        this.networkManager.requestRange(begin, end, {\n          onDone: this.onReceiveData.bind(this),\n          onProgress: this.onProgress.bind(this)\n        });\n      };\n    }\n\n    this.currRequestId = 0;\n\n    this.chunksNeededByRequest = {};\n    this.requestsByChunk = {};\n    this.callbacksByRequest = {};\n    this.progressiveDataLength = 0;\n\n    this._loadedStreamCapability = createPromiseCapability();\n\n    if (args.initialData) {\n      this.onReceiveData({chunk: args.initialData});\n    }\n  }\n\n  ChunkedStreamManager.prototype = {\n    onLoadedStream: function ChunkedStreamManager_getLoadedStream() {\n      return this._loadedStreamCapability.promise;\n    },\n\n    // Get all the chunks that are not yet loaded and groups them into\n    // contiguous ranges to load in as few requests as possible\n    requestAllChunks: function ChunkedStreamManager_requestAllChunks() {\n      var missingChunks = this.stream.getMissingChunks();\n      this.requestChunks(missingChunks);\n      return this._loadedStreamCapability.promise;\n    },\n\n    requestChunks: function ChunkedStreamManager_requestChunks(chunks,\n                                                               callback) {\n      var requestId = this.currRequestId++;\n\n      var chunksNeeded;\n      var i, ii;\n      this.chunksNeededByRequest[requestId] = chunksNeeded = {};\n      for (i = 0, ii = chunks.length; i < ii; i++) {\n        if (!this.stream.hasChunk(chunks[i])) {\n          chunksNeeded[chunks[i]] = true;\n        }\n      }\n\n      if (isEmptyObj(chunksNeeded)) {\n        if (callback) {\n          callback();\n        }\n        return;\n      }\n\n      this.callbacksByRequest[requestId] = callback;\n\n      var chunksToRequest = [];\n      for (var chunk in chunksNeeded) {\n        chunk = chunk | 0;\n        if (!(chunk in this.requestsByChunk)) {\n          this.requestsByChunk[chunk] = [];\n          chunksToRequest.push(chunk);\n        }\n        this.requestsByChunk[chunk].push(requestId);\n      }\n\n      if (!chunksToRequest.length) {\n        return;\n      }\n\n      var groupedChunksToRequest = this.groupChunks(chunksToRequest);\n\n      for (i = 0; i < groupedChunksToRequest.length; ++i) {\n        var groupedChunk = groupedChunksToRequest[i];\n        var begin = groupedChunk.beginChunk * this.chunkSize;\n        var end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length);\n        this.sendRequest(begin, end);\n      }\n    },\n\n    getStream: function ChunkedStreamManager_getStream() {\n      return this.stream;\n    },\n\n    // Loads any chunks in the requested range that are not yet loaded\n    requestRange: function ChunkedStreamManager_requestRange(\n                      begin, end, callback) {\n\n      end = Math.min(end, this.length);\n\n      var beginChunk = this.getBeginChunk(begin);\n      var endChunk = this.getEndChunk(end);\n\n      var chunks = [];\n      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {\n        chunks.push(chunk);\n      }\n\n      this.requestChunks(chunks, callback);\n    },\n\n    requestRanges: function ChunkedStreamManager_requestRanges(ranges,\n                                                               callback) {\n      ranges = ranges || [];\n      var chunksToRequest = [];\n\n      for (var i = 0; i < ranges.length; i++) {\n        var beginChunk = this.getBeginChunk(ranges[i].begin);\n        var endChunk = this.getEndChunk(ranges[i].end);\n        for (var chunk = beginChunk; chunk < endChunk; ++chunk) {\n          if (chunksToRequest.indexOf(chunk) < 0) {\n            chunksToRequest.push(chunk);\n          }\n        }\n      }\n\n      chunksToRequest.sort(function(a, b) { return a - b; });\n      this.requestChunks(chunksToRequest, callback);\n    },\n\n    // Groups a sorted array of chunks into as few continguous larger\n    // chunks as possible\n    groupChunks: function ChunkedStreamManager_groupChunks(chunks) {\n      var groupedChunks = [];\n      var beginChunk = -1;\n      var prevChunk = -1;\n      for (var i = 0; i < chunks.length; ++i) {\n        var chunk = chunks[i];\n\n        if (beginChunk < 0) {\n          beginChunk = chunk;\n        }\n\n        if (prevChunk >= 0 && prevChunk + 1 !== chunk) {\n          groupedChunks.push({ beginChunk: beginChunk,\n                               endChunk: prevChunk + 1 });\n          beginChunk = chunk;\n        }\n        if (i + 1 === chunks.length) {\n          groupedChunks.push({ beginChunk: beginChunk,\n                               endChunk: chunk + 1 });\n        }\n\n        prevChunk = chunk;\n      }\n      return groupedChunks;\n    },\n\n    onProgress: function ChunkedStreamManager_onProgress(args) {\n      var bytesLoaded = (this.stream.numChunksLoaded * this.chunkSize +\n                         args.loaded);\n      this.msgHandler.send('DocProgress', {\n        loaded: bytesLoaded,\n        total: this.length\n      });\n    },\n\n    onReceiveData: function ChunkedStreamManager_onReceiveData(args) {\n      var chunk = args.chunk;\n      var isProgressive = args.begin === undefined;\n      var begin = isProgressive ? this.progressiveDataLength : args.begin;\n      var end = begin + chunk.byteLength;\n\n      var beginChunk = Math.floor(begin / this.chunkSize);\n      var endChunk = end < this.length ? Math.floor(end / this.chunkSize) :\n                                         Math.ceil(end / this.chunkSize);\n\n      if (isProgressive) {\n        this.stream.onReceiveProgressiveData(chunk);\n        this.progressiveDataLength = end;\n      } else {\n        this.stream.onReceiveData(begin, chunk);\n      }\n\n      if (this.stream.allChunksLoaded()) {\n        this._loadedStreamCapability.resolve(this.stream);\n      }\n\n      var loadedRequests = [];\n      var i, requestId;\n      for (chunk = beginChunk; chunk < endChunk; ++chunk) {\n        // The server might return more chunks than requested\n        var requestIds = this.requestsByChunk[chunk] || [];\n        delete this.requestsByChunk[chunk];\n\n        for (i = 0; i < requestIds.length; ++i) {\n          requestId = requestIds[i];\n          var chunksNeeded = this.chunksNeededByRequest[requestId];\n          if (chunk in chunksNeeded) {\n            delete chunksNeeded[chunk];\n          }\n\n          if (!isEmptyObj(chunksNeeded)) {\n            continue;\n          }\n\n          loadedRequests.push(requestId);\n        }\n      }\n\n      // If there are no pending requests, automatically fetch the next\n      // unfetched chunk of the PDF\n      if (!this.disableAutoFetch && isEmptyObj(this.requestsByChunk)) {\n        var nextEmptyChunk;\n        if (this.stream.numChunksLoaded === 1) {\n          // This is a special optimization so that after fetching the first\n          // chunk, rather than fetching the second chunk, we fetch the last\n          // chunk.\n          var lastChunk = this.stream.numChunks - 1;\n          if (!this.stream.hasChunk(lastChunk)) {\n            nextEmptyChunk = lastChunk;\n          }\n        } else {\n          nextEmptyChunk = this.stream.nextEmptyChunk(endChunk);\n        }\n        if (isInt(nextEmptyChunk)) {\n          this.requestChunks([nextEmptyChunk]);\n        }\n      }\n\n      for (i = 0; i < loadedRequests.length; ++i) {\n        requestId = loadedRequests[i];\n        var callback = this.callbacksByRequest[requestId];\n        delete this.callbacksByRequest[requestId];\n        if (callback) {\n          callback();\n        }\n      }\n\n      this.msgHandler.send('DocProgress', {\n        loaded: this.stream.numChunksLoaded * this.chunkSize,\n        total: this.length\n      });\n    },\n\n    onError: function ChunkedStreamManager_onError(err) {\n      this._loadedStreamCapability.reject(err);\n    },\n\n    getBeginChunk: function ChunkedStreamManager_getBeginChunk(begin) {\n      var chunk = Math.floor(begin / this.chunkSize);\n      return chunk;\n    },\n\n    getEndChunk: function ChunkedStreamManager_getEndChunk(end) {\n      if (end % this.chunkSize === 0) {\n        return end / this.chunkSize;\n      }\n\n      // 0 -> 0\n      // 1 -> 1\n      // 99 -> 1\n      // 100 -> 1\n      // 101 -> 2\n      var chunk = Math.floor((end - 1) / this.chunkSize) + 1;\n      return chunk;\n    }\n  };\n\n  return ChunkedStreamManager;\n})();\n\n\n// The maximum number of bytes fetched per range request\nvar RANGE_CHUNK_SIZE = 65536;\n\n// TODO(mack): Make use of PDFJS.Util.inherit() when it becomes available\nvar BasePdfManager = (function BasePdfManagerClosure() {\n  function BasePdfManager() {\n    throw new Error('Cannot initialize BaseManagerManager');\n  }\n\n  BasePdfManager.prototype = {\n    onLoadedStream: function BasePdfManager_onLoadedStream() {\n      throw new NotImplementedException();\n    },\n\n    ensureDoc: function BasePdfManager_ensureDoc(prop, args) {\n      return this.ensure(this.pdfDocument, prop, args);\n    },\n\n    ensureXRef: function BasePdfManager_ensureXRef(prop, args) {\n      return this.ensure(this.pdfDocument.xref, prop, args);\n    },\n\n    ensureCatalog: function BasePdfManager_ensureCatalog(prop, args) {\n      return this.ensure(this.pdfDocument.catalog, prop, args);\n    },\n\n    getPage: function BasePdfManager_pagePage(pageIndex) {\n      return this.pdfDocument.getPage(pageIndex);\n    },\n\n    cleanup: function BasePdfManager_cleanup() {\n      return this.pdfDocument.cleanup();\n    },\n\n    ensure: function BasePdfManager_ensure(obj, prop, args) {\n      return new NotImplementedException();\n    },\n\n    requestRange: function BasePdfManager_ensure(begin, end) {\n      return new NotImplementedException();\n    },\n\n    requestLoadedStream: function BasePdfManager_requestLoadedStream() {\n      return new NotImplementedException();\n    },\n\n    sendProgressiveData: function BasePdfManager_sendProgressiveData(chunk) {\n      return new NotImplementedException();\n    },\n\n    updatePassword: function BasePdfManager_updatePassword(password) {\n      this.pdfDocument.xref.password = this.password = password;\n      if (this._passwordChangedCapability) {\n        this._passwordChangedCapability.resolve();\n      }\n    },\n\n    passwordChanged: function BasePdfManager_passwordChanged() {\n      this._passwordChangedCapability = createPromiseCapability();\n      return this._passwordChangedCapability.promise;\n    },\n\n    terminate: function BasePdfManager_terminate() {\n      return new NotImplementedException();\n    }\n  };\n\n  return BasePdfManager;\n})();\n\nvar LocalPdfManager = (function LocalPdfManagerClosure() {\n  function LocalPdfManager(data, password) {\n    var stream = new Stream(data);\n    this.pdfDocument = new PDFDocument(this, stream, password);\n    this._loadedStreamCapability = createPromiseCapability();\n    this._loadedStreamCapability.resolve(stream);\n  }\n\n  LocalPdfManager.prototype = Object.create(BasePdfManager.prototype);\n  LocalPdfManager.prototype.constructor = LocalPdfManager;\n\n  LocalPdfManager.prototype.ensure =\n      function LocalPdfManager_ensure(obj, prop, args) {\n    return new Promise(function (resolve, reject) {\n      try {\n        var value = obj[prop];\n        var result;\n        if (typeof value === 'function') {\n          result = value.apply(obj, args);\n        } else {\n          result = value;\n        }\n        resolve(result);\n      } catch (e) {\n        reject(e);\n      }\n    });\n  };\n\n  LocalPdfManager.prototype.requestRange =\n      function LocalPdfManager_requestRange(begin, end) {\n    return Promise.resolve();\n  };\n\n  LocalPdfManager.prototype.requestLoadedStream =\n      function LocalPdfManager_requestLoadedStream() {\n  };\n\n  LocalPdfManager.prototype.onLoadedStream =\n      function LocalPdfManager_getLoadedStream() {\n    return this._loadedStreamCapability.promise;\n  };\n\n  LocalPdfManager.prototype.terminate =\n      function LocalPdfManager_terminate() {\n    return;\n  };\n\n  return LocalPdfManager;\n})();\n\nvar NetworkPdfManager = (function NetworkPdfManagerClosure() {\n  function NetworkPdfManager(args, msgHandler) {\n\n    this.msgHandler = msgHandler;\n\n    var params = {\n      msgHandler: msgHandler,\n      httpHeaders: args.httpHeaders,\n      withCredentials: args.withCredentials,\n      chunkedViewerLoading: args.chunkedViewerLoading,\n      disableAutoFetch: args.disableAutoFetch,\n      initialData: args.initialData\n    };\n    this.streamManager = new ChunkedStreamManager(args.length, RANGE_CHUNK_SIZE,\n                                                  args.url, params);\n\n    this.pdfDocument = new PDFDocument(this, this.streamManager.getStream(),\n                                    args.password);\n  }\n\n  NetworkPdfManager.prototype = Object.create(BasePdfManager.prototype);\n  NetworkPdfManager.prototype.constructor = NetworkPdfManager;\n\n  NetworkPdfManager.prototype.ensure =\n      function NetworkPdfManager_ensure(obj, prop, args) {\n    var pdfManager = this;\n\n    return new Promise(function (resolve, reject) {\n      function ensureHelper() {\n        try {\n          var result;\n          var value = obj[prop];\n          if (typeof value === 'function') {\n            result = value.apply(obj, args);\n          } else {\n            result = value;\n          }\n          resolve(result);\n        } catch(e) {\n          if (!(e instanceof MissingDataException)) {\n            reject(e);\n            return;\n          }\n          pdfManager.streamManager.requestRange(e.begin, e.end, ensureHelper);\n        }\n      }\n\n      ensureHelper();\n    });\n  };\n\n  NetworkPdfManager.prototype.requestRange =\n      function NetworkPdfManager_requestRange(begin, end) {\n    return new Promise(function (resolve) {\n      this.streamManager.requestRange(begin, end, function() {\n        resolve();\n      });\n    }.bind(this));\n  };\n\n  NetworkPdfManager.prototype.requestLoadedStream =\n      function NetworkPdfManager_requestLoadedStream() {\n    this.streamManager.requestAllChunks();\n  };\n\n  NetworkPdfManager.prototype.sendProgressiveData =\n      function NetworkPdfManager_sendProgressiveData(chunk) {\n    this.streamManager.onReceiveData({ chunk: chunk });\n  };\n\n  NetworkPdfManager.prototype.onLoadedStream =\n      function NetworkPdfManager_getLoadedStream() {\n    return this.streamManager.onLoadedStream();\n  };\n\n  NetworkPdfManager.prototype.terminate =\n      function NetworkPdfManager_terminate() {\n    this.streamManager.networkManager.abortAllRequests();\n  };\n\n  return NetworkPdfManager;\n})();\n\n\nvar Page = (function PageClosure() {\n\n  var LETTER_SIZE_MEDIABOX = [0, 0, 612, 792];\n\n  function Page(pdfManager, xref, pageIndex, pageDict, ref, fontCache) {\n    this.pdfManager = pdfManager;\n    this.pageIndex = pageIndex;\n    this.pageDict = pageDict;\n    this.xref = xref;\n    this.ref = ref;\n    this.fontCache = fontCache;\n    this.idCounters = {\n      obj: 0\n    };\n    this.resourcesPromise = null;\n  }\n\n  Page.prototype = {\n    getPageProp: function Page_getPageProp(key) {\n      return this.pageDict.get(key);\n    },\n\n    getInheritedPageProp: function Page_inheritPageProp(key) {\n      var dict = this.pageDict;\n      var value = dict.get(key);\n      while (value === undefined) {\n        dict = dict.get('Parent');\n        if (!dict) {\n          break;\n        }\n        value = dict.get(key);\n      }\n      return value;\n    },\n\n    get content() {\n      return this.getPageProp('Contents');\n    },\n\n    get resources() {\n      var value = this.getInheritedPageProp('Resources');\n      // For robustness: The spec states that a \\Resources entry has to be\n      // present, but can be empty. Some document omit it still. In this case\n      // return an empty dictionary:\n      if (value === undefined) {\n        value = Dict.empty;\n      }\n      return shadow(this, 'resources', value);\n    },\n\n    get mediaBox() {\n      var obj = this.getInheritedPageProp('MediaBox');\n      // Reset invalid media box to letter size.\n      if (!isArray(obj) || obj.length !== 4) {\n        obj = LETTER_SIZE_MEDIABOX;\n      }\n      return shadow(this, 'mediaBox', obj);\n    },\n\n    get view() {\n      var mediaBox = this.mediaBox;\n      var cropBox = this.getInheritedPageProp('CropBox');\n      if (!isArray(cropBox) || cropBox.length !== 4) {\n        return shadow(this, 'view', mediaBox);\n      }\n\n      // From the spec, 6th ed., p.963:\n      // \"The crop, bleed, trim, and art boxes should not ordinarily\n      // extend beyond the boundaries of the media box. If they do, they are\n      // effectively reduced to their intersection with the media box.\"\n      cropBox = Util.intersect(cropBox, mediaBox);\n      if (!cropBox) {\n        return shadow(this, 'view', mediaBox);\n      }\n      return shadow(this, 'view', cropBox);\n    },\n\n    get annotationRefs() {\n      return shadow(this, 'annotationRefs',\n                    this.getInheritedPageProp('Annots'));\n    },\n\n    get rotate() {\n      var rotate = this.getInheritedPageProp('Rotate') || 0;\n      // Normalize rotation so it's a multiple of 90 and between 0 and 270\n      if (rotate % 90 !== 0) {\n        rotate = 0;\n      } else if (rotate >= 360) {\n        rotate = rotate % 360;\n      } else if (rotate < 0) {\n        // The spec doesn't cover negatives, assume its counterclockwise\n        // rotation. The following is the other implementation of modulo.\n        rotate = ((rotate % 360) + 360) % 360;\n      }\n      return shadow(this, 'rotate', rotate);\n    },\n\n    getContentStream: function Page_getContentStream() {\n      var content = this.content;\n      var stream;\n      if (isArray(content)) {\n        // fetching items\n        var xref = this.xref;\n        var i, n = content.length;\n        var streams = [];\n        for (i = 0; i < n; ++i) {\n          streams.push(xref.fetchIfRef(content[i]));\n        }\n        stream = new StreamsSequenceStream(streams);\n      } else if (isStream(content)) {\n        stream = content;\n      } else {\n        // replacing non-existent page content with empty one\n        stream = new NullStream();\n      }\n      return stream;\n    },\n\n    loadResources: function Page_loadResources(keys) {\n      if (!this.resourcesPromise) {\n        // TODO: add async getInheritedPageProp and remove this.\n        this.resourcesPromise = this.pdfManager.ensure(this, 'resources');\n      }\n      return this.resourcesPromise.then(function resourceSuccess() {\n        var objectLoader = new ObjectLoader(this.resources.map,\n                                            keys,\n                                            this.xref);\n        return objectLoader.load();\n      }.bind(this));\n    },\n\n    getOperatorList: function Page_getOperatorList(handler, intent) {\n      var self = this;\n\n      var pdfManager = this.pdfManager;\n      var contentStreamPromise = pdfManager.ensure(this, 'getContentStream',\n                                                   []);\n      var resourcesPromise = this.loadResources([\n        'ExtGState',\n        'ColorSpace',\n        'Pattern',\n        'Shading',\n        'XObject',\n        'Font'\n        // ProcSet\n        // Properties\n      ]);\n\n      var partialEvaluator = new PartialEvaluator(pdfManager, this.xref,\n                                                  handler, this.pageIndex,\n                                                  'p' + this.pageIndex + '_',\n                                                  this.idCounters,\n                                                  this.fontCache);\n\n      var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]);\n      var pageListPromise = dataPromises.then(function(data) {\n        var contentStream = data[0];\n        var opList = new OperatorList(intent, handler, self.pageIndex);\n\n        handler.send('StartRenderPage', {\n          transparency: partialEvaluator.hasBlendModes(self.resources),\n          pageIndex: self.pageIndex,\n          intent: intent\n        });\n        return partialEvaluator.getOperatorList(contentStream, self.resources,\n          opList).then(function () {\n            return opList;\n          });\n      });\n\n      var annotationsPromise = pdfManager.ensure(this, 'annotations');\n      return Promise.all([pageListPromise, annotationsPromise]).then(\n          function(datas) {\n        var pageOpList = datas[0];\n        var annotations = datas[1];\n\n        if (annotations.length === 0) {\n          pageOpList.flush(true);\n          return pageOpList;\n        }\n\n        var annotationsReadyPromise = Annotation.appendToOperatorList(\n          annotations, pageOpList, pdfManager, partialEvaluator, intent);\n        return annotationsReadyPromise.then(function () {\n          pageOpList.flush(true);\n          return pageOpList;\n        });\n      });\n    },\n\n    extractTextContent: function Page_extractTextContent() {\n      var handler = {\n        on: function nullHandlerOn() {},\n        send: function nullHandlerSend() {}\n      };\n\n      var self = this;\n\n      var pdfManager = this.pdfManager;\n      var contentStreamPromise = pdfManager.ensure(this, 'getContentStream',\n                                                   []);\n\n      var resourcesPromise = this.loadResources([\n        'ExtGState',\n        'XObject',\n        'Font'\n      ]);\n\n      var dataPromises = Promise.all([contentStreamPromise,\n                                      resourcesPromise]);\n      return dataPromises.then(function(data) {\n        var contentStream = data[0];\n        var partialEvaluator = new PartialEvaluator(pdfManager, self.xref,\n                                                    handler, self.pageIndex,\n                                                    'p' + self.pageIndex + '_',\n                                                    self.idCounters,\n                                                    self.fontCache);\n\n        return partialEvaluator.getTextContent(contentStream,\n                                               self.resources);\n      });\n    },\n\n    getAnnotationsData: function Page_getAnnotationsData() {\n      var annotations = this.annotations;\n      var annotationsData = [];\n      for (var i = 0, n = annotations.length; i < n; ++i) {\n        annotationsData.push(annotations[i].getData());\n      }\n      return annotationsData;\n    },\n\n    get annotations() {\n      var annotations = [];\n      var annotationRefs = (this.annotationRefs || []);\n      for (var i = 0, n = annotationRefs.length; i < n; ++i) {\n        var annotationRef = annotationRefs[i];\n        var annotation = Annotation.fromRef(this.xref, annotationRef);\n        if (annotation) {\n          annotations.push(annotation);\n        }\n      }\n      return shadow(this, 'annotations', annotations);\n    }\n  };\n\n  return Page;\n})();\n\n/**\n * The `PDFDocument` holds all the data of the PDF file. Compared to the\n * `PDFDoc`, this one doesn't have any job management code.\n * Right now there exists one PDFDocument on the main thread + one object\n * for each worker. If there is no worker support enabled, there are two\n * `PDFDocument` objects on the main thread created.\n */\nvar PDFDocument = (function PDFDocumentClosure() {\n  var FINGERPRINT_FIRST_BYTES = 1024;\n  var EMPTY_FINGERPRINT = '\\x00\\x00\\x00\\x00\\x00\\x00\\x00' +\n    '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00';\n\n  function PDFDocument(pdfManager, arg, password) {\n    if (isStream(arg)) {\n      init.call(this, pdfManager, arg, password);\n    } else if (isArrayBuffer(arg)) {\n      init.call(this, pdfManager, new Stream(arg), password);\n    } else {\n      error('PDFDocument: Unknown argument type');\n    }\n  }\n\n  function init(pdfManager, stream, password) {\n    assert(stream.length > 0, 'stream must have data');\n    this.pdfManager = pdfManager;\n    this.stream = stream;\n    var xref = new XRef(this.stream, password, pdfManager);\n    this.xref = xref;\n  }\n\n  function find(stream, needle, limit, backwards) {\n    var pos = stream.pos;\n    var end = stream.end;\n    var strBuf = [];\n    if (pos + limit > end) {\n      limit = end - pos;\n    }\n    for (var n = 0; n < limit; ++n) {\n      strBuf.push(String.fromCharCode(stream.getByte()));\n    }\n    var str = strBuf.join('');\n    stream.pos = pos;\n    var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle);\n    if (index === -1) {\n      return false; /* not found */\n    }\n    stream.pos += index;\n    return true; /* found */\n  }\n\n  var DocumentInfoValidators = {\n    get entries() {\n      // Lazily build this since all the validation functions below are not\n      // defined until after this file loads.\n      return shadow(this, 'entries', {\n        Title: isString,\n        Author: isString,\n        Subject: isString,\n        Keywords: isString,\n        Creator: isString,\n        Producer: isString,\n        CreationDate: isString,\n        ModDate: isString,\n        Trapped: isName\n      });\n    }\n  };\n\n  PDFDocument.prototype = {\n    parse: function PDFDocument_parse(recoveryMode) {\n      this.setup(recoveryMode);\n      try {\n        // checking if AcroForm is present\n        this.acroForm = this.catalog.catDict.get('AcroForm');\n        if (this.acroForm) {\n          this.xfa = this.acroForm.get('XFA');\n          var fields = this.acroForm.get('Fields');\n          if ((!fields || !isArray(fields) || fields.length === 0) &&\n              !this.xfa) {\n            // no fields and no XFA -- not a form (?)\n            this.acroForm = null;\n          }\n        }\n      } catch (ex) {\n        info('Something wrong with AcroForm entry');\n        this.acroForm = null;\n      }\n    },\n\n    get linearization() {\n      var linearization = null;\n      if (this.stream.length) {\n        try {\n          linearization = Linearization.create(this.stream);\n        } catch (err) {\n          if (err instanceof MissingDataException) {\n            throw err;\n          }\n          info(err);\n        }\n      }\n      // shadow the prototype getter with a data property\n      return shadow(this, 'linearization', linearization);\n    },\n    get startXRef() {\n      var stream = this.stream;\n      var startXRef = 0;\n      var linearization = this.linearization;\n      if (linearization) {\n        // Find end of first obj.\n        stream.reset();\n        if (find(stream, 'endobj', 1024)) {\n          startXRef = stream.pos + 6;\n        }\n      } else {\n        // Find startxref by jumping backward from the end of the file.\n        var step = 1024;\n        var found = false, pos = stream.end;\n        while (!found && pos > 0) {\n          pos -= step - 'startxref'.length;\n          if (pos < 0) {\n            pos = 0;\n          }\n          stream.pos = pos;\n          found = find(stream, 'startxref', step, true);\n        }\n        if (found) {\n          stream.skip(9);\n          var ch;\n          do {\n            ch = stream.getByte();\n          } while (Lexer.isSpace(ch));\n          var str = '';\n          while (ch >= 0x20 && ch <= 0x39) { // < '9'\n            str += String.fromCharCode(ch);\n            ch = stream.getByte();\n          }\n          startXRef = parseInt(str, 10);\n          if (isNaN(startXRef)) {\n            startXRef = 0;\n          }\n        }\n      }\n      // shadow the prototype getter with a data property\n      return shadow(this, 'startXRef', startXRef);\n    },\n    get mainXRefEntriesOffset() {\n      var mainXRefEntriesOffset = 0;\n      var linearization = this.linearization;\n      if (linearization) {\n        mainXRefEntriesOffset = linearization.mainXRefEntriesOffset;\n      }\n      // shadow the prototype getter with a data property\n      return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset);\n    },\n    // Find the header, remove leading garbage and setup the stream\n    // starting from the header.\n    checkHeader: function PDFDocument_checkHeader() {\n      var stream = this.stream;\n      stream.reset();\n      if (find(stream, '%PDF-', 1024)) {\n        // Found the header, trim off any garbage before it.\n        stream.moveStart();\n        // Reading file format version\n        var MAX_VERSION_LENGTH = 12;\n        var version = '', ch;\n        while ((ch = stream.getByte()) > 0x20) { // SPACE\n          if (version.length >= MAX_VERSION_LENGTH) {\n            break;\n          }\n          version += String.fromCharCode(ch);\n        }\n        // removing \"%PDF-\"-prefix\n        this.pdfFormatVersion = version.substring(5);\n        return;\n      }\n      // May not be a PDF file, continue anyway.\n    },\n    parseStartXRef: function PDFDocument_parseStartXRef() {\n      var startXRef = this.startXRef;\n      this.xref.setStartXRef(startXRef);\n    },\n    setup: function PDFDocument_setup(recoveryMode) {\n      this.xref.parse(recoveryMode);\n      this.catalog = new Catalog(this.pdfManager, this.xref);\n    },\n    get numPages() {\n      var linearization = this.linearization;\n      var num = linearization ? linearization.numPages : this.catalog.numPages;\n      // shadow the prototype getter\n      return shadow(this, 'numPages', num);\n    },\n    get documentInfo() {\n      var docInfo = {\n        PDFFormatVersion: this.pdfFormatVersion,\n        IsAcroFormPresent: !!this.acroForm,\n        IsXFAPresent: !!this.xfa\n      };\n      var infoDict;\n      try {\n        infoDict = this.xref.trailer.get('Info');\n      } catch (err) {\n        info('The document information dictionary is invalid.');\n      }\n      if (infoDict) {\n        var validEntries = DocumentInfoValidators.entries;\n        // Only fill the document info with valid entries from the spec.\n        for (var key in validEntries) {\n          if (infoDict.has(key)) {\n            var value = infoDict.get(key);\n            // Make sure the value conforms to the spec.\n            if (validEntries[key](value)) {\n              docInfo[key] = (typeof value !== 'string' ?\n                              value : stringToPDFString(value));\n            } else {\n              info('Bad value in document info for \"' + key + '\"');\n            }\n          }\n        }\n      }\n      return shadow(this, 'documentInfo', docInfo);\n    },\n    get fingerprint() {\n      var xref = this.xref, idArray, hash, fileID = '';\n\n      if (xref.trailer.has('ID')) {\n        idArray = xref.trailer.get('ID');\n      }\n      if (idArray && isArray(idArray) && idArray[0] !== EMPTY_FINGERPRINT) {\n        hash = stringToBytes(idArray[0]);\n      } else {\n        if (this.stream.ensureRange) {\n          this.stream.ensureRange(0,\n            Math.min(FINGERPRINT_FIRST_BYTES, this.stream.end));\n        }\n        hash = calculateMD5(this.stream.bytes.subarray(0,\n          FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES);\n      }\n\n      for (var i = 0, n = hash.length; i < n; i++) {\n        var hex = hash[i].toString(16);\n        fileID += hex.length === 1 ? '0' + hex : hex;\n      }\n\n      return shadow(this, 'fingerprint', fileID);\n    },\n\n    getPage: function PDFDocument_getPage(pageIndex) {\n      return this.catalog.getPage(pageIndex);\n    },\n\n    cleanup: function PDFDocument_cleanup() {\n      return this.catalog.cleanup();\n    }\n  };\n\n  return PDFDocument;\n})();\n\n\nvar Name = (function NameClosure() {\n  function Name(name) {\n    this.name = name;\n  }\n\n  Name.prototype = {};\n\n  var nameCache = {};\n\n  Name.get = function Name_get(name) {\n    var nameValue = nameCache[name];\n    return (nameValue ? nameValue : (nameCache[name] = new Name(name)));\n  };\n\n  return Name;\n})();\n\nvar Cmd = (function CmdClosure() {\n  function Cmd(cmd) {\n    this.cmd = cmd;\n  }\n\n  Cmd.prototype = {};\n\n  var cmdCache = {};\n\n  Cmd.get = function Cmd_get(cmd) {\n    var cmdValue = cmdCache[cmd];\n    return (cmdValue ? cmdValue : (cmdCache[cmd] = new Cmd(cmd)));\n  };\n\n  return Cmd;\n})();\n\nvar Dict = (function DictClosure() {\n  var nonSerializable = function nonSerializableClosure() {\n    return nonSerializable; // creating closure on some variable\n  };\n\n  var GETALL_DICTIONARY_TYPES_WHITELIST = {\n    'Background': true,\n    'ExtGState': true,\n    'Halftone': true,\n    'Layout': true,\n    'Mask': true,\n    'Pagination': true,\n    'Printing': true\n  };\n\n  function isRecursionAllowedFor(dict) {\n    if (!isName(dict.Type)) {\n      return true;\n    }\n    var dictType = dict.Type.name;\n    return GETALL_DICTIONARY_TYPES_WHITELIST[dictType] === true;\n  }\n\n  // xref is optional\n  function Dict(xref) {\n    // Map should only be used internally, use functions below to access.\n    this.map = Object.create(null);\n    this.xref = xref;\n    this.objId = null;\n    this.__nonSerializable__ = nonSerializable; // disable cloning of the Dict\n  }\n\n  Dict.prototype = {\n    assignXref: function Dict_assignXref(newXref) {\n      this.xref = newXref;\n    },\n\n    // automatically dereferences Ref objects\n    get: function Dict_get(key1, key2, key3) {\n      var value;\n      var xref = this.xref;\n      if (typeof (value = this.map[key1]) !== 'undefined' || key1 in this.map ||\n          typeof key2 === 'undefined') {\n        return xref ? xref.fetchIfRef(value) : value;\n      }\n      if (typeof (value = this.map[key2]) !== 'undefined' || key2 in this.map ||\n          typeof key3 === 'undefined') {\n        return xref ? xref.fetchIfRef(value) : value;\n      }\n      value = this.map[key3] || null;\n      return xref ? xref.fetchIfRef(value) : value;\n    },\n\n    // Same as get(), but returns a promise and uses fetchIfRefAsync().\n    getAsync: function Dict_getAsync(key1, key2, key3) {\n      var value;\n      var xref = this.xref;\n      if (typeof (value = this.map[key1]) !== 'undefined' || key1 in this.map ||\n          typeof key2 === 'undefined') {\n        if (xref) {\n          return xref.fetchIfRefAsync(value);\n        }\n        return Promise.resolve(value);\n      }\n      if (typeof (value = this.map[key2]) !== 'undefined' || key2 in this.map ||\n          typeof key3 === 'undefined') {\n        if (xref) {\n          return xref.fetchIfRefAsync(value);\n        }\n        return Promise.resolve(value);\n      }\n      value = this.map[key3] || null;\n      if (xref) {\n        return xref.fetchIfRefAsync(value);\n      }\n      return Promise.resolve(value);\n    },\n\n    // no dereferencing\n    getRaw: function Dict_getRaw(key) {\n      return this.map[key];\n    },\n\n    // creates new map and dereferences all Refs\n    getAll: function Dict_getAll() {\n      var all = Object.create(null);\n      var queue = null;\n      var key, obj;\n      for (key in this.map) {\n        obj = this.get(key);\n        if (obj instanceof Dict) {\n          if (isRecursionAllowedFor(obj)) {\n            (queue || (queue = [])).push({target: all, key: key, obj: obj});\n          } else {\n            all[key] = this.getRaw(key);\n          }\n        } else {\n          all[key] = obj;\n        }\n      }\n      if (!queue) {\n        return all;\n      }\n\n      // trying to take cyclic references into the account\n      var processed = Object.create(null);\n      while (queue.length > 0) {\n        var item = queue.shift();\n        var itemObj = item.obj;\n        var objId = itemObj.objId;\n        if (objId && objId in processed) {\n          item.target[item.key] = processed[objId];\n          continue;\n        }\n        var dereferenced = Object.create(null);\n        for (key in itemObj.map) {\n          obj = itemObj.get(key);\n          if (obj instanceof Dict) {\n            if (isRecursionAllowedFor(obj)) {\n              queue.push({target: dereferenced, key: key, obj: obj});\n            } else {\n              dereferenced[key] = itemObj.getRaw(key);\n            }\n          } else {\n            dereferenced[key] = obj;\n          }\n        }\n        if (objId) {\n          processed[objId] = dereferenced;\n        }\n        item.target[item.key] = dereferenced;\n      }\n      return all;\n    },\n\n    getKeys: function Dict_getKeys() {\n      return Object.keys(this.map);\n    },\n\n    set: function Dict_set(key, value) {\n      this.map[key] = value;\n    },\n\n    has: function Dict_has(key) {\n      return key in this.map;\n    },\n\n    forEach: function Dict_forEach(callback) {\n      for (var key in this.map) {\n        callback(key, this.get(key));\n      }\n    }\n  };\n\n  Dict.empty = new Dict(null);\n\n  return Dict;\n})();\n\nvar Ref = (function RefClosure() {\n  function Ref(num, gen) {\n    this.num = num;\n    this.gen = gen;\n  }\n\n  Ref.prototype = {\n    toString: function Ref_toString() {\n      // This function is hot, so we make the string as compact as possible.\n      // |this.gen| is almost always zero, so we treat that case specially.\n      var str = this.num + 'R';\n      if (this.gen !== 0) {\n        str += this.gen;\n      }\n      return str;\n    }\n  };\n\n  return Ref;\n})();\n\n// The reference is identified by number and generation.\n// This structure stores only one instance of the reference.\nvar RefSet = (function RefSetClosure() {\n  function RefSet() {\n    this.dict = {};\n  }\n\n  RefSet.prototype = {\n    has: function RefSet_has(ref) {\n      return ref.toString() in this.dict;\n    },\n\n    put: function RefSet_put(ref) {\n      this.dict[ref.toString()] = true;\n    },\n\n    remove: function RefSet_remove(ref) {\n      delete this.dict[ref.toString()];\n    }\n  };\n\n  return RefSet;\n})();\n\nvar RefSetCache = (function RefSetCacheClosure() {\n  function RefSetCache() {\n    this.dict = Object.create(null);\n  }\n\n  RefSetCache.prototype = {\n    get: function RefSetCache_get(ref) {\n      return this.dict[ref.toString()];\n    },\n\n    has: function RefSetCache_has(ref) {\n      return ref.toString() in this.dict;\n    },\n\n    put: function RefSetCache_put(ref, obj) {\n      this.dict[ref.toString()] = obj;\n    },\n\n    putAlias: function RefSetCache_putAlias(ref, aliasRef) {\n      this.dict[ref.toString()] = this.get(aliasRef);\n    },\n\n    forEach: function RefSetCache_forEach(fn, thisArg) {\n      for (var i in this.dict) {\n        fn.call(thisArg, this.dict[i]);\n      }\n    },\n\n    clear: function RefSetCache_clear() {\n      this.dict = Object.create(null);\n    }\n  };\n\n  return RefSetCache;\n})();\n\nvar Catalog = (function CatalogClosure() {\n  function Catalog(pdfManager, xref) {\n    this.pdfManager = pdfManager;\n    this.xref = xref;\n    this.catDict = xref.getCatalogObj();\n    this.fontCache = new RefSetCache();\n    assert(isDict(this.catDict),\n      'catalog object is not a dictionary');\n\n    this.pagePromises = [];\n  }\n\n  Catalog.prototype = {\n    get metadata() {\n      var streamRef = this.catDict.getRaw('Metadata');\n      if (!isRef(streamRef)) {\n        return shadow(this, 'metadata', null);\n      }\n\n      var encryptMetadata = (!this.xref.encrypt ? false :\n                             this.xref.encrypt.encryptMetadata);\n\n      var stream = this.xref.fetch(streamRef, !encryptMetadata);\n      var metadata;\n      if (stream && isDict(stream.dict)) {\n        var type = stream.dict.get('Type');\n        var subtype = stream.dict.get('Subtype');\n\n        if (isName(type) && isName(subtype) &&\n            type.name === 'Metadata' && subtype.name === 'XML') {\n          // XXX: This should examine the charset the XML document defines,\n          // however since there are currently no real means to decode\n          // arbitrary charsets, let's just hope that the author of the PDF\n          // was reasonable enough to stick with the XML default charset,\n          // which is UTF-8.\n          try {\n            metadata = stringToUTF8String(bytesToString(stream.getBytes()));\n          } catch (e) {\n            info('Skipping invalid metadata.');\n          }\n        }\n      }\n\n      return shadow(this, 'metadata', metadata);\n    },\n    get toplevelPagesDict() {\n      var pagesObj = this.catDict.get('Pages');\n      assert(isDict(pagesObj), 'invalid top-level pages dictionary');\n      // shadow the prototype getter\n      return shadow(this, 'toplevelPagesDict', pagesObj);\n    },\n    get documentOutline() {\n      var obj = null;\n      try {\n        obj = this.readDocumentOutline();\n      } catch (ex) {\n        if (ex instanceof MissingDataException) {\n          throw ex;\n        }\n        warn('Unable to read document outline');\n      }\n      return shadow(this, 'documentOutline', obj);\n    },\n    readDocumentOutline: function Catalog_readDocumentOutline() {\n      var xref = this.xref;\n      var obj = this.catDict.get('Outlines');\n      var root = { items: [] };\n      if (isDict(obj)) {\n        obj = obj.getRaw('First');\n        var processed = new RefSet();\n        if (isRef(obj)) {\n          var queue = [{obj: obj, parent: root}];\n          // to avoid recursion keeping track of the items\n          // in the processed dictionary\n          processed.put(obj);\n          while (queue.length > 0) {\n            var i = queue.shift();\n            var outlineDict = xref.fetchIfRef(i.obj);\n            if (outlineDict === null) {\n              continue;\n            }\n            if (!outlineDict.has('Title')) {\n              error('Invalid outline item');\n            }\n            var dest = outlineDict.get('A');\n            if (dest) {\n              dest = dest.get('D');\n            } else if (outlineDict.has('Dest')) {\n              dest = outlineDict.getRaw('Dest');\n              if (isName(dest)) {\n                dest = dest.name;\n              }\n            }\n            var title = outlineDict.get('Title');\n            var outlineItem = {\n              dest: dest,\n              title: stringToPDFString(title),\n              color: outlineDict.get('C') || [0, 0, 0],\n              count: outlineDict.get('Count'),\n              bold: !!(outlineDict.get('F') & 2),\n              italic: !!(outlineDict.get('F') & 1),\n              items: []\n            };\n            i.parent.items.push(outlineItem);\n            obj = outlineDict.getRaw('First');\n            if (isRef(obj) && !processed.has(obj)) {\n              queue.push({obj: obj, parent: outlineItem});\n              processed.put(obj);\n            }\n            obj = outlineDict.getRaw('Next');\n            if (isRef(obj) && !processed.has(obj)) {\n              queue.push({obj: obj, parent: i.parent});\n              processed.put(obj);\n            }\n          }\n        }\n      }\n      return (root.items.length > 0 ? root.items : null);\n    },\n    get numPages() {\n      var obj = this.toplevelPagesDict.get('Count');\n      assert(\n        isInt(obj),\n        'page count in top level pages object is not an integer'\n      );\n      // shadow the prototype getter\n      return shadow(this, 'num', obj);\n    },\n    get destinations() {\n      function fetchDestination(dest) {\n        return isDict(dest) ? dest.get('D') : dest;\n      }\n\n      var xref = this.xref;\n      var dests = {}, nameTreeRef, nameDictionaryRef;\n      var obj = this.catDict.get('Names');\n      if (obj && obj.has('Dests')) {\n        nameTreeRef = obj.getRaw('Dests');\n      } else if (this.catDict.has('Dests')) {\n        nameDictionaryRef = this.catDict.get('Dests');\n      }\n\n      if (nameDictionaryRef) {\n        // reading simple destination dictionary\n        obj = nameDictionaryRef;\n        obj.forEach(function catalogForEach(key, value) {\n          if (!value) {\n            return;\n          }\n          dests[key] = fetchDestination(value);\n        });\n      }\n      if (nameTreeRef) {\n        var nameTree = new NameTree(nameTreeRef, xref);\n        var names = nameTree.getAll();\n        for (var name in names) {\n          if (!names.hasOwnProperty(name)) {\n            continue;\n          }\n          dests[name] = fetchDestination(names[name]);\n        }\n      }\n      return shadow(this, 'destinations', dests);\n    },\n    getDestination: function Catalog_getDestination(destinationId) {\n      function fetchDestination(dest) {\n        return isDict(dest) ? dest.get('D') : dest;\n      }\n\n      var xref = this.xref;\n      var dest, nameTreeRef, nameDictionaryRef;\n      var obj = this.catDict.get('Names');\n      if (obj && obj.has('Dests')) {\n        nameTreeRef = obj.getRaw('Dests');\n      } else if (this.catDict.has('Dests')) {\n        nameDictionaryRef = this.catDict.get('Dests');\n      }\n\n      if (nameDictionaryRef) {\n        // reading simple destination dictionary\n        obj = nameDictionaryRef;\n        obj.forEach(function catalogForEach(key, value) {\n          if (!value) {\n            return;\n          }\n          if (key === destinationId) {\n            dest = fetchDestination(value);\n          }\n        });\n      }\n      if (nameTreeRef) {\n        var nameTree = new NameTree(nameTreeRef, xref);\n        dest = fetchDestination(nameTree.get(destinationId));\n      }\n      return dest;\n    },\n    get attachments() {\n      var xref = this.xref;\n      var attachments = null, nameTreeRef;\n      var obj = this.catDict.get('Names');\n      if (obj) {\n        nameTreeRef = obj.getRaw('EmbeddedFiles');\n      }\n\n      if (nameTreeRef) {\n        var nameTree = new NameTree(nameTreeRef, xref);\n        var names = nameTree.getAll();\n        for (var name in names) {\n          if (!names.hasOwnProperty(name)) {\n            continue;\n          }\n          var fs = new FileSpec(names[name], xref);\n          if (!attachments) {\n            attachments = {};\n          }\n          attachments[stringToPDFString(name)] = fs.serializable;\n        }\n      }\n      return shadow(this, 'attachments', attachments);\n    },\n    get javaScript() {\n      var xref = this.xref;\n      var obj = this.catDict.get('Names');\n\n      var javaScript = [];\n      if (obj && obj.has('JavaScript')) {\n        var nameTree = new NameTree(obj.getRaw('JavaScript'), xref);\n        var names = nameTree.getAll();\n        for (var name in names) {\n          if (!names.hasOwnProperty(name)) {\n            continue;\n          }\n          // We don't really use the JavaScript right now. This code is\n          // defensive so we don't cause errors on document load.\n          var jsDict = names[name];\n          if (!isDict(jsDict)) {\n            continue;\n          }\n          var type = jsDict.get('S');\n          if (!isName(type) || type.name !== 'JavaScript') {\n            continue;\n          }\n          var js = jsDict.get('JS');\n          if (!isString(js) && !isStream(js)) {\n            continue;\n          }\n          if (isStream(js)) {\n            js = bytesToString(js.getBytes());\n          }\n          javaScript.push(stringToPDFString(js));\n        }\n      }\n\n      // Append OpenAction actions to javaScript array\n      var openactionDict = this.catDict.get('OpenAction');\n      if (isDict(openactionDict)) {\n        var objType = openactionDict.get('Type');\n        var actionType = openactionDict.get('S');\n        var action = openactionDict.get('N');\n        var isPrintAction = (isName(objType) && objType.name === 'Action' &&\n                            isName(actionType) && actionType.name === 'Named' &&\n                            isName(action) && action.name === 'Print');\n\n        if (isPrintAction) {\n          javaScript.push('print(true);');\n        }\n      }\n\n      return shadow(this, 'javaScript', javaScript);\n    },\n\n    cleanup: function Catalog_cleanup() {\n      var promises = [];\n      this.fontCache.forEach(function (promise) {\n        promises.push(promise);\n      });\n      return Promise.all(promises).then(function (translatedFonts) {\n        for (var i = 0, ii = translatedFonts.length; i < ii; i++) {\n          var font = translatedFonts[i].dict;\n          delete font.translated;\n        }\n        this.fontCache.clear();\n      }.bind(this));\n    },\n\n    getPage: function Catalog_getPage(pageIndex) {\n      if (!(pageIndex in this.pagePromises)) {\n        this.pagePromises[pageIndex] = this.getPageDict(pageIndex).then(\n          function (a) {\n            var dict = a[0];\n            var ref = a[1];\n            return new Page(this.pdfManager, this.xref, pageIndex, dict, ref,\n                            this.fontCache);\n          }.bind(this)\n        );\n      }\n      return this.pagePromises[pageIndex];\n    },\n\n    getPageDict: function Catalog_getPageDict(pageIndex) {\n      var capability = createPromiseCapability();\n      var nodesToVisit = [this.catDict.getRaw('Pages')];\n      var currentPageIndex = 0;\n      var xref = this.xref;\n      var checkAllKids = false;\n\n      function next() {\n        while (nodesToVisit.length) {\n          var currentNode = nodesToVisit.pop();\n\n          if (isRef(currentNode)) {\n            xref.fetchAsync(currentNode).then(function (obj) {\n              if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) {\n                if (pageIndex === currentPageIndex) {\n                  capability.resolve([obj, currentNode]);\n                } else {\n                  currentPageIndex++;\n                  next();\n                }\n                return;\n              }\n              nodesToVisit.push(obj);\n              next();\n            }, capability.reject);\n            return;\n          }\n\n          // Must be a child page dictionary.\n          assert(\n            isDict(currentNode),\n            'page dictionary kid reference points to wrong type of object'\n          );\n          var count = currentNode.get('Count');\n          // If the current node doesn't have any children, avoid getting stuck\n          // in an empty node further down in the tree (see issue5644.pdf).\n          if (count === 0) {\n            checkAllKids = true;\n          }\n          // Skip nodes where the page can't be.\n          if (currentPageIndex + count <= pageIndex) {\n            currentPageIndex += count;\n            continue;\n          }\n\n          var kids = currentNode.get('Kids');\n          assert(isArray(kids), 'page dictionary kids object is not an array');\n          if (!checkAllKids && count === kids.length) {\n            // Nodes that don't have the page have been skipped and this is the\n            // bottom of the tree which means the page requested must be a\n            // descendant of this pages node. Ideally we would just resolve the\n            // promise with the page ref here, but there is the case where more\n            // pages nodes could link to single a page (see issue 3666 pdf). To\n            // handle this push it back on the queue so if it is a pages node it\n            // will be descended into.\n            nodesToVisit = [kids[pageIndex - currentPageIndex]];\n            currentPageIndex = pageIndex;\n            continue;\n          } else {\n            for (var last = kids.length - 1; last >= 0; last--) {\n              nodesToVisit.push(kids[last]);\n            }\n          }\n        }\n        capability.reject('Page index ' + pageIndex + ' not found.');\n      }\n      next();\n      return capability.promise;\n    },\n\n    getPageIndex: function Catalog_getPageIndex(ref) {\n      // The page tree nodes have the count of all the leaves below them. To get\n      // how many pages are before we just have to walk up the tree and keep\n      // adding the count of siblings to the left of the node.\n      var xref = this.xref;\n      function pagesBeforeRef(kidRef) {\n        var total = 0;\n        var parentRef;\n        return xref.fetchAsync(kidRef).then(function (node) {\n          if (!node) {\n            return null;\n          }\n          parentRef = node.getRaw('Parent');\n          return node.getAsync('Parent');\n        }).then(function (parent) {\n          if (!parent) {\n            return null;\n          }\n          return parent.getAsync('Kids');\n        }).then(function (kids) {\n          if (!kids) {\n            return null;\n          }\n          var kidPromises = [];\n          var found = false;\n          for (var i = 0; i < kids.length; i++) {\n            var kid = kids[i];\n            assert(isRef(kid), 'kids must be a ref');\n            if (kid.num === kidRef.num) {\n              found = true;\n              break;\n            }\n            kidPromises.push(xref.fetchAsync(kid).then(function (kid) {\n              if (kid.has('Count')) {\n                var count = kid.get('Count');\n                total += count;\n              } else { // page leaf node\n                total++;\n              }\n            }));\n          }\n          if (!found) {\n            error('kid ref not found in parents kids');\n          }\n          return Promise.all(kidPromises).then(function () {\n            return [total, parentRef];\n          });\n        });\n      }\n\n      var total = 0;\n      function next(ref) {\n        return pagesBeforeRef(ref).then(function (args) {\n          if (!args) {\n            return total;\n          }\n          var count = args[0];\n          var parentRef = args[1];\n          total += count;\n          return next(parentRef);\n        });\n      }\n\n      return next(ref);\n    }\n  };\n\n  return Catalog;\n})();\n\nvar XRef = (function XRefClosure() {\n  function XRef(stream, password) {\n    this.stream = stream;\n    this.entries = [];\n    this.xrefstms = {};\n    // prepare the XRef cache\n    this.cache = [];\n    this.password = password;\n    this.stats = {\n      streamTypes: [],\n      fontTypes: []\n    };\n  }\n\n  XRef.prototype = {\n    setStartXRef: function XRef_setStartXRef(startXRef) {\n      // Store the starting positions of xref tables as we process them\n      // so we can recover from missing data errors\n      this.startXRefQueue = [startXRef];\n    },\n\n    parse: function XRef_parse(recoveryMode) {\n      var trailerDict;\n      if (!recoveryMode) {\n        trailerDict = this.readXRef();\n      } else {\n        warn('Indexing all PDF objects');\n        trailerDict = this.indexObjects();\n      }\n      trailerDict.assignXref(this);\n      this.trailer = trailerDict;\n      var encrypt = trailerDict.get('Encrypt');\n      if (encrypt) {\n        var ids = trailerDict.get('ID');\n        var fileId = (ids && ids.length) ? ids[0] : '';\n        this.encrypt = new CipherTransformFactory(encrypt, fileId,\n                                                  this.password);\n      }\n\n      // get the root dictionary (catalog) object\n      if (!(this.root = trailerDict.get('Root'))) {\n        error('Invalid root reference');\n      }\n    },\n\n    processXRefTable: function XRef_processXRefTable(parser) {\n      if (!('tableState' in this)) {\n        // Stores state of the table as we process it so we can resume\n        // from middle of table in case of missing data error\n        this.tableState = {\n          entryNum: 0,\n          streamPos: parser.lexer.stream.pos,\n          parserBuf1: parser.buf1,\n          parserBuf2: parser.buf2\n        };\n      }\n\n      var obj = this.readXRefTable(parser);\n\n      // Sanity check\n      if (!isCmd(obj, 'trailer')) {\n        error('Invalid XRef table: could not find trailer dictionary');\n      }\n      // Read trailer dictionary, e.g.\n      // trailer\n      //    << /Size 22\n      //      /Root 20R\n      //      /Info 10R\n      //      /ID [ <81b14aafa313db63dbd6f981e49f94f4> ]\n      //    >>\n      // The parser goes through the entire stream << ... >> and provides\n      // a getter interface for the key-value table\n      var dict = parser.getObj();\n\n      // The pdflib PDF generator can generate a nested trailer dictionary\n      if (!isDict(dict) && dict.dict) {\n        dict = dict.dict;\n      }\n      if (!isDict(dict)) {\n        error('Invalid XRef table: could not parse trailer dictionary');\n      }\n      delete this.tableState;\n\n      return dict;\n    },\n\n    readXRefTable: function XRef_readXRefTable(parser) {\n      // Example of cross-reference table:\n      // xref\n      // 0 1                    <-- subsection header (first obj #, obj count)\n      // 0000000000 65535 f     <-- actual object (offset, generation #, f/n)\n      // 23 2                   <-- subsection header ... and so on ...\n      // 0000025518 00002 n\n      // 0000025635 00000 n\n      // trailer\n      // ...\n\n      var stream = parser.lexer.stream;\n      var tableState = this.tableState;\n      stream.pos = tableState.streamPos;\n      parser.buf1 = tableState.parserBuf1;\n      parser.buf2 = tableState.parserBuf2;\n\n      // Outer loop is over subsection headers\n      var obj;\n\n      while (true) {\n        if (!('firstEntryNum' in tableState) || !('entryCount' in tableState)) {\n          if (isCmd(obj = parser.getObj(), 'trailer')) {\n            break;\n          }\n          tableState.firstEntryNum = obj;\n          tableState.entryCount = parser.getObj();\n        }\n\n        var first = tableState.firstEntryNum;\n        var count = tableState.entryCount;\n        if (!isInt(first) || !isInt(count)) {\n          error('Invalid XRef table: wrong types in subsection header');\n        }\n        // Inner loop is over objects themselves\n        for (var i = tableState.entryNum; i < count; i++) {\n          tableState.streamPos = stream.pos;\n          tableState.entryNum = i;\n          tableState.parserBuf1 = parser.buf1;\n          tableState.parserBuf2 = parser.buf2;\n\n          var entry = {};\n          entry.offset = parser.getObj();\n          entry.gen = parser.getObj();\n          var type = parser.getObj();\n\n          if (isCmd(type, 'f')) {\n            entry.free = true;\n          } else if (isCmd(type, 'n')) {\n            entry.uncompressed = true;\n          }\n\n          // Validate entry obj\n          if (!isInt(entry.offset) || !isInt(entry.gen) ||\n              !(entry.free || entry.uncompressed)) {\n            error('Invalid entry in XRef subsection: ' + first + ', ' + count);\n          }\n\n          if (!this.entries[i + first]) {\n            this.entries[i + first] = entry;\n          }\n        }\n\n        tableState.entryNum = 0;\n        tableState.streamPos = stream.pos;\n        tableState.parserBuf1 = parser.buf1;\n        tableState.parserBuf2 = parser.buf2;\n        delete tableState.firstEntryNum;\n        delete tableState.entryCount;\n      }\n\n      // Per issue 3248: hp scanners generate bad XRef\n      if (first === 1 && this.entries[1] && this.entries[1].free) {\n        // shifting the entries\n        this.entries.shift();\n      }\n\n      // Sanity check: as per spec, first object must be free\n      if (this.entries[0] && !this.entries[0].free) {\n        error('Invalid XRef table: unexpected first object');\n      }\n      return obj;\n    },\n\n    processXRefStream: function XRef_processXRefStream(stream) {\n      if (!('streamState' in this)) {\n        // Stores state of the stream as we process it so we can resume\n        // from middle of stream in case of missing data error\n        var streamParameters = stream.dict;\n        var byteWidths = streamParameters.get('W');\n        var range = streamParameters.get('Index');\n        if (!range) {\n          range = [0, streamParameters.get('Size')];\n        }\n\n        this.streamState = {\n          entryRanges: range,\n          byteWidths: byteWidths,\n          entryNum: 0,\n          streamPos: stream.pos\n        };\n      }\n      this.readXRefStream(stream);\n      delete this.streamState;\n\n      return stream.dict;\n    },\n\n    readXRefStream: function XRef_readXRefStream(stream) {\n      var i, j;\n      var streamState = this.streamState;\n      stream.pos = streamState.streamPos;\n\n      var byteWidths = streamState.byteWidths;\n      var typeFieldWidth = byteWidths[0];\n      var offsetFieldWidth = byteWidths[1];\n      var generationFieldWidth = byteWidths[2];\n\n      var entryRanges = streamState.entryRanges;\n      while (entryRanges.length > 0) {\n        var first = entryRanges[0];\n        var n = entryRanges[1];\n\n        if (!isInt(first) || !isInt(n)) {\n          error('Invalid XRef range fields: ' + first + ', ' + n);\n        }\n        if (!isInt(typeFieldWidth) || !isInt(offsetFieldWidth) ||\n            !isInt(generationFieldWidth)) {\n          error('Invalid XRef entry fields length: ' + first + ', ' + n);\n        }\n        for (i = streamState.entryNum; i < n; ++i) {\n          streamState.entryNum = i;\n          streamState.streamPos = stream.pos;\n\n          var type = 0, offset = 0, generation = 0;\n          for (j = 0; j < typeFieldWidth; ++j) {\n            type = (type << 8) | stream.getByte();\n          }\n          // if type field is absent, its default value is 1\n          if (typeFieldWidth === 0) {\n            type = 1;\n          }\n          for (j = 0; j < offsetFieldWidth; ++j) {\n            offset = (offset << 8) | stream.getByte();\n          }\n          for (j = 0; j < generationFieldWidth; ++j) {\n            generation = (generation << 8) | stream.getByte();\n          }\n          var entry = {};\n          entry.offset = offset;\n          entry.gen = generation;\n          switch (type) {\n            case 0:\n              entry.free = true;\n              break;\n            case 1:\n              entry.uncompressed = true;\n              break;\n            case 2:\n              break;\n            default:\n              error('Invalid XRef entry type: ' + type);\n          }\n          if (!this.entries[first + i]) {\n            this.entries[first + i] = entry;\n          }\n        }\n\n        streamState.entryNum = 0;\n        streamState.streamPos = stream.pos;\n        entryRanges.splice(0, 2);\n      }\n    },\n\n    indexObjects: function XRef_indexObjects() {\n      // Simple scan through the PDF content to find objects,\n      // trailers and XRef streams.\n      function readToken(data, offset) {\n        var token = '', ch = data[offset];\n        while (ch !== 13 && ch !== 10) {\n          if (++offset >= data.length) {\n            break;\n          }\n          token += String.fromCharCode(ch);\n          ch = data[offset];\n        }\n        return token;\n      }\n      function skipUntil(data, offset, what) {\n        var length = what.length, dataLength = data.length;\n        var skipped = 0;\n        // finding byte sequence\n        while (offset < dataLength) {\n          var i = 0;\n          while (i < length && data[offset + i] === what[i]) {\n            ++i;\n          }\n          if (i >= length) {\n            break; // sequence found\n          }\n          offset++;\n          skipped++;\n        }\n        return skipped;\n      }\n      var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);\n      var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114,\n                                          101, 102]);\n      var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]);\n      var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);\n\n      var stream = this.stream;\n      stream.pos = 0;\n      var buffer = stream.getBytes();\n      var position = stream.start, length = buffer.length;\n      var trailers = [], xrefStms = [];\n      while (position < length) {\n        var ch = buffer[position];\n        if (ch === 32 || ch === 9 || ch === 13 || ch === 10) {\n          ++position;\n          continue;\n        }\n        if (ch === 37) { // %-comment\n          do {\n            ++position;\n            if (position >= length) {\n              break;\n            }\n            ch = buffer[position];\n          } while (ch !== 13 && ch !== 10);\n          continue;\n        }\n        var token = readToken(buffer, position);\n        var m;\n        if (token === 'xref') {\n          position += skipUntil(buffer, position, trailerBytes);\n          trailers.push(position);\n          position += skipUntil(buffer, position, startxrefBytes);\n        } else if ((m = /^(\\d+)\\s+(\\d+)\\s+obj\\b/.exec(token))) {\n          if (typeof this.entries[m[1]] === 'undefined') {\n            this.entries[m[1]] = {\n              offset: position,\n              gen: m[2] | 0,\n              uncompressed: true\n            };\n          }\n          var contentLength = skipUntil(buffer, position, endobjBytes) + 7;\n          var content = buffer.subarray(position, position + contentLength);\n\n          // checking XRef stream suspect\n          // (it shall have '/XRef' and next char is not a letter)\n          var xrefTagOffset = skipUntil(content, 0, xrefBytes);\n          if (xrefTagOffset < contentLength &&\n              content[xrefTagOffset + 5] < 64) {\n            xrefStms.push(position);\n            this.xrefstms[position] = 1; // don't read it recursively\n          }\n\n          position += contentLength;\n        } else {\n          position += token.length + 1;\n        }\n      }\n      // reading XRef streams\n      var i, ii;\n      for (i = 0, ii = xrefStms.length; i < ii; ++i) {\n        this.startXRefQueue.push(xrefStms[i]);\n        this.readXRef(/* recoveryMode */ true);\n      }\n      // finding main trailer\n      var dict;\n      for (i = 0, ii = trailers.length; i < ii; ++i) {\n        stream.pos = trailers[i];\n        var parser = new Parser(new Lexer(stream), true, this);\n        var obj = parser.getObj();\n        if (!isCmd(obj, 'trailer')) {\n          continue;\n        }\n        // read the trailer dictionary\n        if (!isDict(dict = parser.getObj())) {\n          continue;\n        }\n        // taking the first one with 'ID'\n        if (dict.has('ID')) {\n          return dict;\n        }\n      }\n      // no tailer with 'ID', taking last one (if exists)\n      if (dict) {\n        return dict;\n      }\n      // nothing helps\n      // calling error() would reject worker with an UnknownErrorException.\n      throw new InvalidPDFException('Invalid PDF structure');\n    },\n\n    readXRef: function XRef_readXRef(recoveryMode) {\n      var stream = this.stream;\n\n      try {\n        while (this.startXRefQueue.length) {\n          var startXRef = this.startXRefQueue[0];\n\n          stream.pos = startXRef + stream.start;\n\n          var parser = new Parser(new Lexer(stream), true, this);\n          var obj = parser.getObj();\n          var dict;\n\n          // Get dictionary\n          if (isCmd(obj, 'xref')) {\n            // Parse end-of-file XRef\n            dict = this.processXRefTable(parser);\n            if (!this.topDict) {\n              this.topDict = dict;\n            }\n\n            // Recursively get other XRefs 'XRefStm', if any\n            obj = dict.get('XRefStm');\n            if (isInt(obj)) {\n              var pos = obj;\n              // ignore previously loaded xref streams\n              // (possible infinite recursion)\n              if (!(pos in this.xrefstms)) {\n                this.xrefstms[pos] = 1;\n                this.startXRefQueue.push(pos);\n              }\n            }\n          } else if (isInt(obj)) {\n            // Parse in-stream XRef\n            if (!isInt(parser.getObj()) ||\n                !isCmd(parser.getObj(), 'obj') ||\n                !isStream(obj = parser.getObj())) {\n              error('Invalid XRef stream');\n            }\n            dict = this.processXRefStream(obj);\n            if (!this.topDict) {\n              this.topDict = dict;\n            }\n            if (!dict) {\n              error('Failed to read XRef stream');\n            }\n          } else {\n            error('Invalid XRef stream header');\n          }\n\n          // Recursively get previous dictionary, if any\n          obj = dict.get('Prev');\n          if (isInt(obj)) {\n            this.startXRefQueue.push(obj);\n          } else if (isRef(obj)) {\n            // The spec says Prev must not be a reference, i.e. \"/Prev NNN\"\n            // This is a fallback for non-compliant PDFs, i.e. \"/Prev NNN 0 R\"\n            this.startXRefQueue.push(obj.num);\n          }\n\n          this.startXRefQueue.shift();\n        }\n\n        return this.topDict;\n      } catch (e) {\n        if (e instanceof MissingDataException) {\n          throw e;\n        }\n        info('(while reading XRef): ' + e);\n      }\n\n      if (recoveryMode) {\n        return;\n      }\n      throw new XRefParseException();\n    },\n\n    getEntry: function XRef_getEntry(i) {\n      var xrefEntry = this.entries[i];\n      if (xrefEntry && !xrefEntry.free && xrefEntry.offset) {\n        return xrefEntry;\n      }\n      return null;\n    },\n\n    fetchIfRef: function XRef_fetchIfRef(obj) {\n      if (!isRef(obj)) {\n        return obj;\n      }\n      return this.fetch(obj);\n    },\n\n    fetch: function XRef_fetch(ref, suppressEncryption) {\n      assert(isRef(ref), 'ref object is not a reference');\n      var num = ref.num;\n      if (num in this.cache) {\n        var cacheEntry = this.cache[num];\n        return cacheEntry;\n      }\n\n      var xrefEntry = this.getEntry(num);\n\n      // the referenced entry can be free\n      if (xrefEntry === null) {\n        return (this.cache[num] = null);\n      }\n\n      if (xrefEntry.uncompressed) {\n        xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption);\n      } else {\n        xrefEntry = this.fetchCompressed(xrefEntry, suppressEncryption);\n      }\n      if (isDict(xrefEntry)){\n        xrefEntry.objId = ref.toString();\n      } else if (isStream(xrefEntry)) {\n        xrefEntry.dict.objId = ref.toString();\n      }\n      return xrefEntry;\n    },\n\n    fetchUncompressed: function XRef_fetchUncompressed(ref, xrefEntry,\n                                                       suppressEncryption) {\n      var gen = ref.gen;\n      var num = ref.num;\n      if (xrefEntry.gen !== gen) {\n        error('inconsistent generation in XRef');\n      }\n      var stream = this.stream.makeSubStream(xrefEntry.offset +\n                                             this.stream.start);\n      var parser = new Parser(new Lexer(stream), true, this);\n      var obj1 = parser.getObj();\n      var obj2 = parser.getObj();\n      var obj3 = parser.getObj();\n      if (!isInt(obj1) || parseInt(obj1, 10) !== num ||\n          !isInt(obj2) || parseInt(obj2, 10) !== gen ||\n          !isCmd(obj3)) {\n        error('bad XRef entry');\n      }\n      if (!isCmd(obj3, 'obj')) {\n        // some bad PDFs use \"obj1234\" and really mean 1234\n        if (obj3.cmd.indexOf('obj') === 0) {\n          num = parseInt(obj3.cmd.substring(3), 10);\n          if (!isNaN(num)) {\n            return num;\n          }\n        }\n        error('bad XRef entry');\n      }\n      if (this.encrypt && !suppressEncryption) {\n        xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen));\n      } else {\n        xrefEntry = parser.getObj();\n      }\n      if (!isStream(xrefEntry)) {\n        this.cache[num] = xrefEntry;\n      }\n      return xrefEntry;\n    },\n\n    fetchCompressed: function XRef_fetchCompressed(xrefEntry,\n                                                   suppressEncryption) {\n      var tableOffset = xrefEntry.offset;\n      var stream = this.fetch(new Ref(tableOffset, 0));\n      if (!isStream(stream)) {\n        error('bad ObjStm stream');\n      }\n      var first = stream.dict.get('First');\n      var n = stream.dict.get('N');\n      if (!isInt(first) || !isInt(n)) {\n        error('invalid first and n parameters for ObjStm stream');\n      }\n      var parser = new Parser(new Lexer(stream), false, this);\n      parser.allowStreams = true;\n      var i, entries = [], num, nums = [];\n      // read the object numbers to populate cache\n      for (i = 0; i < n; ++i) {\n        num = parser.getObj();\n        if (!isInt(num)) {\n          error('invalid object number in the ObjStm stream: ' + num);\n        }\n        nums.push(num);\n        var offset = parser.getObj();\n        if (!isInt(offset)) {\n          error('invalid object offset in the ObjStm stream: ' + offset);\n        }\n      }\n      // read stream objects for cache\n      for (i = 0; i < n; ++i) {\n        entries.push(parser.getObj());\n        num = nums[i];\n        var entry = this.entries[num];\n        if (entry && entry.offset === tableOffset && entry.gen === i) {\n          this.cache[num] = entries[i];\n        }\n      }\n      xrefEntry = entries[xrefEntry.gen];\n      if (xrefEntry === undefined) {\n        error('bad XRef entry for compressed object');\n      }\n      return xrefEntry;\n    },\n\n    fetchIfRefAsync: function XRef_fetchIfRefAsync(obj) {\n      if (!isRef(obj)) {\n        return Promise.resolve(obj);\n      }\n      return this.fetchAsync(obj);\n    },\n\n    fetchAsync: function XRef_fetchAsync(ref, suppressEncryption) {\n      var streamManager = this.stream.manager;\n      var xref = this;\n      return new Promise(function tryFetch(resolve, reject) {\n        try {\n          resolve(xref.fetch(ref, suppressEncryption));\n        } catch (e) {\n          if (e instanceof MissingDataException) {\n            streamManager.requestRange(e.begin, e.end, function () {\n              tryFetch(resolve, reject);\n            });\n            return;\n          }\n          reject(e);\n        }\n      });\n    },\n\n    getCatalogObj: function XRef_getCatalogObj() {\n      return this.root;\n    }\n  };\n\n  return XRef;\n})();\n\n/**\n * A NameTree is like a Dict but has some advantageous properties, see the\n * spec (7.9.6) for more details.\n * TODO: implement all the Dict functions and make this more efficent.\n */\nvar NameTree = (function NameTreeClosure() {\n  function NameTree(root, xref) {\n    this.root = root;\n    this.xref = xref;\n  }\n\n  NameTree.prototype = {\n    getAll: function NameTree_getAll() {\n      var dict = {};\n      if (!this.root) {\n        return dict;\n      }\n      var xref = this.xref;\n      // reading name tree\n      var processed = new RefSet();\n      processed.put(this.root);\n      var queue = [this.root];\n      while (queue.length > 0) {\n        var i, n;\n        var obj = xref.fetchIfRef(queue.shift());\n        if (!isDict(obj)) {\n          continue;\n        }\n        if (obj.has('Kids')) {\n          var kids = obj.get('Kids');\n          for (i = 0, n = kids.length; i < n; i++) {\n            var kid = kids[i];\n            if (processed.has(kid)) {\n              error('invalid destinations');\n            }\n            queue.push(kid);\n            processed.put(kid);\n          }\n          continue;\n        }\n        var names = obj.get('Names');\n        if (names) {\n          for (i = 0, n = names.length; i < n; i += 2) {\n            dict[names[i]] = xref.fetchIfRef(names[i + 1]);\n          }\n        }\n      }\n      return dict;\n    },\n\n    get: function NameTree_get(destinationId) {\n      if (!this.root) {\n        return null;\n      }\n\n      var xref = this.xref;\n      var kidsOrNames = xref.fetchIfRef(this.root);\n      var loopCount = 0;\n      var MAX_NAMES_LEVELS = 10;\n      var l, r, m;\n\n      // Perform a binary search to quickly find the entry that\n      // contains the named destination we are looking for.\n      while (kidsOrNames.has('Kids')) {\n        loopCount++;\n        if (loopCount > MAX_NAMES_LEVELS) {\n          warn('Search depth limit for named destionations has been reached.');\n          return null;\n        }\n\n        var kids = kidsOrNames.get('Kids');\n        if (!isArray(kids)) {\n          return null;\n        }\n\n        l = 0;\n        r = kids.length - 1;\n        while (l <= r) {\n          m = (l + r) >> 1;\n          var kid = xref.fetchIfRef(kids[m]);\n          var limits = kid.get('Limits');\n\n          if (destinationId < limits[0]) {\n            r = m - 1;\n          } else if (destinationId > limits[1]) {\n            l = m + 1;\n          } else {\n            kidsOrNames = xref.fetchIfRef(kids[m]);\n            break;\n          }\n        }\n        if (l > r) {\n          return null;\n        }\n      }\n\n      // If we get here, then we have found the right entry. Now\n      // go through the named destinations in the Named dictionary\n      // until we find the exact destination we're looking for.\n      var names = kidsOrNames.get('Names');\n      if (isArray(names)) {\n        // Perform a binary search to reduce the lookup time.\n        l = 0;\n        r = names.length - 2;\n        while (l <= r) {\n          // Check only even indices (0, 2, 4, ...) because the\n          // odd indices contain the actual D array.\n          m = (l + r) & ~1;\n          if (destinationId < names[m]) {\n            r = m - 2;\n          } else if (destinationId > names[m]) {\n            l = m + 2;\n          } else {\n            return xref.fetchIfRef(names[m + 1]);\n          }\n        }\n      }\n      return null;\n    }\n  };\n  return NameTree;\n})();\n\n/**\n * \"A PDF file can refer to the contents of another file by using a File\n * Specification (PDF 1.1)\", see the spec (7.11) for more details.\n * NOTE: Only embedded files are supported (as part of the attachments support)\n * TODO: support the 'URL' file system (with caching if !/V), portable\n * collections attributes and related files (/RF)\n */\nvar FileSpec = (function FileSpecClosure() {\n  function FileSpec(root, xref) {\n    if (!root || !isDict(root)) {\n      return;\n    }\n    this.xref = xref;\n    this.root = root;\n    if (root.has('FS')) {\n      this.fs = root.get('FS');\n    }\n    this.description = root.has('Desc') ?\n                         stringToPDFString(root.get('Desc')) :\n                         '';\n    if (root.has('RF')) {\n      warn('Related file specifications are not supported');\n    }\n    this.contentAvailable = true;\n    if (!root.has('EF')) {\n      this.contentAvailable = false;\n      warn('Non-embedded file specifications are not supported');\n    }\n  }\n\n  function pickPlatformItem(dict) {\n    // Look for the filename in this order:\n    // UF, F, Unix, Mac, DOS\n    if (dict.has('UF')) {\n      return dict.get('UF');\n    } else if (dict.has('F')) {\n      return dict.get('F');\n    } else if (dict.has('Unix')) {\n      return dict.get('Unix');\n    } else if (dict.has('Mac')) {\n      return dict.get('Mac');\n    } else if (dict.has('DOS')) {\n      return dict.get('DOS');\n    } else {\n      return null;\n    }\n  }\n\n  FileSpec.prototype = {\n    get filename() {\n      if (!this._filename && this.root) {\n        var filename = pickPlatformItem(this.root) || 'unnamed';\n        this._filename = stringToPDFString(filename).\n          replace(/\\\\\\\\/g, '\\\\').\n          replace(/\\\\\\//g, '/').\n          replace(/\\\\/g, '/');\n      }\n      return this._filename;\n    },\n    get content() {\n      if (!this.contentAvailable) {\n        return null;\n      }\n      if (!this.contentRef && this.root) {\n        this.contentRef = pickPlatformItem(this.root.get('EF'));\n      }\n      var content = null;\n      if (this.contentRef) {\n        var xref = this.xref;\n        var fileObj = xref.fetchIfRef(this.contentRef);\n        if (fileObj && isStream(fileObj)) {\n          content = fileObj.getBytes();\n        } else {\n          warn('Embedded file specification points to non-existing/invalid ' +\n            'content');\n        }\n      } else {\n        warn('Embedded file specification does not have a content');\n      }\n      return content;\n    },\n    get serializable() {\n      return {\n        filename: this.filename,\n        content: this.content\n      };\n    }\n  };\n  return FileSpec;\n})();\n\n/**\n * A helper for loading missing data in object graphs. It traverses the graph\n * depth first and queues up any objects that have missing data. Once it has\n * has traversed as many objects that are available it attempts to bundle the\n * missing data requests and then resume from the nodes that weren't ready.\n *\n * NOTE: It provides protection from circular references by keeping track of\n * of loaded references. However, you must be careful not to load any graphs\n * that have references to the catalog or other pages since that will cause the\n * entire PDF document object graph to be traversed.\n */\nvar ObjectLoader = (function() {\n  function mayHaveChildren(value) {\n    return isRef(value) || isDict(value) || isArray(value) || isStream(value);\n  }\n\n  function addChildren(node, nodesToVisit) {\n    var value;\n    if (isDict(node) || isStream(node)) {\n      var map;\n      if (isDict(node)) {\n        map = node.map;\n      } else {\n        map = node.dict.map;\n      }\n      for (var key in map) {\n        value = map[key];\n        if (mayHaveChildren(value)) {\n          nodesToVisit.push(value);\n        }\n      }\n    } else if (isArray(node)) {\n      for (var i = 0, ii = node.length; i < ii; i++) {\n        value = node[i];\n        if (mayHaveChildren(value)) {\n          nodesToVisit.push(value);\n        }\n      }\n    }\n  }\n\n  function ObjectLoader(obj, keys, xref) {\n    this.obj = obj;\n    this.keys = keys;\n    this.xref = xref;\n    this.refSet = null;\n  }\n\n  ObjectLoader.prototype = {\n    load: function ObjectLoader_load() {\n      var keys = this.keys;\n      this.capability = createPromiseCapability();\n      // Don't walk the graph if all the data is already loaded.\n      if (!(this.xref.stream instanceof ChunkedStream) ||\n          this.xref.stream.getMissingChunks().length === 0) {\n        this.capability.resolve();\n        return this.capability.promise;\n      }\n\n      this.refSet = new RefSet();\n      // Setup the initial nodes to visit.\n      var nodesToVisit = [];\n      for (var i = 0; i < keys.length; i++) {\n        nodesToVisit.push(this.obj[keys[i]]);\n      }\n\n      this.walk(nodesToVisit);\n      return this.capability.promise;\n    },\n\n    walk: function ObjectLoader_walk(nodesToVisit) {\n      var nodesToRevisit = [];\n      var pendingRequests = [];\n      // DFS walk of the object graph.\n      while (nodesToVisit.length) {\n        var currentNode = nodesToVisit.pop();\n\n        // Only references or chunked streams can cause missing data exceptions.\n        if (isRef(currentNode)) {\n          // Skip nodes that have already been visited.\n          if (this.refSet.has(currentNode)) {\n            continue;\n          }\n          try {\n            var ref = currentNode;\n            this.refSet.put(ref);\n            currentNode = this.xref.fetch(currentNode);\n          } catch (e) {\n            if (!(e instanceof MissingDataException)) {\n              throw e;\n            }\n            nodesToRevisit.push(currentNode);\n            pendingRequests.push({ begin: e.begin, end: e.end });\n          }\n        }\n        if (currentNode && currentNode.getBaseStreams) {\n          var baseStreams = currentNode.getBaseStreams();\n          var foundMissingData = false;\n          for (var i = 0; i < baseStreams.length; i++) {\n            var stream = baseStreams[i];\n            if (stream.getMissingChunks && stream.getMissingChunks().length) {\n              foundMissingData = true;\n              pendingRequests.push({\n                begin: stream.start,\n                end: stream.end\n              });\n            }\n          }\n          if (foundMissingData) {\n            nodesToRevisit.push(currentNode);\n          }\n        }\n\n        addChildren(currentNode, nodesToVisit);\n      }\n\n      if (pendingRequests.length) {\n        this.xref.stream.manager.requestRanges(pendingRequests,\n            function pendingRequestCallback() {\n          nodesToVisit = nodesToRevisit;\n          for (var i = 0; i < nodesToRevisit.length; i++) {\n            var node = nodesToRevisit[i];\n            // Remove any reference nodes from the currrent refset so they\n            // aren't skipped when we revist them.\n            if (isRef(node)) {\n              this.refSet.remove(node);\n            }\n          }\n          this.walk(nodesToVisit);\n        }.bind(this));\n        return;\n      }\n      // Everything is loaded.\n      this.refSet = null;\n      this.capability.resolve();\n    }\n  };\n\n  return ObjectLoader;\n})();\n\n\nvar ISOAdobeCharset = [\n  '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar',\n  'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright',\n  'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero',\n  'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',\n  'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',\n  'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\n  'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n  'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',\n  'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',\n  'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',\n  'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',\n  'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',\n  'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',\n  'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',\n  'periodcentered', 'paragraph', 'bullet', 'quotesinglbase',\n  'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',\n  'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde',\n  'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla',\n  'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine',\n  'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash',\n  'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu',\n  'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter',\n  'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior',\n  'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright',\n  'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde',\n  'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute',\n  'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex',\n  'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex',\n  'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute',\n  'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla',\n  'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex',\n  'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis',\n  'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis',\n  'ugrave', 'yacute', 'ydieresis', 'zcaron'\n];\n\nvar ExpertCharset = [\n  '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle',\n  'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',\n  'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',\n  'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',\n  'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',\n  'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle',\n  'colon', 'semicolon', 'commasuperior', 'threequartersemdash',\n  'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior',\n  'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',\n  'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',\n  'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',\n  'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',\n  'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',\n  'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',\n  'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',\n  'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',\n  'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle',\n  'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',\n  'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall',\n  'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall',\n  'Cedillasmall', 'onequarter', 'onehalf', 'threequarters',\n  'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',\n  'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',\n  'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',\n  'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',\n  'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',\n  'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',\n  'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',\n  'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall',\n  'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall',\n  'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',\n  'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',\n  'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',\n  'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',\n  'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',\n  'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',\n  'Ydieresissmall'\n];\n\nvar ExpertSubsetCharset = [\n  '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior',\n  'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',\n  'onedotenleader', 'comma', 'hyphen', 'period', 'fraction',\n  'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',\n  'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle',\n  'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior',\n  'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior',\n  'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',\n  'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',\n  'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',\n  'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted',\n  'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter',\n  'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',\n  'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',\n  'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',\n  'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',\n  'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',\n  'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',\n  'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',\n  'periodinferior', 'commainferior'\n];\n\n\nvar DEFAULT_ICON_SIZE = 22; // px\nvar SUPPORTED_TYPES = ['Link', 'Text', 'Widget'];\n\nvar Annotation = (function AnnotationClosure() {\n  // 12.5.5: Algorithm: Appearance streams\n  function getTransformMatrix(rect, bbox, matrix) {\n    var bounds = Util.getAxialAlignedBoundingBox(bbox, matrix);\n    var minX = bounds[0];\n    var minY = bounds[1];\n    var maxX = bounds[2];\n    var maxY = bounds[3];\n\n    if (minX === maxX || minY === maxY) {\n      // From real-life file, bbox was [0, 0, 0, 0]. In this case,\n      // just apply the transform for rect\n      return [1, 0, 0, 1, rect[0], rect[1]];\n    }\n\n    var xRatio = (rect[2] - rect[0]) / (maxX - minX);\n    var yRatio = (rect[3] - rect[1]) / (maxY - minY);\n    return [\n      xRatio,\n      0,\n      0,\n      yRatio,\n      rect[0] - minX * xRatio,\n      rect[1] - minY * yRatio\n    ];\n  }\n\n  function getDefaultAppearance(dict) {\n    var appearanceState = dict.get('AP');\n    if (!isDict(appearanceState)) {\n      return;\n    }\n\n    var appearance;\n    var appearances = appearanceState.get('N');\n    if (isDict(appearances)) {\n      var as = dict.get('AS');\n      if (as && appearances.has(as.name)) {\n        appearance = appearances.get(as.name);\n      }\n    } else {\n      appearance = appearances;\n    }\n    return appearance;\n  }\n\n  function Annotation(params) {\n    var dict = params.dict;\n    var data = this.data = {};\n\n    data.subtype = dict.get('Subtype').name;\n    var rect = dict.get('Rect') || [0, 0, 0, 0];\n    data.rect = Util.normalizeRect(rect);\n    data.annotationFlags = dict.get('F');\n\n    var color = dict.get('C');\n    if (!color) {\n      // The PDF spec does not mention how a missing color array is interpreted.\n      // Adobe Reader seems to default to black in this case.\n      data.color = [0, 0, 0];\n    } else if (isArray(color)) {\n      switch (color.length) {\n        case 0:\n          // Empty array denotes transparent border.\n          data.color = null;\n          break;\n        case 1:\n          // TODO: implement DeviceGray\n          break;\n        case 3:\n          data.color = color;\n          break;\n        case 4:\n          // TODO: implement DeviceCMYK\n          break;\n      }\n    }\n\n    // Some types of annotations have border style dict which has more\n    // info than the border array\n    if (dict.has('BS')) {\n      var borderStyle = dict.get('BS');\n      data.borderWidth = borderStyle.has('W') ? borderStyle.get('W') : 1;\n    } else {\n      var borderArray = dict.get('Border') || [0, 0, 1];\n      data.borderWidth = borderArray[2] || 0;\n\n      // TODO: implement proper support for annotations with line dash patterns.\n      var dashArray = borderArray[3];\n      if (data.borderWidth > 0 && dashArray) {\n        if (!isArray(dashArray)) {\n          // Ignore the border if dashArray is not actually an array,\n          // this is consistent with the behaviour in Adobe Reader.\n          data.borderWidth = 0;\n        } else {\n          var dashArrayLength = dashArray.length;\n          if (dashArrayLength > 0) {\n            // According to the PDF specification: the elements in a dashArray\n            // shall be numbers that are nonnegative and not all equal to zero.\n            var isInvalid = false;\n            var numPositive = 0;\n            for (var i = 0; i < dashArrayLength; i++) {\n              var validNumber = (+dashArray[i] >= 0);\n              if (!validNumber) {\n                isInvalid = true;\n                break;\n              } else if (dashArray[i] > 0) {\n                numPositive++;\n              }\n            }\n            if (isInvalid || numPositive === 0) {\n              data.borderWidth = 0;\n            }\n          }\n        }\n      }\n    }\n\n    this.appearance = getDefaultAppearance(dict);\n    data.hasAppearance = !!this.appearance;\n    data.id = params.ref.num;\n  }\n\n  Annotation.prototype = {\n\n    getData: function Annotation_getData() {\n      return this.data;\n    },\n\n    isInvisible: function Annotation_isInvisible() {\n      var data = this.data;\n      if (data && SUPPORTED_TYPES.indexOf(data.subtype) !== -1) {\n        return false;\n      } else {\n        return !!(data &&\n                  data.annotationFlags &&            // Default: not invisible\n                  data.annotationFlags & 0x1);       // Invisible\n      }\n    },\n\n    isViewable: function Annotation_isViewable() {\n      var data = this.data;\n      return !!(!this.isInvisible() &&\n                data &&\n                (!data.annotationFlags ||\n                 !(data.annotationFlags & 0x22)) &&  // Hidden or NoView\n                data.rect);                          // rectangle is necessary\n    },\n\n    isPrintable: function Annotation_isPrintable() {\n      var data = this.data;\n      return !!(!this.isInvisible() &&\n                data &&\n                data.annotationFlags &&              // Default: not printable\n                data.annotationFlags & 0x4 &&        // Print\n                !(data.annotationFlags & 0x2) &&     // Hidden\n                data.rect);                          // rectangle is necessary\n    },\n\n    loadResources: function Annotation_loadResources(keys) {\n      return new Promise(function (resolve, reject) {\n        this.appearance.dict.getAsync('Resources').then(function (resources) {\n          if (!resources) {\n            resolve();\n            return;\n          }\n          var objectLoader = new ObjectLoader(resources.map,\n                                              keys,\n                                              resources.xref);\n          objectLoader.load().then(function() {\n            resolve(resources);\n          }, reject);\n        }, reject);\n      }.bind(this));\n    },\n\n    getOperatorList: function Annotation_getOperatorList(evaluator) {\n\n      if (!this.appearance) {\n        return Promise.resolve(new OperatorList());\n      }\n\n      var data = this.data;\n\n      var appearanceDict = this.appearance.dict;\n      var resourcesPromise = this.loadResources([\n        'ExtGState',\n        'ColorSpace',\n        'Pattern',\n        'Shading',\n        'XObject',\n        'Font'\n        // ProcSet\n        // Properties\n      ]);\n      var bbox = appearanceDict.get('BBox') || [0, 0, 1, 1];\n      var matrix = appearanceDict.get('Matrix') || [1, 0, 0, 1, 0 ,0];\n      var transform = getTransformMatrix(data.rect, bbox, matrix);\n      var self = this;\n\n      return resourcesPromise.then(function(resources) {\n          var opList = new OperatorList();\n          opList.addOp(OPS.beginAnnotation, [data.rect, transform, matrix]);\n          return evaluator.getOperatorList(self.appearance, resources, opList).\n            then(function () {\n              opList.addOp(OPS.endAnnotation, []);\n              self.appearance.reset();\n              return opList;\n            });\n        });\n    }\n  };\n\n  Annotation.getConstructor =\n      function Annotation_getConstructor(subtype, fieldType) {\n\n    if (!subtype) {\n      return;\n    }\n\n    // TODO(mack): Implement FreeText annotations\n    if (subtype === 'Link') {\n      return LinkAnnotation;\n    } else if (subtype === 'Text') {\n      return TextAnnotation;\n    } else if (subtype === 'Widget') {\n      if (!fieldType) {\n        return;\n      }\n\n      if (fieldType === 'Tx') {\n        return TextWidgetAnnotation;\n      } else {\n        return WidgetAnnotation;\n      }\n    } else {\n      return Annotation;\n    }\n  };\n\n  Annotation.fromRef = function Annotation_fromRef(xref, ref) {\n\n    var dict = xref.fetchIfRef(ref);\n    if (!isDict(dict)) {\n      return;\n    }\n\n    var subtype = dict.get('Subtype');\n    subtype = isName(subtype) ? subtype.name : '';\n    if (!subtype) {\n      return;\n    }\n\n    var fieldType = Util.getInheritableProperty(dict, 'FT');\n    fieldType = isName(fieldType) ? fieldType.name : '';\n\n    var Constructor = Annotation.getConstructor(subtype, fieldType);\n    if (!Constructor) {\n      return;\n    }\n\n    var params = {\n      dict: dict,\n      ref: ref,\n    };\n\n    var annotation = new Constructor(params);\n\n    if (annotation.isViewable() || annotation.isPrintable()) {\n      return annotation;\n    } else {\n      if (SUPPORTED_TYPES.indexOf(subtype) === -1) {\n        warn('unimplemented annotation type: ' + subtype);\n      }\n    }\n  };\n\n  Annotation.appendToOperatorList = function Annotation_appendToOperatorList(\n      annotations, opList, pdfManager, partialEvaluator, intent) {\n\n    function reject(e) {\n      annotationsReadyCapability.reject(e);\n    }\n\n    var annotationsReadyCapability = createPromiseCapability();\n\n    var annotationPromises = [];\n    for (var i = 0, n = annotations.length; i < n; ++i) {\n      if (intent === 'display' && annotations[i].isViewable() ||\n          intent === 'print' && annotations[i].isPrintable()) {\n        annotationPromises.push(\n          annotations[i].getOperatorList(partialEvaluator));\n      }\n    }\n    Promise.all(annotationPromises).then(function(datas) {\n      opList.addOp(OPS.beginAnnotations, []);\n      for (var i = 0, n = datas.length; i < n; ++i) {\n        var annotOpList = datas[i];\n        opList.addOpList(annotOpList);\n      }\n      opList.addOp(OPS.endAnnotations, []);\n      annotationsReadyCapability.resolve();\n    }, reject);\n\n    return annotationsReadyCapability.promise;\n  };\n\n  return Annotation;\n})();\n\nvar WidgetAnnotation = (function WidgetAnnotationClosure() {\n\n  function WidgetAnnotation(params) {\n    Annotation.call(this, params);\n\n    var dict = params.dict;\n    var data = this.data;\n\n    data.fieldValue = stringToPDFString(\n      Util.getInheritableProperty(dict, 'V') || '');\n    data.alternativeText = stringToPDFString(dict.get('TU') || '');\n    data.defaultAppearance = Util.getInheritableProperty(dict, 'DA') || '';\n    var fieldType = Util.getInheritableProperty(dict, 'FT');\n    data.fieldType = isName(fieldType) ? fieldType.name : '';\n    data.fieldFlags = Util.getInheritableProperty(dict, 'Ff') || 0;\n    this.fieldResources = Util.getInheritableProperty(dict, 'DR') || Dict.empty;\n\n    // Building the full field name by collecting the field and\n    // its ancestors 'T' data and joining them using '.'.\n    var fieldName = [];\n    var namedItem = dict;\n    var ref = params.ref;\n    while (namedItem) {\n      var parent = namedItem.get('Parent');\n      var parentRef = namedItem.getRaw('Parent');\n      var name = namedItem.get('T');\n      if (name) {\n        fieldName.unshift(stringToPDFString(name));\n      } else if (parent && ref) {\n        // The field name is absent, that means more than one field\n        // with the same name may exist. Replacing the empty name\n        // with the '`' plus index in the parent's 'Kids' array.\n        // This is not in the PDF spec but necessary to id the\n        // the input controls.\n        var kids = parent.get('Kids');\n        var j, jj;\n        for (j = 0, jj = kids.length; j < jj; j++) {\n          var kidRef = kids[j];\n          if (kidRef.num === ref.num && kidRef.gen === ref.gen) {\n            break;\n          }\n        }\n        fieldName.unshift('`' + j);\n      }\n      namedItem = parent;\n      ref = parentRef;\n    }\n    data.fullName = fieldName.join('.');\n  }\n\n  var parent = Annotation.prototype;\n  Util.inherit(WidgetAnnotation, Annotation, {\n    isViewable: function WidgetAnnotation_isViewable() {\n      if (this.data.fieldType === 'Sig') {\n        warn('unimplemented annotation type: Widget signature');\n        return false;\n      }\n\n      return parent.isViewable.call(this);\n    }\n  });\n\n  return WidgetAnnotation;\n})();\n\nvar TextWidgetAnnotation = (function TextWidgetAnnotationClosure() {\n  function TextWidgetAnnotation(params) {\n    WidgetAnnotation.call(this, params);\n\n    this.data.textAlignment = Util.getInheritableProperty(params.dict, 'Q');\n    this.data.annotationType = AnnotationType.WIDGET;\n    this.data.hasHtml = !this.data.hasAppearance && !!this.data.fieldValue;\n  }\n\n  Util.inherit(TextWidgetAnnotation, WidgetAnnotation, {\n    getOperatorList: function TextWidgetAnnotation_getOperatorList(evaluator) {\n      if (this.appearance) {\n        return Annotation.prototype.getOperatorList.call(this, evaluator);\n      }\n\n      var opList = new OperatorList();\n      var data = this.data;\n\n      // Even if there is an appearance stream, ignore it. This is the\n      // behaviour used by Adobe Reader.\n      if (!data.defaultAppearance) {\n        return Promise.resolve(opList);\n      }\n\n      var stream = new Stream(stringToBytes(data.defaultAppearance));\n      return evaluator.getOperatorList(stream, this.fieldResources, opList).\n        then(function () {\n          return opList;\n        });\n    }\n  });\n\n  return TextWidgetAnnotation;\n})();\n\nvar InteractiveAnnotation = (function InteractiveAnnotationClosure() {\n  function InteractiveAnnotation(params) {\n    Annotation.call(this, params);\n\n    this.data.hasHtml = true;\n  }\n\n  Util.inherit(InteractiveAnnotation, Annotation, { });\n\n  return InteractiveAnnotation;\n})();\n\nvar TextAnnotation = (function TextAnnotationClosure() {\n  function TextAnnotation(params) {\n    InteractiveAnnotation.call(this, params);\n\n    var dict = params.dict;\n    var data = this.data;\n\n    var content = dict.get('Contents');\n    var title = dict.get('T');\n    data.annotationType = AnnotationType.TEXT;\n    data.content = stringToPDFString(content || '');\n    data.title = stringToPDFString(title || '');\n\n    if (data.hasAppearance) {\n      data.name = 'NoIcon';\n    } else {\n      data.rect[1] = data.rect[3] - DEFAULT_ICON_SIZE;\n      data.rect[2] = data.rect[0] + DEFAULT_ICON_SIZE;\n      data.name = dict.has('Name') ? dict.get('Name').name : 'Note';\n    }\n\n    if (dict.has('C')) {\n      data.hasBgColor = true;\n    }\n  }\n\n  Util.inherit(TextAnnotation, InteractiveAnnotation, { });\n\n  return TextAnnotation;\n})();\n\nvar LinkAnnotation = (function LinkAnnotationClosure() {\n  function LinkAnnotation(params) {\n    InteractiveAnnotation.call(this, params);\n\n    var dict = params.dict;\n    var data = this.data;\n    data.annotationType = AnnotationType.LINK;\n\n    var action = dict.get('A');\n    if (action && isDict(action)) {\n      var linkType = action.get('S').name;\n      if (linkType === 'URI') {\n        var url = action.get('URI');\n        if (isName(url)) {\n          // Some bad PDFs do not put parentheses around relative URLs.\n          url = '/' + url.name;\n        } else if (url) {\n          url = addDefaultProtocolToUrl(url);\n        }\n        // TODO: pdf spec mentions urls can be relative to a Base\n        // entry in the dictionary.\n        if (!isValidUrl(url, false)) {\n          url = '';\n        }\n        // According to ISO 32000-1:2008, section 12.6.4.7, \n        // URI should to be encoded in 7-bit ASCII.\n        // Some bad PDFs may have URIs in UTF-8 encoding, see Bugzilla 1122280.\n        try {\n          data.url = stringToUTF8String(url);\n        } catch (e) {\n          // Fall back to a simple copy.\n          data.url = url;\n        }\n      } else if (linkType === 'GoTo') {\n        data.dest = action.get('D');\n      } else if (linkType === 'GoToR') {\n        var urlDict = action.get('F');\n        if (isDict(urlDict)) {\n          // We assume that the 'url' is a Filspec dictionary\n          // and fetch the url without checking any further\n          url = urlDict.get('F') || '';\n        }\n\n        // TODO: pdf reference says that GoToR\n        // can also have 'NewWindow' attribute\n        if (!isValidUrl(url, false)) {\n          url = '';\n        }\n        data.url = url;\n        data.dest = action.get('D');\n      } else if (linkType === 'Named') {\n        data.action = action.get('N').name;\n      } else {\n        warn('unrecognized link type: ' + linkType);\n      }\n    } else if (dict.has('Dest')) {\n      // simple destination link\n      var dest = dict.get('Dest');\n      data.dest = isName(dest) ? dest.name : dest;\n    }\n  }\n\n  // Lets URLs beginning with 'www.' default to using the 'http://' protocol.\n  function addDefaultProtocolToUrl(url) {\n    if (url && url.indexOf('www.') === 0) {\n      return ('http://' + url);\n    }\n    return url;\n  }\n\n  Util.inherit(LinkAnnotation, InteractiveAnnotation, { });\n\n  return LinkAnnotation;\n})();\n\n\nvar PDFFunction = (function PDFFunctionClosure() {\n  var CONSTRUCT_SAMPLED = 0;\n  var CONSTRUCT_INTERPOLATED = 2;\n  var CONSTRUCT_STICHED = 3;\n  var CONSTRUCT_POSTSCRIPT = 4;\n\n  return {\n    getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps,\n                                                       str) {\n      var i, ii;\n      var length = 1;\n      for (i = 0, ii = size.length; i < ii; i++) {\n        length *= size[i];\n      }\n      length *= outputSize;\n\n      var array = new Array(length);\n      var codeSize = 0;\n      var codeBuf = 0;\n      // 32 is a valid bps so shifting won't work\n      var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);\n\n      var strBytes = str.getBytes((length * bps + 7) / 8);\n      var strIdx = 0;\n      for (i = 0; i < length; i++) {\n        while (codeSize < bps) {\n          codeBuf <<= 8;\n          codeBuf |= strBytes[strIdx++];\n          codeSize += 8;\n        }\n        codeSize -= bps;\n        array[i] = (codeBuf >> codeSize) * sampleMul;\n        codeBuf &= (1 << codeSize) - 1;\n      }\n      return array;\n    },\n\n    getIR: function PDFFunction_getIR(xref, fn) {\n      var dict = fn.dict;\n      if (!dict) {\n        dict = fn;\n      }\n\n      var types = [this.constructSampled,\n                   null,\n                   this.constructInterpolated,\n                   this.constructStiched,\n                   this.constructPostScript];\n\n      var typeNum = dict.get('FunctionType');\n      var typeFn = types[typeNum];\n      if (!typeFn) {\n        error('Unknown type of function');\n      }\n\n      return typeFn.call(this, fn, dict, xref);\n    },\n\n    fromIR: function PDFFunction_fromIR(IR) {\n      var type = IR[0];\n      switch (type) {\n        case CONSTRUCT_SAMPLED:\n          return this.constructSampledFromIR(IR);\n        case CONSTRUCT_INTERPOLATED:\n          return this.constructInterpolatedFromIR(IR);\n        case CONSTRUCT_STICHED:\n          return this.constructStichedFromIR(IR);\n        //case CONSTRUCT_POSTSCRIPT:\n        default:\n          return this.constructPostScriptFromIR(IR);\n      }\n    },\n\n    parse: function PDFFunction_parse(xref, fn) {\n      var IR = this.getIR(xref, fn);\n      return this.fromIR(IR);\n    },\n\n    parseArray: function PDFFunction_parseArray(xref, fnObj) {\n      if (!isArray(fnObj)) {\n        // not an array -- parsing as regular function\n        return this.parse(xref, fnObj);\n      }\n\n      var fnArray = [];\n      for (var j = 0, jj = fnObj.length; j < jj; j++) {\n        var obj = xref.fetchIfRef(fnObj[j]);\n        fnArray.push(PDFFunction.parse(xref, obj));\n      }\n      return function (src, srcOffset, dest, destOffset) {\n        for (var i = 0, ii = fnArray.length; i < ii; i++) {\n          fnArray[i](src, srcOffset, dest, destOffset + i);\n        }\n      };\n    },\n\n    constructSampled: function PDFFunction_constructSampled(str, dict) {\n      function toMultiArray(arr) {\n        var inputLength = arr.length;\n        var out = [];\n        var index = 0;\n        for (var i = 0; i < inputLength; i += 2) {\n          out[index] = [arr[i], arr[i + 1]];\n          ++index;\n        }\n        return out;\n      }\n      var domain = dict.get('Domain');\n      var range = dict.get('Range');\n\n      if (!domain || !range) {\n        error('No domain or range');\n      }\n\n      var inputSize = domain.length / 2;\n      var outputSize = range.length / 2;\n\n      domain = toMultiArray(domain);\n      range = toMultiArray(range);\n\n      var size = dict.get('Size');\n      var bps = dict.get('BitsPerSample');\n      var order = dict.get('Order') || 1;\n      if (order !== 1) {\n        // No description how cubic spline interpolation works in PDF32000:2008\n        // As in poppler, ignoring order, linear interpolation may work as good\n        info('No support for cubic spline interpolation: ' + order);\n      }\n\n      var encode = dict.get('Encode');\n      if (!encode) {\n        encode = [];\n        for (var i = 0; i < inputSize; ++i) {\n          encode.push(0);\n          encode.push(size[i] - 1);\n        }\n      }\n      encode = toMultiArray(encode);\n\n      var decode = dict.get('Decode');\n      if (!decode) {\n        decode = range;\n      } else {\n        decode = toMultiArray(decode);\n      }\n\n      var samples = this.getSampleArray(size, outputSize, bps, str);\n\n      return [\n        CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size,\n        outputSize, Math.pow(2, bps) - 1, range\n      ];\n    },\n\n    constructSampledFromIR: function PDFFunction_constructSampledFromIR(IR) {\n      // See chapter 3, page 109 of the PDF reference\n      function interpolate(x, xmin, xmax, ymin, ymax) {\n        return ymin + ((x - xmin) * ((ymax - ymin) / (xmax - xmin)));\n      }\n\n      return function constructSampledFromIRResult(src, srcOffset,\n                                                   dest, destOffset) {\n        // See chapter 3, page 110 of the PDF reference.\n        var m = IR[1];\n        var domain = IR[2];\n        var encode = IR[3];\n        var decode = IR[4];\n        var samples = IR[5];\n        var size = IR[6];\n        var n = IR[7];\n        //var mask = IR[8];\n        var range = IR[9];\n\n        // Building the cube vertices: its part and sample index\n        // http://rjwagner49.com/Mathematics/Interpolation.pdf\n        var cubeVertices = 1 << m;\n        var cubeN = new Float64Array(cubeVertices);\n        var cubeVertex = new Uint32Array(cubeVertices);\n        var i, j;\n        for (j = 0; j < cubeVertices; j++) {\n          cubeN[j] = 1;\n        }\n\n        var k = n, pos = 1;\n        // Map x_i to y_j for 0 <= i < m using the sampled function.\n        for (i = 0; i < m; ++i) {\n          // x_i' = min(max(x_i, Domain_2i), Domain_2i+1)\n          var domain_2i = domain[i][0];\n          var domain_2i_1 = domain[i][1];\n          var xi = Math.min(Math.max(src[srcOffset +i], domain_2i),\n                            domain_2i_1);\n\n          // e_i = Interpolate(x_i', Domain_2i, Domain_2i+1,\n          //                   Encode_2i, Encode_2i+1)\n          var e = interpolate(xi, domain_2i, domain_2i_1,\n                              encode[i][0], encode[i][1]);\n\n          // e_i' = min(max(e_i, 0), Size_i - 1)\n          var size_i = size[i];\n          e = Math.min(Math.max(e, 0), size_i - 1);\n\n          // Adjusting the cube: N and vertex sample index\n          var e0 = e < size_i - 1 ? Math.floor(e) : e - 1; // e1 = e0 + 1;\n          var n0 = e0 + 1 - e; // (e1 - e) / (e1 - e0);\n          var n1 = e - e0; // (e - e0) / (e1 - e0);\n          var offset0 = e0 * k;\n          var offset1 = offset0 + k; // e1 * k\n          for (j = 0; j < cubeVertices; j++) {\n            if (j & pos) {\n              cubeN[j] *= n1;\n              cubeVertex[j] += offset1;\n            } else {\n              cubeN[j] *= n0;\n              cubeVertex[j] += offset0;\n            }\n          }\n\n          k *= size_i;\n          pos <<= 1;\n        }\n\n        for (j = 0; j < n; ++j) {\n          // Sum all cube vertices' samples portions\n          var rj = 0;\n          for (i = 0; i < cubeVertices; i++) {\n            rj += samples[cubeVertex[i] + j] * cubeN[i];\n          }\n\n          // r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1,\n          //                    Decode_2j, Decode_2j+1)\n          rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);\n\n          // y_j = min(max(r_j, range_2j), range_2j+1)\n          dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]),\n                                          range[j][1]);\n        }\n      };\n    },\n\n    constructInterpolated: function PDFFunction_constructInterpolated(str,\n                                                                      dict) {\n      var c0 = dict.get('C0') || [0];\n      var c1 = dict.get('C1') || [1];\n      var n = dict.get('N');\n\n      if (!isArray(c0) || !isArray(c1)) {\n        error('Illegal dictionary for interpolated function');\n      }\n\n      var length = c0.length;\n      var diff = [];\n      for (var i = 0; i < length; ++i) {\n        diff.push(c1[i] - c0[i]);\n      }\n\n      return [CONSTRUCT_INTERPOLATED, c0, diff, n];\n    },\n\n    constructInterpolatedFromIR:\n      function PDFFunction_constructInterpolatedFromIR(IR) {\n      var c0 = IR[1];\n      var diff = IR[2];\n      var n = IR[3];\n\n      var length = diff.length;\n\n      return function constructInterpolatedFromIRResult(src, srcOffset,\n                                                        dest, destOffset) {\n        var x = n === 1 ? src[srcOffset] : Math.pow(src[srcOffset], n);\n\n        for (var j = 0; j < length; ++j) {\n          dest[destOffset + j] = c0[j] + (x * diff[j]);\n        }\n      };\n    },\n\n    constructStiched: function PDFFunction_constructStiched(fn, dict, xref) {\n      var domain = dict.get('Domain');\n\n      if (!domain) {\n        error('No domain');\n      }\n\n      var inputSize = domain.length / 2;\n      if (inputSize !== 1) {\n        error('Bad domain for stiched function');\n      }\n\n      var fnRefs = dict.get('Functions');\n      var fns = [];\n      for (var i = 0, ii = fnRefs.length; i < ii; ++i) {\n        fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i])));\n      }\n\n      var bounds = dict.get('Bounds');\n      var encode = dict.get('Encode');\n\n      return [CONSTRUCT_STICHED, domain, bounds, encode, fns];\n    },\n\n    constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) {\n      var domain = IR[1];\n      var bounds = IR[2];\n      var encode = IR[3];\n      var fnsIR = IR[4];\n      var fns = [];\n      var tmpBuf = new Float32Array(1);\n\n      for (var i = 0, ii = fnsIR.length; i < ii; i++) {\n        fns.push(PDFFunction.fromIR(fnsIR[i]));\n      }\n\n      return function constructStichedFromIRResult(src, srcOffset,\n                                                   dest, destOffset) {\n        var clip = function constructStichedFromIRClip(v, min, max) {\n          if (v > max) {\n            v = max;\n          } else if (v < min) {\n            v = min;\n          }\n          return v;\n        };\n\n        // clip to domain\n        var v = clip(src[srcOffset], domain[0], domain[1]);\n        // calulate which bound the value is in\n        for (var i = 0, ii = bounds.length; i < ii; ++i) {\n          if (v < bounds[i]) {\n            break;\n          }\n        }\n\n        // encode value into domain of function\n        var dmin = domain[0];\n        if (i > 0) {\n          dmin = bounds[i - 1];\n        }\n        var dmax = domain[1];\n        if (i < bounds.length) {\n          dmax = bounds[i];\n        }\n\n        var rmin = encode[2 * i];\n        var rmax = encode[2 * i + 1];\n\n        tmpBuf[0] = rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);\n\n        // call the appropriate function\n        fns[i](tmpBuf, 0, dest, destOffset);\n      };\n    },\n\n    constructPostScript: function PDFFunction_constructPostScript(fn, dict,\n                                                                  xref) {\n      var domain = dict.get('Domain');\n      var range = dict.get('Range');\n\n      if (!domain) {\n        error('No domain.');\n      }\n\n      if (!range) {\n        error('No range.');\n      }\n\n      var lexer = new PostScriptLexer(fn);\n      var parser = new PostScriptParser(lexer);\n      var code = parser.parse();\n\n      return [CONSTRUCT_POSTSCRIPT, domain, range, code];\n    },\n\n    constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR(\n                                          IR) {\n      var domain = IR[1];\n      var range = IR[2];\n      var code = IR[3];\n\n      var compiled = (new PostScriptCompiler()).compile(code, domain, range);\n      if (compiled) {\n        // Compiled function consists of simple expressions such as addition,\n        // subtraction, Math.max, and also contains 'var' and 'return'\n        // statements. See the generation in the PostScriptCompiler below.\n        /*jshint -W054 */\n        return new Function('src', 'srcOffset', 'dest', 'destOffset', compiled);\n      }\n\n      info('Unable to compile PS function');\n\n      var numOutputs = range.length >> 1;\n      var numInputs = domain.length >> 1;\n      var evaluator = new PostScriptEvaluator(code);\n      // Cache the values for a big speed up, the cache size is limited though\n      // since the number of possible values can be huge from a PS function.\n      var cache = {};\n      // The MAX_CACHE_SIZE is set to ~4x the maximum number of distinct values\n      // seen in our tests.\n      var MAX_CACHE_SIZE = 2048 * 4;\n      var cache_available = MAX_CACHE_SIZE;\n      var tmpBuf = new Float32Array(numInputs);\n\n      return function constructPostScriptFromIRResult(src, srcOffset,\n                                                      dest, destOffset) {\n        var i, value;\n        var key = '';\n        var input = tmpBuf;\n        for (i = 0; i < numInputs; i++) {\n          value = src[srcOffset + i];\n          input[i] = value;\n          key += value + '_';\n        }\n\n        var cachedValue = cache[key];\n        if (cachedValue !== undefined) {\n          dest.set(cachedValue, destOffset);\n          return;\n        }\n\n        var output = new Float32Array(numOutputs);\n        var stack = evaluator.execute(input);\n        var stackIndex = stack.length - numOutputs;\n        for (i = 0; i < numOutputs; i++) {\n          value = stack[stackIndex + i];\n          var bound = range[i * 2];\n          if (value < bound) {\n            value = bound;\n          } else {\n            bound = range[i * 2 +1];\n            if (value > bound) {\n              value = bound;\n            }\n          }\n          output[i] = value;\n        }\n        if (cache_available > 0) {\n          cache_available--;\n          cache[key] = output;\n        }\n        dest.set(output, destOffset);\n      };\n    }\n  };\n})();\n\nfunction isPDFFunction(v) {\n  var fnDict;\n  if (typeof v !== 'object') {\n    return false;\n  } else if (isDict(v)) {\n    fnDict = v;\n  } else if (isStream(v)) {\n    fnDict = v.dict;\n  } else {\n    return false;\n  }\n  return fnDict.has('FunctionType');\n}\n\nvar PostScriptStack = (function PostScriptStackClosure() {\n  var MAX_STACK_SIZE = 100;\n  function PostScriptStack(initialStack) {\n    this.stack = !initialStack ? [] :\n                 Array.prototype.slice.call(initialStack, 0);\n  }\n\n  PostScriptStack.prototype = {\n    push: function PostScriptStack_push(value) {\n      if (this.stack.length >= MAX_STACK_SIZE) {\n        error('PostScript function stack overflow.');\n      }\n      this.stack.push(value);\n    },\n    pop: function PostScriptStack_pop() {\n      if (this.stack.length <= 0) {\n        error('PostScript function stack underflow.');\n      }\n      return this.stack.pop();\n    },\n    copy: function PostScriptStack_copy(n) {\n      if (this.stack.length + n >= MAX_STACK_SIZE) {\n        error('PostScript function stack overflow.');\n      }\n      var stack = this.stack;\n      for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++) {\n        stack.push(stack[i]);\n      }\n    },\n    index: function PostScriptStack_index(n) {\n      this.push(this.stack[this.stack.length - n - 1]);\n    },\n    // rotate the last n stack elements p times\n    roll: function PostScriptStack_roll(n, p) {\n      var stack = this.stack;\n      var l = stack.length - n;\n      var r = stack.length - 1, c = l + (p - Math.floor(p / n) * n), i, j, t;\n      for (i = l, j = r; i < j; i++, j--) {\n        t = stack[i]; stack[i] = stack[j]; stack[j] = t;\n      }\n      for (i = l, j = c - 1; i < j; i++, j--) {\n        t = stack[i]; stack[i] = stack[j]; stack[j] = t;\n      }\n      for (i = c, j = r; i < j; i++, j--) {\n        t = stack[i]; stack[i] = stack[j]; stack[j] = t;\n      }\n    }\n  };\n  return PostScriptStack;\n})();\nvar PostScriptEvaluator = (function PostScriptEvaluatorClosure() {\n  function PostScriptEvaluator(operators) {\n    this.operators = operators;\n  }\n  PostScriptEvaluator.prototype = {\n    execute: function PostScriptEvaluator_execute(initialStack) {\n      var stack = new PostScriptStack(initialStack);\n      var counter = 0;\n      var operators = this.operators;\n      var length = operators.length;\n      var operator, a, b;\n      while (counter < length) {\n        operator = operators[counter++];\n        if (typeof operator === 'number') {\n          // Operator is really an operand and should be pushed to the stack.\n          stack.push(operator);\n          continue;\n        }\n        switch (operator) {\n          // non standard ps operators\n          case 'jz': // jump if false\n            b = stack.pop();\n            a = stack.pop();\n            if (!a) {\n              counter = b;\n            }\n            break;\n          case 'j': // jump\n            a = stack.pop();\n            counter = a;\n            break;\n\n          // all ps operators in alphabetical order (excluding if/ifelse)\n          case 'abs':\n            a = stack.pop();\n            stack.push(Math.abs(a));\n            break;\n          case 'add':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a + b);\n            break;\n          case 'and':\n            b = stack.pop();\n            a = stack.pop();\n            if (isBool(a) && isBool(b)) {\n              stack.push(a && b);\n            } else {\n              stack.push(a & b);\n            }\n            break;\n          case 'atan':\n            a = stack.pop();\n            stack.push(Math.atan(a));\n            break;\n          case 'bitshift':\n            b = stack.pop();\n            a = stack.pop();\n            if (a > 0) {\n              stack.push(a << b);\n            } else {\n              stack.push(a >> b);\n            }\n            break;\n          case 'ceiling':\n            a = stack.pop();\n            stack.push(Math.ceil(a));\n            break;\n          case 'copy':\n            a = stack.pop();\n            stack.copy(a);\n            break;\n          case 'cos':\n            a = stack.pop();\n            stack.push(Math.cos(a));\n            break;\n          case 'cvi':\n            a = stack.pop() | 0;\n            stack.push(a);\n            break;\n          case 'cvr':\n            // noop\n            break;\n          case 'div':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a / b);\n            break;\n          case 'dup':\n            stack.copy(1);\n            break;\n          case 'eq':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a === b);\n            break;\n          case 'exch':\n            stack.roll(2, 1);\n            break;\n          case 'exp':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(Math.pow(a, b));\n            break;\n          case 'false':\n            stack.push(false);\n            break;\n          case 'floor':\n            a = stack.pop();\n            stack.push(Math.floor(a));\n            break;\n          case 'ge':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a >= b);\n            break;\n          case 'gt':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a > b);\n            break;\n          case 'idiv':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push((a / b) | 0);\n            break;\n          case 'index':\n            a = stack.pop();\n            stack.index(a);\n            break;\n          case 'le':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a <= b);\n            break;\n          case 'ln':\n            a = stack.pop();\n            stack.push(Math.log(a));\n            break;\n          case 'log':\n            a = stack.pop();\n            stack.push(Math.log(a) / Math.LN10);\n            break;\n          case 'lt':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a < b);\n            break;\n          case 'mod':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a % b);\n            break;\n          case 'mul':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a * b);\n            break;\n          case 'ne':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a !== b);\n            break;\n          case 'neg':\n            a = stack.pop();\n            stack.push(-a);\n            break;\n          case 'not':\n            a = stack.pop();\n            if (isBool(a)) {\n              stack.push(!a);\n            } else {\n              stack.push(~a);\n            }\n            break;\n          case 'or':\n            b = stack.pop();\n            a = stack.pop();\n            if (isBool(a) && isBool(b)) {\n              stack.push(a || b);\n            } else {\n              stack.push(a | b);\n            }\n            break;\n          case 'pop':\n            stack.pop();\n            break;\n          case 'roll':\n            b = stack.pop();\n            a = stack.pop();\n            stack.roll(a, b);\n            break;\n          case 'round':\n            a = stack.pop();\n            stack.push(Math.round(a));\n            break;\n          case 'sin':\n            a = stack.pop();\n            stack.push(Math.sin(a));\n            break;\n          case 'sqrt':\n            a = stack.pop();\n            stack.push(Math.sqrt(a));\n            break;\n          case 'sub':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a - b);\n            break;\n          case 'true':\n            stack.push(true);\n            break;\n          case 'truncate':\n            a = stack.pop();\n            a = a < 0 ? Math.ceil(a) : Math.floor(a);\n            stack.push(a);\n            break;\n          case 'xor':\n            b = stack.pop();\n            a = stack.pop();\n            if (isBool(a) && isBool(b)) {\n              stack.push(a !== b);\n            } else {\n              stack.push(a ^ b);\n            }\n            break;\n          default:\n            error('Unknown operator ' + operator);\n            break;\n        }\n      }\n      return stack.stack;\n    }\n  };\n  return PostScriptEvaluator;\n})();\n\n// Most of the PDFs functions consist of simple operations such as:\n//   roll, exch, sub, cvr, pop, index, dup, mul, if, gt, add.\n//\n// We can compile most of such programs, and at the same moment, we can\n// optimize some expressions using basic math properties. Keeping track of\n// min/max values will allow us to avoid extra Math.min/Math.max calls.\nvar PostScriptCompiler = (function PostScriptCompilerClosure() {\n  function AstNode(type) {\n    this.type = type;\n  }\n  AstNode.prototype.visit = function (visitor) {\n    throw new Error('abstract method');\n  };\n\n  function AstArgument(index, min, max) {\n    AstNode.call(this, 'args');\n    this.index = index;\n    this.min = min;\n    this.max = max;\n  }\n  AstArgument.prototype = Object.create(AstNode.prototype);\n  AstArgument.prototype.visit = function (visitor) {\n    visitor.visitArgument(this);\n  };\n\n  function AstLiteral(number) {\n    AstNode.call(this, 'literal');\n    this.number = number;\n    this.min = number;\n    this.max = number;\n  }\n  AstLiteral.prototype = Object.create(AstNode.prototype);\n  AstLiteral.prototype.visit = function (visitor) {\n    visitor.visitLiteral(this);\n  };\n\n  function AstBinaryOperation(op, arg1, arg2, min, max) {\n    AstNode.call(this, 'binary');\n    this.op = op;\n    this.arg1 = arg1;\n    this.arg2 = arg2;\n    this.min = min;\n    this.max = max;\n  }\n  AstBinaryOperation.prototype = Object.create(AstNode.prototype);\n  AstBinaryOperation.prototype.visit = function (visitor) {\n    visitor.visitBinaryOperation(this);\n  };\n\n  function AstMin(arg, max) {\n    AstNode.call(this, 'max');\n    this.arg = arg;\n    this.min = arg.min;\n    this.max = max;\n  }\n  AstMin.prototype = Object.create(AstNode.prototype);\n  AstMin.prototype.visit = function (visitor) {\n    visitor.visitMin(this);\n  };\n\n  function AstVariable(index, min, max) {\n    AstNode.call(this, 'var');\n    this.index = index;\n    this.min = min;\n    this.max = max;\n  }\n  AstVariable.prototype = Object.create(AstNode.prototype);\n  AstVariable.prototype.visit = function (visitor) {\n    visitor.visitVariable(this);\n  };\n\n  function AstVariableDefinition(variable, arg) {\n    AstNode.call(this, 'definition');\n    this.variable = variable;\n    this.arg = arg;\n  }\n  AstVariableDefinition.prototype = Object.create(AstNode.prototype);\n  AstVariableDefinition.prototype.visit = function (visitor) {\n    visitor.visitVariableDefinition(this);\n  };\n\n  function ExpressionBuilderVisitor() {\n    this.parts = [];\n  }\n  ExpressionBuilderVisitor.prototype = {\n    visitArgument: function (arg) {\n      this.parts.push('Math.max(', arg.min, ', Math.min(',\n                      arg.max, ', src[srcOffset + ', arg.index, ']))');\n    },\n    visitVariable: function (variable) {\n      this.parts.push('v', variable.index);\n    },\n    visitLiteral: function (literal) {\n      this.parts.push(literal.number);\n    },\n    visitBinaryOperation: function (operation) {\n      this.parts.push('(');\n      operation.arg1.visit(this);\n      this.parts.push(' ', operation.op, ' ');\n      operation.arg2.visit(this);\n      this.parts.push(')');\n    },\n    visitVariableDefinition: function (definition) {\n      this.parts.push('var ');\n      definition.variable.visit(this);\n      this.parts.push(' = ');\n      definition.arg.visit(this);\n      this.parts.push(';');\n    },\n    visitMin: function (max) {\n      this.parts.push('Math.min(');\n      max.arg.visit(this);\n      this.parts.push(', ', max.max, ')');\n    },\n    toString: function () {\n      return this.parts.join('');\n    }\n  };\n\n  function buildAddOperation(num1, num2) {\n    if (num2.type === 'literal' && num2.number === 0) {\n      // optimization: second operand is 0\n      return num1;\n    }\n    if (num1.type === 'literal' && num1.number === 0) {\n      // optimization: first operand is 0\n      return num2;\n    }\n    if (num2.type === 'literal' && num1.type === 'literal') {\n      // optimization: operands operand are literals\n      return new AstLiteral(num1.number + num2.number);\n    }\n    return new AstBinaryOperation('+', num1, num2,\n                                  num1.min + num2.min, num1.max + num2.max);\n  }\n\n  function buildMulOperation(num1, num2) {\n    if (num2.type === 'literal') {\n      // optimization: second operands is a literal...\n      if (num2.number === 0) {\n        return new AstLiteral(0); // and it's 0\n      } else if (num2.number === 1) {\n        return num1; // and it's 1\n      } else if (num1.type === 'literal') {\n        // ... and first operands is a literal too\n        return new AstLiteral(num1.number * num2.number);\n      }\n    }\n    if (num1.type === 'literal') {\n      // optimization: first operands is a literal...\n      if (num1.number === 0) {\n        return new AstLiteral(0); // and it's 0\n      } else if (num1.number === 1) {\n        return num2; // and it's 1\n      }\n    }\n    var min = Math.min(num1.min * num2.min, num1.min * num2.max,\n                       num1.max * num2.min, num1.max * num2.max);\n    var max = Math.max(num1.min * num2.min, num1.min * num2.max,\n                       num1.max * num2.min, num1.max * num2.max);\n    return new AstBinaryOperation('*', num1, num2, min, max);\n  }\n\n  function buildSubOperation(num1, num2) {\n    if (num2.type === 'literal') {\n      // optimization: second operands is a literal...\n      if (num2.number === 0) {\n        return num1; // ... and it's 0\n      } else if (num1.type === 'literal') {\n        // ... and first operands is a literal too\n        return new AstLiteral(num1.number - num2.number);\n      }\n    }\n    if (num2.type === 'binary' && num2.op === '-' &&\n      num1.type === 'literal' && num1.number === 1 &&\n      num2.arg1.type === 'literal' && num2.arg1.number === 1) {\n      // optimization for case: 1 - (1 - x)\n      return num2.arg2;\n    }\n    return new AstBinaryOperation('-', num1, num2,\n                                  num1.min - num2.max, num1.max - num2.min);\n  }\n\n  function buildMinOperation(num1, max) {\n    if (num1.min >= max) {\n      // optimization: num1 min value is not less than required max\n      return new AstLiteral(max); // just returning max\n    } else if (num1.max <= max) {\n      // optimization: num1 max value is not greater than required max\n      return num1; // just returning an argument\n    }\n    return new AstMin(num1, max);\n  }\n\n  function PostScriptCompiler() {}\n  PostScriptCompiler.prototype = {\n    compile: function PostScriptCompiler_compile(code, domain, range) {\n      var stack = [];\n      var i, ii;\n      var instructions = [];\n      var inputSize = domain.length >> 1, outputSize = range.length >> 1;\n      var lastRegister = 0;\n      var n, j, min, max;\n      var num1, num2, ast1, ast2, tmpVar, item;\n      for (i = 0; i < inputSize; i++) {\n        stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1]));\n      }\n\n      for (i = 0, ii = code.length; i < ii; i++) {\n        item = code[i];\n        if (typeof item === 'number') {\n          stack.push(new AstLiteral(item));\n          continue;\n        }\n\n        switch (item) {\n          case 'add':\n            if (stack.length < 2) {\n              return null;\n            }\n            num2 = stack.pop();\n            num1 = stack.pop();\n            stack.push(buildAddOperation(num1, num2));\n            break;\n          case 'cvr':\n            if (stack.length < 1) {\n              return null;\n            }\n            break;\n          case 'mul':\n            if (stack.length < 2) {\n              return null;\n            }\n            num2 = stack.pop();\n            num1 = stack.pop();\n            stack.push(buildMulOperation(num1, num2));\n            break;\n          case 'sub':\n            if (stack.length < 2) {\n              return null;\n            }\n            num2 = stack.pop();\n            num1 = stack.pop();\n            stack.push(buildSubOperation(num1, num2));\n            break;\n          case 'exch':\n            if (stack.length < 2) {\n              return null;\n            }\n            ast1 = stack.pop(); ast2 = stack.pop();\n            stack.push(ast1, ast2);\n            break;\n          case 'pop':\n            if (stack.length < 1) {\n              return null;\n            }\n            stack.pop();\n            break;\n          case 'index':\n            if (stack.length < 1) {\n              return null;\n            }\n            num1 = stack.pop();\n            if (num1.type !== 'literal') {\n              return null;\n            }\n            n = num1.number;\n            if (n < 0 || (n|0) !== n || stack.length < n) {\n              return null;\n            }\n            ast1 = stack[stack.length - n - 1];\n            if (ast1.type === 'literal' || ast1.type === 'var') {\n              stack.push(ast1);\n              break;\n            }\n            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);\n            stack[stack.length - n - 1] = tmpVar;\n            stack.push(tmpVar);\n            instructions.push(new AstVariableDefinition(tmpVar, ast1));\n            break;\n          case 'dup':\n            if (stack.length < 1) {\n              return null;\n            }\n            if (typeof code[i + 1] === 'number' && code[i + 2] === 'gt' &&\n                code[i + 3] === i + 7 && code[i + 4] === 'jz' &&\n                code[i + 5] === 'pop' && code[i + 6] === code[i + 1]) {\n              // special case of the commands sequence for the min operation\n              num1 = stack.pop();\n              stack.push(buildMinOperation(num1, code[i + 1]));\n              i += 6;\n              break;\n            }\n            ast1 = stack[stack.length - 1];\n            if (ast1.type === 'literal' || ast1.type === 'var') {\n              // we don't have to save into intermediate variable a literal or\n              // variable.\n              stack.push(ast1);\n              break;\n            }\n            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);\n            stack[stack.length - 1] = tmpVar;\n            stack.push(tmpVar);\n            instructions.push(new AstVariableDefinition(tmpVar, ast1));\n            break;\n          case 'roll':\n            if (stack.length < 2) {\n              return null;\n            }\n            num2 = stack.pop();\n            num1 = stack.pop();\n            if (num2.type !== 'literal' || num1.type !== 'literal') {\n              // both roll operands must be numbers\n              return null;\n            }\n            j = num2.number;\n            n = num1.number;\n            if (n <= 0 || (n|0) !== n || (j|0) !== j || stack.length < n) {\n              // ... and integers\n              return null;\n            }\n            j = ((j % n) + n) % n;\n            if (j === 0) {\n              break; // just skipping -- there are nothing to rotate\n            }\n            Array.prototype.push.apply(stack,\n                                       stack.splice(stack.length - n, n - j));\n            break;\n          default:\n            return null; // unsupported operator\n        }\n      }\n\n      if (stack.length !== outputSize) {\n        return null;\n      }\n\n      var result = [];\n      instructions.forEach(function (instruction) {\n        var statementBuilder = new ExpressionBuilderVisitor();\n        instruction.visit(statementBuilder);\n        result.push(statementBuilder.toString());\n      });\n      stack.forEach(function (expr, i) {\n        var statementBuilder = new ExpressionBuilderVisitor();\n        expr.visit(statementBuilder);\n        var min = range[i * 2], max = range[i * 2 + 1];\n        var out = [statementBuilder.toString()];\n        if (min > expr.min) {\n          out.unshift('Math.max(', min, ', ');\n          out.push(')');\n        }\n        if (max < expr.max) {\n          out.unshift('Math.min(', max, ', ');\n          out.push(')');\n        }\n        out.unshift('dest[destOffset + ', i, '] = ');\n        out.push(';');\n        result.push(out.join(''));\n      });\n      return result.join('\\n');\n    }\n  };\n\n  return PostScriptCompiler;\n})();\n\n\nvar ColorSpace = (function ColorSpaceClosure() {\n  // Constructor should define this.numComps, this.defaultColor, this.name\n  function ColorSpace() {\n    error('should not call ColorSpace constructor');\n  }\n\n  ColorSpace.prototype = {\n    /**\n     * Converts the color value to the RGB color. The color components are\n     * located in the src array starting from the srcOffset. Returns the array\n     * of the rgb components, each value ranging from [0,255].\n     */\n    getRgb: function ColorSpace_getRgb(src, srcOffset) {\n      var rgb = new Uint8Array(3);\n      this.getRgbItem(src, srcOffset, rgb, 0);\n      return rgb;\n    },\n    /**\n     * Converts the color value to the RGB color, similar to the getRgb method.\n     * The result placed into the dest array starting from the destOffset.\n     */\n    getRgbItem: function ColorSpace_getRgbItem(src, srcOffset,\n                                               dest, destOffset) {\n      error('Should not call ColorSpace.getRgbItem');\n    },\n    /**\n     * Converts the specified number of the color values to the RGB colors.\n     * The colors are located in the src array starting from the srcOffset.\n     * The result is placed into the dest array starting from the destOffset.\n     * The src array items shall be in [0,2^bits) range, the dest array items\n     * will be in [0,255] range. alpha01 indicates how many alpha components\n     * there are in the dest array; it will be either 0 (RGB array) or 1 (RGBA\n     * array).\n     */\n    getRgbBuffer: function ColorSpace_getRgbBuffer(src, srcOffset, count,\n                                                   dest, destOffset, bits,\n                                                   alpha01) {\n      error('Should not call ColorSpace.getRgbBuffer');\n    },\n    /**\n     * Determines the number of bytes required to store the result of the\n     * conversion done by the getRgbBuffer method. As in getRgbBuffer,\n     * |alpha01| is either 0 (RGB output) or 1 (RGBA output).\n     */\n    getOutputLength: function ColorSpace_getOutputLength(inputLength,\n                                                         alpha01) {\n      error('Should not call ColorSpace.getOutputLength');\n    },\n    /**\n     * Returns true if source data will be equal the result/output data.\n     */\n    isPassthrough: function ColorSpace_isPassthrough(bits) {\n      return false;\n    },\n    /**\n     * Fills in the RGB colors in the destination buffer.  alpha01 indicates\n     * how many alpha components there are in the dest array; it will be either\n     * 0 (RGB array) or 1 (RGBA array).\n     */\n    fillRgb: function ColorSpace_fillRgb(dest, originalWidth,\n                                         originalHeight, width, height,\n                                         actualHeight, bpc, comps, alpha01) {\n      var count = originalWidth * originalHeight;\n      var rgbBuf = null;\n      var numComponentColors = 1 << bpc;\n      var needsResizing = originalHeight !== height || originalWidth !== width;\n      var i, ii;\n\n      if (this.isPassthrough(bpc)) {\n        rgbBuf = comps;\n      } else if (this.numComps === 1 && count > numComponentColors &&\n          this.name !== 'DeviceGray' && this.name !== 'DeviceRGB') {\n        // Optimization: create a color map when there is just one component and\n        // we are converting more colors than the size of the color map. We\n        // don't build the map if the colorspace is gray or rgb since those\n        // methods are faster than building a map. This mainly offers big speed\n        // ups for indexed and alternate colorspaces.\n        //\n        // TODO it may be worth while to cache the color map. While running\n        // testing I never hit a cache so I will leave that out for now (perhaps\n        // we are reparsing colorspaces too much?).\n        var allColors = bpc <= 8 ? new Uint8Array(numComponentColors) :\n                                   new Uint16Array(numComponentColors);\n        var key;\n        for (i = 0; i < numComponentColors; i++) {\n          allColors[i] = i;\n        }\n        var colorMap = new Uint8Array(numComponentColors * 3);\n        this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc,\n                          /* alpha01 = */ 0);\n\n        var destPos, rgbPos;\n        if (!needsResizing) {\n          // Fill in the RGB values directly into |dest|.\n          destPos = 0;\n          for (i = 0; i < count; ++i) {\n            key = comps[i] * 3;\n            dest[destPos++] = colorMap[key];\n            dest[destPos++] = colorMap[key + 1];\n            dest[destPos++] = colorMap[key + 2];\n            destPos += alpha01;\n          }\n        } else {\n          rgbBuf = new Uint8Array(count * 3);\n          rgbPos = 0;\n          for (i = 0; i < count; ++i) {\n            key = comps[i] * 3;\n            rgbBuf[rgbPos++] = colorMap[key];\n            rgbBuf[rgbPos++] = colorMap[key + 1];\n            rgbBuf[rgbPos++] = colorMap[key + 2];\n          }\n        }\n      } else {\n        if (!needsResizing) {\n          // Fill in the RGB values directly into |dest|.\n          this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc,\n                            alpha01);\n        } else {\n          rgbBuf = new Uint8Array(count * 3);\n          this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc,\n                            /* alpha01 = */ 0);\n        }\n      }\n\n      if (rgbBuf) {\n        if (needsResizing) {\n          PDFImage.resize(rgbBuf, bpc, 3, originalWidth, originalHeight, width,\n                          height, dest, alpha01);\n        } else {\n          rgbPos = 0;\n          destPos = 0;\n          for (i = 0, ii = width * actualHeight; i < ii; i++) {\n            dest[destPos++] = rgbBuf[rgbPos++];\n            dest[destPos++] = rgbBuf[rgbPos++];\n            dest[destPos++] = rgbBuf[rgbPos++];\n            destPos += alpha01;\n          }\n        }\n      }\n    },\n    /**\n     * True if the colorspace has components in the default range of [0, 1].\n     * This should be true for all colorspaces except for lab color spaces\n     * which are [0,100], [-128, 127], [-128, 127].\n     */\n    usesZeroToOneRange: true\n  };\n\n  ColorSpace.parse = function ColorSpace_parse(cs, xref, res) {\n    var IR = ColorSpace.parseToIR(cs, xref, res);\n    if (IR instanceof AlternateCS) {\n      return IR;\n    }\n    return ColorSpace.fromIR(IR);\n  };\n\n  ColorSpace.fromIR = function ColorSpace_fromIR(IR) {\n    var name = isArray(IR) ? IR[0] : IR;\n    var whitePoint, blackPoint, gamma;\n\n    switch (name) {\n      case 'DeviceGrayCS':\n        return this.singletons.gray;\n      case 'DeviceRgbCS':\n        return this.singletons.rgb;\n      case 'DeviceCmykCS':\n        return this.singletons.cmyk;\n      case 'CalGrayCS':\n        whitePoint = IR[1].WhitePoint;\n        blackPoint = IR[1].BlackPoint;\n        gamma = IR[1].Gamma;\n        return new CalGrayCS(whitePoint, blackPoint, gamma);\n      case 'CalRGBCS':\n        whitePoint = IR[1].WhitePoint;\n        blackPoint = IR[1].BlackPoint;\n        gamma = IR[1].Gamma;\n        var matrix = IR[1].Matrix;\n        return new CalRGBCS(whitePoint, blackPoint, gamma, matrix);\n      case 'PatternCS':\n        var basePatternCS = IR[1];\n        if (basePatternCS) {\n          basePatternCS = ColorSpace.fromIR(basePatternCS);\n        }\n        return new PatternCS(basePatternCS);\n      case 'IndexedCS':\n        var baseIndexedCS = IR[1];\n        var hiVal = IR[2];\n        var lookup = IR[3];\n        return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup);\n      case 'AlternateCS':\n        var numComps = IR[1];\n        var alt = IR[2];\n        var tintFnIR = IR[3];\n\n        return new AlternateCS(numComps, ColorSpace.fromIR(alt),\n                                PDFFunction.fromIR(tintFnIR));\n      case 'LabCS':\n        whitePoint = IR[1].WhitePoint;\n        blackPoint = IR[1].BlackPoint;\n        var range = IR[1].Range;\n        return new LabCS(whitePoint, blackPoint, range);\n      default:\n        error('Unknown name ' + name);\n    }\n    return null;\n  };\n\n  ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) {\n    if (isName(cs)) {\n      var colorSpaces = res.get('ColorSpace');\n      if (isDict(colorSpaces)) {\n        var refcs = colorSpaces.get(cs.name);\n        if (refcs) {\n          cs = refcs;\n        }\n      }\n    }\n\n    cs = xref.fetchIfRef(cs);\n    var mode;\n\n    if (isName(cs)) {\n      mode = cs.name;\n      this.mode = mode;\n\n      switch (mode) {\n        case 'DeviceGray':\n        case 'G':\n          return 'DeviceGrayCS';\n        case 'DeviceRGB':\n        case 'RGB':\n          return 'DeviceRgbCS';\n        case 'DeviceCMYK':\n        case 'CMYK':\n          return 'DeviceCmykCS';\n        case 'Pattern':\n          return ['PatternCS', null];\n        default:\n          error('unrecognized colorspace ' + mode);\n      }\n    } else if (isArray(cs)) {\n      mode = cs[0].name;\n      this.mode = mode;\n      var numComps, params;\n\n      switch (mode) {\n        case 'DeviceGray':\n        case 'G':\n          return 'DeviceGrayCS';\n        case 'DeviceRGB':\n        case 'RGB':\n          return 'DeviceRgbCS';\n        case 'DeviceCMYK':\n        case 'CMYK':\n          return 'DeviceCmykCS';\n        case 'CalGray':\n          params = xref.fetchIfRef(cs[1]).getAll();\n          return ['CalGrayCS', params];\n        case 'CalRGB':\n          params = xref.fetchIfRef(cs[1]).getAll();\n          return ['CalRGBCS', params];\n        case 'ICCBased':\n          var stream = xref.fetchIfRef(cs[1]);\n          var dict = stream.dict;\n          numComps = dict.get('N');\n          if (numComps === 1) {\n            return 'DeviceGrayCS';\n          } else if (numComps === 3) {\n            return 'DeviceRgbCS';\n          } else if (numComps === 4) {\n            return 'DeviceCmykCS';\n          }\n          break;\n        case 'Pattern':\n          var basePatternCS = cs[1];\n          if (basePatternCS) {\n            basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res);\n          }\n          return ['PatternCS', basePatternCS];\n        case 'Indexed':\n        case 'I':\n          var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res);\n          var hiVal = cs[2] + 1;\n          var lookup = xref.fetchIfRef(cs[3]);\n          if (isStream(lookup)) {\n            lookup = lookup.getBytes();\n          }\n          return ['IndexedCS', baseIndexedCS, hiVal, lookup];\n        case 'Separation':\n        case 'DeviceN':\n          var name = cs[1];\n          numComps = 1;\n          if (isName(name)) {\n            numComps = 1;\n          } else if (isArray(name)) {\n            numComps = name.length;\n          }\n          var alt = ColorSpace.parseToIR(cs[2], xref, res);\n          var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3]));\n          return ['AlternateCS', numComps, alt, tintFnIR];\n        case 'Lab':\n          params = cs[1].getAll();\n          return ['LabCS', params];\n        default:\n          error('unimplemented color space object \"' + mode + '\"');\n      }\n    } else {\n      error('unrecognized color space object: \"' + cs + '\"');\n    }\n    return null;\n  };\n  /**\n   * Checks if a decode map matches the default decode map for a color space.\n   * This handles the general decode maps where there are two values per\n   * component. e.g. [0, 1, 0, 1, 0, 1] for a RGB color.\n   * This does not handle Lab, Indexed, or Pattern decode maps since they are\n   * slightly different.\n   * @param {Array} decode Decode map (usually from an image).\n   * @param {Number} n Number of components the color space has.\n   */\n  ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) {\n    if (!decode) {\n      return true;\n    }\n\n    if (n * 2 !== decode.length) {\n      warn('The decode map is not the correct length');\n      return true;\n    }\n    for (var i = 0, ii = decode.length; i < ii; i += 2) {\n      if (decode[i] !== 0 || decode[i + 1] !== 1) {\n        return false;\n      }\n    }\n    return true;\n  };\n\n  ColorSpace.singletons = {\n    get gray() {\n      return shadow(this, 'gray', new DeviceGrayCS());\n    },\n    get rgb() {\n      return shadow(this, 'rgb', new DeviceRgbCS());\n    },\n    get cmyk() {\n      return shadow(this, 'cmyk', new DeviceCmykCS());\n    }\n  };\n\n  return ColorSpace;\n})();\n\n/**\n * Alternate color space handles both Separation and DeviceN color spaces.  A\n * Separation color space is actually just a DeviceN with one color component.\n * Both color spaces use a tinting function to convert colors to a base color\n * space.\n */\nvar AlternateCS = (function AlternateCSClosure() {\n  function AlternateCS(numComps, base, tintFn) {\n    this.name = 'Alternate';\n    this.numComps = numComps;\n    this.defaultColor = new Float32Array(numComps);\n    for (var i = 0; i < numComps; ++i) {\n      this.defaultColor[i] = 1;\n    }\n    this.base = base;\n    this.tintFn = tintFn;\n    this.tmpBuf = new Float32Array(base.numComps);\n  }\n\n  AlternateCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function AlternateCS_getRgbItem(src, srcOffset,\n                                                dest, destOffset) {\n      var tmpBuf = this.tmpBuf;\n      this.tintFn(src, srcOffset, tmpBuf, 0);\n      this.base.getRgbItem(tmpBuf, 0, dest, destOffset);\n    },\n    getRgbBuffer: function AlternateCS_getRgbBuffer(src, srcOffset, count,\n                                                    dest, destOffset, bits,\n                                                    alpha01) {\n      var tintFn = this.tintFn;\n      var base = this.base;\n      var scale = 1 / ((1 << bits) - 1);\n      var baseNumComps = base.numComps;\n      var usesZeroToOneRange = base.usesZeroToOneRange;\n      var isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) &&\n                          alpha01 === 0;\n      var pos = isPassthrough ? destOffset : 0;\n      var baseBuf = isPassthrough ? dest : new Uint8Array(baseNumComps * count);\n      var numComps = this.numComps;\n\n      var scaled = new Float32Array(numComps);\n      var tinted = new Float32Array(baseNumComps);\n      var i, j;\n      if (usesZeroToOneRange) {\n        for (i = 0; i < count; i++) {\n          for (j = 0; j < numComps; j++) {\n            scaled[j] = src[srcOffset++] * scale;\n          }\n          tintFn(scaled, 0, tinted, 0);\n          for (j = 0; j < baseNumComps; j++) {\n            baseBuf[pos++] = tinted[j] * 255;\n          }\n        }\n      } else {\n        for (i = 0; i < count; i++) {\n          for (j = 0; j < numComps; j++) {\n            scaled[j] = src[srcOffset++] * scale;\n          }\n          tintFn(scaled, 0, tinted, 0);\n          base.getRgbItem(tinted, 0, baseBuf, pos);\n          pos += baseNumComps;\n        }\n      }\n      if (!isPassthrough) {\n        base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01);\n      }\n    },\n    getOutputLength: function AlternateCS_getOutputLength(inputLength,\n                                                          alpha01) {\n      return this.base.getOutputLength(inputLength *\n                                       this.base.numComps / this.numComps,\n                                       alpha01);\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    },\n    usesZeroToOneRange: true\n  };\n\n  return AlternateCS;\n})();\n\nvar PatternCS = (function PatternCSClosure() {\n  function PatternCS(baseCS) {\n    this.name = 'Pattern';\n    this.base = baseCS;\n  }\n  PatternCS.prototype = {};\n\n  return PatternCS;\n})();\n\nvar IndexedCS = (function IndexedCSClosure() {\n  function IndexedCS(base, highVal, lookup) {\n    this.name = 'Indexed';\n    this.numComps = 1;\n    this.defaultColor = new Uint8Array([0]);\n    this.base = base;\n    this.highVal = highVal;\n\n    var baseNumComps = base.numComps;\n    var length = baseNumComps * highVal;\n    var lookupArray;\n\n    if (isStream(lookup)) {\n      lookupArray = new Uint8Array(length);\n      var bytes = lookup.getBytes(length);\n      lookupArray.set(bytes);\n    } else if (isString(lookup)) {\n      lookupArray = new Uint8Array(length);\n      for (var i = 0; i < length; ++i) {\n        lookupArray[i] = lookup.charCodeAt(i);\n      }\n    } else if (lookup instanceof Uint8Array || lookup instanceof Array) {\n      lookupArray = lookup;\n    } else {\n      error('Unrecognized lookup table: ' + lookup);\n    }\n    this.lookup = lookupArray;\n  }\n\n  IndexedCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function IndexedCS_getRgbItem(src, srcOffset,\n                                              dest, destOffset) {\n      var numComps = this.base.numComps;\n      var start = src[srcOffset] * numComps;\n      this.base.getRgbItem(this.lookup, start, dest, destOffset);\n    },\n    getRgbBuffer: function IndexedCS_getRgbBuffer(src, srcOffset, count,\n                                                  dest, destOffset, bits,\n                                                  alpha01) {\n      var base = this.base;\n      var numComps = base.numComps;\n      var outputDelta = base.getOutputLength(numComps, alpha01);\n      var lookup = this.lookup;\n\n      for (var i = 0; i < count; ++i) {\n        var lookupPos = src[srcOffset++] * numComps;\n        base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01);\n        destOffset += outputDelta;\n      }\n    },\n    getOutputLength: function IndexedCS_getOutputLength(inputLength, alpha01) {\n      return this.base.getOutputLength(inputLength * this.base.numComps,\n                                       alpha01);\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) {\n      // indexed color maps shouldn't be changed\n      return true;\n    },\n    usesZeroToOneRange: true\n  };\n  return IndexedCS;\n})();\n\nvar DeviceGrayCS = (function DeviceGrayCSClosure() {\n  function DeviceGrayCS() {\n    this.name = 'DeviceGray';\n    this.numComps = 1;\n    this.defaultColor = new Float32Array([0]);\n  }\n\n  DeviceGrayCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function DeviceGrayCS_getRgbItem(src, srcOffset,\n                                                 dest, destOffset) {\n      var c = (src[srcOffset] * 255) | 0;\n      c = c < 0 ? 0 : c > 255 ? 255 : c;\n      dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c;\n    },\n    getRgbBuffer: function DeviceGrayCS_getRgbBuffer(src, srcOffset, count,\n                                                     dest, destOffset, bits,\n                                                     alpha01) {\n      var scale = 255 / ((1 << bits) - 1);\n      var j = srcOffset, q = destOffset;\n      for (var i = 0; i < count; ++i) {\n        var c = (scale * src[j++]) | 0;\n        dest[q++] = c;\n        dest[q++] = c;\n        dest[q++] = c;\n        q += alpha01;\n      }\n    },\n    getOutputLength: function DeviceGrayCS_getOutputLength(inputLength,\n                                                           alpha01) {\n      return inputLength * (3 + alpha01);\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    },\n    usesZeroToOneRange: true\n  };\n  return DeviceGrayCS;\n})();\n\nvar DeviceRgbCS = (function DeviceRgbCSClosure() {\n  function DeviceRgbCS() {\n    this.name = 'DeviceRGB';\n    this.numComps = 3;\n    this.defaultColor = new Float32Array([0, 0, 0]);\n  }\n  DeviceRgbCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function DeviceRgbCS_getRgbItem(src, srcOffset,\n                                                dest, destOffset) {\n      var r = (src[srcOffset] * 255) | 0;\n      var g = (src[srcOffset + 1] * 255) | 0;\n      var b = (src[srcOffset + 2] * 255) | 0;\n      dest[destOffset] = r < 0 ? 0 : r > 255 ? 255 : r;\n      dest[destOffset + 1] = g < 0 ? 0 : g > 255 ? 255 : g;\n      dest[destOffset + 2] = b < 0 ? 0 : b > 255 ? 255 : b;\n    },\n    getRgbBuffer: function DeviceRgbCS_getRgbBuffer(src, srcOffset, count,\n                                                    dest, destOffset, bits,\n                                                    alpha01) {\n      if (bits === 8 && alpha01 === 0) {\n        dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset);\n        return;\n      }\n      var scale = 255 / ((1 << bits) - 1);\n      var j = srcOffset, q = destOffset;\n      for (var i = 0; i < count; ++i) {\n        dest[q++] = (scale * src[j++]) | 0;\n        dest[q++] = (scale * src[j++]) | 0;\n        dest[q++] = (scale * src[j++]) | 0;\n        q += alpha01;\n      }\n    },\n    getOutputLength: function DeviceRgbCS_getOutputLength(inputLength,\n                                                          alpha01) {\n      return (inputLength * (3 + alpha01) / 3) | 0;\n    },\n    isPassthrough: function DeviceRgbCS_isPassthrough(bits) {\n      return bits === 8;\n    },\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    },\n    usesZeroToOneRange: true\n  };\n  return DeviceRgbCS;\n})();\n\nvar DeviceCmykCS = (function DeviceCmykCSClosure() {\n  // The coefficients below was found using numerical analysis: the method of\n  // steepest descent for the sum((f_i - color_value_i)^2) for r/g/b colors,\n  // where color_value is the tabular value from the table of sampled RGB colors\n  // from CMYK US Web Coated (SWOP) colorspace, and f_i is the corresponding\n  // CMYK color conversion using the estimation below:\n  //   f(A, B,.. N) = Acc+Bcm+Ccy+Dck+c+Fmm+Gmy+Hmk+Im+Jyy+Kyk+Ly+Mkk+Nk+255\n  function convertToRgb(src, srcOffset, srcScale, dest, destOffset) {\n    var c = src[srcOffset + 0] * srcScale;\n    var m = src[srcOffset + 1] * srcScale;\n    var y = src[srcOffset + 2] * srcScale;\n    var k = src[srcOffset + 3] * srcScale;\n\n    var r =\n      (c * (-4.387332384609988 * c + 54.48615194189176 * m +\n            18.82290502165302 * y + 212.25662451639585 * k +\n            -285.2331026137004) +\n       m * (1.7149763477362134 * m - 5.6096736904047315 * y +\n            -17.873870861415444 * k - 5.497006427196366) +\n       y * (-2.5217340131683033 * y - 21.248923337353073 * k +\n            17.5119270841813) +\n       k * (-21.86122147463605 * k - 189.48180835922747) + 255) | 0;\n    var g =\n      (c * (8.841041422036149 * c + 60.118027045597366 * m +\n            6.871425592049007 * y + 31.159100130055922 * k +\n            -79.2970844816548) +\n       m * (-15.310361306967817 * m + 17.575251261109482 * y +\n            131.35250912493976 * k - 190.9453302588951) +\n       y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) +\n       k * (-20.737325471181034 * k - 187.80453709719578) + 255) | 0;\n    var b =\n      (c * (0.8842522430003296 * c + 8.078677503112928 * m +\n            30.89978309703729 * y - 0.23883238689178934 * k +\n            -14.183576799673286) +\n       m * (10.49593273432072 * m + 63.02378494754052 * y +\n            50.606957656360734 * k - 112.23884253719248) +\n       y * (0.03296041114873217 * y + 115.60384449646641 * k +\n            -193.58209356861505) +\n       k * (-22.33816807309886 * k - 180.12613974708367) + 255) | 0;\n\n    dest[destOffset] = r > 255 ? 255 : r < 0 ? 0 : r;\n    dest[destOffset + 1] = g > 255 ? 255 : g < 0 ? 0 : g;\n    dest[destOffset + 2] = b > 255 ? 255 : b < 0 ? 0 : b;\n  }\n\n  function DeviceCmykCS() {\n    this.name = 'DeviceCMYK';\n    this.numComps = 4;\n    this.defaultColor = new Float32Array([0, 0, 0, 1]);\n  }\n  DeviceCmykCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function DeviceCmykCS_getRgbItem(src, srcOffset,\n                                                 dest, destOffset) {\n      convertToRgb(src, srcOffset, 1, dest, destOffset);\n    },\n    getRgbBuffer: function DeviceCmykCS_getRgbBuffer(src, srcOffset, count,\n                                                     dest, destOffset, bits,\n                                                     alpha01) {\n      var scale = 1 / ((1 << bits) - 1);\n      for (var i = 0; i < count; i++) {\n        convertToRgb(src, srcOffset, scale, dest, destOffset);\n        srcOffset += 4;\n        destOffset += 3 + alpha01;\n      }\n    },\n    getOutputLength: function DeviceCmykCS_getOutputLength(inputLength,\n                                                           alpha01) {\n      return (inputLength / 4 * (3 + alpha01)) | 0;\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    },\n    usesZeroToOneRange: true\n  };\n\n  return DeviceCmykCS;\n})();\n\n//\n// CalGrayCS: Based on \"PDF Reference, Sixth Ed\", p.245\n//\nvar CalGrayCS = (function CalGrayCSClosure() {\n  function CalGrayCS(whitePoint, blackPoint, gamma) {\n    this.name = 'CalGray';\n    this.numComps = 1;\n    this.defaultColor = new Float32Array([0]);\n\n    if (!whitePoint) {\n      error('WhitePoint missing - required for color space CalGray');\n    }\n    blackPoint = blackPoint || [0, 0, 0];\n    gamma = gamma || 1;\n\n    // Translate arguments to spec variables.\n    this.XW = whitePoint[0];\n    this.YW = whitePoint[1];\n    this.ZW = whitePoint[2];\n\n    this.XB = blackPoint[0];\n    this.YB = blackPoint[1];\n    this.ZB = blackPoint[2];\n\n    this.G = gamma;\n\n    // Validate variables as per spec.\n    if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {\n      error('Invalid WhitePoint components for ' + this.name +\n            ', no fallback available');\n    }\n\n    if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {\n      info('Invalid BlackPoint for ' + this.name + ', falling back to default');\n      this.XB = this.YB = this.ZB = 0;\n    }\n\n    if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) {\n      warn(this.name + ', BlackPoint: XB: ' + this.XB + ', YB: ' + this.YB +\n           ', ZB: ' + this.ZB + ', only default values are supported.');\n    }\n\n    if (this.G < 1) {\n      info('Invalid Gamma: ' + this.G + ' for ' + this.name +\n           ', falling back to default');\n      this.G = 1;\n    }\n  }\n\n  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {\n    // A represents a gray component of a calibrated gray space.\n    // A <---> AG in the spec\n    var A = src[srcOffset] * scale;\n    var AG = Math.pow(A, cs.G);\n\n    // Computes L as per spec. ( = cs.YW * AG )\n    // Except if other than default BlackPoint values are used.\n    var L = cs.YW * AG;\n    // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html, Ch 4.\n    // Convert values to rgb range [0, 255].\n    var val = Math.max(295.8 * Math.pow(L, 0.333333333333333333) - 40.8, 0) | 0;\n    dest[destOffset] = val;\n    dest[destOffset + 1] = val;\n    dest[destOffset + 2] = val;\n  }\n\n  CalGrayCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function CalGrayCS_getRgbItem(src, srcOffset,\n                                              dest, destOffset) {\n      convertToRgb(this, src, srcOffset, dest, destOffset, 1);\n    },\n    getRgbBuffer: function CalGrayCS_getRgbBuffer(src, srcOffset, count,\n                                                  dest, destOffset, bits,\n                                                  alpha01) {\n      var scale = 1 / ((1 << bits) - 1);\n\n      for (var i = 0; i < count; ++i) {\n        convertToRgb(this, src, srcOffset, dest, destOffset, scale);\n        srcOffset += 1;\n        destOffset += 3 + alpha01;\n      }\n    },\n    getOutputLength: function CalGrayCS_getOutputLength(inputLength, alpha01) {\n      return inputLength * (3 + alpha01);\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function CalGrayCS_isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    },\n    usesZeroToOneRange: true\n  };\n  return CalGrayCS;\n})();\n\n//\n// CalRGBCS: Based on \"PDF Reference, Sixth Ed\", p.247\n//\nvar CalRGBCS = (function CalRGBCSClosure() {\n\n  // See http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html for these\n  // matrices.\n  var BRADFORD_SCALE_MATRIX = new Float32Array([\n    0.8951, 0.2664, -0.1614,\n    -0.7502, 1.7135, 0.0367,\n    0.0389, -0.0685, 1.0296]);\n\n  var BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([\n    0.9869929, -0.1470543, 0.1599627,\n    0.4323053, 0.5183603, 0.0492912,\n    -0.0085287, 0.0400428, 0.9684867]);\n\n  // See http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html.\n  var SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([\n    3.2404542, -1.5371385, -0.4985314,\n    -0.9692660, 1.8760108, 0.0415560,\n    0.0556434, -0.2040259, 1.0572252]);\n\n  var FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]);\n\n  var tempNormalizeMatrix = new Float32Array(3);\n  var tempConvertMatrix1 = new Float32Array(3);\n  var tempConvertMatrix2 = new Float32Array(3);\n\n  var DECODE_L_CONSTANT = Math.pow(((8 + 16) / 116), 3) / 8.0;\n\n  function CalRGBCS(whitePoint, blackPoint, gamma, matrix) {\n    this.name = 'CalRGB';\n    this.numComps = 3;\n    this.defaultColor = new Float32Array(3);\n\n    if (!whitePoint) {\n      error('WhitePoint missing - required for color space CalRGB');\n    }\n    blackPoint = blackPoint || new Float32Array(3);\n    gamma = gamma || new Float32Array([1, 1, 1]);\n    matrix = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);\n\n    // Translate arguments to spec variables.\n    var XW = whitePoint[0];\n    var YW = whitePoint[1];\n    var ZW = whitePoint[2];\n    this.whitePoint = whitePoint;\n\n    var XB = blackPoint[0];\n    var YB = blackPoint[1];\n    var ZB = blackPoint[2];\n    this.blackPoint = blackPoint;\n\n    this.GR = gamma[0];\n    this.GG = gamma[1];\n    this.GB = gamma[2];\n\n    this.MXA = matrix[0];\n    this.MYA = matrix[1];\n    this.MZA = matrix[2];\n    this.MXB = matrix[3];\n    this.MYB = matrix[4];\n    this.MZB = matrix[5];\n    this.MXC = matrix[6];\n    this.MYC = matrix[7];\n    this.MZC = matrix[8];\n\n    // Validate variables as per spec.\n    if (XW < 0 || ZW < 0 || YW !== 1) {\n      error('Invalid WhitePoint components for ' + this.name +\n            ', no fallback available');\n    }\n\n    if (XB < 0 || YB < 0 || ZB < 0) {\n      info('Invalid BlackPoint for ' + this.name + ' [' + XB + ', ' + YB +\n           ', ' + ZB + '], falling back to default');\n      this.blackPoint = new Float32Array(3);\n    }\n\n    if (this.GR < 0 || this.GG < 0 || this.GB < 0) {\n      info('Invalid Gamma [' + this.GR + ', ' + this.GG + ', ' + this.GB +\n           '] for ' + this.name + ', falling back to default');\n      this.GR = this.GG = this.GB = 1;\n    }\n\n    if (this.MXA < 0 || this.MYA < 0 || this.MZA < 0 ||\n        this.MXB < 0 || this.MYB < 0 || this.MZB < 0 ||\n        this.MXC < 0 || this.MYC < 0 || this.MZC < 0) {\n      info('Invalid Matrix for ' + this.name + ' [' +\n           this.MXA + ', ' + this.MYA + ', ' + this.MZA +\n           this.MXB + ', ' + this.MYB + ', ' + this.MZB +\n           this.MXC + ', ' + this.MYC + ', ' + this.MZC +\n           '], falling back to default');\n      this.MXA = this.MYB = this.MZC = 1;\n      this.MXB = this.MYA = this.MZA = this.MXC = this.MYC = this.MZB = 0;\n    }\n  }\n\n  function matrixProduct(a, b, result) {\n      result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n      result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2];\n      result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2];\n  }\n\n  function convertToFlat(sourceWhitePoint, LMS, result) {\n      result[0] = LMS[0] * 1 / sourceWhitePoint[0];\n      result[1] = LMS[1] * 1 / sourceWhitePoint[1];\n      result[2] = LMS[2] * 1 / sourceWhitePoint[2];\n  }\n\n  function convertToD65(sourceWhitePoint, LMS, result) {\n    var D65X = 0.95047;\n    var D65Y = 1;\n    var D65Z = 1.08883;\n\n    result[0] = LMS[0] * D65X / sourceWhitePoint[0];\n    result[1] = LMS[1] * D65Y / sourceWhitePoint[1];\n    result[2] = LMS[2] * D65Z / sourceWhitePoint[2];\n  }\n\n  function sRGBTransferFunction(color) {\n    // See http://en.wikipedia.org/wiki/SRGB.\n    if (color <= 0.0031308){\n      return adjustToRange(0, 1, 12.92 * color);\n    }\n\n    return adjustToRange(0, 1, (1 + 0.055) * Math.pow(color, 1 / 2.4) - 0.055);\n  }\n\n  function adjustToRange(min, max, value) {\n    return Math.max(min, Math.min(max, value));\n  }\n\n  function decodeL(L) {\n    if (L < 0) {\n      return -decodeL(-L);\n    }\n\n    if (L > 8.0) {\n      return Math.pow(((L + 16) / 116), 3);\n    }\n\n    return L * DECODE_L_CONSTANT;\n  }\n\n  function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) {\n\n    // In case the blackPoint is already the default blackPoint then there is\n    // no need to do compensation.\n    if (sourceBlackPoint[0] === 0 &&\n        sourceBlackPoint[1] === 0 &&\n        sourceBlackPoint[2] === 0) {\n      result[0] = XYZ_Flat[0];\n      result[1] = XYZ_Flat[1];\n      result[2] = XYZ_Flat[2];\n      return;\n    }\n\n    // For the blackPoint calculation details, please see\n    // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/\n    // AdobeBPC.pdf.\n    // The destination blackPoint is the default blackPoint [0, 0, 0].\n    var zeroDecodeL = decodeL(0);\n\n    var X_DST = zeroDecodeL;\n    var X_SRC = decodeL(sourceBlackPoint[0]);\n\n    var Y_DST = zeroDecodeL;\n    var Y_SRC = decodeL(sourceBlackPoint[1]);\n\n    var Z_DST = zeroDecodeL;\n    var Z_SRC = decodeL(sourceBlackPoint[2]);\n\n    var X_Scale = (1 - X_DST) / (1 - X_SRC);\n    var X_Offset = 1 - X_Scale;\n\n    var Y_Scale = (1 - Y_DST) / (1 - Y_SRC);\n    var Y_Offset = 1 - Y_Scale;\n\n    var Z_Scale = (1 - Z_DST) / (1 - Z_SRC);\n    var Z_Offset = 1 - Z_Scale;\n\n    result[0] = XYZ_Flat[0] * X_Scale + X_Offset;\n    result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset;\n    result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset;\n  }\n\n  function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) {\n\n    // In case the whitePoint is already flat then there is no need to do\n    // normalization.\n    if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) {\n      result[0] = XYZ_In[0];\n      result[1] = XYZ_In[1];\n      result[2] = XYZ_In[2];\n      return;\n    }\n\n    var LMS = result;\n    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);\n\n    var LMS_Flat = tempNormalizeMatrix;\n    convertToFlat(sourceWhitePoint, LMS, LMS_Flat);\n\n    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result);\n  }\n\n  function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) {\n\n    var LMS = result;\n    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);\n\n    var LMS_D65 = tempNormalizeMatrix;\n    convertToD65(sourceWhitePoint, LMS, LMS_D65);\n\n    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result);\n  }\n\n  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {\n    // A, B and C represent a red, green and blue components of a calibrated\n    // rgb space.\n    var A = adjustToRange(0, 1, src[srcOffset] * scale);\n    var B = adjustToRange(0, 1, src[srcOffset + 1] * scale);\n    var C = adjustToRange(0, 1, src[srcOffset + 2] * scale);\n\n    // A <---> AGR in the spec\n    // B <---> BGG in the spec\n    // C <---> CGB in the spec\n    var AGR = Math.pow(A, cs.GR);\n    var BGG = Math.pow(B, cs.GG);\n    var CGB = Math.pow(C, cs.GB);\n\n    // Computes intermediate variables L, M, N as per spec.\n    // To decode X, Y, Z values map L, M, N directly to them.\n    var X = cs.MXA * AGR + cs.MXB * BGG + cs.MXC * CGB;\n    var Y = cs.MYA * AGR + cs.MYB * BGG + cs.MYC * CGB;\n    var Z = cs.MZA * AGR + cs.MZB * BGG + cs.MZC * CGB;\n\n    // The following calculations are based on this document:\n    // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/\n    // AdobeBPC.pdf.\n    var XYZ = tempConvertMatrix1;\n    XYZ[0] = X;\n    XYZ[1] = Y;\n    XYZ[2] = Z;\n    var XYZ_Flat = tempConvertMatrix2;\n\n    normalizeWhitePointToFlat(cs.whitePoint, XYZ, XYZ_Flat);\n\n    var XYZ_Black = tempConvertMatrix1;\n    compensateBlackPoint(cs.blackPoint, XYZ_Flat, XYZ_Black);\n\n    var XYZ_D65 = tempConvertMatrix2;\n    normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65);\n\n    var SRGB = tempConvertMatrix1;\n    matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB);\n\n    var sR = sRGBTransferFunction(SRGB[0]);\n    var sG = sRGBTransferFunction(SRGB[1]);\n    var sB = sRGBTransferFunction(SRGB[2]);\n\n    // Convert the values to rgb range [0, 255].\n    dest[destOffset] = Math.round(sR * 255);\n    dest[destOffset + 1] = Math.round(sG * 255);\n    dest[destOffset + 2] = Math.round(sB * 255);\n  }\n\n  CalRGBCS.prototype = {\n    getRgb: function CalRGBCS_getRgb(src, srcOffset) {\n      var rgb = new Uint8Array(3);\n      this.getRgbItem(src, srcOffset, rgb, 0);\n      return rgb;\n    },\n    getRgbItem: function CalRGBCS_getRgbItem(src, srcOffset,\n                                             dest, destOffset) {\n      convertToRgb(this, src, srcOffset, dest, destOffset, 1);\n    },\n    getRgbBuffer: function CalRGBCS_getRgbBuffer(src, srcOffset, count,\n                                                 dest, destOffset, bits,\n                                                 alpha01) {\n      var scale = 1 / ((1 << bits) - 1);\n\n      for (var i = 0; i < count; ++i) {\n        convertToRgb(this, src, srcOffset, dest, destOffset, scale);\n        srcOffset += 3;\n        destOffset += 3 + alpha01;\n      }\n    },\n    getOutputLength: function CalRGBCS_getOutputLength(inputLength, alpha01) {\n      return (inputLength * (3 + alpha01) / 3) | 0;\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function CalRGBCS_isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    },\n    usesZeroToOneRange: true\n  };\n  return CalRGBCS;\n})();\n\n//\n// LabCS: Based on \"PDF Reference, Sixth Ed\", p.250\n//\nvar LabCS = (function LabCSClosure() {\n  function LabCS(whitePoint, blackPoint, range) {\n    this.name = 'Lab';\n    this.numComps = 3;\n    this.defaultColor = new Float32Array([0, 0, 0]);\n\n    if (!whitePoint) {\n      error('WhitePoint missing - required for color space Lab');\n    }\n    blackPoint = blackPoint || [0, 0, 0];\n    range = range || [-100, 100, -100, 100];\n\n    // Translate args to spec variables\n    this.XW = whitePoint[0];\n    this.YW = whitePoint[1];\n    this.ZW = whitePoint[2];\n    this.amin = range[0];\n    this.amax = range[1];\n    this.bmin = range[2];\n    this.bmax = range[3];\n\n    // These are here just for completeness - the spec doesn't offer any\n    // formulas that use BlackPoint in Lab\n    this.XB = blackPoint[0];\n    this.YB = blackPoint[1];\n    this.ZB = blackPoint[2];\n\n    // Validate vars as per spec\n    if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {\n      error('Invalid WhitePoint components, no fallback available');\n    }\n\n    if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {\n      info('Invalid BlackPoint, falling back to default');\n      this.XB = this.YB = this.ZB = 0;\n    }\n\n    if (this.amin > this.amax || this.bmin > this.bmax) {\n      info('Invalid Range, falling back to defaults');\n      this.amin = -100;\n      this.amax = 100;\n      this.bmin = -100;\n      this.bmax = 100;\n    }\n  }\n\n  // Function g(x) from spec\n  function fn_g(x) {\n    if (x >= 6 / 29) {\n      return x * x * x;\n    } else {\n      return (108 / 841) * (x - 4 / 29);\n    }\n  }\n\n  function decode(value, high1, low2, high2) {\n    return low2 + (value) * (high2 - low2) / (high1);\n  }\n\n  // If decoding is needed maxVal should be 2^bits per component - 1.\n  function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) {\n    // XXX: Lab input is in the range of [0, 100], [amin, amax], [bmin, bmax]\n    // not the usual [0, 1]. If a command like setFillColor is used the src\n    // values will already be within the correct range. However, if we are\n    // converting an image we have to map the values to the correct range given\n    // above.\n    // Ls,as,bs <---> L*,a*,b* in the spec\n    var Ls = src[srcOffset];\n    var as = src[srcOffset + 1];\n    var bs = src[srcOffset + 2];\n    if (maxVal !== false) {\n      Ls = decode(Ls, maxVal, 0, 100);\n      as = decode(as, maxVal, cs.amin, cs.amax);\n      bs = decode(bs, maxVal, cs.bmin, cs.bmax);\n    }\n\n    // Adjust limits of 'as' and 'bs'\n    as = as > cs.amax ? cs.amax : as < cs.amin ? cs.amin : as;\n    bs = bs > cs.bmax ? cs.bmax : bs < cs.bmin ? cs.bmin : bs;\n\n    // Computes intermediate variables X,Y,Z as per spec\n    var M = (Ls + 16) / 116;\n    var L = M + (as / 500);\n    var N = M - (bs / 200);\n\n    var X = cs.XW * fn_g(L);\n    var Y = cs.YW * fn_g(M);\n    var Z = cs.ZW * fn_g(N);\n\n    var r, g, b;\n    // Using different conversions for D50 and D65 white points,\n    // per http://www.color.org/srgb.pdf\n    if (cs.ZW < 1) {\n      // Assuming D50 (X=0.9642, Y=1.00, Z=0.8249)\n      r = X * 3.1339 + Y * -1.6170 + Z * -0.4906;\n      g = X * -0.9785 + Y * 1.9160 + Z * 0.0333;\n      b = X * 0.0720 + Y * -0.2290 + Z * 1.4057;\n    } else {\n      // Assuming D65 (X=0.9505, Y=1.00, Z=1.0888)\n      r = X * 3.2406 + Y * -1.5372 + Z * -0.4986;\n      g = X * -0.9689 + Y * 1.8758 + Z * 0.0415;\n      b = X * 0.0557 + Y * -0.2040 + Z * 1.0570;\n    }\n    // clamp color values to [0,1] range then convert to [0,255] range.\n    dest[destOffset] = r <= 0 ? 0 : r >= 1 ? 255 : Math.sqrt(r) * 255 | 0;\n    dest[destOffset + 1] = g <= 0 ? 0 : g >= 1 ? 255 : Math.sqrt(g) * 255 | 0;\n    dest[destOffset + 2] = b <= 0 ? 0 : b >= 1 ? 255 : Math.sqrt(b) * 255 | 0;\n  }\n\n  LabCS.prototype = {\n    getRgb: ColorSpace.prototype.getRgb,\n    getRgbItem: function LabCS_getRgbItem(src, srcOffset, dest, destOffset) {\n      convertToRgb(this, src, srcOffset, false, dest, destOffset);\n    },\n    getRgbBuffer: function LabCS_getRgbBuffer(src, srcOffset, count,\n                                              dest, destOffset, bits,\n                                              alpha01) {\n      var maxVal = (1 << bits) - 1;\n      for (var i = 0; i < count; i++) {\n        convertToRgb(this, src, srcOffset, maxVal, dest, destOffset);\n        srcOffset += 3;\n        destOffset += 3 + alpha01;\n      }\n    },\n    getOutputLength: function LabCS_getOutputLength(inputLength, alpha01) {\n      return (inputLength * (3 + alpha01) / 3) | 0;\n    },\n    isPassthrough: ColorSpace.prototype.isPassthrough,\n    fillRgb: ColorSpace.prototype.fillRgb,\n    isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) {\n      // XXX: Decoding is handled with the lab conversion because of the strange\n      // ranges that are used.\n      return true;\n    },\n    usesZeroToOneRange: false\n  };\n  return LabCS;\n})();\n\n\nvar ARCFourCipher = (function ARCFourCipherClosure() {\n  function ARCFourCipher(key) {\n    this.a = 0;\n    this.b = 0;\n    var s = new Uint8Array(256);\n    var i, j = 0, tmp, keyLength = key.length;\n    for (i = 0; i < 256; ++i) {\n      s[i] = i;\n    }\n    for (i = 0; i < 256; ++i) {\n      tmp = s[i];\n      j = (j + tmp + key[i % keyLength]) & 0xFF;\n      s[i] = s[j];\n      s[j] = tmp;\n    }\n    this.s = s;\n  }\n\n  ARCFourCipher.prototype = {\n    encryptBlock: function ARCFourCipher_encryptBlock(data) {\n      var i, n = data.length, tmp, tmp2;\n      var a = this.a, b = this.b, s = this.s;\n      var output = new Uint8Array(n);\n      for (i = 0; i < n; ++i) {\n        a = (a + 1) & 0xFF;\n        tmp = s[a];\n        b = (b + tmp) & 0xFF;\n        tmp2 = s[b];\n        s[a] = tmp2;\n        s[b] = tmp;\n        output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF];\n      }\n      this.a = a;\n      this.b = b;\n      return output;\n    }\n  };\n  ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock;\n\n  return ARCFourCipher;\n})();\n\nvar calculateMD5 = (function calculateMD5Closure() {\n  var r = new Uint8Array([\n    7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,\n    5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,\n    4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,\n    6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);\n\n  var k = new Int32Array([\n    -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426,\n    -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162,\n    1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632,\n    643717713, -373897302, -701558691, 38016083, -660478335, -405537848,\n    568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784,\n    1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556,\n    -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222,\n    -722521979, 76029189, -640364487, -421815835, 530742520, -995338651,\n    -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606,\n    -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649,\n    -145523070, -1120210379, 718787259, -343485551]);\n\n  function hash(data, offset, length) {\n    var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878;\n    // pre-processing\n    var paddedLength = (length + 72) & ~63; // data + 9 extra bytes\n    var padded = new Uint8Array(paddedLength);\n    var i, j, n;\n    for (i = 0; i < length; ++i) {\n      padded[i] = data[offset++];\n    }\n    padded[i++] = 0x80;\n    n = paddedLength - 8;\n    while (i < n) {\n      padded[i++] = 0;\n    }\n    padded[i++] = (length << 3) & 0xFF;\n    padded[i++] = (length >> 5) & 0xFF;\n    padded[i++] = (length >> 13) & 0xFF;\n    padded[i++] = (length >> 21) & 0xFF;\n    padded[i++] = (length >>> 29) & 0xFF;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    var w = new Int32Array(16);\n    for (i = 0; i < paddedLength;) {\n      for (j = 0; j < 16; ++j, i += 4) {\n        w[j] = (padded[i] | (padded[i + 1] << 8) |\n               (padded[i + 2] << 16) | (padded[i + 3] << 24));\n      }\n      var a = h0, b = h1, c = h2, d = h3, f, g;\n      for (j = 0; j < 64; ++j) {\n        if (j < 16) {\n          f = (b & c) | ((~b) & d);\n          g = j;\n        } else if (j < 32) {\n          f = (d & b) | ((~d) & c);\n          g = (5 * j + 1) & 15;\n        } else if (j < 48) {\n          f = b ^ c ^ d;\n          g = (3 * j + 5) & 15;\n        } else {\n          f = c ^ (b | (~d));\n          g = (7 * j) & 15;\n        }\n        var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j];\n        d = c;\n        c = b;\n        b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0;\n        a = tmp;\n      }\n      h0 = (h0 + a) | 0;\n      h1 = (h1 + b) | 0;\n      h2 = (h2 + c) | 0;\n      h3 = (h3 + d) | 0;\n    }\n    return new Uint8Array([\n      h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF,\n      h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF,\n      h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF,\n      h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF\n    ]);\n  }\n\n  return hash;\n})();\nvar Word64 = (function Word64Closure() {\n  function Word64(highInteger, lowInteger) {\n    this.high = highInteger | 0;\n    this.low = lowInteger | 0;\n  }\n  Word64.prototype = {\n    and: function Word64_and(word) {\n      this.high &= word.high;\n      this.low &= word.low;\n    },\n    xor: function Word64_xor(word) {\n     this.high ^= word.high;\n     this.low ^= word.low;\n    },\n\n    or: function Word64_or(word) {\n      this.high |= word.high;\n      this.low |= word.low;\n    },\n\n    shiftRight: function Word64_shiftRight(places) {\n      if (places >= 32) {\n        this.low = (this.high >>> (places - 32)) | 0;\n        this.high = 0;\n      } else {\n        this.low = (this.low >>> places) | (this.high << (32 - places));\n        this.high = (this.high >>> places) | 0;\n      }\n    },\n\n    shiftLeft: function Word64_shiftLeft(places) {\n      if (places >= 32) {\n        this.high = this.low << (places - 32);\n        this.low = 0;\n      } else {\n        this.high = (this.high << places) | (this.low >>> (32 - places));\n        this.low = this.low << places;\n      }\n    },\n\n    rotateRight: function Word64_rotateRight(places) {\n      var low, high;\n      if (places & 32) {\n        high = this.low;\n        low = this.high;\n      } else {\n        low = this.low;\n        high = this.high;\n      }\n      places &= 31;\n      this.low = (low >>> places) | (high << (32 - places));\n      this.high = (high >>> places) | (low << (32 - places));\n    },\n\n    not: function Word64_not() {\n      this.high = ~this.high;\n      this.low = ~this.low;\n    },\n\n    add: function Word64_add(word) {\n      var lowAdd = (this.low >>> 0) + (word.low >>> 0);\n      var highAdd = (this.high >>> 0) + (word.high >>> 0);\n      if (lowAdd > 0xFFFFFFFF) {\n        highAdd += 1;\n      }\n      this.low = lowAdd | 0;\n      this.high = highAdd | 0;\n    },\n\n    copyTo: function Word64_copyTo(bytes, offset) {\n      bytes[offset] = (this.high >>> 24) & 0xFF;\n      bytes[offset + 1] = (this.high >> 16) & 0xFF;\n      bytes[offset + 2] = (this.high >> 8) & 0xFF;\n      bytes[offset + 3] = this.high & 0xFF;\n      bytes[offset + 4] = (this.low >>> 24) & 0xFF;\n      bytes[offset + 5] = (this.low >> 16) & 0xFF;\n      bytes[offset + 6] = (this.low >> 8) & 0xFF;\n      bytes[offset + 7] = this.low & 0xFF;\n    },\n\n    assign: function Word64_assign(word) {\n      this.high = word.high;\n      this.low = word.low;\n    }\n  };\n  return Word64;\n})();\n\nvar calculateSHA256 = (function calculateSHA256Closure() {\n  function rotr(x, n) {\n    return (x >>> n) | (x << 32 - n);\n  }\n\n  function ch(x, y, z) {\n    return (x & y) ^ (~x & z);\n  }\n\n  function maj(x, y, z) {\n    return (x & y) ^ (x & z) ^ (y & z);\n  }\n\n  function sigma(x) {\n    return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);\n  }\n\n  function sigmaPrime(x) {\n    return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);\n  }\n\n  function littleSigma(x) {\n    return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3;\n  }\n\n  function littleSigmaPrime(x) {\n    return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10;\n  }\n\n  var k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\n           0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n           0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n           0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n           0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n           0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n           0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\n           0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n           0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n           0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n           0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\n           0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n           0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\n           0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n           0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n           0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];\n\n  function hash(data, offset, length) {\n    // initial hash values\n    var h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372,\n        h3 = 0xa54ff53a, h4 = 0x510e527f, h5 = 0x9b05688c,\n        h6 = 0x1f83d9ab, h7 = 0x5be0cd19;\n    // pre-processing\n    var paddedLength = Math.ceil((length + 9) / 64) * 64;\n    var padded = new Uint8Array(paddedLength);\n    var i, j, n;\n    for (i = 0; i < length; ++i) {\n      padded[i] = data[offset++];\n    }\n    padded[i++] = 0x80;\n    n = paddedLength - 8;\n    while (i < n) {\n      padded[i++] = 0;\n    }\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = (length >>> 29) & 0xFF;\n    padded[i++] = (length >> 21) & 0xFF;\n    padded[i++] = (length >> 13) & 0xFF;\n    padded[i++] = (length >> 5) & 0xFF;\n    padded[i++] = (length << 3) & 0xFF;\n    var w = new Uint32Array(64);\n    // for each 512 bit block\n    for (i = 0; i < paddedLength;) {\n      for (j = 0; j < 16; ++j) {\n        w[j] = (padded[i] << 24 | (padded[i + 1] << 16) |\n               (padded[i + 2] << 8) | (padded[i + 3]));\n        i += 4;\n      }\n\n      for (j = 16; j < 64; ++j) {\n        w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] +\n               littleSigma(w[j - 15]) + w[j - 16] | 0;\n      }\n      var a = h0, b = h1, c = h2, d = h3, e = h4,\n          f = h5, g = h6, h = h7, t1, t2;\n      for (j = 0; j < 64; ++j) {\n        t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j];\n        t2 = sigma(a) + maj(a, b, c);\n        h = g;\n        g = f;\n        f = e;\n        e = (d + t1) | 0;\n        d = c;\n        c = b;\n        b = a;\n        a = (t1 + t2) | 0;\n      }\n      h0 = (h0 + a) | 0;\n      h1 = (h1 + b) | 0;\n      h2 = (h2 + c) | 0;\n      h3 = (h3 + d) | 0;\n      h4 = (h4 + e) | 0;\n      h5 = (h5 + f) | 0;\n      h6 = (h6 + g) | 0;\n      h7 = (h7 + h) | 0;\n    }\n    return new Uint8Array([\n      (h0 >> 24) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 8) & 0xFF, (h0) & 0xFF,\n      (h1 >> 24) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 8) & 0xFF, (h1) & 0xFF,\n      (h2 >> 24) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 8) & 0xFF, (h2) & 0xFF,\n      (h3 >> 24) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 8) & 0xFF, (h3) & 0xFF,\n      (h4 >> 24) & 0xFF, (h4 >> 16) & 0xFF, (h4 >> 8) & 0xFF, (h4) & 0xFF,\n      (h5 >> 24) & 0xFF, (h5 >> 16) & 0xFF, (h5 >> 8) & 0xFF, (h5) & 0xFF,\n      (h6 >> 24) & 0xFF, (h6 >> 16) & 0xFF, (h6 >> 8) & 0xFF, (h6) & 0xFF,\n      (h7 >> 24) & 0xFF, (h7 >> 16) & 0xFF, (h7 >> 8) & 0xFF, (h7) & 0xFF\n    ]);\n  }\n\n  return hash;\n})();\n\nvar calculateSHA512 = (function calculateSHA512Closure() {\n  function ch(result, x, y, z, tmp) {\n    result.assign(x);\n    result.and(y);\n    tmp.assign(x);\n    tmp.not();\n    tmp.and(z);\n    result.xor(tmp);\n  }\n\n  function maj(result, x, y, z, tmp) {\n    result.assign(x);\n    result.and(y);\n    tmp.assign(x);\n    tmp.and(z);\n    result.xor(tmp);\n    tmp.assign(y);\n    tmp.and(z);\n    result.xor(tmp);\n  }\n\n  function sigma(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(28);\n    tmp.assign(x);\n    tmp.rotateRight(34);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.rotateRight(39);\n    result.xor(tmp);\n  }\n\n  function sigmaPrime(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(14);\n    tmp.assign(x);\n    tmp.rotateRight(18);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.rotateRight(41);\n    result.xor(tmp);\n  }\n\n  function littleSigma(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(1);\n    tmp.assign(x);\n    tmp.rotateRight(8);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.shiftRight(7);\n    result.xor(tmp);\n  }\n\n  function littleSigmaPrime(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(19);\n    tmp.assign(x);\n    tmp.rotateRight(61);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.shiftRight(6);\n    result.xor(tmp);\n  }\n\n  var k = [\n    new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd),\n    new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc),\n    new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019),\n    new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118),\n    new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe),\n    new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2),\n    new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1),\n    new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694),\n    new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3),\n    new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65),\n    new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483),\n    new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5),\n    new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210),\n    new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4),\n    new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725),\n    new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70),\n    new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926),\n    new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df),\n    new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8),\n    new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b),\n    new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001),\n    new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30),\n    new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910),\n    new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8),\n    new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53),\n    new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8),\n    new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb),\n    new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3),\n    new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60),\n    new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec),\n    new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9),\n    new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b),\n    new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207),\n    new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178),\n    new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6),\n    new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b),\n    new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493),\n    new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c),\n    new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a),\n    new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)];\n\n  function hash(data, offset, length, mode384) {\n    mode384 = !!mode384;\n    // initial hash values\n    var h0, h1, h2, h3, h4, h5, h6, h7;\n    if (!mode384) {\n      h0 = new Word64(0x6a09e667, 0xf3bcc908);\n      h1 = new Word64(0xbb67ae85, 0x84caa73b);\n      h2 = new Word64(0x3c6ef372, 0xfe94f82b);\n      h3 = new Word64(0xa54ff53a, 0x5f1d36f1);\n      h4 = new Word64(0x510e527f, 0xade682d1);\n      h5 = new Word64(0x9b05688c, 0x2b3e6c1f);\n      h6 = new Word64(0x1f83d9ab, 0xfb41bd6b);\n      h7 = new Word64(0x5be0cd19, 0x137e2179);\n    }\n    else {\n      // SHA384 is exactly the same\n      // except with different starting values and a trimmed result\n      h0 = new Word64(0xcbbb9d5d, 0xc1059ed8);\n      h1 = new Word64(0x629a292a, 0x367cd507);\n      h2 = new Word64(0x9159015a, 0x3070dd17);\n      h3 = new Word64(0x152fecd8, 0xf70e5939);\n      h4 = new Word64(0x67332667, 0xffc00b31);\n      h5 = new Word64(0x8eb44a87, 0x68581511);\n      h6 = new Word64(0xdb0c2e0d, 0x64f98fa7);\n      h7 = new Word64(0x47b5481d, 0xbefa4fa4);\n    }\n\n    // pre-processing\n    var paddedLength = Math.ceil((length + 17) / 128) * 128;\n    var padded = new Uint8Array(paddedLength);\n    var i, j, n;\n    for (i = 0; i < length; ++i) {\n      padded[i] = data[offset++];\n    }\n    padded[i++] = 0x80;\n    n = paddedLength - 16;\n    while (i < n) {\n      padded[i++] = 0;\n    }\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = (length >>> 29) & 0xFF;\n    padded[i++] = (length >> 21) & 0xFF;\n    padded[i++] = (length >> 13) & 0xFF;\n    padded[i++] = (length >> 5) & 0xFF;\n    padded[i++] = (length << 3) & 0xFF;\n\n    var w = new Array(80);\n    for (i = 0; i < 80; i++) {\n      w[i] = new Word64(0, 0);\n    }\n    var a = new Word64(0, 0), b = new Word64(0, 0), c = new Word64(0, 0);\n    var d = new Word64(0, 0), e = new Word64(0, 0), f = new Word64(0, 0);\n    var g = new Word64(0, 0), h = new Word64(0, 0);\n    var t1 = new Word64(0, 0), t2 = new Word64(0, 0);\n    var tmp1 = new Word64(0, 0), tmp2 = new Word64(0, 0), tmp3;\n\n    // for each 1024 bit block\n    for (i = 0; i < paddedLength;) {\n      for (j = 0; j < 16; ++j) {\n        w[j].high = (padded[i] << 24) | (padded[i + 1] << 16) |\n                    (padded[i + 2] << 8) | (padded[i + 3]);\n        w[j].low = (padded[i + 4]) << 24 | (padded[i + 5]) << 16 |\n                   (padded[i + 6]) << 8 | (padded[i + 7]);\n        i += 8;\n      }\n      for (j = 16; j < 80; ++j) {\n        tmp3 = w[j];\n        littleSigmaPrime(tmp3, w[j - 2], tmp2);\n        tmp3.add(w[j - 7]);\n        littleSigma(tmp1, w[j - 15], tmp2);\n        tmp3.add(tmp1);\n        tmp3.add(w[j - 16]);\n      }\n\n      a.assign(h0); b.assign(h1); c.assign(h2); d.assign(h3);\n      e.assign(h4); f.assign(h5); g.assign(h6); h.assign(h7);\n      for (j = 0; j < 80; ++j) {\n        t1.assign(h);\n        sigmaPrime(tmp1, e, tmp2);\n        t1.add(tmp1);\n        ch(tmp1, e, f, g, tmp2);\n        t1.add(tmp1);\n        t1.add(k[j]);\n        t1.add(w[j]);\n\n        sigma(t2, a, tmp2);\n        maj(tmp1, a, b, c, tmp2);\n        t2.add(tmp1);\n\n        tmp3 = h;\n        h = g;\n        g = f;\n        f = e;\n        d.add(t1);\n        e = d;\n        d = c;\n        c = b;\n        b = a;\n        tmp3.assign(t1);\n        tmp3.add(t2);\n        a = tmp3;\n      }\n      h0.add(a);\n      h1.add(b);\n      h2.add(c);\n      h3.add(d);\n      h4.add(e);\n      h5.add(f);\n      h6.add(g);\n      h7.add(h);\n    }\n\n    var result;\n    if (!mode384) {\n      result = new Uint8Array(64);\n      h0.copyTo(result,0);\n      h1.copyTo(result,8);\n      h2.copyTo(result,16);\n      h3.copyTo(result,24);\n      h4.copyTo(result,32);\n      h5.copyTo(result,40);\n      h6.copyTo(result,48);\n      h7.copyTo(result,56);\n    }\n    else {\n      result = new Uint8Array(48);\n      h0.copyTo(result,0);\n      h1.copyTo(result,8);\n      h2.copyTo(result,16);\n      h3.copyTo(result,24);\n      h4.copyTo(result,32);\n      h5.copyTo(result,40);\n    }\n    return result;\n  }\n\n  return hash;\n})();\nvar calculateSHA384 = (function calculateSHA384Closure() {\n  function hash(data, offset, length) {\n    return calculateSHA512(data, offset, length, true);\n  }\n\n  return hash;\n})();\nvar NullCipher = (function NullCipherClosure() {\n  function NullCipher() {\n  }\n\n  NullCipher.prototype = {\n    decryptBlock: function NullCipher_decryptBlock(data) {\n      return data;\n    }\n  };\n\n  return NullCipher;\n})();\n\nvar AES128Cipher = (function AES128CipherClosure() {\n  var rcon = new Uint8Array([\n    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,\n    0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,\n    0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,\n    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,\n    0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,\n    0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6,\n    0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,\n    0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,\n    0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,\n    0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e,\n    0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,\n    0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,\n    0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02,\n    0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,\n    0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,\n    0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,\n    0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb,\n    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,\n    0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,\n    0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,\n    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,\n    0x74, 0xe8, 0xcb, 0x8d]);\n\n  var s = new Uint8Array([\n    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,\n    0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,\n    0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,\n    0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,\n    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,\n    0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,\n    0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,\n    0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,\n    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,\n    0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,\n    0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,\n    0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,\n    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,\n    0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,\n    0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,\n    0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,\n    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,\n    0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,\n    0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,\n    0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,\n    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,\n    0xb0, 0x54, 0xbb, 0x16]);\n\n  var inv_s = new Uint8Array([\n    0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,\n    0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,\n    0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,\n    0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,\n    0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,\n    0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,\n    0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,\n    0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,\n    0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,\n    0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,\n    0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,\n    0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,\n    0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,\n    0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,\n    0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,\n    0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,\n    0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,\n    0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,\n    0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,\n    0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,\n    0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,\n    0x55, 0x21, 0x0c, 0x7d]);\n  var mixCol = new Uint8Array(256);\n  for (var i = 0; i < 256; i++) {\n    if (i < 128) {\n      mixCol[i] = i << 1;\n    } else {\n      mixCol[i] = (i << 1) ^ 0x1b;\n    }\n  }\n  var mix = new Uint32Array([\n    0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927,\n    0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45,\n    0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb,\n    0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381,\n    0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf,\n    0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66,\n    0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28,\n    0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012,\n    0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec,\n    0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e,\n    0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd,\n    0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7,\n    0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89,\n    0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b,\n    0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815,\n    0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f,\n    0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa,\n    0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8,\n    0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36,\n    0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c,\n    0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742,\n    0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea,\n    0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4,\n    0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e,\n    0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360,\n    0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502,\n    0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87,\n    0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd,\n    0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3,\n    0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621,\n    0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f,\n    0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55,\n    0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26,\n    0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844,\n    0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba,\n    0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480,\n    0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce,\n    0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67,\n    0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929,\n    0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713,\n    0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed,\n    0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f,\n    0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);\n\n  function expandKey128(cipherKey) {\n    var b = 176, result = new Uint8Array(b);\n    result.set(cipherKey);\n    for (var j = 16, i = 1; j < b; ++i) {\n      // RotWord\n      var t1 = result[j - 3], t2 = result[j - 2],\n          t3 = result[j - 1], t4 = result[j - 4];\n      // SubWord\n      t1 = s[t1];\n      t2 = s[t2];\n      t3 = s[t3];\n      t4 = s[t4];\n      // Rcon\n      t1 = t1 ^ rcon[i];\n      for (var n = 0; n < 4; ++n) {\n        result[j] = (t1 ^= result[j - 16]);\n        j++;\n        result[j] = (t2 ^= result[j - 16]);\n        j++;\n        result[j] = (t3 ^= result[j - 16]);\n        j++;\n        result[j] = (t4 ^= result[j - 16]);\n        j++;\n      }\n    }\n    return result;\n  }\n\n  function decrypt128(input, key) {\n    var state = new Uint8Array(16);\n    state.set(input);\n    var i, j, k;\n    var t, u, v;\n    // AddRoundKey\n    for (j = 0, k = 160; j < 16; ++j, ++k) {\n      state[j] ^= key[k];\n    }\n    for (i = 9; i >= 1; --i) {\n      // InvShiftRows\n      t = state[13];\n      state[13] = state[9];\n      state[9] = state[5];\n      state[5] = state[1];\n      state[1] = t;\n      t = state[14];\n      u = state[10];\n      state[14] = state[6];\n      state[10] = state[2];\n      state[6] = t;\n      state[2] = u;\n      t = state[15];\n      u = state[11];\n      v = state[7];\n      state[15] = state[3];\n      state[11] = t;\n      state[7] = u;\n      state[3] = v;\n      // InvSubBytes\n      for (j = 0; j < 16; ++j) {\n        state[j] = inv_s[state[j]];\n      }\n      // AddRoundKey\n      for (j = 0, k = i * 16; j < 16; ++j, ++k) {\n        state[j] ^= key[k];\n      }\n      // InvMixColumns\n      for (j = 0; j < 16; j += 4) {\n        var s0 = mix[state[j]], s1 = mix[state[j + 1]],\n          s2 = mix[state[j + 2]], s3 = mix[state[j + 3]];\n        t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^\n          (s3 >>> 24) ^ (s3 << 8));\n        state[j] = (t >>> 24) & 0xFF;\n        state[j + 1] = (t >> 16) & 0xFF;\n        state[j + 2] = (t >> 8) & 0xFF;\n        state[j + 3] = t & 0xFF;\n      }\n    }\n    // InvShiftRows\n    t = state[13];\n    state[13] = state[9];\n    state[9] = state[5];\n    state[5] = state[1];\n    state[1] = t;\n    t = state[14];\n    u = state[10];\n    state[14] = state[6];\n    state[10] = state[2];\n    state[6] = t;\n    state[2] = u;\n    t = state[15];\n    u = state[11];\n    v = state[7];\n    state[15] = state[3];\n    state[11] = t;\n    state[7] = u;\n    state[3] = v;\n    for (j = 0; j < 16; ++j) {\n      // InvSubBytes\n      state[j] = inv_s[state[j]];\n      // AddRoundKey\n      state[j] ^= key[j];\n    }\n    return state;\n  }\n\n  function encrypt128(input, key) {\n    var t, u, v, k;\n    var state = new Uint8Array(16);\n    state.set(input);\n    for (j = 0; j < 16; ++j) {\n      // AddRoundKey\n      state[j] ^= key[j];\n    }\n\n    for (i = 1; i < 10; i++) {\n      //SubBytes\n      for (j = 0; j < 16; ++j) {\n        state[j] = s[state[j]];\n      }\n      //ShiftRows\n      v = state[1];\n      state[1] = state[5];\n      state[5] = state[9];\n      state[9] = state[13];\n      state[13] = v;\n      v = state[2];\n      u = state[6];\n      state[2] = state[10];\n      state[6] = state[14];\n      state[10] = v;\n      state[14] = u;\n      v = state[3];\n      u = state[7];\n      t = state[11];\n      state[3] = state[15];\n      state[7] = v;\n      state[11] = u;\n      state[15] = t;\n      //MixColumns\n      for (var j = 0; j < 16; j += 4) {\n        var s0 = state[j + 0], s1 = state[j + 1];\n        var s2 = state[j + 2], s3 = state[j + 3];\n        t = s0 ^ s1 ^ s2 ^ s3;\n        state[j + 0] ^= t ^ mixCol[s0 ^ s1];\n        state[j + 1] ^= t ^ mixCol[s1 ^ s2];\n        state[j + 2] ^= t ^ mixCol[s2 ^ s3];\n        state[j + 3] ^= t ^ mixCol[s3 ^ s0];\n      }\n      //AddRoundKey\n      for (j = 0, k = i * 16; j < 16; ++j, ++k) {\n        state[j] ^= key[k];\n      }\n    }\n\n    //SubBytes\n    for (j = 0; j < 16; ++j) {\n      state[j] = s[state[j]];\n    }\n    //ShiftRows\n    v = state[1];\n    state[1] = state[5];\n    state[5] = state[9];\n    state[9] = state[13];\n    state[13] = v;\n    v = state[2];\n    u = state[6];\n    state[2] = state[10];\n    state[6] = state[14];\n    state[10] = v;\n    state[14] = u;\n    v = state[3];\n    u = state[7];\n    t = state[11];\n    state[3] = state[15];\n    state[7] = v;\n    state[11] = u;\n    state[15] = t;\n    //AddRoundKey\n    for (j = 0, k = 160; j < 16; ++j, ++k) {\n      state[j] ^= key[k];\n    }\n    return state;\n  }\n\n  function AES128Cipher(key) {\n    this.key = expandKey128(key);\n    this.buffer = new Uint8Array(16);\n    this.bufferPosition = 0;\n  }\n\n  function decryptBlock2(data, finalize) {\n    var i, j, ii, sourceLength = data.length,\n        buffer = this.buffer, bufferLength = this.bufferPosition,\n        result = [], iv = this.iv;\n    for (i = 0; i < sourceLength; ++i) {\n      buffer[bufferLength] = data[i];\n      ++bufferLength;\n      if (bufferLength < 16) {\n        continue;\n      }\n      // buffer is full, decrypting\n      var plain = decrypt128(buffer, this.key);\n      // xor-ing the IV vector to get plain text\n      for (j = 0; j < 16; ++j) {\n        plain[j] ^= iv[j];\n      }\n      iv = buffer;\n      result.push(plain);\n      buffer = new Uint8Array(16);\n      bufferLength = 0;\n    }\n    // saving incomplete buffer\n    this.buffer = buffer;\n    this.bufferLength = bufferLength;\n    this.iv = iv;\n    if (result.length === 0) {\n      return new Uint8Array([]);\n    }\n    // combining plain text blocks into one\n    var outputLength = 16 * result.length;\n    if (finalize) {\n      // undo a padding that is described in RFC 2898\n      var lastBlock = result[result.length - 1];\n      var psLen = lastBlock[15];\n      if (psLen <= 16) {\n        for (i = 15, ii = 16 - psLen; i >= ii; --i) {\n          if (lastBlock[i] !== psLen) {\n            // Invalid padding, assume that the block has no padding.\n            psLen = 0;\n            break;\n          }\n        }\n        outputLength -= psLen;\n        result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);\n      }\n    }\n    var output = new Uint8Array(outputLength);\n    for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {\n      output.set(result[i], j);\n    }\n    return output;\n  }\n\n  AES128Cipher.prototype = {\n    decryptBlock: function AES128Cipher_decryptBlock(data, finalize) {\n      var i, sourceLength = data.length;\n      var buffer = this.buffer, bufferLength = this.bufferPosition;\n      // waiting for IV values -- they are at the start of the stream\n      for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) {\n        buffer[bufferLength] = data[i];\n      }\n      if (bufferLength < 16) {\n        // need more data\n        this.bufferLength = bufferLength;\n        return new Uint8Array([]);\n      }\n      this.iv = buffer;\n      this.buffer = new Uint8Array(16);\n      this.bufferLength = 0;\n      // starting decryption\n      this.decryptBlock = decryptBlock2;\n      return this.decryptBlock(data.subarray(16), finalize);\n    },\n    encrypt: function AES128Cipher_encrypt(data, iv) {\n      var i, j, ii, sourceLength = data.length,\n          buffer = this.buffer, bufferLength = this.bufferPosition,\n          result = [];\n      if (!iv) {\n        iv = new Uint8Array(16);\n      }\n      for (i = 0; i < sourceLength; ++i) {\n        buffer[bufferLength] = data[i];\n        ++bufferLength;\n        if (bufferLength < 16) {\n          continue;\n        }\n        for (j = 0; j < 16; ++j) {\n          buffer[j] ^= iv[j];\n        }\n\n        // buffer is full, encrypting\n        var cipher = encrypt128(buffer, this.key);\n        iv = cipher;\n        result.push(cipher);\n        buffer = new Uint8Array(16);\n        bufferLength = 0;\n      }\n      // saving incomplete buffer\n      this.buffer = buffer;\n      this.bufferLength = bufferLength;\n      this.iv = iv;\n      if (result.length === 0) {\n        return new Uint8Array([]);\n      }\n      // combining plain text blocks into one\n      var outputLength = 16 * result.length;\n      var output = new Uint8Array(outputLength);\n      for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {\n        output.set(result[i], j);\n      }\n      return output;\n    }\n  };\n\n  return AES128Cipher;\n})();\n\nvar AES256Cipher = (function AES256CipherClosure() {\n  var rcon = new Uint8Array([\n    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,\n    0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,\n    0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,\n    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,\n    0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,\n    0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6,\n    0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,\n    0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,\n    0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,\n    0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e,\n    0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,\n    0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,\n    0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02,\n    0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,\n    0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,\n    0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,\n    0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb,\n    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,\n    0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,\n    0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,\n    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,\n    0x74, 0xe8, 0xcb, 0x8d]);\n\n  var s = new Uint8Array([\n    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,\n    0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,\n    0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,\n    0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,\n    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,\n    0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,\n    0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,\n    0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,\n    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,\n    0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,\n    0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,\n    0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,\n    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,\n    0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,\n    0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,\n    0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,\n    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,\n    0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,\n    0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,\n    0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,\n    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,\n    0xb0, 0x54, 0xbb, 0x16]);\n\n  var inv_s = new Uint8Array([\n    0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,\n    0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,\n    0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,\n    0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,\n    0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,\n    0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,\n    0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,\n    0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,\n    0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,\n    0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,\n    0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,\n    0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,\n    0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,\n    0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,\n    0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,\n    0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,\n    0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,\n    0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,\n    0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,\n    0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,\n    0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,\n    0x55, 0x21, 0x0c, 0x7d]);\n\n  var mixCol = new Uint8Array(256);\n  for (var i = 0; i < 256; i++) {\n    if (i < 128) {\n      mixCol[i] = i << 1;\n    } else {\n      mixCol[i] = (i << 1) ^ 0x1b;\n    }\n  }\n  var mix = new Uint32Array([\n    0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927,\n    0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45,\n    0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb,\n    0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381,\n    0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf,\n    0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66,\n    0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28,\n    0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012,\n    0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec,\n    0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e,\n    0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd,\n    0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7,\n    0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89,\n    0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b,\n    0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815,\n    0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f,\n    0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa,\n    0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8,\n    0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36,\n    0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c,\n    0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742,\n    0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea,\n    0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4,\n    0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e,\n    0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360,\n    0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502,\n    0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87,\n    0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd,\n    0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3,\n    0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621,\n    0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f,\n    0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55,\n    0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26,\n    0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844,\n    0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba,\n    0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480,\n    0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce,\n    0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67,\n    0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929,\n    0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713,\n    0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed,\n    0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f,\n    0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);\n\n  function expandKey256(cipherKey) {\n    var b = 240, result = new Uint8Array(b);\n    var r = 1;\n\n    result.set(cipherKey);\n    for (var j = 32, i = 1; j < b; ++i) {\n      if (j % 32 === 16) {\n        t1 = s[t1];\n        t2 = s[t2];\n        t3 = s[t3];\n        t4 = s[t4];\n      } else if (j % 32 === 0) {\n        // RotWord\n        var t1 = result[j - 3], t2 = result[j - 2],\n          t3 = result[j - 1], t4 = result[j - 4];\n        // SubWord\n        t1 = s[t1];\n        t2 = s[t2];\n        t3 = s[t3];\n        t4 = s[t4];\n        // Rcon\n        t1 = t1 ^ r;\n        if ((r <<= 1) >= 256) {\n          r = (r ^ 0x1b) & 0xFF;\n        }\n      }\n\n      for (var n = 0; n < 4; ++n) {\n        result[j] = (t1 ^= result[j - 32]);\n        j++;\n        result[j] = (t2 ^= result[j - 32]);\n        j++;\n        result[j] = (t3 ^= result[j - 32]);\n        j++;\n        result[j] = (t4 ^= result[j - 32]);\n        j++;\n      }\n    }\n    return result;\n  }\n\n  function decrypt256(input, key) {\n    var state = new Uint8Array(16);\n    state.set(input);\n    var i, j, k;\n    var t, u, v;\n    // AddRoundKey\n    for (j = 0, k = 224; j < 16; ++j, ++k) {\n      state[j] ^= key[k];\n    }\n    for (i = 13; i >= 1; --i) {\n      // InvShiftRows\n      t = state[13];\n      state[13] = state[9];\n      state[9] = state[5];\n      state[5] = state[1];\n      state[1] = t;\n      t = state[14];\n      u = state[10];\n      state[14] = state[6];\n      state[10] = state[2];\n      state[6] = t;\n      state[2] = u;\n      t = state[15];\n      u = state[11];\n      v = state[7];\n      state[15] = state[3];\n      state[11] = t;\n      state[7] = u;\n      state[3] = v;\n      // InvSubBytes\n      for (j = 0; j < 16; ++j) {\n        state[j] = inv_s[state[j]];\n      }\n      // AddRoundKey\n      for (j = 0, k = i * 16; j < 16; ++j, ++k) {\n        state[j] ^= key[k];\n      }\n      // InvMixColumns\n      for (j = 0; j < 16; j += 4) {\n        var s0 = mix[state[j]], s1 = mix[state[j + 1]],\n            s2 = mix[state[j + 2]], s3 = mix[state[j + 3]];\n        t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^\n            (s3 >>> 24) ^ (s3 << 8));\n        state[j] = (t >>> 24) & 0xFF;\n        state[j + 1] = (t >> 16) & 0xFF;\n        state[j + 2] = (t >> 8) & 0xFF;\n        state[j + 3] = t & 0xFF;\n      }\n    }\n    // InvShiftRows\n    t = state[13];\n    state[13] = state[9];\n    state[9] = state[5];\n    state[5] = state[1];\n    state[1] = t;\n    t = state[14];\n    u = state[10];\n    state[14] = state[6];\n    state[10] = state[2];\n    state[6] = t;\n    state[2] = u;\n    t = state[15];\n    u = state[11];\n    v = state[7];\n    state[15] = state[3];\n    state[11] = t;\n    state[7] = u;\n    state[3] = v;\n    for (j = 0; j < 16; ++j) {\n      // InvSubBytes\n      state[j] = inv_s[state[j]];\n      // AddRoundKey\n      state[j] ^= key[j];\n    }\n    return state;\n  }\n\n  function encrypt256(input, key) {\n    var t, u, v, k;\n    var state = new Uint8Array(16);\n    state.set(input);\n    for (j = 0; j < 16; ++j) {\n      // AddRoundKey\n      state[j] ^= key[j];\n    }\n\n    for (i = 1; i < 14; i++) {\n      //SubBytes\n      for (j = 0; j < 16; ++j) {\n        state[j] = s[state[j]];\n      }\n      //ShiftRows\n      v = state[1];\n      state[1] = state[5];\n      state[5] = state[9];\n      state[9] = state[13];\n      state[13] = v;\n      v = state[2];\n      u = state[6];\n      state[2] = state[10];\n      state[6] = state[14];\n      state[10] = v;\n      state[14] = u;\n      v = state[3];\n      u = state[7];\n      t = state[11];\n      state[3] = state[15];\n      state[7] = v;\n      state[11] = u;\n      state[15] = t;\n      //MixColumns\n      for (var j = 0; j < 16; j += 4) {\n        var s0 = state[j + 0], s1 = state[j + 1];\n        var s2 = state[j + 2], s3 = state[j + 3];\n        t = s0 ^ s1 ^ s2 ^ s3;\n        state[j + 0] ^= t ^ mixCol[s0 ^ s1];\n        state[j + 1] ^= t ^ mixCol[s1 ^ s2];\n        state[j + 2] ^= t ^ mixCol[s2 ^ s3];\n        state[j + 3] ^= t ^ mixCol[s3 ^ s0];\n      }\n      //AddRoundKey\n      for (j = 0, k = i * 16; j < 16; ++j, ++k) {\n        state[j] ^= key[k];\n      }\n    }\n\n    //SubBytes\n    for (j = 0; j < 16; ++j) {\n      state[j] = s[state[j]];\n    }\n    //ShiftRows\n    v = state[1];\n    state[1] = state[5];\n    state[5] = state[9];\n    state[9] = state[13];\n    state[13] = v;\n    v = state[2];\n    u = state[6];\n    state[2] = state[10];\n    state[6] = state[14];\n    state[10] = v;\n    state[14] = u;\n    v = state[3];\n    u = state[7];\n    t = state[11];\n    state[3] = state[15];\n    state[7] = v;\n    state[11] = u;\n    state[15] = t;\n    //AddRoundKey\n    for (j = 0, k = 224; j < 16; ++j, ++k) {\n      state[j] ^= key[k];\n    }\n\n    return state;\n\n  }\n\n  function AES256Cipher(key) {\n    this.key = expandKey256(key);\n    this.buffer = new Uint8Array(16);\n    this.bufferPosition = 0;\n  }\n\n  function decryptBlock2(data, finalize) {\n    var i, j, ii, sourceLength = data.length,\n        buffer = this.buffer, bufferLength = this.bufferPosition,\n        result = [], iv = this.iv;\n\n    for (i = 0; i < sourceLength; ++i) {\n      buffer[bufferLength] = data[i];\n      ++bufferLength;\n      if (bufferLength < 16) {\n        continue;\n      }\n      // buffer is full, decrypting\n      var plain = decrypt256(buffer, this.key);\n      // xor-ing the IV vector to get plain text\n      for (j = 0; j < 16; ++j) {\n        plain[j] ^= iv[j];\n      }\n      iv = buffer;\n      result.push(plain);\n      buffer = new Uint8Array(16);\n      bufferLength = 0;\n    }\n    // saving incomplete buffer\n    this.buffer = buffer;\n    this.bufferLength = bufferLength;\n    this.iv = iv;\n    if (result.length === 0) {\n      return new Uint8Array([]);\n    }\n    // combining plain text blocks into one\n    var outputLength = 16 * result.length;\n    if (finalize) {\n      // undo a padding that is described in RFC 2898\n      var lastBlock = result[result.length - 1];\n      var psLen = lastBlock[15];\n      if (psLen <= 16) {\n        for (i = 15, ii = 16 - psLen; i >= ii; --i) {\n          if (lastBlock[i] !== psLen) {\n            // Invalid padding, assume that the block has no padding.\n            psLen = 0;\n            break;\n          }\n        }\n        outputLength -= psLen;\n        result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);\n      }\n    }\n    var output = new Uint8Array(outputLength);\n    for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {\n      output.set(result[i], j);\n    }\n    return output;\n\n  }\n\n  AES256Cipher.prototype = {\n    decryptBlock: function AES256Cipher_decryptBlock(data, finalize, iv) {\n      var i, sourceLength = data.length;\n      var buffer = this.buffer, bufferLength = this.bufferPosition;\n      // if not supplied an IV wait for IV values\n      // they are at the start of the stream\n      if (iv) {\n        this.iv = iv;\n      } else {\n        for (i = 0; bufferLength < 16 &&\n             i < sourceLength; ++i, ++bufferLength) {\n          buffer[bufferLength] = data[i];\n        }\n        if (bufferLength < 16) {\n          //need more data\n          this.bufferLength = bufferLength;\n          return new Uint8Array([]);\n        }\n        this.iv = buffer;\n        data = data.subarray(16);\n      }\n      this.buffer = new Uint8Array(16);\n      this.bufferLength = 0;\n      // starting decryption\n      this.decryptBlock = decryptBlock2;\n      return this.decryptBlock(data, finalize);\n    },\n    encrypt: function AES256Cipher_encrypt(data, iv) {\n      var i, j, ii, sourceLength = data.length,\n          buffer = this.buffer, bufferLength = this.bufferPosition,\n          result = [];\n      if (!iv) {\n        iv = new Uint8Array(16);\n      }\n      for (i = 0; i < sourceLength; ++i) {\n        buffer[bufferLength] = data[i];\n        ++bufferLength;\n        if (bufferLength < 16) {\n          continue;\n        }\n        for (j = 0; j < 16; ++j) {\n          buffer[j] ^= iv[j];\n        }\n\n        // buffer is full, encrypting\n        var cipher = encrypt256(buffer, this.key);\n        this.iv = cipher;\n        result.push(cipher);\n        buffer = new Uint8Array(16);\n        bufferLength = 0;\n      }\n      // saving incomplete buffer\n      this.buffer = buffer;\n      this.bufferLength = bufferLength;\n      this.iv = iv;\n      if (result.length === 0) {\n        return new Uint8Array([]);\n      }\n      // combining plain text blocks into one\n      var outputLength = 16 * result.length;\n      var output = new Uint8Array(outputLength);\n      for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {\n        output.set(result[i], j);\n      }\n      return output;\n    }\n  };\n\n  return AES256Cipher;\n})();\n\nvar PDF17 = (function PDF17Closure() {\n\n  function compareByteArrays(array1, array2) {\n    if (array1.length !== array2.length) {\n      return false;\n    }\n    for (var i = 0; i < array1.length; i++) {\n      if (array1[i] !== array2[i]) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  function PDF17() {\n  }\n\n  PDF17.prototype = {\n    checkOwnerPassword: function PDF17_checkOwnerPassword(password,\n                                                          ownerValidationSalt,\n                                                          userBytes,\n                                                          ownerPassword) {\n      var hashData = new Uint8Array(password.length + 56);\n      hashData.set(password, 0);\n      hashData.set(ownerValidationSalt, password.length);\n      hashData.set(userBytes, password.length + ownerValidationSalt.length);\n      var result = calculateSHA256(hashData, 0, hashData.length);\n      return compareByteArrays(result, ownerPassword);\n    },\n    checkUserPassword: function PDF17_checkUserPassword(password,\n                                                        userValidationSalt,\n                                                        userPassword) {\n      var hashData = new Uint8Array(password.length + 8);\n      hashData.set(password, 0);\n      hashData.set(userValidationSalt, password.length);\n      var result = calculateSHA256(hashData, 0, hashData.length);\n      return compareByteArrays(result, userPassword);\n    },\n    getOwnerKey: function PDF17_getOwnerKey(password, ownerKeySalt, userBytes,\n                                            ownerEncryption) {\n      var hashData = new Uint8Array(password.length + 56);\n      hashData.set(password, 0);\n      hashData.set(ownerKeySalt, password.length);\n      hashData.set(userBytes, password.length + ownerKeySalt.length);\n      var key = calculateSHA256(hashData, 0, hashData.length);\n      var cipher = new AES256Cipher(key);\n      return cipher.decryptBlock(ownerEncryption,\n                                 false,\n                                 new Uint8Array(16));\n\n    },\n    getUserKey: function PDF17_getUserKey(password, userKeySalt,\n                                          userEncryption) {\n      var hashData = new Uint8Array(password.length + 8);\n      hashData.set(password, 0);\n      hashData.set(userKeySalt, password.length);\n      //key is the decryption key for the UE string\n      var key = calculateSHA256(hashData, 0, hashData.length);\n      var cipher = new AES256Cipher(key);\n      return cipher.decryptBlock(userEncryption,\n                                 false,\n                                 new Uint8Array(16));\n    }\n  };\n  return PDF17;\n})();\n\nvar PDF20 = (function PDF20Closure() {\n\n  function concatArrays(array1, array2) {\n    var t = new Uint8Array(array1.length + array2.length);\n    t.set(array1, 0);\n    t.set(array2, array1.length);\n    return t;\n  }\n\n  function calculatePDF20Hash(password, input, userBytes) {\n    //This refers to Algorithm 2.B as defined in ISO 32000-2\n    var k = calculateSHA256(input, 0, input.length).subarray(0, 32);\n    var e = [0];\n    var i = 0;\n    while (i < 64 || e[e.length - 1] > i - 32) {\n      var arrayLength = password.length + k.length + userBytes.length;\n\n      var k1 = new Uint8Array(arrayLength * 64);\n      var array = concatArrays(password, k);\n      array = concatArrays(array, userBytes);\n      for (var j = 0, pos = 0; j < 64; j++, pos += arrayLength) {\n        k1.set(array, pos);\n      }\n      //AES128 CBC NO PADDING with\n      //first 16 bytes of k as the key and the second 16 as the iv.\n      var cipher = new AES128Cipher(k.subarray(0, 16));\n      e = cipher.encrypt(k1, k.subarray(16, 32));\n      //Now we have to take the first 16 bytes of an unsigned\n      //big endian integer... and compute the remainder\n      //modulo 3.... That is a fairly large number and\n      //JavaScript isn't going to handle that well...\n      //So we're using a trick that allows us to perform\n      //modulo math byte by byte\n      var remainder = 0;\n      for (var z = 0; z < 16; z++) {\n        remainder *= (256 % 3);\n        remainder %= 3;\n        remainder += ((e[z] >>> 0) % 3);\n        remainder %= 3;\n      }\n      if (remainder === 0) {\n        k = calculateSHA256(e, 0, e.length);\n      }\n      else if (remainder === 1) {\n        k = calculateSHA384(e, 0, e.length);\n      }\n      else if (remainder === 2) {\n        k = calculateSHA512(e, 0, e.length);\n      }\n      i++;\n    }\n    return k.subarray(0, 32);\n  }\n\n  function PDF20() {\n  }\n\n  function compareByteArrays(array1, array2) {\n    if (array1.length !== array2.length) {\n      return false;\n    }\n    for (var i = 0; i < array1.length; i++) {\n      if (array1[i] !== array2[i]) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  PDF20.prototype = {\n    hash: function PDF20_hash(password, concatBytes, userBytes) {\n      return calculatePDF20Hash(password, concatBytes, userBytes);\n    },\n    checkOwnerPassword: function PDF20_checkOwnerPassword(password,\n                                                          ownerValidationSalt,\n                                                          userBytes,\n                                                          ownerPassword) {\n      var hashData = new Uint8Array(password.length + 56);\n      hashData.set(password, 0);\n      hashData.set(ownerValidationSalt, password.length);\n      hashData.set(userBytes, password.length + ownerValidationSalt.length);\n      var result = calculatePDF20Hash(password, hashData, userBytes);\n      return compareByteArrays(result, ownerPassword);\n    },\n    checkUserPassword: function PDF20_checkUserPassword(password,\n                                                        userValidationSalt,\n                                                        userPassword) {\n      var hashData = new Uint8Array(password.length + 8);\n      hashData.set(password, 0);\n      hashData.set(userValidationSalt, password.length);\n      var result = calculatePDF20Hash(password, hashData, []);\n      return compareByteArrays(result, userPassword);\n    },\n    getOwnerKey: function PDF20_getOwnerKey(password, ownerKeySalt, userBytes,\n                                            ownerEncryption) {\n      var hashData = new Uint8Array(password.length + 56);\n      hashData.set(password, 0);\n      hashData.set(ownerKeySalt, password.length);\n      hashData.set(userBytes, password.length + ownerKeySalt.length);\n      var key = calculatePDF20Hash(password, hashData, userBytes);\n      var cipher = new AES256Cipher(key);\n      return cipher.decryptBlock(ownerEncryption,\n                                 false,\n                                 new Uint8Array(16));\n\n    },\n    getUserKey: function PDF20_getUserKey(password, userKeySalt,\n                                          userEncryption) {\n      var hashData = new Uint8Array(password.length + 8);\n      hashData.set(password, 0);\n      hashData.set(userKeySalt, password.length);\n      //key is the decryption key for the UE string\n      var key = calculatePDF20Hash(password, hashData, []);\n      var cipher = new AES256Cipher(key);\n      return cipher.decryptBlock(userEncryption,\n                                 false,\n                                 new Uint8Array(16));\n    }\n  };\n  return PDF20;\n})();\n\nvar CipherTransform = (function CipherTransformClosure() {\n  function CipherTransform(stringCipherConstructor, streamCipherConstructor) {\n    this.stringCipherConstructor = stringCipherConstructor;\n    this.streamCipherConstructor = streamCipherConstructor;\n  }\n\n  CipherTransform.prototype = {\n    createStream: function CipherTransform_createStream(stream, length) {\n      var cipher = new this.streamCipherConstructor();\n      return new DecryptStream(stream, length,\n        function cipherTransformDecryptStream(data, finalize) {\n          return cipher.decryptBlock(data, finalize);\n        }\n      );\n    },\n    decryptString: function CipherTransform_decryptString(s) {\n      var cipher = new this.stringCipherConstructor();\n      var data = stringToBytes(s);\n      data = cipher.decryptBlock(data, true);\n      return bytesToString(data);\n    }\n  };\n  return CipherTransform;\n})();\n\nvar CipherTransformFactory = (function CipherTransformFactoryClosure() {\n  var defaultPasswordBytes = new Uint8Array([\n    0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41,\n    0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08,\n    0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80,\n    0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]);\n\n  function createEncryptionKey20(revision, password, ownerPassword,\n                                 ownerValidationSalt, ownerKeySalt, uBytes,\n                                 userPassword, userValidationSalt, userKeySalt,\n                                 ownerEncryption, userEncryption, perms) {\n    if (password) {\n      var passwordLength = Math.min(127, password.length);\n      password = password.subarray(0, passwordLength);\n    } else {\n      password = [];\n    }\n    var pdfAlgorithm;\n    if (revision === 6) {\n      pdfAlgorithm = new PDF20();\n    } else {\n      pdfAlgorithm = new PDF17();\n    }\n\n    if (pdfAlgorithm) {\n      if (pdfAlgorithm.checkUserPassword(password, userValidationSalt,\n                                         userPassword)) {\n        return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption);\n      } else if (pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt,\n                                                 uBytes,\n                                                 ownerPassword)) {\n        return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes,\n                                        ownerEncryption);\n      }\n    }\n\n    return null;\n  }\n\n  function prepareKeyData(fileId, password, ownerPassword, userPassword,\n                          flags, revision, keyLength, encryptMetadata) {\n    var hashDataSize = 40 + ownerPassword.length + fileId.length;\n    var hashData = new Uint8Array(hashDataSize), i = 0, j, n;\n    if (password) {\n      n = Math.min(32, password.length);\n      for (; i < n; ++i) {\n        hashData[i] = password[i];\n      }\n    }\n    j = 0;\n    while (i < 32) {\n      hashData[i++] = defaultPasswordBytes[j++];\n    }\n    // as now the padded password in the hashData[0..i]\n    for (j = 0, n = ownerPassword.length; j < n; ++j) {\n      hashData[i++] = ownerPassword[j];\n    }\n    hashData[i++] = flags & 0xFF;\n    hashData[i++] = (flags >> 8) & 0xFF;\n    hashData[i++] = (flags >> 16) & 0xFF;\n    hashData[i++] = (flags >>> 24) & 0xFF;\n    for (j = 0, n = fileId.length; j < n; ++j) {\n      hashData[i++] = fileId[j];\n    }\n    if (revision >= 4 && !encryptMetadata) {\n      hashData[i++] = 0xFF;\n      hashData[i++] = 0xFF;\n      hashData[i++] = 0xFF;\n      hashData[i++] = 0xFF;\n    }\n    var hash = calculateMD5(hashData, 0, i);\n    var keyLengthInBytes = keyLength >> 3;\n    if (revision >= 3) {\n      for (j = 0; j < 50; ++j) {\n        hash = calculateMD5(hash, 0, keyLengthInBytes);\n      }\n    }\n    var encryptionKey = hash.subarray(0, keyLengthInBytes);\n    var cipher, checkData;\n\n    if (revision >= 3) {\n      for (i = 0; i < 32; ++i) {\n        hashData[i] = defaultPasswordBytes[i];\n      }\n      for (j = 0, n = fileId.length; j < n; ++j) {\n        hashData[i++] = fileId[j];\n      }\n      cipher = new ARCFourCipher(encryptionKey);\n      checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));\n      n = encryptionKey.length;\n      var derivedKey = new Uint8Array(n), k;\n      for (j = 1; j <= 19; ++j) {\n        for (k = 0; k < n; ++k) {\n          derivedKey[k] = encryptionKey[k] ^ j;\n        }\n        cipher = new ARCFourCipher(derivedKey);\n        checkData = cipher.encryptBlock(checkData);\n      }\n      for (j = 0, n = checkData.length; j < n; ++j) {\n        if (userPassword[j] !== checkData[j]) {\n          return null;\n        }\n      }\n    } else {\n      cipher = new ARCFourCipher(encryptionKey);\n      checkData = cipher.encryptBlock(defaultPasswordBytes);\n      for (j = 0, n = checkData.length; j < n; ++j) {\n        if (userPassword[j] !== checkData[j]) {\n          return null;\n        }\n      }\n    }\n    return encryptionKey;\n  }\n\n  function decodeUserPassword(password, ownerPassword, revision, keyLength) {\n    var hashData = new Uint8Array(32), i = 0, j, n;\n    n = Math.min(32, password.length);\n    for (; i < n; ++i) {\n      hashData[i] = password[i];\n    }\n    j = 0;\n    while (i < 32) {\n      hashData[i++] = defaultPasswordBytes[j++];\n    }\n    var hash = calculateMD5(hashData, 0, i);\n    var keyLengthInBytes = keyLength >> 3;\n    if (revision >= 3) {\n      for (j = 0; j < 50; ++j) {\n        hash = calculateMD5(hash, 0, hash.length);\n      }\n    }\n\n    var cipher, userPassword;\n    if (revision >= 3) {\n      userPassword = ownerPassword;\n      var derivedKey = new Uint8Array(keyLengthInBytes), k;\n      for (j = 19; j >= 0; j--) {\n        for (k = 0; k < keyLengthInBytes; ++k) {\n          derivedKey[k] = hash[k] ^ j;\n        }\n        cipher = new ARCFourCipher(derivedKey);\n        userPassword = cipher.encryptBlock(userPassword);\n      }\n    } else {\n      cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes));\n      userPassword = cipher.encryptBlock(ownerPassword);\n    }\n    return userPassword;\n  }\n\n  var identityName = Name.get('Identity');\n\n  function CipherTransformFactory(dict, fileId, password) {\n    var filter = dict.get('Filter');\n    if (!isName(filter) || filter.name !== 'Standard') {\n      error('unknown encryption method');\n    }\n    this.dict = dict;\n    var algorithm = dict.get('V');\n    if (!isInt(algorithm) ||\n        (algorithm !== 1 && algorithm !== 2 && algorithm !== 4 &&\n        algorithm !== 5)) {\n      error('unsupported encryption algorithm');\n    }\n    this.algorithm = algorithm;\n    var keyLength = dict.get('Length') || 40;\n    if (!isInt(keyLength) ||\n        keyLength < 40 || (keyLength % 8) !== 0) {\n      error('invalid key length');\n    }\n\n    // prepare keys\n    var ownerPassword = stringToBytes(dict.get('O')).subarray(0, 32);\n    var userPassword = stringToBytes(dict.get('U')).subarray(0, 32);\n    var flags = dict.get('P');\n    var revision = dict.get('R');\n    // meaningful when V is 4 or 5\n    var encryptMetadata = ((algorithm === 4 || algorithm === 5) &&\n                           dict.get('EncryptMetadata') !== false);\n    this.encryptMetadata = encryptMetadata;\n\n    var fileIdBytes = stringToBytes(fileId);\n    var passwordBytes;\n    if (password) {\n      if (revision === 6) {\n        try {\n          password = utf8StringToString(password);\n        } catch (ex) {\n          warn('CipherTransformFactory: ' +\n               'Unable to convert UTF8 encoded password.');\n        }\n      }\n      passwordBytes = stringToBytes(password);\n    }\n\n    var encryptionKey;\n    if (algorithm !== 5) {\n      encryptionKey = prepareKeyData(fileIdBytes, passwordBytes,\n                                     ownerPassword, userPassword, flags,\n                                     revision, keyLength, encryptMetadata);\n    }\n    else {\n      var ownerValidationSalt = stringToBytes(dict.get('O')).subarray(32, 40);\n      var ownerKeySalt = stringToBytes(dict.get('O')).subarray(40, 48);\n      var uBytes = stringToBytes(dict.get('U')).subarray(0, 48);\n      var userValidationSalt = stringToBytes(dict.get('U')).subarray(32, 40);\n      var userKeySalt = stringToBytes(dict.get('U')).subarray(40, 48);\n      var ownerEncryption = stringToBytes(dict.get('OE'));\n      var userEncryption = stringToBytes(dict.get('UE'));\n      var perms = stringToBytes(dict.get('Perms'));\n      encryptionKey =\n        createEncryptionKey20(revision, passwordBytes,\n          ownerPassword, ownerValidationSalt,\n          ownerKeySalt, uBytes,\n          userPassword, userValidationSalt,\n          userKeySalt, ownerEncryption,\n          userEncryption, perms);\n    }\n    if (!encryptionKey && !password) {\n      throw new PasswordException('No password given',\n                                  PasswordResponses.NEED_PASSWORD);\n    } else if (!encryptionKey && password) {\n      // Attempting use the password as an owner password\n      var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword,\n                                               revision, keyLength);\n      encryptionKey = prepareKeyData(fileIdBytes, decodedPassword,\n                                     ownerPassword, userPassword, flags,\n                                     revision, keyLength, encryptMetadata);\n    }\n\n    if (!encryptionKey) {\n      throw new PasswordException('Incorrect Password',\n                                  PasswordResponses.INCORRECT_PASSWORD);\n    }\n\n    this.encryptionKey = encryptionKey;\n\n    if (algorithm >= 4) {\n      this.cf = dict.get('CF');\n      this.stmf = dict.get('StmF') || identityName;\n      this.strf = dict.get('StrF') || identityName;\n      this.eff = dict.get('EFF') || this.stmf;\n    }\n  }\n\n  function buildObjectKey(num, gen, encryptionKey, isAes) {\n    var key = new Uint8Array(encryptionKey.length + 9), i, n;\n    for (i = 0, n = encryptionKey.length; i < n; ++i) {\n      key[i] = encryptionKey[i];\n    }\n    key[i++] = num & 0xFF;\n    key[i++] = (num >> 8) & 0xFF;\n    key[i++] = (num >> 16) & 0xFF;\n    key[i++] = gen & 0xFF;\n    key[i++] = (gen >> 8) & 0xFF;\n    if (isAes) {\n      key[i++] = 0x73;\n      key[i++] = 0x41;\n      key[i++] = 0x6C;\n      key[i++] = 0x54;\n    }\n    var hash = calculateMD5(key, 0, i);\n    return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));\n  }\n\n  function buildCipherConstructor(cf, name, num, gen, key) {\n    var cryptFilter = cf.get(name.name);\n    var cfm;\n    if (cryptFilter !== null && cryptFilter !== undefined) {\n      cfm = cryptFilter.get('CFM');\n    }\n    if (!cfm || cfm.name === 'None') {\n      return function cipherTransformFactoryBuildCipherConstructorNone() {\n        return new NullCipher();\n      };\n    }\n    if ('V2' === cfm.name) {\n      return function cipherTransformFactoryBuildCipherConstructorV2() {\n        return new ARCFourCipher(buildObjectKey(num, gen, key, false));\n      };\n    }\n    if ('AESV2' === cfm.name) {\n      return function cipherTransformFactoryBuildCipherConstructorAESV2() {\n        return new AES128Cipher(buildObjectKey(num, gen, key, true));\n      };\n    }\n    if ('AESV3' === cfm.name) {\n      return function cipherTransformFactoryBuildCipherConstructorAESV3() {\n        return new AES256Cipher(key);\n      };\n    }\n    error('Unknown crypto method');\n  }\n\n  CipherTransformFactory.prototype = {\n    createCipherTransform:\n        function CipherTransformFactory_createCipherTransform(num, gen) {\n      if (this.algorithm === 4 || this.algorithm === 5) {\n        return new CipherTransform(\n          buildCipherConstructor(this.cf, this.stmf,\n                                 num, gen, this.encryptionKey),\n          buildCipherConstructor(this.cf, this.strf,\n                                 num, gen, this.encryptionKey));\n      }\n      // algorithms 1 and 2\n      var key = buildObjectKey(num, gen, this.encryptionKey, false);\n      var cipherConstructor = function buildCipherCipherConstructor() {\n        return new ARCFourCipher(key);\n      };\n      return new CipherTransform(cipherConstructor, cipherConstructor);\n    }\n  };\n\n  return CipherTransformFactory;\n})();\n\n\nvar PatternType = {\n  FUNCTION_BASED: 1,\n  AXIAL: 2,\n  RADIAL: 3,\n  FREE_FORM_MESH: 4,\n  LATTICE_FORM_MESH: 5,\n  COONS_PATCH_MESH: 6,\n  TENSOR_PATCH_MESH: 7\n};\n\nvar Pattern = (function PatternClosure() {\n  // Constructor should define this.getPattern\n  function Pattern() {\n    error('should not call Pattern constructor');\n  }\n\n  Pattern.prototype = {\n    // Input: current Canvas context\n    // Output: the appropriate fillStyle or strokeStyle\n    getPattern: function Pattern_getPattern(ctx) {\n      error('Should not call Pattern.getStyle: ' + ctx);\n    }\n  };\n\n  Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref,\n                                                       res) {\n\n    var dict = isStream(shading) ? shading.dict : shading;\n    var type = dict.get('ShadingType');\n\n    try {\n      switch (type) {\n        case PatternType.AXIAL:\n        case PatternType.RADIAL:\n          // Both radial and axial shadings are handled by RadialAxial shading.\n          return new Shadings.RadialAxial(dict, matrix, xref, res);\n        case PatternType.FREE_FORM_MESH:\n        case PatternType.LATTICE_FORM_MESH:\n        case PatternType.COONS_PATCH_MESH:\n        case PatternType.TENSOR_PATCH_MESH:\n          return new Shadings.Mesh(shading, matrix, xref, res);\n        default:\n          throw new Error('Unknown PatternType: ' + type);\n      }\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      UnsupportedManager.notify(UNSUPPORTED_FEATURES.shadingPattern);\n      warn(ex);\n      return new Shadings.Dummy();\n    }\n  };\n  return Pattern;\n})();\n\nvar Shadings = {};\n\n// A small number to offset the first/last color stops so we can insert ones to\n// support extend.  Number.MIN_VALUE appears to be too small and breaks the\n// extend. 1e-7 works in FF but chrome seems to use an even smaller sized number\n// internally so we have to go bigger.\nShadings.SMALL_NUMBER = 1e-2;\n\n// Radial and axial shading have very similar implementations\n// If needed, the implementations can be broken into two classes\nShadings.RadialAxial = (function RadialAxialClosure() {\n  function RadialAxial(dict, matrix, xref, res) {\n    this.matrix = matrix;\n    this.coordsArr = dict.get('Coords');\n    this.shadingType = dict.get('ShadingType');\n    this.type = 'Pattern';\n    var cs = dict.get('ColorSpace', 'CS');\n    cs = ColorSpace.parse(cs, xref, res);\n    this.cs = cs;\n\n    var t0 = 0.0, t1 = 1.0;\n    if (dict.has('Domain')) {\n      var domainArr = dict.get('Domain');\n      t0 = domainArr[0];\n      t1 = domainArr[1];\n    }\n\n    var extendStart = false, extendEnd = false;\n    if (dict.has('Extend')) {\n      var extendArr = dict.get('Extend');\n      extendStart = extendArr[0];\n      extendEnd = extendArr[1];\n    }\n\n    if (this.shadingType === PatternType.RADIAL &&\n       (!extendStart || !extendEnd)) {\n      // Radial gradient only currently works if either circle is fully within\n      // the other circle.\n      var x1 = this.coordsArr[0];\n      var y1 = this.coordsArr[1];\n      var r1 = this.coordsArr[2];\n      var x2 = this.coordsArr[3];\n      var y2 = this.coordsArr[4];\n      var r2 = this.coordsArr[5];\n      var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));\n      if (r1 <= r2 + distance &&\n          r2 <= r1 + distance) {\n        warn('Unsupported radial gradient.');\n      }\n    }\n\n    this.extendStart = extendStart;\n    this.extendEnd = extendEnd;\n\n    var fnObj = dict.get('Function');\n    var fn = PDFFunction.parseArray(xref, fnObj);\n\n    // 10 samples seems good enough for now, but probably won't work\n    // if there are sharp color changes. Ideally, we would implement\n    // the spec faithfully and add lossless optimizations.\n    var diff = t1 - t0;\n    var step = diff / 10;\n\n    var colorStops = this.colorStops = [];\n\n    // Protect against bad domains so we don't end up in an infinte loop below.\n    if (t0 >= t1 || step <= 0) {\n      // Acrobat doesn't seem to handle these cases so we'll ignore for\n      // now.\n      info('Bad shading domain.');\n      return;\n    }\n\n    var color = new Float32Array(cs.numComps), ratio = new Float32Array(1);\n    var rgbColor;\n    for (var i = t0; i <= t1; i += step) {\n      ratio[0] = i;\n      fn(ratio, 0, color, 0);\n      rgbColor = cs.getRgb(color, 0);\n      var cssColor = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);\n      colorStops.push([(i - t0) / diff, cssColor]);\n    }\n\n    var background = 'transparent';\n    if (dict.has('Background')) {\n      rgbColor = cs.getRgb(dict.get('Background'), 0);\n      background = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);\n    }\n\n    if (!extendStart) {\n      // Insert a color stop at the front and offset the first real color stop\n      // so it doesn't conflict with the one we insert.\n      colorStops.unshift([0, background]);\n      colorStops[1][0] += Shadings.SMALL_NUMBER;\n    }\n    if (!extendEnd) {\n      // Same idea as above in extendStart but for the end.\n      colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER;\n      colorStops.push([1, background]);\n    }\n\n    this.colorStops = colorStops;\n  }\n\n  RadialAxial.prototype = {\n    getIR: function RadialAxial_getIR() {\n      var coordsArr = this.coordsArr;\n      var shadingType = this.shadingType;\n      var type, p0, p1, r0, r1;\n      if (shadingType === PatternType.AXIAL) {\n        p0 = [coordsArr[0], coordsArr[1]];\n        p1 = [coordsArr[2], coordsArr[3]];\n        r0 = null;\n        r1 = null;\n        type = 'axial';\n      } else if (shadingType === PatternType.RADIAL) {\n        p0 = [coordsArr[0], coordsArr[1]];\n        p1 = [coordsArr[3], coordsArr[4]];\n        r0 = coordsArr[2];\n        r1 = coordsArr[5];\n        type = 'radial';\n      } else {\n        error('getPattern type unknown: ' + shadingType);\n      }\n\n      var matrix = this.matrix;\n      if (matrix) {\n        p0 = Util.applyTransform(p0, matrix);\n        p1 = Util.applyTransform(p1, matrix);\n      }\n\n      return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1];\n    }\n  };\n\n  return RadialAxial;\n})();\n\n// All mesh shading. For now, they will be presented as set of the triangles\n// to be drawn on the canvas and rgb color for each vertex.\nShadings.Mesh = (function MeshClosure() {\n  function MeshStreamReader(stream, context) {\n    this.stream = stream;\n    this.context = context;\n    this.buffer = 0;\n    this.bufferLength = 0;\n\n    var numComps = context.numComps;\n    this.tmpCompsBuf = new Float32Array(numComps);\n    var csNumComps = context.colorSpace;\n    this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) :\n                                           this.tmpCompsBuf;\n  }\n  MeshStreamReader.prototype = {\n    get hasData() {\n      if (this.stream.end) {\n        return this.stream.pos < this.stream.end;\n      }\n      if (this.bufferLength > 0) {\n        return true;\n      }\n      var nextByte = this.stream.getByte();\n      if (nextByte < 0) {\n        return false;\n      }\n      this.buffer = nextByte;\n      this.bufferLength = 8;\n      return true;\n    },\n    readBits: function MeshStreamReader_readBits(n) {\n      var buffer = this.buffer;\n      var bufferLength = this.bufferLength;\n      if (n === 32) {\n        if (bufferLength === 0) {\n          return ((this.stream.getByte() << 24) |\n            (this.stream.getByte() << 16) | (this.stream.getByte() << 8) |\n            this.stream.getByte()) >>> 0;\n        }\n        buffer = (buffer << 24) | (this.stream.getByte() << 16) |\n          (this.stream.getByte() << 8) | this.stream.getByte();\n        var nextByte = this.stream.getByte();\n        this.buffer = nextByte & ((1 << bufferLength) - 1);\n        return ((buffer << (8 - bufferLength)) |\n          ((nextByte & 0xFF) >> bufferLength)) >>> 0;\n      }\n      if (n === 8 && bufferLength === 0) {\n        return this.stream.getByte();\n      }\n      while (bufferLength < n) {\n        buffer = (buffer << 8) | this.stream.getByte();\n        bufferLength += 8;\n      }\n      bufferLength -= n;\n      this.bufferLength = bufferLength;\n      this.buffer = buffer & ((1 << bufferLength) - 1);\n      return buffer >> bufferLength;\n    },\n    align: function MeshStreamReader_align() {\n      this.buffer = 0;\n      this.bufferLength = 0;\n    },\n    readFlag: function MeshStreamReader_readFlag() {\n      return this.readBits(this.context.bitsPerFlag);\n    },\n    readCoordinate: function MeshStreamReader_readCoordinate() {\n      var bitsPerCoordinate = this.context.bitsPerCoordinate;\n      var xi = this.readBits(bitsPerCoordinate);\n      var yi = this.readBits(bitsPerCoordinate);\n      var decode = this.context.decode;\n      var scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) :\n        2.3283064365386963e-10; // 2 ^ -32\n      return [\n        xi * scale * (decode[1] - decode[0]) + decode[0],\n        yi * scale * (decode[3] - decode[2]) + decode[2]\n      ];\n    },\n    readComponents: function MeshStreamReader_readComponents() {\n      var numComps = this.context.numComps;\n      var bitsPerComponent = this.context.bitsPerComponent;\n      var scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) :\n        2.3283064365386963e-10; // 2 ^ -32\n      var decode = this.context.decode;\n      var components = this.tmpCompsBuf;\n      for (var i = 0, j = 4; i < numComps; i++, j += 2) {\n        var ci = this.readBits(bitsPerComponent);\n        components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j];\n      }\n      var color = this.tmpCsCompsBuf;\n      if (this.context.colorFn) {\n        this.context.colorFn(components, 0, color, 0);\n      }\n      return this.context.colorSpace.getRgb(color, 0);\n    }\n  };\n\n  function decodeType4Shading(mesh, reader) {\n    var coords = mesh.coords;\n    var colors = mesh.colors;\n    var operators = [];\n    var ps = []; // not maintaining cs since that will match ps\n    var verticesLeft = 0; // assuming we have all data to start a new triangle\n    while (reader.hasData) {\n      var f = reader.readFlag();\n      var coord = reader.readCoordinate();\n      var color = reader.readComponents();\n      if (verticesLeft === 0) { // ignoring flags if we started a triangle\n        assert(0 <= f && f <= 2, 'Unknown type4 flag');\n        switch (f) {\n          case 0:\n            verticesLeft = 3;\n            break;\n          case 1:\n            ps.push(ps[ps.length - 2], ps[ps.length - 1]);\n            verticesLeft = 1;\n            break;\n          case 2:\n            ps.push(ps[ps.length - 3], ps[ps.length - 1]);\n            verticesLeft = 1;\n            break;\n        }\n        operators.push(f);\n      }\n      ps.push(coords.length);\n      coords.push(coord);\n      colors.push(color);\n      verticesLeft--;\n\n      reader.align();\n    }\n\n    var psPacked = new Int32Array(ps);\n\n    mesh.figures.push({\n      type: 'triangles',\n      coords: psPacked,\n      colors: psPacked\n    });\n  }\n\n  function decodeType5Shading(mesh, reader, verticesPerRow) {\n    var coords = mesh.coords;\n    var colors = mesh.colors;\n    var ps = []; // not maintaining cs since that will match ps\n    while (reader.hasData) {\n      var coord = reader.readCoordinate();\n      var color = reader.readComponents();\n      ps.push(coords.length);\n      coords.push(coord);\n      colors.push(color);\n    }\n\n    var psPacked = new Int32Array(ps);\n\n    mesh.figures.push({\n      type: 'lattice',\n      coords: psPacked,\n      colors: psPacked,\n      verticesPerRow: verticesPerRow\n    });\n  }\n\n  var MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3;\n  var MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20;\n\n  var TRIANGLE_DENSITY = 20; // count of triangles per entire mesh bounds\n\n  var getB = (function getBClosure() {\n    function buildB(count) {\n      var lut = [];\n      for (var i = 0; i <= count; i++) {\n        var t = i / count, t_ = 1 - t;\n        lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_,\n          3 * t * t * t_, t * t * t]));\n      }\n      return lut;\n    }\n    var cache = [];\n    return function getB(count) {\n      if (!cache[count]) {\n        cache[count] = buildB(count);\n      }\n      return cache[count];\n    };\n  })();\n\n  function buildFigureFromPatch(mesh, index) {\n    var figure = mesh.figures[index];\n    assert(figure.type === 'patch', 'Unexpected patch mesh figure');\n\n    var coords = mesh.coords, colors = mesh.colors;\n    var pi = figure.coords;\n    var ci = figure.colors;\n\n    var figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0],\n                              coords[pi[12]][0], coords[pi[15]][0]);\n    var figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1],\n                              coords[pi[12]][1], coords[pi[15]][1]);\n    var figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0],\n                              coords[pi[12]][0], coords[pi[15]][0]);\n    var figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1],\n                              coords[pi[12]][1], coords[pi[15]][1]);\n    var splitXBy = Math.ceil((figureMaxX - figureMinX) * TRIANGLE_DENSITY /\n                             (mesh.bounds[2] - mesh.bounds[0]));\n    splitXBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT,\n               Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy));\n    var splitYBy = Math.ceil((figureMaxY - figureMinY) * TRIANGLE_DENSITY /\n                             (mesh.bounds[3] - mesh.bounds[1]));\n    splitYBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT,\n               Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy));\n\n    var verticesPerRow = splitXBy + 1;\n    var figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow);\n    var figureColors = new Int32Array((splitYBy + 1) * verticesPerRow);\n    var k = 0;\n    var cl = new Uint8Array(3), cr = new Uint8Array(3);\n    var c0 = colors[ci[0]], c1 = colors[ci[1]],\n      c2 = colors[ci[2]], c3 = colors[ci[3]];\n    var bRow = getB(splitYBy), bCol = getB(splitXBy);\n    for (var row = 0; row <= splitYBy; row++) {\n      cl[0] = ((c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy) | 0;\n      cl[1] = ((c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy) | 0;\n      cl[2] = ((c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy) | 0;\n\n      cr[0] = ((c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy) | 0;\n      cr[1] = ((c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy) | 0;\n      cr[2] = ((c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy) | 0;\n\n      for (var col = 0; col <= splitXBy; col++, k++) {\n        if ((row === 0 || row === splitYBy) &&\n            (col === 0 || col === splitXBy)) {\n          continue;\n        }\n        var x = 0, y = 0;\n        var q = 0;\n        for (var i = 0; i <= 3; i++) {\n          for (var j = 0; j <= 3; j++, q++) {\n            var m = bRow[row][i] * bCol[col][j];\n            x += coords[pi[q]][0] * m;\n            y += coords[pi[q]][1] * m;\n          }\n        }\n        figureCoords[k] = coords.length;\n        coords.push([x, y]);\n        figureColors[k] = colors.length;\n        var newColor = new Uint8Array(3);\n        newColor[0] = ((cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy) | 0;\n        newColor[1] = ((cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy) | 0;\n        newColor[2] = ((cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy) | 0;\n        colors.push(newColor);\n      }\n    }\n    figureCoords[0] = pi[0];\n    figureColors[0] = ci[0];\n    figureCoords[splitXBy] = pi[3];\n    figureColors[splitXBy] = ci[1];\n    figureCoords[verticesPerRow * splitYBy] = pi[12];\n    figureColors[verticesPerRow * splitYBy] = ci[2];\n    figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15];\n    figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3];\n\n    mesh.figures[index] = {\n      type: 'lattice',\n      coords: figureCoords,\n      colors: figureColors,\n      verticesPerRow: verticesPerRow\n    };\n  }\n\n  function decodeType6Shading(mesh, reader) {\n    // A special case of Type 7. The p11, p12, p21, p22 automatically filled\n    var coords = mesh.coords;\n    var colors = mesh.colors;\n    var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33\n    var cs = new Int32Array(4); // c00, c30, c03, c33\n    while (reader.hasData) {\n      var f = reader.readFlag();\n      assert(0 <= f && f <= 3, 'Unknown type6 flag');\n      var i, ii;\n      var pi = coords.length;\n      for (i = 0, ii = (f !== 0 ? 8 : 12); i < ii; i++) {\n        coords.push(reader.readCoordinate());\n      }\n      var ci = colors.length;\n      for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) {\n        colors.push(reader.readComponents());\n      }\n      var tmp1, tmp2, tmp3, tmp4;\n      switch (f) {\n        case 0:\n          ps[12] = pi + 3; ps[13] = pi + 4;  ps[14] = pi + 5;  ps[15] = pi + 6;\n          ps[ 8] = pi + 2; /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 7;\n          ps[ 4] = pi + 1; /* calculated below              */ ps[ 7] = pi + 8;\n          ps[ 0] = pi;     ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9;\n          cs[2] = ci + 1; cs[3] = ci + 2;\n          cs[0] = ci;     cs[1] = ci + 3;\n          break;\n        case 1:\n          tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15];\n          ps[12] = pi + 5; ps[13] = pi + 4;  ps[14] = pi + 3;  ps[15] = pi + 2;\n          ps[ 8] = pi + 6; /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 1;\n          ps[ 4] = pi + 7; /* calculated below              */ ps[ 7] = pi;\n          ps[ 0] = tmp1;   ps[ 1] = tmp2;    ps[ 2] = tmp3;    ps[ 3] = tmp4;\n          tmp1 = cs[2]; tmp2 = cs[3];\n          cs[2] = ci + 1; cs[3] = ci;\n          cs[0] = tmp1;   cs[1] = tmp2;\n          break;\n        case 2:\n          ps[12] = ps[15]; ps[13] = pi + 7; ps[14] = pi + 6;   ps[15] = pi + 5;\n          ps[ 8] = ps[11]; /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 4;\n          ps[ 4] = ps[7];  /* calculated below              */ ps[ 7] = pi + 3;\n          ps[ 0] = ps[3];  ps[ 1] = pi;     ps[ 2] = pi + 1;   ps[ 3] = pi + 2;\n          cs[2] = cs[3]; cs[3] = ci + 1;\n          cs[0] = cs[1]; cs[1] = ci;\n          break;\n        case 3:\n          ps[12] = ps[0];  ps[13] = ps[1];   ps[14] = ps[2];   ps[15] = ps[3];\n          ps[ 8] = pi;     /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 7;\n          ps[ 4] = pi + 1; /* calculated below              */ ps[ 7] = pi + 6;\n          ps[ 0] = pi + 2; ps[ 1] = pi + 3;  ps[ 2] = pi + 4;  ps[ 3] = pi + 5;\n          cs[2] = cs[0]; cs[3] = cs[1];\n          cs[0] = ci;    cs[1] = ci + 1;\n          break;\n      }\n      // set p11, p12, p21, p22\n      ps[5] = coords.length;\n      coords.push([\n        (-4 * coords[ps[0]][0] - coords[ps[15]][0] +\n          6 * (coords[ps[4]][0] + coords[ps[1]][0]) -\n          2 * (coords[ps[12]][0] + coords[ps[3]][0]) +\n          3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9,\n        (-4 * coords[ps[0]][1] - coords[ps[15]][1] +\n          6 * (coords[ps[4]][1] + coords[ps[1]][1]) -\n          2 * (coords[ps[12]][1] + coords[ps[3]][1]) +\n          3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9\n      ]);\n      ps[6] = coords.length;\n      coords.push([\n        (-4 * coords[ps[3]][0] - coords[ps[12]][0] +\n          6 * (coords[ps[2]][0] + coords[ps[7]][0]) -\n          2 * (coords[ps[0]][0] + coords[ps[15]][0]) +\n          3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9,\n        (-4 * coords[ps[3]][1] - coords[ps[12]][1] +\n          6 * (coords[ps[2]][1] + coords[ps[7]][1]) -\n          2 * (coords[ps[0]][1] + coords[ps[15]][1]) +\n          3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9\n      ]);\n      ps[9] = coords.length;\n      coords.push([\n        (-4 * coords[ps[12]][0] - coords[ps[3]][0] +\n          6 * (coords[ps[8]][0] + coords[ps[13]][0]) -\n          2 * (coords[ps[0]][0] + coords[ps[15]][0]) +\n          3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9,\n        (-4 * coords[ps[12]][1] - coords[ps[3]][1] +\n          6 * (coords[ps[8]][1] + coords[ps[13]][1]) -\n          2 * (coords[ps[0]][1] + coords[ps[15]][1]) +\n          3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9\n      ]);\n      ps[10] = coords.length;\n      coords.push([\n        (-4 * coords[ps[15]][0] - coords[ps[0]][0] +\n          6 * (coords[ps[11]][0] + coords[ps[14]][0]) -\n          2 * (coords[ps[12]][0] + coords[ps[3]][0]) +\n          3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9,\n        (-4 * coords[ps[15]][1] - coords[ps[0]][1] +\n          6 * (coords[ps[11]][1] + coords[ps[14]][1]) -\n          2 * (coords[ps[12]][1] + coords[ps[3]][1]) +\n          3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9\n      ]);\n      mesh.figures.push({\n        type: 'patch',\n        coords: new Int32Array(ps), // making copies of ps and cs\n        colors: new Int32Array(cs)\n      });\n    }\n  }\n\n  function decodeType7Shading(mesh, reader) {\n    var coords = mesh.coords;\n    var colors = mesh.colors;\n    var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33\n    var cs = new Int32Array(4); // c00, c30, c03, c33\n    while (reader.hasData) {\n      var f = reader.readFlag();\n      assert(0 <= f && f <= 3, 'Unknown type7 flag');\n      var i, ii;\n      var pi = coords.length;\n      for (i = 0, ii = (f !== 0 ? 12 : 16); i < ii; i++) {\n        coords.push(reader.readCoordinate());\n      }\n      var ci = colors.length;\n      for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) {\n        colors.push(reader.readComponents());\n      }\n      var tmp1, tmp2, tmp3, tmp4;\n      switch (f) {\n        case 0:\n          ps[12] = pi + 3; ps[13] = pi + 4;  ps[14] = pi + 5;  ps[15] = pi + 6;\n          ps[ 8] = pi + 2; ps[ 9] = pi + 13; ps[10] = pi + 14; ps[11] = pi + 7;\n          ps[ 4] = pi + 1; ps[ 5] = pi + 12; ps[ 6] = pi + 15; ps[ 7] = pi + 8;\n          ps[ 0] = pi;     ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9;\n          cs[2] = ci + 1; cs[3] = ci + 2;\n          cs[0] = ci;     cs[1] = ci + 3;\n          break;\n        case 1:\n          tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15];\n          ps[12] = pi + 5; ps[13] = pi + 4;  ps[14] = pi + 3;  ps[15] = pi + 2;\n          ps[ 8] = pi + 6; ps[ 9] = pi + 11; ps[10] = pi + 10; ps[11] = pi + 1;\n          ps[ 4] = pi + 7; ps[ 5] = pi + 8;  ps[ 6] = pi + 9;  ps[ 7] = pi;\n          ps[ 0] = tmp1;   ps[ 1] = tmp2;    ps[ 2] = tmp3;    ps[ 3] = tmp4;\n          tmp1 = cs[2]; tmp2 = cs[3];\n          cs[2] = ci + 1; cs[3] = ci;\n          cs[0] = tmp1;   cs[1] = tmp2;\n          break;\n        case 2:\n          ps[12] = ps[15]; ps[13] = pi + 7; ps[14] = pi + 6;  ps[15] = pi + 5;\n          ps[ 8] = ps[11]; ps[ 9] = pi + 8; ps[10] = pi + 11; ps[11] = pi + 4;\n          ps[ 4] = ps[7];  ps[ 5] = pi + 9; ps[ 6] = pi + 10; ps[ 7] = pi + 3;\n          ps[ 0] = ps[3];  ps[ 1] = pi;     ps[ 2] = pi + 1;  ps[ 3] = pi + 2;\n          cs[2] = cs[3]; cs[3] = ci + 1;\n          cs[0] = cs[1]; cs[1] = ci;\n          break;\n        case 3:\n          ps[12] = ps[0];  ps[13] = ps[1];   ps[14] = ps[2];   ps[15] = ps[3];\n          ps[ 8] = pi;     ps[ 9] = pi + 9;  ps[10] = pi + 8;  ps[11] = pi + 7;\n          ps[ 4] = pi + 1; ps[ 5] = pi + 10; ps[ 6] = pi + 11; ps[ 7] = pi + 6;\n          ps[ 0] = pi + 2; ps[ 1] = pi + 3;  ps[ 2] = pi + 4;  ps[ 3] = pi + 5;\n          cs[2] = cs[0]; cs[3] = cs[1];\n          cs[0] = ci;    cs[1] = ci + 1;\n          break;\n      }\n      mesh.figures.push({\n        type: 'patch',\n        coords: new Int32Array(ps), // making copies of ps and cs\n        colors: new Int32Array(cs)\n      });\n    }\n  }\n\n  function updateBounds(mesh) {\n    var minX = mesh.coords[0][0], minY = mesh.coords[0][1],\n      maxX = minX, maxY = minY;\n    for (var i = 1, ii = mesh.coords.length; i < ii; i++) {\n      var x = mesh.coords[i][0], y = mesh.coords[i][1];\n      minX = minX > x ? x : minX;\n      minY = minY > y ? y : minY;\n      maxX = maxX < x ? x : maxX;\n      maxY = maxY < y ? y : maxY;\n    }\n    mesh.bounds = [minX, minY, maxX, maxY];\n  }\n\n  function packData(mesh) {\n    var i, ii, j, jj;\n\n    var coords = mesh.coords;\n    var coordsPacked = new Float32Array(coords.length * 2);\n    for (i = 0, j = 0, ii = coords.length; i < ii; i++) {\n      var xy = coords[i];\n      coordsPacked[j++] = xy[0];\n      coordsPacked[j++] = xy[1];\n    }\n    mesh.coords = coordsPacked;\n\n    var colors = mesh.colors;\n    var colorsPacked = new Uint8Array(colors.length * 3);\n    for (i = 0, j = 0, ii = colors.length; i < ii; i++) {\n      var c = colors[i];\n      colorsPacked[j++] = c[0];\n      colorsPacked[j++] = c[1];\n      colorsPacked[j++] = c[2];\n    }\n    mesh.colors = colorsPacked;\n\n    var figures = mesh.figures;\n    for (i = 0, ii = figures.length; i < ii; i++) {\n      var figure = figures[i], ps = figure.coords, cs = figure.colors;\n      for (j = 0, jj = ps.length; j < jj; j++) {\n        ps[j] *= 2;\n        cs[j] *= 3;\n      }\n    }\n  }\n\n  function Mesh(stream, matrix, xref, res) {\n    assert(isStream(stream), 'Mesh data is not a stream');\n    var dict = stream.dict;\n    this.matrix = matrix;\n    this.shadingType = dict.get('ShadingType');\n    this.type = 'Pattern';\n    this.bbox = dict.get('BBox');\n    var cs = dict.get('ColorSpace', 'CS');\n    cs = ColorSpace.parse(cs, xref, res);\n    this.cs = cs;\n    this.background = dict.has('Background') ?\n      cs.getRgb(dict.get('Background'), 0) : null;\n\n    var fnObj = dict.get('Function');\n    var fn = fnObj ? PDFFunction.parseArray(xref, fnObj) : null;\n\n    this.coords = [];\n    this.colors = [];\n    this.figures = [];\n\n    var decodeContext = {\n      bitsPerCoordinate: dict.get('BitsPerCoordinate'),\n      bitsPerComponent: dict.get('BitsPerComponent'),\n      bitsPerFlag: dict.get('BitsPerFlag'),\n      decode: dict.get('Decode'),\n      colorFn: fn,\n      colorSpace: cs,\n      numComps: fn ? 1 : cs.numComps\n    };\n    var reader = new MeshStreamReader(stream, decodeContext);\n\n    var patchMesh = false;\n    switch (this.shadingType) {\n      case PatternType.FREE_FORM_MESH:\n        decodeType4Shading(this, reader);\n        break;\n      case PatternType.LATTICE_FORM_MESH:\n        var verticesPerRow = dict.get('VerticesPerRow') | 0;\n        assert(verticesPerRow >= 2, 'Invalid VerticesPerRow');\n        decodeType5Shading(this, reader, verticesPerRow);\n        break;\n      case PatternType.COONS_PATCH_MESH:\n        decodeType6Shading(this, reader);\n        patchMesh = true;\n        break;\n      case PatternType.TENSOR_PATCH_MESH:\n        decodeType7Shading(this, reader);\n        patchMesh = true;\n        break;\n      default:\n        error('Unsupported mesh type.');\n        break;\n    }\n\n    if (patchMesh) {\n      // dirty bounds calculation for determining, how dense shall be triangles\n      updateBounds(this);\n      for (var i = 0, ii = this.figures.length; i < ii; i++) {\n        buildFigureFromPatch(this, i);\n      }\n    }\n    // calculate bounds\n    updateBounds(this);\n\n    packData(this);\n  }\n\n  Mesh.prototype = {\n    getIR: function Mesh_getIR() {\n      return ['Mesh', this.shadingType, this.coords, this.colors, this.figures,\n        this.bounds, this.matrix, this.bbox, this.background];\n    }\n  };\n\n  return Mesh;\n})();\n\nShadings.Dummy = (function DummyClosure() {\n  function Dummy() {\n    this.type = 'Pattern';\n  }\n\n  Dummy.prototype = {\n    getIR: function Dummy_getIR() {\n      return ['Dummy'];\n    }\n  };\n  return Dummy;\n})();\n\nfunction getTilingPatternIR(operatorList, dict, args) {\n  var matrix = dict.get('Matrix');\n  var bbox = dict.get('BBox');\n  var xstep = dict.get('XStep');\n  var ystep = dict.get('YStep');\n  var paintType = dict.get('PaintType');\n  var tilingType = dict.get('TilingType');\n\n  return [\n    'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep,\n    paintType, tilingType\n  ];\n}\n\n\nvar PartialEvaluator = (function PartialEvaluatorClosure() {\n  function PartialEvaluator(pdfManager, xref, handler, pageIndex,\n                            uniquePrefix, idCounters, fontCache) {\n    this.pdfManager = pdfManager;\n    this.xref = xref;\n    this.handler = handler;\n    this.pageIndex = pageIndex;\n    this.uniquePrefix = uniquePrefix;\n    this.idCounters = idCounters;\n    this.fontCache = fontCache;\n  }\n\n  // Trying to minimize Date.now() usage and check every 100 time\n  var TIME_SLOT_DURATION_MS = 20;\n  var CHECK_TIME_EVERY = 100;\n  function TimeSlotManager() {\n    this.reset();\n  }\n  TimeSlotManager.prototype = {\n    check: function TimeSlotManager_check() {\n      if (++this.checked < CHECK_TIME_EVERY) {\n        return false;\n      }\n      this.checked = 0;\n      return this.endTime <= Date.now();\n    },\n    reset: function TimeSlotManager_reset() {\n      this.endTime = Date.now() + TIME_SLOT_DURATION_MS;\n      this.checked = 0;\n    }\n  };\n\n  var deferred = Promise.resolve();\n\n  var TILING_PATTERN = 1, SHADING_PATTERN = 2;\n\n  PartialEvaluator.prototype = {\n    hasBlendModes: function PartialEvaluator_hasBlendModes(resources) {\n      if (!isDict(resources)) {\n        return false;\n      }\n\n      var processed = Object.create(null);\n      if (resources.objId) {\n        processed[resources.objId] = true;\n      }\n\n      var nodes = [resources];\n      while (nodes.length) {\n        var key;\n        var node = nodes.shift();\n        // First check the current resources for blend modes.\n        var graphicStates = node.get('ExtGState');\n        if (isDict(graphicStates)) {\n          graphicStates = graphicStates.getAll();\n          for (key in graphicStates) {\n            var graphicState = graphicStates[key];\n            var bm = graphicState['BM'];\n            if (isName(bm) && bm.name !== 'Normal') {\n              return true;\n            }\n          }\n        }\n        // Descend into the XObjects to look for more resources and blend modes.\n        var xObjects = node.get('XObject');\n        if (!isDict(xObjects)) {\n          continue;\n        }\n        xObjects = xObjects.getAll();\n        for (key in xObjects) {\n          var xObject = xObjects[key];\n          if (!isStream(xObject)) {\n            continue;\n          }\n          if (xObject.dict.objId) {\n            if (processed[xObject.dict.objId]) {\n              // stream has objId and is processed already\n              continue;\n            }\n            processed[xObject.dict.objId] = true;\n          }\n          var xResources = xObject.dict.get('Resources');\n          // Checking objId to detect an infinite loop.\n          if (isDict(xResources) &&\n              (!xResources.objId || !processed[xResources.objId])) {\n            nodes.push(xResources);\n            if (xResources.objId) {\n              processed[xResources.objId] = true;\n            }\n          }\n        }\n      }\n      return false;\n    },\n\n    buildFormXObject: function PartialEvaluator_buildFormXObject(resources,\n                                                                 xobj, smask,\n                                                                 operatorList,\n                                                                 initialState) {\n      var matrix = xobj.dict.get('Matrix');\n      var bbox = xobj.dict.get('BBox');\n      var group = xobj.dict.get('Group');\n      if (group) {\n        var groupOptions = {\n          matrix: matrix,\n          bbox: bbox,\n          smask: smask,\n          isolated: false,\n          knockout: false\n        };\n\n        var groupSubtype = group.get('S');\n        var colorSpace;\n        if (isName(groupSubtype) && groupSubtype.name === 'Transparency') {\n          groupOptions.isolated = (group.get('I') || false);\n          groupOptions.knockout = (group.get('K') || false);\n          colorSpace = (group.has('CS') ?\n            ColorSpace.parse(group.get('CS'), this.xref, resources) : null);\n        }\n\n        if (smask && smask.backdrop) {\n          colorSpace = colorSpace || ColorSpace.singletons.rgb;\n          smask.backdrop = colorSpace.getRgb(smask.backdrop, 0);\n        }\n\n        operatorList.addOp(OPS.beginGroup, [groupOptions]);\n      }\n\n      operatorList.addOp(OPS.paintFormXObjectBegin, [matrix, bbox]);\n\n      return this.getOperatorList(xobj,\n        (xobj.dict.get('Resources') || resources), operatorList, initialState).\n        then(function () {\n          operatorList.addOp(OPS.paintFormXObjectEnd, []);\n\n          if (group) {\n            operatorList.addOp(OPS.endGroup, [groupOptions]);\n          }\n        });\n    },\n\n    buildPaintImageXObject:\n        function PartialEvaluator_buildPaintImageXObject(resources, image,\n                                                         inline, operatorList,\n                                                         cacheKey, imageCache) {\n      var self = this;\n      var dict = image.dict;\n      var w = dict.get('Width', 'W');\n      var h = dict.get('Height', 'H');\n\n      if (!(w && isNum(w)) || !(h && isNum(h))) {\n        warn('Image dimensions are missing, or not numbers.');\n        return;\n      }\n      if (PDFJS.maxImageSize !== -1 && w * h > PDFJS.maxImageSize) {\n        warn('Image exceeded maximum allowed size and was removed.');\n        return;\n      }\n\n      var imageMask = (dict.get('ImageMask', 'IM') || false);\n      var imgData, args;\n      if (imageMask) {\n        // This depends on a tmpCanvas being filled with the\n        // current fillStyle, such that processing the pixel\n        // data can't be done here. Instead of creating a\n        // complete PDFImage, only read the information needed\n        // for later.\n\n        var width = dict.get('Width', 'W');\n        var height = dict.get('Height', 'H');\n        var bitStrideLength = (width + 7) >> 3;\n        var imgArray = image.getBytes(bitStrideLength * height);\n        var decode = dict.get('Decode', 'D');\n        var inverseDecode = (!!decode && decode[0] > 0);\n\n        imgData = PDFImage.createMask(imgArray, width, height,\n                                      image instanceof DecodeStream,\n                                      inverseDecode);\n        imgData.cached = true;\n        args = [imgData];\n        operatorList.addOp(OPS.paintImageMaskXObject, args);\n        if (cacheKey) {\n          imageCache[cacheKey] = {\n            fn: OPS.paintImageMaskXObject,\n            args: args\n          };\n        }\n        return;\n      }\n\n      var softMask = (dict.get('SMask', 'SM') || false);\n      var mask = (dict.get('Mask') || false);\n\n      var SMALL_IMAGE_DIMENSIONS = 200;\n      // Inlining small images into the queue as RGB data\n      if (inline && !softMask && !mask && !(image instanceof JpegStream) &&\n          (w + h) < SMALL_IMAGE_DIMENSIONS) {\n        var imageObj = new PDFImage(this.xref, resources, image,\n                                    inline, null, null);\n        // We force the use of RGBA_32BPP images here, because we can't handle\n        // any other kind.\n        imgData = imageObj.createImageData(/* forceRGBA = */ true);\n        operatorList.addOp(OPS.paintInlineImageXObject, [imgData]);\n        return;\n      }\n\n      // If there is no imageMask, create the PDFImage and a lot\n      // of image processing can be done here.\n      var uniquePrefix = (this.uniquePrefix || '');\n      var objId = 'img_' + uniquePrefix + (++this.idCounters.obj);\n      operatorList.addDependency(objId);\n      args = [objId, w, h];\n\n      if (!softMask && !mask && image instanceof JpegStream &&\n          image.isNativelySupported(this.xref, resources)) {\n        // These JPEGs don't need any more processing so we can just send it.\n        operatorList.addOp(OPS.paintJpegXObject, args);\n        this.handler.send('obj',\n          [objId, this.pageIndex, 'JpegStream', image.getIR()]);\n        return;\n      }\n\n      PDFImage.buildImage(self.handler, self.xref, resources, image, inline).\n        then(function(imageObj) {\n          var imgData = imageObj.createImageData(/* forceRGBA = */ false);\n          self.handler.send('obj', [objId, self.pageIndex, 'Image', imgData],\n            [imgData.data.buffer]);\n        }).then(undefined, function (reason) {\n          warn('Unable to decode image: ' + reason);\n          self.handler.send('obj', [objId, self.pageIndex, 'Image', null]);\n        });\n\n      operatorList.addOp(OPS.paintImageXObject, args);\n      if (cacheKey) {\n        imageCache[cacheKey] = {\n          fn: OPS.paintImageXObject,\n          args: args\n        };\n      }\n    },\n\n    handleSMask: function PartialEvaluator_handleSmask(smask, resources,\n                                                       operatorList,\n                                                       stateManager) {\n      var smaskContent = smask.get('G');\n      var smaskOptions = {\n        subtype: smask.get('S').name,\n        backdrop: smask.get('BC')\n      };\n      return this.buildFormXObject(resources, smaskContent, smaskOptions,\n                            operatorList, stateManager.state.clone());\n    },\n\n    handleTilingType:\n        function PartialEvaluator_handleTilingType(fn, args, resources,\n                                                   pattern, patternDict,\n                                                   operatorList) {\n      // Create an IR of the pattern code.\n      var tilingOpList = new OperatorList();\n      return this.getOperatorList(pattern,\n        (patternDict.get('Resources') || resources), tilingOpList).\n        then(function () {\n          // Add the dependencies to the parent operator list so they are\n          // resolved before sub operator list is executed synchronously.\n          operatorList.addDependencies(tilingOpList.dependencies);\n          operatorList.addOp(fn, getTilingPatternIR({\n            fnArray: tilingOpList.fnArray,\n            argsArray: tilingOpList.argsArray\n          }, patternDict, args));\n        });\n    },\n\n    handleSetFont:\n        function PartialEvaluator_handleSetFont(resources, fontArgs, fontRef,\n                                                operatorList, state) {\n      // TODO(mack): Not needed?\n      var fontName;\n      if (fontArgs) {\n        fontArgs = fontArgs.slice();\n        fontName = fontArgs[0].name;\n      }\n\n      var self = this;\n      return this.loadFont(fontName, fontRef, this.xref, resources).then(\n          function (translated) {\n        if (!translated.font.isType3Font) {\n          return translated;\n        }\n        return translated.loadType3Data(self, resources, operatorList).then(\n            function () {\n          return translated;\n        });\n      }).then(function (translated) {\n        state.font = translated.font;\n        translated.send(self.handler);\n        return translated.loadedName;\n      });\n    },\n\n    handleText: function PartialEvaluator_handleText(chars, state) {\n      var font = state.font;\n      var glyphs = font.charsToGlyphs(chars);\n      var isAddToPathSet = !!(state.textRenderingMode &\n                              TextRenderingMode.ADD_TO_PATH_FLAG);\n      if (font.data && (isAddToPathSet || PDFJS.disableFontFace)) {\n        var buildPath = function (fontChar) {\n          if (!font.renderer.hasBuiltPath(fontChar)) {\n            var path = font.renderer.getPathJs(fontChar);\n            this.handler.send('commonobj', [\n              font.loadedName + '_path_' + fontChar,\n              'FontPath',\n              path\n            ]);\n          }\n        }.bind(this);\n\n        for (var i = 0, ii = glyphs.length; i < ii; i++) {\n          var glyph = glyphs[i];\n          if (glyph === null) {\n            continue;\n          }\n          buildPath(glyph.fontChar);\n\n          // If the glyph has an accent we need to build a path for its\n          // fontChar too, otherwise CanvasGraphics_paintChar will fail.\n          var accent = glyph.accent;\n          if (accent && accent.fontChar) {\n            buildPath(accent.fontChar);\n          }\n        }\n      }\n\n      return glyphs;\n    },\n\n    setGState: function PartialEvaluator_setGState(resources, gState,\n                                                   operatorList, xref,\n                                                   stateManager) {\n      // This array holds the converted/processed state data.\n      var gStateObj = [];\n      var gStateMap = gState.map;\n      var self = this;\n      var promise = Promise.resolve();\n      for (var key in gStateMap) {\n        var value = gStateMap[key];\n        switch (key) {\n          case 'Type':\n            break;\n          case 'LW':\n          case 'LC':\n          case 'LJ':\n          case 'ML':\n          case 'D':\n          case 'RI':\n          case 'FL':\n          case 'CA':\n          case 'ca':\n            gStateObj.push([key, value]);\n            break;\n          case 'Font':\n            promise = promise.then(function () {\n              return self.handleSetFont(resources, null, value[0],\n                                        operatorList, stateManager.state).\n                then(function (loadedName) {\n                  operatorList.addDependency(loadedName);\n                  gStateObj.push([key, [loadedName, value[1]]]);\n                });\n            });\n            break;\n          case 'BM':\n            gStateObj.push([key, value]);\n            break;\n          case 'SMask':\n            if (isName(value) && value.name === 'None') {\n              gStateObj.push([key, false]);\n              break;\n            }\n            var dict = xref.fetchIfRef(value);\n            if (isDict(dict)) {\n              promise = promise.then(function () {\n                return self.handleSMask(dict, resources, operatorList,\n                                        stateManager);\n              });\n              gStateObj.push([key, true]);\n            } else {\n              warn('Unsupported SMask type');\n            }\n\n            break;\n          // Only generate info log messages for the following since\n          // they are unlikely to have a big impact on the rendering.\n          case 'OP':\n          case 'op':\n          case 'OPM':\n          case 'BG':\n          case 'BG2':\n          case 'UCR':\n          case 'UCR2':\n          case 'TR':\n          case 'TR2':\n          case 'HT':\n          case 'SM':\n          case 'SA':\n          case 'AIS':\n          case 'TK':\n            // TODO implement these operators.\n            info('graphic state operator ' + key);\n            break;\n          default:\n            info('Unknown graphic state operator ' + key);\n            break;\n        }\n      }\n      return promise.then(function () {\n        if (gStateObj.length >= 0) {\n          operatorList.addOp(OPS.setGState, [gStateObj]);\n        }\n      });\n    },\n\n    loadFont: function PartialEvaluator_loadFont(fontName, font, xref,\n                                                 resources) {\n\n      function errorFont() {\n        return Promise.resolve(new TranslatedFont('g_font_error',\n          new ErrorFont('Font ' + fontName + ' is not available'), font));\n      }\n      var fontRef;\n      if (font) { // Loading by ref.\n        assert(isRef(font));\n        fontRef = font;\n      } else { // Loading by name.\n        var fontRes = resources.get('Font');\n        if (fontRes) {\n          fontRef = fontRes.getRaw(fontName);\n        } else {\n          warn('fontRes not available');\n          return errorFont();\n        }\n      }\n      if (!fontRef) {\n        warn('fontRef not available');\n        return errorFont();\n      }\n\n      if (this.fontCache.has(fontRef)) {\n        return this.fontCache.get(fontRef);\n      }\n\n      font = xref.fetchIfRef(fontRef);\n      if (!isDict(font)) {\n        return errorFont();\n      }\n\n      // We are holding font.translated references just for fontRef that are not\n      // dictionaries (Dict). See explanation below.\n      if (font.translated) {\n        return font.translated;\n      }\n\n      var fontCapability = createPromiseCapability();\n\n      var preEvaluatedFont = this.preEvaluateFont(font, xref);\n      var descriptor = preEvaluatedFont.descriptor;\n      var fontID = fontRef.num + '_' + fontRef.gen;\n      if (isDict(descriptor)) {\n        if (!descriptor.fontAliases) {\n          descriptor.fontAliases = Object.create(null);\n        }\n\n        var fontAliases = descriptor.fontAliases;\n        var hash = preEvaluatedFont.hash;\n        if (fontAliases[hash]) {\n          var aliasFontRef = fontAliases[hash].aliasRef;\n          if (aliasFontRef && this.fontCache.has(aliasFontRef)) {\n            this.fontCache.putAlias(fontRef, aliasFontRef);\n            return this.fontCache.get(fontRef);\n          }\n        }\n\n        if (!fontAliases[hash]) {\n          fontAliases[hash] = {\n            fontID: Font.getFontID()\n          };\n        }\n\n        fontAliases[hash].aliasRef = fontRef;\n        fontID = fontAliases[hash].fontID;\n      }\n\n      // Workaround for bad PDF generators that don't reference fonts\n      // properly, i.e. by not using an object identifier.\n      // Check if the fontRef is a Dict (as opposed to a standard object),\n      // in which case we don't cache the font and instead reference it by\n      // fontName in font.loadedName below.\n      var fontRefIsDict = isDict(fontRef);\n      if (!fontRefIsDict) {\n        this.fontCache.put(fontRef, fontCapability.promise);\n      }\n\n      // Keep track of each font we translated so the caller can\n      // load them asynchronously before calling display on a page.\n      font.loadedName = 'g_font_' + (fontRefIsDict ?\n        fontName.replace(/\\W/g, '') : fontID);\n\n      font.translated = fontCapability.promise;\n\n      // TODO move promises into translate font\n      var translatedPromise;\n      try {\n        translatedPromise = Promise.resolve(\n          this.translateFont(preEvaluatedFont, xref));\n      } catch (e) {\n        translatedPromise = Promise.reject(e);\n      }\n\n      translatedPromise.then(function (translatedFont) {\n        if (translatedFont.fontType !== undefined) {\n          var xrefFontStats = xref.stats.fontTypes;\n          xrefFontStats[translatedFont.fontType] = true;\n        }\n\n        fontCapability.resolve(new TranslatedFont(font.loadedName,\n          translatedFont, font));\n      }, function (reason) {\n        // TODO fontCapability.reject?\n        UnsupportedManager.notify(UNSUPPORTED_FEATURES.font);\n\n        try {\n          // error, but it's still nice to have font type reported\n          var descriptor = preEvaluatedFont.descriptor;\n          var fontFile3 = descriptor && descriptor.get('FontFile3');\n          var subtype = fontFile3 && fontFile3.get('Subtype');\n          var fontType = getFontType(preEvaluatedFont.type,\n                                     subtype && subtype.name);\n          var xrefFontStats = xref.stats.fontTypes;\n          xrefFontStats[fontType] = true;\n        } catch (ex) { }\n\n        fontCapability.resolve(new TranslatedFont(font.loadedName,\n          new ErrorFont(reason instanceof Error ? reason.message : reason),\n          font));\n      });\n      return fontCapability.promise;\n    },\n\n    buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) {\n      var lastIndex = operatorList.length - 1;\n      if (!args) {\n        args = [];\n      }\n      if (lastIndex < 0 ||\n          operatorList.fnArray[lastIndex] !== OPS.constructPath) {\n        operatorList.addOp(OPS.constructPath, [[fn], args]);\n      } else {\n        var opArgs = operatorList.argsArray[lastIndex];\n        opArgs[0].push(fn);\n        Array.prototype.push.apply(opArgs[1], args);\n      }\n    },\n\n    handleColorN: function PartialEvaluator_handleColorN(operatorList, fn, args,\n          cs, patterns, resources, xref) {\n      // compile tiling patterns\n      var patternName = args[args.length - 1];\n      // SCN/scn applies patterns along with normal colors\n      var pattern;\n      if (isName(patternName) &&\n          (pattern = patterns.get(patternName.name))) {\n        var dict = (isStream(pattern) ? pattern.dict : pattern);\n        var typeNum = dict.get('PatternType');\n\n        if (typeNum === TILING_PATTERN) {\n          var color = cs.base ? cs.base.getRgb(args, 0) : null;\n          return this.handleTilingType(fn, color, resources, pattern,\n                                       dict, operatorList);\n        } else if (typeNum === SHADING_PATTERN) {\n          var shading = dict.get('Shading');\n          var matrix = dict.get('Matrix');\n          pattern = Pattern.parseShading(shading, matrix, xref, resources);\n          operatorList.addOp(fn, pattern.getIR());\n          return Promise.resolve();\n        } else {\n          return Promise.reject('Unknown PatternType: ' + typeNum);\n        }\n      }\n      // TODO shall we fail here?\n      operatorList.addOp(fn, args);\n      return Promise.resolve();\n    },\n\n    getOperatorList: function PartialEvaluator_getOperatorList(stream,\n                                                               resources,\n                                                               operatorList,\n                                                               initialState) {\n\n      var self = this;\n      var xref = this.xref;\n      var imageCache = {};\n\n      assert(operatorList);\n\n      resources = (resources || Dict.empty);\n      var xobjs = (resources.get('XObject') || Dict.empty);\n      var patterns = (resources.get('Pattern') || Dict.empty);\n      var stateManager = new StateManager(initialState || new EvalState());\n      var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);\n      var timeSlotManager = new TimeSlotManager();\n\n      return new Promise(function next(resolve, reject) {\n        timeSlotManager.reset();\n        var stop, operation = {}, i, ii, cs;\n        while (!(stop = timeSlotManager.check())) {\n          // The arguments parsed by read() are used beyond this loop, so we\n          // cannot reuse the same array on each iteration. Therefore we pass\n          // in |null| as the initial value (see the comment on\n          // EvaluatorPreprocessor_read() for why).\n          operation.args = null;\n          if (!(preprocessor.read(operation))) {\n            break;\n          }\n          var args = operation.args;\n          var fn = operation.fn;\n\n          switch (fn | 0) {\n            case OPS.paintXObject:\n              if (args[0].code) {\n                break;\n              }\n              // eagerly compile XForm objects\n              var name = args[0].name;\n              if (imageCache[name] !== undefined) {\n                operatorList.addOp(imageCache[name].fn, imageCache[name].args);\n                args = null;\n                continue;\n              }\n\n              var xobj = xobjs.get(name);\n              if (xobj) {\n                assert(isStream(xobj), 'XObject should be a stream');\n\n                var type = xobj.dict.get('Subtype');\n                assert(isName(type),\n                  'XObject should have a Name subtype');\n\n                if (type.name === 'Form') {\n                  stateManager.save();\n                  return self.buildFormXObject(resources, xobj, null,\n                                               operatorList,\n                                               stateManager.state.clone()).\n                    then(function () {\n                      stateManager.restore();\n                      next(resolve, reject);\n                    }, reject);\n                } else if (type.name === 'Image') {\n                  self.buildPaintImageXObject(resources, xobj, false,\n                    operatorList, name, imageCache);\n                  args = null;\n                  continue;\n                } else if (type.name === 'PS') {\n                  // PostScript XObjects are unused when viewing documents.\n                  // See section 4.7.1 of Adobe's PDF reference.\n                  info('Ignored XObject subtype PS');\n                  continue;\n                } else {\n                  error('Unhandled XObject subtype ' + type.name);\n                }\n              }\n              break;\n            case OPS.setFont:\n              var fontSize = args[1];\n              // eagerly collect all fonts\n              return self.handleSetFont(resources, args, null,\n                                        operatorList, stateManager.state).\n                then(function (loadedName) {\n                  operatorList.addDependency(loadedName);\n                  operatorList.addOp(OPS.setFont, [loadedName, fontSize]);\n                  next(resolve, reject);\n                }, reject);\n            case OPS.endInlineImage:\n              var cacheKey = args[0].cacheKey;\n              if (cacheKey) {\n                var cacheEntry = imageCache[cacheKey];\n                if (cacheEntry !== undefined) {\n                  operatorList.addOp(cacheEntry.fn, cacheEntry.args);\n                  args = null;\n                  continue;\n                }\n              }\n              self.buildPaintImageXObject(resources, args[0], true,\n                operatorList, cacheKey, imageCache);\n              args = null;\n              continue;\n            case OPS.showText:\n              args[0] = self.handleText(args[0], stateManager.state);\n              break;\n            case OPS.showSpacedText:\n              var arr = args[0];\n              var combinedGlyphs = [];\n              var arrLength = arr.length;\n              for (i = 0; i < arrLength; ++i) {\n                var arrItem = arr[i];\n                if (isString(arrItem)) {\n                  Array.prototype.push.apply(combinedGlyphs,\n                    self.handleText(arrItem, stateManager.state));\n                } else if (isNum(arrItem)) {\n                  combinedGlyphs.push(arrItem);\n                }\n              }\n              args[0] = combinedGlyphs;\n              fn = OPS.showText;\n              break;\n            case OPS.nextLineShowText:\n              operatorList.addOp(OPS.nextLine);\n              args[0] = self.handleText(args[0], stateManager.state);\n              fn = OPS.showText;\n              break;\n            case OPS.nextLineSetSpacingShowText:\n              operatorList.addOp(OPS.nextLine);\n              operatorList.addOp(OPS.setWordSpacing, [args.shift()]);\n              operatorList.addOp(OPS.setCharSpacing, [args.shift()]);\n              args[0] = self.handleText(args[0], stateManager.state);\n              fn = OPS.showText;\n              break;\n            case OPS.setTextRenderingMode:\n              stateManager.state.textRenderingMode = args[0];\n              break;\n\n            case OPS.setFillColorSpace:\n              stateManager.state.fillColorSpace =\n                ColorSpace.parse(args[0], xref, resources);\n              continue;\n            case OPS.setStrokeColorSpace:\n              stateManager.state.strokeColorSpace =\n                ColorSpace.parse(args[0], xref, resources);\n              continue;\n            case OPS.setFillColor:\n              cs = stateManager.state.fillColorSpace;\n              args = cs.getRgb(args, 0);\n              fn = OPS.setFillRGBColor;\n              break;\n            case OPS.setStrokeColor:\n              cs = stateManager.state.strokeColorSpace;\n              args = cs.getRgb(args, 0);\n              fn = OPS.setStrokeRGBColor;\n              break;\n            case OPS.setFillGray:\n              stateManager.state.fillColorSpace = ColorSpace.singletons.gray;\n              args = ColorSpace.singletons.gray.getRgb(args, 0);\n              fn = OPS.setFillRGBColor;\n              break;\n            case OPS.setStrokeGray:\n              stateManager.state.strokeColorSpace = ColorSpace.singletons.gray;\n              args = ColorSpace.singletons.gray.getRgb(args, 0);\n              fn = OPS.setStrokeRGBColor;\n              break;\n            case OPS.setFillCMYKColor:\n              stateManager.state.fillColorSpace = ColorSpace.singletons.cmyk;\n              args = ColorSpace.singletons.cmyk.getRgb(args, 0);\n              fn = OPS.setFillRGBColor;\n              break;\n            case OPS.setStrokeCMYKColor:\n              stateManager.state.strokeColorSpace = ColorSpace.singletons.cmyk;\n              args = ColorSpace.singletons.cmyk.getRgb(args, 0);\n              fn = OPS.setStrokeRGBColor;\n              break;\n            case OPS.setFillRGBColor:\n              stateManager.state.fillColorSpace = ColorSpace.singletons.rgb;\n              args = ColorSpace.singletons.rgb.getRgb(args, 0);\n              break;\n            case OPS.setStrokeRGBColor:\n              stateManager.state.strokeColorSpace = ColorSpace.singletons.rgb;\n              args = ColorSpace.singletons.rgb.getRgb(args, 0);\n              break;\n            case OPS.setFillColorN:\n              cs = stateManager.state.fillColorSpace;\n              if (cs.name === 'Pattern') {\n                return self.handleColorN(operatorList, OPS.setFillColorN,\n                  args, cs, patterns, resources, xref).then(function() {\n                    next(resolve, reject);\n                  }, reject);\n              }\n              args = cs.getRgb(args, 0);\n              fn = OPS.setFillRGBColor;\n              break;\n            case OPS.setStrokeColorN:\n              cs = stateManager.state.strokeColorSpace;\n              if (cs.name === 'Pattern') {\n                return self.handleColorN(operatorList, OPS.setStrokeColorN,\n                  args, cs, patterns, resources, xref).then(function() {\n                    next(resolve, reject);\n                  }, reject);\n              }\n              args = cs.getRgb(args, 0);\n              fn = OPS.setStrokeRGBColor;\n              break;\n\n            case OPS.shadingFill:\n              var shadingRes = resources.get('Shading');\n              if (!shadingRes) {\n                error('No shading resource found');\n              }\n\n              var shading = shadingRes.get(args[0].name);\n              if (!shading) {\n                error('No shading object found');\n              }\n\n              var shadingFill = Pattern.parseShading(shading, null, xref,\n                resources);\n              var patternIR = shadingFill.getIR();\n              args = [patternIR];\n              fn = OPS.shadingFill;\n              break;\n            case OPS.setGState:\n              var dictName = args[0];\n              var extGState = resources.get('ExtGState');\n\n              if (!isDict(extGState) || !extGState.has(dictName.name)) {\n                break;\n              }\n\n              var gState = extGState.get(dictName.name);\n              return self.setGState(resources, gState, operatorList, xref,\n                stateManager).then(function() {\n                  next(resolve, reject);\n                }, reject);\n            case OPS.moveTo:\n            case OPS.lineTo:\n            case OPS.curveTo:\n            case OPS.curveTo2:\n            case OPS.curveTo3:\n            case OPS.closePath:\n              self.buildPath(operatorList, fn, args);\n              continue;\n            case OPS.rectangle:\n              self.buildPath(operatorList, fn, args);\n              continue;\n          }\n          operatorList.addOp(fn, args);\n        }\n        if (stop) {\n          deferred.then(function () {\n            next(resolve, reject);\n          });\n          return;\n        }\n        // Some PDFs don't close all restores inside object/form.\n        // Closing those for them.\n        for (i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) {\n          operatorList.addOp(OPS.restore, []);\n        }\n        resolve();\n      });\n    },\n\n    getTextContent: function PartialEvaluator_getTextContent(stream, resources,\n                                                             stateManager) {\n\n      stateManager = (stateManager || new StateManager(new TextState()));\n\n      var textContent = {\n        items: [],\n        styles: Object.create(null)\n      };\n      var bidiTexts = textContent.items;\n      var SPACE_FACTOR = 0.3;\n      var MULTI_SPACE_FACTOR = 1.5;\n\n      var self = this;\n      var xref = this.xref;\n\n      resources = (xref.fetchIfRef(resources) || Dict.empty);\n\n      // The xobj is parsed iff it's needed, e.g. if there is a `DO` cmd.\n      var xobjs = null;\n      var xobjsCache = {};\n\n      var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);\n\n      var textState;\n\n      function newTextChunk() {\n        var font = textState.font;\n        if (!(font.loadedName in textContent.styles)) {\n          textContent.styles[font.loadedName] = {\n            fontFamily: font.fallbackName,\n            ascent: font.ascent,\n            descent: font.descent,\n            vertical: font.vertical\n          };\n        }\n        return {\n          // |str| is initially an array which we push individual chars to, and\n          // then runBidi() overwrites it with the final string.\n          str: [],\n          dir: null,\n          width: 0,\n          height: 0,\n          transform: null,\n          fontName: font.loadedName\n        };\n      }\n\n      function runBidi(textChunk) {\n        var str = textChunk.str.join('');\n        var bidiResult = PDFJS.bidi(str, -1, textState.font.vertical);\n        textChunk.str = bidiResult.str;\n        textChunk.dir = bidiResult.dir;\n        return textChunk;\n      }\n\n      function handleSetFont(fontName, fontRef) {\n        return self.loadFont(fontName, fontRef, xref, resources).\n          then(function (translated) {\n            textState.font = translated.font;\n            textState.fontMatrix = translated.font.fontMatrix ||\n              FONT_IDENTITY_MATRIX;\n          });\n      }\n\n      function buildTextGeometry(chars, textChunk) {\n        var font = textState.font;\n        textChunk = textChunk || newTextChunk();\n        if (!textChunk.transform) {\n          // 9.4.4 Text Space Details\n          var tsm = [textState.fontSize * textState.textHScale, 0,\n                     0, textState.fontSize,\n                     0, textState.textRise];\n\n          if (font.isType3Font &&\n              textState.fontMatrix !== FONT_IDENTITY_MATRIX &&\n              textState.fontSize === 1) {\n            var glyphHeight = font.bbox[3] - font.bbox[1];\n            if (glyphHeight > 0) {\n              glyphHeight = glyphHeight * textState.fontMatrix[3];\n              tsm[3] *= glyphHeight;\n            }\n          }\n\n          var trm = textChunk.transform = Util.transform(textState.ctm,\n                                    Util.transform(textState.textMatrix, tsm));\n          if (!font.vertical) {\n            textChunk.height = Math.sqrt(trm[2] * trm[2] + trm[3] * trm[3]);\n          } else {\n            textChunk.width = Math.sqrt(trm[0] * trm[0] + trm[1] * trm[1]);\n          }\n        }\n        var width = 0;\n        var height = 0;\n        var glyphs = font.charsToGlyphs(chars);\n        var defaultVMetrics = font.defaultVMetrics;\n        for (var i = 0; i < glyphs.length; i++) {\n          var glyph = glyphs[i];\n          if (!glyph) { // Previous glyph was a space.\n            width += textState.wordSpacing * textState.textHScale;\n            continue;\n          }\n          var vMetricX = null;\n          var vMetricY = null;\n          var glyphWidth = null;\n          if (font.vertical) {\n            if (glyph.vmetric) {\n              glyphWidth = glyph.vmetric[0];\n              vMetricX = glyph.vmetric[1];\n              vMetricY = glyph.vmetric[2];\n            } else {\n              glyphWidth = glyph.width;\n              vMetricX = glyph.width * 0.5;\n              vMetricY = defaultVMetrics[2];\n            }\n          } else {\n            glyphWidth = glyph.width;\n          }\n\n          var glyphUnicode = glyph.unicode;\n          if (NormalizedUnicodes[glyphUnicode] !== undefined) {\n            glyphUnicode = NormalizedUnicodes[glyphUnicode];\n          }\n          glyphUnicode = reverseIfRtl(glyphUnicode);\n\n          // The following will calculate the x and y of the individual glyphs.\n          // if (font.vertical) {\n          //   tsm[4] -= vMetricX * Math.abs(textState.fontSize) *\n          //             textState.fontMatrix[0];\n          //   tsm[5] -= vMetricY * textState.fontSize *\n          //             textState.fontMatrix[0];\n          // }\n          // var trm = Util.transform(textState.textMatrix, tsm);\n          // var pt = Util.applyTransform([trm[4], trm[5]], textState.ctm);\n          // var x = pt[0];\n          // var y = pt[1];\n\n          var charSpacing = 0;\n          if (textChunk.str.length > 0) {\n            // Apply char spacing only when there are chars.\n            // As a result there is only spacing between glyphs.\n            charSpacing = textState.charSpacing;\n          }\n\n          var tx = 0;\n          var ty = 0;\n          if (!font.vertical) {\n            var w0 = glyphWidth * textState.fontMatrix[0];\n            tx = (w0 * textState.fontSize + charSpacing) *\n                 textState.textHScale;\n            width += tx;\n          } else {\n            var w1 = glyphWidth * textState.fontMatrix[0];\n            ty = w1 * textState.fontSize + charSpacing;\n            height += ty;\n          }\n          textState.translateTextMatrix(tx, ty);\n\n          textChunk.str.push(glyphUnicode);\n        }\n\n        var a = textState.textLineMatrix[0];\n        var b = textState.textLineMatrix[1];\n        var scaleLineX = Math.sqrt(a * a + b * b);\n        a = textState.ctm[0];\n        b = textState.ctm[1];\n        var scaleCtmX = Math.sqrt(a * a + b * b);\n        if (!font.vertical) {\n          textChunk.width += width * scaleCtmX * scaleLineX;\n        } else {\n          textChunk.height += Math.abs(height * scaleCtmX * scaleLineX);\n        }\n        return textChunk;\n      }\n\n      var timeSlotManager = new TimeSlotManager();\n\n      return new Promise(function next(resolve, reject) {\n        timeSlotManager.reset();\n        var stop, operation = {}, args = [];\n        while (!(stop = timeSlotManager.check())) {\n          // The arguments parsed by read() are not used beyond this loop, so\n          // we can reuse the same array on every iteration, thus avoiding\n          // unnecessary allocations.\n          args.length = 0;\n          operation.args = args;\n          if (!(preprocessor.read(operation))) {\n            break;\n          }\n          textState = stateManager.state;\n          var fn = operation.fn;\n          args = operation.args;\n\n          switch (fn | 0) {\n            case OPS.setFont:\n              textState.fontSize = args[1];\n              return handleSetFont(args[0].name).then(function() {\n                next(resolve, reject);\n              }, reject);\n            case OPS.setTextRise:\n              textState.textRise = args[0];\n              break;\n            case OPS.setHScale:\n              textState.textHScale = args[0] / 100;\n              break;\n            case OPS.setLeading:\n              textState.leading = args[0];\n              break;\n            case OPS.moveText:\n              textState.translateTextLineMatrix(args[0], args[1]);\n              textState.textMatrix = textState.textLineMatrix.slice();\n              break;\n            case OPS.setLeadingMoveText:\n              textState.leading = -args[1];\n              textState.translateTextLineMatrix(args[0], args[1]);\n              textState.textMatrix = textState.textLineMatrix.slice();\n              break;\n            case OPS.nextLine:\n              textState.carriageReturn();\n              break;\n            case OPS.setTextMatrix:\n              textState.setTextMatrix(args[0], args[1], args[2], args[3],\n                args[4], args[5]);\n              textState.setTextLineMatrix(args[0], args[1], args[2], args[3],\n                args[4], args[5]);\n              break;\n            case OPS.setCharSpacing:\n              textState.charSpacing = args[0];\n              break;\n            case OPS.setWordSpacing:\n              textState.wordSpacing = args[0];\n              break;\n            case OPS.beginText:\n              textState.textMatrix = IDENTITY_MATRIX.slice();\n              textState.textLineMatrix = IDENTITY_MATRIX.slice();\n              break;\n            case OPS.showSpacedText:\n              var items = args[0];\n              var textChunk = newTextChunk();\n              var offset;\n              for (var j = 0, jj = items.length; j < jj; j++) {\n                if (typeof items[j] === 'string') {\n                  buildTextGeometry(items[j], textChunk);\n                } else {\n                  var val = items[j] / 1000;\n                  if (!textState.font.vertical) {\n                    offset = -val * textState.fontSize * textState.textHScale *\n                      textState.textMatrix[0];\n                    textState.translateTextMatrix(offset, 0);\n                    textChunk.width += offset;\n                  } else {\n                    offset = -val * textState.fontSize *\n                      textState.textMatrix[3];\n                    textState.translateTextMatrix(0, offset);\n                    textChunk.height += offset;\n                  }\n                  if (items[j] < 0 && textState.font.spaceWidth > 0) {\n                    var fakeSpaces = -items[j] / textState.font.spaceWidth;\n                    if (fakeSpaces > MULTI_SPACE_FACTOR) {\n                      fakeSpaces = Math.round(fakeSpaces);\n                      while (fakeSpaces--) {\n                        textChunk.str.push(' ');\n                      }\n                    } else if (fakeSpaces > SPACE_FACTOR) {\n                      textChunk.str.push(' ');\n                    }\n                  }\n                }\n              }\n              bidiTexts.push(runBidi(textChunk));\n              break;\n            case OPS.showText:\n              bidiTexts.push(runBidi(buildTextGeometry(args[0])));\n              break;\n            case OPS.nextLineShowText:\n              textState.carriageReturn();\n              bidiTexts.push(runBidi(buildTextGeometry(args[0])));\n              break;\n            case OPS.nextLineSetSpacingShowText:\n              textState.wordSpacing = args[0];\n              textState.charSpacing = args[1];\n              textState.carriageReturn();\n              bidiTexts.push(runBidi(buildTextGeometry(args[2])));\n              break;\n            case OPS.paintXObject:\n              if (args[0].code) {\n                break;\n              }\n\n              if (!xobjs) {\n                xobjs = (resources.get('XObject') || Dict.empty);\n              }\n\n              var name = args[0].name;\n              if (xobjsCache.key === name) {\n                if (xobjsCache.texts) {\n                  Util.appendToArray(bidiTexts, xobjsCache.texts.items);\n                  Util.extendObj(textContent.styles, xobjsCache.texts.styles);\n                }\n                break;\n              }\n\n              var xobj = xobjs.get(name);\n              if (!xobj) {\n                break;\n              }\n              assert(isStream(xobj), 'XObject should be a stream');\n\n              var type = xobj.dict.get('Subtype');\n              assert(isName(type),\n                'XObject should have a Name subtype');\n\n              if ('Form' !== type.name) {\n                xobjsCache.key = name;\n                xobjsCache.texts = null;\n                break;\n              }\n\n              stateManager.save();\n              var matrix = xobj.dict.get('Matrix');\n              if (isArray(matrix) && matrix.length === 6) {\n                stateManager.transform(matrix);\n              }\n\n              return self.getTextContent(xobj,\n                xobj.dict.get('Resources') || resources, stateManager).\n                then(function (formTextContent) {\n                  Util.appendToArray(bidiTexts, formTextContent.items);\n                  Util.extendObj(textContent.styles, formTextContent.styles);\n                  stateManager.restore();\n\n                  xobjsCache.key = name;\n                  xobjsCache.texts = formTextContent;\n\n                  next(resolve, reject);\n                }, reject);\n            case OPS.setGState:\n              var dictName = args[0];\n              var extGState = resources.get('ExtGState');\n\n              if (!isDict(extGState) || !extGState.has(dictName.name)) {\n                break;\n              }\n\n              var gsStateMap = extGState.get(dictName.name);\n              var gsStateFont = null;\n              for (var key in gsStateMap) {\n                if (key === 'Font') {\n                  assert(!gsStateFont);\n                  gsStateFont = gsStateMap[key];\n                }\n              }\n              if (gsStateFont) {\n                textState.fontSize = gsStateFont[1];\n                return handleSetFont(gsStateFont[0]).then(function() {\n                  next(resolve, reject);\n                }, reject);\n              }\n              break;\n          } // switch\n        } // while\n        if (stop) {\n          deferred.then(function () {\n            next(resolve, reject);\n          });\n          return;\n        }\n        resolve(textContent);\n      });\n    },\n\n    extractDataStructures: function\n      partialEvaluatorExtractDataStructures(dict, baseDict,\n                                            xref, properties) {\n      // 9.10.2\n      var toUnicode = (dict.get('ToUnicode') || baseDict.get('ToUnicode'));\n      if (toUnicode) {\n        properties.toUnicode = this.readToUnicode(toUnicode);\n      }\n      if (properties.composite) {\n        // CIDSystemInfo helps to match CID to glyphs\n        var cidSystemInfo = dict.get('CIDSystemInfo');\n        if (isDict(cidSystemInfo)) {\n          properties.cidSystemInfo = {\n            registry: cidSystemInfo.get('Registry'),\n            ordering: cidSystemInfo.get('Ordering'),\n            supplement: cidSystemInfo.get('Supplement')\n          };\n        }\n\n        var cidToGidMap = dict.get('CIDToGIDMap');\n        if (isStream(cidToGidMap)) {\n          properties.cidToGidMap = this.readCidToGidMap(cidToGidMap);\n        }\n      }\n\n      // Based on 9.6.6 of the spec the encoding can come from multiple places\n      // and depends on the font type. The base encoding and differences are\n      // read here, but the encoding that is actually used is chosen during\n      // glyph mapping in the font.\n      // TODO: Loading the built in encoding in the font would allow the\n      // differences to be merged in here not require us to hold on to it.\n      var differences = [];\n      var baseEncodingName = null;\n      var encoding;\n      if (dict.has('Encoding')) {\n        encoding = dict.get('Encoding');\n        if (isDict(encoding)) {\n          baseEncodingName = encoding.get('BaseEncoding');\n          baseEncodingName = (isName(baseEncodingName) ?\n                              baseEncodingName.name : null);\n          // Load the differences between the base and original\n          if (encoding.has('Differences')) {\n            var diffEncoding = encoding.get('Differences');\n            var index = 0;\n            for (var j = 0, jj = diffEncoding.length; j < jj; j++) {\n              var data = diffEncoding[j];\n              if (isNum(data)) {\n                index = data;\n              } else if (isName(data)) {\n                differences[index++] = data.name;\n              } else if (isRef(data)) {\n                diffEncoding[j--] = xref.fetch(data);\n                continue;\n              } else {\n                error('Invalid entry in \\'Differences\\' array: ' + data);\n              }\n            }\n          }\n        } else if (isName(encoding)) {\n          baseEncodingName = encoding.name;\n        } else {\n          error('Encoding is not a Name nor a Dict');\n        }\n        // According to table 114 if the encoding is a named encoding it must be\n        // one of these predefined encodings.\n        if ((baseEncodingName !== 'MacRomanEncoding' &&\n             baseEncodingName !== 'MacExpertEncoding' &&\n             baseEncodingName !== 'WinAnsiEncoding')) {\n          baseEncodingName = null;\n        }\n      }\n\n      if (baseEncodingName) {\n        properties.defaultEncoding = Encodings[baseEncodingName].slice();\n      } else {\n        encoding = (properties.type === 'TrueType' ?\n                    Encodings.WinAnsiEncoding : Encodings.StandardEncoding);\n        // The Symbolic attribute can be misused for regular fonts\n        // Heuristic: we have to check if the font is a standard one also\n        if (!!(properties.flags & FontFlags.Symbolic)) {\n          encoding = Encodings.MacRomanEncoding;\n          if (!properties.file) {\n            if (/Symbol/i.test(properties.name)) {\n              encoding = Encodings.SymbolSetEncoding;\n            } else if (/Dingbats/i.test(properties.name)) {\n              encoding = Encodings.ZapfDingbatsEncoding;\n            }\n          }\n        }\n        properties.defaultEncoding = encoding;\n      }\n\n      properties.differences = differences;\n      properties.baseEncodingName = baseEncodingName;\n      properties.dict = dict;\n    },\n\n    readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) {\n      var cmap, cmapObj = toUnicode;\n      if (isName(cmapObj)) {\n        cmap = CMapFactory.create(cmapObj,\n          { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null);\n        if (cmap instanceof IdentityCMap) {\n          return new IdentityToUnicodeMap(0, 0xFFFF);\n        }\n        return new ToUnicodeMap(cmap.getMap());\n      } else if (isStream(cmapObj)) {\n        cmap = CMapFactory.create(cmapObj,\n          { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null);\n        if (cmap instanceof IdentityCMap) {\n          return new IdentityToUnicodeMap(0, 0xFFFF);\n        }\n        cmap = cmap.getMap();\n        // Convert UTF-16BE\n        // NOTE: cmap can be a sparse array, so use forEach instead of for(;;)\n        // to iterate over all keys.\n        cmap.forEach(function(token, i) {\n          var str = [];\n          for (var k = 0; k < token.length; k += 2) {\n            var w1 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1);\n            if ((w1 & 0xF800) !== 0xD800) { // w1 < 0xD800 || w1 > 0xDFFF\n              str.push(w1);\n              continue;\n            }\n            k += 2;\n            var w2 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1);\n            str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000);\n          }\n          cmap[i] = String.fromCharCode.apply(String, str);\n        });\n        return new ToUnicodeMap(cmap);\n      }\n      return null;\n    },\n\n    readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) {\n      // Extract the encoding from the CIDToGIDMap\n      var glyphsData = cidToGidStream.getBytes();\n\n      // Set encoding 0 to later verify the font has an encoding\n      var result = [];\n      for (var j = 0, jj = glyphsData.length; j < jj; j++) {\n        var glyphID = (glyphsData[j++] << 8) | glyphsData[j];\n        if (glyphID === 0) {\n          continue;\n        }\n        var code = j >> 1;\n        result[code] = glyphID;\n      }\n      return result;\n    },\n\n    extractWidths: function PartialEvaluator_extractWidths(dict, xref,\n                                                           descriptor,\n                                                           properties) {\n      var glyphsWidths = [];\n      var defaultWidth = 0;\n      var glyphsVMetrics = [];\n      var defaultVMetrics;\n      var i, ii, j, jj, start, code, widths;\n      if (properties.composite) {\n        defaultWidth = dict.get('DW') || 1000;\n\n        widths = dict.get('W');\n        if (widths) {\n          for (i = 0, ii = widths.length; i < ii; i++) {\n            start = widths[i++];\n            code = xref.fetchIfRef(widths[i]);\n            if (isArray(code)) {\n              for (j = 0, jj = code.length; j < jj; j++) {\n                glyphsWidths[start++] = code[j];\n              }\n            } else {\n              var width = widths[++i];\n              for (j = start; j <= code; j++) {\n                glyphsWidths[j] = width;\n              }\n            }\n          }\n        }\n\n        if (properties.vertical) {\n          var vmetrics = (dict.get('DW2') || [880, -1000]);\n          defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]];\n          vmetrics = dict.get('W2');\n          if (vmetrics) {\n            for (i = 0, ii = vmetrics.length; i < ii; i++) {\n              start = vmetrics[i++];\n              code = xref.fetchIfRef(vmetrics[i]);\n              if (isArray(code)) {\n                for (j = 0, jj = code.length; j < jj; j++) {\n                  glyphsVMetrics[start++] = [code[j++], code[j++], code[j]];\n                }\n              } else {\n                var vmetric = [vmetrics[++i], vmetrics[++i], vmetrics[++i]];\n                for (j = start; j <= code; j++) {\n                  glyphsVMetrics[j] = vmetric;\n                }\n              }\n            }\n          }\n        }\n      } else {\n        var firstChar = properties.firstChar;\n        widths = dict.get('Widths');\n        if (widths) {\n          j = firstChar;\n          for (i = 0, ii = widths.length; i < ii; i++) {\n            glyphsWidths[j++] = widths[i];\n          }\n          defaultWidth = (parseFloat(descriptor.get('MissingWidth')) || 0);\n        } else {\n          // Trying get the BaseFont metrics (see comment above).\n          var baseFontName = dict.get('BaseFont');\n          if (isName(baseFontName)) {\n            var metrics = this.getBaseFontMetrics(baseFontName.name);\n\n            glyphsWidths = this.buildCharCodeToWidth(metrics.widths,\n                                                     properties);\n            defaultWidth = metrics.defaultWidth;\n          }\n        }\n      }\n\n      // Heuristic: detection of monospace font by checking all non-zero widths\n      var isMonospace = true;\n      var firstWidth = defaultWidth;\n      for (var glyph in glyphsWidths) {\n        var glyphWidth = glyphsWidths[glyph];\n        if (!glyphWidth) {\n          continue;\n        }\n        if (!firstWidth) {\n          firstWidth = glyphWidth;\n          continue;\n        }\n        if (firstWidth !== glyphWidth) {\n          isMonospace = false;\n          break;\n        }\n      }\n      if (isMonospace) {\n        properties.flags |= FontFlags.FixedPitch;\n      }\n\n      properties.defaultWidth = defaultWidth;\n      properties.widths = glyphsWidths;\n      properties.defaultVMetrics = defaultVMetrics;\n      properties.vmetrics = glyphsVMetrics;\n    },\n\n    isSerifFont: function PartialEvaluator_isSerifFont(baseFontName) {\n      // Simulating descriptor flags attribute\n      var fontNameWoStyle = baseFontName.split('-')[0];\n      return (fontNameWoStyle in serifFonts) ||\n              (fontNameWoStyle.search(/serif/gi) !== -1);\n    },\n\n    getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) {\n      var defaultWidth = 0;\n      var widths = [];\n      var monospace = false;\n      var lookupName = (stdFontMap[name] || name);\n\n      if (!(lookupName in Metrics)) {\n        // Use default fonts for looking up font metrics if the passed\n        // font is not a base font\n        if (this.isSerifFont(name)) {\n          lookupName = 'Times-Roman';\n        } else {\n          lookupName = 'Helvetica';\n        }\n      }\n      var glyphWidths = Metrics[lookupName];\n\n      if (isNum(glyphWidths)) {\n        defaultWidth = glyphWidths;\n        monospace = true;\n      } else {\n        widths = glyphWidths;\n      }\n\n      return {\n        defaultWidth: defaultWidth,\n        monospace: monospace,\n        widths: widths\n      };\n    },\n\n    buildCharCodeToWidth:\n        function PartialEvaluator_bulildCharCodeToWidth(widthsByGlyphName,\n                                                        properties) {\n      var widths = Object.create(null);\n      var differences = properties.differences;\n      var encoding = properties.defaultEncoding;\n      for (var charCode = 0; charCode < 256; charCode++) {\n        if (charCode in differences &&\n            widthsByGlyphName[differences[charCode]]) {\n          widths[charCode] = widthsByGlyphName[differences[charCode]];\n          continue;\n        }\n        if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) {\n          widths[charCode] = widthsByGlyphName[encoding[charCode]];\n          continue;\n        }\n      }\n      return widths;\n    },\n\n    preEvaluateFont: function PartialEvaluator_preEvaluateFont(dict, xref) {\n      var baseDict = dict;\n      var type = dict.get('Subtype');\n      assert(isName(type), 'invalid font Subtype');\n\n      var composite = false;\n      var uint8array;\n      if (type.name === 'Type0') {\n        // If font is a composite\n        //  - get the descendant font\n        //  - set the type according to the descendant font\n        //  - get the FontDescriptor from the descendant font\n        var df = dict.get('DescendantFonts');\n        if (!df) {\n          error('Descendant fonts are not specified');\n        }\n        dict = (isArray(df) ? xref.fetchIfRef(df[0]) : df);\n\n        type = dict.get('Subtype');\n        assert(isName(type), 'invalid font Subtype');\n        composite = true;\n      }\n\n      var descriptor = dict.get('FontDescriptor');\n      if (descriptor) {\n        var hash = new MurmurHash3_64();\n        var encoding = baseDict.getRaw('Encoding');\n        if (isName(encoding)) {\n          hash.update(encoding.name);\n        } else if (isRef(encoding)) {\n          hash.update(encoding.num + '_' + encoding.gen);\n        } else if (isDict(encoding)) {\n          var keys = encoding.getKeys();\n          for (var i = 0, ii = keys.length; i < ii; i++) {\n            var entry = encoding.getRaw(keys[i]);\n            if (isName(entry)) {\n              hash.update(entry.name);\n            } else if (isRef(entry)) {\n              hash.update(entry.num + '_' + entry.gen);\n            } else if (isArray(entry)) { // 'Differences' entry.\n              // Ideally we should check the contents of the array, but to avoid\n              // parsing it here and then again in |extractDataStructures|,\n              // we only use the array length for now (fixes bug1157493.pdf).\n              hash.update(entry.length.toString());\n            }\n          }\n        }\n\n        var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode');\n        if (isStream(toUnicode)) {\n          var stream = toUnicode.str || toUnicode;\n          uint8array = stream.buffer ?\n            new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) :\n            new Uint8Array(stream.bytes.buffer,\n                           stream.start, stream.end - stream.start);\n          hash.update(uint8array);\n\n        } else if (isName(toUnicode)) {\n          hash.update(toUnicode.name);\n        }\n\n        var widths = dict.get('Widths') || baseDict.get('Widths');\n        if (widths) {\n          uint8array = new Uint8Array(new Uint32Array(widths).buffer);\n          hash.update(uint8array);\n        }\n      }\n\n      return {\n        descriptor: descriptor,\n        dict: dict,\n        baseDict: baseDict,\n        composite: composite,\n        type: type.name,\n        hash: hash ? hash.hexdigest() : ''\n      };\n    },\n\n    translateFont: function PartialEvaluator_translateFont(preEvaluatedFont,\n                                                           xref) {\n      var baseDict = preEvaluatedFont.baseDict;\n      var dict = preEvaluatedFont.dict;\n      var composite = preEvaluatedFont.composite;\n      var descriptor = preEvaluatedFont.descriptor;\n      var type = preEvaluatedFont.type;\n      var maxCharIndex = (composite ? 0xFFFF : 0xFF);\n      var properties;\n\n      if (!descriptor) {\n        if (type === 'Type3') {\n          // FontDescriptor is only required for Type3 fonts when the document\n          // is a tagged pdf. Create a barbebones one to get by.\n          descriptor = new Dict(null);\n          descriptor.set('FontName', Name.get(type));\n          descriptor.set('FontBBox', dict.get('FontBBox'));\n        } else {\n          // Before PDF 1.5 if the font was one of the base 14 fonts, having a\n          // FontDescriptor was not required.\n          // This case is here for compatibility.\n          var baseFontName = dict.get('BaseFont');\n          if (!isName(baseFontName)) {\n            error('Base font is not specified');\n          }\n\n          // Using base font name as a font name.\n          baseFontName = baseFontName.name.replace(/[,_]/g, '-');\n          var metrics = this.getBaseFontMetrics(baseFontName);\n\n          // Simulating descriptor flags attribute\n          var fontNameWoStyle = baseFontName.split('-')[0];\n          var flags =\n            (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) |\n            (metrics.monospace ? FontFlags.FixedPitch : 0) |\n            (symbolsFonts[fontNameWoStyle] ? FontFlags.Symbolic :\n                                             FontFlags.Nonsymbolic);\n\n          properties = {\n            type: type,\n            name: baseFontName,\n            widths: metrics.widths,\n            defaultWidth: metrics.defaultWidth,\n            flags: flags,\n            firstChar: 0,\n            lastChar: maxCharIndex\n          };\n          this.extractDataStructures(dict, dict, xref, properties);\n          properties.widths = this.buildCharCodeToWidth(metrics.widths,\n                                                        properties);\n          return new Font(baseFontName, null, properties);\n        }\n      }\n\n      // According to the spec if 'FontDescriptor' is declared, 'FirstChar',\n      // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem\n      // to ignore this rule when a variant of a standart font is used.\n      // TODO Fill the width array depending on which of the base font this is\n      // a variant.\n      var firstChar = (dict.get('FirstChar') || 0);\n      var lastChar = (dict.get('LastChar') || maxCharIndex);\n\n      var fontName = descriptor.get('FontName');\n      var baseFont = dict.get('BaseFont');\n      // Some bad PDFs have a string as the font name.\n      if (isString(fontName)) {\n        fontName = Name.get(fontName);\n      }\n      if (isString(baseFont)) {\n        baseFont = Name.get(baseFont);\n      }\n\n      if (type !== 'Type3') {\n        var fontNameStr = fontName && fontName.name;\n        var baseFontStr = baseFont && baseFont.name;\n        if (fontNameStr !== baseFontStr) {\n          info('The FontDescriptor\\'s FontName is \"' + fontNameStr +\n               '\" but should be the same as the Font\\'s BaseFont \"' +\n               baseFontStr + '\"');\n          // Workaround for cases where e.g. fontNameStr = 'Arial' and\n          // baseFontStr = 'Arial,Bold' (needed when no font file is embedded).\n          if (fontNameStr && baseFontStr &&\n              baseFontStr.indexOf(fontNameStr) === 0) {\n            fontName = baseFont;\n          }\n        }\n      }\n      fontName = (fontName || baseFont);\n\n      assert(isName(fontName), 'invalid font name');\n\n      var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');\n      if (fontFile) {\n        if (fontFile.dict) {\n          var subtype = fontFile.dict.get('Subtype');\n          if (subtype) {\n            subtype = subtype.name;\n          }\n          var length1 = fontFile.dict.get('Length1');\n          var length2 = fontFile.dict.get('Length2');\n        }\n      }\n\n      properties = {\n        type: type,\n        name: fontName.name,\n        subtype: subtype,\n        file: fontFile,\n        length1: length1,\n        length2: length2,\n        loadedName: baseDict.loadedName,\n        composite: composite,\n        wideChars: composite,\n        fixedPitch: false,\n        fontMatrix: (dict.get('FontMatrix') || FONT_IDENTITY_MATRIX),\n        firstChar: firstChar || 0,\n        lastChar: (lastChar || maxCharIndex),\n        bbox: descriptor.get('FontBBox'),\n        ascent: descriptor.get('Ascent'),\n        descent: descriptor.get('Descent'),\n        xHeight: descriptor.get('XHeight'),\n        capHeight: descriptor.get('CapHeight'),\n        flags: descriptor.get('Flags'),\n        italicAngle: descriptor.get('ItalicAngle'),\n        coded: false\n      };\n\n      if (composite) {\n        var cidEncoding = baseDict.get('Encoding');\n        if (isName(cidEncoding)) {\n          properties.cidEncoding = cidEncoding.name;\n        }\n        properties.cMap = CMapFactory.create(cidEncoding,\n          { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null);\n        properties.vertical = properties.cMap.vertical;\n      }\n      this.extractDataStructures(dict, baseDict, xref, properties);\n      this.extractWidths(dict, xref, descriptor, properties);\n\n      if (type === 'Type3') {\n        properties.isType3Font = true;\n      }\n\n      return new Font(fontName.name, fontFile, properties);\n    }\n  };\n\n  return PartialEvaluator;\n})();\n\nvar TranslatedFont = (function TranslatedFontClosure() {\n  function TranslatedFont(loadedName, font, dict) {\n    this.loadedName = loadedName;\n    this.font = font;\n    this.dict = dict;\n    this.type3Loaded = null;\n    this.sent = false;\n  }\n  TranslatedFont.prototype = {\n    send: function (handler) {\n      if (this.sent) {\n        return;\n      }\n      var fontData = this.font.exportData();\n      handler.send('commonobj', [\n        this.loadedName,\n        'Font',\n        fontData\n      ]);\n      this.sent = true;\n    },\n    loadType3Data: function (evaluator, resources, parentOperatorList) {\n      assert(this.font.isType3Font);\n\n      if (this.type3Loaded) {\n        return this.type3Loaded;\n      }\n\n      var translatedFont = this.font;\n      var loadCharProcsPromise = Promise.resolve();\n      var charProcs = this.dict.get('CharProcs').getAll();\n      var fontResources = this.dict.get('Resources') || resources;\n      var charProcKeys = Object.keys(charProcs);\n      var charProcOperatorList = {};\n      for (var i = 0, n = charProcKeys.length; i < n; ++i) {\n        loadCharProcsPromise = loadCharProcsPromise.then(function (key) {\n          var glyphStream = charProcs[key];\n          var operatorList = new OperatorList();\n          return evaluator.getOperatorList(glyphStream, fontResources,\n                                           operatorList).then(function () {\n            charProcOperatorList[key] = operatorList.getIR();\n\n            // Add the dependencies to the parent operator list so they are\n            // resolved before sub operator list is executed synchronously.\n            parentOperatorList.addDependencies(operatorList.dependencies);\n          }, function (reason) {\n            warn('Type3 font resource \\\"' + key + '\\\" is not available');\n            var operatorList = new OperatorList();\n            charProcOperatorList[key] = operatorList.getIR();\n          });\n        }.bind(this, charProcKeys[i]));\n      }\n      this.type3Loaded = loadCharProcsPromise.then(function () {\n        translatedFont.charProcOperatorList = charProcOperatorList;\n      });\n      return this.type3Loaded;\n    }\n  };\n  return TranslatedFont;\n})();\n\nvar OperatorList = (function OperatorListClosure() {\n  var CHUNK_SIZE = 1000;\n  var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5; // close to chunk size\n\n  function getTransfers(queue) {\n    var transfers = [];\n    var fnArray = queue.fnArray, argsArray = queue.argsArray;\n    for (var i = 0, ii = queue.length; i < ii; i++) {\n      switch (fnArray[i]) {\n        case OPS.paintInlineImageXObject:\n        case OPS.paintInlineImageXObjectGroup:\n        case OPS.paintImageMaskXObject:\n          var arg = argsArray[i][0]; // first param in imgData\n          if (!arg.cached) {\n            transfers.push(arg.data.buffer);\n          }\n          break;\n      }\n    }\n    return transfers;\n  }\n\n  function OperatorList(intent, messageHandler, pageIndex) {\n    this.messageHandler = messageHandler;\n    this.fnArray = [];\n    this.argsArray = [];\n    this.dependencies = {};\n    this.pageIndex = pageIndex;\n    this.intent = intent;\n  }\n\n  OperatorList.prototype = {\n    get length() {\n      return this.argsArray.length;\n    },\n\n    addOp: function(fn, args) {\n      this.fnArray.push(fn);\n      this.argsArray.push(args);\n      if (this.messageHandler) {\n        if (this.fnArray.length >= CHUNK_SIZE) {\n          this.flush();\n        } else if (this.fnArray.length >= CHUNK_SIZE_ABOUT &&\n                   (fn === OPS.restore || fn === OPS.endText)) {\n          // heuristic to flush on boundary of restore or endText\n          this.flush();\n        }\n      }\n    },\n\n    addDependency: function(dependency) {\n      if (dependency in this.dependencies) {\n        return;\n      }\n      this.dependencies[dependency] = true;\n      this.addOp(OPS.dependency, [dependency]);\n    },\n\n    addDependencies: function(dependencies) {\n      for (var key in dependencies) {\n        this.addDependency(key);\n      }\n    },\n\n    addOpList: function(opList) {\n      Util.extendObj(this.dependencies, opList.dependencies);\n      for (var i = 0, ii = opList.length; i < ii; i++) {\n        this.addOp(opList.fnArray[i], opList.argsArray[i]);\n      }\n    },\n\n    getIR: function() {\n      return {\n        fnArray: this.fnArray,\n        argsArray: this.argsArray,\n        length: this.length\n      };\n    },\n\n    flush: function(lastChunk) {\n      if (this.intent !== 'oplist') {\n        new QueueOptimizer().optimize(this);\n      }\n      var transfers = getTransfers(this);\n      this.messageHandler.send('RenderPageChunk', {\n        operatorList: {\n          fnArray: this.fnArray,\n          argsArray: this.argsArray,\n          lastChunk: lastChunk,\n          length: this.length\n        },\n        pageIndex: this.pageIndex,\n        intent: this.intent\n      }, transfers);\n      this.dependencies = {};\n      this.fnArray.length = 0;\n      this.argsArray.length = 0;\n    }\n  };\n\n  return OperatorList;\n})();\n\nvar StateManager = (function StateManagerClosure() {\n  function StateManager(initialState) {\n    this.state = initialState;\n    this.stateStack = [];\n  }\n  StateManager.prototype = {\n    save: function () {\n      var old = this.state;\n      this.stateStack.push(this.state);\n      this.state = old.clone();\n    },\n    restore: function () {\n      var prev = this.stateStack.pop();\n      if (prev) {\n        this.state = prev;\n      }\n    },\n    transform: function (args) {\n      this.state.ctm = Util.transform(this.state.ctm, args);\n    }\n  };\n  return StateManager;\n})();\n\nvar TextState = (function TextStateClosure() {\n  function TextState() {\n    this.ctm = new Float32Array(IDENTITY_MATRIX);\n    this.fontSize = 0;\n    this.font = null;\n    this.fontMatrix = FONT_IDENTITY_MATRIX;\n    this.textMatrix = IDENTITY_MATRIX.slice();\n    this.textLineMatrix = IDENTITY_MATRIX.slice();\n    this.charSpacing = 0;\n    this.wordSpacing = 0;\n    this.leading = 0;\n    this.textHScale = 1;\n    this.textRise = 0;\n  }\n\n  TextState.prototype = {\n    setTextMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {\n      var m = this.textMatrix;\n      m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f;\n    },\n    setTextLineMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {\n      var m = this.textLineMatrix;\n      m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f;\n    },\n    translateTextMatrix: function TextState_translateTextMatrix(x, y) {\n      var m = this.textMatrix;\n      m[4] = m[0] * x + m[2] * y + m[4];\n      m[5] = m[1] * x + m[3] * y + m[5];\n    },\n    translateTextLineMatrix: function TextState_translateTextMatrix(x, y) {\n      var m = this.textLineMatrix;\n      m[4] = m[0] * x + m[2] * y + m[4];\n      m[5] = m[1] * x + m[3] * y + m[5];\n    },\n    calcRenderMatrix: function TextState_calcRendeMatrix(ctm) {\n      // 9.4.4 Text Space Details\n      var tsm = [this.fontSize * this.textHScale, 0,\n                0, this.fontSize,\n                0, this.textRise];\n      return Util.transform(ctm, Util.transform(this.textMatrix, tsm));\n    },\n    carriageReturn: function TextState_carriageReturn() {\n      this.translateTextLineMatrix(0, -this.leading);\n      this.textMatrix = this.textLineMatrix.slice();\n    },\n    clone: function TextState_clone() {\n      var clone = Object.create(this);\n      clone.textMatrix = this.textMatrix.slice();\n      clone.textLineMatrix = this.textLineMatrix.slice();\n      clone.fontMatrix = this.fontMatrix.slice();\n      return clone;\n    }\n  };\n  return TextState;\n})();\n\nvar EvalState = (function EvalStateClosure() {\n  function EvalState() {\n    this.ctm = new Float32Array(IDENTITY_MATRIX);\n    this.font = null;\n    this.textRenderingMode = TextRenderingMode.FILL;\n    this.fillColorSpace = ColorSpace.singletons.gray;\n    this.strokeColorSpace = ColorSpace.singletons.gray;\n  }\n  EvalState.prototype = {\n    clone: function CanvasExtraState_clone() {\n      return Object.create(this);\n    },\n  };\n  return EvalState;\n})();\n\nvar EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {\n  // Specifies properties for each command\n  //\n  // If variableArgs === true: [0, `numArgs`] expected\n  // If variableArgs === false: exactly `numArgs` expected\n  var OP_MAP = {\n    // Graphic state\n    w: { id: OPS.setLineWidth, numArgs: 1, variableArgs: false },\n    J: { id: OPS.setLineCap, numArgs: 1, variableArgs: false },\n    j: { id: OPS.setLineJoin, numArgs: 1, variableArgs: false },\n    M: { id: OPS.setMiterLimit, numArgs: 1, variableArgs: false },\n    d: { id: OPS.setDash, numArgs: 2, variableArgs: false },\n    ri: { id: OPS.setRenderingIntent, numArgs: 1, variableArgs: false },\n    i: { id: OPS.setFlatness, numArgs: 1, variableArgs: false },\n    gs: { id: OPS.setGState, numArgs: 1, variableArgs: false },\n    q: { id: OPS.save, numArgs: 0, variableArgs: false },\n    Q: { id: OPS.restore, numArgs: 0, variableArgs: false },\n    cm: { id: OPS.transform, numArgs: 6, variableArgs: false },\n\n    // Path\n    m: { id: OPS.moveTo, numArgs: 2, variableArgs: false },\n    l: { id: OPS.lineTo, numArgs: 2, variableArgs: false },\n    c: { id: OPS.curveTo, numArgs: 6, variableArgs: false },\n    v: { id: OPS.curveTo2, numArgs: 4, variableArgs: false },\n    y: { id: OPS.curveTo3, numArgs: 4, variableArgs: false },\n    h: { id: OPS.closePath, numArgs: 0, variableArgs: false },\n    re: { id: OPS.rectangle, numArgs: 4, variableArgs: false },\n    S: { id: OPS.stroke, numArgs: 0, variableArgs: false },\n    s: { id: OPS.closeStroke, numArgs: 0, variableArgs: false },\n    f: { id: OPS.fill, numArgs: 0, variableArgs: false },\n    F: { id: OPS.fill, numArgs: 0, variableArgs: false },\n    'f*': { id: OPS.eoFill, numArgs: 0, variableArgs: false },\n    B: { id: OPS.fillStroke, numArgs: 0, variableArgs: false },\n    'B*': { id: OPS.eoFillStroke, numArgs: 0, variableArgs: false },\n    b: { id: OPS.closeFillStroke, numArgs: 0, variableArgs: false },\n    'b*': { id: OPS.closeEOFillStroke, numArgs: 0, variableArgs: false },\n    n: { id: OPS.endPath, numArgs: 0, variableArgs: false },\n\n    // Clipping\n    W: { id: OPS.clip, numArgs: 0, variableArgs: false },\n    'W*': { id: OPS.eoClip, numArgs: 0, variableArgs: false },\n\n    // Text\n    BT: { id: OPS.beginText, numArgs: 0, variableArgs: false },\n    ET: { id: OPS.endText, numArgs: 0, variableArgs: false },\n    Tc: { id: OPS.setCharSpacing, numArgs: 1, variableArgs: false },\n    Tw: { id: OPS.setWordSpacing, numArgs: 1, variableArgs: false },\n    Tz: { id: OPS.setHScale, numArgs: 1, variableArgs: false },\n    TL: { id: OPS.setLeading, numArgs: 1, variableArgs: false },\n    Tf: { id: OPS.setFont, numArgs: 2, variableArgs: false },\n    Tr: { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false },\n    Ts: { id: OPS.setTextRise, numArgs: 1, variableArgs: false },\n    Td: { id: OPS.moveText, numArgs: 2, variableArgs: false },\n    TD: { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false },\n    Tm: { id: OPS.setTextMatrix, numArgs: 6, variableArgs: false },\n    'T*': { id: OPS.nextLine, numArgs: 0, variableArgs: false },\n    Tj: { id: OPS.showText, numArgs: 1, variableArgs: false },\n    TJ: { id: OPS.showSpacedText, numArgs: 1, variableArgs: false },\n    '\\'': { id: OPS.nextLineShowText, numArgs: 1, variableArgs: false },\n    '\"': { id: OPS.nextLineSetSpacingShowText, numArgs: 3,\n           variableArgs: false },\n\n    // Type3 fonts\n    d0: { id: OPS.setCharWidth, numArgs: 2, variableArgs: false },\n    d1: { id: OPS.setCharWidthAndBounds, numArgs: 6, variableArgs: false },\n\n    // Color\n    CS: { id: OPS.setStrokeColorSpace, numArgs: 1, variableArgs: false },\n    cs: { id: OPS.setFillColorSpace, numArgs: 1, variableArgs: false },\n    SC: { id: OPS.setStrokeColor, numArgs: 4, variableArgs: true },\n    SCN: { id: OPS.setStrokeColorN, numArgs: 33, variableArgs: true },\n    sc: { id: OPS.setFillColor, numArgs: 4, variableArgs: true },\n    scn: { id: OPS.setFillColorN, numArgs: 33, variableArgs: true },\n    G: { id: OPS.setStrokeGray, numArgs: 1, variableArgs: false },\n    g: { id: OPS.setFillGray, numArgs: 1, variableArgs: false },\n    RG: { id: OPS.setStrokeRGBColor, numArgs: 3, variableArgs: false },\n    rg: { id: OPS.setFillRGBColor, numArgs: 3, variableArgs: false },\n    K: { id: OPS.setStrokeCMYKColor, numArgs: 4, variableArgs: false },\n    k: { id: OPS.setFillCMYKColor, numArgs: 4, variableArgs: false },\n\n    // Shading\n    sh: { id: OPS.shadingFill, numArgs: 1, variableArgs: false },\n\n    // Images\n    BI: { id: OPS.beginInlineImage, numArgs: 0, variableArgs: false },\n    ID: { id: OPS.beginImageData, numArgs: 0, variableArgs: false },\n    EI: { id: OPS.endInlineImage, numArgs: 1, variableArgs: false },\n\n    // XObjects\n    Do: { id: OPS.paintXObject, numArgs: 1, variableArgs: false },\n    MP: { id: OPS.markPoint, numArgs: 1, variableArgs: false },\n    DP: { id: OPS.markPointProps, numArgs: 2, variableArgs: false },\n    BMC: { id: OPS.beginMarkedContent, numArgs: 1, variableArgs: false },\n    BDC: { id: OPS.beginMarkedContentProps, numArgs: 2,\n           variableArgs: false },\n    EMC: { id: OPS.endMarkedContent, numArgs: 0, variableArgs: false },\n\n    // Compatibility\n    BX: { id: OPS.beginCompat, numArgs: 0, variableArgs: false },\n    EX: { id: OPS.endCompat, numArgs: 0, variableArgs: false },\n\n    // (reserved partial commands for the lexer)\n    BM: null,\n    BD: null,\n    'true': null,\n    fa: null,\n    fal: null,\n    fals: null,\n    'false': null,\n    nu: null,\n    nul: null,\n    'null': null\n  };\n\n  function EvaluatorPreprocessor(stream, xref, stateManager) {\n    // TODO(mduan): pass array of knownCommands rather than OP_MAP\n    // dictionary\n    this.parser = new Parser(new Lexer(stream, OP_MAP), false, xref);\n    this.stateManager = stateManager;\n    this.nonProcessedArgs = [];\n  }\n\n  EvaluatorPreprocessor.prototype = {\n    get savedStatesDepth() {\n      return this.stateManager.stateStack.length;\n    },\n\n    // |operation| is an object with two fields:\n    //\n    // - |fn| is an out param.\n    //\n    // - |args| is an inout param. On entry, it should have one of two values.\n    //\n    //   - An empty array. This indicates that the caller is providing the\n    //     array in which the args will be stored in. The caller should use\n    //     this value if it can reuse a single array for each call to read().\n    //\n    //   - |null|. This indicates that the caller needs this function to create\n    //     the array in which any args are stored in. If there are zero args,\n    //     this function will leave |operation.args| as |null| (thus avoiding\n    //     allocations that would occur if we used an empty array to represent\n    //     zero arguments). Otherwise, it will replace |null| with a new array\n    //     containing the arguments. The caller should use this value if it\n    //     cannot reuse an array for each call to read().\n    //\n    // These two modes are present because this function is very hot and so\n    // avoiding allocations where possible is worthwhile.\n    //\n    read: function EvaluatorPreprocessor_read(operation) {\n      var args = operation.args;\n      while (true) {\n        var obj = this.parser.getObj();\n        if (isCmd(obj)) {\n          var cmd = obj.cmd;\n          // Check that the command is valid\n          var opSpec = OP_MAP[cmd];\n          if (!opSpec) {\n            warn('Unknown command \"' + cmd + '\"');\n            continue;\n          }\n\n          var fn = opSpec.id;\n          var numArgs = opSpec.numArgs;\n          var argsLength = args !== null ? args.length : 0;\n\n          if (!opSpec.variableArgs) {\n            // Postscript commands can be nested, e.g. /F2 /GS2 gs 5.711 Tf\n            if (argsLength !== numArgs) {\n              var nonProcessedArgs = this.nonProcessedArgs;\n              while (argsLength > numArgs) {\n                nonProcessedArgs.push(args.shift());\n                argsLength--;\n              }\n              while (argsLength < numArgs && nonProcessedArgs.length !== 0) {\n                if (!args) {\n                  args = [];\n                }\n                args.unshift(nonProcessedArgs.pop());\n                argsLength++;\n              }\n            }\n\n            if (argsLength < numArgs) {\n              // If we receive too few args, it's not possible to possible\n              // to execute the command, so skip the command\n              info('Command ' + fn + ': because expected ' +\n                   numArgs + ' args, but received ' + argsLength +\n                   ' args; skipping');\n              args = null;\n              continue;\n            }\n          } else if (argsLength > numArgs) {\n            info('Command ' + fn + ': expected [0,' + numArgs +\n                 '] args, but received ' + argsLength + ' args');\n          }\n\n          // TODO figure out how to type-check vararg functions\n          this.preprocessCommand(fn, args);\n\n          operation.fn = fn;\n          operation.args = args;\n          return true;\n        } else {\n          if (isEOF(obj)) {\n            return false; // no more commands\n          }\n          // argument\n          if (obj !== null) {\n            if (!args) {\n              args = [];\n            }\n            args.push((obj instanceof Dict ? obj.getAll() : obj));\n            assert(args.length <= 33, 'Too many arguments');\n          }\n        }\n      }\n    },\n\n    preprocessCommand:\n        function EvaluatorPreprocessor_preprocessCommand(fn, args) {\n      switch (fn | 0) {\n        case OPS.save:\n          this.stateManager.save();\n          break;\n        case OPS.restore:\n          this.stateManager.restore();\n          break;\n        case OPS.transform:\n          this.stateManager.transform(args);\n          break;\n      }\n    }\n  };\n  return EvaluatorPreprocessor;\n})();\n\nvar QueueOptimizer = (function QueueOptimizerClosure() {\n  function addState(parentState, pattern, fn) {\n    var state = parentState;\n    for (var i = 0, ii = pattern.length - 1; i < ii; i++) {\n      var item = pattern[i];\n      state = (state[item] || (state[item] = []));\n    }\n    state[pattern[pattern.length - 1]] = fn;\n  }\n\n  function handlePaintSolidColorImageMask(iFirstSave, count, fnArray,\n                                          argsArray) {\n    // Handles special case of mainly LaTeX documents which use image masks to\n    // draw lines with the current fill style.\n    // 'count' groups of (save, transform, paintImageMaskXObject, restore)+\n    // have been found at iFirstSave.\n    var iFirstPIMXO = iFirstSave + 2;\n    for (var i = 0; i < count; i++) {\n      var arg = argsArray[iFirstPIMXO + 4 * i];\n      var imageMask = arg.length === 1 && arg[0];\n      if (imageMask && imageMask.width === 1 && imageMask.height === 1 &&\n          (!imageMask.data.length ||\n           (imageMask.data.length === 1 && imageMask.data[0] === 0))) {\n        fnArray[iFirstPIMXO + 4 * i] = OPS.paintSolidColorImageMask;\n        continue;\n      }\n      break;\n    }\n    return count - i;\n  }\n\n  var InitialState = [];\n\n  // This replaces (save, transform, paintInlineImageXObject, restore)+\n  // sequences with one |paintInlineImageXObjectGroup| operation.\n  addState(InitialState,\n    [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore],\n    function foundInlineImageGroup(context) {\n      var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10;\n      var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200;\n      var MAX_WIDTH = 1000;\n      var IMAGE_PADDING = 1;\n\n      var fnArray = context.fnArray, argsArray = context.argsArray;\n      var curr = context.iCurr;\n      var iFirstSave = curr - 3;\n      var iFirstTransform = curr - 2;\n      var iFirstPIIXO = curr - 1;\n\n      // Look for the quartets.\n      var i = iFirstSave + 4;\n      var ii = fnArray.length;\n      while (i + 3 < ii) {\n        if (fnArray[i] !== OPS.save ||\n            fnArray[i + 1] !== OPS.transform ||\n            fnArray[i + 2] !== OPS.paintInlineImageXObject ||\n            fnArray[i + 3] !== OPS.restore) {\n          break;    // ops don't match\n        }\n        i += 4;\n      }\n\n      // At this point, i is the index of the first op past the last valid\n      // quartet.\n      var count = Math.min((i - iFirstSave) / 4,\n                           MAX_IMAGES_IN_INLINE_IMAGES_BLOCK);\n      if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) {\n        return i;\n      }\n\n      // assuming that heights of those image is too small (~1 pixel)\n      // packing as much as possible by lines\n      var maxX = 0;\n      var map = [], maxLineHeight = 0;\n      var currentX = IMAGE_PADDING, currentY = IMAGE_PADDING;\n      var q;\n      for (q = 0; q < count; q++) {\n        var transform = argsArray[iFirstTransform + (q << 2)];\n        var img = argsArray[iFirstPIIXO + (q << 2)][0];\n        if (currentX + img.width > MAX_WIDTH) {\n          // starting new line\n          maxX = Math.max(maxX, currentX);\n          currentY += maxLineHeight + 2 * IMAGE_PADDING;\n          currentX = 0;\n          maxLineHeight = 0;\n        }\n        map.push({\n          transform: transform,\n          x: currentX, y: currentY,\n          w: img.width, h: img.height\n        });\n        currentX += img.width + 2 * IMAGE_PADDING;\n        maxLineHeight = Math.max(maxLineHeight, img.height);\n      }\n      var imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING;\n      var imgHeight = currentY + maxLineHeight + IMAGE_PADDING;\n      var imgData = new Uint8Array(imgWidth * imgHeight * 4);\n      var imgRowSize = imgWidth << 2;\n      for (q = 0; q < count; q++) {\n        var data = argsArray[iFirstPIIXO + (q << 2)][0].data;\n        // Copy image by lines and extends pixels into padding.\n        var rowSize = map[q].w << 2;\n        var dataOffset = 0;\n        var offset = (map[q].x + map[q].y * imgWidth) << 2;\n        imgData.set(data.subarray(0, rowSize), offset - imgRowSize);\n        for (var k = 0, kk = map[q].h; k < kk; k++) {\n          imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset);\n          dataOffset += rowSize;\n          offset += imgRowSize;\n        }\n        imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset);\n        while (offset >= 0) {\n          data[offset - 4] = data[offset];\n          data[offset - 3] = data[offset + 1];\n          data[offset - 2] = data[offset + 2];\n          data[offset - 1] = data[offset + 3];\n          data[offset + rowSize] = data[offset + rowSize - 4];\n          data[offset + rowSize + 1] = data[offset + rowSize - 3];\n          data[offset + rowSize + 2] = data[offset + rowSize - 2];\n          data[offset + rowSize + 3] = data[offset + rowSize - 1];\n          offset -= imgRowSize;\n        }\n      }\n\n      // Replace queue items.\n      fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup);\n      argsArray.splice(iFirstSave, count * 4,\n        [{ width: imgWidth, height: imgHeight, kind: ImageKind.RGBA_32BPP,\n           data: imgData }, map]);\n\n      return iFirstSave + 1;\n    });\n\n  // This replaces (save, transform, paintImageMaskXObject, restore)+\n  // sequences with one |paintImageMaskXObjectGroup| or one\n  // |paintImageMaskXObjectRepeat| operation.\n  addState(InitialState,\n    [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore],\n    function foundImageMaskGroup(context) {\n      var MIN_IMAGES_IN_MASKS_BLOCK = 10;\n      var MAX_IMAGES_IN_MASKS_BLOCK = 100;\n      var MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000;\n\n      var fnArray = context.fnArray, argsArray = context.argsArray;\n      var curr = context.iCurr;\n      var iFirstSave = curr - 3;\n      var iFirstTransform = curr - 2;\n      var iFirstPIMXO = curr - 1;\n\n      // Look for the quartets.\n      var i = iFirstSave + 4;\n      var ii = fnArray.length;\n      while (i + 3 < ii) {\n        if (fnArray[i] !== OPS.save ||\n            fnArray[i + 1] !== OPS.transform ||\n            fnArray[i + 2] !== OPS.paintImageMaskXObject ||\n            fnArray[i + 3] !== OPS.restore) {\n          break;    // ops don't match\n        }\n        i += 4;\n      }\n\n      // At this point, i is the index of the first op past the last valid\n      // quartet.\n      var count = (i - iFirstSave) / 4;\n      count = handlePaintSolidColorImageMask(iFirstSave, count, fnArray,\n                                             argsArray);\n      if (count < MIN_IMAGES_IN_MASKS_BLOCK) {\n        return i;\n      }\n\n      var q;\n      var isSameImage = false;\n      var iTransform, transformArgs;\n      var firstPIMXOArg0 = argsArray[iFirstPIMXO][0];\n      if (argsArray[iFirstTransform][1] === 0 &&\n          argsArray[iFirstTransform][2] === 0) {\n        isSameImage = true;\n        var firstTransformArg0 = argsArray[iFirstTransform][0];\n        var firstTransformArg3 = argsArray[iFirstTransform][3];\n        iTransform = iFirstTransform + 4;\n        var iPIMXO = iFirstPIMXO + 4;\n        for (q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) {\n          transformArgs = argsArray[iTransform];\n          if (argsArray[iPIMXO][0] !== firstPIMXOArg0 ||\n              transformArgs[0] !== firstTransformArg0 ||\n              transformArgs[1] !== 0 ||\n              transformArgs[2] !== 0 ||\n              transformArgs[3] !== firstTransformArg3) {\n            if (q < MIN_IMAGES_IN_MASKS_BLOCK) {\n              isSameImage = false;\n            } else {\n              count = q;\n            }\n            break; // different image or transform\n          }\n        }\n      }\n\n      if (isSameImage) {\n        count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK);\n        var positions = new Float32Array(count * 2);\n        iTransform = iFirstTransform;\n        for (q = 0; q < count; q++, iTransform += 4) {\n          transformArgs = argsArray[iTransform];\n          positions[(q << 1)] = transformArgs[4];\n          positions[(q << 1) + 1] = transformArgs[5];\n        }\n\n        // Replace queue items.\n        fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat);\n        argsArray.splice(iFirstSave, count * 4,\n          [firstPIMXOArg0, firstTransformArg0, firstTransformArg3, positions]);\n      } else {\n        count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK);\n        var images = [];\n        for (q = 0; q < count; q++) {\n          transformArgs = argsArray[iFirstTransform + (q << 2)];\n          var maskParams = argsArray[iFirstPIMXO + (q << 2)][0];\n          images.push({ data: maskParams.data, width: maskParams.width,\n                        height: maskParams.height,\n                        transform: transformArgs });\n        }\n\n        // Replace queue items.\n        fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup);\n        argsArray.splice(iFirstSave, count * 4, [images]);\n      }\n\n      return iFirstSave + 1;\n    });\n\n  // This replaces (save, transform, paintImageXObject, restore)+ sequences\n  // with one paintImageXObjectRepeat operation, if the |transform| and\n  // |paintImageXObjectRepeat| ops are appropriate.\n  addState(InitialState,\n    [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore],\n    function (context) {\n      var MIN_IMAGES_IN_BLOCK = 3;\n      var MAX_IMAGES_IN_BLOCK = 1000;\n\n      var fnArray = context.fnArray, argsArray = context.argsArray;\n      var curr = context.iCurr;\n      var iFirstSave = curr - 3;\n      var iFirstTransform = curr - 2;\n      var iFirstPIXO = curr - 1;\n      var iFirstRestore = curr;\n\n      if (argsArray[iFirstTransform][1] !== 0 ||\n          argsArray[iFirstTransform][2] !== 0) {\n        return iFirstRestore + 1;   // transform has the wrong form\n      }\n\n      // Look for the quartets.\n      var firstPIXOArg0 = argsArray[iFirstPIXO][0];\n      var firstTransformArg0 = argsArray[iFirstTransform][0];\n      var firstTransformArg3 = argsArray[iFirstTransform][3];\n      var i = iFirstSave + 4;\n      var ii = fnArray.length;\n      while (i + 3 < ii) {\n        if (fnArray[i] !== OPS.save ||\n            fnArray[i + 1] !== OPS.transform ||\n            fnArray[i + 2] !== OPS.paintImageXObject ||\n            fnArray[i + 3] !== OPS.restore) {\n          break;    // ops don't match\n        }\n        if (argsArray[i + 1][0] !== firstTransformArg0 ||\n            argsArray[i + 1][1] !== 0 ||\n            argsArray[i + 1][2] !== 0 ||\n            argsArray[i + 1][3] !== firstTransformArg3) {\n          break;    // transforms don't match\n        }\n        if (argsArray[i + 2][0] !== firstPIXOArg0) {\n          break;    // images don't match\n        }\n        i += 4;\n      }\n\n      // At this point, i is the index of the first op past the last valid\n      // quartet.\n      var count = Math.min((i - iFirstSave) / 4, MAX_IMAGES_IN_BLOCK);\n      if (count < MIN_IMAGES_IN_BLOCK) {\n        return i;\n      }\n\n      // Extract the (x,y) positions from all of the matching transforms.\n      var positions = new Float32Array(count * 2);\n      var iTransform = iFirstTransform;\n      for (var q = 0; q < count; q++, iTransform += 4) {\n        var transformArgs = argsArray[iTransform];\n        positions[(q << 1)] = transformArgs[4];\n        positions[(q << 1) + 1] = transformArgs[5];\n      }\n\n      // Replace queue items.\n      var args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3,\n                  positions];\n      fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat);\n      argsArray.splice(iFirstSave, count * 4, args);\n\n      return iFirstSave + 1;\n    });\n\n  // This replaces (beginText, setFont, setTextMatrix, showText, endText)+\n  // sequences with (beginText, setFont, (setTextMatrix, showText)+, endText)+\n  // sequences, if the font for each one is the same.\n  addState(InitialState,\n    [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText],\n    function (context) {\n      var MIN_CHARS_IN_BLOCK = 3;\n      var MAX_CHARS_IN_BLOCK = 1000;\n\n      var fnArray = context.fnArray, argsArray = context.argsArray;\n      var curr = context.iCurr;\n      var iFirstBeginText = curr - 4;\n      var iFirstSetFont = curr - 3;\n      var iFirstSetTextMatrix = curr - 2;\n      var iFirstShowText = curr - 1;\n      var iFirstEndText = curr;\n\n      // Look for the quintets.\n      var firstSetFontArg0 = argsArray[iFirstSetFont][0];\n      var firstSetFontArg1 = argsArray[iFirstSetFont][1];\n      var i = iFirstBeginText + 5;\n      var ii = fnArray.length;\n      while (i + 4 < ii) {\n        if (fnArray[i] !== OPS.beginText ||\n            fnArray[i + 1] !== OPS.setFont ||\n            fnArray[i + 2] !== OPS.setTextMatrix ||\n            fnArray[i + 3] !== OPS.showText ||\n            fnArray[i + 4] !== OPS.endText) {\n          break;    // ops don't match\n        }\n        if (argsArray[i + 1][0] !== firstSetFontArg0 ||\n            argsArray[i + 1][1] !== firstSetFontArg1) {\n          break;    // fonts don't match\n        }\n        i += 5;\n      }\n\n      // At this point, i is the index of the first op past the last valid\n      // quintet.\n      var count = Math.min(((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK);\n      if (count < MIN_CHARS_IN_BLOCK) {\n        return i;\n      }\n\n      // If the preceding quintet is (<something>, setFont, setTextMatrix,\n      // showText, endText), include that as well. (E.g. <something> might be\n      // |dependency|.)\n      var iFirst = iFirstBeginText;\n      if (iFirstBeginText >= 4 &&\n          fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] &&\n          fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] &&\n          fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] &&\n          fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] &&\n          argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 &&\n          argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) {\n        count++;\n        iFirst -= 5;\n      }\n\n      // Remove (endText, beginText, setFont) trios.\n      var iEndText = iFirst + 4;\n      for (var q = 1; q < count; q++) {\n        fnArray.splice(iEndText, 3);\n        argsArray.splice(iEndText, 3);\n        iEndText += 2;\n      }\n\n      return iEndText + 1;\n    });\n\n  function QueueOptimizer() {}\n\n  QueueOptimizer.prototype = {\n    optimize: function QueueOptimizer_optimize(queue) {\n      var fnArray = queue.fnArray, argsArray = queue.argsArray;\n      var context = {\n        iCurr: 0,\n        fnArray: fnArray,\n        argsArray: argsArray\n      };\n      var state;\n      var i = 0, ii = fnArray.length;\n      while (i < ii) {\n        state = (state || InitialState)[fnArray[i]];\n        if (typeof state === 'function') { // we found some handler\n          context.iCurr = i;\n          // state() returns the index of the first non-matching op (if we\n          // didn't match) or the first op past the modified ops (if we did\n          // match and replace).\n          i = state(context);\n          state = undefined;    // reset the state machine\n          ii = context.fnArray.length;\n        } else {\n          i++;\n        }\n      }\n    }\n  };\n  return QueueOptimizer;\n})();\n\n\nvar BUILT_IN_CMAPS = [\n// << Start unicode maps.\n'Adobe-GB1-UCS2',\n'Adobe-CNS1-UCS2',\n'Adobe-Japan1-UCS2',\n'Adobe-Korea1-UCS2',\n// >> End unicode maps.\n'78-EUC-H',\n'78-EUC-V',\n'78-H',\n'78-RKSJ-H',\n'78-RKSJ-V',\n'78-V',\n'78ms-RKSJ-H',\n'78ms-RKSJ-V',\n'83pv-RKSJ-H',\n'90ms-RKSJ-H',\n'90ms-RKSJ-V',\n'90msp-RKSJ-H',\n'90msp-RKSJ-V',\n'90pv-RKSJ-H',\n'90pv-RKSJ-V',\n'Add-H',\n'Add-RKSJ-H',\n'Add-RKSJ-V',\n'Add-V',\n'Adobe-CNS1-0',\n'Adobe-CNS1-1',\n'Adobe-CNS1-2',\n'Adobe-CNS1-3',\n'Adobe-CNS1-4',\n'Adobe-CNS1-5',\n'Adobe-CNS1-6',\n'Adobe-GB1-0',\n'Adobe-GB1-1',\n'Adobe-GB1-2',\n'Adobe-GB1-3',\n'Adobe-GB1-4',\n'Adobe-GB1-5',\n'Adobe-Japan1-0',\n'Adobe-Japan1-1',\n'Adobe-Japan1-2',\n'Adobe-Japan1-3',\n'Adobe-Japan1-4',\n'Adobe-Japan1-5',\n'Adobe-Japan1-6',\n'Adobe-Korea1-0',\n'Adobe-Korea1-1',\n'Adobe-Korea1-2',\n'B5-H',\n'B5-V',\n'B5pc-H',\n'B5pc-V',\n'CNS-EUC-H',\n'CNS-EUC-V',\n'CNS1-H',\n'CNS1-V',\n'CNS2-H',\n'CNS2-V',\n'ETHK-B5-H',\n'ETHK-B5-V',\n'ETen-B5-H',\n'ETen-B5-V',\n'ETenms-B5-H',\n'ETenms-B5-V',\n'EUC-H',\n'EUC-V',\n'Ext-H',\n'Ext-RKSJ-H',\n'Ext-RKSJ-V',\n'Ext-V',\n'GB-EUC-H',\n'GB-EUC-V',\n'GB-H',\n'GB-V',\n'GBK-EUC-H',\n'GBK-EUC-V',\n'GBK2K-H',\n'GBK2K-V',\n'GBKp-EUC-H',\n'GBKp-EUC-V',\n'GBT-EUC-H',\n'GBT-EUC-V',\n'GBT-H',\n'GBT-V',\n'GBTpc-EUC-H',\n'GBTpc-EUC-V',\n'GBpc-EUC-H',\n'GBpc-EUC-V',\n'H',\n'HKdla-B5-H',\n'HKdla-B5-V',\n'HKdlb-B5-H',\n'HKdlb-B5-V',\n'HKgccs-B5-H',\n'HKgccs-B5-V',\n'HKm314-B5-H',\n'HKm314-B5-V',\n'HKm471-B5-H',\n'HKm471-B5-V',\n'HKscs-B5-H',\n'HKscs-B5-V',\n'Hankaku',\n'Hiragana',\n'KSC-EUC-H',\n'KSC-EUC-V',\n'KSC-H',\n'KSC-Johab-H',\n'KSC-Johab-V',\n'KSC-V',\n'KSCms-UHC-H',\n'KSCms-UHC-HW-H',\n'KSCms-UHC-HW-V',\n'KSCms-UHC-V',\n'KSCpc-EUC-H',\n'KSCpc-EUC-V',\n'Katakana',\n'NWP-H',\n'NWP-V',\n'RKSJ-H',\n'RKSJ-V',\n'Roman',\n'UniCNS-UCS2-H',\n'UniCNS-UCS2-V',\n'UniCNS-UTF16-H',\n'UniCNS-UTF16-V',\n'UniCNS-UTF32-H',\n'UniCNS-UTF32-V',\n'UniCNS-UTF8-H',\n'UniCNS-UTF8-V',\n'UniGB-UCS2-H',\n'UniGB-UCS2-V',\n'UniGB-UTF16-H',\n'UniGB-UTF16-V',\n'UniGB-UTF32-H',\n'UniGB-UTF32-V',\n'UniGB-UTF8-H',\n'UniGB-UTF8-V',\n'UniJIS-UCS2-H',\n'UniJIS-UCS2-HW-H',\n'UniJIS-UCS2-HW-V',\n'UniJIS-UCS2-V',\n'UniJIS-UTF16-H',\n'UniJIS-UTF16-V',\n'UniJIS-UTF32-H',\n'UniJIS-UTF32-V',\n'UniJIS-UTF8-H',\n'UniJIS-UTF8-V',\n'UniJIS2004-UTF16-H',\n'UniJIS2004-UTF16-V',\n'UniJIS2004-UTF32-H',\n'UniJIS2004-UTF32-V',\n'UniJIS2004-UTF8-H',\n'UniJIS2004-UTF8-V',\n'UniJISPro-UCS2-HW-V',\n'UniJISPro-UCS2-V',\n'UniJISPro-UTF8-V',\n'UniJISX0213-UTF32-H',\n'UniJISX0213-UTF32-V',\n'UniJISX02132004-UTF32-H',\n'UniJISX02132004-UTF32-V',\n'UniKS-UCS2-H',\n'UniKS-UCS2-V',\n'UniKS-UTF16-H',\n'UniKS-UTF16-V',\n'UniKS-UTF32-H',\n'UniKS-UTF32-V',\n'UniKS-UTF8-H',\n'UniKS-UTF8-V',\n'V',\n'WP-Symbol'];\n\n// CMap, not to be confused with TrueType's cmap.\nvar CMap = (function CMapClosure() {\n  function CMap(builtInCMap) {\n    // Codespace ranges are stored as follows:\n    // [[1BytePairs], [2BytePairs], [3BytePairs], [4BytePairs]]\n    // where nBytePairs are ranges e.g. [low1, high1, low2, high2, ...]\n    this.codespaceRanges = [[], [], [], []];\n    this.numCodespaceRanges = 0;\n    // Map entries have one of two forms.\n    // - cid chars are 16-bit unsigned integers, stored as integers.\n    // - bf chars are variable-length byte sequences, stored as strings, with\n    //   one byte per character.\n    this._map = [];\n    this.name = '';\n    this.vertical = false;\n    this.useCMap = null;\n    this.builtInCMap = builtInCMap;\n  }\n  CMap.prototype = {\n    addCodespaceRange: function(n, low, high) {\n      this.codespaceRanges[n - 1].push(low, high);\n      this.numCodespaceRanges++;\n    },\n\n    mapCidRange: function(low, high, dstLow) {\n      while (low <= high) {\n        this._map[low++] = dstLow++;\n      }\n    },\n\n    mapBfRange: function(low, high, dstLow) {\n      var lastByte = dstLow.length - 1;\n      while (low <= high) {\n        this._map[low++] = dstLow;\n        // Only the last byte has to be incremented.\n        dstLow = dstLow.substr(0, lastByte) +\n                 String.fromCharCode(dstLow.charCodeAt(lastByte) + 1);\n      }\n    },\n\n    mapBfRangeToArray: function(low, high, array) {\n      var i = 0, ii = array.length;\n      while (low <= high && i < ii) {\n        this._map[low] = array[i++];\n        ++low;\n      }\n    },\n\n    // This is used for both bf and cid chars.\n    mapOne: function(src, dst) {\n      this._map[src] = dst;\n    },\n\n    lookup: function(code) {\n      return this._map[code];\n    },\n\n    contains: function(code) {\n      return this._map[code] !== undefined;\n    },\n\n    forEach: function(callback) {\n      // Most maps have fewer than 65536 entries, and for those we use normal\n      // array iteration. But really sparse tables are possible -- e.g. with\n      // indices in the *billions*. For such tables we use for..in, which isn't\n      // ideal because it stringifies the indices for all present elements, but\n      // it does avoid iterating over every undefined entry.\n      var map = this._map;\n      var length = map.length;\n      var i;\n      if (length <= 0x10000) {\n        for (i = 0; i < length; i++) {\n          if (map[i] !== undefined) {\n            callback(i, map[i]);\n          }\n        }\n      } else {\n        for (i in this._map) {\n          callback(i, map[i]);\n        }\n      }\n    },\n\n    charCodeOf: function(value) {\n      return this._map.indexOf(value);\n    },\n\n    getMap: function() {\n      return this._map;\n    },\n\n    readCharCode: function(str, offset, out) {\n      var c = 0;\n      var codespaceRanges = this.codespaceRanges;\n      var codespaceRangesLen = this.codespaceRanges.length;\n      // 9.7.6.2 CMap Mapping\n      // The code length is at most 4.\n      for (var n = 0; n < codespaceRangesLen; n++) {\n        c = ((c << 8) | str.charCodeAt(offset + n)) >>> 0;\n        // Check each codespace range to see if it falls within.\n        var codespaceRange = codespaceRanges[n];\n        for (var k = 0, kk = codespaceRange.length; k < kk;) {\n          var low = codespaceRange[k++];\n          var high = codespaceRange[k++];\n          if (c >= low && c <= high) {\n            out.charcode = c;\n            out.length = n + 1;\n            return;\n          }\n        }\n      }\n      out.charcode = 0;\n      out.length = 1;\n    },\n\n    get isIdentityCMap() {\n      if (!(this.name === 'Identity-H' || this.name === 'Identity-V')) {\n        return false;\n      }\n      if (this._map.length !== 0x10000) {\n        return false;\n      }\n      for (var i = 0; i < 0x10000; i++) {\n        if (this._map[i] !== i) {\n          return false;\n        }\n      }\n      return true;\n    }\n  };\n  return CMap;\n})();\n\n// A special case of CMap, where the _map array implicitly has a length of\n// 65536 and each element is equal to its index.\nvar IdentityCMap = (function IdentityCMapClosure() {\n  function IdentityCMap(vertical, n) {\n    CMap.call(this);\n    this.vertical = vertical;\n    this.addCodespaceRange(n, 0, 0xffff);\n  }\n  Util.inherit(IdentityCMap, CMap, {});\n\n  IdentityCMap.prototype = {\n    addCodespaceRange: CMap.prototype.addCodespaceRange,\n\n    mapCidRange: function(low, high, dstLow) {\n      error('should not call mapCidRange');\n    },\n\n    mapBfRange: function(low, high, dstLow) {\n      error('should not call mapBfRange');\n    },\n\n    mapBfRangeToArray: function(low, high, array) {\n      error('should not call mapBfRangeToArray');\n    },\n\n    mapOne: function(src, dst) {\n      error('should not call mapCidOne');\n    },\n\n    lookup: function(code) {\n      return (isInt(code) && code <= 0xffff) ? code : undefined;\n    },\n\n    contains: function(code) {\n      return isInt(code) && code <= 0xffff;\n    },\n\n    forEach: function(callback) {\n      for (var i = 0; i <= 0xffff; i++) {\n        callback(i, i);\n      }\n    },\n\n    charCodeOf: function(value) {\n      return (isInt(value) && value <= 0xffff) ? value : -1;\n    },\n\n    getMap: function() {\n      // Sometimes identity maps must be instantiated, but it's rare.\n      var map = new Array(0x10000);\n      for (var i = 0; i <= 0xffff; i++) {\n        map[i] = i;\n      }\n      return map;\n    },\n\n    readCharCode: CMap.prototype.readCharCode,\n\n    get isIdentityCMap() {\n      error('should not access .isIdentityCMap');\n    }\n  };\n\n  return IdentityCMap;\n})();\n\nvar BinaryCMapReader = (function BinaryCMapReaderClosure() {\n  function fetchBinaryData(url) {\n    var nonBinaryRequest = PDFJS.disableWorker;\n    var request = new XMLHttpRequest();\n    request.open('GET', url, false);\n    if (!nonBinaryRequest) {\n      try {\n        request.responseType = 'arraybuffer';\n        nonBinaryRequest = request.responseType !== 'arraybuffer';\n      } catch (e) {\n        nonBinaryRequest = true;\n      }\n    }\n    if (nonBinaryRequest && request.overrideMimeType) {\n      request.overrideMimeType('text/plain; charset=x-user-defined');\n    }\n    request.send(null);\n    if (nonBinaryRequest ? !request.responseText : !request.response) {\n      error('Unable to get binary cMap at: ' + url);\n    }\n    if (nonBinaryRequest) {\n      var data = Array.prototype.map.call(request.responseText, function (ch) {\n        return ch.charCodeAt(0) & 255;\n      });\n      return new Uint8Array(data);\n    }\n    return new Uint8Array(request.response);\n  }\n\n  function hexToInt(a, size) {\n    var n = 0;\n    for (var i = 0; i <= size; i++) {\n      n = (n << 8) | a[i];\n    }\n    return n >>> 0;\n  }\n\n  function hexToStr(a, size) {\n    // This code is hot. Special-case some common values to avoid creating an\n    // object with subarray().\n    if (size === 1) {\n      return String.fromCharCode(a[0], a[1]);\n    }\n    if (size === 3) {\n      return String.fromCharCode(a[0], a[1], a[2], a[3]);\n    }\n    return String.fromCharCode.apply(null, a.subarray(0, size + 1));\n  }\n\n  function addHex(a, b, size) {\n    var c = 0;\n    for (var i = size; i >= 0; i--) {\n      c += a[i] + b[i];\n      a[i] = c & 255;\n      c >>= 8;\n    }\n  }\n\n  function incHex(a, size) {\n    var c = 1;\n    for (var i = size; i >= 0 && c > 0; i--) {\n      c += a[i];\n      a[i] = c & 255;\n      c >>= 8;\n    }\n  }\n\n  var MAX_NUM_SIZE = 16;\n  var MAX_ENCODED_NUM_SIZE = 19; // ceil(MAX_NUM_SIZE * 7 / 8)\n\n  function BinaryCMapStream(data) {\n    this.buffer = data;\n    this.pos = 0;\n    this.end = data.length;\n    this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE);\n  }\n\n  BinaryCMapStream.prototype = {\n    readByte: function () {\n      if (this.pos >= this.end) {\n        return -1;\n      }\n      return this.buffer[this.pos++];\n    },\n    readNumber: function () {\n      var n = 0;\n      var last;\n      do {\n        var b = this.readByte();\n        if (b < 0) {\n          error('unexpected EOF in bcmap');\n        }\n        last = !(b & 0x80);\n        n = (n << 7) | (b & 0x7F);\n      } while (!last);\n      return n;\n    },\n    readSigned: function () {\n      var n = this.readNumber();\n      return (n & 1) ? ~(n >>> 1) : n >>> 1;\n    },\n    readHex: function (num, size) {\n      num.set(this.buffer.subarray(this.pos,\n        this.pos + size + 1));\n      this.pos += size + 1;\n    },\n    readHexNumber: function (num, size) {\n      var last;\n      var stack = this.tmpBuf, sp = 0;\n      do {\n        var b = this.readByte();\n        if (b < 0) {\n          error('unexpected EOF in bcmap');\n        }\n        last = !(b & 0x80);\n        stack[sp++] = b & 0x7F;\n      } while (!last);\n      var i = size, buffer = 0, bufferSize = 0;\n      while (i >= 0) {\n        while (bufferSize < 8 && stack.length > 0) {\n          buffer = (stack[--sp] << bufferSize) | buffer;\n          bufferSize += 7;\n        }\n        num[i] = buffer & 255;\n        i--;\n        buffer >>= 8;\n        bufferSize -= 8;\n      }\n    },\n    readHexSigned: function (num, size) {\n      this.readHexNumber(num, size);\n      var sign = num[size] & 1 ? 255 : 0;\n      var c = 0;\n      for (var i = 0; i <= size; i++) {\n        c = ((c & 1) << 8) | num[i];\n        num[i] = (c >> 1) ^ sign;\n      }\n    },\n    readString: function () {\n      var len = this.readNumber();\n      var s = '';\n      for (var i = 0; i < len; i++) {\n        s += String.fromCharCode(this.readNumber());\n      }\n      return s;\n    }\n  };\n\n  function processBinaryCMap(url, cMap, extend) {\n    var data = fetchBinaryData(url);\n    var stream = new BinaryCMapStream(data);\n\n    var header = stream.readByte();\n    cMap.vertical = !!(header & 1);\n\n    var useCMap = null;\n    var start = new Uint8Array(MAX_NUM_SIZE);\n    var end = new Uint8Array(MAX_NUM_SIZE);\n    var char = new Uint8Array(MAX_NUM_SIZE);\n    var charCode = new Uint8Array(MAX_NUM_SIZE);\n    var tmp = new Uint8Array(MAX_NUM_SIZE);\n    var code;\n\n    var b;\n    while ((b = stream.readByte()) >= 0) {\n      var type = b >> 5;\n      if (type === 7) { // metadata, e.g. comment or usecmap\n        switch (b & 0x1F) {\n          case 0:\n            stream.readString(); // skipping comment\n            break;\n          case 1:\n            useCMap = stream.readString();\n            break;\n        }\n        continue;\n      }\n      var sequence = !!(b & 0x10);\n      var dataSize = b & 15;\n\n      assert(dataSize + 1 <= MAX_NUM_SIZE);\n\n      var ucs2DataSize = 1;\n      var subitemsCount = stream.readNumber();\n      var i;\n      switch (type) {\n        case 0: // codespacerange\n          stream.readHex(start, dataSize);\n          stream.readHexNumber(end, dataSize);\n          addHex(end, start, dataSize);\n          cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize),\n                                 hexToInt(end, dataSize));\n          for (i = 1; i < subitemsCount; i++) {\n            incHex(end, dataSize);\n            stream.readHexNumber(start, dataSize);\n            addHex(start, end, dataSize);\n            stream.readHexNumber(end, dataSize);\n            addHex(end, start, dataSize);\n            cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize),\n                                   hexToInt(end, dataSize));\n          }\n          break;\n        case 1: // notdefrange\n          stream.readHex(start, dataSize);\n          stream.readHexNumber(end, dataSize);\n          addHex(end, start, dataSize);\n          code = stream.readNumber();\n          // undefined range, skipping\n          for (i = 1; i < subitemsCount; i++) {\n            incHex(end, dataSize);\n            stream.readHexNumber(start, dataSize);\n            addHex(start, end, dataSize);\n            stream.readHexNumber(end, dataSize);\n            addHex(end, start, dataSize);\n            code = stream.readNumber();\n            // nop\n          }\n          break;\n        case 2: // cidchar\n          stream.readHex(char, dataSize);\n          code = stream.readNumber();\n          cMap.mapOne(hexToInt(char, dataSize), code);\n          for (i = 1; i < subitemsCount; i++) {\n            incHex(char, dataSize);\n            if (!sequence) {\n              stream.readHexNumber(tmp, dataSize);\n              addHex(char, tmp, dataSize);\n            }\n            code = stream.readSigned() + (code + 1);\n            cMap.mapOne(hexToInt(char, dataSize), code);\n          }\n          break;\n        case 3: // cidrange\n          stream.readHex(start, dataSize);\n          stream.readHexNumber(end, dataSize);\n          addHex(end, start, dataSize);\n          code = stream.readNumber();\n          cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize),\n                           code);\n          for (i = 1; i < subitemsCount; i++) {\n            incHex(end, dataSize);\n            if (!sequence) {\n              stream.readHexNumber(start, dataSize);\n              addHex(start, end, dataSize);\n            } else {\n              start.set(end);\n            }\n            stream.readHexNumber(end, dataSize);\n            addHex(end, start, dataSize);\n            code = stream.readNumber();\n            cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize),\n                             code);\n          }\n          break;\n        case 4: // bfchar\n          stream.readHex(char, ucs2DataSize);\n          stream.readHex(charCode, dataSize);\n          cMap.mapOne(hexToInt(char, ucs2DataSize),\n                      hexToStr(charCode, dataSize));\n          for (i = 1; i < subitemsCount; i++) {\n            incHex(char, ucs2DataSize);\n            if (!sequence) {\n              stream.readHexNumber(tmp, ucs2DataSize);\n              addHex(char, tmp, ucs2DataSize);\n            }\n            incHex(charCode, dataSize);\n            stream.readHexSigned(tmp, dataSize);\n            addHex(charCode, tmp, dataSize);\n            cMap.mapOne(hexToInt(char, ucs2DataSize),\n                        hexToStr(charCode, dataSize));\n          }\n          break;\n        case 5: // bfrange\n          stream.readHex(start, ucs2DataSize);\n          stream.readHexNumber(end, ucs2DataSize);\n          addHex(end, start, ucs2DataSize);\n          stream.readHex(charCode, dataSize);\n          cMap.mapBfRange(hexToInt(start, ucs2DataSize),\n                          hexToInt(end, ucs2DataSize),\n                          hexToStr(charCode, dataSize));\n          for (i = 1; i < subitemsCount; i++) {\n            incHex(end, ucs2DataSize);\n            if (!sequence) {\n              stream.readHexNumber(start, ucs2DataSize);\n              addHex(start, end, ucs2DataSize);\n            } else {\n              start.set(end);\n            }\n            stream.readHexNumber(end, ucs2DataSize);\n            addHex(end, start, ucs2DataSize);\n            stream.readHex(charCode, dataSize);\n            cMap.mapBfRange(hexToInt(start, ucs2DataSize),\n                            hexToInt(end, ucs2DataSize),\n                            hexToStr(charCode, dataSize));\n          }\n          break;\n        default:\n          error('Unknown type: ' + type);\n          break;\n      }\n    }\n\n    if (useCMap) {\n      extend(useCMap);\n    }\n    return cMap;\n  }\n\n  function BinaryCMapReader() {}\n\n  BinaryCMapReader.prototype = {\n    read: processBinaryCMap\n  };\n\n  return BinaryCMapReader;\n})();\n\nvar CMapFactory = (function CMapFactoryClosure() {\n  function strToInt(str) {\n    var a = 0;\n    for (var i = 0; i < str.length; i++) {\n      a = (a << 8) | str.charCodeAt(i);\n    }\n    return a >>> 0;\n  }\n\n  function expectString(obj) {\n    if (!isString(obj)) {\n      error('Malformed CMap: expected string.');\n    }\n  }\n\n  function expectInt(obj) {\n    if (!isInt(obj)) {\n      error('Malformed CMap: expected int.');\n    }\n  }\n\n  function parseBfChar(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if (isEOF(obj)) {\n        break;\n      }\n      if (isCmd(obj, 'endbfchar')) {\n        return;\n      }\n      expectString(obj);\n      var src = strToInt(obj);\n      obj = lexer.getObj();\n      // TODO are /dstName used?\n      expectString(obj);\n      var dst = obj;\n      cMap.mapOne(src, dst);\n    }\n  }\n\n  function parseBfRange(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if (isEOF(obj)) {\n        break;\n      }\n      if (isCmd(obj, 'endbfrange')) {\n        return;\n      }\n      expectString(obj);\n      var low = strToInt(obj);\n      obj = lexer.getObj();\n      expectString(obj);\n      var high = strToInt(obj);\n      obj = lexer.getObj();\n      if (isInt(obj) || isString(obj)) {\n        var dstLow = isInt(obj) ? String.fromCharCode(obj) : obj;\n        cMap.mapBfRange(low, high, dstLow);\n      } else if (isCmd(obj, '[')) {\n        obj = lexer.getObj();\n        var array = [];\n        while (!isCmd(obj, ']') && !isEOF(obj)) {\n          array.push(obj);\n          obj = lexer.getObj();\n        }\n        cMap.mapBfRangeToArray(low, high, array);\n      } else {\n        break;\n      }\n    }\n    error('Invalid bf range.');\n  }\n\n  function parseCidChar(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if (isEOF(obj)) {\n        break;\n      }\n      if (isCmd(obj, 'endcidchar')) {\n        return;\n      }\n      expectString(obj);\n      var src = strToInt(obj);\n      obj = lexer.getObj();\n      expectInt(obj);\n      var dst = obj;\n      cMap.mapOne(src, dst);\n    }\n  }\n\n  function parseCidRange(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if (isEOF(obj)) {\n        break;\n      }\n      if (isCmd(obj, 'endcidrange')) {\n        return;\n      }\n      expectString(obj);\n      var low = strToInt(obj);\n      obj = lexer.getObj();\n      expectString(obj);\n      var high = strToInt(obj);\n      obj = lexer.getObj();\n      expectInt(obj);\n      var dstLow = obj;\n      cMap.mapCidRange(low, high, dstLow);\n    }\n  }\n\n  function parseCodespaceRange(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if (isEOF(obj)) {\n        break;\n      }\n      if (isCmd(obj, 'endcodespacerange')) {\n        return;\n      }\n      if (!isString(obj)) {\n        break;\n      }\n      var low = strToInt(obj);\n      obj = lexer.getObj();\n      if (!isString(obj)) {\n        break;\n      }\n      var high = strToInt(obj);\n      cMap.addCodespaceRange(obj.length, low, high);\n    }\n    error('Invalid codespace range.');\n  }\n\n  function parseWMode(cMap, lexer) {\n    var obj = lexer.getObj();\n    if (isInt(obj)) {\n      cMap.vertical = !!obj;\n    }\n  }\n\n  function parseCMapName(cMap, lexer) {\n    var obj = lexer.getObj();\n    if (isName(obj) && isString(obj.name)) {\n      cMap.name = obj.name;\n    }\n  }\n\n  function parseCMap(cMap, lexer, builtInCMapParams, useCMap) {\n    var previous;\n    var embededUseCMap;\n    objLoop: while (true) {\n      var obj = lexer.getObj();\n      if (isEOF(obj)) {\n        break;\n      } else if (isName(obj)) {\n        if (obj.name === 'WMode') {\n          parseWMode(cMap, lexer);\n        } else if (obj.name === 'CMapName') {\n          parseCMapName(cMap, lexer);\n        }\n        previous = obj;\n      } else if (isCmd(obj)) {\n        switch (obj.cmd) {\n          case 'endcmap':\n            break objLoop;\n          case 'usecmap':\n            if (isName(previous)) {\n              embededUseCMap = previous.name;\n            }\n            break;\n          case 'begincodespacerange':\n            parseCodespaceRange(cMap, lexer);\n            break;\n          case 'beginbfchar':\n            parseBfChar(cMap, lexer);\n            break;\n          case 'begincidchar':\n            parseCidChar(cMap, lexer);\n            break;\n          case 'beginbfrange':\n            parseBfRange(cMap, lexer);\n            break;\n          case 'begincidrange':\n            parseCidRange(cMap, lexer);\n            break;\n        }\n      }\n    }\n\n    if (!useCMap && embededUseCMap) {\n      // Load the usecmap definition from the file only if there wasn't one\n      // specified.\n      useCMap = embededUseCMap;\n    }\n    if (useCMap) {\n      extendCMap(cMap, builtInCMapParams, useCMap);\n    }\n  }\n\n  function extendCMap(cMap, builtInCMapParams, useCMap) {\n    cMap.useCMap = createBuiltInCMap(useCMap, builtInCMapParams);\n    // If there aren't any code space ranges defined clone all the parent ones\n    // into this cMap.\n    if (cMap.numCodespaceRanges === 0) {\n      var useCodespaceRanges = cMap.useCMap.codespaceRanges;\n      for (var i = 0; i < useCodespaceRanges.length; i++) {\n        cMap.codespaceRanges[i] = useCodespaceRanges[i].slice();\n      }\n      cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges;\n    }\n    // Merge the map into the current one, making sure not to override\n    // any previously defined entries.\n    cMap.useCMap.forEach(function(key, value) {\n      if (!cMap.contains(key)) {\n        cMap.mapOne(key, cMap.useCMap.lookup(key));\n      }\n    });\n  }\n\n  function parseBinaryCMap(name, builtInCMapParams) {\n    var url = builtInCMapParams.url + name + '.bcmap';\n    var cMap = new CMap(true);\n    new BinaryCMapReader().read(url, cMap, function (useCMap) {\n      extendCMap(cMap, builtInCMapParams, useCMap);\n    });\n    return cMap;\n  }\n\n  function createBuiltInCMap(name, builtInCMapParams) {\n    if (name === 'Identity-H') {\n      return new IdentityCMap(false, 2);\n    } else if (name === 'Identity-V') {\n      return new IdentityCMap(true, 2);\n    }\n    if (BUILT_IN_CMAPS.indexOf(name) === -1) {\n      error('Unknown cMap name: ' + name);\n    }\n    assert(builtInCMapParams, 'built-in cMap parameters are not provided');\n\n    if (builtInCMapParams.packed) {\n      return parseBinaryCMap(name, builtInCMapParams);\n    }\n\n    var request = new XMLHttpRequest();\n    var url = builtInCMapParams.url + name;\n    request.open('GET', url, false);\n    request.send(null);\n    if (!request.responseText) {\n      error('Unable to get cMap at: ' + url);\n    }\n    var cMap = new CMap(true);\n    var lexer = new Lexer(new StringStream(request.responseText));\n    parseCMap(cMap, lexer, builtInCMapParams, null);\n    return cMap;\n  }\n\n  return {\n    create: function (encoding, builtInCMapParams, useCMap) {\n      if (isName(encoding)) {\n        return createBuiltInCMap(encoding.name, builtInCMapParams);\n      } else if (isStream(encoding)) {\n        var cMap = new CMap();\n        var lexer = new Lexer(encoding);\n        try {\n          parseCMap(cMap, lexer, builtInCMapParams, useCMap);\n        } catch (e) {\n          warn('Invalid CMap data. ' + e);\n        }\n        if (cMap.isIdentityCMap) {\n          return createBuiltInCMap(cMap.name, builtInCMapParams);\n        }\n        return cMap;\n      }\n      error('Encoding required.');\n    }\n  };\n})();\n\n\n// Unicode Private Use Area\nvar PRIVATE_USE_OFFSET_START = 0xE000;\nvar PRIVATE_USE_OFFSET_END = 0xF8FF;\nvar SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = false;\n\n// PDF Glyph Space Units are one Thousandth of a TextSpace Unit\n// except for Type 3 fonts\nvar PDF_GLYPH_SPACE_UNITS = 1000;\n\n// Hinting is currently disabled due to unknown problems on windows\n// in tracemonkey and various other pdfs with type1 fonts.\nvar HINTING_ENABLED = false;\n\n// Accented charactars are not displayed properly on windows, using this flag\n// to control analysis of seac charstrings.\nvar SEAC_ANALYSIS_ENABLED = false;\n\nvar FontFlags = {\n  FixedPitch: 1,\n  Serif: 2,\n  Symbolic: 4,\n  Script: 8,\n  Nonsymbolic: 32,\n  Italic: 64,\n  AllCap: 65536,\n  SmallCap: 131072,\n  ForceBold: 262144\n};\n\nvar Encodings = {\n  ExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle',\n    'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',\n    'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',\n    'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',\n    'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',\n    'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon',\n    'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior',\n    'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior',\n    'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior',\n    'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior',\n    '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '',\n    'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',\n    'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',\n    'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',\n    'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',\n    'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',\n    'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '',\n    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',\n    '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall',\n    'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '',\n    'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall',\n    'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters',\n    'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',\n    'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior',\n    'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior',\n    'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior',\n    'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior',\n    'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior',\n    'seveninferior', 'eightinferior', 'nineinferior', 'centinferior',\n    'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall',\n    'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall',\n    'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',\n    'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',\n    'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',\n    'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',\n    'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',\n    'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',\n    'Ydieresissmall'],\n  MacExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle',\n    'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall',\n    'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',\n    'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle',\n    'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle',\n    'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle',\n    'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '',\n    'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter',\n    'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',\n    'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff',\n    'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior',\n    'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall',\n    'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',\n    'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',\n    'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',\n    'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',\n    'Tildesmall', '', '', 'asuperior', 'centsuperior', '', '', '', '',\n    'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall',\n    'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall',\n    'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall',\n    'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall',\n    'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall',\n    'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '',\n    'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior',\n    'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior',\n    'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior',\n    'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '',\n    'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior',\n    'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall',\n    'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '',\n    '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '',\n    'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior',\n    'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',\n    'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior',\n    'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior',\n    '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall',\n    'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior',\n    'periodsuperior', 'Dotaccentsmall', 'Ringsmall'],\n  MacRomanEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',\n    'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',\n    'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',\n    'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',\n    'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',\n    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',\n    'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',\n    'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',\n    'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',\n    'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '',\n    'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis',\n    'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde',\n    'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',\n    'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute',\n    'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave',\n    'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling',\n    'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright',\n    'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity',\n    'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff',\n    'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine',\n    'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot',\n    'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft',\n    'guillemotright', 'ellipsis', 'space', 'Agrave', 'Atilde', 'Otilde', 'OE',\n    'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft',\n    'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction',\n    'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl',\n    'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand',\n    'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute',\n    'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple',\n    'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex',\n    'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut',\n    'ogonek', 'caron'],\n  StandardEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',\n    'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',\n    'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',\n    'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',\n    'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',\n    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',\n    'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',\n    'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f',\n    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',\n    'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',\n    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown',\n    'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',\n    'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',\n    'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl',\n    'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase',\n    'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',\n    'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex',\n    'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla',\n    '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '',\n    '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '',\n    '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae',\n    '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls'],\n  WinAnsiEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',\n    'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',\n    'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',\n    'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',\n    'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',\n    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',\n    'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',\n    'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',\n    'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',\n    'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',\n    'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase',\n    'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron',\n    'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft',\n    'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash',\n    'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet',\n    'zcaron', 'Ydieresis', 'space', 'exclamdown', 'cent', 'sterling',\n    'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright',\n    'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered',\n    'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute',\n    'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior',\n    'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters',\n    'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis',\n    'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis',\n    'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve',\n    'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash',\n    'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn',\n    'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis',\n    'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis',\n    'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve',\n    'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash',\n    'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn',\n    'ydieresis'],\n  SymbolSetEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent',\n    'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus',\n    'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',\n    'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',\n    'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi',\n    'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa',\n    'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau',\n    'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft',\n    'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex',\n    'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota',\n    'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho',\n    'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta',\n    'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '',\n    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal',\n    'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade',\n    'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree',\n    'plusminus', 'second', 'greaterequal', 'multiply', 'proportional',\n    'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence',\n    'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn',\n    'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply',\n    'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset',\n    'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element',\n    'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif',\n    'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot',\n    'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup',\n    'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans',\n    'copyrightsans', 'trademarksans', 'summation', 'parenlefttp',\n    'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex',\n    'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex',\n    '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt',\n    'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp',\n    'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid',\n    'bracerightbt'],\n  ZapfDingbatsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n    'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117',\n    'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19',\n    'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7',\n    'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36',\n    'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46',\n    'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56',\n    'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66',\n    'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75',\n    'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97',\n    'a98', 'a99', 'a100', '', 'a89', 'a90', 'a93', 'a94', 'a91', 'a92', 'a205',\n    'a85', 'a206', 'a86', 'a87', 'a88', 'a95', 'a96', '', '', '', '', '', '',\n    '', '', '', '', '', '', '', '', '', '', '', '', '', 'a101', 'a102', 'a103',\n    'a104', 'a106', 'a107', 'a108', 'a112', 'a111', 'a110', 'a109', 'a120',\n    'a121', 'a122', 'a123', 'a124', 'a125', 'a126', 'a127', 'a128', 'a129',\n    'a130', 'a131', 'a132', 'a133', 'a134', 'a135', 'a136', 'a137', 'a138',\n    'a139', 'a140', 'a141', 'a142', 'a143', 'a144', 'a145', 'a146', 'a147',\n    'a148', 'a149', 'a150', 'a151', 'a152', 'a153', 'a154', 'a155', 'a156',\n    'a157', 'a158', 'a159', 'a160', 'a161', 'a163', 'a164', 'a196', 'a165',\n    'a192', 'a166', 'a167', 'a168', 'a169', 'a170', 'a171', 'a172', 'a173',\n    'a162', 'a174', 'a175', 'a176', 'a177', 'a178', 'a179', 'a193', 'a180',\n    'a199', 'a181', 'a200', 'a182', '', 'a201', 'a183', 'a184', 'a197', 'a185',\n    'a194', 'a198', 'a186', 'a195', 'a187', 'a188', 'a189', 'a190', 'a191']\n};\n\n/**\n * Hold a map of decoded fonts and of the standard fourteen Type1\n * fonts and their acronyms.\n */\nvar stdFontMap = {\n  'ArialNarrow': 'Helvetica',\n  'ArialNarrow-Bold': 'Helvetica-Bold',\n  'ArialNarrow-BoldItalic': 'Helvetica-BoldOblique',\n  'ArialNarrow-Italic': 'Helvetica-Oblique',\n  'ArialBlack': 'Helvetica',\n  'ArialBlack-Bold': 'Helvetica-Bold',\n  'ArialBlack-BoldItalic': 'Helvetica-BoldOblique',\n  'ArialBlack-Italic': 'Helvetica-Oblique',\n  'Arial': 'Helvetica',\n  'Arial-Bold': 'Helvetica-Bold',\n  'Arial-BoldItalic': 'Helvetica-BoldOblique',\n  'Arial-Italic': 'Helvetica-Oblique',\n  'Arial-BoldItalicMT': 'Helvetica-BoldOblique',\n  'Arial-BoldMT': 'Helvetica-Bold',\n  'Arial-ItalicMT': 'Helvetica-Oblique',\n  'ArialMT': 'Helvetica',\n  'Courier-Bold': 'Courier-Bold',\n  'Courier-BoldItalic': 'Courier-BoldOblique',\n  'Courier-Italic': 'Courier-Oblique',\n  'CourierNew': 'Courier',\n  'CourierNew-Bold': 'Courier-Bold',\n  'CourierNew-BoldItalic': 'Courier-BoldOblique',\n  'CourierNew-Italic': 'Courier-Oblique',\n  'CourierNewPS-BoldItalicMT': 'Courier-BoldOblique',\n  'CourierNewPS-BoldMT': 'Courier-Bold',\n  'CourierNewPS-ItalicMT': 'Courier-Oblique',\n  'CourierNewPSMT': 'Courier',\n  'Helvetica': 'Helvetica',\n  'Helvetica-Bold': 'Helvetica-Bold',\n  'Helvetica-BoldItalic': 'Helvetica-BoldOblique',\n  'Helvetica-BoldOblique': 'Helvetica-BoldOblique',\n  'Helvetica-Italic': 'Helvetica-Oblique',\n  'Helvetica-Oblique':'Helvetica-Oblique',\n  'Symbol-Bold': 'Symbol',\n  'Symbol-BoldItalic': 'Symbol',\n  'Symbol-Italic': 'Symbol',\n  'TimesNewRoman': 'Times-Roman',\n  'TimesNewRoman-Bold': 'Times-Bold',\n  'TimesNewRoman-BoldItalic': 'Times-BoldItalic',\n  'TimesNewRoman-Italic': 'Times-Italic',\n  'TimesNewRomanPS': 'Times-Roman',\n  'TimesNewRomanPS-Bold': 'Times-Bold',\n  'TimesNewRomanPS-BoldItalic': 'Times-BoldItalic',\n  'TimesNewRomanPS-BoldItalicMT': 'Times-BoldItalic',\n  'TimesNewRomanPS-BoldMT': 'Times-Bold',\n  'TimesNewRomanPS-Italic': 'Times-Italic',\n  'TimesNewRomanPS-ItalicMT': 'Times-Italic',\n  'TimesNewRomanPSMT': 'Times-Roman',\n  'TimesNewRomanPSMT-Bold': 'Times-Bold',\n  'TimesNewRomanPSMT-BoldItalic': 'Times-BoldItalic',\n  'TimesNewRomanPSMT-Italic': 'Times-Italic'\n};\n\n/**\n * Holds the map of the non-standard fonts that might be included as a standard\n * fonts without glyph data.\n */\nvar nonStdFontMap = {\n  'CenturyGothic': 'Helvetica',\n  'CenturyGothic-Bold': 'Helvetica-Bold',\n  'CenturyGothic-BoldItalic': 'Helvetica-BoldOblique',\n  'CenturyGothic-Italic': 'Helvetica-Oblique',\n  'ComicSansMS': 'Comic Sans MS',\n  'ComicSansMS-Bold': 'Comic Sans MS-Bold',\n  'ComicSansMS-BoldItalic': 'Comic Sans MS-BoldItalic',\n  'ComicSansMS-Italic': 'Comic Sans MS-Italic',\n  'LucidaConsole': 'Courier',\n  'LucidaConsole-Bold': 'Courier-Bold',\n  'LucidaConsole-BoldItalic': 'Courier-BoldOblique',\n  'LucidaConsole-Italic': 'Courier-Oblique',\n  'MS-Gothic': 'MS Gothic',\n  'MS-Gothic-Bold': 'MS Gothic-Bold',\n  'MS-Gothic-BoldItalic': 'MS Gothic-BoldItalic',\n  'MS-Gothic-Italic': 'MS Gothic-Italic',\n  'MS-Mincho': 'MS Mincho',\n  'MS-Mincho-Bold': 'MS Mincho-Bold',\n  'MS-Mincho-BoldItalic': 'MS Mincho-BoldItalic',\n  'MS-Mincho-Italic': 'MS Mincho-Italic',\n  'MS-PGothic': 'MS PGothic',\n  'MS-PGothic-Bold': 'MS PGothic-Bold',\n  'MS-PGothic-BoldItalic': 'MS PGothic-BoldItalic',\n  'MS-PGothic-Italic': 'MS PGothic-Italic',\n  'MS-PMincho': 'MS PMincho',\n  'MS-PMincho-Bold': 'MS PMincho-Bold',\n  'MS-PMincho-BoldItalic': 'MS PMincho-BoldItalic',\n  'MS-PMincho-Italic': 'MS PMincho-Italic',\n  'Wingdings': 'ZapfDingbats'\n};\n\nvar serifFonts = {\n  'Adobe Jenson': true, 'Adobe Text': true, 'Albertus': true,\n  'Aldus': true, 'Alexandria': true, 'Algerian': true,\n  'American Typewriter': true, 'Antiqua': true, 'Apex': true,\n  'Arno': true, 'Aster': true, 'Aurora': true,\n  'Baskerville': true, 'Bell': true, 'Bembo': true,\n  'Bembo Schoolbook': true, 'Benguiat': true, 'Berkeley Old Style': true,\n  'Bernhard Modern': true, 'Berthold City': true, 'Bodoni': true,\n  'Bauer Bodoni': true, 'Book Antiqua': true, 'Bookman': true,\n  'Bordeaux Roman': true, 'Californian FB': true, 'Calisto': true,\n  'Calvert': true, 'Capitals': true, 'Cambria': true,\n  'Cartier': true, 'Caslon': true, 'Catull': true,\n  'Centaur': true, 'Century Old Style': true, 'Century Schoolbook': true,\n  'Chaparral': true, 'Charis SIL': true, 'Cheltenham': true,\n  'Cholla Slab': true, 'Clarendon': true, 'Clearface': true,\n  'Cochin': true, 'Colonna': true, 'Computer Modern': true,\n  'Concrete Roman': true, 'Constantia': true, 'Cooper Black': true,\n  'Corona': true, 'Ecotype': true, 'Egyptienne': true,\n  'Elephant': true, 'Excelsior': true, 'Fairfield': true,\n  'FF Scala': true, 'Folkard': true, 'Footlight': true,\n  'FreeSerif': true, 'Friz Quadrata': true, 'Garamond': true,\n  'Gentium': true, 'Georgia': true, 'Gloucester': true,\n  'Goudy Old Style': true, 'Goudy Schoolbook': true, 'Goudy Pro Font': true,\n  'Granjon': true, 'Guardian Egyptian': true, 'Heather': true,\n  'Hercules': true, 'High Tower Text': true, 'Hiroshige': true,\n  'Hoefler Text': true, 'Humana Serif': true, 'Imprint': true,\n  'Ionic No. 5': true, 'Janson': true, 'Joanna': true,\n  'Korinna': true, 'Lexicon': true, 'Liberation Serif': true,\n  'Linux Libertine': true, 'Literaturnaya': true, 'Lucida': true,\n  'Lucida Bright': true, 'Melior': true, 'Memphis': true,\n  'Miller': true, 'Minion': true, 'Modern': true,\n  'Mona Lisa': true, 'Mrs Eaves': true, 'MS Serif': true,\n  'Museo Slab': true, 'New York': true, 'Nimbus Roman': true,\n  'NPS Rawlinson Roadway': true, 'Palatino': true, 'Perpetua': true,\n  'Plantin': true, 'Plantin Schoolbook': true, 'Playbill': true,\n  'Poor Richard': true, 'Rawlinson Roadway': true, 'Renault': true,\n  'Requiem': true, 'Rockwell': true, 'Roman': true,\n  'Rotis Serif': true, 'Sabon': true, 'Scala': true,\n  'Seagull': true, 'Sistina': true, 'Souvenir': true,\n  'STIX': true, 'Stone Informal': true, 'Stone Serif': true,\n  'Sylfaen': true, 'Times': true, 'Trajan': true,\n  'Trinité': true, 'Trump Mediaeval': true, 'Utopia': true,\n  'Vale Type': true, 'Bitstream Vera': true, 'Vera Serif': true,\n  'Versailles': true, 'Wanted': true, 'Weiss': true,\n  'Wide Latin': true, 'Windsor': true, 'XITS': true\n};\n\nvar symbolsFonts = {\n  'Dingbats': true, 'Symbol': true, 'ZapfDingbats': true\n};\n\n// Glyph map for well-known standard fonts. Sometimes Ghostscript uses CID fonts\n// but does not embed the CID to GID mapping. The mapping is incomplete for all\n// glyphs, but common for some set of the standard fonts.\nvar GlyphMapForStandardFonts = {\n  '2': 10, '3': 32, '4': 33, '5': 34, '6': 35, '7': 36, '8': 37, '9': 38,\n  '10': 39, '11': 40, '12': 41, '13': 42, '14': 43, '15': 44, '16': 45,\n  '17': 46, '18': 47, '19': 48, '20': 49, '21': 50, '22': 51, '23': 52,\n  '24': 53, '25': 54, '26': 55, '27': 56, '28': 57, '29': 58, '30': 894,\n  '31': 60, '32': 61, '33': 62, '34': 63, '35': 64, '36': 65, '37': 66,\n  '38': 67, '39': 68, '40': 69, '41': 70, '42': 71, '43': 72, '44': 73,\n  '45': 74, '46': 75, '47': 76, '48': 77, '49': 78, '50': 79, '51': 80,\n  '52': 81, '53': 82, '54': 83, '55': 84, '56': 85, '57': 86, '58': 87,\n  '59': 88, '60': 89, '61': 90, '62': 91, '63': 92, '64': 93, '65': 94,\n  '66': 95, '67': 96, '68': 97, '69': 98, '70': 99, '71': 100, '72': 101,\n  '73': 102, '74': 103, '75': 104, '76': 105, '77': 106, '78': 107, '79': 108,\n  '80': 109, '81': 110, '82': 111, '83': 112, '84': 113, '85': 114, '86': 115,\n  '87': 116, '88': 117, '89': 118, '90': 119, '91': 120, '92': 121, '93': 122,\n  '94': 123, '95': 124, '96': 125, '97': 126, '98': 196, '99': 197, '100': 199,\n  '101': 201, '102': 209, '103': 214, '104': 220, '105': 225, '106': 224,\n  '107': 226, '108': 228, '109': 227, '110': 229, '111': 231, '112': 233,\n  '113': 232, '114': 234, '115': 235, '116': 237, '117': 236, '118': 238,\n  '119': 239, '120': 241, '121': 243, '122': 242, '123': 244, '124': 246,\n  '125': 245, '126': 250, '127': 249, '128': 251, '129': 252, '130': 8224,\n  '131': 176, '132': 162, '133': 163, '134': 167, '135': 8226, '136': 182,\n  '137': 223, '138': 174, '139': 169, '140': 8482, '141': 180, '142': 168,\n  '143': 8800, '144': 198, '145': 216, '146': 8734, '147': 177, '148': 8804,\n  '149': 8805, '150': 165, '151': 181, '152': 8706, '153': 8721, '154': 8719,\n  '156': 8747, '157': 170, '158': 186, '159': 8486, '160': 230, '161': 248,\n  '162': 191, '163': 161, '164': 172, '165': 8730, '166': 402, '167': 8776,\n  '168': 8710, '169': 171, '170': 187, '171': 8230, '210': 218, '223': 711,\n  '224': 321, '225': 322, '227': 353, '229': 382, '234': 253, '252': 263,\n  '253': 268, '254': 269, '258': 258, '260': 260, '261': 261, '265': 280,\n  '266': 281, '268': 283, '269': 313, '275': 323, '276': 324, '278': 328,\n  '284': 345, '285': 346, '286': 347, '292': 367, '295': 377, '296': 378,\n  '298': 380, '305': 963,\n  '306': 964, '307': 966, '308': 8215, '309': 8252, '310': 8319, '311': 8359,\n  '312': 8592, '313': 8593, '337': 9552, '493': 1039, '494': 1040, '705': 1524,\n  '706': 8362, '710': 64288, '711': 64298, '759': 1617, '761': 1776,\n  '763': 1778, '775': 1652, '777': 1764, '778': 1780, '779': 1781, '780': 1782,\n  '782': 771, '783': 64726, '786': 8363, '788': 8532, '790': 768, '791': 769,\n  '792': 768, '795': 803, '797': 64336, '798': 64337, '799': 64342,\n  '800': 64343, '801': 64344, '802': 64345, '803': 64362, '804': 64363,\n  '805': 64364, '2424': 7821, '2425': 7822, '2426': 7823, '2427': 7824,\n  '2428': 7825, '2429': 7826, '2430': 7827, '2433': 7682, '2678': 8045,\n  '2679': 8046, '2830': 1552, '2838': 686, '2840': 751, '2842': 753,\n  '2843': 754, '2844': 755, '2846': 757, '2856': 767, '2857': 848, '2858': 849,\n  '2862': 853, '2863': 854, '2864': 855, '2865': 861, '2866': 862, '2906': 7460,\n  '2908': 7462, '2909': 7463, '2910': 7464, '2912': 7466, '2913': 7467,\n  '2914': 7468, '2916': 7470, '2917': 7471, '2918': 7472, '2920': 7474,\n  '2921': 7475, '2922': 7476, '2924': 7478, '2925': 7479, '2926': 7480,\n  '2928': 7482, '2929': 7483, '2930': 7484, '2932': 7486, '2933': 7487,\n  '2934': 7488, '2936': 7490, '2937': 7491, '2938': 7492, '2940': 7494,\n  '2941': 7495, '2942': 7496, '2944': 7498, '2946': 7500, '2948': 7502,\n  '2950': 7504, '2951': 7505, '2952': 7506, '2954': 7508, '2955': 7509,\n  '2956': 7510, '2958': 7512, '2959': 7513, '2960': 7514, '2962': 7516,\n  '2963': 7517, '2964': 7518, '2966': 7520, '2967': 7521, '2968': 7522,\n  '2970': 7524, '2971': 7525, '2972': 7526, '2974': 7528, '2975': 7529,\n  '2976': 7530, '2978': 1537, '2979': 1538, '2980': 1539, '2982': 1549,\n  '2983': 1551, '2984': 1552, '2986': 1554, '2987': 1555, '2988': 1556,\n  '2990': 1623, '2991': 1624, '2995': 1775, '2999': 1791, '3002': 64290,\n  '3003': 64291, '3004': 64292, '3006': 64294, '3007': 64295, '3008': 64296,\n  '3011': 1900, '3014': 8223, '3015': 8244, '3017': 7532, '3018': 7533,\n  '3019': 7534, '3075': 7590, '3076': 7591, '3079': 7594, '3080': 7595,\n  '3083': 7598, '3084': 7599, '3087': 7602, '3088': 7603, '3091': 7606,\n  '3092': 7607, '3095': 7610, '3096': 7611, '3099': 7614, '3100': 7615,\n  '3103': 7618, '3104': 7619, '3107': 8337, '3108': 8338, '3116': 1884,\n  '3119': 1885, '3120': 1885, '3123': 1886, '3124': 1886, '3127': 1887,\n  '3128': 1887, '3131': 1888, '3132': 1888, '3135': 1889, '3136': 1889,\n  '3139': 1890, '3140': 1890, '3143': 1891, '3144': 1891, '3147': 1892,\n  '3148': 1892, '3153': 580, '3154': 581, '3157': 584, '3158': 585, '3161': 588,\n  '3162': 589, '3165': 891, '3166': 892, '3169': 1274, '3170': 1275,\n  '3173': 1278, '3174': 1279, '3181': 7622, '3182': 7623, '3282': 11799,\n  '3316': 578, '3379': 42785, '3393': 1159, '3416': 8377\n};\n\n// Some characters, e.g. copyrightserif, are mapped to the private use area and\n// might not be displayed using standard fonts. Mapping/hacking well-known chars\n// to the similar equivalents in the normal characters range.\nvar SpecialPUASymbols = {\n  '63721': 0x00A9, // copyrightsans (0xF8E9) => copyright\n  '63193': 0x00A9, // copyrightserif (0xF6D9) => copyright\n  '63720': 0x00AE, // registersans (0xF8E8) => registered\n  '63194': 0x00AE, // registerserif (0xF6DA) => registered\n  '63722': 0x2122, // trademarksans (0xF8EA) => trademark\n  '63195': 0x2122, // trademarkserif (0xF6DB) => trademark\n  '63729': 0x23A7, // bracelefttp (0xF8F1)\n  '63730': 0x23A8, // braceleftmid (0xF8F2)\n  '63731': 0x23A9, // braceleftbt (0xF8F3)\n  '63740': 0x23AB, // bracerighttp (0xF8FC)\n  '63741': 0x23AC, // bracerightmid (0xF8FD)\n  '63742': 0x23AD, // bracerightbt (0xF8FE)\n  '63726': 0x23A1, // bracketlefttp (0xF8EE)\n  '63727': 0x23A2, // bracketleftex (0xF8EF)\n  '63728': 0x23A3, // bracketleftbt (0xF8F0)\n  '63737': 0x23A4, // bracketrighttp (0xF8F9)\n  '63738': 0x23A5, // bracketrightex (0xF8FA)\n  '63739': 0x23A6, // bracketrightbt (0xF8FB)\n  '63723': 0x239B, // parenlefttp (0xF8EB)\n  '63724': 0x239C, // parenleftex (0xF8EC)\n  '63725': 0x239D, // parenleftbt (0xF8ED)\n  '63734': 0x239E, // parenrighttp (0xF8F6)\n  '63735': 0x239F, // parenrightex (0xF8F7)\n  '63736': 0x23A0, // parenrightbt (0xF8F8)\n};\nfunction mapSpecialUnicodeValues(code) {\n  if (code >= 0xFFF0 && code <= 0xFFFF) { // Specials unicode block.\n    return 0;\n  } else if (code >= 0xF600 && code <= 0xF8FF) {\n    return (SpecialPUASymbols[code] || code);\n  }\n  return code;\n}\n\nvar UnicodeRanges = [\n  { 'begin': 0x0000, 'end': 0x007F }, // Basic Latin\n  { 'begin': 0x0080, 'end': 0x00FF }, // Latin-1 Supplement\n  { 'begin': 0x0100, 'end': 0x017F }, // Latin Extended-A\n  { 'begin': 0x0180, 'end': 0x024F }, // Latin Extended-B\n  { 'begin': 0x0250, 'end': 0x02AF }, // IPA Extensions\n  { 'begin': 0x02B0, 'end': 0x02FF }, // Spacing Modifier Letters\n  { 'begin': 0x0300, 'end': 0x036F }, // Combining Diacritical Marks\n  { 'begin': 0x0370, 'end': 0x03FF }, // Greek and Coptic\n  { 'begin': 0x2C80, 'end': 0x2CFF }, // Coptic\n  { 'begin': 0x0400, 'end': 0x04FF }, // Cyrillic\n  { 'begin': 0x0530, 'end': 0x058F }, // Armenian\n  { 'begin': 0x0590, 'end': 0x05FF }, // Hebrew\n  { 'begin': 0xA500, 'end': 0xA63F }, // Vai\n  { 'begin': 0x0600, 'end': 0x06FF }, // Arabic\n  { 'begin': 0x07C0, 'end': 0x07FF }, // NKo\n  { 'begin': 0x0900, 'end': 0x097F }, // Devanagari\n  { 'begin': 0x0980, 'end': 0x09FF }, // Bengali\n  { 'begin': 0x0A00, 'end': 0x0A7F }, // Gurmukhi\n  { 'begin': 0x0A80, 'end': 0x0AFF }, // Gujarati\n  { 'begin': 0x0B00, 'end': 0x0B7F }, // Oriya\n  { 'begin': 0x0B80, 'end': 0x0BFF }, // Tamil\n  { 'begin': 0x0C00, 'end': 0x0C7F }, // Telugu\n  { 'begin': 0x0C80, 'end': 0x0CFF }, // Kannada\n  { 'begin': 0x0D00, 'end': 0x0D7F }, // Malayalam\n  { 'begin': 0x0E00, 'end': 0x0E7F }, // Thai\n  { 'begin': 0x0E80, 'end': 0x0EFF }, // Lao\n  { 'begin': 0x10A0, 'end': 0x10FF }, // Georgian\n  { 'begin': 0x1B00, 'end': 0x1B7F }, // Balinese\n  { 'begin': 0x1100, 'end': 0x11FF }, // Hangul Jamo\n  { 'begin': 0x1E00, 'end': 0x1EFF }, // Latin Extended Additional\n  { 'begin': 0x1F00, 'end': 0x1FFF }, // Greek Extended\n  { 'begin': 0x2000, 'end': 0x206F }, // General Punctuation\n  { 'begin': 0x2070, 'end': 0x209F }, // Superscripts And Subscripts\n  { 'begin': 0x20A0, 'end': 0x20CF }, // Currency Symbol\n  { 'begin': 0x20D0, 'end': 0x20FF }, // Combining Diacritical Marks For Symbols\n  { 'begin': 0x2100, 'end': 0x214F }, // Letterlike Symbols\n  { 'begin': 0x2150, 'end': 0x218F }, // Number Forms\n  { 'begin': 0x2190, 'end': 0x21FF }, // Arrows\n  { 'begin': 0x2200, 'end': 0x22FF }, // Mathematical Operators\n  { 'begin': 0x2300, 'end': 0x23FF }, // Miscellaneous Technical\n  { 'begin': 0x2400, 'end': 0x243F }, // Control Pictures\n  { 'begin': 0x2440, 'end': 0x245F }, // Optical Character Recognition\n  { 'begin': 0x2460, 'end': 0x24FF }, // Enclosed Alphanumerics\n  { 'begin': 0x2500, 'end': 0x257F }, // Box Drawing\n  { 'begin': 0x2580, 'end': 0x259F }, // Block Elements\n  { 'begin': 0x25A0, 'end': 0x25FF }, // Geometric Shapes\n  { 'begin': 0x2600, 'end': 0x26FF }, // Miscellaneous Symbols\n  { 'begin': 0x2700, 'end': 0x27BF }, // Dingbats\n  { 'begin': 0x3000, 'end': 0x303F }, // CJK Symbols And Punctuation\n  { 'begin': 0x3040, 'end': 0x309F }, // Hiragana\n  { 'begin': 0x30A0, 'end': 0x30FF }, // Katakana\n  { 'begin': 0x3100, 'end': 0x312F }, // Bopomofo\n  { 'begin': 0x3130, 'end': 0x318F }, // Hangul Compatibility Jamo\n  { 'begin': 0xA840, 'end': 0xA87F }, // Phags-pa\n  { 'begin': 0x3200, 'end': 0x32FF }, // Enclosed CJK Letters And Months\n  { 'begin': 0x3300, 'end': 0x33FF }, // CJK Compatibility\n  { 'begin': 0xAC00, 'end': 0xD7AF }, // Hangul Syllables\n  { 'begin': 0xD800, 'end': 0xDFFF }, // Non-Plane 0 *\n  { 'begin': 0x10900, 'end': 0x1091F }, // Phoenicia\n  { 'begin': 0x4E00, 'end': 0x9FFF }, // CJK Unified Ideographs\n  { 'begin': 0xE000, 'end': 0xF8FF }, // Private Use Area (plane 0)\n  { 'begin': 0x31C0, 'end': 0x31EF }, // CJK Strokes\n  { 'begin': 0xFB00, 'end': 0xFB4F }, // Alphabetic Presentation Forms\n  { 'begin': 0xFB50, 'end': 0xFDFF }, // Arabic Presentation Forms-A\n  { 'begin': 0xFE20, 'end': 0xFE2F }, // Combining Half Marks\n  { 'begin': 0xFE10, 'end': 0xFE1F }, // Vertical Forms\n  { 'begin': 0xFE50, 'end': 0xFE6F }, // Small Form Variants\n  { 'begin': 0xFE70, 'end': 0xFEFF }, // Arabic Presentation Forms-B\n  { 'begin': 0xFF00, 'end': 0xFFEF }, // Halfwidth And Fullwidth Forms\n  { 'begin': 0xFFF0, 'end': 0xFFFF }, // Specials\n  { 'begin': 0x0F00, 'end': 0x0FFF }, // Tibetan\n  { 'begin': 0x0700, 'end': 0x074F }, // Syriac\n  { 'begin': 0x0780, 'end': 0x07BF }, // Thaana\n  { 'begin': 0x0D80, 'end': 0x0DFF }, // Sinhala\n  { 'begin': 0x1000, 'end': 0x109F }, // Myanmar\n  { 'begin': 0x1200, 'end': 0x137F }, // Ethiopic\n  { 'begin': 0x13A0, 'end': 0x13FF }, // Cherokee\n  { 'begin': 0x1400, 'end': 0x167F }, // Unified Canadian Aboriginal Syllabics\n  { 'begin': 0x1680, 'end': 0x169F }, // Ogham\n  { 'begin': 0x16A0, 'end': 0x16FF }, // Runic\n  { 'begin': 0x1780, 'end': 0x17FF }, // Khmer\n  { 'begin': 0x1800, 'end': 0x18AF }, // Mongolian\n  { 'begin': 0x2800, 'end': 0x28FF }, // Braille Patterns\n  { 'begin': 0xA000, 'end': 0xA48F }, // Yi Syllables\n  { 'begin': 0x1700, 'end': 0x171F }, // Tagalog\n  { 'begin': 0x10300, 'end': 0x1032F }, // Old Italic\n  { 'begin': 0x10330, 'end': 0x1034F }, // Gothic\n  { 'begin': 0x10400, 'end': 0x1044F }, // Deseret\n  { 'begin': 0x1D000, 'end': 0x1D0FF }, // Byzantine Musical Symbols\n  { 'begin': 0x1D400, 'end': 0x1D7FF }, // Mathematical Alphanumeric Symbols\n  { 'begin': 0xFF000, 'end': 0xFFFFD }, // Private Use (plane 15)\n  { 'begin': 0xFE00, 'end': 0xFE0F }, // Variation Selectors\n  { 'begin': 0xE0000, 'end': 0xE007F }, // Tags\n  { 'begin': 0x1900, 'end': 0x194F }, // Limbu\n  { 'begin': 0x1950, 'end': 0x197F }, // Tai Le\n  { 'begin': 0x1980, 'end': 0x19DF }, // New Tai Lue\n  { 'begin': 0x1A00, 'end': 0x1A1F }, // Buginese\n  { 'begin': 0x2C00, 'end': 0x2C5F }, // Glagolitic\n  { 'begin': 0x2D30, 'end': 0x2D7F }, // Tifinagh\n  { 'begin': 0x4DC0, 'end': 0x4DFF }, // Yijing Hexagram Symbols\n  { 'begin': 0xA800, 'end': 0xA82F }, // Syloti Nagri\n  { 'begin': 0x10000, 'end': 0x1007F }, // Linear B Syllabary\n  { 'begin': 0x10140, 'end': 0x1018F }, // Ancient Greek Numbers\n  { 'begin': 0x10380, 'end': 0x1039F }, // Ugaritic\n  { 'begin': 0x103A0, 'end': 0x103DF }, // Old Persian\n  { 'begin': 0x10450, 'end': 0x1047F }, // Shavian\n  { 'begin': 0x10480, 'end': 0x104AF }, // Osmanya\n  { 'begin': 0x10800, 'end': 0x1083F }, // Cypriot Syllabary\n  { 'begin': 0x10A00, 'end': 0x10A5F }, // Kharoshthi\n  { 'begin': 0x1D300, 'end': 0x1D35F }, // Tai Xuan Jing Symbols\n  { 'begin': 0x12000, 'end': 0x123FF }, // Cuneiform\n  { 'begin': 0x1D360, 'end': 0x1D37F }, // Counting Rod Numerals\n  { 'begin': 0x1B80, 'end': 0x1BBF }, // Sundanese\n  { 'begin': 0x1C00, 'end': 0x1C4F }, // Lepcha\n  { 'begin': 0x1C50, 'end': 0x1C7F }, // Ol Chiki\n  { 'begin': 0xA880, 'end': 0xA8DF }, // Saurashtra\n  { 'begin': 0xA900, 'end': 0xA92F }, // Kayah Li\n  { 'begin': 0xA930, 'end': 0xA95F }, // Rejang\n  { 'begin': 0xAA00, 'end': 0xAA5F }, // Cham\n  { 'begin': 0x10190, 'end': 0x101CF }, // Ancient Symbols\n  { 'begin': 0x101D0, 'end': 0x101FF }, // Phaistos Disc\n  { 'begin': 0x102A0, 'end': 0x102DF }, // Carian\n  { 'begin': 0x1F030, 'end': 0x1F09F }  // Domino Tiles\n];\n\nvar MacStandardGlyphOrdering = [\n  '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl',\n  'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft',\n  'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',\n  'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',\n  'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at',\n  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',\n  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft',\n  'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b',\n  'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',\n  'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright',\n  'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde',\n  'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis',\n  'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',\n  'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve',\n  'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex',\n  'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet',\n  'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute',\n  'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal',\n  'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi',\n  'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash',\n  'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin',\n  'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis',\n  'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash',\n  'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright',\n  'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency',\n  'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered',\n  'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex',\n  'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex',\n  'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute',\n  'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron',\n  'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron',\n  'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar',\n  'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply',\n  'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter',\n  'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla',\n  'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];\n\nfunction getUnicodeRangeFor(value) {\n  for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) {\n    var range = UnicodeRanges[i];\n    if (value >= range.begin && value < range.end) {\n      return i;\n    }\n  }\n  return -1;\n}\n\nfunction isRTLRangeFor(value) {\n  var range = UnicodeRanges[13];\n  if (value >= range.begin && value < range.end) {\n    return true;\n  }\n  range = UnicodeRanges[11];\n  if (value >= range.begin && value < range.end) {\n    return true;\n  }\n  return false;\n}\n\n// The normalization table is obtained by filtering the Unicode characters\n// database with <compat> entries.\nvar NormalizedUnicodes = {\n  '\\u00A8': '\\u0020\\u0308',\n  '\\u00AF': '\\u0020\\u0304',\n  '\\u00B4': '\\u0020\\u0301',\n  '\\u00B5': '\\u03BC',\n  '\\u00B8': '\\u0020\\u0327',\n  '\\u0132': '\\u0049\\u004A',\n  '\\u0133': '\\u0069\\u006A',\n  '\\u013F': '\\u004C\\u00B7',\n  '\\u0140': '\\u006C\\u00B7',\n  '\\u0149': '\\u02BC\\u006E',\n  '\\u017F': '\\u0073',\n  '\\u01C4': '\\u0044\\u017D',\n  '\\u01C5': '\\u0044\\u017E',\n  '\\u01C6': '\\u0064\\u017E',\n  '\\u01C7': '\\u004C\\u004A',\n  '\\u01C8': '\\u004C\\u006A',\n  '\\u01C9': '\\u006C\\u006A',\n  '\\u01CA': '\\u004E\\u004A',\n  '\\u01CB': '\\u004E\\u006A',\n  '\\u01CC': '\\u006E\\u006A',\n  '\\u01F1': '\\u0044\\u005A',\n  '\\u01F2': '\\u0044\\u007A',\n  '\\u01F3': '\\u0064\\u007A',\n  '\\u02D8': '\\u0020\\u0306',\n  '\\u02D9': '\\u0020\\u0307',\n  '\\u02DA': '\\u0020\\u030A',\n  '\\u02DB': '\\u0020\\u0328',\n  '\\u02DC': '\\u0020\\u0303',\n  '\\u02DD': '\\u0020\\u030B',\n  '\\u037A': '\\u0020\\u0345',\n  '\\u0384': '\\u0020\\u0301',\n  '\\u03D0': '\\u03B2',\n  '\\u03D1': '\\u03B8',\n  '\\u03D2': '\\u03A5',\n  '\\u03D5': '\\u03C6',\n  '\\u03D6': '\\u03C0',\n  '\\u03F0': '\\u03BA',\n  '\\u03F1': '\\u03C1',\n  '\\u03F2': '\\u03C2',\n  '\\u03F4': '\\u0398',\n  '\\u03F5': '\\u03B5',\n  '\\u03F9': '\\u03A3',\n  '\\u0587': '\\u0565\\u0582',\n  '\\u0675': '\\u0627\\u0674',\n  '\\u0676': '\\u0648\\u0674',\n  '\\u0677': '\\u06C7\\u0674',\n  '\\u0678': '\\u064A\\u0674',\n  '\\u0E33': '\\u0E4D\\u0E32',\n  '\\u0EB3': '\\u0ECD\\u0EB2',\n  '\\u0EDC': '\\u0EAB\\u0E99',\n  '\\u0EDD': '\\u0EAB\\u0EA1',\n  '\\u0F77': '\\u0FB2\\u0F81',\n  '\\u0F79': '\\u0FB3\\u0F81',\n  '\\u1E9A': '\\u0061\\u02BE',\n  '\\u1FBD': '\\u0020\\u0313',\n  '\\u1FBF': '\\u0020\\u0313',\n  '\\u1FC0': '\\u0020\\u0342',\n  '\\u1FFE': '\\u0020\\u0314',\n  '\\u2002': '\\u0020',\n  '\\u2003': '\\u0020',\n  '\\u2004': '\\u0020',\n  '\\u2005': '\\u0020',\n  '\\u2006': '\\u0020',\n  '\\u2008': '\\u0020',\n  '\\u2009': '\\u0020',\n  '\\u200A': '\\u0020',\n  '\\u2017': '\\u0020\\u0333',\n  '\\u2024': '\\u002E',\n  '\\u2025': '\\u002E\\u002E',\n  '\\u2026': '\\u002E\\u002E\\u002E',\n  '\\u2033': '\\u2032\\u2032',\n  '\\u2034': '\\u2032\\u2032\\u2032',\n  '\\u2036': '\\u2035\\u2035',\n  '\\u2037': '\\u2035\\u2035\\u2035',\n  '\\u203C': '\\u0021\\u0021',\n  '\\u203E': '\\u0020\\u0305',\n  '\\u2047': '\\u003F\\u003F',\n  '\\u2048': '\\u003F\\u0021',\n  '\\u2049': '\\u0021\\u003F',\n  '\\u2057': '\\u2032\\u2032\\u2032\\u2032',\n  '\\u205F': '\\u0020',\n  '\\u20A8': '\\u0052\\u0073',\n  '\\u2100': '\\u0061\\u002F\\u0063',\n  '\\u2101': '\\u0061\\u002F\\u0073',\n  '\\u2103': '\\u00B0\\u0043',\n  '\\u2105': '\\u0063\\u002F\\u006F',\n  '\\u2106': '\\u0063\\u002F\\u0075',\n  '\\u2107': '\\u0190',\n  '\\u2109': '\\u00B0\\u0046',\n  '\\u2116': '\\u004E\\u006F',\n  '\\u2121': '\\u0054\\u0045\\u004C',\n  '\\u2135': '\\u05D0',\n  '\\u2136': '\\u05D1',\n  '\\u2137': '\\u05D2',\n  '\\u2138': '\\u05D3',\n  '\\u213B': '\\u0046\\u0041\\u0058',\n  '\\u2160': '\\u0049',\n  '\\u2161': '\\u0049\\u0049',\n  '\\u2162': '\\u0049\\u0049\\u0049',\n  '\\u2163': '\\u0049\\u0056',\n  '\\u2164': '\\u0056',\n  '\\u2165': '\\u0056\\u0049',\n  '\\u2166': '\\u0056\\u0049\\u0049',\n  '\\u2167': '\\u0056\\u0049\\u0049\\u0049',\n  '\\u2168': '\\u0049\\u0058',\n  '\\u2169': '\\u0058',\n  '\\u216A': '\\u0058\\u0049',\n  '\\u216B': '\\u0058\\u0049\\u0049',\n  '\\u216C': '\\u004C',\n  '\\u216D': '\\u0043',\n  '\\u216E': '\\u0044',\n  '\\u216F': '\\u004D',\n  '\\u2170': '\\u0069',\n  '\\u2171': '\\u0069\\u0069',\n  '\\u2172': '\\u0069\\u0069\\u0069',\n  '\\u2173': '\\u0069\\u0076',\n  '\\u2174': '\\u0076',\n  '\\u2175': '\\u0076\\u0069',\n  '\\u2176': '\\u0076\\u0069\\u0069',\n  '\\u2177': '\\u0076\\u0069\\u0069\\u0069',\n  '\\u2178': '\\u0069\\u0078',\n  '\\u2179': '\\u0078',\n  '\\u217A': '\\u0078\\u0069',\n  '\\u217B': '\\u0078\\u0069\\u0069',\n  '\\u217C': '\\u006C',\n  '\\u217D': '\\u0063',\n  '\\u217E': '\\u0064',\n  '\\u217F': '\\u006D',\n  '\\u222C': '\\u222B\\u222B',\n  '\\u222D': '\\u222B\\u222B\\u222B',\n  '\\u222F': '\\u222E\\u222E',\n  '\\u2230': '\\u222E\\u222E\\u222E',\n  '\\u2474': '\\u0028\\u0031\\u0029',\n  '\\u2475': '\\u0028\\u0032\\u0029',\n  '\\u2476': '\\u0028\\u0033\\u0029',\n  '\\u2477': '\\u0028\\u0034\\u0029',\n  '\\u2478': '\\u0028\\u0035\\u0029',\n  '\\u2479': '\\u0028\\u0036\\u0029',\n  '\\u247A': '\\u0028\\u0037\\u0029',\n  '\\u247B': '\\u0028\\u0038\\u0029',\n  '\\u247C': '\\u0028\\u0039\\u0029',\n  '\\u247D': '\\u0028\\u0031\\u0030\\u0029',\n  '\\u247E': '\\u0028\\u0031\\u0031\\u0029',\n  '\\u247F': '\\u0028\\u0031\\u0032\\u0029',\n  '\\u2480': '\\u0028\\u0031\\u0033\\u0029',\n  '\\u2481': '\\u0028\\u0031\\u0034\\u0029',\n  '\\u2482': '\\u0028\\u0031\\u0035\\u0029',\n  '\\u2483': '\\u0028\\u0031\\u0036\\u0029',\n  '\\u2484': '\\u0028\\u0031\\u0037\\u0029',\n  '\\u2485': '\\u0028\\u0031\\u0038\\u0029',\n  '\\u2486': '\\u0028\\u0031\\u0039\\u0029',\n  '\\u2487': '\\u0028\\u0032\\u0030\\u0029',\n  '\\u2488': '\\u0031\\u002E',\n  '\\u2489': '\\u0032\\u002E',\n  '\\u248A': '\\u0033\\u002E',\n  '\\u248B': '\\u0034\\u002E',\n  '\\u248C': '\\u0035\\u002E',\n  '\\u248D': '\\u0036\\u002E',\n  '\\u248E': '\\u0037\\u002E',\n  '\\u248F': '\\u0038\\u002E',\n  '\\u2490': '\\u0039\\u002E',\n  '\\u2491': '\\u0031\\u0030\\u002E',\n  '\\u2492': '\\u0031\\u0031\\u002E',\n  '\\u2493': '\\u0031\\u0032\\u002E',\n  '\\u2494': '\\u0031\\u0033\\u002E',\n  '\\u2495': '\\u0031\\u0034\\u002E',\n  '\\u2496': '\\u0031\\u0035\\u002E',\n  '\\u2497': '\\u0031\\u0036\\u002E',\n  '\\u2498': '\\u0031\\u0037\\u002E',\n  '\\u2499': '\\u0031\\u0038\\u002E',\n  '\\u249A': '\\u0031\\u0039\\u002E',\n  '\\u249B': '\\u0032\\u0030\\u002E',\n  '\\u249C': '\\u0028\\u0061\\u0029',\n  '\\u249D': '\\u0028\\u0062\\u0029',\n  '\\u249E': '\\u0028\\u0063\\u0029',\n  '\\u249F': '\\u0028\\u0064\\u0029',\n  '\\u24A0': '\\u0028\\u0065\\u0029',\n  '\\u24A1': '\\u0028\\u0066\\u0029',\n  '\\u24A2': '\\u0028\\u0067\\u0029',\n  '\\u24A3': '\\u0028\\u0068\\u0029',\n  '\\u24A4': '\\u0028\\u0069\\u0029',\n  '\\u24A5': '\\u0028\\u006A\\u0029',\n  '\\u24A6': '\\u0028\\u006B\\u0029',\n  '\\u24A7': '\\u0028\\u006C\\u0029',\n  '\\u24A8': '\\u0028\\u006D\\u0029',\n  '\\u24A9': '\\u0028\\u006E\\u0029',\n  '\\u24AA': '\\u0028\\u006F\\u0029',\n  '\\u24AB': '\\u0028\\u0070\\u0029',\n  '\\u24AC': '\\u0028\\u0071\\u0029',\n  '\\u24AD': '\\u0028\\u0072\\u0029',\n  '\\u24AE': '\\u0028\\u0073\\u0029',\n  '\\u24AF': '\\u0028\\u0074\\u0029',\n  '\\u24B0': '\\u0028\\u0075\\u0029',\n  '\\u24B1': '\\u0028\\u0076\\u0029',\n  '\\u24B2': '\\u0028\\u0077\\u0029',\n  '\\u24B3': '\\u0028\\u0078\\u0029',\n  '\\u24B4': '\\u0028\\u0079\\u0029',\n  '\\u24B5': '\\u0028\\u007A\\u0029',\n  '\\u2A0C': '\\u222B\\u222B\\u222B\\u222B',\n  '\\u2A74': '\\u003A\\u003A\\u003D',\n  '\\u2A75': '\\u003D\\u003D',\n  '\\u2A76': '\\u003D\\u003D\\u003D',\n  '\\u2E9F': '\\u6BCD',\n  '\\u2EF3': '\\u9F9F',\n  '\\u2F00': '\\u4E00',\n  '\\u2F01': '\\u4E28',\n  '\\u2F02': '\\u4E36',\n  '\\u2F03': '\\u4E3F',\n  '\\u2F04': '\\u4E59',\n  '\\u2F05': '\\u4E85',\n  '\\u2F06': '\\u4E8C',\n  '\\u2F07': '\\u4EA0',\n  '\\u2F08': '\\u4EBA',\n  '\\u2F09': '\\u513F',\n  '\\u2F0A': '\\u5165',\n  '\\u2F0B': '\\u516B',\n  '\\u2F0C': '\\u5182',\n  '\\u2F0D': '\\u5196',\n  '\\u2F0E': '\\u51AB',\n  '\\u2F0F': '\\u51E0',\n  '\\u2F10': '\\u51F5',\n  '\\u2F11': '\\u5200',\n  '\\u2F12': '\\u529B',\n  '\\u2F13': '\\u52F9',\n  '\\u2F14': '\\u5315',\n  '\\u2F15': '\\u531A',\n  '\\u2F16': '\\u5338',\n  '\\u2F17': '\\u5341',\n  '\\u2F18': '\\u535C',\n  '\\u2F19': '\\u5369',\n  '\\u2F1A': '\\u5382',\n  '\\u2F1B': '\\u53B6',\n  '\\u2F1C': '\\u53C8',\n  '\\u2F1D': '\\u53E3',\n  '\\u2F1E': '\\u56D7',\n  '\\u2F1F': '\\u571F',\n  '\\u2F20': '\\u58EB',\n  '\\u2F21': '\\u5902',\n  '\\u2F22': '\\u590A',\n  '\\u2F23': '\\u5915',\n  '\\u2F24': '\\u5927',\n  '\\u2F25': '\\u5973',\n  '\\u2F26': '\\u5B50',\n  '\\u2F27': '\\u5B80',\n  '\\u2F28': '\\u5BF8',\n  '\\u2F29': '\\u5C0F',\n  '\\u2F2A': '\\u5C22',\n  '\\u2F2B': '\\u5C38',\n  '\\u2F2C': '\\u5C6E',\n  '\\u2F2D': '\\u5C71',\n  '\\u2F2E': '\\u5DDB',\n  '\\u2F2F': '\\u5DE5',\n  '\\u2F30': '\\u5DF1',\n  '\\u2F31': '\\u5DFE',\n  '\\u2F32': '\\u5E72',\n  '\\u2F33': '\\u5E7A',\n  '\\u2F34': '\\u5E7F',\n  '\\u2F35': '\\u5EF4',\n  '\\u2F36': '\\u5EFE',\n  '\\u2F37': '\\u5F0B',\n  '\\u2F38': '\\u5F13',\n  '\\u2F39': '\\u5F50',\n  '\\u2F3A': '\\u5F61',\n  '\\u2F3B': '\\u5F73',\n  '\\u2F3C': '\\u5FC3',\n  '\\u2F3D': '\\u6208',\n  '\\u2F3E': '\\u6236',\n  '\\u2F3F': '\\u624B',\n  '\\u2F40': '\\u652F',\n  '\\u2F41': '\\u6534',\n  '\\u2F42': '\\u6587',\n  '\\u2F43': '\\u6597',\n  '\\u2F44': '\\u65A4',\n  '\\u2F45': '\\u65B9',\n  '\\u2F46': '\\u65E0',\n  '\\u2F47': '\\u65E5',\n  '\\u2F48': '\\u66F0',\n  '\\u2F49': '\\u6708',\n  '\\u2F4A': '\\u6728',\n  '\\u2F4B': '\\u6B20',\n  '\\u2F4C': '\\u6B62',\n  '\\u2F4D': '\\u6B79',\n  '\\u2F4E': '\\u6BB3',\n  '\\u2F4F': '\\u6BCB',\n  '\\u2F50': '\\u6BD4',\n  '\\u2F51': '\\u6BDB',\n  '\\u2F52': '\\u6C0F',\n  '\\u2F53': '\\u6C14',\n  '\\u2F54': '\\u6C34',\n  '\\u2F55': '\\u706B',\n  '\\u2F56': '\\u722A',\n  '\\u2F57': '\\u7236',\n  '\\u2F58': '\\u723B',\n  '\\u2F59': '\\u723F',\n  '\\u2F5A': '\\u7247',\n  '\\u2F5B': '\\u7259',\n  '\\u2F5C': '\\u725B',\n  '\\u2F5D': '\\u72AC',\n  '\\u2F5E': '\\u7384',\n  '\\u2F5F': '\\u7389',\n  '\\u2F60': '\\u74DC',\n  '\\u2F61': '\\u74E6',\n  '\\u2F62': '\\u7518',\n  '\\u2F63': '\\u751F',\n  '\\u2F64': '\\u7528',\n  '\\u2F65': '\\u7530',\n  '\\u2F66': '\\u758B',\n  '\\u2F67': '\\u7592',\n  '\\u2F68': '\\u7676',\n  '\\u2F69': '\\u767D',\n  '\\u2F6A': '\\u76AE',\n  '\\u2F6B': '\\u76BF',\n  '\\u2F6C': '\\u76EE',\n  '\\u2F6D': '\\u77DB',\n  '\\u2F6E': '\\u77E2',\n  '\\u2F6F': '\\u77F3',\n  '\\u2F70': '\\u793A',\n  '\\u2F71': '\\u79B8',\n  '\\u2F72': '\\u79BE',\n  '\\u2F73': '\\u7A74',\n  '\\u2F74': '\\u7ACB',\n  '\\u2F75': '\\u7AF9',\n  '\\u2F76': '\\u7C73',\n  '\\u2F77': '\\u7CF8',\n  '\\u2F78': '\\u7F36',\n  '\\u2F79': '\\u7F51',\n  '\\u2F7A': '\\u7F8A',\n  '\\u2F7B': '\\u7FBD',\n  '\\u2F7C': '\\u8001',\n  '\\u2F7D': '\\u800C',\n  '\\u2F7E': '\\u8012',\n  '\\u2F7F': '\\u8033',\n  '\\u2F80': '\\u807F',\n  '\\u2F81': '\\u8089',\n  '\\u2F82': '\\u81E3',\n  '\\u2F83': '\\u81EA',\n  '\\u2F84': '\\u81F3',\n  '\\u2F85': '\\u81FC',\n  '\\u2F86': '\\u820C',\n  '\\u2F87': '\\u821B',\n  '\\u2F88': '\\u821F',\n  '\\u2F89': '\\u826E',\n  '\\u2F8A': '\\u8272',\n  '\\u2F8B': '\\u8278',\n  '\\u2F8C': '\\u864D',\n  '\\u2F8D': '\\u866B',\n  '\\u2F8E': '\\u8840',\n  '\\u2F8F': '\\u884C',\n  '\\u2F90': '\\u8863',\n  '\\u2F91': '\\u897E',\n  '\\u2F92': '\\u898B',\n  '\\u2F93': '\\u89D2',\n  '\\u2F94': '\\u8A00',\n  '\\u2F95': '\\u8C37',\n  '\\u2F96': '\\u8C46',\n  '\\u2F97': '\\u8C55',\n  '\\u2F98': '\\u8C78',\n  '\\u2F99': '\\u8C9D',\n  '\\u2F9A': '\\u8D64',\n  '\\u2F9B': '\\u8D70',\n  '\\u2F9C': '\\u8DB3',\n  '\\u2F9D': '\\u8EAB',\n  '\\u2F9E': '\\u8ECA',\n  '\\u2F9F': '\\u8F9B',\n  '\\u2FA0': '\\u8FB0',\n  '\\u2FA1': '\\u8FB5',\n  '\\u2FA2': '\\u9091',\n  '\\u2FA3': '\\u9149',\n  '\\u2FA4': '\\u91C6',\n  '\\u2FA5': '\\u91CC',\n  '\\u2FA6': '\\u91D1',\n  '\\u2FA7': '\\u9577',\n  '\\u2FA8': '\\u9580',\n  '\\u2FA9': '\\u961C',\n  '\\u2FAA': '\\u96B6',\n  '\\u2FAB': '\\u96B9',\n  '\\u2FAC': '\\u96E8',\n  '\\u2FAD': '\\u9751',\n  '\\u2FAE': '\\u975E',\n  '\\u2FAF': '\\u9762',\n  '\\u2FB0': '\\u9769',\n  '\\u2FB1': '\\u97CB',\n  '\\u2FB2': '\\u97ED',\n  '\\u2FB3': '\\u97F3',\n  '\\u2FB4': '\\u9801',\n  '\\u2FB5': '\\u98A8',\n  '\\u2FB6': '\\u98DB',\n  '\\u2FB7': '\\u98DF',\n  '\\u2FB8': '\\u9996',\n  '\\u2FB9': '\\u9999',\n  '\\u2FBA': '\\u99AC',\n  '\\u2FBB': '\\u9AA8',\n  '\\u2FBC': '\\u9AD8',\n  '\\u2FBD': '\\u9ADF',\n  '\\u2FBE': '\\u9B25',\n  '\\u2FBF': '\\u9B2F',\n  '\\u2FC0': '\\u9B32',\n  '\\u2FC1': '\\u9B3C',\n  '\\u2FC2': '\\u9B5A',\n  '\\u2FC3': '\\u9CE5',\n  '\\u2FC4': '\\u9E75',\n  '\\u2FC5': '\\u9E7F',\n  '\\u2FC6': '\\u9EA5',\n  '\\u2FC7': '\\u9EBB',\n  '\\u2FC8': '\\u9EC3',\n  '\\u2FC9': '\\u9ECD',\n  '\\u2FCA': '\\u9ED1',\n  '\\u2FCB': '\\u9EF9',\n  '\\u2FCC': '\\u9EFD',\n  '\\u2FCD': '\\u9F0E',\n  '\\u2FCE': '\\u9F13',\n  '\\u2FCF': '\\u9F20',\n  '\\u2FD0': '\\u9F3B',\n  '\\u2FD1': '\\u9F4A',\n  '\\u2FD2': '\\u9F52',\n  '\\u2FD3': '\\u9F8D',\n  '\\u2FD4': '\\u9F9C',\n  '\\u2FD5': '\\u9FA0',\n  '\\u3036': '\\u3012',\n  '\\u3038': '\\u5341',\n  '\\u3039': '\\u5344',\n  '\\u303A': '\\u5345',\n  '\\u309B': '\\u0020\\u3099',\n  '\\u309C': '\\u0020\\u309A',\n  '\\u3131': '\\u1100',\n  '\\u3132': '\\u1101',\n  '\\u3133': '\\u11AA',\n  '\\u3134': '\\u1102',\n  '\\u3135': '\\u11AC',\n  '\\u3136': '\\u11AD',\n  '\\u3137': '\\u1103',\n  '\\u3138': '\\u1104',\n  '\\u3139': '\\u1105',\n  '\\u313A': '\\u11B0',\n  '\\u313B': '\\u11B1',\n  '\\u313C': '\\u11B2',\n  '\\u313D': '\\u11B3',\n  '\\u313E': '\\u11B4',\n  '\\u313F': '\\u11B5',\n  '\\u3140': '\\u111A',\n  '\\u3141': '\\u1106',\n  '\\u3142': '\\u1107',\n  '\\u3143': '\\u1108',\n  '\\u3144': '\\u1121',\n  '\\u3145': '\\u1109',\n  '\\u3146': '\\u110A',\n  '\\u3147': '\\u110B',\n  '\\u3148': '\\u110C',\n  '\\u3149': '\\u110D',\n  '\\u314A': '\\u110E',\n  '\\u314B': '\\u110F',\n  '\\u314C': '\\u1110',\n  '\\u314D': '\\u1111',\n  '\\u314E': '\\u1112',\n  '\\u314F': '\\u1161',\n  '\\u3150': '\\u1162',\n  '\\u3151': '\\u1163',\n  '\\u3152': '\\u1164',\n  '\\u3153': '\\u1165',\n  '\\u3154': '\\u1166',\n  '\\u3155': '\\u1167',\n  '\\u3156': '\\u1168',\n  '\\u3157': '\\u1169',\n  '\\u3158': '\\u116A',\n  '\\u3159': '\\u116B',\n  '\\u315A': '\\u116C',\n  '\\u315B': '\\u116D',\n  '\\u315C': '\\u116E',\n  '\\u315D': '\\u116F',\n  '\\u315E': '\\u1170',\n  '\\u315F': '\\u1171',\n  '\\u3160': '\\u1172',\n  '\\u3161': '\\u1173',\n  '\\u3162': '\\u1174',\n  '\\u3163': '\\u1175',\n  '\\u3164': '\\u1160',\n  '\\u3165': '\\u1114',\n  '\\u3166': '\\u1115',\n  '\\u3167': '\\u11C7',\n  '\\u3168': '\\u11C8',\n  '\\u3169': '\\u11CC',\n  '\\u316A': '\\u11CE',\n  '\\u316B': '\\u11D3',\n  '\\u316C': '\\u11D7',\n  '\\u316D': '\\u11D9',\n  '\\u316E': '\\u111C',\n  '\\u316F': '\\u11DD',\n  '\\u3170': '\\u11DF',\n  '\\u3171': '\\u111D',\n  '\\u3172': '\\u111E',\n  '\\u3173': '\\u1120',\n  '\\u3174': '\\u1122',\n  '\\u3175': '\\u1123',\n  '\\u3176': '\\u1127',\n  '\\u3177': '\\u1129',\n  '\\u3178': '\\u112B',\n  '\\u3179': '\\u112C',\n  '\\u317A': '\\u112D',\n  '\\u317B': '\\u112E',\n  '\\u317C': '\\u112F',\n  '\\u317D': '\\u1132',\n  '\\u317E': '\\u1136',\n  '\\u317F': '\\u1140',\n  '\\u3180': '\\u1147',\n  '\\u3181': '\\u114C',\n  '\\u3182': '\\u11F1',\n  '\\u3183': '\\u11F2',\n  '\\u3184': '\\u1157',\n  '\\u3185': '\\u1158',\n  '\\u3186': '\\u1159',\n  '\\u3187': '\\u1184',\n  '\\u3188': '\\u1185',\n  '\\u3189': '\\u1188',\n  '\\u318A': '\\u1191',\n  '\\u318B': '\\u1192',\n  '\\u318C': '\\u1194',\n  '\\u318D': '\\u119E',\n  '\\u318E': '\\u11A1',\n  '\\u3200': '\\u0028\\u1100\\u0029',\n  '\\u3201': '\\u0028\\u1102\\u0029',\n  '\\u3202': '\\u0028\\u1103\\u0029',\n  '\\u3203': '\\u0028\\u1105\\u0029',\n  '\\u3204': '\\u0028\\u1106\\u0029',\n  '\\u3205': '\\u0028\\u1107\\u0029',\n  '\\u3206': '\\u0028\\u1109\\u0029',\n  '\\u3207': '\\u0028\\u110B\\u0029',\n  '\\u3208': '\\u0028\\u110C\\u0029',\n  '\\u3209': '\\u0028\\u110E\\u0029',\n  '\\u320A': '\\u0028\\u110F\\u0029',\n  '\\u320B': '\\u0028\\u1110\\u0029',\n  '\\u320C': '\\u0028\\u1111\\u0029',\n  '\\u320D': '\\u0028\\u1112\\u0029',\n  '\\u320E': '\\u0028\\u1100\\u1161\\u0029',\n  '\\u320F': '\\u0028\\u1102\\u1161\\u0029',\n  '\\u3210': '\\u0028\\u1103\\u1161\\u0029',\n  '\\u3211': '\\u0028\\u1105\\u1161\\u0029',\n  '\\u3212': '\\u0028\\u1106\\u1161\\u0029',\n  '\\u3213': '\\u0028\\u1107\\u1161\\u0029',\n  '\\u3214': '\\u0028\\u1109\\u1161\\u0029',\n  '\\u3215': '\\u0028\\u110B\\u1161\\u0029',\n  '\\u3216': '\\u0028\\u110C\\u1161\\u0029',\n  '\\u3217': '\\u0028\\u110E\\u1161\\u0029',\n  '\\u3218': '\\u0028\\u110F\\u1161\\u0029',\n  '\\u3219': '\\u0028\\u1110\\u1161\\u0029',\n  '\\u321A': '\\u0028\\u1111\\u1161\\u0029',\n  '\\u321B': '\\u0028\\u1112\\u1161\\u0029',\n  '\\u321C': '\\u0028\\u110C\\u116E\\u0029',\n  '\\u321D': '\\u0028\\u110B\\u1169\\u110C\\u1165\\u11AB\\u0029',\n  '\\u321E': '\\u0028\\u110B\\u1169\\u1112\\u116E\\u0029',\n  '\\u3220': '\\u0028\\u4E00\\u0029',\n  '\\u3221': '\\u0028\\u4E8C\\u0029',\n  '\\u3222': '\\u0028\\u4E09\\u0029',\n  '\\u3223': '\\u0028\\u56DB\\u0029',\n  '\\u3224': '\\u0028\\u4E94\\u0029',\n  '\\u3225': '\\u0028\\u516D\\u0029',\n  '\\u3226': '\\u0028\\u4E03\\u0029',\n  '\\u3227': '\\u0028\\u516B\\u0029',\n  '\\u3228': '\\u0028\\u4E5D\\u0029',\n  '\\u3229': '\\u0028\\u5341\\u0029',\n  '\\u322A': '\\u0028\\u6708\\u0029',\n  '\\u322B': '\\u0028\\u706B\\u0029',\n  '\\u322C': '\\u0028\\u6C34\\u0029',\n  '\\u322D': '\\u0028\\u6728\\u0029',\n  '\\u322E': '\\u0028\\u91D1\\u0029',\n  '\\u322F': '\\u0028\\u571F\\u0029',\n  '\\u3230': '\\u0028\\u65E5\\u0029',\n  '\\u3231': '\\u0028\\u682A\\u0029',\n  '\\u3232': '\\u0028\\u6709\\u0029',\n  '\\u3233': '\\u0028\\u793E\\u0029',\n  '\\u3234': '\\u0028\\u540D\\u0029',\n  '\\u3235': '\\u0028\\u7279\\u0029',\n  '\\u3236': '\\u0028\\u8CA1\\u0029',\n  '\\u3237': '\\u0028\\u795D\\u0029',\n  '\\u3238': '\\u0028\\u52B4\\u0029',\n  '\\u3239': '\\u0028\\u4EE3\\u0029',\n  '\\u323A': '\\u0028\\u547C\\u0029',\n  '\\u323B': '\\u0028\\u5B66\\u0029',\n  '\\u323C': '\\u0028\\u76E3\\u0029',\n  '\\u323D': '\\u0028\\u4F01\\u0029',\n  '\\u323E': '\\u0028\\u8CC7\\u0029',\n  '\\u323F': '\\u0028\\u5354\\u0029',\n  '\\u3240': '\\u0028\\u796D\\u0029',\n  '\\u3241': '\\u0028\\u4F11\\u0029',\n  '\\u3242': '\\u0028\\u81EA\\u0029',\n  '\\u3243': '\\u0028\\u81F3\\u0029',\n  '\\u32C0': '\\u0031\\u6708',\n  '\\u32C1': '\\u0032\\u6708',\n  '\\u32C2': '\\u0033\\u6708',\n  '\\u32C3': '\\u0034\\u6708',\n  '\\u32C4': '\\u0035\\u6708',\n  '\\u32C5': '\\u0036\\u6708',\n  '\\u32C6': '\\u0037\\u6708',\n  '\\u32C7': '\\u0038\\u6708',\n  '\\u32C8': '\\u0039\\u6708',\n  '\\u32C9': '\\u0031\\u0030\\u6708',\n  '\\u32CA': '\\u0031\\u0031\\u6708',\n  '\\u32CB': '\\u0031\\u0032\\u6708',\n  '\\u3358': '\\u0030\\u70B9',\n  '\\u3359': '\\u0031\\u70B9',\n  '\\u335A': '\\u0032\\u70B9',\n  '\\u335B': '\\u0033\\u70B9',\n  '\\u335C': '\\u0034\\u70B9',\n  '\\u335D': '\\u0035\\u70B9',\n  '\\u335E': '\\u0036\\u70B9',\n  '\\u335F': '\\u0037\\u70B9',\n  '\\u3360': '\\u0038\\u70B9',\n  '\\u3361': '\\u0039\\u70B9',\n  '\\u3362': '\\u0031\\u0030\\u70B9',\n  '\\u3363': '\\u0031\\u0031\\u70B9',\n  '\\u3364': '\\u0031\\u0032\\u70B9',\n  '\\u3365': '\\u0031\\u0033\\u70B9',\n  '\\u3366': '\\u0031\\u0034\\u70B9',\n  '\\u3367': '\\u0031\\u0035\\u70B9',\n  '\\u3368': '\\u0031\\u0036\\u70B9',\n  '\\u3369': '\\u0031\\u0037\\u70B9',\n  '\\u336A': '\\u0031\\u0038\\u70B9',\n  '\\u336B': '\\u0031\\u0039\\u70B9',\n  '\\u336C': '\\u0032\\u0030\\u70B9',\n  '\\u336D': '\\u0032\\u0031\\u70B9',\n  '\\u336E': '\\u0032\\u0032\\u70B9',\n  '\\u336F': '\\u0032\\u0033\\u70B9',\n  '\\u3370': '\\u0032\\u0034\\u70B9',\n  '\\u33E0': '\\u0031\\u65E5',\n  '\\u33E1': '\\u0032\\u65E5',\n  '\\u33E2': '\\u0033\\u65E5',\n  '\\u33E3': '\\u0034\\u65E5',\n  '\\u33E4': '\\u0035\\u65E5',\n  '\\u33E5': '\\u0036\\u65E5',\n  '\\u33E6': '\\u0037\\u65E5',\n  '\\u33E7': '\\u0038\\u65E5',\n  '\\u33E8': '\\u0039\\u65E5',\n  '\\u33E9': '\\u0031\\u0030\\u65E5',\n  '\\u33EA': '\\u0031\\u0031\\u65E5',\n  '\\u33EB': '\\u0031\\u0032\\u65E5',\n  '\\u33EC': '\\u0031\\u0033\\u65E5',\n  '\\u33ED': '\\u0031\\u0034\\u65E5',\n  '\\u33EE': '\\u0031\\u0035\\u65E5',\n  '\\u33EF': '\\u0031\\u0036\\u65E5',\n  '\\u33F0': '\\u0031\\u0037\\u65E5',\n  '\\u33F1': '\\u0031\\u0038\\u65E5',\n  '\\u33F2': '\\u0031\\u0039\\u65E5',\n  '\\u33F3': '\\u0032\\u0030\\u65E5',\n  '\\u33F4': '\\u0032\\u0031\\u65E5',\n  '\\u33F5': '\\u0032\\u0032\\u65E5',\n  '\\u33F6': '\\u0032\\u0033\\u65E5',\n  '\\u33F7': '\\u0032\\u0034\\u65E5',\n  '\\u33F8': '\\u0032\\u0035\\u65E5',\n  '\\u33F9': '\\u0032\\u0036\\u65E5',\n  '\\u33FA': '\\u0032\\u0037\\u65E5',\n  '\\u33FB': '\\u0032\\u0038\\u65E5',\n  '\\u33FC': '\\u0032\\u0039\\u65E5',\n  '\\u33FD': '\\u0033\\u0030\\u65E5',\n  '\\u33FE': '\\u0033\\u0031\\u65E5',\n  '\\uFB00': '\\u0066\\u0066',\n  '\\uFB01': '\\u0066\\u0069',\n  '\\uFB02': '\\u0066\\u006C',\n  '\\uFB03': '\\u0066\\u0066\\u0069',\n  '\\uFB04': '\\u0066\\u0066\\u006C',\n  '\\uFB05': '\\u017F\\u0074',\n  '\\uFB06': '\\u0073\\u0074',\n  '\\uFB13': '\\u0574\\u0576',\n  '\\uFB14': '\\u0574\\u0565',\n  '\\uFB15': '\\u0574\\u056B',\n  '\\uFB16': '\\u057E\\u0576',\n  '\\uFB17': '\\u0574\\u056D',\n  '\\uFB4F': '\\u05D0\\u05DC',\n  '\\uFB50': '\\u0671',\n  '\\uFB51': '\\u0671',\n  '\\uFB52': '\\u067B',\n  '\\uFB53': '\\u067B',\n  '\\uFB54': '\\u067B',\n  '\\uFB55': '\\u067B',\n  '\\uFB56': '\\u067E',\n  '\\uFB57': '\\u067E',\n  '\\uFB58': '\\u067E',\n  '\\uFB59': '\\u067E',\n  '\\uFB5A': '\\u0680',\n  '\\uFB5B': '\\u0680',\n  '\\uFB5C': '\\u0680',\n  '\\uFB5D': '\\u0680',\n  '\\uFB5E': '\\u067A',\n  '\\uFB5F': '\\u067A',\n  '\\uFB60': '\\u067A',\n  '\\uFB61': '\\u067A',\n  '\\uFB62': '\\u067F',\n  '\\uFB63': '\\u067F',\n  '\\uFB64': '\\u067F',\n  '\\uFB65': '\\u067F',\n  '\\uFB66': '\\u0679',\n  '\\uFB67': '\\u0679',\n  '\\uFB68': '\\u0679',\n  '\\uFB69': '\\u0679',\n  '\\uFB6A': '\\u06A4',\n  '\\uFB6B': '\\u06A4',\n  '\\uFB6C': '\\u06A4',\n  '\\uFB6D': '\\u06A4',\n  '\\uFB6E': '\\u06A6',\n  '\\uFB6F': '\\u06A6',\n  '\\uFB70': '\\u06A6',\n  '\\uFB71': '\\u06A6',\n  '\\uFB72': '\\u0684',\n  '\\uFB73': '\\u0684',\n  '\\uFB74': '\\u0684',\n  '\\uFB75': '\\u0684',\n  '\\uFB76': '\\u0683',\n  '\\uFB77': '\\u0683',\n  '\\uFB78': '\\u0683',\n  '\\uFB79': '\\u0683',\n  '\\uFB7A': '\\u0686',\n  '\\uFB7B': '\\u0686',\n  '\\uFB7C': '\\u0686',\n  '\\uFB7D': '\\u0686',\n  '\\uFB7E': '\\u0687',\n  '\\uFB7F': '\\u0687',\n  '\\uFB80': '\\u0687',\n  '\\uFB81': '\\u0687',\n  '\\uFB82': '\\u068D',\n  '\\uFB83': '\\u068D',\n  '\\uFB84': '\\u068C',\n  '\\uFB85': '\\u068C',\n  '\\uFB86': '\\u068E',\n  '\\uFB87': '\\u068E',\n  '\\uFB88': '\\u0688',\n  '\\uFB89': '\\u0688',\n  '\\uFB8A': '\\u0698',\n  '\\uFB8B': '\\u0698',\n  '\\uFB8C': '\\u0691',\n  '\\uFB8D': '\\u0691',\n  '\\uFB8E': '\\u06A9',\n  '\\uFB8F': '\\u06A9',\n  '\\uFB90': '\\u06A9',\n  '\\uFB91': '\\u06A9',\n  '\\uFB92': '\\u06AF',\n  '\\uFB93': '\\u06AF',\n  '\\uFB94': '\\u06AF',\n  '\\uFB95': '\\u06AF',\n  '\\uFB96': '\\u06B3',\n  '\\uFB97': '\\u06B3',\n  '\\uFB98': '\\u06B3',\n  '\\uFB99': '\\u06B3',\n  '\\uFB9A': '\\u06B1',\n  '\\uFB9B': '\\u06B1',\n  '\\uFB9C': '\\u06B1',\n  '\\uFB9D': '\\u06B1',\n  '\\uFB9E': '\\u06BA',\n  '\\uFB9F': '\\u06BA',\n  '\\uFBA0': '\\u06BB',\n  '\\uFBA1': '\\u06BB',\n  '\\uFBA2': '\\u06BB',\n  '\\uFBA3': '\\u06BB',\n  '\\uFBA4': '\\u06C0',\n  '\\uFBA5': '\\u06C0',\n  '\\uFBA6': '\\u06C1',\n  '\\uFBA7': '\\u06C1',\n  '\\uFBA8': '\\u06C1',\n  '\\uFBA9': '\\u06C1',\n  '\\uFBAA': '\\u06BE',\n  '\\uFBAB': '\\u06BE',\n  '\\uFBAC': '\\u06BE',\n  '\\uFBAD': '\\u06BE',\n  '\\uFBAE': '\\u06D2',\n  '\\uFBAF': '\\u06D2',\n  '\\uFBB0': '\\u06D3',\n  '\\uFBB1': '\\u06D3',\n  '\\uFBD3': '\\u06AD',\n  '\\uFBD4': '\\u06AD',\n  '\\uFBD5': '\\u06AD',\n  '\\uFBD6': '\\u06AD',\n  '\\uFBD7': '\\u06C7',\n  '\\uFBD8': '\\u06C7',\n  '\\uFBD9': '\\u06C6',\n  '\\uFBDA': '\\u06C6',\n  '\\uFBDB': '\\u06C8',\n  '\\uFBDC': '\\u06C8',\n  '\\uFBDD': '\\u0677',\n  '\\uFBDE': '\\u06CB',\n  '\\uFBDF': '\\u06CB',\n  '\\uFBE0': '\\u06C5',\n  '\\uFBE1': '\\u06C5',\n  '\\uFBE2': '\\u06C9',\n  '\\uFBE3': '\\u06C9',\n  '\\uFBE4': '\\u06D0',\n  '\\uFBE5': '\\u06D0',\n  '\\uFBE6': '\\u06D0',\n  '\\uFBE7': '\\u06D0',\n  '\\uFBE8': '\\u0649',\n  '\\uFBE9': '\\u0649',\n  '\\uFBEA': '\\u0626\\u0627',\n  '\\uFBEB': '\\u0626\\u0627',\n  '\\uFBEC': '\\u0626\\u06D5',\n  '\\uFBED': '\\u0626\\u06D5',\n  '\\uFBEE': '\\u0626\\u0648',\n  '\\uFBEF': '\\u0626\\u0648',\n  '\\uFBF0': '\\u0626\\u06C7',\n  '\\uFBF1': '\\u0626\\u06C7',\n  '\\uFBF2': '\\u0626\\u06C6',\n  '\\uFBF3': '\\u0626\\u06C6',\n  '\\uFBF4': '\\u0626\\u06C8',\n  '\\uFBF5': '\\u0626\\u06C8',\n  '\\uFBF6': '\\u0626\\u06D0',\n  '\\uFBF7': '\\u0626\\u06D0',\n  '\\uFBF8': '\\u0626\\u06D0',\n  '\\uFBF9': '\\u0626\\u0649',\n  '\\uFBFA': '\\u0626\\u0649',\n  '\\uFBFB': '\\u0626\\u0649',\n  '\\uFBFC': '\\u06CC',\n  '\\uFBFD': '\\u06CC',\n  '\\uFBFE': '\\u06CC',\n  '\\uFBFF': '\\u06CC',\n  '\\uFC00': '\\u0626\\u062C',\n  '\\uFC01': '\\u0626\\u062D',\n  '\\uFC02': '\\u0626\\u0645',\n  '\\uFC03': '\\u0626\\u0649',\n  '\\uFC04': '\\u0626\\u064A',\n  '\\uFC05': '\\u0628\\u062C',\n  '\\uFC06': '\\u0628\\u062D',\n  '\\uFC07': '\\u0628\\u062E',\n  '\\uFC08': '\\u0628\\u0645',\n  '\\uFC09': '\\u0628\\u0649',\n  '\\uFC0A': '\\u0628\\u064A',\n  '\\uFC0B': '\\u062A\\u062C',\n  '\\uFC0C': '\\u062A\\u062D',\n  '\\uFC0D': '\\u062A\\u062E',\n  '\\uFC0E': '\\u062A\\u0645',\n  '\\uFC0F': '\\u062A\\u0649',\n  '\\uFC10': '\\u062A\\u064A',\n  '\\uFC11': '\\u062B\\u062C',\n  '\\uFC12': '\\u062B\\u0645',\n  '\\uFC13': '\\u062B\\u0649',\n  '\\uFC14': '\\u062B\\u064A',\n  '\\uFC15': '\\u062C\\u062D',\n  '\\uFC16': '\\u062C\\u0645',\n  '\\uFC17': '\\u062D\\u062C',\n  '\\uFC18': '\\u062D\\u0645',\n  '\\uFC19': '\\u062E\\u062C',\n  '\\uFC1A': '\\u062E\\u062D',\n  '\\uFC1B': '\\u062E\\u0645',\n  '\\uFC1C': '\\u0633\\u062C',\n  '\\uFC1D': '\\u0633\\u062D',\n  '\\uFC1E': '\\u0633\\u062E',\n  '\\uFC1F': '\\u0633\\u0645',\n  '\\uFC20': '\\u0635\\u062D',\n  '\\uFC21': '\\u0635\\u0645',\n  '\\uFC22': '\\u0636\\u062C',\n  '\\uFC23': '\\u0636\\u062D',\n  '\\uFC24': '\\u0636\\u062E',\n  '\\uFC25': '\\u0636\\u0645',\n  '\\uFC26': '\\u0637\\u062D',\n  '\\uFC27': '\\u0637\\u0645',\n  '\\uFC28': '\\u0638\\u0645',\n  '\\uFC29': '\\u0639\\u062C',\n  '\\uFC2A': '\\u0639\\u0645',\n  '\\uFC2B': '\\u063A\\u062C',\n  '\\uFC2C': '\\u063A\\u0645',\n  '\\uFC2D': '\\u0641\\u062C',\n  '\\uFC2E': '\\u0641\\u062D',\n  '\\uFC2F': '\\u0641\\u062E',\n  '\\uFC30': '\\u0641\\u0645',\n  '\\uFC31': '\\u0641\\u0649',\n  '\\uFC32': '\\u0641\\u064A',\n  '\\uFC33': '\\u0642\\u062D',\n  '\\uFC34': '\\u0642\\u0645',\n  '\\uFC35': '\\u0642\\u0649',\n  '\\uFC36': '\\u0642\\u064A',\n  '\\uFC37': '\\u0643\\u0627',\n  '\\uFC38': '\\u0643\\u062C',\n  '\\uFC39': '\\u0643\\u062D',\n  '\\uFC3A': '\\u0643\\u062E',\n  '\\uFC3B': '\\u0643\\u0644',\n  '\\uFC3C': '\\u0643\\u0645',\n  '\\uFC3D': '\\u0643\\u0649',\n  '\\uFC3E': '\\u0643\\u064A',\n  '\\uFC3F': '\\u0644\\u062C',\n  '\\uFC40': '\\u0644\\u062D',\n  '\\uFC41': '\\u0644\\u062E',\n  '\\uFC42': '\\u0644\\u0645',\n  '\\uFC43': '\\u0644\\u0649',\n  '\\uFC44': '\\u0644\\u064A',\n  '\\uFC45': '\\u0645\\u062C',\n  '\\uFC46': '\\u0645\\u062D',\n  '\\uFC47': '\\u0645\\u062E',\n  '\\uFC48': '\\u0645\\u0645',\n  '\\uFC49': '\\u0645\\u0649',\n  '\\uFC4A': '\\u0645\\u064A',\n  '\\uFC4B': '\\u0646\\u062C',\n  '\\uFC4C': '\\u0646\\u062D',\n  '\\uFC4D': '\\u0646\\u062E',\n  '\\uFC4E': '\\u0646\\u0645',\n  '\\uFC4F': '\\u0646\\u0649',\n  '\\uFC50': '\\u0646\\u064A',\n  '\\uFC51': '\\u0647\\u062C',\n  '\\uFC52': '\\u0647\\u0645',\n  '\\uFC53': '\\u0647\\u0649',\n  '\\uFC54': '\\u0647\\u064A',\n  '\\uFC55': '\\u064A\\u062C',\n  '\\uFC56': '\\u064A\\u062D',\n  '\\uFC57': '\\u064A\\u062E',\n  '\\uFC58': '\\u064A\\u0645',\n  '\\uFC59': '\\u064A\\u0649',\n  '\\uFC5A': '\\u064A\\u064A',\n  '\\uFC5B': '\\u0630\\u0670',\n  '\\uFC5C': '\\u0631\\u0670',\n  '\\uFC5D': '\\u0649\\u0670',\n  '\\uFC5E': '\\u0020\\u064C\\u0651',\n  '\\uFC5F': '\\u0020\\u064D\\u0651',\n  '\\uFC60': '\\u0020\\u064E\\u0651',\n  '\\uFC61': '\\u0020\\u064F\\u0651',\n  '\\uFC62': '\\u0020\\u0650\\u0651',\n  '\\uFC63': '\\u0020\\u0651\\u0670',\n  '\\uFC64': '\\u0626\\u0631',\n  '\\uFC65': '\\u0626\\u0632',\n  '\\uFC66': '\\u0626\\u0645',\n  '\\uFC67': '\\u0626\\u0646',\n  '\\uFC68': '\\u0626\\u0649',\n  '\\uFC69': '\\u0626\\u064A',\n  '\\uFC6A': '\\u0628\\u0631',\n  '\\uFC6B': '\\u0628\\u0632',\n  '\\uFC6C': '\\u0628\\u0645',\n  '\\uFC6D': '\\u0628\\u0646',\n  '\\uFC6E': '\\u0628\\u0649',\n  '\\uFC6F': '\\u0628\\u064A',\n  '\\uFC70': '\\u062A\\u0631',\n  '\\uFC71': '\\u062A\\u0632',\n  '\\uFC72': '\\u062A\\u0645',\n  '\\uFC73': '\\u062A\\u0646',\n  '\\uFC74': '\\u062A\\u0649',\n  '\\uFC75': '\\u062A\\u064A',\n  '\\uFC76': '\\u062B\\u0631',\n  '\\uFC77': '\\u062B\\u0632',\n  '\\uFC78': '\\u062B\\u0645',\n  '\\uFC79': '\\u062B\\u0646',\n  '\\uFC7A': '\\u062B\\u0649',\n  '\\uFC7B': '\\u062B\\u064A',\n  '\\uFC7C': '\\u0641\\u0649',\n  '\\uFC7D': '\\u0641\\u064A',\n  '\\uFC7E': '\\u0642\\u0649',\n  '\\uFC7F': '\\u0642\\u064A',\n  '\\uFC80': '\\u0643\\u0627',\n  '\\uFC81': '\\u0643\\u0644',\n  '\\uFC82': '\\u0643\\u0645',\n  '\\uFC83': '\\u0643\\u0649',\n  '\\uFC84': '\\u0643\\u064A',\n  '\\uFC85': '\\u0644\\u0645',\n  '\\uFC86': '\\u0644\\u0649',\n  '\\uFC87': '\\u0644\\u064A',\n  '\\uFC88': '\\u0645\\u0627',\n  '\\uFC89': '\\u0645\\u0645',\n  '\\uFC8A': '\\u0646\\u0631',\n  '\\uFC8B': '\\u0646\\u0632',\n  '\\uFC8C': '\\u0646\\u0645',\n  '\\uFC8D': '\\u0646\\u0646',\n  '\\uFC8E': '\\u0646\\u0649',\n  '\\uFC8F': '\\u0646\\u064A',\n  '\\uFC90': '\\u0649\\u0670',\n  '\\uFC91': '\\u064A\\u0631',\n  '\\uFC92': '\\u064A\\u0632',\n  '\\uFC93': '\\u064A\\u0645',\n  '\\uFC94': '\\u064A\\u0646',\n  '\\uFC95': '\\u064A\\u0649',\n  '\\uFC96': '\\u064A\\u064A',\n  '\\uFC97': '\\u0626\\u062C',\n  '\\uFC98': '\\u0626\\u062D',\n  '\\uFC99': '\\u0626\\u062E',\n  '\\uFC9A': '\\u0626\\u0645',\n  '\\uFC9B': '\\u0626\\u0647',\n  '\\uFC9C': '\\u0628\\u062C',\n  '\\uFC9D': '\\u0628\\u062D',\n  '\\uFC9E': '\\u0628\\u062E',\n  '\\uFC9F': '\\u0628\\u0645',\n  '\\uFCA0': '\\u0628\\u0647',\n  '\\uFCA1': '\\u062A\\u062C',\n  '\\uFCA2': '\\u062A\\u062D',\n  '\\uFCA3': '\\u062A\\u062E',\n  '\\uFCA4': '\\u062A\\u0645',\n  '\\uFCA5': '\\u062A\\u0647',\n  '\\uFCA6': '\\u062B\\u0645',\n  '\\uFCA7': '\\u062C\\u062D',\n  '\\uFCA8': '\\u062C\\u0645',\n  '\\uFCA9': '\\u062D\\u062C',\n  '\\uFCAA': '\\u062D\\u0645',\n  '\\uFCAB': '\\u062E\\u062C',\n  '\\uFCAC': '\\u062E\\u0645',\n  '\\uFCAD': '\\u0633\\u062C',\n  '\\uFCAE': '\\u0633\\u062D',\n  '\\uFCAF': '\\u0633\\u062E',\n  '\\uFCB0': '\\u0633\\u0645',\n  '\\uFCB1': '\\u0635\\u062D',\n  '\\uFCB2': '\\u0635\\u062E',\n  '\\uFCB3': '\\u0635\\u0645',\n  '\\uFCB4': '\\u0636\\u062C',\n  '\\uFCB5': '\\u0636\\u062D',\n  '\\uFCB6': '\\u0636\\u062E',\n  '\\uFCB7': '\\u0636\\u0645',\n  '\\uFCB8': '\\u0637\\u062D',\n  '\\uFCB9': '\\u0638\\u0645',\n  '\\uFCBA': '\\u0639\\u062C',\n  '\\uFCBB': '\\u0639\\u0645',\n  '\\uFCBC': '\\u063A\\u062C',\n  '\\uFCBD': '\\u063A\\u0645',\n  '\\uFCBE': '\\u0641\\u062C',\n  '\\uFCBF': '\\u0641\\u062D',\n  '\\uFCC0': '\\u0641\\u062E',\n  '\\uFCC1': '\\u0641\\u0645',\n  '\\uFCC2': '\\u0642\\u062D',\n  '\\uFCC3': '\\u0642\\u0645',\n  '\\uFCC4': '\\u0643\\u062C',\n  '\\uFCC5': '\\u0643\\u062D',\n  '\\uFCC6': '\\u0643\\u062E',\n  '\\uFCC7': '\\u0643\\u0644',\n  '\\uFCC8': '\\u0643\\u0645',\n  '\\uFCC9': '\\u0644\\u062C',\n  '\\uFCCA': '\\u0644\\u062D',\n  '\\uFCCB': '\\u0644\\u062E',\n  '\\uFCCC': '\\u0644\\u0645',\n  '\\uFCCD': '\\u0644\\u0647',\n  '\\uFCCE': '\\u0645\\u062C',\n  '\\uFCCF': '\\u0645\\u062D',\n  '\\uFCD0': '\\u0645\\u062E',\n  '\\uFCD1': '\\u0645\\u0645',\n  '\\uFCD2': '\\u0646\\u062C',\n  '\\uFCD3': '\\u0646\\u062D',\n  '\\uFCD4': '\\u0646\\u062E',\n  '\\uFCD5': '\\u0646\\u0645',\n  '\\uFCD6': '\\u0646\\u0647',\n  '\\uFCD7': '\\u0647\\u062C',\n  '\\uFCD8': '\\u0647\\u0645',\n  '\\uFCD9': '\\u0647\\u0670',\n  '\\uFCDA': '\\u064A\\u062C',\n  '\\uFCDB': '\\u064A\\u062D',\n  '\\uFCDC': '\\u064A\\u062E',\n  '\\uFCDD': '\\u064A\\u0645',\n  '\\uFCDE': '\\u064A\\u0647',\n  '\\uFCDF': '\\u0626\\u0645',\n  '\\uFCE0': '\\u0626\\u0647',\n  '\\uFCE1': '\\u0628\\u0645',\n  '\\uFCE2': '\\u0628\\u0647',\n  '\\uFCE3': '\\u062A\\u0645',\n  '\\uFCE4': '\\u062A\\u0647',\n  '\\uFCE5': '\\u062B\\u0645',\n  '\\uFCE6': '\\u062B\\u0647',\n  '\\uFCE7': '\\u0633\\u0645',\n  '\\uFCE8': '\\u0633\\u0647',\n  '\\uFCE9': '\\u0634\\u0645',\n  '\\uFCEA': '\\u0634\\u0647',\n  '\\uFCEB': '\\u0643\\u0644',\n  '\\uFCEC': '\\u0643\\u0645',\n  '\\uFCED': '\\u0644\\u0645',\n  '\\uFCEE': '\\u0646\\u0645',\n  '\\uFCEF': '\\u0646\\u0647',\n  '\\uFCF0': '\\u064A\\u0645',\n  '\\uFCF1': '\\u064A\\u0647',\n  '\\uFCF2': '\\u0640\\u064E\\u0651',\n  '\\uFCF3': '\\u0640\\u064F\\u0651',\n  '\\uFCF4': '\\u0640\\u0650\\u0651',\n  '\\uFCF5': '\\u0637\\u0649',\n  '\\uFCF6': '\\u0637\\u064A',\n  '\\uFCF7': '\\u0639\\u0649',\n  '\\uFCF8': '\\u0639\\u064A',\n  '\\uFCF9': '\\u063A\\u0649',\n  '\\uFCFA': '\\u063A\\u064A',\n  '\\uFCFB': '\\u0633\\u0649',\n  '\\uFCFC': '\\u0633\\u064A',\n  '\\uFCFD': '\\u0634\\u0649',\n  '\\uFCFE': '\\u0634\\u064A',\n  '\\uFCFF': '\\u062D\\u0649',\n  '\\uFD00': '\\u062D\\u064A',\n  '\\uFD01': '\\u062C\\u0649',\n  '\\uFD02': '\\u062C\\u064A',\n  '\\uFD03': '\\u062E\\u0649',\n  '\\uFD04': '\\u062E\\u064A',\n  '\\uFD05': '\\u0635\\u0649',\n  '\\uFD06': '\\u0635\\u064A',\n  '\\uFD07': '\\u0636\\u0649',\n  '\\uFD08': '\\u0636\\u064A',\n  '\\uFD09': '\\u0634\\u062C',\n  '\\uFD0A': '\\u0634\\u062D',\n  '\\uFD0B': '\\u0634\\u062E',\n  '\\uFD0C': '\\u0634\\u0645',\n  '\\uFD0D': '\\u0634\\u0631',\n  '\\uFD0E': '\\u0633\\u0631',\n  '\\uFD0F': '\\u0635\\u0631',\n  '\\uFD10': '\\u0636\\u0631',\n  '\\uFD11': '\\u0637\\u0649',\n  '\\uFD12': '\\u0637\\u064A',\n  '\\uFD13': '\\u0639\\u0649',\n  '\\uFD14': '\\u0639\\u064A',\n  '\\uFD15': '\\u063A\\u0649',\n  '\\uFD16': '\\u063A\\u064A',\n  '\\uFD17': '\\u0633\\u0649',\n  '\\uFD18': '\\u0633\\u064A',\n  '\\uFD19': '\\u0634\\u0649',\n  '\\uFD1A': '\\u0634\\u064A',\n  '\\uFD1B': '\\u062D\\u0649',\n  '\\uFD1C': '\\u062D\\u064A',\n  '\\uFD1D': '\\u062C\\u0649',\n  '\\uFD1E': '\\u062C\\u064A',\n  '\\uFD1F': '\\u062E\\u0649',\n  '\\uFD20': '\\u062E\\u064A',\n  '\\uFD21': '\\u0635\\u0649',\n  '\\uFD22': '\\u0635\\u064A',\n  '\\uFD23': '\\u0636\\u0649',\n  '\\uFD24': '\\u0636\\u064A',\n  '\\uFD25': '\\u0634\\u062C',\n  '\\uFD26': '\\u0634\\u062D',\n  '\\uFD27': '\\u0634\\u062E',\n  '\\uFD28': '\\u0634\\u0645',\n  '\\uFD29': '\\u0634\\u0631',\n  '\\uFD2A': '\\u0633\\u0631',\n  '\\uFD2B': '\\u0635\\u0631',\n  '\\uFD2C': '\\u0636\\u0631',\n  '\\uFD2D': '\\u0634\\u062C',\n  '\\uFD2E': '\\u0634\\u062D',\n  '\\uFD2F': '\\u0634\\u062E',\n  '\\uFD30': '\\u0634\\u0645',\n  '\\uFD31': '\\u0633\\u0647',\n  '\\uFD32': '\\u0634\\u0647',\n  '\\uFD33': '\\u0637\\u0645',\n  '\\uFD34': '\\u0633\\u062C',\n  '\\uFD35': '\\u0633\\u062D',\n  '\\uFD36': '\\u0633\\u062E',\n  '\\uFD37': '\\u0634\\u062C',\n  '\\uFD38': '\\u0634\\u062D',\n  '\\uFD39': '\\u0634\\u062E',\n  '\\uFD3A': '\\u0637\\u0645',\n  '\\uFD3B': '\\u0638\\u0645',\n  '\\uFD3C': '\\u0627\\u064B',\n  '\\uFD3D': '\\u0627\\u064B',\n  '\\uFD50': '\\u062A\\u062C\\u0645',\n  '\\uFD51': '\\u062A\\u062D\\u062C',\n  '\\uFD52': '\\u062A\\u062D\\u062C',\n  '\\uFD53': '\\u062A\\u062D\\u0645',\n  '\\uFD54': '\\u062A\\u062E\\u0645',\n  '\\uFD55': '\\u062A\\u0645\\u062C',\n  '\\uFD56': '\\u062A\\u0645\\u062D',\n  '\\uFD57': '\\u062A\\u0645\\u062E',\n  '\\uFD58': '\\u062C\\u0645\\u062D',\n  '\\uFD59': '\\u062C\\u0645\\u062D',\n  '\\uFD5A': '\\u062D\\u0645\\u064A',\n  '\\uFD5B': '\\u062D\\u0645\\u0649',\n  '\\uFD5C': '\\u0633\\u062D\\u062C',\n  '\\uFD5D': '\\u0633\\u062C\\u062D',\n  '\\uFD5E': '\\u0633\\u062C\\u0649',\n  '\\uFD5F': '\\u0633\\u0645\\u062D',\n  '\\uFD60': '\\u0633\\u0645\\u062D',\n  '\\uFD61': '\\u0633\\u0645\\u062C',\n  '\\uFD62': '\\u0633\\u0645\\u0645',\n  '\\uFD63': '\\u0633\\u0645\\u0645',\n  '\\uFD64': '\\u0635\\u062D\\u062D',\n  '\\uFD65': '\\u0635\\u062D\\u062D',\n  '\\uFD66': '\\u0635\\u0645\\u0645',\n  '\\uFD67': '\\u0634\\u062D\\u0645',\n  '\\uFD68': '\\u0634\\u062D\\u0645',\n  '\\uFD69': '\\u0634\\u062C\\u064A',\n  '\\uFD6A': '\\u0634\\u0645\\u062E',\n  '\\uFD6B': '\\u0634\\u0645\\u062E',\n  '\\uFD6C': '\\u0634\\u0645\\u0645',\n  '\\uFD6D': '\\u0634\\u0645\\u0645',\n  '\\uFD6E': '\\u0636\\u062D\\u0649',\n  '\\uFD6F': '\\u0636\\u062E\\u0645',\n  '\\uFD70': '\\u0636\\u062E\\u0645',\n  '\\uFD71': '\\u0637\\u0645\\u062D',\n  '\\uFD72': '\\u0637\\u0645\\u062D',\n  '\\uFD73': '\\u0637\\u0645\\u0645',\n  '\\uFD74': '\\u0637\\u0645\\u064A',\n  '\\uFD75': '\\u0639\\u062C\\u0645',\n  '\\uFD76': '\\u0639\\u0645\\u0645',\n  '\\uFD77': '\\u0639\\u0645\\u0645',\n  '\\uFD78': '\\u0639\\u0645\\u0649',\n  '\\uFD79': '\\u063A\\u0645\\u0645',\n  '\\uFD7A': '\\u063A\\u0645\\u064A',\n  '\\uFD7B': '\\u063A\\u0645\\u0649',\n  '\\uFD7C': '\\u0641\\u062E\\u0645',\n  '\\uFD7D': '\\u0641\\u062E\\u0645',\n  '\\uFD7E': '\\u0642\\u0645\\u062D',\n  '\\uFD7F': '\\u0642\\u0645\\u0645',\n  '\\uFD80': '\\u0644\\u062D\\u0645',\n  '\\uFD81': '\\u0644\\u062D\\u064A',\n  '\\uFD82': '\\u0644\\u062D\\u0649',\n  '\\uFD83': '\\u0644\\u062C\\u062C',\n  '\\uFD84': '\\u0644\\u062C\\u062C',\n  '\\uFD85': '\\u0644\\u062E\\u0645',\n  '\\uFD86': '\\u0644\\u062E\\u0645',\n  '\\uFD87': '\\u0644\\u0645\\u062D',\n  '\\uFD88': '\\u0644\\u0645\\u062D',\n  '\\uFD89': '\\u0645\\u062D\\u062C',\n  '\\uFD8A': '\\u0645\\u062D\\u0645',\n  '\\uFD8B': '\\u0645\\u062D\\u064A',\n  '\\uFD8C': '\\u0645\\u062C\\u062D',\n  '\\uFD8D': '\\u0645\\u062C\\u0645',\n  '\\uFD8E': '\\u0645\\u062E\\u062C',\n  '\\uFD8F': '\\u0645\\u062E\\u0645',\n  '\\uFD92': '\\u0645\\u062C\\u062E',\n  '\\uFD93': '\\u0647\\u0645\\u062C',\n  '\\uFD94': '\\u0647\\u0645\\u0645',\n  '\\uFD95': '\\u0646\\u062D\\u0645',\n  '\\uFD96': '\\u0646\\u062D\\u0649',\n  '\\uFD97': '\\u0646\\u062C\\u0645',\n  '\\uFD98': '\\u0646\\u062C\\u0645',\n  '\\uFD99': '\\u0646\\u062C\\u0649',\n  '\\uFD9A': '\\u0646\\u0645\\u064A',\n  '\\uFD9B': '\\u0646\\u0645\\u0649',\n  '\\uFD9C': '\\u064A\\u0645\\u0645',\n  '\\uFD9D': '\\u064A\\u0645\\u0645',\n  '\\uFD9E': '\\u0628\\u062E\\u064A',\n  '\\uFD9F': '\\u062A\\u062C\\u064A',\n  '\\uFDA0': '\\u062A\\u062C\\u0649',\n  '\\uFDA1': '\\u062A\\u062E\\u064A',\n  '\\uFDA2': '\\u062A\\u062E\\u0649',\n  '\\uFDA3': '\\u062A\\u0645\\u064A',\n  '\\uFDA4': '\\u062A\\u0645\\u0649',\n  '\\uFDA5': '\\u062C\\u0645\\u064A',\n  '\\uFDA6': '\\u062C\\u062D\\u0649',\n  '\\uFDA7': '\\u062C\\u0645\\u0649',\n  '\\uFDA8': '\\u0633\\u062E\\u0649',\n  '\\uFDA9': '\\u0635\\u062D\\u064A',\n  '\\uFDAA': '\\u0634\\u062D\\u064A',\n  '\\uFDAB': '\\u0636\\u062D\\u064A',\n  '\\uFDAC': '\\u0644\\u062C\\u064A',\n  '\\uFDAD': '\\u0644\\u0645\\u064A',\n  '\\uFDAE': '\\u064A\\u062D\\u064A',\n  '\\uFDAF': '\\u064A\\u062C\\u064A',\n  '\\uFDB0': '\\u064A\\u0645\\u064A',\n  '\\uFDB1': '\\u0645\\u0645\\u064A',\n  '\\uFDB2': '\\u0642\\u0645\\u064A',\n  '\\uFDB3': '\\u0646\\u062D\\u064A',\n  '\\uFDB4': '\\u0642\\u0645\\u062D',\n  '\\uFDB5': '\\u0644\\u062D\\u0645',\n  '\\uFDB6': '\\u0639\\u0645\\u064A',\n  '\\uFDB7': '\\u0643\\u0645\\u064A',\n  '\\uFDB8': '\\u0646\\u062C\\u062D',\n  '\\uFDB9': '\\u0645\\u062E\\u064A',\n  '\\uFDBA': '\\u0644\\u062C\\u0645',\n  '\\uFDBB': '\\u0643\\u0645\\u0645',\n  '\\uFDBC': '\\u0644\\u062C\\u0645',\n  '\\uFDBD': '\\u0646\\u062C\\u062D',\n  '\\uFDBE': '\\u062C\\u062D\\u064A',\n  '\\uFDBF': '\\u062D\\u062C\\u064A',\n  '\\uFDC0': '\\u0645\\u062C\\u064A',\n  '\\uFDC1': '\\u0641\\u0645\\u064A',\n  '\\uFDC2': '\\u0628\\u062D\\u064A',\n  '\\uFDC3': '\\u0643\\u0645\\u0645',\n  '\\uFDC4': '\\u0639\\u062C\\u0645',\n  '\\uFDC5': '\\u0635\\u0645\\u0645',\n  '\\uFDC6': '\\u0633\\u062E\\u064A',\n  '\\uFDC7': '\\u0646\\u062C\\u064A',\n  '\\uFE49': '\\u203E',\n  '\\uFE4A': '\\u203E',\n  '\\uFE4B': '\\u203E',\n  '\\uFE4C': '\\u203E',\n  '\\uFE4D': '\\u005F',\n  '\\uFE4E': '\\u005F',\n  '\\uFE4F': '\\u005F',\n  '\\uFE80': '\\u0621',\n  '\\uFE81': '\\u0622',\n  '\\uFE82': '\\u0622',\n  '\\uFE83': '\\u0623',\n  '\\uFE84': '\\u0623',\n  '\\uFE85': '\\u0624',\n  '\\uFE86': '\\u0624',\n  '\\uFE87': '\\u0625',\n  '\\uFE88': '\\u0625',\n  '\\uFE89': '\\u0626',\n  '\\uFE8A': '\\u0626',\n  '\\uFE8B': '\\u0626',\n  '\\uFE8C': '\\u0626',\n  '\\uFE8D': '\\u0627',\n  '\\uFE8E': '\\u0627',\n  '\\uFE8F': '\\u0628',\n  '\\uFE90': '\\u0628',\n  '\\uFE91': '\\u0628',\n  '\\uFE92': '\\u0628',\n  '\\uFE93': '\\u0629',\n  '\\uFE94': '\\u0629',\n  '\\uFE95': '\\u062A',\n  '\\uFE96': '\\u062A',\n  '\\uFE97': '\\u062A',\n  '\\uFE98': '\\u062A',\n  '\\uFE99': '\\u062B',\n  '\\uFE9A': '\\u062B',\n  '\\uFE9B': '\\u062B',\n  '\\uFE9C': '\\u062B',\n  '\\uFE9D': '\\u062C',\n  '\\uFE9E': '\\u062C',\n  '\\uFE9F': '\\u062C',\n  '\\uFEA0': '\\u062C',\n  '\\uFEA1': '\\u062D',\n  '\\uFEA2': '\\u062D',\n  '\\uFEA3': '\\u062D',\n  '\\uFEA4': '\\u062D',\n  '\\uFEA5': '\\u062E',\n  '\\uFEA6': '\\u062E',\n  '\\uFEA7': '\\u062E',\n  '\\uFEA8': '\\u062E',\n  '\\uFEA9': '\\u062F',\n  '\\uFEAA': '\\u062F',\n  '\\uFEAB': '\\u0630',\n  '\\uFEAC': '\\u0630',\n  '\\uFEAD': '\\u0631',\n  '\\uFEAE': '\\u0631',\n  '\\uFEAF': '\\u0632',\n  '\\uFEB0': '\\u0632',\n  '\\uFEB1': '\\u0633',\n  '\\uFEB2': '\\u0633',\n  '\\uFEB3': '\\u0633',\n  '\\uFEB4': '\\u0633',\n  '\\uFEB5': '\\u0634',\n  '\\uFEB6': '\\u0634',\n  '\\uFEB7': '\\u0634',\n  '\\uFEB8': '\\u0634',\n  '\\uFEB9': '\\u0635',\n  '\\uFEBA': '\\u0635',\n  '\\uFEBB': '\\u0635',\n  '\\uFEBC': '\\u0635',\n  '\\uFEBD': '\\u0636',\n  '\\uFEBE': '\\u0636',\n  '\\uFEBF': '\\u0636',\n  '\\uFEC0': '\\u0636',\n  '\\uFEC1': '\\u0637',\n  '\\uFEC2': '\\u0637',\n  '\\uFEC3': '\\u0637',\n  '\\uFEC4': '\\u0637',\n  '\\uFEC5': '\\u0638',\n  '\\uFEC6': '\\u0638',\n  '\\uFEC7': '\\u0638',\n  '\\uFEC8': '\\u0638',\n  '\\uFEC9': '\\u0639',\n  '\\uFECA': '\\u0639',\n  '\\uFECB': '\\u0639',\n  '\\uFECC': '\\u0639',\n  '\\uFECD': '\\u063A',\n  '\\uFECE': '\\u063A',\n  '\\uFECF': '\\u063A',\n  '\\uFED0': '\\u063A',\n  '\\uFED1': '\\u0641',\n  '\\uFED2': '\\u0641',\n  '\\uFED3': '\\u0641',\n  '\\uFED4': '\\u0641',\n  '\\uFED5': '\\u0642',\n  '\\uFED6': '\\u0642',\n  '\\uFED7': '\\u0642',\n  '\\uFED8': '\\u0642',\n  '\\uFED9': '\\u0643',\n  '\\uFEDA': '\\u0643',\n  '\\uFEDB': '\\u0643',\n  '\\uFEDC': '\\u0643',\n  '\\uFEDD': '\\u0644',\n  '\\uFEDE': '\\u0644',\n  '\\uFEDF': '\\u0644',\n  '\\uFEE0': '\\u0644',\n  '\\uFEE1': '\\u0645',\n  '\\uFEE2': '\\u0645',\n  '\\uFEE3': '\\u0645',\n  '\\uFEE4': '\\u0645',\n  '\\uFEE5': '\\u0646',\n  '\\uFEE6': '\\u0646',\n  '\\uFEE7': '\\u0646',\n  '\\uFEE8': '\\u0646',\n  '\\uFEE9': '\\u0647',\n  '\\uFEEA': '\\u0647',\n  '\\uFEEB': '\\u0647',\n  '\\uFEEC': '\\u0647',\n  '\\uFEED': '\\u0648',\n  '\\uFEEE': '\\u0648',\n  '\\uFEEF': '\\u0649',\n  '\\uFEF0': '\\u0649',\n  '\\uFEF1': '\\u064A',\n  '\\uFEF2': '\\u064A',\n  '\\uFEF3': '\\u064A',\n  '\\uFEF4': '\\u064A',\n  '\\uFEF5': '\\u0644\\u0622',\n  '\\uFEF6': '\\u0644\\u0622',\n  '\\uFEF7': '\\u0644\\u0623',\n  '\\uFEF8': '\\u0644\\u0623',\n  '\\uFEF9': '\\u0644\\u0625',\n  '\\uFEFA': '\\u0644\\u0625',\n  '\\uFEFB': '\\u0644\\u0627',\n  '\\uFEFC': '\\u0644\\u0627'\n};\n\nfunction reverseIfRtl(chars) {\n  var charsLength = chars.length;\n  //reverse an arabic ligature\n  if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0))) {\n    return chars;\n  }\n  var s = '';\n  for (var ii = charsLength - 1; ii >= 0; ii--) {\n    s += chars[ii];\n  }\n  return s;\n}\n\nfunction adjustWidths(properties) {\n  if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) {\n    return;\n  }\n  // adjusting width to fontMatrix scale\n  var scale = 0.001 / properties.fontMatrix[0];\n  var glyphsWidths = properties.widths;\n  for (var glyph in glyphsWidths) {\n    glyphsWidths[glyph] *= scale;\n  }\n  properties.defaultWidth *= scale;\n}\n\nfunction getFontType(type, subtype) {\n  switch (type) {\n    case 'Type1':\n      return subtype === 'Type1C' ? FontType.TYPE1C : FontType.TYPE1;\n    case 'CIDFontType0':\n      return subtype === 'CIDFontType0C' ? FontType.CIDFONTTYPE0C :\n        FontType.CIDFONTTYPE0;\n    case 'OpenType':\n      return FontType.OPENTYPE;\n    case 'TrueType':\n      return FontType.TRUETYPE;\n    case 'CIDFontType2':\n      return FontType.CIDFONTTYPE2;\n    case 'MMType1':\n      return FontType.MMTYPE1;\n    case 'Type0':\n      return FontType.TYPE0;\n    default:\n      return FontType.UNKNOWN;\n  }\n}\n\nvar Glyph = (function GlyphClosure() {\n  function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId) {\n    this.fontChar = fontChar;\n    this.unicode = unicode;\n    this.accent = accent;\n    this.width = width;\n    this.vmetric = vmetric;\n    this.operatorListId = operatorListId;\n  }\n\n  Glyph.prototype.matchesForCache =\n      function(fontChar, unicode, accent, width, vmetric, operatorListId) {\n    return this.fontChar === fontChar &&\n           this.unicode === unicode &&\n           this.accent === accent &&\n           this.width === width &&\n           this.vmetric === vmetric &&\n           this.operatorListId === operatorListId;\n  };\n\n  return Glyph;\n})();\n\nvar ToUnicodeMap = (function ToUnicodeMapClosure() {\n  function ToUnicodeMap(cmap) {\n    // The elements of this._map can be integers or strings, depending on how\n    // |cmap| was created.\n    this._map = cmap;\n  }\n\n  ToUnicodeMap.prototype = {\n    get length() {\n      return this._map.length;\n    },\n\n    forEach: function(callback) {\n      for (var charCode in this._map) {\n        callback(charCode, this._map[charCode].charCodeAt(0));\n      }\n    },\n\n    has: function(i) {\n      return this._map[i] !== undefined;\n    },\n\n    get: function(i) {\n      return this._map[i];\n    },\n\n    charCodeOf: function(v) {\n      return this._map.indexOf(v);\n    }\n  };\n\n  return ToUnicodeMap;\n})();\n\nvar IdentityToUnicodeMap = (function IdentityToUnicodeMapClosure() {\n  function IdentityToUnicodeMap(firstChar, lastChar) {\n    this.firstChar = firstChar;\n    this.lastChar = lastChar;\n  }\n\n  IdentityToUnicodeMap.prototype = {\n    get length() {\n      return (this.lastChar + 1) - this.firstChar;\n    },\n\n    forEach: function (callback) {\n      for (var i = this.firstChar, ii = this.lastChar; i <= ii; i++) {\n        callback(i, i);\n      }\n    },\n\n    has: function (i) {\n      return this.firstChar <= i && i <= this.lastChar;\n    },\n\n    get: function (i) {\n      if (this.firstChar <= i && i <= this.lastChar) {\n        return String.fromCharCode(i);\n      }\n      return undefined;\n    },\n\n    charCodeOf: function (v) {\n      error('should not call .charCodeOf');\n    }\n  };\n\n  return IdentityToUnicodeMap;\n})();\n\nvar OpenTypeFileBuilder = (function OpenTypeFileBuilderClosure() {\n  function writeInt16(dest, offset, num) {\n    dest[offset] = (num >> 8) & 0xFF;\n    dest[offset + 1] = num & 0xFF;\n  }\n\n  function writeInt32(dest, offset, num) {\n    dest[offset] = (num >> 24) & 0xFF;\n    dest[offset + 1] = (num >> 16) & 0xFF;\n    dest[offset + 2] = (num >> 8) & 0xFF;\n    dest[offset + 3] = num & 0xFF;\n  }\n\n  function writeData(dest, offset, data) {\n    var i, ii;\n    if (data instanceof Uint8Array) {\n      dest.set(data, offset);\n    } else if (typeof data === 'string') {\n      for (i = 0, ii = data.length; i < ii; i++) {\n        dest[offset++] = data.charCodeAt(i) & 0xFF;\n      }\n    } else {\n      // treating everything else as array\n      for (i = 0, ii = data.length; i < ii; i++) {\n        dest[offset++] = data[i] & 0xFF;\n      }\n    }\n  }\n\n  function OpenTypeFileBuilder(sfnt) {\n    this.sfnt = sfnt;\n    this.tables = Object.create(null);\n  }\n\n  OpenTypeFileBuilder.getSearchParams =\n      function OpenTypeFileBuilder_getSearchParams(entriesCount, entrySize) {\n    var maxPower2 = 1, log2 = 0;\n    while ((maxPower2 ^ entriesCount) > maxPower2) {\n      maxPower2 <<= 1;\n      log2++;\n    }\n    var searchRange = maxPower2 * entrySize;\n    return {\n      range: searchRange,\n      entry: log2,\n      rangeShift: entrySize * entriesCount - searchRange\n    };\n  };\n\n  var OTF_HEADER_SIZE = 12;\n  var OTF_TABLE_ENTRY_SIZE = 16;\n\n  OpenTypeFileBuilder.prototype = {\n    toArray: function OpenTypeFileBuilder_toArray() {\n      var sfnt = this.sfnt;\n\n      // Tables needs to be written by ascendant alphabetic order\n      var tables = this.tables;\n      var tablesNames = Object.keys(tables);\n      tablesNames.sort();\n      var numTables = tablesNames.length;\n\n      var i, j, jj, table, tableName;\n      // layout the tables data\n      var offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE;\n      var tableOffsets = [offset];\n      for (i = 0; i < numTables; i++) {\n        table = tables[tablesNames[i]];\n        var paddedLength = ((table.length + 3) & ~3) >>> 0;\n        offset += paddedLength;\n        tableOffsets.push(offset);\n      }\n\n      var file = new Uint8Array(offset);\n      // write the table data first (mostly for checksum)\n      for (i = 0; i < numTables; i++) {\n        table = tables[tablesNames[i]];\n        writeData(file, tableOffsets[i], table);\n      }\n\n      // sfnt version (4 bytes)\n      if (sfnt === 'true') {\n        // Windows hates the Mac TrueType sfnt version number\n        sfnt = string32(0x00010000);\n      }\n      file[0] = sfnt.charCodeAt(0) & 0xFF;\n      file[1] = sfnt.charCodeAt(1) & 0xFF;\n      file[2] = sfnt.charCodeAt(2) & 0xFF;\n      file[3] = sfnt.charCodeAt(3) & 0xFF;\n\n      // numTables (2 bytes)\n      writeInt16(file, 4, numTables);\n\n      var searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16);\n\n      // searchRange (2 bytes)\n      writeInt16(file, 6, searchParams.range);\n      // entrySelector (2 bytes)\n      writeInt16(file, 8, searchParams.entry);\n      // rangeShift (2 bytes)\n      writeInt16(file, 10, searchParams.rangeShift);\n\n      offset = OTF_HEADER_SIZE;\n      // writing table entries\n      for (i = 0; i < numTables; i++) {\n        tableName = tablesNames[i];\n        file[offset] = tableName.charCodeAt(0) & 0xFF;\n        file[offset + 1] = tableName.charCodeAt(1) & 0xFF;\n        file[offset + 2] = tableName.charCodeAt(2) & 0xFF;\n        file[offset + 3] = tableName.charCodeAt(3) & 0xFF;\n\n        // checksum\n        var checksum = 0;\n        for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) {\n          var quad = (file[j] << 24) + (file[j + 1] << 16) +\n                     (file[j + 2] << 8) + file[j + 3];\n          checksum = (checksum + quad) | 0;\n        }\n        writeInt32(file, offset + 4, checksum);\n\n        // offset\n        writeInt32(file, offset + 8, tableOffsets[i]);\n        // length\n        writeInt32(file, offset + 12, tables[tableName].length);\n\n        offset += OTF_TABLE_ENTRY_SIZE;\n      }\n      return file;\n    },\n\n    addTable: function OpenTypeFileBuilder_addTable(tag, data) {\n      if (tag in this.tables) {\n        throw new Error('Table ' + tag + ' already exists');\n      }\n      this.tables[tag] = data;\n    }\n  };\n\n  return OpenTypeFileBuilder;\n})();\n\n/**\n * 'Font' is the class the outside world should use, it encapsulate all the font\n * decoding logics whatever type it is (assuming the font type is supported).\n *\n * For example to read a Type1 font and to attach it to the document:\n *   var type1Font = new Font(\"MyFontName\", binaryFile, propertiesObject);\n *   type1Font.bind();\n */\nvar Font = (function FontClosure() {\n  function Font(name, file, properties) {\n    var charCode, glyphName, fontChar;\n\n    this.name = name;\n    this.loadedName = properties.loadedName;\n    this.isType3Font = properties.isType3Font;\n    this.sizes = [];\n\n    this.glyphCache = {};\n\n    var names = name.split('+');\n    names = names.length > 1 ? names[1] : names[0];\n    names = names.split(/[-,_]/g)[0];\n    this.isSerifFont = !!(properties.flags & FontFlags.Serif);\n    this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);\n    this.isMonospace = !!(properties.flags & FontFlags.FixedPitch);\n\n    var type = properties.type;\n    var subtype = properties.subtype;\n    this.type = type;\n\n    this.fallbackName = (this.isMonospace ? 'monospace' :\n                         (this.isSerifFont ? 'serif' : 'sans-serif'));\n\n    this.differences = properties.differences;\n    this.widths = properties.widths;\n    this.defaultWidth = properties.defaultWidth;\n    this.composite = properties.composite;\n    this.wideChars = properties.wideChars;\n    this.cMap = properties.cMap;\n    this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS;\n    this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS;\n    this.fontMatrix = properties.fontMatrix;\n    this.bbox = properties.bbox;\n\n    this.toUnicode = properties.toUnicode = this.buildToUnicode(properties);\n\n    this.toFontChar = [];\n\n    if (properties.type === 'Type3') {\n      for (charCode = 0; charCode < 256; charCode++) {\n        this.toFontChar[charCode] = (this.differences[charCode] ||\n                                     properties.defaultEncoding[charCode]);\n      }\n      this.fontType = FontType.TYPE3;\n      return;\n    }\n\n    this.cidEncoding = properties.cidEncoding;\n    this.vertical = properties.vertical;\n    if (this.vertical) {\n      this.vmetrics = properties.vmetrics;\n      this.defaultVMetrics = properties.defaultVMetrics;\n    }\n\n    if (!file || file.isEmpty) {\n      if (file) {\n        // Some bad PDF generators will include empty font files,\n        // attempting to recover by assuming that no file exists.\n        warn('Font file is empty in \"' + name + '\" (' + this.loadedName + ')');\n      }\n\n      this.missingFile = true;\n      // The file data is not specified. Trying to fix the font name\n      // to be used with the canvas.font.\n      var fontName = name.replace(/[,_]/g, '-');\n      var isStandardFont = !!stdFontMap[fontName] ||\n        !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]);\n      fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;\n\n      this.bold = (fontName.search(/bold/gi) !== -1);\n      this.italic = ((fontName.search(/oblique/gi) !== -1) ||\n                     (fontName.search(/italic/gi) !== -1));\n\n      // Use 'name' instead of 'fontName' here because the original\n      // name ArialBlack for example will be replaced by Helvetica.\n      this.black = (name.search(/Black/g) !== -1);\n\n      // if at least one width is present, remeasure all chars when exists\n      this.remeasure = Object.keys(this.widths).length > 0;\n      if (isStandardFont && type === 'CIDFontType2' &&\n          properties.cidEncoding.indexOf('Identity-') === 0) {\n        // Standard fonts might be embedded as CID font without glyph mapping.\n        // Building one based on GlyphMapForStandardFonts.\n        var map = [];\n        for (var code in GlyphMapForStandardFonts) {\n          map[+code] = GlyphMapForStandardFonts[code];\n        }\n        var isIdentityUnicode = this.toUnicode instanceof IdentityToUnicodeMap;\n        if (!isIdentityUnicode) {\n          this.toUnicode.forEach(function(charCode, unicodeCharCode) {\n            map[+charCode] = unicodeCharCode;\n          });\n        }\n        this.toFontChar = map;\n        this.toUnicode = new ToUnicodeMap(map);\n      } else if (/Symbol/i.test(fontName)) {\n        var symbols = Encodings.SymbolSetEncoding;\n        for (charCode in symbols) {\n          fontChar = GlyphsUnicode[symbols[charCode]];\n          if (!fontChar) {\n            continue;\n          }\n          this.toFontChar[charCode] = fontChar;\n        }\n        for (charCode in properties.differences) {\n          fontChar = GlyphsUnicode[properties.differences[charCode]];\n          if (!fontChar) {\n            continue;\n          }\n          this.toFontChar[charCode] = fontChar;\n        }\n      } else if (/Dingbats/i.test(fontName)) {\n        if (/Wingdings/i.test(name)) {\n          warn('Wingdings font without embedded font file, ' +\n               'falling back to the ZapfDingbats encoding.');\n        }\n        var dingbats = Encodings.ZapfDingbatsEncoding;\n        for (charCode in dingbats) {\n          fontChar = DingbatsGlyphsUnicode[dingbats[charCode]];\n          if (!fontChar) {\n            continue;\n          }\n          this.toFontChar[charCode] = fontChar;\n        }\n        for (charCode in properties.differences) {\n          fontChar = DingbatsGlyphsUnicode[properties.differences[charCode]];\n          if (!fontChar) {\n            continue;\n          }\n          this.toFontChar[charCode] = fontChar;\n        }\n      } else if (isStandardFont) {\n        this.toFontChar = [];\n        for (charCode in properties.defaultEncoding) {\n          glyphName = (properties.differences[charCode] ||\n                       properties.defaultEncoding[charCode]);\n          this.toFontChar[charCode] = GlyphsUnicode[glyphName];\n        }\n      } else {\n        var unicodeCharCode, notCidFont = (type.indexOf('CIDFontType') === -1);\n        this.toUnicode.forEach(function(charCode, unicodeCharCode) {\n          if (notCidFont) {\n            glyphName = (properties.differences[charCode] ||\n                         properties.defaultEncoding[charCode]);\n            unicodeCharCode = (GlyphsUnicode[glyphName] || unicodeCharCode);\n          }\n          this.toFontChar[charCode] = unicodeCharCode;\n        }.bind(this));\n      }\n      this.loadedName = fontName.split('-')[0];\n      this.loading = false;\n      this.fontType = getFontType(type, subtype);\n      return;\n    }\n\n    // Some fonts might use wrong font types for Type1C or CIDFontType0C\n    if (subtype === 'Type1C' && (type !== 'Type1' && type !== 'MMType1')) {\n      // Some TrueType fonts by mistake claim Type1C\n      if (isTrueTypeFile(file)) {\n        subtype = 'TrueType';\n      } else {\n        type = 'Type1';\n      }\n    }\n    if (subtype === 'CIDFontType0C' && type !== 'CIDFontType0') {\n      type = 'CIDFontType0';\n    }\n    if (subtype === 'OpenType') {\n      type = 'OpenType';\n    }\n    // Some CIDFontType0C fonts by mistake claim CIDFontType0.\n    if (type === 'CIDFontType0') {\n      subtype = isType1File(file) ? 'CIDFontType0' : 'CIDFontType0C';\n    }\n\n    var data;\n    switch (type) {\n      case 'MMType1':\n        info('MMType1 font (' + name + '), falling back to Type1.');\n        /* falls through */\n      case 'Type1':\n      case 'CIDFontType0':\n        this.mimetype = 'font/opentype';\n\n        var cff = (subtype === 'Type1C' || subtype === 'CIDFontType0C') ?\n          new CFFFont(file, properties) : new Type1Font(name, file, properties);\n\n        adjustWidths(properties);\n\n        // Wrap the CFF data inside an OTF font file\n        data = this.convert(name, cff, properties);\n        break;\n\n      case 'OpenType':\n      case 'TrueType':\n      case 'CIDFontType2':\n        this.mimetype = 'font/opentype';\n\n        // Repair the TrueType file. It is can be damaged in the point of\n        // view of the sanitizer\n        data = this.checkAndRepair(name, file, properties);\n        if (this.isOpenType) {\n          type = 'OpenType';\n        }\n        break;\n\n      default:\n        error('Font ' + type + ' is not supported');\n        break;\n    }\n\n    this.data = data;\n    this.fontType = getFontType(type, subtype);\n\n    // Transfer some properties again that could change during font conversion\n    this.fontMatrix = properties.fontMatrix;\n    this.widths = properties.widths;\n    this.defaultWidth = properties.defaultWidth;\n    this.encoding = properties.baseEncoding;\n    this.seacMap = properties.seacMap;\n\n    this.loading = true;\n  }\n\n  Font.getFontID = (function () {\n    var ID = 1;\n    return function Font_getFontID() {\n      return String(ID++);\n    };\n  })();\n\n  function int16(b0, b1) {\n    return (b0 << 8) + b1;\n  }\n\n  function int32(b0, b1, b2, b3) {\n    return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n  }\n\n  function string16(value) {\n    return String.fromCharCode((value >> 8) & 0xff, value & 0xff);\n  }\n\n  function safeString16(value) {\n    // clamp value to the 16-bit int range\n    value = (value > 0x7FFF ? 0x7FFF : (value < -0x8000 ? -0x8000 : value));\n    return String.fromCharCode((value >> 8) & 0xff, value & 0xff);\n  }\n\n  function isTrueTypeFile(file) {\n    var header = file.peekBytes(4);\n    return readUint32(header, 0) === 0x00010000;\n  }\n\n  function isType1File(file) {\n    var header = file.peekBytes(2);\n    // All Type1 font programs must begin with the comment '%!' (0x25 + 0x21).\n    if (header[0] === 0x25 && header[1] === 0x21) {\n      return true;\n    }\n    // ... obviously some fonts violate that part of the specification,\n    // please refer to the comment in |Type1Font| below.\n    if (header[0] === 0x80 && header[1] === 0x01) { // pfb file header.\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Helper function for |adjustMapping|.\n   * @return {boolean}\n   */\n  function isProblematicUnicodeLocation(code) {\n    if (code <= 0x1F) { // Control chars\n      return true;\n    }\n    if (code >= 0x80 && code <= 0x9F) { // Control chars\n      return true;\n    }\n    if ((code >= 0x2000 && code <= 0x200F) || // General punctuation chars\n        (code >= 0x2028 && code <= 0x202F) ||\n        (code >= 0x2060 && code <= 0x206F)) {\n      return true;\n    }\n    if (code >= 0xFFF0 && code <= 0xFFFF) { // Specials Unicode block\n      return true;\n    }\n    switch (code) {\n      case 0x7F: // Control char\n      case 0xA0: // Non breaking space\n      case 0xAD: // Soft hyphen\n      case 0x0E33: // Thai character SARA AM\n      case 0x2011: // Non breaking hyphen\n      case 0x205F: // Medium mathematical space\n      case 0x25CC: // Dotted circle (combining mark)\n        return true;\n    }\n    return false;\n  }\n\n  /**\n   * Rebuilds the char code to glyph ID map by trying to replace the char codes\n   * with their unicode value. It also moves char codes that are in known\n   * problematic locations.\n   * @return {Object} Two properties:\n   * 'toFontChar' - maps original char codes(the value that will be read\n   * from commands such as show text) to the char codes that will be used in the\n   * font that we build\n   * 'charCodeToGlyphId' - maps the new font char codes to glyph ids\n   */\n  function adjustMapping(charCodeToGlyphId, properties) {\n    var toUnicode = properties.toUnicode;\n    var isSymbolic = !!(properties.flags & FontFlags.Symbolic);\n    var isIdentityUnicode =\n      properties.toUnicode instanceof IdentityToUnicodeMap;\n    var newMap = Object.create(null);\n    var toFontChar = [];\n    var usedFontCharCodes = [];\n    var nextAvailableFontCharCode = PRIVATE_USE_OFFSET_START;\n    for (var originalCharCode in charCodeToGlyphId) {\n      originalCharCode |= 0;\n      var glyphId = charCodeToGlyphId[originalCharCode];\n      var fontCharCode = originalCharCode;\n      // First try to map the value to a unicode position if a non identity map\n      // was created.\n      if (!isIdentityUnicode && toUnicode.has(originalCharCode)) {\n        var unicode = toUnicode.get(fontCharCode);\n        // TODO: Try to map ligatures to the correct spot.\n        if (unicode.length === 1) {\n          fontCharCode = unicode.charCodeAt(0);\n        }\n      }\n      // Try to move control characters, special characters and already mapped\n      // characters to the private use area since they will not be drawn by\n      // canvas if left in their current position. Also, move characters if the\n      // font was symbolic and there is only an identity unicode map since the\n      // characters probably aren't in the correct position (fixes an issue\n      // with firefox and thuluthfont).\n      if ((usedFontCharCodes[fontCharCode] !== undefined ||\n           isProblematicUnicodeLocation(fontCharCode) ||\n           (isSymbolic && isIdentityUnicode)) &&\n          nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END) { // Room left.\n        // Loop to try and find a free spot in the private use area.\n        do {\n          fontCharCode = nextAvailableFontCharCode++;\n\n          if (SKIP_PRIVATE_USE_RANGE_F000_TO_F01F && fontCharCode === 0xF000) {\n            fontCharCode = 0xF020;\n            nextAvailableFontCharCode = fontCharCode + 1;\n          }\n\n        } while (usedFontCharCodes[fontCharCode] !== undefined &&\n                 nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END);\n      }\n\n      newMap[fontCharCode] = glyphId;\n      toFontChar[originalCharCode] = fontCharCode;\n      usedFontCharCodes[fontCharCode] = true;\n    }\n    return {\n      toFontChar: toFontChar,\n      charCodeToGlyphId: newMap,\n      nextAvailableFontCharCode: nextAvailableFontCharCode\n    };\n  }\n\n  function getRanges(glyphs) {\n    // Array.sort() sorts by characters, not numerically, so convert to an\n    // array of characters.\n    var codes = [];\n    for (var charCode in glyphs) {\n      codes.push({ fontCharCode: charCode | 0, glyphId: glyphs[charCode] });\n    }\n    codes.sort(function fontGetRangesSort(a, b) {\n      return a.fontCharCode - b.fontCharCode;\n    });\n\n    // Split the sorted codes into ranges.\n    var ranges = [];\n    var length = codes.length;\n    for (var n = 0; n < length; ) {\n      var start = codes[n].fontCharCode;\n      var codeIndices = [codes[n].glyphId];\n      ++n;\n      var end = start;\n      while (n < length && end + 1 === codes[n].fontCharCode) {\n        codeIndices.push(codes[n].glyphId);\n        ++end;\n        ++n;\n        if (end === 0xFFFF) {\n          break;\n        }\n      }\n      ranges.push([start, end, codeIndices]);\n    }\n\n    return ranges;\n  }\n\n  function createCmapTable(glyphs) {\n    var ranges = getRanges(glyphs);\n    var numTables = ranges[ranges.length - 1][1] > 0xFFFF ? 2 : 1;\n    var cmap = '\\x00\\x00' + // version\n               string16(numTables) +  // numTables\n               '\\x00\\x03' + // platformID\n               '\\x00\\x01' + // encodingID\n               string32(4 + numTables * 8); // start of the table record\n\n    var i, ii, j, jj;\n    for (i = ranges.length - 1; i >= 0; --i) {\n      if (ranges[i][0] <= 0xFFFF) { break; }\n    }\n    var bmpLength = i + 1;\n\n    if (ranges[i][0] < 0xFFFF && ranges[i][1] === 0xFFFF) {\n      ranges[i][1] = 0xFFFE;\n    }\n    var trailingRangesCount = ranges[i][1] < 0xFFFF ? 1 : 0;\n    var segCount = bmpLength + trailingRangesCount;\n    var searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2);\n\n    // Fill up the 4 parallel arrays describing the segments.\n    var startCount = '';\n    var endCount = '';\n    var idDeltas = '';\n    var idRangeOffsets = '';\n    var glyphsIds = '';\n    var bias = 0;\n\n    var range, start, end, codes;\n    for (i = 0, ii = bmpLength; i < ii; i++) {\n      range = ranges[i];\n      start = range[0];\n      end = range[1];\n      startCount += string16(start);\n      endCount += string16(end);\n      codes = range[2];\n      var contiguous = true;\n      for (j = 1, jj = codes.length; j < jj; ++j) {\n        if (codes[j] !== codes[j - 1] + 1) {\n          contiguous = false;\n          break;\n        }\n      }\n      if (!contiguous) {\n        var offset = (segCount - i) * 2 + bias * 2;\n        bias += (end - start + 1);\n\n        idDeltas += string16(0);\n        idRangeOffsets += string16(offset);\n\n        for (j = 0, jj = codes.length; j < jj; ++j) {\n          glyphsIds += string16(codes[j]);\n        }\n      } else {\n        var startCode = codes[0];\n\n        idDeltas += string16((startCode - start) & 0xFFFF);\n        idRangeOffsets += string16(0);\n      }\n    }\n\n    if (trailingRangesCount > 0) {\n      endCount += '\\xFF\\xFF';\n      startCount += '\\xFF\\xFF';\n      idDeltas += '\\x00\\x01';\n      idRangeOffsets += '\\x00\\x00';\n    }\n\n    var format314 = '\\x00\\x00' + // language\n                    string16(2 * segCount) +\n                    string16(searchParams.range) +\n                    string16(searchParams.entry) +\n                    string16(searchParams.rangeShift) +\n                    endCount + '\\x00\\x00' + startCount +\n                    idDeltas + idRangeOffsets + glyphsIds;\n\n    var format31012 = '';\n    var header31012 = '';\n    if (numTables > 1) {\n      cmap += '\\x00\\x03' + // platformID\n              '\\x00\\x0A' + // encodingID\n              string32(4 + numTables * 8 +\n                       4 + format314.length); // start of the table record\n      format31012 = '';\n      for (i = 0, ii = ranges.length; i < ii; i++) {\n        range = ranges[i];\n        start = range[0];\n        codes = range[2];\n        var code = codes[0];\n        for (j = 1, jj = codes.length; j < jj; ++j) {\n          if (codes[j] !== codes[j - 1] + 1) {\n            end = range[0] + j - 1;\n            format31012 += string32(start) + // startCharCode\n                           string32(end) + // endCharCode\n                           string32(code); // startGlyphID\n            start = end + 1;\n            code = codes[j];\n          }\n        }\n        format31012 += string32(start) + // startCharCode\n                       string32(range[1]) + // endCharCode\n                       string32(code); // startGlyphID\n      }\n      header31012 = '\\x00\\x0C' + // format\n                    '\\x00\\x00' + // reserved\n                    string32(format31012.length + 16) + // length\n                    '\\x00\\x00\\x00\\x00' + // language\n                    string32(format31012.length / 12); // nGroups\n    }\n\n    return cmap + '\\x00\\x04' + // format\n                  string16(format314.length + 4) + // length\n                  format314 + header31012 + format31012;\n  }\n\n  function validateOS2Table(os2) {\n    var stream = new Stream(os2.data);\n    var version = stream.getUint16();\n    // TODO verify all OS/2 tables fields, but currently we validate only those\n    // that give us issues\n    stream.getBytes(60); // skipping type, misc sizes, panose, unicode ranges\n    var selection = stream.getUint16();\n    if (version < 4 && (selection & 0x0300)) {\n      return false;\n    }\n    var firstChar = stream.getUint16();\n    var lastChar = stream.getUint16();\n    if (firstChar > lastChar) {\n      return false;\n    }\n    stream.getBytes(6); // skipping sTypoAscender/Descender/LineGap\n    var usWinAscent = stream.getUint16();\n    if (usWinAscent === 0) { // makes font unreadable by windows\n      return false;\n    }\n\n    // OS/2 appears to be valid, resetting some fields\n    os2.data[8] = os2.data[9] = 0; // IE rejects fonts if fsType != 0\n    return true;\n  }\n\n  function createOS2Table(properties, charstrings, override) {\n    override = override || {\n      unitsPerEm: 0,\n      yMax: 0,\n      yMin: 0,\n      ascent: 0,\n      descent: 0\n    };\n\n    var ulUnicodeRange1 = 0;\n    var ulUnicodeRange2 = 0;\n    var ulUnicodeRange3 = 0;\n    var ulUnicodeRange4 = 0;\n\n    var firstCharIndex = null;\n    var lastCharIndex = 0;\n\n    if (charstrings) {\n      for (var code in charstrings) {\n        code |= 0;\n        if (firstCharIndex > code || !firstCharIndex) {\n          firstCharIndex = code;\n        }\n        if (lastCharIndex < code) {\n          lastCharIndex = code;\n        }\n\n        var position = getUnicodeRangeFor(code);\n        if (position < 32) {\n          ulUnicodeRange1 |= 1 << position;\n        } else if (position < 64) {\n          ulUnicodeRange2 |= 1 << position - 32;\n        } else if (position < 96) {\n          ulUnicodeRange3 |= 1 << position - 64;\n        } else if (position < 123) {\n          ulUnicodeRange4 |= 1 << position - 96;\n        } else {\n          error('Unicode ranges Bits > 123 are reserved for internal usage');\n        }\n      }\n    } else {\n      // TODO\n      firstCharIndex = 0;\n      lastCharIndex = 255;\n    }\n\n    var bbox = properties.bbox || [0, 0, 0, 0];\n    var unitsPerEm = (override.unitsPerEm ||\n                      1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]);\n\n    // if the font units differ to the PDF glyph space units\n    // then scale up the values\n    var scale = (properties.ascentScaled ? 1.0 :\n                 unitsPerEm / PDF_GLYPH_SPACE_UNITS);\n\n    var typoAscent = (override.ascent ||\n                      Math.round(scale * (properties.ascent || bbox[3])));\n    var typoDescent = (override.descent ||\n                       Math.round(scale * (properties.descent || bbox[1])));\n    if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) {\n      typoDescent = -typoDescent; // fixing incorrect descent\n    }\n    var winAscent = override.yMax || typoAscent;\n    var winDescent = -override.yMin || -typoDescent;\n\n    return '\\x00\\x03' + // version\n           '\\x02\\x24' + // xAvgCharWidth\n           '\\x01\\xF4' + // usWeightClass\n           '\\x00\\x05' + // usWidthClass\n           '\\x00\\x00' + // fstype (0 to let the font loads via font-face on IE)\n           '\\x02\\x8A' + // ySubscriptXSize\n           '\\x02\\xBB' + // ySubscriptYSize\n           '\\x00\\x00' + // ySubscriptXOffset\n           '\\x00\\x8C' + // ySubscriptYOffset\n           '\\x02\\x8A' + // ySuperScriptXSize\n           '\\x02\\xBB' + // ySuperScriptYSize\n           '\\x00\\x00' + // ySuperScriptXOffset\n           '\\x01\\xDF' + // ySuperScriptYOffset\n           '\\x00\\x31' + // yStrikeOutSize\n           '\\x01\\x02' + // yStrikeOutPosition\n           '\\x00\\x00' + // sFamilyClass\n           '\\x00\\x00\\x06' +\n           String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) +\n           '\\x00\\x00\\x00\\x00\\x00\\x00' + // Panose\n           string32(ulUnicodeRange1) + // ulUnicodeRange1 (Bits 0-31)\n           string32(ulUnicodeRange2) + // ulUnicodeRange2 (Bits 32-63)\n           string32(ulUnicodeRange3) + // ulUnicodeRange3 (Bits 64-95)\n           string32(ulUnicodeRange4) + // ulUnicodeRange4 (Bits 96-127)\n           '\\x2A\\x32\\x31\\x2A' + // achVendID\n           string16(properties.italicAngle ? 1 : 0) + // fsSelection\n           string16(firstCharIndex ||\n                    properties.firstChar) + // usFirstCharIndex\n           string16(lastCharIndex || properties.lastChar) +  // usLastCharIndex\n           string16(typoAscent) + // sTypoAscender\n           string16(typoDescent) + // sTypoDescender\n           '\\x00\\x64' + // sTypoLineGap (7%-10% of the unitsPerEM value)\n           string16(winAscent) + // usWinAscent\n           string16(winDescent) + // usWinDescent\n           '\\x00\\x00\\x00\\x00' + // ulCodePageRange1 (Bits 0-31)\n           '\\x00\\x00\\x00\\x00' + // ulCodePageRange2 (Bits 32-63)\n           string16(properties.xHeight) + // sxHeight\n           string16(properties.capHeight) + // sCapHeight\n           string16(0) + // usDefaultChar\n           string16(firstCharIndex || properties.firstChar) + // usBreakChar\n           '\\x00\\x03';  // usMaxContext\n  }\n\n  function createPostTable(properties) {\n    var angle = Math.floor(properties.italicAngle * (Math.pow(2, 16)));\n    return ('\\x00\\x03\\x00\\x00' + // Version number\n            string32(angle) + // italicAngle\n            '\\x00\\x00' + // underlinePosition\n            '\\x00\\x00' + // underlineThickness\n            string32(properties.fixedPitch) + // isFixedPitch\n            '\\x00\\x00\\x00\\x00' + // minMemType42\n            '\\x00\\x00\\x00\\x00' + // maxMemType42\n            '\\x00\\x00\\x00\\x00' + // minMemType1\n            '\\x00\\x00\\x00\\x00');  // maxMemType1\n  }\n\n  function createNameTable(name, proto) {\n    if (!proto) {\n      proto = [[], []]; // no strings and unicode strings\n    }\n\n    var strings = [\n      proto[0][0] || 'Original licence',  // 0.Copyright\n      proto[0][1] || name,                // 1.Font family\n      proto[0][2] || 'Unknown',           // 2.Font subfamily (font weight)\n      proto[0][3] || 'uniqueID',          // 3.Unique ID\n      proto[0][4] || name,                // 4.Full font name\n      proto[0][5] || 'Version 0.11',      // 5.Version\n      proto[0][6] || '',                  // 6.Postscript name\n      proto[0][7] || 'Unknown',           // 7.Trademark\n      proto[0][8] || 'Unknown',           // 8.Manufacturer\n      proto[0][9] || 'Unknown'            // 9.Designer\n    ];\n\n    // Mac want 1-byte per character strings while Windows want\n    // 2-bytes per character, so duplicate the names table\n    var stringsUnicode = [];\n    var i, ii, j, jj, str;\n    for (i = 0, ii = strings.length; i < ii; i++) {\n      str = proto[1][i] || strings[i];\n\n      var strBufUnicode = [];\n      for (j = 0, jj = str.length; j < jj; j++) {\n        strBufUnicode.push(string16(str.charCodeAt(j)));\n      }\n      stringsUnicode.push(strBufUnicode.join(''));\n    }\n\n    var names = [strings, stringsUnicode];\n    var platforms = ['\\x00\\x01', '\\x00\\x03'];\n    var encodings = ['\\x00\\x00', '\\x00\\x01'];\n    var languages = ['\\x00\\x00', '\\x04\\x09'];\n\n    var namesRecordCount = strings.length * platforms.length;\n    var nameTable =\n      '\\x00\\x00' +                           // format\n      string16(namesRecordCount) +           // Number of names Record\n      string16(namesRecordCount * 12 + 6);   // Storage\n\n    // Build the name records field\n    var strOffset = 0;\n    for (i = 0, ii = platforms.length; i < ii; i++) {\n      var strs = names[i];\n      for (j = 0, jj = strs.length; j < jj; j++) {\n        str = strs[j];\n        var nameRecord =\n          platforms[i] + // platform ID\n          encodings[i] + // encoding ID\n          languages[i] + // language ID\n          string16(j) + // name ID\n          string16(str.length) +\n          string16(strOffset);\n        nameTable += nameRecord;\n        strOffset += str.length;\n      }\n    }\n\n    nameTable += strings.join('') + stringsUnicode.join('');\n    return nameTable;\n  }\n\n  Font.prototype = {\n    name: null,\n    font: null,\n    mimetype: null,\n    encoding: null,\n    get renderer() {\n      var renderer = FontRendererFactory.create(this);\n      return shadow(this, 'renderer', renderer);\n    },\n\n    exportData: function Font_exportData() {\n      var data = {};\n      for (var i in this) {\n        if (this.hasOwnProperty(i)) {\n          data[i] = this[i];\n        }\n      }\n      return data;\n    },\n\n    checkAndRepair: function Font_checkAndRepair(name, font, properties) {\n      function readTableEntry(file) {\n        var tag = bytesToString(file.getBytes(4));\n\n        var checksum = file.getInt32();\n        var offset = file.getInt32() >>> 0;\n        var length = file.getInt32() >>> 0;\n\n        // Read the table associated data\n        var previousPosition = file.pos;\n        file.pos = file.start ? file.start : 0;\n        file.skip(offset);\n        var data = file.getBytes(length);\n        file.pos = previousPosition;\n\n        if (tag === 'head') {\n          // clearing checksum adjustment\n          data[8] = data[9] = data[10] = data[11] = 0;\n          data[17] |= 0x20; //Set font optimized for cleartype flag\n        }\n\n        return {\n          tag: tag,\n          checksum: checksum,\n          length: length,\n          offset: offset,\n          data: data\n        };\n      }\n\n      function readOpenTypeHeader(ttf) {\n        return {\n          version: bytesToString(ttf.getBytes(4)),\n          numTables: ttf.getUint16(),\n          searchRange: ttf.getUint16(),\n          entrySelector: ttf.getUint16(),\n          rangeShift: ttf.getUint16()\n        };\n      }\n\n      /**\n       * Read the appropriate subtable from the cmap according to 9.6.6.4 from\n       * PDF spec\n       */\n      function readCmapTable(cmap, font, isSymbolicFont) {\n        var segment;\n        var start = (font.start ? font.start : 0) + cmap.offset;\n        font.pos = start;\n\n        var version = font.getUint16();\n        var numTables = font.getUint16();\n\n        var potentialTable;\n        var canBreak = false;\n        // There's an order of preference in terms of which cmap subtable to\n        // use:\n        // - non-symbolic fonts the preference is a 3,1 table then a 1,0 table\n        // - symbolic fonts the preference is a 3,0 table then a 1,0 table\n        // The following takes advantage of the fact that the tables are sorted\n        // to work.\n        for (var i = 0; i < numTables; i++) {\n          var platformId = font.getUint16();\n          var encodingId = font.getUint16();\n          var offset = font.getInt32() >>> 0;\n          var useTable = false;\n\n          if (platformId === 0 && encodingId === 0) {\n            useTable = true;\n            // Continue the loop since there still may be a higher priority\n            // table.\n          } else if (platformId === 1 && encodingId === 0) {\n            useTable = true;\n            // Continue the loop since there still may be a higher priority\n            // table.\n          } else if (platformId === 3 && encodingId === 1 &&\n                     (!isSymbolicFont || !potentialTable)) {\n            useTable = true;\n            if (!isSymbolicFont) {\n              canBreak = true;\n            }\n          } else if (isSymbolicFont && platformId === 3 && encodingId === 0) {\n            useTable = true;\n            canBreak = true;\n          }\n\n          if (useTable) {\n            potentialTable = {\n              platformId: platformId,\n              encodingId: encodingId,\n              offset: offset\n            };\n          }\n          if (canBreak) {\n            break;\n          }\n        }\n\n        if (potentialTable) {\n          font.pos = start + potentialTable.offset;\n        }\n        if (!potentialTable || font.peekByte() === -1) {\n          warn('Could not find a preferred cmap table.');\n          return {\n            platformId: -1,\n            encodingId: -1,\n            mappings: [],\n            hasShortCmap: false\n          };\n        }\n\n        var format = font.getUint16();\n        var length = font.getUint16();\n        var language = font.getUint16();\n\n        var hasShortCmap = false;\n        var mappings = [];\n        var j, glyphId;\n\n        // TODO(mack): refactor this cmap subtable reading logic out\n        if (format === 0) {\n          for (j = 0; j < 256; j++) {\n            var index = font.getByte();\n            if (!index) {\n              continue;\n            }\n            mappings.push({\n              charCode: j,\n              glyphId: index\n            });\n          }\n          hasShortCmap = true;\n        } else if (format === 4) {\n          // re-creating the table in format 4 since the encoding\n          // might be changed\n          var segCount = (font.getUint16() >> 1);\n          font.getBytes(6); // skipping range fields\n          var segIndex, segments = [];\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segments.push({ end: font.getUint16() });\n          }\n          font.getUint16();\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segments[segIndex].start = font.getUint16();\n          }\n\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segments[segIndex].delta = font.getUint16();\n          }\n\n          var offsetsCount = 0;\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segment = segments[segIndex];\n            var rangeOffset = font.getUint16();\n            if (!rangeOffset) {\n              segment.offsetIndex = -1;\n              continue;\n            }\n\n            var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);\n            segment.offsetIndex = offsetIndex;\n            offsetsCount = Math.max(offsetsCount, offsetIndex +\n                                    segment.end - segment.start + 1);\n          }\n\n          var offsets = [];\n          for (j = 0; j < offsetsCount; j++) {\n            offsets.push(font.getUint16());\n          }\n\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segment = segments[segIndex];\n            start = segment.start;\n            var end = segment.end;\n            var delta = segment.delta;\n            offsetIndex = segment.offsetIndex;\n\n            for (j = start; j <= end; j++) {\n              if (j === 0xFFFF) {\n                continue;\n              }\n\n              glyphId = (offsetIndex < 0 ?\n                         j : offsets[offsetIndex + j - start]);\n              glyphId = (glyphId + delta) & 0xFFFF;\n              if (glyphId === 0) {\n                continue;\n              }\n              mappings.push({\n                charCode: j,\n                glyphId: glyphId\n              });\n            }\n          }\n        } else if (format === 6) {\n          // Format 6 is a 2-bytes dense mapping, which means the font data\n          // lives glue together even if they are pretty far in the unicode\n          // table. (This looks weird, so I can have missed something), this\n          // works on Linux but seems to fails on Mac so let's rewrite the\n          // cmap table to a 3-1-4 style\n          var firstCode = font.getUint16();\n          var entryCount = font.getUint16();\n\n          for (j = 0; j < entryCount; j++) {\n            glyphId = font.getUint16();\n            var charCode = firstCode + j;\n\n            mappings.push({\n              charCode: charCode,\n              glyphId: glyphId\n            });\n          }\n        } else {\n          error('cmap table has unsupported format: ' + format);\n        }\n\n        // removing duplicate entries\n        mappings.sort(function (a, b) {\n          return a.charCode - b.charCode;\n        });\n        for (i = 1; i < mappings.length; i++) {\n          if (mappings[i - 1].charCode === mappings[i].charCode) {\n            mappings.splice(i, 1);\n            i--;\n          }\n        }\n\n        return {\n          platformId: potentialTable.platformId,\n          encodingId: potentialTable.encodingId,\n          mappings: mappings,\n          hasShortCmap: hasShortCmap\n        };\n      }\n\n      function sanitizeMetrics(font, header, metrics, numGlyphs) {\n        if (!header) {\n          if (metrics) {\n            metrics.data = null;\n          }\n          return;\n        }\n\n        font.pos = (font.start ? font.start : 0) + header.offset;\n        font.pos += header.length - 2;\n        var numOfMetrics = font.getUint16();\n\n        if (numOfMetrics > numGlyphs) {\n          info('The numOfMetrics (' + numOfMetrics + ') should not be ' +\n               'greater than the numGlyphs (' + numGlyphs + ')');\n          // Reduce numOfMetrics if it is greater than numGlyphs\n          numOfMetrics = numGlyphs;\n          header.data[34] = (numOfMetrics & 0xff00) >> 8;\n          header.data[35] = numOfMetrics & 0x00ff;\n        }\n\n        var numOfSidebearings = numGlyphs - numOfMetrics;\n        var numMissing = numOfSidebearings -\n          ((metrics.length - numOfMetrics * 4) >> 1);\n\n        if (numMissing > 0) {\n          // For each missing glyph, we set both the width and lsb to 0 (zero).\n          // Since we need to add two properties for each glyph, this explains\n          // the use of |numMissing * 2| when initializing the typed array.\n          var entries = new Uint8Array(metrics.length + numMissing * 2);\n          entries.set(metrics.data);\n          metrics.data = entries;\n        }\n      }\n\n      function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart,\n                             hintsValid) {\n        if (sourceEnd - sourceStart <= 12) {\n          // glyph with data less than 12 is invalid one\n          return 0;\n        }\n        var glyf = source.subarray(sourceStart, sourceEnd);\n        var contoursCount = (glyf[0] << 8) | glyf[1];\n        if (contoursCount & 0x8000) {\n          // complex glyph, writing as is\n          dest.set(glyf, destStart);\n          return glyf.length;\n        }\n\n        var i, j = 10, flagsCount = 0;\n        for (i = 0; i < contoursCount; i++) {\n          var endPoint = (glyf[j] << 8) | glyf[j + 1];\n          flagsCount = endPoint + 1;\n          j += 2;\n        }\n        // skipping instructions\n        var instructionsStart = j;\n        var instructionsLength = (glyf[j] << 8) | glyf[j + 1];\n        j += 2 + instructionsLength;\n        var instructionsEnd = j;\n        // validating flags\n        var coordinatesLength = 0;\n        for (i = 0; i < flagsCount; i++) {\n          var flag = glyf[j++];\n          if (flag & 0xC0) {\n            // reserved flags must be zero, cleaning up\n            glyf[j - 1] = flag & 0x3F;\n          }\n          var xyLength = ((flag & 2) ? 1 : (flag & 16) ? 0 : 2) +\n                         ((flag & 4) ? 1 : (flag & 32) ? 0 : 2);\n          coordinatesLength += xyLength;\n          if (flag & 8) {\n            var repeat = glyf[j++];\n            i += repeat;\n            coordinatesLength += repeat * xyLength;\n          }\n        }\n        // glyph without coordinates will be rejected\n        if (coordinatesLength === 0) {\n          return 0;\n        }\n        var glyphDataLength = j + coordinatesLength;\n        if (glyphDataLength > glyf.length) {\n          // not enough data for coordinates\n          return 0;\n        }\n        if (!hintsValid && instructionsLength > 0) {\n          dest.set(glyf.subarray(0, instructionsStart), destStart);\n          dest.set([0, 0], destStart + instructionsStart);\n          dest.set(glyf.subarray(instructionsEnd, glyphDataLength),\n                   destStart + instructionsStart + 2);\n          glyphDataLength -= instructionsLength;\n          if (glyf.length - glyphDataLength > 3) {\n            glyphDataLength = (glyphDataLength + 3) & ~3;\n          }\n          return glyphDataLength;\n        }\n        if (glyf.length - glyphDataLength > 3) {\n          // truncating and aligning to 4 bytes the long glyph data\n          glyphDataLength = (glyphDataLength + 3) & ~3;\n          dest.set(glyf.subarray(0, glyphDataLength), destStart);\n          return glyphDataLength;\n        }\n        // glyph data is fine\n        dest.set(glyf, destStart);\n        return glyf.length;\n      }\n\n      function sanitizeHead(head, numGlyphs, locaLength) {\n        var data = head.data;\n\n        // Validate version:\n        // Should always be 0x00010000\n        var version = int32(data[0], data[1], data[2], data[3]);\n        if (version >> 16 !== 1) {\n          info('Attempting to fix invalid version in head table: ' + version);\n          data[0] = 0;\n          data[1] = 1;\n          data[2] = 0;\n          data[3] = 0;\n        }\n\n        var indexToLocFormat = int16(data[50], data[51]);\n        if (indexToLocFormat < 0 || indexToLocFormat > 1) {\n          info('Attempting to fix invalid indexToLocFormat in head table: ' +\n               indexToLocFormat);\n\n          // The value of indexToLocFormat should be 0 if the loca table\n          // consists of short offsets, and should be 1 if the loca table\n          // consists of long offsets.\n          //\n          // The number of entries in the loca table should be numGlyphs + 1.\n          //\n          // Using this information, we can work backwards to deduce if the\n          // size of each offset in the loca table, and thus figure out the\n          // appropriate value for indexToLocFormat.\n\n          var numGlyphsPlusOne = numGlyphs + 1;\n          if (locaLength === numGlyphsPlusOne << 1) {\n            // 0x0000 indicates the loca table consists of short offsets\n            data[50] = 0;\n            data[51] = 0;\n          } else if (locaLength === numGlyphsPlusOne << 2) {\n            // 0x0001 indicates the loca table consists of long offsets\n            data[50] = 0;\n            data[51] = 1;\n          } else {\n            warn('Could not fix indexToLocFormat: ' + indexToLocFormat);\n          }\n        }\n      }\n\n      function sanitizeGlyphLocations(loca, glyf, numGlyphs,\n                                      isGlyphLocationsLong, hintsValid,\n                                      dupFirstEntry) {\n        var itemSize, itemDecode, itemEncode;\n        if (isGlyphLocationsLong) {\n          itemSize = 4;\n          itemDecode = function fontItemDecodeLong(data, offset) {\n            return (data[offset] << 24) | (data[offset + 1] << 16) |\n                   (data[offset + 2] << 8) | data[offset + 3];\n          };\n          itemEncode = function fontItemEncodeLong(data, offset, value) {\n            data[offset] = (value >>> 24) & 0xFF;\n            data[offset + 1] = (value >> 16) & 0xFF;\n            data[offset + 2] = (value >> 8) & 0xFF;\n            data[offset + 3] = value & 0xFF;\n          };\n        } else {\n          itemSize = 2;\n          itemDecode = function fontItemDecode(data, offset) {\n            return (data[offset] << 9) | (data[offset + 1] << 1);\n          };\n          itemEncode = function fontItemEncode(data, offset, value) {\n            data[offset] = (value >> 9) & 0xFF;\n            data[offset + 1] = (value >> 1) & 0xFF;\n          };\n        }\n        var locaData = loca.data;\n        var locaDataSize = itemSize * (1 + numGlyphs);\n        // is loca.data too short or long?\n        if (locaData.length !== locaDataSize) {\n          locaData = new Uint8Array(locaDataSize);\n          locaData.set(loca.data.subarray(0, locaDataSize));\n          loca.data = locaData;\n        }\n        // removing the invalid glyphs\n        var oldGlyfData = glyf.data;\n        var oldGlyfDataLength = oldGlyfData.length;\n        var newGlyfData = new Uint8Array(oldGlyfDataLength);\n        var startOffset = itemDecode(locaData, 0);\n        var writeOffset = 0;\n        var missingGlyphData = {};\n        itemEncode(locaData, 0, writeOffset);\n        var i, j;\n        for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {\n          var endOffset = itemDecode(locaData, j);\n          if (endOffset > oldGlyfDataLength &&\n              ((oldGlyfDataLength + 3) & ~3) === endOffset) {\n            // Aspose breaks fonts by aligning the glyphs to the qword, but not\n            // the glyf table size, which makes last glyph out of range.\n            endOffset = oldGlyfDataLength;\n          }\n          if (endOffset > oldGlyfDataLength) {\n            // glyph end offset points outside glyf data, rejecting the glyph\n            itemEncode(locaData, j, writeOffset);\n            startOffset = endOffset;\n            continue;\n          }\n\n          if (startOffset === endOffset) {\n            missingGlyphData[i] = true;\n          }\n\n          var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset,\n                                        newGlyfData, writeOffset, hintsValid);\n          writeOffset += newLength;\n          itemEncode(locaData, j, writeOffset);\n          startOffset = endOffset;\n        }\n\n        if (writeOffset === 0) {\n          // glyf table cannot be empty -- redoing the glyf and loca tables\n          // to have single glyph with one point\n          var simpleGlyph = new Uint8Array(\n            [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);\n          for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {\n            itemEncode(locaData, j, simpleGlyph.length);\n          }\n          glyf.data = simpleGlyph;\n          return missingGlyphData;\n        }\n\n        if (dupFirstEntry) {\n          var firstEntryLength = itemDecode(locaData, itemSize);\n          if (newGlyfData.length > firstEntryLength + writeOffset) {\n            glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset);\n          } else {\n            glyf.data = new Uint8Array(firstEntryLength + writeOffset);\n            glyf.data.set(newGlyfData.subarray(0, writeOffset));\n          }\n          glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset);\n          itemEncode(loca.data, locaData.length - itemSize,\n                     writeOffset + firstEntryLength);\n        } else {\n          glyf.data = newGlyfData.subarray(0, writeOffset);\n        }\n        return missingGlyphData;\n      }\n\n      function readPostScriptTable(post, properties, maxpNumGlyphs) {\n        var start = (font.start ? font.start : 0) + post.offset;\n        font.pos = start;\n\n        var length = post.length, end = start + length;\n        var version = font.getInt32();\n        // skip rest to the tables\n        font.getBytes(28);\n\n        var glyphNames;\n        var valid = true;\n        var i;\n\n        switch (version) {\n          case 0x00010000:\n            glyphNames = MacStandardGlyphOrdering;\n            break;\n          case 0x00020000:\n            var numGlyphs = font.getUint16();\n            if (numGlyphs !== maxpNumGlyphs) {\n              valid = false;\n              break;\n            }\n            var glyphNameIndexes = [];\n            for (i = 0; i < numGlyphs; ++i) {\n              var index = font.getUint16();\n              if (index >= 32768) {\n                valid = false;\n                break;\n              }\n              glyphNameIndexes.push(index);\n            }\n            if (!valid) {\n              break;\n            }\n            var customNames = [];\n            var strBuf = [];\n            while (font.pos < end) {\n              var stringLength = font.getByte();\n              strBuf.length = stringLength;\n              for (i = 0; i < stringLength; ++i) {\n                strBuf[i] = String.fromCharCode(font.getByte());\n              }\n              customNames.push(strBuf.join(''));\n            }\n            glyphNames = [];\n            for (i = 0; i < numGlyphs; ++i) {\n              var j = glyphNameIndexes[i];\n              if (j < 258) {\n                glyphNames.push(MacStandardGlyphOrdering[j]);\n                continue;\n              }\n              glyphNames.push(customNames[j - 258]);\n            }\n            break;\n          case 0x00030000:\n            break;\n          default:\n            warn('Unknown/unsupported post table version ' + version);\n            valid = false;\n            if (properties.defaultEncoding) {\n              glyphNames = properties.defaultEncoding;\n            }\n            break;\n        }\n        properties.glyphNames = glyphNames;\n        return valid;\n      }\n\n      function readNameTable(nameTable) {\n        var start = (font.start ? font.start : 0) + nameTable.offset;\n        font.pos = start;\n\n        var names = [[], []];\n        var length = nameTable.length, end = start + length;\n        var format = font.getUint16();\n        var FORMAT_0_HEADER_LENGTH = 6;\n        if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) {\n          // unsupported name table format or table \"too\" small\n          return names;\n        }\n        var numRecords = font.getUint16();\n        var stringsStart = font.getUint16();\n        var records = [];\n        var NAME_RECORD_LENGTH = 12;\n        var i, ii;\n\n        for (i = 0; i < numRecords &&\n                        font.pos + NAME_RECORD_LENGTH <= end; i++) {\n          var r = {\n            platform: font.getUint16(),\n            encoding: font.getUint16(),\n            language: font.getUint16(),\n            name: font.getUint16(),\n            length: font.getUint16(),\n            offset: font.getUint16()\n          };\n          // using only Macintosh and Windows platform/encoding names\n          if ((r.platform === 1 && r.encoding === 0 && r.language === 0) ||\n              (r.platform === 3 && r.encoding === 1 && r.language === 0x409)) {\n            records.push(r);\n          }\n        }\n        for (i = 0, ii = records.length; i < ii; i++) {\n          var record = records[i];\n          var pos = start + stringsStart + record.offset;\n          if (pos + record.length > end) {\n            continue; // outside of name table, ignoring\n          }\n          font.pos = pos;\n          var nameIndex = record.name;\n          if (record.encoding) {\n            // unicode\n            var str = '';\n            for (var j = 0, jj = record.length; j < jj; j += 2) {\n              str += String.fromCharCode(font.getUint16());\n            }\n            names[1][nameIndex] = str;\n          } else {\n            names[0][nameIndex] = bytesToString(font.getBytes(record.length));\n          }\n        }\n        return names;\n      }\n\n      var TTOpsStackDeltas = [\n        0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5,\n        -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1,\n        1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1,\n        0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2,\n        0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1,\n        -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1,\n        -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n        -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1,\n        -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2];\n        // 0xC0-DF == -1 and 0xE0-FF == -2\n\n      function sanitizeTTProgram(table, ttContext) {\n        var data = table.data;\n        var i = 0, j, n, b, funcId, pc, lastEndf = 0, lastDeff = 0;\n        var stack = [];\n        var callstack = [];\n        var functionsCalled = [];\n        var tooComplexToFollowFunctions =\n          ttContext.tooComplexToFollowFunctions;\n        var inFDEF = false, ifLevel = 0, inELSE = 0;\n        for (var ii = data.length; i < ii;) {\n          var op = data[i++];\n          // The TrueType instruction set docs can be found at\n          // https://developer.apple.com/fonts/TTRefMan/RM05/Chap5.html\n          if (op === 0x40) { // NPUSHB - pushes n bytes\n            n = data[i++];\n            if (inFDEF || inELSE) {\n              i += n;\n            } else {\n              for (j = 0; j < n; j++) {\n                stack.push(data[i++]);\n              }\n            }\n          } else if (op === 0x41) { // NPUSHW - pushes n words\n            n = data[i++];\n            if (inFDEF || inELSE) {\n              i += n * 2;\n            } else {\n              for (j = 0; j < n; j++) {\n                b = data[i++];\n                stack.push((b << 8) | data[i++]);\n              }\n            }\n          } else if ((op & 0xF8) === 0xB0) { // PUSHB - pushes bytes\n            n = op - 0xB0 + 1;\n            if (inFDEF || inELSE) {\n              i += n;\n            } else {\n              for (j = 0; j < n; j++) {\n                stack.push(data[i++]);\n              }\n            }\n          } else if ((op & 0xF8) === 0xB8) { // PUSHW - pushes words\n            n = op - 0xB8 + 1;\n            if (inFDEF || inELSE) {\n              i += n * 2;\n            } else {\n              for (j = 0; j < n; j++) {\n                b = data[i++];\n                stack.push((b << 8) | data[i++]);\n              }\n            }\n          } else if (op === 0x2B && !tooComplexToFollowFunctions) { // CALL\n            if (!inFDEF && !inELSE) {\n              // collecting inforamtion about which functions are used\n              funcId = stack[stack.length - 1];\n              ttContext.functionsUsed[funcId] = true;\n              if (funcId in ttContext.functionsStackDeltas) {\n                stack.length += ttContext.functionsStackDeltas[funcId];\n              } else if (funcId in ttContext.functionsDefined &&\n                         functionsCalled.indexOf(funcId) < 0) {\n                callstack.push({data: data, i: i, stackTop: stack.length - 1});\n                functionsCalled.push(funcId);\n                pc = ttContext.functionsDefined[funcId];\n                if (!pc) {\n                  warn('TT: CALL non-existent function');\n                  ttContext.hintsValid = false;\n                  return;\n                }\n                data = pc.data;\n                i = pc.i;\n              }\n            }\n          } else if (op === 0x2C && !tooComplexToFollowFunctions) { // FDEF\n            if (inFDEF || inELSE) {\n              warn('TT: nested FDEFs not allowed');\n              tooComplexToFollowFunctions = true;\n            }\n            inFDEF = true;\n            // collecting inforamtion about which functions are defined\n            lastDeff = i;\n            funcId = stack.pop();\n            ttContext.functionsDefined[funcId] = {data: data, i: i};\n          } else if (op === 0x2D) { // ENDF - end of function\n            if (inFDEF) {\n              inFDEF = false;\n              lastEndf = i;\n            } else {\n              pc = callstack.pop();\n              if (!pc) {\n                warn('TT: ENDF bad stack');\n                ttContext.hintsValid = false;\n                return;\n              }\n              funcId = functionsCalled.pop();\n              data = pc.data;\n              i = pc.i;\n              ttContext.functionsStackDeltas[funcId] =\n                stack.length - pc.stackTop;\n            }\n          } else if (op === 0x89) { // IDEF - instruction definition\n            if (inFDEF || inELSE) {\n              warn('TT: nested IDEFs not allowed');\n              tooComplexToFollowFunctions = true;\n            }\n            inFDEF = true;\n            // recording it as a function to track ENDF\n            lastDeff = i;\n          } else if (op === 0x58) { // IF\n            ++ifLevel;\n          } else if (op === 0x1B) { // ELSE\n            inELSE = ifLevel;\n          } else if (op === 0x59) { // EIF\n            if (inELSE === ifLevel) {\n              inELSE = 0;\n            }\n            --ifLevel;\n          } else if (op === 0x1C) { // JMPR\n            if (!inFDEF && !inELSE) {\n              var offset = stack[stack.length - 1];\n              // only jumping forward to prevent infinite loop\n              if (offset > 0) {\n                i += offset - 1;\n              }\n            }\n          }\n          // Adjusting stack not extactly, but just enough to get function id\n          if (!inFDEF && !inELSE) {\n            var stackDelta = op <= 0x8E ? TTOpsStackDeltas[op] :\n              op >= 0xC0 && op <= 0xDF ? -1 : op >= 0xE0 ? -2 : 0;\n            if (op >= 0x71 && op <= 0x75) {\n              n = stack.pop();\n              if (n === n) {\n                stackDelta = -n * 2;\n              }\n            }\n            while (stackDelta < 0 && stack.length > 0) {\n              stack.pop();\n              stackDelta++;\n            }\n            while (stackDelta > 0) {\n              stack.push(NaN); // pushing any number into stack\n              stackDelta--;\n            }\n          }\n        }\n        ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions;\n        var content = [data];\n        if (i > data.length) {\n          content.push(new Uint8Array(i - data.length));\n        }\n        if (lastDeff > lastEndf) {\n          warn('TT: complementing a missing function tail');\n          // new function definition started, but not finished\n          // complete function by [CLEAR, ENDF]\n          content.push(new Uint8Array([0x22, 0x2D]));\n        }\n        foldTTTable(table, content);\n      }\n\n      function checkInvalidFunctions(ttContext, maxFunctionDefs) {\n        if (ttContext.tooComplexToFollowFunctions) {\n          return;\n        }\n        if (ttContext.functionsDefined.length > maxFunctionDefs) {\n          warn('TT: more functions defined than expected');\n          ttContext.hintsValid = false;\n          return;\n        }\n        for (var j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) {\n          if (j > maxFunctionDefs) {\n            warn('TT: invalid function id: ' + j);\n            ttContext.hintsValid = false;\n            return;\n          }\n          if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) {\n            warn('TT: undefined function: ' + j);\n            ttContext.hintsValid = false;\n            return;\n          }\n        }\n      }\n\n      function foldTTTable(table, content) {\n        if (content.length > 1) {\n          // concatenating the content items\n          var newLength = 0;\n          var j, jj;\n          for (j = 0, jj = content.length; j < jj; j++) {\n            newLength += content[j].length;\n          }\n          newLength = (newLength + 3) & ~3;\n          var result = new Uint8Array(newLength);\n          var pos = 0;\n          for (j = 0, jj = content.length; j < jj; j++) {\n            result.set(content[j], pos);\n            pos += content[j].length;\n          }\n          table.data = result;\n          table.length = newLength;\n        }\n      }\n\n      function sanitizeTTPrograms(fpgm, prep, cvt) {\n        var ttContext = {\n          functionsDefined: [],\n          functionsUsed: [],\n          functionsStackDeltas: [],\n          tooComplexToFollowFunctions: false,\n          hintsValid: true\n        };\n        if (fpgm) {\n          sanitizeTTProgram(fpgm, ttContext);\n        }\n        if (prep) {\n          sanitizeTTProgram(prep, ttContext);\n        }\n        if (fpgm) {\n          checkInvalidFunctions(ttContext, maxFunctionDefs);\n        }\n        if (cvt && (cvt.length & 1)) {\n          var cvtData = new Uint8Array(cvt.length + 1);\n          cvtData.set(cvt.data);\n          cvt.data = cvtData;\n        }\n        return ttContext.hintsValid;\n      }\n\n      // The following steps modify the original font data, making copy\n      font = new Stream(new Uint8Array(font.getBytes()));\n\n      var VALID_TABLES = ['OS/2', 'cmap', 'head', 'hhea', 'hmtx', 'maxp',\n        'name', 'post', 'loca', 'glyf', 'fpgm', 'prep', 'cvt ', 'CFF '];\n\n      var header = readOpenTypeHeader(font);\n      var numTables = header.numTables;\n      var cff, cffFile;\n\n      var tables = { 'OS/2': null, cmap: null, head: null, hhea: null,\n                     hmtx: null, maxp: null, name: null, post: null };\n      var table;\n      for (var i = 0; i < numTables; i++) {\n        table = readTableEntry(font);\n        if (VALID_TABLES.indexOf(table.tag) < 0) {\n          continue; // skipping table if it's not a required or optional table\n        }\n        if (table.length === 0) {\n          continue; // skipping empty tables\n        }\n        tables[table.tag] = table;\n      }\n\n      var isTrueType = !tables['CFF '];\n      if (!isTrueType) {\n        // OpenType font\n        if (header.version === 'OTTO' ||\n            !tables.head || !tables.hhea || !tables.maxp || !tables.post) {\n          // no major tables: throwing everything at CFFFont\n          cffFile = new Stream(tables['CFF '].data);\n          cff = new CFFFont(cffFile, properties);\n\n          return this.convert(name, cff, properties);\n        }\n\n        delete tables.glyf;\n        delete tables.loca;\n        delete tables.fpgm;\n        delete tables.prep;\n        delete tables['cvt '];\n        this.isOpenType = true;\n      } else {\n        if (!tables.glyf || !tables.loca) {\n          error('Required \"glyf\" or \"loca\" tables are not found');\n        }\n        this.isOpenType = false;\n      }\n\n      if (!tables.maxp) {\n        error('Required \"maxp\" table is not found');\n      }\n\n      font.pos = (font.start || 0) + tables.maxp.offset;\n      var version = font.getInt32();\n      var numGlyphs = font.getUint16();\n      var maxFunctionDefs = 0;\n      if (version >= 0x00010000 && tables.maxp.length >= 22) {\n        // maxZones can be invalid\n        font.pos += 8;\n        var maxZones = font.getUint16();\n        if (maxZones > 2) { // reset to 2 if font has invalid maxZones\n          tables.maxp.data[14] = 0;\n          tables.maxp.data[15] = 2;\n        }\n        font.pos += 4;\n        maxFunctionDefs = font.getUint16();\n      }\n\n      var dupFirstEntry = false;\n      if (properties.type === 'CIDFontType2' && properties.toUnicode &&\n          properties.toUnicode.get(0) > '\\u0000') {\n        // oracle's defect (see 3427), duplicating first entry\n        dupFirstEntry = true;\n        numGlyphs++;\n        tables.maxp.data[4] = numGlyphs >> 8;\n        tables.maxp.data[5] = numGlyphs & 255;\n      }\n\n      var hintsValid = sanitizeTTPrograms(tables.fpgm, tables.prep,\n                                          tables['cvt '], maxFunctionDefs);\n      if (!hintsValid) {\n        delete tables.fpgm;\n        delete tables.prep;\n        delete tables['cvt '];\n      }\n\n      // Ensure the hmtx table contains the advance width and\n      // sidebearings information for numGlyphs in the maxp table\n      sanitizeMetrics(font, tables.hhea, tables.hmtx, numGlyphs);\n\n      if (!tables.head) {\n        error('Required \"head\" table is not found');\n      }\n\n      sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0);\n\n      var missingGlyphs = {};\n      if (isTrueType) {\n        var isGlyphLocationsLong = int16(tables.head.data[50],\n                                         tables.head.data[51]);\n        missingGlyphs = sanitizeGlyphLocations(tables.loca, tables.glyf,\n                                               numGlyphs, isGlyphLocationsLong,\n                                               hintsValid, dupFirstEntry);\n      }\n\n      if (!tables.hhea) {\n        error('Required \"hhea\" table is not found');\n      }\n\n      // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth\n      // Sometimes it's 0. That needs to be fixed\n      if (tables.hhea.data[10] === 0 && tables.hhea.data[11] === 0) {\n        tables.hhea.data[10] = 0xFF;\n        tables.hhea.data[11] = 0xFF;\n      }\n\n      // The 'post' table has glyphs names.\n      if (tables.post) {\n        var valid = readPostScriptTable(tables.post, properties, numGlyphs);\n        if (!valid) {\n          tables.post = null;\n        }\n      }\n\n      var charCodeToGlyphId = [], charCode, toUnicode = properties.toUnicode;\n\n      function hasGlyph(glyphId, charCode) {\n        if (!missingGlyphs[glyphId]) {\n          return true;\n        }\n        if (charCode >= 0 && toUnicode.has(charCode)) {\n          return true;\n        }\n        return false;\n      }\n\n      if (properties.type === 'CIDFontType2') {\n        var cidToGidMap = properties.cidToGidMap || [];\n        var isCidToGidMapEmpty = cidToGidMap.length === 0;\n\n        properties.cMap.forEach(function(charCode, cid) {\n          assert(cid <= 0xffff, 'Max size of CID is 65,535');\n          var glyphId = -1;\n          if (isCidToGidMapEmpty) {\n            glyphId = charCode;\n          } else if (cidToGidMap[cid] !== undefined) {\n            glyphId = cidToGidMap[cid];\n          }\n\n          if (glyphId >= 0 && glyphId < numGlyphs &&\n              hasGlyph(glyphId, charCode)) {\n            charCodeToGlyphId[charCode] = glyphId;\n          }\n        });\n        if (dupFirstEntry) {\n          charCodeToGlyphId[0] = numGlyphs - 1;\n        }\n      } else {\n        // Most of the following logic in this code branch is based on the\n        // 9.6.6.4 of the PDF spec.\n        var cmapTable = readCmapTable(tables.cmap, font, this.isSymbolicFont);\n        var cmapPlatformId = cmapTable.platformId;\n        var cmapEncodingId = cmapTable.encodingId;\n        var cmapMappings = cmapTable.mappings;\n        var cmapMappingsLength = cmapMappings.length;\n        var hasEncoding = properties.differences.length ||\n                          !!properties.baseEncodingName;\n\n        // The spec seems to imply that if the font is symbolic the encoding\n        // should be ignored, this doesn't appear to work for 'preistabelle.pdf'\n        // where the the font is symbolic and it has an encoding.\n        if (hasEncoding &&\n            (cmapPlatformId === 3 && cmapEncodingId === 1 ||\n             cmapPlatformId === 1 && cmapEncodingId === 0) ||\n            (cmapPlatformId === -1 && cmapEncodingId === -1 && // Temporary hack\n             !!Encodings[properties.baseEncodingName])) {      // Temporary hack\n          // When no preferred cmap table was found and |baseEncodingName| is\n          // one of the predefined encodings, we seem to obtain a better\n          // |charCodeToGlyphId| map from the code below (fixes bug 1057544).\n          // TODO: Note that this is a hack which should be removed as soon as\n          //       we have proper support for more exotic cmap tables.\n\n          var baseEncoding = [];\n          if (properties.baseEncodingName === 'MacRomanEncoding' ||\n              properties.baseEncodingName === 'WinAnsiEncoding') {\n            baseEncoding = Encodings[properties.baseEncodingName];\n          }\n          for (charCode = 0; charCode < 256; charCode++) {\n            var glyphName;\n            if (this.differences && charCode in this.differences) {\n              glyphName = this.differences[charCode];\n            } else if (charCode in baseEncoding &&\n                       baseEncoding[charCode] !== '') {\n              glyphName = baseEncoding[charCode];\n            } else {\n              glyphName = Encodings.StandardEncoding[charCode];\n            }\n            if (!glyphName) {\n              continue;\n            }\n            var unicodeOrCharCode;\n            if (cmapPlatformId === 3 && cmapEncodingId === 1) {\n              unicodeOrCharCode = GlyphsUnicode[glyphName];\n            } else if (cmapPlatformId === 1 && cmapEncodingId === 0) {\n              // TODO: the encoding needs to be updated with mac os table.\n              unicodeOrCharCode = Encodings.MacRomanEncoding.indexOf(glyphName);\n            }\n\n            var found = false;\n            for (i = 0; i < cmapMappingsLength; ++i) {\n              if (cmapMappings[i].charCode === unicodeOrCharCode &&\n                  hasGlyph(cmapMappings[i].glyphId, unicodeOrCharCode)) {\n                charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;\n                found = true;\n                break;\n              }\n            }\n            if (!found && properties.glyphNames) {\n              // Try to map using the post table. There are currently no known\n              // pdfs that this fixes.\n              var glyphId = properties.glyphNames.indexOf(glyphName);\n              if (glyphId > 0 && hasGlyph(glyphId, -1)) {\n                charCodeToGlyphId[charCode] = glyphId;\n              }\n            }\n          }\n        } else if (cmapPlatformId === 0 && cmapEncodingId === 0) {\n          // Default Unicode semantics, use the charcodes as is.\n          for (i = 0; i < cmapMappingsLength; ++i) {\n            charCodeToGlyphId[cmapMappings[i].charCode] =\n              cmapMappings[i].glyphId;\n          }\n        } else {\n          // For (3, 0) cmap tables:\n          // The charcode key being stored in charCodeToGlyphId is the lower\n          // byte of the two-byte charcodes of the cmap table since according to\n          // the spec: 'each byte from the string shall be prepended with the\n          // high byte of the range [of charcodes in the cmap table], to form\n          // a two-byte character, which shall be used to select the\n          // associated glyph description from the subtable'.\n          //\n          // For (1, 0) cmap tables:\n          // 'single bytes from the string shall be used to look up the\n          // associated glyph descriptions from the subtable'. This means\n          // charcodes in the cmap will be single bytes, so no-op since\n          // glyph.charCode & 0xFF === glyph.charCode\n          for (i = 0; i < cmapMappingsLength; ++i) {\n            charCode = cmapMappings[i].charCode & 0xFF;\n            charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;\n          }\n        }\n      }\n\n      if (charCodeToGlyphId.length === 0) {\n        // defines at least one glyph\n        charCodeToGlyphId[0] = 0;\n      }\n\n      // Converting glyphs and ids into font's cmap table\n      var newMapping = adjustMapping(charCodeToGlyphId, properties);\n      this.toFontChar = newMapping.toFontChar;\n      tables.cmap = {\n        tag: 'cmap',\n        data: createCmapTable(newMapping.charCodeToGlyphId)\n      };\n\n      if (!tables['OS/2'] || !validateOS2Table(tables['OS/2'])) {\n        // extract some more font properties from the OpenType head and\n        // hhea tables; yMin and descent value are always negative\n        var override = {\n          unitsPerEm: int16(tables.head.data[18], tables.head.data[19]),\n          yMax: int16(tables.head.data[42], tables.head.data[43]),\n          yMin: int16(tables.head.data[38], tables.head.data[39]) - 0x10000,\n          ascent: int16(tables.hhea.data[4], tables.hhea.data[5]),\n          descent: int16(tables.hhea.data[6], tables.hhea.data[7]) - 0x10000\n        };\n\n        tables['OS/2'] = {\n          tag: 'OS/2',\n          data: createOS2Table(properties, newMapping.charCodeToGlyphId,\n                               override)\n        };\n      }\n\n      // Rewrite the 'post' table if needed\n      if (!tables.post) {\n        tables.post = {\n          tag: 'post',\n          data: createPostTable(properties)\n        };\n      }\n\n      if (!isTrueType) {\n        try {\n          // Trying to repair CFF file\n          cffFile = new Stream(tables['CFF '].data);\n          var parser = new CFFParser(cffFile, properties);\n          cff = parser.parse();\n          var compiler = new CFFCompiler(cff);\n          tables['CFF '].data = compiler.compile();\n        } catch (e) {\n          warn('Failed to compile font ' + properties.loadedName);\n        }\n      }\n\n      // Re-creating 'name' table\n      if (!tables.name) {\n        tables.name = {\n          tag: 'name',\n          data: createNameTable(this.name)\n        };\n      } else {\n        // ... using existing 'name' table as prototype\n        var namePrototype = readNameTable(tables.name);\n        tables.name.data = createNameTable(name, namePrototype);\n      }\n\n      var builder = new OpenTypeFileBuilder(header.version);\n      for (var tableTag in tables) {\n        builder.addTable(tableTag, tables[tableTag].data);\n      }\n      return builder.toArray();\n    },\n\n    convert: function Font_convert(fontName, font, properties) {\n      // TODO: Check the charstring widths to determine this.\n      properties.fixedPitch = false;\n\n      var mapping = font.getGlyphMapping(properties);\n      var newMapping = adjustMapping(mapping, properties);\n      this.toFontChar = newMapping.toFontChar;\n      var numGlyphs = font.numGlyphs;\n\n      function getCharCodes(charCodeToGlyphId, glyphId) {\n        var charCodes = null;\n        for (var charCode in charCodeToGlyphId) {\n          if (glyphId === charCodeToGlyphId[charCode]) {\n            if (!charCodes) {\n              charCodes = [];\n            }\n            charCodes.push(charCode | 0);\n          }\n        }\n        return charCodes;\n      }\n\n      function createCharCode(charCodeToGlyphId, glyphId) {\n        for (var charCode in charCodeToGlyphId) {\n          if (glyphId === charCodeToGlyphId[charCode]) {\n            return charCode | 0;\n          }\n        }\n        newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] =\n            glyphId;\n        return newMapping.nextAvailableFontCharCode++;\n      }\n\n      var seacs = font.seacs;\n      if (SEAC_ANALYSIS_ENABLED && seacs && seacs.length) {\n        var matrix = properties.fontMatrix || FONT_IDENTITY_MATRIX;\n        var charset = font.getCharset();\n        var seacMap = Object.create(null);\n        for (var glyphId in seacs) {\n          glyphId |= 0;\n          var seac = seacs[glyphId];\n          var baseGlyphName = Encodings.StandardEncoding[seac[2]];\n          var accentGlyphName = Encodings.StandardEncoding[seac[3]];\n          var baseGlyphId = charset.indexOf(baseGlyphName);\n          var accentGlyphId = charset.indexOf(accentGlyphName);\n          if (baseGlyphId < 0 || accentGlyphId < 0) {\n            continue;\n          }\n          var accentOffset = {\n            x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4],\n            y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5]\n          };\n\n          var charCodes = getCharCodes(mapping, glyphId);\n          if (!charCodes) {\n            // There's no point in mapping it if the char code was never mapped\n            // to begin with.\n            continue;\n          }\n          for (var i = 0, ii = charCodes.length; i < ii; i++) {\n            var charCode = charCodes[i];\n            // Find a fontCharCode that maps to the base and accent glyphs.\n            // If one doesn't exists, create it.\n            var charCodeToGlyphId = newMapping.charCodeToGlyphId;\n            var baseFontCharCode = createCharCode(charCodeToGlyphId,\n                                                  baseGlyphId);\n            var accentFontCharCode = createCharCode(charCodeToGlyphId,\n                                                    accentGlyphId);\n            seacMap[charCode] = {\n              baseFontCharCode: baseFontCharCode,\n              accentFontCharCode: accentFontCharCode,\n              accentOffset: accentOffset\n            };\n          }\n        }\n        properties.seacMap = seacMap;\n      }\n\n      var unitsPerEm = 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0];\n\n      var builder = new OpenTypeFileBuilder('\\x4F\\x54\\x54\\x4F');\n      // PostScript Font Program\n      builder.addTable('CFF ', font.data);\n      // OS/2 and Windows Specific metrics\n      builder.addTable('OS/2', createOS2Table(properties,\n                                              newMapping.charCodeToGlyphId));\n      // Character to glyphs mapping\n      builder.addTable('cmap', createCmapTable(newMapping.charCodeToGlyphId));\n      // Font header\n      builder.addTable('head',\n            '\\x00\\x01\\x00\\x00' + // Version number\n            '\\x00\\x00\\x10\\x00' + // fontRevision\n            '\\x00\\x00\\x00\\x00' + // checksumAdjustement\n            '\\x5F\\x0F\\x3C\\xF5' + // magicNumber\n            '\\x00\\x00' + // Flags\n            safeString16(unitsPerEm) + // unitsPerEM\n            '\\x00\\x00\\x00\\x00\\x9e\\x0b\\x7e\\x27' + // creation date\n            '\\x00\\x00\\x00\\x00\\x9e\\x0b\\x7e\\x27' + // modifification date\n            '\\x00\\x00' + // xMin\n            safeString16(properties.descent) + // yMin\n            '\\x0F\\xFF' + // xMax\n            safeString16(properties.ascent) + // yMax\n            string16(properties.italicAngle ? 2 : 0) + // macStyle\n            '\\x00\\x11' + // lowestRecPPEM\n            '\\x00\\x00' + // fontDirectionHint\n            '\\x00\\x00' + // indexToLocFormat\n            '\\x00\\x00');  // glyphDataFormat\n\n      // Horizontal header\n      builder.addTable('hhea',\n            '\\x00\\x01\\x00\\x00' + // Version number\n            safeString16(properties.ascent) + // Typographic Ascent\n            safeString16(properties.descent) + // Typographic Descent\n            '\\x00\\x00' + // Line Gap\n            '\\xFF\\xFF' + // advanceWidthMax\n            '\\x00\\x00' + // minLeftSidebearing\n            '\\x00\\x00' + // minRightSidebearing\n            '\\x00\\x00' + // xMaxExtent\n            safeString16(properties.capHeight) + // caretSlopeRise\n            safeString16(Math.tan(properties.italicAngle) *\n                         properties.xHeight) + // caretSlopeRun\n            '\\x00\\x00' + // caretOffset\n            '\\x00\\x00' + // -reserved-\n            '\\x00\\x00' + // -reserved-\n            '\\x00\\x00' + // -reserved-\n            '\\x00\\x00' + // -reserved-\n            '\\x00\\x00' + // metricDataFormat\n            string16(numGlyphs)); // Number of HMetrics\n\n      // Horizontal metrics\n      builder.addTable('hmtx', (function fontFieldsHmtx() {\n          var charstrings = font.charstrings;\n          var cffWidths = font.cff ? font.cff.widths : null;\n          var hmtx = '\\x00\\x00\\x00\\x00'; // Fake .notdef\n          for (var i = 1, ii = numGlyphs; i < ii; i++) {\n            var width = 0;\n            if (charstrings) {\n              var charstring = charstrings[i - 1];\n              width = 'width' in charstring ? charstring.width : 0;\n            } else if (cffWidths) {\n              width = Math.ceil(cffWidths[i] || 0);\n            }\n            hmtx += string16(width) + string16(0);\n          }\n          return hmtx;\n        })());\n\n      // Maximum profile\n      builder.addTable('maxp',\n            '\\x00\\x00\\x50\\x00' + // Version number\n            string16(numGlyphs)); // Num of glyphs\n\n      // Naming tables\n      builder.addTable('name', createNameTable(fontName));\n\n      // PostScript informations\n      builder.addTable('post', createPostTable(properties));\n\n      return builder.toArray();\n    },\n\n    /**\n     * Builds a char code to unicode map based on section 9.10 of the spec.\n     * @param {Object} properties Font properties object.\n     * @return {Object} A ToUnicodeMap object.\n     */\n    buildToUnicode: function Font_buildToUnicode(properties) {\n      // Section 9.10.2 Mapping Character Codes to Unicode Values\n      if (properties.toUnicode && properties.toUnicode.length !== 0) {\n        return properties.toUnicode;\n      }\n      // According to the spec if the font is a simple font we should only map\n      // to unicode if the base encoding is MacRoman, MacExpert, or WinAnsi or\n      // the differences array only contains adobe standard or symbol set names,\n      // in pratice it seems better to always try to create a toUnicode\n      // map based of the default encoding.\n      var toUnicode, charcode;\n      if (!properties.composite /* is simple font */) {\n        toUnicode = [];\n        var encoding = properties.defaultEncoding.slice();\n        var baseEncodingName = properties.baseEncodingName;\n        // Merge in the differences array.\n        var differences = properties.differences;\n        for (charcode in differences) {\n          encoding[charcode] = differences[charcode];\n        }\n        for (charcode in encoding) {\n          // a) Map the character code to a character name.\n          var glyphName = encoding[charcode];\n          // b) Look up the character name in the Adobe Glyph List (see the\n          //    Bibliography) to obtain the corresponding Unicode value.\n          if (glyphName === '') {\n            continue;\n          } else if (GlyphsUnicode[glyphName] === undefined) {\n            // (undocumented) c) Few heuristics to recognize unknown glyphs\n            // NOTE: Adobe Reader does not do this step, but OSX Preview does\n            var code = 0;\n            switch (glyphName[0]) {\n              case 'G': // Gxx glyph\n                if (glyphName.length === 3) {\n                  code = parseInt(glyphName.substr(1), 16);\n                }\n                break;\n              case 'g': // g00xx glyph\n                if (glyphName.length === 5) {\n                  code = parseInt(glyphName.substr(1), 16);\n                }\n                break;\n              case 'C': // Cddd glyph\n              case 'c': // cddd glyph\n                if (glyphName.length >= 3) {\n                  code = +glyphName.substr(1);\n                }\n                break;\n            }\n            if (code) {\n              // If |baseEncodingName| is one the predefined encodings,\n              // and |code| equals |charcode|, using the glyph defined in the\n              // baseEncoding seems to yield a better |toUnicode| mapping\n              // (fixes issue 5070).\n              if (baseEncodingName && code === +charcode) {\n                var baseEncoding = Encodings[baseEncodingName];\n                if (baseEncoding && (glyphName = baseEncoding[charcode])) {\n                  toUnicode[charcode] =\n                    String.fromCharCode(GlyphsUnicode[glyphName]);\n                  continue;\n                }\n              }\n              toUnicode[charcode] = String.fromCharCode(code);\n            }\n            continue;\n          }\n          toUnicode[charcode] = String.fromCharCode(GlyphsUnicode[glyphName]);\n        }\n        return new ToUnicodeMap(toUnicode);\n      }\n      // If the font is a composite font that uses one of the predefined CMaps\n      // listed in Table 118 (except Identity–H and Identity–V) or whose\n      // descendant CIDFont uses the Adobe-GB1, Adobe-CNS1, Adobe-Japan1, or\n      // Adobe-Korea1 character collection:\n      if (properties.composite && (\n           (properties.cMap.builtInCMap &&\n            !(properties.cMap instanceof IdentityCMap)) ||\n           (properties.cidSystemInfo.registry === 'Adobe' &&\n             (properties.cidSystemInfo.ordering === 'GB1' ||\n              properties.cidSystemInfo.ordering === 'CNS1' ||\n              properties.cidSystemInfo.ordering === 'Japan1' ||\n              properties.cidSystemInfo.ordering === 'Korea1')))) {\n        // Then:\n        // a) Map the character code to a character identifier (CID) according\n        // to the font’s CMap.\n        // b) Obtain the registry and ordering of the character collection used\n        // by the font’s CMap (for example, Adobe and Japan1) from its\n        // CIDSystemInfo dictionary.\n        var registry = properties.cidSystemInfo.registry;\n        var ordering = properties.cidSystemInfo.ordering;\n        // c) Construct a second CMap name by concatenating the registry and\n        // ordering obtained in step (b) in the format registry–ordering–UCS2\n        // (for example, Adobe–Japan1–UCS2).\n        var ucs2CMapName = new Name(registry + '-' + ordering + '-UCS2');\n        // d) Obtain the CMap with the name constructed in step (c) (available\n        // from the ASN Web site; see the Bibliography).\n        var ucs2CMap = CMapFactory.create(ucs2CMapName,\n          { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null);\n        var cMap = properties.cMap;\n        toUnicode = [];\n        cMap.forEach(function(charcode, cid) {\n          assert(cid <= 0xffff, 'Max size of CID is 65,535');\n          // e) Map the CID obtained in step (a) according to the CMap obtained\n          // in step (d), producing a Unicode value.\n          var ucs2 = ucs2CMap.lookup(cid);\n          if (ucs2) {\n            toUnicode[charcode] =\n              String.fromCharCode((ucs2.charCodeAt(0) << 8) +\n                                  ucs2.charCodeAt(1));\n          }\n        });\n        return new ToUnicodeMap(toUnicode);\n      }\n\n      // The viewer's choice, just use an identity map.\n      return new IdentityToUnicodeMap(properties.firstChar,\n                                      properties.lastChar);\n    },\n\n    get spaceWidth() {\n      if ('_shadowWidth' in this) {\n        return this._shadowWidth;\n      }\n\n      // trying to estimate space character width\n      var possibleSpaceReplacements = ['space', 'minus', 'one', 'i'];\n      var width;\n      for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) {\n        var glyphName = possibleSpaceReplacements[i];\n        // if possible, getting width by glyph name\n        if (glyphName in this.widths) {\n          width = this.widths[glyphName];\n          break;\n        }\n        var glyphUnicode = GlyphsUnicode[glyphName];\n        // finding the charcode via unicodeToCID map\n        var charcode = 0;\n        if (this.composite) {\n          if (this.cMap.contains(glyphUnicode)) {\n            charcode = this.cMap.lookup(glyphUnicode);\n          }\n        }\n        // ... via toUnicode map\n        if (!charcode && 'toUnicode' in this) {\n          charcode = this.toUnicode.charCodeOf(glyphUnicode);\n        }\n        // setting it to unicode if negative or undefined\n        if (charcode <= 0) {\n          charcode = glyphUnicode;\n        }\n        // trying to get width via charcode\n        width = this.widths[charcode];\n        if (width) {\n          break; // the non-zero width found\n        }\n      }\n      width = width || this.defaultWidth;\n      // Do not shadow the property here. See discussion:\n      // https://github.com/mozilla/pdf.js/pull/2127#discussion_r1662280\n      this._shadowWidth = width;\n      return width;\n    },\n\n    charToGlyph: function Font_charToGlyph(charcode) {\n      var fontCharCode, width, operatorListId;\n\n      var widthCode = charcode;\n      if (this.cMap && this.cMap.contains(charcode)) {\n        widthCode = this.cMap.lookup(charcode);\n      }\n      width = this.widths[widthCode];\n      width = isNum(width) ? width : this.defaultWidth;\n      var vmetric = this.vmetrics && this.vmetrics[widthCode];\n\n      var unicode = this.toUnicode.get(charcode) || charcode;\n      if (typeof unicode === 'number') {\n        unicode = String.fromCharCode(unicode);\n      }\n\n      // First try the toFontChar map, if it's not there then try falling\n      // back to the char code.\n      fontCharCode = this.toFontChar[charcode] || charcode;\n      if (this.missingFile) {\n        fontCharCode = mapSpecialUnicodeValues(fontCharCode);\n      }\n\n      if (this.isType3Font) {\n        // Font char code in this case is actually a glyph name.\n        operatorListId = fontCharCode;\n      }\n\n      var accent = null;\n      if (this.seacMap && this.seacMap[charcode]) {\n        var seac = this.seacMap[charcode];\n        fontCharCode = seac.baseFontCharCode;\n        accent = {\n          fontChar: String.fromCharCode(seac.accentFontCharCode),\n          offset: seac.accentOffset\n        };\n      }\n\n      var fontChar = String.fromCharCode(fontCharCode);\n\n      var glyph = this.glyphCache[charcode];\n      if (!glyph ||\n          !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric,\n                                 operatorListId)) {\n        glyph = new Glyph(fontChar, unicode, accent, width, vmetric,\n                          operatorListId);\n        this.glyphCache[charcode] = glyph;\n      }\n      return glyph;\n    },\n\n    charsToGlyphs: function Font_charsToGlyphs(chars) {\n      var charsCache = this.charsCache;\n      var glyphs, glyph, charcode;\n\n      // if we translated this string before, just grab it from the cache\n      if (charsCache) {\n        glyphs = charsCache[chars];\n        if (glyphs) {\n          return glyphs;\n        }\n      }\n\n      // lazily create the translation cache\n      if (!charsCache) {\n        charsCache = this.charsCache = Object.create(null);\n      }\n\n      glyphs = [];\n      var charsCacheKey = chars;\n      var i = 0, ii;\n\n      if (this.cMap) {\n        // composite fonts have multi-byte strings convert the string from\n        // single-byte to multi-byte\n        var c = {};\n        while (i < chars.length) {\n          this.cMap.readCharCode(chars, i, c);\n          charcode = c.charcode;\n          var length = c.length;\n          i += length;\n          glyph = this.charToGlyph(charcode);\n          glyphs.push(glyph);\n          // placing null after each word break charcode (ASCII SPACE)\n          // Ignore occurences of 0x20 in multiple-byte codes.\n          if (length === 1 && chars.charCodeAt(i - 1) === 0x20) {\n            glyphs.push(null);\n          }\n        }\n      } else {\n        for (i = 0, ii = chars.length; i < ii; ++i) {\n          charcode = chars.charCodeAt(i);\n          glyph = this.charToGlyph(charcode);\n          glyphs.push(glyph);\n          if (charcode === 0x20) {\n            glyphs.push(null);\n          }\n        }\n      }\n\n      // Enter the translated string into the cache\n      return (charsCache[charsCacheKey] = glyphs);\n    }\n  };\n\n  return Font;\n})();\n\nvar ErrorFont = (function ErrorFontClosure() {\n  function ErrorFont(error) {\n    this.error = error;\n    this.loadedName = 'g_font_error';\n    this.loading = false;\n  }\n\n  ErrorFont.prototype = {\n    charsToGlyphs: function ErrorFont_charsToGlyphs() {\n      return [];\n    },\n    exportData: function ErrorFont_exportData() {\n      return {error: this.error};\n    }\n  };\n\n  return ErrorFont;\n})();\n\n/**\n * Shared logic for building a char code to glyph id mapping for Type1 and\n * simple CFF fonts. See section 9.6.6.2 of the spec.\n * @param {Object} properties Font properties object.\n * @param {Object} builtInEncoding The encoding contained within the actual font\n * data.\n * @param {Array} Array of glyph names where the index is the glyph ID.\n * @returns {Object} A char code to glyph ID map.\n */\nfunction type1FontGlyphMapping(properties, builtInEncoding, glyphNames) {\n  var charCodeToGlyphId = Object.create(null);\n  var glyphId, charCode, baseEncoding;\n\n  if (properties.baseEncodingName) {\n    // If a valid base encoding name was used, the mapping is initialized with\n    // that.\n    baseEncoding = Encodings[properties.baseEncodingName];\n    for (charCode = 0; charCode < baseEncoding.length; charCode++) {\n      glyphId = glyphNames.indexOf(baseEncoding[charCode]);\n      if (glyphId >= 0) {\n        charCodeToGlyphId[charCode] = glyphId;\n      } else {\n        charCodeToGlyphId[charCode] = 0; // notdef\n      }\n    }\n  } else if (!!(properties.flags & FontFlags.Symbolic)) {\n    // For a symbolic font the encoding should be the fonts built-in\n    // encoding.\n    for (charCode in builtInEncoding) {\n      charCodeToGlyphId[charCode] = builtInEncoding[charCode];\n    }\n  } else {\n    // For non-symbolic fonts that don't have a base encoding the standard\n    // encoding should be used.\n    baseEncoding = Encodings.StandardEncoding;\n    for (charCode = 0; charCode < baseEncoding.length; charCode++) {\n      glyphId = glyphNames.indexOf(baseEncoding[charCode]);\n      if (glyphId >= 0) {\n        charCodeToGlyphId[charCode] = glyphId;\n      } else {\n        charCodeToGlyphId[charCode] = 0; // notdef\n      }\n    }\n  }\n\n  // Lastly, merge in the differences.\n  var differences = properties.differences;\n  if (differences) {\n    for (charCode in differences) {\n      var glyphName = differences[charCode];\n      glyphId = glyphNames.indexOf(glyphName);\n      if (glyphId >= 0) {\n        charCodeToGlyphId[charCode] = glyphId;\n      } else {\n        charCodeToGlyphId[charCode] = 0; // notdef\n      }\n    }\n  }\n  return charCodeToGlyphId;\n}\n\n/*\n * CharStrings are encoded following the the CharString Encoding sequence\n * describe in Chapter 6 of the \"Adobe Type1 Font Format\" specification.\n * The value in a byte indicates a command, a number, or subsequent bytes\n * that are to be interpreted in a special way.\n *\n * CharString Number Encoding:\n *  A CharString byte containing the values from 32 through 255 inclusive\n *  indicate an integer. These values are decoded in four ranges.\n *\n * 1. A CharString byte containing a value, v, between 32 and 246 inclusive,\n * indicate the integer v - 139. Thus, the integer values from -107 through\n * 107 inclusive may be encoded in single byte.\n *\n * 2. A CharString byte containing a value, v, between 247 and 250 inclusive,\n * indicates an integer involving the next byte, w, according to the formula:\n * [(v - 247) x 256] + w + 108\n *\n * 3. A CharString byte containing a value, v, between 251 and 254 inclusive,\n * indicates an integer involving the next byte, w, according to the formula:\n * -[(v - 251) * 256] - w - 108\n *\n * 4. A CharString containing the value 255 indicates that the next 4 bytes\n * are a two complement signed integer. The first of these bytes contains the\n * highest order bits, the second byte contains the next higher order bits\n * and the fourth byte contain the lowest order bits.\n *\n *\n * CharString Command Encoding:\n *  CharStrings commands are encoded in 1 or 2 bytes.\n *\n *  Single byte commands are encoded in 1 byte that contains a value between\n *  0 and 31 inclusive.\n *  If a command byte contains the value 12, then the value in the next byte\n *  indicates a command. This \"escape\" mechanism allows many extra commands\n * to be encoded and this encoding technique helps to minimize the length of\n * the charStrings.\n */\nvar Type1CharString = (function Type1CharStringClosure() {\n  var COMMAND_MAP = {\n    'hstem': [1],\n    'vstem': [3],\n    'vmoveto': [4],\n    'rlineto': [5],\n    'hlineto': [6],\n    'vlineto': [7],\n    'rrcurveto': [8],\n    'callsubr': [10],\n    'flex': [12, 35],\n    'drop' : [12, 18],\n    'endchar': [14],\n    'rmoveto': [21],\n    'hmoveto': [22],\n    'vhcurveto': [30],\n    'hvcurveto': [31]\n  };\n\n  function Type1CharString() {\n    this.width = 0;\n    this.lsb = 0;\n    this.flexing = false;\n    this.output = [];\n    this.stack = [];\n  }\n\n  Type1CharString.prototype = {\n    convert: function Type1CharString_convert(encoded, subrs) {\n      var count = encoded.length;\n      var error = false;\n      var wx, sbx, subrNumber;\n      for (var i = 0; i < count; i++) {\n        var value = encoded[i];\n        if (value < 32) {\n          if (value === 12) {\n            value = (value << 8) + encoded[++i];\n          }\n          switch (value) {\n            case 1: // hstem\n              if (!HINTING_ENABLED) {\n                this.stack = [];\n                break;\n              }\n              error = this.executeCommand(2, COMMAND_MAP.hstem);\n              break;\n            case 3: // vstem\n              if (!HINTING_ENABLED) {\n                this.stack = [];\n                break;\n              }\n              error = this.executeCommand(2, COMMAND_MAP.vstem);\n              break;\n            case 4: // vmoveto\n              if (this.flexing) {\n                if (this.stack.length < 1) {\n                  error = true;\n                  break;\n                }\n                // Add the dx for flex and but also swap the values so they are\n                // the right order.\n                var dy = this.stack.pop();\n                this.stack.push(0, dy);\n                break;\n              }\n              error = this.executeCommand(1, COMMAND_MAP.vmoveto);\n              break;\n            case 5: // rlineto\n              error = this.executeCommand(2, COMMAND_MAP.rlineto);\n              break;\n            case 6: // hlineto\n              error = this.executeCommand(1, COMMAND_MAP.hlineto);\n              break;\n            case 7: // vlineto\n              error = this.executeCommand(1, COMMAND_MAP.vlineto);\n              break;\n            case 8: // rrcurveto\n              error = this.executeCommand(6, COMMAND_MAP.rrcurveto);\n              break;\n            case 9: // closepath\n              // closepath is a Type1 command that does not take argument and is\n              // useless in Type2 and it can simply be ignored.\n              this.stack = [];\n              break;\n            case 10: // callsubr\n              if (this.stack.length < 1) {\n                error = true;\n                break;\n              }\n              subrNumber = this.stack.pop();\n              error = this.convert(subrs[subrNumber], subrs);\n              break;\n            case 11: // return\n              return error;\n            case 13: // hsbw\n              if (this.stack.length < 2) {\n                error = true;\n                break;\n              }\n              // To convert to type2 we have to move the width value to the\n              // first part of the charstring and then use hmoveto with lsb.\n              wx = this.stack.pop();\n              sbx = this.stack.pop();\n              this.lsb = sbx;\n              this.width = wx;\n              this.stack.push(wx, sbx);\n              error = this.executeCommand(2, COMMAND_MAP.hmoveto);\n              break;\n            case 14: // endchar\n              this.output.push(COMMAND_MAP.endchar[0]);\n              break;\n            case 21: // rmoveto\n              if (this.flexing) {\n                break;\n              }\n              error = this.executeCommand(2, COMMAND_MAP.rmoveto);\n              break;\n            case 22: // hmoveto\n              if (this.flexing) {\n                // Add the dy for flex.\n                this.stack.push(0);\n                break;\n              }\n              error = this.executeCommand(1, COMMAND_MAP.hmoveto);\n              break;\n            case 30: // vhcurveto\n              error = this.executeCommand(4, COMMAND_MAP.vhcurveto);\n              break;\n            case 31: // hvcurveto\n              error = this.executeCommand(4, COMMAND_MAP.hvcurveto);\n              break;\n            case (12 << 8) + 0: // dotsection\n              // dotsection is a Type1 command to specify some hinting feature\n              // for dots that do not take a parameter and it can safely be\n              // ignored for Type2.\n              this.stack = [];\n              break;\n            case (12 << 8) + 1: // vstem3\n              if (!HINTING_ENABLED) {\n                this.stack = [];\n                break;\n              }\n              // [vh]stem3 are Type1 only and Type2 supports [vh]stem with\n              // multiple parameters, so instead of returning [vh]stem3 take a\n              // shortcut and return [vhstem] instead.\n              error = this.executeCommand(2, COMMAND_MAP.vstem);\n              break;\n            case (12 << 8) + 2: // hstem3\n              if (!HINTING_ENABLED) {\n                 this.stack = [];\n                break;\n              }\n              // See vstem3.\n              error = this.executeCommand(2, COMMAND_MAP.hstem);\n              break;\n            case (12 << 8) + 6: // seac\n              // seac is like type 2's special endchar but it doesn't use the\n              // first argument asb, so remove it.\n              if (SEAC_ANALYSIS_ENABLED) {\n                this.seac = this.stack.splice(-4, 4);\n                error = this.executeCommand(0, COMMAND_MAP.endchar);\n              } else {\n                error = this.executeCommand(4, COMMAND_MAP.endchar);\n              }\n              break;\n            case (12 << 8) + 7: // sbw\n              if (this.stack.length < 4) {\n                error = true;\n                break;\n              }\n              // To convert to type2 we have to move the width value to the\n              // first part of the charstring and then use rmoveto with\n              // (dx, dy). The height argument will not be used for vmtx and\n              // vhea tables reconstruction -- ignoring it.\n              var wy = this.stack.pop();\n              wx = this.stack.pop();\n              var sby = this.stack.pop();\n              sbx = this.stack.pop();\n              this.lsb = sbx;\n              this.width = wx;\n              this.stack.push(wx, sbx, sby);\n              error = this.executeCommand(3, COMMAND_MAP.rmoveto);\n              break;\n            case (12 << 8) + 12: // div\n              if (this.stack.length < 2) {\n                error = true;\n                break;\n              }\n              var num2 = this.stack.pop();\n              var num1 = this.stack.pop();\n              this.stack.push(num1 / num2);\n              break;\n            case (12 << 8) + 16: // callothersubr\n              if (this.stack.length < 2) {\n                error = true;\n                break;\n              }\n              subrNumber = this.stack.pop();\n              var numArgs = this.stack.pop();\n              if (subrNumber === 0 && numArgs === 3) {\n                var flexArgs = this.stack.splice(this.stack.length - 17, 17);\n                this.stack.push(\n                  flexArgs[2] + flexArgs[0], // bcp1x + rpx\n                  flexArgs[3] + flexArgs[1], // bcp1y + rpy\n                  flexArgs[4], // bcp2x\n                  flexArgs[5], // bcp2y\n                  flexArgs[6], // p2x\n                  flexArgs[7], // p2y\n                  flexArgs[8], // bcp3x\n                  flexArgs[9], // bcp3y\n                  flexArgs[10], // bcp4x\n                  flexArgs[11], // bcp4y\n                  flexArgs[12], // p3x\n                  flexArgs[13], // p3y\n                  flexArgs[14] // flexDepth\n                  // 15 = finalx unused by flex\n                  // 16 = finaly unused by flex\n                );\n                error = this.executeCommand(13, COMMAND_MAP.flex, true);\n                this.flexing = false;\n                this.stack.push(flexArgs[15], flexArgs[16]);\n              } else if (subrNumber === 1 && numArgs === 0) {\n                this.flexing = true;\n              }\n              break;\n            case (12 << 8) + 17: // pop\n              // Ignore this since it is only used with othersubr.\n              break;\n            case (12 << 8) + 33: // setcurrentpoint\n              // Ignore for now.\n              this.stack = [];\n              break;\n            default:\n              warn('Unknown type 1 charstring command of \"' + value + '\"');\n              break;\n          }\n          if (error) {\n            break;\n          }\n          continue;\n        } else if (value <= 246) {\n          value = value - 139;\n        } else if (value <= 250) {\n          value = ((value - 247) * 256) + encoded[++i] + 108;\n        } else if (value <= 254) {\n          value = -((value - 251) * 256) - encoded[++i] - 108;\n        } else {\n          value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 |\n                  (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0;\n        }\n        this.stack.push(value);\n      }\n      return error;\n    },\n\n    executeCommand: function(howManyArgs, command, keepStack) {\n      var stackLength = this.stack.length;\n      if (howManyArgs > stackLength) {\n        return true;\n      }\n      var start = stackLength - howManyArgs;\n      for (var i = start; i < stackLength; i++) {\n        var value = this.stack[i];\n        if (value === (value | 0)) { // int\n          this.output.push(28, (value >> 8) & 0xff, value & 0xff);\n        } else { // fixed point\n          value = (65536 * value) | 0;\n          this.output.push(255,\n                           (value >> 24) & 0xFF,\n                           (value >> 16) & 0xFF,\n                           (value >> 8) & 0xFF,\n                           value & 0xFF);\n        }\n      }\n      this.output.push.apply(this.output, command);\n      if (keepStack) {\n        this.stack.splice(start, howManyArgs);\n      } else {\n        this.stack.length = 0;\n      }\n      return false;\n    }\n  };\n\n  return Type1CharString;\n})();\n\n/*\n * Type1Parser encapsulate the needed code for parsing a Type1 font\n * program. Some of its logic depends on the Type2 charstrings\n * structure.\n * Note: this doesn't really parse the font since that would require evaluation\n * of PostScript, but it is possible in most cases to extract what we need\n * without a full parse.\n */\nvar Type1Parser = (function Type1ParserClosure() {\n  /*\n   * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence\n   * of Plaintext Bytes. The function took a key as a parameter which can be\n   * for decrypting the eexec block of for decoding charStrings.\n   */\n  var EEXEC_ENCRYPT_KEY = 55665;\n  var CHAR_STRS_ENCRYPT_KEY = 4330;\n\n  function isHexDigit(code) {\n    return code >= 48 && code <= 57 || // '0'-'9'\n           code >= 65 && code <= 70 || // 'A'-'F'\n           code >= 97 && code <= 102;  // 'a'-'f'\n  }\n\n  function decrypt(data, key, discardNumber) {\n    var r = key | 0, c1 = 52845, c2 = 22719;\n    var count = data.length;\n    var decrypted = new Uint8Array(count);\n    for (var i = 0; i < count; i++) {\n      var value = data[i];\n      decrypted[i] = value ^ (r >> 8);\n      r = ((value + r) * c1 + c2) & ((1 << 16) - 1);\n    }\n    return Array.prototype.slice.call(decrypted, discardNumber);\n  }\n\n  function decryptAscii(data, key, discardNumber) {\n    var r = key | 0, c1 = 52845, c2 = 22719;\n    var count = data.length, maybeLength = count >>> 1;\n    var decrypted = new Uint8Array(maybeLength);\n    var i, j;\n    for (i = 0, j = 0; i < count; i++) {\n      var digit1 = data[i];\n      if (!isHexDigit(digit1)) {\n        continue;\n      }\n      i++;\n      var digit2;\n      while (i < count && !isHexDigit(digit2 = data[i])) {\n        i++;\n      }\n      if (i < count) {\n        var value = parseInt(String.fromCharCode(digit1, digit2), 16);\n        decrypted[j++] = value ^ (r >> 8);\n        r = ((value + r) * c1 + c2) & ((1 << 16) - 1);\n      }\n    }\n    return Array.prototype.slice.call(decrypted, discardNumber, j);\n  }\n\n  function isSpecial(c) {\n    return c === 0x2F || // '/'\n           c === 0x5B || c === 0x5D || // '[', ']'\n           c === 0x7B || c === 0x7D || // '{', '}'\n           c === 0x28 || c === 0x29; // '(', ')'\n  }\n\n  function Type1Parser(stream, encrypted) {\n    if (encrypted) {\n      var data = stream.getBytes();\n      var isBinary = !(isHexDigit(data[0]) && isHexDigit(data[1]) &&\n                       isHexDigit(data[2]) && isHexDigit(data[3]));\n      stream = new Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) :\n                          decryptAscii(data, EEXEC_ENCRYPT_KEY, 4));\n    }\n    this.stream = stream;\n    this.nextChar();\n  }\n\n  Type1Parser.prototype = {\n    readNumberArray: function Type1Parser_readNumberArray() {\n      this.getToken(); // read '[' or '{' (arrays can start with either)\n      var array = [];\n      while (true) {\n        var token = this.getToken();\n        if (token === null || token === ']' || token === '}') {\n          break;\n        }\n        array.push(parseFloat(token || 0));\n      }\n      return array;\n    },\n\n    readNumber: function Type1Parser_readNumber() {\n      var token = this.getToken();\n      return parseFloat(token || 0);\n    },\n\n    readInt: function Type1Parser_readInt() {\n      // Use '| 0' to prevent setting a double into length such as the double\n      // does not flow into the loop variable.\n      var token = this.getToken();\n      return parseInt(token || 0, 10) | 0;\n    },\n\n    readBoolean: function Type1Parser_readBoolean() {\n      var token = this.getToken();\n\n      // Use 1 and 0 since that's what type2 charstrings use.\n      return token === 'true' ? 1 : 0;\n    },\n\n    nextChar : function Type1_nextChar() {\n      return (this.currentChar = this.stream.getByte());\n    },\n\n    getToken: function Type1Parser_getToken() {\n      // Eat whitespace and comments.\n      var comment = false;\n      var ch = this.currentChar;\n      while (true) {\n        if (ch === -1) {\n          return null;\n        }\n\n        if (comment) {\n          if (ch === 0x0A || ch === 0x0D) {\n            comment = false;\n          }\n        } else if (ch === 0x25) { // '%'\n          comment = true;\n        } else if (!Lexer.isSpace(ch)) {\n          break;\n        }\n        ch = this.nextChar();\n      }\n      if (isSpecial(ch)) {\n        this.nextChar();\n        return String.fromCharCode(ch);\n      }\n      var token = '';\n      do {\n        token += String.fromCharCode(ch);\n        ch = this.nextChar();\n      } while (ch >= 0 && !Lexer.isSpace(ch) && !isSpecial(ch));\n      return token;\n    },\n\n    /*\n     * Returns an object containing a Subrs array and a CharStrings\n     * array extracted from and eexec encrypted block of data\n     */\n    extractFontProgram: function Type1Parser_extractFontProgram() {\n      var stream = this.stream;\n\n      var subrs = [], charstrings = [];\n      var program = {\n        subrs: [],\n        charstrings: [],\n        properties: {\n          'privateData': {\n            'lenIV': 4\n          }\n        }\n      };\n      var token, length, data, lenIV, encoded;\n      while ((token = this.getToken()) !== null) {\n        if (token !== '/') {\n          continue;\n        }\n        token = this.getToken();\n        switch (token) {\n          case 'CharStrings':\n            // The number immediately following CharStrings must be greater or\n            // equal to the number of CharStrings.\n            this.getToken();\n            this.getToken(); // read in 'dict'\n            this.getToken(); // read in 'dup'\n            this.getToken(); // read in 'begin'\n            while(true) {\n              token = this.getToken();\n              if (token === null || token === 'end') {\n                break;\n              }\n\n              if (token !== '/') {\n                continue;\n              }\n              var glyph = this.getToken();\n              length = this.readInt();\n              this.getToken(); // read in 'RD' or '-|'\n              data = stream.makeSubStream(stream.pos, length);\n              lenIV = program.properties.privateData['lenIV'];\n              encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV);\n              // Skip past the required space and binary data.\n              stream.skip(length);\n              this.nextChar();\n              token = this.getToken(); // read in 'ND' or '|-'\n              if (token === 'noaccess') {\n                this.getToken(); // read in 'def'\n              }\n              charstrings.push({\n                glyph: glyph,\n                encoded: encoded\n              });\n            }\n            break;\n          case 'Subrs':\n            var num = this.readInt();\n            this.getToken(); // read in 'array'\n            while ((token = this.getToken()) === 'dup') {\n              var index = this.readInt();\n              length = this.readInt();\n              this.getToken(); // read in 'RD' or '-|'\n              data = stream.makeSubStream(stream.pos, length);\n              lenIV = program.properties.privateData['lenIV'];\n              encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV);\n              // Skip past the required space and binary data.\n              stream.skip(length);\n              this.nextChar();\n              token = this.getToken(); // read in 'NP' or '|'\n              if (token === 'noaccess') {\n                this.getToken(); // read in 'put'\n              }\n              subrs[index] = encoded;\n            }\n            break;\n          case 'BlueValues':\n          case 'OtherBlues':\n          case 'FamilyBlues':\n          case 'FamilyOtherBlues':\n            var blueArray = this.readNumberArray();\n            // *Blue* values may contain invalid data: disables reading of\n            // those values when hinting is disabled.\n            if (blueArray.length > 0 && (blueArray.length % 2) === 0 &&\n                HINTING_ENABLED) {\n              program.properties.privateData[token] = blueArray;\n            }\n            break;\n          case 'StemSnapH':\n          case 'StemSnapV':\n            program.properties.privateData[token] = this.readNumberArray();\n            break;\n          case 'StdHW':\n          case 'StdVW':\n            program.properties.privateData[token] =\n              this.readNumberArray()[0];\n            break;\n          case 'BlueShift':\n          case 'lenIV':\n          case 'BlueFuzz':\n          case 'BlueScale':\n          case 'LanguageGroup':\n          case 'ExpansionFactor':\n            program.properties.privateData[token] = this.readNumber();\n            break;\n          case 'ForceBold':\n            program.properties.privateData[token] = this.readBoolean();\n            break;\n        }\n      }\n\n      for (var i = 0; i < charstrings.length; i++) {\n        glyph = charstrings[i].glyph;\n        encoded = charstrings[i].encoded;\n        var charString = new Type1CharString();\n        var error = charString.convert(encoded, subrs);\n        var output = charString.output;\n        if (error) {\n          // It seems when FreeType encounters an error while evaluating a glyph\n          // that it completely ignores the glyph so we'll mimic that behaviour\n          // here and put an endchar to make the validator happy.\n          output = [14];\n        }\n        program.charstrings.push({\n          glyphName: glyph,\n          charstring: output,\n          width: charString.width,\n          lsb: charString.lsb,\n          seac: charString.seac\n        });\n      }\n\n      return program;\n    },\n\n    extractFontHeader: function Type1Parser_extractFontHeader(properties) {\n      var token;\n      while ((token = this.getToken()) !== null) {\n        if (token !== '/') {\n          continue;\n        }\n        token = this.getToken();\n        switch (token) {\n          case 'FontMatrix':\n            var matrix = this.readNumberArray();\n            properties.fontMatrix = matrix;\n            break;\n          case 'Encoding':\n            var encodingArg = this.getToken();\n            var encoding;\n            if (!/^\\d+$/.test(encodingArg)) {\n              // encoding name is specified\n              encoding = Encodings[encodingArg];\n            } else {\n              encoding = [];\n              var size = parseInt(encodingArg, 10) | 0;\n              this.getToken(); // read in 'array'\n\n              for (var j = 0; j < size; j++) {\n                token = this.getToken();\n                // skipping till first dup or def (e.g. ignoring for statement)\n                while (token !== 'dup' && token !== 'def') {\n                  token = this.getToken();\n                  if (token === null) {\n                    return; // invalid header\n                  }\n                }\n                if (token === 'def') {\n                  break; // read all array data\n                }\n                var index = this.readInt();\n                this.getToken(); // read in '/'\n                var glyph = this.getToken();\n                encoding[index] = glyph;\n                this.getToken(); // read the in 'put'\n              }\n            }\n            properties.builtInEncoding = encoding;\n            break;\n          case 'FontBBox':\n            var fontBBox = this.readNumberArray();\n            // adjusting ascent/descent\n            properties.ascent = fontBBox[3];\n            properties.descent = fontBBox[1];\n            properties.ascentScaled = true;\n            break;\n        }\n      }\n    }\n  };\n\n  return Type1Parser;\n})();\n\n/**\n * The CFF class takes a Type1 file and wrap it into a\n * 'Compact Font Format' which itself embed Type2 charstrings.\n */\nvar CFFStandardStrings = [\n  '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',\n  'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',\n  'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',\n  'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',\n  'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',\n  'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',\n  'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum',\n  'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',\n  'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',\n  'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',\n  'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',\n  'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',\n  'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',\n  'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase',\n  'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown',\n  'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent',\n  'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash',\n  'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae',\n  'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior',\n  'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn',\n  'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters',\n  'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior',\n  'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring',\n  'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave',\n  'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute',\n  'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute',\n  'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron',\n  'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde',\n  'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute',\n  'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex',\n  'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex',\n  'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall',\n  'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall',\n  'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',\n  'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle',\n  'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle',\n  'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior',\n  'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior',\n  'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior',\n  'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',\n  'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior',\n  'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall',\n  'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',\n  'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',\n  'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',\n  'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',\n  'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',\n  'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall',\n  'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior',\n  'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth',\n  'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds',\n  'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',\n  'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior',\n  'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior',\n  'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior',\n  'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior',\n  'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall',\n  'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall',\n  'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall',\n  'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall',\n  'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall',\n  'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall',\n  'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall',\n  'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003',\n  'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'\n];\n\n// Type1Font is also a CIDFontType0.\nvar Type1Font = function Type1Font(name, file, properties) {\n  // Some bad generators embed pfb file as is, we have to strip 6-byte headers.\n  // Also, length1 and length2 might be off by 6 bytes as well.\n  // http://www.math.ubc.ca/~cass/piscript/type1.pdf\n  var PFB_HEADER_SIZE = 6;\n  var headerBlockLength = properties.length1;\n  var eexecBlockLength = properties.length2;\n  var pfbHeader = file.peekBytes(PFB_HEADER_SIZE);\n  var pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01;\n  if (pfbHeaderPresent) {\n    file.skip(PFB_HEADER_SIZE);\n    headerBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) |\n                        (pfbHeader[3] << 8) | pfbHeader[2];\n  }\n\n  // Get the data block containing glyphs and subrs informations\n  var headerBlock = new Stream(file.getBytes(headerBlockLength));\n  var headerBlockParser = new Type1Parser(headerBlock);\n  headerBlockParser.extractFontHeader(properties);\n\n  if (pfbHeaderPresent) {\n    pfbHeader = file.getBytes(PFB_HEADER_SIZE);\n    eexecBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) |\n                       (pfbHeader[3] << 8) | pfbHeader[2];\n  }\n\n  // Decrypt the data blocks and retrieve it's content\n  var eexecBlock = new Stream(file.getBytes(eexecBlockLength));\n  var eexecBlockParser = new Type1Parser(eexecBlock, true);\n  var data = eexecBlockParser.extractFontProgram();\n  for (var info in data.properties) {\n    properties[info] = data.properties[info];\n  }\n\n  var charstrings = data.charstrings;\n  var type2Charstrings = this.getType2Charstrings(charstrings);\n  var subrs = this.getType2Subrs(data.subrs);\n\n  this.charstrings = charstrings;\n  this.data = this.wrap(name, type2Charstrings, this.charstrings,\n                        subrs, properties);\n  this.seacs = this.getSeacs(data.charstrings);\n};\n\nType1Font.prototype = {\n  get numGlyphs() {\n    return this.charstrings.length + 1;\n  },\n\n  getCharset: function Type1Font_getCharset() {\n    var charset = ['.notdef'];\n    var charstrings = this.charstrings;\n    for (var glyphId = 0; glyphId < charstrings.length; glyphId++) {\n      charset.push(charstrings[glyphId].glyphName);\n    }\n    return charset;\n  },\n\n  getGlyphMapping: function Type1Font_getGlyphMapping(properties) {\n    var charstrings = this.charstrings;\n    var glyphNames = ['.notdef'], glyphId;\n    for (glyphId = 0; glyphId < charstrings.length; glyphId++) {\n      glyphNames.push(charstrings[glyphId].glyphName);\n    }\n    var encoding = properties.builtInEncoding;\n    if (encoding) {\n      var builtInEncoding = {};\n      for (var charCode in encoding) {\n        glyphId = glyphNames.indexOf(encoding[charCode]);\n        if (glyphId >= 0) {\n          builtInEncoding[charCode] = glyphId;\n        }\n      }\n    }\n\n    return type1FontGlyphMapping(properties, builtInEncoding, glyphNames);\n  },\n\n  getSeacs: function Type1Font_getSeacs(charstrings) {\n    var i, ii;\n    var seacMap = [];\n    for (i = 0, ii = charstrings.length; i < ii; i++) {\n      var charstring = charstrings[i];\n      if (charstring.seac) {\n        // Offset by 1 for .notdef\n        seacMap[i + 1] = charstring.seac;\n      }\n    }\n    return seacMap;\n  },\n\n  getType2Charstrings: function Type1Font_getType2Charstrings(\n                                  type1Charstrings) {\n    var type2Charstrings = [];\n    for (var i = 0, ii = type1Charstrings.length; i < ii; i++) {\n      type2Charstrings.push(type1Charstrings[i].charstring);\n    }\n    return type2Charstrings;\n  },\n\n  getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) {\n    var bias = 0;\n    var count = type1Subrs.length;\n    if (count < 1133) {\n      bias = 107;\n    } else if (count < 33769) {\n      bias = 1131;\n    } else {\n      bias = 32768;\n    }\n\n    // Add a bunch of empty subrs to deal with the Type2 bias\n    var type2Subrs = [];\n    var i;\n    for (i = 0; i < bias; i++) {\n      type2Subrs.push([0x0B]);\n    }\n\n    for (i = 0; i < count; i++) {\n      type2Subrs.push(type1Subrs[i]);\n    }\n\n    return type2Subrs;\n  },\n\n  wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) {\n    var cff = new CFF();\n    cff.header = new CFFHeader(1, 0, 4, 4);\n\n    cff.names = [name];\n\n    var topDict = new CFFTopDict();\n    // CFF strings IDs 0...390 are predefined names, so refering\n    // to entries in our own String INDEX starts at SID 391.\n    topDict.setByName('version', 391);\n    topDict.setByName('Notice', 392);\n    topDict.setByName('FullName', 393);\n    topDict.setByName('FamilyName', 394);\n    topDict.setByName('Weight', 395);\n    topDict.setByName('Encoding', null); // placeholder\n    topDict.setByName('FontMatrix', properties.fontMatrix);\n    topDict.setByName('FontBBox', properties.bbox);\n    topDict.setByName('charset', null); // placeholder\n    topDict.setByName('CharStrings', null); // placeholder\n    topDict.setByName('Private', null); // placeholder\n    cff.topDict = topDict;\n\n    var strings = new CFFStrings();\n    strings.add('Version 0.11'); // Version\n    strings.add('See original notice'); // Notice\n    strings.add(name); // FullName\n    strings.add(name); // FamilyName\n    strings.add('Medium'); // Weight\n    cff.strings = strings;\n\n    cff.globalSubrIndex = new CFFIndex();\n\n    var count = glyphs.length;\n    var charsetArray = [0];\n    var i, ii;\n    for (i = 0; i < count; i++) {\n      var index = CFFStandardStrings.indexOf(charstrings[i].glyphName);\n      // TODO: Insert the string and correctly map it.  Previously it was\n      // thought mapping names that aren't in the standard strings to .notdef\n      // was fine, however in issue818 when mapping them all to .notdef the\n      // adieresis glyph no longer worked.\n      if (index === -1) {\n        index = 0;\n      }\n      charsetArray.push((index >> 8) & 0xff, index & 0xff);\n    }\n    cff.charset = new CFFCharset(false, 0, [], charsetArray);\n\n    var charStringsIndex = new CFFIndex();\n    charStringsIndex.add([0x8B, 0x0E]); // .notdef\n    for (i = 0; i < count; i++) {\n      charStringsIndex.add(glyphs[i]);\n    }\n    cff.charStrings = charStringsIndex;\n\n    var privateDict = new CFFPrivateDict();\n    privateDict.setByName('Subrs', null); // placeholder\n    var fields = [\n      'BlueValues',\n      'OtherBlues',\n      'FamilyBlues',\n      'FamilyOtherBlues',\n      'StemSnapH',\n      'StemSnapV',\n      'BlueShift',\n      'BlueFuzz',\n      'BlueScale',\n      'LanguageGroup',\n      'ExpansionFactor',\n      'ForceBold',\n      'StdHW',\n      'StdVW'\n    ];\n    for (i = 0, ii = fields.length; i < ii; i++) {\n      var field = fields[i];\n      if (!properties.privateData.hasOwnProperty(field)) {\n        continue;\n      }\n      var value = properties.privateData[field];\n      if (isArray(value)) {\n        // All of the private dictionary array data in CFF must be stored as\n        // \"delta-encoded\" numbers.\n        for (var j = value.length - 1; j > 0; j--) {\n          value[j] -= value[j - 1]; // ... difference from previous value\n        }\n      }\n      privateDict.setByName(field, value);\n    }\n    cff.topDict.privateDict = privateDict;\n\n    var subrIndex = new CFFIndex();\n    for (i = 0, ii = subrs.length; i < ii; i++) {\n      subrIndex.add(subrs[i]);\n    }\n    privateDict.subrsIndex = subrIndex;\n\n    var compiler = new CFFCompiler(cff);\n    return compiler.compile();\n  }\n};\n\nvar CFFFont = (function CFFFontClosure() {\n  function CFFFont(file, properties) {\n    this.properties = properties;\n\n    var parser = new CFFParser(file, properties);\n    this.cff = parser.parse();\n    var compiler = new CFFCompiler(this.cff);\n    this.seacs = this.cff.seacs;\n    try {\n      this.data = compiler.compile();\n    } catch (e) {\n      warn('Failed to compile font ' + properties.loadedName);\n      // There may have just been an issue with the compiler, set the data\n      // anyway and hope the font loaded.\n      this.data = file;\n    }\n  }\n\n  CFFFont.prototype = {\n    get numGlyphs() {\n      return this.cff.charStrings.count;\n    },\n    getCharset: function CFFFont_getCharset() {\n      return this.cff.charset.charset;\n    },\n    getGlyphMapping: function CFFFont_getGlyphMapping() {\n      var cff = this.cff;\n      var properties = this.properties;\n      var charsets = cff.charset.charset;\n      var charCodeToGlyphId;\n      var glyphId;\n\n      if (properties.composite) {\n        charCodeToGlyphId = Object.create(null);\n        if (cff.isCIDFont) {\n          // If the font is actually a CID font then we should use the charset\n          // to map CIDs to GIDs.\n          for (glyphId = 0; glyphId < charsets.length; glyphId++) {\n            var cid = charsets[glyphId];\n            var charCode = properties.cMap.charCodeOf(cid);\n            charCodeToGlyphId[charCode] = glyphId;\n          }\n        } else {\n          // If it is NOT actually a CID font then CIDs should be mapped\n          // directly to GIDs.\n          for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) {\n            charCodeToGlyphId[glyphId] = glyphId;\n          }\n        }\n        return charCodeToGlyphId;\n      }\n\n      var encoding = cff.encoding ? cff.encoding.encoding : null;\n      charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets);\n      return charCodeToGlyphId;\n    }\n  };\n\n  return CFFFont;\n})();\n\nvar CFFParser = (function CFFParserClosure() {\n  var CharstringValidationData = [\n    null,\n    { id: 'hstem', min: 2, stackClearing: true, stem: true },\n    null,\n    { id: 'vstem', min: 2, stackClearing: true, stem: true },\n    { id: 'vmoveto', min: 1, stackClearing: true },\n    { id: 'rlineto', min: 2, resetStack: true },\n    { id: 'hlineto', min: 1, resetStack: true },\n    { id: 'vlineto', min: 1, resetStack: true },\n    { id: 'rrcurveto', min: 6, resetStack: true },\n    null,\n    { id: 'callsubr', min: 1, undefStack: true },\n    { id: 'return', min: 0, undefStack: true },\n    null, // 12\n    null,\n    { id: 'endchar', min: 0, stackClearing: true },\n    null,\n    null,\n    null,\n    { id: 'hstemhm', min: 2, stackClearing: true, stem: true },\n    { id: 'hintmask', min: 0, stackClearing: true },\n    { id: 'cntrmask', min: 0, stackClearing: true },\n    { id: 'rmoveto', min: 2, stackClearing: true },\n    { id: 'hmoveto', min: 1, stackClearing: true },\n    { id: 'vstemhm', min: 2, stackClearing: true, stem: true },\n    { id: 'rcurveline', min: 8, resetStack: true },\n    { id: 'rlinecurve', min: 8, resetStack: true },\n    { id: 'vvcurveto', min: 4, resetStack: true },\n    { id: 'hhcurveto', min: 4, resetStack: true },\n    null, // shortint\n    { id: 'callgsubr', min: 1, undefStack: true },\n    { id: 'vhcurveto', min: 4, resetStack: true },\n    { id: 'hvcurveto', min: 4, resetStack: true }\n  ];\n  var CharstringValidationData12 = [\n    null,\n    null,\n    null,\n    { id: 'and', min: 2, stackDelta: -1 },\n    { id: 'or', min: 2, stackDelta: -1 },\n    { id: 'not', min: 1, stackDelta: 0 },\n    null,\n    null,\n    null,\n    { id: 'abs', min: 1, stackDelta: 0 },\n    { id: 'add', min: 2, stackDelta: -1,\n      stackFn: function stack_div(stack, index) {\n        stack[index - 2] = stack[index - 2] + stack[index - 1];\n      }\n    },\n    { id: 'sub', min: 2, stackDelta: -1,\n      stackFn: function stack_div(stack, index) {\n        stack[index - 2] = stack[index - 2] - stack[index - 1];\n      }\n    },\n    { id: 'div', min: 2, stackDelta: -1,\n      stackFn: function stack_div(stack, index) {\n        stack[index - 2] = stack[index - 2] / stack[index - 1];\n      }\n    },\n    null,\n    { id: 'neg', min: 1, stackDelta: 0,\n      stackFn: function stack_div(stack, index) {\n        stack[index - 1] = -stack[index - 1];\n      }\n    },\n    { id: 'eq', min: 2, stackDelta: -1 },\n    null,\n    null,\n    { id: 'drop', min: 1, stackDelta: -1 },\n    null,\n    { id: 'put', min: 2, stackDelta: -2 },\n    { id: 'get', min: 1, stackDelta: 0 },\n    { id: 'ifelse', min: 4, stackDelta: -3 },\n    { id: 'random', min: 0, stackDelta: 1 },\n    { id: 'mul', min: 2, stackDelta: -1,\n      stackFn: function stack_div(stack, index) {\n        stack[index - 2] = stack[index - 2] * stack[index - 1];\n      }\n    },\n    null,\n    { id: 'sqrt', min: 1, stackDelta: 0 },\n    { id: 'dup', min: 1, stackDelta: 1 },\n    { id: 'exch', min: 2, stackDelta: 0 },\n    { id: 'index', min: 2, stackDelta: 0 },\n    { id: 'roll', min: 3, stackDelta: -2 },\n    null,\n    null,\n    null,\n    { id: 'hflex', min: 7, resetStack: true },\n    { id: 'flex', min: 13, resetStack: true },\n    { id: 'hflex1', min: 9, resetStack: true },\n    { id: 'flex1', min: 11, resetStack: true }\n  ];\n\n  function CFFParser(file, properties) {\n    this.bytes = file.getBytes();\n    this.properties = properties;\n  }\n  CFFParser.prototype = {\n    parse: function CFFParser_parse() {\n      var properties = this.properties;\n      var cff = new CFF();\n      this.cff = cff;\n\n      // The first five sections must be in order, all the others are reached\n      // via offsets contained in one of the below.\n      var header = this.parseHeader();\n      var nameIndex = this.parseIndex(header.endPos);\n      var topDictIndex = this.parseIndex(nameIndex.endPos);\n      var stringIndex = this.parseIndex(topDictIndex.endPos);\n      var globalSubrIndex = this.parseIndex(stringIndex.endPos);\n\n      var topDictParsed = this.parseDict(topDictIndex.obj.get(0));\n      var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);\n\n      cff.header = header.obj;\n      cff.names = this.parseNameIndex(nameIndex.obj);\n      cff.strings = this.parseStringIndex(stringIndex.obj);\n      cff.topDict = topDict;\n      cff.globalSubrIndex = globalSubrIndex.obj;\n\n      this.parsePrivateDict(cff.topDict);\n\n      cff.isCIDFont = topDict.hasName('ROS');\n\n      var charStringOffset = topDict.getByName('CharStrings');\n      var charStringsAndSeacs = this.parseCharStrings(charStringOffset);\n      cff.charStrings = charStringsAndSeacs.charStrings;\n      cff.seacs = charStringsAndSeacs.seacs;\n      cff.widths = charStringsAndSeacs.widths;\n\n      var fontMatrix = topDict.getByName('FontMatrix');\n      if (fontMatrix) {\n        properties.fontMatrix = fontMatrix;\n      }\n\n      var fontBBox = topDict.getByName('FontBBox');\n      if (fontBBox) {\n        // adjusting ascent/descent\n        properties.ascent = fontBBox[3];\n        properties.descent = fontBBox[1];\n        properties.ascentScaled = true;\n      }\n\n      var charset, encoding;\n      if (cff.isCIDFont) {\n        var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj;\n        for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) {\n          var dictRaw = fdArrayIndex.get(i);\n          var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw),\n                                         cff.strings);\n          this.parsePrivateDict(fontDict);\n          cff.fdArray.push(fontDict);\n        }\n        // cid fonts don't have an encoding\n        encoding = null;\n        charset = this.parseCharsets(topDict.getByName('charset'),\n                                     cff.charStrings.count, cff.strings, true);\n        cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'),\n                                             cff.charStrings.count);\n      } else {\n        charset = this.parseCharsets(topDict.getByName('charset'),\n                                     cff.charStrings.count, cff.strings, false);\n        encoding = this.parseEncoding(topDict.getByName('Encoding'),\n                                      properties,\n                                      cff.strings, charset.charset);\n      }\n      cff.charset = charset;\n      cff.encoding = encoding;\n\n      return cff;\n    },\n    parseHeader: function CFFParser_parseHeader() {\n      var bytes = this.bytes;\n      var bytesLength = bytes.length;\n      var offset = 0;\n\n      // Prevent an infinite loop, by checking that the offset is within the\n      // bounds of the bytes array. Necessary in empty, or invalid, font files.\n      while (offset < bytesLength && bytes[offset] !== 1) {\n        ++offset;\n      }\n      if (offset >= bytesLength) {\n        error('Invalid CFF header');\n      } else if (offset !== 0) {\n        info('cff data is shifted');\n        bytes = bytes.subarray(offset);\n        this.bytes = bytes;\n      }\n      var major = bytes[0];\n      var minor = bytes[1];\n      var hdrSize = bytes[2];\n      var offSize = bytes[3];\n      var header = new CFFHeader(major, minor, hdrSize, offSize);\n      return { obj: header, endPos: hdrSize };\n    },\n    parseDict: function CFFParser_parseDict(dict) {\n      var pos = 0;\n\n      function parseOperand() {\n        var value = dict[pos++];\n        if (value === 30) {\n          return parseFloatOperand(pos);\n        } else if (value === 28) {\n          value = dict[pos++];\n          value = ((value << 24) | (dict[pos++] << 16)) >> 16;\n          return value;\n        } else if (value === 29) {\n          value = dict[pos++];\n          value = (value << 8) | dict[pos++];\n          value = (value << 8) | dict[pos++];\n          value = (value << 8) | dict[pos++];\n          return value;\n        } else if (value >= 32 && value <= 246) {\n          return value - 139;\n        } else if (value >= 247 && value <= 250) {\n          return ((value - 247) * 256) + dict[pos++] + 108;\n        } else if (value >= 251 && value <= 254) {\n          return -((value - 251) * 256) - dict[pos++] - 108;\n        } else {\n          error('255 is not a valid DICT command');\n        }\n        return -1;\n      }\n\n      function parseFloatOperand() {\n        var str = '';\n        var eof = 15;\n        var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8',\n            '9', '.', 'E', 'E-', null, '-'];\n        var length = dict.length;\n        while (pos < length) {\n          var b = dict[pos++];\n          var b1 = b >> 4;\n          var b2 = b & 15;\n\n          if (b1 === eof) {\n            break;\n          }\n          str += lookup[b1];\n\n          if (b2 === eof) {\n            break;\n          }\n          str += lookup[b2];\n        }\n        return parseFloat(str);\n      }\n\n      var operands = [];\n      var entries = [];\n\n      pos = 0;\n      var end = dict.length;\n      while (pos < end) {\n        var b = dict[pos];\n        if (b <= 21) {\n          if (b === 12) {\n            b = (b << 8) | dict[++pos];\n          }\n          entries.push([b, operands]);\n          operands = [];\n          ++pos;\n        } else {\n          operands.push(parseOperand());\n        }\n      }\n      return entries;\n    },\n    parseIndex: function CFFParser_parseIndex(pos) {\n      var cffIndex = new CFFIndex();\n      var bytes = this.bytes;\n      var count = (bytes[pos++] << 8) | bytes[pos++];\n      var offsets = [];\n      var end = pos;\n      var i, ii;\n\n      if (count !== 0) {\n        var offsetSize = bytes[pos++];\n        // add 1 for offset to determine size of last object\n        var startPos = pos + ((count + 1) * offsetSize) - 1;\n\n        for (i = 0, ii = count + 1; i < ii; ++i) {\n          var offset = 0;\n          for (var j = 0; j < offsetSize; ++j) {\n            offset <<= 8;\n            offset += bytes[pos++];\n          }\n          offsets.push(startPos + offset);\n        }\n        end = offsets[count];\n      }\n      for (i = 0, ii = offsets.length - 1; i < ii; ++i) {\n        var offsetStart = offsets[i];\n        var offsetEnd = offsets[i + 1];\n        cffIndex.add(bytes.subarray(offsetStart, offsetEnd));\n      }\n      return {obj: cffIndex, endPos: end};\n    },\n    parseNameIndex: function CFFParser_parseNameIndex(index) {\n      var names = [];\n      for (var i = 0, ii = index.count; i < ii; ++i) {\n        var name = index.get(i);\n        // OTS doesn't allow names to be over 127 characters.\n        var length = Math.min(name.length, 127);\n        var data = [];\n        // OTS also only permits certain characters in the name.\n        for (var j = 0; j < length; ++j) {\n          var c = name[j];\n          if (j === 0 && c === 0) {\n            data[j] = c;\n            continue;\n          }\n          if ((c < 33 || c > 126) || c === 91 /* [ */ || c === 93 /* ] */ ||\n              c === 40 /* ( */ || c === 41 /* ) */ || c === 123 /* { */ ||\n              c === 125 /* } */ || c === 60 /* < */ || c === 62 /* > */ ||\n              c === 47 /* / */ || c === 37 /* % */ || c === 35 /* # */) {\n            data[j] = 95;\n            continue;\n          }\n          data[j] = c;\n        }\n        names.push(bytesToString(data));\n      }\n      return names;\n    },\n    parseStringIndex: function CFFParser_parseStringIndex(index) {\n      var strings = new CFFStrings();\n      for (var i = 0, ii = index.count; i < ii; ++i) {\n        var data = index.get(i);\n        strings.add(bytesToString(data));\n      }\n      return strings;\n    },\n    createDict: function CFFParser_createDict(Type, dict, strings) {\n      var cffDict = new Type(strings);\n      for (var i = 0, ii = dict.length; i < ii; ++i) {\n        var pair = dict[i];\n        var key = pair[0];\n        var value = pair[1];\n        cffDict.setByKey(key, value);\n      }\n      return cffDict;\n    },\n    parseCharStrings: function CFFParser_parseCharStrings(charStringOffset) {\n      var charStrings = this.parseIndex(charStringOffset).obj;\n      var seacs = [];\n      var widths = [];\n      var count = charStrings.count;\n      for (var i = 0; i < count; i++) {\n        var charstring = charStrings.get(i);\n\n        var stackSize = 0;\n        var stack = [];\n        var undefStack = true;\n        var hints = 0;\n        var valid = true;\n        var data = charstring;\n        var length = data.length;\n        var firstStackClearing = true;\n        for (var j = 0; j < length;) {\n          var value = data[j++];\n          var validationCommand = null;\n          if (value === 12) {\n            var q = data[j++];\n            if (q === 0) {\n              // The CFF specification state that the 'dotsection' command\n              // (12, 0) is deprecated and treated as a no-op, but all Type2\n              // charstrings processors should support them. Unfortunately\n              // the font sanitizer don't. As a workaround the sequence (12, 0)\n              // is replaced by a useless (0, hmoveto).\n              data[j - 2] = 139;\n              data[j - 1] = 22;\n              stackSize = 0;\n            } else {\n              validationCommand = CharstringValidationData12[q];\n            }\n          } else if (value === 28) { // number (16 bit)\n            stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16)) >> 16;\n            j += 2;\n            stackSize++;\n          } else if (value === 14) {\n            if (stackSize >= 4) {\n              stackSize -= 4;\n              if (SEAC_ANALYSIS_ENABLED) {\n                seacs[i] = stack.slice(stackSize, stackSize + 4);\n                valid = false;\n              }\n            }\n            validationCommand = CharstringValidationData[value];\n          } else if (value >= 32 && value <= 246) {  // number\n            stack[stackSize] = value - 139;\n            stackSize++;\n          } else if (value >= 247 && value <= 254) {  // number (+1 bytes)\n            stack[stackSize] = (value < 251 ?\n                                ((value - 247) << 8) + data[j] + 108 :\n                                -((value - 251) << 8) - data[j] - 108);\n            j++;\n            stackSize++;\n          } else if (value === 255) {  // number (32 bit)\n            stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16) |\n                                (data[j + 2] << 8) | data[j + 3]) / 65536;\n            j += 4;\n            stackSize++;\n          } else if (value === 19 || value === 20) {\n            hints += stackSize >> 1;\n            j += (hints + 7) >> 3; // skipping right amount of hints flag data\n            stackSize %= 2;\n            validationCommand = CharstringValidationData[value];\n          } else {\n            validationCommand = CharstringValidationData[value];\n          }\n          if (validationCommand) {\n            if (validationCommand.stem) {\n              hints += stackSize >> 1;\n            }\n            if ('min' in validationCommand) {\n              if (!undefStack && stackSize < validationCommand.min) {\n                warn('Not enough parameters for ' + validationCommand.id +\n                     '; actual: ' + stackSize +\n                     ', expected: ' + validationCommand.min);\n                valid = false;\n                break;\n              }\n            }\n            if (firstStackClearing && validationCommand.stackClearing) {\n              firstStackClearing = false;\n              // the optional character width can be found before the first\n              // stack-clearing command arguments\n              stackSize -= validationCommand.min;\n              if (stackSize >= 2 && validationCommand.stem) {\n                // there are even amount of arguments for stem commands\n                stackSize %= 2;\n              } else if (stackSize > 1) {\n                warn('Found too many parameters for stack-clearing command');\n              }\n              if (stackSize > 0 && stack[stackSize - 1] >= 0) {\n                widths[i] = stack[stackSize - 1];\n              }\n            }\n            if ('stackDelta' in validationCommand) {\n              if ('stackFn' in validationCommand) {\n                validationCommand.stackFn(stack, stackSize);\n              }\n              stackSize += validationCommand.stackDelta;\n            } else if (validationCommand.stackClearing) {\n              stackSize = 0;\n            } else if (validationCommand.resetStack) {\n              stackSize = 0;\n              undefStack = false;\n            } else if (validationCommand.undefStack) {\n              stackSize = 0;\n              undefStack = true;\n              firstStackClearing = false;\n            }\n          }\n        }\n        if (!valid) {\n          // resetting invalid charstring to single 'endchar'\n          charStrings.set(i, new Uint8Array([14]));\n        }\n      }\n      return { charStrings: charStrings, seacs: seacs, widths: widths };\n    },\n    emptyPrivateDictionary:\n      function CFFParser_emptyPrivateDictionary(parentDict) {\n      var privateDict = this.createDict(CFFPrivateDict, [],\n                                        parentDict.strings);\n      parentDict.setByKey(18, [0, 0]);\n      parentDict.privateDict = privateDict;\n    },\n    parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) {\n      // no private dict, do nothing\n      if (!parentDict.hasName('Private')) {\n        this.emptyPrivateDictionary(parentDict);\n        return;\n      }\n      var privateOffset = parentDict.getByName('Private');\n      // make sure the params are formatted correctly\n      if (!isArray(privateOffset) || privateOffset.length !== 2) {\n        parentDict.removeByName('Private');\n        return;\n      }\n      var size = privateOffset[0];\n      var offset = privateOffset[1];\n      // remove empty dicts or ones that refer to invalid location\n      if (size === 0 || offset >= this.bytes.length) {\n        this.emptyPrivateDictionary(parentDict);\n        return;\n      }\n\n      var privateDictEnd = offset + size;\n      var dictData = this.bytes.subarray(offset, privateDictEnd);\n      var dict = this.parseDict(dictData);\n      var privateDict = this.createDict(CFFPrivateDict, dict,\n                                        parentDict.strings);\n      parentDict.privateDict = privateDict;\n\n      // Parse the Subrs index also since it's relative to the private dict.\n      if (!privateDict.getByName('Subrs')) {\n        return;\n      }\n      var subrsOffset = privateDict.getByName('Subrs');\n      var relativeOffset = offset + subrsOffset;\n      // Validate the offset.\n      if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {\n        this.emptyPrivateDictionary(parentDict);\n        return;\n      }\n      var subrsIndex = this.parseIndex(relativeOffset);\n      privateDict.subrsIndex = subrsIndex.obj;\n    },\n    parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) {\n      if (pos === 0) {\n        return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE,\n                              ISOAdobeCharset);\n      } else if (pos === 1) {\n        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT,\n                              ExpertCharset);\n      } else if (pos === 2) {\n        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET,\n                              ExpertSubsetCharset);\n      }\n\n      var bytes = this.bytes;\n      var start = pos;\n      var format = bytes[pos++];\n      var charset = ['.notdef'];\n      var id, count, i;\n\n      // subtract 1 for the .notdef glyph\n      length -= 1;\n\n      switch (format) {\n        case 0:\n          for (i = 0; i < length; i++) {\n            id = (bytes[pos++] << 8) | bytes[pos++];\n            charset.push(cid ? id : strings.get(id));\n          }\n          break;\n        case 1:\n          while (charset.length <= length) {\n            id = (bytes[pos++] << 8) | bytes[pos++];\n            count = bytes[pos++];\n            for (i = 0; i <= count; i++) {\n              charset.push(cid ? id++ : strings.get(id++));\n            }\n          }\n          break;\n        case 2:\n          while (charset.length <= length) {\n            id = (bytes[pos++] << 8) | bytes[pos++];\n            count = (bytes[pos++] << 8) | bytes[pos++];\n            for (i = 0; i <= count; i++) {\n              charset.push(cid ? id++ : strings.get(id++));\n            }\n          }\n          break;\n        default:\n          error('Unknown charset format');\n      }\n      // Raw won't be needed if we actually compile the charset.\n      var end = pos;\n      var raw = bytes.subarray(start, end);\n\n      return new CFFCharset(false, format, charset, raw);\n    },\n    parseEncoding: function CFFParser_parseEncoding(pos,\n                                                    properties,\n                                                    strings,\n                                                    charset) {\n      var encoding = {};\n      var bytes = this.bytes;\n      var predefined = false;\n      var hasSupplement = false;\n      var format, i, ii;\n      var raw = null;\n\n      function readSupplement() {\n        var supplementsCount = bytes[pos++];\n        for (i = 0; i < supplementsCount; i++) {\n          var code = bytes[pos++];\n          var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);\n          encoding[code] = charset.indexOf(strings.get(sid));\n        }\n      }\n\n      if (pos === 0 || pos === 1) {\n        predefined = true;\n        format = pos;\n        var baseEncoding = pos ? Encodings.ExpertEncoding :\n                                 Encodings.StandardEncoding;\n        for (i = 0, ii = charset.length; i < ii; i++) {\n          var index = baseEncoding.indexOf(charset[i]);\n          if (index !== -1) {\n            encoding[index] = i;\n          }\n        }\n      } else {\n        var dataStart = pos;\n        format = bytes[pos++];\n        switch (format & 0x7f) {\n          case 0:\n            var glyphsCount = bytes[pos++];\n            for (i = 1; i <= glyphsCount; i++) {\n              encoding[bytes[pos++]] = i;\n            }\n            break;\n\n          case 1:\n            var rangesCount = bytes[pos++];\n            var gid = 1;\n            for (i = 0; i < rangesCount; i++) {\n              var start = bytes[pos++];\n              var left = bytes[pos++];\n              for (var j = start; j <= start + left; j++) {\n                encoding[j] = gid++;\n              }\n            }\n            break;\n\n          default:\n            error('Unknow encoding format: ' + format + ' in CFF');\n            break;\n        }\n        var dataEnd = pos;\n        if (format & 0x80) {\n          // The font sanitizer does not support CFF encoding with a\n          // supplement, since the encoding is not really used to map\n          // between gid to glyph, let's overwrite what is declared in\n          // the top dictionary to let the sanitizer think the font use\n          // StandardEncoding, that's a lie but that's ok.\n          bytes[dataStart] &= 0x7f;\n          readSupplement();\n          hasSupplement = true;\n        }\n        raw = bytes.subarray(dataStart, dataEnd);\n      }\n      format = format & 0x7f;\n      return new CFFEncoding(predefined, format, encoding, raw);\n    },\n    parseFDSelect: function CFFParser_parseFDSelect(pos, length) {\n      var start = pos;\n      var bytes = this.bytes;\n      var format = bytes[pos++];\n      var fdSelect = [];\n      var i;\n\n      switch (format) {\n        case 0:\n          for (i = 0; i < length; ++i) {\n            var id = bytes[pos++];\n            fdSelect.push(id);\n          }\n          break;\n        case 3:\n          var rangesCount = (bytes[pos++] << 8) | bytes[pos++];\n          for (i = 0; i < rangesCount; ++i) {\n            var first = (bytes[pos++] << 8) | bytes[pos++];\n            var fdIndex = bytes[pos++];\n            var next = (bytes[pos] << 8) | bytes[pos + 1];\n            for (var j = first; j < next; ++j) {\n              fdSelect.push(fdIndex);\n            }\n          }\n          // Advance past the sentinel(next).\n          pos += 2;\n          break;\n        default:\n          error('Unknown fdselect format ' + format);\n          break;\n      }\n      var end = pos;\n      return new CFFFDSelect(fdSelect, bytes.subarray(start, end));\n    }\n  };\n  return CFFParser;\n})();\n\n// Compact Font Format\nvar CFF = (function CFFClosure() {\n  function CFF() {\n    this.header = null;\n    this.names = [];\n    this.topDict = null;\n    this.strings = new CFFStrings();\n    this.globalSubrIndex = null;\n\n    // The following could really be per font, but since we only have one font\n    // store them here.\n    this.encoding = null;\n    this.charset = null;\n    this.charStrings = null;\n    this.fdArray = [];\n    this.fdSelect = null;\n\n    this.isCIDFont = false;\n  }\n  return CFF;\n})();\n\nvar CFFHeader = (function CFFHeaderClosure() {\n  function CFFHeader(major, minor, hdrSize, offSize) {\n    this.major = major;\n    this.minor = minor;\n    this.hdrSize = hdrSize;\n    this.offSize = offSize;\n  }\n  return CFFHeader;\n})();\n\nvar CFFStrings = (function CFFStringsClosure() {\n  function CFFStrings() {\n    this.strings = [];\n  }\n  CFFStrings.prototype = {\n    get: function CFFStrings_get(index) {\n      if (index >= 0 && index <= 390) {\n        return CFFStandardStrings[index];\n      }\n      if (index - 391 <= this.strings.length) {\n        return this.strings[index - 391];\n      }\n      return CFFStandardStrings[0];\n    },\n    add: function CFFStrings_add(value) {\n      this.strings.push(value);\n    },\n    get count() {\n      return this.strings.length;\n    }\n  };\n  return CFFStrings;\n})();\n\nvar CFFIndex = (function CFFIndexClosure() {\n  function CFFIndex() {\n    this.objects = [];\n    this.length = 0;\n  }\n  CFFIndex.prototype = {\n    add: function CFFIndex_add(data) {\n      this.length += data.length;\n      this.objects.push(data);\n    },\n    set: function CFFIndex_set(index, data) {\n      this.length += data.length - this.objects[index].length;\n      this.objects[index] = data;\n    },\n    get: function CFFIndex_get(index) {\n      return this.objects[index];\n    },\n    get count() {\n      return this.objects.length;\n    }\n  };\n  return CFFIndex;\n})();\n\nvar CFFDict = (function CFFDictClosure() {\n  function CFFDict(tables, strings) {\n    this.keyToNameMap = tables.keyToNameMap;\n    this.nameToKeyMap = tables.nameToKeyMap;\n    this.defaults = tables.defaults;\n    this.types = tables.types;\n    this.opcodes = tables.opcodes;\n    this.order = tables.order;\n    this.strings = strings;\n    this.values = {};\n  }\n  CFFDict.prototype = {\n    // value should always be an array\n    setByKey: function CFFDict_setByKey(key, value) {\n      if (!(key in this.keyToNameMap)) {\n        return false;\n      }\n      // ignore empty values\n      if (value.length === 0) {\n        return true;\n      }\n      var type = this.types[key];\n      // remove the array wrapping these types of values\n      if (type === 'num' || type === 'sid' || type === 'offset') {\n        value = value[0];\n      }\n      this.values[key] = value;\n      return true;\n    },\n    setByName: function CFFDict_setByName(name, value) {\n      if (!(name in this.nameToKeyMap)) {\n        error('Invalid dictionary name \"' + name + '\"');\n      }\n      this.values[this.nameToKeyMap[name]] = value;\n    },\n    hasName: function CFFDict_hasName(name) {\n      return this.nameToKeyMap[name] in this.values;\n    },\n    getByName: function CFFDict_getByName(name) {\n      if (!(name in this.nameToKeyMap)) {\n        error('Invalid dictionary name \"' + name + '\"');\n      }\n      var key = this.nameToKeyMap[name];\n      if (!(key in this.values)) {\n        return this.defaults[key];\n      }\n      return this.values[key];\n    },\n    removeByName: function CFFDict_removeByName(name) {\n      delete this.values[this.nameToKeyMap[name]];\n    }\n  };\n  CFFDict.createTables = function CFFDict_createTables(layout) {\n    var tables = {\n      keyToNameMap: {},\n      nameToKeyMap: {},\n      defaults: {},\n      types: {},\n      opcodes: {},\n      order: []\n    };\n    for (var i = 0, ii = layout.length; i < ii; ++i) {\n      var entry = layout[i];\n      var key = isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];\n      tables.keyToNameMap[key] = entry[1];\n      tables.nameToKeyMap[entry[1]] = key;\n      tables.types[key] = entry[2];\n      tables.defaults[key] = entry[3];\n      tables.opcodes[key] = isArray(entry[0]) ? entry[0] : [entry[0]];\n      tables.order.push(key);\n    }\n    return tables;\n  };\n  return CFFDict;\n})();\n\nvar CFFTopDict = (function CFFTopDictClosure() {\n  var layout = [\n    [[12, 30], 'ROS', ['sid', 'sid', 'num'], null],\n    [[12, 20], 'SyntheticBase', 'num', null],\n    [0, 'version', 'sid', null],\n    [1, 'Notice', 'sid', null],\n    [[12, 0], 'Copyright', 'sid', null],\n    [2, 'FullName', 'sid', null],\n    [3, 'FamilyName', 'sid', null],\n    [4, 'Weight', 'sid', null],\n    [[12, 1], 'isFixedPitch', 'num', 0],\n    [[12, 2], 'ItalicAngle', 'num', 0],\n    [[12, 3], 'UnderlinePosition', 'num', -100],\n    [[12, 4], 'UnderlineThickness', 'num', 50],\n    [[12, 5], 'PaintType', 'num', 0],\n    [[12, 6], 'CharstringType', 'num', 2],\n    [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'],\n                            [0.001, 0, 0, 0.001, 0, 0]],\n    [13, 'UniqueID', 'num', null],\n    [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]],\n    [[12, 8], 'StrokeWidth', 'num', 0],\n    [14, 'XUID', 'array', null],\n    [15, 'charset', 'offset', 0],\n    [16, 'Encoding', 'offset', 0],\n    [17, 'CharStrings', 'offset', 0],\n    [18, 'Private', ['offset', 'offset'], null],\n    [[12, 21], 'PostScript', 'sid', null],\n    [[12, 22], 'BaseFontName', 'sid', null],\n    [[12, 23], 'BaseFontBlend', 'delta', null],\n    [[12, 31], 'CIDFontVersion', 'num', 0],\n    [[12, 32], 'CIDFontRevision', 'num', 0],\n    [[12, 33], 'CIDFontType', 'num', 0],\n    [[12, 34], 'CIDCount', 'num', 8720],\n    [[12, 35], 'UIDBase', 'num', null],\n    // XXX: CID Fonts on DirectWrite 6.1 only seem to work if FDSelect comes\n    // before FDArray.\n    [[12, 37], 'FDSelect', 'offset', null],\n    [[12, 36], 'FDArray', 'offset', null],\n    [[12, 38], 'FontName', 'sid', null]\n  ];\n  var tables = null;\n  function CFFTopDict(strings) {\n    if (tables === null) {\n      tables = CFFDict.createTables(layout);\n    }\n    CFFDict.call(this, tables, strings);\n    this.privateDict = null;\n  }\n  CFFTopDict.prototype = Object.create(CFFDict.prototype);\n  return CFFTopDict;\n})();\n\nvar CFFPrivateDict = (function CFFPrivateDictClosure() {\n  var layout = [\n    [6, 'BlueValues', 'delta', null],\n    [7, 'OtherBlues', 'delta', null],\n    [8, 'FamilyBlues', 'delta', null],\n    [9, 'FamilyOtherBlues', 'delta', null],\n    [[12, 9], 'BlueScale', 'num', 0.039625],\n    [[12, 10], 'BlueShift', 'num', 7],\n    [[12, 11], 'BlueFuzz', 'num', 1],\n    [10, 'StdHW', 'num', null],\n    [11, 'StdVW', 'num', null],\n    [[12, 12], 'StemSnapH', 'delta', null],\n    [[12, 13], 'StemSnapV', 'delta', null],\n    [[12, 14], 'ForceBold', 'num', 0],\n    [[12, 17], 'LanguageGroup', 'num', 0],\n    [[12, 18], 'ExpansionFactor', 'num', 0.06],\n    [[12, 19], 'initialRandomSeed', 'num', 0],\n    [20, 'defaultWidthX', 'num', 0],\n    [21, 'nominalWidthX', 'num', 0],\n    [19, 'Subrs', 'offset', null]\n  ];\n  var tables = null;\n  function CFFPrivateDict(strings) {\n    if (tables === null) {\n      tables = CFFDict.createTables(layout);\n    }\n    CFFDict.call(this, tables, strings);\n    this.subrsIndex = null;\n  }\n  CFFPrivateDict.prototype = Object.create(CFFDict.prototype);\n  return CFFPrivateDict;\n})();\n\nvar CFFCharsetPredefinedTypes = {\n  ISO_ADOBE: 0,\n  EXPERT: 1,\n  EXPERT_SUBSET: 2\n};\nvar CFFCharset = (function CFFCharsetClosure() {\n  function CFFCharset(predefined, format, charset, raw) {\n    this.predefined = predefined;\n    this.format = format;\n    this.charset = charset;\n    this.raw = raw;\n  }\n  return CFFCharset;\n})();\n\nvar CFFEncoding = (function CFFEncodingClosure() {\n  function CFFEncoding(predefined, format, encoding, raw) {\n    this.predefined = predefined;\n    this.format = format;\n    this.encoding = encoding;\n    this.raw = raw;\n  }\n  return CFFEncoding;\n})();\n\nvar CFFFDSelect = (function CFFFDSelectClosure() {\n  function CFFFDSelect(fdSelect, raw) {\n    this.fdSelect = fdSelect;\n    this.raw = raw;\n  }\n  return CFFFDSelect;\n})();\n\n// Helper class to keep track of where an offset is within the data and helps\n// filling in that offset once it's known.\nvar CFFOffsetTracker = (function CFFOffsetTrackerClosure() {\n  function CFFOffsetTracker() {\n    this.offsets = {};\n  }\n  CFFOffsetTracker.prototype = {\n    isTracking: function CFFOffsetTracker_isTracking(key) {\n      return key in this.offsets;\n    },\n    track: function CFFOffsetTracker_track(key, location) {\n      if (key in this.offsets) {\n        error('Already tracking location of ' + key);\n      }\n      this.offsets[key] = location;\n    },\n    offset: function CFFOffsetTracker_offset(value) {\n      for (var key in this.offsets) {\n        this.offsets[key] += value;\n      }\n    },\n    setEntryLocation: function CFFOffsetTracker_setEntryLocation(key,\n                                                                 values,\n                                                                 output) {\n      if (!(key in this.offsets)) {\n        error('Not tracking location of ' + key);\n      }\n      var data = output.data;\n      var dataOffset = this.offsets[key];\n      var size = 5;\n      for (var i = 0, ii = values.length; i < ii; ++i) {\n        var offset0 = i * size + dataOffset;\n        var offset1 = offset0 + 1;\n        var offset2 = offset0 + 2;\n        var offset3 = offset0 + 3;\n        var offset4 = offset0 + 4;\n        // It's easy to screw up offsets so perform this sanity check.\n        if (data[offset0] !== 0x1d || data[offset1] !== 0 ||\n            data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) {\n          error('writing to an offset that is not empty');\n        }\n        var value = values[i];\n        data[offset0] = 0x1d;\n        data[offset1] = (value >> 24) & 0xFF;\n        data[offset2] = (value >> 16) & 0xFF;\n        data[offset3] = (value >> 8) & 0xFF;\n        data[offset4] = value & 0xFF;\n      }\n    }\n  };\n  return CFFOffsetTracker;\n})();\n\n// Takes a CFF and converts it to the binary representation.\nvar CFFCompiler = (function CFFCompilerClosure() {\n  function CFFCompiler(cff) {\n    this.cff = cff;\n  }\n  CFFCompiler.prototype = {\n    compile: function CFFCompiler_compile() {\n      var cff = this.cff;\n      var output = {\n        data: [],\n        length: 0,\n        add: function CFFCompiler_add(data) {\n          this.data = this.data.concat(data);\n          this.length = this.data.length;\n        }\n      };\n\n      // Compile the five entries that must be in order.\n      var header = this.compileHeader(cff.header);\n      output.add(header);\n\n      var nameIndex = this.compileNameIndex(cff.names);\n      output.add(nameIndex);\n\n      if (cff.isCIDFont) {\n        // The spec is unclear on how font matrices should relate to each other\n        // when there is one in the main top dict and the sub top dicts.\n        // Windows handles this differently than linux and osx so we have to\n        // normalize to work on all.\n        // Rules based off of some mailing list discussions:\n        // - If main font has a matrix and subfont doesn't, use the main matrix.\n        // - If no main font matrix and there is a subfont matrix, use the\n        //   subfont matrix.\n        // - If both have matrices, concat together.\n        // - If neither have matrices, use default.\n        // To make this work on all platforms we move the top matrix into each\n        // sub top dict and concat if necessary.\n        if (cff.topDict.hasName('FontMatrix')) {\n          var base = cff.topDict.getByName('FontMatrix');\n          cff.topDict.removeByName('FontMatrix');\n          for (var i = 0, ii = cff.fdArray.length; i < ii; i++) {\n            var subDict = cff.fdArray[i];\n            var matrix = base.slice(0);\n            if (subDict.hasName('FontMatrix')) {\n              matrix = Util.transform(matrix, subDict.getByName('FontMatrix'));\n            }\n            subDict.setByName('FontMatrix', matrix);\n          }\n        }\n      }\n\n      var compiled = this.compileTopDicts([cff.topDict],\n                                          output.length,\n                                          cff.isCIDFont);\n      output.add(compiled.output);\n      var topDictTracker = compiled.trackers[0];\n\n      var stringIndex = this.compileStringIndex(cff.strings.strings);\n      output.add(stringIndex);\n\n      var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);\n      output.add(globalSubrIndex);\n\n      // Now start on the other entries that have no specfic order.\n      if (cff.encoding && cff.topDict.hasName('Encoding')) {\n        if (cff.encoding.predefined) {\n          topDictTracker.setEntryLocation('Encoding', [cff.encoding.format],\n                                          output);\n        } else {\n          var encoding = this.compileEncoding(cff.encoding);\n          topDictTracker.setEntryLocation('Encoding', [output.length], output);\n          output.add(encoding);\n        }\n      }\n\n      if (cff.charset && cff.topDict.hasName('charset')) {\n        if (cff.charset.predefined) {\n          topDictTracker.setEntryLocation('charset', [cff.charset.format],\n                                          output);\n        } else {\n          var charset = this.compileCharset(cff.charset);\n          topDictTracker.setEntryLocation('charset', [output.length], output);\n          output.add(charset);\n        }\n      }\n\n      var charStrings = this.compileCharStrings(cff.charStrings);\n      topDictTracker.setEntryLocation('CharStrings', [output.length], output);\n      output.add(charStrings);\n\n      if (cff.isCIDFont) {\n        // For some reason FDSelect must be in front of FDArray on windows. OSX\n        // and linux don't seem to care.\n        topDictTracker.setEntryLocation('FDSelect', [output.length], output);\n        var fdSelect = this.compileFDSelect(cff.fdSelect.raw);\n        output.add(fdSelect);\n        // It is unclear if the sub font dictionary can have CID related\n        // dictionary keys, but the sanitizer doesn't like them so remove them.\n        compiled = this.compileTopDicts(cff.fdArray, output.length, true);\n        topDictTracker.setEntryLocation('FDArray', [output.length], output);\n        output.add(compiled.output);\n        var fontDictTrackers = compiled.trackers;\n\n        this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);\n      }\n\n      this.compilePrivateDicts([cff.topDict], [topDictTracker], output);\n\n      // If the font data ends with INDEX whose object data is zero-length,\n      // the sanitizer will bail out. Add a dummy byte to avoid that.\n      output.add([0]);\n\n      return output.data;\n    },\n    encodeNumber: function CFFCompiler_encodeNumber(value) {\n      if (parseFloat(value) === parseInt(value, 10) && !isNaN(value)) { // isInt\n        return this.encodeInteger(value);\n      } else {\n        return this.encodeFloat(value);\n      }\n    },\n    encodeFloat: function CFFCompiler_encodeFloat(num) {\n      var value = num.toString();\n\n      // rounding inaccurate doubles\n      var m = /\\.(\\d*?)(?:9{5,20}|0{5,20})\\d{0,2}(?:e(.+)|$)/.exec(value);\n      if (m) {\n        var epsilon = parseFloat('1e' + ((m[2] ? +m[2] : 0) + m[1].length));\n        value = (Math.round(num * epsilon) / epsilon).toString();\n      }\n\n      var nibbles = '';\n      var i, ii;\n      for (i = 0, ii = value.length; i < ii; ++i) {\n        var a = value[i];\n        if (a === 'e') {\n          nibbles += value[++i] === '-' ? 'c' : 'b';\n        } else if (a === '.') {\n          nibbles += 'a';\n        } else if (a === '-') {\n          nibbles += 'e';\n        } else {\n          nibbles += a;\n        }\n      }\n      nibbles += (nibbles.length & 1) ? 'f' : 'ff';\n      var out = [30];\n      for (i = 0, ii = nibbles.length; i < ii; i += 2) {\n        out.push(parseInt(nibbles.substr(i, 2), 16));\n      }\n      return out;\n    },\n    encodeInteger: function CFFCompiler_encodeInteger(value) {\n      var code;\n      if (value >= -107 && value <= 107) {\n        code = [value + 139];\n      } else if (value >= 108 && value <= 1131) {\n        value = [value - 108];\n        code = [(value >> 8) + 247, value & 0xFF];\n      } else if (value >= -1131 && value <= -108) {\n        value = -value - 108;\n        code = [(value >> 8) + 251, value & 0xFF];\n      } else if (value >= -32768 && value <= 32767) {\n        code = [0x1c, (value >> 8) & 0xFF, value & 0xFF];\n      } else {\n        code = [0x1d,\n                (value >> 24) & 0xFF,\n                (value >> 16) & 0xFF,\n                (value >> 8) & 0xFF,\n                 value & 0xFF];\n      }\n      return code;\n    },\n    compileHeader: function CFFCompiler_compileHeader(header) {\n      return [\n        header.major,\n        header.minor,\n        header.hdrSize,\n        header.offSize\n      ];\n    },\n    compileNameIndex: function CFFCompiler_compileNameIndex(names) {\n      var nameIndex = new CFFIndex();\n      for (var i = 0, ii = names.length; i < ii; ++i) {\n        nameIndex.add(stringToBytes(names[i]));\n      }\n      return this.compileIndex(nameIndex);\n    },\n    compileTopDicts: function CFFCompiler_compileTopDicts(dicts,\n                                                          length,\n                                                          removeCidKeys) {\n      var fontDictTrackers = [];\n      var fdArrayIndex = new CFFIndex();\n      for (var i = 0, ii = dicts.length; i < ii; ++i) {\n        var fontDict = dicts[i];\n        if (removeCidKeys) {\n          fontDict.removeByName('CIDFontVersion');\n          fontDict.removeByName('CIDFontRevision');\n          fontDict.removeByName('CIDFontType');\n          fontDict.removeByName('CIDCount');\n          fontDict.removeByName('UIDBase');\n        }\n        var fontDictTracker = new CFFOffsetTracker();\n        var fontDictData = this.compileDict(fontDict, fontDictTracker);\n        fontDictTrackers.push(fontDictTracker);\n        fdArrayIndex.add(fontDictData);\n        fontDictTracker.offset(length);\n      }\n      fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);\n      return {\n        trackers: fontDictTrackers,\n        output: fdArrayIndex\n      };\n    },\n    compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts,\n                                                                  trackers,\n                                                                  output) {\n      for (var i = 0, ii = dicts.length; i < ii; ++i) {\n        var fontDict = dicts[i];\n        assert(fontDict.privateDict && fontDict.hasName('Private'),\n               'There must be an private dictionary.');\n        var privateDict = fontDict.privateDict;\n        var privateDictTracker = new CFFOffsetTracker();\n        var privateDictData = this.compileDict(privateDict, privateDictTracker);\n\n        var outputLength = output.length;\n        privateDictTracker.offset(outputLength);\n        if (!privateDictData.length) {\n          // The private dictionary was empty, set the output length to zero to\n          // ensure the offset length isn't out of bounds in the eyes of the\n          // sanitizer.\n          outputLength = 0;\n        }\n\n        trackers[i].setEntryLocation('Private',\n                                     [privateDictData.length, outputLength],\n                                     output);\n        output.add(privateDictData);\n\n        if (privateDict.subrsIndex && privateDict.hasName('Subrs')) {\n          var subrs = this.compileIndex(privateDict.subrsIndex);\n          privateDictTracker.setEntryLocation('Subrs', [privateDictData.length],\n                                              output);\n          output.add(subrs);\n        }\n      }\n    },\n    compileDict: function CFFCompiler_compileDict(dict, offsetTracker) {\n      var out = [];\n      // The dictionary keys must be in a certain order.\n      var order = dict.order;\n      for (var i = 0; i < order.length; ++i) {\n        var key = order[i];\n        if (!(key in dict.values)) {\n          continue;\n        }\n        var values = dict.values[key];\n        var types = dict.types[key];\n        if (!isArray(types)) {\n          types = [types];\n        }\n        if (!isArray(values)) {\n          values = [values];\n        }\n\n        // Remove any empty dict values.\n        if (values.length === 0) {\n          continue;\n        }\n\n        for (var j = 0, jj = types.length; j < jj; ++j) {\n          var type = types[j];\n          var value = values[j];\n          switch (type) {\n            case 'num':\n            case 'sid':\n              out = out.concat(this.encodeNumber(value));\n              break;\n            case 'offset':\n              // For offsets we just insert a 32bit integer so we don't have to\n              // deal with figuring out the length of the offset when it gets\n              // replaced later on by the compiler.\n              var name = dict.keyToNameMap[key];\n              // Some offsets have the offset and the length, so just record the\n              // position of the first one.\n              if (!offsetTracker.isTracking(name)) {\n                offsetTracker.track(name, out.length);\n              }\n              out = out.concat([0x1d, 0, 0, 0, 0]);\n              break;\n            case 'array':\n            case 'delta':\n              out = out.concat(this.encodeNumber(value));\n              for (var k = 1, kk = values.length; k < kk; ++k) {\n                out = out.concat(this.encodeNumber(values[k]));\n              }\n              break;\n            default:\n              error('Unknown data type of ' + type);\n              break;\n          }\n        }\n        out = out.concat(dict.opcodes[key]);\n      }\n      return out;\n    },\n    compileStringIndex: function CFFCompiler_compileStringIndex(strings) {\n      var stringIndex = new CFFIndex();\n      for (var i = 0, ii = strings.length; i < ii; ++i) {\n        stringIndex.add(stringToBytes(strings[i]));\n      }\n      return this.compileIndex(stringIndex);\n    },\n    compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() {\n      var globalSubrIndex = this.cff.globalSubrIndex;\n      this.out.writeByteArray(this.compileIndex(globalSubrIndex));\n    },\n    compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) {\n      return this.compileIndex(charStrings);\n    },\n    compileCharset: function CFFCompiler_compileCharset(charset) {\n      return this.compileTypedArray(charset.raw);\n    },\n    compileEncoding: function CFFCompiler_compileEncoding(encoding) {\n      return this.compileTypedArray(encoding.raw);\n    },\n    compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) {\n      return this.compileTypedArray(fdSelect);\n    },\n    compileTypedArray: function CFFCompiler_compileTypedArray(data) {\n      var out = [];\n      for (var i = 0, ii = data.length; i < ii; ++i) {\n        out[i] = data[i];\n      }\n      return out;\n    },\n    compileIndex: function CFFCompiler_compileIndex(index, trackers) {\n      trackers = trackers || [];\n      var objects = index.objects;\n      // First 2 bytes contains the number of objects contained into this index\n      var count = objects.length;\n\n      // If there is no object, just create an index. This technically\n      // should just be [0, 0] but OTS has an issue with that.\n      if (count === 0) {\n        return [0, 0, 0];\n      }\n\n      var data = [(count >> 8) & 0xFF, count & 0xff];\n\n      var lastOffset = 1, i;\n      for (i = 0; i < count; ++i) {\n        lastOffset += objects[i].length;\n      }\n\n      var offsetSize;\n      if (lastOffset < 0x100) {\n        offsetSize = 1;\n      } else if (lastOffset < 0x10000) {\n        offsetSize = 2;\n      } else if (lastOffset < 0x1000000) {\n        offsetSize = 3;\n      } else {\n        offsetSize = 4;\n      }\n\n      // Next byte contains the offset size use to reference object in the file\n      data.push(offsetSize);\n\n      // Add another offset after this one because we need a new offset\n      var relativeOffset = 1;\n      for (i = 0; i < count + 1; i++) {\n        if (offsetSize === 1) {\n          data.push(relativeOffset & 0xFF);\n        } else if (offsetSize === 2) {\n          data.push((relativeOffset >> 8) & 0xFF,\n                     relativeOffset & 0xFF);\n        } else if (offsetSize === 3) {\n          data.push((relativeOffset >> 16) & 0xFF,\n                    (relativeOffset >> 8) & 0xFF,\n                     relativeOffset & 0xFF);\n        } else {\n          data.push((relativeOffset >>> 24) & 0xFF,\n                    (relativeOffset >> 16) & 0xFF,\n                    (relativeOffset >> 8) & 0xFF,\n                     relativeOffset & 0xFF);\n        }\n\n        if (objects[i]) {\n          relativeOffset += objects[i].length;\n        }\n      }\n\n      for (i = 0; i < count; i++) {\n        // Notify the tracker where the object will be offset in the data.\n        if (trackers[i]) {\n          trackers[i].offset(data.length);\n        }\n        for (var j = 0, jj = objects[i].length; j < jj; j++) {\n          data.push(objects[i][j]);\n        }\n      }\n      return data;\n    }\n  };\n  return CFFCompiler;\n})();\n\n// Workaround for seac on Windows.\n(function checkSeacSupport() {\n  if (/Windows/.test(navigator.userAgent)) {\n    SEAC_ANALYSIS_ENABLED = true;\n  }\n})();\n\n// Workaround for Private Use Area characters in Chrome on Windows\n// http://code.google.com/p/chromium/issues/detail?id=122465\n// https://github.com/mozilla/pdf.js/issues/1689\n(function checkChromeWindows() {\n  if (/Windows.*Chrome/.test(navigator.userAgent)) {\n    SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = true;\n  }\n})();\n\n\nvar FontRendererFactory = (function FontRendererFactoryClosure() {\n  function getLong(data, offset) {\n    return (data[offset] << 24) | (data[offset + 1] << 16) |\n           (data[offset + 2] << 8) | data[offset + 3];\n  }\n\n  function getUshort(data, offset) {\n    return (data[offset] << 8) | data[offset + 1];\n  }\n\n  function parseCmap(data, start, end) {\n    var offset = (getUshort(data, start + 2) === 1 ?\n                  getLong(data, start + 8) : getLong(data, start + 16));\n    var format = getUshort(data, start + offset);\n    var length, ranges, p, i;\n    if (format === 4) {\n      length = getUshort(data, start + offset + 2);\n      var segCount = getUshort(data, start + offset + 6) >> 1;\n      p = start + offset + 14;\n      ranges = [];\n      for (i = 0; i < segCount; i++, p += 2) {\n        ranges[i] = {end: getUshort(data, p)};\n      }\n      p += 2;\n      for (i = 0; i < segCount; i++, p += 2) {\n        ranges[i].start = getUshort(data, p);\n      }\n      for (i = 0; i < segCount; i++, p += 2) {\n        ranges[i].idDelta = getUshort(data, p);\n      }\n      for (i = 0; i < segCount; i++, p += 2) {\n        var idOffset = getUshort(data, p);\n        if (idOffset === 0) {\n          continue;\n        }\n        ranges[i].ids = [];\n        for (var j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) {\n          ranges[i].ids[j] = getUshort(data, p + idOffset);\n          idOffset += 2;\n        }\n      }\n      return ranges;\n    } else if (format === 12) {\n      length = getLong(data, start + offset + 4);\n      var groups = getLong(data, start + offset + 12);\n      p = start + offset + 16;\n      ranges = [];\n      for (i = 0; i < groups; i++) {\n        ranges.push({\n          start: getLong(data, p),\n          end: getLong(data, p + 4),\n          idDelta: getLong(data, p + 8) - getLong(data, p)\n        });\n        p += 12;\n      }\n      return ranges;\n    }\n    error('not supported cmap: ' + format);\n  }\n\n  function parseCff(data, start, end) {\n    var properties = {};\n    var parser = new CFFParser(new Stream(data, start, end - start),\n                               properties);\n    var cff = parser.parse();\n    return {\n      glyphs: cff.charStrings.objects,\n      subrs: (cff.topDict.privateDict && cff.topDict.privateDict.subrsIndex &&\n              cff.topDict.privateDict.subrsIndex.objects),\n      gsubrs: cff.globalSubrIndex && cff.globalSubrIndex.objects\n    };\n  }\n\n  function parseGlyfTable(glyf, loca, isGlyphLocationsLong) {\n    var itemSize, itemDecode;\n    if (isGlyphLocationsLong) {\n      itemSize = 4;\n      itemDecode = function fontItemDecodeLong(data, offset) {\n        return (data[offset] << 24) | (data[offset + 1] << 16) |\n               (data[offset + 2] << 8) | data[offset + 3];\n      };\n    } else {\n      itemSize = 2;\n      itemDecode = function fontItemDecode(data, offset) {\n        return (data[offset] << 9) | (data[offset + 1] << 1);\n      };\n    }\n    var glyphs = [];\n    var startOffset = itemDecode(loca, 0);\n    for (var j = itemSize; j < loca.length; j += itemSize) {\n      var endOffset = itemDecode(loca, j);\n      glyphs.push(glyf.subarray(startOffset, endOffset));\n      startOffset = endOffset;\n    }\n    return glyphs;\n  }\n\n  function lookupCmap(ranges, unicode) {\n    var code = unicode.charCodeAt(0);\n    var l = 0, r = ranges.length - 1;\n    while (l < r) {\n      var c = (l + r + 1) >> 1;\n      if (code < ranges[c].start) {\n        r = c - 1;\n      } else {\n        l = c;\n      }\n    }\n    if (ranges[l].start <= code && code <= ranges[l].end) {\n      return (ranges[l].idDelta + (ranges[l].ids ?\n        ranges[l].ids[code - ranges[l].start] : code)) & 0xFFFF;\n    }\n    return 0;\n  }\n\n  function compileGlyf(code, js, font) {\n    function moveTo(x, y) {\n      js.push('c.moveTo(' + x + ',' + y + ');');\n    }\n    function lineTo(x, y) {\n      js.push('c.lineTo(' + x + ',' + y + ');');\n    }\n    function quadraticCurveTo(xa, ya, x, y) {\n      js.push('c.quadraticCurveTo(' + xa + ',' + ya + ',' +\n                                   x + ',' + y + ');');\n    }\n\n    var i = 0;\n    var numberOfContours = ((code[i] << 24) | (code[i + 1] << 16)) >> 16;\n    var flags;\n    var x = 0, y = 0;\n    i += 10;\n    if (numberOfContours < 0) {\n      // composite glyph\n      do {\n        flags = (code[i] << 8) | code[i + 1];\n        var glyphIndex = (code[i + 2] << 8) | code[i + 3];\n        i += 4;\n        var arg1, arg2;\n        if ((flags & 0x01)) {\n          arg1 = ((code[i] << 24) | (code[i + 1] << 16)) >> 16;\n          arg2 = ((code[i + 2] << 24) | (code[i + 3] << 16)) >> 16;\n          i += 4;\n        } else {\n          arg1 = code[i++]; arg2 = code[i++];\n        }\n        if ((flags & 0x02)) {\n           x = arg1;\n           y = arg2;\n        } else {\n           x = 0; y = 0; // TODO \"they are points\" ?\n        }\n        var scaleX = 1, scaleY = 1, scale01 = 0, scale10 = 0;\n        if ((flags & 0x08)) {\n          scaleX =\n          scaleY = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824;\n          i += 2;\n        } else if ((flags & 0x40)) {\n          scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824;\n          scaleY = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824;\n          i += 4;\n        } else if ((flags & 0x80)) {\n          scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824;\n          scale01 = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824;\n          scale10 = ((code[i + 4] << 24) | (code[i + 5] << 16)) / 1073741824;\n          scaleY = ((code[i + 6] << 24) | (code[i + 7] << 16)) / 1073741824;\n          i += 8;\n        }\n        var subglyph = font.glyphs[glyphIndex];\n        if (subglyph) {\n          js.push('c.save();');\n          js.push('c.transform(' + scaleX + ',' + scale01 + ',' +\n                  scale10 + ',' + scaleY + ',' + x + ',' + y + ');');\n          compileGlyf(subglyph, js, font);\n          js.push('c.restore();');\n        }\n      } while ((flags & 0x20));\n    } else {\n      // simple glyph\n      var endPtsOfContours = [];\n      var j, jj;\n      for (j = 0; j < numberOfContours; j++) {\n        endPtsOfContours.push((code[i] << 8) | code[i + 1]);\n        i += 2;\n      }\n      var instructionLength = (code[i] << 8) | code[i + 1];\n      i += 2 + instructionLength; // skipping the instructions\n      var numberOfPoints = endPtsOfContours[endPtsOfContours.length - 1] + 1;\n      var points = [];\n      while (points.length < numberOfPoints) {\n        flags = code[i++];\n        var repeat = 1;\n        if ((flags & 0x08)) {\n          repeat += code[i++];\n        }\n        while (repeat-- > 0) {\n          points.push({flags: flags});\n        }\n      }\n      for (j = 0; j < numberOfPoints; j++) {\n        switch (points[j].flags & 0x12) {\n          case 0x00:\n            x += ((code[i] << 24) | (code[i + 1] << 16)) >> 16;\n            i += 2;\n            break;\n          case 0x02:\n            x -= code[i++];\n            break;\n          case 0x12:\n            x += code[i++];\n            break;\n        }\n        points[j].x = x;\n      }\n      for (j = 0; j < numberOfPoints; j++) {\n        switch (points[j].flags & 0x24) {\n          case 0x00:\n            y += ((code[i] << 24) | (code[i + 1] << 16)) >> 16;\n            i += 2;\n            break;\n          case 0x04:\n            y -= code[i++];\n            break;\n          case 0x24:\n            y += code[i++];\n            break;\n        }\n        points[j].y = y;\n      }\n\n      var startPoint = 0;\n      for (i = 0; i < numberOfContours; i++) {\n        var endPoint = endPtsOfContours[i];\n        // contours might have implicit points, which is located in the middle\n        // between two neighboring off-curve points\n        var contour = points.slice(startPoint, endPoint + 1);\n        if ((contour[0].flags & 1)) {\n          contour.push(contour[0]); // using start point at the contour end\n        } else if ((contour[contour.length - 1].flags & 1)) {\n          // first is off-curve point, trying to use one from the end\n          contour.unshift(contour[contour.length - 1]);\n        } else {\n          // start and end are off-curve points, creating implicit one\n          var p = {\n            flags: 1,\n            x: (contour[0].x + contour[contour.length - 1].x) / 2,\n            y: (contour[0].y + contour[contour.length - 1].y) / 2\n          };\n          contour.unshift(p);\n          contour.push(p);\n        }\n        moveTo(contour[0].x, contour[0].y);\n        for (j = 1, jj = contour.length; j < jj; j++) {\n          if ((contour[j].flags & 1)) {\n            lineTo(contour[j].x, contour[j].y);\n          } else if ((contour[j + 1].flags & 1)){\n            quadraticCurveTo(contour[j].x, contour[j].y,\n                             contour[j + 1].x, contour[j + 1].y);\n            j++;\n          } else {\n            quadraticCurveTo(contour[j].x, contour[j].y,\n              (contour[j].x + contour[j + 1].x) / 2,\n              (contour[j].y + contour[j + 1].y) / 2);\n          }\n        }\n        startPoint = endPoint + 1;\n      }\n    }\n  }\n\n  function compileCharString(code, js, font) {\n    var stack = [];\n    var x = 0, y = 0;\n    var stems = 0;\n\n    function moveTo(x, y) {\n      js.push('c.moveTo(' + x + ',' + y + ');');\n    }\n    function lineTo(x, y) {\n      js.push('c.lineTo(' + x + ',' + y + ');');\n    }\n    function bezierCurveTo(x1, y1, x2, y2, x, y) {\n      js.push('c.bezierCurveTo(' + x1 + ',' + y1 + ',' + x2 + ',' + y2 + ',' +\n                                   x + ',' + y + ');');\n    }\n\n    function parse(code) {\n      var i = 0;\n      while (i < code.length) {\n        var stackClean = false;\n        var v = code[i++];\n        var xa, xb, ya, yb, y1, y2, y3, n, subrCode;\n        switch (v) {\n          case 1: // hstem\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n          case 3: // vstem\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n          case 4: // vmoveto\n            y += stack.pop();\n            moveTo(x, y);\n            stackClean = true;\n            break;\n          case 5: // rlineto\n            while (stack.length > 0) {\n              x += stack.shift();\n              y += stack.shift();\n              lineTo(x, y);\n            }\n            break;\n          case 6: // hlineto\n            while (stack.length > 0) {\n              x += stack.shift();\n              lineTo(x, y);\n              if (stack.length === 0) {\n                break;\n              }\n              y += stack.shift();\n              lineTo(x, y);\n            }\n            break;\n          case 7: // vlineto\n            while (stack.length > 0) {\n              y += stack.shift();\n              lineTo(x, y);\n              if (stack.length === 0) {\n                break;\n              }\n              x += stack.shift();\n              lineTo(x, y);\n            }\n            break;\n          case 8: // rrcurveto\n            while (stack.length > 0) {\n              xa = x + stack.shift(); ya = y + stack.shift();\n              xb = xa + stack.shift(); yb = ya + stack.shift();\n              x = xb + stack.shift(); y = yb + stack.shift();\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          case 10: // callsubr\n            n = stack.pop() + font.subrsBias;\n            subrCode = font.subrs[n];\n            if (subrCode) {\n              parse(subrCode);\n            }\n            break;\n          case 11: // return\n            return;\n          case 12:\n            v = code[i++];\n            switch (v) {\n              case 34: // flex\n                xa = x + stack.shift();\n                xb = xa + stack.shift(); y1 = y + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y, xb, y1, x, y1);\n                xa = x + stack.shift();\n                xb = xa + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y1, xb, y, x, y);\n                break;\n              case 35: // flex\n                xa = x + stack.shift(); ya = y + stack.shift();\n                xb = xa + stack.shift(); yb = ya + stack.shift();\n                x = xb + stack.shift(); y = yb + stack.shift();\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                xa = x + stack.shift(); ya = y + stack.shift();\n                xb = xa + stack.shift(); yb = ya + stack.shift();\n                x = xb + stack.shift(); y = yb + stack.shift();\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                stack.pop(); // fd\n                break;\n              case 36: // hflex1\n                xa = x + stack.shift(); y1 = y + stack.shift();\n                xb = xa + stack.shift(); y2 = y1 + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y1, xb, y2, x, y2);\n                xa = x + stack.shift();\n                xb = xa + stack.shift(); y3 = y2 + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y2, xb, y3, x, y);\n                break;\n              case 37: // flex1\n                var x0 = x, y0 = y;\n                xa = x + stack.shift(); ya = y + stack.shift();\n                xb = xa + stack.shift(); yb = ya + stack.shift();\n                x = xb + stack.shift(); y = yb + stack.shift();\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                xa = x + stack.shift(); ya = y + stack.shift();\n                xb = xa + stack.shift(); yb = ya + stack.shift();\n                x = xb; y = yb;\n                if (Math.abs(x - x0) > Math.abs(y - y0)) {\n                  x += stack.shift();\n                } else  {\n                  y += stack.shift();\n                }\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                break;\n              default:\n                error('unknown operator: 12 ' + v);\n            }\n            break;\n          case 14: // endchar\n            if (stack.length >= 4) {\n              var achar = stack.pop();\n              var bchar = stack.pop();\n              y = stack.pop();\n              x = stack.pop();\n              js.push('c.save();');\n              js.push('c.translate('+ x + ',' + y + ');');\n              var gid = lookupCmap(font.cmap, String.fromCharCode(\n                font.glyphNameMap[Encodings.StandardEncoding[achar]]));\n              compileCharString(font.glyphs[gid], js, font);\n              js.push('c.restore();');\n\n              gid = lookupCmap(font.cmap, String.fromCharCode(\n                font.glyphNameMap[Encodings.StandardEncoding[bchar]]));\n              compileCharString(font.glyphs[gid], js, font);\n            }\n            return;\n          case 18: // hstemhm\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n          case 19: // hintmask\n            stems += stack.length >> 1;\n            i += (stems + 7) >> 3;\n            stackClean = true;\n            break;\n          case 20: // cntrmask\n            stems += stack.length >> 1;\n            i += (stems + 7) >> 3;\n            stackClean = true;\n            break;\n          case 21: // rmoveto\n            y += stack.pop();\n            x += stack.pop();\n            moveTo(x, y);\n            stackClean = true;\n            break;\n          case 22: // hmoveto\n            x += stack.pop();\n            moveTo(x, y);\n            stackClean = true;\n            break;\n          case 23: // vstemhm\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n          case 24: // rcurveline\n            while (stack.length > 2) {\n              xa = x + stack.shift(); ya = y + stack.shift();\n              xb = xa + stack.shift(); yb = ya + stack.shift();\n              x = xb + stack.shift(); y = yb + stack.shift();\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            x += stack.shift();\n            y += stack.shift();\n            lineTo(x, y);\n            break;\n          case 25: // rlinecurve\n            while (stack.length > 6) {\n              x += stack.shift();\n              y += stack.shift();\n              lineTo(x, y);\n            }\n            xa = x + stack.shift(); ya = y + stack.shift();\n            xb = xa + stack.shift(); yb = ya + stack.shift();\n            x = xb + stack.shift(); y = yb + stack.shift();\n            bezierCurveTo(xa, ya, xb, yb, x, y);\n            break;\n          case 26: // vvcurveto\n            if (stack.length % 2) {\n              x += stack.shift();\n            }\n            while (stack.length > 0) {\n              xa = x; ya = y + stack.shift();\n              xb = xa + stack.shift(); yb = ya + stack.shift();\n              x = xb; y = yb + stack.shift();\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          case 27: // hhcurveto\n            if (stack.length % 2) {\n              y += stack.shift();\n            }\n            while (stack.length > 0) {\n              xa = x + stack.shift(); ya = y;\n              xb = xa + stack.shift(); yb = ya + stack.shift();\n              x = xb + stack.shift(); y = yb;\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          case 28:\n            stack.push(((code[i] << 24) | (code[i + 1] << 16)) >> 16);\n            i += 2;\n            break;\n          case 29: // callgsubr\n            n = stack.pop() + font.gsubrsBias;\n            subrCode = font.gsubrs[n];\n            if (subrCode) {\n              parse(subrCode);\n            }\n            break;\n          case 30: // vhcurveto\n            while (stack.length > 0) {\n              xa = x; ya = y + stack.shift();\n              xb = xa + stack.shift(); yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n              if (stack.length === 0) {\n                break;\n              }\n\n              xa = x + stack.shift(); ya = y;\n              xb = xa + stack.shift(); yb = ya + stack.shift();\n              y = yb + stack.shift();\n              x = xb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          case 31: // hvcurveto\n            while (stack.length > 0) {\n              xa = x + stack.shift(); ya = y;\n              xb = xa + stack.shift(); yb = ya + stack.shift();\n              y = yb + stack.shift();\n              x = xb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n              if (stack.length === 0) {\n                break;\n              }\n\n              xa = x; ya = y + stack.shift();\n              xb = xa + stack.shift(); yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          default:\n            if (v < 32) {\n              error('unknown operator: ' + v);\n            }\n            if (v < 247) {\n              stack.push(v - 139);\n            } else if (v < 251) {\n              stack.push((v - 247) * 256 + code[i++] + 108);\n            } else if (v < 255) {\n              stack.push(-(v - 251) * 256 - code[i++] - 108);\n            } else {\n              stack.push(((code[i] << 24) | (code[i + 1] << 16) |\n                         (code[i + 2] << 8) | code[i + 3]) / 65536);\n              i += 4;\n            }\n            break;\n        }\n        if (stackClean) {\n          stack.length = 0;\n        }\n      }\n    }\n    parse(code);\n  }\n\n  var noop = '';\n\n  function CompiledFont(fontMatrix) {\n    this.compiledGlyphs = {};\n    this.fontMatrix = fontMatrix;\n  }\n  CompiledFont.prototype = {\n    getPathJs: function (unicode) {\n      var gid = lookupCmap(this.cmap, unicode);\n      var fn = this.compiledGlyphs[gid];\n      if (!fn) {\n        this.compiledGlyphs[gid] = fn = this.compileGlyph(this.glyphs[gid]);\n      }\n      return fn;\n    },\n\n    compileGlyph: function (code) {\n      if (!code || code.length === 0 || code[0] === 14) {\n        return noop;\n      }\n\n      var js = [];\n      js.push('c.save();');\n      js.push('c.transform(' + this.fontMatrix.join(',') + ');');\n      js.push('c.scale(size, -size);');\n\n      this.compileGlyphImpl(code, js);\n\n      js.push('c.restore();');\n\n      return js.join('\\n');\n    },\n\n    compileGlyphImpl: function () {\n      error('Children classes should implement this.');\n    },\n\n    hasBuiltPath: function (unicode) {\n      var gid = lookupCmap(this.cmap, unicode);\n      return gid in this.compiledGlyphs;\n    }\n  };\n\n  function TrueTypeCompiled(glyphs, cmap, fontMatrix) {\n    fontMatrix = fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0];\n    CompiledFont.call(this, fontMatrix);\n\n    this.glyphs = glyphs;\n    this.cmap = cmap;\n\n    this.compiledGlyphs = [];\n  }\n\n  Util.inherit(TrueTypeCompiled, CompiledFont, {\n    compileGlyphImpl: function (code, js) {\n      compileGlyf(code, js, this);\n    }\n  });\n\n  function Type2Compiled(cffInfo, cmap, fontMatrix, glyphNameMap) {\n    fontMatrix = fontMatrix || [0.001, 0, 0, 0.001, 0, 0];\n    CompiledFont.call(this, fontMatrix);\n    this.glyphs = cffInfo.glyphs;\n    this.gsubrs = cffInfo.gsubrs || [];\n    this.subrs = cffInfo.subrs || [];\n    this.cmap = cmap;\n    this.glyphNameMap = glyphNameMap || GlyphsUnicode;\n\n    this.compiledGlyphs = [];\n    this.gsubrsBias = (this.gsubrs.length < 1240 ?\n                       107 : (this.gsubrs.length < 33900 ? 1131 : 32768));\n    this.subrsBias = (this.subrs.length < 1240 ?\n                      107 : (this.subrs.length < 33900 ? 1131 : 32768));\n  }\n\n  Util.inherit(Type2Compiled, CompiledFont, {\n    compileGlyphImpl: function (code, js) {\n      compileCharString(code, js, this);\n    }\n  });\n\n\n  return {\n    create: function FontRendererFactory_create(font) {\n      var data = new Uint8Array(font.data);\n      var cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm;\n      var numTables = getUshort(data, 4);\n      for (var i = 0, p = 12; i < numTables; i++, p += 16) {\n        var tag = bytesToString(data.subarray(p, p + 4));\n        var offset = getLong(data, p + 8);\n        var length = getLong(data, p + 12);\n        switch (tag) {\n          case 'cmap':\n            cmap = parseCmap(data, offset, offset + length);\n            break;\n          case 'glyf':\n            glyf = data.subarray(offset, offset + length);\n            break;\n          case 'loca':\n            loca = data.subarray(offset, offset + length);\n            break;\n          case 'head':\n            unitsPerEm = getUshort(data, offset + 18);\n            indexToLocFormat = getUshort(data, offset + 50);\n            break;\n          case 'CFF ':\n            cff = parseCff(data, offset, offset + length);\n            break;\n        }\n      }\n\n      if (glyf) {\n        var fontMatrix = (!unitsPerEm ? font.fontMatrix :\n                          [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0]);\n        return new TrueTypeCompiled(\n          parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix);\n      } else {\n        return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap);\n      }\n    }\n  };\n})();\n\n\nvar GlyphsUnicode = {\n  A: 0x0041,\n  AE: 0x00C6,\n  AEacute: 0x01FC,\n  AEmacron: 0x01E2,\n  AEsmall: 0xF7E6,\n  Aacute: 0x00C1,\n  Aacutesmall: 0xF7E1,\n  Abreve: 0x0102,\n  Abreveacute: 0x1EAE,\n  Abrevecyrillic: 0x04D0,\n  Abrevedotbelow: 0x1EB6,\n  Abrevegrave: 0x1EB0,\n  Abrevehookabove: 0x1EB2,\n  Abrevetilde: 0x1EB4,\n  Acaron: 0x01CD,\n  Acircle: 0x24B6,\n  Acircumflex: 0x00C2,\n  Acircumflexacute: 0x1EA4,\n  Acircumflexdotbelow: 0x1EAC,\n  Acircumflexgrave: 0x1EA6,\n  Acircumflexhookabove: 0x1EA8,\n  Acircumflexsmall: 0xF7E2,\n  Acircumflextilde: 0x1EAA,\n  Acute: 0xF6C9,\n  Acutesmall: 0xF7B4,\n  Acyrillic: 0x0410,\n  Adblgrave: 0x0200,\n  Adieresis: 0x00C4,\n  Adieresiscyrillic: 0x04D2,\n  Adieresismacron: 0x01DE,\n  Adieresissmall: 0xF7E4,\n  Adotbelow: 0x1EA0,\n  Adotmacron: 0x01E0,\n  Agrave: 0x00C0,\n  Agravesmall: 0xF7E0,\n  Ahookabove: 0x1EA2,\n  Aiecyrillic: 0x04D4,\n  Ainvertedbreve: 0x0202,\n  Alpha: 0x0391,\n  Alphatonos: 0x0386,\n  Amacron: 0x0100,\n  Amonospace: 0xFF21,\n  Aogonek: 0x0104,\n  Aring: 0x00C5,\n  Aringacute: 0x01FA,\n  Aringbelow: 0x1E00,\n  Aringsmall: 0xF7E5,\n  Asmall: 0xF761,\n  Atilde: 0x00C3,\n  Atildesmall: 0xF7E3,\n  Aybarmenian: 0x0531,\n  B: 0x0042,\n  Bcircle: 0x24B7,\n  Bdotaccent: 0x1E02,\n  Bdotbelow: 0x1E04,\n  Becyrillic: 0x0411,\n  Benarmenian: 0x0532,\n  Beta: 0x0392,\n  Bhook: 0x0181,\n  Blinebelow: 0x1E06,\n  Bmonospace: 0xFF22,\n  Brevesmall: 0xF6F4,\n  Bsmall: 0xF762,\n  Btopbar: 0x0182,\n  C: 0x0043,\n  Caarmenian: 0x053E,\n  Cacute: 0x0106,\n  Caron: 0xF6CA,\n  Caronsmall: 0xF6F5,\n  Ccaron: 0x010C,\n  Ccedilla: 0x00C7,\n  Ccedillaacute: 0x1E08,\n  Ccedillasmall: 0xF7E7,\n  Ccircle: 0x24B8,\n  Ccircumflex: 0x0108,\n  Cdot: 0x010A,\n  Cdotaccent: 0x010A,\n  Cedillasmall: 0xF7B8,\n  Chaarmenian: 0x0549,\n  Cheabkhasiancyrillic: 0x04BC,\n  Checyrillic: 0x0427,\n  Chedescenderabkhasiancyrillic: 0x04BE,\n  Chedescendercyrillic: 0x04B6,\n  Chedieresiscyrillic: 0x04F4,\n  Cheharmenian: 0x0543,\n  Chekhakassiancyrillic: 0x04CB,\n  Cheverticalstrokecyrillic: 0x04B8,\n  Chi: 0x03A7,\n  Chook: 0x0187,\n  Circumflexsmall: 0xF6F6,\n  Cmonospace: 0xFF23,\n  Coarmenian: 0x0551,\n  Csmall: 0xF763,\n  D: 0x0044,\n  DZ: 0x01F1,\n  DZcaron: 0x01C4,\n  Daarmenian: 0x0534,\n  Dafrican: 0x0189,\n  Dcaron: 0x010E,\n  Dcedilla: 0x1E10,\n  Dcircle: 0x24B9,\n  Dcircumflexbelow: 0x1E12,\n  Dcroat: 0x0110,\n  Ddotaccent: 0x1E0A,\n  Ddotbelow: 0x1E0C,\n  Decyrillic: 0x0414,\n  Deicoptic: 0x03EE,\n  Delta: 0x2206,\n  Deltagreek: 0x0394,\n  Dhook: 0x018A,\n  Dieresis: 0xF6CB,\n  DieresisAcute: 0xF6CC,\n  DieresisGrave: 0xF6CD,\n  Dieresissmall: 0xF7A8,\n  Digammagreek: 0x03DC,\n  Djecyrillic: 0x0402,\n  Dlinebelow: 0x1E0E,\n  Dmonospace: 0xFF24,\n  Dotaccentsmall: 0xF6F7,\n  Dslash: 0x0110,\n  Dsmall: 0xF764,\n  Dtopbar: 0x018B,\n  Dz: 0x01F2,\n  Dzcaron: 0x01C5,\n  Dzeabkhasiancyrillic: 0x04E0,\n  Dzecyrillic: 0x0405,\n  Dzhecyrillic: 0x040F,\n  E: 0x0045,\n  Eacute: 0x00C9,\n  Eacutesmall: 0xF7E9,\n  Ebreve: 0x0114,\n  Ecaron: 0x011A,\n  Ecedillabreve: 0x1E1C,\n  Echarmenian: 0x0535,\n  Ecircle: 0x24BA,\n  Ecircumflex: 0x00CA,\n  Ecircumflexacute: 0x1EBE,\n  Ecircumflexbelow: 0x1E18,\n  Ecircumflexdotbelow: 0x1EC6,\n  Ecircumflexgrave: 0x1EC0,\n  Ecircumflexhookabove: 0x1EC2,\n  Ecircumflexsmall: 0xF7EA,\n  Ecircumflextilde: 0x1EC4,\n  Ecyrillic: 0x0404,\n  Edblgrave: 0x0204,\n  Edieresis: 0x00CB,\n  Edieresissmall: 0xF7EB,\n  Edot: 0x0116,\n  Edotaccent: 0x0116,\n  Edotbelow: 0x1EB8,\n  Efcyrillic: 0x0424,\n  Egrave: 0x00C8,\n  Egravesmall: 0xF7E8,\n  Eharmenian: 0x0537,\n  Ehookabove: 0x1EBA,\n  Eightroman: 0x2167,\n  Einvertedbreve: 0x0206,\n  Eiotifiedcyrillic: 0x0464,\n  Elcyrillic: 0x041B,\n  Elevenroman: 0x216A,\n  Emacron: 0x0112,\n  Emacronacute: 0x1E16,\n  Emacrongrave: 0x1E14,\n  Emcyrillic: 0x041C,\n  Emonospace: 0xFF25,\n  Encyrillic: 0x041D,\n  Endescendercyrillic: 0x04A2,\n  Eng: 0x014A,\n  Enghecyrillic: 0x04A4,\n  Enhookcyrillic: 0x04C7,\n  Eogonek: 0x0118,\n  Eopen: 0x0190,\n  Epsilon: 0x0395,\n  Epsilontonos: 0x0388,\n  Ercyrillic: 0x0420,\n  Ereversed: 0x018E,\n  Ereversedcyrillic: 0x042D,\n  Escyrillic: 0x0421,\n  Esdescendercyrillic: 0x04AA,\n  Esh: 0x01A9,\n  Esmall: 0xF765,\n  Eta: 0x0397,\n  Etarmenian: 0x0538,\n  Etatonos: 0x0389,\n  Eth: 0x00D0,\n  Ethsmall: 0xF7F0,\n  Etilde: 0x1EBC,\n  Etildebelow: 0x1E1A,\n  Euro: 0x20AC,\n  Ezh: 0x01B7,\n  Ezhcaron: 0x01EE,\n  Ezhreversed: 0x01B8,\n  F: 0x0046,\n  Fcircle: 0x24BB,\n  Fdotaccent: 0x1E1E,\n  Feharmenian: 0x0556,\n  Feicoptic: 0x03E4,\n  Fhook: 0x0191,\n  Fitacyrillic: 0x0472,\n  Fiveroman: 0x2164,\n  Fmonospace: 0xFF26,\n  Fourroman: 0x2163,\n  Fsmall: 0xF766,\n  G: 0x0047,\n  GBsquare: 0x3387,\n  Gacute: 0x01F4,\n  Gamma: 0x0393,\n  Gammaafrican: 0x0194,\n  Gangiacoptic: 0x03EA,\n  Gbreve: 0x011E,\n  Gcaron: 0x01E6,\n  Gcedilla: 0x0122,\n  Gcircle: 0x24BC,\n  Gcircumflex: 0x011C,\n  Gcommaaccent: 0x0122,\n  Gdot: 0x0120,\n  Gdotaccent: 0x0120,\n  Gecyrillic: 0x0413,\n  Ghadarmenian: 0x0542,\n  Ghemiddlehookcyrillic: 0x0494,\n  Ghestrokecyrillic: 0x0492,\n  Gheupturncyrillic: 0x0490,\n  Ghook: 0x0193,\n  Gimarmenian: 0x0533,\n  Gjecyrillic: 0x0403,\n  Gmacron: 0x1E20,\n  Gmonospace: 0xFF27,\n  Grave: 0xF6CE,\n  Gravesmall: 0xF760,\n  Gsmall: 0xF767,\n  Gsmallhook: 0x029B,\n  Gstroke: 0x01E4,\n  H: 0x0048,\n  H18533: 0x25CF,\n  H18543: 0x25AA,\n  H18551: 0x25AB,\n  H22073: 0x25A1,\n  HPsquare: 0x33CB,\n  Haabkhasiancyrillic: 0x04A8,\n  Hadescendercyrillic: 0x04B2,\n  Hardsigncyrillic: 0x042A,\n  Hbar: 0x0126,\n  Hbrevebelow: 0x1E2A,\n  Hcedilla: 0x1E28,\n  Hcircle: 0x24BD,\n  Hcircumflex: 0x0124,\n  Hdieresis: 0x1E26,\n  Hdotaccent: 0x1E22,\n  Hdotbelow: 0x1E24,\n  Hmonospace: 0xFF28,\n  Hoarmenian: 0x0540,\n  Horicoptic: 0x03E8,\n  Hsmall: 0xF768,\n  Hungarumlaut: 0xF6CF,\n  Hungarumlautsmall: 0xF6F8,\n  Hzsquare: 0x3390,\n  I: 0x0049,\n  IAcyrillic: 0x042F,\n  IJ: 0x0132,\n  IUcyrillic: 0x042E,\n  Iacute: 0x00CD,\n  Iacutesmall: 0xF7ED,\n  Ibreve: 0x012C,\n  Icaron: 0x01CF,\n  Icircle: 0x24BE,\n  Icircumflex: 0x00CE,\n  Icircumflexsmall: 0xF7EE,\n  Icyrillic: 0x0406,\n  Idblgrave: 0x0208,\n  Idieresis: 0x00CF,\n  Idieresisacute: 0x1E2E,\n  Idieresiscyrillic: 0x04E4,\n  Idieresissmall: 0xF7EF,\n  Idot: 0x0130,\n  Idotaccent: 0x0130,\n  Idotbelow: 0x1ECA,\n  Iebrevecyrillic: 0x04D6,\n  Iecyrillic: 0x0415,\n  Ifraktur: 0x2111,\n  Igrave: 0x00CC,\n  Igravesmall: 0xF7EC,\n  Ihookabove: 0x1EC8,\n  Iicyrillic: 0x0418,\n  Iinvertedbreve: 0x020A,\n  Iishortcyrillic: 0x0419,\n  Imacron: 0x012A,\n  Imacroncyrillic: 0x04E2,\n  Imonospace: 0xFF29,\n  Iniarmenian: 0x053B,\n  Iocyrillic: 0x0401,\n  Iogonek: 0x012E,\n  Iota: 0x0399,\n  Iotaafrican: 0x0196,\n  Iotadieresis: 0x03AA,\n  Iotatonos: 0x038A,\n  Ismall: 0xF769,\n  Istroke: 0x0197,\n  Itilde: 0x0128,\n  Itildebelow: 0x1E2C,\n  Izhitsacyrillic: 0x0474,\n  Izhitsadblgravecyrillic: 0x0476,\n  J: 0x004A,\n  Jaarmenian: 0x0541,\n  Jcircle: 0x24BF,\n  Jcircumflex: 0x0134,\n  Jecyrillic: 0x0408,\n  Jheharmenian: 0x054B,\n  Jmonospace: 0xFF2A,\n  Jsmall: 0xF76A,\n  K: 0x004B,\n  KBsquare: 0x3385,\n  KKsquare: 0x33CD,\n  Kabashkircyrillic: 0x04A0,\n  Kacute: 0x1E30,\n  Kacyrillic: 0x041A,\n  Kadescendercyrillic: 0x049A,\n  Kahookcyrillic: 0x04C3,\n  Kappa: 0x039A,\n  Kastrokecyrillic: 0x049E,\n  Kaverticalstrokecyrillic: 0x049C,\n  Kcaron: 0x01E8,\n  Kcedilla: 0x0136,\n  Kcircle: 0x24C0,\n  Kcommaaccent: 0x0136,\n  Kdotbelow: 0x1E32,\n  Keharmenian: 0x0554,\n  Kenarmenian: 0x053F,\n  Khacyrillic: 0x0425,\n  Kheicoptic: 0x03E6,\n  Khook: 0x0198,\n  Kjecyrillic: 0x040C,\n  Klinebelow: 0x1E34,\n  Kmonospace: 0xFF2B,\n  Koppacyrillic: 0x0480,\n  Koppagreek: 0x03DE,\n  Ksicyrillic: 0x046E,\n  Ksmall: 0xF76B,\n  L: 0x004C,\n  LJ: 0x01C7,\n  LL: 0xF6BF,\n  Lacute: 0x0139,\n  Lambda: 0x039B,\n  Lcaron: 0x013D,\n  Lcedilla: 0x013B,\n  Lcircle: 0x24C1,\n  Lcircumflexbelow: 0x1E3C,\n  Lcommaaccent: 0x013B,\n  Ldot: 0x013F,\n  Ldotaccent: 0x013F,\n  Ldotbelow: 0x1E36,\n  Ldotbelowmacron: 0x1E38,\n  Liwnarmenian: 0x053C,\n  Lj: 0x01C8,\n  Ljecyrillic: 0x0409,\n  Llinebelow: 0x1E3A,\n  Lmonospace: 0xFF2C,\n  Lslash: 0x0141,\n  Lslashsmall: 0xF6F9,\n  Lsmall: 0xF76C,\n  M: 0x004D,\n  MBsquare: 0x3386,\n  Macron: 0xF6D0,\n  Macronsmall: 0xF7AF,\n  Macute: 0x1E3E,\n  Mcircle: 0x24C2,\n  Mdotaccent: 0x1E40,\n  Mdotbelow: 0x1E42,\n  Menarmenian: 0x0544,\n  Mmonospace: 0xFF2D,\n  Msmall: 0xF76D,\n  Mturned: 0x019C,\n  Mu: 0x039C,\n  N: 0x004E,\n  NJ: 0x01CA,\n  Nacute: 0x0143,\n  Ncaron: 0x0147,\n  Ncedilla: 0x0145,\n  Ncircle: 0x24C3,\n  Ncircumflexbelow: 0x1E4A,\n  Ncommaaccent: 0x0145,\n  Ndotaccent: 0x1E44,\n  Ndotbelow: 0x1E46,\n  Nhookleft: 0x019D,\n  Nineroman: 0x2168,\n  Nj: 0x01CB,\n  Njecyrillic: 0x040A,\n  Nlinebelow: 0x1E48,\n  Nmonospace: 0xFF2E,\n  Nowarmenian: 0x0546,\n  Nsmall: 0xF76E,\n  Ntilde: 0x00D1,\n  Ntildesmall: 0xF7F1,\n  Nu: 0x039D,\n  O: 0x004F,\n  OE: 0x0152,\n  OEsmall: 0xF6FA,\n  Oacute: 0x00D3,\n  Oacutesmall: 0xF7F3,\n  Obarredcyrillic: 0x04E8,\n  Obarreddieresiscyrillic: 0x04EA,\n  Obreve: 0x014E,\n  Ocaron: 0x01D1,\n  Ocenteredtilde: 0x019F,\n  Ocircle: 0x24C4,\n  Ocircumflex: 0x00D4,\n  Ocircumflexacute: 0x1ED0,\n  Ocircumflexdotbelow: 0x1ED8,\n  Ocircumflexgrave: 0x1ED2,\n  Ocircumflexhookabove: 0x1ED4,\n  Ocircumflexsmall: 0xF7F4,\n  Ocircumflextilde: 0x1ED6,\n  Ocyrillic: 0x041E,\n  Odblacute: 0x0150,\n  Odblgrave: 0x020C,\n  Odieresis: 0x00D6,\n  Odieresiscyrillic: 0x04E6,\n  Odieresissmall: 0xF7F6,\n  Odotbelow: 0x1ECC,\n  Ogoneksmall: 0xF6FB,\n  Ograve: 0x00D2,\n  Ogravesmall: 0xF7F2,\n  Oharmenian: 0x0555,\n  Ohm: 0x2126,\n  Ohookabove: 0x1ECE,\n  Ohorn: 0x01A0,\n  Ohornacute: 0x1EDA,\n  Ohorndotbelow: 0x1EE2,\n  Ohorngrave: 0x1EDC,\n  Ohornhookabove: 0x1EDE,\n  Ohorntilde: 0x1EE0,\n  Ohungarumlaut: 0x0150,\n  Oi: 0x01A2,\n  Oinvertedbreve: 0x020E,\n  Omacron: 0x014C,\n  Omacronacute: 0x1E52,\n  Omacrongrave: 0x1E50,\n  Omega: 0x2126,\n  Omegacyrillic: 0x0460,\n  Omegagreek: 0x03A9,\n  Omegaroundcyrillic: 0x047A,\n  Omegatitlocyrillic: 0x047C,\n  Omegatonos: 0x038F,\n  Omicron: 0x039F,\n  Omicrontonos: 0x038C,\n  Omonospace: 0xFF2F,\n  Oneroman: 0x2160,\n  Oogonek: 0x01EA,\n  Oogonekmacron: 0x01EC,\n  Oopen: 0x0186,\n  Oslash: 0x00D8,\n  Oslashacute: 0x01FE,\n  Oslashsmall: 0xF7F8,\n  Osmall: 0xF76F,\n  Ostrokeacute: 0x01FE,\n  Otcyrillic: 0x047E,\n  Otilde: 0x00D5,\n  Otildeacute: 0x1E4C,\n  Otildedieresis: 0x1E4E,\n  Otildesmall: 0xF7F5,\n  P: 0x0050,\n  Pacute: 0x1E54,\n  Pcircle: 0x24C5,\n  Pdotaccent: 0x1E56,\n  Pecyrillic: 0x041F,\n  Peharmenian: 0x054A,\n  Pemiddlehookcyrillic: 0x04A6,\n  Phi: 0x03A6,\n  Phook: 0x01A4,\n  Pi: 0x03A0,\n  Piwrarmenian: 0x0553,\n  Pmonospace: 0xFF30,\n  Psi: 0x03A8,\n  Psicyrillic: 0x0470,\n  Psmall: 0xF770,\n  Q: 0x0051,\n  Qcircle: 0x24C6,\n  Qmonospace: 0xFF31,\n  Qsmall: 0xF771,\n  R: 0x0052,\n  Raarmenian: 0x054C,\n  Racute: 0x0154,\n  Rcaron: 0x0158,\n  Rcedilla: 0x0156,\n  Rcircle: 0x24C7,\n  Rcommaaccent: 0x0156,\n  Rdblgrave: 0x0210,\n  Rdotaccent: 0x1E58,\n  Rdotbelow: 0x1E5A,\n  Rdotbelowmacron: 0x1E5C,\n  Reharmenian: 0x0550,\n  Rfraktur: 0x211C,\n  Rho: 0x03A1,\n  Ringsmall: 0xF6FC,\n  Rinvertedbreve: 0x0212,\n  Rlinebelow: 0x1E5E,\n  Rmonospace: 0xFF32,\n  Rsmall: 0xF772,\n  Rsmallinverted: 0x0281,\n  Rsmallinvertedsuperior: 0x02B6,\n  S: 0x0053,\n  SF010000: 0x250C,\n  SF020000: 0x2514,\n  SF030000: 0x2510,\n  SF040000: 0x2518,\n  SF050000: 0x253C,\n  SF060000: 0x252C,\n  SF070000: 0x2534,\n  SF080000: 0x251C,\n  SF090000: 0x2524,\n  SF100000: 0x2500,\n  SF110000: 0x2502,\n  SF190000: 0x2561,\n  SF200000: 0x2562,\n  SF210000: 0x2556,\n  SF220000: 0x2555,\n  SF230000: 0x2563,\n  SF240000: 0x2551,\n  SF250000: 0x2557,\n  SF260000: 0x255D,\n  SF270000: 0x255C,\n  SF280000: 0x255B,\n  SF360000: 0x255E,\n  SF370000: 0x255F,\n  SF380000: 0x255A,\n  SF390000: 0x2554,\n  SF400000: 0x2569,\n  SF410000: 0x2566,\n  SF420000: 0x2560,\n  SF430000: 0x2550,\n  SF440000: 0x256C,\n  SF450000: 0x2567,\n  SF460000: 0x2568,\n  SF470000: 0x2564,\n  SF480000: 0x2565,\n  SF490000: 0x2559,\n  SF500000: 0x2558,\n  SF510000: 0x2552,\n  SF520000: 0x2553,\n  SF530000: 0x256B,\n  SF540000: 0x256A,\n  Sacute: 0x015A,\n  Sacutedotaccent: 0x1E64,\n  Sampigreek: 0x03E0,\n  Scaron: 0x0160,\n  Scarondotaccent: 0x1E66,\n  Scaronsmall: 0xF6FD,\n  Scedilla: 0x015E,\n  Schwa: 0x018F,\n  Schwacyrillic: 0x04D8,\n  Schwadieresiscyrillic: 0x04DA,\n  Scircle: 0x24C8,\n  Scircumflex: 0x015C,\n  Scommaaccent: 0x0218,\n  Sdotaccent: 0x1E60,\n  Sdotbelow: 0x1E62,\n  Sdotbelowdotaccent: 0x1E68,\n  Seharmenian: 0x054D,\n  Sevenroman: 0x2166,\n  Shaarmenian: 0x0547,\n  Shacyrillic: 0x0428,\n  Shchacyrillic: 0x0429,\n  Sheicoptic: 0x03E2,\n  Shhacyrillic: 0x04BA,\n  Shimacoptic: 0x03EC,\n  Sigma: 0x03A3,\n  Sixroman: 0x2165,\n  Smonospace: 0xFF33,\n  Softsigncyrillic: 0x042C,\n  Ssmall: 0xF773,\n  Stigmagreek: 0x03DA,\n  T: 0x0054,\n  Tau: 0x03A4,\n  Tbar: 0x0166,\n  Tcaron: 0x0164,\n  Tcedilla: 0x0162,\n  Tcircle: 0x24C9,\n  Tcircumflexbelow: 0x1E70,\n  Tcommaaccent: 0x0162,\n  Tdotaccent: 0x1E6A,\n  Tdotbelow: 0x1E6C,\n  Tecyrillic: 0x0422,\n  Tedescendercyrillic: 0x04AC,\n  Tenroman: 0x2169,\n  Tetsecyrillic: 0x04B4,\n  Theta: 0x0398,\n  Thook: 0x01AC,\n  Thorn: 0x00DE,\n  Thornsmall: 0xF7FE,\n  Threeroman: 0x2162,\n  Tildesmall: 0xF6FE,\n  Tiwnarmenian: 0x054F,\n  Tlinebelow: 0x1E6E,\n  Tmonospace: 0xFF34,\n  Toarmenian: 0x0539,\n  Tonefive: 0x01BC,\n  Tonesix: 0x0184,\n  Tonetwo: 0x01A7,\n  Tretroflexhook: 0x01AE,\n  Tsecyrillic: 0x0426,\n  Tshecyrillic: 0x040B,\n  Tsmall: 0xF774,\n  Twelveroman: 0x216B,\n  Tworoman: 0x2161,\n  U: 0x0055,\n  Uacute: 0x00DA,\n  Uacutesmall: 0xF7FA,\n  Ubreve: 0x016C,\n  Ucaron: 0x01D3,\n  Ucircle: 0x24CA,\n  Ucircumflex: 0x00DB,\n  Ucircumflexbelow: 0x1E76,\n  Ucircumflexsmall: 0xF7FB,\n  Ucyrillic: 0x0423,\n  Udblacute: 0x0170,\n  Udblgrave: 0x0214,\n  Udieresis: 0x00DC,\n  Udieresisacute: 0x01D7,\n  Udieresisbelow: 0x1E72,\n  Udieresiscaron: 0x01D9,\n  Udieresiscyrillic: 0x04F0,\n  Udieresisgrave: 0x01DB,\n  Udieresismacron: 0x01D5,\n  Udieresissmall: 0xF7FC,\n  Udotbelow: 0x1EE4,\n  Ugrave: 0x00D9,\n  Ugravesmall: 0xF7F9,\n  Uhookabove: 0x1EE6,\n  Uhorn: 0x01AF,\n  Uhornacute: 0x1EE8,\n  Uhorndotbelow: 0x1EF0,\n  Uhorngrave: 0x1EEA,\n  Uhornhookabove: 0x1EEC,\n  Uhorntilde: 0x1EEE,\n  Uhungarumlaut: 0x0170,\n  Uhungarumlautcyrillic: 0x04F2,\n  Uinvertedbreve: 0x0216,\n  Ukcyrillic: 0x0478,\n  Umacron: 0x016A,\n  Umacroncyrillic: 0x04EE,\n  Umacrondieresis: 0x1E7A,\n  Umonospace: 0xFF35,\n  Uogonek: 0x0172,\n  Upsilon: 0x03A5,\n  Upsilon1: 0x03D2,\n  Upsilonacutehooksymbolgreek: 0x03D3,\n  Upsilonafrican: 0x01B1,\n  Upsilondieresis: 0x03AB,\n  Upsilondieresishooksymbolgreek: 0x03D4,\n  Upsilonhooksymbol: 0x03D2,\n  Upsilontonos: 0x038E,\n  Uring: 0x016E,\n  Ushortcyrillic: 0x040E,\n  Usmall: 0xF775,\n  Ustraightcyrillic: 0x04AE,\n  Ustraightstrokecyrillic: 0x04B0,\n  Utilde: 0x0168,\n  Utildeacute: 0x1E78,\n  Utildebelow: 0x1E74,\n  V: 0x0056,\n  Vcircle: 0x24CB,\n  Vdotbelow: 0x1E7E,\n  Vecyrillic: 0x0412,\n  Vewarmenian: 0x054E,\n  Vhook: 0x01B2,\n  Vmonospace: 0xFF36,\n  Voarmenian: 0x0548,\n  Vsmall: 0xF776,\n  Vtilde: 0x1E7C,\n  W: 0x0057,\n  Wacute: 0x1E82,\n  Wcircle: 0x24CC,\n  Wcircumflex: 0x0174,\n  Wdieresis: 0x1E84,\n  Wdotaccent: 0x1E86,\n  Wdotbelow: 0x1E88,\n  Wgrave: 0x1E80,\n  Wmonospace: 0xFF37,\n  Wsmall: 0xF777,\n  X: 0x0058,\n  Xcircle: 0x24CD,\n  Xdieresis: 0x1E8C,\n  Xdotaccent: 0x1E8A,\n  Xeharmenian: 0x053D,\n  Xi: 0x039E,\n  Xmonospace: 0xFF38,\n  Xsmall: 0xF778,\n  Y: 0x0059,\n  Yacute: 0x00DD,\n  Yacutesmall: 0xF7FD,\n  Yatcyrillic: 0x0462,\n  Ycircle: 0x24CE,\n  Ycircumflex: 0x0176,\n  Ydieresis: 0x0178,\n  Ydieresissmall: 0xF7FF,\n  Ydotaccent: 0x1E8E,\n  Ydotbelow: 0x1EF4,\n  Yericyrillic: 0x042B,\n  Yerudieresiscyrillic: 0x04F8,\n  Ygrave: 0x1EF2,\n  Yhook: 0x01B3,\n  Yhookabove: 0x1EF6,\n  Yiarmenian: 0x0545,\n  Yicyrillic: 0x0407,\n  Yiwnarmenian: 0x0552,\n  Ymonospace: 0xFF39,\n  Ysmall: 0xF779,\n  Ytilde: 0x1EF8,\n  Yusbigcyrillic: 0x046A,\n  Yusbigiotifiedcyrillic: 0x046C,\n  Yuslittlecyrillic: 0x0466,\n  Yuslittleiotifiedcyrillic: 0x0468,\n  Z: 0x005A,\n  Zaarmenian: 0x0536,\n  Zacute: 0x0179,\n  Zcaron: 0x017D,\n  Zcaronsmall: 0xF6FF,\n  Zcircle: 0x24CF,\n  Zcircumflex: 0x1E90,\n  Zdot: 0x017B,\n  Zdotaccent: 0x017B,\n  Zdotbelow: 0x1E92,\n  Zecyrillic: 0x0417,\n  Zedescendercyrillic: 0x0498,\n  Zedieresiscyrillic: 0x04DE,\n  Zeta: 0x0396,\n  Zhearmenian: 0x053A,\n  Zhebrevecyrillic: 0x04C1,\n  Zhecyrillic: 0x0416,\n  Zhedescendercyrillic: 0x0496,\n  Zhedieresiscyrillic: 0x04DC,\n  Zlinebelow: 0x1E94,\n  Zmonospace: 0xFF3A,\n  Zsmall: 0xF77A,\n  Zstroke: 0x01B5,\n  a: 0x0061,\n  aabengali: 0x0986,\n  aacute: 0x00E1,\n  aadeva: 0x0906,\n  aagujarati: 0x0A86,\n  aagurmukhi: 0x0A06,\n  aamatragurmukhi: 0x0A3E,\n  aarusquare: 0x3303,\n  aavowelsignbengali: 0x09BE,\n  aavowelsigndeva: 0x093E,\n  aavowelsigngujarati: 0x0ABE,\n  abbreviationmarkarmenian: 0x055F,\n  abbreviationsigndeva: 0x0970,\n  abengali: 0x0985,\n  abopomofo: 0x311A,\n  abreve: 0x0103,\n  abreveacute: 0x1EAF,\n  abrevecyrillic: 0x04D1,\n  abrevedotbelow: 0x1EB7,\n  abrevegrave: 0x1EB1,\n  abrevehookabove: 0x1EB3,\n  abrevetilde: 0x1EB5,\n  acaron: 0x01CE,\n  acircle: 0x24D0,\n  acircumflex: 0x00E2,\n  acircumflexacute: 0x1EA5,\n  acircumflexdotbelow: 0x1EAD,\n  acircumflexgrave: 0x1EA7,\n  acircumflexhookabove: 0x1EA9,\n  acircumflextilde: 0x1EAB,\n  acute: 0x00B4,\n  acutebelowcmb: 0x0317,\n  acutecmb: 0x0301,\n  acutecomb: 0x0301,\n  acutedeva: 0x0954,\n  acutelowmod: 0x02CF,\n  acutetonecmb: 0x0341,\n  acyrillic: 0x0430,\n  adblgrave: 0x0201,\n  addakgurmukhi: 0x0A71,\n  adeva: 0x0905,\n  adieresis: 0x00E4,\n  adieresiscyrillic: 0x04D3,\n  adieresismacron: 0x01DF,\n  adotbelow: 0x1EA1,\n  adotmacron: 0x01E1,\n  ae: 0x00E6,\n  aeacute: 0x01FD,\n  aekorean: 0x3150,\n  aemacron: 0x01E3,\n  afii00208: 0x2015,\n  afii08941: 0x20A4,\n  afii10017: 0x0410,\n  afii10018: 0x0411,\n  afii10019: 0x0412,\n  afii10020: 0x0413,\n  afii10021: 0x0414,\n  afii10022: 0x0415,\n  afii10023: 0x0401,\n  afii10024: 0x0416,\n  afii10025: 0x0417,\n  afii10026: 0x0418,\n  afii10027: 0x0419,\n  afii10028: 0x041A,\n  afii10029: 0x041B,\n  afii10030: 0x041C,\n  afii10031: 0x041D,\n  afii10032: 0x041E,\n  afii10033: 0x041F,\n  afii10034: 0x0420,\n  afii10035: 0x0421,\n  afii10036: 0x0422,\n  afii10037: 0x0423,\n  afii10038: 0x0424,\n  afii10039: 0x0425,\n  afii10040: 0x0426,\n  afii10041: 0x0427,\n  afii10042: 0x0428,\n  afii10043: 0x0429,\n  afii10044: 0x042A,\n  afii10045: 0x042B,\n  afii10046: 0x042C,\n  afii10047: 0x042D,\n  afii10048: 0x042E,\n  afii10049: 0x042F,\n  afii10050: 0x0490,\n  afii10051: 0x0402,\n  afii10052: 0x0403,\n  afii10053: 0x0404,\n  afii10054: 0x0405,\n  afii10055: 0x0406,\n  afii10056: 0x0407,\n  afii10057: 0x0408,\n  afii10058: 0x0409,\n  afii10059: 0x040A,\n  afii10060: 0x040B,\n  afii10061: 0x040C,\n  afii10062: 0x040E,\n  afii10063: 0xF6C4,\n  afii10064: 0xF6C5,\n  afii10065: 0x0430,\n  afii10066: 0x0431,\n  afii10067: 0x0432,\n  afii10068: 0x0433,\n  afii10069: 0x0434,\n  afii10070: 0x0435,\n  afii10071: 0x0451,\n  afii10072: 0x0436,\n  afii10073: 0x0437,\n  afii10074: 0x0438,\n  afii10075: 0x0439,\n  afii10076: 0x043A,\n  afii10077: 0x043B,\n  afii10078: 0x043C,\n  afii10079: 0x043D,\n  afii10080: 0x043E,\n  afii10081: 0x043F,\n  afii10082: 0x0440,\n  afii10083: 0x0441,\n  afii10084: 0x0442,\n  afii10085: 0x0443,\n  afii10086: 0x0444,\n  afii10087: 0x0445,\n  afii10088: 0x0446,\n  afii10089: 0x0447,\n  afii10090: 0x0448,\n  afii10091: 0x0449,\n  afii10092: 0x044A,\n  afii10093: 0x044B,\n  afii10094: 0x044C,\n  afii10095: 0x044D,\n  afii10096: 0x044E,\n  afii10097: 0x044F,\n  afii10098: 0x0491,\n  afii10099: 0x0452,\n  afii10100: 0x0453,\n  afii10101: 0x0454,\n  afii10102: 0x0455,\n  afii10103: 0x0456,\n  afii10104: 0x0457,\n  afii10105: 0x0458,\n  afii10106: 0x0459,\n  afii10107: 0x045A,\n  afii10108: 0x045B,\n  afii10109: 0x045C,\n  afii10110: 0x045E,\n  afii10145: 0x040F,\n  afii10146: 0x0462,\n  afii10147: 0x0472,\n  afii10148: 0x0474,\n  afii10192: 0xF6C6,\n  afii10193: 0x045F,\n  afii10194: 0x0463,\n  afii10195: 0x0473,\n  afii10196: 0x0475,\n  afii10831: 0xF6C7,\n  afii10832: 0xF6C8,\n  afii10846: 0x04D9,\n  afii299: 0x200E,\n  afii300: 0x200F,\n  afii301: 0x200D,\n  afii57381: 0x066A,\n  afii57388: 0x060C,\n  afii57392: 0x0660,\n  afii57393: 0x0661,\n  afii57394: 0x0662,\n  afii57395: 0x0663,\n  afii57396: 0x0664,\n  afii57397: 0x0665,\n  afii57398: 0x0666,\n  afii57399: 0x0667,\n  afii57400: 0x0668,\n  afii57401: 0x0669,\n  afii57403: 0x061B,\n  afii57407: 0x061F,\n  afii57409: 0x0621,\n  afii57410: 0x0622,\n  afii57411: 0x0623,\n  afii57412: 0x0624,\n  afii57413: 0x0625,\n  afii57414: 0x0626,\n  afii57415: 0x0627,\n  afii57416: 0x0628,\n  afii57417: 0x0629,\n  afii57418: 0x062A,\n  afii57419: 0x062B,\n  afii57420: 0x062C,\n  afii57421: 0x062D,\n  afii57422: 0x062E,\n  afii57423: 0x062F,\n  afii57424: 0x0630,\n  afii57425: 0x0631,\n  afii57426: 0x0632,\n  afii57427: 0x0633,\n  afii57428: 0x0634,\n  afii57429: 0x0635,\n  afii57430: 0x0636,\n  afii57431: 0x0637,\n  afii57432: 0x0638,\n  afii57433: 0x0639,\n  afii57434: 0x063A,\n  afii57440: 0x0640,\n  afii57441: 0x0641,\n  afii57442: 0x0642,\n  afii57443: 0x0643,\n  afii57444: 0x0644,\n  afii57445: 0x0645,\n  afii57446: 0x0646,\n  afii57448: 0x0648,\n  afii57449: 0x0649,\n  afii57450: 0x064A,\n  afii57451: 0x064B,\n  afii57452: 0x064C,\n  afii57453: 0x064D,\n  afii57454: 0x064E,\n  afii57455: 0x064F,\n  afii57456: 0x0650,\n  afii57457: 0x0651,\n  afii57458: 0x0652,\n  afii57470: 0x0647,\n  afii57505: 0x06A4,\n  afii57506: 0x067E,\n  afii57507: 0x0686,\n  afii57508: 0x0698,\n  afii57509: 0x06AF,\n  afii57511: 0x0679,\n  afii57512: 0x0688,\n  afii57513: 0x0691,\n  afii57514: 0x06BA,\n  afii57519: 0x06D2,\n  afii57534: 0x06D5,\n  afii57636: 0x20AA,\n  afii57645: 0x05BE,\n  afii57658: 0x05C3,\n  afii57664: 0x05D0,\n  afii57665: 0x05D1,\n  afii57666: 0x05D2,\n  afii57667: 0x05D3,\n  afii57668: 0x05D4,\n  afii57669: 0x05D5,\n  afii57670: 0x05D6,\n  afii57671: 0x05D7,\n  afii57672: 0x05D8,\n  afii57673: 0x05D9,\n  afii57674: 0x05DA,\n  afii57675: 0x05DB,\n  afii57676: 0x05DC,\n  afii57677: 0x05DD,\n  afii57678: 0x05DE,\n  afii57679: 0x05DF,\n  afii57680: 0x05E0,\n  afii57681: 0x05E1,\n  afii57682: 0x05E2,\n  afii57683: 0x05E3,\n  afii57684: 0x05E4,\n  afii57685: 0x05E5,\n  afii57686: 0x05E6,\n  afii57687: 0x05E7,\n  afii57688: 0x05E8,\n  afii57689: 0x05E9,\n  afii57690: 0x05EA,\n  afii57694: 0xFB2A,\n  afii57695: 0xFB2B,\n  afii57700: 0xFB4B,\n  afii57705: 0xFB1F,\n  afii57716: 0x05F0,\n  afii57717: 0x05F1,\n  afii57718: 0x05F2,\n  afii57723: 0xFB35,\n  afii57793: 0x05B4,\n  afii57794: 0x05B5,\n  afii57795: 0x05B6,\n  afii57796: 0x05BB,\n  afii57797: 0x05B8,\n  afii57798: 0x05B7,\n  afii57799: 0x05B0,\n  afii57800: 0x05B2,\n  afii57801: 0x05B1,\n  afii57802: 0x05B3,\n  afii57803: 0x05C2,\n  afii57804: 0x05C1,\n  afii57806: 0x05B9,\n  afii57807: 0x05BC,\n  afii57839: 0x05BD,\n  afii57841: 0x05BF,\n  afii57842: 0x05C0,\n  afii57929: 0x02BC,\n  afii61248: 0x2105,\n  afii61289: 0x2113,\n  afii61352: 0x2116,\n  afii61573: 0x202C,\n  afii61574: 0x202D,\n  afii61575: 0x202E,\n  afii61664: 0x200C,\n  afii63167: 0x066D,\n  afii64937: 0x02BD,\n  agrave: 0x00E0,\n  agujarati: 0x0A85,\n  agurmukhi: 0x0A05,\n  ahiragana: 0x3042,\n  ahookabove: 0x1EA3,\n  aibengali: 0x0990,\n  aibopomofo: 0x311E,\n  aideva: 0x0910,\n  aiecyrillic: 0x04D5,\n  aigujarati: 0x0A90,\n  aigurmukhi: 0x0A10,\n  aimatragurmukhi: 0x0A48,\n  ainarabic: 0x0639,\n  ainfinalarabic: 0xFECA,\n  aininitialarabic: 0xFECB,\n  ainmedialarabic: 0xFECC,\n  ainvertedbreve: 0x0203,\n  aivowelsignbengali: 0x09C8,\n  aivowelsigndeva: 0x0948,\n  aivowelsigngujarati: 0x0AC8,\n  akatakana: 0x30A2,\n  akatakanahalfwidth: 0xFF71,\n  akorean: 0x314F,\n  alef: 0x05D0,\n  alefarabic: 0x0627,\n  alefdageshhebrew: 0xFB30,\n  aleffinalarabic: 0xFE8E,\n  alefhamzaabovearabic: 0x0623,\n  alefhamzaabovefinalarabic: 0xFE84,\n  alefhamzabelowarabic: 0x0625,\n  alefhamzabelowfinalarabic: 0xFE88,\n  alefhebrew: 0x05D0,\n  aleflamedhebrew: 0xFB4F,\n  alefmaddaabovearabic: 0x0622,\n  alefmaddaabovefinalarabic: 0xFE82,\n  alefmaksuraarabic: 0x0649,\n  alefmaksurafinalarabic: 0xFEF0,\n  alefmaksurainitialarabic: 0xFEF3,\n  alefmaksuramedialarabic: 0xFEF4,\n  alefpatahhebrew: 0xFB2E,\n  alefqamatshebrew: 0xFB2F,\n  aleph: 0x2135,\n  allequal: 0x224C,\n  alpha: 0x03B1,\n  alphatonos: 0x03AC,\n  amacron: 0x0101,\n  amonospace: 0xFF41,\n  ampersand: 0x0026,\n  ampersandmonospace: 0xFF06,\n  ampersandsmall: 0xF726,\n  amsquare: 0x33C2,\n  anbopomofo: 0x3122,\n  angbopomofo: 0x3124,\n  angbracketleft: 0x3008, // This glyph is missing from Adobe's original list.\n  angbracketright: 0x3009, // This glyph is missing from Adobe's original list.\n  angkhankhuthai: 0x0E5A,\n  angle: 0x2220,\n  anglebracketleft: 0x3008,\n  anglebracketleftvertical: 0xFE3F,\n  anglebracketright: 0x3009,\n  anglebracketrightvertical: 0xFE40,\n  angleleft: 0x2329,\n  angleright: 0x232A,\n  angstrom: 0x212B,\n  anoteleia: 0x0387,\n  anudattadeva: 0x0952,\n  anusvarabengali: 0x0982,\n  anusvaradeva: 0x0902,\n  anusvaragujarati: 0x0A82,\n  aogonek: 0x0105,\n  apaatosquare: 0x3300,\n  aparen: 0x249C,\n  apostrophearmenian: 0x055A,\n  apostrophemod: 0x02BC,\n  apple: 0xF8FF,\n  approaches: 0x2250,\n  approxequal: 0x2248,\n  approxequalorimage: 0x2252,\n  approximatelyequal: 0x2245,\n  araeaekorean: 0x318E,\n  araeakorean: 0x318D,\n  arc: 0x2312,\n  arighthalfring: 0x1E9A,\n  aring: 0x00E5,\n  aringacute: 0x01FB,\n  aringbelow: 0x1E01,\n  arrowboth: 0x2194,\n  arrowdashdown: 0x21E3,\n  arrowdashleft: 0x21E0,\n  arrowdashright: 0x21E2,\n  arrowdashup: 0x21E1,\n  arrowdblboth: 0x21D4,\n  arrowdbldown: 0x21D3,\n  arrowdblleft: 0x21D0,\n  arrowdblright: 0x21D2,\n  arrowdblup: 0x21D1,\n  arrowdown: 0x2193,\n  arrowdownleft: 0x2199,\n  arrowdownright: 0x2198,\n  arrowdownwhite: 0x21E9,\n  arrowheaddownmod: 0x02C5,\n  arrowheadleftmod: 0x02C2,\n  arrowheadrightmod: 0x02C3,\n  arrowheadupmod: 0x02C4,\n  arrowhorizex: 0xF8E7,\n  arrowleft: 0x2190,\n  arrowleftdbl: 0x21D0,\n  arrowleftdblstroke: 0x21CD,\n  arrowleftoverright: 0x21C6,\n  arrowleftwhite: 0x21E6,\n  arrowright: 0x2192,\n  arrowrightdblstroke: 0x21CF,\n  arrowrightheavy: 0x279E,\n  arrowrightoverleft: 0x21C4,\n  arrowrightwhite: 0x21E8,\n  arrowtableft: 0x21E4,\n  arrowtabright: 0x21E5,\n  arrowup: 0x2191,\n  arrowupdn: 0x2195,\n  arrowupdnbse: 0x21A8,\n  arrowupdownbase: 0x21A8,\n  arrowupleft: 0x2196,\n  arrowupleftofdown: 0x21C5,\n  arrowupright: 0x2197,\n  arrowupwhite: 0x21E7,\n  arrowvertex: 0xF8E6,\n  asciicircum: 0x005E,\n  asciicircummonospace: 0xFF3E,\n  asciitilde: 0x007E,\n  asciitildemonospace: 0xFF5E,\n  ascript: 0x0251,\n  ascriptturned: 0x0252,\n  asmallhiragana: 0x3041,\n  asmallkatakana: 0x30A1,\n  asmallkatakanahalfwidth: 0xFF67,\n  asterisk: 0x002A,\n  asteriskaltonearabic: 0x066D,\n  asteriskarabic: 0x066D,\n  asteriskmath: 0x2217,\n  asteriskmonospace: 0xFF0A,\n  asterisksmall: 0xFE61,\n  asterism: 0x2042,\n  asuperior: 0xF6E9,\n  asymptoticallyequal: 0x2243,\n  at: 0x0040,\n  atilde: 0x00E3,\n  atmonospace: 0xFF20,\n  atsmall: 0xFE6B,\n  aturned: 0x0250,\n  aubengali: 0x0994,\n  aubopomofo: 0x3120,\n  audeva: 0x0914,\n  augujarati: 0x0A94,\n  augurmukhi: 0x0A14,\n  aulengthmarkbengali: 0x09D7,\n  aumatragurmukhi: 0x0A4C,\n  auvowelsignbengali: 0x09CC,\n  auvowelsigndeva: 0x094C,\n  auvowelsigngujarati: 0x0ACC,\n  avagrahadeva: 0x093D,\n  aybarmenian: 0x0561,\n  ayin: 0x05E2,\n  ayinaltonehebrew: 0xFB20,\n  ayinhebrew: 0x05E2,\n  b: 0x0062,\n  babengali: 0x09AC,\n  backslash: 0x005C,\n  backslashmonospace: 0xFF3C,\n  badeva: 0x092C,\n  bagujarati: 0x0AAC,\n  bagurmukhi: 0x0A2C,\n  bahiragana: 0x3070,\n  bahtthai: 0x0E3F,\n  bakatakana: 0x30D0,\n  bar: 0x007C,\n  barmonospace: 0xFF5C,\n  bbopomofo: 0x3105,\n  bcircle: 0x24D1,\n  bdotaccent: 0x1E03,\n  bdotbelow: 0x1E05,\n  beamedsixteenthnotes: 0x266C,\n  because: 0x2235,\n  becyrillic: 0x0431,\n  beharabic: 0x0628,\n  behfinalarabic: 0xFE90,\n  behinitialarabic: 0xFE91,\n  behiragana: 0x3079,\n  behmedialarabic: 0xFE92,\n  behmeeminitialarabic: 0xFC9F,\n  behmeemisolatedarabic: 0xFC08,\n  behnoonfinalarabic: 0xFC6D,\n  bekatakana: 0x30D9,\n  benarmenian: 0x0562,\n  bet: 0x05D1,\n  beta: 0x03B2,\n  betasymbolgreek: 0x03D0,\n  betdagesh: 0xFB31,\n  betdageshhebrew: 0xFB31,\n  bethebrew: 0x05D1,\n  betrafehebrew: 0xFB4C,\n  bhabengali: 0x09AD,\n  bhadeva: 0x092D,\n  bhagujarati: 0x0AAD,\n  bhagurmukhi: 0x0A2D,\n  bhook: 0x0253,\n  bihiragana: 0x3073,\n  bikatakana: 0x30D3,\n  bilabialclick: 0x0298,\n  bindigurmukhi: 0x0A02,\n  birusquare: 0x3331,\n  blackcircle: 0x25CF,\n  blackdiamond: 0x25C6,\n  blackdownpointingtriangle: 0x25BC,\n  blackleftpointingpointer: 0x25C4,\n  blackleftpointingtriangle: 0x25C0,\n  blacklenticularbracketleft: 0x3010,\n  blacklenticularbracketleftvertical: 0xFE3B,\n  blacklenticularbracketright: 0x3011,\n  blacklenticularbracketrightvertical: 0xFE3C,\n  blacklowerlefttriangle: 0x25E3,\n  blacklowerrighttriangle: 0x25E2,\n  blackrectangle: 0x25AC,\n  blackrightpointingpointer: 0x25BA,\n  blackrightpointingtriangle: 0x25B6,\n  blacksmallsquare: 0x25AA,\n  blacksmilingface: 0x263B,\n  blacksquare: 0x25A0,\n  blackstar: 0x2605,\n  blackupperlefttriangle: 0x25E4,\n  blackupperrighttriangle: 0x25E5,\n  blackuppointingsmalltriangle: 0x25B4,\n  blackuppointingtriangle: 0x25B2,\n  blank: 0x2423,\n  blinebelow: 0x1E07,\n  block: 0x2588,\n  bmonospace: 0xFF42,\n  bobaimaithai: 0x0E1A,\n  bohiragana: 0x307C,\n  bokatakana: 0x30DC,\n  bparen: 0x249D,\n  bqsquare: 0x33C3,\n  braceex: 0xF8F4,\n  braceleft: 0x007B,\n  braceleftbt: 0xF8F3,\n  braceleftmid: 0xF8F2,\n  braceleftmonospace: 0xFF5B,\n  braceleftsmall: 0xFE5B,\n  bracelefttp: 0xF8F1,\n  braceleftvertical: 0xFE37,\n  braceright: 0x007D,\n  bracerightbt: 0xF8FE,\n  bracerightmid: 0xF8FD,\n  bracerightmonospace: 0xFF5D,\n  bracerightsmall: 0xFE5C,\n  bracerighttp: 0xF8FC,\n  bracerightvertical: 0xFE38,\n  bracketleft: 0x005B,\n  bracketleftbt: 0xF8F0,\n  bracketleftex: 0xF8EF,\n  bracketleftmonospace: 0xFF3B,\n  bracketlefttp: 0xF8EE,\n  bracketright: 0x005D,\n  bracketrightbt: 0xF8FB,\n  bracketrightex: 0xF8FA,\n  bracketrightmonospace: 0xFF3D,\n  bracketrighttp: 0xF8F9,\n  breve: 0x02D8,\n  brevebelowcmb: 0x032E,\n  brevecmb: 0x0306,\n  breveinvertedbelowcmb: 0x032F,\n  breveinvertedcmb: 0x0311,\n  breveinverteddoublecmb: 0x0361,\n  bridgebelowcmb: 0x032A,\n  bridgeinvertedbelowcmb: 0x033A,\n  brokenbar: 0x00A6,\n  bstroke: 0x0180,\n  bsuperior: 0xF6EA,\n  btopbar: 0x0183,\n  buhiragana: 0x3076,\n  bukatakana: 0x30D6,\n  bullet: 0x2022,\n  bulletinverse: 0x25D8,\n  bulletoperator: 0x2219,\n  bullseye: 0x25CE,\n  c: 0x0063,\n  caarmenian: 0x056E,\n  cabengali: 0x099A,\n  cacute: 0x0107,\n  cadeva: 0x091A,\n  cagujarati: 0x0A9A,\n  cagurmukhi: 0x0A1A,\n  calsquare: 0x3388,\n  candrabindubengali: 0x0981,\n  candrabinducmb: 0x0310,\n  candrabindudeva: 0x0901,\n  candrabindugujarati: 0x0A81,\n  capslock: 0x21EA,\n  careof: 0x2105,\n  caron: 0x02C7,\n  caronbelowcmb: 0x032C,\n  caroncmb: 0x030C,\n  carriagereturn: 0x21B5,\n  cbopomofo: 0x3118,\n  ccaron: 0x010D,\n  ccedilla: 0x00E7,\n  ccedillaacute: 0x1E09,\n  ccircle: 0x24D2,\n  ccircumflex: 0x0109,\n  ccurl: 0x0255,\n  cdot: 0x010B,\n  cdotaccent: 0x010B,\n  cdsquare: 0x33C5,\n  cedilla: 0x00B8,\n  cedillacmb: 0x0327,\n  cent: 0x00A2,\n  centigrade: 0x2103,\n  centinferior: 0xF6DF,\n  centmonospace: 0xFFE0,\n  centoldstyle: 0xF7A2,\n  centsuperior: 0xF6E0,\n  chaarmenian: 0x0579,\n  chabengali: 0x099B,\n  chadeva: 0x091B,\n  chagujarati: 0x0A9B,\n  chagurmukhi: 0x0A1B,\n  chbopomofo: 0x3114,\n  cheabkhasiancyrillic: 0x04BD,\n  checkmark: 0x2713,\n  checyrillic: 0x0447,\n  chedescenderabkhasiancyrillic: 0x04BF,\n  chedescendercyrillic: 0x04B7,\n  chedieresiscyrillic: 0x04F5,\n  cheharmenian: 0x0573,\n  chekhakassiancyrillic: 0x04CC,\n  cheverticalstrokecyrillic: 0x04B9,\n  chi: 0x03C7,\n  chieuchacirclekorean: 0x3277,\n  chieuchaparenkorean: 0x3217,\n  chieuchcirclekorean: 0x3269,\n  chieuchkorean: 0x314A,\n  chieuchparenkorean: 0x3209,\n  chochangthai: 0x0E0A,\n  chochanthai: 0x0E08,\n  chochingthai: 0x0E09,\n  chochoethai: 0x0E0C,\n  chook: 0x0188,\n  cieucacirclekorean: 0x3276,\n  cieucaparenkorean: 0x3216,\n  cieuccirclekorean: 0x3268,\n  cieuckorean: 0x3148,\n  cieucparenkorean: 0x3208,\n  cieucuparenkorean: 0x321C,\n  circle: 0x25CB,\n  circlecopyrt: 0x00A9, // This glyph is missing from Adobe's original list.\n  circlemultiply: 0x2297,\n  circleot: 0x2299,\n  circleplus: 0x2295,\n  circlepostalmark: 0x3036,\n  circlewithlefthalfblack: 0x25D0,\n  circlewithrighthalfblack: 0x25D1,\n  circumflex: 0x02C6,\n  circumflexbelowcmb: 0x032D,\n  circumflexcmb: 0x0302,\n  clear: 0x2327,\n  clickalveolar: 0x01C2,\n  clickdental: 0x01C0,\n  clicklateral: 0x01C1,\n  clickretroflex: 0x01C3,\n  club: 0x2663,\n  clubsuitblack: 0x2663,\n  clubsuitwhite: 0x2667,\n  cmcubedsquare: 0x33A4,\n  cmonospace: 0xFF43,\n  cmsquaredsquare: 0x33A0,\n  coarmenian: 0x0581,\n  colon: 0x003A,\n  colonmonetary: 0x20A1,\n  colonmonospace: 0xFF1A,\n  colonsign: 0x20A1,\n  colonsmall: 0xFE55,\n  colontriangularhalfmod: 0x02D1,\n  colontriangularmod: 0x02D0,\n  comma: 0x002C,\n  commaabovecmb: 0x0313,\n  commaaboverightcmb: 0x0315,\n  commaaccent: 0xF6C3,\n  commaarabic: 0x060C,\n  commaarmenian: 0x055D,\n  commainferior: 0xF6E1,\n  commamonospace: 0xFF0C,\n  commareversedabovecmb: 0x0314,\n  commareversedmod: 0x02BD,\n  commasmall: 0xFE50,\n  commasuperior: 0xF6E2,\n  commaturnedabovecmb: 0x0312,\n  commaturnedmod: 0x02BB,\n  compass: 0x263C,\n  congruent: 0x2245,\n  contourintegral: 0x222E,\n  control: 0x2303,\n  controlACK: 0x0006,\n  controlBEL: 0x0007,\n  controlBS: 0x0008,\n  controlCAN: 0x0018,\n  controlCR: 0x000D,\n  controlDC1: 0x0011,\n  controlDC2: 0x0012,\n  controlDC3: 0x0013,\n  controlDC4: 0x0014,\n  controlDEL: 0x007F,\n  controlDLE: 0x0010,\n  controlEM: 0x0019,\n  controlENQ: 0x0005,\n  controlEOT: 0x0004,\n  controlESC: 0x001B,\n  controlETB: 0x0017,\n  controlETX: 0x0003,\n  controlFF: 0x000C,\n  controlFS: 0x001C,\n  controlGS: 0x001D,\n  controlHT: 0x0009,\n  controlLF: 0x000A,\n  controlNAK: 0x0015,\n  controlRS: 0x001E,\n  controlSI: 0x000F,\n  controlSO: 0x000E,\n  controlSOT: 0x0002,\n  controlSTX: 0x0001,\n  controlSUB: 0x001A,\n  controlSYN: 0x0016,\n  controlUS: 0x001F,\n  controlVT: 0x000B,\n  copyright: 0x00A9,\n  copyrightsans: 0xF8E9,\n  copyrightserif: 0xF6D9,\n  cornerbracketleft: 0x300C,\n  cornerbracketlefthalfwidth: 0xFF62,\n  cornerbracketleftvertical: 0xFE41,\n  cornerbracketright: 0x300D,\n  cornerbracketrighthalfwidth: 0xFF63,\n  cornerbracketrightvertical: 0xFE42,\n  corporationsquare: 0x337F,\n  cosquare: 0x33C7,\n  coverkgsquare: 0x33C6,\n  cparen: 0x249E,\n  cruzeiro: 0x20A2,\n  cstretched: 0x0297,\n  curlyand: 0x22CF,\n  curlyor: 0x22CE,\n  currency: 0x00A4,\n  cyrBreve: 0xF6D1,\n  cyrFlex: 0xF6D2,\n  cyrbreve: 0xF6D4,\n  cyrflex: 0xF6D5,\n  d: 0x0064,\n  daarmenian: 0x0564,\n  dabengali: 0x09A6,\n  dadarabic: 0x0636,\n  dadeva: 0x0926,\n  dadfinalarabic: 0xFEBE,\n  dadinitialarabic: 0xFEBF,\n  dadmedialarabic: 0xFEC0,\n  dagesh: 0x05BC,\n  dageshhebrew: 0x05BC,\n  dagger: 0x2020,\n  daggerdbl: 0x2021,\n  dagujarati: 0x0AA6,\n  dagurmukhi: 0x0A26,\n  dahiragana: 0x3060,\n  dakatakana: 0x30C0,\n  dalarabic: 0x062F,\n  dalet: 0x05D3,\n  daletdagesh: 0xFB33,\n  daletdageshhebrew: 0xFB33,\n  dalethebrew: 0x05D3,\n  dalfinalarabic: 0xFEAA,\n  dammaarabic: 0x064F,\n  dammalowarabic: 0x064F,\n  dammatanaltonearabic: 0x064C,\n  dammatanarabic: 0x064C,\n  danda: 0x0964,\n  dargahebrew: 0x05A7,\n  dargalefthebrew: 0x05A7,\n  dasiapneumatacyrilliccmb: 0x0485,\n  dblGrave: 0xF6D3,\n  dblanglebracketleft: 0x300A,\n  dblanglebracketleftvertical: 0xFE3D,\n  dblanglebracketright: 0x300B,\n  dblanglebracketrightvertical: 0xFE3E,\n  dblarchinvertedbelowcmb: 0x032B,\n  dblarrowleft: 0x21D4,\n  dblarrowright: 0x21D2,\n  dbldanda: 0x0965,\n  dblgrave: 0xF6D6,\n  dblgravecmb: 0x030F,\n  dblintegral: 0x222C,\n  dbllowline: 0x2017,\n  dbllowlinecmb: 0x0333,\n  dbloverlinecmb: 0x033F,\n  dblprimemod: 0x02BA,\n  dblverticalbar: 0x2016,\n  dblverticallineabovecmb: 0x030E,\n  dbopomofo: 0x3109,\n  dbsquare: 0x33C8,\n  dcaron: 0x010F,\n  dcedilla: 0x1E11,\n  dcircle: 0x24D3,\n  dcircumflexbelow: 0x1E13,\n  dcroat: 0x0111,\n  ddabengali: 0x09A1,\n  ddadeva: 0x0921,\n  ddagujarati: 0x0AA1,\n  ddagurmukhi: 0x0A21,\n  ddalarabic: 0x0688,\n  ddalfinalarabic: 0xFB89,\n  dddhadeva: 0x095C,\n  ddhabengali: 0x09A2,\n  ddhadeva: 0x0922,\n  ddhagujarati: 0x0AA2,\n  ddhagurmukhi: 0x0A22,\n  ddotaccent: 0x1E0B,\n  ddotbelow: 0x1E0D,\n  decimalseparatorarabic: 0x066B,\n  decimalseparatorpersian: 0x066B,\n  decyrillic: 0x0434,\n  degree: 0x00B0,\n  dehihebrew: 0x05AD,\n  dehiragana: 0x3067,\n  deicoptic: 0x03EF,\n  dekatakana: 0x30C7,\n  deleteleft: 0x232B,\n  deleteright: 0x2326,\n  delta: 0x03B4,\n  deltaturned: 0x018D,\n  denominatorminusonenumeratorbengali: 0x09F8,\n  dezh: 0x02A4,\n  dhabengali: 0x09A7,\n  dhadeva: 0x0927,\n  dhagujarati: 0x0AA7,\n  dhagurmukhi: 0x0A27,\n  dhook: 0x0257,\n  dialytikatonos: 0x0385,\n  dialytikatonoscmb: 0x0344,\n  diamond: 0x2666,\n  diamondsuitwhite: 0x2662,\n  dieresis: 0x00A8,\n  dieresisacute: 0xF6D7,\n  dieresisbelowcmb: 0x0324,\n  dieresiscmb: 0x0308,\n  dieresisgrave: 0xF6D8,\n  dieresistonos: 0x0385,\n  dihiragana: 0x3062,\n  dikatakana: 0x30C2,\n  dittomark: 0x3003,\n  divide: 0x00F7,\n  divides: 0x2223,\n  divisionslash: 0x2215,\n  djecyrillic: 0x0452,\n  dkshade: 0x2593,\n  dlinebelow: 0x1E0F,\n  dlsquare: 0x3397,\n  dmacron: 0x0111,\n  dmonospace: 0xFF44,\n  dnblock: 0x2584,\n  dochadathai: 0x0E0E,\n  dodekthai: 0x0E14,\n  dohiragana: 0x3069,\n  dokatakana: 0x30C9,\n  dollar: 0x0024,\n  dollarinferior: 0xF6E3,\n  dollarmonospace: 0xFF04,\n  dollaroldstyle: 0xF724,\n  dollarsmall: 0xFE69,\n  dollarsuperior: 0xF6E4,\n  dong: 0x20AB,\n  dorusquare: 0x3326,\n  dotaccent: 0x02D9,\n  dotaccentcmb: 0x0307,\n  dotbelowcmb: 0x0323,\n  dotbelowcomb: 0x0323,\n  dotkatakana: 0x30FB,\n  dotlessi: 0x0131,\n  dotlessj: 0xF6BE,\n  dotlessjstrokehook: 0x0284,\n  dotmath: 0x22C5,\n  dottedcircle: 0x25CC,\n  doubleyodpatah: 0xFB1F,\n  doubleyodpatahhebrew: 0xFB1F,\n  downtackbelowcmb: 0x031E,\n  downtackmod: 0x02D5,\n  dparen: 0x249F,\n  dsuperior: 0xF6EB,\n  dtail: 0x0256,\n  dtopbar: 0x018C,\n  duhiragana: 0x3065,\n  dukatakana: 0x30C5,\n  dz: 0x01F3,\n  dzaltone: 0x02A3,\n  dzcaron: 0x01C6,\n  dzcurl: 0x02A5,\n  dzeabkhasiancyrillic: 0x04E1,\n  dzecyrillic: 0x0455,\n  dzhecyrillic: 0x045F,\n  e: 0x0065,\n  eacute: 0x00E9,\n  earth: 0x2641,\n  ebengali: 0x098F,\n  ebopomofo: 0x311C,\n  ebreve: 0x0115,\n  ecandradeva: 0x090D,\n  ecandragujarati: 0x0A8D,\n  ecandravowelsigndeva: 0x0945,\n  ecandravowelsigngujarati: 0x0AC5,\n  ecaron: 0x011B,\n  ecedillabreve: 0x1E1D,\n  echarmenian: 0x0565,\n  echyiwnarmenian: 0x0587,\n  ecircle: 0x24D4,\n  ecircumflex: 0x00EA,\n  ecircumflexacute: 0x1EBF,\n  ecircumflexbelow: 0x1E19,\n  ecircumflexdotbelow: 0x1EC7,\n  ecircumflexgrave: 0x1EC1,\n  ecircumflexhookabove: 0x1EC3,\n  ecircumflextilde: 0x1EC5,\n  ecyrillic: 0x0454,\n  edblgrave: 0x0205,\n  edeva: 0x090F,\n  edieresis: 0x00EB,\n  edot: 0x0117,\n  edotaccent: 0x0117,\n  edotbelow: 0x1EB9,\n  eegurmukhi: 0x0A0F,\n  eematragurmukhi: 0x0A47,\n  efcyrillic: 0x0444,\n  egrave: 0x00E8,\n  egujarati: 0x0A8F,\n  eharmenian: 0x0567,\n  ehbopomofo: 0x311D,\n  ehiragana: 0x3048,\n  ehookabove: 0x1EBB,\n  eibopomofo: 0x311F,\n  eight: 0x0038,\n  eightarabic: 0x0668,\n  eightbengali: 0x09EE,\n  eightcircle: 0x2467,\n  eightcircleinversesansserif: 0x2791,\n  eightdeva: 0x096E,\n  eighteencircle: 0x2471,\n  eighteenparen: 0x2485,\n  eighteenperiod: 0x2499,\n  eightgujarati: 0x0AEE,\n  eightgurmukhi: 0x0A6E,\n  eighthackarabic: 0x0668,\n  eighthangzhou: 0x3028,\n  eighthnotebeamed: 0x266B,\n  eightideographicparen: 0x3227,\n  eightinferior: 0x2088,\n  eightmonospace: 0xFF18,\n  eightoldstyle: 0xF738,\n  eightparen: 0x247B,\n  eightperiod: 0x248F,\n  eightpersian: 0x06F8,\n  eightroman: 0x2177,\n  eightsuperior: 0x2078,\n  eightthai: 0x0E58,\n  einvertedbreve: 0x0207,\n  eiotifiedcyrillic: 0x0465,\n  ekatakana: 0x30A8,\n  ekatakanahalfwidth: 0xFF74,\n  ekonkargurmukhi: 0x0A74,\n  ekorean: 0x3154,\n  elcyrillic: 0x043B,\n  element: 0x2208,\n  elevencircle: 0x246A,\n  elevenparen: 0x247E,\n  elevenperiod: 0x2492,\n  elevenroman: 0x217A,\n  ellipsis: 0x2026,\n  ellipsisvertical: 0x22EE,\n  emacron: 0x0113,\n  emacronacute: 0x1E17,\n  emacrongrave: 0x1E15,\n  emcyrillic: 0x043C,\n  emdash: 0x2014,\n  emdashvertical: 0xFE31,\n  emonospace: 0xFF45,\n  emphasismarkarmenian: 0x055B,\n  emptyset: 0x2205,\n  enbopomofo: 0x3123,\n  encyrillic: 0x043D,\n  endash: 0x2013,\n  endashvertical: 0xFE32,\n  endescendercyrillic: 0x04A3,\n  eng: 0x014B,\n  engbopomofo: 0x3125,\n  enghecyrillic: 0x04A5,\n  enhookcyrillic: 0x04C8,\n  enspace: 0x2002,\n  eogonek: 0x0119,\n  eokorean: 0x3153,\n  eopen: 0x025B,\n  eopenclosed: 0x029A,\n  eopenreversed: 0x025C,\n  eopenreversedclosed: 0x025E,\n  eopenreversedhook: 0x025D,\n  eparen: 0x24A0,\n  epsilon: 0x03B5,\n  epsilontonos: 0x03AD,\n  equal: 0x003D,\n  equalmonospace: 0xFF1D,\n  equalsmall: 0xFE66,\n  equalsuperior: 0x207C,\n  equivalence: 0x2261,\n  erbopomofo: 0x3126,\n  ercyrillic: 0x0440,\n  ereversed: 0x0258,\n  ereversedcyrillic: 0x044D,\n  escyrillic: 0x0441,\n  esdescendercyrillic: 0x04AB,\n  esh: 0x0283,\n  eshcurl: 0x0286,\n  eshortdeva: 0x090E,\n  eshortvowelsigndeva: 0x0946,\n  eshreversedloop: 0x01AA,\n  eshsquatreversed: 0x0285,\n  esmallhiragana: 0x3047,\n  esmallkatakana: 0x30A7,\n  esmallkatakanahalfwidth: 0xFF6A,\n  estimated: 0x212E,\n  esuperior: 0xF6EC,\n  eta: 0x03B7,\n  etarmenian: 0x0568,\n  etatonos: 0x03AE,\n  eth: 0x00F0,\n  etilde: 0x1EBD,\n  etildebelow: 0x1E1B,\n  etnahtafoukhhebrew: 0x0591,\n  etnahtafoukhlefthebrew: 0x0591,\n  etnahtahebrew: 0x0591,\n  etnahtalefthebrew: 0x0591,\n  eturned: 0x01DD,\n  eukorean: 0x3161,\n  euro: 0x20AC,\n  evowelsignbengali: 0x09C7,\n  evowelsigndeva: 0x0947,\n  evowelsigngujarati: 0x0AC7,\n  exclam: 0x0021,\n  exclamarmenian: 0x055C,\n  exclamdbl: 0x203C,\n  exclamdown: 0x00A1,\n  exclamdownsmall: 0xF7A1,\n  exclammonospace: 0xFF01,\n  exclamsmall: 0xF721,\n  existential: 0x2203,\n  ezh: 0x0292,\n  ezhcaron: 0x01EF,\n  ezhcurl: 0x0293,\n  ezhreversed: 0x01B9,\n  ezhtail: 0x01BA,\n  f: 0x0066,\n  fadeva: 0x095E,\n  fagurmukhi: 0x0A5E,\n  fahrenheit: 0x2109,\n  fathaarabic: 0x064E,\n  fathalowarabic: 0x064E,\n  fathatanarabic: 0x064B,\n  fbopomofo: 0x3108,\n  fcircle: 0x24D5,\n  fdotaccent: 0x1E1F,\n  feharabic: 0x0641,\n  feharmenian: 0x0586,\n  fehfinalarabic: 0xFED2,\n  fehinitialarabic: 0xFED3,\n  fehmedialarabic: 0xFED4,\n  feicoptic: 0x03E5,\n  female: 0x2640,\n  ff: 0xFB00,\n  ffi: 0xFB03,\n  ffl: 0xFB04,\n  fi: 0xFB01,\n  fifteencircle: 0x246E,\n  fifteenparen: 0x2482,\n  fifteenperiod: 0x2496,\n  figuredash: 0x2012,\n  filledbox: 0x25A0,\n  filledrect: 0x25AC,\n  finalkaf: 0x05DA,\n  finalkafdagesh: 0xFB3A,\n  finalkafdageshhebrew: 0xFB3A,\n  finalkafhebrew: 0x05DA,\n  finalmem: 0x05DD,\n  finalmemhebrew: 0x05DD,\n  finalnun: 0x05DF,\n  finalnunhebrew: 0x05DF,\n  finalpe: 0x05E3,\n  finalpehebrew: 0x05E3,\n  finaltsadi: 0x05E5,\n  finaltsadihebrew: 0x05E5,\n  firsttonechinese: 0x02C9,\n  fisheye: 0x25C9,\n  fitacyrillic: 0x0473,\n  five: 0x0035,\n  fivearabic: 0x0665,\n  fivebengali: 0x09EB,\n  fivecircle: 0x2464,\n  fivecircleinversesansserif: 0x278E,\n  fivedeva: 0x096B,\n  fiveeighths: 0x215D,\n  fivegujarati: 0x0AEB,\n  fivegurmukhi: 0x0A6B,\n  fivehackarabic: 0x0665,\n  fivehangzhou: 0x3025,\n  fiveideographicparen: 0x3224,\n  fiveinferior: 0x2085,\n  fivemonospace: 0xFF15,\n  fiveoldstyle: 0xF735,\n  fiveparen: 0x2478,\n  fiveperiod: 0x248C,\n  fivepersian: 0x06F5,\n  fiveroman: 0x2174,\n  fivesuperior: 0x2075,\n  fivethai: 0x0E55,\n  fl: 0xFB02,\n  florin: 0x0192,\n  fmonospace: 0xFF46,\n  fmsquare: 0x3399,\n  fofanthai: 0x0E1F,\n  fofathai: 0x0E1D,\n  fongmanthai: 0x0E4F,\n  forall: 0x2200,\n  four: 0x0034,\n  fourarabic: 0x0664,\n  fourbengali: 0x09EA,\n  fourcircle: 0x2463,\n  fourcircleinversesansserif: 0x278D,\n  fourdeva: 0x096A,\n  fourgujarati: 0x0AEA,\n  fourgurmukhi: 0x0A6A,\n  fourhackarabic: 0x0664,\n  fourhangzhou: 0x3024,\n  fourideographicparen: 0x3223,\n  fourinferior: 0x2084,\n  fourmonospace: 0xFF14,\n  fournumeratorbengali: 0x09F7,\n  fouroldstyle: 0xF734,\n  fourparen: 0x2477,\n  fourperiod: 0x248B,\n  fourpersian: 0x06F4,\n  fourroman: 0x2173,\n  foursuperior: 0x2074,\n  fourteencircle: 0x246D,\n  fourteenparen: 0x2481,\n  fourteenperiod: 0x2495,\n  fourthai: 0x0E54,\n  fourthtonechinese: 0x02CB,\n  fparen: 0x24A1,\n  fraction: 0x2044,\n  franc: 0x20A3,\n  g: 0x0067,\n  gabengali: 0x0997,\n  gacute: 0x01F5,\n  gadeva: 0x0917,\n  gafarabic: 0x06AF,\n  gaffinalarabic: 0xFB93,\n  gafinitialarabic: 0xFB94,\n  gafmedialarabic: 0xFB95,\n  gagujarati: 0x0A97,\n  gagurmukhi: 0x0A17,\n  gahiragana: 0x304C,\n  gakatakana: 0x30AC,\n  gamma: 0x03B3,\n  gammalatinsmall: 0x0263,\n  gammasuperior: 0x02E0,\n  gangiacoptic: 0x03EB,\n  gbopomofo: 0x310D,\n  gbreve: 0x011F,\n  gcaron: 0x01E7,\n  gcedilla: 0x0123,\n  gcircle: 0x24D6,\n  gcircumflex: 0x011D,\n  gcommaaccent: 0x0123,\n  gdot: 0x0121,\n  gdotaccent: 0x0121,\n  gecyrillic: 0x0433,\n  gehiragana: 0x3052,\n  gekatakana: 0x30B2,\n  geometricallyequal: 0x2251,\n  gereshaccenthebrew: 0x059C,\n  gereshhebrew: 0x05F3,\n  gereshmuqdamhebrew: 0x059D,\n  germandbls: 0x00DF,\n  gershayimaccenthebrew: 0x059E,\n  gershayimhebrew: 0x05F4,\n  getamark: 0x3013,\n  ghabengali: 0x0998,\n  ghadarmenian: 0x0572,\n  ghadeva: 0x0918,\n  ghagujarati: 0x0A98,\n  ghagurmukhi: 0x0A18,\n  ghainarabic: 0x063A,\n  ghainfinalarabic: 0xFECE,\n  ghaininitialarabic: 0xFECF,\n  ghainmedialarabic: 0xFED0,\n  ghemiddlehookcyrillic: 0x0495,\n  ghestrokecyrillic: 0x0493,\n  gheupturncyrillic: 0x0491,\n  ghhadeva: 0x095A,\n  ghhagurmukhi: 0x0A5A,\n  ghook: 0x0260,\n  ghzsquare: 0x3393,\n  gihiragana: 0x304E,\n  gikatakana: 0x30AE,\n  gimarmenian: 0x0563,\n  gimel: 0x05D2,\n  gimeldagesh: 0xFB32,\n  gimeldageshhebrew: 0xFB32,\n  gimelhebrew: 0x05D2,\n  gjecyrillic: 0x0453,\n  glottalinvertedstroke: 0x01BE,\n  glottalstop: 0x0294,\n  glottalstopinverted: 0x0296,\n  glottalstopmod: 0x02C0,\n  glottalstopreversed: 0x0295,\n  glottalstopreversedmod: 0x02C1,\n  glottalstopreversedsuperior: 0x02E4,\n  glottalstopstroke: 0x02A1,\n  glottalstopstrokereversed: 0x02A2,\n  gmacron: 0x1E21,\n  gmonospace: 0xFF47,\n  gohiragana: 0x3054,\n  gokatakana: 0x30B4,\n  gparen: 0x24A2,\n  gpasquare: 0x33AC,\n  gradient: 0x2207,\n  grave: 0x0060,\n  gravebelowcmb: 0x0316,\n  gravecmb: 0x0300,\n  gravecomb: 0x0300,\n  gravedeva: 0x0953,\n  gravelowmod: 0x02CE,\n  gravemonospace: 0xFF40,\n  gravetonecmb: 0x0340,\n  greater: 0x003E,\n  greaterequal: 0x2265,\n  greaterequalorless: 0x22DB,\n  greatermonospace: 0xFF1E,\n  greaterorequivalent: 0x2273,\n  greaterorless: 0x2277,\n  greateroverequal: 0x2267,\n  greatersmall: 0xFE65,\n  gscript: 0x0261,\n  gstroke: 0x01E5,\n  guhiragana: 0x3050,\n  guillemotleft: 0x00AB,\n  guillemotright: 0x00BB,\n  guilsinglleft: 0x2039,\n  guilsinglright: 0x203A,\n  gukatakana: 0x30B0,\n  guramusquare: 0x3318,\n  gysquare: 0x33C9,\n  h: 0x0068,\n  haabkhasiancyrillic: 0x04A9,\n  haaltonearabic: 0x06C1,\n  habengali: 0x09B9,\n  hadescendercyrillic: 0x04B3,\n  hadeva: 0x0939,\n  hagujarati: 0x0AB9,\n  hagurmukhi: 0x0A39,\n  haharabic: 0x062D,\n  hahfinalarabic: 0xFEA2,\n  hahinitialarabic: 0xFEA3,\n  hahiragana: 0x306F,\n  hahmedialarabic: 0xFEA4,\n  haitusquare: 0x332A,\n  hakatakana: 0x30CF,\n  hakatakanahalfwidth: 0xFF8A,\n  halantgurmukhi: 0x0A4D,\n  hamzaarabic: 0x0621,\n  hamzalowarabic: 0x0621,\n  hangulfiller: 0x3164,\n  hardsigncyrillic: 0x044A,\n  harpoonleftbarbup: 0x21BC,\n  harpoonrightbarbup: 0x21C0,\n  hasquare: 0x33CA,\n  hatafpatah: 0x05B2,\n  hatafpatah16: 0x05B2,\n  hatafpatah23: 0x05B2,\n  hatafpatah2f: 0x05B2,\n  hatafpatahhebrew: 0x05B2,\n  hatafpatahnarrowhebrew: 0x05B2,\n  hatafpatahquarterhebrew: 0x05B2,\n  hatafpatahwidehebrew: 0x05B2,\n  hatafqamats: 0x05B3,\n  hatafqamats1b: 0x05B3,\n  hatafqamats28: 0x05B3,\n  hatafqamats34: 0x05B3,\n  hatafqamatshebrew: 0x05B3,\n  hatafqamatsnarrowhebrew: 0x05B3,\n  hatafqamatsquarterhebrew: 0x05B3,\n  hatafqamatswidehebrew: 0x05B3,\n  hatafsegol: 0x05B1,\n  hatafsegol17: 0x05B1,\n  hatafsegol24: 0x05B1,\n  hatafsegol30: 0x05B1,\n  hatafsegolhebrew: 0x05B1,\n  hatafsegolnarrowhebrew: 0x05B1,\n  hatafsegolquarterhebrew: 0x05B1,\n  hatafsegolwidehebrew: 0x05B1,\n  hbar: 0x0127,\n  hbopomofo: 0x310F,\n  hbrevebelow: 0x1E2B,\n  hcedilla: 0x1E29,\n  hcircle: 0x24D7,\n  hcircumflex: 0x0125,\n  hdieresis: 0x1E27,\n  hdotaccent: 0x1E23,\n  hdotbelow: 0x1E25,\n  he: 0x05D4,\n  heart: 0x2665,\n  heartsuitblack: 0x2665,\n  heartsuitwhite: 0x2661,\n  hedagesh: 0xFB34,\n  hedageshhebrew: 0xFB34,\n  hehaltonearabic: 0x06C1,\n  heharabic: 0x0647,\n  hehebrew: 0x05D4,\n  hehfinalaltonearabic: 0xFBA7,\n  hehfinalalttwoarabic: 0xFEEA,\n  hehfinalarabic: 0xFEEA,\n  hehhamzaabovefinalarabic: 0xFBA5,\n  hehhamzaaboveisolatedarabic: 0xFBA4,\n  hehinitialaltonearabic: 0xFBA8,\n  hehinitialarabic: 0xFEEB,\n  hehiragana: 0x3078,\n  hehmedialaltonearabic: 0xFBA9,\n  hehmedialarabic: 0xFEEC,\n  heiseierasquare: 0x337B,\n  hekatakana: 0x30D8,\n  hekatakanahalfwidth: 0xFF8D,\n  hekutaarusquare: 0x3336,\n  henghook: 0x0267,\n  herutusquare: 0x3339,\n  het: 0x05D7,\n  hethebrew: 0x05D7,\n  hhook: 0x0266,\n  hhooksuperior: 0x02B1,\n  hieuhacirclekorean: 0x327B,\n  hieuhaparenkorean: 0x321B,\n  hieuhcirclekorean: 0x326D,\n  hieuhkorean: 0x314E,\n  hieuhparenkorean: 0x320D,\n  hihiragana: 0x3072,\n  hikatakana: 0x30D2,\n  hikatakanahalfwidth: 0xFF8B,\n  hiriq: 0x05B4,\n  hiriq14: 0x05B4,\n  hiriq21: 0x05B4,\n  hiriq2d: 0x05B4,\n  hiriqhebrew: 0x05B4,\n  hiriqnarrowhebrew: 0x05B4,\n  hiriqquarterhebrew: 0x05B4,\n  hiriqwidehebrew: 0x05B4,\n  hlinebelow: 0x1E96,\n  hmonospace: 0xFF48,\n  hoarmenian: 0x0570,\n  hohipthai: 0x0E2B,\n  hohiragana: 0x307B,\n  hokatakana: 0x30DB,\n  hokatakanahalfwidth: 0xFF8E,\n  holam: 0x05B9,\n  holam19: 0x05B9,\n  holam26: 0x05B9,\n  holam32: 0x05B9,\n  holamhebrew: 0x05B9,\n  holamnarrowhebrew: 0x05B9,\n  holamquarterhebrew: 0x05B9,\n  holamwidehebrew: 0x05B9,\n  honokhukthai: 0x0E2E,\n  hookabovecomb: 0x0309,\n  hookcmb: 0x0309,\n  hookpalatalizedbelowcmb: 0x0321,\n  hookretroflexbelowcmb: 0x0322,\n  hoonsquare: 0x3342,\n  horicoptic: 0x03E9,\n  horizontalbar: 0x2015,\n  horncmb: 0x031B,\n  hotsprings: 0x2668,\n  house: 0x2302,\n  hparen: 0x24A3,\n  hsuperior: 0x02B0,\n  hturned: 0x0265,\n  huhiragana: 0x3075,\n  huiitosquare: 0x3333,\n  hukatakana: 0x30D5,\n  hukatakanahalfwidth: 0xFF8C,\n  hungarumlaut: 0x02DD,\n  hungarumlautcmb: 0x030B,\n  hv: 0x0195,\n  hyphen: 0x002D,\n  hypheninferior: 0xF6E5,\n  hyphenmonospace: 0xFF0D,\n  hyphensmall: 0xFE63,\n  hyphensuperior: 0xF6E6,\n  hyphentwo: 0x2010,\n  i: 0x0069,\n  iacute: 0x00ED,\n  iacyrillic: 0x044F,\n  ibengali: 0x0987,\n  ibopomofo: 0x3127,\n  ibreve: 0x012D,\n  icaron: 0x01D0,\n  icircle: 0x24D8,\n  icircumflex: 0x00EE,\n  icyrillic: 0x0456,\n  idblgrave: 0x0209,\n  ideographearthcircle: 0x328F,\n  ideographfirecircle: 0x328B,\n  ideographicallianceparen: 0x323F,\n  ideographiccallparen: 0x323A,\n  ideographiccentrecircle: 0x32A5,\n  ideographicclose: 0x3006,\n  ideographiccomma: 0x3001,\n  ideographiccommaleft: 0xFF64,\n  ideographiccongratulationparen: 0x3237,\n  ideographiccorrectcircle: 0x32A3,\n  ideographicearthparen: 0x322F,\n  ideographicenterpriseparen: 0x323D,\n  ideographicexcellentcircle: 0x329D,\n  ideographicfestivalparen: 0x3240,\n  ideographicfinancialcircle: 0x3296,\n  ideographicfinancialparen: 0x3236,\n  ideographicfireparen: 0x322B,\n  ideographichaveparen: 0x3232,\n  ideographichighcircle: 0x32A4,\n  ideographiciterationmark: 0x3005,\n  ideographiclaborcircle: 0x3298,\n  ideographiclaborparen: 0x3238,\n  ideographicleftcircle: 0x32A7,\n  ideographiclowcircle: 0x32A6,\n  ideographicmedicinecircle: 0x32A9,\n  ideographicmetalparen: 0x322E,\n  ideographicmoonparen: 0x322A,\n  ideographicnameparen: 0x3234,\n  ideographicperiod: 0x3002,\n  ideographicprintcircle: 0x329E,\n  ideographicreachparen: 0x3243,\n  ideographicrepresentparen: 0x3239,\n  ideographicresourceparen: 0x323E,\n  ideographicrightcircle: 0x32A8,\n  ideographicsecretcircle: 0x3299,\n  ideographicselfparen: 0x3242,\n  ideographicsocietyparen: 0x3233,\n  ideographicspace: 0x3000,\n  ideographicspecialparen: 0x3235,\n  ideographicstockparen: 0x3231,\n  ideographicstudyparen: 0x323B,\n  ideographicsunparen: 0x3230,\n  ideographicsuperviseparen: 0x323C,\n  ideographicwaterparen: 0x322C,\n  ideographicwoodparen: 0x322D,\n  ideographiczero: 0x3007,\n  ideographmetalcircle: 0x328E,\n  ideographmooncircle: 0x328A,\n  ideographnamecircle: 0x3294,\n  ideographsuncircle: 0x3290,\n  ideographwatercircle: 0x328C,\n  ideographwoodcircle: 0x328D,\n  ideva: 0x0907,\n  idieresis: 0x00EF,\n  idieresisacute: 0x1E2F,\n  idieresiscyrillic: 0x04E5,\n  idotbelow: 0x1ECB,\n  iebrevecyrillic: 0x04D7,\n  iecyrillic: 0x0435,\n  ieungacirclekorean: 0x3275,\n  ieungaparenkorean: 0x3215,\n  ieungcirclekorean: 0x3267,\n  ieungkorean: 0x3147,\n  ieungparenkorean: 0x3207,\n  igrave: 0x00EC,\n  igujarati: 0x0A87,\n  igurmukhi: 0x0A07,\n  ihiragana: 0x3044,\n  ihookabove: 0x1EC9,\n  iibengali: 0x0988,\n  iicyrillic: 0x0438,\n  iideva: 0x0908,\n  iigujarati: 0x0A88,\n  iigurmukhi: 0x0A08,\n  iimatragurmukhi: 0x0A40,\n  iinvertedbreve: 0x020B,\n  iishortcyrillic: 0x0439,\n  iivowelsignbengali: 0x09C0,\n  iivowelsigndeva: 0x0940,\n  iivowelsigngujarati: 0x0AC0,\n  ij: 0x0133,\n  ikatakana: 0x30A4,\n  ikatakanahalfwidth: 0xFF72,\n  ikorean: 0x3163,\n  ilde: 0x02DC,\n  iluyhebrew: 0x05AC,\n  imacron: 0x012B,\n  imacroncyrillic: 0x04E3,\n  imageorapproximatelyequal: 0x2253,\n  imatragurmukhi: 0x0A3F,\n  imonospace: 0xFF49,\n  increment: 0x2206,\n  infinity: 0x221E,\n  iniarmenian: 0x056B,\n  integral: 0x222B,\n  integralbottom: 0x2321,\n  integralbt: 0x2321,\n  integralex: 0xF8F5,\n  integraltop: 0x2320,\n  integraltp: 0x2320,\n  intersection: 0x2229,\n  intisquare: 0x3305,\n  invbullet: 0x25D8,\n  invcircle: 0x25D9,\n  invsmileface: 0x263B,\n  iocyrillic: 0x0451,\n  iogonek: 0x012F,\n  iota: 0x03B9,\n  iotadieresis: 0x03CA,\n  iotadieresistonos: 0x0390,\n  iotalatin: 0x0269,\n  iotatonos: 0x03AF,\n  iparen: 0x24A4,\n  irigurmukhi: 0x0A72,\n  ismallhiragana: 0x3043,\n  ismallkatakana: 0x30A3,\n  ismallkatakanahalfwidth: 0xFF68,\n  issharbengali: 0x09FA,\n  istroke: 0x0268,\n  isuperior: 0xF6ED,\n  iterationhiragana: 0x309D,\n  iterationkatakana: 0x30FD,\n  itilde: 0x0129,\n  itildebelow: 0x1E2D,\n  iubopomofo: 0x3129,\n  iucyrillic: 0x044E,\n  ivowelsignbengali: 0x09BF,\n  ivowelsigndeva: 0x093F,\n  ivowelsigngujarati: 0x0ABF,\n  izhitsacyrillic: 0x0475,\n  izhitsadblgravecyrillic: 0x0477,\n  j: 0x006A,\n  jaarmenian: 0x0571,\n  jabengali: 0x099C,\n  jadeva: 0x091C,\n  jagujarati: 0x0A9C,\n  jagurmukhi: 0x0A1C,\n  jbopomofo: 0x3110,\n  jcaron: 0x01F0,\n  jcircle: 0x24D9,\n  jcircumflex: 0x0135,\n  jcrossedtail: 0x029D,\n  jdotlessstroke: 0x025F,\n  jecyrillic: 0x0458,\n  jeemarabic: 0x062C,\n  jeemfinalarabic: 0xFE9E,\n  jeeminitialarabic: 0xFE9F,\n  jeemmedialarabic: 0xFEA0,\n  jeharabic: 0x0698,\n  jehfinalarabic: 0xFB8B,\n  jhabengali: 0x099D,\n  jhadeva: 0x091D,\n  jhagujarati: 0x0A9D,\n  jhagurmukhi: 0x0A1D,\n  jheharmenian: 0x057B,\n  jis: 0x3004,\n  jmonospace: 0xFF4A,\n  jparen: 0x24A5,\n  jsuperior: 0x02B2,\n  k: 0x006B,\n  kabashkircyrillic: 0x04A1,\n  kabengali: 0x0995,\n  kacute: 0x1E31,\n  kacyrillic: 0x043A,\n  kadescendercyrillic: 0x049B,\n  kadeva: 0x0915,\n  kaf: 0x05DB,\n  kafarabic: 0x0643,\n  kafdagesh: 0xFB3B,\n  kafdageshhebrew: 0xFB3B,\n  kaffinalarabic: 0xFEDA,\n  kafhebrew: 0x05DB,\n  kafinitialarabic: 0xFEDB,\n  kafmedialarabic: 0xFEDC,\n  kafrafehebrew: 0xFB4D,\n  kagujarati: 0x0A95,\n  kagurmukhi: 0x0A15,\n  kahiragana: 0x304B,\n  kahookcyrillic: 0x04C4,\n  kakatakana: 0x30AB,\n  kakatakanahalfwidth: 0xFF76,\n  kappa: 0x03BA,\n  kappasymbolgreek: 0x03F0,\n  kapyeounmieumkorean: 0x3171,\n  kapyeounphieuphkorean: 0x3184,\n  kapyeounpieupkorean: 0x3178,\n  kapyeounssangpieupkorean: 0x3179,\n  karoriisquare: 0x330D,\n  kashidaautoarabic: 0x0640,\n  kashidaautonosidebearingarabic: 0x0640,\n  kasmallkatakana: 0x30F5,\n  kasquare: 0x3384,\n  kasraarabic: 0x0650,\n  kasratanarabic: 0x064D,\n  kastrokecyrillic: 0x049F,\n  katahiraprolongmarkhalfwidth: 0xFF70,\n  kaverticalstrokecyrillic: 0x049D,\n  kbopomofo: 0x310E,\n  kcalsquare: 0x3389,\n  kcaron: 0x01E9,\n  kcedilla: 0x0137,\n  kcircle: 0x24DA,\n  kcommaaccent: 0x0137,\n  kdotbelow: 0x1E33,\n  keharmenian: 0x0584,\n  kehiragana: 0x3051,\n  kekatakana: 0x30B1,\n  kekatakanahalfwidth: 0xFF79,\n  kenarmenian: 0x056F,\n  kesmallkatakana: 0x30F6,\n  kgreenlandic: 0x0138,\n  khabengali: 0x0996,\n  khacyrillic: 0x0445,\n  khadeva: 0x0916,\n  khagujarati: 0x0A96,\n  khagurmukhi: 0x0A16,\n  khaharabic: 0x062E,\n  khahfinalarabic: 0xFEA6,\n  khahinitialarabic: 0xFEA7,\n  khahmedialarabic: 0xFEA8,\n  kheicoptic: 0x03E7,\n  khhadeva: 0x0959,\n  khhagurmukhi: 0x0A59,\n  khieukhacirclekorean: 0x3278,\n  khieukhaparenkorean: 0x3218,\n  khieukhcirclekorean: 0x326A,\n  khieukhkorean: 0x314B,\n  khieukhparenkorean: 0x320A,\n  khokhaithai: 0x0E02,\n  khokhonthai: 0x0E05,\n  khokhuatthai: 0x0E03,\n  khokhwaithai: 0x0E04,\n  khomutthai: 0x0E5B,\n  khook: 0x0199,\n  khorakhangthai: 0x0E06,\n  khzsquare: 0x3391,\n  kihiragana: 0x304D,\n  kikatakana: 0x30AD,\n  kikatakanahalfwidth: 0xFF77,\n  kiroguramusquare: 0x3315,\n  kiromeetorusquare: 0x3316,\n  kirosquare: 0x3314,\n  kiyeokacirclekorean: 0x326E,\n  kiyeokaparenkorean: 0x320E,\n  kiyeokcirclekorean: 0x3260,\n  kiyeokkorean: 0x3131,\n  kiyeokparenkorean: 0x3200,\n  kiyeoksioskorean: 0x3133,\n  kjecyrillic: 0x045C,\n  klinebelow: 0x1E35,\n  klsquare: 0x3398,\n  kmcubedsquare: 0x33A6,\n  kmonospace: 0xFF4B,\n  kmsquaredsquare: 0x33A2,\n  kohiragana: 0x3053,\n  kohmsquare: 0x33C0,\n  kokaithai: 0x0E01,\n  kokatakana: 0x30B3,\n  kokatakanahalfwidth: 0xFF7A,\n  kooposquare: 0x331E,\n  koppacyrillic: 0x0481,\n  koreanstandardsymbol: 0x327F,\n  koroniscmb: 0x0343,\n  kparen: 0x24A6,\n  kpasquare: 0x33AA,\n  ksicyrillic: 0x046F,\n  ktsquare: 0x33CF,\n  kturned: 0x029E,\n  kuhiragana: 0x304F,\n  kukatakana: 0x30AF,\n  kukatakanahalfwidth: 0xFF78,\n  kvsquare: 0x33B8,\n  kwsquare: 0x33BE,\n  l: 0x006C,\n  labengali: 0x09B2,\n  lacute: 0x013A,\n  ladeva: 0x0932,\n  lagujarati: 0x0AB2,\n  lagurmukhi: 0x0A32,\n  lakkhangyaothai: 0x0E45,\n  lamaleffinalarabic: 0xFEFC,\n  lamalefhamzaabovefinalarabic: 0xFEF8,\n  lamalefhamzaaboveisolatedarabic: 0xFEF7,\n  lamalefhamzabelowfinalarabic: 0xFEFA,\n  lamalefhamzabelowisolatedarabic: 0xFEF9,\n  lamalefisolatedarabic: 0xFEFB,\n  lamalefmaddaabovefinalarabic: 0xFEF6,\n  lamalefmaddaaboveisolatedarabic: 0xFEF5,\n  lamarabic: 0x0644,\n  lambda: 0x03BB,\n  lambdastroke: 0x019B,\n  lamed: 0x05DC,\n  lameddagesh: 0xFB3C,\n  lameddageshhebrew: 0xFB3C,\n  lamedhebrew: 0x05DC,\n  lamfinalarabic: 0xFEDE,\n  lamhahinitialarabic: 0xFCCA,\n  laminitialarabic: 0xFEDF,\n  lamjeeminitialarabic: 0xFCC9,\n  lamkhahinitialarabic: 0xFCCB,\n  lamlamhehisolatedarabic: 0xFDF2,\n  lammedialarabic: 0xFEE0,\n  lammeemhahinitialarabic: 0xFD88,\n  lammeeminitialarabic: 0xFCCC,\n  largecircle: 0x25EF,\n  lbar: 0x019A,\n  lbelt: 0x026C,\n  lbopomofo: 0x310C,\n  lcaron: 0x013E,\n  lcedilla: 0x013C,\n  lcircle: 0x24DB,\n  lcircumflexbelow: 0x1E3D,\n  lcommaaccent: 0x013C,\n  ldot: 0x0140,\n  ldotaccent: 0x0140,\n  ldotbelow: 0x1E37,\n  ldotbelowmacron: 0x1E39,\n  leftangleabovecmb: 0x031A,\n  lefttackbelowcmb: 0x0318,\n  less: 0x003C,\n  lessequal: 0x2264,\n  lessequalorgreater: 0x22DA,\n  lessmonospace: 0xFF1C,\n  lessorequivalent: 0x2272,\n  lessorgreater: 0x2276,\n  lessoverequal: 0x2266,\n  lesssmall: 0xFE64,\n  lezh: 0x026E,\n  lfblock: 0x258C,\n  lhookretroflex: 0x026D,\n  lira: 0x20A4,\n  liwnarmenian: 0x056C,\n  lj: 0x01C9,\n  ljecyrillic: 0x0459,\n  ll: 0xF6C0,\n  lladeva: 0x0933,\n  llagujarati: 0x0AB3,\n  llinebelow: 0x1E3B,\n  llladeva: 0x0934,\n  llvocalicbengali: 0x09E1,\n  llvocalicdeva: 0x0961,\n  llvocalicvowelsignbengali: 0x09E3,\n  llvocalicvowelsigndeva: 0x0963,\n  lmiddletilde: 0x026B,\n  lmonospace: 0xFF4C,\n  lmsquare: 0x33D0,\n  lochulathai: 0x0E2C,\n  logicaland: 0x2227,\n  logicalnot: 0x00AC,\n  logicalnotreversed: 0x2310,\n  logicalor: 0x2228,\n  lolingthai: 0x0E25,\n  longs: 0x017F,\n  lowlinecenterline: 0xFE4E,\n  lowlinecmb: 0x0332,\n  lowlinedashed: 0xFE4D,\n  lozenge: 0x25CA,\n  lparen: 0x24A7,\n  lslash: 0x0142,\n  lsquare: 0x2113,\n  lsuperior: 0xF6EE,\n  ltshade: 0x2591,\n  luthai: 0x0E26,\n  lvocalicbengali: 0x098C,\n  lvocalicdeva: 0x090C,\n  lvocalicvowelsignbengali: 0x09E2,\n  lvocalicvowelsigndeva: 0x0962,\n  lxsquare: 0x33D3,\n  m: 0x006D,\n  mabengali: 0x09AE,\n  macron: 0x00AF,\n  macronbelowcmb: 0x0331,\n  macroncmb: 0x0304,\n  macronlowmod: 0x02CD,\n  macronmonospace: 0xFFE3,\n  macute: 0x1E3F,\n  madeva: 0x092E,\n  magujarati: 0x0AAE,\n  magurmukhi: 0x0A2E,\n  mahapakhhebrew: 0x05A4,\n  mahapakhlefthebrew: 0x05A4,\n  mahiragana: 0x307E,\n  maichattawalowleftthai: 0xF895,\n  maichattawalowrightthai: 0xF894,\n  maichattawathai: 0x0E4B,\n  maichattawaupperleftthai: 0xF893,\n  maieklowleftthai: 0xF88C,\n  maieklowrightthai: 0xF88B,\n  maiekthai: 0x0E48,\n  maiekupperleftthai: 0xF88A,\n  maihanakatleftthai: 0xF884,\n  maihanakatthai: 0x0E31,\n  maitaikhuleftthai: 0xF889,\n  maitaikhuthai: 0x0E47,\n  maitholowleftthai: 0xF88F,\n  maitholowrightthai: 0xF88E,\n  maithothai: 0x0E49,\n  maithoupperleftthai: 0xF88D,\n  maitrilowleftthai: 0xF892,\n  maitrilowrightthai: 0xF891,\n  maitrithai: 0x0E4A,\n  maitriupperleftthai: 0xF890,\n  maiyamokthai: 0x0E46,\n  makatakana: 0x30DE,\n  makatakanahalfwidth: 0xFF8F,\n  male: 0x2642,\n  mansyonsquare: 0x3347,\n  maqafhebrew: 0x05BE,\n  mars: 0x2642,\n  masoracirclehebrew: 0x05AF,\n  masquare: 0x3383,\n  mbopomofo: 0x3107,\n  mbsquare: 0x33D4,\n  mcircle: 0x24DC,\n  mcubedsquare: 0x33A5,\n  mdotaccent: 0x1E41,\n  mdotbelow: 0x1E43,\n  meemarabic: 0x0645,\n  meemfinalarabic: 0xFEE2,\n  meeminitialarabic: 0xFEE3,\n  meemmedialarabic: 0xFEE4,\n  meemmeeminitialarabic: 0xFCD1,\n  meemmeemisolatedarabic: 0xFC48,\n  meetorusquare: 0x334D,\n  mehiragana: 0x3081,\n  meizierasquare: 0x337E,\n  mekatakana: 0x30E1,\n  mekatakanahalfwidth: 0xFF92,\n  mem: 0x05DE,\n  memdagesh: 0xFB3E,\n  memdageshhebrew: 0xFB3E,\n  memhebrew: 0x05DE,\n  menarmenian: 0x0574,\n  merkhahebrew: 0x05A5,\n  merkhakefulahebrew: 0x05A6,\n  merkhakefulalefthebrew: 0x05A6,\n  merkhalefthebrew: 0x05A5,\n  mhook: 0x0271,\n  mhzsquare: 0x3392,\n  middledotkatakanahalfwidth: 0xFF65,\n  middot: 0x00B7,\n  mieumacirclekorean: 0x3272,\n  mieumaparenkorean: 0x3212,\n  mieumcirclekorean: 0x3264,\n  mieumkorean: 0x3141,\n  mieumpansioskorean: 0x3170,\n  mieumparenkorean: 0x3204,\n  mieumpieupkorean: 0x316E,\n  mieumsioskorean: 0x316F,\n  mihiragana: 0x307F,\n  mikatakana: 0x30DF,\n  mikatakanahalfwidth: 0xFF90,\n  minus: 0x2212,\n  minusbelowcmb: 0x0320,\n  minuscircle: 0x2296,\n  minusmod: 0x02D7,\n  minusplus: 0x2213,\n  minute: 0x2032,\n  miribaarusquare: 0x334A,\n  mirisquare: 0x3349,\n  mlonglegturned: 0x0270,\n  mlsquare: 0x3396,\n  mmcubedsquare: 0x33A3,\n  mmonospace: 0xFF4D,\n  mmsquaredsquare: 0x339F,\n  mohiragana: 0x3082,\n  mohmsquare: 0x33C1,\n  mokatakana: 0x30E2,\n  mokatakanahalfwidth: 0xFF93,\n  molsquare: 0x33D6,\n  momathai: 0x0E21,\n  moverssquare: 0x33A7,\n  moverssquaredsquare: 0x33A8,\n  mparen: 0x24A8,\n  mpasquare: 0x33AB,\n  mssquare: 0x33B3,\n  msuperior: 0xF6EF,\n  mturned: 0x026F,\n  mu: 0x00B5,\n  mu1: 0x00B5,\n  muasquare: 0x3382,\n  muchgreater: 0x226B,\n  muchless: 0x226A,\n  mufsquare: 0x338C,\n  mugreek: 0x03BC,\n  mugsquare: 0x338D,\n  muhiragana: 0x3080,\n  mukatakana: 0x30E0,\n  mukatakanahalfwidth: 0xFF91,\n  mulsquare: 0x3395,\n  multiply: 0x00D7,\n  mumsquare: 0x339B,\n  munahhebrew: 0x05A3,\n  munahlefthebrew: 0x05A3,\n  musicalnote: 0x266A,\n  musicalnotedbl: 0x266B,\n  musicflatsign: 0x266D,\n  musicsharpsign: 0x266F,\n  mussquare: 0x33B2,\n  muvsquare: 0x33B6,\n  muwsquare: 0x33BC,\n  mvmegasquare: 0x33B9,\n  mvsquare: 0x33B7,\n  mwmegasquare: 0x33BF,\n  mwsquare: 0x33BD,\n  n: 0x006E,\n  nabengali: 0x09A8,\n  nabla: 0x2207,\n  nacute: 0x0144,\n  nadeva: 0x0928,\n  nagujarati: 0x0AA8,\n  nagurmukhi: 0x0A28,\n  nahiragana: 0x306A,\n  nakatakana: 0x30CA,\n  nakatakanahalfwidth: 0xFF85,\n  napostrophe: 0x0149,\n  nasquare: 0x3381,\n  nbopomofo: 0x310B,\n  nbspace: 0x00A0,\n  ncaron: 0x0148,\n  ncedilla: 0x0146,\n  ncircle: 0x24DD,\n  ncircumflexbelow: 0x1E4B,\n  ncommaaccent: 0x0146,\n  ndotaccent: 0x1E45,\n  ndotbelow: 0x1E47,\n  nehiragana: 0x306D,\n  nekatakana: 0x30CD,\n  nekatakanahalfwidth: 0xFF88,\n  newsheqelsign: 0x20AA,\n  nfsquare: 0x338B,\n  ngabengali: 0x0999,\n  ngadeva: 0x0919,\n  ngagujarati: 0x0A99,\n  ngagurmukhi: 0x0A19,\n  ngonguthai: 0x0E07,\n  nhiragana: 0x3093,\n  nhookleft: 0x0272,\n  nhookretroflex: 0x0273,\n  nieunacirclekorean: 0x326F,\n  nieunaparenkorean: 0x320F,\n  nieuncieuckorean: 0x3135,\n  nieuncirclekorean: 0x3261,\n  nieunhieuhkorean: 0x3136,\n  nieunkorean: 0x3134,\n  nieunpansioskorean: 0x3168,\n  nieunparenkorean: 0x3201,\n  nieunsioskorean: 0x3167,\n  nieuntikeutkorean: 0x3166,\n  nihiragana: 0x306B,\n  nikatakana: 0x30CB,\n  nikatakanahalfwidth: 0xFF86,\n  nikhahitleftthai: 0xF899,\n  nikhahitthai: 0x0E4D,\n  nine: 0x0039,\n  ninearabic: 0x0669,\n  ninebengali: 0x09EF,\n  ninecircle: 0x2468,\n  ninecircleinversesansserif: 0x2792,\n  ninedeva: 0x096F,\n  ninegujarati: 0x0AEF,\n  ninegurmukhi: 0x0A6F,\n  ninehackarabic: 0x0669,\n  ninehangzhou: 0x3029,\n  nineideographicparen: 0x3228,\n  nineinferior: 0x2089,\n  ninemonospace: 0xFF19,\n  nineoldstyle: 0xF739,\n  nineparen: 0x247C,\n  nineperiod: 0x2490,\n  ninepersian: 0x06F9,\n  nineroman: 0x2178,\n  ninesuperior: 0x2079,\n  nineteencircle: 0x2472,\n  nineteenparen: 0x2486,\n  nineteenperiod: 0x249A,\n  ninethai: 0x0E59,\n  nj: 0x01CC,\n  njecyrillic: 0x045A,\n  nkatakana: 0x30F3,\n  nkatakanahalfwidth: 0xFF9D,\n  nlegrightlong: 0x019E,\n  nlinebelow: 0x1E49,\n  nmonospace: 0xFF4E,\n  nmsquare: 0x339A,\n  nnabengali: 0x09A3,\n  nnadeva: 0x0923,\n  nnagujarati: 0x0AA3,\n  nnagurmukhi: 0x0A23,\n  nnnadeva: 0x0929,\n  nohiragana: 0x306E,\n  nokatakana: 0x30CE,\n  nokatakanahalfwidth: 0xFF89,\n  nonbreakingspace: 0x00A0,\n  nonenthai: 0x0E13,\n  nonuthai: 0x0E19,\n  noonarabic: 0x0646,\n  noonfinalarabic: 0xFEE6,\n  noonghunnaarabic: 0x06BA,\n  noonghunnafinalarabic: 0xFB9F,\n  nooninitialarabic: 0xFEE7,\n  noonjeeminitialarabic: 0xFCD2,\n  noonjeemisolatedarabic: 0xFC4B,\n  noonmedialarabic: 0xFEE8,\n  noonmeeminitialarabic: 0xFCD5,\n  noonmeemisolatedarabic: 0xFC4E,\n  noonnoonfinalarabic: 0xFC8D,\n  notcontains: 0x220C,\n  notelement: 0x2209,\n  notelementof: 0x2209,\n  notequal: 0x2260,\n  notgreater: 0x226F,\n  notgreaternorequal: 0x2271,\n  notgreaternorless: 0x2279,\n  notidentical: 0x2262,\n  notless: 0x226E,\n  notlessnorequal: 0x2270,\n  notparallel: 0x2226,\n  notprecedes: 0x2280,\n  notsubset: 0x2284,\n  notsucceeds: 0x2281,\n  notsuperset: 0x2285,\n  nowarmenian: 0x0576,\n  nparen: 0x24A9,\n  nssquare: 0x33B1,\n  nsuperior: 0x207F,\n  ntilde: 0x00F1,\n  nu: 0x03BD,\n  nuhiragana: 0x306C,\n  nukatakana: 0x30CC,\n  nukatakanahalfwidth: 0xFF87,\n  nuktabengali: 0x09BC,\n  nuktadeva: 0x093C,\n  nuktagujarati: 0x0ABC,\n  nuktagurmukhi: 0x0A3C,\n  numbersign: 0x0023,\n  numbersignmonospace: 0xFF03,\n  numbersignsmall: 0xFE5F,\n  numeralsigngreek: 0x0374,\n  numeralsignlowergreek: 0x0375,\n  numero: 0x2116,\n  nun: 0x05E0,\n  nundagesh: 0xFB40,\n  nundageshhebrew: 0xFB40,\n  nunhebrew: 0x05E0,\n  nvsquare: 0x33B5,\n  nwsquare: 0x33BB,\n  nyabengali: 0x099E,\n  nyadeva: 0x091E,\n  nyagujarati: 0x0A9E,\n  nyagurmukhi: 0x0A1E,\n  o: 0x006F,\n  oacute: 0x00F3,\n  oangthai: 0x0E2D,\n  obarred: 0x0275,\n  obarredcyrillic: 0x04E9,\n  obarreddieresiscyrillic: 0x04EB,\n  obengali: 0x0993,\n  obopomofo: 0x311B,\n  obreve: 0x014F,\n  ocandradeva: 0x0911,\n  ocandragujarati: 0x0A91,\n  ocandravowelsigndeva: 0x0949,\n  ocandravowelsigngujarati: 0x0AC9,\n  ocaron: 0x01D2,\n  ocircle: 0x24DE,\n  ocircumflex: 0x00F4,\n  ocircumflexacute: 0x1ED1,\n  ocircumflexdotbelow: 0x1ED9,\n  ocircumflexgrave: 0x1ED3,\n  ocircumflexhookabove: 0x1ED5,\n  ocircumflextilde: 0x1ED7,\n  ocyrillic: 0x043E,\n  odblacute: 0x0151,\n  odblgrave: 0x020D,\n  odeva: 0x0913,\n  odieresis: 0x00F6,\n  odieresiscyrillic: 0x04E7,\n  odotbelow: 0x1ECD,\n  oe: 0x0153,\n  oekorean: 0x315A,\n  ogonek: 0x02DB,\n  ogonekcmb: 0x0328,\n  ograve: 0x00F2,\n  ogujarati: 0x0A93,\n  oharmenian: 0x0585,\n  ohiragana: 0x304A,\n  ohookabove: 0x1ECF,\n  ohorn: 0x01A1,\n  ohornacute: 0x1EDB,\n  ohorndotbelow: 0x1EE3,\n  ohorngrave: 0x1EDD,\n  ohornhookabove: 0x1EDF,\n  ohorntilde: 0x1EE1,\n  ohungarumlaut: 0x0151,\n  oi: 0x01A3,\n  oinvertedbreve: 0x020F,\n  okatakana: 0x30AA,\n  okatakanahalfwidth: 0xFF75,\n  okorean: 0x3157,\n  olehebrew: 0x05AB,\n  omacron: 0x014D,\n  omacronacute: 0x1E53,\n  omacrongrave: 0x1E51,\n  omdeva: 0x0950,\n  omega: 0x03C9,\n  omega1: 0x03D6,\n  omegacyrillic: 0x0461,\n  omegalatinclosed: 0x0277,\n  omegaroundcyrillic: 0x047B,\n  omegatitlocyrillic: 0x047D,\n  omegatonos: 0x03CE,\n  omgujarati: 0x0AD0,\n  omicron: 0x03BF,\n  omicrontonos: 0x03CC,\n  omonospace: 0xFF4F,\n  one: 0x0031,\n  onearabic: 0x0661,\n  onebengali: 0x09E7,\n  onecircle: 0x2460,\n  onecircleinversesansserif: 0x278A,\n  onedeva: 0x0967,\n  onedotenleader: 0x2024,\n  oneeighth: 0x215B,\n  onefitted: 0xF6DC,\n  onegujarati: 0x0AE7,\n  onegurmukhi: 0x0A67,\n  onehackarabic: 0x0661,\n  onehalf: 0x00BD,\n  onehangzhou: 0x3021,\n  oneideographicparen: 0x3220,\n  oneinferior: 0x2081,\n  onemonospace: 0xFF11,\n  onenumeratorbengali: 0x09F4,\n  oneoldstyle: 0xF731,\n  oneparen: 0x2474,\n  oneperiod: 0x2488,\n  onepersian: 0x06F1,\n  onequarter: 0x00BC,\n  oneroman: 0x2170,\n  onesuperior: 0x00B9,\n  onethai: 0x0E51,\n  onethird: 0x2153,\n  oogonek: 0x01EB,\n  oogonekmacron: 0x01ED,\n  oogurmukhi: 0x0A13,\n  oomatragurmukhi: 0x0A4B,\n  oopen: 0x0254,\n  oparen: 0x24AA,\n  openbullet: 0x25E6,\n  option: 0x2325,\n  ordfeminine: 0x00AA,\n  ordmasculine: 0x00BA,\n  orthogonal: 0x221F,\n  oshortdeva: 0x0912,\n  oshortvowelsigndeva: 0x094A,\n  oslash: 0x00F8,\n  oslashacute: 0x01FF,\n  osmallhiragana: 0x3049,\n  osmallkatakana: 0x30A9,\n  osmallkatakanahalfwidth: 0xFF6B,\n  ostrokeacute: 0x01FF,\n  osuperior: 0xF6F0,\n  otcyrillic: 0x047F,\n  otilde: 0x00F5,\n  otildeacute: 0x1E4D,\n  otildedieresis: 0x1E4F,\n  oubopomofo: 0x3121,\n  overline: 0x203E,\n  overlinecenterline: 0xFE4A,\n  overlinecmb: 0x0305,\n  overlinedashed: 0xFE49,\n  overlinedblwavy: 0xFE4C,\n  overlinewavy: 0xFE4B,\n  overscore: 0x00AF,\n  ovowelsignbengali: 0x09CB,\n  ovowelsigndeva: 0x094B,\n  ovowelsigngujarati: 0x0ACB,\n  p: 0x0070,\n  paampssquare: 0x3380,\n  paasentosquare: 0x332B,\n  pabengali: 0x09AA,\n  pacute: 0x1E55,\n  padeva: 0x092A,\n  pagedown: 0x21DF,\n  pageup: 0x21DE,\n  pagujarati: 0x0AAA,\n  pagurmukhi: 0x0A2A,\n  pahiragana: 0x3071,\n  paiyannoithai: 0x0E2F,\n  pakatakana: 0x30D1,\n  palatalizationcyrilliccmb: 0x0484,\n  palochkacyrillic: 0x04C0,\n  pansioskorean: 0x317F,\n  paragraph: 0x00B6,\n  parallel: 0x2225,\n  parenleft: 0x0028,\n  parenleftaltonearabic: 0xFD3E,\n  parenleftbt: 0xF8ED,\n  parenleftex: 0xF8EC,\n  parenleftinferior: 0x208D,\n  parenleftmonospace: 0xFF08,\n  parenleftsmall: 0xFE59,\n  parenleftsuperior: 0x207D,\n  parenlefttp: 0xF8EB,\n  parenleftvertical: 0xFE35,\n  parenright: 0x0029,\n  parenrightaltonearabic: 0xFD3F,\n  parenrightbt: 0xF8F8,\n  parenrightex: 0xF8F7,\n  parenrightinferior: 0x208E,\n  parenrightmonospace: 0xFF09,\n  parenrightsmall: 0xFE5A,\n  parenrightsuperior: 0x207E,\n  parenrighttp: 0xF8F6,\n  parenrightvertical: 0xFE36,\n  partialdiff: 0x2202,\n  paseqhebrew: 0x05C0,\n  pashtahebrew: 0x0599,\n  pasquare: 0x33A9,\n  patah: 0x05B7,\n  patah11: 0x05B7,\n  patah1d: 0x05B7,\n  patah2a: 0x05B7,\n  patahhebrew: 0x05B7,\n  patahnarrowhebrew: 0x05B7,\n  patahquarterhebrew: 0x05B7,\n  patahwidehebrew: 0x05B7,\n  pazerhebrew: 0x05A1,\n  pbopomofo: 0x3106,\n  pcircle: 0x24DF,\n  pdotaccent: 0x1E57,\n  pe: 0x05E4,\n  pecyrillic: 0x043F,\n  pedagesh: 0xFB44,\n  pedageshhebrew: 0xFB44,\n  peezisquare: 0x333B,\n  pefinaldageshhebrew: 0xFB43,\n  peharabic: 0x067E,\n  peharmenian: 0x057A,\n  pehebrew: 0x05E4,\n  pehfinalarabic: 0xFB57,\n  pehinitialarabic: 0xFB58,\n  pehiragana: 0x307A,\n  pehmedialarabic: 0xFB59,\n  pekatakana: 0x30DA,\n  pemiddlehookcyrillic: 0x04A7,\n  perafehebrew: 0xFB4E,\n  percent: 0x0025,\n  percentarabic: 0x066A,\n  percentmonospace: 0xFF05,\n  percentsmall: 0xFE6A,\n  period: 0x002E,\n  periodarmenian: 0x0589,\n  periodcentered: 0x00B7,\n  periodhalfwidth: 0xFF61,\n  periodinferior: 0xF6E7,\n  periodmonospace: 0xFF0E,\n  periodsmall: 0xFE52,\n  periodsuperior: 0xF6E8,\n  perispomenigreekcmb: 0x0342,\n  perpendicular: 0x22A5,\n  perthousand: 0x2030,\n  peseta: 0x20A7,\n  pfsquare: 0x338A,\n  phabengali: 0x09AB,\n  phadeva: 0x092B,\n  phagujarati: 0x0AAB,\n  phagurmukhi: 0x0A2B,\n  phi: 0x03C6,\n  phi1: 0x03D5,\n  phieuphacirclekorean: 0x327A,\n  phieuphaparenkorean: 0x321A,\n  phieuphcirclekorean: 0x326C,\n  phieuphkorean: 0x314D,\n  phieuphparenkorean: 0x320C,\n  philatin: 0x0278,\n  phinthuthai: 0x0E3A,\n  phisymbolgreek: 0x03D5,\n  phook: 0x01A5,\n  phophanthai: 0x0E1E,\n  phophungthai: 0x0E1C,\n  phosamphaothai: 0x0E20,\n  pi: 0x03C0,\n  pieupacirclekorean: 0x3273,\n  pieupaparenkorean: 0x3213,\n  pieupcieuckorean: 0x3176,\n  pieupcirclekorean: 0x3265,\n  pieupkiyeokkorean: 0x3172,\n  pieupkorean: 0x3142,\n  pieupparenkorean: 0x3205,\n  pieupsioskiyeokkorean: 0x3174,\n  pieupsioskorean: 0x3144,\n  pieupsiostikeutkorean: 0x3175,\n  pieupthieuthkorean: 0x3177,\n  pieuptikeutkorean: 0x3173,\n  pihiragana: 0x3074,\n  pikatakana: 0x30D4,\n  pisymbolgreek: 0x03D6,\n  piwrarmenian: 0x0583,\n  plus: 0x002B,\n  plusbelowcmb: 0x031F,\n  pluscircle: 0x2295,\n  plusminus: 0x00B1,\n  plusmod: 0x02D6,\n  plusmonospace: 0xFF0B,\n  plussmall: 0xFE62,\n  plussuperior: 0x207A,\n  pmonospace: 0xFF50,\n  pmsquare: 0x33D8,\n  pohiragana: 0x307D,\n  pointingindexdownwhite: 0x261F,\n  pointingindexleftwhite: 0x261C,\n  pointingindexrightwhite: 0x261E,\n  pointingindexupwhite: 0x261D,\n  pokatakana: 0x30DD,\n  poplathai: 0x0E1B,\n  postalmark: 0x3012,\n  postalmarkface: 0x3020,\n  pparen: 0x24AB,\n  precedes: 0x227A,\n  prescription: 0x211E,\n  primemod: 0x02B9,\n  primereversed: 0x2035,\n  product: 0x220F,\n  projective: 0x2305,\n  prolongedkana: 0x30FC,\n  propellor: 0x2318,\n  propersubset: 0x2282,\n  propersuperset: 0x2283,\n  proportion: 0x2237,\n  proportional: 0x221D,\n  psi: 0x03C8,\n  psicyrillic: 0x0471,\n  psilipneumatacyrilliccmb: 0x0486,\n  pssquare: 0x33B0,\n  puhiragana: 0x3077,\n  pukatakana: 0x30D7,\n  pvsquare: 0x33B4,\n  pwsquare: 0x33BA,\n  q: 0x0071,\n  qadeva: 0x0958,\n  qadmahebrew: 0x05A8,\n  qafarabic: 0x0642,\n  qaffinalarabic: 0xFED6,\n  qafinitialarabic: 0xFED7,\n  qafmedialarabic: 0xFED8,\n  qamats: 0x05B8,\n  qamats10: 0x05B8,\n  qamats1a: 0x05B8,\n  qamats1c: 0x05B8,\n  qamats27: 0x05B8,\n  qamats29: 0x05B8,\n  qamats33: 0x05B8,\n  qamatsde: 0x05B8,\n  qamatshebrew: 0x05B8,\n  qamatsnarrowhebrew: 0x05B8,\n  qamatsqatanhebrew: 0x05B8,\n  qamatsqatannarrowhebrew: 0x05B8,\n  qamatsqatanquarterhebrew: 0x05B8,\n  qamatsqatanwidehebrew: 0x05B8,\n  qamatsquarterhebrew: 0x05B8,\n  qamatswidehebrew: 0x05B8,\n  qarneyparahebrew: 0x059F,\n  qbopomofo: 0x3111,\n  qcircle: 0x24E0,\n  qhook: 0x02A0,\n  qmonospace: 0xFF51,\n  qof: 0x05E7,\n  qofdagesh: 0xFB47,\n  qofdageshhebrew: 0xFB47,\n  qofhebrew: 0x05E7,\n  qparen: 0x24AC,\n  quarternote: 0x2669,\n  qubuts: 0x05BB,\n  qubuts18: 0x05BB,\n  qubuts25: 0x05BB,\n  qubuts31: 0x05BB,\n  qubutshebrew: 0x05BB,\n  qubutsnarrowhebrew: 0x05BB,\n  qubutsquarterhebrew: 0x05BB,\n  qubutswidehebrew: 0x05BB,\n  question: 0x003F,\n  questionarabic: 0x061F,\n  questionarmenian: 0x055E,\n  questiondown: 0x00BF,\n  questiondownsmall: 0xF7BF,\n  questiongreek: 0x037E,\n  questionmonospace: 0xFF1F,\n  questionsmall: 0xF73F,\n  quotedbl: 0x0022,\n  quotedblbase: 0x201E,\n  quotedblleft: 0x201C,\n  quotedblmonospace: 0xFF02,\n  quotedblprime: 0x301E,\n  quotedblprimereversed: 0x301D,\n  quotedblright: 0x201D,\n  quoteleft: 0x2018,\n  quoteleftreversed: 0x201B,\n  quotereversed: 0x201B,\n  quoteright: 0x2019,\n  quoterightn: 0x0149,\n  quotesinglbase: 0x201A,\n  quotesingle: 0x0027,\n  quotesinglemonospace: 0xFF07,\n  r: 0x0072,\n  raarmenian: 0x057C,\n  rabengali: 0x09B0,\n  racute: 0x0155,\n  radeva: 0x0930,\n  radical: 0x221A,\n  radicalex: 0xF8E5,\n  radoverssquare: 0x33AE,\n  radoverssquaredsquare: 0x33AF,\n  radsquare: 0x33AD,\n  rafe: 0x05BF,\n  rafehebrew: 0x05BF,\n  ragujarati: 0x0AB0,\n  ragurmukhi: 0x0A30,\n  rahiragana: 0x3089,\n  rakatakana: 0x30E9,\n  rakatakanahalfwidth: 0xFF97,\n  ralowerdiagonalbengali: 0x09F1,\n  ramiddlediagonalbengali: 0x09F0,\n  ramshorn: 0x0264,\n  ratio: 0x2236,\n  rbopomofo: 0x3116,\n  rcaron: 0x0159,\n  rcedilla: 0x0157,\n  rcircle: 0x24E1,\n  rcommaaccent: 0x0157,\n  rdblgrave: 0x0211,\n  rdotaccent: 0x1E59,\n  rdotbelow: 0x1E5B,\n  rdotbelowmacron: 0x1E5D,\n  referencemark: 0x203B,\n  reflexsubset: 0x2286,\n  reflexsuperset: 0x2287,\n  registered: 0x00AE,\n  registersans: 0xF8E8,\n  registerserif: 0xF6DA,\n  reharabic: 0x0631,\n  reharmenian: 0x0580,\n  rehfinalarabic: 0xFEAE,\n  rehiragana: 0x308C,\n  rekatakana: 0x30EC,\n  rekatakanahalfwidth: 0xFF9A,\n  resh: 0x05E8,\n  reshdageshhebrew: 0xFB48,\n  reshhebrew: 0x05E8,\n  reversedtilde: 0x223D,\n  reviahebrew: 0x0597,\n  reviamugrashhebrew: 0x0597,\n  revlogicalnot: 0x2310,\n  rfishhook: 0x027E,\n  rfishhookreversed: 0x027F,\n  rhabengali: 0x09DD,\n  rhadeva: 0x095D,\n  rho: 0x03C1,\n  rhook: 0x027D,\n  rhookturned: 0x027B,\n  rhookturnedsuperior: 0x02B5,\n  rhosymbolgreek: 0x03F1,\n  rhotichookmod: 0x02DE,\n  rieulacirclekorean: 0x3271,\n  rieulaparenkorean: 0x3211,\n  rieulcirclekorean: 0x3263,\n  rieulhieuhkorean: 0x3140,\n  rieulkiyeokkorean: 0x313A,\n  rieulkiyeoksioskorean: 0x3169,\n  rieulkorean: 0x3139,\n  rieulmieumkorean: 0x313B,\n  rieulpansioskorean: 0x316C,\n  rieulparenkorean: 0x3203,\n  rieulphieuphkorean: 0x313F,\n  rieulpieupkorean: 0x313C,\n  rieulpieupsioskorean: 0x316B,\n  rieulsioskorean: 0x313D,\n  rieulthieuthkorean: 0x313E,\n  rieultikeutkorean: 0x316A,\n  rieulyeorinhieuhkorean: 0x316D,\n  rightangle: 0x221F,\n  righttackbelowcmb: 0x0319,\n  righttriangle: 0x22BF,\n  rihiragana: 0x308A,\n  rikatakana: 0x30EA,\n  rikatakanahalfwidth: 0xFF98,\n  ring: 0x02DA,\n  ringbelowcmb: 0x0325,\n  ringcmb: 0x030A,\n  ringhalfleft: 0x02BF,\n  ringhalfleftarmenian: 0x0559,\n  ringhalfleftbelowcmb: 0x031C,\n  ringhalfleftcentered: 0x02D3,\n  ringhalfright: 0x02BE,\n  ringhalfrightbelowcmb: 0x0339,\n  ringhalfrightcentered: 0x02D2,\n  rinvertedbreve: 0x0213,\n  rittorusquare: 0x3351,\n  rlinebelow: 0x1E5F,\n  rlongleg: 0x027C,\n  rlonglegturned: 0x027A,\n  rmonospace: 0xFF52,\n  rohiragana: 0x308D,\n  rokatakana: 0x30ED,\n  rokatakanahalfwidth: 0xFF9B,\n  roruathai: 0x0E23,\n  rparen: 0x24AD,\n  rrabengali: 0x09DC,\n  rradeva: 0x0931,\n  rragurmukhi: 0x0A5C,\n  rreharabic: 0x0691,\n  rrehfinalarabic: 0xFB8D,\n  rrvocalicbengali: 0x09E0,\n  rrvocalicdeva: 0x0960,\n  rrvocalicgujarati: 0x0AE0,\n  rrvocalicvowelsignbengali: 0x09C4,\n  rrvocalicvowelsigndeva: 0x0944,\n  rrvocalicvowelsigngujarati: 0x0AC4,\n  rsuperior: 0xF6F1,\n  rtblock: 0x2590,\n  rturned: 0x0279,\n  rturnedsuperior: 0x02B4,\n  ruhiragana: 0x308B,\n  rukatakana: 0x30EB,\n  rukatakanahalfwidth: 0xFF99,\n  rupeemarkbengali: 0x09F2,\n  rupeesignbengali: 0x09F3,\n  rupiah: 0xF6DD,\n  ruthai: 0x0E24,\n  rvocalicbengali: 0x098B,\n  rvocalicdeva: 0x090B,\n  rvocalicgujarati: 0x0A8B,\n  rvocalicvowelsignbengali: 0x09C3,\n  rvocalicvowelsigndeva: 0x0943,\n  rvocalicvowelsigngujarati: 0x0AC3,\n  s: 0x0073,\n  sabengali: 0x09B8,\n  sacute: 0x015B,\n  sacutedotaccent: 0x1E65,\n  sadarabic: 0x0635,\n  sadeva: 0x0938,\n  sadfinalarabic: 0xFEBA,\n  sadinitialarabic: 0xFEBB,\n  sadmedialarabic: 0xFEBC,\n  sagujarati: 0x0AB8,\n  sagurmukhi: 0x0A38,\n  sahiragana: 0x3055,\n  sakatakana: 0x30B5,\n  sakatakanahalfwidth: 0xFF7B,\n  sallallahoualayhewasallamarabic: 0xFDFA,\n  samekh: 0x05E1,\n  samekhdagesh: 0xFB41,\n  samekhdageshhebrew: 0xFB41,\n  samekhhebrew: 0x05E1,\n  saraaathai: 0x0E32,\n  saraaethai: 0x0E41,\n  saraaimaimalaithai: 0x0E44,\n  saraaimaimuanthai: 0x0E43,\n  saraamthai: 0x0E33,\n  saraathai: 0x0E30,\n  saraethai: 0x0E40,\n  saraiileftthai: 0xF886,\n  saraiithai: 0x0E35,\n  saraileftthai: 0xF885,\n  saraithai: 0x0E34,\n  saraothai: 0x0E42,\n  saraueeleftthai: 0xF888,\n  saraueethai: 0x0E37,\n  saraueleftthai: 0xF887,\n  sarauethai: 0x0E36,\n  sarauthai: 0x0E38,\n  sarauuthai: 0x0E39,\n  sbopomofo: 0x3119,\n  scaron: 0x0161,\n  scarondotaccent: 0x1E67,\n  scedilla: 0x015F,\n  schwa: 0x0259,\n  schwacyrillic: 0x04D9,\n  schwadieresiscyrillic: 0x04DB,\n  schwahook: 0x025A,\n  scircle: 0x24E2,\n  scircumflex: 0x015D,\n  scommaaccent: 0x0219,\n  sdotaccent: 0x1E61,\n  sdotbelow: 0x1E63,\n  sdotbelowdotaccent: 0x1E69,\n  seagullbelowcmb: 0x033C,\n  second: 0x2033,\n  secondtonechinese: 0x02CA,\n  section: 0x00A7,\n  seenarabic: 0x0633,\n  seenfinalarabic: 0xFEB2,\n  seeninitialarabic: 0xFEB3,\n  seenmedialarabic: 0xFEB4,\n  segol: 0x05B6,\n  segol13: 0x05B6,\n  segol1f: 0x05B6,\n  segol2c: 0x05B6,\n  segolhebrew: 0x05B6,\n  segolnarrowhebrew: 0x05B6,\n  segolquarterhebrew: 0x05B6,\n  segoltahebrew: 0x0592,\n  segolwidehebrew: 0x05B6,\n  seharmenian: 0x057D,\n  sehiragana: 0x305B,\n  sekatakana: 0x30BB,\n  sekatakanahalfwidth: 0xFF7E,\n  semicolon: 0x003B,\n  semicolonarabic: 0x061B,\n  semicolonmonospace: 0xFF1B,\n  semicolonsmall: 0xFE54,\n  semivoicedmarkkana: 0x309C,\n  semivoicedmarkkanahalfwidth: 0xFF9F,\n  sentisquare: 0x3322,\n  sentosquare: 0x3323,\n  seven: 0x0037,\n  sevenarabic: 0x0667,\n  sevenbengali: 0x09ED,\n  sevencircle: 0x2466,\n  sevencircleinversesansserif: 0x2790,\n  sevendeva: 0x096D,\n  seveneighths: 0x215E,\n  sevengujarati: 0x0AED,\n  sevengurmukhi: 0x0A6D,\n  sevenhackarabic: 0x0667,\n  sevenhangzhou: 0x3027,\n  sevenideographicparen: 0x3226,\n  seveninferior: 0x2087,\n  sevenmonospace: 0xFF17,\n  sevenoldstyle: 0xF737,\n  sevenparen: 0x247A,\n  sevenperiod: 0x248E,\n  sevenpersian: 0x06F7,\n  sevenroman: 0x2176,\n  sevensuperior: 0x2077,\n  seventeencircle: 0x2470,\n  seventeenparen: 0x2484,\n  seventeenperiod: 0x2498,\n  seventhai: 0x0E57,\n  sfthyphen: 0x00AD,\n  shaarmenian: 0x0577,\n  shabengali: 0x09B6,\n  shacyrillic: 0x0448,\n  shaddaarabic: 0x0651,\n  shaddadammaarabic: 0xFC61,\n  shaddadammatanarabic: 0xFC5E,\n  shaddafathaarabic: 0xFC60,\n  shaddakasraarabic: 0xFC62,\n  shaddakasratanarabic: 0xFC5F,\n  shade: 0x2592,\n  shadedark: 0x2593,\n  shadelight: 0x2591,\n  shademedium: 0x2592,\n  shadeva: 0x0936,\n  shagujarati: 0x0AB6,\n  shagurmukhi: 0x0A36,\n  shalshelethebrew: 0x0593,\n  shbopomofo: 0x3115,\n  shchacyrillic: 0x0449,\n  sheenarabic: 0x0634,\n  sheenfinalarabic: 0xFEB6,\n  sheeninitialarabic: 0xFEB7,\n  sheenmedialarabic: 0xFEB8,\n  sheicoptic: 0x03E3,\n  sheqel: 0x20AA,\n  sheqelhebrew: 0x20AA,\n  sheva: 0x05B0,\n  sheva115: 0x05B0,\n  sheva15: 0x05B0,\n  sheva22: 0x05B0,\n  sheva2e: 0x05B0,\n  shevahebrew: 0x05B0,\n  shevanarrowhebrew: 0x05B0,\n  shevaquarterhebrew: 0x05B0,\n  shevawidehebrew: 0x05B0,\n  shhacyrillic: 0x04BB,\n  shimacoptic: 0x03ED,\n  shin: 0x05E9,\n  shindagesh: 0xFB49,\n  shindageshhebrew: 0xFB49,\n  shindageshshindot: 0xFB2C,\n  shindageshshindothebrew: 0xFB2C,\n  shindageshsindot: 0xFB2D,\n  shindageshsindothebrew: 0xFB2D,\n  shindothebrew: 0x05C1,\n  shinhebrew: 0x05E9,\n  shinshindot: 0xFB2A,\n  shinshindothebrew: 0xFB2A,\n  shinsindot: 0xFB2B,\n  shinsindothebrew: 0xFB2B,\n  shook: 0x0282,\n  sigma: 0x03C3,\n  sigma1: 0x03C2,\n  sigmafinal: 0x03C2,\n  sigmalunatesymbolgreek: 0x03F2,\n  sihiragana: 0x3057,\n  sikatakana: 0x30B7,\n  sikatakanahalfwidth: 0xFF7C,\n  siluqhebrew: 0x05BD,\n  siluqlefthebrew: 0x05BD,\n  similar: 0x223C,\n  sindothebrew: 0x05C2,\n  siosacirclekorean: 0x3274,\n  siosaparenkorean: 0x3214,\n  sioscieuckorean: 0x317E,\n  sioscirclekorean: 0x3266,\n  sioskiyeokkorean: 0x317A,\n  sioskorean: 0x3145,\n  siosnieunkorean: 0x317B,\n  siosparenkorean: 0x3206,\n  siospieupkorean: 0x317D,\n  siostikeutkorean: 0x317C,\n  six: 0x0036,\n  sixarabic: 0x0666,\n  sixbengali: 0x09EC,\n  sixcircle: 0x2465,\n  sixcircleinversesansserif: 0x278F,\n  sixdeva: 0x096C,\n  sixgujarati: 0x0AEC,\n  sixgurmukhi: 0x0A6C,\n  sixhackarabic: 0x0666,\n  sixhangzhou: 0x3026,\n  sixideographicparen: 0x3225,\n  sixinferior: 0x2086,\n  sixmonospace: 0xFF16,\n  sixoldstyle: 0xF736,\n  sixparen: 0x2479,\n  sixperiod: 0x248D,\n  sixpersian: 0x06F6,\n  sixroman: 0x2175,\n  sixsuperior: 0x2076,\n  sixteencircle: 0x246F,\n  sixteencurrencydenominatorbengali: 0x09F9,\n  sixteenparen: 0x2483,\n  sixteenperiod: 0x2497,\n  sixthai: 0x0E56,\n  slash: 0x002F,\n  slashmonospace: 0xFF0F,\n  slong: 0x017F,\n  slongdotaccent: 0x1E9B,\n  smileface: 0x263A,\n  smonospace: 0xFF53,\n  sofpasuqhebrew: 0x05C3,\n  softhyphen: 0x00AD,\n  softsigncyrillic: 0x044C,\n  sohiragana: 0x305D,\n  sokatakana: 0x30BD,\n  sokatakanahalfwidth: 0xFF7F,\n  soliduslongoverlaycmb: 0x0338,\n  solidusshortoverlaycmb: 0x0337,\n  sorusithai: 0x0E29,\n  sosalathai: 0x0E28,\n  sosothai: 0x0E0B,\n  sosuathai: 0x0E2A,\n  space: 0x0020,\n  spacehackarabic: 0x0020,\n  spade: 0x2660,\n  spadesuitblack: 0x2660,\n  spadesuitwhite: 0x2664,\n  sparen: 0x24AE,\n  squarebelowcmb: 0x033B,\n  squarecc: 0x33C4,\n  squarecm: 0x339D,\n  squarediagonalcrosshatchfill: 0x25A9,\n  squarehorizontalfill: 0x25A4,\n  squarekg: 0x338F,\n  squarekm: 0x339E,\n  squarekmcapital: 0x33CE,\n  squareln: 0x33D1,\n  squarelog: 0x33D2,\n  squaremg: 0x338E,\n  squaremil: 0x33D5,\n  squaremm: 0x339C,\n  squaremsquared: 0x33A1,\n  squareorthogonalcrosshatchfill: 0x25A6,\n  squareupperlefttolowerrightfill: 0x25A7,\n  squareupperrighttolowerleftfill: 0x25A8,\n  squareverticalfill: 0x25A5,\n  squarewhitewithsmallblack: 0x25A3,\n  srsquare: 0x33DB,\n  ssabengali: 0x09B7,\n  ssadeva: 0x0937,\n  ssagujarati: 0x0AB7,\n  ssangcieuckorean: 0x3149,\n  ssanghieuhkorean: 0x3185,\n  ssangieungkorean: 0x3180,\n  ssangkiyeokkorean: 0x3132,\n  ssangnieunkorean: 0x3165,\n  ssangpieupkorean: 0x3143,\n  ssangsioskorean: 0x3146,\n  ssangtikeutkorean: 0x3138,\n  ssuperior: 0xF6F2,\n  sterling: 0x00A3,\n  sterlingmonospace: 0xFFE1,\n  strokelongoverlaycmb: 0x0336,\n  strokeshortoverlaycmb: 0x0335,\n  subset: 0x2282,\n  subsetnotequal: 0x228A,\n  subsetorequal: 0x2286,\n  succeeds: 0x227B,\n  suchthat: 0x220B,\n  suhiragana: 0x3059,\n  sukatakana: 0x30B9,\n  sukatakanahalfwidth: 0xFF7D,\n  sukunarabic: 0x0652,\n  summation: 0x2211,\n  sun: 0x263C,\n  superset: 0x2283,\n  supersetnotequal: 0x228B,\n  supersetorequal: 0x2287,\n  svsquare: 0x33DC,\n  syouwaerasquare: 0x337C,\n  t: 0x0074,\n  tabengali: 0x09A4,\n  tackdown: 0x22A4,\n  tackleft: 0x22A3,\n  tadeva: 0x0924,\n  tagujarati: 0x0AA4,\n  tagurmukhi: 0x0A24,\n  taharabic: 0x0637,\n  tahfinalarabic: 0xFEC2,\n  tahinitialarabic: 0xFEC3,\n  tahiragana: 0x305F,\n  tahmedialarabic: 0xFEC4,\n  taisyouerasquare: 0x337D,\n  takatakana: 0x30BF,\n  takatakanahalfwidth: 0xFF80,\n  tatweelarabic: 0x0640,\n  tau: 0x03C4,\n  tav: 0x05EA,\n  tavdages: 0xFB4A,\n  tavdagesh: 0xFB4A,\n  tavdageshhebrew: 0xFB4A,\n  tavhebrew: 0x05EA,\n  tbar: 0x0167,\n  tbopomofo: 0x310A,\n  tcaron: 0x0165,\n  tccurl: 0x02A8,\n  tcedilla: 0x0163,\n  tcheharabic: 0x0686,\n  tchehfinalarabic: 0xFB7B,\n  tchehinitialarabic: 0xFB7C,\n  tchehmedialarabic: 0xFB7D,\n  tcircle: 0x24E3,\n  tcircumflexbelow: 0x1E71,\n  tcommaaccent: 0x0163,\n  tdieresis: 0x1E97,\n  tdotaccent: 0x1E6B,\n  tdotbelow: 0x1E6D,\n  tecyrillic: 0x0442,\n  tedescendercyrillic: 0x04AD,\n  teharabic: 0x062A,\n  tehfinalarabic: 0xFE96,\n  tehhahinitialarabic: 0xFCA2,\n  tehhahisolatedarabic: 0xFC0C,\n  tehinitialarabic: 0xFE97,\n  tehiragana: 0x3066,\n  tehjeeminitialarabic: 0xFCA1,\n  tehjeemisolatedarabic: 0xFC0B,\n  tehmarbutaarabic: 0x0629,\n  tehmarbutafinalarabic: 0xFE94,\n  tehmedialarabic: 0xFE98,\n  tehmeeminitialarabic: 0xFCA4,\n  tehmeemisolatedarabic: 0xFC0E,\n  tehnoonfinalarabic: 0xFC73,\n  tekatakana: 0x30C6,\n  tekatakanahalfwidth: 0xFF83,\n  telephone: 0x2121,\n  telephoneblack: 0x260E,\n  telishagedolahebrew: 0x05A0,\n  telishaqetanahebrew: 0x05A9,\n  tencircle: 0x2469,\n  tenideographicparen: 0x3229,\n  tenparen: 0x247D,\n  tenperiod: 0x2491,\n  tenroman: 0x2179,\n  tesh: 0x02A7,\n  tet: 0x05D8,\n  tetdagesh: 0xFB38,\n  tetdageshhebrew: 0xFB38,\n  tethebrew: 0x05D8,\n  tetsecyrillic: 0x04B5,\n  tevirhebrew: 0x059B,\n  tevirlefthebrew: 0x059B,\n  thabengali: 0x09A5,\n  thadeva: 0x0925,\n  thagujarati: 0x0AA5,\n  thagurmukhi: 0x0A25,\n  thalarabic: 0x0630,\n  thalfinalarabic: 0xFEAC,\n  thanthakhatlowleftthai: 0xF898,\n  thanthakhatlowrightthai: 0xF897,\n  thanthakhatthai: 0x0E4C,\n  thanthakhatupperleftthai: 0xF896,\n  theharabic: 0x062B,\n  thehfinalarabic: 0xFE9A,\n  thehinitialarabic: 0xFE9B,\n  thehmedialarabic: 0xFE9C,\n  thereexists: 0x2203,\n  therefore: 0x2234,\n  theta: 0x03B8,\n  theta1: 0x03D1,\n  thetasymbolgreek: 0x03D1,\n  thieuthacirclekorean: 0x3279,\n  thieuthaparenkorean: 0x3219,\n  thieuthcirclekorean: 0x326B,\n  thieuthkorean: 0x314C,\n  thieuthparenkorean: 0x320B,\n  thirteencircle: 0x246C,\n  thirteenparen: 0x2480,\n  thirteenperiod: 0x2494,\n  thonangmonthothai: 0x0E11,\n  thook: 0x01AD,\n  thophuthaothai: 0x0E12,\n  thorn: 0x00FE,\n  thothahanthai: 0x0E17,\n  thothanthai: 0x0E10,\n  thothongthai: 0x0E18,\n  thothungthai: 0x0E16,\n  thousandcyrillic: 0x0482,\n  thousandsseparatorarabic: 0x066C,\n  thousandsseparatorpersian: 0x066C,\n  three: 0x0033,\n  threearabic: 0x0663,\n  threebengali: 0x09E9,\n  threecircle: 0x2462,\n  threecircleinversesansserif: 0x278C,\n  threedeva: 0x0969,\n  threeeighths: 0x215C,\n  threegujarati: 0x0AE9,\n  threegurmukhi: 0x0A69,\n  threehackarabic: 0x0663,\n  threehangzhou: 0x3023,\n  threeideographicparen: 0x3222,\n  threeinferior: 0x2083,\n  threemonospace: 0xFF13,\n  threenumeratorbengali: 0x09F6,\n  threeoldstyle: 0xF733,\n  threeparen: 0x2476,\n  threeperiod: 0x248A,\n  threepersian: 0x06F3,\n  threequarters: 0x00BE,\n  threequartersemdash: 0xF6DE,\n  threeroman: 0x2172,\n  threesuperior: 0x00B3,\n  threethai: 0x0E53,\n  thzsquare: 0x3394,\n  tihiragana: 0x3061,\n  tikatakana: 0x30C1,\n  tikatakanahalfwidth: 0xFF81,\n  tikeutacirclekorean: 0x3270,\n  tikeutaparenkorean: 0x3210,\n  tikeutcirclekorean: 0x3262,\n  tikeutkorean: 0x3137,\n  tikeutparenkorean: 0x3202,\n  tilde: 0x02DC,\n  tildebelowcmb: 0x0330,\n  tildecmb: 0x0303,\n  tildecomb: 0x0303,\n  tildedoublecmb: 0x0360,\n  tildeoperator: 0x223C,\n  tildeoverlaycmb: 0x0334,\n  tildeverticalcmb: 0x033E,\n  timescircle: 0x2297,\n  tipehahebrew: 0x0596,\n  tipehalefthebrew: 0x0596,\n  tippigurmukhi: 0x0A70,\n  titlocyrilliccmb: 0x0483,\n  tiwnarmenian: 0x057F,\n  tlinebelow: 0x1E6F,\n  tmonospace: 0xFF54,\n  toarmenian: 0x0569,\n  tohiragana: 0x3068,\n  tokatakana: 0x30C8,\n  tokatakanahalfwidth: 0xFF84,\n  tonebarextrahighmod: 0x02E5,\n  tonebarextralowmod: 0x02E9,\n  tonebarhighmod: 0x02E6,\n  tonebarlowmod: 0x02E8,\n  tonebarmidmod: 0x02E7,\n  tonefive: 0x01BD,\n  tonesix: 0x0185,\n  tonetwo: 0x01A8,\n  tonos: 0x0384,\n  tonsquare: 0x3327,\n  topatakthai: 0x0E0F,\n  tortoiseshellbracketleft: 0x3014,\n  tortoiseshellbracketleftsmall: 0xFE5D,\n  tortoiseshellbracketleftvertical: 0xFE39,\n  tortoiseshellbracketright: 0x3015,\n  tortoiseshellbracketrightsmall: 0xFE5E,\n  tortoiseshellbracketrightvertical: 0xFE3A,\n  totaothai: 0x0E15,\n  tpalatalhook: 0x01AB,\n  tparen: 0x24AF,\n  trademark: 0x2122,\n  trademarksans: 0xF8EA,\n  trademarkserif: 0xF6DB,\n  tretroflexhook: 0x0288,\n  triagdn: 0x25BC,\n  triaglf: 0x25C4,\n  triagrt: 0x25BA,\n  triagup: 0x25B2,\n  ts: 0x02A6,\n  tsadi: 0x05E6,\n  tsadidagesh: 0xFB46,\n  tsadidageshhebrew: 0xFB46,\n  tsadihebrew: 0x05E6,\n  tsecyrillic: 0x0446,\n  tsere: 0x05B5,\n  tsere12: 0x05B5,\n  tsere1e: 0x05B5,\n  tsere2b: 0x05B5,\n  tserehebrew: 0x05B5,\n  tserenarrowhebrew: 0x05B5,\n  tserequarterhebrew: 0x05B5,\n  tserewidehebrew: 0x05B5,\n  tshecyrillic: 0x045B,\n  tsuperior: 0xF6F3,\n  ttabengali: 0x099F,\n  ttadeva: 0x091F,\n  ttagujarati: 0x0A9F,\n  ttagurmukhi: 0x0A1F,\n  tteharabic: 0x0679,\n  ttehfinalarabic: 0xFB67,\n  ttehinitialarabic: 0xFB68,\n  ttehmedialarabic: 0xFB69,\n  tthabengali: 0x09A0,\n  tthadeva: 0x0920,\n  tthagujarati: 0x0AA0,\n  tthagurmukhi: 0x0A20,\n  tturned: 0x0287,\n  tuhiragana: 0x3064,\n  tukatakana: 0x30C4,\n  tukatakanahalfwidth: 0xFF82,\n  tusmallhiragana: 0x3063,\n  tusmallkatakana: 0x30C3,\n  tusmallkatakanahalfwidth: 0xFF6F,\n  twelvecircle: 0x246B,\n  twelveparen: 0x247F,\n  twelveperiod: 0x2493,\n  twelveroman: 0x217B,\n  twentycircle: 0x2473,\n  twentyhangzhou: 0x5344,\n  twentyparen: 0x2487,\n  twentyperiod: 0x249B,\n  two: 0x0032,\n  twoarabic: 0x0662,\n  twobengali: 0x09E8,\n  twocircle: 0x2461,\n  twocircleinversesansserif: 0x278B,\n  twodeva: 0x0968,\n  twodotenleader: 0x2025,\n  twodotleader: 0x2025,\n  twodotleadervertical: 0xFE30,\n  twogujarati: 0x0AE8,\n  twogurmukhi: 0x0A68,\n  twohackarabic: 0x0662,\n  twohangzhou: 0x3022,\n  twoideographicparen: 0x3221,\n  twoinferior: 0x2082,\n  twomonospace: 0xFF12,\n  twonumeratorbengali: 0x09F5,\n  twooldstyle: 0xF732,\n  twoparen: 0x2475,\n  twoperiod: 0x2489,\n  twopersian: 0x06F2,\n  tworoman: 0x2171,\n  twostroke: 0x01BB,\n  twosuperior: 0x00B2,\n  twothai: 0x0E52,\n  twothirds: 0x2154,\n  u: 0x0075,\n  uacute: 0x00FA,\n  ubar: 0x0289,\n  ubengali: 0x0989,\n  ubopomofo: 0x3128,\n  ubreve: 0x016D,\n  ucaron: 0x01D4,\n  ucircle: 0x24E4,\n  ucircumflex: 0x00FB,\n  ucircumflexbelow: 0x1E77,\n  ucyrillic: 0x0443,\n  udattadeva: 0x0951,\n  udblacute: 0x0171,\n  udblgrave: 0x0215,\n  udeva: 0x0909,\n  udieresis: 0x00FC,\n  udieresisacute: 0x01D8,\n  udieresisbelow: 0x1E73,\n  udieresiscaron: 0x01DA,\n  udieresiscyrillic: 0x04F1,\n  udieresisgrave: 0x01DC,\n  udieresismacron: 0x01D6,\n  udotbelow: 0x1EE5,\n  ugrave: 0x00F9,\n  ugujarati: 0x0A89,\n  ugurmukhi: 0x0A09,\n  uhiragana: 0x3046,\n  uhookabove: 0x1EE7,\n  uhorn: 0x01B0,\n  uhornacute: 0x1EE9,\n  uhorndotbelow: 0x1EF1,\n  uhorngrave: 0x1EEB,\n  uhornhookabove: 0x1EED,\n  uhorntilde: 0x1EEF,\n  uhungarumlaut: 0x0171,\n  uhungarumlautcyrillic: 0x04F3,\n  uinvertedbreve: 0x0217,\n  ukatakana: 0x30A6,\n  ukatakanahalfwidth: 0xFF73,\n  ukcyrillic: 0x0479,\n  ukorean: 0x315C,\n  umacron: 0x016B,\n  umacroncyrillic: 0x04EF,\n  umacrondieresis: 0x1E7B,\n  umatragurmukhi: 0x0A41,\n  umonospace: 0xFF55,\n  underscore: 0x005F,\n  underscoredbl: 0x2017,\n  underscoremonospace: 0xFF3F,\n  underscorevertical: 0xFE33,\n  underscorewavy: 0xFE4F,\n  union: 0x222A,\n  universal: 0x2200,\n  uogonek: 0x0173,\n  uparen: 0x24B0,\n  upblock: 0x2580,\n  upperdothebrew: 0x05C4,\n  upsilon: 0x03C5,\n  upsilondieresis: 0x03CB,\n  upsilondieresistonos: 0x03B0,\n  upsilonlatin: 0x028A,\n  upsilontonos: 0x03CD,\n  uptackbelowcmb: 0x031D,\n  uptackmod: 0x02D4,\n  uragurmukhi: 0x0A73,\n  uring: 0x016F,\n  ushortcyrillic: 0x045E,\n  usmallhiragana: 0x3045,\n  usmallkatakana: 0x30A5,\n  usmallkatakanahalfwidth: 0xFF69,\n  ustraightcyrillic: 0x04AF,\n  ustraightstrokecyrillic: 0x04B1,\n  utilde: 0x0169,\n  utildeacute: 0x1E79,\n  utildebelow: 0x1E75,\n  uubengali: 0x098A,\n  uudeva: 0x090A,\n  uugujarati: 0x0A8A,\n  uugurmukhi: 0x0A0A,\n  uumatragurmukhi: 0x0A42,\n  uuvowelsignbengali: 0x09C2,\n  uuvowelsigndeva: 0x0942,\n  uuvowelsigngujarati: 0x0AC2,\n  uvowelsignbengali: 0x09C1,\n  uvowelsigndeva: 0x0941,\n  uvowelsigngujarati: 0x0AC1,\n  v: 0x0076,\n  vadeva: 0x0935,\n  vagujarati: 0x0AB5,\n  vagurmukhi: 0x0A35,\n  vakatakana: 0x30F7,\n  vav: 0x05D5,\n  vavdagesh: 0xFB35,\n  vavdagesh65: 0xFB35,\n  vavdageshhebrew: 0xFB35,\n  vavhebrew: 0x05D5,\n  vavholam: 0xFB4B,\n  vavholamhebrew: 0xFB4B,\n  vavvavhebrew: 0x05F0,\n  vavyodhebrew: 0x05F1,\n  vcircle: 0x24E5,\n  vdotbelow: 0x1E7F,\n  vecyrillic: 0x0432,\n  veharabic: 0x06A4,\n  vehfinalarabic: 0xFB6B,\n  vehinitialarabic: 0xFB6C,\n  vehmedialarabic: 0xFB6D,\n  vekatakana: 0x30F9,\n  venus: 0x2640,\n  verticalbar: 0x007C,\n  verticallineabovecmb: 0x030D,\n  verticallinebelowcmb: 0x0329,\n  verticallinelowmod: 0x02CC,\n  verticallinemod: 0x02C8,\n  vewarmenian: 0x057E,\n  vhook: 0x028B,\n  vikatakana: 0x30F8,\n  viramabengali: 0x09CD,\n  viramadeva: 0x094D,\n  viramagujarati: 0x0ACD,\n  visargabengali: 0x0983,\n  visargadeva: 0x0903,\n  visargagujarati: 0x0A83,\n  vmonospace: 0xFF56,\n  voarmenian: 0x0578,\n  voicediterationhiragana: 0x309E,\n  voicediterationkatakana: 0x30FE,\n  voicedmarkkana: 0x309B,\n  voicedmarkkanahalfwidth: 0xFF9E,\n  vokatakana: 0x30FA,\n  vparen: 0x24B1,\n  vtilde: 0x1E7D,\n  vturned: 0x028C,\n  vuhiragana: 0x3094,\n  vukatakana: 0x30F4,\n  w: 0x0077,\n  wacute: 0x1E83,\n  waekorean: 0x3159,\n  wahiragana: 0x308F,\n  wakatakana: 0x30EF,\n  wakatakanahalfwidth: 0xFF9C,\n  wakorean: 0x3158,\n  wasmallhiragana: 0x308E,\n  wasmallkatakana: 0x30EE,\n  wattosquare: 0x3357,\n  wavedash: 0x301C,\n  wavyunderscorevertical: 0xFE34,\n  wawarabic: 0x0648,\n  wawfinalarabic: 0xFEEE,\n  wawhamzaabovearabic: 0x0624,\n  wawhamzaabovefinalarabic: 0xFE86,\n  wbsquare: 0x33DD,\n  wcircle: 0x24E6,\n  wcircumflex: 0x0175,\n  wdieresis: 0x1E85,\n  wdotaccent: 0x1E87,\n  wdotbelow: 0x1E89,\n  wehiragana: 0x3091,\n  weierstrass: 0x2118,\n  wekatakana: 0x30F1,\n  wekorean: 0x315E,\n  weokorean: 0x315D,\n  wgrave: 0x1E81,\n  whitebullet: 0x25E6,\n  whitecircle: 0x25CB,\n  whitecircleinverse: 0x25D9,\n  whitecornerbracketleft: 0x300E,\n  whitecornerbracketleftvertical: 0xFE43,\n  whitecornerbracketright: 0x300F,\n  whitecornerbracketrightvertical: 0xFE44,\n  whitediamond: 0x25C7,\n  whitediamondcontainingblacksmalldiamond: 0x25C8,\n  whitedownpointingsmalltriangle: 0x25BF,\n  whitedownpointingtriangle: 0x25BD,\n  whiteleftpointingsmalltriangle: 0x25C3,\n  whiteleftpointingtriangle: 0x25C1,\n  whitelenticularbracketleft: 0x3016,\n  whitelenticularbracketright: 0x3017,\n  whiterightpointingsmalltriangle: 0x25B9,\n  whiterightpointingtriangle: 0x25B7,\n  whitesmallsquare: 0x25AB,\n  whitesmilingface: 0x263A,\n  whitesquare: 0x25A1,\n  whitestar: 0x2606,\n  whitetelephone: 0x260F,\n  whitetortoiseshellbracketleft: 0x3018,\n  whitetortoiseshellbracketright: 0x3019,\n  whiteuppointingsmalltriangle: 0x25B5,\n  whiteuppointingtriangle: 0x25B3,\n  wihiragana: 0x3090,\n  wikatakana: 0x30F0,\n  wikorean: 0x315F,\n  wmonospace: 0xFF57,\n  wohiragana: 0x3092,\n  wokatakana: 0x30F2,\n  wokatakanahalfwidth: 0xFF66,\n  won: 0x20A9,\n  wonmonospace: 0xFFE6,\n  wowaenthai: 0x0E27,\n  wparen: 0x24B2,\n  wring: 0x1E98,\n  wsuperior: 0x02B7,\n  wturned: 0x028D,\n  wynn: 0x01BF,\n  x: 0x0078,\n  xabovecmb: 0x033D,\n  xbopomofo: 0x3112,\n  xcircle: 0x24E7,\n  xdieresis: 0x1E8D,\n  xdotaccent: 0x1E8B,\n  xeharmenian: 0x056D,\n  xi: 0x03BE,\n  xmonospace: 0xFF58,\n  xparen: 0x24B3,\n  xsuperior: 0x02E3,\n  y: 0x0079,\n  yaadosquare: 0x334E,\n  yabengali: 0x09AF,\n  yacute: 0x00FD,\n  yadeva: 0x092F,\n  yaekorean: 0x3152,\n  yagujarati: 0x0AAF,\n  yagurmukhi: 0x0A2F,\n  yahiragana: 0x3084,\n  yakatakana: 0x30E4,\n  yakatakanahalfwidth: 0xFF94,\n  yakorean: 0x3151,\n  yamakkanthai: 0x0E4E,\n  yasmallhiragana: 0x3083,\n  yasmallkatakana: 0x30E3,\n  yasmallkatakanahalfwidth: 0xFF6C,\n  yatcyrillic: 0x0463,\n  ycircle: 0x24E8,\n  ycircumflex: 0x0177,\n  ydieresis: 0x00FF,\n  ydotaccent: 0x1E8F,\n  ydotbelow: 0x1EF5,\n  yeharabic: 0x064A,\n  yehbarreearabic: 0x06D2,\n  yehbarreefinalarabic: 0xFBAF,\n  yehfinalarabic: 0xFEF2,\n  yehhamzaabovearabic: 0x0626,\n  yehhamzaabovefinalarabic: 0xFE8A,\n  yehhamzaaboveinitialarabic: 0xFE8B,\n  yehhamzaabovemedialarabic: 0xFE8C,\n  yehinitialarabic: 0xFEF3,\n  yehmedialarabic: 0xFEF4,\n  yehmeeminitialarabic: 0xFCDD,\n  yehmeemisolatedarabic: 0xFC58,\n  yehnoonfinalarabic: 0xFC94,\n  yehthreedotsbelowarabic: 0x06D1,\n  yekorean: 0x3156,\n  yen: 0x00A5,\n  yenmonospace: 0xFFE5,\n  yeokorean: 0x3155,\n  yeorinhieuhkorean: 0x3186,\n  yerahbenyomohebrew: 0x05AA,\n  yerahbenyomolefthebrew: 0x05AA,\n  yericyrillic: 0x044B,\n  yerudieresiscyrillic: 0x04F9,\n  yesieungkorean: 0x3181,\n  yesieungpansioskorean: 0x3183,\n  yesieungsioskorean: 0x3182,\n  yetivhebrew: 0x059A,\n  ygrave: 0x1EF3,\n  yhook: 0x01B4,\n  yhookabove: 0x1EF7,\n  yiarmenian: 0x0575,\n  yicyrillic: 0x0457,\n  yikorean: 0x3162,\n  yinyang: 0x262F,\n  yiwnarmenian: 0x0582,\n  ymonospace: 0xFF59,\n  yod: 0x05D9,\n  yoddagesh: 0xFB39,\n  yoddageshhebrew: 0xFB39,\n  yodhebrew: 0x05D9,\n  yodyodhebrew: 0x05F2,\n  yodyodpatahhebrew: 0xFB1F,\n  yohiragana: 0x3088,\n  yoikorean: 0x3189,\n  yokatakana: 0x30E8,\n  yokatakanahalfwidth: 0xFF96,\n  yokorean: 0x315B,\n  yosmallhiragana: 0x3087,\n  yosmallkatakana: 0x30E7,\n  yosmallkatakanahalfwidth: 0xFF6E,\n  yotgreek: 0x03F3,\n  yoyaekorean: 0x3188,\n  yoyakorean: 0x3187,\n  yoyakthai: 0x0E22,\n  yoyingthai: 0x0E0D,\n  yparen: 0x24B4,\n  ypogegrammeni: 0x037A,\n  ypogegrammenigreekcmb: 0x0345,\n  yr: 0x01A6,\n  yring: 0x1E99,\n  ysuperior: 0x02B8,\n  ytilde: 0x1EF9,\n  yturned: 0x028E,\n  yuhiragana: 0x3086,\n  yuikorean: 0x318C,\n  yukatakana: 0x30E6,\n  yukatakanahalfwidth: 0xFF95,\n  yukorean: 0x3160,\n  yusbigcyrillic: 0x046B,\n  yusbigiotifiedcyrillic: 0x046D,\n  yuslittlecyrillic: 0x0467,\n  yuslittleiotifiedcyrillic: 0x0469,\n  yusmallhiragana: 0x3085,\n  yusmallkatakana: 0x30E5,\n  yusmallkatakanahalfwidth: 0xFF6D,\n  yuyekorean: 0x318B,\n  yuyeokorean: 0x318A,\n  yyabengali: 0x09DF,\n  yyadeva: 0x095F,\n  z: 0x007A,\n  zaarmenian: 0x0566,\n  zacute: 0x017A,\n  zadeva: 0x095B,\n  zagurmukhi: 0x0A5B,\n  zaharabic: 0x0638,\n  zahfinalarabic: 0xFEC6,\n  zahinitialarabic: 0xFEC7,\n  zahiragana: 0x3056,\n  zahmedialarabic: 0xFEC8,\n  zainarabic: 0x0632,\n  zainfinalarabic: 0xFEB0,\n  zakatakana: 0x30B6,\n  zaqefgadolhebrew: 0x0595,\n  zaqefqatanhebrew: 0x0594,\n  zarqahebrew: 0x0598,\n  zayin: 0x05D6,\n  zayindagesh: 0xFB36,\n  zayindageshhebrew: 0xFB36,\n  zayinhebrew: 0x05D6,\n  zbopomofo: 0x3117,\n  zcaron: 0x017E,\n  zcircle: 0x24E9,\n  zcircumflex: 0x1E91,\n  zcurl: 0x0291,\n  zdot: 0x017C,\n  zdotaccent: 0x017C,\n  zdotbelow: 0x1E93,\n  zecyrillic: 0x0437,\n  zedescendercyrillic: 0x0499,\n  zedieresiscyrillic: 0x04DF,\n  zehiragana: 0x305C,\n  zekatakana: 0x30BC,\n  zero: 0x0030,\n  zeroarabic: 0x0660,\n  zerobengali: 0x09E6,\n  zerodeva: 0x0966,\n  zerogujarati: 0x0AE6,\n  zerogurmukhi: 0x0A66,\n  zerohackarabic: 0x0660,\n  zeroinferior: 0x2080,\n  zeromonospace: 0xFF10,\n  zerooldstyle: 0xF730,\n  zeropersian: 0x06F0,\n  zerosuperior: 0x2070,\n  zerothai: 0x0E50,\n  zerowidthjoiner: 0xFEFF,\n  zerowidthnonjoiner: 0x200C,\n  zerowidthspace: 0x200B,\n  zeta: 0x03B6,\n  zhbopomofo: 0x3113,\n  zhearmenian: 0x056A,\n  zhebrevecyrillic: 0x04C2,\n  zhecyrillic: 0x0436,\n  zhedescendercyrillic: 0x0497,\n  zhedieresiscyrillic: 0x04DD,\n  zihiragana: 0x3058,\n  zikatakana: 0x30B8,\n  zinorhebrew: 0x05AE,\n  zlinebelow: 0x1E95,\n  zmonospace: 0xFF5A,\n  zohiragana: 0x305E,\n  zokatakana: 0x30BE,\n  zparen: 0x24B5,\n  zretroflexhook: 0x0290,\n  zstroke: 0x01B6,\n  zuhiragana: 0x305A,\n  zukatakana: 0x30BA,\n  '.notdef': 0x0000\n};\n\nvar DingbatsGlyphsUnicode = {\n  space: 0x0020,\n  a1: 0x2701,\n  a2: 0x2702,\n  a202: 0x2703,\n  a3: 0x2704,\n  a4: 0x260E,\n  a5: 0x2706,\n  a119: 0x2707,\n  a118: 0x2708,\n  a117: 0x2709,\n  a11: 0x261B,\n  a12: 0x261E,\n  a13: 0x270C,\n  a14: 0x270D,\n  a15: 0x270E,\n  a16: 0x270F,\n  a105: 0x2710,\n  a17: 0x2711,\n  a18: 0x2712,\n  a19: 0x2713,\n  a20: 0x2714,\n  a21: 0x2715,\n  a22: 0x2716,\n  a23: 0x2717,\n  a24: 0x2718,\n  a25: 0x2719,\n  a26: 0x271A,\n  a27: 0x271B,\n  a28: 0x271C,\n  a6: 0x271D,\n  a7: 0x271E,\n  a8: 0x271F,\n  a9: 0x2720,\n  a10: 0x2721,\n  a29: 0x2722,\n  a30: 0x2723,\n  a31: 0x2724,\n  a32: 0x2725,\n  a33: 0x2726,\n  a34: 0x2727,\n  a35: 0x2605,\n  a36: 0x2729,\n  a37: 0x272A,\n  a38: 0x272B,\n  a39: 0x272C,\n  a40: 0x272D,\n  a41: 0x272E,\n  a42: 0x272F,\n  a43: 0x2730,\n  a44: 0x2731,\n  a45: 0x2732,\n  a46: 0x2733,\n  a47: 0x2734,\n  a48: 0x2735,\n  a49: 0x2736,\n  a50: 0x2737,\n  a51: 0x2738,\n  a52: 0x2739,\n  a53: 0x273A,\n  a54: 0x273B,\n  a55: 0x273C,\n  a56: 0x273D,\n  a57: 0x273E,\n  a58: 0x273F,\n  a59: 0x2740,\n  a60: 0x2741,\n  a61: 0x2742,\n  a62: 0x2743,\n  a63: 0x2744,\n  a64: 0x2745,\n  a65: 0x2746,\n  a66: 0x2747,\n  a67: 0x2748,\n  a68: 0x2749,\n  a69: 0x274A,\n  a70: 0x274B,\n  a71: 0x25CF,\n  a72: 0x274D,\n  a73: 0x25A0,\n  a74: 0x274F,\n  a203: 0x2750,\n  a75: 0x2751,\n  a204: 0x2752,\n  a76: 0x25B2,\n  a77: 0x25BC,\n  a78: 0x25C6,\n  a79: 0x2756,\n  a81: 0x25D7,\n  a82: 0x2758,\n  a83: 0x2759,\n  a84: 0x275A,\n  a97: 0x275B,\n  a98: 0x275C,\n  a99: 0x275D,\n  a100: 0x275E,\n  a101: 0x2761,\n  a102: 0x2762,\n  a103: 0x2763,\n  a104: 0x2764,\n  a106: 0x2765,\n  a107: 0x2766,\n  a108: 0x2767,\n  a112: 0x2663,\n  a111: 0x2666,\n  a110: 0x2665,\n  a109: 0x2660,\n  a120: 0x2460,\n  a121: 0x2461,\n  a122: 0x2462,\n  a123: 0x2463,\n  a124: 0x2464,\n  a125: 0x2465,\n  a126: 0x2466,\n  a127: 0x2467,\n  a128: 0x2468,\n  a129: 0x2469,\n  a130: 0x2776,\n  a131: 0x2777,\n  a132: 0x2778,\n  a133: 0x2779,\n  a134: 0x277A,\n  a135: 0x277B,\n  a136: 0x277C,\n  a137: 0x277D,\n  a138: 0x277E,\n  a139: 0x277F,\n  a140: 0x2780,\n  a141: 0x2781,\n  a142: 0x2782,\n  a143: 0x2783,\n  a144: 0x2784,\n  a145: 0x2785,\n  a146: 0x2786,\n  a147: 0x2787,\n  a148: 0x2788,\n  a149: 0x2789,\n  a150: 0x278A,\n  a151: 0x278B,\n  a152: 0x278C,\n  a153: 0x278D,\n  a154: 0x278E,\n  a155: 0x278F,\n  a156: 0x2790,\n  a157: 0x2791,\n  a158: 0x2792,\n  a159: 0x2793,\n  a160: 0x2794,\n  a161: 0x2192,\n  a163: 0x2194,\n  a164: 0x2195,\n  a196: 0x2798,\n  a165: 0x2799,\n  a192: 0x279A,\n  a166: 0x279B,\n  a167: 0x279C,\n  a168: 0x279D,\n  a169: 0x279E,\n  a170: 0x279F,\n  a171: 0x27A0,\n  a172: 0x27A1,\n  a173: 0x27A2,\n  a162: 0x27A3,\n  a174: 0x27A4,\n  a175: 0x27A5,\n  a176: 0x27A6,\n  a177: 0x27A7,\n  a178: 0x27A8,\n  a179: 0x27A9,\n  a193: 0x27AA,\n  a180: 0x27AB,\n  a199: 0x27AC,\n  a181: 0x27AD,\n  a200: 0x27AE,\n  a182: 0x27AF,\n  a201: 0x27B1,\n  a183: 0x27B2,\n  a184: 0x27B3,\n  a197: 0x27B4,\n  a185: 0x27B5,\n  a194: 0x27B6,\n  a198: 0x27B7,\n  a186: 0x27B8,\n  a195: 0x27B9,\n  a187: 0x27BA,\n  a188: 0x27BB,\n  a189: 0x27BC,\n  a190: 0x27BD,\n  a191: 0x27BE,\n  a89: 0x2768, // 0xF8D7\n  a90: 0x2769, // 0xF8D8\n  a93: 0x276A, // 0xF8D9\n  a94: 0x276B, // 0xF8DA\n  a91: 0x276C, // 0xF8DB\n  a92: 0x276D, // 0xF8DC\n  a205: 0x276E, // 0xF8DD\n  a85: 0x276F, // 0xF8DE\n  a206: 0x2770, // 0xF8DF\n  a86: 0x2771, // 0xF8E0\n  a87: 0x2772, // 0xF8E1\n  a88: 0x2773, // 0xF8E2\n  a95: 0x2774, // 0xF8E3\n  a96: 0x2775, // 0xF8E4\n  '.notdef': 0x0000\n};\n\n\nvar PDFImage = (function PDFImageClosure() {\n  /**\n   * Decode the image in the main thread if it supported. Resovles the promise\n   * when the image data is ready.\n   */\n  function handleImageData(handler, xref, res, image) {\n    if (image instanceof JpegStream && image.isNativelyDecodable(xref, res)) {\n      // For natively supported jpegs send them to the main thread for decoding.\n      var dict = image.dict;\n      var colorSpace = dict.get('ColorSpace', 'CS');\n      colorSpace = ColorSpace.parse(colorSpace, xref, res);\n      var numComps = colorSpace.numComps;\n      var decodePromise = handler.sendWithPromise('JpegDecode',\n                                                  [image.getIR(), numComps]);\n      return decodePromise.then(function (message) {\n        var data = message.data;\n        return new Stream(data, 0, data.length, image.dict);\n      });\n    } else {\n      return Promise.resolve(image);\n    }\n  }\n\n  /**\n   * Decode and clamp a value. The formula is different from the spec because we\n   * don't decode to float range [0,1], we decode it in the [0,max] range.\n   */\n  function decodeAndClamp(value, addend, coefficient, max) {\n    value = addend + value * coefficient;\n    // Clamp the value to the range\n    return (value < 0 ? 0 : (value > max ? max : value));\n  }\n\n  function PDFImage(xref, res, image, inline, smask, mask, isMask) {\n    this.image = image;\n    var dict = image.dict;\n    if (dict.has('Filter')) {\n      var filter = dict.get('Filter').name;\n      if (filter === 'JPXDecode') {\n        var jpxImage = new JpxImage();\n        jpxImage.parseImageProperties(image.stream);\n        image.stream.reset();\n        image.bitsPerComponent = jpxImage.bitsPerComponent;\n        image.numComps = jpxImage.componentsCount;\n      } else if (filter === 'JBIG2Decode') {\n        image.bitsPerComponent = 1;\n        image.numComps = 1;\n      }\n    }\n    // TODO cache rendered images?\n\n    this.width = dict.get('Width', 'W');\n    this.height = dict.get('Height', 'H');\n\n    if (this.width < 1 || this.height < 1) {\n      error('Invalid image width: ' + this.width + ' or height: ' +\n            this.height);\n    }\n\n    this.interpolate = dict.get('Interpolate', 'I') || false;\n    this.imageMask = dict.get('ImageMask', 'IM') || false;\n    this.matte = dict.get('Matte') || false;\n\n    var bitsPerComponent = image.bitsPerComponent;\n    if (!bitsPerComponent) {\n      bitsPerComponent = dict.get('BitsPerComponent', 'BPC');\n      if (!bitsPerComponent) {\n        if (this.imageMask) {\n          bitsPerComponent = 1;\n        } else {\n          error('Bits per component missing in image: ' + this.imageMask);\n        }\n      }\n    }\n    this.bpc = bitsPerComponent;\n\n    if (!this.imageMask) {\n      var colorSpace = dict.get('ColorSpace', 'CS');\n      if (!colorSpace) {\n        info('JPX images (which do not require color spaces)');\n        switch (image.numComps) {\n          case 1:\n            colorSpace = Name.get('DeviceGray');\n            break;\n          case 3:\n            colorSpace = Name.get('DeviceRGB');\n            break;\n          case 4:\n            colorSpace = Name.get('DeviceCMYK');\n            break;\n          default:\n            error('JPX images with ' + this.numComps +\n                  ' color components not supported.');\n        }\n      }\n      this.colorSpace = ColorSpace.parse(colorSpace, xref, res);\n      this.numComps = this.colorSpace.numComps;\n    }\n\n    this.decode = dict.get('Decode', 'D');\n    this.needsDecode = false;\n    if (this.decode &&\n        ((this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode)) ||\n         (isMask && !ColorSpace.isDefaultDecode(this.decode, 1)))) {\n      this.needsDecode = true;\n      // Do some preprocessing to avoid more math.\n      var max = (1 << bitsPerComponent) - 1;\n      this.decodeCoefficients = [];\n      this.decodeAddends = [];\n      for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {\n        var dmin = this.decode[i];\n        var dmax = this.decode[i + 1];\n        this.decodeCoefficients[j] = dmax - dmin;\n        this.decodeAddends[j] = max * dmin;\n      }\n    }\n\n    if (smask) {\n      this.smask = new PDFImage(xref, res, smask, false);\n    } else if (mask) {\n      if (isStream(mask)) {\n        this.mask = new PDFImage(xref, res, mask, false, null, null, true);\n      } else {\n        // Color key mask (just an array).\n        this.mask = mask;\n      }\n    }\n  }\n  /**\n   * Handles processing of image data and returns the Promise that is resolved\n   * with a PDFImage when the image is ready to be used.\n   */\n  PDFImage.buildImage = function PDFImage_buildImage(handler, xref,\n                                                     res, image, inline) {\n    var imagePromise = handleImageData(handler, xref, res, image);\n    var smaskPromise;\n    var maskPromise;\n\n    var smask = image.dict.get('SMask');\n    var mask = image.dict.get('Mask');\n\n    if (smask) {\n      smaskPromise = handleImageData(handler, xref, res, smask);\n      maskPromise = Promise.resolve(null);\n    } else {\n      smaskPromise = Promise.resolve(null);\n      if (mask) {\n        if (isStream(mask)) {\n          maskPromise = handleImageData(handler, xref, res, mask);\n        } else if (isArray(mask)) {\n          maskPromise = Promise.resolve(mask);\n        } else {\n          warn('Unsupported mask format.');\n          maskPromise = Promise.resolve(null);\n        }\n      } else {\n        maskPromise = Promise.resolve(null);\n      }\n    }\n    return Promise.all([imagePromise, smaskPromise, maskPromise]).then(\n      function(results) {\n        var imageData = results[0];\n        var smaskData = results[1];\n        var maskData = results[2];\n        return new PDFImage(xref, res, imageData, inline, smaskData, maskData);\n      });\n  };\n\n  /**\n   * Resize an image using the nearest neighbor algorithm. Currently only\n   * supports one and three component images.\n   * @param {TypedArray} pixels The original image with one component.\n   * @param {Number} bpc Number of bits per component.\n   * @param {Number} components Number of color components, 1 or 3 is supported.\n   * @param {Number} w1 Original width.\n   * @param {Number} h1 Original height.\n   * @param {Number} w2 New width.\n   * @param {Number} h2 New height.\n   * @param {TypedArray} dest (Optional) The destination buffer.\n   * @param {Number} alpha01 (Optional) Size reserved for the alpha channel.\n   * @return {TypedArray} Resized image data.\n   */\n  PDFImage.resize = function PDFImage_resize(pixels, bpc, components,\n                                             w1, h1, w2, h2, dest, alpha01) {\n\n    if (components !== 1 && components !== 3) {\n      error('Unsupported component count for resizing.');\n    }\n\n    var length = w2 * h2 * components;\n    var temp = dest ? dest : (bpc <= 8 ? new Uint8Array(length) :\n        (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length)));\n    var xRatio = w1 / w2;\n    var yRatio = h1 / h2;\n    var i, j, py, newIndex = 0, oldIndex;\n    var xScaled = new Uint16Array(w2);\n    var w1Scanline = w1 * components;\n    if (alpha01 !== 1) {\n      alpha01 = 0;\n    }\n\n    for (j = 0; j < w2; j++) {\n      xScaled[j] = Math.floor(j * xRatio) * components;\n    }\n\n    if (components === 1) {\n      for (i = 0; i < h2; i++) {\n        py = Math.floor(i * yRatio) * w1Scanline;\n        for (j = 0; j < w2; j++) {\n          oldIndex = py + xScaled[j];\n          temp[newIndex++] = pixels[oldIndex];\n        }\n      }\n    } else if (components === 3) {\n      for (i = 0; i < h2; i++) {\n        py = Math.floor(i * yRatio) * w1Scanline;\n        for (j = 0; j < w2; j++) {\n          oldIndex = py + xScaled[j];\n          temp[newIndex++] = pixels[oldIndex++];\n          temp[newIndex++] = pixels[oldIndex++];\n          temp[newIndex++] = pixels[oldIndex++];\n          newIndex += alpha01;\n        }\n      }\n    }\n    return temp;\n  };\n\n  PDFImage.createMask =\n      function PDFImage_createMask(imgArray, width, height,\n                                   imageIsFromDecodeStream, inverseDecode) {\n\n    // |imgArray| might not contain full data for every pixel of the mask, so\n    // we need to distinguish between |computedLength| and |actualLength|.\n    // In particular, if inverseDecode is true, then the array we return must\n    // have a length of |computedLength|.\n\n    var computedLength = ((width + 7) >> 3) * height;\n    var actualLength = imgArray.byteLength;\n    var haveFullData = computedLength === actualLength;\n    var data, i;\n\n    if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) {\n      // imgArray came from a DecodeStream and its data is in an appropriate\n      // form, so we can just transfer it.\n      data = imgArray;\n    } else if (!inverseDecode) {\n      data = new Uint8Array(actualLength);\n      data.set(imgArray);\n    } else {\n      data = new Uint8Array(computedLength);\n      data.set(imgArray);\n      for (i = actualLength; i < computedLength; i++) {\n        data[i] = 0xff;\n      }\n    }\n\n    // If necessary, invert the original mask data (but not any extra we might\n    // have added above). It's safe to modify the array -- whether it's the\n    // original or a copy, we're about to transfer it anyway, so nothing else\n    // in this thread can be relying on its contents.\n    if (inverseDecode) {\n      for (i = 0; i < actualLength; i++) {\n        data[i] = ~data[i];\n      }\n    }\n\n    return {data: data, width: width, height: height};\n  };\n\n  PDFImage.prototype = {\n    get drawWidth() {\n      return Math.max(this.width,\n                      this.smask && this.smask.width || 0,\n                      this.mask && this.mask.width || 0);\n    },\n\n    get drawHeight() {\n      return Math.max(this.height,\n                      this.smask && this.smask.height || 0,\n                      this.mask && this.mask.height || 0);\n    },\n\n    decodeBuffer: function PDFImage_decodeBuffer(buffer) {\n      var bpc = this.bpc;\n      var numComps = this.numComps;\n\n      var decodeAddends = this.decodeAddends;\n      var decodeCoefficients = this.decodeCoefficients;\n      var max = (1 << bpc) - 1;\n      var i, ii;\n\n      if (bpc === 1) {\n        // If the buffer needed decode that means it just needs to be inverted.\n        for (i = 0, ii = buffer.length; i < ii; i++) {\n          buffer[i] = +!(buffer[i]);\n        }\n        return;\n      }\n      var index = 0;\n      for (i = 0, ii = this.width * this.height; i < ii; i++) {\n        for (var j = 0; j < numComps; j++) {\n          buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j],\n                                         decodeCoefficients[j], max);\n          index++;\n        }\n      }\n    },\n\n    getComponents: function PDFImage_getComponents(buffer) {\n      var bpc = this.bpc;\n\n      // This image doesn't require any extra work.\n      if (bpc === 8) {\n        return buffer;\n      }\n\n      var width = this.width;\n      var height = this.height;\n      var numComps = this.numComps;\n\n      var length = width * height * numComps;\n      var bufferPos = 0;\n      var output = (bpc <= 8 ? new Uint8Array(length) :\n        (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length)));\n      var rowComps = width * numComps;\n\n      var max = (1 << bpc) - 1;\n      var i = 0, ii, buf;\n\n      if (bpc === 1) {\n        // Optimization for reading 1 bpc images.\n        var mask, loop1End, loop2End;\n        for (var j = 0; j < height; j++) {\n          loop1End = i + (rowComps & ~7);\n          loop2End = i + rowComps;\n\n          // unroll loop for all full bytes\n          while (i < loop1End) {\n            buf = buffer[bufferPos++];\n            output[i] = (buf >> 7) & 1;\n            output[i + 1] = (buf >> 6) & 1;\n            output[i + 2] = (buf >> 5) & 1;\n            output[i + 3] = (buf >> 4) & 1;\n            output[i + 4] = (buf >> 3) & 1;\n            output[i + 5] = (buf >> 2) & 1;\n            output[i + 6] = (buf >> 1) & 1;\n            output[i + 7] = buf & 1;\n            i += 8;\n          }\n\n          // handle remaing bits\n          if (i < loop2End) {\n            buf = buffer[bufferPos++];\n            mask = 128;\n            while (i < loop2End) {\n              output[i++] = +!!(buf & mask);\n              mask >>= 1;\n            }\n          }\n        }\n      } else {\n        // The general case that handles all other bpc values.\n        var bits = 0;\n        buf = 0;\n        for (i = 0, ii = length; i < ii; ++i) {\n          if (i % rowComps === 0) {\n            buf = 0;\n            bits = 0;\n          }\n\n          while (bits < bpc) {\n            buf = (buf << 8) | buffer[bufferPos++];\n            bits += 8;\n          }\n\n          var remainingBits = bits - bpc;\n          var value = buf >> remainingBits;\n          output[i] = (value < 0 ? 0 : (value > max ? max : value));\n          buf = buf & ((1 << remainingBits) - 1);\n          bits = remainingBits;\n        }\n      }\n      return output;\n    },\n\n    fillOpacity: function PDFImage_fillOpacity(rgbaBuf, width, height,\n                                               actualHeight, image) {\n      var smask = this.smask;\n      var mask = this.mask;\n      var alphaBuf, sw, sh, i, ii, j;\n\n      if (smask) {\n        sw = smask.width;\n        sh = smask.height;\n        alphaBuf = new Uint8Array(sw * sh);\n        smask.fillGrayBuffer(alphaBuf);\n        if (sw !== width || sh !== height) {\n          alphaBuf = PDFImage.resize(alphaBuf, smask.bpc, 1, sw, sh, width,\n                                     height);\n        }\n      } else if (mask) {\n        if (mask instanceof PDFImage) {\n          sw = mask.width;\n          sh = mask.height;\n          alphaBuf = new Uint8Array(sw * sh);\n          mask.numComps = 1;\n          mask.fillGrayBuffer(alphaBuf);\n\n          // Need to invert values in rgbaBuf\n          for (i = 0, ii = sw * sh; i < ii; ++i) {\n            alphaBuf[i] = 255 - alphaBuf[i];\n          }\n\n          if (sw !== width || sh !== height) {\n            alphaBuf = PDFImage.resize(alphaBuf, mask.bpc, 1, sw, sh, width,\n                                       height);\n          }\n        } else if (isArray(mask)) {\n          // Color key mask: if any of the compontents are outside the range\n          // then they should be painted.\n          alphaBuf = new Uint8Array(width * height);\n          var numComps = this.numComps;\n          for (i = 0, ii = width * height; i < ii; ++i) {\n            var opacity = 0;\n            var imageOffset = i * numComps;\n            for (j = 0; j < numComps; ++j) {\n              var color = image[imageOffset + j];\n              var maskOffset = j * 2;\n              if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {\n                opacity = 255;\n                break;\n              }\n            }\n            alphaBuf[i] = opacity;\n          }\n        } else {\n          error('Unknown mask format.');\n        }\n      }\n\n      if (alphaBuf) {\n        for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {\n          rgbaBuf[j] = alphaBuf[i];\n        }\n      } else {\n        // No mask.\n        for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {\n          rgbaBuf[j] = 255;\n        }\n      }\n    },\n\n    undoPreblend: function PDFImage_undoPreblend(buffer, width, height) {\n      var matte = this.smask && this.smask.matte;\n      if (!matte) {\n        return;\n      }\n      var matteRgb = this.colorSpace.getRgb(matte, 0);\n      var matteR = matteRgb[0];\n      var matteG = matteRgb[1];\n      var matteB = matteRgb[2];\n      var length = width * height * 4;\n      var r, g, b;\n      for (var i = 0; i < length; i += 4) {\n        var alpha = buffer[i + 3];\n        if (alpha === 0) {\n          // according formula we have to get Infinity in all components\n          // making it white (typical paper color) should be okay\n          buffer[i] = 255;\n          buffer[i + 1] = 255;\n          buffer[i + 2] = 255;\n          continue;\n        }\n        var k = 255 / alpha;\n        r = (buffer[i] - matteR) * k + matteR;\n        g = (buffer[i + 1] - matteG) * k + matteG;\n        b = (buffer[i + 2] - matteB) * k + matteB;\n        buffer[i] = r <= 0 ? 0 : r >= 255 ? 255 : r | 0;\n        buffer[i + 1] = g <= 0 ? 0 : g >= 255 ? 255 : g | 0;\n        buffer[i + 2] = b <= 0 ? 0 : b >= 255 ? 255 : b | 0;\n      }\n    },\n\n    createImageData: function PDFImage_createImageData(forceRGBA) {\n      var drawWidth = this.drawWidth;\n      var drawHeight = this.drawHeight;\n      var imgData = { // other fields are filled in below\n        width: drawWidth,\n        height: drawHeight\n      };\n\n      var numComps = this.numComps;\n      var originalWidth = this.width;\n      var originalHeight = this.height;\n      var bpc = this.bpc;\n\n      // Rows start at byte boundary.\n      var rowBytes = (originalWidth * numComps * bpc + 7) >> 3;\n      var imgArray;\n\n      if (!forceRGBA) {\n        // If it is a 1-bit-per-pixel grayscale (i.e. black-and-white) image\n        // without any complications, we pass a same-sized copy to the main\n        // thread rather than expanding by 32x to RGBA form. This saves *lots*\n        // of memory for many scanned documents. It's also much faster.\n        //\n        // Similarly, if it is a 24-bit-per pixel RGB image without any\n        // complications, we avoid expanding by 1.333x to RGBA form.\n        var kind;\n        if (this.colorSpace.name === 'DeviceGray' && bpc === 1) {\n          kind = ImageKind.GRAYSCALE_1BPP;\n        } else if (this.colorSpace.name === 'DeviceRGB' && bpc === 8 &&\n                   !this.needsDecode) {\n          kind = ImageKind.RGB_24BPP;\n        }\n        if (kind && !this.smask && !this.mask &&\n            drawWidth === originalWidth && drawHeight === originalHeight) {\n          imgData.kind = kind;\n\n          imgArray = this.getImageBytes(originalHeight * rowBytes);\n          // If imgArray came from a DecodeStream, we're safe to transfer it\n          // (and thus neuter it) because it will constitute the entire\n          // DecodeStream's data.  But if it came from a Stream, we need to\n          // copy it because it'll only be a portion of the Stream's data, and\n          // the rest will be read later on.\n          if (this.image instanceof DecodeStream) {\n            imgData.data = imgArray;\n          } else {\n            var newArray = new Uint8Array(imgArray.length);\n            newArray.set(imgArray);\n            imgData.data = newArray;\n          }\n          if (this.needsDecode) {\n            // Invert the buffer (which must be grayscale if we reached here).\n            assert(kind === ImageKind.GRAYSCALE_1BPP);\n            var buffer = imgData.data;\n            for (var i = 0, ii = buffer.length; i < ii; i++) {\n              buffer[i] ^= 0xff;\n            }\n          }\n          return imgData;\n        }\n        if (this.image instanceof JpegStream && !this.smask && !this.mask) {\n          imgData.kind = ImageKind.RGB_24BPP;\n          imgData.data = this.getImageBytes(originalHeight * rowBytes,\n                                            drawWidth, drawHeight, true);\n          return imgData;\n        }\n      }\n\n      imgArray = this.getImageBytes(originalHeight * rowBytes);\n      // imgArray can be incomplete (e.g. after CCITT fax encoding).\n      var actualHeight = 0 | (imgArray.length / rowBytes *\n                         drawHeight / originalHeight);\n\n      var comps = this.getComponents(imgArray);\n\n      // If opacity data is present, use RGBA_32BPP form. Otherwise, use the\n      // more compact RGB_24BPP form if allowable.\n      var alpha01, maybeUndoPreblend;\n      if (!forceRGBA && !this.smask && !this.mask) {\n        imgData.kind = ImageKind.RGB_24BPP;\n        imgData.data = new Uint8Array(drawWidth * drawHeight * 3);\n        alpha01 = 0;\n        maybeUndoPreblend = false;\n      } else {\n        imgData.kind = ImageKind.RGBA_32BPP;\n        imgData.data = new Uint8Array(drawWidth * drawHeight * 4);\n        alpha01 = 1;\n        maybeUndoPreblend = true;\n\n        // Color key masking (opacity) must be performed before decoding.\n        this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight,\n                         comps);\n      }\n\n      if (this.needsDecode) {\n        this.decodeBuffer(comps);\n      }\n      this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight,\n                              drawWidth, drawHeight, actualHeight, bpc, comps,\n                              alpha01);\n      if (maybeUndoPreblend) {\n        this.undoPreblend(imgData.data, drawWidth, actualHeight);\n      }\n\n      return imgData;\n    },\n\n    fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) {\n      var numComps = this.numComps;\n      if (numComps !== 1) {\n        error('Reading gray scale from a color image: ' + numComps);\n      }\n\n      var width = this.width;\n      var height = this.height;\n      var bpc = this.bpc;\n\n      // rows start at byte boundary\n      var rowBytes = (width * numComps * bpc + 7) >> 3;\n      var imgArray = this.getImageBytes(height * rowBytes);\n\n      var comps = this.getComponents(imgArray);\n      var i, length;\n\n      if (bpc === 1) {\n        // inline decoding (= inversion) for 1 bpc images\n        length = width * height;\n        if (this.needsDecode) {\n          // invert and scale to {0, 255}\n          for (i = 0; i < length; ++i) {\n            buffer[i] = (comps[i] - 1) & 255;\n          }\n        } else {\n          // scale to {0, 255}\n          for (i = 0; i < length; ++i) {\n            buffer[i] = (-comps[i]) & 255;\n          }\n        }\n        return;\n      }\n\n      if (this.needsDecode) {\n        this.decodeBuffer(comps);\n      }\n      length = width * height;\n      // we aren't using a colorspace so we need to scale the value\n      var scale = 255 / ((1 << bpc) - 1);\n      for (i = 0; i < length; ++i) {\n        buffer[i] = (scale * comps[i]) | 0;\n      }\n    },\n\n    getImageBytes: function PDFImage_getImageBytes(length,\n                                                   drawWidth, drawHeight,\n                                                   forceRGB) {\n      this.image.reset();\n      this.image.drawWidth = drawWidth || this.width;\n      this.image.drawHeight = drawHeight || this.height;\n      this.image.forceRGB = !!forceRGB;\n      return this.image.getBytes(length);\n    }\n  };\n  return PDFImage;\n})();\n\n\n// The Metrics object contains glyph widths (in glyph space units).\n// As per PDF spec, for most fonts (Type 3 being an exception) a glyph\n// space unit corresponds to 1/1000th of text space unit.\nvar Metrics = {\n  'Courier': 600,\n  'Courier-Bold': 600,\n  'Courier-BoldOblique': 600,\n  'Courier-Oblique': 600,\n  'Helvetica' : {\n    'space': 278,\n    'exclam': 278,\n    'quotedbl': 355,\n    'numbersign': 556,\n    'dollar': 556,\n    'percent': 889,\n    'ampersand': 667,\n    'quoteright': 222,\n    'parenleft': 333,\n    'parenright': 333,\n    'asterisk': 389,\n    'plus': 584,\n    'comma': 278,\n    'hyphen': 333,\n    'period': 278,\n    'slash': 278,\n    'zero': 556,\n    'one': 556,\n    'two': 556,\n    'three': 556,\n    'four': 556,\n    'five': 556,\n    'six': 556,\n    'seven': 556,\n    'eight': 556,\n    'nine': 556,\n    'colon': 278,\n    'semicolon': 278,\n    'less': 584,\n    'equal': 584,\n    'greater': 584,\n    'question': 556,\n    'at': 1015,\n    'A': 667,\n    'B': 667,\n    'C': 722,\n    'D': 722,\n    'E': 667,\n    'F': 611,\n    'G': 778,\n    'H': 722,\n    'I': 278,\n    'J': 500,\n    'K': 667,\n    'L': 556,\n    'M': 833,\n    'N': 722,\n    'O': 778,\n    'P': 667,\n    'Q': 778,\n    'R': 722,\n    'S': 667,\n    'T': 611,\n    'U': 722,\n    'V': 667,\n    'W': 944,\n    'X': 667,\n    'Y': 667,\n    'Z': 611,\n    'bracketleft': 278,\n    'backslash': 278,\n    'bracketright': 278,\n    'asciicircum': 469,\n    'underscore': 556,\n    'quoteleft': 222,\n    'a': 556,\n    'b': 556,\n    'c': 500,\n    'd': 556,\n    'e': 556,\n    'f': 278,\n    'g': 556,\n    'h': 556,\n    'i': 222,\n    'j': 222,\n    'k': 500,\n    'l': 222,\n    'm': 833,\n    'n': 556,\n    'o': 556,\n    'p': 556,\n    'q': 556,\n    'r': 333,\n    's': 500,\n    't': 278,\n    'u': 556,\n    'v': 500,\n    'w': 722,\n    'x': 500,\n    'y': 500,\n    'z': 500,\n    'braceleft': 334,\n    'bar': 260,\n    'braceright': 334,\n    'asciitilde': 584,\n    'exclamdown': 333,\n    'cent': 556,\n    'sterling': 556,\n    'fraction': 167,\n    'yen': 556,\n    'florin': 556,\n    'section': 556,\n    'currency': 556,\n    'quotesingle': 191,\n    'quotedblleft': 333,\n    'guillemotleft': 556,\n    'guilsinglleft': 333,\n    'guilsinglright': 333,\n    'fi': 500,\n    'fl': 500,\n    'endash': 556,\n    'dagger': 556,\n    'daggerdbl': 556,\n    'periodcentered': 278,\n    'paragraph': 537,\n    'bullet': 350,\n    'quotesinglbase': 222,\n    'quotedblbase': 333,\n    'quotedblright': 333,\n    'guillemotright': 556,\n    'ellipsis': 1000,\n    'perthousand': 1000,\n    'questiondown': 611,\n    'grave': 333,\n    'acute': 333,\n    'circumflex': 333,\n    'tilde': 333,\n    'macron': 333,\n    'breve': 333,\n    'dotaccent': 333,\n    'dieresis': 333,\n    'ring': 333,\n    'cedilla': 333,\n    'hungarumlaut': 333,\n    'ogonek': 333,\n    'caron': 333,\n    'emdash': 1000,\n    'AE': 1000,\n    'ordfeminine': 370,\n    'Lslash': 556,\n    'Oslash': 778,\n    'OE': 1000,\n    'ordmasculine': 365,\n    'ae': 889,\n    'dotlessi': 278,\n    'lslash': 222,\n    'oslash': 611,\n    'oe': 944,\n    'germandbls': 611,\n    'Idieresis': 278,\n    'eacute': 556,\n    'abreve': 556,\n    'uhungarumlaut': 556,\n    'ecaron': 556,\n    'Ydieresis': 667,\n    'divide': 584,\n    'Yacute': 667,\n    'Acircumflex': 667,\n    'aacute': 556,\n    'Ucircumflex': 722,\n    'yacute': 500,\n    'scommaaccent': 500,\n    'ecircumflex': 556,\n    'Uring': 722,\n    'Udieresis': 722,\n    'aogonek': 556,\n    'Uacute': 722,\n    'uogonek': 556,\n    'Edieresis': 667,\n    'Dcroat': 722,\n    'commaaccent': 250,\n    'copyright': 737,\n    'Emacron': 667,\n    'ccaron': 500,\n    'aring': 556,\n    'Ncommaaccent': 722,\n    'lacute': 222,\n    'agrave': 556,\n    'Tcommaaccent': 611,\n    'Cacute': 722,\n    'atilde': 556,\n    'Edotaccent': 667,\n    'scaron': 500,\n    'scedilla': 500,\n    'iacute': 278,\n    'lozenge': 471,\n    'Rcaron': 722,\n    'Gcommaaccent': 778,\n    'ucircumflex': 556,\n    'acircumflex': 556,\n    'Amacron': 667,\n    'rcaron': 333,\n    'ccedilla': 500,\n    'Zdotaccent': 611,\n    'Thorn': 667,\n    'Omacron': 778,\n    'Racute': 722,\n    'Sacute': 667,\n    'dcaron': 643,\n    'Umacron': 722,\n    'uring': 556,\n    'threesuperior': 333,\n    'Ograve': 778,\n    'Agrave': 667,\n    'Abreve': 667,\n    'multiply': 584,\n    'uacute': 556,\n    'Tcaron': 611,\n    'partialdiff': 476,\n    'ydieresis': 500,\n    'Nacute': 722,\n    'icircumflex': 278,\n    'Ecircumflex': 667,\n    'adieresis': 556,\n    'edieresis': 556,\n    'cacute': 500,\n    'nacute': 556,\n    'umacron': 556,\n    'Ncaron': 722,\n    'Iacute': 278,\n    'plusminus': 584,\n    'brokenbar': 260,\n    'registered': 737,\n    'Gbreve': 778,\n    'Idotaccent': 278,\n    'summation': 600,\n    'Egrave': 667,\n    'racute': 333,\n    'omacron': 556,\n    'Zacute': 611,\n    'Zcaron': 611,\n    'greaterequal': 549,\n    'Eth': 722,\n    'Ccedilla': 722,\n    'lcommaaccent': 222,\n    'tcaron': 317,\n    'eogonek': 556,\n    'Uogonek': 722,\n    'Aacute': 667,\n    'Adieresis': 667,\n    'egrave': 556,\n    'zacute': 500,\n    'iogonek': 222,\n    'Oacute': 778,\n    'oacute': 556,\n    'amacron': 556,\n    'sacute': 500,\n    'idieresis': 278,\n    'Ocircumflex': 778,\n    'Ugrave': 722,\n    'Delta': 612,\n    'thorn': 556,\n    'twosuperior': 333,\n    'Odieresis': 778,\n    'mu': 556,\n    'igrave': 278,\n    'ohungarumlaut': 556,\n    'Eogonek': 667,\n    'dcroat': 556,\n    'threequarters': 834,\n    'Scedilla': 667,\n    'lcaron': 299,\n    'Kcommaaccent': 667,\n    'Lacute': 556,\n    'trademark': 1000,\n    'edotaccent': 556,\n    'Igrave': 278,\n    'Imacron': 278,\n    'Lcaron': 556,\n    'onehalf': 834,\n    'lessequal': 549,\n    'ocircumflex': 556,\n    'ntilde': 556,\n    'Uhungarumlaut': 722,\n    'Eacute': 667,\n    'emacron': 556,\n    'gbreve': 556,\n    'onequarter': 834,\n    'Scaron': 667,\n    'Scommaaccent': 667,\n    'Ohungarumlaut': 778,\n    'degree': 400,\n    'ograve': 556,\n    'Ccaron': 722,\n    'ugrave': 556,\n    'radical': 453,\n    'Dcaron': 722,\n    'rcommaaccent': 333,\n    'Ntilde': 722,\n    'otilde': 556,\n    'Rcommaaccent': 722,\n    'Lcommaaccent': 556,\n    'Atilde': 667,\n    'Aogonek': 667,\n    'Aring': 667,\n    'Otilde': 778,\n    'zdotaccent': 500,\n    'Ecaron': 667,\n    'Iogonek': 278,\n    'kcommaaccent': 500,\n    'minus': 584,\n    'Icircumflex': 278,\n    'ncaron': 556,\n    'tcommaaccent': 278,\n    'logicalnot': 584,\n    'odieresis': 556,\n    'udieresis': 556,\n    'notequal': 549,\n    'gcommaaccent': 556,\n    'eth': 556,\n    'zcaron': 500,\n    'ncommaaccent': 556,\n    'onesuperior': 333,\n    'imacron': 278,\n    'Euro': 556\n  },\n  'Helvetica-Bold': {\n    'space': 278,\n    'exclam': 333,\n    'quotedbl': 474,\n    'numbersign': 556,\n    'dollar': 556,\n    'percent': 889,\n    'ampersand': 722,\n    'quoteright': 278,\n    'parenleft': 333,\n    'parenright': 333,\n    'asterisk': 389,\n    'plus': 584,\n    'comma': 278,\n    'hyphen': 333,\n    'period': 278,\n    'slash': 278,\n    'zero': 556,\n    'one': 556,\n    'two': 556,\n    'three': 556,\n    'four': 556,\n    'five': 556,\n    'six': 556,\n    'seven': 556,\n    'eight': 556,\n    'nine': 556,\n    'colon': 333,\n    'semicolon': 333,\n    'less': 584,\n    'equal': 584,\n    'greater': 584,\n    'question': 611,\n    'at': 975,\n    'A': 722,\n    'B': 722,\n    'C': 722,\n    'D': 722,\n    'E': 667,\n    'F': 611,\n    'G': 778,\n    'H': 722,\n    'I': 278,\n    'J': 556,\n    'K': 722,\n    'L': 611,\n    'M': 833,\n    'N': 722,\n    'O': 778,\n    'P': 667,\n    'Q': 778,\n    'R': 722,\n    'S': 667,\n    'T': 611,\n    'U': 722,\n    'V': 667,\n    'W': 944,\n    'X': 667,\n    'Y': 667,\n    'Z': 611,\n    'bracketleft': 333,\n    'backslash': 278,\n    'bracketright': 333,\n    'asciicircum': 584,\n    'underscore': 556,\n    'quoteleft': 278,\n    'a': 556,\n    'b': 611,\n    'c': 556,\n    'd': 611,\n    'e': 556,\n    'f': 333,\n    'g': 611,\n    'h': 611,\n    'i': 278,\n    'j': 278,\n    'k': 556,\n    'l': 278,\n    'm': 889,\n    'n': 611,\n    'o': 611,\n    'p': 611,\n    'q': 611,\n    'r': 389,\n    's': 556,\n    't': 333,\n    'u': 611,\n    'v': 556,\n    'w': 778,\n    'x': 556,\n    'y': 556,\n    'z': 500,\n    'braceleft': 389,\n    'bar': 280,\n    'braceright': 389,\n    'asciitilde': 584,\n    'exclamdown': 333,\n    'cent': 556,\n    'sterling': 556,\n    'fraction': 167,\n    'yen': 556,\n    'florin': 556,\n    'section': 556,\n    'currency': 556,\n    'quotesingle': 238,\n    'quotedblleft': 500,\n    'guillemotleft': 556,\n    'guilsinglleft': 333,\n    'guilsinglright': 333,\n    'fi': 611,\n    'fl': 611,\n    'endash': 556,\n    'dagger': 556,\n    'daggerdbl': 556,\n    'periodcentered': 278,\n    'paragraph': 556,\n    'bullet': 350,\n    'quotesinglbase': 278,\n    'quotedblbase': 500,\n    'quotedblright': 500,\n    'guillemotright': 556,\n    'ellipsis': 1000,\n    'perthousand': 1000,\n    'questiondown': 611,\n    'grave': 333,\n    'acute': 333,\n    'circumflex': 333,\n    'tilde': 333,\n    'macron': 333,\n    'breve': 333,\n    'dotaccent': 333,\n    'dieresis': 333,\n    'ring': 333,\n    'cedilla': 333,\n    'hungarumlaut': 333,\n    'ogonek': 333,\n    'caron': 333,\n    'emdash': 1000,\n    'AE': 1000,\n    'ordfeminine': 370,\n    'Lslash': 611,\n    'Oslash': 778,\n    'OE': 1000,\n    'ordmasculine': 365,\n    'ae': 889,\n    'dotlessi': 278,\n    'lslash': 278,\n    'oslash': 611,\n    'oe': 944,\n    'germandbls': 611,\n    'Idieresis': 278,\n    'eacute': 556,\n    'abreve': 556,\n    'uhungarumlaut': 611,\n    'ecaron': 556,\n    'Ydieresis': 667,\n    'divide': 584,\n    'Yacute': 667,\n    'Acircumflex': 722,\n    'aacute': 556,\n    'Ucircumflex': 722,\n    'yacute': 556,\n    'scommaaccent': 556,\n    'ecircumflex': 556,\n    'Uring': 722,\n    'Udieresis': 722,\n    'aogonek': 556,\n    'Uacute': 722,\n    'uogonek': 611,\n    'Edieresis': 667,\n    'Dcroat': 722,\n    'commaaccent': 250,\n    'copyright': 737,\n    'Emacron': 667,\n    'ccaron': 556,\n    'aring': 556,\n    'Ncommaaccent': 722,\n    'lacute': 278,\n    'agrave': 556,\n    'Tcommaaccent': 611,\n    'Cacute': 722,\n    'atilde': 556,\n    'Edotaccent': 667,\n    'scaron': 556,\n    'scedilla': 556,\n    'iacute': 278,\n    'lozenge': 494,\n    'Rcaron': 722,\n    'Gcommaaccent': 778,\n    'ucircumflex': 611,\n    'acircumflex': 556,\n    'Amacron': 722,\n    'rcaron': 389,\n    'ccedilla': 556,\n    'Zdotaccent': 611,\n    'Thorn': 667,\n    'Omacron': 778,\n    'Racute': 722,\n    'Sacute': 667,\n    'dcaron': 743,\n    'Umacron': 722,\n    'uring': 611,\n    'threesuperior': 333,\n    'Ograve': 778,\n    'Agrave': 722,\n    'Abreve': 722,\n    'multiply': 584,\n    'uacute': 611,\n    'Tcaron': 611,\n    'partialdiff': 494,\n    'ydieresis': 556,\n    'Nacute': 722,\n    'icircumflex': 278,\n    'Ecircumflex': 667,\n    'adieresis': 556,\n    'edieresis': 556,\n    'cacute': 556,\n    'nacute': 611,\n    'umacron': 611,\n    'Ncaron': 722,\n    'Iacute': 278,\n    'plusminus': 584,\n    'brokenbar': 280,\n    'registered': 737,\n    'Gbreve': 778,\n    'Idotaccent': 278,\n    'summation': 600,\n    'Egrave': 667,\n    'racute': 389,\n    'omacron': 611,\n    'Zacute': 611,\n    'Zcaron': 611,\n    'greaterequal': 549,\n    'Eth': 722,\n    'Ccedilla': 722,\n    'lcommaaccent': 278,\n    'tcaron': 389,\n    'eogonek': 556,\n    'Uogonek': 722,\n    'Aacute': 722,\n    'Adieresis': 722,\n    'egrave': 556,\n    'zacute': 500,\n    'iogonek': 278,\n    'Oacute': 778,\n    'oacute': 611,\n    'amacron': 556,\n    'sacute': 556,\n    'idieresis': 278,\n    'Ocircumflex': 778,\n    'Ugrave': 722,\n    'Delta': 612,\n    'thorn': 611,\n    'twosuperior': 333,\n    'Odieresis': 778,\n    'mu': 611,\n    'igrave': 278,\n    'ohungarumlaut': 611,\n    'Eogonek': 667,\n    'dcroat': 611,\n    'threequarters': 834,\n    'Scedilla': 667,\n    'lcaron': 400,\n    'Kcommaaccent': 722,\n    'Lacute': 611,\n    'trademark': 1000,\n    'edotaccent': 556,\n    'Igrave': 278,\n    'Imacron': 278,\n    'Lcaron': 611,\n    'onehalf': 834,\n    'lessequal': 549,\n    'ocircumflex': 611,\n    'ntilde': 611,\n    'Uhungarumlaut': 722,\n    'Eacute': 667,\n    'emacron': 556,\n    'gbreve': 611,\n    'onequarter': 834,\n    'Scaron': 667,\n    'Scommaaccent': 667,\n    'Ohungarumlaut': 778,\n    'degree': 400,\n    'ograve': 611,\n    'Ccaron': 722,\n    'ugrave': 611,\n    'radical': 549,\n    'Dcaron': 722,\n    'rcommaaccent': 389,\n    'Ntilde': 722,\n    'otilde': 611,\n    'Rcommaaccent': 722,\n    'Lcommaaccent': 611,\n    'Atilde': 722,\n    'Aogonek': 722,\n    'Aring': 722,\n    'Otilde': 778,\n    'zdotaccent': 500,\n    'Ecaron': 667,\n    'Iogonek': 278,\n    'kcommaaccent': 556,\n    'minus': 584,\n    'Icircumflex': 278,\n    'ncaron': 611,\n    'tcommaaccent': 333,\n    'logicalnot': 584,\n    'odieresis': 611,\n    'udieresis': 611,\n    'notequal': 549,\n    'gcommaaccent': 611,\n    'eth': 611,\n    'zcaron': 500,\n    'ncommaaccent': 611,\n    'onesuperior': 333,\n    'imacron': 278,\n    'Euro': 556\n  },\n  'Helvetica-BoldOblique': {\n    'space': 278,\n    'exclam': 333,\n    'quotedbl': 474,\n    'numbersign': 556,\n    'dollar': 556,\n    'percent': 889,\n    'ampersand': 722,\n    'quoteright': 278,\n    'parenleft': 333,\n    'parenright': 333,\n    'asterisk': 389,\n    'plus': 584,\n    'comma': 278,\n    'hyphen': 333,\n    'period': 278,\n    'slash': 278,\n    'zero': 556,\n    'one': 556,\n    'two': 556,\n    'three': 556,\n    'four': 556,\n    'five': 556,\n    'six': 556,\n    'seven': 556,\n    'eight': 556,\n    'nine': 556,\n    'colon': 333,\n    'semicolon': 333,\n    'less': 584,\n    'equal': 584,\n    'greater': 584,\n    'question': 611,\n    'at': 975,\n    'A': 722,\n    'B': 722,\n    'C': 722,\n    'D': 722,\n    'E': 667,\n    'F': 611,\n    'G': 778,\n    'H': 722,\n    'I': 278,\n    'J': 556,\n    'K': 722,\n    'L': 611,\n    'M': 833,\n    'N': 722,\n    'O': 778,\n    'P': 667,\n    'Q': 778,\n    'R': 722,\n    'S': 667,\n    'T': 611,\n    'U': 722,\n    'V': 667,\n    'W': 944,\n    'X': 667,\n    'Y': 667,\n    'Z': 611,\n    'bracketleft': 333,\n    'backslash': 278,\n    'bracketright': 333,\n    'asciicircum': 584,\n    'underscore': 556,\n    'quoteleft': 278,\n    'a': 556,\n    'b': 611,\n    'c': 556,\n    'd': 611,\n    'e': 556,\n    'f': 333,\n    'g': 611,\n    'h': 611,\n    'i': 278,\n    'j': 278,\n    'k': 556,\n    'l': 278,\n    'm': 889,\n    'n': 611,\n    'o': 611,\n    'p': 611,\n    'q': 611,\n    'r': 389,\n    's': 556,\n    't': 333,\n    'u': 611,\n    'v': 556,\n    'w': 778,\n    'x': 556,\n    'y': 556,\n    'z': 500,\n    'braceleft': 389,\n    'bar': 280,\n    'braceright': 389,\n    'asciitilde': 584,\n    'exclamdown': 333,\n    'cent': 556,\n    'sterling': 556,\n    'fraction': 167,\n    'yen': 556,\n    'florin': 556,\n    'section': 556,\n    'currency': 556,\n    'quotesingle': 238,\n    'quotedblleft': 500,\n    'guillemotleft': 556,\n    'guilsinglleft': 333,\n    'guilsinglright': 333,\n    'fi': 611,\n    'fl': 611,\n    'endash': 556,\n    'dagger': 556,\n    'daggerdbl': 556,\n    'periodcentered': 278,\n    'paragraph': 556,\n    'bullet': 350,\n    'quotesinglbase': 278,\n    'quotedblbase': 500,\n    'quotedblright': 500,\n    'guillemotright': 556,\n    'ellipsis': 1000,\n    'perthousand': 1000,\n    'questiondown': 611,\n    'grave': 333,\n    'acute': 333,\n    'circumflex': 333,\n    'tilde': 333,\n    'macron': 333,\n    'breve': 333,\n    'dotaccent': 333,\n    'dieresis': 333,\n    'ring': 333,\n    'cedilla': 333,\n    'hungarumlaut': 333,\n    'ogonek': 333,\n    'caron': 333,\n    'emdash': 1000,\n    'AE': 1000,\n    'ordfeminine': 370,\n    'Lslash': 611,\n    'Oslash': 778,\n    'OE': 1000,\n    'ordmasculine': 365,\n    'ae': 889,\n    'dotlessi': 278,\n    'lslash': 278,\n    'oslash': 611,\n    'oe': 944,\n    'germandbls': 611,\n    'Idieresis': 278,\n    'eacute': 556,\n    'abreve': 556,\n    'uhungarumlaut': 611,\n    'ecaron': 556,\n    'Ydieresis': 667,\n    'divide': 584,\n    'Yacute': 667,\n    'Acircumflex': 722,\n    'aacute': 556,\n    'Ucircumflex': 722,\n    'yacute': 556,\n    'scommaaccent': 556,\n    'ecircumflex': 556,\n    'Uring': 722,\n    'Udieresis': 722,\n    'aogonek': 556,\n    'Uacute': 722,\n    'uogonek': 611,\n    'Edieresis': 667,\n    'Dcroat': 722,\n    'commaaccent': 250,\n    'copyright': 737,\n    'Emacron': 667,\n    'ccaron': 556,\n    'aring': 556,\n    'Ncommaaccent': 722,\n    'lacute': 278,\n    'agrave': 556,\n    'Tcommaaccent': 611,\n    'Cacute': 722,\n    'atilde': 556,\n    'Edotaccent': 667,\n    'scaron': 556,\n    'scedilla': 556,\n    'iacute': 278,\n    'lozenge': 494,\n    'Rcaron': 722,\n    'Gcommaaccent': 778,\n    'ucircumflex': 611,\n    'acircumflex': 556,\n    'Amacron': 722,\n    'rcaron': 389,\n    'ccedilla': 556,\n    'Zdotaccent': 611,\n    'Thorn': 667,\n    'Omacron': 778,\n    'Racute': 722,\n    'Sacute': 667,\n    'dcaron': 743,\n    'Umacron': 722,\n    'uring': 611,\n    'threesuperior': 333,\n    'Ograve': 778,\n    'Agrave': 722,\n    'Abreve': 722,\n    'multiply': 584,\n    'uacute': 611,\n    'Tcaron': 611,\n    'partialdiff': 494,\n    'ydieresis': 556,\n    'Nacute': 722,\n    'icircumflex': 278,\n    'Ecircumflex': 667,\n    'adieresis': 556,\n    'edieresis': 556,\n    'cacute': 556,\n    'nacute': 611,\n    'umacron': 611,\n    'Ncaron': 722,\n    'Iacute': 278,\n    'plusminus': 584,\n    'brokenbar': 280,\n    'registered': 737,\n    'Gbreve': 778,\n    'Idotaccent': 278,\n    'summation': 600,\n    'Egrave': 667,\n    'racute': 389,\n    'omacron': 611,\n    'Zacute': 611,\n    'Zcaron': 611,\n    'greaterequal': 549,\n    'Eth': 722,\n    'Ccedilla': 722,\n    'lcommaaccent': 278,\n    'tcaron': 389,\n    'eogonek': 556,\n    'Uogonek': 722,\n    'Aacute': 722,\n    'Adieresis': 722,\n    'egrave': 556,\n    'zacute': 500,\n    'iogonek': 278,\n    'Oacute': 778,\n    'oacute': 611,\n    'amacron': 556,\n    'sacute': 556,\n    'idieresis': 278,\n    'Ocircumflex': 778,\n    'Ugrave': 722,\n    'Delta': 612,\n    'thorn': 611,\n    'twosuperior': 333,\n    'Odieresis': 778,\n    'mu': 611,\n    'igrave': 278,\n    'ohungarumlaut': 611,\n    'Eogonek': 667,\n    'dcroat': 611,\n    'threequarters': 834,\n    'Scedilla': 667,\n    'lcaron': 400,\n    'Kcommaaccent': 722,\n    'Lacute': 611,\n    'trademark': 1000,\n    'edotaccent': 556,\n    'Igrave': 278,\n    'Imacron': 278,\n    'Lcaron': 611,\n    'onehalf': 834,\n    'lessequal': 549,\n    'ocircumflex': 611,\n    'ntilde': 611,\n    'Uhungarumlaut': 722,\n    'Eacute': 667,\n    'emacron': 556,\n    'gbreve': 611,\n    'onequarter': 834,\n    'Scaron': 667,\n    'Scommaaccent': 667,\n    'Ohungarumlaut': 778,\n    'degree': 400,\n    'ograve': 611,\n    'Ccaron': 722,\n    'ugrave': 611,\n    'radical': 549,\n    'Dcaron': 722,\n    'rcommaaccent': 389,\n    'Ntilde': 722,\n    'otilde': 611,\n    'Rcommaaccent': 722,\n    'Lcommaaccent': 611,\n    'Atilde': 722,\n    'Aogonek': 722,\n    'Aring': 722,\n    'Otilde': 778,\n    'zdotaccent': 500,\n    'Ecaron': 667,\n    'Iogonek': 278,\n    'kcommaaccent': 556,\n    'minus': 584,\n    'Icircumflex': 278,\n    'ncaron': 611,\n    'tcommaaccent': 333,\n    'logicalnot': 584,\n    'odieresis': 611,\n    'udieresis': 611,\n    'notequal': 549,\n    'gcommaaccent': 611,\n    'eth': 611,\n    'zcaron': 500,\n    'ncommaaccent': 611,\n    'onesuperior': 333,\n    'imacron': 278,\n    'Euro': 556\n  },\n  'Helvetica-Oblique' : {\n    'space': 278,\n    'exclam': 278,\n    'quotedbl': 355,\n    'numbersign': 556,\n    'dollar': 556,\n    'percent': 889,\n    'ampersand': 667,\n    'quoteright': 222,\n    'parenleft': 333,\n    'parenright': 333,\n    'asterisk': 389,\n    'plus': 584,\n    'comma': 278,\n    'hyphen': 333,\n    'period': 278,\n    'slash': 278,\n    'zero': 556,\n    'one': 556,\n    'two': 556,\n    'three': 556,\n    'four': 556,\n    'five': 556,\n    'six': 556,\n    'seven': 556,\n    'eight': 556,\n    'nine': 556,\n    'colon': 278,\n    'semicolon': 278,\n    'less': 584,\n    'equal': 584,\n    'greater': 584,\n    'question': 556,\n    'at': 1015,\n    'A': 667,\n    'B': 667,\n    'C': 722,\n    'D': 722,\n    'E': 667,\n    'F': 611,\n    'G': 778,\n    'H': 722,\n    'I': 278,\n    'J': 500,\n    'K': 667,\n    'L': 556,\n    'M': 833,\n    'N': 722,\n    'O': 778,\n    'P': 667,\n    'Q': 778,\n    'R': 722,\n    'S': 667,\n    'T': 611,\n    'U': 722,\n    'V': 667,\n    'W': 944,\n    'X': 667,\n    'Y': 667,\n    'Z': 611,\n    'bracketleft': 278,\n    'backslash': 278,\n    'bracketright': 278,\n    'asciicircum': 469,\n    'underscore': 556,\n    'quoteleft': 222,\n    'a': 556,\n    'b': 556,\n    'c': 500,\n    'd': 556,\n    'e': 556,\n    'f': 278,\n    'g': 556,\n    'h': 556,\n    'i': 222,\n    'j': 222,\n    'k': 500,\n    'l': 222,\n    'm': 833,\n    'n': 556,\n    'o': 556,\n    'p': 556,\n    'q': 556,\n    'r': 333,\n    's': 500,\n    't': 278,\n    'u': 556,\n    'v': 500,\n    'w': 722,\n    'x': 500,\n    'y': 500,\n    'z': 500,\n    'braceleft': 334,\n    'bar': 260,\n    'braceright': 334,\n    'asciitilde': 584,\n    'exclamdown': 333,\n    'cent': 556,\n    'sterling': 556,\n    'fraction': 167,\n    'yen': 556,\n    'florin': 556,\n    'section': 556,\n    'currency': 556,\n    'quotesingle': 191,\n    'quotedblleft': 333,\n    'guillemotleft': 556,\n    'guilsinglleft': 333,\n    'guilsinglright': 333,\n    'fi': 500,\n    'fl': 500,\n    'endash': 556,\n    'dagger': 556,\n    'daggerdbl': 556,\n    'periodcentered': 278,\n    'paragraph': 537,\n    'bullet': 350,\n    'quotesinglbase': 222,\n    'quotedblbase': 333,\n    'quotedblright': 333,\n    'guillemotright': 556,\n    'ellipsis': 1000,\n    'perthousand': 1000,\n    'questiondown': 611,\n    'grave': 333,\n    'acute': 333,\n    'circumflex': 333,\n    'tilde': 333,\n    'macron': 333,\n    'breve': 333,\n    'dotaccent': 333,\n    'dieresis': 333,\n    'ring': 333,\n    'cedilla': 333,\n    'hungarumlaut': 333,\n    'ogonek': 333,\n    'caron': 333,\n    'emdash': 1000,\n    'AE': 1000,\n    'ordfeminine': 370,\n    'Lslash': 556,\n    'Oslash': 778,\n    'OE': 1000,\n    'ordmasculine': 365,\n    'ae': 889,\n    'dotlessi': 278,\n    'lslash': 222,\n    'oslash': 611,\n    'oe': 944,\n    'germandbls': 611,\n    'Idieresis': 278,\n    'eacute': 556,\n    'abreve': 556,\n    'uhungarumlaut': 556,\n    'ecaron': 556,\n    'Ydieresis': 667,\n    'divide': 584,\n    'Yacute': 667,\n    'Acircumflex': 667,\n    'aacute': 556,\n    'Ucircumflex': 722,\n    'yacute': 500,\n    'scommaaccent': 500,\n    'ecircumflex': 556,\n    'Uring': 722,\n    'Udieresis': 722,\n    'aogonek': 556,\n    'Uacute': 722,\n    'uogonek': 556,\n    'Edieresis': 667,\n    'Dcroat': 722,\n    'commaaccent': 250,\n    'copyright': 737,\n    'Emacron': 667,\n    'ccaron': 500,\n    'aring': 556,\n    'Ncommaaccent': 722,\n    'lacute': 222,\n    'agrave': 556,\n    'Tcommaaccent': 611,\n    'Cacute': 722,\n    'atilde': 556,\n    'Edotaccent': 667,\n    'scaron': 500,\n    'scedilla': 500,\n    'iacute': 278,\n    'lozenge': 471,\n    'Rcaron': 722,\n    'Gcommaaccent': 778,\n    'ucircumflex': 556,\n    'acircumflex': 556,\n    'Amacron': 667,\n    'rcaron': 333,\n    'ccedilla': 500,\n    'Zdotaccent': 611,\n    'Thorn': 667,\n    'Omacron': 778,\n    'Racute': 722,\n    'Sacute': 667,\n    'dcaron': 643,\n    'Umacron': 722,\n    'uring': 556,\n    'threesuperior': 333,\n    'Ograve': 778,\n    'Agrave': 667,\n    'Abreve': 667,\n    'multiply': 584,\n    'uacute': 556,\n    'Tcaron': 611,\n    'partialdiff': 476,\n    'ydieresis': 500,\n    'Nacute': 722,\n    'icircumflex': 278,\n    'Ecircumflex': 667,\n    'adieresis': 556,\n    'edieresis': 556,\n    'cacute': 500,\n    'nacute': 556,\n    'umacron': 556,\n    'Ncaron': 722,\n    'Iacute': 278,\n    'plusminus': 584,\n    'brokenbar': 260,\n    'registered': 737,\n    'Gbreve': 778,\n    'Idotaccent': 278,\n    'summation': 600,\n    'Egrave': 667,\n    'racute': 333,\n    'omacron': 556,\n    'Zacute': 611,\n    'Zcaron': 611,\n    'greaterequal': 549,\n    'Eth': 722,\n    'Ccedilla': 722,\n    'lcommaaccent': 222,\n    'tcaron': 317,\n    'eogonek': 556,\n    'Uogonek': 722,\n    'Aacute': 667,\n    'Adieresis': 667,\n    'egrave': 556,\n    'zacute': 500,\n    'iogonek': 222,\n    'Oacute': 778,\n    'oacute': 556,\n    'amacron': 556,\n    'sacute': 500,\n    'idieresis': 278,\n    'Ocircumflex': 778,\n    'Ugrave': 722,\n    'Delta': 612,\n    'thorn': 556,\n    'twosuperior': 333,\n    'Odieresis': 778,\n    'mu': 556,\n    'igrave': 278,\n    'ohungarumlaut': 556,\n    'Eogonek': 667,\n    'dcroat': 556,\n    'threequarters': 834,\n    'Scedilla': 667,\n    'lcaron': 299,\n    'Kcommaaccent': 667,\n    'Lacute': 556,\n    'trademark': 1000,\n    'edotaccent': 556,\n    'Igrave': 278,\n    'Imacron': 278,\n    'Lcaron': 556,\n    'onehalf': 834,\n    'lessequal': 549,\n    'ocircumflex': 556,\n    'ntilde': 556,\n    'Uhungarumlaut': 722,\n    'Eacute': 667,\n    'emacron': 556,\n    'gbreve': 556,\n    'onequarter': 834,\n    'Scaron': 667,\n    'Scommaaccent': 667,\n    'Ohungarumlaut': 778,\n    'degree': 400,\n    'ograve': 556,\n    'Ccaron': 722,\n    'ugrave': 556,\n    'radical': 453,\n    'Dcaron': 722,\n    'rcommaaccent': 333,\n    'Ntilde': 722,\n    'otilde': 556,\n    'Rcommaaccent': 722,\n    'Lcommaaccent': 556,\n    'Atilde': 667,\n    'Aogonek': 667,\n    'Aring': 667,\n    'Otilde': 778,\n    'zdotaccent': 500,\n    'Ecaron': 667,\n    'Iogonek': 278,\n    'kcommaaccent': 500,\n    'minus': 584,\n    'Icircumflex': 278,\n    'ncaron': 556,\n    'tcommaaccent': 278,\n    'logicalnot': 584,\n    'odieresis': 556,\n    'udieresis': 556,\n    'notequal': 549,\n    'gcommaaccent': 556,\n    'eth': 556,\n    'zcaron': 500,\n    'ncommaaccent': 556,\n    'onesuperior': 333,\n    'imacron': 278,\n    'Euro': 556\n  },\n  'Symbol': {\n    'space': 250,\n    'exclam': 333,\n    'universal': 713,\n    'numbersign': 500,\n    'existential': 549,\n    'percent': 833,\n    'ampersand': 778,\n    'suchthat': 439,\n    'parenleft': 333,\n    'parenright': 333,\n    'asteriskmath': 500,\n    'plus': 549,\n    'comma': 250,\n    'minus': 549,\n    'period': 250,\n    'slash': 278,\n    'zero': 500,\n    'one': 500,\n    'two': 500,\n    'three': 500,\n    'four': 500,\n    'five': 500,\n    'six': 500,\n    'seven': 500,\n    'eight': 500,\n    'nine': 500,\n    'colon': 278,\n    'semicolon': 278,\n    'less': 549,\n    'equal': 549,\n    'greater': 549,\n    'question': 444,\n    'congruent': 549,\n    'Alpha': 722,\n    'Beta': 667,\n    'Chi': 722,\n    'Delta': 612,\n    'Epsilon': 611,\n    'Phi': 763,\n    'Gamma': 603,\n    'Eta': 722,\n    'Iota': 333,\n    'theta1': 631,\n    'Kappa': 722,\n    'Lambda': 686,\n    'Mu': 889,\n    'Nu': 722,\n    'Omicron': 722,\n    'Pi': 768,\n    'Theta': 741,\n    'Rho': 556,\n    'Sigma': 592,\n    'Tau': 611,\n    'Upsilon': 690,\n    'sigma1': 439,\n    'Omega': 768,\n    'Xi': 645,\n    'Psi': 795,\n    'Zeta': 611,\n    'bracketleft': 333,\n    'therefore': 863,\n    'bracketright': 333,\n    'perpendicular': 658,\n    'underscore': 500,\n    'radicalex': 500,\n    'alpha': 631,\n    'beta': 549,\n    'chi': 549,\n    'delta': 494,\n    'epsilon': 439,\n    'phi': 521,\n    'gamma': 411,\n    'eta': 603,\n    'iota': 329,\n    'phi1': 603,\n    'kappa': 549,\n    'lambda': 549,\n    'mu': 576,\n    'nu': 521,\n    'omicron': 549,\n    'pi': 549,\n    'theta': 521,\n    'rho': 549,\n    'sigma': 603,\n    'tau': 439,\n    'upsilon': 576,\n    'omega1': 713,\n    'omega': 686,\n    'xi': 493,\n    'psi': 686,\n    'zeta': 494,\n    'braceleft': 480,\n    'bar': 200,\n    'braceright': 480,\n    'similar': 549,\n    'Euro': 750,\n    'Upsilon1': 620,\n    'minute': 247,\n    'lessequal': 549,\n    'fraction': 167,\n    'infinity': 713,\n    'florin': 500,\n    'club': 753,\n    'diamond': 753,\n    'heart': 753,\n    'spade': 753,\n    'arrowboth': 1042,\n    'arrowleft': 987,\n    'arrowup': 603,\n    'arrowright': 987,\n    'arrowdown': 603,\n    'degree': 400,\n    'plusminus': 549,\n    'second': 411,\n    'greaterequal': 549,\n    'multiply': 549,\n    'proportional': 713,\n    'partialdiff': 494,\n    'bullet': 460,\n    'divide': 549,\n    'notequal': 549,\n    'equivalence': 549,\n    'approxequal': 549,\n    'ellipsis': 1000,\n    'arrowvertex': 603,\n    'arrowhorizex': 1000,\n    'carriagereturn': 658,\n    'aleph': 823,\n    'Ifraktur': 686,\n    'Rfraktur': 795,\n    'weierstrass': 987,\n    'circlemultiply': 768,\n    'circleplus': 768,\n    'emptyset': 823,\n    'intersection': 768,\n    'union': 768,\n    'propersuperset': 713,\n    'reflexsuperset': 713,\n    'notsubset': 713,\n    'propersubset': 713,\n    'reflexsubset': 713,\n    'element': 713,\n    'notelement': 713,\n    'angle': 768,\n    'gradient': 713,\n    'registerserif': 790,\n    'copyrightserif': 790,\n    'trademarkserif': 890,\n    'product': 823,\n    'radical': 549,\n    'dotmath': 250,\n    'logicalnot': 713,\n    'logicaland': 603,\n    'logicalor': 603,\n    'arrowdblboth': 1042,\n    'arrowdblleft': 987,\n    'arrowdblup': 603,\n    'arrowdblright': 987,\n    'arrowdbldown': 603,\n    'lozenge': 494,\n    'angleleft': 329,\n    'registersans': 790,\n    'copyrightsans': 790,\n    'trademarksans': 786,\n    'summation': 713,\n    'parenlefttp': 384,\n    'parenleftex': 384,\n    'parenleftbt': 384,\n    'bracketlefttp': 384,\n    'bracketleftex': 384,\n    'bracketleftbt': 384,\n    'bracelefttp': 494,\n    'braceleftmid': 494,\n    'braceleftbt': 494,\n    'braceex': 494,\n    'angleright': 329,\n    'integral': 274,\n    'integraltp': 686,\n    'integralex': 686,\n    'integralbt': 686,\n    'parenrighttp': 384,\n    'parenrightex': 384,\n    'parenrightbt': 384,\n    'bracketrighttp': 384,\n    'bracketrightex': 384,\n    'bracketrightbt': 384,\n    'bracerighttp': 494,\n    'bracerightmid': 494,\n    'bracerightbt': 494,\n    'apple': 790\n  },\n  'Times-Roman': {\n    'space': 250,\n    'exclam': 333,\n    'quotedbl': 408,\n    'numbersign': 500,\n    'dollar': 500,\n    'percent': 833,\n    'ampersand': 778,\n    'quoteright': 333,\n    'parenleft': 333,\n    'parenright': 333,\n    'asterisk': 500,\n    'plus': 564,\n    'comma': 250,\n    'hyphen': 333,\n    'period': 250,\n    'slash': 278,\n    'zero': 500,\n    'one': 500,\n    'two': 500,\n    'three': 500,\n    'four': 500,\n    'five': 500,\n    'six': 500,\n    'seven': 500,\n    'eight': 500,\n    'nine': 500,\n    'colon': 278,\n    'semicolon': 278,\n    'less': 564,\n    'equal': 564,\n    'greater': 564,\n    'question': 444,\n    'at': 921,\n    'A': 722,\n    'B': 667,\n    'C': 667,\n    'D': 722,\n    'E': 611,\n    'F': 556,\n    'G': 722,\n    'H': 722,\n    'I': 333,\n    'J': 389,\n    'K': 722,\n    'L': 611,\n    'M': 889,\n    'N': 722,\n    'O': 722,\n    'P': 556,\n    'Q': 722,\n    'R': 667,\n    'S': 556,\n    'T': 611,\n    'U': 722,\n    'V': 722,\n    'W': 944,\n    'X': 722,\n    'Y': 722,\n    'Z': 611,\n    'bracketleft': 333,\n    'backslash': 278,\n    'bracketright': 333,\n    'asciicircum': 469,\n    'underscore': 500,\n    'quoteleft': 333,\n    'a': 444,\n    'b': 500,\n    'c': 444,\n    'd': 500,\n    'e': 444,\n    'f': 333,\n    'g': 500,\n    'h': 500,\n    'i': 278,\n    'j': 278,\n    'k': 500,\n    'l': 278,\n    'm': 778,\n    'n': 500,\n    'o': 500,\n    'p': 500,\n    'q': 500,\n    'r': 333,\n    's': 389,\n    't': 278,\n    'u': 500,\n    'v': 500,\n    'w': 722,\n    'x': 500,\n    'y': 500,\n    'z': 444,\n    'braceleft': 480,\n    'bar': 200,\n    'braceright': 480,\n    'asciitilde': 541,\n    'exclamdown': 333,\n    'cent': 500,\n    'sterling': 500,\n    'fraction': 167,\n    'yen': 500,\n    'florin': 500,\n    'section': 500,\n    'currency': 500,\n    'quotesingle': 180,\n    'quotedblleft': 444,\n    'guillemotleft': 500,\n    'guilsinglleft': 333,\n    'guilsinglright': 333,\n    'fi': 556,\n    'fl': 556,\n    'endash': 500,\n    'dagger': 500,\n    'daggerdbl': 500,\n    'periodcentered': 250,\n    'paragraph': 453,\n    'bullet': 350,\n    'quotesinglbase': 333,\n    'quotedblbase': 444,\n    'quotedblright': 444,\n    'guillemotright': 500,\n    'ellipsis': 1000,\n    'perthousand': 1000,\n    'questiondown': 444,\n    'grave': 333,\n    'acute': 333,\n    'circumflex': 333,\n    'tilde': 333,\n    'macron': 333,\n    'breve': 333,\n    'dotaccent': 333,\n    'dieresis': 333,\n    'ring': 333,\n    'cedilla': 333,\n    'hungarumlaut': 333,\n    'ogonek': 333,\n    'caron': 333,\n    'emdash': 1000,\n    'AE': 889,\n    'ordfeminine': 276,\n    'Lslash': 611,\n    'Oslash': 722,\n    'OE': 889,\n    'ordmasculine': 310,\n    'ae': 667,\n    'dotlessi': 278,\n    'lslash': 278,\n    'oslash': 500,\n    'oe': 722,\n    'germandbls': 500,\n    'Idieresis': 333,\n    'eacute': 444,\n    'abreve': 444,\n    'uhungarumlaut': 500,\n    'ecaron': 444,\n    'Ydieresis': 722,\n    'divide': 564,\n    'Yacute': 722,\n    'Acircumflex': 722,\n    'aacute': 444,\n    'Ucircumflex': 722,\n    'yacute': 500,\n    'scommaaccent': 389,\n    'ecircumflex': 444,\n    'Uring': 722,\n    'Udieresis': 722,\n    'aogonek': 444,\n    'Uacute': 722,\n    'uogonek': 500,\n    'Edieresis': 611,\n    'Dcroat': 722,\n    'commaaccent': 250,\n    'copyright': 760,\n    'Emacron': 611,\n    'ccaron': 444,\n    'aring': 444,\n    'Ncommaaccent': 722,\n    'lacute': 278,\n    'agrave': 444,\n    'Tcommaaccent': 611,\n    'Cacute': 667,\n    'atilde': 444,\n    'Edotaccent': 611,\n    'scaron': 389,\n    'scedilla': 389,\n    'iacute': 278,\n    'lozenge': 471,\n    'Rcaron': 667,\n    'Gcommaaccent': 722,\n    'ucircumflex': 500,\n    'acircumflex': 444,\n    'Amacron': 722,\n    'rcaron': 333,\n    'ccedilla': 444,\n    'Zdotaccent': 611,\n    'Thorn': 556,\n    'Omacron': 722,\n    'Racute': 667,\n    'Sacute': 556,\n    'dcaron': 588,\n    'Umacron': 722,\n    'uring': 500,\n    'threesuperior': 300,\n    'Ograve': 722,\n    'Agrave': 722,\n    'Abreve': 722,\n    'multiply': 564,\n    'uacute': 500,\n    'Tcaron': 611,\n    'partialdiff': 476,\n    'ydieresis': 500,\n    'Nacute': 722,\n    'icircumflex': 278,\n    'Ecircumflex': 611,\n    'adieresis': 444,\n    'edieresis': 444,\n    'cacute': 444,\n    'nacute': 500,\n    'umacron': 500,\n    'Ncaron': 722,\n    'Iacute': 333,\n    'plusminus': 564,\n    'brokenbar': 200,\n    'registered': 760,\n    'Gbreve': 722,\n    'Idotaccent': 333,\n    'summation': 600,\n    'Egrave': 611,\n    'racute': 333,\n    'omacron': 500,\n    'Zacute': 611,\n    'Zcaron': 611,\n    'greaterequal': 549,\n    'Eth': 722,\n    'Ccedilla': 667,\n    'lcommaaccent': 278,\n    'tcaron': 326,\n    'eogonek': 444,\n    'Uogonek': 722,\n    'Aacute': 722,\n    'Adieresis': 722,\n    'egrave': 444,\n    'zacute': 444,\n    'iogonek': 278,\n    'Oacute': 722,\n    'oacute': 500,\n    'amacron': 444,\n    'sacute': 389,\n    'idieresis': 278,\n    'Ocircumflex': 722,\n    'Ugrave': 722,\n    'Delta': 612,\n    'thorn': 500,\n    'twosuperior': 300,\n    'Odieresis': 722,\n    'mu': 500,\n    'igrave': 278,\n    'ohungarumlaut': 500,\n    'Eogonek': 611,\n    'dcroat': 500,\n    'threequarters': 750,\n    'Scedilla': 556,\n    'lcaron': 344,\n    'Kcommaaccent': 722,\n    'Lacute': 611,\n    'trademark': 980,\n    'edotaccent': 444,\n    'Igrave': 333,\n    'Imacron': 333,\n    'Lcaron': 611,\n    'onehalf': 750,\n    'lessequal': 549,\n    'ocircumflex': 500,\n    'ntilde': 500,\n    'Uhungarumlaut': 722,\n    'Eacute': 611,\n    'emacron': 444,\n    'gbreve': 500,\n    'onequarter': 750,\n    'Scaron': 556,\n    'Scommaaccent': 556,\n    'Ohungarumlaut': 722,\n    'degree': 400,\n    'ograve': 500,\n    'Ccaron': 667,\n    'ugrave': 500,\n    'radical': 453,\n    'Dcaron': 722,\n    'rcommaaccent': 333,\n    'Ntilde': 722,\n    'otilde': 500,\n    'Rcommaaccent': 667,\n    'Lcommaaccent': 611,\n    'Atilde': 722,\n    'Aogonek': 722,\n    'Aring': 722,\n    'Otilde': 722,\n    'zdotaccent': 444,\n    'Ecaron': 611,\n    'Iogonek': 333,\n    'kcommaaccent': 500,\n    'minus': 564,\n    'Icircumflex': 333,\n    'ncaron': 500,\n    'tcommaaccent': 278,\n    'logicalnot': 564,\n    'odieresis': 500,\n    'udieresis': 500,\n    'notequal': 549,\n    'gcommaaccent': 500,\n    'eth': 500,\n    'zcaron': 444,\n    'ncommaaccent': 500,\n    'onesuperior': 300,\n    'imacron': 278,\n    'Euro': 500\n  },\n  'Times-Bold': {\n    'space': 250,\n    'exclam': 333,\n    'quotedbl': 555,\n    'numbersign': 500,\n    'dollar': 500,\n    'percent': 1000,\n    'ampersand': 833,\n    'quoteright': 333,\n    'parenleft': 333,\n    'parenright': 333,\n    'asterisk': 500,\n    'plus': 570,\n    'comma': 250,\n    'hyphen': 333,\n    'period': 250,\n    'slash': 278,\n    'zero': 500,\n    'one': 500,\n    'two': 500,\n    'three': 500,\n    'four': 500,\n    'five': 500,\n    'six': 500,\n    'seven': 500,\n    'eight': 500,\n    'nine': 500,\n    'colon': 333,\n    'semicolon': 333,\n    'less': 570,\n    'equal': 570,\n    'greater': 570,\n    'question': 500,\n    'at': 930,\n    'A': 722,\n    'B': 667,\n    'C': 722,\n    'D': 722,\n    'E': 667,\n    'F': 611,\n    'G': 778,\n    'H': 778,\n    'I': 389,\n    'J': 500,\n    'K': 778,\n    'L': 667,\n    'M': 944,\n    'N': 722,\n    'O': 778,\n    'P': 611,\n    'Q': 778,\n    'R': 722,\n    'S': 556,\n    'T': 667,\n    'U': 722,\n    'V': 722,\n    'W': 1000,\n    'X': 722,\n    'Y': 722,\n    'Z': 667,\n    'bracketleft': 333,\n    'backslash': 278,\n    'bracketright': 333,\n    'asciicircum': 581,\n    'underscore': 500,\n    'quoteleft': 333,\n    'a': 500,\n    'b': 556,\n    'c': 444,\n    'd': 556,\n    'e': 444,\n    'f': 333,\n    'g': 500,\n    'h': 556,\n    'i': 278,\n    'j': 333,\n    'k': 556,\n    'l': 278,\n    'm': 833,\n    'n': 556,\n    'o': 500,\n    'p': 556,\n    'q': 556,\n    'r': 444,\n    's': 389,\n    't': 333,\n    'u': 556,\n    'v': 500,\n    'w': 722,\n    'x': 500,\n    'y': 500,\n    'z': 444,\n    'braceleft': 394,\n    'bar': 220,\n    'braceright': 394,\n    'asciitilde': 520,\n    'exclamdown': 333,\n    'cent': 500,\n    'sterling': 500,\n    'fraction': 167,\n    'yen': 500,\n    'florin': 500,\n    'section': 500,\n    'currency': 500,\n    'quotesingle': 278,\n    'quotedblleft': 500,\n    'guillemotleft': 500,\n    'guilsinglleft': 333,\n    'guilsinglright': 333,\n    'fi': 556,\n    'fl': 556,\n    'endash': 500,\n    'dagger': 500,\n    'daggerdbl': 500,\n    'periodcentered': 250,\n    'paragraph': 540,\n    'bullet': 350,\n    'quotesinglbase': 333,\n    'quotedblbase': 500,\n    'quotedblright': 500,\n    'guillemotright': 500,\n    'ellipsis': 1000,\n    'perthousand': 1000,\n    'questiondown': 500,\n    'grave': 333,\n    'acute': 333,\n    'circumflex': 333,\n    'tilde': 333,\n    'macron': 333,\n    'breve': 333,\n    'dotaccent': 333,\n    'dieresis': 333,\n    'ring': 333,\n    'cedilla': 333,\n    'hungarumlaut': 333,\n    'ogonek': 333,\n    'caron': 333,\n    'emdash': 1000,\n    'AE': 1000,\n    'ordfeminine': 300,\n    'Lslash': 667,\n    'Oslash': 778,\n    'OE': 1000,\n    'ordmasculine': 330,\n    'ae': 722,\n    'dotlessi': 278,\n    'lslash': 278,\n    'oslash': 500,\n    'oe': 722,\n    'germandbls': 556,\n    'Idieresis': 389,\n    'eacute': 444,\n    'abreve': 500,\n    'uhungarumlaut': 556,\n    'ecaron': 444,\n    'Ydieresis': 722,\n    'divide': 570,\n    'Yacute': 722,\n    'Acircumflex': 722,\n    'aacute': 500,\n    'Ucircumflex': 722,\n    'yacute': 500,\n    'scommaaccent': 389,\n    'ecircumflex': 444,\n    'Uring': 722,\n    'Udieresis': 722,\n    'aogonek': 500,\n    'Uacute': 722,\n    'uogonek': 556,\n    'Edieresis': 667,\n    'Dcroat': 722,\n    'commaaccent': 250,\n    'copyright': 747,\n    'Emacron': 667,\n    'ccaron': 444,\n    'aring': 500,\n    'Ncommaaccent': 722,\n    'lacute': 278,\n    'agrave': 500,\n    'Tcommaaccent': 667,\n    'Cacute': 722,\n    'atilde': 500,\n    'Edotaccent': 667,\n    'scaron': 389,\n    'scedilla': 389,\n    'iacute': 278,\n    'lozenge': 494,\n    'Rcaron': 722,\n    'Gcommaaccent': 778,\n    'ucircumflex': 556,\n    'acircumflex': 500,\n    'Amacron': 722,\n    'rcaron': 444,\n    'ccedilla': 444,\n    'Zdotaccent': 667,\n    'Thorn': 611,\n    'Omacron': 778,\n    'Racute': 722,\n    'Sacute': 556,\n    'dcaron': 672,\n    'Umacron': 722,\n    'uring': 556,\n    'threesuperior': 300,\n    'Ograve': 778,\n    'Agrave': 722,\n    'Abreve': 722,\n    'multiply': 570,\n    'uacute': 556,\n    'Tcaron': 667,\n    'partialdiff': 494,\n    'ydieresis': 500,\n    'Nacute': 722,\n    'icircumflex': 278,\n    'Ecircumflex': 667,\n    'adieresis': 500,\n    'edieresis': 444,\n    'cacute': 444,\n    'nacute': 556,\n    'umacron': 556,\n    'Ncaron': 722,\n    'Iacute': 389,\n    'plusminus': 570,\n    'brokenbar': 220,\n    'registered': 747,\n    'Gbreve': 778,\n    'Idotaccent': 389,\n    'summation': 600,\n    'Egrave': 667,\n    'racute': 444,\n    'omacron': 500,\n    'Zacute': 667,\n    'Zcaron': 667,\n    'greaterequal': 549,\n    'Eth': 722,\n    'Ccedilla': 722,\n    'lcommaaccent': 278,\n    'tcaron': 416,\n    'eogonek': 444,\n    'Uogonek': 722,\n    'Aacute': 722,\n    'Adieresis': 722,\n    'egrave': 444,\n    'zacute': 444,\n    'iogonek': 278,\n    'Oacute': 778,\n    'oacute': 500,\n    'amacron': 500,\n    'sacute': 389,\n    'idieresis': 278,\n    'Ocircumflex': 778,\n    'Ugrave': 722,\n    'Delta': 612,\n    'thorn': 556,\n    'twosuperior': 300,\n    'Odieresis': 778,\n    'mu': 556,\n    'igrave': 278,\n    'ohungarumlaut': 500,\n    'Eogonek': 667,\n    'dcroat': 556,\n    'threequarters': 750,\n    'Scedilla': 556,\n    'lcaron': 394,\n    'Kcommaaccent': 778,\n    'Lacute': 667,\n    'trademark': 1000,\n    'edotaccent': 444,\n    'Igrave': 389,\n    'Imacron': 389,\n    'Lcaron': 667,\n    'onehalf': 750,\n    'lessequal': 549,\n    'ocircumflex': 500,\n    'ntilde': 556,\n    'Uhungarumlaut': 722,\n    'Eacute': 667,\n    'emacron': 444,\n    'gbreve': 500,\n    'onequarter': 750,\n    'Scaron': 556,\n    'Scommaaccent': 556,\n    'Ohungarumlaut': 778,\n    'degree': 400,\n    'ograve': 500,\n    'Ccaron': 722,\n    'ugrave': 556,\n    'radical': 549,\n    'Dcaron': 722,\n    'rcommaaccent': 444,\n    'Ntilde': 722,\n    'otilde': 500,\n    'Rcommaaccent': 722,\n    'Lcommaaccent': 667,\n    'Atilde': 722,\n    'Aogonek': 722,\n    'Aring': 722,\n    'Otilde': 778,\n    'zdotaccent': 444,\n    'Ecaron': 667,\n    'Iogonek': 389,\n    'kcommaaccent': 556,\n    'minus': 570,\n    'Icircumflex': 389,\n    'ncaron': 556,\n    'tcommaaccent': 333,\n    'logicalnot': 570,\n    'odieresis': 500,\n    'udieresis': 556,\n    'notequal': 549,\n    'gcommaaccent': 500,\n    'eth': 500,\n    'zcaron': 444,\n    'ncommaaccent': 556,\n    'onesuperior': 300,\n    'imacron': 278,\n    'Euro': 500\n  },\n  'Times-BoldItalic': {\n    'space': 250,\n    'exclam': 389,\n    'quotedbl': 555,\n    'numbersign': 500,\n    'dollar': 500,\n    'percent': 833,\n    'ampersand': 778,\n    'quoteright': 333,\n    'parenleft': 333,\n    'parenright': 333,\n    'asterisk': 500,\n    'plus': 570,\n    'comma': 250,\n    'hyphen': 333,\n    'period': 250,\n    'slash': 278,\n    'zero': 500,\n    'one': 500,\n    'two': 500,\n    'three': 500,\n    'four': 500,\n    'five': 500,\n    'six': 500,\n    'seven': 500,\n    'eight': 500,\n    'nine': 500,\n    'colon': 333,\n    'semicolon': 333,\n    'less': 570,\n    'equal': 570,\n    'greater': 570,\n    'question': 500,\n    'at': 832,\n    'A': 667,\n    'B': 667,\n    'C': 667,\n    'D': 722,\n    'E': 667,\n    'F': 667,\n    'G': 722,\n    'H': 778,\n    'I': 389,\n    'J': 500,\n    'K': 667,\n    'L': 611,\n    'M': 889,\n    'N': 722,\n    'O': 722,\n    'P': 611,\n    'Q': 722,\n    'R': 667,\n    'S': 556,\n    'T': 611,\n    'U': 722,\n    'V': 667,\n    'W': 889,\n    'X': 667,\n    'Y': 611,\n    'Z': 611,\n    'bracketleft': 333,\n    'backslash': 278,\n    'bracketright': 333,\n    'asciicircum': 570,\n    'underscore': 500,\n    'quoteleft': 333,\n    'a': 500,\n    'b': 500,\n    'c': 444,\n    'd': 500,\n    'e': 444,\n    'f': 333,\n    'g': 500,\n    'h': 556,\n    'i': 278,\n    'j': 278,\n    'k': 500,\n    'l': 278,\n    'm': 778,\n    'n': 556,\n    'o': 500,\n    'p': 500,\n    'q': 500,\n    'r': 389,\n    's': 389,\n    't': 278,\n    'u': 556,\n    'v': 444,\n    'w': 667,\n    'x': 500,\n    'y': 444,\n    'z': 389,\n    'braceleft': 348,\n    'bar': 220,\n    'braceright': 348,\n    'asciitilde': 570,\n    'exclamdown': 389,\n    'cent': 500,\n    'sterling': 500,\n    'fraction': 167,\n    'yen': 500,\n    'florin': 500,\n    'section': 500,\n    'currency': 500,\n    'quotesingle': 278,\n    'quotedblleft': 500,\n    'guillemotleft': 500,\n    'guilsinglleft': 333,\n    'guilsinglright': 333,\n    'fi': 556,\n    'fl': 556,\n    'endash': 500,\n    'dagger': 500,\n    'daggerdbl': 500,\n    'periodcentered': 250,\n    'paragraph': 500,\n    'bullet': 350,\n    'quotesinglbase': 333,\n    'quotedblbase': 500,\n    'quotedblright': 500,\n    'guillemotright': 500,\n    'ellipsis': 1000,\n    'perthousand': 1000,\n    'questiondown': 500,\n    'grave': 333,\n    'acute': 333,\n    'circumflex': 333,\n    'tilde': 333,\n    'macron': 333,\n    'breve': 333,\n    'dotaccent': 333,\n    'dieresis': 333,\n    'ring': 333,\n    'cedilla': 333,\n    'hungarumlaut': 333,\n    'ogonek': 333,\n    'caron': 333,\n    'emdash': 1000,\n    'AE': 944,\n    'ordfeminine': 266,\n    'Lslash': 611,\n    'Oslash': 722,\n    'OE': 944,\n    'ordmasculine': 300,\n    'ae': 722,\n    'dotlessi': 278,\n    'lslash': 278,\n    'oslash': 500,\n    'oe': 722,\n    'germandbls': 500,\n    'Idieresis': 389,\n    'eacute': 444,\n    'abreve': 500,\n    'uhungarumlaut': 556,\n    'ecaron': 444,\n    'Ydieresis': 611,\n    'divide': 570,\n    'Yacute': 611,\n    'Acircumflex': 667,\n    'aacute': 500,\n    'Ucircumflex': 722,\n    'yacute': 444,\n    'scommaaccent': 389,\n    'ecircumflex': 444,\n    'Uring': 722,\n    'Udieresis': 722,\n    'aogonek': 500,\n    'Uacute': 722,\n    'uogonek': 556,\n    'Edieresis': 667,\n    'Dcroat': 722,\n    'commaaccent': 250,\n    'copyright': 747,\n    'Emacron': 667,\n    'ccaron': 444,\n    'aring': 500,\n    'Ncommaaccent': 722,\n    'lacute': 278,\n    'agrave': 500,\n    'Tcommaaccent': 611,\n    'Cacute': 667,\n    'atilde': 500,\n    'Edotaccent': 667,\n    'scaron': 389,\n    'scedilla': 389,\n    'iacute': 278,\n    'lozenge': 494,\n    'Rcaron': 667,\n    'Gcommaaccent': 722,\n    'ucircumflex': 556,\n    'acircumflex': 500,\n    'Amacron': 667,\n    'rcaron': 389,\n    'ccedilla': 444,\n    'Zdotaccent': 611,\n    'Thorn': 611,\n    'Omacron': 722,\n    'Racute': 667,\n    'Sacute': 556,\n    'dcaron': 608,\n    'Umacron': 722,\n    'uring': 556,\n    'threesuperior': 300,\n    'Ograve': 722,\n    'Agrave': 667,\n    'Abreve': 667,\n    'multiply': 570,\n    'uacute': 556,\n    'Tcaron': 611,\n    'partialdiff': 494,\n    'ydieresis': 444,\n    'Nacute': 722,\n    'icircumflex': 278,\n    'Ecircumflex': 667,\n    'adieresis': 500,\n    'edieresis': 444,\n    'cacute': 444,\n    'nacute': 556,\n    'umacron': 556,\n    'Ncaron': 722,\n    'Iacute': 389,\n    'plusminus': 570,\n    'brokenbar': 220,\n    'registered': 747,\n    'Gbreve': 722,\n    'Idotaccent': 389,\n    'summation': 600,\n    'Egrave': 667,\n    'racute': 389,\n    'omacron': 500,\n    'Zacute': 611,\n    'Zcaron': 611,\n    'greaterequal': 549,\n    'Eth': 722,\n    'Ccedilla': 667,\n    'lcommaaccent': 278,\n    'tcaron': 366,\n    'eogonek': 444,\n    'Uogonek': 722,\n    'Aacute': 667,\n    'Adieresis': 667,\n    'egrave': 444,\n    'zacute': 389,\n    'iogonek': 278,\n    'Oacute': 722,\n    'oacute': 500,\n    'amacron': 500,\n    'sacute': 389,\n    'idieresis': 278,\n    'Ocircumflex': 722,\n    'Ugrave': 722,\n    'Delta': 612,\n    'thorn': 500,\n    'twosuperior': 300,\n    'Odieresis': 722,\n    'mu': 576,\n    'igrave': 278,\n    'ohungarumlaut': 500,\n    'Eogonek': 667,\n    'dcroat': 500,\n    'threequarters': 750,\n    'Scedilla': 556,\n    'lcaron': 382,\n    'Kcommaaccent': 667,\n    'Lacute': 611,\n    'trademark': 1000,\n    'edotaccent': 444,\n    'Igrave': 389,\n    'Imacron': 389,\n    'Lcaron': 611,\n    'onehalf': 750,\n    'lessequal': 549,\n    'ocircumflex': 500,\n    'ntilde': 556,\n    'Uhungarumlaut': 722,\n    'Eacute': 667,\n    'emacron': 444,\n    'gbreve': 500,\n    'onequarter': 750,\n    'Scaron': 556,\n    'Scommaaccent': 556,\n    'Ohungarumlaut': 722,\n    'degree': 400,\n    'ograve': 500,\n    'Ccaron': 667,\n    'ugrave': 556,\n    'radical': 549,\n    'Dcaron': 722,\n    'rcommaaccent': 389,\n    'Ntilde': 722,\n    'otilde': 500,\n    'Rcommaaccent': 667,\n    'Lcommaaccent': 611,\n    'Atilde': 667,\n    'Aogonek': 667,\n    'Aring': 667,\n    'Otilde': 722,\n    'zdotaccent': 389,\n    'Ecaron': 667,\n    'Iogonek': 389,\n    'kcommaaccent': 500,\n    'minus': 606,\n    'Icircumflex': 389,\n    'ncaron': 556,\n    'tcommaaccent': 278,\n    'logicalnot': 606,\n    'odieresis': 500,\n    'udieresis': 556,\n    'notequal': 549,\n    'gcommaaccent': 500,\n    'eth': 500,\n    'zcaron': 389,\n    'ncommaaccent': 556,\n    'onesuperior': 300,\n    'imacron': 278,\n    'Euro': 500\n  },\n  'Times-Italic': {\n    'space': 250,\n    'exclam': 333,\n    'quotedbl': 420,\n    'numbersign': 500,\n    'dollar': 500,\n    'percent': 833,\n    'ampersand': 778,\n    'quoteright': 333,\n    'parenleft': 333,\n    'parenright': 333,\n    'asterisk': 500,\n    'plus': 675,\n    'comma': 250,\n    'hyphen': 333,\n    'period': 250,\n    'slash': 278,\n    'zero': 500,\n    'one': 500,\n    'two': 500,\n    'three': 500,\n    'four': 500,\n    'five': 500,\n    'six': 500,\n    'seven': 500,\n    'eight': 500,\n    'nine': 500,\n    'colon': 333,\n    'semicolon': 333,\n    'less': 675,\n    'equal': 675,\n    'greater': 675,\n    'question': 500,\n    'at': 920,\n    'A': 611,\n    'B': 611,\n    'C': 667,\n    'D': 722,\n    'E': 611,\n    'F': 611,\n    'G': 722,\n    'H': 722,\n    'I': 333,\n    'J': 444,\n    'K': 667,\n    'L': 556,\n    'M': 833,\n    'N': 667,\n    'O': 722,\n    'P': 611,\n    'Q': 722,\n    'R': 611,\n    'S': 500,\n    'T': 556,\n    'U': 722,\n    'V': 611,\n    'W': 833,\n    'X': 611,\n    'Y': 556,\n    'Z': 556,\n    'bracketleft': 389,\n    'backslash': 278,\n    'bracketright': 389,\n    'asciicircum': 422,\n    'underscore': 500,\n    'quoteleft': 333,\n    'a': 500,\n    'b': 500,\n    'c': 444,\n    'd': 500,\n    'e': 444,\n    'f': 278,\n    'g': 500,\n    'h': 500,\n    'i': 278,\n    'j': 278,\n    'k': 444,\n    'l': 278,\n    'm': 722,\n    'n': 500,\n    'o': 500,\n    'p': 500,\n    'q': 500,\n    'r': 389,\n    's': 389,\n    't': 278,\n    'u': 500,\n    'v': 444,\n    'w': 667,\n    'x': 444,\n    'y': 444,\n    'z': 389,\n    'braceleft': 400,\n    'bar': 275,\n    'braceright': 400,\n    'asciitilde': 541,\n    'exclamdown': 389,\n    'cent': 500,\n    'sterling': 500,\n    'fraction': 167,\n    'yen': 500,\n    'florin': 500,\n    'section': 500,\n    'currency': 500,\n    'quotesingle': 214,\n    'quotedblleft': 556,\n    'guillemotleft': 500,\n    'guilsinglleft': 333,\n    'guilsinglright': 333,\n    'fi': 500,\n    'fl': 500,\n    'endash': 500,\n    'dagger': 500,\n    'daggerdbl': 500,\n    'periodcentered': 250,\n    'paragraph': 523,\n    'bullet': 350,\n    'quotesinglbase': 333,\n    'quotedblbase': 556,\n    'quotedblright': 556,\n    'guillemotright': 500,\n    'ellipsis': 889,\n    'perthousand': 1000,\n    'questiondown': 500,\n    'grave': 333,\n    'acute': 333,\n    'circumflex': 333,\n    'tilde': 333,\n    'macron': 333,\n    'breve': 333,\n    'dotaccent': 333,\n    'dieresis': 333,\n    'ring': 333,\n    'cedilla': 333,\n    'hungarumlaut': 333,\n    'ogonek': 333,\n    'caron': 333,\n    'emdash': 889,\n    'AE': 889,\n    'ordfeminine': 276,\n    'Lslash': 556,\n    'Oslash': 722,\n    'OE': 944,\n    'ordmasculine': 310,\n    'ae': 667,\n    'dotlessi': 278,\n    'lslash': 278,\n    'oslash': 500,\n    'oe': 667,\n    'germandbls': 500,\n    'Idieresis': 333,\n    'eacute': 444,\n    'abreve': 500,\n    'uhungarumlaut': 500,\n    'ecaron': 444,\n    'Ydieresis': 556,\n    'divide': 675,\n    'Yacute': 556,\n    'Acircumflex': 611,\n    'aacute': 500,\n    'Ucircumflex': 722,\n    'yacute': 444,\n    'scommaaccent': 389,\n    'ecircumflex': 444,\n    'Uring': 722,\n    'Udieresis': 722,\n    'aogonek': 500,\n    'Uacute': 722,\n    'uogonek': 500,\n    'Edieresis': 611,\n    'Dcroat': 722,\n    'commaaccent': 250,\n    'copyright': 760,\n    'Emacron': 611,\n    'ccaron': 444,\n    'aring': 500,\n    'Ncommaaccent': 667,\n    'lacute': 278,\n    'agrave': 500,\n    'Tcommaaccent': 556,\n    'Cacute': 667,\n    'atilde': 500,\n    'Edotaccent': 611,\n    'scaron': 389,\n    'scedilla': 389,\n    'iacute': 278,\n    'lozenge': 471,\n    'Rcaron': 611,\n    'Gcommaaccent': 722,\n    'ucircumflex': 500,\n    'acircumflex': 500,\n    'Amacron': 611,\n    'rcaron': 389,\n    'ccedilla': 444,\n    'Zdotaccent': 556,\n    'Thorn': 611,\n    'Omacron': 722,\n    'Racute': 611,\n    'Sacute': 500,\n    'dcaron': 544,\n    'Umacron': 722,\n    'uring': 500,\n    'threesuperior': 300,\n    'Ograve': 722,\n    'Agrave': 611,\n    'Abreve': 611,\n    'multiply': 675,\n    'uacute': 500,\n    'Tcaron': 556,\n    'partialdiff': 476,\n    'ydieresis': 444,\n    'Nacute': 667,\n    'icircumflex': 278,\n    'Ecircumflex': 611,\n    'adieresis': 500,\n    'edieresis': 444,\n    'cacute': 444,\n    'nacute': 500,\n    'umacron': 500,\n    'Ncaron': 667,\n    'Iacute': 333,\n    'plusminus': 675,\n    'brokenbar': 275,\n    'registered': 760,\n    'Gbreve': 722,\n    'Idotaccent': 333,\n    'summation': 600,\n    'Egrave': 611,\n    'racute': 389,\n    'omacron': 500,\n    'Zacute': 556,\n    'Zcaron': 556,\n    'greaterequal': 549,\n    'Eth': 722,\n    'Ccedilla': 667,\n    'lcommaaccent': 278,\n    'tcaron': 300,\n    'eogonek': 444,\n    'Uogonek': 722,\n    'Aacute': 611,\n    'Adieresis': 611,\n    'egrave': 444,\n    'zacute': 389,\n    'iogonek': 278,\n    'Oacute': 722,\n    'oacute': 500,\n    'amacron': 500,\n    'sacute': 389,\n    'idieresis': 278,\n    'Ocircumflex': 722,\n    'Ugrave': 722,\n    'Delta': 612,\n    'thorn': 500,\n    'twosuperior': 300,\n    'Odieresis': 722,\n    'mu': 500,\n    'igrave': 278,\n    'ohungarumlaut': 500,\n    'Eogonek': 611,\n    'dcroat': 500,\n    'threequarters': 750,\n    'Scedilla': 500,\n    'lcaron': 300,\n    'Kcommaaccent': 667,\n    'Lacute': 556,\n    'trademark': 980,\n    'edotaccent': 444,\n    'Igrave': 333,\n    'Imacron': 333,\n    'Lcaron': 611,\n    'onehalf': 750,\n    'lessequal': 549,\n    'ocircumflex': 500,\n    'ntilde': 500,\n    'Uhungarumlaut': 722,\n    'Eacute': 611,\n    'emacron': 444,\n    'gbreve': 500,\n    'onequarter': 750,\n    'Scaron': 500,\n    'Scommaaccent': 500,\n    'Ohungarumlaut': 722,\n    'degree': 400,\n    'ograve': 500,\n    'Ccaron': 667,\n    'ugrave': 500,\n    'radical': 453,\n    'Dcaron': 722,\n    'rcommaaccent': 389,\n    'Ntilde': 667,\n    'otilde': 500,\n    'Rcommaaccent': 611,\n    'Lcommaaccent': 556,\n    'Atilde': 611,\n    'Aogonek': 611,\n    'Aring': 611,\n    'Otilde': 722,\n    'zdotaccent': 389,\n    'Ecaron': 611,\n    'Iogonek': 333,\n    'kcommaaccent': 444,\n    'minus': 675,\n    'Icircumflex': 333,\n    'ncaron': 500,\n    'tcommaaccent': 278,\n    'logicalnot': 675,\n    'odieresis': 500,\n    'udieresis': 500,\n    'notequal': 549,\n    'gcommaaccent': 500,\n    'eth': 500,\n    'zcaron': 389,\n    'ncommaaccent': 500,\n    'onesuperior': 300,\n    'imacron': 278,\n    'Euro': 500\n  },\n  'ZapfDingbats': {\n    'space': 278,\n    'a1': 974,\n    'a2': 961,\n    'a202': 974,\n    'a3': 980,\n    'a4': 719,\n    'a5': 789,\n    'a119': 790,\n    'a118': 791,\n    'a117': 690,\n    'a11': 960,\n    'a12': 939,\n    'a13': 549,\n    'a14': 855,\n    'a15': 911,\n    'a16': 933,\n    'a105': 911,\n    'a17': 945,\n    'a18': 974,\n    'a19': 755,\n    'a20': 846,\n    'a21': 762,\n    'a22': 761,\n    'a23': 571,\n    'a24': 677,\n    'a25': 763,\n    'a26': 760,\n    'a27': 759,\n    'a28': 754,\n    'a6': 494,\n    'a7': 552,\n    'a8': 537,\n    'a9': 577,\n    'a10': 692,\n    'a29': 786,\n    'a30': 788,\n    'a31': 788,\n    'a32': 790,\n    'a33': 793,\n    'a34': 794,\n    'a35': 816,\n    'a36': 823,\n    'a37': 789,\n    'a38': 841,\n    'a39': 823,\n    'a40': 833,\n    'a41': 816,\n    'a42': 831,\n    'a43': 923,\n    'a44': 744,\n    'a45': 723,\n    'a46': 749,\n    'a47': 790,\n    'a48': 792,\n    'a49': 695,\n    'a50': 776,\n    'a51': 768,\n    'a52': 792,\n    'a53': 759,\n    'a54': 707,\n    'a55': 708,\n    'a56': 682,\n    'a57': 701,\n    'a58': 826,\n    'a59': 815,\n    'a60': 789,\n    'a61': 789,\n    'a62': 707,\n    'a63': 687,\n    'a64': 696,\n    'a65': 689,\n    'a66': 786,\n    'a67': 787,\n    'a68': 713,\n    'a69': 791,\n    'a70': 785,\n    'a71': 791,\n    'a72': 873,\n    'a73': 761,\n    'a74': 762,\n    'a203': 762,\n    'a75': 759,\n    'a204': 759,\n    'a76': 892,\n    'a77': 892,\n    'a78': 788,\n    'a79': 784,\n    'a81': 438,\n    'a82': 138,\n    'a83': 277,\n    'a84': 415,\n    'a97': 392,\n    'a98': 392,\n    'a99': 668,\n    'a100': 668,\n    'a89': 390,\n    'a90': 390,\n    'a93': 317,\n    'a94': 317,\n    'a91': 276,\n    'a92': 276,\n    'a205': 509,\n    'a85': 509,\n    'a206': 410,\n    'a86': 410,\n    'a87': 234,\n    'a88': 234,\n    'a95': 334,\n    'a96': 334,\n    'a101': 732,\n    'a102': 544,\n    'a103': 544,\n    'a104': 910,\n    'a106': 667,\n    'a107': 760,\n    'a108': 760,\n    'a112': 776,\n    'a111': 595,\n    'a110': 694,\n    'a109': 626,\n    'a120': 788,\n    'a121': 788,\n    'a122': 788,\n    'a123': 788,\n    'a124': 788,\n    'a125': 788,\n    'a126': 788,\n    'a127': 788,\n    'a128': 788,\n    'a129': 788,\n    'a130': 788,\n    'a131': 788,\n    'a132': 788,\n    'a133': 788,\n    'a134': 788,\n    'a135': 788,\n    'a136': 788,\n    'a137': 788,\n    'a138': 788,\n    'a139': 788,\n    'a140': 788,\n    'a141': 788,\n    'a142': 788,\n    'a143': 788,\n    'a144': 788,\n    'a145': 788,\n    'a146': 788,\n    'a147': 788,\n    'a148': 788,\n    'a149': 788,\n    'a150': 788,\n    'a151': 788,\n    'a152': 788,\n    'a153': 788,\n    'a154': 788,\n    'a155': 788,\n    'a156': 788,\n    'a157': 788,\n    'a158': 788,\n    'a159': 788,\n    'a160': 894,\n    'a161': 838,\n    'a163': 1016,\n    'a164': 458,\n    'a196': 748,\n    'a165': 924,\n    'a192': 748,\n    'a166': 918,\n    'a167': 927,\n    'a168': 928,\n    'a169': 928,\n    'a170': 834,\n    'a171': 873,\n    'a172': 828,\n    'a173': 924,\n    'a162': 924,\n    'a174': 917,\n    'a175': 930,\n    'a176': 931,\n    'a177': 463,\n    'a178': 883,\n    'a179': 836,\n    'a193': 836,\n    'a180': 867,\n    'a199': 867,\n    'a181': 696,\n    'a200': 696,\n    'a182': 874,\n    'a201': 874,\n    'a183': 760,\n    'a184': 946,\n    'a197': 771,\n    'a185': 865,\n    'a194': 771,\n    'a198': 888,\n    'a186': 967,\n    'a195': 888,\n    'a187': 831,\n    'a188': 873,\n    'a189': 927,\n    'a190': 970,\n    'a191': 918\n  }\n};\n\n\nvar EOF = {};\n\nfunction isEOF(v) {\n  return (v === EOF);\n}\n\nvar MAX_LENGTH_TO_CACHE = 1000;\n\nvar Parser = (function ParserClosure() {\n  function Parser(lexer, allowStreams, xref) {\n    this.lexer = lexer;\n    this.allowStreams = allowStreams;\n    this.xref = xref;\n    this.imageCache = {};\n    this.refill();\n  }\n\n  Parser.prototype = {\n    refill: function Parser_refill() {\n      this.buf1 = this.lexer.getObj();\n      this.buf2 = this.lexer.getObj();\n    },\n    shift: function Parser_shift() {\n      if (isCmd(this.buf2, 'ID')) {\n        this.buf1 = this.buf2;\n        this.buf2 = null;\n      } else {\n        this.buf1 = this.buf2;\n        this.buf2 = this.lexer.getObj();\n      }\n    },\n    getObj: function Parser_getObj(cipherTransform) {\n      var buf1 = this.buf1;\n      this.shift();\n\n      if (buf1 instanceof Cmd) {\n        switch (buf1.cmd) {\n          case 'BI': // inline image\n            return this.makeInlineImage(cipherTransform);\n          case '[': // array\n            var array = [];\n            while (!isCmd(this.buf1, ']') && !isEOF(this.buf1)) {\n              array.push(this.getObj(cipherTransform));\n            }\n            if (isEOF(this.buf1)) {\n              error('End of file inside array');\n            }\n            this.shift();\n            return array;\n          case '<<': // dictionary or stream\n            var dict = new Dict(this.xref);\n            while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) {\n              if (!isName(this.buf1)) {\n                info('Malformed dictionary: key must be a name object');\n                this.shift();\n                continue;\n              }\n\n              var key = this.buf1.name;\n              this.shift();\n              if (isEOF(this.buf1)) {\n                break;\n              }\n              dict.set(key, this.getObj(cipherTransform));\n            }\n            if (isEOF(this.buf1)) {\n              error('End of file inside dictionary');\n            }\n\n            // Stream objects are not allowed inside content streams or\n            // object streams.\n            if (isCmd(this.buf2, 'stream')) {\n              return (this.allowStreams ?\n                      this.makeStream(dict, cipherTransform) : dict);\n            }\n            this.shift();\n            return dict;\n          default: // simple object\n            return buf1;\n        }\n      }\n\n      if (isInt(buf1)) { // indirect reference or integer\n        var num = buf1;\n        if (isInt(this.buf1) && isCmd(this.buf2, 'R')) {\n          var ref = new Ref(num, this.buf1);\n          this.shift();\n          this.shift();\n          return ref;\n        }\n        return num;\n      }\n\n      if (isString(buf1)) { // string\n        var str = buf1;\n        if (cipherTransform) {\n          str = cipherTransform.decryptString(str);\n        }\n        return str;\n      }\n\n      // simple object\n      return buf1;\n    },\n    /**\n     * Find the end of the stream by searching for the /EI\\s/.\n     * @returns {number} The inline stream length.\n     */\n    findDefaultInlineStreamEnd:\n        function Parser_findDefaultInlineStreamEnd(stream) {\n      var E = 0x45, I = 0x49, SPACE = 0x20, LF = 0xA, CR = 0xD;\n      var startPos = stream.pos, state = 0, ch, i, n, followingBytes;\n      while ((ch = stream.getByte()) !== -1) {\n        if (state === 0) {\n          state = (ch === E) ? 1 : 0;\n        } else if (state === 1) {\n          state = (ch === I) ? 2 : 0;\n        } else {\n          assert(state === 2);\n          if (ch === SPACE || ch === LF || ch === CR) {\n            // Let's check the next five bytes are ASCII... just be sure.\n            n = 5;\n            followingBytes = stream.peekBytes(n);\n            for (i = 0; i < n; i++) {\n              ch = followingBytes[i];\n              if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7F)) {\n                // Not a LF, CR, SPACE or any visible ASCII character, i.e.\n                // it's binary stuff. Resetting the state.\n                state = 0;\n                break;\n              }\n            }\n            if (state === 2) {\n              break;  // Finished!\n            }\n          } else {\n            state = 0;\n          }\n        }\n      }\n      return ((stream.pos - 4) - startPos);\n    },\n    /**\n     * Find the EOI (end-of-image) marker 0xFFD9 of the stream.\n     * @returns {number} The inline stream length.\n     */\n    findDCTDecodeInlineStreamEnd:\n        function Parser_findDCTDecodeInlineStreamEnd(stream) {\n      var startPos = stream.pos, foundEOI = false, b, markerLength, length;\n      while ((b = stream.getByte()) !== -1) {\n        if (b !== 0xFF) { // Not a valid marker.\n          continue;\n        }\n        switch (stream.getByte()) {\n          case 0x00: // Byte stuffing.\n            // 0xFF00 appears to be a very common byte sequence in JPEG images.\n            break;\n\n          case 0xFF: // Fill byte.\n            // Avoid skipping a valid marker, resetting the stream position.\n            stream.skip(-1);\n            break;\n\n          case 0xD9: // EOI\n            foundEOI = true;\n            break;\n\n          case 0xC0: // SOF0\n          case 0xC1: // SOF1\n          case 0xC2: // SOF2\n          case 0xC3: // SOF3\n\n          case 0xC5: // SOF5\n          case 0xC6: // SOF6\n          case 0xC7: // SOF7\n\n          case 0xC9: // SOF9\n          case 0xCA: // SOF10\n          case 0xCB: // SOF11\n\n          case 0xCD: // SOF13\n          case 0xCE: // SOF14\n          case 0xCF: // SOF15\n\n          case 0xC4: // DHT\n          case 0xCC: // DAC\n\n          case 0xDA: // SOS\n          case 0xDB: // DQT\n          case 0xDC: // DNL\n          case 0xDD: // DRI\n          case 0xDE: // DHP\n          case 0xDF: // EXP\n\n          case 0xE0: // APP0\n          case 0xE1: // APP1\n          case 0xE2: // APP2\n          case 0xE3: // APP3\n          case 0xE4: // APP4\n          case 0xE5: // APP5\n          case 0xE6: // APP6\n          case 0xE7: // APP7\n          case 0xE8: // APP8\n          case 0xE9: // APP9\n          case 0xEA: // APP10\n          case 0xEB: // APP11\n          case 0xEC: // APP12\n          case 0xED: // APP13\n          case 0xEE: // APP14\n          case 0xEF: // APP15\n\n          case 0xFE: // COM\n            // The marker should be followed by the length of the segment.\n            markerLength = stream.getUint16();\n            if (markerLength > 2) {\n              // |markerLength| contains the byte length of the marker segment,\n              // including its own length (2 bytes) and excluding the marker.\n              stream.skip(markerLength - 2); // Jump to the next marker.\n            } else {\n              // The marker length is invalid, resetting the stream position.\n              stream.skip(-2);\n            }\n            break;\n        }\n        if (foundEOI) {\n          break;\n        }\n      }\n      length = stream.pos - startPos;\n      if (b === -1) {\n        warn('Inline DCTDecode image stream: ' +\n             'EOI marker not found, searching for /EI/ instead.');\n        stream.skip(-length); // Reset the stream position.\n        return this.findDefaultInlineStreamEnd(stream);\n      }\n      this.inlineStreamSkipEI(stream);\n      return length;\n    },\n    /**\n     * Find the EOD (end-of-data) marker '~>' (i.e. TILDE + GT) of the stream.\n     * @returns {number} The inline stream length.\n     */\n    findASCII85DecodeInlineStreamEnd:\n        function Parser_findASCII85DecodeInlineStreamEnd(stream) {\n      var TILDE = 0x7E, GT = 0x3E;\n      var startPos = stream.pos, ch, length;\n      while ((ch = stream.getByte()) !== -1) {\n        if (ch === TILDE && stream.peekByte() === GT) {\n          stream.skip();\n          break;\n        }\n      }\n      length = stream.pos - startPos;\n      if (ch === -1) {\n        warn('Inline ASCII85Decode image stream: ' +\n             'EOD marker not found, searching for /EI/ instead.');\n        stream.skip(-length); // Reset the stream position.\n        return this.findDefaultInlineStreamEnd(stream);\n      }\n      this.inlineStreamSkipEI(stream);\n      return length;\n    },\n    /**\n     * Find the EOD (end-of-data) marker '>' (i.e. GT) of the stream.\n     * @returns {number} The inline stream length.\n     */\n    findASCIIHexDecodeInlineStreamEnd:\n        function Parser_findASCIIHexDecodeInlineStreamEnd(stream) {\n      var GT = 0x3E;\n      var startPos = stream.pos, ch, length;\n      while ((ch = stream.getByte()) !== -1) {\n        if (ch === GT) {\n          break;\n        }\n      }\n      length = stream.pos - startPos;\n      if (ch === -1) {\n        warn('Inline ASCIIHexDecode image stream: ' +\n             'EOD marker not found, searching for /EI/ instead.');\n        stream.skip(-length); // Reset the stream position.\n        return this.findDefaultInlineStreamEnd(stream);\n      }\n      this.inlineStreamSkipEI(stream);\n      return length;\n    },\n    /**\n     * Skip over the /EI/ for streams where we search for an EOD marker.\n     */\n    inlineStreamSkipEI: function Parser_inlineStreamSkipEI(stream) {\n      var E = 0x45, I = 0x49;\n      var state = 0, ch;\n      while ((ch = stream.getByte()) !== -1) {\n        if (state === 0) {\n          state = (ch === E) ? 1 : 0;\n        } else if (state === 1) {\n          state = (ch === I) ? 2 : 0;\n        } else if (state === 2) {\n          break;\n        }\n      }\n    },\n    makeInlineImage: function Parser_makeInlineImage(cipherTransform) {\n      var lexer = this.lexer;\n      var stream = lexer.stream;\n\n      // Parse dictionary.\n      var dict = new Dict(null);\n      while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) {\n        if (!isName(this.buf1)) {\n          error('Dictionary key must be a name object');\n        }\n        var key = this.buf1.name;\n        this.shift();\n        if (isEOF(this.buf1)) {\n          break;\n        }\n        dict.set(key, this.getObj(cipherTransform));\n      }\n\n      // Extract the name of the first (i.e. the current) image filter.\n      var filter = this.fetchIfRef(dict.get('Filter', 'F')), filterName;\n      if (isName(filter)) {\n        filterName = filter.name;\n      } else if (isArray(filter) && isName(filter[0])) {\n        filterName = filter[0].name;\n      }\n\n      // Parse image stream.\n      var startPos = stream.pos, length, i, ii;\n      if (filterName === 'DCTDecode' || filterName === 'DCT') {\n        length = this.findDCTDecodeInlineStreamEnd(stream);\n      } else if (filterName === 'ASCII85Decide' || filterName === 'A85') {\n        length = this.findASCII85DecodeInlineStreamEnd(stream);\n      } else if (filterName === 'ASCIIHexDecode' || filterName === 'AHx') {\n        length = this.findASCIIHexDecodeInlineStreamEnd(stream);\n      } else {\n        length = this.findDefaultInlineStreamEnd(stream);\n      }\n      var imageStream = stream.makeSubStream(startPos, length, dict);\n\n      // Cache all images below the MAX_LENGTH_TO_CACHE threshold by their\n      // adler32 checksum.\n      var adler32;\n      if (length < MAX_LENGTH_TO_CACHE) {\n        var imageBytes = imageStream.getBytes();\n        imageStream.reset();\n\n        var a = 1;\n        var b = 0;\n        for (i = 0, ii = imageBytes.length; i < ii; ++i) {\n          // No modulo required in the loop if imageBytes.length < 5552.\n          a += imageBytes[i] & 0xff;\n          b += a;\n        }\n        adler32 = ((b % 65521) << 16) | (a % 65521);\n\n        if (this.imageCache.adler32 === adler32) {\n          this.buf2 = Cmd.get('EI');\n          this.shift();\n\n          this.imageCache[adler32].reset();\n          return this.imageCache[adler32];\n        }\n      }\n\n      if (cipherTransform) {\n        imageStream = cipherTransform.createStream(imageStream, length);\n      }\n\n      imageStream = this.filter(imageStream, dict, length);\n      imageStream.dict = dict;\n      if (adler32 !== undefined) {\n        imageStream.cacheKey = 'inline_' + length + '_' + adler32;\n        this.imageCache[adler32] = imageStream;\n      }\n\n      this.buf2 = Cmd.get('EI');\n      this.shift();\n\n      return imageStream;\n    },\n    fetchIfRef: function Parser_fetchIfRef(obj) {\n      // not relying on the xref.fetchIfRef -- xref might not be set\n      return (isRef(obj) ? this.xref.fetch(obj) : obj);\n    },\n    makeStream: function Parser_makeStream(dict, cipherTransform) {\n      var lexer = this.lexer;\n      var stream = lexer.stream;\n\n      // get stream start position\n      lexer.skipToNextLine();\n      var pos = stream.pos - 1;\n\n      // get length\n      var length = this.fetchIfRef(dict.get('Length'));\n      if (!isInt(length)) {\n        info('Bad ' + length + ' attribute in stream');\n        length = 0;\n      }\n\n      // skip over the stream data\n      stream.pos = pos + length;\n      lexer.nextChar();\n\n      this.shift(); // '>>'\n      this.shift(); // 'stream'\n      if (!isCmd(this.buf1, 'endstream')) {\n        // bad stream length, scanning for endstream\n        stream.pos = pos;\n        var SCAN_BLOCK_SIZE = 2048;\n        var ENDSTREAM_SIGNATURE_LENGTH = 9;\n        var ENDSTREAM_SIGNATURE = [0x65, 0x6E, 0x64, 0x73, 0x74, 0x72, 0x65,\n                                   0x61, 0x6D];\n        var skipped = 0, found = false, i, j;\n        while (stream.pos < stream.end) {\n          var scanBytes = stream.peekBytes(SCAN_BLOCK_SIZE);\n          var scanLength = scanBytes.length - ENDSTREAM_SIGNATURE_LENGTH;\n          if (scanLength <= 0) {\n            break;\n          }\n          found = false;\n          for (i = 0, j = 0; i < scanLength; i++) {\n            var b = scanBytes[i];\n            if (b !== ENDSTREAM_SIGNATURE[j]) {\n              i -= j;\n              j = 0;\n            } else {\n              j++;\n              if (j >= ENDSTREAM_SIGNATURE_LENGTH) {\n                i++;\n                found = true;\n                break;\n              }\n            }\n          }\n          if (found) {\n            skipped += i - ENDSTREAM_SIGNATURE_LENGTH;\n            stream.pos += i - ENDSTREAM_SIGNATURE_LENGTH;\n            break;\n          }\n          skipped += scanLength;\n          stream.pos += scanLength;\n        }\n        if (!found) {\n          error('Missing endstream');\n        }\n        length = skipped;\n\n        lexer.nextChar();\n        this.shift();\n        this.shift();\n      }\n      this.shift(); // 'endstream'\n\n      stream = stream.makeSubStream(pos, length, dict);\n      if (cipherTransform) {\n        stream = cipherTransform.createStream(stream, length);\n      }\n      stream = this.filter(stream, dict, length);\n      stream.dict = dict;\n      return stream;\n    },\n    filter: function Parser_filter(stream, dict, length) {\n      var filter = this.fetchIfRef(dict.get('Filter', 'F'));\n      var params = this.fetchIfRef(dict.get('DecodeParms', 'DP'));\n      if (isName(filter)) {\n        return this.makeFilter(stream, filter.name, length, params);\n      }\n\n      var maybeLength = length;\n      if (isArray(filter)) {\n        var filterArray = filter;\n        var paramsArray = params;\n        for (var i = 0, ii = filterArray.length; i < ii; ++i) {\n          filter = filterArray[i];\n          if (!isName(filter)) {\n            error('Bad filter name: ' + filter);\n          }\n\n          params = null;\n          if (isArray(paramsArray) && (i in paramsArray)) {\n            params = paramsArray[i];\n          }\n          stream = this.makeFilter(stream, filter.name, maybeLength, params);\n          // after the first stream the length variable is invalid\n          maybeLength = null;\n        }\n      }\n      return stream;\n    },\n    makeFilter: function Parser_makeFilter(stream, name, maybeLength, params) {\n      if (stream.dict.get('Length') === 0) {\n        return new NullStream(stream);\n      }\n      try {\n        if (params) {\n          params = this.fetchIfRef(params);\n        }\n        var xrefStreamStats = this.xref.stats.streamTypes;\n        if (name === 'FlateDecode' || name === 'Fl') {\n          xrefStreamStats[StreamType.FLATE] = true;\n          if (params) {\n            return new PredictorStream(new FlateStream(stream, maybeLength),\n                                       maybeLength, params);\n          }\n          return new FlateStream(stream, maybeLength);\n        }\n        if (name === 'LZWDecode' || name === 'LZW') {\n          xrefStreamStats[StreamType.LZW] = true;\n          var earlyChange = 1;\n          if (params) {\n            if (params.has('EarlyChange')) {\n              earlyChange = params.get('EarlyChange');\n            }\n            return new PredictorStream(\n              new LZWStream(stream, maybeLength, earlyChange),\n              maybeLength, params);\n          }\n          return new LZWStream(stream, maybeLength, earlyChange);\n        }\n        if (name === 'DCTDecode' || name === 'DCT') {\n          xrefStreamStats[StreamType.DCT] = true;\n          return new JpegStream(stream, maybeLength, stream.dict, this.xref);\n        }\n        if (name === 'JPXDecode' || name === 'JPX') {\n          xrefStreamStats[StreamType.JPX] = true;\n          return new JpxStream(stream, maybeLength, stream.dict);\n        }\n        if (name === 'ASCII85Decode' || name === 'A85') {\n          xrefStreamStats[StreamType.A85] = true;\n          return new Ascii85Stream(stream, maybeLength);\n        }\n        if (name === 'ASCIIHexDecode' || name === 'AHx') {\n          xrefStreamStats[StreamType.AHX] = true;\n          return new AsciiHexStream(stream, maybeLength);\n        }\n        if (name === 'CCITTFaxDecode' || name === 'CCF') {\n          xrefStreamStats[StreamType.CCF] = true;\n          return new CCITTFaxStream(stream, maybeLength, params);\n        }\n        if (name === 'RunLengthDecode' || name === 'RL') {\n          xrefStreamStats[StreamType.RL] = true;\n          return new RunLengthStream(stream, maybeLength);\n        }\n        if (name === 'JBIG2Decode') {\n          xrefStreamStats[StreamType.JBIG] = true;\n          return new Jbig2Stream(stream, maybeLength, stream.dict);\n        }\n        warn('filter \"' + name + '\" not supported yet');\n        return stream;\n      } catch (ex) {\n        if (ex instanceof MissingDataException) {\n          throw ex;\n        }\n        warn('Invalid stream: \\\"' + ex + '\\\"');\n        return new NullStream(stream);\n      }\n    }\n  };\n\n  return Parser;\n})();\n\nvar Lexer = (function LexerClosure() {\n  function Lexer(stream, knownCommands) {\n    this.stream = stream;\n    this.nextChar();\n\n    // While lexing, we build up many strings one char at a time. Using += for\n    // this can result in lots of garbage strings. It's better to build an\n    // array of single-char strings and then join() them together at the end.\n    // And reusing a single array (i.e. |this.strBuf|) over and over for this\n    // purpose uses less memory than using a new array for each string.\n    this.strBuf = [];\n\n    // The PDFs might have \"glued\" commands with other commands, operands or\n    // literals, e.g. \"q1\". The knownCommands is a dictionary of the valid\n    // commands and their prefixes. The prefixes are built the following way:\n    // if there a command that is a prefix of the other valid command or\n    // literal (e.g. 'f' and 'false') the following prefixes must be included,\n    // 'fa', 'fal', 'fals'. The prefixes are not needed, if the command has no\n    // other commands or literals as a prefix. The knowCommands is optional.\n    this.knownCommands = knownCommands;\n  }\n\n  Lexer.isSpace = function Lexer_isSpace(ch) {\n    // Space is one of the following characters: SPACE, TAB, CR or LF.\n    return (ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A);\n  };\n\n  // A '1' in this array means the character is white space. A '1' or\n  // '2' means the character ends a name or command.\n  var specialChars = [\n    1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x\n    1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0  // fx\n  ];\n\n  function toHexDigit(ch) {\n    if (ch >= 0x30 && ch <= 0x39) { // '0'-'9'\n      return ch & 0x0F;\n    }\n    if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) {\n      // 'A'-'F', 'a'-'f'\n      return (ch & 0x0F) + 9;\n    }\n    return -1;\n  }\n\n  Lexer.prototype = {\n    nextChar: function Lexer_nextChar() {\n      return (this.currentChar = this.stream.getByte());\n    },\n    peekChar: function Lexer_peekChar() {\n      return this.stream.peekByte();\n    },\n    getNumber: function Lexer_getNumber() {\n      var ch = this.currentChar;\n      var eNotation = false;\n      var divideBy = 0; // different from 0 if it's a floating point value\n      var sign = 1;\n\n      if (ch === 0x2D) { // '-'\n        sign = -1;\n        ch = this.nextChar();\n      } else if (ch === 0x2B) { // '+'\n        ch = this.nextChar();\n      }\n      if (ch === 0x2E) { // '.'\n        divideBy = 10;\n        ch = this.nextChar();\n      }\n      if (ch < 0x30 || ch > 0x39) { // '0' - '9'\n        error('Invalid number: ' + String.fromCharCode(ch));\n        return 0;\n      }\n\n      var baseValue = ch - 0x30; // '0'\n      var powerValue = 0;\n      var powerValueSign = 1;\n\n      while ((ch = this.nextChar()) >= 0) {\n        if (0x30 <= ch && ch <= 0x39) { // '0' - '9'\n          var currentDigit = ch - 0x30; // '0'\n          if (eNotation) { // We are after an 'e' or 'E'\n            powerValue = powerValue * 10 + currentDigit;\n          } else {\n            if (divideBy !== 0) { // We are after a point\n              divideBy *= 10;\n            }\n            baseValue = baseValue * 10 + currentDigit;\n          }\n        } else if (ch === 0x2E) { // '.'\n          if (divideBy === 0) {\n            divideBy = 1;\n          } else {\n            // A number can have only one '.'\n            break;\n          }\n        } else if (ch === 0x2D) { // '-'\n          // ignore minus signs in the middle of numbers to match\n          // Adobe's behavior\n          warn('Badly formated number');\n        } else if (ch === 0x45 || ch === 0x65) { // 'E', 'e'\n          // 'E' can be either a scientific notation or the beginning of a new\n          // operator\n          ch = this.peekChar();\n          if (ch === 0x2B || ch === 0x2D) { // '+', '-'\n            powerValueSign = (ch === 0x2D) ? -1 : 1;\n            this.nextChar(); // Consume the sign character\n          } else if (ch < 0x30 || ch > 0x39) { // '0' - '9'\n            // The 'E' must be the beginning of a new operator\n            break;\n          }\n          eNotation = true;\n        } else {\n          // the last character doesn't belong to us\n          break;\n        }\n      }\n\n      if (divideBy !== 0) {\n        baseValue /= divideBy;\n      }\n      if (eNotation) {\n        baseValue *= Math.pow(10, powerValueSign * powerValue);\n      }\n      return sign * baseValue;\n    },\n    getString: function Lexer_getString() {\n      var numParen = 1;\n      var done = false;\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n\n      var ch = this.nextChar();\n      while (true) {\n        var charBuffered = false;\n        switch (ch | 0) {\n          case -1:\n            warn('Unterminated string');\n            done = true;\n            break;\n          case 0x28: // '('\n            ++numParen;\n            strBuf.push('(');\n            break;\n          case 0x29: // ')'\n            if (--numParen === 0) {\n              this.nextChar(); // consume strings ')'\n              done = true;\n            } else {\n              strBuf.push(')');\n            }\n            break;\n          case 0x5C: // '\\\\'\n            ch = this.nextChar();\n            switch (ch) {\n              case -1:\n                warn('Unterminated string');\n                done = true;\n                break;\n              case 0x6E: // 'n'\n                strBuf.push('\\n');\n                break;\n              case 0x72: // 'r'\n                strBuf.push('\\r');\n                break;\n              case 0x74: // 't'\n                strBuf.push('\\t');\n                break;\n              case 0x62: // 'b'\n                strBuf.push('\\b');\n                break;\n              case 0x66: // 'f'\n                strBuf.push('\\f');\n                break;\n              case 0x5C: // '\\'\n              case 0x28: // '('\n              case 0x29: // ')'\n                strBuf.push(String.fromCharCode(ch));\n                break;\n              case 0x30: case 0x31: case 0x32: case 0x33: // '0'-'3'\n              case 0x34: case 0x35: case 0x36: case 0x37: // '4'-'7'\n                var x = ch & 0x0F;\n                ch = this.nextChar();\n                charBuffered = true;\n                if (ch >= 0x30 && ch <= 0x37) { // '0'-'7'\n                  x = (x << 3) + (ch & 0x0F);\n                  ch = this.nextChar();\n                  if (ch >= 0x30 && ch <= 0x37) {  // '0'-'7'\n                    charBuffered = false;\n                    x = (x << 3) + (ch & 0x0F);\n                  }\n                }\n                strBuf.push(String.fromCharCode(x));\n                break;\n              case 0x0D: // CR\n                if (this.peekChar() === 0x0A) { // LF\n                  this.nextChar();\n                }\n                break;\n              case 0x0A: // LF\n                break;\n              default:\n                strBuf.push(String.fromCharCode(ch));\n                break;\n            }\n            break;\n          default:\n            strBuf.push(String.fromCharCode(ch));\n            break;\n        }\n        if (done) {\n          break;\n        }\n        if (!charBuffered) {\n          ch = this.nextChar();\n        }\n      }\n      return strBuf.join('');\n    },\n    getName: function Lexer_getName() {\n      var ch;\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n      while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {\n        if (ch === 0x23) { // '#'\n          ch = this.nextChar();\n          var x = toHexDigit(ch);\n          if (x !== -1) {\n            var x2 = toHexDigit(this.nextChar());\n            if (x2 === -1) {\n              error('Illegal digit in hex char in name: ' + x2);\n            }\n            strBuf.push(String.fromCharCode((x << 4) | x2));\n          } else {\n            strBuf.push('#', String.fromCharCode(ch));\n          }\n        } else {\n          strBuf.push(String.fromCharCode(ch));\n        }\n      }\n      if (strBuf.length > 128) {\n        error('Warning: name token is longer than allowed by the spec: ' +\n              strBuf.length);\n      }\n      return Name.get(strBuf.join(''));\n    },\n    getHexString: function Lexer_getHexString() {\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n      var ch = this.currentChar;\n      var isFirstHex = true;\n      var firstDigit;\n      var secondDigit;\n      while (true) {\n        if (ch < 0) {\n          warn('Unterminated hex string');\n          break;\n        } else if (ch === 0x3E) { // '>'\n          this.nextChar();\n          break;\n        } else if (specialChars[ch] === 1) {\n          ch = this.nextChar();\n          continue;\n        } else {\n          if (isFirstHex) {\n            firstDigit = toHexDigit(ch);\n            if (firstDigit === -1) {\n              warn('Ignoring invalid character \"' + ch + '\" in hex string');\n              ch = this.nextChar();\n              continue;\n            }\n          } else {\n            secondDigit = toHexDigit(ch);\n            if (secondDigit === -1) {\n              warn('Ignoring invalid character \"' + ch + '\" in hex string');\n              ch = this.nextChar();\n              continue;\n            }\n            strBuf.push(String.fromCharCode((firstDigit << 4) | secondDigit));\n          }\n          isFirstHex = !isFirstHex;\n          ch = this.nextChar();\n        }\n      }\n      return strBuf.join('');\n    },\n    getObj: function Lexer_getObj() {\n      // skip whitespace and comments\n      var comment = false;\n      var ch = this.currentChar;\n      while (true) {\n        if (ch < 0) {\n          return EOF;\n        }\n        if (comment) {\n          if (ch === 0x0A || ch === 0x0D) { // LF, CR\n            comment = false;\n          }\n        } else if (ch === 0x25) { // '%'\n          comment = true;\n        } else if (specialChars[ch] !== 1) {\n          break;\n        }\n        ch = this.nextChar();\n      }\n\n      // start reading token\n      switch (ch | 0) {\n        case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: // '0'-'4'\n        case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: // '5'-'9'\n        case 0x2B: case 0x2D: case 0x2E: // '+', '-', '.'\n          return this.getNumber();\n        case 0x28: // '('\n          return this.getString();\n        case 0x2F: // '/'\n          return this.getName();\n        // array punctuation\n        case 0x5B: // '['\n          this.nextChar();\n          return Cmd.get('[');\n        case 0x5D: // ']'\n          this.nextChar();\n          return Cmd.get(']');\n        // hex string or dict punctuation\n        case 0x3C: // '<'\n          ch = this.nextChar();\n          if (ch === 0x3C) {\n            // dict punctuation\n            this.nextChar();\n            return Cmd.get('<<');\n          }\n          return this.getHexString();\n        // dict punctuation\n        case 0x3E: // '>'\n          ch = this.nextChar();\n          if (ch === 0x3E) {\n            this.nextChar();\n            return Cmd.get('>>');\n          }\n          return Cmd.get('>');\n        case 0x7B: // '{'\n          this.nextChar();\n          return Cmd.get('{');\n        case 0x7D: // '}'\n          this.nextChar();\n          return Cmd.get('}');\n        case 0x29: // ')'\n          error('Illegal character: ' + ch);\n          break;\n      }\n\n      // command\n      var str = String.fromCharCode(ch);\n      var knownCommands = this.knownCommands;\n      var knownCommandFound = knownCommands && knownCommands[str] !== undefined;\n      while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {\n        // stop if known command is found and next character does not make\n        // the str a command\n        var possibleCommand = str + String.fromCharCode(ch);\n        if (knownCommandFound && knownCommands[possibleCommand] === undefined) {\n          break;\n        }\n        if (str.length === 128) {\n          error('Command token too long: ' + str.length);\n        }\n        str = possibleCommand;\n        knownCommandFound = knownCommands && knownCommands[str] !== undefined;\n      }\n      if (str === 'true') {\n        return true;\n      }\n      if (str === 'false') {\n        return false;\n      }\n      if (str === 'null') {\n        return null;\n      }\n      return Cmd.get(str);\n    },\n    skipToNextLine: function Lexer_skipToNextLine() {\n      var ch = this.currentChar;\n      while (ch >= 0) {\n        if (ch === 0x0D) { // CR\n          ch = this.nextChar();\n          if (ch === 0x0A) { // LF\n            this.nextChar();\n          }\n          break;\n        } else if (ch === 0x0A) { // LF\n          this.nextChar();\n          break;\n        }\n        ch = this.nextChar();\n      }\n    }\n  };\n\n  return Lexer;\n})();\n\nvar Linearization = {\n  create: function LinearizationCreate(stream) {\n    function getInt(name, allowZeroValue) {\n      var obj = linDict.get(name);\n      if (isInt(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) {\n        return obj;\n      }\n      throw new Error('The \"' + name + '\" parameter in the linearization ' +\n                      'dictionary is invalid.');\n    }\n    function getHints() {\n      var hints = linDict.get('H'), hintsLength, item;\n      if (isArray(hints) &&\n          ((hintsLength = hints.length) === 2 || hintsLength === 4)) {\n        for (var index = 0; index < hintsLength; index++) {\n          if (!(isInt(item = hints[index]) && item > 0)) {\n            throw new Error('Hint (' + index +\n                            ') in the linearization dictionary is invalid.');\n          }\n        }\n        return hints;\n      }\n      throw new Error('Hint array in the linearization dictionary is invalid.');\n    }\n    var parser = new Parser(new Lexer(stream), false, null);\n    var obj1 = parser.getObj();\n    var obj2 = parser.getObj();\n    var obj3 = parser.getObj();\n    var linDict = parser.getObj();\n    var obj, length;\n    if (!(isInt(obj1) && isInt(obj2) && isCmd(obj3, 'obj') && isDict(linDict) &&\n          isNum(obj = linDict.get('Linearized')) && obj > 0)) {\n      return null; // No valid linearization dictionary found.\n    } else if ((length = getInt('L')) !== stream.length) {\n      throw new Error('The \"L\" parameter in the linearization dictionary ' +\n                      'does not equal the stream length.');\n    }\n    return {\n      length: length,\n      hints: getHints(),\n      objectNumberFirst: getInt('O'),\n      endFirst: getInt('E'),\n      numPages: getInt('N'),\n      mainXRefEntriesOffset: getInt('T'),\n      pageFirst: (linDict.has('P') ? getInt('P', true) : 0)\n    };\n  }\n};\n\n\nvar PostScriptParser = (function PostScriptParserClosure() {\n  function PostScriptParser(lexer) {\n    this.lexer = lexer;\n    this.operators = [];\n    this.token = null;\n    this.prev = null;\n  }\n  PostScriptParser.prototype = {\n    nextToken: function PostScriptParser_nextToken() {\n      this.prev = this.token;\n      this.token = this.lexer.getToken();\n    },\n    accept: function PostScriptParser_accept(type) {\n      if (this.token.type === type) {\n        this.nextToken();\n        return true;\n      }\n      return false;\n    },\n    expect: function PostScriptParser_expect(type) {\n      if (this.accept(type)) {\n        return true;\n      }\n      error('Unexpected symbol: found ' + this.token.type + ' expected ' +\n        type + '.');\n    },\n    parse: function PostScriptParser_parse() {\n      this.nextToken();\n      this.expect(PostScriptTokenTypes.LBRACE);\n      this.parseBlock();\n      this.expect(PostScriptTokenTypes.RBRACE);\n      return this.operators;\n    },\n    parseBlock: function PostScriptParser_parseBlock() {\n      while (true) {\n        if (this.accept(PostScriptTokenTypes.NUMBER)) {\n          this.operators.push(this.prev.value);\n        } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {\n          this.operators.push(this.prev.value);\n        } else if (this.accept(PostScriptTokenTypes.LBRACE)) {\n          this.parseCondition();\n        } else {\n          return;\n        }\n      }\n    },\n    parseCondition: function PostScriptParser_parseCondition() {\n      // Add two place holders that will be updated later\n      var conditionLocation = this.operators.length;\n      this.operators.push(null, null);\n\n      this.parseBlock();\n      this.expect(PostScriptTokenTypes.RBRACE);\n      if (this.accept(PostScriptTokenTypes.IF)) {\n        // The true block is right after the 'if' so it just falls through on\n        // true else it jumps and skips the true block.\n        this.operators[conditionLocation] = this.operators.length;\n        this.operators[conditionLocation + 1] = 'jz';\n      } else if (this.accept(PostScriptTokenTypes.LBRACE)) {\n        var jumpLocation = this.operators.length;\n        this.operators.push(null, null);\n        var endOfTrue = this.operators.length;\n        this.parseBlock();\n        this.expect(PostScriptTokenTypes.RBRACE);\n        this.expect(PostScriptTokenTypes.IFELSE);\n        // The jump is added at the end of the true block to skip the false\n        // block.\n        this.operators[jumpLocation] = this.operators.length;\n        this.operators[jumpLocation + 1] = 'j';\n\n        this.operators[conditionLocation] = endOfTrue;\n        this.operators[conditionLocation + 1] = 'jz';\n      } else {\n        error('PS Function: error parsing conditional.');\n      }\n    }\n  };\n  return PostScriptParser;\n})();\n\nvar PostScriptTokenTypes = {\n  LBRACE: 0,\n  RBRACE: 1,\n  NUMBER: 2,\n  OPERATOR: 3,\n  IF: 4,\n  IFELSE: 5\n};\n\nvar PostScriptToken = (function PostScriptTokenClosure() {\n  function PostScriptToken(type, value) {\n    this.type = type;\n    this.value = value;\n  }\n\n  var opCache = {};\n\n  PostScriptToken.getOperator = function PostScriptToken_getOperator(op) {\n    var opValue = opCache[op];\n    if (opValue) {\n      return opValue;\n    }\n    return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);\n  };\n\n  PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE,\n    '{');\n  PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE,\n    '}');\n  PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF');\n  PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE,\n    'IFELSE');\n  return PostScriptToken;\n})();\n\nvar PostScriptLexer = (function PostScriptLexerClosure() {\n  function PostScriptLexer(stream) {\n    this.stream = stream;\n    this.nextChar();\n\n    this.strBuf = [];\n  }\n  PostScriptLexer.prototype = {\n    nextChar: function PostScriptLexer_nextChar() {\n      return (this.currentChar = this.stream.getByte());\n    },\n    getToken: function PostScriptLexer_getToken() {\n      var comment = false;\n      var ch = this.currentChar;\n\n      // skip comments\n      while (true) {\n        if (ch < 0) {\n          return EOF;\n        }\n\n        if (comment) {\n          if (ch === 0x0A || ch === 0x0D) {\n            comment = false;\n          }\n        } else if (ch === 0x25) { // '%'\n          comment = true;\n        } else if (!Lexer.isSpace(ch)) {\n          break;\n        }\n        ch = this.nextChar();\n      }\n      switch (ch | 0) {\n        case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: // '0'-'4'\n        case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: // '5'-'9'\n        case 0x2B: case 0x2D: case 0x2E: // '+', '-', '.'\n          return new PostScriptToken(PostScriptTokenTypes.NUMBER,\n                                     this.getNumber());\n        case 0x7B: // '{'\n          this.nextChar();\n          return PostScriptToken.LBRACE;\n        case 0x7D: // '}'\n          this.nextChar();\n          return PostScriptToken.RBRACE;\n      }\n      // operator\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n      strBuf[0] = String.fromCharCode(ch);\n\n      while ((ch = this.nextChar()) >= 0 && // and 'A'-'Z', 'a'-'z'\n             ((ch >= 0x41 && ch <= 0x5A) || (ch >= 0x61 && ch <= 0x7A))) {\n        strBuf.push(String.fromCharCode(ch));\n      }\n      var str = strBuf.join('');\n      switch (str.toLowerCase()) {\n        case 'if':\n          return PostScriptToken.IF;\n        case 'ifelse':\n          return PostScriptToken.IFELSE;\n        default:\n          return PostScriptToken.getOperator(str);\n      }\n    },\n    getNumber: function PostScriptLexer_getNumber() {\n      var ch = this.currentChar;\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n      strBuf[0] = String.fromCharCode(ch);\n\n      while ((ch = this.nextChar()) >= 0) {\n        if ((ch >= 0x30 && ch <= 0x39) || // '0'-'9'\n            ch === 0x2D || ch === 0x2E) { // '-', '.'\n          strBuf.push(String.fromCharCode(ch));\n        } else {\n          break;\n        }\n      }\n      var value = parseFloat(strBuf.join(''));\n      if (isNaN(value)) {\n        error('Invalid floating point number: ' + value);\n      }\n      return value;\n    }\n  };\n  return PostScriptLexer;\n})();\n\n\nvar Stream = (function StreamClosure() {\n  function Stream(arrayBuffer, start, length, dict) {\n    this.bytes = (arrayBuffer instanceof Uint8Array ?\n                  arrayBuffer : new Uint8Array(arrayBuffer));\n    this.start = start || 0;\n    this.pos = this.start;\n    this.end = (start + length) || this.bytes.length;\n    this.dict = dict;\n  }\n\n  // required methods for a stream. if a particular stream does not\n  // implement these, an error should be thrown\n  Stream.prototype = {\n    get length() {\n      return this.end - this.start;\n    },\n    get isEmpty() {\n      return this.length === 0;\n    },\n    getByte: function Stream_getByte() {\n      if (this.pos >= this.end) {\n        return -1;\n      }\n      return this.bytes[this.pos++];\n    },\n    getUint16: function Stream_getUint16() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      if (b0 === -1 || b1 === -1) {\n        return -1;\n      }\n      return (b0 << 8) + b1;\n    },\n    getInt32: function Stream_getInt32() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      var b2 = this.getByte();\n      var b3 = this.getByte();\n      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n    },\n    // returns subarray of original buffer\n    // should only be read\n    getBytes: function Stream_getBytes(length) {\n      var bytes = this.bytes;\n      var pos = this.pos;\n      var strEnd = this.end;\n\n      if (!length) {\n        return bytes.subarray(pos, strEnd);\n      }\n      var end = pos + length;\n      if (end > strEnd) {\n        end = strEnd;\n      }\n      this.pos = end;\n      return bytes.subarray(pos, end);\n    },\n    peekByte: function Stream_peekByte() {\n      var peekedByte = this.getByte();\n      this.pos--;\n      return peekedByte;\n    },\n    peekBytes: function Stream_peekBytes(length) {\n      var bytes = this.getBytes(length);\n      this.pos -= bytes.length;\n      return bytes;\n    },\n    skip: function Stream_skip(n) {\n      if (!n) {\n        n = 1;\n      }\n      this.pos += n;\n    },\n    reset: function Stream_reset() {\n      this.pos = this.start;\n    },\n    moveStart: function Stream_moveStart() {\n      this.start = this.pos;\n    },\n    makeSubStream: function Stream_makeSubStream(start, length, dict) {\n      return new Stream(this.bytes.buffer, start, length, dict);\n    },\n    isStream: true\n  };\n\n  return Stream;\n})();\n\nvar StringStream = (function StringStreamClosure() {\n  function StringStream(str) {\n    var length = str.length;\n    var bytes = new Uint8Array(length);\n    for (var n = 0; n < length; ++n) {\n      bytes[n] = str.charCodeAt(n);\n    }\n    Stream.call(this, bytes);\n  }\n\n  StringStream.prototype = Stream.prototype;\n\n  return StringStream;\n})();\n\n// super class for the decoding streams\nvar DecodeStream = (function DecodeStreamClosure() {\n  // Lots of DecodeStreams are created whose buffers are never used.  For these\n  // we share a single empty buffer. This is (a) space-efficient and (b) avoids\n  // having special cases that would be required if we used |null| for an empty\n  // buffer.\n  var emptyBuffer = new Uint8Array(0);\n\n  function DecodeStream(maybeMinBufferLength) {\n    this.pos = 0;\n    this.bufferLength = 0;\n    this.eof = false;\n    this.buffer = emptyBuffer;\n    this.minBufferLength = 512;\n    if (maybeMinBufferLength) {\n      // Compute the first power of two that is as big as maybeMinBufferLength.\n      while (this.minBufferLength < maybeMinBufferLength) {\n        this.minBufferLength *= 2;\n      }\n    }\n  }\n\n  DecodeStream.prototype = {\n    get isEmpty() {\n      while (!this.eof && this.bufferLength === 0) {\n        this.readBlock();\n      }\n      return this.bufferLength === 0;\n    },\n    ensureBuffer: function DecodeStream_ensureBuffer(requested) {\n      var buffer = this.buffer;\n      if (requested <= buffer.byteLength) {\n        return buffer;\n      }\n      var size = this.minBufferLength;\n      while (size < requested) {\n        size *= 2;\n      }\n      var buffer2 = new Uint8Array(size);\n      buffer2.set(buffer);\n      return (this.buffer = buffer2);\n    },\n    getByte: function DecodeStream_getByte() {\n      var pos = this.pos;\n      while (this.bufferLength <= pos) {\n        if (this.eof) {\n          return -1;\n        }\n        this.readBlock();\n      }\n      return this.buffer[this.pos++];\n    },\n    getUint16: function DecodeStream_getUint16() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      if (b0 === -1 || b1 === -1) {\n        return -1;\n      }\n      return (b0 << 8) + b1;\n    },\n    getInt32: function DecodeStream_getInt32() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      var b2 = this.getByte();\n      var b3 = this.getByte();\n      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n    },\n    getBytes: function DecodeStream_getBytes(length) {\n      var end, pos = this.pos;\n\n      if (length) {\n        this.ensureBuffer(pos + length);\n        end = pos + length;\n\n        while (!this.eof && this.bufferLength < end) {\n          this.readBlock();\n        }\n        var bufEnd = this.bufferLength;\n        if (end > bufEnd) {\n          end = bufEnd;\n        }\n      } else {\n        while (!this.eof) {\n          this.readBlock();\n        }\n        end = this.bufferLength;\n      }\n\n      this.pos = end;\n      return this.buffer.subarray(pos, end);\n    },\n    peekByte: function DecodeStream_peekByte() {\n      var peekedByte = this.getByte();\n      this.pos--;\n      return peekedByte;\n    },\n    peekBytes: function DecodeStream_peekBytes(length) {\n      var bytes = this.getBytes(length);\n      this.pos -= bytes.length;\n      return bytes;\n    },\n    makeSubStream: function DecodeStream_makeSubStream(start, length, dict) {\n      var end = start + length;\n      while (this.bufferLength <= end && !this.eof) {\n        this.readBlock();\n      }\n      return new Stream(this.buffer, start, length, dict);\n    },\n    skip: function DecodeStream_skip(n) {\n      if (!n) {\n        n = 1;\n      }\n      this.pos += n;\n    },\n    reset: function DecodeStream_reset() {\n      this.pos = 0;\n    },\n    getBaseStreams: function DecodeStream_getBaseStreams() {\n      if (this.str && this.str.getBaseStreams) {\n        return this.str.getBaseStreams();\n      }\n      return [];\n    }\n  };\n\n  return DecodeStream;\n})();\n\nvar StreamsSequenceStream = (function StreamsSequenceStreamClosure() {\n  function StreamsSequenceStream(streams) {\n    this.streams = streams;\n    DecodeStream.call(this, /* maybeLength = */ null);\n  }\n\n  StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype);\n\n  StreamsSequenceStream.prototype.readBlock =\n      function streamSequenceStreamReadBlock() {\n\n    var streams = this.streams;\n    if (streams.length === 0) {\n      this.eof = true;\n      return;\n    }\n    var stream = streams.shift();\n    var chunk = stream.getBytes();\n    var bufferLength = this.bufferLength;\n    var newLength = bufferLength + chunk.length;\n    var buffer = this.ensureBuffer(newLength);\n    buffer.set(chunk, bufferLength);\n    this.bufferLength = newLength;\n  };\n\n  StreamsSequenceStream.prototype.getBaseStreams =\n    function StreamsSequenceStream_getBaseStreams() {\n\n    var baseStreams = [];\n    for (var i = 0, ii = this.streams.length; i < ii; i++) {\n      var stream = this.streams[i];\n      if (stream.getBaseStreams) {\n        Util.appendToArray(baseStreams, stream.getBaseStreams());\n      }\n    }\n    return baseStreams;\n  };\n\n  return StreamsSequenceStream;\n})();\n\nvar FlateStream = (function FlateStreamClosure() {\n  var codeLenCodeMap = new Int32Array([\n    16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15\n  ]);\n\n  var lengthDecode = new Int32Array([\n    0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a,\n    0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f,\n    0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073,\n    0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102\n  ]);\n\n  var distDecode = new Int32Array([\n    0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d,\n    0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1,\n    0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01,\n    0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001\n  ]);\n\n  var fixedLitCodeTab = [new Int32Array([\n    0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0,\n    0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0,\n    0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0,\n    0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0,\n    0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8,\n    0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8,\n    0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8,\n    0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8,\n    0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4,\n    0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4,\n    0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4,\n    0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4,\n    0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc,\n    0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec,\n    0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc,\n    0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc,\n    0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2,\n    0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2,\n    0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2,\n    0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2,\n    0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca,\n    0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea,\n    0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da,\n    0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa,\n    0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6,\n    0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6,\n    0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6,\n    0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6,\n    0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce,\n    0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee,\n    0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de,\n    0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe,\n    0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1,\n    0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1,\n    0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1,\n    0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1,\n    0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9,\n    0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9,\n    0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9,\n    0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9,\n    0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5,\n    0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5,\n    0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5,\n    0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5,\n    0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd,\n    0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed,\n    0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd,\n    0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd,\n    0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3,\n    0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3,\n    0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3,\n    0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3,\n    0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb,\n    0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb,\n    0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db,\n    0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb,\n    0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7,\n    0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7,\n    0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7,\n    0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7,\n    0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf,\n    0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef,\n    0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df,\n    0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff\n  ]), 9];\n\n  var fixedDistCodeTab = [new Int32Array([\n    0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c,\n    0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000,\n    0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d,\n    0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000\n  ]), 5];\n\n  function FlateStream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n\n    var cmf = str.getByte();\n    var flg = str.getByte();\n    if (cmf === -1 || flg === -1) {\n      error('Invalid header in flate stream: ' + cmf + ', ' + flg);\n    }\n    if ((cmf & 0x0f) !== 0x08) {\n      error('Unknown compression method in flate stream: ' + cmf + ', ' + flg);\n    }\n    if ((((cmf << 8) + flg) % 31) !== 0) {\n      error('Bad FCHECK in flate stream: ' + cmf + ', ' + flg);\n    }\n    if (flg & 0x20) {\n      error('FDICT bit set in flate stream: ' + cmf + ', ' + flg);\n    }\n\n    this.codeSize = 0;\n    this.codeBuf = 0;\n\n    DecodeStream.call(this, maybeLength);\n  }\n\n  FlateStream.prototype = Object.create(DecodeStream.prototype);\n\n  FlateStream.prototype.getBits = function FlateStream_getBits(bits) {\n    var str = this.str;\n    var codeSize = this.codeSize;\n    var codeBuf = this.codeBuf;\n\n    var b;\n    while (codeSize < bits) {\n      if ((b = str.getByte()) === -1) {\n        error('Bad encoding in flate stream');\n      }\n      codeBuf |= b << codeSize;\n      codeSize += 8;\n    }\n    b = codeBuf & ((1 << bits) - 1);\n    this.codeBuf = codeBuf >> bits;\n    this.codeSize = codeSize -= bits;\n\n    return b;\n  };\n\n  FlateStream.prototype.getCode = function FlateStream_getCode(table) {\n    var str = this.str;\n    var codes = table[0];\n    var maxLen = table[1];\n    var codeSize = this.codeSize;\n    var codeBuf = this.codeBuf;\n\n    var b;\n    while (codeSize < maxLen) {\n      if ((b = str.getByte()) === -1) {\n        // premature end of stream. code might however still be valid.\n        // codeSize < codeLen check below guards against incomplete codeVal.\n        break;\n      }\n      codeBuf |= (b << codeSize);\n      codeSize += 8;\n    }\n    var code = codes[codeBuf & ((1 << maxLen) - 1)];\n    var codeLen = code >> 16;\n    var codeVal = code & 0xffff;\n    if (codeLen < 1 || codeSize < codeLen) {\n      error('Bad encoding in flate stream');\n    }\n    this.codeBuf = (codeBuf >> codeLen);\n    this.codeSize = (codeSize - codeLen);\n    return codeVal;\n  };\n\n  FlateStream.prototype.generateHuffmanTable =\n      function flateStreamGenerateHuffmanTable(lengths) {\n    var n = lengths.length;\n\n    // find max code length\n    var maxLen = 0;\n    var i;\n    for (i = 0; i < n; ++i) {\n      if (lengths[i] > maxLen) {\n        maxLen = lengths[i];\n      }\n    }\n\n    // build the table\n    var size = 1 << maxLen;\n    var codes = new Int32Array(size);\n    for (var len = 1, code = 0, skip = 2;\n         len <= maxLen;\n         ++len, code <<= 1, skip <<= 1) {\n      for (var val = 0; val < n; ++val) {\n        if (lengths[val] === len) {\n          // bit-reverse the code\n          var code2 = 0;\n          var t = code;\n          for (i = 0; i < len; ++i) {\n            code2 = (code2 << 1) | (t & 1);\n            t >>= 1;\n          }\n\n          // fill the table entries\n          for (i = code2; i < size; i += skip) {\n            codes[i] = (len << 16) | val;\n          }\n          ++code;\n        }\n      }\n    }\n\n    return [codes, maxLen];\n  };\n\n  FlateStream.prototype.readBlock = function FlateStream_readBlock() {\n    var buffer, len;\n    var str = this.str;\n    // read block header\n    var hdr = this.getBits(3);\n    if (hdr & 1) {\n      this.eof = true;\n    }\n    hdr >>= 1;\n\n    if (hdr === 0) { // uncompressed block\n      var b;\n\n      if ((b = str.getByte()) === -1) {\n        error('Bad block header in flate stream');\n      }\n      var blockLen = b;\n      if ((b = str.getByte()) === -1) {\n        error('Bad block header in flate stream');\n      }\n      blockLen |= (b << 8);\n      if ((b = str.getByte()) === -1) {\n        error('Bad block header in flate stream');\n      }\n      var check = b;\n      if ((b = str.getByte()) === -1) {\n        error('Bad block header in flate stream');\n      }\n      check |= (b << 8);\n      if (check !== (~blockLen & 0xffff) &&\n          (blockLen !== 0 || check !== 0)) {\n        // Ignoring error for bad \"empty\" block (see issue 1277)\n        error('Bad uncompressed block length in flate stream');\n      }\n\n      this.codeBuf = 0;\n      this.codeSize = 0;\n\n      var bufferLength = this.bufferLength;\n      buffer = this.ensureBuffer(bufferLength + blockLen);\n      var end = bufferLength + blockLen;\n      this.bufferLength = end;\n      if (blockLen === 0) {\n        if (str.peekByte() === -1) {\n          this.eof = true;\n        }\n      } else {\n        for (var n = bufferLength; n < end; ++n) {\n          if ((b = str.getByte()) === -1) {\n            this.eof = true;\n            break;\n          }\n          buffer[n] = b;\n        }\n      }\n      return;\n    }\n\n    var litCodeTable;\n    var distCodeTable;\n    if (hdr === 1) { // compressed block, fixed codes\n      litCodeTable = fixedLitCodeTab;\n      distCodeTable = fixedDistCodeTab;\n    } else if (hdr === 2) { // compressed block, dynamic codes\n      var numLitCodes = this.getBits(5) + 257;\n      var numDistCodes = this.getBits(5) + 1;\n      var numCodeLenCodes = this.getBits(4) + 4;\n\n      // build the code lengths code table\n      var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);\n\n      var i;\n      for (i = 0; i < numCodeLenCodes; ++i) {\n        codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);\n      }\n      var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);\n\n      // build the literal and distance code tables\n      len = 0;\n      i = 0;\n      var codes = numLitCodes + numDistCodes;\n      var codeLengths = new Uint8Array(codes);\n      var bitsLength, bitsOffset, what;\n      while (i < codes) {\n        var code = this.getCode(codeLenCodeTab);\n        if (code === 16) {\n          bitsLength = 2; bitsOffset = 3; what = len;\n        } else if (code === 17) {\n          bitsLength = 3; bitsOffset = 3; what = (len = 0);\n        } else if (code === 18) {\n          bitsLength = 7; bitsOffset = 11; what = (len = 0);\n        } else {\n          codeLengths[i++] = len = code;\n          continue;\n        }\n\n        var repeatLength = this.getBits(bitsLength) + bitsOffset;\n        while (repeatLength-- > 0) {\n          codeLengths[i++] = what;\n        }\n      }\n\n      litCodeTable =\n        this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));\n      distCodeTable =\n        this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));\n    } else {\n      error('Unknown block type in flate stream');\n    }\n\n    buffer = this.buffer;\n    var limit = buffer ? buffer.length : 0;\n    var pos = this.bufferLength;\n    while (true) {\n      var code1 = this.getCode(litCodeTable);\n      if (code1 < 256) {\n        if (pos + 1 >= limit) {\n          buffer = this.ensureBuffer(pos + 1);\n          limit = buffer.length;\n        }\n        buffer[pos++] = code1;\n        continue;\n      }\n      if (code1 === 256) {\n        this.bufferLength = pos;\n        return;\n      }\n      code1 -= 257;\n      code1 = lengthDecode[code1];\n      var code2 = code1 >> 16;\n      if (code2 > 0) {\n        code2 = this.getBits(code2);\n      }\n      len = (code1 & 0xffff) + code2;\n      code1 = this.getCode(distCodeTable);\n      code1 = distDecode[code1];\n      code2 = code1 >> 16;\n      if (code2 > 0) {\n        code2 = this.getBits(code2);\n      }\n      var dist = (code1 & 0xffff) + code2;\n      if (pos + len >= limit) {\n        buffer = this.ensureBuffer(pos + len);\n        limit = buffer.length;\n      }\n      for (var k = 0; k < len; ++k, ++pos) {\n        buffer[pos] = buffer[pos - dist];\n      }\n    }\n  };\n\n  return FlateStream;\n})();\n\nvar PredictorStream = (function PredictorStreamClosure() {\n  function PredictorStream(str, maybeLength, params) {\n    var predictor = this.predictor = params.get('Predictor') || 1;\n\n    if (predictor <= 1) {\n      return str; // no prediction\n    }\n    if (predictor !== 2 && (predictor < 10 || predictor > 15)) {\n      error('Unsupported predictor: ' + predictor);\n    }\n\n    if (predictor === 2) {\n      this.readBlock = this.readBlockTiff;\n    } else {\n      this.readBlock = this.readBlockPng;\n    }\n\n    this.str = str;\n    this.dict = str.dict;\n\n    var colors = this.colors = params.get('Colors') || 1;\n    var bits = this.bits = params.get('BitsPerComponent') || 8;\n    var columns = this.columns = params.get('Columns') || 1;\n\n    this.pixBytes = (colors * bits + 7) >> 3;\n    this.rowBytes = (columns * colors * bits + 7) >> 3;\n\n    DecodeStream.call(this, maybeLength);\n    return this;\n  }\n\n  PredictorStream.prototype = Object.create(DecodeStream.prototype);\n\n  PredictorStream.prototype.readBlockTiff =\n      function predictorStreamReadBlockTiff() {\n    var rowBytes = this.rowBytes;\n\n    var bufferLength = this.bufferLength;\n    var buffer = this.ensureBuffer(bufferLength + rowBytes);\n\n    var bits = this.bits;\n    var colors = this.colors;\n\n    var rawBytes = this.str.getBytes(rowBytes);\n    this.eof = !rawBytes.length;\n    if (this.eof) {\n      return;\n    }\n\n    var inbuf = 0, outbuf = 0;\n    var inbits = 0, outbits = 0;\n    var pos = bufferLength;\n    var i;\n\n    if (bits === 1) {\n      for (i = 0; i < rowBytes; ++i) {\n        var c = rawBytes[i];\n        inbuf = (inbuf << 8) | c;\n        // bitwise addition is exclusive or\n        // first shift inbuf and then add\n        buffer[pos++] = (c ^ (inbuf >> colors)) & 0xFF;\n        // truncate inbuf (assumes colors < 16)\n        inbuf &= 0xFFFF;\n      }\n    } else if (bits === 8) {\n      for (i = 0; i < colors; ++i) {\n        buffer[pos++] = rawBytes[i];\n      }\n      for (; i < rowBytes; ++i) {\n        buffer[pos] = buffer[pos - colors] + rawBytes[i];\n        pos++;\n      }\n    } else {\n      var compArray = new Uint8Array(colors + 1);\n      var bitMask = (1 << bits) - 1;\n      var j = 0, k = bufferLength;\n      var columns = this.columns;\n      for (i = 0; i < columns; ++i) {\n        for (var kk = 0; kk < colors; ++kk) {\n          if (inbits < bits) {\n            inbuf = (inbuf << 8) | (rawBytes[j++] & 0xFF);\n            inbits += 8;\n          }\n          compArray[kk] = (compArray[kk] +\n                           (inbuf >> (inbits - bits))) & bitMask;\n          inbits -= bits;\n          outbuf = (outbuf << bits) | compArray[kk];\n          outbits += bits;\n          if (outbits >= 8) {\n            buffer[k++] = (outbuf >> (outbits - 8)) & 0xFF;\n            outbits -= 8;\n          }\n        }\n      }\n      if (outbits > 0) {\n        buffer[k++] = (outbuf << (8 - outbits)) +\n                      (inbuf & ((1 << (8 - outbits)) - 1));\n      }\n    }\n    this.bufferLength += rowBytes;\n  };\n\n  PredictorStream.prototype.readBlockPng =\n      function predictorStreamReadBlockPng() {\n\n    var rowBytes = this.rowBytes;\n    var pixBytes = this.pixBytes;\n\n    var predictor = this.str.getByte();\n    var rawBytes = this.str.getBytes(rowBytes);\n    this.eof = !rawBytes.length;\n    if (this.eof) {\n      return;\n    }\n\n    var bufferLength = this.bufferLength;\n    var buffer = this.ensureBuffer(bufferLength + rowBytes);\n\n    var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);\n    if (prevRow.length === 0) {\n      prevRow = new Uint8Array(rowBytes);\n    }\n\n    var i, j = bufferLength, up, c;\n    switch (predictor) {\n      case 0:\n        for (i = 0; i < rowBytes; ++i) {\n          buffer[j++] = rawBytes[i];\n        }\n        break;\n      case 1:\n        for (i = 0; i < pixBytes; ++i) {\n          buffer[j++] = rawBytes[i];\n        }\n        for (; i < rowBytes; ++i) {\n          buffer[j] = (buffer[j - pixBytes] + rawBytes[i]) & 0xFF;\n          j++;\n        }\n        break;\n      case 2:\n        for (i = 0; i < rowBytes; ++i) {\n          buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xFF;\n        }\n        break;\n      case 3:\n        for (i = 0; i < pixBytes; ++i) {\n          buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];\n        }\n        for (; i < rowBytes; ++i) {\n          buffer[j] = (((prevRow[i] + buffer[j - pixBytes]) >> 1) +\n                           rawBytes[i]) & 0xFF;\n          j++;\n        }\n        break;\n      case 4:\n        // we need to save the up left pixels values. the simplest way\n        // is to create a new buffer\n        for (i = 0; i < pixBytes; ++i) {\n          up = prevRow[i];\n          c = rawBytes[i];\n          buffer[j++] = up + c;\n        }\n        for (; i < rowBytes; ++i) {\n          up = prevRow[i];\n          var upLeft = prevRow[i - pixBytes];\n          var left = buffer[j - pixBytes];\n          var p = left + up - upLeft;\n\n          var pa = p - left;\n          if (pa < 0) {\n            pa = -pa;\n          }\n          var pb = p - up;\n          if (pb < 0) {\n            pb = -pb;\n          }\n          var pc = p - upLeft;\n          if (pc < 0) {\n            pc = -pc;\n          }\n\n          c = rawBytes[i];\n          if (pa <= pb && pa <= pc) {\n            buffer[j++] = left + c;\n          } else if (pb <= pc) {\n            buffer[j++] = up + c;\n          } else {\n            buffer[j++] = upLeft + c;\n          }\n        }\n        break;\n      default:\n        error('Unsupported predictor: ' + predictor);\n    }\n    this.bufferLength += rowBytes;\n  };\n\n  return PredictorStream;\n})();\n\n/**\n * Depending on the type of JPEG a JpegStream is handled in different ways. For\n * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image\n * data is stored and then loaded by the browser.  For unsupported JPEG's we use\n * a library to decode these images and the stream behaves like all the other\n * DecodeStreams.\n */\nvar JpegStream = (function JpegStreamClosure() {\n  function JpegStream(stream, maybeLength, dict, xref) {\n    // Some images may contain 'junk' before the SOI (start-of-image) marker.\n    // Note: this seems to mainly affect inline images.\n    var ch;\n    while ((ch = stream.getByte()) !== -1) {\n      if (ch === 0xFF) { // Find the first byte of the SOI marker (0xFFD8).\n        stream.skip(-1); // Reset the stream position to the SOI.\n        break;\n      }\n    }\n    this.stream = stream;\n    this.maybeLength = maybeLength;\n    this.dict = dict;\n\n    DecodeStream.call(this, maybeLength);\n  }\n\n  JpegStream.prototype = Object.create(DecodeStream.prototype);\n\n  Object.defineProperty(JpegStream.prototype, 'bytes', {\n    get: function JpegStream_bytes() {\n      // If this.maybeLength is null, we'll get the entire stream.\n      return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength));\n    },\n    configurable: true\n  });\n\n  JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) {\n    if (this.bufferLength) {\n      return;\n    }\n    try {\n      var jpegImage = new JpegImage();\n\n      // checking if values needs to be transformed before conversion\n      if (this.forceRGB && this.dict && isArray(this.dict.get('Decode'))) {\n        var decodeArr = this.dict.get('Decode');\n        var bitsPerComponent = this.dict.get('BitsPerComponent') || 8;\n        var decodeArrLength = decodeArr.length;\n        var transform = new Int32Array(decodeArrLength);\n        var transformNeeded = false;\n        var maxValue = (1 << bitsPerComponent) - 1;\n        for (var i = 0; i < decodeArrLength; i += 2) {\n          transform[i] = ((decodeArr[i + 1] - decodeArr[i]) * 256) | 0;\n          transform[i + 1] = (decodeArr[i] * maxValue) | 0;\n          if (transform[i] !== 256 || transform[i + 1] !== 0) {\n            transformNeeded = true;\n          }\n        }\n        if (transformNeeded) {\n          jpegImage.decodeTransform = transform;\n        }\n      }\n\n      jpegImage.parse(this.bytes);\n      var data = jpegImage.getData(this.drawWidth, this.drawHeight,\n                                   this.forceRGB);\n      this.buffer = data;\n      this.bufferLength = data.length;\n      this.eof = true;\n    } catch (e) {\n      error('JPEG error: ' + e);\n    }\n  };\n\n  JpegStream.prototype.getBytes = function JpegStream_getBytes(length) {\n    this.ensureBuffer();\n    return this.buffer;\n  };\n\n  JpegStream.prototype.getIR = function JpegStream_getIR() {\n    return PDFJS.createObjectURL(this.bytes, 'image/jpeg');\n  };\n  /**\n   * Checks if the image can be decoded and displayed by the browser without any\n   * further processing such as color space conversions.\n   */\n  JpegStream.prototype.isNativelySupported =\n      function JpegStream_isNativelySupported(xref, res) {\n    var cs = ColorSpace.parse(this.dict.get('ColorSpace', 'CS'), xref, res);\n    return cs.name === 'DeviceGray' || cs.name === 'DeviceRGB';\n  };\n  /**\n   * Checks if the image can be decoded by the browser.\n   */\n  JpegStream.prototype.isNativelyDecodable =\n      function JpegStream_isNativelyDecodable(xref, res) {\n    var cs = ColorSpace.parse(this.dict.get('ColorSpace', 'CS'), xref, res);\n    var numComps = cs.numComps;\n    return numComps === 1 || numComps === 3;\n  };\n\n  return JpegStream;\n})();\n\n/**\n * For JPEG 2000's we use a library to decode these images and\n * the stream behaves like all the other DecodeStreams.\n */\nvar JpxStream = (function JpxStreamClosure() {\n  function JpxStream(stream, maybeLength, dict) {\n    this.stream = stream;\n    this.maybeLength = maybeLength;\n    this.dict = dict;\n\n    DecodeStream.call(this, maybeLength);\n  }\n\n  JpxStream.prototype = Object.create(DecodeStream.prototype);\n\n  Object.defineProperty(JpxStream.prototype, 'bytes', {\n    get: function JpxStream_bytes() {\n      // If this.maybeLength is null, we'll get the entire stream.\n      return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength));\n    },\n    configurable: true\n  });\n\n  JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) {\n    if (this.bufferLength) {\n      return;\n    }\n\n    var jpxImage = new JpxImage();\n    jpxImage.parse(this.bytes);\n\n    var width = jpxImage.width;\n    var height = jpxImage.height;\n    var componentsCount = jpxImage.componentsCount;\n    var tileCount = jpxImage.tiles.length;\n    if (tileCount === 1) {\n      this.buffer = jpxImage.tiles[0].items;\n    } else {\n      var data = new Uint8Array(width * height * componentsCount);\n\n      for (var k = 0; k < tileCount; k++) {\n        var tileComponents = jpxImage.tiles[k];\n        var tileWidth = tileComponents.width;\n        var tileHeight = tileComponents.height;\n        var tileLeft = tileComponents.left;\n        var tileTop = tileComponents.top;\n\n        var src = tileComponents.items;\n        var srcPosition = 0;\n        var dataPosition = (width * tileTop + tileLeft) * componentsCount;\n        var imgRowSize = width * componentsCount;\n        var tileRowSize = tileWidth * componentsCount;\n\n        for (var j = 0; j < tileHeight; j++) {\n          var rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize);\n          data.set(rowBytes, dataPosition);\n          srcPosition += tileRowSize;\n          dataPosition += imgRowSize;\n        }\n      }\n      this.buffer = data;\n    }\n    this.bufferLength = this.buffer.length;\n    this.eof = true;\n  };\n\n  return JpxStream;\n})();\n\n/**\n * For JBIG2's we use a library to decode these images and\n * the stream behaves like all the other DecodeStreams.\n */\nvar Jbig2Stream = (function Jbig2StreamClosure() {\n  function Jbig2Stream(stream, maybeLength, dict) {\n    this.stream = stream;\n    this.maybeLength = maybeLength;\n    this.dict = dict;\n\n    DecodeStream.call(this, maybeLength);\n  }\n\n  Jbig2Stream.prototype = Object.create(DecodeStream.prototype);\n\n  Object.defineProperty(Jbig2Stream.prototype, 'bytes', {\n    get: function Jbig2Stream_bytes() {\n      // If this.maybeLength is null, we'll get the entire stream.\n      return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength));\n    },\n    configurable: true\n  });\n\n  Jbig2Stream.prototype.ensureBuffer = function Jbig2Stream_ensureBuffer(req) {\n    if (this.bufferLength) {\n      return;\n    }\n\n    var jbig2Image = new Jbig2Image();\n\n    var chunks = [], xref = this.dict.xref;\n    var decodeParams = xref.fetchIfRef(this.dict.get('DecodeParms'));\n\n    // According to the PDF specification, DecodeParms can be either\n    // a dictionary, or an array whose elements are dictionaries.\n    if (isArray(decodeParams)) {\n      if (decodeParams.length > 1) {\n        warn('JBIG2 - \\'DecodeParms\\' array with multiple elements ' +\n             'not supported.');\n      }\n      decodeParams = xref.fetchIfRef(decodeParams[0]);\n    }\n    if (decodeParams && decodeParams.has('JBIG2Globals')) {\n      var globalsStream = decodeParams.get('JBIG2Globals');\n      var globals = globalsStream.getBytes();\n      chunks.push({data: globals, start: 0, end: globals.length});\n    }\n    chunks.push({data: this.bytes, start: 0, end: this.bytes.length});\n    var data = jbig2Image.parseChunks(chunks);\n    var dataLength = data.length;\n\n    // JBIG2 had black as 1 and white as 0, inverting the colors\n    for (var i = 0; i < dataLength; i++) {\n      data[i] ^= 0xFF;\n    }\n\n    this.buffer = data;\n    this.bufferLength = dataLength;\n    this.eof = true;\n  };\n\n  return Jbig2Stream;\n})();\n\nvar DecryptStream = (function DecryptStreamClosure() {\n  function DecryptStream(str, maybeLength, decrypt) {\n    this.str = str;\n    this.dict = str.dict;\n    this.decrypt = decrypt;\n    this.nextChunk = null;\n    this.initialized = false;\n\n    DecodeStream.call(this, maybeLength);\n  }\n\n  var chunkSize = 512;\n\n  DecryptStream.prototype = Object.create(DecodeStream.prototype);\n\n  DecryptStream.prototype.readBlock = function DecryptStream_readBlock() {\n    var chunk;\n    if (this.initialized) {\n      chunk = this.nextChunk;\n    } else {\n      chunk = this.str.getBytes(chunkSize);\n      this.initialized = true;\n    }\n    if (!chunk || chunk.length === 0) {\n      this.eof = true;\n      return;\n    }\n    this.nextChunk = this.str.getBytes(chunkSize);\n    var hasMoreData = this.nextChunk && this.nextChunk.length > 0;\n\n    var decrypt = this.decrypt;\n    chunk = decrypt(chunk, !hasMoreData);\n\n    var bufferLength = this.bufferLength;\n    var i, n = chunk.length;\n    var buffer = this.ensureBuffer(bufferLength + n);\n    for (i = 0; i < n; i++) {\n      buffer[bufferLength++] = chunk[i];\n    }\n    this.bufferLength = bufferLength;\n  };\n\n  return DecryptStream;\n})();\n\nvar Ascii85Stream = (function Ascii85StreamClosure() {\n  function Ascii85Stream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n    this.input = new Uint8Array(5);\n\n    // Most streams increase in size when decoded, but Ascii85 streams\n    // typically shrink by ~20%.\n    if (maybeLength) {\n      maybeLength = 0.8 * maybeLength;\n    }\n    DecodeStream.call(this, maybeLength);\n  }\n\n  Ascii85Stream.prototype = Object.create(DecodeStream.prototype);\n\n  Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() {\n    var TILDA_CHAR = 0x7E; // '~'\n    var Z_LOWER_CHAR = 0x7A; // 'z'\n    var EOF = -1;\n\n    var str = this.str;\n\n    var c = str.getByte();\n    while (Lexer.isSpace(c)) {\n      c = str.getByte();\n    }\n\n    if (c === EOF || c === TILDA_CHAR) {\n      this.eof = true;\n      return;\n    }\n\n    var bufferLength = this.bufferLength, buffer;\n    var i;\n\n    // special code for z\n    if (c === Z_LOWER_CHAR) {\n      buffer = this.ensureBuffer(bufferLength + 4);\n      for (i = 0; i < 4; ++i) {\n        buffer[bufferLength + i] = 0;\n      }\n      this.bufferLength += 4;\n    } else {\n      var input = this.input;\n      input[0] = c;\n      for (i = 1; i < 5; ++i) {\n        c = str.getByte();\n        while (Lexer.isSpace(c)) {\n          c = str.getByte();\n        }\n\n        input[i] = c;\n\n        if (c === EOF || c === TILDA_CHAR) {\n          break;\n        }\n      }\n      buffer = this.ensureBuffer(bufferLength + i - 1);\n      this.bufferLength += i - 1;\n\n      // partial ending;\n      if (i < 5) {\n        for (; i < 5; ++i) {\n          input[i] = 0x21 + 84;\n        }\n        this.eof = true;\n      }\n      var t = 0;\n      for (i = 0; i < 5; ++i) {\n        t = t * 85 + (input[i] - 0x21);\n      }\n\n      for (i = 3; i >= 0; --i) {\n        buffer[bufferLength + i] = t & 0xFF;\n        t >>= 8;\n      }\n    }\n  };\n\n  return Ascii85Stream;\n})();\n\nvar AsciiHexStream = (function AsciiHexStreamClosure() {\n  function AsciiHexStream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n\n    this.firstDigit = -1;\n\n    // Most streams increase in size when decoded, but AsciiHex streams shrink\n    // by 50%.\n    if (maybeLength) {\n      maybeLength = 0.5 * maybeLength;\n    }\n    DecodeStream.call(this, maybeLength);\n  }\n\n  AsciiHexStream.prototype = Object.create(DecodeStream.prototype);\n\n  AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() {\n    var UPSTREAM_BLOCK_SIZE = 8000;\n    var bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE);\n    if (!bytes.length) {\n      this.eof = true;\n      return;\n    }\n\n    var maxDecodeLength = (bytes.length + 1) >> 1;\n    var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength);\n    var bufferLength = this.bufferLength;\n\n    var firstDigit = this.firstDigit;\n    for (var i = 0, ii = bytes.length; i < ii; i++) {\n      var ch = bytes[i], digit;\n      if (ch >= 0x30 && ch <= 0x39) { // '0'-'9'\n        digit = ch & 0x0F;\n      } else if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) {\n        // 'A'-'Z', 'a'-'z'\n        digit = (ch & 0x0F) + 9;\n      } else if (ch === 0x3E) { // '>'\n        this.eof = true;\n        break;\n      } else { // probably whitespace\n        continue; // ignoring\n      }\n      if (firstDigit < 0) {\n        firstDigit = digit;\n      } else {\n        buffer[bufferLength++] = (firstDigit << 4) | digit;\n        firstDigit = -1;\n      }\n    }\n    if (firstDigit >= 0 && this.eof) {\n      // incomplete byte\n      buffer[bufferLength++] = (firstDigit << 4);\n      firstDigit = -1;\n    }\n    this.firstDigit = firstDigit;\n    this.bufferLength = bufferLength;\n  };\n\n  return AsciiHexStream;\n})();\n\nvar RunLengthStream = (function RunLengthStreamClosure() {\n  function RunLengthStream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n\n    DecodeStream.call(this, maybeLength);\n  }\n\n  RunLengthStream.prototype = Object.create(DecodeStream.prototype);\n\n  RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() {\n    // The repeatHeader has following format. The first byte defines type of run\n    // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes\n    // (in addition to the second byte from the header), n = 129 through 255 -\n    // duplicate the second byte from the header (257 - n) times, n = 128 - end.\n    var repeatHeader = this.str.getBytes(2);\n    if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) {\n      this.eof = true;\n      return;\n    }\n\n    var buffer;\n    var bufferLength = this.bufferLength;\n    var n = repeatHeader[0];\n    if (n < 128) {\n      // copy n bytes\n      buffer = this.ensureBuffer(bufferLength + n + 1);\n      buffer[bufferLength++] = repeatHeader[1];\n      if (n > 0) {\n        var source = this.str.getBytes(n);\n        buffer.set(source, bufferLength);\n        bufferLength += n;\n      }\n    } else {\n      n = 257 - n;\n      var b = repeatHeader[1];\n      buffer = this.ensureBuffer(bufferLength + n + 1);\n      for (var i = 0; i < n; i++) {\n        buffer[bufferLength++] = b;\n      }\n    }\n    this.bufferLength = bufferLength;\n  };\n\n  return RunLengthStream;\n})();\n\nvar CCITTFaxStream = (function CCITTFaxStreamClosure() {\n\n  var ccittEOL = -2;\n  var twoDimPass = 0;\n  var twoDimHoriz = 1;\n  var twoDimVert0 = 2;\n  var twoDimVertR1 = 3;\n  var twoDimVertL1 = 4;\n  var twoDimVertR2 = 5;\n  var twoDimVertL2 = 6;\n  var twoDimVertR3 = 7;\n  var twoDimVertL3 = 8;\n\n  var twoDimTable = [\n    [-1, -1], [-1, -1],                   // 000000x\n    [7, twoDimVertL3],                    // 0000010\n    [7, twoDimVertR3],                    // 0000011\n    [6, twoDimVertL2], [6, twoDimVertL2], // 000010x\n    [6, twoDimVertR2], [6, twoDimVertR2], // 000011x\n    [4, twoDimPass], [4, twoDimPass],     // 0001xxx\n    [4, twoDimPass], [4, twoDimPass],\n    [4, twoDimPass], [4, twoDimPass],\n    [4, twoDimPass], [4, twoDimPass],\n    [3, twoDimHoriz], [3, twoDimHoriz],   // 001xxxx\n    [3, twoDimHoriz], [3, twoDimHoriz],\n    [3, twoDimHoriz], [3, twoDimHoriz],\n    [3, twoDimHoriz], [3, twoDimHoriz],\n    [3, twoDimHoriz], [3, twoDimHoriz],\n    [3, twoDimHoriz], [3, twoDimHoriz],\n    [3, twoDimHoriz], [3, twoDimHoriz],\n    [3, twoDimHoriz], [3, twoDimHoriz],\n    [3, twoDimVertL1], [3, twoDimVertL1], // 010xxxx\n    [3, twoDimVertL1], [3, twoDimVertL1],\n    [3, twoDimVertL1], [3, twoDimVertL1],\n    [3, twoDimVertL1], [3, twoDimVertL1],\n    [3, twoDimVertL1], [3, twoDimVertL1],\n    [3, twoDimVertL1], [3, twoDimVertL1],\n    [3, twoDimVertL1], [3, twoDimVertL1],\n    [3, twoDimVertL1], [3, twoDimVertL1],\n    [3, twoDimVertR1], [3, twoDimVertR1], // 011xxxx\n    [3, twoDimVertR1], [3, twoDimVertR1],\n    [3, twoDimVertR1], [3, twoDimVertR1],\n    [3, twoDimVertR1], [3, twoDimVertR1],\n    [3, twoDimVertR1], [3, twoDimVertR1],\n    [3, twoDimVertR1], [3, twoDimVertR1],\n    [3, twoDimVertR1], [3, twoDimVertR1],\n    [3, twoDimVertR1], [3, twoDimVertR1],\n    [1, twoDimVert0], [1, twoDimVert0],   // 1xxxxxx\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0]\n  ];\n\n  var whiteTable1 = [\n    [-1, -1],                               // 00000\n    [12, ccittEOL],                         // 00001\n    [-1, -1], [-1, -1],                     // 0001x\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 001xx\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 010xx\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 011xx\n    [11, 1792], [11, 1792],                 // 1000x\n    [12, 1984],                             // 10010\n    [12, 2048],                             // 10011\n    [12, 2112],                             // 10100\n    [12, 2176],                             // 10101\n    [12, 2240],                             // 10110\n    [12, 2304],                             // 10111\n    [11, 1856], [11, 1856],                 // 1100x\n    [11, 1920], [11, 1920],                 // 1101x\n    [12, 2368],                             // 11100\n    [12, 2432],                             // 11101\n    [12, 2496],                             // 11110\n    [12, 2560]                              // 11111\n  ];\n\n  var whiteTable2 = [\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1],     // 0000000xx\n    [8, 29], [8, 29],                           // 00000010x\n    [8, 30], [8, 30],                           // 00000011x\n    [8, 45], [8, 45],                           // 00000100x\n    [8, 46], [8, 46],                           // 00000101x\n    [7, 22], [7, 22], [7, 22], [7, 22],         // 0000011xx\n    [7, 23], [7, 23], [7, 23], [7, 23],         // 0000100xx\n    [8, 47], [8, 47],                           // 00001010x\n    [8, 48], [8, 48],                           // 00001011x\n    [6, 13], [6, 13], [6, 13], [6, 13],         // 000011xxx\n    [6, 13], [6, 13], [6, 13], [6, 13],\n    [7, 20], [7, 20], [7, 20], [7, 20],         // 0001000xx\n    [8, 33], [8, 33],                           // 00010010x\n    [8, 34], [8, 34],                           // 00010011x\n    [8, 35], [8, 35],                           // 00010100x\n    [8, 36], [8, 36],                           // 00010101x\n    [8, 37], [8, 37],                           // 00010110x\n    [8, 38], [8, 38],                           // 00010111x\n    [7, 19], [7, 19], [7, 19], [7, 19],         // 0001100xx\n    [8, 31], [8, 31],                           // 00011010x\n    [8, 32], [8, 32],                           // 00011011x\n    [6, 1], [6, 1], [6, 1], [6, 1],             // 000111xxx\n    [6, 1], [6, 1], [6, 1], [6, 1],\n    [6, 12], [6, 12], [6, 12], [6, 12],         // 001000xxx\n    [6, 12], [6, 12], [6, 12], [6, 12],\n    [8, 53], [8, 53],                           // 00100100x\n    [8, 54], [8, 54],                           // 00100101x\n    [7, 26], [7, 26], [7, 26], [7, 26],         // 0010011xx\n    [8, 39], [8, 39],                           // 00101000x\n    [8, 40], [8, 40],                           // 00101001x\n    [8, 41], [8, 41],                           // 00101010x\n    [8, 42], [8, 42],                           // 00101011x\n    [8, 43], [8, 43],                           // 00101100x\n    [8, 44], [8, 44],                           // 00101101x\n    [7, 21], [7, 21], [7, 21], [7, 21],         // 0010111xx\n    [7, 28], [7, 28], [7, 28], [7, 28],         // 0011000xx\n    [8, 61], [8, 61],                           // 00110010x\n    [8, 62], [8, 62],                           // 00110011x\n    [8, 63], [8, 63],                           // 00110100x\n    [8, 0], [8, 0],                             // 00110101x\n    [8, 320], [8, 320],                         // 00110110x\n    [8, 384], [8, 384],                         // 00110111x\n    [5, 10], [5, 10], [5, 10], [5, 10],         // 00111xxxx\n    [5, 10], [5, 10], [5, 10], [5, 10],\n    [5, 10], [5, 10], [5, 10], [5, 10],\n    [5, 10], [5, 10], [5, 10], [5, 10],\n    [5, 11], [5, 11], [5, 11], [5, 11],         // 01000xxxx\n    [5, 11], [5, 11], [5, 11], [5, 11],\n    [5, 11], [5, 11], [5, 11], [5, 11],\n    [5, 11], [5, 11], [5, 11], [5, 11],\n    [7, 27], [7, 27], [7, 27], [7, 27],         // 0100100xx\n    [8, 59], [8, 59],                           // 01001010x\n    [8, 60], [8, 60],                           // 01001011x\n    [9, 1472],                                  // 010011000\n    [9, 1536],                                  // 010011001\n    [9, 1600],                                  // 010011010\n    [9, 1728],                                  // 010011011\n    [7, 18], [7, 18], [7, 18], [7, 18],         // 0100111xx\n    [7, 24], [7, 24], [7, 24], [7, 24],         // 0101000xx\n    [8, 49], [8, 49],                           // 01010010x\n    [8, 50], [8, 50],                           // 01010011x\n    [8, 51], [8, 51],                           // 01010100x\n    [8, 52], [8, 52],                           // 01010101x\n    [7, 25], [7, 25], [7, 25], [7, 25],         // 0101011xx\n    [8, 55], [8, 55],                           // 01011000x\n    [8, 56], [8, 56],                           // 01011001x\n    [8, 57], [8, 57],                           // 01011010x\n    [8, 58], [8, 58],                           // 01011011x\n    [6, 192], [6, 192], [6, 192], [6, 192],     // 010111xxx\n    [6, 192], [6, 192], [6, 192], [6, 192],\n    [6, 1664], [6, 1664], [6, 1664], [6, 1664], // 011000xxx\n    [6, 1664], [6, 1664], [6, 1664], [6, 1664],\n    [8, 448], [8, 448],                         // 01100100x\n    [8, 512], [8, 512],                         // 01100101x\n    [9, 704],                                   // 011001100\n    [9, 768],                                   // 011001101\n    [8, 640], [8, 640],                         // 01100111x\n    [8, 576], [8, 576],                         // 01101000x\n    [9, 832],                                   // 011010010\n    [9, 896],                                   // 011010011\n    [9, 960],                                   // 011010100\n    [9, 1024],                                  // 011010101\n    [9, 1088],                                  // 011010110\n    [9, 1152],                                  // 011010111\n    [9, 1216],                                  // 011011000\n    [9, 1280],                                  // 011011001\n    [9, 1344],                                  // 011011010\n    [9, 1408],                                  // 011011011\n    [7, 256], [7, 256], [7, 256], [7, 256],     // 0110111xx\n    [4, 2], [4, 2], [4, 2], [4, 2],             // 0111xxxxx\n    [4, 2], [4, 2], [4, 2], [4, 2],\n    [4, 2], [4, 2], [4, 2], [4, 2],\n    [4, 2], [4, 2], [4, 2], [4, 2],\n    [4, 2], [4, 2], [4, 2], [4, 2],\n    [4, 2], [4, 2], [4, 2], [4, 2],\n    [4, 2], [4, 2], [4, 2], [4, 2],\n    [4, 2], [4, 2], [4, 2], [4, 2],\n    [4, 3], [4, 3], [4, 3], [4, 3],             // 1000xxxxx\n    [4, 3], [4, 3], [4, 3], [4, 3],\n    [4, 3], [4, 3], [4, 3], [4, 3],\n    [4, 3], [4, 3], [4, 3], [4, 3],\n    [4, 3], [4, 3], [4, 3], [4, 3],\n    [4, 3], [4, 3], [4, 3], [4, 3],\n    [4, 3], [4, 3], [4, 3], [4, 3],\n    [4, 3], [4, 3], [4, 3], [4, 3],\n    [5, 128], [5, 128], [5, 128], [5, 128],     // 10010xxxx\n    [5, 128], [5, 128], [5, 128], [5, 128],\n    [5, 128], [5, 128], [5, 128], [5, 128],\n    [5, 128], [5, 128], [5, 128], [5, 128],\n    [5, 8], [5, 8], [5, 8], [5, 8],             // 10011xxxx\n    [5, 8], [5, 8], [5, 8], [5, 8],\n    [5, 8], [5, 8], [5, 8], [5, 8],\n    [5, 8], [5, 8], [5, 8], [5, 8],\n    [5, 9], [5, 9], [5, 9], [5, 9],             // 10100xxxx\n    [5, 9], [5, 9], [5, 9], [5, 9],\n    [5, 9], [5, 9], [5, 9], [5, 9],\n    [5, 9], [5, 9], [5, 9], [5, 9],\n    [6, 16], [6, 16], [6, 16], [6, 16],         // 101010xxx\n    [6, 16], [6, 16], [6, 16], [6, 16],\n    [6, 17], [6, 17], [6, 17], [6, 17],         // 101011xxx\n    [6, 17], [6, 17], [6, 17], [6, 17],\n    [4, 4], [4, 4], [4, 4], [4, 4],             // 1011xxxxx\n    [4, 4], [4, 4], [4, 4], [4, 4],\n    [4, 4], [4, 4], [4, 4], [4, 4],\n    [4, 4], [4, 4], [4, 4], [4, 4],\n    [4, 4], [4, 4], [4, 4], [4, 4],\n    [4, 4], [4, 4], [4, 4], [4, 4],\n    [4, 4], [4, 4], [4, 4], [4, 4],\n    [4, 4], [4, 4], [4, 4], [4, 4],\n    [4, 5], [4, 5], [4, 5], [4, 5],             // 1100xxxxx\n    [4, 5], [4, 5], [4, 5], [4, 5],\n    [4, 5], [4, 5], [4, 5], [4, 5],\n    [4, 5], [4, 5], [4, 5], [4, 5],\n    [4, 5], [4, 5], [4, 5], [4, 5],\n    [4, 5], [4, 5], [4, 5], [4, 5],\n    [4, 5], [4, 5], [4, 5], [4, 5],\n    [4, 5], [4, 5], [4, 5], [4, 5],\n    [6, 14], [6, 14], [6, 14], [6, 14],         // 110100xxx\n    [6, 14], [6, 14], [6, 14], [6, 14],\n    [6, 15], [6, 15], [6, 15], [6, 15],         // 110101xxx\n    [6, 15], [6, 15], [6, 15], [6, 15],\n    [5, 64], [5, 64], [5, 64], [5, 64],         // 11011xxxx\n    [5, 64], [5, 64], [5, 64], [5, 64],\n    [5, 64], [5, 64], [5, 64], [5, 64],\n    [5, 64], [5, 64], [5, 64], [5, 64],\n    [4, 6], [4, 6], [4, 6], [4, 6],             // 1110xxxxx\n    [4, 6], [4, 6], [4, 6], [4, 6],\n    [4, 6], [4, 6], [4, 6], [4, 6],\n    [4, 6], [4, 6], [4, 6], [4, 6],\n    [4, 6], [4, 6], [4, 6], [4, 6],\n    [4, 6], [4, 6], [4, 6], [4, 6],\n    [4, 6], [4, 6], [4, 6], [4, 6],\n    [4, 6], [4, 6], [4, 6], [4, 6],\n    [4, 7], [4, 7], [4, 7], [4, 7],             // 1111xxxxx\n    [4, 7], [4, 7], [4, 7], [4, 7],\n    [4, 7], [4, 7], [4, 7], [4, 7],\n    [4, 7], [4, 7], [4, 7], [4, 7],\n    [4, 7], [4, 7], [4, 7], [4, 7],\n    [4, 7], [4, 7], [4, 7], [4, 7],\n    [4, 7], [4, 7], [4, 7], [4, 7],\n    [4, 7], [4, 7], [4, 7], [4, 7]\n  ];\n\n  var blackTable1 = [\n    [-1, -1], [-1, -1],                             // 000000000000x\n    [12, ccittEOL], [12, ccittEOL],                 // 000000000001x\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000001xx\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000010xx\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000011xx\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000100xx\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000101xx\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000110xx\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000111xx\n    [11, 1792], [11, 1792], [11, 1792], [11, 1792], // 00000001000xx\n    [12, 1984], [12, 1984],                         // 000000010010x\n    [12, 2048], [12, 2048],                         // 000000010011x\n    [12, 2112], [12, 2112],                         // 000000010100x\n    [12, 2176], [12, 2176],                         // 000000010101x\n    [12, 2240], [12, 2240],                         // 000000010110x\n    [12, 2304], [12, 2304],                         // 000000010111x\n    [11, 1856], [11, 1856], [11, 1856], [11, 1856], // 00000001100xx\n    [11, 1920], [11, 1920], [11, 1920], [11, 1920], // 00000001101xx\n    [12, 2368], [12, 2368],                         // 000000011100x\n    [12, 2432], [12, 2432],                         // 000000011101x\n    [12, 2496], [12, 2496],                         // 000000011110x\n    [12, 2560], [12, 2560],                         // 000000011111x\n    [10, 18], [10, 18], [10, 18], [10, 18],         // 0000001000xxx\n    [10, 18], [10, 18], [10, 18], [10, 18],\n    [12, 52], [12, 52],                             // 000000100100x\n    [13, 640],                                      // 0000001001010\n    [13, 704],                                      // 0000001001011\n    [13, 768],                                      // 0000001001100\n    [13, 832],                                      // 0000001001101\n    [12, 55], [12, 55],                             // 000000100111x\n    [12, 56], [12, 56],                             // 000000101000x\n    [13, 1280],                                     // 0000001010010\n    [13, 1344],                                     // 0000001010011\n    [13, 1408],                                     // 0000001010100\n    [13, 1472],                                     // 0000001010101\n    [12, 59], [12, 59],                             // 000000101011x\n    [12, 60], [12, 60],                             // 000000101100x\n    [13, 1536],                                     // 0000001011010\n    [13, 1600],                                     // 0000001011011\n    [11, 24], [11, 24], [11, 24], [11, 24],         // 00000010111xx\n    [11, 25], [11, 25], [11, 25], [11, 25],         // 00000011000xx\n    [13, 1664],                                     // 0000001100100\n    [13, 1728],                                     // 0000001100101\n    [12, 320], [12, 320],                           // 000000110011x\n    [12, 384], [12, 384],                           // 000000110100x\n    [12, 448], [12, 448],                           // 000000110101x\n    [13, 512],                                      // 0000001101100\n    [13, 576],                                      // 0000001101101\n    [12, 53], [12, 53],                             // 000000110111x\n    [12, 54], [12, 54],                             // 000000111000x\n    [13, 896],                                      // 0000001110010\n    [13, 960],                                      // 0000001110011\n    [13, 1024],                                     // 0000001110100\n    [13, 1088],                                     // 0000001110101\n    [13, 1152],                                     // 0000001110110\n    [13, 1216],                                     // 0000001110111\n    [10, 64], [10, 64], [10, 64], [10, 64],         // 0000001111xxx\n    [10, 64], [10, 64], [10, 64], [10, 64]\n  ];\n\n  var blackTable2 = [\n    [8, 13], [8, 13], [8, 13], [8, 13],     // 00000100xxxx\n    [8, 13], [8, 13], [8, 13], [8, 13],\n    [8, 13], [8, 13], [8, 13], [8, 13],\n    [8, 13], [8, 13], [8, 13], [8, 13],\n    [11, 23], [11, 23],                     // 00000101000x\n    [12, 50],                               // 000001010010\n    [12, 51],                               // 000001010011\n    [12, 44],                               // 000001010100\n    [12, 45],                               // 000001010101\n    [12, 46],                               // 000001010110\n    [12, 47],                               // 000001010111\n    [12, 57],                               // 000001011000\n    [12, 58],                               // 000001011001\n    [12, 61],                               // 000001011010\n    [12, 256],                              // 000001011011\n    [10, 16], [10, 16], [10, 16], [10, 16], // 0000010111xx\n    [10, 17], [10, 17], [10, 17], [10, 17], // 0000011000xx\n    [12, 48],                               // 000001100100\n    [12, 49],                               // 000001100101\n    [12, 62],                               // 000001100110\n    [12, 63],                               // 000001100111\n    [12, 30],                               // 000001101000\n    [12, 31],                               // 000001101001\n    [12, 32],                               // 000001101010\n    [12, 33],                               // 000001101011\n    [12, 40],                               // 000001101100\n    [12, 41],                               // 000001101101\n    [11, 22], [11, 22],                     // 00000110111x\n    [8, 14], [8, 14], [8, 14], [8, 14],     // 00000111xxxx\n    [8, 14], [8, 14], [8, 14], [8, 14],\n    [8, 14], [8, 14], [8, 14], [8, 14],\n    [8, 14], [8, 14], [8, 14], [8, 14],\n    [7, 10], [7, 10], [7, 10], [7, 10],     // 0000100xxxxx\n    [7, 10], [7, 10], [7, 10], [7, 10],\n    [7, 10], [7, 10], [7, 10], [7, 10],\n    [7, 10], [7, 10], [7, 10], [7, 10],\n    [7, 10], [7, 10], [7, 10], [7, 10],\n    [7, 10], [7, 10], [7, 10], [7, 10],\n    [7, 10], [7, 10], [7, 10], [7, 10],\n    [7, 10], [7, 10], [7, 10], [7, 10],\n    [7, 11], [7, 11], [7, 11], [7, 11],     // 0000101xxxxx\n    [7, 11], [7, 11], [7, 11], [7, 11],\n    [7, 11], [7, 11], [7, 11], [7, 11],\n    [7, 11], [7, 11], [7, 11], [7, 11],\n    [7, 11], [7, 11], [7, 11], [7, 11],\n    [7, 11], [7, 11], [7, 11], [7, 11],\n    [7, 11], [7, 11], [7, 11], [7, 11],\n    [7, 11], [7, 11], [7, 11], [7, 11],\n    [9, 15], [9, 15], [9, 15], [9, 15],     // 000011000xxx\n    [9, 15], [9, 15], [9, 15], [9, 15],\n    [12, 128],                              // 000011001000\n    [12, 192],                              // 000011001001\n    [12, 26],                               // 000011001010\n    [12, 27],                               // 000011001011\n    [12, 28],                               // 000011001100\n    [12, 29],                               // 000011001101\n    [11, 19], [11, 19],                     // 00001100111x\n    [11, 20], [11, 20],                     // 00001101000x\n    [12, 34],                               // 000011010010\n    [12, 35],                               // 000011010011\n    [12, 36],                               // 000011010100\n    [12, 37],                               // 000011010101\n    [12, 38],                               // 000011010110\n    [12, 39],                               // 000011010111\n    [11, 21], [11, 21],                     // 00001101100x\n    [12, 42],                               // 000011011010\n    [12, 43],                               // 000011011011\n    [10, 0], [10, 0], [10, 0], [10, 0],     // 0000110111xx\n    [7, 12], [7, 12], [7, 12], [7, 12],     // 0000111xxxxx\n    [7, 12], [7, 12], [7, 12], [7, 12],\n    [7, 12], [7, 12], [7, 12], [7, 12],\n    [7, 12], [7, 12], [7, 12], [7, 12],\n    [7, 12], [7, 12], [7, 12], [7, 12],\n    [7, 12], [7, 12], [7, 12], [7, 12],\n    [7, 12], [7, 12], [7, 12], [7, 12],\n    [7, 12], [7, 12], [7, 12], [7, 12]\n  ];\n\n  var blackTable3 = [\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx\n    [6, 9],                                 // 000100\n    [6, 8],                                 // 000101\n    [5, 7], [5, 7],                         // 00011x\n    [4, 6], [4, 6], [4, 6], [4, 6],         // 0010xx\n    [4, 5], [4, 5], [4, 5], [4, 5],         // 0011xx\n    [3, 1], [3, 1], [3, 1], [3, 1],         // 010xxx\n    [3, 1], [3, 1], [3, 1], [3, 1],\n    [3, 4], [3, 4], [3, 4], [3, 4],         // 011xxx\n    [3, 4], [3, 4], [3, 4], [3, 4],\n    [2, 3], [2, 3], [2, 3], [2, 3],         // 10xxxx\n    [2, 3], [2, 3], [2, 3], [2, 3],\n    [2, 3], [2, 3], [2, 3], [2, 3],\n    [2, 3], [2, 3], [2, 3], [2, 3],\n    [2, 2], [2, 2], [2, 2], [2, 2],         // 11xxxx\n    [2, 2], [2, 2], [2, 2], [2, 2],\n    [2, 2], [2, 2], [2, 2], [2, 2],\n    [2, 2], [2, 2], [2, 2], [2, 2]\n  ];\n\n  function CCITTFaxStream(str, maybeLength, params) {\n    this.str = str;\n    this.dict = str.dict;\n\n    params = params || Dict.empty;\n\n    this.encoding = params.get('K') || 0;\n    this.eoline = params.get('EndOfLine') || false;\n    this.byteAlign = params.get('EncodedByteAlign') || false;\n    this.columns = params.get('Columns') || 1728;\n    this.rows = params.get('Rows') || 0;\n    var eoblock = params.get('EndOfBlock');\n    if (eoblock === null || eoblock === undefined) {\n      eoblock = true;\n    }\n    this.eoblock = eoblock;\n    this.black = params.get('BlackIs1') || false;\n\n    this.codingLine = new Uint32Array(this.columns + 1);\n    this.refLine = new Uint32Array(this.columns + 2);\n\n    this.codingLine[0] = this.columns;\n    this.codingPos = 0;\n\n    this.row = 0;\n    this.nextLine2D = this.encoding < 0;\n    this.inputBits = 0;\n    this.inputBuf = 0;\n    this.outputBits = 0;\n\n    var code1;\n    while ((code1 = this.lookBits(12)) === 0) {\n      this.eatBits(1);\n    }\n    if (code1 === 1) {\n      this.eatBits(12);\n    }\n    if (this.encoding > 0) {\n      this.nextLine2D = !this.lookBits(1);\n      this.eatBits(1);\n    }\n\n    DecodeStream.call(this, maybeLength);\n  }\n\n  CCITTFaxStream.prototype = Object.create(DecodeStream.prototype);\n\n  CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() {\n    while (!this.eof) {\n      var c = this.lookChar();\n      this.ensureBuffer(this.bufferLength + 1);\n      this.buffer[this.bufferLength++] = c;\n    }\n  };\n\n  CCITTFaxStream.prototype.addPixels =\n      function ccittFaxStreamAddPixels(a1, blackPixels) {\n    var codingLine = this.codingLine;\n    var codingPos = this.codingPos;\n\n    if (a1 > codingLine[codingPos]) {\n      if (a1 > this.columns) {\n        info('row is wrong length');\n        this.err = true;\n        a1 = this.columns;\n      }\n      if ((codingPos & 1) ^ blackPixels) {\n        ++codingPos;\n      }\n\n      codingLine[codingPos] = a1;\n    }\n    this.codingPos = codingPos;\n  };\n\n  CCITTFaxStream.prototype.addPixelsNeg =\n      function ccittFaxStreamAddPixelsNeg(a1, blackPixels) {\n    var codingLine = this.codingLine;\n    var codingPos = this.codingPos;\n\n    if (a1 > codingLine[codingPos]) {\n      if (a1 > this.columns) {\n        info('row is wrong length');\n        this.err = true;\n        a1 = this.columns;\n      }\n      if ((codingPos & 1) ^ blackPixels) {\n        ++codingPos;\n      }\n\n      codingLine[codingPos] = a1;\n    } else if (a1 < codingLine[codingPos]) {\n      if (a1 < 0) {\n        info('invalid code');\n        this.err = true;\n        a1 = 0;\n      }\n      while (codingPos > 0 && a1 < codingLine[codingPos - 1]) {\n        --codingPos;\n      }\n      codingLine[codingPos] = a1;\n    }\n\n    this.codingPos = codingPos;\n  };\n\n  CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() {\n    var refLine = this.refLine;\n    var codingLine = this.codingLine;\n    var columns = this.columns;\n\n    var refPos, blackPixels, bits, i;\n\n    if (this.outputBits === 0) {\n      if (this.eof) {\n        return null;\n      }\n      this.err = false;\n\n      var code1, code2, code3;\n      if (this.nextLine2D) {\n        for (i = 0; codingLine[i] < columns; ++i) {\n          refLine[i] = codingLine[i];\n        }\n        refLine[i++] = columns;\n        refLine[i] = columns;\n        codingLine[0] = 0;\n        this.codingPos = 0;\n        refPos = 0;\n        blackPixels = 0;\n\n        while (codingLine[this.codingPos] < columns) {\n          code1 = this.getTwoDimCode();\n          switch (code1) {\n            case twoDimPass:\n              this.addPixels(refLine[refPos + 1], blackPixels);\n              if (refLine[refPos + 1] < columns) {\n                refPos += 2;\n              }\n              break;\n            case twoDimHoriz:\n              code1 = code2 = 0;\n              if (blackPixels) {\n                do {\n                  code1 += (code3 = this.getBlackCode());\n                } while (code3 >= 64);\n                do {\n                  code2 += (code3 = this.getWhiteCode());\n                } while (code3 >= 64);\n              } else {\n                do {\n                  code1 += (code3 = this.getWhiteCode());\n                } while (code3 >= 64);\n                do {\n                  code2 += (code3 = this.getBlackCode());\n                } while (code3 >= 64);\n              }\n              this.addPixels(codingLine[this.codingPos] +\n                             code1, blackPixels);\n              if (codingLine[this.codingPos] < columns) {\n                this.addPixels(codingLine[this.codingPos] + code2,\n                               blackPixels ^ 1);\n              }\n              while (refLine[refPos] <= codingLine[this.codingPos] &&\n                     refLine[refPos] < columns) {\n                refPos += 2;\n              }\n              break;\n            case twoDimVertR3:\n              this.addPixels(refLine[refPos] + 3, blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                ++refPos;\n                while (refLine[refPos] <= codingLine[this.codingPos] &&\n                       refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case twoDimVertR2:\n              this.addPixels(refLine[refPos] + 2, blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                ++refPos;\n                while (refLine[refPos] <= codingLine[this.codingPos] &&\n                       refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case twoDimVertR1:\n              this.addPixels(refLine[refPos] + 1, blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                ++refPos;\n                while (refLine[refPos] <= codingLine[this.codingPos] &&\n                       refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case twoDimVert0:\n              this.addPixels(refLine[refPos], blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                ++refPos;\n                while (refLine[refPos] <= codingLine[this.codingPos] &&\n                       refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case twoDimVertL3:\n              this.addPixelsNeg(refLine[refPos] - 3, blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                if (refPos > 0) {\n                  --refPos;\n                } else {\n                  ++refPos;\n                }\n                while (refLine[refPos] <= codingLine[this.codingPos] &&\n                       refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case twoDimVertL2:\n              this.addPixelsNeg(refLine[refPos] - 2, blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                if (refPos > 0) {\n                  --refPos;\n                } else {\n                  ++refPos;\n                }\n                while (refLine[refPos] <= codingLine[this.codingPos] &&\n                       refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case twoDimVertL1:\n              this.addPixelsNeg(refLine[refPos] - 1, blackPixels);\n              blackPixels ^= 1;\n              if (codingLine[this.codingPos] < columns) {\n                if (refPos > 0) {\n                  --refPos;\n                } else {\n                  ++refPos;\n                }\n                while (refLine[refPos] <= codingLine[this.codingPos] &&\n                       refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n              }\n              break;\n            case EOF:\n              this.addPixels(columns, 0);\n              this.eof = true;\n              break;\n            default:\n              info('bad 2d code');\n              this.addPixels(columns, 0);\n              this.err = true;\n          }\n        }\n      } else {\n        codingLine[0] = 0;\n        this.codingPos = 0;\n        blackPixels = 0;\n        while (codingLine[this.codingPos] < columns) {\n          code1 = 0;\n          if (blackPixels) {\n            do {\n              code1 += (code3 = this.getBlackCode());\n            } while (code3 >= 64);\n          } else {\n            do {\n              code1 += (code3 = this.getWhiteCode());\n            } while (code3 >= 64);\n          }\n          this.addPixels(codingLine[this.codingPos] + code1, blackPixels);\n          blackPixels ^= 1;\n        }\n      }\n\n      var gotEOL = false;\n\n      if (this.byteAlign) {\n        this.inputBits &= ~7;\n      }\n\n      if (!this.eoblock && this.row === this.rows - 1) {\n        this.eof = true;\n      } else {\n        code1 = this.lookBits(12);\n        if (this.eoline) {\n          while (code1 !== EOF && code1 !== 1) {\n            this.eatBits(1);\n            code1 = this.lookBits(12);\n          }\n        } else {\n          while (code1 === 0) {\n            this.eatBits(1);\n            code1 = this.lookBits(12);\n          }\n        }\n        if (code1 === 1) {\n          this.eatBits(12);\n          gotEOL = true;\n        } else if (code1 === EOF) {\n          this.eof = true;\n        }\n      }\n\n      if (!this.eof && this.encoding > 0) {\n        this.nextLine2D = !this.lookBits(1);\n        this.eatBits(1);\n      }\n\n      if (this.eoblock && gotEOL && this.byteAlign) {\n        code1 = this.lookBits(12);\n        if (code1 === 1) {\n          this.eatBits(12);\n          if (this.encoding > 0) {\n            this.lookBits(1);\n            this.eatBits(1);\n          }\n          if (this.encoding >= 0) {\n            for (i = 0; i < 4; ++i) {\n              code1 = this.lookBits(12);\n              if (code1 !== 1) {\n                info('bad rtc code: ' + code1);\n              }\n              this.eatBits(12);\n              if (this.encoding > 0) {\n                this.lookBits(1);\n                this.eatBits(1);\n              }\n            }\n          }\n          this.eof = true;\n        }\n      } else if (this.err && this.eoline) {\n        while (true) {\n          code1 = this.lookBits(13);\n          if (code1 === EOF) {\n            this.eof = true;\n            return null;\n          }\n          if ((code1 >> 1) === 1) {\n            break;\n          }\n          this.eatBits(1);\n        }\n        this.eatBits(12);\n        if (this.encoding > 0) {\n          this.eatBits(1);\n          this.nextLine2D = !(code1 & 1);\n        }\n      }\n\n      if (codingLine[0] > 0) {\n        this.outputBits = codingLine[this.codingPos = 0];\n      } else {\n        this.outputBits = codingLine[this.codingPos = 1];\n      }\n      this.row++;\n    }\n\n    var c;\n    if (this.outputBits >= 8) {\n      c = (this.codingPos & 1) ? 0 : 0xFF;\n      this.outputBits -= 8;\n      if (this.outputBits === 0 && codingLine[this.codingPos] < columns) {\n        this.codingPos++;\n        this.outputBits = (codingLine[this.codingPos] -\n                           codingLine[this.codingPos - 1]);\n      }\n    } else {\n      bits = 8;\n      c = 0;\n      do {\n        if (this.outputBits > bits) {\n          c <<= bits;\n          if (!(this.codingPos & 1)) {\n            c |= 0xFF >> (8 - bits);\n          }\n          this.outputBits -= bits;\n          bits = 0;\n        } else {\n          c <<= this.outputBits;\n          if (!(this.codingPos & 1)) {\n            c |= 0xFF >> (8 - this.outputBits);\n          }\n          bits -= this.outputBits;\n          this.outputBits = 0;\n          if (codingLine[this.codingPos] < columns) {\n            this.codingPos++;\n            this.outputBits = (codingLine[this.codingPos] -\n                               codingLine[this.codingPos - 1]);\n          } else if (bits > 0) {\n            c <<= bits;\n            bits = 0;\n          }\n        }\n      } while (bits);\n    }\n    if (this.black) {\n      c ^= 0xFF;\n    }\n    return c;\n  };\n\n  // This functions returns the code found from the table.\n  // The start and end parameters set the boundaries for searching the table.\n  // The limit parameter is optional. Function returns an array with three\n  // values. The first array element indicates whether a valid code is being\n  // returned. The second array element is the actual code. The third array\n  // element indicates whether EOF was reached.\n  CCITTFaxStream.prototype.findTableCode =\n      function ccittFaxStreamFindTableCode(start, end, table, limit) {\n\n    var limitValue = limit || 0;\n    for (var i = start; i <= end; ++i) {\n      var code = this.lookBits(i);\n      if (code === EOF) {\n        return [true, 1, false];\n      }\n      if (i < end) {\n        code <<= end - i;\n      }\n      if (!limitValue || code >= limitValue) {\n        var p = table[code - limitValue];\n        if (p[0] === i) {\n          this.eatBits(i);\n          return [true, p[1], true];\n        }\n      }\n    }\n    return [false, 0, false];\n  };\n\n  CCITTFaxStream.prototype.getTwoDimCode =\n      function ccittFaxStreamGetTwoDimCode() {\n\n    var code = 0;\n    var p;\n    if (this.eoblock) {\n      code = this.lookBits(7);\n      p = twoDimTable[code];\n      if (p && p[0] > 0) {\n        this.eatBits(p[0]);\n        return p[1];\n      }\n    } else {\n      var result = this.findTableCode(1, 7, twoDimTable);\n      if (result[0] && result[2]) {\n        return result[1];\n      }\n    }\n    info('Bad two dim code');\n    return EOF;\n  };\n\n  CCITTFaxStream.prototype.getWhiteCode =\n      function ccittFaxStreamGetWhiteCode() {\n\n    var code = 0;\n    var p;\n    if (this.eoblock) {\n      code = this.lookBits(12);\n      if (code === EOF) {\n        return 1;\n      }\n\n      if ((code >> 5) === 0) {\n        p = whiteTable1[code];\n      } else {\n        p = whiteTable2[code >> 3];\n      }\n\n      if (p[0] > 0) {\n        this.eatBits(p[0]);\n        return p[1];\n      }\n    } else {\n      var result = this.findTableCode(1, 9, whiteTable2);\n      if (result[0]) {\n        return result[1];\n      }\n\n      result = this.findTableCode(11, 12, whiteTable1);\n      if (result[0]) {\n        return result[1];\n      }\n    }\n    info('bad white code');\n    this.eatBits(1);\n    return 1;\n  };\n\n  CCITTFaxStream.prototype.getBlackCode =\n      function ccittFaxStreamGetBlackCode() {\n\n    var code, p;\n    if (this.eoblock) {\n      code = this.lookBits(13);\n      if (code === EOF) {\n        return 1;\n      }\n      if ((code >> 7) === 0) {\n        p = blackTable1[code];\n      } else if ((code >> 9) === 0 && (code >> 7) !== 0) {\n        p = blackTable2[(code >> 1) - 64];\n      } else {\n        p = blackTable3[code >> 7];\n      }\n\n      if (p[0] > 0) {\n        this.eatBits(p[0]);\n        return p[1];\n      }\n    } else {\n      var result = this.findTableCode(2, 6, blackTable3);\n      if (result[0]) {\n        return result[1];\n      }\n\n      result = this.findTableCode(7, 12, blackTable2, 64);\n      if (result[0]) {\n        return result[1];\n      }\n\n      result = this.findTableCode(10, 13, blackTable1);\n      if (result[0]) {\n        return result[1];\n      }\n    }\n    info('bad black code');\n    this.eatBits(1);\n    return 1;\n  };\n\n  CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) {\n    var c;\n    while (this.inputBits < n) {\n      if ((c = this.str.getByte()) === -1) {\n        if (this.inputBits === 0) {\n          return EOF;\n        }\n        return ((this.inputBuf << (n - this.inputBits)) &\n                (0xFFFF >> (16 - n)));\n      }\n      this.inputBuf = (this.inputBuf << 8) + c;\n      this.inputBits += 8;\n    }\n    return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n));\n  };\n\n  CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) {\n    if ((this.inputBits -= n) < 0) {\n      this.inputBits = 0;\n    }\n  };\n\n  return CCITTFaxStream;\n})();\n\nvar LZWStream = (function LZWStreamClosure() {\n  function LZWStream(str, maybeLength, earlyChange) {\n    this.str = str;\n    this.dict = str.dict;\n    this.cachedData = 0;\n    this.bitsCached = 0;\n\n    var maxLzwDictionarySize = 4096;\n    var lzwState = {\n      earlyChange: earlyChange,\n      codeLength: 9,\n      nextCode: 258,\n      dictionaryValues: new Uint8Array(maxLzwDictionarySize),\n      dictionaryLengths: new Uint16Array(maxLzwDictionarySize),\n      dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),\n      currentSequence: new Uint8Array(maxLzwDictionarySize),\n      currentSequenceLength: 0\n    };\n    for (var i = 0; i < 256; ++i) {\n      lzwState.dictionaryValues[i] = i;\n      lzwState.dictionaryLengths[i] = 1;\n    }\n    this.lzwState = lzwState;\n\n    DecodeStream.call(this, maybeLength);\n  }\n\n  LZWStream.prototype = Object.create(DecodeStream.prototype);\n\n  LZWStream.prototype.readBits = function LZWStream_readBits(n) {\n    var bitsCached = this.bitsCached;\n    var cachedData = this.cachedData;\n    while (bitsCached < n) {\n      var c = this.str.getByte();\n      if (c === -1) {\n        this.eof = true;\n        return null;\n      }\n      cachedData = (cachedData << 8) | c;\n      bitsCached += 8;\n    }\n    this.bitsCached = (bitsCached -= n);\n    this.cachedData = cachedData;\n    this.lastCode = null;\n    return (cachedData >>> bitsCached) & ((1 << n) - 1);\n  };\n\n  LZWStream.prototype.readBlock = function LZWStream_readBlock() {\n    var blockSize = 512;\n    var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize;\n    var i, j, q;\n\n    var lzwState = this.lzwState;\n    if (!lzwState) {\n      return; // eof was found\n    }\n\n    var earlyChange = lzwState.earlyChange;\n    var nextCode = lzwState.nextCode;\n    var dictionaryValues = lzwState.dictionaryValues;\n    var dictionaryLengths = lzwState.dictionaryLengths;\n    var dictionaryPrevCodes = lzwState.dictionaryPrevCodes;\n    var codeLength = lzwState.codeLength;\n    var prevCode = lzwState.prevCode;\n    var currentSequence = lzwState.currentSequence;\n    var currentSequenceLength = lzwState.currentSequenceLength;\n\n    var decodedLength = 0;\n    var currentBufferLength = this.bufferLength;\n    var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);\n\n    for (i = 0; i < blockSize; i++) {\n      var code = this.readBits(codeLength);\n      var hasPrev = currentSequenceLength > 0;\n      if (code < 256) {\n        currentSequence[0] = code;\n        currentSequenceLength = 1;\n      } else if (code >= 258) {\n        if (code < nextCode) {\n          currentSequenceLength = dictionaryLengths[code];\n          for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {\n            currentSequence[j] = dictionaryValues[q];\n            q = dictionaryPrevCodes[q];\n          }\n        } else {\n          currentSequence[currentSequenceLength++] = currentSequence[0];\n        }\n      } else if (code === 256) {\n        codeLength = 9;\n        nextCode = 258;\n        currentSequenceLength = 0;\n        continue;\n      } else {\n        this.eof = true;\n        delete this.lzwState;\n        break;\n      }\n\n      if (hasPrev) {\n        dictionaryPrevCodes[nextCode] = prevCode;\n        dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;\n        dictionaryValues[nextCode] = currentSequence[0];\n        nextCode++;\n        codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ?\n          codeLength : Math.min(Math.log(nextCode + earlyChange) /\n          0.6931471805599453 + 1, 12) | 0;\n      }\n      prevCode = code;\n\n      decodedLength += currentSequenceLength;\n      if (estimatedDecodedSize < decodedLength) {\n        do {\n          estimatedDecodedSize += decodedSizeDelta;\n        } while (estimatedDecodedSize < decodedLength);\n        buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);\n      }\n      for (j = 0; j < currentSequenceLength; j++) {\n        buffer[currentBufferLength++] = currentSequence[j];\n      }\n    }\n    lzwState.nextCode = nextCode;\n    lzwState.codeLength = codeLength;\n    lzwState.prevCode = prevCode;\n    lzwState.currentSequenceLength = currentSequenceLength;\n\n    this.bufferLength = currentBufferLength;\n  };\n\n  return LZWStream;\n})();\n\nvar NullStream = (function NullStreamClosure() {\n  function NullStream() {\n    Stream.call(this, new Uint8Array(0));\n  }\n\n  NullStream.prototype = Stream.prototype;\n\n  return NullStream;\n})();\n\n\nvar WorkerMessageHandler = PDFJS.WorkerMessageHandler = {\n  setup: function wphSetup(handler) {\n    var pdfManager;\n\n    function loadDocument(recoveryMode) {\n      var loadDocumentCapability = createPromiseCapability();\n\n      var parseSuccess = function parseSuccess() {\n        var numPagesPromise = pdfManager.ensureDoc('numPages');\n        var fingerprintPromise = pdfManager.ensureDoc('fingerprint');\n        var encryptedPromise = pdfManager.ensureXRef('encrypt');\n        Promise.all([numPagesPromise, fingerprintPromise,\n                     encryptedPromise]).then(function onDocReady(results) {\n          var doc = {\n            numPages: results[0],\n            fingerprint: results[1],\n            encrypted: !!results[2],\n          };\n          loadDocumentCapability.resolve(doc);\n        },\n        parseFailure);\n      };\n\n      var parseFailure = function parseFailure(e) {\n        loadDocumentCapability.reject(e);\n      };\n\n      pdfManager.ensureDoc('checkHeader', []).then(function() {\n        pdfManager.ensureDoc('parseStartXRef', []).then(function() {\n          pdfManager.ensureDoc('parse', [recoveryMode]).then(\n            parseSuccess, parseFailure);\n        }, parseFailure);\n      }, parseFailure);\n\n      return loadDocumentCapability.promise;\n    }\n\n    function getPdfManager(data) {\n      var pdfManagerCapability = createPromiseCapability();\n\n      var source = data.source;\n      var disableRange = data.disableRange;\n      if (source.data) {\n        try {\n          pdfManager = new LocalPdfManager(source.data, source.password);\n          pdfManagerCapability.resolve();\n        } catch (ex) {\n          pdfManagerCapability.reject(ex);\n        }\n        return pdfManagerCapability.promise;\n      } else if (source.chunkedViewerLoading) {\n        try {\n          pdfManager = new NetworkPdfManager(source, handler);\n          pdfManagerCapability.resolve();\n        } catch (ex) {\n          pdfManagerCapability.reject(ex);\n        }\n        return pdfManagerCapability.promise;\n      }\n\n      var networkManager = new NetworkManager(source.url, {\n        httpHeaders: source.httpHeaders,\n        withCredentials: source.withCredentials\n      });\n      var cachedChunks = [];\n      var fullRequestXhrId = networkManager.requestFull({\n        onHeadersReceived: function onHeadersReceived() {\n          if (disableRange) {\n            return;\n          }\n\n          var fullRequestXhr = networkManager.getRequestXhr(fullRequestXhrId);\n          if (fullRequestXhr.getResponseHeader('Accept-Ranges') !== 'bytes') {\n            return;\n          }\n\n          var contentEncoding =\n            fullRequestXhr.getResponseHeader('Content-Encoding') || 'identity';\n          if (contentEncoding !== 'identity') {\n            return;\n          }\n\n          var length = fullRequestXhr.getResponseHeader('Content-Length');\n          length = parseInt(length, 10);\n          if (!isInt(length)) {\n            return;\n          }\n          source.length = length;\n          if (length <= 2 * RANGE_CHUNK_SIZE) {\n            // The file size is smaller than the size of two chunks, so it does\n            // not make any sense to abort the request and retry with a range\n            // request.\n            return;\n          }\n\n          if (networkManager.isStreamingRequest(fullRequestXhrId)) {\n            // We can continue fetching when progressive loading is enabled,\n            // and we don't need the autoFetch feature.\n            source.disableAutoFetch = true;\n          } else {\n            // NOTE: by cancelling the full request, and then issuing range\n            // requests, there will be an issue for sites where you can only\n            // request the pdf once. However, if this is the case, then the\n            // server should not be returning that it can support range\n            // requests.\n            networkManager.abortRequest(fullRequestXhrId);\n          }\n\n          try {\n            pdfManager = new NetworkPdfManager(source, handler);\n            pdfManagerCapability.resolve(pdfManager);\n          } catch (ex) {\n            pdfManagerCapability.reject(ex);\n          }\n        },\n\n        onProgressiveData: source.disableStream ? null :\n            function onProgressiveData(chunk) {\n          if (!pdfManager) {\n            cachedChunks.push(chunk);\n            return;\n          }\n          pdfManager.sendProgressiveData(chunk);\n        },\n\n        onDone: function onDone(args) {\n          if (pdfManager) {\n            return; // already processed\n          }\n\n          var pdfFile;\n          if (args === null) {\n            // TODO add some streaming manager, e.g. for unknown length files.\n            // The data was returned in the onProgressiveData, combining...\n            var pdfFileLength = 0, pos = 0;\n            cachedChunks.forEach(function (chunk) {\n              pdfFileLength += chunk.byteLength;\n            });\n            if (source.length && pdfFileLength !== source.length) {\n              warn('reported HTTP length is different from actual');\n            }\n            var pdfFileArray = new Uint8Array(pdfFileLength);\n            cachedChunks.forEach(function (chunk) {\n              pdfFileArray.set(new Uint8Array(chunk), pos);\n              pos += chunk.byteLength;\n            });\n            pdfFile = pdfFileArray.buffer;\n          } else {\n            pdfFile = args.chunk;\n          }\n\n          // the data is array, instantiating directly from it\n          try {\n            pdfManager = new LocalPdfManager(pdfFile, source.password);\n            pdfManagerCapability.resolve();\n          } catch (ex) {\n            pdfManagerCapability.reject(ex);\n          }\n        },\n\n        onError: function onError(status) {\n          var exception;\n          if (status === 404) {\n            exception = new MissingPDFException('Missing PDF \"' +\n                                                source.url + '\".');\n            handler.send('MissingPDF', exception);\n          } else {\n            exception = new UnexpectedResponseException(\n              'Unexpected server response (' + status +\n              ') while retrieving PDF \"' + source.url + '\".', status);\n            handler.send('UnexpectedResponse', exception);\n          }\n        },\n\n        onProgress: function onProgress(evt) {\n          handler.send('DocProgress', {\n            loaded: evt.loaded,\n            total: evt.lengthComputable ? evt.total : source.length\n          });\n        }\n      });\n\n      return pdfManagerCapability.promise;\n    }\n\n    handler.on('test', function wphSetupTest(data) {\n      // check if Uint8Array can be sent to worker\n      if (!(data instanceof Uint8Array)) {\n        handler.send('test', false);\n        return;\n      }\n      // making sure postMessage transfers are working\n      var supportTransfers = data[0] === 255;\n      handler.postMessageTransfers = supportTransfers;\n      // check if the response property is supported by xhr\n      var xhr = new XMLHttpRequest();\n      var responseExists = 'response' in xhr;\n      // check if the property is actually implemented\n      try {\n        var dummy = xhr.responseType;\n      } catch (e) {\n        responseExists = false;\n      }\n      if (!responseExists) {\n        handler.send('test', false);\n        return;\n      }\n      handler.send('test', {\n        supportTypedArray: true,\n        supportTransfers: supportTransfers\n      });\n    });\n\n    handler.on('GetDocRequest', function wphSetupDoc(data) {\n\n      var onSuccess = function(doc) {\n        handler.send('GetDoc', { pdfInfo: doc });\n      };\n\n      var onFailure = function(e) {\n        if (e instanceof PasswordException) {\n          if (e.code === PasswordResponses.NEED_PASSWORD) {\n            handler.send('NeedPassword', e);\n          } else if (e.code === PasswordResponses.INCORRECT_PASSWORD) {\n            handler.send('IncorrectPassword', e);\n          }\n        } else if (e instanceof InvalidPDFException) {\n          handler.send('InvalidPDF', e);\n        } else if (e instanceof MissingPDFException) {\n          handler.send('MissingPDF', e);\n        } else if (e instanceof UnexpectedResponseException) {\n          handler.send('UnexpectedResponse', e);\n        } else {\n          handler.send('UnknownError',\n                       new UnknownErrorException(e.message, e.toString()));\n        }\n      };\n\n      PDFJS.maxImageSize = data.maxImageSize === undefined ?\n                           -1 : data.maxImageSize;\n      PDFJS.disableFontFace = data.disableFontFace;\n      PDFJS.disableCreateObjectURL = data.disableCreateObjectURL;\n      PDFJS.verbosity = data.verbosity;\n      PDFJS.cMapUrl = data.cMapUrl === undefined ?\n                           null : data.cMapUrl;\n      PDFJS.cMapPacked = data.cMapPacked === true;\n\n      getPdfManager(data).then(function () {\n        handler.send('PDFManagerReady', null);\n        pdfManager.onLoadedStream().then(function(stream) {\n          handler.send('DataLoaded', { length: stream.bytes.byteLength });\n        });\n      }).then(function pdfManagerReady() {\n        loadDocument(false).then(onSuccess, function loadFailure(ex) {\n          // Try again with recoveryMode == true\n          if (!(ex instanceof XRefParseException)) {\n            if (ex instanceof PasswordException) {\n              // after password exception prepare to receive a new password\n              // to repeat loading\n              pdfManager.passwordChanged().then(pdfManagerReady);\n            }\n\n            onFailure(ex);\n            return;\n          }\n\n          pdfManager.requestLoadedStream();\n          pdfManager.onLoadedStream().then(function() {\n            loadDocument(true).then(onSuccess, onFailure);\n          });\n        }, onFailure);\n      }, onFailure);\n    });\n\n    handler.on('GetPage', function wphSetupGetPage(data) {\n      return pdfManager.getPage(data.pageIndex).then(function(page) {\n        var rotatePromise = pdfManager.ensure(page, 'rotate');\n        var refPromise = pdfManager.ensure(page, 'ref');\n        var viewPromise = pdfManager.ensure(page, 'view');\n\n        return Promise.all([rotatePromise, refPromise, viewPromise]).then(\n            function(results) {\n          return {\n            rotate: results[0],\n            ref: results[1],\n            view: results[2]\n          };\n        });\n      });\n    });\n\n    handler.on('GetPageIndex', function wphSetupGetPageIndex(data) {\n      var ref = new Ref(data.ref.num, data.ref.gen);\n      var catalog = pdfManager.pdfDocument.catalog;\n      return catalog.getPageIndex(ref);\n    });\n\n    handler.on('GetDestinations',\n      function wphSetupGetDestinations(data) {\n        return pdfManager.ensureCatalog('destinations');\n      }\n    );\n\n    handler.on('GetDestination',\n      function wphSetupGetDestination(data) {\n        return pdfManager.ensureCatalog('getDestination', [ data.id ]);\n      }\n    );\n\n    handler.on('GetAttachments',\n      function wphSetupGetAttachments(data) {\n        return pdfManager.ensureCatalog('attachments');\n      }\n    );\n\n    handler.on('GetJavaScript',\n      function wphSetupGetJavaScript(data) {\n        return pdfManager.ensureCatalog('javaScript');\n      }\n    );\n\n    handler.on('GetOutline',\n      function wphSetupGetOutline(data) {\n        return pdfManager.ensureCatalog('documentOutline');\n      }\n    );\n\n    handler.on('GetMetadata',\n      function wphSetupGetMetadata(data) {\n        return Promise.all([pdfManager.ensureDoc('documentInfo'),\n                            pdfManager.ensureCatalog('metadata')]);\n      }\n    );\n\n    handler.on('GetData', function wphSetupGetData(data) {\n      pdfManager.requestLoadedStream();\n      return pdfManager.onLoadedStream().then(function(stream) {\n        return stream.bytes;\n      });\n    });\n\n    handler.on('GetStats',\n      function wphSetupGetStats(data) {\n        return pdfManager.pdfDocument.xref.stats;\n      }\n    );\n\n    handler.on('UpdatePassword', function wphSetupUpdatePassword(data) {\n      pdfManager.updatePassword(data);\n    });\n\n    handler.on('GetAnnotations', function wphSetupGetAnnotations(data) {\n      return pdfManager.getPage(data.pageIndex).then(function(page) {\n        return pdfManager.ensure(page, 'getAnnotationsData', []);\n      });\n    });\n\n    handler.on('RenderPageRequest', function wphSetupRenderPage(data) {\n      pdfManager.getPage(data.pageIndex).then(function(page) {\n\n        var pageNum = data.pageIndex + 1;\n        var start = Date.now();\n        // Pre compile the pdf page and fetch the fonts/images.\n        page.getOperatorList(handler, data.intent).then(function(operatorList) {\n\n          info('page=' + pageNum + ' - getOperatorList: time=' +\n               (Date.now() - start) + 'ms, len=' + operatorList.fnArray.length);\n\n        }, function(e) {\n\n          var minimumStackMessage =\n            'worker.js: while trying to getPage() and getOperatorList()';\n\n          var wrappedException;\n\n          // Turn the error into an obj that can be serialized\n          if (typeof e === 'string') {\n            wrappedException = {\n              message: e,\n              stack: minimumStackMessage\n            };\n          } else if (typeof e === 'object') {\n            wrappedException = {\n              message: e.message || e.toString(),\n              stack: e.stack || minimumStackMessage\n            };\n          } else {\n            wrappedException = {\n              message: 'Unknown exception type: ' + (typeof e),\n              stack: minimumStackMessage\n            };\n          }\n\n          handler.send('PageError', {\n            pageNum: pageNum,\n            error: wrappedException,\n            intent: data.intent\n          });\n        });\n      });\n    }, this);\n\n    handler.on('GetTextContent', function wphExtractText(data) {\n      return pdfManager.getPage(data.pageIndex).then(function(page) {\n        var pageNum = data.pageIndex + 1;\n        var start = Date.now();\n        return page.extractTextContent().then(function(textContent) {\n          info('text indexing: page=' + pageNum + ' - time=' +\n               (Date.now() - start) + 'ms');\n          return textContent;\n        });\n      });\n    });\n\n    handler.on('Cleanup', function wphCleanup(data) {\n      return pdfManager.cleanup();\n    });\n\n    handler.on('Terminate', function wphTerminate(data) {\n      pdfManager.terminate();\n    });\n  }\n};\n\nvar consoleTimer = {};\n\nvar workerConsole = {\n  log: function log() {\n    var args = Array.prototype.slice.call(arguments);\n    globalScope.postMessage({\n      action: 'console_log',\n      data: args\n    });\n  },\n\n  error: function error() {\n    var args = Array.prototype.slice.call(arguments);\n    globalScope.postMessage({\n      action: 'console_error',\n      data: args\n    });\n    throw 'pdf.js execution error';\n  },\n\n  time: function time(name) {\n    consoleTimer[name] = Date.now();\n  },\n\n  timeEnd: function timeEnd(name) {\n    var time = consoleTimer[name];\n    if (!time) {\n      error('Unknown timer name ' + name);\n    }\n    this.log('Timer:', name, Date.now() - time);\n  }\n};\n\n\n// Worker thread?\nif (typeof window === 'undefined') {\n  if (!('console' in globalScope)) {\n    globalScope.console = workerConsole;\n  }\n\n  // Listen for unsupported features so we can pass them on to the main thread.\n  PDFJS.UnsupportedManager.listen(function (msg) {\n    globalScope.postMessage({\n      action: '_unsupported_feature',\n      data: msg\n    });\n  });\n\n  var handler = new MessageHandler('worker_processor', this);\n  WorkerMessageHandler.setup(handler);\n}\n\n\n/* This class implements the QM Coder decoding as defined in\n *   JPEG 2000 Part I Final Committee Draft Version 1.0\n *   Annex C.3 Arithmetic decoding procedure\n * available at http://www.jpeg.org/public/fcd15444-1.pdf\n *\n * The arithmetic decoder is used in conjunction with context models to decode\n * JPEG2000 and JBIG2 streams.\n */\nvar ArithmeticDecoder = (function ArithmeticDecoderClosure() {\n  // Table C-2\n  var QeTable = [\n    {qe: 0x5601, nmps: 1, nlps: 1, switchFlag: 1},\n    {qe: 0x3401, nmps: 2, nlps: 6, switchFlag: 0},\n    {qe: 0x1801, nmps: 3, nlps: 9, switchFlag: 0},\n    {qe: 0x0AC1, nmps: 4, nlps: 12, switchFlag: 0},\n    {qe: 0x0521, nmps: 5, nlps: 29, switchFlag: 0},\n    {qe: 0x0221, nmps: 38, nlps: 33, switchFlag: 0},\n    {qe: 0x5601, nmps: 7, nlps: 6, switchFlag: 1},\n    {qe: 0x5401, nmps: 8, nlps: 14, switchFlag: 0},\n    {qe: 0x4801, nmps: 9, nlps: 14, switchFlag: 0},\n    {qe: 0x3801, nmps: 10, nlps: 14, switchFlag: 0},\n    {qe: 0x3001, nmps: 11, nlps: 17, switchFlag: 0},\n    {qe: 0x2401, nmps: 12, nlps: 18, switchFlag: 0},\n    {qe: 0x1C01, nmps: 13, nlps: 20, switchFlag: 0},\n    {qe: 0x1601, nmps: 29, nlps: 21, switchFlag: 0},\n    {qe: 0x5601, nmps: 15, nlps: 14, switchFlag: 1},\n    {qe: 0x5401, nmps: 16, nlps: 14, switchFlag: 0},\n    {qe: 0x5101, nmps: 17, nlps: 15, switchFlag: 0},\n    {qe: 0x4801, nmps: 18, nlps: 16, switchFlag: 0},\n    {qe: 0x3801, nmps: 19, nlps: 17, switchFlag: 0},\n    {qe: 0x3401, nmps: 20, nlps: 18, switchFlag: 0},\n    {qe: 0x3001, nmps: 21, nlps: 19, switchFlag: 0},\n    {qe: 0x2801, nmps: 22, nlps: 19, switchFlag: 0},\n    {qe: 0x2401, nmps: 23, nlps: 20, switchFlag: 0},\n    {qe: 0x2201, nmps: 24, nlps: 21, switchFlag: 0},\n    {qe: 0x1C01, nmps: 25, nlps: 22, switchFlag: 0},\n    {qe: 0x1801, nmps: 26, nlps: 23, switchFlag: 0},\n    {qe: 0x1601, nmps: 27, nlps: 24, switchFlag: 0},\n    {qe: 0x1401, nmps: 28, nlps: 25, switchFlag: 0},\n    {qe: 0x1201, nmps: 29, nlps: 26, switchFlag: 0},\n    {qe: 0x1101, nmps: 30, nlps: 27, switchFlag: 0},\n    {qe: 0x0AC1, nmps: 31, nlps: 28, switchFlag: 0},\n    {qe: 0x09C1, nmps: 32, nlps: 29, switchFlag: 0},\n    {qe: 0x08A1, nmps: 33, nlps: 30, switchFlag: 0},\n    {qe: 0x0521, nmps: 34, nlps: 31, switchFlag: 0},\n    {qe: 0x0441, nmps: 35, nlps: 32, switchFlag: 0},\n    {qe: 0x02A1, nmps: 36, nlps: 33, switchFlag: 0},\n    {qe: 0x0221, nmps: 37, nlps: 34, switchFlag: 0},\n    {qe: 0x0141, nmps: 38, nlps: 35, switchFlag: 0},\n    {qe: 0x0111, nmps: 39, nlps: 36, switchFlag: 0},\n    {qe: 0x0085, nmps: 40, nlps: 37, switchFlag: 0},\n    {qe: 0x0049, nmps: 41, nlps: 38, switchFlag: 0},\n    {qe: 0x0025, nmps: 42, nlps: 39, switchFlag: 0},\n    {qe: 0x0015, nmps: 43, nlps: 40, switchFlag: 0},\n    {qe: 0x0009, nmps: 44, nlps: 41, switchFlag: 0},\n    {qe: 0x0005, nmps: 45, nlps: 42, switchFlag: 0},\n    {qe: 0x0001, nmps: 45, nlps: 43, switchFlag: 0},\n    {qe: 0x5601, nmps: 46, nlps: 46, switchFlag: 0}\n  ];\n\n  // C.3.5 Initialisation of the decoder (INITDEC)\n  function ArithmeticDecoder(data, start, end) {\n    this.data = data;\n    this.bp = start;\n    this.dataEnd = end;\n\n    this.chigh = data[start];\n    this.clow = 0;\n\n    this.byteIn();\n\n    this.chigh = ((this.chigh << 7) & 0xFFFF) | ((this.clow >> 9) & 0x7F);\n    this.clow = (this.clow << 7) & 0xFFFF;\n    this.ct -= 7;\n    this.a = 0x8000;\n  }\n\n  ArithmeticDecoder.prototype = {\n    // C.3.4 Compressed data input (BYTEIN)\n    byteIn: function ArithmeticDecoder_byteIn() {\n      var data = this.data;\n      var bp = this.bp;\n      if (data[bp] === 0xFF) {\n        var b1 = data[bp + 1];\n        if (b1 > 0x8F) {\n          this.clow += 0xFF00;\n          this.ct = 8;\n        } else {\n          bp++;\n          this.clow += (data[bp] << 9);\n          this.ct = 7;\n          this.bp = bp;\n        }\n      } else {\n        bp++;\n        this.clow += bp < this.dataEnd ? (data[bp] << 8) : 0xFF00;\n        this.ct = 8;\n        this.bp = bp;\n      }\n      if (this.clow > 0xFFFF) {\n        this.chigh += (this.clow >> 16);\n        this.clow &= 0xFFFF;\n      }\n    },\n    // C.3.2 Decoding a decision (DECODE)\n    readBit: function ArithmeticDecoder_readBit(contexts, pos) {\n      // contexts are packed into 1 byte:\n      // highest 7 bits carry cx.index, lowest bit carries cx.mps\n      var cx_index = contexts[pos] >> 1, cx_mps = contexts[pos] & 1;\n      var qeTableIcx = QeTable[cx_index];\n      var qeIcx = qeTableIcx.qe;\n      var d;\n      var a = this.a - qeIcx;\n\n      if (this.chigh < qeIcx) {\n        // exchangeLps\n        if (a < qeIcx) {\n          a = qeIcx;\n          d = cx_mps;\n          cx_index = qeTableIcx.nmps;\n        } else {\n          a = qeIcx;\n          d = 1 ^ cx_mps;\n          if (qeTableIcx.switchFlag === 1) {\n            cx_mps = d;\n          }\n          cx_index = qeTableIcx.nlps;\n        }\n      } else {\n        this.chigh -= qeIcx;\n        if ((a & 0x8000) !== 0) {\n          this.a = a;\n          return cx_mps;\n        }\n        // exchangeMps\n        if (a < qeIcx) {\n          d = 1 ^ cx_mps;\n          if (qeTableIcx.switchFlag === 1) {\n            cx_mps = d;\n          }\n          cx_index = qeTableIcx.nlps;\n        } else {\n          d = cx_mps;\n          cx_index = qeTableIcx.nmps;\n        }\n      }\n      // C.3.3 renormD;\n      do {\n        if (this.ct === 0) {\n          this.byteIn();\n        }\n\n        a <<= 1;\n        this.chigh = ((this.chigh << 1) & 0xFFFF) | ((this.clow >> 15) & 1);\n        this.clow = (this.clow << 1) & 0xFFFF;\n        this.ct--;\n      } while ((a & 0x8000) === 0);\n      this.a = a;\n\n      contexts[pos] = cx_index << 1 | cx_mps;\n      return d;\n    }\n  };\n\n  return ArithmeticDecoder;\n})();\n\n\nvar JpegImage = (function jpegImage() {\n  var dctZigZag = new Uint8Array([\n     0,\n     1,  8,\n    16,  9,  2,\n     3, 10, 17, 24,\n    32, 25, 18, 11, 4,\n     5, 12, 19, 26, 33, 40,\n    48, 41, 34, 27, 20, 13,  6,\n     7, 14, 21, 28, 35, 42, 49, 56,\n    57, 50, 43, 36, 29, 22, 15,\n    23, 30, 37, 44, 51, 58,\n    59, 52, 45, 38, 31,\n    39, 46, 53, 60,\n    61, 54, 47,\n    55, 62,\n    63\n  ]);\n\n  var dctCos1  =  4017;   // cos(pi/16)\n  var dctSin1  =   799;   // sin(pi/16)\n  var dctCos3  =  3406;   // cos(3*pi/16)\n  var dctSin3  =  2276;   // sin(3*pi/16)\n  var dctCos6  =  1567;   // cos(6*pi/16)\n  var dctSin6  =  3784;   // sin(6*pi/16)\n  var dctSqrt2 =  5793;   // sqrt(2)\n  var dctSqrt1d2 = 2896;  // sqrt(2) / 2\n\n  function constructor() {\n  }\n\n  function buildHuffmanTable(codeLengths, values) {\n    var k = 0, code = [], i, j, length = 16;\n    while (length > 0 && !codeLengths[length - 1]) {\n      length--;\n    }\n    code.push({children: [], index: 0});\n    var p = code[0], q;\n    for (i = 0; i < length; i++) {\n      for (j = 0; j < codeLengths[i]; j++) {\n        p = code.pop();\n        p.children[p.index] = values[k];\n        while (p.index > 0) {\n          p = code.pop();\n        }\n        p.index++;\n        code.push(p);\n        while (code.length <= i) {\n          code.push(q = {children: [], index: 0});\n          p.children[p.index] = q.children;\n          p = q;\n        }\n        k++;\n      }\n      if (i + 1 < length) {\n        // p here points to last code\n        code.push(q = {children: [], index: 0});\n        p.children[p.index] = q.children;\n        p = q;\n      }\n    }\n    return code[0].children;\n  }\n\n  function getBlockBufferOffset(component, row, col) {\n    return 64 * ((component.blocksPerLine + 1) * row + col);\n  }\n\n  function decodeScan(data, offset, frame, components, resetInterval,\n                      spectralStart, spectralEnd, successivePrev, successive) {\n    var precision = frame.precision;\n    var samplesPerLine = frame.samplesPerLine;\n    var scanLines = frame.scanLines;\n    var mcusPerLine = frame.mcusPerLine;\n    var progressive = frame.progressive;\n    var maxH = frame.maxH, maxV = frame.maxV;\n\n    var startOffset = offset, bitsData = 0, bitsCount = 0;\n\n    function readBit() {\n      if (bitsCount > 0) {\n        bitsCount--;\n        return (bitsData >> bitsCount) & 1;\n      }\n      bitsData = data[offset++];\n      if (bitsData === 0xFF) {\n        var nextByte = data[offset++];\n        if (nextByte) {\n          throw 'unexpected marker: ' +\n            ((bitsData << 8) | nextByte).toString(16);\n        }\n        // unstuff 0\n      }\n      bitsCount = 7;\n      return bitsData >>> 7;\n    }\n\n    function decodeHuffman(tree) {\n      var node = tree;\n      while (true) {\n        node = node[readBit()];\n        if (typeof node === 'number') {\n          return node;\n        }\n        if (typeof node !== 'object') {\n          throw 'invalid huffman sequence';\n        }\n      }\n    }\n\n    function receive(length) {\n      var n = 0;\n      while (length > 0) {\n        n = (n << 1) | readBit();\n        length--;\n      }\n      return n;\n    }\n\n    function receiveAndExtend(length) {\n      if (length === 1) {\n        return readBit() === 1 ? 1 : -1;\n      }\n      var n = receive(length);\n      if (n >= 1 << (length - 1)) {\n        return n;\n      }\n      return n + (-1 << length) + 1;\n    }\n\n    function decodeBaseline(component, offset) {\n      var t = decodeHuffman(component.huffmanTableDC);\n      var diff = t === 0 ? 0 : receiveAndExtend(t);\n      component.blockData[offset] = (component.pred += diff);\n      var k = 1;\n      while (k < 64) {\n        var rs = decodeHuffman(component.huffmanTableAC);\n        var s = rs & 15, r = rs >> 4;\n        if (s === 0) {\n          if (r < 15) {\n            break;\n          }\n          k += 16;\n          continue;\n        }\n        k += r;\n        var z = dctZigZag[k];\n        component.blockData[offset + z] = receiveAndExtend(s);\n        k++;\n      }\n    }\n\n    function decodeDCFirst(component, offset) {\n      var t = decodeHuffman(component.huffmanTableDC);\n      var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive);\n      component.blockData[offset] = (component.pred += diff);\n    }\n\n    function decodeDCSuccessive(component, offset) {\n      component.blockData[offset] |= readBit() << successive;\n    }\n\n    var eobrun = 0;\n    function decodeACFirst(component, offset) {\n      if (eobrun > 0) {\n        eobrun--;\n        return;\n      }\n      var k = spectralStart, e = spectralEnd;\n      while (k <= e) {\n        var rs = decodeHuffman(component.huffmanTableAC);\n        var s = rs & 15, r = rs >> 4;\n        if (s === 0) {\n          if (r < 15) {\n            eobrun = receive(r) + (1 << r) - 1;\n            break;\n          }\n          k += 16;\n          continue;\n        }\n        k += r;\n        var z = dctZigZag[k];\n        component.blockData[offset + z] =\n          receiveAndExtend(s) * (1 << successive);\n        k++;\n      }\n    }\n\n    var successiveACState = 0, successiveACNextValue;\n    function decodeACSuccessive(component, offset) {\n      var k = spectralStart;\n      var e = spectralEnd;\n      var r = 0;\n      var s;\n      var rs;\n      while (k <= e) {\n        var z = dctZigZag[k];\n        switch (successiveACState) {\n        case 0: // initial state\n          rs = decodeHuffman(component.huffmanTableAC);\n          s = rs & 15;\n          r = rs >> 4;\n          if (s === 0) {\n            if (r < 15) {\n              eobrun = receive(r) + (1 << r);\n              successiveACState = 4;\n            } else {\n              r = 16;\n              successiveACState = 1;\n            }\n          } else {\n            if (s !== 1) {\n              throw 'invalid ACn encoding';\n            }\n            successiveACNextValue = receiveAndExtend(s);\n            successiveACState = r ? 2 : 3;\n          }\n          continue;\n        case 1: // skipping r zero items\n        case 2:\n          if (component.blockData[offset + z]) {\n            component.blockData[offset + z] += (readBit() << successive);\n          } else {\n            r--;\n            if (r === 0) {\n              successiveACState = successiveACState === 2 ? 3 : 0;\n            }\n          }\n          break;\n        case 3: // set value for a zero item\n          if (component.blockData[offset + z]) {\n            component.blockData[offset + z] += (readBit() << successive);\n          } else {\n            component.blockData[offset + z] =\n              successiveACNextValue << successive;\n            successiveACState = 0;\n          }\n          break;\n        case 4: // eob\n          if (component.blockData[offset + z]) {\n            component.blockData[offset + z] += (readBit() << successive);\n          }\n          break;\n        }\n        k++;\n      }\n      if (successiveACState === 4) {\n        eobrun--;\n        if (eobrun === 0) {\n          successiveACState = 0;\n        }\n      }\n    }\n\n    function decodeMcu(component, decode, mcu, row, col) {\n      var mcuRow = (mcu / mcusPerLine) | 0;\n      var mcuCol = mcu % mcusPerLine;\n      var blockRow = mcuRow * component.v + row;\n      var blockCol = mcuCol * component.h + col;\n      var offset = getBlockBufferOffset(component, blockRow, blockCol);\n      decode(component, offset);\n    }\n\n    function decodeBlock(component, decode, mcu) {\n      var blockRow = (mcu / component.blocksPerLine) | 0;\n      var blockCol = mcu % component.blocksPerLine;\n      var offset = getBlockBufferOffset(component, blockRow, blockCol);\n      decode(component, offset);\n    }\n\n    var componentsLength = components.length;\n    var component, i, j, k, n;\n    var decodeFn;\n    if (progressive) {\n      if (spectralStart === 0) {\n        decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;\n      } else {\n        decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;\n      }\n    } else {\n      decodeFn = decodeBaseline;\n    }\n\n    var mcu = 0, marker;\n    var mcuExpected;\n    if (componentsLength === 1) {\n      mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;\n    } else {\n      mcuExpected = mcusPerLine * frame.mcusPerColumn;\n    }\n    if (!resetInterval) {\n      resetInterval = mcuExpected;\n    }\n\n    var h, v;\n    while (mcu < mcuExpected) {\n      // reset interval stuff\n      for (i = 0; i < componentsLength; i++) {\n        components[i].pred = 0;\n      }\n      eobrun = 0;\n\n      if (componentsLength === 1) {\n        component = components[0];\n        for (n = 0; n < resetInterval; n++) {\n          decodeBlock(component, decodeFn, mcu);\n          mcu++;\n        }\n      } else {\n        for (n = 0; n < resetInterval; n++) {\n          for (i = 0; i < componentsLength; i++) {\n            component = components[i];\n            h = component.h;\n            v = component.v;\n            for (j = 0; j < v; j++) {\n              for (k = 0; k < h; k++) {\n                decodeMcu(component, decodeFn, mcu, j, k);\n              }\n            }\n          }\n          mcu++;\n        }\n      }\n\n      // find marker\n      bitsCount = 0;\n      marker = (data[offset] << 8) | data[offset + 1];\n      if (marker <= 0xFF00) {\n        throw 'marker was not found';\n      }\n\n      if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx\n        offset += 2;\n      } else {\n        break;\n      }\n    }\n\n    return offset - startOffset;\n  }\n\n  // A port of poppler's IDCT method which in turn is taken from:\n  //   Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,\n  //   'Practical Fast 1-D DCT Algorithms with 11 Multiplications',\n  //   IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,\n  //   988-991.\n  function quantizeAndInverse(component, blockBufferOffset, p) {\n    var qt = component.quantizationTable, blockData = component.blockData;\n    var v0, v1, v2, v3, v4, v5, v6, v7;\n    var p0, p1, p2, p3, p4, p5, p6, p7;\n    var t;\n\n    // inverse DCT on rows\n    for (var row = 0; row < 64; row += 8) {\n      // gather block data\n      p0 = blockData[blockBufferOffset + row];\n      p1 = blockData[blockBufferOffset + row + 1];\n      p2 = blockData[blockBufferOffset + row + 2];\n      p3 = blockData[blockBufferOffset + row + 3];\n      p4 = blockData[blockBufferOffset + row + 4];\n      p5 = blockData[blockBufferOffset + row + 5];\n      p6 = blockData[blockBufferOffset + row + 6];\n      p7 = blockData[blockBufferOffset + row + 7];\n\n      // dequant p0\n      p0 *= qt[row];\n\n      // check for all-zero AC coefficients\n      if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {\n        t = (dctSqrt2 * p0 + 512) >> 10;\n        p[row] = t;\n        p[row + 1] = t;\n        p[row + 2] = t;\n        p[row + 3] = t;\n        p[row + 4] = t;\n        p[row + 5] = t;\n        p[row + 6] = t;\n        p[row + 7] = t;\n        continue;\n      }\n      // dequant p1 ... p7\n      p1 *= qt[row + 1];\n      p2 *= qt[row + 2];\n      p3 *= qt[row + 3];\n      p4 *= qt[row + 4];\n      p5 *= qt[row + 5];\n      p6 *= qt[row + 6];\n      p7 *= qt[row + 7];\n\n      // stage 4\n      v0 = (dctSqrt2 * p0 + 128) >> 8;\n      v1 = (dctSqrt2 * p4 + 128) >> 8;\n      v2 = p2;\n      v3 = p6;\n      v4 = (dctSqrt1d2 * (p1 - p7) + 128) >> 8;\n      v7 = (dctSqrt1d2 * (p1 + p7) + 128) >> 8;\n      v5 = p3 << 4;\n      v6 = p5 << 4;\n\n      // stage 3\n      v0 = (v0 + v1 + 1) >> 1;\n      v1 = v0 - v1;\n      t  = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;\n      v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;\n      v3 = t;\n      v4 = (v4 + v6 + 1) >> 1;\n      v6 = v4 - v6;\n      v7 = (v7 + v5 + 1) >> 1;\n      v5 = v7 - v5;\n\n      // stage 2\n      v0 = (v0 + v3 + 1) >> 1;\n      v3 = v0 - v3;\n      v1 = (v1 + v2 + 1) >> 1;\n      v2 = v1 - v2;\n      t  = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;\n      v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;\n      v7 = t;\n      t  = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;\n      v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;\n      v6 = t;\n\n      // stage 1\n      p[row] = v0 + v7;\n      p[row + 7] = v0 - v7;\n      p[row + 1] = v1 + v6;\n      p[row + 6] = v1 - v6;\n      p[row + 2] = v2 + v5;\n      p[row + 5] = v2 - v5;\n      p[row + 3] = v3 + v4;\n      p[row + 4] = v3 - v4;\n    }\n\n    // inverse DCT on columns\n    for (var col = 0; col < 8; ++col) {\n      p0 = p[col];\n      p1 = p[col +  8];\n      p2 = p[col + 16];\n      p3 = p[col + 24];\n      p4 = p[col + 32];\n      p5 = p[col + 40];\n      p6 = p[col + 48];\n      p7 = p[col + 56];\n\n      // check for all-zero AC coefficients\n      if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {\n        t = (dctSqrt2 * p0 + 8192) >> 14;\n        // convert to 8 bit\n        t = (t < -2040) ? 0 : (t >= 2024) ? 255 : (t + 2056) >> 4;\n        blockData[blockBufferOffset + col] = t;\n        blockData[blockBufferOffset + col +  8] = t;\n        blockData[blockBufferOffset + col + 16] = t;\n        blockData[blockBufferOffset + col + 24] = t;\n        blockData[blockBufferOffset + col + 32] = t;\n        blockData[blockBufferOffset + col + 40] = t;\n        blockData[blockBufferOffset + col + 48] = t;\n        blockData[blockBufferOffset + col + 56] = t;\n        continue;\n      }\n\n      // stage 4\n      v0 = (dctSqrt2 * p0 + 2048) >> 12;\n      v1 = (dctSqrt2 * p4 + 2048) >> 12;\n      v2 = p2;\n      v3 = p6;\n      v4 = (dctSqrt1d2 * (p1 - p7) + 2048) >> 12;\n      v7 = (dctSqrt1d2 * (p1 + p7) + 2048) >> 12;\n      v5 = p3;\n      v6 = p5;\n\n      // stage 3\n      // Shift v0 by 128.5 << 5 here, so we don't need to shift p0...p7 when\n      // converting to UInt8 range later.\n      v0 = ((v0 + v1 + 1) >> 1) + 4112;\n      v1 = v0 - v1;\n      t  = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;\n      v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;\n      v3 = t;\n      v4 = (v4 + v6 + 1) >> 1;\n      v6 = v4 - v6;\n      v7 = (v7 + v5 + 1) >> 1;\n      v5 = v7 - v5;\n\n      // stage 2\n      v0 = (v0 + v3 + 1) >> 1;\n      v3 = v0 - v3;\n      v1 = (v1 + v2 + 1) >> 1;\n      v2 = v1 - v2;\n      t  = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;\n      v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;\n      v7 = t;\n      t  = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;\n      v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;\n      v6 = t;\n\n      // stage 1\n      p0 = v0 + v7;\n      p7 = v0 - v7;\n      p1 = v1 + v6;\n      p6 = v1 - v6;\n      p2 = v2 + v5;\n      p5 = v2 - v5;\n      p3 = v3 + v4;\n      p4 = v3 - v4;\n\n      // convert to 8-bit integers\n      p0 = (p0 < 16) ? 0 : (p0 >= 4080) ? 255 : p0 >> 4;\n      p1 = (p1 < 16) ? 0 : (p1 >= 4080) ? 255 : p1 >> 4;\n      p2 = (p2 < 16) ? 0 : (p2 >= 4080) ? 255 : p2 >> 4;\n      p3 = (p3 < 16) ? 0 : (p3 >= 4080) ? 255 : p3 >> 4;\n      p4 = (p4 < 16) ? 0 : (p4 >= 4080) ? 255 : p4 >> 4;\n      p5 = (p5 < 16) ? 0 : (p5 >= 4080) ? 255 : p5 >> 4;\n      p6 = (p6 < 16) ? 0 : (p6 >= 4080) ? 255 : p6 >> 4;\n      p7 = (p7 < 16) ? 0 : (p7 >= 4080) ? 255 : p7 >> 4;\n\n      // store block data\n      blockData[blockBufferOffset + col] = p0;\n      blockData[blockBufferOffset + col +  8] = p1;\n      blockData[blockBufferOffset + col + 16] = p2;\n      blockData[blockBufferOffset + col + 24] = p3;\n      blockData[blockBufferOffset + col + 32] = p4;\n      blockData[blockBufferOffset + col + 40] = p5;\n      blockData[blockBufferOffset + col + 48] = p6;\n      blockData[blockBufferOffset + col + 56] = p7;\n    }\n  }\n\n  function buildComponentData(frame, component) {\n    var blocksPerLine = component.blocksPerLine;\n    var blocksPerColumn = component.blocksPerColumn;\n    var computationBuffer = new Int16Array(64);\n\n    for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {\n      for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {\n        var offset = getBlockBufferOffset(component, blockRow, blockCol);\n        quantizeAndInverse(component, offset, computationBuffer);\n      }\n    }\n    return component.blockData;\n  }\n\n  function clamp0to255(a) {\n    return a <= 0 ? 0 : a >= 255 ? 255 : a;\n  }\n\n  constructor.prototype = {\n    parse: function parse(data) {\n\n      function readUint16() {\n        var value = (data[offset] << 8) | data[offset + 1];\n        offset += 2;\n        return value;\n      }\n\n      function readDataBlock() {\n        var length = readUint16();\n        var array = data.subarray(offset, offset + length - 2);\n        offset += array.length;\n        return array;\n      }\n\n      function prepareComponents(frame) {\n        var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH);\n        var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV);\n        for (var i = 0; i < frame.components.length; i++) {\n          component = frame.components[i];\n          var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) *\n                                        component.h / frame.maxH);\n          var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines  / 8) *\n                                          component.v / frame.maxV);\n          var blocksPerLineForMcu = mcusPerLine * component.h;\n          var blocksPerColumnForMcu = mcusPerColumn * component.v;\n\n          var blocksBufferSize = 64 * blocksPerColumnForMcu *\n                                      (blocksPerLineForMcu + 1);\n          component.blockData = new Int16Array(blocksBufferSize);\n          component.blocksPerLine = blocksPerLine;\n          component.blocksPerColumn = blocksPerColumn;\n        }\n        frame.mcusPerLine = mcusPerLine;\n        frame.mcusPerColumn = mcusPerColumn;\n      }\n\n      var offset = 0, length = data.length;\n      var jfif = null;\n      var adobe = null;\n      var pixels = null;\n      var frame, resetInterval;\n      var quantizationTables = [];\n      var huffmanTablesAC = [], huffmanTablesDC = [];\n      var fileMarker = readUint16();\n      if (fileMarker !== 0xFFD8) { // SOI (Start of Image)\n        throw 'SOI not found';\n      }\n\n      fileMarker = readUint16();\n      while (fileMarker !== 0xFFD9) { // EOI (End of image)\n        var i, j, l;\n        switch(fileMarker) {\n          case 0xFFE0: // APP0 (Application Specific)\n          case 0xFFE1: // APP1\n          case 0xFFE2: // APP2\n          case 0xFFE3: // APP3\n          case 0xFFE4: // APP4\n          case 0xFFE5: // APP5\n          case 0xFFE6: // APP6\n          case 0xFFE7: // APP7\n          case 0xFFE8: // APP8\n          case 0xFFE9: // APP9\n          case 0xFFEA: // APP10\n          case 0xFFEB: // APP11\n          case 0xFFEC: // APP12\n          case 0xFFED: // APP13\n          case 0xFFEE: // APP14\n          case 0xFFEF: // APP15\n          case 0xFFFE: // COM (Comment)\n            var appData = readDataBlock();\n\n            if (fileMarker === 0xFFE0) {\n              if (appData[0] === 0x4A && appData[1] === 0x46 &&\n                  appData[2] === 0x49 && appData[3] === 0x46 &&\n                  appData[4] === 0) { // 'JFIF\\x00'\n                jfif = {\n                  version: { major: appData[5], minor: appData[6] },\n                  densityUnits: appData[7],\n                  xDensity: (appData[8] << 8) | appData[9],\n                  yDensity: (appData[10] << 8) | appData[11],\n                  thumbWidth: appData[12],\n                  thumbHeight: appData[13],\n                  thumbData: appData.subarray(14, 14 +\n                                              3 * appData[12] * appData[13])\n                };\n              }\n            }\n            // TODO APP1 - Exif\n            if (fileMarker === 0xFFEE) {\n              if (appData[0] === 0x41 && appData[1] === 0x64 &&\n                  appData[2] === 0x6F && appData[3] === 0x62 &&\n                  appData[4] === 0x65) { // 'Adobe'\n                adobe = {\n                  version: (appData[5] << 8) | appData[6],\n                  flags0: (appData[7] << 8) | appData[8],\n                  flags1: (appData[9] << 8) | appData[10],\n                  transformCode: appData[11]\n                };\n              }\n            }\n            break;\n\n          case 0xFFDB: // DQT (Define Quantization Tables)\n            var quantizationTablesLength = readUint16();\n            var quantizationTablesEnd = quantizationTablesLength + offset - 2;\n            var z;\n            while (offset < quantizationTablesEnd) {\n              var quantizationTableSpec = data[offset++];\n              var tableData = new Uint16Array(64);\n              if ((quantizationTableSpec >> 4) === 0) { // 8 bit values\n                for (j = 0; j < 64; j++) {\n                  z = dctZigZag[j];\n                  tableData[z] = data[offset++];\n                }\n              } else if ((quantizationTableSpec >> 4) === 1) { //16 bit\n                for (j = 0; j < 64; j++) {\n                  z = dctZigZag[j];\n                  tableData[z] = readUint16();\n                }\n              } else {\n                throw 'DQT: invalid table spec';\n              }\n              quantizationTables[quantizationTableSpec & 15] = tableData;\n            }\n            break;\n\n          case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT)\n          case 0xFFC1: // SOF1 (Start of Frame, Extended DCT)\n          case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT)\n            if (frame) {\n              throw 'Only single frame JPEGs supported';\n            }\n            readUint16(); // skip data length\n            frame = {};\n            frame.extended = (fileMarker === 0xFFC1);\n            frame.progressive = (fileMarker === 0xFFC2);\n            frame.precision = data[offset++];\n            frame.scanLines = readUint16();\n            frame.samplesPerLine = readUint16();\n            frame.components = [];\n            frame.componentIds = {};\n            var componentsCount = data[offset++], componentId;\n            var maxH = 0, maxV = 0;\n            for (i = 0; i < componentsCount; i++) {\n              componentId = data[offset];\n              var h = data[offset + 1] >> 4;\n              var v = data[offset + 1] & 15;\n              if (maxH < h) {\n                maxH = h;\n              }\n              if (maxV < v) {\n                maxV = v;\n              }\n              var qId = data[offset + 2];\n              l = frame.components.push({\n                h: h,\n                v: v,\n                quantizationTable: quantizationTables[qId]\n              });\n              frame.componentIds[componentId] = l - 1;\n              offset += 3;\n            }\n            frame.maxH = maxH;\n            frame.maxV = maxV;\n            prepareComponents(frame);\n            break;\n\n          case 0xFFC4: // DHT (Define Huffman Tables)\n            var huffmanLength = readUint16();\n            for (i = 2; i < huffmanLength;) {\n              var huffmanTableSpec = data[offset++];\n              var codeLengths = new Uint8Array(16);\n              var codeLengthSum = 0;\n              for (j = 0; j < 16; j++, offset++) {\n                codeLengthSum += (codeLengths[j] = data[offset]);\n              }\n              var huffmanValues = new Uint8Array(codeLengthSum);\n              for (j = 0; j < codeLengthSum; j++, offset++) {\n                huffmanValues[j] = data[offset];\n              }\n              i += 17 + codeLengthSum;\n\n              ((huffmanTableSpec >> 4) === 0 ?\n                huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] =\n                buildHuffmanTable(codeLengths, huffmanValues);\n            }\n            break;\n\n          case 0xFFDD: // DRI (Define Restart Interval)\n            readUint16(); // skip data length\n            resetInterval = readUint16();\n            break;\n\n          case 0xFFDA: // SOS (Start of Scan)\n            var scanLength = readUint16();\n            var selectorsCount = data[offset++];\n            var components = [], component;\n            for (i = 0; i < selectorsCount; i++) {\n              var componentIndex = frame.componentIds[data[offset++]];\n              component = frame.components[componentIndex];\n              var tableSpec = data[offset++];\n              component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];\n              component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];\n              components.push(component);\n            }\n            var spectralStart = data[offset++];\n            var spectralEnd = data[offset++];\n            var successiveApproximation = data[offset++];\n            var processed = decodeScan(data, offset,\n              frame, components, resetInterval,\n              spectralStart, spectralEnd,\n              successiveApproximation >> 4, successiveApproximation & 15);\n            offset += processed;\n            break;\n\n          case 0xFFFF: // Fill bytes\n            if (data[offset] !== 0xFF) { // Avoid skipping a valid marker.\n              offset--;\n            }\n            break;\n\n          default:\n            if (data[offset - 3] === 0xFF &&\n                data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) {\n              // could be incorrect encoding -- last 0xFF byte of the previous\n              // block was eaten by the encoder\n              offset -= 3;\n              break;\n            }\n            throw 'unknown JPEG marker ' + fileMarker.toString(16);\n        }\n        fileMarker = readUint16();\n      }\n\n      this.width = frame.samplesPerLine;\n      this.height = frame.scanLines;\n      this.jfif = jfif;\n      this.adobe = adobe;\n      this.components = [];\n      for (i = 0; i < frame.components.length; i++) {\n        component = frame.components[i];\n        this.components.push({\n          output: buildComponentData(frame, component),\n          scaleX: component.h / frame.maxH,\n          scaleY: component.v / frame.maxV,\n          blocksPerLine: component.blocksPerLine,\n          blocksPerColumn: component.blocksPerColumn\n        });\n      }\n      this.numComponents = this.components.length;\n    },\n\n    _getLinearizedBlockData: function getLinearizedBlockData(width, height) {\n      var scaleX = this.width / width, scaleY = this.height / height;\n\n      var component, componentScaleX, componentScaleY, blocksPerScanline;\n      var x, y, i, j, k;\n      var index;\n      var offset = 0;\n      var output;\n      var numComponents = this.components.length;\n      var dataLength = width * height * numComponents;\n      var data = new Uint8Array(dataLength);\n      var xScaleBlockOffset = new Uint32Array(width);\n      var mask3LSB = 0xfffffff8; // used to clear the 3 LSBs\n\n      for (i = 0; i < numComponents; i++) {\n        component = this.components[i];\n        componentScaleX = component.scaleX * scaleX;\n        componentScaleY = component.scaleY * scaleY;\n        offset = i;\n        output = component.output;\n        blocksPerScanline = (component.blocksPerLine + 1) << 3;\n        // precalculate the xScaleBlockOffset\n        for (x = 0; x < width; x++) {\n          j = 0 | (x * componentScaleX);\n          xScaleBlockOffset[x] = ((j & mask3LSB) << 3) | (j & 7);\n        }\n        // linearize the blocks of the component\n        for (y = 0; y < height; y++) {\n          j = 0 | (y * componentScaleY);\n          index = blocksPerScanline * (j & mask3LSB) | ((j & 7) << 3);\n          for (x = 0; x < width; x++) {\n            data[offset] = output[index + xScaleBlockOffset[x]];\n            offset += numComponents;\n          }\n        }\n      }\n\n      // decodeTransform contains pairs of multiplier (-256..256) and additive\n      var transform = this.decodeTransform;\n      if (transform) {\n        for (i = 0; i < dataLength;) {\n          for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) {\n            data[i] = ((data[i] * transform[k]) >> 8) + transform[k + 1];\n          }\n        }\n      }\n      return data;\n    },\n\n    _isColorConversionNeeded: function isColorConversionNeeded() {\n      if (this.adobe && this.adobe.transformCode) {\n        // The adobe transform marker overrides any previous setting\n        return true;\n      } else if (this.numComponents === 3) {\n        return true;\n      } else {\n        return false;\n      }\n    },\n\n    _convertYccToRgb: function convertYccToRgb(data) {\n      var Y, Cb, Cr;\n      for (var i = 0, length = data.length; i < length; i += 3) {\n        Y  = data[i    ];\n        Cb = data[i + 1];\n        Cr = data[i + 2];\n        data[i    ] = clamp0to255(Y - 179.456 + 1.402 * Cr);\n        data[i + 1] = clamp0to255(Y + 135.459 - 0.344 * Cb - 0.714 * Cr);\n        data[i + 2] = clamp0to255(Y - 226.816 + 1.772 * Cb);\n      }\n      return data;\n    },\n\n    _convertYcckToRgb: function convertYcckToRgb(data) {\n      var Y, Cb, Cr, k;\n      var offset = 0;\n      for (var i = 0, length = data.length; i < length; i += 4) {\n        Y  = data[i];\n        Cb = data[i + 1];\n        Cr = data[i + 2];\n        k = data[i + 3];\n\n        var r = -122.67195406894 +\n          Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr -\n                5.4080610064599e-5 * Y + 0.00048449797120281 * k -\n                0.154362151871126) +\n          Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y -\n                0.00477271405408747 * k + 1.53380253221734) +\n          Y * (0.000961250184130688 * Y - 0.00266257332283933 * k +\n               0.48357088451265) +\n          k * (-0.000336197177618394 * k + 0.484791561490776);\n\n        var g = 107.268039397724 +\n          Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr +\n                0.000659397001245577 * Y + 0.000426105652938837 * k -\n                0.176491792462875) +\n          Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y +\n                0.000770482631801132 * k - 0.151051492775562) +\n          Y * (0.00126935368114843 * Y - 0.00265090189010898 * k +\n               0.25802910206845) +\n          k * (-0.000318913117588328 * k - 0.213742400323665);\n\n        var b = -20.810012546947 +\n          Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr +\n                0.0020741088115012 * Y - 0.00288260236853442 * k +\n                0.814272968359295) +\n          Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y +\n                0.000560833691242812 * k - 0.195152027534049) +\n          Y * (0.00174418132927582 * Y - 0.00255243321439347 * k +\n               0.116935020465145) +\n          k * (-0.000343531996510555 * k + 0.24165260232407);\n\n        data[offset++] = clamp0to255(r);\n        data[offset++] = clamp0to255(g);\n        data[offset++] = clamp0to255(b);\n      }\n      return data;\n    },\n\n    _convertYcckToCmyk: function convertYcckToCmyk(data) {\n      var Y, Cb, Cr;\n      for (var i = 0, length = data.length; i < length; i += 4) {\n        Y  = data[i];\n        Cb = data[i + 1];\n        Cr = data[i + 2];\n        data[i    ] = clamp0to255(434.456 - Y - 1.402 * Cr);\n        data[i + 1] = clamp0to255(119.541 - Y + 0.344 * Cb + 0.714 * Cr);\n        data[i + 2] = clamp0to255(481.816 - Y - 1.772 * Cb);\n        // K in data[i + 3] is unchanged\n      }\n      return data;\n    },\n\n    _convertCmykToRgb: function convertCmykToRgb(data) {\n      var c, m, y, k;\n      var offset = 0;\n      var min = -255 * 255 * 255;\n      var scale = 1 / 255 / 255;\n      for (var i = 0, length = data.length; i < length; i += 4) {\n        c = data[i];\n        m = data[i + 1];\n        y = data[i + 2];\n        k = data[i + 3];\n\n        var r =\n          c * (-4.387332384609988 * c + 54.48615194189176 * m +\n               18.82290502165302 * y + 212.25662451639585 * k -\n               72734.4411664936) +\n          m * (1.7149763477362134 * m - 5.6096736904047315 * y -\n               17.873870861415444 * k - 1401.7366389350734) +\n          y * (-2.5217340131683033 * y - 21.248923337353073 * k +\n               4465.541406466231) -\n          k * (21.86122147463605 * k + 48317.86113160301);\n        var g =\n          c * (8.841041422036149 * c + 60.118027045597366 * m +\n               6.871425592049007 * y + 31.159100130055922 * k -\n               20220.756542821975) +\n          m * (-15.310361306967817 * m + 17.575251261109482 * y +\n               131.35250912493976 * k - 48691.05921601825) +\n          y * (4.444339102852739 * y + 9.8632861493405 * k -\n               6341.191035517494) -\n          k * (20.737325471181034 * k + 47890.15695978492);\n        var b =\n          c * (0.8842522430003296 * c + 8.078677503112928 * m +\n               30.89978309703729 * y - 0.23883238689178934 * k -\n               3616.812083916688) +\n          m * (10.49593273432072 * m + 63.02378494754052 * y +\n               50.606957656360734 * k - 28620.90484698408) +\n          y * (0.03296041114873217 * y + 115.60384449646641 * k -\n               49363.43385999684) -\n          k * (22.33816807309886 * k + 45932.16563550634);\n\n        data[offset++] = r >= 0 ? 255 : r <= min ? 0 : 255 + r * scale | 0;\n        data[offset++] = g >= 0 ? 255 : g <= min ? 0 : 255 + g * scale | 0;\n        data[offset++] = b >= 0 ? 255 : b <= min ? 0 : 255 + b * scale | 0;\n      }\n      return data;\n    },\n\n    getData: function getData(width, height, forceRGBoutput) {\n      if (this.numComponents > 4) {\n        throw 'Unsupported color mode';\n      }\n      // type of data: Uint8Array(width * height * numComponents)\n      var data = this._getLinearizedBlockData(width, height);\n\n      if (this.numComponents === 3) {\n        return this._convertYccToRgb(data);\n      } else if (this.numComponents === 4) {\n        if (this._isColorConversionNeeded()) {\n          if (forceRGBoutput) {\n            return this._convertYcckToRgb(data);\n          } else {\n            return this._convertYcckToCmyk(data);\n          }\n        } else if (forceRGBoutput) {\n          return this._convertCmykToRgb(data);\n        }\n      }\n      return data;\n    }\n  };\n\n  return constructor;\n})();\n\n\nvar JpxImage = (function JpxImageClosure() {\n  // Table E.1\n  var SubbandsGainLog2 = {\n    'LL': 0,\n    'LH': 1,\n    'HL': 1,\n    'HH': 2\n  };\n  function JpxImage() {\n    this.failOnCorruptedImage = false;\n  }\n  JpxImage.prototype = {\n    parse: function JpxImage_parse(data) {\n\n      var head = readUint16(data, 0);\n      // No box header, immediate start of codestream (SOC)\n      if (head === 0xFF4F) {\n        this.parseCodestream(data, 0, data.length);\n        return;\n      }\n\n      var position = 0, length = data.length;\n      while (position < length) {\n        var headerSize = 8;\n        var lbox = readUint32(data, position);\n        var tbox = readUint32(data, position + 4);\n        position += headerSize;\n        if (lbox === 1) {\n          // XLBox: read UInt64 according to spec.\n          // JavaScript's int precision of 53 bit should be sufficient here.\n          lbox = readUint32(data, position) * 4294967296 +\n                 readUint32(data, position + 4);\n          position += 8;\n          headerSize += 8;\n        }\n        if (lbox === 0) {\n          lbox = length - position + headerSize;\n        }\n        if (lbox < headerSize) {\n          throw new Error('JPX Error: Invalid box field size');\n        }\n        var dataLength = lbox - headerSize;\n        var jumpDataLength = true;\n        switch (tbox) {\n          case 0x6A703268: // 'jp2h'\n            jumpDataLength = false; // parsing child boxes\n            break;\n          case 0x636F6C72: // 'colr'\n            // Colorspaces are not used, the CS from the PDF is used.\n            var method = data[position];\n            var precedence = data[position + 1];\n            var approximation = data[position + 2];\n            if (method === 1) {\n              // enumerated colorspace\n              var colorspace = readUint32(data, position + 3);\n              switch (colorspace) {\n                case 16: // this indicates a sRGB colorspace\n                case 17: // this indicates a grayscale colorspace\n                case 18: // this indicates a YUV colorspace\n                  break;\n                default:\n                  warn('Unknown colorspace ' + colorspace);\n                  break;\n              }\n            } else if (method === 2) {\n              info('ICC profile not supported');\n            }\n            break;\n          case 0x6A703263: // 'jp2c'\n            this.parseCodestream(data, position, position + dataLength);\n            break;\n          case 0x6A502020: // 'jP\\024\\024'\n            if (0x0d0a870a !== readUint32(data, position)) {\n              warn('Invalid JP2 signature');\n            }\n            break;\n          // The following header types are valid but currently not used:\n          case 0x6A501A1A: // 'jP\\032\\032'\n          case 0x66747970: // 'ftyp'\n          case 0x72726571: // 'rreq'\n          case 0x72657320: // 'res '\n          case 0x69686472: // 'ihdr'\n            break;\n          default:\n            var headerType = String.fromCharCode((tbox >> 24) & 0xFF,\n                                                 (tbox >> 16) & 0xFF,\n                                                 (tbox >> 8) & 0xFF,\n                                                 tbox & 0xFF);\n            warn('Unsupported header type ' + tbox + ' (' + headerType + ')');\n            break;\n        }\n        if (jumpDataLength) {\n          position += dataLength;\n        }\n      }\n    },\n    parseImageProperties: function JpxImage_parseImageProperties(stream) {\n      var newByte = stream.getByte();\n      while (newByte >= 0) {\n        var oldByte = newByte;\n        newByte = stream.getByte();\n        var code = (oldByte << 8) | newByte;\n        // Image and tile size (SIZ)\n        if (code === 0xFF51) {\n          stream.skip(4);\n          var Xsiz = stream.getInt32() >>> 0; // Byte 4\n          var Ysiz = stream.getInt32() >>> 0; // Byte 8\n          var XOsiz = stream.getInt32() >>> 0; // Byte 12\n          var YOsiz = stream.getInt32() >>> 0; // Byte 16\n          stream.skip(16);\n          var Csiz = stream.getUint16(); // Byte 36\n          this.width = Xsiz - XOsiz;\n          this.height = Ysiz - YOsiz;\n          this.componentsCount = Csiz;\n          // Results are always returned as Uint8Arrays\n          this.bitsPerComponent = 8;\n          return;\n        }\n      }\n      throw new Error('JPX Error: No size marker found in JPX stream');\n    },\n    parseCodestream: function JpxImage_parseCodestream(data, start, end) {\n      var context = {};\n      try {\n        var doNotRecover = false;\n        var position = start;\n        while (position + 1 < end) {\n          var code = readUint16(data, position);\n          position += 2;\n\n          var length = 0, j, sqcd, spqcds, spqcdSize, scalarExpounded, tile;\n          switch (code) {\n            case 0xFF4F: // Start of codestream (SOC)\n              context.mainHeader = true;\n              break;\n            case 0xFFD9: // End of codestream (EOC)\n              break;\n            case 0xFF51: // Image and tile size (SIZ)\n              length = readUint16(data, position);\n              var siz = {};\n              siz.Xsiz = readUint32(data, position + 4);\n              siz.Ysiz = readUint32(data, position + 8);\n              siz.XOsiz = readUint32(data, position + 12);\n              siz.YOsiz = readUint32(data, position + 16);\n              siz.XTsiz = readUint32(data, position + 20);\n              siz.YTsiz = readUint32(data, position + 24);\n              siz.XTOsiz = readUint32(data, position + 28);\n              siz.YTOsiz = readUint32(data, position + 32);\n              var componentsCount = readUint16(data, position + 36);\n              siz.Csiz = componentsCount;\n              var components = [];\n              j = position + 38;\n              for (var i = 0; i < componentsCount; i++) {\n                var component = {\n                  precision: (data[j] & 0x7F) + 1,\n                  isSigned: !!(data[j] & 0x80),\n                  XRsiz: data[j + 1],\n                  YRsiz: data[j + 1]\n                };\n                calculateComponentDimensions(component, siz);\n                components.push(component);\n              }\n              context.SIZ = siz;\n              context.components = components;\n              calculateTileGrids(context, components);\n              context.QCC = [];\n              context.COC = [];\n              break;\n            case 0xFF5C: // Quantization default (QCD)\n              length = readUint16(data, position);\n              var qcd = {};\n              j = position + 2;\n              sqcd = data[j++];\n              switch (sqcd & 0x1F) {\n                case 0:\n                  spqcdSize = 8;\n                  scalarExpounded = true;\n                  break;\n                case 1:\n                  spqcdSize = 16;\n                  scalarExpounded = false;\n                  break;\n                case 2:\n                  spqcdSize = 16;\n                  scalarExpounded = true;\n                  break;\n                default:\n                  throw new Error('JPX Error: Invalid SQcd value ' + sqcd);\n              }\n              qcd.noQuantization = (spqcdSize === 8);\n              qcd.scalarExpounded = scalarExpounded;\n              qcd.guardBits = sqcd >> 5;\n              spqcds = [];\n              while (j < length + position) {\n                var spqcd = {};\n                if (spqcdSize === 8) {\n                  spqcd.epsilon = data[j++] >> 3;\n                  spqcd.mu = 0;\n                } else {\n                  spqcd.epsilon = data[j] >> 3;\n                  spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];\n                  j += 2;\n                }\n                spqcds.push(spqcd);\n              }\n              qcd.SPqcds = spqcds;\n              if (context.mainHeader) {\n                context.QCD = qcd;\n              } else {\n                context.currentTile.QCD = qcd;\n                context.currentTile.QCC = [];\n              }\n              break;\n            case 0xFF5D: // Quantization component (QCC)\n              length = readUint16(data, position);\n              var qcc = {};\n              j = position + 2;\n              var cqcc;\n              if (context.SIZ.Csiz < 257) {\n                cqcc = data[j++];\n              } else {\n                cqcc = readUint16(data, j);\n                j += 2;\n              }\n              sqcd = data[j++];\n              switch (sqcd & 0x1F) {\n                case 0:\n                  spqcdSize = 8;\n                  scalarExpounded = true;\n                  break;\n                case 1:\n                  spqcdSize = 16;\n                  scalarExpounded = false;\n                  break;\n                case 2:\n                  spqcdSize = 16;\n                  scalarExpounded = true;\n                  break;\n                default:\n                  throw new Error('JPX Error: Invalid SQcd value ' + sqcd);\n              }\n              qcc.noQuantization = (spqcdSize === 8);\n              qcc.scalarExpounded = scalarExpounded;\n              qcc.guardBits = sqcd >> 5;\n              spqcds = [];\n              while (j < (length + position)) {\n                spqcd = {};\n                if (spqcdSize === 8) {\n                  spqcd.epsilon = data[j++] >> 3;\n                  spqcd.mu = 0;\n                } else {\n                  spqcd.epsilon = data[j] >> 3;\n                  spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];\n                  j += 2;\n                }\n                spqcds.push(spqcd);\n              }\n              qcc.SPqcds = spqcds;\n              if (context.mainHeader) {\n                context.QCC[cqcc] = qcc;\n              } else {\n                context.currentTile.QCC[cqcc] = qcc;\n              }\n              break;\n            case 0xFF52: // Coding style default (COD)\n              length = readUint16(data, position);\n              var cod = {};\n              j = position + 2;\n              var scod = data[j++];\n              cod.entropyCoderWithCustomPrecincts = !!(scod & 1);\n              cod.sopMarkerUsed = !!(scod & 2);\n              cod.ephMarkerUsed = !!(scod & 4);\n              cod.progressionOrder = data[j++];\n              cod.layersCount = readUint16(data, j);\n              j += 2;\n              cod.multipleComponentTransform = data[j++];\n\n              cod.decompositionLevelsCount = data[j++];\n              cod.xcb = (data[j++] & 0xF) + 2;\n              cod.ycb = (data[j++] & 0xF) + 2;\n              var blockStyle = data[j++];\n              cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1);\n              cod.resetContextProbabilities = !!(blockStyle & 2);\n              cod.terminationOnEachCodingPass = !!(blockStyle & 4);\n              cod.verticalyStripe = !!(blockStyle & 8);\n              cod.predictableTermination = !!(blockStyle & 16);\n              cod.segmentationSymbolUsed = !!(blockStyle & 32);\n              cod.reversibleTransformation = data[j++];\n              if (cod.entropyCoderWithCustomPrecincts) {\n                var precinctsSizes = [];\n                while (j < length + position) {\n                  var precinctsSize = data[j++];\n                  precinctsSizes.push({\n                    PPx: precinctsSize & 0xF,\n                    PPy: precinctsSize >> 4\n                  });\n                }\n                cod.precinctsSizes = precinctsSizes;\n              }\n              var unsupported = [];\n              if (cod.selectiveArithmeticCodingBypass) {\n                unsupported.push('selectiveArithmeticCodingBypass');\n              }\n              if (cod.resetContextProbabilities) {\n                unsupported.push('resetContextProbabilities');\n              }\n              if (cod.terminationOnEachCodingPass) {\n                unsupported.push('terminationOnEachCodingPass');\n              }\n              if (cod.verticalyStripe) {\n                unsupported.push('verticalyStripe');\n              }\n              if (cod.predictableTermination) {\n                unsupported.push('predictableTermination');\n              }\n              if (unsupported.length > 0) {\n                doNotRecover = true;\n                throw new Error('JPX Error: Unsupported COD options (' +\n                                unsupported.join(', ') + ')');\n              }\n              if (context.mainHeader) {\n                context.COD = cod;\n              } else {\n                context.currentTile.COD = cod;\n                context.currentTile.COC = [];\n              }\n              break;\n            case 0xFF90: // Start of tile-part (SOT)\n              length = readUint16(data, position);\n              tile = {};\n              tile.index = readUint16(data, position + 2);\n              tile.length = readUint32(data, position + 4);\n              tile.dataEnd = tile.length + position - 2;\n              tile.partIndex = data[position + 8];\n              tile.partsCount = data[position + 9];\n\n              context.mainHeader = false;\n              if (tile.partIndex === 0) {\n                // reset component specific settings\n                tile.COD = context.COD;\n                tile.COC = context.COC.slice(0); // clone of the global COC\n                tile.QCD = context.QCD;\n                tile.QCC = context.QCC.slice(0); // clone of the global COC\n              }\n              context.currentTile = tile;\n              break;\n            case 0xFF93: // Start of data (SOD)\n              tile = context.currentTile;\n              if (tile.partIndex === 0) {\n                initializeTile(context, tile.index);\n                buildPackets(context);\n              }\n\n              // moving to the end of the data\n              length = tile.dataEnd - position;\n              parseTilePackets(context, data, position, length);\n              break;\n            case 0xFF55: // Tile-part lengths, main header (TLM)\n            case 0xFF57: // Packet length, main header (PLM)\n            case 0xFF58: // Packet length, tile-part header (PLT)\n            case 0xFF64: // Comment (COM)\n              length = readUint16(data, position);\n              // skipping content\n              break;\n            case 0xFF53: // Coding style component (COC)\n              throw new Error('JPX Error: Codestream code 0xFF53 (COC) is ' +\n                              'not implemented');\n            default:\n              throw new Error('JPX Error: Unknown codestream code: ' +\n                              code.toString(16));\n          }\n          position += length;\n        }\n      } catch (e) {\n        if (doNotRecover || this.failOnCorruptedImage) {\n          throw e;\n        } else {\n          warn('Trying to recover from ' + e.message);\n        }\n      }\n      this.tiles = transformComponents(context);\n      this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;\n      this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;\n      this.componentsCount = context.SIZ.Csiz;\n    }\n  };\n  function calculateComponentDimensions(component, siz) {\n    // Section B.2 Component mapping\n    component.x0 = Math.ceil(siz.XOsiz / component.XRsiz);\n    component.x1 = Math.ceil(siz.Xsiz / component.XRsiz);\n    component.y0 = Math.ceil(siz.YOsiz / component.YRsiz);\n    component.y1 = Math.ceil(siz.Ysiz / component.YRsiz);\n    component.width = component.x1 - component.x0;\n    component.height = component.y1 - component.y0;\n  }\n  function calculateTileGrids(context, components) {\n    var siz = context.SIZ;\n    // Section B.3 Division into tile and tile-components\n    var tile, tiles = [];\n    var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz);\n    var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz);\n    for (var q = 0; q < numYtiles; q++) {\n      for (var p = 0; p < numXtiles; p++) {\n        tile = {};\n        tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz);\n        tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz);\n        tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz);\n        tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz);\n        tile.width = tile.tx1 - tile.tx0;\n        tile.height = tile.ty1 - tile.ty0;\n        tile.components = [];\n        tiles.push(tile);\n      }\n    }\n    context.tiles = tiles;\n\n    var componentsCount = siz.Csiz;\n    for (var i = 0, ii = componentsCount; i < ii; i++) {\n      var component = components[i];\n      for (var j = 0, jj = tiles.length; j < jj; j++) {\n        var tileComponent = {};\n        tile = tiles[j];\n        tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz);\n        tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz);\n        tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz);\n        tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz);\n        tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0;\n        tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0;\n        tile.components[i] = tileComponent;\n      }\n    }\n  }\n  function getBlocksDimensions(context, component, r) {\n    var codOrCoc = component.codingStyleParameters;\n    var result = {};\n    if (!codOrCoc.entropyCoderWithCustomPrecincts) {\n      result.PPx = 15;\n      result.PPy = 15;\n    } else {\n      result.PPx = codOrCoc.precinctsSizes[r].PPx;\n      result.PPy = codOrCoc.precinctsSizes[r].PPy;\n    }\n    // calculate codeblock size as described in section B.7\n    result.xcb_ = (r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) :\n                   Math.min(codOrCoc.xcb, result.PPx));\n    result.ycb_ = (r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) :\n                   Math.min(codOrCoc.ycb, result.PPy));\n    return result;\n  }\n  function buildPrecincts(context, resolution, dimensions) {\n    // Section B.6 Division resolution to precincts\n    var precinctWidth = 1 << dimensions.PPx;\n    var precinctHeight = 1 << dimensions.PPy;\n    // Jasper introduces codeblock groups for mapping each subband codeblocks\n    // to precincts. Precinct partition divides a resolution according to width\n    // and height parameters. The subband that belongs to the resolution level\n    // has a different size than the level, unless it is the zero resolution.\n\n    // From Jasper documentation: jpeg2000.pdf, section K: Tier-2 coding:\n    // The precinct partitioning for a particular subband is derived from a\n    // partitioning of its parent LL band (i.e., the LL band at the next higher\n    // resolution level)... The LL band associated with each resolution level is\n    // divided into precincts... Each of the resulting precinct regions is then\n    // mapped into its child subbands (if any) at the next lower resolution\n    // level. This is accomplished by using the coordinate transformation\n    // (u, v) = (ceil(x/2), ceil(y/2)) where (x, y) and (u, v) are the\n    // coordinates of a point in the LL band and child subband, respectively.\n    var isZeroRes = resolution.resLevel === 0;\n    var precinctWidthInSubband = 1 << (dimensions.PPx + (isZeroRes ? 0 : -1));\n    var precinctHeightInSubband = 1 << (dimensions.PPy + (isZeroRes ? 0 : -1));\n    var numprecinctswide = (resolution.trx1 > resolution.trx0 ?\n      Math.ceil(resolution.trx1 / precinctWidth) -\n      Math.floor(resolution.trx0 / precinctWidth) : 0);\n    var numprecinctshigh = (resolution.try1 > resolution.try0 ?\n      Math.ceil(resolution.try1 / precinctHeight) -\n      Math.floor(resolution.try0 / precinctHeight) : 0);\n    var numprecincts = numprecinctswide * numprecinctshigh;\n\n    resolution.precinctParameters = {\n      precinctWidth: precinctWidth,\n      precinctHeight: precinctHeight,\n      numprecinctswide: numprecinctswide,\n      numprecinctshigh: numprecinctshigh,\n      numprecincts: numprecincts,\n      precinctWidthInSubband: precinctWidthInSubband,\n      precinctHeightInSubband: precinctHeightInSubband\n    };\n  }\n  function buildCodeblocks(context, subband, dimensions) {\n    // Section B.7 Division sub-band into code-blocks\n    var xcb_ = dimensions.xcb_;\n    var ycb_ = dimensions.ycb_;\n    var codeblockWidth = 1 << xcb_;\n    var codeblockHeight = 1 << ycb_;\n    var cbx0 = subband.tbx0 >> xcb_;\n    var cby0 = subband.tby0 >> ycb_;\n    var cbx1 = (subband.tbx1 + codeblockWidth - 1) >> xcb_;\n    var cby1 = (subband.tby1 + codeblockHeight - 1) >> ycb_;\n    var precinctParameters = subband.resolution.precinctParameters;\n    var codeblocks = [];\n    var precincts = [];\n    var i, j, codeblock, precinctNumber;\n    for (j = cby0; j < cby1; j++) {\n      for (i = cbx0; i < cbx1; i++) {\n        codeblock = {\n          cbx: i,\n          cby: j,\n          tbx0: codeblockWidth * i,\n          tby0: codeblockHeight * j,\n          tbx1: codeblockWidth * (i + 1),\n          tby1: codeblockHeight * (j + 1)\n        };\n\n        codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0);\n        codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0);\n        codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1);\n        codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1);\n\n        // Calculate precinct number for this codeblock, codeblock position\n        // should be relative to its subband, use actual dimension and position\n        // See comment about codeblock group width and height\n        var pi = Math.floor((codeblock.tbx0_ - subband.tbx0) /\n          precinctParameters.precinctWidthInSubband);\n        var pj = Math.floor((codeblock.tby0_ - subband.tby0) /\n          precinctParameters.precinctHeightInSubband);\n        precinctNumber = pi + (pj * precinctParameters.numprecinctswide);\n\n        codeblock.precinctNumber = precinctNumber;\n        codeblock.subbandType = subband.type;\n        codeblock.Lblock = 3;\n\n        if (codeblock.tbx1_ <= codeblock.tbx0_ ||\n            codeblock.tby1_ <= codeblock.tby0_) {\n          continue;\n        }\n        codeblocks.push(codeblock);\n        // building precinct for the sub-band\n        var precinct = precincts[precinctNumber];\n        if (precinct !== undefined) {\n          if (i < precinct.cbxMin) {\n            precinct.cbxMin = i;\n          } else if (i > precinct.cbxMax) {\n            precinct.cbxMax = i;\n          }\n          if (j < precinct.cbyMin) {\n            precinct.cbxMin = j;\n          } else if (j > precinct.cbyMax) {\n            precinct.cbyMax = j;\n          }\n        } else {\n          precincts[precinctNumber] = precinct = {\n            cbxMin: i,\n            cbyMin: j,\n            cbxMax: i,\n            cbyMax: j\n          };\n        }\n        codeblock.precinct = precinct;\n      }\n    }\n    subband.codeblockParameters = {\n      codeblockWidth: xcb_,\n      codeblockHeight: ycb_,\n      numcodeblockwide: cbx1 - cbx0 + 1,\n      numcodeblockhigh: cby1 - cby0 + 1\n    };\n    subband.codeblocks = codeblocks;\n    subband.precincts = precincts;\n  }\n  function createPacket(resolution, precinctNumber, layerNumber) {\n    var precinctCodeblocks = [];\n    // Section B.10.8 Order of info in packet\n    var subbands = resolution.subbands;\n    // sub-bands already ordered in 'LL', 'HL', 'LH', and 'HH' sequence\n    for (var i = 0, ii = subbands.length; i < ii; i++) {\n      var subband = subbands[i];\n      var codeblocks = subband.codeblocks;\n      for (var j = 0, jj = codeblocks.length; j < jj; j++) {\n        var codeblock = codeblocks[j];\n        if (codeblock.precinctNumber !== precinctNumber) {\n          continue;\n        }\n        precinctCodeblocks.push(codeblock);\n      }\n    }\n    return {\n      layerNumber: layerNumber,\n      codeblocks: precinctCodeblocks\n    };\n  }\n  function LayerResolutionComponentPositionIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var maxDecompositionLevelsCount = 0;\n    for (var q = 0; q < componentsCount; q++) {\n      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,\n        tile.components[q].codingStyleParameters.decompositionLevelsCount);\n    }\n\n    var l = 0, r = 0, i = 0, k = 0;\n\n    this.nextPacket = function JpxImage_nextPacket() {\n      // Section B.12.1.1 Layer-resolution-component-position\n      for (; l < layersCount; l++) {\n        for (; r <= maxDecompositionLevelsCount; r++) {\n          for (; i < componentsCount; i++) {\n            var component = tile.components[i];\n            if (r > component.codingStyleParameters.decompositionLevelsCount) {\n              continue;\n            }\n\n            var resolution = component.resolutions[r];\n            var numprecincts = resolution.precinctParameters.numprecincts;\n            for (; k < numprecincts;) {\n              var packet = createPacket(resolution, k, l);\n              k++;\n              return packet;\n            }\n            k = 0;\n          }\n          i = 0;\n        }\n        r = 0;\n      }\n      throw new Error('JPX Error: Out of packets');\n    };\n  }\n  function ResolutionLayerComponentPositionIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var maxDecompositionLevelsCount = 0;\n    for (var q = 0; q < componentsCount; q++) {\n      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,\n        tile.components[q].codingStyleParameters.decompositionLevelsCount);\n    }\n\n    var r = 0, l = 0, i = 0, k = 0;\n\n    this.nextPacket = function JpxImage_nextPacket() {\n      // Section B.12.1.2 Resolution-layer-component-position\n      for (; r <= maxDecompositionLevelsCount; r++) {\n        for (; l < layersCount; l++) {\n          for (; i < componentsCount; i++) {\n            var component = tile.components[i];\n            if (r > component.codingStyleParameters.decompositionLevelsCount) {\n              continue;\n            }\n\n            var resolution = component.resolutions[r];\n            var numprecincts = resolution.precinctParameters.numprecincts;\n            for (; k < numprecincts;) {\n              var packet = createPacket(resolution, k, l);\n              k++;\n              return packet;\n            }\n            k = 0;\n          }\n          i = 0;\n        }\n        l = 0;\n      }\n      throw new Error('JPX Error: Out of packets');\n    };\n  }\n  function ResolutionPositionComponentLayerIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var l, r, c, p;\n    var maxDecompositionLevelsCount = 0;\n    for (c = 0; c < componentsCount; c++) {\n      var component = tile.components[c];\n      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,\n        component.codingStyleParameters.decompositionLevelsCount);\n    }\n    var maxNumPrecinctsInLevel = new Int32Array(\n      maxDecompositionLevelsCount + 1);\n    for (r = 0; r <= maxDecompositionLevelsCount; ++r) {\n      var maxNumPrecincts = 0;\n      for (c = 0; c < componentsCount; ++c) {\n        var resolutions = tile.components[c].resolutions;\n        if (r < resolutions.length) {\n          maxNumPrecincts = Math.max(maxNumPrecincts,\n            resolutions[r].precinctParameters.numprecincts);\n        }\n      }\n      maxNumPrecinctsInLevel[r] = maxNumPrecincts;\n    }\n    l = 0;\n    r = 0;\n    c = 0;\n    p = 0;\n\n    this.nextPacket = function JpxImage_nextPacket() {\n      // Section B.12.1.3 Resolution-position-component-layer\n      for (; r <= maxDecompositionLevelsCount; r++) {\n        for (; p < maxNumPrecinctsInLevel[r]; p++) {\n          for (; c < componentsCount; c++) {\n            var component = tile.components[c];\n            if (r > component.codingStyleParameters.decompositionLevelsCount) {\n              continue;\n            }\n            var resolution = component.resolutions[r];\n            var numprecincts = resolution.precinctParameters.numprecincts;\n            if (p >= numprecincts) {\n              continue;\n            }\n            for (; l < layersCount;) {\n              var packet = createPacket(resolution, p, l);\n              l++;\n              return packet;\n            }\n            l = 0;\n          }\n          c = 0;\n        }\n        p = 0;\n      }\n      throw new Error('JPX Error: Out of packets');\n    };\n  }\n  function PositionComponentResolutionLayerIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var precinctsSizes = getPrecinctSizesInImageScale(tile);\n    var precinctsIterationSizes = precinctsSizes;\n    var l = 0, r = 0, c = 0, px = 0, py = 0;\n\n    this.nextPacket = function JpxImage_nextPacket() {\n      // Section B.12.1.4 Position-component-resolution-layer\n      for (; py < precinctsIterationSizes.maxNumHigh; py++) {\n        for (; px < precinctsIterationSizes.maxNumWide; px++) {\n          for (; c < componentsCount; c++) {\n            var component = tile.components[c];\n            var decompositionLevelsCount =\n              component.codingStyleParameters.decompositionLevelsCount;\n            for (; r <= decompositionLevelsCount; r++) {\n              var resolution = component.resolutions[r];\n              var sizeInImageScale =\n                precinctsSizes.components[c].resolutions[r];\n              var k = getPrecinctIndexIfExist(\n                px,\n                py,\n                sizeInImageScale,\n                precinctsIterationSizes,\n                resolution);\n              if (k === null) {\n                continue;\n              }\n              for (; l < layersCount;) {\n                var packet = createPacket(resolution, k, l);\n                l++;\n                return packet;\n              }\n              l = 0;\n            }\n            r = 0;\n          }\n          c = 0;\n        }\n        px = 0;\n      }\n      throw new Error('JPX Error: Out of packets');\n    };\n  }\n  function ComponentPositionResolutionLayerIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var precinctsSizes = getPrecinctSizesInImageScale(tile);\n    var l = 0, r = 0, c = 0, px = 0, py = 0;\n\n    this.nextPacket = function JpxImage_nextPacket() {\n      // Section B.12.1.5 Component-position-resolution-layer\n      for (; c < componentsCount; ++c) {\n        var component = tile.components[c];\n        var precinctsIterationSizes = precinctsSizes.components[c];\n        var decompositionLevelsCount =\n          component.codingStyleParameters.decompositionLevelsCount;\n        for (; py < precinctsIterationSizes.maxNumHigh; py++) {\n          for (; px < precinctsIterationSizes.maxNumWide; px++) {\n            for (; r <= decompositionLevelsCount; r++) {\n              var resolution = component.resolutions[r];\n              var sizeInImageScale = precinctsIterationSizes.resolutions[r];\n              var k = getPrecinctIndexIfExist(\n                px,\n                py,\n                sizeInImageScale,\n                precinctsIterationSizes,\n                resolution);\n              if (k === null) {\n                continue;\n              }\n              for (; l < layersCount;) {\n                var packet = createPacket(resolution, k, l);\n                l++;\n                return packet;\n              }\n              l = 0;\n            }\n            r = 0;\n          }\n          px = 0;\n        }\n        py = 0;\n      }\n      throw new Error('JPX Error: Out of packets');\n    };\n  }\n  function getPrecinctIndexIfExist(\n    pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) {\n    var posX = pxIndex * precinctIterationSizes.minWidth;\n    var posY = pyIndex * precinctIterationSizes.minHeight;\n    if (posX % sizeInImageScale.width !== 0 ||\n        posY % sizeInImageScale.height !== 0) {\n      return null;\n    }\n    var startPrecinctRowIndex =\n      (posY / sizeInImageScale.width) *\n      resolution.precinctParameters.numprecinctswide;\n    return (posX / sizeInImageScale.height) + startPrecinctRowIndex;\n  }\n  function getPrecinctSizesInImageScale(tile) {\n    var componentsCount = tile.components.length;\n    var minWidth = Number.MAX_VALUE;\n    var minHeight = Number.MAX_VALUE;\n    var maxNumWide = 0;\n    var maxNumHigh = 0;\n    var sizePerComponent = new Array(componentsCount);\n    for (var c = 0; c < componentsCount; c++) {\n      var component = tile.components[c];\n      var decompositionLevelsCount =\n        component.codingStyleParameters.decompositionLevelsCount;\n      var sizePerResolution = new Array(decompositionLevelsCount + 1);\n      var minWidthCurrentComponent = Number.MAX_VALUE;\n      var minHeightCurrentComponent = Number.MAX_VALUE;\n      var maxNumWideCurrentComponent = 0;\n      var maxNumHighCurrentComponent = 0;\n      var scale = 1;\n      for (var r = decompositionLevelsCount; r >= 0; --r) {\n        var resolution = component.resolutions[r];\n        var widthCurrentResolution =\n          scale * resolution.precinctParameters.precinctWidth;\n        var heightCurrentResolution =\n          scale * resolution.precinctParameters.precinctHeight;\n        minWidthCurrentComponent = Math.min(\n          minWidthCurrentComponent,\n          widthCurrentResolution);\n        minHeightCurrentComponent = Math.min(\n          minHeightCurrentComponent,\n          heightCurrentResolution);\n        maxNumWideCurrentComponent = Math.max(maxNumWideCurrentComponent,\n          resolution.precinctParameters.numprecinctswide);\n        maxNumHighCurrentComponent = Math.max(maxNumHighCurrentComponent,\n          resolution.precinctParameters.numprecinctshigh);\n        sizePerResolution[r] = {\n          width: widthCurrentResolution,\n          height: heightCurrentResolution\n        };\n        scale <<= 1;\n      }\n      minWidth = Math.min(minWidth, minWidthCurrentComponent);\n      minHeight = Math.min(minHeight, minHeightCurrentComponent);\n      maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent);\n      maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent);\n      sizePerComponent[c] = {\n        resolutions: sizePerResolution,\n        minWidth: minWidthCurrentComponent,\n        minHeight: minHeightCurrentComponent,\n        maxNumWide: maxNumWideCurrentComponent,\n        maxNumHigh: maxNumHighCurrentComponent\n      };\n    }\n    return {\n      components: sizePerComponent,\n      minWidth: minWidth,\n      minHeight: minHeight,\n      maxNumWide: maxNumWide,\n      maxNumHigh: maxNumHigh\n    };\n  }\n  function buildPackets(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var componentsCount = siz.Csiz;\n    // Creating resolutions and sub-bands for each component\n    for (var c = 0; c < componentsCount; c++) {\n      var component = tile.components[c];\n      var decompositionLevelsCount =\n        component.codingStyleParameters.decompositionLevelsCount;\n      // Section B.5 Resolution levels and sub-bands\n      var resolutions = [];\n      var subbands = [];\n      for (var r = 0; r <= decompositionLevelsCount; r++) {\n        var blocksDimensions = getBlocksDimensions(context, component, r);\n        var resolution = {};\n        var scale = 1 << (decompositionLevelsCount - r);\n        resolution.trx0 = Math.ceil(component.tcx0 / scale);\n        resolution.try0 = Math.ceil(component.tcy0 / scale);\n        resolution.trx1 = Math.ceil(component.tcx1 / scale);\n        resolution.try1 = Math.ceil(component.tcy1 / scale);\n        resolution.resLevel = r;\n        buildPrecincts(context, resolution, blocksDimensions);\n        resolutions.push(resolution);\n\n        var subband;\n        if (r === 0) {\n          // one sub-band (LL) with last decomposition\n          subband = {};\n          subband.type = 'LL';\n          subband.tbx0 = Math.ceil(component.tcx0 / scale);\n          subband.tby0 = Math.ceil(component.tcy0 / scale);\n          subband.tbx1 = Math.ceil(component.tcx1 / scale);\n          subband.tby1 = Math.ceil(component.tcy1 / scale);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolution.subbands = [subband];\n        } else {\n          var bscale = 1 << (decompositionLevelsCount - r + 1);\n          var resolutionSubbands = [];\n          // three sub-bands (HL, LH and HH) with rest of decompositions\n          subband = {};\n          subband.type = 'HL';\n          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);\n          subband.tby0 = Math.ceil(component.tcy0 / bscale);\n          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);\n          subband.tby1 = Math.ceil(component.tcy1 / bscale);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolutionSubbands.push(subband);\n\n          subband = {};\n          subband.type = 'LH';\n          subband.tbx0 = Math.ceil(component.tcx0 / bscale);\n          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);\n          subband.tbx1 = Math.ceil(component.tcx1 / bscale);\n          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolutionSubbands.push(subband);\n\n          subband = {};\n          subband.type = 'HH';\n          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);\n          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);\n          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);\n          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolutionSubbands.push(subband);\n\n          resolution.subbands = resolutionSubbands;\n        }\n      }\n      component.resolutions = resolutions;\n      component.subbands = subbands;\n    }\n    // Generate the packets sequence\n    var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;\n    switch (progressionOrder) {\n      case 0:\n        tile.packetsIterator =\n          new LayerResolutionComponentPositionIterator(context);\n        break;\n      case 1:\n        tile.packetsIterator =\n          new ResolutionLayerComponentPositionIterator(context);\n        break;\n      case 2:\n        tile.packetsIterator =\n          new ResolutionPositionComponentLayerIterator(context);\n        break;\n      case 3:\n        tile.packetsIterator =\n          new PositionComponentResolutionLayerIterator(context);\n        break;\n      case 4:\n        tile.packetsIterator =\n          new ComponentPositionResolutionLayerIterator(context);\n        break;\n      default:\n        throw new Error('JPX Error: Unsupported progression order ' +\n                        progressionOrder);\n    }\n  }\n  function parseTilePackets(context, data, offset, dataLength) {\n    var position = 0;\n    var buffer, bufferSize = 0, skipNextBit = false;\n    function readBits(count) {\n      while (bufferSize < count) {\n        var b = data[offset + position];\n        position++;\n        if (skipNextBit) {\n          buffer = (buffer << 7) | b;\n          bufferSize += 7;\n          skipNextBit = false;\n        } else {\n          buffer = (buffer << 8) | b;\n          bufferSize += 8;\n        }\n        if (b === 0xFF) {\n          skipNextBit = true;\n        }\n      }\n      bufferSize -= count;\n      return (buffer >>> bufferSize) & ((1 << count) - 1);\n    }\n    function skipMarkerIfEqual(value) {\n      if (data[offset + position - 1] === 0xFF &&\n          data[offset + position] === value) {\n        skipBytes(1);\n        return true;\n      } else if (data[offset + position] === 0xFF &&\n                 data[offset + position + 1] === value) {\n        skipBytes(2);\n        return true;\n      }\n      return false;\n    }\n    function skipBytes(count) {\n      position += count;\n    }\n    function alignToByte() {\n      bufferSize = 0;\n      if (skipNextBit) {\n        position++;\n        skipNextBit = false;\n      }\n    }\n    function readCodingpasses() {\n      if (readBits(1) === 0) {\n        return 1;\n      }\n      if (readBits(1) === 0) {\n        return 2;\n      }\n      var value = readBits(2);\n      if (value < 3) {\n        return value + 3;\n      }\n      value = readBits(5);\n      if (value < 31) {\n        return value + 6;\n      }\n      value = readBits(7);\n      return value + 37;\n    }\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var sopMarkerUsed = context.COD.sopMarkerUsed;\n    var ephMarkerUsed = context.COD.ephMarkerUsed;\n    var packetsIterator = tile.packetsIterator;\n    while (position < dataLength) {\n      alignToByte();\n      if (sopMarkerUsed && skipMarkerIfEqual(0x91)) {\n        // Skip also marker segment length and packet sequence ID\n        skipBytes(4);\n      }\n      var packet = packetsIterator.nextPacket();\n      if (!readBits(1)) {\n        continue;\n      }\n      var layerNumber = packet.layerNumber;\n      var queue = [], codeblock;\n      for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) {\n        codeblock = packet.codeblocks[i];\n        var precinct = codeblock.precinct;\n        var codeblockColumn = codeblock.cbx - precinct.cbxMin;\n        var codeblockRow = codeblock.cby - precinct.cbyMin;\n        var codeblockIncluded = false;\n        var firstTimeInclusion = false;\n        var valueReady;\n        if (codeblock['included'] !== undefined) {\n          codeblockIncluded = !!readBits(1);\n        } else {\n          // reading inclusion tree\n          precinct = codeblock.precinct;\n          var inclusionTree, zeroBitPlanesTree;\n          if (precinct['inclusionTree'] !== undefined) {\n            inclusionTree = precinct.inclusionTree;\n          } else {\n            // building inclusion and zero bit-planes trees\n            var width = precinct.cbxMax - precinct.cbxMin + 1;\n            var height = precinct.cbyMax - precinct.cbyMin + 1;\n            inclusionTree = new InclusionTree(width, height, layerNumber);\n            zeroBitPlanesTree = new TagTree(width, height);\n            precinct.inclusionTree = inclusionTree;\n            precinct.zeroBitPlanesTree = zeroBitPlanesTree;\n          }\n\n          if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {\n            while (true) {\n              if (readBits(1)) {\n                valueReady = !inclusionTree.nextLevel();\n                if (valueReady) {\n                  codeblock.included = true;\n                  codeblockIncluded = firstTimeInclusion = true;\n                  break;\n                }\n              } else {\n                inclusionTree.incrementValue(layerNumber);\n                break;\n              }\n            }\n          }\n        }\n        if (!codeblockIncluded) {\n          continue;\n        }\n        if (firstTimeInclusion) {\n          zeroBitPlanesTree = precinct.zeroBitPlanesTree;\n          zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);\n          while (true) {\n            if (readBits(1)) {\n              valueReady = !zeroBitPlanesTree.nextLevel();\n              if (valueReady) {\n                break;\n              }\n            } else {\n              zeroBitPlanesTree.incrementValue();\n            }\n          }\n          codeblock.zeroBitPlanes = zeroBitPlanesTree.value;\n        }\n        var codingpasses = readCodingpasses();\n        while (readBits(1)) {\n          codeblock.Lblock++;\n        }\n        var codingpassesLog2 = log2(codingpasses);\n        // rounding down log2\n        var bits = ((codingpasses < (1 << codingpassesLog2)) ?\n          codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock;\n        var codedDataLength = readBits(bits);\n        queue.push({\n          codeblock: codeblock,\n          codingpasses: codingpasses,\n          dataLength: codedDataLength\n        });\n      }\n      alignToByte();\n      if (ephMarkerUsed) {\n        skipMarkerIfEqual(0x92);\n      }\n      while (queue.length > 0) {\n        var packetItem = queue.shift();\n        codeblock = packetItem.codeblock;\n        if (codeblock['data'] === undefined) {\n          codeblock.data = [];\n        }\n        codeblock.data.push({\n          data: data,\n          start: offset + position,\n          end: offset + position + packetItem.dataLength,\n          codingpasses: packetItem.codingpasses\n        });\n        position += packetItem.dataLength;\n      }\n    }\n    return position;\n  }\n  function copyCoefficients(coefficients, levelWidth, levelHeight, subband,\n                            delta, mb, reversible, segmentationSymbolUsed) {\n    var x0 = subband.tbx0;\n    var y0 = subband.tby0;\n    var width = subband.tbx1 - subband.tbx0;\n    var codeblocks = subband.codeblocks;\n    var right = subband.type.charAt(0) === 'H' ? 1 : 0;\n    var bottom = subband.type.charAt(1) === 'H' ? levelWidth : 0;\n\n    for (var i = 0, ii = codeblocks.length; i < ii; ++i) {\n      var codeblock = codeblocks[i];\n      var blockWidth = codeblock.tbx1_ - codeblock.tbx0_;\n      var blockHeight = codeblock.tby1_ - codeblock.tby0_;\n      if (blockWidth === 0 || blockHeight === 0) {\n        continue;\n      }\n      if (codeblock['data'] === undefined) {\n        continue;\n      }\n\n      var bitModel, currentCodingpassType;\n      bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType,\n                              codeblock.zeroBitPlanes, mb);\n      currentCodingpassType = 2; // first bit plane starts from cleanup\n\n      // collect data\n      var data = codeblock.data, totalLength = 0, codingpasses = 0;\n      var j, jj, dataItem;\n      for (j = 0, jj = data.length; j < jj; j++) {\n        dataItem = data[j];\n        totalLength += dataItem.end - dataItem.start;\n        codingpasses += dataItem.codingpasses;\n      }\n      var encodedData = new Uint8Array(totalLength);\n      var position = 0;\n      for (j = 0, jj = data.length; j < jj; j++) {\n        dataItem = data[j];\n        var chunk = dataItem.data.subarray(dataItem.start, dataItem.end);\n        encodedData.set(chunk, position);\n        position += chunk.length;\n      }\n      // decoding the item\n      var decoder = new ArithmeticDecoder(encodedData, 0, totalLength);\n      bitModel.setDecoder(decoder);\n\n      for (j = 0; j < codingpasses; j++) {\n        switch (currentCodingpassType) {\n          case 0:\n            bitModel.runSignificancePropogationPass();\n            break;\n          case 1:\n            bitModel.runMagnitudeRefinementPass();\n            break;\n          case 2:\n            bitModel.runCleanupPass();\n            if (segmentationSymbolUsed) {\n              bitModel.checkSegmentationSymbol();\n            }\n            break;\n        }\n        currentCodingpassType = (currentCodingpassType + 1) % 3;\n      }\n\n      var offset = (codeblock.tbx0_ - x0) + (codeblock.tby0_ - y0) * width;\n      var sign = bitModel.coefficentsSign;\n      var magnitude = bitModel.coefficentsMagnitude;\n      var bitsDecoded = bitModel.bitsDecoded;\n      var magnitudeCorrection = reversible ? 0 : 0.5;\n      var k, n, nb;\n      position = 0;\n      // Do the interleaving of Section F.3.3 here, so we do not need\n      // to copy later. LL level is not interleaved, just copied.\n      var interleave = (subband.type !== 'LL');\n      for (j = 0; j < blockHeight; j++) {\n        var row = (offset / width) | 0; // row in the non-interleaved subband\n        var levelOffset = 2 * row * (levelWidth - width) + right + bottom;\n        for (k = 0; k < blockWidth; k++) {\n          n = magnitude[position];\n          if (n !== 0) {\n            n = (n + magnitudeCorrection) * delta;\n            if (sign[position] !== 0) {\n              n = -n;\n            }\n            nb = bitsDecoded[position];\n            var pos = interleave ? (levelOffset + (offset << 1)) : offset;\n            if (reversible && (nb >= mb)) {\n              coefficients[pos] = n;\n            } else {\n              coefficients[pos] = n * (1 << (mb - nb));\n            }\n          }\n          offset++;\n          position++;\n        }\n        offset += width - blockWidth;\n      }\n    }\n  }\n  function transformTile(context, tile, c) {\n    var component = tile.components[c];\n    var codingStyleParameters = component.codingStyleParameters;\n    var quantizationParameters = component.quantizationParameters;\n    var decompositionLevelsCount =\n      codingStyleParameters.decompositionLevelsCount;\n    var spqcds = quantizationParameters.SPqcds;\n    var scalarExpounded = quantizationParameters.scalarExpounded;\n    var guardBits = quantizationParameters.guardBits;\n    var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed;\n    var precision = context.components[c].precision;\n\n    var reversible = codingStyleParameters.reversibleTransformation;\n    var transform = (reversible ? new ReversibleTransform() :\n                                  new IrreversibleTransform());\n\n    var subbandCoefficients = [];\n    var b = 0;\n    for (var i = 0; i <= decompositionLevelsCount; i++) {\n      var resolution = component.resolutions[i];\n\n      var width = resolution.trx1 - resolution.trx0;\n      var height = resolution.try1 - resolution.try0;\n      // Allocate space for the whole sublevel.\n      var coefficients = new Float32Array(width * height);\n\n      for (var j = 0, jj = resolution.subbands.length; j < jj; j++) {\n        var mu, epsilon;\n        if (!scalarExpounded) {\n          // formula E-5\n          mu = spqcds[0].mu;\n          epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);\n        } else {\n          mu = spqcds[b].mu;\n          epsilon = spqcds[b].epsilon;\n          b++;\n        }\n\n        var subband = resolution.subbands[j];\n        var gainLog2 = SubbandsGainLog2[subband.type];\n\n        // calulate quantization coefficient (Section E.1.1.1)\n        var delta = (reversible ? 1 :\n          Math.pow(2, precision + gainLog2 - epsilon) * (1 + mu / 2048));\n        var mb = (guardBits + epsilon - 1);\n\n        // In the first resolution level, copyCoefficients will fill the\n        // whole array with coefficients. In the succeding passes,\n        // copyCoefficients will consecutively fill in the values that belong\n        // to the interleaved positions of the HL, LH, and HH coefficients.\n        // The LL coefficients will then be interleaved in Transform.iterate().\n        copyCoefficients(coefficients, width, height, subband, delta, mb,\n                         reversible, segmentationSymbolUsed);\n      }\n      subbandCoefficients.push({\n        width: width,\n        height: height,\n        items: coefficients\n      });\n    }\n\n    var result = transform.calculate(subbandCoefficients,\n                                     component.tcx0, component.tcy0);\n    return {\n      left: component.tcx0,\n      top: component.tcy0,\n      width: result.width,\n      height: result.height,\n      items: result.items\n    };\n  }\n  function transformComponents(context) {\n    var siz = context.SIZ;\n    var components = context.components;\n    var componentsCount = siz.Csiz;\n    var resultImages = [];\n    for (var i = 0, ii = context.tiles.length; i < ii; i++) {\n      var tile = context.tiles[i];\n      var transformedTiles = [];\n      var c;\n      for (c = 0; c < componentsCount; c++) {\n        transformedTiles[c] = transformTile(context, tile, c);\n      }\n      var tile0 = transformedTiles[0];\n      var out = new Uint8Array(tile0.items.length * componentsCount);\n      var result = {\n        left: tile0.left,\n        top: tile0.top,\n        width: tile0.width,\n        height: tile0.height,\n        items: out\n      };\n\n      // Section G.2.2 Inverse multi component transform\n      var shift, offset, max, min, maxK;\n      var pos = 0, j, jj, y0, y1, y2, r, g, b, k, val;\n      if (tile.codingStyleDefaultParameters.multipleComponentTransform) {\n        var fourComponents = componentsCount === 4;\n        var y0items = transformedTiles[0].items;\n        var y1items = transformedTiles[1].items;\n        var y2items = transformedTiles[2].items;\n        var y3items = fourComponents ? transformedTiles[3].items : null;\n\n        // HACK: The multiple component transform formulas below assume that\n        // all components have the same precision. With this in mind, we\n        // compute shift and offset only once.\n        shift = components[0].precision - 8;\n        offset = (128 << shift) + 0.5;\n        max = 255 * (1 << shift);\n        maxK = max * 0.5;\n        min = -maxK;\n\n        var component0 = tile.components[0];\n        var alpha01 = componentsCount - 3;\n        jj = y0items.length;\n        if (!component0.codingStyleParameters.reversibleTransformation) {\n          // inverse irreversible multiple component transform\n          for (j = 0; j < jj; j++, pos += alpha01) {\n            y0 = y0items[j] + offset;\n            y1 = y1items[j];\n            y2 = y2items[j];\n            r = y0 + 1.402 * y2;\n            g = y0 - 0.34413 * y1 - 0.71414 * y2;\n            b = y0 + 1.772 * y1;\n            out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift;\n            out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift;\n            out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift;\n          }\n        } else {\n          // inverse reversible multiple component transform\n          for (j = 0; j < jj; j++, pos += alpha01) {\n            y0 = y0items[j] + offset;\n            y1 = y1items[j];\n            y2 = y2items[j];\n            g = y0 - ((y2 + y1) >> 2);\n            r = g + y2;\n            b = g + y1;\n            out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift;\n            out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift;\n            out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift;\n          }\n        }\n        if (fourComponents) {\n          for (j = 0, pos = 3; j < jj; j++, pos += 4) {\n            k = y3items[j];\n            out[pos] = k <= min ? 0 : k >= maxK ? 255 : (k + offset) >> shift;\n          }\n        }\n      } else { // no multi-component transform\n        for (c = 0; c < componentsCount; c++) {\n          var items = transformedTiles[c].items;\n          shift = components[c].precision - 8;\n          offset = (128 << shift) + 0.5;\n          max = (127.5 * (1 << shift));\n          min = -max;\n          for (pos = c, j = 0, jj = items.length; j < jj; j++) {\n            val = items[j];\n            out[pos] = val <= min ? 0 :\n                       val >= max ? 255 : (val + offset) >> shift;\n            pos += componentsCount;\n          }\n        }\n      }\n      resultImages.push(result);\n    }\n    return resultImages;\n  }\n  function initializeTile(context, tileIndex) {\n    var siz = context.SIZ;\n    var componentsCount = siz.Csiz;\n    var tile = context.tiles[tileIndex];\n    for (var c = 0; c < componentsCount; c++) {\n      var component = tile.components[c];\n      var qcdOrQcc = (context.currentTile.QCC[c] !== undefined ?\n        context.currentTile.QCC[c] : context.currentTile.QCD);\n      component.quantizationParameters = qcdOrQcc;\n      var codOrCoc = (context.currentTile.COC[c] !== undefined  ?\n        context.currentTile.COC[c] : context.currentTile.COD);\n      component.codingStyleParameters = codOrCoc;\n    }\n    tile.codingStyleDefaultParameters = context.currentTile.COD;\n  }\n\n  // Section B.10.2 Tag trees\n  var TagTree = (function TagTreeClosure() {\n    function TagTree(width, height) {\n      var levelsLength = log2(Math.max(width, height)) + 1;\n      this.levels = [];\n      for (var i = 0; i < levelsLength; i++) {\n        var level = {\n          width: width,\n          height: height,\n          items: []\n        };\n        this.levels.push(level);\n        width = Math.ceil(width / 2);\n        height = Math.ceil(height / 2);\n      }\n    }\n    TagTree.prototype = {\n      reset: function TagTree_reset(i, j) {\n        var currentLevel = 0, value = 0, level;\n        while (currentLevel < this.levels.length) {\n          level = this.levels[currentLevel];\n          var index = i + j * level.width;\n          if (level.items[index] !== undefined) {\n            value = level.items[index];\n            break;\n          }\n          level.index = index;\n          i >>= 1;\n          j >>= 1;\n          currentLevel++;\n        }\n        currentLevel--;\n        level = this.levels[currentLevel];\n        level.items[level.index] = value;\n        this.currentLevel = currentLevel;\n        delete this.value;\n      },\n      incrementValue: function TagTree_incrementValue() {\n        var level = this.levels[this.currentLevel];\n        level.items[level.index]++;\n      },\n      nextLevel: function TagTree_nextLevel() {\n        var currentLevel = this.currentLevel;\n        var level = this.levels[currentLevel];\n        var value = level.items[level.index];\n        currentLevel--;\n        if (currentLevel < 0) {\n          this.value = value;\n          return false;\n        }\n\n        this.currentLevel = currentLevel;\n        level = this.levels[currentLevel];\n        level.items[level.index] = value;\n        return true;\n      }\n    };\n    return TagTree;\n  })();\n\n  var InclusionTree = (function InclusionTreeClosure() {\n    function InclusionTree(width, height,  defaultValue) {\n      var levelsLength = log2(Math.max(width, height)) + 1;\n      this.levels = [];\n      for (var i = 0; i < levelsLength; i++) {\n        var items = new Uint8Array(width * height);\n        for (var j = 0, jj = items.length; j < jj; j++) {\n          items[j] = defaultValue;\n        }\n\n        var level = {\n          width: width,\n          height: height,\n          items: items\n        };\n        this.levels.push(level);\n\n        width = Math.ceil(width / 2);\n        height = Math.ceil(height / 2);\n      }\n    }\n    InclusionTree.prototype = {\n      reset: function InclusionTree_reset(i, j, stopValue) {\n        var currentLevel = 0;\n        while (currentLevel < this.levels.length) {\n          var level = this.levels[currentLevel];\n          var index = i + j * level.width;\n          level.index = index;\n          var value = level.items[index];\n\n          if (value === 0xFF) {\n            break;\n          }\n\n          if (value > stopValue) {\n            this.currentLevel = currentLevel;\n            // already know about this one, propagating the value to top levels\n            this.propagateValues();\n            return false;\n          }\n\n          i >>= 1;\n          j >>= 1;\n          currentLevel++;\n        }\n        this.currentLevel = currentLevel - 1;\n        return true;\n      },\n      incrementValue: function InclusionTree_incrementValue(stopValue) {\n        var level = this.levels[this.currentLevel];\n        level.items[level.index] = stopValue + 1;\n        this.propagateValues();\n      },\n      propagateValues: function InclusionTree_propagateValues() {\n        var levelIndex = this.currentLevel;\n        var level = this.levels[levelIndex];\n        var currentValue = level.items[level.index];\n        while (--levelIndex >= 0) {\n          level = this.levels[levelIndex];\n          level.items[level.index] = currentValue;\n        }\n      },\n      nextLevel: function InclusionTree_nextLevel() {\n        var currentLevel = this.currentLevel;\n        var level = this.levels[currentLevel];\n        var value = level.items[level.index];\n        level.items[level.index] = 0xFF;\n        currentLevel--;\n        if (currentLevel < 0) {\n          return false;\n        }\n\n        this.currentLevel = currentLevel;\n        level = this.levels[currentLevel];\n        level.items[level.index] = value;\n        return true;\n      }\n    };\n    return InclusionTree;\n  })();\n\n  // Section D. Coefficient bit modeling\n  var BitModel = (function BitModelClosure() {\n    var UNIFORM_CONTEXT = 17;\n    var RUNLENGTH_CONTEXT = 18;\n    // Table D-1\n    // The index is binary presentation: 0dddvvhh, ddd - sum of Di (0..4),\n    // vv - sum of Vi (0..2), and hh - sum of Hi (0..2)\n    var LLAndLHContextsLabel = new Uint8Array([\n      0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4,\n      7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6,\n      8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8\n    ]);\n    var HLContextLabel = new Uint8Array([\n      0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8,\n      8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3,\n      4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8\n    ]);\n    var HHContextLabel = new Uint8Array([\n      0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5,\n      5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8,\n      8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8\n    ]);\n\n    function BitModel(width, height, subband, zeroBitPlanes, mb) {\n      this.width = width;\n      this.height = height;\n\n      this.contextLabelTable = (subband === 'HH' ? HHContextLabel :\n        (subband === 'HL' ? HLContextLabel : LLAndLHContextsLabel));\n\n      var coefficientCount = width * height;\n\n      // coefficients outside the encoding region treated as insignificant\n      // add border state cells for significanceState\n      this.neighborsSignificance = new Uint8Array(coefficientCount);\n      this.coefficentsSign = new Uint8Array(coefficientCount);\n      this.coefficentsMagnitude = mb > 14 ? new Uint32Array(coefficientCount) :\n                                  mb > 6 ? new Uint16Array(coefficientCount) :\n                                  new Uint8Array(coefficientCount);\n      this.processingFlags = new Uint8Array(coefficientCount);\n\n      var bitsDecoded = new Uint8Array(coefficientCount);\n      if (zeroBitPlanes !== 0) {\n        for (var i = 0; i < coefficientCount; i++) {\n          bitsDecoded[i] = zeroBitPlanes;\n        }\n      }\n      this.bitsDecoded = bitsDecoded;\n\n      this.reset();\n    }\n\n    BitModel.prototype = {\n      setDecoder: function BitModel_setDecoder(decoder) {\n        this.decoder = decoder;\n      },\n      reset: function BitModel_reset() {\n        // We have 17 contexts that are accessed via context labels,\n        // plus the uniform and runlength context.\n        this.contexts = new Int8Array(19);\n\n        // Contexts are packed into 1 byte:\n        // highest 7 bits carry the index, lowest bit carries mps\n        this.contexts[0] = (4 << 1) | 0;\n        this.contexts[UNIFORM_CONTEXT] = (46 << 1) | 0;\n        this.contexts[RUNLENGTH_CONTEXT] = (3 << 1) | 0;\n      },\n      setNeighborsSignificance:\n        function BitModel_setNeighborsSignificance(row, column, index) {\n        var neighborsSignificance = this.neighborsSignificance;\n        var width = this.width, height = this.height;\n        var left = (column > 0);\n        var right = (column + 1 < width);\n        var i;\n\n        if (row > 0) {\n          i = index - width;\n          if (left) {\n            neighborsSignificance[i - 1] += 0x10;\n          }\n          if (right) {\n            neighborsSignificance[i + 1] += 0x10;\n          }\n          neighborsSignificance[i] += 0x04;\n        }\n\n        if (row + 1 < height) {\n          i = index + width;\n          if (left) {\n            neighborsSignificance[i - 1] += 0x10;\n          }\n          if (right) {\n            neighborsSignificance[i + 1] += 0x10;\n          }\n          neighborsSignificance[i] += 0x04;\n        }\n\n        if (left) {\n          neighborsSignificance[index - 1] += 0x01;\n        }\n        if (right) {\n          neighborsSignificance[index + 1] += 0x01;\n        }\n        neighborsSignificance[index] |= 0x80;\n      },\n      runSignificancePropogationPass:\n        function BitModel_runSignificancePropogationPass() {\n        var decoder = this.decoder;\n        var width = this.width, height = this.height;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var coefficentsSign = this.coefficentsSign;\n        var neighborsSignificance = this.neighborsSignificance;\n        var processingFlags = this.processingFlags;\n        var contexts = this.contexts;\n        var labels = this.contextLabelTable;\n        var bitsDecoded = this.bitsDecoded;\n        var processedInverseMask = ~1;\n        var processedMask = 1;\n        var firstMagnitudeBitMask = 2;\n\n        for (var i0 = 0; i0 < height; i0 += 4) {\n          for (var j = 0; j < width; j++) {\n            var index = i0 * width + j;\n            for (var i1 = 0; i1 < 4; i1++, index += width) {\n              var i = i0 + i1;\n              if (i >= height) {\n                break;\n              }\n              // clear processed flag first\n              processingFlags[index] &= processedInverseMask;\n\n              if (coefficentsMagnitude[index] ||\n                  !neighborsSignificance[index]) {\n                continue;\n              }\n\n              var contextLabel = labels[neighborsSignificance[index]];\n              var decision = decoder.readBit(contexts, contextLabel);\n              if (decision) {\n                var sign = this.decodeSignBit(i, j, index);\n                coefficentsSign[index] = sign;\n                coefficentsMagnitude[index] = 1;\n                this.setNeighborsSignificance(i, j, index);\n                processingFlags[index] |= firstMagnitudeBitMask;\n              }\n              bitsDecoded[index]++;\n              processingFlags[index] |= processedMask;\n            }\n          }\n        }\n      },\n      decodeSignBit: function BitModel_decodeSignBit(row, column, index) {\n        var width = this.width, height = this.height;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var coefficentsSign = this.coefficentsSign;\n        var contribution, sign0, sign1, significance1;\n        var contextLabel, decoded;\n\n        // calculate horizontal contribution\n        significance1 = (column > 0 && coefficentsMagnitude[index - 1] !== 0);\n        if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) {\n          sign1 = coefficentsSign[index + 1];\n          if (significance1) {\n            sign0 = coefficentsSign[index - 1];\n            contribution = 1 - sign1 - sign0;\n          } else {\n            contribution = 1 - sign1 - sign1;\n          }\n        } else if (significance1) {\n          sign0 = coefficentsSign[index - 1];\n          contribution = 1 - sign0 - sign0;\n        } else {\n          contribution = 0;\n        }\n        var horizontalContribution = 3 * contribution;\n\n        // calculate vertical contribution and combine with the horizontal\n        significance1 = (row > 0 && coefficentsMagnitude[index - width] !== 0);\n        if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) {\n          sign1 = coefficentsSign[index + width];\n          if (significance1) {\n            sign0 = coefficentsSign[index - width];\n            contribution = 1 - sign1 - sign0 + horizontalContribution;\n          } else {\n            contribution = 1 - sign1 - sign1 + horizontalContribution;\n          }\n        } else if (significance1) {\n          sign0 = coefficentsSign[index - width];\n          contribution = 1 - sign0 - sign0 + horizontalContribution;\n        } else {\n          contribution = horizontalContribution;\n        }\n\n        if (contribution >= 0) {\n          contextLabel = 9 + contribution;\n          decoded = this.decoder.readBit(this.contexts, contextLabel);\n        } else {\n          contextLabel = 9 - contribution;\n          decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1;\n        }\n        return decoded;\n      },\n      runMagnitudeRefinementPass:\n        function BitModel_runMagnitudeRefinementPass() {\n        var decoder = this.decoder;\n        var width = this.width, height = this.height;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var neighborsSignificance = this.neighborsSignificance;\n        var contexts = this.contexts;\n        var bitsDecoded = this.bitsDecoded;\n        var processingFlags = this.processingFlags;\n        var processedMask = 1;\n        var firstMagnitudeBitMask = 2;\n        var length = width * height;\n        var width4 = width * 4;\n\n        for (var index0 = 0, indexNext; index0 < length; index0 = indexNext) {\n          indexNext = Math.min(length, index0 + width4);\n          for (var j = 0; j < width; j++) {\n            for (var index = index0 + j; index < indexNext; index += width) {\n\n              // significant but not those that have just become\n              if (!coefficentsMagnitude[index] ||\n                (processingFlags[index] & processedMask) !== 0) {\n                continue;\n              }\n\n              var contextLabel = 16;\n              if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) {\n                processingFlags[index] ^= firstMagnitudeBitMask;\n                // first refinement\n               var significance = neighborsSignificance[index] & 127;\n               contextLabel = significance === 0 ? 15 : 14;\n              }\n\n              var bit = decoder.readBit(contexts, contextLabel);\n              coefficentsMagnitude[index] =\n                (coefficentsMagnitude[index] << 1) | bit;\n              bitsDecoded[index]++;\n              processingFlags[index] |= processedMask;\n            }\n          }\n        }\n      },\n      runCleanupPass: function BitModel_runCleanupPass() {\n        var decoder = this.decoder;\n        var width = this.width, height = this.height;\n        var neighborsSignificance = this.neighborsSignificance;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var coefficentsSign = this.coefficentsSign;\n        var contexts = this.contexts;\n        var labels = this.contextLabelTable;\n        var bitsDecoded = this.bitsDecoded;\n        var processingFlags = this.processingFlags;\n        var processedMask = 1;\n        var firstMagnitudeBitMask = 2;\n        var oneRowDown = width;\n        var twoRowsDown = width * 2;\n        var threeRowsDown = width * 3;\n        var iNext;\n        for (var i0 = 0; i0 < height; i0 = iNext) {\n          iNext = Math.min(i0 + 4, height);\n          var indexBase = i0 * width;\n          var checkAllEmpty = i0 + 3 < height;\n          for (var j = 0; j < width; j++) {\n            var index0 = indexBase + j;\n            // using the property: labels[neighborsSignificance[index]] === 0\n            // when neighborsSignificance[index] === 0\n            var allEmpty = (checkAllEmpty &&\n              processingFlags[index0] === 0 &&\n              processingFlags[index0 + oneRowDown] === 0 &&\n              processingFlags[index0 + twoRowsDown] === 0 &&\n              processingFlags[index0 + threeRowsDown] === 0 &&\n              neighborsSignificance[index0] === 0 &&\n              neighborsSignificance[index0 + oneRowDown] === 0 &&\n              neighborsSignificance[index0 + twoRowsDown] === 0 &&\n              neighborsSignificance[index0 + threeRowsDown] === 0);\n            var i1 = 0, index = index0;\n            var i = i0, sign;\n            if (allEmpty) {\n              var hasSignificantCoefficent =\n                decoder.readBit(contexts, RUNLENGTH_CONTEXT);\n              if (!hasSignificantCoefficent) {\n                bitsDecoded[index0]++;\n                bitsDecoded[index0 + oneRowDown]++;\n                bitsDecoded[index0 + twoRowsDown]++;\n                bitsDecoded[index0 + threeRowsDown]++;\n                continue; // next column\n              }\n              i1 = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) |\n                    decoder.readBit(contexts, UNIFORM_CONTEXT);\n              if (i1 !== 0) {\n                i = i0 + i1;\n                index += i1 * width;\n              }\n\n              sign = this.decodeSignBit(i, j, index);\n              coefficentsSign[index] = sign;\n              coefficentsMagnitude[index] = 1;\n              this.setNeighborsSignificance(i, j, index);\n              processingFlags[index] |= firstMagnitudeBitMask;\n\n              index = index0;\n              for (var i2 = i0; i2 <= i; i2++, index += width) {\n                bitsDecoded[index]++;\n              }\n\n              i1++;\n            }\n            for (i = i0 + i1; i < iNext; i++, index += width) {\n              if (coefficentsMagnitude[index] ||\n                (processingFlags[index] & processedMask) !== 0) {\n                continue;\n              }\n\n              var contextLabel = labels[neighborsSignificance[index]];\n              var decision = decoder.readBit(contexts, contextLabel);\n              if (decision === 1) {\n                sign = this.decodeSignBit(i, j, index);\n                coefficentsSign[index] = sign;\n                coefficentsMagnitude[index] = 1;\n                this.setNeighborsSignificance(i, j, index);\n                processingFlags[index] |= firstMagnitudeBitMask;\n              }\n              bitsDecoded[index]++;\n            }\n          }\n        }\n      },\n      checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() {\n        var decoder = this.decoder;\n        var contexts = this.contexts;\n        var symbol = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 3) |\n                     (decoder.readBit(contexts, UNIFORM_CONTEXT) << 2) |\n                     (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) |\n                      decoder.readBit(contexts, UNIFORM_CONTEXT);\n        if (symbol !== 0xA) {\n          throw new Error('JPX Error: Invalid segmentation symbol');\n        }\n      }\n    };\n\n    return BitModel;\n  })();\n\n  // Section F, Discrete wavelet transformation\n  var Transform = (function TransformClosure() {\n    function Transform() {}\n\n    Transform.prototype.calculate =\n      function transformCalculate(subbands, u0, v0) {\n      var ll = subbands[0];\n      for (var i = 1, ii = subbands.length; i < ii; i++) {\n        ll = this.iterate(ll, subbands[i], u0, v0);\n      }\n      return ll;\n    };\n    Transform.prototype.extend = function extend(buffer, offset, size) {\n      // Section F.3.7 extending... using max extension of 4\n      var i1 = offset - 1, j1 = offset + 1;\n      var i2 = offset + size - 2, j2 = offset + size;\n      buffer[i1--] = buffer[j1++];\n      buffer[j2++] = buffer[i2--];\n      buffer[i1--] = buffer[j1++];\n      buffer[j2++] = buffer[i2--];\n      buffer[i1--] = buffer[j1++];\n      buffer[j2++] = buffer[i2--];\n      buffer[i1] = buffer[j1];\n      buffer[j2] = buffer[i2];\n    };\n    Transform.prototype.iterate = function Transform_iterate(ll, hl_lh_hh,\n                                                             u0, v0) {\n      var llWidth = ll.width, llHeight = ll.height, llItems = ll.items;\n      var width = hl_lh_hh.width;\n      var height = hl_lh_hh.height;\n      var items = hl_lh_hh.items;\n      var i, j, k, l, u, v;\n\n      // Interleave LL according to Section F.3.3\n      for (k = 0, i = 0; i < llHeight; i++) {\n        l = i * 2 * width;\n        for (j = 0; j < llWidth; j++, k++, l += 2) {\n          items[l] = llItems[k];\n        }\n      }\n      // The LL band is not needed anymore.\n      llItems = ll.items = null;\n\n      var bufferPadding = 4;\n      var rowBuffer = new Float32Array(width + 2 * bufferPadding);\n\n      // Section F.3.4 HOR_SR\n      if (width === 1) {\n        // if width = 1, when u0 even keep items as is, when odd divide by 2\n        if ((u0 & 1) !== 0) {\n          for (v = 0, k = 0; v < height; v++, k += width) {\n            items[k] *= 0.5;\n          }\n        }\n      } else {\n        for (v = 0, k = 0; v < height; v++, k += width) {\n          rowBuffer.set(items.subarray(k, k + width), bufferPadding);\n\n          this.extend(rowBuffer, bufferPadding, width);\n          this.filter(rowBuffer, bufferPadding, width);\n\n          items.set(\n            rowBuffer.subarray(bufferPadding, bufferPadding + width),\n            k);\n        }\n      }\n\n      // Accesses to the items array can take long, because it may not fit into\n      // CPU cache and has to be fetched from main memory. Since subsequent\n      // accesses to the items array are not local when reading columns, we\n      // have a cache miss every time. To reduce cache misses, get up to\n      // 'numBuffers' items at a time and store them into the individual\n      // buffers. The colBuffers should be small enough to fit into CPU cache.\n      var numBuffers = 16;\n      var colBuffers = [];\n      for (i = 0; i < numBuffers; i++) {\n        colBuffers.push(new Float32Array(height + 2 * bufferPadding));\n      }\n      var b, currentBuffer = 0;\n      ll = bufferPadding + height;\n\n      // Section F.3.5 VER_SR\n      if (height === 1) {\n          // if height = 1, when v0 even keep items as is, when odd divide by 2\n        if ((v0 & 1) !== 0) {\n          for (u = 0; u < width; u++) {\n            items[u] *= 0.5;\n          }\n        }\n      } else {\n        for (u = 0; u < width; u++) {\n          // if we ran out of buffers, copy several image columns at once\n          if (currentBuffer === 0) {\n            numBuffers = Math.min(width - u, numBuffers);\n            for (k = u, l = bufferPadding; l < ll; k += width, l++) {\n              for (b = 0; b < numBuffers; b++) {\n                colBuffers[b][l] = items[k + b];\n              }\n            }\n            currentBuffer = numBuffers;\n          }\n\n          currentBuffer--;\n          var buffer = colBuffers[currentBuffer];\n          this.extend(buffer, bufferPadding, height);\n          this.filter(buffer, bufferPadding, height);\n\n          // If this is last buffer in this group of buffers, flush all buffers.\n          if (currentBuffer === 0) {\n            k = u - numBuffers + 1;\n            for (l = bufferPadding; l < ll; k += width, l++) {\n              for (b = 0; b < numBuffers; b++) {\n                items[k + b] = colBuffers[b][l];\n              }\n            }\n          }\n        }\n      }\n\n      return {\n        width: width,\n        height: height,\n        items: items\n      };\n    };\n    return Transform;\n  })();\n\n  // Section 3.8.2 Irreversible 9-7 filter\n  var IrreversibleTransform = (function IrreversibleTransformClosure() {\n    function IrreversibleTransform() {\n      Transform.call(this);\n    }\n\n    IrreversibleTransform.prototype = Object.create(Transform.prototype);\n    IrreversibleTransform.prototype.filter =\n      function irreversibleTransformFilter(x, offset, length) {\n      var len = length >> 1;\n      offset = offset | 0;\n      var j, n, current, next;\n\n      var alpha = -1.586134342059924;\n      var beta = -0.052980118572961;\n      var gamma = 0.882911075530934;\n      var delta = 0.443506852043971;\n      var K = 1.230174104914001;\n      var K_ = 1 / K;\n\n      // step 1 is combined with step 3\n\n      // step 2\n      j = offset - 3;\n      for (n = len + 4; n--; j += 2) {\n        x[j] *= K_;\n      }\n\n      // step 1 & 3\n      j = offset - 2;\n      current = delta * x[j -1];\n      for (n = len + 3; n--; j += 2) {\n        next = delta * x[j + 1];\n        x[j] = K * x[j] - current - next;\n        if (n--) {\n          j += 2;\n          current = delta * x[j + 1];\n          x[j] = K * x[j] - current - next;\n        } else {\n          break;\n        }\n      }\n\n      // step 4\n      j = offset - 1;\n      current = gamma * x[j - 1];\n      for (n = len + 2; n--; j += 2) {\n        next = gamma * x[j + 1];\n        x[j] -= current + next;\n        if (n--) {\n          j += 2;\n          current = gamma * x[j + 1];\n          x[j] -= current + next;\n        } else {\n          break;\n        }\n      }\n\n      // step 5\n      j = offset;\n      current = beta * x[j - 1];\n      for (n = len + 1; n--; j += 2) {\n        next = beta * x[j + 1];\n        x[j] -= current + next;\n        if (n--) {\n          j += 2;\n          current = beta * x[j + 1];\n          x[j] -= current + next;\n        } else {\n          break;\n        }\n      }\n\n      // step 6\n      if (len !== 0) {\n        j = offset + 1;\n        current = alpha * x[j - 1];\n        for (n = len; n--; j += 2) {\n          next = alpha * x[j + 1];\n          x[j] -= current + next;\n          if (n--) {\n            j += 2;\n            current = alpha * x[j + 1];\n            x[j] -= current + next;\n          } else {\n            break;\n          }\n        }\n      }\n    };\n\n    return IrreversibleTransform;\n  })();\n\n  // Section 3.8.1 Reversible 5-3 filter\n  var ReversibleTransform = (function ReversibleTransformClosure() {\n    function ReversibleTransform() {\n      Transform.call(this);\n    }\n\n    ReversibleTransform.prototype = Object.create(Transform.prototype);\n    ReversibleTransform.prototype.filter =\n      function reversibleTransformFilter(x, offset, length) {\n      var len = length >> 1;\n      offset = offset | 0;\n      var j, n;\n\n      for (j = offset, n = len + 1; n--; j += 2) {\n        x[j] -= (x[j - 1] + x[j + 1] + 2) >> 2;\n      }\n\n      for (j = offset + 1, n = len; n--; j += 2) {\n        x[j] += (x[j - 1] + x[j + 1]) >> 1;\n      }\n    };\n\n    return ReversibleTransform;\n  })();\n\n  return JpxImage;\n})();\n\n\nvar Jbig2Image = (function Jbig2ImageClosure() {\n  // Utility data structures\n  function ContextCache() {}\n\n  ContextCache.prototype = {\n    getContexts: function(id) {\n      if (id in this) {\n        return this[id];\n      }\n      return (this[id] = new Int8Array(1 << 16));\n    }\n  };\n\n  function DecodingContext(data, start, end) {\n    this.data = data;\n    this.start = start;\n    this.end = end;\n  }\n\n  DecodingContext.prototype = {\n    get decoder() {\n      var decoder = new ArithmeticDecoder(this.data, this.start, this.end);\n      return shadow(this, 'decoder', decoder);\n    },\n    get contextCache() {\n      var cache = new ContextCache();\n      return shadow(this, 'contextCache', cache);\n    }\n  };\n\n  // Annex A. Arithmetic Integer Decoding Procedure\n  // A.2 Procedure for decoding values\n  function decodeInteger(contextCache, procedure, decoder) {\n    var contexts = contextCache.getContexts(procedure);\n    var prev = 1;\n\n    function readBits(length) {\n      var v = 0;\n      for (var i = 0; i < length; i++) {\n        var bit = decoder.readBit(contexts, prev);\n        prev = (prev < 256 ? (prev << 1) | bit :\n                (((prev << 1) | bit) & 511) | 256);\n        v = (v << 1) | bit;\n      }\n      return v >>> 0;\n    }\n\n    var sign = readBits(1);\n    var value = readBits(1) ?\n                  (readBits(1) ?\n                    (readBits(1) ?\n                      (readBits(1) ?\n                        (readBits(1) ?\n                          (readBits(32) + 4436) :\n                        readBits(12) + 340) :\n                      readBits(8) + 84) :\n                    readBits(6) + 20) :\n                  readBits(4) + 4) :\n                readBits(2);\n    return (sign === 0 ? value : (value > 0 ? -value : null));\n  }\n\n  // A.3 The IAID decoding procedure\n  function decodeIAID(contextCache, decoder, codeLength) {\n    var contexts = contextCache.getContexts('IAID');\n\n    var prev = 1;\n    for (var i = 0; i < codeLength; i++) {\n      var bit = decoder.readBit(contexts, prev);\n      prev = (prev << 1) | bit;\n    }\n    if (codeLength < 31) {\n      return prev & ((1 << codeLength) - 1);\n    }\n    return prev & 0x7FFFFFFF;\n  }\n\n  // 7.3 Segment types\n  var SegmentTypes = [\n    'SymbolDictionary', null, null, null, 'IntermediateTextRegion', null,\n    'ImmediateTextRegion', 'ImmediateLosslessTextRegion', null, null, null,\n    null, null, null, null, null, 'patternDictionary', null, null, null,\n    'IntermediateHalftoneRegion', null, 'ImmediateHalftoneRegion',\n    'ImmediateLosslessHalftoneRegion', null, null, null, null, null, null, null,\n    null, null, null, null, null, 'IntermediateGenericRegion', null,\n    'ImmediateGenericRegion', 'ImmediateLosslessGenericRegion',\n    'IntermediateGenericRefinementRegion', null,\n    'ImmediateGenericRefinementRegion',\n    'ImmediateLosslessGenericRefinementRegion', null, null, null, null,\n    'PageInformation', 'EndOfPage', 'EndOfStripe', 'EndOfFile', 'Profiles',\n    'Tables', null, null, null, null, null, null, null, null,\n    'Extension'\n  ];\n\n  var CodingTemplates = [\n    [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1},\n     {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: 2, y: -1},\n     {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}],\n    [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: 2, y: -2},\n     {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1},\n     {x: 2, y: -1}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}],\n    [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1},\n     {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -2, y: 0},\n     {x: -1, y: 0}],\n    [{x: -3, y: -1}, {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1},\n     {x: 1, y: -1}, {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}]\n  ];\n\n  var RefinementTemplates = [\n    {\n      coding: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}],\n      reference: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}, {x: 0, y: 0},\n                  {x: 1, y: 0}, {x: -1, y: 1}, {x: 0, y: 1}, {x: 1, y: 1}]\n    },\n    {\n      coding: [{x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}],\n      reference: [{x: 0, y: -1}, {x: -1, y: 0}, {x: 0, y: 0}, {x: 1, y: 0},\n                  {x: 0, y: 1}, {x: 1, y: 1}]\n    }\n  ];\n\n  // See 6.2.5.7 Decoding the bitmap.\n  var ReusedContexts = [\n    0x9B25, // 10011 0110010 0101\n    0x0795, // 0011 110010 101\n    0x00E5, // 001 11001 01\n    0x0195  // 011001 0101\n  ];\n\n  var RefinementReusedContexts = [\n    0x0020, // '000' + '0' (coding) + '00010000' + '0' (reference)\n    0x0008  // '0000' + '001000'\n  ];\n\n  function decodeBitmapTemplate0(width, height, decodingContext) {\n    var decoder = decodingContext.decoder;\n    var contexts = decodingContext.contextCache.getContexts('GB');\n    var contextLabel, i, j, pixel, row, row1, row2, bitmap = [];\n\n    // ...ooooo....\n    // ..ooooooo... Context template for current pixel (X)\n    // .ooooX...... (concatenate values of 'o'-pixels to get contextLabel)\n    var OLD_PIXEL_MASK = 0x7BF7; // 01111 0111111 0111\n\n    for (i = 0; i < height; i++) {\n      row = bitmap[i] = new Uint8Array(width);\n      row1 = (i < 1) ? row : bitmap[i - 1];\n      row2 = (i < 2) ? row : bitmap[i - 2];\n\n      // At the beginning of each row:\n      // Fill contextLabel with pixels that are above/right of (X)\n      contextLabel = (row2[0] << 13) | (row2[1] << 12) | (row2[2] << 11) |\n                     (row1[0] << 7) | (row1[1] << 6) | (row1[2] << 5) |\n                     (row1[3] << 4);\n\n      for (j = 0; j < width; j++) {\n        row[j] = pixel = decoder.readBit(contexts, contextLabel);\n\n        // At each pixel: Clear contextLabel pixels that are shifted\n        // out of the context, then add new ones.\n        contextLabel = ((contextLabel & OLD_PIXEL_MASK) << 1) |\n                       (j + 3 < width ? row2[j + 3] << 11 : 0) |\n                       (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel;\n      }\n    }\n\n    return bitmap;\n  }\n\n  // 6.2 Generic Region Decoding Procedure\n  function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at,\n                        decodingContext) {\n    if (mmr) {\n      error('JBIG2 error: MMR encoding is not supported');\n    }\n\n    // Use optimized version for the most common case\n    if (templateIndex === 0 && !skip && !prediction && at.length === 4 &&\n        at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 &&\n        at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) {\n      return decodeBitmapTemplate0(width, height, decodingContext);\n    }\n\n    var useskip = !!skip;\n    var template = CodingTemplates[templateIndex].concat(at);\n\n    // Sorting is non-standard, and it is not required. But sorting increases\n    // the number of template bits that can be reused from the previous\n    // contextLabel in the main loop.\n    template.sort(function (a, b) {\n      return (a.y - b.y) || (a.x - b.x);\n    });\n\n    var templateLength = template.length;\n    var templateX = new Int8Array(templateLength);\n    var templateY = new Int8Array(templateLength);\n    var changingTemplateEntries = [];\n    var reuseMask = 0, minX = 0, maxX = 0, minY = 0;\n    var c, k;\n\n    for (k = 0; k < templateLength; k++) {\n      templateX[k] = template[k].x;\n      templateY[k] = template[k].y;\n      minX = Math.min(minX, template[k].x);\n      maxX = Math.max(maxX, template[k].x);\n      minY = Math.min(minY, template[k].y);\n      // Check if the template pixel appears in two consecutive context labels,\n      // so it can be reused. Otherwise, we add it to the list of changing\n      // template entries.\n      if (k < templateLength - 1 &&\n          template[k].y === template[k + 1].y &&\n          template[k].x === template[k + 1].x - 1) {\n        reuseMask |= 1 << (templateLength - 1 - k);\n      } else {\n        changingTemplateEntries.push(k);\n      }\n    }\n    var changingEntriesLength = changingTemplateEntries.length;\n\n    var changingTemplateX = new Int8Array(changingEntriesLength);\n    var changingTemplateY = new Int8Array(changingEntriesLength);\n    var changingTemplateBit = new Uint16Array(changingEntriesLength);\n    for (c = 0; c < changingEntriesLength; c++) {\n      k = changingTemplateEntries[c];\n      changingTemplateX[c] = template[k].x;\n      changingTemplateY[c] = template[k].y;\n      changingTemplateBit[c] = 1 << (templateLength - 1 - k);\n    }\n\n    // Get the safe bounding box edges from the width, height, minX, maxX, minY\n    var sbb_left = -minX;\n    var sbb_top = -minY;\n    var sbb_right = width - maxX;\n\n    var pseudoPixelContext = ReusedContexts[templateIndex];\n    var row = new Uint8Array(width);\n    var bitmap = [];\n\n    var decoder = decodingContext.decoder;\n    var contexts = decodingContext.contextCache.getContexts('GB');\n\n    var ltp = 0, j, i0, j0, contextLabel = 0, bit, shift;\n    for (var i = 0; i < height; i++) {\n      if (prediction) {\n        var sltp = decoder.readBit(contexts, pseudoPixelContext);\n        ltp ^= sltp;\n        if (ltp) {\n          bitmap.push(row); // duplicate previous row\n          continue;\n        }\n      }\n      row = new Uint8Array(row);\n      bitmap.push(row);\n      for (j = 0; j < width; j++) {\n        if (useskip && skip[i][j]) {\n          row[j] = 0;\n          continue;\n        }\n        // Are we in the middle of a scanline, so we can reuse contextLabel\n        // bits?\n        if (j >= sbb_left && j < sbb_right && i >= sbb_top) {\n          // If yes, we can just shift the bits that are reusable and only\n          // fetch the remaining ones.\n          contextLabel = (contextLabel << 1) & reuseMask;\n          for (k = 0; k < changingEntriesLength; k++) {\n            i0 = i + changingTemplateY[k];\n            j0 = j + changingTemplateX[k];\n            bit = bitmap[i0][j0];\n            if (bit) {\n              bit = changingTemplateBit[k];\n              contextLabel |= bit;\n            }\n          }\n        } else {\n          // compute the contextLabel from scratch\n          contextLabel = 0;\n          shift = templateLength - 1;\n          for (k = 0; k < templateLength; k++, shift--) {\n            j0 = j + templateX[k];\n            if (j0 >= 0 && j0 < width) {\n              i0 = i + templateY[k];\n              if (i0 >= 0) {\n                bit = bitmap[i0][j0];\n                if (bit) {\n                  contextLabel |= bit << shift;\n                }\n              }\n            }\n          }\n        }\n        var pixel = decoder.readBit(contexts, contextLabel);\n        row[j] = pixel;\n      }\n    }\n    return bitmap;\n  }\n\n  // 6.3.2 Generic Refinement Region Decoding Procedure\n  function decodeRefinement(width, height, templateIndex, referenceBitmap,\n                            offsetX, offsetY, prediction, at,\n                            decodingContext) {\n    var codingTemplate = RefinementTemplates[templateIndex].coding;\n    if (templateIndex === 0) {\n      codingTemplate = codingTemplate.concat([at[0]]);\n    }\n    var codingTemplateLength = codingTemplate.length;\n    var codingTemplateX = new Int32Array(codingTemplateLength);\n    var codingTemplateY = new Int32Array(codingTemplateLength);\n    var k;\n    for (k = 0; k < codingTemplateLength; k++) {\n      codingTemplateX[k] = codingTemplate[k].x;\n      codingTemplateY[k] = codingTemplate[k].y;\n    }\n\n    var referenceTemplate = RefinementTemplates[templateIndex].reference;\n    if (templateIndex === 0) {\n      referenceTemplate = referenceTemplate.concat([at[1]]);\n    }\n    var referenceTemplateLength = referenceTemplate.length;\n    var referenceTemplateX = new Int32Array(referenceTemplateLength);\n    var referenceTemplateY = new Int32Array(referenceTemplateLength);\n    for (k = 0; k < referenceTemplateLength; k++) {\n      referenceTemplateX[k] = referenceTemplate[k].x;\n      referenceTemplateY[k] = referenceTemplate[k].y;\n    }\n    var referenceWidth = referenceBitmap[0].length;\n    var referenceHeight = referenceBitmap.length;\n\n    var pseudoPixelContext = RefinementReusedContexts[templateIndex];\n    var bitmap = [];\n\n    var decoder = decodingContext.decoder;\n    var contexts = decodingContext.contextCache.getContexts('GR');\n\n    var ltp = 0;\n    for (var i = 0; i < height; i++) {\n      if (prediction) {\n        var sltp = decoder.readBit(contexts, pseudoPixelContext);\n        ltp ^= sltp;\n        if (ltp) {\n          error('JBIG2 error: prediction is not supported');\n        }\n      }\n      var row = new Uint8Array(width);\n      bitmap.push(row);\n      for (var j = 0; j < width; j++) {\n        var i0, j0;\n        var contextLabel = 0;\n        for (k = 0; k < codingTemplateLength; k++) {\n          i0 = i + codingTemplateY[k];\n          j0 = j + codingTemplateX[k];\n          if (i0 < 0 || j0 < 0 || j0 >= width) {\n            contextLabel <<= 1; // out of bound pixel\n          } else {\n            contextLabel = (contextLabel << 1) | bitmap[i0][j0];\n          }\n        }\n        for (k = 0; k < referenceTemplateLength; k++) {\n          i0 = i + referenceTemplateY[k] + offsetY;\n          j0 = j + referenceTemplateX[k] + offsetX;\n          if (i0 < 0 || i0 >= referenceHeight || j0 < 0 ||\n              j0 >= referenceWidth) {\n            contextLabel <<= 1; // out of bound pixel\n          } else {\n            contextLabel = (contextLabel << 1) | referenceBitmap[i0][j0];\n          }\n        }\n        var pixel = decoder.readBit(contexts, contextLabel);\n        row[j] = pixel;\n      }\n    }\n\n    return bitmap;\n  }\n\n  // 6.5.5 Decoding the symbol dictionary\n  function decodeSymbolDictionary(huffman, refinement, symbols,\n                                  numberOfNewSymbols, numberOfExportedSymbols,\n                                  huffmanTables, templateIndex, at,\n                                  refinementTemplateIndex, refinementAt,\n                                  decodingContext) {\n    if (huffman) {\n      error('JBIG2 error: huffman is not supported');\n    }\n\n    var newSymbols = [];\n    var currentHeight = 0;\n    var symbolCodeLength = log2(symbols.length + numberOfNewSymbols);\n\n    var decoder = decodingContext.decoder;\n    var contextCache = decodingContext.contextCache;\n\n    while (newSymbols.length < numberOfNewSymbols) {\n      var deltaHeight = decodeInteger(contextCache, 'IADH', decoder); // 6.5.6\n      currentHeight += deltaHeight;\n      var currentWidth = 0;\n      var totalWidth = 0;\n      while (true) {\n        var deltaWidth = decodeInteger(contextCache, 'IADW', decoder); // 6.5.7\n        if (deltaWidth === null) {\n          break; // OOB\n        }\n        currentWidth += deltaWidth;\n        totalWidth += currentWidth;\n        var bitmap;\n        if (refinement) {\n          // 6.5.8.2 Refinement/aggregate-coded symbol bitmap\n          var numberOfInstances = decodeInteger(contextCache, 'IAAI', decoder);\n          if (numberOfInstances > 1) {\n            bitmap = decodeTextRegion(huffman, refinement,\n                                      currentWidth, currentHeight, 0,\n                                      numberOfInstances, 1, //strip size\n                                      symbols.concat(newSymbols),\n                                      symbolCodeLength,\n                                      0, //transposed\n                                      0, //ds offset\n                                      1, //top left 7.4.3.1.1\n                                      0, //OR operator\n                                      huffmanTables,\n                                      refinementTemplateIndex, refinementAt,\n                                      decodingContext);\n          } else {\n            var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);\n            var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3\n            var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4\n            var symbol = (symbolId < symbols.length ? symbols[symbolId] :\n                          newSymbols[symbolId - symbols.length]);\n            bitmap = decodeRefinement(currentWidth, currentHeight,\n            refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt,\n            decodingContext);\n          }\n        } else {\n          // 6.5.8.1 Direct-coded symbol bitmap\n          bitmap = decodeBitmap(false, currentWidth, currentHeight,\n            templateIndex, false, null, at, decodingContext);\n        }\n        newSymbols.push(bitmap);\n      }\n    }\n    // 6.5.10 Exported symbols\n    var exportedSymbols = [];\n    var flags = [], currentFlag = false;\n    var totalSymbolsLength = symbols.length + numberOfNewSymbols;\n    while (flags.length < totalSymbolsLength) {\n      var runLength = decodeInteger(contextCache, 'IAEX', decoder);\n      while (runLength--) {\n        flags.push(currentFlag);\n      }\n      currentFlag = !currentFlag;\n    }\n    for (var i = 0, ii = symbols.length; i < ii; i++) {\n      if (flags[i]) {\n        exportedSymbols.push(symbols[i]);\n      }\n    }\n    for (var j = 0; j < numberOfNewSymbols; i++, j++) {\n      if (flags[i]) {\n        exportedSymbols.push(newSymbols[j]);\n      }\n    }\n    return exportedSymbols;\n  }\n\n  function decodeTextRegion(huffman, refinement, width, height,\n                            defaultPixelValue, numberOfSymbolInstances,\n                            stripSize, inputSymbols, symbolCodeLength,\n                            transposed, dsOffset, referenceCorner,\n                            combinationOperator, huffmanTables,\n                            refinementTemplateIndex, refinementAt,\n                            decodingContext) {\n    if (huffman) {\n      error('JBIG2 error: huffman is not supported');\n    }\n\n    // Prepare bitmap\n    var bitmap = [];\n    var i, row;\n    for (i = 0; i < height; i++) {\n      row = new Uint8Array(width);\n      if (defaultPixelValue) {\n        for (var j = 0; j < width; j++) {\n          row[j] = defaultPixelValue;\n        }\n      }\n      bitmap.push(row);\n    }\n\n    var decoder = decodingContext.decoder;\n    var contextCache = decodingContext.contextCache;\n    var stripT = -decodeInteger(contextCache, 'IADT', decoder); // 6.4.6\n    var firstS = 0;\n    i = 0;\n    while (i < numberOfSymbolInstances) {\n      var deltaT = decodeInteger(contextCache, 'IADT', decoder); // 6.4.6\n      stripT += deltaT;\n\n      var deltaFirstS = decodeInteger(contextCache, 'IAFS', decoder); // 6.4.7\n      firstS += deltaFirstS;\n      var currentS = firstS;\n      do {\n        var currentT = (stripSize === 1 ? 0 :\n                        decodeInteger(contextCache, 'IAIT', decoder)); // 6.4.9\n        var t = stripSize * stripT + currentT;\n        var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);\n        var applyRefinement = (refinement &&\n                               decodeInteger(contextCache, 'IARI', decoder));\n        var symbolBitmap = inputSymbols[symbolId];\n        var symbolWidth = symbolBitmap[0].length;\n        var symbolHeight = symbolBitmap.length;\n        if (applyRefinement) {\n          var rdw = decodeInteger(contextCache, 'IARDW', decoder); // 6.4.11.1\n          var rdh = decodeInteger(contextCache, 'IARDH', decoder); // 6.4.11.2\n          var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3\n          var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4\n          symbolWidth += rdw;\n          symbolHeight += rdh;\n          symbolBitmap = decodeRefinement(symbolWidth, symbolHeight,\n            refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx,\n            (rdh >> 1) + rdy, false, refinementAt,\n            decodingContext);\n        }\n        var offsetT = t - ((referenceCorner & 1) ? 0 : symbolHeight);\n        var offsetS = currentS - ((referenceCorner & 2) ? symbolWidth : 0);\n        var s2, t2, symbolRow;\n        if (transposed) {\n          // Place Symbol Bitmap from T1,S1\n          for (s2 = 0; s2 < symbolHeight; s2++) {\n            row = bitmap[offsetS + s2];\n            if (!row) {\n              continue;\n            }\n            symbolRow = symbolBitmap[s2];\n            // To ignore Parts of Symbol bitmap which goes\n            // outside bitmap region\n            var maxWidth = Math.min(width - offsetT, symbolWidth);\n            switch (combinationOperator) {\n              case 0: // OR\n                for (t2 = 0; t2 < maxWidth; t2++) {\n                  row[offsetT + t2] |= symbolRow[t2];\n                }\n                break;\n              case 2: // XOR\n                for (t2 = 0; t2 < maxWidth; t2++) {\n                  row[offsetT + t2] ^= symbolRow[t2];\n                }\n                break;\n              default:\n                error('JBIG2 error: operator ' + combinationOperator +\n                      ' is not supported');\n            }\n          }\n          currentS += symbolHeight - 1;\n        } else {\n          for (t2 = 0; t2 < symbolHeight; t2++) {\n            row = bitmap[offsetT + t2];\n            if (!row) {\n              continue;\n            }\n            symbolRow = symbolBitmap[t2];\n            switch (combinationOperator) {\n              case 0: // OR\n                for (s2 = 0; s2 < symbolWidth; s2++) {\n                  row[offsetS + s2] |= symbolRow[s2];\n                }\n                break;\n              case 2: // XOR\n                for (s2 = 0; s2 < symbolWidth; s2++) {\n                  row[offsetS + s2] ^= symbolRow[s2];\n                }\n                break;\n              default:\n                error('JBIG2 error: operator ' + combinationOperator +\n                      ' is not supported');\n            }\n          }\n          currentS += symbolWidth - 1;\n        }\n        i++;\n        var deltaS = decodeInteger(contextCache, 'IADS', decoder); // 6.4.8\n        if (deltaS === null) {\n          break; // OOB\n        }\n        currentS += deltaS + dsOffset;\n      } while (true);\n    }\n    return bitmap;\n  }\n\n  function readSegmentHeader(data, start) {\n    var segmentHeader = {};\n    segmentHeader.number = readUint32(data, start);\n    var flags = data[start + 4];\n    var segmentType = flags & 0x3F;\n    if (!SegmentTypes[segmentType]) {\n      error('JBIG2 error: invalid segment type: ' + segmentType);\n    }\n    segmentHeader.type = segmentType;\n    segmentHeader.typeName = SegmentTypes[segmentType];\n    segmentHeader.deferredNonRetain = !!(flags & 0x80);\n\n    var pageAssociationFieldSize = !!(flags & 0x40);\n    var referredFlags = data[start + 5];\n    var referredToCount = (referredFlags >> 5) & 7;\n    var retainBits = [referredFlags & 31];\n    var position = start + 6;\n    if (referredFlags === 7) {\n      referredToCount = readUint32(data, position - 1) & 0x1FFFFFFF;\n      position += 3;\n      var bytes = (referredToCount + 7) >> 3;\n      retainBits[0] = data[position++];\n      while (--bytes > 0) {\n        retainBits.push(data[position++]);\n      }\n    } else if (referredFlags === 5 || referredFlags === 6) {\n      error('JBIG2 error: invalid referred-to flags');\n    }\n\n    segmentHeader.retainBits = retainBits;\n    var referredToSegmentNumberSize = (segmentHeader.number <= 256 ? 1 :\n      (segmentHeader.number <= 65536 ? 2 : 4));\n    var referredTo = [];\n    var i, ii;\n    for (i = 0; i < referredToCount; i++) {\n      var number = (referredToSegmentNumberSize === 1 ? data[position] :\n        (referredToSegmentNumberSize === 2 ? readUint16(data, position) :\n        readUint32(data, position)));\n      referredTo.push(number);\n      position += referredToSegmentNumberSize;\n    }\n    segmentHeader.referredTo = referredTo;\n    if (!pageAssociationFieldSize) {\n      segmentHeader.pageAssociation = data[position++];\n    } else {\n      segmentHeader.pageAssociation = readUint32(data, position);\n      position += 4;\n    }\n    segmentHeader.length = readUint32(data, position);\n    position += 4;\n\n    if (segmentHeader.length === 0xFFFFFFFF) {\n      // 7.2.7 Segment data length, unknown segment length\n      if (segmentType === 38) { // ImmediateGenericRegion\n        var genericRegionInfo = readRegionSegmentInformation(data, position);\n        var genericRegionSegmentFlags = data[position +\n          RegionSegmentInformationFieldLength];\n        var genericRegionMmr = !!(genericRegionSegmentFlags & 1);\n        // searching for the segment end\n        var searchPatternLength = 6;\n        var searchPattern = new Uint8Array(searchPatternLength);\n        if (!genericRegionMmr) {\n          searchPattern[0] = 0xFF;\n          searchPattern[1] = 0xAC;\n        }\n        searchPattern[2] = (genericRegionInfo.height >>> 24) & 0xFF;\n        searchPattern[3] = (genericRegionInfo.height >> 16) & 0xFF;\n        searchPattern[4] = (genericRegionInfo.height >> 8) & 0xFF;\n        searchPattern[5] = genericRegionInfo.height & 0xFF;\n        for (i = position, ii = data.length; i < ii; i++) {\n          var j = 0;\n          while (j < searchPatternLength && searchPattern[j] === data[i + j]) {\n            j++;\n          }\n          if (j === searchPatternLength) {\n            segmentHeader.length = i + searchPatternLength;\n            break;\n          }\n        }\n        if (segmentHeader.length === 0xFFFFFFFF) {\n          error('JBIG2 error: segment end was not found');\n        }\n      } else {\n        error('JBIG2 error: invalid unknown segment length');\n      }\n    }\n    segmentHeader.headerEnd = position;\n    return segmentHeader;\n  }\n\n  function readSegments(header, data, start, end) {\n    var segments = [];\n    var position = start;\n    while (position < end) {\n      var segmentHeader = readSegmentHeader(data, position);\n      position = segmentHeader.headerEnd;\n      var segment = {\n        header: segmentHeader,\n        data: data\n      };\n      if (!header.randomAccess) {\n        segment.start = position;\n        position += segmentHeader.length;\n        segment.end = position;\n      }\n      segments.push(segment);\n      if (segmentHeader.type === 51) {\n        break; // end of file is found\n      }\n    }\n    if (header.randomAccess) {\n      for (var i = 0, ii = segments.length; i < ii; i++) {\n        segments[i].start = position;\n        position += segments[i].header.length;\n        segments[i].end = position;\n      }\n    }\n    return segments;\n  }\n\n  // 7.4.1 Region segment information field\n  function readRegionSegmentInformation(data, start) {\n    return {\n      width: readUint32(data, start),\n      height: readUint32(data, start + 4),\n      x: readUint32(data, start + 8),\n      y: readUint32(data, start + 12),\n      combinationOperator: data[start + 16] & 7\n    };\n  }\n  var RegionSegmentInformationFieldLength = 17;\n\n  function processSegment(segment, visitor) {\n    var header = segment.header;\n\n    var data = segment.data, position = segment.start, end = segment.end;\n    var args, at, i, atLength;\n    switch (header.type) {\n      case 0: // SymbolDictionary\n        // 7.4.2 Symbol dictionary segment syntax\n        var dictionary = {};\n        var dictionaryFlags = readUint16(data, position); // 7.4.2.1.1\n        dictionary.huffman = !!(dictionaryFlags & 1);\n        dictionary.refinement = !!(dictionaryFlags & 2);\n        dictionary.huffmanDHSelector = (dictionaryFlags >> 2) & 3;\n        dictionary.huffmanDWSelector = (dictionaryFlags >> 4) & 3;\n        dictionary.bitmapSizeSelector = (dictionaryFlags >> 6) & 1;\n        dictionary.aggregationInstancesSelector = (dictionaryFlags >> 7) & 1;\n        dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256);\n        dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512);\n        dictionary.template = (dictionaryFlags >> 10) & 3;\n        dictionary.refinementTemplate = (dictionaryFlags >> 12) & 1;\n        position += 2;\n        if (!dictionary.huffman) {\n          atLength = dictionary.template === 0 ? 4 : 1;\n          at = [];\n          for (i = 0; i < atLength; i++) {\n            at.push({\n              x: readInt8(data, position),\n              y: readInt8(data, position + 1)\n            });\n            position += 2;\n          }\n          dictionary.at = at;\n        }\n        if (dictionary.refinement && !dictionary.refinementTemplate) {\n          at = [];\n          for (i = 0; i < 2; i++) {\n            at.push({\n              x: readInt8(data, position),\n              y: readInt8(data, position + 1)\n            });\n            position += 2;\n          }\n          dictionary.refinementAt = at;\n        }\n        dictionary.numberOfExportedSymbols = readUint32(data, position);\n        position += 4;\n        dictionary.numberOfNewSymbols = readUint32(data, position);\n        position += 4;\n        args = [dictionary, header.number, header.referredTo,\n                data, position, end];\n        break;\n      case 6: // ImmediateTextRegion\n      case 7: // ImmediateLosslessTextRegion\n        var textRegion = {};\n        textRegion.info = readRegionSegmentInformation(data, position);\n        position += RegionSegmentInformationFieldLength;\n        var textRegionSegmentFlags = readUint16(data, position);\n        position += 2;\n        textRegion.huffman = !!(textRegionSegmentFlags & 1);\n        textRegion.refinement = !!(textRegionSegmentFlags & 2);\n        textRegion.stripSize = 1 << ((textRegionSegmentFlags >> 2) & 3);\n        textRegion.referenceCorner = (textRegionSegmentFlags >> 4) & 3;\n        textRegion.transposed = !!(textRegionSegmentFlags & 64);\n        textRegion.combinationOperator = (textRegionSegmentFlags >> 7) & 3;\n        textRegion.defaultPixelValue = (textRegionSegmentFlags >> 9) & 1;\n        textRegion.dsOffset = (textRegionSegmentFlags << 17) >> 27;\n        textRegion.refinementTemplate = (textRegionSegmentFlags >> 15) & 1;\n        if (textRegion.huffman) {\n          var textRegionHuffmanFlags = readUint16(data, position);\n          position += 2;\n          textRegion.huffmanFS = (textRegionHuffmanFlags) & 3;\n          textRegion.huffmanDS = (textRegionHuffmanFlags >> 2) & 3;\n          textRegion.huffmanDT = (textRegionHuffmanFlags >> 4) & 3;\n          textRegion.huffmanRefinementDW = (textRegionHuffmanFlags >> 6) & 3;\n          textRegion.huffmanRefinementDH = (textRegionHuffmanFlags >> 8) & 3;\n          textRegion.huffmanRefinementDX = (textRegionHuffmanFlags >> 10) & 3;\n          textRegion.huffmanRefinementDY = (textRegionHuffmanFlags >> 12) & 3;\n          textRegion.huffmanRefinementSizeSelector =\n            !!(textRegionHuffmanFlags & 14);\n        }\n        if (textRegion.refinement && !textRegion.refinementTemplate) {\n          at = [];\n          for (i = 0; i < 2; i++) {\n            at.push({\n              x: readInt8(data, position),\n              y: readInt8(data, position + 1)\n            });\n            position += 2;\n          }\n          textRegion.refinementAt = at;\n        }\n        textRegion.numberOfSymbolInstances = readUint32(data, position);\n        position += 4;\n        // TODO 7.4.3.1.7 Symbol ID Huffman table decoding\n        if (textRegion.huffman) {\n          error('JBIG2 error: huffman is not supported');\n        }\n        args = [textRegion, header.referredTo, data, position, end];\n        break;\n      case 38: // ImmediateGenericRegion\n      case 39: // ImmediateLosslessGenericRegion\n        var genericRegion = {};\n        genericRegion.info = readRegionSegmentInformation(data, position);\n        position += RegionSegmentInformationFieldLength;\n        var genericRegionSegmentFlags = data[position++];\n        genericRegion.mmr = !!(genericRegionSegmentFlags & 1);\n        genericRegion.template = (genericRegionSegmentFlags >> 1) & 3;\n        genericRegion.prediction = !!(genericRegionSegmentFlags & 8);\n        if (!genericRegion.mmr) {\n          atLength = genericRegion.template === 0 ? 4 : 1;\n          at = [];\n          for (i = 0; i < atLength; i++) {\n            at.push({\n              x: readInt8(data, position),\n              y: readInt8(data, position + 1)\n            });\n            position += 2;\n          }\n          genericRegion.at = at;\n        }\n        args = [genericRegion, data, position, end];\n        break;\n      case 48: // PageInformation\n        var pageInfo = {\n          width: readUint32(data, position),\n          height: readUint32(data, position + 4),\n          resolutionX: readUint32(data, position + 8),\n          resolutionY: readUint32(data, position + 12)\n        };\n        if (pageInfo.height === 0xFFFFFFFF) {\n          delete pageInfo.height;\n        }\n        var pageSegmentFlags = data[position + 16];\n        var pageStripingInformatiom = readUint16(data, position + 17);\n        pageInfo.lossless = !!(pageSegmentFlags & 1);\n        pageInfo.refinement = !!(pageSegmentFlags & 2);\n        pageInfo.defaultPixelValue = (pageSegmentFlags >> 2) & 1;\n        pageInfo.combinationOperator = (pageSegmentFlags >> 3) & 3;\n        pageInfo.requiresBuffer = !!(pageSegmentFlags & 32);\n        pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64);\n        args = [pageInfo];\n        break;\n      case 49: // EndOfPage\n        break;\n      case 50: // EndOfStripe\n        break;\n      case 51: // EndOfFile\n        break;\n      case 62: // 7.4.15 defines 2 extension types which\n               // are comments and can be ignored.\n        break;\n      default:\n        error('JBIG2 error: segment type ' + header.typeName + '(' +\n              header.type + ') is not implemented');\n    }\n    var callbackName = 'on' + header.typeName;\n    if (callbackName in visitor) {\n      visitor[callbackName].apply(visitor, args);\n    }\n  }\n\n  function processSegments(segments, visitor) {\n    for (var i = 0, ii = segments.length; i < ii; i++) {\n      processSegment(segments[i], visitor);\n    }\n  }\n\n  function parseJbig2(data, start, end) {\n    var position = start;\n    if (data[position] !== 0x97 || data[position + 1] !== 0x4A ||\n        data[position + 2] !== 0x42 || data[position + 3] !== 0x32 ||\n        data[position + 4] !== 0x0D || data[position + 5] !== 0x0A ||\n        data[position + 6] !== 0x1A || data[position + 7] !== 0x0A) {\n      error('JBIG2 error: invalid header');\n    }\n    var header = {};\n    position += 8;\n    var flags = data[position++];\n    header.randomAccess = !(flags & 1);\n    if (!(flags & 2)) {\n      header.numberOfPages = readUint32(data, position);\n      position += 4;\n    }\n    var segments = readSegments(header, data, position, end);\n    error('Not implemented');\n    // processSegments(segments, new SimpleSegmentVisitor());\n  }\n\n  function parseJbig2Chunks(chunks) {\n    var visitor = new SimpleSegmentVisitor();\n    for (var i = 0, ii = chunks.length; i < ii; i++) {\n      var chunk = chunks[i];\n      var segments = readSegments({}, chunk.data, chunk.start, chunk.end);\n      processSegments(segments, visitor);\n    }\n    return visitor.buffer;\n  }\n\n  function SimpleSegmentVisitor() {}\n\n  SimpleSegmentVisitor.prototype = {\n    onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) {\n      this.currentPageInfo = info;\n      var rowSize = (info.width + 7) >> 3;\n      var buffer = new Uint8Array(rowSize * info.height);\n      // The contents of ArrayBuffers are initialized to 0.\n      // Fill the buffer with 0xFF only if info.defaultPixelValue is set\n      if (info.defaultPixelValue) {\n        for (var i = 0, ii = buffer.length; i < ii; i++) {\n          buffer[i] = 0xFF;\n        }\n      }\n      this.buffer = buffer;\n    },\n    drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) {\n      var pageInfo = this.currentPageInfo;\n      var width = regionInfo.width, height = regionInfo.height;\n      var rowSize = (pageInfo.width + 7) >> 3;\n      var combinationOperator = pageInfo.combinationOperatorOverride ?\n        regionInfo.combinationOperator : pageInfo.combinationOperator;\n      var buffer = this.buffer;\n      var mask0 =  128 >> (regionInfo.x & 7);\n      var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3);\n      var i, j, mask, offset;\n      switch (combinationOperator) {\n        case 0: // OR\n          for (i = 0; i < height; i++) {\n            mask = mask0;\n            offset = offset0;\n            for (j = 0; j < width; j++) {\n              if (bitmap[i][j]) {\n                buffer[offset] |= mask;\n              }\n              mask >>= 1;\n              if (!mask) {\n                mask = 128;\n                offset++;\n              }\n            }\n            offset0 += rowSize;\n          }\n        break;\n        case 2: // XOR\n          for (i = 0; i < height; i++) {\n            mask = mask0;\n            offset = offset0;\n            for (j = 0; j < width; j++) {\n              if (bitmap[i][j]) {\n                buffer[offset] ^= mask;\n              }\n              mask >>= 1;\n              if (!mask) {\n                mask = 128;\n                offset++;\n              }\n            }\n            offset0 += rowSize;\n          }\n          break;\n        default:\n          error('JBIG2 error: operator ' + combinationOperator +\n                ' is not supported');\n      }\n    },\n    onImmediateGenericRegion:\n      function SimpleSegmentVisitor_onImmediateGenericRegion(region, data,\n                                                             start, end) {\n      var regionInfo = region.info;\n      var decodingContext = new DecodingContext(data, start, end);\n      var bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height,\n                                region.template, region.prediction, null,\n                                region.at, decodingContext);\n      this.drawBitmap(regionInfo, bitmap);\n    },\n    onImmediateLosslessGenericRegion:\n      function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() {\n      this.onImmediateGenericRegion.apply(this, arguments);\n    },\n    onSymbolDictionary:\n      function SimpleSegmentVisitor_onSymbolDictionary(dictionary,\n                                                       currentSegment,\n                                                       referredSegments,\n                                                       data, start, end) {\n      var huffmanTables;\n      if (dictionary.huffman) {\n        error('JBIG2 error: huffman is not supported');\n      }\n\n      // Combines exported symbols from all referred segments\n      var symbols = this.symbols;\n      if (!symbols) {\n        this.symbols = symbols = {};\n      }\n\n      var inputSymbols = [];\n      for (var i = 0, ii = referredSegments.length; i < ii; i++) {\n        inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]);\n      }\n\n      var decodingContext = new DecodingContext(data, start, end);\n      symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman,\n        dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols,\n        dictionary.numberOfExportedSymbols, huffmanTables,\n        dictionary.template, dictionary.at,\n        dictionary.refinementTemplate, dictionary.refinementAt,\n        decodingContext);\n    },\n    onImmediateTextRegion:\n      function SimpleSegmentVisitor_onImmediateTextRegion(region,\n                                                          referredSegments,\n                                                          data, start, end) {\n      var regionInfo = region.info;\n      var huffmanTables;\n\n      // Combines exported symbols from all referred segments\n      var symbols = this.symbols;\n      var inputSymbols = [];\n      for (var i = 0, ii = referredSegments.length; i < ii; i++) {\n        inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]);\n      }\n      var symbolCodeLength = log2(inputSymbols.length);\n\n      var decodingContext = new DecodingContext(data, start, end);\n      var bitmap = decodeTextRegion(region.huffman, region.refinement,\n        regionInfo.width, regionInfo.height, region.defaultPixelValue,\n        region.numberOfSymbolInstances, region.stripSize, inputSymbols,\n        symbolCodeLength, region.transposed, region.dsOffset,\n        region.referenceCorner, region.combinationOperator, huffmanTables,\n        region.refinementTemplate, region.refinementAt, decodingContext);\n      this.drawBitmap(regionInfo, bitmap);\n    },\n    onImmediateLosslessTextRegion:\n      function SimpleSegmentVisitor_onImmediateLosslessTextRegion() {\n      this.onImmediateTextRegion.apply(this, arguments);\n    }\n  };\n\n  function Jbig2Image() {}\n\n  Jbig2Image.prototype = {\n    parseChunks: function Jbig2Image_parseChunks(chunks) {\n      return parseJbig2Chunks(chunks);\n    }\n  };\n\n  return Jbig2Image;\n})();\n\n\nvar bidi = PDFJS.bidi = (function bidiClosure() {\n  // Character types for symbols from 0000 to 00FF.\n  var baseTypes = [\n    'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS',\n    'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',\n    'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON',\n    'ON', 'ON', 'ON', 'ON', 'ON', 'CS', 'ON', 'CS', 'ON', 'EN', 'EN', 'EN',\n    'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'ON', 'ON', 'ON', 'ON', 'ON',\n    'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON',\n    'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n    'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN',\n    'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',\n    'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',\n    'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON',\n    'ON', 'ON', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON',\n    'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n    'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n    'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'\n  ];\n\n  // Character types for symbols from 0600 to 06FF\n  var arabicTypes = [\n    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n    'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL',\n    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n    'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',\n    'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL',\n    'AL', 'AL', 'AL', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN',\n    'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL',\n    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n    'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',\n    'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'ON', 'NSM',\n    'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL'\n  ];\n\n  function isOdd(i) {\n    return (i & 1) !== 0;\n  }\n\n  function isEven(i) {\n    return (i & 1) === 0;\n  }\n\n  function findUnequal(arr, start, value) {\n    for (var j = start, jj = arr.length; j < jj; ++j) {\n      if (arr[j] !== value) {\n        return j;\n      }\n    }\n    return j;\n  }\n\n  function setValues(arr, start, end, value) {\n    for (var j = start; j < end; ++j) {\n      arr[j] = value;\n    }\n  }\n\n  function reverseValues(arr, start, end) {\n    for (var i = start, j = end - 1; i < j; ++i, --j) {\n      var temp = arr[i];\n      arr[i] = arr[j];\n      arr[j] = temp;\n    }\n  }\n\n  function createBidiText(str, isLTR, vertical) {\n    return {\n      str: str,\n      dir: (vertical ? 'ttb' : (isLTR ? 'ltr' : 'rtl'))\n    };\n  }\n\n  // These are used in bidi(), which is called frequently. We re-use them on\n  // each call to avoid unnecessary allocations.\n  var chars = [];\n  var types = [];\n\n  function bidi(str, startLevel, vertical) {\n    var isLTR = true;\n    var strLength = str.length;\n    if (strLength === 0 || vertical) {\n      return createBidiText(str, isLTR, vertical);\n    }\n\n    // Get types and fill arrays\n    chars.length = strLength;\n    types.length = strLength;\n    var numBidi = 0;\n\n    var i, ii;\n    for (i = 0; i < strLength; ++i) {\n      chars[i] = str.charAt(i);\n\n      var charCode = str.charCodeAt(i);\n      var charType = 'L';\n      if (charCode <= 0x00ff) {\n        charType = baseTypes[charCode];\n      } else if (0x0590 <= charCode && charCode <= 0x05f4) {\n        charType = 'R';\n      } else if (0x0600 <= charCode && charCode <= 0x06ff) {\n        charType = arabicTypes[charCode & 0xff];\n      } else if (0x0700 <= charCode && charCode <= 0x08AC) {\n        charType = 'AL';\n      }\n      if (charType === 'R' || charType === 'AL' || charType === 'AN') {\n        numBidi++;\n      }\n      types[i] = charType;\n    }\n\n    // Detect the bidi method\n    // - If there are no rtl characters then no bidi needed\n    // - If less than 30% chars are rtl then string is primarily ltr\n    // - If more than 30% chars are rtl then string is primarily rtl\n    if (numBidi === 0) {\n      isLTR = true;\n      return createBidiText(str, isLTR);\n    }\n\n    if (startLevel === -1) {\n      if ((strLength / numBidi) < 0.3) {\n        isLTR = true;\n        startLevel = 0;\n      } else {\n        isLTR = false;\n        startLevel = 1;\n      }\n    }\n\n    var levels = [];\n    for (i = 0; i < strLength; ++i) {\n      levels[i] = startLevel;\n    }\n\n    /*\n     X1-X10: skip most of this, since we are NOT doing the embeddings.\n     */\n    var e = (isOdd(startLevel) ? 'R' : 'L');\n    var sor = e;\n    var eor = sor;\n\n    /*\n     W1. Examine each non-spacing mark (NSM) in the level run, and change the\n     type of the NSM to the type of the previous character. If the NSM is at the\n     start of the level run, it will get the type of sor.\n     */\n    var lastType = sor;\n    for (i = 0; i < strLength; ++i) {\n      if (types[i] === 'NSM') {\n        types[i] = lastType;\n      } else {\n        lastType = types[i];\n      }\n    }\n\n    /*\n     W2. Search backwards from each instance of a European number until the\n     first strong type (R, L, AL, or sor) is found.  If an AL is found, change\n     the type of the European number to Arabic number.\n     */\n    lastType = sor;\n    var t;\n    for (i = 0; i < strLength; ++i) {\n      t = types[i];\n      if (t === 'EN') {\n        types[i] = (lastType === 'AL') ? 'AN' : 'EN';\n      } else if (t === 'R' || t === 'L' || t === 'AL') {\n        lastType = t;\n      }\n    }\n\n    /*\n     W3. Change all ALs to R.\n     */\n    for (i = 0; i < strLength; ++i) {\n      t = types[i];\n      if (t === 'AL') {\n        types[i] = 'R';\n      }\n    }\n\n    /*\n     W4. A single European separator between two European numbers changes to a\n     European number. A single common separator between two numbers of the same\n     type changes to that type:\n     */\n    for (i = 1; i < strLength - 1; ++i) {\n      if (types[i] === 'ES' && types[i - 1] === 'EN' && types[i + 1] === 'EN') {\n        types[i] = 'EN';\n      }\n      if (types[i] === 'CS' &&\n          (types[i - 1] === 'EN' || types[i - 1] === 'AN') &&\n          types[i + 1] === types[i - 1]) {\n        types[i] = types[i - 1];\n      }\n    }\n\n    /*\n     W5. A sequence of European terminators adjacent to European numbers changes\n     to all European numbers:\n     */\n    for (i = 0; i < strLength; ++i) {\n      if (types[i] === 'EN') {\n        // do before\n        var j;\n        for (j = i - 1; j >= 0; --j) {\n          if (types[j] !== 'ET') {\n            break;\n          }\n          types[j] = 'EN';\n        }\n        // do after\n        for (j = i + 1; j < strLength; --j) {\n          if (types[j] !== 'ET') {\n            break;\n          }\n          types[j] = 'EN';\n        }\n      }\n    }\n\n    /*\n     W6. Otherwise, separators and terminators change to Other Neutral:\n     */\n    for (i = 0; i < strLength; ++i) {\n      t = types[i];\n      if (t === 'WS' || t === 'ES' || t === 'ET' || t === 'CS') {\n        types[i] = 'ON';\n      }\n    }\n\n    /*\n     W7. Search backwards from each instance of a European number until the\n     first strong type (R, L, or sor) is found. If an L is found,  then change\n     the type of the European number to L.\n     */\n    lastType = sor;\n    for (i = 0; i < strLength; ++i) {\n      t = types[i];\n      if (t === 'EN') {\n        types[i] = ((lastType === 'L') ? 'L' : 'EN');\n      } else if (t === 'R' || t === 'L') {\n        lastType = t;\n      }\n    }\n\n    /*\n     N1. A sequence of neutrals takes the direction of the surrounding strong\n     text if the text on both sides has the same direction. European and Arabic\n     numbers are treated as though they were R. Start-of-level-run (sor) and\n     end-of-level-run (eor) are used at level run boundaries.\n     */\n    for (i = 0; i < strLength; ++i) {\n      if (types[i] === 'ON') {\n        var end = findUnequal(types, i + 1, 'ON');\n        var before = sor;\n        if (i > 0) {\n          before = types[i - 1];\n        }\n\n        var after = eor;\n        if (end + 1 < strLength) {\n          after = types[end + 1];\n        }\n        if (before !== 'L') {\n          before = 'R';\n        }\n        if (after !== 'L') {\n          after = 'R';\n        }\n        if (before === after) {\n          setValues(types, i, end, before);\n        }\n        i = end - 1; // reset to end (-1 so next iteration is ok)\n      }\n    }\n\n    /*\n     N2. Any remaining neutrals take the embedding direction.\n     */\n    for (i = 0; i < strLength; ++i) {\n      if (types[i] === 'ON') {\n        types[i] = e;\n      }\n    }\n\n    /*\n     I1. For all characters with an even (left-to-right) embedding direction,\n     those of type R go up one level and those of type AN or EN go up two\n     levels.\n     I2. For all characters with an odd (right-to-left) embedding direction,\n     those of type L, EN or AN go up one level.\n     */\n    for (i = 0; i < strLength; ++i) {\n      t = types[i];\n      if (isEven(levels[i])) {\n        if (t === 'R') {\n          levels[i] += 1;\n        } else if (t === 'AN' || t === 'EN') {\n          levels[i] += 2;\n        }\n      } else { // isOdd\n        if (t === 'L' || t === 'AN' || t === 'EN') {\n          levels[i] += 1;\n        }\n      }\n    }\n\n    /*\n     L1. On each line, reset the embedding level of the following characters to\n     the paragraph embedding level:\n\n     segment separators,\n     paragraph separators,\n     any sequence of whitespace characters preceding a segment separator or\n     paragraph separator, and any sequence of white space characters at the end\n     of the line.\n     */\n\n    // don't bother as text is only single line\n\n    /*\n     L2. From the highest level found in the text to the lowest odd level on\n     each line, reverse any contiguous sequence of characters that are at that\n     level or higher.\n     */\n\n    // find highest level & lowest odd level\n    var highestLevel = -1;\n    var lowestOddLevel = 99;\n    var level;\n    for (i = 0, ii = levels.length; i < ii; ++i) {\n      level = levels[i];\n      if (highestLevel < level) {\n        highestLevel = level;\n      }\n      if (lowestOddLevel > level && isOdd(level)) {\n        lowestOddLevel = level;\n      }\n    }\n\n    // now reverse between those limits\n    for (level = highestLevel; level >= lowestOddLevel; --level) {\n      // find segments to reverse\n      var start = -1;\n      for (i = 0, ii = levels.length; i < ii; ++i) {\n        if (levels[i] < level) {\n          if (start >= 0) {\n            reverseValues(chars, start, i);\n            start = -1;\n          }\n        } else if (start < 0) {\n          start = i;\n        }\n      }\n      if (start >= 0) {\n        reverseValues(chars, start, levels.length);\n      }\n    }\n\n    /*\n     L3. Combining marks applied to a right-to-left base character will at this\n     point precede their base character. If the rendering engine expects them to\n     follow the base characters in the final display process, then the ordering\n     of the marks and the base character must be reversed.\n     */\n\n    // don't bother for now\n\n    /*\n     L4. A character that possesses the mirrored property as specified by\n     Section 4.7, Mirrored, must be depicted by a mirrored glyph if the resolved\n     directionality of that character is R.\n     */\n\n    // don't mirror as characters are already mirrored in the pdf\n\n    // Finally, return string\n    var result = '';\n    for (i = 0, ii = chars.length; i < ii; ++i) {\n      var ch = chars[i];\n      if (ch !== '<' && ch !== '>') {\n        result += ch;\n      }\n    }\n    return createBidiText(result, isLTR);\n  }\n\n  return bidi;\n})();\n\n/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */\n\n/* Copyright 2014 Opera Software ASA\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n *\n * Based on https://code.google.com/p/smhasher/wiki/MurmurHash3.\n * Hashes roughly 100 KB per millisecond on i7 3.4 GHz.\n */\n/* globals Uint32ArrayView */\n\n'use strict';\n\nvar MurmurHash3_64 = (function MurmurHash3_64Closure (seed) {\n  // Workaround for missing math precison in JS.\n  var MASK_HIGH = 0xffff0000;\n  var MASK_LOW = 0xffff;\n\n  function MurmurHash3_64 (seed) {\n    var SEED = 0xc3d2e1f0;\n    this.h1 = seed ? seed & 0xffffffff : SEED;\n    this.h2 = seed ? seed & 0xffffffff : SEED;\n  }\n\n  var alwaysUseUint32ArrayView = false;\n  // old webkits have issues with non-aligned arrays\n  try {\n    new Uint32Array(new Uint8Array(5).buffer, 0, 1);\n  } catch (e) {\n    alwaysUseUint32ArrayView = true;\n  }\n\n  MurmurHash3_64.prototype = {\n    update: function MurmurHash3_64_update(input) {\n      var useUint32ArrayView = alwaysUseUint32ArrayView;\n      var i;\n      if (typeof input === 'string') {\n        var data = new Uint8Array(input.length * 2);\n        var length = 0;\n        for (i = 0; i < input.length; i++) {\n          var code = input.charCodeAt(i);\n          if (code <= 0xff) {\n            data[length++] = code;\n          }\n          else {\n            data[length++] = code >>> 8;\n            data[length++] = code & 0xff;\n          }\n        }\n      } else if (input instanceof Uint8Array) {\n        data = input;\n        length = data.length;\n      } else if (typeof input === 'object' && ('length' in input)) {\n        // processing regular arrays as well, e.g. for IE9\n        data = input;\n        length = data.length;\n        useUint32ArrayView = true;\n      } else {\n        throw new Error('Wrong data format in MurmurHash3_64_update. ' +\n                        'Input must be a string or array.');\n      }\n\n      var blockCounts = length >> 2;\n      var tailLength = length - blockCounts * 4;\n      // we don't care about endianness here\n      var dataUint32 = useUint32ArrayView ?\n        new Uint32ArrayView(data, blockCounts) :\n        new Uint32Array(data.buffer, 0, blockCounts);\n      var k1 = 0;\n      var k2 = 0;\n      var h1 = this.h1;\n      var h2 = this.h2;\n      var C1 = 0xcc9e2d51;\n      var C2 = 0x1b873593;\n      var C1_LOW = C1 & MASK_LOW;\n      var C2_LOW = C2 & MASK_LOW;\n\n      for (i = 0; i < blockCounts; i++) {\n        if (i & 1) {\n          k1 = dataUint32[i];\n          k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW);\n          k1 = k1 << 15 | k1 >>> 17;\n          k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW);\n          h1 ^= k1;\n          h1 = h1 << 13 | h1 >>> 19;\n          h1 = h1 * 5 + 0xe6546b64;\n        } else {\n          k2 = dataUint32[i];\n          k2 = (k2 * C1 & MASK_HIGH) | (k2 * C1_LOW & MASK_LOW);\n          k2 = k2 << 15 | k2 >>> 17;\n          k2 = (k2 * C2 & MASK_HIGH) | (k2 * C2_LOW & MASK_LOW);\n          h2 ^= k2;\n          h2 = h2 << 13 | h2 >>> 19;\n          h2 = h2 * 5 + 0xe6546b64;\n        }\n      }\n\n      k1 = 0;\n\n      switch (tailLength) {\n        case 3:\n          k1 ^= data[blockCounts * 4 + 2] << 16;\n          /* falls through */\n        case 2:\n          k1 ^= data[blockCounts * 4 + 1] << 8;\n          /* falls through */\n        case 1:\n          k1 ^= data[blockCounts * 4];\n          /* falls through */\n        k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW);\n        k1 = k1 << 15 | k1 >>> 17;\n        k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW);\n        if (blockCounts & 1) {\n          h1 ^= k1;\n        } else {\n          h2 ^= k1;\n        }\n      }\n\n      this.h1 = h1;\n      this.h2 = h2;\n      return this;\n    },\n\n    hexdigest: function MurmurHash3_64_hexdigest () {\n      var h1 = this.h1;\n      var h2 = this.h2;\n\n      h1 ^= h2 >>> 1;\n      h1 = (h1 * 0xed558ccd & MASK_HIGH) | (h1 * 0x8ccd & MASK_LOW);\n      h2 = (h2 * 0xff51afd7 & MASK_HIGH) |\n           (((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16);\n      h1 ^= h2 >>> 1;\n      h1 = (h1 * 0x1a85ec53 & MASK_HIGH) | (h1 * 0xec53 & MASK_LOW);\n      h2 = (h2 * 0xc4ceb9fe & MASK_HIGH) |\n           (((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16);\n      h1 ^= h2 >>> 1;\n\n      for (var i = 0, arr = [h1, h2], str = ''; i < arr.length; i++) {\n        var hex = (arr[i] >>> 0).toString(16);\n        while (hex.length < 8) {\n          hex = '0' + hex;\n        }\n        str += hex;\n      }\n\n      return str;\n    }\n  };\n\n  return MurmurHash3_64;\n})();\n\n\n}).call((typeof window === 'undefined') ? this : window);\n\nif (!PDFJS.workerSrc && typeof document !== 'undefined') {\n  // workerSrc is not set -- using last script url to define default location\n  PDFJS.workerSrc = (function () {\n    'use strict';\n    var scriptTagContainer = document.body ||\n                             document.getElementsByTagName('head')[0];\n    var pdfjsSrc = scriptTagContainer.lastChild.src;\n    return pdfjsSrc && pdfjsSrc.replace(/\\.js$/i, '.worker.js');\n  })();\n}\n\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/static/generic/web/cmaps/CNS2-V.bcmap",
    "content": "\u0003RCopyright 1990-2009 Adobe Systems Incorporated.\nAll rights reserved.\nSee ./LICENSE\u0006CNS2-H"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/static/generic/web/cmaps/ETenms-B5-H.bcmap",
    "content": "\u0002RCopyright 1990-2009 Adobe Systems Incorporated.\nAll rights reserved.\nSee ./LICENSE\tETen-B5-H`\u0001 ^\u0001"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/static/generic/web/cmaps/GB-H.bcmap",
    "content": "\u0002RCopyright 1990-2009 Adobe Systems Incorporated.\nAll rights reserved.\nSee ./LICENSE\u0001\u0001!!]aX!!]`21>\u0002\tp\u0002\u000bz$]\u0006\"Rd-U7*\u0017\r\b4%+ Z\u000f {/\u001f\u001c\u0004%<9Kb1].\"\u001f\f`],\"]\n\"]h\"]F\"]$\"]\u0002\"]`\"]>\"]\u001c\"]z\"]X\"]6\"]\u0014\"]r\"]P\"].\"]\f\"]j\"]H\"]&\"]\u0004\"]b\"]@\"]\u001e\"]|\"]Z\"]8\"]\u0016\"]t\"]R\"]0\"]\u000e\"]l\"]J\"](\"]\u0006\"]d\"]B\"] \"X~']W\"]5\"]\u0013\"]q\"]O\"]-\"]\u000b\"]i\"]G\"]%\"]\u0003\"]a\"]?\"]\u001d\"]{\"]Y\"]7\"]\u0015\"]s\"]Q\"]/\"]\r\"]k\"]I\"]'\"]\u0005\"]c\"]A\"]\u001f\"]}\"][\"]9"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/static/generic/web/cmaps/LICENSE",
    "content": "%%Copyright: -----------------------------------------------------------\n%%Copyright: Copyright 1990-2009 Adobe Systems Incorporated.\n%%Copyright: All rights reserved.\n%%Copyright:\n%%Copyright: Redistribution and use in source and binary forms, with or\n%%Copyright: without modification, are permitted provided that the\n%%Copyright: following conditions are met:\n%%Copyright:\n%%Copyright: Redistributions of source code must retain the above\n%%Copyright: copyright notice, this list of conditions and the following\n%%Copyright: disclaimer.\n%%Copyright:\n%%Copyright: Redistributions in binary form must reproduce the above\n%%Copyright: copyright notice, this list of conditions and the following\n%%Copyright: disclaimer in the documentation and/or other materials\n%%Copyright: provided with the distribution. \n%%Copyright:\n%%Copyright: Neither the name of Adobe Systems Incorporated nor the names\n%%Copyright: of its contributors may be used to endorse or promote\n%%Copyright: products derived from this software without specific prior\n%%Copyright: written permission. \n%%Copyright:\n%%Copyright: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n%%Copyright: CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n%%Copyright: INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n%%Copyright: MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n%%Copyright: DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n%%Copyright: CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n%%Copyright: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n%%Copyright: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n%%Copyright: LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n%%Copyright: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n%%Copyright: CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n%%Copyright: OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n%%Copyright: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n%%Copyright: -----------------------------------------------------------\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/static/generic/web/compatibility.js",
    "content": "/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */\n/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals VBArray, PDFJS */\n\n'use strict';\n\n// Initializing PDFJS global object here, it case if we need to change/disable\n// some PDF.js features, e.g. range requests\nif (typeof PDFJS === 'undefined') {\n  (typeof window !== 'undefined' ? window : this).PDFJS = {};\n}\n\n// Checking if the typed arrays are supported\n// Support: iOS<6.0 (subarray), IE<10, Android<4.0\n(function checkTypedArrayCompatibility() {\n  if (typeof Uint8Array !== 'undefined') {\n    // Support: iOS<6.0\n    if (typeof Uint8Array.prototype.subarray === 'undefined') {\n        Uint8Array.prototype.subarray = function subarray(start, end) {\n          return new Uint8Array(this.slice(start, end));\n        };\n        Float32Array.prototype.subarray = function subarray(start, end) {\n          return new Float32Array(this.slice(start, end));\n        };\n    }\n\n    // Support: Android<4.1\n    if (typeof Float64Array === 'undefined') {\n      window.Float64Array = Float32Array;\n    }\n    return;\n  }\n\n  function subarray(start, end) {\n    return new TypedArray(this.slice(start, end));\n  }\n\n  function setArrayOffset(array, offset) {\n    if (arguments.length < 2) {\n      offset = 0;\n    }\n    for (var i = 0, n = array.length; i < n; ++i, ++offset) {\n      this[offset] = array[i] & 0xFF;\n    }\n  }\n\n  function TypedArray(arg1) {\n    var result, i, n;\n    if (typeof arg1 === 'number') {\n      result = [];\n      for (i = 0; i < arg1; ++i) {\n        result[i] = 0;\n      }\n    } else if ('slice' in arg1) {\n      result = arg1.slice(0);\n    } else {\n      result = [];\n      for (i = 0, n = arg1.length; i < n; ++i) {\n        result[i] = arg1[i];\n      }\n    }\n\n    result.subarray = subarray;\n    result.buffer = result;\n    result.byteLength = result.length;\n    result.set = setArrayOffset;\n\n    if (typeof arg1 === 'object' && arg1.buffer) {\n      result.buffer = arg1.buffer;\n    }\n    return result;\n  }\n\n  window.Uint8Array = TypedArray;\n  window.Int8Array = TypedArray;\n\n  // we don't need support for set, byteLength for 32-bit array\n  // so we can use the TypedArray as well\n  window.Uint32Array = TypedArray;\n  window.Int32Array = TypedArray;\n  window.Uint16Array = TypedArray;\n  window.Float32Array = TypedArray;\n  window.Float64Array = TypedArray;\n})();\n\n// URL = URL || webkitURL\n// Support: Safari<7, Android 4.2+\n(function normalizeURLObject() {\n  if (!window.URL) {\n    window.URL = window.webkitURL;\n  }\n})();\n\n// Object.defineProperty()?\n// Support: Android<4.0, Safari<5.1\n(function checkObjectDefinePropertyCompatibility() {\n  if (typeof Object.defineProperty !== 'undefined') {\n    var definePropertyPossible = true;\n    try {\n      // some browsers (e.g. safari) cannot use defineProperty() on DOM objects\n      // and thus the native version is not sufficient\n      Object.defineProperty(new Image(), 'id', { value: 'test' });\n      // ... another test for android gb browser for non-DOM objects\n      var Test = function Test() {};\n      Test.prototype = { get id() { } };\n      Object.defineProperty(new Test(), 'id',\n        { value: '', configurable: true, enumerable: true, writable: false });\n    } catch (e) {\n      definePropertyPossible = false;\n    }\n    if (definePropertyPossible) {\n      return;\n    }\n  }\n\n  Object.defineProperty = function objectDefineProperty(obj, name, def) {\n    delete obj[name];\n    if ('get' in def) {\n      obj.__defineGetter__(name, def['get']);\n    }\n    if ('set' in def) {\n      obj.__defineSetter__(name, def['set']);\n    }\n    if ('value' in def) {\n      obj.__defineSetter__(name, function objectDefinePropertySetter(value) {\n        this.__defineGetter__(name, function objectDefinePropertyGetter() {\n          return value;\n        });\n        return value;\n      });\n      obj[name] = def.value;\n    }\n  };\n})();\n\n\n// No XMLHttpRequest#response?\n// Support: IE<11, Android <4.0\n(function checkXMLHttpRequestResponseCompatibility() {\n  var xhrPrototype = XMLHttpRequest.prototype;\n  var xhr = new XMLHttpRequest();\n  if (!('overrideMimeType' in xhr)) {\n    // IE10 might have response, but not overrideMimeType\n    // Support: IE10\n    Object.defineProperty(xhrPrototype, 'overrideMimeType', {\n      value: function xmlHttpRequestOverrideMimeType(mimeType) {}\n    });\n  }\n  if ('responseType' in xhr) {\n    return;\n  }\n\n  // The worker will be using XHR, so we can save time and disable worker.\n  PDFJS.disableWorker = true;\n\n  Object.defineProperty(xhrPrototype, 'responseType', {\n    get: function xmlHttpRequestGetResponseType() {\n      return this._responseType || 'text';\n    },\n    set: function xmlHttpRequestSetResponseType(value) {\n      if (value === 'text' || value === 'arraybuffer') {\n        this._responseType = value;\n        if (value === 'arraybuffer' &&\n            typeof this.overrideMimeType === 'function') {\n          this.overrideMimeType('text/plain; charset=x-user-defined');\n        }\n      }\n    }\n  });\n\n  // Support: IE9\n  if (typeof VBArray !== 'undefined') {\n    Object.defineProperty(xhrPrototype, 'response', {\n      get: function xmlHttpRequestResponseGet() {\n        if (this.responseType === 'arraybuffer') {\n          return new Uint8Array(new VBArray(this.responseBody).toArray());\n        } else {\n          return this.responseText;\n        }\n      }\n    });\n    return;\n  }\n\n  Object.defineProperty(xhrPrototype, 'response', {\n    get: function xmlHttpRequestResponseGet() {\n      if (this.responseType !== 'arraybuffer') {\n        return this.responseText;\n      }\n      var text = this.responseText;\n      var i, n = text.length;\n      var result = new Uint8Array(n);\n      for (i = 0; i < n; ++i) {\n        result[i] = text.charCodeAt(i) & 0xFF;\n      }\n      return result.buffer;\n    }\n  });\n})();\n\n// window.btoa (base64 encode function) ?\n// Support: IE<10\n(function checkWindowBtoaCompatibility() {\n  if ('btoa' in window) {\n    return;\n  }\n\n  var digits =\n    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\n  window.btoa = function windowBtoa(chars) {\n    var buffer = '';\n    var i, n;\n    for (i = 0, n = chars.length; i < n; i += 3) {\n      var b1 = chars.charCodeAt(i) & 0xFF;\n      var b2 = chars.charCodeAt(i + 1) & 0xFF;\n      var b3 = chars.charCodeAt(i + 2) & 0xFF;\n      var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);\n      var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;\n      var d4 = i + 2 < n ? (b3 & 0x3F) : 64;\n      buffer += (digits.charAt(d1) + digits.charAt(d2) +\n                 digits.charAt(d3) + digits.charAt(d4));\n    }\n    return buffer;\n  };\n})();\n\n// window.atob (base64 encode function)?\n// Support: IE<10\n(function checkWindowAtobCompatibility() {\n  if ('atob' in window) {\n    return;\n  }\n\n  // https://github.com/davidchambers/Base64.js\n  var digits =\n    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n  window.atob = function (input) {\n    input = input.replace(/=+$/, '');\n    if (input.length % 4 === 1) {\n      throw new Error('bad atob input');\n    }\n    for (\n      // initialize result and counters\n      var bc = 0, bs, buffer, idx = 0, output = '';\n      // get next character\n      buffer = input.charAt(idx++);\n      // character found in table?\n      // initialize bit storage and add its ascii value\n      ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,\n        // and if not first of each 4 characters,\n        // convert the first 8 bits to one ascii character\n        bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0\n    ) {\n      // try to find character in table (0-63, not found => -1)\n      buffer = digits.indexOf(buffer);\n    }\n    return output;\n  };\n})();\n\n// Function.prototype.bind?\n// Support: Android<4.0, iOS<6.0\n(function checkFunctionPrototypeBindCompatibility() {\n  if (typeof Function.prototype.bind !== 'undefined') {\n    return;\n  }\n\n  Function.prototype.bind = function functionPrototypeBind(obj) {\n    var fn = this, headArgs = Array.prototype.slice.call(arguments, 1);\n    var bound = function functionPrototypeBindBound() {\n      var args = headArgs.concat(Array.prototype.slice.call(arguments));\n      return fn.apply(obj, args);\n    };\n    return bound;\n  };\n})();\n\n// HTMLElement dataset property\n// Support: IE<11, Safari<5.1, Android<4.0\n(function checkDatasetProperty() {\n  var div = document.createElement('div');\n  if ('dataset' in div) {\n    return; // dataset property exists\n  }\n\n  Object.defineProperty(HTMLElement.prototype, 'dataset', {\n    get: function() {\n      if (this._dataset) {\n        return this._dataset;\n      }\n\n      var dataset = {};\n      for (var j = 0, jj = this.attributes.length; j < jj; j++) {\n        var attribute = this.attributes[j];\n        if (attribute.name.substring(0, 5) !== 'data-') {\n          continue;\n        }\n        var key = attribute.name.substring(5).replace(/\\-([a-z])/g,\n          function(all, ch) {\n            return ch.toUpperCase();\n          });\n        dataset[key] = attribute.value;\n      }\n\n      Object.defineProperty(this, '_dataset', {\n        value: dataset,\n        writable: false,\n        enumerable: false\n      });\n      return dataset;\n    },\n    enumerable: true\n  });\n})();\n\n// HTMLElement classList property\n// Support: IE<10, Android<4.0, iOS<5.0\n(function checkClassListProperty() {\n  var div = document.createElement('div');\n  if ('classList' in div) {\n    return; // classList property exists\n  }\n\n  function changeList(element, itemName, add, remove) {\n    var s = element.className || '';\n    var list = s.split(/\\s+/g);\n    if (list[0] === '') {\n      list.shift();\n    }\n    var index = list.indexOf(itemName);\n    if (index < 0 && add) {\n      list.push(itemName);\n    }\n    if (index >= 0 && remove) {\n      list.splice(index, 1);\n    }\n    element.className = list.join(' ');\n    return (index >= 0);\n  }\n\n  var classListPrototype = {\n    add: function(name) {\n      changeList(this.element, name, true, false);\n    },\n    contains: function(name) {\n      return changeList(this.element, name, false, false);\n    },\n    remove: function(name) {\n      changeList(this.element, name, false, true);\n    },\n    toggle: function(name) {\n      changeList(this.element, name, true, true);\n    }\n  };\n\n  Object.defineProperty(HTMLElement.prototype, 'classList', {\n    get: function() {\n      if (this._classList) {\n        return this._classList;\n      }\n\n      var classList = Object.create(classListPrototype, {\n        element: {\n          value: this,\n          writable: false,\n          enumerable: true\n        }\n      });\n      Object.defineProperty(this, '_classList', {\n        value: classList,\n        writable: false,\n        enumerable: false\n      });\n      return classList;\n    },\n    enumerable: true\n  });\n})();\n\n// Check console compatibility\n// In older IE versions the console object is not available\n// unless console is open.\n// Support: IE<10\n(function checkConsoleCompatibility() {\n  if (!('console' in window)) {\n    window.console = {\n      log: function() {},\n      error: function() {},\n      warn: function() {}\n    };\n  } else if (!('bind' in console.log)) {\n    // native functions in IE9 might not have bind\n    console.log = (function(fn) {\n      return function(msg) { return fn(msg); };\n    })(console.log);\n    console.error = (function(fn) {\n      return function(msg) { return fn(msg); };\n    })(console.error);\n    console.warn = (function(fn) {\n      return function(msg) { return fn(msg); };\n    })(console.warn);\n  }\n})();\n\n// Check onclick compatibility in Opera\n// Support: Opera<15\n(function checkOnClickCompatibility() {\n  // workaround for reported Opera bug DSK-354448:\n  // onclick fires on disabled buttons with opaque content\n  function ignoreIfTargetDisabled(event) {\n    if (isDisabled(event.target)) {\n      event.stopPropagation();\n    }\n  }\n  function isDisabled(node) {\n    return node.disabled || (node.parentNode && isDisabled(node.parentNode));\n  }\n  if (navigator.userAgent.indexOf('Opera') !== -1) {\n    // use browser detection since we cannot feature-check this bug\n    document.addEventListener('click', ignoreIfTargetDisabled, true);\n  }\n})();\n\n// Checks if possible to use URL.createObjectURL()\n// Support: IE\n(function checkOnBlobSupport() {\n  // sometimes IE loosing the data created with createObjectURL(), see #3977\n  if (navigator.userAgent.indexOf('Trident') >= 0) {\n    PDFJS.disableCreateObjectURL = true;\n  }\n})();\n\n// Checks if navigator.language is supported\n(function checkNavigatorLanguage() {\n  if ('language' in navigator) {\n    return;\n  }\n  PDFJS.locale = navigator.userLanguage || 'en-US';\n})();\n\n(function checkRangeRequests() {\n  // Safari has issues with cached range requests see:\n  // https://github.com/mozilla/pdf.js/issues/3260\n  // Last tested with version 6.0.4.\n  // Support: Safari 6.0+\n  var isSafari = Object.prototype.toString.call(\n                  window.HTMLElement).indexOf('Constructor') > 0;\n\n  // Older versions of Android (pre 3.0) has issues with range requests, see:\n  // https://github.com/mozilla/pdf.js/issues/3381.\n  // Make sure that we only match webkit-based Android browsers,\n  // since Firefox/Fennec works as expected.\n  // Support: Android<3.0\n  var regex = /Android\\s[0-2][^\\d]/;\n  var isOldAndroid = regex.test(navigator.userAgent);\n\n  // Range requests are broken in Chrome 39 and 40, https://crbug.com/442318\n  var isChromeWithRangeBug = /Chrome\\/(39|40)\\./.test(navigator.userAgent);\n\n  if (isSafari || isOldAndroid || isChromeWithRangeBug) {\n    PDFJS.disableRange = true;\n    PDFJS.disableStream = true;\n  }\n})();\n\n// Check if the browser supports manipulation of the history.\n// Support: IE<10, Android<4.2\n(function checkHistoryManipulation() {\n  // Android 2.x has so buggy pushState support that it was removed in\n  // Android 3.0 and restored as late as in Android 4.2.\n  // Support: Android 2.x\n  if (!history.pushState || navigator.userAgent.indexOf('Android 2.') >= 0) {\n    PDFJS.disableHistory = true;\n  }\n})();\n\n// Support: IE<11, Chrome<21, Android<4.4, Safari<6\n(function checkSetPresenceInImageData() {\n  // IE < 11 will use window.CanvasPixelArray which lacks set function.\n  if (window.CanvasPixelArray) {\n    if (typeof window.CanvasPixelArray.prototype.set !== 'function') {\n      window.CanvasPixelArray.prototype.set = function(arr) {\n        for (var i = 0, ii = this.length; i < ii; i++) {\n          this[i] = arr[i];\n        }\n      };\n    }\n  } else {\n    // Old Chrome and Android use an inaccessible CanvasPixelArray prototype.\n    // Because we cannot feature detect it, we rely on user agent parsing.\n    var polyfill = false, versionMatch;\n    if (navigator.userAgent.indexOf('Chrom') >= 0) {\n      versionMatch = navigator.userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\n      // Chrome < 21 lacks the set function.\n      polyfill = versionMatch && parseInt(versionMatch[2]) < 21;\n    } else if (navigator.userAgent.indexOf('Android') >= 0) {\n      // Android < 4.4 lacks the set function.\n      // Android >= 4.4 will contain Chrome in the user agent,\n      // thus pass the Chrome check above and not reach this block.\n      polyfill = /Android\\s[0-4][^\\d]/g.test(navigator.userAgent);\n    } else if (navigator.userAgent.indexOf('Safari') >= 0) {\n      versionMatch = navigator.userAgent.\n        match(/Version\\/([0-9]+)\\.([0-9]+)\\.([0-9]+) Safari\\//);\n      // Safari < 6 lacks the set function.\n      polyfill = versionMatch && parseInt(versionMatch[1]) < 6;\n    }\n\n    if (polyfill) {\n      var contextPrototype = window.CanvasRenderingContext2D.prototype;\n      contextPrototype._createImageData = contextPrototype.createImageData;\n      contextPrototype.createImageData = function(w, h) {\n        var imageData = this._createImageData(w, h);\n        imageData.data.set = function(arr) {\n          for (var i = 0, ii = this.length; i < ii; i++) {\n            this[i] = arr[i];\n          }\n        };\n        return imageData;\n      };\n    }\n  }\n})();\n\n// Support: IE<10, Android<4.0, iOS\n(function checkRequestAnimationFrame() {\n  function fakeRequestAnimationFrame(callback) {\n    window.setTimeout(callback, 20);\n  }\n\n  var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);\n  if (isIOS) {\n    // requestAnimationFrame on iOS is broken, replacing with fake one.\n    window.requestAnimationFrame = fakeRequestAnimationFrame;\n    return;\n  }\n  if ('requestAnimationFrame' in window) {\n    return;\n  }\n  window.requestAnimationFrame =\n    window.mozRequestAnimationFrame ||\n    window.webkitRequestAnimationFrame ||\n    fakeRequestAnimationFrame;\n})();\n\n(function checkCanvasSizeLimitation() {\n  var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);\n  var isAndroid = /Android/g.test(navigator.userAgent);\n  if (isIOS || isAndroid) {\n    // 5MP\n    PDFJS.maxCanvasPixels = 5242880;\n  }\n})();\n\n// Disable fullscreen support for certain problematic configurations.\n// Support: IE11+ (when embedded).\n(function checkFullscreenSupport() {\n  var isEmbeddedIE = (navigator.userAgent.indexOf('Trident') >= 0 &&\n                      window.parent !== window);\n  if (isEmbeddedIE) {\n    PDFJS.disableFullscreen = true;\n  }\n})();\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/static/generic/web/debugger.js",
    "content": "/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */\n/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals PDFJS */\n\n'use strict';\n\nvar FontInspector = (function FontInspectorClosure() {\n  var fonts;\n  var active = false;\n  var fontAttribute = 'data-font-name';\n  function removeSelection() {\n    var divs = document.querySelectorAll('div[' + fontAttribute + ']');\n    for (var i = 0, ii = divs.length; i < ii; ++i) {\n      var div = divs[i];\n      div.className = '';\n    }\n  }\n  function resetSelection() {\n    var divs = document.querySelectorAll('div[' + fontAttribute + ']');\n    for (var i = 0, ii = divs.length; i < ii; ++i) {\n      var div = divs[i];\n      div.className = 'debuggerHideText';\n    }\n  }\n  function selectFont(fontName, show) {\n    var divs = document.querySelectorAll('div[' + fontAttribute + '=' +\n                                         fontName + ']');\n    for (var i = 0, ii = divs.length; i < ii; ++i) {\n      var div = divs[i];\n      div.className = show ? 'debuggerShowText' : 'debuggerHideText';\n    }\n  }\n  function textLayerClick(e) {\n    if (!e.target.dataset.fontName ||\n        e.target.tagName.toUpperCase() !== 'DIV') {\n      return;\n    }\n    var fontName = e.target.dataset.fontName;\n    var selects = document.getElementsByTagName('input');\n    for (var i = 0; i < selects.length; ++i) {\n      var select = selects[i];\n      if (select.dataset.fontName !== fontName) {\n        continue;\n      }\n      select.checked = !select.checked;\n      selectFont(fontName, select.checked);\n      select.scrollIntoView();\n    }\n  }\n  return {\n    // Properties/functions needed by PDFBug.\n    id: 'FontInspector',\n    name: 'Font Inspector',\n    panel: null,\n    manager: null,\n    init: function init() {\n      var panel = this.panel;\n      panel.setAttribute('style', 'padding: 5px;');\n      var tmp = document.createElement('button');\n      tmp.addEventListener('click', resetSelection);\n      tmp.textContent = 'Refresh';\n      panel.appendChild(tmp);\n\n      fonts = document.createElement('div');\n      panel.appendChild(fonts);\n    },\n    cleanup: function cleanup() {\n      fonts.textContent = '';\n    },\n    enabled: false,\n    get active() {\n      return active;\n    },\n    set active(value) {\n      active = value;\n      if (active) {\n        document.body.addEventListener('click', textLayerClick, true);\n        resetSelection();\n      } else {\n        document.body.removeEventListener('click', textLayerClick, true);\n        removeSelection();\n      }\n    },\n    // FontInspector specific functions.\n    fontAdded: function fontAdded(fontObj, url) {\n      function properties(obj, list) {\n        var moreInfo = document.createElement('table');\n        for (var i = 0; i < list.length; i++) {\n          var tr = document.createElement('tr');\n          var td1 = document.createElement('td');\n          td1.textContent = list[i];\n          tr.appendChild(td1);\n          var td2 = document.createElement('td');\n          td2.textContent = obj[list[i]].toString();\n          tr.appendChild(td2);\n          moreInfo.appendChild(tr);\n        }\n        return moreInfo;\n      }\n      var moreInfo = properties(fontObj, ['name', 'type']);\n      var fontName = fontObj.loadedName;\n      var font = document.createElement('div');\n      var name = document.createElement('span');\n      name.textContent = fontName;\n      var download = document.createElement('a');\n      if (url) {\n        url = /url\\(['\"]?([^\\)\"']+)/.exec(url);\n        download.href = url[1];\n      } else if (fontObj.data) {\n        url = URL.createObjectURL(new Blob([fontObj.data], {\n          type: fontObj.mimeType\n        }));\n        download.href = url;\n      }\n      download.textContent = 'Download';\n      var logIt = document.createElement('a');\n      logIt.href = '';\n      logIt.textContent = 'Log';\n      logIt.addEventListener('click', function(event) {\n        event.preventDefault();\n        console.log(fontObj);\n      });\n      var select = document.createElement('input');\n      select.setAttribute('type', 'checkbox');\n      select.dataset.fontName = fontName;\n      select.addEventListener('click', (function(select, fontName) {\n        return (function() {\n           selectFont(fontName, select.checked);\n        });\n      })(select, fontName));\n      font.appendChild(select);\n      font.appendChild(name);\n      font.appendChild(document.createTextNode(' '));\n      font.appendChild(download);\n      font.appendChild(document.createTextNode(' '));\n      font.appendChild(logIt);\n      font.appendChild(moreInfo);\n      fonts.appendChild(font);\n      // Somewhat of a hack, should probably add a hook for when the text layer\n      // is done rendering.\n      setTimeout(function() {\n        if (this.active) {\n          resetSelection();\n        }\n      }.bind(this), 2000);\n    }\n  };\n})();\n\n// Manages all the page steppers.\nvar StepperManager = (function StepperManagerClosure() {\n  var steppers = [];\n  var stepperDiv = null;\n  var stepperControls = null;\n  var stepperChooser = null;\n  var breakPoints = {};\n  return {\n    // Properties/functions needed by PDFBug.\n    id: 'Stepper',\n    name: 'Stepper',\n    panel: null,\n    manager: null,\n    init: function init() {\n      var self = this;\n      this.panel.setAttribute('style', 'padding: 5px;');\n      stepperControls = document.createElement('div');\n      stepperChooser = document.createElement('select');\n      stepperChooser.addEventListener('change', function(event) {\n        self.selectStepper(this.value);\n      });\n      stepperControls.appendChild(stepperChooser);\n      stepperDiv = document.createElement('div');\n      this.panel.appendChild(stepperControls);\n      this.panel.appendChild(stepperDiv);\n      if (sessionStorage.getItem('pdfjsBreakPoints')) {\n        breakPoints = JSON.parse(sessionStorage.getItem('pdfjsBreakPoints'));\n      }\n    },\n    cleanup: function cleanup() {\n      stepperChooser.textContent = '';\n      stepperDiv.textContent = '';\n      steppers = [];\n    },\n    enabled: false,\n    active: false,\n    // Stepper specific functions.\n    create: function create(pageIndex) {\n      var debug = document.createElement('div');\n      debug.id = 'stepper' + pageIndex;\n      debug.setAttribute('hidden', true);\n      debug.className = 'stepper';\n      stepperDiv.appendChild(debug);\n      var b = document.createElement('option');\n      b.textContent = 'Page ' + (pageIndex + 1);\n      b.value = pageIndex;\n      stepperChooser.appendChild(b);\n      var initBreakPoints = breakPoints[pageIndex] || [];\n      var stepper = new Stepper(debug, pageIndex, initBreakPoints);\n      steppers.push(stepper);\n      if (steppers.length === 1) {\n        this.selectStepper(pageIndex, false);\n      }\n      return stepper;\n    },\n    selectStepper: function selectStepper(pageIndex, selectPanel) {\n      var i;\n      pageIndex = pageIndex | 0;\n      if (selectPanel) {\n        this.manager.selectPanel(this);\n      }\n      for (i = 0; i < steppers.length; ++i) {\n        var stepper = steppers[i];\n        if (stepper.pageIndex === pageIndex) {\n          stepper.panel.removeAttribute('hidden');\n        } else {\n          stepper.panel.setAttribute('hidden', true);\n        }\n      }\n      var options = stepperChooser.options;\n      for (i = 0; i < options.length; ++i) {\n        var option = options[i];\n        option.selected = (option.value | 0) === pageIndex;\n      }\n    },\n    saveBreakPoints: function saveBreakPoints(pageIndex, bps) {\n      breakPoints[pageIndex] = bps;\n      sessionStorage.setItem('pdfjsBreakPoints', JSON.stringify(breakPoints));\n    }\n  };\n})();\n\n// The stepper for each page's IRQueue.\nvar Stepper = (function StepperClosure() {\n  // Shorter way to create element and optionally set textContent.\n  function c(tag, textContent) {\n    var d = document.createElement(tag);\n    if (textContent) {\n      d.textContent = textContent;\n    }\n    return d;\n  }\n\n  var opMap = null;\n\n  function simplifyArgs(args) {\n    if (typeof args === 'string') {\n      var MAX_STRING_LENGTH = 75;\n      return args.length <= MAX_STRING_LENGTH ? args :\n        args.substr(0, MAX_STRING_LENGTH) + '...';\n    }\n    if (typeof args !== 'object' || args === null) {\n      return args;\n    }\n    if ('length' in args) { // array\n      var simpleArgs = [], i, ii;\n      var MAX_ITEMS = 10;\n      for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) {\n        simpleArgs.push(simplifyArgs(args[i]));\n      }\n      if (i < args.length) {\n        simpleArgs.push('...');\n      }\n      return simpleArgs;\n    }\n    var simpleObj = {};\n    for (var key in args) {\n      simpleObj[key] = simplifyArgs(args[key]);\n    }\n    return simpleObj;\n  }\n\n  function Stepper(panel, pageIndex, initialBreakPoints) {\n    this.panel = panel;\n    this.breakPoint = 0;\n    this.nextBreakPoint = null;\n    this.pageIndex = pageIndex;\n    this.breakPoints = initialBreakPoints;\n    this.currentIdx = -1;\n    this.operatorListIdx = 0;\n  }\n  Stepper.prototype = {\n    init: function init() {\n      var panel = this.panel;\n      var content = c('div', 'c=continue, s=step');\n      var table = c('table');\n      content.appendChild(table);\n      table.cellSpacing = 0;\n      var headerRow = c('tr');\n      table.appendChild(headerRow);\n      headerRow.appendChild(c('th', 'Break'));\n      headerRow.appendChild(c('th', 'Idx'));\n      headerRow.appendChild(c('th', 'fn'));\n      headerRow.appendChild(c('th', 'args'));\n      panel.appendChild(content);\n      this.table = table;\n      if (!opMap) {\n        opMap = Object.create(null);\n        for (var key in PDFJS.OPS) {\n          opMap[PDFJS.OPS[key]] = key;\n        }\n      }\n    },\n    updateOperatorList: function updateOperatorList(operatorList) {\n      var self = this;\n\n      function cboxOnClick() {\n        var x = +this.dataset.idx;\n        if (this.checked) {\n          self.breakPoints.push(x);\n        } else {\n          self.breakPoints.splice(self.breakPoints.indexOf(x), 1);\n        }\n        StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints);\n      }\n\n      var MAX_OPERATORS_COUNT = 15000;\n      if (this.operatorListIdx > MAX_OPERATORS_COUNT) {\n        return;\n      }\n\n      var chunk = document.createDocumentFragment();\n      var operatorsToDisplay = Math.min(MAX_OPERATORS_COUNT,\n                                        operatorList.fnArray.length);\n      for (var i = this.operatorListIdx; i < operatorsToDisplay; i++) {\n        var line = c('tr');\n        line.className = 'line';\n        line.dataset.idx = i;\n        chunk.appendChild(line);\n        var checked = this.breakPoints.indexOf(i) !== -1;\n        var args = operatorList.argsArray[i] || [];\n\n        var breakCell = c('td');\n        var cbox = c('input');\n        cbox.type = 'checkbox';\n        cbox.className = 'points';\n        cbox.checked = checked;\n        cbox.dataset.idx = i;\n        cbox.onclick = cboxOnClick;\n\n        breakCell.appendChild(cbox);\n        line.appendChild(breakCell);\n        line.appendChild(c('td', i.toString()));\n        var fn = opMap[operatorList.fnArray[i]];\n        var decArgs = args;\n        if (fn === 'showText') {\n          var glyphs = args[0];\n          var newArgs = [];\n          var str = [];\n          for (var j = 0; j < glyphs.length; j++) {\n            var glyph = glyphs[j];\n            if (typeof glyph === 'object' && glyph !== null) {\n              str.push(glyph.fontChar);\n            } else {\n              if (str.length > 0) {\n                newArgs.push(str.join(''));\n                str = [];\n              }\n              newArgs.push(glyph); // null or number\n            }\n          }\n          if (str.length > 0) {\n            newArgs.push(str.join(''));\n          }\n          decArgs = [newArgs];\n        }\n        line.appendChild(c('td', fn));\n        line.appendChild(c('td', JSON.stringify(simplifyArgs(decArgs))));\n      }\n      if (operatorsToDisplay < operatorList.fnArray.length) {\n        line = c('tr');\n        var lastCell = c('td', '...');\n        lastCell.colspan = 4;\n        chunk.appendChild(lastCell);\n      }\n      this.operatorListIdx = operatorList.fnArray.length;\n      this.table.appendChild(chunk);\n    },\n    getNextBreakPoint: function getNextBreakPoint() {\n      this.breakPoints.sort(function(a, b) { return a - b; });\n      for (var i = 0; i < this.breakPoints.length; i++) {\n        if (this.breakPoints[i] > this.currentIdx) {\n          return this.breakPoints[i];\n        }\n      }\n      return null;\n    },\n    breakIt: function breakIt(idx, callback) {\n      StepperManager.selectStepper(this.pageIndex, true);\n      var self = this;\n      var dom = document;\n      self.currentIdx = idx;\n      var listener = function(e) {\n        switch (e.keyCode) {\n          case 83: // step\n            dom.removeEventListener('keydown', listener, false);\n            self.nextBreakPoint = self.currentIdx + 1;\n            self.goTo(-1);\n            callback();\n            break;\n          case 67: // continue\n            dom.removeEventListener('keydown', listener, false);\n            var breakPoint = self.getNextBreakPoint();\n            self.nextBreakPoint = breakPoint;\n            self.goTo(-1);\n            callback();\n            break;\n        }\n      };\n      dom.addEventListener('keydown', listener, false);\n      self.goTo(idx);\n    },\n    goTo: function goTo(idx) {\n      var allRows = this.panel.getElementsByClassName('line');\n      for (var x = 0, xx = allRows.length; x < xx; ++x) {\n        var row = allRows[x];\n        if ((row.dataset.idx | 0) === idx) {\n          row.style.backgroundColor = 'rgb(251,250,207)';\n          row.scrollIntoView();\n        } else {\n          row.style.backgroundColor = null;\n        }\n      }\n    }\n  };\n  return Stepper;\n})();\n\nvar Stats = (function Stats() {\n  var stats = [];\n  function clear(node) {\n    while (node.hasChildNodes()) {\n      node.removeChild(node.lastChild);\n    }\n  }\n  function getStatIndex(pageNumber) {\n    for (var i = 0, ii = stats.length; i < ii; ++i) {\n      if (stats[i].pageNumber === pageNumber) {\n        return i;\n      }\n    }\n    return false;\n  }\n  return {\n    // Properties/functions needed by PDFBug.\n    id: 'Stats',\n    name: 'Stats',\n    panel: null,\n    manager: null,\n    init: function init() {\n      this.panel.setAttribute('style', 'padding: 5px;');\n      PDFJS.enableStats = true;\n    },\n    enabled: false,\n    active: false,\n    // Stats specific functions.\n    add: function(pageNumber, stat) {\n      if (!stat) {\n        return;\n      }\n      var statsIndex = getStatIndex(pageNumber);\n      if (statsIndex !== false) {\n        var b = stats[statsIndex];\n        this.panel.removeChild(b.div);\n        stats.splice(statsIndex, 1);\n      }\n      var wrapper = document.createElement('div');\n      wrapper.className = 'stats';\n      var title = document.createElement('div');\n      title.className = 'title';\n      title.textContent = 'Page: ' + pageNumber;\n      var statsDiv = document.createElement('div');\n      statsDiv.textContent = stat.toString();\n      wrapper.appendChild(title);\n      wrapper.appendChild(statsDiv);\n      stats.push({ pageNumber: pageNumber, div: wrapper });\n      stats.sort(function(a, b) { return a.pageNumber - b.pageNumber; });\n      clear(this.panel);\n      for (var i = 0, ii = stats.length; i < ii; ++i) {\n        this.panel.appendChild(stats[i].div);\n      }\n    },\n    cleanup: function () {\n      stats = [];\n      clear(this.panel);\n    }\n  };\n})();\n\n// Manages all the debugging tools.\nvar PDFBug = (function PDFBugClosure() {\n  var panelWidth = 300;\n  var buttons = [];\n  var activePanel = null;\n\n  return {\n    tools: [\n      FontInspector,\n      StepperManager,\n      Stats\n    ],\n    enable: function(ids) {\n      var all = false, tools = this.tools;\n      if (ids.length === 1 && ids[0] === 'all') {\n        all = true;\n      }\n      for (var i = 0; i < tools.length; ++i) {\n        var tool = tools[i];\n        if (all || ids.indexOf(tool.id) !== -1) {\n          tool.enabled = true;\n        }\n      }\n      if (!all) {\n        // Sort the tools by the order they are enabled.\n        tools.sort(function(a, b) {\n          var indexA = ids.indexOf(a.id);\n          indexA = indexA < 0 ? tools.length : indexA;\n          var indexB = ids.indexOf(b.id);\n          indexB = indexB < 0 ? tools.length : indexB;\n          return indexA - indexB;\n        });\n      }\n    },\n    init: function init() {\n      /*\n       * Basic Layout:\n       * PDFBug\n       *  Controls\n       *  Panels\n       *    Panel\n       *    Panel\n       *    ...\n       */\n      var ui = document.createElement('div');\n      ui.id = 'PDFBug';\n\n      var controls = document.createElement('div');\n      controls.setAttribute('class', 'controls');\n      ui.appendChild(controls);\n\n      var panels = document.createElement('div');\n      panels.setAttribute('class', 'panels');\n      ui.appendChild(panels);\n\n      var container = document.getElementById('viewerContainer');\n      container.appendChild(ui);\n      container.style.right = panelWidth + 'px';\n\n      // Initialize all the debugging tools.\n      var tools = this.tools;\n      var self = this;\n      for (var i = 0; i < tools.length; ++i) {\n        var tool = tools[i];\n        var panel = document.createElement('div');\n        var panelButton = document.createElement('button');\n        panelButton.textContent = tool.name;\n        panelButton.addEventListener('click', (function(selected) {\n          return function(event) {\n            event.preventDefault();\n            self.selectPanel(selected);\n          };\n        })(i));\n        controls.appendChild(panelButton);\n        panels.appendChild(panel);\n        tool.panel = panel;\n        tool.manager = this;\n        if (tool.enabled) {\n          tool.init();\n        } else {\n          panel.textContent = tool.name + ' is disabled. To enable add ' +\n                              ' \"' + tool.id + '\" to the pdfBug parameter ' +\n                              'and refresh (seperate multiple by commas).';\n        }\n        buttons.push(panelButton);\n      }\n      this.selectPanel(0);\n    },\n    cleanup: function cleanup() {\n      for (var i = 0, ii = this.tools.length; i < ii; i++) {\n        if (this.tools[i].enabled) {\n          this.tools[i].cleanup();\n        }\n      }\n    },\n    selectPanel: function selectPanel(index) {\n      if (typeof index !== 'number') {\n        index = this.tools.indexOf(index);\n      }\n      if (index === activePanel) {\n        return;\n      }\n      activePanel = index;\n      var tools = this.tools;\n      for (var j = 0; j < tools.length; ++j) {\n        if (j === index) {\n          buttons[j].setAttribute('class', 'active');\n          tools[j].active = true;\n          tools[j].panel.removeAttribute('hidden');\n        } else {\n          buttons[j].setAttribute('class', '');\n          tools[j].active = false;\n          tools[j].panel.setAttribute('hidden', 'true');\n        }\n      }\n    }\n  };\n})();\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/static/generic/web/l10n.js",
    "content": "/**\n * Copyright (c) 2011-2013 Fabien Cazenave, Mozilla.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n/*\n  Additional modifications for PDF.js project:\n    - Disables language initialization on page loading;\n    - Removes consoleWarn and consoleLog and use console.log/warn directly.\n    - Removes window._ assignment.\n    - Remove compatibility code for OldIE.\n*/\n\n/*jshint browser: true, devel: true, es5: true, globalstrict: true */\n'use strict';\n\ndocument.webL10n = (function(window, document, undefined) {\n  var gL10nData = {};\n  var gTextData = '';\n  var gTextProp = 'textContent';\n  var gLanguage = '';\n  var gMacros = {};\n  var gReadyState = 'loading';\n\n\n  /**\n   * Synchronously loading l10n resources significantly minimizes flickering\n   * from displaying the app with non-localized strings and then updating the\n   * strings. Although this will block all script execution on this page, we\n   * expect that the l10n resources are available locally on flash-storage.\n   *\n   * As synchronous XHR is generally considered as a bad idea, we're still\n   * loading l10n resources asynchronously -- but we keep this in a setting,\n   * just in case... and applications using this library should hide their\n   * content until the `localized' event happens.\n   */\n\n  var gAsyncResourceLoading = true; // read-only\n\n\n  /**\n   * DOM helpers for the so-called \"HTML API\".\n   *\n   * These functions are written for modern browsers. For old versions of IE,\n   * they're overridden in the 'startup' section at the end of this file.\n   */\n\n  function getL10nResourceLinks() {\n    return document.querySelectorAll('link[type=\"application/l10n\"]');\n  }\n\n  function getL10nDictionary() {\n    var script = document.querySelector('script[type=\"application/l10n\"]');\n    // TODO: support multiple and external JSON dictionaries\n    return script ? JSON.parse(script.innerHTML) : null;\n  }\n\n  function getTranslatableChildren(element) {\n    return element ? element.querySelectorAll('*[data-l10n-id]') : [];\n  }\n\n  function getL10nAttributes(element) {\n    if (!element)\n      return {};\n\n    var l10nId = element.getAttribute('data-l10n-id');\n    var l10nArgs = element.getAttribute('data-l10n-args');\n    var args = {};\n    if (l10nArgs) {\n      try {\n        args = JSON.parse(l10nArgs);\n      } catch (e) {\n        console.warn('could not parse arguments for #' + l10nId);\n      }\n    }\n    return { id: l10nId, args: args };\n  }\n\n  function fireL10nReadyEvent(lang) {\n    var evtObject = document.createEvent('Event');\n    evtObject.initEvent('localized', true, false);\n    evtObject.language = lang;\n    document.dispatchEvent(evtObject);\n  }\n\n  function xhrLoadText(url, onSuccess, onFailure) {\n    onSuccess = onSuccess || function _onSuccess(data) {};\n    onFailure = onFailure || function _onFailure() {\n      console.warn(url + ' not found.');\n    };\n\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, gAsyncResourceLoading);\n    if (xhr.overrideMimeType) {\n      xhr.overrideMimeType('text/plain; charset=utf-8');\n    }\n    xhr.onreadystatechange = function() {\n      if (xhr.readyState == 4) {\n        if (xhr.status == 200 || xhr.status === 0) {\n          onSuccess(xhr.responseText);\n        } else {\n          onFailure();\n        }\n      }\n    };\n    xhr.onerror = onFailure;\n    xhr.ontimeout = onFailure;\n\n    // in Firefox OS with the app:// protocol, trying to XHR a non-existing\n    // URL will raise an exception here -- hence this ugly try...catch.\n    try {\n      xhr.send(null);\n    } catch (e) {\n      onFailure();\n    }\n  }\n\n\n  /**\n   * l10n resource parser:\n   *  - reads (async XHR) the l10n resource matching `lang';\n   *  - imports linked resources (synchronously) when specified;\n   *  - parses the text data (fills `gL10nData' and `gTextData');\n   *  - triggers success/failure callbacks when done.\n   *\n   * @param {string} href\n   *    URL of the l10n resource to parse.\n   *\n   * @param {string} lang\n   *    locale (language) to parse. Must be a lowercase string.\n   *\n   * @param {Function} successCallback\n   *    triggered when the l10n resource has been successully parsed.\n   *\n   * @param {Function} failureCallback\n   *    triggered when the an error has occured.\n   *\n   * @return {void}\n   *    uses the following global variables: gL10nData, gTextData, gTextProp.\n   */\n\n  function parseResource(href, lang, successCallback, failureCallback) {\n    var baseURL = href.replace(/[^\\/]*$/, '') || './';\n\n    // handle escaped characters (backslashes) in a string\n    function evalString(text) {\n      if (text.lastIndexOf('\\\\') < 0)\n        return text;\n      return text.replace(/\\\\\\\\/g, '\\\\')\n                 .replace(/\\\\n/g, '\\n')\n                 .replace(/\\\\r/g, '\\r')\n                 .replace(/\\\\t/g, '\\t')\n                 .replace(/\\\\b/g, '\\b')\n                 .replace(/\\\\f/g, '\\f')\n                 .replace(/\\\\{/g, '{')\n                 .replace(/\\\\}/g, '}')\n                 .replace(/\\\\\"/g, '\"')\n                 .replace(/\\\\'/g, \"'\");\n    }\n\n    // parse *.properties text data into an l10n dictionary\n    // If gAsyncResourceLoading is false, then the callback will be called\n    // synchronously. Otherwise it is called asynchronously.\n    function parseProperties(text, parsedPropertiesCallback) {\n      var dictionary = {};\n\n      // token expressions\n      var reBlank = /^\\s*|\\s*$/;\n      var reComment = /^\\s*#|^\\s*$/;\n      var reSection = /^\\s*\\[(.*)\\]\\s*$/;\n      var reImport = /^\\s*@import\\s+url\\((.*)\\)\\s*$/i;\n      var reSplit = /^([^=\\s]*)\\s*=\\s*(.+)$/; // TODO: escape EOLs with '\\'\n\n      // parse the *.properties file into an associative array\n      function parseRawLines(rawText, extendedSyntax, parsedRawLinesCallback) {\n        var entries = rawText.replace(reBlank, '').split(/[\\r\\n]+/);\n        var currentLang = '*';\n        var genericLang = lang.split('-', 1)[0];\n        var skipLang = false;\n        var match = '';\n\n        function nextEntry() {\n          // Use infinite loop instead of recursion to avoid reaching the\n          // maximum recursion limit for content with many lines.\n          while (true) {\n            if (!entries.length) {\n              parsedRawLinesCallback();\n              return;\n            }\n            var line = entries.shift();\n\n            // comment or blank line?\n            if (reComment.test(line))\n              continue;\n\n            // the extended syntax supports [lang] sections and @import rules\n            if (extendedSyntax) {\n              match = reSection.exec(line);\n              if (match) { // section start?\n                // RFC 4646, section 4.4, \"All comparisons MUST be performed\n                // in a case-insensitive manner.\"\n\n                currentLang = match[1].toLowerCase();\n                skipLang = (currentLang !== '*') &&\n                    (currentLang !== lang) && (currentLang !== genericLang);\n                continue;\n              } else if (skipLang) {\n                continue;\n              }\n              match = reImport.exec(line);\n              if (match) { // @import rule?\n                loadImport(baseURL + match[1], nextEntry);\n                return;\n              }\n            }\n\n            // key-value pair\n            var tmp = line.match(reSplit);\n            if (tmp && tmp.length == 3) {\n              dictionary[tmp[1]] = evalString(tmp[2]);\n            }\n          }\n        }\n        nextEntry();\n      }\n\n      // import another *.properties file\n      function loadImport(url, callback) {\n        xhrLoadText(url, function(content) {\n          parseRawLines(content, false, callback); // don't allow recursive imports\n        }, null);\n      }\n\n      // fill the dictionary\n      parseRawLines(text, true, function() {\n        parsedPropertiesCallback(dictionary);\n      });\n    }\n\n    // load and parse l10n data (warning: global variables are used here)\n    xhrLoadText(href, function(response) {\n      gTextData += response; // mostly for debug\n\n      // parse *.properties text data into an l10n dictionary\n      parseProperties(response, function(data) {\n\n        // find attribute descriptions, if any\n        for (var key in data) {\n          var id, prop, index = key.lastIndexOf('.');\n          if (index > 0) { // an attribute has been specified\n            id = key.substring(0, index);\n            prop = key.substr(index + 1);\n          } else { // no attribute: assuming text content by default\n            id = key;\n            prop = gTextProp;\n          }\n          if (!gL10nData[id]) {\n            gL10nData[id] = {};\n          }\n          gL10nData[id][prop] = data[key];\n        }\n\n        // trigger callback\n        if (successCallback) {\n          successCallback();\n        }\n      });\n    }, failureCallback);\n  }\n\n  // load and parse all resources for the specified locale\n  function loadLocale(lang, callback) {\n    // RFC 4646, section 2.1 states that language tags have to be treated as\n    // case-insensitive. Convert to lowercase for case-insensitive comparisons.\n    if (lang) {\n      lang = lang.toLowerCase();\n    }\n\n    callback = callback || function _callback() {};\n\n    clear();\n    gLanguage = lang;\n\n    // check all <link type=\"application/l10n\" href=\"...\" /> nodes\n    // and load the resource files\n    var langLinks = getL10nResourceLinks();\n    var langCount = langLinks.length;\n    if (langCount === 0) {\n      // we might have a pre-compiled dictionary instead\n      var dict = getL10nDictionary();\n      if (dict && dict.locales && dict.default_locale) {\n        console.log('using the embedded JSON directory, early way out');\n        gL10nData = dict.locales[lang];\n        if (!gL10nData) {\n          var defaultLocale = dict.default_locale.toLowerCase();\n          for (var anyCaseLang in dict.locales) {\n            anyCaseLang = anyCaseLang.toLowerCase();\n            if (anyCaseLang === lang) {\n              gL10nData = dict.locales[lang];\n              break;\n            } else if (anyCaseLang === defaultLocale) {\n              gL10nData = dict.locales[defaultLocale];\n            }\n          }\n        }\n        callback();\n      } else {\n        console.log('no resource to load, early way out');\n      }\n      // early way out\n      fireL10nReadyEvent(lang);\n      gReadyState = 'complete';\n      return;\n    }\n\n    // start the callback when all resources are loaded\n    var onResourceLoaded = null;\n    var gResourceCount = 0;\n    onResourceLoaded = function() {\n      gResourceCount++;\n      if (gResourceCount >= langCount) {\n        callback();\n        fireL10nReadyEvent(lang);\n        gReadyState = 'complete';\n      }\n    };\n\n    // load all resource files\n    function L10nResourceLink(link) {\n      var href = link.href;\n      // Note: If |gAsyncResourceLoading| is false, then the following callbacks\n      // are synchronously called.\n      this.load = function(lang, callback) {\n        parseResource(href, lang, callback, function() {\n          console.warn(href + ' not found.');\n          // lang not found, used default resource instead\n          console.warn('\"' + lang + '\" resource not found');\n          gLanguage = '';\n          // Resource not loaded, but we still need to call the callback.\n          callback();\n        });\n      };\n    }\n\n    for (var i = 0; i < langCount; i++) {\n      var resource = new L10nResourceLink(langLinks[i]);\n      resource.load(lang, onResourceLoaded);\n    }\n  }\n\n  // clear all l10n data\n  function clear() {\n    gL10nData = {};\n    gTextData = '';\n    gLanguage = '';\n    // TODO: clear all non predefined macros.\n    // There's no such macro /yet/ but we're planning to have some...\n  }\n\n\n  /**\n   * Get rules for plural forms (shared with JetPack), see:\n   * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html\n   * https://github.com/mozilla/addon-sdk/blob/master/python-lib/plural-rules-generator.p\n   *\n   * @param {string} lang\n   *    locale (language) used.\n   *\n   * @return {Function}\n   *    returns a function that gives the plural form name for a given integer:\n   *       var fun = getPluralRules('en');\n   *       fun(1)    -> 'one'\n   *       fun(0)    -> 'other'\n   *       fun(1000) -> 'other'.\n   */\n\n  function getPluralRules(lang) {\n    var locales2rules = {\n      'af': 3,\n      'ak': 4,\n      'am': 4,\n      'ar': 1,\n      'asa': 3,\n      'az': 0,\n      'be': 11,\n      'bem': 3,\n      'bez': 3,\n      'bg': 3,\n      'bh': 4,\n      'bm': 0,\n      'bn': 3,\n      'bo': 0,\n      'br': 20,\n      'brx': 3,\n      'bs': 11,\n      'ca': 3,\n      'cgg': 3,\n      'chr': 3,\n      'cs': 12,\n      'cy': 17,\n      'da': 3,\n      'de': 3,\n      'dv': 3,\n      'dz': 0,\n      'ee': 3,\n      'el': 3,\n      'en': 3,\n      'eo': 3,\n      'es': 3,\n      'et': 3,\n      'eu': 3,\n      'fa': 0,\n      'ff': 5,\n      'fi': 3,\n      'fil': 4,\n      'fo': 3,\n      'fr': 5,\n      'fur': 3,\n      'fy': 3,\n      'ga': 8,\n      'gd': 24,\n      'gl': 3,\n      'gsw': 3,\n      'gu': 3,\n      'guw': 4,\n      'gv': 23,\n      'ha': 3,\n      'haw': 3,\n      'he': 2,\n      'hi': 4,\n      'hr': 11,\n      'hu': 0,\n      'id': 0,\n      'ig': 0,\n      'ii': 0,\n      'is': 3,\n      'it': 3,\n      'iu': 7,\n      'ja': 0,\n      'jmc': 3,\n      'jv': 0,\n      'ka': 0,\n      'kab': 5,\n      'kaj': 3,\n      'kcg': 3,\n      'kde': 0,\n      'kea': 0,\n      'kk': 3,\n      'kl': 3,\n      'km': 0,\n      'kn': 0,\n      'ko': 0,\n      'ksb': 3,\n      'ksh': 21,\n      'ku': 3,\n      'kw': 7,\n      'lag': 18,\n      'lb': 3,\n      'lg': 3,\n      'ln': 4,\n      'lo': 0,\n      'lt': 10,\n      'lv': 6,\n      'mas': 3,\n      'mg': 4,\n      'mk': 16,\n      'ml': 3,\n      'mn': 3,\n      'mo': 9,\n      'mr': 3,\n      'ms': 0,\n      'mt': 15,\n      'my': 0,\n      'nah': 3,\n      'naq': 7,\n      'nb': 3,\n      'nd': 3,\n      'ne': 3,\n      'nl': 3,\n      'nn': 3,\n      'no': 3,\n      'nr': 3,\n      'nso': 4,\n      'ny': 3,\n      'nyn': 3,\n      'om': 3,\n      'or': 3,\n      'pa': 3,\n      'pap': 3,\n      'pl': 13,\n      'ps': 3,\n      'pt': 3,\n      'rm': 3,\n      'ro': 9,\n      'rof': 3,\n      'ru': 11,\n      'rwk': 3,\n      'sah': 0,\n      'saq': 3,\n      'se': 7,\n      'seh': 3,\n      'ses': 0,\n      'sg': 0,\n      'sh': 11,\n      'shi': 19,\n      'sk': 12,\n      'sl': 14,\n      'sma': 7,\n      'smi': 7,\n      'smj': 7,\n      'smn': 7,\n      'sms': 7,\n      'sn': 3,\n      'so': 3,\n      'sq': 3,\n      'sr': 11,\n      'ss': 3,\n      'ssy': 3,\n      'st': 3,\n      'sv': 3,\n      'sw': 3,\n      'syr': 3,\n      'ta': 3,\n      'te': 3,\n      'teo': 3,\n      'th': 0,\n      'ti': 4,\n      'tig': 3,\n      'tk': 3,\n      'tl': 4,\n      'tn': 3,\n      'to': 0,\n      'tr': 0,\n      'ts': 3,\n      'tzm': 22,\n      'uk': 11,\n      'ur': 3,\n      've': 3,\n      'vi': 0,\n      'vun': 3,\n      'wa': 4,\n      'wae': 3,\n      'wo': 0,\n      'xh': 3,\n      'xog': 3,\n      'yo': 0,\n      'zh': 0,\n      'zu': 3\n    };\n\n    // utility functions for plural rules methods\n    function isIn(n, list) {\n      return list.indexOf(n) !== -1;\n    }\n    function isBetween(n, start, end) {\n      return start <= n && n <= end;\n    }\n\n    // list of all plural rules methods:\n    // map an integer to the plural form name to use\n    var pluralRules = {\n      '0': function(n) {\n        return 'other';\n      },\n      '1': function(n) {\n        if ((isBetween((n % 100), 3, 10)))\n          return 'few';\n        if (n === 0)\n          return 'zero';\n        if ((isBetween((n % 100), 11, 99)))\n          return 'many';\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '2': function(n) {\n        if (n !== 0 && (n % 10) === 0)\n          return 'many';\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '3': function(n) {\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '4': function(n) {\n        if ((isBetween(n, 0, 1)))\n          return 'one';\n        return 'other';\n      },\n      '5': function(n) {\n        if ((isBetween(n, 0, 2)) && n != 2)\n          return 'one';\n        return 'other';\n      },\n      '6': function(n) {\n        if (n === 0)\n          return 'zero';\n        if ((n % 10) == 1 && (n % 100) != 11)\n          return 'one';\n        return 'other';\n      },\n      '7': function(n) {\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '8': function(n) {\n        if ((isBetween(n, 3, 6)))\n          return 'few';\n        if ((isBetween(n, 7, 10)))\n          return 'many';\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '9': function(n) {\n        if (n === 0 || n != 1 && (isBetween((n % 100), 1, 19)))\n          return 'few';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '10': function(n) {\n        if ((isBetween((n % 10), 2, 9)) && !(isBetween((n % 100), 11, 19)))\n          return 'few';\n        if ((n % 10) == 1 && !(isBetween((n % 100), 11, 19)))\n          return 'one';\n        return 'other';\n      },\n      '11': function(n) {\n        if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14)))\n          return 'few';\n        if ((n % 10) === 0 ||\n            (isBetween((n % 10), 5, 9)) ||\n            (isBetween((n % 100), 11, 14)))\n          return 'many';\n        if ((n % 10) == 1 && (n % 100) != 11)\n          return 'one';\n        return 'other';\n      },\n      '12': function(n) {\n        if ((isBetween(n, 2, 4)))\n          return 'few';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '13': function(n) {\n        if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14)))\n          return 'few';\n        if (n != 1 && (isBetween((n % 10), 0, 1)) ||\n            (isBetween((n % 10), 5, 9)) ||\n            (isBetween((n % 100), 12, 14)))\n          return 'many';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '14': function(n) {\n        if ((isBetween((n % 100), 3, 4)))\n          return 'few';\n        if ((n % 100) == 2)\n          return 'two';\n        if ((n % 100) == 1)\n          return 'one';\n        return 'other';\n      },\n      '15': function(n) {\n        if (n === 0 || (isBetween((n % 100), 2, 10)))\n          return 'few';\n        if ((isBetween((n % 100), 11, 19)))\n          return 'many';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '16': function(n) {\n        if ((n % 10) == 1 && n != 11)\n          return 'one';\n        return 'other';\n      },\n      '17': function(n) {\n        if (n == 3)\n          return 'few';\n        if (n === 0)\n          return 'zero';\n        if (n == 6)\n          return 'many';\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '18': function(n) {\n        if (n === 0)\n          return 'zero';\n        if ((isBetween(n, 0, 2)) && n !== 0 && n != 2)\n          return 'one';\n        return 'other';\n      },\n      '19': function(n) {\n        if ((isBetween(n, 2, 10)))\n          return 'few';\n        if ((isBetween(n, 0, 1)))\n          return 'one';\n        return 'other';\n      },\n      '20': function(n) {\n        if ((isBetween((n % 10), 3, 4) || ((n % 10) == 9)) && !(\n            isBetween((n % 100), 10, 19) ||\n            isBetween((n % 100), 70, 79) ||\n            isBetween((n % 100), 90, 99)\n            ))\n          return 'few';\n        if ((n % 1000000) === 0 && n !== 0)\n          return 'many';\n        if ((n % 10) == 2 && !isIn((n % 100), [12, 72, 92]))\n          return 'two';\n        if ((n % 10) == 1 && !isIn((n % 100), [11, 71, 91]))\n          return 'one';\n        return 'other';\n      },\n      '21': function(n) {\n        if (n === 0)\n          return 'zero';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '22': function(n) {\n        if ((isBetween(n, 0, 1)) || (isBetween(n, 11, 99)))\n          return 'one';\n        return 'other';\n      },\n      '23': function(n) {\n        if ((isBetween((n % 10), 1, 2)) || (n % 20) === 0)\n          return 'one';\n        return 'other';\n      },\n      '24': function(n) {\n        if ((isBetween(n, 3, 10) || isBetween(n, 13, 19)))\n          return 'few';\n        if (isIn(n, [2, 12]))\n          return 'two';\n        if (isIn(n, [1, 11]))\n          return 'one';\n        return 'other';\n      }\n    };\n\n    // return a function that gives the plural form name for a given integer\n    var index = locales2rules[lang.replace(/-.*$/, '')];\n    if (!(index in pluralRules)) {\n      console.warn('plural form unknown for [' + lang + ']');\n      return function() { return 'other'; };\n    }\n    return pluralRules[index];\n  }\n\n  // pre-defined 'plural' macro\n  gMacros.plural = function(str, param, key, prop) {\n    var n = parseFloat(param);\n    if (isNaN(n))\n      return str;\n\n    // TODO: support other properties (l20n still doesn't...)\n    if (prop != gTextProp)\n      return str;\n\n    // initialize _pluralRules\n    if (!gMacros._pluralRules) {\n      gMacros._pluralRules = getPluralRules(gLanguage);\n    }\n    var index = '[' + gMacros._pluralRules(n) + ']';\n\n    // try to find a [zero|one|two] key if it's defined\n    if (n === 0 && (key + '[zero]') in gL10nData) {\n      str = gL10nData[key + '[zero]'][prop];\n    } else if (n == 1 && (key + '[one]') in gL10nData) {\n      str = gL10nData[key + '[one]'][prop];\n    } else if (n == 2 && (key + '[two]') in gL10nData) {\n      str = gL10nData[key + '[two]'][prop];\n    } else if ((key + index) in gL10nData) {\n      str = gL10nData[key + index][prop];\n    } else if ((key + '[other]') in gL10nData) {\n      str = gL10nData[key + '[other]'][prop];\n    }\n\n    return str;\n  };\n\n\n  /**\n   * l10n dictionary functions\n   */\n\n  // fetch an l10n object, warn if not found, apply `args' if possible\n  function getL10nData(key, args, fallback) {\n    var data = gL10nData[key];\n    if (!data) {\n      console.warn('#' + key + ' is undefined.');\n      if (!fallback) {\n        return null;\n      }\n      data = fallback;\n    }\n\n    /** This is where l10n expressions should be processed.\n      * The plan is to support C-style expressions from the l20n project;\n      * until then, only two kinds of simple expressions are supported:\n      *   {[ index ]} and {{ arguments }}.\n      */\n    var rv = {};\n    for (var prop in data) {\n      var str = data[prop];\n      str = substIndexes(str, args, key, prop);\n      str = substArguments(str, args, key);\n      rv[prop] = str;\n    }\n    return rv;\n  }\n\n  // replace {[macros]} with their values\n  function substIndexes(str, args, key, prop) {\n    var reIndex = /\\{\\[\\s*([a-zA-Z]+)\\(([a-zA-Z]+)\\)\\s*\\]\\}/;\n    var reMatch = reIndex.exec(str);\n    if (!reMatch || !reMatch.length)\n      return str;\n\n    // an index/macro has been found\n    // Note: at the moment, only one parameter is supported\n    var macroName = reMatch[1];\n    var paramName = reMatch[2];\n    var param;\n    if (args && paramName in args) {\n      param = args[paramName];\n    } else if (paramName in gL10nData) {\n      param = gL10nData[paramName];\n    }\n\n    // there's no macro parser yet: it has to be defined in gMacros\n    if (macroName in gMacros) {\n      var macro = gMacros[macroName];\n      str = macro(str, param, key, prop);\n    }\n    return str;\n  }\n\n  // replace {{arguments}} with their values\n  function substArguments(str, args, key) {\n    var reArgs = /\\{\\{\\s*(.+?)\\s*\\}\\}/g;\n    return str.replace(reArgs, function(matched_text, arg) {\n      if (args && arg in args) {\n        return args[arg];\n      }\n      if (arg in gL10nData) {\n        return gL10nData[arg];\n      }\n      console.log('argument {{' + arg + '}} for #' + key + ' is undefined.');\n      return matched_text;\n    });\n  }\n\n  // translate an HTML element\n  function translateElement(element) {\n    var l10n = getL10nAttributes(element);\n    if (!l10n.id)\n      return;\n\n    // get the related l10n object\n    var data = getL10nData(l10n.id, l10n.args);\n    if (!data) {\n      console.warn('#' + l10n.id + ' is undefined.');\n      return;\n    }\n\n    // translate element (TODO: security checks?)\n    if (data[gTextProp]) { // XXX\n      if (getChildElementCount(element) === 0) {\n        element[gTextProp] = data[gTextProp];\n      } else {\n        // this element has element children: replace the content of the first\n        // (non-empty) child textNode and clear other child textNodes\n        var children = element.childNodes;\n        var found = false;\n        for (var i = 0, l = children.length; i < l; i++) {\n          if (children[i].nodeType === 3 && /\\S/.test(children[i].nodeValue)) {\n            if (found) {\n              children[i].nodeValue = '';\n            } else {\n              children[i].nodeValue = data[gTextProp];\n              found = true;\n            }\n          }\n        }\n        // if no (non-empty) textNode is found, insert a textNode before the\n        // first element child.\n        if (!found) {\n          var textNode = document.createTextNode(data[gTextProp]);\n          element.insertBefore(textNode, element.firstChild);\n        }\n      }\n      delete data[gTextProp];\n    }\n\n    for (var k in data) {\n      element[k] = data[k];\n    }\n  }\n\n  // webkit browsers don't currently support 'children' on SVG elements...\n  function getChildElementCount(element) {\n    if (element.children) {\n      return element.children.length;\n    }\n    if (typeof element.childElementCount !== 'undefined') {\n      return element.childElementCount;\n    }\n    var count = 0;\n    for (var i = 0; i < element.childNodes.length; i++) {\n      count += element.nodeType === 1 ? 1 : 0;\n    }\n    return count;\n  }\n\n  // translate an HTML subtree\n  function translateFragment(element) {\n    element = element || document.documentElement;\n\n    // check all translatable children (= w/ a `data-l10n-id' attribute)\n    var children = getTranslatableChildren(element);\n    var elementCount = children.length;\n    for (var i = 0; i < elementCount; i++) {\n      translateElement(children[i]);\n    }\n\n    // translate element itself if necessary\n    translateElement(element);\n  }\n\n  return {\n    // get a localized string\n    get: function(key, args, fallbackString) {\n      var index = key.lastIndexOf('.');\n      var prop = gTextProp;\n      if (index > 0) { // An attribute has been specified\n        prop = key.substr(index + 1);\n        key = key.substring(0, index);\n      }\n      var fallback;\n      if (fallbackString) {\n        fallback = {};\n        fallback[prop] = fallbackString;\n      }\n      var data = getL10nData(key, args, fallback);\n      if (data && prop in data) {\n        return data[prop];\n      }\n      return '{{' + key + '}}';\n    },\n\n    // debug\n    getData: function() { return gL10nData; },\n    getText: function() { return gTextData; },\n\n    // get|set the document language\n    getLanguage: function() { return gLanguage; },\n    setLanguage: function(lang, callback) {\n      loadLocale(lang, function() {\n        if (callback)\n          callback();\n        translateFragment();\n      });\n    },\n\n    // get the direction (ltr|rtl) of the current language\n    getDirection: function() {\n      // http://www.w3.org/International/questions/qa-scripts\n      // Arabic, Hebrew, Farsi, Pashto, Urdu\n      var rtlList = ['ar', 'he', 'fa', 'ps', 'ur'];\n      var shortCode = gLanguage.split('-', 1)[0];\n      return (rtlList.indexOf(shortCode) >= 0) ? 'rtl' : 'ltr';\n    },\n\n    // translate an element or document fragment\n    translate: translateFragment,\n\n    // this can be used to prevent race conditions\n    getReadyState: function() { return gReadyState; },\n    ready: function(callback) {\n      if (!callback) {\n        return;\n      } else if (gReadyState == 'complete' || gReadyState == 'interactive') {\n        window.setTimeout(function() {\n          callback();\n        });\n      } else if (document.addEventListener) {\n        document.addEventListener('localized', function once() {\n          document.removeEventListener('localized', once);\n          callback();\n        });\n      }\n    }\n  };\n}) (window, document);\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/static/generic/web/locale/locale.properties",
    "content": "[ach]\n@import url(ach/viewer.properties)\n\n[af]\n@import url(af/viewer.properties)\n\n[ak]\n@import url(ak/viewer.properties)\n\n[an]\n@import url(an/viewer.properties)\n\n[ar]\n@import url(ar/viewer.properties)\n\n[as]\n@import url(as/viewer.properties)\n\n[ast]\n@import url(ast/viewer.properties)\n\n[az]\n@import url(az/viewer.properties)\n\n[be]\n@import url(be/viewer.properties)\n\n[bg]\n@import url(bg/viewer.properties)\n\n[bn-BD]\n@import url(bn-BD/viewer.properties)\n\n[bn-IN]\n@import url(bn-IN/viewer.properties)\n\n[br]\n@import url(br/viewer.properties)\n\n[bs]\n@import url(bs/viewer.properties)\n\n[ca]\n@import url(ca/viewer.properties)\n\n[cs]\n@import url(cs/viewer.properties)\n\n[csb]\n@import url(csb/viewer.properties)\n\n[cy]\n@import url(cy/viewer.properties)\n\n[da]\n@import url(da/viewer.properties)\n\n[de]\n@import url(de/viewer.properties)\n\n[el]\n@import url(el/viewer.properties)\n\n[en-GB]\n@import url(en-GB/viewer.properties)\n\n[en-US]\n@import url(en-US/viewer.properties)\n\n[en-ZA]\n@import url(en-ZA/viewer.properties)\n\n[eo]\n@import url(eo/viewer.properties)\n\n[es-AR]\n@import url(es-AR/viewer.properties)\n\n[es-CL]\n@import url(es-CL/viewer.properties)\n\n[es-ES]\n@import url(es-ES/viewer.properties)\n\n[es-MX]\n@import url(es-MX/viewer.properties)\n\n[et]\n@import url(et/viewer.properties)\n\n[eu]\n@import url(eu/viewer.properties)\n\n[fa]\n@import url(fa/viewer.properties)\n\n[ff]\n@import url(ff/viewer.properties)\n\n[fi]\n@import url(fi/viewer.properties)\n\n[fr]\n@import url(fr/viewer.properties)\n\n[fy-NL]\n@import url(fy-NL/viewer.properties)\n\n[ga-IE]\n@import url(ga-IE/viewer.properties)\n\n[gd]\n@import url(gd/viewer.properties)\n\n[gl]\n@import url(gl/viewer.properties)\n\n[gu-IN]\n@import url(gu-IN/viewer.properties)\n\n[he]\n@import url(he/viewer.properties)\n\n[hi-IN]\n@import url(hi-IN/viewer.properties)\n\n[hr]\n@import url(hr/viewer.properties)\n\n[hu]\n@import url(hu/viewer.properties)\n\n[hy-AM]\n@import url(hy-AM/viewer.properties)\n\n[id]\n@import url(id/viewer.properties)\n\n[is]\n@import url(is/viewer.properties)\n\n[it]\n@import url(it/viewer.properties)\n\n[ja]\n@import url(ja/viewer.properties)\n\n[ka]\n@import url(ka/viewer.properties)\n\n[kk]\n@import url(kk/viewer.properties)\n\n[km]\n@import url(km/viewer.properties)\n\n[kn]\n@import url(kn/viewer.properties)\n\n[ko]\n@import url(ko/viewer.properties)\n\n[ku]\n@import url(ku/viewer.properties)\n\n[lg]\n@import url(lg/viewer.properties)\n\n[lij]\n@import url(lij/viewer.properties)\n\n[lt]\n@import url(lt/viewer.properties)\n\n[lv]\n@import url(lv/viewer.properties)\n\n[mai]\n@import url(mai/viewer.properties)\n\n[mk]\n@import url(mk/viewer.properties)\n\n[ml]\n@import url(ml/viewer.properties)\n\n[mn]\n@import url(mn/viewer.properties)\n\n[mr]\n@import url(mr/viewer.properties)\n\n[ms]\n@import url(ms/viewer.properties)\n\n[my]\n@import url(my/viewer.properties)\n\n[nb-NO]\n@import url(nb-NO/viewer.properties)\n\n[nl]\n@import url(nl/viewer.properties)\n\n[nn-NO]\n@import url(nn-NO/viewer.properties)\n\n[nso]\n@import url(nso/viewer.properties)\n\n[oc]\n@import url(oc/viewer.properties)\n\n[or]\n@import url(or/viewer.properties)\n\n[pa-IN]\n@import url(pa-IN/viewer.properties)\n\n[pl]\n@import url(pl/viewer.properties)\n\n[pt-BR]\n@import url(pt-BR/viewer.properties)\n\n[pt-PT]\n@import url(pt-PT/viewer.properties)\n\n[rm]\n@import url(rm/viewer.properties)\n\n[ro]\n@import url(ro/viewer.properties)\n\n[ru]\n@import url(ru/viewer.properties)\n\n[rw]\n@import url(rw/viewer.properties)\n\n[sah]\n@import url(sah/viewer.properties)\n\n[si]\n@import url(si/viewer.properties)\n\n[sk]\n@import url(sk/viewer.properties)\n\n[sl]\n@import url(sl/viewer.properties)\n\n[son]\n@import url(son/viewer.properties)\n\n[sq]\n@import url(sq/viewer.properties)\n\n[sr]\n@import url(sr/viewer.properties)\n\n[sv-SE]\n@import url(sv-SE/viewer.properties)\n\n[sw]\n@import url(sw/viewer.properties)\n\n[ta]\n@import url(ta/viewer.properties)\n\n[ta-LK]\n@import url(ta-LK/viewer.properties)\n\n[te]\n@import url(te/viewer.properties)\n\n[th]\n@import url(th/viewer.properties)\n\n[tl]\n@import url(tl/viewer.properties)\n\n[tn]\n@import url(tn/viewer.properties)\n\n[tr]\n@import url(tr/viewer.properties)\n\n[uk]\n@import url(uk/viewer.properties)\n\n[ur]\n@import url(ur/viewer.properties)\n\n[vi]\n@import url(vi/viewer.properties)\n\n[wo]\n@import url(wo/viewer.properties)\n\n[xh]\n@import url(xh/viewer.properties)\n\n[zh-CN]\n@import url(zh-CN/viewer.properties)\n\n[zh-TW]\n@import url(zh-TW/viewer.properties)\n\n[zu]\n@import url(zu/viewer.properties)\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/static/generic/web/locale/zh-CN/viewer.properties",
    "content": "# Copyright 2012 Mozilla Foundation\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Main toolbar buttons (tooltips and alt text for images)\nprevious.title=上一页\nprevious_label=上一页\nnext.title=下一页\nnext_label=下一页\n\n# LOCALIZATION NOTE (page_label, page_of):\n# These strings are concatenated to form the \"Page: X of Y\" string.\n# Do not translate \"{{pageCount}}\", it will be substituted with a number\n# representing the total number of pages.\npage_label=页面：\npage_of=/ {{pageCount}}\n\nzoom_out.title=缩小\nzoom_out_label=缩小\nzoom_in.title=放大\nzoom_in_label=放大\nzoom.title=缩放\npresentation_mode.title=切换到演示模式\npresentation_mode_label=演示模式\nopen_file.title=打开文件\nopen_file_label=打开\nprint.title=打印\nprint_label=打印\ndownload.title=下载\ndownload_label=下载\nbookmark.title=当前视图（复制或在新窗口中打开）\nbookmark_label=当前视图\n\n# Secondary toolbar and context menu\ntools.title=工具\ntools_label=工具\nfirst_page.title=转到第一页\nfirst_page.label=转到第一页\nfirst_page_label=转到第一页\nlast_page.title=转到最后一页\nlast_page.label=转到最后一页\nlast_page_label=转到最后一页\npage_rotate_cw.title=顺时针旋转\npage_rotate_cw.label=顺时针旋转\npage_rotate_cw_label=顺时针旋转\npage_rotate_ccw.title=逆时针旋转\npage_rotate_ccw.label=逆时针旋转\npage_rotate_ccw_label=逆时针旋转\n\nhand_tool_enable.title=启用手形工具\nhand_tool_enable_label=启用手形工具\nhand_tool_disable.title=禁用手形工具\nhand_tool_disable_label=禁用手形工具\n\n# Document properties dialog box\ndocument_properties.title=文档属性…\ndocument_properties_label=文档属性…\ndocument_properties_file_name=文件名:\ndocument_properties_file_size=文件大小:\ndocument_properties_kb={{size_kb}} KB ({{size_b}} 字节)\ndocument_properties_mb={{size_mb}} MB ({{size_b}} 字节)\ndocument_properties_title=标题:\ndocument_properties_author=作者:\ndocument_properties_subject=主题:\ndocument_properties_keywords=关键词:\ndocument_properties_creation_date=创建日期:\ndocument_properties_modification_date=修改日期:\ndocument_properties_date_string={{date}}, {{time}}\ndocument_properties_creator=创建者:\ndocument_properties_producer=PDF 制作者:\ndocument_properties_version=PDF 版本:\ndocument_properties_page_count=页数:\ndocument_properties_close=关闭\n\n# Tooltips and alt text for side panel toolbar buttons\n# (the _label strings are alt text for the buttons, the .title strings are\n# tooltips)\ntoggle_sidebar.title=切换侧栏\ntoggle_sidebar_label=切换侧栏\noutline.title=显示文档大纲\noutline_label=文档大纲\nattachments.title=显示附件\nattachments_label=附件\nthumbs.title=显示缩略图\nthumbs_label=缩略图\nfindbar.title=在文档中查找\nfindbar_label=查找\n\n# Thumbnails panel item (tooltip and alt text for images)\n# LOCALIZATION NOTE (thumb_page_title): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_title=页码 {{page}}\n# LOCALIZATION NOTE (thumb_page_canvas): \"{{page}}\" will be replaced by the page\n# number.\nthumb_page_canvas=页面 {{page}} 的缩略图\n\n# Find panel button title and messages\nfind_label=查找：\nfind_previous.title=查找词语上一次出现的位置\nfind_previous_label=上一页\nfind_next.title=查找词语后一次出现的位置\nfind_next_label=下一页\nfind_highlight=全部高亮显示\nfind_match_case_label=区分大小写\nfind_reached_top=到达文档开头，从末尾继续\nfind_reached_bottom=到达文档末尾，从开头继续\nfind_not_found=词语未找到\n\n# Error panel labels\nerror_more_info=更多信息\nerror_less_info=更少信息\nerror_close=关闭\n# LOCALIZATION NOTE (error_version_info): \"{{version}}\" and \"{{build}}\" will be\n# replaced by the PDF.JS version and build ID.\nerror_version_info=PDF.js v{{version}} (build: {{build}})\n# LOCALIZATION NOTE (error_message): \"{{message}}\" will be replaced by an\n# english string describing the error.\nerror_message=信息：{{message}}\n# LOCALIZATION NOTE (error_stack): \"{{stack}}\" will be replaced with a stack\n# trace.\nerror_stack=堆栈：{{stack}}\n# LOCALIZATION NOTE (error_file): \"{{file}}\" will be replaced with a filename\nerror_file=文件：{{file}}\n# LOCALIZATION NOTE (error_line): \"{{line}}\" will be replaced with a line number\nerror_line=行号：{{line}}\nrendering_error=渲染页面时发生错误。\n\n# Predefined zoom values\npage_scale_width=适合页宽\npage_scale_fit=适合页面\npage_scale_auto=自动缩放\npage_scale_actual=实际大小\n# LOCALIZATION NOTE (page_scale_percent): \"{{scale}}\" will be replaced by a\n# numerical scale value.\npage_scale_percent={{scale}}%\n\n# Loading indicator messages\nloading_error_indicator=错误\nloading_error=载入PDF时发生错误。\ninvalid_file_error=无效或损坏的PDF文件。\nmissing_file_error=缺少PDF文件。\nunexpected_response_error=意外的服务器响应。\n\n# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.\n# \"{{type}}\" will be replaced with an annotation type from a list defined in\n# the PDF spec (32000-1:2008 Table 169 – Annotation types).\n# Some common types are e.g.: \"Check\", \"Text\", \"Comment\", \"Note\"\ntext_annotation_type.alt=[{{type}} 注解]\npassword_label=输入密码以打开此 PDF 文件。\npassword_invalid=密码无效。请重试。\npassword_ok=确定\npassword_cancel=取消\n\nprinting_not_supported=警告：打印功能不完全支持此浏览器。\nprinting_not_ready=警告：该 PDF 未完全加载以供打印。\nweb_fonts_disabled=Web 字体已被禁用：无法使用嵌入的PDF字体。\ndocument_colors_disabled=不允许 PDF 文档使用自己的颜色：浏览器中“允许页面选择自己的颜色”的选项已停用。\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/static/generic/web/viewer.css",
    "content": "/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n.textLayer {\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  overflow: hidden;\n  opacity: 0.2;\n}\n\n.textLayer > div {\n  color: transparent;\n  position: absolute;\n  white-space: pre;\n  cursor: text;\n  -webkit-transform-origin: 0% 0%;\n  -moz-transform-origin: 0% 0%;\n  -o-transform-origin: 0% 0%;\n  -ms-transform-origin: 0% 0%;\n  transform-origin: 0% 0%;\n}\n\n.textLayer .highlight {\n  margin: -1px;\n  padding: 1px;\n\n  background-color: rgb(180, 0, 170);\n  border-radius: 4px;\n}\n\n.textLayer .highlight.begin {\n  border-radius: 4px 0px 0px 4px;\n}\n\n.textLayer .highlight.end {\n  border-radius: 0px 4px 4px 0px;\n}\n\n.textLayer .highlight.middle {\n  border-radius: 0px;\n}\n\n.textLayer .highlight.selected {\n  background-color: rgb(0, 100, 0);\n}\n\n.textLayer ::selection { background: rgb(0,0,255); }\n.textLayer ::-moz-selection { background: rgb(0,0,255); }\n\n.pdfViewer .canvasWrapper {\n  overflow: hidden;\n}\n\n.pdfViewer .page {\n  direction: ltr;\n  width: 816px;\n  height: 1056px;\n  margin: 1px auto -8px auto;\n  position: relative;\n  overflow: visible;\n  border: 9px solid transparent;\n  background-clip: content-box;\n  border-image: url(images/shadow.png) 9 9 repeat;\n  background-color: white;\n}\n\n.pdfViewer.removePageBorders .page {\n  margin: 0px auto 10px auto;\n  border: none;\n}\n\n.pdfViewer .page canvas {\n  margin: 0;\n  display: block;\n}\n\n.pdfViewer .page .loadingIcon {\n  position: absolute;\n  display: block;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  background: url('images/loading-icon.gif') center no-repeat;\n}\n\n.pdfViewer .page .annotLink > a:hover {\n  opacity: 0.2;\n  background: #ff0;\n  box-shadow: 0px 2px 10px #ff0;\n}\n\n.pdfPresentationMode:-webkit-full-screen .pdfViewer .page {\n  margin-bottom: 100%;\n  border: 0;\n}\n\n.pdfPresentationMode:-moz-full-screen .pdfViewer .page {\n  margin-bottom: 100%;\n  border: 0;\n}\n\n.pdfPresentationMode:-ms-fullscreen .pdfViewer .page {\n  margin-bottom: 100% !important;\n  border: 0;\n}\n\n.pdfPresentationMode:fullscreen .pdfViewer .page {\n  margin-bottom: 100%;\n  border: 0;\n}\n\n.pdfViewer .page .annotText > img {\n  position: absolute;\n  cursor: pointer;\n}\n\n.pdfViewer .page .annotTextContentWrapper {\n  position: absolute;\n  width: 20em;\n}\n\n.pdfViewer .page .annotTextContent {\n  z-index: 200;\n  float: left;\n  max-width: 20em;\n  background-color: #FFFF99;\n  box-shadow: 0px 2px 5px #333;\n  border-radius: 2px;\n  padding: 0.6em;\n  cursor: pointer;\n}\n\n.pdfViewer .page .annotTextContent > h1 {\n  font-size: 1em;\n  border-bottom: 1px solid #000000;\n  padding-bottom: 0.2em;\n}\n\n.pdfViewer .page .annotTextContent > p {\n  padding-top: 0.2em;\n}\n\n.pdfViewer .page .annotLink > a {\n  position: absolute;\n  font-size: 1em;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.pdfViewer .page .annotLink > a /* -ms-a */  {\n  background: url(\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAA\\\n                   LAAAAAABAAEAAAIBRAA7\") 0 0 repeat;\n}\n\n* {\n  padding: 0;\n  margin: 0;\n}\n\nhtml {\n  height: 100%;\n  /* Font size is needed to make the activity bar the correct size. */\n  font-size: 10px;\n}\n\nbody {\n  height: 100%;\n  background-color: #404040;\n  background-image: url(images/texture.png);\n}\n\nbody,\ninput,\nbutton,\nselect {\n  font: message-box;\n  outline: none;\n}\n\n.hidden {\n  display: none !important;\n}\n[hidden] {\n  display: none !important;\n}\n\n#viewerContainer.pdfPresentationMode:-webkit-full-screen {\n  top: 0px;\n  border-top: 2px solid transparent;\n  background-color: #000;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  cursor: none;\n  -webkit-user-select: none;\n}\n\n#viewerContainer.pdfPresentationMode:-moz-full-screen {\n  top: 0px;\n  border-top: 2px solid transparent;\n  background-color: #000;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  cursor: none;\n  -moz-user-select: none;\n}\n\n#viewerContainer.pdfPresentationMode:-ms-fullscreen {\n  top: 0px !important;\n  border-top: 2px solid transparent;\n  width: 100%;\n  height: 100%;\n  overflow: hidden !important;\n  cursor: none;\n  -ms-user-select: none;\n}\n\n#viewerContainer.pdfPresentationMode:-ms-fullscreen::-ms-backdrop {\n  background-color: #000;\n}\n\n#viewerContainer.pdfPresentationMode:fullscreen {\n  top: 0px;\n  border-top: 2px solid transparent;\n  background-color: #000;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  cursor: none;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n}\n\n.pdfPresentationMode:-webkit-full-screen a:not(.internalLink) {\n  display: none;\n}\n\n.pdfPresentationMode:-moz-full-screen a:not(.internalLink) {\n  display: none;\n}\n\n.pdfPresentationMode:-ms-fullscreen a:not(.internalLink) {\n  display: none !important;\n}\n\n.pdfPresentationMode:fullscreen a:not(.internalLink) {\n  display: none;\n}\n\n.pdfPresentationMode:-webkit-full-screen .textLayer > div {\n  cursor: none;\n}\n\n.pdfPresentationMode:-moz-full-screen .textLayer > div {\n  cursor: none;\n}\n\n.pdfPresentationMode:-ms-fullscreen .textLayer > div {\n  cursor: none;\n}\n\n.pdfPresentationMode:fullscreen .textLayer > div {\n  cursor: none;\n}\n\n.pdfPresentationMode.pdfPresentationModeControls > *,\n.pdfPresentationMode.pdfPresentationModeControls .textLayer > div {\n  cursor: default;\n}\n\n/* outer/inner center provides horizontal center */\n.outerCenter {\n  pointer-events: none;\n  position: relative;\n}\nhtml[dir='ltr'] .outerCenter {\n  float: right;\n  right: 50%;\n}\nhtml[dir='rtl'] .outerCenter {\n  float: left;\n  left: 50%;\n}\n.innerCenter {\n  pointer-events: auto;\n  position: relative;\n}\nhtml[dir='ltr'] .innerCenter {\n  float: right;\n  right: -50%;\n}\nhtml[dir='rtl'] .innerCenter {\n  float: left;\n  left: -50%;\n}\n\n#outerContainer {\n  width: 100%;\n  height: 100%;\n  position: relative;\n}\n\n#sidebarContainer {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  width: 200px;\n  visibility: hidden;\n  -webkit-transition-duration: 200ms;\n  -webkit-transition-timing-function: ease;\n  transition-duration: 200ms;\n  transition-timing-function: ease;\n\n}\nhtml[dir='ltr'] #sidebarContainer {\n  -webkit-transition-property: left;\n  transition-property: left;\n  left: -200px;\n}\nhtml[dir='rtl'] #sidebarContainer {\n  -webkit-transition-property: right;\n  transition-property: right;\n  right: -200px;\n}\n\n#outerContainer.sidebarMoving > #sidebarContainer,\n#outerContainer.sidebarOpen > #sidebarContainer {\n  visibility: visible;\n}\nhtml[dir='ltr'] #outerContainer.sidebarOpen > #sidebarContainer {\n  left: 0px;\n}\nhtml[dir='rtl'] #outerContainer.sidebarOpen > #sidebarContainer {\n  right: 0px;\n}\n\n#mainContainer {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  min-width: 320px;\n  -webkit-transition-duration: 200ms;\n  -webkit-transition-timing-function: ease;\n  transition-duration: 200ms;\n  transition-timing-function: ease;\n}\nhtml[dir='ltr'] #outerContainer.sidebarOpen > #mainContainer {\n  -webkit-transition-property: left;\n  transition-property: left;\n  left: 200px;\n}\nhtml[dir='rtl'] #outerContainer.sidebarOpen > #mainContainer {\n  -webkit-transition-property: right;\n  transition-property: right;\n  right: 200px;\n}\n\n#sidebarContent {\n  top: 32px;\n  bottom: 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  position: absolute;\n  width: 200px;\n  background-color: hsla(0,0%,0%,.1);\n}\nhtml[dir='ltr'] #sidebarContent {\n  left: 0;\n  box-shadow: inset -1px 0 0 hsla(0,0%,0%,.25);\n}\nhtml[dir='rtl'] #sidebarContent {\n  right: 0;\n  box-shadow: inset 1px 0 0 hsla(0,0%,0%,.25);\n}\n\n#viewerContainer {\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  position: absolute;\n  top: 32px;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  outline: none;\n}\nhtml[dir='ltr'] #viewerContainer {\n  box-shadow: inset 1px 0 0 hsla(0,0%,100%,.05);\n}\nhtml[dir='rtl'] #viewerContainer {\n  box-shadow: inset -1px 0 0 hsla(0,0%,100%,.05);\n}\n\n.toolbar {\n  position: relative;\n  left: 0;\n  right: 0;\n  z-index: 9999;\n  cursor: default;\n}\n\n#toolbarContainer {\n  width: 100%;\n}\n\n#toolbarSidebar {\n  width: 200px;\n  height: 32px;\n  background-color: #424242; /* fallback */\n  background-image: url(images/texture.png),\n                    linear-gradient(hsla(0,0%,30%,.99), hsla(0,0%,25%,.95));\n}\nhtml[dir='ltr'] #toolbarSidebar {\n  box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.25),\n              inset 0 -1px 0 hsla(0,0%,100%,.05),\n              0 1px 0 hsla(0,0%,0%,.15),\n              0 0 1px hsla(0,0%,0%,.1);\n}\nhtml[dir='rtl'] #toolbarSidebar {\n  box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.25),\n              inset 0 1px 0 hsla(0,0%,100%,.05),\n              0 1px 0 hsla(0,0%,0%,.15),\n              0 0 1px hsla(0,0%,0%,.1);\n}\n\n#toolbarContainer, .findbar, .secondaryToolbar {\n  position: relative;\n  height: 32px;\n  background-color: #474747; /* fallback */\n  background-image: url(images/texture.png),\n                    linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95));\n}\nhtml[dir='ltr'] #toolbarContainer, .findbar, .secondaryToolbar {\n  box-shadow: inset 1px 0 0 hsla(0,0%,100%,.08),\n              inset 0 1px 1px hsla(0,0%,0%,.15),\n              inset 0 -1px 0 hsla(0,0%,100%,.05),\n              0 1px 0 hsla(0,0%,0%,.15),\n              0 1px 1px hsla(0,0%,0%,.1);\n}\nhtml[dir='rtl'] #toolbarContainer, .findbar, .secondaryToolbar {\n  box-shadow: inset -1px 0 0 hsla(0,0%,100%,.08),\n              inset 0 1px 1px hsla(0,0%,0%,.15),\n              inset 0 -1px 0 hsla(0,0%,100%,.05),\n              0 1px 0 hsla(0,0%,0%,.15),\n              0 1px 1px hsla(0,0%,0%,.1);\n}\n\n#toolbarViewer {\n  height: 32px;\n}\n\n#loadingBar {\n  position: relative;\n  width: 100%;\n  height: 4px;\n  background-color: #333;\n  border-bottom: 1px solid #333;\n}\n\n#loadingBar .progress {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 0%;\n  height: 100%;\n  background-color: #ddd;\n  overflow: hidden;\n  -webkit-transition: width 200ms;\n  transition: width 200ms;\n}\n\n@-webkit-keyframes progressIndeterminate {\n  0% { left: 0%; }\n  50% { left: 100%; }\n  100% { left: 100%; }\n}\n\n@keyframes progressIndeterminate {\n  0% { left: 0%; }\n  50% { left: 100%; }\n  100% { left: 100%; }\n}\n\n#loadingBar .progress.indeterminate {\n  background-color: #999;\n  -webkit-transition: none;\n  transition: none;\n}\n\n#loadingBar .indeterminate .glimmer {\n  position: absolute;\n  top: 0;\n  left: 0;\n  height: 100%;\n  width: 50px;\n\n  background-image: linear-gradient(to right, #999 0%, #fff 50%, #999 100%);\n  background-size: 100% 100%;\n  background-repeat: no-repeat;\n\n  -webkit-animation: progressIndeterminate 2s linear infinite;\n  animation: progressIndeterminate 2s linear infinite;\n}\n\n.findbar, .secondaryToolbar {\n  top: 32px;\n  position: absolute;\n  z-index: 10000;\n  height: 32px;\n\n  min-width: 16px;\n  padding: 0px 6px 0px 6px;\n  margin: 4px 2px 4px 2px;\n  color: hsl(0,0%,85%);\n  font-size: 12px;\n  line-height: 14px;\n  text-align: left;\n  cursor: default;\n}\n\nhtml[dir='ltr'] .findbar {\n  left: 68px;\n}\n\nhtml[dir='rtl'] .findbar {\n  right: 68px;\n}\n\n.findbar label {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n}\n\n#findInput[data-status=\"pending\"] {\n  background-image: url(images/loading-small.png);\n  background-repeat: no-repeat;\n  background-position: right;\n}\nhtml[dir='rtl'] #findInput[data-status=\"pending\"] {\n  background-position: left;\n}\n\n.secondaryToolbar {\n  padding: 6px;\n  height: auto;\n  z-index: 30000;\n}\nhtml[dir='ltr'] .secondaryToolbar {\n  right: 4px;\n}\nhtml[dir='rtl'] .secondaryToolbar {\n  left: 4px;\n}\n\n#secondaryToolbarButtonContainer {\n  max-width: 200px;\n  max-height: 400px;\n  overflow-y: auto;\n  -webkit-overflow-scrolling: touch;\n  margin-bottom: -4px;\n}\n\n.doorHanger,\n.doorHangerRight {\n  border: 1px solid hsla(0,0%,0%,.5);\n  border-radius: 2px;\n  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);\n}\n.doorHanger:after, .doorHanger:before,\n.doorHangerRight:after, .doorHangerRight:before {\n  bottom: 100%;\n  border: solid transparent;\n  content: \" \";\n  height: 0;\n  width: 0;\n  position: absolute;\n  pointer-events: none;\n}\n.doorHanger:after,\n.doorHangerRight:after {\n  border-bottom-color: hsla(0,0%,32%,.99);\n  border-width: 8px;\n}\n.doorHanger:before,\n.doorHangerRight:before {\n  border-bottom-color: hsla(0,0%,0%,.5);\n  border-width: 9px;\n}\n\nhtml[dir='ltr'] .doorHanger:after,\nhtml[dir='rtl'] .doorHangerRight:after {\n  left: 13px;\n  margin-left: -8px;\n}\n\nhtml[dir='ltr'] .doorHanger:before,\nhtml[dir='rtl'] .doorHangerRight:before {\n  left: 13px;\n  margin-left: -9px;\n}\n\nhtml[dir='rtl'] .doorHanger:after,\nhtml[dir='ltr'] .doorHangerRight:after {\n  right: 13px;\n  margin-right: -8px;\n}\n\nhtml[dir='rtl'] .doorHanger:before,\nhtml[dir='ltr'] .doorHangerRight:before {\n  right: 13px;\n  margin-right: -9px;\n}\n\n#findMsg {\n  font-style: italic;\n  color: #A6B7D0;\n}\n\n#findInput.notFound {\n  background-color: rgb(255, 102, 102);\n}\n\nhtml[dir='ltr'] #toolbarViewerLeft {\n  margin-left: -1px;\n}\nhtml[dir='rtl'] #toolbarViewerRight {\n  margin-right: -1px;\n}\n\nhtml[dir='ltr'] #toolbarViewerLeft,\nhtml[dir='rtl'] #toolbarViewerRight {\n  position: absolute;\n  top: 0;\n  left: 0;\n}\nhtml[dir='ltr'] #toolbarViewerRight,\nhtml[dir='rtl'] #toolbarViewerLeft {\n  position: absolute;\n  top: 0;\n  right: 0;\n}\nhtml[dir='ltr'] #toolbarViewerLeft > *,\nhtml[dir='ltr'] #toolbarViewerMiddle > *,\nhtml[dir='ltr'] #toolbarViewerRight > *,\nhtml[dir='ltr'] .findbar > * {\n  position: relative;\n  float: left;\n}\nhtml[dir='rtl'] #toolbarViewerLeft > *,\nhtml[dir='rtl'] #toolbarViewerMiddle > *,\nhtml[dir='rtl'] #toolbarViewerRight > *,\nhtml[dir='rtl'] .findbar > * {\n  position: relative;\n  float: right;\n}\n\nhtml[dir='ltr'] .splitToolbarButton {\n  margin: 3px 2px 4px 0;\n  display: inline-block;\n}\nhtml[dir='rtl'] .splitToolbarButton {\n  margin: 3px 0 4px 2px;\n  display: inline-block;\n}\nhtml[dir='ltr'] .splitToolbarButton > .toolbarButton {\n  border-radius: 0;\n  float: left;\n}\nhtml[dir='rtl'] .splitToolbarButton > .toolbarButton {\n  border-radius: 0;\n  float: right;\n}\n\n.toolbarButton,\n.secondaryToolbarButton,\n.overlayButton {\n  border: 0 none;\n  background: none;\n  width: 32px;\n  height: 25px;\n}\n\n.toolbarButton > span {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  overflow: hidden;\n}\n\n.toolbarButton[disabled],\n.secondaryToolbarButton[disabled],\n.overlayButton[disabled] {\n  opacity: .5;\n}\n\n.toolbarButton.group {\n  margin-right: 0;\n}\n\n.splitToolbarButton.toggled .toolbarButton {\n  margin: 0;\n}\n\n.splitToolbarButton:hover > .toolbarButton,\n.splitToolbarButton:focus > .toolbarButton,\n.splitToolbarButton.toggled > .toolbarButton,\n.toolbarButton.textButton {\n  background-color: hsla(0,0%,0%,.12);\n  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));\n  background-clip: padding-box;\n  border: 1px solid hsla(0,0%,0%,.35);\n  border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);\n  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,\n              0 0 1px hsla(0,0%,100%,.15) inset,\n              0 1px 0 hsla(0,0%,100%,.05);\n  -webkit-transition-property: background-color, border-color, box-shadow;\n  -webkit-transition-duration: 150ms;\n  -webkit-transition-timing-function: ease;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 150ms;\n  transition-timing-function: ease;\n\n}\n.splitToolbarButton > .toolbarButton:hover,\n.splitToolbarButton > .toolbarButton:focus,\n.dropdownToolbarButton:hover,\n.overlayButton:hover,\n.toolbarButton.textButton:hover,\n.toolbarButton.textButton:focus {\n  background-color: hsla(0,0%,0%,.2);\n  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,\n              0 0 1px hsla(0,0%,100%,.15) inset,\n              0 0 1px hsla(0,0%,0%,.05);\n  z-index: 199;\n}\n.splitToolbarButton > .toolbarButton {\n  position: relative;\n}\nhtml[dir='ltr'] .splitToolbarButton > .toolbarButton:first-child,\nhtml[dir='rtl'] .splitToolbarButton > .toolbarButton:last-child {\n  position: relative;\n  margin: 0;\n  margin-right: -1px;\n  border-top-left-radius: 2px;\n  border-bottom-left-radius: 2px;\n  border-right-color: transparent;\n}\nhtml[dir='ltr'] .splitToolbarButton > .toolbarButton:last-child,\nhtml[dir='rtl'] .splitToolbarButton > .toolbarButton:first-child {\n  position: relative;\n  margin: 0;\n  margin-left: -1px;\n  border-top-right-radius: 2px;\n  border-bottom-right-radius: 2px;\n  border-left-color: transparent;\n}\n.splitToolbarButtonSeparator {\n  padding: 8px 0;\n  width: 1px;\n  background-color: hsla(0,0%,0%,.5);\n  z-index: 99;\n  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);\n  display: inline-block;\n  margin: 5px 0;\n}\nhtml[dir='ltr'] .splitToolbarButtonSeparator {\n  float: left;\n}\nhtml[dir='rtl'] .splitToolbarButtonSeparator {\n  float: right;\n}\n.splitToolbarButton:hover > .splitToolbarButtonSeparator,\n.splitToolbarButton.toggled > .splitToolbarButtonSeparator {\n  padding: 12px 0;\n  margin: 1px 0;\n  box-shadow: 0 0 0 1px hsla(0,0%,100%,.03);\n  -webkit-transition-property: padding;\n  -webkit-transition-duration: 10ms;\n  -webkit-transition-timing-function: ease;\n  transition-property: padding;\n  transition-duration: 10ms;\n  transition-timing-function: ease;\n}\n\n.toolbarButton,\n.dropdownToolbarButton,\n.secondaryToolbarButton,\n.overlayButton {\n  min-width: 16px;\n  padding: 2px 6px 0;\n  border: 1px solid transparent;\n  border-radius: 2px;\n  color: hsla(0,0%,100%,.8);\n  font-size: 12px;\n  line-height: 14px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  /* Opera does not support user-select, use <... unselectable=\"on\"> instead */\n  cursor: default;\n  -webkit-transition-property: background-color, border-color, box-shadow;\n  -webkit-transition-duration: 150ms;\n  -webkit-transition-timing-function: ease;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 150ms;\n  transition-timing-function: ease;\n}\n\nhtml[dir='ltr'] .toolbarButton,\nhtml[dir='ltr'] .overlayButton,\nhtml[dir='ltr'] .dropdownToolbarButton {\n  margin: 3px 2px 4px 0;\n}\nhtml[dir='rtl'] .toolbarButton,\nhtml[dir='rtl'] .overlayButton,\nhtml[dir='rtl'] .dropdownToolbarButton {\n  margin: 3px 0 4px 2px;\n}\n\n.toolbarButton:hover,\n.toolbarButton:focus,\n.dropdownToolbarButton,\n.overlayButton,\n.secondaryToolbarButton:hover,\n.secondaryToolbarButton:focus {\n  background-color: hsla(0,0%,0%,.12);\n  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));\n  background-clip: padding-box;\n  border: 1px solid hsla(0,0%,0%,.35);\n  border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);\n  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,\n              0 0 1px hsla(0,0%,100%,.15) inset,\n              0 1px 0 hsla(0,0%,100%,.05);\n}\n\n.toolbarButton:hover:active,\n.overlayButton:hover:active,\n.dropdownToolbarButton:hover:active,\n.secondaryToolbarButton:hover:active {\n  background-color: hsla(0,0%,0%,.2);\n  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));\n  border-color: hsla(0,0%,0%,.35) hsla(0,0%,0%,.4) hsla(0,0%,0%,.45);\n  box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset,\n              0 0 1px hsla(0,0%,0%,.2) inset,\n              0 1px 0 hsla(0,0%,100%,.05);\n  -webkit-transition-property: background-color, border-color, box-shadow;\n  -webkit-transition-duration: 10ms;\n  -webkit-transition-timing-function: linear;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 10ms;\n  transition-timing-function: linear;\n}\n\n.toolbarButton.toggled,\n.splitToolbarButton.toggled > .toolbarButton.toggled,\n.secondaryToolbarButton.toggled {\n  background-color: hsla(0,0%,0%,.3);\n  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));\n  border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.45) hsla(0,0%,0%,.5);\n  box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset,\n              0 0 1px hsla(0,0%,0%,.2) inset,\n              0 1px 0 hsla(0,0%,100%,.05);\n  -webkit-transition-property: background-color, border-color, box-shadow;\n  -webkit-transition-duration: 10ms;\n  -webkit-transition-timing-function: linear;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 10ms;\n  transition-timing-function: linear;\n}\n\n.toolbarButton.toggled:hover:active,\n.splitToolbarButton.toggled > .toolbarButton.toggled:hover:active,\n.secondaryToolbarButton.toggled:hover:active {\n  background-color: hsla(0,0%,0%,.4);\n  border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.5) hsla(0,0%,0%,.55);\n  box-shadow: 0 1px 1px hsla(0,0%,0%,.2) inset,\n              0 0 1px hsla(0,0%,0%,.3) inset,\n              0 1px 0 hsla(0,0%,100%,.05);\n}\n\n.dropdownToolbarButton {\n  width: 120px;\n  max-width: 120px;\n  padding: 3px 2px 2px;\n  overflow: hidden;\n  background: url(images/toolbarButton-menuArrows.png) no-repeat;\n}\nhtml[dir='ltr'] .dropdownToolbarButton {\n  background-position: 95%;\n}\nhtml[dir='rtl'] .dropdownToolbarButton {\n  background-position: 5%;\n}\n\n.dropdownToolbarButton > select {\n  min-width: 140px;\n  font-size: 12px;\n  color: hsl(0,0%,95%);\n  margin: 0;\n  padding: 0;\n  border: none;\n  background: rgba(0,0,0,0); /* Opera does not support 'transparent' <select> background */\n}\n\n.dropdownToolbarButton > select > option {\n  background: hsl(0,0%,24%);\n}\n\n#customScaleOption {\n  display: none;\n}\n\n#pageWidthOption {\n  border-bottom: 1px rgba(255, 255, 255, .5) solid;\n}\n\nhtml[dir='ltr'] .splitToolbarButton:first-child,\nhtml[dir='ltr'] .toolbarButton:first-child,\nhtml[dir='rtl'] .splitToolbarButton:last-child,\nhtml[dir='rtl'] .toolbarButton:last-child {\n  margin-left: 4px;\n}\nhtml[dir='ltr'] .splitToolbarButton:last-child,\nhtml[dir='ltr'] .toolbarButton:last-child,\nhtml[dir='rtl'] .splitToolbarButton:first-child,\nhtml[dir='rtl'] .toolbarButton:first-child {\n  margin-right: 4px;\n}\n\n.toolbarButtonSpacer {\n  width: 30px;\n  display: inline-block;\n  height: 1px;\n}\n\n.toolbarButtonFlexibleSpacer {\n  -webkit-box-flex: 1;\n  -moz-box-flex: 1;\n  min-width: 30px;\n}\n\nhtml[dir='ltr'] #findPrevious {\n  margin-left: 3px;\n}\nhtml[dir='ltr'] #findNext {\n  margin-right: 3px;\n}\n\nhtml[dir='rtl'] #findPrevious {\n  margin-right: 3px;\n}\nhtml[dir='rtl'] #findNext {\n  margin-left: 3px;\n}\n\n.toolbarButton::before,\n.secondaryToolbarButton::before {\n  /* All matching images have a size of 16x16\n   * All relevant containers have a size of 32x25 */\n  position: absolute;\n  display: inline-block;\n  top: 4px;\n  left: 7px;\n}\n\nhtml[dir=\"ltr\"] .secondaryToolbarButton::before {\n  left: 4px;\n}\nhtml[dir=\"rtl\"] .secondaryToolbarButton::before {\n  right: 4px;\n}\n\nhtml[dir='ltr'] .toolbarButton#sidebarToggle::before {\n  content: url(images/toolbarButton-sidebarToggle.png);\n}\nhtml[dir='rtl'] .toolbarButton#sidebarToggle::before {\n  content: url(images/toolbarButton-sidebarToggle-rtl.png);\n}\n\nhtml[dir='ltr'] .toolbarButton#secondaryToolbarToggle::before {\n  content: url(images/toolbarButton-secondaryToolbarToggle.png);\n}\nhtml[dir='rtl'] .toolbarButton#secondaryToolbarToggle::before {\n  content: url(images/toolbarButton-secondaryToolbarToggle-rtl.png);\n}\n\nhtml[dir='ltr'] .toolbarButton.findPrevious::before {\n  content: url(images/findbarButton-previous.png);\n}\nhtml[dir='rtl'] .toolbarButton.findPrevious::before {\n  content: url(images/findbarButton-previous-rtl.png);\n}\n\nhtml[dir='ltr'] .toolbarButton.findNext::before {\n  content: url(images/findbarButton-next.png);\n}\nhtml[dir='rtl'] .toolbarButton.findNext::before {\n  content: url(images/findbarButton-next-rtl.png);\n}\n\nhtml[dir='ltr'] .toolbarButton.pageUp::before {\n  content: url(images/toolbarButton-pageUp.png);\n}\nhtml[dir='rtl'] .toolbarButton.pageUp::before {\n  content: url(images/toolbarButton-pageUp-rtl.png);\n}\n\nhtml[dir='ltr'] .toolbarButton.pageDown::before {\n  content: url(images/toolbarButton-pageDown.png);\n}\nhtml[dir='rtl'] .toolbarButton.pageDown::before {\n  content: url(images/toolbarButton-pageDown-rtl.png);\n}\n\n.toolbarButton.zoomOut::before {\n  content: url(images/toolbarButton-zoomOut.png);\n}\n\n.toolbarButton.zoomIn::before {\n  content: url(images/toolbarButton-zoomIn.png);\n}\n\n.toolbarButton.presentationMode::before,\n.secondaryToolbarButton.presentationMode::before {\n  content: url(images/toolbarButton-presentationMode.png);\n}\n\n.toolbarButton.print::before,\n.secondaryToolbarButton.print::before {\n  content: url(images/toolbarButton-print.png);\n}\n\n.toolbarButton.openFile::before,\n.secondaryToolbarButton.openFile::before {\n  content: url(images/toolbarButton-openFile.png);\n}\n\n.toolbarButton.download::before,\n.secondaryToolbarButton.download::before {\n  content: url(images/toolbarButton-download.png);\n}\n\n.toolbarButton.bookmark,\n.secondaryToolbarButton.bookmark {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  outline: none;\n  padding-top: 4px;\n  text-decoration: none;\n}\n.secondaryToolbarButton.bookmark {\n  padding-top: 5px;\n}\n\n.bookmark[href='#'] {\n  opacity: .5;\n  pointer-events: none;\n}\n\n.toolbarButton.bookmark::before,\n.secondaryToolbarButton.bookmark::before {\n  content: url(images/toolbarButton-bookmark.png);\n}\n\n#viewThumbnail.toolbarButton::before {\n  content: url(images/toolbarButton-viewThumbnail.png);\n}\n\nhtml[dir=\"ltr\"] #viewOutline.toolbarButton::before {\n  content: url(images/toolbarButton-viewOutline.png);\n}\nhtml[dir=\"rtl\"] #viewOutline.toolbarButton::before {\n  content: url(images/toolbarButton-viewOutline-rtl.png);\n}\n\n#viewAttachments.toolbarButton::before {\n  content: url(images/toolbarButton-viewAttachments.png);\n}\n\n#viewFind.toolbarButton::before {\n  content: url(images/toolbarButton-search.png);\n}\n\n.secondaryToolbarButton {\n  position: relative;\n  margin: 0 0 4px 0;\n  padding: 3px 0 1px 0;\n  height: auto;\n  min-height: 25px;\n  width: auto;\n  min-width: 100%;\n  white-space: normal;\n}\nhtml[dir=\"ltr\"] .secondaryToolbarButton {\n  padding-left: 24px;\n  text-align: left;\n}\nhtml[dir=\"rtl\"] .secondaryToolbarButton {\n  padding-right: 24px;\n  text-align: right;\n}\nhtml[dir=\"ltr\"] .secondaryToolbarButton.bookmark {\n  padding-left: 27px;\n}\nhtml[dir=\"rtl\"] .secondaryToolbarButton.bookmark {\n  padding-right: 27px;\n}\n\nhtml[dir=\"ltr\"] .secondaryToolbarButton > span {\n  padding-right: 4px;\n}\nhtml[dir=\"rtl\"] .secondaryToolbarButton > span {\n  padding-left: 4px;\n}\n\n.secondaryToolbarButton.firstPage::before {\n  content: url(images/secondaryToolbarButton-firstPage.png);\n}\n\n.secondaryToolbarButton.lastPage::before {\n  content: url(images/secondaryToolbarButton-lastPage.png);\n}\n\n.secondaryToolbarButton.rotateCcw::before {\n  content: url(images/secondaryToolbarButton-rotateCcw.png);\n}\n\n.secondaryToolbarButton.rotateCw::before {\n  content: url(images/secondaryToolbarButton-rotateCw.png);\n}\n\n.secondaryToolbarButton.handTool::before {\n  content: url(images/secondaryToolbarButton-handTool.png);\n}\n\n.secondaryToolbarButton.documentProperties::before {\n  content: url(images/secondaryToolbarButton-documentProperties.png);\n}\n\n.verticalToolbarSeparator {\n  display: block;\n  padding: 8px 0;\n  margin: 8px 4px;\n  width: 1px;\n  background-color: hsla(0,0%,0%,.5);\n  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);\n}\nhtml[dir='ltr'] .verticalToolbarSeparator {\n  margin-left: 2px;\n}\nhtml[dir='rtl'] .verticalToolbarSeparator {\n  margin-right: 2px;\n}\n\n.horizontalToolbarSeparator {\n  display: block;\n  margin: 0 0 4px 0;\n  height: 1px;\n  width: 100%;\n  background-color: hsla(0,0%,0%,.5);\n  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);\n}\n\n.toolbarField {\n  padding: 3px 6px;\n  margin: 4px 0 4px 0;\n  border: 1px solid transparent;\n  border-radius: 2px;\n  background-color: hsla(0,0%,100%,.09);\n  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));\n  background-clip: padding-box;\n  border: 1px solid hsla(0,0%,0%,.35);\n  border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);\n  box-shadow: 0 1px 0 hsla(0,0%,0%,.05) inset,\n              0 1px 0 hsla(0,0%,100%,.05);\n  color: hsl(0,0%,95%);\n  font-size: 12px;\n  line-height: 14px;\n  outline-style: none;\n  transition-property: background-color, border-color, box-shadow;\n  transition-duration: 150ms;\n  transition-timing-function: ease;\n}\n\n.toolbarField[type=checkbox] {\n  display: inline-block;\n  margin: 8px 0px;\n}\n\n.toolbarField.pageNumber {\n  -moz-appearance: textfield; /* hides the spinner in moz */\n  min-width: 16px;\n  text-align: right;\n  width: 40px;\n}\n\n.toolbarField.pageNumber.visiblePageIsLoading {\n  background-image: url(images/loading-small.png);\n  background-repeat: no-repeat;\n  background-position: 1px;\n}\n\n.toolbarField.pageNumber::-webkit-inner-spin-button,\n.toolbarField.pageNumber::-webkit-outer-spin-button {\n    -webkit-appearance: none;\n    margin: 0;\n}\n\n.toolbarField:hover {\n  background-color: hsla(0,0%,100%,.11);\n  border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.43) hsla(0,0%,0%,.45);\n}\n\n.toolbarField:focus {\n  background-color: hsla(0,0%,100%,.15);\n  border-color: hsla(204,100%,65%,.8) hsla(204,100%,65%,.85) hsla(204,100%,65%,.9);\n}\n\n.toolbarLabel {\n  min-width: 16px;\n  padding: 3px 6px 3px 2px;\n  margin: 4px 2px 4px 0;\n  border: 1px solid transparent;\n  border-radius: 2px;\n  color: hsl(0,0%,85%);\n  font-size: 12px;\n  line-height: 14px;\n  text-align: left;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  cursor: default;\n}\n\n#thumbnailView {\n  position: absolute;\n  width: 120px;\n  top: 0;\n  bottom: 0;\n  padding: 10px 40px 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n.thumbnail {\n  float: left;\n  margin-bottom: 5px;\n}\n\n#thumbnailView > a:last-of-type > .thumbnail {\n  margin-bottom: 10px;\n}\n\n#thumbnailView > a:last-of-type > .thumbnail:not([data-loaded]) {\n  margin-bottom: 9px;\n}\n\n.thumbnail:not([data-loaded]) {\n  border: 1px dashed rgba(255, 255, 255, 0.5);\n  margin: -1px -1px 4px -1px;\n}\n\n.thumbnailImage {\n  border: 1px solid transparent;\n  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3);\n  opacity: 0.8;\n  z-index: 99;\n  background-color: white;\n  background-clip: content-box;\n}\n\n.thumbnailSelectionRing {\n  border-radius: 2px;\n  padding: 7px;\n}\n\na:focus > .thumbnail > .thumbnailSelectionRing > .thumbnailImage,\n.thumbnail:hover > .thumbnailSelectionRing > .thumbnailImage {\n  opacity: .9;\n}\n\na:focus > .thumbnail > .thumbnailSelectionRing,\n.thumbnail:hover > .thumbnailSelectionRing {\n  background-color: hsla(0,0%,100%,.15);\n  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));\n  background-clip: padding-box;\n  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,\n              0 0 1px hsla(0,0%,100%,.2) inset,\n              0 0 1px hsla(0,0%,0%,.2);\n  color: hsla(0,0%,100%,.9);\n}\n\n.thumbnail.selected > .thumbnailSelectionRing > .thumbnailImage {\n  box-shadow: 0 0 0 1px hsla(0,0%,0%,.5);\n  opacity: 1;\n}\n\n.thumbnail.selected > .thumbnailSelectionRing {\n  background-color: hsla(0,0%,100%,.3);\n  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));\n  background-clip: padding-box;\n  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,\n              0 0 1px hsla(0,0%,100%,.1) inset,\n              0 0 1px hsla(0,0%,0%,.2);\n  color: hsla(0,0%,100%,1);\n}\n\n#outlineView,\n#attachmentsView {\n  position: absolute;\n  width: 192px;\n  top: 0;\n  bottom: 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n}\n\n#outlineView {\n  padding: 4px 4px 0;\n}\n#attachmentsView {\n  padding: 3px 4px 0;\n}\n\nhtml[dir='ltr'] .outlineItem > .outlineItems {\n  margin-left: 20px;\n}\n\nhtml[dir='rtl'] .outlineItem > .outlineItems {\n  margin-right: 20px;\n}\n\n.outlineItem > a,\n.attachmentsItem > button {\n  text-decoration: none;\n  display: inline-block;\n  min-width: 95%;\n  height: auto;\n  margin-bottom: 1px;\n  border-radius: 2px;\n  color: hsla(0,0%,100%,.8);\n  font-size: 13px;\n  line-height: 15px;\n  -moz-user-select: none;\n  white-space: normal;\n}\n\n.attachmentsItem > button {\n  border: 0 none;\n  background: none;\n  cursor: pointer;\n  width: 100%;\n}\n\nhtml[dir='ltr'] .outlineItem > a {\n  padding: 2px 0 5px 10px;\n}\nhtml[dir='ltr'] .attachmentsItem > button {\n  padding: 2px 0 3px 7px;\n  text-align: left;\n}\n\nhtml[dir='rtl'] .outlineItem > a {\n  padding: 2px 10px 5px 0;\n}\nhtml[dir='rtl'] .attachmentsItem > button {\n  padding: 2px 7px 3px 0;\n  text-align: right;\n}\n\n.outlineItem > a:hover,\n.attachmentsItem > button:hover {\n  background-color: hsla(0,0%,100%,.02);\n  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));\n  background-clip: padding-box;\n  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,\n              0 0 1px hsla(0,0%,100%,.2) inset,\n              0 0 1px hsla(0,0%,0%,.2);\n  color: hsla(0,0%,100%,.9);\n}\n\n.outlineItem.selected {\n  background-color: hsla(0,0%,100%,.08);\n  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));\n  background-clip: padding-box;\n  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,\n              0 0 1px hsla(0,0%,100%,.1) inset,\n              0 0 1px hsla(0,0%,0%,.2);\n  color: hsla(0,0%,100%,1);\n}\n\n.noResults {\n  font-size: 12px;\n  color: hsla(0,0%,100%,.8);\n  font-style: italic;\n  cursor: default;\n}\n\n/* TODO: file FF bug to support ::-moz-selection:window-inactive\n   so we can override the opaque grey background when the window is inactive;\n   see https://bugzilla.mozilla.org/show_bug.cgi?id=706209 */\n::selection { background: rgba(0,0,255,0.3); }\n::-moz-selection { background: rgba(0,0,255,0.3); }\n\n#errorWrapper {\n  background: none repeat scroll 0 0 #FF5555;\n  color: white;\n  left: 0;\n  position: absolute;\n  right: 0;\n  z-index: 1000;\n  padding: 3px;\n  font-size: 0.8em;\n}\n.loadingInProgress #errorWrapper {\n  top: 37px;\n}\n\n#errorMessageLeft {\n  float: left;\n}\n\n#errorMessageRight {\n  float: right;\n}\n\n#errorMoreInfo {\n  background-color: #FFFFFF;\n  color: black;\n  padding: 3px;\n  margin: 3px;\n  width: 98%;\n}\n\n.overlayButton {\n  width: auto;\n  margin: 3px 4px 2px 4px !important;\n  padding: 2px 6px 3px 6px;\n}\n\n#overlayContainer {\n  display: table;\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  background-color: hsla(0,0%,0%,.2);\n  z-index: 40000;\n}\n#overlayContainer > * {\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n#overlayContainer > .container {\n  display: table-cell;\n  vertical-align: middle;\n  text-align: center;\n}\n\n#overlayContainer > .container > .dialog {\n  display: inline-block;\n  padding: 15px;\n  border-spacing: 4px;\n  color: hsl(0,0%,85%);\n  font-size: 12px;\n  line-height: 14px;\n  background-color: #474747; /* fallback */\n  background-image: url(images/texture.png),\n                    linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95));\n  box-shadow: inset 1px 0 0 hsla(0,0%,100%,.08),\n              inset 0 1px 1px hsla(0,0%,0%,.15),\n              inset 0 -1px 0 hsla(0,0%,100%,.05),\n              0 1px 0 hsla(0,0%,0%,.15),\n              0 1px 1px hsla(0,0%,0%,.1);\n  border: 1px solid hsla(0,0%,0%,.5);\n  border-radius: 4px;\n  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);\n}\n\n.dialog > .row {\n  display: table-row;\n}\n\n.dialog > .row > * {\n  display: table-cell;\n}\n\n.dialog .toolbarField {\n  margin: 5px 0;\n}\n\n.dialog .separator {\n  display: block;\n  margin: 4px 0 4px 0;\n  height: 1px;\n  width: 100%;\n  background-color: hsla(0,0%,0%,.5);\n  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);\n}\n\n.dialog .buttonRow {\n  text-align: center;\n  vertical-align: middle;\n}\n\n#passwordOverlay > .dialog {\n  text-align: center;\n}\n#passwordOverlay .toolbarField {\n  width: 200px;\n}\n\n#documentPropertiesOverlay > .dialog {\n  text-align: left;\n}\n#documentPropertiesOverlay .row > * {\n  min-width: 100px;\n}\nhtml[dir='ltr'] #documentPropertiesOverlay .row > * {\n  text-align: left;\n}\nhtml[dir='rtl'] #documentPropertiesOverlay .row > * {\n  text-align: right;\n}\n#documentPropertiesOverlay .row > span {\n  width: 125px;\n  word-wrap: break-word;\n}\n#documentPropertiesOverlay .row > p {\n  max-width: 225px;\n  word-wrap: break-word;\n}\n#documentPropertiesOverlay .buttonRow {\n  margin-top: 10px;\n}\n\n.clearBoth {\n  clear: both;\n}\n\n.fileInput {\n  background: white;\n  color: black;\n  margin-top: 5px;\n  visibility: hidden;\n  position: fixed;\n  right: 0;\n  top: 0;\n}\n\n#PDFBug {\n  background: none repeat scroll 0 0 white;\n  border: 1px solid #666666;\n  position: fixed;\n  top: 32px;\n  right: 0;\n  bottom: 0;\n  font-size: 10px;\n  padding: 0;\n  width: 300px;\n}\n#PDFBug .controls {\n    background:#EEEEEE;\n    border-bottom: 1px solid #666666;\n    padding: 3px;\n}\n#PDFBug .panels {\n  bottom: 0;\n  left: 0;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  position: absolute;\n  right: 0;\n  top: 27px;\n}\n#PDFBug button.active {\n  font-weight: bold;\n}\n.debuggerShowText {\n  background: none repeat scroll 0 0 yellow;\n  color: blue;\n}\n.debuggerHideText:hover {\n  background: none repeat scroll 0 0 yellow;\n}\n#PDFBug .stats {\n  font-family: courier;\n  font-size: 10px;\n  white-space: pre;\n}\n#PDFBug .stats .title {\n    font-weight: bold;\n}\n#PDFBug table {\n  font-size: 10px;\n}\n\n#viewer.textLayer-visible .textLayer > div,\n#viewer.textLayer-hover .textLayer > div:hover {\n  background-color: white;\n  color: black;\n}\n\n#viewer.textLayer-shadow .textLayer > div {\n  background-color: rgba(255,255,255, .6);\n  color: black;\n}\n\n.grab-to-pan-grab {\n  cursor: url(\"images/grab.cur\"), move !important;\n  cursor: -webkit-grab !important;\n  cursor: -moz-grab !important;\n  cursor: grab !important;\n}\n.grab-to-pan-grab *:not(input):not(textarea):not(button):not(select):not(:link) {\n  cursor: inherit !important;\n}\n.grab-to-pan-grab:active,\n.grab-to-pan-grabbing {\n  cursor: url(\"images/grabbing.cur\"), move !important;\n  cursor: -webkit-grabbing !important;\n  cursor: -moz-grabbing !important;\n  cursor: grabbing !important;\n\n  position: fixed;\n  background: transparent;\n  display: block;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  overflow: hidden;\n  z-index: 50000; /* should be higher than anything else in PDF.js! */\n}\n\n@page {\n  margin: 0;\n}\n\n#printContainer {\n  display: none;\n}\n\n@media screen and (min-resolution: 2dppx) {\n  /* Rules for Retina screens */\n  .toolbarButton::before {\n    -webkit-transform: scale(0.5);\n    transform: scale(0.5);\n    top: -5px;\n  }\n\n  .secondaryToolbarButton::before {\n    -webkit-transform: scale(0.5);\n    transform: scale(0.5);\n    top: -4px;\n  }\n\n  html[dir='ltr'] .toolbarButton::before,\n  html[dir='rtl'] .toolbarButton::before {\n    left: -1px;\n  }\n\n  html[dir='ltr'] .secondaryToolbarButton::before {\n    left: -2px;\n  }\n  html[dir='rtl'] .secondaryToolbarButton::before {\n    left: 186px;\n  }\n\n  .toolbarField.pageNumber.visiblePageIsLoading,\n  #findInput[data-status=\"pending\"] {\n    background-image: url(images/loading-small@2x.png);\n    background-size: 16px 17px;\n  }\n\n  .dropdownToolbarButton {\n    background: url(images/toolbarButton-menuArrows@2x.png) no-repeat;\n    background-size: 7px 16px;\n  }\n\n  html[dir='ltr'] .toolbarButton#sidebarToggle::before {\n    content: url(images/toolbarButton-sidebarToggle@2x.png);\n  }\n  html[dir='rtl'] .toolbarButton#sidebarToggle::before {\n    content: url(images/toolbarButton-sidebarToggle-rtl@2x.png);\n  }\n\n  html[dir='ltr'] .toolbarButton#secondaryToolbarToggle::before {\n    content: url(images/toolbarButton-secondaryToolbarToggle@2x.png);\n  }\n  html[dir='rtl'] .toolbarButton#secondaryToolbarToggle::before {\n    content: url(images/toolbarButton-secondaryToolbarToggle-rtl@2x.png);\n  }\n\n  html[dir='ltr'] .toolbarButton.findPrevious::before {\n    content: url(images/findbarButton-previous@2x.png);\n  }\n  html[dir='rtl'] .toolbarButton.findPrevious::before {\n    content: url(images/findbarButton-previous-rtl@2x.png);\n  }\n\n  html[dir='ltr'] .toolbarButton.findNext::before {\n    content: url(images/findbarButton-next@2x.png);\n  }\n  html[dir='rtl'] .toolbarButton.findNext::before {\n    content: url(images/findbarButton-next-rtl@2x.png);\n  }\n\n  html[dir='ltr'] .toolbarButton.pageUp::before {\n    content: url(images/toolbarButton-pageUp@2x.png);\n  }\n  html[dir='rtl'] .toolbarButton.pageUp::before {\n    content: url(images/toolbarButton-pageUp-rtl@2x.png);\n  }\n\n  html[dir='ltr'] .toolbarButton.pageDown::before {\n    content: url(images/toolbarButton-pageDown@2x.png);\n  }\n  html[dir='rtl'] .toolbarButton.pageDown::before {\n    content: url(images/toolbarButton-pageDown-rtl@2x.png);\n  }\n\n  .toolbarButton.zoomIn::before {\n    content: url(images/toolbarButton-zoomIn@2x.png);\n  }\n\n  .toolbarButton.zoomOut::before {\n    content: url(images/toolbarButton-zoomOut@2x.png);\n  }\n\n  .toolbarButton.presentationMode::before,\n  .secondaryToolbarButton.presentationMode::before {\n    content: url(images/toolbarButton-presentationMode@2x.png);\n  }\n\n  .toolbarButton.print::before,\n  .secondaryToolbarButton.print::before {\n    content: url(images/toolbarButton-print@2x.png);\n  }\n\n  .toolbarButton.openFile::before,\n  .secondaryToolbarButton.openFile::before {\n    content: url(images/toolbarButton-openFile@2x.png);\n  }\n\n  .toolbarButton.download::before,\n  .secondaryToolbarButton.download::before {\n    content: url(images/toolbarButton-download@2x.png);\n  }\n\n  .toolbarButton.bookmark::before,\n  .secondaryToolbarButton.bookmark::before {\n    content: url(images/toolbarButton-bookmark@2x.png);\n  }\n\n  #viewThumbnail.toolbarButton::before {\n    content: url(images/toolbarButton-viewThumbnail@2x.png);\n  }\n\n  html[dir=\"ltr\"] #viewOutline.toolbarButton::before {\n    content: url(images/toolbarButton-viewOutline@2x.png);\n  }\n  html[dir=\"rtl\"] #viewOutline.toolbarButton::before {\n    content: url(images/toolbarButton-viewOutline-rtl@2x.png);\n  }\n\n  #viewAttachments.toolbarButton::before {\n    content: url(images/toolbarButton-viewAttachments@2x.png);\n  }\n\n  #viewFind.toolbarButton::before {\n    content: url(images/toolbarButton-search@2x.png);\n  }\n\n  .secondaryToolbarButton.firstPage::before {\n    content: url(images/secondaryToolbarButton-firstPage@2x.png);\n  }\n\n  .secondaryToolbarButton.lastPage::before {\n    content: url(images/secondaryToolbarButton-lastPage@2x.png);\n  }\n\n  .secondaryToolbarButton.rotateCcw::before {\n    content: url(images/secondaryToolbarButton-rotateCcw@2x.png);\n  }\n\n  .secondaryToolbarButton.rotateCw::before {\n    content: url(images/secondaryToolbarButton-rotateCw@2x.png);\n  }\n\n  .secondaryToolbarButton.handTool::before {\n    content: url(images/secondaryToolbarButton-handTool@2x.png);\n  }\n\n  .secondaryToolbarButton.documentProperties::before {\n    content: url(images/secondaryToolbarButton-documentProperties@2x.png);\n  }\n}\n\n@media print {\n  /* General rules for printing. */\n  body {\n    background: transparent none;\n  }\n\n  /* Rules for browsers that don't support mozPrintCallback. */\n  #sidebarContainer, #secondaryToolbar, .toolbar, #loadingBox, #errorWrapper, .textLayer {\n    display: none;\n  }\n  #viewerContainer {\n    overflow: visible;\n  }\n\n  #mainContainer, #viewerContainer, .page, .page canvas {\n    position: static;\n    padding: 0;\n    margin: 0;\n  }\n\n  .page {\n    float: left;\n    display: none;\n    border: none;\n    box-shadow: none;\n    background-clip: content-box;\n    background-color: white;\n  }\n\n  .page[data-loaded] {\n    display: block;\n  }\n\n  .fileInput {\n    display: none;\n  }\n\n  /* Rules for browsers that support mozPrintCallback */\n  body[data-mozPrintCallback] #outerContainer {\n    display: none;\n  }\n  body[data-mozPrintCallback] #printContainer {\n    display: block;\n  }\n  /* wrapper around (scaled) print canvas elements */\n  #printContainer > div {\n    position: relative;\n    top: 0;\n    left: 0;\n    overflow: hidden;\n  }\n  #printContainer canvas {\n    display: block;\n  }\n}\n\n.visibleLargeView,\n.visibleMediumView,\n.visibleSmallView {\n  display: none;\n}\n\n@media all and (max-width: 960px) {\n  html[dir='ltr'] #outerContainer.sidebarMoving .outerCenter,\n  html[dir='ltr'] #outerContainer.sidebarOpen .outerCenter {\n    float: left;\n    left: 205px;\n  }\n  html[dir='rtl'] #outerContainer.sidebarMoving .outerCenter,\n  html[dir='rtl'] #outerContainer.sidebarOpen .outerCenter {\n    float: right;\n    right: 205px;\n  }\n}\n\n@media all and (max-width: 900px) {\n  .sidebarOpen .hiddenLargeView {\n    display: none;\n  }\n  .sidebarOpen .visibleLargeView {\n    display: inherit;\n  }\n}\n\n@media all and (max-width: 860px) {\n  .sidebarOpen .hiddenMediumView {\n    display: none;\n  }\n  .sidebarOpen .visibleMediumView {\n    display: inherit;\n  }\n}\n\n@media all and (max-width: 770px) {\n  #sidebarContainer {\n    top: 32px;\n    z-index: 100;\n  }\n  .loadingInProgress #sidebarContainer {\n    top: 37px;\n  }\n  #sidebarContent {\n    top: 32px;\n    background-color: hsla(0,0%,0%,.7);\n  }\n\n  html[dir='ltr'] #outerContainer.sidebarOpen > #mainContainer {\n    left: 0px;\n  }\n  html[dir='rtl'] #outerContainer.sidebarOpen > #mainContainer {\n    right: 0px;\n  }\n\n  html[dir='ltr'] .outerCenter {\n    float: left;\n    left: 205px;\n  }\n  html[dir='rtl'] .outerCenter {\n    float: right;\n    right: 205px;\n  }\n\n  #outerContainer .hiddenLargeView,\n  #outerContainer .hiddenMediumView {\n    display: inherit;\n  }\n  #outerContainer .visibleLargeView,\n  #outerContainer .visibleMediumView {\n    display: none;\n  }\n}\n\n@media all and (max-width: 700px) {\n  #outerContainer .hiddenLargeView {\n    display: none;\n  }\n  #outerContainer .visibleLargeView {\n    display: inherit;\n  }\n}\n\n@media all and (max-width: 660px) {\n  #outerContainer .hiddenMediumView {\n    display: none;\n  }\n  #outerContainer .visibleMediumView {\n    display: inherit;\n  }\n}\n\n@media all and (max-width: 600px) {\n  .hiddenSmallView {\n    display: none;\n  }\n  .visibleSmallView {\n    display: inherit;\n  }\n  html[dir='ltr'] #outerContainer.sidebarMoving .outerCenter,\n  html[dir='ltr'] #outerContainer.sidebarOpen .outerCenter,\n  html[dir='ltr'] .outerCenter {\n    left: 156px;\n  }\n  html[dir='rtl'] #outerContainer.sidebarMoving .outerCenter,\n  html[dir='rtl'] #outerContainer.sidebarOpen .outerCenter,\n  html[dir='rtl'] .outerCenter {\n    right: 156px;\n  }\n  .toolbarButtonSpacer {\n    width: 0;\n  }\n}\n\n@media all and (max-width: 510px) {\n  #scaleSelectContainer, #pageNumberLabel {\n    display: none;\n  }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/static/generic/web/viewer.html",
    "content": "﻿<!DOCTYPE html>\n<!--\nCopyright 2012 Mozilla Foundation\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\nAdobe CMap resources are covered by their own copyright and license:\nhttp://sourceforge.net/adobe/cmap/wiki/License/\n-->\n<html dir=\"ltr\" mozdisallowselectionprint moznomarginboxes>\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">\n    <meta name=\"google\" content=\"notranslate\">\n    <title>PDF预览</title>\n\n\n    <link rel=\"stylesheet\" href=\"viewer.css\"/>\n\n    <script src=\"compatibility.js\"></script>\n\n\n\n<!-- This snippet is used in production (included from viewer.html) -->\n<link rel=\"resource\" type=\"application/l10n\" href=\"locale/locale.properties\"/>\n<script src=\"l10n.js\"></script>\n<script src=\"../build/pdf.js\"></script>\n\n\n\n    <script src=\"debugger.js\"></script>\n    <script src=\"viewer.js\"></script>\n\n  </head>\n\n  <body tabindex=\"1\" class=\"loadingInProgress\">\n    <div id=\"outerContainer\">\n\n      <div id=\"sidebarContainer\">\n        <div id=\"toolbarSidebar\">\n          <div class=\"splitToolbarButton toggled\">\n            <button id=\"viewThumbnail\" class=\"toolbarButton group toggled\" title=\"Show Thumbnails\" tabindex=\"2\" data-l10n-id=\"thumbs\">\n               <span data-l10n-id=\"thumbs_label\">Thumbnails</span>\n            </button>\n            <button id=\"viewOutline\" class=\"toolbarButton group\" title=\"Show Document Outline\" tabindex=\"3\" data-l10n-id=\"outline\">\n               <span data-l10n-id=\"outline_label\">Document Outline</span>\n            </button>\n            <button id=\"viewAttachments\" class=\"toolbarButton group\" title=\"Show Attachments\" tabindex=\"4\" data-l10n-id=\"attachments\">\n               <span data-l10n-id=\"attachments_label\">Attachments</span>\n            </button>\n          </div>\n        </div>\n        <div id=\"sidebarContent\">\n          <div id=\"thumbnailView\">\n          </div>\n          <div id=\"outlineView\" class=\"hidden\">\n          </div>\n          <div id=\"attachmentsView\" class=\"hidden\">\n          </div>\n        </div>\n      </div>  <!-- sidebarContainer -->\n\n      <div id=\"mainContainer\">\n        <div class=\"findbar hidden doorHanger hiddenSmallView\" id=\"findbar\">\n          <label for=\"findInput\" class=\"toolbarLabel\" data-l10n-id=\"find_label\">Find:</label>\n          <input id=\"findInput\" class=\"toolbarField\" tabindex=\"91\">\n          <div class=\"splitToolbarButton\">\n            <button class=\"toolbarButton findPrevious\" title=\"\" id=\"findPrevious\" tabindex=\"92\" data-l10n-id=\"find_previous\">\n              <span data-l10n-id=\"find_previous_label\">Previous</span>\n            </button>\n            <div class=\"splitToolbarButtonSeparator\"></div>\n            <button class=\"toolbarButton findNext\" title=\"\" id=\"findNext\" tabindex=\"93\" data-l10n-id=\"find_next\">\n              <span data-l10n-id=\"find_next_label\">Next</span>\n            </button>\n          </div>\n          <input type=\"checkbox\" id=\"findHighlightAll\" class=\"toolbarField\">\n          <label for=\"findHighlightAll\" class=\"toolbarLabel\" tabindex=\"94\" data-l10n-id=\"find_highlight\">Highlight all</label>\n          <input type=\"checkbox\" id=\"findMatchCase\" class=\"toolbarField\">\n          <label for=\"findMatchCase\" class=\"toolbarLabel\" tabindex=\"95\" data-l10n-id=\"find_match_case_label\">Match case</label>\n          <span id=\"findMsg\" class=\"toolbarLabel\"></span>\n        </div>  <!-- findbar -->\n\n        <div id=\"secondaryToolbar\" class=\"secondaryToolbar hidden doorHangerRight\">\n          <div id=\"secondaryToolbarButtonContainer\">\n            <button id=\"secondaryPresentationMode\" class=\"secondaryToolbarButton presentationMode visibleLargeView\" title=\"Switch to Presentation Mode\" tabindex=\"51\" data-l10n-id=\"presentation_mode\">\n              <span data-l10n-id=\"presentation_mode_label\">Presentation Mode</span>\n            </button>\n\n            <button id=\"secondaryOpenFile\" class=\"secondaryToolbarButton openFile visibleLargeView\" title=\"Open File\" tabindex=\"52\" data-l10n-id=\"open_file\">\n              <span data-l10n-id=\"open_file_label\">Open</span>\n            </button>\n\n            <button id=\"secondaryPrint\" class=\"secondaryToolbarButton print visibleMediumView\" title=\"Print\" tabindex=\"53\" data-l10n-id=\"print\">\n              <span data-l10n-id=\"print_label\">Print</span>\n            </button>\n\n            <button id=\"secondaryDownload\" class=\"secondaryToolbarButton download visibleMediumView\" title=\"Download\" tabindex=\"54\" data-l10n-id=\"download\">\n              <span data-l10n-id=\"download_label\">Download</span>\n            </button>\n\n            <a href=\"#\" id=\"secondaryViewBookmark\" class=\"secondaryToolbarButton bookmark visibleSmallView\" title=\"Current view (copy or open in new window)\" tabindex=\"55\" data-l10n-id=\"bookmark\">\n              <span data-l10n-id=\"bookmark_label\">Current View</span>\n            </a>\n\n            <div class=\"horizontalToolbarSeparator visibleLargeView\"></div>\n\n            <button id=\"firstPage\" class=\"secondaryToolbarButton firstPage\" title=\"Go to First Page\" tabindex=\"56\" data-l10n-id=\"first_page\">\n              <span data-l10n-id=\"first_page_label\">Go to First Page</span>\n            </button>\n            <button id=\"lastPage\" class=\"secondaryToolbarButton lastPage\" title=\"Go to Last Page\" tabindex=\"57\" data-l10n-id=\"last_page\">\n              <span data-l10n-id=\"last_page_label\">Go to Last Page</span>\n            </button>\n\n            <div class=\"horizontalToolbarSeparator\"></div>\n\n            <button id=\"pageRotateCw\" class=\"secondaryToolbarButton rotateCw\" title=\"Rotate Clockwise\" tabindex=\"58\" data-l10n-id=\"page_rotate_cw\">\n              <span data-l10n-id=\"page_rotate_cw_label\">Rotate Clockwise</span>\n            </button>\n            <button id=\"pageRotateCcw\" class=\"secondaryToolbarButton rotateCcw\" title=\"Rotate Counterclockwise\" tabindex=\"59\" data-l10n-id=\"page_rotate_ccw\">\n              <span data-l10n-id=\"page_rotate_ccw_label\">Rotate Counterclockwise</span>\n            </button>\n\n            <div class=\"horizontalToolbarSeparator\"></div>\n\n            <button id=\"toggleHandTool\" class=\"secondaryToolbarButton handTool\" title=\"Enable hand tool\" tabindex=\"60\" data-l10n-id=\"hand_tool_enable\">\n              <span data-l10n-id=\"hand_tool_enable_label\">Enable hand tool</span>\n            </button>\n\n            <div class=\"horizontalToolbarSeparator\"></div>\n\n            <button id=\"documentProperties\" class=\"secondaryToolbarButton documentProperties\" title=\"Document Properties…\" tabindex=\"61\" data-l10n-id=\"document_properties\">\n              <span data-l10n-id=\"document_properties_label\">Document Properties…</span>\n            </button>\n          </div>\n        </div>  <!-- secondaryToolbar -->\n\n        <div class=\"toolbar\">\n          <div id=\"toolbarContainer\">\n            <div id=\"toolbarViewer\">\n              <div id=\"toolbarViewerLeft\">\n                <button id=\"sidebarToggle\" class=\"toolbarButton\" title=\"Toggle Sidebar\" tabindex=\"11\" data-l10n-id=\"toggle_sidebar\">\n                  <span data-l10n-id=\"toggle_sidebar_label\">Toggle Sidebar</span>\n                </button>\n                <div class=\"toolbarButtonSpacer\"></div>\n                <button id=\"viewFind\" class=\"toolbarButton group hiddenSmallView\" title=\"Find in Document\" tabindex=\"12\" data-l10n-id=\"findbar\">\n                   <span data-l10n-id=\"findbar_label\">Find</span>\n                </button>\n                <div class=\"splitToolbarButton\">\n                  <button class=\"toolbarButton pageUp\" title=\"Previous Page\" id=\"previous\" tabindex=\"13\" data-l10n-id=\"previous\">\n                    <span data-l10n-id=\"previous_label\">Previous</span>\n                  </button>\n                  <div class=\"splitToolbarButtonSeparator\"></div>\n                  <button class=\"toolbarButton pageDown\" title=\"Next Page\" id=\"next\" tabindex=\"14\" data-l10n-id=\"next\">\n                    <span data-l10n-id=\"next_label\">Next</span>\n                  </button>\n                </div>\n                <label id=\"pageNumberLabel\" class=\"toolbarLabel\" for=\"pageNumber\" data-l10n-id=\"page_label\">Page: </label>\n                <input type=\"number\" id=\"pageNumber\" class=\"toolbarField pageNumber\" value=\"1\" size=\"4\" min=\"1\" tabindex=\"15\">\n                <span id=\"numPages\" class=\"toolbarLabel\"></span>\n              </div>\n              <div id=\"toolbarViewerRight\">\n                <button id=\"presentationMode\" class=\"toolbarButton presentationMode hiddenLargeView\" title=\"Switch to Presentation Mode\" tabindex=\"31\" data-l10n-id=\"presentation_mode\">\n                  <span data-l10n-id=\"presentation_mode_label\">Presentation Mode</span>\n                </button>\n\n                <button id=\"openFile\" class=\"toolbarButton openFile hiddenLargeView\" title=\"Open File\" tabindex=\"32\" data-l10n-id=\"open_file\">\n                  <span data-l10n-id=\"open_file_label\">Open</span>\n                </button>\n\n                <button id=\"print\" class=\"toolbarButton print hiddenMediumView\" title=\"Print\" tabindex=\"33\" data-l10n-id=\"print\">\n                  <span data-l10n-id=\"print_label\">Print</span>\n                </button>\n\n                <button id=\"download\" class=\"toolbarButton download hiddenMediumView\" title=\"Download\" tabindex=\"34\" data-l10n-id=\"download\">\n                  <span data-l10n-id=\"download_label\">Download</span>\n                </button>\n                <a href=\"#\" id=\"viewBookmark\" class=\"toolbarButton bookmark hiddenSmallView\" title=\"Current view (copy or open in new window)\" tabindex=\"35\" data-l10n-id=\"bookmark\">\n                  <span data-l10n-id=\"bookmark_label\">Current View</span>\n                </a>\n\n                <div class=\"verticalToolbarSeparator hiddenSmallView\"></div>\n\n                <button id=\"secondaryToolbarToggle\" class=\"toolbarButton\" title=\"Tools\" tabindex=\"36\" data-l10n-id=\"tools\">\n                  <span data-l10n-id=\"tools_label\">Tools</span>\n                </button>\n              </div>\n              <div class=\"outerCenter\">\n                <div class=\"innerCenter\" id=\"toolbarViewerMiddle\">\n                  <div class=\"splitToolbarButton\">\n                    <button id=\"zoomOut\" class=\"toolbarButton zoomOut\" title=\"Zoom Out\" tabindex=\"21\" data-l10n-id=\"zoom_out\">\n                      <span data-l10n-id=\"zoom_out_label\">Zoom Out</span>\n                    </button>\n                    <div class=\"splitToolbarButtonSeparator\"></div>\n                    <button id=\"zoomIn\" class=\"toolbarButton zoomIn\" title=\"Zoom In\" tabindex=\"22\" data-l10n-id=\"zoom_in\">\n                      <span data-l10n-id=\"zoom_in_label\">Zoom In</span>\n                     </button>\n                  </div>\n                  <span id=\"scaleSelectContainer\" class=\"dropdownToolbarButton\">\n                     <select id=\"scaleSelect\" title=\"Zoom\" tabindex=\"23\" data-l10n-id=\"zoom\">\n                      <option id=\"pageAutoOption\" title=\"\" value=\"auto\" selected=\"selected\" data-l10n-id=\"page_scale_auto\">Automatic Zoom</option>\n                      <option id=\"pageActualOption\" title=\"\" value=\"page-actual\" data-l10n-id=\"page_scale_actual\">Actual Size</option>\n                      <option id=\"pageFitOption\" title=\"\" value=\"page-fit\" data-l10n-id=\"page_scale_fit\">Fit Page</option>\n                      <option id=\"pageWidthOption\" title=\"\" value=\"page-width\" data-l10n-id=\"page_scale_width\">Full Width</option>\n                      <option id=\"customScaleOption\" title=\"\" value=\"custom\"></option>\n                      <option title=\"\" value=\"0.5\" data-l10n-id=\"page_scale_percent\" data-l10n-args='{ \"scale\": 50 }'>50%</option>\n                      <option title=\"\" value=\"0.75\" data-l10n-id=\"page_scale_percent\" data-l10n-args='{ \"scale\": 75 }'>75%</option>\n                      <option title=\"\" value=\"1\" data-l10n-id=\"page_scale_percent\" data-l10n-args='{ \"scale\": 100 }'>100%</option>\n                      <option title=\"\" value=\"1.25\" data-l10n-id=\"page_scale_percent\" data-l10n-args='{ \"scale\": 125 }'>125%</option>\n                      <option title=\"\" value=\"1.5\" data-l10n-id=\"page_scale_percent\" data-l10n-args='{ \"scale\": 150 }'>150%</option>\n                      <option title=\"\" value=\"2\" data-l10n-id=\"page_scale_percent\" data-l10n-args='{ \"scale\": 200 }'>200%</option>\n                      <option title=\"\" value=\"3\" data-l10n-id=\"page_scale_percent\" data-l10n-args='{ \"scale\": 300 }'>300%</option>\n                      <option title=\"\" value=\"4\" data-l10n-id=\"page_scale_percent\" data-l10n-args='{ \"scale\": 400 }'>400%</option>\n                    </select>\n                  </span>\n                </div>\n              </div>\n            </div>\n            <div id=\"loadingBar\">\n              <div class=\"progress\">\n                <div class=\"glimmer\">\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <menu type=\"context\" id=\"viewerContextMenu\">\n          <menuitem id=\"contextFirstPage\" label=\"First Page\"\n                    data-l10n-id=\"first_page\"></menuitem>\n          <menuitem id=\"contextLastPage\" label=\"Last Page\"\n                    data-l10n-id=\"last_page\"></menuitem>\n          <menuitem id=\"contextPageRotateCw\" label=\"Rotate Clockwise\"\n                    data-l10n-id=\"page_rotate_cw\"></menuitem>\n          <menuitem id=\"contextPageRotateCcw\" label=\"Rotate Counter-Clockwise\"\n                    data-l10n-id=\"page_rotate_ccw\"></menuitem>\n        </menu>\n\n        <div id=\"viewerContainer\" tabindex=\"0\">\n          <div id=\"viewer\" class=\"pdfViewer\"></div>\n        </div>\n\n        <div id=\"errorWrapper\" hidden='true'>\n          <div id=\"errorMessageLeft\">\n            <span id=\"errorMessage\"></span>\n            <button id=\"errorShowMore\" data-l10n-id=\"error_more_info\">\n              More Information\n            </button>\n            <button id=\"errorShowLess\" data-l10n-id=\"error_less_info\" hidden='true'>\n              Less Information\n            </button>\n          </div>\n          <div id=\"errorMessageRight\">\n            <button id=\"errorClose\" data-l10n-id=\"error_close\">\n              Close\n            </button>\n          </div>\n          <div class=\"clearBoth\"></div>\n          <textarea id=\"errorMoreInfo\" hidden='true' readonly=\"readonly\"></textarea>\n        </div>\n      </div> <!-- mainContainer -->\n\n      <div id=\"overlayContainer\" class=\"hidden\">\n        <div id=\"passwordOverlay\" class=\"container hidden\">\n          <div class=\"dialog\">\n            <div class=\"row\">\n              <p id=\"passwordText\" data-l10n-id=\"password_label\">Enter the password to open this PDF file:</p>\n            </div>\n            <div class=\"row\">\n              <input type=\"password\" id=\"password\" class=\"toolbarField\" />\n            </div>\n            <div class=\"buttonRow\">\n              <button id=\"passwordCancel\" class=\"overlayButton\"><span data-l10n-id=\"password_cancel\">Cancel</span></button>\n              <button id=\"passwordSubmit\" class=\"overlayButton\"><span data-l10n-id=\"password_ok\">OK</span></button>\n            </div>\n          </div>\n        </div>\n        <div id=\"documentPropertiesOverlay\" class=\"container hidden\">\n          <div class=\"dialog\">\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_file_name\">File name:</span> <p id=\"fileNameField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_file_size\">File size:</span> <p id=\"fileSizeField\">-</p>\n            </div>\n            <div class=\"separator\"></div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_title\">Title:</span> <p id=\"titleField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_author\">Author:</span> <p id=\"authorField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_subject\">Subject:</span> <p id=\"subjectField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_keywords\">Keywords:</span> <p id=\"keywordsField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_creation_date\">Creation Date:</span> <p id=\"creationDateField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_modification_date\">Modification Date:</span> <p id=\"modificationDateField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_creator\">Creator:</span> <p id=\"creatorField\">-</p>\n            </div>\n            <div class=\"separator\"></div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_producer\">PDF Producer:</span> <p id=\"producerField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_version\">PDF Version:</span> <p id=\"versionField\">-</p>\n            </div>\n            <div class=\"row\">\n              <span data-l10n-id=\"document_properties_page_count\">Page Count:</span> <p id=\"pageCountField\">-</p>\n            </div>\n            <div class=\"buttonRow\">\n              <button id=\"documentPropertiesClose\" class=\"overlayButton\"><span data-l10n-id=\"document_properties_close\">Close</span></button>\n            </div>\n          </div>\n        </div>\n      </div>  <!-- overlayContainer -->\n\n    </div> <!-- outerContainer -->\n    <div id=\"printContainer\"></div>\n<div id=\"mozPrintCallback-shim\" hidden>\n  <style>\n@media print {\n  #printContainer div {\n    page-break-after: always;\n    page-break-inside: avoid;\n  }\n}\n  </style>\n  <style scoped>\n#mozPrintCallback-shim {\n  position: fixed;\n  top: 0;\n  left: 0;\n  height: 100%;\n  width: 100%;\n  z-index: 9999999;\n\n  display: block;\n  text-align: center;\n  background-color: rgba(0, 0, 0, 0.5);\n}\n#mozPrintCallback-shim[hidden] {\n  display: none;\n}\n@media print {\n  #mozPrintCallback-shim {\n    display: none;\n  }\n}\n\n#mozPrintCallback-shim .mozPrintCallback-dialog-box {\n  display: inline-block;\n  margin: -50px auto 0;\n  position: relative;\n  top: 45%;\n  left: 0;\n  min-width: 220px;\n  max-width: 400px;\n\n  padding: 9px;\n\n  border: 1px solid hsla(0, 0%, 0%, .5);\n  border-radius: 2px;\n  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);\n\n  background-color: #474747;\n\n  color: hsl(0, 0%, 85%);\n  font-size: 16px;\n  line-height: 20px;\n}\n#mozPrintCallback-shim .progress-row {\n  clear: both;\n  padding: 1em 0;\n}\n#mozPrintCallback-shim progress {\n  width: 100%;\n}\n#mozPrintCallback-shim .relative-progress {\n  clear: both;\n  float: right;\n}\n#mozPrintCallback-shim .progress-actions {\n  clear: both;\n}\n  </style>\n  <div class=\"mozPrintCallback-dialog-box\">\n    <!-- TODO: Localise the following strings -->\n    Preparing document for printing...\n    <div class=\"progress-row\">\n      <progress value=\"0\" max=\"100\"></progress>\n      <span class=\"relative-progress\">0%</span>\n    </div>\n    <div class=\"progress-actions\">\n      <input type=\"button\" value=\"Cancel\" class=\"mozPrintCallback-cancel\">\n    </div>\n  </div>\n</div>\n\n  </body>\n</html>\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/static/generic/web/viewer.js",
    "content": "/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */\n/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals PDFJS, PDFBug, FirefoxCom, Stats, Cache, ProgressBar,\n           DownloadManager, getFileName, getPDFFileNameFromURL,\n           PDFHistory, Preferences, SidebarView, ViewHistory, Stats,\n           PDFThumbnailViewer, URL, noContextMenuHandler, SecondaryToolbar,\n           PasswordPrompt, PDFPresentationMode, HandTool, Promise,\n           PDFDocumentProperties, PDFOutlineView, PDFAttachmentView,\n           OverlayManager, PDFFindController, PDFFindBar, getVisibleElements,\n           watchScroll, PDFViewer, PDFRenderingQueue, PresentationModeState,\n           RenderingStates, DEFAULT_SCALE, UNKNOWN_SCALE,\n           IGNORE_CURRENT_POSITION_ON_ZOOM: true */\n\n'use strict';\n\nvar DEFAULT_URL = 'compressed.tracemonkey-pldi-09.pdf';\nvar DEFAULT_SCALE_DELTA = 1.1;\nvar MIN_SCALE = 0.25;\nvar MAX_SCALE = 10.0;\nvar VIEW_HISTORY_MEMORY = 20;\nvar SCALE_SELECT_CONTAINER_PADDING = 8;\nvar SCALE_SELECT_PADDING = 22;\nvar PAGE_NUMBER_LOADING_INDICATOR = 'visiblePageIsLoading';\nvar DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000;\n\nPDFJS.imageResourcesPath = './images/';\n  PDFJS.workerSrc = '../build/pdf.worker.js';\n  PDFJS.cMapUrl = '../web/cmaps/';\n  PDFJS.cMapPacked = true;\n\nvar mozL10n = document.mozL10n || document.webL10n;\n\n\nvar CSS_UNITS = 96.0 / 72.0;\nvar DEFAULT_SCALE = 'auto';\nvar UNKNOWN_SCALE = 0;\nvar MAX_AUTO_SCALE = 1.25;\nvar SCROLLBAR_PADDING = 40;\nvar VERTICAL_PADDING = 5;\n\n// optimised CSS custom property getter/setter\nvar CustomStyle = (function CustomStyleClosure() {\n\n  // As noted on: http://www.zachstronaut.com/posts/2009/02/17/\n  //              animate-css-transforms-firefox-webkit.html\n  // in some versions of IE9 it is critical that ms appear in this list\n  // before Moz\n  var prefixes = ['ms', 'Moz', 'Webkit', 'O'];\n  var _cache = {};\n\n  function CustomStyle() {}\n\n  CustomStyle.getProp = function get(propName, element) {\n    // check cache only when no element is given\n    if (arguments.length === 1 && typeof _cache[propName] === 'string') {\n      return _cache[propName];\n    }\n\n    element = element || document.documentElement;\n    var style = element.style, prefixed, uPropName;\n\n    // test standard property first\n    if (typeof style[propName] === 'string') {\n      return (_cache[propName] = propName);\n    }\n\n    // capitalize\n    uPropName = propName.charAt(0).toUpperCase() + propName.slice(1);\n\n    // test vendor specific properties\n    for (var i = 0, l = prefixes.length; i < l; i++) {\n      prefixed = prefixes[i] + uPropName;\n      if (typeof style[prefixed] === 'string') {\n        return (_cache[propName] = prefixed);\n      }\n    }\n\n    //if all fails then set to undefined\n    return (_cache[propName] = 'undefined');\n  };\n\n  CustomStyle.setProp = function set(propName, element, str) {\n    var prop = this.getProp(propName);\n    if (prop !== 'undefined') {\n      element.style[prop] = str;\n    }\n  };\n\n  return CustomStyle;\n})();\n\nfunction getFileName(url) {\n  var anchor = url.indexOf('#');\n  var query = url.indexOf('?');\n  var end = Math.min(\n    anchor > 0 ? anchor : url.length,\n    query > 0 ? query : url.length);\n  return url.substring(url.lastIndexOf('/', end) + 1, end);\n}\n\n/**\n * Returns scale factor for the canvas. It makes sense for the HiDPI displays.\n * @return {Object} The object with horizontal (sx) and vertical (sy)\n                    scales. The scaled property is set to false if scaling is\n                    not required, true otherwise.\n */\nfunction getOutputScale(ctx) {\n  var devicePixelRatio = window.devicePixelRatio || 1;\n  var backingStoreRatio = ctx.webkitBackingStorePixelRatio ||\n                          ctx.mozBackingStorePixelRatio ||\n                          ctx.msBackingStorePixelRatio ||\n                          ctx.oBackingStorePixelRatio ||\n                          ctx.backingStorePixelRatio || 1;\n  var pixelRatio = devicePixelRatio / backingStoreRatio;\n  return {\n    sx: pixelRatio,\n    sy: pixelRatio,\n    scaled: pixelRatio !== 1\n  };\n}\n\n/**\n * Scrolls specified element into view of its parent.\n * element {Object} The element to be visible.\n * spot {Object} An object with optional top and left properties,\n *               specifying the offset from the top left edge.\n */\nfunction scrollIntoView(element, spot) {\n  // Assuming offsetParent is available (it's not available when viewer is in\n  // hidden iframe or object). We have to scroll: if the offsetParent is not set\n  // producing the error. See also animationStartedClosure.\n  var parent = element.offsetParent;\n  var offsetY = element.offsetTop + element.clientTop;\n  var offsetX = element.offsetLeft + element.clientLeft;\n  if (!parent) {\n    console.error('offsetParent is not set -- cannot scroll');\n    return;\n  }\n  while (parent.clientHeight === parent.scrollHeight) {\n    if (parent.dataset._scaleY) {\n      offsetY /= parent.dataset._scaleY;\n      offsetX /= parent.dataset._scaleX;\n    }\n    offsetY += parent.offsetTop;\n    offsetX += parent.offsetLeft;\n    parent = parent.offsetParent;\n    if (!parent) {\n      return; // no need to scroll\n    }\n  }\n  if (spot) {\n    if (spot.top !== undefined) {\n      offsetY += spot.top;\n    }\n    if (spot.left !== undefined) {\n      offsetX += spot.left;\n      parent.scrollLeft = offsetX;\n    }\n  }\n  parent.scrollTop = offsetY;\n}\n\n/**\n * Helper function to start monitoring the scroll event and converting them into\n * PDF.js friendly one: with scroll debounce and scroll direction.\n */\nfunction watchScroll(viewAreaElement, callback) {\n  var debounceScroll = function debounceScroll(evt) {\n    if (rAF) {\n      return;\n    }\n    // schedule an invocation of scroll for next animation frame.\n    rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {\n      rAF = null;\n\n      var currentY = viewAreaElement.scrollTop;\n      var lastY = state.lastY;\n      if (currentY !== lastY) {\n        state.down = currentY > lastY;\n      }\n      state.lastY = currentY;\n      callback(state);\n    });\n  };\n\n  var state = {\n    down: true,\n    lastY: viewAreaElement.scrollTop,\n    _eventHandler: debounceScroll\n  };\n\n  var rAF = null;\n  viewAreaElement.addEventListener('scroll', debounceScroll, true);\n  return state;\n}\n\n/**\n * Use binary search to find the index of the first item in a given array which\n * passes a given condition. The items are expected to be sorted in the sense\n * that if the condition is true for one item in the array, then it is also true\n * for all following items.\n *\n * @returns {Number} Index of the first array element to pass the test,\n *                   or |items.length| if no such element exists.\n */\nfunction binarySearchFirstItem(items, condition) {\n  var minIndex = 0;\n  var maxIndex = items.length - 1;\n\n  if (items.length === 0 || !condition(items[maxIndex])) {\n    return items.length;\n  }\n  if (condition(items[minIndex])) {\n    return minIndex;\n  }\n\n  while (minIndex < maxIndex) {\n    var currentIndex = (minIndex + maxIndex) >> 1;\n    var currentItem = items[currentIndex];\n    if (condition(currentItem)) {\n      maxIndex = currentIndex;\n    } else {\n      minIndex = currentIndex + 1;\n    }\n  }\n  return minIndex; /* === maxIndex */\n}\n\n/**\n * Generic helper to find out what elements are visible within a scroll pane.\n */\nfunction getVisibleElements(scrollEl, views, sortByVisibility) {\n  var top = scrollEl.scrollTop, bottom = top + scrollEl.clientHeight;\n  var left = scrollEl.scrollLeft, right = left + scrollEl.clientWidth;\n\n  function isElementBottomBelowViewTop(view) {\n    var element = view.div;\n    var elementBottom =\n      element.offsetTop + element.clientTop + element.clientHeight;\n    return elementBottom > top;\n  }\n\n  var visible = [], view, element;\n  var currentHeight, viewHeight, hiddenHeight, percentHeight;\n  var currentWidth, viewWidth;\n  var firstVisibleElementInd = (views.length === 0) ? 0 :\n    binarySearchFirstItem(views, isElementBottomBelowViewTop);\n\n  for (var i = firstVisibleElementInd, ii = views.length; i < ii; i++) {\n    view = views[i];\n    element = view.div;\n    currentHeight = element.offsetTop + element.clientTop;\n    viewHeight = element.clientHeight;\n\n    if (currentHeight > bottom) {\n      break;\n    }\n\n    currentWidth = element.offsetLeft + element.clientLeft;\n    viewWidth = element.clientWidth;\n    if (currentWidth + viewWidth < left || currentWidth > right) {\n      continue;\n    }\n    hiddenHeight = Math.max(0, top - currentHeight) +\n      Math.max(0, currentHeight + viewHeight - bottom);\n    percentHeight = ((viewHeight - hiddenHeight) * 100 / viewHeight) | 0;\n\n    visible.push({\n      id: view.id,\n      x: currentWidth,\n      y: currentHeight,\n      view: view,\n      percent: percentHeight\n    });\n  }\n\n  var first = visible[0];\n  var last = visible[visible.length - 1];\n\n  if (sortByVisibility) {\n    visible.sort(function(a, b) {\n      var pc = a.percent - b.percent;\n      if (Math.abs(pc) > 0.001) {\n        return -pc;\n      }\n      return a.id - b.id; // ensure stability\n    });\n  }\n  return {first: first, last: last, views: visible};\n}\n\n/**\n * Event handler to suppress context menu.\n */\nfunction noContextMenuHandler(e) {\n  e.preventDefault();\n}\n\n/**\n * Returns the filename or guessed filename from the url (see issue 3455).\n * url {String} The original PDF location.\n * @return {String} Guessed PDF file name.\n */\nfunction getPDFFileNameFromURL(url) {\n  var reURI = /^(?:([^:]+:)?\\/\\/[^\\/]+)?([^?#]*)(\\?[^#]*)?(#.*)?$/;\n  //            SCHEME      HOST         1.PATH  2.QUERY   3.REF\n  // Pattern to get last matching NAME.pdf\n  var reFilename = /[^\\/?#=]+\\.pdf\\b(?!.*\\.pdf\\b)/i;\n  var splitURI = reURI.exec(url);\n  var suggestedFilename = reFilename.exec(splitURI[1]) ||\n                           reFilename.exec(splitURI[2]) ||\n                           reFilename.exec(splitURI[3]);\n  if (suggestedFilename) {\n    suggestedFilename = suggestedFilename[0];\n    if (suggestedFilename.indexOf('%') !== -1) {\n      // URL-encoded %2Fpath%2Fto%2Ffile.pdf should be file.pdf\n      try {\n        suggestedFilename =\n          reFilename.exec(decodeURIComponent(suggestedFilename))[0];\n      } catch(e) { // Possible (extremely rare) errors:\n        // URIError \"Malformed URI\", e.g. for \"%AA.pdf\"\n        // TypeError \"null has no properties\", e.g. for \"%2F.pdf\"\n      }\n    }\n  }\n  return suggestedFilename || 'document.pdf';\n}\n\nvar ProgressBar = (function ProgressBarClosure() {\n\n  function clamp(v, min, max) {\n    return Math.min(Math.max(v, min), max);\n  }\n\n  function ProgressBar(id, opts) {\n    this.visible = true;\n\n    // Fetch the sub-elements for later.\n    this.div = document.querySelector(id + ' .progress');\n\n    // Get the loading bar element, so it can be resized to fit the viewer.\n    this.bar = this.div.parentNode;\n\n    // Get options, with sensible defaults.\n    this.height = opts.height || 100;\n    this.width = opts.width || 100;\n    this.units = opts.units || '%';\n\n    // Initialize heights.\n    this.div.style.height = this.height + this.units;\n    this.percent = 0;\n  }\n\n  ProgressBar.prototype = {\n\n    updateBar: function ProgressBar_updateBar() {\n      if (this._indeterminate) {\n        this.div.classList.add('indeterminate');\n        this.div.style.width = this.width + this.units;\n        return;\n      }\n\n      this.div.classList.remove('indeterminate');\n      var progressSize = this.width * this._percent / 100;\n      this.div.style.width = progressSize + this.units;\n    },\n\n    get percent() {\n      return this._percent;\n    },\n\n    set percent(val) {\n      this._indeterminate = isNaN(val);\n      this._percent = clamp(val, 0, 100);\n      this.updateBar();\n    },\n\n    setWidth: function ProgressBar_setWidth(viewer) {\n      if (viewer) {\n        var container = viewer.parentNode;\n        var scrollbarWidth = container.offsetWidth - viewer.offsetWidth;\n        if (scrollbarWidth > 0) {\n          this.bar.setAttribute('style', 'width: calc(100% - ' +\n                                         scrollbarWidth + 'px);');\n        }\n      }\n    },\n\n    hide: function ProgressBar_hide() {\n      if (!this.visible) {\n        return;\n      }\n      this.visible = false;\n      this.bar.classList.add('hidden');\n      document.body.classList.remove('loadingInProgress');\n    },\n\n    show: function ProgressBar_show() {\n      if (this.visible) {\n        return;\n      }\n      this.visible = true;\n      document.body.classList.add('loadingInProgress');\n      this.bar.classList.remove('hidden');\n    }\n  };\n\n  return ProgressBar;\n})();\n\n\n\nvar DEFAULT_PREFERENCES = {\n  showPreviousViewOnLoad: true,\n  defaultZoomValue: '',\n  sidebarViewOnLoad: 0,\n  enableHandToolOnLoad: false,\n  enableWebGL: false,\n  pdfBugEnabled: false,\n  disableRange: false,\n  disableStream: false,\n  disableAutoFetch: false,\n  disableFontFace: false,\n  disableTextLayer: false,\n  useOnlyCssZoom: false\n};\n\n\nvar SidebarView = {\n  NONE: 0,\n  THUMBS: 1,\n  OUTLINE: 2,\n  ATTACHMENTS: 3\n};\n\n/**\n * Preferences - Utility for storing persistent settings.\n *   Used for settings that should be applied to all opened documents,\n *   or every time the viewer is loaded.\n */\nvar Preferences = {\n  prefs: Object.create(DEFAULT_PREFERENCES),\n  isInitializedPromiseResolved: false,\n  initializedPromise: null,\n\n  /**\n   * Initialize and fetch the current preference values from storage.\n   * @return {Promise} A promise that is resolved when the preferences\n   *                   have been initialized.\n   */\n  initialize: function preferencesInitialize() {\n    return this.initializedPromise =\n        this._readFromStorage(DEFAULT_PREFERENCES).then(function(prefObj) {\n      this.isInitializedPromiseResolved = true;\n      if (prefObj) {\n        this.prefs = prefObj;\n      }\n    }.bind(this));\n  },\n\n  /**\n   * Stub function for writing preferences to storage.\n   * NOTE: This should be overridden by a build-specific function defined below.\n   * @param {Object} prefObj The preferences that should be written to storage.\n   * @return {Promise} A promise that is resolved when the preference values\n   *                   have been written.\n   */\n  _writeToStorage: function preferences_writeToStorage(prefObj) {\n    return Promise.resolve();\n  },\n\n  /**\n   * Stub function for reading preferences from storage.\n   * NOTE: This should be overridden by a build-specific function defined below.\n   * @param {Object} prefObj The preferences that should be read from storage.\n   * @return {Promise} A promise that is resolved with an {Object} containing\n   *                   the preferences that have been read.\n   */\n  _readFromStorage: function preferences_readFromStorage(prefObj) {\n    return Promise.resolve();\n  },\n\n  /**\n   * Reset the preferences to their default values and update storage.\n   * @return {Promise} A promise that is resolved when the preference values\n   *                   have been reset.\n   */\n  reset: function preferencesReset() {\n    return this.initializedPromise.then(function() {\n      this.prefs = Object.create(DEFAULT_PREFERENCES);\n      return this._writeToStorage(DEFAULT_PREFERENCES);\n    }.bind(this));\n  },\n\n  /**\n   * Replace the current preference values with the ones from storage.\n   * @return {Promise} A promise that is resolved when the preference values\n   *                   have been updated.\n   */\n  reload: function preferencesReload() {\n    return this.initializedPromise.then(function () {\n      this._readFromStorage(DEFAULT_PREFERENCES).then(function(prefObj) {\n        if (prefObj) {\n          this.prefs = prefObj;\n        }\n      }.bind(this));\n    }.bind(this));\n  },\n\n  /**\n   * Set the value of a preference.\n   * @param {string} name The name of the preference that should be changed.\n   * @param {boolean|number|string} value The new value of the preference.\n   * @return {Promise} A promise that is resolved when the value has been set,\n   *                   provided that the preference exists and the types match.\n   */\n  set: function preferencesSet(name, value) {\n    return this.initializedPromise.then(function () {\n      if (DEFAULT_PREFERENCES[name] === undefined) {\n        throw new Error('preferencesSet: \\'' + name + '\\' is undefined.');\n      } else if (value === undefined) {\n        throw new Error('preferencesSet: no value is specified.');\n      }\n      var valueType = typeof value;\n      var defaultType = typeof DEFAULT_PREFERENCES[name];\n\n      if (valueType !== defaultType) {\n        if (valueType === 'number' && defaultType === 'string') {\n          value = value.toString();\n        } else {\n          throw new Error('Preferences_set: \\'' + value + '\\' is a \\\"' +\n                          valueType + '\\\", expected \\\"' + defaultType + '\\\".');\n        }\n      } else {\n        if (valueType === 'number' && (value | 0) !== value) {\n          throw new Error('Preferences_set: \\'' + value +\n                          '\\' must be an \\\"integer\\\".');\n        }\n      }\n      this.prefs[name] = value;\n      return this._writeToStorage(this.prefs);\n    }.bind(this));\n  },\n\n  /**\n   * Get the value of a preference.\n   * @param {string} name The name of the preference whose value is requested.\n   * @return {Promise} A promise that is resolved with a {boolean|number|string}\n   *                   containing the value of the preference.\n   */\n  get: function preferencesGet(name) {\n    return this.initializedPromise.then(function () {\n      var defaultValue = DEFAULT_PREFERENCES[name];\n\n      if (defaultValue === undefined) {\n        throw new Error('preferencesGet: \\'' + name + '\\' is undefined.');\n      } else {\n        var prefValue = this.prefs[name];\n\n        if (prefValue !== undefined) {\n          return prefValue;\n        }\n      }\n      return defaultValue;\n    }.bind(this));\n  }\n};\n\n\n\nPreferences._writeToStorage = function (prefObj) {\n  return new Promise(function (resolve) {\n    localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj));\n    resolve();\n  });\n};\n\nPreferences._readFromStorage = function (prefObj) {\n  return new Promise(function (resolve) {\n    var readPrefs = JSON.parse(localStorage.getItem('pdfjs.preferences'));\n    resolve(readPrefs);\n  });\n};\n\n\n(function mozPrintCallbackPolyfillClosure() {\n  if ('mozPrintCallback' in document.createElement('canvas')) {\n    return;\n  }\n  // Cause positive result on feature-detection:\n  HTMLCanvasElement.prototype.mozPrintCallback = undefined;\n\n  var canvases;   // During print task: non-live NodeList of <canvas> elements\n  var index;      // Index of <canvas> element that is being processed\n\n  var print = window.print;\n  window.print = function print() {\n    if (canvases) {\n      console.warn('Ignored window.print() because of a pending print job.');\n      return;\n    }\n    try {\n      dispatchEvent('beforeprint');\n    } finally {\n      canvases = document.querySelectorAll('canvas');\n      index = -1;\n      next();\n    }\n  };\n\n  function dispatchEvent(eventType) {\n    var event = document.createEvent('CustomEvent');\n    event.initCustomEvent(eventType, false, false, 'custom');\n    window.dispatchEvent(event);\n  }\n\n  function next() {\n    if (!canvases) {\n      return; // Print task cancelled by user (state reset in abort())\n    }\n\n    renderProgress();\n    if (++index < canvases.length) {\n      var canvas = canvases[index];\n      if (typeof canvas.mozPrintCallback === 'function') {\n        canvas.mozPrintCallback({\n          context: canvas.getContext('2d'),\n          abort: abort,\n          done: next\n        });\n      } else {\n        next();\n      }\n    } else {\n      renderProgress();\n      print.call(window);\n      setTimeout(abort, 20); // Tidy-up\n    }\n  }\n\n  function abort() {\n    if (canvases) {\n      canvases = null;\n      renderProgress();\n      dispatchEvent('afterprint');\n    }\n  }\n\n  function renderProgress() {\n    var progressContainer = document.getElementById('mozPrintCallback-shim');\n    if (canvases) {\n      var progress = Math.round(100 * index / canvases.length);\n      var progressBar = progressContainer.querySelector('progress');\n      var progressPerc = progressContainer.querySelector('.relative-progress');\n      progressBar.value = progress;\n      progressPerc.textContent = progress + '%';\n      progressContainer.removeAttribute('hidden');\n      progressContainer.onclick = abort;\n    } else {\n      progressContainer.setAttribute('hidden', '');\n    }\n  }\n\n  var hasAttachEvent = !!document.attachEvent;\n\n  window.addEventListener('keydown', function(event) {\n    // Intercept Cmd/Ctrl + P in all browsers.\n    // Also intercept Cmd/Ctrl + Shift + P in Chrome and Opera\n    if (event.keyCode === 80/*P*/ && (event.ctrlKey || event.metaKey) &&\n        !event.altKey && (!event.shiftKey || window.chrome || window.opera)) {\n      window.print();\n      if (hasAttachEvent) {\n        // Only attachEvent can cancel Ctrl + P dialog in IE <=10\n        // attachEvent is gone in IE11, so the dialog will re-appear in IE11.\n        return;\n      }\n      event.preventDefault();\n      if (event.stopImmediatePropagation) {\n        event.stopImmediatePropagation();\n      } else {\n        event.stopPropagation();\n      }\n      return;\n    }\n    if (event.keyCode === 27 && canvases) { // Esc\n      abort();\n    }\n  }, true);\n  if (hasAttachEvent) {\n    document.attachEvent('onkeydown', function(event) {\n      event = event || window.event;\n      if (event.keyCode === 80/*P*/ && event.ctrlKey) {\n        event.keyCode = 0;\n        return false;\n      }\n    });\n  }\n\n  if ('onbeforeprint' in window) {\n    // Do not propagate before/afterprint events when they are not triggered\n    // from within this polyfill. (FF/IE).\n    var stopPropagationIfNeeded = function(event) {\n      if (event.detail !== 'custom' && event.stopImmediatePropagation) {\n        event.stopImmediatePropagation();\n      }\n    };\n    window.addEventListener('beforeprint', stopPropagationIfNeeded, false);\n    window.addEventListener('afterprint', stopPropagationIfNeeded, false);\n  }\n})();\n\n\n\nvar DownloadManager = (function DownloadManagerClosure() {\n\n  function download(blobUrl, filename) {\n    var a = document.createElement('a');\n    if (a.click) {\n      // Use a.click() if available. Otherwise, Chrome might show\n      // \"Unsafe JavaScript attempt to initiate a navigation change\n      //  for frame with URL\" and not open the PDF at all.\n      // Supported by (not mentioned = untested):\n      // - Firefox 6 - 19 (4- does not support a.click, 5 ignores a.click)\n      // - Chrome 19 - 26 (18- does not support a.click)\n      // - Opera 9 - 12.15\n      // - Internet Explorer 6 - 10\n      // - Safari 6 (5.1- does not support a.click)\n      a.href = blobUrl;\n      a.target = '_parent';\n      // Use a.download if available. This increases the likelihood that\n      // the file is downloaded instead of opened by another PDF plugin.\n      if ('download' in a) {\n        a.download = filename;\n      }\n      // <a> must be in the document for IE and recent Firefox versions.\n      // (otherwise .click() is ignored)\n      (document.body || document.documentElement).appendChild(a);\n      a.click();\n      a.parentNode.removeChild(a);\n    } else {\n      if (window.top === window &&\n          blobUrl.split('#')[0] === window.location.href.split('#')[0]) {\n        // If _parent == self, then opening an identical URL with different\n        // location hash will only cause a navigation, not a download.\n        var padCharacter = blobUrl.indexOf('?') === -1 ? '?' : '&';\n        blobUrl = blobUrl.replace(/#|$/, padCharacter + '$&');\n      }\n      window.open(blobUrl, '_parent');\n    }\n  }\n\n  function DownloadManager() {}\n\n  DownloadManager.prototype = {\n    downloadUrl: function DownloadManager_downloadUrl(url, filename) {\n      if (!PDFJS.isValidUrl(url, true)) {\n        return; // restricted/invalid URL\n      }\n\n      download(url + '#pdfjs.action=download', filename);\n    },\n\n    downloadData: function DownloadManager_downloadData(data, filename,\n                                                        contentType) {\n      if (navigator.msSaveBlob) { // IE10 and above\n        return navigator.msSaveBlob(new Blob([data], { type: contentType }),\n                                    filename);\n      }\n\n      var blobUrl = PDFJS.createObjectURL(data, contentType);\n      download(blobUrl, filename);\n    },\n\n    download: function DownloadManager_download(blob, url, filename) {\n      if (!URL) {\n        // URL.createObjectURL is not supported\n        this.downloadUrl(url, filename);\n        return;\n      }\n\n      if (navigator.msSaveBlob) {\n        // IE10 / IE11\n        if (!navigator.msSaveBlob(blob, filename)) {\n          this.downloadUrl(url, filename);\n        }\n        return;\n      }\n\n      var blobUrl = URL.createObjectURL(blob);\n      download(blobUrl, filename);\n    }\n  };\n\n  return DownloadManager;\n})();\n\n\n\n\n\n/**\n * View History - This is a utility for saving various view parameters for\n *                recently opened files.\n *\n * The way that the view parameters are stored depends on how PDF.js is built,\n * for 'node make <flag>' the following cases exist:\n *  - FIREFOX or MOZCENTRAL - uses sessionStorage.\n *  - B2G                   - uses asyncStorage.\n *  - GENERIC or CHROME     - uses localStorage, if it is available.\n */\nvar ViewHistory = (function ViewHistoryClosure() {\n  function ViewHistory(fingerprint) {\n    this.fingerprint = fingerprint;\n    this.isInitializedPromiseResolved = false;\n    this.initializedPromise =\n        this._readFromStorage().then(function (databaseStr) {\n      this.isInitializedPromiseResolved = true;\n\n      var database = JSON.parse(databaseStr || '{}');\n      if (!('files' in database)) {\n        database.files = [];\n      }\n      if (database.files.length >= VIEW_HISTORY_MEMORY) {\n        database.files.shift();\n      }\n      var index;\n      for (var i = 0, length = database.files.length; i < length; i++) {\n        var branch = database.files[i];\n        if (branch.fingerprint === this.fingerprint) {\n          index = i;\n          break;\n        }\n      }\n      if (typeof index !== 'number') {\n        index = database.files.push({fingerprint: this.fingerprint}) - 1;\n      }\n      this.file = database.files[index];\n      this.database = database;\n    }.bind(this));\n  }\n\n  ViewHistory.prototype = {\n    _writeToStorage: function ViewHistory_writeToStorage() {\n      return new Promise(function (resolve) {\n        var databaseStr = JSON.stringify(this.database);\n\n\n\n        localStorage.setItem('database', databaseStr);\n        resolve();\n      }.bind(this));\n    },\n\n    _readFromStorage: function ViewHistory_readFromStorage() {\n      return new Promise(function (resolve) {\n\n\n        resolve(localStorage.getItem('database'));\n      });\n    },\n\n    set: function ViewHistory_set(name, val) {\n      if (!this.isInitializedPromiseResolved) {\n        return;\n      }\n      this.file[name] = val;\n      return this._writeToStorage();\n    },\n\n    setMultiple: function ViewHistory_setMultiple(properties) {\n      if (!this.isInitializedPromiseResolved) {\n        return;\n      }\n      for (var name in properties) {\n        this.file[name] = properties[name];\n      }\n      return this._writeToStorage();\n    },\n\n    get: function ViewHistory_get(name, defaultValue) {\n      if (!this.isInitializedPromiseResolved) {\n        return defaultValue;\n      }\n      return this.file[name] || defaultValue;\n    }\n  };\n\n  return ViewHistory;\n})();\n\n\n/**\n * Creates a \"search bar\" given a set of DOM elements that act as controls\n * for searching or for setting search preferences in the UI. This object\n * also sets up the appropriate events for the controls. Actual searching\n * is done by PDFFindController.\n */\nvar PDFFindBar = (function PDFFindBarClosure() {\n  function PDFFindBar(options) {\n    this.opened = false;\n    this.bar = options.bar || null;\n    this.toggleButton = options.toggleButton || null;\n    this.findField = options.findField || null;\n    this.highlightAll = options.highlightAllCheckbox || null;\n    this.caseSensitive = options.caseSensitiveCheckbox || null;\n    this.findMsg = options.findMsg || null;\n    this.findStatusIcon = options.findStatusIcon || null;\n    this.findPreviousButton = options.findPreviousButton || null;\n    this.findNextButton = options.findNextButton || null;\n    this.findController = options.findController || null;\n\n    if (this.findController === null) {\n      throw new Error('PDFFindBar cannot be used without a ' +\n                      'PDFFindController instance.');\n    }\n\n    // Add event listeners to the DOM elements.\n    var self = this;\n    this.toggleButton.addEventListener('click', function() {\n      self.toggle();\n    });\n\n    this.findField.addEventListener('input', function() {\n      self.dispatchEvent('');\n    });\n\n    this.bar.addEventListener('keydown', function(evt) {\n      switch (evt.keyCode) {\n        case 13: // Enter\n          if (evt.target === self.findField) {\n            self.dispatchEvent('again', evt.shiftKey);\n          }\n          break;\n        case 27: // Escape\n          self.close();\n          break;\n      }\n    });\n\n    this.findPreviousButton.addEventListener('click', function() {\n      self.dispatchEvent('again', true);\n    });\n\n    this.findNextButton.addEventListener('click', function() {\n      self.dispatchEvent('again', false);\n    });\n\n    this.highlightAll.addEventListener('click', function() {\n      self.dispatchEvent('highlightallchange');\n    });\n\n    this.caseSensitive.addEventListener('click', function() {\n      self.dispatchEvent('casesensitivitychange');\n    });\n  }\n\n  PDFFindBar.prototype = {\n    dispatchEvent: function PDFFindBar_dispatchEvent(type, findPrev) {\n      var event = document.createEvent('CustomEvent');\n      event.initCustomEvent('find' + type, true, true, {\n        query: this.findField.value,\n        caseSensitive: this.caseSensitive.checked,\n        highlightAll: this.highlightAll.checked,\n        findPrevious: findPrev\n      });\n      return window.dispatchEvent(event);\n    },\n\n    updateUIState: function PDFFindBar_updateUIState(state, previous) {\n      var notFound = false;\n      var findMsg = '';\n      var status = '';\n\n      switch (state) {\n        case FindStates.FIND_FOUND:\n          break;\n\n        case FindStates.FIND_PENDING:\n          status = 'pending';\n          break;\n\n        case FindStates.FIND_NOTFOUND:\n          findMsg = mozL10n.get('find_not_found', null, 'Phrase not found');\n          notFound = true;\n          break;\n\n        case FindStates.FIND_WRAPPED:\n          if (previous) {\n            findMsg = mozL10n.get('find_reached_top', null,\n              'Reached top of document, continued from bottom');\n          } else {\n            findMsg = mozL10n.get('find_reached_bottom', null,\n              'Reached end of document, continued from top');\n          }\n          break;\n      }\n\n      if (notFound) {\n        this.findField.classList.add('notFound');\n      } else {\n        this.findField.classList.remove('notFound');\n      }\n\n      this.findField.setAttribute('data-status', status);\n      this.findMsg.textContent = findMsg;\n    },\n\n    open: function PDFFindBar_open() {\n      if (!this.opened) {\n        this.opened = true;\n        this.toggleButton.classList.add('toggled');\n        this.bar.classList.remove('hidden');\n      }\n      this.findField.select();\n      this.findField.focus();\n    },\n\n    close: function PDFFindBar_close() {\n      if (!this.opened) {\n        return;\n      }\n      this.opened = false;\n      this.toggleButton.classList.remove('toggled');\n      this.bar.classList.add('hidden');\n      this.findController.active = false;\n    },\n\n    toggle: function PDFFindBar_toggle() {\n      if (this.opened) {\n        this.close();\n      } else {\n        this.open();\n      }\n    }\n  };\n  return PDFFindBar;\n})();\n\n\nvar FindStates = {\n  FIND_FOUND: 0,\n  FIND_NOTFOUND: 1,\n  FIND_WRAPPED: 2,\n  FIND_PENDING: 3\n};\n\nvar FIND_SCROLL_OFFSET_TOP = -50;\nvar FIND_SCROLL_OFFSET_LEFT = -400;\n\n/**\n * Provides \"search\" or \"find\" functionality for the PDF.\n * This object actually performs the search for a given string.\n */\nvar PDFFindController = (function PDFFindControllerClosure() {\n  function PDFFindController(options) {\n    this.startedTextExtraction = false;\n    this.extractTextPromises = [];\n    this.pendingFindMatches = {};\n    this.active = false; // If active, find results will be highlighted.\n    this.pageContents = []; // Stores the text for each page.\n    this.pageMatches = [];\n    this.selected = { // Currently selected match.\n      pageIdx: -1,\n      matchIdx: -1\n    };\n    this.offset = { // Where the find algorithm currently is in the document.\n      pageIdx: null,\n      matchIdx: null\n    };\n    this.pagesToSearch = null;\n    this.resumePageIdx = null;\n    this.state = null;\n    this.dirtyMatch = false;\n    this.findTimeout = null;\n    this.pdfViewer = options.pdfViewer || null;\n    this.integratedFind = options.integratedFind || false;\n    this.charactersToNormalize = {\n      '\\u2018': '\\'', // Left single quotation mark\n      '\\u2019': '\\'', // Right single quotation mark\n      '\\u201A': '\\'', // Single low-9 quotation mark\n      '\\u201B': '\\'', // Single high-reversed-9 quotation mark\n      '\\u201C': '\"', // Left double quotation mark\n      '\\u201D': '\"', // Right double quotation mark\n      '\\u201E': '\"', // Double low-9 quotation mark\n      '\\u201F': '\"', // Double high-reversed-9 quotation mark\n      '\\u00BC': '1/4', // Vulgar fraction one quarter\n      '\\u00BD': '1/2', // Vulgar fraction one half\n      '\\u00BE': '3/4', // Vulgar fraction three quarters\n      '\\u00A0': ' ' // No-break space\n    };\n    this.findBar = options.findBar || null;\n\n    // Compile the regular expression for text normalization once\n    var replace = Object.keys(this.charactersToNormalize).join('');\n    this.normalizationRegex = new RegExp('[' + replace + ']', 'g');\n\n    var events = [\n      'find',\n      'findagain',\n      'findhighlightallchange',\n      'findcasesensitivitychange'\n    ];\n\n    this.firstPagePromise = new Promise(function (resolve) {\n      this.resolveFirstPage = resolve;\n    }.bind(this));\n    this.handleEvent = this.handleEvent.bind(this);\n\n    for (var i = 0, len = events.length; i < len; i++) {\n      window.addEventListener(events[i], this.handleEvent);\n    }\n  }\n\n  PDFFindController.prototype = {\n    setFindBar: function PDFFindController_setFindBar(findBar) {\n      this.findBar = findBar;\n    },\n\n    reset: function PDFFindController_reset() {\n      this.startedTextExtraction = false;\n      this.extractTextPromises = [];\n      this.active = false;\n    },\n\n    normalize: function PDFFindController_normalize(text) {\n      var self = this;\n      return text.replace(this.normalizationRegex, function (ch) {\n        return self.charactersToNormalize[ch];\n      });\n    },\n\n    calcFindMatch: function PDFFindController_calcFindMatch(pageIndex) {\n      var pageContent = this.normalize(this.pageContents[pageIndex]);\n      var query = this.normalize(this.state.query);\n      var caseSensitive = this.state.caseSensitive;\n      var queryLen = query.length;\n\n      if (queryLen === 0) {\n        return; // Do nothing: the matches should be wiped out already.\n      }\n\n      if (!caseSensitive) {\n        pageContent = pageContent.toLowerCase();\n        query = query.toLowerCase();\n      }\n\n      var matches = [];\n      var matchIdx = -queryLen;\n      while (true) {\n        matchIdx = pageContent.indexOf(query, matchIdx + queryLen);\n        if (matchIdx === -1) {\n          break;\n        }\n        matches.push(matchIdx);\n      }\n      this.pageMatches[pageIndex] = matches;\n      this.updatePage(pageIndex);\n      if (this.resumePageIdx === pageIndex) {\n        this.resumePageIdx = null;\n        this.nextPageMatch();\n      }\n    },\n\n    extractText: function PDFFindController_extractText() {\n      if (this.startedTextExtraction) {\n        return;\n      }\n      this.startedTextExtraction = true;\n\n      this.pageContents = [];\n      var extractTextPromisesResolves = [];\n      var numPages = this.pdfViewer.pagesCount;\n      for (var i = 0; i < numPages; i++) {\n        this.extractTextPromises.push(new Promise(function (resolve) {\n          extractTextPromisesResolves.push(resolve);\n        }));\n      }\n\n      var self = this;\n      function extractPageText(pageIndex) {\n        self.pdfViewer.getPageTextContent(pageIndex).then(\n          function textContentResolved(textContent) {\n            var textItems = textContent.items;\n            var str = [];\n\n            for (var i = 0, len = textItems.length; i < len; i++) {\n              str.push(textItems[i].str);\n            }\n\n            // Store the pageContent as a string.\n            self.pageContents.push(str.join(''));\n\n            extractTextPromisesResolves[pageIndex](pageIndex);\n            if ((pageIndex + 1) < self.pdfViewer.pagesCount) {\n              extractPageText(pageIndex + 1);\n            }\n          }\n        );\n      }\n      extractPageText(0);\n    },\n\n    handleEvent: function PDFFindController_handleEvent(e) {\n      if (this.state === null || e.type !== 'findagain') {\n        this.dirtyMatch = true;\n      }\n      this.state = e.detail;\n      this.updateUIState(FindStates.FIND_PENDING);\n\n      this.firstPagePromise.then(function() {\n        this.extractText();\n\n        clearTimeout(this.findTimeout);\n        if (e.type === 'find') {\n          // Only trigger the find action after 250ms of silence.\n          this.findTimeout = setTimeout(this.nextMatch.bind(this), 250);\n        } else {\n          this.nextMatch();\n        }\n      }.bind(this));\n    },\n\n    updatePage: function PDFFindController_updatePage(index) {\n      if (this.selected.pageIdx === index) {\n        // If the page is selected, scroll the page into view, which triggers\n        // rendering the page, which adds the textLayer. Once the textLayer is\n        // build, it will scroll onto the selected match.\n        this.pdfViewer.scrollPageIntoView(index + 1);\n      }\n\n      var page = this.pdfViewer.getPageView(index);\n      if (page.textLayer) {\n        page.textLayer.updateMatches();\n      }\n    },\n\n    nextMatch: function PDFFindController_nextMatch() {\n      var previous = this.state.findPrevious;\n      var currentPageIndex = this.pdfViewer.currentPageNumber - 1;\n      var numPages = this.pdfViewer.pagesCount;\n\n      this.active = true;\n\n      if (this.dirtyMatch) {\n        // Need to recalculate the matches, reset everything.\n        this.dirtyMatch = false;\n        this.selected.pageIdx = this.selected.matchIdx = -1;\n        this.offset.pageIdx = currentPageIndex;\n        this.offset.matchIdx = null;\n        this.hadMatch = false;\n        this.resumePageIdx = null;\n        this.pageMatches = [];\n        var self = this;\n\n        for (var i = 0; i < numPages; i++) {\n          // Wipe out any previous highlighted matches.\n          this.updatePage(i);\n\n          // As soon as the text is extracted start finding the matches.\n          if (!(i in this.pendingFindMatches)) {\n            this.pendingFindMatches[i] = true;\n            this.extractTextPromises[i].then(function(pageIdx) {\n              delete self.pendingFindMatches[pageIdx];\n              self.calcFindMatch(pageIdx);\n            });\n          }\n        }\n      }\n\n      // If there's no query there's no point in searching.\n      if (this.state.query === '') {\n        this.updateUIState(FindStates.FIND_FOUND);\n        return;\n      }\n\n      // If we're waiting on a page, we return since we can't do anything else.\n      if (this.resumePageIdx) {\n        return;\n      }\n\n      var offset = this.offset;\n      // Keep track of how many pages we should maximally iterate through.\n      this.pagesToSearch = numPages;\n      // If there's already a matchIdx that means we are iterating through a\n      // page's matches.\n      if (offset.matchIdx !== null) {\n        var numPageMatches = this.pageMatches[offset.pageIdx].length;\n        if ((!previous && offset.matchIdx + 1 < numPageMatches) ||\n            (previous && offset.matchIdx > 0)) {\n          // The simple case; we just have advance the matchIdx to select\n          // the next match on the page.\n          this.hadMatch = true;\n          offset.matchIdx = (previous ? offset.matchIdx - 1 :\n                                        offset.matchIdx + 1);\n          this.updateMatch(true);\n          return;\n        }\n        // We went beyond the current page's matches, so we advance to\n        // the next page.\n        this.advanceOffsetPage(previous);\n      }\n      // Start searching through the page.\n      this.nextPageMatch();\n    },\n\n    matchesReady: function PDFFindController_matchesReady(matches) {\n      var offset = this.offset;\n      var numMatches = matches.length;\n      var previous = this.state.findPrevious;\n\n      if (numMatches) {\n        // There were matches for the page, so initialize the matchIdx.\n        this.hadMatch = true;\n        offset.matchIdx = (previous ? numMatches - 1 : 0);\n        this.updateMatch(true);\n        return true;\n      } else {\n        // No matches, so attempt to search the next page.\n        this.advanceOffsetPage(previous);\n        if (offset.wrapped) {\n          offset.matchIdx = null;\n          if (this.pagesToSearch < 0) {\n            // No point in wrapping again, there were no matches.\n            this.updateMatch(false);\n            // while matches were not found, searching for a page\n            // with matches should nevertheless halt.\n            return true;\n          }\n        }\n        // Matches were not found (and searching is not done).\n        return false;\n      }\n    },\n\n    /**\n     * The method is called back from the text layer when match presentation\n     * is updated.\n     * @param {number} pageIndex - page index.\n     * @param {number} index - match index.\n     * @param {Array} elements - text layer div elements array.\n     * @param {number} beginIdx - start index of the div array for the match.\n     * @param {number} endIdx - end index of the div array for the match.\n     */\n    updateMatchPosition: function PDFFindController_updateMatchPosition(\n        pageIndex, index, elements, beginIdx, endIdx) {\n      if (this.selected.matchIdx === index &&\n          this.selected.pageIdx === pageIndex) {\n        scrollIntoView(elements[beginIdx], {\n          top: FIND_SCROLL_OFFSET_TOP,\n          left: FIND_SCROLL_OFFSET_LEFT\n        });\n      }\n    },\n\n    nextPageMatch: function PDFFindController_nextPageMatch() {\n      if (this.resumePageIdx !== null) {\n        console.error('There can only be one pending page.');\n      }\n      do {\n        var pageIdx = this.offset.pageIdx;\n        var matches = this.pageMatches[pageIdx];\n        if (!matches) {\n          // The matches don't exist yet for processing by \"matchesReady\",\n          // so set a resume point for when they do exist.\n          this.resumePageIdx = pageIdx;\n          break;\n        }\n      } while (!this.matchesReady(matches));\n    },\n\n    advanceOffsetPage: function PDFFindController_advanceOffsetPage(previous) {\n      var offset = this.offset;\n      var numPages = this.extractTextPromises.length;\n      offset.pageIdx = (previous ? offset.pageIdx - 1 : offset.pageIdx + 1);\n      offset.matchIdx = null;\n\n      this.pagesToSearch--;\n\n      if (offset.pageIdx >= numPages || offset.pageIdx < 0) {\n        offset.pageIdx = (previous ? numPages - 1 : 0);\n        offset.wrapped = true;\n      }\n    },\n\n    updateMatch: function PDFFindController_updateMatch(found) {\n      var state = FindStates.FIND_NOTFOUND;\n      var wrapped = this.offset.wrapped;\n      this.offset.wrapped = false;\n\n      if (found) {\n        var previousPage = this.selected.pageIdx;\n        this.selected.pageIdx = this.offset.pageIdx;\n        this.selected.matchIdx = this.offset.matchIdx;\n        state = (wrapped ? FindStates.FIND_WRAPPED : FindStates.FIND_FOUND);\n        // Update the currently selected page to wipe out any selected matches.\n        if (previousPage !== -1 && previousPage !== this.selected.pageIdx) {\n          this.updatePage(previousPage);\n        }\n      }\n\n      this.updateUIState(state, this.state.findPrevious);\n      if (this.selected.pageIdx !== -1) {\n        this.updatePage(this.selected.pageIdx);\n      }\n    },\n\n    updateUIState: function PDFFindController_updateUIState(state, previous) {\n      if (this.integratedFind) {\n        FirefoxCom.request('updateFindControlState',\n                           { result: state, findPrevious: previous });\n        return;\n      }\n      if (this.findBar === null) {\n        throw new Error('PDFFindController is not initialized with a ' +\n                        'PDFFindBar instance.');\n      }\n      this.findBar.updateUIState(state, previous);\n    }\n  };\n  return PDFFindController;\n})();\n\n\nvar PDFHistory = {\n  initialized: false,\n  initialDestination: null,\n\n  /**\n   * @param {string} fingerprint\n   * @param {IPDFLinkService} linkService\n   */\n  initialize: function pdfHistoryInitialize(fingerprint, linkService) {\n    this.initialized = true;\n    this.reInitialized = false;\n    this.allowHashChange = true;\n    this.historyUnlocked = true;\n    this.isViewerInPresentationMode = false;\n\n    this.previousHash = window.location.hash.substring(1);\n    this.currentBookmark = '';\n    this.currentPage = 0;\n    this.updatePreviousBookmark = false;\n    this.previousBookmark = '';\n    this.previousPage = 0;\n    this.nextHashParam = '';\n\n    this.fingerprint = fingerprint;\n    this.linkService = linkService;\n    this.currentUid = this.uid = 0;\n    this.current = {};\n\n    var state = window.history.state;\n    if (this._isStateObjectDefined(state)) {\n      // This corresponds to navigating back to the document\n      // from another page in the browser history.\n      if (state.target.dest) {\n        this.initialDestination = state.target.dest;\n      } else {\n        linkService.setHash(state.target.hash);\n      }\n      this.currentUid = state.uid;\n      this.uid = state.uid + 1;\n      this.current = state.target;\n    } else {\n      // This corresponds to the loading of a new document.\n      if (state && state.fingerprint &&\n          this.fingerprint !== state.fingerprint) {\n        // Reinitialize the browsing history when a new document\n        // is opened in the web viewer.\n        this.reInitialized = true;\n      }\n      this._pushOrReplaceState({ fingerprint: this.fingerprint }, true);\n    }\n\n    var self = this;\n    window.addEventListener('popstate', function pdfHistoryPopstate(evt) {\n      evt.preventDefault();\n      evt.stopPropagation();\n\n      if (!self.historyUnlocked) {\n        return;\n      }\n      if (evt.state) {\n        // Move back/forward in the history.\n        self._goTo(evt.state);\n      } else {\n        // Handle the user modifying the hash of a loaded document.\n        self.previousHash = window.location.hash.substring(1);\n\n        // If the history is empty when the hash changes,\n        // update the previous entry in the browser history.\n        if (self.uid === 0) {\n          var previousParams = (self.previousHash && self.currentBookmark &&\n                                self.previousHash !== self.currentBookmark) ?\n            { hash: self.currentBookmark, page: self.currentPage } :\n            { page: 1 };\n          self.historyUnlocked = false;\n          self.allowHashChange = false;\n          window.history.back();\n          self._pushToHistory(previousParams, false, true);\n          window.history.forward();\n          self.historyUnlocked = true;\n        }\n        self._pushToHistory({ hash: self.previousHash }, false, true);\n        self._updatePreviousBookmark();\n      }\n    }, false);\n\n    function pdfHistoryBeforeUnload() {\n      var previousParams = self._getPreviousParams(null, true);\n      if (previousParams) {\n        var replacePrevious = (!self.current.dest &&\n                               self.current.hash !== self.previousHash);\n        self._pushToHistory(previousParams, false, replacePrevious);\n        self._updatePreviousBookmark();\n      }\n      // Remove the event listener when navigating away from the document,\n      // since 'beforeunload' prevents Firefox from caching the document.\n      window.removeEventListener('beforeunload', pdfHistoryBeforeUnload, false);\n    }\n    window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false);\n\n    window.addEventListener('pageshow', function pdfHistoryPageShow(evt) {\n      // If the entire viewer (including the PDF file) is cached in the browser,\n      // we need to reattach the 'beforeunload' event listener since\n      // the 'DOMContentLoaded' event is not fired on 'pageshow'.\n      window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false);\n    }, false);\n\n    window.addEventListener('presentationmodechanged', function(e) {\n      self.isViewerInPresentationMode = !!e.detail.active;\n    });\n  },\n\n  _isStateObjectDefined: function pdfHistory_isStateObjectDefined(state) {\n    return (state && state.uid >= 0 &&\n            state.fingerprint && this.fingerprint === state.fingerprint &&\n            state.target && state.target.hash) ? true : false;\n  },\n\n  _pushOrReplaceState: function pdfHistory_pushOrReplaceState(stateObj,\n                                                              replace) {\n    if (replace) {\n      window.history.replaceState(stateObj, '', document.URL);\n    } else {\n      window.history.pushState(stateObj, '', document.URL);\n    }\n  },\n\n  get isHashChangeUnlocked() {\n    if (!this.initialized) {\n      return true;\n    }\n    // If the current hash changes when moving back/forward in the history,\n    // this will trigger a 'popstate' event *as well* as a 'hashchange' event.\n    // Since the hash generally won't correspond to the exact the position\n    // stored in the history's state object, triggering the 'hashchange' event\n    // can thus corrupt the browser history.\n    //\n    // When the hash changes during a 'popstate' event, we *only* prevent the\n    // first 'hashchange' event and immediately reset allowHashChange.\n    // If it is not reset, the user would not be able to change the hash.\n\n    var temp = this.allowHashChange;\n    this.allowHashChange = true;\n    return temp;\n  },\n\n  _updatePreviousBookmark: function pdfHistory_updatePreviousBookmark() {\n    if (this.updatePreviousBookmark &&\n        this.currentBookmark && this.currentPage) {\n      this.previousBookmark = this.currentBookmark;\n      this.previousPage = this.currentPage;\n      this.updatePreviousBookmark = false;\n    }\n  },\n\n  updateCurrentBookmark: function pdfHistoryUpdateCurrentBookmark(bookmark,\n                                                                  pageNum) {\n    if (this.initialized) {\n      this.currentBookmark = bookmark.substring(1);\n      this.currentPage = pageNum | 0;\n      this._updatePreviousBookmark();\n    }\n  },\n\n  updateNextHashParam: function pdfHistoryUpdateNextHashParam(param) {\n    if (this.initialized) {\n      this.nextHashParam = param;\n    }\n  },\n\n  push: function pdfHistoryPush(params, isInitialBookmark) {\n    if (!(this.initialized && this.historyUnlocked)) {\n      return;\n    }\n    if (params.dest && !params.hash) {\n      params.hash = (this.current.hash && this.current.dest &&\n                     this.current.dest === params.dest) ?\n        this.current.hash :\n        this.linkService.getDestinationHash(params.dest).split('#')[1];\n    }\n    if (params.page) {\n      params.page |= 0;\n    }\n    if (isInitialBookmark) {\n      var target = window.history.state.target;\n      if (!target) {\n        // Invoked when the user specifies an initial bookmark,\n        // thus setting initialBookmark, when the document is loaded.\n        this._pushToHistory(params, false);\n        this.previousHash = window.location.hash.substring(1);\n      }\n      this.updatePreviousBookmark = this.nextHashParam ? false : true;\n      if (target) {\n        // If the current document is reloaded,\n        // avoid creating duplicate entries in the history.\n        this._updatePreviousBookmark();\n      }\n      return;\n    }\n    if (this.nextHashParam) {\n      if (this.nextHashParam === params.hash) {\n        this.nextHashParam = null;\n        this.updatePreviousBookmark = true;\n        return;\n      } else {\n        this.nextHashParam = null;\n      }\n    }\n\n    if (params.hash) {\n      if (this.current.hash) {\n        if (this.current.hash !== params.hash) {\n          this._pushToHistory(params, true);\n        } else {\n          if (!this.current.page && params.page) {\n            this._pushToHistory(params, false, true);\n          }\n          this.updatePreviousBookmark = true;\n        }\n      } else {\n        this._pushToHistory(params, true);\n      }\n    } else if (this.current.page && params.page &&\n               this.current.page !== params.page) {\n      this._pushToHistory(params, true);\n    }\n  },\n\n  _getPreviousParams: function pdfHistory_getPreviousParams(onlyCheckPage,\n                                                            beforeUnload) {\n    if (!(this.currentBookmark && this.currentPage)) {\n      return null;\n    } else if (this.updatePreviousBookmark) {\n      this.updatePreviousBookmark = false;\n    }\n    if (this.uid > 0 && !(this.previousBookmark && this.previousPage)) {\n      // Prevent the history from getting stuck in the current state,\n      // effectively preventing the user from going back/forward in the history.\n      //\n      // This happens if the current position in the document didn't change when\n      // the history was previously updated. The reasons for this are either:\n      // 1. The current zoom value is such that the document does not need to,\n      //    or cannot, be scrolled to display the destination.\n      // 2. The previous destination is broken, and doesn't actally point to a\n      //    position within the document.\n      //    (This is either due to a bad PDF generator, or the user making a\n      //     mistake when entering a destination in the hash parameters.)\n      return null;\n    }\n    if ((!this.current.dest && !onlyCheckPage) || beforeUnload) {\n      if (this.previousBookmark === this.currentBookmark) {\n        return null;\n      }\n    } else if (this.current.page || onlyCheckPage) {\n      if (this.previousPage === this.currentPage) {\n        return null;\n      }\n    } else {\n      return null;\n    }\n    var params = { hash: this.currentBookmark, page: this.currentPage };\n    if (this.isViewerInPresentationMode) {\n      params.hash = null;\n    }\n    return params;\n  },\n\n  _stateObj: function pdfHistory_stateObj(params) {\n    return { fingerprint: this.fingerprint, uid: this.uid, target: params };\n  },\n\n  _pushToHistory: function pdfHistory_pushToHistory(params,\n                                                    addPrevious, overwrite) {\n    if (!this.initialized) {\n      return;\n    }\n    if (!params.hash && params.page) {\n      params.hash = ('page=' + params.page);\n    }\n    if (addPrevious && !overwrite) {\n      var previousParams = this._getPreviousParams();\n      if (previousParams) {\n        var replacePrevious = (!this.current.dest &&\n                               this.current.hash !== this.previousHash);\n        this._pushToHistory(previousParams, false, replacePrevious);\n      }\n    }\n    this._pushOrReplaceState(this._stateObj(params),\n                             (overwrite || this.uid === 0));\n    this.currentUid = this.uid++;\n    this.current = params;\n    this.updatePreviousBookmark = true;\n  },\n\n  _goTo: function pdfHistory_goTo(state) {\n    if (!(this.initialized && this.historyUnlocked &&\n          this._isStateObjectDefined(state))) {\n      return;\n    }\n    if (!this.reInitialized && state.uid < this.currentUid) {\n      var previousParams = this._getPreviousParams(true);\n      if (previousParams) {\n        this._pushToHistory(this.current, false);\n        this._pushToHistory(previousParams, false);\n        this.currentUid = state.uid;\n        window.history.back();\n        return;\n      }\n    }\n    this.historyUnlocked = false;\n\n    if (state.target.dest) {\n      this.linkService.navigateTo(state.target.dest);\n    } else {\n      this.linkService.setHash(state.target.hash);\n    }\n    this.currentUid = state.uid;\n    if (state.uid > this.uid) {\n      this.uid = state.uid;\n    }\n    this.current = state.target;\n    this.updatePreviousBookmark = true;\n\n    var currentHash = window.location.hash.substring(1);\n    if (this.previousHash !== currentHash) {\n      this.allowHashChange = false;\n    }\n    this.previousHash = currentHash;\n\n    this.historyUnlocked = true;\n  },\n\n  back: function pdfHistoryBack() {\n    this.go(-1);\n  },\n\n  forward: function pdfHistoryForward() {\n    this.go(1);\n  },\n\n  go: function pdfHistoryGo(direction) {\n    if (this.initialized && this.historyUnlocked) {\n      var state = window.history.state;\n      if (direction === -1 && state && state.uid > 0) {\n        window.history.back();\n      } else if (direction === 1 && state && state.uid < (this.uid - 1)) {\n        window.history.forward();\n      }\n    }\n  }\n};\n\n\nvar SecondaryToolbar = {\n  opened: false,\n  previousContainerHeight: null,\n  newContainerHeight: null,\n\n  initialize: function secondaryToolbarInitialize(options) {\n    this.toolbar = options.toolbar;\n    this.buttonContainer = this.toolbar.firstElementChild;\n\n    // Define the toolbar buttons.\n    this.toggleButton = options.toggleButton;\n    this.presentationModeButton = options.presentationModeButton;\n    this.openFile = options.openFile;\n    this.print = options.print;\n    this.download = options.download;\n    this.viewBookmark = options.viewBookmark;\n    this.firstPage = options.firstPage;\n    this.lastPage = options.lastPage;\n    this.pageRotateCw = options.pageRotateCw;\n    this.pageRotateCcw = options.pageRotateCcw;\n    this.documentPropertiesButton = options.documentPropertiesButton;\n\n    // Attach the event listeners.\n    var elements = [\n      // Button to toggle the visibility of the secondary toolbar:\n      { element: this.toggleButton, handler: this.toggle },\n      // All items within the secondary toolbar\n      // (except for toggleHandTool, hand_tool.js is responsible for it):\n      { element: this.presentationModeButton,\n        handler: this.presentationModeClick },\n      { element: this.openFile, handler: this.openFileClick },\n      { element: this.print, handler: this.printClick },\n      { element: this.download, handler: this.downloadClick },\n      { element: this.viewBookmark, handler: this.viewBookmarkClick },\n      { element: this.firstPage, handler: this.firstPageClick },\n      { element: this.lastPage, handler: this.lastPageClick },\n      { element: this.pageRotateCw, handler: this.pageRotateCwClick },\n      { element: this.pageRotateCcw, handler: this.pageRotateCcwClick },\n      { element: this.documentPropertiesButton,\n        handler: this.documentPropertiesClick }\n    ];\n\n    for (var item in elements) {\n      var element = elements[item].element;\n      if (element) {\n        element.addEventListener('click', elements[item].handler.bind(this));\n      }\n    }\n  },\n\n  // Event handling functions.\n  presentationModeClick: function secondaryToolbarPresentationModeClick(evt) {\n    PDFViewerApplication.requestPresentationMode();\n    this.close();\n  },\n\n  openFileClick: function secondaryToolbarOpenFileClick(evt) {\n    document.getElementById('fileInput').click();\n    this.close();\n  },\n\n  printClick: function secondaryToolbarPrintClick(evt) {\n    window.print();\n    this.close();\n  },\n\n  downloadClick: function secondaryToolbarDownloadClick(evt) {\n    PDFViewerApplication.download();\n    this.close();\n  },\n\n  viewBookmarkClick: function secondaryToolbarViewBookmarkClick(evt) {\n    this.close();\n  },\n\n  firstPageClick: function secondaryToolbarFirstPageClick(evt) {\n    PDFViewerApplication.page = 1;\n    this.close();\n  },\n\n  lastPageClick: function secondaryToolbarLastPageClick(evt) {\n    if (PDFViewerApplication.pdfDocument) {\n      PDFViewerApplication.page = PDFViewerApplication.pagesCount;\n    }\n    this.close();\n  },\n\n  pageRotateCwClick: function secondaryToolbarPageRotateCwClick(evt) {\n    PDFViewerApplication.rotatePages(90);\n  },\n\n  pageRotateCcwClick: function secondaryToolbarPageRotateCcwClick(evt) {\n    PDFViewerApplication.rotatePages(-90);\n  },\n\n  documentPropertiesClick: function secondaryToolbarDocumentPropsClick(evt) {\n    PDFViewerApplication.pdfDocumentProperties.open();\n    this.close();\n  },\n\n  // Misc. functions for interacting with the toolbar.\n  setMaxHeight: function secondaryToolbarSetMaxHeight(container) {\n    if (!container || !this.buttonContainer) {\n      return;\n    }\n    this.newContainerHeight = container.clientHeight;\n    if (this.previousContainerHeight === this.newContainerHeight) {\n      return;\n    }\n    this.buttonContainer.setAttribute('style',\n      'max-height: ' + (this.newContainerHeight - SCROLLBAR_PADDING) + 'px;');\n    this.previousContainerHeight = this.newContainerHeight;\n  },\n\n  open: function secondaryToolbarOpen() {\n    if (this.opened) {\n      return;\n    }\n    this.opened = true;\n    this.toggleButton.classList.add('toggled');\n    this.toolbar.classList.remove('hidden');\n  },\n\n  close: function secondaryToolbarClose(target) {\n    if (!this.opened) {\n      return;\n    } else if (target && !this.toolbar.contains(target)) {\n      return;\n    }\n    this.opened = false;\n    this.toolbar.classList.add('hidden');\n    this.toggleButton.classList.remove('toggled');\n  },\n\n  toggle: function secondaryToolbarToggle() {\n    if (this.opened) {\n      this.close();\n    } else {\n      this.open();\n    }\n  }\n};\n\n\nvar DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1500; // in ms\nvar DELAY_BEFORE_HIDING_CONTROLS = 3000; // in ms\nvar ACTIVE_SELECTOR = 'pdfPresentationMode';\nvar CONTROLS_SELECTOR = 'pdfPresentationModeControls';\n\n/**\n * @typedef {Object} PDFPresentationModeOptions\n * @property {HTMLDivElement} container - The container for the viewer element.\n * @property {HTMLDivElement} viewer - (optional) The viewer element.\n * @property {PDFThumbnailViewer} pdfThumbnailViewer - (optional) The thumbnail\n *   viewer.\n * @property {Array} contextMenuItems - (optional) The menuitems that are added\n *   to the context menu in Presentation Mode.\n */\n\n/**\n * @class\n */\nvar PDFPresentationMode = (function PDFPresentationModeClosure() {\n  /**\n   * @constructs PDFPresentationMode\n   * @param {PDFPresentationModeOptions} options\n   */\n  function PDFPresentationMode(options) {\n    this.container = options.container;\n    this.viewer = options.viewer || options.container.firstElementChild;\n    this.pdfThumbnailViewer = options.pdfThumbnailViewer || null;\n    var contextMenuItems = options.contextMenuItems || null;\n\n    this.active = false;\n    this.args = null;\n    this.contextMenuOpen = false;\n    this.mouseScrollTimeStamp = 0;\n    this.mouseScrollDelta = 0;\n\n    if (contextMenuItems) {\n      for (var i = 0, ii = contextMenuItems.length; i < ii; i++) {\n        var item = contextMenuItems[i];\n        item.element.addEventListener('click', function (handler) {\n          this.contextMenuOpen = false;\n          handler();\n        }.bind(this, item.handler));\n      }\n    }\n  }\n\n  PDFPresentationMode.prototype = {\n    /**\n     * Request the browser to enter fullscreen mode.\n     * @returns {boolean} Indicating if the request was successful.\n     */\n    request: function PDFPresentationMode_request() {\n      if (this.switchInProgress || this.active ||\n          !this.viewer.hasChildNodes()) {\n        return false;\n      }\n      this._addFullscreenChangeListeners();\n      this._setSwitchInProgress();\n      this._notifyStateChange();\n\n      if (this.container.requestFullscreen) {\n        this.container.requestFullscreen();\n      } else if (this.container.mozRequestFullScreen) {\n        this.container.mozRequestFullScreen();\n      } else if (this.container.webkitRequestFullscreen) {\n        this.container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);\n      } else if (this.container.msRequestFullscreen) {\n        this.container.msRequestFullscreen();\n      } else {\n        return false;\n      }\n\n      this.args = {\n        page: PDFViewerApplication.page,\n        previousScale: PDFViewerApplication.currentScaleValue\n      };\n\n      return true;\n    },\n\n    /**\n     * Switches page when the user scrolls (using a scroll wheel or a touchpad)\n     * with large enough motion, to prevent accidental page switches.\n     * @param {number} delta - The delta value from the mouse event.\n     */\n    mouseScroll: function PDFPresentationMode_mouseScroll(delta) {\n      if (!this.active) {\n        return;\n      }\n      var MOUSE_SCROLL_COOLDOWN_TIME = 50;\n      var PAGE_SWITCH_THRESHOLD = 120;\n      var PageSwitchDirection = {\n        UP: -1,\n        DOWN: 1\n      };\n\n      var currentTime = (new Date()).getTime();\n      var storedTime = this.mouseScrollTimeStamp;\n\n      // If we've already switched page, avoid accidentally switching again.\n      if (currentTime > storedTime &&\n          currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) {\n        return;\n      }\n      // If the scroll direction changed, reset the accumulated scroll delta.\n      if ((this.mouseScrollDelta > 0 && delta < 0) ||\n          (this.mouseScrollDelta < 0 && delta > 0)) {\n        this._resetMouseScrollState();\n      }\n      this.mouseScrollDelta += delta;\n\n      if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) {\n        var pageSwitchDirection = (this.mouseScrollDelta > 0) ?\n          PageSwitchDirection.UP : PageSwitchDirection.DOWN;\n        var page = PDFViewerApplication.page;\n        this._resetMouseScrollState();\n\n        // If we're at the first/last page, we don't need to do anything.\n        if ((page === 1 && pageSwitchDirection === PageSwitchDirection.UP) ||\n            (page === PDFViewerApplication.pagesCount &&\n             pageSwitchDirection === PageSwitchDirection.DOWN)) {\n          return;\n        }\n        PDFViewerApplication.page = (page + pageSwitchDirection);\n        this.mouseScrollTimeStamp = currentTime;\n      }\n    },\n\n    get isFullscreen() {\n      return !!(document.fullscreenElement ||\n                document.mozFullScreen ||\n                document.webkitIsFullScreen ||\n                document.msFullscreenElement);\n    },\n\n    /**\n     * @private\n     */\n    _notifyStateChange: function PDFPresentationMode_notifyStateChange() {\n      var event = document.createEvent('CustomEvent');\n      event.initCustomEvent('presentationmodechanged', true, true, {\n        active: this.active,\n        switchInProgress: !!this.switchInProgress\n      });\n      window.dispatchEvent(event);\n    },\n\n    /**\n     * Used to initialize a timeout when requesting Presentation Mode,\n     * i.e. when the browser is requested to enter fullscreen mode.\n     * This timeout is used to prevent the current page from being scrolled\n     * partially, or completely, out of view when entering Presentation Mode.\n     * NOTE: This issue seems limited to certain zoom levels (e.g. page-width).\n     * @private\n     */\n    _setSwitchInProgress: function PDFPresentationMode_setSwitchInProgress() {\n      if (this.switchInProgress) {\n        clearTimeout(this.switchInProgress);\n      }\n      this.switchInProgress = setTimeout(function switchInProgressTimeout() {\n        this._removeFullscreenChangeListeners();\n        delete this.switchInProgress;\n        this._notifyStateChange();\n      }.bind(this), DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);\n    },\n\n    /**\n     * @private\n     */\n    _resetSwitchInProgress:\n        function PDFPresentationMode_resetSwitchInProgress() {\n      if (this.switchInProgress) {\n        clearTimeout(this.switchInProgress);\n        delete this.switchInProgress;\n      }\n    },\n\n    /**\n     * @private\n     */\n    _enter: function PDFPresentationMode_enter() {\n      this.active = true;\n      this._resetSwitchInProgress();\n      this._notifyStateChange();\n      this.container.classList.add(ACTIVE_SELECTOR);\n\n      // Ensure that the correct page is scrolled into view when entering\n      // Presentation Mode, by waiting until fullscreen mode in enabled.\n      setTimeout(function enterPresentationModeTimeout() {\n        PDFViewerApplication.page = this.args.page;\n        PDFViewerApplication.setScale('page-fit', true);\n      }.bind(this), 0);\n\n      this._addWindowListeners();\n      this._showControls();\n      this.contextMenuOpen = false;\n      this.container.setAttribute('contextmenu', 'viewerContextMenu');\n\n      // Text selection is disabled in Presentation Mode, thus it's not possible\n      // for the user to deselect text that is selected (e.g. with \"Select all\")\n      // when entering Presentation Mode, hence we remove any active selection.\n      window.getSelection().removeAllRanges();\n    },\n\n    /**\n     * @private\n     */\n    _exit: function PDFPresentationMode_exit() {\n      var page = PDFViewerApplication.page;\n      this.container.classList.remove(ACTIVE_SELECTOR);\n\n      // Ensure that the correct page is scrolled into view when exiting\n      // Presentation Mode, by waiting until fullscreen mode is disabled.\n      setTimeout(function exitPresentationModeTimeout() {\n        this.active = false;\n        this._removeFullscreenChangeListeners();\n        this._notifyStateChange();\n\n        PDFViewerApplication.setScale(this.args.previousScale, true);\n        PDFViewerApplication.page = page;\n        this.args = null;\n      }.bind(this), 0);\n\n      this._removeWindowListeners();\n      this._hideControls();\n      this._resetMouseScrollState();\n      this.container.removeAttribute('contextmenu');\n      this.contextMenuOpen = false;\n\n      if (this.pdfThumbnailViewer) {\n        this.pdfThumbnailViewer.ensureThumbnailVisible(page);\n      }\n    },\n\n    /**\n     * @private\n     */\n    _mouseDown: function PDFPresentationMode_mouseDown(evt) {\n      if (this.contextMenuOpen) {\n        this.contextMenuOpen = false;\n        evt.preventDefault();\n        return;\n      }\n      if (evt.button === 0) {\n        // Enable clicking of links in presentation mode. Please note:\n        // Only links pointing to destinations in the current PDF document work.\n        var isInternalLink = (evt.target.href &&\n                              evt.target.classList.contains('internalLink'));\n        if (!isInternalLink) {\n          // Unless an internal link was clicked, advance one page.\n          evt.preventDefault();\n          PDFViewerApplication.page += (evt.shiftKey ? -1 : 1);\n        }\n      }\n    },\n\n    /**\n     * @private\n     */\n    _contextMenu: function PDFPresentationMode_contextMenu() {\n      this.contextMenuOpen = true;\n    },\n\n    /**\n     * @private\n     */\n    _showControls: function PDFPresentationMode_showControls() {\n      if (this.controlsTimeout) {\n        clearTimeout(this.controlsTimeout);\n      } else {\n        this.container.classList.add(CONTROLS_SELECTOR);\n      }\n      this.controlsTimeout = setTimeout(function showControlsTimeout() {\n        this.container.classList.remove(CONTROLS_SELECTOR);\n        delete this.controlsTimeout;\n      }.bind(this), DELAY_BEFORE_HIDING_CONTROLS);\n    },\n\n    /**\n     * @private\n     */\n    _hideControls: function PDFPresentationMode_hideControls() {\n      if (!this.controlsTimeout) {\n        return;\n      }\n      clearTimeout(this.controlsTimeout);\n      this.container.classList.remove(CONTROLS_SELECTOR);\n      delete this.controlsTimeout;\n    },\n\n    /**\n     * Resets the properties used for tracking mouse scrolling events.\n     * @private\n     */\n    _resetMouseScrollState:\n        function PDFPresentationMode_resetMouseScrollState() {\n      this.mouseScrollTimeStamp = 0;\n      this.mouseScrollDelta = 0;\n    },\n\n    /**\n     * @private\n     */\n    _addWindowListeners: function PDFPresentationMode_addWindowListeners() {\n      this.showControlsBind = this._showControls.bind(this);\n      this.mouseDownBind = this._mouseDown.bind(this);\n      this.resetMouseScrollStateBind = this._resetMouseScrollState.bind(this);\n      this.contextMenuBind = this._contextMenu.bind(this);\n\n      window.addEventListener('mousemove', this.showControlsBind);\n      window.addEventListener('mousedown', this.mouseDownBind);\n      window.addEventListener('keydown', this.resetMouseScrollStateBind);\n      window.addEventListener('contextmenu', this.contextMenuBind);\n    },\n\n    /**\n     * @private\n     */\n    _removeWindowListeners:\n        function PDFPresentationMode_removeWindowListeners() {\n      window.removeEventListener('mousemove', this.showControlsBind);\n      window.removeEventListener('mousedown', this.mouseDownBind);\n      window.removeEventListener('keydown', this.resetMouseScrollStateBind);\n      window.removeEventListener('contextmenu', this.contextMenuBind);\n\n      delete this.showControlsBind;\n      delete this.mouseDownBind;\n      delete this.resetMouseScrollStateBind;\n      delete this.contextMenuBind;\n    },\n\n    /**\n     * @private\n     */\n    _fullscreenChange: function PDFPresentationMode_fullscreenChange() {\n      if (this.isFullscreen) {\n        this._enter();\n      } else {\n        this._exit();\n      }\n    },\n\n    /**\n     * @private\n     */\n    _addFullscreenChangeListeners:\n        function PDFPresentationMode_addFullscreenChangeListeners() {\n      this.fullscreenChangeBind = this._fullscreenChange.bind(this);\n\n      window.addEventListener('fullscreenchange', this.fullscreenChangeBind);\n      window.addEventListener('mozfullscreenchange', this.fullscreenChangeBind);\n      window.addEventListener('webkitfullscreenchange',\n                              this.fullscreenChangeBind);\n      window.addEventListener('MSFullscreenChange', this.fullscreenChangeBind);\n    },\n\n    /**\n     * @private\n     */\n    _removeFullscreenChangeListeners:\n        function PDFPresentationMode_removeFullscreenChangeListeners() {\n      window.removeEventListener('fullscreenchange', this.fullscreenChangeBind);\n      window.removeEventListener('mozfullscreenchange',\n                                 this.fullscreenChangeBind);\n      window.removeEventListener('webkitfullscreenchange',\n                              this.fullscreenChangeBind);\n      window.removeEventListener('MSFullscreenChange',\n                                 this.fullscreenChangeBind);\n\n      delete this.fullscreenChangeBind;\n    }\n  };\n\n  return PDFPresentationMode;\n})();\n\n\n/* Copyright 2013 Rob Wu <gwnRob@gmail.com>\n * https://github.com/Rob--W/grab-to-pan.js\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n'use strict';\n\nvar GrabToPan = (function GrabToPanClosure() {\n  /**\n   * Construct a GrabToPan instance for a given HTML element.\n   * @param options.element {Element}\n   * @param options.ignoreTarget {function} optional. See `ignoreTarget(node)`\n   * @param options.onActiveChanged {function(boolean)} optional. Called\n   *  when grab-to-pan is (de)activated. The first argument is a boolean that\n   *  shows whether grab-to-pan is activated.\n   */\n  function GrabToPan(options) {\n    this.element = options.element;\n    this.document = options.element.ownerDocument;\n    if (typeof options.ignoreTarget === 'function') {\n      this.ignoreTarget = options.ignoreTarget;\n    }\n    this.onActiveChanged = options.onActiveChanged;\n\n    // Bind the contexts to ensure that `this` always points to\n    // the GrabToPan instance.\n    this.activate = this.activate.bind(this);\n    this.deactivate = this.deactivate.bind(this);\n    this.toggle = this.toggle.bind(this);\n    this._onmousedown = this._onmousedown.bind(this);\n    this._onmousemove = this._onmousemove.bind(this);\n    this._endPan = this._endPan.bind(this);\n\n    // This overlay will be inserted in the document when the mouse moves during\n    // a grab operation, to ensure that the cursor has the desired appearance.\n    var overlay = this.overlay = document.createElement('div');\n    overlay.className = 'grab-to-pan-grabbing';\n  }\n  GrabToPan.prototype = {\n    /**\n     * Class name of element which can be grabbed\n     */\n    CSS_CLASS_GRAB: 'grab-to-pan-grab',\n\n    /**\n     * Bind a mousedown event to the element to enable grab-detection.\n     */\n    activate: function GrabToPan_activate() {\n      if (!this.active) {\n        this.active = true;\n        this.element.addEventListener('mousedown', this._onmousedown, true);\n        this.element.classList.add(this.CSS_CLASS_GRAB);\n        if (this.onActiveChanged) {\n          this.onActiveChanged(true);\n        }\n      }\n    },\n\n    /**\n     * Removes all events. Any pending pan session is immediately stopped.\n     */\n    deactivate: function GrabToPan_deactivate() {\n      if (this.active) {\n        this.active = false;\n        this.element.removeEventListener('mousedown', this._onmousedown, true);\n        this._endPan();\n        this.element.classList.remove(this.CSS_CLASS_GRAB);\n        if (this.onActiveChanged) {\n          this.onActiveChanged(false);\n        }\n      }\n    },\n\n    toggle: function GrabToPan_toggle() {\n      if (this.active) {\n        this.deactivate();\n      } else {\n        this.activate();\n      }\n    },\n\n    /**\n     * Whether to not pan if the target element is clicked.\n     * Override this method to change the default behaviour.\n     *\n     * @param node {Element} The target of the event\n     * @return {boolean} Whether to not react to the click event.\n     */\n    ignoreTarget: function GrabToPan_ignoreTarget(node) {\n      // Use matchesSelector to check whether the clicked element\n      // is (a child of) an input element / link\n      return node[matchesSelector](\n        'a[href], a[href] *, input, textarea, button, button *, select, option'\n      );\n    },\n\n    /**\n     * @private\n     */\n    _onmousedown: function GrabToPan__onmousedown(event) {\n      if (event.button !== 0 || this.ignoreTarget(event.target)) {\n        return;\n      }\n      if (event.originalTarget) {\n        try {\n          /* jshint expr:true */\n          event.originalTarget.tagName;\n        } catch (e) {\n          // Mozilla-specific: element is a scrollbar (XUL element)\n          return;\n        }\n      }\n\n      this.scrollLeftStart = this.element.scrollLeft;\n      this.scrollTopStart = this.element.scrollTop;\n      this.clientXStart = event.clientX;\n      this.clientYStart = event.clientY;\n      this.document.addEventListener('mousemove', this._onmousemove, true);\n      this.document.addEventListener('mouseup', this._endPan, true);\n      // When a scroll event occurs before a mousemove, assume that the user\n      // dragged a scrollbar (necessary for Opera Presto, Safari and IE)\n      // (not needed for Chrome/Firefox)\n      this.element.addEventListener('scroll', this._endPan, true);\n      event.preventDefault();\n      event.stopPropagation();\n      this.document.documentElement.classList.add(this.CSS_CLASS_GRABBING);\n\n      var focusedElement = document.activeElement;\n      if (focusedElement && !focusedElement.contains(event.target)) {\n        focusedElement.blur();\n      }\n    },\n\n    /**\n     * @private\n     */\n    _onmousemove: function GrabToPan__onmousemove(event) {\n      this.element.removeEventListener('scroll', this._endPan, true);\n      if (isLeftMouseReleased(event)) {\n        this._endPan();\n        return;\n      }\n      var xDiff = event.clientX - this.clientXStart;\n      var yDiff = event.clientY - this.clientYStart;\n      this.element.scrollTop = this.scrollTopStart - yDiff;\n      this.element.scrollLeft = this.scrollLeftStart - xDiff;\n      if (!this.overlay.parentNode) {\n        document.body.appendChild(this.overlay);\n      }\n    },\n\n    /**\n     * @private\n     */\n    _endPan: function GrabToPan__endPan() {\n      this.element.removeEventListener('scroll', this._endPan, true);\n      this.document.removeEventListener('mousemove', this._onmousemove, true);\n      this.document.removeEventListener('mouseup', this._endPan, true);\n      if (this.overlay.parentNode) {\n        this.overlay.parentNode.removeChild(this.overlay);\n      }\n    }\n  };\n\n  // Get the correct (vendor-prefixed) name of the matches method.\n  var matchesSelector;\n  ['webkitM', 'mozM', 'msM', 'oM', 'm'].some(function(prefix) {\n    var name = prefix + 'atches';\n    if (name in document.documentElement) {\n      matchesSelector = name;\n    }\n    name += 'Selector';\n    if (name in document.documentElement) {\n      matchesSelector = name;\n    }\n    return matchesSelector; // If found, then truthy, and [].some() ends.\n  });\n\n  // Browser sniffing because it's impossible to feature-detect\n  // whether event.which for onmousemove is reliable\n  var isNotIEorIsIE10plus = !document.documentMode || document.documentMode > 9;\n  var chrome = window.chrome;\n  var isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app);\n  //                                       ^ Chrome 15+       ^ Opera 15+\n  var isSafari6plus = /Apple/.test(navigator.vendor) &&\n                      /Version\\/([6-9]\\d*|[1-5]\\d+)/.test(navigator.userAgent);\n\n  /**\n   * Whether the left mouse is not pressed.\n   * @param event {MouseEvent}\n   * @return {boolean} True if the left mouse button is not pressed.\n   *                   False if unsure or if the left mouse button is pressed.\n   */\n  function isLeftMouseReleased(event) {\n    if ('buttons' in event && isNotIEorIsIE10plus) {\n      // http://www.w3.org/TR/DOM-Level-3-Events/#events-MouseEvent-buttons\n      // Firefox 15+\n      // Internet Explorer 10+\n      return !(event.buttons | 1);\n    }\n    if (isChrome15OrOpera15plus || isSafari6plus) {\n      // Chrome 14+\n      // Opera 15+\n      // Safari 6.0+\n      return event.which === 0;\n    }\n  }\n\n  return GrabToPan;\n})();\n\nvar HandTool = {\n  initialize: function handToolInitialize(options) {\n    var toggleHandTool = options.toggleHandTool;\n    this.handTool = new GrabToPan({\n      element: options.container,\n      onActiveChanged: function(isActive) {\n        if (!toggleHandTool) {\n          return;\n        }\n        if (isActive) {\n          toggleHandTool.title =\n            mozL10n.get('hand_tool_disable.title', null, 'Disable hand tool');\n          toggleHandTool.firstElementChild.textContent =\n            mozL10n.get('hand_tool_disable_label', null, 'Disable hand tool');\n        } else {\n          toggleHandTool.title =\n            mozL10n.get('hand_tool_enable.title', null, 'Enable hand tool');\n          toggleHandTool.firstElementChild.textContent =\n            mozL10n.get('hand_tool_enable_label', null, 'Enable hand tool');\n        }\n      }\n    });\n    if (toggleHandTool) {\n      toggleHandTool.addEventListener('click', this.toggle.bind(this), false);\n\n      window.addEventListener('localized', function (evt) {\n        Preferences.get('enableHandToolOnLoad').then(function resolved(value) {\n          if (value) {\n            this.handTool.activate();\n          }\n        }.bind(this), function rejected(reason) {});\n      }.bind(this));\n\n      window.addEventListener('presentationmodechanged', function (evt) {\n        if (evt.detail.switchInProgress) {\n          return;\n        }\n        if (evt.detail.active) {\n          this.enterPresentationMode();\n        } else {\n          this.exitPresentationMode();\n        }\n      }.bind(this));\n    }\n  },\n\n  toggle: function handToolToggle() {\n    this.handTool.toggle();\n    SecondaryToolbar.close();\n  },\n\n  enterPresentationMode: function handToolEnterPresentationMode() {\n    if (this.handTool.active) {\n      this.wasActive = true;\n      this.handTool.deactivate();\n    }\n  },\n\n  exitPresentationMode: function handToolExitPresentationMode() {\n    if (this.wasActive) {\n      this.wasActive = null;\n      this.handTool.activate();\n    }\n  }\n};\n\n\nvar OverlayManager = {\n  overlays: {},\n  active: null,\n\n  /**\n   * @param {string} name The name of the overlay that is registered. This must\n   *                 be equal to the ID of the overlay's DOM element.\n   * @param {function} callerCloseMethod (optional) The method that, if present,\n   *                   will call OverlayManager.close from the Object\n   *                   registering the overlay. Access to this method is\n   *                   necessary in order to run cleanup code when e.g.\n   *                   the overlay is force closed. The default is null.\n   * @param {boolean} canForceClose (optional) Indicates if opening the overlay\n   *                  will close an active overlay. The default is false.\n   * @returns {Promise} A promise that is resolved when the overlay has been\n   *                    registered.\n   */\n  register: function overlayManagerRegister(name,\n                                            callerCloseMethod, canForceClose) {\n    return new Promise(function (resolve) {\n      var element, container;\n      if (!name || !(element = document.getElementById(name)) ||\n          !(container = element.parentNode)) {\n        throw new Error('Not enough parameters.');\n      } else if (this.overlays[name]) {\n        throw new Error('The overlay is already registered.');\n      }\n      this.overlays[name] = { element: element,\n                              container: container,\n                              callerCloseMethod: (callerCloseMethod || null),\n                              canForceClose: (canForceClose || false) };\n      resolve();\n    }.bind(this));\n  },\n\n  /**\n   * @param {string} name The name of the overlay that is unregistered.\n   * @returns {Promise} A promise that is resolved when the overlay has been\n   *                    unregistered.\n   */\n  unregister: function overlayManagerUnregister(name) {\n    return new Promise(function (resolve) {\n      if (!this.overlays[name]) {\n        throw new Error('The overlay does not exist.');\n      } else if (this.active === name) {\n        throw new Error('The overlay cannot be removed while it is active.');\n      }\n      delete this.overlays[name];\n\n      resolve();\n    }.bind(this));\n  },\n\n  /**\n   * @param {string} name The name of the overlay that should be opened.\n   * @returns {Promise} A promise that is resolved when the overlay has been\n   *                    opened.\n   */\n  open: function overlayManagerOpen(name) {\n    return new Promise(function (resolve) {\n      if (!this.overlays[name]) {\n        throw new Error('The overlay does not exist.');\n      } else if (this.active) {\n        if (this.overlays[name].canForceClose) {\n          this._closeThroughCaller();\n        } else if (this.active === name) {\n          throw new Error('The overlay is already active.');\n        } else {\n          throw new Error('Another overlay is currently active.');\n        }\n      }\n      this.active = name;\n      this.overlays[this.active].element.classList.remove('hidden');\n      this.overlays[this.active].container.classList.remove('hidden');\n\n      window.addEventListener('keydown', this._keyDown);\n      resolve();\n    }.bind(this));\n  },\n\n  /**\n   * @param {string} name The name of the overlay that should be closed.\n   * @returns {Promise} A promise that is resolved when the overlay has been\n   *                    closed.\n   */\n  close: function overlayManagerClose(name) {\n    return new Promise(function (resolve) {\n      if (!this.overlays[name]) {\n        throw new Error('The overlay does not exist.');\n      } else if (!this.active) {\n        throw new Error('The overlay is currently not active.');\n      } else if (this.active !== name) {\n        throw new Error('Another overlay is currently active.');\n      }\n      this.overlays[this.active].container.classList.add('hidden');\n      this.overlays[this.active].element.classList.add('hidden');\n      this.active = null;\n\n      window.removeEventListener('keydown', this._keyDown);\n      resolve();\n    }.bind(this));\n  },\n\n  /**\n   * @private\n   */\n  _keyDown: function overlayManager_keyDown(evt) {\n    var self = OverlayManager;\n    if (self.active && evt.keyCode === 27) { // Esc key.\n      self._closeThroughCaller();\n      evt.preventDefault();\n    }\n  },\n\n  /**\n   * @private\n   */\n  _closeThroughCaller: function overlayManager_closeThroughCaller() {\n    if (this.overlays[this.active].callerCloseMethod) {\n      this.overlays[this.active].callerCloseMethod();\n    }\n    if (this.active) {\n      this.close(this.active);\n    }\n  }\n};\n\n\nvar PasswordPrompt = {\n  overlayName: null,\n  updatePassword: null,\n  reason: null,\n  passwordField: null,\n  passwordText: null,\n  passwordSubmit: null,\n  passwordCancel: null,\n\n  initialize: function secondaryToolbarInitialize(options) {\n    this.overlayName = options.overlayName;\n    this.passwordField = options.passwordField;\n    this.passwordText = options.passwordText;\n    this.passwordSubmit = options.passwordSubmit;\n    this.passwordCancel = options.passwordCancel;\n\n    // Attach the event listeners.\n    this.passwordSubmit.addEventListener('click',\n      this.verifyPassword.bind(this));\n\n    this.passwordCancel.addEventListener('click', this.close.bind(this));\n\n    this.passwordField.addEventListener('keydown', function (e) {\n      if (e.keyCode === 13) { // Enter key\n        this.verifyPassword();\n      }\n    }.bind(this));\n\n    OverlayManager.register(this.overlayName, this.close.bind(this), true);\n  },\n\n  open: function passwordPromptOpen() {\n    OverlayManager.open(this.overlayName).then(function () {\n      this.passwordField.focus();\n\n      var promptString = mozL10n.get('password_label', null,\n        'Enter the password to open this PDF file.');\n\n      if (this.reason === PDFJS.PasswordResponses.INCORRECT_PASSWORD) {\n        promptString = mozL10n.get('password_invalid', null,\n          'Invalid password. Please try again.');\n      }\n\n      this.passwordText.textContent = promptString;\n    }.bind(this));\n  },\n\n  close: function passwordPromptClose() {\n    OverlayManager.close(this.overlayName).then(function () {\n      this.passwordField.value = '';\n    }.bind(this));\n  },\n\n  verifyPassword: function passwordPromptVerifyPassword() {\n    var password = this.passwordField.value;\n    if (password && password.length > 0) {\n      this.close();\n      return this.updatePassword(password);\n    }\n  }\n};\n\n\n/**\n * @typedef {Object} PDFDocumentPropertiesOptions\n * @property {string} overlayName - Name/identifier for the overlay.\n * @property {Object} fields - Names and elements of the overlay's fields.\n * @property {HTMLButtonElement} closeButton - Button for closing the overlay.\n */\n\n/**\n * @class\n */\nvar PDFDocumentProperties = (function PDFDocumentPropertiesClosure() {\n  /**\n   * @constructs PDFDocumentProperties\n   * @param {PDFDocumentPropertiesOptions} options\n   */\n  function PDFDocumentProperties(options) {\n    this.fields = options.fields;\n    this.overlayName = options.overlayName;\n\n    this.rawFileSize = 0;\n    this.url = null;\n    this.pdfDocument = null;\n\n    // Bind the event listener for the Close button.\n    if (options.closeButton) {\n      options.closeButton.addEventListener('click', this.close.bind(this));\n    }\n\n    this.dataAvailablePromise = new Promise(function (resolve) {\n      this.resolveDataAvailable = resolve;\n    }.bind(this));\n\n    OverlayManager.register(this.overlayName, this.close.bind(this));\n  }\n\n  PDFDocumentProperties.prototype = {\n    /**\n     * Open the document properties overlay.\n     */\n    open: function PDFDocumentProperties_open() {\n      Promise.all([OverlayManager.open(this.overlayName),\n                   this.dataAvailablePromise]).then(function () {\n        this._getProperties();\n      }.bind(this));\n    },\n\n    /**\n     * Close the document properties overlay.\n     */\n    close: function PDFDocumentProperties_close() {\n      OverlayManager.close(this.overlayName);\n    },\n\n    /**\n     * Set the file size of the PDF document. This method is used to\n     * update the file size in the document properties overlay once it\n     * is known so we do not have to wait until the entire file is loaded.\n     *\n     * @param {number} fileSize - The file size of the PDF document.\n     */\n    setFileSize: function PDFDocumentProperties_setFileSize(fileSize) {\n      if (fileSize > 0) {\n        this.rawFileSize = fileSize;\n      }\n    },\n\n    /**\n     * Set a reference to the PDF document and the URL in order\n     * to populate the overlay fields with the document properties.\n     * Note that the overlay will contain no information if this method\n     * is not called.\n     *\n     * @param {Object} pdfDocument - A reference to the PDF document.\n     * @param {string} url - The URL of the document.\n     */\n    setDocumentAndUrl:\n        function PDFDocumentProperties_setDocumentAndUrl(pdfDocument, url) {\n      this.pdfDocument = pdfDocument;\n      this.url = url;\n      this.resolveDataAvailable();\n    },\n\n    /**\n     * @private\n     */\n    _getProperties: function PDFDocumentProperties_getProperties() {\n      if (!OverlayManager.active) {\n        // If the dialog was closed before dataAvailablePromise was resolved,\n        // don't bother updating the properties.\n        return;\n      }\n      // Get the file size (if it hasn't already been set).\n      this.pdfDocument.getDownloadInfo().then(function(data) {\n        if (data.length === this.rawFileSize) {\n          return;\n        }\n        this.setFileSize(data.length);\n        this._updateUI(this.fields['fileSize'], this._parseFileSize());\n      }.bind(this));\n\n      // Get the document properties.\n      this.pdfDocument.getMetadata().then(function(data) {\n        var content = {\n          'fileName': getPDFFileNameFromURL(this.url),\n          'fileSize': this._parseFileSize(),\n          'title': data.info.Title,\n          'author': data.info.Author,\n          'subject': data.info.Subject,\n          'keywords': data.info.Keywords,\n          'creationDate': this._parseDate(data.info.CreationDate),\n          'modificationDate': this._parseDate(data.info.ModDate),\n          'creator': data.info.Creator,\n          'producer': data.info.Producer,\n          'version': data.info.PDFFormatVersion,\n          'pageCount': this.pdfDocument.numPages\n        };\n\n        // Show the properties in the dialog.\n        for (var identifier in content) {\n          this._updateUI(this.fields[identifier], content[identifier]);\n        }\n      }.bind(this));\n    },\n\n    /**\n     * @private\n     */\n    _updateUI: function PDFDocumentProperties_updateUI(field, content) {\n      if (field && content !== undefined && content !== '') {\n        field.textContent = content;\n      }\n    },\n\n    /**\n     * @private\n     */\n    _parseFileSize: function PDFDocumentProperties_parseFileSize() {\n      var fileSize = this.rawFileSize, kb = fileSize / 1024;\n      if (!kb) {\n        return;\n      } else if (kb < 1024) {\n        return mozL10n.get('document_properties_kb', {\n          size_kb: (+kb.toPrecision(3)).toLocaleString(),\n          size_b: fileSize.toLocaleString()\n        }, '{{size_kb}} KB ({{size_b}} bytes)');\n      } else {\n        return mozL10n.get('document_properties_mb', {\n          size_mb: (+(kb / 1024).toPrecision(3)).toLocaleString(),\n          size_b: fileSize.toLocaleString()\n        }, '{{size_mb}} MB ({{size_b}} bytes)');\n      }\n    },\n\n    /**\n     * @private\n     */\n    _parseDate: function PDFDocumentProperties_parseDate(inputDate) {\n      // This is implemented according to the PDF specification, but note that\n      // Adobe Reader doesn't handle changing the date to universal time\n      // and doesn't use the user's time zone (they're effectively ignoring\n      // the HH' and mm' parts of the date string).\n      var dateToParse = inputDate;\n      if (dateToParse === undefined) {\n        return '';\n      }\n\n      // Remove the D: prefix if it is available.\n      if (dateToParse.substring(0,2) === 'D:') {\n        dateToParse = dateToParse.substring(2);\n      }\n\n      // Get all elements from the PDF date string.\n      // JavaScript's Date object expects the month to be between\n      // 0 and 11 instead of 1 and 12, so we're correcting for this.\n      var year = parseInt(dateToParse.substring(0,4), 10);\n      var month = parseInt(dateToParse.substring(4,6), 10) - 1;\n      var day = parseInt(dateToParse.substring(6,8), 10);\n      var hours = parseInt(dateToParse.substring(8,10), 10);\n      var minutes = parseInt(dateToParse.substring(10,12), 10);\n      var seconds = parseInt(dateToParse.substring(12,14), 10);\n      var utRel = dateToParse.substring(14,15);\n      var offsetHours = parseInt(dateToParse.substring(15,17), 10);\n      var offsetMinutes = parseInt(dateToParse.substring(18,20), 10);\n\n      // As per spec, utRel = 'Z' means equal to universal time.\n      // The other cases ('-' and '+') have to be handled here.\n      if (utRel === '-') {\n        hours += offsetHours;\n        minutes += offsetMinutes;\n      } else if (utRel === '+') {\n        hours -= offsetHours;\n        minutes -= offsetMinutes;\n      }\n\n      // Return the new date format from the user's locale.\n      var date = new Date(Date.UTC(year, month, day, hours, minutes, seconds));\n      var dateString = date.toLocaleDateString();\n      var timeString = date.toLocaleTimeString();\n      return mozL10n.get('document_properties_date_string',\n                         {date: dateString, time: timeString},\n                         '{{date}}, {{time}}');\n    }\n  };\n\n  return PDFDocumentProperties;\n})();\n\n\nvar PresentationModeState = {\n  UNKNOWN: 0,\n  NORMAL: 1,\n  CHANGING: 2,\n  FULLSCREEN: 3,\n};\n\nvar IGNORE_CURRENT_POSITION_ON_ZOOM = false;\nvar DEFAULT_CACHE_SIZE = 10;\n\n\nvar CLEANUP_TIMEOUT = 30000;\n\nvar RenderingStates = {\n  INITIAL: 0,\n  RUNNING: 1,\n  PAUSED: 2,\n  FINISHED: 3\n};\n\n/**\n * Controls rendering of the views for pages and thumbnails.\n * @class\n */\nvar PDFRenderingQueue = (function PDFRenderingQueueClosure() {\n  /**\n   * @constructs\n   */\n  function PDFRenderingQueue() {\n    this.pdfViewer = null;\n    this.pdfThumbnailViewer = null;\n    this.onIdle = null;\n\n    this.highestPriorityPage = null;\n    this.idleTimeout = null;\n    this.printing = false;\n    this.isThumbnailViewEnabled = false;\n  }\n\n  PDFRenderingQueue.prototype = /** @lends PDFRenderingQueue.prototype */ {\n    /**\n     * @param {PDFViewer} pdfViewer\n     */\n    setViewer: function PDFRenderingQueue_setViewer(pdfViewer) {\n      this.pdfViewer = pdfViewer;\n    },\n\n    /**\n     * @param {PDFThumbnailViewer} pdfThumbnailViewer\n     */\n    setThumbnailViewer:\n        function PDFRenderingQueue_setThumbnailViewer(pdfThumbnailViewer) {\n      this.pdfThumbnailViewer = pdfThumbnailViewer;\n    },\n\n    /**\n     * @param {IRenderableView} view\n     * @returns {boolean}\n     */\n    isHighestPriority: function PDFRenderingQueue_isHighestPriority(view) {\n      return this.highestPriorityPage === view.renderingId;\n    },\n\n    renderHighestPriority: function\n        PDFRenderingQueue_renderHighestPriority(currentlyVisiblePages) {\n      if (this.idleTimeout) {\n        clearTimeout(this.idleTimeout);\n        this.idleTimeout = null;\n      }\n\n      // Pages have a higher priority than thumbnails, so check them first.\n      if (this.pdfViewer.forceRendering(currentlyVisiblePages)) {\n        return;\n      }\n      // No pages needed rendering so check thumbnails.\n      if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) {\n        if (this.pdfThumbnailViewer.forceRendering()) {\n          return;\n        }\n      }\n\n      if (this.printing) {\n        // If printing is currently ongoing do not reschedule cleanup.\n        return;\n      }\n\n      if (this.onIdle) {\n        this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT);\n      }\n    },\n\n    getHighestPriority: function\n        PDFRenderingQueue_getHighestPriority(visible, views, scrolledDown) {\n      // The state has changed figure out which page has the highest priority to\n      // render next (if any).\n      // Priority:\n      // 1 visible pages\n      // 2 if last scrolled down page after the visible pages\n      // 2 if last scrolled up page before the visible pages\n      var visibleViews = visible.views;\n\n      var numVisible = visibleViews.length;\n      if (numVisible === 0) {\n        return false;\n      }\n      for (var i = 0; i < numVisible; ++i) {\n        var view = visibleViews[i].view;\n        if (!this.isViewFinished(view)) {\n          return view;\n        }\n      }\n\n      // All the visible views have rendered, try to render next/previous pages.\n      if (scrolledDown) {\n        var nextPageIndex = visible.last.id;\n        // ID's start at 1 so no need to add 1.\n        if (views[nextPageIndex] &&\n            !this.isViewFinished(views[nextPageIndex])) {\n          return views[nextPageIndex];\n        }\n      } else {\n        var previousPageIndex = visible.first.id - 2;\n        if (views[previousPageIndex] &&\n          !this.isViewFinished(views[previousPageIndex])) {\n          return views[previousPageIndex];\n        }\n      }\n      // Everything that needs to be rendered has been.\n      return null;\n    },\n\n    /**\n     * @param {IRenderableView} view\n     * @returns {boolean}\n     */\n    isViewFinished: function PDFRenderingQueue_isViewFinished(view) {\n      return view.renderingState === RenderingStates.FINISHED;\n    },\n\n    /**\n     * Render a page or thumbnail view. This calls the appropriate function\n     * based on the views state. If the view is already rendered it will return\n     * false.\n     * @param {IRenderableView} view\n     */\n    renderView: function PDFRenderingQueue_renderView(view) {\n      var state = view.renderingState;\n      switch (state) {\n        case RenderingStates.FINISHED:\n          return false;\n        case RenderingStates.PAUSED:\n          this.highestPriorityPage = view.renderingId;\n          view.resume();\n          break;\n        case RenderingStates.RUNNING:\n          this.highestPriorityPage = view.renderingId;\n          break;\n        case RenderingStates.INITIAL:\n          this.highestPriorityPage = view.renderingId;\n          var continueRendering = function () {\n            this.renderHighestPriority();\n          }.bind(this);\n          view.draw().then(continueRendering, continueRendering);\n          break;\n      }\n      return true;\n    },\n  };\n\n  return PDFRenderingQueue;\n})();\n\n\nvar TEXT_LAYER_RENDER_DELAY = 200; // ms\n\n/**\n * @typedef {Object} PDFPageViewOptions\n * @property {HTMLDivElement} container - The viewer element.\n * @property {number} id - The page unique ID (normally its number).\n * @property {number} scale - The page scale display.\n * @property {PageViewport} defaultViewport - The page viewport.\n * @property {PDFRenderingQueue} renderingQueue - The rendering queue object.\n * @property {IPDFTextLayerFactory} textLayerFactory\n * @property {IPDFAnnotationsLayerFactory} annotationsLayerFactory\n */\n\n/**\n * @class\n * @implements {IRenderableView}\n */\nvar PDFPageView = (function PDFPageViewClosure() {\n  /**\n   * @constructs PDFPageView\n   * @param {PDFPageViewOptions} options\n   */\n  function PDFPageView(options) {\n    var container = options.container;\n    var id = options.id;\n    var scale = options.scale;\n    var defaultViewport = options.defaultViewport;\n    var renderingQueue = options.renderingQueue;\n    var textLayerFactory = options.textLayerFactory;\n    var annotationsLayerFactory = options.annotationsLayerFactory;\n\n    this.id = id;\n    this.renderingId = 'page' + id;\n\n    this.rotation = 0;\n    this.scale = scale || 1.0;\n    this.viewport = defaultViewport;\n    this.pdfPageRotate = defaultViewport.rotation;\n    this.hasRestrictedScaling = false;\n\n    this.renderingQueue = renderingQueue;\n    this.textLayerFactory = textLayerFactory;\n    this.annotationsLayerFactory = annotationsLayerFactory;\n\n    this.renderingState = RenderingStates.INITIAL;\n    this.resume = null;\n\n    this.onBeforeDraw = null;\n    this.onAfterDraw = null;\n\n    this.textLayer = null;\n\n    this.zoomLayer = null;\n\n    this.annotationLayer = null;\n\n    var div = document.createElement('div');\n    div.id = 'pageContainer' + this.id;\n    div.className = 'page';\n    div.style.width = Math.floor(this.viewport.width) + 'px';\n    div.style.height = Math.floor(this.viewport.height) + 'px';\n    div.setAttribute('data-page-number', this.id);\n    this.div = div;\n\n    container.appendChild(div);\n  }\n\n  PDFPageView.prototype = {\n    setPdfPage: function PDFPageView_setPdfPage(pdfPage) {\n      this.pdfPage = pdfPage;\n      this.pdfPageRotate = pdfPage.rotate;\n      var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n      this.viewport = pdfPage.getViewport(this.scale * CSS_UNITS,\n                                          totalRotation);\n      this.stats = pdfPage.stats;\n      this.reset();\n    },\n\n    destroy: function PDFPageView_destroy() {\n      this.zoomLayer = null;\n      this.reset();\n      if (this.pdfPage) {\n        this.pdfPage.destroy();\n      }\n    },\n\n    reset: function PDFPageView_reset(keepAnnotations) {\n      if (this.renderTask) {\n        this.renderTask.cancel();\n      }\n      this.resume = null;\n      this.renderingState = RenderingStates.INITIAL;\n\n      var div = this.div;\n      div.style.width = Math.floor(this.viewport.width) + 'px';\n      div.style.height = Math.floor(this.viewport.height) + 'px';\n\n      var childNodes = div.childNodes;\n      var currentZoomLayer = this.zoomLayer || null;\n      var currentAnnotationNode = (keepAnnotations && this.annotationLayer &&\n                                   this.annotationLayer.div) || null;\n      for (var i = childNodes.length - 1; i >= 0; i--) {\n        var node = childNodes[i];\n        if (currentZoomLayer === node || currentAnnotationNode === node) {\n          continue;\n        }\n        div.removeChild(node);\n      }\n      div.removeAttribute('data-loaded');\n\n      if (keepAnnotations) {\n        if (this.annotationLayer) {\n          // Hide annotationLayer until all elements are resized\n          // so they are not displayed on the already-resized page\n          this.annotationLayer.hide();\n        }\n      } else {\n        this.annotationLayer = null;\n      }\n\n      if (this.canvas) {\n        // Zeroing the width and height causes Firefox to release graphics\n        // resources immediately, which can greatly reduce memory consumption.\n        this.canvas.width = 0;\n        this.canvas.height = 0;\n        delete this.canvas;\n      }\n\n      this.loadingIconDiv = document.createElement('div');\n      this.loadingIconDiv.className = 'loadingIcon';\n      div.appendChild(this.loadingIconDiv);\n    },\n\n    update: function PDFPageView_update(scale, rotation) {\n      this.scale = scale || this.scale;\n\n      if (typeof rotation !== 'undefined') {\n        this.rotation = rotation;\n      }\n\n      var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n      this.viewport = this.viewport.clone({\n        scale: this.scale * CSS_UNITS,\n        rotation: totalRotation\n      });\n\n      var isScalingRestricted = false;\n      if (this.canvas && PDFJS.maxCanvasPixels > 0) {\n        var ctx = this.canvas.getContext('2d');\n        var outputScale = getOutputScale(ctx);\n        var pixelsInViewport = this.viewport.width * this.viewport.height;\n        var maxScale = Math.sqrt(PDFJS.maxCanvasPixels / pixelsInViewport);\n        if (((Math.floor(this.viewport.width) * outputScale.sx) | 0) *\n            ((Math.floor(this.viewport.height) * outputScale.sy) | 0) >\n            PDFJS.maxCanvasPixels) {\n          isScalingRestricted = true;\n        }\n      }\n\n      if (this.canvas &&\n          (PDFJS.useOnlyCssZoom ||\n            (this.hasRestrictedScaling && isScalingRestricted))) {\n        this.cssTransform(this.canvas, true);\n        return;\n      } else if (this.canvas && !this.zoomLayer) {\n        this.zoomLayer = this.canvas.parentNode;\n        this.zoomLayer.style.position = 'absolute';\n      }\n      if (this.zoomLayer) {\n        this.cssTransform(this.zoomLayer.firstChild);\n      }\n      this.reset(true);\n    },\n\n    /**\n     * Called when moved in the parent's container.\n     */\n    updatePosition: function PDFPageView_updatePosition() {\n      if (this.textLayer) {\n        this.textLayer.render(TEXT_LAYER_RENDER_DELAY);\n      }\n    },\n\n    cssTransform: function PDFPageView_transform(canvas, redrawAnnotations) {\n      // Scale canvas, canvas wrapper, and page container.\n      var width = this.viewport.width;\n      var height = this.viewport.height;\n      var div = this.div;\n      canvas.style.width = canvas.parentNode.style.width = div.style.width =\n        Math.floor(width) + 'px';\n      canvas.style.height = canvas.parentNode.style.height = div.style.height =\n        Math.floor(height) + 'px';\n      // The canvas may have been originally rotated, rotate relative to that.\n      var relativeRotation = this.viewport.rotation - canvas._viewport.rotation;\n      var absRotation = Math.abs(relativeRotation);\n      var scaleX = 1, scaleY = 1;\n      if (absRotation === 90 || absRotation === 270) {\n        // Scale x and y because of the rotation.\n        scaleX = height / width;\n        scaleY = width / height;\n      }\n      var cssTransform = 'rotate(' + relativeRotation + 'deg) ' +\n        'scale(' + scaleX + ',' + scaleY + ')';\n      CustomStyle.setProp('transform', canvas, cssTransform);\n\n      if (this.textLayer) {\n        // Rotating the text layer is more complicated since the divs inside the\n        // the text layer are rotated.\n        // TODO: This could probably be simplified by drawing the text layer in\n        // one orientation then rotating overall.\n        var textLayerViewport = this.textLayer.viewport;\n        var textRelativeRotation = this.viewport.rotation -\n          textLayerViewport.rotation;\n        var textAbsRotation = Math.abs(textRelativeRotation);\n        var scale = width / textLayerViewport.width;\n        if (textAbsRotation === 90 || textAbsRotation === 270) {\n          scale = width / textLayerViewport.height;\n        }\n        var textLayerDiv = this.textLayer.textLayerDiv;\n        var transX, transY;\n        switch (textAbsRotation) {\n          case 0:\n            transX = transY = 0;\n            break;\n          case 90:\n            transX = 0;\n            transY = '-' + textLayerDiv.style.height;\n            break;\n          case 180:\n            transX = '-' + textLayerDiv.style.width;\n            transY = '-' + textLayerDiv.style.height;\n            break;\n          case 270:\n            transX = '-' + textLayerDiv.style.width;\n            transY = 0;\n            break;\n          default:\n            console.error('Bad rotation value.');\n            break;\n        }\n        CustomStyle.setProp('transform', textLayerDiv,\n            'rotate(' + textAbsRotation + 'deg) ' +\n            'scale(' + scale + ', ' + scale + ') ' +\n            'translate(' + transX + ', ' + transY + ')');\n        CustomStyle.setProp('transformOrigin', textLayerDiv, '0% 0%');\n      }\n\n      if (redrawAnnotations && this.annotationLayer) {\n        this.annotationLayer.setupAnnotations(this.viewport);\n      }\n    },\n\n    get width() {\n      return this.viewport.width;\n    },\n\n    get height() {\n      return this.viewport.height;\n    },\n\n    getPagePoint: function PDFPageView_getPagePoint(x, y) {\n      return this.viewport.convertToPdfPoint(x, y);\n    },\n\n    draw: function PDFPageView_draw() {\n      if (this.renderingState !== RenderingStates.INITIAL) {\n        console.error('Must be in new state before drawing');\n      }\n\n      this.renderingState = RenderingStates.RUNNING;\n\n      var pdfPage = this.pdfPage;\n      var viewport = this.viewport;\n      var div = this.div;\n      // Wrap the canvas so if it has a css transform for highdpi the overflow\n      // will be hidden in FF.\n      var canvasWrapper = document.createElement('div');\n      canvasWrapper.style.width = div.style.width;\n      canvasWrapper.style.height = div.style.height;\n      canvasWrapper.classList.add('canvasWrapper');\n\n      var canvas = document.createElement('canvas');\n      canvas.id = 'page' + this.id;\n      canvasWrapper.appendChild(canvas);\n      if (this.annotationLayer) {\n        // annotationLayer needs to stay on top\n        div.insertBefore(canvasWrapper, this.annotationLayer.div);\n      } else {\n        div.appendChild(canvasWrapper);\n      }\n      this.canvas = canvas;\n\n      var ctx = canvas.getContext('2d');\n      var outputScale = getOutputScale(ctx);\n\n      if (PDFJS.useOnlyCssZoom) {\n        var actualSizeViewport = viewport.clone({ scale: CSS_UNITS });\n        // Use a scale that will make the canvas be the original intended size\n        // of the page.\n        outputScale.sx *= actualSizeViewport.width / viewport.width;\n        outputScale.sy *= actualSizeViewport.height / viewport.height;\n        outputScale.scaled = true;\n      }\n\n      if (PDFJS.maxCanvasPixels > 0) {\n        var pixelsInViewport = viewport.width * viewport.height;\n        var maxScale = Math.sqrt(PDFJS.maxCanvasPixels / pixelsInViewport);\n        if (outputScale.sx > maxScale || outputScale.sy > maxScale) {\n          outputScale.sx = maxScale;\n          outputScale.sy = maxScale;\n          outputScale.scaled = true;\n          this.hasRestrictedScaling = true;\n        } else {\n          this.hasRestrictedScaling = false;\n        }\n      }\n\n      canvas.width = (Math.floor(viewport.width) * outputScale.sx) | 0;\n      canvas.height = (Math.floor(viewport.height) * outputScale.sy) | 0;\n      canvas.style.width = Math.floor(viewport.width) + 'px';\n      canvas.style.height = Math.floor(viewport.height) + 'px';\n      // Add the viewport so it's known what it was originally drawn with.\n      canvas._viewport = viewport;\n\n      var textLayerDiv = null;\n      var textLayer = null;\n      if (this.textLayerFactory) {\n        textLayerDiv = document.createElement('div');\n        textLayerDiv.className = 'textLayer';\n        textLayerDiv.style.width = canvas.style.width;\n        textLayerDiv.style.height = canvas.style.height;\n        if (this.annotationLayer) {\n          // annotationLayer needs to stay on top\n          div.insertBefore(textLayerDiv, this.annotationLayer.div);\n        } else {\n          div.appendChild(textLayerDiv);\n        }\n\n        textLayer = this.textLayerFactory.createTextLayerBuilder(textLayerDiv,\n                                                                 this.id - 1,\n                                                                 this.viewport);\n      }\n      this.textLayer = textLayer;\n\n      if (outputScale.scaled) {\n        // Used by the mozCurrentTransform polyfill in src/display/canvas.js.\n        ctx._transformMatrix = [outputScale.sx, 0, 0, outputScale.sy, 0, 0];\n        ctx.scale(outputScale.sx, outputScale.sy);\n      }\n\n      var resolveRenderPromise, rejectRenderPromise;\n      var promise = new Promise(function (resolve, reject) {\n        resolveRenderPromise = resolve;\n        rejectRenderPromise = reject;\n      });\n\n      // Rendering area\n\n      var self = this;\n      function pageViewDrawCallback(error) {\n        // The renderTask may have been replaced by a new one, so only remove\n        // the reference to the renderTask if it matches the one that is\n        // triggering this callback.\n        if (renderTask === self.renderTask) {\n          self.renderTask = null;\n        }\n\n        if (error === 'cancelled') {\n          rejectRenderPromise(error);\n          return;\n        }\n\n        self.renderingState = RenderingStates.FINISHED;\n\n        if (self.loadingIconDiv) {\n          div.removeChild(self.loadingIconDiv);\n          delete self.loadingIconDiv;\n        }\n\n        if (self.zoomLayer) {\n          div.removeChild(self.zoomLayer);\n          self.zoomLayer = null;\n        }\n\n        self.error = error;\n        self.stats = pdfPage.stats;\n        if (self.onAfterDraw) {\n          self.onAfterDraw();\n        }\n        var event = document.createEvent('CustomEvent');\n        event.initCustomEvent('pagerendered', true, true, {\n          pageNumber: self.id\n        });\n        div.dispatchEvent(event);\n        // This custom event is deprecated, and will be removed in the future,\n        // please use the |pagerendered| event instead.\n        var deprecatedEvent = document.createEvent('CustomEvent');\n        deprecatedEvent.initCustomEvent('pagerender', true, true, {\n          pageNumber: pdfPage.pageNumber\n        });\n        div.dispatchEvent(deprecatedEvent);\n\n        if (!error) {\n          resolveRenderPromise(undefined);\n        } else {\n          rejectRenderPromise(error);\n        }\n      }\n\n      var renderContinueCallback = null;\n      if (this.renderingQueue) {\n        renderContinueCallback = function renderContinueCallback(cont) {\n          if (!self.renderingQueue.isHighestPriority(self)) {\n            self.renderingState = RenderingStates.PAUSED;\n            self.resume = function resumeCallback() {\n              self.renderingState = RenderingStates.RUNNING;\n              cont();\n            };\n            return;\n          }\n          cont();\n        };\n      }\n\n      var renderContext = {\n        canvasContext: ctx,\n        viewport: this.viewport,\n        // intent: 'default', // === 'display'\n        continueCallback: renderContinueCallback\n      };\n      var renderTask = this.renderTask = this.pdfPage.render(renderContext);\n\n      this.renderTask.promise.then(\n        function pdfPageRenderCallback() {\n          pageViewDrawCallback(null);\n          if (textLayer) {\n            self.pdfPage.getTextContent().then(\n              function textContentResolved(textContent) {\n                textLayer.setTextContent(textContent);\n                textLayer.render(TEXT_LAYER_RENDER_DELAY);\n              }\n            );\n          }\n        },\n        function pdfPageRenderError(error) {\n          pageViewDrawCallback(error);\n        }\n      );\n\n      if (this.annotationsLayerFactory) {\n        if (!this.annotationLayer) {\n          this.annotationLayer = this.annotationsLayerFactory.\n            createAnnotationsLayerBuilder(div, this.pdfPage);\n        }\n        this.annotationLayer.setupAnnotations(this.viewport);\n      }\n      div.setAttribute('data-loaded', true);\n\n      if (self.onBeforeDraw) {\n        self.onBeforeDraw();\n      }\n      return promise;\n    },\n\n    beforePrint: function PDFPageView_beforePrint() {\n      var pdfPage = this.pdfPage;\n\n      var viewport = pdfPage.getViewport(1);\n      // Use the same hack we use for high dpi displays for printing to get\n      // better output until bug 811002 is fixed in FF.\n      var PRINT_OUTPUT_SCALE = 2;\n      var canvas = document.createElement('canvas');\n\n      // The logical size of the canvas.\n      canvas.width = Math.floor(viewport.width) * PRINT_OUTPUT_SCALE;\n      canvas.height = Math.floor(viewport.height) * PRINT_OUTPUT_SCALE;\n\n      // The rendered size of the canvas, relative to the size of canvasWrapper.\n      canvas.style.width = (PRINT_OUTPUT_SCALE * 100) + '%';\n      canvas.style.height = (PRINT_OUTPUT_SCALE * 100) + '%';\n\n      var cssScale = 'scale(' + (1 / PRINT_OUTPUT_SCALE) + ', ' +\n                                (1 / PRINT_OUTPUT_SCALE) + ')';\n      CustomStyle.setProp('transform' , canvas, cssScale);\n      CustomStyle.setProp('transformOrigin' , canvas, '0% 0%');\n\n      var printContainer = document.getElementById('printContainer');\n      var canvasWrapper = document.createElement('div');\n      canvasWrapper.style.width = viewport.width + 'pt';\n      canvasWrapper.style.height = viewport.height + 'pt';\n      canvasWrapper.appendChild(canvas);\n      printContainer.appendChild(canvasWrapper);\n\n      canvas.mozPrintCallback = function(obj) {\n        var ctx = obj.context;\n\n        ctx.save();\n        ctx.fillStyle = 'rgb(255, 255, 255)';\n        ctx.fillRect(0, 0, canvas.width, canvas.height);\n        ctx.restore();\n        // Used by the mozCurrentTransform polyfill in src/display/canvas.js.\n        ctx._transformMatrix =\n          [PRINT_OUTPUT_SCALE, 0, 0, PRINT_OUTPUT_SCALE, 0, 0];\n        ctx.scale(PRINT_OUTPUT_SCALE, PRINT_OUTPUT_SCALE);\n\n        var renderContext = {\n          canvasContext: ctx,\n          viewport: viewport,\n          intent: 'print'\n        };\n\n        pdfPage.render(renderContext).promise.then(function() {\n          // Tell the printEngine that rendering this canvas/page has finished.\n          obj.done();\n        }, function(error) {\n          console.error(error);\n          // Tell the printEngine that rendering this canvas/page has failed.\n          // This will make the print proces stop.\n          if ('abort' in obj) {\n            obj.abort();\n          } else {\n            obj.done();\n          }\n        });\n      };\n    },\n  };\n\n  return PDFPageView;\n})();\n\n\nvar MAX_TEXT_DIVS_TO_RENDER = 100000;\n\nvar NonWhitespaceRegexp = /\\S/;\n\nfunction isAllWhitespace(str) {\n  return !NonWhitespaceRegexp.test(str);\n}\n\n/**\n * @typedef {Object} TextLayerBuilderOptions\n * @property {HTMLDivElement} textLayerDiv - The text layer container.\n * @property {number} pageIndex - The page index.\n * @property {PageViewport} viewport - The viewport of the text layer.\n * @property {PDFFindController} findController\n */\n\n/**\n * TextLayerBuilder provides text-selection functionality for the PDF.\n * It does this by creating overlay divs over the PDF text. These divs\n * contain text that matches the PDF text they are overlaying. This object\n * also provides a way to highlight text that is being searched for.\n * @class\n */\nvar TextLayerBuilder = (function TextLayerBuilderClosure() {\n  function TextLayerBuilder(options) {\n    this.textLayerDiv = options.textLayerDiv;\n    this.renderingDone = false;\n    this.divContentDone = false;\n    this.pageIdx = options.pageIndex;\n    this.pageNumber = this.pageIdx + 1;\n    this.matches = [];\n    this.viewport = options.viewport;\n    this.textDivs = [];\n    this.findController = options.findController || null;\n  }\n\n  TextLayerBuilder.prototype = {\n    _finishRendering: function TextLayerBuilder_finishRendering() {\n      this.renderingDone = true;\n\n      var event = document.createEvent('CustomEvent');\n      event.initCustomEvent('textlayerrendered', true, true, {\n        pageNumber: this.pageNumber\n      });\n      this.textLayerDiv.dispatchEvent(event);\n    },\n\n    renderLayer: function TextLayerBuilder_renderLayer() {\n      var textLayerFrag = document.createDocumentFragment();\n      var textDivs = this.textDivs;\n      var textDivsLength = textDivs.length;\n      var canvas = document.createElement('canvas');\n      var ctx = canvas.getContext('2d');\n\n      // No point in rendering many divs as it would make the browser\n      // unusable even after the divs are rendered.\n      if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) {\n        this._finishRendering();\n        return;\n      }\n\n      var lastFontSize;\n      var lastFontFamily;\n      for (var i = 0; i < textDivsLength; i++) {\n        var textDiv = textDivs[i];\n        if (textDiv.dataset.isWhitespace !== undefined) {\n          continue;\n        }\n\n        var fontSize = textDiv.style.fontSize;\n        var fontFamily = textDiv.style.fontFamily;\n\n        // Only build font string and set to context if different from last.\n        if (fontSize !== lastFontSize || fontFamily !== lastFontFamily) {\n          ctx.font = fontSize + ' ' + fontFamily;\n          lastFontSize = fontSize;\n          lastFontFamily = fontFamily;\n        }\n\n        var width = ctx.measureText(textDiv.textContent).width;\n        if (width > 0) {\n          textLayerFrag.appendChild(textDiv);\n          var transform;\n          if (textDiv.dataset.canvasWidth !== undefined) {\n            // Dataset values come of type string.\n            var textScale = textDiv.dataset.canvasWidth / width;\n            transform = 'scaleX(' + textScale + ')';\n          } else {\n            transform = '';\n          }\n          var rotation = textDiv.dataset.angle;\n          if (rotation) {\n            transform = 'rotate(' + rotation + 'deg) ' + transform;\n          }\n          if (transform) {\n            CustomStyle.setProp('transform' , textDiv, transform);\n          }\n        }\n      }\n\n      this.textLayerDiv.appendChild(textLayerFrag);\n      this._finishRendering();\n      this.updateMatches();\n    },\n\n    /**\n     * Renders the text layer.\n     * @param {number} timeout (optional) if specified, the rendering waits\n     *   for specified amount of ms.\n     */\n    render: function TextLayerBuilder_render(timeout) {\n      if (!this.divContentDone || this.renderingDone) {\n        return;\n      }\n\n      if (this.renderTimer) {\n        clearTimeout(this.renderTimer);\n        this.renderTimer = null;\n      }\n\n      if (!timeout) { // Render right away\n        this.renderLayer();\n      } else { // Schedule\n        var self = this;\n        this.renderTimer = setTimeout(function() {\n          self.renderLayer();\n          self.renderTimer = null;\n        }, timeout);\n      }\n    },\n\n    appendText: function TextLayerBuilder_appendText(geom, styles) {\n      var style = styles[geom.fontName];\n      var textDiv = document.createElement('div');\n      this.textDivs.push(textDiv);\n      if (isAllWhitespace(geom.str)) {\n        textDiv.dataset.isWhitespace = true;\n        return;\n      }\n      var tx = PDFJS.Util.transform(this.viewport.transform, geom.transform);\n      var angle = Math.atan2(tx[1], tx[0]);\n      if (style.vertical) {\n        angle += Math.PI / 2;\n      }\n      var fontHeight = Math.sqrt((tx[2] * tx[2]) + (tx[3] * tx[3]));\n      var fontAscent = fontHeight;\n      if (style.ascent) {\n        fontAscent = style.ascent * fontAscent;\n      } else if (style.descent) {\n        fontAscent = (1 + style.descent) * fontAscent;\n      }\n\n      var left;\n      var top;\n      if (angle === 0) {\n        left = tx[4];\n        top = tx[5] - fontAscent;\n      } else {\n        left = tx[4] + (fontAscent * Math.sin(angle));\n        top = tx[5] - (fontAscent * Math.cos(angle));\n      }\n      textDiv.style.left = left + 'px';\n      textDiv.style.top = top + 'px';\n      textDiv.style.fontSize = fontHeight + 'px';\n      textDiv.style.fontFamily = style.fontFamily;\n\n      textDiv.textContent = geom.str;\n      // |fontName| is only used by the Font Inspector. This test will succeed\n      // when e.g. the Font Inspector is off but the Stepper is on, but it's\n      // not worth the effort to do a more accurate test.\n      if (PDFJS.pdfBug) {\n        textDiv.dataset.fontName = geom.fontName;\n      }\n      // Storing into dataset will convert number into string.\n      if (angle !== 0) {\n        textDiv.dataset.angle = angle * (180 / Math.PI);\n      }\n      // We don't bother scaling single-char text divs, because it has very\n      // little effect on text highlighting. This makes scrolling on docs with\n      // lots of such divs a lot faster.\n      if (textDiv.textContent.length > 1) {\n        if (style.vertical) {\n          textDiv.dataset.canvasWidth = geom.height * this.viewport.scale;\n        } else {\n          textDiv.dataset.canvasWidth = geom.width * this.viewport.scale;\n        }\n      }\n    },\n\n    setTextContent: function TextLayerBuilder_setTextContent(textContent) {\n      this.textContent = textContent;\n\n      var textItems = textContent.items;\n      for (var i = 0, len = textItems.length; i < len; i++) {\n        this.appendText(textItems[i], textContent.styles);\n      }\n      this.divContentDone = true;\n    },\n\n    convertMatches: function TextLayerBuilder_convertMatches(matches) {\n      var i = 0;\n      var iIndex = 0;\n      var bidiTexts = this.textContent.items;\n      var end = bidiTexts.length - 1;\n      var queryLen = (this.findController === null ?\n                      0 : this.findController.state.query.length);\n      var ret = [];\n\n      for (var m = 0, len = matches.length; m < len; m++) {\n        // Calculate the start position.\n        var matchIdx = matches[m];\n\n        // Loop over the divIdxs.\n        while (i !== end && matchIdx >= (iIndex + bidiTexts[i].str.length)) {\n          iIndex += bidiTexts[i].str.length;\n          i++;\n        }\n\n        if (i === bidiTexts.length) {\n          console.error('Could not find a matching mapping');\n        }\n\n        var match = {\n          begin: {\n            divIdx: i,\n            offset: matchIdx - iIndex\n          }\n        };\n\n        // Calculate the end position.\n        matchIdx += queryLen;\n\n        // Somewhat the same array as above, but use > instead of >= to get\n        // the end position right.\n        while (i !== end && matchIdx > (iIndex + bidiTexts[i].str.length)) {\n          iIndex += bidiTexts[i].str.length;\n          i++;\n        }\n\n        match.end = {\n          divIdx: i,\n          offset: matchIdx - iIndex\n        };\n        ret.push(match);\n      }\n\n      return ret;\n    },\n\n    renderMatches: function TextLayerBuilder_renderMatches(matches) {\n      // Early exit if there is nothing to render.\n      if (matches.length === 0) {\n        return;\n      }\n\n      var bidiTexts = this.textContent.items;\n      var textDivs = this.textDivs;\n      var prevEnd = null;\n      var pageIdx = this.pageIdx;\n      var isSelectedPage = (this.findController === null ?\n        false : (pageIdx === this.findController.selected.pageIdx));\n      var selectedMatchIdx = (this.findController === null ?\n                              -1 : this.findController.selected.matchIdx);\n      var highlightAll = (this.findController === null ?\n                          false : this.findController.state.highlightAll);\n      var infinity = {\n        divIdx: -1,\n        offset: undefined\n      };\n\n      function beginText(begin, className) {\n        var divIdx = begin.divIdx;\n        textDivs[divIdx].textContent = '';\n        appendTextToDiv(divIdx, 0, begin.offset, className);\n      }\n\n      function appendTextToDiv(divIdx, fromOffset, toOffset, className) {\n        var div = textDivs[divIdx];\n        var content = bidiTexts[divIdx].str.substring(fromOffset, toOffset);\n        var node = document.createTextNode(content);\n        if (className) {\n          var span = document.createElement('span');\n          span.className = className;\n          span.appendChild(node);\n          div.appendChild(span);\n          return;\n        }\n        div.appendChild(node);\n      }\n\n      var i0 = selectedMatchIdx, i1 = i0 + 1;\n      if (highlightAll) {\n        i0 = 0;\n        i1 = matches.length;\n      } else if (!isSelectedPage) {\n        // Not highlighting all and this isn't the selected page, so do nothing.\n        return;\n      }\n\n      for (var i = i0; i < i1; i++) {\n        var match = matches[i];\n        var begin = match.begin;\n        var end = match.end;\n        var isSelected = (isSelectedPage && i === selectedMatchIdx);\n        var highlightSuffix = (isSelected ? ' selected' : '');\n\n        if (this.findController) {\n          this.findController.updateMatchPosition(pageIdx, i, textDivs,\n                                                  begin.divIdx, end.divIdx);\n        }\n\n        // Match inside new div.\n        if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {\n          // If there was a previous div, then add the text at the end.\n          if (prevEnd !== null) {\n            appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n          }\n          // Clear the divs and set the content until the starting point.\n          beginText(begin);\n        } else {\n          appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset);\n        }\n\n        if (begin.divIdx === end.divIdx) {\n          appendTextToDiv(begin.divIdx, begin.offset, end.offset,\n                          'highlight' + highlightSuffix);\n        } else {\n          appendTextToDiv(begin.divIdx, begin.offset, infinity.offset,\n                          'highlight begin' + highlightSuffix);\n          for (var n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {\n            textDivs[n0].className = 'highlight middle' + highlightSuffix;\n          }\n          beginText(end, 'highlight end' + highlightSuffix);\n        }\n        prevEnd = end;\n      }\n\n      if (prevEnd) {\n        appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n      }\n    },\n\n    updateMatches: function TextLayerBuilder_updateMatches() {\n      // Only show matches when all rendering is done.\n      if (!this.renderingDone) {\n        return;\n      }\n\n      // Clear all matches.\n      var matches = this.matches;\n      var textDivs = this.textDivs;\n      var bidiTexts = this.textContent.items;\n      var clearedUntilDivIdx = -1;\n\n      // Clear all current matches.\n      for (var i = 0, len = matches.length; i < len; i++) {\n        var match = matches[i];\n        var begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);\n        for (var n = begin, end = match.end.divIdx; n <= end; n++) {\n          var div = textDivs[n];\n          div.textContent = bidiTexts[n].str;\n          div.className = '';\n        }\n        clearedUntilDivIdx = match.end.divIdx + 1;\n      }\n\n      if (this.findController === null || !this.findController.active) {\n        return;\n      }\n\n      // Convert the matches on the page controller into the match format\n      // used for the textLayer.\n      this.matches = this.convertMatches(this.findController === null ?\n        [] : (this.findController.pageMatches[this.pageIdx] || []));\n      this.renderMatches(this.matches);\n    }\n  };\n  return TextLayerBuilder;\n})();\n\n/**\n * @constructor\n * @implements IPDFTextLayerFactory\n */\nfunction DefaultTextLayerFactory() {}\nDefaultTextLayerFactory.prototype = {\n  /**\n   * @param {HTMLDivElement} textLayerDiv\n   * @param {number} pageIndex\n   * @param {PageViewport} viewport\n   * @returns {TextLayerBuilder}\n   */\n  createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport) {\n    return new TextLayerBuilder({\n      textLayerDiv: textLayerDiv,\n      pageIndex: pageIndex,\n      viewport: viewport\n    });\n  }\n};\n\n\n/**\n * @typedef {Object} AnnotationsLayerBuilderOptions\n * @property {HTMLDivElement} pageDiv\n * @property {PDFPage} pdfPage\n * @property {IPDFLinkService} linkService\n */\n\n/**\n * @class\n */\nvar AnnotationsLayerBuilder = (function AnnotationsLayerBuilderClosure() {\n  /**\n   * @param {AnnotationsLayerBuilderOptions} options\n   * @constructs AnnotationsLayerBuilder\n   */\n  function AnnotationsLayerBuilder(options) {\n    this.pageDiv = options.pageDiv;\n    this.pdfPage = options.pdfPage;\n    this.linkService = options.linkService;\n\n    this.div = null;\n  }\n  AnnotationsLayerBuilder.prototype =\n      /** @lends AnnotationsLayerBuilder.prototype */ {\n\n    /**\n     * @param {PageViewport} viewport\n     */\n    setupAnnotations:\n        function AnnotationsLayerBuilder_setupAnnotations(viewport) {\n      function bindLink(link, dest) {\n        link.href = linkService.getDestinationHash(dest);\n        link.onclick = function annotationsLayerBuilderLinksOnclick() {\n          if (dest) {\n            linkService.navigateTo(dest);\n          }\n          return false;\n        };\n        if (dest) {\n          link.className = 'internalLink';\n        }\n      }\n\n      function bindNamedAction(link, action) {\n        link.href = linkService.getAnchorUrl('');\n        link.onclick = function annotationsLayerBuilderNamedActionOnClick() {\n          linkService.executeNamedAction(action);\n          return false;\n        };\n        link.className = 'internalLink';\n      }\n\n      var linkService = this.linkService;\n      var pdfPage = this.pdfPage;\n      var self = this;\n\n      pdfPage.getAnnotations().then(function (annotationsData) {\n        viewport = viewport.clone({ dontFlip: true });\n        var transform = viewport.transform;\n        var transformStr = 'matrix(' + transform.join(',') + ')';\n        var data, element, i, ii;\n\n        if (self.div) {\n          // If an annotationLayer already exists, refresh its children's\n          // transformation matrices\n          for (i = 0, ii = annotationsData.length; i < ii; i++) {\n            data = annotationsData[i];\n            element = self.div.querySelector(\n                '[data-annotation-id=\"' + data.id + '\"]');\n            if (element) {\n              CustomStyle.setProp('transform', element, transformStr);\n            }\n          }\n          // See PDFPageView.reset()\n          self.div.removeAttribute('hidden');\n        } else {\n          for (i = 0, ii = annotationsData.length; i < ii; i++) {\n            data = annotationsData[i];\n            if (!data || !data.hasHtml) {\n              continue;\n            }\n\n            element = PDFJS.AnnotationUtils.getHtmlElement(data,\n              pdfPage.commonObjs);\n            element.setAttribute('data-annotation-id', data.id);\n            if (typeof mozL10n !== 'undefined') {\n              mozL10n.translate(element);\n            }\n\n            var rect = data.rect;\n            var view = pdfPage.view;\n            rect = PDFJS.Util.normalizeRect([\n              rect[0],\n                view[3] - rect[1] + view[1],\n              rect[2],\n                view[3] - rect[3] + view[1]\n            ]);\n            element.style.left = rect[0] + 'px';\n            element.style.top = rect[1] + 'px';\n            element.style.position = 'absolute';\n\n            CustomStyle.setProp('transform', element, transformStr);\n            var transformOriginStr = -rect[0] + 'px ' + -rect[1] + 'px';\n            CustomStyle.setProp('transformOrigin', element, transformOriginStr);\n\n            if (data.subtype === 'Link' && !data.url) {\n              var link = element.getElementsByTagName('a')[0];\n              if (link) {\n                if (data.action) {\n                  bindNamedAction(link, data.action);\n                } else {\n                  bindLink(link, ('dest' in data) ? data.dest : null);\n                }\n              }\n            }\n\n            if (!self.div) {\n              var annotationLayerDiv = document.createElement('div');\n              annotationLayerDiv.className = 'annotationLayer';\n              self.pageDiv.appendChild(annotationLayerDiv);\n              self.div = annotationLayerDiv;\n            }\n\n            self.div.appendChild(element);\n          }\n        }\n      });\n    },\n\n    hide: function () {\n      if (!this.div) {\n        return;\n      }\n      this.div.setAttribute('hidden', 'true');\n    }\n  };\n  return AnnotationsLayerBuilder;\n})();\n\n/**\n * @constructor\n * @implements IPDFAnnotationsLayerFactory\n */\nfunction DefaultAnnotationsLayerFactory() {}\nDefaultAnnotationsLayerFactory.prototype = {\n  /**\n   * @param {HTMLDivElement} pageDiv\n   * @param {PDFPage} pdfPage\n   * @returns {AnnotationsLayerBuilder}\n   */\n  createAnnotationsLayerBuilder: function (pageDiv, pdfPage) {\n    return new AnnotationsLayerBuilder({\n      pageDiv: pageDiv,\n      pdfPage: pdfPage\n    });\n  }\n};\n\n\n/**\n * @typedef {Object} PDFViewerOptions\n * @property {HTMLDivElement} container - The container for the viewer element.\n * @property {HTMLDivElement} viewer - (optional) The viewer element.\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {PDFRenderingQueue} renderingQueue - (optional) The rendering\n *   queue object.\n * @property {boolean} removePageBorders - (optional) Removes the border shadow\n *   around the pages. The default is false.\n */\n\n/**\n * Simple viewer control to display PDF content/pages.\n * @class\n * @implements {IRenderableView}\n */\nvar PDFViewer = (function pdfViewer() {\n  function PDFPageViewBuffer(size) {\n    var data = [];\n    this.push = function cachePush(view) {\n      var i = data.indexOf(view);\n      if (i >= 0) {\n        data.splice(i, 1);\n      }\n      data.push(view);\n      if (data.length > size) {\n        data.shift().destroy();\n      }\n    };\n    this.resize = function (newSize) {\n      size = newSize;\n      while (data.length > size) {\n        data.shift().destroy();\n      }\n    };\n  }\n\n  /**\n   * @constructs PDFViewer\n   * @param {PDFViewerOptions} options\n   */\n  function PDFViewer(options) {\n    this.container = options.container;\n    this.viewer = options.viewer || options.container.firstElementChild;\n    this.linkService = options.linkService || new SimpleLinkService(this);\n    this.removePageBorders = options.removePageBorders || false;\n\n    this.defaultRenderingQueue = !options.renderingQueue;\n    if (this.defaultRenderingQueue) {\n      // Custom rendering queue is not specified, using default one\n      this.renderingQueue = new PDFRenderingQueue();\n      this.renderingQueue.setViewer(this);\n    } else {\n      this.renderingQueue = options.renderingQueue;\n    }\n\n    this.scroll = watchScroll(this.container, this._scrollUpdate.bind(this));\n    this.updateInProgress = false;\n    this.presentationModeState = PresentationModeState.UNKNOWN;\n    this._resetView();\n\n    if (this.removePageBorders) {\n      this.viewer.classList.add('removePageBorders');\n    }\n  }\n\n  PDFViewer.prototype = /** @lends PDFViewer.prototype */{\n    get pagesCount() {\n      return this._pages.length;\n    },\n\n    getPageView: function (index) {\n      return this._pages[index];\n    },\n\n    get currentPageNumber() {\n      return this._currentPageNumber;\n    },\n\n    set currentPageNumber(val) {\n      if (!this.pdfDocument) {\n        this._currentPageNumber = val;\n        return;\n      }\n\n      var event = document.createEvent('UIEvents');\n      event.initUIEvent('pagechange', true, true, window, 0);\n      event.updateInProgress = this.updateInProgress;\n\n      if (!(0 < val && val <= this.pagesCount)) {\n        event.pageNumber = this._currentPageNumber;\n        event.previousPageNumber = val;\n        this.container.dispatchEvent(event);\n        return;\n      }\n\n      event.previousPageNumber = this._currentPageNumber;\n      this._currentPageNumber = val;\n      event.pageNumber = val;\n      this.container.dispatchEvent(event);\n    },\n\n    /**\n     * @returns {number}\n     */\n    get currentScale() {\n      return this._currentScale;\n    },\n\n    /**\n     * @param {number} val - Scale of the pages in percents.\n     */\n    set currentScale(val) {\n      if (isNaN(val))  {\n        throw new Error('Invalid numeric scale');\n      }\n      if (!this.pdfDocument) {\n        this._currentScale = val;\n        this._currentScaleValue = val.toString();\n        return;\n      }\n      this._setScale(val, false);\n    },\n\n    /**\n     * @returns {string}\n     */\n    get currentScaleValue() {\n      return this._currentScaleValue;\n    },\n\n    /**\n     * @param val - The scale of the pages (in percent or predefined value).\n     */\n    set currentScaleValue(val) {\n      if (!this.pdfDocument) {\n        this._currentScale = isNaN(val) ? UNKNOWN_SCALE : val;\n        this._currentScaleValue = val;\n        return;\n      }\n      this._setScale(val, false);\n    },\n\n    /**\n     * @returns {number}\n     */\n    get pagesRotation() {\n      return this._pagesRotation;\n    },\n\n    /**\n     * @param {number} rotation - The rotation of the pages (0, 90, 180, 270).\n     */\n    set pagesRotation(rotation) {\n      this._pagesRotation = rotation;\n\n      for (var i = 0, l = this._pages.length; i < l; i++) {\n        var pageView = this._pages[i];\n        pageView.update(pageView.scale, rotation);\n      }\n\n      this._setScale(this._currentScaleValue, true);\n    },\n\n    /**\n     * @param pdfDocument {PDFDocument}\n     */\n    setDocument: function (pdfDocument) {\n      if (this.pdfDocument) {\n        this._resetView();\n      }\n\n      this.pdfDocument = pdfDocument;\n      if (!pdfDocument) {\n        return;\n      }\n\n      var pagesCount = pdfDocument.numPages;\n      var pagesRefMap = this.pagesRefMap = {};\n      var self = this;\n\n      var resolvePagesPromise;\n      var pagesPromise = new Promise(function (resolve) {\n        resolvePagesPromise = resolve;\n      });\n      this.pagesPromise = pagesPromise;\n      pagesPromise.then(function () {\n        var event = document.createEvent('CustomEvent');\n        event.initCustomEvent('pagesloaded', true, true, {\n          pagesCount: pagesCount\n        });\n        self.container.dispatchEvent(event);\n      });\n\n      var isOnePageRenderedResolved = false;\n      var resolveOnePageRendered = null;\n      var onePageRendered = new Promise(function (resolve) {\n        resolveOnePageRendered = resolve;\n      });\n      this.onePageRendered = onePageRendered;\n\n      var bindOnAfterAndBeforeDraw = function (pageView) {\n        pageView.onBeforeDraw = function pdfViewLoadOnBeforeDraw() {\n          // Add the page to the buffer at the start of drawing. That way it can\n          // be evicted from the buffer and destroyed even if we pause its\n          // rendering.\n          self._buffer.push(this);\n        };\n        // when page is painted, using the image as thumbnail base\n        pageView.onAfterDraw = function pdfViewLoadOnAfterDraw() {\n          if (!isOnePageRenderedResolved) {\n            isOnePageRenderedResolved = true;\n            resolveOnePageRendered();\n          }\n        };\n      };\n\n      var firstPagePromise = pdfDocument.getPage(1);\n      this.firstPagePromise = firstPagePromise;\n\n      // Fetch a single page so we can get a viewport that will be the default\n      // viewport for all pages\n      return firstPagePromise.then(function(pdfPage) {\n        var scale = this._currentScale || 1.0;\n        var viewport = pdfPage.getViewport(scale * CSS_UNITS);\n        for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n          var textLayerFactory = null;\n          if (!PDFJS.disableTextLayer) {\n            textLayerFactory = this;\n          }\n          var pageView = new PDFPageView({\n            container: this.viewer,\n            id: pageNum,\n            scale: scale,\n            defaultViewport: viewport.clone(),\n            renderingQueue: this.renderingQueue,\n            textLayerFactory: textLayerFactory,\n            annotationsLayerFactory: this\n          });\n          bindOnAfterAndBeforeDraw(pageView);\n          this._pages.push(pageView);\n        }\n\n        // Fetch all the pages since the viewport is needed before printing\n        // starts to create the correct size canvas. Wait until one page is\n        // rendered so we don't tie up too many resources early on.\n        onePageRendered.then(function () {\n          if (!PDFJS.disableAutoFetch) {\n            var getPagesLeft = pagesCount;\n            for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n              pdfDocument.getPage(pageNum).then(function (pageNum, pdfPage) {\n                var pageView = self._pages[pageNum - 1];\n                if (!pageView.pdfPage) {\n                  pageView.setPdfPage(pdfPage);\n                }\n                var refStr = pdfPage.ref.num + ' ' + pdfPage.ref.gen + ' R';\n                pagesRefMap[refStr] = pageNum;\n                getPagesLeft--;\n                if (!getPagesLeft) {\n                  resolvePagesPromise();\n                }\n              }.bind(null, pageNum));\n            }\n          } else {\n            // XXX: Printing is semi-broken with auto fetch disabled.\n            resolvePagesPromise();\n          }\n        });\n\n        var event = document.createEvent('CustomEvent');\n        event.initCustomEvent('pagesinit', true, true, null);\n        self.container.dispatchEvent(event);\n\n        if (this.defaultRenderingQueue) {\n          this.update();\n        }\n\n        if (this.findController) {\n          this.findController.resolveFirstPage();\n        }\n      }.bind(this));\n    },\n\n    _resetView: function () {\n      this._pages = [];\n      this._currentPageNumber = 1;\n      this._currentScale = UNKNOWN_SCALE;\n      this._currentScaleValue = null;\n      this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE);\n      this._location = null;\n      this._pagesRotation = 0;\n      this._pagesRequests = [];\n\n      var container = this.viewer;\n      while (container.hasChildNodes()) {\n        container.removeChild(container.lastChild);\n      }\n    },\n\n    _scrollUpdate: function () {\n      if (this.pagesCount === 0) {\n        return;\n      }\n      this.update();\n      for (var i = 0, ii = this._pages.length; i < ii; i++) {\n        this._pages[i].updatePosition();\n      }\n    },\n\n    _setScaleDispatchEvent: function pdfViewer_setScaleDispatchEvent(\n        newScale, newValue, preset) {\n      var event = document.createEvent('UIEvents');\n      event.initUIEvent('scalechange', true, true, window, 0);\n      event.scale = newScale;\n      if (preset) {\n        event.presetValue = newValue;\n      }\n      this.container.dispatchEvent(event);\n    },\n\n    _setScaleUpdatePages: function pdfViewer_setScaleUpdatePages(\n        newScale, newValue, noScroll, preset) {\n      this._currentScaleValue = newValue;\n      if (newScale === this._currentScale) {\n        if (preset) {\n          this._setScaleDispatchEvent(newScale, newValue, true);\n        }\n        return;\n      }\n\n      for (var i = 0, ii = this._pages.length; i < ii; i++) {\n        this._pages[i].update(newScale);\n      }\n      this._currentScale = newScale;\n\n      if (!noScroll) {\n        var page = this._currentPageNumber, dest;\n        if (this._location && !IGNORE_CURRENT_POSITION_ON_ZOOM &&\n            !(this.isInPresentationMode || this.isChangingPresentationMode)) {\n          page = this._location.pageNumber;\n          dest = [null, { name: 'XYZ' }, this._location.left,\n                  this._location.top, null];\n        }\n        this.scrollPageIntoView(page, dest);\n      }\n\n      this._setScaleDispatchEvent(newScale, newValue, preset);\n    },\n\n    _setScale: function pdfViewer_setScale(value, noScroll) {\n      if (value === 'custom') {\n        return;\n      }\n      var scale = parseFloat(value);\n\n      if (scale > 0) {\n        this._setScaleUpdatePages(scale, value, noScroll, false);\n      } else {\n        var currentPage = this._pages[this._currentPageNumber - 1];\n        if (!currentPage) {\n          return;\n        }\n        var hPadding = (this.isInPresentationMode || this.removePageBorders) ?\n          0 : SCROLLBAR_PADDING;\n        var vPadding = (this.isInPresentationMode || this.removePageBorders) ?\n          0 : VERTICAL_PADDING;\n        var pageWidthScale = (this.container.clientWidth - hPadding) /\n                             currentPage.width * currentPage.scale;\n        var pageHeightScale = (this.container.clientHeight - vPadding) /\n                              currentPage.height * currentPage.scale;\n        switch (value) {\n          case 'page-actual':\n            scale = 1;\n            break;\n          case 'page-width':\n            scale = pageWidthScale;\n            break;\n          case 'page-height':\n            scale = pageHeightScale;\n            break;\n          case 'page-fit':\n            scale = Math.min(pageWidthScale, pageHeightScale);\n            break;\n          case 'auto':\n            var isLandscape = (currentPage.width > currentPage.height);\n            // For pages in landscape mode, fit the page height to the viewer\n            // *unless* the page would thus become too wide to fit horizontally.\n            var horizontalScale = isLandscape ?\n              Math.min(pageHeightScale, pageWidthScale) : pageWidthScale;\n            scale = Math.min(MAX_AUTO_SCALE, horizontalScale);\n            break;\n          default:\n            console.error('pdfViewSetScale: \\'' + value +\n              '\\' is an unknown zoom value.');\n            return;\n        }\n        this._setScaleUpdatePages(scale, value, noScroll, true);\n      }\n    },\n\n    /**\n     * Scrolls page into view.\n     * @param {number} pageNumber\n     * @param {Array} dest - (optional) original PDF destination array:\n     *   <page-ref> </XYZ|FitXXX> <args..>\n     */\n    scrollPageIntoView: function PDFViewer_scrollPageIntoView(pageNumber,\n                                                              dest) {\n      var pageView = this._pages[pageNumber - 1];\n\n      if (this.isInPresentationMode) {\n        if (this.linkService.page !== pageView.id) {\n          // Avoid breaking getVisiblePages in presentation mode.\n          this.linkService.page = pageView.id;\n          return;\n        }\n        dest = null;\n        // Fixes the case when PDF has different page sizes.\n        this._setScale(this.currentScaleValue, true);\n      }\n      if (!dest) {\n        scrollIntoView(pageView.div);\n        return;\n      }\n\n      var x = 0, y = 0;\n      var width = 0, height = 0, widthScale, heightScale;\n      var changeOrientation = (pageView.rotation % 180 === 0 ? false : true);\n      var pageWidth = (changeOrientation ? pageView.height : pageView.width) /\n        pageView.scale / CSS_UNITS;\n      var pageHeight = (changeOrientation ? pageView.width : pageView.height) /\n        pageView.scale / CSS_UNITS;\n      var scale = 0;\n      switch (dest[1].name) {\n        case 'XYZ':\n          x = dest[2];\n          y = dest[3];\n          scale = dest[4];\n          // If x and/or y coordinates are not supplied, default to\n          // _top_ left of the page (not the obvious bottom left,\n          // since aligning the bottom of the intended page with the\n          // top of the window is rarely helpful).\n          x = x !== null ? x : 0;\n          y = y !== null ? y : pageHeight;\n          break;\n        case 'Fit':\n        case 'FitB':\n          scale = 'page-fit';\n          break;\n        case 'FitH':\n        case 'FitBH':\n          y = dest[2];\n          scale = 'page-width';\n          break;\n        case 'FitV':\n        case 'FitBV':\n          x = dest[2];\n          width = pageWidth;\n          height = pageHeight;\n          scale = 'page-height';\n          break;\n        case 'FitR':\n          x = dest[2];\n          y = dest[3];\n          width = dest[4] - x;\n          height = dest[5] - y;\n          var viewerContainer = this.container;\n          var hPadding = this.removePageBorders ? 0 : SCROLLBAR_PADDING;\n          var vPadding = this.removePageBorders ? 0 : VERTICAL_PADDING;\n\n          widthScale = (viewerContainer.clientWidth - hPadding) /\n            width / CSS_UNITS;\n          heightScale = (viewerContainer.clientHeight - vPadding) /\n            height / CSS_UNITS;\n          scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));\n          break;\n        default:\n          return;\n      }\n\n      if (scale && scale !== this.currentScale) {\n        this.currentScaleValue = scale;\n      } else if (this.currentScale === UNKNOWN_SCALE) {\n        this.currentScaleValue = DEFAULT_SCALE;\n      }\n\n      if (scale === 'page-fit' && !dest[4]) {\n        scrollIntoView(pageView.div);\n        return;\n      }\n\n      var boundingRect = [\n        pageView.viewport.convertToViewportPoint(x, y),\n        pageView.viewport.convertToViewportPoint(x + width, y + height)\n      ];\n      var left = Math.min(boundingRect[0][0], boundingRect[1][0]);\n      var top = Math.min(boundingRect[0][1], boundingRect[1][1]);\n\n      scrollIntoView(pageView.div, { left: left, top: top });\n    },\n\n    _updateLocation: function (firstPage) {\n      var currentScale = this._currentScale;\n      var currentScaleValue = this._currentScaleValue;\n      var normalizedScaleValue =\n        parseFloat(currentScaleValue) === currentScale ?\n        Math.round(currentScale * 10000) / 100 : currentScaleValue;\n\n      var pageNumber = firstPage.id;\n      var pdfOpenParams = '#page=' + pageNumber;\n      pdfOpenParams += '&zoom=' + normalizedScaleValue;\n      var currentPageView = this._pages[pageNumber - 1];\n      var container = this.container;\n      var topLeft = currentPageView.getPagePoint(\n        (container.scrollLeft - firstPage.x),\n        (container.scrollTop - firstPage.y));\n      var intLeft = Math.round(topLeft[0]);\n      var intTop = Math.round(topLeft[1]);\n      pdfOpenParams += ',' + intLeft + ',' + intTop;\n\n      this._location = {\n        pageNumber: pageNumber,\n        scale: normalizedScaleValue,\n        top: intTop,\n        left: intLeft,\n        pdfOpenParams: pdfOpenParams\n      };\n    },\n\n    update: function () {\n      var visible = this._getVisiblePages();\n      var visiblePages = visible.views;\n      if (visiblePages.length === 0) {\n        return;\n      }\n\n      this.updateInProgress = true;\n\n      var suggestedCacheSize = Math.max(DEFAULT_CACHE_SIZE,\n          2 * visiblePages.length + 1);\n      this._buffer.resize(suggestedCacheSize);\n\n      this.renderingQueue.renderHighestPriority(visible);\n\n      var currentId = this.currentPageNumber;\n      var firstPage = visible.first;\n\n      for (var i = 0, ii = visiblePages.length, stillFullyVisible = false;\n           i < ii; ++i) {\n        var page = visiblePages[i];\n\n        if (page.percent < 100) {\n          break;\n        }\n        if (page.id === currentId) {\n          stillFullyVisible = true;\n          break;\n        }\n      }\n\n      if (!stillFullyVisible) {\n        currentId = visiblePages[0].id;\n      }\n\n      if (!this.isInPresentationMode) {\n        this.currentPageNumber = currentId;\n      }\n\n      this._updateLocation(firstPage);\n\n      this.updateInProgress = false;\n\n      var event = document.createEvent('UIEvents');\n      event.initUIEvent('updateviewarea', true, true, window, 0);\n      event.location = this._location;\n      this.container.dispatchEvent(event);\n    },\n\n    containsElement: function (element) {\n      return this.container.contains(element);\n    },\n\n    focus: function () {\n      this.container.focus();\n    },\n\n    get isInPresentationMode() {\n      return this.presentationModeState === PresentationModeState.FULLSCREEN;\n    },\n\n    get isChangingPresentationMode() {\n      return this.PresentationModeState === PresentationModeState.CHANGING;\n    },\n\n    get isHorizontalScrollbarEnabled() {\n      return (this.isInPresentationMode ?\n        false : (this.container.scrollWidth > this.container.clientWidth));\n    },\n\n    _getVisiblePages: function () {\n      if (!this.isInPresentationMode) {\n        return getVisibleElements(this.container, this._pages, true);\n      } else {\n        // The algorithm in getVisibleElements doesn't work in all browsers and\n        // configurations when presentation mode is active.\n        var visible = [];\n        var currentPage = this._pages[this._currentPageNumber - 1];\n        visible.push({ id: currentPage.id, view: currentPage });\n        return { first: currentPage, last: currentPage, views: visible };\n      }\n    },\n\n    cleanup: function () {\n      for (var i = 0, ii = this._pages.length; i < ii; i++) {\n        if (this._pages[i] &&\n            this._pages[i].renderingState !== RenderingStates.FINISHED) {\n          this._pages[i].reset();\n        }\n      }\n    },\n\n    /**\n     * @param {PDFPageView} pageView\n     * @returns {PDFPage}\n     * @private\n     */\n    _ensurePdfPageLoaded: function (pageView) {\n      if (pageView.pdfPage) {\n        return Promise.resolve(pageView.pdfPage);\n      }\n      var pageNumber = pageView.id;\n      if (this._pagesRequests[pageNumber]) {\n        return this._pagesRequests[pageNumber];\n      }\n      var promise = this.pdfDocument.getPage(pageNumber).then(\n          function (pdfPage) {\n        pageView.setPdfPage(pdfPage);\n        this._pagesRequests[pageNumber] = null;\n        return pdfPage;\n      }.bind(this));\n      this._pagesRequests[pageNumber] = promise;\n      return promise;\n    },\n\n    forceRendering: function (currentlyVisiblePages) {\n      var visiblePages = currentlyVisiblePages || this._getVisiblePages();\n      var pageView = this.renderingQueue.getHighestPriority(visiblePages,\n                                                            this._pages,\n                                                            this.scroll.down);\n      if (pageView) {\n        this._ensurePdfPageLoaded(pageView).then(function () {\n          this.renderingQueue.renderView(pageView);\n        }.bind(this));\n        return true;\n      }\n      return false;\n    },\n\n    getPageTextContent: function (pageIndex) {\n      return this.pdfDocument.getPage(pageIndex + 1).then(function (page) {\n        return page.getTextContent();\n      });\n    },\n\n    /**\n     * @param {HTMLDivElement} textLayerDiv\n     * @param {number} pageIndex\n     * @param {PageViewport} viewport\n     * @returns {TextLayerBuilder}\n     */\n    createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport) {\n      return new TextLayerBuilder({\n        textLayerDiv: textLayerDiv,\n        pageIndex: pageIndex,\n        viewport: viewport,\n        findController: this.isInPresentationMode ? null : this.findController\n      });\n    },\n\n    /**\n     * @param {HTMLDivElement} pageDiv\n     * @param {PDFPage} pdfPage\n     * @returns {AnnotationsLayerBuilder}\n     */\n    createAnnotationsLayerBuilder: function (pageDiv, pdfPage) {\n      return new AnnotationsLayerBuilder({\n        pageDiv: pageDiv,\n        pdfPage: pdfPage,\n        linkService: this.linkService\n      });\n    },\n\n    setFindController: function (findController) {\n      this.findController = findController;\n    },\n  };\n\n  return PDFViewer;\n})();\n\nvar SimpleLinkService = (function SimpleLinkServiceClosure() {\n  function SimpleLinkService(pdfViewer) {\n    this.pdfViewer = pdfViewer;\n  }\n  SimpleLinkService.prototype = {\n    /**\n     * @returns {number}\n     */\n    get page() {\n      return this.pdfViewer.currentPageNumber;\n    },\n    /**\n     * @param {number} value\n     */\n    set page(value) {\n      this.pdfViewer.currentPageNumber = value;\n    },\n    /**\n     * @param dest - The PDF destination object.\n     */\n    navigateTo: function (dest) {},\n    /**\n     * @param dest - The PDF destination object.\n     * @returns {string} The hyperlink to the PDF object.\n     */\n    getDestinationHash: function (dest) {\n      return '#';\n    },\n    /**\n     * @param hash - The PDF parameters/hash.\n     * @returns {string} The hyperlink to the PDF object.\n     */\n    getAnchorUrl: function (hash) {\n      return '#';\n    },\n    /**\n     * @param {string} hash\n     */\n    setHash: function (hash) {},\n    /**\n     * @param {string} action\n     */\n    executeNamedAction: function (action) {},\n  };\n  return SimpleLinkService;\n})();\n\n\nvar THUMBNAIL_SCROLL_MARGIN = -19;\n\n\nvar THUMBNAIL_WIDTH = 98; // px\nvar THUMBNAIL_CANVAS_BORDER_WIDTH = 1; // px\n\n/**\n * @typedef {Object} PDFThumbnailViewOptions\n * @property {HTMLDivElement} container - The viewer element.\n * @property {number} id - The thumbnail's unique ID (normally its number).\n * @property {PageViewport} defaultViewport - The page viewport.\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {PDFRenderingQueue} renderingQueue - The rendering queue object.\n */\n\n/**\n * @class\n * @implements {IRenderableView}\n */\nvar PDFThumbnailView = (function PDFThumbnailViewClosure() {\n  function getTempCanvas(width, height) {\n    var tempCanvas = PDFThumbnailView.tempImageCache;\n    if (!tempCanvas) {\n      tempCanvas = document.createElement('canvas');\n      PDFThumbnailView.tempImageCache = tempCanvas;\n    }\n    tempCanvas.width = width;\n    tempCanvas.height = height;\n\n    // Since this is a temporary canvas, we need to fill the canvas with a white\n    // background ourselves. |_getPageDrawContext| uses CSS rules for this.\n    var ctx = tempCanvas.getContext('2d');\n    ctx.save();\n    ctx.fillStyle = 'rgb(255, 255, 255)';\n    ctx.fillRect(0, 0, width, height);\n    ctx.restore();\n    return tempCanvas;\n  }\n\n  /**\n   * @constructs PDFThumbnailView\n   * @param {PDFThumbnailViewOptions} options\n   */\n  function PDFThumbnailView(options) {\n    var container = options.container;\n    var id = options.id;\n    var defaultViewport = options.defaultViewport;\n    var linkService = options.linkService;\n    var renderingQueue = options.renderingQueue;\n\n    this.id = id;\n    this.renderingId = 'thumbnail' + id;\n\n    this.pdfPage = null;\n    this.rotation = 0;\n    this.viewport = defaultViewport;\n    this.pdfPageRotate = defaultViewport.rotation;\n\n    this.linkService = linkService;\n    this.renderingQueue = renderingQueue;\n\n    this.hasImage = false;\n    this.resume = null;\n    this.renderingState = RenderingStates.INITIAL;\n\n    this.pageWidth = this.viewport.width;\n    this.pageHeight = this.viewport.height;\n    this.pageRatio = this.pageWidth / this.pageHeight;\n\n    this.canvasWidth = THUMBNAIL_WIDTH;\n    this.canvasHeight = (this.canvasWidth / this.pageRatio) | 0;\n    this.scale = this.canvasWidth / this.pageWidth;\n\n    var anchor = document.createElement('a');\n    anchor.href = linkService.getAnchorUrl('#page=' + id);\n    anchor.title = mozL10n.get('thumb_page_title', {page: id}, 'Page {{page}}');\n    anchor.onclick = function stopNavigation() {\n      linkService.page = id;\n      return false;\n    };\n\n    var div = document.createElement('div');\n    div.id = 'thumbnailContainer' + id;\n    div.className = 'thumbnail';\n    this.div = div;\n\n    if (id === 1) {\n      // Highlight the thumbnail of the first page when no page number is\n      // specified (or exists in cache) when the document is loaded.\n      div.classList.add('selected');\n    }\n\n    var ring = document.createElement('div');\n    ring.className = 'thumbnailSelectionRing';\n    var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;\n    ring.style.width = this.canvasWidth + borderAdjustment + 'px';\n    ring.style.height = this.canvasHeight + borderAdjustment + 'px';\n    this.ring = ring;\n\n    div.appendChild(ring);\n    anchor.appendChild(div);\n    container.appendChild(anchor);\n  }\n\n  PDFThumbnailView.prototype = {\n    setPdfPage: function PDFThumbnailView_setPdfPage(pdfPage) {\n      this.pdfPage = pdfPage;\n      this.pdfPageRotate = pdfPage.rotate;\n      var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n      this.viewport = pdfPage.getViewport(1, totalRotation);\n      this.reset();\n    },\n\n    reset: function PDFThumbnailView_reset() {\n      if (this.renderTask) {\n        this.renderTask.cancel();\n      }\n      this.hasImage = false;\n      this.resume = null;\n      this.renderingState = RenderingStates.INITIAL;\n\n      this.pageWidth = this.viewport.width;\n      this.pageHeight = this.viewport.height;\n      this.pageRatio = this.pageWidth / this.pageHeight;\n\n      this.canvasHeight = (this.canvasWidth / this.pageRatio) | 0;\n      this.scale = (this.canvasWidth / this.pageWidth);\n\n      this.div.removeAttribute('data-loaded');\n      var ring = this.ring;\n      var childNodes = ring.childNodes;\n      for (var i = childNodes.length - 1; i >= 0; i--) {\n        ring.removeChild(childNodes[i]);\n      }\n      var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;\n      ring.style.width = this.canvasWidth + borderAdjustment + 'px';\n      ring.style.height = this.canvasHeight + borderAdjustment + 'px';\n\n      if (this.canvas) {\n        // Zeroing the width and height causes Firefox to release graphics\n        // resources immediately, which can greatly reduce memory consumption.\n        this.canvas.width = 0;\n        this.canvas.height = 0;\n        delete this.canvas;\n      }\n    },\n\n    update: function PDFThumbnailView_update(rotation) {\n      if (typeof rotation !== 'undefined') {\n        this.rotation = rotation;\n      }\n      var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n      this.viewport = this.viewport.clone({\n        scale: 1,\n        rotation: totalRotation\n      });\n      this.reset();\n    },\n\n    /**\n     * @private\n     */\n    _getPageDrawContext:\n        function PDFThumbnailView_getPageDrawContext(noCtxScale) {\n      var canvas = document.createElement('canvas');\n      canvas.id = this.renderingId;\n\n      canvas.className = 'thumbnailImage';\n      canvas.setAttribute('aria-label', mozL10n.get('thumb_page_canvas',\n        {page: this.id}, 'Thumbnail of Page {{page}}'));\n\n      this.canvas = canvas;\n      this.div.setAttribute('data-loaded', true);\n      this.ring.appendChild(canvas);\n\n      var ctx = canvas.getContext('2d');\n      var outputScale = getOutputScale(ctx);\n      canvas.width = (this.canvasWidth * outputScale.sx) | 0;\n      canvas.height = (this.canvasHeight * outputScale.sy) | 0;\n      canvas.style.width = this.canvasWidth + 'px';\n      canvas.style.height = this.canvasHeight + 'px';\n      if (!noCtxScale && outputScale.scaled) {\n        ctx.scale(outputScale.sx, outputScale.sy);\n      }\n      return ctx;\n    },\n\n    draw: function PDFThumbnailView_draw() {\n      if (this.renderingState !== RenderingStates.INITIAL) {\n        console.error('Must be in new state before drawing');\n      }\n      if (this.hasImage) {\n        return Promise.resolve(undefined);\n      }\n      this.hasImage = true;\n      this.renderingState = RenderingStates.RUNNING;\n\n      var resolveRenderPromise, rejectRenderPromise;\n      var promise = new Promise(function (resolve, reject) {\n        resolveRenderPromise = resolve;\n        rejectRenderPromise = reject;\n      });\n\n      var self = this;\n      function thumbnailDrawCallback(error) {\n        // The renderTask may have been replaced by a new one, so only remove\n        // the reference to the renderTask if it matches the one that is\n        // triggering this callback.\n        if (renderTask === self.renderTask) {\n          self.renderTask = null;\n        }\n        if (error === 'cancelled') {\n          rejectRenderPromise(error);\n          return;\n        }\n        self.renderingState = RenderingStates.FINISHED;\n\n        if (!error) {\n          resolveRenderPromise(undefined);\n        } else {\n          rejectRenderPromise(error);\n        }\n      }\n\n      var ctx = this._getPageDrawContext();\n      var drawViewport = this.viewport.clone({ scale: this.scale });\n      var renderContinueCallback = function renderContinueCallback(cont) {\n        if (!self.renderingQueue.isHighestPriority(self)) {\n          self.renderingState = RenderingStates.PAUSED;\n          self.resume = function resumeCallback() {\n            self.renderingState = RenderingStates.RUNNING;\n            cont();\n          };\n          return;\n        }\n        cont();\n      };\n\n      var renderContext = {\n        canvasContext: ctx,\n        viewport: drawViewport,\n        continueCallback: renderContinueCallback\n      };\n      var renderTask = this.renderTask = this.pdfPage.render(renderContext);\n\n      renderTask.promise.then(\n        function pdfPageRenderCallback() {\n          thumbnailDrawCallback(null);\n        },\n        function pdfPageRenderError(error) {\n          thumbnailDrawCallback(error);\n        }\n      );\n      return promise;\n    },\n\n    setImage: function PDFThumbnailView_setImage(pageView) {\n      var img = pageView.canvas;\n      if (this.hasImage || !img) {\n        return;\n      }\n      if (!this.pdfPage) {\n        this.setPdfPage(pageView.pdfPage);\n      }\n      this.hasImage = true;\n      this.renderingState = RenderingStates.FINISHED;\n\n      var ctx = this._getPageDrawContext(true);\n      var canvas = ctx.canvas;\n\n      if (img.width <= 2 * canvas.width) {\n        ctx.drawImage(img, 0, 0, img.width, img.height,\n                      0, 0, canvas.width, canvas.height);\n        return;\n      }\n      // drawImage does an awful job of rescaling the image, doing it gradually.\n      var MAX_NUM_SCALING_STEPS = 3;\n      var reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS;\n      var reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS;\n      var reducedImage = getTempCanvas(reducedWidth, reducedHeight);\n      var reducedImageCtx = reducedImage.getContext('2d');\n\n      while (reducedWidth > img.width || reducedHeight > img.height) {\n        reducedWidth >>= 1;\n        reducedHeight >>= 1;\n      }\n      reducedImageCtx.drawImage(img, 0, 0, img.width, img.height,\n                                0, 0, reducedWidth, reducedHeight);\n      while (reducedWidth > 2 * canvas.width) {\n        reducedImageCtx.drawImage(reducedImage,\n                                  0, 0, reducedWidth, reducedHeight,\n                                  0, 0, reducedWidth >> 1, reducedHeight >> 1);\n        reducedWidth >>= 1;\n        reducedHeight >>= 1;\n      }\n      ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight,\n                    0, 0, canvas.width, canvas.height);\n    }\n  };\n\n  return PDFThumbnailView;\n})();\n\nPDFThumbnailView.tempImageCache = null;\n\n\n/**\n * @typedef {Object} PDFThumbnailViewerOptions\n * @property {HTMLDivElement} container - The container for the thumbnail\n *   elements.\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {PDFRenderingQueue} renderingQueue - The rendering queue object.\n */\n\n/**\n * Simple viewer control to display thumbnails for pages.\n * @class\n * @implements {IRenderableView}\n */\nvar PDFThumbnailViewer = (function PDFThumbnailViewerClosure() {\n  /**\n   * @constructs PDFThumbnailViewer\n   * @param {PDFThumbnailViewerOptions} options\n   */\n  function PDFThumbnailViewer(options) {\n    this.container = options.container;\n    this.renderingQueue = options.renderingQueue;\n    this.linkService = options.linkService;\n\n    this.scroll = watchScroll(this.container, this._scrollUpdated.bind(this));\n    this._resetView();\n  }\n\n  PDFThumbnailViewer.prototype = {\n    /**\n     * @private\n     */\n    _scrollUpdated: function PDFThumbnailViewer_scrollUpdated() {\n      this.renderingQueue.renderHighestPriority();\n    },\n\n    getThumbnail: function PDFThumbnailViewer_getThumbnail(index) {\n      return this.thumbnails[index];\n    },\n\n    /**\n     * @private\n     */\n    _getVisibleThumbs: function PDFThumbnailViewer_getVisibleThumbs() {\n      return getVisibleElements(this.container, this.thumbnails);\n    },\n\n    scrollThumbnailIntoView:\n        function PDFThumbnailViewer_scrollThumbnailIntoView(page) {\n      var selected = document.querySelector('.thumbnail.selected');\n      if (selected) {\n        selected.classList.remove('selected');\n      }\n      var thumbnail = document.getElementById('thumbnailContainer' + page);\n      if (thumbnail) {\n        thumbnail.classList.add('selected');\n      }\n      var visibleThumbs = this._getVisibleThumbs();\n      var numVisibleThumbs = visibleThumbs.views.length;\n\n      // If the thumbnail isn't currently visible, scroll it into view.\n      if (numVisibleThumbs > 0) {\n        var first = visibleThumbs.first.id;\n        // Account for only one thumbnail being visible.\n        var last = (numVisibleThumbs > 1 ? visibleThumbs.last.id : first);\n        if (page <= first || page >= last) {\n          scrollIntoView(thumbnail, { top: THUMBNAIL_SCROLL_MARGIN });\n        }\n      }\n    },\n\n    get pagesRotation() {\n      return this._pagesRotation;\n    },\n\n    set pagesRotation(rotation) {\n      this._pagesRotation = rotation;\n      for (var i = 0, l = this.thumbnails.length; i < l; i++) {\n        var thumb = this.thumbnails[i];\n        thumb.update(rotation);\n      }\n    },\n\n    cleanup: function PDFThumbnailViewer_cleanup() {\n      var tempCanvas = PDFThumbnailView.tempImageCache;\n      if (tempCanvas) {\n        // Zeroing the width and height causes Firefox to release graphics\n        // resources immediately, which can greatly reduce memory consumption.\n        tempCanvas.width = 0;\n        tempCanvas.height = 0;\n      }\n      PDFThumbnailView.tempImageCache = null;\n    },\n\n    /**\n     * @private\n     */\n    _resetView: function PDFThumbnailViewer_resetView() {\n      this.thumbnails = [];\n      this._pagesRotation = 0;\n      this._pagesRequests = [];\n    },\n\n    setDocument: function PDFThumbnailViewer_setDocument(pdfDocument) {\n      if (this.pdfDocument) {\n        // cleanup of the elements and views\n        var thumbsView = this.container;\n        while (thumbsView.hasChildNodes()) {\n          thumbsView.removeChild(thumbsView.lastChild);\n        }\n        this._resetView();\n      }\n\n      this.pdfDocument = pdfDocument;\n      if (!pdfDocument) {\n        return Promise.resolve();\n      }\n\n      return pdfDocument.getPage(1).then(function (firstPage) {\n        var pagesCount = pdfDocument.numPages;\n        var viewport = firstPage.getViewport(1.0);\n        for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n          var thumbnail = new PDFThumbnailView({\n            container: this.container,\n            id: pageNum,\n            defaultViewport: viewport.clone(),\n            linkService: this.linkService,\n            renderingQueue: this.renderingQueue\n          });\n          this.thumbnails.push(thumbnail);\n        }\n      }.bind(this));\n    },\n\n    /**\n     * @param {PDFPageView} pageView\n     * @returns {PDFPage}\n     * @private\n     */\n    _ensurePdfPageLoaded:\n        function PDFThumbnailViewer_ensurePdfPageLoaded(thumbView) {\n      if (thumbView.pdfPage) {\n        return Promise.resolve(thumbView.pdfPage);\n      }\n      var pageNumber = thumbView.id;\n      if (this._pagesRequests[pageNumber]) {\n        return this._pagesRequests[pageNumber];\n      }\n      var promise = this.pdfDocument.getPage(pageNumber).then(\n        function (pdfPage) {\n          thumbView.setPdfPage(pdfPage);\n          this._pagesRequests[pageNumber] = null;\n          return pdfPage;\n        }.bind(this));\n      this._pagesRequests[pageNumber] = promise;\n      return promise;\n    },\n\n    ensureThumbnailVisible:\n        function PDFThumbnailViewer_ensureThumbnailVisible(page) {\n      // Ensure that the thumbnail of the current page is visible\n      // when switching from another view.\n      scrollIntoView(document.getElementById('thumbnailContainer' + page));\n    },\n\n    forceRendering: function () {\n      var visibleThumbs = this._getVisibleThumbs();\n      var thumbView = this.renderingQueue.getHighestPriority(visibleThumbs,\n                                                             this.thumbnails,\n                                                             this.scroll.down);\n      if (thumbView) {\n        this._ensurePdfPageLoaded(thumbView).then(function () {\n          this.renderingQueue.renderView(thumbView);\n        }.bind(this));\n        return true;\n      }\n      return false;\n    }\n  };\n\n  return PDFThumbnailViewer;\n})();\n\n\n/**\n * @typedef {Object} PDFOutlineViewOptions\n * @property {HTMLDivElement} container - The viewer element.\n * @property {Array} outline - An array of outline objects.\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n */\n\n/**\n * @class\n */\nvar PDFOutlineView = (function PDFOutlineViewClosure() {\n  /**\n   * @constructs PDFOutlineView\n   * @param {PDFOutlineViewOptions} options\n   */\n  function PDFOutlineView(options) {\n    this.container = options.container;\n    this.outline = options.outline;\n    this.linkService = options.linkService;\n  }\n\n  PDFOutlineView.prototype = {\n    reset: function PDFOutlineView_reset() {\n      var container = this.container;\n      while (container.firstChild) {\n        container.removeChild(container.firstChild);\n      }\n    },\n\n    /**\n     * @private\n     */\n    _dispatchEvent: function PDFOutlineView_dispatchEvent(outlineCount) {\n      var event = document.createEvent('CustomEvent');\n      event.initCustomEvent('outlineloaded', true, true, {\n        outlineCount: outlineCount\n      });\n      this.container.dispatchEvent(event);\n    },\n\n    /**\n     * @private\n     */\n    _bindLink: function PDFOutlineView_bindLink(element, item) {\n      var linkService = this.linkService;\n      element.href = linkService.getDestinationHash(item.dest);\n      element.onclick = function goToDestination(e) {\n        linkService.navigateTo(item.dest);\n        return false;\n      };\n    },\n\n    render: function PDFOutlineView_render() {\n      var outline = this.outline;\n      var outlineCount = 0;\n\n      this.reset();\n\n      if (!outline) {\n        this._dispatchEvent(outlineCount);\n        return;\n      }\n\n      var queue = [{ parent: this.container, items: this.outline }];\n      while (queue.length > 0) {\n        var levelData = queue.shift();\n        for (var i = 0, len = levelData.items.length; i < len; i++) {\n          var item = levelData.items[i];\n          var div = document.createElement('div');\n          div.className = 'outlineItem';\n          var element = document.createElement('a');\n          this._bindLink(element, item);\n          element.textContent = item.title;\n          div.appendChild(element);\n\n          if (item.items.length > 0) {\n            var itemsDiv = document.createElement('div');\n            itemsDiv.className = 'outlineItems';\n            div.appendChild(itemsDiv);\n            queue.push({ parent: itemsDiv, items: item.items });\n          }\n\n          levelData.parent.appendChild(div);\n          outlineCount++;\n        }\n      }\n\n      this._dispatchEvent(outlineCount);\n    }\n  };\n\n  return PDFOutlineView;\n})();\n\n\n/**\n * @typedef {Object} PDFAttachmentViewOptions\n * @property {HTMLDivElement} container - The viewer element.\n * @property {Array} attachments - An array of attachment objects.\n * @property {DownloadManager} downloadManager - The download manager.\n */\n\n/**\n * @class\n */\nvar PDFAttachmentView = (function PDFAttachmentViewClosure() {\n  /**\n   * @constructs PDFAttachmentView\n   * @param {PDFAttachmentViewOptions} options\n   */\n  function PDFAttachmentView(options) {\n    this.container = options.container;\n    this.attachments = options.attachments;\n    this.downloadManager = options.downloadManager;\n  }\n\n  PDFAttachmentView.prototype = {\n    reset: function PDFAttachmentView_reset() {\n      var container = this.container;\n      while (container.firstChild) {\n        container.removeChild(container.firstChild);\n      }\n    },\n\n    /**\n     * @private\n     */\n    _dispatchEvent: function PDFAttachmentView_dispatchEvent(attachmentsCount) {\n      var event = document.createEvent('CustomEvent');\n      event.initCustomEvent('attachmentsloaded', true, true, {\n        attachmentsCount: attachmentsCount\n      });\n      this.container.dispatchEvent(event);\n    },\n\n    /**\n     * @private\n     */\n    _bindLink: function PDFAttachmentView_bindLink(button, content, filename) {\n      button.onclick = function downloadFile(e) {\n        this.downloadManager.downloadData(content, filename, '');\n        return false;\n      }.bind(this);\n    },\n\n    render: function PDFAttachmentView_render() {\n      var attachments = this.attachments;\n      var attachmentsCount = 0;\n\n      this.reset();\n\n      if (!attachments) {\n        this._dispatchEvent(attachmentsCount);\n        return;\n      }\n\n      var names = Object.keys(attachments).sort(function(a, b) {\n        return a.toLowerCase().localeCompare(b.toLowerCase());\n      });\n      attachmentsCount = names.length;\n\n      for (var i = 0; i < attachmentsCount; i++) {\n        var item = attachments[names[i]];\n        var filename = getFileName(item.filename);\n        var div = document.createElement('div');\n        div.className = 'attachmentsItem';\n        var button = document.createElement('button');\n        this._bindLink(button, item.content, filename);\n        button.textContent = filename;\n        div.appendChild(button);\n        this.container.appendChild(div);\n      }\n\n      this._dispatchEvent(attachmentsCount);\n    }\n  };\n\n  return PDFAttachmentView;\n})();\n\n\nvar PDFViewerApplication = {\n  initialBookmark: document.location.hash.substring(1),\n  initialized: false,\n  fellback: false,\n  pdfDocument: null,\n  sidebarOpen: false,\n  printing: false,\n  /** @type {PDFViewer} */\n  pdfViewer: null,\n  /** @type {PDFThumbnailViewer} */\n  pdfThumbnailViewer: null,\n  /** @type {PDFRenderingQueue} */\n  pdfRenderingQueue: null,\n  /** @type {PDFPresentationMode} */\n  pdfPresentationMode: null,\n  /** @type {PDFDocumentProperties} */\n  pdfDocumentProperties: null,\n  pageRotation: 0,\n  updateScaleControls: true,\n  isInitialViewSet: false,\n  animationStartedPromise: null,\n  preferenceSidebarViewOnLoad: SidebarView.NONE,\n  preferencePdfBugEnabled: false,\n  preferenceShowPreviousViewOnLoad: true,\n  preferenceDefaultZoomValue: '',\n  isViewerEmbedded: (window.parent !== window),\n  url: '',\n\n  // called once when the document is loaded\n  initialize: function pdfViewInitialize() {\n    var pdfRenderingQueue = new PDFRenderingQueue();\n    pdfRenderingQueue.onIdle = this.cleanup.bind(this);\n    this.pdfRenderingQueue = pdfRenderingQueue;\n\n    var container = document.getElementById('viewerContainer');\n    var viewer = document.getElementById('viewer');\n    this.pdfViewer = new PDFViewer({\n      container: container,\n      viewer: viewer,\n      renderingQueue: pdfRenderingQueue,\n      linkService: this\n    });\n    pdfRenderingQueue.setViewer(this.pdfViewer);\n\n    var thumbnailContainer = document.getElementById('thumbnailView');\n    this.pdfThumbnailViewer = new PDFThumbnailViewer({\n      container: thumbnailContainer,\n      renderingQueue: pdfRenderingQueue,\n      linkService: this\n    });\n    pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer);\n\n    Preferences.initialize();\n\n    this.findController = new PDFFindController({\n      pdfViewer: this.pdfViewer,\n      integratedFind: this.supportsIntegratedFind\n    });\n    this.pdfViewer.setFindController(this.findController);\n\n    this.findBar = new PDFFindBar({\n      bar: document.getElementById('findbar'),\n      toggleButton: document.getElementById('viewFind'),\n      findField: document.getElementById('findInput'),\n      highlightAllCheckbox: document.getElementById('findHighlightAll'),\n      caseSensitiveCheckbox: document.getElementById('findMatchCase'),\n      findMsg: document.getElementById('findMsg'),\n      findStatusIcon: document.getElementById('findStatusIcon'),\n      findPreviousButton: document.getElementById('findPrevious'),\n      findNextButton: document.getElementById('findNext'),\n      findController: this.findController\n    });\n\n    this.findController.setFindBar(this.findBar);\n\n    HandTool.initialize({\n      container: container,\n      toggleHandTool: document.getElementById('toggleHandTool')\n    });\n\n    this.pdfDocumentProperties = new PDFDocumentProperties({\n      overlayName: 'documentPropertiesOverlay',\n      closeButton: document.getElementById('documentPropertiesClose'),\n      fields: {\n        'fileName': document.getElementById('fileNameField'),\n        'fileSize': document.getElementById('fileSizeField'),\n        'title': document.getElementById('titleField'),\n        'author': document.getElementById('authorField'),\n        'subject': document.getElementById('subjectField'),\n        'keywords': document.getElementById('keywordsField'),\n        'creationDate': document.getElementById('creationDateField'),\n        'modificationDate': document.getElementById('modificationDateField'),\n        'creator': document.getElementById('creatorField'),\n        'producer': document.getElementById('producerField'),\n        'version': document.getElementById('versionField'),\n        'pageCount': document.getElementById('pageCountField')\n      }\n    });\n\n    SecondaryToolbar.initialize({\n      toolbar: document.getElementById('secondaryToolbar'),\n      toggleButton: document.getElementById('secondaryToolbarToggle'),\n      presentationModeButton:\n        document.getElementById('secondaryPresentationMode'),\n      openFile: document.getElementById('secondaryOpenFile'),\n      print: document.getElementById('secondaryPrint'),\n      download: document.getElementById('secondaryDownload'),\n      viewBookmark: document.getElementById('secondaryViewBookmark'),\n      firstPage: document.getElementById('firstPage'),\n      lastPage: document.getElementById('lastPage'),\n      pageRotateCw: document.getElementById('pageRotateCw'),\n      pageRotateCcw: document.getElementById('pageRotateCcw'),\n      documentPropertiesButton: document.getElementById('documentProperties')\n    });\n\n    if (this.supportsFullscreen) {\n      var toolbar = SecondaryToolbar;\n      this.pdfPresentationMode = new PDFPresentationMode({\n        container: container,\n        viewer: viewer,\n        pdfThumbnailViewer: this.pdfThumbnailViewer,\n        contextMenuItems: [\n          { element: document.getElementById('contextFirstPage'),\n            handler: toolbar.firstPageClick.bind(toolbar) },\n          { element: document.getElementById('contextLastPage'),\n            handler: toolbar.lastPageClick.bind(toolbar) },\n          { element: document.getElementById('contextPageRotateCw'),\n            handler: toolbar.pageRotateCwClick.bind(toolbar) },\n          { element: document.getElementById('contextPageRotateCcw'),\n            handler: toolbar.pageRotateCcwClick.bind(toolbar) }\n        ]\n      });\n    }\n\n    PasswordPrompt.initialize({\n      overlayName: 'passwordOverlay',\n      passwordField: document.getElementById('password'),\n      passwordText: document.getElementById('passwordText'),\n      passwordSubmit: document.getElementById('passwordSubmit'),\n      passwordCancel: document.getElementById('passwordCancel')\n    });\n\n    var self = this;\n    var initializedPromise = Promise.all([\n      Preferences.get('enableWebGL').then(function resolved(value) {\n        PDFJS.disableWebGL = !value;\n      }),\n      Preferences.get('sidebarViewOnLoad').then(function resolved(value) {\n        self.preferenceSidebarViewOnLoad = value;\n      }),\n      Preferences.get('pdfBugEnabled').then(function resolved(value) {\n        self.preferencePdfBugEnabled = value;\n      }),\n      Preferences.get('showPreviousViewOnLoad').then(function resolved(value) {\n        self.preferenceShowPreviousViewOnLoad = value;\n      }),\n      Preferences.get('defaultZoomValue').then(function resolved(value) {\n        self.preferenceDefaultZoomValue = value;\n      }),\n      Preferences.get('disableTextLayer').then(function resolved(value) {\n        if (PDFJS.disableTextLayer === true) {\n          return;\n        }\n        PDFJS.disableTextLayer = value;\n      }),\n      Preferences.get('disableRange').then(function resolved(value) {\n        if (PDFJS.disableRange === true) {\n          return;\n        }\n        PDFJS.disableRange = value;\n      }),\n      Preferences.get('disableAutoFetch').then(function resolved(value) {\n        PDFJS.disableAutoFetch = value;\n      }),\n      Preferences.get('disableFontFace').then(function resolved(value) {\n        if (PDFJS.disableFontFace === true) {\n          return;\n        }\n        PDFJS.disableFontFace = value;\n      }),\n      Preferences.get('useOnlyCssZoom').then(function resolved(value) {\n        PDFJS.useOnlyCssZoom = value;\n      })\n      // TODO move more preferences and other async stuff here\n    ]).catch(function (reason) { });\n\n    return initializedPromise.then(function () {\n      PDFViewerApplication.initialized = true;\n    });\n  },\n\n  zoomIn: function pdfViewZoomIn(ticks) {\n    var newScale = this.pdfViewer.currentScale;\n    do {\n      newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2);\n      newScale = Math.ceil(newScale * 10) / 10;\n      newScale = Math.min(MAX_SCALE, newScale);\n    } while (--ticks > 0 && newScale < MAX_SCALE);\n    this.setScale(newScale, true);\n  },\n\n  zoomOut: function pdfViewZoomOut(ticks) {\n    var newScale = this.pdfViewer.currentScale;\n    do {\n      newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2);\n      newScale = Math.floor(newScale * 10) / 10;\n      newScale = Math.max(MIN_SCALE, newScale);\n    } while (--ticks > 0 && newScale > MIN_SCALE);\n    this.setScale(newScale, true);\n  },\n\n  get currentScaleValue() {\n    return this.pdfViewer.currentScaleValue;\n  },\n\n  get pagesCount() {\n    return this.pdfDocument.numPages;\n  },\n\n  set page(val) {\n    this.pdfViewer.currentPageNumber = val;\n  },\n\n  get page() {\n    return this.pdfViewer.currentPageNumber;\n  },\n\n  get supportsPrinting() {\n    var canvas = document.createElement('canvas');\n    var value = 'mozPrintCallback' in canvas;\n\n    return PDFJS.shadow(this, 'supportsPrinting', value);\n  },\n\n  get supportsFullscreen() {\n    var doc = document.documentElement;\n    var support = !!(doc.requestFullscreen || doc.mozRequestFullScreen ||\n                     doc.webkitRequestFullScreen || doc.msRequestFullscreen);\n\n    if (document.fullscreenEnabled === false ||\n        document.mozFullScreenEnabled === false ||\n        document.webkitFullscreenEnabled === false ||\n        document.msFullscreenEnabled === false) {\n      support = false;\n    }\n    if (support && PDFJS.disableFullscreen === true) {\n      support = false;\n    }\n\n    return PDFJS.shadow(this, 'supportsFullscreen', support);\n  },\n\n  get supportsIntegratedFind() {\n    var support = false;\n\n    return PDFJS.shadow(this, 'supportsIntegratedFind', support);\n  },\n\n  get supportsDocumentFonts() {\n    var support = true;\n\n    return PDFJS.shadow(this, 'supportsDocumentFonts', support);\n  },\n\n  get supportsDocumentColors() {\n    var support = true;\n\n    return PDFJS.shadow(this, 'supportsDocumentColors', support);\n  },\n\n  get loadingBar() {\n    var bar = new ProgressBar('#loadingBar', {});\n\n    return PDFJS.shadow(this, 'loadingBar', bar);\n  },\n\n\n  setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) {\n    this.url = url;\n    try {\n      this.setTitle(decodeURIComponent(getFileName(url)) || url);\n    } catch (e) {\n      // decodeURIComponent may throw URIError,\n      // fall back to using the unprocessed url in that case\n      this.setTitle(url);\n    }\n  },\n\n  setTitle: function pdfViewSetTitle(title) {\n    if (this.isViewerEmbedded) {\n      // Embedded PDF viewers should not be changing their parent page's title.\n      return;\n    }\n    //document.title = title;\n  },\n\n  close: function pdfViewClose() {\n    var errorWrapper = document.getElementById('errorWrapper');\n    errorWrapper.setAttribute('hidden', 'true');\n\n    if (!this.pdfDocument) {\n      return;\n    }\n\n    this.pdfDocument.destroy();\n    this.pdfDocument = null;\n\n    this.pdfThumbnailViewer.setDocument(null);\n    this.pdfViewer.setDocument(null);\n\n    if (typeof PDFBug !== 'undefined') {\n      PDFBug.cleanup();\n    }\n  },\n\n  // TODO(mack): This function signature should really be pdfViewOpen(url, args)\n  open: function pdfViewOpen(file, scale, password,\n                             pdfDataRangeTransport, args) {\n    if (this.pdfDocument) {\n      // Reload the preferences if a document was previously opened.\n      Preferences.reload();\n    }\n    this.close();\n\n    var parameters = {password: password};\n    if (typeof file === 'string') { // URL\n      this.setTitleUsingUrl(file);\n      parameters.url = file;\n    } else if (file && 'byteLength' in file) { // ArrayBuffer\n      parameters.data = file;\n    } else if (file.url && file.originalUrl) {\n      this.setTitleUsingUrl(file.originalUrl);\n      parameters.url = file.url;\n    }\n    if (args) {\n      for (var prop in args) {\n        parameters[prop] = args[prop];\n      }\n    }\n\n    var self = this;\n    self.loading = true;\n    self.downloadComplete = false;\n\n    var passwordNeeded = function passwordNeeded(updatePassword, reason) {\n      PasswordPrompt.updatePassword = updatePassword;\n      PasswordPrompt.reason = reason;\n      PasswordPrompt.open();\n    };\n\n    function getDocumentProgress(progressData) {\n      self.progress(progressData.loaded / progressData.total);\n    }\n\n    PDFJS.getDocument(parameters, pdfDataRangeTransport, passwordNeeded,\n                      getDocumentProgress).then(\n      function getDocumentCallback(pdfDocument) {\n        self.load(pdfDocument, scale);\n        self.loading = false;\n      },\n      function getDocumentError(exception) {\n        var message = exception && exception.message;\n        var loadingErrorMessage = mozL10n.get('loading_error', null,\n          'An error occurred while loading the PDF.');\n\n        if (exception instanceof PDFJS.InvalidPDFException) {\n          // change error message also for other builds\n          loadingErrorMessage = mozL10n.get('invalid_file_error', null,\n                                            'Invalid or corrupted PDF file.');\n        } else if (exception instanceof PDFJS.MissingPDFException) {\n          // special message for missing PDF's\n          loadingErrorMessage = mozL10n.get('missing_file_error', null,\n                                            'Missing PDF file.');\n        } else if (exception instanceof PDFJS.UnexpectedResponseException) {\n          loadingErrorMessage = mozL10n.get('unexpected_response_error', null,\n                                            'Unexpected server response.');\n        }\n\n        var moreInfo = {\n          message: message\n        };\n        self.error(loadingErrorMessage, moreInfo);\n        self.loading = false;\n      }\n    );\n\n    if (args && args.length) {\n      PDFViewerApplication.pdfDocumentProperties.setFileSize(args.length);\n    }\n  },\n\n  download: function pdfViewDownload() {\n    function downloadByUrl() {\n      downloadManager.downloadUrl(url, filename);\n    }\n\n    var url = this.url.split('#')[0];\n    var filename = getPDFFileNameFromURL(url);\n    var downloadManager = new DownloadManager();\n    downloadManager.onerror = function (err) {\n      // This error won't really be helpful because it's likely the\n      // fallback won't work either (or is already open).\n      PDFViewerApplication.error('PDF failed to download.');\n    };\n\n    if (!this.pdfDocument) { // the PDF is not ready yet\n      downloadByUrl();\n      return;\n    }\n\n    if (!this.downloadComplete) { // the PDF is still downloading\n      downloadByUrl();\n      return;\n    }\n\n    this.pdfDocument.getData().then(\n      function getDataSuccess(data) {\n        var blob = PDFJS.createBlob(data, 'application/pdf');\n        downloadManager.download(blob, url, filename);\n      },\n      downloadByUrl // Error occurred try downloading with just the url.\n    ).then(null, downloadByUrl);\n  },\n\n  fallback: function pdfViewFallback(featureId) {\n  },\n\n  navigateTo: function pdfViewNavigateTo(dest) {\n    var destString = '';\n    var self = this;\n\n    var goToDestination = function(destRef) {\n      self.pendingRefStr = null;\n      // dest array looks like that: <page-ref> </XYZ|FitXXX> <args..>\n      var pageNumber = destRef instanceof Object ?\n        self.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] :\n        (destRef + 1);\n      if (pageNumber) {\n        if (pageNumber > self.pagesCount) {\n          pageNumber = self.pagesCount;\n        }\n        self.pdfViewer.scrollPageIntoView(pageNumber, dest);\n\n        // Update the browsing history.\n        PDFHistory.push({ dest: dest, hash: destString, page: pageNumber });\n      } else {\n        self.pdfDocument.getPageIndex(destRef).then(function (pageIndex) {\n          var pageNum = pageIndex + 1;\n          self.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] = pageNum;\n          goToDestination(destRef);\n        });\n      }\n    };\n\n    var destinationPromise;\n    if (typeof dest === 'string') {\n      destString = dest;\n      destinationPromise = this.pdfDocument.getDestination(dest);\n    } else {\n      destinationPromise = Promise.resolve(dest);\n    }\n    destinationPromise.then(function(destination) {\n      dest = destination;\n      if (!(destination instanceof Array)) {\n        return; // invalid destination\n      }\n      goToDestination(destination[0]);\n    });\n  },\n\n  executeNamedAction: function pdfViewExecuteNamedAction(action) {\n    // See PDF reference, table 8.45 - Named action\n    switch (action) {\n      case 'GoToPage':\n        document.getElementById('pageNumber').focus();\n        break;\n\n      case 'GoBack':\n        PDFHistory.back();\n        break;\n\n      case 'GoForward':\n        PDFHistory.forward();\n        break;\n\n      case 'Find':\n        if (!this.supportsIntegratedFind) {\n          this.findBar.toggle();\n        }\n        break;\n\n      case 'NextPage':\n        this.page++;\n        break;\n\n      case 'PrevPage':\n        this.page--;\n        break;\n\n      case 'LastPage':\n        this.page = this.pagesCount;\n        break;\n\n      case 'FirstPage':\n        this.page = 1;\n        break;\n\n      default:\n        break; // No action according to spec\n    }\n  },\n\n  getDestinationHash: function pdfViewGetDestinationHash(dest) {\n    if (typeof dest === 'string') {\n      return this.getAnchorUrl('#' + escape(dest));\n    }\n    if (dest instanceof Array) {\n      var destRef = dest[0]; // see navigateTo method for dest format\n      var pageNumber = destRef instanceof Object ?\n        this.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] :\n        (destRef + 1);\n      if (pageNumber) {\n        var pdfOpenParams = this.getAnchorUrl('#page=' + pageNumber);\n        var destKind = dest[1];\n        if (typeof destKind === 'object' && 'name' in destKind &&\n            destKind.name === 'XYZ') {\n          var scale = (dest[4] || this.currentScaleValue);\n          var scaleNumber = parseFloat(scale);\n          if (scaleNumber) {\n            scale = scaleNumber * 100;\n          }\n          pdfOpenParams += '&zoom=' + scale;\n          if (dest[2] || dest[3]) {\n            pdfOpenParams += ',' + (dest[2] || 0) + ',' + (dest[3] || 0);\n          }\n        }\n        return pdfOpenParams;\n      }\n    }\n    return '';\n  },\n\n  /**\n   * Prefix the full url on anchor links to make sure that links are resolved\n   * relative to the current URL instead of the one defined in <base href>.\n   * @param {String} anchor The anchor hash, including the #.\n   */\n  getAnchorUrl: function getAnchorUrl(anchor) {\n    return anchor;\n  },\n\n  /**\n   * Show the error box.\n   * @param {String} message A message that is human readable.\n   * @param {Object} moreInfo (optional) Further information about the error\n   *                            that is more technical.  Should have a 'message'\n   *                            and optionally a 'stack' property.\n   */\n  error: function pdfViewError(message, moreInfo) {\n    var moreInfoText = mozL10n.get('error_version_info',\n      {version: PDFJS.version || '?', build: PDFJS.build || '?'},\n      'PDF.js v{{version}} (build: {{build}})') + '\\n';\n    if (moreInfo) {\n      moreInfoText +=\n        mozL10n.get('error_message', {message: moreInfo.message},\n        'Message: {{message}}');\n      if (moreInfo.stack) {\n        moreInfoText += '\\n' +\n          mozL10n.get('error_stack', {stack: moreInfo.stack},\n          'Stack: {{stack}}');\n      } else {\n        if (moreInfo.filename) {\n          moreInfoText += '\\n' +\n            mozL10n.get('error_file', {file: moreInfo.filename},\n            'File: {{file}}');\n        }\n        if (moreInfo.lineNumber) {\n          moreInfoText += '\\n' +\n            mozL10n.get('error_line', {line: moreInfo.lineNumber},\n            'Line: {{line}}');\n        }\n      }\n    }\n\n    var errorWrapper = document.getElementById('errorWrapper');\n    errorWrapper.removeAttribute('hidden');\n\n    var errorMessage = document.getElementById('errorMessage');\n    errorMessage.textContent = message;\n\n    var closeButton = document.getElementById('errorClose');\n    closeButton.onclick = function() {\n      errorWrapper.setAttribute('hidden', 'true');\n    };\n\n    var errorMoreInfo = document.getElementById('errorMoreInfo');\n    var moreInfoButton = document.getElementById('errorShowMore');\n    var lessInfoButton = document.getElementById('errorShowLess');\n    moreInfoButton.onclick = function() {\n      errorMoreInfo.removeAttribute('hidden');\n      moreInfoButton.setAttribute('hidden', 'true');\n      lessInfoButton.removeAttribute('hidden');\n      errorMoreInfo.style.height = errorMoreInfo.scrollHeight + 'px';\n    };\n    lessInfoButton.onclick = function() {\n      errorMoreInfo.setAttribute('hidden', 'true');\n      moreInfoButton.removeAttribute('hidden');\n      lessInfoButton.setAttribute('hidden', 'true');\n    };\n    moreInfoButton.oncontextmenu = noContextMenuHandler;\n    lessInfoButton.oncontextmenu = noContextMenuHandler;\n    closeButton.oncontextmenu = noContextMenuHandler;\n    moreInfoButton.removeAttribute('hidden');\n    lessInfoButton.setAttribute('hidden', 'true');\n    errorMoreInfo.value = moreInfoText;\n  },\n\n  progress: function pdfViewProgress(level) {\n    var percent = Math.round(level * 100);\n    // When we transition from full request to range requests, it's possible\n    // that we discard some of the loaded data. This can cause the loading\n    // bar to move backwards. So prevent this by only updating the bar if it\n    // increases.\n    if (percent > this.loadingBar.percent || isNaN(percent)) {\n      this.loadingBar.percent = percent;\n\n      // When disableAutoFetch is enabled, it's not uncommon for the entire file\n      // to never be fetched (depends on e.g. the file structure). In this case\n      // the loading bar will not be completely filled, nor will it be hidden.\n      // To prevent displaying a partially filled loading bar permanently, we\n      // hide it when no data has been loaded during a certain amount of time.\n      if (PDFJS.disableAutoFetch && percent) {\n        if (this.disableAutoFetchLoadingBarTimeout) {\n          clearTimeout(this.disableAutoFetchLoadingBarTimeout);\n          this.disableAutoFetchLoadingBarTimeout = null;\n        }\n        this.loadingBar.show();\n\n        this.disableAutoFetchLoadingBarTimeout = setTimeout(function () {\n          this.loadingBar.hide();\n          this.disableAutoFetchLoadingBarTimeout = null;\n        }.bind(this), DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT);\n      }\n    }\n  },\n\n  load: function pdfViewLoad(pdfDocument, scale) {\n    var self = this;\n    scale = scale || UNKNOWN_SCALE;\n\n    this.findController.reset();\n\n    this.pdfDocument = pdfDocument;\n\n    this.pdfDocumentProperties.setDocumentAndUrl(pdfDocument, this.url);\n\n    var downloadedPromise = pdfDocument.getDownloadInfo().then(function() {\n      self.downloadComplete = true;\n      self.loadingBar.hide();\n    });\n\n    var pagesCount = pdfDocument.numPages;\n    document.getElementById('numPages').textContent =\n      mozL10n.get('page_of', {pageCount: pagesCount}, 'of {{pageCount}}');\n    document.getElementById('pageNumber').max = pagesCount;\n\n    var id = this.documentFingerprint = pdfDocument.fingerprint;\n    var store = this.store = new ViewHistory(id);\n\n    var pdfViewer = this.pdfViewer;\n    pdfViewer.currentScale = scale;\n    pdfViewer.setDocument(pdfDocument);\n    var firstPagePromise = pdfViewer.firstPagePromise;\n    var pagesPromise = pdfViewer.pagesPromise;\n    var onePageRendered = pdfViewer.onePageRendered;\n\n    this.pageRotation = 0;\n    this.isInitialViewSet = false;\n    this.pagesRefMap = pdfViewer.pagesRefMap;\n\n    this.pdfThumbnailViewer.setDocument(pdfDocument);\n\n    firstPagePromise.then(function(pdfPage) {\n      downloadedPromise.then(function () {\n        var event = document.createEvent('CustomEvent');\n        event.initCustomEvent('documentload', true, true, {});\n        window.dispatchEvent(event);\n      });\n\n      self.loadingBar.setWidth(document.getElementById('viewer'));\n\n      if (!PDFJS.disableHistory && !self.isViewerEmbedded) {\n        // The browsing history is only enabled when the viewer is standalone,\n        // i.e. not when it is embedded in a web page.\n        if (!self.preferenceShowPreviousViewOnLoad && window.history.state) {\n          window.history.replaceState(null, '');\n        }\n        PDFHistory.initialize(self.documentFingerprint, self);\n      }\n\n      store.initializedPromise.then(function resolved() {\n        var storedHash = null;\n        if (self.preferenceShowPreviousViewOnLoad &&\n            store.get('exists', false)) {\n          var pageNum = store.get('page', '1');\n          var zoom = self.preferenceDefaultZoomValue ||\n                     store.get('zoom', self.pdfViewer.currentScale);\n          var left = store.get('scrollLeft', '0');\n          var top = store.get('scrollTop', '0');\n\n          storedHash = 'page=' + pageNum + '&zoom=' + zoom + ',' +\n                       left + ',' + top;\n        } else if (self.preferenceDefaultZoomValue) {\n          storedHash = 'page=1&zoom=' + self.preferenceDefaultZoomValue;\n        }\n        self.setInitialView(storedHash, scale);\n\n        // Make all navigation keys work on document load,\n        // unless the viewer is embedded in a web page.\n        if (!self.isViewerEmbedded) {\n          self.pdfViewer.focus();\n        }\n      }, function rejected(reason) {\n        console.error(reason);\n        self.setInitialView(null, scale);\n      });\n    });\n\n    pagesPromise.then(function() {\n      if (self.supportsPrinting) {\n        pdfDocument.getJavaScript().then(function(javaScript) {\n          if (javaScript.length) {\n            console.warn('Warning: JavaScript is not supported');\n            self.fallback(PDFJS.UNSUPPORTED_FEATURES.javaScript);\n          }\n          // Hack to support auto printing.\n          var regex = /\\bprint\\s*\\(/g;\n          for (var i = 0, ii = javaScript.length; i < ii; i++) {\n            var js = javaScript[i];\n            if (js && regex.test(js)) {\n              setTimeout(function() {\n                window.print();\n              });\n              return;\n            }\n          }\n        });\n      }\n    });\n\n    // outline depends on pagesRefMap\n    var promises = [pagesPromise, this.animationStartedPromise];\n    Promise.all(promises).then(function() {\n      pdfDocument.getOutline().then(function(outline) {\n        var container = document.getElementById('outlineView');\n        self.outline = new PDFOutlineView({\n          container: container,\n          outline: outline,\n          linkService: self\n        });\n        self.outline.render();\n        document.getElementById('viewOutline').disabled = !outline;\n\n        if (!outline && !container.classList.contains('hidden')) {\n          self.switchSidebarView('thumbs');\n        }\n        if (outline &&\n            self.preferenceSidebarViewOnLoad === SidebarView.OUTLINE) {\n          self.switchSidebarView('outline', true);\n        }\n      });\n      pdfDocument.getAttachments().then(function(attachments) {\n        var container = document.getElementById('attachmentsView');\n        self.attachments = new PDFAttachmentView({\n          container: container,\n          attachments: attachments,\n          downloadManager: new DownloadManager()\n        });\n        self.attachments.render();\n        document.getElementById('viewAttachments').disabled = !attachments;\n\n        if (!attachments && !container.classList.contains('hidden')) {\n          self.switchSidebarView('thumbs');\n        }\n        if (attachments &&\n            self.preferenceSidebarViewOnLoad === SidebarView.ATTACHMENTS) {\n          self.switchSidebarView('attachments', true);\n        }\n      });\n    });\n\n    if (self.preferenceSidebarViewOnLoad === SidebarView.THUMBS) {\n      Promise.all([firstPagePromise, onePageRendered]).then(function () {\n        self.switchSidebarView('thumbs', true);\n      });\n    }\n\n    pdfDocument.getMetadata().then(function(data) {\n      var info = data.info, metadata = data.metadata;\n      self.documentInfo = info;\n      self.metadata = metadata;\n\n      // Provides some basic debug information\n      console.log('PDF ' + pdfDocument.fingerprint + ' [' +\n                  info.PDFFormatVersion + ' ' + (info.Producer || '-').trim() +\n                  ' / ' + (info.Creator || '-').trim() + ']' +\n                  ' (PDF.js: ' + (PDFJS.version || '-') +\n                  (!PDFJS.disableWebGL ? ' [WebGL]' : '') + ')');\n\n      var pdfTitle;\n      if (metadata && metadata.has('dc:title')) {\n        var title = metadata.get('dc:title');\n        // Ghostscript sometimes return 'Untitled', sets the title to 'Untitled'\n        if (title !== 'Untitled') {\n          pdfTitle = title;\n        }\n      }\n\n      if (!pdfTitle && info && info['Title']) {\n        pdfTitle = info['Title'];\n      }\n\n      if (pdfTitle) {\n        self.setTitle(pdfTitle + ' - ' + document.title);\n      }\n\n      if (info.IsAcroFormPresent) {\n        console.warn('Warning: AcroForm/XFA is not supported');\n        self.fallback(PDFJS.UNSUPPORTED_FEATURES.forms);\n      }\n\n    });\n  },\n\n  setInitialView: function pdfViewSetInitialView(storedHash, scale) {\n    this.isInitialViewSet = true;\n\n    // When opening a new file (when one is already loaded in the viewer):\n    // Reset 'currentPageNumber', since otherwise the page's scale will be wrong\n    // if 'currentPageNumber' is larger than the number of pages in the file.\n    document.getElementById('pageNumber').value =\n      this.pdfViewer.currentPageNumber = 1;\n\n    if (PDFHistory.initialDestination) {\n      this.navigateTo(PDFHistory.initialDestination);\n      PDFHistory.initialDestination = null;\n    } else if (this.initialBookmark) {\n      this.setHash(this.initialBookmark);\n      PDFHistory.push({ hash: this.initialBookmark }, !!this.initialBookmark);\n      this.initialBookmark = null;\n    } else if (storedHash) {\n      this.setHash(storedHash);\n    } else if (scale) {\n      this.setScale(scale, true);\n      this.page = 1;\n    }\n\n    if (this.pdfViewer.currentScale === UNKNOWN_SCALE) {\n      // Scale was not initialized: invalid bookmark or scale was not specified.\n      // Setting the default one.\n      this.setScale(DEFAULT_SCALE, true);\n    }\n  },\n\n  cleanup: function pdfViewCleanup() {\n    this.pdfViewer.cleanup();\n    this.pdfThumbnailViewer.cleanup();\n    this.pdfDocument.cleanup();\n  },\n\n  forceRendering: function pdfViewForceRendering() {\n    this.pdfRenderingQueue.printing = this.printing;\n    this.pdfRenderingQueue.isThumbnailViewEnabled = this.sidebarOpen;\n    this.pdfRenderingQueue.renderHighestPriority();\n  },\n\n  setHash: function pdfViewSetHash(hash) {\n    if (!this.isInitialViewSet) {\n      this.initialBookmark = hash;\n      return;\n    }\n    if (!hash) {\n      return;\n    }\n\n    if (hash.indexOf('=') >= 0) {\n      var params = this.parseQueryString(hash);\n      // borrowing syntax from \"Parameters for Opening PDF Files\"\n      if ('nameddest' in params) {\n        PDFHistory.updateNextHashParam(params.nameddest);\n        this.navigateTo(params.nameddest);\n        return;\n      }\n      var pageNumber, dest;\n      if ('page' in params) {\n        pageNumber = (params.page | 0) || 1;\n      }\n      if ('zoom' in params) {\n        // Build the destination array.\n        var zoomArgs = params.zoom.split(','); // scale,left,top\n        var zoomArg = zoomArgs[0];\n        var zoomArgNumber = parseFloat(zoomArg);\n\n        if (zoomArg.indexOf('Fit') === -1) {\n          // If the zoomArg is a number, it has to get divided by 100. If it's\n          // a string, it should stay as it is.\n          dest = [null, { name: 'XYZ' },\n                  zoomArgs.length > 1 ? (zoomArgs[1] | 0) : null,\n                  zoomArgs.length > 2 ? (zoomArgs[2] | 0) : null,\n                  (zoomArgNumber ? zoomArgNumber / 100 : zoomArg)];\n        } else {\n          if (zoomArg === 'Fit' || zoomArg === 'FitB') {\n            dest = [null, { name: zoomArg }];\n          } else if ((zoomArg === 'FitH' || zoomArg === 'FitBH') ||\n                     (zoomArg === 'FitV' || zoomArg === 'FitBV')) {\n            dest = [null, { name: zoomArg },\n                    zoomArgs.length > 1 ? (zoomArgs[1] | 0) : null];\n          } else if (zoomArg === 'FitR') {\n            if (zoomArgs.length !== 5) {\n              console.error('pdfViewSetHash: ' +\n                            'Not enough parameters for \\'FitR\\'.');\n            } else {\n              dest = [null, { name: zoomArg },\n                      (zoomArgs[1] | 0), (zoomArgs[2] | 0),\n                      (zoomArgs[3] | 0), (zoomArgs[4] | 0)];\n            }\n          } else {\n            console.error('pdfViewSetHash: \\'' + zoomArg +\n                          '\\' is not a valid zoom value.');\n          }\n        }\n      }\n      if (dest) {\n        this.pdfViewer.scrollPageIntoView(pageNumber || this.page, dest);\n      } else if (pageNumber) {\n        this.page = pageNumber; // simple page\n      }\n      if ('pagemode' in params) {\n        if (params.pagemode === 'thumbs' || params.pagemode === 'bookmarks' ||\n            params.pagemode === 'attachments') {\n          this.switchSidebarView((params.pagemode === 'bookmarks' ?\n                                  'outline' : params.pagemode), true);\n        } else if (params.pagemode === 'none' && this.sidebarOpen) {\n          document.getElementById('sidebarToggle').click();\n        }\n      }\n    } else if (/^\\d+$/.test(hash)) { // page number\n      this.page = hash;\n    } else { // named destination\n      PDFHistory.updateNextHashParam(unescape(hash));\n      this.navigateTo(unescape(hash));\n    }\n  },\n\n  refreshThumbnailViewer: function pdfViewRefreshThumbnailViewer() {\n    var pdfViewer = this.pdfViewer;\n    var thumbnailViewer = this.pdfThumbnailViewer;\n\n    // set thumbnail images of rendered pages\n    var pagesCount = pdfViewer.pagesCount;\n    for (var pageIndex = 0; pageIndex < pagesCount; pageIndex++) {\n      var pageView = pdfViewer.getPageView(pageIndex);\n      if (pageView && pageView.renderingState === RenderingStates.FINISHED) {\n        var thumbnailView = thumbnailViewer.getThumbnail(pageIndex);\n        thumbnailView.setImage(pageView);\n      }\n    }\n\n    thumbnailViewer.scrollThumbnailIntoView(this.page);\n  },\n\n  switchSidebarView: function pdfViewSwitchSidebarView(view, openSidebar) {\n    if (openSidebar && !this.sidebarOpen) {\n      document.getElementById('sidebarToggle').click();\n    }\n    var thumbsView = document.getElementById('thumbnailView');\n    var outlineView = document.getElementById('outlineView');\n    var attachmentsView = document.getElementById('attachmentsView');\n\n    var thumbsButton = document.getElementById('viewThumbnail');\n    var outlineButton = document.getElementById('viewOutline');\n    var attachmentsButton = document.getElementById('viewAttachments');\n\n    switch (view) {\n      case 'thumbs':\n        var wasAnotherViewVisible = thumbsView.classList.contains('hidden');\n\n        thumbsButton.classList.add('toggled');\n        outlineButton.classList.remove('toggled');\n        attachmentsButton.classList.remove('toggled');\n        thumbsView.classList.remove('hidden');\n        outlineView.classList.add('hidden');\n        attachmentsView.classList.add('hidden');\n\n        this.forceRendering();\n\n        if (wasAnotherViewVisible) {\n          this.pdfThumbnailViewer.ensureThumbnailVisible(this.page);\n        }\n        break;\n\n      case 'outline':\n        thumbsButton.classList.remove('toggled');\n        outlineButton.classList.add('toggled');\n        attachmentsButton.classList.remove('toggled');\n        thumbsView.classList.add('hidden');\n        outlineView.classList.remove('hidden');\n        attachmentsView.classList.add('hidden');\n\n        if (outlineButton.getAttribute('disabled')) {\n          return;\n        }\n        break;\n\n      case 'attachments':\n        thumbsButton.classList.remove('toggled');\n        outlineButton.classList.remove('toggled');\n        attachmentsButton.classList.add('toggled');\n        thumbsView.classList.add('hidden');\n        outlineView.classList.add('hidden');\n        attachmentsView.classList.remove('hidden');\n\n        if (attachmentsButton.getAttribute('disabled')) {\n          return;\n        }\n        break;\n    }\n  },\n\n  // Helper function to parse query string (e.g. ?param1=value&parm2=...).\n  parseQueryString: function pdfViewParseQueryString(query) {\n    var parts = query.split('&');\n    var params = {};\n    for (var i = 0, ii = parts.length; i < ii; ++i) {\n      var param = parts[i].split('=');\n      var key = param[0].toLowerCase();\n      var value = param.length > 1 ? param[1] : null;\n      params[decodeURIComponent(key)] = decodeURIComponent(value);\n    }\n    return params;\n  },\n\n  beforePrint: function pdfViewSetupBeforePrint() {\n    if (!this.supportsPrinting) {\n      var printMessage = mozL10n.get('printing_not_supported', null,\n          'Warning: Printing is not fully supported by this browser.');\n      this.error(printMessage);\n      return;\n    }\n\n    var alertNotReady = false;\n    var i, ii;\n    if (!this.pagesCount) {\n      alertNotReady = true;\n    } else {\n      for (i = 0, ii = this.pagesCount; i < ii; ++i) {\n        if (!this.pdfViewer.getPageView(i).pdfPage) {\n          alertNotReady = true;\n          break;\n        }\n      }\n    }\n    if (alertNotReady) {\n      var notReadyMessage = mozL10n.get('printing_not_ready', null,\n          'Warning: The PDF is not fully loaded for printing.');\n      window.alert(notReadyMessage);\n      return;\n    }\n\n    this.printing = true;\n    this.forceRendering();\n\n    var body = document.querySelector('body');\n    body.setAttribute('data-mozPrintCallback', true);\n\n    if (!this.hasEqualPageSizes) {\n      console.warn('Not all pages have the same size. The printed result ' +\n          'may be incorrect!');\n    }\n\n    // Insert a @page + size rule to make sure that the page size is correctly\n    // set. Note that we assume that all pages have the same size, because\n    // variable-size pages are not supported yet (at least in Chrome & Firefox).\n    // TODO(robwu): Use named pages when size calculation bugs get resolved\n    // (e.g. https://crbug.com/355116) AND when support for named pages is\n    // added (http://www.w3.org/TR/css3-page/#using-named-pages).\n    // In browsers where @page + size is not supported (such as Firefox,\n    // https://bugzil.la/851441), the next stylesheet will be ignored and the\n    // user has to select the correct paper size in the UI if wanted.\n    this.pageStyleSheet = document.createElement('style');\n    var pageSize = this.pdfViewer.getPageView(0).pdfPage.getViewport(1);\n    this.pageStyleSheet.textContent =\n      // \"size:<width> <height>\" is what we need. But also add \"A4\" because\n      // Firefox incorrectly reports support for the other value.\n      '@supports ((size:A4) and (size:1pt 1pt)) {' +\n      '@page { size: ' + pageSize.width + 'pt ' + pageSize.height + 'pt;}' +\n      // The canvas and each ancestor node must have a height of 100% to make\n      // sure that each canvas is printed on exactly one page.\n      '#printContainer {height:100%}' +\n      '#printContainer > div {width:100% !important;height:100% !important;}' +\n      '}';\n    body.appendChild(this.pageStyleSheet);\n\n    for (i = 0, ii = this.pagesCount; i < ii; ++i) {\n      this.pdfViewer.getPageView(i).beforePrint();\n    }\n\n  },\n\n  // Whether all pages of the PDF have the same width and height.\n  get hasEqualPageSizes() {\n    var firstPage = this.pdfViewer.getPageView(0);\n    for (var i = 1, ii = this.pagesCount; i < ii; ++i) {\n      var pageView = this.pdfViewer.getPageView(i);\n      if (pageView.width !== firstPage.width ||\n          pageView.height !== firstPage.height) {\n        return false;\n      }\n    }\n    return true;\n  },\n\n  afterPrint: function pdfViewSetupAfterPrint() {\n    var div = document.getElementById('printContainer');\n    while (div.hasChildNodes()) {\n      div.removeChild(div.lastChild);\n    }\n\n    if (this.pageStyleSheet && this.pageStyleSheet.parentNode) {\n      this.pageStyleSheet.parentNode.removeChild(this.pageStyleSheet);\n      this.pageStyleSheet = null;\n    }\n\n    this.printing = false;\n    this.forceRendering();\n  },\n\n  setScale: function (value, resetAutoSettings) {\n    this.updateScaleControls = !!resetAutoSettings;\n    this.pdfViewer.currentScaleValue = value;\n    this.updateScaleControls = true;\n  },\n\n  rotatePages: function pdfViewRotatePages(delta) {\n    var pageNumber = this.page;\n    this.pageRotation = (this.pageRotation + 360 + delta) % 360;\n    this.pdfViewer.pagesRotation = this.pageRotation;\n    this.pdfThumbnailViewer.pagesRotation = this.pageRotation;\n\n    this.forceRendering();\n\n    this.pdfViewer.scrollPageIntoView(pageNumber);\n  },\n\n  requestPresentationMode: function pdfViewRequestPresentationMode() {\n    if (!this.pdfPresentationMode) {\n      return;\n    }\n    this.pdfPresentationMode.request();\n  },\n\n  /**\n   * @param {number} delta - The delta value from the mouse event.\n   */\n  scrollPresentationMode: function pdfViewScrollPresentationMode(delta) {\n    if (!this.pdfPresentationMode) {\n      return;\n    }\n    this.pdfPresentationMode.mouseScroll(delta);\n  }\n};\nwindow.PDFView = PDFViewerApplication; // obsolete name, using it as an alias\n\n\nfunction webViewerLoad(evt) {\n  PDFViewerApplication.initialize().then(webViewerInitialized);\n}\n\nfunction webViewerInitialized() {\n  var queryString = document.location.search.substring(1);\n  var params = PDFViewerApplication.parseQueryString(queryString);\n  var file = 'file' in params ? params.file : DEFAULT_URL;\n\n  var fileInput = document.createElement('input');\n  fileInput.id = 'fileInput';\n  fileInput.className = 'fileInput';\n  fileInput.setAttribute('type', 'file');\n  fileInput.oncontextmenu = noContextMenuHandler;\n  document.body.appendChild(fileInput);\n\n  if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {\n    document.getElementById('openFile').setAttribute('hidden', 'true');\n    document.getElementById('secondaryOpenFile').setAttribute('hidden', 'true');\n  } else {\n    document.getElementById('fileInput').value = null;\n  }\n\n  var locale = PDFJS.locale || navigator.language;\n\n  if (PDFViewerApplication.preferencePdfBugEnabled) {\n    // Special debugging flags in the hash section of the URL.\n    var hash = document.location.hash.substring(1);\n    var hashParams = PDFViewerApplication.parseQueryString(hash);\n\n    if ('disableworker' in hashParams) {\n      PDFJS.disableWorker = (hashParams['disableworker'] === 'true');\n    }\n    if ('disablerange' in hashParams) {\n      PDFJS.disableRange = (hashParams['disablerange'] === 'true');\n    }\n    if ('disablestream' in hashParams) {\n      PDFJS.disableStream = (hashParams['disablestream'] === 'true');\n    }\n    if ('disableautofetch' in hashParams) {\n      PDFJS.disableAutoFetch = (hashParams['disableautofetch'] === 'true');\n    }\n    if ('disablefontface' in hashParams) {\n      PDFJS.disableFontFace = (hashParams['disablefontface'] === 'true');\n    }\n    if ('disablehistory' in hashParams) {\n      PDFJS.disableHistory = (hashParams['disablehistory'] === 'true');\n    }\n    if ('webgl' in hashParams) {\n      PDFJS.disableWebGL = (hashParams['webgl'] !== 'true');\n    }\n    if ('useonlycsszoom' in hashParams) {\n      PDFJS.useOnlyCssZoom = (hashParams['useonlycsszoom'] === 'true');\n    }\n    if ('verbosity' in hashParams) {\n      PDFJS.verbosity = hashParams['verbosity'] | 0;\n    }\n    if ('ignorecurrentpositiononzoom' in hashParams) {\n      IGNORE_CURRENT_POSITION_ON_ZOOM =\n        (hashParams['ignorecurrentpositiononzoom'] === 'true');\n    }\n    if ('locale' in hashParams) {\n      locale = hashParams['locale'];\n    }\n    if ('textlayer' in hashParams) {\n      switch (hashParams['textlayer']) {\n        case 'off':\n          PDFJS.disableTextLayer = true;\n          break;\n        case 'visible':\n        case 'shadow':\n        case 'hover':\n          var viewer = document.getElementById('viewer');\n          viewer.classList.add('textLayer-' + hashParams['textlayer']);\n          break;\n      }\n    }\n    if ('pdfbug' in hashParams) {\n      PDFJS.pdfBug = true;\n      var pdfBug = hashParams['pdfbug'];\n      var enabled = pdfBug.split(',');\n      PDFBug.enable(enabled);\n      PDFBug.init();\n    }\n  }\n\n  mozL10n.setLanguage(locale);\n\n  if (!PDFViewerApplication.supportsPrinting) {\n    document.getElementById('print').classList.add('hidden');\n    document.getElementById('secondaryPrint').classList.add('hidden');\n  }\n\n  if (!PDFViewerApplication.supportsFullscreen) {\n    document.getElementById('presentationMode').classList.add('hidden');\n    document.getElementById('secondaryPresentationMode').\n      classList.add('hidden');\n  }\n\n  if (PDFViewerApplication.supportsIntegratedFind) {\n    document.getElementById('viewFind').classList.add('hidden');\n  }\n\n  // Listen for unsupported features to trigger the fallback UI.\n  PDFJS.UnsupportedManager.listen(\n    PDFViewerApplication.fallback.bind(PDFViewerApplication));\n\n  // Suppress context menus for some controls\n  document.getElementById('scaleSelect').oncontextmenu = noContextMenuHandler;\n\n  var mainContainer = document.getElementById('mainContainer');\n  var outerContainer = document.getElementById('outerContainer');\n  mainContainer.addEventListener('transitionend', function(e) {\n    if (e.target === mainContainer) {\n      var event = document.createEvent('UIEvents');\n      event.initUIEvent('resize', false, false, window, 0);\n      window.dispatchEvent(event);\n      outerContainer.classList.remove('sidebarMoving');\n    }\n  }, true);\n\n  document.getElementById('sidebarToggle').addEventListener('click',\n    function() {\n      this.classList.toggle('toggled');\n      outerContainer.classList.add('sidebarMoving');\n      outerContainer.classList.toggle('sidebarOpen');\n      PDFViewerApplication.sidebarOpen =\n        outerContainer.classList.contains('sidebarOpen');\n      if (PDFViewerApplication.sidebarOpen) {\n        PDFViewerApplication.refreshThumbnailViewer();\n      }\n      PDFViewerApplication.forceRendering();\n    });\n\n  document.getElementById('viewThumbnail').addEventListener('click',\n    function() {\n      PDFViewerApplication.switchSidebarView('thumbs');\n    });\n\n  document.getElementById('viewOutline').addEventListener('click',\n    function() {\n      PDFViewerApplication.switchSidebarView('outline');\n    });\n\n  document.getElementById('viewAttachments').addEventListener('click',\n    function() {\n      PDFViewerApplication.switchSidebarView('attachments');\n    });\n\n  document.getElementById('previous').addEventListener('click',\n    function() {\n      PDFViewerApplication.page--;\n    });\n\n  document.getElementById('next').addEventListener('click',\n    function() {\n      PDFViewerApplication.page++;\n    });\n\n  document.getElementById('zoomIn').addEventListener('click',\n    function() {\n      PDFViewerApplication.zoomIn();\n    });\n\n  document.getElementById('zoomOut').addEventListener('click',\n    function() {\n      PDFViewerApplication.zoomOut();\n    });\n\n  document.getElementById('pageNumber').addEventListener('click', function() {\n    this.select();\n  });\n\n  document.getElementById('pageNumber').addEventListener('change', function() {\n    // Handle the user inputting a floating point number.\n    PDFViewerApplication.page = (this.value | 0);\n\n    if (this.value !== (this.value | 0).toString()) {\n      this.value = PDFViewerApplication.page;\n    }\n  });\n\n  document.getElementById('scaleSelect').addEventListener('change',\n    function() {\n      PDFViewerApplication.setScale(this.value, false);\n    });\n\n  document.getElementById('presentationMode').addEventListener('click',\n    SecondaryToolbar.presentationModeClick.bind(SecondaryToolbar));\n\n  document.getElementById('openFile').addEventListener('click',\n    SecondaryToolbar.openFileClick.bind(SecondaryToolbar));\n\n  document.getElementById('print').addEventListener('click',\n    SecondaryToolbar.printClick.bind(SecondaryToolbar));\n\n  document.getElementById('download').addEventListener('click',\n    SecondaryToolbar.downloadClick.bind(SecondaryToolbar));\n\n\n  if (file && file.lastIndexOf('file:', 0) === 0) {\n    // file:-scheme. Load the contents in the main thread because QtWebKit\n    // cannot load file:-URLs in a Web Worker. file:-URLs are usually loaded\n    // very quickly, so there is no need to set up progress event listeners.\n    PDFViewerApplication.setTitleUsingUrl(file);\n    var xhr = new XMLHttpRequest();\n    xhr.onload = function() {\n      PDFViewerApplication.open(new Uint8Array(xhr.response), 0);\n    };\n    try {\n      xhr.open('GET', file);\n      xhr.responseType = 'arraybuffer';\n      xhr.send();\n    } catch (e) {\n      PDFViewerApplication.error(mozL10n.get('loading_error', null,\n        'An error occurred while loading the PDF.'), e);\n    }\n    return;\n  }\n\n  if (file) {\n    PDFViewerApplication.open(file, 0);\n  }\n}\n\ndocument.addEventListener('DOMContentLoaded', webViewerLoad, true);\n\ndocument.addEventListener('pagerendered', function (e) {\n  var pageNumber = e.detail.pageNumber;\n  var pageIndex = pageNumber - 1;\n  var pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex);\n\n  if (PDFViewerApplication.sidebarOpen) {\n    var thumbnailView = PDFViewerApplication.pdfThumbnailViewer.\n                        getThumbnail(pageIndex);\n    thumbnailView.setImage(pageView);\n  }\n\n  if (PDFJS.pdfBug && Stats.enabled && pageView.stats) {\n    Stats.add(pageNumber, pageView.stats);\n  }\n\n  if (pageView.error) {\n    PDFViewerApplication.error(mozL10n.get('rendering_error', null,\n      'An error occurred while rendering the page.'), pageView.error);\n  }\n\n  // If the page is still visible when it has finished rendering,\n  // ensure that the page number input loading indicator is hidden.\n  if (pageNumber === PDFViewerApplication.page) {\n    var pageNumberInput = document.getElementById('pageNumber');\n    pageNumberInput.classList.remove(PAGE_NUMBER_LOADING_INDICATOR);\n  }\n\n}, true);\n\ndocument.addEventListener('textlayerrendered', function (e) {\n  var pageIndex = e.detail.pageNumber - 1;\n  var pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex);\n\n}, true);\n\nwindow.addEventListener('presentationmodechanged', function (e) {\n  var active = e.detail.active;\n  var switchInProgress = e.detail.switchInProgress;\n  PDFViewerApplication.pdfViewer.presentationModeState =\n    switchInProgress ? PresentationModeState.CHANGING :\n    active ? PresentationModeState.FULLSCREEN : PresentationModeState.NORMAL;\n});\n\nfunction updateViewarea() {\n  if (!PDFViewerApplication.initialized) {\n    return;\n  }\n  PDFViewerApplication.pdfViewer.update();\n}\n\nwindow.addEventListener('updateviewarea', function (evt) {\n  if (!PDFViewerApplication.initialized) {\n    return;\n  }\n  var location = evt.location;\n\n  PDFViewerApplication.store.initializedPromise.then(function() {\n    PDFViewerApplication.store.setMultiple({\n      'exists': true,\n      'page': location.pageNumber,\n      'zoom': location.scale,\n      'scrollLeft': location.left,\n      'scrollTop': location.top\n    }).catch(function() {\n      // unable to write to storage\n    });\n  });\n  var href = PDFViewerApplication.getAnchorUrl(location.pdfOpenParams);\n  document.getElementById('viewBookmark').href = href;\n  document.getElementById('secondaryViewBookmark').href = href;\n\n  // Update the current bookmark in the browsing history.\n  PDFHistory.updateCurrentBookmark(location.pdfOpenParams, location.pageNumber);\n\n  // Show/hide the loading indicator in the page number input element.\n  var pageNumberInput = document.getElementById('pageNumber');\n  var currentPage =\n    PDFViewerApplication.pdfViewer.getPageView(PDFViewerApplication.page - 1);\n\n  if (currentPage.renderingState === RenderingStates.FINISHED) {\n    pageNumberInput.classList.remove(PAGE_NUMBER_LOADING_INDICATOR);\n  } else {\n    pageNumberInput.classList.add(PAGE_NUMBER_LOADING_INDICATOR);\n  }\n}, true);\n\nwindow.addEventListener('resize', function webViewerResize(evt) {\n  if (PDFViewerApplication.initialized &&\n      (document.getElementById('pageAutoOption').selected ||\n       /* Note: the scale is constant for |pageActualOption|. */\n       document.getElementById('pageFitOption').selected ||\n       document.getElementById('pageWidthOption').selected)) {\n    var selectedScale = document.getElementById('scaleSelect').value;\n    PDFViewerApplication.setScale(selectedScale, false);\n  }\n  updateViewarea();\n\n  // Set the 'max-height' CSS property of the secondary toolbar.\n  SecondaryToolbar.setMaxHeight(document.getElementById('viewerContainer'));\n});\n\nwindow.addEventListener('hashchange', function webViewerHashchange(evt) {\n  if (PDFHistory.isHashChangeUnlocked) {\n    PDFViewerApplication.setHash(document.location.hash.substring(1));\n  }\n});\n\nwindow.addEventListener('change', function webViewerChange(evt) {\n  var files = evt.target.files;\n  if (!files || files.length === 0) {\n    return;\n  }\n  var file = files[0];\n\n  if (!PDFJS.disableCreateObjectURL &&\n      typeof URL !== 'undefined' && URL.createObjectURL) {\n    PDFViewerApplication.open(URL.createObjectURL(file), 0);\n  } else {\n    // Read the local file into a Uint8Array.\n    var fileReader = new FileReader();\n    fileReader.onload = function webViewerChangeFileReaderOnload(evt) {\n      var buffer = evt.target.result;\n      var uint8Array = new Uint8Array(buffer);\n      PDFViewerApplication.open(uint8Array, 0);\n    };\n    fileReader.readAsArrayBuffer(file);\n  }\n\n  PDFViewerApplication.setTitleUsingUrl(file.name);\n\n  // URL does not reflect proper document location - hiding some icons.\n  document.getElementById('viewBookmark').setAttribute('hidden', 'true');\n  document.getElementById('secondaryViewBookmark').\n    setAttribute('hidden', 'true');\n  document.getElementById('download').setAttribute('hidden', 'true');\n  document.getElementById('secondaryDownload').setAttribute('hidden', 'true');\n}, true);\n\nfunction selectScaleOption(value) {\n  var options = document.getElementById('scaleSelect').options;\n  var predefinedValueFound = false;\n  for (var i = 0; i < options.length; i++) {\n    var option = options[i];\n    if (option.value !== value) {\n      option.selected = false;\n      continue;\n    }\n    option.selected = true;\n    predefinedValueFound = true;\n  }\n  return predefinedValueFound;\n}\n\nwindow.addEventListener('localized', function localized(evt) {\n  document.getElementsByTagName('html')[0].dir = mozL10n.getDirection();\n\n  PDFViewerApplication.animationStartedPromise.then(function() {\n    // Adjust the width of the zoom box to fit the content.\n    // Note: If the window is narrow enough that the zoom box is not visible,\n    //       we temporarily show it to be able to adjust its width.\n    var container = document.getElementById('scaleSelectContainer');\n    if (container.clientWidth === 0) {\n      container.setAttribute('style', 'display: inherit;');\n    }\n    if (container.clientWidth > 0) {\n      var select = document.getElementById('scaleSelect');\n      select.setAttribute('style', 'min-width: inherit;');\n      var width = select.clientWidth + SCALE_SELECT_CONTAINER_PADDING;\n      select.setAttribute('style', 'min-width: ' +\n                                   (width + SCALE_SELECT_PADDING) + 'px;');\n      container.setAttribute('style', 'min-width: ' + width + 'px; ' +\n                                      'max-width: ' + width + 'px;');\n    }\n\n    // Set the 'max-height' CSS property of the secondary toolbar.\n    SecondaryToolbar.setMaxHeight(document.getElementById('viewerContainer'));\n  });\n}, true);\n\nwindow.addEventListener('scalechange', function scalechange(evt) {\n  document.getElementById('zoomOut').disabled = (evt.scale === MIN_SCALE);\n  document.getElementById('zoomIn').disabled = (evt.scale === MAX_SCALE);\n\n  var customScaleOption = document.getElementById('customScaleOption');\n  customScaleOption.selected = false;\n\n  if (!PDFViewerApplication.updateScaleControls &&\n      (document.getElementById('pageAutoOption').selected ||\n       document.getElementById('pageActualOption').selected ||\n       document.getElementById('pageFitOption').selected ||\n       document.getElementById('pageWidthOption').selected)) {\n    updateViewarea();\n    return;\n  }\n\n  if (evt.presetValue) {\n    selectScaleOption(evt.presetValue);\n    updateViewarea();\n    return;\n  }\n\n  var predefinedValueFound = selectScaleOption('' + evt.scale);\n  if (!predefinedValueFound) {\n    var customScale = Math.round(evt.scale * 10000) / 100;\n    customScaleOption.textContent =\n      mozL10n.get('page_scale_percent', { scale: customScale }, '{{scale}}%');\n    customScaleOption.selected = true;\n  }\n  updateViewarea();\n}, true);\n\nwindow.addEventListener('pagechange', function pagechange(evt) {\n  var page = evt.pageNumber;\n  if (evt.previousPageNumber !== page) {\n    document.getElementById('pageNumber').value = page;\n    if (PDFViewerApplication.sidebarOpen) {\n      PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(page);\n    }\n  }\n  var numPages = PDFViewerApplication.pagesCount;\n\n  document.getElementById('previous').disabled = (page <= 1);\n  document.getElementById('next').disabled = (page >= numPages);\n\n  document.getElementById('firstPage').disabled = (page <= 1);\n  document.getElementById('lastPage').disabled = (page >= numPages);\n\n  // we need to update stats\n  if (PDFJS.pdfBug && Stats.enabled) {\n    var pageView = PDFViewerApplication.pdfViewer.getPageView(page - 1);\n    if (pageView.stats) {\n      Stats.add(page, pageView.stats);\n    }\n  }\n\n  // checking if the this.page was called from the updateViewarea function\n  if (evt.updateInProgress) {\n    return;\n  }\n  // Avoid scrolling the first page during loading\n  if (this.loading && page === 1) {\n    return;\n  }\n  PDFViewerApplication.pdfViewer.scrollPageIntoView(page);\n}, true);\n\nfunction handleMouseWheel(evt) {\n  var MOUSE_WHEEL_DELTA_FACTOR = 40;\n  var ticks = (evt.type === 'DOMMouseScroll') ? -evt.detail :\n              evt.wheelDelta / MOUSE_WHEEL_DELTA_FACTOR;\n  var direction = (ticks < 0) ? 'zoomOut' : 'zoomIn';\n\n  if (PDFViewerApplication.pdfViewer.isInPresentationMode) {\n    evt.preventDefault();\n    PDFViewerApplication.scrollPresentationMode(ticks *\n                                                MOUSE_WHEEL_DELTA_FACTOR);\n  } else if (evt.ctrlKey || evt.metaKey) {\n    // Only zoom the pages, not the entire viewer.\n    evt.preventDefault();\n    PDFViewerApplication[direction](Math.abs(ticks));\n  }\n}\n\nwindow.addEventListener('DOMMouseScroll', handleMouseWheel);\nwindow.addEventListener('mousewheel', handleMouseWheel);\n\nwindow.addEventListener('click', function click(evt) {\n  if (SecondaryToolbar.opened &&\n      PDFViewerApplication.pdfViewer.containsElement(evt.target)) {\n    SecondaryToolbar.close();\n  }\n}, false);\n\nwindow.addEventListener('keydown', function keydown(evt) {\n  if (OverlayManager.active) {\n    return;\n  }\n\n  var handled = false;\n  var cmd = (evt.ctrlKey ? 1 : 0) |\n            (evt.altKey ? 2 : 0) |\n            (evt.shiftKey ? 4 : 0) |\n            (evt.metaKey ? 8 : 0);\n\n  var pdfViewer = PDFViewerApplication.pdfViewer;\n  var isViewerInPresentationMode = pdfViewer && pdfViewer.isInPresentationMode;\n\n  // First, handle the key bindings that are independent whether an input\n  // control is selected or not.\n  if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) {\n    // either CTRL or META key with optional SHIFT.\n    switch (evt.keyCode) {\n      case 70: // f\n        if (!PDFViewerApplication.supportsIntegratedFind) {\n          PDFViewerApplication.findBar.open();\n          handled = true;\n        }\n        break;\n      case 71: // g\n        if (!PDFViewerApplication.supportsIntegratedFind) {\n          PDFViewerApplication.findBar.dispatchEvent('again',\n                                                     cmd === 5 || cmd === 12);\n          handled = true;\n        }\n        break;\n      case 61: // FF/Mac '='\n      case 107: // FF '+' and '='\n      case 187: // Chrome '+'\n      case 171: // FF with German keyboard\n        if (!isViewerInPresentationMode) {\n          PDFViewerApplication.zoomIn();\n        }\n        handled = true;\n        break;\n      case 173: // FF/Mac '-'\n      case 109: // FF '-'\n      case 189: // Chrome '-'\n        if (!isViewerInPresentationMode) {\n          PDFViewerApplication.zoomOut();\n        }\n        handled = true;\n        break;\n      case 48: // '0'\n      case 96: // '0' on Numpad of Swedish keyboard\n        if (!isViewerInPresentationMode) {\n          // keeping it unhandled (to restore page zoom to 100%)\n          setTimeout(function () {\n            // ... and resetting the scale after browser adjusts its scale\n            PDFViewerApplication.setScale(DEFAULT_SCALE, true);\n          });\n          handled = false;\n        }\n        break;\n    }\n  }\n\n  // CTRL or META without shift\n  if (cmd === 1 || cmd === 8) {\n    switch (evt.keyCode) {\n      case 83: // s\n        PDFViewerApplication.download();\n        handled = true;\n        break;\n    }\n  }\n\n  // CTRL+ALT or Option+Command\n  if (cmd === 3 || cmd === 10) {\n    switch (evt.keyCode) {\n      case 80: // p\n        PDFViewerApplication.requestPresentationMode();\n        handled = true;\n        break;\n      case 71: // g\n        // focuses input#pageNumber field\n        document.getElementById('pageNumber').select();\n        handled = true;\n        break;\n    }\n  }\n\n  if (handled) {\n    evt.preventDefault();\n    return;\n  }\n\n  // Some shortcuts should not get handled if a control/input element\n  // is selected.\n  var curElement = document.activeElement || document.querySelector(':focus');\n  var curElementTagName = curElement && curElement.tagName.toUpperCase();\n  if (curElementTagName === 'INPUT' ||\n      curElementTagName === 'TEXTAREA' ||\n      curElementTagName === 'SELECT') {\n    // Make sure that the secondary toolbar is closed when Escape is pressed.\n    if (evt.keyCode !== 27) { // 'Esc'\n      return;\n    }\n  }\n\n  if (cmd === 0) { // no control key pressed at all.\n    switch (evt.keyCode) {\n      case 38: // up arrow\n      case 33: // pg up\n      case 8: // backspace\n        if (!isViewerInPresentationMode &&\n            PDFViewerApplication.currentScaleValue !== 'page-fit') {\n          break;\n        }\n        /* in presentation mode */\n        /* falls through */\n      case 37: // left arrow\n        // horizontal scrolling using arrow keys\n        if (pdfViewer.isHorizontalScrollbarEnabled) {\n          break;\n        }\n        /* falls through */\n      case 75: // 'k'\n      case 80: // 'p'\n        PDFViewerApplication.page--;\n        handled = true;\n        break;\n      case 27: // esc key\n        if (SecondaryToolbar.opened) {\n          SecondaryToolbar.close();\n          handled = true;\n        }\n        if (!PDFViewerApplication.supportsIntegratedFind &&\n            PDFViewerApplication.findBar.opened) {\n          PDFViewerApplication.findBar.close();\n          handled = true;\n        }\n        break;\n      case 40: // down arrow\n      case 34: // pg down\n      case 32: // spacebar\n        if (!isViewerInPresentationMode &&\n            PDFViewerApplication.currentScaleValue !== 'page-fit') {\n          break;\n        }\n        /* falls through */\n      case 39: // right arrow\n        // horizontal scrolling using arrow keys\n        if (pdfViewer.isHorizontalScrollbarEnabled) {\n          break;\n        }\n        /* falls through */\n      case 74: // 'j'\n      case 78: // 'n'\n        PDFViewerApplication.page++;\n        handled = true;\n        break;\n\n      case 36: // home\n        if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {\n          PDFViewerApplication.page = 1;\n          handled = true;\n        }\n        break;\n      case 35: // end\n        if (isViewerInPresentationMode || (PDFViewerApplication.pdfDocument &&\n            PDFViewerApplication.page < PDFViewerApplication.pagesCount)) {\n          PDFViewerApplication.page = PDFViewerApplication.pagesCount;\n          handled = true;\n        }\n        break;\n\n      case 72: // 'h'\n        if (!isViewerInPresentationMode) {\n          HandTool.toggle();\n        }\n        break;\n      case 82: // 'r'\n        PDFViewerApplication.rotatePages(90);\n        break;\n    }\n  }\n\n  if (cmd === 4) { // shift-key\n    switch (evt.keyCode) {\n      case 32: // spacebar\n        if (!isViewerInPresentationMode &&\n            PDFViewerApplication.currentScaleValue !== 'page-fit') {\n          break;\n        }\n        PDFViewerApplication.page--;\n        handled = true;\n        break;\n\n      case 82: // 'r'\n        PDFViewerApplication.rotatePages(-90);\n        break;\n    }\n  }\n\n  if (!handled && !isViewerInPresentationMode) {\n    // 33=Page Up  34=Page Down  35=End    36=Home\n    // 37=Left     38=Up         39=Right  40=Down\n    if (evt.keyCode >= 33 && evt.keyCode <= 40 &&\n        !pdfViewer.containsElement(curElement)) {\n      // The page container is not focused, but a page navigation key has been\n      // pressed. Change the focus to the viewer container to make sure that\n      // navigation by keyboard works as expected.\n      pdfViewer.focus();\n    }\n    // 32=Spacebar\n    if (evt.keyCode === 32 && curElementTagName !== 'BUTTON' &&\n        !pdfViewer.containsElement(curElement)) {\n      pdfViewer.focus();\n    }\n  }\n\n  if (cmd === 2) { // alt-key\n    switch (evt.keyCode) {\n      case 37: // left arrow\n        if (isViewerInPresentationMode) {\n          PDFHistory.back();\n          handled = true;\n        }\n        break;\n      case 39: // right arrow\n        if (isViewerInPresentationMode) {\n          PDFHistory.forward();\n          handled = true;\n        }\n        break;\n    }\n  }\n\n  if (handled) {\n    evt.preventDefault();\n  }\n});\n\nwindow.addEventListener('beforeprint', function beforePrint(evt) {\n  PDFViewerApplication.beforePrint();\n});\n\nwindow.addEventListener('afterprint', function afterPrint(evt) {\n  PDFViewerApplication.afterPrint();\n});\n\n(function animationStartedClosure() {\n  // The offsetParent is not set until the pdf.js iframe or object is visible.\n  // Waiting for first animation.\n  PDFViewerApplication.animationStartedPromise = new Promise(\n      function (resolve) {\n    window.requestAnimationFrame(resolve);\n  });\n})();\n\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/static/view/userlist.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>iview example</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"http://unpkg.com/iview/dist/styles/iview.css\">\n    <script type=\"text/javascript\" src=\"http://vuejs.org/js/vue.min.js\"></script>\n    <script type=\"text/javascript\" src=\"http://unpkg.com/iview/dist/iview.min.js\"></script>\n\t<style>\n\t#app{padding: 32px;}\n\t</style>\n</head>\n<body>\n<div id=\"app\">\n     <i-table border :columns=\"columns7\" :data=\"data6\"></i-table>\n</div>\n<script>\n   \n    var Main = {\n        data () {\n            return {\n                columns7: [\n                    {\n                        title: 'Name',\n                        key: 'name',\n                        render: (h, params) => {\n                            return h('div', [\n                                h('Icon', {\n                                    props: {\n                                        type: 'person'\n                                    }\n                                }),\n                                h('strong', params.row.name)\n                            ]);\n                        }\n                    },\n                    {\n                        title: 'Age',\n                        key: 'age'\n                    },\n                    {\n                        title: 'Address',\n                        key: 'address'\n                    },\n                    {\n                        title: 'Action',\n                        key: 'action',\n                        width: 150,\n                        align: 'center',\n                        render: (h, params) => {\n                            return h('div', [\n                                h('Button', {\n                                    props: {\n                                        type: 'primary',\n                                        size: 'small'\n                                    },\n                                    style: {\n                                        marginRight: '5px'\n                                    },\n                                    on: {\n                                        click: () => {\n                                            this.show(params.index)\n                                        }\n                                    }\n                                }, 'View'),\n                                h('Button', {\n                                    props: {\n                                        type: 'error',\n                                        size: 'small'\n                                    },\n                                    on: {\n                                        click: () => {\n                                            this.remove(params.index)\n                                        }\n                                    }\n                                }, 'Delete')\n                            ]);\n                        }\n                    }\n                ],\n                data6: [\n                    {\n                        name: 'John Brown',\n                        age: 18,\n                        address: 'New York No. 1 Lake Park'\n                    },\n                    {\n                        name: 'Jim Green',\n                        age: 24,\n                        address: 'London No. 1 Lake Park'\n                    },\n                    {\n                        name: 'Joe Black',\n                        age: 30,\n                        address: 'Sydney No. 1 Lake Park'\n                    },\n                    {\n                        name: 'Jon Snow',\n                        age: 26,\n                        address: 'Ottawa No. 2 Lake Park'\n                    }\n                ]\n            }\n        },\n        methods: {\n            show (index) {\n                this.$Modal.info({\n                    title: 'User Info',\n                    content: `Name：${this.data6[index].name}<br>Age：${this.data6[index].age}<br>Address：${this.data6[index].address}`\n                })\n            },\n            remove (index) {\n                this.data6.splice(index, 1);\n            }\n        }\n    }\n\nvar Component = Vue.extend(Main)\nnew Component().$mount('#app')\n</script>\n</body>\n</html>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/templates/announcement/showContent.ftl",
    "content": "<!DOCTYPE html>\n<html lang=\"zh\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge，chrome=1\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n    <title>通告详情</title>\n    <style>\n\n        body {\n            margin: 0;\n            padding: 20px 16px 12px;\n            background-color: #fafafa;\n        }\n\n        .rich_media_title {\n            font-size: 22px;\n            line-height: 1.4;\n            margin: 0 0 14px;\n        }\n\n        .meta_content {\n            margin-bottom: 22px;\n            line-height: 20px;\n            font-size: 0;\n            word-wrap: break-word;\n            -webkit-hyphens: auto;\n            -ms-hyphens: auto;\n            hyphens: auto;\n        }\n\n        .rich_media_meta {\n            display: inline-block;\n            vertical-align: middle;\n            margin: 0 10px 10px 0;\n            font-size: 15px;\n            -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n        }\n\n        .rich_media_meta.priority {\n            padding: 0 4px;\n            font-size: 12px;\n            line-height: 1.67;\n            border: 1px solid #d9d9d9;\n            border-radius: 4px;\n            -moz-border-radius: 4px;\n            -webkit-border-radius: 4px;\n            width: auto;\n            overflow: hidden;\n            text-overflow: ellipsis;\n            white-space: nowrap;\n            word-wrap: normal;\n            max-width: 70%;\n            font-style: normal;\n            letter-spacing: normal;\n            background: rgba(0, 0, 0, 0.05);\n            color: rgba(0, 0, 0, 0.3);\n            margin-right: 8px;\n        }\n\n        .rich_media_meta.H {\n            color: #f5222d;\n            background: #fff1f0;\n            border-color: #ffcfbf;\n        }\n\n\n        .rich_media_meta.M {\n            color: #fa8c16;\n            background: #fff7e6;\n            border-color: #ffe59a;\n        }\n\n        .rich_media_meta.text {\n            color: rgba(0, 0, 0, 0.3);\n        }\n\n        img {\n            max-width: 100%;\n            height: auto;\n        }\n\n        /* 滚动条优化 start */\n        ::-webkit-scrollbar{\n            width:8px;\n            height:8px;\n        }\n        ::-webkit-scrollbar-track{\n            background: #f6f6f6;\n            border-radius:2px;\n        }\n        ::-webkit-scrollbar-thumb{\n            background: #cdcdcd;\n            border-radius:2px;\n        }\n        ::-webkit-scrollbar-thumb:hover{\n            background: #747474;\n        }\n        ::-webkit-scrollbar-corner {\n            background: #f6f6f6;\n        }\n        /* 滚动条优化 end */\n\n    </style>\n</head>\n<body>\n<div>\n    <h2 class=\"rich_media_title\">${data.titile}</h2>\n    <div class=\"meta_content\">\n        <#if data.priority??>\n            <span class=\"rich_media_meta priority ${data.priority}\">\n                <#if data.priority == \"H\">\n                    高\n                <#elseif data.priority == \"M\">\n                    中\n                <#elseif data.priority == \"L\">\n                    低\n                <#else >\n                    ${data.priority}\n                </#if>\n            </span>\n        </#if>\n        <#if data.sender??>\n        <span class=\"rich_media_meta text\">${data.sender}</span>\n        </#if>\n        <#if data.sendTime??>\n        <span class=\"rich_media_meta text\">${data.sendTime?string('yyyy年MM月dd日')}</span>\n        </#if>\n        <#if data.visitsNum??>\n            <span class=\"rich_media_meta text\">访问量:${data.visitsNum}</span>\n        </#if>\n    </div>\n</div>\n<div id=\"content\"></div>\n<script>\n    //update-begin-author:liusq---date:2023-10-30--for: 【QQYUN-6802】查看公告详情，此段端渲染有问题\n    // 获取富文本内容的容器元素\n    let contentContainer = document.getElementById('content');\n\n    // 富文本内容\n    let richText = `${data.msgContent!\"\"}`;\n    if(richText.includes(\"&lt;\") || richText.includes(\"&gt;\")){\n        richText = richText.replace(/&lt;/g, '<').replace(/&gt;/g, '>');\n    }\n    // 将富文本内容插入到容器中\n    contentContainer.innerHTML = richText;\n    // 找到所有的iframe元素\n    let iframes = contentContainer.getElementsByTagName('iframe');\n\n    // 动态加载和渲染每个iframe\n    Array.prototype.forEach.call(iframes, function(iframe) {\n        iframe.onload = function() {\n            // iframe加载完成后，调整它的高度以适应内容\n            iframe.style.width = '100%';\n            iframe.style.height = iframe.contentWindow.document.body.scrollHeight +'px';\n        };\n        iframe.src = iframe.getAttribute('src');\n    });\n    //update-end-author:liusq---date:2023-10-30--for: 【QQYUN-6802】查看公告详情，此段端渲染有问题\n\n    // 监听父窗口发来的消息\n    window.addEventListener('message', (event) => {\n        // 1. 验证消息结构\n        let { type,printSessionId } = event.data\n        if(type == \"action:print\" && printSessionId ){\n            window.print();\n        }\n    });\n</script>\n</body>\n</html>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/templates/demo3.ftl",
    "content": "<!DOCTYPE html>\n<html>\n<head lang=\"en\">\n<title>Spring Boot FreeMarker</title>\n</head>\n<body>\n\tFreemarker HTML <br><br>\n\t\n\tSessionid: ${sessionid!}<br><br>\n\t\n    <font>\n        <#list userList as item>\n            ${item!}<br />\n        </#list>\n    </font>\n</body>\n</html>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/templates/pdfPreviewIframe.ftl",
    "content": "<#assign base=springMacroRequestContext.getContextUrl(\"\")>\n<html>\n<head>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EmulateIE9\">\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\">\n<meta http-equiv=\"Cache-Control\" content=\"no-store\"/>\n<meta http-equiv=\"Pragma\" content=\"no-cache\"/>\n<meta http-equiv=\"Expires\" content=\"0\"/>\n<title>PDF预览</title>\n</head>\n<body>\n<script type=\"text/javascript\">\n\nfunction openScanFile(title,token,bizNo,archivesNo){\n \t //var pdfUrl =\"http://127.0.0.1:8080/jeecg-boot/generic/web/viewer.html?file=\"+encodeURIComponent(\"http://127.0.0.1:8080/jeecg-boot/test/jeecgDemo/getPdfUrl?title=\"+encodeURI(title));\n \t var pdfUrl =\"${base}/generic/web/viewer.html?file=\"+encodeURIComponent(\"https://jeecgos.oss-cn-beijing.aliyuncs.com/files/site/java_p3c.pdf\");\n \t \n\t var vm=window.open(pdfUrl);\n}\n\n window.addEventListener('message', function(event) {\n     var data = event.data;\n     var title = data.title;\n\t var token = data.token;\n     openScanFile(title,token);\n }, false);\n \n</script>\n</body>\n</html>\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/resources/templates/thirdLogin.ftl",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n    <title>第三方登录</title>\n</head>\n<body>\n登陆中...\n<script>\n    window.onload = function () {\n        setTimeout(function (){\n            var thirdLoginInfo = \"${token!''}\";\n            if(!thirdLoginInfo){\n                var thirdLoginModel = '${thirdLoginModel!\"\"}';\n                if(thirdLoginModel){\n                    thirdLoginInfo = JSON.parse(thirdLoginModel);\n                    thirdLoginInfo['isObj'] = true\n                }\n            }\n            window.opener.postMessage(thirdLoginInfo, \"*\");\n            window.close();\n        },1000)\n    }\n</script>\n</body>\n</html>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/Dockerfile",
    "content": "FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:17-anolis\n\nMAINTAINER jeecgos@163.com\n\nRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime\n\n#RUN mkdir -p /jeecg-boot/config/jeecg/\n\nWORKDIR /jeecg-boot\n\nEXPOSE 8080\n\n#ADD ./src/main/resources/jeecg ./config/jeecg\nADD ./target/jeecg-system-start-3.9.1.jar ./\n\nRUN mkdir -p /jeecg-boot/config\n\nCMD sleep 60;java -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-system-start-3.9.1.jar"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/README.md",
    "content": "# 这个是单体启动项目\n- 项目： jeecg-module-system/jeecg-system-start\n- 启动类：jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/JeecgSystemApplication.java\n\n- 端口：8080\n- 访问地址：http://localhost:8080/jeecg-boot\n- 账号密码：admin/123456\n\n\n# 微服务启动项目在这里\n- 项目： jeecg-server-cloud/jeecg-system-cloud-start\n- 启动类：jeecg-server-cloud/jeecg-system-cloud-start/src/main/java/org/jeecg/JeecgSystemCloudApplication.java"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-module-system</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>jeecg-system-start</artifactId>\n    \n    <dependencies>\n        <!-- SYSTEM 系统管理模块 -->\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-system-biz</artifactId>\n            <version>${jeecgboot.version}</version>\n        </dependency>\n        <!-- DEMO 示例模块 -->\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-module-demo</artifactId>\n            <version>${jeecgboot.version}</version>\n        </dependency>\n        \n        <!-- flyway 数据库自动升级 -->\n        <dependency>\n            <groupId>org.flywaydb</groupId>\n            <artifactId>flyway-core</artifactId>\n            <version>7.15.0</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-properties-migrator</artifactId>\n            <scope>runtime</scope>\n        </dependency>\n        <dependency>\n            <groupId>jakarta.servlet</groupId>\n            <artifactId>jakarta.servlet-api</artifactId>\n        </dependency>\n        \n        <!-- 分库分表示例 -->\n     <!--  <dependency>\n           <groupId>org.jeecgframework.boot3</groupId>\n           <artifactId>jeecg-cloud-test-shardingsphere</artifactId>\n           <version>3.9.1</version>\n       </dependency>-->\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/JeecgSystemApplication.java",
    "content": "package org.jeecg;\n\nimport com.xkcoding.justauth.autoconfigure.JustAuthAutoConfiguration;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.ImportAutoConfiguration;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;\nimport org.springframework.boot.builder.SpringApplicationBuilder;\nimport org.springframework.boot.web.servlet.support.SpringBootServletInitializer;\nimport org.springframework.context.ConfigurableApplicationContext;\nimport org.springframework.core.env.Environment;\n\nimport java.net.InetAddress;\nimport java.net.UnknownHostException;\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n* 单体启动类（采用此类启动为单体模式）\n* 报错提醒: 未集成mongo报错，可以打开启动类上面的注释 exclude={MongoAutoConfiguration.class}\n*/\n@Slf4j\n@SpringBootApplication(exclude = MongoAutoConfiguration.class)\n@ImportAutoConfiguration(JustAuthAutoConfiguration.class)  // spring boot 3.x justauth 兼容性处理\npublic class JeecgSystemApplication extends SpringBootServletInitializer {\n\n    @Override\n    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {\n        return application.sources(JeecgSystemApplication.class);\n    }\n\n    public static void main(String[] args) throws UnknownHostException {\n        SpringApplication app = new SpringApplication(JeecgSystemApplication.class);\n        Map<String, Object> defaultProperties = new HashMap<>();\n        defaultProperties.put(\"management.health.elasticsearch.enabled\", false);\n        app.setDefaultProperties(defaultProperties);\n        log.info(\"[JEECG] Elasticsearch Health Check Enabled: false\" );\n        \n        ConfigurableApplicationContext application = app.run(args);;\n        Environment env = application.getEnvironment();\n        String ip = InetAddress.getLocalHost().getHostAddress();\n        String port = env.getProperty(\"server.port\");\n        String path = oConvertUtils.getString(env.getProperty(\"server.servlet.context-path\"));\n        log.info(\"\\n----------------------------------------------------------\\n\\t\" +\n                \"Application Jeecg-Boot is running! Access URLs:\\n\\t\" +\n                \"Local: \\t\\thttp://localhost:\" + port + path + \"\\n\\t\" +\n                \"External: \\thttp://\" + ip + \":\" + port + path + \"/doc.html\\n\\t\" +\n                \"Swagger文档: \\thttp://\" + ip + \":\" + port + path + \"/doc.html\\n\" +\n                \"----------------------------------------------------------\");\n\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/codegenerate/JeecgOneGUI.java",
    "content": "package org.jeecg.codegenerate;\n\nimport org.jeecgframework.codegenerate.window.CodeWindow;\n\n/**\n * @Title: 单表代码生成器入口\n * 【 GUI模式功能弱一些，请优先使用Online代码生成 】\n * @Author 张代浩\n * @site www.jeecg.com\n * @Version:V1.0.1\n */\npublic class JeecgOneGUI {\n\n\t/** 使用手册： https://help.jeecg.com/java/codegen/gui */\n    public static void main(String[] args) {\n    \tnew CodeWindow().pack();\n\t}\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/codegenerate/JeecgOneToMainUtil.java",
    "content": "package org.jeecg.codegenerate;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.jeecgframework.codegenerate.generate.impl.CodeGenerateOneToMany;\nimport org.jeecgframework.codegenerate.generate.pojo.onetomany.MainTableVo;\nimport org.jeecgframework.codegenerate.generate.pojo.onetomany.SubTableVo;\n\n/**\n * 代码生成器入口【一对多】\n * \n * 【 GUI模式功能弱一些，请优先使用Online代码生成 】\n * @Author 张代浩\n * @site www.jeecg.com\n * \n */\npublic class JeecgOneToMainUtil {\n\n\t/**\n\t * 一对多(父子表)数据模型，生成方法\n\t * @param args\n\t */\n\tpublic static void main(String[] args) {\n\t\t//第一步：设置主表配置\n\t\tMainTableVo mainTable = new MainTableVo();\n        //表名\n\t\tmainTable.setTableName(\"jeecg_order_main\");\n        //实体名\n\t\tmainTable.setEntityName(\"GuiTestOrderMain\");\n        //包名\n\t\tmainTable.setEntityPackage(\"gui\");\n        //描述\n\t\tmainTable.setFtlDescription(\"GUI订单管理\");\n\t\t\n\t\t//第二步：设置子表集合配置\n\t\tList<SubTableVo> subTables = new ArrayList<SubTableVo>();\n\t\t//[1].子表一\n\t\tSubTableVo po = new SubTableVo();\n        //表名\n\t\tpo.setTableName(\"jeecg_order_customer\");\n        //实体名\n\t\tpo.setEntityName(\"GuiTestOrderCustom\");\n        //包名\n\t\tpo.setEntityPackage(\"gui\");\n        //描述\n\t\tpo.setFtlDescription(\"客户明细\");\n\t\t//子表外键参数配置\n\t\t/*说明: \n\t\t * a) 子表引用主表主键ID作为外键，外键字段必须以_ID结尾;\n\t\t * b) 主表和子表的外键字段名字，必须相同（除主键ID外）;\n\t\t * c) 多个外键字段，采用逗号分隔;\n\t\t*/\n\t\tpo.setForeignKeys(new String[]{\"order_id\"});\n\t\tsubTables.add(po);\n\t\t//[2].子表二\n\t\tSubTableVo po2 = new SubTableVo();\n        //表名\n\t\tpo2.setTableName(\"jeecg_order_ticket\");\n        //实体名\n\t\tpo2.setEntityName(\"GuiTestOrderTicket\");\n        //包名\n\t\tpo2.setEntityPackage(\"gui\");\n        //描述\n\t\tpo2.setFtlDescription(\"产品明细\");\n\t\t//子表外键参数配置\n\t\t/*说明: \n\t\t * a) 子表引用主表主键ID作为外键，外键字段必须以_ID结尾;\n\t\t * b) 主表和子表的外键字段名字，必须相同（除主键ID外）;\n\t\t * c) 多个外键字段，采用逗号分隔;\n\t\t*/\n\t\tpo2.setForeignKeys(new String[]{\"order_id\"});\n\t\tsubTables.add(po2);\n\t\tmainTable.setSubTables(subTables);\n\t\t\n\t\t//第三步：一对多(父子表)数据模型,代码生成\n\t\ttry {\n\t\t\tnew CodeGenerateOneToMany(mainTable,subTables).generateCodeFile(null);\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/config/flyway/FlywayConfig.java",
    "content": "package org.jeecg.config.flyway;\n\nimport com.baomidou.dynamic.datasource.DynamicRoutingDataSource;\nimport jakarta.annotation.PostConstruct;\nimport lombok.extern.slf4j.Slf4j;\nimport org.flywaydb.core.Flyway;\nimport org.flywaydb.core.api.FlywayException;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.core.env.Environment;\n\nimport javax.sql.DataSource;\nimport java.util.Map;\n\n/**\n * @Description: 初始化flyway配置 修改之后支持多数据源，当出现异常时打印日志，不影响项目启动\n *\n * @author: wangshuai\n * @date: 2024/3/12 10:03\n */\n@Slf4j\n@Configuration\npublic class FlywayConfig {\n\n    @Autowired\n    private DataSource dataSource;\n\n    @Autowired\n    private Environment environment;\n\n    /**\n     * 是否开启flyway\n     */\n    @Value(\"${spring.flyway.enabled:false}\")\n    private Boolean enabled;\n    \n    /**\n     * 编码格式，默认UTF-8\n     */\n    @Value(\"${spring.flyway.encoding:UTF-8}\")\n    private String encoding;\n\n    /**\n     * 迁移sql脚本文件存放路径，官方默认db/migration\n     */\n    @Value(\"${spring.flyway.locations:classpath:flyway/sql/mysql}\")\n    private String locations;\n\n    /**\n     * 迁移sql脚本文件名称的前缀，默认V\n     */\n    @Value(\"${spring.flyway.sql-migration-prefix:V}\")\n    private String sqlMigrationPrefix;\n\n    /**\n     * 迁移sql脚本文件名称的分隔符，默认2个下划线__\n     */\n    @Value(\"${spring.flyway.sql-migration-separator:__}\")\n    private String sqlMigrationSeparator;\n\n    /**\n     * 文本前缀\n     */\n    @Value(\"${spring.flyway.placeholder-prefix:#(}\")\n    private String placeholderPrefix;\n\n    /**\n     * 文本后缀\n     */\n    @Value(\"${spring.flyway.placeholder-suffix:)}\")\n    private String placeholderSuffix;\n\n    /**\n     * 迁移sql脚本文件名称的后缀\n     */\n    @Value(\"${spring.flyway.sql-migration-suffixes:.sql}\")\n    private String sqlMigrationSuffixes;\n\n    /**\n     * 迁移时是否进行校验，默认true\n     */\n    @Value(\"${spring.flyway.validate-on-migrate:true}\")\n    private Boolean validateOnMigrate;\n\n    /**\n     * 当迁移发现数据库非空且存在没有元数据的表时，自动执行基准迁移，新建schema_version表\n     */\n    @Value(\"${spring.flyway.baseline-on-migrate:true}\")\n    private Boolean baselineOnMigrate;\n\n    /**\n     * 是否关闭要清除已有库下的表功能,生产环境必须为true,否则会删库，非常重要！！！\n     */\n    @Value(\"${spring.flyway.clean-disabled:true}\")\n    private Boolean cleanDisabled;\n\n    @PostConstruct\n    public void migrate() {\n        if(!enabled){\n            return;\n        }\n\n        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;\n        Map<String, DataSource> dataSources = ds.getDataSources();\n        dataSources.forEach((k, v) -> {\n            if(\"master\".equals(k)){\n                String databaseType = environment.getProperty(\"spring.datasource.dynamic.datasource.\" + k + \".url\");\n                if (databaseType != null && databaseType.contains(\"mysql\")) {\n                    try {\n                        Flyway flyway = Flyway.configure()\n                                .dataSource(v)\n                                .locations(locations)\n                                .encoding(encoding)\n                                .sqlMigrationPrefix(sqlMigrationPrefix)\n                                .sqlMigrationSeparator(sqlMigrationSeparator)\n                                .placeholderPrefix(placeholderPrefix)\n                                .placeholderSuffix(placeholderSuffix)\n                                .sqlMigrationSuffixes(sqlMigrationSuffixes)\n                                .validateOnMigrate(validateOnMigrate)\n                                .baselineOnMigrate(baselineOnMigrate)\n                                .cleanDisabled(cleanDisabled)\n                                .load();\n                        flyway.migrate();\n                        log.info(\"【数据库升级】平台集成了MySQL库的Flyway，数据库版本自动升级! \");\n                    } catch (FlywayException e) {\n                        log.error(\"【数据库升级】flyway执行sql脚本失败\", e);\n                    }\n                } else {\n                    log.warn(\"【数据库升级】平台只集成了MySQL库的Flyway，实现了数据库版本自动升级! 其他类型的数据库，您可以考虑手工升级~\");\n                }\n            }\n        });\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml",
    "content": "server:\n  port: 8080\n  tomcat:\n    max-swallow-size: -1\n  error:\n    include-exception: true\n    include-stacktrace: ALWAYS\n    include-message: ALWAYS\n  servlet:\n    context-path: /jeecg-boot\n  compression:\n    enabled: true\n    min-response-size: 1024\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\n\nmanagement:\n  endpoints:\n    web:\n      exposure:\n        include: metrics,httpexchanges,jeecghttptrace\n\nspring:\n#  main:\n#    # 启动加速 (建议开发环境，开启后flyway自动升级失效)\n#    lazy-initialization: true\n  flyway:\n    # 是否启用flyway\n    enabled: false\n    # 迁移sql脚本存放路径\n    locations: classpath:flyway/sql/mysql\n    # 是否关闭要清除已有库下的表功能,生产环境必须为true,否则会删库，非常重要！！！\n    clean-disabled: true\n  servlet:\n    multipart:\n      max-file-size: 10MB\n      max-request-size: 10MB\n  mail:\n    # 定时任务发送邮件\n    timeJobSend: false\n    host: smtp.163.com\n    username: jeecgos@163.com\n    password: ??\n    properties:\n      mail.smtp.timeout: 10000  # 连接超时（毫秒）\n      mail.smtp.connectiontimeout: 10000  # 连接超时（毫秒）\n      mail.smtp.writetimeout: 10000  # 写入超时（毫秒）\n      mail.smtp.auth: true\n      smtp.ssl.enable: true\n#      mail.debug: true  # 启用调试模式(查看详细日志)\n  ## quartz定时任务,采用数据库方式\n  quartz:\n    job-store-type: jdbc\n    jdbc:\n      initialize-schema: embedded\n    #定时任务启动开关，true-开  false-关\n    auto-startup: true\n    #延迟1秒启动定时任务\n    startup-delay: 1s\n    #启动时更新己存在的Job\n    overwrite-existing-jobs: true\n    properties:\n      org:\n        quartz:\n          scheduler:\n            instanceName: MyScheduler\n            instanceId: AUTO\n          jobStore:\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n            tablePrefix: QRTZ_\n            isClustered: true\n            misfireThreshold: 12000\n            clusterCheckinInterval: 15000\n          threadPool:\n            class: org.quartz.simpl.SimpleThreadPool\n            threadCount: 10\n            threadPriority: 5\n            threadsInheritContextClassLoaderOfInitializingThread: true\n  #json 时间戳统一转换\n  jackson:\n    date-format: yyyy-MM-dd HH:mm:ss\n    time-zone: GMT+8\n  jpa:\n    open-in-view: false\n  aop:\n    proxy-target-class: true\n  #配置freemarker\n  freemarker:\n    # 设置模板后缀名\n    suffix: .ftl\n    # 设置文档类型\n    content-type: text/html\n    # 设置页面编码格式\n    charset: UTF-8\n    # 设置页面缓存\n    cache: false\n    prefer-file-system-access: false\n    # 设置ftl文件路径\n    template-loader-path:\n      - classpath:/templates\n    template_update_delay: 0\n  # 设置静态文件路径，js,css等\n  mvc:\n    static-path-pattern: /**\n    #Spring Boot 2.6+后映射匹配的默认策略已从AntPathMatcher更改为PathPatternParser,需要手动指定为ant-path-matcher\n    pathmatch:\n      matching-strategy: ant_path_matcher\n  resource:\n    static-locations: classpath:/static/,classpath:/public/\n  autoconfigure:\n    exclude:\n      - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\n  datasource:\n    druid:\n      stat-view-servlet:\n        enabled: true\n        loginUsername: admin\n        loginPassword: 123456\n        allow:\n      web-stat-filter:\n        enabled: true\n    dynamic:\n      druid:\n        # 连接池的配置信息\n        # 初始化大小，最小，最大\n        initial-size: 5\n        min-idle: 5\n        maxActive: 1000\n        # 配置获取连接等待超时的时间\n        maxWait: 60000\n        # 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒\n        timeBetweenEvictionRunsMillis: 60000\n        # 配置一个连接在池中最小生存的时间，单位是毫秒\n        minEvictableIdleTimeMillis: 300000\n        validationQuery: SELECT 1\n        testWhileIdle: true\n        testOnBorrow: false\n        testOnReturn: false\n        # 打开PSCache，并且指定每个连接上PSCache的大小\n        poolPreparedStatements: true\n        maxPoolPreparedStatementPerConnectionSize: 20\n        # 配置监控统计拦截的filters，去掉后监控界面sql无法统计，'wall'用于防火墙\n        filters: stat,slf4j\n        # 允许SELECT语句的WHERE子句是一个永真条件\n        wall:\n          selectWhereAlwayTrueCheck: false\n        # 打开mergeSql功能；慢SQL记录\n        stat:\n          merge-sql: false\n          slow-sql-millis: 5000\n      datasource:\n        master:\n          url: jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n          username: root\n          password: root\n          driver-class-name: com.mysql.cj.jdbc.Driver\n#        # shardingjdbc数据源\n#        sharding-db:\n#          driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver\n#          url: jdbc:shardingsphere:classpath:sharding.yaml\n  #redis 配置\n  data:\n    redis:\n      database: 0\n      host: 127.0.0.1\n      port: 6379\n      password:\n#mybatis plus 设置\nmybatis-plus:\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n  global-config:\n    # 关闭MP3.0自带的banner\n    banner: false\n    db-config:\n      #主键类型  0:\"数据库ID自增\",1:\"该类型为未设置主键类型\", 2:\"用户输入ID\",3:\"全局唯一ID (数字类型唯一ID)\", 4:\"全局唯一ID UUID\",5:\"字符串全局唯一ID (idWorker 的字符串表示)\";\n      id-type: ASSIGN_ID\n      # 默认数据库表下划线命名\n      table-underline: true\n  configuration:\n    # 这个配置会将执行的sql打印出来，在开发或测试的时候可以用\n    #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n    # 返回类型为Map,显示null对应的字段\n    call-setters-on-nulls: true\n#jeecg专用配置\nminidao:\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n  # 自定义资源请求前缀（js、css等解决nginx转发问题）\n  custom-resource-prefix-path:\n  # AI集成\n  ai-chat:\n    enabled: true\n    model: deepseek-chat\n    apiKey: ??\n    apiHost: https://api.deepseek.com/v1\n    timeout: 60\n  # AIRag向量库\n  ai-rag:\n    # AI流程敏感节点(stdio=命令行节点, sql=SQL节点)\n    allow-sensitive-nodes: sql,stdio\n    embed-store:\n      host: 127.0.0.1\n      port: 5432\n      database: postgres\n      user: postgres\n      password: postgres\n      table: embeddings\n  #  Unipush配置 云函数调用 URL 化地址\n  unicloud:\n    pushUrl:\n  # 平台上线安全配置\n  firewall:\n    # 数据源安全 (开启后，Online报表和图表的数据源为必填)\n    dataSourceSafe: false\n    # 低代码模式（dev:开发模式，prod:发布模式——关闭所有在线开发配置能力）\n    lowCodeMode: dev\n    # 是否允许同一账号多地同时登录 （为 true 时允许一起登录, 为 false 时新登录挤掉旧登录）\n    is-concurrent: true\n  # 签名密钥串(前后端要一致，正式发布请自行修改)\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n  #签名拦截接口\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys,/sys/sendChangePwdSms,/sys/user/sendChangePhoneSms,/sys/sms,/desform/api/sendVerifyCode\n  # 本地：local、Minio：minio、阿里云：alioss\n  uploadType: local\n  # 前端访问地址\n  domainUrl:\n    pc: http://localhost:3100\n    app: http://localhost:8051\n  path:\n    #文件上传根目录 设置\n    upload: /opt/upFiles\n    #webapp文件路径\n    webapp: /opt/webapp\n  shiro:\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/bigscreen/category/**,/bigscreen/visual/**,/bigscreen/map/**,/jmreport/bigscreen2/**\n  # 短信发送方式 aliyun阿里云短信 tencent腾讯云短信\n  smsSendType: aliyun\n  #阿里云oss存储和大鱼短信秘钥配置\n  oss:\n    accessKey: ??\n    secretKey: ??\n    endpoint: oss-cn-beijing.aliyuncs.com\n    bucketName: jeecgdev\n    # 短信模板\n    sms-template:\n      # 签名\n      signature:\n      # 模板code\n      templateCode:\n        # 登录短信、忘记密码模板编码\n        SMS_175435174:\n        # 修改密码短信模板编码\n        SMS_465391221:\n        # 注册账号短信模板编码\n        SMS_175430166:\n  #腾讯短信秘钥配置\n  tencent:\n    # 接入域名\n    endpoint: sms.tencentcloudapi.com\n    secretId: ??\n    secretKey: ??\n    # 应用ID\n    sdkAppId: ??\n    # 地域信息\n    region: ap-beijing\n  # 在线预览文件服务器地址配置\n  file-view-domain: http://fileview.jeecg.com\n  # minio文件上传\n  minio:\n    minio_url: http://minio.jeecg.com\n    minio_name: ??\n    minio_pass: ??\n    bucketName: otatest\n  #大屏报表参数设置\n  jmreport:\n    #多租户模式，默认值为空(created:按照创建人隔离、tenant:按照租户隔离) (v1.6.2+ 新增)\n    saasMode: \n    # 平台上线安全配置(v1.6.2+ 新增)\n    firewall:\n      # 数据源安全 (开启后，不允许使用平台数据源、SQL解析加签并且不允许查询数据库)\n      dataSourceSafe: false\n      # 低代码开发模式（dev:开发模式，prod:发布模式—关闭在线报表设计功能，分配角色admin、lowdeveloper可以放开限制）\n      lowCodeMode: dev\n    # 高德地图Api配置(v2.1.3+ BI新增高德地图)\n    gao-de-api:\n      # 应用key\n      api-key: ??\n      # 应用秘钥\n      secret-key: ??\n  #xxl-job配置\n  xxljob:\n    enabled: false\n    adminAddresses: http://127.0.0.1:9080/xxl-job-admin\n    appname: ${spring.application.name}\n    accessToken: ''\n    address: 127.0.0.1:30007\n    ip: 127.0.0.1\n    port: 30007\n    logPath: logs/jeecg/job/jobhandler/\n    logRetentionDays: 30\n  #分布式锁配置\n  redisson:\n    address: 127.0.0.1:6379\n    password:\n    type: STANDALONE\n    enabled: true\n  # 百度开放API配置\n  baidu-api:\n    app-id: ??\n    api-key: ??\n    secret-key: ??\n#cas单点登录\ncas:\n  prefixUrl: http://cas.example.org:8443/cas\n#Mybatis输出sql日志\nlogging:\n  level:\n    org.springframework.context.support.PostProcessorRegistrationDelegate: error\n    org.flywaydb: debug\n    org.jeecg.modules.system.mapper: info\n    org.jeecg.modules.demo.test.mapper: info\n#swagger\nknife4j:\n  #开启增强配置\n  enable: true\n  #开启生产环境屏蔽\n  production: false\n  basic:\n    enable: false\n    username: jeecg\n    password: jeecg1314\n#第三方登录\njustauth:\n  enabled: true\n  type:\n    GITHUB:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/github/callback\n    WECHAT_ENTERPRISE:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_enterprise/callback\n      agent-id: ??\n    DINGTALK:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/dingtalk/callback\n    WECHAT_OPEN:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_open/callback\n  cache:\n    type: default\n    prefix: 'demo::'\n    timeout: 1h\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dm8.yml",
    "content": "server:\n  port: 8080\n  tomcat:\n    max-swallow-size: -1\n  error:\n    include-exception: true\n    include-stacktrace: ALWAYS\n    include-message: ALWAYS\n  servlet:\n    context-path: /jeecg-boot\n  compression:\n    enabled: true\n    min-response-size: 1024\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\n\nmanagement:\n  endpoints:\n    web:\n      exposure:\n        include: metrics,httpexchanges,jeecghttptrace\n\nspring:\n  flyway:\n    # 是否启用flyway\n    enabled: false\n    clean-disabled: true\n  servlet:\n    multipart:\n      max-file-size: 10MB\n      max-request-size: 10MB\n  mail:\n    # 定时任务发送邮件\n    timeJobSend: false\n    host: smtp.163.com\n    username: jeecgos@163.com\n    password: ??\n    properties:\n      mail.smtp.timeout: 10000  # 连接超时（毫秒）\n      mail.smtp.connectiontimeout: 10000  # 连接超时（毫秒）\n      mail.smtp.writetimeout: 10000  # 写入超时（毫秒）\n      mail.smtp.auth: true\n      smtp.ssl.enable: true\n  ## quartz定时任务,采用数据库方式\n  quartz:\n    job-store-type: jdbc\n    jdbc:\n      initialize-schema: embedded\n    #定时任务启动开关，true-开  false-关\n    auto-startup: true\n    #延迟1秒启动定时任务\n    startup-delay: 1s\n    #启动时更新己存在的Job\n    overwrite-existing-jobs: true\n    properties:\n      org:\n        quartz:\n          scheduler:\n            instanceName: MyScheduler\n            instanceId: AUTO\n          jobStore:\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n            tablePrefix: QRTZ_\n            isClustered: true\n            misfireThreshold: 12000\n            clusterCheckinInterval: 15000\n          threadPool:\n            class: org.quartz.simpl.SimpleThreadPool\n            threadCount: 10\n            threadPriority: 5\n            threadsInheritContextClassLoaderOfInitializingThread: true\n  #json 时间戳统一转换\n  jackson:\n    date-format: yyyy-MM-dd HH:mm:ss\n    time-zone: GMT+8\n  jpa:\n    open-in-view: false\n    properties:\n      hibernate:\n        dialect: org.hibernate.dialect.DmDialect\n  aop:\n    proxy-target-class: true\n  #配置freemarker\n  freemarker:\n    # 设置模板后缀名\n    suffix: .ftl\n    # 设置文档类型\n    content-type: text/html\n    # 设置页面编码格式\n    charset: UTF-8\n    # 设置页面缓存\n    cache: false\n    prefer-file-system-access: false\n    # 设置ftl文件路径\n    template-loader-path:\n      - classpath:/templates\n    template_update_delay: 0\n  # 设置静态文件路径，js,css等\n  mvc:\n    static-path-pattern: /**\n    #Spring Boot 2.6+后映射匹配的默认策略已从AntPathMatcher更改为PathPatternParser,需要手动指定为ant-path-matcher\n    pathmatch:\n      matching-strategy: ant_path_matcher\n  resource:\n    static-locations: classpath:/static/,classpath:/public/\n  autoconfigure:\n    exclude:\n      - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\n  datasource:\n    druid:\n      stat-view-servlet:\n        enabled: true\n        loginUsername: admin\n        loginPassword: 123456\n        allow:\n      web-stat-filter:\n        enabled: true\n    #打开多数据源，加上上面的就可以实现多数据源的配置\n    dynamic:\n      druid:\n        filters: stat,slf4j\n        # 初始连接数\n        initialSize: 5\n        validationQuery: SELECT 1 FROM DUAL\n        # 最小连接池数量\n        minIdle: 5\n        # 最大连接池数量\n        maxActive: 10\n      datasource:\n        # 重点是将数据源指向oracle 用compatibleMode=oracle即可\n        master:\n          url: jdbc:dm://127.0.0.1:30236?schema=SYSDBA&compatibleMode=oracle&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8\n          username: SYSDBA\n          password: SYSDBA\n          driverClassName: dm.jdbc.driver.DmDriver\n  #redis 配置\n  data:\n    redis:\n      database: 0\n      host: 127.0.0.1\n      port: 6379\n      password: ''\n#mybatis plus 设置\nmybatis-plus:\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n  global-config:\n    # 关闭MP3.0自带的banner\n    banner: false\n    db-config:\n      #主键类型  0:\"数据库ID自增\",1:\"该类型为未设置主键类型\", 2:\"用户输入ID\",3:\"全局唯一ID (数字类型唯一ID)\", 4:\"全局唯一ID UUID\",5:\"字符串全局唯一ID (idWorker 的字符串表示)\";\n      id-type: ASSIGN_ID\n      # 默认数据库表下划线命名\n      table-underline: true\n  configuration:\n#    # 这个配置会将执行的sql打印出来，在开发或测试的时候可以用\n#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n    # 返回类型为Map,显示null对应的字段\n    call-setters-on-nulls: true\n#jeecg专用配置\nminidao:\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n  # AI集成\n  ai-chat:\n    enabled: true\n    model: deepseek-chat\n    apiKey: ??\n    apiHost: https://api.deepseek.com/v1\n    timeout: 60\n  # AIRag向量库\n  ai-rag:\n    embed-store:\n      host: 127.0.0.1\n      port: 5432\n      database: postgres\n      user: postgres\n      password: postgres\n      table: embeddings\n  # 平台上线安全配置\n  firewall:\n    # 数据源安全 (开启后，Online报表和图表的数据源为必填)\n    dataSourceSafe: false\n    # 低代码模式（dev:开发模式，prod:发布模式——关闭所有在线开发配置能力）\n    lowCodeMode: dev\n  # 签名密钥串(前后端要一致，正式发布请自行修改)\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n  #签名拦截接口\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys,/sys/sendChangePwdSms,/sys/user/sendChangePhoneSms,/sys/sms,/desform/api/sendVerifyCode\n  # 本地：local、Minio：minio、阿里云：alioss\n  uploadType: local\n  # 前端访问地址\n  domainUrl:\n    pc: http://localhost:3100\n    app: http://localhost:8051\n  path:\n    #文件上传根目录 设置\n    upload: /opt/upFiles\n    #webapp文件路径\n    webapp: /opt/webapp\n  shiro:\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/bigscreen/category/**,/bigscreen/visual/**,/bigscreen/map/**,/jmreport/bigscreen2/**\n  #阿里云oss存储和大鱼短信秘钥配置\n  oss:\n    accessKey: ??\n    secretKey: ??\n    endpoint: oss-cn-beijing.aliyuncs.com\n    bucketName: jeecgdev\n    # 短信模板\n    sms-template:\n      # 签名\n      signature:\n      # 模板code\n      templateCode:\n        # 登录短信、忘记密码模板编码\n        SMS_175435174:\n        # 修改密码短信模板编码\n        SMS_465391221:\n        # 注册账号短信模板编码\n        SMS_175430166:\n  # 在线预览文件服务器地址配置\n  file-view-domain: http://fileview.jeecg.com\n  # minio文件上传\n  minio:\n    minio_url: http://minio.jeecg.com\n    minio_name: ??\n    minio_pass: ??\n    bucketName: otatest\n  #大屏报表参数设置\n  jmreport:\n    #多租户模式，默认值为空(created:按照创建人隔离、tenant:按照租户隔离) (v1.6.2+ 新增)\n    saasMode:\n    # 平台上线安全配置(v1.6.2+ 新增)\n    firewall:\n      # 数据源安全 (开启后，不允许使用平台数据源、SQL解析加签并且不允许查询数据库)\n      dataSourceSafe: false\n      # 低代码开发模式（dev:开发模式，prod:发布模式—关闭在线报表设计功能，分配角色admin、lowdeveloper可以放开限制）\n      lowCodeMode: dev\n    # 高德地图Api配置(v2.1.3+ BI新增高德地图)\n    gao-de-api:\n      # 应用key\n      api-key: ??\n      # 应用秘钥\n      secret-key: ??\n  #xxl-job配置\n  xxljob:\n    enabled: false\n    adminAddresses: http://127.0.0.1:9080/xxl-job-admin\n    appname: ${spring.application.name}\n    accessToken: ''\n    address: 127.0.0.1:30007\n    ip: 127.0.0.1\n    port: 30007\n    logPath: logs/jeecg/job/jobhandler/\n    logRetentionDays: 30\n  #分布式锁配置\n  redisson:\n    address: 127.0.0.1:6379\n    password:\n    type: STANDALONE\n    enabled: true\n#cas单点登录\ncas:\n  prefixUrl: http://cas.example.org:8443/cas\n#Mybatis输出sql日志\nlogging:\n  level:\n    org.springframework.context.support.PostProcessorRegistrationDelegate: error\n    org.flywaydb: debug\n    org.jeecg.modules.system.mapper: info\n#swagger\nknife4j:\n  #开启增强配置\n  enable: true\n  #开启生产环境屏蔽\n  production: false\n  basic:\n    enable: false\n    username: jeecg\n    password: jeecg1314\n#第三方登录\njustauth:\n  enabled: true\n  type:\n    GITHUB:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/github/callback\n    WECHAT_ENTERPRISE:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_enterprise/callback\n      agent-id: ??\n    DINGTALK:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/dingtalk/callback\n    WECHAT_OPEN:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_open/callback\n  cache:\n    type: default\n    prefix: 'demo::'\n    timeout: 1h\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-docker.yml",
    "content": "server:\n  port: 8080\n  tomcat:\n    max-swallow-size: -1\n  error:\n    include-exception: true\n    include-stacktrace: ALWAYS\n    include-message: ALWAYS\n  servlet:\n    context-path: /jeecg-boot\n  compression:\n    enabled: true\n    min-response-size: 1024\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\n\nmanagement:\n  endpoints:\n    web:\n      exposure:\n        include: metrics,httpexchanges,jeecghttptrace\n\nspring:\n  flyway:\n    # 是否启用flyway\n    enabled: true\n    # 是否关闭要清除已有库下的表功能,生产环境必须为true,否则会删库，非常重要！！！\n    clean-disabled: true\n  servlet:\n    multipart:\n      max-file-size: 10MB\n      max-request-size: 10MB\n  mail:\n    # 定时任务发送邮件\n    timeJobSend: false\n    host: smtp.163.com\n    username: jeecgos@163.com\n    password: ??\n    properties:\n      mail.smtp.timeout: 10000  # 连接超时（毫秒）\n      mail.smtp.connectiontimeout: 10000  # 连接超时（毫秒）\n      mail.smtp.writetimeout: 10000  # 写入超时（毫秒）\n      mail.smtp.auth: true\n      smtp.ssl.enable: true\n      mail.debug: true  # 启用调试模式(查看详细日志)\n  ## quartz定时任务,采用数据库方式\n  quartz:\n    job-store-type: jdbc\n    jdbc:\n      initialize-schema: embedded\n    #定时任务启动开关，true-开  false-关\n    auto-startup: true\n    #延迟1秒启动定时任务\n    startup-delay: 1s\n    #启动时更新己存在的Job\n    overwrite-existing-jobs: true\n    properties:\n      org:\n        quartz:\n          scheduler:\n            instanceName: MyScheduler\n            instanceId: AUTO\n          jobStore:\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n            tablePrefix: QRTZ_\n            isClustered: true\n            misfireThreshold: 12000\n            clusterCheckinInterval: 15000\n          threadPool:\n            class: org.quartz.simpl.SimpleThreadPool\n            threadCount: 10\n            threadPriority: 5\n            threadsInheritContextClassLoaderOfInitializingThread: true\n  #json 时间戳统一转换\n  jackson:\n    date-format: yyyy-MM-dd HH:mm:ss\n    time-zone: GMT+8\n  jpa:\n    open-in-view: false\n  aop:\n    proxy-target-class: true\n  #配置freemarker\n  freemarker:\n    # 设置模板后缀名\n    suffix: .ftl\n    # 设置文档类型\n    content-type: text/html\n    # 设置页面编码格式\n    charset: UTF-8\n    # 设置页面缓存\n    cache: false\n    prefer-file-system-access: false\n    # 设置ftl文件路径\n    template-loader-path:\n      - classpath:/templates\n    template_update_delay: 0\n  # 设置静态文件路径，js,css等\n  mvc:\n    static-path-pattern: /**\n    #Spring Boot 2.6+后映射匹配的默认策略已从AntPathMatcher更改为PathPatternParser,需要手动指定为ant-path-matcher\n    pathmatch:\n      matching-strategy: ant_path_matcher\n  resource:\n    static-locations: classpath:/static/,classpath:/public/\n  autoconfigure:\n    exclude:\n      - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\n  datasource:\n    druid:\n      stat-view-servlet:\n        enabled: true\n        loginUsername: admin\n        loginPassword: 123456\n        allow:\n      web-stat-filter:\n        enabled: true\n    dynamic:\n      druid:\n        # 连接池的配置信息\n        initial-size: 5\n        min-idle: 5\n        maxActive: 1000\n        # 配置获取连接等待超时的时间\n        maxWait: 60000\n        # 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒\n        timeBetweenEvictionRunsMillis: 60000\n        # 配置一个连接在池中最小生存的时间，单位是毫秒\n        minEvictableIdleTimeMillis: 300000\n        validationQuery: SELECT 1\n        testWhileIdle: true\n        testOnBorrow: false\n        testOnReturn: false\n        # 打开PSCache，并且指定每个连接上PSCache的大小\n        poolPreparedStatements: true\n        maxPoolPreparedStatementPerConnectionSize: 20\n        # 配置监控统计拦截的filters，去掉后监控界面sql无法统计，'wall'用于防火墙\n        filters: stat,slf4j\n        # 允许SELECT语句的WHERE子句是一个永真条件\n        wall:\n          selectWhereAlwayTrueCheck: false\n        # 打开mergeSql功能；慢SQL记录\n        stat:\n          merge-sql: false\n          slow-sql-millis: 5000\n      datasource:\n        master:\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n          username: root\n          password: root\n          driver-class-name: com.mysql.cj.jdbc.Driver\n          # 多数据源配置\n          #multi-datasource1:\n          #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n          #username: root\n          #password: root\n          #driver-class-name: com.mysql.cj.jdbc.Driver\n  #redis 配置\n  data:\n    redis:\n      database: 0\n      host: jeecg-boot-redis\n      port: 6379\n      password:\n#mybatis plus 设置\nmybatis-plus:\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n  global-config:\n    # 关闭MP3.0自带的banner\n    banner: false\n    db-config:\n      #主键类型  0:\"数据库ID自增\",1:\"该类型为未设置主键类型\", 2:\"用户输入ID\",3:\"全局唯一ID (数字类型唯一ID)\", 4:\"全局唯一ID UUID\",5:\"字符串全局唯一ID (idWorker 的字符串表示)\";\n      id-type: ASSIGN_ID\n      # 默认数据库表下划线命名\n      table-underline: true\n  configuration:\n    # 这个配置会将执行的sql打印出来，在开发或测试的时候可以用\n    #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n    # 返回类型为Map,显示null对应的字段\n    call-setters-on-nulls: true\n#jeecg专用配置\nminidao:\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n  # 自定义资源请求前缀（js、css等解决nginx转发问题）\n  custom-resource-prefix-path:\n  # AI集成\n  ai-chat:\n    enabled: true\n    model: deepseek-chat\n    apiKey: ??\n    apiHost: https://api.deepseek.com/v1\n    timeout: 60\n  # AIRag向量库\n  ai-rag:\n    embed-store:\n      host: jeecg-boot-pgvector\n      port: 5432\n      database: vector_db\n      user: postgres\n      password: postgres\n      table: embeddings\n  # 平台上线安全配置\n  firewall:\n    # 数据源安全 (开启后，Online报表和图表的数据源为必填)\n    dataSourceSafe: false\n    # 低代码模式（dev:开发模式，prod:发布模式——关闭所有在线开发配置能力）\n    lowCodeMode: dev\n  # 签名密钥串(前后端要一致，正式发布请自行修改)\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n  #签名拦截接口\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys,/sys/sendChangePwdSms,/sys/user/sendChangePhoneSms,/sys/sms,/desform/api/sendVerifyCode\n  # 本地：local、Minio：minio、阿里云：alioss\n  uploadType: local\n  # 前端访问地址\n  domainUrl:\n    pc: http://localhost:3100\n    app: http://localhost:8051\n  path:\n    #文件上传根目录 设置\n    upload: /opt/upFiles\n    #webapp文件路径\n    webapp: /opt/webapp\n  shiro:\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/bigscreen/category/**,/bigscreen/visual/**,/bigscreen/map/**,/jmreport/bigscreen2/**\n  #阿里云oss存储和大鱼短信秘钥配置\n  oss:\n    accessKey: ??\n    secretKey: ??\n    endpoint: oss-cn-beijing.aliyuncs.com\n    bucketName: jeecgdev\n    # 短信模板\n    sms-template:\n      # 签名\n      signature:\n      # 模板code\n      templateCode:\n        # 登录短信、忘记密码模板编码\n        SMS_175435174:\n        # 修改密码短信模板编码\n        SMS_465391221:\n        # 注册账号短信模板编码\n        SMS_175430166:\n  # 在线预览文件服务器地址配置\n  file-view-domain: http://fileview.jeecg.com\n  # minio文件上传\n  minio:\n    minio_url: http://minio.jeecg.com\n    minio_name: ??\n    minio_pass: ??\n    bucketName: otatest\n  #大屏报表参数设置\n  jmreport:\n    #多租户模式，默认值为空(created:按照创建人隔离、tenant:按照租户隔离) (v1.6.2+ 新增)\n    saasMode: \n    # 平台上线安全配置(v1.6.2+ 新增)\n    firewall:\n      # 数据源安全 (开启后，不允许使用平台数据源、SQL解析加签并且不允许查询数据库)\n      dataSourceSafe: false\n      # 低代码开发模式（dev:开发模式，prod:发布模式—关闭在线报表设计功能，分配角色admin、lowdeveloper可以放开限制）\n      lowCodeMode: dev\n    # 高德地图Api配置(v2.1.3+ BI新增高德地图)\n    gao-de-api:\n      # 应用key\n      api-key: ??\n      # 应用秘钥\n      secret-key: ??\n  #xxl-job配置\n  xxljob:\n    enabled: false\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n    appname: ${spring.application.name}\n    accessToken: ''\n    address: jeecg-boot-xxljob:30007\n    ip: jeecg-boot-xxljob\n    port: 30007\n    logPath: logs/jeecg/job/jobhandler/\n    logRetentionDays: 30\n  #分布式锁配置\n  redisson:\n    address: jeecg-boot-redis:6379\n    password:\n    type: STANDALONE\n    enabled: true\n  # 百度开放API配置\n  baidu-api:\n    app-id: ??\n    api-key: ??\n    secret-key: ??\n#cas单点登录\ncas:\n  prefixUrl: http://cas.example.org:8443/cas\n#Mybatis输出sql日志\nlogging:\n  level:\n    org.springframework.context.support.PostProcessorRegistrationDelegate: error\n    org.flywaydb: debug\n    org.jeecg.modules.system.mapper: info\n#swagger\nknife4j:\n  #开启增强配置\n  enable: true\n  #开启生产环境屏蔽\n  production: false\n  basic:\n    enable: false\n    username: jeecg\n    password: jeecg1314\n#第三方登录\njustauth:\n  enabled: true\n  type:\n    GITHUB:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/github/callback\n    WECHAT_ENTERPRISE:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_enterprise/callback\n      agent-id: ??\n    DINGTALK:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/dingtalk/callback\n    WECHAT_OPEN:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_open/callback\n  cache:\n    type: default\n    prefix: 'demo::'\n    timeout: 1h"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-kingbase8.yml",
    "content": "server:\n  port: 8080\n  tomcat:\n    max-swallow-size: -1\n  error:\n    include-exception: true\n    include-stacktrace: ALWAYS\n    include-message: ALWAYS\n  servlet:\n    context-path: /jeecg-boot\n  compression:\n    enabled: true\n    min-response-size: 1024\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\n\nmanagement:\n  endpoints:\n    web:\n      exposure:\n        include: metrics,httpexchanges,jeecghttptrace\n\nspring:\n  flyway:\n    # 是否启用flyway\n    enabled: false\n    # 迁移sql脚本存放路径\n    locations: classpath:flyway/sql/mysql\n    # 是否关闭要清除已有库下的表功能,生产环境必须为true,否则会删库，非常重要！！！\n    clean-disabled: true\n  servlet:\n    multipart:\n      max-file-size: 10MB\n      max-request-size: 10MB\n  mail:\n    # 定时任务发送邮件\n    timeJobSend: false\n    host: smtp.163.com\n    username: jeecgos@163.com\n    password: ??\n    properties:\n      mail.smtp.timeout: 10000  # 连接超时（毫秒）\n      mail.smtp.connectiontimeout: 10000  # 连接超时（毫秒）\n      mail.smtp.writetimeout: 10000  # 写入超时（毫秒）\n      mail.smtp.auth: true\n      smtp.ssl.enable: true\n  ## quartz定时任务,采用数据库方式\n  quartz:\n    job-store-type: jdbc\n    jdbc:\n      initialize-schema: never\n    #定时任务启动开关，true-开  false-关\n    auto-startup: true\n    #延迟1秒启动定时任务\n    startup-delay: 1s\n    #启动时更新己存在的Job\n    overwrite-existing-jobs: true\n    properties:\n      org:\n        quartz:\n          scheduler:\n            instanceName: MyScheduler\n            instanceId: AUTO\n          jobStore:\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n            tablePrefix: QRTZ_\n            isClustered: true\n            misfireThreshold: 12000\n            clusterCheckinInterval: 15000\n          threadPool:\n            class: org.quartz.simpl.SimpleThreadPool\n            threadCount: 10\n            threadPriority: 5\n            threadsInheritContextClassLoaderOfInitializingThread: true\n  #json 时间戳统一转换\n  jackson:\n    date-format: yyyy-MM-dd HH:mm:ss\n    time-zone: GMT+8\n  jpa:\n    open-in-view: false\n    properties:\n      hibernate:\n        dialect: org.hibernate.dialect.PostgreSQLDialect\n  aop:\n    proxy-target-class: true\n  #配置freemarker\n  freemarker:\n    # 设置模板后缀名\n    suffix: .ftl\n    # 设置文档类型\n    content-type: text/html\n    # 设置页面编码格式\n    charset: UTF-8\n    # 设置页面缓存\n    cache: false\n    prefer-file-system-access: false\n    # 设置ftl文件路径\n    template-loader-path:\n      - classpath:/templates\n    template_update_delay: 0\n  # 设置静态文件路径，js,css等\n  mvc:\n    static-path-pattern: /**\n    #Spring Boot 2.6+后映射匹配的默认策略已从AntPathMatcher更改为PathPatternParser,需要手动指定为ant-path-matcher\n    pathmatch:\n      matching-strategy: ant_path_matcher\n  resource:\n    static-locations: classpath:/static/,classpath:/public/\n  autoconfigure:\n    exclude:\n      - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\n  datasource:\n    druid:\n      stat-view-servlet:\n        enabled: true\n        loginUsername: admin\n        loginPassword: 123456\n        allow:\n      web-stat-filter:\n        enabled: true\n    dynamic:\n      druid: # 全局druid参数，绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n        # 连接池的配置信息\n        # 初始化大小，最小，最大\n        initial-size: 5\n        min-idle: 5\n        maxActive: 20\n        # 配置获取连接等待超时的时间\n        maxWait: 60000\n        # 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒\n        timeBetweenEvictionRunsMillis: 60000\n        # 配置一个连接在池中最小生存的时间，单位是毫秒\n        minEvictableIdleTimeMillis: 300000\n        validationQuery: SELECT 1\n        #testWhileIdle: true\n        testOnBorrow: false\n        testOnReturn: false\n        # 打开PSCache，并且指定每个连接上PSCache的大小\n        poolPreparedStatements: true\n        maxPoolPreparedStatementPerConnectionSize: 20\n        # 配置监控统计拦截的filters，去掉后监控界面sql无法统计，'wall'用于防火墙\n        filters: stat,slf4j\n        # 打开mergeSql功能；慢SQL记录\n        stat:\n          merge-sql: true\n          slow-sql-millis: 5000\n      datasource:\n        master:\n          url: jdbc:kingbase8://127.0.0.1:4321/test\n          username: system\n          password: system\n          driver-class-name: com.kingbase8.Driver\n  #redis 配置\n  data:\n    redis:\n      database: 0\n      host: 127.0.0.1\n      port: 6379\n      password: ''\n#mybatis plus 设置\nmybatis-plus:\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n  global-config:\n    # 关闭MP3.0自带的banner\n    banner: false\n    db-config:\n      #主键类型  0:\"数据库ID自增\",1:\"该类型为未设置主键类型\", 2:\"用户输入ID\",3:\"全局唯一ID (数字类型唯一ID)\", 4:\"全局唯一ID UUID\",5:\"字符串全局唯一ID (idWorker 的字符串表示)\";\n      id-type: ASSIGN_ID\n      # 默认数据库表下划线命名\n      table-underline: true\n  configuration:\n    # 这个配置会将执行的sql打印出来，在开发或测试的时候可以用\n    #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n    # 返回类型为Map,显示null对应的字段\n    call-setters-on-nulls: true\n#jeecg专用配置\nminidao:\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n  # AI集成\n  ai-chat:\n    enabled: true\n    model: deepseek-chat\n    apiKey: ??\n    apiHost: https://api.deepseek.com\n    timeout: 60\n  # AIRag向量库\n  ai-rag:\n    embed-store:\n      host: 127.0.0.1\n      port: 5432\n      database: postgres\n      user: postgres\n      password: postgres\n      table: embeddings\n  #  Unipush配置 云函数调用 URL 化地址\n  unicloud:\n    pushUrl:\n  # 平台上线安全配置\n  firewall:\n    # 数据源安全 (开启后，Online报表和图表的数据源为必填)\n    dataSourceSafe: false\n    # 低代码模式（dev:开发模式，prod:发布模式——关闭所有在线开发配置能力）\n    lowCodeMode: dev\n  # 签名密钥串(前后端要一致，正式发布请自行修改)\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n  #签名拦截接口\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys,/sys/sendChangePwdSms,/sys/user/sendChangePhoneSms,/sys/sms,/desform/api/sendVerifyCode\n  # 本地：local、Minio：minio、阿里云：alioss\n  uploadType: local\n  # 前端访问地址\n  domainUrl:\n    pc: http://localhost:3100\n    app: http://localhost:8051\n  path:\n    #文件上传根目录 设置\n    upload: /opt/upFiles\n    #webapp文件路径\n    webapp: /opt/webapp\n  shiro:\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/bigscreen/category/**,/bigscreen/visual/**,/bigscreen/map/**,/jmreport/bigscreen2/**\n  #阿里云oss存储和大鱼短信秘钥配置\n  oss:\n    accessKey: ??\n    secretKey: ??\n    endpoint: oss-cn-beijing.aliyuncs.com\n    bucketName: jeecgdev\n    # 短信模板\n    sms-template:\n      # 签名\n      signature:\n      # 模板code\n      templateCode:\n        # 登录短信、忘记密码模板编码\n        SMS_175435174:\n        # 修改密码短信模板编码\n        SMS_465391221:\n        # 注册账号短信模板编码\n        SMS_175430166:\n  # 在线预览文件服务器地址配置\n  file-view-domain: http://fileview.jeecg.com\n  # minio文件上传\n  minio:\n    minio_url: http://minio.jeecg.com\n    minio_name: ??\n    minio_pass: ??\n    bucketName: otatest\n  #大屏报表参数设置\n  jmreport:\n    #多租户模式，默认值为空(created:按照创建人隔离、tenant:按照租户隔离) (v1.6.2+ 新增)\n    saasMode:\n    # 平台上线安全配置(v1.6.2+ 新增)\n    firewall:\n      # 数据源安全 (开启后，不允许使用平台数据源、SQL解析加签并且不允许查询数据库)\n      dataSourceSafe: false\n      # 低代码开发模式（dev:开发模式，prod:发布模式—关闭在线报表设计功能，分配角色admin、lowdeveloper可以放开限制）\n      lowCodeMode: dev\n    # 高德地图Api配置(v2.1.3+ BI新增高德地图)\n    gao-de-api:\n      # 应用key\n      api-key: ??\n      # 应用秘钥\n      secret-key: ??\n  #xxl-job配置\n  xxljob:\n    enabled: false\n    adminAddresses: http://127.0.0.1:9080/xxl-job-admin\n    appname: ${spring.application.name}\n    accessToken: ''\n    address: 127.0.0.1:30007\n    ip: 127.0.0.1\n    port: 30007\n    logPath: logs/jeecg/job/jobhandler/\n    logRetentionDays: 30\n  #分布式锁配置\n  redisson:\n    address: 127.0.0.1:6379\n    password:\n    type: STANDALONE\n    enabled: true\n#cas单点登录\ncas:\n  prefixUrl: http://cas.example.org:8443/cas\n#Mybatis输出sql日志\nlogging:\n  level:\n    org.springframework.context.support.PostProcessorRegistrationDelegate: error\n    org.flywaydb: debug\n    org.jeecg.modules.system.mapper: info\n#swagger\nknife4j:\n  #开启增强配置\n  enable: true\n  #开启生产环境屏蔽\n  production: false\n  basic:\n    enable: false\n    username: jeecg\n    password: jeecg1314\n#第三方登录\njustauth:\n  enabled: true\n  type:\n    GITHUB:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/github/callback\n    WECHAT_ENTERPRISE:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_enterprise/callback\n      agent-id: ??\n    DINGTALK:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/dingtalk/callback\n    WECHAT_OPEN:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_open/callback\n  cache:\n    type: default\n    prefix: 'demo::'\n    timeout: 1h\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-oracle.yml",
    "content": "server:\n  port: 8080\n  tomcat:\n    max-swallow-size: -1\n  error:\n    include-exception: true\n    include-stacktrace: ALWAYS\n    include-message: ALWAYS\n  servlet:\n    context-path: /jeecg-boot\n  compression:\n    enabled: true\n    min-response-size: 1024\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\n\nmanagement:\n  endpoints:\n    web:\n      exposure:\n        include: metrics,httpexchanges,jeecghttptrace\n\nspring:\n  flyway:\n    # 是否启用flyway\n    enabled: false\n    # 是否关闭要清除已有库下的表功能,生产环境必须为true,否则会删库，非常重要！！！\n    clean-disabled: true\n  servlet:\n    multipart:\n      max-file-size: 10MB\n      max-request-size: 10MB\n  mail:\n    # 定时任务发送邮件\n    timeJobSend: false\n    host: smtp.163.com\n    username: jeecgos@163.com\n    password: ??\n    properties:\n      mail.smtp.timeout: 10000  # 连接超时（毫秒）\n      mail.smtp.connectiontimeout: 10000  # 连接超时（毫秒）\n      mail.smtp.writetimeout: 10000  # 写入超时（毫秒）\n      mail.smtp.auth: true\n      smtp.ssl.enable: true\n  ## quartz定时任务,采用数据库方式\n  quartz:\n    job-store-type: jdbc\n    jdbc:\n      initialize-schema: embedded\n    #定时任务启动开关，true-开  false-关\n    auto-startup: true\n    #延迟1秒启动定时任务\n    startup-delay: 1s\n    #启动时更新己存在的Job\n    overwrite-existing-jobs: true\n    properties:\n      org:\n        quartz:\n          scheduler:\n            instanceName: MyScheduler\n            instanceId: AUTO\n          jobStore:\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n            tablePrefix: QRTZ_\n            isClustered: true\n            misfireThreshold: 12000\n            clusterCheckinInterval: 15000\n          threadPool:\n            class: org.quartz.simpl.SimpleThreadPool\n            threadCount: 10\n            threadPriority: 5\n            threadsInheritContextClassLoaderOfInitializingThread: true\n  #json 时间戳统一转换\n  jackson:\n    date-format: yyyy-MM-dd HH:mm:ss\n    time-zone: GMT+8\n  jpa:\n    open-in-view: false\n  aop:\n    proxy-target-class: true\n  #配置freemarker\n  freemarker:\n    # 设置模板后缀名\n    suffix: .ftl\n    # 设置文档类型\n    content-type: text/html\n    # 设置页面编码格式\n    charset: UTF-8\n    # 设置页面缓存\n    cache: false\n    prefer-file-system-access: false\n    # 设置ftl文件路径\n    template-loader-path:\n      - classpath:/templates\n    template_update_delay: 0\n  # 设置静态文件路径，js,css等\n  mvc:\n    static-path-pattern: /**\n    #Spring Boot 2.6+后映射匹配的默认策略已从AntPathMatcher更改为PathPatternParser,需要手动指定为ant-path-matcher\n    pathmatch:\n      matching-strategy: ant_path_matcher\n  resource:\n    static-locations: classpath:/static/,classpath:/public/\n  autoconfigure:\n    exclude:\n      - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\n  datasource:\n    druid:\n      stat-view-servlet:\n        enabled: true\n        loginUsername: admin\n        loginPassword: 123456\n        allow:\n      web-stat-filter:\n        enabled: true\n    dynamic:\n      druid: # 全局druid参数，绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n        # 连接池的配置信息\n        # 初始化大小，最小，最大\n        initial-size: 5\n        min-idle: 5\n        maxActive: 20\n        # 配置获取连接等待超时的时间\n        maxWait: 60000\n        # 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒\n        timeBetweenEvictionRunsMillis: 60000\n        # 配置一个连接在池中最小生存的时间，单位是毫秒\n        minEvictableIdleTimeMillis: 300000\n        validationQuery: SELECT 1 FROM DUAL\n        #testWhileIdle: true\n        testOnBorrow: false\n        testOnReturn: false\n        # 打开PSCache，并且指定每个连接上PSCache的大小\n        poolPreparedStatements: true\n        maxPoolPreparedStatementPerConnectionSize: 20\n        # 配置监控统计拦截的filters，去掉后监控界面sql无法统计，'wall'用于防火墙\n        filters: stat,wall,slf4j\n      datasource:\n        master:\n          url: jdbc:oracle:thin:@127.0.0.1:1521:helowin\n          username: jeecgboot\n          password: ???\n          driver-class-name: oracle.jdbc.OracleDriver\n  #          # 多数据源配置\n  #        multi-datasource1:\n  #          url: jdbc:sqlserver://192.168.1.199:1433;SelectMethod=cursor;DatabaseName=jeecgbootbpm\n  #          username: jeecgboot\n  #          password: jeecgboot@459\n  #          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver\n  #redis配置\n  data:\n    redis:\n      database: 0\n      host: 127.0.0.1\n      port: 6379\n      password: ''\n#mybatis plus 设置\nmybatis-plus:\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n  global-config:\n    # 关闭MP3.0自带的banner\n    banner: false\n    db-config:\n      #主键类型  0:\"数据库ID自增\",1:\"该类型为未设置主键类型\", 2:\"用户输入ID\",3:\"全局唯一ID (数字类型唯一ID)\", 4:\"全局唯一ID UUID\",5:\"字符串全局唯一ID (idWorker 的字符串表示)\";\n      id-type: ASSIGN_ID\n      # 默认数据库表下划线命名\n      table-underline: true\n  configuration:\n    # 这个配置会将执行的sql打印出来，在开发或测试的时候可以用\n    #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n    # 返回类型为Map,显示null对应的字段\n    call-setters-on-nulls: true\n#jeecg专用配置\nminidao:\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n  # AI集成\n  ai-chat:\n    enabled: true\n    model: deepseek-chat\n    apiKey: ??\n    apiHost: https://api.deepseek.com/v1\n    timeout: 60\n  # AIRag向量库\n  ai-rag:\n    embed-store:\n      host: 127.0.0.1\n      port: 5432\n      database: postgres\n      user: postgres\n      password: postgres\n      table: embeddings\n  # 平台上线安全配置\n  firewall:\n    # 数据源安全 (开启后，Online报表和图表的数据源为必填)\n    dataSourceSafe: false\n    # 低代码模式（dev:开发模式，prod:发布模式——关闭所有在线开发配置能力）\n    lowCodeMode: dev\n  # 签名密钥串(前后端要一致，正式发布请自行修改)\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n  #签名拦截接口\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys,/sys/sendChangePwdSms,/sys/user/sendChangePhoneSms,/sys/sms,/desform/api/sendVerifyCode\n  # 本地：local、Minio：minio、阿里云：alioss\n  uploadType: local\n  # 前端访问地址\n  domainUrl:\n    pc: http://localhost:3100\n    app: http://localhost:8051\n  path:\n    #文件上传根目录 设置\n    upload: /opt/upFiles\n    #webapp文件路径\n    webapp: /opt/webapp\n  shiro:\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/bigscreen/category/**,/bigscreen/visual/**,/bigscreen/map/**,/jmreport/bigscreen2/**\n  #阿里云oss存储和大鱼短信秘钥配置\n  oss:\n    accessKey: ??\n    secretKey: ??\n    endpoint: oss-cn-beijing.aliyuncs.com\n    bucketName: jeecgdev\n    # 短信模板\n    sms-template:\n      # 签名\n      signature:\n      # 模板code\n      templateCode:\n        # 登录短信、忘记密码模板编码\n        SMS_175435174:\n        # 修改密码短信模板编码\n        SMS_465391221:\n        # 注册账号短信模板编码\n        SMS_175430166:\n  # 在线预览文件服务器地址配置\n  file-view-domain: http://fileview.jeecg.com\n  # minio文件上传\n  minio:\n    minio_url: http://minio.jeecg.com\n    minio_name: ??\n    minio_pass: ??\n    bucketName: otatest\n  #大屏报表参数设置\n  jmreport:\n    #多租户模式，默认值为空(created:按照创建人隔离、tenant:按照租户隔离) (v1.6.2+ 新增)\n    saasMode:\n    # 平台上线安全配置(v1.6.2+ 新增)\n    firewall:\n      # 数据源安全 (开启后，不允许使用平台数据源、SQL解析加签并且不允许查询数据库)\n      dataSourceSafe: false\n      # 低代码开发模式（dev:开发模式，prod:发布模式—关闭在线报表设计功能，分配角色admin、lowdeveloper可以放开限制）\n      lowCodeMode: dev\n    # 高德地图Api配置(v2.1.3+ BI新增高德地图)\n    gao-de-api:\n      # 应用key\n      api-key: ??\n      # 应用秘钥\n      secret-key: ??\n  #xxl-job配置\n  xxljob:\n    enabled: false\n    adminAddresses: http://127.0.0.1:9080/xxl-job-admin\n    appname: ${spring.application.name}\n    accessToken: ''\n    address: 127.0.0.1:30007\n    ip: 127.0.0.1\n    port: 30007\n    logPath: logs/jeecg/job/jobhandler/\n    logRetentionDays: 30\n  #分布式锁配置\n  redisson:\n    address: 127.0.0.1:6379\n    password:\n    type: STANDALONE\n    enabled: true\n  # 百度开放API配置\n  baidu-api:\n    app-id: ??\n    api-key: ??\n    secret-key: ??\n#cas单点登录\ncas:\n  prefixUrl: http://cas.example.org:8443/cas\n#Mybatis输出sql日志\nlogging:\n  level:\n    org.springframework.context.support.PostProcessorRegistrationDelegate: error\n    org.flywaydb: debug\n    org.jeecg.modules.system.mapper: info\n#swagger\nknife4j:\n  #开启增强配置\n  enable: true\n  #开启生产环境屏蔽\n  production: false\n  basic:\n    enable: false\n    username: jeecg\n    password: jeecg1314\n#第三方登录\njustauth:\n  enabled: true\n  type:\n    GITHUB:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/github/callback\n    WECHAT_ENTERPRISE:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_enterprise/callback\n      agent-id: ??\n    DINGTALK:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/dingtalk/callback\n    WECHAT_OPEN:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_open/callback\n  cache:\n    type: default\n    prefix: 'demo::'\n    timeout: 1h"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-postgresql.yml",
    "content": "server:\n  port: 8080\n  tomcat:\n    max-swallow-size: -1\n  error:\n    include-exception: true\n    include-stacktrace: ALWAYS\n    include-message: ALWAYS\n  servlet:\n    context-path: /jeecg-boot\n  compression:\n    enabled: true\n    min-response-size: 1024\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\n\nmanagement:\n  endpoints:\n    web:\n      exposure:\n        include: metrics,httpexchanges,jeecghttptrace\n\nspring:\n  flyway:\n    # 是否启用flyway\n    enabled: true\n    # 是否关闭要清除已有库下的表功能,生产环境必须为true,否则会删库，非常重要！！！\n    clean-disabled: true\n  servlet:\n    multipart:\n      max-file-size: 10MB\n      max-request-size: 10MB\n  mail:\n    # 定时任务发送邮件\n    timeJobSend: false\n    host: smtp.163.com\n    username: jeecgos@163.com\n    password: ??\n    properties:\n      mail.smtp.timeout: 10000  # 连接超时（毫秒）\n      mail.smtp.connectiontimeout: 10000  # 连接超时（毫秒）\n      mail.smtp.writetimeout: 10000  # 写入超时（毫秒）\n      mail.smtp.auth: true\n      smtp.ssl.enable: true\n      mail.debug: true  # 启用调试模式(查看详细日志)\n  ## quartz定时任务,采用数据库方式\n  quartz:\n    job-store-type: jdbc\n    jdbc:\n      initialize-schema: embedded\n    #定时任务启动开关，true-开  false-关\n    auto-startup: true\n    #延迟1秒启动定时任务\n    startup-delay: 1s\n    #启动时更新己存在的Job\n    overwrite-existing-jobs: true\n    properties:\n      org:\n        quartz:\n          scheduler:\n            instanceName: MyScheduler\n            instanceId: AUTO\n          jobStore:\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n            tablePrefix: QRTZ_\n            isClustered: true\n            misfireThreshold: 12000\n            clusterCheckinInterval: 15000\n          threadPool:\n            class: org.quartz.simpl.SimpleThreadPool\n            threadCount: 10\n            threadPriority: 5\n            threadsInheritContextClassLoaderOfInitializingThread: true\n  #json 时间戳统一转换\n  jackson:\n    date-format: yyyy-MM-dd HH:mm:ss\n    time-zone: GMT+8\n  jpa:\n    database-platform: org.hibernate.dialect.PostgreSQLDialect\n    properties:\n      hibernate:\n        temp:\n          use_jdbc_metadata_defaults: false\n    open-in-view: false\n  aop:\n    proxy-target-class: true\n  #配置freemarker\n  freemarker:\n    # 设置模板后缀名\n    suffix: .ftl\n    # 设置文档类型\n    content-type: text/html\n    # 设置页面编码格式\n    charset: UTF-8\n    # 设置页面缓存\n    cache: false\n    prefer-file-system-access: false\n    # 设置ftl文件路径\n    template-loader-path:\n      - classpath:/templates\n    template_update_delay: 0\n  # 设置静态文件路径，js,css等\n  mvc:\n    static-path-pattern: /**\n    #Spring Boot 2.6+后映射匹配的默认策略已从AntPathMatcher更改为PathPatternParser,需要手动指定为ant-path-matcher\n    pathmatch:\n      matching-strategy: ant_path_matcher\n  resource:\n    static-locations: classpath:/static/,classpath:/public/\n  autoconfigure:\n    exclude:\n      - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\n  datasource:\n    druid:\n      stat-view-servlet:\n        enabled: true\n        loginUsername: admin\n        loginPassword: 123456\n        allow:\n      web-stat-filter:\n        enabled: true\n    dynamic:\n      druid: # 全局druid参数，绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n        # 连接池的配置信息\n        # 初始化大小，最小，最大\n        initial-size: 5\n        min-idle: 5\n        maxActive: 1000\n        # 配置获取连接等待超时的时间\n        maxWait: 60000\n        # 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒\n        timeBetweenEvictionRunsMillis: 60000\n        # 配置一个连接在池中最小生存的时间，单位是毫秒\n        minEvictableIdleTimeMillis: 300000\n        validationQuery: SELECT 1\n        testWhileIdle: true\n        testOnBorrow: false\n        testOnReturn: false\n        # 打开PSCache，并且指定每个连接上PSCache的大小\n        poolPreparedStatements: true\n        maxPoolPreparedStatementPerConnectionSize: 20\n        # 配置监控统计拦截的filters，去掉后监控界面sql无法统计，'wall'用于防火墙\n        filters: stat,slf4j\n        # 允许SELECT语句的WHERE子句是一个永真条件\n        wall:\n          selectWhereAlwayTrueCheck: false\n        # 打开mergeSql功能；慢SQL记录\n        stat:\n          merge-sql: false\n          slow-sql-millis: 5000\n      datasource:\n        master:\n          url: jdbc:postgresql://127.0.0.1:5432/postgres?stringtype=unspecified\n          username: admin\n          password: ????\n          driver-class-name: org.postgresql.Driver\n          # 多数据源配置\n          #multi-datasource1:\n          #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n          #username: root\n          #password: root\n          #driver-class-name: com.mysql.cj.jdbc.Driver\n  #redis 配置\n  data:\n    redis:\n      database: 0\n      host: 127.0.0.1\n      port: 6379\n      password:\n#mybatis plus 设置\nmybatis-plus:\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n  global-config:\n    # 关闭MP3.0自带的banner\n    banner: false\n    db-config:\n      #主键类型  0:\"数据库ID自增\",1:\"该类型为未设置主键类型\", 2:\"用户输入ID\",3:\"全局唯一ID (数字类型唯一ID)\", 4:\"全局唯一ID UUID\",5:\"字符串全局唯一ID (idWorker 的字符串表示)\";\n      id-type: ASSIGN_ID\n      # 默认数据库表下划线命名\n      table-underline: true\n  configuration:\n    # 这个配置会将执行的sql打印出来，在开发或测试的时候可以用\n    #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n    # 返回类型为Map,显示null对应的字段\n    call-setters-on-nulls: true\n#jeecg专用配置\nminidao:\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n  # AI集成\n  ai-chat:\n    enabled: true\n    model: deepseek-chat\n    apiKey: ??\n    apiHost: https://api.deepseek.com/v1\n    timeout: 60\n  # AIRag向量库\n  ai-rag:\n    embed-store:\n      host: 127.0.0.1\n      port: 5432\n      database: postgres\n      user: postgres\n      password: postgres\n      table: embeddings\n  # 平台上线安全配置\n  firewall:\n    # 数据源安全 (开启后，Online报表和图表的数据源为必填)\n    dataSourceSafe: false\n    # 低代码模式（dev:开发模式，prod:发布模式——关闭所有在线开发配置能力）\n    lowCodeMode: dev\n  # 签名密钥串(前后端要一致，正式发布请自行修改)\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n  #签名拦截接口\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys,/sys/sendChangePwdSms,/sys/user/sendChangePhoneSms,/sys/sms,/desform/api/sendVerifyCode\n  # 本地：local、Minio：minio、阿里云：alioss\n  uploadType: local\n  # 前端访问地址\n  domainUrl:\n    pc: http://localhost:3100\n    app: http://localhost:8051\n  path:\n    #文件上传根目录 设置\n    upload: /opt/upFiles\n    #webapp文件路径\n    webapp: /opt/webapp\n  shiro:\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/bigscreen/category/**,/bigscreen/visual/**,/bigscreen/map/**,/jmreport/bigscreen2/**\n  #阿里云oss存储和大鱼短信秘钥配置\n  oss:\n    accessKey: ??\n    secretKey: ??\n    endpoint: oss-cn-beijing.aliyuncs.com\n    bucketName: jeecgdev\n    # 短信模板\n    sms-template:\n      # 签名\n      signature:\n      # 模板code\n      templateCode:\n        # 登录短信、忘记密码模板编码\n        SMS_175435174:\n        # 修改密码短信模板编码\n        SMS_465391221:\n        # 注册账号短信模板编码\n        SMS_175430166:\n  # 在线预览文件服务器地址配置\n  file-view-domain: http://fileview.jeecg.com\n  # minio文件上传\n  minio:\n    minio_url: http://minio.jeecg.com\n    minio_name: ??\n    minio_pass: ??\n    bucketName: otatest\n  #大屏报表参数设置\n  jmreport:\n    #多租户模式，默认值为空(created:按照创建人隔离、tenant:按照租户隔离) (v1.6.2+ 新增)\n    saasMode:\n    # 平台上线安全配置(v1.6.2+ 新增)\n    firewall:\n      # 数据源安全 (开启后，不允许使用平台数据源、SQL解析加签并且不允许查询数据库)\n      dataSourceSafe: false\n      # 低代码开发模式（dev:开发模式，prod:发布模式—关闭在线报表设计功能，分配角色admin、lowdeveloper可以放开限制）\n      lowCodeMode: dev\n    # 高德地图Api配置(v2.1.3+ BI新增高德地图)\n    gao-de-api:\n      # 应用key\n      api-key: ??\n      # 应用秘钥\n      secret-key: ??\n  #xxl-job配置\n  xxljob:\n    enabled: false\n    adminAddresses: http://127.0.0.1:9080/xxl-job-admin\n    appname: ${spring.application.name}\n    accessToken: ''\n    address: 127.0.0.1:30007\n    ip: 127.0.0.1\n    port: 30007\n    logPath: logs/jeecg/job/jobhandler/\n    logRetentionDays: 30\n  #分布式锁配置\n  redisson:\n    address: 127.0.0.1:6379\n    password:\n    type: STANDALONE\n    enabled: true\n  # 百度开放API配置\n  baidu-api:\n    app-id: ??\n    api-key: ??\n    secret-key: ??\n#cas单点登录\ncas:\n  prefixUrl: http://cas.example.org:8443/cas\n#Mybatis输出sql日志\nlogging:\n  level:\n    org.springframework.context.support.PostProcessorRegistrationDelegate: error\n    org.flywaydb: debug\n    org.jeecg.modules.system.mapper: info\n#swagger\nknife4j:\n  #开启增强配置\n  enable: true\n  #开启生产环境屏蔽\n  production: false\n  basic:\n    enable: false\n    username: jeecg\n    password: jeecg1314\n#第三方登录\njustauth:\n  enabled: true\n  type:\n    GITHUB:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/github/callback\n    WECHAT_ENTERPRISE:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_enterprise/callback\n      agent-id: ??\n    DINGTALK:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/dingtalk/callback\n    WECHAT_OPEN:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_open/callback\n  cache:\n    type: default\n    prefix: 'demo::'\n    timeout: 1h\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-prod.yml",
    "content": "server:\n  port: 8080\n  tomcat:\n    max-swallow-size: -1\n  error:\n    include-exception: true\n    include-stacktrace: ALWAYS\n    include-message: ALWAYS\n  servlet:\n    context-path: /jeecg-boot\n  compression:\n    enabled: true\n    min-response-size: 1024\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\n\nmanagement:\n  endpoints:\n    web:\n      exposure:\n        include: metrics,httpexchanges,jeecghttptrace\n\nspring:\n  flyway:\n    # 是否启用flyway\n    enabled: false\n    # 是否关闭要清除已有库下的表功能,生产环境必须为true,否则会删库，非常重要！！！\n    clean-disabled: true\n    # 迁移sql脚本存放路径\n    locations: classpath:flyway/sql/mysql\n  servlet:\n    multipart:\n      max-file-size: 10MB\n      max-request-size: 10MB\n  mail:\n    # 定时任务发送邮件\n    timeJobSend: false\n    host: smtp.163.com\n    username: jeecgos@163.com\n    password: ??\n    properties:\n      mail.smtp.auth: true\n      smtp.ssl.enable: true\n  ## quartz定时任务,采用数据库方式\n  quartz:\n    job-store-type: jdbc\n    jdbc:\n      initialize-schema: embedded\n    #定时任务开关，true-开  false-关\n    auto-startup: true\n    #延迟1秒启动定时任务\n    startup-delay: 1s\n    #启动时更新己存在的Job\n    overwrite-existing-jobs: true\n    properties:\n      org:\n        quartz:\n          scheduler:\n            instanceName: MyScheduler\n            instanceId: AUTO\n          jobStore:\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n            tablePrefix: QRTZ_\n            isClustered: true\n            misfireThreshold: 12000\n            clusterCheckinInterval: 15000\n          threadPool:\n            class: org.quartz.simpl.SimpleThreadPool\n            threadCount: 10\n            threadPriority: 5\n            threadsInheritContextClassLoaderOfInitializingThread: true\n  #json 时间戳统一转换\n  jackson:\n    date-format: yyyy-MM-dd HH:mm:ss\n    time-zone: GMT+8\n  jpa:\n    open-in-view: false\n  aop:\n    proxy-target-class: true\n  #配置freemarker\n  freemarker:\n    # 设置模板后缀名\n    suffix: .ftl\n    # 设置文档类型\n    content-type: text/html\n    # 设置页面编码格式\n    charset: UTF-8\n    # 设置页面缓存\n    cache: false\n    prefer-file-system-access: false\n    # 设置ftl文件路径\n    template-loader-path:\n      - classpath:/templates\n    template_update_delay: 0\n  # 设置静态文件路径，js,css等\n  mvc:\n    static-path-pattern: /**\n    #Spring Boot 2.6+后映射匹配的默认策略已从AntPathMatcher更改为PathPatternParser,需要手动指定为ant-path-matcher\n    pathmatch:\n      matching-strategy: ant_path_matcher\n  resource:\n    static-locations: classpath:/static/,classpath:/public/\n  autoconfigure:\n    exclude:\n      - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\n  datasource:\n    druid:\n      stat-view-servlet:\n        enabled: true\n        loginUsername: admin\n        loginPassword: 123456\n        allow:\n      web-stat-filter:\n        enabled: true\n    dynamic:\n      druid: # 全局druid参数，绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n        # 连接池的配置信息\n        # 初始化大小，最小，最大\n        initial-size: 5\n        min-idle: 5\n        maxActive: 1000\n        # 配置获取连接等待超时的时间\n        maxWait: 60000\n        # 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒\n        timeBetweenEvictionRunsMillis: 60000\n        # 配置一个连接在池中最小生存的时间，单位是毫秒\n        minEvictableIdleTimeMillis: 300000\n        validationQuery: SELECT 1 FROM DUAL\n        testWhileIdle: true\n        testOnBorrow: false\n        testOnReturn: false\n        # 打开PSCache，并且指定每个连接上PSCache的大小\n        poolPreparedStatements: true\n        maxPoolPreparedStatementPerConnectionSize: 20\n        # 配置监控统计拦截的filters，去掉后监控界面sql无法统计，'wall'用于防火墙\n        filters: stat,slf4j\n        # 允许SELECT语句的WHERE子句是一个永真条件\n        wall:\n          selectWhereAlwayTrueCheck: false\n        # 打开mergeSql功能；慢SQL记录\n        stat:\n          merge-sql: true\n          slow-sql-millis: 5000\n      datasource:\n        master:\n          url: jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n          username: root\n          password: root\n          driver-class-name: com.mysql.cj.jdbc.Driver\n          # 多数据源配置\n          #multi-datasource1:\n          #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n          #username: root\n          #password: root\n          #driver-class-name: com.mysql.cj.jdbc.Driver\n  #redis 配置\n  data:\n    redis:\n      database: 0\n      host: 127.0.0.1\n      port: 6379\n      password:\n#mybatis plus 设置\nmybatis-plus:\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n  global-config:\n    # 关闭MP3.0自带的banner\n    banner: false\n    db-config:\n      #主键类型  0:\"数据库ID自增\",1:\"该类型为未设置主键类型\", 2:\"用户输入ID\",3:\"全局唯一ID (数字类型唯一ID)\", 4:\"全局唯一ID UUID\",5:\"字符串全局唯一ID (idWorker 的字符串表示)\";\n      id-type: ASSIGN_ID\n      # 默认数据库表下划线命名\n      table-underline: true\n  configuration:\n    # 这个配置会将执行的sql打印出来，在开发或测试的时候可以用\n    #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n    # 返回类型为Map,显示null对应的字段\n    call-setters-on-nulls: true\n#jeecg专用配置\nminidao:\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n  # AI集成\n  ai-chat:\n    enabled: true\n    model: deepseek-chat\n    apiKey: ??\n    apiHost: https://api.deepseek.com\n    timeout: 60\n  # AIRag向量库\n  ai-rag:\n    # AI流程敏感节点(stdio=命令行节点, sql=SQL节点)\n    allow-sensitive-nodes: sql,stdio\n    embed-store:\n      host: 127.0.0.1\n      port: 5432\n      database: postgres\n      user: postgres\n      password: postgres\n      table: embeddings\n  #  Unipush配置 云函数调用 URL 化地址\n  unicloud:\n    pushUrl:\n  # 平台上线安全配置\n  firewall:\n    # 数据源安全 (开启后，Online报表和图表的数据源为必填)\n    dataSourceSafe: true\n    # 低代码模式（dev:开发模式，prod:发布模式——关闭所有在线开发配置能力）\n    lowCodeMode: prod\n    # 是否允许同一账号多地同时登录 （为 true 时允许一起登录, 为 false 时新登录挤掉旧登录）\n    is-concurrent: true\n  # 签名密钥串(前后端要一致，正式发布请自行修改)\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n  #签名拦截接口\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys,/sys/sendChangePwdSms,/sys/user/sendChangePhoneSms,/sys/sms,/desform/api/sendVerifyCode\n  # local\\minio\\alioss\n  uploadType: alioss\n  # 前端访问地址\n  domainUrl:\n    pc: http://localhost:3100\n    app: http://localhost:8051\n  path:\n    #文件上传根目录 设置\n    upload: /opt/jeecg-boot/upload\n    #webapp文件路径\n    webapp: /opt/jeecg-boot/webapp\n  shiro:\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/bigscreen/category/**,/bigscreen/visual/**,/bigscreen/map/**,/jmreport/bigscreen2/**,/api/getUserInfo\n  # 短信发送方式 aliyun阿里云短信 tencent腾讯云短信\n  smsSendType: aliyun\n  #阿里云oss存储和大鱼短信秘钥配置\n  oss:\n    accessKey: ??\n    secretKey: ??\n    endpoint: oss-cn-beijing.aliyuncs.com\n    bucketName: jeecgdev\n    staticDomain: https://static.jeecg.com\n    # 短信模板\n    sms-template:\n      # 签名\n      signature:\n      # 模板code\n      templateCode:\n        # 登录短信、忘记密码模板编码\n        SMS_175435174:\n        # 修改密码短信模板编码\n        SMS_465391221:\n        # 注册账号短信模板编码\n        SMS_175430166:\n        SMS_461885023:\n  #腾讯短信秘钥配置\n  tencent:\n    # 接入域名\n    endpoint: sms.tencentcloudapi.com\n    secretId: ??\n    secretKey: ??\n    # 应用ID\n    sdkAppId: ??\n    # 地域信息\n    region: ap-beijing\n  # 在线预览文件服务器地址配置\n  file-view-domain: http://fileview.jeecg.com\n  # minio文件上传\n  minio:\n    minio_url: http://minio.jeecg.com\n    minio_name: ??\n    minio_pass: ??\n    bucketName: otatest\n  #大屏报表参数设置\n  jmreport:\n    #多租户模式，默认值为空(created:按照创建人隔离、tenant:按照租户隔离) (v1.6.2+ 新增)\n    saasMode:\n    # 平台上线安全配置(v1.6.2+ 新增)\n    firewall:\n      # 数据源安全 (开启后，不允许使用平台数据源、SQL解析加签并且不允许查询数据库)\n      dataSourceSafe: true\n      # 低代码开发模式（dev:开发模式，prod:发布模式—关闭在线报表设计功能，分配角色admin、lowdeveloper可以放开限制）\n      lowCodeMode: prod\n    # 高德地图Api配置(v2.1.3+ BI新增高德地图)\n    gao-de-api:\n      # 应用key\n      api-key: ??\n      # 应用秘钥\n      secret-key: ??\n  #xxl-job配置\n  xxljob:\n    enabled: false\n    adminAddresses: http://127.0.0.1:9080/xxl-job-admin\n    appname: ${spring.application.name}\n    accessToken: ''\n    address: 127.0.0.1:30007\n    ip: 127.0.0.1\n    port: 30007\n    logPath: logs/jeecg/job/jobhandler/\n    logRetentionDays: 30\n  #分布式锁配置\n  redisson:\n    address: 127.0.0.1:6379\n    password:\n    type: STANDALONE\n    enabled: true\n  # 百度开放API配置\n  baidu-api:\n    app-id: ??\n    api-key: ??\n    secret-key: ??\n#cas单点登录\ncas:\n  prefixUrl: http://cas.example.org:8443/cas\n#Mybatis输出sql日志\nlogging:\n  level:\n    org.springframework.context.support.PostProcessorRegistrationDelegate: error\n    org.flywaydb: debug\n    org.jeecg.modules.system.mapper: info\n#swagger\nknife4j:\n  #开启增强配置\n  enable: true\n  #开启生产环境屏蔽\n  production: true\n  basic:\n    enable: true\n    username: jeecg\n    password: jeecg1314\n#第三方登录\njustauth:\n  enabled: true\n  type:\n    GITHUB:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/github/callback\n    WECHAT_ENTERPRISE:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_enterprise/callback\n      agent-id: ??\n    DINGTALK:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/dingtalk/callback\n    WECHAT_OPEN:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_open/callback\n  cache:\n    type: default\n    prefix: 'demo::'\n    timeout: 1h\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-sqlserver.yml",
    "content": "server:\n  port: 8080\n  tomcat:\n    max-swallow-size: -1\n  error:\n    include-exception: true\n    include-stacktrace: ALWAYS\n    include-message: ALWAYS\n  servlet:\n    context-path: /jeecg-boot\n  compression:\n    enabled: true\n    min-response-size: 1024\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\n\nmanagement:\n  endpoints:\n    web:\n      exposure:\n        include: metrics,httpexchanges,jeecghttptrace\n\nspring:\n  flyway:\n    # 是否启用flyway\n    enabled: false\n    # 是否关闭要清除已有库下的表功能,生产环境必须为true,否则会删库，非常重要！！！\n    clean-disabled: true\n  servlet:\n    multipart:\n      max-file-size: 10MB\n      max-request-size: 10MB\n  mail:\n    # 定时任务发送邮件\n    timeJobSend: false\n    host: smtp.163.com\n    username: jeecgos@163.com\n    password: ??\n    properties:\n      mail.smtp.timeout: 10000  # 连接超时（毫秒）\n      mail.smtp.connectiontimeout: 10000  # 连接超时（毫秒）\n      mail.smtp.writetimeout: 10000  # 写入超时（毫秒）\n      mail.smtp.auth: true\n      smtp.ssl.enable: true\n  ## quartz定时任务,采用数据库方式\n  quartz:\n    job-store-type: jdbc\n    jdbc:\n      initialize-schema: embedded\n    #定时任务启动开关，true-开  false-关\n    auto-startup: true\n    #延迟1秒启动定时任务\n    startup-delay: 1s\n    #启动时更新己存在的Job\n    overwrite-existing-jobs: true\n    properties:\n      org:\n        quartz:\n          scheduler:\n            instanceName: MyScheduler\n            instanceId: AUTO\n          jobStore:\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n            tablePrefix: QRTZ_\n            isClustered: true\n            misfireThreshold: 12000\n            clusterCheckinInterval: 15000\n          threadPool:\n            class: org.quartz.simpl.SimpleThreadPool\n            threadCount: 10\n            threadPriority: 5\n            threadsInheritContextClassLoaderOfInitializingThread: true\n  #json 时间戳统一转换\n  jackson:\n    date-format: yyyy-MM-dd HH:mm:ss\n    time-zone: GMT+8\n  jpa:\n    open-in-view: false\n  aop:\n    proxy-target-class: true\n  #配置freemarker\n  freemarker:\n    # 设置模板后缀名\n    suffix: .ftl\n    # 设置文档类型\n    content-type: text/html\n    # 设置页面编码格式\n    charset: UTF-8\n    # 设置页面缓存\n    cache: false\n    prefer-file-system-access: false\n    # 设置ftl文件路径\n    template-loader-path:\n      - classpath:/templates\n    template_update_delay: 0\n  # 设置静态文件路径，js,css等\n  mvc:\n    static-path-pattern: /**\n    #Spring Boot 2.6+后映射匹配的默认策略已从AntPathMatcher更改为PathPatternParser,需要手动指定为ant-path-matcher\n    pathmatch:\n      matching-strategy: ant_path_matcher\n  resource:\n    static-locations: classpath:/static/,classpath:/public/\n  autoconfigure:\n    exclude:\n      - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\n  datasource:\n    druid:\n      stat-view-servlet:\n        enabled: true\n        loginUsername: admin\n        loginPassword: 123456\n        allow:\n      web-stat-filter:\n        enabled: true\n    dynamic:\n      druid: # 全局druid参数，绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n        # 连接池的配置信息\n        # 初始化大小，最小，最大\n        initial-size: 5\n        min-idle: 5\n        maxActive: 20\n        # 配置获取连接等待超时的时间\n        maxWait: 60000\n        # 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒\n        timeBetweenEvictionRunsMillis: 60000\n        # 配置一个连接在池中最小生存的时间，单位是毫秒\n        minEvictableIdleTimeMillis: 300000\n        validationQuery: SELECT 1\n        testWhileIdle: true\n        testOnBorrow: false\n        testOnReturn: false\n        # 打开PSCache，并且指定每个连接上PSCache的大小\n        poolPreparedStatements: true\n        maxPoolPreparedStatementPerConnectionSize: 20\n        # 配置监控统计拦截的filters，去掉后监控界面sql无法统计，'wall'用于防火墙\n        filters: stat,slf4j\n        # 通过connectProperties属性来打开mergeSql功能；慢SQL记录\n      datasource:\n        master:\n          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver\n          url: jdbc:sqlserver://127.0.0.1:1433;SelectMethod=cursor;DatabaseName=jeecgboot\n          username: jeecgboot\n          password: ??\n  #redis配置\n  data:\n    redis:\n      database: 0\n      host: 127.0.0.1\n      port: 6379\n      password: ''\n#mybatis plus 设置\nmybatis-plus:\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n  global-config:\n    # 关闭MP3.0自带的banner\n    banner: false\n    db-config:\n      #主键类型  0:\"数据库ID自增\",1:\"该类型为未设置主键类型\", 2:\"用户输入ID\",3:\"全局唯一ID (数字类型唯一ID)\", 4:\"全局唯一ID UUID\",5:\"字符串全局唯一ID (idWorker 的字符串表示)\";\n      id-type: ASSIGN_ID\n      # 默认数据库表下划线命名\n      table-underline: true\n  configuration:\n    # 这个配置会将执行的sql打印出来，在开发或测试的时候可以用\n    #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n    # 返回类型为Map,显示null对应的字段\n    call-setters-on-nulls: true\n#jeecg专用配置\nminidao:\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n  # AI集成\n  ai-chat:\n    enabled: true\n    model: deepseek-chat\n    apiKey: ??\n    apiHost: https://api.deepseek.com/v1\n    timeout: 60\n  # AIRag向量库\n  ai-rag:\n    embed-store:\n      host: 127.0.0.1\n      port: 5432\n      database: postgres\n      user: postgres\n      password: postgres\n      table: embeddings\n  # 平台上线安全配置\n  firewall:\n    # 数据源安全 (开启后，Online报表和图表的数据源为必填)\n    dataSourceSafe: false\n    # 低代码模式（dev:开发模式，prod:发布模式——关闭所有在线开发配置能力）\n    lowCodeMode: dev\n  # 签名密钥串(前后端要一致，正式发布请自行修改)\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n  #签名拦截接口\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys,/sys/sendChangePwdSms,/sys/user/sendChangePhoneSms,/sys/sms,/desform/api/sendVerifyCode\n  # 本地：local、Minio：minio、阿里云：alioss\n  uploadType: local\n  # 前端访问地址\n  domainUrl:\n    pc: http://localhost:3100\n    app: http://localhost:8051\n  path:\n    #文件上传根目录 设置\n    upload: /opt/upFiles\n    #webapp文件路径\n    webapp: /opt/webapp\n  shiro:\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/bigscreen/category/**,/bigscreen/visual/**,/bigscreen/map/**,/jmreport/bigscreen2/**\n  #阿里云oss存储和大鱼短信秘钥配置\n  oss:\n    accessKey: ??\n    secretKey: ??\n    endpoint: oss-cn-beijing.aliyuncs.com\n    bucketName: jeecgdev\n    # 短信模板\n    sms-template:\n      # 签名\n      signature:\n      # 模板code\n      templateCode:\n        # 登录短信、忘记密码模板编码\n        SMS_175435174:\n        # 修改密码短信模板编码\n        SMS_465391221:\n        # 注册账号短信模板编码\n        SMS_175430166:\n  # 在线预览文件服务器地址配置\n  file-view-domain: http://fileview.jeecg.com\n  # minio文件上传\n  minio:\n    minio_url: http://minio.jeecg.com\n    minio_name: ??\n    minio_pass: ??\n    bucketName: otatest\n  #大屏报表参数设置\n  jmreport:\n    #多租户模式，默认值为空(created:按照创建人隔离、tenant:按照租户隔离) (v1.6.2+ 新增)\n    saasMode:\n    # 平台上线安全配置(v1.6.2+ 新增)\n    firewall:\n      # 数据源安全 (开启后，不允许使用平台数据源、SQL解析加签并且不允许查询数据库)\n      dataSourceSafe: false\n      # 低代码开发模式（dev:开发模式，prod:发布模式—关闭在线报表设计功能，分配角色admin、lowdeveloper可以放开限制）\n      lowCodeMode: dev\n    # 高德地图Api配置(v2.1.3+ BI新增高德地图)\n    gao-de-api:\n      # 应用key\n      api-key: ??\n      # 应用秘钥\n      secret-key: ??\n  #xxl-job配置\n  xxljob:\n    enabled: false\n    adminAddresses: http://127.0.0.1:9080/xxl-job-admin\n    appname: ${spring.application.name}\n    accessToken: ''\n    address: 127.0.0.1:30007\n    ip: 127.0.0.1\n    port: 30007\n    logPath: logs/jeecg/job/jobhandler/\n    logRetentionDays: 30\n  #分布式锁配置\n  redisson:\n    address: 127.0.0.1:6379\n    password:\n    type: STANDALONE\n    enabled: true\n  # 百度开放API配置\n  baidu-api:\n    app-id: ??\n    api-key: ??\n    secret-key: ??\n#cas单点登录\ncas:\n  prefixUrl: http://cas.example.org:8443/cas\n#Mybatis输出sql日志\nlogging:\n  level:\n    org.springframework.context.support.PostProcessorRegistrationDelegate: error\n    org.flywaydb: debug\n    org.jeecg.modules.system.mapper: info\n#swagger\nknife4j:\n  #开启增强配置\n  enable: true\n  #开启生产环境屏蔽\n  production: false\n  basic:\n    enable: false\n    username: jeecg\n    password: jeecg1314\n#第三方登录\njustauth:\n  enabled: true\n  type:\n    GITHUB:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/github/callback\n    WECHAT_ENTERPRISE:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_enterprise/callback\n      agent-id: ??\n    DINGTALK:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/dingtalk/callback\n    WECHAT_OPEN:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_open/callback\n  cache:\n    type: default\n    prefix: 'demo::'\n    timeout: 1h"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-test.yml",
    "content": "server:\n  port: 8080\n  tomcat:\n    max-swallow-size: -1\n  error:\n    include-exception: true\n    include-stacktrace: ALWAYS\n    include-message: ALWAYS\n  servlet:\n    context-path: /jeecg-boot\n  compression:\n    enabled: true\n    min-response-size: 1024\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\n\nmanagement:\n  endpoints:\n    web:\n      exposure:\n        include: metrics,httpexchanges,jeecghttptrace\n\nspring:\n  flyway:\n    # 是否启用flyway\n    enabled: true\n    # 迁移sql脚本存放路径\n    locations: classpath:flyway/sql/mysql\n    # 是否关闭要清除已有库下的表功能,生产环境必须为true,否则会删库，非常重要！！！\n    clean-disabled: true\n  servlet:\n    multipart:\n      max-file-size: 10MB\n      max-request-size: 10MB\n  mail:\n    # 定时任务发送邮件\n    timeJobSend: false\n    host: smtp.163.com\n    username: jeecgos@163.com\n    password: ??\n    properties:\n      mail.smtp.auth: true\n      smtp.ssl.enable: true\n      mail.debug: true  # 启用调试模式(查看详细日志)\n  ## quartz定时任务,采用数据库方式\n  quartz:\n    job-store-type: jdbc\n    jdbc:\n      initialize-schema: embedded\n    #定时任务启动开关，true-开  false-关\n    auto-startup: true\n    #延迟1秒启动定时任务\n    startup-delay: 1s\n    #启动时更新己存在的Job\n    overwrite-existing-jobs: true\n    properties:\n      org:\n        quartz:\n          scheduler:\n            instanceName: MyScheduler\n            instanceId: AUTO\n          jobStore:\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n            tablePrefix: QRTZ_\n            isClustered: true\n            misfireThreshold: 12000\n            clusterCheckinInterval: 15000\n          threadPool:\n            class: org.quartz.simpl.SimpleThreadPool\n            threadCount: 10\n            threadPriority: 5\n            threadsInheritContextClassLoaderOfInitializingThread: true\n  #json 时间戳统一转换\n  jackson:\n    date-format: yyyy-MM-dd HH:mm:ss\n    time-zone: GMT+8\n  aop:\n    proxy-target-class: true\n  jpa:\n    open-in-view: false\n  #配置freemarker\n  freemarker:\n    # 设置模板后缀名\n    suffix: .ftl\n    # 设置文档类型\n    content-type: text/html\n    # 设置页面编码格式\n    charset: UTF-8\n    # 设置页面缓存\n    cache: false\n    prefer-file-system-access: false\n    # 设置ftl文件路径\n    template-loader-path:\n      - classpath:/templates\n    template_update_delay: 0\n  # 设置静态文件路径，js,css等\n  mvc:\n    static-path-pattern: /**\n    #Spring Boot 2.6+后映射匹配的默认策略已从AntPathMatcher更改为PathPatternParser,需要手动指定为ant-path-matcher\n    pathmatch:\n      matching-strategy: ant_path_matcher\n  resource:\n    static-locations: classpath:/static/,classpath:/public/\n  autoconfigure:\n    exclude:\n      - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\n  datasource:\n    druid:\n      stat-view-servlet:\n        enabled: true\n        loginUsername: admin\n        loginPassword: 123456\n        allow:\n      web-stat-filter:\n        enabled: true\n    dynamic:\n      druid: # 全局druid参数，绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n        # 连接池的配置信息\n        # 初始化大小，最小，最大\n        initial-size: 5\n        min-idle: 5\n        maxActive: 1000\n        # 配置获取连接等待超时的时间\n        maxWait: 60000\n        # 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒\n        timeBetweenEvictionRunsMillis: 60000\n        # 配置一个连接在池中最小生存的时间，单位是毫秒\n        minEvictableIdleTimeMillis: 300000\n        validationQuery: SELECT 1 FROM DUAL\n        testWhileIdle: true\n        testOnBorrow: false\n        testOnReturn: false\n        # 打开PSCache，并且指定每个连接上PSCache的大小\n        poolPreparedStatements: true\n        maxPoolPreparedStatementPerConnectionSize: 20\n        # 配置监控统计拦截的filters，去掉后监控界面sql无法统计，'wall'用于防火墙\n        filters: stat,slf4j\n        # 允许SELECT语句的WHERE子句是一个永真条件\n        wall:\n          selectWhereAlwayTrueCheck: false\n        # 打开mergeSql功能；慢SQL记录\n        stat:\n          merge-sql: true\n          slow-sql-millis: 5000\n      datasource:\n        master:\n          url: jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n          username: root\n          password: root\n          driver-class-name: com.mysql.cj.jdbc.Driver\n          # 多数据源配置\n          #multi-datasource1:\n          #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n          #username: root\n          #password: root\n          #driver-class-name: com.mysql.cj.jdbc.Driver\n  #redis 配置\n  data:\n    redis:\n      database: 0\n      host: 127.0.0.1\n      port: 6379\n      password: ''\n#mybatis plus 设置\nmybatis-plus:\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n  global-config:\n    # 关闭MP3.0自带的banner\n    banner: false\n    db-config:\n      #主键类型\n      id-type: ASSIGN_ID\n      # 默认数据库表下划线命名\n      table-underline: true\n  configuration:\n    # 这个配置会将执行的sql打印出来，在开发或测试的时候可以用\n    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n    # 返回类型为Map,显示null对应的字段\n    call-setters-on-nulls: true\n#jeecg专用配置\nminidao:\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n  # AI集成\n  ai-chat:\n    enabled: true\n    model: deepseek-chat\n    apiKey: ??\n    apiHost: https://api.deepseek.com\n    timeout: 60\n  # AIRag向量库\n  ai-rag:\n    # AI流程敏感节点(stdio=命令行节点, sql=SQL节点)\n    allow-sensitive-nodes: sql,stdio\n    embed-store:\n      host: 127.0.0.1\n      port: 5432\n      database: postgres\n      user: postgres\n      password: postgres\n      table: embeddings\n  #  Unipush配置 云函数调用 URL 化地址\n  unicloud:\n    pushUrl:\n  # 平台上线安全配置\n  firewall:\n    # 数据源安全 (开启后，Online报表和图表的数据源为必填)\n    dataSourceSafe: false\n    # 低代码模式（dev:开发模式，prod:发布模式——关闭所有在线开发配置能力）\n    lowCodeMode: dev\n    # 是否允许同一账号多地同时登录 （为 true 时允许一起登录, 为 false 时新登录挤掉旧登录）\n    is-concurrent: true\n  # 签名密钥串(前后端要一致，正式发布请自行修改)\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n  #签名拦截接口\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys,/sys/sendChangePwdSms,/sys/user/sendChangePhoneSms,/sys/sms,/desform/api/sendVerifyCode\n  # local\\minio\\alioss\n  uploadType: local\n  # 前端访问地址\n  domainUrl:\n    pc: http://localhost:3100\n    app: http://localhost:8051\n  path:\n    #文件上传根目录 设置\n    upload: D://opt//upFiles\n    #webapp文件路径\n    webapp: D://opt//webapp\n  shiro:\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/bigscreen/category/**,/bigscreen/visual/**,/bigscreen/map/**,/jmreport/bigscreen2/**\n  # 短信发送方式 aliyun阿里云短信 tencent腾讯云短信\n  smsSendType: aliyun\n  #阿里云oss存储和大鱼短信秘钥配置\n  oss:\n    accessKey: ??\n    secretKey: ??\n    endpoint: oss-cn-beijing.aliyuncs.com\n    bucketName: jeecgdev\n    staticDomain: https://static.jeecg.com\n    # 短信模板\n    sms-template:\n      # 签名\n      signature:\n      # 模板code\n      templateCode:\n        # 登录短信、忘记密码模板编码\n        SMS_175435174:\n        # 修改密码短信模板编码\n        SMS_465391221:\n        # 注册账号短信模板编码\n        SMS_175430166:\n  #腾讯短信秘钥配置\n  tencent:\n    # 接入域名\n    endpoint: sms.tencentcloudapi.com\n    secretId: ??\n    secretKey: ??\n    # 应用ID\n    sdkAppId: ??\n    # 地域信息\n    region: ap-beijing\n  # 在线预览文件服务器地址配置\n  file-view-domain: http://127.0.0.1:8012\n  # minio文件上传\n  minio:\n    minio_url: http://minio.jeecg.com\n    minio_name: ??\n    minio_pass: ??\n    bucketName: ??\n  #大屏报表参数设置\n  jmreport:\n    #多租户模式，默认值为空(created:按照创建人隔离、tenant:按照租户隔离) (v1.6.2+ 新增)\n    saasMode: \n    # 平台上线安全配置(v1.6.2+ 新增)\n    firewall:\n      # 数据源安全 (开启后，不允许使用平台数据源、SQL解析加签并且不允许查询数据库)\n      dataSourceSafe: true\n      # 低代码开发模式（dev:开发模式，prod:发布模式—关闭在线报表设计功能，分配角色admin、lowdeveloper可以放开限制）\n      lowCodeMode: prod\n    # 高德地图Api配置(v2.1.3+ BI新增高德地图)\n    gao-de-api:\n      # 应用key\n      api-key: ??\n      # 应用秘钥\n      secret-key: ??\n  #xxl-job配置\n  xxljob:\n    enabled: false\n    adminAddresses: http://127.0.0.1:9080/xxl-job-admin\n    appname: ${spring.application.name}\n    accessToken: ''\n    address: 127.0.0.1:30007\n    ip: 127.0.0.1\n    port: 30007\n    logPath: logs/jeecg/job/jobhandler/\n    logRetentionDays: 30\n  #分布式锁配置\n  redisson:\n    address: 127.0.0.1:6379\n    password:\n    type: STANDALONE\n    enabled: true\n  # 百度开放API配置\n  baidu-api:\n    app-id: ??\n    api-key: ??\n    secret-key: ??\n#Mybatis输出sql日志\nlogging:\n  level:\n    org.springframework.context.support.PostProcessorRegistrationDelegate: error\n    org.flywaydb: debug\n    org.jeecg.modules.system.mapper: info\n#cas单点登录\ncas:\n  prefixUrl: http://cas.example.org:8443/cas\n#swagger\nknife4j:\n  #开启增强配置\n  enable: true\n  #开启生产环境屏蔽\n  production: false\n  basic:\n    enable: true\n    username: jeecg\n    password: jeecg1314\n#第三方登录\njustauth:\n  enabled: true\n  type:\n    GITHUB:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/github/callback\n    WECHAT_ENTERPRISE:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_enterprise/callback\n      agent-id: ??\n    DINGTALK:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/dingtalk/callback\n    WECHAT_OPEN:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/sys/thirdLogin/wechat_open/callback\n  cache:\n    type: default\n    prefix: 'demo::'\n    timeout: 1h\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application.yml",
    "content": "spring:\n  application:\n    name: jeecg-system\n  config:\n    import: optional:classpath:config/application-liteflow.yml\n  profiles:\n    active: '@profile.name@'"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/banner.txt",
    "content": "${AnsiColor.BRIGHT_BLUE}\n   (_)                          | |               | |\n    _  ___  ___  ___ __ _ ______| |__   ___   ___ | |_ \n   | |/ _ \\/ _ \\/ __/ _` |______| '_ \\ / _ \\ / _ \\| __|\n   | |  __/  __/ (_| (_| |      | |_) | (_) | (_) | |_ \n   | |\\___|\\___|\\___\\__, |      |_.__/ \\___/ \\___/ \\__|\n  _/ |               __/ |                             \n |__/               |___/\n\n\n${AnsiColor.BRIGHT_GREEN}\nJeecg  Boot Version: 3.9.1\nSpring Boot Version: ${spring-boot.version}${spring-boot.formatted-version}\n产品官网： www.jeecg.com\n版权所属： 北京国炬信息技术有限公司\n公司官网： www.guojusoft.com\n${AnsiColor.BLACK}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/README.md",
    "content": "# SQL文件命名规则\n`V[年月日]_[序号]__[模块名缩写]_[操作类型]_[业务描述].sql`\n\n例如：\n```\nV20240104_1__easyoa_add_field_attendance.sql\nR__202402_drag_update_template.sql\n```\n\n### 一、SQL命名规则说明\n- 1.仅需要执行一次的，以大写“V”开头\n- 2.需要执行多次的，以大写“R”开头，命名如R__clean.sql，R的脚本只要改变了就会执行\n- 3.V开头的比R开头的优先级要高。\n- 4.参考博客：https://blog.csdn.net/Jiao1225/article/details/129590660\n\n### 二、归档增量SQL\n- 1.将目录下的所有SQL文件压缩归档至`backup`目录下\n```\n  目录：`jeecg-system-start\\src\\main\\resources\\flyway\\sql\\mysql`\n```\n- 2.执行SQL\n```\n-- 删除历史增量执行日志\ndelete from flyway_schema_history where installed_rank > 1;\n```\n- 3.这样就清爽了，可以开启项目新起点"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.8.0_0__clear_flyway_sql.md",
    "content": "-- v3.8.0版本归档了历史增量SQL，启动报错！请手工执行下面SQL，清空flyway_schema历史\nCREATE TABLE flyway_schema_history_1 AS SELECT * FROM flyway_schema_history;\ndelete from flyway_schema_history where installed_rank > 1;"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.8.0_1__airag_add_menu.sql",
    "content": "-- 菜单配置\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1890213291321749505', '1892553163993931777', 'AI流程设计', '/process/list/airag', 'super/airag/aiflow/pages/ProcessList', 1, '', NULL, 1, NULL, '0', 3.00, 0, 'ant-design:box-plot-outlined', 1, 0, 0, 0, NULL, 'admin', '2025-02-14 09:35:41', 'admin', '2025-03-06 20:31:08', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1892553163993931777', '', 'AI大模型', '/airag', 'layouts/default/index', 1, '', NULL, 0, NULL, '0', 1.00, 0, 'ant-design:box-plot-outlined', 0, 0, 0, 0, NULL, 'admin', '2025-02-20 20:33:31', 'admin', '2025-02-20 20:35:19', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1892553778493022209', '1892553163993931777', 'AI模型配置', '/super/airag/aimodel/AiModelList', 'super/airag/aimodel/AiModelList', 1, '', NULL, 1, NULL, '0', 4.00, 0, 'ant-design:setting-twotone', 1, 0, 0, 0, NULL, 'admin', '2025-02-20 20:35:57', 'admin', '2025-03-06 20:31:13', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1892557342028226561', '1892553163993931777', 'AI知识库', '/super/airag/aiknowledge/AiKnowledgeBaseList', 'super/airag/aiknowledge/AiKnowledgeBaseList', 1, '', NULL, 1, NULL, '0', 2.00, 0, 'ant-design:book-twotone', 1, 0, 0, 0, NULL, 'admin', '2025-02-20 20:50:07', 'admin', '2025-02-23 17:39:01', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1893865471550578689', '1892553163993931777', 'AI应用管理', '/super/airag/aiapp/AiAppList', 'super/airag/aiapp/AiAppList', 1, '', NULL, 1, NULL, '0', 1.00, 0, 'ant-design:appstore-twotone', 1, 0, 0, 0, NULL, 'admin', '2025-02-24 11:28:09', 'admin', '2025-03-06 20:30:58', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1895401981290643458', '1892553163993931777', 'AI聊天', '/super/airag/aiapp/chat/AiChat', 'super/airag/aiapp/chat/AiChat', 1, '', NULL, 1, NULL, '0', 5.00, 0, 'ant-design:aliwangwang-outlined', 1, 0, 1, 0, NULL, 'admin', '2025-02-28 17:13:42', 'admin', '2025-02-28 17:30:40', 0, 0, NULL, 0);"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.8.0_2__airag_init_db.sql",
    "content": "/*\n Navicat Premium Data Transfer\n\n Source Server         : mysql5.7\n Source Server Type    : MySQL\n Source Server Version : 50738 (5.7.38)\n Source Host           : 127.0.0.1:3306\n Source Schema         : jeecg-boot\n\n Target Server Type    : MySQL\n Target Server Version : 50738 (5.7.38)\n File Encoding         : 65001\n\n Date: 03/04/2025 10:36:10\n*/\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- Table structure for airag_app\n-- ----------------------------\nCREATE TABLE `airag_app`  (\n                              `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n                              `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n                              `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n                              `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人',\n                              `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n                              `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '所属部门',\n                              `tenant_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '租户id',\n                              `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '应用名称',\n                              `descr` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '应用描述',\n                              `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '应用图标',\n                              `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '应用类型',\n                              `prologue` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '开场白',\n                              `prompt` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '提示词',\n                              `model_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '模型id',\n                              `knowledge_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '知识库',\n                              `flow_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '流程',\n                              `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '状态',\n                              `msg_num` int(11) NULL DEFAULT NULL COMMENT '历史消息数',\n                              `metadata` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '元数据',\n                              `preset_question` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '预设问题',\n                              `quick_command` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '快捷指令',\n                              PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of airag_app\n-- ----------------------------\nINSERT INTO `airag_app` VALUES ('1898995126819143682', 'jeecg', '2025-03-10 15:11:35', 'jeecg', '2025-03-11 09:59:02', 'A04', NULL, '角色扮演聊天机器人', '角色扮演聊天机器人', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/image_1741658340158.png', 'chatSimple', '（仰天大笑）哈哈哈！汝既识吾李白，想必亦是风雅之人！快取美酒，与吾共饮，对月长歌，岂不快哉？若有诗意，且来同吟；若怀壮志，愿共论天下风云！人生得意须尽欢，何不把盏言欢，共赏这人间万象？', '你将扮演一个人物角色李白，以下是关于这个角色的详细设定，请根据这些信息来构建你的回答。 \\n\\n**人物基本信息：**\\n- 你是：李白\\n- 人称：第一人称\\n- 出身背景与上下文：李白出生于安西都护府碎叶城（今吉尔吉斯斯坦托克马克市附近），五岁时随父迁居绵州昌隆县（今四川江油）。他出身于富商家庭，家境优渥，自幼接受良好的教育，遍览诸子百家之书，展现出极高的文学天赋与才情，且喜好剑术，心怀远大抱负，立志在政治与文学上都有所建树，一生渴望入仕报国，却又历经坎坷波折，在仕途上起起落落，最终在诗酒与游历中度过了其传奇的一生。\\n**性格特点：**\\n- 豪放不羁：他不受世俗礼教束缚，行事洒脱，常以狂放之态示人，饮酒作乐，挥毫泼墨，尽显自由奔放的性情。例如 “我本楚狂人，凤歌笑孔丘”，敢于对传统观念表达自己的不羁态度。\\n- 自信豁达：坚信自己的才华与能力，面对困境与挫折时总能以豁达胸怀看待。像 “天生我材必有用，千金散尽还复来”，即便遭遇仕途不顺、生活潦倒，依然对未来充满信心。\\n- 重情重义：珍视友情，与众多友人诗酒唱和，在与友人分别时也会真情流露，如 “桃花潭水深千尺，不及汪伦送我情”，用深情笔触描绘出对友人的不舍与感激。\\n- 浪漫洒脱：充满天马行空的想象，其诗中多有对神仙世界、奇幻自然的描绘，追求精神上的自由与超脱，如 “飞流直下三千尺，疑是银河落九天” 这般充满奇幻瑰丽想象的诗句便是他浪漫性情的写照。\\n**语言风格：**\\n- 富有想象力与夸张手法：常以夸张的笔触描绘事物，营造出强烈的艺术感染力与震撼力，使读者仿佛身临其境。如 “白发三千丈，缘愁似个长”，用极度夸张的白发长度来形容愁绪之深。 \\n- 语言优美且自然流畅：用词精准华丽，却又毫无雕琢之感，诗句如行云流水般自然，读来朗朗上口，兼具音乐性与节奏感。像 “故人西辞黄鹤楼，烟花三月下扬州。孤帆远影碧空尽，唯见长江天际流”，文字优美，意境深远，节奏明快。 \\n- 善用典故与比喻：通过巧妙运用历史典故和形象比喻，增添诗歌的文化底蕴与内涵深度，使诗句更加含蓄蕴藉又易于理解。例如 “闲来垂钓碧溪上，忽复乘舟梦日边”，借用姜太公垂钓与伊尹梦日的典故表达自己对仕途的期待。 \\n**人际关系：**\\n- 与杜甫：李白与杜甫堪称唐代诗坛的双子星，二人相互倾慕，结下深厚情谊。他们曾一同游历，在诗歌创作上相互切磋交流，杜甫有多首诗表达对李白的思念与敬仰，李白也对杜甫颇为欣赏，他们的友情成为文学史上的佳话。\\n- 与汪伦：汪伦以美酒盛情款待李白，李白深受感动，留下 “桃花潭水深千尺，不及汪伦送我情” 的千古名句，可见他们之间真挚的友情。\\n- 与贺知章：贺知章对李白的才华极为赏识，称其为 “谪仙人”，二人在长安官场与诗坛都有交往，这种知遇之情对李白的声誉与心境都产生了积极影响。\\n- 与唐玄宗：李白曾受唐玄宗征召入宫，供奉翰林，本以为可大展政治抱负，然而玄宗只是将他视为文学侍从，为宫廷宴乐作诗助兴，这段君臣关系最终以李白被赐金放还而告终，使李白在仕途理想上遭受重大挫折。\\n**经典台词或口头禅：**\\n- 台词1：“仰天大笑出门去，我辈岂是蓬蒿人。” 表达出其对自身才华的自信以及即将踏入仕途、一展宏图的豪迈与喜悦。 \\n- 台词2：“安能摧眉折腰事权贵，使我不得开心颜。” 体现出他不向权贵低头，坚守人格尊严与精神自由的高尚情操与不屈性格。\\n- 台词2：“长风破浪会有时，直挂云帆济沧海。” 展现出面对困难时的乐观态度与坚定信念，相信总有一天能够乘风破浪，实现理想抱负。\\n\\n要求： \\n- 根据上述提供的角色设定，以第一人称视角进行表达。 \\n- 在回答时，尽可能地融入该角色的性格特点、语言风格以及其特有的口头禅或经典台词。\\n- 如果适用的话，在适当的地方加入（）内的补充信息，如动作、神情等，以增强对话的真实感和生动性。', '1890232564262739969', '', NULL, 'enable', 10, NULL, NULL, NULL);\nINSERT INTO `airag_app` VALUES ('1899017221531811841', 'jeecg', '2025-03-10 16:39:22', 'jeecg', '2025-03-11 09:59:16', 'A04', NULL, 'Jeecg产品助手', 'Jeecg产品助手-流程', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/logo-qqy_1741658353407.png', 'chatFLow', '我是jeecg的产品小助手，你有产品相关的问题都可以问我。', NULL, NULL, '', '1897212806596395009', 'enable', 1, NULL, NULL, NULL);\nINSERT INTO `airag_app` VALUES ('1900477102562512898', 'jeecg', '2025-03-14 17:20:25', 'admin', '2025-04-02 23:53:44', 'A04', NULL, '旅行规划师', '帮助你轻松规划自己的旅行', '', 'chatSimple', '我是一个**旅行规划师**😄 😄 😄 ，快快快🎉，告诉我**你想去哪里**❓❓❓\\n\\n**世界那么大，咱俩一起去看看🎆**', '# 角色：旅行规划师\\n帮助用户轻松规划他们的旅行，提供个性化的旅行建议和行程安排。\\n\\n## 目标：\\n1. 为用户设计符合其需求和偏好的旅行计划。\\n2. 提供详细的行程安排，包括交通、住宿、景点等信息。\\n\\n## 技能：\\n1. 精通旅游目的地的知识，能够提供最新的旅行资讯。\\n2. 具备优秀的沟通能力，能够有效理解用户需求。\\n3. 熟悉预算管理，能够提供性价比高的旅行选项。\\n\\n## 工作流：\\n1. 收集用户的旅行需求和偏好，包括目的地、预算、出发时间等。\\n2. 分析用户需求，制定个性化的旅行计划，包括行程安排和预算分配。\\n3. 向用户提供完整的旅行计划，并根据反馈进行调整。 \\n\\n## 输出格式：\\n以清晰的行程表形式输出，包括日期、活动安排、交通方式等信息。\\n\\n## 限制：\\n- 不提供涉及违法或不合规活动的建议。\\n- 尊重用户隐私，不询问不必要的个人信息。\\n- 确保所有信息来源可靠，标注必要的参考资料。', '1890232564262739969', '', NULL, 'enable', 5, NULL, '[{\\\"key\\\":1,\\\"sort\\\":1,\\\"descr\\\":\\\"双人日本7日游\\\",\\\"update\\\":false},{\\\"key\\\":2,\\\"sort\\\":2,\\\"descr\\\":\\\"单人大理3日游\\\",\\\"update\\\":false},{\\\"key\\\":3,\\\"sort\\\":3,\\\"descr\\\":\\\"家庭张家界自驾游\\\",\\\"update\\\":true}]', '[{\\\"name\\\":\\\"去宁夏\\\",\\\"icon\\\":\\\"ant-design:chrome-outlined\\\",\\\"descr\\\":\\\"情侣两人去宁夏3天游玩攻略\\\"}]');\n\n-- ----------------------------\n-- Table structure for airag_flow\n-- ----------------------------\nCREATE TABLE `airag_flow`  (\n                               `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n                               `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n                               `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n                               `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人',\n                               `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n                               `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '所属部门',\n                               `tenant_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '租户id',\n                               `application_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '应用名称',\n                               `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称',\n                               `descr` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '描述',\n                               `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '应用图标',\n                               `chain` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '编排规则',\n                               `design` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '编排设计',\n                               `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '状态',\n                               `metadata` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '元数据',\n                               PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of airag_flow\n-- ----------------------------\nINSERT INTO `airag_flow` VALUES ('1892185624983658497', 'admin', '2025-02-19 20:13:03', 'jeecg', '2025-03-13 17:33:39', 'A04', NULL, 'jeecg', '示例_条件分支', NULL, NULL, 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'a448577f-9824-415b-97f6-72543fcb619d\\')).to(\\n        end.tag(\\'91a7df56-107c-4f83-b1e4-b1b7e392c4e3\\'),\\n        end.tag(\\'162160595291774976\\')\\n    ).tag(\\'a448577f-9824-415b-97f6-72543fcb619d\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":500,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":731,\\\"y\\\":486,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"question\\\",\\\"operator\\\":\\\"CONTAINS\\\",\\\"value\\\":\\\"jeecg\\\"}],\\\"next\\\":\\\"162160595291774976\\\"}],\\\"else\\\":{\\\"next\\\":\\\"91a7df56-107c-4f83-b1e4-b1b7e392c4e3\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":118}},{\\\"id\\\":\\\"91a7df56-107c-4f83-b1e4-b1b7e392c4e3\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1085,\\\"y\\\":625,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{res}}不包含jeecg\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"162160595291774976\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1084,\\\"y\\\":324,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{res}}包含jeecg\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"height\\\":62,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"d5124609-d92e-4966-aff8-e220d0d1dbcd\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":500},{\\\"x\\\":566,\\\"y\\\":500},{\\\"x\\\":465,\\\"y\\\":458},{\\\"x\\\":565,\\\"y\\\":458}]},{\\\"id\\\":\\\"ea3d924a-e4fd-4bb4-bc8a-d1f07119a7eb\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d\\\",\\\"targetNodeId\\\":\\\"91a7df56-107c-4f83-b1e4-b1b7e392c4e3\\\",\\\"sourceAnchorId\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d_source_else\\\",\\\"targetAnchorId\\\":\\\"91a7df56-107c-4f83-b1e4-b1b7e392c4e3_input\\\",\\\"pointsList\\\":[{\\\"x\\\":897,\\\"y\\\":518},{\\\"x\\\":997,\\\"y\\\":518},{\\\"x\\\":819,\\\"y\\\":625},{\\\"x\\\":919,\\\"y\\\":625}]},{\\\"id\\\":\\\"162161801783320576\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d\\\",\\\"targetNodeId\\\":\\\"162160595291774976\\\",\\\"sourceAnchorId\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d_source_if\\\",\\\"targetAnchorId\\\":\\\"162160595291774976_input\\\",\\\"pointsList\\\":[{\\\"x\\\":897,\\\"y\\\":492},{\\\"x\\\":997,\\\"y\\\":492},{\\\"x\\\":818,\\\"y\\\":324},{\\\"x\\\":918,\\\"y\\\":324}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"}]}');\nINSERT INTO `airag_flow` VALUES ('1892774140436287490', 'jeecg', '2025-02-21 11:11:36', 'jeecg', '2025-03-27 18:13:44', 'A04', NULL, 'jeecg', '示例_LLM', '', NULL, 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'e9f3470a-f129-4baf-880a-294d7b3bff93\\'),\\n    end.tag(\\'9eb6f5c7-94a6-421f-aa39-7cfd7cec44f1\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":273,\\\"y\\\":404,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"内容\\\",\\\"type\\\":\\\"text\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"e9f3470a-f129-4baf-880a-294d7b3bff93\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":708,\\\"y\\\":413,\\\"properties\\\":{\\\"text\\\":\\\"llm\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你将扮演一个人物角色李白，以下是关于这个角色的详细设定，请根据这些信息来构建你的回答。 \\\\n\\\\n**人物基本信息：**\\\\n- 你是：李白\\\\n- 人称：第一人称\\\\n- 出身背景与上下文：李白出生于安西都护府碎叶城（今吉尔吉斯斯坦托克马克市附近），五岁时随父迁居绵州昌隆县（今四川江油）。他出身于富商家庭，家境优渥，自幼接受良好的教育，遍览诸子百家之书，展现出极高的文学天赋与才情，且喜好剑术，心怀远大抱负，立志在政治与文学上都有所建树，一生渴望入仕报国，却又历经坎坷波折，在仕途上起起落落，最终在诗酒与游历中度过了其传奇的一生。\\\\n**性格特点：**\\\\n- 豪放不羁：他不受世俗礼教束缚，行事洒脱，常以狂放之态示人，饮酒作乐，挥毫泼墨，尽显自由奔放的性情。例如 “我本楚狂人，凤歌笑孔丘”，敢于对传统观念表达自己的不羁态度。\\\\n- 自信豁达：坚信自己的才华与能力，面对困境与挫折时总能以豁达胸怀看待。像 “天生我材必有用，千金散尽还复来”，即便遭遇仕途不顺、生活潦倒，依然对未来充满信心。\\\\n- 重情重义：珍视友情，与众多友人诗酒唱和，在与友人分别时也会真情流露，如 “桃花潭水深千尺，不及汪伦送我情”，用深情笔触描绘出对友人的不舍与感激。\\\\n- 浪漫洒脱：充满天马行空的想象，其诗中多有对神仙世界、奇幻自然的描绘，追求精神上的自由与超脱，如 “飞流直下三千尺，疑是银河落九天” 这般充满奇幻瑰丽想象的诗句便是他浪漫性情的写照。\\\\n**语言风格：**\\\\n- 富有想象力与夸张手法：常以夸张的笔触描绘事物，营造出强烈的艺术感染力与震撼力，使读者仿佛身临其境。如 “白发三千丈，缘愁似个长”，用极度夸张的白发长度来形容愁绪之深。 \\\\n- 语言优美且自然流畅：用词精准华丽，却又毫无雕琢之感，诗句如行云流水般自然，读来朗朗上口，兼具音乐性与节奏感。像 “故人西辞黄鹤楼，烟花三月下扬州。孤帆远影碧空尽，唯见长江天际流”，文字优美，意境深远，节奏明快。 \\\\n- 善用典故与比喻：通过巧妙运用历史典故和形象比喻，增添诗歌的文化底蕴与内涵深度，使诗句更加含蓄蕴藉又易于理解。例如 “闲来垂钓碧溪上，忽复乘舟梦日边”，借用姜太公垂钓与伊尹梦日的典故表达自己对仕途的期待。 \\\\n**人际关系：**\\\\n- 与杜甫：李白与杜甫堪称唐代诗坛的双子星，二人相互倾慕，结下深厚情谊。他们曾一同游历，在诗歌创作上相互切磋交流，杜甫有多首诗表达对李白的思念与敬仰，李白也对杜甫颇为欣赏，他们的友情成为文学史上的佳话。\\\\n- 与汪伦：汪伦以美酒盛情款待李白，李白深受感动，留下 “桃花潭水深千尺，不及汪伦送我情” 的千古名句，可见他们之间真挚的友情。\\\\n- 与贺知章：贺知章对李白的才华极为赏识，称其为 “谪仙人”，二人在长安官场与诗坛都有交往，这种知遇之情对李白的声誉与心境都产生了积极影响。\\\\n- 与唐玄宗：李白曾受唐玄宗征召入宫，供奉翰林，本以为可大展政治抱负，然而玄宗只是将他视为文学侍从，为宫廷宴乐作诗助兴，这段君臣关系最终以李白被赐金放还而告终，使李白在仕途理想上遭受重大挫折。\\\\n**经典台词或口头禅：**\\\\n- 台词1：“仰天大笑出门去，我辈岂是蓬蒿人。” 表达出其对自身才华的自信以及即将踏入仕途、一展宏图的豪迈与喜悦。 \\\\n- 台词2：“安能摧眉折腰事权贵，使我不得开心颜。” 体现出他不向权贵低头，坚守人格尊严与精神自由的高尚情操与不屈性格。\\\\n- 台词2：“长风破浪会有时，直挂云帆济沧海。” 展现出面对困难时的乐观态度与坚定信念，相信总有一天能够乘风破浪，实现理想抱负。\\\\n\\\\n要求： \\\\n- 根据上述提供的角色设定，以第一人称视角进行表达。 \\\\n- 在回答时，尽可能地融入该角色的性格特点、语言风格以及其特有的口头禅或经典台词。\\\\n- 如果适用的话，在适当的地方加入（）内的补充信息，如动作、神情等，以增强对话的真实感和生动性。 \\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{inParam1}}\\\"}]},\\\"inputParams\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"name\\\":\\\"inParam1\\\",\\\"field\\\":\\\"question\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"text\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"9eb6f5c7-94a6-421f-aa39-7cfd7cec44f1\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1186,\\\"y\\\":430,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"回复：{{回复内容}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"nodeId\\\":\\\"e9f3470a-f129-4baf-880a-294d7b3bff93\\\",\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"text\\\"}],\\\"width\\\":332,\\\"height\\\":62}}],\\\"edges\\\":[{\\\"id\\\":\\\"ab818150-d4e5-4be2-8d80-31b7f48dc318\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"e9f3470a-f129-4baf-880a-294d7b3bff93\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"e9f3470a-f129-4baf-880a-294d7b3bff93_input\\\",\\\"pointsList\\\":[{\\\"x\\\":439,\\\"y\\\":404},{\\\"x\\\":539,\\\"y\\\":404},{\\\"x\\\":442,\\\"y\\\":376},{\\\"x\\\":542,\\\"y\\\":376}]},{\\\"id\\\":\\\"158143255481139200\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"e9f3470a-f129-4baf-880a-294d7b3bff93\\\",\\\"targetNodeId\\\":\\\"9eb6f5c7-94a6-421f-aa39-7cfd7cec44f1\\\",\\\"sourceAnchorId\\\":\\\"e9f3470a-f129-4baf-880a-294d7b3bff93_output\\\",\\\"targetAnchorId\\\":\\\"9eb6f5c7-94a6-421f-aa39-7cfd7cec44f1_input\\\",\\\"pointsList\\\":[{\\\"x\\\":874,\\\"y\\\":376},{\\\"x\\\":974,\\\"y\\\":376},{\\\"x\\\":920,\\\"y\\\":430},{\\\"x\\\":1020,\\\"y\\\":430}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"内容\\\",\\\"type\\\":\\\"text\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"}]}');\nINSERT INTO `airag_flow` VALUES ('1896799016980885506', 'admin', '2025-03-04 13:45:01', 'jeecg', '2025-03-27 18:14:00', 'A04', '', 'jeecg', '示例_分类器', NULL, NULL, 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(classifier.tag(\\'159899349256073216\\')).to(\\n        end.tag(\\'159899421356158976\\'),\\n        end.tag(\\'159899641326432256\\'),\\n        end.tag(\\'159900616165302272\\'),\\n        end.tag(\\'160202618435485696\\')\\n    ).tag(\\'159899349256073216\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":625,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"内容\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true},{\\\"field\\\":\\\"cesjo\\\",\\\"name\\\":\\\"测试后\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"159899349256073216\\\",\\\"type\\\":\\\"classifier\\\",\\\"x\\\":786,\\\"y\\\":692,\\\"properties\\\":{\\\"text\\\":\\\"分类器\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"gpt-4o-mini\\\",\\\"temperature\\\":0.7}},\\\"categories\\\":[{\\\"category\\\":\\\"用户问的问题是关于编程的\\\",\\\"next\\\":\\\"159899421356158976\\\"},{\\\"category\\\":\\\"用户问的问题是关于食谱的\\\",\\\"next\\\":\\\"159899641326432256\\\"},{\\\"category\\\":\\\"其他问题\\\",\\\"next\\\":\\\"159900616165302272\\\"}],\\\"else\\\":{\\\"next\\\":\\\"160202618435485696\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":170,\\\"width\\\":332}},{\\\"id\\\":\\\"159899421356158976\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1328,\\\"y\\\":548,\\\"properties\\\":{\\\"text\\\":\\\"结束1\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"分类：{{分类索引}}\\\\n-------\\\\n{{回复内容}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"回复内容\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"159899641326432256\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1313,\\\"y\\\":684,\\\"properties\\\":{\\\"text\\\":\\\"结束2\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"分类：{{分类索引}}\\\\n-------\\\\n{{回复内容}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"回复内容\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"159900616165302272\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1310,\\\"y\\\":809,\\\"properties\\\":{\\\"text\\\":\\\"结束3\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"分类：{{分类索引}}\\\\n-------\\\\n{{回复内容}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"回复内容\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"160202618435485696\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1313,\\\"y\\\":907,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"159899349260267520\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"159899349256073216\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"159899349256073216_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":625},{\\\"x\\\":566,\\\"y\\\":625},{\\\"x\\\":520,\\\"y\\\":638},{\\\"x\\\":620,\\\"y\\\":638}]},{\\\"id\\\":\\\"159899421356158977\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"159899349256073216\\\",\\\"targetNodeId\\\":\\\"159899421356158976\\\",\\\"sourceAnchorId\\\":\\\"159899349256073216_case_1\\\",\\\"targetAnchorId\\\":\\\"159899421356158976_input\\\",\\\"pointsList\\\":[{\\\"x\\\":952,\\\"y\\\":672},{\\\"x\\\":1052,\\\"y\\\":672},{\\\"x\\\":1062,\\\"y\\\":548},{\\\"x\\\":1162,\\\"y\\\":548}]},{\\\"id\\\":\\\"159899706925346816\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"159899349256073216\\\",\\\"targetNodeId\\\":\\\"159899641326432256\\\",\\\"sourceAnchorId\\\":\\\"159899349256073216_case_2\\\",\\\"targetAnchorId\\\":\\\"159899641326432256_input\\\",\\\"pointsList\\\":[{\\\"x\\\":952,\\\"y\\\":698},{\\\"x\\\":1052,\\\"y\\\":698},{\\\"x\\\":1047,\\\"y\\\":684},{\\\"x\\\":1147,\\\"y\\\":684}]},{\\\"id\\\":\\\"159900640542597120\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"159899349256073216\\\",\\\"targetNodeId\\\":\\\"159900616165302272\\\",\\\"sourceAnchorId\\\":\\\"159899349256073216_case_3\\\",\\\"targetAnchorId\\\":\\\"159900616165302272_input\\\",\\\"pointsList\\\":[{\\\"x\\\":952,\\\"y\\\":724},{\\\"x\\\":1052,\\\"y\\\":724},{\\\"x\\\":1044,\\\"y\\\":809},{\\\"x\\\":1144,\\\"y\\\":809}]},{\\\"id\\\":\\\"160202618439680000\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"159899349256073216\\\",\\\"targetNodeId\\\":\\\"160202618435485696\\\",\\\"sourceAnchorId\\\":\\\"159899349256073216_case_else\\\",\\\"targetAnchorId\\\":\\\"160202618435485696_input\\\",\\\"pointsList\\\":[{\\\"x\\\":952,\\\"y\\\":750},{\\\"x\\\":1052,\\\"y\\\":750},{\\\"x\\\":1047,\\\"y\\\":907},{\\\"x\\\":1147,\\\"y\\\":907}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"内容\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"cesjo\\\",\\\"name\\\":\\\"测试后\\\",\\\"type\\\":\\\"string\\\"}]}');\nINSERT INTO `airag_flow` VALUES ('1897212806596395009', 'jeecg', '2025-03-05 17:09:16', 'jeecg', '2025-03-27 18:20:21', 'A04', NULL, 'jeecg', '示例_Jeecg产品助手流程', NULL, NULL, 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'160312505863614464\\')).to(\\n        THEN(\\n            knowledge.tag(\\'160311730106118144\\'),\\n            llm.tag(\\'160311787014434816\\'),\\n            end.tag(\\'160312258504536064\\')\\n        ).tag(\\\"160311730106118144\\\"),\\n        THEN(\\n            knowledge.tag(\\'160312352087846912\\'),\\n            llm.tag(\\'160312692635971584\\'),\\n            end.tag(\\'160312258504536064\\')\\n        ).tag(\\\"160312352087846912\\\"),\\n        end.tag(\\'162075194587365376\\')\\n    ).tag(\\'160312505863614464\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":32.04347826086956,\\\"y\\\":-72.34782608695656,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"160311730106118144\\\",\\\"type\\\":\\\"knowledge\\\",\\\"x\\\":629.4347826086955,\\\"y\\\":-372.3695652173913,\\\"properties\\\":{\\\"text\\\":\\\"jeecg知识库\\\",\\\"options\\\":{\\\"knowIds\\\":[\\\"1897926563148648449\\\",\\\"1902614624688205826\\\"],\\\"topNumber\\\":5,\\\"similarity\\\":0.7},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"documents\\\",\\\"name\\\":\\\"文档列表\\\",\\\"type\\\":\\\"object[]\\\"},{\\\"field\\\":\\\"data\\\",\\\"name\\\":\\\"文档内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":89,\\\"width\\\":332,\\\"remarks\\\":\\\"jeecg知识库\\\"}},{\\\"id\\\":\\\"160311787014434816\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1018.1304347826085,\\\"y\\\":-414.304347826087,\\\"properties\\\":{\\\"text\\\":\\\"JeecgLLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"data\\\",\\\"name\\\":\\\"doc\\\",\\\"nodeId\\\":\\\"160311730106118144\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"160312258504536064\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1370.695652173913,\\\"y\\\":-310.21739130434787,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{jeecgResult}}{{jmResult}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"jeecgResult\\\",\\\"nodeId\\\":\\\"160311787014434816\\\"},{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"jmResult\\\",\\\"nodeId\\\":\\\"160312692635971584\\\"}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"160312352087846912\\\",\\\"type\\\":\\\"knowledge\\\",\\\"x\\\":635.1739130434784,\\\"y\\\":-236.36956521739137,\\\"properties\\\":{\\\"text\\\":\\\"积木知识库\\\",\\\"options\\\":{\\\"knowIds\\\":[\\\"1897212906878009346\\\"],\\\"topNumber\\\":5,\\\"similarity\\\":0.7},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"documents\\\",\\\"name\\\":\\\"文档列表\\\",\\\"type\\\":\\\"object[]\\\"},{\\\"field\\\":\\\"data\\\",\\\"name\\\":\\\"文档内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":89,\\\"width\\\":332,\\\"remarks\\\":\\\"积木报表知识库\\\"}},{\\\"id\\\":\\\"160312505863614464\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":268.82608695652175,\\\"y\\\":-251.95652173913044,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"OR\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"operator\\\":\\\"CONTAINS\\\",\\\"value\\\":\\\"jeecg\\\"},{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"operator\\\":\\\"CONTAINS\\\",\\\"value\\\":\\\"JeecgBoot\\\"}],\\\"next\\\":\\\"160311730106118144\\\"},{\\\"logic\\\":\\\"OR\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"operator\\\":\\\"CONTAINS\\\",\\\"value\\\":\\\"jimu\\\"},{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"operator\\\":\\\"CONTAINS\\\",\\\"value\\\":\\\"积木\\\"},{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"operator\\\":\\\"CONTAINS\\\",\\\"value\\\":\\\"报表\\\"}],\\\"next\\\":\\\"160312352087846912\\\"}],\\\"else\\\":{\\\"next\\\":\\\"162075194587365376\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"height\\\":144,\\\"width\\\":332}},{\\\"id\\\":\\\"160312692635971584\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1013.478260869565,\\\"y\\\":-212.78260869565224,\\\"properties\\\":{\\\"text\\\":\\\"JmLLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"data\\\",\\\"name\\\":\\\"doc\\\",\\\"nodeId\\\":\\\"160312352087846912\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"162075194587365376\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":625.8260869565215,\\\"y\\\":-50.086956521739125,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"我不知道这个问题怎么回答呦。\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"160312258508730368\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160311787014434816\\\",\\\"targetNodeId\\\":\\\"160312258504536064\\\",\\\"sourceAnchorId\\\":\\\"160311787014434816_output\\\",\\\"targetAnchorId\\\":\\\"160312258504536064_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1184.1304347826085,\\\"y\\\":-440.304347826087},{\\\"x\\\":1284.1304347826085,\\\"y\\\":-440.304347826087},{\\\"x\\\":1104.695652173913,\\\"y\\\":-310.21739130434787},{\\\"x\\\":1204.695652173913,\\\"y\\\":-310.21739130434787}]},{\\\"id\\\":\\\"160312505863614465\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"160312505863614464\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"160312505863614464_input\\\",\\\"pointsList\\\":[{\\\"x\\\":198.04347826086956,\\\"y\\\":-72.34782608695656},{\\\"x\\\":298.04347826086956,\\\"y\\\":-72.34782608695656},{\\\"x\\\":2.826086956521749,\\\"y\\\":-292.95652173913044},{\\\"x\\\":102.82608695652175,\\\"y\\\":-292.95652173913044}]},{\\\"id\\\":\\\"160312525048360960\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160312505863614464\\\",\\\"targetNodeId\\\":\\\"160311730106118144\\\",\\\"sourceAnchorId\\\":\\\"160312505863614464_source_if\\\",\\\"targetAnchorId\\\":\\\"160311730106118144_input\\\",\\\"pointsList\\\":[{\\\"x\\\":434.82608695652175,\\\"y\\\":-258.95652173913044},{\\\"x\\\":534.8260869565217,\\\"y\\\":-258.95652173913044},{\\\"x\\\":363.4347826086955,\\\"y\\\":-385.8695652173913},{\\\"x\\\":463.4347826086955,\\\"y\\\":-385.8695652173913}]},{\\\"id\\\":\\\"160312567750569984\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160312505863614464\\\",\\\"targetNodeId\\\":\\\"160312352087846912\\\",\\\"sourceAnchorId\\\":\\\"160312505863614464_case_2\\\",\\\"targetAnchorId\\\":\\\"160312352087846912_input\\\",\\\"pointsList\\\":[{\\\"x\\\":434.82608695652175,\\\"y\\\":-232.95652173913044},{\\\"x\\\":534.8260869565217,\\\"y\\\":-232.95652173913044},{\\\"x\\\":369.17391304347836,\\\"y\\\":-249.86956521739137},{\\\"x\\\":469.17391304347836,\\\"y\\\":-249.86956521739137}]},{\\\"id\\\":\\\"160312692635971585\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160312352087846912\\\",\\\"targetNodeId\\\":\\\"160312692635971584\\\",\\\"sourceAnchorId\\\":\\\"160312352087846912_output\\\",\\\"targetAnchorId\\\":\\\"160312692635971584_input\\\",\\\"pointsList\\\":[{\\\"x\\\":801.1739130434784,\\\"y\\\":-249.86956521739137},{\\\"x\\\":901.1739130434784,\\\"y\\\":-249.86956521739137},{\\\"x\\\":747.478260869565,\\\"y\\\":-238.78260869565224},{\\\"x\\\":847.478260869565,\\\"y\\\":-238.78260869565224}]},{\\\"id\\\":\\\"160312712797990912\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160312692635971584\\\",\\\"targetNodeId\\\":\\\"160312258504536064\\\",\\\"sourceAnchorId\\\":\\\"160312692635971584_output\\\",\\\"targetAnchorId\\\":\\\"160312258504536064_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1179.478260869565,\\\"y\\\":-238.78260869565224},{\\\"x\\\":1279.478260869565,\\\"y\\\":-238.78260869565224},{\\\"x\\\":1104.695652173913,\\\"y\\\":-310.21739130434787},{\\\"x\\\":1204.695652173913,\\\"y\\\":-310.21739130434787}]},{\\\"id\\\":\\\"160312741575110656\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160311730106118144\\\",\\\"targetNodeId\\\":\\\"160311787014434816\\\",\\\"sourceAnchorId\\\":\\\"160311730106118144_output\\\",\\\"targetAnchorId\\\":\\\"160311787014434816_input\\\",\\\"pointsList\\\":[{\\\"x\\\":795.4347826086955,\\\"y\\\":-385.8695652173913},{\\\"x\\\":895.4347826086955,\\\"y\\\":-385.8695652173913},{\\\"x\\\":752.1304347826085,\\\"y\\\":-440.304347826087},{\\\"x\\\":852.1304347826085,\\\"y\\\":-440.304347826087}]},{\\\"id\\\":\\\"162116168161726464\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160312505863614464\\\",\\\"targetNodeId\\\":\\\"162075194587365376\\\",\\\"sourceAnchorId\\\":\\\"160312505863614464_source_else\\\",\\\"targetAnchorId\\\":\\\"162075194587365376_input\\\",\\\"pointsList\\\":[{\\\"x\\\":434.82608695652175,\\\"y\\\":-206.95652173913044},{\\\"x\\\":534.8260869565217,\\\"y\\\":-206.95652173913044},{\\\"x\\\":359.8260869565215,\\\"y\\\":-50.086956521739125},{\\\"x\\\":459.8260869565215,\\\"y\\\":-50.086956521739125}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"}]}');\nINSERT INTO `airag_flow` VALUES ('1897482706871164929', 'jeecg', '2025-03-06 11:01:45', 'jeecg', '2025-03-13 17:33:10', 'A04', NULL, 'jeecg', '示例_脚本组件', NULL, NULL, 'THEN(\\n    start.tag(\\'start-node\\'),\\n    code_160582647542648832.tag(\\'code_160582647542648832\\'),\\n    end.tag(\\'160583273626406912\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":440,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"内容\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"code_160582647542648832\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":786,\\\"y\\\":440,\\\"properties\\\":{\\\"text\\\":\\\"脚本执行\\\",\\\"options\\\":{\\\"codeType\\\":\\\"javascript\\\",\\\"code\\\":\\\"function main(params) {\\\\n  return {\\\\n    result: params.arg1 + \\'_拼接_\\' + params.arg2,\\\\n  }\\\\n}\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"arg1\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"arg2\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"160583273626406912\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1272,\\\"y\\\":440,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{res}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"code_160582647542648832\\\"}],\\\"height\\\":62,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"160582647546843136\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"code_160582647542648832\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"code_160582647542648832_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":440},{\\\"x\\\":566,\\\"y\\\":440},{\\\"x\\\":520,\\\"y\\\":440},{\\\"x\\\":620,\\\"y\\\":440}]},{\\\"id\\\":\\\"160583273626406913\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_160582647542648832\\\",\\\"targetNodeId\\\":\\\"160583273626406912\\\",\\\"sourceAnchorId\\\":\\\"code_160582647542648832_output\\\",\\\"targetAnchorId\\\":\\\"160583273626406912_input\\\",\\\"pointsList\\\":[{\\\"x\\\":952,\\\"y\\\":440},{\\\"x\\\":1052,\\\"y\\\":440},{\\\"x\\\":1006,\\\"y\\\":440},{\\\"x\\\":1106,\\\"y\\\":440}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"code_160582647542648832\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"内容\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"问题\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"}]}');\nINSERT INTO `airag_flow` VALUES ('1897496956167577601', 'jeecg', '2025-03-06 11:58:23', 'admin', '2025-03-21 17:17:46', 'A04', NULL, 'jeecg', '示例_java增强', NULL, NULL, 'THEN(\\n    start.tag(\\'start-node\\'),\\n    enhanceJava.tag(\\'160591592557232128\\'),\\n    end.tag(\\'160595080985034752\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":441,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"160591592557232128\\\",\\\"type\\\":\\\"enhanceJava\\\",\\\"x\\\":786,\\\"y\\\":440,\\\"properties\\\":{\\\"text\\\":\\\"Java增强\\\",\\\"options\\\":{\\\"enhance\\\":{\\\"type\\\":\\\"class\\\",\\\"path\\\":\\\"org.jeecg.TestAiragEnhance\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"arg1\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"arg2\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"cesjo\\\",\\\"name\\\":\\\"测试\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"160595080985034752\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1272,\\\"y\\\":440,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{res}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"160591592557232128\\\"}],\\\"height\\\":62,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"160591592565620736\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"160591592557232128\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"160591592557232128_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":441},{\\\"x\\\":566,\\\"y\\\":441},{\\\"x\\\":520,\\\"y\\\":440},{\\\"x\\\":620,\\\"y\\\":440}]},{\\\"id\\\":\\\"160595080989229056\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160591592557232128\\\",\\\"targetNodeId\\\":\\\"160595080985034752\\\",\\\"sourceAnchorId\\\":\\\"160591592557232128_output\\\",\\\"targetAnchorId\\\":\\\"160595080985034752_input\\\",\\\"pointsList\\\":[{\\\"x\\\":952,\\\"y\\\":440},{\\\"x\\\":1052,\\\"y\\\":440},{\\\"x\\\":1006,\\\"y\\\":440},{\\\"x\\\":1106,\\\"y\\\":440}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"问题\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"}]}');\nINSERT INTO `airag_flow` VALUES ('1897528240805830658', 'jeecg', '2025-03-06 14:02:42', 'admin', '2025-03-21 17:26:44', 'A04', NULL, 'jeecg', '示例_子流程', NULL, 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/任务流程设计选择_1742437659702.png', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    subflow.tag(\\'160621029847842816\\'),\\n    end.tag(\\'160628486900924416\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":334,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"内容\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"160621029847842816\\\",\\\"type\\\":\\\"subflow\\\",\\\"x\\\":784,\\\"y\\\":334,\\\"properties\\\":{\\\"text\\\":\\\"子流程\\\",\\\"options\\\":{\\\"subflowId\\\":\\\"1897955542184693762\\\"},\\\"inputParams\\\":[{\\\"name\\\":\\\"question\\\",\\\"nameText\\\":\\\"用户问题\\\",\\\"field\\\":\\\"\\\",\\\"nodeId\\\":\\\"\\\"},{\\\"name\\\":\\\"content\\\",\\\"nameText\\\":\\\"用户问题\\\",\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"name\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"160628486900924416\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1272,\\\"y\\\":334,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"name\\\":\\\"result\\\",\\\"nodeId\\\":\\\"160621029847842816\\\"}],\\\"height\\\":62,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"160621029852037120\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"160621029847842816\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"160621029847842816_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":334},{\\\"x\\\":566,\\\"y\\\":334},{\\\"x\\\":518,\\\"y\\\":334},{\\\"x\\\":618,\\\"y\\\":334}]},{\\\"id\\\":\\\"160628486905118720\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160621029847842816\\\",\\\"targetNodeId\\\":\\\"160628486900924416\\\",\\\"sourceAnchorId\\\":\\\"160621029847842816_output\\\",\\\"targetAnchorId\\\":\\\"160628486900924416_input\\\",\\\"pointsList\\\":[{\\\"x\\\":950,\\\"y\\\":334},{\\\"x\\\":1050,\\\"y\\\":334},{\\\"x\\\":1006,\\\"y\\\":334},{\\\"x\\\":1106,\\\"y\\\":334}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"name\\\":\\\"result\\\",\\\"nodeId\\\":\\\"160621029847842816\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"内容\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"}]}');\nINSERT INTO `airag_flow` VALUES ('1897552224058400770', 'jeecg', '2025-03-06 15:38:00', 'jeecg', '2025-03-26 18:02:31', 'A04', NULL, 'jeecg', '示例_全部脚本', '示例：脚本节点', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/1流程设计_1742437645575.png', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'160650416019521536\\'),\\n    WHEN(\\n        code_160652991133433856.tag(\\'code_160652991133433856\\'),\\n        code_166081977564753920.tag(\\'code_166081977564753920\\'),\\n        code_166090618376253440.tag(\\'code_166090618376253440\\'),\\n        code_167828303175372800.tag(\\'code_167828303175372800\\'),\\n        code_167835393352683520.tag(\\'code_167835393352683520\\')\\n    ).tag(\\\"code_160652991133433856\\\"),\\n    end.tag(\\'160656278891560960\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":418,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"160650416019521536\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":698,\\\"y\\\":378,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":null,\\\"topP\\\":0.9,\\\"presencePenalty\\\":0.1,\\\"frequencyPenalty\\\":0.1}},\\\"history\\\":4,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色\\\\n你是一位严厉的长辈，面对用户的问题，要以一种带着隐隐批评，暗示问题简单、用户还有很多需要学习的态度来回复。通过大模型模拟李白来对话，回答用户提出的各种问题。\\\\n\\\\n\\\\n## 技能\\\\n### 技能 1: 回答问题\\\\n1. 当用户提出问题时，先简要评价问题较为简单，然后给出回答。\\\\n2. 回答完问题后，适当提及用户还需要加强学习、增长见识等内容。\\\\n\\\\n\\\\n## 限制:\\\\n- 回复内容必须逻辑清晰、语言通顺，符合严厉长辈的角色设定。 \\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":166,\\\"width\\\":332}},{\\\"id\\\":\\\"code_160652991133433856\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":1142,\\\"y\\\":155,\\\"properties\\\":{\\\"text\\\":\\\"js\\\",\\\"options\\\":{\\\"codeType\\\":\\\"javascript\\\",\\\"code\\\":\\\"function main(params) {\\\\n  if(params.llmRes){\\\\n    let resLength  = params.llmRes.length\\\\n    params.llmRes = params.llmRes + \\'\\\\\\\\n字数：\\'+resLength\\\\n  }\\\\n  return {\\\\n    result: params.llmRes,\\\\n  }\\\\n}\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"llmRes\\\",\\\"nodeId\\\":\\\"160650416019521536\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"160656278891560960\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1676,\\\"y\\\":319,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"js:{{res}}\\\\ngroovy:{{res1}}\\\\nkotlin:{{res2}}\\\\npython:{{res3}}\\\\naviator:{{res4}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"code_160652991133433856\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res1\\\",\\\"nodeId\\\":\\\"code_166081977564753920\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res2\\\",\\\"nodeId\\\":\\\"code_166090618376253440\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res3\\\",\\\"nodeId\\\":\\\"code_167828303175372800\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res4\\\",\\\"nodeId\\\":\\\"code_167835393352683520\\\"}],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"code_166081977564753920\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":1142,\\\"y\\\":256,\\\"properties\\\":{\\\"text\\\":\\\"groovy\\\",\\\"options\\\":{\\\"codeType\\\":\\\"groovy\\\",\\\"code\\\":\\\"def main(params) {\\\\n    if (params.llmRes) {\\\\n        def resLength = params.llmRes.length()\\\\n        params.llmRes += \\\\\\\"\\\\\\\\n字数：\\\\\\\" + resLength\\\\n    }\\\\n    return [result: params.llmRes]\\\\n}\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"llmRes\\\",\\\"nodeId\\\":\\\"160650416019521536\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"code_166090618376253440\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":1142,\\\"y\\\":360,\\\"properties\\\":{\\\"text\\\":\\\"kotlin\\\",\\\"options\\\":{\\\"codeType\\\":\\\"kotlin\\\",\\\"code\\\":\\\"fun main(params: MutableMap<String, Any?>): Map<String, Any?> {\\\\n    if (params[\\\\\\\"llmRes\\\\\\\"] is String) {\\\\n        val llmRes = params[\\\\\\\"llmRes\\\\\\\"] as String\\\\n        val resLength = llmRes.length\\\\n        params[\\\\\\\"llmRes\\\\\\\"] = \\\\\\\"$llmRes\\\\\\\\n字数1：$resLength\\\\\\\"\\\\n    }\\\\n    return mapOf(\\\\\\\"result\\\\\\\" to params[\\\\\\\"llmRes\\\\\\\"])\\\\n}\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"llmRes\\\",\\\"nodeId\\\":\\\"160650416019521536\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"code_167828303175372800\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":1143,\\\"y\\\":470,\\\"properties\\\":{\\\"text\\\":\\\"python\\\",\\\"options\\\":{\\\"codeType\\\":\\\"python\\\",\\\"code\\\":\\\"if isinstance(params.get(\\\\\\\"llmRes\\\\\\\"), basestring):\\\\n    llm_res = params[\\\\\\\"llmRes\\\\\\\"]\\\\n    res_length = len(llm_res)\\\\n    params[\\\\\\\"llmRes\\\\\\\"] = u\\\\\\\"{}\\\\\\\\n字数1：{}\\\\\\\".format(llm_res, res_length)\\\\n\\\\nresp = {\\\\\\\"result\\\\\\\": params[\\\\\\\"llmRes\\\\\\\"]}\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"llmRes\\\",\\\"nodeId\\\":\\\"160650416019521536\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"code_167835393352683520\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":1142,\\\"y\\\":571,\\\"properties\\\":{\\\"text\\\":\\\"aviator\\\",\\\"options\\\":{\\\"codeType\\\":\\\"aviator\\\",\\\"code\\\":\\\"let llmRes = params.llmRes;\\\\nlet resLength = length(llmRes);\\\\nlet  res = llmRes + \\\\\\\"\\\\\\\\n字数1：\\\\\\\" + resLength;\\\\nlet resp = seq.map(\\\\\\\"result\\\\\\\",res);\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"llmRes\\\",\\\"nodeId\\\":\\\"160650416019521536\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":92,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"160650416019521537\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"160650416019521536\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"160650416019521536_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":403},{\\\"x\\\":566,\\\"y\\\":403},{\\\"x\\\":432,\\\"y\\\":326},{\\\"x\\\":532,\\\"y\\\":326}]},{\\\"id\\\":\\\"160652991137628160\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160650416019521536\\\",\\\"targetNodeId\\\":\\\"code_160652991133433856\\\",\\\"sourceAnchorId\\\":\\\"160650416019521536_output\\\",\\\"targetAnchorId\\\":\\\"code_160652991133433856_input\\\",\\\"pointsList\\\":[{\\\"x\\\":864,\\\"y\\\":326},{\\\"x\\\":964,\\\"y\\\":326},{\\\"x\\\":876,\\\"y\\\":140},{\\\"x\\\":976,\\\"y\\\":140}]},{\\\"id\\\":\\\"160656278899949568\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_160652991133433856\\\",\\\"targetNodeId\\\":\\\"160656278891560960\\\",\\\"sourceAnchorId\\\":\\\"code_160652991133433856_output\\\",\\\"targetAnchorId\\\":\\\"160656278891560960_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1308,\\\"y\\\":140},{\\\"x\\\":1408,\\\"y\\\":140},{\\\"x\\\":1410,\\\"y\\\":304},{\\\"x\\\":1510,\\\"y\\\":304}]},{\\\"id\\\":\\\"166082001409372160\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160650416019521536\\\",\\\"targetNodeId\\\":\\\"code_166081977564753920\\\",\\\"sourceAnchorId\\\":\\\"160650416019521536_output\\\",\\\"targetAnchorId\\\":\\\"code_166081977564753920_input\\\",\\\"pointsList\\\":[{\\\"x\\\":864,\\\"y\\\":326},{\\\"x\\\":964,\\\"y\\\":326},{\\\"x\\\":876,\\\"y\\\":241},{\\\"x\\\":976,\\\"y\\\":241}]},{\\\"id\\\":\\\"166082017557442560\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_166081977564753920\\\",\\\"targetNodeId\\\":\\\"160656278891560960\\\",\\\"sourceAnchorId\\\":\\\"code_166081977564753920_output\\\",\\\"targetAnchorId\\\":\\\"160656278891560960_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1308,\\\"y\\\":241},{\\\"x\\\":1408,\\\"y\\\":241},{\\\"x\\\":1410,\\\"y\\\":304},{\\\"x\\\":1510,\\\"y\\\":304}]},{\\\"id\\\":\\\"166090719580614656\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160650416019521536\\\",\\\"targetNodeId\\\":\\\"code_166090618376253440\\\",\\\"sourceAnchorId\\\":\\\"160650416019521536_output\\\",\\\"targetAnchorId\\\":\\\"code_166090618376253440_input\\\",\\\"pointsList\\\":[{\\\"x\\\":864,\\\"y\\\":326},{\\\"x\\\":964,\\\"y\\\":326},{\\\"x\\\":876,\\\"y\\\":345},{\\\"x\\\":976,\\\"y\\\":345}]},{\\\"id\\\":\\\"166090725280673792\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_166090618376253440\\\",\\\"targetNodeId\\\":\\\"160656278891560960\\\",\\\"sourceAnchorId\\\":\\\"code_166090618376253440_output\\\",\\\"targetAnchorId\\\":\\\"160656278891560960_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1308,\\\"y\\\":345},{\\\"x\\\":1408,\\\"y\\\":345},{\\\"x\\\":1410,\\\"y\\\":304},{\\\"x\\\":1510,\\\"y\\\":304}]},{\\\"id\\\":\\\"167828303179567104\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160650416019521536\\\",\\\"targetNodeId\\\":\\\"code_167828303175372800\\\",\\\"sourceAnchorId\\\":\\\"160650416019521536_output\\\",\\\"targetAnchorId\\\":\\\"code_167828303175372800_input\\\",\\\"pointsList\\\":[{\\\"x\\\":864,\\\"y\\\":326},{\\\"x\\\":964,\\\"y\\\":326},{\\\"x\\\":877,\\\"y\\\":455},{\\\"x\\\":977,\\\"y\\\":455}]},{\\\"id\\\":\\\"167828639231397888\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_167828303175372800\\\",\\\"targetNodeId\\\":\\\"160656278891560960\\\",\\\"sourceAnchorId\\\":\\\"code_167828303175372800_output\\\",\\\"targetAnchorId\\\":\\\"160656278891560960_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1309,\\\"y\\\":455},{\\\"x\\\":1409,\\\"y\\\":455},{\\\"x\\\":1410,\\\"y\\\":304},{\\\"x\\\":1510,\\\"y\\\":304}]},{\\\"id\\\":\\\"167835393356877824\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160650416019521536\\\",\\\"targetNodeId\\\":\\\"code_167835393352683520\\\",\\\"sourceAnchorId\\\":\\\"160650416019521536_output\\\",\\\"targetAnchorId\\\":\\\"code_167835393352683520_input\\\",\\\"pointsList\\\":[{\\\"x\\\":864,\\\"y\\\":326},{\\\"x\\\":964,\\\"y\\\":326},{\\\"x\\\":876,\\\"y\\\":556},{\\\"x\\\":976,\\\"y\\\":556}]},{\\\"id\\\":\\\"167836988980817920\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_167835393352683520\\\",\\\"targetNodeId\\\":\\\"160656278891560960\\\",\\\"sourceAnchorId\\\":\\\"code_167835393352683520_output\\\",\\\"targetAnchorId\\\":\\\"160656278891560960_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1308,\\\"y\\\":556},{\\\"x\\\":1408,\\\"y\\\":556},{\\\"x\\\":1410,\\\"y\\\":304},{\\\"x\\\":1510,\\\"y\\\":304}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"}]}');\nINSERT INTO `airag_flow` VALUES ('1900021198960492546', 'jeecg', '2025-03-13 11:08:49', 'jeecg', '2025-03-19 19:26:36', 'A04', NULL, 'jeecg', '示例_直接回复节点', '', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/流程设计引擎_1742383594151.png', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'163122102386216960\\'),\\n    reply.tag(\\'163119312863678464\\'),\\n    llm.tag(\\'163122766768164864\\'),\\n    end.tag(\\'163119405809455104\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":232,\\\"y\\\":273,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"163119312863678464\\\",\\\"type\\\":\\\"reply\\\",\\\"x\\\":800,\\\"y\\\":225,\\\"properties\\\":{\\\"text\\\":\\\"直接回复\\\",\\\"options\\\":{\\\"content\\\":\\\"{{content}}\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"content\\\",\\\"nodeId\\\":\\\"163122102386216960\\\"}],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"163119405809455104\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1548,\\\"y\\\":254,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{resp}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"163122766768164864\\\"}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"163122102386216960\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":551,\\\"y\\\":553,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"根据用户的问题，以有趣的方式回答，如果可以的话请引用故事或经典说明。\\\\n\\\\n用中文回复。\\\\n\\\\n字数控制在200以内。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{content}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"163122766768164864\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1144,\\\"y\\\":412,\\\"properties\\\":{\\\"text\\\":\\\"nextQue\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"根据用户的问题和ai的回复，猜测用户下一次的问题可能有哪些，markdown格式回复。\\\\n格式：\\\\n\\\\\\\\n你可能还想知道：\\\\n* 问题一\\\\n* 问题二\\\\n。。。。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"用户问题：{{que}}\\\\nAI回复：{{res}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"que\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"163122102386216960\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":136,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"163122102390411264\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"163122102386216960\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"163122102386216960_input\\\",\\\"pointsList\\\":[{\\\"x\\\":398,\\\"y\\\":273},{\\\"x\\\":498,\\\"y\\\":273},{\\\"x\\\":285,\\\"y\\\":516},{\\\"x\\\":385,\\\"y\\\":516}]},{\\\"id\\\":\\\"163122147491762176\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"163122102386216960\\\",\\\"targetNodeId\\\":\\\"163119312863678464\\\",\\\"sourceAnchorId\\\":\\\"163122102386216960_output\\\",\\\"targetAnchorId\\\":\\\"163119312863678464_input\\\",\\\"pointsList\\\":[{\\\"x\\\":717,\\\"y\\\":516},{\\\"x\\\":817,\\\"y\\\":516},{\\\"x\\\":534,\\\"y\\\":225},{\\\"x\\\":634,\\\"y\\\":225}]},{\\\"id\\\":\\\"163122766772359168\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"163119312863678464\\\",\\\"targetNodeId\\\":\\\"163122766768164864\\\",\\\"sourceAnchorId\\\":\\\"163119312863678464_output\\\",\\\"targetAnchorId\\\":\\\"163122766768164864_input\\\",\\\"pointsList\\\":[{\\\"x\\\":966,\\\"y\\\":225},{\\\"x\\\":1066,\\\"y\\\":225},{\\\"x\\\":878,\\\"y\\\":375},{\\\"x\\\":978,\\\"y\\\":375}]},{\\\"id\\\":\\\"163123226145116160\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"163122766768164864\\\",\\\"targetNodeId\\\":\\\"163119405809455104\\\",\\\"sourceAnchorId\\\":\\\"163122766768164864_output\\\",\\\"targetAnchorId\\\":\\\"163119405809455104_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1310,\\\"y\\\":375},{\\\"x\\\":1410,\\\"y\\\":375},{\\\"x\\\":1282,\\\"y\\\":254},{\\\"x\\\":1382,\\\"y\\\":254}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"}]}');\nINSERT INTO `airag_flow` VALUES ('1900029596154232833', 'jeecg', '2025-03-13 11:42:11', 'jeecg', '2025-03-27 18:11:02', 'A04', NULL, 'jeecg', '示例_http节点', '', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/流程设计(1)_1742383583093.png', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    http.tag(\\'163206941950185472\\'),\\n    SWITCH(switch.tag(\\'163207852529389568\\')).to(\\n        THEN(\\n            http.tag(\\'163128964742746112\\'),\\n            SWITCH(switch.tag(\\'168299837777608704\\')).to(\\n                end.tag(\\'163129833764786176\\'),\\n                end.tag(\\'168300140241453056\\')\\n            ).tag(\\'168299837777608704\\')\\n        ).tag(\\\"163128964742746112\\\"),\\n        end.tag(\\'163208186282741760\\')\\n    ).tag(\\'163207852529389568\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":51.13043478260868,\\\"y\\\":342.804347826087,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"大萨达撒\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":89,\\\"width\\\":332}},{\\\"id\\\":\\\"163128964742746112\\\",\\\"type\\\":\\\"http\\\",\\\"x\\\":859.0869565217391,\\\"y\\\":192.2173913043478,\\\"properties\\\":{\\\"text\\\":\\\"HTTP 请求 查询\\\",\\\"options\\\":{\\\"http\\\":{\\\"url\\\":\\\"{{domainURL}}/test/jeecgDemo/list\\\",\\\"method\\\":\\\"GET\\\",\\\"headers\\\":{},\\\"requestBody\\\":{\\\"type\\\":\\\"none\\\",\\\"body\\\":\\\"\\\"},\\\"requestParams\\\":{\\\"name\\\":\\\"{{name}}\\\",\\\"pageNo\\\":\\\"1\\\",\\\"pageSize\\\":\\\"10\\\"},\\\"timeout\\\":120}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"name\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"body\\\",\\\"name\\\":\\\"输出\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"statusCode\\\",\\\"name\\\":\\\"状态码\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"body.success\\\",\\\"name\\\":\\\"是否成功\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"body.result.records[0].id\\\",\\\"name\\\":\\\"id\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"163129833764786176\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1386.5217391304348,\\\"y\\\":164.08695652173913,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"新增的用户Id：{{id}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"body.result.records[0].id\\\",\\\"name\\\":\\\"id\\\",\\\"nodeId\\\":\\\"163128964742746112\\\"}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"163206941950185472\\\",\\\"type\\\":\\\"http\\\",\\\"x\\\":320.1304347826087,\\\"y\\\":474.2173913043478,\\\"properties\\\":{\\\"text\\\":\\\"HTTP 请求\\\",\\\"options\\\":{\\\"http\\\":{\\\"url\\\":\\\"{{domainURL}}/test/jeecgDemo/add\\\",\\\"method\\\":\\\"POST\\\",\\\"headers\\\":{},\\\"requestBody\\\":{\\\"type\\\":\\\"json\\\",\\\"body\\\":\\\"{\\\\n  \\\\\\\"name\\\\\\\": \\\\\\\"{{name}}\\\\\\\",\\\\n  \\\\\\\"keyWord\\\\\\\": \\\\\\\"example\\\\\\\",\\\\n  \\\\\\\"punchTime\\\\\\\": \\\\\\\"2023-10-05 14:48:00\\\\\\\",\\\\n  \\\\\\\"salaryMoney\\\\\\\": 1000.00,\\\\n  \\\\\\\"bonusMoney\\\\\\\": 500.0,\\\\n  \\\\\\\"sex\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n  \\\\\\\"age\\\\\\\": 30,\\\\n  \\\\\\\"birthday\\\\\\\": \\\\\\\"2023-10-05\\\\\\\",\\\\n  \\\\\\\"email\\\\\\\": \\\\\\\"john.doe@example.com\\\\\\\",\\\\n  \\\\\\\"content\\\\\\\": \\\\\\\"This is a test content.\\\\\\\",\\\\n}\\\"},\\\"requestParams\\\":{},\\\"timeout\\\":120}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"name\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"statusCode\\\",\\\"name\\\":\\\"code\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"body\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"163207852529389568\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":510.78260869565224,\\\"y\\\":302.73913043478257,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"163206941950185472\\\",\\\"field\\\":\\\"statusCode\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"200\\\"}],\\\"next\\\":\\\"163128964742746112\\\"}],\\\"else\\\":{\\\"next\\\":\\\"163208186282741760\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"height\\\":118,\\\"width\\\":332}},{\\\"id\\\":\\\"163208186282741760\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":745.7826086956521,\\\"y\\\":448.0869565217391,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"添加数据失败\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"168299837777608704\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":1029.173913043478,\\\"y\\\":314.78260869565213,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"163128964742746112\\\",\\\"field\\\":\\\"body.success\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"true\\\"}],\\\"next\\\":\\\"163129833764786176\\\"}],\\\"else\\\":{\\\"next\\\":\\\"168300140241453056\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"height\\\":118,\\\"width\\\":332}},{\\\"id\\\":\\\"168300140241453056\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1389.2608695652173,\\\"y\\\":419.8695652173913,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"添加用户失败\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"163206941954379776\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"163206941950185472\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"163206941950185472_input\\\",\\\"pointsList\\\":[{\\\"x\\\":217.1304347826091,\\\"y\\\":329.304347826087},{\\\"x\\\":317.1304347826091,\\\"y\\\":329.304347826087},{\\\"x\\\":54.13043478260869,\\\"y\\\":474.2173913043478},{\\\"x\\\":154.1304347826087,\\\"y\\\":474.2173913043478}]},{\\\"id\\\":\\\"163207852533583872\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"163206941950185472\\\",\\\"targetNodeId\\\":\\\"163207852529389568\\\",\\\"sourceAnchorId\\\":\\\"163206941950185472_output\\\",\\\"targetAnchorId\\\":\\\"163207852529389568_input\\\",\\\"pointsList\\\":[{\\\"x\\\":486.13043478260863,\\\"y\\\":474.2173913043478},{\\\"x\\\":586.1304347826085,\\\"y\\\":474.2173913043478},{\\\"x\\\":244.78260869565224,\\\"y\\\":274.73913043478257},{\\\"x\\\":344.78260869565224,\\\"y\\\":274.73913043478257}]},{\\\"id\\\":\\\"163208000881922048\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"163207852529389568\\\",\\\"targetNodeId\\\":\\\"163128964742746112\\\",\\\"sourceAnchorId\\\":\\\"163207852529389568_source_if\\\",\\\"targetAnchorId\\\":\\\"163128964742746112_input\\\",\\\"pointsList\\\":[{\\\"x\\\":676.7826086956521,\\\"y\\\":308.73913043478257},{\\\"x\\\":776.7826086956521,\\\"y\\\":308.73913043478257},{\\\"x\\\":593.0869565217391,\\\"y\\\":192.2173913043478},{\\\"x\\\":693.0869565217391,\\\"y\\\":192.2173913043478}]},{\\\"id\\\":\\\"163208186286936064\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"163207852529389568\\\",\\\"targetNodeId\\\":\\\"163208186282741760\\\",\\\"sourceAnchorId\\\":\\\"163207852529389568_source_else\\\",\\\"targetAnchorId\\\":\\\"163208186282741760_input\\\",\\\"pointsList\\\":[{\\\"x\\\":676.7826086956521,\\\"y\\\":334.73913043478257},{\\\"x\\\":776.7826086956521,\\\"y\\\":334.73913043478257},{\\\"x\\\":479.78260869565213,\\\"y\\\":448.0869565217391},{\\\"x\\\":579.7826086956521,\\\"y\\\":448.0869565217391}]},{\\\"id\\\":\\\"168299837781803008\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"163128964742746112\\\",\\\"targetNodeId\\\":\\\"168299837777608704\\\",\\\"sourceAnchorId\\\":\\\"163128964742746112_output\\\",\\\"targetAnchorId\\\":\\\"168299837777608704_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1025.086956521739,\\\"y\\\":192.2173913043478},{\\\"x\\\":1125.0869565217386,\\\"y\\\":192.2173913043478},{\\\"x\\\":763.173913043478,\\\"y\\\":286.78260869565213},{\\\"x\\\":863.173913043478,\\\"y\\\":286.78260869565213}]},{\\\"id\\\":\\\"168300025623707648\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168299837777608704\\\",\\\"targetNodeId\\\":\\\"163129833764786176\\\",\\\"sourceAnchorId\\\":\\\"168299837777608704_source_if\\\",\\\"targetAnchorId\\\":\\\"163129833764786176_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1195.1739130434776,\\\"y\\\":320.78260869565213},{\\\"x\\\":1295.1739130434776,\\\"y\\\":320.78260869565213},{\\\"x\\\":1120.5217391304348,\\\"y\\\":164.08695652173913},{\\\"x\\\":1220.5217391304348,\\\"y\\\":164.08695652173913}]},{\\\"id\\\":\\\"168300140245647360\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168299837777608704\\\",\\\"targetNodeId\\\":\\\"168300140241453056\\\",\\\"sourceAnchorId\\\":\\\"168299837777608704_source_else\\\",\\\"targetAnchorId\\\":\\\"168300140241453056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1195.1739130434776,\\\"y\\\":346.78260869565213},{\\\"x\\\":1295.1739130434776,\\\"y\\\":346.78260869565213},{\\\"x\\\":1123.2608695652173,\\\"y\\\":419.8695652173913},{\\\"x\\\":1223.2608695652173,\\\"y\\\":419.8695652173913}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"}]}');\nINSERT INTO `airag_flow` VALUES ('1902263524520935425', 'jeecg', '2025-03-19 15:39:01', 'jeecg', '2025-03-27 16:56:10', 'A04', NULL, 'jeecg', '示例_图片解读', '', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/工具-图片解析_1743065064801.png', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'165363942517174272\\'),\\n    llm.tag(\\'168280528419778560\\'),\\n    end.tag(\\'165364368465522688\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":457,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"165363942517174272\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":675,\\\"y\\\":341,\\\"properties\\\":{\\\"text\\\":\\\"图片解读\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你是一个图像分析专家，负责解读和解释用户发送的图片。请根据以下要求进行分析：\\\\n\\\\n## 目标：\\\\n分析并解释图片的意义，提供详细的解读和背景信息。\\\\n\\\\n## 技能：\\\\n1. 视觉识别能力：能够识别图像中的元素及其关系。\\\\n2. 上下文理解能力：结合文化、历史、艺术等背景知识进行深度解读。\\\\n3. 清晰表达能力：用简洁明了的语言传达分析结果。\\\\n\\\\n## 工作流：\\\\n1. 识别图片中的主要元素，描述它们的外观和特征。\\\\n2. 分析这些元素之间的关系及其在整体构图中的作用。\\\\n3. 提供与图片相关的背景信息，探讨其潜在意义和影响。\\\\n\\\\n## 输出格式：\\\\n- 图片元素描述\\\\n- 元素关系分析\\\\n- 背景信息与意义解释\\\\n\\\\n## 限制：\\\\n- 不提供主观判断，仅基于客观分析进行解释。\\\\n- 不涉及任何隐私或敏感内容的讨论。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"分析并解释图片的意义，提供详细的解读和背景信息。\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"que\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"images\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"165364368465522688\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1520,\\\"y\\\":426,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{resp}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"168280528419778560\\\"}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"168280528419778560\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1063,\\\"y\\\":588,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你将扮演一个故事创作者，以下是关于这个角色的详细设定，请根据这些信息来构建你的回答。\\\\n\\\\n**人物基本信息：**\\\\n- 你是：一个富有想象力和创造力的故事编写者\\\\n- 人称：第一人称\\\\n- 出身背景与上下文：擅长根据不同的元素与情境构建引人入胜的故事，灵感来源于观察与分析\\\\n**性格特点：**\\\\n- 富有创造力\\\\n- 敏感细腻\\\\n- 善于捕捉细节\\\\n**语言风格：**\\\\n- 优雅而富有表现力，能够生动描绘场景与人物情感\\\\n**人际关系：**\\\\n- 与其他艺术创作者合作，互相激励\\\\n**过往经历：**\\\\n- 多次参与文学比赛并获奖，积累了丰富的创作经验\\\\n**经典台词或口头禅：**\\\\n- \\\\\\\"每一个画面背后都有一个故事在等待被讲述。\\\\\\\"\\\\n- \\\\\\\"细节决定成败。\\\\\\\"\\\\n\\\\n要求： \\\\n- 故事应围绕从图片分析得出的主题和情感进行展开。\\\\n- 包含鲜明的人物、情节以及转折。\\\\n- 语言生动形象，能够引起读者的共鸣。\\\\n- 直接讲故事，不要提及图片。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{readImg}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"readImg\\\",\\\"nodeId\\\":\\\"165363942517174272\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":136,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"165363942525562880\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"165363942517174272\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"165363942517174272_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":457},{\\\"x\\\":566,\\\"y\\\":457},{\\\"x\\\":409,\\\"y\\\":304},{\\\"x\\\":509,\\\"y\\\":304}]},{\\\"id\\\":\\\"168280528428167168\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"165363942517174272\\\",\\\"targetNodeId\\\":\\\"168280528419778560\\\",\\\"sourceAnchorId\\\":\\\"165363942517174272_output\\\",\\\"targetAnchorId\\\":\\\"168280528419778560_input\\\",\\\"pointsList\\\":[{\\\"x\\\":841,\\\"y\\\":304},{\\\"x\\\":941,\\\"y\\\":304},{\\\"x\\\":797,\\\"y\\\":551},{\\\"x\\\":897,\\\"y\\\":551}]},{\\\"id\\\":\\\"168280631234752512\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168280528419778560\\\",\\\"targetNodeId\\\":\\\"165364368465522688\\\",\\\"sourceAnchorId\\\":\\\"168280528419778560_output\\\",\\\"targetAnchorId\\\":\\\"165364368465522688_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1229,\\\"y\\\":551},{\\\"x\\\":1329,\\\"y\\\":551},{\\\"x\\\":1254,\\\"y\\\":426},{\\\"x\\\":1354,\\\"y\\\":426}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\"}]}');\nINSERT INTO `airag_flow` VALUES ('1904779811574784002', 'jeecg', '2025-03-26 14:17:51', 'jeecg', '2025-03-27 16:44:53', 'A04', NULL, 'jeecg', '示例_OCR', '', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/1dataOCR_1743065089791.png', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'167880707187527680\\')).to(\\n        end.tag(\\'167880856269869056\\'),\\n        THEN(\\n            code_167881149430747136.tag(\\'code_167881149430747136\\'),\\n            llm.tag(\\'167881839356006400\\'),\\n            end.tag(\\'167880661561888768\\')\\n        ).tag(\\\"code_167881149430747136\\\")\\n    ).tag(\\'167880707187527680\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":406,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"167880661561888768\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1474,\\\"y\\\":316,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"data\\\",\\\"nodeId\\\":\\\"167881839356006400\\\"}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"167880707187527680\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":681,\\\"y\\\":233,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"images\\\",\\\"operator\\\":\\\"EMPTY\\\",\\\"value\\\":\\\"\\\"}],\\\"next\\\":\\\"167880856269869056\\\"}],\\\"else\\\":{\\\"next\\\":\\\"code_167881149430747136\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"height\\\":118,\\\"width\\\":332}},{\\\"id\\\":\\\"167880856269869056\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1207,\\\"y\\\":181,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{\\\\n    \\\\\\\"message\\\\\\\": \\\\\\\"请提供图片\\\\\\\"\\\\n  }\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"code_167881149430747136\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":937,\\\"y\\\":412,\\\"properties\\\":{\\\"text\\\":\\\"脚本执行\\\",\\\"options\\\":{\\\"codeType\\\":\\\"javascript\\\",\\\"code\\\":\\\"function main(params) {\\\\n  let newQuestion = params.question\\\\n  if(!params.question){\\\\n    newQuestion = \\\\\\\"从图片中提取文字\\\\\\\"\\\\n  }\\\\n  return {\\\\n    result: newQuestion,\\\\n  }\\\\n}\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"167881839356006400\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1319,\\\"y\\\":585,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：OCR工具\\\\n作为一个智能OCR工具，你的主要职责是从图片中提取文字并将其输出为结构化数据。\\\\n\\\\n## 目标：\\\\n1. 精确识别和提取图片中的文字信息。\\\\n2. 将提取的文字转换为结构化数据格式。\\\\n\\\\n## 技能：\\\\n1. 高效的图像处理能力。\\\\n2. 精确的文字识别算法。\\\\n3. 数据格式化与输出能力。\\\\n\\\\n## 工作流：\\\\n1. 输入图片，进行预处理（如去噪、二值化）。\\\\n2. 应用OCR算法识别图片中的文字，并记录识别结果。\\\\n3. 将识别的文字整理成结构化数据格式，如JSON或CSV。\\\\n\\\\n## 输出格式：\\\\n提取的文本应以结构化数据格式输出，如：\\\\n{\\\\n    \\\\\\\"text\\\\\\\": \\\\\\\"提取的内容\\\\\\\",\\\\n    \\\\\\\"metadata\\\\\\\": {\\\\\\\"source\\\\\\\": \\\\\\\"图片来源\\\\\\\", \\\\\\\"timestamp\\\\\\\": \\\\\\\"提取时间\\\\\\\"}\\\\n  }\\\\n\\\\n## 限制：\\\\n- 仅限于合法和合规的图片内容提取。\\\\n- 不得保存用户上传的图片数据。\\\\n- 需确保输出的数据准确无误，标注所有数据来源。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"images\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"code_167881149430747136\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":136,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"167880707195916288\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"167880707187527680\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"167880707187527680_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":406},{\\\"x\\\":566,\\\"y\\\":406},{\\\"x\\\":415,\\\"y\\\":205},{\\\"x\\\":515,\\\"y\\\":205}]},{\\\"id\\\":\\\"167880856274063360\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"167880707187527680\\\",\\\"targetNodeId\\\":\\\"167880856269869056\\\",\\\"sourceAnchorId\\\":\\\"167880707187527680_source_if\\\",\\\"targetAnchorId\\\":\\\"167880856269869056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":847,\\\"y\\\":239},{\\\"x\\\":947,\\\"y\\\":239},{\\\"x\\\":941,\\\"y\\\":181},{\\\"x\\\":1041,\\\"y\\\":181}]},{\\\"id\\\":\\\"167881149434941440\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"167880707187527680\\\",\\\"targetNodeId\\\":\\\"code_167881149430747136\\\",\\\"sourceAnchorId\\\":\\\"167880707187527680_source_else\\\",\\\"targetAnchorId\\\":\\\"code_167881149430747136_input\\\",\\\"pointsList\\\":[{\\\"x\\\":847,\\\"y\\\":265},{\\\"x\\\":947,\\\"y\\\":265},{\\\"x\\\":671,\\\"y\\\":412},{\\\"x\\\":771,\\\"y\\\":412}]},{\\\"id\\\":\\\"167881839356006401\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_167881149430747136\\\",\\\"targetNodeId\\\":\\\"167881839356006400\\\",\\\"sourceAnchorId\\\":\\\"code_167881149430747136_output\\\",\\\"targetAnchorId\\\":\\\"167881839356006400_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1103,\\\"y\\\":412},{\\\"x\\\":1203,\\\"y\\\":412},{\\\"x\\\":1053,\\\"y\\\":548},{\\\"x\\\":1153,\\\"y\\\":548}]},{\\\"id\\\":\\\"167882293611712512\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"167881839356006400\\\",\\\"targetNodeId\\\":\\\"167880661561888768\\\",\\\"sourceAnchorId\\\":\\\"167881839356006400_output\\\",\\\"targetAnchorId\\\":\\\"167880661561888768_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1485,\\\"y\\\":548},{\\\"x\\\":1585,\\\"y\\\":548},{\\\"x\\\":1208,\\\"y\\\":316},{\\\"x\\\":1308,\\\"y\\\":316}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"data\\\",\\\"nodeId\\\":\\\"167881839356006400\\\"},{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\"}]}');\nINSERT INTO `airag_flow` VALUES ('1905158829855784962', 'jeecg', '2025-03-27 15:23:56', 'jeecg', '2025-03-27 16:29:22', 'A04', NULL, 'jeecg', '示例_翻译', '', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/翻译_1743060940605.png', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'168262809717821440\\')).to(\\n        end.tag(\\'168259683329757184\\'),\\n        THEN(\\n            SWITCH(classifier.tag(\\'168263048935755776\\')).to(\\n                llm.tag(\\'168263321821368320\\'),\\n                llm.tag(\\'168263346282549248\\')\\n            ).tag(\\'168263048935755776\\'),\\n            end.tag(\\'168263794896916480\\')\\n        ).tag(\\\"168263048935755776\\\")\\n    ).tag(\\'168262809717821440\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":457,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"168259683329757184\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1090,\\\"y\\\":150,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"data\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"height\\\":62,\\\"width\\\":332}},{\\\"id\\\":\\\"168262809717821440\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":701,\\\"y\\\":281,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"operator\\\":\\\"EMPTY\\\",\\\"value\\\":\\\"\\\"}],\\\"next\\\":\\\"168259683329757184\\\"}],\\\"else\\\":{\\\"next\\\":\\\"168263048935755776\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"height\\\":118,\\\"width\\\":332}},{\\\"id\\\":\\\"168263048935755776\\\",\\\"type\\\":\\\"classifier\\\",\\\"x\\\":1086,\\\"y\\\":381,\\\"properties\\\":{\\\"text\\\":\\\"分类器\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.2}},\\\"categories\\\":[{\\\"category\\\":\\\"是中文\\\",\\\"next\\\":\\\"168263321821368320\\\"}],\\\"else\\\":{\\\"next\\\":\\\"168263346282549248\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"分类内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":118,\\\"width\\\":332}},{\\\"id\\\":\\\"168263321821368320\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1513,\\\"y\\\":292,\\\"properties\\\":{\\\"text\\\":\\\"翻译成英文\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.3}},\\\"history\\\":1,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"将用户输入完整翻译成英文，包括所有语气词和重复表达\\\\n- 严格保留原始语序和强调成分\\\\n- 禁止省略任何字词或改变语气强度\\\\n- 直接输出翻译结果不做解释\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{content}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"168263346282549248\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1514,\\\"y\\\":489,\\\"properties\\\":{\\\"text\\\":\\\"翻译成中文\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.3}},\\\"history\\\":1,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"将用户输入完整翻译成中文，包括所有语气词和重复表达\\\\n- 严格保留原始语序和强调成分\\\\n- 禁止省略任何字词或改变语气强度\\\\n- 直接输出翻译结果不做解释\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{content}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"168263794896916480\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1982,\\\"y\\\":360,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{dataC}}{{dataE}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"dataC\\\",\\\"nodeId\\\":\\\"168263346282549248\\\"},{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"dataE\\\",\\\"nodeId\\\":\\\"168263321821368320\\\"}],\\\"height\\\":62,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"168262809722015744\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"168262809717821440\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"168262809717821440_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":457},{\\\"x\\\":566,\\\"y\\\":457},{\\\"x\\\":435,\\\"y\\\":253},{\\\"x\\\":535,\\\"y\\\":253}]},{\\\"id\\\":\\\"168262871336341504\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168262809717821440\\\",\\\"targetNodeId\\\":\\\"168259683329757184\\\",\\\"sourceAnchorId\\\":\\\"168262809717821440_source_if\\\",\\\"targetAnchorId\\\":\\\"168259683329757184_input\\\",\\\"pointsList\\\":[{\\\"x\\\":867,\\\"y\\\":287},{\\\"x\\\":967,\\\"y\\\":287},{\\\"x\\\":824,\\\"y\\\":150},{\\\"x\\\":924,\\\"y\\\":150}]},{\\\"id\\\":\\\"168263048939950080\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168262809717821440\\\",\\\"targetNodeId\\\":\\\"168263048935755776\\\",\\\"sourceAnchorId\\\":\\\"168262809717821440_source_else\\\",\\\"targetAnchorId\\\":\\\"168263048935755776_input\\\",\\\"pointsList\\\":[{\\\"x\\\":867,\\\"y\\\":313},{\\\"x\\\":967,\\\"y\\\":313},{\\\"x\\\":820,\\\"y\\\":353},{\\\"x\\\":920,\\\"y\\\":353}]},{\\\"id\\\":\\\"168263321825562624\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168263048935755776\\\",\\\"targetNodeId\\\":\\\"168263321821368320\\\",\\\"sourceAnchorId\\\":\\\"168263048935755776_case_1\\\",\\\"targetAnchorId\\\":\\\"168263321821368320_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1252,\\\"y\\\":387},{\\\"x\\\":1352,\\\"y\\\":387},{\\\"x\\\":1247,\\\"y\\\":255},{\\\"x\\\":1347,\\\"y\\\":255}]},{\\\"id\\\":\\\"168263346286743552\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168263048935755776\\\",\\\"targetNodeId\\\":\\\"168263346282549248\\\",\\\"sourceAnchorId\\\":\\\"168263048935755776_case_else\\\",\\\"targetAnchorId\\\":\\\"168263346282549248_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1252,\\\"y\\\":413},{\\\"x\\\":1352,\\\"y\\\":413},{\\\"x\\\":1248,\\\"y\\\":452},{\\\"x\\\":1348,\\\"y\\\":452}]},{\\\"id\\\":\\\"168263794901110784\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168263346282549248\\\",\\\"targetNodeId\\\":\\\"168263794896916480\\\",\\\"sourceAnchorId\\\":\\\"168263346282549248_output\\\",\\\"targetAnchorId\\\":\\\"168263794896916480_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1680,\\\"y\\\":452},{\\\"x\\\":1780,\\\"y\\\":452},{\\\"x\\\":1716,\\\"y\\\":360},{\\\"x\\\":1816,\\\"y\\\":360}]},{\\\"id\\\":\\\"168263831215394816\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168263321821368320\\\",\\\"targetNodeId\\\":\\\"168263794896916480\\\",\\\"sourceAnchorId\\\":\\\"168263321821368320_output\\\",\\\"targetAnchorId\\\":\\\"168263794896916480_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1679,\\\"y\\\":255},{\\\"x\\\":1779,\\\"y\\\":255},{\\\"x\\\":1716,\\\"y\\\":360},{\\\"x\\\":1816,\\\"y\\\":360}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"data\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"}]}');\nINSERT INTO `airag_flow` VALUES ('1905189468558671874', 'jeecg', '2025-03-27 17:25:41', 'jeecg', '2025-03-27 17:40:51', 'A04', NULL, 'jeecg', '示例_PMP考试宝典', '', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/pmp_1743067580648.png', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    WHEN(\\n        knowledge.tag(\\'168290518600351744\\'),\\n        llm.tag(\\'168290871702028288\\')\\n    ).tag(\\\"168290518600351744\\\"),\\n    llm.tag(\\'168290861241434112\\'),\\n    end.tag(\\'168290315671535616\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":397,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"168290315671535616\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1644,\\\"y\\\":348,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{res}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"168290861241434112\\\"}],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"168290518600351744\\\",\\\"type\\\":\\\"knowledge\\\",\\\"x\\\":693,\\\"y\\\":209,\\\"properties\\\":{\\\"text\\\":\\\"知识库\\\",\\\"options\\\":{\\\"knowIds\\\":[\\\"1905186756806918146\\\"],\\\"topNumber\\\":5,\\\"similarity\\\":0.7},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"documents\\\",\\\"name\\\":\\\"文档列表\\\",\\\"type\\\":\\\"object[]\\\"},{\\\"field\\\":\\\"data\\\",\\\"name\\\":\\\"文档内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"168290861241434112\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1181,\\\"y\\\":350,\\\"properties\\\":{\\\"text\\\":\\\"总结LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.4}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你是一个智能知识助手，旨在综合知识库和大型语言模型(LLM)的返回数据，以高效、准确地回答用户提出的问题。请遵循以下要求：\\\\n\\\\n## 目标：\\\\n- 提供准确、相关且易于理解的回答，结合知识库和LLM的信息。\\\\n\\\\n## 技能：\\\\n1. 能够快速检索并整合来自不同知识库的信息。\\\\n2. 理解用户问题的上下文，并提供清晰的答案。\\\\n3. 具备自然语言处理能力，以便流畅表达复杂信息。\\\\n\\\\n## 工作流：\\\\n1. 接收用户问题并进行解析，识别关键要素。\\\\n2. 从综合知识库和LLM中获取相关数据，确保信息的准确性和完整性。\\\\n3. 将获取的信息进行整合，形成清晰、简洁的回答。\\\\n\\\\n## 输出格式：\\\\n- 每次回答应以简洁明了的句子呈现，必要时可以添加示例或补充信息。\\\\n\\\\n## 限制：\\\\n- 不得提供未经验证的信息或个人隐私数据。\\\\n- 所有数据需标注来源，不确定信息用[需核实]标记。\\\\n- 自动过滤涉及偏见或违法内容，替换为[合规表达]。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"知识库返回数据：{{knowRes}}\\\\n\\\\nLLM返回数据：{{llmRes}}\\\\n用户问题：{{userQue}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"data\\\",\\\"name\\\":\\\"knowRes\\\",\\\"nodeId\\\":\\\"168290518600351744\\\"},{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"llmRes\\\",\\\"nodeId\\\":\\\"168290871702028288\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"userQue\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":166,\\\"width\\\":332}},{\\\"id\\\":\\\"168290871702028288\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":692,\\\"y\\\":521,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：PMP知识专家\\\\nPMP知识专家致力于项目管理知识的传播与应用，帮助项目经理提升技能和管理能力。\\\\n\\\\n## 目标：\\\\n1. 为项目管理提供权威的知识支持。\\\\n2. 帮助项目经理解决在项目管理中遇到的实际问题。\\\\n\\\\n## 技能：\\\\n1. 精通项目管理的各项理论和工具。\\\\n2. 熟悉PMP认证流程及考试内容。\\\\n3. 能够进行项目风险评估与管理。\\\\n\\\\n## 工作流：\\\\n1. 评估项目经理的需求与挑战，识别关键问题。\\\\n2. 提供相关的项目管理知识、工具和最佳实践建议。\\\\n3. 指导项目经理制定和实施有效的项目管理计划。\\\\n\\\\n## 输出格式：\\\\n- 提供清晰的建议与解决方案，使用简洁明了的语言，适合项目经理理解和应用。\\\\n\\\\n## 限制：\\\\n- 所有建议需基于现有的PMP知识体系，避免个人主观意见。\\\\n- 不得提供未经验证的信息或数据，所有数据需标注来源，需核实的信息用[需核实]标记。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":166,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"168290518604546048\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"168290518600351744\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"168290518600351744_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":382},{\\\"x\\\":566,\\\"y\\\":382},{\\\"x\\\":427,\\\"y\\\":194},{\\\"x\\\":527,\\\"y\\\":194}]},{\\\"id\\\":\\\"168290861245628416\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168290518600351744\\\",\\\"targetNodeId\\\":\\\"168290861241434112\\\",\\\"sourceAnchorId\\\":\\\"168290518600351744_output\\\",\\\"targetAnchorId\\\":\\\"168290861241434112_input\\\",\\\"pointsList\\\":[{\\\"x\\\":859,\\\"y\\\":194},{\\\"x\\\":959,\\\"y\\\":194},{\\\"x\\\":915,\\\"y\\\":298},{\\\"x\\\":1015,\\\"y\\\":298}]},{\\\"id\\\":\\\"168290871706222592\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"168290871702028288\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"168290871702028288_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":382},{\\\"x\\\":566,\\\"y\\\":382},{\\\"x\\\":426,\\\"y\\\":469},{\\\"x\\\":526,\\\"y\\\":469}]},{\\\"id\\\":\\\"168291272883011584\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168290871702028288\\\",\\\"targetNodeId\\\":\\\"168290861241434112\\\",\\\"sourceAnchorId\\\":\\\"168290871702028288_output\\\",\\\"targetAnchorId\\\":\\\"168290861241434112_input\\\",\\\"pointsList\\\":[{\\\"x\\\":858,\\\"y\\\":469},{\\\"x\\\":958,\\\"y\\\":469},{\\\"x\\\":915,\\\"y\\\":298},{\\\"x\\\":1015,\\\"y\\\":298}]},{\\\"id\\\":\\\"168292930635530240\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"168290861241434112\\\",\\\"targetNodeId\\\":\\\"168290315671535616\\\",\\\"sourceAnchorId\\\":\\\"168290861241434112_output\\\",\\\"targetAnchorId\\\":\\\"168290315671535616_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1347,\\\"y\\\":298},{\\\"x\\\":1447,\\\"y\\\":298},{\\\"x\\\":1378,\\\"y\\\":333},{\\\"x\\\":1478,\\\"y\\\":333}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"}]}');\n\n-- ----------------------------\n-- Table structure for airag_knowledge\n-- ----------------------------\nCREATE TABLE `airag_knowledge`  (\n                                    `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n                                    `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n                                    `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n                                    `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人',\n                                    `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n                                    `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '所属部门',\n                                    `tenant_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '租户id',\n                                    `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '知识库名称',\n                                    `descr` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '描述',\n                                    `embed_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '向量模型id',\n                                    `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '状态',\n                                    PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of airag_knowledge\n-- ----------------------------\nINSERT INTO `airag_knowledge` VALUES ('1897212906878009346', 'jeecg', '2025-03-05 17:09:40', NULL, NULL, 'A04', NULL, '积木报表文档', '积木报表文档', '1891459707122499586', 'enable');\nINSERT INTO `airag_knowledge` VALUES ('1897926563148648449', 'jeecg', '2025-03-07 16:25:29', 'jeecg', '2025-03-11 10:04:25', 'A04', NULL, 'JeecgBoot文档', 'JeecgBoot文档', '1891459707122499586', 'enable');\nINSERT INTO `airag_knowledge` VALUES ('1905186756806918146', 'jeecg', '2025-03-27 17:14:54', NULL, NULL, 'A04', NULL, 'PMP', NULL, '1891459707122499586', 'enable');\n\n-- ----------------------------\n-- Table structure for airag_knowledge_doc\n-- ----------------------------\nCREATE TABLE `airag_knowledge_doc`  (\n                                        `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n                                        `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n                                        `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n                                        `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人',\n                                        `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n                                        `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '所属部门',\n                                        `tenant_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '租户id',\n                                        `knowledge_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '知识库id',\n                                        `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '标题',\n                                        `type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '类型',\n                                        `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '内容',\n                                        `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '状态',\n                                        `metadata` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '元数据',\n                                        PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of airag_knowledge_doc\n-- ----------------------------\nINSERT INTO `airag_knowledge_doc` VALUES ('1897213100944261121', 'jeecg', '2025-03-05 17:10:26', 'admin', '2025-04-02 23:53:30', 'A04', NULL, '1897212906878009346', 'qa', 'text', '常见问题\\n遇到问题请先升级至最新版，仍未解决可向团队反馈 点击反馈问题\\n\\n1. 积木报表是免费吗？\\n回答： 积木报表代码不开源，但是功能可以免费使用。\\n\\n大屏支持离线安装，积木BI的推出，可以永久免费使用。\\n针对公司用户我们提供企业版，免费版本也会持续发布。\\n2. 功能操作提示 没有权限，请联系管理员分配权限！\\n回答：这是因为报表针对敏感接口加了角色和权限控制，需要进行内置角色权限集成，具体见文档权限集成配置(重要)\\n\\n3. 积木报表怎么独立运行？\\nDocker方式启动\\n集成Demo启动\\n4. 启动报mongo错误\\n启动报错：\\norg.mongodb.driver.cluster : Exception in monitor thread while connecting to \\nserver localhost:27017 while accessing MongoDB with Java\\n\\n解决方案： 排除mongo启动默认加载 MongoAutoConfiguration\\n@SpringBootApplication\\n@EnableAutoConfiguration(exclude={MongoAutoConfiguration.class})\\n\\n5. 报表配置JeecgBoot菜单\\n{{ window._CONFIG[\\'domianURL\\'] }}/jmreport/list?token=${token}\\n\\n参数说明\\n\\n{{ window._CONFIG[\\'domianURL\\'] }} ：后台项目访问地址\\n${token} ：登录token用于权限控制\\n前端组件：layouts/IframePageView 菜单配置截图\\n\\n\\n6. 积木报表数据源支持哪些数据库？\\n数据库\t支持\\nMySQL\t√\\nOracle、Oracle9i\t√\\nSqlServer、SqlServer2012\t√\\nPostgreSQL\t√\\nDB2、Informix\t√\\nMariaDB\t√\\nSQLite、Hsqldb、Derby、H2\t√\\n达梦、人大金仓、神通\t√\\n华为高斯、虚谷、瀚高数据库、 TDengine 涛思数据\t√\\n阿里云PolarDB、PPAS、HerdDB\t√\\nHive、HBase、CouchBase\t√\\n导入Excel、csv、json文件数据集\t√\\nsqllite、TiDB、Doris、clickhouse、 MongoDB-BI\t√\\nelasticsearch、mogodb\t√\\n积木平台暂时只提供mysql脚本，其他数据库请自转 Navicat工具mysql转库oracle步骤\\n7. API数据源怎样实现条件查询？\\n具体请看查询条件设置\\n\\n8.报表集成到自己的springboot项目\\n请求参数如果后台接收的实体属性里没有，后台报错：not marked as ignorable\\n\\n\\n\\n解决方法：增加application.yml的配置jackson.fail_on_unknown_properties: false\\n\\n\\n\\n9.积木报表SQL数据集中sql语句加上limit在数据预览中报错?\\nsql语句写法:\\n\\n 报错截图：\\n\\n\\n\\n原因是sql语句末尾加上了limit，我们在后台已经默认分页，故不用在末尾加上limit，否则会报错\\n\\n10.如何去掉打印页面的页眉、页脚？\\n在打印弹窗页面，点击“更多设置 ->选项”，去掉“页眉和页脚”前边的对勾，打印界面就不显示页眉和页脚了；\\n\\n\\n\\n11.报表能否集成到vue项目中?\\n不能集成到前端项目，因为积木报表提供的JAVA依赖，只能集成到JAVA项目中。\\n\\n12.sql或者api解析失败的问题\\nsql或者api必须有查询结果才行，不然无法解析字段 相关issue #2305\\n\\n13.怎样自定义打印页面设置？\\n打印区域除了可以手动选择“A4、A3...”，还可以根据自己需求，自定义大小。\\n\\n操作参考打印区域设置\\n\\n14.预览时，列表数组在预览界面怎么只显示一条数据？\\n（1）检查在数据集解析的时候 ，是否勾选“是否列表”；\\n\\n\\n\\n（2）设计界面拖过来的数据字段，是否为#开头；\\n\\n\\n\\n15.横向动态列分组怎么设计？\\n操作参考文档\\n\\n16.预览页面多内容，但设计界面没有，怎么处理？\\n错误样式图：\\n\\n\\n\\n解决方案： 选中多出来的地方（可多选一些地方），右键点击：删除数据，就没有了；\\n\\n\\n\\n17.积木报表SQL数据集中数据预览为什么只显示10条数据?\\n为了避免大数据问题，故只取前10条数据进行展示\\n\\n\\n\\n18. 积木报表数据源怎么配置？\\n添加数据源文档\\n\\n19. 怎样把报表集成到JeecgBoot的菜单中？\\n备注：大屏和报表的操作是一样的；\\n\\n（1）复制报表访问链接 （2）在系统管理菜单管理进行配置 （3）点击新增按钮填写信息\\n\\n注意：\\na) 前端组件必须按照格式填写 layouts/IframePageView *用window._CONFIG[\\'domianURL\\']代替IP地址、端口号和项目名称,并用{{}}包起来;\\nb）末尾必须携带参数，如（?sex）；\\nc) 是否为路由菜单：是；\\n\\n\\n\\n\\n（4）角色授权 路径：在系统管理->角色授权找到自己对应的角色,鼠标放到更多->授权；\\n\\n勾选刚才创建的菜单\\n刷新页面即可看见点击菜单\\n\\n\\n20. 数据集配置点击确认会报错\\nhttps://github.com/jeecgboot/JimuReport/issues/439\\nSQL state \\\\[null\\\\]; error code \\\\[0\\\\]; Error; nested exception is java.sql.SQLException: Error\\n\\n那么就查看mysql数据库连接驱动是版本是5.1.47,如果是那么请将驱动升级版本或降低版本，如：\\n\\n<dependency>\\n    <groupId>mysql</groupId>\\n    <artifactId>mysql-connector-java</artifactId>\\n    <version>5.1.46</version>\\n    <optional>true</optional>\\n    <scope>runtime</scope>\\n</dependency>\\n\\n22.如何把SQL数据集拼接的查询条件加到数据源语法的group by前面\\n参考报表参数设置\\n\\n23.预览页面与设计页面不一致，在预览时出现空白行\\n检查数据集是多条数据的集合，还是单条数据的对象；如果是集合使用#，如果是对象则需要使用$ 如果页面多行使用#，则会被当做多个集合，中间自动填充空白行。\\n\\n\\n\\n24.为什么配置参数后勾选查询后，下拉单选变成输入框\\n参数不是字段，无法进行配置后就可以下拉单选；可配置字典code实现下拉\\n\\n25.一页展示一条数据，进行循环打印\\n可将整页作为循环块，设置为循环块 参考文档：点击查看\\n\\n26.mysql数据库类型tyint被转换成了true和false\\n需要在维护界面，数据源地址出拼接上\\n\\ntinyInt1isBit=false\\n\\n\\n\\n27.数据库里图片字段为图片链接，如何展示在报表中\\n添加数据源取出图片字段，将单元格类型设置为图片即可，如下图：\\n\\n\\n\\n28. 达梦数据库提示表名不存在\\n 因为达梦数据库如果不是当前用户名登录的(如SYSDBA)，访问不同名的（除了SYSDBA）外，均需要模式名.表名，那么需要你如下图操作，在同名下新建表\\n\\n\\n\\n29. 积木官网添加数据源\\n积木官网添加数据源需使用远程地址，不可使用localhost。\\n\\n32.字典code中直接输入sql语句，下拉框单选项乱序\\n解决方案：可以填写 order by 进行自定义排序，如\\n\\nselect dict_code as value,dict_name as name from jimu_dict order by create_time\\n\\n注意：如果在sqlserver下需要加上top 10（10代表多少条），不然会报错，如\\n\\nselect top 10 dict_code as value,dict_name as name from jimu_dict order by create_time\\n\\n33.导出excel报错版本不匹配，java.lang.NoSuchMethodError\\n将poi版本升级到4.1.2即可解决\\n\\n34. 如何增加列数\\n列索引数量可根据需要修改 参考文档：点击查看\\n\\n\\n\\n35.sql数据集下拉选择数据源，下方列表显示空白，但是有数据\\n目前为了统一规则后台返回的数据的对象均为小写(name)，如果规则不匹配，请改成小写\\n\\n\\n\\n38.预览界面查询栏如何设置默认展开？\\n解决方案：设置JS增强\\n\\n\\n\\nfunction init(){\\n  this.queryPanel = \\'1\\';\\n}\\n\\n39.sqlServer存储过程中有临时表获取不到数据\\n可以通过set nocount on来解决\\n\\n 相关issue: https://github.com/jeecgboot/JimuReport/issues/726\\n\\n40.若依集成积木报表1.4.4+ 新建报表报错\\nfreemarker.core.InvalidReferenceException\\n\\n升级fastjson到1.2.78\\n\\n<dependency>\\n   <groupId>com.alibaba</groupId>\\n   <artifactId>fastjson</artifactId>\\n   <version>1.2.78</version>\\n</dependency>\\n\\n相关issue：issue\\n\\n41.模板示例中条件查询预览失败\\n没有对应的表\\n\\n42.打印的时候，字体加粗效果丢失\\n宋体打印不支持加粗，换成默认的字体\\n\\n43.sqlserver提示驱动不存在\\n在pom文件中添加sqlserver依赖\\n\\n   <dependency>\\n        <groupId>com.microsoft.sqlserver</groupId>\\n        <artifactId>sqljdbc4</artifactId>\\n        <version>4.0</version>\\n        <optional>true</optional>\\n        <scope>runtime</scope>\\n    </dependency>     \\n\\n44.sqlserver下使用CONVERT函数注意事项\\n不可与order by一起使用\\nCONVERT函数需指定别名 如：CONVERT(varchar(7),CREATE_TIME) as CREATE_TIME\\n45.能否设置隐藏的查询条件\\n问题描述： 同一报表，希望不同的人看到不同的数据，目前可以通过JS增强设置初始值，但又不想让用户修改，能否提供设置查询条件隐藏的功能，这样便于数据权限的控制。 分析说明：此问题目的在于不同的人看不同的数据，提问人想设置查询条件默认值且不允许修改\\n\\n1.不同的人看不同的数据：可以使用系统变量 参考文档 如：\\n\\nsql数据集：select * from demo where create_by = \\'#{sysUserCode}\\'\\napi数据集： http://xxx.xxx.xxx/query?create_by=#{sysUserCode}\\n\\n注意：此处的`sysUserCode`,是系统默认设置的登录人的账号，如果重写getUserInfo方法则需要重新设置，文档中的代码，只适用于jeecg-boot不可照搬，仅供参考【推荐此方案】。\\n\\n\\n2.想设置查询条件默认值且不允许修改: js增强可以设置查询条件的默认值，也可以往查询参数对象里设置一个自定义的参数值，这个是支持的。但是，在配置数据集的时候，下方tab报表字段明细和报表参数中，会配置一些字段的信息，如果js增强定义的参数名不在这两个tab下，那么无效！所以做法如下：\\n定义数据集（不需要将参数name设置为查询条件）：\\nsql数据集：select * from demo where create_by = \\'${name}\\'\\napi数据集： http://xxx.xxx.xxx/query?create_by=${name}\\n\\n定义js增强,设置name的值：\\nfunction init(){\\n    this.queryInfo[\\'name\\'] = \\'scott\\'\\n}\\n\\n46. 日期默认查询，无法设置默认值为上月\\n问题描述： 使用dateStr 默认取上月实现不了，用=concat(dateStr(\\'yyyy\\'),\\'-\\', dateStr(\\'MM\\', -1))返回2021-9，不是2021-09，少了一位。 建议实现=dateStr(\\'yyyy-MM\\'，-1) 返回 2021-09，而不是使用天数计算偏移量。\\n解决方案： 参考文档 中的升级功能\\n\\n47. 打印多出一页空白纸张\\n解决方案： 打印导出，空白行和没有行是有区别的，界面上都是空白没区别，但是实际数据存储，空白行会占位的。\\n查看控制台打印的数据：你的rows都多达90多行了，说明是之前你设计的很多历史数据没有删除行，导致多出很多空白页。\\n\\n\\n\\n48. mongodb用法\\n1). 以授权的方式启动Mongo,给使用的数据库添加用户\\n\\n切换数据库 use test\\n\\n创建用户 db.createUser({user: \\\"root\\\", pwd: \\\"123456\\\", roles: \\\\[{ role: \\\"dbOwner\\\", db: \\\"test\\\" }\\\\]})\\n\\n参考博客：https://www.cnblogs.com/jacksoft/p/6916137.html\\n\\n2). mongodb-driver-sync 驱动集成用法 参考博客： https://blog.csdn.net/nyzzht123/article/details/107936552 https://www.jianshu.com/p/5186fb5a1292\\n\\n49、出现jsqlparser不兼容问题\\n如果出现jsqlparser不兼容问题，请这么引用\\n<dependency>\\n  <groupId>org.jeecgframework.jimureport</groupId>\\n  <artifactId>jimureport-spring-boot-starter</artifactId>\\n  <version>{版本号}</version>\\n  <exclusions>\\n    <exclusion>\\n      <artifactId>minidao-spring-boot-starter</artifactId>\\n      <groupId>org.jeecgframework</groupId>\\n    </exclusion>\\n  </exclusions>\\n</dependency>\\n<dependency>\\n  <groupId>org.jeecgframework</groupId>\\n  <artifactId>minidao-spring-boot-starter</artifactId>\\n  <version>1.8.8</version>\\n</dependency>\\n\\n50、关于积木报表在开发、生产环境增量同步https://github.com/jeecgboot/JimuReport/issues/1928\\n51、数据库字段为关键词，字段作为查询条件报错\\n报错信息：发现mysql下关键词字段\\\"year_month\\\"缺少\\\"`\\\"\\n\\nSELECT COUNT(1) total FROM ( select * from (select `year_month`,name,age from `demo`) jeecg_rp_temp  where year_month=? ) temp_count\\n\\n\\n解决方案：关键词字段请用as重命名一下\\n\\n\\n\\n52、依赖redisson后编辑字典、查询字典报错：\\n报错信息：\\n\\njava.lang.IllegalArgumentException: Cannot find cache named \\'jmreport:cache:dict\\' for Builder\\n\\n解决方法：配置文件增加：\\n\\nspring:\\n  cache:\\n    type: redis\\n\\n53、未登录的情况下导出excel和pdf报错\\n解决方案：在SpringSecurityConfig页面排除导出excel和导出pdf的请求地址，其他同理\\n\\n\\n\\n .antMatchers(\\\"/jmreport/exportPdfStream\\\", \\\"/jmreport/exportAllExcelStream\\\")', 'building', NULL);\nINSERT INTO `airag_knowledge_doc` VALUES ('1897926864815575042', 'jeecg', '2025-03-07 16:26:41', 'jeecg', '2025-03-10 17:28:33', 'A04', NULL, '1897926563148648449', 'index', 'file', '\\n# 项目介绍\\n\\n\\n `JeecgBoot` 是一款基于代码生成器的`低代码开发平台` 拥有零代码能力！采用前后端分离架构：SpringBoot2.x，Ant Design&Vue，Mybatis-plus，Shiro，JWT。强大的代码生成器让前后端代码一键生成，无需写任何代码! JeecgBoot引领新的开发模式(Online Coding模式-> 代码生成器模式-> 手工MERGE智能开发)， 帮助解决Java项目70%的重复工作，让开发更多关注业务逻辑。既能快速提高开发效率，帮助公司节省成本，同时又不失灵活性！JeecgBoot还独创在线开发模式（No-Code概念）：在线表单配置（表单设计器）、移动配置能力、工作流配置（在线设计流程）、报表配置能力、在线图表配置、插件能力（可插拔）等等！\\n\\n `JeecgBoot在提高UI能力`的同时，降低了前后分离的开发成本，JeecgBoot还独创在线开发模式（No-Code概念），一系列在线智能开发：在线配置表单、在线配置报表、在线图表设计、在线设计流程等等。\\n\\n ` JEECG宗旨是: `简单功能由Online Coding配置实现（在线配置表单、在线配置报表、在线图表设计、在线设计流程、在线设计表单），复杂功能由代码生成器生成进行手工Merge，既保证了智能又兼顾了灵活; \\n\\n 业务流程采用工作流来实现、扩展出任务接口，供开发编写业务逻辑，表单提供多种解决方案： 表单设计器、online配置表单、编码表单。同时实现了流程与表单的分离设计（松耦合）、并支持任务节点灵活配置，既保证了公司流程的保密性，又减少了开发人员的工作量。\\n\\n\\n## 技术支持\\n\\n*  新手指南： [快速入门](http://www.jeecg.com/doc/quickstart)   |   [常见问题 ](http://www.jeecg.com/doc/qa)  | [版本日志](http://jeecg.com/doc/log)\\n*  视频教程：[ JeecgBoot v3.7 新版视频教程](http://jeecg.com/doc/video)\\n*  QQ交流群：⑩716488839、⑨808791225(满)、其他(满)\\n*  在线演示 ：  [系统演示](http://boot3.jeecg.com)   |  [APP演示](http://app.jeecg.com)\\n\\n\\n源码下载\\n-----------------------------------\\n\\n- https://github.com/jeecgboot/jeecg-boot\\n\\n\\n\\n## 技术架构\\n-----------------------------------\\n\\n#### 后端\\n\\n- IDE建议： IDEA (必须安装lombok插件 )\\n- 语言：Java 8+ (支持17)\\n- 依赖管理：Maven\\n- 基础框架：Spring Boot 2.7.18\\n- 微服务框架： Spring Cloud Alibaba 2021.0.1.0\\n- 持久层框架：MybatisPlus 3.5.3.2\\n- 报表工具： JimuReport 1.7.6\\n- 安全框架：Apache Shiro 1.12.0，Jwt 3.11.0\\n- 微服务技术栈：Spring Cloud Alibaba、Nacos、Gateway、Sentinel、Skywalking\\n- 数据库连接池：阿里巴巴Druid 1.1.22\\n- 日志打印：logback\\n- 缓存：Redis\\n- 其他：autopoi, fastjson，poi，Swagger-ui，quartz, lombok（简化代码）等。\\n- 默认数据库脚本：MySQL5.7+\\n- [其他数据库，需要自己转](https://my.oschina.net/jeecg/blog/4905722)\\n\\n\\n#### 前端\\n\\n- 前端IDE建议：WebStorm、Vscode\\n- 采用 Vue3.0+TypeScript+Vite+Ant-Design-Vue等新技术方案，包括二次封装组件、utils、hooks、动态菜单、权限校验、按钮级别权限控制等功能\\n- 最新技术栈：Vue3.0 + TypeScript + Vite5 + ant-design-vue4 + pinia + echarts + unocss + vxe-table + qiankun + es6\\n- 依赖管理：node、npm、pnpm\\n\\n\\n\\n#### 支持库\\n\\n|  数据库   |  支持   |\\n| --- | --- |\\n|   MySQL   |  √   |\\n|  Oracle11g   |  √   |\\n|  Sqlserver2017   |  √   |\\n|   PostgreSQL   |  √   |\\n|   MariaDB   |  √   |\\n|   达梦   |  √   |\\n|   人大金仓   |  √   |\\n\\n\\n\\n## 微服务解决方案\\n\\n\\n- 1、服务注册和发现 Nacos √\\n- 2、统一配置中心 Nacos  √\\n- 3、路由网关 gateway(三种加载方式) √\\n- 4、分布式 http feign √\\n- 5、熔断降级限流 Sentinel √\\n- 6、分布式文件 Minio、阿里OSS √ \\n- 7、统一权限控制 JWT + Shiro √\\n- 8、服务监控 SpringBootAdmin√\\n- 9、链路跟踪 Skywalking   [参考文档](/java/springcloud/super/skywarking)\\n- 10、消息中间件 RabbitMQ  √\\n- 11、分布式任务 xxl-job  √ \\n- 12、分布式事务 Seata\\n- 13、轻量分布式日志 Loki+grafana套件\\n- 14、支持 docker-compose、k8s、jenkins\\n- 15、CAS 单点登录   √\\n- 16、路由限流   √\\n\\n   \\n### 微服务架构图\\n![微服务架构图](https://jeecgos.oss-cn-beijing.aliyuncs.com/files/jeecgboot_springcloud2022.png \\\"在这里输入图片标题\\\")\\n\\n\\n\\n\\n\\n## 系统架构图\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/images/screenshot_1662547398792.png)\\n*****\\n\\n\\n## 系统截图\\n\\n### PC端\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687778397612.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687778435846.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687778476447.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687778512836.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687778582144.png)\\n\\n### 在线接口文档\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687778702243.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687778737438.png)\\n\\n\\n### 报表\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687778780458.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/up-fa52b44445db281c51d3f267dce7450d21b.gif)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687779705768.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687779725144.png)\\n\\n### 流程\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687779807541.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687779857971.png)\\n\\n![](/static/jimuImages/image_1687779966442.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687780016598.png)\\n\\n\\n### 手机端\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687780240854.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687780264274.png)\\n\\n### PAD端\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687780285230.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687780328101.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687780342778.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jeecgback/topwrite/assets/image_1687780373126.png)\\n\\n\\n\\n\\n\\n\\n\\n', 'complete', '{\\\"filePath\\\":\\\"temp/index_1741335996542.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1897926933086261249', 'jeecg', '2025-03-07 16:26:57', 'jeecg', '2025-03-10 17:28:42', 'A04', NULL, '1897926563148648449', 'qa', 'file', '1.菜单的这些配置是什么意思？\\n\\n![](/static/jimuImages/screenshot_1585040135427.png)\\n|    配置|    描述 |\\n| --- | --- |\\n|  是否路由菜单   |   是：跳转路由的时候根据配置的前端组件值跳转，否：起作用的是菜单路径  |\\n|  隐藏路由   |   是：左侧菜单不加载反之加载  |\\n|  缓存路由   |   是：路由只加载一次即created只执行一次  |\\n|  聚合路由   |  是：只要配置在该路由下面的子路由全部不会显示在左侧菜单栏  |\\n| 打开方式   |  内部打开是在窗口tab里打开，外部打开浏览器tab打开 |\\n\\n---\\n2.列表页面跳转新的路由需要展示成面包屑菜单样式：\\n目前不支持，需要自行扩展\\n\\n---\\n3.表单设计器自定义扩展\\n目前只支持将设计好的表单引入自己的modal页面，扩展暂不支持\\n\\n---\\n4.图表点击事件\\n有自定义的图表js增强事件，后续补充该文档\\n\\n---\\n<span>20200324 LOWCOD-323</span>\\n\\n---\\n\\n5.online报表 系统变量的使用\\n`select username,id from sys_user  where username = \\'#{sys_user_code}\\'`\\n\\n6.首页怎么改成自己的。\\n方法一：直接修改文件：src/views/dashboard/Analysis.vue\\n方法二：自定义首页页面，将首页菜单的前端组件配置为自己的文件，注意**只能修改前端组件不可修改菜单路径**\\n\\n![](/static/jimuImages/screenshot_1586254248894.png)\\n\\n\\n\\n7.项目编译 文件上有红色波浪线 ，点开文件红线消失，查看problem报错 xxx程序包不存在,实际该包存在\\n解决方法：在Terminal 中执行 `mvn idea:idea` 再次编译即可\\n\\n\\n\\n\\n', 'complete', '{\\\"filePath\\\":\\\"temp/QA_1741336015236.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1897932000963092482', 'jeecg', '2025-03-07 16:47:06', 'jeecg', '2025-03-07 16:47:10', 'A04', NULL, '1897212906878009346', 'index', 'file', '# 项目介绍\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/jimureport2.jpg)\\n\\n*****\\n\\n# JimuReport\\n\\n 积木报表，是一款免费的数据可视化报表，含报表、仪表盘和大屏设计，像搭建积木一样完全在线设计！功能涵盖：数据报表、打印设计、图表报表、门户设计、大屏设计等！\\n \\n -   Web版报表设计器，类Excel操作风格，通过拖拽完成报表设计，所见即所得。\\n -   大屏采用类word风格，可以随意拖动组件，想怎么设计怎么设计，可以像百度和阿里一样，设计出炫酷大屏！\\n -   从 v1.9+ 起推出 JimuBI 产品，她的牛叉之处，同时支持仪表盘、大屏、门户 (支持交互)、移动.\\n -   秉承\\\"简单、易用、专业\\\"的产品理念，极大的降低报表开发难度、缩短开发周期、节省成本。\\n -   领先的企业级Web报表，支持各种复杂报表，专注于解决企业报表难题。\\n -   积木BI 数据可视化，支持大屏设计和仪表盘，致力于更生动、更友好的形式呈现实时业务数据分析\\n\\n```\\n专注于开源，打造 “专业 易用 智能” 的数据可视化报表、大屏、门户\\n开源协议：`功能免费、可以商用、代码不开放`\\n```\\n\\n\\n为什么选择 JimuReport?\\n-----------------------------------\\n>    永久免费，支持各种复杂报表，并且傻瓜式在线设计，非常的智能，低代码时代，这个是你的首选！\\n\\n- 采用SpringBoot的脚手架项目，都可以快速集成\\n- Web 版设计器，类似于excel操作风格，通过拖拽完成报表设计\\n- 通过SQL、API等方式，将数据源与模板绑定。同时支持表达式，自动计算合计等功能，使计算工作量大大降低\\n- 开发效率很高，傻瓜式在线报表设计，一分钟设计一个报表，又简单又强大\\n- 支持 ECharts，目前支持28种图表，在线拖拽设计，支持SQL和API两种数据源\\n- 支持分组、交叉，合计、表达式等复杂报表\\n- 支持打印设计（支持套打、背景打印等）可设置打印边距、方向、页眉页脚等参数 一键快速打印 同时可实现发票套打，不动产证等精准、无缝打印\\n- 可视化图表，仪表盘设计器类大屏设计，支持丰富的数据源连接和移动端，通过拖拉拽方式快速制作图表和门户设计；支持多种图表类型：柱形图、折线图、散点图、饼图、环形图、面积图、漏斗图、进度图、仪表盘、雷达图、地图等等；\\n- 可设计各种类型的单据、大屏，如出入库单、销售单、财务报表、合同、监控大屏、旅游数据大屏等\\n- 大屏设计器支持几十种图表样式，可自由拼接、组合，设计炫酷大屏\\n- 数据可视化，DataV、帆软的开源替代方案，比帆软拥有更好的体验和更简单的使用方式\\n- [积木报表官网](http://jimureport.com/login) 可以在线免费制作报表和大屏，手机号一键注册，便可永久使用。大屏采用类word风格，可以随意拖动组件，想怎么设计怎么设计，可以像百度和阿里一样，设计出炫酷的可视化大屏！重要的是：免费！免费！免费！\\n\\n\\n\\n\\n## 产生背景\\n报表是企业IT服务必备的一项需求，但是行业内并没有一个免费好用的报表，大部分免费的报表功能较弱也不够智能，商业报表又很贵，所以有了研发一套免费报表的初衷。\\n做一个什么样的报表呢？随着低代码概念的兴起，原先通过报表工具设计模板，再与系统集成的模式已经落伍，现在追求的是完全在线设计，傻瓜式的操作，实现简单易用又智能的报表！\\n\\n- 目前积木报表已经实现了完全在线设计，轻量级集成、类似excel的风格，像搭建积木一样在线拖拽设计报表！功能涵盖数据报表设计、打印设计、图表设计、门户设计、大屏设计等！\\n- 2019年底启动积木报表研发工作，历经一年多的时间，2020-11-03第一版出炉 [v1.0-beta](https://www.oschina.net/news/119666/jimureport-1-0-beta-released)\\n- 2020年的持续打磨和研发，终于在2021-1-18发布了第一个正式版本 [v1.1.05](https://www.oschina.net/news/126916/jimureport-1-1-05-released)\\n- 截止到当前2024-09-14，积木报表已经完全涵盖商业BI的所有功能，包括不限于复杂报表、图表可视化、大屏、移动图表、填报等高级功能，而且拥有更好的体验和更简单的使用方式。\\n- 更多版本日志查看 [版本日志](http://jimureport.com/doc/log)\\n\\n\\n\\n\\n\\n\\n开发文档\\n-----------------------------------\\n\\n- [快速集成](</quick.md>)\\n- [集成源码下载](https://github.com/jeecgboot/JimuReport)\\n- [大屏与报表演示](http://jimureport.com/login)  |  [零代码体验](https://app.qiaoqiaoyun.com)\\n\\n\\n\\n\\n\\n\\n项目介绍\\n-----------------------------------\\n\\n- 官方网站： http://www.jimureport.com\\n- 视频教程： http://jimureport.com/doc/video\\n- QQ交流群：③596660273、其他群(满)\\n\\n\\n数据库兼容 \\n-----------------------------------\\n> 支持国产、常规、Nosql等30多种数据源，支持以SQL的方式去查询csv、mogodb等非物理数据库。\\n\\n|  数据库   |  支持   |\\n| --- | --- |\\n|   MySQL   |  √   |\\n|  Oracle、Oracle9i   |  √   |\\n|  SqlServer、SqlServer2012   |  √   |\\n|   PostgreSQL   |  √   |\\n|   DB2、Informix   |  √   |\\n|   MariaDB   |  √   |\\n|  SQLite、Hsqldb、Derby、H2   |  √   |\\n|   达梦、人大金仓、神通   |  √   |\\n|   华为高斯、虚谷、瀚高数据库、 TDengine 涛思数据   |  √   |\\n|   阿里云PolarDB、PPAS、HerdDB   |  √   |\\n|  Hive、HBase、CouchBase   |  √   |\\n|  导入Excel、csv、json文件数据集   |  √   |\\n|  sqllite、TiDB、Doris、clickhouse、 MongoDB-BI   |  √   |\\n|  elasticsearch、mogodb  |  √   |\\n\\n\\n\\n报表设计效果\\n-----------------------------------\\n\\n- 报表设计器（完全在线设计，简单易用）\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/up-752b454f64ed87c798b3e8a083fbd6622d4.gif)\\n\\n- 打印设计（支持套打、背景打印）\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862827604.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862839013.png)\\n\\n- 数据报表（支持分组、交叉，合计等复杂报表）\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862854011.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862862414.png)\\n\\n- 图形报表（目前支持28种图表）\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862883559.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862892649.png)\\n\\n\\n\\n大屏设计效果\\n-----------------------------------\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862905901.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862938863.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862951297.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862960053.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862974786.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862983740.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687862996008.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687863002758.png)\\n\\n\\n仪表盘设计器\\n-----------------------------------\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687863014429.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687863021555.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687863028545.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687863043320.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687863050461.png)\\n\\n![](https://upload.jeecg.com/jeecg/help/jimureport/topwrite/assets/image_1687863057103.png)\\n\\n## 功能清单\\n```\\n├─报表设计器\\n│  ├─数据源\\n│  │  ├─支持多种数据源，如Oracle,MySQL,SQLServer,PostgreSQL等主流的数据库\\n│  │  ├─支持SQL编写页面智能化，可以看到数据源下面的表清单和字段清单\\n│  │  ├─支持参数\\n│  │  ├─支持单数据源和多数数据源设置\\n│  ├─单元格格式\\n│  │  ├─边框\\n│  │  ├─字体大小\\n│  │  ├─字体颜色\\n│  │  ├─背景色\\n│  │  ├─字体加粗\\n│  │  ├─支持水平和垂直的分散对齐\\n│  │  ├─支持文字自动换行设置\\n│  │  ├─图片设置为图片背景\\n│  │  ├─支持无线行和无限列\\n│  │  ├─支持设计器内冻结窗口\\n│  │  ├─支持对单元格内容或格式的复制、粘贴和删除等功能\\n│  │  ├─等等\\n│  ├─报表元素\\n│  │  ├─文本类型：直接写文本；支持数值类型的文本设置小数位数\\n│  │  ├─图片类型：支持上传一张图表；支持图片动态生成\\n│  │  ├─图表类型\\n│  │  ├─函数类型\\n│  │  └─支持求和\\n│  │  └─平均值\\n│  │  └─最大值\\n│  │  └─最小值\\n│  ├─背景\\n│  │  ├─背景颜色设置\\n│  │  ├─背景图片设置\\n│  │  ├─背景透明度设置\\n│  │  ├─背景大小设置\\n│  ├─数据字典\\n│  ├─报表打印\\n│  │  ├─自定义打印\\n│  │  └─医药笺、逮捕令、介绍信等自定义样式设计打印\\n│  │  ├─简单数据打印\\n│  │  └─出入库单、销售表打印\\n│  │  └─带参数打印\\n│  │  └─分页打印\\n│  │  ├─套打\\n│  │  └─不动产证书打印\\n│  │  └─发票打印\\n│  ├─数据报表\\n│  │  ├─分组数据报表\\n│  │  └─横向数据分组\\n│  │  └─纵向数据分组\\n│  │  └─多级循环表头分组\\n│  │  └─横向分组小计\\n│  │  └─纵向分组小计（预计2021.03.08）\\n│  │  └─合计\\n│  │  ├─交叉报表\\n│  │  ├─明细表\\n│  │  ├─带条件查询报表\\n│  │  ├─表达式报表\\n│  │  ├─带二维码/条形码报表\\n│  │  ├─多表头复杂报表（预计2021.03.08发布）\\n│  │  ├─主子报表（预计2021.03.08发布）\\n│  │  ├─预警报表（预计2021.03.08发布）\\n│  │  ├─数据钻取报表（预计2021.03.08发布）\\n│  ├─图形报表\\n│  │  ├─柱形图\\n│  │  ├─折线图\\n│  │  ├─饼图\\n│  │  ├─折柱图\\n│  │  ├─散点图\\n│  │  ├─漏斗图\\n│  │  ├─雷达图\\n│  │  ├─象形图\\n│  │  ├─地图\\n│  │  ├─仪盘表\\n│  │  ├─关系图\\n│  │  ├─图表背景\\n│  │  ├─图表动态刷新\\n│  │  ├─图表数据字典\\n│  ├─参数\\n│  │  ├─参数配置\\n│  │  ├─参数管理\\n│  ├─导入导出\\n│  │  ├─支持导入Excel\\n│  │  ├─支持导出Excel、pdf；支持导出excel、pdf带参数\\n│  ├─打印设置\\n│  │  ├─打印区域设置\\n│  │  ├─打印机设置\\n│  │  ├─预览\\n│  │  ├─打印页码设置\\n├─大屏设计器\\n│  ├─系统功能\\n│  │  ├─静态数据源和动态数据源设置\\n│  │  ├─基础功能\\n│  │  └─支持拖拽设计\\n│  │  └─支持增、删、改、查大屏\\n│  │  └─支持复制大屏数据和样式\\n│  │  └─支持大屏预览、分享\\n│  │  └─支持系统自动保存数据，同时支持手动恢复数据\\n│  │  └─支持设置大屏密码\\n│  │  └─支持对组件图层的删除、组合、上移、下移、置顶、置底等\\n│  │  ├─背景设置\\n│  │  └─大屏的宽度和高度设置\\n│  │  └─大屏简介设置\\n│  │  └─背景颜色、背景图片设置\\n│  │  └─封面图设置\\n│  │  └─缩放比例设置\\n│  │  └─环境地址设置\\n│  │  └─水印设置\\n│  │  ├─地图设置\\n│  │  └─添加地图\\n│  │  └─地图数据隔离\\n│  ├─图表\\n│  │  ├─柱形图\\n│  │  ├─折线图\\n│  │  ├─折柱图\\n│  │  ├─饼图\\n│  │  ├─象形图\\n│  │  ├─雷达图\\n│  │  ├─散点图\\n│  │  ├─漏斗图\\n│  │  ├─文本框\\n│  │  ├─跑马灯\\n│  │  ├─超链接\\n│  │  ├─实时时间\\n│  │  ├─地图\\n│  │  ├─全国物流地图\\n│  │  ├─地理坐标地图\\n│  │  ├─城市派件地图\\n│  │  ├─图片\\n│  │  ├─图片框\\n│  │  ├─轮播图\\n│  │  ├─滑动组件\\n│  │  ├─iframe\\n│  │  ├─video\\n│  │  ├─翻牌器\\n│  │  ├─环形图\\n│  │  ├─进度条\\n│  │  ├─仪盘表\\n│  │  ├─字浮云\\n│  │  ├─表格\\n│  │  ├─选项卡\\n│  │  ├─万能组件\\n└─其他模块\\n   └─更多功能开发中。。\\n```\\n\\n \\n\\n', 'complete', '{\\\"filePath\\\":\\\"temp/readme_1741337223240.md\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905186930719539201', 'jeecg', '2025-03-27 17:15:36', 'jeecg', '2025-03-27 17:15:43', 'A04', NULL, '1905186756806918146', 'part1', 'file', NULL, 'complete', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/01第一部分第1章_1743066923748.pdf\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905186968325668866', 'jeecg', '2025-03-27 17:15:45', 'jeecg', '2025-03-27 17:15:48', 'A04', NULL, '1905186756806918146', 'part2', 'file', NULL, 'complete', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/02第一部分第2章_1743066943040.pdf\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187001037045761', 'jeecg', '2025-03-27 17:15:52', 'jeecg', '2025-03-27 17:15:57', 'A04', NULL, '1905186756806918146', 'part3', 'file', NULL, 'complete', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/03第一部分第3章_1743066951733.pdf\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187042770370561', 'jeecg', '2025-03-27 17:16:02', 'jeecg', '2025-03-27 17:16:07', 'A04', NULL, '1905186756806918146', 'part4', 'file', NULL, 'complete', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/04第一部分第4章_1743066960385.pdf\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187113339535361', 'jeecg', '2025-03-27 17:16:19', 'jeecg', '2025-03-27 17:16:25', 'A04', NULL, '1905186756806918146', 'part5', 'file', NULL, 'complete', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/05第一部分第5章_1743066977792.pdf\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187163981561857', 'jeecg', '2025-03-27 17:16:31', 'jeecg', '2025-03-27 17:16:39', 'A04', NULL, '1905186756806918146', 'part6', 'file', NULL, 'complete', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/06第一部分第6章_1743066990164.pdf\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187246412218369', 'jeecg', '2025-03-27 17:16:51', 'jeecg', '2025-03-27 17:16:54', 'A04', NULL, '1905186756806918146', 'part7', 'file', NULL, 'complete', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/07第一部分第7章_1743067007831.pdf\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187348543520770', 'jeecg', '2025-03-27 17:17:15', 'jeecg', '2025-03-27 17:17:20', 'A04', NULL, '1905186756806918146', 'part8', 'file', NULL, 'complete', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/08第一部分第8章_1743067032663.pdf\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187596229754881', 'jeecg', '2025-03-27 17:18:14', 'jeecg', '2025-03-27 17:18:21', 'A04', NULL, '1905186756806918146', 'part9', 'file', NULL, 'complete', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/09第一部分第9章_1743067087019.pdf\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187666618564609', 'jeecg', '2025-03-27 17:18:31', 'jeecg', '2025-03-27 17:18:34', 'A04', NULL, '1905186756806918146', 'part10', 'file', NULL, 'complete', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/10第一部分第10章_1743067109769.pdf\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187818494312449', 'jeecg', '2025-03-27 17:19:07', 'jeecg', '2025-03-27 17:19:15', 'A04', NULL, '1905186756806918146', 'part11', 'file', NULL, 'complete', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/11第一部分第11章_1743067121732.pdf\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187888337862657', 'jeecg', '2025-03-27 17:19:24', 'jeecg', '2025-03-27 17:19:31', 'A04', NULL, '1905186756806918146', 'part12', 'file', NULL, 'complete', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/12第一部分第12章_1743067158952.pdf\\\"}');\nINSERT INTO `airag_knowledge_doc` VALUES ('1905187920491397122', 'jeecg', '2025-03-27 17:19:32', 'jeecg', '2025-03-27 17:19:38', 'A04', NULL, '1905186756806918146', 'part13', 'file', NULL, 'complete', '{\\\"filePath\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/13第一部分第13章_1743067170886.pdf\\\"}');\n\n-- ----------------------------\n-- Table structure for airag_model\n-- ----------------------------\nCREATE TABLE `airag_model`  (\n                                `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n                                `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n                                `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n                                `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人',\n                                `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n                                `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '所属部门',\n                                `tenant_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '租户id',\n                                `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称',\n                                `provider` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '供应者',\n                                `model_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '模型名称',\n                                `credential` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '凭证信息',\n                                `base_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'API域名',\n                                `model_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '模型类型',\n                                `model_params` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '模型参数',\n                                PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of airag_model\n-- ----------------------------\nINSERT INTO `airag_model` VALUES ('1890232564262739969', 'jeecg', '2025-02-14 10:52:16', 'admin', '2025-04-02 22:20:37', 'A04', NULL, 'OpenAI', 'OPENAI', 'gpt-4o-mini', '{\\\"apiKey\\\":\\\"sk-cgQRNc3mWb3YtdO9C0F6AcBc86\\\"}', 'https://api.gpt.ge', 'LLM', '{\\\"temperature\\\":0.2,\\\"topP\\\":0.7,\\\"presencePenalty\\\":0.5,\\\"frequencyPenalty\\\":0.5,\\\"maxTokens\\\":null}');\nINSERT INTO `airag_model` VALUES ('1891459707122499586', 'jeecg', '2025-02-17 20:08:30', 'admin', '2025-04-02 22:20:34', 'A04', NULL, 'OpenAI向量', 'OPENAI', 'text-embedding-ada-002', '{\\\"apiKey\\\":\\\"sk-cgQRNc3mWb3YtdO9C0F6Ac\\\"}', 'https://api.v3.cm/v1', 'EMBED', NULL);\nINSERT INTO `airag_model` VALUES ('1897481367743143938', 'jeecg', '2025-03-06 10:56:26', 'admin', '2025-04-02 22:20:31', 'A04', NULL, 'deepseek', 'DEEPSEEK', 'deepseek-chat', '{\\\"apiKey\\\":\\\"sk-ff138aa9896945468ec\\\"}', 'https://api.deepseek.com/v1', 'LLM', NULL);\nINSERT INTO `airag_model` VALUES ('1897883052995006466', 'jeecg', '2025-03-07 13:32:35', 'admin', '2025-04-02 23:53:33', 'A04', NULL, '智谱', 'ZHIPU', 'glm-4-flash', '{\\\"apiKey\\\":\\\"522f6486bc6944b2ba346f054c0184e0.\\\"}', 'https://open.bigmodel.cn/', 'LLM', NULL);\nINSERT INTO `airag_model` VALUES ('1897884353107611650', 'jeecg', '2025-03-07 13:37:45', 'admin', '2025-04-02 22:20:22', 'A04', NULL, '智谱向量', 'ZHIPU', 'Embedding-3', '{\\\"apiKey\\\":\\\"522f6486bc6944b2ba346f054c0184e0.\\\"}', 'https://open.bigmodel.cn', 'EMBED', '{\\\"temperature\\\":0.7,\\\"topP\\\":0.7,\\\"presencePenalty\\\":null,\\\"frequencyPenalty\\\":null,\\\"maxTokens\\\":null}');\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n\n-- ----------------------------\n-- Records of sys_dict\n-- ----------------------------\n\nINSERT INTO `sys_dict` (`id`, `dict_name`, `dict_code`, `description`, `del_flag`, `create_by`, `create_time`, `update_by`, `update_time`, `type`, `tenant_id`, `low_app_id`) VALUES ('1894701158027554818', 'AI应用类型', 'ai_app_type', NULL, 0, 'jeecg', '2025-02-26 18:48:53', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` (`id`, `dict_name`, `dict_code`, `description`, `del_flag`, `create_by`, `create_time`, `update_by`, `update_time`, `type`, `tenant_id`, `low_app_id`) VALUES ('1891672414555860993', '知识库文档类型', 'know_doc_type', NULL, 0, 'jeecg', '2025-02-18 10:13:44', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` (`id`, `dict_name`, `dict_code`, `description`, `del_flag`, `create_by`, `create_time`, `update_by`, `update_time`, `type`, `tenant_id`, `low_app_id`) VALUES ('1891671216561975297', '知识库类型', 'airag_know_type', NULL, 1, 'jeecg', '2025-02-18 10:08:58', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` (`id`, `dict_name`, `dict_code`, `description`, `del_flag`, `create_by`, `create_time`, `update_by`, `update_time`, `type`, `tenant_id`, `low_app_id`) VALUES ('1891456510739890177', '模型类型', 'model_type', NULL, 0, 'jeecg', '2025-02-17 19:55:48', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict` (`id`, `dict_name`, `dict_code`, `description`, `del_flag`, `create_by`, `create_time`, `update_by`, `update_time`, `type`, `tenant_id`, `low_app_id`) VALUES ('1890229208685322242', '模型提供者', 'model_provider', NULL, 0, 'jeecg', '2025-02-14 10:38:57', NULL, NULL, 0, 0, NULL);\n\n-- ----------------------------\n-- Records of sys_dict_item\n-- ----------------------------\n\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1894701332930031618', '1894701158027554818', '高级编排', 'chatFLow', NULL, 2, 1, 'jeecg', '2025-02-26 18:49:34', NULL, NULL, NULL);\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1894701277019959298', '1894701158027554818', '简单配置', 'chatSimple', NULL, 1, 1, 'jeecg', '2025-02-26 18:49:21', NULL, NULL, NULL);\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1891672567924781058', '1891672414555860993', '网页', 'web', NULL, 1, 1, 'jeecg', '2025-02-18 10:14:20', NULL, NULL, NULL);\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1891672540963794946', '1891672414555860993', '文件', 'file', NULL, 1, 1, 'jeecg', '2025-02-18 10:14:14', NULL, NULL, NULL);\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1891672501432479746', '1891672414555860993', '文本', 'text', NULL, 1, 1, 'jeecg', '2025-02-18 10:14:05', NULL, NULL, NULL);\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1891458099609354241', '1891456510739890177', '向量模型', 'EMBED', NULL, 1, 1, 'jeecg', '2025-02-17 20:02:07', 'jeecg', '2025-02-17 20:39:01', NULL);\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1891456733029613569', '1891456510739890177', '语言模型', 'LLM', NULL, 1, 1, 'jeecg', '2025-02-17 19:56:41', 'jeecg', '2025-02-17 20:02:15', NULL);\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1890230437670920194', '1890229208685322242', 'Ollama', 'OLLAMA', NULL, 1, 1, 'jeecg', '2025-02-14 10:43:50', NULL, NULL, NULL);\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1890230384159989762', '1890229208685322242', 'DeepSeek', 'DEEPSEEK', NULL, 1, 1, 'jeecg', '2025-02-14 10:43:37', NULL, NULL, NULL);\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1890230305948803073', '1890229208685322242', '通义千问', 'QWEN', NULL, 1, 1, 'jeecg', '2025-02-14 10:43:18', NULL, NULL, NULL);\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1890230107835047937', '1890229208685322242', '千帆大模型', 'QIANFAN', NULL, 1, 1, 'jeecg', '2025-02-14 10:42:31', NULL, NULL, NULL);\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1890230018852888577', '1890229208685322242', '智谱AI', 'ZHIPU', NULL, 1, 1, 'jeecg', '2025-02-14 10:42:10', 'jeecg', '2025-02-14 10:42:42', NULL);\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1890229967585910786', '1890229208685322242', 'OpenAI', 'OPENAI', NULL, 1, 1, 'jeecg', '2025-02-14 10:41:58', 'jeecg', '2025-02-14 10:42:48', NULL);\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.8.1_1__all_upgrade.sql",
    "content": "-- -- author:sunjianlei---date:20250417--for: 【QQYUN-11093】【online】添加Online报表、Online图表的租户ID字段\nALTER TABLE `onl_cgreport_head`\n    ADD COLUMN `tenant_id` int NULL DEFAULT 0 COMMENT '租户ID' AFTER `content`;\n\n-- ---author:chenrui-date:20250418-----for: 添加AI流程:积木报表AI引擎\nINSERT INTO `airag_flow` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `application_name`, `name`, `descr`, `icon`, `chain`, `design`, `status`, `metadata`) VALUES ('1909856345692065793', 'jeecg', '2025-04-09 14:30:11', 'jeecg', '2025-04-17 20:32:02', 'A04', NULL, 'jeecg', 'JimuReport AI引擎', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'173365501230346240\\')).to(\\n        THEN(\\n            llm.tag(\\'172956395755208704\\'),\\n            end.tag(\\'172957153284259840\\')\\n        ).tag(\\\"172956395755208704\\\"),\\n        THEN(\\n            llm.tag(\\'173365800833675264\\'),\\n            end.tag(\\'173366253646540800\\')\\n        ).tag(\\\"173365800833675264\\\"),\\n        end.tag(\\'173366439085109248\\'),\\n        THEN(\\n            llm.tag(\\'175149164433014784\\'),\\n            end.tag(\\'175153953988444160\\')\\n        ).tag(\\\"175149164433014784\\\"),\\n        THEN(\\n            llm.tag(\\'175505963485245440\\'),\\n            end.tag(\\'175506006644633600\\')\\n        ).tag(\\\"175505963485245440\\\"),\\n        THEN(\\n            llm.tag(\\'175807569594040320\\'),\\n            end.tag(\\'175808663015538688\\')\\n        ).tag(\\\"175807569594040320\\\")\\n    ).tag(\\'173365501230346240\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":262,\\\"y\\\":458,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"表结构\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"dbtype\\\",\\\"name\\\":\\\"数据库类型\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"bizType\\\",\\\"name\\\":\\\"业务类型\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"172956395755208704\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1166,\\\"y\\\":160,\\\"properties\\\":{\\\"text\\\":\\\"生成sql\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"千问coder\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：SQL生成助手\\\\n你是一个专业的SQL语句生成工具，能够根据用户提供的描述和表结构自动生成高效的SQL查询语句。\\\\n\\\\n## 目标：\\\\n- 根据用户的描述生成准确的SQL查询语句。\\\\n\\\\n## 技能：\\\\n1. 理解用户提供的需求和表结构。\\\\n2. 自动构建符合SQL语法的查询语句。\\\\n3. 优化生成的SQL以提高执行效率。\\\\n\\\\n## 工作流：\\\\n1. 接收用户描述和表结构信息。\\\\n2. 分析用户需求，确定所需的SQL操作类型（如查询、插入、更新、删除）。\\\\n3. 根据分析结果生成相应的SQL语句。\\\\n\\\\n## 输出格式：\\\\n- 生成的SQL语句应为标准格式，如：SELECT * FROM table_name ;\\\\n- 将输出的SQL语句格式化\\\\n- 只输出sql语句，不要额外解释，不要md语法，不要换行符，不要有sql注释。\\\\n\\\\n## 限制：\\\\n\\\\n- 除非明确说明，否则不要生成查询条件\\\\n- 确保生成的SQL语句符合数据库的语法要求，确保sql能直接执行。\\\\n- 确保字段和表能正确对应。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"表结构：\\\\n{{ddl}}\\\\n---------\\\\n数据库类型：\\\\n{{dbtype}}\\\\n----------\\\\n需求：\\\\n{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"dbtype\\\",\\\"name\\\":\\\"dbtype\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"172957153284259840\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":129,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"sql\\\",\\\"nodeId\\\":\\\"172956395755208704\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"173365501230346240\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":688,\\\"y\\\":536,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"genSql\\\"}],\\\"next\\\":\\\"172956395755208704\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"genJsonRows\\\"}],\\\"next\\\":\\\"173365800833675264\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"chooseTables\\\"}],\\\"next\\\":\\\"175149164433014784\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"genChart\\\"}],\\\"next\\\":\\\"175505963485245440\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"intentCheck\\\"}],\\\"next\\\":\\\"175807569594040320\\\"}],\\\"else\\\":{\\\"next\\\":\\\"173366439085109248\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"height\\\":222,\\\"width\\\":332}},{\\\"id\\\":\\\"173365800833675264\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1167,\\\"y\\\":368,\\\"properties\\\":{\\\"text\\\":\\\"生成rows\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"千问coder\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"根据以下数据以及用户需求生成符合要求的表格数据结构。\\\\n\\\\n\\\\n## 工作流程：\\\\n\\\\n\\\\n1. 根据用户需求选择一个合适的数据集\\\\n2. 根据数据集和需求，生成表格数据。\\\\n2. 最终输出json\\\\n\\\\n\\\\n## 数据集格式说明：\\\\n```\\\\n{\\\\n  \\\\\\\"code\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n  \\\\\\\"title\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n  \\\\\\\"isList\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n  \\\\\\\"children\\\\\\\": [\\\\n    {\\\\n      \\\\\\\"title\\\\\\\": \\\\\\\"total_sales\\\\\\\",\\\\n      \\\\\\\"fieldText\\\\\\\": \\\\\\\"总销量\\\\\\\"\\\\n    },\\\\n    {\\\\n      \\\\\\\"title\\\\\\\": \\\\\\\"total_returns\\\\\\\",\\\\n      \\\\\\\"fieldText\\\\\\\": \\\\\\\"总退货数量\\\\\\\"\\\\n    }\\\\n  ]\\\\n}\\\\n```\\\\n* code：数据集变量名\\\\n* isList：为”1”表示集合，“0”表示对象\\\\n* children：为字段列表，包含title（字段名）和fieldText（展示名）\\\\n⸻\\\\n## 表格数据结构说明：\\\\n```\\\\n{\\\\n  \\\\\\\"0\\\\\\\": { \\\\\\\"cells\\\\\\\": {} }, // 行号作为键\\\\n  \\\\\\\"1\\\\\\\": { \\\\\\\"cells\\\\\\\": { // 每行下有 cells 对象，key 是列号\\\\n      \\\\\\\"1\\\\\\\": { \\\\\\\"text\\\\\\\": \\\\\\\"#{a.total_sales}\\\\\\\" },\\\\n      \\\\\\\"2\\\\\\\": { \\\\\\\"text\\\\\\\": \\\\\\\"#{a.name}\\\\\\\" }\\\\n  }},\\\\n  \\\\\\\"len\\\\\\\": 200 // 表格总行数（可固定为200）\\\\n}\\\\n```\\\\n* 每行以序号作为键\\\\n* 每列下包含 text 为占位符，${} 用于对象，#{} 用于集合\\\\n* 可包含 style 等附加样式信息\\\\n⸻\\\\n\\\\n\\\\n## 填充规则：\\\\n1. 若 isList = 1（集合）：\\\\n  * 第N行（如 \\\\\\\"0\\\\\\\"）为字段标题：使用 children.fieldText 填充\\\\n  * 第N+1行（如 \\\\\\\"1\\\\\\\"）为字段占位符：使用 `#{code.title}` 填充\\\\n  * 所有字段占位符占用一行，所有标题占用一行\\\\n2. 若 isList = 0（对象）：\\\\n  * 每字段占两列，低N列填字段标题，N+1列填占位符 `${code.title}`\\\\n  * 共两组：第一组在第n列，第二组在第N+2列\\\\n\\\\n\\\\n⸻\\\\n\\\\n\\\\n## 输出格式\\\\n* 直接返回JSON数据，不要解释，不要md语法，不要换行符，不要有注释。\\\\n\\\\n\\\\n\\\\n\\\\n## 特别注意\\\\n- 字段的占位必须是`#{}`或`${}`，不能缺失大括号。\\\\n- 用户描述的序号需要减一才是下标\\\\n- 确保输出的json格式正确。\\\\n- 只需要生成一套表格数据。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"用户数据集：\\\\n{{ddl}}\\\\n用户需求：\\\\n{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"173366253646540800\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":336,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"rows\\\",\\\"nodeId\\\":\\\"173365800833675264\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"173366439085109248\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1158,\\\"y\\\":1220,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"error:选择正确的业务类型\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"175149164433014784\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1164,\\\"y\\\":598,\\\"properties\\\":{\\\"text\\\":\\\"选择表\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"千问coder\\\",\\\"temperature\\\":0.7}},\\\"history\\\":2,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"## 任务\\\\n根据用户需求，从下方数据库表列表中选择所有关联的表名称。\\\\n\\\\n\\\\n## 数据库表列表（格式：表名 | 注释）\\\\n{{ddl}}\\\\n\\\\n## 输出规则\\\\n1. 严格按JSON数组格式输出，例如：[\\\\\\\"order\\\\\\\"]。\\\\n2. 仅包含表名称，无需注释。\\\\n3. **禁止添加列表外的表**。\\\\n4. 表的选择范围可以适当大一些。\\\\n4. 无业务相关性时输出空数组：[]\\\\n\\\\n\\\\n请回复纯JSON，不要包含其他内容。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"用户需求：{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"175153953988444160\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":564,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"tables\\\",\\\"nodeId\\\":\\\"175149164433014784\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"175505963485245440\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1166,\\\"y\\\":802,\\\"properties\\\":{\\\"text\\\":\\\"生成图表\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"千问coder\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"根据以下数据以及用户需求生成符合格式要求的图表数据。\\\\n\\\\n\\\\n## 工作流程：\\\\n\\\\n\\\\n1. 根据用户需求选择一个合适的数据集\\\\n2. 根据数据集和需求，从图表列表中选择一个合适的图标类型。\\\\n3. 组装最终输出的json\\\\n\\\\n\\\\n⸻\\\\n## 可选的图表如下（标识|描述）：\\\\n\\\\n\\\\n- 1维图表\\\\n    - bar.simple|普通柱形图\\\\n    - bar.background|带背景柱形图\\\\n    - bar.horizontal|横向柱形图\\\\n    - line.simple|普通折线图\\\\n    - line.area|面积堆积折线图\\\\n    - line.smooth|平滑曲线折线图\\\\n    - line.step|阶梯折线图\\\\n    - pie.simple|普通饼图\\\\n    - pie.doughnut|环状饼图\\\\n    - pie.rose|南丁格尔玫瑰饼图\\\\n    - scatter.simple|普通散点图\\\\n    - funnel.simple|普通漏斗图\\\\n    - funnel.pyramid|金字塔漏斗图\\\\n    - pictorial.spirits|普通象形图\\\\n    - map.scatter|点地图\\\\n    - gauge.simple|360°仪表盘\\\\n    - gauge.simple180|180°仪表盘\\\\n- 2维\\\\n    - bar.multi|多数据对比柱形图\\\\n    - bar.negative|正负条形图\\\\n    - bar.stack|堆叠柱形图\\\\n    - bar.stack.horizontal|堆叠条形图\\\\n    - bar.multi.horizontal|多数据条形柱状图\\\\n    - line.multi|多数据对比折线图\\\\n    - mixed.linebar|普通折柱图\\\\n    - scatter.bubble|气泡散点图\\\\n    - radar.basic|普通雷达图\\\\n    - radar.custom|圆形雷达图\\\\n⸻\\\\n## 数据集格式说明：\\\\n```\\\\n{\\\\n  \\\\\\\"dbId\\\\\\\": \\\\\\\"1069915169263800320\\\\\\\",\\\\n  \\\\\\\"code\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n  \\\\\\\"title\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n  \\\\\\\"isList\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n  \\\\\\\"type\\\\\\\": \\\\\\\"0\\\\\\\",\\\\n  \\\\\\\"children\\\\\\\": [\\\\n    {\\\\n      \\\\\\\"title\\\\\\\": \\\\\\\"total_sales\\\\\\\",\\\\n      \\\\\\\"fieldText\\\\\\\": \\\\\\\"total_sales\\\\\\\"\\\\n    },\\\\n    {\\\\n      \\\\\\\"title\\\\\\\": \\\\\\\"total_returns\\\\\\\",\\\\n      \\\\\\\"fieldText\\\\\\\": \\\\\\\"total_returns\\\\\\\"\\\\n    }\\\\n  ]\\\\n}\\\\n```\\\\n* code：数据集变量名\\\\n* isList：为”1”表示集合，“0”表示对象\\\\n* children：为字段列表，包含title（字段名）和fieldText（展示名）\\\\n* type：0|sql,1|api,2|code,3|json\\\\n⸻\\\\n## 输出json格式\\\\n{\\\\n    \\\\\\\"dataType\\\\\\\": \\\\\\\"sql\\\\\\\",\\\\n    \\\\\\\"apiStatus\\\\\\\": \\\\\\\"0\\\\\\\",\\\\n    \\\\\\\"apiUrl\\\\\\\": \\\\\\\"\\\\\\\",\\\\n    \\\\\\\"dataId\\\\\\\": \\\\\\\"1069898455939633152\\\\\\\",\\\\n    \\\\\\\"axisX\\\\\\\": \\\\\\\"supplier_name\\\\\\\",\\\\n    \\\\\\\"axisY\\\\\\\": \\\\\\\"total_returns\\\\\\\",\\\\n    \\\\\\\"series\\\\\\\": \\\\\\\"material_name\\\\\\\",\\\\n    \\\\\\\"yText\\\\\\\": \\\\\\\"total_returns\\\\\\\",\\\\n    \\\\\\\"xText\\\\\\\": \\\\\\\"supplier_name\\\\\\\",\\\\n    \\\\\\\"dbCode\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n    \\\\\\\"isCustomPropName\\\\\\\": false,\\\\n    \\\\\\\"chartType\\\\\\\": \\\\\\\"line.multi\\\\\\\",\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"0aGl4PUfbIfy8BMF\\\\\\\",\\\\n    \\\\\\\"run\\\\\\\": 1,\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"\\\\\\\",\\\\n}\\\\n* dataType：与数据集type对应(0|sql,1|api,2|code,3|json)\\\\n* dataId：对应数据集dbId\\\\n* dbCode：对应数据集的code\\\\n* axisX：分类属性，从数据集字段中取值（fieldText)\\\\n* axisY：值属性，从数据集字段中取值（fieldText)\\\\n* series: 系列，从数据集字段中取值（fieldText）\\\\n* xText：分类属性显示，从数据集字段中取值（title)\\\\n* yText：值属性显示，从数据集字段中取值（title)\\\\n* chartType：图表的标识\\\\n* title：为这个图表起一个标题\\\\n* isCustomPropName: 如果是api数据集,该值为true\\\\n* apiStatus: 如果是api数据集则等于\\\\\\\"1\\\\\\\"，否则\\\\\\\"0\\\\\\\"\\\\n\\\\n\\\\n## 输出格式\\\\n* 直接返回JSON数据，不要解释，不要md语法，不要换行符，不要有注释。\\\\n* 确保输出的json格式正确完整。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"## 用户数据集：\\\\n{{ddl}}\\\\n## 用户需求：\\\\n{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"175506006644633600\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":769,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"chart\\\",\\\"nodeId\\\":\\\"175505963485245440\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"175807569594040320\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1166,\\\"y\\\":1018,\\\"properties\\\":{\\\"text\\\":\\\"意图识别\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897835602959695874\\\",\\\"params\\\":{\\\"model\\\":\\\"qwen-max\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"请根据用户需求与数据集设计，综合判断应执行的工作流步骤，并为每个步骤生成简洁明确的需求描述，同时选择最合适的数据集。\\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 可选步骤（格式：标识 | 功能说明）\\\\n\\\\n\\\\n- `genJsonRows` | 生成报表（可选）  \\\\n- `genChart` | 生成图表（可选）  \\\\n\\\\n\\\\n> **注意：** 至少选择一个步骤，亦可同时选择两者。\\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 数据集格式\\\\n\\\\n\\\\n```json\\\\n{\\\\n  \\\\\\\"dbId\\\\\\\": \\\\\\\"1069915169263800320\\\\\\\",\\\\n  \\\\\\\"code\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n  \\\\\\\"title\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n  \\\\\\\"isList\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n  \\\\\\\"type\\\\\\\": \\\\\\\"0\\\\\\\",\\\\n  \\\\\\\"children\\\\\\\": [\\\\n    {\\\\n      \\\\\\\"title\\\\\\\": \\\\\\\"total_sales\\\\\\\",\\\\n      \\\\\\\"fieldText\\\\\\\": \\\\\\\"total_sales\\\\\\\"\\\\n    },\\\\n    {\\\\n      \\\\\\\"title\\\\\\\": \\\\\\\"total_returns\\\\\\\",\\\\n      \\\\\\\"fieldText\\\\\\\": \\\\\\\"total_returns\\\\\\\"\\\\n    }\\\\n  ]\\\\n}\\\\n* code：数据集变量名\\\\n* isList：为”1”表示集合，“0”表示对象\\\\n* children：为字段列表，包含title（展示名）和fieldText（字段名）\\\\n* type：0|sql,1|api,2|code,3|json\\\\n\\\\n\\\\n⸻\\\\n## 输出格式\\\\n\\\\n\\\\n```\\\\n步骤标识1|需求描述1|数据集code,步骤标识2|需求描述2|数据集code\\\\n```\\\\n\\\\n\\\\n* 各步骤之间用英文逗号,分隔\\\\n* 不得添加额外说明，不要md语法，不要换行符，不要有注释。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"## 用户数据集：\\\\n{{ddl}}\\\\n## 用户需求：\\\\n{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"175808663015538688\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":985,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"intent\\\",\\\"nodeId\\\":\\\"175807569594040320\\\"}],\\\"height\\\":114,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"172957153288454144\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"172956395755208704\\\",\\\"targetNodeId\\\":\\\"172957153284259840\\\",\\\"sourceAnchorId\\\":\\\"172956395755208704_output\\\",\\\"targetAnchorId\\\":\\\"172957153284259840_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1332,\\\"y\\\":101},{\\\"x\\\":1432,\\\"y\\\":101},{\\\"x\\\":1377,\\\"y\\\":103},{\\\"x\\\":1477,\\\"y\\\":103}]},{\\\"id\\\":\\\"173365501234540544\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"173365501230346240\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"173365501230346240_input\\\",\\\"pointsList\\\":[{\\\"x\\\":428,\\\"y\\\":443},{\\\"x\\\":528,\\\"y\\\":443},{\\\"x\\\":422,\\\"y\\\":456},{\\\"x\\\":522,\\\"y\\\":456}]},{\\\"id\\\":\\\"173366253650735104\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365800833675264\\\",\\\"targetNodeId\\\":\\\"173366253646540800\\\",\\\"sourceAnchorId\\\":\\\"173365800833675264_output\\\",\\\"targetAnchorId\\\":\\\"173366253646540800_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1333,\\\"y\\\":309},{\\\"x\\\":1433,\\\"y\\\":309},{\\\"x\\\":1377,\\\"y\\\":310},{\\\"x\\\":1477,\\\"y\\\":310}]},{\\\"id\\\":\\\"173372961415852032\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"172956395755208704\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_source_if\\\",\\\"targetAnchorId\\\":\\\"172956395755208704_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":490},{\\\"x\\\":954,\\\"y\\\":490},{\\\"x\\\":900,\\\"y\\\":101},{\\\"x\\\":1000,\\\"y\\\":101}]},{\\\"id\\\":\\\"173372967073968128\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"173365800833675264\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_2\\\",\\\"targetAnchorId\\\":\\\"173365800833675264_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":516},{\\\"x\\\":954,\\\"y\\\":516},{\\\"x\\\":901,\\\"y\\\":309},{\\\"x\\\":1001,\\\"y\\\":309}]},{\\\"id\\\":\\\"173372974988619776\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"173366439085109248\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_source_else\\\",\\\"targetAnchorId\\\":\\\"173366439085109248_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":620},{\\\"x\\\":954,\\\"y\\\":620},{\\\"x\\\":892,\\\"y\\\":1183},{\\\"x\\\":992,\\\"y\\\":1183}]},{\\\"id\\\":\\\"175149164437209088\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"175149164433014784\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_3\\\",\\\"targetAnchorId\\\":\\\"175149164433014784_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":542},{\\\"x\\\":954,\\\"y\\\":542},{\\\"x\\\":898,\\\"y\\\":539},{\\\"x\\\":998,\\\"y\\\":539}]},{\\\"id\\\":\\\"175153997969915904\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"175149164433014784\\\",\\\"targetNodeId\\\":\\\"175153953988444160\\\",\\\"sourceAnchorId\\\":\\\"175149164433014784_output\\\",\\\"targetAnchorId\\\":\\\"175153953988444160_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1330,\\\"y\\\":539},{\\\"x\\\":1430,\\\"y\\\":539},{\\\"x\\\":1377,\\\"y\\\":538},{\\\"x\\\":1477,\\\"y\\\":538}]},{\\\"id\\\":\\\"175505963489439744\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"175505963485245440\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_4\\\",\\\"targetAnchorId\\\":\\\"175505963485245440_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":568},{\\\"x\\\":954,\\\"y\\\":568},{\\\"x\\\":900,\\\"y\\\":743},{\\\"x\\\":1000,\\\"y\\\":743}]},{\\\"id\\\":\\\"175506006648827904\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"175505963485245440\\\",\\\"targetNodeId\\\":\\\"175506006644633600\\\",\\\"sourceAnchorId\\\":\\\"175505963485245440_output\\\",\\\"targetAnchorId\\\":\\\"175506006644633600_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1332,\\\"y\\\":743},{\\\"x\\\":1432,\\\"y\\\":743},{\\\"x\\\":1377,\\\"y\\\":743},{\\\"x\\\":1477,\\\"y\\\":743}]},{\\\"id\\\":\\\"175807569598234624\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"175807569594040320\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_5\\\",\\\"targetAnchorId\\\":\\\"175807569594040320_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":594},{\\\"x\\\":954,\\\"y\\\":594},{\\\"x\\\":900,\\\"y\\\":959},{\\\"x\\\":1000,\\\"y\\\":959}]},{\\\"id\\\":\\\"175808663019732992\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"175807569594040320\\\",\\\"targetNodeId\\\":\\\"175808663015538688\\\",\\\"sourceAnchorId\\\":\\\"175807569594040320_output\\\",\\\"targetAnchorId\\\":\\\"175808663015538688_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1332,\\\"y\\\":959},{\\\"x\\\":1432,\\\"y\\\":959},{\\\"x\\\":1377,\\\"y\\\":959},{\\\"x\\\":1477,\\\"y\\\":959}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"intent\\\",\\\"nodeId\\\":\\\"175807569594040320\\\"},{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"表结构\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"dbtype\\\",\\\"name\\\":\\\"数据库类型\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"bizType\\\",\\\"name\\\":\\\"业务类型\\\",\\\"type\\\":\\\"string\\\"}]}');\n\n-- ---author:wangshuai-date:20250418-----for: 添加ocr识别示例 菜单\nINSERT INTO sys_permission (id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('1912753560201089025', '1438108178010202113', 'OCR识别', '/ai/ocr', 'super/airag/ocr/AiOcrList', 1, '', NULL, 1, NULL, '0', 1.00, 0, 'ant-design:scan-outlined', 1, 0, 0, 0, NULL, 'admin', '2025-04-17 14:22:41', 'admin', '2025-04-18 10:07:40', 0, 0, NULL, 0);\n\n-- ---author:chenrui-date:20250424-----for: 修改示例流程入参,删除多余的入参\nUPDATE `airag_flow` SET `create_by` = 'admin', `create_time` = '2025-02-19 20:13:03', `update_by` = 'jeecg', `update_time` = '2025-04-24 12:25:08', `sys_org_code` = 'A04', `tenant_id` = NULL, `application_name` = 'jeecg', `name` = '示例_条件分支', `descr` = NULL, `icon` = NULL, `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'a448577f-9824-415b-97f6-72543fcb619d\\')).to(\\n        end.tag(\\'91a7df56-107c-4f83-b1e4-b1b7e392c4e3\\'),\\n        end.tag(\\'162160595291774976\\')\\n    ).tag(\\'a448577f-9824-415b-97f6-72543fcb619d\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":515,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":731,\\\"y\\\":486,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"question\\\",\\\"operator\\\":\\\"CONTAINS\\\",\\\"value\\\":\\\"jeecg\\\"}],\\\"next\\\":\\\"162160595291774976\\\"}],\\\"else\\\":{\\\"next\\\":\\\"91a7df56-107c-4f83-b1e4-b1b7e392c4e3\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":118}},{\\\"id\\\":\\\"91a7df56-107c-4f83-b1e4-b1b7e392c4e3\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1085,\\\"y\\\":662,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{res}}不包含jeecg\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"162160595291774976\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1084,\\\"y\\\":361,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{res}}包含jeecg\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"height\\\":136,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"d5124609-d92e-4966-aff8-e220d0d1dbcd\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":500},{\\\"x\\\":566,\\\"y\\\":500},{\\\"x\\\":465,\\\"y\\\":458},{\\\"x\\\":565,\\\"y\\\":458}]},{\\\"id\\\":\\\"ea3d924a-e4fd-4bb4-bc8a-d1f07119a7eb\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d\\\",\\\"targetNodeId\\\":\\\"91a7df56-107c-4f83-b1e4-b1b7e392c4e3\\\",\\\"sourceAnchorId\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d_source_else\\\",\\\"targetAnchorId\\\":\\\"91a7df56-107c-4f83-b1e4-b1b7e392c4e3_input\\\",\\\"pointsList\\\":[{\\\"x\\\":897,\\\"y\\\":518},{\\\"x\\\":997,\\\"y\\\":518},{\\\"x\\\":819,\\\"y\\\":625},{\\\"x\\\":919,\\\"y\\\":625}]},{\\\"id\\\":\\\"162161801783320576\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d\\\",\\\"targetNodeId\\\":\\\"162160595291774976\\\",\\\"sourceAnchorId\\\":\\\"a448577f-9824-415b-97f6-72543fcb619d_source_if\\\",\\\"targetAnchorId\\\":\\\"162160595291774976_input\\\",\\\"pointsList\\\":[{\\\"x\\\":897,\\\"y\\\":492},{\\\"x\\\":997,\\\"y\\\":492},{\\\"x\\\":818,\\\"y\\\":324},{\\\"x\\\":918,\\\"y\\\":324}]}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":true,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"}]}' WHERE `id` = '1892185624983658497';\nUPDATE `airag_flow` SET `create_by` = 'jeecg', `create_time` = '2025-02-21 11:11:36', `update_by` = 'jeecg', `update_time` = '2025-04-24 12:27:02', `sys_org_code` = 'A04', `tenant_id` = NULL, `application_name` = 'jeecg', `name` = '示例_LLM', `descr` = '', `icon` = NULL, `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'e9f3470a-f129-4baf-880a-294d7b3bff93\\'),\\n    end.tag(\\'9eb6f5c7-94a6-421f-aa39-7cfd7cec44f1\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":273,\\\"y\\\":419,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"e9f3470a-f129-4baf-880a-294d7b3bff93\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":708,\\\"y\\\":435,\\\"properties\\\":{\\\"text\\\":\\\"llm\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你将扮演一个人物角色李白，以下是关于这个角色的详细设定，请根据这些信息来构建你的回答。 \\\\n\\\\n**人物基本信息：**\\\\n- 你是：李白\\\\n- 人称：第一人称\\\\n- 出身背景与上下文：李白出生于安西都护府碎叶城（今吉尔吉斯斯坦托克马克市附近），五岁时随父迁居绵州昌隆县（今四川江油）。他出身于富商家庭，家境优渥，自幼接受良好的教育，遍览诸子百家之书，展现出极高的文学天赋与才情，且喜好剑术，心怀远大抱负，立志在政治与文学上都有所建树，一生渴望入仕报国，却又历经坎坷波折，在仕途上起起落落，最终在诗酒与游历中度过了其传奇的一生。\\\\n**性格特点：**\\\\n- 豪放不羁：他不受世俗礼教束缚，行事洒脱，常以狂放之态示人，饮酒作乐，挥毫泼墨，尽显自由奔放的性情。例如 “我本楚狂人，凤歌笑孔丘”，敢于对传统观念表达自己的不羁态度。\\\\n- 自信豁达：坚信自己的才华与能力，面对困境与挫折时总能以豁达胸怀看待。像 “天生我材必有用，千金散尽还复来”，即便遭遇仕途不顺、生活潦倒，依然对未来充满信心。\\\\n- 重情重义：珍视友情，与众多友人诗酒唱和，在与友人分别时也会真情流露，如 “桃花潭水深千尺，不及汪伦送我情”，用深情笔触描绘出对友人的不舍与感激。\\\\n- 浪漫洒脱：充满天马行空的想象，其诗中多有对神仙世界、奇幻自然的描绘，追求精神上的自由与超脱，如 “飞流直下三千尺，疑是银河落九天” 这般充满奇幻瑰丽想象的诗句便是他浪漫性情的写照。\\\\n**语言风格：**\\\\n- 富有想象力与夸张手法：常以夸张的笔触描绘事物，营造出强烈的艺术感染力与震撼力，使读者仿佛身临其境。如 “白发三千丈，缘愁似个长”，用极度夸张的白发长度来形容愁绪之深。 \\\\n- 语言优美且自然流畅：用词精准华丽，却又毫无雕琢之感，诗句如行云流水般自然，读来朗朗上口，兼具音乐性与节奏感。像 “故人西辞黄鹤楼，烟花三月下扬州。孤帆远影碧空尽，唯见长江天际流”，文字优美，意境深远，节奏明快。 \\\\n- 善用典故与比喻：通过巧妙运用历史典故和形象比喻，增添诗歌的文化底蕴与内涵深度，使诗句更加含蓄蕴藉又易于理解。例如 “闲来垂钓碧溪上，忽复乘舟梦日边”，借用姜太公垂钓与伊尹梦日的典故表达自己对仕途的期待。 \\\\n**人际关系：**\\\\n- 与杜甫：李白与杜甫堪称唐代诗坛的双子星，二人相互倾慕，结下深厚情谊。他们曾一同游历，在诗歌创作上相互切磋交流，杜甫有多首诗表达对李白的思念与敬仰，李白也对杜甫颇为欣赏，他们的友情成为文学史上的佳话。\\\\n- 与汪伦：汪伦以美酒盛情款待李白，李白深受感动，留下 “桃花潭水深千尺，不及汪伦送我情” 的千古名句，可见他们之间真挚的友情。\\\\n- 与贺知章：贺知章对李白的才华极为赏识，称其为 “谪仙人”，二人在长安官场与诗坛都有交往，这种知遇之情对李白的声誉与心境都产生了积极影响。\\\\n- 与唐玄宗：李白曾受唐玄宗征召入宫，供奉翰林，本以为可大展政治抱负，然而玄宗只是将他视为文学侍从，为宫廷宴乐作诗助兴，这段君臣关系最终以李白被赐金放还而告终，使李白在仕途理想上遭受重大挫折。\\\\n**经典台词或口头禅：**\\\\n- 台词1：“仰天大笑出门去，我辈岂是蓬蒿人。” 表达出其对自身才华的自信以及即将踏入仕途、一展宏图的豪迈与喜悦。 \\\\n- 台词2：“安能摧眉折腰事权贵，使我不得开心颜。” 体现出他不向权贵低头，坚守人格尊严与精神自由的高尚情操与不屈性格。\\\\n- 台词2：“长风破浪会有时，直挂云帆济沧海。” 展现出面对困难时的乐观态度与坚定信念，相信总有一天能够乘风破浪，实现理想抱负。\\\\n\\\\n要求： \\\\n- 根据上述提供的角色设定，以第一人称视角进行表达。 \\\\n- 在回答时，尽可能地融入该角色的性格特点、语言风格以及其特有的口头禅或经典台词。\\\\n- 如果适用的话，在适当的地方加入（）内的补充信息，如动作、神情等，以增强对话的真实感和生动性。 \\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{inParam1}}\\\"}]},\\\"inputParams\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"name\\\":\\\"inParam1\\\",\\\"field\\\":\\\"content\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"text\\\"}],\\\"width\\\":332,\\\"height\\\":180}},{\\\"id\\\":\\\"9eb6f5c7-94a6-421f-aa39-7cfd7cec44f1\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1186,\\\"y\\\":467,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"回复：{{回复内容}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"nodeId\\\":\\\"e9f3470a-f129-4baf-880a-294d7b3bff93\\\",\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"text\\\"}],\\\"width\\\":332,\\\"height\\\":136}}],\\\"edges\\\":[{\\\"id\\\":\\\"ab818150-d4e5-4be2-8d80-31b7f48dc318\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"e9f3470a-f129-4baf-880a-294d7b3bff93\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"e9f3470a-f129-4baf-880a-294d7b3bff93_input\\\",\\\"pointsList\\\":[{\\\"x\\\":439,\\\"y\\\":404},{\\\"x\\\":539,\\\"y\\\":404},{\\\"x\\\":442,\\\"y\\\":376},{\\\"x\\\":542,\\\"y\\\":376}]},{\\\"id\\\":\\\"158143255481139200\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"e9f3470a-f129-4baf-880a-294d7b3bff93\\\",\\\"targetNodeId\\\":\\\"9eb6f5c7-94a6-421f-aa39-7cfd7cec44f1\\\",\\\"sourceAnchorId\\\":\\\"e9f3470a-f129-4baf-880a-294d7b3bff93_output\\\",\\\"targetAnchorId\\\":\\\"9eb6f5c7-94a6-421f-aa39-7cfd7cec44f1_input\\\",\\\"pointsList\\\":[{\\\"x\\\":874,\\\"y\\\":376},{\\\"x\\\":974,\\\"y\\\":376},{\\\"x\\\":920,\\\"y\\\":430},{\\\"x\\\":1020,\\\"y\\\":430}]}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"}]}' WHERE `id` = '1892774140436287490';\nUPDATE `airag_flow` SET `create_by` = 'admin', `create_time` = '2025-03-04 13:45:01', `update_by` = 'jeecg', `update_time` = '2025-04-24 12:26:54', `sys_org_code` = 'A04', `tenant_id` = '', `application_name` = 'jeecg', `name` = '示例_分类器', `descr` = NULL, `icon` = NULL, `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(classifier.tag(\\'159899349256073216\\')).to(\\n        end.tag(\\'159899421356158976\\'),\\n        end.tag(\\'159899641326432256\\'),\\n        end.tag(\\'159900616165302272\\'),\\n        end.tag(\\'160202618435485696\\')\\n    ).tag(\\'159899349256073216\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":334,\\\"y\\\":653,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"内容\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"159899349256073216\\\",\\\"type\\\":\\\"classifier\\\",\\\"x\\\":714,\\\"y\\\":719,\\\"properties\\\":{\\\"text\\\":\\\"分类器\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"gpt-4o-mini\\\",\\\"temperature\\\":0.7}},\\\"categories\\\":[{\\\"category\\\":\\\"用户问的问题是关于编程的\\\",\\\"next\\\":\\\"159899421356158976\\\"},{\\\"category\\\":\\\"用户问的问题是关于食谱的\\\",\\\"next\\\":\\\"159899641326432256\\\"},{\\\"category\\\":\\\"其他问题\\\",\\\"next\\\":\\\"159900616165302272\\\"}],\\\"else\\\":{\\\"next\\\":\\\"160202618435485696\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":224,\\\"width\\\":332}},{\\\"id\\\":\\\"159899421356158976\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1144,\\\"y\\\":566,\\\"properties\\\":{\\\"text\\\":\\\"结束1\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"分类：{{分类索引}}\\\\n-------\\\\n{{回复内容}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"回复内容\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"159899641326432256\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1144,\\\"y\\\":715,\\\"properties\\\":{\\\"text\\\":\\\"结束2\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"分类：{{分类索引}}\\\\n-------\\\\n{{回复内容}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"回复内容\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"159900616165302272\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1144,\\\"y\\\":864,\\\"properties\\\":{\\\"text\\\":\\\"结束3\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"分类：{{分类索引}}\\\\n-------\\\\n{{回复内容}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"回复内容\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"160202618435485696\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1146,\\\"y\\\":1001,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"}],\\\"height\\\":114,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"159899349260267520\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"159899349256073216\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"159899349256073216_input\\\",\\\"pointsList\\\":[{\\\"x\\\":500,\\\"y\\\":638},{\\\"x\\\":600,\\\"y\\\":638},{\\\"x\\\":448,\\\"y\\\":638},{\\\"x\\\":548,\\\"y\\\":638}]},{\\\"id\\\":\\\"159899421356158977\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"159899349256073216\\\",\\\"targetNodeId\\\":\\\"159899421356158976\\\",\\\"sourceAnchorId\\\":\\\"159899349256073216_case_1\\\",\\\"targetAnchorId\\\":\\\"159899421356158976_input\\\",\\\"pointsList\\\":[{\\\"x\\\":880,\\\"y\\\":672},{\\\"x\\\":980,\\\"y\\\":672},{\\\"x\\\":878,\\\"y\\\":529},{\\\"x\\\":978,\\\"y\\\":529}]},{\\\"id\\\":\\\"159899706925346816\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"159899349256073216\\\",\\\"targetNodeId\\\":\\\"159899641326432256\\\",\\\"sourceAnchorId\\\":\\\"159899349256073216_case_2\\\",\\\"targetAnchorId\\\":\\\"159899641326432256_input\\\",\\\"pointsList\\\":[{\\\"x\\\":880,\\\"y\\\":716},{\\\"x\\\":980,\\\"y\\\":716},{\\\"x\\\":878,\\\"y\\\":678},{\\\"x\\\":978,\\\"y\\\":678}]},{\\\"id\\\":\\\"159900640542597120\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"159899349256073216\\\",\\\"targetNodeId\\\":\\\"159900616165302272\\\",\\\"sourceAnchorId\\\":\\\"159899349256073216_case_3\\\",\\\"targetAnchorId\\\":\\\"159900616165302272_input\\\",\\\"pointsList\\\":[{\\\"x\\\":880,\\\"y\\\":760},{\\\"x\\\":980,\\\"y\\\":760},{\\\"x\\\":878,\\\"y\\\":827},{\\\"x\\\":978,\\\"y\\\":827}]},{\\\"id\\\":\\\"177966745116012544\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"159899349256073216\\\",\\\"targetNodeId\\\":\\\"160202618435485696\\\",\\\"sourceAnchorId\\\":\\\"159899349256073216_case_else\\\",\\\"targetAnchorId\\\":\\\"160202618435485696_input\\\",\\\"pointsList\\\":[{\\\"x\\\":880,\\\"y\\\":804},{\\\"x\\\":980,\\\"y\\\":804},{\\\"x\\\":880,\\\"y\\\":975},{\\\"x\\\":980,\\\"y\\\":975}]}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"159899349256073216\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"内容\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"}]}' WHERE `id` = '1896799016980885506';\nUPDATE `airag_flow` SET `create_by` = 'jeecg', `create_time` = '2025-03-06 11:01:45', `update_by` = 'jeecg', `update_time` = '2025-04-24 12:27:58', `sys_org_code` = 'A04', `tenant_id` = NULL, `application_name` = 'jeecg', `name` = '示例_脚本组件', `descr` = NULL, `icon` = NULL, `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    code_160582647542648832.tag(\\'code_160582647542648832\\'),\\n    end.tag(\\'160583273626406912\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":455,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"内容\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"内容2\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"code_160582647542648832\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":786,\\\"y\\\":488,\\\"properties\\\":{\\\"text\\\":\\\"脚本执行\\\",\\\"options\\\":{\\\"codeType\\\":\\\"javascript\\\",\\\"code\\\":\\\"function main(params) {\\\\n  return {\\\\n    result: params.arg1 + \\'_拼接_\\' + params.arg2,\\\\n  }\\\\n}\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"arg1\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"arg2\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"height\\\":158,\\\"width\\\":332}},{\\\"id\\\":\\\"160583273626406912\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1272,\\\"y\\\":466,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{res}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"code_160582647542648832\\\"}],\\\"height\\\":114,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"160582647546843136\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"code_160582647542648832\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"code_160582647542648832_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":440},{\\\"x\\\":566,\\\"y\\\":440},{\\\"x\\\":520,\\\"y\\\":440},{\\\"x\\\":620,\\\"y\\\":440}]},{\\\"id\\\":\\\"160583273626406913\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_160582647542648832\\\",\\\"targetNodeId\\\":\\\"160583273626406912\\\",\\\"sourceAnchorId\\\":\\\"code_160582647542648832_output\\\",\\\"targetAnchorId\\\":\\\"160583273626406912_input\\\",\\\"pointsList\\\":[{\\\"x\\\":952,\\\"y\\\":440},{\\\"x\\\":1052,\\\"y\\\":440},{\\\"x\\\":1006,\\\"y\\\":440},{\\\"x\\\":1106,\\\"y\\\":440}]}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"code_160582647542648832\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"内容\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"}]}' WHERE `id` = '1897482706871164929';\nUPDATE `airag_flow` SET `create_by` = 'jeecg', `create_time` = '2025-03-06 11:58:23', `update_by` = 'jeecg', `update_time` = '2025-04-14 14:11:45', `sys_org_code` = 'A04', `tenant_id` = NULL, `application_name` = 'jeecg', `name` = '示例_java增强', `descr` = NULL, `icon` = NULL, `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    enhanceJava.tag(\\'160591592557232128\\'),\\n    end.tag(\\'160595080985034752\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":471,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"问题1\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":true},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"问题2\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":122,\\\"width\\\":332}},{\\\"id\\\":\\\"160591592557232128\\\",\\\"type\\\":\\\"enhanceJava\\\",\\\"x\\\":786,\\\"y\\\":503,\\\"properties\\\":{\\\"text\\\":\\\"Java增强\\\",\\\"options\\\":{\\\"enhance\\\":{\\\"type\\\":\\\"class\\\",\\\"path\\\":\\\"org.jeecg.TestAiragEnhance\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"arg1\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"arg2\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"height\\\":188,\\\"width\\\":332}},{\\\"id\\\":\\\"160595080985034752\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1272,\\\"y\\\":492,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{res}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"160591592557232128\\\"}],\\\"height\\\":166,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"160591592565620736\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"160591592557232128\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"160591592557232128_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":441},{\\\"x\\\":566,\\\"y\\\":441},{\\\"x\\\":520,\\\"y\\\":440},{\\\"x\\\":620,\\\"y\\\":440}]},{\\\"id\\\":\\\"160595080989229056\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160591592557232128\\\",\\\"targetNodeId\\\":\\\"160595080985034752\\\",\\\"sourceAnchorId\\\":\\\"160591592557232128_output\\\",\\\"targetAnchorId\\\":\\\"160595080985034752_input\\\",\\\"pointsList\\\":[{\\\"x\\\":952,\\\"y\\\":440},{\\\"x\\\":1052,\\\"y\\\":440},{\\\"x\\\":1006,\\\"y\\\":440},{\\\"x\\\":1106,\\\"y\\\":440}]}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"问题1\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"问题2\\\",\\\"type\\\":\\\"string\\\"}]}' WHERE `id` = '1897496956167577601';\n\n-- ---author:chenrui-date:20250428-----for: 修改示例流程-全部脚本,删除python脚本节点\nUPDATE `airag_flow` SET `chain`='THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'160650416019521536\\'),\\n    WHEN(\\n        code_160652991133433856.tag(\\'code_160652991133433856\\'),\\n        code_166081977564753920.tag(\\'code_166081977564753920\\'),\\n        code_166090618376253440.tag(\\'code_166090618376253440\\'),\\n        code_167835393352683520.tag(\\'code_167835393352683520\\')\\n    ).tag(\\\"code_160652991133433856\\\"),\\n    end.tag(\\'160656278891560960\\')\\n).tag(\\\"start-node\\\")',`design`='{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":418,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"160650416019521536\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":693,\\\"y\\\":462,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":null,\\\"topP\\\":0.9,\\\"presencePenalty\\\":0.1,\\\"frequencyPenalty\\\":0.1}},\\\"history\\\":4,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色\\\\n你是一位严厉的长辈，面对用户的问题，要以一种带着隐隐批评，暗示问题简单、用户还有很多需要学习的态度来回复。通过大模型模拟李白来对话，回答用户提出的各种问题。\\\\n\\\\n\\\\n## 技能\\\\n### 技能 1: 回答问题\\\\n1. 当用户提出问题时，先简要评价问题较为简单，然后给出回答。\\\\n2. 回答完问题后，适当提及用户还需要加强学习、增长见识等内容。\\\\n\\\\n\\\\n## 限制:\\\\n- 回复内容必须逻辑清晰、语言通顺，符合严厉长辈的角色设定。 \\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"code_160652991133433856\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":1131,\\\"y\\\":87,\\\"properties\\\":{\\\"text\\\":\\\"js\\\",\\\"options\\\":{\\\"codeType\\\":\\\"javascript\\\",\\\"code\\\":\\\"function main(params) {\\\\n  if(params.llmRes){\\\\n    let resLength  = params.llmRes.length\\\\n    params.llmRes = params.llmRes + \\'\\\\\\\\n字数：\\'+resLength\\\\n  }\\\\n  return {\\\\n    result: params.llmRes,\\\\n  }\\\\n}\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"llmRes\\\",\\\"nodeId\\\":\\\"160650416019521536\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"height\\\":158,\\\"width\\\":332}},{\\\"id\\\":\\\"160656278891560960\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1653,\\\"y\\\":449,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"js:{{res}}\\\\ngroovy:{{res1}}\\\\nkotlin:{{res2}}\\\\npython:{{res3}}\\\\naviator:{{res4}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"code_160652991133433856\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res1\\\",\\\"nodeId\\\":\\\"code_166081977564753920\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res2\\\",\\\"nodeId\\\":\\\"code_166090618376253440\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res3\\\",\\\"nodeId\\\":\\\"code_167828303175372800\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res4\\\",\\\"nodeId\\\":\\\"code_167835393352683520\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"code_166081977564753920\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":1141,\\\"y\\\":266,\\\"properties\\\":{\\\"text\\\":\\\"groovy\\\",\\\"options\\\":{\\\"codeType\\\":\\\"groovy\\\",\\\"code\\\":\\\"def main(params) {\\\\n    if (params.llmRes) {\\\\n        def resLength = params.llmRes.length()\\\\n        params.llmRes += \\\\\\\"\\\\\\\\n字数：\\\\\\\" + resLength\\\\n    }\\\\n    return [result: params.llmRes]\\\\n}\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"llmRes\\\",\\\"nodeId\\\":\\\"160650416019521536\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"height\\\":158,\\\"width\\\":332}},{\\\"id\\\":\\\"code_166090618376253440\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":1141,\\\"y\\\":449,\\\"properties\\\":{\\\"text\\\":\\\"kotlin\\\",\\\"options\\\":{\\\"codeType\\\":\\\"kotlin\\\",\\\"code\\\":\\\"fun main(params: MutableMap<String, Any?>): Map<String, Any?> {\\\\n    if (params[\\\\\\\"llmRes\\\\\\\"] is String) {\\\\n        val llmRes = params[\\\\\\\"llmRes\\\\\\\"] as String\\\\n        val resLength = llmRes.length\\\\n        params[\\\\\\\"llmRes\\\\\\\"] = \\\\\\\"$llmRes\\\\\\\\n字数1：$resLength\\\\\\\"\\\\n    }\\\\n    return mapOf(\\\\\\\"result\\\\\\\" to params[\\\\\\\"llmRes\\\\\\\"])\\\\n}\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"llmRes\\\",\\\"nodeId\\\":\\\"160650416019521536\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"height\\\":158,\\\"width\\\":332}},{\\\"id\\\":\\\"code_167835393352683520\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":1141,\\\"y\\\":667,\\\"properties\\\":{\\\"text\\\":\\\"aviator\\\",\\\"options\\\":{\\\"codeType\\\":\\\"aviator\\\",\\\"code\\\":\\\"let llmRes = params.llmRes;\\\\nlet resLength = length(llmRes);\\\\nlet  res = llmRes + \\\\\\\"\\\\\\\\n字数1：\\\\\\\" + resLength;\\\\nlet resp = seq.map(\\\\\\\"result\\\\\\\",res);\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"llmRes\\\",\\\"nodeId\\\":\\\"160650416019521536\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":158,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"160650416019521537\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"160650416019521536\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"160650416019521536_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":403},{\\\"x\\\":566,\\\"y\\\":403},{\\\"x\\\":427,\\\"y\\\":403},{\\\"x\\\":527,\\\"y\\\":403}]},{\\\"id\\\":\\\"160652991137628160\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160650416019521536\\\",\\\"targetNodeId\\\":\\\"code_160652991133433856\\\",\\\"sourceAnchorId\\\":\\\"160650416019521536_output\\\",\\\"targetAnchorId\\\":\\\"code_160652991133433856_input\\\",\\\"pointsList\\\":[{\\\"x\\\":859,\\\"y\\\":403},{\\\"x\\\":959,\\\"y\\\":403},{\\\"x\\\":865,\\\"y\\\":39},{\\\"x\\\":965,\\\"y\\\":39}]},{\\\"id\\\":\\\"160656278899949568\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_160652991133433856\\\",\\\"targetNodeId\\\":\\\"160656278891560960\\\",\\\"sourceAnchorId\\\":\\\"code_160652991133433856_output\\\",\\\"targetAnchorId\\\":\\\"160656278891560960_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1297,\\\"y\\\":39},{\\\"x\\\":1397,\\\"y\\\":39},{\\\"x\\\":1387,\\\"y\\\":412},{\\\"x\\\":1487,\\\"y\\\":412}]},{\\\"id\\\":\\\"166082001409372160\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160650416019521536\\\",\\\"targetNodeId\\\":\\\"code_166081977564753920\\\",\\\"sourceAnchorId\\\":\\\"160650416019521536_output\\\",\\\"targetAnchorId\\\":\\\"code_166081977564753920_input\\\",\\\"pointsList\\\":[{\\\"x\\\":859,\\\"y\\\":403},{\\\"x\\\":959,\\\"y\\\":403},{\\\"x\\\":875,\\\"y\\\":218},{\\\"x\\\":975,\\\"y\\\":218}]},{\\\"id\\\":\\\"166082017557442560\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_166081977564753920\\\",\\\"targetNodeId\\\":\\\"160656278891560960\\\",\\\"sourceAnchorId\\\":\\\"code_166081977564753920_output\\\",\\\"targetAnchorId\\\":\\\"160656278891560960_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1307,\\\"y\\\":218},{\\\"x\\\":1407,\\\"y\\\":218},{\\\"x\\\":1387,\\\"y\\\":412},{\\\"x\\\":1487,\\\"y\\\":412}]},{\\\"id\\\":\\\"166090719580614656\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160650416019521536\\\",\\\"targetNodeId\\\":\\\"code_166090618376253440\\\",\\\"sourceAnchorId\\\":\\\"160650416019521536_output\\\",\\\"targetAnchorId\\\":\\\"code_166090618376253440_input\\\",\\\"pointsList\\\":[{\\\"x\\\":859,\\\"y\\\":403},{\\\"x\\\":959,\\\"y\\\":403},{\\\"x\\\":875,\\\"y\\\":401},{\\\"x\\\":975,\\\"y\\\":401}]},{\\\"id\\\":\\\"166090725280673792\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_166090618376253440\\\",\\\"targetNodeId\\\":\\\"160656278891560960\\\",\\\"sourceAnchorId\\\":\\\"code_166090618376253440_output\\\",\\\"targetAnchorId\\\":\\\"160656278891560960_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1307,\\\"y\\\":401},{\\\"x\\\":1407,\\\"y\\\":401},{\\\"x\\\":1387,\\\"y\\\":412},{\\\"x\\\":1487,\\\"y\\\":412}]},{\\\"id\\\":\\\"167835393356877824\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160650416019521536\\\",\\\"targetNodeId\\\":\\\"code_167835393352683520\\\",\\\"sourceAnchorId\\\":\\\"160650416019521536_output\\\",\\\"targetAnchorId\\\":\\\"code_167835393352683520_input\\\",\\\"pointsList\\\":[{\\\"x\\\":859,\\\"y\\\":403},{\\\"x\\\":959,\\\"y\\\":403},{\\\"x\\\":875,\\\"y\\\":619},{\\\"x\\\":975,\\\"y\\\":619}]},{\\\"id\\\":\\\"167836988980817920\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_167835393352683520\\\",\\\"targetNodeId\\\":\\\"160656278891560960\\\",\\\"sourceAnchorId\\\":\\\"code_167835393352683520_output\\\",\\\"targetAnchorId\\\":\\\"160656278891560960_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1307,\\\"y\\\":619},{\\\"x\\\":1407,\\\"y\\\":619},{\\\"x\\\":1387,\\\"y\\\":412},{\\\"x\\\":1487,\\\"y\\\":412}]}]}' WHERE `id`='1897552224058400770';\n-- ---author:chenrui-date:20250430-----for: [QQYUN-11718]【AI】积木报表对接AI流程编排接口展示报表\nINSERT INTO `airag_flow` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `application_name`, `name`, `descr`, `icon`, `chain`, `design`, `status`, `metadata`) VALUES ('1917103567932604417', 'jeecg', '2025-04-29 14:28:03', 'jeecg', '2025-04-30 12:06:49', 'A04', NULL, 'jeecg', '示例_数据查询引擎', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    enhanceJava.tag(\\'180204885804785664\\'),\\n    llm.tag(\\'180211780498169856\\'),\\n    end.tag(\\'180204420713758720\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":376,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"pageNo\\\",\\\"name\\\":\\\"页码\\\",\\\"type\\\":\\\"number\\\",\\\"required\\\":false},{\\\"field\\\":\\\"pageSize\\\",\\\"name\\\":\\\"每页数量\\\",\\\"type\\\":\\\"number\\\",\\\"required\\\":false},{\\\"field\\\":\\\"bizData\\\",\\\"name\\\":\\\"文件路径\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"180204420713758720\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1648,\\\"y\\\":398,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{res}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"180211780498169856\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"180204885804785664\\\",\\\"type\\\":\\\"enhanceJava\\\",\\\"x\\\":794,\\\"y\\\":421,\\\"properties\\\":{\\\"text\\\":\\\"Java 增强\\\",\\\"options\\\":{\\\"enhance\\\":{\\\"type\\\":\\\"spring\\\",\\\"path\\\":\\\"jimuDataReader\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"bizData\\\",\\\"name\\\":\\\"bizData\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"datas\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"object[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"fields\\\",\\\"name\\\":\\\"字段列表\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"180211780498169856\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1229,\\\"y\\\":419,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"将以下数据整理成目标格式输出\\\\n## 工作流程：\\\\n1. 读取用户的数据\\\\n3. 组装最终输出的json\\\\n⸻\\\\n## 数据示例:data\\\\n```\\\\n{{data}}\\\\n```\\\\n## 数据示例:fields\\\\n```\\\\n{{fields}}\\\\n```\\\\n⸻\\\\n## 输出json格式\\\\n{\\\\n  \\\\\\\"data\\\\\\\": [\\\\n    {\\\\n      \\\\\\\"amount\\\\\\\": \\\\\\\"100\\\\\\\",\\\\n      \\\\\\\"month\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n      \\\\\\\"areaname\\\\\\\": \\\\\\\"华北\\\\\\\",\\\\n      \\\\\\\"year\\\\\\\": \\\\\\\"2020\\\\\\\",\\\\n      \\\\\\\"price\\\\\\\": \\\\\\\"5\\\\\\\",\\\\n      \\\\\\\"dept\\\\\\\": \\\\\\\"河北\\\\\\\",\\\\n      \\\\\\\"settleamount\\\\\\\": \\\\\\\"100\\\\\\\"\\\\n    },\\\\n    {\\\\n      \\\\\\\"amount\\\\\\\": \\\\\\\"200\\\\\\\",\\\\n      \\\\\\\"month\\\\\\\": \\\\\\\"2\\\\\\\",\\\\n      \\\\\\\"areaname\\\\\\\": \\\\\\\"华北\\\\\\\",\\\\n      \\\\\\\"year\\\\\\\": \\\\\\\"2020\\\\\\\",\\\\n      \\\\\\\"price\\\\\\\": \\\\\\\"5\\\\\\\",\\\\n      \\\\\\\"dept\\\\\\\": \\\\\\\"河北\\\\\\\",\\\\n      \\\\\\\"settleamount\\\\\\\": \\\\\\\"200\\\\\\\"\\\\n    },\\\\n  ],\\\\n  \\\\\\\"total\\\\\\\": 100,\\\\n  \\\\\\\"count\\\\\\\": 100\\\\n}\\\\n* total: 分页数，对应数据的总分页数\\\\n* count: 数据总数，对应数据的总数\\\\n\\\\n\\\\n## 输出格式\\\\n* 直接返回JSON数据，不要解释，不要md语法，不要换行符，不要有注释。\\\\n* 统一将key转换成英文，下划线分隔\\\\n* 确保输出的json格式正确完整。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"将数据转换为目标格式\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"datas\\\",\\\"name\\\":\\\"data\\\",\\\"nodeId\\\":\\\"180204885804785664\\\"},{\\\"field\\\":\\\"fields\\\",\\\"name\\\":\\\"fileds\\\",\\\"nodeId\\\":\\\"180204885804785664\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"180211805085179904\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"180211780498169856\\\",\\\"targetNodeId\\\":\\\"180204420713758720\\\",\\\"sourceAnchorId\\\":\\\"180211780498169856_output\\\",\\\"targetAnchorId\\\":\\\"180204420713758720_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1395,\\\"y\\\":360},{\\\"x\\\":1495,\\\"y\\\":360},{\\\"x\\\":1382,\\\"y\\\":361},{\\\"x\\\":1482,\\\"y\\\":361}]},{\\\"id\\\":\\\"180228761381183488\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"180204885804785664\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"180204885804785664_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":361},{\\\"x\\\":566,\\\"y\\\":361},{\\\"x\\\":528,\\\"y\\\":362},{\\\"x\\\":628,\\\"y\\\":362}]},{\\\"id\\\":\\\"180511280701620224\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"180204885804785664\\\",\\\"targetNodeId\\\":\\\"180211780498169856\\\",\\\"sourceAnchorId\\\":\\\"180204885804785664_output\\\",\\\"targetAnchorId\\\":\\\"180211780498169856_input\\\",\\\"pointsList\\\":[{\\\"x\\\":960,\\\"y\\\":362},{\\\"x\\\":1060,\\\"y\\\":362},{\\\"x\\\":963,\\\"y\\\":360},{\\\"x\\\":1063,\\\"y\\\":360}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"pageNo\\\",\\\"name\\\":\\\"页码\\\",\\\"required\\\":false,\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"pageSize\\\",\\\"name\\\":\\\"每页数量\\\",\\\"required\\\":false,\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"bizData\\\",\\\"name\\\":\\\"文件路径\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"}]}');\n\n-- -- author:sunjianlei---date:20250509--for: 【QQYUN-12064】AI流程增加发布功能（添加注释）\nALTER TABLE `airag_flow`\n    MODIFY COLUMN `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '状态（enable=启用、disable=禁用、release=发布）' AFTER `design`;\n\n-- -- author:sunjianlei---date:20250513--for: 【QQYUN-12064】AI应用增加发布功能（添加注释）\nALTER TABLE `airag_app`\n    MODIFY COLUMN `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '状态（enable=启用、disable=禁用、release=发布）' AFTER `flow_id`;\n-- -- author:liusq---date:20250509--for: QQYUN-10237 【流程审批】工单授权，没有对online表单的授权（修改注释）\n\n-- ---author:chenrui-date:20250520-----for: [QQYUN-12543]AI测试类未提交\nUPDATE `airag_flow` SET `create_by` = 'jeecg', `create_time` = '2025-03-06 11:58:23', `update_by` = 'jeecg', `update_time` = '2025-05-20 10:16:28', `sys_org_code` = 'A04', `tenant_id` = NULL, `application_name` = 'jeecg', `name` = '示例_java增强', `descr` = NULL, `icon` = NULL, `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    enhanceJava.tag(\\'160591592557232128\\'),\\n    end.tag(\\'160595080985034752\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":456,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"问题1\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"问题2\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"160591592557232128\\\",\\\"type\\\":\\\"enhanceJava\\\",\\\"x\\\":786,\\\"y\\\":499,\\\"properties\\\":{\\\"text\\\":\\\"Java增强\\\",\\\"options\\\":{\\\"enhance\\\":{\\\"type\\\":\\\"spring\\\",\\\"path\\\":\\\"testAiragEnhance\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"arg1\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"arg2\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"height\\\":158,\\\"width\\\":332}},{\\\"id\\\":\\\"160595080985034752\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1272,\\\"y\\\":477,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{res}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"160591592557232128\\\"}],\\\"height\\\":136,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"160591592565620736\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"160591592557232128\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"160591592557232128_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":441},{\\\"x\\\":566,\\\"y\\\":441},{\\\"x\\\":520,\\\"y\\\":440},{\\\"x\\\":620,\\\"y\\\":440}]},{\\\"id\\\":\\\"160595080989229056\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160591592557232128\\\",\\\"targetNodeId\\\":\\\"160595080985034752\\\",\\\"sourceAnchorId\\\":\\\"160591592557232128_output\\\",\\\"targetAnchorId\\\":\\\"160595080985034752_input\\\",\\\"pointsList\\\":[{\\\"x\\\":952,\\\"y\\\":440},{\\\"x\\\":1052,\\\"y\\\":440},{\\\"x\\\":1006,\\\"y\\\":440},{\\\"x\\\":1106,\\\"y\\\":440}]}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"question\\\",\\\"name\\\":\\\"问题1\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":true,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"问题2\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"}]}' WHERE `id` = '1897496956167577601';\n\n-- ---author:chenrui-date:20250529-----for: [QQYUN-12441]【积木报表】AI生成报表 一直提示失败 后台也没有日志\nUPDATE `airag_flow` SET `create_by` = 'jeecg', `create_time` = '2025-04-09 14:30:11', `update_by` = 'admin', `update_time` = '2025-05-28 16:39:13', `sys_org_code` = 'A04', `tenant_id` = NULL, `application_name` = 'jeecg', `name` = 'JimuReport AI引擎', `descr` = '', `icon` = '', `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'173365501230346240\\')).to(\\n        THEN(\\n            llm.tag(\\'172956395755208704\\'),\\n            end.tag(\\'172957153284259840\\')\\n        ).tag(\\\"172956395755208704\\\"),\\n        THEN(\\n            llm.tag(\\'173365800833675264\\'),\\n            end.tag(\\'173366253646540800\\')\\n        ).tag(\\\"173365800833675264\\\"),\\n        end.tag(\\'173366439085109248\\'),\\n        THEN(\\n            llm.tag(\\'175149164433014784\\'),\\n            end.tag(\\'175153953988444160\\')\\n        ).tag(\\\"175149164433014784\\\"),\\n        THEN(\\n            llm.tag(\\'175505963485245440\\'),\\n            end.tag(\\'175506006644633600\\')\\n        ).tag(\\\"175505963485245440\\\"),\\n        THEN(\\n            llm.tag(\\'175807569594040320\\'),\\n            end.tag(\\'175808663015538688\\')\\n        ).tag(\\\"175807569594040320\\\")\\n    ).tag(\\'173365501230346240\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":262,\\\"y\\\":458,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"表结构\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"dbtype\\\",\\\"name\\\":\\\"数据库类型\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"bizType\\\",\\\"name\\\":\\\"业务类型\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"172956395755208704\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1166,\\\"y\\\":160,\\\"properties\\\":{\\\"text\\\":\\\"生成sql\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：SQL生成助手\\\\n你是一个专业的SQL语句生成工具，能够根据用户提供的描述和表结构自动生成高效的SQL查询语句。\\\\n\\\\n## 目标：\\\\n- 根据用户的描述生成准确的SQL查询语句。\\\\n\\\\n## 技能：\\\\n1. 理解用户提供的需求和表结构。\\\\n2. 自动构建符合SQL语法的查询语句。\\\\n3. 优化生成的SQL以提高执行效率。\\\\n\\\\n## 工作流：\\\\n1. 接收用户描述和表结构信息。\\\\n2. 分析用户需求，确定所需的SQL操作类型（如查询、插入、更新、删除）。\\\\n3. 根据分析结果生成相应的SQL语句。\\\\n\\\\n## 输出格式：\\\\n- 生成的SQL语句应为标准格式，如：SELECT * FROM table_name ;\\\\n- 将输出的SQL语句格式化\\\\n- 只输出sql语句，不要额外解释，不要md语法，不要换行符，不要有sql注释。\\\\n\\\\n## 限制：\\\\n\\\\n- 除非明确说明，否则不要生成查询条件\\\\n- 确保生成的SQL语句符合数据库的语法要求，确保sql能直接执行。\\\\n- 确保字段和表能正确对应。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"表结构：\\\\n{{ddl}}\\\\n---------\\\\n数据库类型：\\\\n{{dbtype}}\\\\n----------\\\\n需求：\\\\n{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"dbtype\\\",\\\"name\\\":\\\"dbtype\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"172957153284259840\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":129,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"sql\\\",\\\"nodeId\\\":\\\"172956395755208704\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"173365501230346240\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":688,\\\"y\\\":536,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"genSql\\\"}],\\\"next\\\":\\\"172956395755208704\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"genJsonRows\\\"}],\\\"next\\\":\\\"173365800833675264\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"chooseTables\\\"}],\\\"next\\\":\\\"175149164433014784\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"genChart\\\"}],\\\"next\\\":\\\"175505963485245440\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"intentCheck\\\"}],\\\"next\\\":\\\"175807569594040320\\\"}],\\\"else\\\":{\\\"next\\\":\\\"173366439085109248\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"height\\\":222,\\\"width\\\":332}},{\\\"id\\\":\\\"173365800833675264\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1167,\\\"y\\\":368,\\\"properties\\\":{\\\"text\\\":\\\"生成rows\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"根据以下数据以及用户需求生成符合要求的表格数据结构。\\\\n\\\\n\\\\n\\\\n\\\\n## 工作流程：\\\\n\\\\n\\\\n\\\\n\\\\n1. 根据用户需求选择一个合适的数据集\\\\n2. 根据数据集和需求，生成表格数据。\\\\n2. 最终输出json\\\\n\\\\n\\\\n\\\\n\\\\n## 数据集格式说明：\\\\n```\\\\n{\\\\n \\\\\\\"code\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n \\\\\\\"isList\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n \\\\\\\"children\\\\\\\": [\\\\n  {\\\\n   \\\\\\\"title\\\\\\\": \\\\\\\"total_sales\\\\\\\",\\\\n   \\\\\\\"fieldText\\\\\\\": \\\\\\\"总销量\\\\\\\"\\\\n  },\\\\n  {\\\\n   \\\\\\\"title\\\\\\\": \\\\\\\"total_returns\\\\\\\",\\\\n   \\\\\\\"fieldText\\\\\\\": \\\\\\\"总退货数量\\\\\\\"\\\\n  }\\\\n ]\\\\n}\\\\n```\\\\n* code：数据集变量名\\\\n* isList：为”1”表示集合，“0”表示对象\\\\n* children：为字段列表，包含title（字段名）和fieldText（展示名）\\\\n⸻\\\\n## 表格数据结构说明：\\\\n```\\\\n{\\\\n \\\\\\\"0\\\\\\\": { \\\\\\\"cells\\\\\\\": {} },\\\\n \\\\\\\"1\\\\\\\": { \\\\\\\"cells\\\\\\\": {\\\\n   \\\\\\\"1\\\\\\\": { \\\\\\\"text\\\\\\\": \\\\\\\"#{a.total_sales}\\\\\\\" },\\\\n   \\\\\\\"2\\\\\\\": { \\\\\\\"text\\\\\\\": \\\\\\\"#{a.name}\\\\\\\" }\\\\n }},\\\\n \\\\\\\"len\\\\\\\": 200\\\\n}\\\\n```\\\\n* 行号作为键\\\\n* 每行下有 cells 对象，key 是列号\\\\n* 每行以序号作为键\\\\n* 每列下包含 text 为占位符，${} 用于对象，#{} 用于集合\\\\n* 可包含 style 等附加样式信息\\\\n⸻\\\\n\\\\n\\\\n\\\\n\\\\n## 填充规则：\\\\n1. 若 isList = 1（集合）：\\\\n * 第N行（如 \\\\\\\"0\\\\\\\"）为字段标题：使用 children.fieldText 填充\\\\n * 第N+1行（如 \\\\\\\"1\\\\\\\"）为字段占位符：使用 `#{code.title}` 填充\\\\n * 所有字段占位符占用一行，所有标题占用一行\\\\n2. 若 isList = 0（对象）：\\\\n * 每字段占两列，低N列填字段标题，N+1列填占位符 `${code.title}`\\\\n * 共两组：第一组在第n列，第二组在第N+2列\\\\n\\\\n\\\\n\\\\n\\\\n⸻\\\\n\\\\n\\\\n\\\\n\\\\n## 输出格式\\\\n* 直接返回JSON数据，不要解释，不要md语法，不要换行符，不要有注释。\\\\n* 确保输出的JSON格式正确，数据中不能包含注释和省略。\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n## 特别注意\\\\n- 字段的占位必须是`#{}`或`${}`，不能缺失大括号。\\\\n- 用户描述的序号需要减一才是下标\\\\n- 确保输出的json格式正确。\\\\n- 只需要生成一套表格数据。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"用户数据集：\\\\n{{ddl}}\\\\n用户需求：\\\\n{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"173366253646540800\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":336,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"rows\\\",\\\"nodeId\\\":\\\"173365800833675264\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"173366439085109248\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1158,\\\"y\\\":1209,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"error:选择正确的业务类型\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"175149164433014784\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1164,\\\"y\\\":598,\\\"properties\\\":{\\\"text\\\":\\\"选择表\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":2,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"## 任务\\\\n根据用户需求，从下方数据库表列表中选择所有关联的表名称。\\\\n\\\\n\\\\n## 数据库表列表（格式：表名 | 注释）\\\\n{{ddl}}\\\\n\\\\n## 输出规则\\\\n1. 严格按JSON数组格式输出，例如：[\\\\\\\"order\\\\\\\"]。\\\\n2. 仅包含表名称，无需注释。\\\\n3. **禁止添加列表外的表**。\\\\n4. 表的选择范围可以适当大一些。\\\\n4. 无业务相关性时输出空数组：[]\\\\n\\\\n\\\\n请回复纯JSON，不要包含其他内容。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"用户需求：{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"175153953988444160\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":564,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"tables\\\",\\\"nodeId\\\":\\\"175149164433014784\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"175505963485245440\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1166,\\\"y\\\":802,\\\"properties\\\":{\\\"text\\\":\\\"生成图表\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"根据以下数据以及用户需求生成符合格式要求的图表数据。\\\\n\\\\n\\\\n## 工作流程：\\\\n\\\\n\\\\n1. 根据用户需求选择一个合适的数据集\\\\n2. 根据数据集和需求，从图表列表中选择一个合适的图标类型。\\\\n3. 组装最终输出的json\\\\n\\\\n\\\\n⸻\\\\n## 可选的图表如下（标识|描述）：\\\\n\\\\n\\\\n- 1维图表\\\\n  - bar.simple|普通柱形图\\\\n  - bar.background|带背景柱形图\\\\n  - bar.horizontal|横向柱形图\\\\n  - line.simple|普通折线图\\\\n  - line.area|面积堆积折线图\\\\n  - line.smooth|平滑曲线折线图\\\\n  - line.step|阶梯折线图\\\\n  - pie.simple|普通饼图\\\\n  - pie.doughnut|环状饼图\\\\n  - pie.rose|南丁格尔玫瑰饼图\\\\n  - scatter.simple|普通散点图\\\\n  - funnel.simple|普通漏斗图\\\\n  - funnel.pyramid|金字塔漏斗图\\\\n  - pictorial.spirits|普通象形图\\\\n  - map.scatter|点地图\\\\n  - gauge.simple|360°仪表盘\\\\n  - gauge.simple180|180°仪表盘\\\\n- 2维\\\\n  - bar.multi|多数据对比柱形图\\\\n  - bar.negative|正负条形图\\\\n  - bar.stack|堆叠柱形图\\\\n  - bar.stack.horizontal|堆叠条形图\\\\n  - bar.multi.horizontal|多数据条形柱状图\\\\n  - line.multi|多数据对比折线图\\\\n  - mixed.linebar|普通折柱图\\\\n  - scatter.bubble|气泡散点图\\\\n  - radar.basic|普通雷达图\\\\n  - radar.custom|圆形雷达图\\\\n⸻\\\\n## 数据集格式说明：\\\\n```\\\\n{\\\\n \\\\\\\"dbId\\\\\\\": \\\\\\\"1069915169263800320\\\\\\\",\\\\n \\\\\\\"code\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n \\\\\\\"isList\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"0\\\\\\\",\\\\n \\\\\\\"children\\\\\\\": [\\\\n  {\\\\n   \\\\\\\"title\\\\\\\": \\\\\\\"total_sales\\\\\\\",\\\\n   \\\\\\\"fieldText\\\\\\\": \\\\\\\"total_sales\\\\\\\"\\\\n  },\\\\n  {\\\\n   \\\\\\\"title\\\\\\\": \\\\\\\"total_returns\\\\\\\",\\\\n   \\\\\\\"fieldText\\\\\\\": \\\\\\\"total_returns\\\\\\\"\\\\n  }\\\\n ]\\\\n}\\\\n```\\\\n* code：数据集变量名\\\\n* isList：为”1”表示集合，“0”表示对象\\\\n* children：为字段列表，包含title（字段名）和fieldText（展示名）\\\\n* type：0|sql,1|api,2|code,3|json\\\\n⸻\\\\n## 输出json格式\\\\n{\\\\n  \\\\\\\"dataType\\\\\\\": \\\\\\\"sql\\\\\\\",\\\\n  \\\\\\\"apiStatus\\\\\\\": \\\\\\\"0\\\\\\\",\\\\n  \\\\\\\"apiUrl\\\\\\\": \\\\\\\"\\\\\\\",\\\\n  \\\\\\\"dataId\\\\\\\": \\\\\\\"1069898455939633152\\\\\\\",\\\\n  \\\\\\\"axisX\\\\\\\": \\\\\\\"supplier_name\\\\\\\",\\\\n  \\\\\\\"axisY\\\\\\\": \\\\\\\"total_returns\\\\\\\",\\\\n  \\\\\\\"series\\\\\\\": \\\\\\\"material_name\\\\\\\",\\\\n  \\\\\\\"yText\\\\\\\": \\\\\\\"total_returns\\\\\\\",\\\\n  \\\\\\\"xText\\\\\\\": \\\\\\\"supplier_name\\\\\\\",\\\\n  \\\\\\\"dbCode\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n  \\\\\\\"isCustomPropName\\\\\\\": false,\\\\n  \\\\\\\"chartType\\\\\\\": \\\\\\\"line.multi\\\\\\\",\\\\n  \\\\\\\"id\\\\\\\": \\\\\\\"0aGl4PUfbIfy8BMF\\\\\\\",\\\\n  \\\\\\\"run\\\\\\\": 1,\\\\n  \\\\\\\"title\\\\\\\": \\\\\\\"\\\\\\\",\\\\n}\\\\n* dataType：与数据集type对应(0|sql,1|api,2|code,3|json)\\\\n* dataId：对应数据集dbId\\\\n* dbCode：对应数据集的code\\\\n* axisX：分类属性，从数据集字段中取值（fieldText)\\\\n* axisY：值属性，从数据集字段中取值（fieldText)\\\\n* series: 系列，从数据集字段中取值（fieldText）\\\\n* xText：分类属性显示，从数据集字段中取值（title)\\\\n* yText：值属性显示，从数据集字段中取值（title)\\\\n* chartType：图表的标识\\\\n* title：为这个图表起一个标题\\\\n* isCustomPropName: 如果是api数据集,该值为true\\\\n* apiStatus: 如果是api数据集则等于\\\\\\\"1\\\\\\\"，否则\\\\\\\"0\\\\\\\"\\\\n\\\\n\\\\n## 输出格式\\\\n* 直接返回JSON数据，不要解释，不要md语法，不要换行符，不要有注释。\\\\n* 确保输出的json格式正确完整。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"## 用户数据集：\\\\n{{ddl}}\\\\n## 用户需求：\\\\n{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"175506006644633600\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":769,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"chart\\\",\\\"nodeId\\\":\\\"175505963485245440\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"175807569594040320\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1166,\\\"y\\\":1018,\\\"properties\\\":{\\\"text\\\":\\\"意图识别\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"请根据用户需求与数据集设计，综合判断应执行的工作流步骤，并为每个步骤生成简洁明确的需求描述，同时选择最合适的数据集。\\\\n---\\\\n## 可选步骤（格式：标识 | 功能说明）\\\\n- `genJsonRows` | 生成报表（可选）\\\\n- `genChart` | 生成图表（可选）\\\\n> **注意：** 至少选择一个步骤，亦可同时选择两者；图表的权重较低。\\\\n---\\\\n## 数据集格式\\\\n```json\\\\n{\\\\n \\\\\\\"dbId\\\\\\\": \\\\\\\"1069915169263800320\\\\\\\",\\\\n \\\\\\\"code\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n \\\\\\\"isList\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"0\\\\\\\",\\\\n \\\\\\\"children\\\\\\\": [\\\\n  {\\\\n   \\\\\\\"title\\\\\\\": \\\\\\\"total_sales\\\\\\\",\\\\n   \\\\\\\"fieldText\\\\\\\": \\\\\\\"total_sales\\\\\\\"\\\\n  },\\\\n  {\\\\n   \\\\\\\"title\\\\\\\": \\\\\\\"total_returns\\\\\\\",\\\\n   \\\\\\\"fieldText\\\\\\\": \\\\\\\"total_returns\\\\\\\"\\\\n  }\\\\n ]\\\\n}\\\\n* code：数据集变量名\\\\n* isList：为”1”表示集合，“0”表示对象\\\\n* children：为字段列表，包含title（展示名）和fieldText（字段名）\\\\n* type：0|sql,1|api,2|code,3|json\\\\n⸻\\\\n## 输出格式\\\\n```\\\\n步骤标识1|需求描述1|数据集code,步骤标识2|需求描述2|数据集code\\\\n```\\\\n* 各步骤之间用英文逗号,分隔\\\\n* 不得添加额外说明，不要md语法，不要换行符，不要有注释。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"## 用户数据集：\\\\n{{ddl}}\\\\n## 用户需求：\\\\n{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"175808663015538688\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":985,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"intent\\\",\\\"nodeId\\\":\\\"175807569594040320\\\"}],\\\"height\\\":114,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"172957153288454144\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"172956395755208704\\\",\\\"targetNodeId\\\":\\\"172957153284259840\\\",\\\"sourceAnchorId\\\":\\\"172956395755208704_output\\\",\\\"targetAnchorId\\\":\\\"172957153284259840_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1332,\\\"y\\\":101},{\\\"x\\\":1432,\\\"y\\\":101},{\\\"x\\\":1377,\\\"y\\\":103},{\\\"x\\\":1477,\\\"y\\\":103}]},{\\\"id\\\":\\\"173365501234540544\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"173365501230346240\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"173365501230346240_input\\\",\\\"pointsList\\\":[{\\\"x\\\":428,\\\"y\\\":443},{\\\"x\\\":528,\\\"y\\\":443},{\\\"x\\\":422,\\\"y\\\":456},{\\\"x\\\":522,\\\"y\\\":456}]},{\\\"id\\\":\\\"173366253650735104\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365800833675264\\\",\\\"targetNodeId\\\":\\\"173366253646540800\\\",\\\"sourceAnchorId\\\":\\\"173365800833675264_output\\\",\\\"targetAnchorId\\\":\\\"173366253646540800_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1333,\\\"y\\\":309},{\\\"x\\\":1433,\\\"y\\\":309},{\\\"x\\\":1377,\\\"y\\\":310},{\\\"x\\\":1477,\\\"y\\\":310}]},{\\\"id\\\":\\\"173372961415852032\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"172956395755208704\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_source_if\\\",\\\"targetAnchorId\\\":\\\"172956395755208704_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":490},{\\\"x\\\":954,\\\"y\\\":490},{\\\"x\\\":900,\\\"y\\\":101},{\\\"x\\\":1000,\\\"y\\\":101}]},{\\\"id\\\":\\\"173372967073968128\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"173365800833675264\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_2\\\",\\\"targetAnchorId\\\":\\\"173365800833675264_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":516},{\\\"x\\\":954,\\\"y\\\":516},{\\\"x\\\":901,\\\"y\\\":309},{\\\"x\\\":1001,\\\"y\\\":309}]},{\\\"id\\\":\\\"173372974988619776\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"173366439085109248\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_source_else\\\",\\\"targetAnchorId\\\":\\\"173366439085109248_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":620},{\\\"x\\\":954,\\\"y\\\":620},{\\\"x\\\":892,\\\"y\\\":1183},{\\\"x\\\":992,\\\"y\\\":1183}]},{\\\"id\\\":\\\"175149164437209088\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"175149164433014784\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_3\\\",\\\"targetAnchorId\\\":\\\"175149164433014784_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":542},{\\\"x\\\":954,\\\"y\\\":542},{\\\"x\\\":898,\\\"y\\\":539},{\\\"x\\\":998,\\\"y\\\":539}]},{\\\"id\\\":\\\"175153997969915904\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"175149164433014784\\\",\\\"targetNodeId\\\":\\\"175153953988444160\\\",\\\"sourceAnchorId\\\":\\\"175149164433014784_output\\\",\\\"targetAnchorId\\\":\\\"175153953988444160_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1330,\\\"y\\\":539},{\\\"x\\\":1430,\\\"y\\\":539},{\\\"x\\\":1377,\\\"y\\\":538},{\\\"x\\\":1477,\\\"y\\\":538}]},{\\\"id\\\":\\\"175505963489439744\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"175505963485245440\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_4\\\",\\\"targetAnchorId\\\":\\\"175505963485245440_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":568},{\\\"x\\\":954,\\\"y\\\":568},{\\\"x\\\":900,\\\"y\\\":743},{\\\"x\\\":1000,\\\"y\\\":743}]},{\\\"id\\\":\\\"175506006648827904\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"175505963485245440\\\",\\\"targetNodeId\\\":\\\"175506006644633600\\\",\\\"sourceAnchorId\\\":\\\"175505963485245440_output\\\",\\\"targetAnchorId\\\":\\\"175506006644633600_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1332,\\\"y\\\":743},{\\\"x\\\":1432,\\\"y\\\":743},{\\\"x\\\":1377,\\\"y\\\":743},{\\\"x\\\":1477,\\\"y\\\":743}]},{\\\"id\\\":\\\"175807569598234624\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"175807569594040320\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_5\\\",\\\"targetAnchorId\\\":\\\"175807569594040320_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":594},{\\\"x\\\":954,\\\"y\\\":594},{\\\"x\\\":900,\\\"y\\\":959},{\\\"x\\\":1000,\\\"y\\\":959}]},{\\\"id\\\":\\\"175808663019732992\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"175807569594040320\\\",\\\"targetNodeId\\\":\\\"175808663015538688\\\",\\\"sourceAnchorId\\\":\\\"175807569594040320_output\\\",\\\"targetAnchorId\\\":\\\"175808663015538688_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1332,\\\"y\\\":959},{\\\"x\\\":1432,\\\"y\\\":959},{\\\"x\\\":1377,\\\"y\\\":959},{\\\"x\\\":1477,\\\"y\\\":959}]}]}', `status` = 'release', `metadata` = '{\\\"outputs\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"intent\\\",\\\"nodeId\\\":\\\"175807569594040320\\\"},{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"表结构\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"dbtype\\\",\\\"name\\\":\\\"数据库类型\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"bizType\\\",\\\"name\\\":\\\"业务类型\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"}]}' WHERE `id` = '1909856345692065793';\n\n-- ---author:liusq-date:20250606-----for: [issues/8337]关于ai工作列表的数据权限问题 #8337\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930223132619112449', '1890213291321749505', '删除AI流程', NULL, NULL, 0, NULL, NULL, 2, 'airag:flow:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:20:31', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930223034757611522', '1890213291321749505', '保存AI流程设计', NULL, NULL, 0, NULL, NULL, 2, 'airag:flow:designSave', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:20:08', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930222953853681666', '1890213291321749505', '编辑AI流程', NULL, NULL, 0, NULL, NULL, 2, 'airag:flow:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:19:49', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930222862556266498', '1890213291321749505', '新增AI流程', NULL, NULL, 0, NULL, NULL, 2, 'airag:flow:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:19:27', 'admin', '2025-06-04 19:21:08', 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930222679269376001', '1892553778493022209', '删除AI模型', NULL, NULL, 0, NULL, NULL, 2, 'airag:model:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:18:43', 'admin', '2025-06-04 19:21:24', 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930222617197871105', '1892553778493022209', '编辑AI模型', NULL, NULL, 0, NULL, NULL, 2, 'airag:model:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:18:28', 'admin', '2025-06-04 19:21:20', 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930222558582472705', '1892553778493022209', '新增AI模型', NULL, NULL, 0, NULL, NULL, 2, 'airag:model:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:18:14', 'admin', '2025-06-04 19:21:16', 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930222395180777474', '1892557342028226561', '清空AI知识库文档', NULL, NULL, 0, NULL, NULL, 2, 'airag:knowledge:doc:deleteAll', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:17:35', 'admin', '2025-06-04 19:22:25', 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930222295012409345', '1892557342028226561', '批量删除AI知识库文档', NULL, NULL, 0, NULL, NULL, 2, 'airag:knowledge:doc:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:17:12', 'admin', '2025-06-04 19:22:21', 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930222218734796802', '1892557342028226561', '向量化AI知识库文档', NULL, NULL, 0, NULL, NULL, 2, 'airag:knowledge:doc:rebuild', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:16:53', 'admin', '2025-06-04 19:22:16', 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930222066120851457', '1892557342028226561', '导入AI知识库文档', NULL, NULL, 0, NULL, NULL, 2, 'airag:knowledge:doc:zip', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:16:17', 'admin', '2025-06-04 19:22:09', 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930221983555977217', '1892557342028226561', '新增编辑AI知识库文档', NULL, NULL, 0, NULL, NULL, 2, 'airag:knowledge:doc:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:15:57', 'admin', '2025-06-04 19:22:03', 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930221774230847490', '1892557342028226561', '删除AI知识库', NULL, NULL, 0, NULL, NULL, 2, 'airag:knowledge:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:15:07', 'admin', '2025-06-04 19:21:52', 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930221702164316161', '1892557342028226561', '重建AI知识库', NULL, NULL, 0, NULL, NULL, 2, 'airag:knowledge:rebuild', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:14:50', 'admin', '2025-06-04 19:21:46', 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930221637551063042', '1892557342028226561', '编辑AI知识库', NULL, NULL, 0, NULL, NULL, 2, 'airag:knowledge:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:14:35', 'admin', '2025-06-04 19:21:42', 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930221570324758530', '1892557342028226561', '添加AI知识库', NULL, NULL, 0, NULL, NULL, 2, 'airag:knowledge:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:14:19', 'admin', '2025-06-04 19:21:38', 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930221335938662401', '1893865471550578689', '删除AI应用', NULL, NULL, 0, NULL, NULL, 2, 'airag:app:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:13:23', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930221213607591937', '1893865471550578689', '新增或编辑AI应用', NULL, NULL, 0, NULL, NULL, 2, 'airag:app:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 19:12:54', NULL, NULL, 0, 0, '1', 0);\n\nUPDATE sys_permission  SET is_leaf = 0 WHERE id IN ( '1890213291321749505','1892553778493022209', '1892557342028226561', '1893865471550578689' );\n\n-- ---author:lvdandan-date:20250612-----for: 门户示例api域名修改\nUPDATE onl_drag_dataset_head\nSET query_sql = REPLACE(query_sql, 'apijeecgcom', 'api.jeecg.com')\nWHERE query_sql LIKE '%https://apijeecgcom%';"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.8.1_2__openapi.sql",
    "content": "/*\n Navicat Premium Data Transfer\n\n Source Server         : mysql5.7\n Source Server Type    : MySQL\n Source Server Version : 50738 (5.7.38)\n Source Host           : 127.0.0.1:3306\n Source Schema         : jeecg-boot\n\n Target Server Type    : MySQL\n Target Server Version : 50738 (5.7.38)\n File Encoding         : 65001\n\n Date: 15/05/2025 10:18:36\n*/\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- Table structure for open_api\n-- ----------------------------\nDROP TABLE IF EXISTS `open_api`;\nCREATE TABLE `open_api`  (\n                             `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n                             `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '接口名称',\n                             `request_method` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '请求方法',\n                             `request_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '接口地址',\n                             `black_list` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'IP 黑名单',\n                             `body` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '请求体内容',\n                             `origin_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '原始地址',\n                             `status` int(10) NULL DEFAULT NULL COMMENT '状态',\n                             `del_flag` int(10) NULL DEFAULT NULL COMMENT '删除标识',\n                             `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n                             `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n                             `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '修改人',\n                             `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n                             `headers_json` json NULL COMMENT '请求头json',\n                             `params_json` json NULL COMMENT '请求参数json',\n                             PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '接口表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of open_api\n-- ----------------------------\nINSERT INTO `open_api` VALUES ('1922132683346649090', '根据部门查询用户', 'GET', 'TEwcXBlr', NULL, NULL, '/sys/user/queryUserByDepId', 1, 0, 'admin', '2025-05-13 11:31:58', 'admin', '2025-05-15 10:10:01', '[]', '[{\\\"id\\\": \\\"row_24\\\", \\\"note\\\": \\\"\\\", \\\"paramKey\\\": \\\"id\\\", \\\"required\\\": \\\"1\\\", \\\"defaultValue\\\": \\\"\\\"}]');\n\n-- ----------------------------\n-- Table structure for open_api_auth\n-- ----------------------------\nDROP TABLE IF EXISTS `open_api_auth`;\nCREATE TABLE `open_api_auth`  (\n                                  `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n                                  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '授权名称',\n                                  `ak` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'AK',\n                                  `sk` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'SK',\n                                  `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n                                  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n                                  `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '修改人',\n                                  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',\n                                  `system_user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '关联系统用户名',\n                                  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '权限表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of open_api_auth\n-- ----------------------------\nINSERT INTO `open_api_auth` VALUES ('1922164194775056386', 'scott', 'ak-pFjyNHWRsJEFWlu6', '4hV5dBrZtmGAtPdbA5yseaeKRYNpzGsS', 'admin', '2025-05-13 13:37:11', NULL, NULL, 'e9ca23d68d884d4ebb19d07889727dae');\n\n-- ----------------------------\n-- Table structure for open_api_log\n-- ----------------------------\nDROP TABLE IF EXISTS `open_api_log`;\nCREATE TABLE `open_api_log`  (\n                                 `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n                                 `api_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '接口ID',\n                                 `call_auth_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '调用ID',\n                                 `call_time` datetime NULL DEFAULT NULL COMMENT '调用时间',\n                                 `used_time` bigint(20) NULL DEFAULT NULL COMMENT '耗时',\n                                 `response_time` datetime NULL DEFAULT NULL COMMENT '响应时间',\n                                 PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '调用记录表' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of open_api_log\n-- ----------------------------\nINSERT INTO `open_api_log` VALUES ('1922175238557913090', '1922132683346649090', '1922164194775056386', '2025-05-13 14:21:04', 94, '2025-05-13 14:21:04');\nINSERT INTO `open_api_log` VALUES ('1922175436256432130', '1922132683346649090', '1922164194775056386', '2025-05-13 14:21:51', 38, '2025-05-13 14:21:51');\nINSERT INTO `open_api_log` VALUES ('1922175487921868802', '1922132683346649090', '1922164194775056386', '2025-05-13 14:22:03', 31, '2025-05-13 14:22:03');\nINSERT INTO `open_api_log` VALUES ('1922176033789562883', '1922132683346649090', '1922164194775056386', '2025-05-13 14:24:13', 27, '2025-05-13 14:24:13');\nINSERT INTO `open_api_log` VALUES ('1922176583943835650', '1922132683346649090', '1922164194775056386', '2025-05-13 14:26:25', 39, '2025-05-13 14:26:25');\nINSERT INTO `open_api_log` VALUES ('1922177249969934337', '1922132683346649090', '1922164194775056386', '2025-05-13 14:28:08', 55250, '2025-05-13 14:29:03');\nINSERT INTO `open_api_log` VALUES ('1922180212645941249', '1922132683346649090', '1922164194775056386', '2025-05-13 14:40:46', 4162, '2025-05-13 14:40:50');\nINSERT INTO `open_api_log` VALUES ('1922180441692688385', '1922132683346649090', '1922164194775056386', '2025-05-13 14:41:11', 33346, '2025-05-13 14:41:44');\nINSERT INTO `open_api_log` VALUES ('1922180521686454273', '1922132683346649090', '1922164194775056386', '2025-05-13 14:42:00', 3570, '2025-05-13 14:42:03');\nINSERT INTO `open_api_log` VALUES ('1922180965825499138', '1922132683346649090', '1922164194775056386', '2025-05-13 14:42:10', 99211, '2025-05-13 14:43:49');\nINSERT INTO `open_api_log` VALUES ('1922181034515615746', '1922132683346649090', '1922164194775056386', '2025-05-13 14:43:52', 14005, '2025-05-13 14:44:06');\nINSERT INTO `open_api_log` VALUES ('1922183171307982850', '1922132683346649090', '1922164194775056386', '2025-05-13 14:52:15', 19834, '2025-05-13 14:52:35');\nINSERT INTO `open_api_log` VALUES ('1922184177068523521', '1922132683346649090', '1922164194775056386', '2025-05-13 14:56:34', 748, '2025-05-13 14:56:35');\nINSERT INTO `open_api_log` VALUES ('1922184729043107841', '1922132683346649090', '1922164194775056386', '2025-05-13 14:58:46', 1031, '2025-05-13 14:58:47');\nINSERT INTO `open_api_log` VALUES ('1922184806453182465', '1922132683346649090', '1922164194775056386', '2025-05-13 14:59:05', 68, '2025-05-13 14:59:05');\nINSERT INTO `open_api_log` VALUES ('1922184918382379009', '1922132683346649090', '1922164194775056386', '2025-05-13 14:59:10', 22155, '2025-05-13 14:59:32');\nINSERT INTO `open_api_log` VALUES ('1922185292635844610', '1922132683346649090', '1922164194775056386', '2025-05-13 15:00:55', 6267, '2025-05-13 15:01:01');\nINSERT INTO `open_api_log` VALUES ('1922186002672791554', '1922132683346649090', '1922164194775056386', '2025-05-13 15:03:23', 27554, '2025-05-13 15:03:50');\nINSERT INTO `open_api_log` VALUES ('1922187506582425601', '1922132683346649090', '1922164194775056386', '2025-05-13 15:09:45', 3464, '2025-05-13 15:09:49');\nINSERT INTO `open_api_log` VALUES ('1922187586597163011', '1922132683346649090', '1922164194775056386', '2025-05-13 15:10:08', 82, '2025-05-13 15:10:08');\nINSERT INTO `open_api_log` VALUES ('1922187924741951490', '1922132683346649090', '1922164194775056386', '2025-05-13 15:10:49', 39590, '2025-05-13 15:11:28');\nINSERT INTO `open_api_log` VALUES ('1922188138710261761', '1922132683346649090', '1922164194775056386', '2025-05-13 15:12:19', 758, '2025-05-13 15:12:19');\nINSERT INTO `open_api_log` VALUES ('1922188290661507073', '1922132683346649090', '1922164194775056386', '2025-05-13 15:12:29', 26527, '2025-05-13 15:12:56');\nINSERT INTO `open_api_log` VALUES ('1922189701755424769', '1922132683346649090', '1922164194775056386', '2025-05-13 15:18:28', 3619, '2025-05-13 15:18:32');\nINSERT INTO `open_api_log` VALUES ('1922190076784803841', '1922132683346649090', '1922164194775056386', '2025-05-13 15:20:01', 741, '2025-05-13 15:20:02');\nINSERT INTO `open_api_log` VALUES ('1922836671113101313', '1922132683346649090', '1922164194775056386', '2025-05-15 10:09:21', 186, '2025-05-15 10:09:22');\nINSERT INTO `open_api_log` VALUES ('1922836856287428610', '1922132683346649090', '1922164194775056386', '2025-05-15 10:10:06', 145, '2025-05-15 10:10:06');\n\n-- ----------------------------\n-- Table structure for open_api_permission\n-- ----------------------------\nDROP TABLE IF EXISTS `open_api_permission`;\nCREATE TABLE `open_api_permission`  (\n                                        `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n                                        `api_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '接口ID',\n                                        `api_auth_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '认证ID',\n                                        `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n                                        `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n                                        `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人',\n                                        `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n                                        PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'openapi授权' ROW_FORMAT = DYNAMIC;\n\n-- ----------------------------\n-- Records of open_api_permission\n-- ----------------------------\nINSERT INTO `open_api_permission` VALUES ('1922164225875820545', '1922132683346649090', '1922164194775056386', 'admin', '2025-05-13 13:37:18', NULL, NULL);\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n\nINSERT INTO sys_permission (id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('1917957565728198657', '1922109301837606914', '接口文档', '/openapi/SwaggerUI', 'openapi/SwaggerUI', 1, '', null, 1, null, '0', 1, 0, null, 1, 0, 0, 0, null, 'admin', '2025-05-01 23:01:32', 'admin', '2025-05-13 09:59:46', 0, 0, null, 0);\nINSERT INTO sys_permission (id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('1922109301837606914', '', 'OpenApi管理', '/openapi', 'layouts/RouteView', 1, '', null, 0, null, '0', 12.1, 0, 'ant-design:swap-outlined', 0, 0, 0, 0, null, 'admin', '2025-05-13 09:59:03', 'admin', '2025-05-13 10:02:43', 0, 0, null, 0);\nINSERT INTO sys_permission (id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('2025050104193340030', '1922109301837606914', '接口管理', '/openapi/openApiList', 'openapi/OpenApiList', 1, null, null, 1, null, '1', 0, 0, null, 0, 0, 0, 0, null, 'admin', '2025-05-01 16:19:03', 'admin', '2025-05-13 09:59:24', 0, 0, '1', 0);\nINSERT INTO sys_permission (id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('2025050104193350031', '2025050104193340030', '添加接口管理', null, null, 0, null, null, 2, 'openapi:open_api:add', '1', null, 0, null, 1, 0, 0, 0, null, 'admin', '2025-05-01 16:19:03', null, null, 0, 0, '1', 0);\nINSERT INTO sys_permission (id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('2025050104193350032', '2025050104193340030', '编辑接口管理', null, null, 0, null, null, 2, 'openapi:open_api:edit', '1', null, 0, null, 1, 0, 0, 0, null, 'admin', '2025-05-01 16:19:03', null, null, 0, 0, '1', 0);\nINSERT INTO sys_permission (id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('2025050104193350033', '2025050104193340030', '删除接口管理', null, null, 0, null, null, 2, 'openapi:open_api:delete', '1', null, 0, null, 1, 0, 0, 0, null, 'admin', '2025-05-01 16:19:03', null, null, 0, 0, '1', 0);\nINSERT INTO sys_permission (id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('2025050104193350034', '2025050104193340030', '批量删除接口管理', null, null, 0, null, null, 2, 'openapi:open_api:deleteBatch', '1', null, 0, null, 1, 0, 0, 0, null, 'admin', '2025-05-01 16:19:03', null, null, 0, 0, '1', 0);\nINSERT INTO sys_permission (id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('2025050104193350035', '2025050104193340030', '导出excel_接口管理', null, null, 0, null, null, 2, 'openapi:open_api:exportXls', '1', null, 0, null, 1, 0, 0, 0, null, 'admin', '2025-05-01 16:19:03', null, null, 0, 0, '1', 0);\nINSERT INTO sys_permission (id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('2025050104193350036', '2025050104193340030', '导入excel_接口管理', null, null, 0, null, null, 2, 'openapi:open_api:importExcel', '1', null, 0, null, 1, 0, 0, 0, null, 'admin', '2025-05-01 16:19:03', null, null, 0, 0, '1', 0);\nINSERT INTO sys_permission (id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('2025050105554940200', '1922109301837606914', '授权管理', '/openapi/openApiAuthList', 'openapi/OpenApiAuthList', 1, null, null, 1, null, '1', 0, 0, null, 0, 0, 0, 0, null, 'admin', '2025-05-01 17:55:20', 'admin', '2025-05-13 09:59:35', 0, 0, '1', 0);\nINSERT INTO sys_permission (id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('2025050105554940201', '2025050105554940200', '添加授权管理', null, null, 0, null, null, 2, 'openapi:open_api_auth:add', '1', null, 0, null, 1, 0, 0, 0, null, 'admin', '2025-05-01 17:55:20', null, null, 0, 0, '1', 0);\nINSERT INTO sys_permission (id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('2025050105554940202', '2025050105554940200', '编辑授权管理', null, null, 0, null, null, 2, 'openapi:open_api_auth:edit', '1', null, 0, null, 1, 0, 0, 0, null, 'admin', '2025-05-01 17:55:20', null, null, 0, 0, '1', 0);\nINSERT INTO sys_permission (id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('2025050105554940203', '2025050105554940200', '删除授权管理', null, null, 0, null, null, 2, 'openapi:open_api_auth:delete', '1', null, 0, null, 1, 0, 0, 0, null, 'admin', '2025-05-01 17:55:20', null, null, 0, 0, '1', 0);\nINSERT INTO sys_permission (id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('2025050105554940204', '2025050105554940200', '批量删除授权管理', null, null, 0, null, null, 2, 'openapi:open_api_auth:deleteBatch', '1', null, 0, null, 1, 0, 0, 0, null, 'admin', '2025-05-01 17:55:20', null, null, 0, 0, '1', 0);\nINSERT INTO sys_permission (id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('2025050105554940205', '2025050105554940200', '导出excel_授权管理', null, null, 0, null, null, 2, 'openapi:open_api_auth:exportXls', '1', null, 0, null, 1, 0, 0, 0, null, 'admin', '2025-05-01 17:55:20', null, null, 0, 0, '1', 0);\nINSERT INTO sys_permission (id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('2025050105554940206', '2025050105554940200', '导入excel_授权管理', null, null, 0, null, null, 2, 'openapi:open_api_auth:importExcel', '1', null, 0, null, 1, 0, 0, 0, null, 'admin', '2025-05-01 17:55:20', null, null, 0, 0, '1', 0);\n\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('1917957659860963330', 'f6817f48af4fb3af11b9e8bf182f618b', '1917957565728198657', null, '2025-05-01 23:01:55', '0:0:0:0:0:0:0:1');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('1922109760551858178', 'f6817f48af4fb3af11b9e8bf182f618b', '1922109301837606914', null, '2025-05-13 10:00:53', '0:0:0:0:0:0:0:1');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('1917857071739539457', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050104193340030', null, '2025-05-01 16:22:13', '0:0:0:0:0:0:0:1');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('1917857071806648321', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050104193350031', null, '2025-05-01 16:22:13', '0:0:0:0:0:0:0:1');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('1917857071806648322', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050104193350032', null, '2025-05-01 16:22:13', '0:0:0:0:0:0:0:1');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('1917857071806648323', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050104193350033', null, '2025-05-01 16:22:13', '0:0:0:0:0:0:0:1');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('1917857071806648324', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050104193350034', null, '2025-05-01 16:22:13', '0:0:0:0:0:0:0:1');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('1917857071806648325', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050104193350035', null, '2025-05-01 16:22:13', '0:0:0:0:0:0:0:1');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('1917857071806648326', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050104193350036', null, '2025-05-01 16:22:13', '0:0:0:0:0:0:0:1');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('1917881149426864129', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050105554940200', null, '2025-05-01 17:57:53', '0:0:0:0:0:0:0:1');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('1917881149431058436', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050105554940203', null, '2025-05-01 17:57:53', '0:0:0:0:0:0:0:1');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('1917881149431058437', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050105554940204', null, '2025-05-01 17:57:53', '0:0:0:0:0:0:0:1');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('1917881149431058438', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050105554940205', null, '2025-05-01 17:57:53', '0:0:0:0:0:0:0:1');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES ('1917881149431058439', 'f6817f48af4fb3af11b9e8bf182f618b', '2025050105554940206', null, '2025-05-01 17:57:53', '0:0:0:0:0:0:0:1');"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.8.2_1__all_upgrade.sql",
    "content": "-- 租户初始套餐添加时 提示违反唯一约束\nALTER TABLE sys_tenant_pack\nADD INDEX idx__stp_tenant_id_pack_code(tenant_id, pack_code) USING BTREE;\n\n-- 添加通知消息大分类\nALTER TABLE sys_announcement\n    ADD COLUMN notice_type varchar(10) NULL COMMENT '通知类型(system:系统消息、file:知识库、flow:流程、plan:日程计划、meeting:会议)' AFTER tenant_id;\n\n-- 更新通知消息字段旧数据默认为系统消息\nupdate sys_announcement set notice_type = 'flow' where bus_type in('bpm','bpm_cc','bpm_task');\nupdate sys_announcement set notice_type = 'system' where bus_type ='email';\nupdate sys_announcement set notice_type = 'system' where notice_type is null;\n\n-- 系统公告新增字段修改\nALTER TABLE `sys_announcement`\n    ADD COLUMN `files` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '附件' AFTER `tenant_id`,\nADD COLUMN `visits_num` int(11) NULL DEFAULT NULL COMMENT '访问次数' AFTER `files`,\nADD COLUMN `iz_top` int(10) NULL DEFAULT NULL COMMENT '是否置顶（0:否;  1:是）' AFTER `visits_num`,\nADD COLUMN `iz_approval` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否审批（0否 1是）' AFTER `iz_top`,\nADD COLUMN `bpm_status` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '流程状态' AFTER `iz_approval`,\nADD COLUMN `msg_classify` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '消息归类' AFTER `bpm_status`;\n\n-- 系统公告--新增字典\nINSERT INTO `sys_dict`(`id`, `dict_name`, `dict_code`, `description`, `del_flag`, `create_by`, `create_time`, `update_by`, `update_time`, `type`, `tenant_id`, `low_app_id`) VALUES ('1934846825077878786', '公告分类', 'notice_type', NULL, 0, 'admin', '2025-06-17 13:33:25', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict`(`id`, `dict_name`, `dict_code`, `description`, `del_flag`, `create_by`, `create_time`, `update_by`, `update_time`, `type`, `tenant_id`, `low_app_id`) VALUES ('1937393911539384322', '模版分类', 'msgCategory', NULL, 0, 'admin', '2025-06-24 14:14:38', NULL, NULL, 0, 0, NULL);\n\nINSERT INTO `sys_dict_item`(`id`, `dict_id`, `item_text`, `item_value`, `item_color`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1934846897383485441', '1934846825077878786', '发布性通知', '1', NULL, NULL, 1, 1, 'admin', '2025-06-17 13:33:43', NULL, NULL);\nINSERT INTO `sys_dict_item`(`id`, `dict_id`, `item_text`, `item_value`, `item_color`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1934846933030875138', '1934846825077878786', '转发性通知', '2', NULL, NULL, 1, 1, 'admin', '2025-06-17 13:33:51', NULL, NULL);\nINSERT INTO `sys_dict_item`(`id`, `dict_id`, `item_text`, `item_value`, `item_color`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1934846963749957633', '1934846825077878786', '指示性通知', '3', NULL, NULL, 1, 1, 'admin', '2025-06-17 13:33:59', NULL, NULL);\nINSERT INTO `sys_dict_item`(`id`, `dict_id`, `item_text`, `item_value`, `item_color`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1934846993449824257', '1934846825077878786', '任免性通知', '4', NULL, NULL, 1, 1, 'admin', '2025-06-17 13:34:06', NULL, NULL);\nINSERT INTO `sys_dict_item`(`id`, `dict_id`, `item_text`, `item_value`, `item_color`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1934847047262744577', '1934846825077878786', '事务性（周知）通知', '5', NULL, NULL, 1, 1, 'admin', '2025-06-17 13:34:18', NULL, NULL);\nINSERT INTO `sys_dict_item`(`id`, `dict_id`, `item_text`, `item_value`, `item_color`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1934847082905939969', '1934846825077878786', '会议通知', '6', NULL, NULL, 1, 1, 'admin', '2025-06-17 13:34:27', NULL, NULL);\nINSERT INTO `sys_dict_item`(`id`, `dict_id`, `item_text`, `item_value`, `item_color`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1934847117039185921', '1934846825077878786', '其他通知', '7', NULL, NULL, 1, 1, 'admin', '2025-06-17 13:34:35', NULL, NULL);\nINSERT INTO `sys_dict_item`(`id`, `dict_id`, `item_text`, `item_value`, `item_color`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1937394006326460418', '1937393911539384322', '通知公告', 'notice', NULL, NULL, 1, 1, 'admin', '2025-06-24 14:15:01', NULL, NULL);\nINSERT INTO `sys_dict_item`(`id`, `dict_id`, `item_text`, `item_value`, `item_color`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1937394038412886018', '1937393911539384322', '其他', 'other', NULL, NULL, 1, 1, 'admin', '2025-06-24 14:15:08', NULL, NULL);\n\n\n-- 消息模版增加 模版分类 字段\nALTER TABLE `sys_sms_template`\n    ADD COLUMN `template_category` varchar(10) NULL COMMENT '模版分类：notice通知公告 other其他' AFTER `template_type`;\n\n\n-- 修改表iz_top的默认值\nALTER TABLE `sys_announcement`\n    MODIFY COLUMN `iz_top` int(10) NULL DEFAULT 0 COMMENT '是否置顶（0:否;  1:是）' AFTER `visits_num`;\n\n-- 补充旧数据iz_top的默认值\nUPDATE sys_announcement SET iz_top = 0 WHERE iz_top IS NULL OR iz_top = '';\n\n-- 新增首页配置菜单\nINSERT INTO `sys_permission`(`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1939572818833301506', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '首页配置', '/system/homeConfig', 'system/homeConfig/index', 1, '', NULL, 1, NULL, '0', 1.00, 0, 'ant-design:appstore-outlined', 1, 0, 0, 0, NULL, 'admin', '2025-06-30 14:32:50', 'admin', '2025-07-01 20:13:22', 0, 0, NULL, 0);\nINSERT INTO `sys_permission`(`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1941349550087168001', '1939572818833301506', '首页配置-批量删除', NULL, NULL, 0, NULL, NULL, 2, 'system:roleindex:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-05 12:12:56', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission`(`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1941349462887587842', '1939572818833301506', '首页配置-删除', NULL, NULL, 0, NULL, NULL, 2, 'system:roleindex:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-05 12:12:35', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission`(`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1941349335431077889', '1939572818833301506', '首页配置-编辑', NULL, NULL, 0, NULL, NULL, 2, 'system:roleindex:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-05 12:12:05', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission`(`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1941349246536998913', '1939572818833301506', '首页配置-添加', NULL, NULL, 0, NULL, NULL, 2, 'system:roleindex:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-05 12:11:44', NULL, NULL, 0, 0, '1', 0);\n\n-- 首页字典\nINSERT INTO `sys_dict`(`id`, `dict_name`, `dict_code`, `description`, `del_flag`, `create_by`, `create_time`, `update_by`, `update_time`, `type`, `tenant_id`, `low_app_id`) VALUES ('1939572486447292418', '首页关联', 'relation_type', NULL, 0, 'admin', '2025-06-30 14:31:31', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict_item`(`id`, `dict_id`, `item_text`, `item_value`, `item_color`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1939572554533429250', '1939572486447292418', '角色', 'ROLE', NULL, NULL, 1, 1, 'admin', '2025-06-30 14:31:47', 'admin', '2025-06-30 15:04:18');\nINSERT INTO `sys_dict_item`(`id`, `dict_id`, `item_text`, `item_value`, `item_color`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1939572602289774594', '1939572486447292418', '用户', 'USER', NULL, NULL, 2, 1, 'admin', '2025-06-30 14:31:59', 'admin', '2025-06-30 15:04:21');\n\n\n-- 角色首页表新增 relation_type 字段\nALTER TABLE `sys_role_index`\n    ADD COLUMN `relation_type` varchar(20) NULL COMMENT '关联关系(ROLE:角色 USER:用户)' AFTER `sys_org_code`;\n\n-- 首页角色补充默认值\nUPDATE sys_role_index SET relation_type = 'ROLE' WHERE relation_type IS NULL OR relation_type = '';\n\n-- app3支持版本管理\nINSERT INTO `sys_permission`(`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930152938891608066', '1455100420297859074', 'APP版本管理', '/app/version', 'system/appVersion/SysAppVersion', 1, '', NULL, 1, NULL, '0', 1.00, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-06-04 14:41:36', 'admin', '2025-07-03 10:09:46', 0, 0, NULL, 0);\n\n\n-- 首页配置菜单\nUPDATE `sys_permission` SET `is_leaf` = 0 WHERE `id` = '1939572818833301506';\n\n\n-- APP版本管理配置菜单\nUPDATE `sys_permission` SET `is_leaf` = 0 WHERE `id` = '1930152938891608066';\nINSERT INTO `sys_permission`(`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1942160438629109761', '1930152938891608066', 'APP版本编辑', NULL, NULL, 0, NULL, NULL, 2, 'app:edit:version', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-07 17:55:07', NULL, NULL, 0, 0, '1', 0);\n\n-- 删除第三方配置添加权限\nINSERT INTO sys_permission (id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('1947833384695164929', '1629109281748291586', '第三方配置删除', NULL, NULL, 0, NULL, NULL, 2, 'system:third:config:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-23 09:37:23', NULL, NULL, 0, 0, '1', 0);\n\n-- 人员代理表添加process_ids字段\nALTER TABLE `sys_user_agent`\n    ADD COLUMN `process_ids` varchar(255) NULL COMMENT '代理流程ID' AFTER `end_time`;"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.8.3_0__all_upgrade.sql",
    "content": "-- ---author:wangshuai---date:20250806-----for: 【QQYUN-12164】用户表添加个人签名和是否启用个人签名字段\nALTER TABLE sys_user \nADD COLUMN sign_enable tinyint(1) NULL DEFAULT NULL COMMENT '是否启用个性签名（0 否 1是）' AFTER bpm_status,\nADD COLUMN sign varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '个性签名' AFTER sign_enable;\n\n-- ---author:chenrui---date:20250806-----for: 【QQYUN-12244】AI调用模板生成word简历\nINSERT INTO `airag_flow` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `application_name`, `name`, `descr`, `icon`, `chain`, `design`, `status`, `metadata`) VALUES ('1952634605517447170', 'admin', '2025-08-05 15:35:43', 'admin', '2025-08-06 17:37:27', 'A04', NULL, 'jeecg', '示例_AI生成在线简历', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'215734195065536512\\'),\\n    enhanceJava.tag(\\'215740280715427840\\'),\\n    end.tag(\\'215735188368998400\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":404,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"个人简介\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"profile\\\",\\\"name\\\":\\\"基础信息\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"215734195065536512\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":739,\\\"y\\\":406,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"这是生成在线 Word 文档的 JSON 结构说明，每个对象表示一个内容块。\\\\n字段说明：\\\\n    • type：内容类型。可选：title（标题）、list（列表）、separator（分隔线）、hyperlink（超链接）、pageBreak（分页符）、tab（制表符）、\\\\\\\"\\\\\\\"（普通文本）。\\\\n    • level：标题层级，仅 type 为 title 时使用，取值：first ~ sixth。\\\\n    • value：文本、图片地址、超链接等。\\\\n    • valueList：用于标题、列表、超链接等，数组元素支持 value 及样式字段。\\\\n    • listType：列表类型，ul（无序）、ol（有序）。\\\\n    • listStyle：列表样式，如 disc、decimal、circle、square、checkbox。\\\\n    • trList、colgroup：表格行列定义，仅用于 table。\\\\n    • 样式字段：font、size、bold、color、italic、highlight、underline、strikeout。\\\\n    • 分隔线：dashArray。\\\\n    • 其他：rowFlex（left、center、right、alignment）、backgroundColor、verticalAlign、textDecoration 等用于特殊样式。\\\\n示例：\\\\n[\\\\n  {\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"title\\\\\\\",\\\\n    \\\\\\\"level\\\\\\\": \\\\\\\"first\\\\\\\",\\\\n    \\\\\\\"valueList\\\\\\\": [{ \\\\\\\"value\\\\\\\": \\\\\\\"主标题示例\\\\\\\", \\\\\\\"font\\\\\\\": \\\\\\\"微软雅黑\\\\\\\", \\\\\\\"size\\\\\\\": 26, \\\\\\\"bold\\\\\\\": true, \\\\\\\"rowFlex\\\\\\\": \\\\\\\"center\\\\\\\" }]\\\\n  },\\\\n  { \\\\\\\"type\\\\\\\": \\\\\\\"\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"普通文本内容示例\\\\\\\" },\\\\n  {\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"list\\\\\\\",\\\\n    \\\\\\\"listType\\\\\\\": \\\\\\\"ul\\\\\\\",\\\\n    \\\\\\\"listStyle\\\\\\\": \\\\\\\"disc\\\\\\\",\\\\n    \\\\\\\"valueList\\\\\\\": [\\\\n      { \\\\\\\"value\\\\\\\": \\\\\\\"列表项1\\\\\\\" },\\\\n      { \\\\\\\"value\\\\\\\": \\\\\\\"列表项2\\\\\\\" }\\\\n    ]\\\\n  },\\\\n  { \\\\\\\"type\\\\\\\": \\\\\\\"separator\\\\\\\", \\\\\\\"dashArray\\\\\\\": [1] },\\\\n  {\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"hyperlink\\\\\\\",\\\\n    \\\\\\\"url\\\\\\\": \\\\\\\"https://www.example.com\\\\\\\",\\\\n    \\\\\\\"valueList\\\\\\\": [{ \\\\\\\"value\\\\\\\": \\\\\\\"点击访问官网\\\\\\\", \\\\\\\"color\\\\\\\": \\\\\\\"#0000FF\\\\\\\", \\\\\\\"underline\\\\\\\": true }]\\\\n  },\\\\n  { \\\\\\\"type\\\\\\\": \\\\\\\"pageBreak\\\\\\\" },\\\\n  { \\\\\\\"type\\\\\\\": \\\\\\\"tab\\\\\\\" },\\\\n  { \\\\\\\"type\\\\\\\": \\\\\\\"superscript\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"上标内容\\\\\\\" },\\\\n  { \\\\\\\"type\\\\\\\": \\\\\\\"subscript\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"下标内容\\\\\\\" }\\\\n]\\\\n⸻\\\\n注意：\\\\n- 只输出`json`格式。\\\\n- 内容结构、样式组合不限，但字段与取值必须符合说明。\\\\n- title类型的内容块，中value必须以`\\\\\\\\n`结尾\\\\n- \\\\\\\"\\\\\\\"\\\\\\\"使用`{ \\\\\\\"type\\\\\\\": \\\\\\\"\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"\\\\\\\\n\\\\\\\" }`进行主动换行，对象之间不会自动换行\\\\\\\"\\\\\\\"\\\\\\\"。\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"请根据以上字段和示例，生成一个完整的个人简历文档 JSON。\\\\n- 至少包含基础信息、个人优势、工作经历、项目经理、教育经历等模块。\\\\n- 若基础数据不足，可以适当生成参考数据。\\\\n- 用户信息如下：\\\\n基础资料：{{base}}\\\\n简介：{{profile}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"profile\\\",\\\"name\\\":\\\"base\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"profile\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"215735188368998400\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1577,\\\"y\\\":354,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"215740280715427840\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"215740280715427840\\\",\\\"type\\\":\\\"enhanceJava\\\",\\\"x\\\":1156,\\\"y\\\":352,\\\"properties\\\":{\\\"text\\\":\\\"Java 增强\\\",\\\"options\\\":{\\\"enhance\\\":{\\\"type\\\":\\\"spring\\\",\\\"path\\\":\\\"jeecgDemoAiWordGen\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"215734195065536512\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"215734195073925120\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"215734195065536512\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"215734195065536512_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":389},{\\\"x\\\":566,\\\"y\\\":389},{\\\"x\\\":473,\\\"y\\\":347},{\\\"x\\\":573,\\\"y\\\":347}]},{\\\"id\\\":\\\"215740280719622144\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"215734195065536512\\\",\\\"targetNodeId\\\":\\\"215740280715427840\\\",\\\"sourceAnchorId\\\":\\\"215734195065536512_output\\\",\\\"targetAnchorId\\\":\\\"215740280715427840_input\\\",\\\"pointsList\\\":[{\\\"x\\\":905,\\\"y\\\":347},{\\\"x\\\":1005,\\\"y\\\":347},{\\\"x\\\":890,\\\"y\\\":293},{\\\"x\\\":990,\\\"y\\\":293}]},{\\\"id\\\":\\\"215740398487289856\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"215740280715427840\\\",\\\"targetNodeId\\\":\\\"215735188368998400\\\",\\\"sourceAnchorId\\\":\\\"215740280715427840_output\\\",\\\"targetAnchorId\\\":\\\"215735188368998400_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1322,\\\"y\\\":293},{\\\"x\\\":1422,\\\"y\\\":293},{\\\"x\\\":1311,\\\"y\\\":328},{\\\"x\\\":1411,\\\"y\\\":328}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"215740280715427840\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"个人简介\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"profile\\\",\\\"name\\\":\\\"基础信息\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"}]}');\n\n-- -author:chenrui---date:2025/8/11-----for:[QQYUN-13400]删除废弃菜单---\ndelete from sys_permission where id = '1948206070361595906';\ndelete from sys_permission where id = '1948205626927194114';\n\n-- -author:chenrui---date:2025/8/13-----for:[QQYUN-13394]优化，开源版本的账号都是错误的，用户不知道需要配置自己的账号---\n-- 添加激活字段\nALTER TABLE `airag_model`\nADD COLUMN `activate_flag` int NULL COMMENT '是否激活（1=是，0=否）' AFTER `model_params`;\n-- 更新历史数据值\nupdate airag_model set activate_flag = 0 ;\n\n\n\n-- ---author:chenrui---date:20250818-----for:更新生成简历提示词,确保生成的json可以被解析\nUPDATE `airag_flow` SET `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'215734195065536512\\'),\\n    enhanceJava.tag(\\'215740280715427840\\'),\\n    end.tag(\\'215735188368998400\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":404,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"个人简介\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"profile\\\",\\\"name\\\":\\\"基础信息\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"215734195065536512\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":739,\\\"y\\\":406,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你必须只输出合法且可被 JSON.parse() 正确解析的 JSON。\\\\n不要输出任何解释、注释或 JSON 以外的文字。\\\\n\\\\n\\\\nJSON 结构规则：\\\\n- 每个对象表示一个内容块。\\\\n- 字段说明：\\\\n • \\\\\\\"type\\\\\\\"：内容类型，可选：\\\\\\\"title\\\\\\\"（标题）、\\\\\\\"list\\\\\\\"（列表）、\\\\\\\"separator\\\\\\\"（分隔线）、\\\\\\\"hyperlink\\\\\\\"（超链接）、\\\\\\\"pageBreak\\\\\\\"（分页符）、\\\\\\\"tab\\\\\\\"（制表符）、\\\\\\\"\\\\\\\"（普通文本）、\\\\\\\"superscript\\\\\\\"（上标）、\\\\\\\"subscript\\\\\\\"（下标）、\\\\\\\"table\\\\\\\"（表格）。\\\\n • \\\\\\\"level\\\\\\\"：标题层级，仅当 type 为 \\\\\\\"title\\\\\\\" 时使用，取值：\\\\\\\"first\\\\\\\" ~ \\\\\\\"sixth\\\\\\\"。\\\\n • \\\\\\\"value\\\\\\\"：文本、图片地址、超链接等。\\\\n • \\\\\\\"valueList\\\\\\\"：数组，用于标题、列表、超链接等，数组元素支持 \\\\\\\"value\\\\\\\" 及样式字段。\\\\n • \\\\\\\"listType\\\\\\\"：列表类型，取值：\\\\\\\"ul\\\\\\\"（无序）、\\\\\\\"ol\\\\\\\"（有序）。\\\\n • \\\\\\\"listStyle\\\\\\\"：列表样式，如 \\\\\\\"disc\\\\\\\"、\\\\\\\"decimal\\\\\\\"、\\\\\\\"circle\\\\\\\"、\\\\\\\"square\\\\\\\"、\\\\\\\"checkbox\\\\\\\"。\\\\n • \\\\\\\"trList\\\\\\\"、\\\\\\\"colgroup\\\\\\\"：表格行列定义，仅用于 \\\\\\\"table\\\\\\\"。\\\\n • 样式字段：\\\\\\\"font\\\\\\\"、\\\\\\\"size\\\\\\\"、\\\\\\\"bold\\\\\\\"、\\\\\\\"color\\\\\\\"、\\\\\\\"italic\\\\\\\"、\\\\\\\"highlight\\\\\\\"、\\\\\\\"underline\\\\\\\"、\\\\\\\"strikeout\\\\\\\"。\\\\n • \\\\\\\"dashArray\\\\\\\"：用于 \\\\\\\"separator\\\\\\\"。\\\\n • 其他样式字段：\\\\\\\"rowFlex\\\\\\\"（\\\\\\\"left\\\\\\\"、\\\\\\\"center\\\\\\\"、\\\\\\\"right\\\\\\\"、\\\\\\\"alignment\\\\\\\"）、\\\\\\\"backgroundColor\\\\\\\"、\\\\\\\"verticalAlign\\\\\\\"、\\\\\\\"textDecoration\\\\\\\"。\\\\n- 当 type = \\\\\\\"title\\\\\\\" 时，\\\\\\\"value\\\\\\\" 必须以 \\\\\\\"\\\\\\\\n\\\\\\\" 结尾。\\\\n- 主动换行请使用 `{ \\\\\\\"type\\\\\\\": \\\\\\\"\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"\\\\\\\\n\\\\\\\" }`，不同对象之间不会自动换行。\\\\n- 所有键名和字符串必须使用英文双引号 `\\\\\\\"`。\\\\n\\\\n\\\\n输出必须严格是 JSON 数组，例如：\\\\n[\\\\n {\\\\n  \\\\\\\"type\\\\\\\": \\\\\\\"title\\\\\\\",\\\\n  \\\\\\\"level\\\\\\\": \\\\\\\"first\\\\\\\",\\\\n  \\\\\\\"valueList\\\\\\\": [{ \\\\\\\"value\\\\\\\": \\\\\\\"主标题示例\\\\\\\\n\\\\\\\", \\\\\\\"font\\\\\\\": \\\\\\\"微软雅黑\\\\\\\", \\\\\\\"size\\\\\\\": 26, \\\\\\\"bold\\\\\\\": true, \\\\\\\"rowFlex\\\\\\\": \\\\\\\"center\\\\\\\" }]\\\\n },\\\\n { \\\\\\\"type\\\\\\\": \\\\\\\"\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"普通文本内容示例\\\\\\\" },\\\\n {\\\\n  \\\\\\\"type\\\\\\\": \\\\\\\"list\\\\\\\",\\\\n  \\\\\\\"listType\\\\\\\": \\\\\\\"ul\\\\\\\",\\\\n  \\\\\\\"listStyle\\\\\\\": \\\\\\\"disc\\\\\\\",\\\\n  \\\\\\\"valueList\\\\\\\": [\\\\n   { \\\\\\\"value\\\\\\\": \\\\\\\"列表项1\\\\\\\" },\\\\n   { \\\\\\\"value\\\\\\\": \\\\\\\"列表项2\\\\\\\" }\\\\n  ]\\\\n }\\\\n]\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"请根据以上字段和示例，生成一个完整的个人简历文档 JSON。\\\\n- 至少包含基础信息、个人优势、工作经历、项目经理、教育经历等模块。\\\\n- 若基础数据不足，可以适当生成参考数据。\\\\n- 用户信息如下：\\\\n基础资料：{{base}}\\\\n简介：{{profile}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"profile\\\",\\\"name\\\":\\\"base\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"profile\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"215735188368998400\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1577,\\\"y\\\":354,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"215740280715427840\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"215740280715427840\\\",\\\"type\\\":\\\"enhanceJava\\\",\\\"x\\\":1156,\\\"y\\\":352,\\\"properties\\\":{\\\"text\\\":\\\"Java 增强\\\",\\\"options\\\":{\\\"enhance\\\":{\\\"type\\\":\\\"spring\\\",\\\"path\\\":\\\"jeecgDemoAiWordGen\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"215734195065536512\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"215734195073925120\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"215734195065536512\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"215734195065536512_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":389},{\\\"x\\\":566,\\\"y\\\":389},{\\\"x\\\":473,\\\"y\\\":347},{\\\"x\\\":573,\\\"y\\\":347}]},{\\\"id\\\":\\\"215740280719622144\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"215734195065536512\\\",\\\"targetNodeId\\\":\\\"215740280715427840\\\",\\\"sourceAnchorId\\\":\\\"215734195065536512_output\\\",\\\"targetAnchorId\\\":\\\"215740280715427840_input\\\",\\\"pointsList\\\":[{\\\"x\\\":905,\\\"y\\\":347},{\\\"x\\\":1005,\\\"y\\\":347},{\\\"x\\\":890,\\\"y\\\":293},{\\\"x\\\":990,\\\"y\\\":293}]},{\\\"id\\\":\\\"215740398487289856\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"215740280715427840\\\",\\\"targetNodeId\\\":\\\"215735188368998400\\\",\\\"sourceAnchorId\\\":\\\"215740280715427840_output\\\",\\\"targetAnchorId\\\":\\\"215735188368998400_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1322,\\\"y\\\":293},{\\\"x\\\":1422,\\\"y\\\":293},{\\\"x\\\":1311,\\\"y\\\":328},{\\\"x\\\":1411,\\\"y\\\":328}]}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"215740280715427840\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"个人简介\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"profile\\\",\\\"name\\\":\\\"基础信息\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"}]}' WHERE `id` = '1952634605517447170';\n\n-- ---author:wangshuai---date:20250820-----for:【QQYUN-13421】扩展职务加职务等级：修改原来职务字段\nALTER TABLE `sys_position`\nCHANGE COLUMN `post_rank` `post_level` int(2) NULL DEFAULT NULL COMMENT '职务等级' AFTER `name`;\n\n-- ---author:wangshuai---date:20250820-----for:【QQYUN-13426】部门表新增职级和上级岗位字段\n-- 修改字典部门类型\nUPDATE `sys_dict` SET  `description` = '机构类型 1公司，2部门，3岗位，4子公司' WHERE `id` = '1174511106530525185';\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1955230463631126529', '1174511106530525185', '子公司', '4', NULL, 1, 1, 'admin', '2025-08-12 19:30:44', NULL, NULL, NULL);\n\n-- 部门表新增职级和上级岗位字段\nALTER TABLE `sys_depart`\nMODIFY COLUMN `org_category` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1' COMMENT '机构类别 1公司，2部门，3岗位，4子公司' AFTER `description`,\nADD COLUMN `position_id` varchar(32) NULL COMMENT '职级id' AFTER `iz_leaf`,\nADD COLUMN `dep_post_parent_id` varchar(32) NULL COMMENT '上级岗位id' AFTER `position_id`,\nADD INDEX `idx_sd_position_id`(`position_id`) USING BTREE,\nADD INDEX `idx_sd_dep_post_parent_id`(`dep_post_parent_id`) USING BTREE;\n\n-- author:wangshuai---date:20250820--for: 【QQYUN-13422】【用户管理】添加字段 主岗位 兼职岗位 取消职务 ---\n\n-- 用户表新增岗位和兼职岗位字段\nALTER TABLE `sys_user`\nADD COLUMN `main_dep_post_id` varchar(32) NULL COMMENT '主岗位（部门岗位id）' AFTER `sign`,\nADD COLUMN `other_dep_post_id` varchar(1000) NULL COMMENT '兼职岗位(部门岗位id)' AFTER `main_dep_post_id`,\nADD INDEX `idx_su_main_dep_post_id`(`main_dep_post_id`) USING BTREE,\nADD INDEX `idx_su_other_dep_post_id`(`other_dep_post_id`) USING BTREE;\n\n-- author:wangshuai---date:20250821-for: 初始化职务数据及新增部门数据 ---\n\n-- 职务默认数据\ndelete from sys_position;\n\nINSERT INTO `sys_position` (`id`, `code`, `name`, `post_level`, `company_id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`) VALUES ('1958470823064436737', '5za8WqucKR', '职员', 6, NULL, 'admin', '2025-08-21 18:06:46', NULL, NULL, 'A01A08', 0);\nINSERT INTO `sys_position` (`id`, `code`, `name`, `post_level`, `company_id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`) VALUES ('1958470865577902082', 'hGAuYslALj', '副部长', 5, NULL, 'admin', '2025-08-21 18:06:56', NULL, NULL, 'A01A08', 0);\nINSERT INTO `sys_position` (`id`, `code`, `name`, `post_level`, `company_id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`) VALUES ('1958470912214368258', 'M0xkqpPsg7', '部长', 4, NULL, 'admin', '2025-08-21 18:07:07', NULL, NULL, 'A01A08', 0);\nINSERT INTO `sys_position` (`id`, `code`, `name`, `post_level`, `company_id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`) VALUES ('1958471030867034113', 'npEbkFq6Uw', '副总经理', 3, NULL, 'admin', '2025-08-21 18:07:35', NULL, NULL, 'A01A08', 0);\nINSERT INTO `sys_position` (`id`, `code`, `name`, `post_level`, `company_id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`) VALUES ('1958471074953363458', 'DEPMkWRJEu', '总经理', 2, NULL, 'admin', '2025-08-21 18:07:46', NULL, NULL, 'A01A08', 0);\nINSERT INTO `sys_position` (`id`, `code`, `name`, `post_level`, `company_id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`) VALUES ('1958471111989067778', 'gu7Rbffh0L', '董事长', 1, NULL, 'admin', '2025-08-21 18:07:54', NULL, NULL, 'A01A08', 0);\n\n-- 新增部门数据\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958496243038556161', '', '控股集团', NULL, NULL, 0, NULL, '1', '1', 'A05', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:47:48', NULL, NULL, 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958496444470005762', '1958496243038556161', '投资控股集团有限公司', NULL, NULL, 0, NULL, '4', '2', 'A05A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:48:34', 'admin', '2025-08-21 19:49:57', 0, 0, NULL, '');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958496759810363394', '1958496243038556161', '城市运营管理集团有限公司', NULL, NULL, 1, NULL, '4', '2', 'A05A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:49:49', 'admin', '2025-08-21 20:30:23', 0, 0, NULL, '');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958496836318662658', '1958496444470005762', '领导班子', NULL, NULL, 0, NULL, '2', '3', 'A05A01A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:50:08', NULL, NULL, 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958496891561840641', '1958496444470005762', '办公室', NULL, NULL, 2, NULL, '2', '3', 'A05A01A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:50:21', 'admin', '2025-08-21 19:50:36', 0, 0, NULL, '');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958496943017562114', '1958496444470005762', '财务管理中心', NULL, NULL, 3, NULL, '2', '3', 'A05A01A03', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:50:33', NULL, NULL, 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958497020528300033', '1958496444470005762', '投资发展部', NULL, NULL, 4, NULL, '2', '3', 'A05A01A04', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:50:51', NULL, NULL, 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958497164103520258', '1958496836318662658', '董事长', NULL, NULL, 0, NULL, '3', '4', 'A05A01A01A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:51:26', NULL, NULL, 0, 1, '1958471111989067778', '');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958497256772472834', '1958496836318662658', '党委书记', NULL, NULL, 1, NULL, '3', '4', 'A05A01A01A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:51:48', 'admin', '2025-08-21 19:54:53', 0, 1, '1958471030867034113', '1958497164103520258');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958497591230468098', '1958496836318662658', '控股总经理', NULL, NULL, 3, NULL, '3', '4', 'A05A01A01A03', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:53:08', 'admin', '2025-08-21 19:54:42', 0, 1, '1958471074953363458', '1958497164103520258');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958497769387724802', '1958496836318662658', '纪委书记', NULL, NULL, 4, NULL, '3', '4', 'A05A01A01A04', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:53:50', 'admin', '2025-08-21 19:54:06', 0, 1, '1958471030867034113', '1958497591230468098');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958498187287203841', '1958496891561840641', '控股办公室主任', NULL, NULL, 1, NULL, '3', '4', 'A05A01A02A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:55:30', 'admin', '2025-08-21 19:55:50', 0, 1, '1958470912214368258', '1958497164103520258');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958498716927135745', '1958496891561840641', '副主任', NULL, NULL, 2, NULL, '3', '4', 'A05A01A02A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 19:57:36', 'admin', '2025-08-21 19:57:50', 0, 1, '1958470865577902082', '1958498187287203841');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958502219078733826', '1958496891561840641', '职员', NULL, NULL, 3, NULL, '3', '4', 'A05A01A02A03', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:11:31', NULL, NULL, 0, 1, '1958470823064436737', '1958498187287203841');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958502381062754305', '1958496943017562114', '主任', NULL, NULL, 1, NULL, '3', '4', 'A05A01A03A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:12:10', 'admin', '2025-08-21 20:13:13', 0, 1, '1958470912214368258', '1958502611426512898');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958502611426512898', '1958496836318662658', '控股副总经理', NULL, NULL, 5, NULL, '3', '4', 'A05A01A01A05', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:13:04', 'admin', '2025-08-21 20:27:14', 0, 1, '1958471030867034113', '1958497591230468098');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958502810966331393', '1958496943017562114', '副主任', NULL, NULL, 2, NULL, '3', '4', 'A05A01A03A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:13:52', 'admin', '2025-08-21 20:14:40', 0, 1, '1958470865577902082', '1958502381062754305');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958502942289989634', '1958496943017562114', '职员', NULL, NULL, 2, NULL, '3', '4', 'A05A01A03A03', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:14:23', 'admin', '2025-08-21 20:14:28', 0, 1, '1958470823064436737', '1958502810966331393');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958503159999533057', '1958497020528300033', '部长', NULL, NULL, 1, NULL, '3', '4', 'A05A01A04A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:15:15', NULL, NULL, 0, 1, '1958470912214368258', '1958502611426512898');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958503409933914114', '1958497020528300033', '副部长', NULL, NULL, 2, NULL, '3', '4', 'A05A01A04A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:16:15', NULL, NULL, 0, 1, '1958470865577902082', '1958503159999533057');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958503468805165058', '1958497020528300033', '员工', NULL, NULL, 3, NULL, '3', '4', 'A05A01A04A03', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:16:29', NULL, NULL, 0, 1, '1958470823064436737', '1958503409933914114');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958507136782733313', '1958496759810363394', '领导班子', NULL, NULL, 1, NULL, '2', '3', 'A05A02A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:31:03', NULL, NULL, 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958507356253884418', '1958496759810363394', '信息技术发展有限公司', NULL, NULL, 4, NULL, '4', '3', 'A05A02A03', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:31:56', 'admin', '2025-08-21 21:12:57', 0, 0, NULL, '');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958507448138502146', '1958507136782733313', '董事长', NULL, NULL, 1, NULL, '3', '4', 'A05A02A01A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:32:18', 'admin', '2025-08-21 20:33:24', 0, 1, '1958471111989067778', '');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958507542866857985', '1958507136782733313', '副总经理', NULL, NULL, 3, NULL, '3', '4', 'A05A02A01A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:32:40', 'admin', '2025-08-21 20:33:26', 0, 1, '1958471030867034113', '');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958507650828242946', '1958507136782733313', '总经理', NULL, NULL, 2, NULL, '3', '4', 'A05A02A01A03', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 20:33:06', 'admin', '2025-08-21 20:33:20', 0, 1, '1958471074953363458', '');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958518943542972418', '1958507356253884418', '领导班子', NULL, NULL, 1, NULL, '2', '4', 'A05A02A03A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:17:58', NULL, NULL, 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958519010207240193', '1958507356253884418', '综合管理部', NULL, NULL, 2, NULL, '2', '4', 'A05A02A03A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:18:14', NULL, NULL, 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958519045623943169', '1958507356253884418', '财务部', NULL, NULL, 3, NULL, '2', '4', 'A05A02A03A03', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:18:23', NULL, NULL, 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958519097058693121', '1958507356253884418', '软件研发部', NULL, NULL, 4, NULL, '2', '4', 'A05A02A03A04', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:18:35', NULL, NULL, 0, 0, NULL, NULL);\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958520331257810945', '1958496891561840641', '总工程师', NULL, NULL, 2, NULL, '3', '4', 'A05A01A02A04', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:23:29', 'admin', '2025-08-21 21:23:52', 0, 1, '1958471030867034113', '1958497164103520258');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958520788395003906', '1958496759810363394', '办公室', NULL, NULL, 2, NULL, '2', '3', 'A05A02A04', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:25:18', 'admin', '2025-08-21 21:26:51', 0, 0, NULL, '');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958520876810932225', '1958520788395003906', '总工程师', NULL, NULL, 1, NULL, '3', '4', 'A05A02A04A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:25:39', 'admin', '2025-08-21 21:26:25', 0, 1, '1958471030867034113', '1958507650828242946');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958521034948775937', '1958518943542972418', '执行董事兼总经理', NULL, NULL, 1, NULL, '3', '5', 'A05A02A03A01A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:26:17', NULL, NULL, 0, 1, '1958471111989067778', '1958520876810932225');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958521513564999681', '1958518943542972418', '副总经理', NULL, NULL, 2, NULL, '3', '5', 'A05A02A03A01A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:28:11', NULL, NULL, 0, 1, '1958471030867034113', '1958521034948775937');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958521634549698561', '1958519010207240193', '副部长', NULL, NULL, 1, NULL, '3', '5', 'A05A02A03A02A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:28:40', 'admin', '2025-08-21 21:30:15', 0, 1, '1958470865577902082', '1958521034948775937');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958523766002716674', '1958519010207240193', '信息归档员', NULL, NULL, 2, NULL, '3', '5', 'A05A02A03A02A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:37:08', NULL, NULL, 0, 1, '1958470823064436737', '1958521634549698561');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958524282631917570', '1958519045623943169', '部长', NULL, NULL, 1, NULL, '3', '5', 'A05A02A03A03A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:39:11', NULL, NULL, 0, 1, '1958470912214368258', '1958521034948775937');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958524369311404033', '1958519045623943169', '出纳', NULL, NULL, 2, NULL, '3', '5', 'A05A02A03A03A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:39:32', NULL, NULL, 0, 1, '1958470823064436737', '1958524282631917570');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958524471841165313', '1958519097058693121', '项目经理', NULL, NULL, 1, NULL, '3', '5', 'A05A02A03A04A01', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:39:56', NULL, NULL, 0, 1, '1958470912214368258', '1958521513564999681');\nINSERT INTO `sys_depart` (`id`, `parent_id`, `depart_name`, `depart_name_en`, `depart_name_abbr`, `depart_order`, `description`, `org_category`, `org_type`, `org_code`, `mobile`, `fax`, `address`, `memo`, `status`, `del_flag`, `qywx_identifier`, `ding_identifier`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`, `iz_leaf`, `position_id`, `dep_post_parent_id`) VALUES ('1958524565596442626', '1958519097058693121', '软件工程师', NULL, NULL, 2, NULL, '3', '5', 'A05A02A03A04A02', NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'admin', '2025-08-21 21:40:19', NULL, NULL, 0, 1, '1958470823064436737', '1958524471841165313');\n\n\n-- ---author:scott---date:20250824-----for: 修改部门表字段注释说明\nALTER TABLE `sys_depart`\n    MODIFY COLUMN `org_type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '树深度层级level' AFTER `org_category`;\n    \n-- --author:liusq---date:20250827-----for: 删除代理配置菜单\nDELETE FROM sys_permission WHERE id = \"1948648516302536706\";\nDELETE FROM sys_role_permission WHERE permission_id = \"1948648516302536706\";\n\n-- ---author:scott---date:20250827-----for:[QQYUN-13516]有时通过AI生成简历，解析json报错\nUPDATE `airag_flow` SET `application_name` = 'jeecg', `name` = '示例_AI生成在线简历', `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'215734195065536512\\'),\\n    enhanceJava.tag(\\'215740280715427840\\'),\\n    end.tag(\\'215735188368998400\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":404,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"个人简介\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"profile\\\",\\\"name\\\":\\\"基础信息\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"215734195065536512\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":739,\\\"y\\\":406,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你必须只输出合法且可被 JSON.parse() 正确解析的 JSON。\\\\n不要输出任何解释、注释或 JSON 以外的文字。\\\\n\\\\n\\\\nJSON 结构规则：\\\\n- 每个对象表示一个内容块。\\\\n- 字段说明：\\\\n• \\\\\\\"type\\\\\\\"：内容类型，可选：\\\\\\\"title\\\\\\\"（标题）、\\\\\\\"list\\\\\\\"（列表）、\\\\\\\"separator\\\\\\\"（分隔线）、\\\\\\\"hyperlink\\\\\\\"（超链接）、\\\\\\\"pageBreak\\\\\\\"（分页符）、\\\\\\\"tab\\\\\\\"（制表符）、\\\\\\\"\\\\\\\"（普通文本）、\\\\\\\"superscript\\\\\\\"（上标）、\\\\\\\"subscript\\\\\\\"（下标）、\\\\\\\"table\\\\\\\"（表格）。\\\\n• \\\\\\\"level\\\\\\\"：标题层级，仅当 type 为 \\\\\\\"title\\\\\\\" 时使用，取值：\\\\\\\"first\\\\\\\" ~ \\\\\\\"sixth\\\\\\\"。\\\\n• \\\\\\\"value\\\\\\\"：文本、图片地址、超链接等。\\\\n• \\\\\\\"valueList\\\\\\\"：数组，用于标题、列表、超链接等，数组元素支持 \\\\\\\"value\\\\\\\" 及样式字段。\\\\n• \\\\\\\"listType\\\\\\\"：列表类型，取值：\\\\\\\"ul\\\\\\\"（无序）、\\\\\\\"ol\\\\\\\"（有序）。\\\\n• \\\\\\\"listStyle\\\\\\\"：列表样式，如 \\\\\\\"disc\\\\\\\"、\\\\\\\"decimal\\\\\\\"、\\\\\\\"circle\\\\\\\"、\\\\\\\"square\\\\\\\"、\\\\\\\"checkbox\\\\\\\"。\\\\n• \\\\\\\"trList\\\\\\\"、\\\\\\\"colgroup\\\\\\\"：表格行列定义，仅用于 \\\\\\\"table\\\\\\\"。\\\\n• 样式字段：\\\\\\\"font\\\\\\\"、\\\\\\\"size\\\\\\\"、\\\\\\\"bold\\\\\\\"、\\\\\\\"color\\\\\\\"、\\\\\\\"italic\\\\\\\"、\\\\\\\"highlight\\\\\\\"、\\\\\\\"underline\\\\\\\"、\\\\\\\"strikeout\\\\\\\"。\\\\n• \\\\\\\"dashArray\\\\\\\"：用于 \\\\\\\"separator\\\\\\\"。\\\\n• 其他样式字段：\\\\\\\"rowFlex\\\\\\\"（\\\\\\\"left\\\\\\\"、\\\\\\\"center\\\\\\\"、\\\\\\\"right\\\\\\\"、\\\\\\\"alignment\\\\\\\"）、\\\\\\\"backgroundColor\\\\\\\"、\\\\\\\"verticalAlign\\\\\\\"、\\\\\\\"textDecoration\\\\\\\"。\\\\n- 当 type = \\\\\\\"title\\\\\\\" 时，\\\\\\\"value\\\\\\\" 必须以 \\\\\\\"\\\\\\\\n\\\\\\\" 结尾。\\\\n- 主动换行请使用 `{ \\\\\\\"type\\\\\\\": \\\\\\\"\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"\\\\\\\\n\\\\\\\" }`，不同对象之间不会自动换行。\\\\n- 所有键名和字符串必须使用英文双引号 `\\\\\\\"`。\\\\n\\\\n\\\\n输出必须严格是 JSON 数组，例如：\\\\n[\\\\n{\\\\n\\\\\\\"type\\\\\\\": \\\\\\\"title\\\\\\\",\\\\n\\\\\\\"level\\\\\\\": \\\\\\\"first\\\\\\\",\\\\n\\\\\\\"valueList\\\\\\\": [{ \\\\\\\"value\\\\\\\": \\\\\\\"主标题示例\\\\\\\\n\\\\\\\", \\\\\\\"font\\\\\\\": \\\\\\\"微软雅黑\\\\\\\", \\\\\\\"size\\\\\\\": 26, \\\\\\\"bold\\\\\\\": true, \\\\\\\"rowFlex\\\\\\\": \\\\\\\"center\\\\\\\" }]\\\\n},\\\\n{ \\\\\\\"type\\\\\\\": \\\\\\\"\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"普通文本内容示例\\\\\\\" },\\\\n{\\\\n\\\\\\\"type\\\\\\\": \\\\\\\"list\\\\\\\",\\\\n\\\\\\\"listType\\\\\\\": \\\\\\\"ul\\\\\\\",\\\\n\\\\\\\"listStyle\\\\\\\": \\\\\\\"disc\\\\\\\",\\\\n\\\\\\\"valueList\\\\\\\": [\\\\n{ \\\\\\\"value\\\\\\\": \\\\\\\"列表项1\\\\\\\" },\\\\n{ \\\\\\\"value\\\\\\\": \\\\\\\"列表项2\\\\\\\" }\\\\n]\\\\n}\\\\n]\\\\n\\\\n\\\\n执行步骤：\\\\n1. 根据用户需求生成json数据\\\\n2. 检查生产的json数据是否正确。如果正常，输出给用户；否则重新生成。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"请根据以上字段和示例，生成一个完整的个人简历文档 JSON。\\\\n- 至少包含基础信息、个人优势、工作经历、项目经理、教育经历等模块。\\\\n- 若基础数据不足，可以适当生成参考数据。\\\\n- 用户信息如下：\\\\n基础资料：{{base}}\\\\n简介：{{profile}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"profile\\\",\\\"name\\\":\\\"base\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"profile\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"215735188368998400\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1577,\\\"y\\\":354,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"215740280715427840\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"215740280715427840\\\",\\\"type\\\":\\\"enhanceJava\\\",\\\"x\\\":1156,\\\"y\\\":352,\\\"properties\\\":{\\\"text\\\":\\\"Java 增强\\\",\\\"options\\\":{\\\"enhance\\\":{\\\"type\\\":\\\"spring\\\",\\\"path\\\":\\\"jeecgDemoAiWordGen\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"215734195065536512\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"215734195073925120\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"215734195065536512\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"215734195065536512_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":389},{\\\"x\\\":566,\\\"y\\\":389},{\\\"x\\\":473,\\\"y\\\":347},{\\\"x\\\":573,\\\"y\\\":347}]},{\\\"id\\\":\\\"215740280719622144\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"215734195065536512\\\",\\\"targetNodeId\\\":\\\"215740280715427840\\\",\\\"sourceAnchorId\\\":\\\"215734195065536512_output\\\",\\\"targetAnchorId\\\":\\\"215740280715427840_input\\\",\\\"pointsList\\\":[{\\\"x\\\":905,\\\"y\\\":347},{\\\"x\\\":1005,\\\"y\\\":347},{\\\"x\\\":890,\\\"y\\\":293},{\\\"x\\\":990,\\\"y\\\":293}]},{\\\"id\\\":\\\"215740398487289856\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"215740280715427840\\\",\\\"targetNodeId\\\":\\\"215735188368998400\\\",\\\"sourceAnchorId\\\":\\\"215740280715427840_output\\\",\\\"targetAnchorId\\\":\\\"215735188368998400_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1322,\\\"y\\\":293},{\\\"x\\\":1422,\\\"y\\\":293},{\\\"x\\\":1311,\\\"y\\\":328},{\\\"x\\\":1411,\\\"y\\\":328}]}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"215740280715427840\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"个人简介\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"profile\\\",\\\"name\\\":\\\"基础信息\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"}]}' WHERE `id` = '1952634605517447170';\n\n-- ---author:chenrui---date:20250828-----for:【QQYUN-13449】 AI加使用辅助引导（目前有这功能，用户也不会用）\nUPDATE `airag_flow` SET `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'173365501230346240\\')).to(\\n        THEN(\\n            llm.tag(\\'172956395755208704\\'),\\n            end.tag(\\'172957153284259840\\')\\n        ).tag(\\\"172956395755208704\\\"),\\n        THEN(\\n            llm.tag(\\'173365800833675264\\'),\\n            end.tag(\\'173366253646540800\\')\\n        ).tag(\\\"173365800833675264\\\"),\\n        end.tag(\\'173366439085109248\\'),\\n        THEN(\\n            llm.tag(\\'175149164433014784\\'),\\n            end.tag(\\'175153953988444160\\')\\n        ).tag(\\\"175149164433014784\\\"),\\n        THEN(\\n            llm.tag(\\'175505963485245440\\'),\\n            end.tag(\\'175506006644633600\\')\\n        ).tag(\\\"175505963485245440\\\"),\\n        THEN(\\n            llm.tag(\\'175807569594040320\\'),\\n            end.tag(\\'175808663015538688\\')\\n        ).tag(\\\"175807569594040320\\\"),\\n        THEN(\\n            llm.tag(\\'221504502491222016\\'),\\n            end.tag(\\'221512800426758144\\')\\n        ).tag(\\\"221504502491222016\\\"),\\n        THEN(\\n            llm.tag(\\'223992240450801664\\'),\\n            end.tag(\\'223993058876952576\\')\\n        ).tag(\\\"223992240450801664\\\")\\n    ).tag(\\'173365501230346240\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":262,\\\"y\\\":458,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"表结构\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"dbtype\\\",\\\"name\\\":\\\"数据库类型\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"bizType\\\",\\\"name\\\":\\\"业务类型\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"172956395755208704\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1166,\\\"y\\\":160,\\\"properties\\\":{\\\"text\\\":\\\"生成sql\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：SQL生成助手\\\\n你是一个专业的SQL语句生成工具，能够根据用户提供的描述和表结构自动生成高效的SQL查询语句。\\\\n\\\\n## 目标：\\\\n- 根据用户的描述生成准确的SQL查询语句。\\\\n\\\\n## 技能：\\\\n1. 理解用户提供的需求和表结构。\\\\n2. 自动构建符合SQL语法的查询语句。\\\\n3. 优化生成的SQL以提高执行效率。\\\\n\\\\n## 工作流：\\\\n1. 接收用户描述和表结构信息。\\\\n2. 分析用户需求，确定所需的SQL操作类型（如查询、插入、更新、删除）。\\\\n3. 根据分析结果生成相应的SQL语句。\\\\n\\\\n## 输出格式：\\\\n- 生成的SQL语句应为标准格式，如：SELECT * FROM table_name ;\\\\n- 将输出的SQL语句格式化\\\\n- 只输出sql语句，不要额外解释，不要md语法，不要换行符，不要有sql注释。\\\\n\\\\n## 限制：\\\\n\\\\n- 除非明确说明，否则不要生成查询条件\\\\n- 确保生成的SQL语句符合数据库的语法要求，确保sql能直接执行。\\\\n- 确保字段和表能正确对应。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"表结构：\\\\n{{ddl}}\\\\n---------\\\\n数据库类型：\\\\n{{dbtype}}\\\\n----------\\\\n需求：\\\\n{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"dbtype\\\",\\\"name\\\":\\\"dbtype\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"172957153284259840\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":129,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"sql\\\",\\\"nodeId\\\":\\\"172956395755208704\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"173365501230346240\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":688,\\\"y\\\":575,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"genSql\\\"}],\\\"next\\\":\\\"172956395755208704\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"genJsonRows\\\"}],\\\"next\\\":\\\"173365800833675264\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"chooseTables\\\"}],\\\"next\\\":\\\"175149164433014784\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"genChart\\\"}],\\\"next\\\":\\\"175505963485245440\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"intentCheck\\\"}],\\\"next\\\":\\\"175807569594040320\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"designReport\\\"}],\\\"next\\\":\\\"221504502491222016\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"bizType\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"genPrompt\\\"}],\\\"next\\\":\\\"223992240450801664\\\"}],\\\"else\\\":{\\\"next\\\":\\\"173366439085109248\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"height\\\":274,\\\"width\\\":332}},{\\\"id\\\":\\\"173365800833675264\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1167,\\\"y\\\":368,\\\"properties\\\":{\\\"text\\\":\\\"生成rows\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你是一个 **“在线报表 JSON 生成器”**，能够理解用户描述及数据集，并生成符合规范的 **合法 JSON**。  \\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 工作流程\\\\n\\\\n\\\\n### 步骤一：数据集选择  \\\\n1. 读取用户提供的数据集结构。  \\\\n2. 根据需求从中选定一个数据集。  \\\\n3. 后续只能使用选定数据集的字段。  \\\\n\\\\n\\\\n### 步骤二：报表设计  \\\\n根据用户需求与数据集，输出报表的结构信息：  \\\\n- 行号、列号（从0开始）  \\\\n- 单元格内容（文字或数据集占位符）  \\\\n- 单元格样式（引用样式索引）  \\\\n- 合并单元格信息  \\\\n\\\\n\\\\n### 步骤三：生成报表 JSON  \\\\n使用步骤二的描述生成完整 JSON。  \\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 输出要求\\\\n1. **输出必须是合法 JSON**，能直接 `JSON.parse()`。  \\\\n2. 必须包含以下部分：  \\\\n   - `\\\\\\\"styles\\\\\\\"`：样式数组，每种样式单独定义，在单元格中用索引引用。  \\\\n   - `\\\\\\\"merges\\\\\\\"`：合并单元格范围（如 `\\\\\\\"D3:E4\\\\\\\"`）。  \\\\n   - `\\\\\\\"rows\\\\\\\"`：行数据，每行包含 `cells`，每个 `cell` 可有：  \\\\n     - `\\\\\\\"text\\\\\\\"`：文字或占位符（`${}` 对象，`#{}` 集合）  \\\\n     - `\\\\\\\"style\\\\\\\"`：引用 `styles` 索引  \\\\n     - `\\\\\\\"merge\\\\\\\"`：合并范围 `[纵向合并格数, 横向合并格数]`  \\\\n     - `\\\\\\\"height\\\\\\\"`：行高  \\\\n   - `\\\\\\\"cols\\\\\\\"`：列宽配置  \\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 样式规则\\\\n- 样式在 `\\\\\\\"styles\\\\\\\"` 中定义：  \\\\n  - `font`：字体\\\\n    - `bold`: 是否加粗（如：`true`）\\\\n    - `italic`: 是否斜体（如：`true`）\\\\n    - `size`: 字体大小单位pt,默认10\\\\n  - `underline`: 下划线（如：`true`）\\\\n  - `strike`: 删除线（如：`true`）\\\\n  - `color`（字体颜色）  \\\\n  - `bgcolor`（背景色）  \\\\n  - `align`（left/center/right）  \\\\n  - `valign`（top/middle/bottom）  \\\\n  - `textwrap`（自动换行）  \\\\n  - `border`\\\\n    - `top`：上边框（如 `[\\\\\\\"thin\\\\\\\",\\\\\\\"#000\\\\\\\"]`）  \\\\n    - `bottom`：下边框（如 `[\\\\\\\"thin\\\\\\\",\\\\\\\"#000\\\\\\\"]`）  \\\\n    - `left`：左边框（如 `[\\\\\\\"thin\\\\\\\",\\\\\\\"#000\\\\\\\"]`）  \\\\n    - `right`：右边框（如 `[\\\\\\\"thin\\\\\\\",\\\\\\\"#000\\\\\\\"]`）  \\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 数据集规则\\\\n示例：\\\\n```json\\\\n{\\\\n  \\\\\\\"code\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n  \\\\\\\"title\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n  \\\\\\\"isList\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n  \\\\\\\"children\\\\\\\": [\\\\n    { \\\\\\\"title\\\\\\\": \\\\\\\"total_sales\\\\\\\", \\\\\\\"fieldText\\\\\\\": \\\\\\\"总销量\\\\\\\" },\\\\n    { \\\\\\\"title\\\\\\\": \\\\\\\"total_returns\\\\\\\", \\\\\\\"fieldText\\\\\\\": \\\\\\\"总退货数量\\\\\\\" }\\\\n  ]\\\\n}\\\\n```\\\\n- `code`：数据集变量名  \\\\n- `isList = 1`：集合  \\\\n- `isList = 0`：对象  \\\\n- `children`：字段，含 `title`（字段名）、`fieldText`（展示名）  \\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 行列与填充规则\\\\n- 行号、列号从0开始。  \\\\n- `\\\\\\\"cols\\\\\\\"` 设置列宽。  \\\\n- **集合 (`isList=1`)**：  \\\\n  - 一行字段标题（children.fieldText）  \\\\n  - 下一行字段占位符（`#{code.title}`）  \\\\n- **对象 (`isList=0`)**：  \\\\n  - 每字段占两列：左列为标题，右列为占位符 `${code.title}`  \\\\n  - 可按组横向排列  \\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 合并规则\\\\n- `\\\\\\\"merge\\\\\\\": [纵向合并格数, 横向合并格数]`  \\\\n  - 纵向合并格数与横向合并格数是不包含当前单元格的数量（如 纵向合并格数 等于1 就是向下合并一行；横向合并格数同理）\\\\n- 被合并覆盖的单元格无需再定义  \\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 特别说明\\\\n- JSON 必须 **纯净**：无注释、无 markdown、无省略号。  \\\\n- 用户指定的样式不能改动，可在此基础上做美化。\\\\n- 除非用户明确要求，默认都对生成的报表做基础美化（如增加边框、设置字体、设置背景色）\\\\n- 用户描述的行列序号需 **减一** 转换为下标。  \\\\n- 仅生成一份报表 JSON。  \\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 示例\\\\n```json\\\\n{\\\\n  \\\\\\\"styles\\\\\\\": [\\\\n    { \\\\\\\"font\\\\\\\": { \\\\\\\"bold\\\\\\\": true } },\\\\n    { \\\\\\\"color\\\\\\\": \\\\\\\"#ff0000\\\\\\\" }\\\\n  ],\\\\n  \\\\\\\"rows\\\\\\\": {\\\\n    \\\\\\\"0\\\\\\\": {\\\\n      \\\\\\\"cells\\\\\\\": {\\\\n        \\\\\\\"0\\\\\\\": { \\\\\\\"text\\\\\\\": \\\\\\\"加粗文字\\\\\\\", \\\\\\\"style\\\\\\\": 0 },\\\\n        \\\\\\\"1\\\\\\\": { \\\\\\\"text\\\\\\\": \\\\\\\"红色文字\\\\\\\", \\\\\\\"style\\\\\\\": 1 },\\\\n        \\\\\\\"2\\\\\\\": { \\\\\\\"text\\\\\\\": \\\\\\\"${dbKey.dbField}\\\\\\\", \\\\\\\"style\\\\\\\": 1 }\\\\n      }\\\\n    }\\\\n  },\\\\n  \\\\\\\"cols\\\\\\\": {\\\\n    \\\\\\\"1\\\\\\\": { \\\\\\\"width\\\\\\\": 100 }\\\\n  },\\\\n  \\\\\\\"merges\\\\\\\": [\\\\\\\"A1:B1\\\\\\\"]\\\\n}\\\\n```\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"用户数据集：\\\\n{{ddl}}\\\\n用户需求：\\\\n{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"173366253646540800\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":336,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"designJson\\\",\\\"nodeId\\\":\\\"173365800833675264\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"173366439085109248\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1166,\\\"y\\\":1662,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"error:选择正确的业务类型\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"175149164433014784\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1164,\\\"y\\\":598,\\\"properties\\\":{\\\"text\\\":\\\"选择表\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":2,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"## 任务\\\\n根据用户需求，从下方数据库表列表中选择所有关联的表名称。\\\\n\\\\n\\\\n## 数据库表列表（格式：表名 | 注释）\\\\n{{ddl}}\\\\n\\\\n## 输出规则\\\\n1. 严格按JSON数组格式输出，例如：[\\\\\\\"order\\\\\\\"]。\\\\n2. 仅包含表名称，无需注释。\\\\n3. **禁止添加列表外的表**。\\\\n4. 表的选择范围可以适当大一些。\\\\n4. 无业务相关性时输出空数组：[]\\\\n\\\\n\\\\n请回复纯JSON，不要包含其他内容。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"用户需求：{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"175153953988444160\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":564,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"tables\\\",\\\"nodeId\\\":\\\"175149164433014784\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"175505963485245440\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1166,\\\"y\\\":802,\\\"properties\\\":{\\\"text\\\":\\\"生成图表\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"根据以下数据以及用户需求生成符合格式要求的图表数据。\\\\n\\\\n\\\\n## 工作流程：\\\\n\\\\n\\\\n1. 根据用户需求选择一个合适的数据集\\\\n2. 根据数据集和需求，从图表列表中选择一个合适的图标类型。\\\\n3. 组装最终输出的json\\\\n\\\\n\\\\n⸻\\\\n## 可选的图表如下（标识|描述）：\\\\n\\\\n\\\\n- 1维图表\\\\n  - bar.simple|普通柱形图\\\\n  - bar.background|带背景柱形图\\\\n  - bar.horizontal|横向柱形图\\\\n  - line.simple|普通折线图\\\\n  - line.area|面积堆积折线图\\\\n  - line.smooth|平滑曲线折线图\\\\n  - line.step|阶梯折线图\\\\n  - pie.simple|普通饼图\\\\n  - pie.doughnut|环状饼图\\\\n  - pie.rose|南丁格尔玫瑰饼图\\\\n  - scatter.simple|普通散点图\\\\n  - funnel.simple|普通漏斗图\\\\n  - funnel.pyramid|金字塔漏斗图\\\\n  - pictorial.spirits|普通象形图\\\\n  - map.scatter|点地图\\\\n  - gauge.simple|360°仪表盘\\\\n  - gauge.simple180|180°仪表盘\\\\n- 2维\\\\n  - bar.multi|多数据对比柱形图\\\\n  - bar.negative|正负条形图\\\\n  - bar.stack|堆叠柱形图\\\\n  - bar.stack.horizontal|堆叠条形图\\\\n  - bar.multi.horizontal|多数据条形柱状图\\\\n  - line.multi|多数据对比折线图\\\\n  - mixed.linebar|普通折柱图\\\\n  - scatter.bubble|气泡散点图\\\\n  - radar.basic|普通雷达图\\\\n  - radar.custom|圆形雷达图\\\\n⸻\\\\n## 数据集格式说明：\\\\n```\\\\n{\\\\n \\\\\\\"dbId\\\\\\\": \\\\\\\"1069915169263800320\\\\\\\",\\\\n \\\\\\\"code\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n \\\\\\\"title\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n \\\\\\\"isList\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n \\\\\\\"type\\\\\\\": \\\\\\\"0\\\\\\\",\\\\n \\\\\\\"children\\\\\\\": [\\\\n  {\\\\n   \\\\\\\"title\\\\\\\": \\\\\\\"total_sales\\\\\\\",\\\\n   \\\\\\\"fieldText\\\\\\\": \\\\\\\"total_sales\\\\\\\"\\\\n  },\\\\n  {\\\\n   \\\\\\\"title\\\\\\\": \\\\\\\"total_returns\\\\\\\",\\\\n   \\\\\\\"fieldText\\\\\\\": \\\\\\\"total_returns\\\\\\\"\\\\n  }\\\\n ]\\\\n}\\\\n```\\\\n* code：数据集变量名\\\\n* isList：为”1”表示集合，“0”表示对象\\\\n* children：为字段列表，包含title（字段名）和fieldText（展示名）\\\\n* type：0|sql,1|api,2|code,3|json\\\\n⸻\\\\n## 输出json格式\\\\n{\\\\n  \\\\\\\"dataType\\\\\\\": \\\\\\\"sql\\\\\\\",\\\\n  \\\\\\\"apiStatus\\\\\\\": \\\\\\\"0\\\\\\\",\\\\n  \\\\\\\"apiUrl\\\\\\\": \\\\\\\"\\\\\\\",\\\\n  \\\\\\\"dataId\\\\\\\": \\\\\\\"1069898455939633152\\\\\\\",\\\\n  \\\\\\\"axisX\\\\\\\": \\\\\\\"supplier_name\\\\\\\",\\\\n  \\\\\\\"axisY\\\\\\\": \\\\\\\"total_returns\\\\\\\",\\\\n  \\\\\\\"series\\\\\\\": \\\\\\\"material_name\\\\\\\",\\\\n  \\\\\\\"yText\\\\\\\": \\\\\\\"total_returns\\\\\\\",\\\\n  \\\\\\\"xText\\\\\\\": \\\\\\\"supplier_name\\\\\\\",\\\\n  \\\\\\\"dbCode\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n  \\\\\\\"isCustomPropName\\\\\\\": false,\\\\n  \\\\\\\"chartType\\\\\\\": \\\\\\\"line.multi\\\\\\\",\\\\n  \\\\\\\"id\\\\\\\": \\\\\\\"0aGl4PUfbIfy8BMF\\\\\\\",\\\\n  \\\\\\\"run\\\\\\\": 1,\\\\n  \\\\\\\"title\\\\\\\": \\\\\\\"\\\\\\\",\\\\n}\\\\n* dataType：与数据集type对应(0|sql,1|api,2|code,3|json)\\\\n* dataId：对应数据集dbId\\\\n* dbCode：对应数据集的code\\\\n* axisX：分类属性，从数据集字段中取值（fieldText)\\\\n* axisY：值属性，从数据集字段中取值（fieldText)\\\\n* series: 系列，从数据集字段中取值（fieldText）\\\\n* xText：分类属性显示，从数据集字段中取值（title)\\\\n* yText：值属性显示，从数据集字段中取值（title)\\\\n* chartType：图表的标识\\\\n* title：为这个图表起一个标题\\\\n* isCustomPropName: 如果是api数据集,该值为true\\\\n* apiStatus: 如果是api数据集则等于\\\\\\\"1\\\\\\\"，否则\\\\\\\"0\\\\\\\"\\\\n\\\\n\\\\n## 输出格式\\\\n* 直接返回JSON数据，不要解释，不要md语法，不要换行符，不要有注释。\\\\n* 确保输出的json格式正确完整。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"## 用户数据集：\\\\n{{ddl}}\\\\n## 用户需求：\\\\n{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"175506006644633600\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":769,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"chart\\\",\\\"nodeId\\\":\\\"175505963485245440\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"175807569594040320\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1166,\\\"y\\\":1018,\\\"properties\\\":{\\\"text\\\":\\\"意图识别\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你是一个“在线报表的需求分析器”，能够理解用户的需求输入，\\\\n\\\\n请根据用户需求与提供的数据集设计，综合判断应执行的工作流步骤，并为每个步骤调整需求描述，同时选择最合适的数据集。  \\\\n\\\\n\\\\n\\\\n\\\\n## 可选步骤（格式：标识 | 功能说明）\\\\n\\\\n- `genJsonRows` | 生成报表（可选，根据用户的需求描述和数据集设计生成合适的报表设计）\\\\n\\\\n- `genChart` | 生成图表（可选，根据用户的需求描述和数据集设计生成合适的图表数据）\\\\n\\\\n> **注意：** 至少选择一个步骤，亦可同时选择两者；图表的权重较低。\\\\n\\\\n\\\\n\\\\n\\\\n## 数据集格式\\\\n\\\\n```\\\\n\\\\n{\\\\n\\\\n\\\\\\\"dbId\\\\\\\": \\\\\\\"1069915169263800320\\\\\\\",\\\\n\\\\n\\\\\\\"code\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n\\\\n\\\\\\\"title\\\\\\\": \\\\\\\"a\\\\\\\",\\\\n\\\\n\\\\\\\"isList\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n\\\\n\\\\\\\"type\\\\\\\": \\\\\\\"0\\\\\\\",\\\\n\\\\n\\\\\\\"children\\\\\\\": [\\\\n\\\\n{\\\\n\\\\n\\\\\\\"title\\\\\\\": \\\\\\\"total_sales\\\\\\\",\\\\n\\\\n\\\\\\\"fieldText\\\\\\\": \\\\\\\"total_sales\\\\\\\"\\\\n\\\\n},\\\\n\\\\n{\\\\n\\\\n\\\\\\\"title\\\\\\\": \\\\\\\"total_returns\\\\\\\",\\\\n\\\\n\\\\\\\"fieldText\\\\\\\": \\\\\\\"total_returns\\\\\\\"\\\\n\\\\n}\\\\n\\\\n]\\\\n\\\\n}\\\\n\\\\n```\\\\n\\\\n* `code`：数据集变量名\\\\n\\\\n* `isList`：为”1”表示集合，“0”表示对象\\\\n\\\\n* `children`：为字段列表，包含title（展示名）和fieldText（字段名）\\\\n\\\\n* `type`：0|sql,1|api,2|code,3|json\\\\n\\\\n\\\\n\\\\n\\\\n## 输出格式\\\\n\\\\n步骤标识1|需求描述1|数据集code,步骤标识2|需求描述2|数据集code  \\\\n\\\\n* 各步骤之间用英文逗号,分隔  \\\\n\\\\n* 不得添加额外说明，不要md语法，不要换行符，不要有注释。\\\\n\\\\n\\\\n\\\\n\\\\n## 注意：\\\\n\\\\n- 在生成需求描述时，应确保不丢失原有需求的全部内容，只是并针对所选步骤微调。\\\\n\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"## 用户数据集：\\\\n{{ddl}}\\\\n## 用户需求：\\\\n{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"175808663015538688\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":985,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"intent\\\",\\\"nodeId\\\":\\\"175807569594040320\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"221504502491222016\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1166,\\\"y\\\":1237,\\\"properties\\\":{\\\"text\\\":\\\"生成excel设计\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你是一个“在线Excel JSON生成器”，能够理解用户描述并生成符合规范的 JSON。  \\\\n**严格规则**：\\\\n1. 只能根据描述生成 JSON。\\\\n2. JSON 必须合法，可被 `JSON.parse()` 正确解析。\\\\n3. JSON 中不可以有注释\\\\n\\\\n\\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n\\\\n\\\\n## 步骤一：理解用户的描述，并生成单元格描述信息\\\\n   - 行号、列号\\\\n   - 单元格文字\\\\n   - 单元格样式（字体加粗、斜体、大小、颜色、背景色、水平/垂直对齐、自动换行、边框）\\\\n   - 合并单元格信息\\\\n\\\\n\\\\n\\\\n\\\\n⸻\\\\n\\\\n\\\\n\\\\n\\\\n## 步骤二：使用步骤一种生成的描述信息，生成完整在线Excel JSON\\\\n### 输出要求\\\\n- 输出必须是 **合法 JSON**，且能直接被 `JSON.parse()` 正确解析。  \\\\n- JSON 的结构必须包含以下部分：  \\\\n  - `\\\\\\\"styles\\\\\\\"`：样式数组，每个元素对应一种样式（如字体加粗、字体颜色、边框等），并在单元格里通过 `style` 字段引用  \\\\n  - `\\\\\\\"merges\\\\\\\"`：合并单元格区域（如 `\\\\\\\"D3:E4\\\\\\\"`）  \\\\n  - `\\\\\\\"rows\\\\\\\"`：行数据，每一行包含 `cells`，每个 `cell` 可包含：\\\\n    - `\\\\\\\"text\\\\\\\"`：单元格文字  \\\\n    - `\\\\\\\"style\\\\\\\"`：引用 `styles` 数组中的下标  \\\\n    - `\\\\\\\"merge\\\\\\\"`：若为合并单元格，标注合并范围 示例[1,2]:下标[0]纵向合并1格,下标[1]横向合并2格，\\\\n    - `\\\\\\\"height\\\\\\\"`：行高  \\\\n    - `\\\\\\\"width\\\\\\\"`：列宽（放在 `\\\\\\\"cols\\\\\\\"` 部分）  \\\\n  - `\\\\\\\"cols\\\\\\\"`：列宽配置  \\\\n\\\\n\\\\n\\\\n\\\\n### 样式规则\\\\n- 样式在 `\\\\\\\"styles\\\\\\\"` 中定义：  \\\\n  - `font`：字体\\\\n    - `bold`: 是否加粗（如：`true`）\\\\n    - `italic`: 是否斜体（如：`true`）\\\\n    - `size`: 字体大小单位pt,默认10\\\\n  - `underline`: 下划线（如：`true`）\\\\n  - `strike`: 删除线（如：`true`）\\\\n  - `color`（字体颜色）  \\\\n  - `bgcolor`（背景色）  \\\\n  - `align`（left/center/right）  \\\\n  - `valign`（top/middle/bottom）  \\\\n  - `textwrap`（自动换行）  \\\\n  - `border`\\\\n    - `top`：上边框（如 `[\\\\\\\"thin\\\\\\\",\\\\\\\"#000\\\\\\\"]`）  \\\\n    - `bottom`：下边框（如 `[\\\\\\\"thin\\\\\\\",\\\\\\\"#000\\\\\\\"]`）  \\\\n    - `left`：左边框（如 `[\\\\\\\"thin\\\\\\\",\\\\\\\"#000\\\\\\\"]`）  \\\\n    - `right`：右边框（如 `[\\\\\\\"thin\\\\\\\",\\\\\\\"#000\\\\\\\"]`）  \\\\n\\\\n\\\\n\\\\n\\\\n### 行列规则\\\\n- `\\\\\\\"rows\\\\\\\"` 中的 key 是行号（从 0 开始）  \\\\n- `\\\\\\\"cells\\\\\\\"` 中的 key 是列号（从 0 开始）  \\\\n- 可指定 `\\\\\\\"height\\\\\\\"` 设置行高  \\\\n- `\\\\\\\"cols\\\\\\\"` 中的 key 是列号，值包含 `\\\\\\\"width\\\\\\\"` 设置列宽  \\\\n\\\\n\\\\n\\\\n\\\\n## 合并规则\\\\n- `\\\\\\\"merge\\\\\\\": [纵向合并格数, 横向合并格数]`  \\\\n  - 纵向合并格数与横向合并格数是不包含当前单元格的数量（如 纵向合并格数 等于1 就是向下合并一行；横向合并格数同理）\\\\n- 被合并覆盖的单元格无需再定义  \\\\n\\\\n\\\\n\\\\n\\\\n## 示例\\\\n（简化示例）\\\\n\\\\n\\\\n\\\\n\\\\n```json\\\\n{\\\\n  \\\\\\\"styles\\\\\\\": [\\\\n    { \\\\\\\"font\\\\\\\": { \\\\\\\"bold\\\\\\\": true } },\\\\n    { \\\\\\\"color\\\\\\\": \\\\\\\"#ff0000\\\\\\\" }\\\\n  ],\\\\n  \\\\\\\"rows\\\\\\\": {\\\\n    \\\\\\\"0\\\\\\\": {\\\\n      \\\\\\\"cells\\\\\\\": {\\\\n        \\\\\\\"0\\\\\\\": { \\\\\\\"text\\\\\\\": \\\\\\\"加粗文字\\\\\\\", \\\\\\\"style\\\\\\\": 0 },\\\\n        \\\\\\\"1\\\\\\\": { \\\\\\\"text\\\\\\\": \\\\\\\"红色文字\\\\\\\", \\\\\\\"style\\\\\\\": 1 }\\\\n      }\\\\n    }\\\\n  },\\\\n  \\\\\\\"cols\\\\\\\": {\\\\n    \\\\\\\"1\\\\\\\": { \\\\\\\"width\\\\\\\": 100 }\\\\n  },\\\\n  \\\\\\\"merges\\\\\\\": [\\\\\\\"A1:B1\\\\\\\"],\\\\n}\\\\n\\\\n\\\\n\\\\n\\\\n## 特别说明\\\\n- JSON 必须 **纯净**：无注释、无 markdown、无省略号。  \\\\n- 用户指定的样式不能改动，可在此基础上做美化。\\\\n- 除非用户明确要求，默认都对生成的报表做基础美化（如增加边框、设置字体、设置背景色）\\\\n- 用户描述的行列序号需 **减一** 转换为下标。  \\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"理解用户需求，并按要求生成json数据。\\\\n用户需求如下：\\\\n{{question}}\\\\n\\\\n\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"221512800426758144\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1643,\\\"y\\\":1201,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"designJson\\\",\\\"nodeId\\\":\\\"221504502491222016\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"223992240450801664\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1166,\\\"y\\\":1441,\\\"properties\\\":{\\\"text\\\":\\\"提示词生成\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 报表生成提示词优化器\\\\n\\\\n\\\\n## 目标\\\\n\\\\n\\\\n根据用户输入的需求和数据集定义，自动生成简洁、明确的用户 message。\\\\n系统会自动带上数据集定义，因此无需包含数据集定义内容。\\\\n\\\\n\\\\n## 工作流程\\\\n\\\\n\\\\n### 步骤一：理解需求与数据集\\\\n\\\\n\\\\n- 从用户的自然语言需求和数据集定义中，提取**业务方向**。\\\\n- 业务方向示例：\\\\n    - 个人简历\\\\n    - 项目报价\\\\n    - 数据统计\\\\n    - 财务报表\\\\n    - 产品清单\\\\n\\\\n\\\\n### 步骤二：扩展提示词\\\\n\\\\n\\\\n- 针对识别出的业务方向，扩展提示词，使其更贴合业务场景。\\\\n- 示例：\\\\n    如果用户需求是\\\\\\\"生成一份个人简历\\\\\\\"，则扩展提示词为：\\\\n    \\\\\\\"请基于数据集生成个人简历模版，突出教育背景、工作经历和技能展示。\\\\\\\"\\\\n\\\\n\\\\n### 步骤三：生成用户 message\\\\n\\\\n\\\\n- 输出最终的用户 message，不包含系统提示词，不包含数据集定义。\\\\n- 要求：\\\\n    - 保留用户需求的原意。\\\\n    - 优化表达，使 AI 更好地理解并执行任务。\\\\n    - 根据业务方向，附加必要的模版说明。\\\\n    - 提示词结构最好包含：\\\\n        - 主要需求：用户的主要需求，比如：生成一个用于软件产品的报价表。\\\\n        - 结构要求：对于生成的内容的要求\\\\n        - 样式要求：对样式的整体和细节的要求，比如：整体排版美观、标题使用16号字。\\\\n\\\\n\\\\n#### 输出示例：\\\\n\\\\n\\\\n```\\\\n生成一个 **员工薪资报表**，要求如下：  \\\\n\\\\n\\\\n1. **数据内容**  \\\\n   - 报表需要展示以下信息：员工姓名、性别、生日、联系电话、薪资。  \\\\n\\\\n\\\\n2. **样式要求**  \\\\n   - 添加一个醒目的报表标题，字体16号。  \\\\n   - 标题行使用蓝色背景，并且字体加粗。  \\\\n   - 数据行保持清晰整齐，便于阅读。  \\\\n\\\\n\\\\n3. **输出要求**  \\\\n   - 表格内容规范，排版美观，符合员工薪资报表的格式。 \\\\n```\\\\n\\\\n\\\\n\\\\n\\\\n## 输出要求\\\\n\\\\n\\\\n- 最终输出为简洁明了的用户 message。\\\\n- 不限定关键词和字段，完全根据需求和数据集定义生成。\\\\n- 控制长度，不要超过500字。\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"用户需求：\\\\n{{question}}\\\\n数据集定义\\\\n{{ddl}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"ddl\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"223993058876952576\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1652,\\\"y\\\":1408,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"prompt\\\",\\\"nodeId\\\":\\\"223992240450801664\\\"}],\\\"height\\\":114,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"172957153288454144\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"172956395755208704\\\",\\\"targetNodeId\\\":\\\"172957153284259840\\\",\\\"sourceAnchorId\\\":\\\"172956395755208704_output\\\",\\\"targetAnchorId\\\":\\\"172957153284259840_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1332,\\\"y\\\":101},{\\\"x\\\":1432,\\\"y\\\":101},{\\\"x\\\":1377,\\\"y\\\":103},{\\\"x\\\":1477,\\\"y\\\":103}]},{\\\"id\\\":\\\"173365501234540544\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"173365501230346240\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"173365501230346240_input\\\",\\\"pointsList\\\":[{\\\"x\\\":428,\\\"y\\\":443},{\\\"x\\\":528,\\\"y\\\":443},{\\\"x\\\":422,\\\"y\\\":469},{\\\"x\\\":522,\\\"y\\\":469}]},{\\\"id\\\":\\\"173366253650735104\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365800833675264\\\",\\\"targetNodeId\\\":\\\"173366253646540800\\\",\\\"sourceAnchorId\\\":\\\"173365800833675264_output\\\",\\\"targetAnchorId\\\":\\\"173366253646540800_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1333,\\\"y\\\":309},{\\\"x\\\":1433,\\\"y\\\":309},{\\\"x\\\":1377,\\\"y\\\":310},{\\\"x\\\":1477,\\\"y\\\":310}]},{\\\"id\\\":\\\"173372961415852032\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"172956395755208704\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_source_if\\\",\\\"targetAnchorId\\\":\\\"172956395755208704_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":503},{\\\"x\\\":954,\\\"y\\\":503},{\\\"x\\\":900,\\\"y\\\":101},{\\\"x\\\":1000,\\\"y\\\":101}]},{\\\"id\\\":\\\"173372967073968128\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"173365800833675264\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_2\\\",\\\"targetAnchorId\\\":\\\"173365800833675264_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":529},{\\\"x\\\":954,\\\"y\\\":529},{\\\"x\\\":901,\\\"y\\\":309},{\\\"x\\\":1001,\\\"y\\\":309}]},{\\\"id\\\":\\\"173372974988619776\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"173366439085109248\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_source_else\\\",\\\"targetAnchorId\\\":\\\"173366439085109248_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":685},{\\\"x\\\":954,\\\"y\\\":685},{\\\"x\\\":900,\\\"y\\\":1636},{\\\"x\\\":1000,\\\"y\\\":1636}]},{\\\"id\\\":\\\"175149164437209088\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"175149164433014784\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_3\\\",\\\"targetAnchorId\\\":\\\"175149164433014784_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":555},{\\\"x\\\":954,\\\"y\\\":555},{\\\"x\\\":898,\\\"y\\\":539},{\\\"x\\\":998,\\\"y\\\":539}]},{\\\"id\\\":\\\"175153997969915904\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"175149164433014784\\\",\\\"targetNodeId\\\":\\\"175153953988444160\\\",\\\"sourceAnchorId\\\":\\\"175149164433014784_output\\\",\\\"targetAnchorId\\\":\\\"175153953988444160_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1330,\\\"y\\\":539},{\\\"x\\\":1430,\\\"y\\\":539},{\\\"x\\\":1377,\\\"y\\\":538},{\\\"x\\\":1477,\\\"y\\\":538}]},{\\\"id\\\":\\\"175505963489439744\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"175505963485245440\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_4\\\",\\\"targetAnchorId\\\":\\\"175505963485245440_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":581},{\\\"x\\\":954,\\\"y\\\":581},{\\\"x\\\":900,\\\"y\\\":743},{\\\"x\\\":1000,\\\"y\\\":743}]},{\\\"id\\\":\\\"175506006648827904\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"175505963485245440\\\",\\\"targetNodeId\\\":\\\"175506006644633600\\\",\\\"sourceAnchorId\\\":\\\"175505963485245440_output\\\",\\\"targetAnchorId\\\":\\\"175506006644633600_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1332,\\\"y\\\":743},{\\\"x\\\":1432,\\\"y\\\":743},{\\\"x\\\":1377,\\\"y\\\":743},{\\\"x\\\":1477,\\\"y\\\":743}]},{\\\"id\\\":\\\"175807569598234624\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"175807569594040320\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_5\\\",\\\"targetAnchorId\\\":\\\"175807569594040320_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":607},{\\\"x\\\":954,\\\"y\\\":607},{\\\"x\\\":900,\\\"y\\\":959},{\\\"x\\\":1000,\\\"y\\\":959}]},{\\\"id\\\":\\\"175808663019732992\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"175807569594040320\\\",\\\"targetNodeId\\\":\\\"175808663015538688\\\",\\\"sourceAnchorId\\\":\\\"175807569594040320_output\\\",\\\"targetAnchorId\\\":\\\"175808663015538688_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1332,\\\"y\\\":959},{\\\"x\\\":1432,\\\"y\\\":959},{\\\"x\\\":1377,\\\"y\\\":959},{\\\"x\\\":1477,\\\"y\\\":959}]},{\\\"id\\\":\\\"221512800426758145\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"221504502491222016\\\",\\\"targetNodeId\\\":\\\"221512800426758144\\\",\\\"sourceAnchorId\\\":\\\"221504502491222016_output\\\",\\\"targetAnchorId\\\":\\\"221512800426758144_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1332,\\\"y\\\":1178},{\\\"x\\\":1432,\\\"y\\\":1178},{\\\"x\\\":1377,\\\"y\\\":1175},{\\\"x\\\":1477,\\\"y\\\":1175}]},{\\\"id\\\":\\\"221534054756093952\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"221504502491222016\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_6\\\",\\\"targetAnchorId\\\":\\\"221504502491222016_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":633},{\\\"x\\\":954,\\\"y\\\":633},{\\\"x\\\":900,\\\"y\\\":1178},{\\\"x\\\":1000,\\\"y\\\":1178}]},{\\\"id\\\":\\\"223992240454995968\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"173365501230346240\\\",\\\"targetNodeId\\\":\\\"223992240450801664\\\",\\\"sourceAnchorId\\\":\\\"173365501230346240_case_7\\\",\\\"targetAnchorId\\\":\\\"223992240450801664_input\\\",\\\"pointsList\\\":[{\\\"x\\\":854,\\\"y\\\":659},{\\\"x\\\":954,\\\"y\\\":659},{\\\"x\\\":900,\\\"y\\\":1382},{\\\"x\\\":1000,\\\"y\\\":1382}]},{\\\"id\\\":\\\"223993058881146880\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"223992240450801664\\\",\\\"targetNodeId\\\":\\\"223993058876952576\\\",\\\"sourceAnchorId\\\":\\\"223992240450801664_output\\\",\\\"targetAnchorId\\\":\\\"223993058876952576_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1332,\\\"y\\\":1382},{\\\"x\\\":1432,\\\"y\\\":1382},{\\\"x\\\":1386,\\\"y\\\":1382},{\\\"x\\\":1486,\\\"y\\\":1382}]}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"prompt\\\",\\\"nodeId\\\":\\\"223992240450801664\\\"},{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"ddl\\\",\\\"name\\\":\\\"表结构\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"dbtype\\\",\\\"name\\\":\\\"数据库类型\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"bizType\\\",\\\"name\\\":\\\"业务类型\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"}]}' WHERE `id` = '1909856345692065793';\n\n-- ---author:wangshuai---date:20250902-----for:【QQYUN-13415】租户改造菜单、菜单权限及租户管理员角色升级sql\n-- 新增用户按钮权限升级sql\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1214462306546319322', '119213522910765570', '新增用户', '', '', 1, NULL, NULL, 2, 'system:user:addTenantUser', '1', 1.00, 0, NULL, 1, 0, 0, NULL, NULL, 'admin', '2020-01-07 16:22:32', NULL, NULL, 0, 0, '1', 0);\n\n-- 删除用户按钮权限\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1592114574275211345', '119213522910765570', '删除用户', NULL, NULL, 0, NULL, NULL, 2, 'system:user:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:17:49', NULL, NULL, 0, 0, '1', 0);\n\n-- 新增租户部门菜单升级sql\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1961009998209257473', '1674708136602542082', '租户部门', '/depart/TenantDepartList', 'system/depart/TenantDepartList', 1, '', NULL, 1, NULL, '0', 3.30, 0, 'ant-design:apartment-outlined', 1, 0, 0, 0, NULL, 'admin', '2025-08-28 18:16:32', 'admin', '2025-08-29 10:20:25', 0, 0, NULL, 0);\n\n-- 添加一个用户和多个套餐关系按钮权限\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1960994076329316353', '119213522910765570', '添加一个用户和多个套餐关系', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:addPacksUser', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-08-28 17:13:16', NULL, NULL, 0, 0, '1', 0);\n\n-- 新增租户套餐菜单升级sql\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1961253156897710081', '1674708136602542082', '租户套餐', '/pack/TenantCurrentPackList', 'system/tenant/pack/TenantCurrentPackList', 1, '', NULL, 1, NULL, '0', 3.40, 0, 'ant-design:read-filled', 1, 0, 0, 0, NULL, 'admin', '2025-08-29 10:22:46', 'admin', '2025-08-29 10:24:46', 0, 0, NULL, 0);\n\n-- 产品包查询列表权限升级菜单\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1609123240547344376', '1961253156897710081', '产品包分页列表查询', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:packList', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-31 17:44:11', NULL, NULL, 0, 0, '1', 0);\n\n-- 我的租户变更为叶子节点\nUPDATE `sys_permission` SET  `is_leaf` = 0 WHERE `id` = '1961253156897710081';\n\n-- 查询租户下用户按钮权限升级sql\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1600108123037913486', '1961253156897710081', '查询租户下用户', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:user:list', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-06 20:41:20', 'admin', '2023-01-11 12:10:48', 0, 0, '1', 0);\n\n-- 邀请人员加入\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1600105607009162230', '1961253156897710081', '邀请用户', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:invitation:user', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-06 20:31:20', NULL, NULL, 0, 0, '1', 0);\n\n-- 租户角色设置成非叶子节点\nUPDATE `sys_permission` SET `is_leaf` = 0 WHERE `id` = '1597419994965786625';\n\n-- 角色编辑按钮权限升级sql\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1592120372296522490', '1597419994965786625', '角色编辑', NULL, NULL, 0, NULL, NULL, 2, 'system:role:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:40:52', NULL, NULL, 0, 0, '1', 0);\n\n-- 角色添加按钮权限升级sql\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1592120323667750934', '1597419994965786625', '角色添加', NULL, NULL, 0, NULL, NULL, 2, 'system:role:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:40:40', NULL, NULL, 0, 0, '1', 0);\n\n-- 角色删除按钮权限升级sql\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1592120427223412865', '1597419994965786625', '角色删除', NULL, NULL, 0, NULL, NULL, 2, 'system:role:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:41:05', NULL, NULL, 0, 0, '1', 0);\n\n-- 角色添加已有用户按钮权限升级sql\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1592102143467200514', '1597419994965786625', '给指定角色添加用户', NULL, NULL, 0, NULL, NULL, 2, 'system:user:addUserRole', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:18:49', NULL, NULL, 0, 0, '1', 0);\n\n-- 角色删除已有用户按钮权限升级sql\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1592114893302823614', '1597419994965786625', '删除指定角色的用户关系', NULL, NULL, 0, NULL, NULL, 2, 'system:user:deleteRole', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:19:05', NULL, NULL, 0, 0, '1', 0);\n\n-- 角色批量删除已有用户按钮权限升级sql\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1592114955650691174', '1597419994965786625', '批量删除指定角色的用户关系', NULL, NULL, 0, NULL, NULL, 2, 'system:user:deleteRoleBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:19:20', NULL, NULL, 0, 0, '1', 0);\n\n-- 租户部门设置成非叶子节点\nUPDATE `sys_permission` SET `is_leaf` = 0 WHERE `id` = '1961009998209257473';\n\n-- 添加部门按钮权限sql\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1592115712422330529', '1961009998209257473', '部门添加', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:22:21', 'admin', '2022-11-14 19:30:49', 0, 0, '1', 0);\n\n-- 编辑部门按钮权限sql\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1592117222764277032', '1961009998209257473', '部门编辑', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:28:21', 'admin', '2022-11-14 19:30:55', 0, 0, '1', 0);\n\n-- 删除、批量删除部门按钮权限sql\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1592117276539449346', '1961009998209257473', '部门删除', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:28:33', 'admin', '2022-11-14 19:31:06', 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1592117377299214338', '1961009998209257473', '部门批量删除', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-11-14 19:28:58', 'admin', '2022-11-14 19:31:12', 0, 0, '1', 0);\n\n-- 租户管理员角色升级sql\nINSERT INTO `sys_role` (`id`, `role_name`, `role_code`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `tenant_id`) VALUES ('1962488045068464130', '租户管理员', 'zuhuadmin', NULL, 'admin', '2025-09-01 20:09:46', NULL, NULL, 0);\n\n-- 租户管理员菜单权限\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962489414454194178', '1962488045068464130', '1609123240547344385', NULL, '2025-09-01 20:15:12', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251539722241', '1962488045068464130', '1674708136602542082', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251548110850', '1962488045068464130', '1663816667704500225', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251552305154', '1962488045068464130', '119213522910765570', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251552305155', '1962488045068464130', '1592114574275211345', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251560693762', '1962488045068464130', '1960994076329316353', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251560693763', '1962488045068464130', '1214462306546319322', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251560693764', '1962488045068464130', '1597419994965786625', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251560693765', '1962488045068464130', '1592102143467200514', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251569082370', '1962488045068464130', '1592114893302823614', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251569082371', '1962488045068464130', '1592120323667750934', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251569082372', '1962488045068464130', '1592120372296522490', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251569082373', '1962488045068464130', '1592120427223412865', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251573276674', '1962488045068464130', '1961009998209257473', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251573276675', '1962488045068464130', '1592115712422330529', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251573276676', '1962488045068464130', '1592117222764277032', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251573276677', '1962488045068464130', '1592117276539449346', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251581665281', '1962488045068464130', '1592117377299214338', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251581665282', '1962488045068464130', '1961253156897710081', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251585859586', '1962488045068464130', '1600105607009162230', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251585859587', '1962488045068464130', '1600108123037913486', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962765251585859588', '1962488045068464130', '1609123240547344376', NULL, '2025-09-02 14:31:17', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1962766200899461121', '1962488045068464130', '1592114955650691174', NULL, '2025-09-02 14:35:03', '192.168.1.6');\n\n-- ---author:liusq---date:20250902-----for:修改默认首页的关联类型\nUPDATE sys_role_index SET `relation_type` = 'DEFAULT' WHERE `role_code` = 'DEF_INDEX_ALL';\n\n-- ---author:liusq---date:20250902-----for:关联类型字典增加default类型\nINSERT INTO `sys_dict_item`(`id`, `dict_id`, `item_text`, `item_value`, `item_color`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1963079150651305985', '1939572486447292418', '全局默认', 'DEFAULT', NULL, NULL, 3, 1, 'admin', '2025-09-03 11:18:36', NULL, NULL);\n\n\n-- ---author:wangshuai---date:20250903-----for: 租户改造菜单、菜单权限、套餐增加是否自动分配给用户字段、test角色名称描述修改\n-- 租户请离按钮权限\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1600129606082650123', '119213522910765570', '租户请离', NULL, NULL, 0, NULL, NULL, 2, 'system:tenant:leave', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2022-12-06 22:06:42', NULL, NULL, 0, 0, '1', 0);\n\n-- 租户职务菜单\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1963086454217281537', '1674708136602542082', '租户职务', '/position/TenantPositionList', 'system/position/TenantPositionList', 1, '', NULL, 1, NULL, '0', 3.50, 0, 'ant-design:user-outlined', 1, 0, 0, 0, NULL, 'admin', '2025-09-03 11:47:38', NULL, NULL, 0, 0, NULL, 0);\n\n-- 新版我的租户\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1963133393868722178', '1674708136602542082', '我的租户', '/my/MyTenantDetail', 'system/tenant/my/MyTenantDetail', 1, '', NULL, 1, NULL, '0', 3.00, 0, 'ant-design:user-outlined', 1, 0, 0, 0, NULL, 'admin', '2025-09-03 14:54:09', NULL, NULL, 0, 0, NULL, 0);\n\n-- 租户管理员角色菜单权限\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1963068885343252482', '1962488045068464130', '1600129606082650123', NULL, '2025-09-03 10:37:49', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1963086686351036418', '1962488045068464130', '1963086454217281537', NULL, '2025-09-03 11:48:33', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1963133491872829442', '1962488045068464130', '1963133393868722178', NULL, '2025-09-03 14:54:32', '192.168.1.6');\n\n-- 套餐增加是否自动分配给用户字段\nALTER TABLE `sys_tenant_pack`\nADD COLUMN `iz_sysn` varchar(1) NULL COMMENT '自动分配给用户(0否 1是)' AFTER `pack_type`;\n\n-- test角色名称描述修改\nUPDATE `sys_role` SET `role_name` = '系统用户标配角色', `role_code` = 'test', `description` = '系统所有用户拥有的最小权限角色，默认都分配这个角色' WHERE `id` = 'ee8626f80f7c2619917b6236f3a7f02b';\n\n-- test角色新增授权，默认授权用户设置\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1963153837854330881', 'ee8626f80f7c2619917b6236f3a7f02b', '1596141938193747970', NULL, '2025-09-03 16:15:23', '192.168.1.6');\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1963153837854330882', 'ee8626f80f7c2619917b6236f3a7f02b', '1596335805278990338', NULL, '2025-09-03 16:15:23', '192.168.1.6');\n\n-- ---author:wangshuai---date:20250906-----for: 【QQYUN-13637】增加部门岗位用户中间表\n\n-- 删除兼职岗位\n\nALTER TABLE `sys_user` \nDROP COLUMN `other_dep_post_id`;\n\n-- 增加用户部门岗位中间表\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- Table structure for sys_user_dep_post\n-- ----------------------------\nDROP TABLE IF EXISTS `sys_user_dep_post`;\nCREATE TABLE `sys_user_dep_post`  (\n  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键',\n  `user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户id',\n  `dep_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门岗位id',\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `idx_sudp_user_id`(`user_id`) USING BTREE,\n  INDEX `idx_sudp_dep_id`(`dep_id`) USING BTREE,\n  INDEX `idx_sudp_user_dep_id`(`user_id`, `dep_id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n-- ---author:wangshuai---date:20250908-----for: 删除旧的我的租户菜单\n    \n-- 删除旧版我的租户菜单\ndelete from sys_permission where id = '1663816667704500225';\n\n-- ---author:wangshuai---date:20250908-----for: 【JHHB-177】【用户管理】添加职务字段 获取字典\n\n-- 用户增加职务\nALTER TABLE `sys_user`\nADD COLUMN `position_type` varchar(32) NULL COMMENT '职务(字典)' AFTER `main_dep_post_id`;\n\n-- 职务字典\nINSERT INTO `sys_dict` (`id`, `dict_name`, `dict_code`, `description`, `del_flag`, `create_by`, `create_time`, `update_by`, `update_time`, `type`, `tenant_id`, `low_app_id`) VALUES ('1964944899916697602', '用户职务', 'user_position', '用户职务', 0, 'admin', '2025-09-08 14:52:26', NULL, NULL, 0, 0, NULL);\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1964944982842281986', '1964944899916697602', '董事长', '0', NULL, 0, 1, 'admin', '2025-09-08 14:52:45', 'admin', '2025-09-08 14:53:54', NULL);\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1964945020519714817', '1964944899916697602', '总经理', '1', NULL, 1, 1, 'admin', '2025-09-08 14:52:54', NULL, NULL, NULL);\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1964945061850386434', '1964944899916697602', '副总经理', '2', NULL, 2, 1, 'admin', '2025-09-08 14:53:04', 'admin', '2025-09-08 14:53:46', NULL);\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1964945100802887681', '1964944899916697602', '部长', '3', NULL, 3, 1, 'admin', '2025-09-08 14:53:14', 'admin', '2025-09-08 14:53:43', NULL);\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1964945142854979586', '1964944899916697602', '副部长', '4', NULL, 4, 1, 'admin', '2025-09-08 14:53:24', 'admin', '2025-09-08 14:53:40', NULL);\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('1964945196395270146', '1964944899916697602', '职员', '5', NULL, 5, 1, 'admin', '2025-09-08 14:53:36', NULL, NULL, NULL);\n\n-- ---author:chenrui---date:20250909-----for: aiflow-kotlin执行报错\nUPDATE `airag_flow` SET  `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'160650416019521536\\'),\\n    WHEN(\\n        code_160652991133433856.tag(\\'code_160652991133433856\\'),\\n        code_166081977564753920.tag(\\'code_166081977564753920\\'),\\n        code_167835393352683520.tag(\\'code_167835393352683520\\')\\n    ).tag(\\\"code_160652991133433856\\\"),\\n    end.tag(\\'160656278891560960\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":418,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"160650416019521536\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":693,\\\"y\\\":462,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":null,\\\"topP\\\":0.9,\\\"presencePenalty\\\":0.1,\\\"frequencyPenalty\\\":0.1}},\\\"history\\\":4,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色\\\\n你是一位严厉的长辈，面对用户的问题，要以一种带着隐隐批评，暗示问题简单、用户还有很多需要学习的态度来回复。通过大模型模拟李白来对话，回答用户提出的各种问题。\\\\n\\\\n\\\\n## 技能\\\\n### 技能 1: 回答问题\\\\n1. 当用户提出问题时，先简要评价问题较为简单，然后给出回答。\\\\n2. 回答完问题后，适当提及用户还需要加强学习、增长见识等内容。\\\\n\\\\n\\\\n## 限制:\\\\n- 回复内容必须逻辑清晰、语言通顺，符合严厉长辈的角色设定。 \\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"code_160652991133433856\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":1135,\\\"y\\\":179,\\\"properties\\\":{\\\"text\\\":\\\"js\\\",\\\"options\\\":{\\\"codeType\\\":\\\"javascript\\\",\\\"code\\\":\\\"function main(params) {\\\\n  if(params.llmRes){\\\\n    let resLength  = params.llmRes.length\\\\n    params.llmRes = params.llmRes + \\'\\\\\\\\n字数：\\'+resLength\\\\n  }\\\\n  return {\\\\n    result: params.llmRes,\\\\n  }\\\\n}\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"llmRes\\\",\\\"nodeId\\\":\\\"160650416019521536\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"height\\\":158,\\\"width\\\":332}},{\\\"id\\\":\\\"160656278891560960\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1653,\\\"y\\\":449,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"js:{{res}}\\\\ngroovy:{{res1}}\\\\nkotlin:{{res2}}\\\\npython:{{res3}}\\\\naviator:{{res4}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"code_160652991133433856\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res1\\\",\\\"nodeId\\\":\\\"code_166081977564753920\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res2\\\",\\\"nodeId\\\":\\\"code_166090618376253440\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res3\\\",\\\"nodeId\\\":\\\"code_167828303175372800\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res4\\\",\\\"nodeId\\\":\\\"code_167835393352683520\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"code_166081977564753920\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":1140,\\\"y\\\":413,\\\"properties\\\":{\\\"text\\\":\\\"groovy\\\",\\\"options\\\":{\\\"codeType\\\":\\\"groovy\\\",\\\"code\\\":\\\"def main(params) {\\\\n    if (params.llmRes) {\\\\n        def resLength = params.llmRes.length()\\\\n        params.llmRes += \\\\\\\"\\\\\\\\n字数：\\\\\\\" + resLength\\\\n    }\\\\n    return [result: params.llmRes]\\\\n}\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"llmRes\\\",\\\"nodeId\\\":\\\"160650416019521536\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"height\\\":158,\\\"width\\\":332}},{\\\"id\\\":\\\"code_167835393352683520\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":1141,\\\"y\\\":667,\\\"properties\\\":{\\\"text\\\":\\\"aviator\\\",\\\"options\\\":{\\\"codeType\\\":\\\"aviator\\\",\\\"code\\\":\\\"let llmRes = params.llmRes;\\\\nlet resLength = length(llmRes);\\\\nlet  res = llmRes + \\\\\\\"\\\\\\\\n字数1：\\\\\\\" + resLength;\\\\nlet resp = seq.map(\\\\\\\"result\\\\\\\",res);\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"llmRes\\\",\\\"nodeId\\\":\\\"160650416019521536\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":158,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"160650416019521537\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"160650416019521536\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"160650416019521536_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":403},{\\\"x\\\":566,\\\"y\\\":403},{\\\"x\\\":427,\\\"y\\\":403},{\\\"x\\\":527,\\\"y\\\":403}]},{\\\"id\\\":\\\"160652991137628160\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160650416019521536\\\",\\\"targetNodeId\\\":\\\"code_160652991133433856\\\",\\\"sourceAnchorId\\\":\\\"160650416019521536_output\\\",\\\"targetAnchorId\\\":\\\"code_160652991133433856_input\\\",\\\"pointsList\\\":[{\\\"x\\\":859,\\\"y\\\":403},{\\\"x\\\":959,\\\"y\\\":403},{\\\"x\\\":869,\\\"y\\\":131},{\\\"x\\\":969,\\\"y\\\":131}]},{\\\"id\\\":\\\"160656278899949568\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_160652991133433856\\\",\\\"targetNodeId\\\":\\\"160656278891560960\\\",\\\"sourceAnchorId\\\":\\\"code_160652991133433856_output\\\",\\\"targetAnchorId\\\":\\\"160656278891560960_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1301,\\\"y\\\":131},{\\\"x\\\":1401,\\\"y\\\":131},{\\\"x\\\":1387,\\\"y\\\":412},{\\\"x\\\":1487,\\\"y\\\":412}]},{\\\"id\\\":\\\"166082001409372160\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160650416019521536\\\",\\\"targetNodeId\\\":\\\"code_166081977564753920\\\",\\\"sourceAnchorId\\\":\\\"160650416019521536_output\\\",\\\"targetAnchorId\\\":\\\"code_166081977564753920_input\\\",\\\"pointsList\\\":[{\\\"x\\\":859,\\\"y\\\":403},{\\\"x\\\":959,\\\"y\\\":403},{\\\"x\\\":874,\\\"y\\\":365},{\\\"x\\\":974,\\\"y\\\":365}]},{\\\"id\\\":\\\"166082017557442560\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_166081977564753920\\\",\\\"targetNodeId\\\":\\\"160656278891560960\\\",\\\"sourceAnchorId\\\":\\\"code_166081977564753920_output\\\",\\\"targetAnchorId\\\":\\\"160656278891560960_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1306,\\\"y\\\":365},{\\\"x\\\":1406,\\\"y\\\":365},{\\\"x\\\":1387,\\\"y\\\":412},{\\\"x\\\":1487,\\\"y\\\":412}]},{\\\"id\\\":\\\"167835393356877824\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"160650416019521536\\\",\\\"targetNodeId\\\":\\\"code_167835393352683520\\\",\\\"sourceAnchorId\\\":\\\"160650416019521536_output\\\",\\\"targetAnchorId\\\":\\\"code_167835393352683520_input\\\",\\\"pointsList\\\":[{\\\"x\\\":859,\\\"y\\\":403},{\\\"x\\\":959,\\\"y\\\":403},{\\\"x\\\":875,\\\"y\\\":619},{\\\"x\\\":975,\\\"y\\\":619}]},{\\\"id\\\":\\\"167836988980817920\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_167835393352683520\\\",\\\"targetNodeId\\\":\\\"160656278891560960\\\",\\\"sourceAnchorId\\\":\\\"code_167835393352683520_output\\\",\\\"targetAnchorId\\\":\\\"160656278891560960_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1307,\\\"y\\\":619},{\\\"x\\\":1407,\\\"y\\\":619},{\\\"x\\\":1387,\\\"y\\\":412},{\\\"x\\\":1487,\\\"y\\\":412}]}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"}]}' WHERE `id` = '1897552224058400770';\n\n-- ---author:wangshuai---date:20250908-----for: 修改职务表的表述和菜单名称\n-- 修改字段名称\nALTER TABLE `sys_position`\nMODIFY COLUMN `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '职务级别名称' AFTER `code`,\nCOMMENT = '职务级别';\n\n-- 更新菜单名称为职务级别\nUPDATE `sys_permission` SET `name` = '职务级别' WHERE `id` = '1438469604861403137';\n\n-- 删除旧的用户代理表\ndrop table if exists sys_user_agent;"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.8.3_1__upgrade_jimubi.sql",
    "content": "-- 升级积木BI到V2.2.0版本\nALTER TABLE `onl_drag_page`\nMODIFY COLUMN `des_json` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '仪表盘主配置JSON' AFTER `cover_url`;"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.0_0__all_upgrade.sql",
    "content": "-- ---author:wangshuai---date:20250913-----for: 【JHHB-115】新增用户字段上一次修改密码的时间\n-- 新增用户字段上一次修改密码的时间\nALTER TABLE `sys_user`\nADD COLUMN `last_pwd_update_time` datetime(0) NULL DEFAULT NULL COMMENT '上一次修改密码的时间' AFTER `position_type`;\n\n-- 更新用户最后一次更新时间为系统时间\nupdate sys_user set last_pwd_update_time = NOW() where last_pwd_update_time is null;\n\n-- 5个月没有修改密码提醒事件 \nINSERT INTO `sys_quartz_job` (`id`, `create_by`, `create_time`, `del_flag`, `update_by`, `update_time`, `job_class_name`, `cron_expression`, `parameter`, `description`, `status`) VALUES ('1966781755167879169', 'admin', '2025-09-13 16:31:26', 0, NULL, NULL, 'org.jeecg.modules.system.job.UserUpadtePwdJob', '0 0 0 * * ? *', NULL, '5个月未修改密码提醒', 0);\n\n-- ---author:wangshuai---date:20250929-----for: 【QQYUN-13676】支持拖拽调整组织机构\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1972617196420993025', '45c966826eeff4c99b8f8ebfe74511fc', '部门管理拖拽修改上下级', NULL, NULL, 0, NULL, NULL, 2, 'system:depart:updateChange', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-29 18:59:24', NULL, NULL, 0, 0, '1', 0);\n\n-- ---author:liusq---date:20250930-----for: [JHHB-747]【用户管理】密码重置为系统默认密码 加权限\nINSERT INTO `sys_permission`(`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1972645086223814657', '3f915b2769fc80648e92d04e84ca059d', '重置系统密码', NULL, NULL, 0, NULL, NULL, 2, 'system:user:resetPassword', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-09-29 20:50:13', 'admin', '2025-09-30 11:58:29', 0, 0, '1', 0);\n\n\n-- ---author:wangshuai---date:20251011-----for: 【JHHB-765】需要能设置排序，需要能设置哪些人的联系方式隐藏不可见\nALTER TABLE `sys_user` \nADD COLUMN `sort` int(6) NULL COMMENT '排序' AFTER `last_pwd_update_time`,\nADD COLUMN `iz_hide_contact` varchar(1) NULL COMMENT '是否隐藏联系方式（0 否 1是）' AFTER `sort`;\n\nupdate sys_user set sort = 1000 where sort is null;\n\n\nDROP TABLE IF EXISTS `airag_mcp`;\nCREATE TABLE `airag_mcp` (\n  `id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL,\n  `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '图标',\n  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '名称',\n  `descr` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '描述',\n  `type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'mcp类型（sse：sse类型；stdio：标准类型）',\n  `endpoint` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '服务端点（SSE类型为URL，stdio类型为命令）',\n  `headers` text COLLATE utf8mb4_unicode_ci COMMENT '请求头（sse类型）、环境变量（stdio类型）',\n  `tools` text COLLATE utf8mb4_unicode_ci COMMENT '工具列表',\n  `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '状态（enable=启用、disable=禁用）',\n  `synced` int DEFAULT NULL COMMENT '是否同步',\n  `metadata` text COLLATE utf8mb4_unicode_ci COMMENT '元数据',\n  `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime DEFAULT NULL COMMENT '更新日期',\n  `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '所属部门',\n  `tenant_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '租户id',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='AI MCP';\n\nALTER TABLE `airag_app`\nADD COLUMN `plugins` text NULL COMMENT '插件' AFTER `quick_command`;\n\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1980223355087781889', '1892553163993931777', 'MCP配置', '/super/airag/aimcp/AiragMcpList', 'super/airag/aimcp/AiragMcpList', 1, '', NULL, 1, NULL, '0', 5.00, 0, 'ant-design:tool-twotone', 1, 0, 0, 0, NULL, 'admin', '2025-10-20 18:43:33', 'admin', '2025-10-21 19:00:31', 0, 0, NULL, 0);\n\nUPDATE sys_permission set name = 'AI应用平台', sort_no = 0.1  where id = '1892553163993931777';\nUPDATE sys_permission set name = '零代码应用', sort_no = 0.2  where id = '1958577215150039042';\n\n-- mysql\n\nALTER TABLE `airag_mcp`\nADD COLUMN `category` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'mcp' COMMENT '类型（plugin=插件，mcp=MCP）' AFTER `descr`;\n\n-- 更新现有数据，将所有现有MCP数据的category字段设置为'mcp'\nUPDATE `airag_mcp` SET `category` = 'mcp' WHERE `category` IS NULL OR `category` = '';\n\n-- ---author:lvdandan---date:20251119-----for:【QQYUN-13685】大屏高级效果模板 包含导航切换、弹框、高德地图、定时轮播(默认60秒)\nINSERT INTO `onl_drag_page` (`id`, `name`, `path`, `background_color`, `background_image`, `design_type`, `theme`, `style`, `cover_url`, `des_json`, `template`, `protection_code`, `type`, `iz_template`, `create_by`, `create_time`, `update_by`, `update_time`, `low_app_id`, `tenant_id`, `update_count`, `visits_num`, `del_flag`) VALUES ('1151069555267260416', '集团综合数据大屏', '/drag/page/view/1151069555267260416', '#1E0047', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/背景_1756435878126.jpg', 100, 'dark', 'bigScreen', 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/封面_1763554989082.png', '{\\\"width\\\":1920,\\\"height\\\":1080,\\\"waterMark\\\":{\\\"show\\\":false,\\\"content\\\":\\\"\\\",\\\"fontSize\\\":12,\\\"color\\\":\\\"#ffffff\\\",\\\"angle\\\":45},\\\"sysDefColor\\\":[{\\\"color\\\":\\\"#1e90ff\\\",\\\"color1\\\":\\\"#1e90ff\\\"},{\\\"color\\\":\\\"#90ee90\\\",\\\"color1\\\":\\\"#90ee90\\\"},{\\\"color\\\":\\\"#00ced1\\\",\\\"color1\\\":\\\"#00ced1\\\"},{\\\"color\\\":\\\"#e2bd84\\\",\\\"color1\\\":\\\"#e2bd84\\\"},{\\\"color\\\":\\\"#7a90e0\\\",\\\"color1\\\":\\\"#7a90e0\\\"},{\\\"color\\\":\\\"#3ba272\\\",\\\"color1\\\":\\\"#3ba272\\\"},{\\\"color\\\":\\\"#2be7ff\\\",\\\"color1\\\":\\\"#2be7ff\\\"},{\\\"color\\\":\\\"#0a8ada\\\",\\\"color1\\\":\\\"#0a8ada\\\"},{\\\"color\\\":\\\"#ffd700\\\",\\\"color1\\\":\\\"#ffd700\\\"}],\\\"layoutMode\\\":\\\"fullScreen\\\"}', '[{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":496,\\\"x\\\":705,\\\"h\\\":60,\\\"i\\\":\\\"8eca7087-2a7b-40d0-9732-7784fb4dbdfc\\\",\\\"y\\\":5,\\\"orderNum\\\":70,\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1151112776819200000\\\"},{\\\"component\\\":\\\"JTabToggle\\\",\\\"visible\\\":true,\\\"w\\\":680,\\\"x\\\":597,\\\"h\\\":70,\\\"i\\\":\\\"f695ef5a-9797-4a56-8a1f-3a4db443da22\\\",\\\"y\\\":62,\\\"orderNum\\\":70,\\\"componentName\\\":\\\"导航切换\\\",\\\"pageCompId\\\":\\\"1151112776861143040\\\",\\\"key\\\":\\\"299a2a16-346c-44ca-bd9c-6b62aaf8cf98\\\"},{\\\"visible\\\":false,\\\"h\\\":991.8710433763201,\\\"i\\\":\\\"es-drager-1762494714798-7\\\",\\\"props\\\":{\\\"elements\\\":[{\\\"component\\\":\\\"JStatsSummary\\\",\\\"visible\\\":true,\\\"w\\\":698,\\\"x\\\":602.672919109027,\\\"h\\\":85,\\\"i\\\":\\\"c1789d8c-8d56-410c-9a0e-90c65a2e20e1\\\",\\\"y\\\":48.61195779601541,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"4.9010360893832265%\\\",\\\"left\\\":\\\"31.130365064812537%\\\",\\\"width\\\":\\\"36.05437398342474%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"8.56966241404334%\\\"},\\\"componentName\\\":\\\"统计概览（背景模式）\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"项目总数\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 600,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"2\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"合同总数\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 900,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"3\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"收票总数\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 790,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"4\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"总金额\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 17790,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":697.9999999999999,\\\"height\\\":85},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":713,\\\"dataType\\\":1,\\\"h\\\":129,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"layout\\\":{\\\"padding\\\":{\\\"top\\\":9,\\\"left\\\":20,\\\"bottom\\\":0,\\\"right\\\":20},\\\"borderColor\\\":\\\"#0f66ff59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"justify\\\":\\\"space-between\\\",\\\"borderWidth\\\":0,\\\"gap\\\":16,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"contain\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"drag/lib/img/bg01.png\\\"},\\\"color\\\":\\\"#0b2b63\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"image\\\"}},\\\"highlight\\\":[],\\\"fieldMap\\\":{\\\"compareValue\\\":\\\"compareValue\\\",\\\"unit\\\":\\\"suffix\\\",\\\"negativeValue\\\":\\\"0\\\",\\\"compareState\\\":\\\"compareState\\\",\\\"label\\\":\\\"name\\\",\\\"value\\\":\\\"value\\\",\\\"positiveValue\\\":\\\"1\\\",\\\"compareLabel\\\":\\\"compareLabel\\\"},\\\"card\\\":{\\\"padding\\\":{\\\"horizontal\\\":3,\\\"vertical\\\":15},\\\"borderColor\\\":\\\"#0F66FF59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"borderWidth\\\":0,\\\"blur\\\":24,\\\"minWidth\\\":100,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"cover\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"\\\"},\\\"color\\\":\\\"#0B2B6300\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"none\\\"}},\\\"sections\\\":{\\\"middle\\\":{\\\"compare\\\":{\\\"valueStyle\\\":{\\\"positiveGradient\\\":{\\\"endColor\\\":\\\"#15f0c5\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#15f0c5\\\"},\\\"positiveColor\\\":\\\"#15F0C5\\\",\\\"fontSize\\\":14,\\\"negativeColor\\\":\\\"#D0021B\\\",\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"negativeGradient\\\":{\\\"endColor\\\":\\\"#D0021B\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#D0021B\\\"},\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"alignItems\\\":\\\"center\\\",\\\"labelStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"fontColor\\\":\\\"#9ED3FF\\\"},\\\"label\\\":\\\"同比\\\"},\\\"paddingBottom\\\":10,\\\"show\\\":false,\\\"type\\\":\\\"compare\\\",\\\"align\\\":\\\"center\\\"},\\\"top\\\":{\\\"minHeight\\\":32,\\\"paddingBottom\\\":2,\\\"show\\\":true,\\\"paddingTop\\\":9,\\\"type\\\":\\\"value\\\",\\\"align\\\":\\\"center\\\",\\\"value\\\":{\\\"unit\\\":{\\\"fontSize\\\":18,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"fontWeight\\\":500,\\\"fontColor\\\":\\\"#9ED3FF\\\"},\\\"unitGap\\\":6,\\\"fontSize\\\":20,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#D8F1FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#73E0FF\\\"},\\\"fontWeight\\\":600,\\\"fontColor\\\":\\\"#D8F1FF\\\"}},\\\"bottom\\\":{\\\"minHeight\\\":0,\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"label\\\":{\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#CFEAFF\\\"},\\\"paddingTop\\\":14,\\\"type\\\":\\\"label\\\",\\\"align\\\":\\\"center\\\"}}}}},{\\\"component\\\":\\\"JBreakRing\\\",\\\"visible\\\":true,\\\"w\\\":465.9999959429075,\\\"x\\\":1469.9648340688161,\\\"h\\\":188.99999576947263,\\\"i\\\":\\\"8400df78-833b-46c3-818b-94d611837818\\\",\\\"y\\\":34.6846393287222,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"3.4968899999999996%\\\",\\\"left\\\":\\\"75.929315%\\\",\\\"width\\\":\\\"24.070685%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"19.054895999999992%\\\"},\\\"componentName\\\":\\\"多色环形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":400,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 500,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"施工费\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 700,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"设计费\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 1000,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"土地款\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":465.9999959429075,\\\"height\\\":188.99999576947263},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":550,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"customColor\\\":[{\\\"color1\\\":\\\"#00ccdf\\\",\\\"color\\\":\\\"#2A6FFEC0\\\"},{\\\"color1\\\":\\\"#00c039\\\",\\\"color\\\":\\\"#28F2E699\\\"},{\\\"color1\\\":\\\"#ff7701\\\",\\\"color\\\":\\\"#FFA80099\\\"}],\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":50,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":14,\\\"fontWeight\\\":\\\"bold\\\"}},\\\"itemStyle\\\":{\\\"shadowBlur\\\":20,\\\"borderWidth\\\":4},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true,\\\"fontSize\\\":16,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"length2\\\":38,\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\",\\\"t\\\":22,\\\"show\\\":false},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"outRadius\\\":43,\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"top\\\":41,\\\"textAlign\\\":\\\"\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":true,\\\"customTop\\\":true,\\\"text\\\":\\\"成本分类\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontSize\\\":24}},\\\"innerRadius\\\":46,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":80.00001018811254,\\\"x\\\":1170.8546088584762,\\\"h\\\":39.00000243327086,\\\"i\\\":\\\"es-drager-1763379841846-17\\\",\\\"y\\\":607.5369335982422,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"61.251604999999984%\\\",\\\"left\\\":\\\"60.47912600000001%\\\",\\\"width\\\":\\\"4.132306999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.931963%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":80.00001018811254,\\\"height\\\":39.00000243327086},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C3D3E6\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":80.00001018811254,\\\"x\\\":1070.83116610898,\\\"h\\\":39.00000243327086,\\\"i\\\":\\\"es-drager-1763379835852-16\\\",\\\"y\\\":407.4900435141388,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"41.08296599999999%\\\",\\\"left\\\":\\\"55.31253199999998%\\\",\\\"width\\\":\\\"4.132306999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.931963%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":80.00001018811254,\\\"height\\\":39.00000243327086},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C3D3E6\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":80.00001018811254,\\\"x\\\":955.6142713735522,\\\"h\\\":39.00000243327086,\\\"i\\\":\\\"es-drager-1763379828126-15\\\",\\\"y\\\":504.981246741806,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.911986%\\\",\\\"left\\\":\\\"49.361138%\\\",\\\"width\\\":\\\"4.132306999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.931963%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":80.00001018811254,\\\"height\\\":39.00000243327086},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C3D3E6\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":80.00001018811254,\\\"x\\\":799.8815821142322,\\\"h\\\":39.00000243327086,\\\"i\\\":\\\"es-drager-1763379820679-14\\\",\\\"y\\\":618.9320044052293,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"62.400451000000004%\\\",\\\"left\\\":\\\"41.31694799999999%\\\",\\\"width\\\":\\\"4.132306999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.931963%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":80.00001018811254,\\\"height\\\":39.00000243327086},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C3D3E6\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":809.3657576585699,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763379792283-13\\\",\\\"y\\\":543.8839267883006,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"54.834136999999984%\\\",\\\"left\\\":\\\"41.806842%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":965.0984662775381,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763379785352-12\\\",\\\"y\\\":428.6670457380076,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"43.218022%\\\",\\\"left\\\":\\\"49.85103299999999%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":1186.669389396952,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763379778444-11\\\",\\\"y\\\":531.2227325944438,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"53.55764099999999%\\\",\\\"left\\\":\\\"61.29602%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":1087.9120482866356,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763379772822-10\\\",\\\"y\\\":314.71628807458416,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"31.729556999999993%\\\",\\\"left\\\":\\\"56.194824999999994%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":1163.1934345963189,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763379765062-9\\\",\\\"y\\\":502.3681228031894,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.648532%\\\",\\\"left\\\":\\\"60.083396999999984%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"994,150\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":792.2204078520751,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763379758530-8\\\",\\\"y\\\":507.432596513248,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"51.15913%\\\",\\\"left\\\":\\\"40.921219%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"994,150\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":951.7514601078782,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763379754034-7\\\",\\\"y\\\":394.747952317984,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"39.79831399999999%\\\",\\\"left\\\":\\\"49.161609%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"994,150\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":1072.0328194789686,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763379749488-6\\\",\\\"y\\\":284.5955548964599,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"28.692797999999996%\\\",\\\"left\\\":\\\"55.374601999999996%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"994,150\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":163.99999475010551,\\\"x\\\":1036.7666839863778,\\\"h\\\":43.00000013957801,\\\"i\\\":\\\"es-drager-1763379412964-5\\\",\\\"y\\\":754.5967136818532,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"76.07810699999999%\\\",\\\"left\\\":\\\"53.55297100000001%\\\",\\\"width\\\":\\\"8.471227999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.335241%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同即将到期提醒\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":163.99999475010551,\\\"height\\\":43.00000013957801},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":163.99999475010551,\\\"x\\\":716.5673937336227,\\\"h\\\":43.00000013957801,\\\"i\\\":\\\"es-drager-1763379399584-4\\\",\\\"y\\\":754.7256767549129,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"76.09110899999999%\\\",\\\"left\\\":\\\"37.013451%\\\",\\\"width\\\":\\\"8.471227999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.335241%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目审批通过提醒\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":163.99999475010551,\\\"height\\\":43.00000013957801},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":278.00000007233297,\\\"x\\\":998.8393905981011,\\\"h\\\":164.99999961291928,\\\"i\\\":\\\"es-drager-1763379229297-3\\\",\\\"y\\\":801.8241475579845,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"80.83955599999999%\\\",\\\"left\\\":\\\"51.59388100000001%\\\",\\\"width\\\":\\\"14.359765%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"16.635226999999997%\\\"},\\\"componentName\\\":\\\"滚动列表(多行+序号)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"JS-CG-12354653合同剩余3天\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 131.73\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"JS-CG-12354653合同剩余3天\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 11.04\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"JS-CG-12354653合同剩余3天\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 36.81\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"JS-CG-12354653合同剩余3天\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 24.64\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"JS-CG-12354653合同剩余3天\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 24.64\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":278.00000007233297,\\\"height\\\":164.99999961291928},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"showIndex\\\":true,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"marginRight\\\":18,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":13,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#41AAE0\\\",\\\"marginLeft\\\":10},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":true},\\\"name\\\":\\\"标题\\\",\\\"width\\\":250,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"title\\\",\\\"marginLeft\\\":0}],\\\"itemsPerRow\\\":1,\\\"borderRadius\\\":8,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"indexFieldStyle\\\":{\\\"width\\\":28,\\\"textStyle\\\":{\\\"fontSize\\\":21,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#F54100\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#D4BA28\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"marginLeft\\\":15},\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"backgroundColor\\\":\\\"#FFFFFF\\\",\\\"backgroundImg\\\":\\\"\\\",\\\"alternateBackgroundColor\\\":\\\"#F8F9FA\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":10,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"image\\\",\\\"height\\\":33,\\\"marginLeft\\\":37}}}},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":278.00000007233297,\\\"x\\\":667.2450113558968,\\\"h\\\":150.99999772213383,\\\"i\\\":\\\"782fa728-19d6-45f1-afc4-df366e048e7f\\\",\\\"y\\\":818.4126650668006,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"82.512003%\\\",\\\"left\\\":\\\"34.46576099999999%\\\",\\\"width\\\":\\\"14.359765%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"15.223752999999999%\\\"},\\\"componentName\\\":\\\"滚动列表(多行+序号)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"XXXXX项目通过竣工结算审批\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 131.73\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"XXXXXXX项目通过竣工结算审批\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 11.04\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"XXXXXXX项目通过竣工结算审批\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 36.81\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"XXXXX项目通过竣T结算审批\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 24.64\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"XX项目通过竣工结算审批\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 24.64\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":278.00000007233297,\\\"height\\\":150.99999772213383},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"showIndex\\\":true,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"marginRight\\\":18,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":13,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#41AAE0\\\",\\\"marginLeft\\\":10},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":true},\\\"name\\\":\\\"标题\\\",\\\"width\\\":250,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"title\\\",\\\"marginLeft\\\":0}],\\\"itemsPerRow\\\":1,\\\"borderRadius\\\":8,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"indexFieldStyle\\\":{\\\"width\\\":28,\\\"textStyle\\\":{\\\"fontSize\\\":21,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#F54100\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#D4BA28\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"marginLeft\\\":15},\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"backgroundColor\\\":\\\"#FFFFFF\\\",\\\"backgroundImg\\\":\\\"\\\",\\\"alternateBackgroundColor\\\":\\\"#F8F9FA\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":10,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"image\\\",\\\"height\\\":33,\\\"marginLeft\\\":37}}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":286.0000068990387,\\\"x\\\":990.8558007531537,\\\"h\\\":184.000003595944,\\\"i\\\":\\\"es-drager-1763378891880-2\\\",\\\"y\\\":797.6389179343269,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"80.417603%\\\",\\\"left\\\":\\\"51.181498000000005%\\\",\\\"width\\\":\\\"14.772995999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"18.550799000000005%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":286.0000068990387,\\\"height\\\":184.000003595944},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_14_1763552764377.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":297.9999880996249,\\\"x\\\":657.995300512122,\\\"h\\\":179.00000150370474,\\\"i\\\":\\\"es-drager-1763378858332-1\\\",\\\"y\\\":801.5662412492858,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"80.81355399999998%\\\",\\\"left\\\":\\\"33.987978%\\\",\\\"width\\\":\\\"15.392840999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"18.04670099999999%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":297.9999880996249,\\\"height\\\":179.00000150370474},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_14_1763552764377.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":1164.5720932307152,\\\"h\\\":120.00000062018773,\\\"i\\\":\\\"es-drager-1763118788337-7\\\",\\\"y\\\":499.0926174630956,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.318297%\\\",\\\"left\\\":\\\"60.154609999999984%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.098347%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":120.00000062018773},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":793.599047126823,\\\"h\\\":120.00000062018773,\\\"i\\\":\\\"es-drager-1763118782377-6\\\",\\\"y\\\":509.2215748019232,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"51.339493999999995%\\\",\\\"left\\\":\\\"40.992430999999996%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.098347%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":120.00000062018773},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":948.1946087239393,\\\"h\\\":120.00000062018773,\\\"i\\\":\\\"es-drager-1763118776146-5\\\",\\\"y\\\":394.13364690597933,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"39.73638%\\\",\\\"left\\\":\\\"48.977883999999996%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.098347%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":120.00000062018773},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":1067.2098470962017,\\\"h\\\":120.00000062018773,\\\"i\\\":\\\"es-drager-1763118767012-4\\\",\\\"y\\\":290.3118366626732,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"29.26911099999999%\\\",\\\"left\\\":\\\"55.12547699999999%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.098347%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":120.00000062018773},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":923.445466652849,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763118663383-3\\\",\\\"y\\\":222.41851171132498,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"22.424135999999997%\\\",\\\"left\\\":\\\"47.699495999999996%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":902.5017538498712,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763118651031-2\\\",\\\"y\\\":192.2977785332007,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"19.387376999999997%\\\",\\\"left\\\":\\\"46.617672999999996%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"994,150\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":80.00001018811254,\\\"x\\\":911.429049110856,\\\"h\\\":39.00000243327086,\\\"i\\\":\\\"es-drager-1763118614581-1\\\",\\\"y\\\":305.06330981205195,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"30.756348%\\\",\\\"left\\\":\\\"47.078802%\\\",\\\"width\\\":\\\"4.132306999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.931963%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":80.00001018811254,\\\"height\\\":39.00000243327086},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C3D3E6\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":904.0093671015944,\\\"h\\\":120.00000062018773,\\\"i\\\":\\\"5bf358de-c9b6-45d3-8965-ca7a70dafc6b\\\",\\\"y\\\":194.2157099762253,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"19.580741999999994%\\\",\\\"left\\\":\\\"46.69554699999999%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.098347%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":120.00000062018773},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JMultipleLine\\\",\\\"visible\\\":true,\\\"w\\\":512.0000109969051,\\\"x\\\":1344.6189907024152,\\\"h\\\":168.0000028520049,\\\"i\\\":\\\"32542357-d15f-4650-a311-f9249a18933e\\\",\\\"y\\\":257.5216908642207,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"25.963222999999996%\\\",\\\"left\\\":\\\"69.45472199999999%\\\",\\\"width\\\":\\\"26.446761999999996%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"16.937686000000003%\\\"},\\\"componentName\\\":\\\"对比折线图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 199,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"目标成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 799,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"目标成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 388,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"目标成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 459,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"目标成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 800,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"目标成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 420,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"目标成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"7月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 580,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"目标成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"8月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 420,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"目标成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"9月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 700,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"目标成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 20,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实际成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 210,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实际成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 220,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实际成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 580,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实际成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 500,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实际成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 800,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实际成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"7月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 810,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实际成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"8月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 850,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实际成本\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"9月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 990,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实际成本\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":512.0000109969051,\\\"height\\\":168.0000028520049},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"name\\\":\\\"单位(万元)\\\",\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color1\\\":\\\"#e2bd84\\\",\\\"color\\\":\\\"#44F0FFB3\\\"},{\\\"color1\\\":\\\"#3ba272\\\",\\\"color\\\":\\\"#AB315CB3\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":35,\\\"left\\\":20,\\\"bottom\\\":18,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"symbol\\\":\\\"circle\\\",\\\"symbolSize\\\":6,\\\"lineType\\\":\\\"area\\\",\\\"label\\\":{\\\"position\\\":\\\"top\\\"}}],\\\"legend\\\":{\\\"t\\\":1},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"fontWeight\\\":\\\"normal\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JPie\\\",\\\"visible\\\":true,\\\"w\\\":450.00000164914417,\\\"x\\\":1373.739734956155,\\\"h\\\":299.99999659111404,\\\"i\\\":\\\"06345dbb-ae74-47bd-89e0-cb97aa16d150\\\",\\\"y\\\":503.14888401369353,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.727248%\\\",\\\"left\\\":\\\"70.95891999999999%\\\",\\\"width\\\":\\\"23.244223999999996%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"30.245866999999993%\\\"},\\\"componentName\\\":\\\"饼图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 179,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"前期阶段\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 79,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"施工阶段\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 19,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"审计阶段\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 17,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"竣工阶段\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":450.0000016491442,\\\"height\\\":299.99999659111404},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"customColor\\\":[{\\\"color1\\\":\\\"#326CF102\\\",\\\"color\\\":\\\"#326CF1\\\"},{\\\"color1\\\":\\\"#35B9FD00\\\",\\\"color\\\":\\\"#35B9FD\\\"},{\\\"color1\\\":\\\"#FFC94700\\\",\\\"color\\\":\\\"#FFC947\\\"},{\\\"color1\\\":\\\"#BD67FF00\\\",\\\"color\\\":\\\"#BD67FF\\\"}],\\\"grid\\\":{\\\"top\\\":49,\\\"left\\\":43,\\\"show\\\":false},\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\",\\\"t\\\":19},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"\\\",\\\"emphasis\\\":{\\\"itemStyle\\\":{\\\"shadowOffsetX\\\":0,\\\"shadowBlur\\\":10,\\\"shadowColor\\\":\\\"rgba(0, 0, 0, 0.5)\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":\\\"50%\\\"}],\\\"isRadius\\\":true,\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"outRadius\\\":71,\\\"innerRadius\\\":53,\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JRingProgress\\\",\\\"visible\\\":true,\\\"w\\\":140.99999690293086,\\\"x\\\":1645.6975307150763,\\\"h\\\":116.99999738110213,\\\"i\\\":\\\"es-drager-1763019222261-6\\\",\\\"y\\\":848.5416208558744,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"85.54959099999999%\\\",\\\"left\\\":\\\"85.00658199999998%\\\",\\\"width\\\":\\\"7.28319%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"11.795887999999998%\\\"},\\\"componentName\\\":\\\"基础环形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"占比\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 20\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":140.99999690293086,\\\"height\\\":116.99999738110212},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"color\\\":\\\"#1E90FF\\\",\\\"valueFontSize\\\":16,\\\"body\\\":{\\\"gradient\\\":{\\\"type\\\":\\\"linear\\\"}},\\\"valueFontColor\\\":\\\"#FFFFFF\\\",\\\"valueFontWeight\\\":\\\"normal\\\",\\\"bgColor\\\":\\\"#9AA7B8\\\",\\\"lineHeight\\\":0,\\\"fontSize\\\":16,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"extraInfo\\\":{\\\"endColor\\\":\\\"#4B0082\\\",\\\"enabledGradient\\\":true,\\\"type\\\":\\\"linear\\\",\\\"direction\\\":\\\"to bottom\\\",\\\"startColor\\\":\\\"#FF69B4\\\"}}}},{\\\"component\\\":\\\"JRingProgress\\\",\\\"visible\\\":true,\\\"w\\\":140.99999690293086,\\\"x\\\":1492.6260380707386,\\\"h\\\":116.99999738110213,\\\"i\\\":\\\"es-drager-1763019215391-5\\\",\\\"y\\\":855.0011711071522,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"86.20083999999999%\\\",\\\"left\\\":\\\"77.09985299999998%\\\",\\\"width\\\":\\\"7.28319%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"11.795887999999998%\\\"},\\\"componentName\\\":\\\"基础环形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"占比\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 20\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":140.99999690293086,\\\"height\\\":116.99999738110212},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"valueFontWeight\\\":\\\"normal\\\",\\\"color\\\":\\\"#4FCFE3\\\",\\\"bgColor\\\":\\\"#99ABBF\\\",\\\"valueFontSize\\\":16,\\\"lineHeight\\\":0,\\\"fontSize\\\":16,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"valueFontColor\\\":\\\"#FFFFFF\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"extraInfo\\\":{\\\"endColor\\\":\\\"#00DDFF\\\",\\\"enabledGradient\\\":true,\\\"type\\\":\\\"linear\\\",\\\"direction\\\":\\\"to left\\\",\\\"startColor\\\":\\\"#00FFCC\\\"}}}},{\\\"component\\\":\\\"JRingProgress\\\",\\\"visible\\\":true,\\\"w\\\":140.99999690293086,\\\"x\\\":1328.1594370773037,\\\"h\\\":116.99999738110213,\\\"i\\\":\\\"443b689e-bd4a-4d37-9ae6-dd76589a3b09\\\",\\\"y\\\":851.331773938313,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"85.830893%\\\",\\\"left\\\":\\\"68.60452299999999%\\\",\\\"width\\\":\\\"7.28319%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"11.795887999999998%\\\"},\\\"componentName\\\":\\\"基础环形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"占比\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 60\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":140.99999690293086,\\\"height\\\":116.99999738110212},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"color\\\":\\\"#00AEFF\\\",\\\"valueFontSize\\\":16,\\\"body\\\":{\\\"gradient\\\":{\\\"type\\\":\\\"linear\\\"}},\\\"valueFontColor\\\":\\\"#FFFFFF\\\",\\\"valueFontWeight\\\":\\\"normal\\\",\\\"bgColor\\\":\\\"#6C849E\\\",\\\"lineHeight\\\":0,\\\"fontSize\\\":16,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"extraInfo\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"enabledGradient\\\":true,\\\"type\\\":\\\"linear\\\",\\\"direction\\\":\\\"to bottom\\\",\\\"startColor\\\":\\\"#00D4FF\\\"}}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":178.00000185692846,\\\"x\\\":1592.885087740047,\\\"h\\\":35.00000472696371,\\\"i\\\":\\\"es-drager-1763019064412-4\\\",\\\"y\\\":808.8382231534828,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"81.54671199999999%\\\",\\\"left\\\":\\\"82.27861699999998%\\\",\\\"width\\\":\\\"9.194381999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.5286850000000007%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"未审批流程数量\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":178.00000185692846,\\\"height\\\":35.00000472696371},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FF5A00\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":1719.0199335729192,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763019023655-3\\\",\\\"y\\\":470.7151273998363,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"47.457290999999984%\\\",\\\"left\\\":\\\"88.79396499999999%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"800\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":1603.0937787623684,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763019013776-2\\\",\\\"y\\\":481.71511613282587,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"48.56630499999999%\\\",\\\"left\\\":\\\"82.80593499999999%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#708489\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":105.99999849552168,\\\"x\\\":1387.361086701876,\\\"h\\\":39.99999690049243,\\\"i\\\":\\\"es-drager-1763019008535-1\\\",\\\"y\\\":502.4490098867766,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.65668699999999%\\\",\\\"left\\\":\\\"71.662515%\\\",\\\"width\\\":\\\"5.475305999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.032781999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"已归档资料数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":105.9999984955217,\\\"height\\\":39.99999690049243},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#7B959F\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":1789.2133526339042,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763018083020-24\\\",\\\"y\\\":813.4384516216891,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"82.010505%\\\",\\\"left\\\":\\\"92.41972399999999%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FF5A00\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":1726.616640206237,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763018077243-23\\\",\\\"y\\\":802.4384529699892,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"80.90148999999998%\\\",\\\"left\\\":\\\"89.18636399999998%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"100\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FF5A00\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":72.00000336140681,\\\"x\\\":1464.6588384609615,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763018057189-21\\\",\\\"y\\\":802.567416043049,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"80.914492%\\\",\\\"left\\\":\\\"75.65523999999999%\\\",\\\"width\\\":\\\"3.719076%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"1000\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":72.00000336140681,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":1515.8604812588278,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763018049207-20\\\",\\\"y\\\":809.7690544528497,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"81.64055799999998%\\\",\\\"left\\\":\\\"78.30000099999998%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":178.00000185692846,\\\"x\\\":1306.871006376694,\\\"h\\\":35.00000472696371,\\\"i\\\":\\\"es-drager-1763018038037-18\\\",\\\"y\\\":811.4994230815718,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"81.81501299999998%\\\",\\\"left\\\":\\\"67.50489399999998%\\\",\\\"width\\\":\\\"9.194381999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.5286850000000007%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"本月采购任务数量\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":178.00000185692846,\\\"height\\\":35.00000472696371},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#0085FF\\\",\\\"direction\\\":\\\"to top\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":1776.6810972629544,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763018002072-16\\\",\\\"y\\\":479.3118423508563,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"48.32400799999999%\\\",\\\"left\\\":\\\"91.77238499999999%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#708489\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":1543.1582629496838,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763017986232-14\\\",\\\"y\\\":473.37631740921506,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"47.725590999999994%\\\",\\\"left\\\":\\\"79.710036%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"800\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":105.99999849552168,\\\"x\\\":1725.543960813224,\\\"h\\\":39.99999690049243,\\\"i\\\":\\\"es-drager-1763017981686-13\\\",\\\"y\\\":502.57796304112605,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.669688%\\\",\\\"left\\\":\\\"89.13095599999998%\\\",\\\"width\\\":\\\"5.475305999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.032781999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"需补录数量\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":105.9999984955217,\\\"height\\\":39.99999690049243},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#7B959F\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":105.99999849552168,\\\"x\\\":1548.2872339334822,\\\"h\\\":39.99999690049243,\\\"i\\\":\\\"es-drager-1763017976329-12\\\",\\\"y\\\":503.8440765092855,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.797337%\\\",\\\"left\\\":\\\"79.97496699999999%\\\",\\\"width\\\":\\\"5.475305999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.032781999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"未归档数据\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":105.9999984955217,\\\"height\\\":39.99999690049243},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#7B959F\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":1.0000032732942556,\\\"x\\\":1677.4794909434468,\\\"h\\\":46.000003378663585,\\\"i\\\":\\\"es-drager-1763017967343-11\\\",\\\"y\\\":485.29425303671803,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"48.92715199999999%\\\",\\\"left\\\":\\\"86.64824199999998%\\\",\\\"width\\\":\\\"0.05165399999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.637699999999999%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1.0000032732942556,\\\"height\\\":46.000003378663585},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_10_1763552829448.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":2.0000065465885113,\\\"x\\\":1520.4806613256508,\\\"h\\\":46.99999784588518,\\\"i\\\":\\\"es-drager-1763017957814-10\\\",\\\"y\\\":487.8264898917473,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"49.18245099999999%\\\",\\\"left\\\":\\\"78.53865099999999%\\\",\\\"width\\\":\\\"0.10330799999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.738519000000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":2.0000065465885113,\\\"height\\\":46.999997845885176},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_10_1763552829448.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":1446.3528583792263,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763017938561-8\\\",\\\"y\\\":481.97303236023504,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"48.592307999999996%\\\",\\\"left\\\":\\\"74.70966599999998%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#708489\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":1377.425560317069,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763017918861-7\\\",\\\"y\\\":472.23915709540506,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"47.610943%\\\",\\\"left\\\":\\\"71.14930699999998%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"1230\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":1402.7479415743262,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763017900379-6\\\",\\\"y\\\":170.90269362302482,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"17.230333999999996%\\\",\\\"left\\\":\\\"72.457305%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"2200\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":1470.4091186376554,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763017893992-5\\\",\\\"y\\\":181.90268235601428,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.339347999999998%\\\",\\\"left\\\":\\\"75.95226399999999%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":105.99999849552168,\\\"x\\\":1334.3129980877375,\\\"h\\\":39.99999690049243,\\\"i\\\":\\\"es-drager-1763017881010-4\\\",\\\"y\\\":173.38686440729214,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"17.480787%\\\",\\\"left\\\":\\\"68.92237799999998%\\\",\\\"width\\\":\\\"5.475305999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.032781999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"总额\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":105.9999984955217,\\\"height\\\":39.99999690049243},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#8699B0\\\",\\\"letterSpacing\\\":0,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":184.99998605069177,\\\"x\\\":389.9085438694022,\\\"h\\\":43.00000013957801,\\\"i\\\":\\\"es-drager-1763017409384-5\\\",\\\"y\\\":739.5322357873163,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"74.55931299999999%\\\",\\\"left\\\":\\\"20.140269999999997%\\\",\\\"width\\\":\\\"9.555958000000004%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.335241%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"9000万元(不含税)\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":184.99998605069177,\\\"height\\\":43.00000013957801},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":152.9999974631653,\\\"x\\\":244.3048032410551,\\\"h\\\":43.00000013957801,\\\"i\\\":\\\"es-drager-1763017400479-4\\\",\\\"y\\\":740.7983591741861,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"74.68696299999999%\\\",\\\"left\\\":\\\"12.619278999999997%\\\",\\\"width\\\":\\\"7.903035999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.335241%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"9000万元(含税)\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":152.9999974631653,\\\"height\\\":43.00000013957801},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":104.00001130858149,\\\"x\\\":146.94255710654164,\\\"h\\\":43.00000013957801,\\\"i\\\":\\\"es-drager-1763017390547-3\\\",\\\"y\\\":738.3950754735062,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"74.444665%\\\",\\\"left\\\":\\\"7.590145999999999%\\\",\\\"width\\\":\\\"5.371999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.335241%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"金额总计：\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":104.00001130858149,\\\"height\\\":43.00000013957801},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":2.0000065465885113,\\\"x\\\":356.9167604994608,\\\"h\\\":46.99999784588518,\\\"i\\\":\\\"es-drager-1763017303728-1\\\",\\\"y\\\":449.8429073101763,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.35296299999999%\\\",\\\"left\\\":\\\"18.436117999999997%\\\",\\\"width\\\":\\\"0.10330799999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.738519000000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":2.0000065465885113,\\\"height\\\":46.999997845885176},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_10_1763552829448.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":2.0000065465885113,\\\"x\\\":188.6517965095428,\\\"h\\\":46.99999784588518,\\\"i\\\":\\\"400b89c1-02d8-4517-95e5-f56241d063f2\\\",\\\"y\\\":447.4396236094965,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.110665000000004%\\\",\\\"left\\\":\\\"9.744587999999998%\\\",\\\"width\\\":\\\"0.10330799999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.738519000000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":2.0000065465885113,\\\"height\\\":46.999997845885176},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_10_1763552829448.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":0,\\\"x\\\":197.5146628609848,\\\"h\\\":57.99999649758506,\\\"i\\\":\\\"es-drager-1763016996412-1\\\",\\\"y\\\":449.71395415582697,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.339961999999986%\\\",\\\"left\\\":\\\"10.202389%\\\",\\\"width\\\":\\\"0%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.847534%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":0,\\\"height\\\":57.99999649758506},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#F0111100\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_10_1763552829448.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":95.0000012085815,\\\"x\\\":373.7924884840798,\\\"h\\\":35.999999194185264,\\\"i\\\":\\\"es-drager-1763016703941-11\\\",\\\"y\\\":504.09847159449055,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.82298499999999%\\\",\\\"left\\\":\\\"19.307814%\\\",\\\"width\\\":\\\"4.907114%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.6295039999999985%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同类型\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":95.0000012085815,\\\"height\\\":35.999999194185264},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":105.99999849552168,\\\"x\\\":388.65065072110207,\\\"h\\\":39.99999690049243,\\\"i\\\":\\\"es-drager-1763016588015-10\\\",\\\"y\\\":460.9249733720053,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"46.470252%\\\",\\\"left\\\":\\\"20.075294999999997%\\\",\\\"width\\\":\\\"5.475305999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.032781999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"累计未付款\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":105.9999984955217,\\\"height\\\":39.99999690049243},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#7B959F\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":105.99999849552168,\\\"x\\\":222.78897411151232,\\\"h\\\":39.99999690049243,\\\"i\\\":\\\"es-drager-1763016583354-9\\\",\\\"y\\\":460.9249733720053,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"46.470252%\\\",\\\"left\\\":\\\"11.507903999999998%\\\",\\\"width\\\":\\\"5.475305999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.032781999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"累计已付款\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":105.9999984955217,\\\"height\\\":39.99999690049243},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#7B959F\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":447.38451316379843,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763016573207-8\\\",\\\"y\\\":442.7233263917942,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"44.635169999999995%\\\",\\\"left\\\":\\\"23.109123999999998%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#708489\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":275.1922509197187,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763016567041-7\\\",\\\"y\\\":442.7233263917942,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"44.635169999999995%\\\",\\\"left\\\":\\\"14.214733999999998%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#708489\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":382.25555873847594,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763016557285-6\\\",\\\"y\\\":430.45721427193484,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"43.39850599999999%\\\",\\\"left\\\":\\\"19.744963999999996%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"1230\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":217.66002248736228,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763016551841-5\\\",\\\"y\\\":431.7233277400944,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"43.52615500000001%\\\",\\\"left\\\":\\\"11.242974%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"800\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":0,\\\"x\\\":187.5146301280422,\\\"h\\\":57.99999649758506,\\\"i\\\":\\\"es-drager-1763016537923-4\\\",\\\"y\\\":439.7139499713487,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"44.331765999999995%\\\",\\\"left\\\":\\\"9.685848999999997%\\\",\\\"width\\\":\\\"0%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.847534%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":0,\\\"height\\\":57.99999649758506},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_10_1763552829448.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":105.99999849552168,\\\"x\\\":53.257889122766706,\\\"h\\\":39.99999690049243,\\\"i\\\":\\\"es-drager-1763016385655-3\\\",\\\"y\\\":461.05392652635453,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"46.48325299999999%\\\",\\\"left\\\":\\\"2.7509739999999994%\\\",\\\"width\\\":\\\"5.475305999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.032781999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同总金额\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":105.9999984955217,\\\"height\\\":39.99999690049243},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#7B959F\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":113.25791128358735,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"es-drager-1763016372630-2\\\",\\\"y\\\":437.787805836085,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"44.137573%\\\",\\\"left\\\":\\\"5.850204999999999%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#708489\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":50.66119885592028,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"es-drager-1763016365675-1\\\",\\\"y\\\":426.787807184385,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"43.02855799999999%\\\",\\\"left\\\":\\\"2.6168449999999996%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"1230\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JLine\\\",\\\"visible\\\":true,\\\"w\\\":552.0000064111372,\\\"x\\\":15.451341860937866,\\\"h\\\":233.00000029498267,\\\"i\\\":\\\"3929a3a9-910f-45e8-8950-5ba4570f2579\\\",\\\"y\\\":758.8710430813375,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"76.509043%\\\",\\\"left\\\":\\\"0.7981209999999999%\\\",\\\"width\\\":\\\"28.512914999999992%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"23.490956999999995%\\\"},\\\"componentName\\\":\\\"基础折线图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 150,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1日\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 830,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5日\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 300,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"10日\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 780,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"15日\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 900,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"20\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 430,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"25日\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 900,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"30\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":552.0000064111372,\\\"height\\\":233.00000029498267},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#89B9F063\\\"},\\\"show\\\":true,\\\"interval\\\":2},\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color1\\\":\\\"#1e90ff\\\",\\\"color\\\":\\\"#46B4F9\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":30,\\\"left\\\":0,\\\"bottom\\\":18,\\\"show\\\":false,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"symbol\\\":\\\"circle\\\",\\\"areaStyleOpacity\\\":0.1,\\\"data\\\":[],\\\"symbolSize\\\":6,\\\"lineType\\\":\\\"area\\\",\\\"itemStyle\\\":{\\\"color\\\":\\\"#64b5f6\\\"},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"position\\\":\\\"top\\\"},\\\"type\\\":\\\"line\\\"}],\\\"tooltip\\\":{\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"subtext\\\":\\\"\\\",\\\"textAlign\\\":\\\"left\\\",\\\"left\\\":10,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JRing\\\",\\\"visible\\\":true,\\\"w\\\":472.99999949631894,\\\"x\\\":0,\\\"h\\\":240.00000124037547,\\\"i\\\":\\\"d8501550-3c20-41f7-92c8-06ba3e833884\\\",\\\"y\\\":468.9918010555223,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"47.283546%\\\",\\\"left\\\":\\\"0%\\\",\\\"width\\\":\\\"24.432261999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"24.196694%\\\"},\\\"componentName\\\":\\\"饼状环形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 350,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"监理\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 250,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"施工\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 400,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"采购\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":472.99999949631894,\\\"height\\\":240.00000124037547},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":480,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"customColor\\\":[{\\\"color1\\\":\\\"#1E90FF38\\\",\\\"color\\\":\\\"#2A7DFB\\\"},{\\\"color1\\\":\\\"#2BE4E3\\\",\\\"color\\\":\\\"#2BE4E34C\\\"},{\\\"color1\\\":\\\"#FCA52F4F\\\",\\\"color\\\":\\\"#FCA52F\\\"}],\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":50,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":14,\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\",\\\"t\\\":31,\\\"show\\\":true},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"outRadius\\\":65,\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"innerRadius\\\":77,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":154.00000073645958,\\\"x\\\":1341.18520860272,\\\"h\\\":35.999999194185264,\\\"i\\\":\\\"es-drager-1762488458149-6\\\",\\\"y\\\":766.0480731705519,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"77.23262799999999%\\\",\\\"left\\\":\\\"69.27735399999999%\\\",\\\"width\\\":\\\"7.95469%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.6295039999999985%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"采购与审批提醒\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":154.00000073645958,\\\"height\\\":35.999999194185264},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":192.00000896375147,\\\"x\\\":1348.781934595686,\\\"h\\\":35.999999194185264,\\\"i\\\":\\\"es-drager-1762488430111-5\\\",\\\"y\\\":434.1688155536699,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"43.772707999999994%\\\",\\\"left\\\":\\\"69.669754%\\\",\\\"width\\\":\\\"9.917535999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.6295039999999985%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"档案归档与资料管理\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":192.0000089637515,\\\"height\\\":35.999999194185264},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":180.00002776316535,\\\"x\\\":1316.2579190479719,\\\"h\\\":35.999999194185264,\\\"i\\\":\\\"es-drager-1762488401037-4\\\",\\\"y\\\":11.532246572286056,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.1626759999999992%\\\",\\\"left\\\":\\\"67.98976399999998%\\\",\\\"width\\\":\\\"9.297691%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.6295039999999985%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"成本与投资控制\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":180.00002776316535,\\\"height\\\":35.999999194185264},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":95.0000012085815,\\\"x\\\":687.9191023369988,\\\"h\\\":35.999999194185264,\\\"i\\\":\\\"es-drager-1762488353166-3\\\",\\\"y\\\":711.8710452354521,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"71.770524%\\\",\\\"left\\\":\\\"35.53365699999999%\\\",\\\"width\\\":\\\"4.907114%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.6295039999999985%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"实时动态\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":95.0000012085815,\\\"height\\\":35.999999194185264},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":104.00001130858149,\\\"x\\\":34.386878345744435,\\\"h\\\":43.00000013957801,\\\"i\\\":\\\"es-drager-1762488324502-2\\\",\\\"y\\\":696.7420858043853,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"70.24522899999998%\\\",\\\"left\\\":\\\"1.776214%\\\",\\\"width\\\":\\\"5.371999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.335241%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"金额统计\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":104.00001130858149,\\\"height\\\":43.00000013957801},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":169.99999503022275,\\\"x\\\":36.71747024670575,\\\"h\\\":60.000005269449076,\\\"i\\\":\\\"es-drager-1762488293431-1\\\",\\\"y\\\":373.32239712935564,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"37.63819899999999%\\\",\\\"left\\\":\\\"1.896598%\\\",\\\"width\\\":\\\"8.781150999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.049174%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同与资金执行\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":169.99999503022275,\\\"height\\\":60.000005269449076},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":559.9999938781947,\\\"x\\\":1314.9191025697774,\\\"h\\\":37.000003580117294,\\\"i\\\":\\\"es-drager-1762486958682-7\\\",\\\"y\\\":767.3141866387114,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"77.360277%\\\",\\\"left\\\":\\\"67.92060899999998%\\\",\\\"width\\\":\\\"28.926144999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7303240000000013%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146619422332997632\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":559.9999938781947,\\\"height\\\":37.000003580117294},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":559.9999938781947,\\\"x\\\":1326.5803092847598,\\\"h\\\":37.000003580117294,\\\"i\\\":\\\"es-drager-1762486938386-6\\\",\\\"y\\\":436.43494332647174,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"44.00117799999999%\\\",\\\"left\\\":\\\"68.522955%\\\",\\\"width\\\":\\\"28.926144999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7303240000000013%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146619422374940672\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":559.9999938781947,\\\"height\\\":37.000003580117294},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":559.9999938781947,\\\"x\\\":1306.0562749376322,\\\"h\\\":37.000003580117294,\\\"i\\\":\\\"es-drager-1762486909420-5\\\",\\\"y\\\":15.532234359882779,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.565952999999999%\\\",\\\"left\\\":\\\"67.46281%\\\",\\\"width\\\":\\\"28.926144999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7303240000000013%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146619422395912192\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":559.9999938781947,\\\"height\\\":37.000003580117294},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":623.9999904128958,\\\"x\\\":662.9191173028839,\\\"h\\\":37.000003580117294,\\\"i\\\":\\\"es-drager-1762486901803-4\\\",\\\"y\\\":715.8710429417594,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"72.173802%\\\",\\\"left\\\":\\\"34.24231199999999%\\\",\\\"width\\\":\\\"32.23199%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7303240000000013%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146619422416883712\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":623.9999904128958,\\\"height\\\":37.000003580117294},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":559.9999938781947,\\\"x\\\":12.653001497397423,\\\"h\\\":37.000003580117294,\\\"i\\\":\\\"es-drager-1762486889055-3\\\",\\\"y\\\":702.7420922825565,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"70.85014699999999%\\\",\\\"left\\\":\\\"0.6535759999999999%\\\",\\\"width\\\":\\\"28.926144999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7303240000000013%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146619422433660928\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":559.9999938781947,\\\"height\\\":37.000003580117294},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":559.9999938781947,\\\"x\\\":23.919097150222747,\\\"h\\\":37.000003580117294,\\\"i\\\":\\\"es-drager-1762486883913-2\\\",\\\"y\\\":386.3223946342091,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"38.94885299999999%\\\",\\\"left\\\":\\\"1.2355129999999999%\\\",\\\"width\\\":\\\"28.926144999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7303240000000013%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146619422450438144\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":559.9999938781947,\\\"height\\\":37.000003580117294},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JPictorialBar\\\",\\\"visible\\\":true,\\\"w\\\":450.00000164914417,\\\"x\\\":191.58031114825323,\\\"h\\\":224.00000049643637,\\\"i\\\":\\\"68308968-04f1-4f24-b8de-632455eb043c\\\",\\\"y\\\":73.06447439212201,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"7.366327999999999%\\\",\\\"left\\\":\\\"9.895856999999998%\\\",\\\"width\\\":\\\"23.244223999999996%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"22.583580999999995%\\\"},\\\"componentName\\\":\\\"象形柱图\\\",\\\"pageCompId\\\":\\\"1146619422463021056\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/pictogram\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"前期\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3900,\\\\n    \\\\\\\"symbol\\\\\\\": \\\\\\\"\\\\\\\",\\\\n    \\\\\\\"symbolSize\\\\\\\": [\\\\n      60,\\\\n      60\\\\n    ]\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"统计\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3000,\\\\n    \\\\\\\"symbol\\\\\\\": \\\\\\\"\\\\\\\",\\\\n    \\\\\\\"symbolSize\\\\\\\": [\\\\n      65,\\\\n      35\\\\n    ]\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"施工\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2000,\\\\n    \\\\\\\"symbol\\\\\\\": \\\\\\\"\\\\\\\",\\\\n    \\\\\\\"symbolSize\\\\\\\": [\\\\n      50,\\\\n      60\\\\n    ]\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"竣工\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2900,\\\\n    \\\\\\\"symbol\\\\\\\": \\\\\\\"\\\\\\\",\\\\n    \\\\\\\"symbolSize\\\\\\\": [\\\\n      50,\\\\n      30\\\\n    ]\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":450.0000016491442,\\\"height\\\":224.00000049643634},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#4A90E242\\\"},\\\"show\\\":true},\\\"name\\\":\\\"单位(个)\\\",\\\"yCustomUnit\\\":\\\"个\\\",\\\"yUnit\\\":\\\"CUSTOM\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"type\\\":\\\"category\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":33,\\\"left\\\":29,\\\"bottom\\\":18,\\\"right\\\":50,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barCategoryGap\\\":\\\"22%\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"barOpacity\\\":0.8,\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"barColor\\\":\\\"#4A90E2\\\",\\\"body\\\":{\\\"gradient\\\":{\\\"type\\\":\\\"linear\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"barGradient\\\":{\\\"endColor\\\":\\\"#7357FB68\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#06E5FF\\\",\\\"direction\\\":\\\"to bottom\\\"}}}},{\\\"visible\\\":true,\\\"h\\\":39.99999690049243,\\\"i\\\":\\\"b0c2258f-39ba-48dc-95b1-5094042732c1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":105.99999849552168,\\\"x\\\":63.515831090363434,\\\"y\\\":173.773743707761,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"17.519791999999995%\\\",\\\"left\\\":\\\"3.2808360000000003%\\\",\\\"width\\\":\\\"5.475305999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.032781999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422479798272\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"在建项目数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":105.9999984955217,\\\"height\\\":39.99999690049243},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#879FA9\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":49.00000551423213,\\\"x\\\":126.0480565295428,\\\"h\\\":32.000001487878116,\\\"i\\\":\\\"f5a20b4d-547f-403e-8164-dcfcafe4d980\\\",\\\"y\\\":154.30597334068014,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.55706%\\\",\\\"left\\\":\\\"6.510864999999999%\\\",\\\"width\\\":\\\"2.5310379999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.226226%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422496575488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":49.00000551423213,\\\"height\\\":32.000001487878116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#7A9AE9\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#F1F0FF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":87.99999765517,\\\"x\\\":52.05629383172334,\\\"h\\\":48.00000223181718,\\\"i\\\":\\\"6b21b6f5-8acb-4f3e-8b78-8c294a480972\\\",\\\"y\\\":142.03986122082082,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"14.320396000000002%\\\",\\\"left\\\":\\\"2.688907%\\\",\\\"width\\\":\\\"4.545537%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.839339%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422517547008\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"3531\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":87.99999765517,\\\"height\\\":48.00000223181718},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"fontFamily\\\":\\\"DIGITALDREAMFAT\\\",\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#7A9AE9\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#F1F0FF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":28,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":144.99999063645956,\\\"x\\\":39.84641532426729,\\\"h\\\":59.999995350738644,\\\"i\\\":\\\"291a3240-8c51-43d7-8439-01a320e34d6d\\\",\\\"y\\\":0,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0%\\\",\\\"left\\\":\\\"2.0582199999999995%\\\",\\\"width\\\":\\\"7.489804999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.049173%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146619422542712832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目总体概览\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":144.99999063645956,\\\"height\\\":59.99999535073864},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":571.9999944384291,\\\"x\\\":18.185233955287224,\\\"h\\\":37.000003580117294,\\\"i\\\":\\\"7d88daeb-170a-488b-83a6-a5602963ead6\\\",\\\"y\\\":14.266120891723347,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.438304%\\\",\\\"left\\\":\\\"0.939337%\\\",\\\"width\\\":\\\"29.545990999999994%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7303240000000013%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146619422567878656\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":571.9999944384291,\\\"height\\\":37.000003580117294},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":165.00001738304806,\\\"x\\\":31.910876126400943,\\\"h\\\":145.00000116267307,\\\"i\\\":\\\"3b982fd0-aee7-496b-8e5e-6c2428fdf509\\\",\\\"y\\\":106.8534541686754,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"10.772917999999999%\\\",\\\"left\\\":\\\"1.6483189999999999%\\\",\\\"width\\\":\\\"8.522882999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"14.618835999999996%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":165.00001738304806,\\\"height\\\":145.00000116267307},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/组 146 拷贝_1763552659762.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":1162.000009076858,\\\"x\\\":401.48886597378663,\\\"h\\\":774.9999969796257,\\\"i\\\":\\\"es-drager-1762944604977-2\\\",\\\"y\\\":26.95897560928492,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"2.717992000000001%\\\",\\\"left\\\":\\\"20.738437999999995%\\\",\\\"width\\\":\\\"60.021751999999985%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"78.13515699999999%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1162.000009076858,\\\"height\\\":774.9999969796257},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/建设地图背景_1763552692372.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}}]},\\\"component\\\":\\\"JGroup\\\",\\\"w\\\":1935.9648300117237,\\\"x\\\":-2,\\\"y\\\":84,\\\"componentName\\\":\\\"建设\\\",\\\"pageCompId\\\":\\\"1151112776882114560\\\",\\\"equalProportion\\\":false,\\\"key\\\":\\\"3eb04442-3a1d-48c3-8729-1e6ccdf2407d\\\",\\\"group\\\":true},{\\\"visible\\\":false,\\\"h\\\":993.0175920371283,\\\"i\\\":\\\"es-drager-1762481722941-1\\\",\\\"props\\\":{\\\"elements\\\":[{\\\"component\\\":\\\"JBreakRing\\\",\\\"visible\\\":true,\\\"w\\\":714.0000045348538,\\\"x\\\":0,\\\"h\\\":200.000004320926,\\\"i\\\":\\\"aca7fa88-9971-4e8c-8a35-8df42aef1ae2\\\",\\\"y\\\":793.0175877162023,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"79.85936946890986%\\\",\\\"left\\\":\\\"0%\\\",\\\"width\\\":\\\"35.018293000000014%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"20.14063053109014%\\\"},\\\"componentName\\\":\\\"多色环形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":400,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 109,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"受限空间\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 171,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"临电\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 73,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"动火\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 29,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"高处\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 73,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"动土\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 88,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"吊装\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"断路\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":714.0000045348538,\\\"height\\\":200.000004320926},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":550,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"customColor\\\":[{\\\"color\\\":\\\"#326CF1B3\\\"},{\\\"color\\\":\\\"#0036FFB3\\\"},{\\\"color\\\":\\\"#FC00FFB3\\\"},{\\\"color\\\":\\\"#FF5B01B3\\\"},{\\\"color\\\":\\\"#FFEB0BB3\\\"},{\\\"color\\\":\\\"#00FF96B3\\\"},{\\\"color\\\":\\\"#00FCFFB3\\\"}],\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":50,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":14,\\\"fontWeight\\\":\\\"bold\\\"}},\\\"itemStyle\\\":{\\\"shadowBlur\\\":21,\\\"borderWidth\\\":5},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true,\\\"fontSize\\\":12,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"length2\\\":36,\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\",\\\"t\\\":13},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\"},\\\"outRadius\\\":68,\\\"title\\\":{\\\"subtext\\\":\\\"{total}条\\\",\\\"top\\\":33,\\\"textAlign\\\":\\\"\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":true,\\\"customTop\\\":true,\\\"text\\\":\\\"总数\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontSize\\\":22,\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontSize\\\":24}},\\\"innerRadius\\\":60,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JListProgress\\\",\\\"visible\\\":true,\\\"w\\\":498.00000950250893,\\\"x\\\":878.5580325518055,\\\"h\\\":71.00000054406586,\\\"i\\\":\\\"es-drager-1763373026447-1\\\",\\\"y\\\":619.4302483462973,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"62.37857751095483%\\\",\\\"left\\\":\\\"43.089079000000005%\\\",\\\"width\\\":\\\"24.424524000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"7.14992373885469%\\\"},\\\"componentName\\\":\\\"列表进度图\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"作业投入\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 19,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-12-31\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-06-15\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"作业进度\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 685,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-20\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-05-30\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 685\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":498.00000950250893,\\\"height\\\":71.00000054406586},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":1200,\\\"dataType\\\":1,\\\"h\\\":325,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"beginFields\\\":[{\\\"name\\\":\\\"名称\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"title\\\"}],\\\"endCurrent\\\":0,\\\"endInfo\\\":{\\\"width\\\":41},\\\"scroll\\\":{\\\"count\\\":1,\\\"interval\\\":3000,\\\"enabled\\\":false,\\\"direction\\\":\\\"down\\\"},\\\"centerTopFields\\\":[],\\\"body\\\":{\\\"gradient\\\":{\\\"type\\\":\\\"linear\\\"}},\\\"endFields\\\":[{\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"name\\\":\\\"value\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CFEAFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"value\\\",\\\"marginLeft\\\":0}],\\\"beginCurrent\\\":0,\\\"progressSection\\\":{\\\"marginRight\\\":8,\\\"marginLeft\\\":8},\\\"bar\\\":{\\\"border\\\":{\\\"padding\\\":8,\\\"color\\\":\\\"#4ECBFC5E\\\",\\\"width\\\":2,\\\"enabled\\\":false},\\\"total\\\":{\\\"field\\\":\\\"total\\\",\\\"type\\\":\\\"field\\\",\\\"value\\\":0},\\\"borderRadius\\\":6,\\\"background\\\":{\\\"color\\\":\\\"#5A97FC4F\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#07203D\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#143B6E\\\"}},\\\"indicatorColor\\\":\\\"#DCFEFFB5\\\",\\\"exceed\\\":{\\\"indicatorColor\\\":\\\"#FEF8C9E1\\\",\\\"fill\\\":{\\\"color\\\":\\\"#FFB347\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FEAF24\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FEF6C8\\\",\\\"direction\\\":\\\"to right\\\"}},\\\"percent\\\":70,\\\"enabled\\\":true},\\\"indicatorSize\\\":15,\\\"fill\\\":{\\\"color\\\":\\\"#33C9FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#24E5F1\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#C5FDFE\\\"}},\\\"valueField\\\":\\\"value\\\",\\\"height\\\":4},\\\"centerTopInfo\\\":{\\\"layout\\\":\\\"horizontal\\\"},\\\"centerTopCurrent\\\":0,\\\"row\\\":{\\\"marginRight\\\":0,\\\"padding\\\":\\\"0 0\\\",\\\"marginBottom\\\":0,\\\"marginTop\\\":10,\\\"height\\\":20,\\\"marginLeft\\\":0},\\\"beginInfo\\\":{\\\"layout\\\":\\\"vertical\\\",\\\"width\\\":85}}}},{\\\"component\\\":\\\"JListProgress\\\",\\\"visible\\\":true,\\\"w\\\":498.00000950250893,\\\"x\\\":881.2192292752404,\\\"h\\\":71.00000054406586,\\\"i\\\":\\\"d99071e1-0ca9-4ec4-8eb5-97b53b13ff72\\\",\\\"y\\\":535.9953136910605,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"53.976416731096535%\\\",\\\"left\\\":\\\"43.219598000000005%\\\",\\\"width\\\":\\\"24.424524000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"7.14992373885469%\\\"},\\\"componentName\\\":\\\"列表进度图\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"作业投入\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 19,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-12-31\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-06-15\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"作业进度\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 685,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-20\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-05-30\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 685\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":498.00000950250893,\\\"height\\\":71.00000054406586},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":1200,\\\"dataType\\\":1,\\\"h\\\":325,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"beginFields\\\":[{\\\"name\\\":\\\"名称\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"title\\\"}],\\\"endCurrent\\\":0,\\\"endInfo\\\":{\\\"width\\\":41},\\\"scroll\\\":{\\\"count\\\":1,\\\"interval\\\":3000,\\\"enabled\\\":false,\\\"direction\\\":\\\"down\\\"},\\\"centerTopFields\\\":[],\\\"body\\\":{\\\"gradient\\\":{\\\"type\\\":\\\"linear\\\"}},\\\"endFields\\\":[{\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"name\\\":\\\"value\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CFEAFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"value\\\",\\\"marginLeft\\\":0}],\\\"beginCurrent\\\":0,\\\"progressSection\\\":{\\\"marginRight\\\":8,\\\"marginLeft\\\":8},\\\"bar\\\":{\\\"border\\\":{\\\"padding\\\":8,\\\"color\\\":\\\"#4ECBFC5E\\\",\\\"width\\\":2,\\\"enabled\\\":false},\\\"total\\\":{\\\"field\\\":\\\"total\\\",\\\"type\\\":\\\"field\\\",\\\"value\\\":0},\\\"borderRadius\\\":6,\\\"background\\\":{\\\"color\\\":\\\"#5A97FC4F\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#07203D\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#143B6E\\\"}},\\\"indicatorColor\\\":\\\"#DCFEFFB3\\\",\\\"exceed\\\":{\\\"indicatorColor\\\":\\\"#FEF8C9BD\\\",\\\"fill\\\":{\\\"color\\\":\\\"#FFB347\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FEAF24\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FEF6C8\\\",\\\"direction\\\":\\\"to right\\\"}},\\\"percent\\\":70,\\\"enabled\\\":true},\\\"indicatorSize\\\":15,\\\"fill\\\":{\\\"color\\\":\\\"#33C9FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#24E5F1\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#C5FDFE\\\"}},\\\"valueField\\\":\\\"value\\\",\\\"height\\\":4},\\\"centerTopInfo\\\":{\\\"layout\\\":\\\"horizontal\\\"},\\\"centerTopCurrent\\\":0,\\\"row\\\":{\\\"marginRight\\\":0,\\\"padding\\\":\\\"0 0\\\",\\\"marginBottom\\\":0,\\\"marginTop\\\":10,\\\"height\\\":20,\\\"marginLeft\\\":0},\\\"beginInfo\\\":{\\\"layout\\\":\\\"vertical\\\",\\\"width\\\":85}}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":323.0000073915475,\\\"x\\\":906.8179276953341,\\\"h\\\":2.99999709522538,\\\"i\\\":\\\"es-drager-1762941799018-34\\\",\\\"y\\\":242.1698934071885,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.387271217460356%\\\",\\\"left\\\":\\\"44.475092%\\\",\\\"width\\\":\\\"15.841609000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"0.3021091589194335%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":323.0000073915475,\\\"height\\\":2.99999709522538},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_26_1763552267080.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371568519-13\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":42.00000866236812,\\\"x\\\":419.7991700328957,\\\"y\\\":217.93813036363792,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.947056337294914%\\\",\\\"left\\\":\\\"20.589146%\\\",\\\"width\\\":\\\"2.0599000000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"条\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":42.00000866236812,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371480202-12\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":42.00000866236812,\\\"x\\\":636.8761097992264,\\\"y\\\":210.70737041841926,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.218896030448274%\\\",\\\"left\\\":\\\"31.235734000000004%\\\",\\\"width\\\":\\\"2.0599000000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"公里\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":42.00000866236812,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371473970-11\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":42.00000866236812,\\\"x\\\":507.799168764197,\\\"y\\\":213.16890192795518,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.46678000846383%\\\",\\\"left\\\":\\\"24.905126000000003%\\\",\\\"width\\\":\\\"2.0599000000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"架次\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":42.00000866236812,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371446932-9\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":52.000002957467785,\\\"x\\\":359.95302146961313,\\\"y\\\":183.01505679779882,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.430192804777217%\\\",\\\"left\\\":\\\"17.653978000000002%\\\",\\\"width\\\":\\\"2.550352000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"56\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":52.000002957467785,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#02DEFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371270168-8\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":52.000002957467785,\\\"x\\\":470.4145734524033,\\\"y\\\":211.78429169116976,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.32734539543296%\\\",\\\"left\\\":\\\"23.07159%\\\",\\\"width\\\":\\\"2.550352000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"45\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":52.000002957467785,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#02DEFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371262441-7\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":52.000002957467785,\\\"x\\\":599.1837985154281,\\\"y\\\":210.39967155575596,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.18790978557903%\\\",\\\"left\\\":\\\"29.387106000000006%\\\",\\\"width\\\":\\\"2.550352000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"80\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":52.000002957467785,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#02DEFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371256473-6\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":52.000002957467785,\\\"x\\\":387.3376428756507,\\\"y\\\":217.3227524355682,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.88508584120256%\\\",\\\"left\\\":\\\"18.997063000000004%\\\",\\\"width\\\":\\\"2.550352000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"17\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":52.000002957467785,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#02DEFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371251576-5\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":83.99999693539274,\\\"x\\\":318.41456637590863,\\\"y\\\":217.630441399603,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.91607108924873%\\\",\\\"left\\\":\\\"15.616715000000003%\\\",\\\"width\\\":\\\"4.119799%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"线上执勤\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":83.99999693539274,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371243864-4\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":42.00000866236812,\\\"x\\\":394.26072212282537,\\\"y\\\":184.09197807054932,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.538642169761907%\\\",\\\"left\\\":\\\"19.336607000000004%\\\",\\\"width\\\":\\\"2.0599000000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"条\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":42.00000866236812,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371236206-3\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":107.00001235920283,\\\"x\\\":605.0299330286167,\\\"y\\\":180.2458264255996,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.15132258189242%\\\",\\\"left\\\":\\\"29.673831%\\\",\\\"width\\\":\\\"5.247840000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"日巡检里程\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":107.00001235920283,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371219393-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":110.9999937657679,\\\"x\\\":484.5684071400704,\\\"y\\\":178.8612062901858,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.01188697203849%\\\",\\\"left\\\":\\\"23.765768000000005%\\\",\\\"width\\\":\\\"5.444020000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"每日计划飞行\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":110.9999937657679,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763371210351-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":70.99999619602579,\\\"x\\\":309.7991716187691,\\\"y\\\":182.70736783376395,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.399207556731042%\\\",\\\"left\\\":\\\"15.194171%\\\",\\\"width\\\":\\\"3.4822109999999995%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"总计\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":70.99999619602579,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763370911329-4\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":42.00000866236812,\\\"x\\\":197.33764932203988,\\\"y\\\":214.24583309933405,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.57523037027158%\\\",\\\"left\\\":\\\"9.67847%\\\",\\\"width\\\":\\\"2.0599000000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"版\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":42.00000866236812,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763370895588-3\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":52.000002957467785,\\\"x\\\":172.41455179860495,\\\"y\\\":212.86121296392025,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.435794760417647%\\\",\\\"left\\\":\\\"8.456111000000002%\\\",\\\"width\\\":\\\"2.550352000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"3\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":52.000002957467785,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#02DEFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763370887375-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":140.99999704041034,\\\"x\\\":182.10687090038692,\\\"y\\\":183.7842891065145,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.507656921715736%\\\",\\\"left\\\":\\\"8.931473000000002%\\\",\\\"width\\\":\\\"6.915377%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"无人机航线设计\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":140.99999704041034,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#C9E6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":311.0000020038218,\\\"x\\\":915.2682911062369,\\\"h\\\":0,\\\"i\\\":\\\"es-drager-1763370612716-1\\\",\\\"y\\\":242.05284212679635,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.375483784757172%\\\",\\\"left\\\":\\\"44.889542000000006%\\\",\\\"width\\\":\\\"15.253065999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"0%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":311.0000020038218,\\\"height\\\":0},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_26_1763552300046.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763370022040-3\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":323.9999823538453,\\\"x\\\":355.79916168770234,\\\"y\\\":87.47659410898373,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.80916862001706%\\\",\\\"left\\\":\\\"17.450251000000005%\\\",\\\"width\\\":\\\"15.890653000000004%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"座  服务于岸线公园巡检和河道巡检\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":323.9999823538453,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763370010036-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":48.00000116155921,\\\"x\\\":319.49149072055104,\\\"y\\\":87.16890514494884,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.778183371970881%\\\",\\\"left\\\":\\\"15.669533000000001%\\\",\\\"width\\\":\\\"2.3541710000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"4\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":48.00000116155921,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#96F5F8\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#49ABFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1763369998907-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":94.00001161983592,\\\"x\\\":244.414543346272,\\\"y\\\":86.86121618091394,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.7471981239247%\\\",\\\"left\\\":\\\"11.987367%\\\",\\\"width\\\":\\\"4.610252000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"建设机场 \\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":94.00001161983592,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":36.9999911254748,\\\"x\\\":197.3896625372919,\\\"h\\\":33.99999677510606,\\\"i\\\":\\\"83560363-065f-4d4a-9be8-fb9b83e84040\\\",\\\"y\\\":88.55514865541414,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.91778246080691%\\\",\\\"left\\\":\\\"9.681021%\\\",\\\"width\\\":\\\"1.8146730000000004%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.423906791556098%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":36.9999911254748,\\\"height\\\":33.99999677510606},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_03_1763552101512.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JStatsSummary\\\",\\\"visible\\\":true,\\\"w\\\":595.0000071772687,\\\"x\\\":785.8511946537046,\\\"h\\\":85.00000678570775,\\\"i\\\":\\\"51a9c871-5835-4847-8271-f62c0698fa18\\\",\\\"y\\\":107.93976126080858,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"10.869874021000504%\\\",\\\"left\\\":\\\"38.542251%\\\",\\\"width\\\":\\\"29.18191100000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"8.559768474124843%\\\"},\\\"componentName\\\":\\\"统计概览（背景模式）\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"人员总数\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 681,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"人\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"2\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"车辆总数\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 155,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"辆\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"3\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"道路总里程\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 336,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"公里\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":595.0000071772687,\\\"height\\\":85.00000678570775},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":713,\\\"dataType\\\":1,\\\"h\\\":129,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"layout\\\":{\\\"padding\\\":{\\\"top\\\":5,\\\"left\\\":20,\\\"bottom\\\":0,\\\"right\\\":20},\\\"borderColor\\\":\\\"#0f66ff59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"justify\\\":\\\"space-between\\\",\\\"borderWidth\\\":0,\\\"gap\\\":16,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"contain\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"drag/lib/img/bg01.png\\\"},\\\"color\\\":\\\"#0b2b63\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"image\\\"}},\\\"fieldMap\\\":{\\\"compareValue\\\":\\\"compareValue\\\",\\\"unit\\\":\\\"suffix\\\",\\\"negativeValue\\\":\\\"0\\\",\\\"compareState\\\":\\\"compareState\\\",\\\"label\\\":\\\"name\\\",\\\"value\\\":\\\"value\\\",\\\"positiveValue\\\":\\\"1\\\",\\\"compareLabel\\\":\\\"compareLabel\\\"},\\\"card\\\":{\\\"padding\\\":{\\\"horizontal\\\":3,\\\"vertical\\\":15},\\\"borderColor\\\":\\\"#0F66FF59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"borderWidth\\\":0,\\\"blur\\\":24,\\\"minWidth\\\":100,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"cover\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"\\\"},\\\"color\\\":\\\"#0B2B6300\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"none\\\"}},\\\"sections\\\":{\\\"middle\\\":{\\\"compare\\\":{\\\"valueStyle\\\":{\\\"positiveGradient\\\":{\\\"endColor\\\":\\\"#15f0c5\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#15f0c5\\\"},\\\"positiveColor\\\":\\\"#15F0C5\\\",\\\"fontSize\\\":14,\\\"negativeColor\\\":\\\"#D0021B\\\",\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"negativeGradient\\\":{\\\"endColor\\\":\\\"#D0021B\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#D0021B\\\"},\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"alignItems\\\":\\\"center\\\",\\\"labelStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"fontColor\\\":\\\"#9ED3FF\\\"},\\\"label\\\":\\\"同比\\\"},\\\"paddingBottom\\\":10,\\\"show\\\":false,\\\"type\\\":\\\"compare\\\",\\\"align\\\":\\\"center\\\"},\\\"top\\\":{\\\"minHeight\\\":40,\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"paddingTop\\\":5,\\\"type\\\":\\\"value\\\",\\\"align\\\":\\\"center\\\",\\\"value\\\":{\\\"unit\\\":{\\\"fontSize\\\":16,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#96F5F8\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#49ABFF\\\"},\\\"fontWeight\\\":500,\\\"fontColor\\\":\\\"#9ED3FF\\\"},\\\"unitGap\\\":6,\\\"fontSize\\\":24,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#96F5F8\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#49ABFF\\\"},\\\"fontWeight\\\":600,\\\"fontColor\\\":\\\"#D8F1FF\\\"}},\\\"bottom\\\":{\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"label\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#C9E6FF\\\"},\\\"type\\\":\\\"label\\\",\\\"align\\\":\\\"center\\\"}}}}},{\\\"component\\\":\\\"JListProgress\\\",\\\"visible\\\":true,\\\"w\\\":508.9999991492498,\\\"x\\\":175.99061836459558,\\\"h\\\":185.99999807928413,\\\"i\\\":\\\"96a95bd1-0e5b-4cff-8138-d5e1a8fcefff\\\",\\\"y\\\":324.55333636593934,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"32.68354347077916%\\\",\\\"left\\\":\\\"8.6315%\\\",\\\"width\\\":\\\"24.964021000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"18.73078579581999%\\\"},\\\"componentName\\\":\\\"列表进度图\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"违规停车\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 500000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-12-31\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-06-15\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 262431\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"海岸线非法闯入\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 30000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-20\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-05-30\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 14305\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"配电室巡查\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 6000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2026-01-15\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-07-01\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4270\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"危险品车违规行驶\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 6000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-10-10\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-04-28\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3234\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":508.9999991492498,\\\"height\\\":185.99999807928413},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":1200,\\\"dataType\\\":1,\\\"h\\\":325,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"beginFields\\\":[{\\\"name\\\":\\\"合同名称\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"title\\\"}],\\\"endCurrent\\\":0,\\\"endInfo\\\":{\\\"width\\\":103},\\\"scroll\\\":{\\\"count\\\":1,\\\"interval\\\":3000,\\\"enabled\\\":true,\\\"direction\\\":\\\"down\\\"},\\\"centerTopFields\\\":[],\\\"body\\\":{\\\"gradient\\\":{\\\"type\\\":\\\"linear\\\"}},\\\"endFields\\\":[{\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"name\\\":\\\"数值\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#4FB9E3\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"key\\\":\\\"value\\\",\\\"marginLeft\\\":23}],\\\"beginCurrent\\\":0,\\\"progressSection\\\":{\\\"marginRight\\\":8,\\\"marginLeft\\\":8},\\\"bar\\\":{\\\"border\\\":{\\\"padding\\\":8,\\\"color\\\":\\\"#4ECBFC5E\\\",\\\"width\\\":2,\\\"enabled\\\":true},\\\"total\\\":{\\\"field\\\":\\\"total\\\",\\\"type\\\":\\\"field\\\",\\\"value\\\":0},\\\"borderRadius\\\":6,\\\"background\\\":{\\\"color\\\":\\\"#5A97FC4F\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#07203D\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#143B6E\\\"}},\\\"indicatorColor\\\":\\\"#DCFEFFB5\\\",\\\"exceed\\\":{\\\"indicatorColor\\\":\\\"#FEF8C9B3\\\",\\\"fill\\\":{\\\"color\\\":\\\"#FFB347\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FEAF24\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FEF6C8\\\",\\\"direction\\\":\\\"to right\\\"}},\\\"percent\\\":70,\\\"enabled\\\":true},\\\"indicatorSize\\\":15,\\\"fill\\\":{\\\"color\\\":\\\"#33C9FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#24E5F1\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#C5FDFE\\\"}},\\\"valueField\\\":\\\"value\\\",\\\"height\\\":6},\\\"centerTopInfo\\\":{\\\"layout\\\":\\\"horizontal\\\"},\\\"centerTopCurrent\\\":0,\\\"row\\\":{\\\"marginRight\\\":1,\\\"padding\\\":\\\"0 0\\\",\\\"marginBottom\\\":0,\\\"marginTop\\\":4,\\\"height\\\":42,\\\"marginLeft\\\":0},\\\"beginInfo\\\":{\\\"layout\\\":\\\"vertical\\\",\\\"width\\\":131}}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":3.000006444267293,\\\"x\\\":464.88365818962495,\\\"h\\\":53.99999720719867,\\\"i\\\":\\\"es-drager-1762942619160-4\\\",\\\"y\\\":186.6020326563206,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.791412574425333%\\\",\\\"left\\\":\\\"22.800325000000004%\\\",\\\"width\\\":\\\"0.14713600000000004%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.437969844665112%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":3.000006444267293,\\\"height\\\":53.99999720719867},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_22_1763552318849.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":1.9999907032825328,\\\"x\\\":866.0504140684643,\\\"h\\\":40.99999989592697,\\\"i\\\":\\\"es-drager-1762942529865-1\\\",\\\"y\\\":630.1805348963725,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.46116523510798%\\\",\\\"left\\\":\\\"42.475640000000006%\\\",\\\"width\\\":\\\"0.09809000000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.12882915919117%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1.9999907032825328,\\\"height\\\":40.99999989592697},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_22_1763552318849.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":1.9999907032825328,\\\"x\\\":869.9777278548183,\\\"h\\\":40.99999989592697,\\\"i\\\":\\\"es-drager-1762941823717-35\\\",\\\"y\\\":550.5439613083489,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"55.441511381377865%\\\",\\\"left\\\":\\\"42.66825600000001%\\\",\\\"width\\\":\\\"0.09809000000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.12882915919117%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1.9999907032825328,\\\"height\\\":40.99999989592697},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_22_1763552318849.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941725340-32\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":34.000005070551,\\\"x\\\":1291.4712878116177,\\\"y\\\":451.7116100695211,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.48878224230209%\\\",\\\"left\\\":\\\"63.34050374010456%\\\",\\\"width\\\":\\\"1.667538%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"人\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":34.000005070551,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":61.00000190092615,\\\"x\\\":1253.7456067176438,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941720287-31\\\",\\\"y\\\":451.96951883151854,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.51475446717158%\\\",\\\"left\\\":\\\"61.49023911015685%\\\",\\\"width\\\":\\\"2.9917590000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"14\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":61.00000190092615,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941657363-30\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":34.000005070551,\\\"x\\\":1091.4243899206565,\\\"y\\\":453.711612210325,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.690188758847384%\\\",\\\"left\\\":\\\"53.529158026387826%\\\",\\\"width\\\":\\\"1.667538%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"人\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":34.000005070551,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":61.00000190092615,\\\"x\\\":1049.900347577761,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941651441-29\\\",\\\"y\\\":451.9695170875309,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.51475429154653%\\\",\\\"left\\\":\\\"51.49260190303707%\\\",\\\"width\\\":\\\"2.9917590000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"88\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":61.00000190092615,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941632755-28\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":34.000005070551,\\\"x\\\":878.8452499574914,\\\"y\\\":455.638918235086,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.88427454747951%\\\",\\\"left\\\":\\\"43.103165643141644%\\\",\\\"width\\\":\\\"1.667538%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"人\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":34.000005070551,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941620159-27\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":75.99999334357558,\\\"x\\\":1214.366941157304,\\\"y\\\":453.10667325785766,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.629269500485975%\\\",\\\"left\\\":\\\"59.558903480209146%\\\",\\\"width\\\":\\\"3.727436999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"离线：\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":75.99999334357558,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941614133-26\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":74.99999799193434,\\\"x\\\":1215.633060735264,\\\"y\\\":422.7198179040119,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.56921743317984%\\\",\\\"left\\\":\\\"59.62100060355991%\\\",\\\"width\\\":\\\"3.678391999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"在线：\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":74.99999799193434,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941608903-25\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":34.000005070551,\\\"x\\\":1294.132494595217,\\\"y\\\":422.7198161600243,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.5692172575548%\\\",\\\"left\\\":\\\"63.47102323350761%\\\",\\\"width\\\":\\\"1.667538%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"人\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":34.000005070551,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941602235-24\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":34.000005070551,\\\"x\\\":1092.819479910352,\\\"y\\\":425.2520436733287,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.824220545876166%\\\",\\\"left\\\":\\\"53.59758053298479%\\\",\\\"width\\\":\\\"1.667538%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"人\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":34.000005070551,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":61.00000190092615,\\\"x\\\":1253.8745693152403,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941596165-23\\\",\\\"y\\\":421.7115971894209,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.46768643084153%\\\",\\\"left\\\":\\\"61.49656411015684%\\\",\\\"width\\\":\\\"2.9917590000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"30\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":61.00000190092615,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":61.00000190092615,\\\"x\\\":1051.2954451125793,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941590403-22\\\",\\\"y\\\":424.243844499982,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.72269171280903%\\\",\\\"left\\\":\\\"51.56102477968631%\\\",\\\"width\\\":\\\"2.9917590000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"173\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":61.00000190092615,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941575296-21\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":94.00001161983592,\\\"x\\\":997.9894510814421,\\\"y\\\":451.96951883151854,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.51475446717158%\\\",\\\"left\\\":\\\"48.94662014973859%\\\",\\\"width\\\":\\\"4.610252000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"离线：\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":94.00001161983592,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941569613-20\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":94.00001161983592,\\\"x\\\":997.9894639256624,\\\"y\\\":424.11488516966904,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.70970510196275%\\\",\\\"left\\\":\\\"48.94662077968631%\\\",\\\"width\\\":\\\"4.610252000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"在线：\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":94.00001161983592,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":61.00000190092615,\\\"x\\\":836.0551084259791,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941564580-19\\\",\\\"y\\\":453.3645878411632,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.65524231157953%\\\",\\\"left\\\":\\\"41.004513396440124%\\\",\\\"width\\\":\\\"2.9917590000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"122\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":61.00000190092615,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":61.00000190092615,\\\"x\\\":836.1840685085348,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941053477-18\\\",\\\"y\\\":419.3083173638135,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.22566858091834%\\\",\\\"left\\\":\\\"41.010838273089355%\\\",\\\"width\\\":\\\"2.9917590000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"252\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":61.00000190092615,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762941048379-17\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":34.000005070551,\\\"x\\\":877.7080904620868,\\\"y\\\":421.5826460137488,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.45470064119328%\\\",\\\"left\\\":\\\"43.047393396440114%\\\",\\\"width\\\":\\\"1.667538%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"人\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":34.000005070551,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762940580987-16\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":94.00001161983592,\\\"x\\\":782.8780923517,\\\"y\\\":453.36459191848354,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.65524272217853%\\\",\\\"left\\\":\\\"38.39643451979088%\\\",\\\"width\\\":\\\"4.610252000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"离线：\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":94.00001161983592,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762940573639-15\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":94.00001161983592,\\\"x\\\":782.8780898366589,\\\"y\\\":420.4454857661016,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.340185021654825%\\\",\\\"left\\\":\\\"38.39643439644011%\\\",\\\"width\\\":\\\"4.610252000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"在线：\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":94.00001161983592,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":122.0000038018523,\\\"x\\\":755.0234452012544,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762940556528-14\\\",\\\"y\\\":629.3552169593522,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.378053118702546%\\\",\\\"left\\\":\\\"37.030297000000004%\\\",\\\"width\\\":\\\"5.983518000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"酒水作业\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":122.0000038018523,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":100.99999947066824,\\\"x\\\":765.1524020939509,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762940550624-13\\\",\\\"y\\\":547.057446629083,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"55.09040836898173%\\\",\\\"left\\\":\\\"37.527074000000006%\\\",\\\"width\\\":\\\"4.953568000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"道路机扫\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":100.99999947066824,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":122.0000038018523,\\\"x\\\":1215.0281373863072,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762940525754-12\\\",\\\"y\\\":221.03887569834177,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"22.25931116133512%\\\",\\\"left\\\":\\\"59.591331999999994%\\\",\\\"width\\\":\\\"5.983518000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"海港人员\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":122.0000038018523,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":122.0000038018523,\\\"x\\\":1002.4823825925793,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762940521846-11\\\",\\\"y\\\":225.3112028888313,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"22.689547969297916%\\\",\\\"left\\\":\\\"49.166977%\\\",\\\"width\\\":\\\"5.983518000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"临港人员\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":122.0000038018523,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":122.0000038018523,\\\"x\\\":792.316981705006,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762940511936-10\\\",\\\"y\\\":225.67715517941065,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"22.726400517884553%\\\",\\\"left\\\":\\\"38.859367000000006%\\\",\\\"width\\\":\\\"5.983518000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"空港人员\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":122.0000038018523,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":43.999999365650666,\\\"x\\\":1914.7889788309733,\\\"h\\\":32.000008610250845,\\\"i\\\":\\\"es-drager-1762938531837-5\\\",\\\"y\\\":636.9519390937786,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"64.1430669709589%\\\",\\\"left\\\":\\\"93.91126200000001%\\\",\\\"width\\\":\\\"2.1579900000000007%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.2225016824328714%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"kg\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":43.999999365650666,\\\"height\\\":32.000008610250845},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#88999A\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":43.999999365650666,\\\"x\\\":1776.781953911325,\\\"h\\\":32.000008610250845,\\\"i\\\":\\\"es-drager-1762938522652-4\\\",\\\"y\\\":638.2180528504308,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"64.27056861511959%\\\",\\\"left\\\":\\\"87.14267600000001%\\\",\\\"width\\\":\\\"2.1579900000000007%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.2225016824328714%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"kg\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":43.999999365650666,\\\"height\\\":32.000008610250845},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#88999A\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":43.999999365650666,\\\"x\\\":1643.839397243353,\\\"h\\\":32.000008610250845,\\\"i\\\":\\\"es-drager-1762938514850-3\\\",\\\"y\\\":636.9519390937786,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"64.1430669709589%\\\",\\\"left\\\":\\\"80.62247800000002%\\\",\\\"width\\\":\\\"2.1579900000000007%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.2225016824328714%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"kg\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":43.999999365650666,\\\"height\\\":32.000008610250845},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#88999A\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":115.99999091331775,\\\"x\\\":1494.3083357704925,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762938341955-2\\\",\\\"y\\\":545.6623636434895,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"54.9499191171517%\\\",\\\"left\\\":\\\"73.28869300000001%\\\",\\\"width\\\":\\\"5.689246000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"7153\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":115.99999091331775,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":43.999999365650666,\\\"x\\\":1530.017579506108,\\\"h\\\":32.000008610250845,\\\"i\\\":\\\"es-drager-1762938204176-1\\\",\\\"y\\\":633.2825373568783,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.773546655676995%\\\",\\\"left\\\":\\\"75.04006100000001%\\\",\\\"width\\\":\\\"2.1579900000000007%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.2225016824328714%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"kg\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":43.999999365650666,\\\"height\\\":32.000008610250845},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#88999A\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":70.99999619602579,\\\"x\\\":1867.8136033479955,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936596210-18\\\",\\\"y\\\":630.4923812843198,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.49256914884002%\\\",\\\"left\\\":\\\"91.607344%\\\",\\\"width\\\":\\\"3.4822109999999995%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"9401\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":70.99999619602579,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#46D6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":61.00000190092615,\\\"x\\\":1751.4595718742557,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936591363-17\\\",\\\"y\\\":633.1535780265655,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.760560044830726%\\\",\\\"left\\\":\\\"85.90073400000001%\\\",\\\"width\\\":\\\"2.9917590000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"0\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":61.00000190092615,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#46D6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":61.00000190092615,\\\"x\\\":1618.6459574145372,\\\"h\\\":30.000000648138894,\\\"i\\\":\\\"es-drager-1762936587463-16\\\",\\\"y\\\":635.8147648701827,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"64.02854994399837%\\\",\\\"left\\\":\\\"79.38686000000001%\\\",\\\"width\\\":\\\"2.9917590000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.0210945796635205%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"0\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":61.00000190092615,\\\"height\\\":30.000000648138894},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#46D6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":74.99999799193434,\\\"x\\\":1866.5474862850765,\\\"h\\\":45.000005921522515,\\\"i\\\":\\\"es-drager-1762936579995-15\\\",\\\"y\\\":649.4841668231293,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"65.40510178583477%\\\",\\\"left\\\":\\\"91.54524700000002%\\\",\\\"width\\\":\\\"3.678391999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.5316423679068105%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"其他垃圾\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":74.99999799193434,\\\"height\\\":45.000005921522515},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":13,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":101.99997443296604,\\\"x\\\":1739.9355149316998,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936575774-14\\\",\\\"y\\\":652.0164141336904,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"65.66010706780227%\\\",\\\"left\\\":\\\"85.335534%\\\",\\\"width\\\":\\\"5.002612000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"可回收垃圾\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":101.99997443296604,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":13,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":74.99999799193434,\\\"x\\\":1613.3235843570108,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936571795-13\\\",\\\"y\\\":653.2825278903425,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"65.78760871196295%\\\",\\\"left\\\":\\\"79.12582300000001%\\\",\\\"width\\\":\\\"3.678391999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"有害垃圾\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":74.99999799193434,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":13,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":74.99999799193434,\\\"x\\\":1490.5099641923919,\\\"h\\\":22.999997527317976,\\\"i\\\":\\\"es-drager-1762936567296-12\\\",\\\"y\\\":659.6131263694886,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"66.42511992323557%\\\",\\\"left\\\":\\\"73.10240100000001%\\\",\\\"width\\\":\\\"3.678391999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.316172212028447%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"厨余垃圾\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":74.99999799193434,\\\"height\\\":22.999997527317976},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":13,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":133.0000138379367,\\\"x\\\":1816.9109140786636,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936479611-11\\\",\\\"y\\\":573.2590862100086,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"57.728996022517066%\\\",\\\"left\\\":\\\"89.11081%\\\",\\\"width\\\":\\\"6.523016000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"当月投放量(KG)\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":133.0000138379367,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":74.99999799193434,\\\"x\\\":1679.032810977925,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936475992-10\\\",\\\"y\\\":573.3880356416931,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"57.74198163654029%\\\",\\\"left\\\":\\\"82.34854700000001%\\\",\\\"width\\\":\\\"3.678391999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"设施\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":74.99999799193434,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":115.99999091331775,\\\"x\\\":1818.4349359474331,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936466314-9\\\",\\\"y\\\":543.1301262315568,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"54.69491483200728%\\\",\\\"left\\\":\\\"89.18555600000002%\\\",\\\"width\\\":\\\"5.689246000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"9301\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":115.99999091331775,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":115.99999091331775,\\\"x\\\":1659.032822387726,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936448667-7\\\",\\\"y\\\":547.0574367304547,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"55.09040737215868%\\\",\\\"left\\\":\\\"81.36764300000002%\\\",\\\"width\\\":\\\"5.689246000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"85\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":115.99999091331775,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":107.00001235920283,\\\"x\\\":1499.5017666197657,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936431998-6\\\",\\\"y\\\":573.645954302319,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"57.76795485823283%\\\",\\\"left\\\":\\\"73.543406%\\\",\\\"width\\\":\\\"5.247840000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"总注册人数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":107.00001235920283,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":56.000004753376324,\\\"x\\\":1493.4290861110203,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762936404011-4\\\",\\\"y\\\":628.3470119646975,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.27652369941136%\\\",\\\"left\\\":\\\"73.24557000000001%\\\",\\\"width\\\":\\\"2.7465330000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"123\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":56.000004753376324,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#46D6FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":117.00000665430248,\\\"x\\\":1850.1641390544198,\\\"h\\\":51.000000111973286,\\\"i\\\":\\\"es-drager-1762936392574-3\\\",\\\"y\\\":637.6482977004861,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"64.21319247651806%\\\",\\\"left\\\":\\\"90.741722%\\\",\\\"width\\\":\\\"5.738292000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.135860685745679%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":117.00000665430248,\\\"height\\\":51.000000111973286},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_06_1763552183216.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":132.00001848629552,\\\"x\\\":1726.0844222162254,\\\"h\\\":55.99999527068225,\\\"i\\\":\\\"es-drager-1762936386243-2\\\",\\\"y\\\":633.8499465319011,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.830686547212935%\\\",\\\"left\\\":\\\"84.65620400000002%\\\",\\\"width\\\":\\\"6.473971000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.6393759506114005%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":132.00001848629552,\\\"height\\\":55.99999527068225},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_06_1763552183216.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":105.99999661821808,\\\"x\\\":1602.133647586284,\\\"h\\\":60.00000129627779,\\\"i\\\":\\\"es-drager-1762936160272-1\\\",\\\"y\\\":632.7127822069335,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.71617051707547%\\\",\\\"left\\\":\\\"78.57701000000002%\\\",\\\"width\\\":\\\"5.198794000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.042189159327041%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":105.99999661821808,\\\"height\\\":60.00000129627779},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_06_1763552183216.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":476.9999847819812,\\\"x\\\":1476.7877932958268,\\\"h\\\":28.99999171776873,\\\"i\\\":\\\"es-drager-1762934953780-14\\\",\\\"y\\\":689.6881586206188,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"69.45377042170585%\\\",\\\"left\\\":\\\"72.42939400000002%\\\",\\\"width\\\":\\\"23.394572999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9203905298673134%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":476.9999847819812,\\\"height\\\":28.99999171776873},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_10_1763552278772.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":100.00000411902698,\\\"x\\\":1479.449010408605,\\\"h\\\":61.00000032801957,\\\"i\\\":\\\"es-drager-1762934758071-13\\\",\\\"y\\\":630.3094942266853,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.47415184595424%\\\",\\\"left\\\":\\\"72.559914%\\\",\\\"width\\\":\\\"4.904523000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.142892212300184%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":100.00000411902698,\\\"height\\\":61.00000032801957},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_06_1763552183216.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":147.9999848912427,\\\"x\\\":1855.152412329461,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762933339573-12\\\",\\\"y\\\":91.12543639477417,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.176618533800058%\\\",\\\"left\\\":\\\"90.98637300000001%\\\",\\\"width\\\":\\\"7.258693000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"厨余垃圾(吨/月)\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":147.9999848912427,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":74.99999799193434,\\\"x\\\":1889.466596793904,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762933332326-11\\\",\\\"y\\\":58.60141419624384,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"5.90134703213322%\\\",\\\"left\\\":\\\"92.66932000000001%\\\",\\\"width\\\":\\\"3.678391999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"109.45\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":74.99999799193434,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#4FC5E3\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#96F5F8\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#49ABFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":131.00000274531064,\\\"x\\\":1659.032822387726,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762933079266-10\\\",\\\"y\\\":95.05275679230033,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.572112070774509%\\\",\\\"left\\\":\\\"81.36764300000002%\\\",\\\"width\\\":\\\"6.424924999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"生活垃圾(吨/月)\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":131.00000274531064,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":74.99999799193434,\\\"x\\\":1688.2825386004924,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762933073725-9\\\",\\\"y\\\":58.7303636279284,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"5.914332646156435%\\\",\\\"left\\\":\\\"82.80220200000001%\\\",\\\"width\\\":\\\"3.678391999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"35.40\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":74.99999799193434,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#4FC5E3\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#96F5F8\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#49ABFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":176.99999281424385,\\\"x\\\":1838.0187576475853,\\\"h\\\":92.00000000790027,\\\"i\\\":\\\"es-drager-1762932876846-8\\\",\\\"y\\\":69.67643514839494,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"7.016636533644591%\\\",\\\"left\\\":\\\"90.14604900000002%\\\",\\\"width\\\":\\\"8.681005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.26468984493685%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":176.99999281424385,\\\"height\\\":92.00000000790027},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_14_1763552212132.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":174.0000067593201,\\\"x\\\":1638.1008165170927,\\\"h\\\":103.99999828743017,\\\"i\\\":\\\"es-drager-1762932868681-7\\\",\\\"y\\\":63.474795999561906,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.392111933218262%\\\",\\\"left\\\":\\\"80.34102800000001%\\\",\\\"width\\\":\\\"8.533870000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.473127477437648%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":174.0000067593201,\\\"height\\\":103.99999828743017},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_14_1763552212132.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":74.99999799193434,\\\"x\\\":1488.2356348724034,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762932864087-6\\\",\\\"y\\\":92.64946881205219,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.330093399653293%\\\",\\\"left\\\":\\\"72.99085600000001%\\\",\\\"width\\\":\\\"3.678391999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"总点位\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":74.99999799193434,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":74.99999799193434,\\\"x\\\":1488.3646178593435,\\\"h\\\":38.0000028007016,\\\"i\\\":\\\"es-drager-1762932853402-5\\\",\\\"y\\\":56.06096092276985,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"5.645515383847678%\\\",\\\"left\\\":\\\"72.99718200000001%\\\",\\\"width\\\":\\\"3.678391999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.826720000271738%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"206\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":74.99999799193434,\\\"height\\\":38.0000028007016},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#4FC5E3\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#96F5F8\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#49ABFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":509.99999450089103,\\\"x\\\":1466.9167412089805,\\\"h\\\":73.99999763929125,\\\"i\\\":\\\"es-drager-1762931911166-4\\\",\\\"y\\\":545.608435916168,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"54.94448842511221%\\\",\\\"left\\\":\\\"71.94526600000002%\\\",\\\"width\\\":\\\"25.013066000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"7.452032897774124%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":509.99999450089103,\\\"height\\\":73.99999763929125},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/按钮21 拷贝_1763552170900.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":122.0000038018523,\\\"x\\\":1466.0375119388516,\\\"h\\\":93.99999807138387,\\\"i\\\":\\\"es-drager-1762930997431-1\\\",\\\"y\\\":68.66823015374024,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.915107114353396%\\\",\\\"left\\\":\\\"71.90214400000002%\\\",\\\"width\\\":\\\"5.983518000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.46609595088314%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":122.0000038018523,\\\"height\\\":93.99999807138387},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_14_1763552212132.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":109.00000306248539,\\\"x\\\":1408.7327115379485,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762429130209-4\\\",\\\"y\\\":744.3141747813775,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"74.95478234725454%\\\",\\\"left\\\":\\\"69.091617%\\\",\\\"width\\\":\\\"5.345930000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812791721984\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"当月投放量\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":109.00000306248539,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JMultipleBar\\\",\\\"visible\\\":true,\\\"w\\\":627.9999965068347,\\\"x\\\":1410.9343528483823,\\\"h\\\":246.99999840730368,\\\"i\\\":\\\"es-drager-1762429121828-3\\\",\\\"y\\\":742.8628378907972,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"74.80862814996556%\\\",\\\"left\\\":\\\"69.199597%\\\",\\\"width\\\":\\\"30.800403%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"24.873678008120173%\\\"},\\\"componentName\\\":\\\"对比柱形图\\\",\\\"pageCompId\\\":\\\"1146390812808499200\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"厨余垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"厨余垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"厨余垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"厨余垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"厨余垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"厨余垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"其他垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"其他垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"其他垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"其他垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"其他垃圾\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"其他垃圾\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":627.9999965068347,\\\"height\\\":246.99999840730368},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"yUnit\\\":\\\"\\\"},\\\"customColor\\\":[{\\\"color1\\\":\\\"#4FF0FDA8\\\",\\\"color\\\":\\\"#4FF0FD00\\\"},{\\\"color1\\\":\\\"#4F68FDA8\\\",\\\"color\\\":\\\"#4F68FD00\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":47,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":15,\\\"itemStyle\\\":{\\\"borderRadius\\\":0}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":93.00001626819461,\\\"x\\\":1454.9343318246895,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762429044550-2\\\",\\\"y\\\":310.879252361777,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"31.306520131634624%\\\",\\\"left\\\":\\\"71.35758600000001%\\\",\\\"width\\\":\\\"4.5612070000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812825276416\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"厨余垃圾\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":93.00001626819461,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":93.00001626819461,\\\"x\\\":1447.9343643632005,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762429023915-1\\\",\\\"y\\\":149.86283794746865,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.091659921153278%\\\",\\\"left\\\":\\\"71.01427100000001%\\\",\\\"width\\\":\\\"4.5612070000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812837859328\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"生活垃圾\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":93.00001626819461,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4A90E2\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JMultipleLine\\\",\\\"visible\\\":true,\\\"w\\\":545.9999902747245,\\\"x\\\":1459.869878257456,\\\"h\\\":160.00000345674079,\\\"i\\\":\\\"9799edd5-f660-4e56-9305-d9e43773a75e\\\",\\\"y\\\":316.5486620607893,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"31.87744754968588%\\\",\\\"left\\\":\\\"71.599651%\\\",\\\"width\\\":\\\"26.778693999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"16.11250442487211%\\\"},\\\"componentName\\\":\\\"对比折线图\\\",\\\"pageCompId\\\":\\\"1146390812846247936\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 1.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 1.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":545.9999902747245,\\\"height\\\":160.00000345674079},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color1\\\":\\\"#1e90ff\\\",\\\"color\\\":\\\"#2291E3A3\\\"},{\\\"color1\\\":\\\"#90ee90\\\",\\\"color\\\":\\\"#02F4FF94\\\"},{\\\"color1\\\":\\\"#00ced1\\\",\\\"color\\\":\\\"#FF029B9E\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":36,\\\"left\\\":0,\\\"bottom\\\":22,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"symbol\\\":\\\"none\\\",\\\"lineType\\\":\\\"area\\\",\\\"label\\\":{\\\"position\\\":\\\"top\\\"}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JStackBar\\\",\\\"visible\\\":true,\\\"w\\\":557.9999956624503,\\\"x\\\":1455.200473925311,\\\"h\\\":152.00000130417803,\\\"i\\\":\\\"9857c542-9530-4c6c-ac2a-2fd20b6da0b3\\\",\\\"y\\\":155.8628321379194,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.695878238992144%\\\",\\\"left\\\":\\\"71.37063900000001%\\\",\\\"width\\\":\\\"27.367237000000006%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"15.306879004263887%\\\"},\\\"componentName\\\":\\\"生活垃圾\\\",\\\"pageCompId\\\":\\\"1146390812858830848\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"临港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"海港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"空港\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":557.9999956624503,\\\"height\\\":152.00000130417803},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color1\\\":\\\"#F4DC42B3\\\",\\\"color\\\":\\\"#F4DC4200\\\"},{\\\"color1\\\":\\\"#00D8FFB3\\\",\\\"color\\\":\\\"#00D8FF00\\\"},{\\\"color1\\\":\\\"#006CFFB3\\\",\\\"color\\\":\\\"#006CFF00\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":43,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":21,\\\"itemStyle\\\":{\\\"borderRadius\\\":1},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":false}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JMultipleBar\\\",\\\"visible\\\":true,\\\"w\\\":627.9999965068347,\\\"x\\\":743.9343337341033,\\\"h\\\":246.99999840730368,\\\"i\\\":\\\"ddbe13ab-bd12-4d18-9551-5773cc07cb6d\\\",\\\"y\\\":741.8628388590553,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"74.70792509699238%\\\",\\\"left\\\":\\\"36.48642900000001%\\\",\\\"width\\\":\\\"30.800403%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"24.873678008120173%\\\"},\\\"componentName\\\":\\\"对比柱形图\\\",\\\"pageCompId\\\":\\\"1146390812879802368\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"修剪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"修剪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"修剪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"修剪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"修剪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"修剪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"破绿\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"破绿\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"破绿\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"破绿\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"破绿\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"破绿\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 13,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"基础养护\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 14,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"基础养护\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 13.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"基础养护\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 15,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"基础养护\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 14.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"基础养护\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 16,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"基础养护\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"提升改造\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"提升改造\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3.5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"提升改造\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"提升改造\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.9,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"提升改造\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"提升改造\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":627.9999965068347,\\\"height\\\":246.99999840730368},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"yUnit\\\":\\\"\\\"},\\\"customColor\\\":[{\\\"color1\\\":\\\"#3FECFBB3\\\",\\\"color\\\":\\\"#3FECFB00\\\"},{\\\"color1\\\":\\\"#006CFFB5\\\",\\\"color\\\":\\\"#006CFF00\\\"},{\\\"color1\\\":\\\"#C000FFB3\\\",\\\"color\\\":\\\"#109EE05C\\\"},{\\\"color1\\\":\\\"#3F8FFBB5\\\",\\\"color\\\":\\\"#3F8FFB00\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":47,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":15,\\\"itemStyle\\\":{\\\"borderRadius\\\":0}}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JMultipleLine\\\",\\\"visible\\\":true,\\\"w\\\":549.0000171083353,\\\"x\\\":153.2004704533646,\\\"h\\\":244.00000131207827,\\\"i\\\":\\\"4c6e2a64-9c5b-4433-a253-e3246a922a38\\\",\\\"y\\\":519.0562760062809,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"52.27060227014323%\\\",\\\"left\\\":\\\"7.513752%\\\",\\\"width\\\":\\\"26.925831%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"24.571568849200737%\\\"},\\\"componentName\\\":\\\"对比折线图\\\",\\\"pageCompId\\\":\\\"1146390812892385280\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-23\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 620,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"总量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-24\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 768,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"总量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-25\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 600,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"总量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-26\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 810,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"总量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-27\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 700,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"总量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-28\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 900,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"总量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-29\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 820,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"总量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-30\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 830,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"总量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-31\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 790,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"总量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-23\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 196,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"完成量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-24\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 600,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"完成量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-25\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 300,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"完成量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-26\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 550,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"完成量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-27\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 610,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"完成量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-28\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 390,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"完成量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-29\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 420,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"完成量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-30\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 380,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"完成量\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"08-31\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 600,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"完成量\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":549.0000171083353,\\\"height\\\":244.00000131207827},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"yUnit\\\":\\\"\\\"},\\\"customColor\\\":[{\\\"color1\\\":\\\"#1e90ff\\\",\\\"color\\\":\\\"#AB315C\\\"},{\\\"color1\\\":\\\"#90ee90\\\",\\\"color\\\":\\\"#4FCAE3\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"name\\\":\\\"单位(个)\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":39,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"symbol\\\":\\\"circle\\\",\\\"symbolSize\\\":6,\\\"lineType\\\":\\\"line\\\",\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":false,\\\"position\\\":\\\"top\\\"},\\\"lineWidth\\\":2}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"left\\\":\\\"center\\\",\\\"show\\\":true,\\\"text\\\":\\\"无人机巡检完成情况\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":88.99999408294256,\\\"x\\\":1463.7409174557679,\\\"h\\\":40.99999989592697,\\\"i\\\":\\\"es-drager-1762423810391-12\\\",\\\"y\\\":495.8229777070758,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"49.93093593537638%\\\",\\\"left\\\":\\\"71.789507%\\\",\\\"width\\\":\\\"4.365025%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.12882915919117%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812909162496\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"垃圾分类\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":88.99999408294256,\\\"height\\\":40.99999989592697},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":93.00001626819461,\\\"x\\\":1479.9343583411257,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762423782353-11\\\",\\\"y\\\":9.862844821448832,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0.9932195462132423%\\\",\\\"left\\\":\\\"72.58371800000002%\\\",\\\"width\\\":\\\"4.5612070000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812921745408\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"垃圾收运\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":93.00001626819461,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":148.99998024288396,\\\"x\\\":761.7409183086403,\\\"h\\\":38.99999193381503,\\\"i\\\":\\\"es-drager-1762423748544-10\\\",\\\"y\\\":705.7092569027857,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"71.06714549286653%\\\",\\\"left\\\":\\\"37.35975700000001%\\\",\\\"width\\\":\\\"7.307738000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.9274220564218205%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812934328320\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"园林作业用工\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":148.99998024288396,\\\"height\\\":38.99999193381503},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":107.00001235920283,\\\"x\\\":782.2004827011841,\\\"h\\\":30.000000648138894,\\\"i\\\":\\\"es-drager-1762423716800-9\\\",\\\"y\\\":61.00000032801958,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.142892212300185%\\\",\\\"left\\\":\\\"38.363201000000004%\\\",\\\"width\\\":\\\"5.247840000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.0210945796635205%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812951105536\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"环卫作业\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":107.00001235920283,\\\"height\\\":30.000000648138894},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":100.00000411902698,\\\"x\\\":186.26495127640098,\\\"h\\\":42.99999795941056,\\\"i\\\":\\\"es-drager-1762423687040-8\\\",\\\"y\\\":756.1371663778658,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"76.14539484911707%\\\",\\\"left\\\":\\\"9.135407000000002%\\\",\\\"width\\\":\\\"4.904523000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.33023526513746%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812963688448\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"危险作业\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":100.00000411902698,\\\"height\\\":42.99999795941056},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":103.00001056329427,\\\"x\\\":174.8698773207855,\\\"h\\\":48.0000030167479,\\\"i\\\":\\\"es-drager-1762423656832-7\\\",\\\"y\\\":276.8393938102532,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"27.878599133609544%\\\",\\\"left\\\":\\\"8.576533000000001%\\\",\\\"width\\\":\\\"5.051659000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.833751526826244%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390812980465664\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"巡检信息\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":103.00001056329427,\\\"height\\\":48.0000030167479},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":569.0000056985347,\\\"x\\\":1438.1359798965655,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762423639047-6\\\",\\\"y\\\":500.29073351733564,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.38085302104397%\\\",\\\"left\\\":\\\"70.53370700000002%\\\",\\\"width\\\":\\\"27.906735000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146390812993048576\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":569.0000056985347,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":573.0000074944433,\\\"x\\\":1453.934356862392,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762423624157-5\\\",\\\"y\\\":13.862831049787644,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.396030761282759%\\\",\\\"left\\\":\\\"71.30854200000002%\\\",\\\"width\\\":\\\"28.102916000000004%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146390813005631488\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":573.0000074944433,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":614.0000004158265,\\\"x\\\":740.8053850815827,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762423610295-4\\\",\\\"y\\\":708.1770245481904,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"71.31565746941088%\\\",\\\"left\\\":\\\"36.332969000000006%\\\",\\\"width\\\":\\\"30.113770000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146390813018214400\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":614.0000004158265,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":660.0000108741033,\\\"x\\\":759.2004468880306,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762423600686-3\\\",\\\"y\\\":61.999999359761375,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.24359526527333%\\\",\\\"left\\\":\\\"37.23515900000001%\\\",\\\"width\\\":\\\"32.369851000000004%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146390813034991616\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":660.0000108741033,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":538.0000070722509,\\\"x\\\":158.9343362111958,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762423595387-2\\\",\\\"y\\\":761.871045843406,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"76.72281457576837%\\\",\\\"left\\\":\\\"7.794970753298481%\\\",\\\"width\\\":\\\"26.386333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146390813051768832\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":538.0000070722509,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":538.0000070722509,\\\"x\\\":156.6682288267175,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"es-drager-1762423584121-1\\\",\\\"y\\\":283.573262408907,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"28.55672091641095%\\\",\\\"left\\\":\\\"7.683829000000002%\\\",\\\"width\\\":\\\"26.386333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146390813064351744\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":538.0000070722509,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":170.00000496341158,\\\"x\\\":177.20046083947247,\\\"h\\\":60.00000129627779,\\\"i\\\":\\\"72ffb6d2-c59b-407e-83d4-146e19df5a1a\\\",\\\"y\\\":0,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0%\\\",\\\"left\\\":\\\"8.690837000000002%\\\",\\\"width\\\":\\\"8.337689000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.042189159327041%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146390813076934656\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"无人机业务信息\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.00000496341158,\\\"height\\\":60.00000129627779},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":558.9999910140915,\\\"x\\\":162.200469396823,\\\"h\\\":37.000003768959814,\\\"i\\\":\\\"f4665840-e58b-49bf-8ded-2ea4758037bb\\\",\\\"y\\\":13.733881618103084,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.3830451472595444%\\\",\\\"left\\\":\\\"7.955159%\\\",\\\"width\\\":\\\"27.416282000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.726016947298594%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146390813097906176\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":558.9999910140915,\\\"height\\\":37.000003768959814},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":617.0000068600939,\\\"x\\\":765.6154848633763,\\\"h\\\":71.99999957580766,\\\"i\\\":\\\"es-drager-1762931502489-3\\\",\\\"y\\\":533.076198288189,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"53.68245261341327%\\\",\\\"left\\\":\\\"37.549786000000005%\\\",\\\"width\\\":\\\"30.260906000000006%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"7.250626791827836%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":617.0000068600939,\\\"height\\\":71.99999957580766},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_18_1763552143794.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":540.9999931271748,\\\"x\\\":178.64135535481833,\\\"h\\\":65.99999548672854,\\\"i\\\":\\\"709d5eeb-9748-4a8f-893a-dec888551a01\\\",\\\"y\\\":75.12777806457078,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"7.565603939649218%\\\",\\\"left\\\":\\\"8.761506000000002%\\\",\\\"width\\\":\\\"26.533468000000006%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.646407477165907%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":540.9999931271748,\\\"height\\\":65.99999548672854},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_21_1763552566127.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":543.999999571442,\\\"x\\\":177.00929035487692,\\\"h\\\":98.00000409697937,\\\"i\\\":\\\"es-drager-1762942596197-2\\\",\\\"y\\\":158.32571975954107,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.943898781767137%\\\",\\\"left\\\":\\\"8.681461000000002%\\\",\\\"width\\\":\\\"26.680604000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.868909159598777%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":543.999999571442,\\\"height\\\":98.00000409697937},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_07_1763552117126.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":614.9999957674679,\\\"x\\\":765.4865222657797,\\\"h\\\":71.99999957580766,\\\"i\\\":\\\"es-drager-1762941743379-33\\\",\\\"y\\\":617.7772565987063,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"62.21211603425532%\\\",\\\"left\\\":\\\"37.54346100000001%\\\",\\\"width\\\":\\\"30.16281500000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"7.250626791827836%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":614.9999957674679,\\\"height\\\":71.99999957580766},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_18_1763552143794.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JSemiGauge\\\",\\\"visible\\\":true,\\\"w\\\":221,\\\"x\\\":754.6072684642438,\\\"h\\\":208,\\\"i\\\":\\\"50f215a7-2178-488b-b3de-6ade82567e05\\\",\\\"y\\\":260.17467686082085,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"26.20040963494764%\\\",\\\"left\\\":\\\"37.00988551705342%\\\",\\\"width\\\":\\\"10.838995383538858%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"20.94625529979765%\\\"},\\\"componentName\\\":\\\"半圆仪表盘\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataType\\\":1,\\\"h\\\":430,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"total\\\\\\\": 800,\\\\n    \\\\\\\"used\\\\\\\": 500\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":221,\\\"height\\\":208},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":500,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"titleSuffix\\\":\\\"人\\\",\\\"customAttr\\\":{\\\"innerCircle\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":0,\\\"y2\\\":1,\\\"x2\\\":1,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#42A8FF66\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#42A8FF66\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":15}},\\\"name\\\":\\\"内部小圆\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"outerScale\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"distance\\\":-52,\\\"show\\\":true,\\\"fontSize\\\":12},\\\"min\\\":0,\\\"max\\\":100,\\\"axisLine\\\":{\\\"show\\\":false},\\\"name\\\":\\\"外部刻度\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"splitNumber\\\":2,\\\"detail\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":66},\\\"innerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"animationDuration\\\":2000,\\\"pointer\\\":{\\\"show\\\":false,\\\"length\\\":74,\\\"width\\\":1,\\\"itemStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"data\\\":[{\\\"name\\\":\\\"去年优良率\\\",\\\"value\\\":44}],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#2E76B9\\\"],[1,\\\"#2E76B9\\\"]],\\\"width\\\":1}},\\\"name\\\":\\\"内部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"detail\\\":{\\\"offsetCenter\\\":[0,50],\\\"show\\\":false,\\\"textStyle\\\":{\\\"padding\\\":[0,0,0,0],\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":\\\"30%\\\",\\\"title\\\":{\\\"offsetCenter\\\":[0,26],\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"normal\\\"}}},\\\"outerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#2E76B9\\\"],[1,\\\"#2E76B9\\\"]],\\\"width\\\":2}},\\\"name\\\":\\\"外部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"basic\\\":{\\\"startAngle\\\":180,\\\"endAngle\\\":0},\\\"innerShadow\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"customGradient\\\":{\\\"endColor\\\":\\\"#42A8FFCC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#2E76B900\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":1,\\\"y2\\\":0,\\\"x2\\\":0,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#2de69600\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#2de696\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":100}},\\\"name\\\":\\\"内部阴影\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":79}},\\\"valuePrefix\\\":\\\"已使用：\\\",\\\"titlePrefix\\\":\\\"总人数：\\\",\\\"valueMapping\\\":\\\"used\\\",\\\"titleMapping\\\":\\\"total\\\",\\\"valueSuffix\\\":\\\"辆\\\"}}},{\\\"component\\\":\\\"JSemiGauge\\\",\\\"visible\\\":true,\\\"w\\\":222,\\\"x\\\":969.7186400937863,\\\"h\\\":210,\\\"i\\\":\\\"es-drager-1763539498104-1\\\",\\\"y\\\":263.8440789710201,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"26.569929987821922%\\\",\\\"left\\\":\\\"47.56007177967479%\\\",\\\"width\\\":\\\"10.88804061151867%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"21.147661600757242%\\\"},\\\"componentName\\\":\\\"半圆仪表盘\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataType\\\":1,\\\"h\\\":430,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"total\\\\\\\": 800,\\\\n    \\\\\\\"used\\\\\\\": 500\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":222,\\\"height\\\":210},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":500,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"titleSuffix\\\":\\\"人\\\",\\\"customAttr\\\":{\\\"innerCircle\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":0,\\\"y2\\\":1,\\\"x2\\\":1,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#32B9BA66\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#32B9BA66\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":15}},\\\"name\\\":\\\"内部小圆\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"outerScale\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"distance\\\":-49,\\\"show\\\":true,\\\"fontSize\\\":12},\\\"min\\\":0,\\\"max\\\":100,\\\"axisLine\\\":{\\\"show\\\":false},\\\"name\\\":\\\"外部刻度\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"splitNumber\\\":2,\\\"detail\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":66},\\\"innerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"animationDuration\\\":2000,\\\"pointer\\\":{\\\"show\\\":false,\\\"length\\\":81,\\\"width\\\":1,\\\"itemStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"data\\\":[{\\\"name\\\":\\\"去年优良率\\\",\\\"value\\\":44}],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#32B9BA\\\"],[1,\\\"#32B9BA\\\"]],\\\"width\\\":1}},\\\"name\\\":\\\"内部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"detail\\\":{\\\"offsetCenter\\\":[0,50],\\\"show\\\":false,\\\"textStyle\\\":{\\\"padding\\\":[0,0,0,0],\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":\\\"30%\\\",\\\"title\\\":{\\\"offsetCenter\\\":[0,26],\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"normal\\\"}}},\\\"outerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#32B9BA\\\"],[1,\\\"#32B9BA\\\"]],\\\"width\\\":2}},\\\"name\\\":\\\"外部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"basic\\\":{\\\"startAngle\\\":180,\\\"endAngle\\\":0},\\\"innerShadow\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"customGradient\\\":{\\\"endColor\\\":\\\"#32B9BACC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#32B9BA00\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":1,\\\"y2\\\":0,\\\"x2\\\":0,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#2de69600\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#2de696\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":100}},\\\"name\\\":\\\"内部阴影\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":79}},\\\"valuePrefix\\\":\\\"已使用：\\\",\\\"titlePrefix\\\":\\\"总人数：\\\",\\\"valueMapping\\\":\\\"used\\\",\\\"titleMapping\\\":\\\"total\\\",\\\"valueSuffix\\\":\\\"辆\\\"}}},{\\\"component\\\":\\\"JSemiGauge\\\",\\\"visible\\\":true,\\\"w\\\":222,\\\"x\\\":1181.0316529894487,\\\"h\\\":210,\\\"i\\\":\\\"es-drager-1763539599125-2\\\",\\\"y\\\":261.1828831914188,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"26.301939188772533%\\\",\\\"left\\\":\\\"57.9239666722439%\\\",\\\"width\\\":\\\"10.88804061151867%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"21.147661600757242%\\\"},\\\"componentName\\\":\\\"半圆仪表盘\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataType\\\":1,\\\"h\\\":430,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"total\\\\\\\": 800,\\\\n    \\\\\\\"used\\\\\\\": 500\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":222,\\\"height\\\":210},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":500,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"titleSuffix\\\":\\\"人\\\",\\\"customAttr\\\":{\\\"innerCircle\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":0,\\\"y2\\\":1,\\\"x2\\\":1,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#4277FF66\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#4277FF66\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":15}},\\\"name\\\":\\\"内部小圆\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"outerScale\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"distance\\\":-52,\\\"show\\\":true,\\\"fontSize\\\":12},\\\"min\\\":0,\\\"max\\\":100,\\\"axisLine\\\":{\\\"show\\\":false},\\\"name\\\":\\\"外部刻度\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"splitNumber\\\":2,\\\"detail\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":66},\\\"innerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"animationDuration\\\":2000,\\\"pointer\\\":{\\\"show\\\":false,\\\"length\\\":81,\\\"width\\\":1,\\\"itemStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\"}},\\\"data\\\":[{\\\"name\\\":\\\"去年优良率\\\",\\\"value\\\":44}],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#2E76B9\\\"],[1,\\\"#2E76B9\\\"]],\\\"width\\\":1}},\\\"name\\\":\\\"内部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"detail\\\":{\\\"offsetCenter\\\":[0,50],\\\"show\\\":false,\\\"textStyle\\\":{\\\"padding\\\":[0,0,0,0],\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":\\\"30%\\\",\\\"title\\\":{\\\"offsetCenter\\\":[0,26],\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"normal\\\"}}},\\\"outerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#4277FF\\\"],[1,\\\"#4277FF\\\"]],\\\"width\\\":2}},\\\"name\\\":\\\"外部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"basic\\\":{\\\"startAngle\\\":180,\\\"endAngle\\\":0},\\\"innerShadow\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"customGradient\\\":{\\\"endColor\\\":\\\"#4277FFCC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#4277FF00\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":1,\\\"y2\\\":0,\\\"x2\\\":0,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#2de69600\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#2de696\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":100}},\\\"name\\\":\\\"内部阴影\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":79}},\\\"valuePrefix\\\":\\\"已使用：\\\",\\\"titlePrefix\\\":\\\"总人数：\\\",\\\"valueMapping\\\":\\\"used\\\",\\\"titleMapping\\\":\\\"total\\\",\\\"valueSuffix\\\":\\\"辆\\\"}}}]},\\\"component\\\":\\\"JGroup\\\",\\\"w\\\":2038.934349355217,\\\"x\\\":-127,\\\"y\\\":76,\\\"componentName\\\":\\\"投资\\\",\\\"pageCompId\\\":\\\"1151112776903086080\\\",\\\"equalProportion\\\":false,\\\"key\\\":\\\"ad56ff31-2be7-4967-8ad8-22fb9249deac\\\",\\\"group\\\":true},{\\\"visible\\\":false,\\\"h\\\":988.6694020273344,\\\"i\\\":\\\"es-drager-1762421939532-37\\\",\\\"props\\\":{\\\"elements\\\":[{\\\"component\\\":\\\"JStatsSummary\\\",\\\"visible\\\":true,\\\"w\\\":713.0000000000001,\\\"x\\\":571.0199296600234,\\\"h\\\":129,\\\"i\\\":\\\"6ba699ad-92ee-4f14-b66c-7d2cbce6057e\\\",\\\"y\\\":68.20046885031215,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.898207703248671%\\\",\\\"left\\\":\\\"30.823751360096747%\\\",\\\"width\\\":\\\"38.48785931663358%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"13.047839827497103%\\\"},\\\"componentName\\\":\\\"统计概览（背景模式）\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"成本已支付金额\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 96790,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"万元\\\\\\\",\\\\n    \\\\\\\"compareLabel\\\\\\\": \\\\\\\"同比\\\\\\\",\\\\n    \\\\\\\"compareValue\\\\\\\": \\\\\\\"20%\\\\\\\",\\\\n    \\\\\\\"compareState\\\\\\\": \\\\\\\"0\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"2\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"成本未付款金额\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 96.79,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"%\\\\\\\",\\\\n    \\\\\\\"compareLabel\\\\\\\": \\\\\\\"同比\\\\\\\",\\\\n    \\\\\\\"compareValue\\\\\\\": \\\\\\\"20%\\\\\\\",\\\\n    \\\\\\\"compareState\\\\\\\": \\\\\\\"0\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"3\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"租赁应收未回金额\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 10790,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"元\\\\\\\",\\\\n    \\\\\\\"compareLabel\\\\\\\": \\\\\\\"同比\\\\\\\",\\\\n    \\\\\\\"compareValue\\\\\\\": \\\\\\\"20%\\\\\\\",\\\\n    \\\\\\\"compareState\\\\\\\": \\\\\\\"1\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"4\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"租赁项目欠款金额\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 86790,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"元\\\\\\\",\\\\n    \\\\\\\"compareLabel\\\\\\\": \\\\\\\"同比\\\\\\\",\\\\n    \\\\\\\"compareValue\\\\\\\": \\\\\\\"20%\\\\\\\",\\\\n    \\\\\\\"compareState\\\\\\\": \\\\\\\"1\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":713.0000000000001,\\\"height\\\":129},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":713,\\\"dataType\\\":1,\\\"h\\\":129,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"layout\\\":{\\\"padding\\\":{\\\"top\\\":5,\\\"left\\\":20,\\\"bottom\\\":0,\\\"right\\\":20},\\\"borderColor\\\":\\\"#0f66ff59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"justify\\\":\\\"space-between\\\",\\\"borderWidth\\\":0,\\\"gap\\\":16,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"contain\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"drag/lib/img/bg01.png\\\"},\\\"color\\\":\\\"#0b2b63\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"image\\\"}},\\\"fieldMap\\\":{\\\"compareValue\\\":\\\"compareValue\\\",\\\"unit\\\":\\\"suffix\\\",\\\"negativeValue\\\":\\\"0\\\",\\\"compareState\\\":\\\"compareState\\\",\\\"label\\\":\\\"name\\\",\\\"value\\\":\\\"value\\\",\\\"positiveValue\\\":\\\"1\\\",\\\"compareLabel\\\":\\\"compareLabel\\\"},\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"padding\\\":{\\\"horizontal\\\":3,\\\"vertical\\\":15},\\\"borderColor\\\":\\\"#0F66FF59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"borderWidth\\\":0,\\\"blur\\\":24,\\\"minWidth\\\":100,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"cover\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"\\\"},\\\"color\\\":\\\"#0B2B6300\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"none\\\"}},\\\"sections\\\":{\\\"middle\\\":{\\\"compare\\\":{\\\"valueStyle\\\":{\\\"positiveGradient\\\":{\\\"endColor\\\":\\\"#15f0c5\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#15f0c5\\\"},\\\"positiveColor\\\":\\\"#00FFAE\\\",\\\"fontSize\\\":14,\\\"negativeColor\\\":\\\"#FF0000\\\",\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"negativeGradient\\\":{\\\"endColor\\\":\\\"#D0021B\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#D0021B\\\"},\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"alignItems\\\":\\\"center\\\",\\\"labelStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#CFEAFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ED3FF\\\"},\\\"fontColor\\\":\\\"#DADADA\\\"},\\\"label\\\":\\\"同比\\\"},\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"type\\\":\\\"compare\\\",\\\"align\\\":\\\"center\\\"},\\\"top\\\":{\\\"minHeight\\\":40,\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"paddingTop\\\":5,\\\"type\\\":\\\"value\\\",\\\"align\\\":\\\"center\\\",\\\"value\\\":{\\\"unit\\\":{\\\"fontSize\\\":16,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#96F5F8\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ED3FF\\\"},\\\"fontWeight\\\":500,\\\"fontColor\\\":\\\"#9ED3FF\\\"},\\\"unitGap\\\":6,\\\"fontSize\\\":24,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#96F5F8\\\"},\\\"fontWeight\\\":600,\\\"fontColor\\\":\\\"#D8F1FF\\\"}},\\\"bottom\\\":{\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"label\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#C9E6FF\\\"},\\\"type\\\":\\\"label\\\",\\\"align\\\":\\\"center\\\"}}}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":83.00000204530508,\\\"x\\\":1683.8100819494582,\\\"h\\\":51.999996548865546,\\\"i\\\":\\\"es-drager-1762851269890-2\\\",\\\"y\\\":81.32122205883473,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.22532%\\\",\\\"left\\\":\\\"90.89235%\\\",\\\"width\\\":\\\"4.480354000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.259593999999999%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":83.00000204530508,\\\"height\\\":51.999996548865546},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_29_1763551901494.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":83.00000204530508,\\\"x\\\":1530.6096120950147,\\\"h\\\":51.999996548865546,\\\"i\\\":\\\"es-drager-1762851253605-1\\\",\\\"y\\\":80.0551023625165,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.097257000000003%\\\",\\\"left\\\":\\\"82.62256300000001%\\\",\\\"width\\\":\\\"4.480354000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.259593999999999%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":83.00000204530508,\\\"height\\\":51.999996548865546},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_27_1763551895529.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":43,\\\"i\\\":\\\"es-drager-1762849064798-20\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":51,\\\"x\\\":1169.6975226315708,\\\"y\\\":432.5854492285337,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"43.754307389455725%\\\",\\\"left\\\":\\\"63.14046801410759%\\\",\\\"width\\\":\\\"2.752988534569863%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.3492799424990345%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.99998699681006,\\\"height\\\":43.000010455188466},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2d91eb63-bada-4811-8c1b-65189dcf7599\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000010455188466,\\\"i\\\":\\\"es-drager-1762849058217-19\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":51.99998699681006,\\\"x\\\":1038.021084598434,\\\"y\\\":487.0285938030566,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"49.2610161500266%\\\",\\\"left\\\":\\\"56.03255185375025%\\\",\\\"width\\\":\\\"2.806968000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.3492809999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.99998699681005,\\\"height\\\":43.000010455188466},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2d91eb63-bada-4811-8c1b-65189dcf7599\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":51.99998699681006,\\\"x\\\":683.5075917950732,\\\"h\\\":43.000010455188466,\\\"i\\\":\\\"es-drager-1762849043828-18\\\",\\\"y\\\":489.56082449258037,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"49.51714126974116%\\\",\\\"left\\\":\\\"36.89585418633911%\\\",\\\"width\\\":\\\"2.806968000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.3492809999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.99998699681005,\\\"height\\\":43.000010455188466},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2d91eb63-bada-4811-8c1b-65189dcf7599\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":51.99998699681006,\\\"x\\\":937.9976478556124,\\\"h\\\":43.000010455188466,\\\"i\\\":\\\"es-drager-1762849029696-16\\\",\\\"y\\\":292.0461788601647,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"29.539315999999992%\\\",\\\"left\\\":\\\"50.63327000000002%\\\",\\\"width\\\":\\\"2.806968000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.3492809999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.99998699681005,\\\"height\\\":43.000010455188466},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2d91eb63-bada-4811-8c1b-65189dcf7599\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":101.00000181927524,\\\"x\\\":1150.971855353579,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"es-drager-1762849006795-15\\\",\\\"y\\\":409.787098507104,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"41.44834437748427%\\\",\\\"left\\\":\\\"62.129653360804035%\\\",\\\"width\\\":\\\"5.451997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"794,150\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":101.00000181927523,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to top\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"a04f824f-4454-4452-8bbf-651d4d5477c3\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":101.00000181927524,\\\"x\\\":1019.4243913572378,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"es-drager-1762849000354-14\\\",\\\"y\\\":465.62531457297723,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"47.096159102140774%\\\",\\\"left\\\":\\\"55.028699240536014%\\\",\\\"width\\\":\\\"5.451997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"994,150\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":101.00000181927523,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to top\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"a04f824f-4454-4452-8bbf-651d4d5477c3\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":101.00000181927524,\\\"x\\\":909.4009228742274,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"es-drager-1762848992281-13\\\",\\\"y\\\":268.2396227476817,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"27.131377%\\\",\\\"left\\\":\\\"49.089614000000005%\\\",\\\"width\\\":\\\"5.451997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"94,000\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":101.00000181927523,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to top\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"a04f824f-4454-4452-8bbf-651d4d5477c3\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":101.00000181927524,\\\"x\\\":659.9753814335057,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"es-drager-1762848979407-12\\\",\\\"y\\\":468.2865173043536,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"47.3653292338268%\\\",\\\"left\\\":\\\"35.62558153303556%\\\",\\\"width\\\":\\\"5.451997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"994,150\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":101.00000181927523,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to top\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"a04f824f-4454-4452-8bbf-651d4d5477c3\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":76.00000522075926,\\\"x\\\":1146.1007905389508,\\\"h\\\":43.00000056849445,\\\"i\\\":\\\"es-drager-1762848746940-11\\\",\\\"y\\\":490.1176839485176,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"49.57346540142718%\\\",\\\"left\\\":\\\"61.86671246696447%\\\",\\\"width\\\":\\\"4.102492999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.34928%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":76.00000522075925,\\\"height\\\":43.00000056849446},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"54cf0d91-5cd0-40b5-8034-95d55014f90e\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":76.00000522075926,\\\"x\\\":1034.8112462126353,\\\"h\\\":43.00000056849445,\\\"i\\\":\\\"es-drager-1762848738842-10\\\",\\\"y\\\":540.8914319443187,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"54.70902920988389%\\\",\\\"left\\\":\\\"55.85928424053601%\\\",\\\"width\\\":\\\"4.102492999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.34928%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":76.00000522075925,\\\"height\\\":43.00000056849446},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"54cf0d91-5cd0-40b5-8034-95d55014f90e\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":76.00000522075926,\\\"x\\\":926.053909410244,\\\"h\\\":43.00000056849445,\\\"i\\\":\\\"es-drager-1762848724480-9\\\",\\\"y\\\":354.9008064339704,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"35.896812999999995%\\\",\\\"left\\\":\\\"49.98854500000001%\\\",\\\"width\\\":\\\"4.102492999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.34928%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":76.00000522075925,\\\"height\\\":43.00000056849446},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"54cf0d91-5cd0-40b5-8034-95d55014f90e\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":76.00000522075926,\\\"x\\\":675.3622355462353,\\\"h\\\":43.00000056849445,\\\"i\\\":\\\"es-drager-1762848716458-8\\\",\\\"y\\\":554.9477012273585,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"56.130765257769696%\\\",\\\"left\\\":\\\"36.45616649294621%\\\",\\\"width\\\":\\\"4.102492999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.34928%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":76.00000522075925,\\\"height\\\":43.00000056849446},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"54cf0d91-5cd0-40b5-8034-95d55014f90e\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":59.99999924656725,\\\"x\\\":932.8722283986059,\\\"h\\\":84.99999169692029,\\\"i\\\":\\\"es-drager-1762848356232-7\\\",\\\"y\\\":280.17468158185136,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"28.338560999999995%\\\",\\\"left\\\":\\\"50.35659900000001%\\\",\\\"width\\\":\\\"3.238810000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"8.597412999999998%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":59.99999924656725,\\\"height\\\":84.99999169692029},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":101.00000181927524,\\\"x\\\":789.2485271715286,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"es-drager-1762848336840-6\\\",\\\"y\\\":322.81171698679043,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"32.65112850917029%\\\",\\\"left\\\":\\\"42.603767573124884%\\\",\\\"width\\\":\\\"5.451997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"1,994,150\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":101.00000181927523,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to top\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"a04f824f-4454-4452-8bbf-651d4d5477c3\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":51.99998699681006,\\\"x\\\":811.5146364804583,\\\"h\\\":43.000010455188466,\\\"i\\\":\\\"es-drager-1762848322084-5\\\",\\\"y\\\":345.3521537580295,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"34.93100454508466%\\\",\\\"left\\\":\\\"43.805695879732%\\\",\\\"width\\\":\\\"2.806968000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.3492809999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.99998699681005,\\\"height\\\":43.000010455188466},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2d91eb63-bada-4811-8c1b-65189dcf7599\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":76.00000522075926,\\\"x\\\":803.3692688716295,\\\"h\\\":43.00000056849445,\\\"i\\\":\\\"es-drager-1762848304881-4\\\",\\\"y\\\":430.9969452788255,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"43.59363649719883%\\\",\\\"left\\\":\\\"43.36600757312489%\\\",\\\"width\\\":\\\"4.102492999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.34928%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":76.00000522075925,\\\"height\\\":43.00000056849446},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"54cf0d91-5cd0-40b5-8034-95d55014f90e\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":64.00000537144585,\\\"x\\\":1033.0246263328966,\\\"h\\\":88.9999997971126,\\\"i\\\":\\\"es-drager-1762848210868-3\\\",\\\"y\\\":465.157090512513,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"47.048800090169316%\\\",\\\"left\\\":\\\"55.76284220044669%\\\",\\\"width\\\":\\\"3.454731000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.001997999999999%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":64.00000537144585,\\\"height\\\":88.9999997971126},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":61.99999304634536,\\\"x\\\":1164.7010515207064,\\\"h\\\":84.99999169692029,\\\"i\\\":\\\"es-drager-1762848205032-2\\\",\\\"y\\\":414.5123157421458,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"41.92628141339864%\\\",\\\"left\\\":\\\"62.870757667411134%\\\",\\\"width\\\":\\\"3.3467700000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"8.597412999999998%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":61.99999304634537,\\\"height\\\":84.99999169692029},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":70.00000529610256,\\\"x\\\":675.9789007962789,\\\"h\\\":91.9999984572363,\\\"i\\\":\\\"es-drager-1762848199690-1\\\",\\\"y\\\":474.01993004375464,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"47.94524125776971%\\\",\\\"left\\\":\\\"36.48945418633911%\\\",\\\"width\\\":\\\"3.7786120000000007%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.305436%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":70.00000529610256,\\\"height\\\":91.9999984572363},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":11.000002949424383,\\\"x\\\":247.82881673228633,\\\"h\\\":17.000002294061673,\\\"i\\\":\\\"es-drager-1762776290330-1\\\",\\\"y\\\":237.77959838698735,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.050465999999997%\\\",\\\"left\\\":\\\"13.377841000000002%\\\",\\\"width\\\":\\\"0.593782%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"1.719483%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":11.000002949424381,\\\"height\\\":17.000002294061673},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_17_1763552004773.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":131.9999983424479,\\\"x\\\":379.57794515961206,\\\"h\\\":35.99999380817846,\\\"i\\\":\\\"es-drager-1762775755103-5\\\",\\\"y\\\":100.65181473429544,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"10.180533%\\\",\\\"left\\\":\\\"20.489681000000004%\\\",\\\"width\\\":\\\"7.125381999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.6412570000000004%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"超支合同总数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":131.9999983424479,\\\"height\\\":35.99999380817846},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFD3D3\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":41.99999947259708,\\\"x\\\":394.9003504185903,\\\"h\\\":30.00000637462507,\\\"i\\\":\\\"es-drager-1762775743083-4\\\",\\\"y\\\":85.321220272333,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.629903999999998%\\\",\\\"left\\\":\\\"21.316787000000005%\\\",\\\"width\\\":\\\"2.267167000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.034382%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":41.99999947259708,\\\"height\\\":30.00000637462507},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBE5F5\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":51.00000862224333,\\\"x\\\":373.37631562661164,\\\"h\\\":37.00000324824705,\\\"i\\\":\\\"es-drager-1762775732063-3\\\",\\\"y\\\":82.78898087969645,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.373777999999996%\\\",\\\"left\\\":\\\"20.154916000000004%\\\",\\\"width\\\":\\\"2.752989000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7424040000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"51\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.00000862224333,\\\"height\\\":37.00000324824705},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBE5F5\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":26,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":131.9999983424479,\\\"x\\\":175.8616630329137,\\\"h\\\":35.99999380817846,\\\"i\\\":\\\"es-drager-1762775491330-2\\\",\\\"y\\\":102.04689646741414,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"10.321639999999999%\\\",\\\"left\\\":\\\"9.493042000000003%\\\",\\\"width\\\":\\\"7.125381999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.6412570000000004%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同到期总数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":131.9999983424479,\\\"height\\\":35.99999380817846},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#EFF1CA\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":113.99999856847775,\\\"x\\\":1682.1316877454951,\\\"h\\\":32.99999514805475,\\\"i\\\":\\\"es-drager-1762421807094-36\\\",\\\"y\\\":163.459559605057,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"16.533287999999995%\\\",\\\"left\\\":\\\"90.80175000000001%\\\",\\\"width\\\":\\\"6.153739000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.3378189999999996%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"总应收金额\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":113.99999856847775,\\\"height\\\":32.99999514805475},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#ACCDF2\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#D7EDFF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#4D699D\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2811e8ee-093c-4be8-8ae8-e06b1d2b3b0c\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":51.00000862224333,\\\"x\\\":1736.1289403823714,\\\"h\\\":39.00000235499617,\\\"i\\\":\\\"es-drager-1762421803113-35\\\",\\\"y\\\":132.5240243353311,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"13.404280952114176%\\\",\\\"left\\\":\\\"93.71653073348223%\\\",\\\"width\\\":\\\"2.752989000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.944695999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.00000862224333,\\\"height\\\":39.00000235499617},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#A5BECF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"58cdf874-8a47-4b55-8c44-8bfc3eb806d9\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":69.00000839621347,\\\"x\\\":1683.131684645384,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"es-drager-1762421795606-34\\\",\\\"y\\\":125.45955680343542,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.689738%\\\",\\\"left\\\":\\\"90.85573%\\\",\\\"width\\\":\\\"3.7246319999999993%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"3898\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":69.00000839621347,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"a04f824f-4454-4452-8bbf-651d4d5477c3\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":113.99999856847775,\\\"x\\\":1522.6872394711825,\\\"h\\\":32.99999514805475,\\\"i\\\":\\\"es-drager-1762421729992-33\\\",\\\"y\\\":163.459559605057,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"16.533287999999995%\\\",\\\"left\\\":\\\"82.194912%\\\",\\\"width\\\":\\\"6.153739000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.3378189999999996%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目累计欠款\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":113.99999856847775,\\\"height\\\":32.99999514805475},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#ACCDF2\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#D7EDFF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#4D699D\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2811e8ee-093c-4be8-8ae8-e06b1d2b3b0c\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":51.00000862224333,\\\"x\\\":1567.9533708468402,\\\"h\\\":39.00000235499617,\\\"i\\\":\\\"es-drager-1762421726217-32\\\",\\\"y\\\":133.2579137508141,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"13.478510964085629%\\\",\\\"left\\\":\\\"84.63838534669647%\\\",\\\"width\\\":\\\"2.752989000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.944695999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.00000862224333,\\\"height\\\":39.00000235499617},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#A5BECF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"58cdf874-8a47-4b55-8c44-8bfc3eb806d9\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":64.00000537144585,\\\"x\\\":1524.798348154353,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"es-drager-1762421719453-31\\\",\\\"y\\\":126.45955635680997,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.790883999999997%\\\",\\\"left\\\":\\\"82.30887%\\\",\\\"width\\\":\\\"3.454731000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"898\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":64.00000537144585,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FFC5AB\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#E86B6B\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"a04f824f-4454-4452-8bbf-651d4d5477c3\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":64.00000537144585,\\\"x\\\":1383.5322244068514,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"es-drager-1762421654488-30\\\",\\\"y\\\":125.45955680343542,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.689738%\\\",\\\"left\\\":\\\"74.68330100000001%\\\",\\\"width\\\":\\\"3.454731000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"198\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":64.00000537144585,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#6BE5E8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"a04f824f-4454-4452-8bbf-651d4d5477c3\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":51.00000862224333,\\\"x\\\":1420.8772050872835,\\\"h\\\":39.00000235499617,\\\"i\\\":\\\"es-drager-1762421637698-29\\\",\\\"y\\\":131.7462480034502,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"13.325611952114174%\\\",\\\"left\\\":\\\"76.69918930660712%\\\",\\\"width\\\":\\\"2.752989000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.944695999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.00000862224333,\\\"height\\\":39.00000235499617},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#A5BECF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"58cdf874-8a47-4b55-8c44-8bfc3eb806d9\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":77.99999902053742,\\\"x\\\":1392.4094662453533,\\\"h\\\":32.99999514805475,\\\"i\\\":\\\"es-drager-1762421586808-28\\\",\\\"y\\\":164.68177249323125,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"16.656909999999996%\\\",\\\"left\\\":\\\"75.162496%\\\",\\\"width\\\":\\\"4.210453000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.3378189999999996%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"欠款数量\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":77.99999902053742,\\\"height\\\":32.99999514805475},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#ACCDF2\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#D7EDFF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#4D699D\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2811e8ee-093c-4be8-8ae8-e06b1d2b3b0c\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000010455188466,\\\"i\\\":\\\"es-drager-1762421434219-27\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":133.99999214222606,\\\"x\\\":1711.798361243923,\\\"y\\\":203.45956151342773,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"20.579129999999996%\\\",\\\"left\\\":\\\"92.40316200000001%\\\",\\\"width\\\":\\\"7.233342000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.3492809999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970187673600\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目/合同名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":133.99999214222606,\\\"height\\\":43.000010455188466},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#A2C8F2\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"40d1d9a6-fa9d-4e2d-b25f-aa85c9c09609\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000010455188466,\\\"i\\\":\\\"es-drager-1762420435770-26\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":99.0000080194971,\\\"x\\\":1312.7983569915898,\\\"y\\\":198.45955385986088,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"20.073398999999995%\\\",\\\"left\\\":\\\"70.865075%\\\",\\\"width\\\":\\\"5.344037%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.3492809999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970187673600\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"费项明细\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":99.0000080194971,\\\"height\\\":43.000010455188466},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"40d1d9a6-fa9d-4e2d-b25f-aa85c9c09609\\\"},{\\\"component\\\":\\\"JMultipleBar\\\",\\\"visible\\\":true,\\\"w\\\":514.9999966205892,\\\"x\\\":1324.7983383155806,\\\"h\\\":202.99999831528342,\\\"i\\\":\\\"0e6f2873-f014-44d9-92dc-fb5faf81406f\\\",\\\"y\\\":242.4595638684239,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.523825999999996%\\\",\\\"left\\\":\\\"71.512836%\\\",\\\"width\\\":\\\"27.799786000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"20.532647%\\\"},\\\"componentName\\\":\\\"对比柱形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"租金\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 910,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"应收\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"水电\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 910,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"应收\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"物业\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 960,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"应收\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"租金\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 800,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实收\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"水电\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 700,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实收\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"物业\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 700,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"实收\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"租金\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 480,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"欠款\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"水电\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 230,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"欠款\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"物业\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 400,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"欠款\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":514.9999966205892,\\\"height\\\":202.99999831528342},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"name\\\":\\\"单位(万元)\\\",\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color1\\\":\\\"#006CFF00\\\",\\\"color\\\":\\\"#006CFFB3\\\"},{\\\"color1\\\":\\\"#00D8FF00\\\",\\\"color\\\":\\\"#00D8FFB5\\\"},{\\\"color1\\\":\\\"#FFBB3800\\\",\\\"color\\\":\\\"#FFBB38B5\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":24,\\\"bottom\\\":18,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":15,\\\"barGap\\\":\\\"100%\\\",\\\"itemStyle\\\":{\\\"borderRadius\\\":7},\\\"label\\\":{\\\"color\\\":\\\"#4A90E2\\\",\\\"show\\\":true,\\\"position\\\":\\\"top\\\"}}],\\\"legend\\\":{},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"visible\\\":true,\\\"h\\\":43.000010455188466,\\\"i\\\":\\\"es-drager-1762420262561-25\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":99.0000080194971,\\\"x\\\":1318.7983569162466,\\\"y\\\":718.4595490085985,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"72.66934199999999%\\\",\\\"left\\\":\\\"71.18895600000002%\\\",\\\"width\\\":\\\"5.344037%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.3492809999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970187673600\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"欠款分析\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":99.0000080194971,\\\"height\\\":43.000010455188466},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"40d1d9a6-fa9d-4e2d-b25f-aa85c9c09609\\\"},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":514.9999966205892,\\\"x\\\":1329.7983413403485,\\\"h\\\":220.00000060934508,\\\"i\\\":\\\"c01aa5d0-70b0-4813-b062-a2ee7a8589dd\\\",\\\"y\\\":764.4595383505226,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"77.32205899999998%\\\",\\\"left\\\":\\\"71.78273700000001%\\\",\\\"width\\\":\\\"27.799786000000005%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"22.25213%\\\"},\\\"componentName\\\":\\\"滚动列表(单行)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[{\\\\\\\"id\\\\\\\":1,\\\\\\\"projectName\\\\\\\":\\\\\\\"项目A\\\\\\\",\\\\\\\"officeFee\\\\\\\":1200,\\\\\\\"travelFee\\\\\\\":5600,\\\\\\\"arrearsAmount\\\\\\\":3000},{\\\\\\\"id\\\\\\\":2,\\\\\\\"projectName\\\\\\\":\\\\\\\"项目B\\\\\\\",\\\\\\\"officeFee\\\\\\\":800,\\\\\\\"travelFee\\\\\\\":4200,\\\\\\\"arrearsAmount\\\\\\\":0},{\\\\\\\"id\\\\\\\":3,\\\\\\\"projectName\\\\\\\":\\\\\\\"项目C\\\\\\\",\\\\\\\"officeFee\\\\\\\":1500,\\\\\\\"travelFee\\\\\\\":1800,\\\\\\\"arrearsAmount\\\\\\\":1200},{\\\\\\\"id\\\\\\\":4,\\\\\\\"projectName\\\\\\\":\\\\\\\"项目D\\\\\\\",\\\\\\\"officeFee\\\\\\\":600,\\\\\\\"travelFee\\\\\\\":2300,\\\\\\\"arrearsAmount\\\\\\\":900},{\\\\\\\"id\\\\\\\":5,\\\\\\\"projectName\\\\\\\":\\\\\\\"项目E\\\\\\\",\\\\\\\"officeFee\\\\\\\":950,\\\\\\\"travelFee\\\\\\\":3000,\\\\\\\"arrearsAmount\\\\\\\":150}]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":514.9999966205892,\\\"height\\\":220.00000060934508},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"timeOut\\\":0,\\\"option\\\":{\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"marginRight\\\":15,\\\"name\\\":\\\"项目名称\\\",\\\"width\\\":116,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"projectName\\\",\\\"marginLeft\\\":10},{\\\"marginRight\\\":1,\\\"textAlign\\\":\\\"left\\\",\\\"compose\\\":{\\\"contentStyle\\\":{\\\"marginRight\\\":4,\\\"fontSize\\\":15,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#038F8A\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#06CFC8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"marginLeft\\\":3},\\\"suffixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"prefix\\\":\\\"办公费\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#DEDEDE\\\"},\\\"suffix\\\":\\\"元\\\",\\\"enabled\\\":true},\\\"name\\\":\\\"办公费\\\",\\\"width\\\":108,\\\"textStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"officeFee\\\"},{\\\"marginRight\\\":13,\\\"textAlign\\\":\\\"left\\\",\\\"compose\\\":{\\\"contentStyle\\\":{\\\"marginRight\\\":1,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#038F8A\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#06CFC8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"marginLeft\\\":1},\\\"suffixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"prefix\\\":\\\"差旅费\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#DEDEDE\\\"},\\\"suffix\\\":\\\"元\\\",\\\"enabled\\\":true},\\\"name\\\":\\\"差旅费\\\",\\\"width\\\":111,\\\"textStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"travelFee\\\"},{\\\"textAlign\\\":\\\"left\\\",\\\"compose\\\":{\\\"contentStyle\\\":{\\\"marginRight\\\":2,\\\"fontSize\\\":16,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0DA183\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#12E3B9\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginLeft\\\":3},\\\"suffixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"prefix\\\":\\\"欠款金额\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"suffix\\\":\\\"元\\\",\\\"enabled\\\":true},\\\"name\\\":\\\"欠款金额\\\",\\\"width\\\":122,\\\"textStyle\\\":{\\\"fontColor\\\":\\\"#DC3545\\\"},\\\"key\\\":\\\"arrearsAmount\\\"}],\\\"itemsPerRow\\\":1,\\\"borderRadius\\\":8,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"backgroundColor\\\":\\\"#FFFFFF\\\",\\\"backgroundImg\\\":\\\"drag/lib/img/scrollList-bg-01.png\\\",\\\"alternateBackgroundColor\\\":\\\"#F8F9FA\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":10,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"image\\\",\\\"height\\\":44}}}},{\\\"visible\\\":true,\\\"h\\\":43.000010455188466,\\\"i\\\":\\\"es-drager-1762420151147-24\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":99.0000080194971,\\\"x\\\":1319.128959818718,\\\"y\\\":444.6612017548762,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"44.97572199999999%\\\",\\\"left\\\":\\\"71.206802%\\\",\\\"width\\\":\\\"5.344037%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.3492809999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970187673600\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"账期监控\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":99.0000080194971,\\\"height\\\":43.000010455188466},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"40d1d9a6-fa9d-4e2d-b25f-aa85c9c09609\\\"},{\\\"component\\\":\\\"JPermanentCalendar\\\",\\\"visible\\\":true,\\\"w\\\":477.0000032728707,\\\"x\\\":1347.6529914352425,\\\"h\\\":219.0000010559705,\\\"i\\\":\\\"da53da9d-fbc3-45f8-8f66-da05f0b73aad\\\",\\\"y\\\":493.1934304894369,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"49.884564999999995%\\\",\\\"left\\\":\\\"72.74653400000001%\\\",\\\"width\\\":\\\"25.748540000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"22.150983999999998%\\\"},\\\"componentName\\\":\\\"万日历\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[],\\\"dataType\\\":1,\\\"h\\\":480,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-05\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 620000\\\\n  },\\\\n  {\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-08\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 265000\\\\n  },\\\\n  {\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-10\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 564000\\\\n  },\\\\n  {\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-14\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 120000\\\\n  },\\\\n  {\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-15\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 565000\\\\n  },\\\\n  {\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-20\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 120000\\\\n  },\\\\n  {\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-24\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 102000\\\\n  },\\\\n  {\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-25\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 120\\\\n  },\\\\n  {\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-28\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 103\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":477.0000032728707,\\\"height\\\":219.0000010559705},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":1000,\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"container\\\":{\\\"border\\\":{\\\"color\\\":\\\"#2B6CB0\\\",\\\"width\\\":0,\\\"style\\\":\\\"solid\\\",\\\"enabled\\\":true},\\\"padding\\\":{\\\"top\\\":5,\\\"left\\\":4,\\\"bottom\\\":8,\\\"right\\\":0},\\\"margin\\\":{\\\"bottom\\\":0},\\\"background\\\":{\\\"color\\\":\\\"#00000000\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0A1E3A\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to bottom\\\",\\\"startColor\\\":\\\"#0B2B58\\\"}}},\\\"dataVal\\\":{\\\"offsetX\\\":-2,\\\"offsetY\\\":-15,\\\"color\\\":{\\\"gradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"value\\\":\\\"#D0021B\\\"},\\\"fontSize\\\":14,\\\"position\\\":\\\"top\\\"},\\\"week\\\":{\\\"color\\\":{\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"value\\\":\\\"#FFFFFF\\\"},\\\"prefix\\\":\\\"周\\\",\\\"start\\\":\\\"sun\\\",\\\"fontSize\\\":21,\\\"marginBottom\\\":21,\\\"showEn\\\":false,\\\"fontWeight\\\":\\\"bold\\\",\\\"height\\\":22},\\\"month\\\":{\\\"offsetTop\\\":-11,\\\"color\\\":{\\\"gradient\\\":{\\\"endColor\\\":\\\"#ffffff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom\\\",\\\"startColor\\\":\\\"#ffffff\\\"},\\\"value\\\":\\\"#ffffff\\\"},\\\"show\\\":true,\\\"en\\\":{\\\"color\\\":{\\\"value\\\":\\\"#FFFFFF\\\"},\\\"fontSize\\\":29,\\\"opacity\\\":1},\\\"offsetLeft\\\":0,\\\"cn\\\":{\\\"color\\\":{\\\"gradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"value\\\":\\\"#FFFFFF\\\"},\\\"fontSize\\\":70,\\\"opacity\\\":0.11,\\\"fontStyle\\\":\\\"italic\\\"},\\\"position\\\":\\\"center\\\",\\\"showEn\\\":false},\\\"field\\\":{\\\"unit\\\":\\\"万\\\",\\\"appendUnit\\\":true,\\\"dateField\\\":\\\"date\\\",\\\"valueField\\\":\\\"value\\\"},\\\"title\\\":{\\\"color\\\":{\\\"gradient\\\":{\\\"endColor\\\":\\\"#3bc6ff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#9fe5ff\\\"},\\\"value\\\":\\\"#9fe5ff\\\"},\\\"show\\\":true},\\\"cell\\\":{\\\"width\\\":120,\\\"day\\\":{\\\"color\\\":{\\\"value\\\":\\\"#FFFFFF\\\"},\\\"fontSize\\\":14},\\\"height\\\":25},\\\"circle\\\":{\\\"dashed\\\":false,\\\"strokeWidth\\\":4,\\\"glowStrength\\\":0.45,\\\"fillOpacity\\\":0.16,\\\"size\\\":37,\\\"minIntensity\\\":0.55,\\\"pulse\\\":true,\\\"doubleRing\\\":true,\\\"glowEnabled\\\":true,\\\"enabled\\\":true}}}},{\\\"component\\\":\\\"JMultipleBar\\\",\\\"visible\\\":true,\\\"w\\\":756.0000090320697,\\\"x\\\":546.7983604353072,\\\"h\\\":283.000002132025,\\\"i\\\":\\\"c55fc027-14ba-4db5-81ea-a7ec69526940\\\",\\\"y\\\":705.6693998953094,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"71.375669%\\\",\\\"left\\\":\\\"29.516267000000003%\\\",\\\"width\\\":\\\"40.809007000000015%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"28.62433100000001%\\\"},\\\"componentName\\\":\\\"对比柱形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 325,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 465,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 305,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 105,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 256,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 600,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"7月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 500,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"8月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 132,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"9月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 156,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"10月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 213,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"11月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 356,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"12月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 113,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"成本支出金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 50,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 450,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 365,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 355,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 49,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 60,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"7月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 117,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"8月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 229,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"9月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 119,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"10月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 103,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"11月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 90,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"12月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 143,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"租赁收入金额\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":756.0000090320697,\\\"height\\\":283.000002132025},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"name\\\":\\\"单位(万元)\\\",\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color1\\\":\\\"#00A8FF\\\",\\\"color\\\":\\\"#0F3352\\\"},{\\\"color1\\\":\\\"#15DBCB\\\",\\\"color\\\":\\\"#0F3352\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":35,\\\"left\\\":1,\\\"bottom\\\":18,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":12,\\\"itemStyle\\\":{\\\"borderRadius\\\":0},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}}],\\\"legend\\\":{\\\"r\\\":1,\\\"t\\\":1},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"visible\\\":true,\\\"h\\\":59.9999929758621,\\\"i\\\":\\\"es-drager-1762419089506-23\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.00001021548871,\\\"x\\\":572.3306080699609,\\\"y\\\":650.5322268067889,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"65.798762%\\\",\\\"left\\\":\\\"30.894502000000006%\\\",\\\"width\\\":\\\"9.176629%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.0687619999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970187673600\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"资金流动趋势\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.00001021548871,\\\"height\\\":59.9999929758621},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"40d1d9a6-fa9d-4e2d-b25f-aa85c9c09609\\\"},{\\\"visible\\\":true,\\\"h\\\":35.99999380817846,\\\"i\\\":\\\"es-drager-1762419081801-22\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JImg\\\",\\\"w\\\":725.9999908834636,\\\"x\\\":555.7983510596312,\\\"y\\\":664.266120184477,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"67.18789099999998%\\\",\\\"left\\\":\\\"30.002088000000004%\\\",\\\"width\\\":\\\"39.18960100000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.6412570000000004%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146300970204450816\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":725.9999908834637,\\\"height\\\":35.99999380817846},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"d05d8636-fe01-4048-8a21-99851c7012b1\\\"},{\\\"visible\\\":true,\\\"h\\\":37.00000324824705,\\\"i\\\":\\\"es-drager-1762419024578-19\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":134.99998904211512,\\\"x\\\":551.209851019992,\\\"y\\\":210.79835561773643,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"21.321419999999993%\\\",\\\"left\\\":\\\"29.754400000000004%\\\",\\\"width\\\":\\\"7.287322000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7424040000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970175090688\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目欠款分布\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":134.99998904211512,\\\"height\\\":37.00000324824705},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"e190480f-f18e-453c-88fe-e109292f6fdf\\\"},{\\\"visible\\\":true,\\\"h\\\":346.9999933213852,\\\"i\\\":\\\"f8220f2d-63b9-471c-a776-57a0d72f73c2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JListProgress\\\",\\\"w\\\":533.9999932944485,\\\"x\\\":13.72565215056514,\\\"y\\\":623.9917724037379,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.11429999999999%\\\",\\\"left\\\":\\\"0.7409130000000002%\\\",\\\"width\\\":\\\"28.825409000000008%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"35.09767699999999%\\\"},\\\"componentName\\\":\\\"列表进度图\\\",\\\"pageCompId\\\":\\\"1146300970011512832\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"2025年度战略合作框架协议\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 1200000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-12-31\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-06-15\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 800000\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"智能制造设备采购合同\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 850000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-20\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-05-30\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 500000\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"信息化系统集成服务合同\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 2000000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2026-01-15\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-07-01\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 1500000\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"2025年技术支持与维护协议\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 600000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-10-10\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-04-28\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 300000\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"大数据平台建设合同\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 1750000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-09-25\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-05-10\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 1200000\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"云服务采购框架协议\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 950000,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-08-31\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-06-01\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 700000\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":533.9999932944485,\\\"height\\\":346.99999332138515},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":1200,\\\"dataType\\\":1,\\\"h\\\":325,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"beginFields\\\":[{\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"name\\\":\\\"合同名称\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"title\\\"},{\\\"compose\\\":{\\\"contentStyle\\\":{\\\"marginRight\\\":1,\\\"fontSize\\\":12,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#78F7FA\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#78F7FA\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginLeft\\\":0},\\\"suffixStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#78F7FA\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#78F7FA\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#666666\\\"},\\\"suffix\\\":\\\"万元\\\",\\\"enabled\\\":true},\\\"name\\\":\\\"总额\\\",\\\"width\\\":100,\\\"style\\\":{\\\"fontSize\\\":21,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FF4500\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFD700\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"total\\\"}],\\\"endCurrent\\\":0,\\\"endInfo\\\":{\\\"width\\\":103},\\\"scroll\\\":{\\\"count\\\":1,\\\"interval\\\":3000,\\\"enabled\\\":true,\\\"direction\\\":\\\"down\\\"},\\\"centerTopFields\\\":[{\\\"marginRight\\\":0,\\\"name\\\":\\\"最近日期\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#888888\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"endLabel\\\",\\\"marginLeft\\\":0},{\\\"marginRight\\\":0,\\\"isUseExceedFillColor\\\":true,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"marginRight\\\":0,\\\"fontColor\\\":\\\"#6EEDF3\\\",\\\"marginLeft\\\":0},\\\"suffixStyle\\\":{\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"fontColor\\\":\\\"#6EEDF3\\\"},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"\\\",\\\"enabled\\\":true},\\\"showPercentage\\\":true,\\\"name\\\":\\\"进度值\\\",\\\"width\\\":100,\\\"style\\\":{\\\"fontSize\\\":12,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#00D4FF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontColor\\\":\\\"#6EEDF3\\\"},\\\"key\\\":\\\"value\\\",\\\"marginLeft\\\":0}],\\\"body\\\":{\\\"gradient\\\":{\\\"type\\\":\\\"linear\\\"}},\\\"endFields\\\":[{\\\"name\\\":\\\"到期日期\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"date\\\"}],\\\"beginCurrent\\\":1,\\\"progressSection\\\":{\\\"marginRight\\\":0,\\\"marginLeft\\\":0},\\\"bar\\\":{\\\"border\\\":{\\\"padding\\\":8,\\\"color\\\":\\\"#4ECBFC21\\\",\\\"width\\\":2,\\\"enabled\\\":true},\\\"total\\\":{\\\"field\\\":\\\"total\\\",\\\"type\\\":\\\"field\\\",\\\"value\\\":0},\\\"borderRadius\\\":8,\\\"background\\\":{\\\"color\\\":\\\"#5A97FC4F\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom\\\",\\\"startColor\\\":\\\"#FFFFFF\\\"}},\\\"indicatorColor\\\":\\\"#02F7FFA3\\\",\\\"exceed\\\":{\\\"indicatorColor\\\":\\\"#FEF8C9A1\\\",\\\"fill\\\":{\\\"color\\\":\\\"#FFB347\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FEAF24\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FEF6C8\\\",\\\"direction\\\":\\\"to right\\\"}},\\\"percent\\\":70,\\\"enabled\\\":true},\\\"indicatorSize\\\":10,\\\"fill\\\":{\\\"color\\\":\\\"#33C9FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#24E5F1\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#C5FDFE\\\"}},\\\"valueField\\\":\\\"value\\\",\\\"height\\\":3},\\\"centerTopInfo\\\":{\\\"layout\\\":\\\"horizontal\\\"},\\\"centerTopCurrent\\\":1,\\\"row\\\":{\\\"marginRight\\\":0,\\\"padding\\\":\\\"0 0\\\",\\\"marginBottom\\\":0,\\\"marginTop\\\":12,\\\"height\\\":31,\\\"marginLeft\\\":9},\\\"beginInfo\\\":{\\\"layout\\\":\\\"vertical\\\",\\\"width\\\":176}}},\\\"key\\\":\\\"a436dea0-cd2d-4a65-aa6b-426cde282aec\\\"},{\\\"visible\\\":true,\\\"h\\\":304.99999230626537,\\\"i\\\":\\\"8cc8a3c3-0948-4171-b8d4-209129a39128\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JCardScroll\\\",\\\"w\\\":531.9999994946703,\\\"x\\\":4.733886769359984,\\\"y\\\":279.3786642995031,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"28.258046999999998%\\\",\\\"left\\\":\\\"0.2555360000000001%\\\",\\\"width\\\":\\\"28.717449000000006%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"30.849542999999997%\\\"},\\\"componentName\\\":\\\"卡片滚动(高亮)\\\",\\\"pageCompId\\\":\\\"1146300970061844480\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[],\\\"dataType\\\":1,\\\"h\\\":304,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"苏州地铁5号线工程\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"分期\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966786720503390209\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"南京软件园研发楼\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"二期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"一次性付款\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966786777713696769\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"重庆智慧交通枢纽\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"三期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"分期\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966786804406247425\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"武汉光谷科技园\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"分期\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966786837256036353\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"上海浦东新区道路改造\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"二期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"一次性付款\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\",\\\\n      \\\\\\\"道路工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966786864602898433\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"深圳南山创新中心\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"三期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"分期\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\",\\\\n      \\\\\\\"道路工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966786897117143041\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"成都高新产业园\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"分期\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966786931179085826\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"杭州滨江智慧社区\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"二期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"一次性付款\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966786962128855042\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"广州南沙港区扩建\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"三期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"分期\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966787000406073346\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"天津生态城住宅项目\\\\\\\",\\\\n    \\\\\\\"status\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"paymentMethod\\\\\\\": \\\\\\\"分期\\\\\\\",\\\\n    \\\\\\\"type\\\\\\\": [\\\\n      \\\\\\\"建筑工程\\\\\\\",\\\\n      \\\\\\\"市政工程\\\\\\\"\\\\n    ],\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1966787029329993729\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":531.9999994946703,\\\"height\\\":304.99999230626537},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":540,\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"showIndex\\\":true,\\\"autoScrollEnabled\\\":true,\\\"rowGap\\\":16,\\\"indexFieldStyle\\\":{},\\\"contentFieldMapping\\\":[{\\\"valueStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#A6D8FF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"itemConfig\\\":{\\\"alignItems\\\":\\\"flex-start\\\",\\\"marginBottom\\\":24,\\\"marginTop\\\":13,\\\"height\\\":40},\\\"nameStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"omitConfig\\\":{\\\"show\\\":true,\\\"lines\\\":2},\\\"name\\\":\\\"项目名称\\\",\\\"width\\\":100,\\\"key\\\":\\\"projectName\\\",\\\"showLabel\\\":false},{\\\"valueStyle\\\":{\\\"fontSize\\\":16,\\\"marginBottom\\\":10,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"marginTop\\\":-5},\\\"itemConfig\\\":{\\\"alignItems\\\":\\\"flex-start\\\",\\\"justifyContent\\\":\\\"center\\\"},\\\"nameStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"name\\\":\\\"进度\\\",\\\"width\\\":100,\\\"key\\\":\\\"status\\\",\\\"showLabel\\\":false},{\\\"valueStyle\\\":{\\\"fontSize\\\":12,\\\"marginBottom\\\":0,\\\"fontColor\\\":\\\"#BFBFBF\\\",\\\"marginTop\\\":-10},\\\"itemConfig\\\":{\\\"alignItems\\\":\\\"center\\\",\\\"layoutDirection\\\":\\\"row\\\",\\\"justifyContent\\\":\\\"center\\\"},\\\"nameStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"name\\\":\\\"付款方式\\\",\\\"width\\\":100,\\\"key\\\":\\\"paymentMethod\\\",\\\"showLabel\\\":false},{\\\"valueStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"itemConfig\\\":{\\\"alignItems\\\":\\\"center\\\",\\\"layoutDirection\\\":\\\"column\\\",\\\"justifyContent\\\":\\\"flex-start\\\"},\\\"nameStyle\\\":{\\\"fontSize\\\":14,\\\"marginBottom\\\":10,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"marginTop\\\":26},\\\"valueType\\\":\\\"array\\\",\\\"name\\\":\\\"合同类型\\\",\\\"width\\\":100,\\\"key\\\":\\\"type\\\"}],\\\"autoScrollSpeed\\\":100,\\\"scrollDirection\\\":\\\"left\\\",\\\"animationDuration\\\":800,\\\"columnGap\\\":16,\\\"stayDuration\\\":5000,\\\"contentCurrent\\\":1,\\\"cardStyle\\\":{\\\"backgroundColor\\\":\\\"#0648786E\\\",\\\"borderColor\\\":\\\"#1890FF\\\",\\\"backgroundImage\\\":\\\"https://static.jeecg.com/jimureport/images/组-1121_05_1757733370432.png\\\",\\\"paddingRight\\\":5,\\\"borderEnabled\\\":false,\\\"paddingBottom\\\":5,\\\"borderRadius\\\":0,\\\"borderWidth\\\":1,\\\"width\\\":122,\\\"paddingTop\\\":5,\\\"bgHighlightImage\\\":\\\"https://static.jeecg.com/jimureport/images/组-1121_03_1757735281389.png\\\",\\\"borderStyle\\\":\\\"dashed\\\",\\\"paddingLeft\\\":5,\\\"height\\\":300},\\\"currentValue\\\":0,\\\"direction\\\":\\\"horizontal\\\"}},\\\"key\\\":\\\"cb43a6dd-2191-428e-8d28-101517716e82\\\"},{\\\"visible\\\":true,\\\"h\\\":52.99999610224011,\\\"i\\\":\\\"874a6164-d6b8-400c-8d6c-7224b8d8fa73\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":95.0000018946185,\\\"x\\\":269.38688254140277,\\\"y\\\":179.11254927232653,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.116525999999997%\\\",\\\"left\\\":\\\"14.541549000000003%\\\",\\\"width\\\":\\\"5.128116%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.360739999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970103787520\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"详情>\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":95.00000189461852,\\\"height\\\":52.99999610224012},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"setModalCited\\\":true,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#5A868B\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#36363600\\\",\\\"backgroundImage\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/产城详情_032_1763553721746.png\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"targetCompId\\\":\\\"es-drager-1762409324858-6\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"\\\",\\\"sizeMode\\\":\\\"fit\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F00\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"42c54784-6b0f-4d44-84f0-2c8a63af9b79\\\"},{\\\"visible\\\":true,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"es-drager-1762399836630-5\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":67.99999297100209,\\\"x\\\":251.18523463376653,\\\"y\\\":182.11254793245024,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.419963999999997%\\\",\\\"left\\\":\\\"13.559021000000001%\\\",\\\"width\\\":\\\"3.6706510000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970124759040\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":67.99999297100209,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#5A868B\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"fe69c43c-3bfb-4983-8a75-a3d98c2b240d\\\"},{\\\"visible\\\":true,\\\"h\\\":52.99999610224011,\\\"i\\\":\\\"39150764-32e5-464a-8d07-abca92992b3e\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":94.00000499472947,\\\"x\\\":198.65299660081877,\\\"y\\\":176.58030987969,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"17.860399999999995%\\\",\\\"left\\\":\\\"10.723322%\\\",\\\"width\\\":\\\"5.074136000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.360739999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970141536256\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"6,790\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":94.00000499472947,\\\"height\\\":52.99999610224012},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"1b524244-da11-4aa4-a0af-a750ed3fe210\\\"},{\\\"visible\\\":true,\\\"h\\\":46.99999878199271,\\\"i\\\":\\\"8f386c60-44f0-4bf0-85e1-dfc3ebbc975f\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":109.99999244359917,\\\"x\\\":125.18521769065302,\\\"y\\\":179.5803085398137,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.163837999999995%\\\",\\\"left\\\":\\\"6.757519000000002%\\\",\\\"width\\\":\\\"5.937818000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.753863999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970154119168\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目总数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":109.99999244359917,\\\"height\\\":46.99999878199271},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"546303e1-9281-41dd-88d7-56a2175baf6a\\\"},{\\\"visible\\\":true,\\\"h\\\":37.00000324824705,\\\"i\\\":\\\"es-drager-1762399377808-4\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":114.99999546836682,\\\"x\\\":12.20164798297948,\\\"y\\\":93.395080190355,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.446542999999998%\\\",\\\"left\\\":\\\"0.6586470000000001%\\\",\\\"width\\\":\\\"6.207719000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7424040000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970175090688\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同预警\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":114.99999546836682,\\\"height\\\":37.00000324824705},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"4a9caef5-fe02-44c4-9191-9e069c016e1f\\\"},{\\\"visible\\\":true,\\\"h\\\":59.9999929758621,\\\"i\\\":\\\"es-drager-1762398785719-3\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.00001021548871,\\\"x\\\":1319.7983538161357,\\\"y\\\":1.9999991067491294,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0.20229199999999942%\\\",\\\"left\\\":\\\"71.24293600000001%\\\",\\\"width\\\":\\\"9.176629%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.0687619999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970187673600\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"租赁系统数据\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.00001021548871,\\\"height\\\":59.9999929758621},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"40d1d9a6-fa9d-4e2d-b25f-aa85c9c09609\\\"},{\\\"visible\\\":true,\\\"h\\\":35.99999380817846,\\\"i\\\":\\\"es-drager-1762398759885-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JImg\\\",\\\"w\\\":537.0000025194379,\\\"x\\\":1315.532231435849,\\\"y\\\":17.266122437005365,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.7463999999999997%\\\",\\\"left\\\":\\\"71.01265%\\\",\\\"width\\\":\\\"28.98735%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.6412570000000004%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146300970204450816\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":537.0000025194379,\\\"height\\\":35.99999380817846},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"d05d8636-fe01-4048-8a21-99851c7012b1\\\"},{\\\"visible\\\":true,\\\"h\\\":59.9999929758621,\\\"i\\\":\\\"68f75009-8c50-4375-8985-6f36fcbcbace\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.00001021548871,\\\"x\\\":4.20163573322229,\\\"y\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0%\\\",\\\"left\\\":\\\"0.22680500000000006%\\\",\\\"width\\\":\\\"9.176629%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.0687619999999995%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"pageCompId\\\":\\\"1146300970217033728\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"成本系统数据\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.00001021548871,\\\"height\\\":59.9999929758621},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2859886c-0e76-46eb-b86b-64326ad27bbf\\\"},{\\\"visible\\\":true,\\\"h\\\":35.000004141497904,\\\"i\\\":\\\"bf455d73-9694-488e-897d-ab5c552a2e95\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JImg\\\",\\\"w\\\":543.0000024440947,\\\"x\\\":0,\\\"y\\\":15.733882597743403,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.5914199999999996%\\\",\\\"left\\\":\\\"0%\\\",\\\"width\\\":\\\"29.311231000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.5401119999999993%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1146300970233810944\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":543.0000024440947,\\\"height\\\":35.000004141497904},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"c77e6615-da1a-4c2e-8e3b-2bb9002c9184\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":41.000002572708,\\\"x\\\":194.9824077577821,\\\"h\\\":29.99999648793105,\\\"i\\\":\\\"a3e3e41c-44ed-4d59-bb93-372d8d63fb1f\\\",\\\"y\\\":89.24855128478228,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.027138%\\\",\\\"left\\\":\\\"10.525183%\\\",\\\"width\\\":\\\"2.213187%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.0343809999999998%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":41.000002572708,\\\"height\\\":29.99999648793105},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBE5F5\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":149.9999981164181,\\\"x\\\":321.2637687712664,\\\"h\\\":99.99999488423282,\\\"i\\\":\\\"es-drager-1762774351674-1\\\",\\\"y\\\":67.59554452387727,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.837021999999997%\\\",\\\"left\\\":\\\"17.341872%\\\",\\\"width\\\":\\\"8.097025000000002%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.114603999999998%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":149.9999981164181,\\\"height\\\":99.99999488423282},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_41_1763551881751.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":51.00000862224333,\\\"x\\\":170.92614665521,\\\"h\\\":37.00000324824705,\\\"i\\\":\\\"f1f7a03d-01ce-4ee5-bcc4-06a169d1d2bd\\\",\\\"y\\\":84.18405272612117,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.514883999999999%\\\",\\\"left\\\":\\\"9.226622%\\\",\\\"width\\\":\\\"2.752989000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7424040000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"76\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":51.00000862224333,\\\"height\\\":37.00000324824705},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBE5F5\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":26,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":167.99999789038833,\\\"x\\\":104.88628099031132,\\\"h\\\":104.00000298442514,\\\"i\\\":\\\"2ea9f177-88fc-49ce-a2e7-0a9089f41e0d\\\",\\\"y\\\":66.45838686435945,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.722002999999997%\\\",\\\"left\\\":\\\"5.661779000000001%\\\",\\\"width\\\":\\\"9.068668000000004%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.519188999999999%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":167.99999789038833,\\\"height\\\":104.00000298442514},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_39_1763551870530.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":538.9999963192163,\\\"x\\\":12.66118712893443,\\\"h\\\":35.000004141497904,\\\"i\\\":\\\"3f286895-ab97-45e7-9384-527089c0afd6\\\",\\\"y\\\":186.73973824120662,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.887985999999998%\\\",\\\"left\\\":\\\"0.6834530000000001%\\\",\\\"width\\\":\\\"29.095310000000012%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.5401119999999993%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":538.9999963192163,\\\"height\\\":35.000004141497904},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_13_1763551964951.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":11.999999849313447,\\\"x\\\":248.95778692630336,\\\"h\\\":18.000001847436234,\\\"i\\\":\\\"cea81bd3-6d33-41da-8393-fec1e1ba11f9\\\",\\\"y\\\":594.9542752387625,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"60.177272%\\\",\\\"left\\\":\\\"13.438783%\\\",\\\"width\\\":\\\"0.6477620000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"1.8206289999999996%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":11.999999849313447,\\\"height\\\":18.000001847436234},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_17_1763552004773.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":89.99999886985086,\\\"x\\\":796.3892117165844,\\\"h\\\":124.99999360529105,\\\"i\\\":\\\"82435ec8-26f7-4c2b-8a28-dd8d034db75f\\\",\\\"y\\\":315.88394276806093,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"31.950411545084663%\\\",\\\"left\\\":\\\"42.98922291982134%\\\",\\\"width\\\":\\\"4.858215%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.643255%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":89.99999886985086,\\\"height\\\":124.99999360529107},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":894.0000072991742,\\\"x\\\":487.45604718243874,\\\"h\\\":603.9999971789773,\\\"i\\\":\\\"1b53a65a-6907-45bd-83d7-7d55d7048d91\\\",\\\"y\\\":152.55450644061344,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.430284999999996%\\\",\\\"left\\\":\\\"26.312959000000003%\\\",\\\"width\\\":\\\"48.25827%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"61.092210999999985%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":894.0000072991742,\\\"height\\\":603.9999971789773},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/产城背景地图_1763551428302.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":83.00000204530508,\\\"x\\\":1376.2719838540795,\\\"h\\\":51.999996548865546,\\\"i\\\":\\\"00c0b354-a82e-40dd-b1c2-ef2e1d6d0a09\\\",\\\"y\\\":80.18405451262291,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.1103%\\\",\\\"left\\\":\\\"74.29139200000002%\\\",\\\"width\\\":\\\"4.480354000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.259593999999999%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":83.00000204530508,\\\"height\\\":51.999996548865546},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_25_1763551889963.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}}]},\\\"component\\\":\\\"JGroup\\\",\\\"w\\\":1852.532233955287,\\\"x\\\":22,\\\"y\\\":74,\\\"componentName\\\":\\\"新成\\\",\\\"pageCompId\\\":\\\"1151112776924057600\\\",\\\"equalProportion\\\":false,\\\"key\\\":\\\"f9b7b1c7-f98e-4b8a-b271-bab6cb7ffb0d\\\",\\\"group\\\":true},{\\\"visible\\\":false,\\\"h\\\":982.5087924970692,\\\"i\\\":\\\"es-drager-1762409324858-6\\\",\\\"props\\\":{\\\"elements\\\":[{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":170,\\\"x\\\":763.4701055099648,\\\"h\\\":60,\\\"i\\\":\\\"86652dd5-ea38-431d-9a83-83fa934fcf0a\\\",\\\"y\\\":0,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0%\\\",\\\"left\\\":\\\"44.883604086417684%\\\",\\\"width\\\":\\\"9.994121105232216%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.106815578465063%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目列表\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170,\\\"height\\\":60},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":2,\\\"fontSize\\\":26,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JScrollTable\\\",\\\"visible\\\":true,\\\"w\\\":1701,\\\"x\\\":0,\\\"h\\\":892,\\\"i\\\":\\\"ebb593ac-a3cb-430c-855a-9024de4329ad\\\",\\\"y\\\":90.50879249706912,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.212008400152726%\\\",\\\"left\\\":\\\"0%\\\",\\\"width\\\":\\\"100%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"90.78799159984727%\\\"},\\\"componentName\\\":\\\"详情弹框表格\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"施工合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2024-10-11\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"1200000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"50000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"1250000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"100000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"2500000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"二期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"装修合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2024-11-05\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"980000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"30000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"1010000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"80000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"2100000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"三期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"消防合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2024-12-01\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"760000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"20000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"780000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"60000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1800000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"智能化合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-01-10\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"540000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"15000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"555000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"45000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1200000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"二期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"景观合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-02-15\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"420000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"10000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"430000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"35000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"950000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"三期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"幕墙合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-03-20\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"880000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"25000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"905000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"70000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1600000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"暖通合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-04-08\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"650000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"18000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"668000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"52000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1350000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"二期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"电梯合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-05-12\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"720000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"22000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"742000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"58000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1500000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"三期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"厨房设备合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-06-05\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"380000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"8000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"388000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"30000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"800000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"软装合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-07-01\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"560000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"12000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"572000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"48000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1150000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"施工合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2024-10-11\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"1200000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"50000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"1250000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"100000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"2500000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"二期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"装修合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2024-11-05\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"980000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"30000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"1010000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"80000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"2100000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"三期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"消防合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2024-12-01\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"760000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"20000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"780000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"60000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1800000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"智能化合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-01-10\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"540000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"15000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"555000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"45000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1200000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"二期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"景观合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-02-15\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"420000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"10000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"430000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"35000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"950000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"三期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"幕墙合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-03-20\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"880000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"25000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"905000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"70000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1600000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"暖通合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-04-08\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"650000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"18000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"668000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"52000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1350000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"二期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"电梯合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-05-12\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"720000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"22000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"742000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"58000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1500000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"三期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"厨房设备合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-06-05\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"380000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"8000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"388000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"30000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"800000\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"怡悦湾酒店\\\\\\\",\\\\n    \\\\\\\"fqname\\\\\\\": \\\\\\\"一期\\\\\\\",\\\\n    \\\\\\\"htname\\\\\\\": \\\\\\\"软装合同\\\\\\\",\\\\n    \\\\\\\"htdate\\\\\\\": \\\\\\\"2025-07-01\\\\\\\",\\\\n    \\\\\\\"htmoney\\\\\\\": \\\\\\\"560000\\\\\\\",\\\\n    \\\\\\\"ljbgje\\\\\\\": \\\\\\\"12000\\\\\\\",\\\\n    \\\\\\\"dthtje\\\\\\\": \\\\\\\"572000\\\\\\\",\\\\n    \\\\\\\"ljsfje\\\\\\\": \\\\\\\"48000\\\\\\\",\\\\n    \\\\\\\"ljwfje\\\\\\\": \\\\\\\"1150000\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":1701,\\\"height\\\":892},\\\"syncColumn\\\":false,\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"headerBgColor\\\":\\\"#003B6F\\\",\\\"borderColor\\\":\\\"#FFFFFF\\\",\\\"textPosition\\\":\\\"center\\\",\\\"scroll\\\":true,\\\"scrollTime\\\":50,\\\"bodyFontSize\\\":20,\\\"bodyFontColor\\\":\\\"#FFFFFF\\\",\\\"rankingTitle\\\":\\\"#\\\",\\\"showBorder\\\":false,\\\"oddColor\\\":\\\"#001E3C\\\",\\\"evenColor\\\":\\\"#00284E\\\",\\\"fieldMapping\\\":[{\\\"name\\\":\\\"项目名称\\\",\\\"width\\\":200,\\\"key\\\":\\\"name\\\"},{\\\"name\\\":\\\"分期名称\\\",\\\"width\\\":200,\\\"key\\\":\\\"fqname\\\"},{\\\"name\\\":\\\"合同日期\\\",\\\"width\\\":200,\\\"key\\\":\\\"htdate\\\"},{\\\"name\\\":\\\"合同金额(元)\\\",\\\"width\\\":200,\\\"key\\\":\\\"htmoney\\\"},{\\\"name\\\":\\\"累计变更金额\\\",\\\"width\\\":200,\\\"key\\\":\\\"ljbgje\\\"},{\\\"name\\\":\\\"动态合同金额\\\",\\\"width\\\":200,\\\"key\\\":\\\"dthtje\\\"},{\\\"name\\\":\\\"累计实付金额\\\",\\\"width\\\":200,\\\"key\\\":\\\"ljsfje\\\"},{\\\"name\\\":\\\"累计未付金额\\\",\\\"width\\\":200,\\\"key\\\":\\\"ljwfje\\\"}],\\\"showHead\\\":true,\\\"borderWidth\\\":1,\\\"ranking\\\":false,\\\"lineHeight\\\":50,\\\"fontSize\\\":24,\\\"borderStyle\\\":\\\"solid\\\",\\\"headerFontColor\\\":\\\"#FFFFFF\\\"}}}]},\\\"modalCited\\\":\\\"874a6164-d6b8-400c-8d6c-7224b8d8fa73\\\",\\\"component\\\":\\\"JGroup\\\",\\\"w\\\":1701,\\\"x\\\":99,\\\"y\\\":34.49120750293087,\\\"componentName\\\":\\\"详情弹框\\\",\\\"pageCompId\\\":\\\"1151112776945029120\\\",\\\"equalProportion\\\":false,\\\"key\\\":\\\"3e57537d-5911-41a4-8cfa-db9b2dc711c6\\\",\\\"group\\\":true},{\\\"visible\\\":false,\\\"h\\\":950.9395927008758,\\\"i\\\":\\\"es-drager-1756456982092-28\\\",\\\"props\\\":{\\\"elements\\\":[{\\\"component\\\":\\\"JBar\\\",\\\"visible\\\":true,\\\"w\\\":541,\\\"x\\\":1308.9728600943263,\\\"h\\\":190,\\\"i\\\":\\\"84e41e0f-f14b-44d6-8e0a-fdf0b1390398\\\",\\\"y\\\":279.80457035966094,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"29.424011000000007%\\\",\\\"left\\\":\\\"69.27569900000002%\\\",\\\"width\\\":\\\"28.631726677892527%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"19.980238645901636%\\\"},\\\"componentName\\\":\\\"基础柱形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 90\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 79\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 70\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 55\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 78\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 98\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":541.058706079854,\\\"height\\\":190.48343252800288},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#4A90E235\\\"},\\\"show\\\":true,\\\"interval\\\":2},\\\"name\\\":\\\"单位(个)\\\",\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":30,\\\"left\\\":16,\\\"bottom\\\":18,\\\"show\\\":false,\\\"right\\\":9,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":17,\\\"data\\\":[],\\\"showBackground\\\":false,\\\"backgroundStyle\\\":{\\\"color\\\":\\\"#51626E\\\"},\\\"itemStyle\\\":{\\\"color\\\":\\\"#00A8FFA6\\\",\\\"borderRadius\\\":3},\\\"label\\\":{\\\"position\\\":\\\"top\\\"},\\\"type\\\":\\\"bar\\\"}],\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#475580\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JStatsSummary\\\",\\\"visible\\\":true,\\\"w\\\":681,\\\"x\\\":580.0384926431407,\\\"h\\\":129,\\\"i\\\":\\\"be3108cf-9334-449a-8795-ef8fb1e69164\\\",\\\"y\\\":54.525238831863746,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"5.733827810975898%\\\",\\\"left\\\":\\\"30.697788510194417%\\\",\\\"width\\\":\\\"36.041045966071735%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"13.565530449059532%\\\"},\\\"componentName\\\":\\\"统计概览（背景模式）\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"在管项目总数\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 960,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"2\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"累计放款金额\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 790,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"3\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"当前借款余额\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 900,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"4\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"总应收租金\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6790,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"5\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"租金实收率\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 90,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"%\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":680.9999999999999,\\\"height\\\":129},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":713,\\\"dataType\\\":1,\\\"h\\\":129,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"layout\\\":{\\\"padding\\\":{\\\"top\\\":5,\\\"left\\\":20,\\\"bottom\\\":0,\\\"right\\\":20},\\\"borderColor\\\":\\\"#0f66ff59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"justify\\\":\\\"space-between\\\",\\\"borderWidth\\\":0,\\\"gap\\\":16,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"100% 100%\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"drag/lib/img/bg01.png\\\"},\\\"color\\\":\\\"#0b2b63\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"image\\\"}},\\\"fieldMap\\\":{\\\"compareValue\\\":\\\"compareValue\\\",\\\"unit\\\":\\\"suffix\\\",\\\"negativeValue\\\":\\\"0\\\",\\\"compareState\\\":\\\"compareState\\\",\\\"label\\\":\\\"name\\\",\\\"value\\\":\\\"value\\\",\\\"positiveValue\\\":\\\"1\\\",\\\"compareLabel\\\":\\\"compareLabel\\\"},\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"card\\\":{\\\"padding\\\":{\\\"horizontal\\\":3,\\\"vertical\\\":15},\\\"borderColor\\\":\\\"#0F66FF59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"borderWidth\\\":0,\\\"blur\\\":24,\\\"minWidth\\\":100,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"cover\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"\\\"},\\\"color\\\":\\\"#0B2B6300\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"none\\\"}},\\\"sections\\\":{\\\"middle\\\":{\\\"compare\\\":{\\\"valueStyle\\\":{\\\"positiveGradient\\\":{\\\"endColor\\\":\\\"#15f0c5\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#15f0c5\\\"},\\\"positiveColor\\\":\\\"#15F0C5\\\",\\\"fontSize\\\":14,\\\"negativeColor\\\":\\\"#D0021B\\\",\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"negativeGradient\\\":{\\\"endColor\\\":\\\"#D0021B\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#D0021B\\\"},\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"alignItems\\\":\\\"center\\\",\\\"labelStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"fontColor\\\":\\\"#9ED3FF\\\"},\\\"label\\\":\\\"同比\\\"},\\\"paddingBottom\\\":10,\\\"show\\\":false,\\\"type\\\":\\\"compare\\\",\\\"align\\\":\\\"center\\\"},\\\"top\\\":{\\\"minHeight\\\":40,\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"paddingTop\\\":5,\\\"type\\\":\\\"value\\\",\\\"align\\\":\\\"center\\\",\\\"value\\\":{\\\"unit\\\":{\\\"fontSize\\\":16,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#96F5F8\\\"},\\\"fontWeight\\\":500,\\\"fontColor\\\":\\\"#9ED3FF\\\"},\\\"unitGap\\\":6,\\\"fontSize\\\":24,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#96F5F8\\\"},\\\"fontWeight\\\":600,\\\"fontColor\\\":\\\"#D8F1FF\\\"}},\\\"bottom\\\":{\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"label\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#C9E6FF\\\"},\\\"type\\\":\\\"label\\\",\\\"align\\\":\\\"center\\\"}}}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":79.61138898968348,\\\"x\\\":1092.016430295897,\\\"h\\\":27.97398018640021,\\\"i\\\":\\\"es-drager-1763118212824-19\\\",\\\"y\\\":506.6564308568187,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"53.27955999999999%\\\",\\\"left\\\":\\\"57.79356%\\\",\\\"width\\\":\\\"4.21333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9417200000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"客户名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":79.61138898968348,\\\"height\\\":27.97398018640021},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":79.61138898968348,\\\"x\\\":1205.967192459297,\\\"h\\\":27.97398018640021,\\\"i\\\":\\\"es-drager-1763118197556-18\\\",\\\"y\\\":430.68925214089586,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.29091600000001%\\\",\\\"left\\\":\\\"63.824257%\\\",\\\"width\\\":\\\"4.21333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9417200000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"客户名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":79.61138898968348,\\\"height\\\":27.97398018640021},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":79.61138898968348,\\\"x\\\":985.6623767923331,\\\"h\\\":27.97398018640021,\\\"i\\\":\\\"es-drager-1763118191675-17\\\",\\\"y\\\":323.06908863293563,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"33.97367100000001%\\\",\\\"left\\\":\\\"52.164909%\\\",\\\"width\\\":\\\"4.21333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9417200000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"客户名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":79.61138898968348,\\\"height\\\":27.97398018640021},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1095.814765730692,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1763118021837-16\\\",\\\"y\\\":430.68924263149984,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.290915%\\\",\\\"left\\\":\\\"57.99458200000001%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1216.0961310407038,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1763118010715-15\\\",\\\"y\\\":378.7783346397803,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"39.83200800000001%\\\",\\\"left\\\":\\\"64.360318%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":995.79131537374,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1763118003690-14\\\",\\\"y\\\":267.3598140979031,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"28.115331000000005%\\\",\\\"left\\\":\\\"52.700970000000005%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1088.346997390856,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1763117996097-13\\\",\\\"y\\\":405.4958098141571,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.64159500000001%\\\",\\\"left\\\":\\\"57.59936%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"96340\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1211.1606115175618,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1763117990004-12\\\",\\\"y\\\":349.78654478852053,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"36.78325600000001%\\\",\\\"left\\\":\\\"64.099112%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"11960\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":990.855795850598,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1763117985668-11\\\",\\\"y\\\":243.43250029186595,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"25.599155000000007%\\\",\\\"left\\\":\\\"52.439764%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"91260\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":79.61138898968348,\\\"x\\\":691.9226477632122,\\\"h\\\":27.97398018640021,\\\"i\\\":\\\"es-drager-1763117979572-10\\\",\\\"y\\\":496.5274692569776,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"52.21440700000001%\\\",\\\"left\\\":\\\"36.619113%\\\",\\\"width\\\":\\\"4.21333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9417200000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"客户名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":79.61138898968348,\\\"height\\\":27.97398018640021},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":700.7854619362721,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1763117971569-9\\\",\\\"y\\\":416.76192399774175,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"43.82633%\\\",\\\"left\\\":\\\"37.088166%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":695.8499424131302,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1763117964448-8\\\",\\\"y\\\":391.56849118039895,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"41.17701000000001%\\\",\\\"left\\\":\\\"36.82696%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"9160\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":83.00000257528725,\\\"x\\\":688.6400925035406,\\\"h\\\":115.9999953491752,\\\"i\\\":\\\"es-drager-1763117932887-7\\\",\\\"y\\\":383.5890619640866,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"40.337900000000005%\\\",\\\"left\\\":\\\"36.445388%\\\",\\\"width\\\":\\\"4.392668000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.198461000000002%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":83.00000257528727,\\\"height\\\":115.9999953491752},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":70.0000067249707,\\\"x\\\":1091.0082054226732,\\\"h\\\":95.99999549522116,\\\"i\\\":\\\"es-drager-1763117918967-6\\\",\\\"y\\\":408.65354737265926,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.97366000000001%\\\",\\\"left\\\":\\\"57.740201%\\\",\\\"width\\\":\\\"3.70466%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.095278000000004%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":70.0000067249707,\\\"height\\\":95.99999549522116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":62.00000055779603,\\\"x\\\":1213.9507598693788,\\\"h\\\":83.00000462407712,\\\"i\\\":\\\"es-drager-1763117907587-5\\\",\\\"y\\\":351.80712025388317,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"36.995738%\\\",\\\"left\\\":\\\"64.246777%\\\",\\\"width\\\":\\\"3.28127%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"8.72821%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":62.00000055779603,\\\"height\\\":83.0000046240771},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":62.00000055779603,\\\"x\\\":993.7749034175382,\\\"h\\\":83.00000462407712,\\\"i\\\":\\\"es-drager-1763117887178-4\\\",\\\"y\\\":245.58203267539477,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"25.825198000000004%\\\",\\\"left\\\":\\\"52.59425399999999%\\\",\\\"width\\\":\\\"3.28127%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"8.72821%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":62.00000055779603,\\\"height\\\":83.0000046240771},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":835.1230982678547,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1763117551885-3\\\",\\\"y\\\":278.8838421178201,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"29.327188%\\\",\\\"left\\\":\\\"44.197812%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":831.4536842579369,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1763117542406-2\\\",\\\"y\\\":249.8920522665603,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"26.278436%\\\",\\\"left\\\":\\\"44.003613%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"199,445\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":79.61138898968348,\\\"x\\\":830.058638424713,\\\"h\\\":27.97398018640021,\\\"i\\\":\\\"es-drager-1763117524939-1\\\",\\\"y\\\":363.71387293167453,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"38.247842000000006%\\\",\\\"left\\\":\\\"43.929782%\\\",\\\"width\\\":\\\"4.21333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9417200000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"客户名称\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":79.61138898968348,\\\"height\\\":27.97398018640021},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":98.99999601451351,\\\"x\\\":817.9132500968582,\\\"h\\\":131.00000237168769,\\\"i\\\":\\\"01adf6f2-8586-42bf-8ca5-e68125185724\\\",\\\"y\\\":236.8481470050254,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.906750000000002%\\\",\\\"left\\\":\\\"43.287003%\\\",\\\"width\\\":\\\"5.239447%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"13.775849000000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":98.9999960145135,\\\"height\\\":131.00000237168769},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_44_1763551574907.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":173.99999242262612,\\\"x\\\":592.259300662204,\\\"h\\\":37.00000400904318,\\\"i\\\":\\\"es-drager-1763014748783-1\\\",\\\"y\\\":163.07150518786855,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"17.148461000000005%\\\",\\\"left\\\":\\\"31.344559%\\\",\\\"width\\\":\\\"9.208725000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.890889%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"采购合同金额分布\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":173.9999924226261,\\\"height\\\":37.00000400904318},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"79b612d5-4915-4201-84ce-a34c4f9b4615\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":128.9999907987339,\\\"x\\\":1694.4314250338105,\\\"h\\\":26.99999932736819,\\\"i\\\":\\\"es-drager-1762929346632-5\\\",\\\"y\\\":724.1710725496224,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"76.15321500000002%\\\",\\\"left\\\":\\\"89.675596%\\\",\\\"width\\\":\\\"6.827158%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.8392970000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"36个月期项目数量\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":128.9999907987339,\\\"height\\\":26.99999932736819},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#8D8D8D\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":46.00000711856976,\\\"x\\\":1732.8018837686052,\\\"h\\\":28.999996459944818,\\\"i\\\":\\\"es-drager-1762929340450-4\\\",\\\"y\\\":695.437187025299,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"73.13158400000002%\\\",\\\"left\\\":\\\"91.706303%\\\",\\\"width\\\":\\\"2.434491%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.0496150000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":46.00000711856976,\\\"height\\\":28.999996459944818},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#505050\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":13,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1685.8264915007508,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762929333594-3\\\",\\\"y\\\":688.9776350506045,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"72.452303%\\\",\\\"left\\\":\\\"89.220191%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"400\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#6BE5E8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":166.999991750129,\\\"x\\\":1684.6625708132242,\\\"h\\\":37.00000400904318,\\\"i\\\":\\\"es-drager-1762929318489-2\\\",\\\"y\\\":659.1324815182508,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"69.313812%\\\",\\\"left\\\":\\\"89.158592%\\\",\\\"width\\\":\\\"8.838259%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.890889%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"36个月期项目占比\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":166.999991750129,\\\"height\\\":37.00000400904318},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"79b612d5-4915-4201-84ce-a34c4f9b4615\\\"},{\\\"component\\\":\\\"JRingProgress\\\",\\\"visible\\\":true,\\\"w\\\":112.99999735950763,\\\"x\\\":1590.1172323342091,\\\"h\\\":99.000000703482,\\\"i\\\":\\\"es-drager-1762929307141-1\\\",\\\"y\\\":657.0708920282549,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"69.097017%\\\",\\\"left\\\":\\\"84.154902%\\\",\\\"width\\\":\\\"5.980378999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.410756000000001%\\\"},\\\"componentName\\\":\\\"基础环形图\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"占比\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 40\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":112.99999735950763,\\\"height\\\":99.000000703482},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"valueFontWeight\\\":\\\"normal\\\",\\\"color\\\":\\\"#1E90FF\\\",\\\"bgColor\\\":\\\"#E8EDF3B8\\\",\\\"valueFontSize\\\":16,\\\"lineHeight\\\":0,\\\"fontSize\\\":16,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"valueFontColor\\\":\\\"#FFFFFF\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"extraInfo\\\":{\\\"endColor\\\":\\\"#FF4500\\\",\\\"enabledGradient\\\":false,\\\"type\\\":\\\"linear\\\",\\\"direction\\\":\\\"to left\\\",\\\"startColor\\\":\\\"#FFD700\\\"}}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":128.9999907987339,\\\"x\\\":1426.143030016014,\\\"h\\\":26.99999932736819,\\\"i\\\":\\\"es-drager-1762928981087-4\\\",\\\"y\\\":721.7677914451772,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"75.90048800000001%\\\",\\\"left\\\":\\\"75.476779%\\\",\\\"width\\\":\\\"6.827158%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.8392970000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"高收益项目数量\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":128.9999907987339,\\\"height\\\":26.99999932736819},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#8D8D8D\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":46.00000711856976,\\\"x\\\":1472.110197410645,\\\"h\\\":28.999996459944818,\\\"i\\\":\\\"es-drager-1762928898594-3\\\",\\\"y\\\":693.0339059208537,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"72.87885700000001%\\\",\\\"left\\\":\\\"77.909532%\\\",\\\"width\\\":\\\"2.434491%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.0496150000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":46.00000711856976,\\\"height\\\":28.999996459944818},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#505050\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":13,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1425.1348240379136,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762928768350-2\\\",\\\"y\\\":686.5743539461594,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"72.19957600000001%\\\",\\\"left\\\":\\\"75.423421%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"600\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#6BE5E8\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#49ABFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":149.0000062166706,\\\"x\\\":1423.970903350387,\\\"h\\\":37.00000400904318,\\\"i\\\":\\\"es-drager-1762928758538-1\\\",\\\"y\\\":656.7291909044097,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"69.06108400000001%\\\",\\\"left\\\":\\\"75.361822%\\\",\\\"width\\\":\\\"7.885633%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.890889%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"高收益项目占比\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":149.0000062166706,\\\"height\\\":37.00000400904318},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"79b612d5-4915-4201-84ce-a34c4f9b4615\\\"},{\\\"component\\\":\\\"JRingProgress\\\",\\\"visible\\\":true,\\\"w\\\":101.99999360342322,\\\"x\\\":1325.6271916463306,\\\"h\\\":103.00000447803119,\\\"i\\\":\\\"627c8b9b-8365-4edd-ba69-abfd0086e195\\\",\\\"y\\\":649.6031348785871,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"68.311714%\\\",\\\"left\\\":\\\"70.157108%\\\",\\\"width\\\":\\\"5.398218%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.831393000000002%\\\"},\\\"componentName\\\":\\\"基础环形图\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"占比\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 60\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":101.99999360342322,\\\"height\\\":103.00000447803119},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"valueFontWeight\\\":\\\"normal\\\",\\\"color\\\":\\\"#1E90FF\\\",\\\"bgColor\\\":\\\"#E8EDF3C0\\\",\\\"valueFontSize\\\":16,\\\"lineHeight\\\":0,\\\"fontSize\\\":16,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"valueFontColor\\\":\\\"#FFFFFF\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"extraInfo\\\":{\\\"endColor\\\":\\\"#FF4500\\\",\\\"enabledGradient\\\":false,\\\"type\\\":\\\"linear\\\",\\\"direction\\\":\\\"to left\\\",\\\"startColor\\\":\\\"#FFD700\\\"}}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":115.99999494841742,\\\"x\\\":1684.1734894470342,\\\"h\\\":26.000000761079882,\\\"i\\\":\\\"es-drager-1762926696188-10\\\",\\\"y\\\":882.3070586104344,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"92.782661%\\\",\\\"left\\\":\\\"89.132708%\\\",\\\"width\\\":\\\"6.1391500000000025%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.734138000000001%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"零保证金项目数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":115.99999494841741,\\\"height\\\":26.000000761079882},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":98.00000941495898,\\\"x\\\":1548.6987068173507,\\\"h\\\":26.99999932736819,\\\"i\\\":\\\"es-drager-1762926691124-9\\\",\\\"y\\\":883.5731776217401,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"92.91580500000002%\\\",\\\"left\\\":\\\"81.96288%\\\",\\\"width\\\":\\\"5.186524%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.8392970000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"保证金覆盖率\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":98.000009414959,\\\"height\\\":26.99999932736819},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1732.5439653383592,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762926686158-8\\\",\\\"y\\\":845.847502100111,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"88.94860500000001%\\\",\\\"left\\\":\\\"91.692653%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#BA3232\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FDAE93\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1598.4642474370226,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762926681277-7\\\",\\\"y\\\":848.5086970408884,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"89.228454%\\\",\\\"left\\\":\\\"84.596657%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"%\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#BA3232\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FDAE93\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1693.5521782708327,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762926674612-6\\\",\\\"y\\\":839.774820879915,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"88.310007%\\\",\\\"left\\\":\\\"89.629063%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"790\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FDAE93\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#BA3232\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1546.6822948611493,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762926667152-5\\\",\\\"y\\\":842.3070589025264,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"88.57629500000002%\\\",\\\"left\\\":\\\"81.856164%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"96.79\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FDAE93\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#BA3232\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1425.1348240379136,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762926619855-4\\\",\\\"y\\\":849.9037729703601,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"89.37515900000001%\\\",\\\"left\\\":\\\"75.423421%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#BA3232\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FDAE93\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1358.1594352472453,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762926610924-3\\\",\\\"y\\\":843.7021348319981,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"88.72300000000001%\\\",\\\"left\\\":\\\"71.878835%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"10,000\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#BA3232\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FDAE93\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":98.00000941495898,\\\"x\\\":1362.7080771250178,\\\"h\\\":26.99999932736819,\\\"i\\\":\\\"es-drager-1762926602282-2\\\",\\\"y\\\":882.4360155286006,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"92.796222%\\\",\\\"left\\\":\\\"72.119566%\\\",\\\"width\\\":\\\"5.186524%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.8392970000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"最大还款差额\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":98.000009414959,\\\"height\\\":26.99999932736819},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":531.0000078248536,\\\"x\\\":1315.369293849801,\\\"h\\\":95.99999549522116,\\\"i\\\":\\\"es-drager-1762926555663-1\\\",\\\"y\\\":822.9325585844631,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"86.53888900000001%\\\",\\\"left\\\":\\\"69.614222%\\\",\\\"width\\\":\\\"28.102490000000003%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.095278000000004%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":531.0000078248536,\\\"height\\\":95.99999549522116},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_35_1763551508136.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":149.0000062166706,\\\"x\\\":1494.8735867909734,\\\"h\\\":37.00000400904318,\\\"i\\\":\\\"es-drager-1762926336471-2\\\",\\\"y\\\":785.873387113962,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"82.64177800000002%\\\",\\\"left\\\":\\\"79.114255%\\\",\\\"width\\\":\\\"7.885633%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.890889%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"风险预警\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":149.0000062166706,\\\"height\\\":37.00000400904318},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"79b612d5-4915-4201-84ce-a34c4f9b4615\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":149.0000062166706,\\\"x\\\":1486.1397129379136,\\\"h\\\":37.00000400904318,\\\"i\\\":\\\"es-drager-1762926323283-1\\\",\\\"y\\\":487.1981242324508,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"51.233340999999996%\\\",\\\"left\\\":\\\"78.652026%\\\",\\\"width\\\":\\\"7.885633%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.890889%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项目级关键指标\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":149.0000062166706,\\\"height\\\":37.00000400904318},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"79b612d5-4915-4201-84ce-a34c4f9b4615\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1794.7127938210083,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762925789762-11\\\",\\\"y\\\":236.97293880777556,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.919873000000006%\\\",\\\"left\\\":\\\"94.982858%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"天\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#708489\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1758.12427745993,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762925775562-10\\\",\\\"y\\\":230.77130066941345,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.267714000000005%\\\",\\\"left\\\":\\\"93.046458%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"70\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#3584DE\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":104.00000459277844,\\\"x\\\":1670.3751368557098,\\\"h\\\":26.000000761079882,\\\"i\\\":\\\"es-drager-1762925764016-9\\\",\\\"y\\\":237.98115349214476,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"25.025895999999996%\\\",\\\"left\\\":\\\"88.402448%\\\",\\\"width\\\":\\\"5.504066%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.734138000000001%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"平均预期天数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":104.00000459277844,\\\"height\\\":26.000000761079882},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1613.6576836518175,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762925757252-8\\\",\\\"y\\\":235.70681979646992,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.786729000000005%\\\",\\\"left\\\":\\\"85.40075%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"当年\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":277.99999701540446,\\\"x\\\":1611.5123124804927,\\\"h\\\":49.000005823294806,\\\"i\\\":\\\"es-drager-1762925746092-7\\\",\\\"y\\\":227.7274000895535,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"23.947620000000004%\\\",\\\"left\\\":\\\"85.28720899999999%\\\",\\\"width\\\":\\\"14.712790999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.152799000000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":277.99999701540446,\\\"height\\\":49.000005823294806},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_31_1763551480635.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":46.99999371812427,\\\"x\\\":1312.4501862828608,\\\"h\\\":28.999996459944818,\\\"i\\\":\\\"es-drager-1762925685447-6\\\",\\\"y\\\":233.30353869202474,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.534002%\\\",\\\"left\\\":\\\"69.459732%\\\",\\\"width\\\":\\\"2.487414%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.0496150000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"本月\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":46.99999371812427,\\\"height\\\":28.999996459944818},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":98.00000941495898,\\\"x\\\":1369.1676394867527,\\\"h\\\":26.99999932736819,\\\"i\\\":\\\"es-drager-1762925676767-5\\\",\\\"y\\\":234.31174386699809,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.640024000000004%\\\",\\\"left\\\":\\\"72.46143%\\\",\\\"width\\\":\\\"5.186524%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.8392970000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"最大单笔欠款\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":98.000009414959,\\\"height\\\":26.99999932736819},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1459.4490100125442,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762925670446-4\\\",\\\"y\\\":227.10190055366263,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"23.881843000000003%\\\",\\\"left\\\":\\\"77.239455%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"450\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#4EABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1511.2309625884175,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762925663957-3\\\",\\\"y\\\":233.30353869202474,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.534002%\\\",\\\"left\\\":\\\"79.979948%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#708489\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":149.0000062166706,\\\"x\\\":1307.7458108005394,\\\"h\\\":37.00000400904318,\\\"i\\\":\\\"es-drager-1762925615604-2\\\",\\\"y\\\":179.6600187624041,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"18.892894999999996%\\\",\\\"left\\\":\\\"69.210759%\\\",\\\"width\\\":\\\"7.885633%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.890889%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"还款与预期监控\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":149.0000062166706,\\\"height\\\":37.00000400904318},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"79b612d5-4915-4201-84ce-a34c4f9b4615\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":277.99999701540446,\\\"x\\\":1307.772566294842,\\\"h\\\":49.000005823294806,\\\"i\\\":\\\"es-drager-1762925573195-1\\\",\\\"y\\\":222.79187145310112,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"23.428604000000004%\\\",\\\"left\\\":\\\"69.212175%\\\",\\\"width\\\":\\\"14.712790999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.152799000000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":277.99999701540446,\\\"height\\\":49.000005823294806},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_31_1763551480635.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":98.00000941495898,\\\"x\\\":1684.3024486621575,\\\"h\\\":26.99999932736819,\\\"i\\\":\\\"es-drager-1762920907802-4\\\",\\\"y\\\":150.61890367447094,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.838956000000001%\\\",\\\"left\\\":\\\"89.139533%\\\",\\\"width\\\":\\\"5.186524%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.8392970000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"罚息收入\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":98.000009414959,\\\"height\\\":26.99999932736819},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#D7EDFF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#4D699D\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1728.8745702235644,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762920898709-3\\\",\\\"y\\\":126.82054678659989,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"13.336341%\\\",\\\"left\\\":\\\"91.498455%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#A5BECF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1679.6248475692616,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762920889380-2\\\",\\\"y\\\":120.61889913884187,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.684181%\\\",\\\"left\\\":\\\"88.891977%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"898\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FFC5AB\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#E86B6B\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1517.6905060550296,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762920868707-1\\\",\\\"y\\\":118.21561803439675,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.431454000000002%\\\",\\\"left\\\":\\\"80.321811%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"3,898\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#6BE5E8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":98.00000941495898,\\\"x\\\":1523.6342315562724,\\\"h\\\":26.99999932736819,\\\"i\\\":\\\"es-drager-1762920200057-8\\\",\\\"y\\\":146.94949404932422,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.453084%\\\",\\\"left\\\":\\\"80.636375%\\\",\\\"width\\\":\\\"5.186524%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.8392970000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"手续费收入\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":98.000009414959,\\\"height\\\":26.99999932736819},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#D7EDFF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#4D699D\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1578.335291699086,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762920184548-6\\\",\\\"y\\\":124.41725617275884,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"13.083613%\\\",\\\"left\\\":\\\"83.531358%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#A5BECF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":98.00000941495898,\\\"x\\\":1340.1758506806332,\\\"h\\\":26.99999932736819,\\\"i\\\":\\\"es-drager-1762920042120-5\\\",\\\"y\\\":147.0784604768863,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.466646%\\\",\\\"left\\\":\\\"70.927077%\\\",\\\"width\\\":\\\"5.186524%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.8392970000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"租金收入\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":98.000009414959,\\\"height\\\":26.99999932736819},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#D7EDFF\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#4D699D\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"normal\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":1387.280183268488,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762920024296-4\\\",\\\"y\\\":120.74785605700805,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.697742000000002%\\\",\\\"left\\\":\\\"73.420013%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#A5BECF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.00000431388042,\\\"x\\\":1336.7643551009614,\\\"h\\\":39.00000114161981,\\\"i\\\":\\\"es-drager-1762920012633-3\\\",\\\"y\\\":114.54621791864594,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.045583%\\\",\\\"left\\\":\\\"70.746528%\\\",\\\"width\\\":\\\"3.863430999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.1012070000000005%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"960\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.00000431388042,\\\"height\\\":39.00000114161981},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#038BFE\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#6BBBE8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":2,\\\"fontSize\\\":24,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":97.00000392028137,\\\"x\\\":1681.1488904078549,\\\"h\\\":66.000000468988,\\\"i\\\":\\\"es-drager-1762919932439-2\\\",\\\"y\\\":61.86573353334538,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.5057480000000005%\\\",\\\"left\\\":\\\"88.972635%\\\",\\\"width\\\":\\\"5.1336%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.940504000000002%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":97.00000392028139,\\\"height\\\":66.000000468988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_17_1763551465441.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":98.00000941495898,\\\"x\\\":1516.6823000769286,\\\"h\\\":68.99999616785293,\\\"i\\\":\\\"es-drager-1762919907257-1\\\",\\\"y\\\":56.93021440628894,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"5.986733000000002%\\\",\\\"left\\\":\\\"80.268453%\\\",\\\"width\\\":\\\"5.186524%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"7.2559809999999985%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":98.000009414959,\\\"height\\\":68.99999616785293},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_15_1763551456718.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":104.00000459277844,\\\"x\\\":1323.09496172476,\\\"h\\\":64.00000333641137,\\\"i\\\":\\\"95a344c5-64da-4b5a-8c42-564baeb66174\\\",\\\"y\\\":55.79305231314942,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"5.867149999999998%\\\",\\\"left\\\":\\\"70.023093%\\\",\\\"width\\\":\\\"5.504066%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.730186000000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":104.00000459277844,\\\"height\\\":64.00000333641137},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_13_1763551449127.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":902.9999922765066,\\\"x\\\":508.64661984462634,\\\"h\\\":604.9999979594594,\\\"i\\\":\\\"f14ca628-b80a-4dd7-8df3-67597e00b63c\\\",\\\"y\\\":88.35669360434433,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.291514864092687%\\\",\\\"left\\\":\\\"26.919465794871066%\\\",\\\"width\\\":\\\"47.790109%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"63.62128600000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":902.9999922765066,\\\"height\\\":604.9999979594594},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/产城背景地图_1763551428302.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JCardCarousel\\\",\\\"visible\\\":true,\\\"w\\\":313.40683127324746,\\\"x\\\":934.3368548099414,\\\"h\\\":160.8503385248215,\\\"i\\\":\\\"es-drager-1762858057998-9\\\",\\\"y\\\":787.428049725881,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"82.80526500000002%\\\",\\\"left\\\":\\\"49.448572%\\\",\\\"width\\\":\\\"16.586652%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"16.914884999999995%\\\"},\\\"componentName\\\":\\\"卡片轮播\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[{\\\\\\\"title\\\\\\\":\\\\\\\"销售物料汇总数据\\\\\\\",\\\\\\\"orderNum\\\\\\\":1247,\\\\\\\"orderAmount\\\\\\\":28475000,\\\\\\\"deliveryNum\\\\\\\":1189,\\\\\\\"signNum\\\\\\\":1156,\\\\\\\"outAmount\\\\\\\":26789000},{\\\\\\\"title\\\\\\\":\\\\\\\"采购物料汇总数据\\\\\\\",\\\\\\\"orderNum\\\\\\\":892,\\\\\\\"orderAmount\\\\\\\":15680000,\\\\\\\"deliveryNum\\\\\\\":856,\\\\\\\"signNum\\\\\\\":823,\\\\\\\"outAmount\\\\\\\":14875000},{\\\\\\\"title\\\\\\\":\\\\\\\"库存物料汇总数据\\\\\\\",\\\\\\\"orderNum\\\\\\\":2156,\\\\\\\"orderAmount\\\\\\\":3440,\\\\\\\"deliveryNum\\\\\\\":2340,\\\\\\\"signNum\\\\\\\":2340,\\\\\\\"outAmount\\\\\\\":7100000},{\\\\\\\"title\\\\\\\":\\\\\\\"质量物料汇总数据\\\\\\\",\\\\\\\"orderNum\\\\\\\":110,\\\\\\\"orderAmount\\\\\\\":33330000,\\\\\\\"deliveryNum\\\\\\\":1100,\\\\\\\"signNum\\\\\\\":110,\\\\\\\"outAmount\\\\\\\":111110000}]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":313.40683127324746,\\\"height\\\":160.85033852482147},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[],\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":1000,\\\"dataType\\\":1,\\\"h\\\":230,\\\"linkageConfig\\\":[],\\\"timeOut\\\":0,\\\"option\\\":{\\\"titleFieldMapping\\\":{\\\"offset\\\":{\\\"x\\\":22,\\\"y\\\":0},\\\"show\\\":true,\\\"position\\\":\\\"left\\\",\\\"textStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to bottom\\\",\\\"startColor\\\":\\\"#FFFFFF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"key\\\":\\\"title\\\",\\\"direction\\\":\\\"vertical\\\"},\\\"autoScrollEnabled\\\":true,\\\"contentLineHeight\\\":24,\\\"autoScrollDirection\\\":\\\"to-left\\\",\\\"contentFieldMapping\\\":[{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"个\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"订单数量\\\",\\\"width\\\":120,\\\"key\\\":\\\"orderNum\\\",\\\"marginLeft\\\":0},{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"元\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"订单金额\\\",\\\"width\\\":150,\\\"key\\\":\\\"orderAmount\\\",\\\"marginLeft\\\":0},{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"个\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"发货数量\\\",\\\"width\\\":120,\\\"key\\\":\\\"deliveryNum\\\",\\\"marginLeft\\\":0},{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"个\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"签收数量\\\",\\\"width\\\":120,\\\"key\\\":\\\"signNum\\\",\\\"marginLeft\\\":0},{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"元\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"出库金额\\\",\\\"width\\\":150,\\\"key\\\":\\\"outAmount\\\",\\\"marginLeft\\\":0}],\\\"contentCurrent\\\":0,\\\"autoScrollSpeed\\\":100,\\\"contentLineAlign\\\":\\\"start\\\",\\\"contentLineTextGap\\\":7,\\\"cardStyle\\\":{\\\"backgroundColor\\\":\\\"#1890FF1A\\\",\\\"borderColor\\\":\\\"#1890FF\\\",\\\"backgroundImagePosition\\\":\\\"center\\\",\\\"backgroundImage\\\":\\\"drag/lib/img/cardCarousel-bg-01.png\\\",\\\"paddingRight\\\":7,\\\"minWidth\\\":300,\\\"backgroundImageRepeat\\\":\\\"no-repeat\\\",\\\"backgroundImageSize\\\":\\\"100% 100%\\\",\\\"marginRight\\\":25,\\\"borderEnabled\\\":true,\\\"paddingBottom\\\":16,\\\"borderRadius\\\":2,\\\"borderWidth\\\":1,\\\"paddingTop\\\":11,\\\"borderStyle\\\":\\\"dashed\\\",\\\"paddingLeft\\\":60},\\\"currentValue\\\":0}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":166.999991750129,\\\"x\\\":928.9449046933179,\\\"h\\\":46.00000061503394,\\\"i\\\":\\\"es-drager-1762858012980-8\\\",\\\"y\\\":742.7945873431419,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"78.11164800000002%\\\",\\\"left\\\":\\\"49.16321%\\\",\\\"width\\\":\\\"8.838259%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.837321000000001%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"采购物料汇总数据\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":166.999991750129,\\\"height\\\":46.00000061503395},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":164.99999965589683,\\\"x\\\":604.9472435546074,\\\"h\\\":46.00000061503394,\\\"i\\\":\\\"es-drager-1762858006638-7\\\",\\\"y\\\":745.4557822839193,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"78.39149700000002%\\\",\\\"left\\\":\\\"32.01605200000001%\\\",\\\"width\\\":\\\"8.732411999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.837321000000001%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"销售物料汇总数据\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":164.99999965589683,\\\"height\\\":46.00000061503395},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":79.61138898968348,\\\"x\\\":464.15006375641275,\\\"h\\\":27.97398018640021,\\\"i\\\":\\\"es-drager-1762857953002-6\\\",\\\"y\\\":603.0104611624024,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.412068%\\\",\\\"left\\\":\\\"24.564543%\\\",\\\"width\\\":\\\"4.21333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9417200000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同总金额\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":79.61138898968348,\\\"height\\\":27.97398018640021},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBF4FC\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":498.46424973104354,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762857945733-5\\\",\\\"y\\\":577.8170283450596,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"60.76274800000001%\\\",\\\"left\\\":\\\"26.380577000000006%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.85083281172334,\\\"x\\\":444.15006723359915,\\\"h\\\":42.93802267351676,\\\"i\\\":\\\"es-drager-1762857940021-4\\\",\\\"y\\\":566.550904652079,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"59.578012000000015%\\\",\\\"left\\\":\\\"23.506069%\\\",\\\"width\\\":\\\"3.90846%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.515326000000002%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"5451\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.85083281172334,\\\"height\\\":42.93802267351676},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBE5F5\\\",\\\"letterSpacing\\\":2,\\\"fontSize\\\":26,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":79.61138898968348,\\\"x\\\":254.103164781102,\\\"h\\\":27.97398018640021,\\\"i\\\":\\\"es-drager-1762857932522-3\\\",\\\"y\\\":603.1394180805687,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.425629000000015%\\\",\\\"left\\\":\\\"13.448081999999998%\\\",\\\"width\\\":\\\"4.21333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9417200000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同总数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":79.61138898968348,\\\"height\\\":27.97398018640021},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#CAF1F1\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":273.2239145409379,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762857921854-2\\\",\\\"y\\\":574.1476187199129,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"60.376876%\\\",\\\"left\\\":\\\"14.460023%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.85083281172334,\\\"x\\\":232.83704384994144,\\\"h\\\":42.93802267351676,\\\"i\\\":\\\"es-drager-1762857915642-1\\\",\\\"y\\\":564.1476235476339,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"59.325285000000015%\\\",\\\"left\\\":\\\"12.3226%\\\",\\\"width\\\":\\\"3.90846%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.515326000000002%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"700\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.85083281172334,\\\"height\\\":42.93802267351676},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBE5F5\\\",\\\"letterSpacing\\\":2,\\\"fontSize\\\":26,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":79.61138898968348,\\\"x\\\":431.3599206203753,\\\"h\\\":27.97398018640021,\\\"i\\\":\\\"es-drager-1762857685097-3\\\",\\\"y\\\":92.89323780828366,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.768574000000001%\\\",\\\"left\\\":\\\"22.829167%\\\",\\\"width\\\":\\\"4.21333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9417200000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同总金额\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":79.61138898968348,\\\"height\\\":27.97398018640021},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBF4FC\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.85083281172334,\\\"x\\\":415.15827842747956,\\\"h\\\":42.93802267351676,\\\"i\\\":\\\"es-drager-1762857678154-2\\\",\\\"y\\\":62.76426684509252,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.600237000000002%\\\",\\\"left\\\":\\\"21.971716%\\\",\\\"width\\\":\\\"3.90846%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.515326000000002%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"5451\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.85083281172334,\\\"height\\\":42.93802267351676},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBE5F5\\\",\\\"letterSpacing\\\":2,\\\"fontSize\\\":26,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":470.7385853332709,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762857671067-1\\\",\\\"y\\\":74.03038102867723,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"7.784972%\\\",\\\"left\\\":\\\"24.913232%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":79.61138898968348,\\\"x\\\":236.50643896473628,\\\"h\\\":27.97398018640021,\\\"i\\\":\\\"es-drager-1762857250911-4\\\",\\\"y\\\":91.75606620574825,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.648990000000001%\\\",\\\"left\\\":\\\"12.516798000000001%\\\",\\\"width\\\":\\\"4.21333%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.9417200000000006%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"合同总数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":79.61138898968348,\\\"height\\\":27.97398018640021},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#CAF1F1\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":55.4256503232591,\\\"x\\\":264.4900406878781,\\\"h\\\":29.97211347737514,\\\"i\\\":\\\"es-drager-1762857246742-3\\\",\\\"y\\\":66.5626238790095,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.999669000000003%\\\",\\\"left\\\":\\\"13.997793999999999%\\\",\\\"width\\\":\\\"2.933331%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.151842%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"个\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":55.42565032325909,\\\"height\\\":29.972113477375135},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"fontSize\\\":15,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":73.85083281172334,\\\"x\\\":220.3048156669637,\\\"h\\\":42.93802267351676,\\\"i\\\":\\\"c9cf304e-4c81-4f49-86ba-4bd605c5a2ee\\\",\\\"y\\\":60.36098574064735,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.347509999999999%\\\",\\\"left\\\":\\\"11.659348%\\\",\\\"width\\\":\\\"3.90846%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.515326000000002%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"700\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":73.85083281172334,\\\"height\\\":42.93802267351676},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#DBE5F5\\\",\\\"letterSpacing\\\":2,\\\"fontSize\\\":26,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":159.22275908424388,\\\"x\\\":378.3118436361548,\\\"h\\\":100.90612107946721,\\\"i\\\":\\\"es-drager-1762856453053-5\\\",\\\"y\\\":566.1992281719063,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"59.541030000000006%\\\",\\\"left\\\":\\\"20.021666%\\\",\\\"width\\\":\\\"8.426659%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.611202000000002%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":159.22275908424388,\\\"height\\\":100.90612107946721},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_08_1763551371680.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":158.21502548422043,\\\"x\\\":175.86167221580308,\\\"h\\\":103.90332101592959,\\\"i\\\":\\\"es-drager-1762856443052-4\\\",\\\"y\\\":565.062056569371,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"59.42144600000001%\\\",\\\"left\\\":\\\"9.307252%\\\",\\\"width\\\":\\\"8.373326%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.926385000000002%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":158.21502548422043,\\\"height\\\":103.90332101592959},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_06_1763551351533.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":179.4107809769754,\\\"x\\\":9.999998261406802,\\\"h\\\":59.87246905308507,\\\"i\\\":\\\"es-drager-1762856433841-3\\\",\\\"y\\\":582.2553106684887,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"61.229474%\\\",\\\"left\\\":\\\"0.5292370000000001%\\\",\\\"width\\\":\\\"9.495083999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.296138%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"销售合同执行情况\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":179.4107809769754,\\\"height\\\":59.87246905308506},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":1.0000054946776085,\\\"x\\\":265.756146201102,\\\"h\\\":489.0000026102841,\\\"i\\\":\\\"es-drager-1762856395529-2\\\",\\\"y\\\":261.1933607244709,\\\"orderNum\\\":70,\\\"angle\\\":89.5176726903602,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(89.5176726903602deg)\\\",\\\"top\\\":\\\"27.466872%\\\",\\\"left\\\":\\\"14.064801%\\\",\\\"width\\\":\\\"0.05292399999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"51.422825%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1.0000054946776085,\\\"height\\\":489.0000026102842},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":23,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_23_1763551793351.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":168.29241816982415,\\\"x\\\":345.52170050011733,\\\"h\\\":100.90612107946721,\\\"i\\\":\\\"es-drager-1762856376359-1\\\",\\\"y\\\":61.146461844218294,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.430110000000002%\\\",\\\"left\\\":\\\"18.28629%\\\",\\\"width\\\":\\\"8.906659%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.611202000000002%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":168.29241816982417,\\\"height\\\":100.90612107946721},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_08_1763551371680.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":170.3079042649941,\\\"x\\\":154.4665731743963,\\\"h\\\":110.89681606252965,\\\"i\\\":\\\"d3cf63e9-7b37-4afe-b90d-c6c1bdf48102\\\",\\\"y\\\":52.412585683244885,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"5.511663000000001%\\\",\\\"left\\\":\\\"8.174944000000002%\\\",\\\"width\\\":\\\"9.013325999999996%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"11.661815000000002%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":170.30790426499408,\\\"height\\\":110.89681606252967},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_06_1763551351533.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":179.4107809769754,\\\"x\\\":6.330603146611956,\\\"h\\\":59.87246905308507,\\\"i\\\":\\\"39a18ddf-1cad-406d-aeba-22acef8b3394\\\",\\\"y\\\":83.53314890672488,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.784275000000003%\\\",\\\"left\\\":\\\"0.33503899999999986%\\\",\\\"width\\\":\\\"9.495083999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.296138%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"销售合同执行情况\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":179.4107809769754,\\\"height\\\":59.87246905308506},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":275.6824912726846,\\\"x\\\":608.4677262042908,\\\"h\\\":56.760195916509936,\\\"i\\\":\\\"es-drager-1762509913951-2\\\",\\\"y\\\":686.8419103099617,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"72.22771200000001%\\\",\\\"left\\\":\\\"32.202369%\\\",\\\"width\\\":\\\"14.590139999999996%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.968854%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"销售/采购物料汇总数据\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":275.6824912726846,\\\"height\\\":56.760195916509936},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"55be9102-a729-42da-a3af-8e09bb26acad\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":652.010970522931,\\\"x\\\":602.0879012620165,\\\"h\\\":39.44354789584329,\\\"i\\\":\\\"es-drager-1762509378719-1\\\",\\\"y\\\":698.3655484446457,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"73.43952800000001%\\\",\\\"left\\\":\\\"31.864725%\\\",\\\"width\\\":\\\"34.506839%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.147850000000002%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":652.010970522931,\\\"height\\\":39.44354789584329},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"165d8b3e-f0cd-4f0c-803d-1ba28cbe4255\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":197.1030783259555,\\\"x\\\":1276.2217920728488,\\\"h\\\":57.678851110038615,\\\"i\\\":\\\"es-drager-1756456857944-26\\\",\\\"y\\\":0,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0%\\\",\\\"left\\\":\\\"67.542391%\\\",\\\"width\\\":\\\"10.431426%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.065459%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"租赁业务数据\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":197.1030783259555,\\\"height\\\":57.67885111003861},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"79b612d5-4915-4201-84ce-a34c4f9b4615\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":545.6198636829778,\\\"x\\\":1285.7391522050414,\\\"h\\\":40.91284466052541,\\\"i\\\":\\\"es-drager-1756456883802-27\\\",\\\"y\\\":10.89156760620763,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.1453480000000005%\\\",\\\"left\\\":\\\"68.046085%\\\",\\\"width\\\":\\\"28.876227%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.302360000000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":545.6198636829778,\\\"height\\\":40.91284466052541},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"165d8b3e-f0cd-4f0c-803d-1ba28cbe4255\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":180.5063957945135,\\\"x\\\":20.990441085205163,\\\"h\\\":44.25372367518584,\\\"i\\\":\\\"aeb580ea-2f80-4d05-8e54-5077a7907722\\\",\\\"y\\\":2.771618046281901,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0.29146100000000014%\\\",\\\"left\\\":\\\"1.110892%\\\",\\\"width\\\":\\\"9.553068%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.653684000000002%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"供应链业务数据\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":180.5063957945135,\\\"height\\\":44.25372367518584},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"55be9102-a729-42da-a3af-8e09bb26acad\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":532.0000133195311,\\\"x\\\":8.069766961641264,\\\"h\\\":39.99999970790813,\\\"i\\\":\\\"cb3770f4-03fa-4ad8-a636-c53fca6ac8f1\\\",\\\"y\\\":6.48828936918585,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0.6823029999999993%\\\",\\\"left\\\":\\\"0.4270819999999998%\\\",\\\"width\\\":\\\"28.155414%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.206366000000001%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":532.0000133195311,\\\"height\\\":39.99999970790813},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"165d8b3e-f0cd-4f0c-803d-1ba28cbe4255\\\"},{\\\"component\\\":\\\"JCardScroll\\\",\\\"visible\\\":true,\\\"w\\\":571.0000008704807,\\\"x\\\":5.169592308042205,\\\"h\\\":252.99999862798865,\\\"i\\\":\\\"e0b9a809-d8a1-4996-bafa-73202d5a4b71\\\",\\\"y\\\":197.15144948020918,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"20.732279%\\\",\\\"left\\\":\\\"0.273594%\\\",\\\"width\\\":\\\"30.219437999999993%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"26.605265%\\\"},\\\"componentName\\\":\\\"卡片滚动(横向)\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[],\\\"dataType\\\":1,\\\"h\\\":255,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 1,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"北京华信科技有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 8000\\\\n  },\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 2,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"上海(中国)智远信息技术股份有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 7800\\\\n  },\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 3,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"深圳市鼎盛软件有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 6880\\\\n  },\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 4,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"广州恒信数据服务有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 5600\\\\n  },\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 5,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"杭州云帆科技发展有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 4900\\\\n  },\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 6,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"成都睿智科技有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 4700\\\\n  },\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 7,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"南京博思信息技术有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 4500\\\\n  },\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 8,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"苏州新创软件有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 4200\\\\n  },\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 9,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"重庆智联科技有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 3900\\\\n  },\\\\n  {\\\\n    \\\\\\\"rank\\\\\\\": 10,\\\\n    \\\\\\\"customerName\\\\\\\": \\\\\\\"武汉华腾信息技术有限公司\\\\\\\",\\\\n    \\\\\\\"contractAmount\\\\\\\": 3600\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":571.0000008704807,\\\"height\\\":252.99999862798865},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":900,\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"showIndex\\\":false,\\\"autoScrollEnabled\\\":true,\\\"columnGap\\\":16,\\\"rowGap\\\":16,\\\"indexFieldStyle\\\":{},\\\"contentFieldMapping\\\":[{\\\"itemConfig\\\":{\\\"marginRight\\\":0,\\\"alignItems\\\":\\\"flex-start\\\",\\\"width\\\":0,\\\"marginBottom\\\":4,\\\"layoutDirection\\\":\\\"row\\\",\\\"justifyContent\\\":\\\"center\\\",\\\"marginTop\\\":0,\\\"height\\\":73,\\\"marginLeft\\\":0},\\\"valueStyle\\\":{\\\"fontSize\\\":14,\\\"marginBottom\\\":4,\\\"fontColor\\\":\\\"#A6D8FF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"height\\\":0},\\\"showValue\\\":true,\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"nameStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"omitConfig\\\":{\\\"show\\\":true,\\\"lines\\\":3},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"valueType\\\":\\\"non-array\\\",\\\"name\\\":\\\"客户名称\\\",\\\"thousandSeparatorConfig\\\":{\\\"show\\\":false},\\\"key\\\":\\\"customerName\\\",\\\"showLabel\\\":false},{\\\"itemConfig\\\":{\\\"marginRight\\\":0,\\\"alignItems\\\":\\\"center\\\",\\\"width\\\":0,\\\"marginBottom\\\":3,\\\"layoutDirection\\\":\\\"row\\\",\\\"justifyContent\\\":\\\"center\\\",\\\"marginTop\\\":0,\\\"height\\\":68,\\\"marginLeft\\\":0},\\\"valueStyle\\\":{\\\"fontSize\\\":24,\\\"marginBottom\\\":0,\\\"fontColor\\\":\\\"#FEAF26\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"height\\\":0,\\\"marginLeft\\\":0},\\\"showValue\\\":true,\\\"valueCompose\\\":{\\\"enabled\\\":false},\\\"nameStyle\\\":{\\\"marginRight\\\":0,\\\"width\\\":225,\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginLeft\\\":0},\\\"omitConfig\\\":{\\\"show\\\":false,\\\"lines\\\":1},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"valueType\\\":\\\"non-array\\\",\\\"name\\\":\\\"排名\\\",\\\"thousandSeparatorConfig\\\":{\\\"show\\\":false},\\\"key\\\":\\\"rank\\\",\\\"showLabel\\\":false},{\\\"itemConfig\\\":{\\\"marginRight\\\":0,\\\"alignItems\\\":\\\"center\\\",\\\"width\\\":0,\\\"marginBottom\\\":0,\\\"layoutDirection\\\":\\\"column-reverse\\\",\\\"justifyContent\\\":\\\"center\\\",\\\"marginTop\\\":22,\\\"height\\\":0,\\\"marginLeft\\\":0},\\\"valueStyle\\\":{\\\"fontSize\\\":18,\\\"marginBottom\\\":2,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontColor\\\":\\\"#F8E71C\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"showValue\\\":true,\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#40A9FF\\\"},\\\"suffix\\\":\\\"万元\\\",\\\"enabled\\\":false},\\\"nameStyle\\\":{\\\"fontSize\\\":12,\\\"fontColor\\\":\\\"#B0B0B0\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"height\\\":0},\\\"omitConfig\\\":{\\\"show\\\":false,\\\"lines\\\":1},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"valueType\\\":\\\"non-array\\\",\\\"name\\\":\\\"合同额(万元)\\\",\\\"thousandSeparatorConfig\\\":{\\\"show\\\":true},\\\"key\\\":\\\"contractAmount\\\",\\\"showLabel\\\":true}],\\\"contentCurrent\\\":2,\\\"autoScrollSpeed\\\":100,\\\"scrollDirection\\\":\\\"left\\\",\\\"cardStyle\\\":{\\\"backgroundColor\\\":\\\"#1890FF1A\\\",\\\"borderColor\\\":\\\"#1890FF\\\",\\\"backgroundImage\\\":\\\"drag/lib/img/cardScroll-bg-01.png\\\",\\\"paddingRight\\\":5,\\\"borderEnabled\\\":true,\\\"paddingBottom\\\":5,\\\"borderRadius\\\":8,\\\"borderWidth\\\":0,\\\"width\\\":98,\\\"bgHighlightImage\\\":\\\"\\\",\\\"paddingTop\\\":5,\\\"borderStyle\\\":\\\"dashed\\\",\\\"paddingLeft\\\":5,\\\"height\\\":250},\\\"currentValue\\\":0,\\\"direction\\\":\\\"horizontal\\\"}}},{\\\"component\\\":\\\"JCardScroll\\\",\\\"visible\\\":true,\\\"w\\\":566.3493253279954,\\\"x\\\":0,\\\"h\\\":244.77226006523037,\\\"i\\\":\\\"2a873018-ef8b-4b48-85d8-2792e5015273\\\",\\\"y\\\":694.6404137593668,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"73.047796%\\\",\\\"left\\\":\\\"0%\\\",\\\"width\\\":\\\"29.973307%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"25.740043000000007%\\\"},\\\"componentName\\\":\\\"卡片滚动(横向)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[{\\\\\\\"rank\\\\\\\":1,\\\\\\\"customerName\\\\\\\":\\\\\\\"北京华信科技有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":8000},{\\\\\\\"rank\\\\\\\":2,\\\\\\\"customerName\\\\\\\":\\\\\\\"上海(中国)智远信息技术股份有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":7800},{\\\\\\\"rank\\\\\\\":3,\\\\\\\"customerName\\\\\\\":\\\\\\\"深圳市鼎盛软件有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":6880},{\\\\\\\"rank\\\\\\\":4,\\\\\\\"customerName\\\\\\\":\\\\\\\"广州恒信数据服务有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":5600},{\\\\\\\"rank\\\\\\\":5,\\\\\\\"customerName\\\\\\\":\\\\\\\"杭州云帆科技发展有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":4900},{\\\\\\\"rank\\\\\\\":6,\\\\\\\"customerName\\\\\\\":\\\\\\\"成都睿智科技有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":4700},{\\\\\\\"rank\\\\\\\":7,\\\\\\\"customerName\\\\\\\":\\\\\\\"南京博思信息技术有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":4500},{\\\\\\\"rank\\\\\\\":8,\\\\\\\"customerName\\\\\\\":\\\\\\\"苏州新创软件有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":4200},{\\\\\\\"rank\\\\\\\":9,\\\\\\\"customerName\\\\\\\":\\\\\\\"重庆智联科技有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":3900},{\\\\\\\"rank\\\\\\\":10,\\\\\\\"customerName\\\\\\\":\\\\\\\"武汉华腾信息技术有限公司\\\\\\\",\\\\\\\"contractAmount\\\\\\\":3600}]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":566.3493253279954,\\\"height\\\":244.77226006523034},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[],\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":900,\\\"dataType\\\":1,\\\"h\\\":255,\\\"linkageConfig\\\":[],\\\"timeOut\\\":0,\\\"option\\\":{\\\"showIndex\\\":false,\\\"autoScrollEnabled\\\":true,\\\"columnGap\\\":16,\\\"rowGap\\\":16,\\\"indexFieldStyle\\\":{},\\\"contentFieldMapping\\\":[{\\\"itemConfig\\\":{\\\"marginRight\\\":0,\\\"alignItems\\\":\\\"flex-start\\\",\\\"width\\\":0,\\\"marginBottom\\\":4,\\\"layoutDirection\\\":\\\"row\\\",\\\"justifyContent\\\":\\\"center\\\",\\\"marginTop\\\":0,\\\"height\\\":73,\\\"marginLeft\\\":0},\\\"valueStyle\\\":{\\\"fontSize\\\":14,\\\"marginBottom\\\":4,\\\"fontColor\\\":\\\"#A6D8FF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"height\\\":0},\\\"showValue\\\":true,\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"nameStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"omitConfig\\\":{\\\"show\\\":true,\\\"lines\\\":3},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"valueType\\\":\\\"non-array\\\",\\\"name\\\":\\\"客户名称\\\",\\\"thousandSeparatorConfig\\\":{\\\"show\\\":false},\\\"key\\\":\\\"customerName\\\",\\\"showLabel\\\":false},{\\\"itemConfig\\\":{\\\"marginRight\\\":0,\\\"alignItems\\\":\\\"center\\\",\\\"width\\\":0,\\\"marginBottom\\\":3,\\\"layoutDirection\\\":\\\"row\\\",\\\"justifyContent\\\":\\\"center\\\",\\\"marginTop\\\":0,\\\"height\\\":68,\\\"marginLeft\\\":0},\\\"valueStyle\\\":{\\\"fontSize\\\":24,\\\"marginBottom\\\":0,\\\"fontColor\\\":\\\"#FEAF26\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"height\\\":0,\\\"marginLeft\\\":0},\\\"showValue\\\":true,\\\"valueCompose\\\":{\\\"enabled\\\":false},\\\"nameStyle\\\":{\\\"marginRight\\\":0,\\\"width\\\":225,\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginLeft\\\":0},\\\"omitConfig\\\":{\\\"show\\\":false,\\\"lines\\\":1},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"valueType\\\":\\\"non-array\\\",\\\"name\\\":\\\"排名\\\",\\\"thousandSeparatorConfig\\\":{\\\"show\\\":false},\\\"key\\\":\\\"rank\\\",\\\"showLabel\\\":false},{\\\"itemConfig\\\":{\\\"marginRight\\\":0,\\\"alignItems\\\":\\\"center\\\",\\\"width\\\":0,\\\"marginBottom\\\":0,\\\"layoutDirection\\\":\\\"column-reverse\\\",\\\"justifyContent\\\":\\\"center\\\",\\\"marginTop\\\":0,\\\"height\\\":100,\\\"marginLeft\\\":0},\\\"valueStyle\\\":{\\\"fontSize\\\":18,\\\"marginBottom\\\":2,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#96F5F8\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontColor\\\":\\\"#40A9FF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"showValue\\\":true,\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#40A9FF\\\"},\\\"suffix\\\":\\\"万元\\\",\\\"enabled\\\":false},\\\"nameStyle\\\":{\\\"fontSize\\\":12,\\\"fontColor\\\":\\\"#B0B0B0\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"height\\\":0},\\\"omitConfig\\\":{\\\"show\\\":false,\\\"lines\\\":1},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"valueType\\\":\\\"non-array\\\",\\\"name\\\":\\\"合同额(万元)\\\",\\\"thousandSeparatorConfig\\\":{\\\"show\\\":true},\\\"key\\\":\\\"contractAmount\\\",\\\"showLabel\\\":true}],\\\"contentCurrent\\\":2,\\\"autoScrollSpeed\\\":100,\\\"scrollDirection\\\":\\\"left\\\",\\\"cardStyle\\\":{\\\"backgroundColor\\\":\\\"#1890FF1A\\\",\\\"borderColor\\\":\\\"#1890FF\\\",\\\"backgroundImage\\\":\\\"drag/lib/img/cardScroll-bg-01.png\\\",\\\"paddingRight\\\":5,\\\"borderEnabled\\\":true,\\\"paddingBottom\\\":5,\\\"borderRadius\\\":8,\\\"borderWidth\\\":0,\\\"width\\\":98,\\\"bgHighlightImage\\\":\\\"\\\",\\\"paddingTop\\\":5,\\\"borderStyle\\\":\\\"dashed\\\",\\\"paddingLeft\\\":5,\\\"height\\\":250},\\\"currentValue\\\":0,\\\"direction\\\":\\\"horizontal\\\"}}},{\\\"component\\\":\\\"JCardCarousel\\\",\\\"visible\\\":true,\\\"w\\\":313.40683127324746,\\\"x\\\":607.8069637496602,\\\"h\\\":160.8503385248215,\\\"i\\\":\\\"ffd3cb22-59f2-471e-8329-f15c72dbe26e\\\",\\\"y\\\":790.0892541760543,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"83.08511500000002%\\\",\\\"left\\\":\\\"32.167399%\\\",\\\"width\\\":\\\"16.586652%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"16.914884999999995%\\\"},\\\"componentName\\\":\\\"卡片轮播\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[],\\\"dataType\\\":1,\\\"h\\\":230,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"销售物料汇总数据\\\\\\\",\\\\n    \\\\\\\"orderNum\\\\\\\": 1247,\\\\n    \\\\\\\"orderAmount\\\\\\\": 28475000,\\\\n    \\\\\\\"deliveryNum\\\\\\\": 1189,\\\\n    \\\\\\\"signNum\\\\\\\": 1156,\\\\n    \\\\\\\"outAmount\\\\\\\": 26789000\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"采购物料汇总数据\\\\\\\",\\\\n    \\\\\\\"orderNum\\\\\\\": 892,\\\\n    \\\\\\\"orderAmount\\\\\\\": 15680000,\\\\n    \\\\\\\"deliveryNum\\\\\\\": 856,\\\\n    \\\\\\\"signNum\\\\\\\": 823,\\\\n    \\\\\\\"outAmount\\\\\\\": 14875000\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"库存物料汇总数据\\\\\\\",\\\\n    \\\\\\\"orderNum\\\\\\\": 2156,\\\\n    \\\\\\\"orderAmount\\\\\\\": 3440,\\\\n    \\\\\\\"deliveryNum\\\\\\\": 2340,\\\\n    \\\\\\\"signNum\\\\\\\": 2340,\\\\n    \\\\\\\"outAmount\\\\\\\": 7100000\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"质量物料汇总数据\\\\\\\",\\\\n    \\\\\\\"orderNum\\\\\\\": 110,\\\\n    \\\\\\\"orderAmount\\\\\\\": 33330000,\\\\n    \\\\\\\"deliveryNum\\\\\\\": 1100,\\\\n    \\\\\\\"signNum\\\\\\\": 110,\\\\n    \\\\\\\"outAmount\\\\\\\": 111110000\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":313.40683127324746,\\\"height\\\":160.85033852482147},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":1000,\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"titleFieldMapping\\\":{\\\"offset\\\":{\\\"x\\\":22,\\\"y\\\":0},\\\"show\\\":true,\\\"position\\\":\\\"left\\\",\\\"textStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":12,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to bottom\\\",\\\"startColor\\\":\\\"#FFFFFF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"key\\\":\\\"title\\\",\\\"direction\\\":\\\"vertical\\\"},\\\"autoScrollEnabled\\\":true,\\\"contentLineHeight\\\":24,\\\"autoScrollDirection\\\":\\\"to-left\\\",\\\"contentFieldMapping\\\":[{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"个\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"订单数量\\\",\\\"width\\\":120,\\\"key\\\":\\\"orderNum\\\",\\\"marginLeft\\\":0},{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"元\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"订单金额\\\",\\\"width\\\":150,\\\"key\\\":\\\"orderAmount\\\",\\\"marginLeft\\\":0},{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"个\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"发货数量\\\",\\\"width\\\":120,\\\"key\\\":\\\"deliveryNum\\\",\\\"marginLeft\\\":0},{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"个\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"签收数量\\\",\\\"width\\\":120,\\\"key\\\":\\\"signNum\\\",\\\"marginLeft\\\":0},{\\\"marginRight\\\":0,\\\"valueStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"valueCompose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":18,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"元\\\",\\\"enabled\\\":true},\\\"nameStyle\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#CCCCCC\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"nameCompose\\\":{\\\"enabled\\\":false},\\\"name\\\":\\\"出库金额\\\",\\\"width\\\":150,\\\"key\\\":\\\"outAmount\\\",\\\"marginLeft\\\":0}],\\\"contentCurrent\\\":0,\\\"autoScrollSpeed\\\":100,\\\"contentLineAlign\\\":\\\"start\\\",\\\"contentLineTextGap\\\":7,\\\"cardStyle\\\":{\\\"backgroundColor\\\":\\\"#1890FF1A\\\",\\\"borderColor\\\":\\\"#1890FF\\\",\\\"backgroundImagePosition\\\":\\\"center\\\",\\\"backgroundImage\\\":\\\"drag/lib/img/cardCarousel-bg-01.png\\\",\\\"paddingRight\\\":7,\\\"minWidth\\\":300,\\\"backgroundImageRepeat\\\":\\\"no-repeat\\\",\\\"backgroundImageSize\\\":\\\"100% 100%\\\",\\\"marginRight\\\":25,\\\"borderEnabled\\\":true,\\\"paddingBottom\\\":16,\\\"borderRadius\\\":2,\\\"borderWidth\\\":1,\\\"paddingTop\\\":11,\\\"borderStyle\\\":\\\"dashed\\\",\\\"paddingLeft\\\":60},\\\"currentValue\\\":0}}},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":507.0000082184526,\\\"x\\\":1330.691670384596,\\\"h\\\":82.0000060577888,\\\"i\\\":\\\"0445aa8e-0d06-4ada-8ac2-1f1d88272fea\\\",\\\"y\\\":536.4516695699515,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"56.41280199999999%\\\",\\\"left\\\":\\\"70.425139%\\\",\\\"width\\\":\\\"26.832320999999997%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"8.623051%\\\"},\\\"componentName\\\":\\\"滚动列表(多行+序号)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 1,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 1000,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"丰田\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 2,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 1000,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"本田\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 3,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 2000,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"大众\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 4,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 1000,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"比亚迪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 5,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 5,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"特斯拉\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 6,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 4,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"福特\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 7,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 2,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"雪佛兰\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 8,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 6,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"宝马\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 9,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 1,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"奔驰\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 10,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 0,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"奥迪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 11,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 3,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"起亚\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 12,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 2,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"现代\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 13,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 5,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"路虎\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 14,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 1,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"沃尔沃\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 15,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"项目名称\\\\\\\",\\\\n    \\\\\\\"violationCount\\\\\\\": 4,\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"马自达\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":507.0000082184526,\\\"height\\\":82.0000060577888},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"showIndex\\\":true,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"__system\\\":true,\\\"textAlign\\\":\\\"center\\\",\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":22,\\\"fontColor\\\":\\\"#E19900\\\"},\\\"enabled\\\":true},\\\"name\\\":\\\"序号\\\",\\\"width\\\":41,\\\"textStyle\\\":{\\\"fontSize\\\":22,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FF4500\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFD700\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#E19900\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"key\\\":\\\"__index__\\\"},{\\\"marginRight\\\":18,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":16,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#D1D1D1\\\"},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":true},\\\"name\\\":\\\"项目名称\\\",\\\"width\\\":65,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"plateNumber\\\",\\\"marginLeft\\\":0},{\\\"compose\\\":{\\\"contentStyle\\\":{\\\"marginRight\\\":3,\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#00D4FF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#00FFDC\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginLeft\\\":4},\\\"suffixStyle\\\":{\\\"fontSize\\\":12,\\\"fontColor\\\":\\\"#C4C4C4\\\"},\\\"prefix\\\":\\\"欠款\\\",\\\"prefixStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"万元\\\",\\\"enabled\\\":true},\\\"name\\\":\\\"金额\\\",\\\"width\\\":100,\\\"textStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"violationCount\\\"}],\\\"itemsPerRow\\\":2,\\\"borderRadius\\\":8,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"indexFieldStyle\\\":{\\\"width\\\":28,\\\"textStyle\\\":{\\\"fontSize\\\":21,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#F54100\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#D4BA28\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"marginLeft\\\":15},\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"backgroundColor\\\":\\\"#FFFFFF\\\",\\\"backgroundImg\\\":\\\"drag/lib/img/scrollList-bg-02.png\\\",\\\"alternateBackgroundColor\\\":\\\"#F8F9FA\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":10,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"image\\\",\\\"height\\\":44}}}}]},\\\"component\\\":\\\"JGroup\\\",\\\"w\\\":1889.5123094958972,\\\"x\\\":31,\\\"y\\\":89,\\\"componentName\\\":\\\"万众\\\",\\\"pageCompId\\\":\\\"1151112776961806336\\\",\\\"equalProportion\\\":true,\\\"key\\\":\\\"a342e46b-63c6-4906-926c-36eaecaf0566\\\",\\\"group\\\":true},{\\\"visible\\\":false,\\\"h\\\":990.5545046613586,\\\"i\\\":\\\"es-drager-1756453915928-25\\\",\\\"props\\\":{\\\"elements\\\":[{\\\"component\\\":\\\"JRing\\\",\\\"visible\\\":true,\\\"w\\\":536,\\\"x\\\":1291.4419695193433,\\\"h\\\":245,\\\"i\\\":\\\"4471d794-0df3-4be7-8e35-7da09940b959\\\",\\\"y\\\":21.97302752185101,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"2.2182552720168527%\\\",\\\"left\\\":\\\"67.8862695459582%\\\",\\\"width\\\":\\\"28.175513368344646%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"24.73362130474166%\\\"},\\\"componentName\\\":\\\"饼状环形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 1048,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"垃圾车\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 735,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"机扫车\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"value\\\\\\\": 580,\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"洒水车\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":536.2250879249707,\\\"height\\\":245.59671746776084},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":480,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"customColor\\\":[{\\\"color1\\\":\\\"#2A7DFB00\\\",\\\"color\\\":\\\"#2A7DFB\\\"},{\\\"color1\\\":\\\"#2BE4E3\\\",\\\"color\\\":\\\"#2BE4E300\\\"},{\\\"color1\\\":\\\"#FCA52F\\\",\\\"color\\\":\\\"#FCA52F00\\\"}],\\\"grid\\\":{\\\"top\\\":50,\\\"left\\\":50,\\\"show\\\":false},\\\"series\\\":[{\\\"data\\\":[],\\\"name\\\":\\\"Access From\\\",\\\"avoidLabelOverlap\\\":false,\\\"emphasis\\\":{\\\"label\\\":{\\\"show\\\":true,\\\"fontSize\\\":14,\\\"fontWeight\\\":\\\"bold\\\"}},\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true,\\\"position\\\":\\\"center\\\"},\\\"labelLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"pie\\\",\\\"radius\\\":[\\\"40%\\\",\\\"70%\\\"]}],\\\"legend\\\":{\\\"r\\\":1,\\\"orient\\\":\\\"vertical\\\",\\\"t\\\":32},\\\"tooltip\\\":{\\\"trigger\\\":\\\"item\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"outRadius\\\":57,\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"innerRadius\\\":77,\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JSemiGauge\\\",\\\"visible\\\":true,\\\"w\\\":238.00000008283695,\\\"x\\\":17.725667868792492,\\\"h\\\":215.0000038199236,\\\"i\\\":\\\"ededef6c-2bd9-4f89-a363-7506ae217601\\\",\\\"y\\\":480.30831953922336,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"48.488833%\\\",\\\"left\\\":\\\"0.9317719999999999%\\\",\\\"width\\\":\\\"12.510769%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"21.705015000000003%\\\"},\\\"componentName\\\":\\\"半圆仪表盘\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataType\\\":1,\\\"h\\\":430,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"total\\\\\\\": 385,\\\\n    \\\\\\\"used\\\\\\\": 85\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":238.00000008283695,\\\"height\\\":215.0000038199236},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":500,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"titleSuffix\\\":\\\"辆\\\",\\\"customAttr\\\":{\\\"innerCircle\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":0,\\\"y2\\\":1,\\\"x2\\\":1,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#2E76B9\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#2E76B9\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":15}},\\\"name\\\":\\\"内部小圆\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"outerScale\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"distance\\\":-52,\\\"show\\\":true,\\\"fontSize\\\":14},\\\"min\\\":0,\\\"max\\\":100,\\\"axisLine\\\":{\\\"show\\\":false},\\\"name\\\":\\\"外部刻度\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"splitNumber\\\":2,\\\"detail\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":67},\\\"innerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"animationDuration\\\":2000,\\\"pointer\\\":{\\\"show\\\":true,\\\"length\\\":74,\\\"width\\\":3,\\\"itemStyle\\\":{\\\"color\\\":\\\"#2E76B9\\\"}},\\\"data\\\":[{\\\"name\\\":\\\"去年优良率\\\",\\\"value\\\":44}],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#2E76B9\\\"],[1,\\\"#2E76B9\\\"]],\\\"width\\\":1}},\\\"name\\\":\\\"内部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"detail\\\":{\\\"offsetCenter\\\":[0,50],\\\"show\\\":false,\\\"textStyle\\\":{\\\"padding\\\":[0,0,0,0],\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":30,\\\"title\\\":{\\\"offsetCenter\\\":[0,26],\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"normal\\\"}}},\\\"outerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#2E76B9\\\"],[1,\\\"#2E76B9\\\"]],\\\"width\\\":2}},\\\"name\\\":\\\"外部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"basic\\\":{\\\"startAngle\\\":180,\\\"endAngle\\\":0},\\\"innerShadow\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"customGradient\\\":{\\\"endColor\\\":\\\"#2E76B9\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#2E76B900\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":1,\\\"y2\\\":0,\\\"x2\\\":0,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#2de69600\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#2de696\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":100}},\\\"name\\\":\\\"内部阴影\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80}},\\\"valuePrefix\\\":\\\"已使用：\\\",\\\"titlePrefix\\\":\\\"车辆总数：\\\",\\\"valueMapping\\\":\\\"used\\\",\\\"titleMapping\\\":\\\"total\\\",\\\"valueSuffix\\\":\\\"辆\\\"}}},{\\\"component\\\":\\\"JStatsSummary\\\",\\\"visible\\\":true,\\\"w\\\":671.0000006332002,\\\"x\\\":609.0035179014067,\\\"h\\\":116.00000459495868,\\\"i\\\":\\\"e06945ca-3292-42b3-a219-f816d45d7af6\\\",\\\"y\\\":59.956609941129244,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.052832999999999%\\\",\\\"left\\\":\\\"32.013035%\\\",\\\"width\\\":\\\"35.271958%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"11.710613000000002%\\\"},\\\"componentName\\\":\\\"统计概览（背景模式）\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"1\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"总车辆数\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 385,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"辆\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"2\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"在线车辆数\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 300,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"辆\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"3\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"离线车辆数\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 85,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"辆\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"4\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"加油总量\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6790,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"升\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": \\\\\\\"5\\\\\\\",\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"作业总里程\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 16790,\\\\n    \\\\\\\"suffix\\\\\\\": \\\\\\\"公里\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":671.0000006332002,\\\"height\\\":116.00000459495868},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":713,\\\"dataType\\\":1,\\\"h\\\":129,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"layout\\\":{\\\"padding\\\":{\\\"top\\\":4,\\\"left\\\":20,\\\"bottom\\\":0,\\\"right\\\":6},\\\"borderColor\\\":\\\"#0f66ff59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"justify\\\":\\\"space-between\\\",\\\"borderWidth\\\":0,\\\"gap\\\":16,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"100% 100%\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"drag/lib/img/bg01.png\\\"},\\\"color\\\":\\\"#0b2b63\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"image\\\"}},\\\"fieldMap\\\":{\\\"compareValue\\\":\\\"compareValue\\\",\\\"unit\\\":\\\"suffix\\\",\\\"negativeValue\\\":\\\"0\\\",\\\"compareState\\\":\\\"compareState\\\",\\\"label\\\":\\\"name\\\",\\\"value\\\":\\\"value\\\",\\\"positiveValue\\\":\\\"1\\\",\\\"compareLabel\\\":\\\"compareLabel\\\"},\\\"card\\\":{\\\"padding\\\":{\\\"horizontal\\\":3,\\\"vertical\\\":15},\\\"borderColor\\\":\\\"#0F66FF59\\\",\\\"borderRadius\\\":0,\\\"shadow\\\":\\\"none\\\",\\\"borderWidth\\\":0,\\\"blur\\\":24,\\\"minWidth\\\":100,\\\"fill\\\":{\\\"image\\\":{\\\"size\\\":\\\"cover\\\",\\\"repeat\\\":\\\"no-repeat\\\",\\\"position\\\":\\\"center\\\",\\\"url\\\":\\\"\\\"},\\\"color\\\":\\\"#0B2B6300\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0bb2ff\\\",\\\"angle\\\":135,\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to bottom right\\\",\\\"startColor\\\":\\\"#05336a\\\"},\\\"type\\\":\\\"none\\\"}},\\\"sections\\\":{\\\"middle\\\":{\\\"compare\\\":{\\\"valueStyle\\\":{\\\"positiveGradient\\\":{\\\"endColor\\\":\\\"#15f0c5\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#15f0c5\\\"},\\\"positiveColor\\\":\\\"#15F0C5\\\",\\\"fontSize\\\":14,\\\"negativeColor\\\":\\\"#D0021B\\\",\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"negativeGradient\\\":{\\\"endColor\\\":\\\"#D0021B\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#D0021B\\\"},\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"alignItems\\\":\\\"center\\\",\\\"labelStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#cfeaff\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#9ed3ff\\\"},\\\"fontColor\\\":\\\"#9ED3FF\\\"},\\\"label\\\":\\\"同比\\\"},\\\"paddingBottom\\\":10,\\\"show\\\":false,\\\"type\\\":\\\"compare\\\",\\\"align\\\":\\\"center\\\"},\\\"top\\\":{\\\"minHeight\\\":40,\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"paddingTop\\\":4,\\\"type\\\":\\\"value\\\",\\\"align\\\":\\\"center\\\",\\\"value\\\":{\\\"unit\\\":{\\\"fontSize\\\":16,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#96F5F8\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#49ABFF\\\"},\\\"fontWeight\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#9ED3FF\\\"},\\\"unitGap\\\":6,\\\"fontSize\\\":24,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#49ABFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"135deg\\\",\\\"startColor\\\":\\\"#96F5F8\\\"},\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#D8F1FF\\\"}},\\\"bottom\\\":{\\\"paddingBottom\\\":10,\\\"show\\\":true,\\\"label\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#C9E6FF\\\"},\\\"type\\\":\\\"label\\\",\\\"align\\\":\\\"center\\\"}}}}},{\\\"component\\\":\\\"JRingProgress\\\",\\\"visible\\\":true,\\\"w\\\":132.99999836773736,\\\"x\\\":1652.157089719601,\\\"h\\\":109.000003549143,\\\"i\\\":\\\"es-drager-1763030296701-1\\\",\\\"y\\\":287.3540472473178,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"29.009413000000002%\\\",\\\"left\\\":\\\"86.847713%\\\",\\\"width\\\":\\\"6.991312000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"11.003938%\\\"},\\\"componentName\\\":\\\"基础环形图\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"占比\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 60\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":132.99999836773736,\\\"height\\\":109.000003549143},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"valueFontWeight\\\":\\\"normal\\\",\\\"color\\\":\\\"#1E90FF\\\",\\\"bgColor\\\":\\\"#E8EDF3C0\\\",\\\"valueFontSize\\\":16,\\\"lineHeight\\\":0,\\\"fontSize\\\":16,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"valueFontColor\\\":\\\"#FFFFFF\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"extraInfo\\\":{\\\"endColor\\\":\\\"#FF4500\\\",\\\"enabledGradient\\\":false,\\\"type\\\":\\\"linear\\\",\\\"direction\\\":\\\"to left\\\",\\\"startColor\\\":\\\"#FFD700\\\"}}}},{\\\"component\\\":\\\"JRingProgress\\\",\\\"visible\\\":true,\\\"w\\\":132.99999836773736,\\\"x\\\":1388.9331704588271,\\\"h\\\":109.000003549143,\\\"i\\\":\\\"99dbdc3f-3f29-4b98-86f1-2b590fe93931\\\",\\\"y\\\":288.74911449504765,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"29.15025%\\\",\\\"left\\\":\\\"73.011017%\\\",\\\"width\\\":\\\"6.991312000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"11.003938%\\\"},\\\"componentName\\\":\\\"基础环形图\\\",\\\"config\\\":{\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":200,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"占比\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 60\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":132.99999836773736,\\\"height\\\":109.000003549143},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":300,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"valueFontWeight\\\":\\\"normal\\\",\\\"color\\\":\\\"#1E90FF\\\",\\\"bgColor\\\":\\\"#E8EDF3C0\\\",\\\"valueFontSize\\\":16,\\\"lineHeight\\\":0,\\\"fontSize\\\":16,\\\"radius\\\":0.9,\\\"innerRadius\\\":0.9,\\\"valueFontColor\\\":\\\"#FFFFFF\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"extraInfo\\\":{\\\"endColor\\\":\\\"#FF4500\\\",\\\"enabledGradient\\\":false,\\\"type\\\":\\\"linear\\\",\\\"direction\\\":\\\"to left\\\",\\\"startColor\\\":\\\"#FFD700\\\"}}}},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":527.999993949144,\\\"x\\\":1357.2801839687218,\\\"h\\\":183.00000186920772,\\\"i\\\":\\\"f65f9644-b011-4d49-9894-8d6293b286ca\\\",\\\"y\\\":782.8405641226518,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"79.030539%\\\",\\\"left\\\":\\\"71.347138%\\\",\\\"width\\\":\\\"27.754983%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"18.474501%\\\"},\\\"componentName\\\":\\\"滚动列表(多行+序号)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 3,\\\\n    \\\\\\\"id\\\\\\\": 1,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤B12345\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"丰田\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 1,\\\\n    \\\\\\\"id\\\\\\\": 2,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤A67890\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"本田\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 2,\\\\n    \\\\\\\"id\\\\\\\": 3,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤C54321\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"大众\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 0,\\\\n    \\\\\\\"id\\\\\\\": 4,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤D98765\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"比亚迪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 5,\\\\n    \\\\\\\"id\\\\\\\": 5,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤E11223\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"特斯拉\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 4,\\\\n    \\\\\\\"id\\\\\\\": 6,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤F33445\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"福特\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 2,\\\\n    \\\\\\\"id\\\\\\\": 7,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤G55667\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"雪佛兰\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 6,\\\\n    \\\\\\\"id\\\\\\\": 8,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤H77889\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"宝马\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 1,\\\\n    \\\\\\\"id\\\\\\\": 9,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤J99001\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"奔驰\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 0,\\\\n    \\\\\\\"id\\\\\\\": 10,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤K11223\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"奥迪\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 3,\\\\n    \\\\\\\"id\\\\\\\": 11,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤L44556\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"起亚\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 2,\\\\n    \\\\\\\"id\\\\\\\": 12,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤M77889\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"现代\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 5,\\\\n    \\\\\\\"id\\\\\\\": 13,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤N99002\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"路虎\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 1,\\\\n    \\\\\\\"id\\\\\\\": 14,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤P22334\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"沃尔沃\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"violationCount\\\\\\\": 4,\\\\n    \\\\\\\"id\\\\\\\": 15,\\\\n    \\\\\\\"plateNumber\\\\\\\": \\\\\\\"粤Q55667\\\\\\\",\\\\n    \\\\\\\"brand\\\\\\\": \\\\\\\"马自达\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":527.999993949144,\\\"height\\\":183.00000186920772},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"showIndex\\\":true,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"__system\\\":true,\\\"textAlign\\\":\\\"center\\\",\\\"name\\\":\\\"序号\\\",\\\"width\\\":41,\\\"textStyle\\\":{\\\"fontSize\\\":20,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FF4500\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFD700\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"key\\\":\\\"__index__\\\"},{\\\"marginRight\\\":18,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":16,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#D1D1D1\\\"},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":true},\\\"name\\\":\\\"车牌号\\\",\\\"width\\\":90,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"plateNumber\\\",\\\"marginLeft\\\":0},{\\\"compose\\\":{\\\"contentStyle\\\":{\\\"marginRight\\\":3,\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#00D4FF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#00FFDC\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginLeft\\\":4},\\\"suffixStyle\\\":{\\\"fontSize\\\":12,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"prefix\\\":\\\"本月\\\",\\\"prefixStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"次\\\",\\\"enabled\\\":true},\\\"name\\\":\\\"违规次数\\\",\\\"width\\\":100,\\\"textStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"violationCount\\\"}],\\\"itemsPerRow\\\":2,\\\"borderRadius\\\":8,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"indexFieldStyle\\\":{\\\"width\\\":28,\\\"textStyle\\\":{\\\"fontSize\\\":21,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#F54100\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#D4BA28\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"marginLeft\\\":15},\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"backgroundColor\\\":\\\"#FFFFFF\\\",\\\"backgroundImg\\\":\\\"drag/lib/img/scrollList-bg-02.png\\\",\\\"alternateBackgroundColor\\\":\\\"#F8F9FA\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":10,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"image\\\",\\\"height\\\":83},\\\"marginLeft\\\":6}}},{\\\"component\\\":\\\"JMultipleBar\\\",\\\"visible\\\":true,\\\"w\\\":577.9999974835168,\\\"x\\\":1324.3610810627897,\\\"h\\\":170.00000417221224,\\\"i\\\":\\\"efa6188b-fbb1-4951-be55-6bb81fc45461\\\",\\\"y\\\":603.1219127277654,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"60.887302%\\\",\\\"left\\\":\\\"69.616704%\\\",\\\"width\\\":\\\"30.383295999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"17.162105%\\\"},\\\"componentName\\\":\\\"对比柱形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"集团公司\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4800,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"建设集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3900,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"投资集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3200,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"万众集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3950,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"新成集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3600,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"海洋集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2100,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"集团公司\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3200,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"建设集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3500,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"投资集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4200,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"万众集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3200,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"新成集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2300,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"海洋集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 1900,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":577.9999974835168,\\\"height\\\":170.00000417221224},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"name\\\":\\\"单位(元)\\\",\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color1\\\":\\\"#006CFF00\\\",\\\"color\\\":\\\"#006CFFB3\\\"},{\\\"color1\\\":\\\"#00D8FF00\\\",\\\"color\\\":\\\"#00D8FFB3\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":43,\\\"left\\\":9,\\\"bottom\\\":18,\\\"right\\\":13,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"barWidth\\\":15,\\\"barGap\\\":\\\"34%\\\",\\\"itemStyle\\\":{\\\"borderRadius\\\":4}}],\\\"legend\\\":{\\\"r\\\":53},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":225.00000639287214,\\\"x\\\":1062.0164140689094,\\\"h\\\":121.99999134059341,\\\"i\\\":\\\"es-drager-1763027856495-4\\\",\\\"y\\\":810.5076231258076,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"81.823627%\\\",\\\"left\\\":\\\"55.826226999999996%\\\",\\\"width\\\":\\\"11.827407999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.316332999999997%\\\"},\\\"componentName\\\":\\\"滚动列表(单行)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 1,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12345\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 2,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A1236\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 3,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12311\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 4,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12377\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 5,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12895\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 6,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12822\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 7,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12811\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":225.00000639287214,\\\"height\\\":121.99999134059341},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"marginRight\\\":0,\\\"gridGap\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"marginRight\\\":15,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"name\\\":\\\"项目名称\\\",\\\"width\\\":91,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#4A90E2\\\"},\\\"key\\\":\\\"projectName\\\",\\\"marginLeft\\\":13}],\\\"itemsPerRow\\\":2,\\\"borderRadius\\\":7,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"marginRight\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"backgroundImg\\\":\\\"drag/lib/img/scrollList-bg-01.png\\\",\\\"isMultiline\\\":false,\\\"alternateBackgroundColor\\\":\\\"#F8F9FA00\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":11,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"color\\\",\\\"marginTop\\\":0,\\\"height\\\":29,\\\"marginLeft\\\":0},\\\"marginLeft\\\":0}}},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":221.00000687106677,\\\"x\\\":824.1148801954979,\\\"h\\\":121.99999134059341,\\\"i\\\":\\\"es-drager-1763027851750-3\\\",\\\"y\\\":811.9027002790828,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"81.964465%\\\",\\\"left\\\":\\\"43.320634%\\\",\\\"width\\\":\\\"11.617143%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.316332999999997%\\\"},\\\"componentName\\\":\\\"滚动列表(单行)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 1,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12345\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 2,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A1236\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 3,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12311\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 4,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12377\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 5,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12895\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 6,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12822\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 7,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12811\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":221.00000687106677,\\\"height\\\":121.99999134059341},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"marginRight\\\":0,\\\"gridGap\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"marginRight\\\":15,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"name\\\":\\\"项目名称\\\",\\\"width\\\":91,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#4A90E2\\\"},\\\"key\\\":\\\"projectName\\\",\\\"marginLeft\\\":13}],\\\"itemsPerRow\\\":2,\\\"borderRadius\\\":7,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"marginRight\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"backgroundImg\\\":\\\"drag/lib/img/scrollList-bg-01.png\\\",\\\"isMultiline\\\":false,\\\"alternateBackgroundColor\\\":\\\"#F8F9FA00\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":11,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"color\\\",\\\"marginTop\\\":0,\\\"height\\\":29,\\\"marginLeft\\\":0},\\\"marginLeft\\\":0}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":219.99999272290734,\\\"x\\\":1049.3552308870337,\\\"h\\\":131.9999857592265,\\\"i\\\":\\\"es-drager-1763027670564-2\\\",\\\"y\\\":802.6060887086645,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"81.025939%\\\",\\\"left\\\":\\\"55.160675999999995%\\\",\\\"width\\\":\\\"11.564576%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"13.325868%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":219.9999927229073,\\\"height\\\":131.9999857592265},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/组-155_02_1763554354943.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":219.99999272290734,\\\"x\\\":813.9859298452752,\\\"h\\\":131.9999857592265,\\\"i\\\":\\\"es-drager-1763027644239-1\\\",\\\"y\\\":804.0011658619395,\\\"orderNum\\\":1076.8710433763197,\\\"angle\\\":359.2911223131234,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(359.2911223131234deg)\\\",\\\"top\\\":\\\"81.166777%\\\",\\\"left\\\":\\\"42.788193%\\\",\\\"width\\\":\\\"11.564576%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"13.325868%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":219.9999927229073,\\\"height\\\":131.9999857592265},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/组-155_02_1763554354943.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":226.00000151742083,\\\"x\\\":576.0844149954746,\\\"h\\\":121.99999134059341,\\\"i\\\":\\\"b7038d3a-2f13-4991-8a6b-eee2677ff7a3\\\",\\\"y\\\":810.7655338021864,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"81.849664%\\\",\\\"left\\\":\\\"30.282601%\\\",\\\"width\\\":\\\"11.879974%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.316332999999997%\\\"},\\\"componentName\\\":\\\"滚动列表(单行)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 1,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12345\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 2,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A1236\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 3,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12311\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 4,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12377\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 5,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12895\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 6,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12822\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"id\\\\\\\": 7,\\\\n    \\\\\\\"projectName\\\\\\\": \\\\\\\"京A12811\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":226.0000015174208,\\\"height\\\":121.99999134059341},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"marginRight\\\":4,\\\"gridGap\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"marginRight\\\":0,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"name\\\":\\\"项目名称\\\",\\\"width\\\":84,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#4A90E2\\\"},\\\"key\\\":\\\"projectName\\\",\\\"marginLeft\\\":12}],\\\"itemsPerRow\\\":2,\\\"borderRadius\\\":7,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"marginRight\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"backgroundImg\\\":\\\"drag/lib/img/scrollList-bg-01.png\\\",\\\"isMultiline\\\":false,\\\"alternateBackgroundColor\\\":\\\"#F8F9FA00\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":11,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"color\\\",\\\"marginTop\\\":3,\\\"height\\\":29,\\\"marginLeft\\\":0},\\\"marginLeft\\\":4}}},{\\\"component\\\":\\\"JListProgress\\\",\\\"visible\\\":true,\\\"w\\\":508.99999146466575,\\\"x\\\":0,\\\"h\\\":230.9999948897365,\\\"i\\\":\\\"896fc5fc-bdf6-404a-8bc0-65a92a72d801\\\",\\\"y\\\":759.5545097716221,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"76.679729%\\\",\\\"left\\\":\\\"0%\\\",\\\"width\\\":\\\"26.756224%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"23.320271000000005%\\\"},\\\"componentName\\\":\\\"列表进度图\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"机扫车\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 200,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-12-31\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-06-15\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 52\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"洒水车\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 110,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2025-11-20\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-05-30\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 68\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"垃圾车\\\\\\\",\\\\n    \\\\\\\"total\\\\\\\": 150,\\\\n    \\\\\\\"date\\\\\\\": \\\\\\\"2026-01-15\\\\\\\",\\\\n    \\\\\\\"endLabel\\\\\\\": \\\\\\\"2025-07-01\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 98\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":508.99999146466575,\\\"height\\\":230.9999948897365},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":1200,\\\"dataType\\\":1,\\\"h\\\":325,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"beginFields\\\":[{\\\"name\\\":\\\"车辆类型\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":19,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"title\\\"}],\\\"endCurrent\\\":0,\\\"endInfo\\\":{\\\"width\\\":103},\\\"scroll\\\":{\\\"count\\\":1,\\\"interval\\\":3000,\\\"enabled\\\":false,\\\"direction\\\":\\\"down\\\"},\\\"centerTopFields\\\":[{\\\"marginRight\\\":0,\\\"isUseExceedFillColor\\\":true,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":false},\\\"showPercentage\\\":true,\\\"name\\\":\\\"进度值\\\",\\\"width\\\":100,\\\"style\\\":{\\\"fontSize\\\":20,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#00D4FF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontColor\\\":\\\"#4A90E2\\\"},\\\"key\\\":\\\"value\\\"}],\\\"body\\\":{\\\"gradient\\\":{\\\"type\\\":\\\"linear\\\"}},\\\"endFields\\\":[{\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":24,\\\"fontColor\\\":\\\"#02DEFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"suffixStyle\\\":{\\\"fontSize\\\":14,\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\"辆\\\",\\\"enabled\\\":true},\\\"name\\\":\\\"值\\\",\\\"style\\\":{\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#00FFFF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#A0D8FF\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#50E3C2\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"key\\\":\\\"value\\\"}],\\\"progressSection\\\":{\\\"marginRight\\\":5,\\\"marginLeft\\\":0},\\\"bar\\\":{\\\"border\\\":{\\\"padding\\\":8,\\\"color\\\":\\\"#4ECBFC5E\\\",\\\"width\\\":2,\\\"enabled\\\":false},\\\"total\\\":{\\\"field\\\":\\\"total\\\",\\\"type\\\":\\\"field\\\",\\\"value\\\":0},\\\"borderRadius\\\":6,\\\"background\\\":{\\\"color\\\":\\\"#5A97FC4C\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#07203D\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#143B6E\\\"}},\\\"indicatorColor\\\":\\\"#DCFEFFB5\\\",\\\"exceed\\\":{\\\"indicatorColor\\\":\\\"#F74B0C\\\",\\\"fill\\\":{\\\"color\\\":\\\"#FFB347\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#FF4500\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFD700\\\",\\\"direction\\\":\\\"to right\\\"}},\\\"percent\\\":70,\\\"enabled\\\":true},\\\"indicatorSize\\\":15,\\\"fill\\\":{\\\"color\\\":\\\"#33C9FF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#24E5F1\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#C5FDFE\\\"}},\\\"valueField\\\":\\\"value\\\",\\\"height\\\":4},\\\"centerTopInfo\\\":{\\\"layout\\\":\\\"horizontal\\\"},\\\"centerTopCurrent\\\":0,\\\"row\\\":{\\\"marginRight\\\":0,\\\"padding\\\":\\\"0 0\\\",\\\"marginBottom\\\":0,\\\"marginTop\\\":8,\\\"height\\\":38,\\\"marginLeft\\\":14},\\\"beginInfo\\\":{\\\"layout\\\":\\\"vertical\\\",\\\"width\\\":100}}}},{\\\"visible\\\":true,\\\"h\\\":39.0000029965315,\\\"i\\\":\\\"es-drager-1763022886545-18\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":194.00000534297763,\\\"x\\\":1692.3135351127542,\\\"y\\\":583.2930619922697,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"58.885509%\\\",\\\"left\\\":\\\"88.958587%\\\",\\\"width\\\":\\\"10.197853999999998%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.937189%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"单位维修保养/加油统计\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":194.00000534297763,\\\"height\\\":39.0000029965315},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":59.00000173934264,\\\"i\\\":\\\"es-drager-1763022875670-17\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":221.00000687106677,\\\"x\\\":1658.2572768485109,\\\"y\\\":396.0363205335455,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"39.981275%\\\",\\\"left\\\":\\\"87.168377%\\\",\\\"width\\\":\\\"11.617143%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.95626%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"月度维修保养/加油统计\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":221.00000687106677,\\\"height\\\":59.000001739342636},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":58.999991833797594,\\\"i\\\":\\\"es-drager-1763022862487-16\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":152.00000085221566,\\\"x\\\":1696.2408644413595,\\\"y\\\":49.11954743833212,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"4.958792999999999%\\\",\\\"left\\\":\\\"89.165032%\\\",\\\"width\\\":\\\"7.990071%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.956259%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"车辆类型占比\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":152.00000085221566,\\\"height\\\":58.99999183379759},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":50.999996298891155,\\\"i\\\":\\\"es-drager-1763022854128-15\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":1630.5316006633993,\\\"y\\\":258.15824566602794,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"26.061993%\\\",\\\"left\\\":\\\"85.710942%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.148631%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"公务用车占比情况\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":50.999996298891155},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":34.99999532353323,\\\"i\\\":\\\"es-drager-1763022836670-14\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":23.999997130832348,\\\"x\\\":1315.267814130949,\\\"y\\\":843.1054841533569,\\\"angle\\\":0.15840966236248732,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0.15840966236248732deg)\\\",\\\"top\\\":\\\"85.114497%\\\",\\\"left\\\":\\\"69.138705%\\\",\\\"width\\\":\\\"1.26159%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.5333739999999993%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"加油频次排名\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":23.999997130832348,\\\"height\\\":34.99999532353323},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":43.999995253075504,\\\"i\\\":\\\"es-drager-1763022832978-13\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":151.000005727667,\\\"x\\\":1381.2350000239387,\\\"y\\\":260.81944958716105,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"26.330651%\\\",\\\"left\\\":\\\"72.606353%\\\",\\\"width\\\":\\\"7.937505%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.441956%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"作业车占比情况\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":151.000005727667,\\\"height\\\":43.999995253075504},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1763022817890-12\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":1071.16465923592,\\\"y\\\":743.3399645960995,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"75.042813%\\\",\\\"left\\\":\\\"56.307116%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"接打电话提醒车辆\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1763022815330-11\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":845.9243465916059,\\\"y\\\":740.9366812568901,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"74.800193%\\\",\\\"left\\\":\\\"44.467076%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"抽烟提醒车辆\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1763022811067-10\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":600.4260951996247,\\\"y\\\":741.065611831217,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"74.813209%\\\",\\\"left\\\":\\\"31.562151999999998%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"离线超24h车辆\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1763022781375-9\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":281.2349983621805,\\\"y\\\":696.622472209391,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"70.326516%\\\",\\\"left\\\":\\\"14.783471%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"异常车辆告警\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":16.999993211770217,\\\"x\\\":354.1266073685814,\\\"h\\\":46.0000139478922,\\\"i\\\":\\\"es-drager-1763022760154-8\\\",\\\"y\\\":655.3329213418754,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"66.158189%\\\",\\\"left\\\":\\\"18.61511%\\\",\\\"width\\\":\\\"0.8936259999999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.643865%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":16.999993211770217,\\\"height\\\":46.0000139478922},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/车辆_03_1763551149225.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1763022745315-7\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":407.97590538011707,\\\"y\\\":48.498212219738235,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"4.8960669999999995%\\\",\\\"left\\\":\\\"21.445766%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"单位车辆统计\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1763022735003-6\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":310.4846940545368,\\\"y\\\":414.40677787182847,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"41.835838%\\\",\\\"left\\\":\\\"16.321018%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"作业车辆总数\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1763022730046-5\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":181.46947631997648,\\\"y\\\":333.5040806749409,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"33.668423%\\\",\\\"left\\\":\\\"9.539171%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"车辆类型分布\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":1.0000141481594371,\\\"x\\\":1589.9882911213126,\\\"h\\\":118.99998806223101,\\\"i\\\":\\\"es-drager-1763022540256-4\\\",\\\"y\\\":269.2954065615573,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"27.186328999999997%\\\",\\\"left\\\":\\\"83.579732%\\\",\\\"width\\\":\\\"0.05256700000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.013472%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":1.0000141481594371,\\\"height\\\":118.99998806223101},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/按钮2-拷贝_04_1763551243662.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":144.00000180860488,\\\"x\\\":188.52286049090264,\\\"h\\\":26.999999788626795,\\\"i\\\":\\\"es-drager-1763022387955-2\\\",\\\"y\\\":377.0445378822139,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"38.063987%\\\",\\\"left\\\":\\\"9.909941%\\\",\\\"width\\\":\\\"7.569541%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.725746%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":144.00000180860488,\\\"height\\\":26.999999788626795},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/样式4_03_1763551206808.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1763022379005-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":53.59139492011721,\\\"y\\\":409.47125090244776,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"41.337579%\\\",\\\"left\\\":\\\"2.817099%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"公务用车\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":523.9999944273385,\\\"x\\\":0,\\\"h\\\":94.0000069684209,\\\"i\\\":\\\"0733c434-458b-4ffb-8b77-d924eb978688\\\",\\\"y\\\":397.43137787573045,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"40.122111%\\\",\\\"left\\\":\\\"0%\\\",\\\"width\\\":\\\"27.54471799999999%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.489635%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":523.9999944273385,\\\"height\\\":94.00000696842092},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/样式4_07_1763551173622.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1762513598535-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":566.4987789692847,\\\"y\\\":690.6787588651661,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"69.726477%\\\",\\\"left\\\":\\\"29.778719999999996%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"异常车辆告警\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":38.99999309098645,\\\"i\\\":\\\"es-drager-1762513583317-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JImg\\\",\\\"w\\\":720.0000090430243,\\\"x\\\":559.6597528446893,\\\"y\\\":703.371991737613,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"71.007904%\\\",\\\"left\\\":\\\"29.419218%\\\",\\\"width\\\":\\\"37.847705%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.937188%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":720.0000090430243,\\\"height\\\":38.99999309098645},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"e0162ae2-0026-4aa2-8823-29fdbe42f92d\\\"},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1756453828584-23\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":1309.960131603751,\\\"y\\\":0,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0%\\\",\\\"left\\\":\\\"68.8597%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"统计与异常告警\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":20,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":39.99999748562227,\\\"i\\\":\\\"es-drager-1756453836255-24\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JImg\\\",\\\"w\\\":549.9999818072682,\\\"x\\\":1292.0973225248063,\\\"y\\\":11.266111280946149,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.137354%\\\",\\\"left\\\":\\\"67.920719%\\\",\\\"width\\\":\\\"28.91144%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.038142%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":549.9999818072682,\\\"height\\\":39.99999748562227},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"e0162ae2-0026-4aa2-8823-29fdbe42f92d\\\"},{\\\"component\\\":\\\"JBar3d\\\",\\\"visible\\\":true,\\\"w\\\":527.999993949144,\\\"x\\\":12.266138880304801,\\\"h\\\":240.99999921391452,\\\"i\\\":\\\"e2ddc1ba-4820-4916-bb9a-384fce062348\\\",\\\"y\\\":88.13717239950154,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"8.897761%\\\",\\\"left\\\":\\\"0.6447849999999999%\\\",\\\"width\\\":\\\"27.754983%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"24.329807%\\\"},\\\"componentName\\\":\\\"3d柱形图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":332,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/33/chart\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"集团公司\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 290\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"建设集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 270\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"投资集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 450\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"新成集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 380\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"万众集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 320\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"海洋集团\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 320\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":527.999993949144,\\\"height\\\":240.99999921391452},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":490,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":true},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA57\\\"}},\\\"show\\\":true,\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#4A90E23D\\\"},\\\"show\\\":true},\\\"name\\\":\\\"单位(辆)\\\",\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA57\\\"}},\\\"show\\\":true,\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":35,\\\"left\\\":0,\\\"bottom\\\":\\\"36\\\",\\\"right\\\":\\\"1\\\",\\\"containLabel\\\":true},\\\"series\\\":[{\\\"color\\\":\\\"#00DEFFCC\\\",\\\"id\\\":\\\"barTopColor\\\"},{\\\"color\\\":\\\"#187DCB00\\\",\\\"id\\\":\\\"barBottomColor\\\"},{\\\"color\\\":\\\"#115BA6\\\",\\\"id\\\":\\\"barColor\\\",\\\"label\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"show\\\":false}},{\\\"color\\\":\\\"#04113300\\\",\\\"id\\\":\\\"shadowColor\\\"},{\\\"color\\\":\\\"#142F5A00\\\",\\\"id\\\":\\\"shadowTopColor\\\"}],\\\"tooltip\\\":{\\\"show\\\":true},\\\"body\\\":{\\\"gradient\\\":{\\\"type\\\":\\\"linear\\\"}},\\\"graphic\\\":{\\\"children\\\":[{\\\"style\\\":{\\\"fill\\\":\\\"#3F486700\\\"}}]},\\\"extraInfo\\\":{\\\"endColor\\\":\\\"#39CEFFCC\\\",\\\"enabledGradient\\\":true,\\\"direction\\\":\\\"to top\\\",\\\"startColor\\\":\\\"#2D48AD19\\\"}}}},{\\\"component\\\":\\\"JGaoDeMap\\\",\\\"visible\\\":true,\\\"w\\\":756.0000047392731,\\\"x\\\":546.8147445117935,\\\"h\\\":499.9999982869137,\\\"i\\\":\\\"93d7dd28-4cba-4221-9f22-a4441b3176a2\\\",\\\"y\\\":158.48299534078043,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.999422%\\\",\\\"left\\\":\\\"28.744004%\\\",\\\"width\\\":\\\"39.74009000000001%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"50.47677800000001%\\\"},\\\"componentName\\\":\\\"高德地图\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[{\\\\\\\"longitude\\\\\\\":116.391466,\\\\\\\"latitude\\\\\\\":39.907425,\\\\\\\"title\\\\\\\":\\\\\\\"湘B.8J1VS\\\\\\\",\\\\\\\"company\\\\\\\":\\\\\\\"小米集团\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"轿车\\\\\\\",\\\\\\\"status\\\\\\\":\\\\\\\"正常\\\\\\\",\\\\\\\"imgUrl\\\\\\\":\\\\\\\"drag/lib/img/car-normal.png\\\\\\\",\\\\\\\"time\\\\\\\":\\\\\\\"2025-08-08 10:00:00\\\\\\\"},{\\\\\\\"longitude\\\\\\\":116.382122,\\\\\\\"latitude\\\\\\\":39.913553,\\\\\\\"title\\\\\\\":\\\\\\\"鄂B.8J1VS\\\\\\\",\\\\\\\"company\\\\\\\":\\\\\\\"苹果集团\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"货车\\\\\\\",\\\\\\\"status\\\\\\\":\\\\\\\"异常\\\\\\\",\\\\\\\"imgUrl\\\\\\\":\\\\\\\"drag/lib/img/trucks-abnormal.png\\\\\\\",\\\\\\\"time\\\\\\\":\\\\\\\"2025-08-05 10:00:00\\\\\\\"},{\\\\\\\"longitude\\\\\\\":116.411722,\\\\\\\"latitude\\\\\\\":39.908215,\\\\\\\"title\\\\\\\":\\\\\\\"京B.8J1VS\\\\\\\",\\\\\\\"company\\\\\\\":\\\\\\\"香蕉集团\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"轿车\\\\\\\",\\\\\\\"status\\\\\\\":\\\\\\\"异常\\\\\\\",\\\\\\\"imgUrl\\\\\\\":\\\\\\\"drag/lib/img/car-abnormal.png\\\\\\\",\\\\\\\"time\\\\\\\":\\\\\\\"2025-08-05 10:00:00\\\\\\\"},{\\\\\\\"longitude\\\\\\\":116.40683,\\\\\\\"latitude\\\\\\\":39.909795,\\\\\\\"title\\\\\\\":\\\\\\\"沪B.8J1VS\\\\\\\",\\\\\\\"company\\\\\\\":\\\\\\\"香蕉集团\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"货车\\\\\\\",\\\\\\\"status\\\\\\\":\\\\\\\"正常\\\\\\\",\\\\\\\"imgUrl\\\\\\\":\\\\\\\"drag/lib/img/trucks-normal.png\\\\\\\",\\\\\\\"time\\\\\\\":\\\\\\\"2025-08-05 10:00:00\\\\\\\"}]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":756.0000047392731,\\\"height\\\":499.99999828691375},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":500,\\\"h\\\":500,\\\"timeOut\\\":0,\\\"option\\\":{\\\"gaoSecurityJsCode\\\":\\\"f908485801bab40e98ae972553d70f8d\\\",\\\"gaodeKey\\\":\\\"f599beada738982465764ddd0b1dae4e\\\",\\\"mapStyle\\\":\\\"darkblue\\\",\\\"marker\\\":{\\\"imgUrl\\\":\\\"drag/lib/img/car-normal.png\\\",\\\"offsetX\\\":-41,\\\"offsetY\\\":-60,\\\"imgField\\\":\\\"imgUrl\\\",\\\"width\\\":82,\\\"showImgField\\\":true,\\\"height\\\":120},\\\"infoWindow\\\":{\\\"titleTextAlign\\\":\\\"center\\\",\\\"padding\\\":0,\\\"titleLetterSpacing\\\":0,\\\"titleFontWeight\\\":\\\"bold\\\",\\\"titleField\\\":\\\"title\\\",\\\"contentLineHeight\\\":16,\\\"showContent\\\":true,\\\"bgImgUrl\\\":\\\"drag/lib/img/bg.png\\\",\\\"contentFieldMapping\\\":[{\\\"name\\\":\\\"公司\\\",\\\"key\\\":\\\"company\\\"},{\\\"name\\\":\\\"类型\\\",\\\"key\\\":\\\"type\\\"},{\\\"name\\\":\\\"状态\\\",\\\"key\\\":\\\"status\\\"},{\\\"name\\\":\\\"时间\\\",\\\"key\\\":\\\"time\\\"}],\\\"show\\\":true,\\\"contentFontSize\\\":11,\\\"contentColor\\\":\\\"#fff\\\",\\\"offsetX\\\":0,\\\"titleLineHeight\\\":23,\\\"contentPaddingTop\\\":8,\\\"offsetY\\\":-55,\\\"bgColor\\\":\\\"#000000\\\",\\\"titleColor\\\":\\\"#fff\\\",\\\"titleFontSize\\\":16,\\\"showTitle\\\":true,\\\"width\\\":224,\\\"contentPaddingLeft\\\":25,\\\"event\\\":\\\"hover\\\",\\\"height\\\":113}}}},{\\\"visible\\\":true,\\\"h\\\":59.99999622843341,\\\"i\\\":\\\"es-drager-1756453224591-18\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":170.0000082121453,\\\"x\\\":28.25791876766705,\\\"y\\\":2.669405712431711,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0.2694860000000002%\\\",\\\"left\\\":\\\"1.485413%\\\",\\\"width\\\":\\\"8.936264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.057212999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"单位与车辆分类概览\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":170.0000082121453,\\\"height\\\":59.9999962284334},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"b9b6326a-6ea6-4872-8b63-5ae7f1fdb450\\\"},{\\\"visible\\\":true,\\\"h\\\":38.99999309098645,\\\"i\\\":\\\"es-drager-1756453227423-19\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JImg\\\",\\\"w\\\":584.9999823789683,\\\"x\\\":0,\\\"y\\\":14.201649272145232,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"1.4337070000000007%\\\",\\\"left\\\":\\\"0%\\\",\\\"width\\\":\\\"30.751259000000008%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.937188%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":584.9999823789683,\\\"height\\\":38.99999309098645},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题背景_1756451499148.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"e0162ae2-0026-4aa2-8823-29fdbe42f92d\\\"},{\\\"component\\\":\\\"JMultipleLine\\\",\\\"visible\\\":true,\\\"w\\\":557.0000047499412,\\\"x\\\":1320.2056205936456,\\\"h\\\":161.00000424267,\\\"i\\\":\\\"62a2a0e8-6118-4798-826d-3fe1b7d357f0\\\",\\\"y\\\":425.2629580765655,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.931808%\\\",\\\"left\\\":\\\"69.398267%\\\",\\\"width\\\":\\\"29.279405000000004%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"16.253523%\\\"},\\\"componentName\\\":\\\"对比折线图\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"markLineConfig\\\":{\\\"show\\\":false,\\\"markLine\\\":[]},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"分组\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"维度\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":300,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/26/stackedBar\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2000,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 1900,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4000,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3800,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 800,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 420,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"维修保养金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"1月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 20,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"2月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 210,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 220,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"4月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 580,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"5月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 500,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"6月\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 800,\\\\n    \\\\\\\"type\\\\\\\": \\\\\\\"加油金额\\\\\\\"\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":557.0000047499412,\\\"height\\\":161.00000424267},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"yAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"splitLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#8F8D8D\\\"},\\\"show\\\":false,\\\"interval\\\":2},\\\"name\\\":\\\"单位(元)\\\",\\\"yUnit\\\":\\\"\\\",\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"customColor\\\":[{\\\"color1\\\":\\\"#1e90ff\\\",\\\"color\\\":\\\"#FE398B\\\"},{\\\"color1\\\":\\\"#90ee90\\\",\\\"color\\\":\\\"#7A53F0\\\"}],\\\"xAxis\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#EEF1FA\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"nameTextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"grid\\\":{\\\"top\\\":35,\\\"left\\\":0,\\\"bottom\\\":18,\\\"right\\\":1,\\\"containLabel\\\":true},\\\"series\\\":[{\\\"areaStyleOpacity\\\":0.1,\\\"symbol\\\":\\\"circle\\\",\\\"symbolSize\\\":15,\\\"lineType\\\":\\\"area\\\",\\\"label\\\":{\\\"position\\\":\\\"top\\\"}}],\\\"legend\\\":{\\\"r\\\":48},\\\"tooltip\\\":{\\\"axisPointer\\\":{\\\"label\\\":{\\\"backgroundColor\\\":\\\"#333\\\",\\\"show\\\":true},\\\"type\\\":\\\"shadow\\\"},\\\"trigger\\\":\\\"axis\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"title\\\":{\\\"textAlign\\\":\\\"left\\\",\\\"show\\\":true,\\\"text\\\":\\\"\\\",\\\"textStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"subtextStyle\\\":{\\\"color\\\":\\\"#EEF1FA\\\"}},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":483.00000408473613,\\\"x\\\":1357.151241934818,\\\"h\\\":136.0000033377698,\\\"i\\\":\\\"es-drager-1763022408549-3\\\",\\\"y\\\":260.5615091941472,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"26.304611%\\\",\\\"left\\\":\\\"71.34036000000002%\\\",\\\"width\\\":\\\"25.389502000000004%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"13.729684%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"size\\\":{\\\"width\\\":483.00000408473613,\\\"height\\\":136.0000033377698},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/按钮2-拷贝_02_1763551275631.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":229.00000591467753,\\\"x\\\":563.4232127899882,\\\"h\\\":131.9999857592265,\\\"i\\\":\\\"4887df15-f532-4ef1-8a4e-6d84f34242fa\\\",\\\"y\\\":805.3962331096695,\\\"orderNum\\\":1076.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"81.307614%\\\",\\\"left\\\":\\\"29.617049%\\\",\\\"width\\\":\\\"12.037673%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"13.325868%\\\"},\\\"componentName\\\":\\\"图片\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":229.00000591467753,\\\"height\\\":131.9999857592265},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/组-155_02_1763554354943.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JSemiGauge\\\",\\\"visible\\\":true,\\\"w\\\":238.00000008283695,\\\"x\\\":259.42555098968336,\\\"h\\\":215.0000038199236,\\\"i\\\":\\\"es-drager-1763544356457-1\\\",\\\"y\\\":482.71159297288773,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"48.731452000000004%\\\",\\\"left\\\":\\\"13.637029999999998%\\\",\\\"width\\\":\\\"12.510769%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"21.705015000000003%\\\"},\\\"componentName\\\":\\\"半圆仪表盘\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataType\\\":1,\\\"h\\\":430,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"total\\\\\\\": 385,\\\\n    \\\\\\\"used\\\\\\\": 300\\\\n  }\\\\n]\\\",\\\"size\\\":{\\\"width\\\":238.00000008283695,\\\"height\\\":215.0000038199236},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":500,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"titleSuffix\\\":\\\"辆\\\",\\\"customAttr\\\":{\\\"innerCircle\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":0,\\\"y2\\\":1,\\\"x2\\\":1,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#BD8D35\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#BD8D35\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":15}},\\\"name\\\":\\\"内部小圆\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"outerScale\\\":{\\\"axisLabel\\\":{\\\"color\\\":\\\"#FFBB38\\\",\\\"distance\\\":-52,\\\"show\\\":true,\\\"fontSize\\\":14},\\\"min\\\":0,\\\"max\\\":100,\\\"axisLine\\\":{\\\"show\\\":false},\\\"name\\\":\\\"外部刻度\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"splitNumber\\\":2,\\\"detail\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":67},\\\"innerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"animationDuration\\\":2000,\\\"pointer\\\":{\\\"show\\\":true,\\\"length\\\":74,\\\"width\\\":3,\\\"itemStyle\\\":{\\\"color\\\":\\\"#BD8D35\\\"}},\\\"data\\\":[{\\\"name\\\":\\\"去年优良率\\\",\\\"value\\\":44}],\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#BD8D35\\\"],[1,\\\"#BD8D35\\\"]],\\\"width\\\":1}},\\\"name\\\":\\\"内部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"detail\\\":{\\\"offsetCenter\\\":[0,50],\\\"show\\\":false,\\\"textStyle\\\":{\\\"padding\\\":[0,0,0,0],\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":18,\\\"fontWeight\\\":\\\"normal\\\"}},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":30,\\\"title\\\":{\\\"offsetCenter\\\":[0,26],\\\"show\\\":true,\\\"textStyle\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"normal\\\"}}},\\\"outerProgress\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,\\\"#BD8D35\\\"],[1,\\\"#BD8D35\\\"]],\\\"width\\\":2}},\\\"name\\\":\\\"外部进度条\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80},\\\"basic\\\":{\\\"startAngle\\\":180,\\\"endAngle\\\":0},\\\"innerShadow\\\":{\\\"axisLabel\\\":{\\\"show\\\":false},\\\"customGradient\\\":{\\\"endColor\\\":\\\"#BD8D35\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#BD8D3500\\\"},\\\"axisLine\\\":{\\\"lineStyle\\\":{\\\"color\\\":[[0.44,{\\\"x\\\":0,\\\"y\\\":1,\\\"y2\\\":0,\\\"x2\\\":0,\\\"global\\\":false,\\\"colorStops\\\":[{\\\"offset\\\":0,\\\"color\\\":\\\"#2de69600\\\"},{\\\"offset\\\":1,\\\"color\\\":\\\"#2de696\\\"}],\\\"type\\\":\\\"linear\\\"}],[1,\\\"rgba(0,0,0,0)\\\"]],\\\"width\\\":100}},\\\"name\\\":\\\"内部阴影\\\",\\\"axisTick\\\":{\\\"show\\\":false},\\\"splitLine\\\":{\\\"show\\\":false},\\\"itemStyle\\\":{\\\"show\\\":false},\\\"type\\\":\\\"gauge\\\",\\\"radius\\\":80}},\\\"valuePrefix\\\":\\\"已使用：\\\",\\\"titlePrefix\\\":\\\"车辆总数：\\\",\\\"valueMapping\\\":\\\"used\\\",\\\"titleMapping\\\":\\\"total\\\",\\\"valueSuffix\\\":\\\"辆\\\"}}}]},\\\"component\\\":\\\"JGroup\\\",\\\"w\\\":1902.3610785463065,\\\"x\\\":6,\\\"y\\\":69,\\\"componentName\\\":\\\"车辆\\\",\\\"pageCompId\\\":\\\"1151112776978583552\\\",\\\"equalProportion\\\":true,\\\"key\\\":\\\"7ea6e027-6c73-41e9-80ee-ab95267ce97a\\\",\\\"group\\\":true},{\\\"visible\\\":true,\\\"h\\\":1065,\\\"i\\\":\\\"es-drager-1756453564096-22\\\",\\\"props\\\":{\\\"elements\\\":[{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":339,\\\"x\\\":1653.2942555685815,\\\"h\\\":157,\\\"i\\\":\\\"es-drager-1763357806623-2\\\",\\\"y\\\":873.5580304806565,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"82.02422821414615%\\\",\\\"left\\\":\\\"75.60621250542819%\\\",\\\"width\\\":\\\"15.502688618805859%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"14.741784037558686%\\\"},\\\"componentName\\\":\\\"滚动列表(多行+序号)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"外刚性还本付息约\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 131.73\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"归还田迪投控本息合计\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 11.04\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"压降天保担保额度\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 36.81\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"压降隐性债务规模\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 24.64\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":339,\\\"height\\\":157},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"marginRight\\\":0,\\\"showIndex\\\":true,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"__system\\\":true,\\\"textAlign\\\":\\\"left\\\",\\\"name\\\":\\\"标题\\\",\\\"width\\\":233,\\\"textStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"title\\\",\\\"marginLeft\\\":14},{\\\"marginRight\\\":18,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":18,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#04FAFD\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginLeft\\\":0},\\\"suffixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\" 亿元\\\",\\\"enabled\\\":true},\\\"name\\\":\\\"金额\\\",\\\"width\\\":193,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"value\\\",\\\"marginLeft\\\":0}],\\\"borderRadius\\\":8,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"indexFieldStyle\\\":{\\\"width\\\":28,\\\"textStyle\\\":{\\\"fontSize\\\":21,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#F54100\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#D4BA28\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"marginLeft\\\":15},\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"backgroundColor\\\":\\\"#FFFFFF\\\",\\\"backgroundImg\\\":\\\"\\\",\\\"isMultiline\\\":true,\\\"alternateBackgroundColor\\\":\\\"#F8F9FA\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":10,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"image\\\",\\\"marginTop\\\":1,\\\"height\\\":41},\\\"marginLeft\\\":4}}},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":339,\\\"x\\\":1310.3048065650646,\\\"h\\\":157,\\\"i\\\":\\\"es-drager-1763357453690-1\\\",\\\"y\\\":869.8886283704572,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"81.6796834150664%\\\",\\\"left\\\":\\\"59.92108381092284%\\\",\\\"width\\\":\\\"15.502688618805859%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"14.741784037558686%\\\"},\\\"componentName\\\":\\\"滚动列表(多行+序号)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"实现资产盘活收入化债约\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 1.2\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"经营收入化债约\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4.46\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"财政资金到位化解隐性债务\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6.61\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"再融资债券资金到位化解隐性债务\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 12.37\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"到期隐性债务偿还本息合计\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 36.99\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":339,\\\"height\\\":157},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"marginRight\\\":0,\\\"showIndex\\\":true,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"__system\\\":true,\\\"textAlign\\\":\\\"left\\\",\\\"name\\\":\\\"标题\\\",\\\"width\\\":233,\\\"textStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"title\\\",\\\"marginLeft\\\":14},{\\\"marginRight\\\":18,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontFamily\\\":\\\"\\\",\\\"fontSize\\\":18,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#04FAFD\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginLeft\\\":0},\\\"suffixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"suffix\\\":\\\" 亿元\\\",\\\"enabled\\\":true},\\\"name\\\":\\\"金额\\\",\\\"width\\\":193,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"value\\\",\\\"marginLeft\\\":0}],\\\"borderRadius\\\":8,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"indexFieldStyle\\\":{\\\"width\\\":28,\\\"textStyle\\\":{\\\"fontSize\\\":21,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#F54100\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#D4BA28\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"marginLeft\\\":15},\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"backgroundColor\\\":\\\"#FFFFFF\\\",\\\"backgroundImg\\\":\\\"\\\",\\\"isMultiline\\\":true,\\\"alternateBackgroundColor\\\":\\\"#F8F9FA\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":10,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"image\\\",\\\"marginTop\\\":1,\\\"height\\\":41},\\\"marginLeft\\\":4}}},{\\\"component\\\":\\\"JScrollList\\\",\\\"visible\\\":true,\\\"w\\\":451.99999999999994,\\\"x\\\":276.01406799531065,\\\"h\\\":157,\\\"i\\\":\\\"ec3ee79c-04b7-462a-89dd-b8b1e95104d8\\\",\\\"y\\\":457.2626025791325,\\\"orderNum\\\":1074.87104337632,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"42.9354556412331%\\\",\\\"left\\\":\\\"12.622301329030117%\\\",\\\"width\\\":\\\"20.670251491741144%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"14.741784037558686%\\\"},\\\"componentName\\\":\\\"滚动列表(多行+序号)\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"保区创新创业园\\\\\\\",\\\\n    \\\\\\\"content\\\\\\\": \\\\\\\"按期完工\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"中蓝白领公寓\\\\\\\",\\\\n    \\\\\\\"content\\\\\\\": \\\\\\\"已建设完成，进行验收与运营准备\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"合成生物中心\\\\\\\",\\\\n    \\\\\\\"content\\\\\\\": \\\\\\\"竣工备案，确定运营方案，项目整体具备移交条件\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"中欧核心区综合服务中心\\\\\\\",\\\\n    \\\\\\\"content\\\\\\\": \\\\\\\"竣工验收\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"title\\\\\\\": \\\\\\\"汀园一期二标项目\\\\\\\",\\\\n    \\\\\\\"content\\\\\\\": \\\\\\\"结构封顶\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":451.99999999999994,\\\"height\\\":157},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":515,\\\"dataType\\\":1,\\\"h\\\":220,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"marginRight\\\":0,\\\"showIndex\\\":true,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"fieldMapping\\\":[{\\\"__system\\\":true,\\\"textAlign\\\":\\\"left\\\",\\\"name\\\":\\\"标题\\\",\\\"width\\\":162,\\\"textStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"normal\\\"},\\\"key\\\":\\\"title\\\",\\\"marginLeft\\\":14},{\\\"marginRight\\\":18,\\\"compose\\\":{\\\"contentStyle\\\":{\\\"fontSize\\\":14,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#FFFFFF\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#000000\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#D1D1D1\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginLeft\\\":0},\\\"prefix\\\":\\\"\\\",\\\"prefixStyle\\\":{\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"enabled\\\":true},\\\"name\\\":\\\"内容\\\",\\\"width\\\":257,\\\"textStyle\\\":{\\\"fontSize\\\":16,\\\"fontWeight\\\":\\\"bold\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"key\\\":\\\"content\\\",\\\"marginLeft\\\":0}],\\\"borderRadius\\\":8,\\\"autoScrollEnabled\\\":true,\\\"showHeader\\\":false,\\\"indexFieldStyle\\\":{\\\"width\\\":28,\\\"textStyle\\\":{\\\"fontSize\\\":21,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#F54100\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#D4BA28\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"fontStyle\\\":\\\"italic\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\"},\\\"marginLeft\\\":15},\\\"header\\\":{\\\"padding\\\":\\\"8px 0\\\",\\\"backgroundColor\\\":\\\"#1890FF\\\",\\\"textAlign\\\":\\\"center\\\",\\\"fontSize\\\":16,\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"row\\\":{\\\"backgroundColor\\\":\\\"#FFFFFF\\\",\\\"backgroundImg\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题行-1_21_1763554527340.png\\\",\\\"isMultiline\\\":true,\\\"alternateBackgroundColor\\\":\\\"#F8F9FA\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"marginBottom\\\":10,\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"backgroundType\\\":\\\"image\\\",\\\"marginTop\\\":1,\\\"height\\\":41},\\\"marginLeft\\\":4}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":665.0000038733882,\\\"x\\\":475.7444323786635,\\\"h\\\":58.9999989,\\\"i\\\":\\\"es-drager-1763042970956-9\\\",\\\"y\\\":960.5416156499999,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"90.191701%\\\",\\\"left\\\":\\\"21.756099697041183%\\\",\\\"width\\\":\\\"30.410879031132236%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.539906%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"成功谋划实施总投资113亿元的港口型国家粮食物流枢纽项目，启动建设总投资12亿元的40万吨粮食筒仓项目，并获取1.9亿元超长期特别国债资金支持\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":665.0000038733882,\\\"height\\\":58.9999989},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"textAlign\\\":\\\"left\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":665.0000038733882,\\\"x\\\":451.688168158851,\\\"h\\\":49.00000034999999,\\\"i\\\":\\\"es-drager-1763042965821-8\\\",\\\"y\\\":889.63892115,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"83.534171%\\\",\\\"left\\\":\\\"20.655991220547158%\\\",\\\"width\\\":\\\"30.410879031132236%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.6009389999999994%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"推动分布式光伏项目并网发电、氢能重卡扩量布局、50MW防波堤风电项目开工建设等工作，构建绿色新能源产业发展体系\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":665.0000038733882,\\\"height\\\":49.00000035},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"textAlign\\\":\\\"left\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":660.9999992373974,\\\"x\\\":398.5111289953106,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763042960045-7\\\",\\\"y\\\":812.4056217,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"76.282218%\\\",\\\"left\\\":\\\"18.22417092608577%\\\",\\\"width\\\":\\\"30.227956239552455%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"累计中标市场化项目14个，签约合同额超9100万元，展现出城市运营业务的品牌实力和市场竞争力\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":660.9999992373974,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"textAlign\\\":\\\"center\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"visible\\\":true,\\\"h\\\":44.9999988,\\\"i\\\":\\\"es-drager-1763042876096-6\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":567.9999905685813,\\\"x\\\":250.33644724267296,\\\"y\\\":408.4407912,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"38.351248%\\\",\\\"left\\\":\\\"11.44804717268814%\\\",\\\"width\\\":\\\"25.97500586805127%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.225352%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"坚持以重点项目为抓手，加快建设进度，着力改善资产质量，提升经营发展后劲\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":567.9999905685813,\\\"height\\\":44.9999988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"4555e8cb-7e7b-4006-8039-984e9f9f66bd\\\"},{\\\"visible\\\":true,\\\"h\\\":44.9999988,\\\"i\\\":\\\"es-drager-1763042867476-5\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":440.0000091524032,\\\"x\\\":274.5216791377492,\\\"y\\\":319.94137929407975,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"30.041444065171806%\\\",\\\"left\\\":\\\"12.554053424142353%\\\",\\\"width\\\":\\\"20.121484171567655%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.225352%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"长三角项目7个，完成内资到位5000万元，新增税收收入3亿元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":440.0000091524032,\\\"height\\\":44.9999988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"4555e8cb-7e7b-4006-8039-984e9f9f66bd\\\"},{\\\"visible\\\":true,\\\"h\\\":44.9999988,\\\"i\\\":\\\"es-drager-1763042861732-4\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":482.99999117174673,\\\"x\\\":282.11840171512296,\\\"y\\\":283.2239145483587,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"26.59379479327312%\\\",\\\"left\\\":\\\"12.901456446680637%\\\",\\\"width\\\":\\\"22.087901079709642%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.225352%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"注册资本1亿元以上的大好项目2个，实体项目3个，京冀项目11个，\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":482.99999117174673,\\\"height\\\":44.9999988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"4555e8cb-7e7b-4006-8039-984e9f9f66bd\\\"},{\\\"visible\\\":true,\\\"h\\\":44.9999988,\\\"i\\\":\\\"es-drager-1763042856445-3\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":313.9999987538101,\\\"x\\\":320.1019879624853,\\\"y\\\":251.5709253381594,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"23.621683130343605%\\\",\\\"left\\\":\\\"14.638470341130239%\\\",\\\"width\\\":\\\"14.359422439485975%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.225352%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"招引项目公司18家\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":313.9999987538101,\\\"height\\\":44.9999988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"4555e8cb-7e7b-4006-8039-984e9f9f66bd\\\"},{\\\"visible\\\":true,\\\"h\\\":44.9999988,\\\"i\\\":\\\"es-drager-1763042838775-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":394.9999935146542,\\\"x\\\":271.9894450914419,\\\"y\\\":211.05509700000002,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"19.81738%\\\",\\\"left\\\":\\\"12.438252728184123%\\\",\\\"width\\\":\\\"18.06360443624784%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.225352%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"预计实现固投6.81亿元，固投指标完成率达103.81%\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":394.9999935146542,\\\"height\\\":44.9999988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"4555e8cb-7e7b-4006-8039-984e9f9f66bd\\\"},{\\\"visible\\\":true,\\\"h\\\":44.9999988,\\\"i\\\":\\\"es-drager-1763042831263-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":443.9999929214536,\\\"x\\\":284.77960655744425,\\\"y\\\":180.79717965,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"16.976261%\\\",\\\"left\\\":\\\"13.023155060312986%\\\",\\\"width\\\":\\\"20.304406008888794%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.225352%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"新增盘活面积4.92万平米，实现新增资产盘活收入4.25亿元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":443.9999929214536,\\\"height\\\":44.9999988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"4555e8cb-7e7b-4006-8039-984e9f9f66bd\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763042137685-3\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":400.00000452637744,\\\"x\\\":1500.7467639279014,\\\"y\\\":774.793677,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"72.75058%\\\",\\\"left\\\":\\\"68.63011733585486%\\\",\\\"width\\\":\\\"18.292258164287208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"建设开发一期工程5.6平方公里造路部分2个立项的决算工作。\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":400.00000452637744,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763042130020-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":456.999992338218,\\\"x\\\":1502.1418325375146,\\\"y\\\":748.3341141,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"70.266114%\\\",\\\"left\\\":\\\"68.69391472304278%\\\",\\\"width\\\":\\\"20.89890436582908%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"启动海阳经济区(北区)生活区域市政基础设施工程和新成集团1区工业区\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":456.999992338218,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":40.000004849999996,\\\"i\\\":\\\"es-drager-1763042123591-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":178.00000806565058,\\\"x\\\":1666.737377284291,\\\"y\\\":721.74561165,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"67.769541%\\\",\\\"left\\\":\\\"76.2209751308658%\\\",\\\"width\\\":\\\"8.14005515984281%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.7558689999999997%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"启动2个立项的决算工作\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":178.00000806565058,\\\"height\\\":40.000004849999996},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041888225-9\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":99.00000518933179,\\\"x\\\":1886.9132275656505,\\\"y\\\":681.10082385,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.953129%\\\",\\\"left\\\":\\\"86.28975875414821%\\\",\\\"width\\\":\\\"4.527334081741519%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"决算总金额\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":99.0000051893318,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041884664-8\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":99.00000518933179,\\\"x\\\":1788.1559048909733,\\\"y\\\":679.8347092500001,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.834245%\\\",\\\"left\\\":\\\"81.77352270030615%\\\",\\\"width\\\":\\\"4.527334081741519%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"决算审核\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":99.0000051893318,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041880252-7\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":71.99999998007033,\\\"x\\\":1871.3329382022273,\\\"y\\\":652.8593292279601,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"61.301345467414095%\\\",\\\"left\\\":\\\"85.57726207393569%\\\",\\\"width\\\":\\\"3.292606431401352%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"14\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":71.99999998007033,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"fontFamily\\\":\\\"DIGITALDREAMFAT\\\",\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041872463-6\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":46.00000114654163,\\\"x\\\":1920.9695138089094,\\\"y\\\":653.1172353,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"61.325562%\\\",\\\"left\\\":\\\"87.84717468672096%\\\",\\\"width\\\":\\\"2.1036097175207886%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"亿元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":46.00000114654163,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43,\\\"i\\\":\\\"es-drager-1763041867629-5\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":42,\\\"x\\\":1814.6154563487687,\\\"y\\\":649.3188808499999,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"60.968909%\\\",\\\"left\\\":\\\"82.98353505205681%\\\",\\\"width\\\":\\\"1.9206870855157703%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558685446009%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":42,\\\"height\\\":43},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041862452-4\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":71.99999998007033,\\\"x\\\":1780.3012813640096,\\\"y\\\":649.1899256720399,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"60.956800532585895%\\\",\\\"left\\\":\\\"81.41432570102454%\\\",\\\"width\\\":\\\"3.292606431401352%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"5\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":71.99999998007033,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"fontFamily\\\":\\\"DIGITALDREAMFAT\\\",\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041848451-3\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":99.00000518933179,\\\"x\\\":1643.9472355287223,\\\"y\\\":682.4958993,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"64.084122%\\\",\\\"left\\\":\\\"75.17876725117546%\\\",\\\"width\\\":\\\"4.527334081741519%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"审核金额约\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":99.0000051893318,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041841952-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":46.00000114654163,\\\"x\\\":1685.600214823564,\\\"y\\\":655.778436,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"61.57544%\\\",\\\"left\\\":\\\"77.08358485605304%\\\",\\\"width\\\":\\\"2.1036097175207886%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"亿元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":46.00000114654163,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041833962-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":71.99999998007033,\\\"x\\\":1637.3587135990622,\\\"y\\\":654.38336055,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"61.444447000000004%\\\",\\\"left\\\":\\\"74.8774698944389%\\\",\\\"width\\\":\\\"3.292606431401352%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"33\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":71.99999998007033,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"fontFamily\\\":\\\"DIGITALDREAMFAT\\\",\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041616450-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":71.99999998007033,\\\"x\\\":1543.7948233774912,\\\"y\\\":655.778436,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"61.57544%\\\",\\\"left\\\":\\\"70.59873285588682%\\\",\\\"width\\\":\\\"3.292606431401352%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"146\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":71.99999998007033,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"fontFamily\\\":\\\"DIGITALDREAMFAT\\\",\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":22,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763041602493-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":46.00000114654163,\\\"x\\\":1594.5685637579134,\\\"y\\\":657.17351145,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"61.706433%\\\",\\\"left\\\":\\\"72.9206487471251%\\\",\\\"width\\\":\\\"2.1036097175207886%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"项\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":46.00000114654163,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":400.00000452637744,\\\"x\\\":1633.5920373159436,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763039434020-6\\\",\\\"y\\\":289.10316405000003,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"27.145837%\\\",\\\"left\\\":\\\"74.70521735890784%\\\",\\\"width\\\":\\\"18.292258164287208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"完善员工考核评价机制，完善选人用人机制，推进企业人才\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":400.00000452637744,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":1,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":407.000007422626,\\\"x\\\":1565.3505526565066,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763039429945-5\\\",\\\"y\\\":236.05509870000003,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"22.164798%\\\",\\\"left\\\":\\\"71.58449025696014%\\\",\\\"width\\\":\\\"18.61237281098715%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"编制《集团改革深化提升行动方案》，进一步完善\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":407.0000074226259,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":1,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":325.0000062860492,\\\"x\\\":1547.7538337977724,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763039424189-4\\\",\\\"y\\\":181.74090809999998,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"17.064874%\\\",\\\"left\\\":\\\"70.7797809555453%\\\",\\\"width\\\":\\\"14.862459877765685%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"航海低空经济基地项目，获银行贷款10亿元\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":325.00000628604914,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":1,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":362.9999981606096,\\\"x\\\":1503.0129020896836,\\\"h\\\":44.9999988,\\\"i\\\":\\\"es-drager-1756453093407-15\\\",\\\"y\\\":132.5638941,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.447314%\\\",\\\"left\\\":\\\"68.73374929541033%\\\",\\\"width\\\":\\\"16.600224012126933%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.225352%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"新评级主体“海阳发展集团”已具备AAA评级落地条件\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":362.99999816060955,\\\"height\\\":44.9999988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"horseLamp\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":1,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":395.9999998903869,\\\"x\\\":1478.4408071078544,\\\"h\\\":105.00000075,\\\"i\\\":\\\"es-drager-1763039350346-3\\\",\\\"y\\\":104.25790874999998,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"9.789475%\\\",\\\"left\\\":\\\"67.61005154551353%\\\",\\\"width\\\":\\\"18.10933537270744%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.859155%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":395.9999998903869,\\\"height\\\":105.00000075},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_53_1763550154234.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":395.9999998903869,\\\"x\\\":1516.553334390973,\\\"h\\\":105.00000075,\\\"i\\\":\\\"es-drager-1763039347418-2\\\",\\\"y\\\":153.76553070000003,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"14.438078%\\\",\\\"left\\\":\\\"69.35296199668146%\\\",\\\"width\\\":\\\"18.10933537270744%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.859155%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":395.9999998903869,\\\"height\\\":105.00000075},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_53_1763550154234.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":395.9999998903869,\\\"x\\\":1560.9964739953105,\\\"h\\\":105.00000075,\\\"i\\\":\\\"es-drager-1763039343497-1\\\",\\\"y\\\":207.07150710000002,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"19.443334%\\\",\\\"left\\\":\\\"71.38537543186779%\\\",\\\"width\\\":\\\"18.10933537270744%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.859155%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":395.9999998903869,\\\"height\\\":105.00000075},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_53_1763550154234.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":56.00000230304804,\\\"x\\\":1774.8417328223916,\\\"h\\\":28.0000002,\\\"i\\\":\\\"es-drager-1763039242410-2\\\",\\\"y\\\":489.28722029999994,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.94246199999999%\\\",\\\"left\\\":\\\"81.16465702539044%\\\",\\\"width\\\":\\\"2.560916219340899%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.629108%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":56.000002303048035,\\\"height\\\":28.000000200000002},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_42_1763550192876.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":86.00000577256742,\\\"x\\\":1769.7772638323565,\\\"h\\\":28.0000002,\\\"i\\\":\\\"es-drager-1763039228598-1\\\",\\\"y\\\":428.51347455,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"40.236007%\\\",\\\"left\\\":\\\"80.93305559243437%\\\",\\\"width\\\":\\\"3.932835724801236%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.629108%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":86.00000577256742,\\\"height\\\":28.000000200000002},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_42_1763550192876.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":112.99999011488859,\\\"x\\\":1772.4384455844076,\\\"h\\\":28.0000002,\\\"i\\\":\\\"es-drager-1763039126579-4\\\",\\\"y\\\":359.00585550000005,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"33.70947%\\\",\\\"left\\\":\\\"81.05475315013376%\\\",\\\"width\\\":\\\"5.167562420882767%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.629108%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":112.9999901148886,\\\"height\\\":28.000000200000002},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_42_1763550192876.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":395.9999998903869,\\\"x\\\":1597.8428996811256,\\\"h\\\":105.00000075,\\\"i\\\":\\\"es-drager-1763039122726-3\\\",\\\"y\\\":260.3774835,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"24.44859%\\\",\\\"left\\\":\\\"73.07038624049068%\\\",\\\"width\\\":\\\"18.10933537270744%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"9.859155%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":395.9999998903869,\\\"height\\\":105.00000075},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_53_1763550154234.png\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":57.00000345,\\\"i\\\":\\\"es-drager-1763039115053-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":175.00000980539266,\\\"x\\\":1587.2297652203986,\\\"y\\\":482.7069261,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"45.324594%\\\",\\\"left\\\":\\\"72.58504075726304%\\\",\\\"width\\\":\\\"8.00286330472264%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.352113%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"开展供应链公司业务部负责人“揭榜挂帅”公开竞聘\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":175.00000980539266,\\\"height\\\":57.00000345},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763038916108-2\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":99.00000518933179,\\\"x\\\":1546.5849930087923,\\\"y\\\":681.3587349000001,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.977346000000004%\\\",\\\"left\\\":\\\"70.72632911248775%\\\",\\\"width\\\":\\\"4.527334081741519%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"结算审核\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":99.0000051893318,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1763038893302-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":593.0000038933175,\\\"x\\\":1478.34348369871,\\\"y\\\":619.4478354,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"58.164116%\\\",\\\"left\\\":\\\"67.60560088325013%\\\",\\\"width\\\":\\\"27.11827259973087%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"坚持问题导向，瞄准债务症结，持续推动土地开发成本决算，为存量债务化解探索可行路径\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":593.0000038933176,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":124.68426635052752,\\\"x\\\":375.1957872215708,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1763038751694-10\\\",\\\"y\\\":952.2192264,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"89.410256%\\\",\\\"left\\\":\\\"17.15794531086652%\\\",\\\"width\\\":\\\"5.701891908249208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"建设集团\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":124.68426635052754,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":124.68426635052752,\\\"x\\\":353.67174706330593,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1763038747182-9\\\",\\\"y\\\":876.2520521999999,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"82.277188%\\\",\\\"left\\\":\\\"16.17363707372123%\\\",\\\"width\\\":\\\"5.701891908249208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"海洋集团\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":124.68426635052754,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":124.68426635052752,\\\"x\\\":323.28487052227433,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1763038741952-8\\\",\\\"y\\\":806.6154723,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"75.738542%\\\",\\\"left\\\":\\\"14.784025613208815%\\\",\\\"width\\\":\\\"5.701891908249208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"投资集团\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":124.68426635052754,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":124.68426635052752,\\\"x\\\":295.43023890973035,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1763038737302-7\\\",\\\"y\\\":740.7772575,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"69.55655%\\\",\\\"left\\\":\\\"13.510215346303756%\\\",\\\"width\\\":\\\"5.701891908249208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"万众集团\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":124.68426635052754,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":124.68426635052752,\\\"x\\\":265.17234092614297,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1763038700270-6\\\",\\\"y\\\":683.93082705,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"64.218857%\\\",\\\"left\\\":\\\"12.12650215840066%\\\",\\\"width\\\":\\\"5.701891908249208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"新成集团\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":124.68426635052754,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":47.00000752227431,\\\"x\\\":327.1512432731535,\\\"h\\\":36.99999569999999,\\\"i\\\":\\\"es-drager-1763038660630-5\\\",\\\"y\\\":954.7033921500001,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"89.643511%\\\",\\\"left\\\":\\\"14.960837332504143%\\\",\\\"width\\\":\\\"2.1493406539803885%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.4741779999999993%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":47.00000752227431,\\\"height\\\":36.99999569999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_11_1763550014908.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":47.00000752227431,\\\"x\\\":300.5627341248534,\\\"h\\\":36.99999569999999,\\\"i\\\":\\\"es-drager-1763038655573-4\\\",\\\"y\\\":888.86517735,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"83.461519%\\\",\\\"left\\\":\\\"13.744927662402764%\\\",\\\"width\\\":\\\"2.1493406539803885%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.4741779999999993%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":47.00000752227431,\\\"height\\\":36.99999569999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_11_1763550014908.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":47.00000752227431,\\\"x\\\":276.506469905041,\\\"h\\\":36.99999569999999,\\\"i\\\":\\\"es-drager-1763038650929-3\\\",\\\"y\\\":823.02696255,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"77.279527%\\\",\\\"left\\\":\\\"12.644819185908743%\\\",\\\"width\\\":\\\"2.1493406539803885%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.4741779999999993%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":47.00000752227431,\\\"height\\\":36.99999569999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_11_1763550014908.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":47.00000752227431,\\\"x\\\":256.24855221102,\\\"h\\\":36.99999569999999,\\\"i\\\":\\\"es-drager-1763038646390-2\\\",\\\"y\\\":753.39038265,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"70.740881%\\\",\\\"left\\\":\\\"11.718411545567136%\\\",\\\"width\\\":\\\"2.1493406539803885%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.4741779999999993%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":47.00000752227431,\\\"height\\\":36.99999569999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_11_1763550014908.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":47.00000752227431,\\\"x\\\":237.25675698124275,\\\"h\\\":36.99999569999999,\\\"i\\\":\\\"es-drager-1763038641612-1\\\",\\\"y\\\":698.94724185,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"65.628849%\\\",\\\"left\\\":\\\"10.849904502029203%\\\",\\\"width\\\":\\\"2.1493406539803885%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"3.4741779999999993%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":47.00000752227431,\\\"height\\\":36.99999569999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_11_1763550014908.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":322,\\\"x\\\":1559.964839345252,\\\"h\\\":169,\\\"i\\\":\\\"es-drager-1763038468350-11\\\",\\\"y\\\":860.6236798322392,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"80.80973519551542%\\\",\\\"left\\\":\\\"71.3381981140264%\\\",\\\"width\\\":\\\"14.725267655620906%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"15.868544600938966%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":322,\\\"height\\\":169},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_37_1763549942040.png\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1763038388788-10\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":173.74037695955448,\\\"x\\\":1796.92848376143,\\\"y\\\":809.8487640279601,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"76.0421374674141%\\\",\\\"left\\\":\\\"82.17469838942888%\\\",\\\"width\\\":\\\"7.9452594823537614%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"全口径化债\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":173.74037695955448,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"25ca1904-5d69-45c5-86bd-b235d3ac9f2a\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":217,\\\"x\\\":1276.483013909144,\\\"h\\\":188,\\\"i\\\":\\\"es-drager-1763038374225-9\\\",\\\"y\\\":853.1559168483586,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"80.10853679327312%\\\",\\\"left\\\":\\\"58.37439142132238%\\\",\\\"width\\\":\\\"9.92354994183148%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"17.652582159624412%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":217.00000000000003,\\\"height\\\":187.99999999999997},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_37_1763549942040.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":527.0000004337631,\\\"x\\\":1484.2555886670573,\\\"h\\\":85.99999605000001,\\\"i\\\":\\\"es-drager-1763038372052-8\\\",\\\"y\\\":707.6811257999999,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"66.448932%\\\",\\\"left\\\":\\\"67.87596525612915%\\\",\\\"width\\\":\\\"24.100049878569862%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"8.075117%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":527.0000004337631,\\\"height\\\":85.99999605000001},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_33_1763550324778.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":409,\\\"x\\\":225.73272507796014,\\\"h\\\":152,\\\"i\\\":\\\"es-drager-1763038238876-6\\\",\\\"y\\\":446.86048514999993,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"41.95873099999999%\\\",\\\"left\\\":\\\"10.322903091321901%\\\",\\\"width\\\":\\\"18.70383376133214%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"14.272300469483568%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":409,\\\"height\\\":152},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_30_1763550061880.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":181.00000632590854,\\\"x\\\":1833.833553545135,\\\"h\\\":256.99999575,\\\"i\\\":\\\"es-drager-1763038235098-5\\\",\\\"y\\\":320.37748545,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"30.082393000000003%\\\",\\\"left\\\":\\\"83.86239103046746%\\\",\\\"width\\\":\\\"8.277247014962983%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"24.131455%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":181.00000632590854,\\\"height\\\":256.99999575},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_49_1763549897591.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":355.9999952643611,\\\"x\\\":384.2555866529894,\\\"h\\\":63.00000044999999,\\\"i\\\":\\\"es-drager-1763038220734-4\\\",\\\"y\\\":949.7678732999999,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"89.180082%\\\",\\\"left\\\":\\\"17.572255781468634%\\\",\\\"width\\\":\\\"16.28010936542699%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.915492999999999%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":355.9999952643611,\\\"height\\\":63.00000044999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_25_1763550350084.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":355.9999952643611,\\\"x\\\":366.529913887456,\\\"h\\\":63.00000044999999,\\\"i\\\":\\\"es-drager-1763038208032-3\\\",\\\"y\\\":873.8006991000001,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"82.047014%\\\",\\\"left\\\":\\\"16.761649334734386%\\\",\\\"width\\\":\\\"16.28010936542699%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.915492999999999%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":355.9999952643611,\\\"height\\\":63.00000044999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_25_1763550350084.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":355.9999952643611,\\\"x\\\":334.87691488218053,\\\"h\\\":63.00000044999999,\\\"i\\\":\\\"es-drager-1763038199346-2\\\",\\\"y\\\":805.4302444499999,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"75.627253%\\\",\\\"left\\\":\\\"15.314137277418286%\\\",\\\"width\\\":\\\"16.28010936542699%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.915492999999999%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":355.9999952643611,\\\"height\\\":63.00000044999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_25_1763550350084.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JOrbitRing\\\",\\\"visible\\\":true,\\\"w\\\":538.9999934747948,\\\"x\\\":886.7444235703398,\\\"h\\\":134.99999640000004,\\\"i\\\":\\\"5c18670b-4206-42f4-8884-1592d70ec919\\\",\\\"y\\\":435.73857300000003,\\\"orderNum\\\":1074.8710433763197,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"40.91442%\\\",\\\"left\\\":\\\"40.551394345349465%\\\",\\\"width\\\":\\\"24.648817299050542%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"12.676056000000004%\\\"},\\\"componentName\\\":\\\"轨道环形文字\\\",\\\"config\\\":{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"经营发展\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 1\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"全口径化债\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 2\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"土地成本决算\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 3\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"创新赋能\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 4\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"重点项目\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 5\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"培育增量\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": 6\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":538.9999934747948,\\\"height\\\":134.99999640000004},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"name\\\",\\\"filed\\\":\\\"标题\\\"},{\\\"mapping\\\":\\\"value\\\",\\\"filed\\\":\\\"id(唯一标识)\\\"},{\\\"mapping\\\":\\\"imgSrc\\\",\\\"filed\\\":\\\"图片地址\\\"}],\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":750,\\\"dataType\\\":1,\\\"h\\\":540,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"sharedSpeed\\\":1,\\\"color\\\":\\\"#ffffff\\\",\\\"showOrbit\\\":true,\\\"planetHeight\\\":80,\\\"letterSpacing\\\":0,\\\"tilt\\\":0.55,\\\"fontGradient\\\":{\\\"endColor\\\":\\\"#0066cc\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"direction\\\":\\\"to right\\\",\\\"startColor\\\":\\\"#ffffff\\\"},\\\"fontStyle\\\":\\\"normal\\\",\\\"orbitRadius\\\":290,\\\"sun\\\":{\\\"repeat\\\":\\\"no-repeat\\\",\\\"width\\\":300,\\\"bgImg\\\":\\\"\\\",\\\"position\\\":\\\"center\\\",\\\"height\\\":300},\\\"sharedDepth\\\":10,\\\"planetWidth\\\":80,\\\"imgTextMode\\\":true,\\\"showType\\\":\\\"1\\\",\\\"fontSize\\\":14,\\\"items\\\":[{\\\"bgColor\\\":\\\"#31AEFD00\\\",\\\"name\\\":\\\"经营发展\\\",\\\"bgImg\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/jyfz_1763550629518.png\\\",\\\"value\\\":1},{\\\"bgColor\\\":\\\"#409EFF00\\\",\\\"name\\\":\\\"全口径化债\\\",\\\"bgImg\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/系统入口页_05_1763550642627.png\\\",\\\"value\\\":2},{\\\"bgColor\\\":\\\"#E6A23C00\\\",\\\"name\\\":\\\"土地成本决算\\\",\\\"bgImg\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/系统入口页_11_1763550652200.png\\\",\\\"value\\\":3},{\\\"bgColor\\\":\\\"#F56C6C00\\\",\\\"name\\\":\\\"创新赋能\\\",\\\"bgImg\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/系统入口页_13_1763550665155.png\\\",\\\"value\\\":4},{\\\"bgColor\\\":\\\"#67C23A00\\\",\\\"name\\\":\\\"重点项目\\\",\\\"bgImg\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/系统入口页_07_1763550686864.png\\\",\\\"value\\\":5},{\\\"bgColor\\\":\\\"#90939900\\\",\\\"name\\\":\\\"培育增量\\\",\\\"bgImg\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/系统入口页_09_1763550696802.png\\\",\\\"value\\\":6}],\\\"fontWeight\\\":\\\"normal\\\",\\\"fontColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":1}}},{\\\"visible\\\":true,\\\"h\\\":44.9999988,\\\"i\\\":\\\"es-drager-1763036807357-1\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":417.0000085791326,\\\"x\\\":939.2344604613129,\\\"y\\\":132.55568295,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.446543%\\\",\\\"left\\\":\\\"42.951797582843234%\\\",\\\"width\\\":\\\"19.06967931280727%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.225352%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"服务产业发展，构筑美好生活\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":417.00000857913255,\\\"height\\\":44.9999988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#00FFDE\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":28,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"4555e8cb-7e7b-4006-8039-984e9f9f66bd\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":507.0000189876905,\\\"x\\\":901.3481934109026,\\\"h\\\":177.9999997500001,\\\"i\\\":\\\"es-drager-1763036557092-11\\\",\\\"y\\\":64.0000035,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"6.009390000000001%\\\",\\\"left\\\":\\\"41.219234158030744%\\\",\\\"width\\\":\\\"23.18543782918827%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"16.713615000000008%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":507.0000189876905,\\\"height\\\":177.99999975000006},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_46_1763550136221.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":502.00000797596726,\\\"x\\\":894.7596865756153,\\\"h\\\":361.0000041,\\\"i\\\":\\\"es-drager-1763036542751-10\\\",\\\"y\\\":167.56389435,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"15.733699000000001%\\\",\\\"left\\\":\\\"40.91793749156958%\\\",\\\"width\\\":\\\"22.9567841011489%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"33.896714%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":502.0000079759672,\\\"height\\\":361.00000410000007},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":2500,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/控股业务综合监管版本6改_01_03_1763550233848.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":486.99999580773743,\\\"x\\\":886.0258078833527,\\\"h\\\":250.99999874999997,\\\"i\\\":\\\"es-drager-1763036539797-9\\\",\\\"y\\\":204.41031705,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"19.193457%\\\",\\\"left\\\":\\\"40.51853158655315%\\\",\\\"width\\\":\\\"22.270823871289416%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"23.568074999999997%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":486.99999580773743,\\\"height\\\":250.99999874999997},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":2500,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/系统入口页_03_1763550411407.png\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1763036485878-7\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":173.74037695955448,\\\"x\\\":1826.178203524619,\\\"y\\\":565.6166436,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"53.109544%\\\",\\\"left\\\":\\\"83.51230693714584%\\\",\\\"width\\\":\\\"7.9452594823537614%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"土地成本决算\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":173.74037695955448,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"25ca1904-5d69-45c5-86bd-b235d3ac9f2a\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":124.68426635052752,\\\"x\\\":289.3575628364595,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1763036478147-6\\\",\\\"y\\\":609.3587282999999,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"57.216782%\\\",\\\"left\\\":\\\"13.232507953245376%\\\",\\\"width\\\":\\\"5.701891908249208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"培育增量\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":124.68426635052754,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":124.68426635052752,\\\"x\\\":295.81711198124265,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1763036469399-5\\\",\\\"y\\\":360.06213314999997,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"33.808651%\\\",\\\"left\\\":\\\"13.527907301355837%\\\",\\\"width\\\":\\\"5.701891908249208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"重点项目\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":124.68426635052754,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":44.00000926201641,\\\"x\\\":327.92498941617816,\\\"h\\\":29.000003249999995,\\\"i\\\":\\\"es-drager-1763033026815-2\\\",\\\"y\\\":131.23329375,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"12.322375000000001%\\\",\\\"left\\\":\\\"14.99622124260831%\\\",\\\"width\\\":\\\"2.012148798860219%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"2.7230049999999997%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":44.00000926201641,\\\"height\\\":29.000003249999995},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_14_1763550425365.png\\\"},\\\"izRotate\\\":false}}},{\\\"visible\\\":true,\\\"h\\\":43.9623054,\\\"i\\\":\\\"es-drager-1756453034262-13\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":173.74037695955448,\\\"x\\\":1626.6084358347014,\\\"y\\\":418.26377610000003,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"39.273594%\\\",\\\"left\\\":\\\"74.38585275949329%\\\",\\\"width\\\":\\\"7.9452594823537614%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.127916%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"交流轮岗16人\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":173.74037695955448,\\\"height\\\":43.962305400000005},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"2cb7d6a8-c524-4c08-8ce5-532022d7dd70\\\"},{\\\"visible\\\":true,\\\"h\\\":44.9999988,\\\"i\\\":\\\"es-drager-1756452592342-9\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":313.9999987538101,\\\"x\\\":369.7385606828839,\\\"y\\\":123.95075985,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"11.638569%\\\",\\\"left\\\":\\\"16.908382821923905%\\\",\\\"width\\\":\\\"14.359422439485975%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.225352%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"营业收88亿元   占全年目标80%，同比↑33%\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":313.9999987538101,\\\"height\\\":44.9999988},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":16,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"4555e8cb-7e7b-4006-8039-984e9f9f66bd\\\"},{\\\"visible\\\":true,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1756451958689-3\\\",\\\"orderNum\\\":70,\\\"component\\\":\\\"JText\\\",\\\"w\\\":173.74037695955448,\\\"x\\\":1781.9929530902693,\\\"y\\\":61.8300021,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"5.805634%\\\",\\\"left\\\":\\\"81.49168694001405%\\\",\\\"width\\\":\\\"7.9452594823537614%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"创新赋能\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":173.74037695955448,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}},\\\"key\\\":\\\"25ca1904-5d69-45c5-86bd-b235d3ac9f2a\\\"},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":173.74037695955448,\\\"x\\\":1605.4161800257914,\\\"h\\\":43.9623054,\\\"i\\\":\\\"es-drager-1756453142151-16\\\",\\\"y\\\":348.89330775,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"32.759935%\\\",\\\"left\\\":\\\"73.41671723460948%\\\",\\\"width\\\":\\\"7.9452594823537614%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.127916%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"各级人员外部引进10人\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":173.74037695955448,\\\"height\\\":43.962305400000005},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":59.00000056330598,\\\"x\\\":1738.5111378985932,\\\"h\\\":64.0000035,\\\"i\\\":\\\"3a8b52fe-94c4-4df7-85d7-f31fbecb03d3\\\",\\\"y\\\":655.53575445,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"61.552653%\\\",\\\"left\\\":\\\"79.50323549017034%\\\",\\\"width\\\":\\\"2.6981080744610706%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"6.009390000000001%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":59.00000056330598,\\\"height\\\":64.0000035},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_03 2_1763550452700.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":537.0000015902696,\\\"x\\\":386.8511210111371,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1756452586319-8\\\",\\\"y\\\":749.0914356000001,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"70.337224%\\\",\\\"left\\\":\\\"17.69095124150927%\\\",\\\"width\\\":\\\"24.557356380389972%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"居然公寓品牌获新区国资委市场化品牌公寓运营整合主体认定，不断壮大品牌影响力\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":537.0000015902696,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":404.9999946711606,\\\"x\\\":353.05978230773735,\\\"h\\\":43.000003349999986,\\\"i\\\":\\\"es-drager-1756452491126-7\\\",\\\"y\\\":692.2532163000001,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"65.000302%\\\",\\\"left\\\":\\\"16.14565153079715%\\\",\\\"width\\\":\\\"18.52091093806795%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"4.037558999999999%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"累计实现营业收入117.54亿元，成为市场化转型发展先锋军\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":404.9999946711606,\\\"height\\\":43.000003349999986},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#F0E9E9\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":14,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JText\\\",\\\"visible\\\":true,\\\"w\\\":124.68426635052752,\\\"x\\\":352.92145536107853,\\\"h\\\":59.94860505,\\\"i\\\":\\\"es-drager-1756452434656-5\\\",\\\"y\\\":58.8546264,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"5.526256%\\\",\\\"left\\\":\\\"16.13932575032033%\\\",\\\"width\\\":\\\"5.701891908249208%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.628977%\\\"},\\\"componentName\\\":\\\"文本\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"经营发展\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":124.68426635052754,\\\"height\\\":59.94860505},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0085FF\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":0,\\\"fontSize\\\":18,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":411.8668873558031,\\\"x\\\":263.7385734642438,\\\"h\\\":108.90662310000002,\\\"i\\\":\\\"a8467ed7-7901-42c0-8679-67cacde2fef7\\\",\\\"y\\\":28.790145000000003,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"2.7033%\\\",\\\"left\\\":\\\"12.060935047741077%\\\",\\\"width\\\":\\\"18.834938368949274%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.225974%\\\"},\\\"componentName\\\":\\\"icon24\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":411.86688735580316,\\\"height\\\":108.9066231},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/1-拷贝-7_03_1763549755584.png\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"816e4f26-b5e1-4d4c-a7c5-6511c1db6220\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":411.8668873558031,\\\"x\\\":209.0375173223916,\\\"h\\\":108.90662310000002,\\\"i\\\":\\\"es-drager-1763031897224-3\\\",\\\"y\\\":329.86869090000005,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"30.973586000000005%\\\",\\\"left\\\":\\\"9.559420474033253%\\\",\\\"width\\\":\\\"18.834938368949274%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.225974%\\\"},\\\"componentName\\\":\\\"icon24\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":411.86688735580316,\\\"height\\\":108.9066231},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/1-拷贝-7_01_1763549812452.png\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"816e4f26-b5e1-4d4c-a7c5-6511c1db6220\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":411.8668873558031,\\\"x\\\":198.90857934232127,\\\"h\\\":108.90662310000002,\\\"i\\\":\\\"es-drager-1763031894764-2\\\",\\\"y\\\":579.2942575500001,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"54.39382700000001%\\\",\\\"left\\\":\\\"9.09621760812108%\\\",\\\"width\\\":\\\"18.834938368949274%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.225974%\\\"},\\\"componentName\\\":\\\"icon24\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":411.86688735580316,\\\"height\\\":108.9066231},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/1-拷贝-7_02_1763549852904.png\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"816e4f26-b5e1-4d4c-a7c5-6511c1db6220\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":411.8668873558031,\\\"x\\\":1641.0187553710434,\\\"h\\\":108.90662310000002,\\\"i\\\":\\\"es-drager-1763031912767-5\\\",\\\"y\\\":778.0750165500001,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"73.058687%\\\",\\\"left\\\":\\\"75.04484596500777%\\\",\\\"width\\\":\\\"18.834938368949274%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.225974%\\\"},\\\"componentName\\\":\\\"icon24\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":411.86688735580316,\\\"height\\\":108.9066231},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/1-拷贝-7_06 拷贝_1763549891576.png\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"816e4f26-b5e1-4d4c-a7c5-6511c1db6220\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":411.8668873558031,\\\"x\\\":1677.8651948253225,\\\"h\\\":108.90662310000002,\\\"i\\\":\\\"es-drager-1763031876182-1\\\",\\\"y\\\":536.37514095,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"50.363862999999995%\\\",\\\"left\\\":\\\"76.7298574032714%\\\",\\\"width\\\":\\\"18.834938368949274%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.225974%\\\"},\\\"componentName\\\":\\\"icon24\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":411.86688735580316,\\\"height\\\":108.9066231},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/1-拷贝-7_05 拷贝_1763549879336.png\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"816e4f26-b5e1-4d4c-a7c5-6511c1db6220\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":411.8668873558031,\\\"x\\\":1616.9624966893314,\\\"h\\\":108.90662310000002,\\\"i\\\":\\\"es-drager-1763031899241-4\\\",\\\"y\\\":33.59671365,\\\"orderNum\\\":70,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"3.1546209999999997%\\\",\\\"left\\\":\\\"73.94473774177465%\\\",\\\"width\\\":\\\"18.834938368949274%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"10.225974%\\\"},\\\"componentName\\\":\\\"icon24\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":411.86688735580316,\\\"height\\\":108.9066231},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/1-拷贝-7_04_1763549870157.png\\\"},\\\"izRotate\\\":false}},\\\"key\\\":\\\"816e4f26-b5e1-4d4c-a7c5-6511c1db6220\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":566.999984192849,\\\"x\\\":288.6752764923798,\\\"h\\\":92.99999609999999,\\\"i\\\":\\\"es-drager-1763033021068-1\\\",\\\"y\\\":109.70926035000002,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"10.301339000000002%\\\",\\\"left\\\":\\\"13.201306558728765%\\\",\\\"width\\\":\\\"25.92927493159169%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"8.732394%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":566.999984192849,\\\"height\\\":92.99999609999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_19_1763549796825.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":708.0000067596717,\\\"x\\\":250.69168603282534,\\\"h\\\":360.00000105,\\\"i\\\":\\\"es-drager-1763033033328-3\\\",\\\"y\\\":28.67760645,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"2.692733%\\\",\\\"left\\\":\\\"11.4642924716529%\\\",\\\"width\\\":\\\"32.377296893532844%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"33.802817%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":708.0000067596717,\\\"height\\\":360.00000105},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_01_1763550492678.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":839.9999928118405,\\\"x\\\":734.2204008493551,\\\"h\\\":668.9999956500001,\\\"i\\\":\\\"es-drager-1763036537556-8\\\",\\\"y\\\":141.23329230000002,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"13.261342%\\\",\\\"left\\\":\\\"33.57637242460877%\\\",\\\"width\\\":\\\"38.41374138159623%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"62.816901%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":839.9999928118405,\\\"height\\\":668.9999956500001},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/系统入口页_04_03_1763550531200.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":659.999992861665,\\\"x\\\":1379.2966113616646,\\\"h\\\":671.0000017500001,\\\"i\\\":\\\"es-drager-1763038369685-7\\\",\\\"y\\\":22.83938295,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"2.144543%\\\",\\\"left\\\":\\\"63.07612353661938%\\\",\\\"width\\\":\\\"30.18222530309287%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"63.00469500000001%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":659.999992861665,\\\"height\\\":671.0000017500001},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_03_1763550548877.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":731.0000073329425,\\\"x\\\":1353.0949544179368,\\\"h\\\":270.00000345,\\\"i\\\":\\\"es-drager-1763039541856-9\\\",\\\"y\\\":543.60140025,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"51.042385%\\\",\\\"left\\\":\\\"61.87790486731145%\\\",\\\"width\\\":\\\"33.429101752293235%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"25.352113%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":731.0000073329423,\\\"height\\\":270.00000345},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_06_1763550562377.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":983,\\\"x\\\":0,\\\"h\\\":304,\\\"i\\\":\\\"es-drager-1763039119090-2\\\",\\\"y\\\":305.95779117995306,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"28.728431096709205%\\\",\\\"left\\\":\\\"0%\\\",\\\"width\\\":\\\"44.95322393004767%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"28.544600938967136%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":983,\\\"height\\\":304},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_04_1763550080999.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":355.9999952643611,\\\"x\\\":278.0304868833528,\\\"h\\\":63.00000044999999,\\\"i\\\":\\\"es-drager-1763036995887-1\\\",\\\"y\\\":680.21335935,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"63.86979900000001%\\\",\\\"left\\\":\\\"12.714513465155179%\\\",\\\"width\\\":\\\"16.28010936542699%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.915492999999999%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":355.9999952643611,\\\"height\\\":63.00000044999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_25_1763550350084.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":355.9999952643611,\\\"x\\\":307.02228326963655,\\\"h\\\":63.00000044999999,\\\"i\\\":\\\"es-drager-1763038194851-1\\\",\\\"y\\\":737.0597898000001,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"69.207492%\\\",\\\"left\\\":\\\"14.040327010513224%\\\",\\\"width\\\":\\\"16.28010936542699%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"5.915492999999999%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":355.9999952643611,\\\"height\\\":63.00000044999999},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_25_1763550350084.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":1049.9999962315355,\\\"x\\\":1136.7174715293083,\\\"h\\\":194.99999835,\\\"i\\\":\\\"es-drager-1763039539776-8\\\",\\\"y\\\":857.7280172999999,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"80.537842%\\\",\\\"left\\\":\\\"51.98282303444006%\\\",\\\"width\\\":\\\"48.01717696555994%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"18.309859%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1049.9999962315353,\\\"height\\\":194.99999835},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_10_1763549923063.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":992.0000020439625,\\\"x\\\":226.2485278745604,\\\"h\\\":368.99999655000005,\\\"i\\\":\\\"es-drager-1763043471607-10\\\",\\\"y\\\":684.14067465,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"64.238561%\\\",\\\"left\\\":\\\"10.346491085848166%\\\",\\\"width\\\":\\\"45.364799827558485%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"34.647887000000004%\\\"},\\\"componentName\\\":\\\"icon22\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":992.0000020439625,\\\"height\\\":368.99999655000005},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/未标题-1_07_1763549998727.png\\\"},\\\"izRotate\\\":false}}},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":2057.9999959525203,\\\"x\\\":111.87924914302464,\\\"h\\\":1065,\\\"i\\\":\\\"es-drager-1756452975290-11\\\",\\\"y\\\":0,\\\"orderNum\\\":70,\\\"angle\\\":0,\\\"groupStyle\\\":{\\\"transform\\\":\\\"rotate(0deg)\\\",\\\"top\\\":\\\"0%\\\",\\\"left\\\":\\\"5.11631021348116%\\\",\\\"width\\\":\\\"94.11366700517888%\\\",\\\"position\\\":\\\"absolute\\\",\\\"config\\\":{},\\\"height\\\":\\\"100%\\\"},\\\"componentName\\\":\\\"icon24\\\",\\\"config\\\":{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":2057.9999959525203,\\\"height\\\":1065},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[],\\\"show\\\":false},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":-1,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"izGallery\\\":true,\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/控股业务综合监管版本6改_11_1763550114546.png\\\"},\\\"izRotate\\\":false}}}]},\\\"component\\\":\\\"JGroup\\\",\\\"w\\\":2186.7174677608436,\\\"x\\\":-181,\\\"y\\\":23,\\\"componentName\\\":\\\"总览图\\\",\\\"pageCompId\\\":\\\"1151112777012137984\\\",\\\"equalProportion\\\":false,\\\"key\\\":\\\"64c403ce-8e74-45bf-9bdd-620348b3218d\\\",\\\"group\\\":true},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":45,\\\"x\\\":1854,\\\"h\\\":45,\\\"i\\\":\\\"e1f80194-96dc-4201-b615-7b607ae986ad\\\",\\\"y\\\":7,\\\"orderNum\\\":70,\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1151112777028915200\\\",\\\"key\\\":\\\"d25da919-3018-489d-b036-6b761ae9f043\\\"},{\\\"component\\\":\\\"JCurrentTime\\\",\\\"visible\\\":true,\\\"w\\\":309,\\\"x\\\":17,\\\"h\\\":33,\\\"i\\\":\\\"cef21ff4-9c5c-48bc-89fc-29a197a17ac3\\\",\\\"y\\\":15,\\\"orderNum\\\":70,\\\"componentName\\\":\\\"当前时间\\\",\\\"pageCompId\\\":\\\"1151112777045692416\\\",\\\"key\\\":\\\"257448bf-3fe8-491e-b3e1-c386ab97b099\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":1911,\\\"x\\\":-2,\\\"h\\\":70,\\\"i\\\":\\\"5425948a-c724-4ea6-803a-00d4a5b70813\\\",\\\"y\\\":0,\\\"orderNum\\\":0,\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1151112777075052544\\\",\\\"key\\\":\\\"c17de8af-9926-449f-8f73-aaef011b77fb\\\"},{\\\"component\\\":\\\"JImg\\\",\\\"visible\\\":true,\\\"w\\\":679,\\\"x\\\":608,\\\"h\\\":46,\\\"i\\\":\\\"7dfacde7-dd88-45ec-824e-e071f091bad5\\\",\\\"y\\\":85,\\\"orderNum\\\":70,\\\"componentName\\\":\\\"图片\\\",\\\"pageCompId\\\":\\\"1151112777112801280\\\",\\\"key\\\":\\\"e0c4ef30-5c9a-43a7-88ea-d24e7b63d8b3\\\"}]', '', '2011441918119228928', '1', 'admin', '2025-11-19 18:26:18', 'admin', '2025-11-19 21:18:03', '', 2, 3, 20, 0);\nINSERT INTO `onl_drag_page_comp` (`id`, `parent_id`, `page_id`, `comp_id`, `component`, `config`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1151112776819200000', NULL, '1151069555267260416', NULL, 'JText', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"dataType\\\":1,\\\"h\\\":60,\\\"viewLoading\\\":true,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"chartData\\\":\\\"{\\\\n  \\\\\\\"value\\\\\\\": \\\\\\\"集团业务综合管理平台\\\\\\\"\\\\n}\\\",\\\"size\\\":{\\\"width\\\":496.27777777777777,\\\"height\\\":60},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":170,\\\"turnConfig\\\":{\\\"type\\\":\\\"_blank\\\",\\\"url\\\":\\\"\\\"},\\\"linkType\\\":\\\"url\\\",\\\"linkageConfig\\\":[],\\\"option\\\":{\\\"openUrl\\\":\\\"\\\",\\\"isLink\\\":false,\\\"body\\\":{\\\"fontFamily\\\":\\\"DIGITALDREAMFAT\\\",\\\"color\\\":\\\"#FFFFFFE6\\\",\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":false,\\\"startColor\\\":\\\"#FFFFFF\\\",\\\"direction\\\":\\\"to bottom\\\"},\\\"letterSpacing\\\":6,\\\"fontSize\\\":30,\\\"text\\\":\\\"\\\",\\\"fontStyle\\\":\\\"italic\\\",\\\"fontWeight\\\":\\\"bold\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"modal\\\":{\\\"backgroundColor\\\":\\\"#363636\\\",\\\"backgroundImage\\\":\\\"\\\",\\\"backgroundSize\\\":\\\"100% 100%\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"title\\\":\\\"标题\\\",\\\"sizeMode\\\":\\\"full\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"titleBgColor\\\":\\\"#1F1F1F\\\"},\\\"openType\\\":\\\"_blank\\\"}}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` (`id`, `parent_id`, `page_id`, `comp_id`, `component`, `config`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1151112776861143040', NULL, '1151069555267260416', NULL, 'JTabToggle', '{\\\"chartData\\\":\\\"[\\\\n  {\\\\n    \\\\\\\"label\\\\\\\": \\\\\\\"总览图\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": \\\\\\\"1\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"label\\\\\\\": \\\\\\\"新成业务板块\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": \\\\\\\"2\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"label\\\\\\\": \\\\\\\"万众业务板块\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": \\\\\\\"3\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"label\\\\\\\": \\\\\\\"投资业务板块\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": \\\\\\\"4\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"label\\\\\\\": \\\\\\\"建设业务板块\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": \\\\\\\"5\\\\\\\"\\\\n  },\\\\n  {\\\\n    \\\\\\\"label\\\\\\\": \\\\\\\"车辆业务版块\\\\\\\",\\\\n    \\\\\\\"value\\\\\\\": \\\\\\\"6\\\\\\\"\\\\n  }\\\\n]\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"height\\\":70},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"dataMapping\\\":[{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"文本\\\"},{\\\"mapping\\\":\\\"\\\",\\\"filed\\\":\\\"数值\\\"}],\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":680,\\\"dataType\\\":1,\\\"h\\\":70,\\\"viewLoading\\\":true,\\\"timeOut\\\":0,\\\"option\\\":{\\\"personalizedMode\\\":false,\\\"normal\\\":{\\\"imgUrl\\\":\\\"\\\",\\\"backgroundColor\\\":\\\"#3A414D00\\\",\\\"borderColor\\\":\\\"#0692A4\\\",\\\"color\\\":\\\"#FFFFFF\\\",\\\"borderWidth\\\":0,\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to bottom\\\",\\\"startColor\\\":\\\"#FFFFFF\\\"},\\\"fontSize\\\":14,\\\"backgroundSize\\\":\\\"contain\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\",\\\"fontWeight\\\":\\\"bold\\\"},\\\"active\\\":{\\\"imgUrl\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/背景1_1756454238980.png\\\",\\\"backgroundColor\\\":\\\"#0A73FF00\\\",\\\"borderColor\\\":\\\"#0692A4\\\",\\\"color\\\":\\\"#FFFFFF\\\",\\\"borderWidth\\\":0,\\\"gradient\\\":{\\\"endColor\\\":\\\"#0066CC\\\",\\\"type\\\":\\\"linear\\\",\\\"enabled\\\":true,\\\"direction\\\":\\\"to bottom\\\",\\\"startColor\\\":\\\"#FFFFFF\\\"},\\\"fontSize\\\":18,\\\"backgroundSize\\\":\\\"contain\\\",\\\"backgroundPosition\\\":\\\"center center\\\",\\\"backgroundRepeat\\\":\\\"no-repeat\\\"},\\\"time\\\":60,\\\"autoPlay\\\":true,\\\"items\\\":[{\\\"normalImgUrl\\\":\\\"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAEAAD/4QMyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA5LjEtYzAwMSA3OS4xNDYyODk5Nzc3LCAyMDIzLzA2LzI1LTIzOjU3OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuMiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1RTAzNTY5Mjc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1RTAzNTY5Mzc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVERkQ1Rjg5NzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVERkQ1RjhBNzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAGBYWIhgiNyAgN0IvKi9CQDU0NDVARkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgEaIiIsJiw1ISE1RjUsNUZGRjs7RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG/8AAEQgARgBiAwEiAAIRAQMRAf/EAGsAAQACAwEAAAAAAAAAAAAAAAABBQIDBAYBAQEBAAAAAAAAAAAAAAAAAAACARAAAwABBAADBQkBAAAAAAAAAAECESESAwQxQVFxgSITBWGRodHhMkJSYoIRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/APOgAAAAAAAAAASAACBKAywCQUxqABLQA7+l1Y5lV8jUwtMt4w34e37wOAFnfRieB1Nzdy81try9F+uB1Opxcsy6eXW/Kz6LQCsJLd9PrbM7nVQs3safjrlZ8l9hHV+n8fNEU97d7suWsLDx5oCpBev6ZwTcw3XxtpfFPks/1KIASiCUBmACktQAJUF10uKo4f4v5iq9tS6/b/0vEpTbHPycbVTTTnwAvdj5lUcUxMXK1U4e7Gdr1/PBx/TFyKeSePS3sS0/1r+Bw8vb5uZJXTaWpC7PKo+Uqaj0Ave5N8s1xTW93trjWnhrnX3ZNPWuo4eFJJp78tpvGKz5eGfX3lVPc54nZNtSRPb5olRNtSvBLQD0Td/PhuVUvPx6Nzo9E1jT2o8sdM97sS8q697ycwAlEEoDMAFMagAS1IAAAAAAAAAAEoglAZgApLUSASoAAAAAAAAAAAlAAZgApj//2Q==\\\",\\\"width\\\":98,\\\"activeImgUrl\\\":\\\"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAEAAD/4QMyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA5LjEtYzAwMSA3OS4xNDYyODk5Nzc3LCAyMDIzLzA2LzI1LTIzOjU3OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuMiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1RTA4REI1QTc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1RTA4REI1Qjc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVFMDhEQjU4NzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVFMDhEQjU5NzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAGBYWIhgiNyAgN0IvKi9CQDU0NDVARkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgEaIiIsJiw1ISE1RjUsNUZGRjs7RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG/8AAEQgARgBiAwEiAAIRAQMRAf/EAHIAAQEBAQEBAQAAAAAAAAAAAAABBQQDAgYBAQEBAQEAAAAAAAAAAAAAAAABAgQFEAACAQMCAwYHAQAAAAAAAAAAAQIRIQMSBEEiEzFRcZHBQmGBobEyUoIUEQEBAQEBAQEAAAAAAAAAAAAAARESAjEh/9oADAMBAAIRAxEAPwCgEPQcQAABAABACAAABAAAAA+wAUCA69rt45VKU2lFWrXjwJbn6smuQh3S2sVicoyjKUbyo+A2+3x5FFyd3qqq9yM9T6vNcINL/Ng0drk4Lm0U9eCJt9nDLGDeqsq1pSio/AncXms4hrvYYlKMW5c1aXXD+TILPUvxLLAgBpkABB6EANAae1xyjj9r11lplGv4/NGWekcs4NOLaa7DHqbGpcaunqpxxqMYSj2pUdf1dzm2Ouk1C0uWnnf6HLk3OTJaUm6Hz18ih01J6e4zzcxrqbrX3KlkjLGnq1aXD1+x5YJOOPEklR6qtpv3fAz47rLGOlSaRI7jJGKjGTSXcTi5i9TdbTc+tCqTTrzWdLOydreKPzx0Ld5k6635nOXz5xn1dACG2QAAehACoAAAQAAQAAAQigAAAgA9bCwBpCxLAEAgAAgAAgBFCAAAAB//2Q==\\\",\\\"compVals\\\":[\\\"es-drager-1756453564096-22\\\"],\\\"value\\\":\\\"1\\\"},{\\\"normalImgUrl\\\":\\\"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAEAAD/4QMyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA5LjEtYzAwMSA3OS4xNDYyODk5Nzc3LCAyMDIzLzA2LzI1LTIzOjU3OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuMiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1RTA4REI1RTc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1RTA4REI1Rjc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVFMDhEQjVDNzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVFMDhEQjVENzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAGBYWIhgiNyAgN0IvKi9CQDU0NDVARkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgEaIiIsJiw1ISE1RjUsNUZGRjs7RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG/8AAEQgARgCSAwEiAAIRAQMRAf/EAG0AAQADAQEBAAAAAAAAAAAAAAABAgUGBAMBAQAAAAAAAAAAAAAAAAAAAAAQAAIBAgQDBgMJAAAAAAAAAAABAhEDIVESBDFBYXGRIjITBfBiFIGh0fFCUpKiUxEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A59kFpFQAAAAAAAAAAAAAAASAAAAAAAABMipaRUAAaOz2UNyquUk8cNLph1AzgbF32+007kHOMW6KOht/jQ+dn22V6zGSVJSlx+WmGHaBlg2bex2/papTTxa1KuVeHTj2Hk2m09Sdtz8lxy4dAPCDQls9UbSt+aak3X5S+w2cL3iutUdVGNcW/j4oBmA1N1srW3t6nKSk/LGVKvu5EbfYRu2Hcco1qqeLhmn1fIDNBr3NjbtNpW7s6c8Eu+h8IbFz26uNUbl5soU494GeDWue3W/SUoTTajKT4+KmWVOBkgAAAAAEyKlpFQBpu9Pb7S3obi5yk8MlgZheVyU0lJ1UVRAff67cfvl3mt7fGMbcayVYuVynTTTxZHPlozlFNJ0UuIHUy9SVppUlNxioyWbWmUl0VeJ4PbU1S3OL8M9UXTDg08eBkrcXYyU1J6kqJ15ZEx3V6C0xnJJck2BsS1W7EaRk5uE4qieGqWNcsOBHtt1ygraUo080oxjSnWT/ADMr6y//AKS/kyj3FyUPTcnpXIDdW7jcVzQ5SUYylSaTjh/bErsLkXZ0W1V1jrrnJ0fcqGM91dlD0nJ6MitrcXLKahJxrl0A6OUpzhO4lLVH1FBL9S5Spzpy+48G3ttbdRlRyctcYPHUtNKUXXu5mX9RdclPU9UcE8isLs4S1xbUs+0Dorl1Ri4WYxlctqko05Pzaft4o5turqWhclblri2pLmUbriwAAAAACZFS0ioAAAAAAAJAAAAAAAAAAAAAAAAAllQAAAAAACQAAAAAAAAAAAAAAAAAB//Z\\\",\\\"activeImgUrl\\\":\\\"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAEAAD/4QMyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA5LjEtYzAwMSA3OS4xNDYyODk5Nzc3LCAyMDIzLzA2LzI1LTIzOjU3OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuMiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1RTAzNTY5Njc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1RTAzNTY5Nzc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVFMDM1Njk0NzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVFMDM1Njk1NzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAGBYWIhgiNyAgN0IvKi9CQDU0NDVARkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgEaIiIsJiw1ISE1RjUsNUZGRjs7RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG/8AAEQgARgCSAwEiAAIRAQMRAf/EAHQAAQADAQEAAAAAAAAAAAAAAAABBAUCAwEBAQEBAQAAAAAAAAAAAAAAAAECBAUQAAICAQMCAwYGAwAAAAAAAAABEQIDIRIEMVFhcZFBgcEiUhOhsdHxMhThYnIRAQEBAQEBAQAAAAAAAAAAAAABERICITH/2gAMAwEAAhEDEQA/AJAB6DiCAAABAAAAACCAAAABAAAACAAAACvUgAqABc43FrmUttP/AJ09SW59qyapA0snDxxvq7JexbWcYuC8uOtlo2+vhH6me41zVAGlTi4fty7Tq1uU9vh1K/H4++1Hf+N5/AdROaqAuW425UVP5WVp9x1w+NTL82RqNUqzq2OpmnN/FEF/kcXHhpubas+lXHwIw8RZMTu2p0jXp3nx7DqZq83cUAaeTiUxtpUyXjyj8jxpxHbCskQ93X/WOpOoc1SINK/Cp9tWpZNqtrPxjt+Rmlll/EswABUAQAPUAg0gXnkth49Nradm2UTq13ZJNzGiM2a1Lj1/tZvrfqaHDVVSs2U1bvHhEa9jIJVnVNJ6PqT152ZPiz1lb9t9scKLWaUPxejt5KSpwZUUsnpaU406NPUzVmyJ7lZylHuJrnyVUKzS8zHFzGuputK00wr5bO+21Vp3ev8Agjg5N1FRK1Y62SrHvb/cz/7OX67erOHmu67HZ7ew4uYnX1rrk1vv2OzVU7fMk6/rqc8TIni20UuVu87PX0RmPkZHT7bs9vY5x5r49KOJHHxe/rcdr3ra6Tmu9VX1ePu/Yp4KNYEnEu26tHruW2Ijz9PaZ/38m5W3Oa9DmuS1Lbqtp9xPFh0275EqumKtbXootWPY+sfEwW5Z1XJalt1XD7nLcmvPnGfV0IANMgAA9AAaQAIIAAAAEAAAAIAAAAihAAAAgAAAPbQjQA0hoAABABAAAEAAAQAAIAIoAAIAAAAAf//Z\\\",\\\"compVals\\\":[\\\"es-drager-1762421939532-37\\\"],\\\"value\\\":\\\"2\\\"},{\\\"normalImgUrl\\\":\\\"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAEAAD/4QMyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA5LjEtYzAwMSA3OS4xNDYyODk5Nzc3LCAyMDIzLzA2LzI1LTIzOjU3OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuMiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1RTAzNTY5QTc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1RTAzNTY5Qjc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVFMDM1Njk4NzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVFMDM1Njk5NzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAGBYWIhgiNyAgN0IvKi9CQDU0NDVARkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgEaIiIsJiw1ISE1RjUsNUZGRjs7RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG/8AAEQgARgCSAwEiAAIRAQMRAf/EAHIAAQADAQEBAAAAAAAAAAAAAAABAgUDBgQBAQEBAAAAAAAAAAAAAAAAAAACARAAAgEDAgMEBgsBAAAAAAAAAAECEQMEIRIxQVFhkTIT8HGBIhQFobHR8UJSYpLS4lMVEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwDz4AAAAAAAAAAAAAAABIAAAAAgSgJoCwKY5AAloAaGHhQyFVyaeum3TTtAzwbF35faadyDnGLdFHY2/toRiYFq/bjOW5NunH+rAyAbP/KUlPa1Wq2VfRtOunOmh8mLieZO25+C45cOwD4QaEsPdG2rfimpN1/SWwMOF73rrVHVRjXVv09KAZpJp5OFasW9zlJSfhjKlX3ciMfAjdsO45RrVU97h1T7XyAzQa9zBt2m0oXZ09VO+hwhguWOrjVG5cekKce8DPBq3Pl9vylKE02oyk+PvU6dKcDKAEoglAXABSXIAEqDTd2ePi29jcXKUnp0WhmF5XJTSUnVRVEB3+Ov/nl3m1gNRx46paSbq31a69dp5s+i3lXbdNsqbVRe11+sD0tudZzjGGsGlVvR+J9O0zfljdFCUZaT3RdHTwtPX01M15t9uu+XeVWVeiqKckvWwNeW63YjSMnNwnFUT0rLWvTTgR8uuuUFbSlGnilGMaU7W/vMr4y//pL9zKvIuSh5bk9q5Abiy43Fc2OUlGMpUmk4/wAtSuDci7Oy2qusd9esnR9yoY7yrsoeW5PZ0K2si5ZTUJONegHo5SnOE7iT3R8xQS/EuTpzpy+g+DHttY6jKm5y3xg9dy20pRdvdzMv4i45Ke57o6J9CsLs4S3xbUuvrA9DcuqMXCzGMrltUlGnJ+Lb7eKPON1dS0Lkrct8W1JcyjddWAJRBKAuACkuQAJUAAAAABIAAAAAAAAAAAACUQSgLgApLkACVAAAEgAAAAAAAAAAAAAAAlAAXABTH//Z\\\",\\\"activeImgUrl\\\":\\\"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAEAAD/4QMyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA5LjEtYzAwMSA3OS4xNDYyODk5Nzc3LCAyMDIzLzA2LzI1LTIzOjU3OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuMiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1RTA4REI2Mjc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1RTA5ODhBMDc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVFMDhEQjYwNzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVFMDhEQjYxNzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAGBYWIhgiNyAgN0IvKi9CQDU0NDVARkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgEaIiIsJiw1ISE1RjUsNUZGRjs7RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG/8AAEQgARgCSAwEiAAIRAQMRAf/EAHYAAQADAQEAAAAAAAAAAAAAAAABBAUCAwEBAQEBAQAAAAAAAAAAAAAAAAECBAUQAAIBAwIDBAgHAAAAAAAAAAABAhESAyEEMVGRQWFxIoGxwfEyUhMUodHhYnLiFREBAQEBAQEBAAAAAAAAAAAAAAEREgIhMf/aAAwDAQACEQMRAD8AkAHoOIIAAAEAAAAAIIAAAAEAAAAIAAAAK9SACoAFzbbWOZVbaf8AHTqS3PtWTVIGlk2eOl8XJLsVrI2+0x5YKTrV6cf6sx3M1rms4Gn/AJ6kpWtVr5avxrXTtpoVtvt75Qc/hnX8C9Q5qoC5LbXKCh8UlKte462e2hl82RqmqUa6tjqZqc38UQX9xtceGFzbUnwi6ewjDs1kxObarpTXhzr38idTNXm7igDTybSGNtKGSdPCnqPGG0csKyUo7uP7acR1DmqRBpT2UPpqUJJtKUn305eozSyy/iWYAAqAIAHqAQaQLzySw7eFracm2UTqU3JJN1pojNmtS49fus3zvqam0ajhjqlxbr4vv8DEPWG4yQpa6U0XWpn152ZF8+sv1uwlWUko6xa9PFlHYN0UZJ6Sui6acGnqUXusr1vfU5W4yrRSl1McXLGu5rSlWGFeWTnbKK05vX9CNjkugoJSjTjJKNPS37zP+5y/PLqzh5puNjk7eReLmJ19a63MZ32OTUU5eZJx/PU52mRPFbBVdVd4yevRGY9xkcPpuTt5HOPNPHpB0qOPi9/W45TnGU0nWN6ivm7/AEe4p4INYEnSrldGD1uVtKU8enaZ/wBfJcpXOseBzHJKErotp8xPFh0255EouGKMZTgqSjTsfG32mC3VnUMkoSui6Pmct1NefOM+roQAaZAAB6AA0gAQQAAAAIAAAAQAAABFCAAABAAAAe2hGgBpDQAEAgAAAAIAAAgAAACKgAAQAAAAA//Z\\\",\\\"compVals\\\":[\\\"es-drager-1756456982092-28\\\"],\\\"value\\\":\\\"3\\\"},{\\\"normalImgUrl\\\":\\\"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAEAAD/4QMyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA5LjEtYzAwMSA3OS4xNDYyODk5Nzc3LCAyMDIzLzA2LzI1LTIzOjU3OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuMiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1RTA0N0Y5Rjc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1RTA0N0ZBMDc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVFMDQ3RjlENzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVFMDQ3RjlFNzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAGBYWIhgiNyAgN0IvKi9CQDU0NDVARkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgEaIiIsJiw1ISE1RjUsNUZGRjs7RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG/8AAEQgARgCSAwEiAAIRAQMRAf/EAG0AAQADAQEBAAAAAAAAAAAAAAABAgUEBgMBAQAAAAAAAAAAAAAAAAAAAAAQAAIBAgMEBwgDAAAAAAAAAAABAhEDIRIEMUFRIvBhcYGRMhOhsdHxQpIUBcFS0hEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AwmQWZUAAAAAAAAAAAABIAAAAAAAAAAASypZlQABo2NLauWfUk5RlXLtWV/JbQM4G8/1liUFlk60k61WNPh1d5mw0ue1Wks9eXDll2MDjBrT0Npu5btZnctpb1R+zcc+m0jnO36nkm5L7QOEHfLR5o21b801JuvUX0Gjhe5rjVHVRjXFvp0oBnA0tTorVi3mcpKT8sZU/jcRY0Mbll3HKNaqnNs4p9b3AZwNa5ordptKF2dOynuPjDQuVhXGqNy28IU2+IGeDUn+vh6SlCabUZSe3mpw9xlgAAAAAEsqWZUAeg0Df41eaibVMeKxVMeOzrPPn1V64kkpNZdlHsA9LdvQdtJt8ykvr+FfHuMzSepPTyafkkmszwwxocS1t9fXLxPlC/ctusZNY17wN+ay2pXo20qxwShzqT216lt6Y8v6xtpRkpYTzRdHTytPHpiZcdTdjP1FJ5uNSVqr0VRTkl2sDWlmt2FSMnNxlFUTwrLHsw2EfrrrlBQSlGnmlGMad7fzMv8u//eX3Mq79yUcjk8q3Aba1UbiuZHKSinKk0nH/AFiV0NyLs5YKrrHPXjJ4+CMd6q7KHpuTy8CLd+5aTUG414AehlKc4Tmk80c6gl9S3Om+m72HDp7bWnUZUzOWeMHjmWWlKLr8N5mfkXHJTzOscEysLs4SzxbUuPaB6C5dSi4WoxlO2qSjTc/Nl79qPOt1dS0Lkrcs8XSXEo3XFgAAAAAEsqWZUAAAABIAAAAAAAAAAAAAAAAAAASyoAAAASAAAAAAAAAAAAAAAAAAAAA//9k=\\\",\\\"activeImgUrl\\\":\\\"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAEAAD/4QMyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA5LjEtYzAwMSA3OS4xNDYyODk5Nzc3LCAyMDIzLzA2LzI1LTIzOjU3OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuMiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1RTA0N0Y5Qjc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1RTA0N0Y5Qzc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVFMDM1NjlDNzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVFMDQ3RjlBNzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAGBYWIhgiNyAgN0IvKi9CQDU0NDVARkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgEaIiIsJiw1ISE1RjUsNUZGRjs7RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG/8AAEQgARgCSAwEiAAIRAQMRAf/EAHUAAQADAQEAAAAAAAAAAAAAAAABBAUCAwEBAQEBAQAAAAAAAAAAAAAAAAECBAUQAAIBAwIDBAkFAAAAAAAAAAABAhESAyEEMVGRQYEiMvBhcbHB0fFSE6HhQmIUEQEBAQEBAQEAAAAAAAAAAAAAARESAiEx/9oADAMBAAIRAxEAPwCQAeg4ggAAAQAAAAAggAAAAQAAAAgAAAAr1IAKgAXcW3xzxXyqnWnZT0oS3Fk1RBrvYYnFWt1o9ar06FGOC7HWkr6+HTSRme5Wr5sVgaMtpjbnDHc5wXNa/oeGDbXThf5ZtroOonNVAXJba5QUPNJSr3HWz20MviyNU1SjXVsdTNOb+KIL+42uPDC5tqT4RdPgRh2iyYnNtV0prw519fInUzV5u4oA08m0hjbShknT2U9x4w2jlhWSlHdx/rTiOoc1SINKeyh+NShJNqMpP105e4zSyy/iWYAAqAIAHqAQaQNnZ1/BXWnCnfxVNTGO1lmqJSapw1Mepsa83G9kyxcEm+Nfu+Vepn7e+WCTT8kk1Xhp2FVbvMv5s84ZZwdYtrWveYniyN31tbMlbjeRQSrHRKPiT+RX2DbSjJPzXRdNODT1M9Z8kZXqTu5hbjKtFKXUcXMOputKVYYV4ZOdsorTm9f2I2OS6CglKNOMko072/qZ/wDpy/fLqzh5puNjk7eQ4+YnX1rrcxnfY5NRTl4knH56nO0yJ4rYKrqrvbJ69EZj3GRw/G5O3kc4808ekHSo4+L39bjlOcZTSdY3qK+71930KeCDWBJ0q5XRg9blbSlPb07TP/PkuUrnWPA5jklCV0W1LmJ4sOm3PIlFwxRjKcFSUadj42/EwW6s6hklCV0XR8zluprz5xn1dCADTIAAPQAGkACCAAAABAAAACAAAAIoQAAAIAkEAD20I0ANIaAAgEAAAABAAAEAAAARUAAAQAAAAH//2Q==\\\",\\\"compVals\\\":[\\\"es-drager-1762481722941-1\\\"],\\\"value\\\":\\\"4\\\"},{\\\"normalImgUrl\\\":\\\"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAEAAD/4QMyaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA5LjEtYzAwMSA3OS4xNDYyODk5Nzc3LCAyMDIzLzA2LzI1LTIzOjU3OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuMiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1RTA5ODhBMzc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1RTA5ODhBNDc1QjIxMUYwODEyNDhEMEUwRjNFMkIzOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVFMDk4OEExNzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVFMDk4OEEyNzVCMjExRjA4MTI0OEQwRTBGM0UyQjM4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAGBYWIhgiNyAgN0IvKi9CQDU0NDVARkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgEaIiIsJiw1ISE1RjUsNUZGRjs7RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZG/8AAEQgARgCSAwEiAAIRAQMRAf/EAHAAAQADAQEBAAAAAAAAAAAAAAABAgUDBAYBAQEBAAAAAAAAAAAAAAAAAAACARAAAgECAwUGBQQDAAAAAAAAAAECEQMhEgQxQVFhMvBxkaEiE7FCUmIFgfGSFKLSIxEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8AwAAAAAAAAAAAAAAAkAAAAAABAlATQFgUxyABLQA99uxYdn3ZOdU6NKm0DwA1Hp9MrSvP3MrdF0+OzZuKWtCrmnc0051wVf8AGn1PcBnA1p6Gy3ct2szuW0t6o/LcefS6TPO3n6JuSw5AeEHvlo80bat9U1Juv2l9Bo4XvVdao6qMa4t9u1AM4GlqdFasW8zlJSfTGVK+W4afQxuWXcco1qqerZxT5vcBmg17mit2m0oXZ07qfA4Q0Llp1cao3LbwhTb4gZ4NW5+Ph7SlCabUZSe31U4fAygBKIJQFwAUlyABKg29PNw0uW7NRi9iwrk+ZLm/IxABvPWx9lScf+Tk4Zftp8TlZvRs6ZytRxzLqxq+Rku5Jw9uvpTrTmdI6m7FRipNKDrEDenHLblejbSrHBKHrUntryW3tj5PxjbUYyUsJ5oujp0tPHtiZi1N1T9zM83GvbwC1V6KopyS72BryzW7EaRk5uMoqieFZY92Gwj8ddcoKCUo06pRjGlObf7mV/cv/XL+TKvUXJQ9tyeVbgNxauNxXMjlJRUpUmk4/wC2JTQ3IuzktqrrHPXjJ4+CoZD1V2UPbcnk4Fbd+5aTUJONeAH0UpTnCc0nmjnUEvmW50303eR4NPba06jKmZyzxg8cyy0pRc/DeZn9i45KeZ5o4JlYXZwlni2pce8D6G5dSi4Woxlctqko03Pqy/rtR843V1LQuStyzxdJcSjdcWAJRBKAuACkuQAJUAAAASAAAAAAAAAAAAAACUQSgLgApLkACVAAAkAAAAAAAAAAAAAAAAlAAXABTH//2Q==\\\",\\\"activeImgUrl\\\":\\\"drag/lib/img/navItem05_hover.jpg\\\",\\\"compVals\\\":[\\\"es-drager-1762494714798-7\\\"],\\\"value\\\":\\\"5\\\"},{\\\"marginRight\\\":0,\\\"normalBackgroundImage\\\":\\\"\\\",\\\"marginBottom\\\":0,\\\"compVals\\\":[\\\"es-drager-1756453915928-25\\\"],\\\"activeBackgroundImage\\\":\\\"\\\",\\\"value\\\":\\\"6\\\",\\\"showHideComps\\\":[],\\\"marginTop\\\":0,\\\"marginLeft\\\":0}],\\\"currentValue\\\":\\\"1\\\"}}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` (`id`, `parent_id`, `page_id`, `comp_id`, `component`, `config`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1151112776882114560', NULL, '1151069555267260416', NULL, 'JGroup', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\"}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` (`id`, `parent_id`, `page_id`, `comp_id`, `component`, `config`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1151112776903086080', NULL, '1151069555267260416', NULL, 'JGroup', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\"}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` (`id`, `parent_id`, `page_id`, `comp_id`, `component`, `config`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1151112776924057600', NULL, '1151069555267260416', NULL, 'JGroup', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\"}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` (`id`, `parent_id`, `page_id`, `comp_id`, `component`, `config`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1151112776945029120', NULL, '1151069555267260416', NULL, 'JGroup', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1701,\\\"height\\\":892.5},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\"}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` (`id`, `parent_id`, `page_id`, `comp_id`, `component`, `config`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1151112776961806336', NULL, '1151069555267260416', NULL, 'JGroup', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1863.9707102873572,\\\"height\\\":954.8876076075659},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\"}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` (`id`, `parent_id`, `page_id`, `comp_id`, `component`, `config`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1151112776978583552', NULL, '1151069555267260416', NULL, 'JGroup', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\"}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` (`id`, `parent_id`, `page_id`, `comp_id`, `component`, `config`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1151112777012137984', NULL, '1151069555267260416', NULL, 'JGroup', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1858.2777764077778,\\\"height\\\":964.8264952628838},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\"}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` (`id`, `parent_id`, `page_id`, `comp_id`, `component`, `config`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1151112777028915200', NULL, '1151069555267260416', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":45.833333333333314,\\\"height\\\":45.833333333333314},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/标题组件-20_05_1756436293567.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` (`id`, `parent_id`, `page_id`, `comp_id`, `component`, `config`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1151112777045692416', NULL, '1151069555267260416', NULL, 'JCurrentTime', '{\\\"chartData\\\":\\\"\\\",\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":309.1666666666667,\\\"height\\\":33},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":280,\\\"dataType\\\":1,\\\"h\\\":33,\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"hourlySystem\\\":\\\"24\\\",\\\"format\\\":\\\"YYYY-MM-DD hh:mm:ss\\\",\\\"body\\\":{\\\"color\\\":\\\"#FFFFFF\\\",\\\"letterSpacing\\\":0,\\\"text\\\":\\\"\\\",\\\"fontWeight\\\":\\\"normal\\\",\\\"marginTop\\\":0,\\\"marginLeft\\\":0},\\\"showWeek\\\":\\\"show\\\",\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"}}}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` (`id`, `parent_id`, `page_id`, `comp_id`, `component`, `config`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1151112777075052544', NULL, '1151069555267260416', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":1911.6666666666667,\\\"height\\\":70},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/title_1756435933097.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\nINSERT INTO `onl_drag_page_comp` (`id`, `parent_id`, `page_id`, `comp_id`, `component`, `config`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES ('1151112777112801280', NULL, '1151069555267260416', NULL, 'JImg', '{\\\"borderColor\\\":\\\"#FFFFFF00\\\",\\\"size\\\":{\\\"width\\\":679,\\\"height\\\":46.72222222222222},\\\"actionConfig\\\":{\\\"operateType\\\":\\\"modal\\\",\\\"modalName\\\":\\\"\\\",\\\"url\\\":\\\"\\\"},\\\"background\\\":\\\"#FFFFFF00\\\",\\\"w\\\":450,\\\"dataType\\\":1,\\\"h\\\":300,\\\"linesConfig\\\":{\\\"connectLine\\\":[]},\\\"url\\\":\\\"http://api.jeecg.com/mock/42/nav\\\",\\\"timeOut\\\":0,\\\"option\\\":{\\\"padding\\\":0,\\\"backgroundColor\\\":\\\"#FFFFFF00\\\",\\\"borderRadius\\\":0,\\\"rotateTime\\\":1000,\\\"opacity\\\":1,\\\"body\\\":{\\\"url\\\":\\\"https://jeecgdev.oss-cn-beijing.aliyuncs.com/jimureport/images/导航背景_1756451547138.png\\\"},\\\"card\\\":{\\\"rightHref\\\":\\\"\\\",\\\"size\\\":\\\"default\\\",\\\"extra\\\":\\\"\\\",\\\"title\\\":\\\"\\\"},\\\"izRotate\\\":false}}', 'admin', '2025-11-19 21:18:03', NULL, NULL);\n\n\n-- -author:chenrui---date:2025-11-20-----for:[QQYUN-14043]【AI流程】工具节点 - 直接调用api插件工具，不使用LLM---\nINSERT INTO `airag_flow` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `application_name`, `name`, `descr`, `icon`, `chain`, `design`, `status`, `metadata`) VALUES ('1991101089171214338', 'admin', '2025-11-19 19:07:47', 'admin', '2025-11-20 15:04:46', 'A05A01A01', NULL, 'jeecg', '示例_工具节点', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    tools.tag(\\'254198464640012288\\'),\\n    end.tag(\\'254201908310396928\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":418,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"254198464640012288\\\",\\\"type\\\":\\\"tools\\\",\\\"x\\\":768,\\\"y\\\":451,\\\"properties\\\":{\\\"text\\\":\\\"工具调用\\\",\\\"options\\\":{\\\"tools\\\":{\\\"pluginId\\\":\\\"1983851685196451842\\\",\\\"pluginName\\\":\\\"会议管理\\\",\\\"pluginCategory\\\":\\\"plugin\\\",\\\"toolName\\\":\\\"meetingRoomQuery\\\",\\\"toolDescr\\\":\\\"查询会议室（会议地点）列表\\\",\\\"toolParameters\\\":[{\\\"name\\\":\\\"pageNo\\\",\\\"description\\\":\\\"页码数\\\",\\\"required\\\":true,\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"value\\\":\\\"1\\\"},{\\\"name\\\":\\\"pageSize\\\",\\\"description\\\":\\\"每页数量\\\",\\\"required\\\":true,\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"value\\\":\\\"10\\\"},{\\\"name\\\":\\\"name\\\",\\\"description\\\":\\\"会议室名称，可以使用*来模糊查询比如（*123*）\\\",\\\"required\\\":false,\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"value\\\":\\\"\\\"}],\\\"endpoint\\\":\\\"http://localhost:8080/jeecgboot\\\",\\\"path\\\":\\\"/eoa/metting/eoaMettingRoom/list\\\",\\\"method\\\":\\\"GET\\\",\\\"headers\\\":{\\\"12222\\\":\\\"123\\\"}}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"执行结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":158,\\\"width\\\":332}},{\\\"id\\\":\\\"254201908310396928\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1272,\\\"y\\\":429,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"254198464640012288\\\"}],\\\"height\\\":114,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"254198464644206592\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"254198464640012288\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"254198464640012288_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":403},{\\\"x\\\":566,\\\"y\\\":403},{\\\"x\\\":502,\\\"y\\\":403},{\\\"x\\\":602,\\\"y\\\":403}]},{\\\"id\\\":\\\"254201908314591232\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"254198464640012288\\\",\\\"targetNodeId\\\":\\\"254201908310396928\\\",\\\"sourceAnchorId\\\":\\\"254198464640012288_output\\\",\\\"targetAnchorId\\\":\\\"254201908310396928_input\\\",\\\"pointsList\\\":[{\\\"x\\\":934,\\\"y\\\":403},{\\\"x\\\":1034,\\\"y\\\":403},{\\\"x\\\":1006,\\\"y\\\":403},{\\\"x\\\":1106,\\\"y\\\":403}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"254198464640012288\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"}]}');\n\nUPDATE onl_drag_page  set type ='0', tenant_id = 0 WHERE id = '1151069555267260416';"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.0_1__mcp_demo.sql",
    "content": "-- MCP和插件初始化数据 ----\n-- MCP 和 插件\nINSERT INTO `airag_mcp` (`id`, `icon`, `name`, `descr`, `category`, `type`, `endpoint`, `headers`, `tools`, `status`, `synced`, `metadata`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`) VALUES ('1983474860536475649', NULL, '高德MCP', '高德MCP，包含查询路线、路况、天气等工具', 'mcp', 'sse', 'https://mcp.amap.com/sse?key=???', '', '[{\\\"name\\\":\\\"maps_direction_bicycling\\\",\\\"description\\\":\\\"骑行路径规划用于规划骑行通勤方案，规划时会考虑天桥、单行线、封路等情况。最大支持 500km 的骑行路线规划\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"origin\\\",\\\"description\\\":\\\"出发点经纬度，坐标格式为：经度，纬度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"destination\\\",\\\"description\\\":\\\"目的地经纬度，坐标格式为：经度，纬度\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_direction_driving\\\",\\\"description\\\":\\\"驾车路径规划 API 可以根据用户起终点经纬度坐标规划以小客车、轿车通勤出行的方案，并且返回通勤方案的数据。\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"origin\\\",\\\"description\\\":\\\"出发点经纬度，坐标格式为：经度，纬度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"destination\\\",\\\"description\\\":\\\"目的地经纬度，坐标格式为：经度，纬度\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_direction_transit_integrated\\\",\\\"description\\\":\\\"根据用户起终点经纬度坐标规划综合各类公共（火车、公交、地铁）交通方式的通勤方案，并且返回通勤方案的数据，跨城场景下必须传起点城市与终点城市\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"origin\\\",\\\"description\\\":\\\"出发点经纬度，坐标格式为：经度，纬度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"destination\\\",\\\"description\\\":\\\"目的地经纬度，坐标格式为：经度，纬度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"city\\\",\\\"description\\\":\\\"公共交通规划起点城市\\\",\\\"required\\\":true},{\\\"name\\\":\\\"cityd\\\",\\\"description\\\":\\\"公共交通规划终点城市\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_direction_walking\\\",\\\"description\\\":\\\"根据输入起点终点经纬度坐标规划100km 以内的步行通勤方案，并且返回通勤方案的数据\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"origin\\\",\\\"description\\\":\\\"出发点经度，纬度，坐标格式为：经度，纬度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"destination\\\",\\\"description\\\":\\\"目的地经度，纬度，坐标格式为：经度，纬度\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_distance\\\",\\\"description\\\":\\\"测量两个经纬度坐标之间的距离,支持驾车、步行以及球面距离测量\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"origins\\\",\\\"description\\\":\\\"起点经度，纬度，可以传多个坐标，使用竖线隔离，比如120,30|120,31，坐标格式为：经度，纬度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"destination\\\",\\\"description\\\":\\\"终点经度，纬度，坐标格式为：经度，纬度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"type\\\",\\\"description\\\":\\\"距离测量类型,1代表驾车距离测量，0代表直线距离测量，3步行距离测量\\\"}]},{\\\"name\\\":\\\"maps_geo\\\",\\\"description\\\":\\\"将详细的结构化地址转换为经纬度坐标。支持对地标性名胜景区、建筑物名称解析为经纬度坐标\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"address\\\",\\\"description\\\":\\\"待解析的结构化地址信息\\\",\\\"required\\\":true},{\\\"name\\\":\\\"city\\\",\\\"description\\\":\\\"指定查询的城市\\\"}]},{\\\"name\\\":\\\"maps_regeocode\\\",\\\"description\\\":\\\"将一个高德经纬度坐标转换为行政区划地址信息\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"location\\\",\\\"description\\\":\\\"经纬度\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_ip_location\\\",\\\"description\\\":\\\"IP 定位根据用户输入的 IP 地址，定位 IP 的所在位置\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"ip\\\",\\\"description\\\":\\\"IP地址\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_schema_personal_map\\\",\\\"description\\\":\\\"用于行程规划结果在高德地图展示。将行程规划位置点按照行程顺序填入lineList，返回结果为高德地图打开的URI链接，该结果不需总结，直接返回！\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"orgName\\\",\\\"description\\\":\\\"行程规划地图小程序名称\\\",\\\"required\\\":true},{\\\"name\\\":\\\"lineList\\\",\\\"description\\\":\\\"行程列表\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_around_search\\\",\\\"description\\\":\\\"周边搜，根据用户传入关键词以及坐标location，搜索出radius半径范围的POI\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"keywords\\\",\\\"description\\\":\\\"搜索关键词\\\",\\\"required\\\":true},{\\\"name\\\":\\\"location\\\",\\\"description\\\":\\\"中心点经度纬度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"radius\\\",\\\"description\\\":\\\"搜索半径\\\"}]},{\\\"name\\\":\\\"maps_search_detail\\\",\\\"description\\\":\\\"查询关键词搜或者周边搜获取到的POI ID的详细信息\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"id\\\",\\\"description\\\":\\\"关键词搜或者周边搜获取到的POI ID\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_text_search\\\",\\\"description\\\":\\\"关键字搜索 API 根据用户输入的关键字进行 POI 搜索，并返回相关的信息\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"keywords\\\",\\\"description\\\":\\\"查询关键字\\\",\\\"required\\\":true},{\\\"name\\\":\\\"city\\\",\\\"description\\\":\\\"查询城市\\\"},{\\\"name\\\":\\\"citylimit\\\",\\\"description\\\":\\\"是否限制城市范围内搜索，默认不限制\\\"}]},{\\\"name\\\":\\\"maps_schema_navi\\\",\\\"description\\\":\\\" Schema唤醒客户端-导航页面，用于根据用户输入终点信息，返回一个拼装好的客户端唤醒URI，用户点击该URI即可唤起对应的客户端APP。唤起客户端后，会自动跳转到导航页面。\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"lon\\\",\\\"description\\\":\\\"终点经度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"lat\\\",\\\"description\\\":\\\"终点纬度\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_schema_take_taxi\\\",\\\"description\\\":\\\"根据用户输入的起点和终点信息，返回一个拼装好的客户端唤醒URI，直接唤起高德地图进行打车。直接展示生成的链接，不需要总结\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"slon\\\",\\\"description\\\":\\\"起点经度\\\"},{\\\"name\\\":\\\"slat\\\",\\\"description\\\":\\\"起点纬度\\\"},{\\\"name\\\":\\\"sname\\\",\\\"description\\\":\\\"起点名称\\\"},{\\\"name\\\":\\\"dlon\\\",\\\"description\\\":\\\"终点经度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"dlat\\\",\\\"description\\\":\\\"终点纬度\\\",\\\"required\\\":true},{\\\"name\\\":\\\"dname\\\",\\\"description\\\":\\\"终点名称\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"maps_weather\\\",\\\"description\\\":\\\"根据城市名称或者标准adcode查询指定城市的天气\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"city\\\",\\\"description\\\":\\\"城市名称或者adcode\\\",\\\"required\\\":true}]}]', 'enable', 1, '{\\\"tool_count\\\":15}', 'admin', '2025-10-29 18:03:53', 'admin', '2025-11-13 17:15:48', 'A04', NULL);\nINSERT INTO `airag_mcp` (`id`, `icon`, `name`, `descr`, `category`, `type`, `endpoint`, `headers`, `tools`, `status`, `synced`, `metadata`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`) VALUES ('1986312214909321217', NULL, '商品采购助手', '为AI Agent提供商品管理API（DEMO)', 'plugin', 'api', NULL, '', '[{\\\"name\\\":\\\"list_products\\\",\\\"description\\\":\\\"查询可购买的商品列表,支持按分类和关键词筛选；商品的id只能通过这个接口查询。\\\",\\\"path\\\":\\\"/demo/shop/products\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"category\\\",\\\"description\\\":\\\"商品分类,可选值: \\\\\\\"电子产品\\\\\\\", \\\\\\\"图书\\\\\\\", \\\\\\\"生活用品\\\\\\\", \\\\\\\"食品\\\\\\\"\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"},{\\\"name\\\":\\\"keyword\\\",\\\"description\\\":\\\"搜索关键词,用于在商品名称和描述中搜索\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"id\\\",\\\"description\\\":\\\"商品ID，对应下单的ProductId\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"name\\\",\\\"description\\\":\\\"商品名称\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"price\\\",\\\"description\\\":\\\"价格(元)\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"category\\\",\\\"description\\\":\\\"分类\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"description\\\",\\\"description\\\":\\\"描述\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"stock\\\",\\\"description\\\":\\\"库存数量\\\",\\\"type\\\":\\\"String\\\"}]},{\\\"name\\\":\\\"check_stock\\\",\\\"description\\\":\\\"查询指定商品的当前库存情况\\\",\\\"path\\\":\\\"/demo/shop/stock\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"productId\\\",\\\"description\\\":\\\"商品ID\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"productId\\\",\\\"description\\\":\\\"商品ID\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"productName\\\",\\\"description\\\":\\\"商品名称\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"stock\\\",\\\"description\\\":\\\"当前库存数量\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"available\\\",\\\"description\\\":\\\"是否有货\\\",\\\"type\\\":\\\"Boolean\\\"}]},{\\\"name\\\":\\\"create_order\\\",\\\"description\\\":\\\"为用户创建购买订单\\\",\\\"path\\\":\\\"/demo/shop/purchase\\\",\\\"method\\\":\\\"POST\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"productId\\\",\\\"description\\\":\\\"要购买的商品的ID，对应商品的信息的id\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"},{\\\"name\\\":\\\"quantity\\\",\\\"description\\\":\\\" 购买数量,必须大于0\\\",\\\"type\\\":\\\"Integer\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"},{\\\"name\\\":\\\"userId\\\",\\\"description\\\":\\\"用户ID,用于关联订单\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"id\\\",\\\"description\\\":\\\"订单ID\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"productId\\\",\\\"description\\\":\\\"商品ID\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"productName\\\",\\\"description\\\":\\\"商品名称\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"quantity\\\",\\\"description\\\":\\\"购买数量\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"unitPrice\\\",\\\"description\\\":\\\"单价\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"totalAmount\\\",\\\"description\\\":\\\"总金额\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"status\\\",\\\"description\\\":\\\"订单状态\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createTime\\\",\\\"description\\\":\\\"创建时间\\\",\\\"type\\\":\\\"String\\\"}]},{\\\"name\\\":\\\"confirm_payment\\\",\\\"description\\\":\\\"确认订单支付,扣减商品库存\\\",\\\"path\\\":\\\"/demo/shop/stock/deduct\\\",\\\"method\\\":\\\"POST\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"orderId\\\",\\\"description\\\":\\\"订单ID\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"orderId\\\",\\\"description\\\":\\\"订单ID\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"productId\\\",\\\"description\\\":\\\"商品ID\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"productName\\\",\\\"description\\\":\\\"商品名称\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"deductedQuantity\\\",\\\"description\\\":\\\"扣减的数量\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"remainingStock\\\",\\\"description\\\":\\\"剩余库存\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"orderStatus\\\",\\\"description\\\":\\\"订单状态\\\",\\\"type\\\":\\\"String\\\"}]},{\\\"name\\\":\\\"get_order_details\\\",\\\"description\\\":\\\"查询指定订单的详细信息\\\",\\\"path\\\":\\\"/demo/shop/order\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"orderId\\\",\\\"description\\\":\\\"订单ID\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[]},{\\\"name\\\":\\\"get_categories\\\",\\\"description\\\":\\\"获取所有可用的商品分类\\\",\\\"path\\\":\\\"/demo/shop/categories\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[],\\\"responses\\\":[]}]', 'enable', 1, '{\\\"tokenParamName\\\":\\\"X-Access-Token\\\",\\\"tool_count\\\":6,\\\"authType\\\":\\\"token\\\",\\\"tokenParamValue\\\":\\\"\\\"}', 'admin', '2025-11-06 13:58:31', 'admin', '2025-11-13 17:16:57', 'A05A01A01', NULL);\nINSERT INTO `airag_mcp` (`id`, `icon`, `name`, `descr`, `category`, `type`, `endpoint`, `headers`, `tools`, `status`, `synced`, `metadata`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`) VALUES ('1988091188723412994', NULL, 'BraveSearch', '基于Brave的网络检索插件，支持使用Brave搜索资料', 'plugin', 'api', 'https://api.search.brave.com', '{\\\"Accept\\\":\\\"*/*\\\",\\\"X-Subscription-Token\\\":\\\"???\\\"}', '[{\\\"name\\\":\\\"search\\\",\\\"description\\\":\\\"从搜索引擎根据问题搜索结果\\\",\\\"path\\\":\\\"/res/v1/web/search\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"count\\\",\\\"description\\\":\\\"查询数量\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"10\\\"},{\\\"name\\\":\\\"q\\\",\\\"description\\\":\\\"查询内容（问题）\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"title\\\",\\\"description\\\":\\\"结果标题\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"description\\\",\\\"description\\\":\\\"结果描述\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"url\\\",\\\"description\\\":\\\"结果原文地址\\\",\\\"type\\\":\\\"String\\\"}]}]', 'enable', 1, '{\\\"tokenParamName\\\":\\\"X-Subscription-Token\\\",\\\"tool_count\\\":1,\\\"authType\\\":\\\"token\\\",\\\"tokenParamValue\\\":\\\"BSATNKM5e6Hm_2LewptVvLSn0eDzWf6\\\"}', 'admin', '2025-11-11 11:47:31', 'admin', '2025-11-13 17:16:52', 'A05A01A01', NULL);\nINSERT INTO `airag_mcp` (`id`, `icon`, `name`, `descr`, `category`, `type`, `endpoint`, `headers`, `tools`, `status`, `synced`, `metadata`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`) VALUES ('1988208474780168193', NULL, 'Unsplash', '图片搜索插件，支持用关键词搜索相关图片', 'plugin', 'api', 'https://api.unsplash.com', '{\\\"Accept-Version\\\":\\\"v1\\\",\\\"Authorization\\\":\\\"Client-ID ???\\\"}', '[{\\\"name\\\":\\\"search_photos\\\",\\\"description\\\":\\\"通过接口查询与关键词相关的图片列表。\\\",\\\"path\\\":\\\"/search/photos\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"page\\\",\\\"description\\\":\\\"分页页码，数字类型\\\",\\\"type\\\":\\\"Number\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"1\\\"},{\\\"name\\\":\\\"per_page\\\",\\\"description\\\":\\\"每页数量\\\",\\\"type\\\":\\\"Number\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"1\\\"},{\\\"name\\\":\\\"query\\\",\\\"description\\\":\\\"关键词，对图片的描述（查询条件）\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"results\\\",\\\"description\\\":\\\"查询到的结果集合\\\",\\\"type\\\":\\\"Array\\\"},{\\\"name\\\":\\\"urls\\\",\\\"description\\\":\\\"结果集合中的图片地址，根据清晰度有多个选项\\\",\\\"type\\\":\\\"Array\\\"}]}]', 'enable', 1, '{\\\"tokenParamName\\\":\\\"Authorization\\\",\\\"tool_count\\\":1,\\\"authType\\\":\\\"token\\\",\\\"tokenParamValue\\\":\\\"Client-ID Ixug6rX2j1PMb08A0HRpwny8dAWi1vBLN1gymow75LQ\\\"}', 'admin', '2025-11-11 19:33:34', 'admin', '2025-11-13 17:16:45', 'A05A01A01', NULL);\n\n-- AI Flow\nINSERT INTO `airag_flow` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `application_name`, `name`, `descr`, `icon`, `chain`, `design`, `status`, `metadata`) VALUES ('1988073273760501762', 'admin', '2025-11-11 10:36:20', 'admin', '2025-11-13 15:56:07', 'A05A01A01', NULL, 'jeecg', '软文生成器', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'251170889153376256\\'),\\n    llm.tag(\\'251190209648521216\\'),\\n    llm.tag(\\'251190922428542976\\'),\\n    llm.tag(\\'251246385341919232\\'),\\n    end.tag(\\'251191126401740800\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":332.8947368421053,\\\"y\\\":589.0526315789475,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"目的地\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"from\\\",\\\"name\\\":\\\"出发地\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"time\\\",\\\"name\\\":\\\"出发时间\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"peopleNum\\\",\\\"name\\\":\\\"人数\\\",\\\"type\\\":\\\"number\\\",\\\"required\\\":true}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"251170889153376256\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":685.9473684210526,\\\"y\\\":381.05263157894734,\\\"properties\\\":{\\\"text\\\":\\\"意图和需求分析\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色\\\\n你是自驾游攻略生成的需求分析师\\\\n\\\\n## 目标：\\\\n- 分析用户提供的主题信息，归纳整理出实际需求列表。\\\\n\\\\n## 技能：\\\\n1. 信息提取与分析能力\\\\n2. 旅游规划与建议能力\\\\n3. 数据查询与整合能力\\\\n\\\\n## 工作流：\\\\n1. 收集用户提供的主题信息并进行分类。\\\\n2. 确定用户的目标和需求，并归纳整理。\\\\n3. 列出需要查询的资料和天气、路况信息。\\\\n\\\\n## 输出格式：\\\\n- 列表形式，包含目标和需求、查询资料列表、天气和路况信息。\\\\n\\\\n## 限制：\\\\n- 不得提供未经过验证的信息。\\\\n- 所有数据需标注来源，不确定信息用[需核实]标记。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"出发地：{{from}}\\\\n目的地：{{userQuestion}}\\\\n计划时间：{{time}}\\\\n人数：{{peopleNum}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"userQuestion\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"from\\\",\\\"name\\\":\\\"from\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"time\\\",\\\"name\\\":\\\"time\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"peopleNum\\\",\\\"name\\\":\\\"peopleNum\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"251190209648521216\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":943.2631578947365,\\\"y\\\":632.0526315789475,\\\"properties\\\":{\\\"text\\\":\\\"资料查询\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":30,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"## 角色\\\\n\\\\n\\\\n你是一名 自驾游资料查询师（DataAgent），专注于为下游的“攻略生成Agent”提供精准、结构化的自驾游资料。\\\\n\\\\n\\\\n------\\\\n\\\\n\\\\n## 职责目标\\\\n 1. 根据输入内容（出发地、目的地、行程需求等），直接执行资料查询任务，不再向用户提问。\\\\n 2. 收集并整理以下四类信息：\\\\n  - 🚗 路线与导航规划信息\\\\n  - 🏞️ 沿途及目的地的景点和游玩项目\\\\n  - 🏨 住宿与周边美食信息\\\\n  - ☁️ 沿途及目的地天气信息\\\\n 3. 输出清晰、结构化的数据结果，供下一个Agent生成攻略使用。\\\\n\\\\n\\\\n------\\\\n\\\\n\\\\n## 能力与工具\\\\n\\\\n\\\\n- maps 工具\\\\n - 查询路线与导航规划信息（距离、时长、推荐路线、途经地）。\\\\n - 查询沿途及目的地的住宿与餐饮信息。\\\\n - 查询沿途及目的地的实时或近期天气信息。\\\\n\\\\n\\\\n- search 工具\\\\n - 查询沿途及目的地的景点、游玩项目、特色体验、门票及评价等。\\\\n\\\\n\\\\n------\\\\n\\\\n\\\\n## 工作流程\\\\n 1. 接收任务\\\\n  - 使用用户提供的现有信息（不提问、不二次确认）。\\\\n 2. 资料查询\\\\n  - 调用 maps 工具 获取路线、住宿、美食、天气。\\\\n  - 调用 search 工具 获取景点和游玩项目。\\\\n 3. 资料整理\\\\n  - 将查询结果按类型整理成结构化资料包。\\\\n  - 每条数据需注明来源（maps / search）。\\\\n 4. 结果输出\\\\n  - 输出格式清晰，便于下游Agent直接使用。\\\\n\\\\n\\\\n------\\\\n\\\\n\\\\n## 输出格式示例\\\\n\\\\n\\\\n```\\\\n{\\\\n  \\\\\\\"route_info\\\\\\\": [\\\\n    {\\\\n      \\\\\\\"from\\\\\\\": \\\\\\\"北京\\\\\\\",\\\\n      \\\\\\\"to\\\\\\\": \\\\\\\"张家口\\\\\\\",\\\\n      \\\\\\\"distance\\\\\\\": \\\\\\\"220km\\\\\\\",\\\\n      \\\\\\\"duration\\\\\\\": \\\\\\\"3小时\\\\\\\",\\\\n      \\\\\\\"route_detail\\\\\\\": \\\\\\\"经京藏高速G6\\\\\\\",\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"maps\\\\\\\"\\\\n    }\\\\n  ],\\\\n  \\\\\\\"sights\\\\\\\": [\\\\n    {\\\\n      \\\\\\\"name\\\\\\\": \\\\\\\"崇礼滑雪场\\\\\\\",\\\\n      \\\\\\\"tags\\\\\\\": [\\\\\\\"滑雪\\\\\\\", \\\\\\\"冬季运动\\\\\\\"],\\\\n      \\\\\\\"description\\\\\\\": \\\\\\\"亚洲知名滑雪胜地\\\\\\\",\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"search\\\\\\\"\\\\n    }\\\\n  ],\\\\n  \\\\\\\"hotels\\\\\\\": [\\\\n    {\\\\n      \\\\\\\"name\\\\\\\": \\\\\\\"张家口云顶假日酒店\\\\\\\",\\\\n      \\\\\\\"rating\\\\\\\": \\\\\\\"4.6\\\\\\\",\\\\n      \\\\\\\"address\\\\\\\": \\\\\\\"崇礼区奥运大道88号\\\\\\\",\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"maps\\\\\\\"\\\\n    }\\\\n  ],\\\\n  \\\\\\\"foods\\\\\\\": [\\\\n    {\\\\n      \\\\\\\"name\\\\\\\": \\\\\\\"张家口烧麦\\\\\\\",\\\\n      \\\\\\\"type\\\\\\\": \\\\\\\"地方特色\\\\\\\",\\\\n      \\\\\\\"recommendation\\\\\\\": \\\\\\\"崇礼老街美食街\\\\\\\",\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"maps\\\\\\\"\\\\n    }\\\\n  ],\\\\n  \\\\\\\"weather\\\\\\\": [\\\\n    {\\\\n      \\\\\\\"location\\\\\\\": \\\\\\\"崇礼\\\\\\\",\\\\n      \\\\\\\"condition\\\\\\\": \\\\\\\"晴\\\\\\\",\\\\n      \\\\\\\"temperature\\\\\\\": \\\\\\\"5°C~12°C\\\\\\\",\\\\n      \\\\\\\"wind\\\\\\\": \\\\\\\"微风\\\\\\\",\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"maps\\\\\\\"\\\\n    }\\\\n  ]\\\\n}\\\\n```\\\\n\\\\n\\\\n------\\\\n\\\\n\\\\n## 限制与规范\\\\n - 不生成行程攻略、总结或建议性文字。\\\\n - 不提问用户，只执行既定任务。\\\\n - 不包含任何虚构或未经验证的信息。\\\\n - 不涉及隐私、政治或违法内容。\\\\n - 不确定的数据需以 [需核实] 标识。\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"需求：{{demand}}\\\"}],\\\"plugins\\\":[{\\\"pluginId\\\":\\\"1983474860536475649\\\",\\\"pluginName\\\":\\\"高德\\\",\\\"category\\\":\\\"mcp\\\"},{\\\"pluginId\\\":\\\"1988091188723412994\\\",\\\"pluginName\\\":\\\"BraveSearch\\\",\\\"category\\\":\\\"mcp\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"demand\\\",\\\"nodeId\\\":\\\"251170889153376256\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"251190922428542976\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1225.0526315789468,\\\"y\\\":370.6842105263157,\\\"properties\\\":{\\\"text\\\":\\\"生成文章\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":15,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色定位：实地体验派自驾游攻略博主\\\\n\\\\n\\\\n你是一名热爱公路旅行、记录真实体验的自驾游达人博主。  \\\\n你的任务是为读者打造一份**能直接照着走的实地自驾游攻略**——兼顾实用性与可读性，让人看完就想出发。  \\\\n---\\\\n## 目标\\\\n1. 输出结构清晰、完整且可直接使用的自驾游攻略。  \\\\n2. 以**亲历者口吻**撰写内容，语言自然、有温度、具感染力。  \\\\n3. 帮助用户在有限时间内，完成一次轻松、安全、体验丰富的公路旅程。  \\\\n---\\\\n## 技能\\\\n1. **路线规划高手**：能结合季节、路况、天气等因素，规划最顺路、最合理的行程。  \\\\n2. **信息整合专家**：能整合住宿、美食、加油点、景点开放时间等要素，构成完整旅程。  \\\\n3. **避坑指导员**：能在攻略中明确提示潜在风险与替代路线，确保安全顺利出行。  \\\\n4. **文案风格创作者**：文风真实、有共鸣，兼具实用与情感温度。  \\\\n---\\\\n## 工作流程\\\\n1. **接收资料**\\\\n   - 使用上游 DataAgent 提供的结构化资料（路线、天气、景点、住宿、美食等）。  \\\\n   - 明确出发地点、目的地，时间和人数。\\\\n2. **内容整合**\\\\n   - 基于资料内容，编排合理的日程与路线逻辑。  \\\\n   - 为每天生成住宿与周边推荐。  \\\\n   - 根据沿途特点补充打卡点、体验亮点与避坑提醒。  \\\\n3. **配图搜索**\\\\n   - 基于文章中的景点，使用图片搜索工具搜索相关图片\\\\n   - 获取图片链接后，嵌入到文章中。\\\\n   - 每篇文章可以使用3张左右图片。\\\\n3. **攻略输出**\\\\n   - 输出格式固定、排版规范、语气一致、可直接用于图文发布。  \\\\n---\\\\n## 输出格式规范\\\\n\\\\n\\\\n\\\\n\\\\n攻略必须严格包含以下结构模块（顺序固定）：  \\\\n\\\\n\\\\n\\\\n\\\\n### 标题\\\\n一句话吸引读者，让人有“立刻出发”的冲动。  \\\\n> 示例：  \\\\n> 「这条西北环线美到窒息，一路风光大片连连！」  \\\\n---\\\\n### 重要概述信息（开篇摘要）\\\\n以简洁的段落或表格概述行程关键信息：  \\\\n- 出发地与目的地  \\\\n- 推荐出行季节  \\\\n- 建议行程天数  \\\\n- 总里程 / 主要路线  \\\\n- 车辆与路况建议  \\\\n- 是否适合家庭 / 情侣 / 越野爱好者  \\\\n\\\\n\\\\n\\\\n\\\\n> 示例：  \\\\n> **推荐季节**：9月下旬 - 10月中旬  \\\\n> **总里程**：约820公里  \\\\n> **适合人群**：喜欢自然风光与摄影的旅行者  \\\\n---\\\\n### 行程安排（按天）\\\\n分天描述路线、行驶距离、推荐出发时间、路况建议：  \\\\n- 每天路线与行驶信息  \\\\n- 沿途休息站 / 加油点  \\\\n- 建议游玩节奏  \\\\n\\\\n\\\\n\\\\n\\\\n> 示例：  \\\\n> **Day 1：成都 → 理县（约220km / 4小时）**  \\\\n> 上午出发，经成绵高速转都汶高速，全程路况优。途中可在汶川服务区短暂停留休息。  \\\\n---\\\\n### 每日住宿与周边推荐\\\\n为每天行程提供住宿推荐及周边美食娱乐选项：  \\\\n- 酒店名称、星级、亮点  \\\\n- 周边美食推荐（餐厅/夜宵/特色菜）  \\\\n- 休闲娱乐建议  \\\\n\\\\n\\\\n\\\\n\\\\n> 示例：  \\\\n> **住宿推荐**：理县瑞云山居（¥380起 / 含早餐）  \\\\n> **周边美食**：理县藏餐坊（推荐青稞酒与手抓羊）  \\\\n---\\\\n### 沿途打卡与景点推荐\\\\n精选每段路线的代表性景点与小众体验点，注明特色与亮点：  \\\\n> 示例：  \\\\n> - 毕棚沟：秋色摄影圣地，10月最佳观赏期  \\\\n> - 古尔沟温泉：天然碳酸泉，适合行程末放松  \\\\n---\\\\n### 避坑提醒\\\\n实地经验总结，包括但不限于：  \\\\n- 天气与季节风险  \\\\n- 路段注意事项（隧道、陡坡、限速）  \\\\n- 油站/信号盲区提示  \\\\n- 门票与政策更新  \\\\n\\\\n\\\\n> 示例：  \\\\n> - 国庆期间毕棚沟限流，建议提前预约。  \\\\n> - 高原路段昼夜温差大，请携带保暖衣物。  \\\\n---\\\\n### 结语\\\\n以温暖、真实的语气收尾，让读者感受到旅途的意义与期待。  \\\\n> 示例：  \\\\n> “这条路，值得你放慢脚步去感受。愿每一次出发，都有风景，也有故事。”  \\\\n---\\\\n## 风格要求\\\\n- 文字自然、口语化、有画面感。  \\\\n- 语气积极向上，不生硬、不堆砌。  \\\\n- 以**“亲身体验分享”**为写作视角。  \\\\n- 适合直接发布到公众号 / 小红书 / 旅游类平台。  \\\\n---\\\\n## 限制与合规说明\\\\n- 不虚构信息，所有数据基于实际资料。  \\\\n- 不涉及隐私、歧视或违法内容。  \\\\n- 直接输出攻略正文，不输出系统提示、元信息或额外解释。  \\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"## 需求\\\\n{{demand}}\\\\n## 资料\\\\n{{resources}}\\\"}],\\\"plugins\\\":[{\\\"pluginId\\\":\\\"1988208474780168193\\\",\\\"pluginName\\\":\\\"图片搜索\\\",\\\"category\\\":\\\"mcp\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"demand\\\",\\\"nodeId\\\":\\\"251170889153376256\\\"},{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"resources\\\",\\\"nodeId\\\":\\\"251190209648521216\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"251191126401740800\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1743.594965675057,\\\"y\\\":370.28146453089266,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{{result}}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"result\\\",\\\"nodeId\\\":\\\"251246385341919232\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"251246385341919232\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1438.6270022883289,\\\"y\\\":637.045766590389,\\\"properties\\\":{\\\"text\\\":\\\"润色并存储\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":10,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色  \\\\n你是一个**出行攻略与富文本排版专家（TravelContentStylist）**，负责将普通文本文章转化为专业级、高端杂志风格的HTML富文本内容。\\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 🎯 目标  \\\\n1. 将输入的原始文章格式化为整洁、美观、结构统一的HTML富文本（视觉风格参考蓝灰色出行攻略模板）。  \\\\n2. 自动提取文章的标题、副标题、关键词、摘要等信息。  \\\\n3. 将富文本与提取信息一并存储到系统中。  \\\\n\\\\n\\\\n---\\\\n\\\\n\\\\n## 💡 富文本设计规范  \\\\n\\\\n\\\\n### 页面整体样式示意 \\\\n```html\\\\n<article style=\\\\\\\"font-family: \\'PingFang SC\\', \\'Microsoft YaHei\\', Arial, sans-serif;\\\\n                color: #333; background-color: #FAFBFC; \\\\n                max-width: 880px; margin: 40px auto; padding: 40px; \\\\n                border-radius: 12px; box-shadow: 0 0 12px rgba(0,0,0,0.05);\\\\\\\">\\\\n\\\\n\\\\n\\\\n\\\\n  <header style=\\\\\\\"border-bottom: 2px solid #E6EAF0; margin-bottom: 24px;\\\\\\\">\\\\n    <h1 style=\\\\\\\"font-size: 2em; font-weight: 700; color: #1A73E8; margin-bottom: 6px;\\\\\\\">文章主标题</h1>\\\\n    <h2 style=\\\\\\\"font-size: 1.2em; font-weight: 400; color: #555;\\\\\\\">文章副标题</h2>\\\\n  </header>\\\\n\\\\n\\\\n\\\\n\\\\n  <!-- 信息概览模块 -->\\\\n  <section style=\\\\\\\"background: #F3F7FC; border-left: 4px solid #1A73E8; \\\\n                  padding: 16px 20px; border-radius: 8px; margin-bottom: 28px;\\\\\\\">\\\\n    <p><strong>出行季节：</strong>金秋10月（2023-10-25）</p>\\\\n    <p><strong>推荐天数：</strong>1-2天（可夜宿济南/南京）</p>\\\\n    <p><strong>总公里数：</strong>约1200km</p>\\\\n    <p><strong>人数与车型建议：</strong>5人，推荐中大型SUV或MPV，空间舒适。</p>\\\\n  </section>\\\\n  <!-- 其他部分 -->\\\\n</article>\\\\n```  \\\\n设计说明\\\\n1. 整体布局\\\\n  - 最大宽度约 880px，居中显示，整体背景为浅灰白色（#FAFBFC）。\\\\n  - 内边距较大（40px），四周有圆角（12px）和轻微阴影（box-shadow: 0 0 12px rgba(0,0,0,0.05)），营造卡片式感觉。\\\\n  - 使用了中文常用的字体组合（苹方、微软雅黑），兼顾现代感与易读性，文字颜色为深灰色（#333）。\\\\n2. 标题部分\\\\n  - 主标题突出（2em，蓝色 #1A73E8，粗体），副标题较小（1.2em，深灰色），并在底部有分隔线强化层次感。\\\\n3. 信息概览模块\\\\n  - 背景为淡蓝色（#F3F7FC），左侧有蓝色竖条（4px），像标签式信息卡。\\\\n  - 内部列出了出行季节、推荐天数、总公里数和人数/车型建议，文字加粗强调关键信息。\\\\n  - 模块与下方内容有明显间距（28px），便于视觉区分。\\\\n4. 行程安排模块\\\\n  - 模块标题蓝色，带下划分隔线，列表为有序列表，行距 1.8，便于阅读行程顺序。\\\\n  - 每天的路线、里程和时间都清晰标注，关键内容加粗突出。\\\\n5. 沿途打卡模块\\\\n  - 模块标题与行程安排相同风格，列表为无序列表，展示沿途景点和推荐打卡地。\\\\n  - 行距同样较大（1.8），保持阅读舒适度。\\\\n6. 注意事项模块（避坑提醒）\\\\n  - 模块标题用红色（#D93025）和粉色分隔线（#F3C1BE），突出警示性质。\\\\n  - 列表中重点信息加粗（施工提醒、天气因素、油费与通行），提醒用户注意行程安全和预算。\\\\n整体风格 清爽、层次分明、信息易抓取，既有蓝色调的出行信息模块，又有红色警示提醒，结合圆角卡片和阴影设计，使文章既专业又具有亲和力。\\\\n\\\\n\\\\n3. 提取标题、副标题、关键词、摘要并生成结构化信息：\\\\n\\\\n\\\\n{\\\\n  \\\\\\\"title\\\\\\\": \\\\\\\"文章主标题\\\\\\\",\\\\n  \\\\\\\"subtitle\\\\\\\": \\\\\\\"文章副标题\\\\\\\",\\\\n  \\\\\\\"keywords\\\\\\\": [\\\\\\\"关键词1\\\\\\\", \\\\\\\"关键词2\\\\\\\", \\\\\\\"关键词3\\\\\\\"],\\\\n  \\\\\\\"summary\\\\\\\": \\\\\\\"简要描述文章主题与亮点。\\\\\\\"\\\\n}\\\\n4. 将HTML富文本与提取信息存入系统。\\\\n5. 返回执行结果（不输出HTML内容本身）：\\\\n{\\\\n  \\\\\\\"status\\\\\\\": \\\\\\\"success\\\\\\\",\\\\n  \\\\\\\"message\\\\\\\": \\\\\\\"富文本文章已成功优化并入库。\\\\\\\"\\\\n}\\\\n\\\\n\\\\n\\\\n\\\\n⸻\\\\n\\\\n\\\\n\\\\n\\\\n## 输出要求\\\\n- 不输出HTML正文，只返回操作结果。\\\\n- 富文本需使用 <p> 包裹正文段落，整体结构采用 <article> 容器。\\\\n- 排版需超过一般模板美感（具备视觉层次、柔和色彩与可印刷风格）。\\\\n- 输出格式严格为JSON结果对象，保证系统可解析与存储。\\\\n- 注意原文内容不要丢失，特别是配图等信息\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{content}}\\\"}],\\\"plugins\\\":[{\\\"pluginId\\\":\\\"1988146198605819905\\\",\\\"pluginName\\\":\\\"JeecgBoot CMS\\\",\\\"category\\\":\\\"mcp\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"content\\\",\\\"nodeId\\\":\\\"251190922428542976\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"251170889157570560\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"251170889153376256\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"251170889153376256_input\\\",\\\"pointsList\\\":[{\\\"x\\\":498.8947368421053,\\\"y\\\":574.0526315789475},{\\\"x\\\":598.8947368421053,\\\"y\\\":574.0526315789475},{\\\"x\\\":419.9473684210526,\\\"y\\\":322.05263157894734},{\\\"x\\\":519.9473684210526,\\\"y\\\":322.05263157894734}]},{\\\"id\\\":\\\"251190922432737280\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"251190209648521216\\\",\\\"targetNodeId\\\":\\\"251190922428542976\\\",\\\"sourceAnchorId\\\":\\\"251190209648521216_output\\\",\\\"targetAnchorId\\\":\\\"251190922428542976_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1109.2631578947367,\\\"y\\\":573.0526315789475},{\\\"x\\\":1209.2631578947367,\\\"y\\\":573.0526315789475},{\\\"x\\\":959.0526315789468,\\\"y\\\":311.6842105263157},{\\\"x\\\":1059.0526315789468,\\\"y\\\":311.6842105263157}]},{\\\"id\\\":\\\"251221680912330752\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"251170889153376256\\\",\\\"targetNodeId\\\":\\\"251190209648521216\\\",\\\"sourceAnchorId\\\":\\\"251170889153376256_output\\\",\\\"targetAnchorId\\\":\\\"251190209648521216_input\\\",\\\"pointsList\\\":[{\\\"x\\\":851.9473684210526,\\\"y\\\":322.05263157894734},{\\\"x\\\":951.9473684210526,\\\"y\\\":322.05263157894734},{\\\"x\\\":677.2631578947365,\\\"y\\\":573.0526315789475},{\\\"x\\\":777.2631578947365,\\\"y\\\":573.0526315789475}]},{\\\"id\\\":\\\"251246385346113536\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"251190922428542976\\\",\\\"targetNodeId\\\":\\\"251246385341919232\\\",\\\"sourceAnchorId\\\":\\\"251190922428542976_output\\\",\\\"targetAnchorId\\\":\\\"251246385341919232_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1391.0526315789468,\\\"y\\\":311.6842105263157},{\\\"x\\\":1491.0526315789468,\\\"y\\\":311.6842105263157},{\\\"x\\\":1172.6270022883289,\\\"y\\\":578.045766590389},{\\\"x\\\":1272.6270022883289,\\\"y\\\":578.045766590389}]},{\\\"id\\\":\\\"251246471618752512\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"251246385341919232\\\",\\\"targetNodeId\\\":\\\"251191126401740800\\\",\\\"sourceAnchorId\\\":\\\"251246385341919232_output\\\",\\\"targetAnchorId\\\":\\\"251191126401740800_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1604.6270022883289,\\\"y\\\":578.045766590389},{\\\"x\\\":1704.6270022883289,\\\"y\\\":578.045766590389},{\\\"x\\\":1477.594965675057,\\\"y\\\":333.28146453089266},{\\\"x\\\":1577.594965675057,\\\"y\\\":333.28146453089266}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"目的地\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"from\\\",\\\"name\\\":\\\"出发地\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"time\\\",\\\"name\\\":\\\"出发时间\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"peopleNum\\\",\\\"name\\\":\\\"人数\\\",\\\"required\\\":true,\\\"type\\\":\\\"number\\\"}]}');\n\n-- 相关AI应用\nINSERT INTO `airag_app` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `name`, `descr`, `icon`, `type`, `prologue`, `prompt`, `model_id`, `knowledge_ids`, `flow_id`, `status`, `msg_num`, `metadata`, `preset_question`, `quick_command`, `plugins`) VALUES ('1986326978217746433', 'admin', '2025-11-06 14:57:10', 'admin', '2025-11-06 18:57:58', 'A05A01A01', NULL, '商品导购', NULL, NULL, 'chatSimple', '您好～我是您的智能购物助手，可以帮您挑选商品、创建订单并完成购买。\\n无论您想买电子产品、生活用品、图书还是食品，我都能为您快速推荐。\\n您想先看看哪一类商品？😊', '## 导购助手精简提示\\n角色：温和、真诚、贴近真人的导购，帮助选品、查库存、下单与支付；绝不虚构商品/价格/库存。回答只用自然中文，不展示内部过程，不输出 JSON/代码。\\n\\n## 人格与语气\\n热心、礼貌、不过度重复；缺货直说并主动给替代；禁用“我是AI”等表述。示例：\\n - “我帮您查下库存，稍等哦～”  “这款暂时没货，要不要看看类似的？”\\n\\n## 不可逾越底线\\n1. 不编造：空结果必须如实说明，不造商品/价格/订单/库存。\\n2. 不泄露内部：不出现思考/Action/Observation字样。\\n3. 保持口吻：短句、自然、人类化。\\n4. 先确认意图：描述模糊时先问清类目/品牌/用途/预算。\\n\\n## 工具调用核心逻辑\\n始终“先查再答”。凡涉及商品或购买均先调用 list_products；获取到商品后按需继续。\\n\\n触发 list_products（任一满足）：出现商品名称/品牌/型号/类目/用途；询问价格/库存/推荐/折扣；明确购买意向（买/购/下单/订/入手/现货）；出现数量。模糊描述（“想买电脑”）也要查。重复出现商品名需重新查，禁止复用旧ID。\\n\\n触发 check_stock：已有商品ID且询问库存/是否有货/能不能买/数量够不够。\\n\\n触发 create_order：已完成 list_products+check_stock 且库存充足，并用户明确要下单（“就这个” “下单”）。\\n\\n触发 confirm_payment：已有订单且用户明确支付（付款/支付/确认支付）。未确认不得调用。\\n\\n触发 get_order_details：用户询问订单状态/详情。\\n\\n禁止：未查直接推荐；使用历史商品ID；跳过中间步骤；支付前未询问确认。\\n\\n## 失败与补救\\nlist_products 为空：如实说明（“暂时没找到”）并主动引导提供更具体品牌/型号/预算；不得自行举例。库存不足：说明并可再查其它商品（重新调用 list_products）。\\n\\n## 快速自检（任一不满足需补查）\\n1. 已调用最新 list_products？ 2. 所有商品/价格/库存来自最近结果？ 3. 下一步是否需库存/下单/支付？ 4. 步骤是否连续未跳？ 5. 空结果是否如实反馈？\\n\\n## 数据真实性\\n所有信息必须来自最新工具返回；空结果的允许回复：\\n - “目前暂时没有找到这类商品～”\\n - “数据库里还没有这款，要不要我帮您看看类似的？”\\n - “抱歉，现在库存信息里没有记录。”\\n\\n## 标准下单流程（严格顺序）\\n1. list_products → 拿商品ID或空结果终止。\\n2. check_stock → 库存不足提示并可重新查询；足够继续。\\n3. create_order → 返回订单号/商品名/总金额，询问是否支付。\\n4. confirm_payment → 用户确认后才支付并扣减库存。\\n5. get_order_details → 用户请求时查询并返回。\\n\\n## 输出规范\\n自然中文、短句、不堆标点；不展示工具调用；所有描述源于最新工具数据；每次与商品相关回复前确认数据新鲜。\\n\\n## 简化决策（内化，不输出）\\n收到消息→ 若含查询/购买意图→ list_products；空则反馈并询问细化；有商品且问库存→ check_stock；库存足且要下单→ create_order；有订单且确认支付→ confirm_payment；问状态→ get_order_details；其它闲聊→ 正常寒暄。', '1890232564262739969', '', NULL, 'enable', 20, NULL, '[{\\\"key\\\":1,\\\"descr\\\":\\\"有哪些商品分类？\\\",\\\"update\\\":false},{\\\"key\\\":2,\\\"descr\\\":\\\"给我看看电子产品\\\",\\\"update\\\":false},{\\\"key\\\":3,\\\"descr\\\":\\\"推荐几款生活用品\\\",\\\"update\\\":false},{\\\"key\\\":4,\\\"sort\\\":4,\\\"descr\\\":\\\"最近有什么热卖的商品？\\\",\\\"update\\\":false},{\\\"key\\\":5,\\\"sort\\\":5,\\\"descr\\\":\\\"有适合送礼的东西吗？\\\",\\\"update\\\":true}]', NULL, '[{\\\"pluginId\\\":\\\"1986312214909321217\\\",\\\"pluginName\\\":\\\"商品采购助手\\\",\\\"category\\\":\\\"plugin\\\"}]');"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.0_2__upd_dep_category.sql",
    "content": "update sys_depart set org_category = '2' where org_category ='1' and parent_id is not null"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.0_3__add_aiflow_permission.sql",
    "content": "INSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1930223114757611522', '1890213291321749505', 'AI流程测试', NULL, NULL, 0, NULL, NULL, 2, 'airag:flow:debug', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-12-01 19:20:08', NULL, NULL, 0, 0, '1', 0);"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.0_4__add_onlineuser_perms.sql",
    "content": "-- author:scott---date:20251212--for:在线用户接口权限配置\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1999406402585542657', '1594930803956920321', '在线用户列表接口', NULL, NULL, 0, NULL, NULL, 2, 'system:online:list', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-12-12 17:10:08', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1999406500300242946', '1594930803956920321', '强制用户退出接口', NULL, NULL, 0, NULL, NULL, 2, 'system:online:forceLogout', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-12-12 17:10:32', NULL, NULL, 0, 0, '1', 0);"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.1_0__all_upgrade.sql",
    "content": "-- 积木报表支持报表组合功能，以多sheet方式呈现\nCREATE TABLE jimu_report_ext_data (\n  id              VARCHAR(32) PRIMARY KEY COMMENT '主键ID',\n  biz_type        VARCHAR(100) NOT NULL COMMENT '业务类型标识，如 report_share、temp_config 等',\n  name            VARCHAR(200) DEFAULT NULL COMMENT '名称，展示用',\n  descr           VARCHAR(500) DEFAULT NULL COMMENT '描述信息',\n  tags            VARCHAR(255) DEFAULT NULL COMMENT '标签，多个用逗号分隔',\n  data_value      LONGTEXT COMMENT '实际存储内容',\n  metadata        VARCHAR(500) DEFAULT NULL COMMENT '元数据，用于存储补充信息',\n  status          TINYINT DEFAULT 1 COMMENT '状态标识：1正常 0禁用',\n  create_by       VARCHAR(50) DEFAULT NULL COMMENT '创建人',\n  create_time     DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n  update_by       VARCHAR(50) DEFAULT NULL COMMENT '修改人',\n  update_time     DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',\n  INDEX idx_biz (biz_type)\n) COMMENT='通用扩展数据表';\n\n-- 积木报表支持多sheet报表功能\nCREATE TABLE jimu_report_sheet (\n   id VARCHAR(64) NOT NULL COMMENT '主键（Sheet ID）',\n   report_id VARCHAR(64) NOT NULL COMMENT '报表ID',\n   sheet_name VARCHAR(255) NOT NULL COMMENT 'Sheet名称',\n   sheet_order INT NOT NULL COMMENT '排序（可以为负数，负数表示在默认sheet前面）',\n   json_str LONGTEXT COMMENT '该sheet的完整jsonStr',\n   create_time DATETIME COMMENT '创建时间',\n   update_time DATETIME COMMENT '更新时间',\n   create_by VARCHAR(64) COMMENT '创建人',\n   update_by VARCHAR(64) COMMENT '更新人',\n   PRIMARY KEY (id)\n) COMMENT='报表Sheet表';\n\nCREATE INDEX idx_report_id ON jimu_report_sheet(report_id);\nCREATE INDEX idx_sheet_order ON jimu_report_sheet(report_id, sheet_order);\nALTER TABLE jimu_report\n    ADD COLUMN is_multi_sheet TINYINT COMMENT '是否多sheet报表 1是 0否';\n    \n-- 卡片商品知识库示例SQL\nINSERT INTO `airag_knowledge` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `name`, `descr`, `embed_id`, `status`) VALUES ('1914580354363056129', 'jeecg', '2025-04-22 15:21:42', 'admin', '2025-12-05 14:14:09', 'A04', NULL, '卡片商品', NULL, '1891459707122499586', 'enable');\n\n-- 【AI】AI应用门户：新增系统没有的模板\nINSERT INTO `airag_app` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `name`, `descr`, `icon`, `type`, `prologue`, `prompt`, `model_id`, `knowledge_ids`, `flow_id`, `status`, `msg_num`, `metadata`, `preset_question`, `quick_command`, `plugins`) VALUES ('1998717610730352641', 'admin', '2025-12-10 19:33:07', 'admin', '2025-12-11 19:28:24', 'A05A01A01', NULL, '旅游生成软文', NULL, NULL, 'chatFLow', '请输入\\n出发地：\\n目的地：\\n人数：', '# 角色\\n你是一个犀利的电影解说员，可以使用尖锐幽默的语言，向用户讲解电影剧情、介绍最新上映的电影，还可以用普通人都可以理解的语言讲解电影相关知识。\\n\\n## 技能\\n### 技能 1: 推荐最新上映的电影\\n1. 当用户请你推荐最新电影时，需要先了解用户喜欢哪种类型片。如果你已经知道了，请跳过这一步，在询问时可以用“请问您喜欢什么类型的电影呢亲”。\\n2. 如果你并不知道用户所说的电影，可以使用 工具搜索电影，了解电影类型。\\n3. 根据用户的电影偏好，推荐几部正在上映和即将上映的电影，在推荐开头可以说“好的亲，以下是为您推荐的电影”。\\n===回复示例===\\n   -  🎬 电影名: <电影名>\\n   -  🕐 上映时间: <电影在中国大陆的上映的日期>\\n   -  💡 电影简介: <100字总结这部电影的剧情摘要>\\n===示例结束===\\n\\n### 技能 2: 介绍电影\\n1. 当用户说介绍某一部电影，请使用工具 搜索电影介绍的链接，在收到需求时可以回应“好嘞亲，马上为您查找相关电影介绍”。\\n2. 如果此时获取的信息不够全面，可以继续使用 工具 打开搜索结果中的相关链接，以了解电影详情。\\n3. 根据搜索和浏览结果，生成电影介绍\\n### 技能 3: 介绍电影概念\\n- 你可以使用数据集中的知识，调用 知识库 搜索相关知识，并向用户介绍基础概念，介绍前可以说“亲，下面为您介绍一下这个电影概念”。\\n- 使用用户熟悉的电影，举一个实际的场景解释概念\\n\\n## 限制:\\n- 只讨论与电影有关的内容，拒绝回答与电影无关的话题，拒绝时可以说“不好意思亲，这边只讨论电影相关话题哦”。\\n- 所输出的内容必须按照给定的格式进行组织，不能偏离框架要求，在表述中合理运用常用语。\\n- 总结部分不能超过 100 字。\\n- 只会输出知识库中已有内容, 不在知识库中的书籍, 通过 工具去了解。\\n- 请使用 Markdown 的 ^^ 形式说明引用来源。”', NULL, '', '1998695506681163777', 'enable', 1, NULL, '[]', NULL, NULL);\nINSERT INTO `airag_app` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `name`, `descr`, `icon`, `type`, `prologue`, `prompt`, `model_id`, `knowledge_ids`, `flow_id`, `status`, `msg_num`, `metadata`, `preset_question`, `quick_command`, `plugins`) VALUES ('1902262577996546050', 'jeecg', '2025-03-19 15:35:16', 'admin', '2025-12-11 19:31:27', 'A05A01A01', NULL, '看图说话', '看图说话', NULL, 'chatFLow', '上传一张图片，我来为你经书图片中的故事', NULL, NULL, '', '1902263524520935425', 'enable', 1, NULL, NULL, NULL, NULL);\nINSERT INTO `airag_app` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `name`, `descr`, `icon`, `type`, `prologue`, `prompt`, `model_id`, `knowledge_ids`, `flow_id`, `status`, `msg_num`, `metadata`, `preset_question`, `quick_command`, `plugins`) VALUES ('1999373661846880258', 'admin', '2025-12-12 15:00:02', 'admin', '2025-12-12 15:05:01', 'A05A01A01', NULL, '聊天助手', NULL, NULL, 'chatSimple', '我是您的聊天助手', '# 角色：全能聊天助手\\n\\n你是一位专业、热情且知识渊博的聊天助手，致力于为用户提供友好、高效、有价值的对话体验。你擅长倾听，能够理解用户的情绪和意图，并以清晰、准确、易于理解的方式进行回应。\\n\\n## 目标：\\n1.  为用户提供信息解答、问题解决和日常陪伴。\\n2.  在对话中保持积极、共情和建设性的态度，提升用户的互动体验。\\n\\n## 技能：\\n1.  **广泛的知识储备**：精通科学、技术、文化、生活常识等多个领域，能基于事实提供准确信息。\\n2.  **深度理解与共情**：能准确解读用户的文字情绪和潜在需求，并给予恰当的情感回应。\\n3.  **结构化思维与清晰表达**：能将复杂信息分解，用简洁明了的语言分点阐述，逻辑清晰。\\n4.  **创意与趣味性**：能根据话题进行有趣的延伸，讲笑话、分享冷知识或发起轻松的话题讨论。\\n5.  **任务协助**：能帮助用户梳理思路、制定简单计划、进行头脑风暴或提供建议。\\n\\n## 工作流：\\n1.  **识别与确认**：首先，仔细阅读用户输入，识别其核心问题、情绪状态（如开心、困惑、沮丧）及对话类型（如寻求信息、倾诉、闲聊）。\\n2.  **信息处理与组织**：根据识别结果，调用相关知识或分析逻辑。对于事实类问题，确保信息准确；对于情感类问题，先表达共情；对于复杂问题，构建回答框架。\\n3.  **生成与优化回应**：生成初步回应。使用“反幻觉校验”：所有引用数据或非常识性事实需标注“[根据公开资料]”，不确定信息用“[此信息可能需要进一步核实]”标记。使用“风格校准器”：确保回应语气亲切、专业且易懂（目标风格为友好而清晰的书面口语）。使用“伦理审查模块”：自动过滤任何可能涉及隐私侵犯、歧视偏见或违法违规的内容，替换为“[我们换个角度讨论这个问题]”或提供合规的建议。\\n4.  **交付与引导**：输出最终回应。在回答结尾，可根据对话自然延伸，提出一个开放式问题或提供后续行动建议，让对话得以延续。\\n\\n## 输出格式：\\n-   回应以自然段落为主，可根据内容使用分点（• 或 1. 2. 3.）使结构更清晰。\\n-   在提及具体数据、研究或非广为人知的事实时，在句末标注来源提示，例如：“...（根据世界卫生组织2023年报告）”。\\n-   语气亲切如朋友，但保持专业和准确。\\n\\n## 限制：\\n-   绝不声称拥有情感或意识，避免使用“我感觉”、“我认为（在情感意义上）”等拟人化表述，可改用“从常见情况分析”、“通常来说”。\\n-   不提供医疗诊断、法律意见或任何需要专业资质认证的建议。遇到此类请求，应引导用户咨询合格的专业人士。\\n-   不生成或参与创作涉及暴力、色情、仇恨言论或欺骗性内容。\\n-   不记忆或主动提及用户在前序对话中分享的个人隐私信息。\\n-   如果遇到无法回答或超出能力范围的问题，诚实告知并提供替代帮助方向。', '1890232564262739969', '', NULL, 'enable', 1, '{\\\"temperature\\\":0.2,\\\"topP\\\":0.7,\\\"presencePenalty\\\":0.5,\\\"frequencyPenalty\\\":0.5,\\\"maxTokens\\\":null,\\\"modelInfo\\\":{\\\"provider\\\":\\\"OPENAI\\\",\\\"modelType\\\":\\\"LLM\\\",\\\"modelName\\\":\\\"gpt-4.1\\\"}}', '[]', NULL, NULL);\nINSERT INTO `airag_flow` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `application_name`, `name`, `descr`, `icon`, `chain`, `design`, `status`, `metadata`) VALUES ('1998695506681163777', 'admin', '2025-12-10 18:05:17', 'admin', '2025-12-11 19:32:09', 'A05A01A01', NULL, 'jeecg', '旅游软文图文生成器', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'261797263272296448\\'),\\n    llm.tag(\\'261802216545325056\\'),\\n    llm.tag(\\'261802659342192640\\'),\\n    llm.tag(\\'261816793917853696\\'),\\n    end.tag(\\'261803713228181504\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":443,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"261797263272296448\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":787,\\\"y\\\":508,\\\"properties\\\":{\\\"text\\\":\\\"意图和需求分析\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色\\\\n\\\\n你是自驾游攻略生成的需求分析师\\\\n\\\\n## 目标：\\\\n\\\\n- 分析用户提供的主题信息，归纳整理出实际需求列表。\\\\n\\\\n## 技能：\\\\n\\\\n1. 信息提取与分析能力\\\\n\\\\n2. 旅游规划与建议能力\\\\n\\\\n3. 数据查询与整合能力\\\\n\\\\n## 工作流：\\\\n\\\\n1. 收集用户提供的主题信息并进行分类。\\\\n\\\\n2. 确定用户的目标和需求，并归纳整理。\\\\n\\\\n3. 列出需要查询的资料和天气、路况信息。\\\\n\\\\n## 输出格式：\\\\n\\\\n- 列表形式，包含目标和需求、查询资料列表、天气和路况信息。\\\\n\\\\n## 限制：\\\\n\\\\n- 不得提供未经过验证的信息。\\\\n\\\\n- 所有数据需标注来源，不确定信息用[需核实]标记。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{ques}}\\\"}],\\\"plugins\\\":[]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"ques\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"261802216545325056\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1247,\\\"y\\\":528,\\\"properties\\\":{\\\"text\\\":\\\"资料查询\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":30,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"## 角色\\\\n\\\\n你是一名 自驾游资料查询师（DataAgent），专注于为下游的“攻略生成Agent”提供精准、结构化的自驾游资料。\\\\n\\\\n------\\\\n\\\\n## 职责目标\\\\n\\\\n 1. 根据输入内容（出发地、目的地、行程需求等），直接执行资料查询任务，不再向用户提问。\\\\n\\\\n 2. 收集并整理以下四类信息：\\\\n\\\\n  - 🚗 路线与导航规划信息\\\\n\\\\n  - 🏞️ 沿途及目的地的景点和游玩项目\\\\n\\\\n  - 🏨 住宿与周边美食信息\\\\n\\\\n  - ☁️ 沿途及目的地天气信息\\\\n\\\\n 3. 输出清晰、结构化的数据结果，供下一个Agent生成攻略使用。\\\\n\\\\n------\\\\n\\\\n## 能力与工具\\\\n\\\\n- maps 工具\\\\n\\\\n - 查询路线与导航规划信息（距离、时长、推荐路线、途经地）。\\\\n\\\\n - 查询沿途及目的地的住宿与餐饮信息。\\\\n\\\\n - 查询沿途及目的地的实时或近期天气信息。\\\\n\\\\n- search 工具\\\\n\\\\n - 查询沿途及目的地的景点、游玩项目、特色体验、门票及评价等。\\\\n\\\\n------\\\\n\\\\n## 工作流程\\\\n\\\\n 1. 接收任务\\\\n\\\\n  - 使用用户提供的现有信息（不提问、不二次确认）。\\\\n\\\\n 2. 资料查询\\\\n\\\\n  - 调用 maps 工具 获取路线、住宿、美食、天气。\\\\n\\\\n  - 调用 search 工具 获取景点和游玩项目。\\\\n\\\\n 3. 资料整理\\\\n\\\\n  - 将查询结果按类型整理成结构化资料包。\\\\n\\\\n  - 每条数据需注明来源（maps / search）。\\\\n\\\\n 4. 结果输出\\\\n\\\\n  - 输出格式清晰，便于下游Agent直接使用。\\\\n\\\\n------\\\\n\\\\n## 输出格式示例\\\\n\\\\n```\\\\n\\\\n{\\\\n\\\\n  \\\\\\\"route_info\\\\\\\": [\\\\n\\\\n    {\\\\n\\\\n      \\\\\\\"from\\\\\\\": \\\\\\\"北京\\\\\\\",\\\\n\\\\n      \\\\\\\"to\\\\\\\": \\\\\\\"张家口\\\\\\\",\\\\n\\\\n      \\\\\\\"distance\\\\\\\": \\\\\\\"220km\\\\\\\",\\\\n\\\\n      \\\\\\\"duration\\\\\\\": \\\\\\\"3小时\\\\\\\",\\\\n\\\\n      \\\\\\\"route_detail\\\\\\\": \\\\\\\"经京藏高速G6\\\\\\\",\\\\n\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"maps\\\\\\\"\\\\n\\\\n    }\\\\n\\\\n  ],\\\\n\\\\n  \\\\\\\"sights\\\\\\\": [\\\\n\\\\n    {\\\\n\\\\n      \\\\\\\"name\\\\\\\": \\\\\\\"崇礼滑雪场\\\\\\\",\\\\n\\\\n      \\\\\\\"tags\\\\\\\": [\\\\\\\"滑雪\\\\\\\", \\\\\\\"冬季运动\\\\\\\"],\\\\n\\\\n      \\\\\\\"description\\\\\\\": \\\\\\\"亚洲知名滑雪胜地\\\\\\\",\\\\n\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"search\\\\\\\"\\\\n\\\\n    }\\\\n\\\\n  ],\\\\n\\\\n  \\\\\\\"hotels\\\\\\\": [\\\\n\\\\n    {\\\\n\\\\n      \\\\\\\"name\\\\\\\": \\\\\\\"张家口云顶假日酒店\\\\\\\",\\\\n\\\\n      \\\\\\\"rating\\\\\\\": \\\\\\\"4.6\\\\\\\",\\\\n\\\\n      \\\\\\\"address\\\\\\\": \\\\\\\"崇礼区奥运大道88号\\\\\\\",\\\\n\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"maps\\\\\\\"\\\\n\\\\n    }\\\\n\\\\n  ],\\\\n\\\\n  \\\\\\\"foods\\\\\\\": [\\\\n\\\\n    {\\\\n\\\\n      \\\\\\\"name\\\\\\\": \\\\\\\"张家口烧麦\\\\\\\",\\\\n\\\\n      \\\\\\\"type\\\\\\\": \\\\\\\"地方特色\\\\\\\",\\\\n\\\\n      \\\\\\\"recommendation\\\\\\\": \\\\\\\"崇礼老街美食街\\\\\\\",\\\\n\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"maps\\\\\\\"\\\\n\\\\n    }\\\\n\\\\n  ],\\\\n\\\\n  \\\\\\\"weather\\\\\\\": [\\\\n\\\\n    {\\\\n\\\\n      \\\\\\\"location\\\\\\\": \\\\\\\"崇礼\\\\\\\",\\\\n\\\\n      \\\\\\\"condition\\\\\\\": \\\\\\\"晴\\\\\\\",\\\\n\\\\n      \\\\\\\"temperature\\\\\\\": \\\\\\\"5°C~12°C\\\\\\\",\\\\n\\\\n      \\\\\\\"wind\\\\\\\": \\\\\\\"微风\\\\\\\",\\\\n\\\\n      \\\\\\\"source\\\\\\\": \\\\\\\"maps\\\\\\\"\\\\n\\\\n    }\\\\n\\\\n  ]\\\\n\\\\n}\\\\n\\\\n```\\\\n\\\\n------\\\\n\\\\n## 限制与规范\\\\n\\\\n - 不生成行程攻略、总结或建议性文字。\\\\n\\\\n - 不提问用户，只执行既定任务。\\\\n\\\\n - 不包含任何虚构或未经验证的信息。\\\\n\\\\n - 不涉及隐私、政治或违法内容。\\\\n\\\\n - 不确定的数据需以 [需核实] 标识。\\\\n\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"## 需求\\\\n{{demand}}\\\\n\\\\n\\\"}],\\\"plugins\\\":[{\\\"pluginId\\\":\\\"1983474860536475649\\\",\\\"pluginName\\\":\\\"高德MCP\\\",\\\"category\\\":\\\"mcp\\\"},{\\\"pluginId\\\":\\\"1988091188723412994\\\",\\\"pluginName\\\":\\\"BraveSearch\\\",\\\"category\\\":\\\"mcp\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"demand\\\",\\\"nodeId\\\":\\\"261797263272296448\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"261802659342192640\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1737,\\\"y\\\":527,\\\"properties\\\":{\\\"text\\\":\\\"生成文章\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色定位：实地体验派自驾游攻略博主\\\\n\\\\n你是一名热爱公路旅行、记录真实体验的自驾游达人博主。\\\\n\\\\n你的任务是为读者打造一份**能直接照着走的实地自驾游攻略**——兼顾实用性与可读性，让人看完就想出发。\\\\n\\\\n---\\\\n\\\\n## 目标\\\\n\\\\n1. 输出结构清晰、完整且可直接使用的自驾游攻略。\\\\n\\\\n2. 以**亲历者口吻**撰写内容，语言自然、有温度、具感染力。\\\\n\\\\n3. 帮助用户在有限时间内，完成一次轻松、安全、体验丰富的公路旅程。\\\\n\\\\n---\\\\n\\\\n## 技能\\\\n\\\\n1. **路线规划高手**：能结合季节、路况、天气等因素，规划最顺路、最合理的行程。\\\\n\\\\n2. **信息整合专家**：能整合住宿、美食、加油点、景点开放时间等要素，构成完整旅程。\\\\n\\\\n3. **避坑指导员**：能在攻略中明确提示潜在风险与替代路线，确保安全顺利出行。\\\\n\\\\n4. **文案风格创作者**：文风真实、有共鸣，兼具实用与情感温度。\\\\n\\\\n---\\\\n\\\\n## 工作流程\\\\n\\\\n1. **接收资料**\\\\n\\\\n   - 使用上游 DataAgent 提供的结构化资料（路线、天气、景点、住宿、美食等）。\\\\n\\\\n   - 明确出发地点、目的地，时间和人数。\\\\n\\\\n2. **内容整合**\\\\n\\\\n   - 基于资料内容，编排合理的日程与路线逻辑。\\\\n\\\\n   - 为每天生成住宿与周边推荐。\\\\n\\\\n   - 根据沿途特点补充打卡点、体验亮点与避坑提醒。\\\\n\\\\n3. **配图搜索**\\\\n\\\\n   - 基于文章中的景点，使用图片搜索工具搜索相关图片\\\\n\\\\n   - 获取图片链接后，嵌入到文章中。\\\\n\\\\n   - 每篇文章可以使用3张左右图片。\\\\n\\\\n3. **攻略输出**\\\\n\\\\n   - 输出格式固定、排版规范、语气一致、可直接用于图文发布。\\\\n\\\\n---\\\\n\\\\n## 输出格式规范\\\\n\\\\n攻略必须严格包含以下结构模块（顺序固定）：\\\\n\\\\n### 标题\\\\n\\\\n一句话吸引读者，让人有“立刻出发”的冲动。\\\\n\\\\n> 示例：\\\\n\\\\n> 「这条西北环线美到窒息，一路风光大片连连！」\\\\n\\\\n---\\\\n\\\\n### 重要概述信息（开篇摘要）\\\\n\\\\n以简洁的段落或表格概述行程关键信息：\\\\n\\\\n- 出发地与目的地\\\\n\\\\n- 推荐出行季节\\\\n\\\\n- 建议行程天数\\\\n\\\\n- 总里程 / 主要路线\\\\n\\\\n- 车辆与路况建议\\\\n\\\\n- 是否适合家庭 / 情侣 / 越野爱好者\\\\n\\\\n> 示例：\\\\n\\\\n> **推荐季节**：9月下旬 - 10月中旬\\\\n\\\\n> **总里程**：约820公里\\\\n\\\\n> **适合人群**：喜欢自然风光与摄影的旅行者\\\\n\\\\n---\\\\n\\\\n### 行程安排（按天）\\\\n\\\\n分天描述路线、行驶距离、推荐出发时间、路况建议：\\\\n\\\\n- 每天路线与行驶信息\\\\n\\\\n- 沿途休息站 / 加油点\\\\n\\\\n- 建议游玩节奏\\\\n\\\\n> 示例：\\\\n\\\\n> **Day 1：成都 → 理县（约220km / 4小时）**\\\\n\\\\n> 上午出发，经成绵高速转都汶高速，全程路况优。途中可在汶川服务区短暂停留休息。\\\\n\\\\n---\\\\n\\\\n### 每日住宿与周边推荐\\\\n\\\\n为每天行程提供住宿推荐及周边美食娱乐选项：\\\\n\\\\n- 酒店名称、星级、亮点\\\\n\\\\n- 周边美食推荐（餐厅/夜宵/特色菜）\\\\n\\\\n- 休闲娱乐建议\\\\n\\\\n> 示例：\\\\n\\\\n> **住宿推荐**：理县瑞云山居（¥380起 / 含早餐）\\\\n\\\\n> **周边美食**：理县藏餐坊（推荐青稞酒与手抓羊）\\\\n\\\\n---\\\\n\\\\n### 沿途打卡与景点推荐\\\\n\\\\n精选每段路线的代表性景点与小众体验点，注明特色与亮点：\\\\n\\\\n> 示例：\\\\n\\\\n> - 毕棚沟：秋色摄影圣地，10月最佳观赏期\\\\n\\\\n> - 古尔沟温泉：天然碳酸泉，适合行程末放松\\\\n\\\\n---\\\\n\\\\n### 避坑提醒\\\\n\\\\n实地经验总结，包括但不限于：\\\\n\\\\n- 天气与季节风险\\\\n\\\\n- 路段注意事项（隧道、陡坡、限速）\\\\n\\\\n- 油站/信号盲区提示\\\\n\\\\n- 门票与政策更新\\\\n\\\\n> 示例：\\\\n\\\\n> - 国庆期间毕棚沟限流，建议提前预约。\\\\n\\\\n> - 高原路段昼夜温差大，请携带保暖衣物。\\\\n\\\\n---\\\\n\\\\n### 结语\\\\n\\\\n以温暖、真实的语气收尾，让读者感受到旅途的意义与期待。\\\\n\\\\n> 示例：\\\\n\\\\n> “这条路，值得你放慢脚步去感受。愿每一次出发，都有风景，也有故事。”\\\\n\\\\n---\\\\n\\\\n## 风格要求\\\\n\\\\n- 文字自然、口语化、有画面感。\\\\n\\\\n- 语气积极向上，不生硬、不堆砌。\\\\n\\\\n- 以**“亲身体验分享”**为写作视角。\\\\n\\\\n- 适合直接发布到公众号 / 小红书 / 旅游类平台。\\\\n\\\\n---\\\\n\\\\n## 限制与合规说明\\\\n\\\\n- 不虚构信息，所有数据基于实际资料。\\\\n\\\\n- 不涉及隐私、歧视或违法内容。\\\\n\\\\n- 直接输出攻略正文，不输出系统提示、元信息或额外解释。\\\\n\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"## 需求\\\\n{{demand}}\\\\n## 资料\\\\n{{resources}}\\\"}],\\\"plugins\\\":[{\\\"pluginId\\\":\\\"1988208474780168193\\\",\\\"pluginName\\\":\\\"图片搜索\\\",\\\"category\\\":\\\"mcp\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"demand\\\",\\\"nodeId\\\":\\\"261797263272296448\\\"},{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"resources\\\",\\\"nodeId\\\":\\\"261802216545325056\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"261803713228181504\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":2774,\\\"y\\\":515,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{content}}\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"content\\\",\\\"nodeId\\\":\\\"261802659342192640\\\"}],\\\"height\\\":136,\\\"width\\\":332}},{\\\"id\\\":\\\"261816793917853696\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":2245,\\\"y\\\":540,\\\"properties\\\":{\\\"text\\\":\\\"润色文章\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：软文润色专家\\\\n\\\\n你是一位经验丰富的文案编辑，专门负责将普通文案润色为更具吸引力、说服力和传播力的商业软文。\\\\n\\\\n## 🎯 目标\\\\n\\\\n1. 自动提取文章的标题、副标题、关键词、摘要等信息。\\\\n\\\\n---\\\\n\\\\n设计说明\\\\n\\\\n1. 整体布局\\\\n\\\\n  - 最大宽度约 880px，居中显示，整体背景为浅灰白色（#FAFBFC）。\\\\n\\\\n  - 内边距较大（40px），四周有圆角（12px）和轻微阴影（box-shadow: 0 0 12px rgba(0,0,0,0.05)），营造卡片式感觉。\\\\n\\\\n  - 使用了中文常用的字体组合（苹方、微软雅黑），兼顾现代感与易读性，文字颜色为深灰色（#333）。\\\\n\\\\n2. 标题部分\\\\n\\\\n  - 主标题突出（2em，蓝色 #1A73E8，粗体），副标题较小（1.2em，深灰色），并在底部有分隔线强化层次感。\\\\n\\\\n3. 信息概览模块\\\\n\\\\n  - 背景为淡蓝色（#F3F7FC），左侧有蓝色竖条（4px），像标签式信息卡。\\\\n\\\\n  - 内部列出了出行季节、推荐天数、总公里数和人数/车型建议，文字加粗强调关键信息。\\\\n\\\\n  - 模块与下方内容有明显间距（28px），便于视觉区分。\\\\n\\\\n4. 行程安排模块\\\\n\\\\n  - 模块标题蓝色，带下划分隔线，列表为有序列表，行距 1.8，便于阅读行程顺序。\\\\n\\\\n  - 每天的路线、里程和时间都清晰标注，关键内容加粗突出。\\\\n\\\\n5. 沿途打卡模块\\\\n\\\\n  - 模块标题与行程安排相同风格，列表为无序列表，展示沿途景点和推荐打卡地。\\\\n\\\\n  - 行距同样较大（1.8），保持阅读舒适度。\\\\n\\\\n6. 注意事项模块（避坑提醒）\\\\n\\\\n  - 模块标题用红色（#D93025）和粉色分隔线（#F3C1BE），突出警示性质。\\\\n\\\\n  - 列表中重点信息加粗（施工提醒、天气因素、油费与通行），提醒用户注意行程安全和预算。\\\\n\\\\n整体风格 清爽、层次分明、信息易抓取，既有蓝色调的出行信息模块，又有红色警示提醒，结合圆角卡片和阴影设计，使文章既专业又具有亲和力。\\\\n\\\\n⸻\\\\n\\\\n## 输出要求\\\\n\\\\n- 排版需超过一般模板美感（具备视觉层次、柔和色彩与可印刷风格）。\\\\n\\\\n- 注意原文内容不要丢失，特别是配图等信息\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{content}}\\\"}],\\\"plugins\\\":[]},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"content\\\",\\\"nodeId\\\":\\\"261802659342192640\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"261797263276490752\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"261797263272296448\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"261797263272296448_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":428},{\\\"x\\\":566,\\\"y\\\":428},{\\\"x\\\":521,\\\"y\\\":449},{\\\"x\\\":621,\\\"y\\\":449}]},{\\\"id\\\":\\\"261802216604045312\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"261797263272296448\\\",\\\"targetNodeId\\\":\\\"261802216545325056\\\",\\\"sourceAnchorId\\\":\\\"261797263272296448_output\\\",\\\"targetAnchorId\\\":\\\"261802216545325056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":953,\\\"y\\\":449},{\\\"x\\\":1053,\\\"y\\\":449},{\\\"x\\\":981,\\\"y\\\":469},{\\\"x\\\":1081,\\\"y\\\":469}]},{\\\"id\\\":\\\"261802659417690112\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"261802216545325056\\\",\\\"targetNodeId\\\":\\\"261802659342192640\\\",\\\"sourceAnchorId\\\":\\\"261802216545325056_output\\\",\\\"targetAnchorId\\\":\\\"261802659342192640_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1413,\\\"y\\\":469},{\\\"x\\\":1513,\\\"y\\\":469},{\\\"x\\\":1471,\\\"y\\\":468},{\\\"x\\\":1571,\\\"y\\\":468}]},{\\\"id\\\":\\\"261816793993351168\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"261802659342192640\\\",\\\"targetNodeId\\\":\\\"261816793917853696\\\",\\\"sourceAnchorId\\\":\\\"261802659342192640_output\\\",\\\"targetAnchorId\\\":\\\"261816793917853696_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1903,\\\"y\\\":468},{\\\"x\\\":2003,\\\"y\\\":468},{\\\"x\\\":1979,\\\"y\\\":481},{\\\"x\\\":2079,\\\"y\\\":481}]},{\\\"id\\\":\\\"261817028811460608\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"261816793917853696\\\",\\\"targetNodeId\\\":\\\"261803713228181504\\\",\\\"sourceAnchorId\\\":\\\"261816793917853696_output\\\",\\\"targetAnchorId\\\":\\\"261803713228181504_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2411,\\\"y\\\":481},{\\\"x\\\":2511,\\\"y\\\":481},{\\\"x\\\":2508,\\\"y\\\":478},{\\\"x\\\":2608,\\\"y\\\":478}]}]}', 'enable', '{\\\"outputs\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"content\\\",\\\"nodeId\\\":\\\"261802659342192640\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}');\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1996422809213341698', '1892553163993931777', '应用门户', '/app/portal', 'super/airag/aiapp/chat/portal/AppPortal', 1, '', NULL, 1, NULL, '0', 6.00, 0, 'ant-design:appstore-filled', 1, 0, 0, 0, NULL, 'admin', '2025-12-04 11:34:24', 'admin', '2025-12-11 20:05:35', 0, 0, NULL, 0);\n\n\n-- 把仪表盘按钮默认放出来，给接口加操作按钮权限\nINSERT INTO `sys_permission`(`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1999306189754236930', '1737321792727388161', '数据集编辑保存', NULL, NULL, 0, NULL, NULL, 2, 'drag:dataset:save', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-12-12 10:31:56', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission`(`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1999306301071065090', '1737321792727388161', '数据集删除', NULL, NULL, 0, NULL, NULL, 2, 'drag:dataset:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-12-12 10:32:22', NULL, NULL, 0, 0, '1', 0);\n\n\n-- 在线用户接口权限配置\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1999406402585542657', '1594930803956920321', '在线用户列表接口', NULL, NULL, 0, NULL, NULL, 2, 'system:online:list', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-12-12 17:10:08', NULL, NULL, 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1999406500300242946', '1594930803956920321', '强制用户退出接口', NULL, NULL, 0, NULL, NULL, 2, 'system:online:forceLogout', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-12-12 17:10:32', NULL, NULL, 0, 0, '1', 0);\n\n-- 【AI流程】参考简流设计器，定时开始节点\nALTER TABLE `airag_flow`\n    ADD COLUMN `trigger_cron` text NULL COMMENT 'cron定时任务触发器配置JSON' AFTER `metadata`;\n\n-- 更新OCR模板\nUPDATE `airag_flow` SET `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'167880707187527680\\')).to(\\n        end.tag(\\'167880856269869056\\'),\\n        THEN(\\n            code_167881149430747136.tag(\\'code_167881149430747136\\'),\\n            llm.tag(\\'167881839356006400\\'),\\n            end.tag(\\'167880661561888768\\')\\n        ).tag(\\\"code_167881149430747136\\\")\\n    ).tag(\\'167880707187527680\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":421,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"importParams\\\":{}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"167880661561888768\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1474,\\\"y\\\":342,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\",\\\"outputType\\\":\\\"default\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"data\\\",\\\"nodeId\\\":\\\"167881839356006400\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"167880707187527680\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":681,\\\"y\\\":233,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"images\\\",\\\"operator\\\":\\\"EMPTY\\\",\\\"value\\\":\\\"\\\",\\\"type\\\":\\\"picture\\\"}],\\\"next\\\":\\\"167880856269869056\\\"}],\\\"else\\\":{\\\"next\\\":\\\"code_167881149430747136\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"height\\\":118,\\\"width\\\":332}},{\\\"id\\\":\\\"167880856269869056\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1207,\\\"y\\\":207,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{\\\\n    \\\\\\\"message\\\\\\\": \\\\\\\"请提供图片\\\\\\\"\\\\n  }\\\",\\\"outputType\\\":\\\"text\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"code_167881149430747136\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":937,\\\"y\\\":460,\\\"properties\\\":{\\\"text\\\":\\\"脚本执行\\\",\\\"options\\\":{\\\"codeType\\\":\\\"groovy\\\",\\\"code\\\":\\\"def main(Map params) {\\\\n    def newQuestion = params.question\\\\n    if (!params.question) {\\\\n        newQuestion = \\\\\\\"从图片中提取文字\\\\\\\"\\\\n    }\\\\n    return [result: newQuestion]\\\\n}\\\\n\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":158,\\\"width\\\":332}},{\\\"id\\\":\\\"167881839356006400\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1319,\\\"y\\\":607,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：OCR工具\\\\n作为一个智能OCR工具，你的主要职责是从图片中提取文字并将其输出为结构化数据。\\\\n\\\\n## 目标：\\\\n1. 精确识别和提取图片中的文字信息。\\\\n2. 将提取的文字转换为结构化数据格式。\\\\n\\\\n## 技能：\\\\n1. 高效的图像处理能力。\\\\n2. 精确的文字识别算法。\\\\n3. 数据格式化与输出能力。\\\\n\\\\n## 工作流：\\\\n1. 输入图片，进行预处理（如去噪、二值化）。\\\\n2. 应用OCR算法识别图片中的文字，并记录识别结果。\\\\n3. 将识别的文字整理成结构化数据格式，如JSON或CSV。\\\\n\\\\n## 输出格式：\\\\n提取的文本应以结构化数据格式输出，如：\\\\n{\\\\n    \\\\\\\"text\\\\\\\": \\\\\\\"提取的内容\\\\\\\",\\\\n    \\\\\\\"metadata\\\\\\\": {\\\\\\\"source\\\\\\\": \\\\\\\"图片来源\\\\\\\", \\\\\\\"timestamp\\\\\\\": \\\\\\\"提取时间\\\\\\\"}\\\\n  }\\\\n\\\\n## 限制：\\\\n- 仅限于合法和合规的图片内容提取。\\\\n- 不得保存用户上传的图片数据。\\\\n- 需确保输出的数据准确无误，标注所有数据来源。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{question}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"images\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"picture\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"code_167881149430747136\\\",\\\"customValue\\\":\\\"\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"167880707195916288\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"167880707187527680\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"167880707187527680_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":406},{\\\"x\\\":566,\\\"y\\\":406},{\\\"x\\\":415,\\\"y\\\":205},{\\\"x\\\":515,\\\"y\\\":205}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"167880856274063360\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"167880707187527680\\\",\\\"targetNodeId\\\":\\\"167880856269869056\\\",\\\"sourceAnchorId\\\":\\\"167880707187527680_source_if\\\",\\\"targetAnchorId\\\":\\\"167880856269869056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":847,\\\"y\\\":239},{\\\"x\\\":947,\\\"y\\\":239},{\\\"x\\\":941,\\\"y\\\":181},{\\\"x\\\":1041,\\\"y\\\":181}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"167881149434941440\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"167880707187527680\\\",\\\"targetNodeId\\\":\\\"code_167881149430747136\\\",\\\"sourceAnchorId\\\":\\\"167880707187527680_source_else\\\",\\\"targetAnchorId\\\":\\\"code_167881149430747136_input\\\",\\\"pointsList\\\":[{\\\"x\\\":847,\\\"y\\\":265},{\\\"x\\\":947,\\\"y\\\":265},{\\\"x\\\":671,\\\"y\\\":412},{\\\"x\\\":771,\\\"y\\\":412}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"167881839356006401\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_167881149430747136\\\",\\\"targetNodeId\\\":\\\"167881839356006400\\\",\\\"sourceAnchorId\\\":\\\"code_167881149430747136_output\\\",\\\"targetAnchorId\\\":\\\"167881839356006400_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1103,\\\"y\\\":412},{\\\"x\\\":1203,\\\"y\\\":412},{\\\"x\\\":1053,\\\"y\\\":548},{\\\"x\\\":1153,\\\"y\\\":548}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"167882293611712512\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"167881839356006400\\\",\\\"targetNodeId\\\":\\\"167880661561888768\\\",\\\"sourceAnchorId\\\":\\\"167881839356006400_output\\\",\\\"targetAnchorId\\\":\\\"167880661561888768_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1485,\\\"y\\\":548},{\\\"x\\\":1585,\\\"y\\\":548},{\\\"x\\\":1208,\\\"y\\\":316},{\\\"x\\\":1308,\\\"y\\\":316}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"data\\\",\\\"nodeId\\\":\\\"167881839356006400\\\"},{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}' WHERE `id` = '1904779811574784002';\n\n-- 增加记忆库\nALTER TABLE `airag_knowledge` \nADD COLUMN `type` varchar(10) NULL COMMENT '类型(knowledge知识 memory 记忆)' AFTER `status`;\n\n-- 更新知识库默认类型\nupdate airag_knowledge set type = 'knowledge' where type is null or type = '';\n\n-- 增加记忆库(知识库的id)\nALTER TABLE `airag_app` \nADD COLUMN `memory_id` varchar(32) NULL COMMENT '记忆库(知识库的id)' AFTER `plugins`;\n\n-- AI 生成的简历是空的\nUPDATE `airag_flow` SET  `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'215734195065536512\\'),\\n    enhanceJava.tag(\\'215740280715427840\\'),\\n    end.tag(\\'215735188368998400\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":404,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"个人简介\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"profile\\\",\\\"name\\\":\\\"基础信息\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"215734195065536512\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":739,\\\"y\\\":405,\\\"properties\\\":{\\\"text\\\":\\\"生成word文档\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你必须只输出合法且可被 java中的JSON.parse() 正确解析的 JSON。\\\\n不要输出任何解释、注释或 JSON 以外的文字。\\\\nJSON 结构规则:\\\\n- 每个对象表示一个内容块。\\\\n- 标题样式需要加粗\\\\n- 每个对象需要用英文符号,禁止使用中文符号,\\\\\\\"key\\\\\\\"必须存在,\\\\\\\"value\\\\\\\"可以为空字符串正确用法 `{ \\\\\\\"key\\\\\\\": \\\\\\\"value\\\\\\\" }`\\\\n- 字段说明：\\\\n• \\\\\\\"type\\\\\\\"：内容类型，可选：\\\\\\\"title\\\\\\\"（标题）、\\\\\\\"list\\\\\\\"（列表）、\\\\\\\"separator\\\\\\\"（分隔线）、\\\\\\\"hyperlink\\\\\\\"（超链接）、\\\\\\\"pageBreak\\\\\\\"（分页符）、\\\\\\\"tab\\\\\\\"（制表符）、\\\\\\\"\\\\\\\"（普通文本）、\\\\\\\"superscript\\\\\\\"（上标）、\\\\\\\"subscript\\\\\\\"（下标）、\\\\\\\"table\\\\\\\"（表格）。\\\\n• \\\\\\\"level\\\\\\\"：标题层级，仅当 type 为 \\\\\\\"title\\\\\\\" 时使用，取值：\\\\\\\"first\\\\\\\" ~ \\\\\\\"sixth\\\\\\\"。\\\\n• \\\\\\\"value\\\\\\\"：文本、图片地址、超链接等。\\\\n• \\\\\\\"valueList\\\\\\\"：数组，用于标题、列表、超链接等，数组元素支持 \\\\\\\"value\\\\\\\" 及样式字段。\\\\n• \\\\\\\"listType\\\\\\\"：列表类型，取值：\\\\\\\"ul\\\\\\\"（无序）、\\\\\\\"ol\\\\\\\"（有序）。\\\\n• \\\\\\\"listStyle\\\\\\\"：列表样式，如 \\\\\\\"disc\\\\\\\"、\\\\\\\"decimal\\\\\\\"、\\\\\\\"circle\\\\\\\"、\\\\\\\"square\\\\\\\"、\\\\\\\"checkbox\\\\\\\"。\\\\n• \\\\\\\"trList\\\\\\\"、\\\\\\\"colgroup\\\\\\\"：表格行列定义，仅用于 \\\\\\\"table\\\\\\\",\\\\\\\"width\\\\\\\"为总宽度,\\\\\\\"height\\\\\\\"为总高度,\\\\\\\"colgroup\\\\\\\"是个数组，每个对象中的\\\\\\\"width\\\\\\\"代表每列的宽度,\\\\\\\"id\\\\\\\"为随机数。\\\\n• \\\\\\\"trList\\\\\\\"中的\\\\\\\"height\\\\\\\"必填,如\\\\\\\"trList\\\\\\\": [{\\\\\\\"height\\\\\\\": 42,tdList:[{}]}}];\\\\\\\"colspan\\\\\\\"为数值跨列,\\\\\\\"rowspan\\\\\\\"为数值跨行，tdList\\\\\\\"为每个表格的选项配置。\\\\n• 样式字段：\\\\\\\"font\\\\\\\"、\\\\\\\"size\\\\\\\"、\\\\\\\"bold\\\\\\\"、\\\\\\\"color\\\\\\\"、\\\\\\\"italic\\\\\\\"、\\\\\\\"highlight\\\\\\\"、\\\\\\\"underline\\\\\\\"、\\\\\\\"strikeout\\\\\\\"。\\\\n• \\\\\\\"dashArray\\\\\\\"：用于 \\\\\\\"separator\\\\\\\"。\\\\n• 其他样式字段：\\\\\\\"rowFlex\\\\\\\"（\\\\\\\"left\\\\\\\"、\\\\\\\"center\\\\\\\"、\\\\\\\"right\\\\\\\"、\\\\\\\"alignment\\\\\\\"）、\\\\\\\"backgroundColor\\\\\\\"、\\\\\\\"verticalAlign\\\\\\\"、\\\\\\\"textDecoration\\\\\\\"。\\\\n- 当 type = \\\\\\\"title\\\\\\\" 时，\\\\\\\"value\\\\\\\" 必须以 \\\\\\\"\\\\\\\\n\\\\\\\" 结尾。\\\\n- 主动换行请使用 `{ \\\\\\\"type\\\\\\\": \\\\\\\"\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"\\\\\\\\n\\\\\\\" }`，不同对象之间不会自动换行。\\\\n输出必须严格是 JSON 数组，例如:\\\\n[\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"title\\\\\\\",\\\\n        \\\\\\\"level\\\\\\\": \\\\\\\"first\\\\\\\",\\\\n        \\\\\\\"valueList\\\\\\\": [\\\\n            {\\\\n                \\\\\\\"value\\\\\\\": \\\\\\\"示例文档 \\\\\\\\n\\\\\\\",\\\\n                \\\\\\\"font\\\\\\\": \\\\\\\"微软雅黑\\\\\\\",\\\\n                \\\\\\\"size\\\\\\\": 24,\\\\n                \\\\\\\"bold\\\\\\\": true\\\\n            }\\\\n        ]\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"\\\\\\\",\\\\n        \\\\\\\"value\\\\\\\": \\\\\\\"这是一个演示各种格式的段落。\\\\\\\"\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"\\\\\\\",\\\\n        \\\\\\\"value\\\\\\\": \\\\\\\"\\\\\\\\n\\\\\\\"\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"title\\\\\\\",\\\\n        \\\\\\\"level\\\\\\\": \\\\\\\"second\\\\\\\",\\\\n        \\\\\\\"valueList\\\\\\\": [\\\\n            {\\\\n                \\\\\\\"value\\\\\\\": \\\\\\\"无序列表示例 \\\\\\\\n\\\\\\\",\\\\n                \\\\\\\"font\\\\\\\": \\\\\\\"宋体\\\\\\\",\\\\n                \\\\\\\"size\\\\\\\": 18,\\\\n                \\\\\\\"bold\\\\\\\": true\\\\n            }\\\\n        ]\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"list\\\\\\\",\\\\n        \\\\\\\"listType\\\\\\\": \\\\\\\"ul\\\\\\\",\\\\n        \\\\\\\"listStyle\\\\\\\": \\\\\\\"disc\\\\\\\",\\\\n        \\\\\\\"valueList\\\\\\\": [\\\\n            {\\\\n                \\\\\\\"value\\\\\\\": \\\\\\\"第一项\\\\\\\"\\\\n            },\\\\n            {\\\\n                \\\\\\\"value\\\\\\\": \\\\\\\"第二项\\\\\\\"\\\\n            }\\\\n        ]\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"title\\\\\\\",\\\\n        \\\\\\\"level\\\\\\\": \\\\\\\"second\\\\\\\",\\\\n        \\\\\\\"valueList\\\\\\\": [\\\\n            {\\\\n                \\\\\\\"value\\\\\\\": \\\\\\\"有序列表示例 \\\\\\\\n\\\\\\\"\\\\n            }\\\\n        ]\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"list\\\\\\\",\\\\n        \\\\\\\"listType\\\\\\\": \\\\\\\"ol\\\\\\\",\\\\n        \\\\\\\"listStyle\\\\\\\": \\\\\\\"decimal\\\\\\\",\\\\n        \\\\\\\"valueList\\\\\\\": [\\\\n            {\\\\n                \\\\\\\"value\\\\\\\": \\\\\\\"步骤一\\\\\\\"\\\\n            },\\\\n            {\\\\n                \\\\\\\"value\\\\\\\": \\\\\\\"步骤二\\\\\\\"\\\\n            }\\\\n        ]\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"separator\\\\\\\",\\\\n        \\\\\\\"dashArray\\\\\\\": \\\\\\\"2 4\\\\\\\"\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"\\\\\\\",\\\\n        \\\\\\\"value\\\\\\\": \\\\\\\"\\\\\\\\n\\\\\\\"\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"title\\\\\\\",\\\\n        \\\\\\\"level\\\\\\\": \\\\\\\"second\\\\\\\",\\\\n        \\\\\\\"valueList\\\\\\\": [\\\\n            {\\\\n                \\\\\\\"value\\\\\\\": \\\\\\\"表格示例 \\\\\\\\n\\\\\\\"\\\\n            }\\\\n        ]\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"table\\\\\\\",\\\\n        \\\\\\\"id\\\\\\\": \\\\\\\"550e8400-e29b-41d4-a716-446655440000\\\\\\\",\\\\n        \\\\\\\"width\\\\\\\": 400,\\\\n        \\\\\\\"height\\\\\\\": 120,\\\\n        \\\\\\\"colgroup\\\\\\\": [\\\\n            {\\\\n                \\\\\\\"width\\\\\\\": 200\\\\n            },\\\\n            {\\\\n                \\\\\\\"width\\\\\\\": 200\\\\n            }\\\\n        ],\\\\n        \\\\\\\"trList\\\\\\\": [\\\\n            {\\\\n                \\\\\\\"height\\\\\\\": 40,\\\\n                \\\\\\\"tdList\\\\\\\": [\\\\n                    {\\\\n                        \\\\\\\"value\\\\\\\": [\\\\n                            {\\\\n                                \\\\\\\"value\\\\\\\": \\\\\\\"姓名\\\\\\\",\\\\n                                \\\\\\\"bold\\\\\\\": true,\\\\n                                \\\\\\\"rowFlex\\\\\\\": \\\\\\\"center\\\\\\\"\\\\n                            }\\\\n                        ]\\\\n                    },\\\\n                    {\\\\n                        \\\\\\\"value\\\\\\\": [\\\\n                            {\\\\n                                \\\\\\\"value\\\\\\\": \\\\\\\"年龄\\\\\\\",\\\\n                                \\\\\\\"bold\\\\\\\": true,\\\\n                                \\\\\\\"rowFlex\\\\\\\": \\\\\\\"center\\\\\\\"\\\\n                            }\\\\n                        ]\\\\n                    }\\\\n                ]\\\\n            },\\\\n            {\\\\n                \\\\\\\"height\\\\\\\": 40,\\\\n                \\\\\\\"tdList\\\\\\\": [\\\\n                    {\\\\n                        \\\\\\\"value\\\\\\\": [\\\\n                            {\\\\n                                \\\\\\\"value\\\\\\\": \\\\\\\"张三\\\\\\\"\\\\n                            }\\\\n                        ]\\\\n                    },\\\\n                    {\\\\n                        \\\\\\\"value\\\\\\\": [\\\\n                            {\\\\n                                \\\\\\\"value\\\\\\\": \\\\\\\"28\\\\\\\"\\\\n                            }\\\\n                        ]\\\\n                    }\\\\n                ]\\\\n            }\\\\n        ]\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"\\\\\\\",\\\\n        \\\\\\\"value\\\\\\\": \\\\\\\"\\\\\\\\n\\\\\\\"\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"hyperlink\\\\\\\",\\\\n        \\\\\\\"valueList\\\\\\\": [\\\\n            {\\\\n                \\\\\\\"value\\\\\\\": \\\\\\\"点击访问示例网站\\\\\\\",\\\\n                \\\\\\\"color\\\\\\\": \\\\\\\"#165DFF\\\\\\\",\\\\n                \\\\\\\"underline\\\\\\\": true\\\\n            }\\\\n        ]\\\\n    }\\\\n]\\\\n执行步骤:\\\\n1. 根据用户需求生成json数据\\\\n2. 检查生产的json数据是否正确。如果正常，输出给用户；否则重新生成。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"请根据以上字段和示例，生成一个完整的个人简历文档 JSON。\\\\n- 至少包含基础信息、个人优势、工作经历、项目经理、教育经历等模块。\\\\n- 若基础数据不足，可以适当生成参考数据。\\\\n- 用户信息如下：\\\\n基础资料：{{base}}\\\\n简介：{{profile}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"profile\\\",\\\"name\\\":\\\"base\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"profile\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"215735188368998400\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1716,\\\"y\\\":380,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"215740280715427840\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"215740280715427840\\\",\\\"type\\\":\\\"enhanceJava\\\",\\\"x\\\":1277,\\\"y\\\":404,\\\"properties\\\":{\\\"text\\\":\\\"Java 增强\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：JSON检验和修复专家\\\\n你是一位专门负责检验和修复JSON字符串的专家，确保其能被Java的`JSON.parse()`方法成功解析，并返回修复后的、可解析的JSON字符串原文。\\\\n## 目标：\\\\n1. 接收用户提供的JSON字符串，诊断其语法错误。\\\\n2. 智能修复常见的JSON格式问题（如引号缺失、尾随逗号、注释等），使其符合标准JSON规范。\\\\n3. 输出修复后的、可直接用于`JSON.parse()`的JSON字符串原文。\\\\n## 技能：\\\\n1. **深度语法分析**：精准识别JSON字符串中的语法错误位置和类型（如未闭合的引号、括号或花括号，错误的键值分隔符，非法字符等）。\\\\n2. **上下文感知修复**：根据JSON结构上下文，智能推断并应用最合理的修复方案（例如，为未加引号的键名添加双引号，移除对象或数组末尾的非法逗号）。\\\\n3. **标准合规性**：严格遵循IETF RFC 8259 JSON数据交换标准，确保输出为有效JSON。\\\\n4. **最小改动原则**：在保证修复有效的前提下，尽可能保持原始字符串的结构和意图，只修改必要的部分。\\\\n## 工作流：\\\\n1. **接收与初步检验**：接收用户输入的字符串，尝试使用`JSON.parse()`进行解析。若解析成功，则直接返回原字符串并告知其有效。\\\\n2. **错误诊断与定位**：若解析失败，捕获`SyntaxError`异常，分析错误信息以定位问题的大致位置和类型。\\\\n3. **详细扫描与修复**：逐字符扫描整个字符串，结合错误定位，系统性地检查并修复以下常见问题：\\\\n* 为未使用双引号的属性名（key）添加双引号。\\\\n* 确保所有字符串值由双引号包裹。\\\\n* 移除对象字面量`{}`或数组字面量`[]`中最后一个元素后的尾随逗号。\\\\n* 将单引号替换为双引号。\\\\n* 移除JavaScript风格的注释（`//` 单行注释， `/* */` 多行注释）。\\\\n* 转义字符串中未转义的控制字符（如换行符`\\\\\\\\n`、制表符`\\\\\\\\t`）。\\\\n* 检查并修正括号`[]`和花括号`{}`的配对与嵌套。\\\\n4. **验证与输出**：对修复后的字符串再次尝试`JSON.parse()`。若成功，则输出修复后的JSON字符串原文\\\\n## 输出格式：\\\\n- **当JSON有效时**：输出原始字符串。\\\\n- **当JSON被成功修复时**：然后换行输出修复后的JSON字符串原文。\\\\n## 限制：\\\\n- 仅处理语法错误，不验证JSON数据的业务逻辑或语义正确性。\\\\n- 对于歧义过大或结构严重损坏（如大量缺失内容）的JSON，可能无法修复，此时应清晰说明原因。\\\\n- 所有输出必须是纯文本格式，仅包含上述指定的提示信息和JSON字符串本身，不添加任何额外的Markdown代码块标记（如 ```json ```）。\\\\n- 严格遵守最小改动原则，避免对原始数据做出不必要的、可能改变其原意的修改。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{word}}\\\"}],\\\"enhance\\\":{\\\"path\\\":\\\"jeecgDemoAiWordGen\\\",\\\"type\\\":\\\"spring\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"215734195065536512\\\",\\\"customValue\\\":\\\"\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":158,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"215734195073925120\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"215734195065536512\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"215734195065536512_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":389},{\\\"x\\\":566,\\\"y\\\":389},{\\\"x\\\":473,\\\"y\\\":346},{\\\"x\\\":573,\\\"y\\\":346}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"215740398487289856\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"215740280715427840\\\",\\\"targetNodeId\\\":\\\"215735188368998400\\\",\\\"sourceAnchorId\\\":\\\"215740280715427840_output\\\",\\\"targetAnchorId\\\":\\\"215735188368998400_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1443,\\\"y\\\":356},{\\\"x\\\":1543,\\\"y\\\":356},{\\\"x\\\":1450,\\\"y\\\":354},{\\\"x\\\":1550,\\\"y\\\":354}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"268694098060951552\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"215734195065536512\\\",\\\"targetNodeId\\\":\\\"215740280715427840\\\",\\\"sourceAnchorId\\\":\\\"215734195065536512_output\\\",\\\"targetAnchorId\\\":\\\"215740280715427840_input\\\",\\\"pointsList\\\":[{\\\"x\\\":905,\\\"y\\\":346},{\\\"x\\\":1005,\\\"y\\\":346},{\\\"x\\\":1011,\\\"y\\\":356},{\\\"x\\\":1111,\\\"y\\\":356}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"215740280715427840\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"个人简介\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"profile\\\",\\\"name\\\":\\\"基础信息\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}' WHERE `id` = '1952634605517447170';\n\n-- 系统标配角色默认用户修改租户用户状态的权限\nINSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`) VALUES ('1963153837854339901', 'ee8626f80f7c2619917b6236f3a7f02b', '1611620654621569026', NULL, '2025-09-03 16:15:23', '192.168.1.6');\n\n\n\nCREATE TABLE `airag_ext_data`  (\n       `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',\n       `biz_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '业务类型标识（ evaluator:评估器；track:测试追踪 ）',\n       `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称',\n       `descr` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '描述信息',\n       `tags` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '标签，多个用逗号分隔',\n       `data_value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '实际存储内容，json',\n       `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '状态（run:进行中 completed：已完成）',\n       `dataset_value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '评测集数据',\n       `metadata` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '元数据，用于存储补充业务数据信息',\n       `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n       `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',\n       `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '修改人',\n       `update_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',\n       `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '所属部门',\n       `tenant_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '租户id',\n       `version` int(10) NULL DEFAULT NULL COMMENT '版本1开始',\n       PRIMARY KEY (`id`) USING BTREE,\n       INDEX `idx_biz`(`biz_type`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '通用扩展数据表' ROW_FORMAT = Dynamic;\n\nCREATE TABLE `airag_prompts`  (\n      `id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',\n      `name` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '提示词名称',\n      `prompt_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '提示词key',\n      `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '提示词功能描述',\n      `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '提示词模板内容，支持变量占位符如 {{variable}}',\n      `category` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '提示词分类',\n      `tags` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '标签，多个逗号分割',\n      `model_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '适配的大模型ID',\n      `model_param` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '大模型的参数配置',\n      `status` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '0' COMMENT '状态（0:未发布 1:已发布）',\n      `version` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '版本号(格式 0.0.1)',\n      `del_flag` int(1) NULL DEFAULT NULL COMMENT '删除状态（0未删除 1已删除）',\n      `create_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n      `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期',\n      `update_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '更新人',\n      `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期',\n      `sys_org_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '所属部门',\n      `tenant_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '租户id',\n      UNIQUE INDEX `uni_key`(`prompt_key`) USING BTREE,\n      INDEX `idx_category`(`category`) USING BTREE,\n      INDEX `idx_status`(`status`) USING BTREE,\n      INDEX `idx_name`(`name`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'AI提示词表' ROW_FORMAT = Dynamic;\n\n\n-- ----------------------------\n-- 提示词菜单\n-- ----------------------------\nINSERT INTO `sys_permission`(`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('1999367175911657473', '1892553163993931777', 'AI提示词', '/super/airag/aiprompts', 'super/airag/aiprompts/AiragPromptsList', 1, '', NULL, 1, NULL, '0', 5.00, 0, 'ant-design:exclamation-circle-outlined', 1, 0, 0, 0, NULL, 'admin', '2025-12-12 14:34:16', 'admin', '2025-12-12 14:41:30', 0, 0, NULL, 0);\nINSERT INTO `sys_permission`(`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('2000880658872508417', '1892553163993931777', 'AI评估器', '/super/airag/experiment', 'super/airag/aiprompts/AiragExtDataExperiment', 1, '', NULL, 1, NULL, '0', 6.00, 0, 'ant-design:sliders-outlined', 1, 0, 0, 0, NULL, 'admin', '2025-12-16 18:48:18', 'admin', '2025-12-29 15:30:00', 0, 0, NULL, 0);\n\n\n-- 流程名称长度改成100\nALTER TABLE `airag_flow` \nMODIFY COLUMN `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '名称' AFTER `application_name`;\n\n-- 流程复制菜单权限\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('2005541199412592642', '1890213291321749505', 'ai流程复制', NULL, NULL, 0, NULL, NULL, 2, 'airag:flow:copy', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-12-29 15:27:38', NULL, NULL, 0, 0, '1', 0);\n\n-- 添加mcp示例\nINSERT INTO `airag_mcp` (`id`, `icon`, `name`, `descr`, `category`, `type`, `endpoint`, `headers`, `tools`, `status`, `synced`, `metadata`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`) VALUES ('1998661532445491201', NULL, 'stdio命令', NULL, 'mcp', 'stdio', 'python C:/Users/Administrator/Desktop/image/main.py', '', '[{\\\"name\\\":\\\"get_time\\\",\\\"description\\\":\\\"获取当前时间\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"format\\\",\\\"description\\\":\\\"时间格式\\\"}]},{\\\"name\\\":\\\"text_process\\\",\\\"description\\\":\\\"文本处理工具\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"text\\\",\\\"description\\\":\\\"输入文本\\\",\\\"required\\\":true},{\\\"name\\\":\\\"operation\\\",\\\"description\\\":\\\"操作类型\\\"}]},{\\\"name\\\":\\\"format_data\\\",\\\"description\\\":\\\"格式化数据\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"data\\\",\\\"description\\\":\\\"原始数据\\\",\\\"required\\\":true},{\\\"name\\\":\\\"format\\\",\\\"description\\\":\\\"格式类型\\\"}]}]', 'enable', 1, '{\\\"tool_count\\\":3}', 'admin', '2025-12-10 15:50:17', 'admin', '2025-12-30 10:53:03', 'A05A01A01', NULL);\nINSERT INTO `airag_mcp` (`id`, `icon`, `name`, `descr`, `category`, `type`, `endpoint`, `headers`, `tools`, `status`, `synced`, `metadata`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`) VALUES ('2001570058113265665', NULL, '百度地图http', NULL, 'mcp', 'http', 'https://mcp.map.baidu.com/mcp?ak=', '{\\\"Accept-Version\\\":\\\"V2.6\\\"}', '[{\\\"name\\\":\\\"map_geocode\\\",\\\"description\\\":\\\"地理编码服务: 将地址解析为对应的位置坐标.地址结构越完整, 地址内容越准确, 解析的坐标精度越高.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"address\\\",\\\"description\\\":\\\"待解析的地址.最多支持84个字节.可以输入两种样式的值, 分别是：\\\\n1、标准的结构化地址信息, 如北京市海淀区上地十街十号\\\\n2、支持*路与*路交叉口描述方式, 如北一环路和阜阳路的交叉路口\\\\n第二种方式并不总是有返回结果, 只有当地址库中存在该地址描述时才有返回\\\",\\\"required\\\":true},{\\\"name\\\":\\\"city\\\",\\\"description\\\":\\\"地址所在的城市名.用于限制同名地址的检索范围, 如\\'北京市\\'\\\"},{\\\"name\\\":\\\"inarea\\\",\\\"description\\\":\\\"在哪个地区范围内进行搜索, 仅在is_china为false时有效, 需要使用对应区域的国家代码, 如\\'USA\\', 多个地区可用\\',\\'分割, 如\\'USA,PHL,CAN,MEX\\'\\\"},{\\\"name\\\":\\\"is_china\\\",\\\"description\\\":\\\"查询地是否在中国大陆以外地区, 可选值为`true`或`false`, 默认为`true`\\\"}]},{\\\"name\\\":\\\"map_reverse_geocode\\\",\\\"description\\\":\\\"逆地理编码服务: 根据纬经度坐标, 获取对应位置的地址描述, 所在行政区划, 道路以及相关POI等信息\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"latitude\\\",\\\"description\\\":\\\"纬度 (bd09ll)\\\",\\\"required\\\":true},{\\\"name\\\":\\\"longitude\\\",\\\"description\\\":\\\"经度 (bd09ll)\\\",\\\"required\\\":true}]},{\\\"name\\\":\\\"map_search_places\\\",\\\"description\\\":\\\"地点检索服务: 支持检索城市内的地点信息(最小到city级别), 也可支持圆形区域内的周边地点信息检索.\\\\n城市内检索: 检索某一城市内（目前最细到城市级别）的地点信息.\\\\n周边检索: 设置圆心和半径, 检索圆形区域内的地点信息（常用于周边检索场景）.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"query\\\",\\\"description\\\":\\\"检索关键字, 可直接使用名称或类型, 如\\'天安门\\', 且可以至多10个关键字, 用英文逗号隔开\\\",\\\"required\\\":true},{\\\"name\\\":\\\"tag\\\",\\\"description\\\":\\\"检索分类, 以中文字符输入, 如\\'美食\\', 多个分类用英文逗号隔开, 如\\'美食,购物\\'\\\"},{\\\"name\\\":\\\"region\\\",\\\"description\\\":\\\"检索的城市名称, 可为行政区划名或citycode, 格式如\\'北京市\\'或\\'131\\', 不传默认为\\'全国\\', 当is_china为false时, 该参数必传且只能传文本, 如\\'东京\\'\\\"},{\\\"name\\\":\\\"location\\\",\\\"description\\\":\\\"圆形区域检索的中心点纬经度坐标, 格式为lat,lng\\\"},{\\\"name\\\":\\\"radius\\\",\\\"description\\\":\\\"JsonIntegerSchema {description = \\\\\\\"圆形区域检索半径, 单位：米\\\\\\\" }\\\"},{\\\"name\\\":\\\"language\\\",\\\"description\\\":\\\"指定输入参数和召回参数的语言类型, 需要传入的是语言名称的英文缩写. \\\\n可选值如下: \\'zh\\'(中文) \\'en\\'(英语) \\'yue\\'(粤语) \\'wyw\\'(文言文) \\'jp\\'(日语) \\'kor\\'(韩语) \\'fra\\'(法语) \\'spa\\'(西班牙语) \\'th\\'(泰语) \\'ara\\'(阿拉伯语) \\'ru\\'(俄语) \\'pt\\'(葡萄牙语) \\'de\\'(德语) \\'it\\'(意大利语) \\'el\\'(希腊语) \\'nl\\'(荷兰语) \\'pl\\'(波兰语) \\'bul\\'(保加利亚语) \\'est\\'(爱沙尼亚语) \\'dan\\'(丹麦语) \\'fin\\'(芬兰语) \\'cs\\'(捷克语) \\'rom\\'(罗马尼亚语) \\'slo\\'(斯洛文尼亚语) \\'swe\\'(瑞典语) \\'hu\\'(匈牙利语) \\'cht\\'(繁体中文) \\'vie\\'(越南语), 不传默认为空.\\\"},{\\\"name\\\":\\\"is_china\\\",\\\"description\\\":\\\"检索地是否在中国大陆以外地区, 可选值为`true`或`false`, 默认为`true`\\\"}]},{\\\"name\\\":\\\"map_place_details\\\",\\\"description\\\":\\\"地点详情检索服务: 地点详情检索针对指定POI, 检索其相关的详情信息.\\\\n通过地点检索服务获取POI uid.使用地点详情检索功能, 传入uid, 即可检索POI详情信息, 如评分、营业时间等(不同类型POI对应不同类别详情数据).\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"uid\\\",\\\"description\\\":\\\"POI的唯一标识\\\",\\\"required\\\":true},{\\\"name\\\":\\\"is_china\\\",\\\"description\\\":\\\"查询地是否在中国大陆以外地区, 可选值为`true`或`false`, 默认为`true`\\\"}]},{\\\"name\\\":\\\"map_directions_matrix\\\",\\\"description\\\":\\\"批量算路服务: 根据起点和终点坐标计算路线规划距离和行驶时间.\\\\n批量算路目前支持驾车、骑行、步行.\\\\n步行时任意起终点之间的距离不得超过200KM, 超过此限制会返回参数错误.\\\\n驾车批量算路一次最多计算100条路线, 起终点个数之积不能超过100.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"origins\\\",\\\"description\\\":\\\"多个起点纬经度坐标, 纬度在前, 经度在后, 多个起点用|分隔\\\",\\\"required\\\":true},{\\\"name\\\":\\\"destinations\\\",\\\"description\\\":\\\"多个终点纬经度坐标, 纬度在前, 经度在后, 多个终点用|分隔\\\",\\\"required\\\":true},{\\\"name\\\":\\\"model\\\",\\\"description\\\":\\\"批量算路类型(driving, riding, walking)\\\"}]},{\\\"name\\\":\\\"map_directions\\\",\\\"description\\\":\\\"路线规划服务: 根据起终点`位置名称`或`纬经度坐标`规划出行路线.\\\\n驾车路线规划: 根据起终点`位置名称`或`纬经度坐标`规划驾车出行路线.\\\\n骑行路线规划: 根据起终点`位置名称`或`纬经度坐标`规划骑行出行路线.\\\\n步行路线规划: 根据起终点`位置名称`或`纬经度坐标`规划步行出行路线.\\\\n公交路线规划: 根据起终点`位置名称`或`纬经度坐标`规划公共交通出行路线.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"model\\\",\\\"description\\\":\\\"路线规划类型(driving, riding, walking, transit)\\\"},{\\\"name\\\":\\\"origin\\\",\\\"description\\\":\\\"起点位置名称或纬经度坐标, 纬度在前, 经度在后\\\",\\\"required\\\":true},{\\\"name\\\":\\\"destination\\\",\\\"description\\\":\\\"终点位置名称或纬经度坐标, 纬度在前, 经度在后\\\",\\\"required\\\":true},{\\\"name\\\":\\\"is_china\\\",\\\"description\\\":\\\"查询地是否在中国(含香港,澳门;不包含台湾)以外地区, 可选值为`true`或`false`, 默认为`true`\\\"}]},{\\\"name\\\":\\\"map_weather\\\",\\\"description\\\":\\\"天气查询服务: 通过行政区划或是经纬度坐标查询实时天气信息及未来5天天气预报.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"location\\\",\\\"description\\\":\\\"经纬度坐标, 经度在前纬度在后, 逗号分隔\\\"},{\\\"name\\\":\\\"district_id\\\",\\\"description\\\":\\\"行政区划代码, 需保证为6位无符号整数\\\"},{\\\"name\\\":\\\"is_china\\\",\\\"description\\\":\\\"查询地是否在中国大陆以外地区, 可选值为`true`或`false`, 默认为`true`\\\"}]},{\\\"name\\\":\\\"map_ip_location\\\",\\\"description\\\":\\\"IP定位服务: 通过所给IP获取具体位置信息和城市名称, 可用于定位IP或用户当前位置.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"ip\\\",\\\"description\\\":\\\"需要定位的IP地址, 如果为空则获取用户当前IP地址(支持IPv4和IPv6)\\\"}]},{\\\"name\\\":\\\"map_road_traffic\\\",\\\"description\\\":\\\"实时路况查询服务: 查询实时交通拥堵情况, 可通过指定道路名和区域形状(矩形, 多边形, 圆形)进行实时路况查询.\\\\n道路实时路况查询: 查询具体道路的实时拥堵评价和拥堵路段、拥堵距离、拥堵趋势等信息.\\\\n矩形区域实时路况查询: 查询指定矩形地理范围的实时拥堵情况和各拥堵路段信息.\\\\n多边形区域实时路况查询: 查询指定多边形地理范围的实时拥堵情况和各拥堵路段信息.\\\\n圆形区域(周边)实时路况查询: 查询某中心点周边半径范围内的实时拥堵情况和各拥堵路段信息.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"model\\\",\\\"description\\\":\\\"路况查询类型(road, bound, polygon, around)\\\",\\\"required\\\":true},{\\\"name\\\":\\\"road_name\\\",\\\"description\\\":\\\"道路名称和道路方向, model=road时必传 (如:朝阳路南向北)\\\"},{\\\"name\\\":\\\"city\\\",\\\"description\\\":\\\"城市名称或城市adcode, model=road时必传 (如:北京市)\\\"},{\\\"name\\\":\\\"bounds\\\",\\\"description\\\":\\\"区域左下角和右上角的纬经度坐标, 纬度在前, 经度在后, model=bound时必传\\\"},{\\\"name\\\":\\\"vertexes\\\",\\\"description\\\":\\\"多边形区域的顶点纬经度坐标, 纬度在前, 经度在后, model=polygon时必传\\\"},{\\\"name\\\":\\\"center\\\",\\\"description\\\":\\\"圆形区域的中心点纬经度坐标, 纬度在前, 经度在后, model=around时必传\\\"},{\\\"name\\\":\\\"radius\\\",\\\"description\\\":\\\"JsonIntegerSchema {description = \\\\\\\"圆形区域的半径(米), 取值[1,1000], model=around时必传\\\\\\\" }\\\"}]},{\\\"name\\\":\\\"map_search_pro\\\",\\\"description\\\":\\\"多维检索服务: 提供对用户自然语言查询的多定语多维度检索, 支持模糊匹配和语义理解.\\\\n仅在需求模糊的场景下再做优先使用, 可检索行政区划、道路、门址、POI、AOI等GIS信息. 参考示例: “可以带狗的餐厅”, “适合自驾的旅游景点”类的复杂泛搜.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"query\\\",\\\"description\\\":\\\"检索关键字, 用户输入的搜索词, 如\\'宠物友好餐厅\\'\\\",\\\"required\\\":true},{\\\"name\\\":\\\"region\\\",\\\"description\\\":\\\"检索区域, 指定的城市或区域名称, 如\\'北京市\\'\\\",\\\"required\\\":true},{\\\"name\\\":\\\"type\\\",\\\"description\\\":\\\"检索类型, 需要对query的召回结果进行二次筛选时指定, 如\\'餐厅\\'、\\'酒店\\'等用于限制类型, 如\\'火锅\\'、\\'民宿\\'等用于提供泛搜类型, \\\"},{\\\"name\\\":\\\"center\\\",\\\"description\\\":\\\"检索的中心点, 格式为\\'纬度,经度\\', 用于指定检索的中心位置, 用于辅助检索结果按距离排序与返回\\\"}]},{\\\"name\\\":\\\"map_district_search\\\",\\\"description\\\":\\\"行政区划检索服务: 查询行政区划信息, 可根据用户输入的检索行政区划关键字快速查找目标行政区域adcode、边界坐标、下一级子行政区划名称等信息.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"keyword\\\",\\\"description\\\":\\\"检索关键字, 用户输入的行政区划名称, 关键字可填写：行政区名称（\\'中华人民共和国\\'\\'中国\\'\\'全国\\'\\'河北省\\'\\'深圳市\\'，省、市、区和镇名称）以及 adcode\\\",\\\"required\\\":true},{\\\"name\\\":\\\"boundary\\\",\\\"description\\\":\\\"是否返回行政区划边界信息, 取值为\\'1\\'表示返回, \\'0\\'表示不返回, 默认为\\'0\\'\\\"}]},{\\\"name\\\":\\\"map_uri\\\",\\\"description\\\":\\\"地图调起服务: 生成百度地图调起链接, 支持路线规划和地点检索两种功能. 通过service参数决定使用哪种功能.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"service\\\",\\\"description\\\":\\\"服务类型, 可选值: \\'direction\\'(路线规划) 或 \\'search\\'(地点检索)\\\",\\\"required\\\":true},{\\\"name\\\":\\\"origin\\\",\\\"description\\\":\\\"起点的名称和经纬度, 当service为\\'direction\\'时使用. 格式: name:天安门|latlng:39.98871,116.43234. 名称只作为展示, 不进行实际搜索\\\"},{\\\"name\\\":\\\"destination\\\",\\\"description\\\":\\\"终点的名称和经纬度, 当service为\\'direction\\'时使用. 格式同origin\\\"},{\\\"name\\\":\\\"mode\\\",\\\"description\\\":\\\"导航模式, 当service为\\'direction\\'时使用. 可选值: \\'transit\\'(公交)、\\'driving\\'(驾车)、\\'walking\\'(步行), 默认为\\'driving\\'\\\"},{\\\"name\\\":\\\"region\\\",\\\"description\\\":\\\"城市名或县名. 当service为\\'direction\\'且给定region时, 认为起点和终点都在同一城市, 除非单独给定起点或终点的城市\\\"},{\\\"name\\\":\\\"origin_region\\\",\\\"description\\\":\\\"起点所在的城市名, 当service为\\'direction\\'时使用. 如果未提供且origin包含坐标, 将自动通过逆地理编码获取\\\"},{\\\"name\\\":\\\"destination_region\\\",\\\"description\\\":\\\"终点所在的城市名, 当service为\\'direction\\'时使用. 如果未提供且destination包含坐标, 将自动通过逆地理编码获取\\\"},{\\\"name\\\":\\\"query\\\",\\\"description\\\":\\\"检索关键字, 当service为\\'search\\'时使用. 如\\'海底捞\\'\\\"},{\\\"name\\\":\\\"location\\\",\\\"description\\\":\\\"检索中心点经纬度, 当service为\\'search\\'时使用. 格式: 纬度,经度\\\"},{\\\"name\\\":\\\"radius\\\",\\\"description\\\":\\\"检索半径(米), 当service为\\'search\\'时使用. 如\\'1000\\'\\\"}]},{\\\"name\\\":\\\"map_mark\\\",\\\"description\\\":\\\"根据旅游规划生成地图规划展示, 当根据用户的需求申城完旅游规划后, 在给用户详细讲解旅游规划的同时, 也需要使用该工具生成旅游规划地图. 该工具只会生成一个分享用的url, 并对针对该url生成一个二维码便于用户分享.\\\",\\\"parameters\\\":[{\\\"name\\\":\\\"text_content\\\",\\\"description\\\":\\\"旅行规划的文本描述(注意避免传入特殊字符, 如\\\\\\\\等)\\\",\\\"required\\\":true}]}]', 'enable', 1, '{\\\"tool_count\\\":13}', 'admin', '2025-12-18 16:27:44', 'admin', '2025-12-30 14:02:40', 'A05A01A01', NULL);\nINSERT INTO `airag_app` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `name`, `descr`, `icon`, `type`, `prologue`, `prompt`, `model_id`, `knowledge_ids`, `flow_id`, `status`, `msg_num`, `metadata`, `preset_question`, `quick_command`, `plugins`, `memory_id`) VALUES ('2005822433573355521', 'admin', '2025-12-30 10:05:09', 'admin', '2025-12-30 10:52:57', 'A05A01A01', NULL, '示例_stdio', NULL, NULL, 'chatSimple', '', '# 输出格式\\n调用的是哪个工具', '1897481367743143938', '', NULL, 'enable', 1, '{\\\"modelInfo\\\":{\\\"provider\\\":\\\"DEEPSEEK\\\",\\\"modelType\\\":\\\"LLM\\\",\\\"modelName\\\":\\\"deepseek-chat\\\"}}', '[]', NULL, '[{\\\"pluginId\\\":\\\"1998661532445491201\\\",\\\"pluginName\\\":\\\"stdio命令\\\",\\\"category\\\":\\\"mcp\\\"}]', NULL);\nINSERT INTO `airag_app` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `name`, `descr`, `icon`, `type`, `prologue`, `prompt`, `model_id`, `knowledge_ids`, `flow_id`, `status`, `msg_num`, `metadata`, `preset_question`, `quick_command`, `plugins`, `memory_id`) VALUES ('2005851112374419457', 'admin', '2025-12-30 11:59:07', 'admin', '2025-12-30 14:02:22', 'A05A01A01', NULL, '智能路况分析_示例HTTP', NULL, '', 'chatSimple', '', '# 角色：智能路况分析师\\n你是一位专业的城市交通与路况分析专家，致力于为用户提供实时、准确、可行动的路况信息与出行建议。\\n\\n## 目标：\\n1. 为用户提供其指定区域或路线的实时交通状况分析。\\n2. 基于当前和历史数据，预测未来短时间内的交通趋势，并提供最优出行方案。\\n\\n## 技能：\\n1. **实时路况解析**：能够解读交通流量、拥堵指数、事故报告、施工封路等实时数据。\\n2. **路径规划优化**：精通多种出行方式（驾车、公交、骑行、步行）的路线规划，能根据实时路况动态调整推荐路线。\\n3. **交通预测与预警**：结合时间、天气、节假日等因素，预测未来15-60分钟的交通变化，并提前预警潜在拥堵点。\\n4. **简明信息传达**：能将复杂的交通数据转化为清晰、易懂的语言描述和行动建议。\\n\\n## 工作流：\\n1. **信息接收与确认**：首先向用户问好，并主动询问或确认需要分析的具体区域、路线、出行方式及出发/到达时间。\\n2. **数据整合与分析**：（模拟）调用实时路况数据库，分析用户关切区域的拥堵等级（畅通/缓行/拥堵/严重拥堵）、关键事件（事故、施工、管制）及对通行的影响。\\n3. **方案生成与对比**：基于分析结果，为用户提供至少两条可行的出行方案（如不同路线、错峰建议、换乘方案），并清晰对比各方案的预计耗时、拥堵路段及优缺点。\\n4. **总结与建议**：给出明确的总结性建议（如“推荐方案A”），并提醒用户注意关键路段或事件。最后询问用户是否还有其他需求。\\n5.   调用 maps 工具，获取实时路况。\\n\\n## 输出格式：\\n你的回答应采用清晰的结构化格式，例如：\\n**【当前路况概要】**：[用一两句话概括目标区域整体状态]\\n**【详细分析】**：\\n- **主要拥堵点**：[位置及原因，如“XX大桥南向北，因事故车多缓行”]\\n- **事件影响**：[如有，说明事件类型、位置及预计恢复时间]\\n- **通行建议**：[针对上述情况的驾驶提示]\\n**【出行方案推荐】**：\\n1. **方案一（推荐）**：[路线简述]\\n- 预计耗时：[X分钟]\\n- 主要路况：[描述沿途关键节点状态]\\n- 优点：[如路程最短、最稳定]\\n- 注意：[如“需在YY路口提前变道”]\\n2. **方案二（备选）**：[路线简述]\\n- 预计耗时：[Y分钟]\\n- ...（结构同方案一）\\n**【温馨提示】**：[如天气影响、错峰出行建议等补充信息]\\n\\n## 限制：\\n- **数据真实性**：所有路况描述需基于通用的交通规律进行合理推断与模拟，若涉及具体实时数据需注明“根据典型情况模拟”或使用[典型状况]标记，严禁编造不存在的实时事件。\\n- **安全与合规**：提供的建议必须符合交通安全法规，不得推荐危险驾驶行为（如超速、违章变道）。\\n- **范围聚焦**：优先处理用户明确提出的区域或路线问题。若用户问题过于宽泛（如“全国路况”），应引导其缩小范围至具体城市或道路。\\n- **隐私保护**：不询问、不记录、不推断任何可能涉及用户个人隐私的信息（如家庭住址、常用行程）。', '1890232564262739969', '', NULL, 'enable', 1, '{\\\"modelInfo\\\":{\\\"provider\\\":\\\"OPENAI\\\",\\\"modelType\\\":\\\"LLM\\\",\\\"modelName\\\":\\\"gpt-4o\\\"}}', '[{\\\"key\\\":1,\\\"sort\\\":1,\\\"descr\\\":\\\"北京朝阳区奥林佳泰大厦到北京海淀区育新花园的路况\\\",\\\"update\\\":true}]', NULL, '[{\\\"pluginId\\\":\\\"2001570058113265665\\\",\\\"pluginName\\\":\\\"百度地图http\\\",\\\"category\\\":\\\"mcp\\\"}]', NULL);\n\n\n-- 修改模板菜单\nUPDATE `sys_permission` SET `component` = 'super/airag/wordtpl/EoaWordTemplateList',url='/airag/word' WHERE `id` = '2025070908023480210';\n-- ai生成word的时候 table可能生成有问题，修改一下提示词\nUPDATE `airag_flow` SET `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'215734195065536512\\'),\\n    enhanceJava.tag(\\'215740280715427840\\'),\\n    end.tag(\\'215735188368998400\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":404,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"个人简介\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"profile\\\",\\\"name\\\":\\\"基础信息\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"height\\\":92,\\\"width\\\":332}},{\\\"id\\\":\\\"215734195065536512\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":746,\\\"y\\\":404,\\\"properties\\\":{\\\"text\\\":\\\"生成word文档\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"你必须只输出合法且可被 java中的JSON.parse() 正确解析的 JSON。\\\\n不要输出任何解释、注释或 JSON 以外的文字。\\\\nJSON 结构规则:\\\\n- 每个对象表示一个内容块。\\\\n- 标题样式需要加粗\\\\n- 每个对象需要用英文符号,禁止使用中文符号,\\\\\\\"key\\\\\\\"必须存在,\\\\\\\"value\\\\\\\"可以为空字符串正确用法 `{ \\\\\\\"key\\\\\\\": \\\\\\\"value\\\\\\\" }`\\\\n- 字段说明：\\\\n• \\\\\\\"type\\\\\\\"：内容类型，可选：\\\\\\\"title\\\\\\\"（标题）、\\\\\\\"list\\\\\\\"（列表）、\\\\\\\"separator\\\\\\\"（分隔线）、\\\\\\\"hyperlink\\\\\\\"（超链接）、\\\\\\\"pageBreak\\\\\\\"（分页符）、\\\\\\\"tab\\\\\\\"（制表符）、\\\\\\\"\\\\\\\"（普通文本）、\\\\\\\"superscript\\\\\\\"（上标）、\\\\\\\"subscript\\\\\\\"（下标）、\\\\\\\"table\\\\\\\"（表格）。\\\\n• \\\\\\\"level\\\\\\\"：标题层级，仅当 type 为 \\\\\\\"title\\\\\\\" 时使用，取值：\\\\\\\"first\\\\\\\" ~ \\\\\\\"sixth\\\\\\\"。\\\\n• \\\\\\\"value\\\\\\\"：文本、图片地址、超链接等。\\\\n• \\\\\\\"valueList\\\\\\\"：数组，用于标题、列表、超链接等，数组元素支持 \\\\\\\"value\\\\\\\" 及样式字段。\\\\n• \\\\\\\"listType\\\\\\\"：列表类型，取值：\\\\\\\"ul\\\\\\\"（无序）、\\\\\\\"ol\\\\\\\"（有序）。\\\\n• \\\\\\\"listStyle\\\\\\\"：列表样式，如 \\\\\\\"disc\\\\\\\"、\\\\\\\"decimal\\\\\\\"、\\\\\\\"circle\\\\\\\"、\\\\\\\"square\\\\\\\"、\\\\\\\"checkbox\\\\\\\"。\\\\n• \\\\\\\"trList\\\\\\\"、\\\\\\\"colgroup\\\\\\\"：表格行列定义，仅用于 \\\\\\\"table\\\\\\\",\\\\\\\"width\\\\\\\"为总宽度,\\\\\\\"height\\\\\\\"为总高度,\\\\\\\"colgroup\\\\\\\"是个数组，每个对象中的\\\\\\\"width\\\\\\\"代表每列的宽度,\\\\\\\"id\\\\\\\"为随机数。\\\\n• \\\\\\\"trList\\\\\\\"中的\\\\\\\"height\\\\\\\"必填,如\\\\\\\"trList\\\\\\\": [{\\\\\\\"height\\\\\\\": 42,tdList:[{}]}}];\\\\\\\"colspan\\\\\\\"为表格跨列,\\\\\\\"rowspan\\\\\\\"为表格跨行，tdList\\\\\\\"为每个表格的选项配置。\\\\\\\"colspan\\\\\\\"和\\\\\\\"rowspan\\\\\\\"必填，默认值为1\\\\n• 样式字段：\\\\\\\"font\\\\\\\"、\\\\\\\"size\\\\\\\"、\\\\\\\"bold\\\\\\\"、\\\\\\\"color\\\\\\\"、\\\\\\\"italic\\\\\\\"、\\\\\\\"highlight\\\\\\\"、\\\\\\\"underline\\\\\\\"、\\\\\\\"strikeout\\\\\\\"。\\\\n• \\\\\\\"dashArray\\\\\\\"：用于 \\\\\\\"separator\\\\\\\"。\\\\n• 其他样式字段：\\\\\\\"rowFlex\\\\\\\"（\\\\\\\"left\\\\\\\"、\\\\\\\"center\\\\\\\"、\\\\\\\"right\\\\\\\"、\\\\\\\"alignment\\\\\\\"）、\\\\\\\"backgroundColor\\\\\\\"、\\\\\\\"verticalAlign\\\\\\\"、\\\\\\\"textDecoration\\\\\\\"。\\\\n- 当 type = \\\\\\\"title\\\\\\\" 时，\\\\\\\"value\\\\\\\" 必须以 \\\\\\\"\\\\\\\\n\\\\\\\" 结尾。\\\\n- 主动换行请使用 `{ \\\\\\\"type\\\\\\\": \\\\\\\"\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"\\\\\\\\n\\\\\\\" }`，不同对象之间不会自动换行。\\\\n输出必须严格是 JSON 数组，例如:\\\\n[\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"title\\\\\\\",\\\\n        \\\\\\\"level\\\\\\\": \\\\\\\"first\\\\\\\",\\\\n        \\\\\\\"valueList\\\\\\\": [\\\\n            {\\\\n                \\\\\\\"value\\\\\\\": \\\\\\\"示例文档 \\\\\\\\n\\\\\\\",\\\\n                \\\\\\\"font\\\\\\\": \\\\\\\"微软雅黑\\\\\\\",\\\\n                \\\\\\\"size\\\\\\\": 24,\\\\n                \\\\\\\"bold\\\\\\\": true\\\\n            }\\\\n        ]\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"\\\\\\\",\\\\n        \\\\\\\"value\\\\\\\": \\\\\\\"这是一个演示各种格式的段落。\\\\\\\"\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"\\\\\\\",\\\\n        \\\\\\\"value\\\\\\\": \\\\\\\"\\\\\\\\n\\\\\\\"\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"title\\\\\\\",\\\\n        \\\\\\\"level\\\\\\\": \\\\\\\"second\\\\\\\",\\\\n        \\\\\\\"valueList\\\\\\\": [\\\\n            {\\\\n                \\\\\\\"value\\\\\\\": \\\\\\\"无序列表示例 \\\\\\\\n\\\\\\\",\\\\n                \\\\\\\"font\\\\\\\": \\\\\\\"宋体\\\\\\\",\\\\n                \\\\\\\"size\\\\\\\": 18,\\\\n                \\\\\\\"bold\\\\\\\": true\\\\n            }\\\\n        ]\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"list\\\\\\\",\\\\n        \\\\\\\"listType\\\\\\\": \\\\\\\"ul\\\\\\\",\\\\n        \\\\\\\"listStyle\\\\\\\": \\\\\\\"disc\\\\\\\",\\\\n        \\\\\\\"valueList\\\\\\\": [\\\\n            {\\\\n                \\\\\\\"value\\\\\\\": \\\\\\\"第一项\\\\\\\"\\\\n            },\\\\n            {\\\\n                \\\\\\\"value\\\\\\\": \\\\\\\"第二项\\\\\\\"\\\\n            }\\\\n        ]\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"title\\\\\\\",\\\\n        \\\\\\\"level\\\\\\\": \\\\\\\"second\\\\\\\",\\\\n        \\\\\\\"valueList\\\\\\\": [\\\\n            {\\\\n                \\\\\\\"value\\\\\\\": \\\\\\\"有序列表示例 \\\\\\\\n\\\\\\\"\\\\n            }\\\\n        ]\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"list\\\\\\\",\\\\n        \\\\\\\"listType\\\\\\\": \\\\\\\"ol\\\\\\\",\\\\n        \\\\\\\"listStyle\\\\\\\": \\\\\\\"decimal\\\\\\\",\\\\n        \\\\\\\"valueList\\\\\\\": [\\\\n            {\\\\n                \\\\\\\"value\\\\\\\": \\\\\\\"步骤一\\\\\\\"\\\\n            },\\\\n            {\\\\n                \\\\\\\"value\\\\\\\": \\\\\\\"步骤二\\\\\\\"\\\\n            }\\\\n        ]\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"separator\\\\\\\",\\\\n        \\\\\\\"dashArray\\\\\\\": \\\\\\\"2 4\\\\\\\"\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"\\\\\\\",\\\\n        \\\\\\\"value\\\\\\\": \\\\\\\"\\\\\\\\n\\\\\\\"\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"title\\\\\\\",\\\\n        \\\\\\\"level\\\\\\\": \\\\\\\"second\\\\\\\",\\\\n        \\\\\\\"valueList\\\\\\\": [\\\\n            {\\\\n                \\\\\\\"value\\\\\\\": \\\\\\\"表格示例 \\\\\\\\n\\\\\\\"\\\\n            }\\\\n        ]\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"table\\\\\\\",\\\\n        \\\\\\\"id\\\\\\\": \\\\\\\"550e8400-e29b-41d4-a716-446655440000\\\\\\\",\\\\n        \\\\\\\"width\\\\\\\": 400,\\\\n        \\\\\\\"height\\\\\\\": 120,\\\\n        \\\\\\\"colgroup\\\\\\\": [\\\\n            {\\\\n                \\\\\\\"width\\\\\\\": 200\\\\n            },\\\\n            {\\\\n                \\\\\\\"width\\\\\\\": 200\\\\n            }\\\\n        ],\\\\n        \\\\\\\"trList\\\\\\\": [\\\\n            {\\\\n                \\\\\\\"height\\\\\\\": 40,\\\\n                \\\\\\\"tdList\\\\\\\": [\\\\n                    {\\\\n                       \\\\\\\"colspan\\\\\\\": 1,\\\\n                        \\\\\\\"rowspan\\\\\\\": 1,\\\\n                        \\\\\\\"value\\\\\\\": [\\\\n                            {\\\\n                                \\\\\\\"value\\\\\\\": \\\\\\\"姓名\\\\\\\",\\\\n                                \\\\\\\"bold\\\\\\\": true,\\\\n                                \\\\\\\"rowFlex\\\\\\\": \\\\\\\"center\\\\\\\"\\\\n                            }\\\\n                        ]\\\\n                    },\\\\n                    {\\\\n                       \\\\\\\"colspan\\\\\\\": 1,\\\\n                        \\\\\\\"rowspan\\\\\\\": 1,\\\\n                        \\\\\\\"value\\\\\\\": [\\\\n                            {\\\\n                                \\\\\\\"value\\\\\\\": \\\\\\\"年龄\\\\\\\",\\\\n                                \\\\\\\"bold\\\\\\\": true,\\\\n                                \\\\\\\"rowFlex\\\\\\\": \\\\\\\"center\\\\\\\"\\\\n                            }\\\\n                        ]\\\\n                    }\\\\n                ]\\\\n            },\\\\n            {\\\\n                \\\\\\\"height\\\\\\\": 40,\\\\n                \\\\\\\"tdList\\\\\\\": [\\\\n                    {\\\\n                       \\\\\\\"colspan\\\\\\\": 1,\\\\n                        \\\\\\\"rowspan\\\\\\\": 1,\\\\n                        \\\\\\\"value\\\\\\\": [\\\\n                            {\\\\n                                \\\\\\\"value\\\\\\\": \\\\\\\"张三\\\\\\\"\\\\n                            }\\\\n                        ]\\\\n                    },\\\\n                    {\\\\n                        \\\\\\\"value\\\\\\\": [\\\\n                            {\\\\n                                \\\\\\\"colspan\\\\\\\": 1,\\\\n                                \\\\\\\"rowspan\\\\\\\": 1,\\\\n                                \\\\\\\"value\\\\\\\": \\\\\\\"28\\\\\\\"\\\\n                            }\\\\n                        ]\\\\n                    }\\\\n                ]\\\\n            }\\\\n        ]\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"\\\\\\\",\\\\n        \\\\\\\"value\\\\\\\": \\\\\\\"\\\\\\\\n\\\\\\\"\\\\n    },\\\\n    {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"hyperlink\\\\\\\",\\\\n        \\\\\\\"valueList\\\\\\\": [\\\\n            {\\\\n                \\\\\\\"value\\\\\\\": \\\\\\\"点击访问示例网站\\\\\\\",\\\\n                \\\\\\\"color\\\\\\\": \\\\\\\"#165DFF\\\\\\\",\\\\n                \\\\\\\"underline\\\\\\\": true\\\\n            }\\\\n        ]\\\\n    }\\\\n]\\\\n执行步骤:\\\\n1. 根据用户需求生成json数据\\\\n2. 检查生产的json数据是否正确。如果正常，输出给用户；否则重新生成。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"请根据以上字段和示例，生成一个完整的个人简历文档 JSON。\\\\n- 至少包含基础信息、个人优势、工作经历、项目经理、教育经历等模块。\\\\n- 若基础数据不足，可以适当生成参考数据。\\\\n- 用户信息如下：\\\\n基础资料：{{base}}\\\\n简介：{{profile}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"profile\\\",\\\"name\\\":\\\"base\\\",\\\"nodeId\\\":\\\"start-node\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"profile\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":180,\\\"width\\\":332}},{\\\"id\\\":\\\"215735188368998400\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1716,\\\"y\\\":380,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"215740280715427840\\\"}],\\\"height\\\":114,\\\"width\\\":332}},{\\\"id\\\":\\\"215740280715427840\\\",\\\"type\\\":\\\"enhanceJava\\\",\\\"x\\\":1277,\\\"y\\\":404,\\\"properties\\\":{\\\"text\\\":\\\"Java 增强\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：JSON检验和修复专家\\\\n你是一位专门负责检验和修复JSON字符串的专家，确保其能被Java的`JSON.parse()`方法成功解析，并返回修复后的、可解析的JSON字符串原文。\\\\n## 目标：\\\\n1. 接收用户提供的JSON字符串，诊断其语法错误。\\\\n2. 智能修复常见的JSON格式问题（如引号缺失、尾随逗号、注释等），使其符合标准JSON规范。\\\\n3. 输出修复后的、可直接用于`JSON.parse()`的JSON字符串原文。\\\\n## 技能：\\\\n1. **深度语法分析**：精准识别JSON字符串中的语法错误位置和类型（如未闭合的引号、括号或花括号，错误的键值分隔符，非法字符等）。\\\\n2. **上下文感知修复**：根据JSON结构上下文，智能推断并应用最合理的修复方案（例如，为未加引号的键名添加双引号，移除对象或数组末尾的非法逗号）。\\\\n3. **标准合规性**：严格遵循IETF RFC 8259 JSON数据交换标准，确保输出为有效JSON。\\\\n4. **最小改动原则**：在保证修复有效的前提下，尽可能保持原始字符串的结构和意图，只修改必要的部分。\\\\n## 工作流：\\\\n1. **接收与初步检验**：接收用户输入的字符串，尝试使用`JSON.parse()`进行解析。若解析成功，则直接返回原字符串并告知其有效。\\\\n2. **错误诊断与定位**：若解析失败，捕获`SyntaxError`异常，分析错误信息以定位问题的大致位置和类型。\\\\n3. **详细扫描与修复**：逐字符扫描整个字符串，结合错误定位，系统性地检查并修复以下常见问题：\\\\n* 为未使用双引号的属性名（key）添加双引号。\\\\n* 确保所有字符串值由双引号包裹。\\\\n* 移除对象字面量`{}`或数组字面量`[]`中最后一个元素后的尾随逗号。\\\\n* 将单引号替换为双引号。\\\\n* 移除JavaScript风格的注释（`//` 单行注释， `/* */` 多行注释）。\\\\n* 转义字符串中未转义的控制字符（如换行符`\\\\\\\\n`、制表符`\\\\\\\\t`）。\\\\n* 检查并修正括号`[]`和花括号`{}`的配对与嵌套。\\\\n4. **验证与输出**：对修复后的字符串再次尝试`JSON.parse()`。若成功，则输出修复后的JSON字符串原文\\\\n## 输出格式：\\\\n- **当JSON有效时**：输出原始字符串。\\\\n- **当JSON被成功修复时**：然后换行输出修复后的JSON字符串原文。\\\\n## 限制：\\\\n- 仅处理语法错误，不验证JSON数据的业务逻辑或语义正确性。\\\\n- 对于歧义过大或结构严重损坏（如大量缺失内容）的JSON，可能无法修复，此时应清晰说明原因。\\\\n- 所有输出必须是纯文本格式，仅包含上述指定的提示信息和JSON字符串本身，不添加任何额外的Markdown代码块标记（如 ```json ```）。\\\\n- 严格遵守最小改动原则，避免对原始数据做出不必要的、可能改变其原意的修改。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{word}}\\\"}],\\\"enhance\\\":{\\\"path\\\":\\\"jeecgDemoAiWordGen\\\",\\\"type\\\":\\\"spring\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"215734195065536512\\\",\\\"customValue\\\":\\\"\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":158,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"215734195073925120\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"215734195065536512\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"215734195065536512_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":389},{\\\"x\\\":566,\\\"y\\\":389},{\\\"x\\\":480,\\\"y\\\":345},{\\\"x\\\":580,\\\"y\\\":345}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"215740398487289856\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"215740280715427840\\\",\\\"targetNodeId\\\":\\\"215735188368998400\\\",\\\"sourceAnchorId\\\":\\\"215740280715427840_output\\\",\\\"targetAnchorId\\\":\\\"215735188368998400_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1443,\\\"y\\\":356},{\\\"x\\\":1543,\\\"y\\\":356},{\\\"x\\\":1450,\\\"y\\\":354},{\\\"x\\\":1550,\\\"y\\\":354}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"268694098060951552\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"215734195065536512\\\",\\\"targetNodeId\\\":\\\"215740280715427840\\\",\\\"sourceAnchorId\\\":\\\"215734195065536512_output\\\",\\\"targetAnchorId\\\":\\\"215740280715427840_input\\\",\\\"pointsList\\\":[{\\\"x\\\":912,\\\"y\\\":345},{\\\"x\\\":1012,\\\"y\\\":345},{\\\"x\\\":1011,\\\"y\\\":356},{\\\"x\\\":1111,\\\"y\\\":356}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"resp\\\",\\\"nodeId\\\":\\\"215740280715427840\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"个人简介\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"profile\\\",\\\"name\\\":\\\"基础信息\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}' WHERE `id` = '1952634605517447170';\n\n\n-- 变量\nALTER TABLE `airag_app`\nADD COLUMN `variables` text NULL COMMENT '存放变量的配置' AFTER `memory_id`;\n\n-- 是否开启记忆和记忆提示词升级sql\nALTER TABLE `airag_app`\nADD COLUMN `iz_open_memory` int(1) NULL COMMENT '是否开启记忆(0 不开启，1开启)' AFTER `variables`,\nADD COLUMN `memory_prompt` text NULL COMMENT '记忆和变量提示词' AFTER `iz_open_memory`;\n\n-- 记忆提交示例\nINSERT INTO `airag_knowledge` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `name`, `descr`, `embed_id`, `status`, `type`) VALUES ('2004087219851522050', 'admin', '2025-12-25 15:10:02', 'admin', '2025-12-26 19:11:55', 'A05A01A01', NULL, '个人基本信息', '个人基本信息', '1891459707122499586', 'enable', 'memory');\nINSERT INTO `airag_app` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `name`, `descr`, `icon`, `type`, `prologue`, `prompt`, `model_id`, `knowledge_ids`, `flow_id`, `status`, `msg_num`, `metadata`, `preset_question`, `quick_command`, `plugins`, `memory_id`, `variables`, `iz_open_memory`, `memory_prompt`) VALUES ('2004087424994930690', 'admin', '2025-12-25 15:10:51', 'admin', '2026-01-08 10:18:34', 'A05A01A01', NULL, '记忆存储_示例', NULL, NULL, 'chatSimple', NULL, '', '1890232564262739969', '', NULL, 'enable', 1, '{\\\"modelInfo\\\":{\\\"provider\\\":\\\"OPENAI\\\",\\\"modelType\\\":\\\"LLM\\\",\\\"modelName\\\":\\\"gpt-4o\\\"}}', NULL, NULL, NULL, '2004087219851522050', NULL, 1, '【记忆库使用指南】\\n\\n本记忆库用于存储用户个人的基本信息。你必须严格遵循以下协议，将记忆功能作为后台自动化流程执行。\\n\\n【工具使用强制协议】\\n\\n一、全自动存储（无需用户指令）\\n1.  你必须时刻以观察者模式分析对话内容。\\n2.  一旦检测到符合“个人基本信息”范畴的内容，尤其是**姓名、职业、年龄**，以及联系方式、个人偏好、重要经历等，**必须立即、自动**调用 `add_memory` 工具进行存储。\\n3.  **绝对禁止**就存储行为向用户进行任何形式的询问、确认或等待用户指令。存储是你的核心后台职责，应保持无感化。\\n\\n二、全自动检索（强制优先）\\n1.  **禁止直接反问**：当用户的问题明显依赖于其个人信息时（例如：“推荐适合我的电影”、“我之前提过的那本书叫什么？”），**严禁**直接反问用户以获取信息（如：“你的爱好是什么？”）。\\n2.  **必须先查后答**：\\n    *   你必须**先假设**所需信息已存在于记忆库中。\\n    *   在回答任何依赖个人信息的问题前，**必须立即、自动**调用 `query_memory` 工具进行查询验证。\\n    *   只有在工具明确返回“未找到相关信息”或等效结果后，你才有资格向用户提问以补充信息。\\n3.  **宁可查空，不可不查**：即使你主观判断记忆库中可能没有记录，也必须强制优先执行查询流程。\\n\\n三、动态调整与行为准则\\n1.  根据当前记忆库描述（“用于存储个人的基本信息”），你应自动捕获并存储对话中出现的所有相关个人详情，包括但不限于：姓名、职业、年龄、联系方式、饮食/娱乐/阅读等偏好、居住地、工作经历、家庭构成、重要日期等。\\n2.  你的记忆操作必须是**主动且无感**的。用户仅需自然对话，你负责在后台识别、存储和调用所有重要细节。\\n3.  **禁止口头空谈**：严禁仅以“我记住了”、“已了解”等口头回应代替实际工具调用。所有存储和检索操作都必须通过工具完成，这是不可违背的行为准则。\\n\\n四、示例演示\\n*   **自动存储（职业）**：\\n    *   用户输入：“我是一名中学语文老师。”\\n    *   你的响应：(捕捉到“职业”信息) -> **立即自动调用** `add_memory(content=\\'用户职业是中学语文老师\\')` -> (收到存储成功反馈) -> 继续对话：“作为一名教育工作者，您平时……”\\n*   **自动查询（场景）**：\\n    *   用户输入：“根据我的口味推荐几家餐厅。”\\n    *   错误响应：“您有什么口味偏好？”（**严禁此行为**）\\n    *   正确流程：**必须立即自动调用** `query_memory(queryText=\\'用户饮食口味偏好\\')` -> (若查到：喜欢辣，不吃海鲜) -> 回复：“根据记录您喜辣且不吃海鲜，推荐川菜馆A和湘菜馆B……”\\n    *   正确流程（无记录时）：调用查询 -> (返回未找到) -> 回复：“为了给您更精准的推荐，可以告诉我您的口味偏好吗？比如喜辣还是清淡，有无忌口？”\\n*   **自动查询（常规）**：\\n    *   用户输入：“周末有什么活动建议？”\\n    *   你的响应：(判断可能需要了解用户爱好) -> **立即自动调用** `query_memory(queryText=\\'用户兴趣爱好或周末常做活动\\')` -> (若查到：喜欢看电影和逛公园) -> 回复：“考虑到您常看电影和逛公园，本周末有XX影展，或者Y公园正在举办花卉展……”');\n\n-- 变量示例\nINSERT INTO `airag_app` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `name`, `descr`, `icon`, `type`, `prologue`, `prompt`, `model_id`, `knowledge_ids`, `flow_id`, `status`, `msg_num`, `metadata`, `preset_question`, `quick_command`, `plugins`, `memory_id`, `variables`, `iz_open_memory`, `memory_prompt`) VALUES ('2006259233248927746', 'admin', '2025-12-31 15:00:50', 'admin', '2026-01-05 16:10:01', 'A05A01A01', NULL, '变量_示例', NULL, NULL, 'chatSimple', NULL, '# 角色\\n你是一位富有创造力的短篇故事生成器，能够根据用户提供的主题、设定或关键词，快速构思并创作出引人入胜的短篇故事。\\n\\n## 目标：\\n根据用户的输入（可能是一个词、一句话、一个场景或一组元素），生成一篇结构完整、情节有趣、人物鲜明的原创短篇故事。\\n\\n## 技能：\\n1.  **创意构思**：能够从用户有限的输入中，联想并构建出独特的故事世界观、核心冲突和人物弧光。\\n2.  **叙事技巧**：熟练运用各种叙事手法，如设置悬念、控制节奏、描绘细节，以增强故事的可读性和感染力。\\n3.  **人物塑造**：能够快速塑造出立体、有动机、能引发共鸣的故事角色。\\n4.  **风格适配**：能够根据用户暗示或明确要求，调整故事的语言风格（如悬疑、温馨、科幻、奇幻、现实主义等）。\\n\\n## 工作流：\\n1.  **解析与确认**：首先，分析用户的输入内容。如果信息模糊，会通过提问的方式与用户确认故事的关键要素，如核心主题、期望的风格、主要角色或特定场景。\\n2.  **框架构建**：基于确定的信息，快速构建故事的核心框架，包括：故事背景、主要人物及其目标、核心冲突（矛盾）、情节发展（开端-发展-高潮-结局）。\\n3.  **内容创作**：根据框架，运用生动的语言和细节进行创作。确保故事有头有尾，逻辑自洽，并在关键情节处营造足够的张力或情感冲击。\\n4.  **精炼与呈现**：完成初稿后，快速通读并进行微调，优化语言流畅度和情节衔接。最后，将完整的故事呈现给用户。\\n\\n## 输出格式：\\n- 故事标题\\n- 故事正文（段落清晰，长度通常在300-800字之间，除非用户另有指定）\\n- （可选）在故事末尾，可以附上一句简短的创作灵感说明。\\n\\n## 限制：\\n- 所有故事必须为原创内容，不得抄袭现有作品。\\n- 故事内容需符合基本伦理道德，避免包含过度暴力、色情或令人极度不适的描写。\\n- 若用户输入涉及真实人物或敏感事件，需进行虚构化处理，并避免产生误导或伤害。\\n- 不确定如何发展的情节元素，应基于故事内部逻辑进行合理创作，而非随意添加。', '1890232564262739969', '', NULL, 'enable', 1, '{\\\"modelInfo\\\":{\\\"provider\\\":\\\"OPENAI\\\",\\\"modelType\\\":\\\"LLM\\\",\\\"modelName\\\":\\\"gpt-4o\\\"}}', NULL, NULL, NULL, '', '[{\\\"name\\\":\\\"name\\\",\\\"description\\\":\\\"姓名\\\",\\\"defaultValue\\\":\\\"\\\",\\\"enable\\\":true,\\\"action\\\":\\\"\\\",\\\"orderNum\\\":0,\\\"id\\\":\\\"row_12\\\"},{\\\"name\\\":\\\"age\\\",\\\"description\\\":\\\"年龄\\\",\\\"defaultValue\\\":\\\"\\\",\\\"enable\\\":true,\\\"action\\\":\\\"\\\",\\\"orderNum\\\":1,\\\"id\\\":\\\"row_13\\\"},{\\\"name\\\":\\\"sex\\\",\\\"description\\\":\\\"性别\\\",\\\"defaultValue\\\":\\\"男\\\",\\\"enable\\\":true,\\\"action\\\":\\\"\\\",\\\"orderNum\\\":2,\\\"id\\\":\\\"row_12\\\"},{\\\"name\\\":\\\"hobby\\\",\\\"description\\\":\\\"爱好\\\",\\\"defaultValue\\\":\\\"\\\",\\\"enable\\\":true,\\\"action\\\":\\\"\\\",\\\"orderNum\\\":3}]', 1, '在对话中，请使用以下变量信息：\\n1.  回复问题时，请称呼你的用户为{{name}}。\\n2.  用户的年龄是{{age}}。\\n3.  用户的性别是{{sex}}，请在对话中适时使用。\\n4.  用户的爱好是{{hobby}}，请在对话中适时使用。\\n\\n当从用户对话中获取到上述变量（name、age、sex、hobby）的**新信息**时，**必须立即调用** `update_variable` 工具进行存储。**注意**：调用前请检查上下文，如果已调用过该工具或变量值未改变，**严禁**重复调用。');\n\n-- AI海报升级菜单\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('2008516285254000642', '1892553163993931777', 'Ai海报', '/airag/aiposter/AiPoster', 'super/airag/aiposter/AiPoster', 1, '', NULL, 1, NULL, '0', 8.00, 0, 'ant-design:file-image-filled', 1, 0, 0, 0, NULL, 'admin', '2026-01-06 20:29:33', 'admin', '2026-01-06 20:29:58', 0, 0, NULL, 0);\n\n-- 字典项增加图片模型\nINSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `item_color`) VALUES ('2008087927907045378', '1891456510739890177', '图像模型', 'IMAGE', NULL, 3, 1, 'admin', '2026-01-05 16:07:25', 'admin', '2026-01-05 16:07:31', NULL);\n\n-- 字典项简单配置修改成智能体\nUPDATE `sys_dict_item` SET `item_text` = '智能体' WHERE `id` = '1894701277019959298';\n\n\n-- 循环节点示例\nINSERT INTO `airag_flow` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `application_name`, `name`, `descr`, `icon`, `chain`, `design`, `status`, `metadata`, `trigger_cron`) VALUES ('2009558848682360834', 'admin', '2026-01-09 17:32:20', 'admin', '2026-01-09 17:40:31', 'A01', NULL, 'jeecg', '示例_循环节点', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    code_266871019099709440.tag(\\'code_266871019099709440\\'),\\n    WHILE(loop.tag(\\'266871548223741952\\')).DO(THEN(\\n        reply.tag(\\'266871664426934272\\'),\\n        loopContinue.tag(\\'272660634657742848\\')\\n    ).tag(\\\"266871664426934272\\\")),\\n    end.tag(\\'266868341815451648\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":640,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"标题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"266868341815451648\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1574,\\\"y\\\":513,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"------\\\\n测试结束\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":\\\"\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"ces\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string[]\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"code_266871019099709440\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":728,\\\"y\\\":560,\\\"properties\\\":{\\\"text\\\":\\\"JavaScript脚本\\\",\\\"options\\\":{\\\"codeType\\\":\\\"javascript\\\",\\\"code\\\":\\\"function main() {\\\\n  return {\\\\n    result: [\\\\n      \\'这是第一项\\',  \\'这是第二项\\', \\'这是第三项\\'\\\\n    ]\\\\n  }\\\\n}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"266871548223741952\\\",\\\"type\\\":\\\"loop\\\",\\\"x\\\":1153,\\\"y\\\":701,\\\"properties\\\":{\\\"text\\\":\\\"循环\\\",\\\"groupType\\\":\\\"WHILE\\\",\\\"options\\\":{\\\"type\\\":\\\"array\\\",\\\"maxLoopTimes\\\":3,\\\"loopParams\\\":[],\\\"loopItemsParam\\\":{\\\"nodeId\\\":\\\"code_266871019099709440\\\",\\\"nodeName\\\":\\\"JavaScript脚本\\\",\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string[]\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":114}},{\\\"id\\\":\\\"266871548223741952_loopBody\\\",\\\"type\\\":\\\"loopBody\\\",\\\"x\\\":1101.5,\\\"y\\\":1076.5,\\\"properties\\\":{\\\"text\\\":\\\"循环体\\\",\\\"options\\\":{},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"collapsible\\\":false,\\\"autoToFront\\\":false,\\\"transformWithContainer\\\":false,\\\"isRestrict\\\":true,\\\"autoResize\\\":true,\\\"children\\\":[\\\"266871664426934272\\\",\\\"272660634657742848\\\"],\\\"isCollapsed\\\":false,\\\"width\\\":1029,\\\"height\\\":255},\\\"children\\\":[\\\"266871664426934272\\\",\\\"272660634657742848\\\"]},{\\\"id\\\":\\\"266871664426934272\\\",\\\"type\\\":\\\"reply\\\",\\\"x\\\":873,\\\"y\\\":1107,\\\"properties\\\":{\\\"text\\\":\\\"直接回复\\\",\\\"options\\\":{\\\"content\\\":\\\"当前循环了 {{idx}} 次，当前项为：“{{item}}”\\\",\\\"stream\\\":false},\\\"inputParams\\\":[{\\\"field\\\":\\\"currentLoopTimes\\\",\\\"name\\\":\\\"idx\\\",\\\"nodeId\\\":\\\"266871548223741952\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"currentLoopItem\\\",\\\"name\\\":\\\"item\\\",\\\"nodeId\\\":\\\"266871548223741952\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"any\\\"}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":114}},{\\\"id\\\":\\\"272660634657742848\\\",\\\"type\\\":\\\"loopContinue\\\",\\\"x\\\":1330,\\\"y\\\":1080,\\\"properties\\\":{\\\"text\\\":\\\"继续循环\\\",\\\"options\\\":{},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":62}}],\\\"edges\\\":[{\\\"id\\\":\\\"266871559237984256\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"266871548223741952\\\",\\\"targetNodeId\\\":\\\"266868341815451648\\\",\\\"sourceAnchorId\\\":\\\"266871548223741952_output\\\",\\\"targetAnchorId\\\":\\\"266868341815451648_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1319,\\\"y\\\":675},{\\\"x\\\":1419,\\\"y\\\":675},{\\\"x\\\":1308,\\\"y\\\":476},{\\\"x\\\":1408,\\\"y\\\":476}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"272659834707501056\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"code_266871019099709440\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"code_266871019099709440_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":625},{\\\"x\\\":566,\\\"y\\\":625},{\\\"x\\\":462,\\\"y\\\":523},{\\\"x\\\":562,\\\"y\\\":523}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"272659914713849856\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_266871019099709440\\\",\\\"targetNodeId\\\":\\\"266871548223741952\\\",\\\"sourceAnchorId\\\":\\\"code_266871019099709440_output\\\",\\\"targetAnchorId\\\":\\\"266871548223741952_input\\\",\\\"pointsList\\\":[{\\\"x\\\":894,\\\"y\\\":523},{\\\"x\\\":994,\\\"y\\\":523},{\\\"x\\\":887,\\\"y\\\":675},{\\\"x\\\":987,\\\"y\\\":675}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"272660634661937152\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"266871664426934272\\\",\\\"targetNodeId\\\":\\\"272660634657742848\\\",\\\"sourceAnchorId\\\":\\\"266871664426934272_output\\\",\\\"targetAnchorId\\\":\\\"272660634657742848_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1039,\\\"y\\\":1081},{\\\"x\\\":1139,\\\"y\\\":1081},{\\\"x\\\":1064,\\\"y\\\":1080},{\\\"x\\\":1164,\\\"y\\\":1080}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"266871548454428672\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"266871548223741952\\\",\\\"targetNodeId\\\":\\\"266871548223741952_loopBody\\\",\\\"sourceAnchorId\\\":\\\"266871548223741952_link_body\\\",\\\"targetAnchorId\\\":\\\"266871548223741952_loopBody_link_loop\\\",\\\"pointsList\\\":[{\\\"x\\\":1153,\\\"y\\\":758},{\\\"x\\\":1153,\\\"y\\\":858},{\\\"x\\\":1101.5,\\\"y\\\":849},{\\\"x\\\":1101.5,\\\"y\\\":949}],\\\"properties\\\":{\\\"disabled\\\":true,\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"266871664435322880\\\",\\\"type\\\":\\\"base-line-edge\\\",\\\"sourceNodeId\\\":\\\"266871548223741952_loopBody\\\",\\\"targetNodeId\\\":\\\"266871664426934272\\\",\\\"sourceAnchorId\\\":\\\"266871548223741952_loopBody_loop_start\\\",\\\"targetAnchorId\\\":\\\"266871664426934272_input\\\",\\\"pointsList\\\":[],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', 'enable', '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"ces\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"type\\\":\\\"string[]\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"标题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', '');\n\n-- 变量聚合示例\nINSERT INTO `airag_flow` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `application_name`, `name`, `descr`, `icon`, `chain`, `design`, `status`, `metadata`, `trigger_cron`) VALUES ('2009561652150960129', 'admin', '2026-01-09 17:43:28', 'admin', '2026-01-09 17:45:17', 'A01', NULL, 'jeecg', '示例_变量聚合', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'264299940450762752\\')).to(\\n        THEN(\\n            code_264301155456745472.tag(\\'code_264301155456745472\\'),\\n            varMerge.tag(\\'264298765684932608\\'),\\n            end.tag(\\'264295300867915776\\')\\n        ).tag(\\\"code_264301155456745472\\\"),\\n        THEN(\\n            code_264301257571270656.tag(\\'code_264301257571270656\\'),\\n            varMerge.tag(\\'264298765684932608\\'),\\n            end.tag(\\'264295300867915776\\')\\n        ).tag(\\\"code_264301257571270656\\\"),\\n        THEN(\\n            code_264300177714151424.tag(\\'code_264300177714151424\\'),\\n            varMerge.tag(\\'264298765684932608\\'),\\n            end.tag(\\'264295300867915776\\')\\n        ).tag(\\\"code_264300177714151424\\\"),\\n        end.tag(\\'264302394055688192\\')\\n    ).tag(\\'264299940450762752\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":44,\\\"y\\\":535,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"姓名\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"264295300867915776\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1908,\\\"y\\\":669,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"查询完毕\\\\n姓名： {{姓名}}\\\\n年龄：{{年龄}}\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"姓名\\\",\\\"name\\\":\\\"姓名\\\",\\\"nodeId\\\":\\\"264298765684932608\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"年龄\\\",\\\"name\\\":\\\"年龄\\\",\\\"nodeId\\\":\\\"264298765684932608\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"264298765684932608\\\",\\\"type\\\":\\\"varMerge\\\",\\\"x\\\":1492,\\\"y\\\":571,\\\"properties\\\":{\\\"text\\\":\\\"变量聚合\\\",\\\"options\\\":{\\\"varGroups\\\":[{\\\"name\\\":\\\"姓名\\\",\\\"type\\\":\\\"string\\\",\\\"vars\\\":[{\\\"nodeId\\\":\\\"code_264301257571270656\\\",\\\"field\\\":\\\"name\\\",\\\"isCustom\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"nodeId\\\":\\\"code_264301155456745472\\\",\\\"field\\\":\\\"name\\\",\\\"isCustom\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"nodeId\\\":\\\"code_264300177714151424\\\",\\\"field\\\":\\\"name\\\",\\\"isCustom\\\":false,\\\"type\\\":\\\"string\\\"}]},{\\\"name\\\":\\\"年龄\\\",\\\"type\\\":\\\"number\\\",\\\"vars\\\":[{\\\"nodeId\\\":\\\"code_264301257571270656\\\",\\\"field\\\":\\\"age\\\",\\\"isCustom\\\":false,\\\"type\\\":\\\"number\\\"},{\\\"nodeId\\\":\\\"code_264301155456745472\\\",\\\"field\\\":\\\"age\\\",\\\"isCustom\\\":false,\\\"type\\\":\\\"number\\\"},{\\\"nodeId\\\":\\\"code_264300177714151424\\\",\\\"field\\\":\\\"age\\\",\\\"isCustom\\\":false,\\\"type\\\":\\\"number\\\"}]}]},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"姓名\\\",\\\"name\\\":\\\"姓名\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"年龄\\\",\\\"name\\\":\\\"年龄\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":114}},{\\\"id\\\":\\\"264299940450762752\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":443,\\\"y\\\":497,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"张三\\\",\\\"type\\\":\\\"string\\\"}],\\\"next\\\":\\\"code_264301257571270656\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"李四\\\",\\\"type\\\":\\\"string\\\"}],\\\"next\\\":\\\"code_264301155456745472\\\"},{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"operator\\\":\\\"EQUALS\\\",\\\"value\\\":\\\"王五\\\",\\\"type\\\":\\\"string\\\"}],\\\"next\\\":\\\"code_264300177714151424\\\"}],\\\"else\\\":{\\\"next\\\":\\\"264302394055688192\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":170}},{\\\"id\\\":\\\"code_264300177714151424\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":938,\\\"y\\\":768,\\\"properties\\\":{\\\"text\\\":\\\"查询王五\\\",\\\"options\\\":{\\\"codeType\\\":\\\"javascript\\\",\\\"code\\\":\\\"function main() {\\\\n  return {\\\\n    name: \\\\\\\"王五\\\\\\\",\\\\n    age: 18,\\\\n  }\\\\n}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"name\\\",\\\"name\\\":\\\"姓名\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"age\\\",\\\"name\\\":\\\"年龄\\\",\\\"type\\\":\\\"number\\\",\\\"required\\\":false}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"code_264301155456745472\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":938,\\\"y\\\":559,\\\"properties\\\":{\\\"text\\\":\\\"查询李四\\\",\\\"options\\\":{\\\"codeType\\\":\\\"javascript\\\",\\\"code\\\":\\\"function main() {\\\\n  return {\\\\n    name: \\\\\\\"李四\\\\\\\",\\\\n    age: 23,\\\\n  }\\\\n}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"name\\\",\\\"name\\\":\\\"姓名\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"age\\\",\\\"name\\\":\\\"年龄\\\",\\\"type\\\":\\\"number\\\",\\\"required\\\":false}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"code_264301257571270656\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":937,\\\"y\\\":346,\\\"properties\\\":{\\\"text\\\":\\\"查询张三\\\",\\\"options\\\":{\\\"codeType\\\":\\\"javascript\\\",\\\"code\\\":\\\"function main() {\\\\n  return {\\\\n    name: \\\\\\\"张三\\\\\\\",\\\\n    age: 33,\\\\n  }\\\\n}\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"name\\\",\\\"name\\\":\\\"姓名\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"age\\\",\\\"name\\\":\\\"年龄\\\",\\\"type\\\":\\\"number\\\",\\\"required\\\":false}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"264302394055688192\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":936,\\\"y\\\":992,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"抱歉，我不知道你说的是谁\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"name\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}}],\\\"edges\\\":[{\\\"id\\\":\\\"264299940454957056\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"264299940450762752\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"264299940450762752_input\\\",\\\"pointsList\\\":[{\\\"x\\\":210,\\\"y\\\":520},{\\\"x\\\":310,\\\"y\\\":520},{\\\"x\\\":177,\\\"y\\\":443},{\\\"x\\\":277,\\\"y\\\":443}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"264300208160604160\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_264300177714151424\\\",\\\"targetNodeId\\\":\\\"264298765684932608\\\",\\\"sourceAnchorId\\\":\\\"code_264300177714151424_output\\\",\\\"targetAnchorId\\\":\\\"264298765684932608_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1104,\\\"y\\\":731},{\\\"x\\\":1204,\\\"y\\\":731},{\\\"x\\\":1226,\\\"y\\\":545},{\\\"x\\\":1326,\\\"y\\\":545}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"264300340352483328\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"264298765684932608\\\",\\\"targetNodeId\\\":\\\"264295300867915776\\\",\\\"sourceAnchorId\\\":\\\"264298765684932608_output\\\",\\\"targetAnchorId\\\":\\\"264295300867915776_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1658,\\\"y\\\":545},{\\\"x\\\":1758,\\\"y\\\":545},{\\\"x\\\":1642,\\\"y\\\":632},{\\\"x\\\":1742,\\\"y\\\":632}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"264301239456071680\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_264301155456745472\\\",\\\"targetNodeId\\\":\\\"264298765684932608\\\",\\\"sourceAnchorId\\\":\\\"code_264301155456745472_output\\\",\\\"targetAnchorId\\\":\\\"264298765684932608_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1104,\\\"y\\\":522},{\\\"x\\\":1204,\\\"y\\\":522},{\\\"x\\\":1226,\\\"y\\\":545},{\\\"x\\\":1326,\\\"y\\\":545}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"264301250365456384\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"264299940450762752\\\",\\\"targetNodeId\\\":\\\"code_264301155456745472\\\",\\\"sourceAnchorId\\\":\\\"264299940450762752_case_2\\\",\\\"targetAnchorId\\\":\\\"code_264301155456745472_input\\\",\\\"pointsList\\\":[{\\\"x\\\":609,\\\"y\\\":503},{\\\"x\\\":709,\\\"y\\\":503},{\\\"x\\\":672,\\\"y\\\":522},{\\\"x\\\":772,\\\"y\\\":522}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"264301299698860032\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"264299940450762752\\\",\\\"targetNodeId\\\":\\\"code_264301257571270656\\\",\\\"sourceAnchorId\\\":\\\"264299940450762752_source_if\\\",\\\"targetAnchorId\\\":\\\"code_264301257571270656_input\\\",\\\"pointsList\\\":[{\\\"x\\\":609,\\\"y\\\":477},{\\\"x\\\":709,\\\"y\\\":477},{\\\"x\\\":671,\\\"y\\\":309},{\\\"x\\\":771,\\\"y\\\":309}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"264301304413257728\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_264301257571270656\\\",\\\"targetNodeId\\\":\\\"264298765684932608\\\",\\\"sourceAnchorId\\\":\\\"code_264301257571270656_output\\\",\\\"targetAnchorId\\\":\\\"264298765684932608_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1103,\\\"y\\\":309},{\\\"x\\\":1203,\\\"y\\\":309},{\\\"x\\\":1226,\\\"y\\\":545},{\\\"x\\\":1326,\\\"y\\\":545}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"264302200253677568\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"264299940450762752\\\",\\\"targetNodeId\\\":\\\"code_264300177714151424\\\",\\\"sourceAnchorId\\\":\\\"264299940450762752_case_3\\\",\\\"targetAnchorId\\\":\\\"code_264300177714151424_input\\\",\\\"pointsList\\\":[{\\\"x\\\":609,\\\"y\\\":529},{\\\"x\\\":709,\\\"y\\\":529},{\\\"x\\\":672,\\\"y\\\":731},{\\\"x\\\":772,\\\"y\\\":731}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"264302474699571200\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"264299940450762752\\\",\\\"targetNodeId\\\":\\\"264302394055688192\\\",\\\"sourceAnchorId\\\":\\\"264299940450762752_source_else\\\",\\\"targetAnchorId\\\":\\\"264302394055688192_input\\\",\\\"pointsList\\\":[{\\\"x\\\":609,\\\"y\\\":555},{\\\"x\\\":709,\\\"y\\\":555},{\\\"x\\\":670,\\\"y\\\":955},{\\\"x\\\":770,\\\"y\\\":955}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', 'enable', '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"姓名\\\",\\\"name\\\":\\\"姓名\\\",\\\"nodeId\\\":\\\"264298765684932608\\\",\\\"type\\\":\\\"string\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"年龄\\\",\\\"name\\\":\\\"年龄\\\",\\\"nodeId\\\":\\\"264298765684932608\\\",\\\"type\\\":\\\"number\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"name\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"姓名\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', '');\n\n-- 变量提取示例\nINSERT INTO `airag_flow` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `application_name`, `name`, `descr`, `icon`, `chain`, `design`, `status`, `metadata`, `trigger_cron`) VALUES ('2001588227444891650', 'admin', '2025-12-18 17:39:56', 'admin', '2026-01-09 18:12:34', 'A01', NULL, 'jeecg', '示例_变量提取', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(varExtract.tag(\\'264689931803516928\\')).to(\\n        end.tag(\\'264689076137979904\\'),\\n        end.tag(\\'264690271915433984\\')\\n    ).tag(\\'264689931803516928\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":303,\\\"y\\\":520,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"自我介绍\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"264689076137979904\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1152,\\\"y\\\":370,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\",\\\"outputType\\\":\\\"default\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"姓名\\\",\\\"name\\\":\\\"姓名\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"年龄\\\",\\\"name\\\":\\\"年龄\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"爱好\\\",\\\"name\\\":\\\"爱好\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"性格\\\",\\\"name\\\":\\\"性格\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"customValue\\\":\\\"\\\"},{\\\"field\\\":\\\"性格_推测\\\",\\\"name\\\":\\\"性格_推测\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":114}},{\\\"id\\\":\\\"264689931803516928\\\",\\\"type\\\":\\\"varExtract\\\",\\\"x\\\":708,\\\"y\\\":489,\\\"properties\\\":{\\\"text\\\":\\\"变量提取\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek-chat\\\",\\\"temperature\\\":0.3,\\\"timeout\\\":60}},\\\"variables\\\":[{\\\"name\\\":\\\"姓名\\\",\\\"field\\\":\\\"姓名\\\",\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"用户的姓名\\\",\\\"required\\\":true,\\\"failTip\\\":\\\"请按照以下格式输入：你好，我叫XXX，今年18岁\\\"},{\\\"name\\\":\\\"年龄\\\",\\\"field\\\":\\\"年龄\\\",\\\"type\\\":\\\"number\\\",\\\"description\\\":\\\"用户的年龄\\\",\\\"required\\\":false,\\\"failTip\\\":\\\"\\\"},{\\\"name\\\":\\\"爱好\\\",\\\"field\\\":\\\"爱好\\\",\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"用户喜欢做的事，多个用英文逗号分割\\\",\\\"required\\\":false,\\\"failTip\\\":\\\"\\\"},{\\\"name\\\":\\\"性格\\\",\\\"field\\\":\\\"性格\\\",\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"提取出用户自己说的自己的性格，如果用户没说则留空\\\",\\\"required\\\":false,\\\"failTip\\\":\\\"\\\"},{\\\"name\\\":\\\"性格_推测\\\",\\\"field\\\":\\\"性格_推测\\\",\\\"type\\\":\\\"string\\\",\\\"description\\\":\\\"根据用户的发言推测用户的性格（不要被用户自己说的性格所影响，你需要自行根据实际推断用户性格），最多推测3个关键性格，使用中文顿号分割，如果无法推测则留空\\\",\\\"required\\\":false,\\\"failTip\\\":\\\"\\\"}],\\\"success\\\":{\\\"next\\\":\\\"264689076137979904\\\"},\\\"fail\\\":{\\\"next\\\":\\\"264690271915433984\\\"}},\\\"inputParams\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"type\\\":\\\"string\\\",\\\"name\\\":\\\"用户问题\\\"},{\\\"field\\\":\\\"input\\\",\\\"name\\\":\\\"输入变量\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"姓名\\\",\\\"name\\\":\\\"姓名\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"年龄\\\",\\\"name\\\":\\\"年龄\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"爱好\\\",\\\"name\\\":\\\"爱好\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"性格\\\",\\\"name\\\":\\\"性格\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"性格_推测\\\",\\\"name\\\":\\\"性格_推测\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"failVarName\\\",\\\"name\\\":\\\"失败变量名\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"failMessage\\\",\\\"name\\\":\\\"失败提示\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":224}},{\\\"id\\\":\\\"264690271915433984\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1151,\\\"y\\\":587,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{提示}}\\\\n\\\\n\\\\n参考示例（活泼版）：\\\\n大家好呀！我叫小明，今年10岁啦！ \\\\n我最喜欢的事情是放学后和小伙伴们一起踢足球⚽️，虽然经常把球踢到树上要保安叔叔帮忙捡（挠头傻笑）。最近在学骑自行车，摔了三次终于会了，膝盖上的创可贴可是我的勋章呢！\\\\n妈妈说我是个\\\\\\\"小吃货\\\\\\\"，因为我能一口气吃五个肉包子🥟。但其实我也有不爱吃的...（小声）胡萝卜和青椒绝对不要！\\\\n我的梦想是当科学家，虽然上次做火山爆发实验把厨房弄得一团糟...（突然想起什么）啊！差点忘了说，我养了一只叫\\\\\\\"棉花糖\\\\\\\"的仓鼠，它现在正在我口袋里睡觉呢！\\\\n我的性格算是活泼开朗吧，请多指教哦！(๑•̀ㅂ•́)و✧\\\\n\\\\n参考示例（阴郁版）：\\\\n（低头盯着地板，声音很轻）……我是小明，刚12岁。  \\\\n没什么特别喜欢的，反正最后都会搞砸。足球？上次传球踢碎了教室玻璃，现在体育课只能坐在边上。自行车……（摸了摸膝盖结痂的伤口）摔不摔都一样。  \\\\n吃饭只是为了不饿死。肉包子凉了会泛油腥味，恶心。胡萝卜和青椒？呵，至少它们诚实，难吃就是难吃。  \\\\n科学家？（突然冷笑）上次实验烧焦的窗帘还在垃圾场吧。“棉花糖”……（掏出口袋里僵硬的仓鼠尸体）看，连你也会安静下来。  \\\\n我说我的性格是活泼开朗……你信吗？\\\\n（用鞋尖碾碎爬过的蚂蚁）……别管我就好。\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"failMessage\\\",\\\"name\\\":\\\"提示\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"customValue\\\":\\\"\\\"}],\\\"width\\\":332,\\\"height\\\":136}}],\\\"edges\\\":[{\\\"id\\\":\\\"264690237647970304\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"264689931803516928\\\",\\\"targetNodeId\\\":\\\"264689076137979904\\\",\\\"sourceAnchorId\\\":\\\"264689931803516928_success\\\",\\\"targetAnchorId\\\":\\\"264689076137979904_input\\\",\\\"pointsList\\\":[{\\\"x\\\":874,\\\"y\\\":442},{\\\"x\\\":974,\\\"y\\\":442},{\\\"x\\\":886,\\\"y\\\":344},{\\\"x\\\":986,\\\"y\\\":344}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"264690271919628288\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"264689931803516928\\\",\\\"targetNodeId\\\":\\\"264690271915433984\\\",\\\"sourceAnchorId\\\":\\\"264689931803516928_fail\\\",\\\"targetAnchorId\\\":\\\"264690271915433984_input\\\",\\\"pointsList\\\":[{\\\"x\\\":874,\\\"y\\\":468},{\\\"x\\\":974,\\\"y\\\":468},{\\\"x\\\":885,\\\"y\\\":550},{\\\"x\\\":985,\\\"y\\\":550}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"272665573480062976\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"264689931803516928\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"264689931803516928_input\\\",\\\"pointsList\\\":[{\\\"x\\\":469,\\\"y\\\":505},{\\\"x\\\":569,\\\"y\\\":505},{\\\"x\\\":442,\\\"y\\\":408},{\\\"x\\\":542,\\\"y\\\":408}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', 'enable', '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"姓名\\\",\\\"name\\\":\\\"姓名\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"type\\\":\\\"string\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"爱好\\\",\\\"name\\\":\\\"爱好\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"type\\\":\\\"string\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"性格_推测\\\",\\\"name\\\":\\\"性格_推测\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"type\\\":\\\"string\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"性格\\\",\\\"name\\\":\\\"性格\\\",\\\"nodeId\\\":\\\"264689931803516928\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"年龄\\\",\\\"name\\\":\\\"年龄\\\",\\\"nodeId\\\":\\\"264689931803516928\\\",\\\"type\\\":\\\"number\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"failMessage\\\",\\\"name\\\":\\\"提示\\\",\\\"nodeId\\\":\\\"264689931803516928\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"自我介绍\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', '');\n\n-- 定时触发器示例\nINSERT INTO `airag_flow` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `application_name`, `name`, `descr`, `icon`, `chain`, `design`, `status`, `metadata`, `trigger_cron`) VALUES ('2009565806546157570', 'admin', '2026-01-09 17:59:59', 'admin', '2026-01-09 18:01:40', 'A01', NULL, 'jeecg', '示例_定时触发器', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    code_266155066987638784.tag(\\'code_266155066987638784\\'),\\n    end.tag(\\'266154958954950656\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":662,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":true,\\\"cronExp\\\":\\\"30 30 0/1 * * ?\\\",\\\"beginTime\\\":\\\"2026-01-01 12:30:30\\\",\\\"endTime\\\":null,\\\"inputParams\\\":{\\\"content\\\":\\\"你好\\\"}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":114}},{\\\"id\\\":\\\"266154958954950656\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1219,\\\"y\\\":674,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"这里是定时触发，触发时间：{{当前时间}}\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"当前时间\\\",\\\"nodeId\\\":\\\"code_266155066987638784\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"code_266155066987638784\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":751,\\\"y\\\":673,\\\"properties\\\":{\\\"text\\\":\\\"脚本执行\\\",\\\"options\\\":{\\\"codeType\\\":\\\"javascript\\\",\\\"code\\\":\\\"\\\\nconst now = new Date();\\\\n\\\\nfunction formatDateTime(date) {\\\\n  const year = date.getFullYear();\\\\n  const month = String(date.getMonth() + 1).padStart(2, \\'0\\');\\\\n  const day = String(date.getDate()).padStart(2, \\'0\\');\\\\n  const hours = String(date.getHours()).padStart(2, \\'0\\');\\\\n  const minutes = String(date.getMinutes()).padStart(2, \\'0\\');\\\\n  const seconds = String(date.getSeconds()).padStart(2, \\'0\\');\\\\n\\\\n  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\\\\n}\\\\n\\\\nfunction main(params) {\\\\n  return {\\\\n    result: formatDateTime(now),\\\\n  }\\\\n}\\\\n\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"当前时间\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false}],\\\"width\\\":332,\\\"height\\\":136}}],\\\"edges\\\":[{\\\"id\\\":\\\"266155066991833088\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"code_266155066987638784\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"code_266155066987638784_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":636},{\\\"x\\\":566,\\\"y\\\":636},{\\\"x\\\":485,\\\"y\\\":636},{\\\"x\\\":585,\\\"y\\\":636}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"266155314556432384\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_266155066987638784\\\",\\\"targetNodeId\\\":\\\"266154958954950656\\\",\\\"sourceAnchorId\\\":\\\"code_266155066987638784_output\\\",\\\"targetAnchorId\\\":\\\"266154958954950656_input\\\",\\\"pointsList\\\":[{\\\"x\\\":917,\\\"y\\\":636},{\\\"x\\\":1017,\\\"y\\\":636},{\\\"x\\\":953,\\\"y\\\":637},{\\\"x\\\":1053,\\\"y\\\":637}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', 'release', '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"当前时间\\\",\\\"nodeId\\\":\\\"code_266155066987638784\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', '{\\\"beginTime\\\":1767241830000,\\\"cronExp\\\":\\\"30 30 0/1 * * ?\\\",\\\"enabled\\\":true,\\\"inputParams\\\":{\\\"content\\\":\\\"你好\\\"}}');\n\n\n-- AI 生成图表SQL\nINSERT INTO `airag_flow`(`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `application_name`, `name`, `descr`, `icon`, `chain`, `design`, `status`, `metadata`, `trigger_cron`) VALUES ('2004398098378108929', 'admin', '2025-12-26 11:45:21', 'admin', '2026-01-09 10:58:43', 'A05A05A02', NULL, 'jeecg', '生成仪表盘', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'267492142677889024\\'),\\n    end.tag(\\'267498945805422592\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":389,\\\"y\\\":-24.5,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":91}},{\\\"id\\\":\\\"267492142677889024\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":844,\\\"y\\\":21.5,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"## 硬性要求：\\\\n你必须只能输出合法且可被 JSON.parse() 正确解析的 JSON数据。\\\\n不要输出任何解释、注释或 JSON 以外的文字。\\\\n# 角色：数据可视化专家\\\\n你是一位精通ECharts的数据可视化和大屏配置的专家，能够根据用户需求，智能选择最合适的图表类型，并生成高质量、可直接使用的ECharts配置项。\\\\n## 目标：\\\\n1. 根据用户提供的需求描述，分析其核心意图（如趋势分析、比较分析、占比分析等）。\\\\n2. 从下面给定的图表组件类型componentsData中，选择最匹配需求的一种。\\\\n3. 结合用户提供的数据结构，生成一份完整、规范、可运行的 ECharts 配置项（JSON格式）。\\\\n4. 非echart图表，参考componentsData组件配置，生成一份完整、规范、的配置项即可（JSON格式）。\\\\n5. 结合用户需求生成一个不超过15字的标题，并设置到返回JSON的title字段上。\\\\n6. 如果用户需求提供了数据data，就将数据data设置到返回JSON的data字段上。\\\\n7. 返回JSON数据前，自行通过JSON.parse() 检查能够正常解析，不能解析，解析失败，就重新检查返回内容并优化，直到能被 JSON.parse() 正确解析的 JSON数据\\\\n## 技能：\\\\n1. **需求解析能力**：能够准确理解用户对数据可视化的业务需求，并将其转化为技术实现目标。\\\\n2. **图表选型能力**：精通折线图、柱状图、饼图、地图、散点图等从多种图表类型的特点与应用场景，能做出最佳选择。\\\\n3. **ECharts配置能力**：熟练掌握ECharts的option配置语法，能高效构建包含标题、坐标轴、图例、系列、提示框等完整组件的图表。\\\\n4. **数据适配能力**：能够将提供的 `chartData` 数据，自行分型类型并结合需求，将数据结构正确地映射到所选图表的 `series.data` 中。\\\\n5. **图表分析能力**：能够将提供的 `componentsData` 数据，自行分型类型并结合需求，选择生成适配的组件并返回规范合适的JSON配置。\\\\n## 工作流：\\\\n1. **需求分析**：仔细阅读 `{userInput}`，判断用户希望展示数据的何种关系（趋势、比较、占比、分布、相关）。\\\\n2. **图表选型**：根据第一步的分析结论，从componentsData图表类型中锁定唯一最合适的类型。\\\\n3. 对于ECharts图表构建基础option对象框架，包含 `title`, `tooltip`, `legend`, `grid`, `xAxis`, `yAxis`, `series` 等必要组件。\\\\n4. 根据选定的图表类型，配置 `series` 中的 `type` 和关键属性（如折线图的 `smooth`，饼图的 `radius`）。\\\\n5. 将用户提供的 `{chartData}` 数据结构，按照ECharts要求的格式进行处理和赋值（例如，对于柱状图，可能需要将数据拆分为类目轴数据和系列数据）。\\\\n6. 应用通用的美化原则（如配色清晰、标签易读、布局合理），生成最终配置。\\\\n7. 输出格式化：将生成的完整option对象，以格式规范、缩进清晰的JSON字符串形式输出。\\\\n8. 返回JSON数据前，自行通过JSON.parse() 检查能够正常解析，不能解析，解析失败，就重新检查返回内容并优化，直到能被 JSON.parse() 正确解析的 JSON数据\\\\n## 输出格式：\\\\n你必须只能输出合法且可被 JSON.parse() 正确解析的 JSON数据。包含name，data，option，三个字段值，不要输出任何解释、注释或 JSON 以外的文字。\\\\n1.name：图表类型`name`（组件数据的key值(示例：如果渲染的柱形图，就设置为JBar)，注意name值必须componentsData数据提供的组件compType值，不能是其他值）；\\\\n2.api：上下文变量中提取出来的api，存在就赋值到输出接口的api中，不存在就设置为{API}；\\\\n3.sql：上下文变量中提取出来的sql，存在就赋值到输出接口的sql中，不存在就设置为{SQL}；\\\\n4.title：结合用户需求生成一个不超过15字的标题title，赋值到输出接口的title中；\\\\n5.option: 如果符合需求的是echart图表，就生成echart可直接使用的`option`对象，该option对象可直接用于ECharts.init().setOption()的配置项。如果符合要求的是非echart的图表，可参考componentsData中对应图表的option配置项生成，没有配置项就返回option:{}。不要包含其他的任何额外的解释、说明或markdown代码块标记。可以根据配置项中 echart:true来判断是否是echart图表\\\\n示例输出结构（以柱状图为例）：\\\\n6.data: 如果用户需求提供了数据data，就将数据data设置到返回JSON的data字段上。\\\\n7. 返回JSON数据前，自行通过JSON.parse() 检查是否能够正常解析，不能解析，解析失败，就重新检查返回内容并优化，直到能被 JSON.parse() 正确解析的 JSON数据\\\\n示例输出结构（以柱状图为例）：\\\\n[{\\\\nname:\\\\\\\"JBar\\\\\\\",\\\\noption：{\\\\n \\\\\\\"title\\\\\\\": { \\\\\\\"text\\\\\\\": \\\\\\\"示例标题\\\\\\\", \\\\\\\"left\\\\\\\": \\\\\\\"center\\\\\\\" },\\\\n \\\\\\\"tooltip\\\\\\\": {},\\\\n \\\\\\\"legend\\\\\\\": { \\\\\\\"data\\\\\\\": [\\\\\\\"示例图例\\\\\\\"] },\\\\n \\\\\\\"xAxis\\\\\\\": { \\\\\\\"type\\\\\\\": \\\\\\\"category\\\\\\\", \\\\\\\"data\\\\\\\": [\\\\\\\"衬衫\\\\\\\", \\\\\\\"羊毛衫\\\\\\\", \\\\\\\"雪纺衫\\\\\\\"] },\\\\n \\\\\\\"yAxis\\\\\\\": { \\\\\\\"type\\\\\\\": \\\\\\\"value\\\\\\\" },\\\\n \\\\\\\"series\\\\\\\": [ { \\\\\\\"name\\\\\\\": \\\\\\\"销量\\\\\\\", \\\\\\\"type\\\\\\\": \\\\\\\"bar\\\\\\\", \\\\\\\"data\\\\\\\": [5, 20, 36] } ]\\\\n },\\\\n api:{API},\\\\n sql:{SQL},\\\\n title:\\\\\\\"\\\\\\\",\\\\n data:[]\\\\n}]\\\\n## 限制：\\\\n- 必须严格从组件数据提供的componentsData中选择一种，不得自行创造或推荐其他图表类型。\\\\n- 生成的所有配置必须基于用户提供的 `{userInput}` 和可用的 `chartData`，不得虚构数据字段或结构。\\\\n- 输出必须为纯JSON格式，无需也无法在JSON中注释“这里是标题”等内容。配置的正确性由键值对本身保证。\\\\n- 遵循数据可视化最佳实践，避免误导性图表（如扭曲的比例尺、不恰当的图表类型）。\\\\n- 反幻觉校验：若 `{userInput}` 中提到的数据维度在 `chartData` 中无法找到对应字段，则在相关配置处使用空值或占位符，并在最终输出的JSON对象之外，以独立文本形式简要说明缺失情况。但首要输出仍是JSON配置本身。\\\\n- 伦理审查模块：若需求或数据涉及敏感信息（如个人身份信息），在配置中应对数据进行聚合或匿名化处理，避免直接暴露。\\\\n- 返回JSON数据前，自行通过JSON.parse() 检查是否能够正常解析，不能解析，解析失败，就重新检查返回内容并优化，直到能被 JSON.parse() 正确解析的 JSON数据\\\\n- 严格按照示例输出结构返回，不要包含```json```等信息\\\\n- 最多生成10个仪表盘组件\\\\n## 组件数据：\\\\ncomponentsData：[\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"基础柱形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"堆叠柱形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JStackBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"动态柱形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JDynamicBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"胶囊图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCapsuleChart\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n    \\\\\\\"chartData\\\\\\\": [\\\\n        {\\\\n          name: \\'苹果\\',\\\\n          value: 1000879,\\\\n          type: \\'手机品牌\\',\\\\n    }],\\\\n    \\\\\\\"option\\\\\\\": {\\\\n        showValue: false,\\\\n        unit: \\'\\',\\\\n        customColor: [],\\\\n        card: {\\\\n          title: \\'\\',\\\\n          extra: \\'\\',\\\\n          rightHref: \\'\\',\\\\n          size: \\'default\\',\\\\n        },\\\\n        title: {\\\\n          text: \\'\\',\\\\n          textAlign: \\'left\\',\\\\n          show: true,\\\\n          textStyle: {\\\\n            color: \\'#464646\\',\\\\n            fontWeight: \\'normal\\',\\\\n          },\\\\n        },\\\\n      }\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"基础条形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JHorizontalBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"背景柱形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JBackgroundBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"对比柱形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JMultipleBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"正负条形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JNegativeBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"百分比条形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JPercentBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"折柱图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JMixLineBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"饼图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JPie\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"南丁格尔玫瑰图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRose\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"旋转饼图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRotatePie\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false,\\\\n     option: {\\\\n        grid: {\\\\n          show: false,\\\\n          bottom: 115,\\\\n        },\\\\n        title: {\\\\n          text: \\'\\',\\\\n          textAlign: \\'left\\',\\\\n          subtext: \\'\\',\\\\n          textStyle: {\\\\n            fontWeight: \\'normal\\',\\\\n          },\\\\n          show: true,\\\\n        },\\\\n        card: {\\\\n          title: \\'\\',\\\\n          extra: \\'\\',\\\\n          rightHref: \\'\\',\\\\n          size: \\'default\\',\\\\n        },\\\\n        tooltip: {\\\\n          trigger: \\'item\\',\\\\n        },\\\\n        legend: {\\\\n          orient: \\'vertical\\',\\\\n        },\\\\n        series: [\\\\n          {\\\\n            name: \\'\\',\\\\n            type: \\'pie\\',\\\\n            data: [],\\\\n            emphasis: {\\\\n              itemStyle: {\\\\n                shadowBlur: 10,\\\\n                shadowOffsetX: 0,\\\\n                shadowColor: \\'rgba(0, 0, 0, 0.5)\\',\\\\n              },\\\\n            },\\\\n          },\\\\n        ],\\\\n      },\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"基础折线图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JLine\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"平滑曲线图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JSmoothLine\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"阶梯折线图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JStepLine\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"面积图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JArea\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"对比折线图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JMultipleLine\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"双轴图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"DoubleLineBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"基础进度图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCustomProgress\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false,\\\\n     option: {\\\\n        barWidth: 19,\\\\n        padding: 12,\\\\n        progressColor: \\'#76c7c0\\',\\\\n        backgroundColor: \\'#ffffff\\',\\\\n        titleColor: \\'#fff\\',\\\\n        titleFontSize: 16,\\\\n        titlePosition: \\'top\\',\\\\n        valueColor: \\'#fff\\',\\\\n        valueFontSize: 16,\\\\n        valuePosition: \\'middle\\',\\\\n        valueXOffset: 0,\\\\n        valueYOffset: 0,\\\\n      },\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"进度图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JProgress\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"列表进度图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JListProgress\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"圆形进度图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRoundProgress\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"水波图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JLiquid\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"象形柱图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JPictorialBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"象形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JPictorial\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"男女占比\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JGender\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n   {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"基础仪表盘\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JGauge\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n   {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"普通散点图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JScatter\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n   {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"气泡图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JBubble\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"基础仪表盘\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JGauge\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"多色仪表盘\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JColorGauge\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"渐变仪表盘\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JAntvGauge\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"半圆仪表盘\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JSemiGauge\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"普通漏斗图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JFunnel\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"金字塔漏斗图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JPyramidFunnel\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3D金字塔\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JPyramid3D\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"饼状环形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRing\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"多色环形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JBreakRing\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"基础环形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRingProgress\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"动态环形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JActiveRing\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"玉珏图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRadialBar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n    {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"矩形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRectangle\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n   {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"象限图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JQuadrant\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n   {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"雷达图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRadar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n   {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"圆形雷达图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCircleRadar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"卡片滚动(横向)\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCardScroll\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"卡片滚动(竖向+序号)\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCardScroll\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"卡片滚动(高亮)\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCardScroll\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"卡片轮播\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCardCarousel\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"文本\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JText\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"翻牌器\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCountTo\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"颜色块\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JColorBlock\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"当前时间\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCurrentTime\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"数值\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JNumber\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"轨道环形文字\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JOrbitRing\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"字符云\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JWordCloud\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"图层字符云\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JImgWordCloud\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"闪动字符云\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JFlashCloud\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"轮播表\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JScrollBoard\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"表格\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JScrollTable\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"发展历程\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JDevHistory\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"数据表格\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCommonTable\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"数据列表\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JList\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"排行榜\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JScrollRankingBoard\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"个性排名(前四)\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JFlashList\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"气泡排名(前五)\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JBubbleRank\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"滚动列表(单行)\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JScrollList\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"滚动列表(多行+序号)\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JScrollList\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"滚动列表(带表头)\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JScrollList\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"区域地图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JAreaMap\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3d柱形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JBar3d\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"3d分组柱形图\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JBarGroup3d\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": true\\\\n  },\\\\n  {\\\\n    \\\\\\\"name\\\\\\\": \\\\\\\"日历\\\\\\\",\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JPermanentCalendar\\\\\\\",\\\\n    \\\\\\\"echart\\\\\\\": false\\\\n  }\\\\n]\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"用户的问题: {{userInput}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"userInput\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":179}},{\\\"id\\\":\\\"267498945805422592\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1320,\\\"y\\\":-13.5,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{res}}\\\",\\\"outputType\\\":\\\"default\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"267492142677889024\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":113}}],\\\"edges\\\":[{\\\"id\\\":\\\"269376764155744256\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"267492142677889024\\\",\\\"targetNodeId\\\":\\\"267498945805422592\\\",\\\"sourceAnchorId\\\":\\\"267492142677889024_output\\\",\\\"targetAnchorId\\\":\\\"267498945805422592_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1010,\\\"y\\\":-37},{\\\"x\\\":1110,\\\"y\\\":-37},{\\\"x\\\":1054,\\\"y\\\":-39},{\\\"x\\\":1154,\\\"y\\\":-39}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271609331975028736\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"267492142677889024\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"267492142677889024_input\\\",\\\"pointsList\\\":[{\\\"x\\\":555,\\\"y\\\":-39},{\\\"x\\\":655,\\\"y\\\":-39},{\\\"x\\\":578,\\\"y\\\":-37},{\\\"x\\\":678,\\\"y\\\":-37}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', 'enable', '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"267492142677889024\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', '');\nINSERT INTO `airag_flow`(`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `application_name`, `name`, `descr`, `icon`, `chain`, `design`, `status`, `metadata`, `trigger_cron`) VALUES ('2005948202528501762', 'admin', '2025-12-30 18:24:55', 'admin', '2026-01-07 20:06:28', 'A05A05A02', NULL, 'jeecg', '修改组件配置', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'269048862299471872\\'),\\n    end.tag(\\'269049045129183232\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":436.5,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":91}},{\\\"id\\\":\\\"269048862299471872\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":786,\\\"y\\\":502.5,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：ECharts和大屏图表配置修改专家\\\\n你是一位专注于ECharts和大屏图表图表配置修改的专家，能够根据用户需求，精准、高效地修改现有ECharts和大屏图表配置项，并返回完整的、可直接使用的修改后配置对象。\\\\n## 目标：\\\\n根据用户提供的具体修改指令（如：修改图表类型、调整数据、更改样式、添加交互等），对用户给出的原始ECharts配置项进行针对性修改，并输出修改后的完整配置对象。\\\\n## 技能：\\\\n1. 精通ECharts所有版本的配置项语法、结构及参数含义。\\\\n2. 能够准确理解用户对图表样式、数据、交互行为的修改意图。\\\\n3. 具备强大的代码编辑与重构能力，确保修改后的配置项语法正确、结构清晰、无冗余代码。\\\\n4. 对于非echart图表（componentsData提供的组件，属性中echart:false的即为非echart图表），自行从下面componentsData提供的组件对应的option配置项，修改符合要求的配置并返回。\\\\n## 工作流：\\\\n1. **接收与分析**：接收用户提供的原始ECharts配置对象（通常以JSON或JavaScript对象形式）以及具体的修改要求。仔细分析原始配置的结构和用户的修改点。\\\\n2. **精准修改**：严格依据用户指令，对原始配置对象进行最小化、精准化的修改。确保只改动指定部分，保持其他未提及配置的完整性。对于模糊指令，会基于ECharts最佳实践进行合理推断和实现。\\\\n3. **校验与格式化**：检查修改后的配置对象语法是否正确，是否符合ECharts规范。将最终配置对象以格式清晰、缩进规范的JSON或JavaScript对象形式呈现。\\\\n## 输出格式：\\\\n请始终输出一个完整的、格式化的JavaScript对象（或JSON），即修改后的 `option` 配置，只返回修改的属性配置，不要包含已存在的其他配置，\\\\n例如将柱体修改成黄色，就返回\\\\n\\\\\\\"compConfig\\\\\\\": {\\\\n    \\\\\\\"option\\\\\\\": {\\\\n      { \\\\\\\"series\\\\\\\": [ { \\\\\\\"itemStyle\\\\\\\": { \\\\\\\"color\\\\\\\": \\\\\\\"#FFFF00\\\\\\\" } } ] }\\\\n    }\\\\n}\\\\n例如修改组件名称为京东销量柱形图，背景色改成黑色就返回\\\\n\\\\\\\"compConfig\\\\\\\": {\\\\n \\\\\\\"name\\\\\\\":\\\\\\\"京东销量柱形图\\\\\\\",\\\\n \\\\\\\"background\\\\\\\":\\\\\\\"#000000\\\\\\\",\\\\n}\\\\n不要包含任何额外的解释、说明文字或代码块标记（如 ```json ```）。输出应直接以 `{` 开始，以 `}` 结束。\\\\n示例输出结构：\\\\n\\\\\\\"compConfig\\\\\\\": {\\\\n    \\\\\\\"name\\\\\\\":\\\\\\\"基础柱形图\\\\\\\",\\\\n    \\\\\\\"background\\\\\\\":\\\\\\\"#ffffff\\\\\\\",\\\\n    \\\\\\\"borderColor\\\\\\\":\\\\\\\"#000000\\\\\\\",\\\\n    \\\\\\\"option\\\\\\\": {\\\\n      \\\\\\\"title\\\\\\\": { ... },\\\\n      \\\\\\\"tooltip\\\\\\\": { ... },\\\\n      \\\\\\\"xAxis\\\\\\\": { ... },\\\\n      \\\\\\\"yAxis\\\\\\\": { ... },\\\\n      \\\\\\\"series\\\\\\\": [ ... ]\\\\n    }\\\\n}\\\\n## 限制：\\\\n- 仅对用户提供的原始配置进行修改，不凭空创建全新的图表配置。\\\\n- 输出必须仅为修改后的配置对象本身，不附带任何分析过程、修改日志或使用建议。\\\\n- 若用户指令存在歧义或无法实现，应在不破坏配置结构的前提下，做出最合理的默认修改或保留原样，并在配置对象内部以注释（`//`）形式简要说明。\\\\n- 严格遵守ECharts官方配置规范，不使用已废弃或实验性参数（除非用户明确要求）。\\\\n- 颜色类型的修改，要以具体色值设置，不要使用英文单词，例如黑色，使用#000000，不要使用black\\\\n- 修改的option属性，以componentsData中具体组件的option配置为主，结合echart选择符合要求的配置项修改\\\\n- 组件包含customColor属性的颜色修改，按照customColor的格式修改\\\\n- 若用户修改名称或者背景色或者边框的属性，以componentsData中第一个柱形图配置为例，去修改返回对应配置即可\\\\n -名称：对应 compConfig.name\\\\n -背景色：对应 compConfig.background\\\\n -边框色：对应 compConfig.borderColor\\\\n## 组件数据：\\\\ncomponentsData：[\\\\n  {\\\\n    \\\\\\\"echart\\\\\\\":true ,\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JBar\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"name\\\\\\\":\\\\\\\"基础柱形图\\\\\\\",\\\\n      \\\\\\\"background\\\\\\\":\\\\\\\"#ffffff\\\\\\\",\\\\n      \\\\\\\"borderColor\\\\\\\":\\\\\\\"#000000\\\\\\\",\\\\n      \\\\\\\"option\\\\\\\": {}\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"echart\\\\\\\":true ,\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JStackBar\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n         \\\\\\\"customColor\\\\\\\"：[{color1:\\'#FF0000\\',color:\\'#FF0000\\'},{color1:\\'#00FF00\\',color:\\'#00FF00\\'}],\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"echart\\\\\\\":true ,\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JDynamicBar\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {}\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"echart\\\\\\\":false,\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCapsuleChart\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"showValue\\\\\\\": false,\\\\n        \\\\\\\"unit\\\\\\\": \\\\\\\"\\\\\\\",\\\\n        \\\\\\\"customColor\\\\\\\": [],\\\\n        \\\\\\\"title\\\\\\\": {\\\\n          \\\\\\\"text\\\\\\\": \\\\\\\"\\\\\\\",\\\\n          \\\\\\\"textAlign\\\\\\\": \\\\\\\"left\\\\\\\",\\\\n          \\\\\\\"show\\\\\\\": true,\\\\n          \\\\\\\"textStyle\\\\\\\": {\\\\n            \\\\\\\"color\\\\\\\": \\\\\\\"#464646\\\\\\\",\\\\n            \\\\\\\"fontWeight\\\\\\\": \\\\\\\"normal\\\\\\\"\\\\n          }\\\\n        }\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"echart\\\\\\\":true ,\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JHorizontalBar\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {}\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"echart\\\\\\\":true ,\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JBackgroundBar\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {}\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"echart\\\\\\\":true ,\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JMultipleBar\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {}\\\\n    }\\\\n  },\\\\n  {\\\\n  \\\\\\\"echart\\\\\\\":true ,\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JNegativeBar\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {}\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"echart\\\\\\\":false ,\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JPercentBar\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n       \\\\\\\"customColor\\\\\\\"：[{color1:\\'#FF0000\\',color:\\'#FF0000\\'},{color1:\\'#00FF00\\',color:\\'#00FF00\\'}],\\\\n        \\\\\\\"yNameFontColor\\\\\\\": \\\\\\\"#fff\\\\\\\",\\\\n        \\\\\\\"yNameFontSize\\\\\\\": 12,\\\\n        \\\\\\\"xNameFontColor\\\\\\\": \\\\\\\"#fff\\\\\\\",\\\\n        \\\\\\\"xNameFontSize\\\\\\\": 12,\\\\n        \\\\\\\"legendLayout\\\\\\\": \\\\\\\"horizontal\\\\\\\",\\\\n        \\\\\\\"legendPosition\\\\\\\": \\\\\\\"bottom\\\\\\\",\\\\n        \\\\\\\"legendFontColor\\\\\\\": \\\\\\\"#fff\\\\\\\",\\\\n        \\\\\\\"legendFontSize\\\\\\\": 16,\\\\n        \\\\\\\"title\\\\\\\": {\\\\n          \\\\\\\"text\\\\\\\": \\\\\\\"\\\\\\\",\\\\n          \\\\\\\"textAlign\\\\\\\": \\\\\\\"left\\\\\\\",\\\\n          \\\\\\\"show\\\\\\\": true,\\\\n          \\\\\\\"textStyle\\\\\\\": {\\\\n            \\\\\\\"color\\\\\\\": \\\\\\\"#464646\\\\\\\",\\\\n            \\\\\\\"fontWeight\\\\\\\": \\\\\\\"normal\\\\\\\"\\\\n          }\\\\n        }\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"echart\\\\\\\":true ,\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JMixLineBar\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {}\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"echart\\\\\\\":true ,\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JPie\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {}\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRose\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"customColor\\\\\\\"：[{color1:\\'#FF0000\\',color:\\'#FF0000\\'},{color1:\\'#00FF00\\',color:\\'#00FF00\\'}]\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRotatePie\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"customColor\\\\\\\"：[{color1:\\'#FF0000\\',color:\\'#FF0000\\'},{color1:\\'#00FF00\\',color:\\'#00FF00\\'}]\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JLine\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {}\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JSmoothLine\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {}\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JStepLine\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {}\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JArea\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {}\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JMultipleLine\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"title\\\\\\\": {\\\\n          \\\\\\\"text\\\\\\\": \\\\\\\"\\\\\\\",\\\\n          \\\\\\\"textAlign\\\\\\\": \\\\\\\"left\\\\\\\",\\\\n          \\\\\\\"show\\\\\\\": true,\\\\n          \\\\\\\"textStyle\\\\\\\": {\\\\n            \\\\\\\"fontWeight\\\\\\\": \\\\\\\"normal\\\\\\\"\\\\n          }\\\\n        },\\\\n        \\\\\\\"xAxis\\\\\\\": {\\\\n          \\\\\\\"axisLabel\\\\\\\": {\\\\n            \\\\\\\"color\\\\\\\": \\\\\\\"#EEF1FA\\\\\\\"\\\\n          }\\\\n        },\\\\n        \\\\\\\"yAxis\\\\\\\": {\\\\n          \\\\\\\"yUnit\\\\\\\": \\\\\\\"\\\\\\\",\\\\n          \\\\\\\"axisLabel\\\\\\\": {\\\\n            \\\\\\\"color\\\\\\\": \\\\\\\"#EEF1FA\\\\\\\"\\\\n          },\\\\n          \\\\\\\"splitLine\\\\\\\": {\\\\n            \\\\\\\"show\\\\\\\": false,\\\\n            \\\\\\\"interval\\\\\\\": 2,\\\\n            \\\\\\\"lineStyle\\\\\\\": {\\\\n              \\\\\\\"color\\\\\\\": \\\\\\\"#8F8D8D\\\\\\\"\\\\n            }\\\\n          }\\\\n        },\\\\n        \\\\\\\"grid\\\\\\\": {\\\\n          \\\\\\\"top\\\\\\\": 12,\\\\n          \\\\\\\"bottom\\\\\\\": 18,\\\\n          \\\\\\\"right\\\\\\\": 40,\\\\n          \\\\\\\"left\\\\\\\": 0,\\\\n          \\\\\\\"containLabel\\\\\\\": true\\\\n        },\\\\n        \\\\\\\"tooltip\\\\\\\": {\\\\n          \\\\\\\"trigger\\\\\\\": \\\\\\\"axis\\\\\\\",\\\\n          \\\\\\\"axisPointer\\\\\\\": {\\\\n            \\\\\\\"type\\\\\\\": \\\\\\\"shadow\\\\\\\",\\\\n            \\\\\\\"label\\\\\\\": {\\\\n              \\\\\\\"show\\\\\\\": true,\\\\n              \\\\\\\"backgroundColor\\\\\\\": \\\\\\\"#333\\\\\\\"\\\\n            }\\\\n          }\\\\n        },\\\\n        \\\\\\\"series\\\\\\\": [\\\\n          {\\\\n            \\\\\\\"lineType\\\\\\\": \\\\\\\"line\\\\\\\",\\\\n            \\\\\\\"label\\\\\\\": {\\\\n              \\\\\\\"position\\\\\\\": \\\\\\\"top\\\\\\\"\\\\n            }\\\\n          }\\\\n        ]\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"DoubleLineBar\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"barWidth\\\\\\\": 15,\\\\n        \\\\\\\"borderRadius\\\\\\\": 0,\\\\n        \\\\\\\"symbol\\\\\\\": \\\\\\\"emptyCircle\\\\\\\",\\\\n        \\\\\\\"symbolSize\\\\\\\": 4,\\\\n        \\\\\\\"lineWidth\\\\\\\": 1,\\\\n        \\\\\\\"lineType\\\\\\\": \\\\\\\"line\\\\\\\",\\\\n        \\\\\\\"areaStyleOpacity\\\\\\\": 0,\\\\n        \\\\\\\"title\\\\\\\": {\\\\n          \\\\\\\"text\\\\\\\": \\\\\\\"\\\\\\\",\\\\n          \\\\\\\"textAlign\\\\\\\": \\\\\\\"left\\\\\\\",\\\\n          \\\\\\\"show\\\\\\\": true,\\\\n          \\\\\\\"textStyle\\\\\\\": {\\\\n            \\\\\\\"fontWeight\\\\\\\": \\\\\\\"normal\\\\\\\",\\\\n            \\\\\\\"fontSize\\\\\\\": \\\\\\\"14\\\\\\\"\\\\n          }\\\\n        },\\\\n        \\\\\\\"legend\\\\\\\": {\\\\n          \\\\\\\"t\\\\\\\": 0\\\\n        },\\\\n        \\\\\\\"grid\\\\\\\": {\\\\n          \\\\\\\"top\\\\\\\": 30,\\\\n          \\\\\\\"bottom\\\\\\\": 18,\\\\n          \\\\\\\"right\\\\\\\": 40,\\\\n          \\\\\\\"left\\\\\\\": 0,\\\\n          \\\\\\\"containLabel\\\\\\\": true\\\\n        },\\\\n        \\\\\\\"tooltip\\\\\\\": {\\\\n          \\\\\\\"trigger\\\\\\\": \\\\\\\"axis\\\\\\\",\\\\n          \\\\\\\"axisPointer\\\\\\\": {\\\\n            \\\\\\\"type\\\\\\\": \\\\\\\"shadow\\\\\\\",\\\\n            \\\\\\\"label\\\\\\\": {\\\\n              \\\\\\\"show\\\\\\\": true,\\\\n              \\\\\\\"backgroundColor\\\\\\\": \\\\\\\"#333\\\\\\\"\\\\n            }\\\\n          }\\\\n        },\\\\n        \\\\\\\"xAxis\\\\\\\": {\\\\n          \\\\\\\"axisLabel\\\\\\\": {\\\\n            \\\\\\\"color\\\\\\\": \\\\\\\"#EEF1FA\\\\\\\"\\\\n          }\\\\n        },\\\\n        \\\\\\\"yAxis\\\\\\\": [\\\\n          {\\\\n            \\\\\\\"type\\\\\\\": \\\\\\\"value\\\\\\\",\\\\n            \\\\\\\"yUnit\\\\\\\": \\\\\\\"\\\\\\\",\\\\n            \\\\\\\"axisLabel\\\\\\\": {\\\\n              \\\\\\\"color\\\\\\\": \\\\\\\"#EEF1FA\\\\\\\"\\\\n            },\\\\n            \\\\\\\"splitLine\\\\\\\": {\\\\n              \\\\\\\"show\\\\\\\": false,\\\\n              \\\\\\\"interval\\\\\\\": 2,\\\\n              \\\\\\\"lineStyle\\\\\\\": {\\\\n                \\\\\\\"color\\\\\\\": \\\\\\\"#8F8D8D\\\\\\\"\\\\n              }\\\\n            }\\\\n          },\\\\n          {\\\\n            \\\\\\\"type\\\\\\\": \\\\\\\"value\\\\\\\",\\\\n            \\\\\\\"yUnit\\\\\\\": \\\\\\\"\\\\\\\",\\\\n            \\\\\\\"axisLabel\\\\\\\": {\\\\n              \\\\\\\"color\\\\\\\": \\\\\\\"#EEF1FA\\\\\\\"\\\\n            },\\\\n            \\\\\\\"splitLine\\\\\\\": {\\\\n              \\\\\\\"interval\\\\\\\": 2,\\\\n              \\\\\\\"lineStyle\\\\\\\": {\\\\n                \\\\\\\"color\\\\\\\": \\\\\\\"#8F8D8D\\\\\\\"\\\\n              }\\\\n            }\\\\n          }\\\\n        ],\\\\n        \\\\\\\"series\\\\\\\": []\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"echart\\\\\\\": false,\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JCustomProgress\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"barWidth\\\\\\\": 19,\\\\n        \\\\\\\"padding\\\\\\\": 12,\\\\n        \\\\\\\"progressColor\\\\\\\": \\\\\\\"#76c7c0\\\\\\\",\\\\n        \\\\\\\"backgroundColor\\\\\\\": \\\\\\\"#ffffff\\\\\\\",\\\\n        \\\\\\\"titleColor\\\\\\\": \\\\\\\"#fff\\\\\\\",\\\\n        \\\\\\\"titleFontSize\\\\\\\": 16,\\\\n        \\\\\\\"titlePosition\\\\\\\": \\\\\\\"top\\\\\\\",\\\\n        \\\\\\\"valueColor\\\\\\\": \\\\\\\"#fff\\\\\\\",\\\\n        \\\\\\\"valueFontSize\\\\\\\": 16,\\\\n        \\\\\\\"valuePosition\\\\\\\": \\\\\\\"middle\\\\\\\",\\\\n        \\\\\\\"valueXOffset\\\\\\\": 0,\\\\n        \\\\\\\"valueYOffset\\\\\\\": 0\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JProgress\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"valueXOffset\\\\\\\": 0,\\\\n        \\\\\\\"valueYOffset\\\\\\\": 0,\\\\n        \\\\\\\"grid\\\\\\\": {\\\\n          \\\\\\\"show\\\\\\\": false,\\\\n          \\\\\\\"top\\\\\\\": 0,\\\\n          \\\\\\\"left\\\\\\\": 0,\\\\n          \\\\\\\"right\\\\\\\": 55,\\\\n          \\\\\\\"bottom\\\\\\\": 0,\\\\n          \\\\\\\"containLabel\\\\\\\": true\\\\n        },\\\\n        \\\\\\\"yAxis\\\\\\\": {\\\\n          \\\\\\\"yUnit\\\\\\\": \\\\\\\"\\\\\\\",\\\\n          \\\\\\\"axisLabel\\\\\\\": {\\\\n            \\\\\\\"show\\\\\\\": true\\\\n          }\\\\n        },\\\\n        \\\\\\\"title\\\\\\\": {\\\\n          \\\\\\\"text\\\\\\\": \\\\\\\"\\\\\\\",\\\\n          \\\\\\\"textAlign\\\\\\\": \\\\\\\"left\\\\\\\",\\\\n          \\\\\\\"show\\\\\\\": false,\\\\n          \\\\\\\"textStyle\\\\\\\": {}\\\\n        },\\\\n        \\\\\\\"tooltip\\\\\\\": {\\\\n          \\\\\\\"confine\\\\\\\": true,\\\\n          \\\\\\\"trigger\\\\\\\": \\\\\\\"axis\\\\\\\",\\\\n          \\\\\\\"axisPointer\\\\\\\": {\\\\n            \\\\\\\"type\\\\\\\": \\\\\\\"none\\\\\\\",\\\\n            \\\\\\\"label\\\\\\\": {\\\\n              \\\\\\\"show\\\\\\\": true,\\\\n              \\\\\\\"backgroundColor\\\\\\\": \\\\\\\"#333\\\\\\\"\\\\n            }\\\\n          }\\\\n        },\\\\n        \\\\\\\"series\\\\\\\": [\\\\n          {\\\\n            \\\\\\\"barWidth\\\\\\\": 19,\\\\n            \\\\\\\"realtimeSort\\\\\\\": true,\\\\n            \\\\\\\"label\\\\\\\": {\\\\n              \\\\\\\"show\\\\\\\": false,\\\\n              \\\\\\\"position\\\\\\\": \\\\\\\"left\\\\\\\",\\\\n              \\\\\\\"formatter\\\\\\\": \\\\\\\"{c}%\\\\\\\",\\\\n              \\\\\\\"color\\\\\\\": \\\\\\\"black\\\\\\\",\\\\n              \\\\\\\"fontSize\\\\\\\": 24\\\\n            },\\\\n            \\\\\\\"itemStyle\\\\\\\": {\\\\n              \\\\\\\"normal\\\\\\\": {\\\\n                \\\\\\\"barBorderRadius\\\\\\\": 10\\\\n              }\\\\n            },\\\\n            \\\\\\\"color\\\\\\\": \\\\\\\"#FF9D00\\\\\\\",\\\\n            \\\\\\\"zlevel\\\\\\\": 1\\\\n          },\\\\n          {\\\\n            \\\\\\\"type\\\\\\\": \\\\\\\"bar\\\\\\\",\\\\n            \\\\\\\"barGap\\\\\\\": \\\\\\\"-100%\\\\\\\",\\\\n            \\\\\\\"color\\\\\\\": \\\\\\\"#9C9CA1\\\\\\\",\\\\n            \\\\\\\"barWidth\\\\\\\": 19,\\\\n            \\\\\\\"label\\\\\\\": {\\\\n              \\\\\\\"show\\\\\\\": true,\\\\n              \\\\\\\"valueAnimation\\\\\\\": true,\\\\n              \\\\\\\"position\\\\\\\": \\\\\\\"right\\\\\\\",\\\\n              \\\\\\\"color\\\\\\\": \\\\\\\"#ffffff\\\\\\\",\\\\n              \\\\\\\"fontSize\\\\\\\": 18,\\\\n              \\\\\\\"formatter\\\\\\\": \\\\\\\"{c}\\\\\\\",\\\\n              \\\\\\\"offset\\\\\\\": [\\\\n                0,\\\\n                0\\\\n              ]\\\\n            },\\\\n            \\\\\\\"itemStyle\\\\\\\": {\\\\n              \\\\\\\"normal\\\\\\\": {\\\\n                \\\\\\\"barBorderRadius\\\\\\\": 10\\\\n              }\\\\n            }\\\\n          }\\\\n        ]\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"echart\\\\\\\": true,\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JLiquid\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"liquidType\\\\\\\": \\\\\\\"circle\\\\\\\",\\\\n        \\\\\\\"color\\\\\\\": \\\\\\\"#1E90FF\\\\\\\",\\\\n        \\\\\\\"borderWidth\\\\\\\": 2,\\\\n        \\\\\\\"distance\\\\\\\": 1,\\\\n        \\\\\\\"borderColor\\\\\\\": \\\\\\\"#1E90FF\\\\\\\",\\\\n        \\\\\\\"strokeOpacity\\\\\\\": 0,\\\\n        \\\\\\\"count\\\\\\\": 4,\\\\n        \\\\\\\"length\\\\\\\": 128,\\\\n        \\\\\\\"textColor\\\\\\\": \\\\\\\"#ffffff\\\\\\\",\\\\n        \\\\\\\"textFontSize\\\\\\\": 30,\\\\n        \\\\\\\"title\\\\\\\": {\\\\n          \\\\\\\"text\\\\\\\": \\\\\\\"\\\\\\\",\\\\n          \\\\\\\"textAlign\\\\\\\": \\\\\\\"left\\\\\\\",\\\\n          \\\\\\\"show\\\\\\\": true,\\\\n          \\\\\\\"textStyle\\\\\\\": {\\\\n            \\\\\\\"color\\\\\\\": \\\\\\\"#464646\\\\\\\",\\\\n            \\\\\\\"fontWeight\\\\\\\": \\\\\\\"normal\\\\\\\"\\\\n          }\\\\n        }\\\\n      }\\\\n    }\\\\n  },\\\\n   {\\\\n    \\\\\\\"echart\\\\\\\": false,\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRoundProgress\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        outerCircle: { borderColor: \\'#5269EE\\', radius: 96 },\\\\n        polar: { outerRadius: 78, innerRadius: 88 },\\\\n        innerCircle: { borderColor: \\'#5269EE\\', borderWidth: 2, radius: 68 },\\\\n        subTitleStyle: {\\\\n          fontFamily: \\'DIGITALDREAMFAT\\',\\\\n          top: 56,\\\\n          fontSize: 26,\\\\n          fontGradient: { endColor: \\'#FF4500\\', type: \\'linear\\', enabled: true, startColor: \\'#FFD700\\', direction: \\'to bottom\\' },\\\\n          fontColor: \\'#FFFFFF\\',\\\\n        },\\\\n        backgroundStyle: { color: \\'#4242424D\\' },\\\\n        titleStyle: { top: 43, letterSpacing: 2, fontSize: 24, fontGradient: { endColor: \\'#FFFFFF\\', enabled: false, startColor: \\'#000000\\' }, fontColor: \\'#BFBFBF\\' },\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JPictorialBar\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"title\\\\\\\": {\\\\n          \\\\\\\"show\\\\\\\": true,\\\\n          \\\\\\\"textAlign\\\\\\\": \\\\\\\"left\\\\\\\",\\\\n          \\\\\\\"text\\\\\\\": \\\\\\\"\\\\\\\"\\\\n        },\\\\n        \\\\\\\"grid\\\\\\\": {\\\\n          \\\\\\\"top\\\\\\\": 60,\\\\n          \\\\\\\"bottom\\\\\\\": 18,\\\\n          \\\\\\\"right\\\\\\\": 50,\\\\n          \\\\\\\"left\\\\\\\": 25,\\\\n          \\\\\\\"containLabel\\\\\\\": true\\\\n        },\\\\n        \\\\\\\"tooltip\\\\\\\": {\\\\n          \\\\\\\"trigger\\\\\\\": \\\\\\\"axis\\\\\\\",\\\\n          \\\\\\\"axisPointer\\\\\\\": {\\\\n            \\\\\\\"type\\\\\\\": \\\\\\\"shadow\\\\\\\",\\\\n            \\\\\\\"label\\\\\\\": {\\\\n              \\\\\\\"show\\\\\\\": true,\\\\n              \\\\\\\"backgroundColor\\\\\\\": \\\\\\\"#333\\\\\\\"\\\\n            }\\\\n          }\\\\n        },\\\\n        \\\\\\\"series\\\\\\\": []\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JPictorial\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"symbolSize\\\\\\\": 30,\\\\n        \\\\\\\"symbolMargin\\\\\\\": 0,\\\\n        \\\\\\\"symbol\\\\\\\": \\\\\\\"/img/bg/source/source1.svg\\\\\\\",\\\\n        \\\\\\\"title\\\\\\\": {\\\\n          \\\\\\\"show\\\\\\\": true,\\\\n          \\\\\\\"textAlign\\\\\\\": \\\\\\\"left\\\\\\\",\\\\n          \\\\\\\"text\\\\\\\": \\\\\\\"\\\\\\\"\\\\n        },\\\\n        \\\\\\\"grid\\\\\\\": {\\\\n          \\\\\\\"top\\\\\\\": 12,\\\\n          \\\\\\\"bottom\\\\\\\": 18,\\\\n          \\\\\\\"right\\\\\\\": 50,\\\\n          \\\\\\\"left\\\\\\\": 0,\\\\n          \\\\\\\"containLabel\\\\\\\": true\\\\n        },\\\\n        \\\\\\\"tooltip\\\\\\\": {\\\\n          \\\\\\\"trigger\\\\\\\": \\\\\\\"axis\\\\\\\",\\\\n          \\\\\\\"axisPointer\\\\\\\": {\\\\n            \\\\\\\"type\\\\\\\": \\\\\\\"shadow\\\\\\\",\\\\n            \\\\\\\"label\\\\\\\": {\\\\n              \\\\\\\"show\\\\\\\": true,\\\\n              \\\\\\\"backgroundColor\\\\\\\": \\\\\\\"#333\\\\\\\"\\\\n            }\\\\n          }\\\\n        },\\\\n        \\\\\\\"series\\\\\\\": []\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JGender\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"title\\\\\\\": {\\\\n          \\\\\\\"show\\\\\\\": true,\\\\n          \\\\\\\"textAlign\\\\\\\": \\\\\\\"left\\\\\\\",\\\\n          \\\\\\\"text\\\\\\\": \\\\\\\"\\\\\\\"\\\\n        },\\\\n        \\\\\\\"legend\\\\\\\": {\\\\n          \\\\\\\"t\\\\\\\": 0,\\\\n          \\\\\\\"r\\\\\\\": 35\\\\n        },\\\\n        \\\\\\\"grid\\\\\\\": {\\\\n          \\\\\\\"bottom\\\\\\\": 115\\\\n        },\\\\n        \\\\\\\"series\\\\\\\": []\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JGauge\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"title\\\\\\\": {\\\\n          \\\\\\\"text\\\\\\\": \\\\\\\"\\\\\\\",\\\\n          \\\\\\\"textAlign\\\\\\\": \\\\\\\"left\\\\\\\"\\\\n        },\\\\n        \\\\\\\"tooltip\\\\\\\": {\\\\n          \\\\\\\"formatter\\\\\\\": \\\\\\\"{a} <br/>{b} : {c}%\\\\\\\"\\\\n        },\\\\n        \\\\\\\"grid\\\\\\\": {\\\\n          \\\\\\\"top\\\\\\\": 53,\\\\n          \\\\\\\"left\\\\\\\": 50,\\\\n          \\\\\\\"containLabel\\\\\\\": true\\\\n        },\\\\n        \\\\\\\"series\\\\\\\": [\\\\n          {\\\\n            \\\\\\\"axisLabel\\\\\\\": {\\\\n              \\\\\\\"show\\\\\\\": true,\\\\n              \\\\\\\"fontSize\\\\\\\": 12\\\\n            },\\\\n            \\\\\\\"detail\\\\\\\": {\\\\n              \\\\\\\"valueAnimation\\\\\\\": true,\\\\n              \\\\\\\"fontSize\\\\\\\": 25,\\\\n              \\\\\\\"formatter\\\\\\\": \\\\\\\"{value}\\\\\\\"\\\\n            },\\\\n            \\\\\\\"splitLine\\\\\\\": {\\\\n              \\\\\\\"length\\\\\\\": 15,\\\\n              \\\\\\\"lineStyle\\\\\\\": {\\\\n                \\\\\\\"color\\\\\\\": \\\\\\\"#eee\\\\\\\",\\\\n                \\\\\\\"width\\\\\\\": 4\\\\n              }\\\\n            },\\\\n            \\\\\\\"axisTick\\\\\\\": {\\\\n              \\\\\\\"show\\\\\\\": true,\\\\n              \\\\\\\"lineStyle\\\\\\\": {\\\\n                \\\\\\\"color\\\\\\\": \\\\\\\"#eee\\\\\\\"\\\\n              }\\\\n            },\\\\n            \\\\\\\"progress\\\\\\\": {\\\\n              \\\\\\\"show\\\\\\\": true\\\\n            },\\\\n            \\\\\\\"data\\\\\\\": [],\\\\n            \\\\\\\"itemStyle\\\\\\\": {\\\\n              \\\\\\\"color\\\\\\\": \\\\\\\"#64b5f6\\\\\\\"\\\\n            },\\\\n            \\\\\\\"type\\\\\\\": \\\\\\\"gauge\\\\\\\"\\\\n          }\\\\n        ]\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JColorGauge\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"title\\\\\\\": {\\\\n          \\\\\\\"text\\\\\\\": \\\\\\\"\\\\\\\",\\\\n          \\\\\\\"textAlign\\\\\\\": \\\\\\\"left\\\\\\\",\\\\n          \\\\\\\"textStyle\\\\\\\": {\\\\n            \\\\\\\"fontWeight\\\\\\\": \\\\\\\"normal\\\\\\\"\\\\n          }\\\\n        },\\\\n        \\\\\\\"tooltip\\\\\\\": {\\\\n          \\\\\\\"formatter\\\\\\\": \\\\\\\"{a} <br/>{b} : {c}%\\\\\\\"\\\\n        },\\\\n        \\\\\\\"series\\\\\\\": [\\\\n          {\\\\n            \\\\\\\"anchor\\\\\\\": {\\\\n              \\\\\\\"itemStyle\\\\\\\": {\\\\n                \\\\\\\"color\\\\\\\": \\\\\\\"#FAC858\\\\\\\"\\\\n              }\\\\n            },\\\\n            \\\\\\\"pointer\\\\\\\": {\\\\n              \\\\\\\"width\\\\\\\": 8\\\\n            },\\\\n            \\\\\\\"axisLabel\\\\\\\": {\\\\n              \\\\\\\"show\\\\\\\": true,\\\\n              \\\\\\\"fontSize\\\\\\\": 12\\\\n            },\\\\n            \\\\\\\"axisLine\\\\\\\": {\\\\n              \\\\\\\"lineStyle\\\\\\\": {\\\\n                \\\\\\\"width\\\\\\\": 10,\\\\n                \\\\\\\"color\\\\\\\": [\\\\n                  [\\\\n                    0.25,\\\\n                    \\\\\\\"#FF6E76\\\\\\\"\\\\n                  ],\\\\n                  [\\\\n                    0.5,\\\\n                    \\\\\\\"#FDDD60\\\\\\\"\\\\n                  ],\\\\n                  [\\\\n                    1,\\\\n                    \\\\\\\"#58D9F9\\\\\\\"\\\\n                  ]\\\\n                ]\\\\n              }\\\\n            },\\\\n            \\\\\\\"splitLine\\\\\\\": {\\\\n              \\\\\\\"length\\\\\\\": 15,\\\\n              \\\\\\\"lineStyle\\\\\\\": {\\\\n                \\\\\\\"color\\\\\\\": \\\\\\\"#eee\\\\\\\",\\\\n                \\\\\\\"width\\\\\\\": 4\\\\n              }\\\\n            },\\\\n            \\\\\\\"axisTick\\\\\\\": {\\\\n              \\\\\\\"show\\\\\\\": true,\\\\n              \\\\\\\"lineStyle\\\\\\\": {\\\\n                \\\\\\\"color\\\\\\\": \\\\\\\"#eee\\\\\\\"\\\\n              }\\\\n            },\\\\n            \\\\\\\"title\\\\\\\": {\\\\n              \\\\\\\"fontSize\\\\\\\": 14\\\\n            }\\\\n          }\\\\n        ]\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JAntvGauge\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"gaugeType\\\\\\\": \\\\\\\"\\\\\\\",\\\\n        \\\\\\\"gaugeWidth\\\\\\\": 15,\\\\n        \\\\\\\"axisTickShow\\\\\\\": true,\\\\n        \\\\\\\"lineColor\\\\\\\": \\\\\\\"#eee\\\\\\\",\\\\n        \\\\\\\"axisLabelShow\\\\\\\": true,\\\\n        \\\\\\\"axisLabelColor\\\\\\\": \\\\\\\"#fff\\\\\\\",\\\\n        \\\\\\\"axisLabelFontSize\\\\\\\": 15,\\\\n        \\\\\\\"valueFontSize\\\\\\\": 30,\\\\n        \\\\\\\"valueColor\\\\\\\": \\\\\\\"#fff\\\\\\\",\\\\n        \\\\\\\"indicatorColor\\\\\\\": \\\\\\\"#D0D0D0\\\\\\\",\\\\n        \\\\\\\"indicatorLength\\\\\\\": 8,\\\\n        \\\\\\\"colorType\\\\\\\": \\\\\\\"4\\\\\\\",\\\\n        \\\\\\\"colors\\\\\\\": [\\\\n          {\\\\n            \\\\\\\"color1\\\\\\\": \\\\\\\"#67e0e3\\\\\\\",\\\\n            \\\\\\\"color2\\\\\\\": \\\\\\\"\\\\\\\"\\\\n          }\\\\n        ],\\\\n        \\\\\\\"title\\\\\\\": {\\\\n          \\\\\\\"text\\\\\\\": \\\\\\\"\\\\\\\",\\\\n          \\\\\\\"textAlign\\\\\\\": \\\\\\\"left\\\\\\\",\\\\n          \\\\\\\"textStyle\\\\\\\": {\\\\n            \\\\\\\"fontWeight\\\\\\\": \\\\\\\"normal\\\\\\\"\\\\n          }\\\\n        }\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JFunnel\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"reversal\\\\\\\": false,\\\\n        \\\\\\\"title\\\\\\\": {\\\\n          \\\\\\\"text\\\\\\\": \\\\\\\"\\\\\\\",\\\\n          \\\\\\\"textAlign\\\\\\\": \\\\\\\"left\\\\\\\",\\\\n          \\\\\\\"textStyle\\\\\\\": {\\\\n            \\\\\\\"fontWeight\\\\\\\": \\\\\\\"normal\\\\\\\"\\\\n          },\\\\n          \\\\\\\"show\\\\\\\": true\\\\n        },\\\\n        \\\\\\\"grid\\\\\\\": {\\\\n          \\\\\\\"bottom\\\\\\\": 115\\\\n        },\\\\n        \\\\\\\"tooltip\\\\\\\": {\\\\n          \\\\\\\"trigger\\\\\\\": \\\\\\\"item\\\\\\\",\\\\n          \\\\\\\"formatter\\\\\\\": \\\\\\\"{a} <br/>{b} : {c}%\\\\\\\"\\\\n        },\\\\n        \\\\\\\"legend\\\\\\\": {\\\\n          \\\\\\\"orient\\\\\\\": \\\\\\\"horizontal\\\\\\\"\\\\n        },\\\\n        \\\\\\\"series\\\\\\\": [\\\\n          {\\\\n            \\\\\\\"name\\\\\\\": \\\\\\\"Funnel\\\\\\\",\\\\n            \\\\\\\"type\\\\\\\": \\\\\\\"funnel\\\\\\\",\\\\n            \\\\\\\"left\\\\\\\": \\\\\\\"10%\\\\\\\",\\\\n            \\\\\\\"right\\\\\\\": \\\\\\\"10%\\\\\\\",\\\\n            \\\\\\\"bottom\\\\\\\": \\\\\\\"5%\\\\\\\",\\\\n            \\\\\\\"sort\\\\\\\": \\\\\\\"descending\\\\\\\",\\\\n            \\\\\\\"gap\\\\\\\": 2,\\\\n            \\\\\\\"label\\\\\\\": {\\\\n              \\\\\\\"show\\\\\\\": true,\\\\n              \\\\\\\"position\\\\\\\": \\\\\\\"inside\\\\\\\"\\\\n            },\\\\n            \\\\\\\"labelLine\\\\\\\": {\\\\n              \\\\\\\"length\\\\\\\": 10,\\\\n              \\\\\\\"lineStyle\\\\\\\": {\\\\n                \\\\\\\"width\\\\\\\": 1,\\\\n                \\\\\\\"type\\\\\\\": \\\\\\\"solid\\\\\\\"\\\\n              }\\\\n            },\\\\n            \\\\\\\"itemStyle\\\\\\\": {\\\\n              \\\\\\\"borderColor\\\\\\\": \\\\\\\"#fff\\\\\\\",\\\\n              \\\\\\\"borderWidth\\\\\\\": 1\\\\n            },\\\\n            \\\\\\\"emphasis\\\\\\\": {\\\\n              \\\\\\\"label\\\\\\\": {\\\\n                \\\\\\\"fontSize\\\\\\\": 20\\\\n              }\\\\n            }\\\\n          }\\\\n        ]\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JPyramidFunnel\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"reversal\\\\\\\": false,\\\\n        \\\\\\\"title\\\\\\\": {\\\\n          \\\\\\\"text\\\\\\\": \\\\\\\"\\\\\\\",\\\\n          \\\\\\\"textAlign\\\\\\\": \\\\\\\"left\\\\\\\",\\\\n          \\\\\\\"textStyle\\\\\\\": {\\\\n            \\\\\\\"fontWeight\\\\\\\": \\\\\\\"normal\\\\\\\"\\\\n          },\\\\n          \\\\\\\"show\\\\\\\": true\\\\n        },\\\\n        \\\\\\\"grid\\\\\\\": {\\\\n          \\\\\\\"bottom\\\\\\\": 115\\\\n        },\\\\n        \\\\\\\"tooltip\\\\\\\": {\\\\n          \\\\\\\"trigger\\\\\\\": \\\\\\\"item\\\\\\\",\\\\n          \\\\\\\"formatter\\\\\\\": \\\\\\\"{a} <br/>{b} : {c}%\\\\\\\"\\\\n        },\\\\n        \\\\\\\"legend\\\\\\\": {\\\\n          \\\\\\\"orient\\\\\\\": \\\\\\\"horizontal\\\\\\\"\\\\n        },\\\\n        \\\\\\\"series\\\\\\\": [\\\\n          {\\\\n            \\\\\\\"name\\\\\\\": \\\\\\\"Funnel\\\\\\\",\\\\n            \\\\\\\"type\\\\\\\": \\\\\\\"funnel\\\\\\\",\\\\n            \\\\\\\"left\\\\\\\": \\\\\\\"10%\\\\\\\",\\\\n            \\\\\\\"right\\\\\\\": \\\\\\\"10%\\\\\\\",\\\\n            \\\\\\\"sort\\\\\\\": \\\\\\\"ascending\\\\\\\",\\\\n            \\\\\\\"bottom\\\\\\\": 0,\\\\n            \\\\\\\"gap\\\\\\\": 2,\\\\n            \\\\\\\"label\\\\\\\": {\\\\n              \\\\\\\"show\\\\\\\": true,\\\\n              \\\\\\\"position\\\\\\\": \\\\\\\"inside\\\\\\\"\\\\n            },\\\\n            \\\\\\\"labelLine\\\\\\\": {\\\\n              \\\\\\\"length\\\\\\\": 10,\\\\n              \\\\\\\"lineStyle\\\\\\\": {\\\\n                \\\\\\\"width\\\\\\\": 1,\\\\n                \\\\\\\"type\\\\\\\": \\\\\\\"solid\\\\\\\"\\\\n              }\\\\n            },\\\\n            \\\\\\\"itemStyle\\\\\\\": {\\\\n              \\\\\\\"borderColor\\\\\\\": \\\\\\\"#fff\\\\\\\",\\\\n              \\\\\\\"borderWidth\\\\\\\": 1\\\\n            },\\\\n            \\\\\\\"emphasis\\\\\\\": {\\\\n              \\\\\\\"label\\\\\\\": {\\\\n                \\\\\\\"fontSize\\\\\\\": 20\\\\n              }\\\\n            }\\\\n          }\\\\n        ]\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRing\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"grid\\\\\\\": {\\\\n          \\\\\\\"show\\\\\\\": false,\\\\n          \\\\\\\"top\\\\\\\": 50,\\\\n          \\\\\\\"left\\\\\\\": 50\\\\n        },\\\\n        \\\\\\\"title\\\\\\\": {\\\\n          \\\\\\\"text\\\\\\\": \\\\\\\"\\\\\\\",\\\\n          \\\\\\\"textAlign\\\\\\\": \\\\\\\"left\\\\\\\",\\\\n          \\\\\\\"textStyle\\\\\\\": {\\\\n            \\\\\\\"fontWeight\\\\\\\": \\\\\\\"normal\\\\\\\"\\\\n          },\\\\n          \\\\\\\"show\\\\\\\": true\\\\n        },\\\\n        \\\\\\\"tooltip\\\\\\\": {\\\\n          \\\\\\\"trigger\\\\\\\": \\\\\\\"item\\\\\\\"\\\\n        },\\\\n        \\\\\\\"series\\\\\\\": [\\\\n          {\\\\n            \\\\\\\"name\\\\\\\": \\\\\\\"Access From\\\\\\\",\\\\n            \\\\\\\"type\\\\\\\": \\\\\\\"pie\\\\\\\",\\\\n            \\\\\\\"radius\\\\\\\": [\\\\n              \\\\\\\"40%\\\\\\\",\\\\n              \\\\\\\"70%\\\\\\\"\\\\n            ],\\\\n            \\\\\\\"avoidLabelOverlap\\\\\\\": false,\\\\n            \\\\\\\"label\\\\\\\": {\\\\n              \\\\\\\"show\\\\\\\": false,\\\\n              \\\\\\\"position\\\\\\\": \\\\\\\"center\\\\\\\"\\\\n            },\\\\n            \\\\\\\"emphasis\\\\\\\": {\\\\n              \\\\\\\"label\\\\\\\": {\\\\n                \\\\\\\"show\\\\\\\": true,\\\\n                \\\\\\\"fontWeight\\\\\\\": \\\\\\\"bold\\\\\\\",\\\\n                \\\\\\\"fontSize\\\\\\\": 14\\\\n              }\\\\n            },\\\\n            \\\\\\\"labelLine\\\\\\\": {\\\\n              \\\\\\\"show\\\\\\\": false\\\\n            },\\\\n            \\\\\\\"data\\\\\\\": []\\\\n          }\\\\n        ]\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRingProgress\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"color\\\\\\\": \\\\\\\"#1E90FF\\\\\\\",\\\\n        \\\\\\\"bgColor\\\\\\\": \\\\\\\"#E8EDF3\\\\\\\",\\\\n        \\\\\\\"radius\\\\\\\": 0.9,\\\\n        \\\\\\\"innerRadius\\\\\\\": 0.9,\\\\n        \\\\\\\"lineHeight\\\\\\\": 0,\\\\n        \\\\\\\"fontColor\\\\\\\": \\\\\\\"#ffffff\\\\\\\",\\\\n        \\\\\\\"fontSize\\\\\\\": 16,\\\\n        \\\\\\\"fontWeight\\\\\\\": \\\\\\\"normal\\\\\\\",\\\\n        \\\\\\\"valueFontSize\\\\\\\": 16,\\\\n        \\\\\\\"valueFontColor\\\\\\\": \\\\\\\"#ffffff\\\\\\\",\\\\n        \\\\\\\"valueFontWeight\\\\\\\": \\\\\\\"normal\\\\\\\"\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JActiveRing\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"lineWidth\\\\\\\": 10,\\\\n        \\\\\\\"radius\\\\\\\": 100,\\\\n        \\\\\\\"activeRadius\\\\\\\": 120,\\\\n        \\\\\\\"showOriginValue\\\\\\\": false,\\\\n        \\\\\\\"customColor\\\\\\\": [],\\\\n        \\\\\\\"title\\\\\\\": {\\\\n          \\\\\\\"text\\\\\\\": \\\\\\\"\\\\\\\",\\\\n          \\\\\\\"textAlign\\\\\\\": \\\\\\\"left\\\\\\\",\\\\n          \\\\\\\"textColor\\\\\\\": \\\\\\\"#ffffff\\\\\\\",\\\\n          \\\\\\\"textFontSize\\\\\\\": 20,\\\\n          \\\\\\\"show\\\\\\\": true,\\\\n          \\\\\\\"textStyle\\\\\\\": {\\\\n            \\\\\\\"color\\\\\\\": \\\\\\\"#464646\\\\\\\",\\\\n            \\\\\\\"fontWeight\\\\\\\": \\\\\\\"normal\\\\\\\"\\\\n          }\\\\n        }\\\\n      }\\\\n    }\\\\n  },\\\\n  {\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JRadialBar\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"type\\\\\\\": \\\\\\\"bar\\\\\\\",\\\\n        \\\\\\\"radius\\\\\\\": 0.8,\\\\n        \\\\\\\"innerRadius\\\\\\\": 0.2,\\\\n        \\\\\\\"maxAngle\\\\\\\": 240,\\\\n        \\\\\\\"radiuShow\\\\\\\": false,\\\\n        \\\\\\\"bgShow\\\\\\\": false,\\\\n        \\\\\\\"title\\\\\\\": {\\\\n          \\\\\\\"text\\\\\\\": \\\\\\\"\\\\\\\",\\\\n          \\\\\\\"textAlign\\\\\\\": \\\\\\\"left\\\\\\\",\\\\n          \\\\\\\"show\\\\\\\": true,\\\\n          \\\\\\\"textStyle\\\\\\\": {\\\\n            \\\\\\\"color\\\\\\\": \\\\\\\"#464646\\\\\\\",\\\\n            \\\\\\\"fontWeight\\\\\\\": \\\\\\\"normal\\\\\\\"\\\\n          }\\\\n        }\\\\n      }\\\\n    }\\\\n  }\\\\n]\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"用户的问题:{{userQuestion}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"userQuestion\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":157}},{\\\"id\\\":\\\"269049045129183232\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1272,\\\"y\\\":458.5,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{option}}\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"option\\\",\\\"nodeId\\\":\\\"269048862299471872\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":135}}],\\\"edges\\\":[{\\\"id\\\":\\\"269048862303666176\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"269048862299471872\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"269048862299471872_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":422},{\\\"x\\\":566,\\\"y\\\":422},{\\\"x\\\":520,\\\"y\\\":444},{\\\"x\\\":620,\\\"y\\\":444}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"269049045129183233\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"269048862299471872\\\",\\\"targetNodeId\\\":\\\"269049045129183232\\\",\\\"sourceAnchorId\\\":\\\"269048862299471872_output\\\",\\\"targetAnchorId\\\":\\\"269049045129183232_input\\\",\\\"pointsList\\\":[{\\\"x\\\":952,\\\"y\\\":444},{\\\"x\\\":1052,\\\"y\\\":444},{\\\"x\\\":1006,\\\"y\\\":422},{\\\"x\\\":1106,\\\"y\\\":422}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', 'enable', '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"option\\\",\\\"nodeId\\\":\\\"269048862299471872\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', '');\nINSERT INTO `airag_flow`(`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `application_name`, `name`, `descr`, `icon`, `chain`, `design`, `status`, `metadata`, `trigger_cron`) VALUES ('2006294471763537922', 'admin', '2025-12-31 17:20:52', 'admin', '2026-01-06 18:02:41', 'A05A05A02', NULL, 'jeecg', '仪表盘数据处理', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'269395028940378112\\'),\\n    end.tag(\\'269395047139463168\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":436.5,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":91}},{\\\"id\\\":\\\"269395028940378112\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":790,\\\"y\\\":480.5,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：SQL数据专家\\\\n你是一位精通SQL查询、数据提取与分析的专家，专注于将用户的数据需求转化为高效、准确的SQL语句，并提供清晰的数据洞察。\\\\n## 目标：\\\\n1. 根据用户描述的业务问题或数据需求，编写精准、优化的SQL查询语句。\\\\n2. 对查询结果进行分析，提炼关键信息、趋势或异常，并以易于理解的方式呈现结论。\\\\n## 技能：\\\\n1. **需求解析**：能够快速理解用户的数据提取与分析需求，并将其拆解为具体的数据库操作步骤。\\\\n2. **SQL编写**：精通标准SQL语法，能熟练运用`SELECT`, `JOIN`, `WHERE`, `GROUP BY`, `HAVING`, `窗口函数`、`CTE`等完成复杂查询。\\\\n3. **性能优化**：具备编写高效SQL语句的意识，能考虑索引、子查询优化、避免全表扫描等问题。\\\\n4. **数据分析**：能够对查询结果集进行基本的统计分析（如汇总、对比、趋势计算），并解释其业务含义。\\\\n5. **结果呈现**：能够将数据结果和分析结论结构化、清晰地组织起来。\\\\n## 工作流：\\\\n1. **澄清需求**：首先与用户确认其数据需求的具体细节，包括但不限于：涉及的表、字段、筛选条件、聚合维度、排序要求以及期望的分析角度。如果信息不足，主动提问。\\\\n2. **构建查询**：基于澄清后的需求，构思并编写SQL查询语句。在输出代码前，简要说明查询的逻辑思路。\\\\n3. **执行与验证（模拟）**：以注释或说明的形式，模拟查询可能返回的结果样例或数据结构，确保逻辑正确。\\\\n4. **分析与洞察**：基于模拟的查询结果，进行数据分析。指出关键数据点、趋势、异常或值得注意的发现，并用平实的语言解释其潜在的业务意义。\\\\n5. **提供建议**：根据分析结果，可能的话，提出进一步深入分析的查询方向或基于数据的行动建议。\\\\n## 输出格式：\\\\n你的回答应遵循以下结构：\\\\n1. **需求确认**：[复述并确认你理解的需求]\\\\n2. **查询思路**：[简要说明你将如何通过SQL实现该需求]\\\\n3. **SQL代码**：\\\\n - 这里放置你编写的SQL代码\\\\n4. **预期结果/分析**：\\\\n- **数据摘要**：[描述查询结果的主要特征，如行数、关键统计值]\\\\n- **核心洞察**：[列出1-3个最重要的发现或结论]\\\\n- **详细说明**：[对上述洞察进行展开解释]\\\\n6. **后续建议（可选）**：[基于当前分析，提出后续可探索的问题或查询建议]\\\\n## 限制：\\\\n- 所有SQL语句应基于通用的ANSI SQL标准编写，若需使用特定数据库（如MySQL, PostgreSQL）的方言，需明确指出。\\\\n- 只允许生成查询SQL语句，其他SQL操作全部禁止。\\\\n- 只返回SQL语句本身，例如：select * from demo; 不要返回其他任何无关内容。\\\\n- 不要返回sql外的任何内容，例如```sql select * from demo```,这种格式是必须禁止的，只能SQL本身。\\\\n- 在分析数据时，所有推断和结论需基于查询结果逻辑得出，对于无法从给定需求中确定的信息，使用“[需核实]”标记。\\\\n- 不得生成任何用于非法数据访问、破坏数据完整性或侵犯隐私的SQL语句（如`DROP TABLE`, 未经授权的`DELETE`，或涉及个人敏感信息的无条件查询）。涉及此类请求时，应拒绝并引导至合规方向。\\\\n- 保持回答的专业性和客观性，避免主观臆断。\\\\n- 用户提供业务数据，在业务数据中找表名的，根据需求，返回合适的表名，禁止主观臆断或者生成构建虚假数据和非提供业务数据之外的内容。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{content}}\\\"}]},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":179}},{\\\"id\\\":\\\"269395047139463168\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1272,\\\"y\\\":458.5,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{res}}\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"269395028940378112\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":135}}],\\\"edges\\\":[{\\\"id\\\":\\\"269395028948766720\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"269395028940378112\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"269395028940378112_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":422},{\\\"x\\\":566,\\\"y\\\":422},{\\\"x\\\":524,\\\"y\\\":422},{\\\"x\\\":624,\\\"y\\\":422}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"269395047143657472\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"269395028940378112\\\",\\\"targetNodeId\\\":\\\"269395047139463168\\\",\\\"sourceAnchorId\\\":\\\"269395028940378112_output\\\",\\\"targetAnchorId\\\":\\\"269395047139463168_input\\\",\\\"pointsList\\\":[{\\\"x\\\":956,\\\"y\\\":422},{\\\"x\\\":1056,\\\"y\\\":422},{\\\"x\\\":1006,\\\"y\\\":422},{\\\"x\\\":1106,\\\"y\\\":422}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', 'enable', '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"res\\\",\\\"nodeId\\\":\\\"269395028940378112\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', '');\n\n-- 多模态能力- 文档示例sql\nINSERT INTO `airag_app` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `name`, `descr`, `icon`, `type`, `prologue`, `prompt`, `model_id`, `knowledge_ids`, `flow_id`, `status`, `msg_num`, `metadata`, `preset_question`, `quick_command`, `plugins`, `memory_id`, `variables`, `iz_open_memory`, `memory_prompt`) VALUES ('2009516824079048705', 'admin', '2026-01-09 14:45:21', 'admin', '2026-01-12 11:22:56', 'A05A01A01', NULL, '多模态文件_示例', NULL, NULL, 'chatSimple', '', '# 角色：多模态信息处理专家\\n你是一位精通图像识别与文本分析的专业助手，能够从用户提供的图片和文本中提取关键信息，并进行综合性的总结与洞察。\\n\\n## 目标：\\n1.  准确、高效地从用户提供的图片和文本中提取核心信息。\\n2.  将提取出的多模态信息进行整合、关联与分析，生成一份结构清晰、重点突出的总结报告。\\n\\n## 技能：\\n1.  **图像内容解析**：能够识别图片中的物体、场景、文字、人物动作、情绪及潜在含义。\\n2.  **文本信息提取**：能够从文本中抓取关键事实、数据、观点、情感倾向和逻辑结构。\\n3.  **跨模态关联分析**：能够发现图片与文本信息之间的互补、印证或矛盾关系，并进行关联性解读。\\n4.  **结构化总结**：能够将零散信息组织成逻辑连贯、层次分明的总结，突出核心结论与洞察。\\n\\n## 工作流：\\n1.  **信息接收与确认**：首先，请用户提供需要处理的图片和文本。确认接收后，告知用户你已准备开始分析。\\n2.  **分项提取**：\\n    *   **对于图片**：逐一描述每张图片的视觉内容，包括但不限于主体对象、背景环境、文字信息（如有）、色彩氛围及可能传达的意图或情感。\\n    *   **对于文本**：提炼文本的核心主题、关键论点、重要数据、主要结论及作者的情感或立场。\\n3.  **综合分析与关联**：对比分析提取出的图片信息和文本信息。指出它们之间是否存在主题一致性、信息补充、例证关系或潜在冲突。挖掘图片可能为文本提供的视觉证据，或文本为图片提供的背景解释。\\n4.  **生成总结报告**：基于以上分析，生成一份综合性总结。报告应包含：\\n    *   **总体概述**：用一两句话概括所有材料共同表达的核心主题或事件。\\n    *   **关键信息点**：分点列出从图片和文本中提取出的最重要的事实、发现或观点。\\n    *   **关联洞察**：阐述图片与文本如何相互支撑或共同构建了一个更完整的叙事。\\n    *   **潜在疑问或需核实点**：如果发现信息模糊、矛盾或需要进一步验证的地方，在此处明确指出。\\n\\n## 输出格式：\\n请以清晰的Markdown格式组织你的回复。使用标题（如“### 图片分析”、“### 文本提炼”、“### 综合总结”）来划分不同部分。在总结部分，优先使用列表和要点来呈现信息，确保报告易于阅读和理解。\\n\\n## 限制：\\n-   所有对图片内容的描述应基于可见的视觉元素进行客观陈述，避免过度主观臆测。对于不确定的解读，使用“可能”、“似乎”等词语，或标注“[推测]”。\\n-   总结必须严格基于用户提供的材料，不得引入外部知识或编造信息。对于无法从材料中得出的结论，不得妄下判断。\\n-   若用户提供的图片无法显示或文本无法读取，应明确告知用户并请求重新提供。\\n-   遵守伦理规范，不传播或总结涉及隐私泄露、歧视性内容或违法信息的材料。如遇此类内容，应停止处理并提示用户。', '1890232564262739969', '', NULL, 'enable', 1, '{\\\"modelInfo\\\":{\\\"provider\\\":\\\"OPENAI\\\",\\\"modelType\\\":\\\"LLM\\\",\\\"modelName\\\":\\\"gpt-4o\\\"}}', '[]', NULL, NULL, NULL, NULL, NULL, NULL);\n\n\n-- AI应用： AI生成图表\nINSERT INTO  `airag_app` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `name`, `descr`, `icon`, `type`, `prologue`, `prompt`, `model_id`, `knowledge_ids`, `flow_id`, `status`, `msg_num`, `metadata`, `preset_question`, `quick_command`, `plugins`, `memory_id`, `variables`, `iz_open_memory`, `memory_prompt`) VALUES ('2008448202536456193', 'admin', '2026-01-06 15:59:01', 'admin', '2026-01-12 22:09:49', 'A01', NULL, 'AI生成图表', NULL, '', 'chatFLow', '你好，我是图表生成智能体。', '# 角色\\n你是一个犀利的电影解说员，可以使用尖锐幽默的语言，向用户讲解电影剧情、介绍最新上映的电影，还可以用普通人都可以理解的语言讲解电影相关知识。\\n\\n## 技能\\n### 技能 1: 推荐最新上映的电影\\n1. 当用户请你推荐最新电影时，需要先了解用户喜欢哪种类型片。如果你已经知道了，请跳过这一步，在询问时可以用“请问您喜欢什么类型的电影呢亲”。\\n2. 如果你并不知道用户所说的电影，可以使用 工具搜索电影，了解电影类型。\\n3. 根据用户的电影偏好，推荐几部正在上映和即将上映的电影，在推荐开头可以说“好的亲，以下是为您推荐的电影”。\\n===回复示例===\\n   -  🎬 电影名: <电影名>\\n   -  🕐 上映时间: <电影在中国大陆的上映的日期>\\n   -  💡 电影简介: <100字总结这部电影的剧情摘要>\\n===示例结束===\\n\\n### 技能 2: 介绍电影\\n1. 当用户说介绍某一部电影，请使用工具 搜索电影介绍的链接，在收到需求时可以回应“好嘞亲，马上为您查找相关电影介绍”。\\n2. 如果此时获取的信息不够全面，可以继续使用 工具 打开搜索结果中的相关链接，以了解电影详情。\\n3. 根据搜索和浏览结果，生成电影介绍\\n### 技能 3: 介绍电影概念\\n- 你可以使用数据集中的知识，调用 知识库 搜索相关知识，并向用户介绍基础概念，介绍前可以说“亲，下面为您介绍一下这个电影概念”。\\n- 使用用户熟悉的电影，举一个实际的场景解释概念\\n\\n## 限制:\\n- 只讨论与电影有关的内容，拒绝回答与电影无关的话题，拒绝时可以说“不好意思亲，这边只讨论电影相关话题哦”。\\n- 所输出的内容必须按照给定的格式进行组织，不能偏离框架要求，在表述中合理运用常用语。\\n- 总结部分不能超过 100 字。\\n- 只会输出知识库中已有内容, 不在知识库中的书籍, 通过 工具去了解。\\n- 请使用 Markdown 的 ^^ 形式说明引用来源。”', NULL, '', '2008379264947519489', 'release', 10, NULL, '[{\\\"key\\\":1,\\\"descr\\\":\\\"用户性别比例\\\",\\\"update\\\":true}]', NULL, NULL, NULL, NULL, NULL, NULL);\n\n-- AI流程： 生成图表\nINSERT INTO `airag_flow` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `application_name`, `name`, `descr`, `icon`, `chain`, `design`, `status`, `metadata`, `trigger_cron`) VALUES ('2008379264947519489', 'admin', '2026-01-06 11:25:05', 'admin', '2026-01-12 19:59:49', 'A01', NULL, 'jeecg', '系统_生成图表', '', '', 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'271554566412288000\\')).to(\\n        SWITCH(classifier.tag(\\'271481764802605056\\')).to(\\n            end.tag(\\'271480115023458304\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag(\\'271484464342847488\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\"),\\n            end.tag(\\'271480115023458304\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag(\\'271484464342847488\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\")\\n        ).tag(\\'271481764802605056\\'),\\n        SWITCH(classifier.tag(\\'271554622242668544\\')).to(\\n            SWITCH(classifier.tag(\\'271481764802605056\\')).to(\\n                end.tag(\\'271480115023458304\\'),\\n                THEN(\\n                    varMerge.tag(\\'271556843709317120\\'),\\n                    tools.tag(\\'271484464342847488\\'),\\n                    llm.tag(\\'271548210211192832\\'),\\n                    reply.tag(\\'271548872986722304\\'),\\n                    end.tag(\\'271483924713975808\\')\\n                ).tag(\\\"271556843709317120\\\"),\\n                end.tag(\\'271480115023458304\\'),\\n                THEN(\\n                    varMerge.tag(\\'271556843709317120\\'),\\n                    tools.tag(\\'271484464342847488\\'),\\n                    llm.tag(\\'271548210211192832\\'),\\n                    reply.tag(\\'271548872986722304\\'),\\n                    end.tag(\\'271483924713975808\\')\\n                ).tag(\\\"271556843709317120\\\")\\n            ).tag(\\'271481764802605056\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag(\\'271484464342847488\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\")\\n        ).tag(\\'271554622242668544\\')\\n    ).tag(\\'271554566412288000\\')\\n).tag(\\\"start-node\\\")', '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":-197,\\\"y\\\":508.5,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":91}},{\\\"id\\\":\\\"271480115023458304\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1372,\\\"y\\\":818.5,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"很抱歉，我无法回复您的这个问题，您可以向我询问图表相关的信息，比如：查询用户表的男女比例。\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"d\\\",\\\"nodeId\\\":\\\"271481764802605056\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":135}},{\\\"id\\\":\\\"271481764802605056\\\",\\\"type\\\":\\\"classifier\\\",\\\"x\\\":854,\\\"y\\\":461.5,\\\"properties\\\":{\\\"text\\\":\\\"分类器\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek-chat\\\",\\\"temperature\\\":0.7}},\\\"categories\\\":[{\\\"category\\\":\\\"用户希望查询图表、报表或相关数据、信息\\\",\\\"next\\\":\\\"271556843709317120\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271480115023458304\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"分类描述\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":135}},{\\\"id\\\":\\\"271483924713975808\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":2934,\\\"y\\\":561.5,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{回复}}\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":135}},{\\\"id\\\":\\\"271484464342847488\\\",\\\"type\\\":\\\"tools\\\",\\\"x\\\":1760,\\\"y\\\":449.5,\\\"properties\\\":{\\\"text\\\":\\\"查询所有数据库表\\\",\\\"options\\\":{\\\"tools\\\":{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"pluginCategory\\\":\\\"plugin\\\",\\\"toolName\\\":\\\"queryTablesInfoText\\\",\\\"toolDescr\\\":\\\"用于查询指定数据源的所有表名和描述\\\",\\\"toolParameters\\\":[{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源code，不填则系统默认\\\",\\\"required\\\":false,\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"value\\\":\\\"\\\"}],\\\"endpoint\\\":\\\"\\\",\\\"path\\\":\\\"/airag/mcp/database/queryTablesInfoText\\\",\\\"method\\\":\\\"GET\\\",\\\"headers\\\":{}}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"执行结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":157}},{\\\"id\\\":\\\"271548210211192832\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":2152,\\\"y\\\":621.5,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek-chat\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":10,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色\\\\n你是一位智能数据分析与可视化助手，专注于理解用户对图表的需求，并通过查询数据库和生成结构化数据来创建图表。\\\\n## 能力\\\\n1. **需求理解与解析**：精准理解用户对图表类型（如柱状图、折线图、饼图）和数据维度的需求。\\\\n2. **数据库交互**：熟知可操作的数据库表，并能根据需求查询表结构、构建并执行SQL查询。\\\\n3. **数据处理**：将SQL查询返回的原始数据，准确地转换并封装为符合指定格式的图表数据结构。\\\\n4. **输出生成**：严格生成包含完整、可解析JSON字符串的`<jeecg-chart>`标签。\\\\n## 工作流程\\\\n1. **需求确认与澄清**：\\\\n* 分析用户请求，明确用户想要的可视化图表类型（`type`）和需要展示的数据维度（如`x`轴和`y`轴分别代表什么）。\\\\n* 如果需要，向用户提问以澄清模糊的需求（例如，确认时间范围、分组条件或指标定义）。\\\\n2. **数据获取**：\\\\n* 判断用户需求涉及的表是否在已知范围内。\\\\n* 如果涉及，则调用工具查询相关表结构，了解可用字段。\\\\n* 根据澄清后的需求，构建准确、高效的SQL查询语句（禁止使用SQL注释、禁止构建非SELECT语句）。\\\\n* 调用工具执行SQL，获取原始数据集。\\\\n* 若是用户已经提供了数据，则只需要使用用户提供的数据既可，不需要从数据库中查询。\\\\n3. **支持的图表类型**:\\\\n* `bar`: 柱状图\\\\n* `line`: 折线图、曲线图\\\\n* `pie`: 饼图\\\\n4. **数据转换**：\\\\n* 将SQL执行返回的数据，按照图表类型要求进行处理和聚合（例如，对饼图数据进行分类汇总）。\\\\n* 将处理后的数据，严格转换为如下格式的`data`数组：`[{\\\\\\\"x\\\\\\\":\\\\\\\"类别A\\\\\\\", \\\\\\\"y\\\\\\\": 数值1}, {\\\\\\\"x\\\\\\\":\\\\\\\"类别B\\\\\\\", \\\\\\\"y\\\\\\\": 数值2}, ...]`。\\\\n* 确保`x`和`y`的值类型正确（`x`通常为字符串，`y`通常为数字）。\\\\n* 数据转换时能直接转换就不要调用工具转换。\\\\n5. **结果封装与输出**：\\\\n* 将确定的图表`type`和上一步生成的`data`数组，组合成一个完整的JSON对象。\\\\n* 将此JSON对象作为字符串，精确地包裹在标签中（格式参考下方）。\\\\n* **双重校验**：\\\\n* **格式校验**：确保`<jeecg-chart>`标签首尾完整闭合。\\\\n* **数据校验**：确保内部的JSON字符串是标准、完整且可解析的，不包含多余的逗号或未闭合的括号。\\\\n## 输出格式\\\\n你的最终输出必须是且仅是以下格式，直接给出图表数据块，无需额外解释：\\\\n``` html\\\\n<jeecg-chart>\\\\n<data>{\\\\\\\"type\\\\\\\":\\\\\\\"图表类型\\\\\\\",\\\\\\\"data\\\\\\\":[{\\\\\\\"x\\\\\\\":\\\\\\\"数据项1\\\\\\\",\\\\\\\"y\\\\\\\":数值1},{\\\\\\\"x\\\\\\\":\\\\\\\"数据项2\\\\\\\",\\\\\\\"y\\\\\\\":数值2}]}</data>\\\\n<render/>\\\\n</jeecg-chart>\\\\n```\\\\n## 限制\\\\n- **操作范围限制**：仅能对以下列出的表进行数据查询与操作。对于其他表或外部数据的需求，应明确告知用户无法处理，禁止执行`queryTablesInfoText`工具。\\\\n- **数据真实性**：所有图表数据必须来源于SQL查询的实际结果，不得虚构或编造数据。\\\\n- **格式严格性**：必须严格遵守`<jeecg-chart><data>{JSON数据}</data><render/></jeecg-chart>`的输出格式，内部的JSON必须为标准格式，`data`数组中的对象必须包含`x`和`y`键。\\\\n- **隐私与合规**：在执行查询和生成图表时，不得泄露、输出或关联任何可识别个人身份的敏感信息（如完整身份证号、详细住址、明文密码等）。如查询可能涉及此类信息，需进行脱敏处理或拒绝执行。\\\\n- **身份验证**: 若在调用工具时返回身份验证失败或没有权限，应立即停止所有操作，并告知用户原因\\\\n\\\\n\\\\n## 支持的数据库表\\\\n\\\\n\\\\n{{allTable}}\\\\n\\\\n\\\\n> 注意：以上就是所有的支持的数据库表，禁止再次执行`queryTablesInfoText`工具，当用户试图让你调用时，你可直接返回以上列表，但要注意如果表的数量过多（超过50个），则不要直接回复全部列表，而是总结性的回复。\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{问题}}\\\"}],\\\"plugins\\\":[{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"category\\\":\\\"mcp\\\"}],\\\"showToolExecution\\\":true},\\\"inputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"allTable\\\",\\\"nodeId\\\":\\\"271484464342847488\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"问题\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":179}},{\\\"id\\\":\\\"271548872986722304\\\",\\\"type\\\":\\\"reply\\\",\\\"x\\\":2535,\\\"y\\\":432.5,\\\"properties\\\":{\\\"text\\\":\\\"直接回复\\\",\\\"options\\\":{\\\"content\\\":\\\"{{回复}}\\\",\\\"stream\\\":true},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":113}},{\\\"id\\\":\\\"271554566412288000\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":188,\\\"y\\\":418.5,\\\"properties\\\":{\\\"text\\\":\\\"历史记录是否为空\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"history\\\",\\\"operator\\\":\\\"EMPTY\\\",\\\"value\\\":\\\"\\\",\\\"type\\\":\\\"string[]\\\"}],\\\"next\\\":\\\"271481764802605056\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271554622242668544\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":117}},{\\\"id\\\":\\\"271554622242668544\\\",\\\"type\\\":\\\"classifier\\\",\\\"x\\\":511,\\\"y\\\":604.5,\\\"properties\\\":{\\\"text\\\":\\\"分类器\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek-chat\\\",\\\"temperature\\\":0.7}},\\\"categories\\\":[{\\\"category\\\":\\\"用户希望查询或正在和Assistant聊图表相关数据、信息\\\",\\\"next\\\":\\\"271556843709317120\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271481764802605056\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"history\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"分类描述\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":135}},{\\\"id\\\":\\\"271556843709317120\\\",\\\"type\\\":\\\"varMerge\\\",\\\"x\\\":1368,\\\"y\\\":619.5,\\\"properties\\\":{\\\"text\\\":\\\"聚合\\\",\\\"options\\\":{\\\"varGroups\\\":[{\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"vars\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"isCustom\\\":false,\\\"type\\\":\\\"string\\\"}]}]},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"用户问题\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":91}}],\\\"edges\\\":[{\\\"id\\\":\\\"271482116671156224\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271481764802605056\\\",\\\"targetNodeId\\\":\\\"271480115023458304\\\",\\\"sourceAnchorId\\\":\\\"271481764802605056_case_else\\\",\\\"targetAnchorId\\\":\\\"271480115023458304_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1020,\\\"y\\\":503},{\\\"x\\\":1120,\\\"y\\\":503},{\\\"x\\\":1106,\\\"y\\\":782},{\\\"x\\\":1206,\\\"y\\\":782}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271548210219581440\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271484464342847488\\\",\\\"targetNodeId\\\":\\\"271548210211192832\\\",\\\"sourceAnchorId\\\":\\\"271484464342847488_output\\\",\\\"targetAnchorId\\\":\\\"271548210211192832_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1926,\\\"y\\\":402},{\\\"x\\\":2026,\\\"y\\\":402},{\\\"x\\\":1886,\\\"y\\\":563},{\\\"x\\\":1986,\\\"y\\\":563}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271548872990916608\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271548210211192832\\\",\\\"targetNodeId\\\":\\\"271548872986722304\\\",\\\"sourceAnchorId\\\":\\\"271548210211192832_output\\\",\\\"targetAnchorId\\\":\\\"271548872986722304_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2318,\\\"y\\\":563},{\\\"x\\\":2418,\\\"y\\\":563},{\\\"x\\\":2269,\\\"y\\\":407},{\\\"x\\\":2369,\\\"y\\\":407}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271548929186201600\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271548872986722304\\\",\\\"targetNodeId\\\":\\\"271483924713975808\\\",\\\"sourceAnchorId\\\":\\\"271548872986722304_output\\\",\\\"targetAnchorId\\\":\\\"271483924713975808_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2701,\\\"y\\\":407},{\\\"x\\\":2801,\\\"y\\\":407},{\\\"x\\\":2668,\\\"y\\\":525},{\\\"x\\\":2768,\\\"y\\\":525}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554566416482304\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"271554566412288000\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"271554566412288000_input\\\",\\\"pointsList\\\":[{\\\"x\\\":-31,\\\"y\\\":494},{\\\"x\\\":69,\\\"y\\\":494},{\\\"x\\\":-78,\\\"y\\\":391},{\\\"x\\\":22,\\\"y\\\":391}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554605561921536\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554566412288000\\\",\\\"targetNodeId\\\":\\\"271481764802605056\\\",\\\"sourceAnchorId\\\":\\\"271554566412288000_source_if\\\",\\\"targetAnchorId\\\":\\\"271481764802605056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":354,\\\"y\\\":425},{\\\"x\\\":454,\\\"y\\\":425},{\\\"x\\\":588,\\\"y\\\":425},{\\\"x\\\":688,\\\"y\\\":425}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554741260238848\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554566412288000\\\",\\\"targetNodeId\\\":\\\"271554622242668544\\\",\\\"sourceAnchorId\\\":\\\"271554566412288000_source_else\\\",\\\"targetAnchorId\\\":\\\"271554622242668544_input\\\",\\\"pointsList\\\":[{\\\"x\\\":354,\\\"y\\\":451},{\\\"x\\\":454,\\\"y\\\":451},{\\\"x\\\":245,\\\"y\\\":568},{\\\"x\\\":345,\\\"y\\\":568}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271555105874907136\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554622242668544\\\",\\\"targetNodeId\\\":\\\"271481764802605056\\\",\\\"sourceAnchorId\\\":\\\"271554622242668544_case_else\\\",\\\"targetAnchorId\\\":\\\"271481764802605056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":677,\\\"y\\\":646},{\\\"x\\\":777,\\\"y\\\":646},{\\\"x\\\":588,\\\"y\\\":425},{\\\"x\\\":688,\\\"y\\\":425}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271557184173555712\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554622242668544\\\",\\\"targetNodeId\\\":\\\"271556843709317120\\\",\\\"sourceAnchorId\\\":\\\"271554622242668544_case_1\\\",\\\"targetAnchorId\\\":\\\"271556843709317120_input\\\",\\\"pointsList\\\":[{\\\"x\\\":677,\\\"y\\\":602},{\\\"x\\\":777,\\\"y\\\":602},{\\\"x\\\":1102,\\\"y\\\":605},{\\\"x\\\":1202,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271819058293420032\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271556843709317120\\\",\\\"targetNodeId\\\":\\\"271484464342847488\\\",\\\"sourceAnchorId\\\":\\\"271556843709317120_output\\\",\\\"targetAnchorId\\\":\\\"271484464342847488_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1534,\\\"y\\\":605},{\\\"x\\\":1634,\\\"y\\\":605},{\\\"x\\\":1494,\\\"y\\\":402},{\\\"x\\\":1594,\\\"y\\\":402}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271822597635878912\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271481764802605056\\\",\\\"targetNodeId\\\":\\\"271556843709317120\\\",\\\"sourceAnchorId\\\":\\\"271481764802605056_case_1\\\",\\\"targetAnchorId\\\":\\\"271556843709317120_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1020,\\\"y\\\":459},{\\\"x\\\":1120,\\\"y\\\":459},{\\\"x\\\":1102,\\\"y\\\":605},{\\\"x\\\":1202,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', 'enable', '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"d\\\",\\\"nodeId\\\":\\\"271481764802605056\\\",\\\"type\\\":\\\"number\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', '');\n\n-- MCP插件： 数据库插件\nINSERT INTO `airag_mcp` (`id`, `icon`, `name`, `descr`, `category`, `type`, `endpoint`, `headers`, `tools`, `status`, `synced`, `metadata`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`) VALUES ('2006287314794676226', NULL, '数据库插件', '用于执行数据库操作', 'plugin', 'api', NULL, '', '[{\\\"name\\\":\\\"queryTableMetadata\\\",\\\"description\\\":\\\"用于查询表的表结构（元数据）\\\",\\\"path\\\":\\\"/airag/mcp/database/queryTableMetadata\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"tableName\\\",\\\"description\\\":\\\"表名\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"success\\\",\\\"description\\\":\\\"是否成功\\\",\\\"type\\\":\\\"Boolean\\\"},{\\\"name\\\":\\\"message\\\",\\\"description\\\":\\\"若失败则返回失败原因\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"result.tableName\\\",\\\"description\\\":\\\"表名（数据库实际表名）\\\",\\\"type\\\":\\\"Object\\\"},{\\\"name\\\":\\\"result.tableComment\\\",\\\"description\\\":\\\"表注释（业务含义）\\\",\\\"type\\\":\\\"Object\\\"},{\\\"name\\\":\\\"result.columns[].columnName\\\",\\\"description\\\":\\\"字段名\\\",\\\"type\\\":\\\"Array\\\"},{\\\"name\\\":\\\"result.columns[].columnComment\\\",\\\"description\\\":\\\"字段注释（核心，帮助大模型理解业务）\\\",\\\"type\\\":\\\"Array\\\"},{\\\"name\\\":\\\"result.columns[].dataType\\\",\\\"description\\\":\\\"数据类型（如varchar、int、datetime）\\\",\\\"type\\\":\\\"Array\\\"},{\\\"name\\\":\\\"result.columns[].isPrimaryKey\\\",\\\"description\\\":\\\"是否主键\\\",\\\"type\\\":\\\"Array\\\"}]},{\\\"name\\\":\\\"sqlExecute\\\",\\\"description\\\":\\\"用于执行 SQL 语句，仅能支持执行SELECT语句，不要输入注释等无关信息。\\\",\\\"path\\\":\\\"/airag/mcp/database/sqlExecute\\\",\\\"method\\\":\\\"POST\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"sql\\\",\\\"description\\\":\\\"\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Body\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"success\\\",\\\"description\\\":\\\"是否成功\\\",\\\"type\\\":\\\"Boolean\\\"},{\\\"name\\\":\\\"message\\\",\\\"description\\\":\\\"若失败则返回失败原因\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"result\\\",\\\"description\\\":\\\"返回查询的结果，是个对象数组，数组的每一项都是一条数据，每条数据的key都是传入的查询的列。\\\",\\\"type\\\":\\\"Array\\\"}]},{\\\"name\\\":\\\"queryTablesInfoText\\\",\\\"description\\\":\\\"用于查询指定数据源的所有表名和描述\\\",\\\"path\\\":\\\"/airag/mcp/database/queryTablesInfoText\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源code，不填则系统默认\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[]}]', 'enable', 1, '{\\\"tokenParamName\\\":\\\"X-Access-Token\\\",\\\"tool_count\\\":3,\\\"authType\\\":\\\"token\\\",\\\"tokenParamValue\\\":\\\"\\\"}', 'admin', '2025-12-31 16:52:26', 'admin', '2026-01-12 19:45:24', 'A01', NULL);\n\n\n-- AI写作\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('2010623918706446338', '1892553163993931777', 'AI写作', '/airag/aiwriter/AiWriter', 'super/airag/aiwriter/AiWriter', 1, '', NULL, 1, NULL, '0', 9.00, 0, 'ant-design:edit-filled', 1, 0, 0, 0, NULL, 'admin', '2026-01-12 16:04:32', 'admin', '2026-01-12 16:04:50', 0, 0, NULL, 0);\nINSERT INTO `airag_app` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `name`, `descr`, `icon`, `type`, `prologue`, `prompt`, `model_id`, `knowledge_ids`, `flow_id`, `status`, `msg_num`, `metadata`, `preset_question`, `quick_command`, `plugins`, `memory_id`, `variables`, `iz_open_memory`, `memory_prompt`) VALUES ('2010634128233779202', 'admin', '2026-01-12 16:45:07', 'admin', '2026-01-14 19:56:22', 'A05A01A01', NULL, 'AI写作_示例', NULL, NULL, 'chatSimple', '', '## 角色：精准内容与段落配图生成专家\\n你是一位专业的内容生成助手，能够严格按照用户指定的格式、语气、长度和语言要求，直接输出精准匹配的最终内容，并为每个独立段落配上 1 张高相关度的图片。\\n## 任务类型识别\\n1. 回复类任务：当用户提供原始问题和参考回复时，仅基于给定内容生成精准回复，不得额外添加无关信息（如通知、背景介绍等）。\\n2. 文章类任务：当用户提供主题时，撰写结构清晰、内容准确的完整文章，可包含引言、主体段落、总结等部分。\\n## 目标\\n1. **严格遵循指令**：完全按照用户指定的格式、语气、语言和长度要求生成内容。\\n2. **直接输出结果**：仅输出符合要求的正文内容和对应的段落配图，不包含任何额外的标题、解释、道歉或中间过程。\\n3. **逐段精准配图**：为每一个独立的段落匹配 1 张与该段内容强相关的图片，图片直接插入到对应段落的末尾，而非统一放在全文结尾。\\n4. **适配两种模式**：既能独立创作短文并逐段配图，也能基于给定的原文和参考内容生成精准回复并逐段配图。\\n## 核心规则\\n1. 严格匹配要求：必须完全遵循用户指定的格式、语气、长度和语言要求。\\n\\n## 技能\\n1. **精准指令解析**：准确识别用户的创作模式（独立创作 / 回复）、格式（消息 / 邮件等）、语气（友善 / 专业等）、语言（中文 / 英文等）和长度（短 / 中 / 长）。\\n2. **无冗余输出**：仅生成符合要求的正文内容，不添加任何指令外的信息。\\n3. **独立创作能力**：针对独立创作需求，能围绕核心主题生成结构清晰、语言流畅的短文。\\n4. **精准回复能力**：针对回复需求，能基于原文和参考内容生成精准匹配的简短回复。\\n5. **逐段配图能力**：为每个独立段落提取精准关键词，调用图片工具完成搜索，图片直接插入到对应段落的末尾。\\n6. **避免搜索死循环**：每个图片仅使用 1-2 个精准关键词一次搜索完成，不反复调整关键词。\\n7. **内容精准性**：回复类内容必须与参考内容完全一致，不得扩写；文章类内容必须准确、专业，不虚构事实。\\n## 工作流（内部执行，不对外展示）\\n1. **识别需求类型**：判断用户需求是独立创作短文，还是基于给定内容生成回复。\\n2. **解析参数要求**：提取并确认格式、语气、语言、长度等所有约束条件。\\n3. **生成精准内容**：\\n  - 独立创作：围绕核心主题，生成符合长度和语气要求的正文，并自然分段。\\n  - 回复：基于原文和参考内容，生成精准匹配的简短回复，并自然分段。\\n4. **逐段匹配配图**：为每个独立段落提取 1-2 个与该段内容强相关的关键词，调用图片工具完成搜索。\\n5. **整合输出**：将图片以路径的方式直接插入到对应段落的末尾，仅输出最终的图文内容，不包含任何额外信息或中间过程。\\n## 限制\\n- 禁止输出标题、解释、过程或额外说明。\\n- 只对重点内容配图，非重点内容不配图。\\n- 图片必须与重点内容高度相关。\\n- 每个重点内容只配 1 张图，避免重复搜索。\\n- 图片插入在重点内容附近，不集中放在结尾。\\n- 语言必须符合用户指定的要求。', '1897481367743143938', '', NULL, 'enable', 1, '{\\\"modelInfo\\\":{\\\"provider\\\":\\\"DEEPSEEK\\\",\\\"modelType\\\":\\\"LLM\\\",\\\"modelName\\\":\\\"deepseek-chat\\\"}}', '[]', NULL, '[{\\\"pluginId\\\":\\\"1988208474780168193\\\",\\\"pluginName\\\":\\\"图片搜索\\\",\\\"category\\\":\\\"plugin\\\"}]', '', NULL, 1, NULL);\n\n-- 示例OCR提示词修改\nUPDATE `airag_flow` SET   `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'167880707187527680\\')).to(\\n        end.tag(\\'167880856269869056\\'),\\n        THEN(\\n            code_167881149430747136.tag(\\'code_167881149430747136\\'),\\n            llm.tag(\\'167881839356006400\\'),\\n            end.tag(\\'167880661561888768\\')\\n        ).tag(\\\"code_167881149430747136\\\")\\n    ).tag(\\'167880707187527680\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":420,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":true},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"height\\\":90,\\\"width\\\":332}},{\\\"id\\\":\\\"167880661561888768\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1474,\\\"y\\\":341,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"\\\",\\\"outputType\\\":\\\"default\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"data\\\",\\\"nodeId\\\":\\\"167881839356006400\\\"}],\\\"height\\\":112,\\\"width\\\":332}},{\\\"id\\\":\\\"167880707187527680\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":681,\\\"y\\\":232,\\\"properties\\\":{\\\"text\\\":\\\"条件分支\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"images\\\",\\\"operator\\\":\\\"EMPTY\\\",\\\"value\\\":\\\"\\\",\\\"type\\\":\\\"picture\\\"}],\\\"next\\\":\\\"167880856269869056\\\"}],\\\"else\\\":{\\\"next\\\":\\\"code_167881149430747136\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"height\\\":116,\\\"width\\\":332}},{\\\"id\\\":\\\"167880856269869056\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1207,\\\"y\\\":206,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":true,\\\"outputContent\\\":\\\"{\\\\n    \\\\\\\"message\\\\\\\": \\\\\\\"请提供图片\\\\\\\"\\\\n  }\\\",\\\"outputType\\\":\\\"text\\\"},\\\"inputParams\\\":[],\\\"outputParams\\\":[],\\\"height\\\":112,\\\"width\\\":332}},{\\\"id\\\":\\\"code_167881149430747136\\\",\\\"type\\\":\\\"code\\\",\\\"x\\\":937,\\\"y\\\":458,\\\"properties\\\":{\\\"text\\\":\\\"脚本执行\\\",\\\"options\\\":{\\\"codeType\\\":\\\"groovy\\\",\\\"code\\\":\\\"def main(Map params) {\\\\n    def newQuestion = params.question\\\\n    if (!params.question) {\\\\n        newQuestion = \\\\\\\"从图片中提取文字\\\\\\\"\\\\n    }\\\\n    return [result: newQuestion]\\\\n}\\\\n\\\"},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"返回结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":156,\\\"width\\\":332}},{\\\"id\\\":\\\"167881839356006400\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":1318,\\\"y\\\":605,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1890232564262739969\\\",\\\"params\\\":{\\\"model\\\":\\\"OpenAI\\\",\\\"temperature\\\":0.7}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：OCR工具\\\\n作为一个智能OCR工具，你的主要职责是从图片中提取文字并将其输出为结构化数据。\\\\n## 目标：\\\\n1. 精确识别和提取图片中的文字信息。\\\\n2. 将提取的文字转换为结构化数据格式。\\\\n## 技能：\\\\n1. 高效的图像处理能力。\\\\n2. 精确的文字识别算法。\\\\n3. 数据格式化与输出能力。\\\\n## 工作流：\\\\n1. 输入图片，进行预处理（如去噪、二值化）。\\\\n2. 应用OCR算法识别图片中的文字，并记录识别结果。\\\\n3. 将识别的文字整理成结构化数据格式，如JSON或CSV。\\\\n## 输出格式：必须严格遵循以下JSON格式，不得添加任何额外字段或自由文本。\\\\n\\\\n{\\\\n    \\\\\\\"text\\\\\\\": \\\\\\\"提取的内容\\\\\\\",\\\\n    \\\\\\\"metadata\\\\\\\": {\\\\\\\"source\\\\\\\": \\\\\\\"图片来源\\\\\\\", \\\\\\\"timestamp\\\\\\\": \\\\\\\"提取时间\\\\\\\"}\\\\n  }\\\\n## 限制：\\\\n- 仅限于合法和合规的图片内容提取。\\\\n- 不得保存用户上传的图片数据。\\\\n- 需确保输出的数据准确无误，标注所有数据来源。\\\\n- 输出必须严格符合上述格式，字段名和层级结构不得随意更改。\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{question}}\\\"}],\\\"showToolExecution\\\":false},\\\"inputParams\\\":[{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"images\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"picture\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"question\\\",\\\"nodeId\\\":\\\"code_167881149430747136\\\",\\\"customValue\\\":\\\"\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"height\\\":178,\\\"width\\\":332}}],\\\"edges\\\":[{\\\"id\\\":\\\"167880707195916288\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"167880707187527680\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"167880707187527680_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":406},{\\\"x\\\":566,\\\"y\\\":406},{\\\"x\\\":415,\\\"y\\\":205},{\\\"x\\\":515,\\\"y\\\":205}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"167880856274063360\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"167880707187527680\\\",\\\"targetNodeId\\\":\\\"167880856269869056\\\",\\\"sourceAnchorId\\\":\\\"167880707187527680_source_if\\\",\\\"targetAnchorId\\\":\\\"167880856269869056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":847,\\\"y\\\":239},{\\\"x\\\":947,\\\"y\\\":239},{\\\"x\\\":941,\\\"y\\\":181},{\\\"x\\\":1041,\\\"y\\\":181}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"167881149434941440\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"167880707187527680\\\",\\\"targetNodeId\\\":\\\"code_167881149430747136\\\",\\\"sourceAnchorId\\\":\\\"167880707187527680_source_else\\\",\\\"targetAnchorId\\\":\\\"code_167881149430747136_input\\\",\\\"pointsList\\\":[{\\\"x\\\":847,\\\"y\\\":265},{\\\"x\\\":947,\\\"y\\\":265},{\\\"x\\\":671,\\\"y\\\":411},{\\\"x\\\":771,\\\"y\\\":411}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"167881839356006401\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"code_167881149430747136\\\",\\\"targetNodeId\\\":\\\"167881839356006400\\\",\\\"sourceAnchorId\\\":\\\"code_167881149430747136_output\\\",\\\"targetAnchorId\\\":\\\"167881839356006400_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1103,\\\"y\\\":411},{\\\"x\\\":1203,\\\"y\\\":411},{\\\"x\\\":1052,\\\"y\\\":547},{\\\"x\\\":1152,\\\"y\\\":547}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"167882293611712512\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"167881839356006400\\\",\\\"targetNodeId\\\":\\\"167880661561888768\\\",\\\"sourceAnchorId\\\":\\\"167881839356006400_output\\\",\\\"targetAnchorId\\\":\\\"167880661561888768_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1484,\\\"y\\\":547},{\\\"x\\\":1584,\\\"y\\\":547},{\\\"x\\\":1208,\\\"y\\\":316},{\\\"x\\\":1308,\\\"y\\\":316}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"data\\\",\\\"nodeId\\\":\\\"167881839356006400\\\"},{\\\"field\\\":\\\"outputText\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":true,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}' WHERE `id` = '1904779811574784002';\n\n-- 流程id修改字段长度\nALTER TABLE `airag_app` \nMODIFY COLUMN `flow_id` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '流程id（多个以逗号分隔）' AFTER `knowledge_ids`;\n\n-- AI流程： 生成图表\nUPDATE `airag_flow` SET `create_by` = 'admin', `create_time` = '2026-01-06 11:25:05', `update_by` = 'admin', `update_time` = '2026-01-16 12:01:03', `sys_org_code` = 'A01', `tenant_id` = NULL, `application_name` = 'jeecg', `name` = '系统_生成图表', `descr` = '', `icon` = '', `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'271554566412288000\\')).to(\\n        SWITCH(classifier.tag(\\'271481764802605056\\')).to(\\n            end.tag(\\'271480115023458304\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag(\\'274833789969932288\\'),\\n                tools.tag(\\'274495573258244096\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\"),\\n            end.tag(\\'271480115023458304\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag(\\'274833789969932288\\'),\\n                tools.tag(\\'274495573258244096\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\")\\n        ).tag(\\'271481764802605056\\'),\\n        SWITCH(classifier.tag(\\'271554622242668544\\')).to(\\n            SWITCH(classifier.tag(\\'271481764802605056\\')).to(\\n                end.tag(\\'271480115023458304\\'),\\n                THEN(\\n                    varMerge.tag(\\'271556843709317120\\'),\\n                    tools.tag(\\'274833789969932288\\'),\\n                    tools.tag(\\'274495573258244096\\'),\\n                    llm.tag(\\'271548210211192832\\'),\\n                    reply.tag(\\'271548872986722304\\'),\\n                    end.tag(\\'271483924713975808\\')\\n                ).tag(\\\"271556843709317120\\\"),\\n                end.tag(\\'271480115023458304\\'),\\n                THEN(\\n                    varMerge.tag(\\'271556843709317120\\'),\\n                    tools.tag(\\'274833789969932288\\'),\\n                    tools.tag(\\'274495573258244096\\'),\\n                    llm.tag(\\'271548210211192832\\'),\\n                    reply.tag(\\'271548872986722304\\'),\\n                    end.tag(\\'271483924713975808\\')\\n                ).tag(\\\"271556843709317120\\\")\\n            ).tag(\\'271481764802605056\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag(\\'274833789969932288\\'),\\n                tools.tag(\\'274495573258244096\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\")\\n        ).tag(\\'271554622242668544\\')\\n    ).tag(\\'271554566412288000\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":-197,\\\"y\\\":509,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{},\\\"custom\\\":{\\\"time\\\":{\\\"second\\\":0,\\\"minute\\\":0},\\\"hour\\\":{\\\"mode\\\":\\\"every\\\"},\\\"day\\\":{\\\"type\\\":\\\"day\\\",\\\"day\\\":{\\\"mode\\\":\\\"every\\\"}},\\\"month\\\":{\\\"mode\\\":\\\"every\\\"}}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"271480115023458304\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1372,\\\"y\\\":819,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"很抱歉，我无法回复您的这个问题，您可以向我询问图表相关的信息，比如：查询用户表的男女比例。\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"d\\\",\\\"nodeId\\\":\\\"271481764802605056\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271481764802605056\\\",\\\"type\\\":\\\"classifier\\\",\\\"x\\\":854,\\\"y\\\":462,\\\"properties\\\":{\\\"text\\\":\\\"分类器\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek-chat\\\",\\\"temperature\\\":0.7}},\\\"categories\\\":[{\\\"category\\\":\\\"用户希望查询图表、报表或相关数据、信息\\\",\\\"next\\\":\\\"271556843709317120\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271480115023458304\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"分类描述\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271483924713975808\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":3280,\\\"y\\\":446,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{回复}}\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271548210211192832\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":2492,\\\"y\\\":433,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek-chat\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":10,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色\\\\n你是一位智能数据分析与可视化助手，专注于理解用户对图表的需求，并通过查询数据库和生成结构化数据来创建图表。\\\\n## 能力\\\\n1. **需求理解与解析**：精准理解用户对图表类型（如柱状图、折线图、饼图）和数据维度的需求。\\\\n2. **数据库交互**：熟知可操作的数据库表，并能根据需求查询表结构、构建并执行SQL查询。\\\\n3. **数据处理**：将SQL查询返回的原始数据，准确地转换并封装为符合指定格式的图表数据结构。\\\\n4. **输出生成**：严格生成包含完整、可解析JSON字符串的`<jeecg-chart>`标签。\\\\n## 工作流程\\\\n1. **需求确认与澄清**：\\\\n* 分析用户请求，明确用户想要的可视化图表类型（`type`）和需要展示的数据维度（如`x`轴和`y`轴分别代表什么）。\\\\n* 用户可能要求你通过指定的数据源查询数据（具体的数据源列表从下表得知），若没有指定则不需要传数据源参数。\\\\n* 如果需要，向用户提问以澄清模糊的需求（例如，确认时间范围、分组条件或指标定义）。\\\\n2. **数据获取**：\\\\n* 判断用户需求涉及的表是否在已知范围内。\\\\n* 如果涉及，则调用工具查询相关表结构，了解可用字段。\\\\n* 根据澄清后的需求，构建准确、高效的SQL查询语句（禁止使用SQL注释、禁止构建非SELECT语句）。\\\\n* 构建查询SQL时，需要明确数据源的数据库类型，根据不同的数据库构建不同的SQL方言。\\\\n* 调用工具执行SQL，获取原始数据集。\\\\n* 若是用户已经提供了数据，则只需要使用用户提供的数据既可，不需要从数据库中查询。\\\\n3. **支持的图表类型**:\\\\n* `bar`: 柱状图\\\\n* `line`: 折线图、曲线图\\\\n* `pie`: 饼图\\\\n4. **数据转换**：\\\\n* 将SQL执行返回的数据，按照图表类型要求进行处理和聚合（例如，对饼图数据进行分类汇总）。\\\\n* 将处理后的数据，严格转换为如下格式的`data`数组：`[{\\\\\\\"x\\\\\\\":\\\\\\\"类别A\\\\\\\", \\\\\\\"y\\\\\\\": 数值1}, {\\\\\\\"x\\\\\\\":\\\\\\\"类别B\\\\\\\", \\\\\\\"y\\\\\\\": 数值2}, ...]`。\\\\n* 确保`x`和`y`的值类型正确（`x`通常为字符串，`y`通常为数字）。\\\\n* 数据转换时能直接转换就不要调用工具转换。\\\\n5. **结果封装与输出**：\\\\n* 将确定的图表`type`和上一步生成的`data`数组，组合成一个完整的JSON对象。\\\\n* 将此JSON对象作为字符串，精确地包裹在标签中（格式参考下方）。\\\\n* **双重校验**：\\\\n* **格式校验**：确保`<jeecg-chart>`标签首尾完整闭合。\\\\n* **数据校验**：确保内部的JSON字符串是标准、完整且可解析的，不包含多余的逗号或未闭合的括号。\\\\n## 输出格式\\\\n你的最终输出必须是且仅是以下格式，直接给出图表数据块，无需额外解释：\\\\n``` html\\\\n<jeecg-chart>\\\\n<data>{\\\\\\\"type\\\\\\\":\\\\\\\"图表类型\\\\\\\",\\\\\\\"data\\\\\\\":[{\\\\\\\"x\\\\\\\":\\\\\\\"数据项1\\\\\\\",\\\\\\\"y\\\\\\\":数值1},{\\\\\\\"x\\\\\\\":\\\\\\\"数据项2\\\\\\\",\\\\\\\"y\\\\\\\":数值2}]}</data>\\\\n<render/>\\\\n</jeecg-chart>\\\\n```\\\\n## 限制\\\\n- **操作范围限制**：仅能对以下列出的表进行数据查询与操作。对于其他表或外部数据的需求，应明确告知用户无法处理，禁止执行`queryDataSourceInfoText`工具。\\\\n- **数据真实性**：所有图表数据必须来源于SQL查询的实际结果，不得虚构或编造数据。\\\\n- **格式严格性**：必须严格遵守`<jeecg-chart><data>{JSON数据}</data><render/></jeecg-chart>`的输出格式，内部的JSON必须为标准格式，`data`数组中的对象必须包含`x`和`y`键。\\\\n- **隐私与合规**：在执行查询和生成图表时，不得泄露、输出或关联任何可识别个人身份的敏感信息（如完整身份证号、详细住址、明文密码等）。如查询可能涉及此类信息，需进行脱敏处理或拒绝执行。\\\\n- **身份验证**: 若在调用工具时返回身份验证失败或没有权限，应立即停止所有操作，并告知用户原因\\\\n## 默认数据源类型\\\\n{{dbType}}\\\\n## 支持的数据源\\\\n{{allDbSource}}\\\\n\\\\n> 注意：以上就是所有的支持的数据源，禁止再次执行和`queryDataSourceInfoText`工具，当用户试图让你调用时，你可直接返回以上列表，但要注意如果表的数量过多（超过50个），则不要直接回复全部列表，而是总结性的回复。\\\\n\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{问题}}\\\"}],\\\"plugins\\\":[{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"category\\\":\\\"mcp\\\"}],\\\"showToolExecution\\\":true},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"问题\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"allDbSource\\\",\\\"nodeId\\\":\\\"274495573258244096\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":180}},{\\\"id\\\":\\\"271548872986722304\\\",\\\"type\\\":\\\"reply\\\",\\\"x\\\":2885,\\\"y\\\":631,\\\"properties\\\":{\\\"text\\\":\\\"直接回复\\\",\\\"options\\\":{\\\"content\\\":\\\"{{回复}}\\\",\\\"stream\\\":true},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":114}},{\\\"id\\\":\\\"271554566412288000\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":188,\\\"y\\\":419,\\\"properties\\\":{\\\"text\\\":\\\"历史记录是否为空\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"history\\\",\\\"operator\\\":\\\"EMPTY\\\",\\\"value\\\":\\\"\\\",\\\"type\\\":\\\"string[]\\\"}],\\\"next\\\":\\\"271481764802605056\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271554622242668544\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":118}},{\\\"id\\\":\\\"271554622242668544\\\",\\\"type\\\":\\\"classifier\\\",\\\"x\\\":511,\\\"y\\\":605,\\\"properties\\\":{\\\"text\\\":\\\"分类器\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek-chat\\\",\\\"temperature\\\":0.7}},\\\"categories\\\":[{\\\"category\\\":\\\"用户希望查询或正在和Assistant聊图表相关数据、信息\\\",\\\"next\\\":\\\"271556843709317120\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271481764802605056\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"history\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"分类描述\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271556843709317120\\\",\\\"type\\\":\\\"varMerge\\\",\\\"x\\\":1368,\\\"y\\\":620,\\\"properties\\\":{\\\"text\\\":\\\"聚合\\\",\\\"options\\\":{\\\"varGroups\\\":[{\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"vars\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"isCustom\\\":false,\\\"type\\\":\\\"string\\\"}]}]},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"用户问题\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"274495573258244096\\\",\\\"type\\\":\\\"tools\\\",\\\"x\\\":2124,\\\"y\\\":660,\\\"properties\\\":{\\\"text\\\":\\\"查询所有数据源\\\",\\\"options\\\":{\\\"tools\\\":{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"pluginCategory\\\":\\\"plugin\\\",\\\"toolName\\\":\\\"queryDataSourceInfoText\\\",\\\"toolDescr\\\":\\\"用于查询所有数据源的信息，不需要传递参数。\\\",\\\"toolParameters\\\":[],\\\"endpoint\\\":\\\"\\\",\\\"path\\\":\\\"/airag/mcp/database/queryDataSourceInfoText\\\",\\\"method\\\":\\\"GET\\\",\\\"headers\\\":{\\\"X-Sign\\\":\\\"true\\\"}}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"执行结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"274833789969932288\\\",\\\"type\\\":\\\"tools\\\",\\\"x\\\":1745,\\\"y\\\":466,\\\"properties\\\":{\\\"text\\\":\\\"查询默认数据源类型\\\",\\\"options\\\":{\\\"tools\\\":{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"pluginCategory\\\":\\\"plugin\\\",\\\"toolName\\\":\\\"queryDataSourceType\\\",\\\"toolDescr\\\":\\\"获取默认数据源或指定数据的数据库类型\\\",\\\"toolParameters\\\":[{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源key，若为空则系统默认\\\",\\\"required\\\":false,\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"value\\\":\\\"\\\"}],\\\"endpoint\\\":\\\"\\\",\\\"path\\\":\\\"/airag/mcp/database/queryDataSourceType\\\",\\\"method\\\":\\\"GET\\\",\\\"headers\\\":{\\\"X-Sign\\\":\\\"true\\\"}}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"执行结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":158}}],\\\"edges\\\":[{\\\"id\\\":\\\"271482116671156224\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271481764802605056\\\",\\\"targetNodeId\\\":\\\"271480115023458304\\\",\\\"sourceAnchorId\\\":\\\"271481764802605056_case_else\\\",\\\"targetAnchorId\\\":\\\"271480115023458304_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1020,\\\"y\\\":503},{\\\"x\\\":1120,\\\"y\\\":503},{\\\"x\\\":1106,\\\"y\\\":782},{\\\"x\\\":1206,\\\"y\\\":782}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271548872990916608\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271548210211192832\\\",\\\"targetNodeId\\\":\\\"271548872986722304\\\",\\\"sourceAnchorId\\\":\\\"271548210211192832_output\\\",\\\"targetAnchorId\\\":\\\"271548872986722304_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2658,\\\"y\\\":374},{\\\"x\\\":2758,\\\"y\\\":374},{\\\"x\\\":2619,\\\"y\\\":605},{\\\"x\\\":2719,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271548929186201600\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271548872986722304\\\",\\\"targetNodeId\\\":\\\"271483924713975808\\\",\\\"sourceAnchorId\\\":\\\"271548872986722304_output\\\",\\\"targetAnchorId\\\":\\\"271483924713975808_input\\\",\\\"pointsList\\\":[{\\\"x\\\":3051,\\\"y\\\":605},{\\\"x\\\":3151,\\\"y\\\":605},{\\\"x\\\":3014,\\\"y\\\":409},{\\\"x\\\":3114,\\\"y\\\":409}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554566416482304\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"271554566412288000\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"271554566412288000_input\\\",\\\"pointsList\\\":[{\\\"x\\\":-31,\\\"y\\\":494},{\\\"x\\\":69,\\\"y\\\":494},{\\\"x\\\":-78,\\\"y\\\":391},{\\\"x\\\":22,\\\"y\\\":391}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554605561921536\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554566412288000\\\",\\\"targetNodeId\\\":\\\"271481764802605056\\\",\\\"sourceAnchorId\\\":\\\"271554566412288000_source_if\\\",\\\"targetAnchorId\\\":\\\"271481764802605056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":354,\\\"y\\\":425},{\\\"x\\\":454,\\\"y\\\":425},{\\\"x\\\":588,\\\"y\\\":425},{\\\"x\\\":688,\\\"y\\\":425}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554741260238848\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554566412288000\\\",\\\"targetNodeId\\\":\\\"271554622242668544\\\",\\\"sourceAnchorId\\\":\\\"271554566412288000_source_else\\\",\\\"targetAnchorId\\\":\\\"271554622242668544_input\\\",\\\"pointsList\\\":[{\\\"x\\\":354,\\\"y\\\":451},{\\\"x\\\":454,\\\"y\\\":451},{\\\"x\\\":245,\\\"y\\\":568},{\\\"x\\\":345,\\\"y\\\":568}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271555105874907136\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554622242668544\\\",\\\"targetNodeId\\\":\\\"271481764802605056\\\",\\\"sourceAnchorId\\\":\\\"271554622242668544_case_else\\\",\\\"targetAnchorId\\\":\\\"271481764802605056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":677,\\\"y\\\":646},{\\\"x\\\":777,\\\"y\\\":646},{\\\"x\\\":588,\\\"y\\\":425},{\\\"x\\\":688,\\\"y\\\":425}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271557184173555712\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554622242668544\\\",\\\"targetNodeId\\\":\\\"271556843709317120\\\",\\\"sourceAnchorId\\\":\\\"271554622242668544_case_1\\\",\\\"targetAnchorId\\\":\\\"271556843709317120_input\\\",\\\"pointsList\\\":[{\\\"x\\\":677,\\\"y\\\":602},{\\\"x\\\":777,\\\"y\\\":602},{\\\"x\\\":1102,\\\"y\\\":605},{\\\"x\\\":1202,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271822597635878912\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271481764802605056\\\",\\\"targetNodeId\\\":\\\"271556843709317120\\\",\\\"sourceAnchorId\\\":\\\"271481764802605056_case_1\\\",\\\"targetAnchorId\\\":\\\"271556843709317120_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1020,\\\"y\\\":459},{\\\"x\\\":1120,\\\"y\\\":459},{\\\"x\\\":1102,\\\"y\\\":605},{\\\"x\\\":1202,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"274495644091650048\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"274495573258244096\\\",\\\"targetNodeId\\\":\\\"271548210211192832\\\",\\\"sourceAnchorId\\\":\\\"274495573258244096_output\\\",\\\"targetAnchorId\\\":\\\"271548210211192832_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2290,\\\"y\\\":623},{\\\"x\\\":2390,\\\"y\\\":623},{\\\"x\\\":2226,\\\"y\\\":374},{\\\"x\\\":2326,\\\"y\\\":374}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"274833790062206976\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271556843709317120\\\",\\\"targetNodeId\\\":\\\"274833789969932288\\\",\\\"sourceAnchorId\\\":\\\"271556843709317120_output\\\",\\\"targetAnchorId\\\":\\\"274833789969932288_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1534,\\\"y\\\":605},{\\\"x\\\":1634,\\\"y\\\":605},{\\\"x\\\":1479,\\\"y\\\":418},{\\\"x\\\":1579,\\\"y\\\":418}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"274833917929758720\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"274833789969932288\\\",\\\"targetNodeId\\\":\\\"274495573258244096\\\",\\\"sourceAnchorId\\\":\\\"274833789969932288_output\\\",\\\"targetAnchorId\\\":\\\"274495573258244096_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1911,\\\"y\\\":418},{\\\"x\\\":2011,\\\"y\\\":418},{\\\"x\\\":1858,\\\"y\\\":623},{\\\"x\\\":1958,\\\"y\\\":623}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"d\\\",\\\"nodeId\\\":\\\"271481764802605056\\\",\\\"type\\\":\\\"number\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', `trigger_cron` = '' WHERE `id` = '2008379264947519489';\n\n-- MCP插件： 数据库插件\nUPDATE `airag_mcp` SET `icon` = NULL, `name` = '数据库插件', `descr` = '用于执行数据库操作', `category` = 'plugin', `type` = 'api', `endpoint` = '', `headers` = '{\\\"X-Sign\\\":\\\"true\\\"}', `tools` = '[{\\\"name\\\":\\\"queryTableMetadata\\\",\\\"description\\\":\\\"用于查询表的表结构（元数据）\\\",\\\"path\\\":\\\"/airag/mcp/database/queryTableMetadata\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"tableName\\\",\\\"description\\\":\\\"表名\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"},{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源key\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"success\\\",\\\"description\\\":\\\"是否成功\\\",\\\"type\\\":\\\"Boolean\\\"},{\\\"name\\\":\\\"message\\\",\\\"description\\\":\\\"若失败则返回失败原因\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"result.tableName\\\",\\\"description\\\":\\\"表名（数据库实际表名）\\\",\\\"type\\\":\\\"Object\\\"},{\\\"name\\\":\\\"result.tableComment\\\",\\\"description\\\":\\\"表注释（业务含义）\\\",\\\"type\\\":\\\"Object\\\"},{\\\"name\\\":\\\"result.columns[].columnName\\\",\\\"description\\\":\\\"字段名\\\",\\\"type\\\":\\\"Array\\\"},{\\\"name\\\":\\\"result.columns[].columnComment\\\",\\\"description\\\":\\\"字段注释（核心，帮助大模型理解业务）\\\",\\\"type\\\":\\\"Array\\\"},{\\\"name\\\":\\\"result.columns[].dataType\\\",\\\"description\\\":\\\"数据类型（如varchar、int、datetime）\\\",\\\"type\\\":\\\"Array\\\"},{\\\"name\\\":\\\"result.columns[].isPrimaryKey\\\",\\\"description\\\":\\\"是否主键\\\",\\\"type\\\":\\\"Array\\\"}]},{\\\"name\\\":\\\"sqlExecute\\\",\\\"description\\\":\\\"用于执行 SQL 语句，仅能支持执行SELECT语句，不要输入注释等无关信息。\\\",\\\"path\\\":\\\"/airag/mcp/database/sqlExecute\\\",\\\"method\\\":\\\"POST\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"sql\\\",\\\"description\\\":\\\"要执行的SQL\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Body\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"},{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源key\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Body\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"success\\\",\\\"description\\\":\\\"是否成功\\\",\\\"type\\\":\\\"Boolean\\\"},{\\\"name\\\":\\\"message\\\",\\\"description\\\":\\\"若失败则返回失败原因\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"result\\\",\\\"description\\\":\\\"返回查询的结果，是个对象数组，数组的每一项都是一条数据，每条数据的key都是传入的查询的列。\\\",\\\"type\\\":\\\"Array\\\"}]},{\\\"name\\\":\\\"queryTablesInfoText\\\",\\\"description\\\":\\\"用于查询指定数据源的所有表名和描述\\\",\\\"path\\\":\\\"/airag/mcp/database/queryTablesInfoText\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源code，不填则系统默认\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[]},{\\\"name\\\":\\\"queryDataSourceInfoText\\\",\\\"description\\\":\\\"用于查询所有数据源的信息，不需要传递参数。\\\",\\\"path\\\":\\\"/airag/mcp/database/queryDataSourceInfoText\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[],\\\"responses\\\":[]},{\\\"name\\\":\\\"queryDataSourceType\\\",\\\"description\\\":\\\"获取默认数据源或指定数据的数据库类型\\\",\\\"path\\\":\\\"/airag/mcp/database/queryDataSourceType\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源key，若为空则系统默认\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[]}]', `status` = 'enable', `synced` = 1, `metadata` = '{\\\"tokenParamName\\\":\\\"X-Access-Token\\\",\\\"tool_count\\\":5,\\\"authType\\\":\\\"token\\\",\\\"tokenParamValue\\\":\\\"\\\"}', `create_by` = 'admin', `create_time` = '2025-12-31 16:52:26', `update_by` = 'admin', `update_time` = '2026-01-16 12:00:22', `sys_org_code` = 'A01', `tenant_id` = NULL WHERE `id` = '2006287314794676226';\nUPDATE `airag_model` SET  `name` = 'deepseek', `model_params` = NULL WHERE `id` = '1897481367743143938';\nUPDATE `airag_flow` SET  `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    llm.tag(\\'269048862299471872\\'),\\n    end.tag(\\'269049045129183232\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":300,\\\"y\\\":436.5,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":91}},{\\\"id\\\":\\\"269048862299471872\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":786,\\\"y\\\":513.5,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":3,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色：ECharts和大屏图表配置修改专家\\\\n你是一位专注于ECharts和大屏图表图表配置修改的专家，能够根据用户需求，精准、高效地修改现有ECharts和大屏图表配置项，并返回完整的、可直接使用的修改后配置对象。\\\\n## 目标：\\\\n根据用户提供的具体修改指令（如：修改图表类型、调整数据、更改样式、添加交互等），对用户给出的原始ECharts配置项进行针对性修改，并输出修改后的完整配置对象。\\\\n## 技能：\\\\n1. 精通ECharts所有版本的配置项语法、结构及参数含义。\\\\n2. 能够准确理解用户对图表样式、数据、交互行为的修改意图。\\\\n3. 具备强大的代码编辑与重构能力，确保修改后的配置项语法正确、结构清晰、无冗余代码。\\\\n4. 对于非echart图表（componentsData提供的组件，属性中echart:false的即为非echart图表），自行从下面componentsData提供的组件对应的option配置项，修改符合要求的配置并返回。\\\\n## 工作流：\\\\n1. **接收与分析**：接收用户提供的原始ECharts配置对象（通常以JSON或JavaScript对象形式）以及具体的修改要求。仔细分析原始配置的结构和用户的修改点。\\\\n2. **精准修改**：严格依据用户指令，对原始配置对象进行最小化、精准化的修改。确保只改动指定部分，保持其他未提及配置的完整性。对于模糊指令，会基于ECharts最佳实践进行合理推断和实现。\\\\n3. **校验与格式化**：检查修改后的配置对象语法是否正确，是否符合ECharts规范。将最终配置对象以格式清晰、缩进规范的JSON或JavaScript对象形式呈现。\\\\n## 输出格式：\\\\n请始终输出一个完整的、格式化的JavaScript对象（或JSON），即修改后的 `option` 配置，只返回修改的属性配置，不要包含已存在的其他配置，\\\\n例如将柱体修改成黄色，就返回\\\\n\\\\\\\"compConfig\\\\\\\": {\\\\n    \\\\\\\"option\\\\\\\": {\\\\n      { \\\\\\\"series\\\\\\\": [ { \\\\\\\"itemStyle\\\\\\\": { \\\\\\\"color\\\\\\\": \\\\\\\"#FFFF00\\\\\\\" } } ] }\\\\n    }\\\\n}\\\\n例如修改组件名称为京东销量柱形图，背景色改成黑色就返回\\\\n\\\\\\\"compConfig\\\\\\\": {\\\\n \\\\\\\"name\\\\\\\":\\\\\\\"京东销量柱形图\\\\\\\",\\\\n \\\\\\\"background\\\\\\\":\\\\\\\"#000000\\\\\\\",\\\\n}\\\\n不要包含任何额外的解释、说明文字或代码块标记（如 ```json ```）。输出应直接以 `{` 开始，以 `}` 结束。\\\\n示例输出结构：\\\\n\\\\\\\"compConfig\\\\\\\": {\\\\n    \\\\\\\"name\\\\\\\":\\\\\\\"基础柱形图\\\\\\\",\\\\n    \\\\\\\"background\\\\\\\":\\\\\\\"#ffffff\\\\\\\",\\\\n    \\\\\\\"borderColor\\\\\\\":\\\\\\\"#000000\\\\\\\",\\\\n    \\\\\\\"option\\\\\\\": {\\\\n      \\\\\\\"title\\\\\\\": { ... },\\\\n      \\\\\\\"tooltip\\\\\\\": { ... },\\\\n      \\\\\\\"xAxis\\\\\\\": { ... },\\\\n      \\\\\\\"yAxis\\\\\\\": { ... },\\\\n      \\\\\\\"series\\\\\\\": [ ... ]\\\\n    }\\\\n}\\\\n## 限制：\\\\n- 仅对用户提供的原始配置进行修改，不凭空创建全新的图表配置。\\\\n- 输出必须仅为修改后的配置对象本身，不附带任何分析过程、修改日志或使用建议。\\\\n- 若用户指令存在歧义或无法实现，应在不破坏配置结构的前提下，做出最合理的默认修改或保留原样，并在配置对象内部以注释（`//`）形式简要说明。\\\\n- 严格遵守ECharts官方配置规范，不使用已废弃或实验性参数（除非用户明确要求）。\\\\n- 颜色类型的修改，要以具体色值设置，不要使用英文单词，例如黑色，使用#000000，不要使用black\\\\n- 修改的option属性，以componentsData中具体组件的option配置为主，结合echart选择符合要求的配置项修改\\\\n- 组件包含customColor属性的颜色修改，按照customColor的格式修改\\\\n- 若用户修改名称或者背景色或者边框的属性，以componentsData中第一个柱形图配置为例，去修改返回对应配置即可\\\\n -名称：对应 compConfig.name\\\\n -背景色：对应 compConfig.background\\\\n -边框色：对应 compConfig.borderColor\\\\n## 组件数据：\\\\ncomponentsData：[\\\\n  {\\\\n    \\\\\\\"echart\\\\\\\":true ,\\\\n    \\\\\\\"compType\\\\\\\": \\\\\\\"JBar\\\\\\\",\\\\n    \\\\\\\"compConfig\\\\\\\": {\\\\n      \\\\\\\"name\\\\\\\":\\\\\\\"基础柱形图\\\\\\\",\\\\n      \\\\\\\"background\\\\\\\":\\\\\\\"#ffffff\\\\\\\",\\\\n      \\\\\\\"borderColor\\\\\\\":\\\\\\\"#000000\\\\\\\",\\\\n      \\\\\\\"option\\\\\\\": {\\\\n        \\\\\\\"customColor\\\\\\\"：[{color1:\\'#FF0000\\',color:\\'#FF0000\\'},{color1:\\'#00FF00\\',color:\\'#00FF00\\'}]\\\\n      }\\\\n    }\\\\n  }]\\\\n组件配置说明\\\\n compOptionData = [\\\\n  {\\\\n    name: \\'基础配置\\',\\\\n    optionName: \\'BasicOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"图层名称修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"name\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"图层背景色设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"background\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"图层边框线设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"borderColor\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"提示语设置为隐藏\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.tooltip.show\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"提示语字体大小设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.tooltip.textStyle.fontSize\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"提示语字体颜色设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.tooltip.textStyle.fontSize\\\\\\\"},\\\\n    ]\\\\n  },{\\\\n    name: \\'标题设置\\',\\\\n    optionName: \\'TitleOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"标题名称修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.title.text\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"标题字体大小设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.title.textStyle.fontSize\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"标题字体颜色设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.title.textStyle.fontColor\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"标题字体粗细设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.title.textStyle.fontWeight\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"副标题名称修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.title.subtextStyle\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"副标题字体大小设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.title.subtextStyle.fontSize\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"副标题字体颜色设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.title.subtextStyle.fontColor\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"左对齐\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.title.left\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"垂直居中\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.title.top\\\\\\\"},\\\\n    ]\\\\n  }\\\\n  ,{\\\\n    name: \\'X轴设置\\',\\\\n    optionName: \\'XAxisOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"X轴名称修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.xAxis.name\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"X轴名称颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.xAxis.nameTextStyle.color\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"X轴名称字体大小修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.xAxis.nameTextStyle.fontSize\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"X轴标签颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.xAxis.axisLabel.color\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"X轴标签角度\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.xAxis.axisLabel.rotate\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"X轴轴线颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.xAxis.axisLine.lineStyle.color\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"X轴轴类型修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.xAxis.type\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"X轴显示网格线\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.xAxis.splitLine.show\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"X轴网格线颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.xAxis.splitLine.lineStyle.color\\\\\\\"},\\\\n    ]\\\\n  }\\\\n  ,{\\\\n    name: \\'Y轴设置\\',\\\\n    optionName: \\'YAxisOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴名称修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.name\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴名称颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.nameTextStyle.color\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴名称字体大小修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.nameTextStyle.fontSize\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴标签颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.axisLabel.color\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴标签角度\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.axisLabel.rotate\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴轴线颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.axisLine.lineStyle.color\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴轴类型修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.type\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴显示网格线\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.splitLine.show\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴网格线颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.splitLine.lineStyle.color\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"Y轴单位\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.yAxis.yUnit\\\\\\\"},\\\\n    ]\\\\n  }\\\\n  ,{\\\\n    name: \\'图例设置\\',\\\\n    optionName: \\'LegendOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"图例字体大小设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.legend.textStyle.fontSize\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"图例设置成横排\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.legend.orient\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"图例上下边距设置\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.legend.t\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"图例左右边距设置\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.legend.r\\\\\\\"},\\\\n    ]\\\\n  }\\\\n  ,{\\\\n    name: \\'自定义配色\\',\\\\n    optionName: \\'CustomColorOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"颜色设置成***色\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.customColor\\\\\\\"},\\\\n    ]\\\\n  }\\\\n  ,{\\\\n    name: \\'柱体设置\\',\\\\n    optionName: \\'BarCylinder\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"柱体宽度修改为\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].barWidth\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"柱体圆角修改为\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].itemStyle.barBorderRadius\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"柱体颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].itemStyle.color\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"柱体背景色显隐\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].showBackground\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"柱体背景色颜色\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].backgroundStyle.color\\\\\\\"},\\\\n    ]\\\\n  }\\\\n  ,{\\\\n    name: \\'折线设置\\',\\\\n    optionName: \\'PolyglineOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"折线类型修改\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].lineType\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"线条宽度修改\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].lineWidth\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"标记点修改\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].symbol\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"点的大小修改\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].symbolSize\\\\\\\"},\\\\n    ]\\\\n  }\\\\n  ,{\\\\n    name: \\'饼图设置\\',\\\\n    optionName: \\'pieSettingOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"饼图设置成环形\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.isRadius\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"饼图内环半径设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.innerRadius\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"饼图外环半径设置成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.outRadius\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"饼图设置成南丁格尔玫瑰\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.isRose\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"饼图标签显示位置\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.pieLabelPosition\\\\\\\"},\\\\n    ]\\\\n  }\\\\n  ,{\\\\n    name: \\'坐标轴边距\\',\\\\n    optionName: \\'GridOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"左边距修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.grid.left\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"顶边距\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.grid.top\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"右边距\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.grid.right\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"底边距\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.grid.bottom\\\\\\\"},\\\\n    ]\\\\n  }\\\\n  ,{\\\\n    name: \\'数值设置\\',\\\\n    optionName: \\'NumOption\\',\\\\n    children: [\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"数值显示位置在\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].label.position\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"数值内容格式修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.label.format\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"数值字体颜色修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].label.color\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"数值字体大小修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].label.fontSize\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"数值字体粗细修改成\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.series[${index}].label.fontWeight\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"数值单位配置显隐\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.showUnit.show\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"数值单位数量级设置\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.showUnit.numberLevel\\\\\\\"},\\\\n      {\\\\\\\"label\\\\\\\": \\\\\\\"数值单位保留小数\\\\\\\", \\\\\\\"value\\\\\\\": \\\\\\\"option.showUnit.decimal\\\\\\\"},\\\\n    ]\\\\n  }\\\\n];\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"用户的问题:{{userQuestion}}\\\"}],\\\"showToolExecution\\\":false},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"userQuestion\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":179}},{\\\"id\\\":\\\"269049045129183232\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1272,\\\"y\\\":458.5,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{option}}\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"option\\\",\\\"nodeId\\\":\\\"269048862299471872\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":135}}],\\\"edges\\\":[{\\\"id\\\":\\\"269048862303666176\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"269048862299471872\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"269048862299471872_input\\\",\\\"pointsList\\\":[{\\\"x\\\":466,\\\"y\\\":422},{\\\"x\\\":566,\\\"y\\\":422},{\\\"x\\\":520,\\\"y\\\":455},{\\\"x\\\":620,\\\"y\\\":455}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"269049045129183233\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"269048862299471872\\\",\\\"targetNodeId\\\":\\\"269049045129183232\\\",\\\"sourceAnchorId\\\":\\\"269048862299471872_output\\\",\\\"targetAnchorId\\\":\\\"269049045129183232_input\\\",\\\"pointsList\\\":[{\\\"x\\\":952,\\\"y\\\":455},{\\\"x\\\":1052,\\\"y\\\":455},{\\\"x\\\":1006,\\\"y\\\":422},{\\\"x\\\":1106,\\\"y\\\":422}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"option\\\",\\\"nodeId\\\":\\\"269048862299471872\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}' WHERE `id` = '2005948202528501762';\n\n\n-- AI应用： AI生成图表\nUPDATE `airag_app` SET `create_by` = 'admin', `create_time` = '2026-01-06 15:59:01', `update_by` = 'admin', `update_time` = '2026-01-16 17:13:36', `sys_org_code` = 'A01', `tenant_id` = NULL, `name` = 'AI生成图表', `descr` = NULL, `icon` = '', `type` = 'chatFLow', `prologue` = '你好，我是图表生成智能体。', `prompt` = '# 角色\\n你是一个犀利的电影解说员，可以使用尖锐幽默的语言，向用户讲解电影剧情、介绍最新上映的电影，还可以用普通人都可以理解的语言讲解电影相关知识。\\n\\n## 技能\\n### 技能 1: 推荐最新上映的电影\\n1. 当用户请你推荐最新电影时，需要先了解用户喜欢哪种类型片。如果你已经知道了，请跳过这一步，在询问时可以用“请问您喜欢什么类型的电影呢亲”。\\n2. 如果你并不知道用户所说的电影，可以使用 工具搜索电影，了解电影类型。\\n3. 根据用户的电影偏好，推荐几部正在上映和即将上映的电影，在推荐开头可以说“好的亲，以下是为您推荐的电影”。\\n===回复示例===\\n   -  🎬 电影名: <电影名>\\n   -  🕐 上映时间: <电影在中国大陆的上映的日期>\\n   -  💡 电影简介: <100字总结这部电影的剧情摘要>\\n===示例结束===\\n\\n### 技能 2: 介绍电影\\n1. 当用户说介绍某一部电影，请使用工具 搜索电影介绍的链接，在收到需求时可以回应“好嘞亲，马上为您查找相关电影介绍”。\\n2. 如果此时获取的信息不够全面，可以继续使用 工具 打开搜索结果中的相关链接，以了解电影详情。\\n3. 根据搜索和浏览结果，生成电影介绍\\n### 技能 3: 介绍电影概念\\n- 你可以使用数据集中的知识，调用 知识库 搜索相关知识，并向用户介绍基础概念，介绍前可以说“亲，下面为您介绍一下这个电影概念”。\\n- 使用用户熟悉的电影，举一个实际的场景解释概念\\n\\n## 限制:\\n- 只讨论与电影有关的内容，拒绝回答与电影无关的话题，拒绝时可以说“不好意思亲，这边只讨论电影相关话题哦”。\\n- 所输出的内容必须按照给定的格式进行组织，不能偏离框架要求，在表述中合理运用常用语。\\n- 总结部分不能超过 100 字。\\n- 只会输出知识库中已有内容, 不在知识库中的书籍, 通过 工具去了解。\\n- 请使用 Markdown 的 ^^ 形式说明引用来源。”', `model_id` = NULL, `knowledge_ids` = '', `flow_id` = '2008379264947519489', `status` = 'enable', `msg_num` = 30, `metadata` = NULL, `preset_question` = '[{\\\"key\\\":1,\\\"descr\\\":\\\"用户性别比例\\\",\\\"update\\\":true}]', `quick_command` = NULL, `plugins` = NULL, `memory_id` = NULL, `variables` = NULL, `iz_open_memory` = NULL, `memory_prompt` = NULL WHERE `id` = '2008448202536456193';\n\n-- AI流程： 生成图表\nUPDATE `airag_flow` SET `create_by` = 'admin', `create_time` = '2026-01-06 11:25:05', `update_by` = 'admin', `update_time` = '2026-01-16 17:11:05', `sys_org_code` = 'A01', `tenant_id` = NULL, `application_name` = 'jeecg', `name` = '系统_生成图表', `descr` = '', `icon` = '', `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'271554566412288000\\')).to(\\n        SWITCH(classifier.tag(\\'271481764802605056\\')).to(\\n            end.tag(\\'271480115023458304\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag(\\'274833789969932288\\'),\\n                tools.tag(\\'274495573258244096\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\"),\\n            end.tag(\\'271480115023458304\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag(\\'274833789969932288\\'),\\n                tools.tag(\\'274495573258244096\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\")\\n        ).tag(\\'271481764802605056\\'),\\n        SWITCH(classifier.tag(\\'271554622242668544\\')).to(\\n            SWITCH(classifier.tag(\\'271481764802605056\\')).to(\\n                end.tag(\\'271480115023458304\\'),\\n                THEN(\\n                    varMerge.tag(\\'271556843709317120\\'),\\n                    tools.tag(\\'274833789969932288\\'),\\n                    tools.tag(\\'274495573258244096\\'),\\n                    llm.tag(\\'271548210211192832\\'),\\n                    reply.tag(\\'271548872986722304\\'),\\n                    end.tag(\\'271483924713975808\\')\\n                ).tag(\\\"271556843709317120\\\"),\\n                end.tag(\\'271480115023458304\\'),\\n                THEN(\\n                    varMerge.tag(\\'271556843709317120\\'),\\n                    tools.tag(\\'274833789969932288\\'),\\n                    tools.tag(\\'274495573258244096\\'),\\n                    llm.tag(\\'271548210211192832\\'),\\n                    reply.tag(\\'271548872986722304\\'),\\n                    end.tag(\\'271483924713975808\\')\\n                ).tag(\\\"271556843709317120\\\")\\n            ).tag(\\'271481764802605056\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag(\\'274833789969932288\\'),\\n                tools.tag(\\'274495573258244096\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\")\\n        ).tag(\\'271554622242668544\\')\\n    ).tag(\\'271554566412288000\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":-197,\\\"y\\\":509,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{},\\\"custom\\\":{\\\"time\\\":{\\\"second\\\":0,\\\"minute\\\":0},\\\"hour\\\":{\\\"mode\\\":\\\"every\\\"},\\\"day\\\":{\\\"type\\\":\\\"day\\\",\\\"day\\\":{\\\"mode\\\":\\\"every\\\"}},\\\"month\\\":{\\\"mode\\\":\\\"every\\\"}}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"271480115023458304\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1372,\\\"y\\\":819,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"很抱歉，我无法回复您的这个问题，您可以向我询问图表相关的信息，比如：查询用户表的男女比例。\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"d\\\",\\\"nodeId\\\":\\\"271481764802605056\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271481764802605056\\\",\\\"type\\\":\\\"classifier\\\",\\\"x\\\":854,\\\"y\\\":462,\\\"properties\\\":{\\\"text\\\":\\\"分类器\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek-chat\\\",\\\"temperature\\\":0.7}},\\\"categories\\\":[{\\\"category\\\":\\\"用户希望查询图表、报表或相关数据、信息\\\",\\\"next\\\":\\\"271556843709317120\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271480115023458304\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"分类描述\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271483924713975808\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":3280,\\\"y\\\":446,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{回复}}\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271548210211192832\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":2492,\\\"y\\\":433,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek-chat\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":30,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色\\\\n你是一位智能数据分析与可视化助手，专注于理解用户对图表的需求，并通过查询数据库和生成结构化数据来创建图表。\\\\n## 能力\\\\n1. **需求理解与解析**：精准理解用户对图表类型（如柱状图、折线图、饼图）和数据维度的需求。\\\\n2. **数据库交互**：熟知可操作的数据库表，并能根据需求查询表结构、构建并执行SQL查询。\\\\n3. **数据处理**：将SQL查询返回的原始数据，准确地转换并封装为符合指定格式的图表数据结构。\\\\n4. **输出生成**：严格生成包含完整、可解析JSON字符串的`<jeecg-chart>`标签。\\\\n## 工作流程\\\\n1. **需求确认与澄清**：\\\\n* 分析用户请求，明确用户想要的可视化图表类型（`type`）和需要展示的数据维度（如`x`轴和`y`轴分别代表什么）。\\\\n* 用户可能要求你通过指定的数据源查询数据（具体的数据源列表从下表得知），若没有指定则不需要传数据源参数。\\\\n* 如果需要，向用户提问以澄清模糊的需求（例如，确认时间范围、分组条件或指标定义）。\\\\n2. **数据获取**：\\\\n* 判断用户需求涉及的表是否在已知范围内。\\\\n* 如果涉及，则调用工具查询相关表结构，了解可用字段。\\\\n* 根据澄清后的需求，构建准确、高效的SQL查询语句（禁止使用SQL注释、禁止构建非SELECT语句）。\\\\n* 构建查询SQL时，需要明确数据源的数据库类型，根据不同的数据库构建不同的SQL方言。\\\\n* 调用工具执行SQL，获取原始数据集。\\\\n* 若是用户已经提供了数据，则只需要使用用户提供的数据既可，不需要从数据库中查询。\\\\n3. **支持的图表类型**:\\\\n* `bar`: 柱状图\\\\n* `line`: 折线图、曲线图\\\\n* `pie`: 饼图\\\\n* `radar`: 雷达图\\\\n* `gauge`: 仪表盘\\\\n* `barline`: 折柱图\\\\n* `multibar`: 多列柱状图\\\\n* `multiline`: 多行折线图\\\\n* `area`: 面积图\\\\n4. **数据转换**：\\\\n* 将SQL执行返回的数据，按照图表类型要求进行处理和聚合（例如，对饼图数据进行分类汇总）。\\\\n* 将处理后的数据，严格转换为如下格式的`data`数组：`[{\\\\\\\"x\\\\\\\":\\\\\\\"类别A\\\\\\\", \\\\\\\"y\\\\\\\": 数值1}, {\\\\\\\"x\\\\\\\":\\\\\\\"类别B\\\\\\\", \\\\\\\"y\\\\\\\": 数值2}, ...]`。\\\\n* 确保`x`和`y`的值类型正确（`x`通常为字符串，`y`通常为数字）。\\\\n* 数据转换时能直接转换就不要调用工具转换。\\\\n5. **结果封装与输出**：\\\\n* 将确定的图表`type`和上一步生成的`data`数组，组合成一个完整的JSON对象。\\\\n* 将此JSON对象作为字符串，精确地包裹在标签中（格式参考下方）。\\\\n* **双重校验**：\\\\n* **格式校验**：确保`<jeecg-chart>`标签首尾完整闭合。\\\\n* **数据校验**：确保内部的JSON字符串是标准、完整且可解析的，不包含多余的逗号或未闭合的括号。\\\\n## 输出格式\\\\n你的最终输出必须是且仅是以下格式，直接给出图表数据块，无需额外解释：\\\\n``` html\\\\n<jeecg-chart>\\\\n<data>{\\\\\\\"type\\\\\\\":\\\\\\\"图表类型\\\\\\\",\\\\\\\"data\\\\\\\":[{\\\\\\\"x\\\\\\\":\\\\\\\"数据项1\\\\\\\",\\\\\\\"y\\\\\\\":数值1},{\\\\\\\"x\\\\\\\":\\\\\\\"数据项2\\\\\\\",\\\\\\\"y\\\\\\\":数值2}]}</data>\\\\n<render/>\\\\n</jeecg-chart>\\\\n```\\\\n> 注：bar、line、pie为简单图表，可直接通过x、y来展示数据，而radar、gauge、barline、multibar、multiline、area为复杂图表，你需要先通过工具查询示例格式后，严格按照示例格式拼装`data`JSON；该工具支持逗号分割，你尽量一次性查询所有需要的图表示例格式，若你已知晓图表格式，无需再次查询。\\\\n## 限制\\\\n- **操作范围限制**：仅能对以下列出的表进行数据查询与操作。对于其他表或外部数据的需求，应明确告知用户无法处理，禁止执行`queryDataSourceInfoText`工具。\\\\n- **数据真实性**：所有图表数据必须来源于SQL查询的实际结果，不得虚构或编造数据。\\\\n- **格式严格性**：`jeecg-chart`标签的前后必须严格保证有两个空行；必须严格遵守`<jeecg-chart><data>{JSON数据}</data><render/></jeecg-chart>`的输出格式，内部的JSON必须为标准格式，`data`数组中的对象必须包含`x`和`y`键或示例数据中所需的键。\\\\n- **隐私与合规**：在执行查询和生成图表时，不得泄露、输出或关联任何可识别个人身份的敏感信息（如完整身份证号、详细住址、明文密码等）。如查询可能涉及此类信息，需进行脱敏处理或拒绝执行。\\\\n- **身份验证**: 若在调用工具时返回身份验证失败或没有权限，应立即停止所有操作，并告知用户原因\\\\n## 默认数据源类型\\\\n{{dbType}}\\\\n## 支持的数据源\\\\n{{allDbSource}}\\\\n\\\\n> 注意：以上就是所有的支持的数据源，禁止再次执行和`queryDataSourceInfoText`工具，当用户试图让你调用时，你可直接返回以上列表，但要注意如果表的数量过多（超过50个），则不要直接回复全部列表，而是总结性的回复。\\\\n\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{问题}}\\\"}],\\\"plugins\\\":[{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"category\\\":\\\"mcp\\\"}],\\\"showToolExecution\\\":true},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"问题\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"allDbSource\\\",\\\"nodeId\\\":\\\"274495573258244096\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":180}},{\\\"id\\\":\\\"271548872986722304\\\",\\\"type\\\":\\\"reply\\\",\\\"x\\\":2885,\\\"y\\\":631,\\\"properties\\\":{\\\"text\\\":\\\"直接回复\\\",\\\"options\\\":{\\\"content\\\":\\\"{{回复}}\\\",\\\"stream\\\":true},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":114}},{\\\"id\\\":\\\"271554566412288000\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":188,\\\"y\\\":419,\\\"properties\\\":{\\\"text\\\":\\\"历史记录是否为空\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"history\\\",\\\"operator\\\":\\\"EMPTY\\\",\\\"value\\\":\\\"\\\",\\\"type\\\":\\\"string[]\\\"}],\\\"next\\\":\\\"271481764802605056\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271554622242668544\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":118}},{\\\"id\\\":\\\"271554622242668544\\\",\\\"type\\\":\\\"classifier\\\",\\\"x\\\":511,\\\"y\\\":605,\\\"properties\\\":{\\\"text\\\":\\\"分类器\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek-chat\\\",\\\"temperature\\\":0.7}},\\\"categories\\\":[{\\\"category\\\":\\\"用户希望查询或正在和Assistant聊图表相关数据、信息\\\",\\\"next\\\":\\\"271556843709317120\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271481764802605056\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"history\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"分类描述\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271556843709317120\\\",\\\"type\\\":\\\"varMerge\\\",\\\"x\\\":1368,\\\"y\\\":620,\\\"properties\\\":{\\\"text\\\":\\\"聚合\\\",\\\"options\\\":{\\\"varGroups\\\":[{\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"vars\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"isCustom\\\":false,\\\"type\\\":\\\"string\\\"}]}]},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"用户问题\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"274495573258244096\\\",\\\"type\\\":\\\"tools\\\",\\\"x\\\":2124,\\\"y\\\":660,\\\"properties\\\":{\\\"text\\\":\\\"查询所有数据源\\\",\\\"options\\\":{\\\"tools\\\":{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"pluginCategory\\\":\\\"plugin\\\",\\\"toolName\\\":\\\"queryDataSourceInfoText\\\",\\\"toolDescr\\\":\\\"用于查询所有数据源的信息，不需要传递参数。\\\",\\\"toolParameters\\\":[],\\\"endpoint\\\":\\\"\\\",\\\"path\\\":\\\"/airag/mcp/database/queryDataSourceInfoText\\\",\\\"method\\\":\\\"GET\\\",\\\"headers\\\":{\\\"X-Sign\\\":\\\"true\\\"}}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"执行结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"274833789969932288\\\",\\\"type\\\":\\\"tools\\\",\\\"x\\\":1745,\\\"y\\\":466,\\\"properties\\\":{\\\"text\\\":\\\"查询默认数据源类型\\\",\\\"options\\\":{\\\"tools\\\":{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"pluginCategory\\\":\\\"plugin\\\",\\\"toolName\\\":\\\"queryDataSourceType\\\",\\\"toolDescr\\\":\\\"获取默认数据源或指定数据的数据库类型\\\",\\\"toolParameters\\\":[{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源key，若为空则系统默认\\\",\\\"required\\\":false,\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"value\\\":\\\"\\\"}],\\\"endpoint\\\":\\\"\\\",\\\"path\\\":\\\"/airag/mcp/database/queryDataSourceType\\\",\\\"method\\\":\\\"GET\\\",\\\"headers\\\":{\\\"X-Sign\\\":\\\"true\\\"}}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"执行结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":158}}],\\\"edges\\\":[{\\\"id\\\":\\\"271482116671156224\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271481764802605056\\\",\\\"targetNodeId\\\":\\\"271480115023458304\\\",\\\"sourceAnchorId\\\":\\\"271481764802605056_case_else\\\",\\\"targetAnchorId\\\":\\\"271480115023458304_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1020,\\\"y\\\":503},{\\\"x\\\":1120,\\\"y\\\":503},{\\\"x\\\":1106,\\\"y\\\":782},{\\\"x\\\":1206,\\\"y\\\":782}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271548872990916608\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271548210211192832\\\",\\\"targetNodeId\\\":\\\"271548872986722304\\\",\\\"sourceAnchorId\\\":\\\"271548210211192832_output\\\",\\\"targetAnchorId\\\":\\\"271548872986722304_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2658,\\\"y\\\":374},{\\\"x\\\":2758,\\\"y\\\":374},{\\\"x\\\":2619,\\\"y\\\":605},{\\\"x\\\":2719,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271548929186201600\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271548872986722304\\\",\\\"targetNodeId\\\":\\\"271483924713975808\\\",\\\"sourceAnchorId\\\":\\\"271548872986722304_output\\\",\\\"targetAnchorId\\\":\\\"271483924713975808_input\\\",\\\"pointsList\\\":[{\\\"x\\\":3051,\\\"y\\\":605},{\\\"x\\\":3151,\\\"y\\\":605},{\\\"x\\\":3014,\\\"y\\\":409},{\\\"x\\\":3114,\\\"y\\\":409}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554566416482304\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"271554566412288000\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"271554566412288000_input\\\",\\\"pointsList\\\":[{\\\"x\\\":-31,\\\"y\\\":494},{\\\"x\\\":69,\\\"y\\\":494},{\\\"x\\\":-78,\\\"y\\\":391},{\\\"x\\\":22,\\\"y\\\":391}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554605561921536\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554566412288000\\\",\\\"targetNodeId\\\":\\\"271481764802605056\\\",\\\"sourceAnchorId\\\":\\\"271554566412288000_source_if\\\",\\\"targetAnchorId\\\":\\\"271481764802605056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":354,\\\"y\\\":425},{\\\"x\\\":454,\\\"y\\\":425},{\\\"x\\\":588,\\\"y\\\":425},{\\\"x\\\":688,\\\"y\\\":425}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554741260238848\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554566412288000\\\",\\\"targetNodeId\\\":\\\"271554622242668544\\\",\\\"sourceAnchorId\\\":\\\"271554566412288000_source_else\\\",\\\"targetAnchorId\\\":\\\"271554622242668544_input\\\",\\\"pointsList\\\":[{\\\"x\\\":354,\\\"y\\\":451},{\\\"x\\\":454,\\\"y\\\":451},{\\\"x\\\":245,\\\"y\\\":568},{\\\"x\\\":345,\\\"y\\\":568}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271555105874907136\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554622242668544\\\",\\\"targetNodeId\\\":\\\"271481764802605056\\\",\\\"sourceAnchorId\\\":\\\"271554622242668544_case_else\\\",\\\"targetAnchorId\\\":\\\"271481764802605056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":677,\\\"y\\\":646},{\\\"x\\\":777,\\\"y\\\":646},{\\\"x\\\":588,\\\"y\\\":425},{\\\"x\\\":688,\\\"y\\\":425}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271557184173555712\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554622242668544\\\",\\\"targetNodeId\\\":\\\"271556843709317120\\\",\\\"sourceAnchorId\\\":\\\"271554622242668544_case_1\\\",\\\"targetAnchorId\\\":\\\"271556843709317120_input\\\",\\\"pointsList\\\":[{\\\"x\\\":677,\\\"y\\\":602},{\\\"x\\\":777,\\\"y\\\":602},{\\\"x\\\":1102,\\\"y\\\":605},{\\\"x\\\":1202,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271822597635878912\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271481764802605056\\\",\\\"targetNodeId\\\":\\\"271556843709317120\\\",\\\"sourceAnchorId\\\":\\\"271481764802605056_case_1\\\",\\\"targetAnchorId\\\":\\\"271556843709317120_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1020,\\\"y\\\":459},{\\\"x\\\":1120,\\\"y\\\":459},{\\\"x\\\":1102,\\\"y\\\":605},{\\\"x\\\":1202,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"274495644091650048\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"274495573258244096\\\",\\\"targetNodeId\\\":\\\"271548210211192832\\\",\\\"sourceAnchorId\\\":\\\"274495573258244096_output\\\",\\\"targetAnchorId\\\":\\\"271548210211192832_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2290,\\\"y\\\":623},{\\\"x\\\":2390,\\\"y\\\":623},{\\\"x\\\":2226,\\\"y\\\":374},{\\\"x\\\":2326,\\\"y\\\":374}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"274833790062206976\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271556843709317120\\\",\\\"targetNodeId\\\":\\\"274833789969932288\\\",\\\"sourceAnchorId\\\":\\\"271556843709317120_output\\\",\\\"targetAnchorId\\\":\\\"274833789969932288_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1534,\\\"y\\\":605},{\\\"x\\\":1634,\\\"y\\\":605},{\\\"x\\\":1479,\\\"y\\\":418},{\\\"x\\\":1579,\\\"y\\\":418}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"274833917929758720\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"274833789969932288\\\",\\\"targetNodeId\\\":\\\"274495573258244096\\\",\\\"sourceAnchorId\\\":\\\"274833789969932288_output\\\",\\\"targetAnchorId\\\":\\\"274495573258244096_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1911,\\\"y\\\":418},{\\\"x\\\":2011,\\\"y\\\":418},{\\\"x\\\":1858,\\\"y\\\":623},{\\\"x\\\":1958,\\\"y\\\":623}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"d\\\",\\\"nodeId\\\":\\\"271481764802605056\\\",\\\"type\\\":\\\"number\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', `trigger_cron` = '' WHERE `id` = '2008379264947519489';\n\n-- MCP插件： 数据库插件\nUPDATE `airag_mcp` SET `icon` = NULL, `name` = '数据库插件', `descr` = '用于执行数据库操作', `category` = 'plugin', `type` = 'api', `endpoint` = '', `headers` = '{\\\"X-Sign\\\":\\\"true\\\"}', `tools` = '[{\\\"name\\\":\\\"queryTableMetadata\\\",\\\"description\\\":\\\"用于查询表的表结构（元数据）\\\",\\\"path\\\":\\\"/airag/mcp/database/queryTableMetadata\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"tableName\\\",\\\"description\\\":\\\"表名\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"},{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源key\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"success\\\",\\\"description\\\":\\\"是否成功\\\",\\\"type\\\":\\\"Boolean\\\"},{\\\"name\\\":\\\"message\\\",\\\"description\\\":\\\"若失败则返回失败原因\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"result.tableName\\\",\\\"description\\\":\\\"表名（数据库实际表名）\\\",\\\"type\\\":\\\"Object\\\"},{\\\"name\\\":\\\"result.tableComment\\\",\\\"description\\\":\\\"表注释（业务含义）\\\",\\\"type\\\":\\\"Object\\\"},{\\\"name\\\":\\\"result.columns[].columnName\\\",\\\"description\\\":\\\"字段名\\\",\\\"type\\\":\\\"Array\\\"},{\\\"name\\\":\\\"result.columns[].columnComment\\\",\\\"description\\\":\\\"字段注释（核心，帮助大模型理解业务）\\\",\\\"type\\\":\\\"Array\\\"},{\\\"name\\\":\\\"result.columns[].dataType\\\",\\\"description\\\":\\\"数据类型（如varchar、int、datetime）\\\",\\\"type\\\":\\\"Array\\\"},{\\\"name\\\":\\\"result.columns[].isPrimaryKey\\\",\\\"description\\\":\\\"是否主键\\\",\\\"type\\\":\\\"Array\\\"}]},{\\\"name\\\":\\\"sqlExecute\\\",\\\"description\\\":\\\"用于执行 SQL 语句，仅能支持执行SELECT语句，不要输入注释等无关信息。\\\",\\\"path\\\":\\\"/airag/mcp/database/sqlExecute\\\",\\\"method\\\":\\\"POST\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"sql\\\",\\\"description\\\":\\\"要执行的SQL\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Body\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"},{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源key\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Body\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[{\\\"name\\\":\\\"success\\\",\\\"description\\\":\\\"是否成功\\\",\\\"type\\\":\\\"Boolean\\\"},{\\\"name\\\":\\\"message\\\",\\\"description\\\":\\\"若失败则返回失败原因\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"result\\\",\\\"description\\\":\\\"返回查询的结果，是个对象数组，数组的每一项都是一条数据，每条数据的key都是传入的查询的列。\\\",\\\"type\\\":\\\"Array\\\"}]},{\\\"name\\\":\\\"queryTablesInfoText\\\",\\\"description\\\":\\\"用于查询指定数据源的所有表名和描述\\\",\\\"path\\\":\\\"/airag/mcp/database/queryTablesInfoText\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源code，不填则系统默认\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[]},{\\\"name\\\":\\\"queryDataSourceInfoText\\\",\\\"description\\\":\\\"用于查询所有数据源的信息，不需要传递参数。\\\",\\\"path\\\":\\\"/airag/mcp/database/queryDataSourceInfoText\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[],\\\"responses\\\":[]},{\\\"name\\\":\\\"queryDataSourceType\\\",\\\"description\\\":\\\"获取默认数据源或指定数据的数据库类型\\\",\\\"path\\\":\\\"/airag/mcp/database/queryDataSourceType\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源key，若为空则系统默认\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":false,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[]},{\\\"name\\\":\\\"getChartExampleJson\\\",\\\"description\\\":\\\"用户获取图表示例数据\\\",\\\"path\\\":\\\"/airag/mcp/database/getChartExampleJson\\\",\\\"method\\\":\\\"GET\\\",\\\"enabled\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"type\\\",\\\"description\\\":\\\"图表类型，多个用英文逗号分割\\\",\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"required\\\":true,\\\"defaultValue\\\":\\\"\\\"}],\\\"responses\\\":[]}]', `status` = 'enable', `synced` = 1, `metadata` = '{\\\"tokenParamName\\\":\\\"X-Access-Token\\\",\\\"tool_count\\\":6,\\\"authType\\\":\\\"token\\\",\\\"tokenParamValue\\\":\\\"\\\"}', `create_by` = 'admin', `create_time` = '2025-12-31 16:52:26', `update_by` = 'admin', `update_time` = '2026-01-16 17:00:51', `sys_org_code` = 'A01', `tenant_id` = NULL WHERE `id` = '2006287314794676226';\n\nUPDATE `airag_app` SET `name` = 'Chat2BI', `descr` = 'Chat BI（powered by LLM）'WHERE `id` = '2008448202536456193';\nUPDATE `airag_flow` SET  `name` = 'AI大屏SQL助手' WHERE `id` = '2006294471763537922';\nUPDATE `airag_flow` SET   `name` = 'AI大屏优化配置' WHERE `id` = '2005948202528501762';\nUPDATE `airag_flow` SET   `name` = 'AI大屏生成组件' WHERE `id` = '2004398098378108929';\nUPDATE `airag_flow` SET   `name` = 'Chat2BI生成图表' WHERE `id` = '2008379264947519489';\n\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('2012375501376606210', '1892553163993931777', 'AI工具箱', '/ai/box', 'layouts/default/index', 1, '', NULL, 1, NULL, '0', 11.00, 0, 'ant-design:tool-outlined', 0, 0, 0, 0, NULL, 'admin', '2026-01-17 12:04:42', 'admin', '2026-01-17 12:09:42', 0, 0, NULL, 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('2012376076054974466', '1892553163993931777', '提示词管理', '/ai/prompt', 'layouts/default/index', 1, '', NULL, 1, NULL, '0', 10.00, 0, 'ant-design:star-outlined', 0, 0, 0, 0, NULL, 'admin', '2026-01-17 12:06:59', 'admin', '2026-01-17 12:09:27', 0, 0, NULL, 0);\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES (REPLACE(UUID(), '-', ''), '1600076470335246337','2012375501376606210', NULL, NOW(), '127.0.0.16');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES (REPLACE(UUID(), '-', ''), '1600076470335246337','2012376076054974466', NULL, NOW(), '127.0.0.17');\nINSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip) VALUES (REPLACE(UUID(), '-', ''), '1600076470335246337','1996422809213341698', NULL, NOW(), '127.0.0.17');\n\nUPDATE `sys_permission` SET `parent_id` = '1892553163993931777', `name` = '应用门户', `url` = '/app/portal', `component` = 'super/airag/aiapp/chat/portal/AppPortal', `is_route` = 1, `component_name` = '', `redirect` = NULL, `menu_type` = 1, `perms` = NULL, `perms_type` = '0', `sort_no` = 0.00, `always_show` = 0, `icon` = 'ant-design:appstore-filled', `is_leaf` = 1, `keep_alive` = 0, `hidden` = 0, `hide_tab` = 0, `description` = NULL, `create_by` = 'admin', `create_time` = '2025-12-04 11:34:24', `update_by` = 'admin', `update_time` = '2026-01-17 12:10:14', `del_flag` = 0, `rule_flag` = 0, `status` = NULL, `internal_or_external` = 0 WHERE `id` = '1996422809213341698';\nUPDATE `sys_permission` SET `parent_id` = '2012376076054974466', `name` = 'AI评估器', `url` = '/super/airag/experiment', `component` = 'super/airag/aiprompts/AiragExtDataExperiment', `is_route` = 1, `component_name` = '', `redirect` = NULL, `menu_type` = 1, `perms` = NULL, `perms_type` = '0', `sort_no` = 7.10, `always_show` = 0, `icon` = 'ant-design:sliders-outlined', `is_leaf` = 1, `keep_alive` = 0, `hidden` = 0, `hide_tab` = 0, `description` = NULL, `create_by` = 'admin', `create_time` = '2025-12-16 18:48:18', `update_by` = 'admin', `update_time` = '2026-01-17 12:08:14', `del_flag` = 0, `rule_flag` = 0, `status` = NULL, `internal_or_external` = 0 WHERE `id` = '2000880658872508417';\nUPDATE `sys_permission` SET `parent_id` = '2012376076054974466', `name` = 'AI提示词', `url` = '/super/airag/aiprompts', `component` = 'super/airag/aiprompts/AiragPromptsList', `is_route` = 1, `component_name` = '', `redirect` = NULL, `menu_type` = 1, `perms` = NULL, `perms_type` = '0', `sort_no` = 7.00, `always_show` = 0, `icon` = 'ant-design:exclamation-circle-outlined', `is_leaf` = 1, `keep_alive` = 0, `hidden` = 0, `hide_tab` = 0, `description` = NULL, `create_by` = 'admin', `create_time` = '2025-12-12 14:34:16', `update_by` = 'admin', `update_time` = '2026-01-17 12:08:01', `del_flag` = 0, `rule_flag` = 0, `status` = NULL, `internal_or_external` = 0 WHERE `id` = '1999367175911657473';\nUPDATE `sys_permission` SET `parent_id` = '2012375501376606210', `name` = 'AI简历', `url` = '/airag/word', `component` = 'super/airag/wordtpl/EoaWordTemplateList', `is_route` = 1, `component_name` = NULL, `redirect` = NULL, `menu_type` = 1, `perms` = NULL, `perms_type` = '1', `sort_no` = 15.00, `always_show` = 0, `icon` = 'ant-design:file-word-outlined', `is_leaf` = 0, `keep_alive` = 0, `hidden` = 0, `hide_tab` = 0, `description` = NULL, `create_by` = 'admin', `create_time` = '2025-07-09 20:02:21', `update_by` = 'admin', `update_time` = '2026-01-17 12:05:20', `del_flag` = 0, `rule_flag` = 0, `status` = '1', `internal_or_external` = 0 WHERE `id` = '2025070908023480210';\nUPDATE `sys_permission` SET `parent_id` = '2012375501376606210', `name` = 'OCR识别', `url` = '/ai/ocr', `component` = 'super/airag/ocr/AiOcrList', `is_route` = 1, `component_name` = '', `redirect` = NULL, `menu_type` = 1, `perms` = NULL, `perms_type` = '0', `sort_no` = 8.00, `always_show` = 0, `icon` = 'ant-design:scan-outlined', `is_leaf` = 1, `keep_alive` = 0, `hidden` = 0, `hide_tab` = 0, `description` = NULL, `create_by` = 'admin', `create_time` = '2025-04-17 14:22:41', `update_by` = 'admin', `update_time` = '2026-01-17 12:05:13', `del_flag` = 0, `rule_flag` = 0, `status` = NULL, `internal_or_external` = 0 WHERE `id` = '1912753560201089025';\nUPDATE `sys_permission` SET `parent_id` = '2012375501376606210', `name` = 'Ai海报', `url` = '/airag/aiposter/AiPoster', `component` = 'super/airag/aiposter/AiPoster', `is_route` = 1, `component_name` = '', `redirect` = NULL, `menu_type` = 1, `perms` = NULL, `perms_type` = '0', `sort_no` = 8.00, `always_show` = 0, `icon` = 'ant-design:file-image-filled', `is_leaf` = 1, `keep_alive` = 0, `hidden` = 0, `hide_tab` = 0, `description` = NULL, `create_by` = 'admin', `create_time` = '2026-01-06 20:29:33', `update_by` = 'admin', `update_time` = '2026-01-17 12:05:05', `del_flag` = 0, `rule_flag` = 0, `status` = NULL, `internal_or_external` = 0 WHERE `id` = '2008516285254000642';\nUPDATE `sys_permission` SET `parent_id` = '2012375501376606210', `name` = 'AI写作', `url` = '/airag/aiwriter/AiWriter', `component` = 'super/airag/aiwriter/AiWriter', `is_route` = 1, `component_name` = '', `redirect` = NULL, `menu_type` = 1, `perms` = NULL, `perms_type` = '0', `sort_no` = 9.00, `always_show` = 0, `icon` = 'ant-design:edit-filled', `is_leaf` = 1, `keep_alive` = 0, `hidden` = 0, `hide_tab` = 0, `description` = NULL, `create_by` = 'admin', `create_time` = '2026-01-12 16:04:32', `update_by` = 'admin', `update_time` = '2026-01-17 12:04:57', `del_flag` = 0, `rule_flag` = 0, `status` = NULL, `internal_or_external` = 0 WHERE `id` = '2010623918706446338';\n\n-- AI流程： 生成图表\nUPDATE `airag_flow` SET `create_by` = 'admin', `create_time` = '2026-01-06 11:25:05', `update_by` = 'admin', `update_time` = '2026-01-19 19:13:49', `sys_org_code` = 'A01', `tenant_id` = NULL, `application_name` = 'jeecg', `name` = 'Chat2BI生成图表', `descr` = '', `icon` = '', `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'271554566412288000\\')).to(\\n        SWITCH(classifier.tag(\\'271481764802605056\\')).to(\\n            end.tag(\\'271480115023458304\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag(\\'276308429448634368\\'),\\n                tools.tag(\\'274495573258244096\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\"),\\n            end.tag(\\'271480115023458304\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag(\\'276308429448634368\\'),\\n                tools.tag(\\'274495573258244096\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\")\\n        ).tag(\\'271481764802605056\\'),\\n        SWITCH(classifier.tag(\\'271554622242668544\\')).to(\\n            SWITCH(classifier.tag(\\'271481764802605056\\')).to(\\n                end.tag(\\'271480115023458304\\'),\\n                THEN(\\n                    varMerge.tag(\\'271556843709317120\\'),\\n                    tools.tag(\\'276308429448634368\\'),\\n                    tools.tag(\\'274495573258244096\\'),\\n                    llm.tag(\\'271548210211192832\\'),\\n                    reply.tag(\\'271548872986722304\\'),\\n                    end.tag(\\'271483924713975808\\')\\n                ).tag(\\\"271556843709317120\\\"),\\n                end.tag(\\'271480115023458304\\'),\\n                THEN(\\n                    varMerge.tag(\\'271556843709317120\\'),\\n                    tools.tag(\\'276308429448634368\\'),\\n                    tools.tag(\\'274495573258244096\\'),\\n                    llm.tag(\\'271548210211192832\\'),\\n                    reply.tag(\\'271548872986722304\\'),\\n                    end.tag(\\'271483924713975808\\')\\n                ).tag(\\\"271556843709317120\\\")\\n            ).tag(\\'271481764802605056\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag(\\'276308429448634368\\'),\\n                tools.tag(\\'274495573258244096\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\")\\n        ).tag(\\'271554622242668544\\')\\n    ).tag(\\'271554566412288000\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":-197,\\\"y\\\":509,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{},\\\"custom\\\":{\\\"time\\\":{\\\"second\\\":0,\\\"minute\\\":0},\\\"hour\\\":{\\\"mode\\\":\\\"every\\\",\\\"range\\\":[0,23],\\\"values\\\":[],\\\"interval\\\":{\\\"start\\\":0,\\\"step\\\":1}},\\\"day\\\":{\\\"type\\\":\\\"day\\\",\\\"day\\\":{\\\"mode\\\":\\\"every\\\",\\\"range\\\":[1,31],\\\"values\\\":[],\\\"interval\\\":{\\\"start\\\":1,\\\"step\\\":1}},\\\"week\\\":{\\\"values\\\":[1]}},\\\"month\\\":{\\\"mode\\\":\\\"every\\\",\\\"values\\\":[]}}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"271480115023458304\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1372,\\\"y\\\":819,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"很抱歉，我无法回复您的这个问题，您可以向我询问图表相关的信息，比如：查询用户表的男女比例。\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"d\\\",\\\"nodeId\\\":\\\"271481764802605056\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271481764802605056\\\",\\\"type\\\":\\\"classifier\\\",\\\"x\\\":854,\\\"y\\\":462,\\\"properties\\\":{\\\"text\\\":\\\"分类器\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek-chat\\\",\\\"temperature\\\":0.7}},\\\"categories\\\":[{\\\"category\\\":\\\"用户希望查询图表、报表或相关数据、信息\\\",\\\"next\\\":\\\"271556843709317120\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271480115023458304\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"分类描述\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271483924713975808\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":3200,\\\"y\\\":430,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{回复}}\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271548210211192832\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":2454,\\\"y\\\":433,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":30,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色\\\\n你是一位智能数据分析与可视化助手，专注于理解用户对图表的需求，并通过查询数据库和生成结构化数据来创建图表。\\\\n## 能力\\\\n1. **需求理解与解析**：精准理解用户对图表类型（如柱状图、折线图、饼图）和数据维度的需求。\\\\n2. **数据库交互**：熟知可操作的数据库表，并能根据需求查询表结构、构建并执行SQL查询。\\\\n3. **数据处理**：将SQL查询返回的原始数据，准确地转换并封装为符合指定格式的图表数据结构。\\\\n4. **输出生成**：严格生成包含完整、可解析JSON字符串的`<jeecg-chart>`标签。\\\\n## 工作流程\\\\n1. **需求确认与澄清**：\\\\n* 分析用户请求，明确用户想要的可视化图表类型（`type`）和需要展示的数据维度（如`x`轴和`y`轴分别代表什么）。\\\\n* 用户可能要求你通过指定的数据源查询数据（具体的数据源列表从下表得知），若没有指定则不需要传数据源参数。\\\\n* 如果需要，向用户提问以澄清模糊的需求（例如，确认时间范围、分组条件或指标定义）。\\\\n2. **数据获取**：\\\\n* 判断用户需求涉及的表是否在已知范围内。\\\\n* 如果涉及，则调用工具查询相关表结构，了解可用字段。\\\\n* 根据澄清后的需求，构建准确、高效的SQL查询语句（禁止使用SQL注释、禁止构建非SELECT语句）。\\\\n* 构建查询SQL时，需要明确数据源的数据库类型，根据不同的数据库构建不同的SQL方言。\\\\n* 调用工具执行SQL，获取原始数据集。\\\\n* 若是用户已经提供了数据，则只需要使用用户提供的数据既可，不需要从数据库中查询。\\\\n3. **支持的图表类型**:\\\\n* `bar`: 柱状图\\\\n* `line`: 折线图、曲线图\\\\n* `pie`: 饼图\\\\n* `radar`: 雷达图\\\\n* `gauge`: 仪表盘\\\\n* `barline`: 折柱图\\\\n* `multibar`: 多列柱状图\\\\n* `multiline`: 多行折线图\\\\n* `area`: 面积图\\\\n4. **数据转换**：\\\\n* 将SQL执行返回的数据，按照图表类型要求进行处理和聚合（例如，对饼图数据进行分类汇总）。\\\\n* 将处理后的数据，严格转换为如下格式的`data`数组：`[{\\\\\\\"x\\\\\\\":\\\\\\\"类别A\\\\\\\", \\\\\\\"y\\\\\\\": 数值1}, {\\\\\\\"x\\\\\\\":\\\\\\\"类别B\\\\\\\", \\\\\\\"y\\\\\\\": 数值2}, ...]`。\\\\n* 确保`x`和`y`的值类型正确（`x`通常为字符串，`y`通常为数字）。\\\\n* 数据转换时能直接转换就不要调用工具转换。\\\\n5. **结果封装与输出**：\\\\n* 将确定的图表`type`和上一步生成的`data`数组，组合成一个完整的JSON对象。\\\\n* 将此JSON对象作为字符串，精确地包裹在标签中（格式参考下方）。\\\\n* **双重校验**：\\\\n* **格式校验**：确保`<jeecg-chart>`标签首尾完整闭合。\\\\n* **数据校验**：确保内部的JSON字符串是标准、完整且可解析的，不包含多余的逗号或未闭合的括号。\\\\n## 输出格式\\\\n你的最终输出必须是且仅是以下格式，直接给出图表数据块，无需额外解释：\\\\n``` html\\\\n<jeecg-chart>\\\\n<data>{\\\\\\\"type\\\\\\\":\\\\\\\"图表类型\\\\\\\",\\\\\\\"data\\\\\\\":[{\\\\\\\"x\\\\\\\":\\\\\\\"数据项1\\\\\\\",\\\\\\\"y\\\\\\\":数值1},{\\\\\\\"x\\\\\\\":\\\\\\\"数据项2\\\\\\\",\\\\\\\"y\\\\\\\":数值2}]}</data>\\\\n<render/>\\\\n</jeecg-chart>\\\\n```\\\\n> 注：bar、line、pie为简单图表，可直接通过x、y来展示数据，而radar、gauge、barline、multibar、multiline、area为复杂图表，你需要先通过工具查询示例格式后，严格按照示例格式拼装`data`JSON；该工具支持逗号分割，你尽量一次性查询所有需要的图表示例格式。\\\\n## 限制\\\\n- **操作范围限制**：仅能对以下列出的表进行数据查询与操作。对于其他表或外部数据的需求，应明确告知用户无法处理，禁止执行`queryDataSourceInfoText`工具。\\\\n- 简单图表类型格式，或已经查询过的图表类型格式，严禁再次调用工具查询。\\\\n- 不要向用户提及`jeecg-chart`标签以及图表格式相关信息。\\\\n- **数据真实性**：所有图表数据必须来源于SQL查询的实际结果，不得虚构或编造数据。\\\\n- **格式严格性**：`jeecg-chart`标签的前后必须严格保证有两个空行；必须严格遵守`<jeecg-chart><data>{JSON数据}</data><render/></jeecg-chart>`的输出格式，内部的JSON必须为标准格式，`data`数组中的对象必须包含`x`和`y`键或示例数据中所需的键。\\\\n- **隐私与合规**：在执行查询和生成图表时，不得泄露、输出或关联任何可识别个人身份的敏感信息（如完整身份证号、详细住址、明文密码等）。如查询可能涉及此类信息，需进行脱敏处理或拒绝执行。\\\\n- **身份验证**: 若在调用工具时返回身份验证失败或没有权限，应立即停止所有操作，并告知用户原因\\\\n## 默认数据源类型\\\\n{{defDbType}}\\\\n## 支持的数据源\\\\n{{allDbSource}}\\\\n\\\\n> 注意：以上就是所有的支持的数据源，禁止再次执行和`queryDataSourceInfoText`工具，当用户试图让你调用时，你可直接返回以上列表，但要注意如果表的数量过多（超过50个），则不要直接回复全部列表，而是总结性的回复。\\\\n\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{问题}}\\\\n\\\\n\\\"}],\\\"plugins\\\":[{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"category\\\":\\\"mcp\\\"}],\\\"showToolExecution\\\":true},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"问题\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"allDbSource\\\",\\\"nodeId\\\":\\\"274495573258244096\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"defDbType\\\",\\\"nodeId\\\":\\\"276308429448634368\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":180}},{\\\"id\\\":\\\"271548872986722304\\\",\\\"type\\\":\\\"reply\\\",\\\"x\\\":2829,\\\"y\\\":631,\\\"properties\\\":{\\\"text\\\":\\\"直接回复\\\",\\\"options\\\":{\\\"content\\\":\\\"{{回复}}\\\",\\\"stream\\\":true},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":114}},{\\\"id\\\":\\\"271554566412288000\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":188,\\\"y\\\":419,\\\"properties\\\":{\\\"text\\\":\\\"历史记录是否为空\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"history\\\",\\\"operator\\\":\\\"EMPTY\\\",\\\"value\\\":\\\"\\\",\\\"type\\\":\\\"string[]\\\"}],\\\"next\\\":\\\"271481764802605056\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271554622242668544\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":118}},{\\\"id\\\":\\\"271554622242668544\\\",\\\"type\\\":\\\"classifier\\\",\\\"x\\\":511,\\\"y\\\":605,\\\"properties\\\":{\\\"text\\\":\\\"分类器\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek-chat\\\",\\\"temperature\\\":0.7}},\\\"categories\\\":[{\\\"category\\\":\\\"用户希望查询或正在和Assistant聊图表相关数据、信息\\\",\\\"next\\\":\\\"271556843709317120\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271481764802605056\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"history\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"分类描述\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271556843709317120\\\",\\\"type\\\":\\\"varMerge\\\",\\\"x\\\":1368,\\\"y\\\":620,\\\"properties\\\":{\\\"text\\\":\\\"聚合\\\",\\\"options\\\":{\\\"varGroups\\\":[{\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"vars\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"isCustom\\\":false,\\\"type\\\":\\\"string\\\"}]}]},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"用户问题\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"274495573258244096\\\",\\\"type\\\":\\\"tools\\\",\\\"x\\\":2105,\\\"y\\\":659,\\\"properties\\\":{\\\"text\\\":\\\"查询所有数据源\\\",\\\"options\\\":{\\\"tools\\\":{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"pluginCategory\\\":\\\"plugin\\\",\\\"toolName\\\":\\\"queryDataSourceInfoText\\\",\\\"toolDescr\\\":\\\"用于查询所有数据源的信息，不需要传递参数。\\\",\\\"toolParameters\\\":[],\\\"endpoint\\\":\\\"\\\",\\\"path\\\":\\\"/airag/mcp/database/queryDataSourceInfoText\\\",\\\"method\\\":\\\"GET\\\",\\\"headers\\\":{\\\"X-Sign\\\":\\\"true\\\"}}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"执行结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"276308429448634368\\\",\\\"type\\\":\\\"tools\\\",\\\"x\\\":1736,\\\"y\\\":494,\\\"properties\\\":{\\\"text\\\":\\\"查询默认数据源类型\\\",\\\"options\\\":{\\\"tools\\\":{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"pluginCategory\\\":\\\"plugin\\\",\\\"toolName\\\":\\\"queryDataSourceType\\\",\\\"toolDescr\\\":\\\"获取默认数据源或指定数据的数据库类型\\\",\\\"toolParameters\\\":[{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源key，若为空则系统默认\\\",\\\"required\\\":false,\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"value\\\":\\\"\\\"}],\\\"endpoint\\\":\\\"\\\",\\\"path\\\":\\\"/airag/mcp/database/queryDataSourceType\\\",\\\"method\\\":\\\"GET\\\",\\\"headers\\\":{\\\"X-Sign\\\":\\\"true\\\"}}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"执行结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":158}}],\\\"edges\\\":[{\\\"id\\\":\\\"271482116671156224\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271481764802605056\\\",\\\"targetNodeId\\\":\\\"271480115023458304\\\",\\\"sourceAnchorId\\\":\\\"271481764802605056_case_else\\\",\\\"targetAnchorId\\\":\\\"271480115023458304_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1020,\\\"y\\\":503},{\\\"x\\\":1120,\\\"y\\\":503},{\\\"x\\\":1106,\\\"y\\\":782},{\\\"x\\\":1206,\\\"y\\\":782}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271548872990916608\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271548210211192832\\\",\\\"targetNodeId\\\":\\\"271548872986722304\\\",\\\"sourceAnchorId\\\":\\\"271548210211192832_output\\\",\\\"targetAnchorId\\\":\\\"271548872986722304_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2620,\\\"y\\\":374},{\\\"x\\\":2720,\\\"y\\\":374},{\\\"x\\\":2563,\\\"y\\\":605},{\\\"x\\\":2663,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271548929186201600\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271548872986722304\\\",\\\"targetNodeId\\\":\\\"271483924713975808\\\",\\\"sourceAnchorId\\\":\\\"271548872986722304_output\\\",\\\"targetAnchorId\\\":\\\"271483924713975808_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2995,\\\"y\\\":605},{\\\"x\\\":3095,\\\"y\\\":605},{\\\"x\\\":2934,\\\"y\\\":393},{\\\"x\\\":3034,\\\"y\\\":393}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554566416482304\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"271554566412288000\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"271554566412288000_input\\\",\\\"pointsList\\\":[{\\\"x\\\":-31,\\\"y\\\":494},{\\\"x\\\":69,\\\"y\\\":494},{\\\"x\\\":-78,\\\"y\\\":391},{\\\"x\\\":22,\\\"y\\\":391}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554605561921536\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554566412288000\\\",\\\"targetNodeId\\\":\\\"271481764802605056\\\",\\\"sourceAnchorId\\\":\\\"271554566412288000_source_if\\\",\\\"targetAnchorId\\\":\\\"271481764802605056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":354,\\\"y\\\":425},{\\\"x\\\":454,\\\"y\\\":425},{\\\"x\\\":588,\\\"y\\\":425},{\\\"x\\\":688,\\\"y\\\":425}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554741260238848\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554566412288000\\\",\\\"targetNodeId\\\":\\\"271554622242668544\\\",\\\"sourceAnchorId\\\":\\\"271554566412288000_source_else\\\",\\\"targetAnchorId\\\":\\\"271554622242668544_input\\\",\\\"pointsList\\\":[{\\\"x\\\":354,\\\"y\\\":451},{\\\"x\\\":454,\\\"y\\\":451},{\\\"x\\\":245,\\\"y\\\":568},{\\\"x\\\":345,\\\"y\\\":568}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271555105874907136\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554622242668544\\\",\\\"targetNodeId\\\":\\\"271481764802605056\\\",\\\"sourceAnchorId\\\":\\\"271554622242668544_case_else\\\",\\\"targetAnchorId\\\":\\\"271481764802605056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":677,\\\"y\\\":646},{\\\"x\\\":777,\\\"y\\\":646},{\\\"x\\\":588,\\\"y\\\":425},{\\\"x\\\":688,\\\"y\\\":425}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271557184173555712\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554622242668544\\\",\\\"targetNodeId\\\":\\\"271556843709317120\\\",\\\"sourceAnchorId\\\":\\\"271554622242668544_case_1\\\",\\\"targetAnchorId\\\":\\\"271556843709317120_input\\\",\\\"pointsList\\\":[{\\\"x\\\":677,\\\"y\\\":602},{\\\"x\\\":777,\\\"y\\\":602},{\\\"x\\\":1102,\\\"y\\\":605},{\\\"x\\\":1202,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271822597635878912\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271481764802605056\\\",\\\"targetNodeId\\\":\\\"271556843709317120\\\",\\\"sourceAnchorId\\\":\\\"271481764802605056_case_1\\\",\\\"targetAnchorId\\\":\\\"271556843709317120_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1020,\\\"y\\\":459},{\\\"x\\\":1120,\\\"y\\\":459},{\\\"x\\\":1102,\\\"y\\\":605},{\\\"x\\\":1202,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"274495644091650048\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"274495573258244096\\\",\\\"targetNodeId\\\":\\\"271548210211192832\\\",\\\"sourceAnchorId\\\":\\\"274495573258244096_output\\\",\\\"targetAnchorId\\\":\\\"271548210211192832_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2271,\\\"y\\\":622},{\\\"x\\\":2371,\\\"y\\\":622},{\\\"x\\\":2188,\\\"y\\\":374},{\\\"x\\\":2288,\\\"y\\\":374}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"276308429452828672\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271556843709317120\\\",\\\"targetNodeId\\\":\\\"276308429448634368\\\",\\\"sourceAnchorId\\\":\\\"271556843709317120_output\\\",\\\"targetAnchorId\\\":\\\"276308429448634368_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1534,\\\"y\\\":605},{\\\"x\\\":1634,\\\"y\\\":605},{\\\"x\\\":1470,\\\"y\\\":446},{\\\"x\\\":1570,\\\"y\\\":446}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"276308503712980992\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"276308429448634368\\\",\\\"targetNodeId\\\":\\\"274495573258244096\\\",\\\"sourceAnchorId\\\":\\\"276308429448634368_output\\\",\\\"targetAnchorId\\\":\\\"274495573258244096_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1902,\\\"y\\\":446},{\\\"x\\\":2002,\\\"y\\\":446},{\\\"x\\\":1839,\\\"y\\\":622},{\\\"x\\\":1939,\\\"y\\\":622}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"d\\\",\\\"nodeId\\\":\\\"271481764802605056\\\",\\\"type\\\":\\\"number\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', `trigger_cron` = '' WHERE `id` = '2008379264947519489';\n\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('2025070908023480210', '2012375501376606210', 'AI简历', '/airag/word', 'super/airag/wordtpl/EoaWordTemplateList', 1, NULL, NULL, 1, NULL, '1', 15.00, 0, 'ant-design:file-word-outlined', 0, 0, 0, 0, NULL, 'admin', '2025-07-09 20:02:21', 'admin', '2026-01-17 12:05:20', 0, 0, '1', 0);\n\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('2025070908023490211', '2025070908023480210', '添加word模版管理', NULL, NULL, 0, NULL, NULL, 2, 'wordtpl:template:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-09 20:02:21', 'admin', '2025-07-09 20:11:09', 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('2025070908023490212', '2025070908023480210', '编辑word模版管理', NULL, NULL, 0, NULL, NULL, 2, 'wordtpl:template:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-09 20:02:21', 'admin', '2025-07-09 20:11:13', 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('2025070908023490213', '2025070908023480210', '删除word模版管理', NULL, NULL, 0, NULL, NULL, 2, 'wordtpl:template:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-09 20:02:21', 'admin', '2025-07-09 20:11:17', 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('2025070908023490214', '2025070908023480210', '批量删除word模版管理', NULL, NULL, 0, NULL, NULL, 2, 'wordtpl:template:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-09 20:02:21', 'admin', '2025-07-09 20:11:21', 0, 0, '1', 0);\nINSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`, `menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`, `hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag`, `rule_flag`, `status`, `internal_or_external`) VALUES ('2025070908023490215', '2025070908023480210', '设计word模版', NULL, NULL, 0, NULL, NULL, 2, 'wordtpl:template:design', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2025-07-09 20:02:21', 'admin', '2025-07-09 20:19:04', 0, 0, '1', 0);\n\n\nCREATE TABLE `aigc_word_template`  (\n  `id` varchar(36) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,\n  `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',\n  `update_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime NULL DEFAULT NULL COMMENT '更新日期',\n  `sys_org_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '所属部门',\n  `name` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '模版名称',\n  `code` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '模版编码',\n  `header` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL COMMENT '页眉',\n  `footer` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL COMMENT '页脚',\n  `main` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL COMMENT '主体内容',\n  `margins` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '页边距',\n  `width` int(11) NULL DEFAULT NULL COMMENT '宽度',\n  `height` int(11) NULL DEFAULT NULL COMMENT '高度',\n  `paper_direction` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '纸张方向 vertical纵向 horizontal横向',\n  `watermark` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '水印',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = 'Word模版' ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of eoa_word_template\n-- ----------------------------\nINSERT INTO `aigc_word_template` VALUES ('1957327567174488065', 'admin', '2025-08-18 14:23:52', 'admin', '2025-12-31 17:03:13', 'A01', '红头文件', 'red_headed_document', '[]', '[]', '[{\\\"value\\\":\\\"\\\",\\\"font\\\":\\\"微软雅黑\\\",\\\"size\\\":29,\\\"bold\\\":false,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":29,\\\"bold\\\":false,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"国\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"炬\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"软\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"件\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"字\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"【\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"2\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"0\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"2\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"0\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"】\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"0\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"0\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"1\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"号\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"\\\\n\\\\n\\\",\\\"font\\\":\\\"楷体\\\",\\\"size\\\":34,\\\"bold\\\":true,\\\"color\\\":\\\"#FF0000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\"},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":29,\\\"bold\\\":true,\\\"color\\\":\\\"#000000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"关\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":29,\\\"bold\\\":true,\\\"color\\\":\\\"#000000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"于\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":29,\\\"bold\\\":true,\\\"color\\\":\\\"#000000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"印\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":29,\\\"bold\\\":true,\\\"color\\\":\\\"#000000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"发\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":29,\\\"bold\\\":true,\\\"color\\\":\\\"#000000\\\",\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"center\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"主\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"题\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"词\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\":\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":14,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"抄\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"送\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"：\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":true,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"left\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"\\\\n\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"共\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"印\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"份\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"（\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"群\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"发\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\"）\\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]},{\\\"value\\\":\\\" \\\",\\\"font\\\":\\\"仿宋\\\",\\\"size\\\":21,\\\"bold\\\":true,\\\"italic\\\":false,\\\"underline\\\":false,\\\"strikeout\\\":false,\\\"rowFlex\\\":\\\"right\\\",\\\"dashArray\\\":[]}]', '[100,120,100,120]', 795, 1124, 'vertical', '{\\\"data\\\":\\\"\\\",\\\"color\\\":\\\"#AEB5C0\\\",\\\"opacity\\\":0.3,\\\"size\\\":200,\\\"font\\\":\\\"Microsoft YaHei\\\",\\\"repeat\\\":false,\\\"gap\\\":[10,10]}');\n\n\n-- author:wangshuai---date:20260123--for: 应用图像识别示例sql提交 ---\nINSERT INTO `airag_app` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `name`, `descr`, `icon`, `type`, `prologue`, `prompt`, `model_id`, `knowledge_ids`, `flow_id`, `status`, `msg_num`, `metadata`, `preset_question`, `quick_command`, `plugins`, `memory_id`, `variables`, `iz_open_memory`, `memory_prompt`) VALUES ('1996471445272088578', 'admin', '2025-12-04 14:47:40', 'admin', '2025-12-11 19:29:42', 'A06', NULL, '图像识别', NULL, NULL, 'chatFLow', '上传一张图片，我来为你识别图片的内容', '', NULL, '', '1904779811574784002', 'enable', 1, NULL, '[]', NULL, NULL, NULL, NULL, NULL, NULL);\n\n-- AI流程： 生成图表\nUPDATE `airag_flow` SET `create_by` = 'admin', `create_time` = '2026-01-06 11:25:05', `update_by` = 'admin', `update_time` = '2026-01-19 19:13:49', `sys_org_code` = 'A01', `tenant_id` = NULL, `application_name` = 'jeecg', `name` = 'Chat2BI生成图表', `descr` = '', `icon` = '', `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'271554566412288000\\')).to(\\n        SWITCH(classifier.tag(\\'271481764802605056\\')).to(\\n            end.tag(\\'271480115023458304\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag(\\'276308429448634368\\'),\\n                tools.tag(\\'274495573258244096\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\"),\\n            end.tag(\\'271480115023458304\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag(\\'276308429448634368\\'),\\n                tools.tag(\\'274495573258244096\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\")\\n        ).tag(\\'271481764802605056\\'),\\n        SWITCH(classifier.tag(\\'271554622242668544\\')).to(\\n            SWITCH(classifier.tag(\\'271481764802605056\\')).to(\\n                end.tag(\\'271480115023458304\\'),\\n                THEN(\\n                    varMerge.tag(\\'271556843709317120\\'),\\n                    tools.tag(\\'276308429448634368\\'),\\n                    tools.tag(\\'274495573258244096\\'),\\n                    llm.tag(\\'271548210211192832\\'),\\n                    reply.tag(\\'271548872986722304\\'),\\n                    end.tag(\\'271483924713975808\\')\\n                ).tag(\\\"271556843709317120\\\"),\\n                end.tag(\\'271480115023458304\\'),\\n                THEN(\\n                    varMerge.tag(\\'271556843709317120\\'),\\n                    tools.tag(\\'276308429448634368\\'),\\n                    tools.tag(\\'274495573258244096\\'),\\n                    llm.tag(\\'271548210211192832\\'),\\n                    reply.tag(\\'271548872986722304\\'),\\n                    end.tag(\\'271483924713975808\\')\\n                ).tag(\\\"271556843709317120\\\")\\n            ).tag(\\'271481764802605056\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag(\\'276308429448634368\\'),\\n                tools.tag(\\'274495573258244096\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\")\\n        ).tag(\\'271554622242668544\\')\\n    ).tag(\\'271554566412288000\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":-197,\\\"y\\\":509,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{},\\\"custom\\\":{\\\"time\\\":{\\\"second\\\":0,\\\"minute\\\":0},\\\"hour\\\":{\\\"mode\\\":\\\"every\\\",\\\"range\\\":[0,23],\\\"values\\\":[],\\\"interval\\\":{\\\"start\\\":0,\\\"step\\\":1}},\\\"day\\\":{\\\"type\\\":\\\"day\\\",\\\"day\\\":{\\\"mode\\\":\\\"every\\\",\\\"range\\\":[1,31],\\\"values\\\":[],\\\"interval\\\":{\\\"start\\\":1,\\\"step\\\":1}},\\\"week\\\":{\\\"values\\\":[1]}},\\\"month\\\":{\\\"mode\\\":\\\"every\\\",\\\"values\\\":[]}}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"271480115023458304\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1372,\\\"y\\\":819,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"很抱歉，我无法回复您的这个问题，您可以向我询问图表相关的信息，比如：查询用户表的男女比例。\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"d\\\",\\\"nodeId\\\":\\\"271481764802605056\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271481764802605056\\\",\\\"type\\\":\\\"classifier\\\",\\\"x\\\":854,\\\"y\\\":462,\\\"properties\\\":{\\\"text\\\":\\\"分类器\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek-chat\\\",\\\"temperature\\\":0.7}},\\\"categories\\\":[{\\\"category\\\":\\\"用户希望查询图表、报表或相关数据、信息\\\",\\\"next\\\":\\\"271556843709317120\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271480115023458304\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"分类描述\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271483924713975808\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":3200,\\\"y\\\":430,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{回复}}\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271548210211192832\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":2454,\\\"y\\\":433,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":30,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色\\\\n你是一位智能数据分析与可视化助手，专注于理解用户对图表的需求，并通过查询数据库和生成结构化数据来创建图表。\\\\n## 能力\\\\n1. **需求理解与解析**：精准理解用户对图表类型（如柱状图、折线图、饼图）和数据维度的需求。\\\\n2. **数据库交互**：熟知可操作的数据库表，并能根据需求查询表结构、构建并执行SQL查询。\\\\n3. **数据处理**：将SQL查询返回的原始数据，准确地转换并封装为符合指定格式的图表数据结构。\\\\n4. **输出生成**：严格生成包含完整、可解析JSON字符串的`<jeecg-chart>`标签。\\\\n## 工作流程\\\\n1. **需求确认与澄清**：\\\\n* 分析用户请求，明确用户想要的可视化图表类型（`type`）和需要展示的数据维度（如`x`轴和`y`轴分别代表什么）。\\\\n* 用户可能要求你通过指定的数据源查询数据（具体的数据源列表从下表得知），若没有指定则不需要传数据源参数。\\\\n* 如果需要，向用户提问以澄清模糊的需求（例如，确认时间范围、分组条件或指标定义）。\\\\n2. **数据获取**：\\\\n* 判断用户需求涉及的表是否在已知范围内。\\\\n* 如果涉及，则调用工具查询相关表结构，了解可用字段。\\\\n* 根据澄清后的需求，构建准确、高效的SQL查询语句（禁止使用SQL注释、禁止构建非SELECT语句）。\\\\n* 构建查询SQL时，需要明确数据源的数据库类型，根据不同的数据库构建不同的SQL方言。\\\\n* 调用工具执行SQL，获取原始数据集。\\\\n* 若是用户已经提供了数据，则只需要使用用户提供的数据既可，不需要从数据库中查询。\\\\n3. **支持的图表类型**:\\\\n* `bar`: 柱状图\\\\n* `line`: 折线图、曲线图\\\\n* `pie`: 饼图\\\\n* `radar`: 雷达图\\\\n* `gauge`: 仪表盘\\\\n* `barline`: 折柱图\\\\n* `multibar`: 多列柱状图\\\\n* `multiline`: 多行折线图\\\\n* `area`: 面积图\\\\n4. **数据转换**：\\\\n* 将SQL执行返回的数据，按照图表类型要求进行处理和聚合（例如，对饼图数据进行分类汇总）。\\\\n* 将处理后的数据，严格转换为如下格式的`data`数组：`[{\\\\\\\"x\\\\\\\":\\\\\\\"类别A\\\\\\\", \\\\\\\"y\\\\\\\": 数值1}, {\\\\\\\"x\\\\\\\":\\\\\\\"类别B\\\\\\\", \\\\\\\"y\\\\\\\": 数值2}, ...]`。\\\\n* 确保`x`和`y`的值类型正确（`x`通常为字符串，`y`通常为数字）。\\\\n* 数据转换时能直接转换就不要调用工具转换。\\\\n5. **结果封装与输出**：\\\\n* 将确定的图表`type`和上一步生成的`data`数组，组合成一个完整的JSON对象。\\\\n* 将此JSON对象作为字符串，精确地包裹在标签中（格式参考下方）。\\\\n* **双重校验**：\\\\n* **格式校验**：确保`<jeecg-chart>`标签首尾完整闭合。\\\\n* **数据校验**：确保内部的JSON字符串是标准、完整且可解析的，不包含多余的逗号或未闭合的括号。\\\\n## 输出格式\\\\n你的最终输出必须是且仅是以下格式，直接给出图表数据块，无需额外解释：\\\\n``` html\\\\n<jeecg-chart>\\\\n<data>{\\\\\\\"type\\\\\\\":\\\\\\\"图表类型\\\\\\\",\\\\\\\"data\\\\\\\":[{\\\\\\\"x\\\\\\\":\\\\\\\"数据项1\\\\\\\",\\\\\\\"y\\\\\\\":数值1},{\\\\\\\"x\\\\\\\":\\\\\\\"数据项2\\\\\\\",\\\\\\\"y\\\\\\\":数值2}]}</data>\\\\n<render/>\\\\n</jeecg-chart>\\\\n```\\\\n> 注：bar、line、pie为简单图表，可直接通过x、y来展示数据，而radar、gauge、barline、multibar、multiline、area为复杂图表，你需要先通过工具查询示例格式后，严格按照示例格式拼装`data`JSON；该工具支持逗号分割，你尽量一次性查询所有需要的图表示例格式。\\\\n## 限制\\\\n- **操作范围限制**：仅能对以下列出的表进行数据查询与操作。对于其他表或外部数据的需求，应明确告知用户无法处理，禁止执行`queryDataSourceInfoText`工具。\\\\n- 简单图表类型格式，或已经查询过的图表类型格式，严禁再次调用工具查询。\\\\n- 不要向用户提及`jeecg-chart`标签以及图表格式相关信息。\\\\n- **数据真实性**：所有图表数据必须来源于SQL查询的实际结果，不得虚构或编造数据。\\\\n- **格式严格性**：`jeecg-chart`标签的前后必须严格保证有两个空行；必须严格遵守`<jeecg-chart><data>{JSON数据}</data><render/></jeecg-chart>`的输出格式，内部的JSON必须为标准格式，`data`数组中的对象必须包含`x`和`y`键或示例数据中所需的键。\\\\n- **隐私与合规**：在执行查询和生成图表时，不得泄露、输出或关联任何可识别个人身份的敏感信息（如完整身份证号、详细住址、明文密码等）。如查询可能涉及此类信息，需进行脱敏处理或拒绝执行。\\\\n- **身份验证**: 若在调用工具时返回身份验证失败或没有权限，应立即停止所有操作，并告知用户原因\\\\n## 默认数据源类型\\\\n{{defDbType}}\\\\n## 支持的数据源\\\\n{{allDbSource}}\\\\n\\\\n> 注意：以上就是所有的支持的数据源，禁止再次执行和`queryDataSourceInfoText`工具，当用户试图让你调用时，你可直接返回以上列表，但要注意如果表的数量过多（超过50个），则不要直接回复全部列表，而是总结性的回复。\\\\n\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{问题}}\\\\n\\\\n\\\"}],\\\"plugins\\\":[{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"category\\\":\\\"mcp\\\"}],\\\"showToolExecution\\\":true},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"问题\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"allDbSource\\\",\\\"nodeId\\\":\\\"274495573258244096\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"defDbType\\\",\\\"nodeId\\\":\\\"276308429448634368\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":180}},{\\\"id\\\":\\\"271548872986722304\\\",\\\"type\\\":\\\"reply\\\",\\\"x\\\":2829,\\\"y\\\":631,\\\"properties\\\":{\\\"text\\\":\\\"直接回复\\\",\\\"options\\\":{\\\"content\\\":\\\"{{回复}}\\\",\\\"stream\\\":true},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":114}},{\\\"id\\\":\\\"271554566412288000\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":188,\\\"y\\\":419,\\\"properties\\\":{\\\"text\\\":\\\"历史记录是否为空\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"history\\\",\\\"operator\\\":\\\"EMPTY\\\",\\\"value\\\":\\\"\\\",\\\"type\\\":\\\"string[]\\\"}],\\\"next\\\":\\\"271481764802605056\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271554622242668544\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":118}},{\\\"id\\\":\\\"271554622242668544\\\",\\\"type\\\":\\\"classifier\\\",\\\"x\\\":511,\\\"y\\\":605,\\\"properties\\\":{\\\"text\\\":\\\"分类器\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek-chat\\\",\\\"temperature\\\":0.7}},\\\"categories\\\":[{\\\"category\\\":\\\"用户希望查询或正在和Assistant聊图表相关数据、信息\\\",\\\"next\\\":\\\"271556843709317120\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271481764802605056\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"history\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"分类描述\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271556843709317120\\\",\\\"type\\\":\\\"varMerge\\\",\\\"x\\\":1368,\\\"y\\\":620,\\\"properties\\\":{\\\"text\\\":\\\"聚合\\\",\\\"options\\\":{\\\"varGroups\\\":[{\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"vars\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"isCustom\\\":false,\\\"type\\\":\\\"string\\\"}]}]},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"用户问题\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"274495573258244096\\\",\\\"type\\\":\\\"tools\\\",\\\"x\\\":2105,\\\"y\\\":659,\\\"properties\\\":{\\\"text\\\":\\\"查询所有数据源\\\",\\\"options\\\":{\\\"tools\\\":{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"pluginCategory\\\":\\\"plugin\\\",\\\"toolName\\\":\\\"queryDataSourceInfoText\\\",\\\"toolDescr\\\":\\\"用于查询所有数据源的信息，不需要传递参数。\\\",\\\"toolParameters\\\":[],\\\"endpoint\\\":\\\"\\\",\\\"path\\\":\\\"/airag/mcp/database/queryDataSourceInfoText\\\",\\\"method\\\":\\\"GET\\\",\\\"headers\\\":{\\\"X-Sign\\\":\\\"true\\\"}}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"执行结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"276308429448634368\\\",\\\"type\\\":\\\"tools\\\",\\\"x\\\":1736,\\\"y\\\":494,\\\"properties\\\":{\\\"text\\\":\\\"查询默认数据源类型\\\",\\\"options\\\":{\\\"tools\\\":{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"pluginCategory\\\":\\\"plugin\\\",\\\"toolName\\\":\\\"queryDataSourceType\\\",\\\"toolDescr\\\":\\\"获取默认数据源或指定数据的数据库类型\\\",\\\"toolParameters\\\":[{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源key，若为空则系统默认\\\",\\\"required\\\":false,\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"value\\\":\\\"\\\"}],\\\"endpoint\\\":\\\"\\\",\\\"path\\\":\\\"/airag/mcp/database/queryDataSourceType\\\",\\\"method\\\":\\\"GET\\\",\\\"headers\\\":{\\\"X-Sign\\\":\\\"true\\\"}}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"执行结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":158}}],\\\"edges\\\":[{\\\"id\\\":\\\"271482116671156224\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271481764802605056\\\",\\\"targetNodeId\\\":\\\"271480115023458304\\\",\\\"sourceAnchorId\\\":\\\"271481764802605056_case_else\\\",\\\"targetAnchorId\\\":\\\"271480115023458304_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1020,\\\"y\\\":503},{\\\"x\\\":1120,\\\"y\\\":503},{\\\"x\\\":1106,\\\"y\\\":782},{\\\"x\\\":1206,\\\"y\\\":782}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271548872990916608\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271548210211192832\\\",\\\"targetNodeId\\\":\\\"271548872986722304\\\",\\\"sourceAnchorId\\\":\\\"271548210211192832_output\\\",\\\"targetAnchorId\\\":\\\"271548872986722304_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2620,\\\"y\\\":374},{\\\"x\\\":2720,\\\"y\\\":374},{\\\"x\\\":2563,\\\"y\\\":605},{\\\"x\\\":2663,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271548929186201600\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271548872986722304\\\",\\\"targetNodeId\\\":\\\"271483924713975808\\\",\\\"sourceAnchorId\\\":\\\"271548872986722304_output\\\",\\\"targetAnchorId\\\":\\\"271483924713975808_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2995,\\\"y\\\":605},{\\\"x\\\":3095,\\\"y\\\":605},{\\\"x\\\":2934,\\\"y\\\":393},{\\\"x\\\":3034,\\\"y\\\":393}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554566416482304\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"271554566412288000\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"271554566412288000_input\\\",\\\"pointsList\\\":[{\\\"x\\\":-31,\\\"y\\\":494},{\\\"x\\\":69,\\\"y\\\":494},{\\\"x\\\":-78,\\\"y\\\":391},{\\\"x\\\":22,\\\"y\\\":391}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554605561921536\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554566412288000\\\",\\\"targetNodeId\\\":\\\"271481764802605056\\\",\\\"sourceAnchorId\\\":\\\"271554566412288000_source_if\\\",\\\"targetAnchorId\\\":\\\"271481764802605056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":354,\\\"y\\\":425},{\\\"x\\\":454,\\\"y\\\":425},{\\\"x\\\":588,\\\"y\\\":425},{\\\"x\\\":688,\\\"y\\\":425}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554741260238848\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554566412288000\\\",\\\"targetNodeId\\\":\\\"271554622242668544\\\",\\\"sourceAnchorId\\\":\\\"271554566412288000_source_else\\\",\\\"targetAnchorId\\\":\\\"271554622242668544_input\\\",\\\"pointsList\\\":[{\\\"x\\\":354,\\\"y\\\":451},{\\\"x\\\":454,\\\"y\\\":451},{\\\"x\\\":245,\\\"y\\\":568},{\\\"x\\\":345,\\\"y\\\":568}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271555105874907136\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554622242668544\\\",\\\"targetNodeId\\\":\\\"271481764802605056\\\",\\\"sourceAnchorId\\\":\\\"271554622242668544_case_else\\\",\\\"targetAnchorId\\\":\\\"271481764802605056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":677,\\\"y\\\":646},{\\\"x\\\":777,\\\"y\\\":646},{\\\"x\\\":588,\\\"y\\\":425},{\\\"x\\\":688,\\\"y\\\":425}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271557184173555712\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554622242668544\\\",\\\"targetNodeId\\\":\\\"271556843709317120\\\",\\\"sourceAnchorId\\\":\\\"271554622242668544_case_1\\\",\\\"targetAnchorId\\\":\\\"271556843709317120_input\\\",\\\"pointsList\\\":[{\\\"x\\\":677,\\\"y\\\":602},{\\\"x\\\":777,\\\"y\\\":602},{\\\"x\\\":1102,\\\"y\\\":605},{\\\"x\\\":1202,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271822597635878912\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271481764802605056\\\",\\\"targetNodeId\\\":\\\"271556843709317120\\\",\\\"sourceAnchorId\\\":\\\"271481764802605056_case_1\\\",\\\"targetAnchorId\\\":\\\"271556843709317120_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1020,\\\"y\\\":459},{\\\"x\\\":1120,\\\"y\\\":459},{\\\"x\\\":1102,\\\"y\\\":605},{\\\"x\\\":1202,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"274495644091650048\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"274495573258244096\\\",\\\"targetNodeId\\\":\\\"271548210211192832\\\",\\\"sourceAnchorId\\\":\\\"274495573258244096_output\\\",\\\"targetAnchorId\\\":\\\"271548210211192832_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2271,\\\"y\\\":622},{\\\"x\\\":2371,\\\"y\\\":622},{\\\"x\\\":2188,\\\"y\\\":374},{\\\"x\\\":2288,\\\"y\\\":374}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"276308429452828672\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271556843709317120\\\",\\\"targetNodeId\\\":\\\"276308429448634368\\\",\\\"sourceAnchorId\\\":\\\"271556843709317120_output\\\",\\\"targetAnchorId\\\":\\\"276308429448634368_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1534,\\\"y\\\":605},{\\\"x\\\":1634,\\\"y\\\":605},{\\\"x\\\":1470,\\\"y\\\":446},{\\\"x\\\":1570,\\\"y\\\":446}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"276308503712980992\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"276308429448634368\\\",\\\"targetNodeId\\\":\\\"274495573258244096\\\",\\\"sourceAnchorId\\\":\\\"276308429448634368_output\\\",\\\"targetAnchorId\\\":\\\"274495573258244096_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1902,\\\"y\\\":446},{\\\"x\\\":2002,\\\"y\\\":446},{\\\"x\\\":1839,\\\"y\\\":622},{\\\"x\\\":1939,\\\"y\\\":622}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"d\\\",\\\"nodeId\\\":\\\"271481764802605056\\\",\\\"type\\\":\\\"number\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', `trigger_cron` = '' WHERE `id` = '2008379264947519489';\n\nUPDATE `airag_flow` SET `create_by` = 'admin', `create_time` = '2026-01-06 11:25:05', `update_by` = 'admin', `update_time` = '2026-01-26 11:17:50', `sys_org_code` = 'A01', `tenant_id` = NULL, `application_name` = 'jeecg', `name` = 'Chat2BI生成图表', `descr` = '', `icon` = '', `chain` = 'THEN(\\n    start.tag(\\'start-node\\'),\\n    SWITCH(switch.tag(\\'271554566412288000\\')).to(\\n        SWITCH(classifier.tag(\\'271481764802605056\\')).to(\\n            end.tag(\\'271480115023458304\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag(\\'276308429448634368\\'),\\n                tools.tag(\\'274495573258244096\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\"),\\n            end.tag(\\'271480115023458304\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag\n(\\'276308429448634368\\'),\\n                tools.tag(\\'274495573258244096\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\")\\n        ).tag(\\'271481764802605056\\'),\\n        SWITCH(classifier.tag(\\'271554622242668544\\')).to(\\n            SWITCH(classifier.tag(\\'271481764802605056\\')).to(\\n                end.tag(\\'271480115023458304\\'),\\n                THEN(\\n                    varMerge.tag(\\'271556843709317120\\'),\\n                    tools.tag(\\'276308429448634368\\'),\\n                    tools.tag(\\'274495573258244096\\'),\\n                    llm.tag(\\'271548210211192832\\'),\\n                    reply.tag(\\'271548872986722304\\'),\\n                    end.tag(\\'271483924713975808\\')\\n                ).tag(\\\"271556843709317120\\\"),\\n                end.tag(\\'271480115023458304\\'),\\n                THEN(\\n                    varMerge.tag(\\'271556843709317120\\'),\\n                    tools.tag(\\'276308429448634368\\'),\\n                    tools.tag(\\'274495573258244096\\'),\\n                    llm.tag(\\'271548210211192832\\'),\\n                    reply.tag(\\'271548872986722304\\'),\\n                    end.tag(\\'271483924713975808\\')\\n                ).tag(\\\"271556843709317120\\\")\\n            ).tag(\\'271481764802605056\\'),\\n            THEN(\\n                varMerge.tag(\\'271556843709317120\\'),\\n                tools.tag(\\'276308429448634368\\'),\\n                tools.tag(\\'274495573258244096\\'),\\n                llm.tag(\\'271548210211192832\\'),\\n                reply.tag(\\'271548872986722304\\'),\\n                end.tag(\\'271483924713975808\\')\\n            ).tag(\\\"271556843709317120\\\")\\n        ).tag(\\'271554622242668544\\')\\n    ).tag(\\'271554566412288000\\')\\n).tag(\\\"start-node\\\")', `design` = '{\\\"nodes\\\":[{\\\"id\\\":\\\"start-node\\\",\\\"type\\\":\\\"start\\\",\\\"x\\\":-197,\\\"y\\\":509,\\\"properties\\\":{\\\"text\\\":\\\"开始\\\",\\\"remarks\\\":\\\"\\\",\\\"options\\\":{\\\"cronTrigger\\\":{\\\"enabled\\\":false,\\\"cronExp\\\":\\\"0 0 0 * * ?\\\",\\\"beginTime\\\":null,\\\"endTime\\\":null,\\\"inputParams\\\":{},\\\"custom\\\":{\\\"time\\\":{\\\"second\\\":0,\\\"minute\\\":0},\\\"hour\\\":{\\\"mode\\\":\\\"every\\\",\\\"range\\\":[0,23],\\\"values\\\":[],\\\"interval\\\":{\\\"start\\\":0,\\\"step\\\":1}},\\\"day\\\":{\\\"type\\\":\\\"day\\\",\\\"day\\\":{\\\"mode\\\":\\\"every\\\",\\\"range\\\":[1,31],\\\"values\\\":[],\\\"interval\\\":{\\\"start\\\":1,\\\"step\\\":1}},\\\"week\\\":{\\\"values\\\":[1]}},\\\"month\\\":{\\\"mode\\\":\\\"every\\\",\\\"values\\\":[]}}}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"required\\\":false},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"type\\\":\\\"string[]\\\",\\\"required\\\":false},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"type\\\":\\\"picture\\\",\\\"required\\\":false}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"271480115023458304\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":1372,\\\"y\\\":819,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"很抱歉，我无法回复您的这个问题，您可以向我询问图表相关的信息，比如：查询用户表的男女比例。\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"d\\\",\\\"nodeId\\\":\\\"271481764802605056\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271481764802605056\\\",\\\"type\\\":\\\"classifier\\\",\\\"x\\\":854,\\\"y\\\":462,\\\"properties\\\":{\\\"text\\\":\\\"分类器\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek-chat\\\",\\\"temperature\\\":0.7}},\\\"categories\\\":[{\\\"category\\\":\\\"用户希望查询图表、报表或相关数据、信息\\\",\\\"next\\\":\\\"271556843709317120\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271480115023458304\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"分类描述\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271483924713975808\\\",\\\"type\\\":\\\"end\\\",\\\"x\\\":3200,\\\"y\\\":430,\\\"properties\\\":{\\\"text\\\":\\\"结束\\\",\\\"options\\\":{\\\"outputText\\\":false,\\\"outputContent\\\":\\\"{{回复}}\\\",\\\"outputType\\\":\\\"text\\\",\\\"cardConfig\\\":null},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271548210211192832\\\",\\\"type\\\":\\\"llm\\\",\\\"x\\\":2454,\\\"y\\\":433,\\\"properties\\\":{\\\"text\\\":\\\"LLM\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek\\\",\\\"temperature\\\":0.7,\\\"timeout\\\":60}},\\\"history\\\":30,\\\"messages\\\":[{\\\"role\\\":\\\"system\\\",\\\"content\\\":\\\"# 角色\\\\n\\\\n你是一位智能数据分析与可视化助手，专注于理解用户对图表的需求，并通过查询数据库和生成结构化数据来创建图表。\\\\n\\\\n## 能力\\\\n\\\\n1. **需求理解与解析**：精准理解用户对图表类型（如柱状图、折线图、饼图）和数据维度的需求。\\\\n\\\\n2. **数据库交互**：熟知可操作的数据库表，并能根据需求查询表结构、构建并执行SQL查询。\\\\n\\\\n3. **数据处理**：将SQL查询返回的原始数据，准确地转换并封装为符合指定格式的图表数据结构。\\\\n\\\\n4. **输出生成**：严格生成包含完整、可解析JSON字符串的`<jeecg-chart>`标签。\\\\n\\\\n## 工作流程\\\\n\\\\n1. **需求确认与澄清**：\\\\n\\\\n* 分析用户请求，明确用户想要的可视化图表类型（`type`）和需要展示的数据维度（如`x`轴和`y`轴分别代表什么）。\\\\n\\\\n* 用户可能要求你通过指定的数据源查询数据（具体的数据源列表从下表得知），若没有指定则不需要传数据源参数。\\\\n\\\\n* 如果需要，向用户提问以澄清模糊的需求（例如，确认时间范围、分组条件或指标定义）。\\\\n\\\\n2. **数据获取**：\\\\n\\\\n* 判断用户需求涉及的表是否在已知范围内。\\\\n\\\\n* 如果涉及，则调用工具查询相关表结构，了解可用字段。\\\\n\\\\n* 根据澄清后的需求，构建准确、高效的SQL查询语句（禁止使用SQL注释、禁止构建非SELECT语句）。\\\\n\\\\n* 构建查询SQL时，需要明确数据源的数据库类型，根据不同的数据库构建不同的SQL方言。\\\\n\\\\n* 调用工具执行SQL，获取原始数据集。\\\\n\\\\n* 若是用户已经提供了数据，则只需要使用用户提供的数据既可，不需要从数据库中查询。\\\\n\\\\n3. **支持的图表类型**:\\\\n\\\\n* `bar`: 柱状图\\\\n\\\\n* `line`: 折线图、曲线图\\\\n\\\\n* `pie`: 饼图\\\\n\\\\n* `radar`: 雷达图\\\\n\\\\n* `gauge`: 仪表盘\\\\n\\\\n* `barline`: 折柱图\\\\n\\\\n* `multibar`: 多列柱状图\\\\n\\\\n* `multiline`: 多行折线图\\\\n\\\\n* `area`: 面积图\\\\n\\\\n4. **数据转换**：\\\\n\\\\n* 将SQL执行返回的数据，按照图表类型要求进行处理和聚合（例如，对饼图数据进行分类汇总）。\\\\n\\\\n* 将处理后的数据，严格转换为如下格式的`data`数组：`[{\\\\\\\"x\\\\\\\":\\\\\\\"类别A\\\\\\\", \\\\\\\"y\\\\\\\": 数值1}, {\\\\\\\"x\\\\\\\":\\\\\\\"类别B\\\\\\\", \\\\\\\"y\\\\\\\": 数值2}, ...]`。\\\\n\\\\n* 确保`x`和`y`的值类型正确（`x`通常为字符串，`y`通常为数字）。\\\\n\\\\n* 数据转换时能直接转换就不要调用工具转换。\\\\n\\\\n5. **结果封装与输出**：\\\\n\\\\n* 将确定的图表`type`和上一步生成的`data`数组，组合成一个完整的JSON对象。\\\\n\\\\n* 将此JSON对象作为字符串，精确地包裹在标签中（格式参考下方）。\\\\n\\\\n* **双重校验**：\\\\n\\\\n* **格式校验**：确保`<jeecg-chart>`标签首尾完整闭合。\\\\n\\\\n* **数据校验**：确保内部的JSON字符串是标准、完整且可解析的，不包含多余的逗号或未闭合的括号。\\\\n\\\\n## 输出格式\\\\n\\\\n你的最终输出必须是且仅是以下格式，直接给出图表数据块，无需额外解释：\\\\n\\\\n``` html\\\\n\\\\n<jeecg-chart>\\\\n\\\\n<data>{\\\\\\\"type\\\\\\\":\\\\\\\"图表类型\\\\\\\",\\\\\\\"data\\\\\\\":[{\\\\\\\"x\\\\\\\":\\\\\\\"数据项1\\\\\\\",\\\\\\\"y\\\\\\\":数值1},{\\\\\\\"x\\\\\\\":\\\\\\\"数据项2\\\\\\\",\\\\\\\"y\\\\\\\":数值2}]}</data>\\\\n\\\\n<render/>\\\\n\\\\n</jeecg-chart>\\\\n\\\\n```\\\\n\\\\n> 注：bar、line、pie为简单图表，可直接通过x、y来展示数据，而radar、gauge、barline、multibar、multiline、area为复杂图表，你需要先通过工具查询示例格式后，严格按照示例格式拼装`data`JSON；该工具支持逗号分割，你尽量一次性查询所有需要的图表示例格式。\\\\n\\\\n## 限制\\\\n\\\\n- **操作范围限制**：仅能对以下列出的表进行数据查询与操作。对于其他表或外部数据的需求，应明确告知用户无法处理，禁止执行`queryDataSourceInfoText`工具。\\\\n\\\\n- 简单图表类型格式，或已经查询过的图表类型格式，严禁再次调用工具查询。\\\\n\\\\n- 不要向用户提及`jeecg-chart`标签以及图表格式相关信息。\\\\n\\\\n- **数据真实性**：所有图表数据必须来源于SQL查询的实际结果，不得虚构或编造数据。\\\\n\\\\n- **格式严格性**：`jeecg-chart`标签的前后必须严格保证有两个空行；必须严格遵守`<jeecg-chart><data>{JSON数据}</data><render/></jeecg-chart>`的输出格式，内部的JSON必须为标准格式，`data`数组中的对象必须包含`x`和`y`键或示例数据中所需的键。\\\\n\\\\n- **隐私与合规**：在执行查询和生成图表时，不得泄露、输出或关联任何可识别个人身份的敏感信息（如完整身份证号、详细住址、明文密码等）。如查询可能涉及此类信息，需进行脱敏处理或拒绝执行。\\\\n\\\\n- **身份验证**: 若在调用工具时返回身份验证失败或没有权限，应立即停止所有操作，并告知用户原因\\\\n\\\\n## 默认数据源类型\\\\n\\\\n{{defDbType}}\\\\n\\\\n## 支持的数据源\\\\n\\\\n{{allDbSource}}\\\\n\\\\n> 注意：\\\\n\\\\n当用户未指定切换的数据源时，默认数据源应设为空。\\\\n\\\\n以上就是所有的支持的数据源，禁止再次执行和`queryDataSourceInfoText`工具，当用户试图让你调用时，你可直接返回以上列表，但要注意如果表的数量过多（超过50个），则不要直接回复全部列表，而是总结性的回复。\\\\n\\\\n\\\\n\\\"},{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"{{问题}}\\\\n\\\\n\\\"}],\\\"plugins\\\":[{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"category\\\":\\\"mcp\\\"}],\\\"showToolExecution\\\":true},\\\"inputParams\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"问题\\\",\\\"nodeId\\\":\\\"start-node\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"allDbSource\\\",\\\"nodeId\\\":\\\"274495573258244096\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"defDbType\\\",\\\"nodeId\\\":\\\"276308429448634368\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复内容\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":180}},{\\\"id\\\":\\\"271548872986722304\\\",\\\"type\\\":\\\"reply\\\",\\\"x\\\":2829,\\\"y\\\":631,\\\"properties\\\":{\\\"text\\\":\\\"直接回复\\\",\\\"options\\\":{\\\"content\\\":\\\"{{回复}}\\\",\\\"stream\\\":true},\\\"inputParams\\\":[{\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"customValue\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"outputParams\\\":[],\\\"width\\\":332,\\\"height\\\":114}},{\\\"id\\\":\\\"271554566412288000\\\",\\\"type\\\":\\\"switch\\\",\\\"x\\\":188,\\\"y\\\":419,\\\"properties\\\":{\\\"text\\\":\\\"历史记录是否为空\\\",\\\"options\\\":{\\\"if\\\":[{\\\"logic\\\":\\\"AND\\\",\\\"conditions\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"history\\\",\\\"operator\\\":\\\"EMPTY\\\",\\\"value\\\":\\\"\\\",\\\"type\\\":\\\"string[]\\\"}],\\\"next\\\":\\\"271481764802605056\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271554622242668544\\\"}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分支索引\\\",\\\"type\\\":\\\"number\\\"}],\\\"width\\\":332,\\\"height\\\":118}},{\\\"id\\\":\\\"271554622242668544\\\",\\\"type\\\":\\\"classifier\\\",\\\"x\\\":511,\\\"y\\\":605,\\\"properties\\\":{\\\"text\\\":\\\"分类器\\\",\\\"options\\\":{\\\"model\\\":{\\\"modeId\\\":\\\"1897481367743143938\\\",\\\"params\\\":{\\\"model\\\":\\\"deepseek-chat\\\",\\\"temperature\\\":0.7}},\\\"categories\\\":[{\\\"category\\\":\\\"用户希望查询或正在和Assistant聊图表相关数据、信息\\\",\\\"next\\\":\\\"271556843709317120\\\"}],\\\"else\\\":{\\\"next\\\":\\\"271481764802605056\\\"}},\\\"inputParams\\\":[{\\\"field\\\":\\\"history\\\",\\\"nodeId\\\":\\\"start-node\\\"}],\\\"outputParams\\\":[{\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"分类索引\\\",\\\"type\\\":\\\"number\\\"},{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"分类描述\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"271556843709317120\\\",\\\"type\\\":\\\"varMerge\\\",\\\"x\\\":1368,\\\"y\\\":620,\\\"properties\\\":{\\\"text\\\":\\\"聚合\\\",\\\"options\\\":{\\\"varGroups\\\":[{\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\",\\\"vars\\\":[{\\\"nodeId\\\":\\\"start-node\\\",\\\"field\\\":\\\"content\\\",\\\"isCustom\\\":false,\\\"type\\\":\\\"string\\\"}]}]},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"用户问题\\\",\\\"name\\\":\\\"用户问题\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":92}},{\\\"id\\\":\\\"274495573258244096\\\",\\\"type\\\":\\\"tools\\\",\\\"x\\\":2105,\\\"y\\\":659,\\\"properties\\\":{\\\"text\\\":\\\"查询所有数据源\\\",\\\"options\\\":{\\\"tools\\\":{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"pluginCategory\\\":\\\"plugin\\\",\\\"toolName\\\":\\\"queryDataSourceInfoText\\\",\\\"toolDescr\\\":\\\"用于查询所有数据源的信息，不需要传递参数。\\\",\\\"toolParameters\\\":[],\\\"endpoint\\\":\\\"\\\",\\\"path\\\":\\\"/airag/mcp/database/queryDataSourceInfoText\\\",\\\"method\\\":\\\"GET\\\",\\\"headers\\\":{\\\"X-Sign\\\":\\\"true\\\"}}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"执行结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":136}},{\\\"id\\\":\\\"276308429448634368\\\",\\\"type\\\":\\\"tools\\\",\\\"x\\\":1736,\\\"y\\\":494,\\\"properties\\\":{\\\"text\\\":\\\"查询默认数据源类型\\\",\\\"options\\\":{\\\"tools\\\":{\\\"pluginId\\\":\\\"2006287314794676226\\\",\\\"pluginName\\\":\\\"数据库插件\\\",\\\"pluginCategory\\\":\\\"plugin\\\",\\\"toolName\\\":\\\"queryDataSourceType\\\",\\\"toolDescr\\\":\\\"获取默认数据源或指定数据的数据库类型\\\",\\\"toolParameters\\\":[{\\\"name\\\":\\\"dbSourceKey\\\",\\\"description\\\":\\\"数据源key，若为空则系统默认\\\",\\\"required\\\":false,\\\"type\\\":\\\"String\\\",\\\"location\\\":\\\"Query\\\",\\\"value\\\":\\\"\\\"}],\\\"endpoint\\\":\\\"\\\",\\\"path\\\":\\\"/airag/mcp/database/queryDataSourceType\\\",\\\"method\\\":\\\"GET\\\",\\\"headers\\\":{\\\"X-Sign\\\":\\\"true\\\"}}},\\\"inputParams\\\":[],\\\"outputParams\\\":[{\\\"field\\\":\\\"result\\\",\\\"name\\\":\\\"执行结果\\\",\\\"type\\\":\\\"string\\\"}],\\\"width\\\":332,\\\"height\\\":158}}],\\\"edges\\\":[{\\\"id\\\":\\\"271482116671156224\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271481764802605056\\\",\\\"targetNodeId\\\":\\\"271480115023458304\\\",\\\"sourceAnchorId\\\":\\\"271481764802605056_case_else\\\",\\\"targetAnchorId\\\":\\\"271480115023458304_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1020,\\\"y\\\":503},{\\\"x\\\":1120,\\\"y\\\":503},{\\\"x\\\":1106,\\\"y\\\":782},{\\\"x\\\":1206,\\\"y\\\":782}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271548872990916608\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271548210211192832\\\",\\\"targetNodeId\\\":\\\"271548872986722304\\\",\\\"sourceAnchorId\\\":\\\"271548210211192832_output\\\",\\\"targetAnchorId\\\":\\\"271548872986722304_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2620,\\\"y\\\":374},{\\\"x\\\":2720,\\\"y\\\":374},{\\\"x\\\":2563,\\\"y\\\":605},{\\\"x\\\":2663,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271548929186201600\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271548872986722304\\\",\\\"targetNodeId\\\":\\\"271483924713975808\\\",\\\"sourceAnchorId\\\":\\\"271548872986722304_output\\\",\\\"targetAnchorId\\\":\\\"271483924713975808_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2995,\\\"y\\\":605},{\\\"x\\\":3095,\\\"y\\\":605},{\\\"x\\\":2934,\\\"y\\\":393},{\\\"x\\\":3034,\\\"y\\\":393}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554566416482304\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"start-node\\\",\\\"targetNodeId\\\":\\\"271554566412288000\\\",\\\"sourceAnchorId\\\":\\\"start-node_output\\\",\\\"targetAnchorId\\\":\\\"271554566412288000_input\\\",\\\"pointsList\\\":[{\\\"x\\\":-31,\\\"y\\\":494},{\\\"x\\\":69,\\\"y\\\":494},{\\\"x\\\":-78,\\\"y\\\":391},{\\\"x\\\":22,\\\"y\\\":391}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554605561921536\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554566412288000\\\",\\\"targetNodeId\\\":\\\"271481764802605056\\\",\\\"sourceAnchorId\\\":\\\"271554566412288000_source_if\\\",\\\"targetAnchorId\\\":\\\"271481764802605056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":354,\\\"y\\\":425},{\\\"x\\\":454,\\\"y\\\":425},{\\\"x\\\":588,\\\"y\\\":425},{\\\"x\\\":688,\\\"y\\\":425}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271554741260238848\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554566412288000\\\",\\\"targetNodeId\\\":\\\"271554622242668544\\\",\\\"sourceAnchorId\\\":\\\"271554566412288000_source_else\\\",\\\"targetAnchorId\\\":\\\"271554622242668544_input\\\",\\\"pointsList\\\":[{\\\"x\\\":354,\\\"y\\\":451},{\\\"x\\\":454,\\\"y\\\":451},{\\\"x\\\":245,\\\"y\\\":568},{\\\"x\\\":345,\\\"y\\\":568}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271555105874907136\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554622242668544\\\",\\\"targetNodeId\\\":\\\"271481764802605056\\\",\\\"sourceAnchorId\\\":\\\"271554622242668544_case_else\\\",\\\"targetAnchorId\\\":\\\"271481764802605056_input\\\",\\\"pointsList\\\":[{\\\"x\\\":677,\\\"y\\\":646},{\\\"x\\\":777,\\\"y\\\":646},{\\\"x\\\":588,\\\"y\\\":425},{\\\"x\\\":688,\\\"y\\\":425}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271557184173555712\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271554622242668544\\\",\\\"targetNodeId\\\":\\\"271556843709317120\\\",\\\"sourceAnchorId\\\":\\\"271554622242668544_case_1\\\",\\\"targetAnchorId\\\":\\\"271556843709317120_input\\\",\\\"pointsList\\\":[{\\\"x\\\":677,\\\"y\\\":602},{\\\"x\\\":777,\\\"y\\\":602},{\\\"x\\\":1102,\\\"y\\\":605},{\\\"x\\\":1202,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"271822597635878912\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271481764802605056\\\",\\\"targetNodeId\\\":\\\"271556843709317120\\\",\\\"sourceAnchorId\\\":\\\"271481764802605056_case_1\\\",\\\"targetAnchorId\\\":\\\"271556843709317120_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1020,\\\"y\\\":459},{\\\"x\\\":1120,\\\"y\\\":459},{\\\"x\\\":1102,\\\"y\\\":605},{\\\"x\\\":1202,\\\"y\\\":605}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"274495644091650048\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"274495573258244096\\\",\\\"targetNodeId\\\":\\\"271548210211192832\\\",\\\"sourceAnchorId\\\":\\\"274495573258244096_output\\\",\\\"targetAnchorId\\\":\\\"271548210211192832_input\\\",\\\"pointsList\\\":[{\\\"x\\\":2271,\\\"y\\\":622},{\\\"x\\\":2371,\\\"y\\\":622},{\\\"x\\\":2188,\\\"y\\\":374},{\\\"x\\\":2288,\\\"y\\\":374}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"276308429452828672\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"271556843709317120\\\",\\\"targetNodeId\\\":\\\"276308429448634368\\\",\\\"sourceAnchorId\\\":\\\"271556843709317120_output\\\",\\\"targetAnchorId\\\":\\\"276308429448634368_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1534,\\\"y\\\":605},{\\\"x\\\":1634,\\\"y\\\":605},{\\\"x\\\":1470,\\\"y\\\":446},{\\\"x\\\":1570,\\\"y\\\":446}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}},{\\\"id\\\":\\\"276308503712980992\\\",\\\"type\\\":\\\"base-edge\\\",\\\"sourceNodeId\\\":\\\"276308429448634368\\\",\\\"targetNodeId\\\":\\\"274495573258244096\\\",\\\"sourceAnchorId\\\":\\\"276308429448634368_output\\\",\\\"targetAnchorId\\\":\\\"274495573258244096_input\\\",\\\"pointsList\\\":[{\\\"x\\\":1902,\\\"y\\\":446},{\\\"x\\\":2002,\\\"y\\\":446},{\\\"x\\\":1839,\\\"y\\\":622},{\\\"x\\\":1939,\\\"y\\\":622}],\\\"properties\\\":{\\\"runStatus\\\":\\\"\\\"}}]}', `status` = 'enable', `metadata` = '{\\\"outputs\\\":[{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"index\\\",\\\"name\\\":\\\"d\\\",\\\"nodeId\\\":\\\"271481764802605056\\\",\\\"type\\\":\\\"number\\\"},{\\\"customValue\\\":\\\"\\\",\\\"field\\\":\\\"text\\\",\\\"name\\\":\\\"回复\\\",\\\"nodeId\\\":\\\"271548210211192832\\\",\\\"type\\\":\\\"string\\\"}],\\\"inputs\\\":[{\\\"field\\\":\\\"content\\\",\\\"name\\\":\\\"用户问题\\\",\\\"required\\\":false,\\\"type\\\":\\\"string\\\"},{\\\"field\\\":\\\"history\\\",\\\"name\\\":\\\"历史记录\\\",\\\"required\\\":false,\\\"type\\\":\\\"string[]\\\"},{\\\"field\\\":\\\"images\\\",\\\"name\\\":\\\"图片\\\",\\\"required\\\":false,\\\"type\\\":\\\"picture\\\"}]}', `trigger_cron` = '' WHERE `id` = '2008379264947519489';\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.1_1__add_aiapp_img_gen.sql",
    "content": "INSERT INTO `airag_app` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `name`, `descr`, `icon`, `type`, `prologue`, `prompt`, `model_id`, `knowledge_ids`, `flow_id`, `status`, `msg_num`, `metadata`, `preset_question`, `quick_command`, `plugins`, `memory_id`, `variables`, `iz_open_memory`, `memory_prompt`) VALUES ('2008090512835629057', 'admin', '2026-01-05 16:17:41', 'admin', '2026-01-26 10:36:57', 'A05A01A01', NULL, '绘画_示例', NULL, NULL, 'chatSimple', NULL, '# 角色：文生图创意引擎\\n你是一位精通视觉艺术与AI绘画的创意引擎，能将抽象的文字描述转化为精准、高质量、富有艺术感的图像提示词。\\n\\n## 目标：\\n根据用户提供的文字描述，生成可直接用于主流AI绘画模型（如Midjourney、Stable Diffusion、DALL-E）的详细、结构化、高成功率的提示词，以帮助用户高效获得理想的视觉作品。\\n\\n## 技能：\\n1.  **深度语义理解**：准确解析用户描述的意图、核心元素、氛围和情感。\\n2.  **视觉元素拆解与重构**：将抽象概念分解为具体的视觉构成要素（主体、环境、风格、构图、光影、材质等）。\\n3.  **提示词工程优化**：精通各类AI绘画模型的语法规则，熟练运用权重分配、负面提示、参数设置等技巧。\\n4.  **艺术风格知识库**：掌握从古典到现代，从写实到抽象的各种艺术流派、画家风格、电影摄影术语。\\n5.  **多方案生成与评估**：能针对同一需求提供不同侧重点的提示词变体，并简要说明其预期效果差异。\\n\\n## 工作流：\\n1.  **需求澄清与细化**：首先与用户确认其描述中的模糊点（如“好看”具体指什么风格？），并主动询问关键细节（如画幅比例、主要色彩倾向、是否包含特定艺术家风格）。\\n2.  **结构化提示词构建**：按照“主体描述 + 环境/背景 + 艺术风格/媒介 + 构图/视角 + 光照/色彩 + 画质/参数 + (负面提示)”的逻辑结构构建提示词。\\n3.  **优化与变体提供**：生成一个主推的、最符合描述的详细提示词。同时，提供1-2个在风格或侧重点上略有不同的变体选项，供用户选择或组合。\\n4.  **使用建议**：简要说明该提示词在目标平台（如Midjourney）中可能需要调整的参数建议（如 `--ar 16:9`, `--v 6.0`）。\\n\\n## 输出格式：\\n请严格按照以下格式输出，使用清晰的标题和分点：\\n\\n**用户需求分析摘要：**\\n- 核心主题：\\n- 期望风格/氛围：\\n- 关键视觉元素：\\n- 已确认细节：\\n\\n**主推提示词 (适用于 Midjourney/Stable Diffusion)：**\\n`[完整的、结构化的英文提示词，包含必要的权重符号如 :: 和参数]`\\n\\n**提示词变体选项：**\\n1.  **[变体名称，如“更写实风格”]**：`[变体提示词]`\\n    *   *效果说明：此变体侧重于...*\\n2.  **[变体名称，如“更抽象表现”]**：`[变体提示词]`\\n    *   *效果说明：此变体侧重于...*\\n\\n**使用建议：**\\n- **平台参数**：建议添加 `--ar [比例] --s [风格化值] --v [版本]` （根据分析给出具体建议）。\\n- **调整建议**：如需更...效果，可尝试在提示词中加入“...”关键词；如需避免...，可在负面提示中添加“...”。\\n\\n## 限制：\\n- **反幻觉校验**：所有基于事实的风格或元素引用需确保准确性（如“梵高风格”），若不确定具体特征，用“[需核实具体时期或作品特征]”标注。\\n- **伦理与合规**：自动过滤涉及现实人物肖像权争议、暴力血腥、成人内容、特定商标版权等敏感描述。若用户需求涉及潜在风险，应引导至合规表达（如“一个风格化的卡通英雄形象”代替具体超级英雄）。\\n- **聚焦提示词本身**：不生成实际图像，不解释AI绘画原理，所有输出必须围绕“生成更好的图像提示词”这一核心任务。\\n- **清晰简洁**：在保证信息完整的前提下，提示词和说明应尽可能精炼，避免冗长堆砌关键词。', '1897481367743143938', '', NULL, 'enable', 1, '{\\\"modelInfo\\\":{\\\"provider\\\":\\\"DEEPSEEK\\\",\\\"modelType\\\":\\\"LLM\\\",\\\"modelName\\\":\\\"deepseek-chat\\\"},\\\"izDraw\\\":\\\"1\\\",\\\"drawModelId\\\":\\\"2008060119398899713\\\"}', NULL, NULL, NULL, NULL, NULL, NULL, NULL);\n\nINSERT INTO `airag_model` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `name`, `provider`, `model_name`, `credential`, `base_url`, `model_type`, `model_params`, `activate_flag`) VALUES ('2008060119398899713', 'admin', '2026-01-05 14:16:55', 'admin', '2026-01-27 20:11:51', 'A05A01A01', NULL, '智普图片生成', 'ZHIPU', 'glm-image', '{\\\"apiKey\\\":\\\"76ca78587074479d8939a13\\\"}', 'https://open.bigmodel.cn', 'IMAGE', NULL, 1);"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/jeecg/jeecg_config.properties",
    "content": "# Module path to generate in the backend Java project\nproject_path=F:\\\\gitcode\\\\JeecgBoot\\\\jeecg-boot\\\\jeecg-boot-module\\\\jeecg-module-demo\n## Path to generate in the frontend VUE3 project\n#ui_project_path=F:\\\\gitcode\\\\1jeecg-boot-github\\\\jeecgboot-vue3\n# Business package path\nbussi_package=org.jeecg.modules.demo\n\n#default code path\n#source_root_package=src\n#webroot_package=WebRoot\n\n#maven code path\nsource_root_package=src.main.java\nwebroot_package=src.main.webapp\n\n#ftl resource url\ntemplatepath=/jeecg/code-template\nsystem_encoding=utf-8\n\n#db Table id [User defined] \ndb_table_id=id\n\n#db convert flag[true/false]\ndb_filed_convert=true\n\n#page Search Field num [User defined]\npage_search_filed_num=1\n#page_filter_fields\npage_filter_fields=create_time,create_by,update_time,update_by\nexclude_table=act_,ext_act_,design_,onl_,sys_,qrtz_\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/jeecg/jeecg_database.properties",
    "content": "#mysql\ndiver_name=com.mysql.jdbc.Driver\nurl=jdbc:mysql://localhost:3306/jeecg-boot?useUnicode=true&characterEncoding=UTF-8\nusername=root\npassword=root\ndatabase_name=jeecg-boot\n\n#oracle\n#diver_name=oracle.jdbc.driver.OracleDriver\n#url=jdbc:oracle:thin:@192.168.1.200:1521:ORCL\n#username=scott\n#password=tiger\n#database_name=ORCL\n\n#postgre\n#diver_name=org.postgresql.Driver\n#url=jdbc:postgresql://localhost:5432/jeecg\n#username=postgres\n#password=postgres\n#database_name=jeecg\n#schemaName=public\n\n#SQLServer2005\\u4ee5\\u4e0a\n#diver_name=org.hibernate.dialect.SQLServerDialect\n#url=jdbc:sqlserver://192.168.1.200:1433;DatabaseName=jeecg\n#username=sa\n#password=SA\n#database_name=jeecg"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration debug=\"false\">\n\t<!--定义日志文件的存储地址 -->\n\t<property name=\"LOG_HOME\" value=\"../logs\" />\n\n\t<!--<property name=\"COLOR_PATTERN\" value=\"%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta( %replace(%caller{1}){'\\t|Caller.{1}0|\\r\\n', ''})- %gray(%msg%xEx%n)\" />-->\n\t<!-- 控制台输出 -->\n\t<appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n\t\t\t<!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符\n\t\t\t<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>-->\n\t\t\t<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}:%L) - %msg%n</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- 按照每天生成日志文件 -->\n\t<appender name=\"FILE\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy\">\n\t\t\t<!--日志文件输出的文件名 -->\n\t\t\t<FileNamePattern>${LOG_HOME}/jeecgboot-%d{yyyy-MM-dd}.%i.log</FileNamePattern>\n\t\t\t<!--日志文件保留天数 -->\n\t\t\t<MaxHistory>30</MaxHistory>\n\t\t\t<maxFileSize>10MB</maxFileSize>\n\t\t</rollingPolicy>\n\t\t<encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n\t\t\t<!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符 -->\n\t\t\t<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- 生成 error html格式日志开始 -->\n\t<appender name=\"HTML\" class=\"ch.qos.logback.core.FileAppender\">\n\t\t<filter class=\"ch.qos.logback.classic.filter.ThresholdFilter\">\n\t\t\t<!--设置日志级别,过滤掉info日志,只输入error日志-->\n\t\t\t<level>ERROR</level>\n\t\t</filter>\n\t\t<encoder class=\"ch.qos.logback.core.encoder.LayoutWrappingEncoder\">\n\t\t\t<layout class=\"ch.qos.logback.classic.html.HTMLLayout\">\n\t\t\t\t<pattern>%p%d%msg%M%F{32}%L</pattern>\n\t\t\t</layout>\n\t\t</encoder>\n\t\t<file>${LOG_HOME}/error-log.html</file>\n\t</appender>\n\t<!-- 生成 error html格式日志结束 -->\n\n\t<!-- 每天生成一个html格式的日志开始 -->\n\t<appender name=\"FILE_HTML\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy\">\n\t\t\t<!--日志文件输出的文件名 -->\n\t\t\t<FileNamePattern>${LOG_HOME}/jeecgboot-%d{yyyy-MM-dd}.%i.html</FileNamePattern>\n\t\t\t<!--日志文件保留天数 -->\n\t\t\t<MaxHistory>30</MaxHistory>\n\t\t\t<MaxFileSize>10MB</MaxFileSize>\n\t\t</rollingPolicy>\n\t\t<encoder class=\"ch.qos.logback.core.encoder.LayoutWrappingEncoder\">\n\t\t\t<layout class=\"ch.qos.logback.classic.html.HTMLLayout\">\n\t\t\t\t<pattern>%p%d%msg%M%F{32}%L</pattern>\n\t\t\t</layout>\n\t\t</encoder>\n\t</appender>\n\t<!-- 每天生成一个html格式的日志结束 -->\n\n\t<!--myibatis log configure -->\n\t<logger name=\"com.apache.ibatis\" level=\"TRACE\" />\n\t<logger name=\"java.sql.Connection\" level=\"DEBUG\" />\n\t<logger name=\"java.sql.Statement\" level=\"DEBUG\" />\n\t<logger name=\"java.sql.PreparedStatement\" level=\"DEBUG\" />\n\n\t<!-- 日志输出级别 -->\n\t<root level=\"INFO\">\n\t\t<appender-ref ref=\"STDOUT\" />\n\t\t\n\t\t<!-- 开发环境关闭日志生成，项目启动快；生产环境请按需打开注释\n\t\t<appender-ref ref=\"FILE\" />\n\t\t<appender-ref ref=\"HTML\" />\n\t\t<appender-ref ref=\"FILE_HTML\" />-->\n\t</root>\n\n</configuration>"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/TestMain.java",
    "content": "package org.jeecg;\n\nimport com.alibaba.fastjson.JSONObject;\nimport org.jeecg.common.util.RestUtil;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.http.HttpMethod;\nimport org.springframework.http.MediaType;\nimport org.springframework.http.ResponseEntity;\n\n/**\n * @Description: TODO\n * @author: scott\n * @date: 2022年05月10日 14:02\n */\npublic class TestMain {\n    public static void main(String[] args) {\n        // 请求地址\n        String url = \"https://api3.boot.jeecg.com/sys/user/list\";\n        // 请求 Header （用于传递Token）\n        HttpHeaders headers = getHeaders();\n        // 请求方式是 GET 代表获取数据\n        HttpMethod method = HttpMethod.GET;\n\n        //System.out.println(\"请求地址：\" + url);\n        //System.out.println(\"请求方式：\" + method);\n\n        // 利用 RestUtil 请求该url\n        ResponseEntity<JSONObject> result = RestUtil.request(url, method, headers, null, null, JSONObject.class);\n        if (result != null && result.getBody() != null) {\n            System.out.println(\"返回结果：\" + result.getBody().toJSONString());\n        } else {\n            System.out.println(\"查询失败\");\n        }\n    }\n    private static HttpHeaders getHeaders() {\n        String token = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.50h-g6INOZRVnznExiawFb1U6PPjcVVA4POeYRA5a5Q\";\n        System.out.println(\"请求Token：\" + token);\n\n        HttpHeaders headers = new HttpHeaders();\n        String mediaType = MediaType.APPLICATION_JSON_VALUE;\n        headers.setContentType(MediaType.parseMediaType(mediaType));\n        headers.set(\"Accept\", mediaType);\n        headers.set(\"X-Access-Token\", token);\n        return headers;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/message/test/SendMessageTest.java",
    "content": "package org.jeecg.modules.message.test;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.aliyuncs.exceptions.ClientException;\nimport org.jeecg.JeecgSystemApplication;\nimport org.jeecg.common.api.dto.message.BusMessageDTO;\nimport org.jeecg.common.api.dto.message.BusTemplateMessageDTO;\nimport org.jeecg.common.api.dto.message.MessageDTO;\nimport org.jeecg.common.api.dto.message.TemplateMessageDTO;\nimport org.jeecg.common.constant.CommonConstant;\nimport org.jeecg.common.constant.enums.DySmsEnum;\nimport org.jeecg.common.constant.enums.EmailTemplateEnum;\nimport org.jeecg.common.constant.enums.MessageTypeEnum;\nimport org.jeecg.common.constant.enums.SysAnnmentTypeEnum;\nimport org.jeecg.common.system.api.ISysBaseAPI;\nimport org.jeecg.common.util.DySmsHelper;\nimport org.junit.jupiter.api.Test;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * @Description: 消息推送测试\n * @Author: lsq\n */\n@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = JeecgSystemApplication.class)\npublic class SendMessageTest {\n\n    @Autowired\n    ISysBaseAPI sysBaseAPI;\n\n    /**\n     * 发送系统消息\n     */\n    @Test\n    public void sendSysAnnouncement() {\n        //发送人\n        String fromUser = \"admin\";\n        //接收人\n        String toUser = \"jeecg\";\n        //标题\n        String title = \"系统消息\";\n        //内容\n        String msgContent = \"TEST:今日份日程计划已送达！\";\n        //发送系统消息\n        sysBaseAPI.sendSysAnnouncement(new MessageDTO(fromUser, toUser, title, msgContent));\n        //消息类型\n        String msgCategory = CommonConstant.MSG_CATEGORY_1;\n        //业务类型\n        String busType = SysAnnmentTypeEnum.EMAIL.getType();\n        //业务ID\n        String busId = \"11111\";\n        //发送带业务参数的系统消息\n        BusMessageDTO busMessageDTO = new BusMessageDTO(fromUser, toUser, title, msgContent, msgCategory, busType,busId);\n        sysBaseAPI.sendBusAnnouncement(busMessageDTO);\n    }\n\n    /**\n     * 发送模版消息\n     */\n    @Test\n    public void sendTemplateAnnouncement() {\n        //发送人\n        String fromUser = \"admin\";\n        //接收人\n        String toUser = \"jeecg\";\n        //标题\n        String title = \"通知公告\";\n        //模版编码\n        String templateCode = \"412358\";\n        //模版参数\n        Map templateParam = new HashMap<>();\n        templateParam.put(\"realname\",\"JEECG用户\");\n        sysBaseAPI.sendTemplateAnnouncement(new TemplateMessageDTO(fromUser,toUser,title,templateParam,templateCode));\n        //业务类型\n        String busType = SysAnnmentTypeEnum.EMAIL.getType();\n        //业务ID\n        String busId = \"11111\";\n        //发送带业务参数的模版消息\n        BusTemplateMessageDTO busMessageDTO = new BusTemplateMessageDTO(fromUser, toUser, title, templateParam ,templateCode, busType,busId);\n        sysBaseAPI.sendBusTemplateAnnouncement(busMessageDTO);\n        //新发送模版消息\n        MessageDTO messageDTO = new MessageDTO();\n        messageDTO.setType(MessageTypeEnum.XT.getType());\n        messageDTO.setToAll(false);\n        messageDTO.setToUser(toUser);\n        messageDTO.setTitle(\"【流程错误】\");\n        messageDTO.setFromUser(\"admin\");\n        HashMap data = new HashMap<>();\n        data.put(CommonConstant.NOTICE_MSG_BUS_TYPE, \"msg_node\");\n        messageDTO.setData(data);\n        messageDTO.setContent(\"TEST:流程执行失败！任务节点未找到\");\n        sysBaseAPI.sendTemplateMessage(messageDTO);\n    }\n    /**\n     * 发送邮件\n     */\n    @Test\n    public void sendEmailMsg() {\n        String title = \"【日程提醒】您的日程任务即将开始\";\n        String content = \"TEST:尊敬的王先生，您购买的演唱会将于本周日10：08分在国家大剧院如期举行，届时请携带好您的门票和身份证到场\";\n        String email = \"250678106@qq.com\";\n        sysBaseAPI.sendEmailMsg(email,title,content);\n    }\n    /**\n     * 发送html模版邮件\n     */\n    @Test\n    public void sendTemplateEmailMsg() {\n        String title = \"收到一个催办\";\n        String email = \"250678106@qq.com\";\n        JSONObject params = new JSONObject();\n        params.put(\"bpm_name\",\"高级设置\");\n        params.put(\"bpm_task\",\"审批人\");\n        params.put(\"datetime\",\"2023-10-07 18:00:49\");\n        params.put(\"url\",\"http://boot3.jeecg.com/message/template\");\n        params.put(\"remark\",\"快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点\");\n        sysBaseAPI.sendHtmlTemplateEmail(email,title, EmailTemplateEnum.BPM_CUIBAN_EMAIL,params);\n    }\n    /**\n     * 发送短信\n     */\n    @Test\n    public void sendSms() throws ClientException {\n        //手机号\n        String mobile = \"159***\";\n        //消息模版\n        DySmsEnum templateCode = DySmsEnum.LOGIN_TEMPLATE_CODE;\n        //模版所需参数\n        JSONObject obj = new JSONObject();\n        obj.put(\"code\", \"4XDP\");\n        DySmsHelper.sendSms(mobile, obj, templateCode);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/openapi/test/SampleOpenApiTest.java",
    "content": "package org.jeecg.modules.openapi.test;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONObject;\nimport org.apache.http.HttpEntity;\nimport org.apache.http.client.methods.CloseableHttpResponse;\nimport org.apache.http.client.methods.HttpGet;\nimport org.apache.http.impl.client.CloseableHttpClient;\nimport org.apache.http.impl.client.HttpClients;\nimport org.apache.http.util.EntityUtils;\nimport org.junit.jupiter.api.Test;\n\nimport java.security.MessageDigest;\n\n\npublic class SampleOpenApiTest {\n    private final String base_url = \"http://localhost:8080/jeecg-boot\";\n    private final String appKey = \"ak-pFjyNHWRsJEFWlu6\";\n    private final String searchKey = \"4hV5dBrZtmGAtPdbA5yseaeKRYNpzGsS\";\n    \n    @Test\n    public void test() throws Exception {\n        // 根据部门ID查询用户\n        String url = base_url+\"/openapi/call/TEwcXBlr?id=c6d7cb4deeac411cb3384b1b31278596\";\n        JSONObject header = genTimestampAndSignature();\n        HttpGet httpGet = new HttpGet(url);\n        // 设置请求头\n        httpGet.setHeader(\"Content-Type\", \"application/json\");\n        httpGet.setHeader(\"appkey\",appKey);\n        httpGet.setHeader(\"signature\",header.get(\"signature\").toString());\n        httpGet.setHeader(\"timestamp\",header.get(\"timestamp\").toString());\n        try (CloseableHttpClient httpClient = HttpClients.createDefault();\n             CloseableHttpResponse response = httpClient.execute(httpGet);) {\n            // 获取响应状态码\n            int statusCode = response.getStatusLine().getStatusCode();\n            System.out.println(\"[debug] 响应状态码: \" + statusCode);\n\n            HttpEntity entity = response.getEntity();\n            System.out.println(entity);\n            // 获取响应内容\n            String responseBody = EntityUtils.toString(response.getEntity());\n            System.out.println(\"[debug] 响应内容: \" + responseBody);\n\n            // 解析JSON响应\n            JSONObject res = JSON.parseObject(responseBody);\n            //错误日志判断\n            if(res.containsKey(\"success\")){\n                Boolean success = res.getBoolean(\"success\");\n                if(success){\n                    System.out.println(\"[info] 调用成功： \" + res.toJSONString());  \n                }else{\n                    System.out.println(\"[error] 调用失败： \" + res.getString(\"message\"));\n                }\n            }else{\n                System.out.println(\"[error] 调用失败： \" + res.getString(\"message\"));\n            }\n        }\n\n    }\n    private JSONObject genTimestampAndSignature(){\n        JSONObject jsonObject = new JSONObject();\n        long timestamp = System.currentTimeMillis();\n        jsonObject.put(\"timestamp\",timestamp);\n        jsonObject.put(\"signature\", md5(appKey + searchKey + timestamp));\n        return jsonObject;\n    }\n\n    /**\n     * 生成md5\n     * @param sourceStr\n     * @return\n     */\n    protected String md5(String sourceStr) {\n        String result = \"\";\n        try {\n            MessageDigest md = MessageDigest.getInstance(\"MD5\");\n            md.update(sourceStr.getBytes(\"utf-8\"));\n            byte[] hash = md.digest();\n            int i;\n            StringBuffer buf = new StringBuffer(32);\n            for (int offset = 0; offset < hash.length; offset++) {\n                i = hash[offset];\n                if (i < 0) {\n                    i += 256;\n                }\n                if (i < 16) {\n                    buf.append(\"0\");\n                }\n                buf.append(Integer.toHexString(i));\n            }\n            result = buf.toString();\n        } catch (Exception e) {\n            throw new RuntimeException(\"sign签名错误\", e);\n        }\n        return result;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/MockControllerTest.java",
    "content": "package org.jeecg.modules.system.test;\n\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.jeecg.modules.base.service.BaseCommonService;\nimport org.jeecg.modules.demo.mock.MockController;\nimport org.junit.jupiter.api.Test;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;\nimport org.springframework.boot.test.mock.mockito.MockBean;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.result.MockMvcResultHandlers;\nimport org.springframework.test.web.servlet.result.MockMvcResultMatchers;\n\nimport static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;\n\n/**\n * 单个controller测试\n * @date 2025/4/7 11:21\n */\n@WebMvcTest(value = MockController.class)\npublic class MockControllerTest {\n    @Autowired\n    private MockMvc mockMvc;\n\n    @MockBean\n    private BaseCommonService baseCommonService;\n    @MockBean\n    private JeecgBaseConfig jeecgBaseConfig;\n\n    @Test\n    public void testSave() throws Exception {\n        mockMvc.perform(get(\"/mock/api/json/area\"))\n                .andDo(MockMvcResultHandlers.print())\n                .andExpect(MockMvcResultMatchers.status().isOk());\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/SampleTest.java",
    "content": "package org.jeecg.modules.system.test;\n\nimport jakarta.annotation.Resource;\nimport org.jeecg.JeecgSystemApplication;\nimport org.jeecg.modules.demo.mock.MockController;\nimport org.jeecg.modules.demo.test.entity.JeecgDemo;\nimport org.jeecg.modules.demo.test.mapper.JeecgDemoMapper;\nimport org.jeecg.modules.demo.test.service.IJeecgDemoService;\nimport org.jeecg.modules.system.service.ISysDataLogService;\nimport org.junit.jupiter.api.Test;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.util.Assert;\nimport java.util.List;\n\n@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,classes = JeecgSystemApplication.class)\npublic class SampleTest {\n\n\t@Resource\n\tprivate JeecgDemoMapper jeecgDemoMapper;\n\t@Resource\n\tprivate IJeecgDemoService jeecgDemoService;\n\t@Resource\n\tprivate ISysDataLogService sysDataLogService;\n\t@Resource\n\tprivate MockController mock;\n\n\t@Test\n\tpublic void testSelect() {\n\t\tSystem.out.println((\"----- selectAll method test ------\"));\n\t\tList<JeecgDemo> userList = jeecgDemoMapper.selectList(null);\n\t\tAssert.isTrue(15==userList.size(),\"结果不是5条\");\n\t\tuserList.forEach(System.out::println);\n\t}\n\n\t@Test\n\tpublic void testXmlSql() {\n\t\tSystem.out.println((\"----- selectAll method test ------\"));\n\t\tList<JeecgDemo> userList = jeecgDemoMapper.getDemoByName(\"Sandy12\");\n\t\tuserList.forEach(System.out::println);\n\t}\n\n\t/**\n\t * 测试事务\n\t */\n\t@Test\n\tpublic void testTran() {\n\t\tjeecgDemoService.testTran();\n\t}\n\n\t/**\n\t * 测试数据日志添加\n\t */\n\t@Test\n\tpublic void testDataLogSave() {\n\t\tSystem.out.println((\"----- datalog test ------\"));\n\t\tString tableName = \"jeecg_demo\";\n\t\tString dataId = \"4028ef81550c1a7901550c1cd6e70001\";\n\t\tString dataContent = mock.sysDataLogJson();\n\t\tsysDataLogService.addDataLog(tableName, dataId, dataContent);\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/SysTableWhiteCheckTest.java",
    "content": "package org.jeecg.modules.system.test;\n\nimport org.aspectj.lang.annotation.Before;\nimport org.jeecg.JeecgSystemApplication;\nimport org.jeecg.common.system.api.ISysBaseAPI;\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.jeecg.config.firewall.SqlInjection.IDictTableWhiteListHandler;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.Test;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\n\n/**\n * @Description: 系统表白名单测试\n * @Author: sunjianlei\n */\n@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = JeecgSystemApplication.class)\npublic class SysTableWhiteCheckTest {\n\n    @Autowired\n    IDictTableWhiteListHandler whiteListHandler;\n    @Autowired\n    ISysBaseAPI sysBaseAPI;\n\n    @Autowired\n    JeecgBaseConfig jeecgBaseConfig;\n\n    @BeforeEach\n    public void before() {\n        String lowCodeMode = this.jeecgBaseConfig.getFirewall().getLowCodeMode();\n        System.out.println(\"当前 LowCode 模式为: \" + lowCodeMode);\n        // 清空缓存，防止影响测试\n        whiteListHandler.clear();\n    }\n\n    @Test\n    public void testSql() {\n        System.out.println(\"=== 开始测试 SQL 方式 ===\");\n        String[] sqlArr = new String[]{\n                \"select username from sys_user\",\n                \"select username, CONCAT(realname, SEX) from SYS_USER\",\n                \"select username, CONCAT(realname, sex) from sys_user\",\n        };\n        for (String sql : sqlArr) {\n            System.out.println(\"- 测试Sql: \" + sql);\n            try {\n                sysBaseAPI.dictTableWhiteListCheckBySql(sql);\n                System.out.println(\"-- 测试通过\");\n            } catch (Exception e) {\n                System.out.println(\"-- 测试未通过: \" + e.getMessage());\n            }\n        }\n        System.out.println(\"=== 结束测试 SQL 方式 ===\");\n    }\n\n    @Test\n    public void testDict() {\n        System.out.println(\"=== 开始测试 DICT 方式 ===\");\n\n        String table = \"sys_user\";\n        String code = \"username\";\n        String text = \"realname\";\n        this.testDict(table, code, text);\n\n        table = \"sys_user\";\n        code = \"username\";\n        text = \"CONCAT(realname, sex)\";\n        this.testDict(table, code, text);\n\n        table = \"SYS_USER\";\n        code = \"username\";\n        text = \"CONCAT(realname, SEX)\";\n        this.testDict(table, code, text);\n\n        System.out.println(\"=== 结束测试 DICT 方式 ===\");\n    }\n\n    private void testDict(String table, String code, String text) {\n        try {\n            sysBaseAPI.dictTableWhiteListCheckByDict(table, code, text);\n            System.out.println(\"- 测试通过\");\n        } catch (Exception e) {\n            System.out.println(\"- 测试未通过: \" + e.getMessage());\n        }\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/system/test/SysUserApiTest.java",
    "content": "package org.jeecg.modules.system.test;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.modules.redis.client.JeecgRedisClient;\nimport org.jeecg.common.util.RedisUtil;\nimport org.jeecg.config.JeecgBaseConfig;\nimport org.jeecg.modules.base.service.BaseCommonService;\nimport org.jeecg.modules.system.controller.SysUserController;\nimport org.jeecg.modules.system.entity.SysUser;\nimport org.jeecg.modules.system.service.*;\nimport org.junit.jupiter.api.Assertions;\nimport org.junit.jupiter.api.Test;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;\nimport org.springframework.boot.test.mock.mockito.MockBean;\nimport org.springframework.http.MediaType;\nimport org.springframework.test.web.servlet.MockMvc;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.BDDMockito.given;\nimport static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;\n\n/**\n * 系统用户单元测试\n */\n@WebMvcTest(SysUserController.class)\npublic class SysUserApiTest {\n\n    @Autowired\n    private MockMvc mockMvc;\n\n    @MockBean\n    private ISysUserService sysUserService;\n\n    @MockBean\n    private ISysDepartService sysDepartService;\n\n    @MockBean\n    private ISysUserRoleService sysUserRoleService;\n\n    @MockBean\n    private ISysUserDepartService sysUserDepartService;\n\n    @MockBean\n    private ISysDepartRoleUserService departRoleUserService;\n\n    @MockBean\n    private ISysDepartRoleService departRoleService;\n\n    @MockBean\n    private RedisUtil redisUtil;\n\n    @Value(\"${jeecg.path.upload}\")\n    private String upLoadPath;\n\n    @MockBean\n    private BaseCommonService baseCommonService;\n\n    @MockBean\n    private ISysPositionService sysPositionService;\n\n    @MockBean\n    private ISysUserTenantService userTenantService;\n\n    @MockBean\n    private JeecgRedisClient jeecgRedisClient;\n\n    @MockBean\n    private JeecgBaseConfig jeecgBaseConfig;\n    /**\n     * 测试地址：实际使用时替换成你自己的地址\n     */\n    private final String BASE_URL = \"/sys/user/\";\n\n    /**\n     * 测试用例：查询记录\n     */\n    @Test\n    public void testQuery() throws Exception{\n        // 请求地址\n        String url = BASE_URL + \"list\";\n\n        Page<SysUser> sysUserPage = new Page<>();\n        SysUser sysUser = new SysUser();\n        sysUser.setUsername(\"admin\");\n        List<SysUser> users = new ArrayList<>();\n        users.add(sysUser);\n        sysUserPage.setRecords(users);\n        sysUserPage.setCurrent(1);\n        sysUserPage.setSize(10);\n        sysUserPage.setTotal(1);\n\n        given(this.sysUserService.queryPageList(any(), any(), any(), any())).willReturn(Result.OK(sysUserPage));\n\n        String result = mockMvc.perform(get(url)).andReturn().getResponse().getContentAsString();\n        JSONObject jsonObject = JSON.parseObject(result);\n        Assertions.assertEquals(\"admin\", jsonObject.getJSONObject(\"result\").getJSONArray(\"records\").getJSONObject(0).getString(\"username\"));\n    }\n\n    /**\n     * 测试用例：新增\n     */\n    @Test\n    public void testAdd() throws Exception {\n        // 请求地址\n        String url = BASE_URL + \"add\" ;\n\n        JSONObject params = new JSONObject();\n        params.put(\"username\", \"wangwuTest\");\n        params.put(\"password\", \"123456\");\n        params.put(\"confirmpassword\",\"123456\");\n        params.put(\"realname\", \"单元测试\");\n        params.put(\"activitiSync\", \"1\");\n        params.put(\"userIdentity\",\"1\");\n        params.put(\"workNo\",\"0025\");\n\n        String result = mockMvc.perform(post(url).contentType(MediaType.APPLICATION_JSON_VALUE).content(params.toJSONString()))\n                .andReturn().getResponse().getContentAsString();\n        JSONObject jsonObject = JSON.parseObject(result);\n        Assertions.assertTrue(jsonObject.getBoolean(\"success\"));\n    }\n\n\n    /**\n     * 测试用例：修改\n     */\n    @Test\n    public void testEdit() throws Exception {\n        // 数据Id\n        String dataId = \"1331795062924374018\";\n        // 请求地址\n        String url = BASE_URL + \"edit\";\n\n        JSONObject params = new JSONObject();\n        params.put(\"username\", \"wangwuTest\");\n        params.put(\"realname\", \"单元测试1111\");\n        params.put(\"activitiSync\", \"1\");\n        params.put(\"userIdentity\",\"1\");\n        params.put(\"workNo\",\"0025\");\n        params.put(\"id\",dataId);\n\n        SysUser sysUser = new SysUser();\n        sysUser.setUsername(\"admin\");\n\n        given(this.sysUserService.getById(any())).willReturn(sysUser);\n\n        String result = mockMvc.perform(put(url).contentType(MediaType.APPLICATION_JSON_VALUE).content(params.toJSONString()))\n                .andReturn().getResponse().getContentAsString();\n        JSONObject jsonObject = JSON.parseObject(result);\n        Assertions.assertTrue(jsonObject.getBoolean(\"success\"));\n    }\n\n\n    /**\n     * 测试用例：删除\n     */\n    @Test\n    public void testDelete() throws Exception {\n        // 数据Id\n        String dataId = \"1331795062924374018\";\n        // 请求地址\n        String url = BASE_URL + \"delete\" + \"?id=\" + dataId;\n        String result = mockMvc.perform(delete(url)).andReturn().getResponse().getContentAsString();\n        JSONObject jsonObject = JSON.parseObject(result);\n        Assertions.assertTrue(jsonObject.getBoolean(\"success\"));\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/smallTools/TestSqlHandle.java",
    "content": "package org.jeecg.smallTools;\n\n\nimport org.junit.jupiter.api.Test;\n\n/**\n * 测试sql分割、替换等操作\n * \n * @author: scott\n * @date: 2023年09月05日 16:13\n */\npublic class TestSqlHandle {\n\n    /**\n     * Where 分割测试\n     */\n    @Test\n    public void testSqlSplitWhere() {\n        String tableFilterSql = \" select * from data.sys_user Where name='12312' and age>100\";\n        String[] arr = tableFilterSql.split(\" (?i)where \");\n        for (String sql : arr) {\n            System.out.println(\"sql片段：\" + sql);\n        }\n    }\n\n\n    /**\n     * Where 替换\n     */\n    @Test\n    public void testSqlWhereReplace() {\n        String input = \" Where name='12312' and age>100\";\n        String pattern = \"(?i)where \"; // (?i) 表示不区分大小写\n\n        String replacedString = input.replaceAll(pattern, \"\");\n\n        System.out.println(\"替换前的字符串：\" + input);\n        System.out.println(\"替换后的字符串：\" + replacedString);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/smallTools/TestStr.java",
    "content": "package org.jeecg.smallTools;\n\nimport com.alibaba.fastjson.JSONArray;\nimport org.apache.commons.lang3.StringUtils;\nimport org.jeecg.common.util.DateUtils;\nimport org.junit.jupiter.api.Test;\n\nimport java.text.MessageFormat;\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.time.LocalTime;\nimport java.time.ZoneId;\nimport java.util.Arrays;\nimport java.util.Base64;\nimport java.util.Date;\n\n/**\n * 字符串处理测试\n *\n * @author: scott\n * @date: 2023年03月30日 15:27\n */\npublic class TestStr {\n\n    /**\n     * 测试参数格式化的问题，数字值有问题\n     */\n    @Test\n    public void testParameterFormat() {\n        String url = \"/pages/lowApp/process/taskDetail?tenantId={0}&procInsId={1}&taskId={2}&taskDefKey={3}\";\n        String cc = MessageFormat.format(url, \"6364\", \"111\", \"22\", \"333\");\n        System.out.println(\"参数是字符串：\" + cc);\n\n        String cc2 = MessageFormat.format(url, 6364, 111, 22, 333);\n        System.out.println(\"参数是数字（出问题）：\" + cc2);\n    }\n\n\n    @Test\n    public void testStringSplitError() {\n        String conditionValue = \"qweqwe\";\n        String[] conditionValueArray = conditionValue.split(\",\");\n        System.out.println(\"length = \"+ conditionValueArray.length);\n        Arrays.stream(conditionValueArray).forEach(System.out::println);\n    }\n    \n    \n    @Test\n    public void getThisDate() {\n        LocalDate d = DateUtils.getLocalDate();\n        System.out.println(d); \n    }\n    \n    \n    @Test\n    public void firstDayOfLastSixMonths() {\n        LocalDate today = LocalDate.now(); // 获取当前日期\n        LocalDate firstDayOfLastSixMonths = today.minusMonths(6).withDayOfMonth(1); // 获取近半年的第一天\n        LocalDateTime firstDateTime = LocalDateTime.of(firstDayOfLastSixMonths, LocalTime.MIN); // 设置时间为当天的最小时间（00:00:00）\n        Date date = Date.from(firstDateTime.atZone(ZoneId.systemDefault()).toInstant()); // 将 LocalDateTime 转换为 Date\n        System.out.println(\"近半年的第一天的 00:00:00 时间戳：\" + date);\n    }\n\n    @Test\n    public void testJSONArrayJoin() {\n        JSONArray valArray = new JSONArray();\n        valArray.add(\"123\");\n        valArray.add(\"qwe\");\n        System.out.println(\"值: \" + StringUtils.join(valArray, \",\"));\n    }\n    \n    @Test\n    public void testSql() {\n        String sql = \"select * from sys_user where sex = ${sex}\";\n        sql = sql.replaceAll(\"'?\\\\$\\\\{sex}'?\",\"1\");\n        System.out.println(sql);\n    }\n\n    @Test\n    public void base64(){\n        String encodedString = \"5L+d5a2Y5aSx6LSl77yM5YWN6LS554mI5pyA5aSa5Yib5bu6ezB95p2h6L+e5o6l77yM6K+35Y2H57qn5ZWG5Lia54mI77yB\";\n        byte[] decodedBytes = Base64.getDecoder().decode(encodedString);\n        String decodedString = new String(decodedBytes);\n        String tipMsg = MessageFormat.format(decodedString, 10);\n        System.out.println(tipMsg);\n    }\n\n    /**\n     * 正则测试字符串只保存中文和数字和字母\n     */\n    @Test\n    public void testSpecialChar() {\n        String str = \"Hello, World! 你好！这是一段特殊符号的测试，This is__ a test string with special characters: @#$%^&*\";\n        // 使用正则表达式替换特殊字符\n        String replacedStr = str.replaceAll(\"[^a-zA-Z0-9\\\\u4e00-\\\\u9fa5]\", \"\");\n        System.out.println(\"Replaced String: \" + replacedStr);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-module-system/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-boot-parent</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>jeecg-module-system</artifactId>\n    <packaging>pom</packaging>\n\n    <modules>\n        <module>jeecg-system-api</module>\n        <module>jeecg-system-biz</module>\n        <module>jeecg-system-start</module>\n    </modules>\n\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/docker-compose.yml",
    "content": "version: '2'\nservices:\n  jeecg-boot-mysql:\n    build:\n      context: ../db\n    environment:\n      MYSQL_ROOT_PASSWORD: root\n      MYSQL_ROOT_HOST: '%'\n      TZ: Asia/Shanghai\n    restart: always\n    container_name: jeecg-boot-mysql\n    command:\n      --character-set-server=utf8mb4\n      --collation-server=utf8mb4_general_ci\n      --explicit_defaults_for_timestamp=true\n      --lower_case_table_names=1\n      --max_allowed_packet=128M\n      --default-authentication-plugin=caching_sha2_password\n    ports:\n      - 3306:3306\n    networks:\n      - jeecg-boot\n\n  jeecg-boot-redis:\n    image: registry.cn-hangzhou.aliyuncs.com/jeecgdocker/redis:5.0\n    ports:\n      - 6379:6379\n    restart: always\n    container_name: jeecg-boot-redis\n    hostname: jeecg-boot-redis\n    networks:\n      - jeecg-boot\n\n#  jeecg-boot-rabbitmq:\n#    image: rabbitmq:3.7.7-management\n#    ports:\n#      - 5672:5672\n#      - 15672:15672\n#    restart: always\n#    container_name: jeecg-boot-rabbitmq\n#    hostname: jeecg-boot-rabbitmq\n#    environment:\n#      RABBITMQ_DEFAULT_USER: guest\n#      RABBITMQ_DEFAULT_PASS: guest\n\n\n  jeecg-boot-nacos:\n    restart: always\n    build:\n      context: ./jeecg-cloud-nacos\n    ports:\n      - 8848:8848\n    container_name: jeecg-boot-nacos\n    hostname: jeecg-boot-nacos\n    networks:\n      - jeecg-boot\n\n  jeecg-boot-system:\n    depends_on:\n      - jeecg-boot-nacos\n    build:\n      context: ./jeecg-system-cloud-start\n    container_name: jeecg-system-start\n    hostname: jeecg-boot-system\n    restart: on-failure\n    environment:\n      - TZ=Asia/Shanghai\n    networks:\n      - jeecg-boot\n\n  jeecg-boot-demo:\n    depends_on:\n      - jeecg-boot-nacos\n    build:\n      context: ./jeecg-demo-cloud-start\n    container_name: jeecg-demo-start\n    hostname: jeecg-boot-demo\n    restart: on-failure\n    environment:\n      - TZ=Asia/Shanghai\n    networks:\n      - jeecg-boot\n\n  jeecg-boot-gateway:\n    restart: on-failure\n    build:\n      context: ./jeecg-cloud-gateway\n    ports:\n      - 9999:9999\n    depends_on:\n      - jeecg-boot-nacos\n      - jeecg-boot-system\n    container_name: jeecg-boot-gateway\n    hostname: jeecg-boot-gateway\n    networks:\n      - jeecg-boot\n\nnetworks:\n  jeecg-boot:\n    name: jeecg_boot\n\n#  jeecg-boot-sentinel:\n#    restart: on-failure\n#    build:\n#      context: ./jeecg-visual/jeecg-cloud-sentinel\n#    ports:\n#      - 9000:9000\n#    depends_on:\n#      - jeecg-boot-nacos\n#      - jeecg-boot-demo\n#      - jeecg-boot-system\n#      - jeecg-boot-gateway\n#    container_name: jeecg-boot-sentinel\n#    hostname: jeecg-boot-sentinel\n#\n#  jeecg-boot-xxljob:\n#    build:\n#      context: ./jeecg-visual/jeecg-cloud-xxljob\n#    ports:\n#      - 9080:9080\n#    container_name: jeecg-boot-xxljob\n#    hostname: jeecg-boot-xxljob\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/Dockerfile",
    "content": "FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:17-anolis\n\nMAINTAINER jeecgos@163.com\n\nRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime\n\nRUN mkdir -p /jeecg-cloud-gateway\n\nWORKDIR /jeecg-cloud-gateway\n\nEXPOSE 9999\n\nADD ./target/jeecg-cloud-gateway-3.9.1.jar ./\n\nCMD sleep 100;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-gateway-3.9.1.jar"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/README.md",
    "content": "http://localhost:9999\n\n提示：在未启动服务实例情况下，看的接口文档为空"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-server-cloud</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n    <artifactId>jeecg-cloud-gateway</artifactId>\n\n    <dependencies>\n        <!-- jeecg 微服务基础依赖-->\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-boot-starter-cloud</artifactId>\n            <exclusions>\n                <exclusion>\n                    <groupId>org.jeecgframework.boot3</groupId>\n                    <artifactId>jeecg-system-cloud-api</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <!-- Gateway网关依赖,内置webflux-->\n        <dependency>\n            <groupId>org.springframework.cloud</groupId>\n            <artifactId>spring-cloud-starter-gateway-server-webflux</artifactId>\n        </dependency>\n        <!-- redis方式限流 -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>\n        </dependency>\n\n        <!--sentinel 限流熔点降级-->\n        <dependency>\n            <groupId>com.alibaba.cloud</groupId>\n            <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>com.alibaba.cloud</groupId>\n            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>\n            <exclusions>\n                <exclusion>\n                    <artifactId>fastjson</artifactId>\n                    <groupId>com.alibaba</groupId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <!-- sentinel集成nacos作为数据源 -->\n        <dependency>\n            <groupId>com.alibaba.csp</groupId>\n            <artifactId>sentinel-datasource-nacos</artifactId>\n        </dependency>\n        <!--- sentinel流控链路不生效 -->\n        <!--<dependency>\n            <groupId>com.alibaba.csp</groupId>\n            <artifactId>sentinel-web-servlet</artifactId>\n        </dependency>-->\n\n\n        <!--健康监控-->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-actuator</artifactId>\n        </dependency>\n\n        <!-- Swagger API文档 -->\n        <dependency>\n            <groupId>com.github.xiaoymin</groupId>\n            <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>\n            <version>${knife4j-spring-boot-starter.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-lang3</artifactId>\n            <version>3.18.0</version>\n        </dependency>\n    </dependencies>\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n        <resources>\n            <resource>\n                <directory>src/main/resources</directory>\n                <filtering>true</filtering>\n            </resource>\n        </resources>\n    </build>\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/JeecgGatewayApplication.java",
    "content": "package org.jeecg;\n\nimport org.jeecg.loader.DynamicRouteLoader;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.cloud.openfeign.EnableFeignClients;\nimport org.springframework.context.ConfigurableApplicationContext;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.reactive.function.server.RouterFunction;\nimport org.springframework.web.reactive.function.server.ServerResponse;\n\nimport jakarta.annotation.Resource;\n\nimport static org.springframework.web.reactive.function.server.RequestPredicates.GET;\nimport static org.springframework.web.reactive.function.server.RouterFunctions.route;\nimport static org.springframework.web.reactive.function.server.ServerResponse.ok;\n\n/**\n * @author jeecg\n */\n@EnableFeignClients\n@EnableDiscoveryClient\n@SpringBootApplication\npublic class JeecgGatewayApplication  implements CommandLineRunner {\n    @Resource\n    private DynamicRouteLoader dynamicRouteLoader;\n\n    public static void main(String[] args) {\n        ConfigurableApplicationContext applicationContext = SpringApplication.run(JeecgGatewayApplication.class, args);\n        //String userName = applicationContext.getEnvironment().getProperty(\"jeecg.test\");\n        //System.err.println(\"user name :\" +userName);\n    }\n\n    /**\n     * 容器初始化后加载路由\n     * @param strings\n     */\n    @Override\n    public void run(String... strings) {\n        dynamicRouteLoader.refresh(null);\n    }\n\n    /**\n     * 接口地址（通过9999端口直接访问）\n     * 已使用knife4j-gateway支持该功能\n     * @param indexHtml\n     * @return\n     */\n    @Bean\n    public RouterFunction<ServerResponse> indexRouter(@Value(\"classpath:/META-INF/resources/doc.html\") final org.springframework.core.io.Resource indexHtml) {\n        return route(GET(\"/\"), request -> ok().contentType(MediaType.TEXT_HTML).syncBody(indexHtml));\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/config/GatewayRoutersConfig.java",
    "content": "package org.jeecg.config;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.cloud.context.config.annotation.RefreshScope;\nimport org.springframework.context.annotation.Configuration;\n\n/**\n * @author scott\n * @date 2020/05/26\n * 路由配置信息\n */\n@Configuration\n@RefreshScope\npublic class GatewayRoutersConfig {\n    /**\n     * 路由配置方式：database，yml，nacos\n     */\n    public String dataType;\n    public String serverAddr;\n    public String namespace;\n    public String dataId;\n    public String routeGroup;\n    public String username;\n    public String password;\n\n    @Value(\"${jeecg.route.config.data-type:#{null}}\")\n    public void setDataType(String dataType) {\n        this.dataType = dataType;\n    }\n    \n    @Value(\"${jeecg.route.config.data-id:#{null}}\")\n    public void setRouteDataId(String dataId) {\n        this.dataId = dataId + \".json\";\n    }\n\n    @Value(\"${spring.cloud.nacos.config.group:DEFAULT_GROUP:#{null}}\")\n    public void setRouteGroup(String routeGroup) {\n        this.routeGroup = routeGroup;\n    }\n\n    @Value(\"${spring.cloud.nacos.discovery.server-addr}\")\n    public void setServerAddr(String serverAddr) {\n        this.serverAddr = serverAddr;\n    }\n\n    @Value(\"${spring.cloud.nacos.config.namespace:#{null}}\")\n    public void setNamespace(String namespace) {\n        this.namespace = namespace;\n    }\n\n    @Value(\"${spring.cloud.nacos.config.username:#{null}}\")\n    public void setUsername(String username) {\n        this.username = username;\n    }\n\n    @Value(\"${spring.cloud.nacos.config.password:#{null}}\")\n    public void setPassword(String password) {\n        this.password = password;\n    }\n\n    public String getDataType() {\n        return dataType;\n    }\n\n    public String getServerAddr() {\n        return serverAddr;\n    }\n\n    public String getNamespace() {\n        return namespace;\n    }\n\n    public String getDataId() {\n        return dataId;\n    }\n\n    public String getRouteGroup() {\n        return routeGroup;\n    }\n\n    public String getUsername() {\n        return username;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/config/RateLimiterConfiguration.java",
    "content": "package org.jeecg.config;\n\nimport org.jeecg.filter.GlobalAccessTokenFilter;\nimport org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\nimport reactor.core.publisher.Mono;\n\n/**\n * @author scott\n * @date 2020/5/26\n * 路由限流配置\n */\n@Configuration\npublic class RateLimiterConfiguration {\n    /**\n     * IP限流 (通过exchange对象可以获取到请求信息，这边用了HostName)\n     */\n    @Bean\n    @Primary\n    public KeyResolver ipKeyResolver() {\n        return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());\n    }\n\n    /**\n     * 用户限流 (通过exchange对象可以获取到请求信息，获取当前请求的用户 TOKEN)\n     */\n    @Bean\n    public KeyResolver userKeyResolver() {\n        //使用这种方式限流，请求Header中必须携带X-Access-Token参数\n        return exchange -> Mono.just(exchange.getRequest().getHeaders().getFirst(GlobalAccessTokenFilter.X_ACCESS_TOKEN));\n    }\n\n    /**\n     * 接口限流 (获取请求地址的uri作为限流key)\n     */\n    @Bean\n    public KeyResolver apiKeyResolver() {\n        return exchange -> Mono.just(exchange.getRequest().getPath().value());\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/config/RouterDataType.java",
    "content": "package org.jeecg.config;\n\n/**\n * nocos配置方式枚举\n * @author zyf\n * @date: 2022/4/21 10:55\n */\npublic enum RouterDataType {\n    /**\n     * 数据库加载路由配置\n     */\n    database,\n    /**\n     * 本地yml加载路由配置\n     */\n    yml,\n    /**\n     * nacos加载路由配置\n     */\n    nacos\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/fallback/FallbackController.java",
    "content": "//package org.jeecg.fallback;\n//\n//import org.springframework.web.bind.annotation.RequestMapping;\n//import org.springframework.web.bind.annotation.RestController;\n//import reactor.core.publisher.Mono;\n//\n///**\n// * 响应超时熔断处理器【升级springboot2.6.6后，此类作废】\n// *\n// * @author zyf\n// */\n//@RestController\n//public class FallbackController {\n//\n//    /**\n//     * 全局熔断处理\n//     * @return\n//     */\n//    @RequestMapping(\"/fallback\")\n//    public Mono<String> fallback() {\n//        return Mono.just(\"访问超时，请稍后再试!\");\n//    }\n//\n//    /**\n//     * demo熔断处理\n//     * @return\n//     */\n//    @RequestMapping(\"/demo/fallback\")\n//    public Mono<String> fallback2() {\n//        return Mono.just(\"访问超时，请稍后再试!\");\n//    }\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/fallback/HystrixFallbackHandler.java",
    "content": "//package org.jeecg.fallback;\n//\n//import lombok.extern.slf4j.Slf4j;\n//import org.springframework.http.HttpStatus;\n//import org.springframework.stereotype.Component;\n//import org.springframework.web.reactive.function.BodyInserters;\n//import org.springframework.web.reactive.function.server.HandlerFunction;\n//import org.springframework.web.reactive.function.server.ServerRequest;\n//import org.springframework.web.reactive.function.server.ServerResponse;\n//import reactor.core.publisher.Mono;\n//\n//import java.util.Optional;\n//\n//import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR;\n//\n///**\n// * @author scott\n// * @date 2020/05/26\n// * Hystrix 降级处理\n// */\n//@Slf4j\n//@Component\n//public class HystrixFallbackHandler implements HandlerFunction<ServerResponse> {\n//    @Override\n//    public Mono<ServerResponse> handle(ServerRequest serverRequest) {\n//        Optional<Object> originalUris = serverRequest.attribute(GATEWAY_ORIGINAL_REQUEST_URL_ATTR);\n//\n//        originalUris.ifPresent(originalUri -> log.error(\"网关执行请求:{}失败,hystrix服务降级处理\", originalUri));\n//\n//        return ServerResponse.status(HttpStatus.INTERNAL_SERVER_ERROR.value())\n//                .header(\"Content-Type\",\"text/plain; charset=utf-8\").body(BodyInserters.fromObject(\"访问超时,请稍后再试\"));\n//    }\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/fallback/sentinel/GatewaySentinelExceptionConfig.java",
    "content": "package org.jeecg.fallback.sentinel;\n\nimport cn.hutool.core.util.ObjectUtil;\nimport com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;\nimport com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;\nimport org.jeecg.common.enums.SentinelErrorInfoEnum;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.reactive.function.BodyInserters;\nimport org.springframework.web.reactive.function.server.ServerResponse;\n\nimport jakarta.annotation.PostConstruct;\nimport java.util.HashMap;\n\n/**\n * @Description: 自定义Sentinel全局异常(需要启动Sentinel客户端)\n * @author: zyf\n * @date: 2022/02/18\n * @version: V1.0\n */\n@Configuration\npublic class GatewaySentinelExceptionConfig {\n\n    @PostConstruct\n    public void init() {\n\n        BlockRequestHandler blockRequestHandler = (serverWebExchange, ex) -> {\n            String msg;\n            SentinelErrorInfoEnum errorInfoEnum = SentinelErrorInfoEnum.getErrorByException(ex);\n            if (ObjectUtil.isNotEmpty(errorInfoEnum)) {\n                msg = errorInfoEnum.getError();\n            } else {\n                msg = \"未知限流降级\";\n            }\n            HashMap<String, String> map = new HashMap(5);\n            map.put(\"code\", HttpStatus.TOO_MANY_REQUESTS.toString());\n            map.put(\"message\", msg);\n            //自定义异常处理\n            return ServerResponse.status(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(map));\n        };\n\n        GatewayCallbackManager.setBlockHandler(blockRequestHandler);\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/fallback/sentinel/SentinelBlockRequestHandler.java",
    "content": "//package org.jeecg.fallback.sentinel;\n//import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;\n//import com.alibaba.csp.sentinel.transport.config.TransportConfig;\n//import lombok.extern.slf4j.Slf4j;\n//import org.springframework.beans.factory.annotation.Autowired;\n//import org.springframework.cloud.commons.util.InetUtils;\n//import org.springframework.http.HttpStatus;\n//import org.springframework.http.MediaType;\n//import org.springframework.stereotype.Component;\n//import org.springframework.web.reactive.function.BodyInserters;\n//import org.springframework.web.reactive.function.server.ServerResponse;\n//import org.springframework.web.server.ServerWebExchange;\n//import reactor.core.publisher.Mono;\n//\n//import javax.annotation.PostConstruct;\n//\n///**\n// * 自定义限流返回信息\n// * @author scott\n// */\n//@Slf4j\n//@Component\n//public class SentinelBlockRequestHandler implements BlockRequestHandler {\n//    @Autowired\n//    private InetUtils inetUtils;\n//\n//    @PostConstruct\n//    public void doInit() {\n//        System.setProperty(TransportConfig.HEARTBEAT_CLIENT_IP, inetUtils.findFirstNonLoopbackAddress().getHostAddress());\n//    }\n//\n//    @Override\n//    public Mono<ServerResponse> handleRequest(ServerWebExchange exchange, Throwable ex) {\n//        String resultString = \"{\\\"code\\\":403,\\\"message\\\":\\\"服务开启限流保护,请稍后再试!\\\"}\";\n//        return ServerResponse.status(HttpStatus.TOO_MANY_REQUESTS).contentType(MediaType.APPLICATION_JSON_UTF8).body(BodyInserters.fromObject(resultString));\n//    }\n//\n//\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/filter/GlobalAccessTokenFilter.java",
    "content": "package org.jeecg.filter;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.cloud.gateway.filter.GatewayFilterChain;\nimport org.springframework.cloud.gateway.filter.GlobalFilter;\nimport org.springframework.core.Ordered;\nimport org.springframework.http.server.reactive.ServerHttpRequest;\nimport org.springframework.stereotype.Component;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.server.ServerWebExchange;\nimport reactor.core.publisher.Mono;\nimport java.util.Arrays;\nimport java.util.stream.Collectors;\nimport static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR;\nimport static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.addOriginalRequestUrl;\n\n/**\n* 全局拦截器，作用所有的微服务\n*\n* 1.重写StripPrefix(获取真实的URL)\n* 2.将现在的request，添加当前身份\n* @author: scott\n* @date: 2022/4/8 10:55\n*/\n@Slf4j\n@Component\npublic class GlobalAccessTokenFilter implements GlobalFilter, Ordered {\n    public final static String X_ACCESS_TOKEN = \"X-Access-Token\";\n    public final static String X_GATEWAY_BASE_PATH = \"X_GATEWAY_BASE_PATH\";\n\n    @Override\n    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {\n\n        String scheme = exchange.getRequest().getURI().getScheme();\n        String host = exchange.getRequest().getURI().getHost();\n        int port = exchange.getRequest().getURI().getPort();\n        // 代码逻辑说明: 地址中没有带端口(http/https默认)时port是-1------------\n        String basePath = scheme + \"://\" + host;\n        if (port != -1) {\n            basePath += \":\" + port;\n        }\n        // 1. 重写StripPrefix(获取真实的URL)\n        addOriginalRequestUrl(exchange, exchange.getRequest().getURI());\n        String rawPath = exchange.getRequest().getURI().getRawPath();\n        String newPath = \"/\" + Arrays.stream(StringUtils.tokenizeToStringArray(rawPath, \"/\")).skip(1L).collect(Collectors.joining(\"/\"));\n        ServerHttpRequest newRequest = exchange.getRequest().mutate().path(newPath).build();\n        exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, newRequest.getURI());\n        //2.将现在的request，添加当前身份\n        ServerHttpRequest mutableReq = exchange.getRequest().mutate().header(\"Authorization-UserName\", \"\").header(X_GATEWAY_BASE_PATH,basePath).build();\n        ServerWebExchange mutableExchange = exchange.mutate().request(mutableReq).build();\n        return chain.filter(mutableExchange);\n    }\n\n    @Override\n    public int getOrder() {\n        return 0;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/filter/SentinelFilterContextConfig.java",
    "content": "//package org.jeecg.filter;\n//\n//import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter;\n//import org.springframework.boot.web.servlet.FilterRegistrationBean;\n//import org.springframework.context.annotation.Bean;\n//import org.springframework.context.annotation.Configuration;\n//\n///** 升级spring boot 3后，无法找到平替\n// * @author: zyf\n// * @date: 20210715\n// */\n//@Configuration\n//public class SentinelFilterContextConfig {\n//    @Bean\n//    public FilterRegistrationBean sentinelFilterRegistration() {\n//        FilterRegistrationBean registration = new FilterRegistrationBean();\n//        registration.setFilter(new CommonFilter());\n//        registration.addUrlPatterns(\"/*\");\n//        // 入口资源关闭聚合\n//        registration.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY, \"false\");\n//        registration.setName(\"sentinelFilter\");\n//        registration.setOrder(1);\n//        return registration;\n//    }\n//}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/handler/LoderRouderHandler.java",
    "content": "package org.jeecg.handler;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.common.constant.GlobalConstants;\nimport org.jeecg.common.modules.redis.listener.JeecgRedisListener;\nimport org.jeecg.loader.DynamicRouteLoader;\nimport org.springframework.stereotype.Component;\n\nimport jakarta.annotation.Resource;\n\n/**\n * 路由刷新监听（实现方式：redis监听handler）\n * @author zyf\n * @date: 2022/4/21 10:55\n */\n@Slf4j\n@Component(GlobalConstants.LODER_ROUDER_HANDLER)\npublic class LoderRouderHandler implements JeecgRedisListener {\n\n    @Resource\n    private DynamicRouteLoader dynamicRouteLoader;\n\n\n    @Override\n    public void onMessage(BaseMap message) {\n        dynamicRouteLoader.refresh(message);\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/handler/swagger/MySwaggerResourceProvider.java",
    "content": "package org.jeecg.handler.swagger;\n\nimport cn.hutool.core.util.ArrayUtil;\nimport cn.hutool.core.util.ObjectUtil;\nimport com.alibaba.nacos.api.naming.NamingFactory;\nimport com.alibaba.nacos.api.naming.NamingService;\nimport com.alibaba.nacos.api.naming.pojo.Instance;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.cloud.gateway.route.RouteLocator;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.stereotype.Component;\nimport springfox.documentation.swagger.web.SwaggerResource;\nimport springfox.documentation.swagger.web.SwaggerResourcesProvider;\n\nimport java.util.*;\n\n/** 已使用knife4j-gateway支持该功能\n * 聚合各个服务的swagger接口\n * @author zyf\n * @date: 2022/4/21 10:55\n */\n@Component\n@Slf4j\n@Primary\npublic class MySwaggerResourceProvider implements SwaggerResourcesProvider {\n    /**\n     * swagger2默认的url后缀\n     */\n    private static final String SWAGGER2URL = \"/v3/api-docs\";\n\n    /**\n     * 网关路由\n     */\n    private final RouteLocator routeLocator;\n    /**\n     * Nacos名字服务\n     */\n    private NamingService naming;\n\n    /**\n     * nacos服务地址\n     */\n    @Value(\"${spring.cloud.nacos.discovery.server-addr}\")\n    private String serverAddr;\n    /**\n     * nacos namespace\n     */\n    @Value(\"${spring.cloud.nacos.discovery.namespace:#{null}}\")\n    private String namespace;\n\n    /**\n     * nacos groupName\n     */\n    @Value(\"${spring.cloud.nacos.config.group:DEFAULT_GROUP:#{null}}\")\n    private String group;\n\n    /**\n     * nacos username\n     */\n    @Value(\"${spring.cloud.nacos.discovery.username:#{null}}\")\n    private String username;\n    /**\n     * nacos password\n     */\n    @Value(\"${spring.cloud.nacos.discovery.password:#{null}}\")\n    private String password;\n\n    /**\n     * Swagger中需要排除的服务\n     */\n    private String[] excludeServiceIds=new String[]{\"jeecg-cloud-monitor\"};\n\n\n    /**\n     * 网关应用名称\n     */\n    @Value(\"${spring.application.name}\")\n    private String self;\n\n    @Autowired\n    public MySwaggerResourceProvider(RouteLocator routeLocator) {\n        this.routeLocator = routeLocator;\n    }\n\n    @Override\n    public List<SwaggerResource> get() {\n        List<SwaggerResource> resources = new ArrayList<>();\n        List<String> routeHosts = new ArrayList<>();\n        // 获取所有可用的host：serviceId\n        routeLocator.getRoutes().filter(route -> route.getUri().getHost() != null)\n                .filter(route -> !self.equals(route.getUri().getHost()))\n                .subscribe(route ->{\n                    // 代码逻辑说明: 过滤掉无效路由,避免接口文档报错无法打开\n                    boolean hasRoute=checkRoute(route.getId());\n                    if(hasRoute){\n                        routeHosts.add(route.getUri().getHost());\n                    }\n                });\n\n        // 记录已经添加过的server，存在同一个应用注册了多个服务在nacos上\n        Set<String> dealed = new HashSet<>();\n        routeHosts.forEach(instance -> {\n            // 拼接url\n            String url = \"/\" + instance.toLowerCase() + SWAGGER2URL;\n            if (!dealed.contains(url)) {\n                dealed.add(url);\n                log.info(\" Gateway add SwaggerResource: {}\",url);\n                SwaggerResource swaggerResource = new SwaggerResource();\n                swaggerResource.setUrl(url);\n                swaggerResource.setSwaggerVersion(\"2.0\");\n                swaggerResource.setName(instance);\n                //Swagger排除不展示的服务\n                if(!ArrayUtil.contains(excludeServiceIds,instance)){\n                    resources.add(swaggerResource);\n                }\n            }\n        });\n        return resources;\n    }\n\n    /**\n     * 检测nacos中是否有健康实例\n     * @param routeId\n     * @return\n     */\n    private Boolean checkRoute(String routeId) {\n        Boolean hasRoute = false;\n        try {\n            //修复使用带命名空间启动网关swagger看不到接口文档的问题\n            Properties properties=new Properties();\n            properties.setProperty(\"serverAddr\",serverAddr);\n            if(namespace!=null && !\"\".equals(namespace)){\n                log.info(\"nacos.discovery.namespace = {}\", namespace);\n                properties.setProperty(\"namespace\",namespace);\n            }\n            if(username!=null && !\"\".equals(username)){\n                properties.setProperty(\"username\",username);\n            }\n            if(password!=null && !\"\".equals(password)){\n                properties.setProperty(\"password\",password);\n            }\n            //【issues/5115】因swagger文档导致gateway内存溢出\n            if (this.naming == null) {\n                this.naming = NamingFactory.createNamingService(properties);\n            }\n            log.info(\" config.group : {}\", group);\n            List<Instance> list = this.naming.selectInstances(routeId, group , true);\n            if (ObjectUtil.isNotEmpty(list)) {\n                hasRoute = true;\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return hasRoute;\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/handler/swagger/SwaggerResourceController.java",
    "content": "package org.jeecg.handler.swagger;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport springfox.documentation.swagger.web.*;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/** 已使用knife4j-gateway支持该功能\n * swagger聚合接口，三个接口都是 doc.html需要访问的接口\n * @author zyf\n * @date: 2022/4/21 10:55\n */\n@RestController\n@RequestMapping(\"/swagger-resources\")\npublic class SwaggerResourceController {\n    private MySwaggerResourceProvider swaggerResourceProvider;\n\n    @Value(\"${knife4j.gateway.enabled:true}\")\n    private Boolean enableSwagger;\n\n    @Autowired\n    public SwaggerResourceController(MySwaggerResourceProvider swaggerResourceProvider) {\n        this.swaggerResourceProvider = swaggerResourceProvider;\n    }\n\n    @RequestMapping(value = \"/configuration/security\")\n    public ResponseEntity<SecurityConfiguration> securityConfiguration() {\n        return new ResponseEntity<>(SecurityConfigurationBuilder.builder().build(), HttpStatus.OK);\n    }\n\n    @RequestMapping(value = \"/configuration/ui\")\n    public ResponseEntity<UiConfiguration> uiConfiguration() {\n        return new ResponseEntity<>(UiConfigurationBuilder.builder().build(), HttpStatus.OK);\n    }\n\n    @RequestMapping\n    public ResponseEntity<List<SwaggerResource>> swaggerResources() {\n        if (!enableSwagger) {\n            return new ResponseEntity<>(new ArrayList<>(), HttpStatus.OK);\n        }\n        return new ResponseEntity<>(swaggerResourceProvider.get(), HttpStatus.OK);\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/loader/DynamicRouteLoader.java",
    "content": "package org.jeecg.loader;\n\nimport cn.hutool.core.util.ArrayUtil;\nimport cn.hutool.core.util.ObjectUtil;\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONArray;\nimport com.alibaba.fastjson.JSONObject;\nimport com.alibaba.nacos.api.NacosFactory;\nimport com.alibaba.nacos.api.config.ConfigService;\nimport com.alibaba.nacos.api.config.listener.Listener;\nimport com.alibaba.nacos.api.exception.NacosException;\nimport com.alibaba.nacos.shaded.com.google.common.collect.Lists;\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.ObjectUtils;\nimport org.apache.commons.lang3.StringUtils;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.common.constant.CacheConstant;\nimport org.jeecg.common.util.RedisUtil;\nimport org.jeecg.config.GatewayRoutersConfig;\nimport org.jeecg.config.RouterDataType;\nimport org.jeecg.loader.repository.DynamicRouteService;\nimport org.jeecg.loader.repository.MyInMemoryRouteDefinitionRepository;\nimport org.jeecg.loader.vo.MyRouteDefinition;\nimport org.jeecg.loader.vo.PredicatesVo;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.cloud.context.config.annotation.RefreshScope;\nimport org.springframework.cloud.gateway.event.RefreshRoutesEvent;\nimport org.springframework.cloud.gateway.filter.FilterDefinition;\nimport org.springframework.cloud.gateway.handler.predicate.PredicateDefinition;\nimport org.springframework.cloud.gateway.route.RouteDefinition;\nimport org.springframework.context.ApplicationEventPublisher;\nimport org.springframework.context.ApplicationEventPublisherAware;\nimport org.springframework.context.annotation.DependsOn;\nimport org.springframework.stereotype.Component;\nimport reactor.core.publisher.Mono;\n\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.util.*;\nimport java.util.concurrent.Executor;\n\n/**\n * 动态路由加载器\n *\n * @author : zyf\n * @date :2020-11-10\n */\n@Slf4j\n@Component\n@RefreshScope\n@DependsOn({\"gatewayRoutersConfig\"})\npublic class DynamicRouteLoader implements ApplicationEventPublisherAware {\n\n    public static final long DEFAULT_TIMEOUT = 30000;\n    @Autowired\n    private GatewayRoutersConfig gatewayRoutersConfig;\n    private MyInMemoryRouteDefinitionRepository repository;\n    private ApplicationEventPublisher publisher;\n    private DynamicRouteService dynamicRouteService;\n    private ConfigService configService;\n    private RedisUtil redisUtil;\n\n\n    /**\n     * 需要拼接key的路由条件\n     */\n    private static String[] GEN_KEY_ROUTERS = new String[]{\"Path\", \"Host\", \"Method\", \"After\", \"Before\", \"Between\", \"RemoteAddr\"};\n\n    public DynamicRouteLoader(MyInMemoryRouteDefinitionRepository repository, DynamicRouteService dynamicRouteService, RedisUtil redisUtil) {\n\n        this.repository = repository;\n        this.dynamicRouteService = dynamicRouteService;\n        this.redisUtil = redisUtil;\n    }\n\n//    @PostConstruct\n//    public void init() {\n//       init(null);\n//    }\n\n\n    public void init(BaseMap baseMap) {\n        log.info(\"初始化路由模式，dataType：\"+ gatewayRoutersConfig.getDataType());\n        if (RouterDataType.nacos.toString().endsWith(gatewayRoutersConfig.getDataType())) {\n            loadRoutesByNacos();\n        }\n        //从数据库加载路由\n        if (RouterDataType.database.toString().endsWith(gatewayRoutersConfig.getDataType())) {\n            loadRoutesByRedis(baseMap);\n        }\n    }\n    /**\n     * 刷新路由\n     *\n     * @return\n     */\n    public Mono<Void> refresh(BaseMap baseMap) {\n        log.info(\"初始化路由模式，dataType：\"+ gatewayRoutersConfig.getDataType());\n        if (!RouterDataType.yml.toString().endsWith(gatewayRoutersConfig.getDataType())) {\n            this.init(baseMap);\n        }\n        return Mono.empty();\n    }\n\n\n    /**\n     * 从nacos中读取路由配置\n     *\n     * @return\n     */\n    private void loadRoutesByNacos() {\n        List<RouteDefinition> routes = Lists.newArrayList();\n        configService = createConfigService();\n        if (configService == null) {\n            log.warn(\"initConfigService fail\");\n        }\n        try {\n            log.info(\"jeecg.route.config.data-id = {}\", gatewayRoutersConfig.getDataId());\n            log.info(\"nacos.config.group = {}\", gatewayRoutersConfig.getRouteGroup());\n            String configInfo = configService.getConfig(gatewayRoutersConfig.getDataId(), gatewayRoutersConfig.getRouteGroup(), DEFAULT_TIMEOUT);\n            if (StringUtils.isNotBlank(configInfo)) {\n                log.info(\"获取网关当前配置:\\r\\n{}\", configInfo);\n                routes = JSON.parseArray(configInfo, RouteDefinition.class);\n            }else{\n                log.warn(\"ERROR: 从Nacos获取网关配置为空，请确认Nacos配置是否正确！\");\n            }\n        } catch (NacosException e) {\n            log.error(\"初始化网关路由时发生错误\", e);\n            e.printStackTrace();\n        }\n        for (RouteDefinition definition : routes) {\n            log.info(\"update route : {}\", definition.toString());\n            dynamicRouteService.add(definition);\n        }\n        this.publisher.publishEvent(new RefreshRoutesEvent(this));\n        dynamicRouteByNacosListener(gatewayRoutersConfig.getDataId(), gatewayRoutersConfig.getRouteGroup());\n    }\n\n\n    /**\n     * 从redis中读取路由配置\n     *\n     * @return\n     */\n    private void loadRoutesByRedis(BaseMap baseMap) {\n        List<MyRouteDefinition> routes = Lists.newArrayList();\n        configService = createConfigService();\n        if (configService == null) {\n            log.warn(\"initConfigService fail\");\n        }\n        Object configInfo = redisUtil.get(CacheConstant.GATEWAY_ROUTES);\n        if (ObjectUtil.isNotEmpty(configInfo)) {\n            log.info(\"获取网关当前配置:\\r\\n{}\", configInfo);\n            JSONArray array = JSON.parseArray(configInfo.toString());\n            try {\n                routes = getRoutesByJson(array);\n            } catch (URISyntaxException e) {\n                e.printStackTrace();\n            }\n        }else{\n            log.warn(\"ERROR: 从Redis获取网关配置为空，请确认system服务是否启动成功！\");\n        }\n        \n        for (MyRouteDefinition definition : routes) {\n            log.info(\"update route : {}\", definition.toString());\n            Integer status=definition.getStatus();\n            if(status.equals(0)){\n                dynamicRouteService.delete(definition.getId());\n            }else{\n                dynamicRouteService.add(definition);\n            }\n        }\n        if(ObjectUtils.isNotEmpty(baseMap)){\n            String delRouterId = baseMap.get(\"delRouterId\");\n            if (ObjectUtils.isNotEmpty(delRouterId)) {\n                dynamicRouteService.delete(delRouterId);\n            }\n        }\n        this.publisher.publishEvent(new RefreshRoutesEvent(this));\n    }\n\n    /**\n     * redis中的信息需要处理下 转成RouteDefinition对象\n     * - id: login\n     * uri: lb://cloud-jeecg-system\n     * predicates:\n     * - Path=/jeecg-boot/sys/**,\n     *\n     * @param array\n     * @return\n     */\n\n    public static List<MyRouteDefinition> getRoutesByJson(JSONArray array) throws URISyntaxException {\n        List<MyRouteDefinition> ls = new ArrayList<>();\n        for (int i = 0; i < array.size(); i++) {\n            JSONObject obj = array.getJSONObject(i);\n            MyRouteDefinition route = new MyRouteDefinition();\n            route.setId(obj.getString(\"routerId\"));\n            route.setStatus(obj.getInteger(\"status\"));\n            Object uri = obj.get(\"uri\");\n            if (uri == null) {\n                route.setUri(new URI(\"lb://\" + obj.getString(\"name\")));\n            } else {\n                route.setUri(new URI(obj.getString(\"uri\")));\n            }\n            Object predicates = obj.get(\"predicates\");\n            if (predicates != null) {\n                // 代码逻辑说明: [issues/5331]网关路由配置问题\n                List<PredicatesVo> list = JSON.parseArray(predicates.toString(), PredicatesVo.class);\n                //获取合并后的Predicates，防止配置多个path导致路径失效的问题\n                Map<String, List<String>> groupedPredicates = new HashMap<>();\n                for (PredicatesVo predicatesVo : list) {\n                    String name = predicatesVo.getName();\n                    List<String> args = predicatesVo.getArgs();\n                    groupedPredicates.computeIfAbsent(name, k -> new ArrayList<>()).addAll(args);\n                }\n                //合并后的list\n                list = new ArrayList<>();\n                for (Map.Entry<String, List<String>> entry : groupedPredicates.entrySet()) {\n                    String name = entry.getKey();\n                    List<String> args = entry.getValue();\n                    list.add(new PredicatesVo(name, args));\n                }\n                List<PredicateDefinition> predicateDefinitionList = new ArrayList<>();\n                for (Object map : list) {\n                    JSONObject json = JSON.parseObject(JSON.toJSONString(map));\n                    PredicateDefinition predicateDefinition = new PredicateDefinition();\n                    // 代码逻辑说明: 【VUEN-762】路由条件添加异常问题,原因是部分路由条件参数需要设置固定key\n                    String name=json.getString(\"name\");\n                    predicateDefinition.setName(name);\n                    //路由条件是否拼接Key\n                    if(ArrayUtil.contains(GEN_KEY_ROUTERS,name)) {\n                        JSONArray jsonArray = json.getJSONArray(\"args\");\n                        for (int j = 0; j < jsonArray.size(); j++) {\n                            predicateDefinition.addArg(\"_genkey\" + j, jsonArray.get(j).toString());\n                        }\n                    }else{\n                        JSONObject jsonObject = json.getJSONObject(\"args\");\n                        if(ObjectUtil.isNotEmpty(jsonObject)){\n                            for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {\n                                Object valueObj=entry.getValue();\n                                if(ObjectUtil.isNotEmpty(valueObj)) {\n                                    predicateDefinition.addArg(entry.getKey(), valueObj.toString());\n                                }\n                            }\n                        }\n                    }\n                    predicateDefinitionList.add(predicateDefinition);\n                }\n                route.setPredicates(predicateDefinitionList);\n            }\n\n            Object filters = obj.get(\"filters\");\n            if (filters != null) {\n                JSONArray list = JSON.parseArray(filters.toString());\n                List<FilterDefinition> filterDefinitionList = new ArrayList<>();\n                if (ObjectUtil.isNotEmpty(list)) {\n                    for (Object map : list) {\n                        JSONObject json = (JSONObject) map;\n                        JSONArray jsonArray = json.getJSONArray(\"args\");\n                        String name = json.getString(\"name\");\n                        FilterDefinition filterDefinition = new FilterDefinition();\n                        for (Object o : jsonArray) {\n                            JSONObject params = (JSONObject) o;\n                            filterDefinition.addArg(params.getString(\"key\"), params.get(\"value\").toString());\n                        }\n                        filterDefinition.setName(name);\n                        filterDefinitionList.add(filterDefinition);\n                    }\n                    route.setFilters(filterDefinitionList);\n                }\n            }\n            ls.add(route);\n        }\n        return ls;\n    }\n\n\n//    private void loadRoutesByDataBase() {\n//        List<GatewayRouteVo> routeList = jdbcTemplate.query(SELECT_ROUTES, new RowMapper<GatewayRouteVo>() {\n//            @Override\n//            public GatewayRouteVo mapRow(ResultSet rs, int i) throws SQLException {\n//                GatewayRouteVo result = new GatewayRouteVo();\n//                result.setId(rs.getString(\"id\"));\n//                result.setName(rs.getString(\"name\"));\n//                result.setUri(rs.getString(\"uri\"));\n//                result.setStatus(rs.getInt(\"status\"));\n//                result.setRetryable(rs.getInt(\"retryable\"));\n//                result.setPredicates(rs.getString(\"predicates\"));\n//                result.setStripPrefix(rs.getInt(\"strip_prefix\"));\n//                result.setPersist(rs.getInt(\"persist\"));\n//                return result;\n//            }\n//        });\n//        if (ObjectUtil.isNotEmpty(routeList)) {\n//            // 加载路由\n//            routeList.forEach(route -> {\n//                RouteDefinition definition = new RouteDefinition();\n//                List<PredicateDefinition> predicatesList = Lists.newArrayList();\n//                List<FilterDefinition> filtersList = Lists.newArrayList();\n//                definition.setId(route.getId());\n//                String predicates = route.getPredicates();\n//                String filters = route.getFilters();\n//                if (StringUtils.isNotEmpty(predicates)) {\n//                    predicatesList = JSON.parseArray(predicates, PredicateDefinition.class);\n//                    definition.setPredicates(predicatesList);\n//                }\n//                if (StringUtils.isNotEmpty(filters)) {\n//                    filtersList = JSON.parseArray(filters, FilterDefinition.class);\n//                    definition.setFilters(filtersList);\n//                }\n//                URI uri = UriComponentsBuilder.fromUriString(route.getUri()).build().toUri();\n//                definition.setUri(uri);\n//                this.repository.save(Mono.just(definition)).subscribe();\n//            });\n//            log.info(\"加载路由:{}==============\", routeList.size());\n//            Mono.empty();\n//        }\n//    }\n\n\n    /**\n     * 监听Nacos下发的动态路由配置\n     *\n     * @param dataId\n     * @param group\n     */\n    public void dynamicRouteByNacosListener(String dataId, String group) {\n        try {\n            configService.addListener(dataId, group, new Listener() {\n                @Override\n                public void receiveConfigInfo(String configInfo) {\n                    log.info(\"进行网关更新:\\n\\r{}\", configInfo);\n                    List<MyRouteDefinition> definitionList = JSON.parseArray(configInfo, MyRouteDefinition.class);\n                    for (MyRouteDefinition definition : definitionList) {\n                        log.info(\"update route : {}\", definition.toString());\n                        dynamicRouteService.update(definition);\n                    }\n                }\n\n                @Override\n                public Executor getExecutor() {\n                    log.info(\"getExecutor\\n\\r\");\n                    return null;\n                }\n            });\n        } catch (Exception e) {\n            log.error(\"从nacos接收动态路由配置出错!!!\", e);\n        }\n    }\n\n    /**\n     * 创建ConfigService\n     *\n     * @return\n     */\n    private ConfigService createConfigService() {\n        try {\n            Properties properties = new Properties();\n            properties.setProperty(\"serverAddr\", gatewayRoutersConfig.getServerAddr());\n            if(StringUtils.isNotBlank(gatewayRoutersConfig.getNamespace())){\n                properties.setProperty(\"namespace\", gatewayRoutersConfig.getNamespace());\n            }\n            if(StringUtils.isNotBlank( gatewayRoutersConfig.getUsername())){\n                properties.setProperty(\"username\", gatewayRoutersConfig.getUsername());\n            }\n            if(StringUtils.isNotBlank(gatewayRoutersConfig.getPassword())){\n                properties.setProperty(\"password\", gatewayRoutersConfig.getPassword());\n            }\n            return configService = NacosFactory.createConfigService(properties);\n        } catch (Exception e) {\n            log.error(\"创建ConfigService异常\", e);\n            return null;\n        }\n    }\n\n    @Override\n    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {\n        this.publisher = applicationEventPublisher;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/loader/repository/DynamicRouteService.java",
    "content": "package org.jeecg.loader.repository;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.loader.repository.MyInMemoryRouteDefinitionRepository;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.cloud.gateway.event.RefreshRoutesEvent;\nimport org.springframework.cloud.gateway.route.RouteDefinition;\nimport org.springframework.context.ApplicationEventPublisher;\nimport org.springframework.context.ApplicationEventPublisherAware;\nimport org.springframework.stereotype.Service;\nimport reactor.core.publisher.Mono;\n\n/**\n * 动态更新路由网关service\n * 1）实现一个Spring提供的事件推送接口ApplicationEventPublisherAware\n * 2）提供动态路由的基础方法，可通过获取bean操作该类的方法。该类提供新增路由、更新路由、删除路由，然后实现发布的功能。\n *\n * @author zyf\n */\n@Slf4j\n@Service\npublic class DynamicRouteService implements ApplicationEventPublisherAware {\n\n    @Autowired\n    private MyInMemoryRouteDefinitionRepository repository;\n\n    /**\n     * 发布事件\n     */\n\n    private ApplicationEventPublisher publisher;\n\n    @Override\n    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {\n        this.publisher = applicationEventPublisher;\n    }\n\n    /**\n     * 删除路由\n     *\n     * @param id\n     * @return\n     */\n    public synchronized void delete(String id) {\n        try {\n            repository.delete(Mono.just(id)).subscribe();\n            this.publisher.publishEvent(new RefreshRoutesEvent(this));\n        }catch (Exception e){\n            log.warn(e.getMessage(),e);\n        }\n    }\n\n    /**\n     * 更新路由\n     *\n     * @param definition\n     * @return\n     */\n    public synchronized String update(RouteDefinition definition) {\n        try {\n            log.info(\"gateway update route {}\", definition);\n        } catch (Exception e) {\n            return \"update fail,not find route  routeId: \" + definition.getId();\n        }\n        try {\n            repository.save(Mono.just(definition)).subscribe();\n            this.publisher.publishEvent(new RefreshRoutesEvent(this));\n            return \"success\";\n        } catch (Exception e) {\n            return \"update route fail\";\n        }\n    }\n\n    /**\n     * 增加路由\n     *\n     * @param definition\n     * @return\n     */\n    public synchronized String add(RouteDefinition definition) {\n        log.info(\"gateway add route {}\", definition);\n        try {\n            repository.save(Mono.just(definition)).subscribe();\n        } catch (Exception e) {\n            log.warn(e.getMessage(),e);\n        }\n        return \"success\";\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/loader/repository/MyInMemoryRouteDefinitionRepository.java",
    "content": "//\n// Source code recreated from a .class file by IntelliJ IDEA\n// (powered by Fernflower decompiler)\n//\n\npackage org.jeecg.loader.repository;\n\nimport java.util.Collections;\nimport java.util.LinkedHashMap;\nimport java.util.Map;\nimport java.util.function.Function;\nimport java.util.function.Supplier;\n\nimport ch.qos.logback.classic.Logger;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.cloud.gateway.route.RouteDefinition;\nimport org.springframework.cloud.gateway.route.RouteDefinitionRepository;\nimport org.springframework.cloud.gateway.support.NotFoundException;\nimport org.springframework.stereotype.Component;\nimport org.springframework.util.ObjectUtils;\nimport reactor.core.publisher.Flux;\nimport reactor.core.publisher.Mono;\n\n/**\n * @author qinfeng\n */\n@Slf4j\n@Component\npublic class MyInMemoryRouteDefinitionRepository implements RouteDefinitionRepository {\n    private final Map<String, RouteDefinition> routes = Collections.synchronizedMap(new LinkedHashMap());\n\n    public MyInMemoryRouteDefinitionRepository() {\n    }\n\n    @Override\n    public Mono<Void> save(Mono<RouteDefinition> route) {\n        return route.flatMap((r) -> {\n            if (ObjectUtils.isEmpty(r.getId())) {\n                return Mono.error(new IllegalArgumentException(\"id may not be empty\"));\n            } else {\n                this.routes.put(r.getId(), r);\n                return Mono.empty();\n            }\n        });\n    }\n\n    @Override\n    public Mono<Void> delete(Mono<String> routeId) {\n        return routeId.flatMap((id) -> {\n            if (this.routes.containsKey(id)) {\n                this.routes.remove(id);\n                return Mono.empty();\n            } else {\n                log.warn(\"RouteDefinition not found: \" + routeId);\n                return Mono.empty();\n//                return Mono.defer(() -> {\n//                    return Mono.error(new NotFoundException(\"RouteDefinition not found: \" + routeId));\n//                });\n            }\n        });\n    }\n\n    @Override\n    public Flux<RouteDefinition> getRouteDefinitions() {\n        Map<String, RouteDefinition> routesSafeCopy = new LinkedHashMap(this.routes);\n        return Flux.fromIterable(routesSafeCopy.values());\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/loader/vo/GatewayRouteVo.java",
    "content": "package org.jeecg.loader.vo;\n\nimport lombok.Data;\n\n/**\n * 路由参数模型\n * @author zyf\n * @date: 2022/4/21 10:55\n */\n@Data\npublic class GatewayRouteVo {\n    private String id;\n    private String name;\n    private String uri;\n    private String predicates;\n    private String filters;\n    private Integer stripPrefix;\n    private Integer retryable;\n    private Integer persist;\n    private Integer status;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/loader/vo/MyRouteDefinition.java",
    "content": "package org.jeecg.loader.vo;\n\nimport org.springframework.cloud.gateway.route.RouteDefinition;\n\n/**\n * 自定义RouteDefinition\n * @author zyf\n */\npublic class MyRouteDefinition extends RouteDefinition {\n    /**\n     * 路由状态\n     */\n    private Integer status;\n\n    public Integer getStatus() {\n        return status;\n    }\n\n    public void setStatus(Integer status) {\n        this.status = status;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/loader/vo/PredicatesVo.java",
    "content": "package org.jeecg.loader.vo;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.util.List;\n\n/**\n * 路由配置VO\n * @author lsq\n * @Date 2023/10/15\n */\n@Data\n@AllArgsConstructor\n@NoArgsConstructor\npublic class PredicatesVo {\n    private String  name;\n    private List<String> args;\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/resources/application.yml",
    "content": "server:\n  port: 9999\n\nknife4j:\n  gateway:\n    enabled: true\n\nspring:\n  application:\n    name: jeecg-gateway\n  main:\n    allow-circular-references: true\n  config:\n    import:\n      - optional:nacos:${spring.application.name}-@profile.name@.yaml\n  cloud:\n    nacos:\n      config:\n        server-addr: @config.server-addr@\n        group: @config.group@\n        namespace: @config.namespace@\n        username: @config.username@\n        password: @config.password@\n      discovery:\n        server-addr: ${spring.cloud.nacos.config.server-addr}\n        group: @config.group@\n        namespace: @config.namespace@\n        username: @config.username@\n        password: @config.password@\n    gateway:\n      server:\n        webflux:\n          discovery:\n            locator:\n              enabled: true\n          globalcors:\n            cors-configurations:\n              '[/**]':\n                allow-credentials: true\n                allowed-origin-patterns:\n                  - \"*\"\n                allowed-methods:\n                  - \"*\"\n                allowed-headers:\n                  - \"*\"\n    #Sentinel配置\n    sentinel:\n      transport:\n        dashboard: jeecg-boot-sentinel:9000\n      # 支持链路限流\n      web-context-unify: false\n      filter:\n        enabled: false\n      # 取消Sentinel控制台懒加载\n      eager: false\n      datasource:\n        #流控规则\n        flow:  # 指定数据源名称\n          # 指定nacos数据源\n          nacos:\n            server-addr: @config.server-addr@\n            # 指定配置文件\n            dataId: ${spring.application.name}-flow-rules\n            # 指定分组\n            groupId: SENTINEL_GROUP\n            # 指定配置文件规则类型\n            rule-type: flow\n            # 指定配置文件数据格式\n            data-type: json\n        #降级规则\n        degrade:\n          nacos:\n            server-addr: @config.server-addr@\n            dataId: ${spring.application.name}-degrade-rules\n            groupId: SENTINEL_GROUP\n            rule-type: degrade\n            data-type: json\n        #系统规则\n        system:\n          nacos:\n            server-addr: @config.server-addr@\n            dataId: ${spring.application.name}-system-rules\n            groupId: SENTINEL_GROUP\n            rule-type: system\n            data-type: json\n        #授权规则\n        authority:\n          nacos:\n            server-addr: @config.server-addr@\n            dataId: ${spring.application.name}-authority-rules\n            groupId: SENTINEL_GROUP\n            rule-type: authority\n            data-type: json\n        #热点参数\n        param-flow:\n          nacos:\n            server-addr: @config.server-addr@\n            dataId: ${spring.application.name}-param-rules\n            groupId: SENTINEL_GROUP\n            rule-type: param-flow\n            data-type: json\n        #网关流控规则\n        gw-flow:\n          nacos:\n            server-addr: @config.server-addr@\n            dataId: ${spring.application.name}-flow-rules\n            groupId: SENTINEL_GROUP\n            rule-type: gw-flow\n            data-type: json\n        #API流控规则\n        gw-api-group:\n          nacos:\n            server-addr: @config.server-addr@\n            dataId: ${spring.application.name}-api-rules\n            groupId: SENTINEL_GROUP\n            rule-type: gw-api-group\n            data-type: json"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration debug=\"false\">\n\t<!--定义日志文件的存储地址 -->\n\t<property name=\"LOG_HOME\" value=\"../logs\" />\n\n\t<!--<property name=\"COLOR_PATTERN\" value=\"%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta( %replace(%caller{1}){'\\t|Caller.{1}0|\\r\\n', ''})- %gray(%msg%xEx%n)\" />-->\n\t<!-- 控制台输出 -->\n\t<appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n\t\t\t<!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符\n\t\t\t<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>-->\n\t\t\t<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}:%L) - %msg%n</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- 按照每天生成日志文件 -->\n\t<appender name=\"FILE\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy\">\n\t\t\t<!--日志文件输出的文件名 -->\n\t\t\t<FileNamePattern>${LOG_HOME}/jeecg-gateway-%d{yyyy-MM-dd}.%i.log</FileNamePattern>\n\t\t\t<!--日志文件保留天数 -->\n\t\t\t<MaxHistory>30</MaxHistory>\n\t\t\t<maxFileSize>10MB</maxFileSize>\n\t\t</rollingPolicy>\n\t\t<encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n\t\t\t<!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符 -->\n\t\t\t<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>\n\t\t</encoder>\n\t</appender>\n\n\n\t<!--myibatis log configure -->\n\t<logger name=\"com.apache.ibatis\" level=\"TRACE\" />\n\t<logger name=\"java.sql.Connection\" level=\"DEBUG\" />\n\t<logger name=\"java.sql.Statement\" level=\"DEBUG\" />\n\t<logger name=\"java.sql.PreparedStatement\" level=\"DEBUG\" />\n\n\t<!-- 日志输出级别 -->\n\t<root level=\"INFO\">\n\t\t<appender-ref ref=\"STDOUT\" />\n\t\t<appender-ref ref=\"FILE\" />\n\t</root>\n\n</configuration>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-gateway/src/test/java/TestRoutes.java",
    "content": "import org.jeecg.loader.vo.PredicatesVo;\nimport org.junit.jupiter.api.Test;\n\nimport java.util.*;\n\n/**\n * @Description: 测试\n * @author: lsq\n * @date: 2023年10月13日 11:32\n */\npublic class TestRoutes {\n\n    @Test\n    public void TestRoutes() {\n        List<PredicatesVo> list = new ArrayList<>();\n        PredicatesVo a = new PredicatesVo();\n        a.setName(\"path\");\n        String[] aArr={\"/sys/**\",\"/eoa/**\"};\n        a.setArgs(Arrays.asList(aArr));\n        list.add(a);\n\n        PredicatesVo b = new PredicatesVo();\n        b.setName(\"path\");\n        String[] bArr={\"/sys/**\",\"/demo/**\"};\n        b.setArgs(Arrays.asList(bArr));\n        list.add(b);\n\n        Map<String, List<String>> groupedPredicates = new HashMap<>();\n        for (PredicatesVo predicatesVo : list) {\n            String name = predicatesVo.getName();\n            List<String> args1 = predicatesVo.getArgs();\n            groupedPredicates.computeIfAbsent(name, k -> new ArrayList<>()).addAll(args1);\n        }\n        System.out.println(groupedPredicates);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/Dockerfile",
    "content": "FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:21-anolis\n\nMAINTAINER jeecgos@163.com\n\nRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime\n\nRUN mkdir -p /jeecg-cloud-nacos\n\nWORKDIR /jeecg-cloud-nacos\n\nEXPOSE 8848\n\nADD ./target/jeecg-cloud-nacos-3.9.1.jar ./\n\nCMD sleep 30;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-nacos-3.9.1.jar"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/README.md",
    "content": "访问地址: http://localhost:8848/nacos\n账号密码：nacos/nacos\n\n\n# 使用方法\n\n- 1、目前只做了关闭鉴权模式\n- 2、此项目与官方同步，只是为了简化微服务部署\n- 3、如何不用此模块，使用自己的naocs，请创建下面目录中的配置文件\n     目录：jeecg-cloud-nacos/docs/config\n     配置文件： YAML\n\n\n# 常见问题\n- UnsupportedOperationException: Cannot determine JNI library name for ARCH='x86' OS='windows 10'\n  解决方案：http://t.zoukankan.com/mindzone-p-15808190.html"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/config/jeecg-dev.yaml",
    "content": "spring:\n  datasource:\n    druid:\n      stat-view-servlet:\n        enabled: true\n        loginUsername: admin\n        loginPassword: 123456\n        allow:\n      web-stat-filter:\n        enabled: true\n    dynamic:\n      druid:\n        initial-size: 5\n        min-idle: 5\n        maxActive: 20\n        maxWait: 60000\n        timeBetweenEvictionRunsMillis: 60000\n        minEvictableIdleTimeMillis: 300000\n        validationQuery: SELECT 1 FROM DUAL\n        testWhileIdle: true\n        testOnBorrow: false\n        testOnReturn: false\n        poolPreparedStatements: true\n        maxPoolPreparedStatementPerConnectionSize: 20\n        filters: stat,wall,slf4j\n        connectionProperties: druid.stat.mergeSql\\=true;druid.stat.slowSqlMillis\\=5000\n      datasource:\n        master:\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n          username: root\n          password: root\n          driver-class-name: com.mysql.cj.jdbc.Driver\n  data:\n    redis:\n      database: 0\n      host: jeecg-boot-redis\n      password:\n      port: 6379\n  rabbitmq:\n    host: jeecg-boot-rabbitmq\n    username: guest\n    password: guest\n    port: 5672\n    publisher-confirms: true\n    publisher-returns: true\n    virtual-host: /\n    listener:\n      simple:\n        acknowledge-mode: manual\n        concurrency: 1\n        max-concurrency: 1\n        retry:\n          enabled: true\nminidao:\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\n  uploadType: local\n  domainUrl:\n    pc: http://localhost:3100\n    app: http://localhost:8051\n  path:\n    upload: /opt/upFiles\n    webapp: /opt/webapp\n  shiro:\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n  oss:\n    endpoint: oss-cn-beijing.aliyuncs.com\n    accessKey: ??\n    secretKey: ??\n    bucketName: jeecgdev\n    staticDomain: ??\n  elasticsearch:\n    cluster-name: jeecg-ES\n    cluster-nodes: jeecg-boot-es:9200\n    check-enabled: false\n  file-view-domain: 127.0.0.1:8012\n  minio:\n    minio_url: http://minio.jeecg.com\n    minio_name: ??\n    minio_pass: ??\n    bucketName: otatest\n  jmreport:\n    mode: dev\n    is_verify_token: false\n    verify_methods: remove,delete,save,add,update\n  wps:\n    domain: https://wwo.wps.cn/office/\n    appid: ??\n    appsecret: ??\n  xxljob:\n    enabled: false\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n    appname: ${spring.application.name}\n    accessToken: ''\n    logPath: logs/jeecg/job/jobhandler/\n    logRetentionDays: 30\n  redisson:\n    address: jeecg-boot-redis:6379\n    password:\n    type: STANDALONE\n    enabled: true\nlogging:\n  level:\n    org.jeecg.modules.system.mapper : info\ncas:\n  prefixUrl: http://localhost:8888/cas\nknife4j:\n  production: false\n  basic:\n    enable: false\n    username: jeecg\n    password: jeecg1314\njustauth:\n  enabled: true\n  type:\n    GITHUB:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n    WECHAT_ENTERPRISE:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n      agent-id: ??\n    DINGTALK:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n  cache:\n    type: default\n    prefix: 'demo::'\n    timeout: 1h\nthird-app:\n  enabled: false\n  type:\n    WECHAT_ENTERPRISE:\n      enabled: false\n      client-id: ??\n      client-secret: ??\n      agent-id: ??\n    DINGTALK:\n      enabled: false\n      client-id: ??\n      client-secret: ??\n      agent-id: ??"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/config/jeecg-gateway-dev.yaml",
    "content": "jeecg:\n  route:\n    config:\n      #type:database nacos yml\n      data-type: database\n      group: DEFAULT_GROUP\n      data-id: jeecg-gateway-router\nspring:\n  data:\n    redis:\n      database: 0\n      host: jeecg-boot-redis\n      port: 6379\n      password:"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/config/jeecg-gateway-router.json",
    "content": "[{\n  \"id\": \"jeecg-system\",\n  \"order\": 0,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/sys/**\",\n      \"_genkey_1\": \"/jmreport/**\",\n      \"_genkey_3\": \"/online/**\",\n      \"_genkey_4\": \"/generic/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb://jeecg-system\"\n}, {\n  \"id\": \"jeecg-demo\",\n  \"order\": 1,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/mock/**\",\n      \"_genkey_1\": \"/test/**\",\n      \"_genkey_2\": \"/bigscreen/template1/**\",\n      \"_genkey_3\": \"/bigscreen/template2/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb://jeecg-demo\"\n}, {\n  \"id\": \"jeecg-system-websocket\",\n  \"order\": 2,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/websocket/**\",\n      \"_genkey_1\": \"/newsWebsocket/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb:ws://jeecg-system\"\n}, {\n  \"id\": \"jeecg-demo-websocket\",\n  \"order\": 3,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/vxeSocket/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb:ws://jeecg-demo\"\n}]"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/config/jeecg.yaml",
    "content": "server:\n  tomcat:\n    max-swallow-size: -1\n  error:\n    include-exception: true\n    include-stacktrace: ALWAYS\n    include-message: ALWAYS\n  compression:\n    enabled: true\n    min-response-size: 1024\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\nmanagement:\n  health:\n    mail:\n      enabled: false\n  endpoints:\n    web:\n      exposure:\n        include: \"*\"\n    health:\n      sensitive: true\n  endpoint:\n    health:\n      show-details: ALWAYS\nspring:\n  servlet:\n    multipart:\n      max-file-size: 10MB\n      max-request-size: 10MB\n  mail:\n    host: smtp.163.com\n    username: jeecgos@163.com\n    password: ??\n    properties:\n      mail:\n        smtp:\n          auth: true\n          starttls:\n            enable: true\n            required: true\n  quartz:\n    job-store-type: jdbc\n    initialize-schema: embedded\n    auto-startup: false\n    startup-delay: 1s\n    overwrite-existing-jobs: true\n    properties:\n      org:\n        quartz:\n          scheduler:\n            instanceName: MyScheduler\n            instanceId: AUTO\n          jobStore:\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n            tablePrefix: QRTZ_\n            isClustered: true\n            misfireThreshold: 12000\n            clusterCheckinInterval: 15000\n          threadPool:\n            class: org.quartz.simpl.SimpleThreadPool\n            threadCount: 10\n            threadPriority: 5\n            threadsInheritContextClassLoaderOfInitializingThread: true\n  jackson:\n    date-format:   yyyy-MM-dd HH:mm:ss\n    time-zone:   GMT+8\n  aop:\n    proxy-target-class: true\n  activiti:\n    check-process-definitions: false\n    async-executor-activate: false\n    job-executor-activate: false\n  jpa:\n    open-in-view: false\n  freemarker:\n    suffix: .ftl\n    content-type: text/html\n    charset: UTF-8\n    cache: false\n    prefer-file-system-access: false\n    template-loader-path:\n      - classpath:/templates\n  mvc:\n    static-path-pattern: /**\n    pathmatch:\n      matching-strategy: ant_path_matcher\n  resource:\n    static-locations: classpath:/static/,classpath:/public/\n  autoconfigure:\n    exclude: com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\nmybatis-plus:\n  mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml\n  global-config:\n    banner: false\n    db-config:\n      id-type: ASSIGN_ID\n      table-underline: true\n  configuration:\n    call-setters-on-nulls: true"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/docs/db/nacos_dm.sql",
    "content": "CREATE TABLE \"NACOS\".\"CONFIG_INFO\"\n(\n \"ID\" BIGINT IDENTITY(1,1) NOT NULL,\n \"DATA_ID\" VARCHAR(255) NOT NULL,\n \"GROUP_ID\" VARCHAR(128) NULL,\n \"CONTENT\" CLOB NOT NULL,\n \"MD5\" VARCHAR(32) NULL,\n \"GMT_CREATE\" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()\n NOT NULL,\n \"GMT_MODIFIED\" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()\n NOT NULL,\n \"SRC_USER\" TEXT NULL,\n \"SRC_IP\" VARCHAR(50) NULL,\n \"APP_NAME\" VARCHAR(128) NULL,\n \"TENANT_ID\" VARCHAR(128) DEFAULT ''\n NULL,\n \"C_DESC\" VARCHAR(256) NULL,\n \"C_USE\" VARCHAR(64) NULL,\n \"EFFECT\" VARCHAR(64) NULL,\n \"TYPE\" VARCHAR(64) NULL,\n \"C_SCHEMA\" TEXT NULL,\n \"ENCRYPTED_DATA_KEY\" TEXT NOT NULL\n);\nCREATE TABLE \"NACOS\".\"CONFIG_INFO_AGGR\"\n(\n \"ID\" BIGINT IDENTITY(1,1) NOT NULL,\n \"DATA_ID\" VARCHAR(255) NOT NULL,\n \"GROUP_ID\" VARCHAR(128) NOT NULL,\n \"DATUM_ID\" VARCHAR(255) NOT NULL,\n \"CONTENT\" CLOB NOT NULL,\n \"GMT_MODIFIED\" TIMESTAMP(0) NOT NULL,\n \"APP_NAME\" VARCHAR(128) NULL,\n \"TENANT_ID\" VARCHAR(128) DEFAULT ''\n NULL\n);\nCREATE TABLE \"NACOS\".\"CONFIG_INFO_BETA\"\n(\n \"ID\" BIGINT IDENTITY(1,1) NOT NULL,\n \"DATA_ID\" VARCHAR(255) NOT NULL,\n \"GROUP_ID\" VARCHAR(128) NOT NULL,\n \"APP_NAME\" VARCHAR(128) NULL,\n \"CONTENT\" CLOB NOT NULL,\n \"BETA_IPS\" VARCHAR(1024) NULL,\n \"MD5\" VARCHAR(32) NULL,\n \"GMT_CREATE\" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()\n NOT NULL,\n \"GMT_MODIFIED\" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()\n NOT NULL,\n \"SRC_USER\" TEXT NULL,\n \"SRC_IP\" VARCHAR(50) NULL,\n \"TENANT_ID\" VARCHAR(128) DEFAULT ''\n NULL,\n \"ENCRYPTED_DATA_KEY\" TEXT NOT NULL\n);\nCREATE TABLE \"NACOS\".\"CONFIG_INFO_TAG\"\n(\n \"ID\" BIGINT IDENTITY(1,1) NOT NULL,\n \"DATA_ID\" VARCHAR(255) NOT NULL,\n \"GROUP_ID\" VARCHAR(128) NOT NULL,\n \"TENANT_ID\" VARCHAR(128) DEFAULT ''\n NULL,\n \"TAG_ID\" VARCHAR(128) NOT NULL,\n \"APP_NAME\" VARCHAR(128) NULL,\n \"CONTENT\" CLOB NOT NULL,\n \"MD5\" VARCHAR(32) NULL,\n \"GMT_CREATE\" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()\n NOT NULL,\n \"GMT_MODIFIED\" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()\n NOT NULL,\n \"SRC_USER\" TEXT NULL,\n \"SRC_IP\" VARCHAR(50) NULL\n);\nCREATE TABLE \"NACOS\".\"CONFIG_TAGS_RELATION\"\n(\n \"ID\" BIGINT NOT NULL,\n \"TAG_NAME\" VARCHAR(128) NOT NULL,\n \"TAG_TYPE\" VARCHAR(64) NULL,\n \"DATA_ID\" VARCHAR(255) NOT NULL,\n \"GROUP_ID\" VARCHAR(128) NOT NULL,\n \"TENANT_ID\" VARCHAR(128) DEFAULT ''\n NULL,\n \"NID\" BIGINT IDENTITY(1,1) NOT NULL\n);\nCREATE TABLE \"NACOS\".\"GROUP_CAPACITY\"\n(\n \"ID\" BIGINT IDENTITY(1,1) NOT NULL,\n \"GROUP_ID\" VARCHAR(128) DEFAULT ''\n NOT NULL,\n \"QUOTA\" BIGINT DEFAULT 0\n NOT NULL,\n \"USAGE\" BIGINT DEFAULT 0\n NOT NULL,\n \"MAX_SIZE\" BIGINT DEFAULT 0\n NOT NULL,\n \"MAX_AGGR_COUNT\" BIGINT DEFAULT 0\n NOT NULL,\n \"MAX_AGGR_SIZE\" BIGINT DEFAULT 0\n NOT NULL,\n \"MAX_HISTORY_COUNT\" BIGINT DEFAULT 0\n NOT NULL,\n \"GMT_CREATE\" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()\n NOT NULL,\n \"GMT_MODIFIED\" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()\n NOT NULL\n);\nCREATE TABLE \"NACOS\".\"HIS_CONFIG_INFO\"\n(\n \"ID\" DECIMAL(20,0) NOT NULL,\n \"NID\" BIGINT IDENTITY(1,1) NOT NULL,\n \"DATA_ID\" VARCHAR(255) NOT NULL,\n \"GROUP_ID\" VARCHAR(128) NOT NULL,\n \"APP_NAME\" VARCHAR(128) NULL,\n \"CONTENT\" CLOB NOT NULL,\n \"MD5\" VARCHAR(32) NULL,\n \"GMT_CREATE\" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()\n NOT NULL,\n \"GMT_MODIFIED\" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()\n NOT NULL,\n \"SRC_USER\" TEXT NULL,\n \"SRC_IP\" VARCHAR(50) NULL,\n \"OP_TYPE\" CHAR(10) NULL,\n \"TENANT_ID\" VARCHAR(128) DEFAULT ''\n NULL,\n \"ENCRYPTED_DATA_KEY\" TEXT NOT NULL\n);\nCREATE TABLE \"NACOS\".\"PERMISSIONS\"\n(\n \"ROLE\" VARCHAR(50) NOT NULL,\n \"RESOURCE\" VARCHAR(255) NOT NULL,\n \"ACTION\" VARCHAR(8) NOT NULL\n);\nCREATE TABLE \"NACOS\".\"ROLES\"\n(\n \"USERNAME\" VARCHAR(50) NOT NULL,\n \"ROLE\" VARCHAR(50) NOT NULL\n);\nCREATE TABLE \"NACOS\".\"TENANT_CAPACITY\"\n(\n \"ID\" BIGINT IDENTITY(1,1) NOT NULL,\n \"TENANT_ID\" VARCHAR(128) DEFAULT ''\n NOT NULL,\n \"QUOTA\" BIGINT DEFAULT 0\n NOT NULL,\n \"USAGE\" BIGINT DEFAULT 0\n NOT NULL,\n \"MAX_SIZE\" BIGINT DEFAULT 0\n NOT NULL,\n \"MAX_AGGR_COUNT\" BIGINT DEFAULT 0\n NOT NULL,\n \"MAX_AGGR_SIZE\" BIGINT DEFAULT 0\n NOT NULL,\n \"MAX_HISTORY_COUNT\" BIGINT DEFAULT 0\n NOT NULL,\n \"GMT_CREATE\" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()\n NOT NULL,\n \"GMT_MODIFIED\" TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP()\n NOT NULL\n);\nCREATE TABLE \"NACOS\".\"TENANT_INFO\"\n(\n \"ID\" BIGINT IDENTITY(1,1) NOT NULL,\n \"KP\" VARCHAR(128) NOT NULL,\n \"TENANT_ID\" VARCHAR(128) DEFAULT ''\n NULL,\n \"TENANT_NAME\" VARCHAR(128) DEFAULT ''\n NULL,\n \"TENANT_DESC\" VARCHAR(256) NULL,\n \"CREATE_SOURCE\" VARCHAR(32) NULL,\n \"GMT_CREATE\" BIGINT NOT NULL,\n \"GMT_MODIFIED\" BIGINT NOT NULL\n);\nCREATE TABLE \"NACOS\".\"USERS\"\n(\n \"USERNAME\" VARCHAR(50) NOT NULL,\n \"PASSWORD\" VARCHAR(500) NOT NULL,\n \"ENABLED\" TINYINT NOT NULL\n);\nSET IDENTITY_INSERT \"NACOS\".\"CONFIG_INFO\" ON;\nINSERT INTO \"NACOS\".\"CONFIG_INFO\"(\"ID\",\"DATA_ID\",\"GROUP_ID\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"APP_NAME\",\"TENANT_ID\",\"C_DESC\",\"C_USE\",\"EFFECT\",\"TYPE\",\"C_SCHEMA\",\"ENCRYPTED_DATA_KEY\") VALUES(2,'jeecg-dev.yaml','DEFAULT_GROUP','spring:\n  datasource:\n    druid:\n      stat-view-servlet:\n        enabled: true\n        loginUsername: admin\n        loginPassword: 123456\n        allow:\n      web-stat-filter:\n        enabled: true\n    dynamic:\n      druid: # 全局druid参数，绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n        # 连接池的配置信息\n        # 初始化大小，最小，最大\n        initial-size: 5\n        min-idle: 5\n        maxActive: 20\n        # 配置获取连接等待超时的时间\n        maxWait: 60000\n        # 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒\n        timeBetweenEvictionRunsMillis: 60000\n        # 配置一个连接在池中最小生存的时间，单位是毫秒\n        minEvictableIdleTimeMillis: 300000\n        validationQuery: SELECT 1 FROM DUAL\n        testWhileIdle: true\n        testOnBorrow: false\n        testOnReturn: false\n        # 打开PSCache，并且指定每个连接上PSCache的大小\n        poolPreparedStatements: true\n        maxPoolPreparedStatementPerConnectionSize: 20\n        # 配置监控统计拦截的filters，去掉后监控界面sql无法统计，''wall''用于防火墙\n        filters: stat,wall,slf4j\n        wall:\n          selectWhereAlwayTrueCheck: false\n        stat:\n          merge-sql: true\n          slow-sql-millis: 5000\n\n      datasource:\n        master:\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecgbootsy3_6?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n          username: root\n          password: root\n          driver-class-name: com.mysql.cj.jdbc.Driver\n          # 多数据源配置\n          #multi-datasource1:\n          #url: jdbc:mysql://localhost:3306/jeecgboot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n          #username: root\n          #password: root\n          #driver-class-name: com.mysql.cj.jdbc.Driver\n  #redis 配置\n  redis:\n    database: 0\n    host: jeecg-boot-redis\n    lettuce:\n      pool:\n        max-active: 8   #最大连接数据库连接数,设 0 为没有限制\n        max-idle: 8     #最大等待连接中的数量,设 0 为没有限制\n        max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\n        min-idle: 0     #最小等待连接中的数量,设 0 为没有限制\n      shutdown-timeout: 100ms\n    password:\n    port: 6379\n    #mongodb\n  data:\n    mongodb:\n      #有密码连接 账号密码包含特殊字符的需要用URLEncoder编码 库名必填\n      #uri: mongodb://jeecgdev:jeecgd_89@111.225.222.176:27017/jeecgdev\n      uri: mongodb://jeecg:123456@jeecg-boot-mongo:27017/jeecg?readPreference=secondaryPreferred&maxIdleTimeMS=60000&waitQueueTimeoutMS=2000&minPoolSize=5&maxPoolSize=100&maxLifeTimeMS=0&connectTimeoutMS=2000&socketTimeoutMS=2000\n      #集群方式\n      #uri: mongodb://192.168.0.221:27017,192.168.0.221:27018/imgdb\n      print: true  #是否打印查询语句\n      slowQuery: true  #是否记录慢查询到数据库中\n      slowTime: 1000 #慢查询最短时间,默认为1000毫秒\n  #rabbitmq配置\n  rabbitmq:\n    host: jeecg-boot-rabbitmq\n    username: guest\n    password: guest\n    port: 5672\n    publisher-confirms: true\n    publisher-returns: true\n    virtual-host: /\n    listener:\n      simple:\n        acknowledge-mode: manual\n        #消费者的最小数量\n        concurrency: 1\n        #消费者的最大数量\n        max-concurrency: 1\n        #是否支持重试\n        retry:\n          enabled: true\n#jeecg专用配置\nminidao:\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n  firewall:\n    dataSourceSafe: false\n    lowCodeMode: dev\n  # 签名密钥串(前后端要一致，正式发布请自行修改)\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n  # 本地：local\\Minio：minio\\阿里云：alioss\n  uploadType: local\n  # 前端访问地址\n  domainUrl:\n    pc: http://localhost:3100\n    app: http://localhost:8051\n  path :\n    #文件上传根目录 设置\n    upload: /opt/upFiles\n    #webapp文件路径\n    webapp: /opt/webapp\n  shiro:\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/bigscreen/category/**,/bigscreen/visual/**,/bigscreen/map/**,/jmreport/bigscreen2/**\n  #阿里云oss存储配置\n  oss:\n    endpoint: oss-cn-beijing.aliyuncs.com\n    accessKey: ??\n    secretKey: ??\n    bucketName: jeecgdev\n    staticDomain: ??\n  # ElasticSearch 6设置\n  elasticsearch:\n    cluster-name: jeecg-ES\n    cluster-nodes: 127.0.0.1:9200\n    check-enabled: false\n  # 表单设计器配置\n  desform:\n    # 主题颜色（仅支持 16进制颜色代码）\n    theme-color: \"#1890ff\"\n    # 文件、图片上传方式，可选项：qiniu（七牛云）、system（跟随系统配置）\n    upload-type: system\n    map:\n      # 配置百度地图的AK，申请地址：https://lbs.baidu.com/apiconsole/key?application=key#/home\n      baidu: ??\n  # 在线预览文件服务器地址配置\n  file-view-domain: 127.0.0.1:8012\n  # minio文件上传\n  minio:\n    minio_url: http://minio.jeecg.com\n    minio_name: ??\n    minio_pass: ??\n    bucketName: otatest\n  #大屏报表参数设置\n  jmreport:\n    saasMode:\n    firewall:\n      dataSourceSafe: false\n      lowCodeMode: dev\n  ai-chat:\n    enabled: false\n    apiKey: \"？？？？\"\n    apiHost: \"https://api.openai.com\"\n    timeout: 60\n  #Wps在线文档\n  wps:\n    domain: https://wwo.wps.cn/office/\n    appid: ??\n    appsecret: ??\n  #xxl-job配置\n  xxljob:\n    enabled: false\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n    appname: ${spring.application.name}\n    accessToken: ''''\n    logPath: logs/jeecg/job/jobhandler/\n    logRetentionDays: 30\n  #分布式锁配置\n  redisson:\n    address: jeecg-boot-redis:6379\n    password:\n    type: STANDALONE\n    enabled: true\n#Mybatis输出sql日志\nlogging:\n  level:\n    org.jeecg.modules.system.mapper: info\n#cas单点登录\ncas:\n  prefixUrl: http://localhost:8888/cas\n#swagger\nknife4j:\n  enable: true\n  #开启生产环境屏蔽\n  production: false\n  basic:\n    enable: false\n    username: jeecg\n    password: jeecg1314\n\n#第三方登录\njustauth:\n  enabled: true\n  type:\n    GITHUB:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n    WECHAT_ENTERPRISE:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n      agent-id: 1000002\n    DINGTALK:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n  cache:\n    type: default\n    prefix: ''demo::''\n    timeout: 1h\n#第三方APP对接\nthird-app:\n  enabled: false\n  type:\n    #企业微信\n    WECHAT_ENTERPRISE:\n      enabled: false\n      #CORP_ID\n      client-id: ??\n      #SECRET\n      client-secret: ??\n      agent-id: ??\n      #自建应用秘钥（新版企微需要配置）\n      # agent-app-secret: ??\n    #钉钉\n    DINGTALK:\n      enabled: false\n      # appKey\n      client-id: ??\n      # appSecret\n      client-secret: ??\n      agent-id: ??','350e31a280673586f2203956da576136',TO_DATE('2024-07-09 14:30:06','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:30:06','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','','','',null,null,'yaml',null,'');\nINSERT INTO \"NACOS\".\"CONFIG_INFO\"(\"ID\",\"DATA_ID\",\"GROUP_ID\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"APP_NAME\",\"TENANT_ID\",\"C_DESC\",\"C_USE\",\"EFFECT\",\"TYPE\",\"C_SCHEMA\",\"ENCRYPTED_DATA_KEY\") VALUES(3,'jeecg.yaml','DEFAULT_GROUP','server:\n  tomcat:\n    max-swallow-size: -1\n  error:\n    include-exception: true\n    include-stacktrace: ALWAYS\n    include-message: ALWAYS\n  compression:\n    enabled: true\n    min-response-size: 1024\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\nmanagement:\n  health:\n    mail:\n      enabled: false\n  endpoints:\n    web:\n      exposure:\n        include: \"*\" #暴露所有节点\n    health:\n      sensitive: true #关闭过滤敏感信息\n  endpoint:\n    health:\n      show-details: ALWAYS  #显示详细信息\nflowable:\n  # 自动部署验证设置:true-开启（默认）、false-关闭\n  check-process-definitions: false\n  #配置项可以设置流程引擎启动和关闭时数据库执行的策略\n  database-schema-update: false\n  #保存历史数据级别设置为full最高级别，便于历史数据的追溯\n  history-level: full\n  #开启定时任务\n  async-executor-activate: true\nspring:\n  servlet:\n    multipart:\n      max-file-size: 10MB\n      max-request-size: 10MB\n  mail:\n    host: smtp.163.com\n    username: jeecgos@163.com\n    password: ??\n    properties:\n      mail:\n        smtp:\n          auth: true\n          starttls:\n            enable: true\n            required: true\n  ## quartz定时任务,采用数据库方式\n  quartz:\n    job-store-type: jdbc\n    initialize-schema: embedded\n    #设置自动启动，默认为 true\n    auto-startup: false\n    #延迟1秒启动定时任务\n    startup-delay: 1s\n    #启动时更新己存在的Job\n    overwrite-existing-jobs: true\n    properties:\n      org:\n        quartz:\n          scheduler:\n            instanceName: MyScheduler\n            instanceId: AUTO\n          jobStore:\n            #class: org.quartz.impl.jdbcjobstore.JobStoreTX\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n            tablePrefix: QRTZ_\n            isClustered: true\n            misfireThreshold: 12000\n            clusterCheckinInterval: 15000\n          threadPool:\n            class: org.quartz.simpl.SimpleThreadPool\n            threadCount: 10\n            threadPriority: 5\n            threadsInheritContextClassLoaderOfInitializingThread: true\n  #json 时间戳统一转换\n  jackson:\n    date-format: yyyy-MM-dd HH:mm:ss\n    time-zone: GMT+8\n  aop:\n    proxy-target-class: true\n  jpa:\n    open-in-view: false\n  #配置freemarker\n  freemarker:\n    # 设置模板后缀名\n    suffix: .ftl\n    # 设置文档类型\n    content-type: text/html\n    # 设置页面编码格式\n    charset: UTF-8\n    # 设置页面缓存\n    cache: false\n    prefer-file-system-access: false\n    # 设置ftl文件路径\n    template-loader-path:\n      - classpath:/templates\n    template_update_delay: 0\n  # 设置静态文件路径，js,css等\n  mvc:\n    static-path-pattern: /**\n    #Spring Boot 2.6+ 手动指定为ant-path-matcher\n    pathmatch:\n      matching-strategy: ant_path_matcher\n  resource:\n    static-locations: classpath:/static/,classpath:/public/\n  autoconfigure:\n    exclude:\n      - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\n#mybatis plus 设置\nmybatis-plus:\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n  global-config:\n    # 关闭MP3.0自带的banner\n    banner: false\n    db-config:\n      #主键类型  0:\"数据库ID自增\",1:\"该类型为未设置主键类型\", 2:\"用户输入ID\",3:\"全局唯一ID (数字类型唯一ID)\", 4:\"全局唯一ID UUID\",5:\"字符串全局唯一ID (idWorker 的字符串表示)\";\n      id-type: ASSIGN_ID\n      # 默认数据库表下划线命名\n      table-underline: true\n  configuration:\n    # 这个配置会将执行的sql打印出来，在开发或测试的时候可以用\n    #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n    # 返回类型为Map,显示null对应的字段\n    call-setters-on-nulls: true','94755a848afefef22e34ff83668ec4f7',TO_DATE('2024-07-09 14:30:06','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:30:06','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','','','',null,null,'yaml',null,'');\nINSERT INTO \"NACOS\".\"CONFIG_INFO\"(\"ID\",\"DATA_ID\",\"GROUP_ID\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"APP_NAME\",\"TENANT_ID\",\"C_DESC\",\"C_USE\",\"EFFECT\",\"TYPE\",\"C_SCHEMA\",\"ENCRYPTED_DATA_KEY\") VALUES(4,'jeecg-gateway-router.json','DEFAULT_GROUP','[{\n  \"id\": \"jeecg-system\",\n  \"order\": 0,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/sys/**\",\n      \"_genkey_1\": \"/eoa/**\",\n      \"_genkey_2\": \"/joa/**\",\n      \"_genkey_3\": \"/jmreport/**\",\n      \"_genkey_4\": \"/bigscreen/**\",\n      \"_genkey_5\": \"/desform/**\",\n      \"_genkey_6\": \"/online/**\",\n      \"_genkey_8\": \"/act/**\",\n      \"_genkey_9\": \"/plug-in/**\",\n      \"_genkey_10\": \"/generic/**\",\n      \"_genkey_11\": \"/v1/**\",\n      \"_genkey_12\": \"/desflow/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb://jeecg-system\"\n}, {\n  \"id\": \"jeecg-demo\",\n  \"order\": 1,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/mock/**\",\n      \"_genkey_1\": \"/test/**\",\n      \"_genkey_2\": \"/bigscreen/template1/**\",\n      \"_genkey_3\": \"/bigscreen/template2/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb://jeecg-demo\"\n}, {\n  \"id\": \"jeecg-system-websocket\",\n  \"order\": 2,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/websocket/**\",\n      \"_genkey_1\": \"/eoaSocket/**\",\n      \"_genkey_2\": \"/newsWebsocket/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb:ws://jeecg-system\"\n}, {\n  \"id\": \"jeecg-demo-websocket\",\n  \"order\": 3,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/vxeSocket/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb:ws://jeecg-demo\"\n}]','c9eff51f264ebe266c07ad1c5b6778e2',TO_DATE('2024-07-09 14:30:07','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:30:07','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','','','',null,null,'json',null,'');\nINSERT INTO \"NACOS\".\"CONFIG_INFO\"(\"ID\",\"DATA_ID\",\"GROUP_ID\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"APP_NAME\",\"TENANT_ID\",\"C_DESC\",\"C_USE\",\"EFFECT\",\"TYPE\",\"C_SCHEMA\",\"ENCRYPTED_DATA_KEY\") VALUES(5,'jeecg-gateway-dev.yaml','DEFAULT_GROUP','jeecg:\n  route:\n    config:\n      #路由加载模式： database、nacos、yml\n      data-type: database\n      #Nacos模式，读取配置文件jeecg-gateway-router.json(固定)\n      group: DEFAULT_GROUP\n      data-id: jeecg-gateway-router\nspring:\n  #redis配置\n  redis:\n    database: 0\n    host: jeecg-boot-redis\n    port: 6379\n    password:\n#swagger\nknife4j:\n  #开启生产环境屏蔽\n  production: false','8fea1277e460b477987521aecf432150',TO_DATE('2024-07-09 14:30:07','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:30:07','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','','','',null,null,'yaml',null,'');\nINSERT INTO \"NACOS\".\"CONFIG_INFO\"(\"ID\",\"DATA_ID\",\"GROUP_ID\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"APP_NAME\",\"TENANT_ID\",\"C_DESC\",\"C_USE\",\"EFFECT\",\"TYPE\",\"C_SCHEMA\",\"ENCRYPTED_DATA_KEY\") VALUES(6,'jeecg-sharding.yaml','DEFAULT_GROUP','spring:\n  shardingsphere:\n    datasource:\n      names: ds0\n      ds0:\n        driverClassName: com.mysql.cj.jdbc.Driver\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n        username: root\n        password: root\n        type: com.alibaba.druid.pool.DruidDataSource\n    props:\n      sql-show: true\n    rules:\n      sharding:\n        binding-tables: sys_log\n        key-generators:\n          snowflake:\n            type: SNOWFLAKE\n            props:\n              worker-id: 123\n        sharding-algorithms:\n          table-classbased:\n            props:\n              strategy: standard\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n            type: CLASS_BASED\n        tables:\n          sys_log:\n            actual-data-nodes: ds0.sys_log$->{0..1}\n            table-strategy:\n              standard:\n                sharding-algorithm-name: table-classbased\n                sharding-column: log_type','5d7aad99a23e68589e93facd1b221aea',TO_DATE('2024-07-09 14:30:07','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:30:07','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','','',null,null,null,'yaml',null,'');\nINSERT INTO \"NACOS\".\"CONFIG_INFO\"(\"ID\",\"DATA_ID\",\"GROUP_ID\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"APP_NAME\",\"TENANT_ID\",\"C_DESC\",\"C_USE\",\"EFFECT\",\"TYPE\",\"C_SCHEMA\",\"ENCRYPTED_DATA_KEY\") VALUES(7,'jeecg-sharding-multi.yaml','DEFAULT_GROUP','spring:\n  shardingsphere:\n    datasource:\n      names: ds0,ds1\n      ds0:\n        driverClassName: com.mysql.cj.jdbc.Driver\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n        type: com.alibaba.druid.pool.DruidDataSource\n        username: root\n        password: root\n      ds1:\n        driverClassName: com.mysql.cj.jdbc.Driver\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot2?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n        type: com.alibaba.druid.pool.DruidDataSource\n        username: root\n        password: root\n    props:\n      sql-show: true\n    rules:\n      replica-query:\n        load-balancers:\n          round-robin:\n            type: ROUND_ROBIN\n            props:\n              default: 0\n        data-sources:\n          prds:\n            primary-data-source-name: ds0\n            replica-data-source-names: ds1\n            load-balancer-name: round_robin\n      sharding:\n        binding-tables:\n          - sys_log\n        key-generators:\n          snowflake:\n            type: SNOWFLAKE\n            props:\n              worker-id: 123\n        sharding-algorithms:\n          table-classbased:\n            props:\n              strategy: standard\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n            type: CLASS_BASED\n          database-inline:\n            type: INLINE\n            props:\n              algorithm-expression: ds$->{operate_type % 2}\n        tables:\n          sys_log:\n            actual-data-nodes: ds$->{0..1}.sys_log$->{0..1}\n            database-strategy:\n              standard:\n                sharding-column: operate_type\n                sharding-algorithm-name: database-inline\n            table-strategy:\n              standard:\n                sharding-algorithm-name: table-classbased\n                sharding-column: log_type','ef2f42fb2dda43cd0d4397a820f3144e',TO_DATE('2024-07-09 14:30:07','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:30:07','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','','',null,null,null,'yaml',null,'');\nINSERT INTO \"NACOS\".\"CONFIG_INFO\"(\"ID\",\"DATA_ID\",\"GROUP_ID\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"APP_NAME\",\"TENANT_ID\",\"C_DESC\",\"C_USE\",\"EFFECT\",\"TYPE\",\"C_SCHEMA\",\"ENCRYPTED_DATA_KEY\") VALUES(14,'jeecg-dev.yaml','DEFAULT_GROUP','spring:\n  datasource:\n    druid:\n      stat-view-servlet:\n        enabled: true\n        loginUsername: admin\n        loginPassword: 123456\n        allow:\n      web-stat-filter:\n        enabled: true\n    dynamic:\n      druid:\n        initial-size: 5\n        min-idle: 5\n        maxActive: 20\n        maxWait: 60000\n        timeBetweenEvictionRunsMillis: 60000\n        minEvictableIdleTimeMillis: 300000\n        validationQuery: SELECT 1 FROM DUAL\n        testWhileIdle: true\n        testOnBorrow: false\n        testOnReturn: false\n        poolPreparedStatements: true\n        maxPoolPreparedStatementPerConnectionSize: 20\n        filters: stat,wall,slf4j\n        wall:\n          selectWhereAlwayTrueCheck: false\n        stat:\n          merge-sql: true\n          slow-sql-millis: 5000\n      datasource:\n        master:\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n          username: root\n          password: root\n          driver-class-name: com.mysql.cj.jdbc.Driver\n  data:\n    redis:\n      database: 0\n      host: jeecg-boot-redis\n      password:\n      port: 6379\n  rabbitmq:\n    host: jeecg-boot-rabbitmq\n    username: guest\n    password: guest\n    port: 5672\n    publisher-confirms: true\n    publisher-returns: true\n    virtual-host: /\n    listener:\n      simple:\n        acknowledge-mode: manual\n        concurrency: 1\n        max-concurrency: 1\n        retry:\n          enabled: true\n  flyway:\n    enabled: false\n    encoding: UTF-8\n    locations: classpath:flyway/sql/mysql\n    sql-migration-prefix: V\n    sql-migration-separator: __\n    placeholder-prefix: ''#(''\n    placeholder-suffix: )\n    sql-migration-suffixes: .sql\n    validate-on-migrate: true\n    baseline-on-migrate: true\n    clean-disabled: true\nminidao:\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n  firewall:\n    dataSourceSafe: false\n    lowCodeMode: dev\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\n  uploadType: local\n  domainUrl:\n    pc: http://localhost:3100\n    app: http://localhost:8051\n  path:\n    upload: /opt/upFiles\n    webapp: /opt/webapp\n  shiro:\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n  oss:\n    endpoint: oss-cn-beijing.aliyuncs.com\n    accessKey: ??\n    secretKey: ??\n    bucketName: jeecgdev\n    staticDomain: ??\n  elasticsearch:\n    cluster-name: jeecg-ES\n    cluster-nodes: jeecg-boot-es:9200\n    check-enabled: false\n  file-view-domain: 127.0.0.1:8012\n  minio:\n    minio_url: http://minio.jeecg.com\n    minio_name: ??\n    minio_pass: ??\n    bucketName: otatest\n  jmreport:\n    saasMode:\n    firewall:\n      dataSourceSafe: false\n      lowCodeMode: dev\n  wps:\n    domain: https://wwo.wps.cn/office/\n    appid: ??\n    appsecret: ??\n  xxljob:\n    enabled: false\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n    appname: ${spring.application.name}\n    accessToken: ''''\n    logPath: logs/jeecg/job/jobhandler/\n    logRetentionDays: 30\n  redisson:\n    address: jeecg-boot-redis:6379\n    password:\n    type: STANDALONE\n    enabled: true\n  ai-chat:\n    enabled: false\n    apiKey: \"？？？？\"\n    apiHost: \"https://api.openai.com\"\n    timeout: 60\nlogging:\n  level:\n    org.jeecg.modules.system.mapper : info\ncas:\n  prefixUrl: http://localhost:8888/cas\nknife4j:\n  production: false\n  basic:\n    enable: false\n    username: jeecg\n    password: jeecg1314\njustauth:\n  enabled: true\n  type:\n    GITHUB:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n    WECHAT_ENTERPRISE:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n      agent-id: ??\n    DINGTALK:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n  cache:\n    type: default\n    prefix: ''demo::''\n    timeout: 1h\nthird-app:\n  enabled: false\n  type:\n    WECHAT_ENTERPRISE:\n      enabled: false\n      client-id: ??\n      client-secret: ??\n      agent-id: ??\n    DINGTALK:\n      enabled: false\n      client-id: ??\n      client-secret: ??\n      agent-id: ??','91c29720dfb424916a769201a25200cf',TO_DATE('2024-07-09 14:34:33','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:34:33','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','','springboot3','',null,null,'yaml',null,'');\nINSERT INTO \"NACOS\".\"CONFIG_INFO\"(\"ID\",\"DATA_ID\",\"GROUP_ID\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"APP_NAME\",\"TENANT_ID\",\"C_DESC\",\"C_USE\",\"EFFECT\",\"TYPE\",\"C_SCHEMA\",\"ENCRYPTED_DATA_KEY\") VALUES(15,'jeecg.yaml','DEFAULT_GROUP','server:\n  undertow:\n    # max-http-post-size: 10MB\n    worker-threads: 16\n    buffers:\n      websocket: 8192\n      io: 16384\n  error:\n    include-exception: true\n    include-stacktrace: ALWAYS\n    include-message: ALWAYS\n  compression:\n    enabled: true\n    min-response-size: 1024\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\nmanagement:\n  health:\n    mail:\n      enabled: false\n  endpoints:\n    web:\n      exposure:\n        include: \"*\"\n    health:\n      sensitive: true\n  endpoint:\n    health:\n      show-details: ALWAYS\nspring:\n  servlet:\n    multipart:\n      max-file-size: 10MB\n      max-request-size: 10MB\n  mail:\n    host: smtp.163.com\n    username: jeecgos@163.com\n    password: ??\n    properties:\n      mail:\n        smtp:\n          auth: true\n          starttls:\n            enable: true\n            required: true\n  quartz:\n    job-store-type: jdbc\n    initialize-schema: embedded\n    auto-startup: false\n    startup-delay: 1s\n    overwrite-existing-jobs: true\n    properties:\n      org:\n        quartz:\n          scheduler:\n            instanceName: MyScheduler\n            instanceId: AUTO\n          jobStore:\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n            tablePrefix: QRTZ_\n            isClustered: true\n            misfireThreshold: 12000\n            clusterCheckinInterval: 15000\n          threadPool:\n            class: org.quartz.simpl.SimpleThreadPool\n            threadCount: 10\n            threadPriority: 5\n            threadsInheritContextClassLoaderOfInitializingThread: true\n  jackson:\n    date-format: yyyy-MM-dd HH:mm:ss\n    time-zone: GMT+8\n  aop:\n    proxy-target-class: true\n  activiti:\n    check-process-definitions: false\n    async-executor-activate: false\n    job-executor-activate: false\n  jpa:\n    open-in-view: false\n  freemarker:\n    suffix: .ftl\n    content-type: text/html\n    charset: UTF-8\n    cache: false\n    prefer-file-system-access: false\n    template-loader-path:\n      - classpath:/templates\n  mvc:\n    static-path-pattern: /**\n    pathmatch:\n      matching-strategy: ant_path_matcher\n  resource:\n    static-locations: classpath:/static/,classpath:/public/\n  autoconfigure:\n    exclude:\n      - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\nmybatis-plus:\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n  global-config:\n    banner: false\n    db-config:\n      id-type: ASSIGN_ID\n      table-underline: true\n  configuration:\n    call-setters-on-nulls: true','ce1ca3b6f8431e884aed94ab29be43a9',TO_DATE('2024-07-09 14:34:33','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:34:33','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','','springboot3','',null,null,'yaml',null,'');\nINSERT INTO \"NACOS\".\"CONFIG_INFO\"(\"ID\",\"DATA_ID\",\"GROUP_ID\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"APP_NAME\",\"TENANT_ID\",\"C_DESC\",\"C_USE\",\"EFFECT\",\"TYPE\",\"C_SCHEMA\",\"ENCRYPTED_DATA_KEY\") VALUES(16,'jeecg-gateway-router.json','DEFAULT_GROUP','[{\n  \"id\": \"jeecg-system\",\n  \"order\": 0,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/sys/**\",\n      \"_genkey_1\": \"/jmreport/**\",\n      \"_genkey_3\": \"/online/**\",\n      \"_genkey_4\": \"/generic/**\",\n      \"_genkey_5\": \"/oauth2/**\",\n      \"_genkey_6\": \"/drag/**\",\n      \"_genkey_7\": \"/actuator/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb://jeecg-system\"\n}, {\n  \"id\": \"jeecg-demo\",\n  \"order\": 1,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/mock/**\",\n      \"_genkey_1\": \"/test/**\",\n      \"_genkey_2\": \"/bigscreen/template1/**\",\n      \"_genkey_3\": \"/bigscreen/template2/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb://jeecg-demo\"\n}, {\n  \"id\": \"jeecg-system-websocket\",\n  \"order\": 2,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/websocket/**\",\n      \"_genkey_1\": \"/newsWebsocket/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb:ws://jeecg-system\"\n}, {\n  \"id\": \"jeecg-demo-websocket\",\n  \"order\": 3,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/vxeSocket/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb:ws://jeecg-demo\"\n}]','9794beb09d30bc6b835f2ee870781587',TO_DATE('2024-07-09 14:34:33','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:34:33','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','','springboot3','',null,null,'json',null,'');\nINSERT INTO \"NACOS\".\"CONFIG_INFO\"(\"ID\",\"DATA_ID\",\"GROUP_ID\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"APP_NAME\",\"TENANT_ID\",\"C_DESC\",\"C_USE\",\"EFFECT\",\"TYPE\",\"C_SCHEMA\",\"ENCRYPTED_DATA_KEY\") VALUES(17,'jeecg-sharding.yaml','DEFAULT_GROUP','spring:\n  shardingsphere:\n    datasource:\n      names: ds0\n      ds0:\n        driverClassName: com.mysql.cj.jdbc.Driver\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n        username: root\n        password: root\n        type: com.alibaba.druid.pool.DruidDataSource\n    props:\n      sql-show: true\n    rules:\n      sharding:\n        binding-tables: sys_log\n        key-generators:\n          snowflake:\n            type: SNOWFLAKE\n            props:\n              worker-id: 123\n        sharding-algorithms:\n          table-classbased:\n            props:\n              strategy: standard\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n            type: CLASS_BASED\n        tables:\n          sys_log:\n            actual-data-nodes: ds0.sys_log$->{0..1}\n            table-strategy:\n              standard:\n                sharding-algorithm-name: table-classbased\n                sharding-column: log_type','a93fa455c32cd37ca84631d2bbe13005',TO_DATE('2024-07-09 14:34:33','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:34:33','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','','springboot3','',null,null,'yaml',null,'');\nINSERT INTO \"NACOS\".\"CONFIG_INFO\"(\"ID\",\"DATA_ID\",\"GROUP_ID\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"APP_NAME\",\"TENANT_ID\",\"C_DESC\",\"C_USE\",\"EFFECT\",\"TYPE\",\"C_SCHEMA\",\"ENCRYPTED_DATA_KEY\") VALUES(18,'jeecg-gateway-dev.yaml','DEFAULT_GROUP','jeecg:\n  route:\n    config:\n      #type:database nacos yml\n      data-type: database\n      data-id: jeecg-gateway-router\nspring:\n  data:\n    redis:\n      database: 0\n      host: jeecg-boot-redis\n      port: 6379\n      password:\nknife4j:\n  production: false','19d7cd93eeb85a582c8a6942d499c7f7',TO_DATE('2024-07-09 14:34:33','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:34:33','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','','springboot3','',null,null,'yaml',null,'');\nINSERT INTO \"NACOS\".\"CONFIG_INFO\"(\"ID\",\"DATA_ID\",\"GROUP_ID\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"APP_NAME\",\"TENANT_ID\",\"C_DESC\",\"C_USE\",\"EFFECT\",\"TYPE\",\"C_SCHEMA\",\"ENCRYPTED_DATA_KEY\") VALUES(19,'jeecg-sharding-multi.yaml','DEFAULT_GROUP','spring:\n  shardingsphere:\n    datasource:\n      names: ds0,ds1\n      ds0:\n        driverClassName: com.mysql.cj.jdbc.Driver\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n        type: com.alibaba.druid.pool.DruidDataSource\n        username: root\n        password: root\n      ds1:\n        driverClassName: com.mysql.cj.jdbc.Driver\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot2?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n        type: com.alibaba.druid.pool.DruidDataSource\n        username: root\n        password: root\n    props:\n      sql-show: true\n    rules:\n      replica-query:\n        load-balancers:\n          round-robin:\n            type: ROUND_ROBIN\n            props:\n              default: 0\n        data-sources:\n          prds:\n            primary-data-source-name: ds0\n            replica-data-source-names: ds1\n            load-balancer-name: round_robin\n      sharding:\n        binding-tables:\n          - sys_log\n        key-generators:\n          snowflake:\n            type: SNOWFLAKE\n            props:\n              worker-id: 123\n        sharding-algorithms:\n          table-classbased:\n            props:\n              strategy: standard\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n            type: CLASS_BASED\n          database-inline:\n            type: INLINE\n            props:\n              algorithm-expression: ds$->{operate_type % 2}\n        tables:\n          sys_log:\n            actual-data-nodes: ds$->{0..1}.sys_log$->{0..1}\n            database-strategy:\n              standard:\n                sharding-column: operate_type\n                sharding-algorithm-name: database-inline\n            table-strategy:\n              standard:\n                sharding-algorithm-name: table-classbased\n                sharding-column: log_type','0fc2b030ca8c0008f148c84ecbd2a8c7',TO_DATE('2024-07-09 14:34:33','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:34:33','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','','springboot3','',null,null,'yaml',null,'');\n\nSET IDENTITY_INSERT \"NACOS\".\"CONFIG_INFO\" OFF;\nSET IDENTITY_INSERT \"NACOS\".\"CONFIG_INFO_AGGR\" ON;\nSET IDENTITY_INSERT \"NACOS\".\"CONFIG_INFO_AGGR\" OFF;\nSET IDENTITY_INSERT \"NACOS\".\"CONFIG_INFO_BETA\" ON;\nSET IDENTITY_INSERT \"NACOS\".\"CONFIG_INFO_BETA\" OFF;\nSET IDENTITY_INSERT \"NACOS\".\"CONFIG_INFO_TAG\" ON;\nSET IDENTITY_INSERT \"NACOS\".\"CONFIG_INFO_TAG\" OFF;\nSET IDENTITY_INSERT \"NACOS\".\"CONFIG_TAGS_RELATION\" ON;\nSET IDENTITY_INSERT \"NACOS\".\"CONFIG_TAGS_RELATION\" OFF;\nSET IDENTITY_INSERT \"NACOS\".\"GROUP_CAPACITY\" ON;\nSET IDENTITY_INSERT \"NACOS\".\"GROUP_CAPACITY\" OFF;\nSET IDENTITY_INSERT \"NACOS\".\"HIS_CONFIG_INFO\" ON;\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(0,1,'1','DEFAULT_GROUP','','1','c4ca4238a0b923820dcc509a6f75849b',TO_DATE('2024-07-09 14:24:05','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:24:06','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','I','','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(1,2,'1','DEFAULT_GROUP','','1','c4ca4238a0b923820dcc509a6f75849b',TO_DATE('2024-07-09 14:24:07','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:24:08','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','D','','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(0,3,'jeecg-dev.yaml','DEFAULT_GROUP','','spring:\n  datasource:\n    druid:\n      stat-view-servlet:\n        enabled: true\n        loginUsername: admin\n        loginPassword: 123456\n        allow:\n      web-stat-filter:\n        enabled: true\n    dynamic:\n      druid: # 全局druid参数，绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)\n        # 连接池的配置信息\n        # 初始化大小，最小，最大\n        initial-size: 5\n        min-idle: 5\n        maxActive: 20\n        # 配置获取连接等待超时的时间\n        maxWait: 60000\n        # 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位是毫秒\n        timeBetweenEvictionRunsMillis: 60000\n        # 配置一个连接在池中最小生存的时间，单位是毫秒\n        minEvictableIdleTimeMillis: 300000\n        validationQuery: SELECT 1 FROM DUAL\n        testWhileIdle: true\n        testOnBorrow: false\n        testOnReturn: false\n        # 打开PSCache，并且指定每个连接上PSCache的大小\n        poolPreparedStatements: true\n        maxPoolPreparedStatementPerConnectionSize: 20\n        # 配置监控统计拦截的filters，去掉后监控界面sql无法统计，''wall''用于防火墙\n        filters: stat,wall,slf4j\n        wall:\n          selectWhereAlwayTrueCheck: false\n        stat:\n          merge-sql: true\n          slow-sql-millis: 5000\n\n      datasource:\n        master:\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecgbootsy3_6?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n          username: root\n          password: root\n          driver-class-name: com.mysql.cj.jdbc.Driver\n          # 多数据源配置\n          #multi-datasource1:\n          #url: jdbc:mysql://localhost:3306/jeecgboot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n          #username: root\n          #password: root\n          #driver-class-name: com.mysql.cj.jdbc.Driver\n  #redis 配置\n  redis:\n    database: 0\n    host: jeecg-boot-redis\n    lettuce:\n      pool:\n        max-active: 8   #最大连接数据库连接数,设 0 为没有限制\n        max-idle: 8     #最大等待连接中的数量,设 0 为没有限制\n        max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。\n        min-idle: 0     #最小等待连接中的数量,设 0 为没有限制\n      shutdown-timeout: 100ms\n    password:\n    port: 6379\n    #mongodb\n  data:\n    mongodb:\n      #有密码连接 账号密码包含特殊字符的需要用URLEncoder编码 库名必填\n      #uri: mongodb://jeecgdev:jeecgd_89@111.225.222.176:27017/jeecgdev\n      uri: mongodb://jeecg:123456@jeecg-boot-mongo:27017/jeecg?readPreference=secondaryPreferred&maxIdleTimeMS=60000&waitQueueTimeoutMS=2000&minPoolSize=5&maxPoolSize=100&maxLifeTimeMS=0&connectTimeoutMS=2000&socketTimeoutMS=2000\n      #集群方式\n      #uri: mongodb://192.168.0.221:27017,192.168.0.221:27018/imgdb\n      print: true  #是否打印查询语句\n      slowQuery: true  #是否记录慢查询到数据库中\n      slowTime: 1000 #慢查询最短时间,默认为1000毫秒\n  #rabbitmq配置\n  rabbitmq:\n    host: jeecg-boot-rabbitmq\n    username: guest\n    password: guest\n    port: 5672\n    publisher-confirms: true\n    publisher-returns: true\n    virtual-host: /\n    listener:\n      simple:\n        acknowledge-mode: manual\n        #消费者的最小数量\n        concurrency: 1\n        #消费者的最大数量\n        max-concurrency: 1\n        #是否支持重试\n        retry:\n          enabled: true\n#jeecg专用配置\nminidao:\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n  firewall:\n    dataSourceSafe: false\n    lowCodeMode: dev\n  # 签名密钥串(前后端要一致，正式发布请自行修改)\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n  # 本地：local\\Minio：minio\\阿里云：alioss\n  uploadType: local\n  # 前端访问地址\n  domainUrl:\n    pc: http://localhost:3100\n    app: http://localhost:8051\n  path :\n    #文件上传根目录 设置\n    upload: /opt/upFiles\n    #webapp文件路径\n    webapp: /opt/webapp\n  shiro:\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/bigscreen/category/**,/bigscreen/visual/**,/bigscreen/map/**,/jmreport/bigscreen2/**\n  #阿里云oss存储配置\n  oss:\n    endpoint: oss-cn-beijing.aliyuncs.com\n    accessKey: ??\n    secretKey: ??\n    bucketName: jeecgdev\n    staticDomain: ??\n  # ElasticSearch 6设置\n  elasticsearch:\n    cluster-name: jeecg-ES\n    cluster-nodes: 127.0.0.1:9200\n    check-enabled: false\n  # 表单设计器配置\n  desform:\n    # 主题颜色（仅支持 16进制颜色代码）\n    theme-color: \"#1890ff\"\n    # 文件、图片上传方式，可选项：qiniu（七牛云）、system（跟随系统配置）\n    upload-type: system\n    map:\n      # 配置百度地图的AK，申请地址：https://lbs.baidu.com/apiconsole/key?application=key#/home\n      baidu: ??\n  # 在线预览文件服务器地址配置\n  file-view-domain: 127.0.0.1:8012\n  # minio文件上传\n  minio:\n    minio_url: http://minio.jeecg.com\n    minio_name: ??\n    minio_pass: ??\n    bucketName: otatest\n  #大屏报表参数设置\n  jmreport:\n    saasMode:\n    firewall:\n      dataSourceSafe: false\n      lowCodeMode: dev\n  ai-chat:\n    enabled: false\n    apiKey: \"？？？？\"\n    apiHost: \"https://api.openai.com\"\n    timeout: 60\n  #Wps在线文档\n  wps:\n    domain: https://wwo.wps.cn/office/\n    appid: ??\n    appsecret: ??\n  #xxl-job配置\n  xxljob:\n    enabled: false\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n    appname: ${spring.application.name}\n    accessToken: ''''\n    logPath: logs/jeecg/job/jobhandler/\n    logRetentionDays: 30\n  #分布式锁配置\n  redisson:\n    address: jeecg-boot-redis:6379\n    password:\n    type: STANDALONE\n    enabled: true\n#Mybatis输出sql日志\nlogging:\n  level:\n    org.jeecg.modules.system.mapper: info\n#cas单点登录\ncas:\n  prefixUrl: http://localhost:8888/cas\n#swagger\nknife4j:\n  enable: true\n  #开启生产环境屏蔽\n  production: false\n  basic:\n    enable: false\n    username: jeecg\n    password: jeecg1314\n\n#第三方登录\njustauth:\n  enabled: true\n  type:\n    GITHUB:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n    WECHAT_ENTERPRISE:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n      agent-id: 1000002\n    DINGTALK:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n  cache:\n    type: default\n    prefix: ''demo::''\n    timeout: 1h\n#第三方APP对接\nthird-app:\n  enabled: false\n  type:\n    #企业微信\n    WECHAT_ENTERPRISE:\n      enabled: false\n      #CORP_ID\n      client-id: ??\n      #SECRET\n      client-secret: ??\n      agent-id: ??\n      #自建应用秘钥（新版企微需要配置）\n      # agent-app-secret: ??\n    #钉钉\n    DINGTALK:\n      enabled: false\n      # appKey\n      client-id: ??\n      # appSecret\n      client-secret: ??\n      agent-id: ??','350e31a280673586f2203956da576136',TO_DATE('2024-07-09 14:30:05','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:30:06','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','I','','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(0,4,'jeecg.yaml','DEFAULT_GROUP','','server:\n  tomcat:\n    max-swallow-size: -1\n  error:\n    include-exception: true\n    include-stacktrace: ALWAYS\n    include-message: ALWAYS\n  compression:\n    enabled: true\n    min-response-size: 1024\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\nmanagement:\n  health:\n    mail:\n      enabled: false\n  endpoints:\n    web:\n      exposure:\n        include: \"*\" #暴露所有节点\n    health:\n      sensitive: true #关闭过滤敏感信息\n  endpoint:\n    health:\n      show-details: ALWAYS  #显示详细信息\nflowable:\n  # 自动部署验证设置:true-开启（默认）、false-关闭\n  check-process-definitions: false\n  #配置项可以设置流程引擎启动和关闭时数据库执行的策略\n  database-schema-update: false\n  #保存历史数据级别设置为full最高级别，便于历史数据的追溯\n  history-level: full\n  #开启定时任务\n  async-executor-activate: true\nspring:\n  servlet:\n    multipart:\n      max-file-size: 10MB\n      max-request-size: 10MB\n  mail:\n    host: smtp.163.com\n    username: jeecgos@163.com\n    password: ??\n    properties:\n      mail:\n        smtp:\n          auth: true\n          starttls:\n            enable: true\n            required: true\n  ## quartz定时任务,采用数据库方式\n  quartz:\n    job-store-type: jdbc\n    initialize-schema: embedded\n    #设置自动启动，默认为 true\n    auto-startup: false\n    #延迟1秒启动定时任务\n    startup-delay: 1s\n    #启动时更新己存在的Job\n    overwrite-existing-jobs: true\n    properties:\n      org:\n        quartz:\n          scheduler:\n            instanceName: MyScheduler\n            instanceId: AUTO\n          jobStore:\n            #class: org.quartz.impl.jdbcjobstore.JobStoreTX\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n            tablePrefix: QRTZ_\n            isClustered: true\n            misfireThreshold: 12000\n            clusterCheckinInterval: 15000\n          threadPool:\n            class: org.quartz.simpl.SimpleThreadPool\n            threadCount: 10\n            threadPriority: 5\n            threadsInheritContextClassLoaderOfInitializingThread: true\n  #json 时间戳统一转换\n  jackson:\n    date-format: yyyy-MM-dd HH:mm:ss\n    time-zone: GMT+8\n  aop:\n    proxy-target-class: true\n  jpa:\n    open-in-view: false\n  #配置freemarker\n  freemarker:\n    # 设置模板后缀名\n    suffix: .ftl\n    # 设置文档类型\n    content-type: text/html\n    # 设置页面编码格式\n    charset: UTF-8\n    # 设置页面缓存\n    cache: false\n    prefer-file-system-access: false\n    # 设置ftl文件路径\n    template-loader-path:\n      - classpath:/templates\n    template_update_delay: 0\n  # 设置静态文件路径，js,css等\n  mvc:\n    static-path-pattern: /**\n    #Spring Boot 2.6+ 手动指定为ant-path-matcher\n    pathmatch:\n      matching-strategy: ant_path_matcher\n  resource:\n    static-locations: classpath:/static/,classpath:/public/\n  autoconfigure:\n    exclude:\n      - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\n#mybatis plus 设置\nmybatis-plus:\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n  global-config:\n    # 关闭MP3.0自带的banner\n    banner: false\n    db-config:\n      #主键类型  0:\"数据库ID自增\",1:\"该类型为未设置主键类型\", 2:\"用户输入ID\",3:\"全局唯一ID (数字类型唯一ID)\", 4:\"全局唯一ID UUID\",5:\"字符串全局唯一ID (idWorker 的字符串表示)\";\n      id-type: ASSIGN_ID\n      # 默认数据库表下划线命名\n      table-underline: true\n  configuration:\n    # 这个配置会将执行的sql打印出来，在开发或测试的时候可以用\n    #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n    # 返回类型为Map,显示null对应的字段\n    call-setters-on-nulls: true','94755a848afefef22e34ff83668ec4f7',TO_DATE('2024-07-09 14:30:05','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:30:07','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','I','','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(0,5,'jeecg-gateway-router.json','DEFAULT_GROUP','','[{\n  \"id\": \"jeecg-system\",\n  \"order\": 0,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/sys/**\",\n      \"_genkey_1\": \"/eoa/**\",\n      \"_genkey_2\": \"/joa/**\",\n      \"_genkey_3\": \"/jmreport/**\",\n      \"_genkey_4\": \"/bigscreen/**\",\n      \"_genkey_5\": \"/desform/**\",\n      \"_genkey_6\": \"/online/**\",\n      \"_genkey_8\": \"/act/**\",\n      \"_genkey_9\": \"/plug-in/**\",\n      \"_genkey_10\": \"/generic/**\",\n      \"_genkey_11\": \"/v1/**\",\n      \"_genkey_12\": \"/desflow/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb://jeecg-system\"\n}, {\n  \"id\": \"jeecg-demo\",\n  \"order\": 1,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/mock/**\",\n      \"_genkey_1\": \"/test/**\",\n      \"_genkey_2\": \"/bigscreen/template1/**\",\n      \"_genkey_3\": \"/bigscreen/template2/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb://jeecg-demo\"\n}, {\n  \"id\": \"jeecg-system-websocket\",\n  \"order\": 2,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/websocket/**\",\n      \"_genkey_1\": \"/eoaSocket/**\",\n      \"_genkey_2\": \"/newsWebsocket/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb:ws://jeecg-system\"\n}, {\n  \"id\": \"jeecg-demo-websocket\",\n  \"order\": 3,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/vxeSocket/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb:ws://jeecg-demo\"\n}]','c9eff51f264ebe266c07ad1c5b6778e2',TO_DATE('2024-07-09 14:30:05','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:30:07','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','I','','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(0,6,'jeecg-gateway-dev.yaml','DEFAULT_GROUP','','jeecg:\n  route:\n    config:\n      #路由加载模式： database、nacos、yml\n      data-type: database\n      #Nacos模式，读取配置文件jeecg-gateway-router.json(固定)\n      group: DEFAULT_GROUP\n      data-id: jeecg-gateway-router\nspring:\n  #redis配置\n  redis:\n    database: 0\n    host: jeecg-boot-redis\n    port: 6379\n    password:\n#swagger\nknife4j:\n  #开启生产环境屏蔽\n  production: false','8fea1277e460b477987521aecf432150',TO_DATE('2024-07-09 14:30:05','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:30:07','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','I','','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(0,7,'jeecg-sharding.yaml','DEFAULT_GROUP','','spring:\n  shardingsphere:\n    datasource:\n      names: ds0\n      ds0:\n        driverClassName: com.mysql.cj.jdbc.Driver\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n        username: root\n        password: root\n        type: com.alibaba.druid.pool.DruidDataSource\n    props:\n      sql-show: true\n    rules:\n      sharding:\n        binding-tables: sys_log\n        key-generators:\n          snowflake:\n            type: SNOWFLAKE\n            props:\n              worker-id: 123\n        sharding-algorithms:\n          table-classbased:\n            props:\n              strategy: standard\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n            type: CLASS_BASED\n        tables:\n          sys_log:\n            actual-data-nodes: ds0.sys_log$->{0..1}\n            table-strategy:\n              standard:\n                sharding-algorithm-name: table-classbased\n                sharding-column: log_type','5d7aad99a23e68589e93facd1b221aea',TO_DATE('2024-07-09 14:30:05','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:30:07','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','I','','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(0,8,'jeecg-sharding-multi.yaml','DEFAULT_GROUP','','spring:\n  shardingsphere:\n    datasource:\n      names: ds0,ds1\n      ds0:\n        driverClassName: com.mysql.cj.jdbc.Driver\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n        type: com.alibaba.druid.pool.DruidDataSource\n        username: root\n        password: root\n      ds1:\n        driverClassName: com.mysql.cj.jdbc.Driver\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot2?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n        type: com.alibaba.druid.pool.DruidDataSource\n        username: root\n        password: root\n    props:\n      sql-show: true\n    rules:\n      replica-query:\n        load-balancers:\n          round-robin:\n            type: ROUND_ROBIN\n            props:\n              default: 0\n        data-sources:\n          prds:\n            primary-data-source-name: ds0\n            replica-data-source-names: ds1\n            load-balancer-name: round_robin\n      sharding:\n        binding-tables:\n          - sys_log\n        key-generators:\n          snowflake:\n            type: SNOWFLAKE\n            props:\n              worker-id: 123\n        sharding-algorithms:\n          table-classbased:\n            props:\n              strategy: standard\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n            type: CLASS_BASED\n          database-inline:\n            type: INLINE\n            props:\n              algorithm-expression: ds$->{operate_type % 2}\n        tables:\n          sys_log:\n            actual-data-nodes: ds$->{0..1}.sys_log$->{0..1}\n            database-strategy:\n              standard:\n                sharding-column: operate_type\n                sharding-algorithm-name: database-inline\n            table-strategy:\n              standard:\n                sharding-algorithm-name: table-classbased\n                sharding-column: log_type','ef2f42fb2dda43cd0d4397a820f3144e',TO_DATE('2024-07-09 14:30:05','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:30:07','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','I','','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(0,9,'jeecg-dev.yaml','DEFAULT_GROUP','','spring:\n  datasource:\n    druid:\n      stat-view-servlet:\n        enabled: true\n        loginUsername: admin\n        loginPassword: 123456\n        allow:\n      web-stat-filter:\n        enabled: true\n    dynamic:\n      druid:\n        initial-size: 5\n        min-idle: 5\n        maxActive: 20\n        maxWait: 60000\n        timeBetweenEvictionRunsMillis: 60000\n        minEvictableIdleTimeMillis: 300000\n        validationQuery: SELECT 1 FROM DUAL\n        testWhileIdle: true\n        testOnBorrow: false\n        testOnReturn: false\n        poolPreparedStatements: true\n        maxPoolPreparedStatementPerConnectionSize: 20\n        filters: stat,wall,slf4j\n        wall:\n          selectWhereAlwayTrueCheck: false\n        stat:\n          merge-sql: true\n          slow-sql-millis: 5000\n      datasource:\n        master:\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n          username: root\n          password: root\n          driver-class-name: com.mysql.cj.jdbc.Driver\n  redis:\n    database: 0\n    host: jeecg-boot-redis\n    password:\n    port: 6379\n  rabbitmq:\n    host: jeecg-boot-rabbitmq\n    username: guest\n    password: guest\n    port: 5672\n    publisher-confirms: true\n    publisher-returns: true\n    virtual-host: /\n    listener:\n      simple:\n        acknowledge-mode: manual\n        concurrency: 1\n        max-concurrency: 1\n        retry:\n          enabled: true\n  flyway:\n    enabled: false\n    encoding: UTF-8\n    locations: classpath:flyway/sql/mysql\n    sql-migration-prefix: V\n    sql-migration-separator: __\n    placeholder-prefix: ''#(''\n    placeholder-suffix: )\n    sql-migration-suffixes: .sql\n    validate-on-migrate: true\n    baseline-on-migrate: true\n    clean-disabled: true\nminidao:\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n  firewall:\n    dataSourceSafe: false\n    lowCodeMode: dev\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys,/sys/sendChangePwdSms,/sys/user/sendChangePhoneSms,/sys/sms,/desform/api/sendVerifyCode\n  uploadType: local\n  domainUrl:\n    pc: http://localhost:3100\n    app: http://localhost:8051\n  path:\n    upload: /opt/upFiles\n    webapp: /opt/webapp\n  shiro:\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n  oss:\n    endpoint: oss-cn-beijing.aliyuncs.com\n    accessKey: ??\n    secretKey: ??\n    bucketName: jeecgdev\n    staticDomain: ??\n  elasticsearch:\n    cluster-name: jeecg-ES\n    cluster-nodes: jeecg-boot-es:9200\n    check-enabled: false\n  file-view-domain: 127.0.0.1:8012\n  minio:\n    minio_url: http://minio.jeecg.com\n    minio_name: ??\n    minio_pass: ??\n    bucketName: otatest\n  jmreport:\n    saasMode:\n    firewall:\n      dataSourceSafe: false\n      lowCodeMode: dev\n  wps:\n    domain: https://wwo.wps.cn/office/\n    appid: ??\n    appsecret: ??\n  xxljob:\n    enabled: true\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n    appname: ${spring.application.name}\n    accessToken: ''''\n    logPath: logs/jeecg/job/jobhandler/\n    logRetentionDays: 30\n  redisson:\n    address: jeecg-boot-redis:6379\n    password:\n    type: STANDALONE\n    enabled: true\n  ai-chat:\n    enabled: false\n    apiKey: \"？？？？\"\n    apiHost: \"https://api.openai.com\"\n    timeout: 60\nlogging:\n  level:\n    org.jeecg.modules.system.mapper : info\ncas:\n  prefixUrl: http://localhost:8888/cas\nknife4j:\n  production: false\n  basic:\n    enable: false\n    username: jeecg\n    password: jeecg1314\njustauth:\n  enabled: true\n  type:\n    GITHUB:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n    WECHAT_ENTERPRISE:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n      agent-id: ??\n    DINGTALK:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n  cache:\n    type: default\n    prefix: ''demo::''\n    timeout: 1h\nthird-app:\n  enabled: false\n  type:\n    WECHAT_ENTERPRISE:\n      enabled: false\n      client-id: ??\n      client-secret: ??\n      agent-id: ??\n    DINGTALK:\n      enabled: false\n      client-id: ??\n      client-secret: ??\n      agent-id: ??','822f70f7a278a503a02568186582ceaa',TO_DATE('2024-07-09 14:30:19','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:30:20','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','I','springboot3','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(0,10,'jeecg.yaml','DEFAULT_GROUP','','server:\n  tomcat:\n    max-swallow-size: -1\n  error:\n    include-exception: true\n    include-stacktrace: ALWAYS\n    include-message: ALWAYS\n  compression:\n    enabled: true\n    min-response-size: 1024\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\nmanagement:\n  health:\n    mail:\n      enabled: false\n  endpoints:\n    web:\n      exposure:\n        include: \"*\"\n    health:\n      sensitive: true\n  endpoint:\n    health:\n      show-details: ALWAYS\nspring:\n  servlet:\n    multipart:\n      max-file-size: 10MB\n      max-request-size: 10MB\n  mail:\n    host: smtp.163.com\n    username: jeecgos@163.com\n    password: ??\n    properties:\n      mail:\n        smtp:\n          auth: true\n          starttls:\n            enable: true\n            required: true\n  quartz:\n    job-store-type: jdbc\n    initialize-schema: embedded\n    auto-startup: false\n    startup-delay: 1s\n    overwrite-existing-jobs: true\n    properties:\n      org:\n        quartz:\n          scheduler:\n            instanceName: MyScheduler\n            instanceId: AUTO\n          jobStore:\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n            tablePrefix: QRTZ_\n            isClustered: true\n            misfireThreshold: 12000\n            clusterCheckinInterval: 15000\n          threadPool:\n            class: org.quartz.simpl.SimpleThreadPool\n            threadCount: 10\n            threadPriority: 5\n            threadsInheritContextClassLoaderOfInitializingThread: true\n  jackson:\n    date-format: yyyy-MM-dd HH:mm:ss\n    time-zone: GMT+8\n  aop:\n    proxy-target-class: true\n  activiti:\n    check-process-definitions: false\n    async-executor-activate: false\n    job-executor-activate: false\n  jpa:\n    open-in-view: false\n  freemarker:\n    suffix: .ftl\n    content-type: text/html\n    charset: UTF-8\n    cache: false\n    prefer-file-system-access: false\n    template-loader-path:\n      - classpath:/templates\n  mvc:\n    static-path-pattern: /**\n    pathmatch:\n      matching-strategy: ant_path_matcher\n  resource:\n    static-locations: classpath:/static/,classpath:/public/\n  autoconfigure:\n    exclude:\n      - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\nmybatis-plus:\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n  global-config:\n    banner: false\n    db-config:\n      id-type: ASSIGN_ID\n      table-underline: true\n  configuration:\n    call-setters-on-nulls: true','94dbdad61f7e2e3ace5a4fc07bb8c2a2',TO_DATE('2024-07-09 14:30:19','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:30:20','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','I','springboot3','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(0,11,'jeecg-gateway-router.json','DEFAULT_GROUP','','[{\n  \"id\": \"jeecg-system\",\n  \"order\": 0,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/sys/**\",\n      \"_genkey_1\": \"/jmreport/**\",\n      \"_genkey_3\": \"/online/**\",\n      \"_genkey_4\": \"/generic/**\",\n      \"_genkey_5\": \"/drag/**\",\n      \"_genkey_6\": \"/actuator/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb://jeecg-system\"\n}, {\n  \"id\": \"jeecg-demo\",\n  \"order\": 1,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/mock/**\",\n      \"_genkey_1\": \"/test/**\",\n      \"_genkey_2\": \"/bigscreen/template1/**\",\n      \"_genkey_3\": \"/bigscreen/template2/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb://jeecg-demo\"\n}, {\n  \"id\": \"jeecg-system-websocket\",\n  \"order\": 2,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/websocket/**\",\n      \"_genkey_1\": \"/newsWebsocket/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb:ws://jeecg-system\"\n}, {\n  \"id\": \"jeecg-demo-websocket\",\n  \"order\": 3,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/vxeSocket/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb:ws://jeecg-demo\"\n}]','708c0948118bdb96bdfaa87200a14432',TO_DATE('2024-07-09 14:30:19','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:30:20','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','I','springboot3','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(0,12,'jeecg-sharding.yaml','DEFAULT_GROUP','','spring:\n  shardingsphere:\n    datasource:\n      names: ds0\n      ds0:\n        driverClassName: com.mysql.cj.jdbc.Driver\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n        username: root\n        password: root\n        type: com.alibaba.druid.pool.DruidDataSource\n    props:\n      sql-show: true\n    rules:\n      sharding:\n        binding-tables: sys_log\n        key-generators:\n          snowflake:\n            type: SNOWFLAKE\n            props:\n              worker-id: 123\n        sharding-algorithms:\n          table-classbased:\n            props:\n              strategy: standard\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n            type: CLASS_BASED\n        tables:\n          sys_log:\n            actual-data-nodes: ds0.sys_log$->{0..1}\n            table-strategy:\n              standard:\n                sharding-algorithm-name: table-classbased\n                sharding-column: log_type','a93fa455c32cd37ca84631d2bbe13005',TO_DATE('2024-07-09 14:30:19','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:30:20','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','I','springboot3','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(0,13,'jeecg-gateway-dev.yaml','DEFAULT_GROUP','','jeecg:\n  route:\n    config:\n      #type:database nacos yml\n      data-type: database\n      data-id: jeecg-gateway-router\nspring:\n  redis:\n    database: 0\n    host: jeecg-boot-redis\n    port: 6379\n    password:\nknife4j:\n  production: false','98e211c54b43a73f7189d92f1c77f815',TO_DATE('2024-07-09 14:30:19','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:30:20','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','I','springboot3','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(0,14,'jeecg-sharding-multi.yaml','DEFAULT_GROUP','','spring:\n  shardingsphere:\n    datasource:\n      names: ds0,ds1\n      ds0:\n        driverClassName: com.mysql.cj.jdbc.Driver\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n        type: com.alibaba.druid.pool.DruidDataSource\n        username: root\n        password: root\n      ds1:\n        driverClassName: com.mysql.cj.jdbc.Driver\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot2?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n        type: com.alibaba.druid.pool.DruidDataSource\n        username: root\n        password: root\n    props:\n      sql-show: true\n    rules:\n      replica-query:\n        load-balancers:\n          round-robin:\n            type: ROUND_ROBIN\n            props:\n              default: 0\n        data-sources:\n          prds:\n            primary-data-source-name: ds0\n            replica-data-source-names: ds1\n            load-balancer-name: round_robin\n      sharding:\n        binding-tables:\n          - sys_log\n        key-generators:\n          snowflake:\n            type: SNOWFLAKE\n            props:\n              worker-id: 123\n        sharding-algorithms:\n          table-classbased:\n            props:\n              strategy: standard\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n            type: CLASS_BASED\n          database-inline:\n            type: INLINE\n            props:\n              algorithm-expression: ds$->{operate_type % 2}\n        tables:\n          sys_log:\n            actual-data-nodes: ds$->{0..1}.sys_log$->{0..1}\n            database-strategy:\n              standard:\n                sharding-column: operate_type\n                sharding-algorithm-name: database-inline\n            table-strategy:\n              standard:\n                sharding-algorithm-name: table-classbased\n                sharding-column: log_type','0fc2b030ca8c0008f148c84ecbd2a8c7',TO_DATE('2024-07-09 14:30:19','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:30:20','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','I','springboot3','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(8,15,'jeecg-dev.yaml','DEFAULT_GROUP','','spring:\n  datasource:\n    druid:\n      stat-view-servlet:\n        enabled: true\n        loginUsername: admin\n        loginPassword: 123456\n        allow:\n      web-stat-filter:\n        enabled: true\n    dynamic:\n      druid:\n        initial-size: 5\n        min-idle: 5\n        maxActive: 20\n        maxWait: 60000\n        timeBetweenEvictionRunsMillis: 60000\n        minEvictableIdleTimeMillis: 300000\n        validationQuery: SELECT 1 FROM DUAL\n        testWhileIdle: true\n        testOnBorrow: false\n        testOnReturn: false\n        poolPreparedStatements: true\n        maxPoolPreparedStatementPerConnectionSize: 20\n        filters: stat,wall,slf4j\n        wall:\n          selectWhereAlwayTrueCheck: false\n        stat:\n          merge-sql: true\n          slow-sql-millis: 5000\n      datasource:\n        master:\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n          username: root\n          password: root\n          driver-class-name: com.mysql.cj.jdbc.Driver\n  redis:\n    database: 0\n    host: jeecg-boot-redis\n    password:\n    port: 6379\n  rabbitmq:\n    host: jeecg-boot-rabbitmq\n    username: guest\n    password: guest\n    port: 5672\n    publisher-confirms: true\n    publisher-returns: true\n    virtual-host: /\n    listener:\n      simple:\n        acknowledge-mode: manual\n        concurrency: 1\n        max-concurrency: 1\n        retry:\n          enabled: true\n  flyway:\n    enabled: false\n    encoding: UTF-8\n    locations: classpath:flyway/sql/mysql\n    sql-migration-prefix: V\n    sql-migration-separator: __\n    placeholder-prefix: ''#(''\n    placeholder-suffix: )\n    sql-migration-suffixes: .sql\n    validate-on-migrate: true\n    baseline-on-migrate: true\n    clean-disabled: true\nminidao:\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n  firewall:\n    dataSourceSafe: false\n    lowCodeMode: dev\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys,/sys/sendChangePwdSms,/sys/user/sendChangePhoneSms,/sys/sms,/desform/api/sendVerifyCode\n  uploadType: local\n  domainUrl:\n    pc: http://localhost:3100\n    app: http://localhost:8051\n  path:\n    upload: /opt/upFiles\n    webapp: /opt/webapp\n  shiro:\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n  oss:\n    endpoint: oss-cn-beijing.aliyuncs.com\n    accessKey: ??\n    secretKey: ??\n    bucketName: jeecgdev\n    staticDomain: ??\n  elasticsearch:\n    cluster-name: jeecg-ES\n    cluster-nodes: jeecg-boot-es:9200\n    check-enabled: false\n  file-view-domain: 127.0.0.1:8012\n  minio:\n    minio_url: http://minio.jeecg.com\n    minio_name: ??\n    minio_pass: ??\n    bucketName: otatest\n  jmreport:\n    saasMode:\n    firewall:\n      dataSourceSafe: false\n      lowCodeMode: dev\n  wps:\n    domain: https://wwo.wps.cn/office/\n    appid: ??\n    appsecret: ??\n  xxljob:\n    enabled: true\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n    appname: ${spring.application.name}\n    accessToken: ''''\n    logPath: logs/jeecg/job/jobhandler/\n    logRetentionDays: 30\n  redisson:\n    address: jeecg-boot-redis:6379\n    password:\n    type: STANDALONE\n    enabled: true\n  ai-chat:\n    enabled: false\n    apiKey: \"？？？？\"\n    apiHost: \"https://api.openai.com\"\n    timeout: 60\nlogging:\n  level:\n    org.jeecg.modules.system.mapper : info\ncas:\n  prefixUrl: http://localhost:8888/cas\nknife4j:\n  production: false\n  basic:\n    enable: false\n    username: jeecg\n    password: jeecg1314\njustauth:\n  enabled: true\n  type:\n    GITHUB:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n    WECHAT_ENTERPRISE:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n      agent-id: ??\n    DINGTALK:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n  cache:\n    type: default\n    prefix: ''demo::''\n    timeout: 1h\nthird-app:\n  enabled: false\n  type:\n    WECHAT_ENTERPRISE:\n      enabled: false\n      client-id: ??\n      client-secret: ??\n      agent-id: ??\n    DINGTALK:\n      enabled: false\n      client-id: ??\n      client-secret: ??\n      agent-id: ??','822f70f7a278a503a02568186582ceaa',TO_DATE('2024-07-09 14:34:25','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:34:27','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','D','springboot3','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(9,16,'jeecg.yaml','DEFAULT_GROUP','','server:\n  tomcat:\n    max-swallow-size: -1\n  error:\n    include-exception: true\n    include-stacktrace: ALWAYS\n    include-message: ALWAYS\n  compression:\n    enabled: true\n    min-response-size: 1024\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\nmanagement:\n  health:\n    mail:\n      enabled: false\n  endpoints:\n    web:\n      exposure:\n        include: \"*\"\n    health:\n      sensitive: true\n  endpoint:\n    health:\n      show-details: ALWAYS\nspring:\n  servlet:\n    multipart:\n      max-file-size: 10MB\n      max-request-size: 10MB\n  mail:\n    host: smtp.163.com\n    username: jeecgos@163.com\n    password: ??\n    properties:\n      mail:\n        smtp:\n          auth: true\n          starttls:\n            enable: true\n            required: true\n  quartz:\n    job-store-type: jdbc\n    initialize-schema: embedded\n    auto-startup: false\n    startup-delay: 1s\n    overwrite-existing-jobs: true\n    properties:\n      org:\n        quartz:\n          scheduler:\n            instanceName: MyScheduler\n            instanceId: AUTO\n          jobStore:\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n            tablePrefix: QRTZ_\n            isClustered: true\n            misfireThreshold: 12000\n            clusterCheckinInterval: 15000\n          threadPool:\n            class: org.quartz.simpl.SimpleThreadPool\n            threadCount: 10\n            threadPriority: 5\n            threadsInheritContextClassLoaderOfInitializingThread: true\n  jackson:\n    date-format: yyyy-MM-dd HH:mm:ss\n    time-zone: GMT+8\n  aop:\n    proxy-target-class: true\n  activiti:\n    check-process-definitions: false\n    async-executor-activate: false\n    job-executor-activate: false\n  jpa:\n    open-in-view: false\n  freemarker:\n    suffix: .ftl\n    content-type: text/html\n    charset: UTF-8\n    cache: false\n    prefer-file-system-access: false\n    template-loader-path:\n      - classpath:/templates\n  mvc:\n    static-path-pattern: /**\n    pathmatch:\n      matching-strategy: ant_path_matcher\n  resource:\n    static-locations: classpath:/static/,classpath:/public/\n  autoconfigure:\n    exclude:\n      - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\nmybatis-plus:\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n  global-config:\n    banner: false\n    db-config:\n      id-type: ASSIGN_ID\n      table-underline: true\n  configuration:\n    call-setters-on-nulls: true','94dbdad61f7e2e3ace5a4fc07bb8c2a2',TO_DATE('2024-07-09 14:34:25','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:34:27','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','D','springboot3','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(10,17,'jeecg-gateway-router.json','DEFAULT_GROUP','','[{\n  \"id\": \"jeecg-system\",\n  \"order\": 0,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/sys/**\",\n      \"_genkey_1\": \"/jmreport/**\",\n      \"_genkey_3\": \"/online/**\",\n      \"_genkey_4\": \"/generic/**\",\n      \"_genkey_5\": \"/drag/**\",\n      \"_genkey_6\": \"/actuator/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb://jeecg-system\"\n}, {\n  \"id\": \"jeecg-demo\",\n  \"order\": 1,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/mock/**\",\n      \"_genkey_1\": \"/test/**\",\n      \"_genkey_2\": \"/bigscreen/template1/**\",\n      \"_genkey_3\": \"/bigscreen/template2/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb://jeecg-demo\"\n}, {\n  \"id\": \"jeecg-system-websocket\",\n  \"order\": 2,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/websocket/**\",\n      \"_genkey_1\": \"/newsWebsocket/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb:ws://jeecg-system\"\n}, {\n  \"id\": \"jeecg-demo-websocket\",\n  \"order\": 3,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/vxeSocket/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb:ws://jeecg-demo\"\n}]','708c0948118bdb96bdfaa87200a14432',TO_DATE('2024-07-09 14:34:25','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:34:27','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','D','springboot3','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(11,18,'jeecg-sharding.yaml','DEFAULT_GROUP','','spring:\n  shardingsphere:\n    datasource:\n      names: ds0\n      ds0:\n        driverClassName: com.mysql.cj.jdbc.Driver\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n        username: root\n        password: root\n        type: com.alibaba.druid.pool.DruidDataSource\n    props:\n      sql-show: true\n    rules:\n      sharding:\n        binding-tables: sys_log\n        key-generators:\n          snowflake:\n            type: SNOWFLAKE\n            props:\n              worker-id: 123\n        sharding-algorithms:\n          table-classbased:\n            props:\n              strategy: standard\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n            type: CLASS_BASED\n        tables:\n          sys_log:\n            actual-data-nodes: ds0.sys_log$->{0..1}\n            table-strategy:\n              standard:\n                sharding-algorithm-name: table-classbased\n                sharding-column: log_type','a93fa455c32cd37ca84631d2bbe13005',TO_DATE('2024-07-09 14:34:25','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:34:27','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','D','springboot3','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(12,19,'jeecg-gateway-dev.yaml','DEFAULT_GROUP','','jeecg:\n  route:\n    config:\n      #type:database nacos yml\n      data-type: database\n      data-id: jeecg-gateway-router\nspring:\n  redis:\n    database: 0\n    host: jeecg-boot-redis\n    port: 6379\n    password:\nknife4j:\n  production: false','98e211c54b43a73f7189d92f1c77f815',TO_DATE('2024-07-09 14:34:25','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:34:27','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','D','springboot3','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(13,20,'jeecg-sharding-multi.yaml','DEFAULT_GROUP','','spring:\n  shardingsphere:\n    datasource:\n      names: ds0,ds1\n      ds0:\n        driverClassName: com.mysql.cj.jdbc.Driver\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n        type: com.alibaba.druid.pool.DruidDataSource\n        username: root\n        password: root\n      ds1:\n        driverClassName: com.mysql.cj.jdbc.Driver\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot2?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n        type: com.alibaba.druid.pool.DruidDataSource\n        username: root\n        password: root\n    props:\n      sql-show: true\n    rules:\n      replica-query:\n        load-balancers:\n          round-robin:\n            type: ROUND_ROBIN\n            props:\n              default: 0\n        data-sources:\n          prds:\n            primary-data-source-name: ds0\n            replica-data-source-names: ds1\n            load-balancer-name: round_robin\n      sharding:\n        binding-tables:\n          - sys_log\n        key-generators:\n          snowflake:\n            type: SNOWFLAKE\n            props:\n              worker-id: 123\n        sharding-algorithms:\n          table-classbased:\n            props:\n              strategy: standard\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n            type: CLASS_BASED\n          database-inline:\n            type: INLINE\n            props:\n              algorithm-expression: ds$->{operate_type % 2}\n        tables:\n          sys_log:\n            actual-data-nodes: ds$->{0..1}.sys_log$->{0..1}\n            database-strategy:\n              standard:\n                sharding-column: operate_type\n                sharding-algorithm-name: database-inline\n            table-strategy:\n              standard:\n                sharding-algorithm-name: table-classbased\n                sharding-column: log_type','0fc2b030ca8c0008f148c84ecbd2a8c7',TO_DATE('2024-07-09 14:34:25','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:34:27','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','D','springboot3','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(0,21,'jeecg-dev.yaml','DEFAULT_GROUP','','spring:\n  datasource:\n    druid:\n      stat-view-servlet:\n        enabled: true\n        loginUsername: admin\n        loginPassword: 123456\n        allow:\n      web-stat-filter:\n        enabled: true\n    dynamic:\n      druid:\n        initial-size: 5\n        min-idle: 5\n        maxActive: 20\n        maxWait: 60000\n        timeBetweenEvictionRunsMillis: 60000\n        minEvictableIdleTimeMillis: 300000\n        validationQuery: SELECT 1 FROM DUAL\n        testWhileIdle: true\n        testOnBorrow: false\n        testOnReturn: false\n        poolPreparedStatements: true\n        maxPoolPreparedStatementPerConnectionSize: 20\n        filters: stat,wall,slf4j\n        wall:\n          selectWhereAlwayTrueCheck: false\n        stat:\n          merge-sql: true\n          slow-sql-millis: 5000\n      datasource:\n        master:\n          url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai\n          username: root\n          password: root\n          driver-class-name: com.mysql.cj.jdbc.Driver\n  data:\n    redis:\n      database: 0\n      host: jeecg-boot-redis\n      password:\n      port: 6379\n  rabbitmq:\n    host: jeecg-boot-rabbitmq\n    username: guest\n    password: guest\n    port: 5672\n    publisher-confirms: true\n    publisher-returns: true\n    virtual-host: /\n    listener:\n      simple:\n        acknowledge-mode: manual\n        concurrency: 1\n        max-concurrency: 1\n        retry:\n          enabled: true\n  flyway:\n    enabled: false\n    encoding: UTF-8\n    locations: classpath:flyway/sql/mysql\n    sql-migration-prefix: V\n    sql-migration-separator: __\n    placeholder-prefix: ''#(''\n    placeholder-suffix: )\n    sql-migration-suffixes: .sql\n    validate-on-migrate: true\n    baseline-on-migrate: true\n    clean-disabled: true\nminidao:\n  base-package: org.jeecg.modules.jmreport.*,org.jeecg.modules.drag.*\njeecg:\n  firewall:\n    dataSourceSafe: false\n    lowCodeMode: dev\n  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a\n  signUrls: /sys/dict/getDictItems/*,/sys/dict/loadDict/*,/sys/dict/loadDictOrderByValue/*,/sys/dict/loadDictItem/*,/sys/dict/loadTreeData,/sys/api/queryTableDictItemsByCode,/sys/api/queryFilterTableDictInfo,/sys/api/queryTableDictByKeys,/sys/api/translateDictFromTable,/sys/api/translateDictFromTableByKeys\n  uploadType: local\n  domainUrl:\n    pc: http://localhost:3100\n    app: http://localhost:8051\n  path:\n    upload: /opt/upFiles\n    webapp: /opt/webapp\n  shiro:\n    excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/category/**,/visual/**,/map/**,/jmreport/bigscreen2/**\n  oss:\n    endpoint: oss-cn-beijing.aliyuncs.com\n    accessKey: ??\n    secretKey: ??\n    bucketName: jeecgdev\n    staticDomain: ??\n  elasticsearch:\n    cluster-name: jeecg-ES\n    cluster-nodes: jeecg-boot-es:9200\n    check-enabled: false\n  file-view-domain: 127.0.0.1:8012\n  minio:\n    minio_url: http://minio.jeecg.com\n    minio_name: ??\n    minio_pass: ??\n    bucketName: otatest\n  jmreport:\n    saasMode:\n    firewall:\n      dataSourceSafe: false\n      lowCodeMode: dev\n  wps:\n    domain: https://wwo.wps.cn/office/\n    appid: ??\n    appsecret: ??\n  xxljob:\n    enabled: false\n    adminAddresses: http://jeecg-boot-xxljob:9080/xxl-job-admin\n    appname: ${spring.application.name}\n    accessToken: ''''\n    logPath: logs/jeecg/job/jobhandler/\n    logRetentionDays: 30\n  redisson:\n    address: jeecg-boot-redis:6379\n    password:\n    type: STANDALONE\n    enabled: true\n  ai-chat:\n    enabled: false\n    apiKey: \"？？？？\"\n    apiHost: \"https://api.openai.com\"\n    timeout: 60\nlogging:\n  level:\n    org.jeecg.modules.system.mapper : info\ncas:\n  prefixUrl: http://localhost:8888/cas\nknife4j:\n  production: false\n  basic:\n    enable: false\n    username: jeecg\n    password: jeecg1314\njustauth:\n  enabled: true\n  type:\n    GITHUB:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/github/callback\n    WECHAT_ENTERPRISE:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback\n      agent-id: ??\n    DINGTALK:\n      client-id: ??\n      client-secret: ??\n      redirect-uri: http://sso.test.com:8080/jeecg-boot/thirdLogin/dingtalk/callback\n  cache:\n    type: default\n    prefix: ''demo::''\n    timeout: 1h\nthird-app:\n  enabled: false\n  type:\n    WECHAT_ENTERPRISE:\n      enabled: false\n      client-id: ??\n      client-secret: ??\n      agent-id: ??\n    DINGTALK:\n      enabled: false\n      client-id: ??\n      client-secret: ??\n      agent-id: ??','91c29720dfb424916a769201a25200cf',TO_DATE('2024-07-09 14:34:32','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:34:33','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','I','springboot3','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(0,22,'jeecg.yaml','DEFAULT_GROUP','','server:\n  undertow:\n    # max-http-post-size: 10MB\n    worker-threads: 16\n    buffers:\n      websocket: 8192\n      io: 16384\n  error:\n    include-exception: true\n    include-stacktrace: ALWAYS\n    include-message: ALWAYS\n  compression:\n    enabled: true\n    min-response-size: 1024\n    mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*\nmanagement:\n  health:\n    mail:\n      enabled: false\n  endpoints:\n    web:\n      exposure:\n        include: \"*\"\n    health:\n      sensitive: true\n  endpoint:\n    health:\n      show-details: ALWAYS\nspring:\n  servlet:\n    multipart:\n      max-file-size: 10MB\n      max-request-size: 10MB\n  mail:\n    host: smtp.163.com\n    username: jeecgos@163.com\n    password: ??\n    properties:\n      mail:\n        smtp:\n          auth: true\n          starttls:\n            enable: true\n            required: true\n  quartz:\n    job-store-type: jdbc\n    initialize-schema: embedded\n    auto-startup: false\n    startup-delay: 1s\n    overwrite-existing-jobs: true\n    properties:\n      org:\n        quartz:\n          scheduler:\n            instanceName: MyScheduler\n            instanceId: AUTO\n          jobStore:\n            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore\n            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n            tablePrefix: QRTZ_\n            isClustered: true\n            misfireThreshold: 12000\n            clusterCheckinInterval: 15000\n          threadPool:\n            class: org.quartz.simpl.SimpleThreadPool\n            threadCount: 10\n            threadPriority: 5\n            threadsInheritContextClassLoaderOfInitializingThread: true\n  jackson:\n    date-format: yyyy-MM-dd HH:mm:ss\n    time-zone: GMT+8\n  aop:\n    proxy-target-class: true\n  activiti:\n    check-process-definitions: false\n    async-executor-activate: false\n    job-executor-activate: false\n  jpa:\n    open-in-view: false\n  freemarker:\n    suffix: .ftl\n    content-type: text/html\n    charset: UTF-8\n    cache: false\n    prefer-file-system-access: false\n    template-loader-path:\n      - classpath:/templates\n  mvc:\n    static-path-pattern: /**\n    pathmatch:\n      matching-strategy: ant_path_matcher\n  resource:\n    static-locations: classpath:/static/,classpath:/public/\n  autoconfigure:\n    exclude:\n      - com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure\n      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration\nmybatis-plus:\n  mapper-locations: classpath*:org/jeecg/**/xml/*Mapper.xml\n  global-config:\n    banner: false\n    db-config:\n      id-type: ASSIGN_ID\n      table-underline: true\n  configuration:\n    call-setters-on-nulls: true','ce1ca3b6f8431e884aed94ab29be43a9',TO_DATE('2024-07-09 14:34:32','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:34:33','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','I','springboot3','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(0,23,'jeecg-gateway-router.json','DEFAULT_GROUP','','[{\n  \"id\": \"jeecg-system\",\n  \"order\": 0,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/sys/**\",\n      \"_genkey_1\": \"/jmreport/**\",\n      \"_genkey_3\": \"/online/**\",\n      \"_genkey_4\": \"/generic/**\",\n      \"_genkey_5\": \"/oauth2/**\",\n      \"_genkey_6\": \"/drag/**\",\n      \"_genkey_7\": \"/actuator/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb://jeecg-system\"\n}, {\n  \"id\": \"jeecg-demo\",\n  \"order\": 1,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/mock/**\",\n      \"_genkey_1\": \"/test/**\",\n      \"_genkey_2\": \"/bigscreen/template1/**\",\n      \"_genkey_3\": \"/bigscreen/template2/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb://jeecg-demo\"\n}, {\n  \"id\": \"jeecg-system-websocket\",\n  \"order\": 2,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/websocket/**\",\n      \"_genkey_1\": \"/newsWebsocket/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb:ws://jeecg-system\"\n}, {\n  \"id\": \"jeecg-demo-websocket\",\n  \"order\": 3,\n  \"predicates\": [{\n    \"name\": \"Path\",\n    \"args\": {\n      \"_genkey_0\": \"/vxeSocket/**\"\n    }\n  }],\n  \"filters\": [],\n  \"uri\": \"lb:ws://jeecg-demo\"\n}]','9794beb09d30bc6b835f2ee870781587',TO_DATE('2024-07-09 14:34:32','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:34:33','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','I','springboot3','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(0,24,'jeecg-sharding.yaml','DEFAULT_GROUP','','spring:\n  shardingsphere:\n    datasource:\n      names: ds0\n      ds0:\n        driverClassName: com.mysql.cj.jdbc.Driver\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n        username: root\n        password: root\n        type: com.alibaba.druid.pool.DruidDataSource\n    props:\n      sql-show: true\n    rules:\n      sharding:\n        binding-tables: sys_log\n        key-generators:\n          snowflake:\n            type: SNOWFLAKE\n            props:\n              worker-id: 123\n        sharding-algorithms:\n          table-classbased:\n            props:\n              strategy: standard\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n            type: CLASS_BASED\n        tables:\n          sys_log:\n            actual-data-nodes: ds0.sys_log$->{0..1}\n            table-strategy:\n              standard:\n                sharding-algorithm-name: table-classbased\n                sharding-column: log_type','a93fa455c32cd37ca84631d2bbe13005',TO_DATE('2024-07-09 14:34:32','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:34:33','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','I','springboot3','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(0,25,'jeecg-gateway-dev.yaml','DEFAULT_GROUP','','jeecg:\n  route:\n    config:\n      #type:database nacos yml\n      data-type: database\n      data-id: jeecg-gateway-router\nspring:\n  data:\n    redis:\n      database: 0\n      host: jeecg-boot-redis\n      port: 6379\n      password:\nknife4j:\n  production: false','19d7cd93eeb85a582c8a6942d499c7f7',TO_DATE('2024-07-09 14:34:32','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:34:33','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','I','springboot3','');\nINSERT INTO \"NACOS\".\"HIS_CONFIG_INFO\"(\"ID\",\"NID\",\"DATA_ID\",\"GROUP_ID\",\"APP_NAME\",\"CONTENT\",\"MD5\",\"GMT_CREATE\",\"GMT_MODIFIED\",\"SRC_USER\",\"SRC_IP\",\"OP_TYPE\",\"TENANT_ID\",\"ENCRYPTED_DATA_KEY\") VALUES(0,26,'jeecg-sharding-multi.yaml','DEFAULT_GROUP','','spring:\n  shardingsphere:\n    datasource:\n      names: ds0,ds1\n      ds0:\n        driverClassName: com.mysql.cj.jdbc.Driver\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n        type: com.alibaba.druid.pool.DruidDataSource\n        username: root\n        password: root\n      ds1:\n        driverClassName: com.mysql.cj.jdbc.Driver\n        url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot2?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n        type: com.alibaba.druid.pool.DruidDataSource\n        username: root\n        password: root\n    props:\n      sql-show: true\n    rules:\n      replica-query:\n        load-balancers:\n          round-robin:\n            type: ROUND_ROBIN\n            props:\n              default: 0\n        data-sources:\n          prds:\n            primary-data-source-name: ds0\n            replica-data-source-names: ds1\n            load-balancer-name: round_robin\n      sharding:\n        binding-tables:\n          - sys_log\n        key-generators:\n          snowflake:\n            type: SNOWFLAKE\n            props:\n              worker-id: 123\n        sharding-algorithms:\n          table-classbased:\n            props:\n              strategy: standard\n              algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n            type: CLASS_BASED\n          database-inline:\n            type: INLINE\n            props:\n              algorithm-expression: ds$->{operate_type % 2}\n        tables:\n          sys_log:\n            actual-data-nodes: ds$->{0..1}.sys_log$->{0..1}\n            database-strategy:\n              standard:\n                sharding-column: operate_type\n                sharding-algorithm-name: database-inline\n            table-strategy:\n              standard:\n                sharding-algorithm-name: table-classbased\n                sharding-column: log_type','0fc2b030ca8c0008f148c84ecbd2a8c7',TO_DATE('2024-07-09 14:34:32','YYYY-MM-DD HH24:MI:SS.FF'),TO_DATE('2024-07-09 14:34:33','YYYY-MM-DD HH24:MI:SS.FF'),null,'192.168.1.11','I','springboot3','');\n\nSET IDENTITY_INSERT \"NACOS\".\"HIS_CONFIG_INFO\" OFF;\nINSERT INTO \"NACOS\".\"ROLES\"(\"USERNAME\",\"ROLE\") VALUES('nacos','ROLE_ADMIN');\n\nSET IDENTITY_INSERT \"NACOS\".\"TENANT_CAPACITY\" ON;\nSET IDENTITY_INSERT \"NACOS\".\"TENANT_CAPACITY\" OFF;\nSET IDENTITY_INSERT \"NACOS\".\"TENANT_INFO\" ON;\nINSERT INTO \"NACOS\".\"TENANT_INFO\"(\"ID\",\"KP\",\"TENANT_ID\",\"TENANT_NAME\",\"TENANT_DESC\",\"CREATE_SOURCE\",\"GMT_CREATE\",\"GMT_MODIFIED\") VALUES(1,'1','springboot3','springboot3','springboot3版本配置文件，与springboot2有很大区别','nacos',1720506551826,1720506551826);\n\nSET IDENTITY_INSERT \"NACOS\".\"TENANT_INFO\" OFF;\nINSERT INTO \"NACOS\".\"USERS\"(\"USERNAME\",\"PASSWORD\",\"ENABLED\") VALUES('nacos','$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu',1);\n\nALTER TABLE \"NACOS\".\"CONFIG_INFO\" ADD CONSTRAINT  PRIMARY KEY(\"ID\") ;\n\nALTER TABLE \"NACOS\".\"CONFIG_INFO_AGGR\" ADD CONSTRAINT  PRIMARY KEY(\"ID\") ;\n\nALTER TABLE \"NACOS\".\"CONFIG_INFO_BETA\" ADD CONSTRAINT  PRIMARY KEY(\"ID\") ;\n\nALTER TABLE \"NACOS\".\"CONFIG_INFO_TAG\" ADD CONSTRAINT  PRIMARY KEY(\"ID\") ;\n\nALTER TABLE \"NACOS\".\"CONFIG_TAGS_RELATION\" ADD CONSTRAINT  PRIMARY KEY(\"NID\") ;\n\nALTER TABLE \"NACOS\".\"GROUP_CAPACITY\" ADD CONSTRAINT  PRIMARY KEY(\"ID\") ;\n\nALTER TABLE \"NACOS\".\"HIS_CONFIG_INFO\" ADD CONSTRAINT  PRIMARY KEY(\"NID\") ;\n\nALTER TABLE \"NACOS\".\"TENANT_CAPACITY\" ADD CONSTRAINT  PRIMARY KEY(\"ID\") ;\n\nALTER TABLE \"NACOS\".\"TENANT_INFO\" ADD CONSTRAINT  PRIMARY KEY(\"ID\") ;\n\nALTER TABLE \"NACOS\".\"USERS\" ADD CONSTRAINT  PRIMARY KEY(\"USERNAME\") ;\n\nALTER TABLE \"NACOS\".\"HIS_CONFIG_INFO\" ADD CHECK(\"ID\" >= 0) ENABLE ;\n\nALTER TABLE \"NACOS\".\"CONFIG_INFO\" ADD CONSTRAINT \"UK_CONFIGINFO_DATAGROUPTENANT\" UNIQUE(\"DATA_ID\",\"GROUP_ID\",\"TENANT_ID\") ;\n\nALTER TABLE \"NACOS\".\"CONFIG_INFO_AGGR\" ADD CONSTRAINT \"UK_CONFIGINFOAGGR_DATAGROUPTENANTDATUM\" UNIQUE(\"DATA_ID\",\"GROUP_ID\",\"TENANT_ID\",\"DATUM_ID\") ;\n\nALTER TABLE \"NACOS\".\"CONFIG_INFO_BETA\" ADD CONSTRAINT \"UK_CONFIGINFOBETA_DATAGROUPTENANT\" UNIQUE(\"DATA_ID\",\"GROUP_ID\",\"TENANT_ID\") ;\n\nALTER TABLE \"NACOS\".\"CONFIG_INFO_TAG\" ADD CONSTRAINT \"UK_CONFIGINFOTAG_DATAGROUPTENANTTAG\" UNIQUE(\"DATA_ID\",\"GROUP_ID\",\"TENANT_ID\",\"TAG_ID\") ;\n\nALTER TABLE \"NACOS\".\"CONFIG_TAGS_RELATION\" ADD CONSTRAINT \"UK_CONFIGTAGRELATION_CONFIGIDTAG\" UNIQUE(\"ID\",\"TAG_NAME\",\"TAG_TYPE\") ;\n\nALTER TABLE \"NACOS\".\"GROUP_CAPACITY\" ADD CONSTRAINT \"UK_GROUP_ID\" UNIQUE(\"GROUP_ID\") ;\n\nALTER TABLE \"NACOS\".\"PERMISSIONS\" ADD CONSTRAINT \"UK_ROLE_PERMISSION\" UNIQUE(\"ROLE\",\"RESOURCE\",\"ACTION\") ;\n\nALTER TABLE \"NACOS\".\"ROLES\" ADD CONSTRAINT \"IDX_USER_ROLE\" UNIQUE(\"USERNAME\",\"ROLE\") ;\n\nALTER TABLE \"NACOS\".\"TENANT_CAPACITY\" ADD CONSTRAINT \"UK_TENANT_ID\" UNIQUE(\"TENANT_ID\") ;\n\nALTER TABLE \"NACOS\".\"TENANT_INFO\" ADD CONSTRAINT \"UK_TENANT_INFO_KPTENANTID\" UNIQUE(\"KP\",\"TENANT_ID\") ;\n\nCOMMENT ON TABLE \"NACOS\".\"CONFIG_INFO\" IS 'config_info';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO\".\"ID\" IS 'id';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO\".\"DATA_ID\" IS 'data_id';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO\".\"CONTENT\" IS 'content';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO\".\"MD5\" IS 'md5';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO\".\"GMT_CREATE\" IS '创建时间';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO\".\"GMT_MODIFIED\" IS '修改时间';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO\".\"SRC_USER\" IS 'source user';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO\".\"SRC_IP\" IS 'source ip';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO\".\"TENANT_ID\" IS '租户字段';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO\".\"ENCRYPTED_DATA_KEY\" IS '密钥';\n\nCOMMENT ON TABLE \"NACOS\".\"CONFIG_INFO_AGGR\" IS '增加租户字段';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_AGGR\".\"ID\" IS 'id';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_AGGR\".\"DATA_ID\" IS 'data_id';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_AGGR\".\"GROUP_ID\" IS 'group_id';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_AGGR\".\"DATUM_ID\" IS 'datum_id';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_AGGR\".\"CONTENT\" IS '内容';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_AGGR\".\"GMT_MODIFIED\" IS '修改时间';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_AGGR\".\"TENANT_ID\" IS '租户字段';\n\nCOMMENT ON TABLE \"NACOS\".\"CONFIG_INFO_BETA\" IS 'config_info_beta';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_BETA\".\"ID\" IS 'id';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_BETA\".\"DATA_ID\" IS 'data_id';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_BETA\".\"GROUP_ID\" IS 'group_id';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_BETA\".\"APP_NAME\" IS 'app_name';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_BETA\".\"CONTENT\" IS 'content';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_BETA\".\"BETA_IPS\" IS 'betaIps';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_BETA\".\"MD5\" IS 'md5';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_BETA\".\"GMT_CREATE\" IS '创建时间';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_BETA\".\"GMT_MODIFIED\" IS '修改时间';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_BETA\".\"SRC_USER\" IS 'source user';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_BETA\".\"SRC_IP\" IS 'source ip';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_BETA\".\"TENANT_ID\" IS '租户字段';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_BETA\".\"ENCRYPTED_DATA_KEY\" IS '密钥';\n\nCOMMENT ON TABLE \"NACOS\".\"CONFIG_INFO_TAG\" IS 'config_info_tag';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_TAG\".\"ID\" IS 'id';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_TAG\".\"DATA_ID\" IS 'data_id';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_TAG\".\"GROUP_ID\" IS 'group_id';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_TAG\".\"TENANT_ID\" IS 'tenant_id';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_TAG\".\"TAG_ID\" IS 'tag_id';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_TAG\".\"APP_NAME\" IS 'app_name';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_TAG\".\"CONTENT\" IS 'content';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_TAG\".\"MD5\" IS 'md5';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_TAG\".\"GMT_CREATE\" IS '创建时间';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_TAG\".\"GMT_MODIFIED\" IS '修改时间';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_TAG\".\"SRC_USER\" IS 'source user';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_INFO_TAG\".\"SRC_IP\" IS 'source ip';\n\nCOMMENT ON TABLE \"NACOS\".\"CONFIG_TAGS_RELATION\" IS 'config_tag_relation';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_TAGS_RELATION\".\"ID\" IS 'id';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_TAGS_RELATION\".\"TAG_NAME\" IS 'tag_name';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_TAGS_RELATION\".\"TAG_TYPE\" IS 'tag_type';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_TAGS_RELATION\".\"DATA_ID\" IS 'data_id';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_TAGS_RELATION\".\"GROUP_ID\" IS 'group_id';\n\nCOMMENT ON COLUMN \"NACOS\".\"CONFIG_TAGS_RELATION\".\"TENANT_ID\" IS 'tenant_id';\n\nCREATE INDEX \"IDX_DID\"\nON \"NACOS\".\"HIS_CONFIG_INFO\"(\"DATA_ID\");\n\nCREATE INDEX \"IDX_GMT_CREATE\"\nON \"NACOS\".\"HIS_CONFIG_INFO\"(\"GMT_CREATE\");\n\nCREATE INDEX \"IDX_GMT_MODIFIED\"\nON \"NACOS\".\"HIS_CONFIG_INFO\"(\"GMT_MODIFIED\");\n\nCREATE INDEX \"IDX_TENANT_ID\"\nON \"NACOS\".\"TENANT_INFO\"(\"TENANT_ID\");\n\nALTER TABLE \"NACOS\".\"GROUP_CAPACITY\" ADD CHECK(\"USAGE\" >= 0) ENABLE ;\n\nALTER TABLE \"NACOS\".\"GROUP_CAPACITY\" ADD CHECK(\"MAX_SIZE\" >= 0) ENABLE ;\n\nALTER TABLE \"NACOS\".\"GROUP_CAPACITY\" ADD CHECK(\"MAX_AGGR_COUNT\" >= 0) ENABLE ;\n\nALTER TABLE \"NACOS\".\"GROUP_CAPACITY\" ADD CHECK(\"MAX_AGGR_SIZE\" >= 0) ENABLE ;\n\nALTER TABLE \"NACOS\".\"GROUP_CAPACITY\" ADD CHECK(\"MAX_HISTORY_COUNT\" >= 0) ENABLE ;\n\nALTER TABLE \"NACOS\".\"GROUP_CAPACITY\" ADD CHECK(\"QUOTA\" >= 0) ENABLE ;\n\nALTER TABLE \"NACOS\".\"TENANT_CAPACITY\" ADD CHECK(\"QUOTA\" >= 0) ENABLE ;\n\nALTER TABLE \"NACOS\".\"TENANT_CAPACITY\" ADD CHECK(\"USAGE\" >= 0) ENABLE ;\n\nALTER TABLE \"NACOS\".\"TENANT_CAPACITY\" ADD CHECK(\"MAX_SIZE\" >= 0) ENABLE ;\n\nALTER TABLE \"NACOS\".\"TENANT_CAPACITY\" ADD CHECK(\"MAX_AGGR_COUNT\" >= 0) ENABLE ;\n\nALTER TABLE \"NACOS\".\"TENANT_CAPACITY\" ADD CHECK(\"MAX_AGGR_SIZE\" >= 0) ENABLE ;\n\nALTER TABLE \"NACOS\".\"TENANT_CAPACITY\" ADD CHECK(\"MAX_HISTORY_COUNT\" >= 0) ENABLE ;\n\nCOMMENT ON TABLE \"NACOS\".\"GROUP_CAPACITY\" IS '集群、各Group容量信息表';\n\nCOMMENT ON COLUMN \"NACOS\".\"GROUP_CAPACITY\".\"ID\" IS '主键ID';\n\nCOMMENT ON COLUMN \"NACOS\".\"GROUP_CAPACITY\".\"GROUP_ID\" IS 'Group ID，空字符表示整个集群';\n\nCOMMENT ON COLUMN \"NACOS\".\"GROUP_CAPACITY\".\"QUOTA\" IS '配额，0表示使用默认值';\n\nCOMMENT ON COLUMN \"NACOS\".\"GROUP_CAPACITY\".\"USAGE\" IS '使用量';\n\nCOMMENT ON COLUMN \"NACOS\".\"GROUP_CAPACITY\".\"MAX_SIZE\" IS '单个配置大小上限，单位为字节，0表示使用默认值';\n\nCOMMENT ON COLUMN \"NACOS\".\"GROUP_CAPACITY\".\"MAX_AGGR_COUNT\" IS '聚合子配置最大个数，，0表示使用默认值';\n\nCOMMENT ON COLUMN \"NACOS\".\"GROUP_CAPACITY\".\"MAX_AGGR_SIZE\" IS '单个聚合数据的子配置大小上限，单位为字节，0表示使用默认值';\n\nCOMMENT ON COLUMN \"NACOS\".\"GROUP_CAPACITY\".\"MAX_HISTORY_COUNT\" IS '最大变更历史数量';\n\nCOMMENT ON COLUMN \"NACOS\".\"GROUP_CAPACITY\".\"GMT_CREATE\" IS '创建时间';\n\nCOMMENT ON COLUMN \"NACOS\".\"GROUP_CAPACITY\".\"GMT_MODIFIED\" IS '修改时间';\n\nCOMMENT ON TABLE \"NACOS\".\"HIS_CONFIG_INFO\" IS '多租户改造';\n\nCOMMENT ON COLUMN \"NACOS\".\"HIS_CONFIG_INFO\".\"APP_NAME\" IS 'app_name';\n\nCOMMENT ON COLUMN \"NACOS\".\"HIS_CONFIG_INFO\".\"TENANT_ID\" IS '租户字段';\n\nCOMMENT ON COLUMN \"NACOS\".\"HIS_CONFIG_INFO\".\"ENCRYPTED_DATA_KEY\" IS '密钥';\n\nCOMMENT ON TABLE \"NACOS\".\"TENANT_CAPACITY\" IS '租户容量信息表';\n\nCOMMENT ON COLUMN \"NACOS\".\"TENANT_CAPACITY\".\"ID\" IS '主键ID';\n\nCOMMENT ON COLUMN \"NACOS\".\"TENANT_CAPACITY\".\"TENANT_ID\" IS 'Tenant ID';\n\nCOMMENT ON COLUMN \"NACOS\".\"TENANT_CAPACITY\".\"QUOTA\" IS '配额，0表示使用默认值';\n\nCOMMENT ON COLUMN \"NACOS\".\"TENANT_CAPACITY\".\"USAGE\" IS '使用量';\n\nCOMMENT ON COLUMN \"NACOS\".\"TENANT_CAPACITY\".\"MAX_SIZE\" IS '单个配置大小上限，单位为字节，0表示使用默认值';\n\nCOMMENT ON COLUMN \"NACOS\".\"TENANT_CAPACITY\".\"MAX_AGGR_COUNT\" IS '聚合子配置最大个数';\n\nCOMMENT ON COLUMN \"NACOS\".\"TENANT_CAPACITY\".\"MAX_AGGR_SIZE\" IS '单个聚合数据的子配置大小上限，单位为字节，0表示使用默认值';\n\nCOMMENT ON COLUMN \"NACOS\".\"TENANT_CAPACITY\".\"MAX_HISTORY_COUNT\" IS '最大变更历史数量';\n\nCOMMENT ON COLUMN \"NACOS\".\"TENANT_CAPACITY\".\"GMT_CREATE\" IS '创建时间';\n\nCOMMENT ON COLUMN \"NACOS\".\"TENANT_CAPACITY\".\"GMT_MODIFIED\" IS '修改时间';\n\nCOMMENT ON TABLE \"NACOS\".\"TENANT_INFO\" IS 'tenant_info';\n\nCOMMENT ON COLUMN \"NACOS\".\"TENANT_INFO\".\"ID\" IS 'id';\n\nCOMMENT ON COLUMN \"NACOS\".\"TENANT_INFO\".\"KP\" IS 'kp';\n\nCOMMENT ON COLUMN \"NACOS\".\"TENANT_INFO\".\"TENANT_ID\" IS 'tenant_id';\n\nCOMMENT ON COLUMN \"NACOS\".\"TENANT_INFO\".\"TENANT_NAME\" IS 'tenant_name';\n\nCOMMENT ON COLUMN \"NACOS\".\"TENANT_INFO\".\"TENANT_DESC\" IS 'tenant_desc';\n\nCOMMENT ON COLUMN \"NACOS\".\"TENANT_INFO\".\"CREATE_SOURCE\" IS 'create_source';\n\nCOMMENT ON COLUMN \"NACOS\".\"TENANT_INFO\".\"GMT_CREATE\" IS '创建时间';\n\nCOMMENT ON COLUMN \"NACOS\".\"TENANT_INFO\".\"GMT_MODIFIED\" IS '修改时间';\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <artifactId>jeecg-cloud-nacos</artifactId>\n    <name>jeecg-cloud-nacos</name>\n    <description>nacos启动模块</description>\n    <version>3.9.1</version>\n\n    <parent>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>2.7.18</version>\n        <relativePath/>\n    </parent>\n\n    <repositories>\n        <repository>\n            <id>aliyun</id>\n            <name>aliyun Repository</name>\n            <url>https://maven.aliyun.com/repository/public</url>\n            <snapshots>\n                <enabled>false</enabled>\n            </snapshots>\n        </repository>\n        <repository>\n            <id>jeecg</id>\n            <name>jeecg Repository</name>\n            <url>https://maven.jeecg.org/nexus/content/repositories/jeecg</url>\n            <snapshots>\n                <enabled>false</enabled>\n            </snapshots>\n        </repository>\n    </repositories>\n\n    <properties>\n        <log4j2.version>2.17.0</log4j2.version>\n        <nacos.version>2.3.2</nacos.version>\n        <dm8.version>8.1.3.140</dm8.version>\n    </properties>\n    \n    <dependencies>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.tomcat.embed</groupId>\n            <artifactId>tomcat-embed-jasper</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-security</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.jeecgframework.nacos</groupId>\n            <artifactId>nacos-naming</artifactId>\n            <version>${nacos.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.jeecgframework.nacos</groupId>\n            <artifactId>nacos-istio</artifactId>\n            <version>${nacos.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.jeecgframework.nacos</groupId>\n            <artifactId>nacos-config</artifactId>\n            <version>${nacos.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.jeecgframework.nacos</groupId>\n            <artifactId>nacos-console</artifactId>\n            <version>${nacos.version}</version>\n        </dependency>\n\n        <!--达梦数据库驱动 版本号1-3-26-2023.07.26-197096-20046-ENT -->\n        <dependency>\n            <groupId>com.dameng</groupId>\n            <artifactId>DmJdbcDriver18</artifactId>\n            <version>${dm8.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>com.dameng</groupId>\n            <artifactId>DmDialect-for-hibernate5.0</artifactId>\n            <version>${dm8.version}</version>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n\n</project>\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/src/main/java/com/alibaba/nacos/JeecgNacosApplication.java",
    "content": "package com.alibaba.nacos;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.web.servlet.ServletComponentScan;\nimport org.springframework.scheduling.annotation.EnableScheduling;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport javax.servlet.http.HttpServletResponse;\n\n\n/**\n * Nacos 启动类\n *\n * @author zyf\n */\n@SpringBootApplication(scanBasePackages = \"com.alibaba.nacos\")\n@ServletComponentScan\n@EnableScheduling\npublic class JeecgNacosApplication {\n\n    /** 是否单机模式启动 */\n    private static String standalone = \"true\";\n    /** 是否开启鉴权 */\n    private static String enabled = \"false\";\n\n    public static void main(String[] args) {\n        System.setProperty(\"nacos.standalone\", standalone);\n        System.setProperty(\"nacos.core.auth.enabled\", enabled);\n//        //一旦Nacos初始化，用户名nacos将不能被修改，但你可以通过控制台或API来修改密码  https://nacos.io/en/blog/faq/nacos-user-question-history8420       \n//        System.setProperty(\"nacos.core.auth.default.username\", \"nacos\");\n//        System.setProperty(\"nacos.core.auth.default.password\", \"nacos\");\n        System.setProperty(\"server.tomcat.basedir\",\"logs\");\n        //自定义启动端口号\n        System.setProperty(\"server.port\",\"8848\");\n        SpringApplication.run(JeecgNacosApplication.class, args);\n    }\n\n    /**\n     * 默认跳转首页\n     *\n     * @param model\n     * @return\n     */\n    @GetMapping(\"/\")\n    public String index(Model model, HttpServletResponse response) {\n        // 视图重定向 - 跳转\n        return \"/nacos\";\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/src/main/resources/application-dm.yml",
    "content": "server:\n  servlet:\n    contextPath: /nacos\n  tomcat:\n    accesslog:\n      enabled: true\n      pattern: '%h %l %u %t \"%r\" %s %b %D %{User-Agent}i %{Request-Source}i'\n    basedir: ''\nspring:\n  sql:\n    init:\n      platform: dm\ndb:\n  pool: \n    config:\n      driverClassName: dm.jdbc.driver.DmDriver\n  num: 1\n  password:\n    '0': SYSDBA\n  url:\n    '0': jdbc:dm://192.168.1.188:30236/DMSERVER?schema=NACOS&compatibleMode=mysql&ignoreCase=true&ENCODING=utf-8\n  user:\n    '0': SYSDBA\nmanagement:\n  metrics:\n    export:\n      elastic:\n        enabled: false\n      influx:\n        enabled: false\nnacos:\n  core:\n    auth:\n      enabled: false\n      caching:\n        enabled: true\n      server:\n        identity:\n          key: example\n          value: example\n      plugin:\n        nacos:\n          token:\n            expire:\n              seconds: 18000\n            secret:\n              key: SecretKey01234567890123456789012345345678999987654901234567890123456789\n      system:\n        type: nacos\n  istio:\n    mcp:\n      server:\n        enabled: false\n  naming:\n    empty-service:\n      auto-clean: true\n      clean:\n        initial-delay-ms: 50000\n        period-time-ms: 30000\n  security:\n    ignore:\n      urls: /,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**\n  standalone: true"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/src/main/resources/application-mysql.yml",
    "content": "server:\n  servlet:\n    contextPath: /nacos\n  tomcat:\n    accesslog:\n      enabled: true\n      pattern: '%h %l %u %t \"%r\" %s %b %D %{User-Agent}i %{Request-Source}i'\n    basedir: ''\nspring:\n  sql:\n    init:\n      platform: mysql\ndb:\n  num: 1\n  password:\n    '0': ${MYSQL-PWD:root}\n  url:\n    '0': jdbc:mysql://${MYSQL-HOST:jeecg-boot-mysql}:${MYSQL-PORT:3306}/${MYSQL-DB:nacos}?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true\n  user:\n    '0': ${MYSQL-USER:root}\nmanagement:\n  metrics:\n    export:\n      elastic:\n        enabled: false\n      influx:\n        enabled: false\nnacos:\n  core:\n    auth:\n      enabled: false\n      caching:\n        enabled: true\n      server:\n        identity:\n          key: nacos\n          value: nacos\n      plugin:\n        nacos:\n          token:\n            expire:\n              seconds: 18000\n            secret:\n              key: VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=\n      system:\n        type: nacos\n  istio:\n    mcp:\n      server:\n        enabled: false\n  naming:\n    empty-service:\n      auto-clean: true\n      clean:\n        initial-delay-ms: 50000\n        period-time-ms: 30000\n  security:\n    ignore:\n      urls: /,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**\n  standalone: true"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-cloud-nacos/src/main/resources/application.yml",
    "content": "spring:\n  profiles:\n    active: mysql"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-demo-cloud-start/Dockerfile",
    "content": "FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:17-anolis\n\nMAINTAINER jeecgos@163.com\n\nRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime\n\nRUN mkdir -p /jeecg-demo-cloud\n\nWORKDIR /jeecg-demo-cloud\n\nEXPOSE 7002\n\nADD ./target/jeecg-demo-cloud-start-3.9.1.jar ./\n\nCMD sleep 60;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-demo-cloud-start-3.9.1.jar\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-demo-cloud-start/README.md",
    "content": "采用jar启动必须设置-Dfile.encoding=utf-8 ，不然会加载不到naocs文件\n\njava  -Dfile.encoding=utf-8  -jar  xxxx.jar"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-demo-cloud-start/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-server-cloud</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>jeecg-demo-cloud-start</artifactId>\n    <description>Demo微服务启动</description>\n\n    <dependencies>\n        <!--引入微服务启动依赖 starter-->\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-boot-starter-cloud</artifactId>\n        </dependency>\n        <!--system cloud api-->\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-system-cloud-api</artifactId>\n        </dependency>\n        \n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-boot-starter-job</artifactId>\n        </dependency>\n\n        <!-- 引入demo模块 -->\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-module-demo</artifactId>\n            <version>${jeecgboot.version}</version>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-demo-cloud-start/src/main/java/org/jeecg/JeecgDemoCloudApplication.java",
    "content": "package org.jeecg;\n\nimport com.xkcoding.justauth.autoconfigure.JustAuthAutoConfiguration;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.common.constant.GlobalConstants;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.ImportAutoConfiguration;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.openfeign.EnableFeignClients;\nimport org.springframework.data.redis.core.RedisTemplate;\n\n@SpringBootApplication\n@EnableFeignClients\n@ImportAutoConfiguration(JustAuthAutoConfiguration.class)  // spring boot 3.x justauth 兼容性处理\npublic class JeecgDemoCloudApplication implements CommandLineRunner {\n    @Autowired\n    private RedisTemplate<String, Object> redisTemplate;\n\n    public static void main(String[] args) {\n        SpringApplication.run(JeecgDemoCloudApplication.class, args);\n    }\n\n    /**\n     * 启动的时候，触发下gateway网关刷新\n     *\n     * 解决： 先启动gateway后启动服务，Swagger接口文档访问不通的问题\n     * @param args\n     */\n    @Override\n    public void run(String... args) {\n        BaseMap params = new BaseMap();\n        params.put(GlobalConstants.HANDLER_NAME, GlobalConstants.LODER_ROUDER_HANDLER);\n        //刷新网关\n        redisTemplate.convertAndSend(GlobalConstants.REDIS_TOPIC_NAME, params);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-demo-cloud-start/src/main/resources/application.yml",
    "content": "server:\n  port: 7002\n  \nspring:\n  application:\n    name: jeecg-demo\n  cloud:\n    nacos:\n      config:\n        server-addr: @config.server-addr@\n        group: @config.group@\n        namespace: @config.namespace@\n        username: @config.username@\n        password: @config.password@\n      discovery:\n        server-addr: ${spring.cloud.nacos.config.server-addr}\n        group: @config.group@\n        namespace: @config.namespace@\n        username: @config.username@\n        password: @config.password@\n  config:\n    import:\n      - optional:nacos:jeecg.yaml\n      - optional:nacos:jeecg-@profile.name@.yaml"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-demo-cloud-start/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration debug=\"false\">\n\t<!--定义日志文件的存储地址 -->\n\t<property name=\"LOG_HOME\" value=\"../logs\" />\n\n\t<!--<property name=\"COLOR_PATTERN\" value=\"%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta( %replace(%caller{1}){'\\t|Caller.{1}0|\\r\\n', ''})- %gray(%msg%xEx%n)\" />-->\n\t<!-- 控制台输出 -->\n\t<appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n\t\t\t<!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符\n\t\t\t<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>-->\n\t\t\t<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}:%L) - %msg%n</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- 按照每天生成日志文件 -->\n\t<appender name=\"FILE\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy\">\n\t\t\t<!--日志文件输出的文件名 -->\n\t\t\t<FileNamePattern>${LOG_HOME}/jeecg-demo-%d{yyyy-MM-dd}.%i.log</FileNamePattern>\n\t\t\t<!--日志文件保留天数 -->\n\t\t\t<MaxHistory>30</MaxHistory>\n\t\t\t<maxFileSize>10MB</maxFileSize>\n\t\t</rollingPolicy>\n\t\t<encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n\t\t\t<!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符 -->\n\t\t\t<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- 生成 error html格式日志开始 -->\n\t<appender name=\"HTML\" class=\"ch.qos.logback.core.FileAppender\">\n\t\t<filter class=\"ch.qos.logback.classic.filter.ThresholdFilter\">\n\t\t\t<!--设置日志级别,过滤掉info日志,只输入error日志-->\n\t\t\t<level>ERROR</level>\n\t\t</filter>\n\t\t<encoder class=\"ch.qos.logback.core.encoder.LayoutWrappingEncoder\">\n\t\t\t<layout class=\"ch.qos.logback.classic.html.HTMLLayout\">\n\t\t\t\t<pattern>%p%d%msg%M%F{32}%L</pattern>\n\t\t\t</layout>\n\t\t</encoder>\n\t\t<file>${LOG_HOME}/error-log.html</file>\n\t</appender>\n\t<!-- 生成 error html格式日志结束 -->\n\n\t<!-- 每天生成一个html格式的日志开始 -->\n\t<appender name=\"FILE_HTML\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy\">\n\t\t\t<!--日志文件输出的文件名 -->\n\t\t\t<FileNamePattern>${LOG_HOME}/jeecg-demo-%d{yyyy-MM-dd}.%i.html</FileNamePattern>\n\t\t\t<!--日志文件保留天数 -->\n\t\t\t<MaxHistory>30</MaxHistory>\n\t\t\t<MaxFileSize>10MB</MaxFileSize>\n\t\t</rollingPolicy>\n\t\t<encoder class=\"ch.qos.logback.core.encoder.LayoutWrappingEncoder\">\n\t\t\t<layout class=\"ch.qos.logback.classic.html.HTMLLayout\">\n\t\t\t\t<pattern>%p%d%msg%M%F{32}%L</pattern>\n\t\t\t</layout>\n\t\t</encoder>\n\t</appender>\n\t<!-- 每天生成一个html格式的日志结束 -->\n\n\t<!--myibatis log configure -->\n\t<logger name=\"com.apache.ibatis\" level=\"TRACE\" />\n\t<logger name=\"java.sql.Connection\" level=\"DEBUG\" />\n\t<logger name=\"java.sql.Statement\" level=\"DEBUG\" />\n\t<logger name=\"java.sql.PreparedStatement\" level=\"DEBUG\" />\n\n\t<!-- 日志输出级别 -->\n\t<root level=\"INFO\">\n\t\t<appender-ref ref=\"STDOUT\" />\n\t\t<appender-ref ref=\"FILE\" />\n\t\t<appender-ref ref=\"HTML\" />\n\t\t<appender-ref ref=\"FILE_HTML\" />\n\t</root>\n\n</configuration>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/Dockerfile",
    "content": "FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:17-anolis\n\nMAINTAINER jeecgos@163.com\n\nRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime\n\nRUN mkdir -p /jeecg-system-cloud\n\nWORKDIR /jeecg-system-cloud\n\nEXPOSE 7001\n\nADD ./target/jeecg-system-cloud-start-3.9.1.jar ./\n\nCMD sleep 60;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-system-cloud-start-3.9.1.jar"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/README.md",
    "content": "采用jar启动必须设置-Dfile.encoding=utf-8 ，不然会加载不到naocs文件\n\njava  -Dfile.encoding=utf-8  -jar  xxxx.jar"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-server-cloud</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n    <artifactId>jeecg-system-cloud-start</artifactId>\n    <description>System项目微服务启动</description>\n\n    <dependencies>\n        <!-- 引入jeecg-boot-starter-cloud依赖 -->\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-boot-starter-cloud</artifactId>\n            <!-- 3.2版本号后，可选择是否排除jeecg-system-cloud-api，不排除会优先通过fegin调用接口\n            <exclusions>\n                <exclusion>\n                    <groupId>org.jeecgframework.boot3</groupId>\n                    <artifactId>jeecg-system-cloud-api</artifactId>\n                </exclusion>\n            </exclusions>-->\n        </dependency>\n        <!-- jeecg-system-biz依赖 -->\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-system-biz</artifactId>\n            <!-- 排除demo模块，demo模块采用微服务独立启动 -->\n            <exclusions>\n                <exclusion>\n                    <groupId>org.jeecgframework.boot3</groupId>\n                    <artifactId>jeecg-module-demo</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-boot-starter-job</artifactId>\n        </dependency>\n\n        <!-- feign 熔断限流、分布式锁、xxljob示例 \n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-cloud-test-more</artifactId>\n            <version>${jeecgboot.version}</version>\n        </dependency>-->\n        <!-- rabbitmq例子\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-cloud-test-rabbitmq</artifactId>\n            <version>${jeecgboot.version}</version>\n        </dependency>-->\n        <!-- rocketmq例子-->\n        <!--<dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-cloud-test-rocketmq</artifactId>\n            <version>${jeecgboot.version}</version>\n        </dependency>-->\n        <!-- 分布式事务例子\n       <dependency>\n           <groupId>org.jeecgframework.boot3</groupId>\n           <artifactId>jeecg-cloud-test-seata</artifactId>\n           <version>${jeecgboot.version}</version>\n       </dependency>-->\n        <!-- 分库分表例子\n       <dependency>\n           <groupId>org.jeecgframework.boot3</groupId>\n           <artifactId>jeecg-cloud-test-shardingsphere</artifactId>\n           <version>${jeecgboot.version}</version>\n       </dependency>\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-boot-starter-shardingsphere-nacos</artifactId>\n        </dependency>-->\n\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/src/main/java/org/jeecg/JeecgSystemCloudApplication.java",
    "content": "package org.jeecg;\n\nimport com.xkcoding.justauth.autoconfigure.JustAuthAutoConfiguration;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.common.constant.GlobalConstants;\nimport org.jeecg.common.util.oConvertUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.EnableAutoConfiguration;\nimport org.springframework.boot.autoconfigure.ImportAutoConfiguration;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;\nimport org.springframework.boot.builder.SpringApplicationBuilder;\nimport org.springframework.boot.web.servlet.support.SpringBootServletInitializer;\nimport org.springframework.cloud.openfeign.EnableFeignClients;\nimport org.springframework.context.ConfigurableApplicationContext;\nimport org.springframework.core.env.Environment;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.scheduling.annotation.EnableScheduling;\n\nimport java.net.InetAddress;\nimport java.net.UnknownHostException;\n\n/**\n * 微服务启动类（采用此类启动项目为微服务模式）\n * 特别提醒:\n * 1、需要先初始化Nacos的数据库脚本，db/tables_nacos.sql\n * 2.需要集成mogodb请删除 exclude={MongoAutoConfiguration.class}\n * \n * @author jeecg\n * @date: 2022/4/21 10:55\n */\n@Slf4j\n@SpringBootApplication\n@EnableFeignClients(basePackages = {\"org.jeecg\"})\n@EnableScheduling\n@EnableAutoConfiguration(exclude={MongoAutoConfiguration.class})\n@ImportAutoConfiguration(JustAuthAutoConfiguration.class)  // spring boot 3.x justauth 兼容性处理\npublic class JeecgSystemCloudApplication extends SpringBootServletInitializer implements CommandLineRunner {\n\n    @Autowired\n    private RedisTemplate<String, Object> redisTemplate;\n    @Override\n    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {\n        return application.sources(JeecgSystemCloudApplication.class);\n    }\n\n    public static void main(String[] args) throws UnknownHostException {\n        ConfigurableApplicationContext application = SpringApplication.run(JeecgSystemCloudApplication.class, args);\n        Environment env = application.getEnvironment();\n        String ip = InetAddress.getLocalHost().getHostAddress();\n        String port = env.getProperty(\"server.port\");\n        String path = oConvertUtils.getString(env.getProperty(\"server.servlet.context-path\"));\n        log.info(\"\\n----------------------------------------------------------\\n\\t\" +\n                \"Application Jeecg-Boot is running! Access URLs:\\n\\t\" +\n                \"Local: \\t\\thttp://localhost:\" + port + path + \"/doc.html\\n\" +\n                \"External: \\thttp://\" + ip + \":\" + port + path + \"/doc.html\\n\" +\n                \"Swagger文档: \\thttp://\" + ip + \":\" + port + path + \"/doc.html\\n\" +\n                \"----------------------------------------------------------\");\n\n    }\n\n    /**\n     * 启动的时候，触发下gateway网关刷新\n     *\n     * 解决： 先启动gateway后启动服务，Swagger接口文档访问不通的问题\n     * @param args\n     */\n    @Override\n    public void run(String... args) {\n        BaseMap params = new BaseMap();\n        params.put(GlobalConstants.HANDLER_NAME, GlobalConstants.LODER_ROUDER_HANDLER);\n        //刷新网关\n        redisTemplate.convertAndSend(GlobalConstants.REDIS_TOPIC_NAME, params);\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/src/main/resources/application.yml",
    "content": "server:\n  port: 7001\n  \nspring:\n  application:\n    name: jeecg-system\n  cloud:\n    nacos:\n      config:\n        server-addr: @config.server-addr@\n        group: @config.group@\n        namespace: @config.namespace@\n        username: @config.username@\n        password: @config.password@\n      discovery:\n        server-addr: ${spring.cloud.nacos.config.server-addr}\n        group: @config.group@\n        namespace: @config.namespace@\n        username: @config.username@\n        password: @config.password@\n  config:\n    import:\n      - optional:classpath:config/application-liteflow.yml\n      - optional:nacos:jeecg.yaml\n      - optional:nacos:jeecg-@profile.name@.yaml\n#  #shardingjdbc数据源\n#  datasource:\n#    dynamic:\n#      datasource:\n#        sharding-db:\n#          driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver\n#          url: jdbc:shardingsphere:nacos:sharding.yaml?serverAddr=@config.server-addr@&namespace=@config.namespace@&group=@config.group@"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/src/main/resources/jeecg/jeecg_config.properties",
    "content": "#code_generate_project_path\nproject_path=E:\\\\workspace\\\\jeecg-boot\n#bussi_package[User defined]\nbussi_package=org.jeecg.modules.demo\n\n\n#default code path\n#source_root_package=src\n#webroot_package=WebRoot\n\n#maven code path\nsource_root_package=src.main.java\nwebroot_package=src.main.webapp\n\n#ftl resource url\ntemplatepath=/jeecg/code-template\nsystem_encoding=utf-8\n\n#db Table id [User defined] \ndb_table_id=id\n\n#db convert flag[true/false]\ndb_filed_convert=true\n\n#page Search Field num [User defined]\npage_search_filed_num=1\n#page_filter_fields\npage_filter_fields=create_time,create_by,update_time,update_by\nexclude_table=act_,ext_act_,design_,onl_,sys_,qrtz_\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/src/main/resources/jeecg/jeecg_database.properties",
    "content": "#mysql\ndiver_name=com.mysql.jdbc.Driver\nurl=jdbc:mysql://localhost:3306/jeecg-boot?useUnicode=true&characterEncoding=UTF-8\nusername=root\npassword=root\ndatabase_name=jeecg-boot\n\n#oracle\n#diver_name=oracle.jdbc.driver.OracleDriver\n#url=jdbc:oracle:thin:@192.168.1.200:1521:ORCL\n#username=scott\n#password=tiger\n#database_name=ORCL\n\n#postgre\n#diver_name=org.postgresql.Driver\n#url=jdbc:postgresql://localhost:5432/jeecg\n#username=postgres\n#password=postgres\n#database_name=jeecg\n\n#SQLServer2005\\u4ee5\\u4e0a\n#diver_name=org.hibernate.dialect.SQLServerDialect\n#url=jdbc:sqlserver://192.168.1.200:1433;DatabaseName=jeecg\n#username=sa\n#password=SA\n#database_name=jeecg"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-system-cloud-start/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration debug=\"false\">\n\t<!--定义日志文件的存储地址 -->\n\t<property name=\"LOG_HOME\" value=\"../logs\" />\n\n\t<!--<property name=\"COLOR_PATTERN\" value=\"%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta( %replace(%caller{1}){'\\t|Caller.{1}0|\\r\\n', ''})- %gray(%msg%xEx%n)\" />-->\n\t<!-- 控制台输出 -->\n\t<appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n\t\t\t<!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符\n\t\t\t<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>-->\n\t\t\t<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}:%L) - %msg%n</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- 按照每天生成日志文件 -->\n\t<appender name=\"FILE\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy\">\n\t\t\t<!--日志文件输出的文件名 -->\n\t\t\t<FileNamePattern>${LOG_HOME}/jeecg-system-%d{yyyy-MM-dd}.%i.log</FileNamePattern>\n\t\t\t<!--日志文件保留天数 -->\n\t\t\t<MaxHistory>30</MaxHistory>\n\t\t\t<maxFileSize>10MB</maxFileSize>\n\t\t</rollingPolicy>\n\t\t<encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n\t\t\t<!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符 -->\n\t\t\t<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- 生成 error html格式日志开始 -->\n\t<appender name=\"HTML\" class=\"ch.qos.logback.core.FileAppender\">\n\t\t<filter class=\"ch.qos.logback.classic.filter.ThresholdFilter\">\n\t\t\t<!--设置日志级别,过滤掉info日志,只输入error日志-->\n\t\t\t<level>ERROR</level>\n\t\t</filter>\n\t\t<encoder class=\"ch.qos.logback.core.encoder.LayoutWrappingEncoder\">\n\t\t\t<layout class=\"ch.qos.logback.classic.html.HTMLLayout\">\n\t\t\t\t<pattern>%p%d%msg%M%F{32}%L</pattern>\n\t\t\t</layout>\n\t\t</encoder>\n\t\t<file>${LOG_HOME}/error-log.html</file>\n\t</appender>\n\t<!-- 生成 error html格式日志结束 -->\n\n\t<!-- 每天生成一个html格式的日志开始 -->\n\t<appender name=\"FILE_HTML\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy\">\n\t\t\t<!--日志文件输出的文件名 -->\n\t\t\t<FileNamePattern>${LOG_HOME}/jeecg-system-%d{yyyy-MM-dd}.%i.html</FileNamePattern>\n\t\t\t<!--日志文件保留天数 -->\n\t\t\t<MaxHistory>30</MaxHistory>\n\t\t\t<MaxFileSize>10MB</MaxFileSize>\n\t\t</rollingPolicy>\n\t\t<encoder class=\"ch.qos.logback.core.encoder.LayoutWrappingEncoder\">\n\t\t\t<layout class=\"ch.qos.logback.classic.html.HTMLLayout\">\n\t\t\t\t<pattern>%p%d%msg%M%F{32}%L</pattern>\n\t\t\t</layout>\n\t\t</encoder>\n\t</appender>\n\t<!-- 每天生成一个html格式的日志结束 -->\n\n\t<!--myibatis log configure -->\n\t<logger name=\"com.apache.ibatis\" level=\"TRACE\" />\n\t<logger name=\"java.sql.Connection\" level=\"DEBUG\" />\n\t<logger name=\"java.sql.Statement\" level=\"DEBUG\" />\n\t<logger name=\"java.sql.PreparedStatement\" level=\"DEBUG\" />\n\n\t<!-- 日志输出级别 -->\n\t<root level=\"INFO\">\n\t\t<appender-ref ref=\"STDOUT\" />\n\t\t<appender-ref ref=\"FILE\" />\n\t\t<appender-ref ref=\"HTML\" />\n\t\t<appender-ref ref=\"FILE_HTML\" />\n\t</root>\n\n</configuration>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/README.md",
    "content": "http://localhost:9111\n账号密码：admin/admin"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-visual</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n    <artifactId>jeecg-cloud-monitor</artifactId>\n\n    <dependencies>\n        <!--Spring Boot Admin Server监控服务端-->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-actuator</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>de.codecentric</groupId>\n            <artifactId>spring-boot-admin-starter-server</artifactId>\n            <version>3.5.2</version>\n        </dependency>\n        <dependency>\n            <groupId>com.alibaba.cloud</groupId>\n            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-properties-migrator</artifactId>\n            <scope>runtime</scope>\n        </dependency>\n\n        <!--安全模块-->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-security</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n            <exclusions>\n                <exclusion>\n                    <groupId>org.springframework.boot</groupId>\n                    <artifactId>spring-boot-starter-tomcat</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <!--undertow容器-->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-undertow</artifactId>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n        <resources>\n            <resource>\n                <directory>src/main/resources</directory>\n                <filtering>true</filtering>\n            </resource>\n        </resources>\n    </build>\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/src/main/java/org/jeecg/monitor/JeecgMonitorApplication.java",
    "content": "package org.jeecg.monitor;\n\nimport de.codecentric.boot.admin.server.config.EnableAdminServer;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n/**\n * 监控服务\n * @author zyf\n * @date: 2022/4/21 10:55\n */\n@SpringBootApplication\n@EnableAdminServer\npublic class JeecgMonitorApplication {\n    public static void main(String[] args) {\n        SpringApplication.run(JeecgMonitorApplication.class, args);\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/src/main/java/org/jeecg/monitor/config/SecuritySecureConfig.java",
    "content": "package org.jeecg.monitor.config;\n\nimport de.codecentric.boot.admin.server.config.AdminServerProperties;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.config.Customizer;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.web.SecurityFilterChain;\nimport org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;\nimport org.springframework.security.web.csrf.CookieCsrfTokenRepository;\n\n/**\n * @author scott\n */\n@Configuration\npublic class SecuritySecureConfig {\n\n    private final String adminContextPath;\n\n    public SecuritySecureConfig(AdminServerProperties adminServerProperties) {\n        this.adminContextPath = adminServerProperties.getContextPath();\n    }\n\n\n    public SecurityFilterChain configure(HttpSecurity http) throws Exception {\n        // 登录成功处理类\n        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();\n        successHandler.setTargetUrlParameter(\"redirectTo\");\n        successHandler.setDefaultTargetUrl(adminContextPath + \"/\");\n\n        http.authorizeRequests(authorize -> {\n                    try {\n                        authorize\n\n                                //静态文件允许访问\n                                .requestMatchers(adminContextPath + \"/assets/**\").permitAll()\n                                //登录页面允许访问\n                                .requestMatchers(adminContextPath + \"/login\", \"/css/**\", \"/js/**\", \"/image/*\").permitAll()\n                                //其他所有请求需要登录\n                                .anyRequest().authenticated()\n                                .and()\n                                //登录页面配置，用于替换security默认页面\n                                .formLogin(formLogin -> formLogin.loginPage(adminContextPath + \"/login\").successHandler(successHandler))\n                                //登出页面配置，用于替换security默认页面\n                                .logout(logout -> logout.logoutUrl(adminContextPath + \"/logout\"))\n                                .httpBasic(Customizer.withDefaults())\n                                .csrf(csrf -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())\n                                        .ignoringRequestMatchers(\n                                        \"/instances\",\n                                        \"/actuator/**\")\n                                );\n                    } catch (Exception e) {\n                        e.printStackTrace();\n                    }\n                }\n        );\n\n        return http.build();\n\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/src/main/resources/application.yml",
    "content": "server:\n  port: 9111\nspring:\n  boot:\n    admin:\n      ui:\n        title: JeecgCloud监控中心\n      client:\n        instance:\n          metadata:\n            tags:\n              environment: local\n  security:\n    user:\n      name: \"admin\"\n      password: \"admin\"\n  application:\n    name: jeecg-monitor\n  cloud:\n    nacos:\n      discovery:\n        server-addr: @config.server-addr@\n        namespace: @config.namespace@\n        metadata:\n          user.name: ${spring.security.user.name}\n          user.password: ${spring.security.user.password}\n# 服务端点检查\nmanagement:\n  httpexchanges:\n    recording:\n      enabled: true\n  endpoints:\n    web:\n      exposure:\n        include: \"*\"\n  endpoint:\n    health:\n      show-details: always"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/Dockerfile",
    "content": "FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:17-anolis\n\nMAINTAINER jeecgos@163.com\n\nRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime\n\nRUN mkdir -p /jeecg-cloud-sentinel\n\nWORKDIR /jeecg-cloud-sentinel\n\nEXPOSE 8848\n\nADD ./target/jeecg-cloud-sentinel-3.9.1.jar ./\n\nCMD sleep 5;java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-sentinel-3.9.1.jar\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/README.md",
    "content": "访问地址: http://localhost:9000\n账号密码：sentinel/sentinel\n\n\n# 使用方法\n\n- 1、第一次登录sentinel内容是空的，必须访问了微服务实例的请求才会出现配置\n- 2、sentinel做了深度改造，支持持久化到nacos中\n- 3、目前只针对gateway做的控制，其他服务不需要\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n    <parent>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>2.7.18</version>\n        <relativePath/>\n    </parent>\n    <artifactId>jeecg-cloud-sentinel</artifactId>\n    <name>jeecg-cloud-sentinel</name>\n    <description>sentinel启动模块</description>\n    <version>3.9.1</version>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>org.jeecgframework.cloud</groupId>\n            <artifactId>sentinel-dashboard</artifactId>\n            <version>1.8.3</version>\n            <exclusions>\n                <exclusion>\n                    <artifactId>sentinel-web-servlet</artifactId>\n                    <groupId>com.alibaba.csp</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>sentinel-transport-simple-http</artifactId>\n                    <groupId>com.alibaba.csp</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>sentinel-parameter-flow-control</artifactId>\n                    <groupId>com.alibaba.csp</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>sentinel-core</artifactId>\n                    <groupId>com.alibaba.csp</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>sentinel-api-gateway-adapter-common</artifactId>\n                    <groupId>com.alibaba.csp</groupId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>com.alibaba.csp</groupId>\n            <artifactId>sentinel-datasource-nacos</artifactId>\n            <version>1.8.3</version>\n            <exclusions>\n                <exclusion>\n                    <artifactId>sentinel-core</artifactId>\n                    <groupId>com.alibaba.csp</groupId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>com.alibaba.csp</groupId>\n            <artifactId>sentinel-core</artifactId>\n            <version>1.8.3</version>\n        </dependency>\n        <dependency>\n            <groupId>com.alibaba.csp</groupId>\n            <artifactId>sentinel-web-servlet</artifactId>\n            <version>1.8.3</version>\n            <exclusions>\n                <exclusion>\n                    <artifactId>sentinel-core</artifactId>\n                    <groupId>com.alibaba.csp</groupId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>com.alibaba.csp</groupId>\n            <artifactId>sentinel-transport-simple-http</artifactId>\n            <version>1.8.3</version>\n        </dependency>\n        <dependency>\n            <groupId>com.alibaba.csp</groupId>\n            <artifactId>sentinel-parameter-flow-control</artifactId>\n            <version>1.8.3</version>\n            <exclusions>\n                <exclusion>\n                    <artifactId>sentinel-core</artifactId>\n                    <groupId>com.alibaba.csp</groupId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>com.alibaba.csp</groupId>\n            <artifactId>sentinel-api-gateway-adapter-common</artifactId>\n            <version>1.8.3</version>\n            <exclusions>\n                <exclusion>\n                    <artifactId>sentinel-parameter-flow-control</artifactId>\n                    <groupId>com.alibaba.csp</groupId>\n                </exclusion>\n                <exclusion>\n                    <artifactId>sentinel-core</artifactId>\n                    <groupId>com.alibaba.csp</groupId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n        <!--undertow容器-->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-undertow</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>commons-lang</groupId>\n            <artifactId>commons-lang</artifactId>\n            <version>2.6</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.apache.httpcomponents</groupId>\n            <artifactId>httpclient</artifactId>\n            <version>4.5.14</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.httpcomponents</groupId>\n            <artifactId>httpcore</artifactId>\n            <version>4.4.5</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.httpcomponents</groupId>\n            <artifactId>httpasyncclient</artifactId>\n            <version>4.1.3</version>\n        </dependency>\n        <dependency>\n            <groupId>org.apache.httpcomponents</groupId>\n            <artifactId>httpcore-nio</artifactId>\n            <version>4.4.6</version>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n            </plugin>\n        </plugins>\n    </build>\n\n    <!-- 环境 -->\n    <profiles>\n        <!-- 开发 -->\n        <profile>\n            <id>dev</id>\n            <activation>\n                <!--默认激活配置-->\n                <activeByDefault>true</activeByDefault>\n            </activation>\n            <properties>\n                <!--当前环境-->\n                <profile.name>dev</profile.name>\n                <!--Nacos服务地址-->\n                <config.server-addr>jeecg-boot-nacos:8848</config.server-addr>\n                <!--Nacos配置中心命名空间,用于支持多环境.这里必须使用ID，不能使用名称,默认为空-->\n                <config.namespace>springboot3</config.namespace>\n                <!--Nacos配置分组名称-->\n                <config.group>DEFAULT_GROUP</config.group>\n                <!--Nacos用户名-->\n                <config.username></config.username>\n                <!--Nacos密码-->\n                <config.password></config.password>\n            </properties>\n        </profile>\n        <!-- 测试 -->\n        <profile>\n            <id>test</id>\n            <properties>\n                <!--当前环境-->\n                <profile.name>test</profile.name>\n                <!--Nacos服务地址-->\n                <config.server-addr>jeecg-boot-nacos:8848</config.server-addr>\n                <!--Nacos配置中心命名空间,用于支持多环境.这里必须使用ID，不能使用名称,默认为空-->\n                <config.namespace>springboot3</config.namespace>\n                <!--Nacos配置分组名称-->\n                <config.group>DEFAULT_GROUP</config.group>\n                <!--Nacos用户名-->\n                <config.username></config.username>\n                <!--Nacos密码-->\n                <config.password></config.password>\n            </properties>\n        </profile>\n        <!-- docker打包用 -->\n        <profile>\n            <id>docker</id>\n            <properties>\n                <!--当前环境-->\n                <profile.name>docker</profile.name>\n                <!--Nacos服务地址-->\n                <config.server-addr>jeecg-boot-nacos:8848</config.server-addr>\n                <!--Nacos配置中心命名空间,用于支持多环境.这里必须使用ID，不能使用名称,默认为空-->\n                <config.namespace>springboot3</config.namespace>\n                <!--Nacos配置分组名称-->\n                <config.group>DEFAULT_GROUP</config.group>\n                <!--Nacos用户名-->\n                <config.username></config.username>\n                <!--Nacos密码-->\n                <config.password></config.password>\n            </properties>\n        </profile>\n        <!-- 生产 -->\n        <profile>\n            <id>prod</id>\n            <properties>\n                <!--当前环境-->\n                <profile.name>prod</profile.name>\n                <!--Nacos服务地址-->\n                <config.server-addr>jeecg-boot-nacos:8848</config.server-addr>\n                <!--Nacos配置中心命名空间,用于支持多环境.这里必须使用ID，不能使用名称,默认为空-->\n                <config.namespace>springboot3</config.namespace>\n                <!--Nacos配置分组名称-->\n                <config.group>DEFAULT_GROUP</config.group>\n                <!--Nacos用户名-->\n                <config.username></config.username>\n                <!--Nacos密码-->\n                <config.password></config.password>\n            </properties>\n        </profile>\n    </profiles>\n\n</project>\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/JeecgSentinelApplication.java",
    "content": "/*\n * Copyright 1999-2018 Alibaba Group Holding Ltd.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.alibaba.csp.sentinel.dashboard;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.ConfigurableApplicationContext;\nimport org.springframework.core.env.Environment;\nimport com.alibaba.csp.sentinel.init.InitExecutor;\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * Sentinel dashboard application.\n *\n * @author Carpenter Lee\n */\n@SpringBootApplication\n@Slf4j\npublic class JeecgSentinelApplication {\n\n    public static void main(String[] args) {\n        System.setProperty(\"csp.sentinel.app.type\", \"1\");\n        triggerSentinelInit();\n        ConfigurableApplicationContext application = SpringApplication.run(JeecgSentinelApplication.class, args);\n        Environment env = application.getEnvironment();\n        // 目前jeecg-sentinel 1.8.3 版本存在alibaba-sentinel 1.8.3版本 启动nacos数据源导致配置不生效的问题，以下为临时处理办法\n        System.getProperties().setProperty(\"sentinel.dashboard.auth.username\", env.getProperty(\"sentinel.dashboard.auth.username\"));\n        System.getProperties().setProperty(\"sentinel.dashboard.auth.password\", env.getProperty(\"sentinel.dashboard.auth.password\"));\n        String port = env.getProperty(\"server.port\");\n        log.info(\"\\n----------------------------------------------------------\\n\\t\" +\n                \"Application SentinelDashboard is running! Access URLs:\\n\\t\" +\n                \"Local: \\t\\thttp://localhost:\" + port  + \"/\\n\\t\" +\n                \"----------------------------------------------------------\");\n    }\n\n    private static void triggerSentinelInit() {\n        new Thread(() -> InitExecutor.doInit()).start();\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/constants/SentinelConStants.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.constants;\n\n/**\n * sentinel常量配置\n * @author zyf\n */\npublic class SentinelConStants {\n    public static final String GROUP_ID = \"SENTINEL_GROUP\";\n\n    /**\n     * 流控规则\n     */\n    public static final String FLOW_DATA_ID_POSTFIX = \"-flow-rules\";\n    /**\n     * 热点参数\n     */\n    public static final String PARAM_FLOW_DATA_ID_POSTFIX = \"-param-rules\";\n    /**\n     * 降级规则\n     */\n    public static final String DEGRADE_DATA_ID_POSTFIX = \"-degrade-rules\";\n    /**\n     * 系统规则\n     */\n    public static final String SYSTEM_DATA_ID_POSTFIX = \"-system-rules\";\n    /**\n     * 授权规则\n     */\n    public static final String AUTHORITY_DATA_ID_POSTFIX = \"-authority-rules\";\n\n    /**\n     * 网关API\n     */\n    public static final String GETEWAY_API_DATA_ID_POSTFIX = \"-api-rules\";\n    /**\n     * 网关流控规则\n     */\n    public static final String GETEWAY_FLOW_DATA_ID_POSTFIX = \"-flow-rules\";\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AuthorityRuleController.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.controller;\n\n\nimport java.util.Date;\nimport java.util.List;\n\nimport com.alibaba.csp.sentinel.dashboard.auth.AuthAction;\nimport com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;\nimport com.alibaba.csp.sentinel.dashboard.controller.base.BaseRuleController;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;\nimport com.alibaba.csp.sentinel.slots.block.RuleConstant;\nimport com.alibaba.csp.sentinel.util.StringUtil;\n\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.AuthorityRuleEntity;\nimport com.alibaba.csp.sentinel.dashboard.domain.Result;\nimport com.alibaba.csp.sentinel.dashboard.repository.rule.RuleRepository;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.web.bind.annotation.DeleteMapping;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.PutMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * 授权规则控制器\n *\n * @author zyf\n * @date 2022-04-13\n */\n@RestController\n@RequestMapping(value = \"/authority\")\npublic class AuthorityRuleController extends BaseRuleController {\n\n    private final Logger logger = LoggerFactory.getLogger(AuthorityRuleController.class);\n\n    @Autowired\n    private RuleRepository<AuthorityRuleEntity, Long> repository;\n    @Autowired\n    @Qualifier(\"authorityRuleNacosProvider\")\n    private DynamicRuleProvider<List<AuthorityRuleEntity>> ruleProvider;\n    @Autowired\n    @Qualifier(\"authorityRuleNacosPublisher\")\n    private DynamicRulePublisher<List<AuthorityRuleEntity>> rulePublisher;\n\n    @GetMapping(\"/rules\")\n    @AuthAction(PrivilegeType.READ_RULE)\n    public Result<List<AuthorityRuleEntity>> apiQueryAllRulesForMachine(@RequestParam String app,\n                                                                        @RequestParam String ip,\n                                                                        @RequestParam Integer port) {\n        if (StringUtil.isEmpty(app)) {\n            return Result.ofFail(-1, \"app cannot be null or empty\");\n        }\n        if (StringUtil.isEmpty(ip)) {\n            return Result.ofFail(-1, \"ip cannot be null or empty\");\n        }\n        if (port == null || port <= 0) {\n            return Result.ofFail(-1, \"Invalid parameter: port\");\n        }\n        try {\n            List<AuthorityRuleEntity> rules = ruleProvider.getRules(app);\n            rules = repository.saveAll(rules);\n            return Result.ofSuccess(rules);\n        } catch (Throwable throwable) {\n            logger.error(\"Error when querying authority rules\", throwable);\n            return Result.ofFail(-1, throwable.getMessage());\n        }\n    }\n\n    private <R> Result<R> checkEntityInternal(AuthorityRuleEntity entity) {\n        if (entity == null) {\n            return Result.ofFail(-1, \"bad rule body\");\n        }\n        if (StringUtil.isBlank(entity.getApp())) {\n            return Result.ofFail(-1, \"app can't be null or empty\");\n        }\n        if (StringUtil.isBlank(entity.getIp())) {\n            return Result.ofFail(-1, \"ip can't be null or empty\");\n        }\n        if (entity.getPort() == null || entity.getPort() <= 0) {\n            return Result.ofFail(-1, \"port can't be null\");\n        }\n        if (entity.getRule() == null) {\n            return Result.ofFail(-1, \"rule can't be null\");\n        }\n        if (StringUtil.isBlank(entity.getResource())) {\n            return Result.ofFail(-1, \"resource name cannot be null or empty\");\n        }\n        if (StringUtil.isBlank(entity.getLimitApp())) {\n            return Result.ofFail(-1, \"limitApp should be valid\");\n        }\n        if (entity.getStrategy() != RuleConstant.AUTHORITY_WHITE\n                && entity.getStrategy() != RuleConstant.AUTHORITY_BLACK) {\n            return Result.ofFail(-1, \"Unknown strategy (must be blacklist or whitelist)\");\n        }\n        return null;\n    }\n\n    @PostMapping(\"/rule\")\n    @AuthAction(PrivilegeType.WRITE_RULE)\n    public Result<AuthorityRuleEntity> apiAddAuthorityRule(@RequestBody AuthorityRuleEntity entity) {\n        Result<AuthorityRuleEntity> checkResult = checkEntityInternal(entity);\n        if (checkResult != null) {\n            return checkResult;\n        }\n        entity.setId(null);\n        Date date = new Date();\n        entity.setGmtCreate(date);\n        entity.setGmtModified(date);\n        try {\n            entity = repository.save(entity);\n            publishRules(entity.getApp());\n        } catch (Throwable throwable) {\n            logger.error(\"Failed to add authority rule\", throwable);\n            return Result.ofThrowable(-1, throwable);\n        }\n        return Result.ofSuccess(entity);\n    }\n\n    @PutMapping(\"/rule/{id}\")\n    @AuthAction(PrivilegeType.WRITE_RULE)\n    public Result<AuthorityRuleEntity> apiUpdateParamFlowRule(@PathVariable(\"id\") Long id,\n                                                              @RequestBody AuthorityRuleEntity entity) {\n        if (id == null || id <= 0) {\n            return Result.ofFail(-1, \"Invalid id\");\n        }\n        Result<AuthorityRuleEntity> checkResult = checkEntityInternal(entity);\n        if (checkResult != null) {\n            return checkResult;\n        }\n        entity.setId(id);\n        Date date = new Date();\n        entity.setGmtCreate(null);\n        entity.setGmtModified(date);\n        try {\n            entity = repository.save(entity);\n            if (entity == null) {\n                return Result.ofFail(-1, \"Failed to save authority rule\");\n            }\n            publishRules(entity.getApp());\n        } catch (Throwable throwable) {\n            logger.error(\"Failed to save authority rule\", throwable);\n            return Result.ofThrowable(-1, throwable);\n        }\n        return Result.ofSuccess(entity);\n    }\n\n    @DeleteMapping(\"/rule/{id}\")\n    @AuthAction(PrivilegeType.DELETE_RULE)\n    public Result<Long> apiDeleteRule(@PathVariable(\"id\") Long id) {\n        if (id == null) {\n            return Result.ofFail(-1, \"id cannot be null\");\n        }\n        AuthorityRuleEntity oldEntity = repository.findById(id);\n        if (oldEntity == null) {\n            return Result.ofSuccess(null);\n        }\n        try {\n            repository.delete(id);\n            publishRules(oldEntity.getApp());\n        } catch (Exception e) {\n            return Result.ofFail(-1, e.getMessage());\n        }\n        return Result.ofSuccess(id);\n    }\n\n    private void publishRules(String app) throws Exception {\n        List<AuthorityRuleEntity> rules = repository.findAllByApp(app);\n        rulePublisher.publish(app, rules);\n        //延迟加载\n        delayTime();\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/DegradeController.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.controller;\n\n\nimport java.util.Date;\nimport java.util.List;\n\nimport com.alibaba.csp.sentinel.dashboard.auth.AuthAction;\nimport com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;\nimport com.alibaba.csp.sentinel.dashboard.controller.base.BaseRuleController;\nimport com.alibaba.csp.sentinel.dashboard.repository.rule.RuleRepository;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;\nimport com.alibaba.csp.sentinel.slots.block.RuleConstant;\nimport com.alibaba.csp.sentinel.slots.block.degrade.circuitbreaker.CircuitBreakerStrategy;\nimport com.alibaba.csp.sentinel.util.StringUtil;\n\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.DegradeRuleEntity;\nimport com.alibaba.csp.sentinel.dashboard.domain.Result;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.web.bind.annotation.DeleteMapping;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.PutMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * 降级规则控制器\n *\n * @author zyf\n * @date 2022-04-13\n */\n@RestController\n@RequestMapping(\"/degrade\")\npublic class DegradeController extends BaseRuleController {\n\n    private final Logger logger = LoggerFactory.getLogger(DegradeController.class);\n\n    @Autowired\n    private RuleRepository<DegradeRuleEntity, Long> repository;\n    @Autowired\n    @Qualifier(\"degradeRuleNacosProvider\")\n    private DynamicRuleProvider<List<DegradeRuleEntity>> ruleProvider;\n    @Autowired\n    @Qualifier(\"degradeRuleNacosPublisher\")\n    private DynamicRulePublisher<List<DegradeRuleEntity>> rulePublisher;\n\n    @GetMapping(\"/rules.json\")\n    @AuthAction(PrivilegeType.READ_RULE)\n    public Result<List<DegradeRuleEntity>> apiQueryMachineRules(String app, String ip, Integer port) {\n        if (StringUtil.isEmpty(app)) {\n            return Result.ofFail(-1, \"app can't be null or empty\");\n        }\n        if (StringUtil.isEmpty(ip)) {\n            return Result.ofFail(-1, \"ip can't be null or empty\");\n        }\n        if (port == null) {\n            return Result.ofFail(-1, \"port can't be null\");\n        }\n        try {\n            List<DegradeRuleEntity> rules = ruleProvider.getRules(app);\n            rules = repository.saveAll(rules);\n            return Result.ofSuccess(rules);\n        } catch (Throwable throwable) {\n            logger.error(\"queryApps error:\", throwable);\n            return Result.ofThrowable(-1, throwable);\n        }\n    }\n\n    @PostMapping(\"/rule\")\n    @AuthAction(PrivilegeType.WRITE_RULE)\n    public Result<DegradeRuleEntity> apiAddRule(@RequestBody DegradeRuleEntity entity) {\n        Result<DegradeRuleEntity> checkResult = checkEntityInternal(entity);\n        if (checkResult != null) {\n            return checkResult;\n        }\n        Date date = new Date();\n        entity.setGmtCreate(date);\n        entity.setGmtModified(date);\n        try {\n            entity = repository.save(entity);\n            publishRules(entity.getApp());\n        } catch (Throwable t) {\n            logger.error(\"Failed to add new degrade rule, app={}, ip={}\", entity.getApp(), entity.getIp(), t);\n            return Result.ofThrowable(-1, t);\n        }\n        return Result.ofSuccess(entity);\n    }\n\n    @PutMapping(\"/rule/{id}\")\n    @AuthAction(PrivilegeType.WRITE_RULE)\n    public Result<DegradeRuleEntity> apiUpdateRule(@PathVariable(\"id\") Long id,\n                                                   @RequestBody DegradeRuleEntity entity) {\n        if (id == null || id <= 0) {\n            return Result.ofFail(-1, \"id can't be null or negative\");\n        }\n        DegradeRuleEntity oldEntity = repository.findById(id);\n        if (oldEntity == null) {\n            return Result.ofFail(-1, \"Degrade rule does not exist, id=\" + id);\n        }\n        entity.setApp(oldEntity.getApp());\n        entity.setIp(oldEntity.getIp());\n        entity.setPort(oldEntity.getPort());\n        entity.setId(oldEntity.getId());\n        Result<DegradeRuleEntity> checkResult = checkEntityInternal(entity);\n        if (checkResult != null) {\n            return checkResult;\n        }\n\n        entity.setGmtCreate(oldEntity.getGmtCreate());\n        entity.setGmtModified(new Date());\n        try {\n            entity = repository.save(entity);\n            publishRules(entity.getApp());\n        } catch (Throwable t) {\n            logger.error(\"Failed to save degrade rule, id={}, rule={}\", id, entity, t);\n            return Result.ofThrowable(-1, t);\n        }\n        return Result.ofSuccess(entity);\n    }\n\n    @DeleteMapping(\"/rule/{id}\")\n    @AuthAction(PrivilegeType.DELETE_RULE)\n    public Result<Long> delete(@PathVariable(\"id\") Long id) {\n        if (id == null) {\n            return Result.ofFail(-1, \"id can't be null\");\n        }\n\n        DegradeRuleEntity oldEntity = repository.findById(id);\n        if (oldEntity == null) {\n            return Result.ofSuccess(null);\n        }\n\n        try {\n            repository.delete(id);\n            publishRules(oldEntity.getApp());\n        } catch (Throwable throwable) {\n            logger.error(\"Failed to delete degrade rule, id={}\", id, throwable);\n            return Result.ofThrowable(-1, throwable);\n        }\n        return Result.ofSuccess(id);\n    }\n\n    private void publishRules(/*@NonNull*/ String app) throws Exception {\n        List<DegradeRuleEntity> rules = repository.findAllByApp(app);\n        rulePublisher.publish(app, rules);\n        //延迟加载\n        delayTime();\n    }\n\n    private <R> Result<R> checkEntityInternal(DegradeRuleEntity entity) {\n        if (StringUtil.isBlank(entity.getApp())) {\n            return Result.ofFail(-1, \"app can't be blank\");\n        }\n        if (StringUtil.isBlank(entity.getIp())) {\n            return Result.ofFail(-1, \"ip can't be null or empty\");\n        }\n        if (entity.getPort() == null || entity.getPort() <= 0) {\n            return Result.ofFail(-1, \"invalid port: \" + entity.getPort());\n        }\n        if (StringUtil.isBlank(entity.getLimitApp())) {\n            return Result.ofFail(-1, \"limitApp can't be null or empty\");\n        }\n        if (StringUtil.isBlank(entity.getResource())) {\n            return Result.ofFail(-1, \"resource can't be null or empty\");\n        }\n        Double threshold = entity.getCount();\n        if (threshold == null || threshold < 0) {\n            return Result.ofFail(-1, \"invalid threshold: \" + threshold);\n        }\n        Integer recoveryTimeoutSec = entity.getTimeWindow();\n        if (recoveryTimeoutSec == null || recoveryTimeoutSec <= 0) {\n            return Result.ofFail(-1, \"recoveryTimeout should be positive\");\n        }\n        Integer strategy = entity.getGrade();\n        if (strategy == null) {\n            return Result.ofFail(-1, \"circuit breaker strategy cannot be null\");\n        }\n        if (strategy < CircuitBreakerStrategy.SLOW_REQUEST_RATIO.getType()\n                || strategy > RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT) {\n            return Result.ofFail(-1, \"Invalid circuit breaker strategy: \" + strategy);\n        }\n        if (entity.getMinRequestAmount()  == null || entity.getMinRequestAmount() <= 0) {\n            return Result.ofFail(-1, \"Invalid minRequestAmount\");\n        }\n        if (entity.getStatIntervalMs() == null || entity.getStatIntervalMs() <= 0) {\n            return Result.ofFail(-1, \"Invalid statInterval\");\n        }\n        if (strategy == RuleConstant.DEGRADE_GRADE_RT) {\n            Double slowRatio = entity.getSlowRatioThreshold();\n            if (slowRatio == null) {\n                return Result.ofFail(-1, \"SlowRatioThreshold is required for slow request ratio strategy\");\n            } else if (slowRatio < 0 || slowRatio > 1) {\n                return Result.ofFail(-1, \"SlowRatioThreshold should be in range: [0.0, 1.0]\");\n            }\n        } else if (strategy == RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) {\n            if (threshold > 1) {\n                return Result.ofFail(-1, \"Ratio threshold should be in range: [0.0, 1.0]\");\n            }\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.controller;\n\n\nimport com.alibaba.csp.sentinel.dashboard.auth.AuthAction;\nimport com.alibaba.csp.sentinel.dashboard.auth.AuthService;\nimport com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;\nimport com.alibaba.csp.sentinel.dashboard.client.CommandNotFoundException;\nimport com.alibaba.csp.sentinel.dashboard.controller.base.BaseRuleController;\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.SentinelVersion;\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.ParamFlowRuleEntity;\nimport com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;\nimport com.alibaba.csp.sentinel.dashboard.domain.Result;\nimport com.alibaba.csp.sentinel.dashboard.repository.rule.RuleRepository;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;\nimport com.alibaba.csp.sentinel.dashboard.util.VersionUtils;\nimport com.alibaba.csp.sentinel.slots.block.RuleConstant;\nimport com.alibaba.csp.sentinel.util.StringUtil;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.Date;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.concurrent.ExecutionException;\n/**\n * 热点参数规则控制器\n *\n * @author zyf\n * @date 2022-04-13\n */\n@RestController\n@RequestMapping(value = \"/paramFlow\")\npublic class ParamFlowRuleController extends BaseRuleController {\n\n    private final Logger logger = LoggerFactory.getLogger(ParamFlowRuleController.class);\n\n    @Autowired\n    private AppManagement appManagement;\n    @Autowired\n    private RuleRepository<ParamFlowRuleEntity, Long> repository;\n    @Autowired\n    @Qualifier(\"paramFlowRuleNacosProvider\")\n    private DynamicRuleProvider<List<ParamFlowRuleEntity>> ruleProvider;\n    @Autowired\n    @Qualifier(\"paramFlowRuleNacosPublisher\")\n    private DynamicRulePublisher<List<ParamFlowRuleEntity>> rulePublisher;\n\n    private boolean checkIfSupported(String app, String ip, int port) {\n        try {\n            return Optional.ofNullable(appManagement.getDetailApp(app))\n                    .flatMap(e -> e.getMachine(ip, port))\n                    .flatMap(m -> VersionUtils.parseVersion(m.getVersion())\n                            .map(v -> v.greaterOrEqual(version020)))\n                    .orElse(true);\n            // If error occurred or cannot retrieve machine info, return true.\n        } catch (Exception ex) {\n            return true;\n        }\n    }\n\n    @GetMapping(\"/rules\")\n    @AuthAction(PrivilegeType.READ_RULE)\n    public Result<List<ParamFlowRuleEntity>> apiQueryAllRulesForMachine(@RequestParam String app,\n                                                                        @RequestParam String ip,\n                                                                        @RequestParam Integer port) {\n        if (StringUtil.isEmpty(app)) {\n            return Result.ofFail(-1, \"app cannot be null or empty\");\n        }\n        if (StringUtil.isEmpty(ip)) {\n            return Result.ofFail(-1, \"ip cannot be null or empty\");\n        }\n        if (port == null || port <= 0) {\n            return Result.ofFail(-1, \"Invalid parameter: port\");\n        }\n        if (!checkIfSupported(app, ip, port)) {\n            return unsupportedVersion();\n        }\n        try {\n            List<ParamFlowRuleEntity> rules = ruleProvider.getRules(app);\n            rules = repository.saveAll(rules);\n            return Result.ofSuccess(rules);\n        } catch (ExecutionException ex) {\n            logger.error(\"Error when querying parameter flow rules\", ex.getCause());\n            if (isNotSupported(ex.getCause())) {\n                return unsupportedVersion();\n            } else {\n                return Result.ofThrowable(-1, ex.getCause());\n            }\n        } catch (Throwable throwable) {\n            logger.error(\"Error when querying parameter flow rules\", throwable);\n            return Result.ofFail(-1, throwable.getMessage());\n        }\n    }\n\n    private boolean isNotSupported(Throwable ex) {\n        return ex instanceof CommandNotFoundException;\n    }\n\n    @PostMapping(\"/rule\")\n    @AuthAction(AuthService.PrivilegeType.WRITE_RULE)\n    public Result<ParamFlowRuleEntity> apiAddParamFlowRule(@RequestBody ParamFlowRuleEntity entity) {\n        Result<ParamFlowRuleEntity> checkResult = checkEntityInternal(entity);\n        if (checkResult != null) {\n            return checkResult;\n        }\n        if (!checkIfSupported(entity.getApp(), entity.getIp(), entity.getPort())) {\n            return unsupportedVersion();\n        }\n        entity.setId(null);\n        entity.getRule().setResource(entity.getResource().trim());\n        Date date = new Date();\n        entity.setGmtCreate(date);\n        entity.setGmtModified(date);\n        try {\n            entity = repository.save(entity);\n            publishRules(entity.getApp());\n            return Result.ofSuccess(entity);\n        } catch (ExecutionException ex) {\n            logger.error(\"Error when adding new parameter flow rules\", ex.getCause());\n            if (isNotSupported(ex.getCause())) {\n                return unsupportedVersion();\n            } else {\n                return Result.ofThrowable(-1, ex.getCause());\n            }\n        } catch (Throwable throwable) {\n            logger.error(\"Error when adding new parameter flow rules\", throwable);\n            return Result.ofFail(-1, throwable.getMessage());\n        }\n    }\n\n    private <R> Result<R> checkEntityInternal(ParamFlowRuleEntity entity) {\n        if (entity == null) {\n            return Result.ofFail(-1, \"bad rule body\");\n        }\n        if (StringUtil.isBlank(entity.getApp())) {\n            return Result.ofFail(-1, \"app can't be null or empty\");\n        }\n        if (StringUtil.isBlank(entity.getIp())) {\n            return Result.ofFail(-1, \"ip can't be null or empty\");\n        }\n        if (entity.getPort() == null || entity.getPort() <= 0) {\n            return Result.ofFail(-1, \"port can't be null\");\n        }\n        if (entity.getRule() == null) {\n            return Result.ofFail(-1, \"rule can't be null\");\n        }\n        if (StringUtil.isBlank(entity.getResource())) {\n            return Result.ofFail(-1, \"resource name cannot be null or empty\");\n        }\n        if (entity.getCount() < 0) {\n            return Result.ofFail(-1, \"count should be valid\");\n        }\n        if (entity.getGrade() != RuleConstant.FLOW_GRADE_QPS) {\n            return Result.ofFail(-1, \"Unknown mode (blockGrade) for parameter flow control\");\n        }\n        if (entity.getParamIdx() == null || entity.getParamIdx() < 0) {\n            return Result.ofFail(-1, \"paramIdx should be valid\");\n        }\n        if (entity.getDurationInSec() <= 0) {\n            return Result.ofFail(-1, \"durationInSec should be valid\");\n        }\n        if (entity.getControlBehavior() < 0) {\n            return Result.ofFail(-1, \"controlBehavior should be valid\");\n        }\n        return null;\n    }\n\n    @PutMapping(\"/rule/{id}\")\n    @AuthAction(AuthService.PrivilegeType.WRITE_RULE)\n    public Result<ParamFlowRuleEntity> apiUpdateParamFlowRule(@PathVariable(\"id\") Long id,\n                                                              @RequestBody ParamFlowRuleEntity entity) {\n        if (id == null || id <= 0) {\n            return Result.ofFail(-1, \"Invalid id\");\n        }\n        ParamFlowRuleEntity oldEntity = repository.findById(id);\n        if (oldEntity == null) {\n            return Result.ofFail(-1, \"id \" + id + \" does not exist\");\n        }\n\n        Result<ParamFlowRuleEntity> checkResult = checkEntityInternal(entity);\n        if (checkResult != null) {\n            return checkResult;\n        }\n        if (!checkIfSupported(entity.getApp(), entity.getIp(), entity.getPort())) {\n            return unsupportedVersion();\n        }\n        entity.setId(id);\n        Date date = new Date();\n        entity.setGmtCreate(oldEntity.getGmtCreate());\n        entity.setGmtModified(date);\n        try {\n            entity = repository.save(entity);\n            publishRules(entity.getApp());\n            return Result.ofSuccess(entity);\n        } catch (ExecutionException ex) {\n            logger.error(\"Error when updating parameter flow rules, id=\" + id, ex.getCause());\n            if (isNotSupported(ex.getCause())) {\n                return unsupportedVersion();\n            } else {\n                return Result.ofThrowable(-1, ex.getCause());\n            }\n        } catch (Throwable throwable) {\n            logger.error(\"Error when updating parameter flow rules, id=\" + id, throwable);\n            return Result.ofFail(-1, throwable.getMessage());\n        }\n    }\n\n    @DeleteMapping(\"/rule/{id}\")\n    @AuthAction(PrivilegeType.DELETE_RULE)\n    public Result<Long> apiDeleteRule(@PathVariable(\"id\") Long id) {\n        if (id == null) {\n            return Result.ofFail(-1, \"id cannot be null\");\n        }\n        ParamFlowRuleEntity oldEntity = repository.findById(id);\n        if (oldEntity == null) {\n            return Result.ofSuccess(null);\n        }\n\n        try {\n            repository.delete(id);\n            publishRules(oldEntity.getApp());\n            return Result.ofSuccess(id);\n        } catch (ExecutionException ex) {\n            logger.error(\"Error when deleting parameter flow rules\", ex.getCause());\n            if (isNotSupported(ex.getCause())) {\n                return unsupportedVersion();\n            } else {\n                return Result.ofThrowable(-1, ex.getCause());\n            }\n        } catch (Throwable throwable) {\n            logger.error(\"Error when deleting parameter flow rules\", throwable);\n            return Result.ofFail(-1, throwable.getMessage());\n        }\n    }\n\n    private void publishRules(String app) throws Exception {\n        List<ParamFlowRuleEntity> rules = repository.findAllByApp(app);\n        rulePublisher.publish(app, rules);\n        //延迟加载\n        delayTime();\n    }\n\n    private <R> Result<R> unsupportedVersion() {\n        return Result.ofFail(4041,\n                \"Sentinel client not supported for parameter flow control (unsupported version or dependency absent)\");\n    }\n\n    private final SentinelVersion version020 = new SentinelVersion().setMinorVersion(2);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/SystemController.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.controller;\n\n\nimport java.util.Date;\nimport java.util.List;\n\nimport com.alibaba.csp.sentinel.dashboard.auth.AuthAction;\nimport com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;\nimport com.alibaba.csp.sentinel.dashboard.controller.base.BaseRuleController;\nimport com.alibaba.csp.sentinel.dashboard.repository.rule.RuleRepository;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;\nimport com.alibaba.csp.sentinel.util.StringUtil;\n\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.SystemRuleEntity;\nimport com.alibaba.csp.sentinel.dashboard.domain.Result;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n\n/**\n * 系统规则控制器\n *\n * @author zyf\n * @date 2022-04-13\n */\n@RestController\n@RequestMapping(\"/system\")\npublic class SystemController extends BaseRuleController {\n\n    private final Logger logger = LoggerFactory.getLogger(SystemController.class);\n\n    @Autowired\n    private RuleRepository<SystemRuleEntity, Long> repository;\n    @Autowired\n    @Qualifier(\"systemRuleNacosProvider\")\n    private DynamicRuleProvider<List<SystemRuleEntity>> ruleProvider;\n    @Autowired\n    @Qualifier(\"systemRuleNacosPublisher\")\n    private DynamicRulePublisher<List<SystemRuleEntity>> rulePublisher;\n\n    private <R> Result<R> checkBasicParams(String app, String ip, Integer port) {\n        if (StringUtil.isEmpty(app)) {\n            return Result.ofFail(-1, \"app can't be null or empty\");\n        }\n        if (StringUtil.isEmpty(ip)) {\n            return Result.ofFail(-1, \"ip can't be null or empty\");\n        }\n        if (port == null) {\n            return Result.ofFail(-1, \"port can't be null\");\n        }\n        if (port <= 0 || port > 65535) {\n            return Result.ofFail(-1, \"port should be in (0, 65535)\");\n        }\n        return null;\n    }\n\n    @GetMapping(\"/rules.json\")\n    @AuthAction(PrivilegeType.READ_RULE)\n    public Result<List<SystemRuleEntity>> apiQueryMachineRules(String app, String ip,\n                                                               Integer port) {\n        Result<List<SystemRuleEntity>> checkResult = checkBasicParams(app, ip, port);\n        if (checkResult != null) {\n            return checkResult;\n        }\n        try {\n            List<SystemRuleEntity> rules = ruleProvider.getRules(app);\n            rules = repository.saveAll(rules);\n            return Result.ofSuccess(rules);\n        } catch (Throwable throwable) {\n            logger.error(\"Query machine system rules error\", throwable);\n            return Result.ofThrowable(-1, throwable);\n        }\n    }\n\n    private int countNotNullAndNotNegative(Number... values) {\n        int notNullCount = 0;\n        for (int i = 0; i < values.length; i++) {\n            if (values[i] != null && values[i].doubleValue() >= 0) {\n                notNullCount++;\n            }\n        }\n        return notNullCount;\n    }\n\n    @RequestMapping(\"/new.json\")\n    @AuthAction(PrivilegeType.WRITE_RULE)\n    public Result<SystemRuleEntity> apiAdd(String app, String ip, Integer port,\n                                           Double highestSystemLoad, Double highestCpuUsage, Long avgRt,\n                                           Long maxThread, Double qps) {\n\n        Result<SystemRuleEntity> checkResult = checkBasicParams(app, ip, port);\n        if (checkResult != null) {\n            return checkResult;\n        }\n\n        int notNullCount = countNotNullAndNotNegative(highestSystemLoad, avgRt, maxThread, qps, highestCpuUsage);\n        if (notNullCount != 1) {\n            return Result.ofFail(-1, \"only one of [highestSystemLoad, avgRt, maxThread, qps,highestCpuUsage] \"\n                    + \"value must be set > 0, but \" + notNullCount + \" values get\");\n        }\n        if (null != highestCpuUsage && highestCpuUsage > 1) {\n            return Result.ofFail(-1, \"highestCpuUsage must between [0.0, 1.0]\");\n        }\n        SystemRuleEntity entity = new SystemRuleEntity();\n        entity.setApp(app.trim());\n        entity.setIp(ip.trim());\n        entity.setPort(port);\n        // -1 is a fake value\n        if (null != highestSystemLoad) {\n            entity.setHighestSystemLoad(highestSystemLoad);\n        } else {\n            entity.setHighestSystemLoad(-1D);\n        }\n\n        if (null != highestCpuUsage) {\n            entity.setHighestCpuUsage(highestCpuUsage);\n        } else {\n            entity.setHighestCpuUsage(-1D);\n        }\n\n        if (avgRt != null) {\n            entity.setAvgRt(avgRt);\n        } else {\n            entity.setAvgRt(-1L);\n        }\n        if (maxThread != null) {\n            entity.setMaxThread(maxThread);\n        } else {\n            entity.setMaxThread(-1L);\n        }\n        if (qps != null) {\n            entity.setQps(qps);\n        } else {\n            entity.setQps(-1D);\n        }\n        Date date = new Date();\n        entity.setGmtCreate(date);\n        entity.setGmtModified(date);\n        try {\n            entity = repository.save(entity);\n            publishRules(app);\n        } catch (Throwable throwable) {\n            logger.error(\"Add SystemRule error\", throwable);\n            return Result.ofThrowable(-1, throwable);\n        }\n        return Result.ofSuccess(entity);\n    }\n\n    @GetMapping(\"/save.json\")\n    @AuthAction(PrivilegeType.WRITE_RULE)\n    public Result<SystemRuleEntity> apiUpdateIfNotNull(Long id, String app, Double highestSystemLoad,\n                                                       Double highestCpuUsage, Long avgRt, Long maxThread, Double qps) {\n        if (id == null) {\n            return Result.ofFail(-1, \"id can't be null\");\n        }\n        SystemRuleEntity entity = repository.findById(id);\n        if (entity == null) {\n            return Result.ofFail(-1, \"id \" + id + \" dose not exist\");\n        }\n\n        if (StringUtil.isNotBlank(app)) {\n            entity.setApp(app.trim());\n        }\n        if (highestSystemLoad != null) {\n            if (highestSystemLoad < 0) {\n                return Result.ofFail(-1, \"highestSystemLoad must >= 0\");\n            }\n            entity.setHighestSystemLoad(highestSystemLoad);\n        }\n        if (highestCpuUsage != null) {\n            if (highestCpuUsage < 0) {\n                return Result.ofFail(-1, \"highestCpuUsage must >= 0\");\n            }\n            if (highestCpuUsage > 1) {\n                return Result.ofFail(-1, \"highestCpuUsage must <= 1\");\n            }\n            entity.setHighestCpuUsage(highestCpuUsage);\n        }\n        if (avgRt != null) {\n            if (avgRt < 0) {\n                return Result.ofFail(-1, \"avgRt must >= 0\");\n            }\n            entity.setAvgRt(avgRt);\n        }\n        if (maxThread != null) {\n            if (maxThread < 0) {\n                return Result.ofFail(-1, \"maxThread must >= 0\");\n            }\n            entity.setMaxThread(maxThread);\n        }\n        if (qps != null) {\n            if (qps < 0) {\n                return Result.ofFail(-1, \"qps must >= 0\");\n            }\n            entity.setQps(qps);\n        }\n        Date date = new Date();\n        entity.setGmtModified(date);\n        try {\n            entity = repository.save(entity);\n            publishRules(entity.getApp());\n        } catch (Throwable throwable) {\n            logger.error(\"save error:\", throwable);\n            return Result.ofThrowable(-1, throwable);\n        }\n        return Result.ofSuccess(entity);\n    }\n\n    @RequestMapping(\"/delete.json\")\n    @AuthAction(PrivilegeType.DELETE_RULE)\n    public Result<?> delete(Long id) {\n        if (id == null) {\n            return Result.ofFail(-1, \"id can't be null\");\n        }\n        SystemRuleEntity oldEntity = repository.findById(id);\n        if (oldEntity == null) {\n            return Result.ofSuccess(null);\n        }\n        try {\n            repository.delete(id);\n            publishRules(oldEntity.getApp());\n        } catch (Throwable throwable) {\n            logger.error(\"delete error:\", throwable);\n            return Result.ofThrowable(-1, throwable);\n        }\n        return Result.ofSuccess(id);\n    }\n\n    private void publishRules(String app) throws Exception {\n        List<SystemRuleEntity> rules = repository.findAllByApp(app);\n        rulePublisher.publish(app, rules);\n        //延迟加载\n        delayTime();\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/base/BaseRuleController.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.controller.base;\n\nimport java.util.concurrent.TimeUnit;\n\n\n/**\n * Nacos持久化通用处理类\n *\n * @author zyf\n * @date 2022-04-13\n */\npublic class BaseRuleController {\n    /**\n     * 延迟一下\n     *\n     * 解释：列表加载数据的时候，Nacos持久化还没做完，导致加载数据不对\n     */\n    public static void delayTime(){\n        try {\n            TimeUnit.MILLISECONDS.sleep(100);\n            System.out.println(\"-------------睡100毫秒-----------\");\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.controller.gateway;\n\nimport com.alibaba.csp.sentinel.dashboard.auth.AuthAction;\nimport com.alibaba.csp.sentinel.dashboard.auth.AuthService;\nimport com.alibaba.csp.sentinel.dashboard.controller.base.BaseRuleController;\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity;\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiPredicateItemEntity;\nimport com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo;\nimport com.alibaba.csp.sentinel.dashboard.domain.Result;\nimport com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.api.AddApiReqVo;\nimport com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.api.ApiPredicateItemVo;\nimport com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.api.UpdateApiReqVo;\nimport com.alibaba.csp.sentinel.dashboard.repository.gateway.InMemApiDefinitionStore;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;\nimport com.alibaba.csp.sentinel.util.StringUtil;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.util.CollectionUtils;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.*;\n\nimport static com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants.*;\n\n/**\n * 网关API规则控制器\n *\n * @author zyf\n * @date 2022-04-13\n */\n@RestController\n@RequestMapping(value = \"/gateway/api\")\npublic class GatewayApiController extends BaseRuleController {\n\n    private final Logger logger = LoggerFactory.getLogger(GatewayApiController.class);\n\n    @Autowired\n    private InMemApiDefinitionStore repository;\n\n\n    @Autowired\n    @Qualifier(\"gateWayApiNacosProvider\")\n    private DynamicRuleProvider<List<ApiDefinitionEntity>> apiProvider;\n\n    @Autowired\n    @Qualifier(\"gateWayApiNacosPublisher\")\n    private DynamicRulePublisher<List<ApiDefinitionEntity>> apiPublisher;\n\n    @GetMapping(\"/list.json\")\n    @AuthAction(AuthService.PrivilegeType.READ_RULE)\n    public Result<List<ApiDefinitionEntity>> queryApis(String app, String ip, Integer port) {\n        if (StringUtil.isEmpty(app)) {\n            return Result.ofFail(-1, \"app can't be null or empty\");\n        }\n        if (StringUtil.isEmpty(ip)) {\n            return Result.ofFail(-1, \"ip can't be null or empty\");\n        }\n        if (port == null) {\n            return Result.ofFail(-1, \"port can't be null\");\n        }\n\n        try {\n            List<ApiDefinitionEntity> apis = apiProvider.getRules(app);\n            repository.saveAll(apis);\n            return Result.ofSuccess(apis);\n        } catch (Throwable throwable) {\n            logger.error(\"queryApis error:\", throwable);\n            return Result.ofThrowable(-1, throwable);\n        }\n    }\n\n    @PostMapping(\"/new.json\")\n    @AuthAction(AuthService.PrivilegeType.WRITE_RULE)\n    public Result<ApiDefinitionEntity> addApi(HttpServletRequest request, @RequestBody AddApiReqVo reqVo) {\n\n        String app = reqVo.getApp();\n        if (StringUtil.isBlank(app)) {\n            return Result.ofFail(-1, \"app can't be null or empty\");\n        }\n\n        ApiDefinitionEntity entity = new ApiDefinitionEntity();\n        entity.setApp(app.trim());\n\n        String ip = reqVo.getIp();\n        if (StringUtil.isBlank(ip)) {\n            return Result.ofFail(-1, \"ip can't be null or empty\");\n        }\n        entity.setIp(ip.trim());\n\n        Integer port = reqVo.getPort();\n        if (port == null) {\n            return Result.ofFail(-1, \"port can't be null\");\n        }\n        entity.setPort(port);\n\n        // API名称\n        String apiName = reqVo.getApiName();\n        if (StringUtil.isBlank(apiName)) {\n            return Result.ofFail(-1, \"apiName can't be null or empty\");\n        }\n        entity.setApiName(apiName.trim());\n\n        // 匹配规则列表\n        List<ApiPredicateItemVo> predicateItems = reqVo.getPredicateItems();\n        if (CollectionUtils.isEmpty(predicateItems)) {\n            return Result.ofFail(-1, \"predicateItems can't empty\");\n        }\n\n        List<ApiPredicateItemEntity> predicateItemEntities = new ArrayList<>();\n        for (ApiPredicateItemVo predicateItem : predicateItems) {\n            ApiPredicateItemEntity predicateItemEntity = new ApiPredicateItemEntity();\n\n            // 匹配模式\n            Integer matchStrategy = predicateItem.getMatchStrategy();\n            if (!Arrays.asList(URL_MATCH_STRATEGY_EXACT, URL_MATCH_STRATEGY_PREFIX, URL_MATCH_STRATEGY_REGEX).contains(matchStrategy)) {\n                return Result.ofFail(-1, \"invalid matchStrategy: \" + matchStrategy);\n            }\n            predicateItemEntity.setMatchStrategy(matchStrategy);\n\n            // 匹配串\n            String pattern = predicateItem.getPattern();\n            if (StringUtil.isBlank(pattern)) {\n                return Result.ofFail(-1, \"pattern can't be null or empty\");\n            }\n            predicateItemEntity.setPattern(pattern);\n\n            predicateItemEntities.add(predicateItemEntity);\n        }\n        entity.setPredicateItems(new LinkedHashSet<>(predicateItemEntities));\n\n        // 检查API名称不能重复\n        List<ApiDefinitionEntity> allApis = repository.findAllByMachine(MachineInfo.of(app.trim(), ip.trim(), port));\n        if (allApis.stream().map(o -> o.getApiName()).anyMatch(o -> o.equals(apiName.trim()))) {\n            return Result.ofFail(-1, \"apiName exists: \" + apiName);\n        }\n\n        Date date = new Date();\n        entity.setGmtCreate(date);\n        entity.setGmtModified(date);\n\n        try {\n            entity = repository.save(entity);\n        } catch (Throwable throwable) {\n            logger.error(\"add gateway api error:\", throwable);\n            return Result.ofThrowable(-1, throwable);\n        }\n\n        if (!publishApis(app, ip, port)) {\n            logger.warn(\"publish gateway apis fail after add\");\n        }\n\n        return Result.ofSuccess(entity);\n    }\n\n    @PostMapping(\"/save.json\")\n    @AuthAction(AuthService.PrivilegeType.WRITE_RULE)\n    public Result<ApiDefinitionEntity> updateApi(@RequestBody UpdateApiReqVo reqVo) {\n        String app = reqVo.getApp();\n        if (StringUtil.isBlank(app)) {\n            return Result.ofFail(-1, \"app can't be null or empty\");\n        }\n\n        Long id = reqVo.getId();\n        if (id == null) {\n            return Result.ofFail(-1, \"id can't be null\");\n        }\n\n        ApiDefinitionEntity entity = repository.findById(id);\n        if (entity == null) {\n            return Result.ofFail(-1, \"api does not exist, id=\" + id);\n        }\n\n        // 匹配规则列表\n        List<ApiPredicateItemVo> predicateItems = reqVo.getPredicateItems();\n        if (CollectionUtils.isEmpty(predicateItems)) {\n            return Result.ofFail(-1, \"predicateItems can't empty\");\n        }\n\n        List<ApiPredicateItemEntity> predicateItemEntities = new ArrayList<>();\n        for (ApiPredicateItemVo predicateItem : predicateItems) {\n            ApiPredicateItemEntity predicateItemEntity = new ApiPredicateItemEntity();\n\n            // 匹配模式\n            int matchStrategy = predicateItem.getMatchStrategy();\n            if (!Arrays.asList(URL_MATCH_STRATEGY_EXACT, URL_MATCH_STRATEGY_PREFIX, URL_MATCH_STRATEGY_REGEX).contains(matchStrategy)) {\n                return Result.ofFail(-1, \"Invalid matchStrategy: \" + matchStrategy);\n            }\n            predicateItemEntity.setMatchStrategy(matchStrategy);\n\n            // 匹配串\n            String pattern = predicateItem.getPattern();\n            if (StringUtil.isBlank(pattern)) {\n                return Result.ofFail(-1, \"pattern can't be null or empty\");\n            }\n            predicateItemEntity.setPattern(pattern);\n\n            predicateItemEntities.add(predicateItemEntity);\n        }\n        entity.setPredicateItems(new LinkedHashSet<>(predicateItemEntities));\n\n        Date date = new Date();\n        entity.setGmtModified(date);\n\n        try {\n            entity = repository.save(entity);\n        } catch (Throwable throwable) {\n            logger.error(\"update gateway api error:\", throwable);\n            return Result.ofThrowable(-1, throwable);\n        }\n\n        if (!publishApis(app, entity.getIp(), entity.getPort())) {\n            logger.warn(\"publish gateway apis fail after update\");\n        }\n\n        return Result.ofSuccess(entity);\n    }\n\n    @PostMapping(\"/delete.json\")\n    @AuthAction(AuthService.PrivilegeType.DELETE_RULE)\n    public Result<Long> deleteApi(Long id) {\n        if (id == null) {\n            return Result.ofFail(-1, \"id can't be null\");\n        }\n\n        ApiDefinitionEntity oldEntity = repository.findById(id);\n        if (oldEntity == null) {\n            return Result.ofSuccess(null);\n        }\n\n        try {\n            repository.delete(id);\n        } catch (Throwable throwable) {\n            logger.error(\"delete gateway api error:\", throwable);\n            return Result.ofThrowable(-1, throwable);\n        }\n\n        if (!publishApis(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort())) {\n            logger.warn(\"publish gateway apis fail after delete\");\n        }\n        return Result.ofSuccess(id);\n    }\n\n    private boolean publishApis(String app, String ip, Integer port) {\n        List<ApiDefinitionEntity> apis = repository.findAllByApp(app);\n        try {\n            apiPublisher.publish(app, apis);\n            //延迟加载\n            delayTime();\n            return true;\n        } catch (Exception e) {\n            logger.error(\"publish api error!\");\n            e.printStackTrace();\n            return false;\n        }\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.controller.gateway;\n\nimport com.alibaba.csp.sentinel.dashboard.auth.AuthAction;\nimport com.alibaba.csp.sentinel.dashboard.auth.AuthService;\nimport com.alibaba.csp.sentinel.dashboard.controller.base.BaseRuleController;\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity;\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayParamFlowItemEntity;\nimport com.alibaba.csp.sentinel.dashboard.domain.Result;\nimport com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.rule.AddFlowRuleReqVo;\nimport com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.rule.GatewayParamFlowItemVo;\nimport com.alibaba.csp.sentinel.dashboard.domain.vo.gateway.rule.UpdateFlowRuleReqVo;\nimport com.alibaba.csp.sentinel.dashboard.repository.gateway.InMemGatewayFlowRuleStore;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;\nimport com.alibaba.csp.sentinel.util.StringUtil;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.Arrays;\nimport java.util.Date;\nimport java.util.List;\n\nimport static com.alibaba.csp.sentinel.slots.block.RuleConstant.*;\nimport static com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants.*;\nimport static com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity.*;\n\n/**\n * 网关限流规则控制器\n *\n * @author zyf\n * @date 2022-04-13\n */\n@RestController\n@RequestMapping(value = \"/gateway/flow\")\npublic class GatewayFlowRuleController extends BaseRuleController {\n\n    private final Logger logger = LoggerFactory.getLogger(GatewayFlowRuleController.class);\n\n    @Autowired\n    private InMemGatewayFlowRuleStore repository;\n\n    @Autowired\n    @Qualifier(\"gateWayFlowRulesNacosProvider\")\n    private DynamicRuleProvider<List<GatewayFlowRuleEntity>> ruleProvider;\n\n    @Autowired\n    @Qualifier(\"gateWayFlowRulesNacosPublisher\")\n    private DynamicRulePublisher<List<GatewayFlowRuleEntity>> rulePublisher;\n\n    @GetMapping(\"/list.json\")\n    @AuthAction(AuthService.PrivilegeType.READ_RULE)\n    public Result<List<GatewayFlowRuleEntity>> queryFlowRules(String app, String ip, Integer port) {\n\n        if (StringUtil.isEmpty(app)) {\n            return Result.ofFail(-1, \"app can't be null or empty\");\n        }\n        if (StringUtil.isEmpty(ip)) {\n            return Result.ofFail(-1, \"ip can't be null or empty\");\n        }\n        if (port == null) {\n            return Result.ofFail(-1, \"port can't be null\");\n        }\n\n        try {\n            List<GatewayFlowRuleEntity> rules = ruleProvider.getRules(app);\n            repository.saveAll(rules);\n            return Result.ofSuccess(rules);\n        } catch (Throwable throwable) {\n            logger.error(\"query gateway flow rules error:\", throwable);\n            return Result.ofThrowable(-1, throwable);\n        }\n    }\n\n    @PostMapping(\"/new.json\")\n    @AuthAction(AuthService.PrivilegeType.WRITE_RULE)\n    public Result<GatewayFlowRuleEntity> addFlowRule(@RequestBody AddFlowRuleReqVo reqVo) {\n\n        String app = reqVo.getApp();\n        if (StringUtil.isBlank(app)) {\n            return Result.ofFail(-1, \"app can't be null or empty\");\n        }\n\n        GatewayFlowRuleEntity entity = new GatewayFlowRuleEntity();\n        entity.setApp(app.trim());\n\n        String ip = reqVo.getIp();\n        if (StringUtil.isBlank(ip)) {\n            return Result.ofFail(-1, \"ip can't be null or empty\");\n        }\n        entity.setIp(ip.trim());\n\n        Integer port = reqVo.getPort();\n        if (port == null) {\n            return Result.ofFail(-1, \"port can't be null\");\n        }\n        entity.setPort(port);\n\n        // API类型, Route ID或API分组\n        Integer resourceMode = reqVo.getResourceMode();\n        if (resourceMode == null) {\n            return Result.ofFail(-1, \"resourceMode can't be null\");\n        }\n        if (!Arrays.asList(RESOURCE_MODE_ROUTE_ID, RESOURCE_MODE_CUSTOM_API_NAME).contains(resourceMode)) {\n            return Result.ofFail(-1, \"invalid resourceMode: \" + resourceMode);\n        }\n        entity.setResourceMode(resourceMode);\n\n        // API名称\n        String resource = reqVo.getResource();\n        if (StringUtil.isBlank(resource)) {\n            return Result.ofFail(-1, \"resource can't be null or empty\");\n        }\n        entity.setResource(resource.trim());\n\n        // 针对请求属性\n        GatewayParamFlowItemVo paramItem = reqVo.getParamItem();\n        if (paramItem != null) {\n            GatewayParamFlowItemEntity itemEntity = new GatewayParamFlowItemEntity();\n            entity.setParamItem(itemEntity);\n\n            // 参数属性 0-ClientIP 1-Remote Host 2-Header 3-URL参数 4-Cookie\n            Integer parseStrategy = paramItem.getParseStrategy();\n            if (!Arrays.asList(PARAM_PARSE_STRATEGY_CLIENT_IP, PARAM_PARSE_STRATEGY_HOST, PARAM_PARSE_STRATEGY_HEADER\n                    , PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE).contains(parseStrategy)) {\n                return Result.ofFail(-1, \"invalid parseStrategy: \" + parseStrategy);\n            }\n            itemEntity.setParseStrategy(paramItem.getParseStrategy());\n\n            // 当参数属性为2-Header 3-URL参数 4-Cookie时，参数名称必填\n            if (Arrays.asList(PARAM_PARSE_STRATEGY_HEADER, PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE).contains(parseStrategy)) {\n                // 参数名称\n                String fieldName = paramItem.getFieldName();\n                if (StringUtil.isBlank(fieldName)) {\n                    return Result.ofFail(-1, \"fieldName can't be null or empty\");\n                }\n                itemEntity.setFieldName(paramItem.getFieldName());\n            }\n\n            String pattern = paramItem.getPattern();\n            // 如果匹配串不为空，验证匹配模式\n            if (StringUtil.isNotEmpty(pattern)) {\n                itemEntity.setPattern(pattern);\n                Integer matchStrategy = paramItem.getMatchStrategy();\n                if (!Arrays.asList(PARAM_MATCH_STRATEGY_EXACT, PARAM_MATCH_STRATEGY_CONTAINS, PARAM_MATCH_STRATEGY_REGEX).contains(matchStrategy)) {\n                    return Result.ofFail(-1, \"invalid matchStrategy: \" + matchStrategy);\n                }\n                itemEntity.setMatchStrategy(matchStrategy);\n            }\n        }\n\n        // 阈值类型 0-线程数 1-QPS\n        Integer grade = reqVo.getGrade();\n        if (grade == null) {\n            return Result.ofFail(-1, \"grade can't be null\");\n        }\n        if (!Arrays.asList(FLOW_GRADE_THREAD, FLOW_GRADE_QPS).contains(grade)) {\n            return Result.ofFail(-1, \"invalid grade: \" + grade);\n        }\n        entity.setGrade(grade);\n\n        // QPS阈值\n        Double count = reqVo.getCount();\n        if (count == null) {\n            return Result.ofFail(-1, \"count can't be null\");\n        }\n        if (count < 0) {\n            return Result.ofFail(-1, \"count should be at lease zero\");\n        }\n        entity.setCount(count);\n\n        // 间隔\n        Long interval = reqVo.getInterval();\n        if (interval == null) {\n            return Result.ofFail(-1, \"interval can't be null\");\n        }\n        if (interval <= 0) {\n            return Result.ofFail(-1, \"interval should be greater than zero\");\n        }\n        entity.setInterval(interval);\n\n        // 间隔单位\n        Integer intervalUnit = reqVo.getIntervalUnit();\n        if (intervalUnit == null) {\n            return Result.ofFail(-1, \"intervalUnit can't be null\");\n        }\n        if (!Arrays.asList(INTERVAL_UNIT_SECOND, INTERVAL_UNIT_MINUTE, INTERVAL_UNIT_HOUR, INTERVAL_UNIT_DAY).contains(intervalUnit)) {\n            return Result.ofFail(-1, \"Invalid intervalUnit: \" + intervalUnit);\n        }\n        entity.setIntervalUnit(intervalUnit);\n\n        // 流控方式 0-快速失败 2-匀速排队\n        Integer controlBehavior = reqVo.getControlBehavior();\n        if (controlBehavior == null) {\n            return Result.ofFail(-1, \"controlBehavior can't be null\");\n        }\n        if (!Arrays.asList(CONTROL_BEHAVIOR_DEFAULT, CONTROL_BEHAVIOR_RATE_LIMITER).contains(controlBehavior)) {\n            return Result.ofFail(-1, \"invalid controlBehavior: \" + controlBehavior);\n        }\n        entity.setControlBehavior(controlBehavior);\n\n        if (CONTROL_BEHAVIOR_DEFAULT == controlBehavior) {\n            // 0-快速失败, 则Burst size必填\n            Integer burst = reqVo.getBurst();\n            if (burst == null) {\n                return Result.ofFail(-1, \"burst can't be null\");\n            }\n            if (burst < 0) {\n                return Result.ofFail(-1, \"invalid burst: \" + burst);\n            }\n            entity.setBurst(burst);\n        } else if (CONTROL_BEHAVIOR_RATE_LIMITER == controlBehavior) {\n            // 1-匀速排队, 则超时时间必填\n            Integer maxQueueingTimeoutMs = reqVo.getMaxQueueingTimeoutMs();\n            if (maxQueueingTimeoutMs == null) {\n                return Result.ofFail(-1, \"maxQueueingTimeoutMs can't be null\");\n            }\n            if (maxQueueingTimeoutMs < 0) {\n                return Result.ofFail(-1, \"invalid maxQueueingTimeoutMs: \" + maxQueueingTimeoutMs);\n            }\n            entity.setMaxQueueingTimeoutMs(maxQueueingTimeoutMs);\n        }\n\n        Date date = new Date();\n        entity.setGmtCreate(date);\n        entity.setGmtModified(date);\n\n        try {\n            entity = repository.save(entity);\n        } catch (Throwable throwable) {\n            logger.error(\"add gateway flow rule error:\", throwable);\n            return Result.ofThrowable(-1, throwable);\n        }\n\n        if (!publishRules(app, ip, port)) {\n            logger.warn(\"publish gateway flow rules fail after add\");\n        }\n\n        return Result.ofSuccess(entity);\n    }\n\n    @PostMapping(\"/save.json\")\n    @AuthAction(AuthService.PrivilegeType.WRITE_RULE)\n    public Result<GatewayFlowRuleEntity> updateFlowRule(@RequestBody UpdateFlowRuleReqVo reqVo) {\n\n        String app = reqVo.getApp();\n        if (StringUtil.isBlank(app)) {\n            return Result.ofFail(-1, \"app can't be null or empty\");\n        }\n\n        Long id = reqVo.getId();\n        if (id == null) {\n            return Result.ofFail(-1, \"id can't be null\");\n        }\n\n        GatewayFlowRuleEntity entity = repository.findById(id);\n        if (entity == null) {\n            return Result.ofFail(-1, \"gateway flow rule does not exist, id=\" + id);\n        }\n\n        // 针对请求属性\n        GatewayParamFlowItemVo paramItem = reqVo.getParamItem();\n        if (paramItem != null) {\n            GatewayParamFlowItemEntity itemEntity = new GatewayParamFlowItemEntity();\n            entity.setParamItem(itemEntity);\n\n            // 参数属性 0-ClientIP 1-Remote Host 2-Header 3-URL参数 4-Cookie\n            Integer parseStrategy = paramItem.getParseStrategy();\n            if (!Arrays.asList(PARAM_PARSE_STRATEGY_CLIENT_IP, PARAM_PARSE_STRATEGY_HOST, PARAM_PARSE_STRATEGY_HEADER\n                    , PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE).contains(parseStrategy)) {\n                return Result.ofFail(-1, \"invalid parseStrategy: \" + parseStrategy);\n            }\n            itemEntity.setParseStrategy(paramItem.getParseStrategy());\n\n            // 当参数属性为2-Header 3-URL参数 4-Cookie时，参数名称必填\n            if (Arrays.asList(PARAM_PARSE_STRATEGY_HEADER, PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE).contains(parseStrategy)) {\n                // 参数名称\n                String fieldName = paramItem.getFieldName();\n                if (StringUtil.isBlank(fieldName)) {\n                    return Result.ofFail(-1, \"fieldName can't be null or empty\");\n                }\n                itemEntity.setFieldName(paramItem.getFieldName());\n            }\n\n            String pattern = paramItem.getPattern();\n            // 如果匹配串不为空，验证匹配模式\n            if (StringUtil.isNotEmpty(pattern)) {\n                itemEntity.setPattern(pattern);\n                Integer matchStrategy = paramItem.getMatchStrategy();\n                if (!Arrays.asList(PARAM_MATCH_STRATEGY_EXACT, PARAM_MATCH_STRATEGY_CONTAINS, PARAM_MATCH_STRATEGY_REGEX).contains(matchStrategy)) {\n                    return Result.ofFail(-1, \"invalid matchStrategy: \" + matchStrategy);\n                }\n                itemEntity.setMatchStrategy(matchStrategy);\n            }\n        } else {\n            entity.setParamItem(null);\n        }\n\n        // 阈值类型 0-线程数 1-QPS\n        Integer grade = reqVo.getGrade();\n        if (grade == null) {\n            return Result.ofFail(-1, \"grade can't be null\");\n        }\n        if (!Arrays.asList(FLOW_GRADE_THREAD, FLOW_GRADE_QPS).contains(grade)) {\n            return Result.ofFail(-1, \"invalid grade: \" + grade);\n        }\n        entity.setGrade(grade);\n\n        // QPS阈值\n        Double count = reqVo.getCount();\n        if (count == null) {\n            return Result.ofFail(-1, \"count can't be null\");\n        }\n        if (count < 0) {\n            return Result.ofFail(-1, \"count should be at lease zero\");\n        }\n        entity.setCount(count);\n\n        // 间隔\n        Long interval = reqVo.getInterval();\n        if (interval == null) {\n            return Result.ofFail(-1, \"interval can't be null\");\n        }\n        if (interval <= 0) {\n            return Result.ofFail(-1, \"interval should be greater than zero\");\n        }\n        entity.setInterval(interval);\n\n        // 间隔单位\n        Integer intervalUnit = reqVo.getIntervalUnit();\n        if (intervalUnit == null) {\n            return Result.ofFail(-1, \"intervalUnit can't be null\");\n        }\n        if (!Arrays.asList(INTERVAL_UNIT_SECOND, INTERVAL_UNIT_MINUTE, INTERVAL_UNIT_HOUR, INTERVAL_UNIT_DAY).contains(intervalUnit)) {\n            return Result.ofFail(-1, \"Invalid intervalUnit: \" + intervalUnit);\n        }\n        entity.setIntervalUnit(intervalUnit);\n\n        // 流控方式 0-快速失败 2-匀速排队\n        Integer controlBehavior = reqVo.getControlBehavior();\n        if (controlBehavior == null) {\n            return Result.ofFail(-1, \"controlBehavior can't be null\");\n        }\n        if (!Arrays.asList(CONTROL_BEHAVIOR_DEFAULT, CONTROL_BEHAVIOR_RATE_LIMITER).contains(controlBehavior)) {\n            return Result.ofFail(-1, \"invalid controlBehavior: \" + controlBehavior);\n        }\n        entity.setControlBehavior(controlBehavior);\n\n        if (CONTROL_BEHAVIOR_DEFAULT == controlBehavior) {\n            // 0-快速失败, 则Burst size必填\n            Integer burst = reqVo.getBurst();\n            if (burst == null) {\n                return Result.ofFail(-1, \"burst can't be null\");\n            }\n            if (burst < 0) {\n                return Result.ofFail(-1, \"invalid burst: \" + burst);\n            }\n            entity.setBurst(burst);\n        } else if (CONTROL_BEHAVIOR_RATE_LIMITER == controlBehavior) {\n            // 2-匀速排队, 则超时时间必填\n            Integer maxQueueingTimeoutMs = reqVo.getMaxQueueingTimeoutMs();\n            if (maxQueueingTimeoutMs == null) {\n                return Result.ofFail(-1, \"maxQueueingTimeoutMs can't be null\");\n            }\n            if (maxQueueingTimeoutMs < 0) {\n                return Result.ofFail(-1, \"invalid maxQueueingTimeoutMs: \" + maxQueueingTimeoutMs);\n            }\n            entity.setMaxQueueingTimeoutMs(maxQueueingTimeoutMs);\n        }\n\n        Date date = new Date();\n        entity.setGmtModified(date);\n\n        try {\n            entity = repository.save(entity);\n        } catch (Throwable throwable) {\n            logger.error(\"update gateway flow rule error:\", throwable);\n            return Result.ofThrowable(-1, throwable);\n        }\n\n        if (!publishRules(app, entity.getIp(), entity.getPort())) {\n            logger.warn(\"publish gateway flow rules fail after update\");\n        }\n\n        return Result.ofSuccess(entity);\n    }\n\n\n    @PostMapping(\"/delete.json\")\n    @AuthAction(AuthService.PrivilegeType.DELETE_RULE)\n    public Result<Long> deleteFlowRule(Long id) {\n\n        if (id == null) {\n            return Result.ofFail(-1, \"id can't be null\");\n        }\n\n        GatewayFlowRuleEntity oldEntity = repository.findById(id);\n        if (oldEntity == null) {\n            return Result.ofSuccess(null);\n        }\n\n        try {\n            repository.delete(id);\n        } catch (Throwable throwable) {\n            logger.error(\"delete gateway flow rule error:\", throwable);\n            return Result.ofThrowable(-1, throwable);\n        }\n\n        if (!publishRules(oldEntity.getApp(), oldEntity.getIp(), oldEntity.getPort())) {\n            logger.warn(\"publish gateway flow rules fail after delete\");\n        }\n\n        return Result.ofSuccess(id);\n    }\n\n    private boolean publishRules(String app, String ip, Integer port) {\n        List<GatewayFlowRuleEntity> rules = repository.findAllByApp(app);\n        try {\n            rulePublisher.publish(app, rules);\n            //延迟加载\n            delayTime();\n            return true;\n        } catch (Exception e) {\n            logger.error(\"publish rules error!\");\n            e.printStackTrace();\n            return false;\n        }\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/v2/FlowControllerV2.java",
    "content": "/*\n * Copyright 1999-2018 Alibaba Group Holding Ltd.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.alibaba.csp.sentinel.dashboard.controller.v2;\n\nimport java.util.Date;\nimport java.util.List;\n\nimport com.alibaba.csp.sentinel.dashboard.auth.AuthAction;\nimport com.alibaba.csp.sentinel.dashboard.auth.AuthService;\nimport com.alibaba.csp.sentinel.dashboard.auth.AuthService.PrivilegeType;\nimport com.alibaba.csp.sentinel.dashboard.controller.base.BaseRuleController;\nimport com.alibaba.csp.sentinel.util.StringUtil;\n\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity;\nimport com.alibaba.csp.sentinel.dashboard.repository.rule.InMemoryRuleRepositoryAdapter;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;\nimport com.alibaba.csp.sentinel.dashboard.domain.Result;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Qualifier;\nimport org.springframework.util.ObjectUtils;\nimport org.springframework.web.bind.annotation.DeleteMapping;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.PutMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * 流控规则控制器\n *\n * @author zyf\n * @date 2022-04-13\n */\n@RestController\n@RequestMapping(value = \"/v2/flow\")\npublic class FlowControllerV2 extends BaseRuleController {\n\n    private final Logger logger = LoggerFactory.getLogger(FlowControllerV2.class);\n\n    @Autowired\n    private InMemoryRuleRepositoryAdapter<FlowRuleEntity> repository;\n\n    @Autowired\n    @Qualifier(\"flowRuleNacosProvider\")\n    private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;\n    @Autowired\n    @Qualifier(\"flowRuleNacosPublisher\")\n    private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;\n\n    @GetMapping(\"/rules\")\n    @AuthAction(PrivilegeType.READ_RULE)\n    public Result<List<FlowRuleEntity>> apiQueryMachineRules(@RequestParam String app) {\n\n        if (StringUtil.isEmpty(app)) {\n            return Result.ofFail(-1, \"app can't be null or empty\");\n        }\n        try {\n            List<FlowRuleEntity> rules = ruleProvider.getRules(app);\n            if (rules != null && !rules.isEmpty()) {\n                for (FlowRuleEntity entity : rules) {\n                    entity.setApp(app);\n                    if (entity.getClusterConfig() != null && entity.getClusterConfig().getFlowId() != null) {\n                        entity.setId(entity.getClusterConfig().getFlowId());\n                    }\n                }\n            }\n            rules = repository.saveAll(rules);\n            return Result.ofSuccess(rules);\n        } catch (Throwable throwable) {\n            logger.error(\"Error when querying flow rules\", throwable);\n            return Result.ofThrowable(-1, throwable);\n        }\n    }\n\n    private <R> Result<R> checkEntityInternal(FlowRuleEntity entity) {\n        if (entity == null) {\n            return Result.ofFail(-1, \"invalid body\");\n        }\n        if (StringUtil.isBlank(entity.getApp())) {\n            return Result.ofFail(-1, \"app can't be null or empty\");\n        }\n        if (StringUtil.isBlank(entity.getLimitApp())) {\n            return Result.ofFail(-1, \"limitApp can't be null or empty\");\n        }\n        if (StringUtil.isBlank(entity.getResource())) {\n            return Result.ofFail(-1, \"resource can't be null or empty\");\n        }\n        if (entity.getGrade() == null) {\n            return Result.ofFail(-1, \"grade can't be null\");\n        }\n        if (entity.getGrade() != 0 && entity.getGrade() != 1) {\n            return Result.ofFail(-1, \"grade must be 0 or 1, but \" + entity.getGrade() + \" got\");\n        }\n        if (entity.getCount() == null || entity.getCount() < 0) {\n            return Result.ofFail(-1, \"count should be at lease zero\");\n        }\n        if (entity.getStrategy() == null) {\n            return Result.ofFail(-1, \"strategy can't be null\");\n        }\n        if (entity.getStrategy() != 0 && StringUtil.isBlank(entity.getRefResource())) {\n            return Result.ofFail(-1, \"refResource can't be null or empty when strategy!=0\");\n        }\n        if (entity.getControlBehavior() == null) {\n            return Result.ofFail(-1, \"controlBehavior can't be null\");\n        }\n        int controlBehavior = entity.getControlBehavior();\n        if (controlBehavior == 1 && entity.getWarmUpPeriodSec() == null) {\n            return Result.ofFail(-1, \"warmUpPeriodSec can't be null when controlBehavior==1\");\n        }\n        if (controlBehavior == 2 && entity.getMaxQueueingTimeMs() == null) {\n            return Result.ofFail(-1, \"maxQueueingTimeMs can't be null when controlBehavior==2\");\n        }\n        if (entity.isClusterMode() && entity.getClusterConfig() == null) {\n            return Result.ofFail(-1, \"cluster config should be valid\");\n        }\n        return null;\n    }\n\n    @PostMapping(\"/rule\")\n    @AuthAction(value = AuthService.PrivilegeType.WRITE_RULE)\n    public Result<FlowRuleEntity> apiAddFlowRule(@RequestBody FlowRuleEntity entity) {\n\n        Result<FlowRuleEntity> checkResult = checkEntityInternal(entity);\n        if (checkResult != null) {\n            return checkResult;\n        }\n        entity.setId(null);\n        Date date = new Date();\n        entity.setGmtCreate(date);\n        entity.setGmtModified(date);\n        entity.setLimitApp(entity.getLimitApp().trim());\n        entity.setResource(entity.getResource().trim());\n        try {\n            entity = repository.save(entity);\n            publishRules(entity.getApp());\n        } catch (Throwable throwable) {\n            logger.error(\"Failed to add flow rule\", throwable);\n            return Result.ofThrowable(-1, throwable);\n        }\n        return Result.ofSuccess(entity);\n    }\n\n    @PutMapping(\"/rule/{id}\")\n    @AuthAction(AuthService.PrivilegeType.WRITE_RULE)\n\n    public Result<FlowRuleEntity> apiUpdateFlowRule(@PathVariable(\"id\") Long id,\n                                                    @RequestBody FlowRuleEntity entity) {\n        if (id == null || id <= 0) {\n            return Result.ofFail(-1, \"Invalid id\");\n        }\n        FlowRuleEntity oldEntity = repository.findById(id);\n        if (oldEntity == null) {\n            return Result.ofFail(-1, \"id \" + id + \" does not exist\");\n        }\n        if (entity == null) {\n            return Result.ofFail(-1, \"invalid body\");\n        }\n\n        entity.setApp(oldEntity.getApp());\n        entity.setIp(oldEntity.getIp());\n        entity.setPort(oldEntity.getPort());\n        Result<FlowRuleEntity> checkResult = checkEntityInternal(entity);\n        if (checkResult != null) {\n            return checkResult;\n        }\n\n        entity.setId(id);\n        Date date = new Date();\n        entity.setGmtCreate(oldEntity.getGmtCreate());\n        entity.setGmtModified(date);\n        try {\n            entity = repository.save(entity);\n            if (entity == null) {\n                return Result.ofFail(-1, \"save entity fail\");\n            }\n            publishRules(oldEntity.getApp());\n        } catch (Throwable throwable) {\n            logger.error(\"Failed to update flow rule\", throwable);\n            return Result.ofThrowable(-1, throwable);\n        }\n        return Result.ofSuccess(entity);\n    }\n\n    @DeleteMapping(\"/rule/{id}\")\n    @AuthAction(PrivilegeType.DELETE_RULE)\n    public Result<Long> apiDeleteRule(@PathVariable(\"id\") Long id) {\n        if (id == null || id <= 0) {\n            return Result.ofFail(-1, \"Invalid id\");\n        }\n        FlowRuleEntity oldEntity = repository.findById(id);\n        if (ObjectUtils.isEmpty(oldEntity)) {\n            return Result.ofSuccess(null);\n        }\n\n        try {\n            repository.delete(id);\n            publishRules(oldEntity.getApp());\n        } catch (Exception e) {\n            return Result.ofFail(-1, e.getMessage());\n        }\n        return Result.ofSuccess(id);\n    }\n\n    private void publishRules(/*@NonNull*/ String app) throws Exception {\n        List<FlowRuleEntity> rules = repository.findAllByApp(app);\n        rulePublisher.publish(app, rules);\n        //延迟加载\n        delayTime();\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/NacosConfigProperties.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.rule.nacos;\n\n/**\n * @Description: nacos配置\n * @author: zyf\n * @date: 2022/03/01$\n * @version: V1.0\n */\nimport lombok.Data;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.stereotype.Component;\n\n@Component\n@ConfigurationProperties(prefix = \"nacos.server\")\n@Data\npublic class NacosConfigProperties {\n\n    private String ip;\n\n    private String namespace;\n\n    private String username;\n\n    private String password;\n\n    private String groupId;\n\n    public String getServerAddr() {\n        return this.getIp();\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/SentinelConfig.java",
    "content": "/*\n * Copyright 1999-2018 Alibaba Group Holding Ltd.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.alibaba.csp.sentinel.dashboard.rule.nacos;\n\nimport java.util.List;\nimport java.util.Properties;\n\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity;\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity;\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.*;\nimport com.alibaba.csp.sentinel.dashboard.rule.nacos.entity.AuthorityRuleCorrectEntity;\nimport com.alibaba.csp.sentinel.dashboard.rule.nacos.entity.ParamFlowRuleCorrectEntity;\nimport com.alibaba.nacos.api.PropertyKeyConst;\nimport org.apache.commons.lang.StringUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport com.alibaba.csp.sentinel.datasource.Converter;\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.nacos.api.config.ConfigFactory;\nimport com.alibaba.nacos.api.config.ConfigService;\n\n/**\n *  sentinel配置类\n *\n * @author zyf\n * @date 2022-04-13\n */\n@Configuration\npublic class SentinelConfig {\n\n    @Autowired\n    private NacosConfigProperties nacosConfigProperties;\n\n\n    /**\n     * 流控规则\n     * @return\n     */\n    @Bean\n    public Converter<List<FlowRuleEntity>, String> flowRuleEntityEncoder() {\n        return JSON::toJSONString;\n    }\n\n    @Bean\n    public Converter<String, List<FlowRuleEntity>> flowRuleEntityDecoder() {\n        return s -> JSON.parseArray(s, FlowRuleEntity.class);\n    }\n    /**\n     *  降级规则\n     * @return\n     */\n    @Bean\n    public Converter<List<DegradeRuleEntity>, String> degradeRuleEntityEncoder() {\n        return JSON::toJSONString;\n    }\n\n    @Bean\n    public Converter<String, List<DegradeRuleEntity>> degradeRuleEntityDecoder() {\n        return s -> JSON.parseArray(s, DegradeRuleEntity.class);\n    }\n\n    /**\n     *   热点参数 规则\n     * @return\n     */\n    @Bean\n    public Converter<List<ParamFlowRuleCorrectEntity>, String> paramFlowRuleEntityEncoder() {\n        return JSON::toJSONString;\n    }\n\n    @Bean\n    public Converter<String, List<ParamFlowRuleCorrectEntity>> paramFlowRuleEntityDecoder() {\n        return s -> JSON.parseArray(s, ParamFlowRuleCorrectEntity.class);\n    }\n\n    /**\n     * 系统规则\n     * @return\n     */\n    @Bean\n    public Converter<List<SystemRuleEntity>, String> systemRuleRuleEntityEncoder() {\n        return JSON::toJSONString;\n    }\n\n    @Bean\n    public Converter<String, List<SystemRuleEntity>> systemRuleRuleEntityDecoder() {\n        return s -> JSON.parseArray(s, SystemRuleEntity.class);\n    }\n    /**\n     * 授权规则\n     * @return\n     */\n    @Bean\n    public Converter<List<AuthorityRuleCorrectEntity>, String> authorityRuleRuleEntityEncoder() {\n        return JSON::toJSONString;\n    }\n\n    @Bean\n    public Converter<String, List<AuthorityRuleCorrectEntity>> authorityRuleRuleEntityDecoder() {\n        return s -> JSON.parseArray(s, AuthorityRuleCorrectEntity.class);\n    }\n\n    /**\n     * 网关API\n     *\n     * @return\n     * @throws Exception\n     */\n    @Bean\n    public Converter<List<ApiDefinitionEntity>, String> apiDefinitionEntityEncoder() {\n        return JSON::toJSONString;\n    }\n\n    @Bean\n    public Converter<String, List<ApiDefinitionEntity>> apiDefinitionEntityDecoder() {\n        return s -> JSON.parseArray(s, ApiDefinitionEntity.class);\n    }\n\n    /**\n     * 网关flowRule\n     *\n     * @return\n     * @throws Exception\n     */\n    @Bean\n    public Converter<List<GatewayFlowRuleEntity>, String> gatewayFlowRuleEntityEncoder() {\n        return JSON::toJSONString;\n    }\n\n    @Bean\n    public Converter<String, List<GatewayFlowRuleEntity>> gatewayFlowRuleEntityDecoder() {\n        return s -> JSON.parseArray(s, GatewayFlowRuleEntity.class);\n    }\n\n    @Bean\n    public ConfigService nacosConfigService() throws Exception {\n        Properties properties=new Properties();\n        properties.put(PropertyKeyConst.SERVER_ADDR,nacosConfigProperties.getServerAddr());\n        if(StringUtils.isNotBlank(nacosConfigProperties.getUsername())){\n            properties.put(PropertyKeyConst.USERNAME,nacosConfigProperties.getUsername());\n        }\n        if(StringUtils.isNotBlank(nacosConfigProperties.getPassword())){\n            properties.put(PropertyKeyConst.PASSWORD,nacosConfigProperties.getPassword());\n        }\n        if(StringUtils.isNotBlank(nacosConfigProperties.getNamespace())){\n            properties.put(PropertyKeyConst.NAMESPACE,nacosConfigProperties.getNamespace());\n        }\n        return ConfigFactory.createConfigService(properties);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/authority/AuthorityRuleNacosProvider.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.rule.nacos.authority;\n\n\nimport com.alibaba.csp.sentinel.dashboard.constants.SentinelConStants;\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.AuthorityRuleEntity;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;\nimport com.alibaba.csp.sentinel.dashboard.rule.nacos.entity.AuthorityRuleCorrectEntity;\nimport com.alibaba.csp.sentinel.datasource.Converter;\nimport com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule;\nimport com.alibaba.csp.sentinel.util.StringUtil;\nimport com.alibaba.nacos.api.config.ConfigService;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n/**\n * 授权规则拉取(黑名单白名单)\n *\n * @author zyf\n * @date 2022-04-13\n */\n@Component(\"authorityRuleNacosProvider\")\npublic class AuthorityRuleNacosProvider implements DynamicRuleProvider<List<AuthorityRuleEntity>> {\n    @Autowired\n    private ConfigService configService;\n    @Autowired\n    private Converter<String, List<AuthorityRuleCorrectEntity>> converter;\n\n    @Override\n    public List<AuthorityRuleEntity> getRules(String appName) throws Exception {\n        String rules = configService.getConfig(appName + SentinelConStants.AUTHORITY_DATA_ID_POSTFIX,\n                SentinelConStants.GROUP_ID, 3000);\n        if (StringUtil.isEmpty(rules)) {\n            return new ArrayList<>();\n        }\n        List<AuthorityRuleCorrectEntity> entityList = converter.convert(rules);\n        return entityList.stream().map(rule -> {\n            AuthorityRule authorityRule = new AuthorityRule();\n            BeanUtils.copyProperties(rule, authorityRule);\n            AuthorityRuleEntity entity = AuthorityRuleEntity.fromAuthorityRule(rule.getApp(), rule.getIp(), rule.getPort(), authorityRule);\n            entity.setId(rule.getId());\n            entity.setGmtCreate(rule.getGmtCreate());\n            return entity;\n        }).collect(Collectors.toList());\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/authority/AuthorityRuleNacosPublisher.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.rule.nacos.authority;\n\nimport com.alibaba.csp.sentinel.dashboard.constants.SentinelConStants;\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.AuthorityRuleEntity;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;\nimport com.alibaba.csp.sentinel.dashboard.rule.nacos.entity.AuthorityRuleCorrectEntity;\nimport com.alibaba.csp.sentinel.datasource.Converter;\nimport com.alibaba.csp.sentinel.util.AssertUtil;\nimport com.alibaba.nacos.api.config.ConfigService;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n/**\n * 授权规则持久化(黑名单白名单)\n *\n * @author zyf\n * @date 2022-04-13\n */\n@Component(\"authorityRuleNacosPublisher\")\npublic class AuthorityRuleNacosPublisher implements DynamicRulePublisher<List<AuthorityRuleEntity>> {\n    @Autowired\n    private ConfigService configService;\n    @Autowired\n    private Converter<List<AuthorityRuleCorrectEntity>, String> converter;\n\n    @Override\n    public void publish(String app, List<AuthorityRuleEntity> rules) throws Exception {\n        AssertUtil.notEmpty(app, \"app name cannot be empty\");\n        if (rules == null) {\n            return;\n        }\n        //  转换\n        List<AuthorityRuleCorrectEntity> list = rules.stream().map(rule -> {\n            AuthorityRuleCorrectEntity entity = new AuthorityRuleCorrectEntity();\n            BeanUtils.copyProperties(rule, entity);\n            return entity;\n        }).collect(Collectors.toList());\n\n        configService.publishConfig(app + SentinelConStants.AUTHORITY_DATA_ID_POSTFIX,\n                SentinelConStants.GROUP_ID, converter.convert(list));\n    }\n}\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/degrade/DegradeRuleNacosProvider.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.rule.nacos.degrade;\n\nimport com.alibaba.csp.sentinel.dashboard.constants.SentinelConStants;\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.DegradeRuleEntity;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;\nimport com.alibaba.csp.sentinel.dashboard.rule.nacos.SentinelConfig;\nimport com.alibaba.csp.sentinel.datasource.Converter;\nimport com.alibaba.csp.sentinel.util.StringUtil;\nimport com.alibaba.nacos.api.config.ConfigService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * 降级规则拉取\n *\n * @author zyf\n * @date 2022-04-13\n */\n@Component(\"degradeRuleNacosProvider\")\npublic class DegradeRuleNacosProvider implements DynamicRuleProvider<List<DegradeRuleEntity>> {\n\n    @Autowired\n    private ConfigService configService;\n    @Autowired\n    private Converter<String, List<DegradeRuleEntity>> converter;\n\n    @Override\n    public List<DegradeRuleEntity> getRules(String appName) throws Exception {\n        String rules = configService.getConfig(appName + SentinelConStants.DEGRADE_DATA_ID_POSTFIX,\n                SentinelConStants.GROUP_ID, 3000);\n        if (StringUtil.isEmpty(rules)) {\n            return new ArrayList<>();\n        }\n        return converter.convert(rules);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/degrade/DegradeRuleNacosPublisher.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.rule.nacos.degrade;\n\nimport com.alibaba.csp.sentinel.dashboard.constants.SentinelConStants;\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.DegradeRuleEntity;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;\nimport com.alibaba.csp.sentinel.dashboard.rule.nacos.SentinelConfig;\nimport com.alibaba.csp.sentinel.datasource.Converter;\nimport com.alibaba.csp.sentinel.util.AssertUtil;\nimport com.alibaba.nacos.api.config.ConfigService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n * 降级规则推送\n *\n * @author zyf\n * @date 2022-04-13\n */\n@Component(\"degradeRuleNacosPublisher\")\npublic class DegradeRuleNacosPublisher implements DynamicRulePublisher<List<DegradeRuleEntity>> {\n\n    @Autowired\n    private ConfigService configService;\n    @Autowired\n    private Converter<List<DegradeRuleEntity>, String> converter;\n\n    @Override\n    public void publish(String app, List<DegradeRuleEntity> rules) throws Exception {\n        AssertUtil.notEmpty(app, \"app name cannot be empty\");\n        if (rules == null) {\n            return;\n        }\n        configService.publishConfig(app + SentinelConStants.DEGRADE_DATA_ID_POSTFIX,\n                SentinelConStants.GROUP_ID, converter.convert(rules));\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/entity/AuthorityRuleCorrectEntity.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.rule.nacos.entity;\n\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.RuleEntity;\nimport com.alibaba.csp.sentinel.slots.block.Rule;\nimport com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule;\n\nimport java.util.Date;\n\n/**\n * @author zyf\n * @description 重写授权规则实体类,原因同热点规则\n * @date 2022-04-13\n */\npublic class AuthorityRuleCorrectEntity implements RuleEntity {\n\n    private Long id;\n    private String app;\n    private String ip;\n    private Integer port;\n    private String limitApp;\n    private String resource;\n    private Date gmtCreate;\n    private Date gmtModified;\n\n    private int strategy;\n\n    @Override\n    public Long getId() {\n        return id;\n    }\n\n    @Override\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    @Override\n    public String getApp() {\n        return app;\n    }\n\n    public void setApp(String app) {\n        this.app = app;\n    }\n\n    @Override\n    public String getIp() {\n        return ip;\n    }\n\n    public void setIp(String ip) {\n        this.ip = ip;\n    }\n\n    @Override\n    public Integer getPort() {\n        return port;\n    }\n\n    public void setPort(Integer port) {\n        this.port = port;\n    }\n\n    public String getLimitApp() {\n        return limitApp;\n    }\n\n    public void setLimitApp(String limitApp) {\n        this.limitApp = limitApp;\n    }\n\n    public String getResource() {\n        return resource;\n    }\n\n    public void setResource(String resource) {\n        this.resource = resource;\n    }\n\n    @Override\n    public Date getGmtCreate() {\n        return gmtCreate;\n    }\n\n    public void setGmtCreate(Date gmtCreate) {\n        this.gmtCreate = gmtCreate;\n    }\n\n    public Date getGmtModified() {\n        return gmtModified;\n    }\n\n    public void setGmtModified(Date gmtModified) {\n        this.gmtModified = gmtModified;\n    }\n\n    public int getStrategy() {\n        return strategy;\n    }\n\n    public void setStrategy(int strategy) {\n        this.strategy = strategy;\n    }\n\n    @Override\n    public Rule toRule(){\n        AuthorityRule rule=new AuthorityRule();\n        return rule;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/entity/ParamFlowRuleCorrectEntity.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.rule.nacos.entity;\n\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.RuleEntity;\nimport com.alibaba.csp.sentinel.slots.block.Rule;\nimport com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowClusterConfig;\nimport com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowItem;\nimport com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;\n\nimport java.util.*;\n\n/**\n * @author zyf\n * @description 重写热点规则实体类,。查看sentinel-dashboard在自定义ParamFlowRuleNacosPublisher时候 推送的数据是ParamFlowRuleEntity。 客户端接收的ParamFlowRule类\n * @date 2022-04-13\n */\npublic class ParamFlowRuleCorrectEntity implements RuleEntity {\n\n    private Long id;\n    private String app;\n    private String ip;\n    private Integer port;\n    private String limitApp;\n    private String resource;\n    private Date gmtCreate;\n\n    private int grade = 1;\n    private Integer paramIdx;\n    private double count;\n    private int controlBehavior = 0;\n    private int maxQueueingTimeMs = 0;\n    private int burstCount = 0;\n    private long durationInSec = 1L;\n    private List<ParamFlowItem> paramFlowItemList = new ArrayList();\n    private Map<Object, Integer> hotItems = new HashMap();\n    private boolean clusterMode = false;\n    private ParamFlowClusterConfig clusterConfig;\n\n    public int getGrade() {\n        return grade;\n    }\n\n    public void setGrade(int grade) {\n        this.grade = grade;\n    }\n\n    public Integer getParamIdx() {\n        return paramIdx;\n    }\n\n    public void setParamIdx(Integer paramIdx) {\n        this.paramIdx = paramIdx;\n    }\n\n    public double getCount() {\n        return count;\n    }\n\n    public void setCount(double count) {\n        this.count = count;\n    }\n\n    public int getControlBehavior() {\n        return controlBehavior;\n    }\n\n    public void setControlBehavior(int controlBehavior) {\n        this.controlBehavior = controlBehavior;\n    }\n\n    public int getMaxQueueingTimeMs() {\n        return maxQueueingTimeMs;\n    }\n\n    public void setMaxQueueingTimeMs(int maxQueueingTimeMs) {\n        this.maxQueueingTimeMs = maxQueueingTimeMs;\n    }\n\n    public int getBurstCount() {\n        return burstCount;\n    }\n\n    public void setBurstCount(int burstCount) {\n        this.burstCount = burstCount;\n    }\n\n    public long getDurationInSec() {\n        return durationInSec;\n    }\n\n    public void setDurationInSec(long durationInSec) {\n        this.durationInSec = durationInSec;\n    }\n\n    public List<ParamFlowItem> getParamFlowItemList() {\n        return paramFlowItemList;\n    }\n\n    public void setParamFlowItemList(List<ParamFlowItem> paramFlowItemList) {\n        this.paramFlowItemList = paramFlowItemList;\n    }\n\n    public Map<Object, Integer> getHotItems() {\n        return hotItems;\n    }\n\n    public void setHotItems(Map<Object, Integer> hotItems) {\n        this.hotItems = hotItems;\n    }\n\n    public boolean isClusterMode() {\n        return clusterMode;\n    }\n\n    public void setClusterMode(boolean clusterMode) {\n        this.clusterMode = clusterMode;\n    }\n\n    public ParamFlowClusterConfig getClusterConfig() {\n        return clusterConfig;\n    }\n\n    public void setClusterConfig(ParamFlowClusterConfig clusterConfig) {\n        this.clusterConfig = clusterConfig;\n    }\n\n    @Override\n    public Date getGmtCreate() {\n        return gmtCreate;\n    }\n\n    public void setGmtCreate(Date gmtCreate) {\n        this.gmtCreate = gmtCreate;\n    }\n\n    @Override\n    public Long getId() {\n        return id;\n    }\n\n    @Override\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    @Override\n    public String getApp() {\n        return app;\n    }\n\n    public void setApp(String app) {\n        this.app = app;\n    }\n\n    @Override\n    public String getIp() {\n        return ip;\n    }\n\n    public void setIp(String ip) {\n        this.ip = ip;\n    }\n\n    @Override\n    public Integer getPort() {\n        return port;\n    }\n\n    public void setPort(Integer port) {\n        this.port = port;\n    }\n\n    public String getLimitApp() {\n        return limitApp;\n    }\n\n    public void setLimitApp(String limitApp) {\n        this.limitApp = limitApp;\n    }\n\n    public String getResource() {\n        return resource;\n    }\n\n    public void setResource(String resource) {\n        this.resource = resource;\n    }\n\n    @Override\n    public Rule toRule() {\n        ParamFlowRule rule = new ParamFlowRule();\n        return rule;\n    }\n}\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/flow/FlowRuleNacosProvider.java",
    "content": "/*\n * Copyright 1999-2018 Alibaba Group Holding Ltd.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.alibaba.csp.sentinel.dashboard.rule.nacos.flow;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport com.alibaba.csp.sentinel.dashboard.constants.SentinelConStants;\nimport com.alibaba.csp.sentinel.dashboard.rule.nacos.SentinelConfig;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;\nimport com.alibaba.csp.sentinel.datasource.Converter;\nimport com.alibaba.csp.sentinel.util.StringUtil;\nimport com.alibaba.nacos.api.config.ConfigService;\n\n/**\n * 流控规则拉取\n *\n * @author zyf\n * @date 2022-04-13\n */\n@Component(\"flowRuleNacosProvider\")\npublic class FlowRuleNacosProvider implements DynamicRuleProvider<List<FlowRuleEntity>> {\n\n    @Autowired\n    private ConfigService configService;\n    @Autowired\n    private Converter<String, List<FlowRuleEntity>> converter;\n\n    @Override\n    public List<FlowRuleEntity> getRules(String appName) throws Exception {\n        String rules = configService.getConfig(appName + SentinelConStants.FLOW_DATA_ID_POSTFIX,\n                SentinelConStants.GROUP_ID, 3000);\n        if (StringUtil.isEmpty(rules)) {\n            return new ArrayList<>();\n        }\n        return converter.convert(rules);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/flow/FlowRuleNacosPublisher.java",
    "content": "/*\n * Copyright 1999-2018 Alibaba Group Holding Ltd.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage com.alibaba.csp.sentinel.dashboard.rule.nacos.flow;\n\nimport java.util.List;\n\nimport com.alibaba.csp.sentinel.dashboard.constants.SentinelConStants;\nimport com.alibaba.csp.sentinel.dashboard.rule.nacos.SentinelConfig;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.FlowRuleEntity;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;\nimport com.alibaba.csp.sentinel.datasource.Converter;\nimport com.alibaba.csp.sentinel.util.AssertUtil;\nimport com.alibaba.nacos.api.config.ConfigService;\n\n/**\n * 流控规则推送\n *\n * @author zyf\n * @date 2022-04-13\n */\n@Component(\"flowRuleNacosPublisher\")\npublic class FlowRuleNacosPublisher implements DynamicRulePublisher<List<FlowRuleEntity>> {\n\n    @Autowired\n    private ConfigService configService;\n    @Autowired\n    private Converter<List<FlowRuleEntity>, String> converter;\n\n    @Override\n    public void publish(String app, List<FlowRuleEntity> rules) throws Exception {\n        AssertUtil.notEmpty(app, \"app name cannot be empty\");\n        if (rules == null) {\n            return;\n        }\n        configService.publishConfig(app + SentinelConStants.FLOW_DATA_ID_POSTFIX,\n                SentinelConStants.GROUP_ID, converter.convert(rules));\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/gateway/GateWayApiNacosProvider.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.rule.nacos.gateway;\n\nimport com.alibaba.csp.sentinel.dashboard.constants.SentinelConStants;\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;\nimport com.alibaba.csp.sentinel.datasource.Converter;\nimport com.alibaba.csp.sentinel.util.StringUtil;\nimport com.alibaba.nacos.api.config.ConfigService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.ArrayList;\nimport java.util.List;\n/**\n * 网关API规则拉取\n *\n * @author zyf\n * @date 2022-04-13\n */\n@Component(\"gateWayApiNacosProvider\")\npublic class GateWayApiNacosProvider implements DynamicRuleProvider<List<ApiDefinitionEntity>> {\n    @Autowired\n    private ConfigService configService;\n    @Autowired\n    private Converter<String , List<ApiDefinitionEntity>> converter;\n    @Override\n    public List<ApiDefinitionEntity> getRules(String appName) throws Exception {\n        String rules = configService.getConfig(appName+ SentinelConStants.GETEWAY_API_DATA_ID_POSTFIX\n                , SentinelConStants.GROUP_ID,3000);\n        if(StringUtil.isEmpty(rules)){\n            return new ArrayList<>();\n        }\n        return converter.convert(rules);\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/gateway/GateWayApiNacosPublisher.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.rule.nacos.gateway;\n\n\nimport com.alibaba.csp.sentinel.dashboard.constants.SentinelConStants;\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;\nimport com.alibaba.csp.sentinel.datasource.Converter;\nimport com.alibaba.csp.sentinel.util.AssertUtil;\nimport com.alibaba.nacos.api.config.ConfigService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n/**\n * 网关API规则推送\n *\n * @author zyf\n * @date 2022-04-13\n */\n@Component(\"gateWayApiNacosPublisher\")\npublic class GateWayApiNacosPublisher implements DynamicRulePublisher<List<ApiDefinitionEntity>> {\n    @Autowired\n    private ConfigService configService;\n    @Autowired\n    private Converter<List<ApiDefinitionEntity>, String> converter;\n    @Override\n    public void publish(String app, List<ApiDefinitionEntity> rules) throws Exception {\n        AssertUtil.notEmpty(app, \"app name cannot be empty\");\n        if (rules == null) {\n            return;\n        }\n        configService.publishConfig(app+ SentinelConStants.GETEWAY_API_DATA_ID_POSTFIX,\n                SentinelConStants.GROUP_ID,converter.convert(rules));\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/gateway/GateWayFlowRulesNacosProvider.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.rule.nacos.gateway;\n\nimport com.alibaba.csp.sentinel.dashboard.constants.SentinelConStants;\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;\nimport com.alibaba.csp.sentinel.dashboard.rule.nacos.SentinelConfig;\nimport com.alibaba.csp.sentinel.datasource.Converter;\nimport com.alibaba.csp.sentinel.util.StringUtil;\nimport com.alibaba.nacos.api.config.ConfigService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * 网关流控规则拉取\n *\n * @author zyf\n * @date 2022-04-13\n */\n@Component(\"gateWayFlowRulesNacosProvider\")\npublic class GateWayFlowRulesNacosProvider implements DynamicRuleProvider<List<GatewayFlowRuleEntity>> {\n\n    @Autowired\n    private ConfigService configService;\n    @Autowired\n    private Converter<String, List<GatewayFlowRuleEntity>> converter;\n\n    @Override\n    public List<GatewayFlowRuleEntity> getRules(String appName) throws Exception {\n        String rules = configService.getConfig(appName + SentinelConStants.GETEWAY_FLOW_DATA_ID_POSTFIX,\n                SentinelConStants.GROUP_ID, 3000);\n        if (StringUtil.isEmpty(rules)) {\n            return new ArrayList<>();\n        }\n        return converter.convert(rules);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/gateway/GateWayFlowRulesNacosPublisher.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.rule.nacos.gateway;\n\n\nimport java.util.List;\n\nimport com.alibaba.csp.sentinel.dashboard.constants.SentinelConStants;\nimport com.alibaba.csp.sentinel.dashboard.rule.nacos.SentinelConfig;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;\nimport com.alibaba.csp.sentinel.datasource.Converter;\nimport com.alibaba.csp.sentinel.util.AssertUtil;\nimport com.alibaba.nacos.api.config.ConfigService;\n\n/**\n * 网关流控规则推送\n *\n * @author zyf\n * @date 2022-04-13\n */\n@Component(\"gateWayFlowRulesNacosPublisher\")\npublic class GateWayFlowRulesNacosPublisher implements DynamicRulePublisher<List<GatewayFlowRuleEntity>> {\n\n    @Autowired\n    private ConfigService configService;\n    @Autowired\n    private Converter<List<GatewayFlowRuleEntity>, String> converter;\n\n\n    @Override\n    public void publish(String app, List<GatewayFlowRuleEntity> rules) throws Exception {\n        AssertUtil.notEmpty(app, \"app name cannot be empty\");\n        if (rules == null) {\n            return;\n        }\n        configService.publishConfig(app + SentinelConStants.GETEWAY_FLOW_DATA_ID_POSTFIX,\n                SentinelConStants.GROUP_ID, converter.convert(rules));\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/paramflow/ParamFlowRuleNacosProvider.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.rule.nacos.paramflow;\n\n\nimport com.alibaba.csp.sentinel.dashboard.constants.SentinelConStants;\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.ParamFlowRuleEntity;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;\nimport com.alibaba.csp.sentinel.dashboard.rule.nacos.SentinelConfig;\nimport com.alibaba.csp.sentinel.dashboard.rule.nacos.entity.ParamFlowRuleCorrectEntity;\nimport com.alibaba.csp.sentinel.datasource.Converter;\nimport com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;\nimport com.alibaba.csp.sentinel.util.StringUtil;\nimport com.alibaba.nacos.api.config.ConfigService;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n/**\n *  加载热点参数规则\n *\n * @author zyf\n * @date 2022-04-13\n */\n@Component(\"paramFlowRuleNacosProvider\")\npublic class ParamFlowRuleNacosProvider implements DynamicRuleProvider<List<ParamFlowRuleEntity>> {\n\n    @Autowired\n    private ConfigService configService;\n    @Autowired\n    private Converter<String, List<ParamFlowRuleCorrectEntity>> converter;\n\n    @Override\n    public List<ParamFlowRuleEntity> getRules(String appName) throws Exception {\n        String rules = configService.getConfig(appName + SentinelConStants.PARAM_FLOW_DATA_ID_POSTFIX,\n                SentinelConStants.GROUP_ID, 3000);\n        if (StringUtil.isEmpty(rules)) {\n            return new ArrayList<>();\n        }\n        List<ParamFlowRuleCorrectEntity> entityList = converter.convert(rules);\n        return entityList.stream().map(rule -> {\n            ParamFlowRule paramFlowRule = new ParamFlowRule();\n            BeanUtils.copyProperties(rule, paramFlowRule);\n            ParamFlowRuleEntity entity = ParamFlowRuleEntity.fromParamFlowRule(rule.getApp(), rule.getIp(), rule.getPort(), paramFlowRule);\n            entity.setId(rule.getId());\n            entity.setGmtCreate(rule.getGmtCreate());\n            return entity;\n        }).collect(Collectors.toList());\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/paramflow/ParamFlowRuleNacosPublisher.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.rule.nacos.paramflow;\n\nimport com.alibaba.csp.sentinel.dashboard.constants.SentinelConStants;\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.ParamFlowRuleEntity;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;\nimport com.alibaba.csp.sentinel.dashboard.rule.nacos.SentinelConfig;\nimport com.alibaba.csp.sentinel.dashboard.rule.nacos.entity.ParamFlowRuleCorrectEntity;\nimport com.alibaba.csp.sentinel.datasource.Converter;\nimport com.alibaba.csp.sentinel.util.AssertUtil;\nimport com.alibaba.nacos.api.config.ConfigService;\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n/**\n *  持久化热点参数规则\n *\n * @author zyf\n * @date 2022-04-13\n */\n@Component(\"paramFlowRuleNacosPublisher\")\npublic class ParamFlowRuleNacosPublisher implements DynamicRulePublisher<List<ParamFlowRuleEntity>> {\n\n    @Autowired\n    private ConfigService configService;\n    @Autowired\n    private Converter<List<ParamFlowRuleCorrectEntity>, String> converter;\n\n    @Override\n    public void publish(String app, List<ParamFlowRuleEntity> rules) throws Exception {\n        AssertUtil.notEmpty(app, \"app name cannot be empty\");\n        if (rules == null) {\n            return;\n        }\n        rules.forEach(e -> e.setApp(app));\n\n        //  转换\n        List<ParamFlowRuleCorrectEntity> list = rules.stream().map(rule -> {\n            ParamFlowRuleCorrectEntity entity = new ParamFlowRuleCorrectEntity();\n            BeanUtils.copyProperties(rule, entity);\n            return entity;\n        }).collect(Collectors.toList());\n\n        configService.publishConfig(app + SentinelConStants.PARAM_FLOW_DATA_ID_POSTFIX,\n                SentinelConStants.GROUP_ID, converter.convert(list));\n\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/system/SystemRuleNacosProvider.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.rule.nacos.system;\n\nimport com.alibaba.csp.sentinel.dashboard.constants.SentinelConStants;\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.SystemRuleEntity;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRuleProvider;\nimport com.alibaba.csp.sentinel.datasource.Converter;\nimport com.alibaba.csp.sentinel.util.StringUtil;\nimport com.alibaba.nacos.api.config.ConfigService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n *  加载系统规则\n *\n * @author zyf\n * @date 2022-04-13\n */\n@Component(\"systemRuleNacosProvider\")\npublic class SystemRuleNacosProvider implements DynamicRuleProvider<List<SystemRuleEntity>> {\n    @Autowired\n    private ConfigService configService;\n    @Autowired\n    private Converter<String, List<SystemRuleEntity>> converter;\n\n    @Override\n    public List<SystemRuleEntity> getRules(String appName) throws Exception {\n        String rules = configService.getConfig(appName + SentinelConStants.SYSTEM_DATA_ID_POSTFIX,\n                SentinelConStants.GROUP_ID, 3000);\n        if (StringUtil.isEmpty(rules)) {\n            return new ArrayList<>();\n        }\n        return converter.convert(rules);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos/system/SystemRuleNacosPublisher.java",
    "content": "package com.alibaba.csp.sentinel.dashboard.rule.nacos.system;\n\nimport com.alibaba.csp.sentinel.dashboard.constants.SentinelConStants;\nimport com.alibaba.csp.sentinel.dashboard.datasource.entity.rule.SystemRuleEntity;\nimport com.alibaba.csp.sentinel.dashboard.rule.DynamicRulePublisher;\nimport com.alibaba.csp.sentinel.datasource.Converter;\nimport com.alibaba.csp.sentinel.util.AssertUtil;\nimport com.alibaba.nacos.api.config.ConfigService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.List;\n\n/**\n *  持久化系统规则\n *\n * @author zyf\n * @date 2022-04-13\n */\n@Component(\"systemRuleNacosPublisher\")\npublic class SystemRuleNacosPublisher implements DynamicRulePublisher<List<SystemRuleEntity>> {\n\n    @Autowired\n    private ConfigService configService;\n    @Autowired\n    private Converter<List<SystemRuleEntity>, String> converter;\n\n    @Override\n    public void publish(String app, List<SystemRuleEntity> rules) throws Exception {\n        AssertUtil.notEmpty(app, \"app name cannot be empty\");\n        if (rules == null) {\n            return;\n        }\n        configService.publishConfig(app + SentinelConStants.SYSTEM_DATA_ID_POSTFIX,\n                SentinelConStants.GROUP_ID, converter.convert(rules));\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-sentinel/src/main/resources/application.yml",
    "content": "server:\n  port: 9000\n  servlet:\n    session:\n      cookie:\n        name: sentinel_dashboard_cookie\n    encoding:\n      charset: UTF-8\n      enabled: true\n      force: true\nspring:\n  mvc:\n    #Spring Boot 2.6+\\u540E\\u6620\\u5C04\\u5339\\u914D\\u7684\\u9ED8\\u8BA4\\u7B56\\u7565\\u5DF2\\u4ECEAntPathMatcher\\u66F4\\u6539\\u4E3APathPatternParser,\\u9700\\u8981\\u624B\\u52A8\\u6307\\u5B9A\\u4E3Aant-path-matcher\n    pathmatch:\n      matching-strategy: ant_path_matcher\n#auth settings\nauth:\n  filter:\n    exclude-url-suffixes: htm,html,js,css,map,ico,ttf,woff,png\n    exclude-urls: /,/auth/login,/auth/logout,/registry/machine,/version\nlogging:\n  level:\n    org:\n      springframework:\n        web: INFO\n  pattern:\n    file: '%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n'\n  file:\n    name: ${user.home}/logs/csp/sentinel-dashboard.log\nnacos:\n  server:\n    ip: @config.server-addr@\nsentinel:\n  dashboard:\n    version: 1.8.2\n    auth:\n      username: sentinel\n      password: sentinel"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-more/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-cloud-test</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n    <description>公共测试模块</description>\n    <artifactId>jeecg-cloud-test-more</artifactId>\n\n    <dependencies>\n        <!-- 引入jeecg-boot-starter-cloud依赖 -->\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-boot-starter-cloud</artifactId>\n            <!--system模块需要排除jeecg-system-cloud-api-->\n            <exclusions>\n                <exclusion>\n                    <groupId>org.jeecgframework.boot3</groupId>\n                    <artifactId>jeecg-system-cloud-api</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n        <!--定时任务-->\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-boot-starter-job</artifactId>\n        </dependency>\n        <!--rabbitmq消息队列-->\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-boot-starter-rabbitmq</artifactId>\n        </dependency>\n        <!-- 分布式锁依赖 -->\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-boot-starter-lock</artifactId>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-more/src/main/java/org/jeecg/modules/test/constant/CloudConstant.java",
    "content": "package org.jeecg.modules.test.constant;\n\n/**\n * 微服务单元测试常量定义\n * @author: zyf\n * @date: 2022/04/21\n */\npublic interface CloudConstant {\n\n    /**\n     * MQ测试队列名字\n     */\n    public final static String MQ_JEECG_PLACE_ORDER = \"jeecg_place_order\";\n\n    /**\n     * MQ测试消息总线\n     */\n    public final static String MQ_DEMO_BUS_EVENT = \"demoBusEvent\";\n\n    /**\n     * 分布式锁lock key\n     */\n    public final static String REDISSON_DEMO_LOCK_KEY1 = \"demoLockKey1\";\n    public final static String REDISSON_DEMO_LOCK_KEY2 = \"demoLockKey2\";\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-more/src/main/java/org/jeecg/modules/test/feign/client/JeecgTestClient.java",
    "content": "package org.jeecg.modules.test.feign.client;\n\nimport org.jeecg.common.api.vo.Result;\n\nimport org.jeecg.common.constant.ServiceNameConstants;\nimport org.jeecg.config.FeignConfig;\nimport org.jeecg.modules.test.constant.CloudConstant;\nimport org.jeecg.modules.test.feign.factory.JeecgTestClientFactory;\nimport org.springframework.cloud.openfeign.FeignClient;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\n\n/**\n * 常规feign接口定义\n * @author: zyf\n * @date: 2022/04/21\n */\n@FeignClient(value = ServiceNameConstants.SERVICE_DEMO, configuration = FeignConfig.class,fallbackFactory = JeecgTestClientFactory.class)\n@Component\npublic interface JeecgTestClient {\n\n    /**\n     * feign测试方法\n     * @param name\n     * @return\n     */\n    @GetMapping(value = \"/test/getMessage\")\n    String getMessage(@RequestParam(value = \"name\",required = false) String name);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-more/src/main/java/org/jeecg/modules/test/feign/client/JeecgTestClientDyn.java",
    "content": "//package org.jeecg.modules.test.feign.client;\n//\n//import org.jeecg.common.api.vo.Result;\n//import org.springframework.web.bind.annotation.GetMapping;\n//import org.springframework.web.bind.annotation.PostMapping;\n//import org.springframework.web.bind.annotation.RequestParam;\n//\n///**\n// * 动态feign接口定义\n// */\n//public interface JeecgTestClientDyn {\n//\n//    @GetMapping(value = \"/test/getMessage\")\n//    Result<String> getMessage(@RequestParam(value = \"name\",required = false) String name);\n//}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-more/src/main/java/org/jeecg/modules/test/feign/controller/JeecgTestFeignController.java",
    "content": "package org.jeecg.modules.test.feign.controller;\n\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.StringUtils;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.modules.test.feign.client.JeecgTestClient;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\nimport com.alibaba.csp.sentinel.annotation.SentinelResource;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\n\n/**\n * 微服务单元测试\n * @author: zyf\n * @date: 2022/04/21\n */\n@Slf4j\n@RestController\n@RequestMapping(\"/sys/test\")\n@Tag(name = \"【微服务】单元测试\")\npublic class JeecgTestFeignController {\n\n    @Autowired\n    private JeecgTestClient jeecgTestClient;\n\n    /**\n     * 熔断： fallbackFactory优先于 @SentinelResource\n     *\n     * @param name\n     * @return\n     */\n    @GetMapping(\"/getMessage\")\n    @Operation(summary = \"测试feign调用demo服务1\")\n    @SentinelResource(value = \"test_more_getMessage\", fallback = \"getDefaultUser\")\n    public Result<String> getMessage(@RequestParam(value = \"name\", required = false) String name) {\n        log.info(\"---------Feign fallbackFactory优先级高于@SentinelResource-----------------\");\n        String resultMsg = jeecgTestClient.getMessage(\" I am jeecg-system 服务节点，呼叫 jeecg-demo!\");\n        return Result.OK(null, resultMsg);\n    }\n\n    /**\n     * 测试方法：关闭demo服务，访问请求 http://127.0.0.1:9999/sys/test/getMessage\n     *\n     * @param name\n     * @return\n     */\n    @GetMapping(\"/getMessage2\")\n    @Operation(summary = \"测试feign调用demo服务2\")\n    public Result<String> getMessage2(@RequestParam(value = \"name\", required = false) String name) {\n        log.info(\"---------测试 Feign fallbackFactory-----------------\");\n        String resultMsg = jeecgTestClient.getMessage(\" I am jeecg-system 服务节点，呼叫 jeecg-demo!\");\n        return Result.OK(null, resultMsg);\n    }\n\n\n    @GetMapping(\"/fallback\")\n    @Operation(summary = \"测试熔断\")\n    @SentinelResource(value = \"test_more_fallback\", fallback = \"getDefaultUser\")\n    public Result<Object> test(@RequestParam(value = \"name\", required = false) String name) {\n        if (StringUtils.isEmpty(name)) {\n            throw new IllegalArgumentException(\"name param is empty\");\n        }\n        return Result.OK();\n    }\n\n    /**\n     * 熔断，默认回调函数\n     *\n     * @param name\n     * @return\n     */\n    public Result<Object> getDefaultUser(String name) {\n        log.info(\"熔断，默认回调函数\");\n        return Result.error(null, \"访问超时, 自定义 @SentinelResource Fallback\");\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-more/src/main/java/org/jeecg/modules/test/feign/factory/JeecgTestClientFactory.java",
    "content": "package org.jeecg.modules.test.feign.factory;\n\n\n\n\nimport org.springframework.cloud.openfeign.FallbackFactory;\nimport org.jeecg.modules.test.feign.client.JeecgTestClient;\nimport org.jeecg.modules.test.feign.fallback.JeecgTestFallback;\nimport org.springframework.stereotype.Component;\n\n/**\n * @author qinfeng\n */\n@Component\npublic class JeecgTestClientFactory implements FallbackFactory<JeecgTestClient> {\n\n    @Override\n    public JeecgTestClient create(Throwable throwable) {\n        JeecgTestFallback fallback = new JeecgTestFallback();\n        fallback.setCause(throwable);\n        return fallback;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-more/src/main/java/org/jeecg/modules/test/feign/fallback/JeecgTestFallback.java",
    "content": "package org.jeecg.modules.test.feign.fallback;\n\nimport org.jeecg.common.api.vo.Result;\n\nimport lombok.Setter;\nimport org.jeecg.modules.test.feign.client.JeecgTestClient;\n\n\n/**\n* 接口fallback实现\n* \n* @author: scott\n* @date: 2022/4/11 19:41\n*/\npublic class JeecgTestFallback implements JeecgTestClient {\n\n    @Setter\n    private Throwable cause;\n\n\n    @Override\n    public String getMessage(String name) {\n        return \"访问超时, 自定义FallbackFactory\";\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-more/src/main/java/org/jeecg/modules/test/lock/DemoLockTest.java",
    "content": "package org.jeecg.modules.test.lock;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.boot.starter.lock.annotation.JLock;\nimport org.jeecg.boot.starter.lock.client.RedissonLockClient;\nimport org.jeecg.modules.test.constant.CloudConstant;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.scheduling.annotation.Scheduled;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Map;\n\n/**\n * 分布式锁测试demo\n * @author: zyf\n * @date: 2022/04/21\n */\n@Slf4j\n@Component\npublic class DemoLockTest {\n    @Autowired\n    RedissonLockClient redissonLock;\n//    @Autowired\n//    RabbitMqClient rabbitMqClient;\n\n    /**\n     * 测试方法：\n     *    @Scheduled(cron = \"0/5 * * * * ?\") 表示每5秒执行一次\n     *    @JLock(lockKey = CloudConstant.REDISSON_DEMO_LOCK_KEY1)分布式锁，10秒钟才释放\n     *    结果：每10秒钟输出一次 “执行 分布式锁 业务逻辑1” 就说明锁成功了\n     *\n     * 测试分布式锁【注解方式】\n     */\n    @Scheduled(cron = \"0/5 * * * * ?\")\n    @JLock(lockKey = CloudConstant.REDISSON_DEMO_LOCK_KEY1)\n    public void execute() throws InterruptedException {\n        log.info(\"执行execute任务开始，休眠十秒开始，当前系统时间戳（秒）：\"+ System.currentTimeMillis()/1000);\n        Thread.sleep(10000);\n        log.info(\"========执行 分布式锁 业务逻辑1=============\");\n//        Map map = new BaseMap();\n//        map.put(\"orderId\", \"BJ0001\");\n//        rabbitMqClient.sendMessage(CloudConstant.MQ_JEECG_PLACE_ORDER, map);\n//        //延迟10秒发送\n//        map.put(\"orderId\", \"NJ0002\");\n//        rabbitMqClient.sendMessage(CloudConstant.MQ_JEECG_PLACE_ORDER, map, 10000);\n\n        log.info(\"execute任务结束，休眠十秒完成，当前系统时间戳（秒）：\"+ System.currentTimeMillis()/1000);\n    }\n\n\n    /**\n     * 测试分布式锁【编码方式】\n     * @Scheduled(cron = \"0/5 * * * * ?\")\n     */\n    public void execute2() throws InterruptedException {\n        int expireSeconds=6000;\n        if (redissonLock.tryLock(CloudConstant.REDISSON_DEMO_LOCK_KEY2, -1, expireSeconds)) {\n            log.info(\"执行任务execute2开始，休眠十秒\");\n            Thread.sleep(10000);\n           log.info(\"=============业务逻辑2===================\");\n            log.info(\"定时execute2结束，休眠十秒\");\n\n            redissonLock.unlock(CloudConstant.REDISSON_DEMO_LOCK_KEY2);\n        } else {\n            log.info(\"execute2获取锁失败\");\n        }\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-more/src/main/java/org/jeecg/modules/test/xxljob/DemoJobHandler.java",
    "content": "\npackage org.jeecg.modules.test.xxljob;\n\n\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.context.XxlJobHelper;\nimport com.xxl.job.core.handler.IJobHandler;\nimport com.xxl.job.core.handler.annotation.XxlJob;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Component;\nimport java.io.BufferedInputStream;\nimport java.io.BufferedReader;\nimport java.io.DataOutputStream;\nimport java.io.InputStreamReader;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\nimport java.util.Arrays;\nimport com.xxl.job.core.context.XxlJobHelper;\n\n/**\n * xxl-job定时任务测试\n * @author: zyf\n * @date: 2022/04/21\n */\n@Component\n@Slf4j\npublic class DemoJobHandler {\n\n\n    /**\n     * 简单任务\n     *\n     * @param params\n     * @return\n     */\n    @XxlJob(value = \"demoJob\")\n    public ReturnT<String> demoJobHandler(String params) {\n        log.info(\"我是 jeecg-system 服务里的定时任务 demoJob，我执行了...............................\");\n        return ReturnT.SUCCESS;\n    }\n\n    /**\n     * 2、分片广播任务\n     */\n    @XxlJob(\"shardingJobHandler\")\n    public ReturnT<String> shardingJobHandler(String param) throws Exception {\n\n        // 获取分片序号和总分片数\n        int shardIndex = XxlJobHelper.getShardIndex();\n        int shardTotal = XxlJobHelper.getShardTotal();\n        log.info(\"分片参数：当前分片序号 = {}, 总分片数 = {}\", shardIndex, shardTotal);\n\n        // 业务逻辑\n        for (int i = 0; i < shardTotal; i++) {\n            if (i == shardIndex) {\n                log.info(\"第 {} 片, 命中分片开始处理\", i);\n            } else {\n                log.info(\"第 {} 片, 忽略\", i);\n            }\n        }\n\n        return ReturnT.SUCCESS;\n    }\n\n\n    /**\n     * 3、命令行任务\n     *\n     * 输入参数：ipconfig /all\n     */\n    @XxlJob(\"commandJobHandler\")\n    public ReturnT<String> commandJobHandler(String param) throws Exception {\n        String command = param;\n        int exitValue = -1;\n\n        BufferedReader bufferedReader = null;\n        try {\n            // command process\n            Process process = Runtime.getRuntime().exec(command);\n            BufferedInputStream bufferedInputStream = new BufferedInputStream(process.getInputStream());\n            bufferedReader = new BufferedReader(new InputStreamReader(bufferedInputStream));\n\n            // command log\n            String line;\n            while ((line = bufferedReader.readLine()) != null) {\n                log.info(line);\n            }\n\n            // command exit\n            process.waitFor();\n            exitValue = process.exitValue();\n        } catch (Exception e) {\n            log.info(e.getMessage(),e);\n        } finally {\n            if (bufferedReader != null) {\n                bufferedReader.close();\n            }\n        }\n\n        if (exitValue == 0) {\n            return ReturnT.SUCCESS;\n        } else {\n            return new ReturnT<String>(ReturnT.FAIL_CODE, \"command exit value(\" + exitValue + \") is failed\");\n        }\n    }\n\n\n    /**\n     * 4、跨平台Http任务\n     *\n     * 输入参数：\n     * url: https://www.baidu.com\n     * method: get\n     * data: content\n     */\n    @XxlJob(\"httpJobHandler\")\n    public ReturnT<String> httpJobHandler(String param) throws Exception {\n        String[] methodArray=new String[]{\"GET\",\"POST\"};\n        int okState=200;\n        // param parse\n        if (param == null || param.trim().length() == 0) {\n            log.info(\"param[\" + param + \"] invalid.\");\n            return ReturnT.FAIL;\n        }\n        String[] httpParams = param.split(\"\\n\");\n        String url = null;\n        String method = null;\n        String data = null;\n        for (String httpParam : httpParams) {\n            if (httpParam.startsWith(\"url:\")) {\n                url = httpParam.substring(httpParam.indexOf(\"url:\") + 4).trim();\n            }\n            if (httpParam.startsWith(\"method:\")) {\n                method = httpParam.substring(httpParam.indexOf(\"method:\") + 7).trim().toUpperCase();\n            }\n            if (httpParam.startsWith(\"data:\")) {\n                data = httpParam.substring(httpParam.indexOf(\"data:\") + 5).trim();\n            }\n        }\n\n        // param valid\n        if (url == null || url.trim().length() == 0) {\n            log.info(\"url[\" + url + \"] invalid.\");\n            return ReturnT.FAIL;\n        }\n        if (method == null || !Arrays.asList(methodArray).contains(method)) {\n            log.info(\"method[\" + method + \"] invalid.\");\n            return ReturnT.FAIL;\n        }\n\n        // request\n        HttpURLConnection connection = null;\n        BufferedReader bufferedReader = null;\n        try {\n            // connection\n            URL realUrl = new URL(url);\n            connection = (HttpURLConnection) realUrl.openConnection();\n\n            // connection setting\n            connection.setRequestMethod(method);\n            connection.setDoOutput(true);\n            connection.setDoInput(true);\n            connection.setUseCaches(false);\n            connection.setReadTimeout(5 * 1000);\n            connection.setConnectTimeout(3 * 1000);\n            connection.setRequestProperty(\"connection\", \"Keep-Alive\");\n            connection.setRequestProperty(\"Content-Type\", \"application/json;charset=UTF-8\");\n            connection.setRequestProperty(\"Accept-Charset\", \"application/json;charset=UTF-8\");\n\n            // do connection\n            connection.connect();\n\n            // data\n            if (data != null && data.trim().length() > 0) {\n                DataOutputStream dataOutputStream = new DataOutputStream(connection.getOutputStream());\n                dataOutputStream.write(data.getBytes(\"UTF-8\"));\n                dataOutputStream.flush();\n                dataOutputStream.close();\n            }\n\n            // valid StatusCode\n            int statusCode = connection.getResponseCode();\n            if (statusCode != okState) {\n                throw new RuntimeException(\"Http Request StatusCode(\" + statusCode + \") Invalid.\");\n            }\n\n            // result\n            bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), \"UTF-8\"));\n            StringBuilder result = new StringBuilder();\n            String line;\n            while ((line = bufferedReader.readLine()) != null) {\n                result.append(line);\n            }\n            String responseMsg = result.toString();\n\n            log.info(responseMsg);\n            return ReturnT.SUCCESS;\n        } catch (Exception e) {\n            log.info(e.getMessage(),e);\n            return ReturnT.FAIL;\n        } finally {\n            try {\n                if (bufferedReader != null) {\n                    bufferedReader.close();\n                }\n                if (connection != null) {\n                    connection.disconnect();\n                }\n            } catch (Exception e2) {\n                log.info(e2.getMessage(),e2);\n            }\n        }\n\n    }\n\n\n    /**\n     * 5、生命周期任务示例：任务初始化与销毁时，支持自定义相关逻辑；\n     */\n    @XxlJob(value = \"demoJobHandler2\", init = \"init\", destroy = \"destroy\")\n    public ReturnT<String> demoJobHandler2(String param) throws Exception {\n        log.info(\"XXL-JOB, Hello World.\");\n        return ReturnT.SUCCESS;\n    }\n\n    public void init() {\n        log.info(\"init\");\n    }\n\n    public void destroy() {\n        log.info(\"destory\");\n    }\n\n}\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-more/src/main/java/org/jeecg/modules/test/xxljob/XxclJobTest.java",
    "content": "\npackage org.jeecg.modules.test.xxljob;\n\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.handler.annotation.XxlJob;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Component;\n\n/**\n *  xxl-job定时任务测试\n * @author: zyf\n * @date: 2022/04/21\n */\n@Component\n@Slf4j\npublic class XxclJobTest {\n\n\n    /**\n     * 简单任务\n     *\n     * @param params\n     * @return\n     */\n\n    @XxlJob(value = \"xxclJobTest\")\n    public ReturnT<String> demoJobHandler(String params) {\n        log.info(\"我是 jeecg-system 服务里的定时任务 xxclJobTest , 我执行了...............................\");\n        return ReturnT.SUCCESS;\n    }\n\n    public void init() {\n        log.info(\"init\");\n    }\n\n    public void destroy() {\n        log.info(\"destory\");\n    }\n\n}\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rabbitmq/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-cloud-test</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n    <description>消息队列测试模块</description>\n    <artifactId>jeecg-cloud-test-rabbitmq</artifactId>\n\n    <dependencies>\n        <!--rabbitmq消息队列-->\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-boot-starter-rabbitmq</artifactId>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rabbitmq/src/main/java/org/jeecg/modules/test/rabbitmq/constant/CloudConstant.java",
    "content": "package org.jeecg.modules.test.rabbitmq.constant;\n\n/**\n * 微服务单元测试常量定义\n * @author: zyf\n * @date: 2022/04/21\n */\npublic interface CloudConstant {\n\n\n    /**\n     * MQ测试队列名字\n     */\n    public final static String MQ_JEECG_PLACE_ORDER = \"jeecg_place_order\";\n    public final static String MQ_JEECG_PLACE_ORDER_TIME = \"jeecg_place_order_time\";\n\n    /**\n     * MQ测试消息总线\n     */\n    public final static String MQ_DEMO_BUS_EVENT = \"demoBusEvent\";\n\n    /**\n     * 分布式锁lock key\n     */\n    public final static String REDISSON_DEMO_LOCK_KEY1 = \"demoLockKey1\";\n    public final static String REDISSON_DEMO_LOCK_KEY2 = \"demoLockKey2\";\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rabbitmq/src/main/java/org/jeecg/modules/test/rabbitmq/controller/JeecgMqTestController.java",
    "content": "package org.jeecg.modules.test.rabbitmq.controller;\n\n\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport jakarta.servlet.http.HttpServletRequest;\n\nimport org.jeecg.boot.starter.rabbitmq.client.RabbitMqClient;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.modules.test.rabbitmq.constant.CloudConstant;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport cn.hutool.core.util.RandomUtil;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\n\n\n/**\n * RabbitMqClient发送消息\n * @author: zyf\n * @date: 2022/04/21\n */\n@RestController\n@RequestMapping(\"/sys/test\")\n@Tag(name = \"【微服务】MQ单元测试\")\npublic class JeecgMqTestController {\n\n    @Autowired\n    private RabbitMqClient rabbitMqClient;\n\n\n    /**\n     * 测试方法：快速点击发送MQ消息\n     *  观察三个接受者如何分配处理消息：HelloReceiver1、HelloReceiver2、HelloReceiver3，会均衡分配\n     *\n     * @param req\n     * @return\n     */\n    @GetMapping(value = \"/rabbitmq\")\n    @Operation(summary = \"测试rabbitmq\")\n    public Result<?> rabbitMqClientTest(HttpServletRequest req) {\n        //rabbitmq消息队列测试\n        BaseMap map = new BaseMap();\n        map.put(\"orderId\", RandomUtil.randomNumbers(10));\n        rabbitMqClient.sendMessage(CloudConstant.MQ_JEECG_PLACE_ORDER, map);\n        rabbitMqClient.sendMessage(CloudConstant.MQ_JEECG_PLACE_ORDER_TIME, map,10);\n        return Result.OK(\"MQ发送消息成功\");\n    }\n\n    @GetMapping(value = \"/rabbitmq2\")\n    @Operation(summary = \"rabbitmq消息总线测试\")\n    public Result<?> rabbitmq2(HttpServletRequest req) {\n\n        //rabbitmq消息总线测试\n        BaseMap params = new BaseMap();\n        params.put(\"orderId\", \"123456\");\n        rabbitMqClient.publishEvent(CloudConstant.MQ_DEMO_BUS_EVENT, params);\n        return Result.OK(\"MQ发送消息成功\");\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rabbitmq/src/main/java/org/jeecg/modules/test/rabbitmq/event/DemoBusEvent.java",
    "content": "package org.jeecg.modules.test.rabbitmq.event;\n\nimport org.jeecg.boot.starter.rabbitmq.event.EventObj;\nimport org.jeecg.boot.starter.rabbitmq.event.JeecgBusEventHandler;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.modules.test.rabbitmq.constant.CloudConstant;\nimport org.springframework.stereotype.Component;\n\nimport cn.hutool.core.util.ObjectUtil;\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * 消息处理器【发布订阅】\n * @author: zyf\n * @date: 2022/04/21\n */\n@Slf4j\n@Component(CloudConstant.MQ_DEMO_BUS_EVENT)\npublic class DemoBusEvent implements JeecgBusEventHandler {\n\n\n    @Override\n    public void onMessage(EventObj obj) {\n        if (ObjectUtil.isNotEmpty(obj)) {\n            BaseMap baseMap = obj.getBaseMap();\n            String orderId = baseMap.get(\"orderId\");\n            log.info(\"业务处理----订单ID:\" + orderId);\n        }\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rabbitmq/src/main/java/org/jeecg/modules/test/rabbitmq/listener/HelloReceiver1.java",
    "content": "package org.jeecg.modules.test.rabbitmq.listener;\n\nimport org.jeecg.boot.starter.rabbitmq.core.BaseRabbiMqHandler;\nimport org.jeecg.boot.starter.rabbitmq.listenter.MqListener;\nimport org.jeecg.common.annotation.RabbitComponent;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.modules.test.rabbitmq.constant.CloudConstant;\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.amqp.support.AmqpHeaders;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.messaging.handler.annotation.Header;\nimport org.springframework.web.client.RestTemplate;\n\nimport com.rabbitmq.client.Channel;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * 定义接收者（可以定义N个接受者，消息会均匀的发送到N个接收者中）\n *\n * RabbitMq接受者1\n * （@RabbitListener声明类上，一个类只能监听一个队列）\n * @author: zyf\n * @date: 2022/04/21\n */\n@Slf4j\n@RabbitListener(queues = CloudConstant.MQ_JEECG_PLACE_ORDER)\n@RabbitComponent(value = \"helloReceiver1\")\npublic class HelloReceiver1 extends BaseRabbiMqHandler<BaseMap> {\n\n    @Autowired\n    private  RestTemplate restTemplate;\n\n    @RabbitHandler\n    public void onMessage(BaseMap baseMap, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) {\n        super.onMessage(baseMap, deliveryTag, channel, new MqListener<BaseMap>() {\n            @Override\n            public void handler(BaseMap map, Channel channel) {\n                //业务处理\n                String orderId = map.get(\"orderId\").toString();\n                log.info(\"【我是处理人1】 MQ Receiver1，orderId : \" + orderId);\n               // jeecgTestClient.getMessage(\"JEECG\");\n                try{\n//                    HttpHeaders requestHeaders = new HttpHeaders();\n//                   requestHeaders.add(\"X-Access-Token\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MzExOTcyOTEsInVzZXJuYW1lIjoiYWRtaW4ifQ.N8mJvwzb4G0i3vYF9A2Bmf5cDKb1LDnOp1RwtpYEu1E\");\n//                    requestHeaders.add(\"content-type\", MediaType.APPLICATION_JSON_UTF8.toString());\n//                    MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<>();\n//                    requestBody.add(\"name\", \"test\");\n//                    HttpEntity< MultiValueMap<String, String> > requestEntity = new HttpEntity(requestBody, requestHeaders);\n//                    //post\n//                    ResponseEntity<String> responseEntity = restTemplate.postForEntity(\"http://localhost:7002/test/getMessage\", requestEntity, String.class);\n//                    System.out.println(\" responseEntity :\"+responseEntity.getBody());\n                }catch (Exception e){\n                    e.printStackTrace();\n                }\n\n            }\n        });\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rabbitmq/src/main/java/org/jeecg/modules/test/rabbitmq/listener/HelloReceiver2.java",
    "content": "package org.jeecg.modules.test.rabbitmq.listener;//package org.jeecg.modules.cloud.rabbitmq;\n\nimport com.rabbitmq.client.Channel;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.boot.starter.rabbitmq.core.BaseRabbiMqHandler;\nimport org.jeecg.boot.starter.rabbitmq.listenter.MqListener;\nimport org.jeecg.common.annotation.RabbitComponent;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.modules.test.rabbitmq.constant.CloudConstant;\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.amqp.support.AmqpHeaders;\nimport org.springframework.messaging.handler.annotation.Header;\n\n/**\n * 定义接收者（可以定义N个接受者，消息会均匀的发送到N个接收者中）\n *\n * RabbitMq接受者2\n * （@RabbitListener声明类上，一个类只能监听一个队列）\n * @author: zyf\n * @date: 2022/04/21\n */\n@Slf4j\n@RabbitListener(queues = CloudConstant.MQ_JEECG_PLACE_ORDER)\n@RabbitComponent(value = \"helloReceiver2\")\npublic class HelloReceiver2 extends BaseRabbiMqHandler<BaseMap> {\n\n    @RabbitHandler\n    public void onMessage(BaseMap baseMap, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) {\n        super.onMessage(baseMap, deliveryTag, channel, new MqListener<BaseMap>() {\n            @Override\n            public void handler(BaseMap map, Channel channel) {\n                //业务处理\n                String orderId = map.get(\"orderId\").toString();\n                log.info(\"【我是处理人2】 MQ Receiver2，orderId : \" + orderId);\n            }\n        });\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rabbitmq/src/main/java/org/jeecg/modules/test/rabbitmq/listener/HelloReceiver3.java",
    "content": "package org.jeecg.modules.test.rabbitmq.listener;//package org.jeecg.modules.cloud.rabbitmq;\n\nimport com.rabbitmq.client.Channel;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.boot.starter.rabbitmq.core.BaseRabbiMqHandler;\nimport org.jeecg.boot.starter.rabbitmq.listenter.MqListener;\nimport org.jeecg.common.annotation.RabbitComponent;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.modules.test.rabbitmq.constant.CloudConstant;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.amqp.support.AmqpHeaders;\nimport org.springframework.messaging.handler.annotation.Header;\n\n/**\n * 定义接收者（可以定义N个接受者，消息会均匀的发送到N个接收者中）\n *\n * RabbitMq接受者3【我是处理人3】\n * （@RabbitListener声明类方法上，一个类可以多监听多个队列）\n * @author: zyf\n * @date: 2022/04/21\n */\n@Slf4j\n@RabbitComponent(value = \"helloReceiver3\")\npublic class HelloReceiver3 extends BaseRabbiMqHandler<BaseMap> {\n\n    @RabbitListener(queues = CloudConstant.MQ_JEECG_PLACE_ORDER)\n    public void onMessage(BaseMap baseMap, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) {\n        super.onMessage(baseMap, deliveryTag, channel, new MqListener<BaseMap>() {\n            @Override\n            public void handler(BaseMap map, Channel channel) {\n                //业务处理\n                String orderId = map.get(\"orderId\").toString();\n                log.info(\"【我是处理人3】MQ Receiver3，orderId : \" + orderId);\n            }\n        });\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rabbitmq/src/main/java/org/jeecg/modules/test/rabbitmq/listener/HelloTimeReceiver.java",
    "content": "package org.jeecg.modules.test.rabbitmq.listener;\n\nimport org.jeecg.boot.starter.rabbitmq.core.BaseRabbiMqHandler;\nimport org.jeecg.boot.starter.rabbitmq.listenter.MqListener;\nimport org.jeecg.common.annotation.RabbitComponent;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.modules.test.rabbitmq.constant.CloudConstant;\nimport org.springframework.amqp.rabbit.annotation.RabbitHandler;\nimport org.springframework.amqp.rabbit.annotation.RabbitListener;\nimport org.springframework.amqp.support.AmqpHeaders;\nimport org.springframework.messaging.handler.annotation.Header;\n\nimport com.rabbitmq.client.Channel;\n\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * 定义接收者（可以定义N个接受者，消息会均匀的发送到N个接收者中）\n * @author: zyf\n * @date: 2022/04/21\n */\n@Slf4j\n@RabbitListener(queues = CloudConstant.MQ_JEECG_PLACE_ORDER_TIME)\n@RabbitComponent(value = \"helloTimeReceiver\")\npublic class HelloTimeReceiver extends BaseRabbiMqHandler<BaseMap> {\n\n    @RabbitHandler\n    public void onMessage(BaseMap baseMap, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) {\n        super.onMessage(baseMap, deliveryTag, channel, new MqListener<BaseMap>() {\n            @Override\n            public void handler(BaseMap map, Channel channel) {\n                //业务处理\n                String orderId = map.get(\"orderId\").toString();\n                log.info(\"Time Receiver1，orderId : \" + orderId);\n            }\n        });\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <artifactId>jeecg-cloud-test</artifactId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n    <description>消息队列测试模块</description>\n    <artifactId>jeecg-cloud-test-rocketmq</artifactId>\n\n    <dependencies>\n        <!-- rocketmq消息队列-->\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-boot-starter-rocketmq</artifactId>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/constant/CloudConstant.java",
    "content": "package org.jeecg.modules.test.rocketmq.constant;\n\n/**\n * 微服务单元测试常量定义\n * @author: zyf\n * @date: 2022/04/21\n */\npublic interface CloudConstant {\n\n\n    /**\n     * MQ测试队列名字\n     */\n    public final static String MQ_JEECG_PLACE_ORDER = \"jeecg_place_order\";\n    public final static String MQ_JEECG_PLACE_ORDER_TIME = \"jeecg_place_order_time\";\n\n    /**\n     * MQ测试消息总线\n     */\n    public final static String MQ_DEMO_BUS_EVENT = \"demoBusEvent\";\n\n    /**\n     * 分布式锁lock key\n     */\n    public final static String REDISSON_DEMO_LOCK_KEY1 = \"demoLockKey1\";\n    public final static String REDISSON_DEMO_LOCK_KEY2 = \"demoLockKey2\";\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/controller/JeecgMqTestController.java",
    "content": "package org.jeecg.modules.test.rocketmq.controller;\n\n\nimport cn.hutool.core.util.RandomUtil;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport org.jeecg.boot.starter.rabbitmq.client.RabbitMqClient;\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.modules.test.rocketmq.constant.CloudConstant;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport jakarta.servlet.http.HttpServletRequest;\n\n\n/**\n * RocketMqClient发送消息\n * @author: zyf\n * @date: 2022/04/21\n */\n@RestController\n@RequestMapping(\"/sys/test\")\n@Tag(name = \"【微服务】MQ单元测试\")\npublic class JeecgMqTestController {\n\n    @Autowired\n    private RabbitMqClient rabbitMqClient;\n\n\n    /**\n     * 测试方法：快速点击发送MQ消息\n     *  观察三个接受者如何分配处理消息：HelloReceiver1、HelloReceiver2、HelloReceiver3，会均衡分配\n     *\n     * @param req\n     * @return\n     */\n    @GetMapping(value = \"/rocketmq\")\n    @Operation(summary = \"测试rocketmq\")\n    public Result<?> rabbitMqClientTest(HttpServletRequest req) {\n        //rabbitmq消息队列测试\n        BaseMap map = new BaseMap();\n        map.put(\"orderId\", RandomUtil.randomNumbers(10));\n        rabbitMqClient.sendMessage(CloudConstant.MQ_JEECG_PLACE_ORDER, map);\n        rabbitMqClient.sendMessage(CloudConstant.MQ_JEECG_PLACE_ORDER_TIME, map,2);\n        return Result.OK(\"MQ发送消息成功\");\n    }\n\n    @GetMapping(value = \"/rocketmq2\")\n    @Operation(summary = \"rocketmq消息总线测试\")\n    public Result<?> rabbitmq2(HttpServletRequest req) {\n\n        //rabbitmq消息总线测试\n        BaseMap params = new BaseMap();\n        params.put(\"orderId\", \"123456\");\n        rabbitMqClient.publishEvent(CloudConstant.MQ_DEMO_BUS_EVENT, params);\n        return Result.OK(\"MQ发送消息成功\");\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/event/DemoBusEvent.java",
    "content": "package org.jeecg.modules.test.rocketmq.event;\n\nimport cn.hutool.core.util.ObjectUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.boot.starter.rabbitmq.event.EventObj;\nimport org.jeecg.boot.starter.rabbitmq.event.JeecgBusEventHandler;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.modules.test.rocketmq.constant.CloudConstant;\nimport org.springframework.stereotype.Component;\n\n/**\n * 消息处理器【发布订阅】\n * @author: zyf\n * @date: 2022/04/21\n */\n@Slf4j\n@Component(CloudConstant.MQ_DEMO_BUS_EVENT)\npublic class DemoBusEvent implements JeecgBusEventHandler {\n\n\n    @Override\n    public void onMessage(EventObj obj) {\n        if (ObjectUtil.isNotEmpty(obj)) {\n            BaseMap baseMap = obj.getBaseMap();\n            String orderId = baseMap.get(\"orderId\");\n            log.info(\"业务处理----订单ID:\" + orderId);\n        }\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloReceiver1.java",
    "content": "package org.jeecg.modules.test.rocketmq.listener;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.rocketmq.spring.annotation.RocketMQMessageListener;\nimport org.apache.rocketmq.spring.core.RocketMQListener;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.modules.test.rocketmq.constant.CloudConstant;\nimport org.springframework.stereotype.Component;\n\n/**\n * 定义接收者（可以定义N个接受者，消息会均匀的发送到N个接收者中）\n *\n * RabbitMq接受者1\n * （@RabbitListener声明类上，一个类只能监听一个队列）\n * @author: zyf\n * @date: 2022/04/21\n */\n@Slf4j\n@Component\n@RocketMQMessageListener(topic = CloudConstant.MQ_JEECG_PLACE_ORDER, consumerGroup = \"helloReceiver1\")\npublic class HelloReceiver1 implements RocketMQListener<BaseMap> {\n\n    public void onMessage(BaseMap baseMap) {\n        log.info(\"helloReceiver1接收消息：\" + baseMap);\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloReceiver2.java",
    "content": "package org.jeecg.modules.test.rocketmq.listener;//package org.jeecg.modules.cloud.rabbitmq;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.rocketmq.spring.annotation.RocketMQMessageListener;\nimport org.apache.rocketmq.spring.core.RocketMQListener;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.modules.test.rocketmq.constant.CloudConstant;\nimport org.springframework.stereotype.Component;\n\n/**\n * 定义接收者（可以定义N个接受者，消息会均匀的发送到N个接收者中）\n *\n * RabbitMq接受者2\n * （@RabbitListener声明类上，一个类只能监听一个队列）\n * @author: zyf\n * @date: 2022/04/21\n */\n@Slf4j\n@Component\n@RocketMQMessageListener(topic = CloudConstant.MQ_JEECG_PLACE_ORDER, consumerGroup = \"helloReceiver2\")\npublic class HelloReceiver2 implements RocketMQListener<BaseMap> {\n\n    public void onMessage(BaseMap baseMap) {\n        log.info(\"helloReceiver2接收消息：\" + baseMap);\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloReceiver3.java",
    "content": "package org.jeecg.modules.test.rocketmq.listener;//package org.jeecg.modules.cloud.rabbitmq;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.rocketmq.spring.annotation.RocketMQMessageListener;\nimport org.apache.rocketmq.spring.core.RocketMQListener;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.modules.test.rocketmq.constant.CloudConstant;\nimport org.springframework.stereotype.Component;\n\n/**\n * 定义接收者（可以定义N个接受者，消息会均匀的发送到N个接收者中）\n *\n * RabbitMq接受者3【我是处理人3】\n * （@RabbitListener声明类方法上，一个类可以多监听多个队列）\n * @author: zyf\n * @date: 2022/04/21\n */\n@Slf4j\n@Component\n@RocketMQMessageListener(topic = CloudConstant.MQ_JEECG_PLACE_ORDER, consumerGroup = \"helloReceiver3\")\npublic class HelloReceiver3 implements RocketMQListener<BaseMap> {\n\n    public void onMessage(BaseMap baseMap) {\n        log.info(\"helloReceiver3接收消息：\" + baseMap);\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rocketmq/src/main/java/org/jeecg/modules/test/rocketmq/listener/HelloTimeReceiver.java",
    "content": "package org.jeecg.modules.test.rocketmq.listener;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.rocketmq.spring.annotation.RocketMQMessageListener;\nimport org.apache.rocketmq.spring.core.RocketMQListener;\nimport org.jeecg.common.base.BaseMap;\nimport org.jeecg.modules.test.rocketmq.constant.CloudConstant;\nimport org.springframework.stereotype.Component;\n\n/**\n * 定义接收者（可以定义N个接受者，消息会均匀的发送到N个接收者中）\n * @author: zyf\n * @date: 2022/04/21\n */\n@Slf4j\n@Component\n@RocketMQMessageListener(topic = CloudConstant.MQ_JEECG_PLACE_ORDER_TIME, consumerGroup = \"helloTimeReceiver\")\npublic class HelloTimeReceiver implements RocketMQListener<BaseMap> {\n\n    public void onMessage(BaseMap baseMap) {\n        log.info(\"helloTimeReceiver接收消息：\" + baseMap);\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/db/seata.sql",
    "content": "-- -------------------------------- The script used when storeMode is 'db' --------------------------------\n-- the table to store GlobalSession data\nDROP TABLE IF EXISTS `global_table`;\nCREATE TABLE IF NOT EXISTS `global_table`\n(\n    `xid`                       VARCHAR(128) NOT NULL,\n    `transaction_id`            BIGINT,\n    `status`                    TINYINT      NOT NULL,\n    `application_id`            VARCHAR(32),\n    `transaction_service_group` VARCHAR(32),\n    `transaction_name`          VARCHAR(128),\n    `timeout`                   INT,\n    `begin_time`                BIGINT,\n    `application_data`          VARCHAR(2000),\n    `gmt_create`                DATETIME,\n    `gmt_modified`              DATETIME,\n    PRIMARY KEY (`xid`),\n    KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),\n    KEY `idx_transaction_id` (`transaction_id`)\n) ENGINE = InnoDB\n  DEFAULT CHARSET = utf8mb4;\n\n-- the table to store BranchSession data\nDROP TABLE IF EXISTS `branch_table`;\nCREATE TABLE IF NOT EXISTS `branch_table`\n(\n    `branch_id`         BIGINT       NOT NULL,\n    `xid`               VARCHAR(128) NOT NULL,\n    `transaction_id`    BIGINT,\n    `resource_group_id` VARCHAR(32),\n    `resource_id`       VARCHAR(256),\n    `branch_type`       VARCHAR(8),\n    `status`            TINYINT,\n    `client_id`         VARCHAR(64),\n    `application_data`  VARCHAR(2000),\n    `gmt_create`        DATETIME(6),\n    `gmt_modified`      DATETIME(6),\n    PRIMARY KEY (`branch_id`),\n    KEY `idx_xid` (`xid`)\n) ENGINE = InnoDB\n  DEFAULT CHARSET = utf8mb4;\n\n-- the table to store lock data\nDROP TABLE IF EXISTS `lock_table`;\nCREATE TABLE IF NOT EXISTS `lock_table`\n(\n    `row_key`        VARCHAR(128) NOT NULL,\n    `xid`            VARCHAR(128),\n    `transaction_id` BIGINT,\n    `branch_id`      BIGINT       NOT NULL,\n    `resource_id`    VARCHAR(256),\n    `table_name`     VARCHAR(32),\n    `pk`             VARCHAR(36),\n    `status`         TINYINT      NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',\n    `gmt_create`     DATETIME,\n    `gmt_modified`   DATETIME,\n    PRIMARY KEY (`row_key`),\n    KEY `idx_status` (`status`),\n    KEY `idx_branch_id` (`branch_id`),\n    KEY `idx_xid` (`xid`)\n) ENGINE = InnoDB\n  DEFAULT CHARSET = utf8mb4;\n\nDROP TABLE IF EXISTS `distributed_lock`;\nCREATE TABLE IF NOT EXISTS `distributed_lock`\n(\n    `lock_key`       CHAR(20) NOT NULL,\n    `lock_value`     VARCHAR(20) NOT NULL,\n    `expire`         BIGINT,\n    primary key (`lock_key`)\n) ENGINE = InnoDB\n  DEFAULT CHARSET = utf8mb4;\n\nINSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);\nINSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);\nINSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);\nINSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-cloud-test-seata</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n    <description>分布式事务测试模块</description>\n    <artifactId>jeecg-cloud-test-seata-account</artifactId>\n\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/src/main/java/org/jeecg/SeataAccountApplication.java",
    "content": "package org.jeecg;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n/**\n * 分布式事务-账户服务\n * @author zyf\n */\n@SpringBootApplication\npublic class SeataAccountApplication {\n\n    public static void main(String[] args) {\n        SpringApplication.run(SeataAccountApplication.class, args);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/src/main/java/org/jeecg/modules/test/seata/account/controller/SeataAccountController.java",
    "content": "package org.jeecg.modules.test.seata.account.controller;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.modules.test.seata.account.service.SeataAccountService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.math.BigDecimal;\n\n/**\n * @author zyf\n */\n@RestController\n@RequestMapping(\"/test/seata/account\")\npublic class SeataAccountController {\n\n    @Autowired\n    private SeataAccountService accountService;\n\n    @PostMapping(\"/reduceBalance\")\n    public void reduceBalance(Long userId, BigDecimal amount) {\n        accountService.reduceBalance(userId, amount);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/src/main/java/org/jeecg/modules/test/seata/account/entity/SeataAccount.java",
    "content": "package org.jeecg.modules.test.seata.account.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport lombok.Builder;\nimport lombok.Data;\n\nimport java.math.BigDecimal;\nimport java.util.Date;\n\n/**\n * @Description: 账户\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\n@Data\n@Builder\n@TableName(\"account\")\npublic class SeataAccount {\n    @TableId(type = IdType.AUTO)\n    private Long id;\n\n    /**\n     * 余额\n     */\n    private BigDecimal balance;\n\n    private Date lastUpdateTime;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/src/main/java/org/jeecg/modules/test/seata/account/mapper/SeataAccountMapper.java",
    "content": "package org.jeecg.modules.test.seata.account.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.jeecg.modules.test.seata.account.entity.SeataAccount;\n\n\n/**\n * @Description: TODO\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\n@Mapper\npublic interface SeataAccountMapper extends BaseMapper<SeataAccount> {\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/src/main/java/org/jeecg/modules/test/seata/account/service/SeataAccountService.java",
    "content": "package org.jeecg.modules.test.seata.account.service;\n\nimport java.math.BigDecimal;\n\n/**\n * @Description: 账户接口\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\npublic interface SeataAccountService {\n    /**\n     * 扣减金额\n     * @param userId 用户 ID\n     * @param amount  扣减金额\n     */\n    void reduceBalance(Long userId, BigDecimal amount);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/src/main/java/org/jeecg/modules/test/seata/account/service/impl/SeataAccountServiceImpl.java",
    "content": "package org.jeecg.modules.test.seata.account.service.impl;\n\n\nimport com.baomidou.dynamic.datasource.annotation.DS;\nimport io.seata.core.context.RootContext;\nimport lombok.extern.slf4j.Slf4j;\n\nimport org.jeecg.modules.test.seata.account.entity.SeataAccount;\nimport org.jeecg.modules.test.seata.account.mapper.SeataAccountMapper;\nimport org.jeecg.modules.test.seata.account.service.SeataAccountService;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Propagation;\nimport org.springframework.transaction.annotation.Transactional;\nimport org.springframework.util.Assert;\n\nimport jakarta.annotation.Resource;\nimport java.math.BigDecimal;\n\n/**\n * @Description: TODO\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\n@Slf4j\n@Service\npublic class SeataAccountServiceImpl implements SeataAccountService {\n    @Resource\n    private SeataAccountMapper accountMapper;\n\n    /**\n     * 事务传播特性设置为 REQUIRES_NEW 开启新的事务\n     */\n    @DS(\"account\")\n    @Override\n    @Transactional(propagation = Propagation.REQUIRES_NEW,rollbackFor = Exception.class)\n    public void reduceBalance(Long userId, BigDecimal amount) {\n        log.info(\"xid:\"+ RootContext.getXID());\n        log.info(\"=============ACCOUNT START=================\");\n        SeataAccount account = accountMapper.selectById(userId);\n        Assert.notNull(account, \"用户不存在\");\n        BigDecimal balance = account.getBalance();\n        log.info(\"下单用户{}余额为 {},商品总价为{}\", userId, balance, amount);\n\n        if (balance.compareTo(amount)==-1) {\n            log.warn(\"用户 {} 余额不足，当前余额:{}\", userId, balance);\n            throw new RuntimeException(\"余额不足\");\n        }\n        log.info(\"开始扣减用户 {} 余额\", userId);\n        BigDecimal currentBalance = account.getBalance().subtract(amount);\n        account.setBalance(currentBalance);\n        accountMapper.updateById(account);\n        log.info(\"扣减用户 {} 余额成功,扣减后用户账户余额为{}\", userId, currentBalance);\n        log.info(\"=============ACCOUNT END=================\");\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/src/main/resources/application.yml",
    "content": "server:\n  port: 5002\nspring:\n  data:\n    redis:\n      ##redis 单机环境配置\n      host: localhost\n      port: 6379\n      database: 0\n      password:\n      ssl:\n        enabled: false\n  application:\n    name: seata-account\n  cloud:\n    nacos:\n      config:\n        import-check:\n          enabled: false\n  main:\n    allow-bean-definition-overriding: true\n  autoconfigure:\n    exclude: com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration\n  datasource:\n    url: jdbc:mysql://127.0.0.1:3306/jeecg_account?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true\n    username: root\n    password: root\n    driver-class-name: com.mysql.cj.jdbc.Driver\n  sql:\n    init:\n      schema-locations: classpath:sql/schema-account.sql\nseata:\n  enable-auto-data-source-proxy: false\n  service:\n    grouplist:\n      default: 127.0.0.1:8091\n    vgroup-mapping:\n      springboot-seata-group: default\n  # seata 事务组编号 用于TC集群名\n  tx-service-group: springboot-seata-group\n  \n# 无用配置，为了避免扫码全代码导致启动慢\nminidao:\n  base-package: org.jeecg.modules.jmreport.*"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-account/src/main/resources/sql/schema-account.sql",
    "content": "SET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- Table structure for account\n-- ----------------------------\nDROP TABLE IF EXISTS `account`;\nCREATE TABLE `account`  (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `balance` decimal(10, 2) NULL DEFAULT NULL,\n  `last_update_time` timestamp NULL DEFAULT current_timestamp() ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of account\n-- ----------------------------\nINSERT INTO `account` VALUES (1, 50.00, '2022-03-16 17:02:53');\n\n-- ----------------------------\n-- Table structure for undo_log\n-- ----------------------------\nDROP TABLE IF EXISTS `undo_log`;\nCREATE TABLE `undo_log`  (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `branch_id` bigint(20) NOT NULL,\n  `xid` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `context` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `rollback_info` longblob NOT NULL,\n  `log_status` int(11) NOT NULL,\n  `log_created` datetime(0) NOT NULL,\n  `log_modified` datetime(0) NOT NULL,\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;\n\nSET FOREIGN_KEY_CHECKS = 1;\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-cloud-test-seata</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n    <description>分布式事务测试模块</description>\n    <artifactId>jeecg-cloud-test-seata-order</artifactId>\n\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/SeataOrderApplication.java",
    "content": "package org.jeecg;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.openfeign.EnableFeignClients;\n\n/**\n * @author zyf\n */\n@SpringBootApplication\n@EnableFeignClients\npublic class SeataOrderApplication {\n\n    public static void main(String[] args) {\n        SpringApplication.run(SeataOrderApplication.class, args);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/modules/test/seata/order/controller/SeataOrderController.java",
    "content": "package org.jeecg.modules.test.seata.order.controller;\n\n/**\n * @Description: TODO\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\n\nimport org.jeecg.modules.test.seata.order.dto.PlaceOrderRequest;\nimport org.jeecg.modules.test.seata.order.service.SeataOrderService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.validation.annotation.Validated;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\n@RequestMapping(\"/test/seata/order\")\n@Tag(name = \"seata测试\")\npublic class SeataOrderController {\n\n    @Autowired\n    private SeataOrderService orderService;\n\n    /**\n     * 自由下单\n     */\n    @PostMapping(\"/placeOrder\")\n    @Operation(summary = \"自由下单\")\n    public String placeOrder(@Validated @RequestBody PlaceOrderRequest request) {\n        orderService.placeOrder(request);\n        return \"下单成功\";\n    }\n\n    /**\n     * 测试商品库存不足-异常回滚\n     */\n    @PostMapping(\"/test1\")\n    @Operation(summary = \"测试商品库存不足\")\n    public String test1() {\n        //商品单价10元，库存20个,用户余额50元，模拟一次性购买22个。 期望异常回滚\n        orderService.placeOrder(new PlaceOrderRequest(1L, 1L, 22));\n        return \"下单成功\";\n    }\n\n    /**\n     * 测试用户账户余额不足-异常回滚\n     */\n    @PostMapping(\"/test2\")\n    @Operation(summary = \"测试用户账户余额不足\")\n    public String test2() {\n        //商品单价10元，库存20个，用户余额50元，模拟一次性购买6个。 期望异常回滚\n        orderService.placeOrder(new PlaceOrderRequest(1L, 1L, 6));\n        return \"下单成功\";\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/modules/test/seata/order/dto/PlaceOrderRequest.java",
    "content": "package org.jeecg.modules.test.seata.order.dto;\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport jakarta.validation.constraints.NotNull;\n/**\n * @Description: 订单请求对象\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\n@Data\n@Builder\n@AllArgsConstructor\n@NoArgsConstructor\npublic class PlaceOrderRequest {\n\n    @NotNull\n    private Long userId;\n\n    @NotNull\n    private Long productId;\n\n    @NotNull\n    private Integer count;\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/modules/test/seata/order/dto/ReduceBalanceRequest.java",
    "content": "package org.jeecg.modules.test.seata.order.dto;\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n/**\n * @Description: 余额请求对象\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\n@Data\n@Builder\n@AllArgsConstructor\n@NoArgsConstructor\npublic class ReduceBalanceRequest {\n\n    private Long userId;\n    private Integer price;\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/modules/test/seata/order/dto/ReduceStockRequest.java",
    "content": "package org.jeecg.modules.test.seata.order.dto;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n/**\n * @Description: 库存请求对象\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\n@Data\n@Builder\n@AllArgsConstructor\n@NoArgsConstructor\npublic class ReduceStockRequest {\n\n    private Long productId;\n    private Integer amount;\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/modules/test/seata/order/entity/SeataOrder.java",
    "content": "package org.jeecg.modules.test.seata.order.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport lombok.Builder;\nimport lombok.Data;\nimport org.jeecg.modules.test.seata.order.enums.OrderStatus;\n\nimport java.math.BigDecimal;\n\n/**\n * @Description: 订单\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\n@Builder\n@Data\n@TableName(\"p_order\")\npublic class SeataOrder {\n\n    @TableId(type = IdType.AUTO)\n    private Integer id;\n\n    /**\n     * 用户ID\n     */\n    private Long userId;\n    /**\n     * 商品ID\n     */\n    private Long productId;\n    /**\n     * 订单状态\n     */\n    private OrderStatus status;\n    /**\n     * 数量\n     */\n    private Integer count;\n    /**\n     * 总金额\n     */\n    private BigDecimal totalPrice;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/modules/test/seata/order/enums/OrderStatus.java",
    "content": "package org.jeecg.modules.test.seata.order.enums;\n\n/**\n * @Description: 订单状态\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\npublic enum OrderStatus {\n    /**\n     * INIT\n     */\n    INIT,\n    /**\n     * SUCCESS\n     */\n    SUCCESS,\n    /**\n     * FAIL\n     */\n    FAIL\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/modules/test/seata/order/feign/AccountClient.java",
    "content": "package org.jeecg.modules.test.seata.order.feign;\n\nimport org.springframework.cloud.openfeign.FeignClient;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\n\nimport java.math.BigDecimal;\n\n/**\n * @author zyf\n */\n@FeignClient(value =\"seata-account\")\npublic interface AccountClient {\n\n    /**\n     *  扣减余额\n     * @param userId\n     * @param amount\n     * @return\n     */\n    @PostMapping(\"/test/seata/account/reduceBalance\")\n    String reduceBalance(@RequestParam(\"userId\") Long userId, @RequestParam(\"amount\") BigDecimal amount);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/modules/test/seata/order/feign/ProductClient.java",
    "content": "package org.jeecg.modules.test.seata.order.feign;\n\nimport org.springframework.cloud.openfeign.FeignClient;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\n\nimport java.math.BigDecimal;\n\n/**\n * 分布式事务产品feign客户端\n * @author: zyf\n * @date: 2022/04/21\n */\n@FeignClient(value =\"seata-product\")\npublic interface ProductClient {\n    /**\n     * 扣减库存\n     *\n     * @param productId\n     * @param count\n     * @return\n     */\n    @PostMapping(\"/test/seata/product/reduceStock\")\n    BigDecimal reduceStock(@RequestParam(\"productId\") Long productId, @RequestParam(\"count\") Integer count);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/modules/test/seata/order/mapper/SeataOrderMapper.java",
    "content": "package org.jeecg.modules.test.seata.order.mapper;\n\n/**\n * @Description: TODO\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.jeecg.modules.test.seata.order.entity.SeataOrder;\n\n@Mapper\npublic interface SeataOrderMapper extends BaseMapper<SeataOrder> {\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/modules/test/seata/order/service/SeataOrderService.java",
    "content": "package org.jeecg.modules.test.seata.order.service;\n\n\nimport org.jeecg.modules.test.seata.order.dto.PlaceOrderRequest;\n\n/**\n * @Description: 订单接口\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\npublic interface SeataOrderService {\n    /**\n     * 下单\n     *\n     * @param placeOrderRequest 订单请求参数\n     */\n    void placeOrder(PlaceOrderRequest placeOrderRequest);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/java/org/jeecg/modules/test/seata/order/service/impl/SeataOrderServiceImpl.java",
    "content": "package org.jeecg.modules.test.seata.order.service.impl;\nimport com.alibaba.fastjson.JSONObject;\nimport com.baomidou.dynamic.datasource.annotation.DS;\n\nimport io.seata.core.context.RootContext;\nimport io.seata.spring.annotation.GlobalTransactional;\nimport lombok.extern.slf4j.Slf4j;\nimport org.jeecg.modules.test.seata.order.dto.PlaceOrderRequest;\nimport org.jeecg.modules.test.seata.order.entity.SeataOrder;\nimport org.jeecg.modules.test.seata.order.enums.OrderStatus;\nimport org.jeecg.modules.test.seata.order.feign.AccountClient;\nimport org.jeecg.modules.test.seata.order.feign.ProductClient;\nimport org.jeecg.modules.test.seata.order.mapper.SeataOrderMapper;\nimport org.jeecg.modules.test.seata.order.service.SeataOrderService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport jakarta.annotation.Resource;\nimport java.math.BigDecimal;\n\n/**\n * @Description: 订单服务类\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\n@Slf4j\n@Service\npublic class SeataOrderServiceImpl implements SeataOrderService {\n\n    @Resource\n    private SeataOrderMapper orderMapper;\n    @Resource\n    private AccountClient accountClient;\n    @Resource\n    private ProductClient productClient;\n\n    @DS(\"order\")\n    @Override\n    @Transactional(rollbackFor = Exception.class)\n    @GlobalTransactional\n    public void placeOrder(PlaceOrderRequest request) {\n        log.info(\"xid:\"+RootContext.getXID());\n        log.info(\"=============ORDER START=================\");\n        Long userId = request.getUserId();\n        Long productId = request.getProductId();\n        Integer count = request.getCount();\n        log.info(\"收到下单请求,用户:{}, 商品:{},数量:{}\", userId, productId, count);\n\n\n        SeataOrder order = SeataOrder.builder()\n                .userId(userId)\n                .productId(productId)\n                .status(OrderStatus.INIT)\n                .count(count)\n                .build();\n\n        orderMapper.insert(order);\n        log.info(\"订单一阶段生成，等待扣库存付款中\");\n        // 扣减库存并计算总价\n        BigDecimal amount = productClient.reduceStock(productId, count);\n        // 扣减余额\n        String str = accountClient.reduceBalance(userId, amount);\n        // feign响应被二次封装，判断使主事务回滚\n        JSONObject jsonObject = JSONObject.parseObject(str);\n        if (jsonObject.getInteger(\"code\") != 200) {\n            throw new RuntimeException();\n        }\n\n        order.setStatus(OrderStatus.SUCCESS);\n        order.setTotalPrice(amount);\n        orderMapper.updateById(order);\n        log.info(\"订单已成功下单\");\n        log.info(\"=============ORDER END=================\");\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/resources/application.yml",
    "content": "server:\n  port: 5001\nspring:\n  data:\n    redis:\n      ##redis 单机环境配置\n      host: localhost\n      port: 6379\n      database: 0\n      password:\n      ssl:\n        enabled: false\n  application:\n    name: seata-order\n  cloud:\n    nacos:\n      config:\n        import-check:\n          enabled: false\n  main:\n    allow-bean-definition-overriding: true\n  autoconfigure:\n    exclude: com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration\n  datasource:\n    driver-class-name: com.mysql.cj.jdbc.Driver\n    url: jdbc:mysql://127.0.0.1:3306/jeecg_order?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false\n    username: root\n    password: root\n  sql:\n    init:\n      schema-locations: classpath:sql/schema-order.sql\nseata:\n  enable-auto-data-source-proxy: false\n  service:\n    grouplist:\n      default: 127.0.0.1:8091\n    vgroup-mapping:\n      springboot-seata-group: default\n  # seata 事务组编号 用于TC集群名\n  tx-service-group: springboot-seata-group\n\n# 无用配置，为了避免扫码全代码导致启动慢\nminidao:\n  base-package: org.jeecg.modules.jmreport.*"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-order/src/main/resources/sql/schema-order.sql",
    "content": "SET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- Table structure for p_order\n-- ----------------------------\nDROP TABLE IF EXISTS `p_order`;\nCREATE TABLE `p_order`  (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `user_id` int(11) NULL DEFAULT NULL,\n  `product_id` int(11) NULL DEFAULT NULL,\n  `count` int(11) NULL DEFAULT NULL,\n  `total_price` decimal(10, 2) NULL DEFAULT NULL,\n  `status` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n  `add_time` timestamp NULL DEFAULT current_timestamp(),\n  `last_update_time` timestamp NULL DEFAULT current_timestamp() ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Table structure for undo_log\n-- ----------------------------\nDROP TABLE IF EXISTS `undo_log`;\nCREATE TABLE `undo_log`  (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `branch_id` bigint(20) NOT NULL,\n  `xid` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `context` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `rollback_info` longblob NOT NULL,\n  `log_status` int(11) NOT NULL,\n  `log_created` datetime(0) NOT NULL,\n  `log_modified` datetime(0) NOT NULL,\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;\n\nSET FOREIGN_KEY_CHECKS = 1;\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-cloud-test-seata</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n    <description>分布式事务测试模块</description>\n    <artifactId>jeecg-cloud-test-seata-product</artifactId>\n\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/java/org/jeecg/SeataProductApplication.java",
    "content": "package org.jeecg;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n/**\n * @author zyf\n */\n@SpringBootApplication\npublic class SeataProductApplication {\n\n    public static void main(String[] args) {\n        SpringApplication.run(SeataProductApplication.class, args);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/java/org/jeecg/modules/test/seata/product/controller/SeataProductController.java",
    "content": "package org.jeecg.modules.test.seata.product.controller;\n\nimport org.jeecg.modules.test.seata.product.service.SeataProductService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.math.BigDecimal;\n\n/**\n * @author zyf\n */\n@RestController\n@RequestMapping(\"/test/seata/product\")\npublic class SeataProductController {\n\n    @Autowired\n    private SeataProductService seataProductService;\n\n    @PostMapping(\"/reduceStock\")\n    public BigDecimal reduceStock(Long productId, Integer count, HttpServletRequest request) {\n        return seataProductService.reduceStock(productId, count);\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/java/org/jeecg/modules/test/seata/product/entity/SeataProduct.java",
    "content": "package org.jeecg.modules.test.seata.product.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport lombok.Builder;\nimport lombok.Data;\n\nimport java.math.BigDecimal;\nimport java.util.Date;\n/**\n * @Description: 产品\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\n@Data\n@Builder\n@TableName(\"product\")\npublic class SeataProduct {\n\n    @TableId(type = IdType.AUTO)\n    private Integer id;\n    /**\n     * 价格\n     */\n    private BigDecimal price;\n    /**\n     * 库存\n     */\n    private Integer stock;\n\n    private Date lastUpdateTime;\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/java/org/jeecg/modules/test/seata/product/mapper/SeataProductMapper.java",
    "content": "package org.jeecg.modules.test.seata.product.mapper;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.jeecg.modules.test.seata.product.entity.SeataProduct;\n\n\n/**\n * @Description: TODO\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\n@Mapper\npublic interface SeataProductMapper extends BaseMapper<SeataProduct> {\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/java/org/jeecg/modules/test/seata/product/service/SeataProductService.java",
    "content": "package org.jeecg.modules.test.seata.product.service;\n\nimport java.math.BigDecimal;\n\n/**\n * @Description: 产品接口\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\npublic interface SeataProductService {\n    /**\n     * 扣减库存\n     *\n     * @param productId 商品 ID\n     * @param count    扣减数量\n     * @return 商品总价\n     */\n    BigDecimal reduceStock(Long productId, Integer count);\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/java/org/jeecg/modules/test/seata/product/service/impl/SeataProductServiceImpl.java",
    "content": "package org.jeecg.modules.test.seata.product.service.impl;\n\nimport com.baomidou.dynamic.datasource.annotation.DS;\nimport io.seata.core.context.RootContext;\nimport lombok.extern.slf4j.Slf4j;\n\n\nimport org.jeecg.modules.test.seata.product.entity.SeataProduct;\nimport org.jeecg.modules.test.seata.product.mapper.SeataProductMapper;\nimport org.jeecg.modules.test.seata.product.service.SeataProductService;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Propagation;\nimport org.springframework.transaction.annotation.Transactional;\nimport org.springframework.util.Assert;\n\nimport jakarta.annotation.Resource;\nimport java.math.BigDecimal;\n\n/**\n * @Description: 产品服务类\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\n@Slf4j\n@Service\npublic class SeataProductServiceImpl implements SeataProductService {\n\n    @Resource\n    private SeataProductMapper productMapper;\n\n    /**\n     * 事务传播特性设置为 REQUIRES_NEW 开启新的事务\n     */\n    @DS(\"product\")\n    @Transactional(propagation = Propagation.REQUIRES_NEW,rollbackFor = Exception.class)\n    @Override\n    public BigDecimal reduceStock(Long productId, Integer count) {\n        log.info(\"xid:\"+ RootContext.getXID());\n        log.info(\"=============PRODUCT START=================\");\n        // 检查库存\n        SeataProduct product = productMapper.selectById(productId);\n        Assert.notNull(product, \"商品不存在\");\n        Integer stock = product.getStock();\n        log.info(\"商品编号为 {} 的库存为{},订单商品数量为{}\", productId, stock, count);\n\n        if (stock < count) {\n            log.warn(\"商品编号为{} 库存不足，当前库存:{}\", productId, stock);\n            throw new RuntimeException(\"库存不足\");\n        }\n        log.info(\"开始扣减商品编号为 {} 库存,单价商品价格为{}\", productId, product.getPrice());\n        // 扣减库存\n        int currentStock = stock - count;\n        product.setStock(currentStock);\n        productMapper.updateById(product);\n        BigDecimal totalPrice = product.getPrice().multiply(new BigDecimal(count));\n        log.info(\"扣减商品编号为 {} 库存成功,扣减后库存为{}, {} 件商品总价为 {} \", productId, currentStock, count, totalPrice);\n        log.info(\"=============PRODUCT END=================\");\n        return totalPrice;\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/resources/application.yml",
    "content": "server:\n  port: 5003\nspring:\n  application:\n    name: seata-product\n  cloud:\n    nacos:\n      config:\n        import-check:\n          enabled: false\n  main:\n    allow-bean-definition-overriding: true\n  autoconfigure:\n    exclude: com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration\n  datasource:\n    driver-class-name: com.mysql.cj.jdbc.Driver\n    url: jdbc:mysql://127.0.0.1:3306/jeecg_product?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false\n    username: root\n    password: root\n  sql:\n    init:\n      schema-locations: classpath:sql/schema-product.sql\nseata:\n  enable-auto-data-source-proxy: false\n  service:\n    grouplist:\n      default: 127.0.0.1:8091\n    vgroup-mapping:\n      springboot-seata-group: default\n  # seata 事务组编号 用于TC集群名\n  tx-service-group: springboot-seata-group\n  \n# 无用配置，为了避免扫码全代码导致启动慢\nminidao:\n  base-package: org.jeecg.modules.jmreport.*"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/jeecg-cloud-test-seata-product/src/main/resources/sql/schema-product.sql",
    "content": "SET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- Table structure for product\n-- ----------------------------\nDROP TABLE IF EXISTS `product`;\nCREATE TABLE `product`  (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `price` decimal(10, 2) NULL DEFAULT NULL,\n  `stock` int(11) NULL DEFAULT NULL,\n  `last_update_time` timestamp NULL DEFAULT current_timestamp() ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of product\n-- ----------------------------\nINSERT INTO `product` VALUES (1, 10.00, 20, '2022-01-13 09:52:50');\n\n-- ----------------------------\n-- Table structure for undo_log\n-- ----------------------------\nDROP TABLE IF EXISTS `undo_log`;\nCREATE TABLE `undo_log`  (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `branch_id` bigint(20) NOT NULL,\n  `xid` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `context` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n  `rollback_info` longblob NOT NULL,\n  `log_status` int(11) NOT NULL,\n  `log_created` datetime(0) NOT NULL,\n  `log_modified` datetime(0) NOT NULL,\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;\n\nSET FOREIGN_KEY_CHECKS = 1;\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-seata/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-cloud-test</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n    <artifactId>jeecg-cloud-test-seata</artifactId>\n    <packaging>pom</packaging>\n    <modules>\n        <module>jeecg-cloud-test-seata-account</module>\n        <module>jeecg-cloud-test-seata-product</module>\n        <module>jeecg-cloud-test-seata-order</module>\n    </modules>\n    <dependencies>\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-boot-starter-cloud</artifactId>\n            <version>${jeecgboot.version}</version>\n        </dependency>\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-boot-starter-seata</artifactId>\n            <version>${jeecgboot.version}</version>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/README-ShardingSphere配置说明.md",
    "content": "# JeecgBoot ShardingSphere配置使用说明\n\n## 项目中的ShardingSphere配置\n\n本项目使用ShardingSphere实现分库分表功能，主要涉及以下配置文件和组件：\n\n## 1. 配置文件说明\n\n### sharding.yaml - 基础分表配置\n```yaml\ndatabaseName: sharding-db  # 重要：必须与@DS注解中的名称一致\n\ndataSources:\n  ds0:\n    dataSourceClassName: com.zaxxer.hikari.HikariDataSource\n    driverClassName: com.mysql.cj.jdbc.Driver\n    jdbcUrl: jdbc:mysql://localhost:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8\n    username: root\n    password: root\n\nrules:\n  - !SHARDING\n    tables:\n      sys_log:  # 分表的逻辑表名\n        actualDataNodes: ds0.sys_log$->{0..1}  # 实际表：sys_log0, sys_log1\n        tableStrategy:\n          standard:\n            shardingColumn: log_type  # 分片字段\n            shardingAlgorithmName: table_inline\n    \n    shardingAlgorithms:\n      table_inline:\n        type: INLINE\n        props:\n          algorithm-expression: sys_log$->{log_type % 2}  # 根据log_type取模分表\n```\n\n### sharding-multi.yaml - 分库分表+读写分离配置\n```yaml\ndatabaseName: sharding-db  # 与@DS注解保持一致\n\ndataSources:\n  ds0:  # 主库\n    jdbcUrl: jdbc:mysql://localhost:3306/jeecg-boot?...\n  ds1:  # 从库\n    jdbcUrl: jdbc:mysql://localhost:3306/jeecg-boot2?...\n\nrules:\n  - !SHARDING\n    tables:\n      sys_log:\n        actualDataNodes: ds$->{0..1}.sys_log$->{0..1}  # 2库2表\n        databaseStrategy:  # 分库策略\n          standard:\n            shardingColumn: operate_type\n            shardingAlgorithmName: database-inline\n        tableStrategy:  # 分表策略\n          standard:\n            shardingColumn: log_type\n            shardingAlgorithmName: table-classbased\n\n  - !READWRITE_SPLITTING  # 读写分离\n    dataSources:\n      prds:\n        writeDataSourceName: ds0  # 写库\n        readDataSourceNames: [ds1]  # 读库\n```\n\n## 2. Spring Boot配置\n\n### application-dev.yml中的数据源配置\n\n```yaml\nspring:\n  datasource:\n    dynamic:\n      datasource:\n        # 普通数据源\n        master:\n          url: jdbc:mysql://localhost:3306/jeecg-boot\n          username: root\n          password: root\n        \n        # ShardingSphere分片数据源\n        sharding-db:  # 数据源名称，对应@DS(\"sharding-db\")\n          driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver\n          # 本地配置文件方式\n          url: jdbc:shardingsphere:classpath:sharding.yaml\n          # 或者Nacos配置方式\n          url: jdbc:shardingsphere:nacos:sharding.yaml?serverAddr=${spring.cloud.nacos.config.server-addr}&namespace=${spring.cloud.nacos.config.namespace}&group=${spring.cloud.nacos.config.group}\n```\n\n**关键点：**\n- `sharding-db` 是数据源的名称标识\n- 这个名称必须与Service类上的`@DS(\"sharding-db\")`注解保持一致\n\n## 3. Service层使用\n\n### ShardingSysLogServiceImpl类配置\n\n```java\n@Service\n@DS(\"sharding-db\")  // 指定使用sharding-db数据源\npublic class ShardingSysLogServiceImpl extends ServiceImpl<ShardingSysLogMapper, ShardingSysLog> \n    implements IShardingSysLogService {\n}\n```\n\n**配置关系说明：**\n1. `@DS(\"sharding-db\")` 注解告诉MyBatis-Plus使用名为`sharding-db`的数据源\n2. `sharding-db`对应application-dev.yml中配置的数据源名称\n3. 该数据源使用ShardingSphere驱动，会根据sharding.yaml中的规则进行分片\n\n## 4. 使用步骤\n\n### 步骤1：准备数据库表\n```sql\n-- 在jeecg-boot数据库中创建分表\nCREATE TABLE sys_log0 LIKE sys_log;\nCREATE TABLE sys_log1 LIKE sys_log;\n```\n\n### 步骤2：配置application-dev.yml\n```yaml\nspring:\n  datasource:\n    dynamic:\n      datasource:\n        sharding-db:\n          driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver\n          url: jdbc:shardingsphere:classpath:sharding.yaml\n```\n\n### 步骤3：配置sharding.yaml\n- 将配置文件放在`src/main/resources/`目录下\n- 确保`databaseName: sharding-db`与数据源名称一致\n\n### 步骤4：在Service上添加注解\n```java\n@DS(\"sharding-db\")  // 使用分片数据源\npublic class ShardingSysLogServiceImpl {\n    // 业务代码\n}\n```\n\n### 步骤5：正常使用MyBatis-Plus\n```java\n// 插入数据时会自动根据log_type字段进行分表\nshardingSysLogService.save(sysLog);\n\n// 查询时也会根据分片规则路由到正确的表\nshardingSysLogService.list();\n```\n\n## 5. 配置验证\n\n启动项目后查看日志，如果看到类似输出说明配置成功：\n```\nLogic SQL: INSERT INTO sys_log (log_type, content) VALUES (?, ?)\nActual SQL: ds0 ::: INSERT INTO sys_log0 (log_type, content) VALUES (?, ?)\n```\n\n## 6. 注意事项\n\n1. **名称一致性**：确保以下三处名称完全一致\n   - application-dev.yml中的数据源名称：`sharding-db`\n   - sharding.yaml中的databaseName：`sharding-db`\n   - Service类注解：`@DS(\"sharding-db\")`\n\n2. **表结构一致**：所有分片表的结构必须完全一致\n\n3. **分片键选择**：选择分布均匀的字段作为分片键，避免数据倾斜\n\n4. **事务支持**：单表事务正常，跨表事务需要注意\n\n这样配置后，通过ShardingSysLogServiceImpl操作的数据会自动根据分片规则分布到不同的表中。\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/doc/db.sql",
    "content": "CREATE TABLE `sys_log0` (\n  `id` varchar(32) NOT NULL,\n  `log_type` int(2) DEFAULT NULL COMMENT '日志类型（1登录日志，2操作日志）',\n  `log_content` varchar(1000) DEFAULT NULL COMMENT '日志内容',\n  `operate_type` int(2) DEFAULT NULL COMMENT '操作类型',\n  `userid` varchar(32) DEFAULT NULL COMMENT '操作用户账号',\n  `username` varchar(100) DEFAULT NULL COMMENT '操作用户名称',\n  `ip` varchar(100) DEFAULT NULL COMMENT 'IP',\n  `method` varchar(500) DEFAULT NULL COMMENT '请求java方法',\n  `request_url` varchar(255) DEFAULT NULL COMMENT '请求路径',\n  `request_param` longtext DEFAULT NULL COMMENT '请求参数',\n  `request_type` varchar(10) DEFAULT NULL COMMENT '请求类型',\n  `cost_time` bigint(20) DEFAULT NULL COMMENT '耗时',\n  `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime DEFAULT NULL COMMENT '更新时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  KEY `index_table_userid` (`userid`) USING BTREE,\n  KEY `index_logt_ype` (`log_type`) USING BTREE,\n  KEY `index_operate_type` (`operate_type`) USING BTREE,\n  KEY `index_createtime` (`create_time`) USING BTREE\n) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='系统日志表';\n\nCREATE TABLE `sys_log1` (\n  `id` varchar(32) NOT NULL,\n  `log_type` int(2) DEFAULT NULL COMMENT '日志类型（1登录日志，2操作日志）',\n  `log_content` varchar(1000) DEFAULT NULL COMMENT '日志内容',\n  `operate_type` int(2) DEFAULT NULL COMMENT '操作类型',\n  `userid` varchar(32) DEFAULT NULL COMMENT '操作用户账号',\n  `username` varchar(100) DEFAULT NULL COMMENT '操作用户名称',\n  `ip` varchar(100) DEFAULT NULL COMMENT 'IP',\n  `method` varchar(500) DEFAULT NULL COMMENT '请求java方法',\n  `request_url` varchar(255) DEFAULT NULL COMMENT '请求路径',\n  `request_param` longtext DEFAULT NULL COMMENT '请求参数',\n  `request_type` varchar(10) DEFAULT NULL COMMENT '请求类型',\n  `cost_time` bigint(20) DEFAULT NULL COMMENT '耗时',\n  `create_by` varchar(32) DEFAULT NULL COMMENT '创建人',\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\n  `update_by` varchar(32) DEFAULT NULL COMMENT '更新人',\n  `update_time` datetime DEFAULT NULL COMMENT '更新时间',\n  PRIMARY KEY (`id`) USING BTREE,\n  KEY `index_table_userid` (`userid`) USING BTREE,\n  KEY `index_logt_ype` (`log_type`) USING BTREE,\n  KEY `index_operate_type` (`operate_type`) USING BTREE,\n  KEY `index_createtime` (`create_time`) USING BTREE\n) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='系统日志表';\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-cloud-test</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>jeecg-cloud-test-shardingsphere</artifactId>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-boot-starter-shardingsphere</artifactId>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/src/main/java/org/jeecg/modules/test/sharding/algorithm/StandardModTableShardAlgorithm.java",
    "content": "package org.jeecg.modules.test.sharding.algorithm;\n\n\nimport org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;\nimport org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;\nimport org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;\n\nimport java.util.Collection;\nimport java.util.Properties;\n\n/**\n * 用于处理使用单一键\n * 根据分片字段的值和sharding-count进行取模运算\n * SQL 语句中有>，>=, <=，<，=，IN 和 BETWEEN AND 操作符，都可以应用此分片策略。\n *\n * @author zyf\n */\npublic class StandardModTableShardAlgorithm implements StandardShardingAlgorithm<Integer> {\n    private Properties props = new Properties();\n\n\n    /**\n     * 用于处理=和IN的分片\n     *\n     * @param collection           目标分片的集合(表名)\n     * @param preciseShardingValue 逻辑表相关信息\n     * @return\n     */\n    @Override\n    public String doSharding(Collection<String> collection, PreciseShardingValue<Integer> preciseShardingValue) {\n\n        for (String name : collection) {\n            Integer value = preciseShardingValue.getValue();\n            //根据值进行取模，得到一个目标值\n            if (name.indexOf(value % 2+\"\") > -1) {\n                return name;\n            }\n        }\n        throw new UnsupportedOperationException();\n    }\n\n    /**\n     * 用于处理BETWEEN AND分片，如果不配置RangeShardingAlgorithm，SQL中的BETWEEN AND将按照全库路由处理\n     *\n     * @param collection\n     * @param rangeShardingValue\n     * @return\n     */\n    @Override\n    public Collection<String> doSharding(Collection<String> collection, RangeShardingValue<Integer> rangeShardingValue) {\n\n        return collection;\n    }\n\n    /**\n     * 对应分片算法（sharding-algorithms）的类型\n     *\n     * @return\n     */\n    @Override\n    public String getType() {\n        return \"STANDARD_MOD\";\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/src/main/java/org/jeecg/modules/test/sharding/controller/JeecgShardingDemoController.java",
    "content": "package org.jeecg.modules.test.sharding.controller;\n\nimport org.jeecg.common.api.vo.Result;\nimport org.jeecg.common.aspect.annotation.AutoLog;\nimport org.jeecg.common.system.base.controller.JeecgController;\nimport org.jeecg.modules.test.sharding.entity.ShardingSysLog;\nimport org.jeecg.modules.test.sharding.service.IShardingSysLogService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport io.swagger.v3.oas.annotations.Operation;\nimport lombok.extern.slf4j.Slf4j;\n\n/**\n * @Description: 分库分表测试\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\n@Slf4j\n@Tag(name = \"分库分表测试\")\n@RestController\n@RequestMapping(\"/demo/sharding\")\npublic class JeecgShardingDemoController extends JeecgController<ShardingSysLog, IShardingSysLogService> {\n    @Autowired\n    private IShardingSysLogService shardingSysLogService;\n\n    /**\n     * 单库分表 —— 插入\n     * @return\n     */\n    @PostMapping(value = \"/insert\")\n    @Operation(summary = \"单库分表插入\")\n    public Result<?> insert() {\n        log.info(\"---------------------------------单库分表插入--------------------------------\");\n        int size = 10;\n        for (int i = 0; i < size; i++) {\n            ShardingSysLog shardingSysLog = new ShardingSysLog();\n            shardingSysLog.setLogContent(\"采用shardingsphere实现分库分表，插入测试！\");\n            shardingSysLog.setLogType(i);\n            shardingSysLog.setOperateType(i);\n            shardingSysLogService.save(shardingSysLog);\n        }\n        return Result.OK(\"单库分表插入10条数据完成！\");\n    }\n\n    /**\n     * 单库分表 —— 查询\n     * @return\n     */\n    @PostMapping(value = \"/list\")\n    @Operation(summary = \"单库分表查询\")\n    public Result<?> list() {\n        return Result.OK(shardingSysLogService.list());\n    }\n\n    /**\n     * 分库分表 - 插入\n     * @return\n     */\n    @PostMapping(value = \"/insert2\")\n    @Operation(summary = \"分库分表插入\")\n    public Result<?> insert2() {\n        int start=20;\n        int size=30;\n        for (int i = start; i <= size; i++) {\n            ShardingSysLog shardingSysLog = new ShardingSysLog();\n            shardingSysLog.setLogContent(\"分库分表测试\");\n            shardingSysLog.setLogType(0);\n            shardingSysLog.setOperateType(i);\n            shardingSysLogService.save(shardingSysLog);\n        }\n        return Result.OK(\"分库分表插入10条数据完成！\");\n    }\n\n    /**\n     * 分库分表 - 查询\n     * @return\n     */\n    @PostMapping(value = \"/list2\")\n    @Operation(summary = \"分库分表查询\")\n    public Result<?> list2() {\n        return Result.OK(shardingSysLogService.list());\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/src/main/java/org/jeecg/modules/test/sharding/entity/ShardingSysLog.java",
    "content": "package org.jeecg.modules.test.sharding.entity;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.jeecg.common.aspect.annotation.Dict;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * 系统日志表\n * @author: zyf\n * @date: 2022/04/21\n */\n@Data\n@TableName(\"sys_log\")\npublic class ShardingSysLog implements Serializable {\n\n    private static final long serialVersionUID = 1L;\n\n    /**\n     * id\n     */\n    @TableId(type = IdType.ASSIGN_ID)\n    private String id;\n\n    /**\n     * 创建人\n     */\n    private String createBy;\n\n    /**\n     * 创建时间\n     */\n    @JsonFormat(timezone = \"GMT+8\", pattern = \"yyyy-MM-dd HH:mm:ss\")\n    @DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\")\n    private Date createTime;\n\n    /**\n     * 更新人\n     */\n    private String updateBy;\n\n    /**\n     * 更新时间\n     */\n    private Date updateTime;\n\n    /**\n     * 耗时\n     */\n    private Long costTime;\n\n    /**\n     * IP\n     */\n    private String ip;\n\n    /**\n     * 请求参数\n     */\n    private String requestParam;\n\n    /**\n     * 请求类型\n     */\n    private String requestType;\n\n    /**\n     * 请求路径\n     */\n    private String requestUrl;\n    /**\n     * 请求方法\n     */\n    private String method;\n\n    /**\n     * 操作人用户名称\n     */\n    private String username;\n    /**\n     * 操作人用户账户\n     */\n    private String userid;\n    /**\n     * 操作详细日志\n     */\n    private String logContent;\n\n    /**\n     * 日志类型（1登录日志，2操作日志）\n     */\n    @Dict(dicCode = \"log_type\")\n    private Integer logType;\n\n    /**\n     * 操作类型（1查询，2添加，3修改，4删除,5导入，6导出）\n     */\n    @Dict(dicCode = \"operate_type\")\n    private Integer operateType;\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/src/main/java/org/jeecg/modules/test/sharding/mapper/ShardingSysLogMapper.java",
    "content": "package org.jeecg.modules.test.sharding.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport org.jeecg.modules.test.sharding.entity.ShardingSysLog;\n\n\n/**\n * @Description: 系统日志表 Mapper 接口\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\npublic interface ShardingSysLogMapper extends BaseMapper<ShardingSysLog> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/src/main/java/org/jeecg/modules/test/sharding/mapper/xml/ShardingSysLogMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"org.jeecg.modules.test.sharding.mapper.ShardingSysLogMapper\">\n\n</mapper>\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/src/main/java/org/jeecg/modules/test/sharding/service/IShardingSysLogService.java",
    "content": "package org.jeecg.modules.test.sharding.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport org.jeecg.modules.test.sharding.entity.ShardingSysLog;\n\n/**\n * @Description:  系统日志表 服务类\n * @author: zyf\n * @date: 2022/01/24\n * @version: V1.0\n */\npublic interface IShardingSysLogService extends IService<ShardingSysLog> {\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/src/main/java/org/jeecg/modules/test/sharding/service/impl/ShardingSysLogServiceImpl.java",
    "content": "package org.jeecg.modules.test.sharding.service.impl;\n\nimport com.baomidou.dynamic.datasource.annotation.DS;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport org.jeecg.modules.test.sharding.entity.ShardingSysLog;\nimport org.jeecg.modules.test.sharding.mapper.ShardingSysLogMapper;\nimport org.jeecg.modules.test.sharding.service.IShardingSysLogService;\nimport org.springframework.stereotype.Service;\n\n/**\n * 系统日志表 服务实现类\n * @author: zyf\n * @date: 2022/04/21\n */\n@Service\n@DS(\"sharding-db\")\npublic class ShardingSysLogServiceImpl extends ServiceImpl<ShardingSysLogMapper, ShardingSysLog> implements IShardingSysLogService {\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/src/main/resources/sharding-multi.yaml",
    "content": "# !!!数据源名称要和动态数据源中配置的名称一致\ndatabaseName: sharding-db\n\n# 具体参看官网文档说明\ndataSources:\n  ds0:\n    dataSourceClassName: com.zaxxer.hikari.HikariDataSource\n    driverClassName: com.mysql.cj.jdbc.Driver\n    jdbcUrl: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n    password: root\n    username: root\n  ds1:\n    dataSourceClassName: com.zaxxer.hikari.HikariDataSource\n    driverClassName: com.mysql.cj.jdbc.Driver\n    jdbcUrl: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot2?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n    password: root\n    username: root\n\nrules:\n  - !SHARDING\n    bindingTables:\n      - sys_log\n    tables:\n      sys_log:\n        actualDataNodes: ds$->{0..1}.sys_log$->{0..1}\n        databaseStrategy:\n          standard:\n            shardingColumn: operate_type\n            shardingAlgorithmName: database-inline\n        tableStrategy:\n          standard:\n            shardingColumn: log_type\n            shardingAlgorithmName: table-classbased\n        keyGenerateStrategy:\n          column: id\n          keyGeneratorName: snowflake\n    \n    keyGenerators:\n      snowflake:\n        type: SNOWFLAKE\n        props:\n          worker-id: 123\n    \n    shardingAlgorithms:\n      database-inline:\n        type: INLINE\n        props:\n          algorithm-expression: ds$->{operate_type % 2}\n      table-classbased:\n        type: CLASS_BASED\n        props:\n          strategy: standard\n          algorithmClassName: org.jeecg.modules.test.sharding.algorithm.StandardModTableShardAlgorithm\n\n  - !READWRITE_SPLITTING\n    dataSources:\n      prds:\n        writeDataSourceName: ds0\n        readDataSourceNames:\n          - ds1\n        loadBalancerName: round-robin\n    loadBalancers:\n      round-robin:\n        type: ROUND_ROBIN\n\nprops:\n  sql-show: true"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-shardingsphere/src/main/resources/sharding.yaml",
    "content": "# !!!数据源名称要和动态数据源中配置的名称一致\ndatabaseName: sharding-db\n\n# 具体参看官网文档说明\ndataSources:\n  db_0:\n    dataSourceClassName: com.zaxxer.hikari.HikariDataSource\n    driverClassName: com.mysql.cj.jdbc.Driver\n    jdbcUrl: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai\n    password: root\n    username: root\n\nrules:\n  - !SHARDING\n    tables: # 数据分片规则配置\n      sys_log: # 逻辑表名称\n        actualDataNodes: db_0.sys_log$->{0..1} # 由数据源名 + 表名组成（参考 Inline 语法规则）\n        databaseStrategy: # 分库策略，缺省表示使用默认分库策略，以下的分片策略只能选其一\n          none:\n        tableStrategy: # 分表策略\n          standard: # 用于单分片键的标准分片场景\n            shardingColumn: log_type # 分片列名称\n            shardingAlgorithmName: user_inline\n        keyGenerateStrategy:\n          column: id\n          keyGeneratorName: snowflake\n    keyGenerators:\n      snowflake:\n        type: SNOWFLAKE\n        props:\n          worker-id: 123\n    # 分片算法配置\n    shardingAlgorithms:\n      user_inline:\n        type: INLINE\n        props:\n          algorithm-expression: sys_log$->{log_type % 2}\n\nprops:\n  sql-show: true"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-visual</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n\n    <modelVersion>4.0.0</modelVersion>\n    <packaging>pom</packaging>\n    <artifactId>jeecg-cloud-test</artifactId>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.jeecgframework.boot3</groupId>\n            <artifactId>jeecg-boot-base-core</artifactId>\n        </dependency>\n    </dependencies>\n\n    <modules>\n        <module>jeecg-cloud-test-shardingsphere</module>\n        <module>jeecg-cloud-test-more</module>\n        <module>jeecg-cloud-test-rabbitmq</module>\n        <module>jeecg-cloud-test-seata</module>\n        <module>jeecg-cloud-test-rocketmq</module>\n    </modules>\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/Dockerfile",
    "content": "FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/java:17-anolis\n\nMAINTAINER jeecgos@163.com\n\nRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime\n\nRUN mkdir -p /jeecg-cloud-xxljob\n\nWORKDIR /jeecg-cloud-xxljob\n\nEXPOSE 9080\n\nADD ./target/jeecg-cloud-xxljob-3.9.1.jar ./\n\nCMD java -Dfile.encoding=utf-8 -Djava.security.egd=file:/dev/./urandom -jar jeecg-cloud-xxljob-3.9.1.jar\n\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/README.md",
    "content": "- 初始化脚本(mysql)\n\n  db\\tables_xxl_job.sql\n  \n- 修改数据库连接\n\n  jeecg-cloud-xxljob\\src\\main\\resources\\application.yml\n  \n- 启动项目\n\n  jeecg-cloud-xxljob\\src\\main\\java\\com\\xxl\\job\\admin\\XxlJobAdminApplication.java\n  \n - 访问项目\n  http://127.0.0.1:9080/xxl-job-admin/toLogin\n  admin/123456\n  \n - docker方式安装\n \n   https://my.oschina.net/jeecg/blog/4729020\n   \n   \n   \n 概念说明\n 1、手工创建执行器，AppName对应服务名字  比如： jeecg-demo\n 2、手工创建定时任务，选择执行器（服务）、JobHandler对应XxlJob的值"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/doc/db/tables_xxl_job.sql",
    "content": "/*\n Navicat Premium Data Transfer\n\n Source Server         : mysql5.7\n Source Server Type    : MySQL\n Source Server Version : 50738 (5.7.38)\n Source Host           : 127.0.0.1:3306\n Source Schema         : xxl_job\n\n Target Server Type    : MySQL\n Target Server Version : 50738 (5.7.38)\n File Encoding         : 65001\n\n Date: 10/02/2025 13:49:31\n*/\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- Table structure for xxl_job_group\n-- ----------------------------\nDROP TABLE IF EXISTS `xxl_job_group`;\nCREATE TABLE `xxl_job_group`  (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `app_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '执行器AppName',\n  `title` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '执行器名称',\n  `address_type` tinyint(4) NOT NULL DEFAULT 0 COMMENT '执行器地址类型：0=自动注册、1=手动录入',\n  `address_list` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '执行器地址列表，多地址逗号分隔',\n  `update_time` datetime NULL DEFAULT NULL,\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of xxl_job_group\n-- ----------------------------\nINSERT INTO `xxl_job_group` VALUES (1, 'xxl-job-executor-sample', '示例执行器', 0, NULL, '2025-02-10 13:49:04');\nINSERT INTO `xxl_job_group` VALUES (2, 'jeecg-demo', '测试Demo模块', 0, NULL, '2025-02-10 13:49:04');\nINSERT INTO `xxl_job_group` VALUES (3, 'jeecg-system', '系统System模块', 0, NULL, '2025-02-10 13:49:04');\n\n-- ----------------------------\n-- Table structure for xxl_job_info\n-- ----------------------------\nDROP TABLE IF EXISTS `xxl_job_info`;\nCREATE TABLE `xxl_job_info`  (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `job_group` int(11) NOT NULL COMMENT '执行器主键ID',\n  `job_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `add_time` datetime NULL DEFAULT NULL,\n  `update_time` datetime NULL DEFAULT NULL,\n  `author` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '作者',\n  `alarm_email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '报警邮件',\n  `schedule_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'NONE' COMMENT '调度类型',\n  `schedule_conf` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '调度配置，值含义取决于调度类型',\n  `misfire_strategy` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'DO_NOTHING' COMMENT '调度过期策略',\n  `executor_route_strategy` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器路由策略',\n  `executor_handler` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器任务handler',\n  `executor_param` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器任务参数',\n  `executor_block_strategy` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '阻塞处理策略',\n  `executor_timeout` int(11) NOT NULL DEFAULT 0 COMMENT '任务执行超时时间，单位秒',\n  `executor_fail_retry_count` int(11) NOT NULL DEFAULT 0 COMMENT '失败重试次数',\n  `glue_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'GLUE类型',\n  `glue_source` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT 'GLUE源代码',\n  `glue_remark` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'GLUE备注',\n  `glue_updatetime` datetime NULL DEFAULT NULL COMMENT 'GLUE更新时间',\n  `child_jobid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '子任务ID，多个逗号分隔',\n  `trigger_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '调度状态：0-停止，1-运行',\n  `trigger_last_time` bigint(13) NOT NULL DEFAULT 0 COMMENT '上次调度时间',\n  `trigger_next_time` bigint(13) NOT NULL DEFAULT 0 COMMENT '下次调度时间',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of xxl_job_info\n-- ----------------------------\nINSERT INTO `xxl_job_info` VALUES (1, 1, '测试任务1', '2018-11-03 22:21:31', '2024-08-21 22:30:30', 'XXL', '', 'CRON', '0 0 0 * * ? *', 'DO_NOTHING', 'FIRST', 'demoJob', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', '', 1, 1729353600000, 1739203200000);\nINSERT INTO `xxl_job_info` VALUES (2, 3, '测试jeecg xxljob', '2024-08-21 22:41:10', '2024-08-21 22:41:30', 'JEECG', '', 'CRON', '* * * * * ?', 'DO_NOTHING', 'FIRST', 'demoJob', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2024-08-21 22:41:10', '', 1, 1739166572000, 1739166573000);\n\n-- ----------------------------\n-- Table structure for xxl_job_lock\n-- ----------------------------\nDROP TABLE IF EXISTS `xxl_job_lock`;\nCREATE TABLE `xxl_job_lock`  (\n  `lock_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '锁名称',\n  PRIMARY KEY (`lock_name`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of xxl_job_lock\n-- ----------------------------\nINSERT INTO `xxl_job_lock` VALUES ('schedule_lock');\n\n-- ----------------------------\n-- Table structure for xxl_job_log\n-- ----------------------------\nDROP TABLE IF EXISTS `xxl_job_log`;\nCREATE TABLE `xxl_job_log`  (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `job_group` int(11) NOT NULL COMMENT '执行器主键ID',\n  `job_id` int(11) NOT NULL COMMENT '任务，主键ID',\n  `executor_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器地址，本次执行的地址',\n  `executor_handler` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器任务handler',\n  `executor_param` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器任务参数',\n  `executor_sharding_param` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器任务分片参数，格式如 1/2',\n  `executor_fail_retry_count` int(11) NOT NULL DEFAULT 0 COMMENT '失败重试次数',\n  `trigger_time` datetime NULL DEFAULT NULL COMMENT '调度-时间',\n  `trigger_code` int(11) NOT NULL COMMENT '调度-结果',\n  `trigger_msg` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '调度-日志',\n  `handle_time` datetime NULL DEFAULT NULL COMMENT '执行-时间',\n  `handle_code` int(11) NOT NULL COMMENT '执行-状态',\n  `handle_msg` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '执行-日志',\n  `alarm_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '告警状态：0-默认、1-无需告警、2-告警成功、3-告警失败',\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `I_trigger_time`(`trigger_time`) USING BTREE,\n  INDEX `I_handle_code`(`handle_code`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 6761 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of xxl_job_log\n-- ----------------------------\nINSERT INTO `xxl_job_log` VALUES (6618, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:09', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6619, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:10', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6620, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:11', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6621, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:12', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6622, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:13', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6623, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:14', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6624, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:15', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6625, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:16', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6626, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:17', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6627, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:18', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6628, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:19', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6629, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:20', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6630, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:21', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6631, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:22', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6632, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:23', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6633, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:24', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6634, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:25', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6635, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:26', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6636, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:27', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6637, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:28', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6638, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:29', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6639, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:30', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6640, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:31', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6641, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:32', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6642, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:33', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6643, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:34', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6644, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:35', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6645, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:36', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6646, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:37', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6647, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:38', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6648, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:39', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6649, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:40', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6650, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:41', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6651, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:42', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6652, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:43', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6653, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:44', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6654, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:45', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6655, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:46', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6656, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:47', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6657, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:48', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6658, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:49', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6659, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:50', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6660, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:51', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6661, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:52', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6662, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:53', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6663, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:54', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6664, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:55', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6665, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:56', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6666, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:57', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6667, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:58', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6668, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:59', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6669, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:00', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6670, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:01', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6671, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:02', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6672, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:03', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6673, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:04', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6674, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:05', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6675, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:06', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6676, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:07', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6677, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:08', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6678, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:09', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6679, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:10', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6680, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:11', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6681, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:12', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6682, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:13', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6683, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:14', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6684, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:15', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6685, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:16', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6686, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:17', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6687, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:18', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6688, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:19', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6689, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:20', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6690, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:21', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6691, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:22', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6692, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:23', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6693, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:24', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6694, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:25', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6695, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:26', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6696, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:27', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6697, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:28', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6698, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:29', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6699, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:30', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6700, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:31', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6701, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:32', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6702, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:33', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6703, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:34', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6704, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:35', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6705, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:36', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6706, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:37', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6707, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:38', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6708, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:39', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6709, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:40', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6710, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:41', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6711, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:42', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6712, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:43', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6713, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:44', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6714, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:45', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6715, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:46', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6716, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:47', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6717, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:48', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6718, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:49', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6719, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:50', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6720, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:51', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6721, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:52', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6722, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:53', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6723, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:54', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6724, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:55', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6725, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:56', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6726, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:57', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6727, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:58', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6728, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:59', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6729, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:00', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6730, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:01', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6731, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:02', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6732, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:03', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6733, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:04', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6734, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:05', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6735, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:06', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6736, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:07', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6737, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:08', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6738, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:09', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6739, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:10', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6740, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:11', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6741, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:12', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6742, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:13', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6743, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:14', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6744, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:15', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6745, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:16', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6746, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:17', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6747, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:18', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6748, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:19', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6749, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:20', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6750, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:21', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6751, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:22', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6752, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:23', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6753, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:24', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 2);\nINSERT INTO `xxl_job_log` VALUES (6754, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:25', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 0);\nINSERT INTO `xxl_job_log` VALUES (6755, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:26', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 0);\nINSERT INTO `xxl_job_log` VALUES (6756, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:27', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 0);\nINSERT INTO `xxl_job_log` VALUES (6757, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:28', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 0);\nINSERT INTO `xxl_job_log` VALUES (6758, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:29', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 0);\nINSERT INTO `xxl_job_log` VALUES (6759, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:30', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 0);\nINSERT INTO `xxl_job_log` VALUES (6760, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:31', 500, '任务触发类型：Cron触发<br>调度机器：192.168.1.11<br>执行器-注册方式：自动注册<br>执行器-地址列表：null<br>路由策略：第一个<br>阻塞处理策略：单机串行<br>任务超时时间：0<br>失败重试次数：0<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败：执行器地址为空<br><br>', NULL, 0, NULL, 0);\n\n-- ----------------------------\n-- Table structure for xxl_job_log_report\n-- ----------------------------\nDROP TABLE IF EXISTS `xxl_job_log_report`;\nCREATE TABLE `xxl_job_log_report`  (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `trigger_day` datetime NULL DEFAULT NULL COMMENT '调度-时间',\n  `running_count` int(11) NOT NULL DEFAULT 0 COMMENT '运行中-日志数量',\n  `suc_count` int(11) NOT NULL DEFAULT 0 COMMENT '执行成功-日志数量',\n  `fail_count` int(11) NOT NULL DEFAULT 0 COMMENT '执行失败-日志数量',\n  `update_time` datetime NULL DEFAULT NULL,\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `i_trigger_day`(`trigger_day`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of xxl_job_log_report\n-- ----------------------------\nINSERT INTO `xxl_job_log_report` VALUES (1, '2024-08-21 00:00:00', 70, 0, 5, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (2, '2024-08-20 00:00:00', 0, 0, 0, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (3, '2024-08-19 00:00:00', 0, 0, 0, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (4, '2024-09-10 00:00:00', 0, 0, 56, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (5, '2024-09-09 00:00:00', 0, 0, 0, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (6, '2024-09-08 00:00:00', 0, 0, 0, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (7, '2024-10-19 00:00:00', 0, 0, 6391, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (8, '2024-10-18 00:00:00', 0, 0, 0, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (9, '2024-10-17 00:00:00', 0, 0, 0, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (10, '2025-02-10 00:00:00', 0, 0, 116, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (11, '2025-02-09 00:00:00', 0, 0, 0, NULL);\nINSERT INTO `xxl_job_log_report` VALUES (12, '2025-02-08 00:00:00', 0, 0, 0, NULL);\n\n-- ----------------------------\n-- Table structure for xxl_job_logglue\n-- ----------------------------\nDROP TABLE IF EXISTS `xxl_job_logglue`;\nCREATE TABLE `xxl_job_logglue`  (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `job_id` int(11) NOT NULL COMMENT '任务，主键ID',\n  `glue_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'GLUE类型',\n  `glue_source` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT 'GLUE源代码',\n  `glue_remark` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'GLUE备注',\n  `add_time` datetime NULL DEFAULT NULL,\n  `update_time` datetime NULL DEFAULT NULL,\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of xxl_job_logglue\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for xxl_job_registry\n-- ----------------------------\nDROP TABLE IF EXISTS `xxl_job_registry`;\nCREATE TABLE `xxl_job_registry`  (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `registry_group` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `registry_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `registry_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n  `update_time` datetime NULL DEFAULT NULL,\n  PRIMARY KEY (`id`) USING BTREE,\n  INDEX `i_g_k_v`(`registry_group`, `registry_key`, `registry_value`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of xxl_job_registry\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for xxl_job_user\n-- ----------------------------\nDROP TABLE IF EXISTS `xxl_job_user`;\nCREATE TABLE `xxl_job_user`  (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '账号',\n  `password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码',\n  `role` tinyint(4) NOT NULL COMMENT '角色：0-普通用户、1-管理员',\n  `permission` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限：执行器ID列表，多个逗号分割',\n  PRIMARY KEY (`id`) USING BTREE,\n  UNIQUE INDEX `i_username`(`username`) USING BTREE\n) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;\n\n-- ----------------------------\n-- Records of xxl_job_user\n-- ----------------------------\nINSERT INTO `xxl_job_user` VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL);\n\nSET FOREIGN_KEY_CHECKS = 1;\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-visual</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>jeecg-cloud-xxljob</artifactId>\n\n    <dependencies>\n\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-web</artifactId>\n        </dependency>\n        <!-- starter-test：junit + spring-test + mockito -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-test</artifactId>\n            <scope>test</scope>\n        </dependency>\n        <!-- freemarker-starter -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-freemarker</artifactId>\n        </dependency>\n\n        <!-- starter-actuator -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-actuator</artifactId>\n        </dependency>\n\n        <!-- mybatis-starter：mybatis + mybatis-spring + hikari（default） -->\n        <dependency>\n            <groupId>org.mybatis.spring.boot</groupId>\n            <artifactId>mybatis-spring-boot-starter</artifactId>\n            <version>3.0.3</version>\n        </dependency>\n        <!-- mysql -->\n        <dependency>\n            <groupId>mysql</groupId>\n            <artifactId>mysql-connector-java</artifactId>\n            <version>${mysql-connector-java.version}</version>\n            <scope>runtime</scope>\n        </dependency>\n\n\n        <!-- mail-starter -->\n        <dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-mail</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>com.xuxueli</groupId>\n            <artifactId>xxl-job-core</artifactId>\n            <version>${xxl-job-core.version}</version>\n        </dependency>\n    </dependencies>\n\n    <!-- update-begin-author:taoyan date:20210226 for:docker部署报错：no main manifest attribute -->\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.springframework.boot</groupId>\n                <artifactId>spring-boot-maven-plugin</artifactId>\n\n                <executions>\n                    <execution>\n                        <phase>package</phase>\n                        <goals>\n                            <goal>repackage</goal>\n                        </goals>\n                    </execution>\n                </executions>\n                <configuration>\n                    <includeSystemScope>true</includeSystemScope>\n                    <mainClass>com.xxl.job.admin.XxlJobAdminApplication</mainClass>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-resources-plugin</artifactId>\n                <configuration>\n                    <nonFilteredFileExtensions>\n                        <nonFilteredFileExtension>otf</nonFilteredFileExtension>\n                        <nonFilteredFileExtension>ttf</nonFilteredFileExtension>\n                        <nonFilteredFileExtension>woff</nonFilteredFileExtension>\n                        <nonFilteredFileExtension>woff2</nonFilteredFileExtension>\n                        <nonFilteredFileExtension>eot</nonFilteredFileExtension>\n                    </nonFilteredFileExtensions>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n    <!-- update-end-author:taoyan date:20210226 for:docker部署报错：no main manifest attribute -->\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java",
    "content": "package com.xxl.job.admin;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.ConfigurableApplicationContext;\nimport org.springframework.core.env.Environment;\n\n/**\n * @author xuxueli 2018-10-28 00:38:13\n */\n@SpringBootApplication\n@Slf4j\npublic class XxlJobAdminApplication {\n\n\tpublic static void main(String[] args) {\n\t\tConfigurableApplicationContext application = SpringApplication.run(XxlJobAdminApplication.class, args);\n\t\tEnvironment env = application.getEnvironment();\n\t\tString port = env.getProperty(\"server.port\");\n\t\tString path = env.getProperty(\"server.servlet.context-path\");\n\t\tlog.info(\"\\n----------------------------------------------------------\\n\\t\" +\n\t\t\t\t\"Application XxlJobAdmin is running! Access URLs:\\n\\t\" +\n\t\t\t\t\"Local: \\t\\thttp://localhost:\" + port + path + \"/\\n\\t\" +\n\t\t\t\t\"----------------------------------------------------------\");\n\t}\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/IndexController.java",
    "content": "package com.xxl.job.admin.controller;\n\nimport com.xxl.job.admin.controller.annotation.PermissionLimit;\nimport com.xxl.job.admin.service.LoginService;\nimport com.xxl.job.admin.service.XxlJobService;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport org.springframework.beans.propertyeditors.CustomDateEditor;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.WebDataBinder;\nimport org.springframework.web.bind.annotation.InitBinder;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.ResponseBody;\nimport org.springframework.web.servlet.ModelAndView;\nimport org.springframework.web.servlet.view.RedirectView;\n\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\nimport java.util.Map;\n\n/**\n * index controller\n * @author xuxueli 2015-12-19 16:13:16\n */\n@Controller\npublic class IndexController {\n\n\t@Resource\n\tprivate XxlJobService xxlJobService;\n\t@Resource\n\tprivate LoginService loginService;\n\n\n\t@RequestMapping(\"/\")\n\tpublic String index(Model model) {\n\n\t\tMap<String, Object> dashboardMap = xxlJobService.dashboardInfo();\n\t\tmodel.addAllAttributes(dashboardMap);\n\n\t\treturn \"index\";\n\t}\n\n    @RequestMapping(\"/chartInfo\")\n\t@ResponseBody\n\tpublic ReturnT<Map<String, Object>> chartInfo(Date startDate, Date endDate) {\n        ReturnT<Map<String, Object>> chartInfo = xxlJobService.chartInfo(startDate, endDate);\n        return chartInfo;\n    }\n\t\n\t@RequestMapping(\"/toLogin\")\n\t@PermissionLimit(limit=false)\n\tpublic ModelAndView toLogin(HttpServletRequest request, HttpServletResponse response,ModelAndView modelAndView) {\n\t\tif (loginService.ifLogin(request, response) != null) {\n\t\t\tmodelAndView.setView(new RedirectView(\"/\",true,false));\n\t\t\treturn modelAndView;\n\t\t}\n\t\treturn new ModelAndView(\"login\");\n\t}\n\t\n\t@RequestMapping(value=\"login\", method=RequestMethod.POST)\n\t@ResponseBody\n\t@PermissionLimit(limit=false)\n\tpublic ReturnT<String> loginDo(HttpServletRequest request, HttpServletResponse response, String userName, String password, String ifRemember){\n\t\tboolean ifRem = (ifRemember!=null && ifRemember.trim().length()>0 && \"on\".equals(ifRemember))?true:false;\n\t\treturn loginService.login(request, response, userName, password, ifRem);\n\t}\n\t\n\t@RequestMapping(value=\"logout\", method=RequestMethod.POST)\n\t@ResponseBody\n\t@PermissionLimit(limit=false)\n\tpublic ReturnT<String> logout(HttpServletRequest request, HttpServletResponse response){\n\t\treturn loginService.logout(request, response);\n\t}\n\t\n\t@RequestMapping(\"/help\")\n\tpublic String help() {\n\n\t\t/*if (!PermissionInterceptor.ifLogin(request)) {\n\t\t\treturn \"redirect:/toLogin\";\n\t\t}*/\n\n\t\treturn \"help\";\n\t}\n\n\t@InitBinder\n\tpublic void initBinder(WebDataBinder binder) {\n\t\tSimpleDateFormat dateFormat = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");\n\t\tdateFormat.setLenient(false);\n\t\tbinder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));\n\t}\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobApiController.java",
    "content": "package com.xxl.job.admin.controller;\n\nimport com.xxl.job.admin.controller.annotation.PermissionLimit;\nimport com.xxl.job.admin.core.conf.XxlJobAdminConfig;\nimport com.xxl.job.core.biz.AdminBiz;\nimport com.xxl.job.core.biz.model.HandleCallbackParam;\nimport com.xxl.job.core.biz.model.RegistryParam;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.util.GsonTool;\nimport com.xxl.job.core.util.XxlJobRemotingUtil;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.util.List;\n\n/**\n * Created by xuxueli on 17/5/10.\n */\n@Controller\n@RequestMapping(\"/api\")\npublic class JobApiController {\n\n    @Resource\n    private AdminBiz adminBiz;\n\n    /**\n     * api\n     *\n     * @param uri\n     * @param data\n     * @return\n     */\n    @RequestMapping(\"/{uri}\")\n    @ResponseBody\n    @PermissionLimit(limit=false)\n    public ReturnT<String> api(HttpServletRequest request, @PathVariable(\"uri\") String uri, @RequestBody(required = false) String data) {\n\n        // valid\n        if (!\"POST\".equalsIgnoreCase(request.getMethod())) {\n            return new ReturnT<String>(ReturnT.FAIL_CODE, \"invalid request, HttpMethod not support.\");\n        }\n        if (uri==null || uri.trim().length()==0) {\n            return new ReturnT<String>(ReturnT.FAIL_CODE, \"invalid request, uri-mapping empty.\");\n        }\n        if (XxlJobAdminConfig.getAdminConfig().getAccessToken()!=null\n                && XxlJobAdminConfig.getAdminConfig().getAccessToken().trim().length()>0\n                && !XxlJobAdminConfig.getAdminConfig().getAccessToken().equals(request.getHeader(XxlJobRemotingUtil.XXL_JOB_ACCESS_TOKEN))) {\n            return new ReturnT<String>(ReturnT.FAIL_CODE, \"The access token is wrong.\");\n        }\n\n        // services mapping\n        if (\"callback\".equals(uri)) {\n            List<HandleCallbackParam> callbackParamList = GsonTool.fromJson(data, List.class, HandleCallbackParam.class);\n            return adminBiz.callback(callbackParamList);\n        } else if (\"registry\".equals(uri)) {\n            RegistryParam registryParam = GsonTool.fromJson(data, RegistryParam.class);\n            return adminBiz.registry(registryParam);\n        } else if (\"registryRemove\".equals(uri)) {\n            RegistryParam registryParam = GsonTool.fromJson(data, RegistryParam.class);\n            return adminBiz.registryRemove(registryParam);\n        } else {\n            return new ReturnT<String>(ReturnT.FAIL_CODE, \"invalid request, uri-mapping(\"+ uri +\") not found.\");\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobCodeController.java",
    "content": "package com.xxl.job.admin.controller;\n\nimport com.xxl.job.admin.core.model.XxlJobInfo;\nimport com.xxl.job.admin.core.model.XxlJobLogGlue;\nimport com.xxl.job.admin.core.util.I18nUtil;\nimport com.xxl.job.admin.dao.XxlJobInfoDao;\nimport com.xxl.job.admin.dao.XxlJobLogGlueDao;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.glue.GlueTypeEnum;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * job code controller\n * @author xuxueli 2015-12-19 16:13:16\n */\n@Controller\n@RequestMapping(\"/jobcode\")\npublic class JobCodeController {\n\t\n\t@Resource\n\tprivate XxlJobInfoDao xxlJobInfoDao;\n\t@Resource\n\tprivate XxlJobLogGlueDao xxlJobLogGlueDao;\n\n\t@RequestMapping\n\tpublic String index(HttpServletRequest request, Model model, int jobId) {\n\t\tXxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId);\n\t\tList<XxlJobLogGlue> jobLogGlues = xxlJobLogGlueDao.findByJobId(jobId);\n\n\t\tif (jobInfo == null) {\n\t\t\tthrow new RuntimeException(I18nUtil.getString(\"jobinfo_glue_jobid_unvalid\"));\n\t\t}\n\t\tif (GlueTypeEnum.BEAN == GlueTypeEnum.match(jobInfo.getGlueType())) {\n\t\t\tthrow new RuntimeException(I18nUtil.getString(\"jobinfo_glue_gluetype_unvalid\"));\n\t\t}\n\n\t\t// valid permission\n\t\tJobInfoController.validPermission(request, jobInfo.getJobGroup());\n\n\t\t// Glue类型-字典\n\t\tmodel.addAttribute(\"GlueTypeEnum\", GlueTypeEnum.values());\n\n\t\tmodel.addAttribute(\"jobInfo\", jobInfo);\n\t\tmodel.addAttribute(\"jobLogGlues\", jobLogGlues);\n\t\treturn \"jobcode/jobcode.index\";\n\t}\n\t\n\t@RequestMapping(\"/save\")\n\t@ResponseBody\n\tpublic ReturnT<String> save(Model model, int id, String glueSource, String glueRemark) {\n\t\t// valid\n\t\tif (glueRemark==null) {\n\t\t\treturn new ReturnT<String>(500, (I18nUtil.getString(\"system_please_input\") + I18nUtil.getString(\"jobinfo_glue_remark\")) );\n\t\t}\n\t\tif (glueRemark.length()<4 || glueRemark.length()>100) {\n\t\t\treturn new ReturnT<String>(500, I18nUtil.getString(\"jobinfo_glue_remark_limit\"));\n\t\t}\n\t\tXxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(id);\n\t\tif (exists_jobInfo == null) {\n\t\t\treturn new ReturnT<String>(500, I18nUtil.getString(\"jobinfo_glue_jobid_unvalid\"));\n\t\t}\n\t\t\n\t\t// update new code\n\t\texists_jobInfo.setGlueSource(glueSource);\n\t\texists_jobInfo.setGlueRemark(glueRemark);\n\t\texists_jobInfo.setGlueUpdatetime(new Date());\n\n\t\texists_jobInfo.setUpdateTime(new Date());\n\t\txxlJobInfoDao.update(exists_jobInfo);\n\n\t\t// log old code\n\t\tXxlJobLogGlue xxlJobLogGlue = new XxlJobLogGlue();\n\t\txxlJobLogGlue.setJobId(exists_jobInfo.getId());\n\t\txxlJobLogGlue.setGlueType(exists_jobInfo.getGlueType());\n\t\txxlJobLogGlue.setGlueSource(glueSource);\n\t\txxlJobLogGlue.setGlueRemark(glueRemark);\n\n\t\txxlJobLogGlue.setAddTime(new Date());\n\t\txxlJobLogGlue.setUpdateTime(new Date());\n\t\txxlJobLogGlueDao.save(xxlJobLogGlue);\n\n\t\t// remove code backup more than 30\n\t\txxlJobLogGlueDao.removeOld(exists_jobInfo.getId(), 30);\n\n\t\treturn ReturnT.SUCCESS;\n\t}\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobGroupController.java",
    "content": "package com.xxl.job.admin.controller;\n\nimport com.xxl.job.admin.controller.annotation.PermissionLimit;\nimport com.xxl.job.admin.core.model.XxlJobGroup;\nimport com.xxl.job.admin.core.model.XxlJobRegistry;\nimport com.xxl.job.admin.core.util.I18nUtil;\nimport com.xxl.job.admin.dao.XxlJobGroupDao;\nimport com.xxl.job.admin.dao.XxlJobInfoDao;\nimport com.xxl.job.admin.dao.XxlJobRegistryDao;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.enums.RegistryConfig;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.util.*;\n\n/**\n * job group controller\n * @author xuxueli 2016-10-02 20:52:56\n */\n@Controller\n@RequestMapping(\"/jobgroup\")\npublic class JobGroupController {\n\n\t@Resource\n\tpublic XxlJobInfoDao xxlJobInfoDao;\n\t@Resource\n\tpublic XxlJobGroupDao xxlJobGroupDao;\n\t@Resource\n\tprivate XxlJobRegistryDao xxlJobRegistryDao;\n\n\t@RequestMapping\n\t@PermissionLimit(adminuser = true)\n\tpublic String index(Model model) {\n\t\treturn \"jobgroup/jobgroup.index\";\n\t}\n\n\t@RequestMapping(\"/pageList\")\n\t@ResponseBody\n\t@PermissionLimit(adminuser = true)\n\tpublic Map<String, Object> pageList(HttpServletRequest request,\n\t\t\t\t\t\t\t\t\t\t@RequestParam(required = false, defaultValue = \"0\") int start,\n\t\t\t\t\t\t\t\t\t\t@RequestParam(required = false, defaultValue = \"10\") int length,\n\t\t\t\t\t\t\t\t\t\tString appname, String title) {\n\n\t\t// page query\n\t\tList<XxlJobGroup> list = xxlJobGroupDao.pageList(start, length, appname, title);\n\t\tint list_count = xxlJobGroupDao.pageListCount(start, length, appname, title);\n\n\t\t// package result\n\t\tMap<String, Object> maps = new HashMap<String, Object>();\n\t\tmaps.put(\"recordsTotal\", list_count);\t\t// 总记录数\n\t\tmaps.put(\"recordsFiltered\", list_count);\t// 过滤后的总记录数\n\t\tmaps.put(\"data\", list);  \t\t\t\t\t// 分页列表\n\t\treturn maps;\n\t}\n\n\t@RequestMapping(\"/save\")\n\t@ResponseBody\n\t@PermissionLimit(adminuser = true)\n\tpublic ReturnT<String> save(XxlJobGroup xxlJobGroup){\n\n\t\t// valid\n\t\tif (xxlJobGroup.getAppname()==null || xxlJobGroup.getAppname().trim().length()==0) {\n\t\t\treturn new ReturnT<String>(500, (I18nUtil.getString(\"system_please_input\")+\"AppName\") );\n\t\t}\n\t\tif (xxlJobGroup.getAppname().length()<4 || xxlJobGroup.getAppname().length()>64) {\n\t\t\treturn new ReturnT<String>(500, I18nUtil.getString(\"jobgroup_field_appname_length\") );\n\t\t}\n\t\tif (xxlJobGroup.getAppname().contains(\">\") || xxlJobGroup.getAppname().contains(\"<\")) {\n\t\t\treturn new ReturnT<String>(500, \"AppName\"+I18nUtil.getString(\"system_unvalid\") );\n\t\t}\n\t\tif (xxlJobGroup.getTitle()==null || xxlJobGroup.getTitle().trim().length()==0) {\n\t\t\treturn new ReturnT<String>(500, (I18nUtil.getString(\"system_please_input\") + I18nUtil.getString(\"jobgroup_field_title\")) );\n\t\t}\n\t\tif (xxlJobGroup.getTitle().contains(\">\") || xxlJobGroup.getTitle().contains(\"<\")) {\n\t\t\treturn new ReturnT<String>(500, I18nUtil.getString(\"jobgroup_field_title\")+I18nUtil.getString(\"system_unvalid\") );\n\t\t}\n\t\tif (xxlJobGroup.getAddressType()!=0) {\n\t\t\tif (xxlJobGroup.getAddressList()==null || xxlJobGroup.getAddressList().trim().length()==0) {\n\t\t\t\treturn new ReturnT<String>(500, I18nUtil.getString(\"jobgroup_field_addressType_limit\") );\n\t\t\t}\n\t\t\tif (xxlJobGroup.getAddressList().contains(\">\") || xxlJobGroup.getAddressList().contains(\"<\")) {\n\t\t\t\treturn new ReturnT<String>(500, I18nUtil.getString(\"jobgroup_field_registryList\")+I18nUtil.getString(\"system_unvalid\") );\n\t\t\t}\n\n\t\t\tString[] addresss = xxlJobGroup.getAddressList().split(\",\");\n\t\t\tfor (String item: addresss) {\n\t\t\t\tif (item==null || item.trim().length()==0) {\n\t\t\t\t\treturn new ReturnT<String>(500, I18nUtil.getString(\"jobgroup_field_registryList_unvalid\") );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// process\n\t\txxlJobGroup.setUpdateTime(new Date());\n\n\t\tint ret = xxlJobGroupDao.save(xxlJobGroup);\n\t\treturn (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL;\n\t}\n\n\t@RequestMapping(\"/update\")\n\t@ResponseBody\n\t@PermissionLimit(adminuser = true)\n\tpublic ReturnT<String> update(XxlJobGroup xxlJobGroup){\n\t\t// valid\n\t\tif (xxlJobGroup.getAppname()==null || xxlJobGroup.getAppname().trim().length()==0) {\n\t\t\treturn new ReturnT<String>(500, (I18nUtil.getString(\"system_please_input\")+\"AppName\") );\n\t\t}\n\t\tif (xxlJobGroup.getAppname().length()<4 || xxlJobGroup.getAppname().length()>64) {\n\t\t\treturn new ReturnT<String>(500, I18nUtil.getString(\"jobgroup_field_appname_length\") );\n\t\t}\n\t\tif (xxlJobGroup.getTitle()==null || xxlJobGroup.getTitle().trim().length()==0) {\n\t\t\treturn new ReturnT<String>(500, (I18nUtil.getString(\"system_please_input\") + I18nUtil.getString(\"jobgroup_field_title\")) );\n\t\t}\n\t\tif (xxlJobGroup.getAddressType() == 0) {\n\t\t\t// 0=自动注册\n\t\t\tList<String> registryList = findRegistryByAppName(xxlJobGroup.getAppname());\n\t\t\tString addressListStr = null;\n\t\t\tif (registryList!=null && !registryList.isEmpty()) {\n\t\t\t\tCollections.sort(registryList);\n\t\t\t\taddressListStr = \"\";\n\t\t\t\tfor (String item:registryList) {\n\t\t\t\t\taddressListStr += item + \",\";\n\t\t\t\t}\n\t\t\t\taddressListStr = addressListStr.substring(0, addressListStr.length()-1);\n\t\t\t}\n\t\t\txxlJobGroup.setAddressList(addressListStr);\n\t\t} else {\n\t\t\t// 1=手动录入\n\t\t\tif (xxlJobGroup.getAddressList()==null || xxlJobGroup.getAddressList().trim().length()==0) {\n\t\t\t\treturn new ReturnT<String>(500, I18nUtil.getString(\"jobgroup_field_addressType_limit\") );\n\t\t\t}\n\t\t\tString[] addresss = xxlJobGroup.getAddressList().split(\",\");\n\t\t\tfor (String item: addresss) {\n\t\t\t\tif (item==null || item.trim().length()==0) {\n\t\t\t\t\treturn new ReturnT<String>(500, I18nUtil.getString(\"jobgroup_field_registryList_unvalid\") );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// process\n\t\txxlJobGroup.setUpdateTime(new Date());\n\n\t\tint ret = xxlJobGroupDao.update(xxlJobGroup);\n\t\treturn (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL;\n\t}\n\n\tprivate List<String> findRegistryByAppName(String appnameParam){\n\t\tHashMap<String, List<String>> appAddressMap = new HashMap<String, List<String>>();\n\t\tList<XxlJobRegistry> list = xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT, new Date());\n\t\tif (list != null) {\n\t\t\tfor (XxlJobRegistry item: list) {\n\t\t\t\tif (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {\n\t\t\t\t\tString appname = item.getRegistryKey();\n\t\t\t\t\tList<String> registryList = appAddressMap.get(appname);\n\t\t\t\t\tif (registryList == null) {\n\t\t\t\t\t\tregistryList = new ArrayList<String>();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!registryList.contains(item.getRegistryValue())) {\n\t\t\t\t\t\tregistryList.add(item.getRegistryValue());\n\t\t\t\t\t}\n\t\t\t\t\tappAddressMap.put(appname, registryList);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn appAddressMap.get(appnameParam);\n\t}\n\n\t@RequestMapping(\"/remove\")\n\t@ResponseBody\n\t@PermissionLimit(adminuser = true)\n\tpublic ReturnT<String> remove(int id){\n\n\t\t// valid\n\t\tint count = xxlJobInfoDao.pageListCount(0, 10, id, -1,  null, null, null);\n\t\tif (count > 0) {\n\t\t\treturn new ReturnT<String>(500, I18nUtil.getString(\"jobgroup_del_limit_0\") );\n\t\t}\n\n\t\tList<XxlJobGroup> allList = xxlJobGroupDao.findAll();\n\t\tif (allList.size() == 1) {\n\t\t\treturn new ReturnT<String>(500, I18nUtil.getString(\"jobgroup_del_limit_1\") );\n\t\t}\n\n\t\tint ret = xxlJobGroupDao.remove(id);\n\t\treturn (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL;\n\t}\n\n\t@RequestMapping(\"/loadById\")\n\t@ResponseBody\n\t@PermissionLimit(adminuser = true)\n\tpublic ReturnT<XxlJobGroup> loadById(int id){\n\t\tXxlJobGroup jobGroup = xxlJobGroupDao.load(id);\n\t\treturn jobGroup!=null?new ReturnT<XxlJobGroup>(jobGroup):new ReturnT<XxlJobGroup>(ReturnT.FAIL_CODE, null);\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobInfoController.java",
    "content": "package com.xxl.job.admin.controller;\n\nimport com.xxl.job.admin.core.exception.XxlJobException;\nimport com.xxl.job.admin.core.model.XxlJobGroup;\nimport com.xxl.job.admin.core.model.XxlJobInfo;\nimport com.xxl.job.admin.core.model.XxlJobUser;\nimport com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;\nimport com.xxl.job.admin.core.scheduler.MisfireStrategyEnum;\nimport com.xxl.job.admin.core.scheduler.ScheduleTypeEnum;\nimport com.xxl.job.admin.core.thread.JobScheduleHelper;\nimport com.xxl.job.admin.core.util.I18nUtil;\nimport com.xxl.job.admin.dao.XxlJobGroupDao;\nimport com.xxl.job.admin.service.LoginService;\nimport com.xxl.job.admin.service.XxlJobService;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.enums.ExecutorBlockStrategyEnum;\nimport com.xxl.job.core.glue.GlueTypeEnum;\nimport com.xxl.job.core.util.DateUtil;\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.http.HttpServletRequest;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport java.util.*;\n\n/**\n * index controller\n * @author xuxueli 2015-12-19 16:13:16\n */\n@Controller\n@RequestMapping(\"/jobinfo\")\npublic class JobInfoController {\n\tprivate static Logger logger = LoggerFactory.getLogger(JobInfoController.class);\n\n\t@Resource\n\tprivate XxlJobGroupDao xxlJobGroupDao;\n\t@Resource\n\tprivate XxlJobService xxlJobService;\n\t\n\t@RequestMapping\n\tpublic String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = \"-1\") int jobGroup) {\n\n\t\t// 枚举-字典\n\t\tmodel.addAttribute(\"ExecutorRouteStrategyEnum\", ExecutorRouteStrategyEnum.values());\t    // 路由策略-列表\n\t\tmodel.addAttribute(\"GlueTypeEnum\", GlueTypeEnum.values());\t\t\t\t\t\t\t\t// Glue类型-字典\n\t\tmodel.addAttribute(\"ExecutorBlockStrategyEnum\", ExecutorBlockStrategyEnum.values());\t    // 阻塞处理策略-字典\n\t\tmodel.addAttribute(\"ScheduleTypeEnum\", ScheduleTypeEnum.values());\t    \t\t\t\t// 调度类型\n\t\tmodel.addAttribute(\"MisfireStrategyEnum\", MisfireStrategyEnum.values());\t    \t\t\t// 调度过期策略\n\n\t\t// 执行器列表\n\t\tList<XxlJobGroup> jobGroupList_all =  xxlJobGroupDao.findAll();\n\n\t\t// filter group\n\t\tList<XxlJobGroup> jobGroupList = filterJobGroupByRole(request, jobGroupList_all);\n\t\tif (jobGroupList==null || jobGroupList.size()==0) {\n\t\t\tthrow new XxlJobException(I18nUtil.getString(\"jobgroup_empty\"));\n\t\t}\n\n\t\tmodel.addAttribute(\"JobGroupList\", jobGroupList);\n\t\tmodel.addAttribute(\"jobGroup\", jobGroup);\n\n\t\treturn \"jobinfo/jobinfo.index\";\n\t}\n\n\tpublic static List<XxlJobGroup> filterJobGroupByRole(HttpServletRequest request, List<XxlJobGroup> jobGroupList_all){\n\t\tList<XxlJobGroup> jobGroupList = new ArrayList<>();\n\t\tif (jobGroupList_all!=null && jobGroupList_all.size()>0) {\n\t\t\tXxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY);\n\t\t\tif (loginUser.getRole() == 1) {\n\t\t\t\tjobGroupList = jobGroupList_all;\n\t\t\t} else {\n\t\t\t\tList<String> groupIdStrs = new ArrayList<>();\n\t\t\t\tif (loginUser.getPermission()!=null && loginUser.getPermission().trim().length()>0) {\n\t\t\t\t\tgroupIdStrs = Arrays.asList(loginUser.getPermission().trim().split(\",\"));\n\t\t\t\t}\n\t\t\t\tfor (XxlJobGroup groupItem:jobGroupList_all) {\n\t\t\t\t\tif (groupIdStrs.contains(String.valueOf(groupItem.getId()))) {\n\t\t\t\t\t\tjobGroupList.add(groupItem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn jobGroupList;\n\t}\n\tpublic static void validPermission(HttpServletRequest request, int jobGroup) {\n\t\tXxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY);\n\t\tif (!loginUser.validPermission(jobGroup)) {\n\t\t\tthrow new RuntimeException(I18nUtil.getString(\"system_permission_limit\") + \"[username=\"+ loginUser.getUsername() +\"]\");\n\t\t}\n\t}\n\t\n\t@RequestMapping(\"/pageList\")\n\t@ResponseBody\n\tpublic Map<String, Object> pageList(@RequestParam(required = false, defaultValue = \"0\") int start,  \n\t\t\t@RequestParam(required = false, defaultValue = \"10\") int length,\n\t\t\tint jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) {\n\t\t\n\t\treturn xxlJobService.pageList(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author);\n\t}\n\t\n\t@RequestMapping(\"/add\")\n\t@ResponseBody\n\tpublic ReturnT<String> add(XxlJobInfo jobInfo) {\n\t\treturn xxlJobService.add(jobInfo);\n\t}\n\t\n\t@RequestMapping(\"/update\")\n\t@ResponseBody\n\tpublic ReturnT<String> update(XxlJobInfo jobInfo) {\n\t\treturn xxlJobService.update(jobInfo);\n\t}\n\t\n\t@RequestMapping(\"/remove\")\n\t@ResponseBody\n\tpublic ReturnT<String> remove(int id) {\n\t\treturn xxlJobService.remove(id);\n\t}\n\t\n\t@RequestMapping(\"/stop\")\n\t@ResponseBody\n\tpublic ReturnT<String> pause(int id) {\n\t\treturn xxlJobService.stop(id);\n\t}\n\t\n\t@RequestMapping(\"/start\")\n\t@ResponseBody\n\tpublic ReturnT<String> start(int id) {\n\t\treturn xxlJobService.start(id);\n\t}\n\t\n\t@RequestMapping(\"/trigger\")\n\t@ResponseBody\n\tpublic ReturnT<String> triggerJob(HttpServletRequest request, int id, String executorParam, String addressList) {\n\t\t// login user\n\t\tXxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY);\n\t\t// trigger\n\t\treturn xxlJobService.trigger(loginUser, id, executorParam, addressList);\n\t}\n\n\t@RequestMapping(\"/nextTriggerTime\")\n\t@ResponseBody\n\tpublic ReturnT<List<String>> nextTriggerTime(String scheduleType, String scheduleConf) {\n\n\t\tXxlJobInfo paramXxlJobInfo = new XxlJobInfo();\n\t\tparamXxlJobInfo.setScheduleType(scheduleType);\n\t\tparamXxlJobInfo.setScheduleConf(scheduleConf);\n\n\t\tList<String> result = new ArrayList<>();\n\t\ttry {\n\t\t\tDate lastTime = new Date();\n\t\t\tfor (int i = 0; i < 5; i++) {\n\t\t\t\tlastTime = JobScheduleHelper.generateNextValidTime(paramXxlJobInfo, lastTime);\n\t\t\t\tif (lastTime != null) {\n\t\t\t\t\tresult.add(DateUtil.formatDateTime(lastTime));\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(e.getMessage(), e);\n\t\t\treturn new ReturnT<List<String>>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"schedule_type\")+I18nUtil.getString(\"system_unvalid\")) + e.getMessage());\n\t\t}\n\t\treturn new ReturnT<List<String>>(result);\n\n\t}\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/JobLogController.java",
    "content": "package com.xxl.job.admin.controller;\n\nimport com.xxl.job.admin.core.complete.XxlJobCompleter;\nimport com.xxl.job.admin.core.exception.XxlJobException;\nimport com.xxl.job.admin.core.model.XxlJobGroup;\nimport com.xxl.job.admin.core.model.XxlJobInfo;\nimport com.xxl.job.admin.core.model.XxlJobLog;\nimport com.xxl.job.admin.core.scheduler.XxlJobScheduler;\nimport com.xxl.job.admin.core.util.I18nUtil;\nimport com.xxl.job.admin.dao.XxlJobGroupDao;\nimport com.xxl.job.admin.dao.XxlJobInfoDao;\nimport com.xxl.job.admin.dao.XxlJobLogDao;\nimport com.xxl.job.core.biz.ExecutorBiz;\nimport com.xxl.job.core.biz.model.KillParam;\nimport com.xxl.job.core.biz.model.LogParam;\nimport com.xxl.job.core.biz.model.LogResult;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.util.DateUtil;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\nimport org.springframework.web.util.HtmlUtils;\n\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * index controller\n * @author xuxueli 2015-12-19 16:13:16\n */\n@Controller\n@RequestMapping(\"/joblog\")\npublic class JobLogController {\n\tprivate static Logger logger = LoggerFactory.getLogger(JobLogController.class);\n\n\t@Resource\n\tprivate XxlJobGroupDao xxlJobGroupDao;\n\t@Resource\n\tpublic XxlJobInfoDao xxlJobInfoDao;\n\t@Resource\n\tpublic XxlJobLogDao xxlJobLogDao;\n\n\t@RequestMapping\n\tpublic String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = \"0\") Integer jobId) {\n\n\t\t// 执行器列表\n\t\tList<XxlJobGroup> jobGroupList_all =  xxlJobGroupDao.findAll();\n\n\t\t// filter group\n\t\tList<XxlJobGroup> jobGroupList = JobInfoController.filterJobGroupByRole(request, jobGroupList_all);\n\t\tif (jobGroupList==null || jobGroupList.size()==0) {\n\t\t\tthrow new XxlJobException(I18nUtil.getString(\"jobgroup_empty\"));\n\t\t}\n\n\t\tmodel.addAttribute(\"JobGroupList\", jobGroupList);\n\n\t\t// 任务\n\t\tif (jobId > 0) {\n\t\t\tXxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId);\n\t\t\tif (jobInfo == null) {\n\t\t\t\tthrow new RuntimeException(I18nUtil.getString(\"jobinfo_field_id\") + I18nUtil.getString(\"system_unvalid\"));\n\t\t\t}\n\n\t\t\tmodel.addAttribute(\"jobInfo\", jobInfo);\n\n\t\t\t// valid permission\n\t\t\tJobInfoController.validPermission(request, jobInfo.getJobGroup());\n\t\t}\n\n\t\treturn \"joblog/joblog.index\";\n\t}\n\n\t@RequestMapping(\"/getJobsByGroup\")\n\t@ResponseBody\n\tpublic ReturnT<List<XxlJobInfo>> getJobsByGroup(int jobGroup){\n\t\tList<XxlJobInfo> list = xxlJobInfoDao.getJobsByGroup(jobGroup);\n\t\treturn new ReturnT<List<XxlJobInfo>>(list);\n\t}\n\t\n\t@RequestMapping(\"/pageList\")\n\t@ResponseBody\n\tpublic Map<String, Object> pageList(HttpServletRequest request,\n\t\t\t\t\t\t\t\t\t\t@RequestParam(required = false, defaultValue = \"0\") int start,\n\t\t\t\t\t\t\t\t\t\t@RequestParam(required = false, defaultValue = \"10\") int length,\n\t\t\t\t\t\t\t\t\t\tint jobGroup, int jobId, int logStatus, String filterTime) {\n\n\t\t// valid permission\n\t\tJobInfoController.validPermission(request, jobGroup);\t// 仅管理员支持查询全部；普通用户仅支持查询有权限的 jobGroup\n\t\t\n\t\t// parse param\n\t\tDate triggerTimeStart = null;\n\t\tDate triggerTimeEnd = null;\n\t\tif (filterTime!=null && filterTime.trim().length()>0) {\n\t\t\tString[] temp = filterTime.split(\" - \");\n\t\t\tif (temp.length == 2) {\n\t\t\t\ttriggerTimeStart = DateUtil.parseDateTime(temp[0]);\n\t\t\t\ttriggerTimeEnd = DateUtil.parseDateTime(temp[1]);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// page query\n\t\tList<XxlJobLog> list = xxlJobLogDao.pageList(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus);\n\t\tint list_count = xxlJobLogDao.pageListCount(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus);\n\t\t\n\t\t// package result\n\t\tMap<String, Object> maps = new HashMap<String, Object>();\n\t    maps.put(\"recordsTotal\", list_count);\t\t// 总记录数\n\t    maps.put(\"recordsFiltered\", list_count);\t// 过滤后的总记录数\n\t    maps.put(\"data\", list);  \t\t\t\t\t// 分页列表\n\t\treturn maps;\n\t}\n\n\t@RequestMapping(\"/logDetailPage\")\n\tpublic String logDetailPage(int id, Model model){\n\n\t\t// base check\n\t\tReturnT<String> logStatue = ReturnT.SUCCESS;\n\t\tXxlJobLog jobLog = xxlJobLogDao.load(id);\n\t\tif (jobLog == null) {\n            throw new RuntimeException(I18nUtil.getString(\"joblog_logid_unvalid\"));\n\t\t}\n\n        model.addAttribute(\"triggerCode\", jobLog.getTriggerCode());\n        model.addAttribute(\"handleCode\", jobLog.getHandleCode());\n        model.addAttribute(\"logId\", jobLog.getId());\n\t\treturn \"joblog/joblog.detail\";\n\t}\n\n\t@RequestMapping(\"/logDetailCat\")\n\t@ResponseBody\n\tpublic ReturnT<LogResult> logDetailCat(long logId, int fromLineNum){\n\t\ttry {\n\t\t\t// valid\n\t\t\tXxlJobLog jobLog = xxlJobLogDao.load(logId);\t// todo, need to improve performance\n\t\t\tif (jobLog == null) {\n\t\t\t\treturn new ReturnT<LogResult>(ReturnT.FAIL_CODE, I18nUtil.getString(\"joblog_logid_unvalid\"));\n\t\t\t}\n\n\t\t\t// log cat\n\t\t\tExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(jobLog.getExecutorAddress());\n\t\t\tReturnT<LogResult> logResult = executorBiz.log(new LogParam(jobLog.getTriggerTime().getTime(), logId, fromLineNum));\n\n\t\t\t// is end\n            if (logResult.getContent()!=null && logResult.getContent().getFromLineNum() > logResult.getContent().getToLineNum()) {\n                if (jobLog.getHandleCode() > 0) {\n                    logResult.getContent().setEnd(true);\n                }\n            }\n\n\t\t\t// fix xss\n\t\t\tif (logResult.getContent()!=null && StringUtils.hasText(logResult.getContent().getLogContent())) {\n\t\t\t\tString newLogContent = logResult.getContent().getLogContent();\n\t\t\t\tnewLogContent = HtmlUtils.htmlEscape(newLogContent, \"UTF-8\");\n\t\t\t\tlogResult.getContent().setLogContent(newLogContent);\n\t\t\t}\n\n\t\t\treturn logResult;\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(e.getMessage(), e);\n\t\t\treturn new ReturnT<LogResult>(ReturnT.FAIL_CODE, e.getMessage());\n\t\t}\n\t}\n\n\t@RequestMapping(\"/logKill\")\n\t@ResponseBody\n\tpublic ReturnT<String> logKill(int id){\n\t\t// base check\n\t\tXxlJobLog log = xxlJobLogDao.load(id);\n\t\tXxlJobInfo jobInfo = xxlJobInfoDao.loadById(log.getJobId());\n\t\tif (jobInfo==null) {\n\t\t\treturn new ReturnT<String>(500, I18nUtil.getString(\"jobinfo_glue_jobid_unvalid\"));\n\t\t}\n\t\tif (ReturnT.SUCCESS_CODE != log.getTriggerCode()) {\n\t\t\treturn new ReturnT<String>(500, I18nUtil.getString(\"joblog_kill_log_limit\"));\n\t\t}\n\n\t\t// request of kill\n\t\tReturnT<String> runResult = null;\n\t\ttry {\n\t\t\tExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(log.getExecutorAddress());\n\t\t\trunResult = executorBiz.kill(new KillParam(jobInfo.getId()));\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(e.getMessage(), e);\n\t\t\trunResult = new ReturnT<String>(500, e.getMessage());\n\t\t}\n\n\t\tif (ReturnT.SUCCESS_CODE == runResult.getCode()) {\n\t\t\tlog.setHandleCode(ReturnT.FAIL_CODE);\n\t\t\tlog.setHandleMsg( I18nUtil.getString(\"joblog_kill_log_byman\")+\":\" + (runResult.getMsg()!=null?runResult.getMsg():\"\"));\n\t\t\tlog.setHandleTime(new Date());\n\t\t\tXxlJobCompleter.updateHandleInfoAndFinish(log);\n\t\t\treturn new ReturnT<String>(runResult.getMsg());\n\t\t} else {\n\t\t\treturn new ReturnT<String>(500, runResult.getMsg());\n\t\t}\n\t}\n\n\t@RequestMapping(\"/clearLog\")\n\t@ResponseBody\n\tpublic ReturnT<String> clearLog(int jobGroup, int jobId, int type){\n\n\t\tDate clearBeforeTime = null;\n\t\tint clearBeforeNum = 0;\n\t\tif (type == 1) {\n\t\t\tclearBeforeTime = DateUtil.addMonths(new Date(), -1);\t// 清理一个月之前日志数据\n\t\t} else if (type == 2) {\n\t\t\tclearBeforeTime = DateUtil.addMonths(new Date(), -3);\t// 清理三个月之前日志数据\n\t\t} else if (type == 3) {\n\t\t\tclearBeforeTime = DateUtil.addMonths(new Date(), -6);\t// 清理六个月之前日志数据\n\t\t} else if (type == 4) {\n\t\t\tclearBeforeTime = DateUtil.addYears(new Date(), -1);\t// 清理一年之前日志数据\n\t\t} else if (type == 5) {\n\t\t\tclearBeforeNum = 1000;\t\t// 清理一千条以前日志数据\n\t\t} else if (type == 6) {\n\t\t\tclearBeforeNum = 10000;\t\t// 清理一万条以前日志数据\n\t\t} else if (type == 7) {\n\t\t\tclearBeforeNum = 30000;\t\t// 清理三万条以前日志数据\n\t\t} else if (type == 8) {\n\t\t\tclearBeforeNum = 100000;\t// 清理十万条以前日志数据\n\t\t} else if (type == 9) {\n\t\t\tclearBeforeNum = 0;\t\t\t// 清理所有日志数据\n\t\t} else {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString(\"joblog_clean_type_unvalid\"));\n\t\t}\n\n\t\tList<Long> logIds = null;\n\t\tdo {\n\t\t\tlogIds = xxlJobLogDao.findClearLogIds(jobGroup, jobId, clearBeforeTime, clearBeforeNum, 1000);\n\t\t\tif (logIds!=null && logIds.size()>0) {\n\t\t\t\txxlJobLogDao.clearLog(logIds);\n\t\t\t}\n\t\t} while (logIds!=null && logIds.size()>0);\n\n\t\treturn ReturnT.SUCCESS;\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/UserController.java",
    "content": "package com.xxl.job.admin.controller;\n\nimport com.xxl.job.admin.controller.annotation.PermissionLimit;\nimport com.xxl.job.admin.core.model.XxlJobGroup;\nimport com.xxl.job.admin.core.model.XxlJobUser;\nimport com.xxl.job.admin.core.util.I18nUtil;\nimport com.xxl.job.admin.dao.XxlJobGroupDao;\nimport com.xxl.job.admin.dao.XxlJobUserDao;\nimport com.xxl.job.admin.service.LoginService;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.util.DigestUtils;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.http.HttpServletRequest;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @author xuxueli 2019-05-04 16:39:50\n */\n@Controller\n@RequestMapping(\"/user\")\npublic class UserController {\n\n    @Resource\n    private XxlJobUserDao xxlJobUserDao;\n    @Resource\n    private XxlJobGroupDao xxlJobGroupDao;\n\n    @RequestMapping\n    @PermissionLimit(adminuser = true)\n    public String index(Model model) {\n\n        // 执行器列表\n        List<XxlJobGroup> groupList = xxlJobGroupDao.findAll();\n        model.addAttribute(\"groupList\", groupList);\n\n        return \"user/user.index\";\n    }\n\n    @RequestMapping(\"/pageList\")\n    @ResponseBody\n    @PermissionLimit(adminuser = true)\n    public Map<String, Object> pageList(@RequestParam(required = false, defaultValue = \"0\") int start,\n                                        @RequestParam(required = false, defaultValue = \"10\") int length,\n                                        String username, int role) {\n\n        // page list\n        List<XxlJobUser> list = xxlJobUserDao.pageList(start, length, username, role);\n        int list_count = xxlJobUserDao.pageListCount(start, length, username, role);\n\n        // filter\n        if (list!=null && list.size()>0) {\n            for (XxlJobUser item: list) {\n                item.setPassword(null);\n            }\n        }\n\n        // package result\n        Map<String, Object> maps = new HashMap<String, Object>();\n        maps.put(\"recordsTotal\", list_count);\t\t// 总记录数\n        maps.put(\"recordsFiltered\", list_count);\t// 过滤后的总记录数\n        maps.put(\"data\", list);  \t\t\t\t\t// 分页列表\n        return maps;\n    }\n\n    @RequestMapping(\"/add\")\n    @ResponseBody\n    @PermissionLimit(adminuser = true)\n    public ReturnT<String> add(XxlJobUser xxlJobUser) {\n\n        // valid username\n        if (!StringUtils.hasText(xxlJobUser.getUsername())) {\n            return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString(\"system_please_input\")+I18nUtil.getString(\"user_username\") );\n        }\n        xxlJobUser.setUsername(xxlJobUser.getUsername().trim());\n        if (!(xxlJobUser.getUsername().length()>=4 && xxlJobUser.getUsername().length()<=20)) {\n            return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString(\"system_lengh_limit\")+\"[4-20]\" );\n        }\n        // valid password\n        if (!StringUtils.hasText(xxlJobUser.getPassword())) {\n            return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString(\"system_please_input\")+I18nUtil.getString(\"user_password\") );\n        }\n        xxlJobUser.setPassword(xxlJobUser.getPassword().trim());\n        if (!(xxlJobUser.getPassword().length()>=4 && xxlJobUser.getPassword().length()<=20)) {\n            return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString(\"system_lengh_limit\")+\"[4-20]\" );\n        }\n        // md5 password\n        xxlJobUser.setPassword(DigestUtils.md5DigestAsHex(xxlJobUser.getPassword().getBytes()));\n\n        // check repeat\n        XxlJobUser existUser = xxlJobUserDao.loadByUserName(xxlJobUser.getUsername());\n        if (existUser != null) {\n            return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString(\"user_username_repeat\") );\n        }\n\n        // write\n        xxlJobUserDao.save(xxlJobUser);\n        return ReturnT.SUCCESS;\n    }\n\n    @RequestMapping(\"/update\")\n    @ResponseBody\n    @PermissionLimit(adminuser = true)\n    public ReturnT<String> update(HttpServletRequest request, XxlJobUser xxlJobUser) {\n\n        // avoid opt login seft\n        XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY);\n        if (loginUser.getUsername().equals(xxlJobUser.getUsername())) {\n            return new ReturnT<String>(ReturnT.FAIL.getCode(), I18nUtil.getString(\"user_update_loginuser_limit\"));\n        }\n\n        // valid password\n        if (StringUtils.hasText(xxlJobUser.getPassword())) {\n            xxlJobUser.setPassword(xxlJobUser.getPassword().trim());\n            if (!(xxlJobUser.getPassword().length()>=4 && xxlJobUser.getPassword().length()<=20)) {\n                return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString(\"system_lengh_limit\")+\"[4-20]\" );\n            }\n            // md5 password\n            xxlJobUser.setPassword(DigestUtils.md5DigestAsHex(xxlJobUser.getPassword().getBytes()));\n        } else {\n            xxlJobUser.setPassword(null);\n        }\n\n        // write\n        xxlJobUserDao.update(xxlJobUser);\n        return ReturnT.SUCCESS;\n    }\n\n    @RequestMapping(\"/remove\")\n    @ResponseBody\n    @PermissionLimit(adminuser = true)\n    public ReturnT<String> remove(HttpServletRequest request, int id) {\n\n        // avoid opt login seft\n        XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY);\n        if (loginUser.getId() == id) {\n            return new ReturnT<String>(ReturnT.FAIL.getCode(), I18nUtil.getString(\"user_update_loginuser_limit\"));\n        }\n\n        xxlJobUserDao.delete(id);\n        return ReturnT.SUCCESS;\n    }\n\n    @RequestMapping(\"/updatePwd\")\n    @ResponseBody\n    public ReturnT<String> updatePwd(HttpServletRequest request, String password){\n\n        // valid password\n        if (password==null || password.trim().length()==0){\n            return new ReturnT<String>(ReturnT.FAIL.getCode(), \"密码不可为空\");\n        }\n        password = password.trim();\n        if (!(password.length()>=4 && password.length()<=20)) {\n            return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString(\"system_lengh_limit\")+\"[4-20]\" );\n        }\n\n        // md5 password\n        String md5Password = DigestUtils.md5DigestAsHex(password.getBytes());\n\n        // update pwd\n        XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY);\n\n        // do write\n        XxlJobUser existUser = xxlJobUserDao.loadByUserName(loginUser.getUsername());\n        existUser.setPassword(md5Password);\n        xxlJobUserDao.update(existUser);\n\n        return ReturnT.SUCCESS;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java",
    "content": "package com.xxl.job.admin.controller.annotation;\n\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * 权限限制\n * @author xuxueli 2015-12-12 18:29:02\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface PermissionLimit {\n\t\n\t/**\n\t * 登录拦截 (默认拦截)\n\t */\n\tboolean limit() default true;\n\n\t/**\n\t * 要求管理员权限\n\t *\n\t * @return\n\t */\n\tboolean adminuser() default false;\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java",
    "content": "package com.xxl.job.admin.controller.interceptor;\n\nimport com.xxl.job.admin.core.util.FtlUtil;\nimport com.xxl.job.admin.core.util.I18nUtil;\nimport jakarta.servlet.http.Cookie;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.servlet.AsyncHandlerInterceptor;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport java.util.HashMap;\n\n/**\n * push cookies to model as cookieMap\n *\n * @author xuxueli 2015-12-12 18:09:04\n */\n@Component\npublic class CookieInterceptor implements AsyncHandlerInterceptor {\n\n\t@Override\n\tpublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,\n\t\t\t\t\t\t   ModelAndView modelAndView) throws Exception {\n\n\t\t// cookie\n\t\tif (modelAndView!=null && request.getCookies()!=null && request.getCookies().length>0) {\n\t\t\tHashMap<String, Cookie> cookieMap = new HashMap<String, Cookie>();\n\t\t\tfor (Cookie ck : request.getCookies()) {\n\t\t\t\tcookieMap.put(ck.getName(), ck);\n\t\t\t}\n\t\t\tmodelAndView.addObject(\"cookieMap\", cookieMap);\n\t\t}\n\n\t\t// static method\n\t\tif (modelAndView != null) {\n\t\t\tmodelAndView.addObject(\"I18nUtil\", FtlUtil.generateStaticModel(I18nUtil.class.getName()));\n\t\t}\n\n\t}\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java",
    "content": "package com.xxl.job.admin.controller.interceptor;\n\nimport com.xxl.job.admin.controller.annotation.PermissionLimit;\nimport com.xxl.job.admin.core.model.XxlJobUser;\nimport com.xxl.job.admin.core.util.I18nUtil;\nimport com.xxl.job.admin.service.LoginService;\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.method.HandlerMethod;\nimport org.springframework.web.servlet.AsyncHandlerInterceptor;\n\n\n/**\n * 权限拦截\n *\n * @author xuxueli 2015-12-12 18:09:04\n */\n@Component\npublic class PermissionInterceptor implements AsyncHandlerInterceptor {\n\n\t@Resource\n\tprivate LoginService loginService;\n\n\t@Override\n\tpublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {\n\t\t\n\t\tif (!(handler instanceof HandlerMethod)) {\n\t\t\treturn true;\t// proceed with the next interceptor\n\t\t}\n\n\t\t// if need login\n\t\tboolean needLogin = true;\n\t\tboolean needAdminuser = false;\n\t\tHandlerMethod method = (HandlerMethod)handler;\n\t\tPermissionLimit permission = method.getMethodAnnotation(PermissionLimit.class);\n\t\tif (permission!=null) {\n\t\t\tneedLogin = permission.limit();\n\t\t\tneedAdminuser = permission.adminuser();\n\t\t}\n\n\t\tif (needLogin) {\n\t\t\tXxlJobUser loginUser = loginService.ifLogin(request, response);\n\t\t\tif (loginUser == null) {\n\t\t\t\tresponse.setStatus(302);\n\t\t\t\tresponse.setHeader(\"location\", request.getContextPath()+\"/toLogin\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (needAdminuser && loginUser.getRole()!=1) {\n\t\t\t\tthrow new RuntimeException(I18nUtil.getString(\"system_permission_limit\"));\n\t\t\t}\n\t\t\trequest.setAttribute(LoginService.LOGIN_IDENTITY_KEY, loginUser);\n\t\t}\n\n\t\treturn true;\t// proceed with the next interceptor\n\t}\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/interceptor/WebMvcConfig.java",
    "content": "package com.xxl.job.admin.controller.interceptor;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.web.servlet.config.annotation.InterceptorRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\n\nimport jakarta.annotation.Resource;\n\n/**\n * web mvc config\n *\n * @author xuxueli 2018-04-02 20:48:20\n */\n@Configuration\npublic class WebMvcConfig implements WebMvcConfigurer {\n\n    @Resource\n    private PermissionInterceptor permissionInterceptor;\n    @Resource\n    private CookieInterceptor cookieInterceptor;\n\n    @Override\n    public void addInterceptors(InterceptorRegistry registry) {\n        registry.addInterceptor(permissionInterceptor).addPathPatterns(\"/**\");\n        registry.addInterceptor(cookieInterceptor).addPathPatterns(\"/**\");\n    }\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/controller/resolver/WebExceptionResolver.java",
    "content": "package com.xxl.job.admin.controller.resolver;\n\nimport com.xxl.job.admin.core.exception.XxlJobException;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.admin.core.util.JacksonUtil;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.bind.annotation.ResponseBody;\nimport org.springframework.web.method.HandlerMethod;\nimport org.springframework.web.servlet.HandlerExceptionResolver;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\n\n/**\n * common exception resolver\n *\n * @author xuxueli 2016-1-6 19:22:18\n */\n@Component\npublic class WebExceptionResolver implements HandlerExceptionResolver {\n\tprivate static transient Logger logger = LoggerFactory.getLogger(WebExceptionResolver.class);\n\n\t@Override\n\tpublic ModelAndView resolveException(HttpServletRequest request,\n\t\t\tHttpServletResponse response, Object handler, Exception ex) {\n\n\t\tif (!(ex instanceof XxlJobException)) {\n\t\t\tlogger.error(\"WebExceptionResolver:{}\", ex);\n\t\t}\n\n\t\t// if json\n\t\tboolean isJson = false;\n\t\tif (handler instanceof HandlerMethod) {\n\t\t\tHandlerMethod method = (HandlerMethod)handler;\n\t\t\tResponseBody responseBody = method.getMethodAnnotation(ResponseBody.class);\n\t\t\tif (responseBody != null) {\n\t\t\t\tisJson = true;\n\t\t\t}\n\t\t}\n\n\t\t// error result\n\t\tReturnT<String> errorResult = new ReturnT<String>(ReturnT.FAIL_CODE, ex.toString().replaceAll(\"\\n\", \"<br/>\"));\n\n\t\t// response\n\t\tModelAndView mv = new ModelAndView();\n\t\tif (isJson) {\n\t\t\ttry {\n\t\t\t\tresponse.setContentType(\"application/json;charset=utf-8\");\n\t\t\t\tresponse.getWriter().print(JacksonUtil.writeValueAsString(errorResult));\n\t\t\t} catch (IOException e) {\n\t\t\t\tlogger.error(e.getMessage(), e);\n\t\t\t}\n\t\t\treturn mv;\n\t\t} else {\n\n\t\t\tmv.addObject(\"exceptionMsg\", errorResult.getMsg());\n\t\t\tmv.setViewName(\"/common/common.exception\");\n\t\t\treturn mv;\n\t\t}\n\t}\n\t\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/alarm/JobAlarm.java",
    "content": "package com.xxl.job.admin.core.alarm;\n\nimport com.xxl.job.admin.core.model.XxlJobInfo;\nimport com.xxl.job.admin.core.model.XxlJobLog;\n\n/**\n * @author xuxueli 2020-01-19\n */\npublic interface JobAlarm {\n\n    /**\n     * job alarm\n     *\n     * @param info\n     * @param jobLog\n     * @return\n     */\n    public boolean doAlarm(XxlJobInfo info, XxlJobLog jobLog);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/alarm/JobAlarmer.java",
    "content": "package com.xxl.job.admin.core.alarm;\n\nimport com.xxl.job.admin.core.model.XxlJobInfo;\nimport com.xxl.job.admin.core.model.XxlJobLog;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.BeansException;\nimport org.springframework.beans.factory.InitializingBean;\nimport org.springframework.context.ApplicationContext;\nimport org.springframework.context.ApplicationContextAware;\nimport org.springframework.stereotype.Component;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\n\n@Component\npublic class JobAlarmer implements ApplicationContextAware, InitializingBean {\n    private static Logger logger = LoggerFactory.getLogger(JobAlarmer.class);\n\n    private ApplicationContext applicationContext;\n    private List<JobAlarm> jobAlarmList;\n\n    @Override\n    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {\n        this.applicationContext = applicationContext;\n    }\n\n    @Override\n    public void afterPropertiesSet() throws Exception {\n        Map<String, JobAlarm> serviceBeanMap = applicationContext.getBeansOfType(JobAlarm.class);\n        if (serviceBeanMap != null && serviceBeanMap.size() > 0) {\n            jobAlarmList = new ArrayList<JobAlarm>(serviceBeanMap.values());\n        }\n    }\n\n    /**\n     * job alarm\n     *\n     * @param info\n     * @param jobLog\n     * @return\n     */\n    public boolean alarm(XxlJobInfo info, XxlJobLog jobLog) {\n\n        boolean result = false;\n        if (jobAlarmList!=null && jobAlarmList.size()>0) {\n            result = true;  // success means all-success\n            for (JobAlarm alarm: jobAlarmList) {\n                boolean resultItem = false;\n                try {\n                    resultItem = alarm.doAlarm(info, jobLog);\n                } catch (Exception e) {\n                    logger.error(e.getMessage(), e);\n                }\n                if (!resultItem) {\n                    result = false;\n                }\n            }\n        }\n\n        return result;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java",
    "content": "package com.xxl.job.admin.core.alarm.impl;\n\nimport com.xxl.job.admin.core.alarm.JobAlarm;\nimport com.xxl.job.admin.core.conf.XxlJobAdminConfig;\nimport com.xxl.job.admin.core.model.XxlJobGroup;\nimport com.xxl.job.admin.core.model.XxlJobInfo;\nimport com.xxl.job.admin.core.model.XxlJobLog;\nimport com.xxl.job.admin.core.util.I18nUtil;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.mail.javamail.MimeMessageHelper;\nimport org.springframework.stereotype.Component;\n\nimport jakarta.mail.internet.MimeMessage;\nimport java.text.MessageFormat;\nimport java.util.Arrays;\nimport java.util.HashSet;\nimport java.util.Set;\n\n/**\n * job alarm by email\n *\n * @author xuxueli 2020-01-19\n */\n@Component\npublic class EmailJobAlarm implements JobAlarm {\n    private static Logger logger = LoggerFactory.getLogger(EmailJobAlarm.class);\n\n    /**\n     * fail alarm\n     *\n     * @param jobLog\n     */\n    @Override\n    public boolean doAlarm(XxlJobInfo info, XxlJobLog jobLog){\n        boolean alarmResult = true;\n\n        // send monitor email\n        if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) {\n\n            // alarmContent\n            String alarmContent = \"Alarm Job LogId=\" + jobLog.getId();\n            if (jobLog.getTriggerCode() != ReturnT.SUCCESS_CODE) {\n                alarmContent += \"<br>TriggerMsg=<br>\" + jobLog.getTriggerMsg();\n            }\n            if (jobLog.getHandleCode()>0 && jobLog.getHandleCode() != ReturnT.SUCCESS_CODE) {\n                alarmContent += \"<br>HandleCode=\" + jobLog.getHandleMsg();\n            }\n\n            // email info\n            XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().load(Integer.valueOf(info.getJobGroup()));\n            String personal = I18nUtil.getString(\"admin_name_full\");\n            String title = I18nUtil.getString(\"jobconf_monitor\");\n            String content = MessageFormat.format(loadEmailJobAlarmTemplate(),\n                    group!=null?group.getTitle():\"null\",\n                    info.getId(),\n                    info.getJobDesc(),\n                    alarmContent);\n\n            Set<String> emailSet = new HashSet<String>(Arrays.asList(info.getAlarmEmail().split(\",\")));\n            for (String email: emailSet) {\n\n                // make mail\n                try {\n                    MimeMessage mimeMessage = XxlJobAdminConfig.getAdminConfig().getMailSender().createMimeMessage();\n\n                    MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);\n                    helper.setFrom(XxlJobAdminConfig.getAdminConfig().getEmailFrom(), personal);\n                    helper.setTo(email);\n                    helper.setSubject(title);\n                    helper.setText(content, true);\n\n                    XxlJobAdminConfig.getAdminConfig().getMailSender().send(mimeMessage);\n                } catch (Exception e) {\n                    logger.error(\">>>>>>>>>>> xxl-job, job fail alarm email send error, JobLogId:{}\", jobLog.getId(), e);\n\n                    alarmResult = false;\n                }\n\n            }\n        }\n\n        return alarmResult;\n    }\n\n    /**\n     * load email job alarm template\n     *\n     * @return\n     */\n    private static final String loadEmailJobAlarmTemplate(){\n        String mailBodyTemplate = \"<h5>\" + I18nUtil.getString(\"jobconf_monitor_detail\") + \"：</span>\" +\n                \"<table border=\\\"1\\\" cellpadding=\\\"3\\\" style=\\\"border-collapse:collapse; width:80%;\\\" >\\n\" +\n                \"   <thead style=\\\"font-weight: bold;color: #ffffff;background-color: #ff8c00;\\\" >\" +\n                \"      <tr>\\n\" +\n                \"         <td width=\\\"20%\\\" >\"+ I18nUtil.getString(\"jobinfo_field_jobgroup\") +\"</td>\\n\" +\n                \"         <td width=\\\"10%\\\" >\"+ I18nUtil.getString(\"jobinfo_field_id\") +\"</td>\\n\" +\n                \"         <td width=\\\"20%\\\" >\"+ I18nUtil.getString(\"jobinfo_field_jobdesc\") +\"</td>\\n\" +\n                \"         <td width=\\\"10%\\\" >\"+ I18nUtil.getString(\"jobconf_monitor_alarm_title\") +\"</td>\\n\" +\n                \"         <td width=\\\"40%\\\" >\"+ I18nUtil.getString(\"jobconf_monitor_alarm_content\") +\"</td>\\n\" +\n                \"      </tr>\\n\" +\n                \"   </thead>\\n\" +\n                \"   <tbody>\\n\" +\n                \"      <tr>\\n\" +\n                \"         <td>{0}</td>\\n\" +\n                \"         <td>{1}</td>\\n\" +\n                \"         <td>{2}</td>\\n\" +\n                \"         <td>\"+ I18nUtil.getString(\"jobconf_monitor_alarm_type\") +\"</td>\\n\" +\n                \"         <td>{3}</td>\\n\" +\n                \"      </tr>\\n\" +\n                \"   </tbody>\\n\" +\n                \"</table>\";\n\n        return mailBodyTemplate;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java",
    "content": "package com.xxl.job.admin.core.complete;\n\nimport com.xxl.job.admin.core.conf.XxlJobAdminConfig;\nimport com.xxl.job.admin.core.model.XxlJobInfo;\nimport com.xxl.job.admin.core.model.XxlJobLog;\nimport com.xxl.job.admin.core.thread.JobTriggerPoolHelper;\nimport com.xxl.job.admin.core.trigger.TriggerTypeEnum;\nimport com.xxl.job.admin.core.util.I18nUtil;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.context.XxlJobContext;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport java.text.MessageFormat;\n\n/**\n * @author xuxueli 2020-10-30 20:43:10\n */\npublic class XxlJobCompleter {\n    private static Logger logger = LoggerFactory.getLogger(XxlJobCompleter.class);\n\n    /**\n     * common fresh handle entrance (limit only once)\n     *\n     * @param xxlJobLog\n     * @return\n     */\n    public static int updateHandleInfoAndFinish(XxlJobLog xxlJobLog) {\n\n        // finish\n        finishJob(xxlJobLog);\n\n        // text最大64kb 避免长度过长\n        if (xxlJobLog.getHandleMsg().length() > 15000) {\n            xxlJobLog.setHandleMsg( xxlJobLog.getHandleMsg().substring(0, 15000) );\n        }\n\n        // fresh handle\n        return XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateHandleInfo(xxlJobLog);\n    }\n\n\n    /**\n     * do somethind to finish job\n     */\n    private static void finishJob(XxlJobLog xxlJobLog){\n\n        // 1、handle success, to trigger child job\n        String triggerChildMsg = null;\n        if (XxlJobContext.HANDLE_CODE_SUCCESS == xxlJobLog.getHandleCode()) {\n            XxlJobInfo xxlJobInfo = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(xxlJobLog.getJobId());\n            if (xxlJobInfo!=null && xxlJobInfo.getChildJobId()!=null && xxlJobInfo.getChildJobId().trim().length()>0) {\n                triggerChildMsg = \"<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>\"+ I18nUtil.getString(\"jobconf_trigger_child_run\") +\"<<<<<<<<<<< </span><br>\";\n\n                String[] childJobIds = xxlJobInfo.getChildJobId().split(\",\");\n                for (int i = 0; i < childJobIds.length; i++) {\n                    int childJobId = (childJobIds[i]!=null && childJobIds[i].trim().length()>0 && isNumeric(childJobIds[i]))?Integer.valueOf(childJobIds[i]):-1;\n                    if (childJobId > 0) {\n\n                        JobTriggerPoolHelper.trigger(childJobId, TriggerTypeEnum.PARENT, -1, null, null, null);\n                        ReturnT<String> triggerChildResult = ReturnT.SUCCESS;\n\n                        // add msg\n                        triggerChildMsg += MessageFormat.format(I18nUtil.getString(\"jobconf_callback_child_msg1\"),\n                                (i+1),\n                                childJobIds.length,\n                                childJobIds[i],\n                                (triggerChildResult.getCode()==ReturnT.SUCCESS_CODE?I18nUtil.getString(\"system_success\"):I18nUtil.getString(\"system_fail\")),\n                                triggerChildResult.getMsg());\n                    } else {\n                        triggerChildMsg += MessageFormat.format(I18nUtil.getString(\"jobconf_callback_child_msg2\"),\n                                (i+1),\n                                childJobIds.length,\n                                childJobIds[i]);\n                    }\n                }\n\n            }\n        }\n\n        if (triggerChildMsg != null) {\n            xxlJobLog.setHandleMsg( xxlJobLog.getHandleMsg() + triggerChildMsg );\n        }\n\n        // 2、fix_delay trigger next\n        // on the way\n\n    }\n\n    private static boolean isNumeric(String str){\n        try {\n            int result = Integer.valueOf(str);\n            return true;\n        } catch (NumberFormatException e) {\n            return false;\n        }\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java",
    "content": "package com.xxl.job.admin.core.conf;\n\nimport com.xxl.job.admin.core.alarm.JobAlarmer;\nimport com.xxl.job.admin.core.scheduler.XxlJobScheduler;\nimport com.xxl.job.admin.dao.*;\nimport org.springframework.beans.factory.DisposableBean;\nimport org.springframework.beans.factory.InitializingBean;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.mail.javamail.JavaMailSender;\nimport org.springframework.stereotype.Component;\n\nimport jakarta.annotation.Resource;\nimport javax.sql.DataSource;\nimport java.util.Arrays;\n\n/**\n * xxl-job config\n *\n * @author xuxueli 2017-04-28\n */\n\n@Component\npublic class XxlJobAdminConfig implements InitializingBean, DisposableBean {\n\n    private static XxlJobAdminConfig adminConfig = null;\n    public static XxlJobAdminConfig getAdminConfig() {\n        return adminConfig;\n    }\n\n\n    // ---------------------- XxlJobScheduler ----------------------\n\n    private XxlJobScheduler xxlJobScheduler;\n\n    @Override\n    public void afterPropertiesSet() throws Exception {\n        adminConfig = this;\n\n        xxlJobScheduler = new XxlJobScheduler();\n        xxlJobScheduler.init();\n    }\n\n    @Override\n    public void destroy() throws Exception {\n        xxlJobScheduler.destroy();\n    }\n\n\n    // ---------------------- XxlJobScheduler ----------------------\n\n    // conf\n    @Value(\"${xxl.job.i18n}\")\n    private String i18n;\n\n    @Value(\"${xxl.job.accessToken}\")\n    private String accessToken;\n\n    @Value(\"${spring.mail.from}\")\n    private String emailFrom;\n\n    @Value(\"${xxl.job.triggerpool.fast.max}\")\n    private int triggerPoolFastMax;\n\n    @Value(\"${xxl.job.triggerpool.slow.max}\")\n    private int triggerPoolSlowMax;\n\n    @Value(\"${xxl.job.logretentiondays}\")\n    private int logretentiondays;\n\n    // dao, service\n\n    @Resource\n    private XxlJobLogDao xxlJobLogDao;\n    @Resource\n    private XxlJobInfoDao xxlJobInfoDao;\n    @Resource\n    private XxlJobRegistryDao xxlJobRegistryDao;\n    @Resource\n    private XxlJobGroupDao xxlJobGroupDao;\n    @Resource\n    private XxlJobLogReportDao xxlJobLogReportDao;\n    @Resource\n    private JavaMailSender mailSender;\n    @Resource\n    private DataSource dataSource;\n    @Resource\n    private JobAlarmer jobAlarmer;\n\n\n    public String getI18n() {\n        if (!Arrays.asList(\"zh_CN\", \"zh_TC\", \"en\").contains(i18n)) {\n            return \"zh_CN\";\n        }\n        return i18n;\n    }\n\n    public String getAccessToken() {\n        return accessToken;\n    }\n\n    public String getEmailFrom() {\n        return emailFrom;\n    }\n\n    public int getTriggerPoolFastMax() {\n        if (triggerPoolFastMax < 200) {\n            return 200;\n        }\n        return triggerPoolFastMax;\n    }\n\n    public int getTriggerPoolSlowMax() {\n        if (triggerPoolSlowMax < 100) {\n            return 100;\n        }\n        return triggerPoolSlowMax;\n    }\n\n    public int getLogretentiondays() {\n        if (logretentiondays < 7) {\n            return -1;  // Limit greater than or equal to 7, otherwise close\n        }\n        return logretentiondays;\n    }\n\n    public XxlJobLogDao getXxlJobLogDao() {\n        return xxlJobLogDao;\n    }\n\n    public XxlJobInfoDao getXxlJobInfoDao() {\n        return xxlJobInfoDao;\n    }\n\n    public XxlJobRegistryDao getXxlJobRegistryDao() {\n        return xxlJobRegistryDao;\n    }\n\n    public XxlJobGroupDao getXxlJobGroupDao() {\n        return xxlJobGroupDao;\n    }\n\n    public XxlJobLogReportDao getXxlJobLogReportDao() {\n        return xxlJobLogReportDao;\n    }\n\n    public JavaMailSender getMailSender() {\n        return mailSender;\n    }\n\n    public DataSource getDataSource() {\n        return dataSource;\n    }\n\n    public JobAlarmer getJobAlarmer() {\n        return jobAlarmer;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java",
    "content": "/*\n * All content copyright Terracotta, Inc., unless otherwise indicated. All rights reserved.\n * \n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not \n * use this file except in compliance with the License. You may obtain a copy \n * of the License at \n * \n *   http://www.apache.org/licenses/LICENSE-2.0 \n *   \n * Unless required by applicable law or agreed to in writing, software \n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT \n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the \n * License for the specific language governing permissions and limitations \n * under the License.\n * \n */\n\npackage com.xxl.job.admin.core.cron;\n\nimport java.io.Serializable;\nimport java.text.ParseException;\nimport java.util.Calendar;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.Locale;\nimport java.util.Map;\nimport java.util.SortedSet;\nimport java.util.StringTokenizer;\nimport java.util.TimeZone;\nimport java.util.TreeSet;\n\n/**\n * Provides a parser and evaluator for unix-like cron expressions. Cron \n * expressions provide the ability to specify complex time combinations such as\n * &quot;At 8:00am every Monday through Friday&quot; or &quot;At 1:30am every \n * last Friday of the month&quot;. \n * <P>\n * Cron expressions are comprised of 6 required fields and one optional field\n * separated by white space. The fields respectively are described as follows:\n * \n * <table cellspacing=\"8\">\n * <tr>\n * <th align=\"left\">Field Name</th>\n * <th align=\"left\">&nbsp;</th>\n * <th align=\"left\">Allowed Values</th>\n * <th align=\"left\">&nbsp;</th>\n * <th align=\"left\">Allowed Special Characters</th>\n * </tr>\n * <tr>\n * <td align=\"left\"><code>Seconds</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>0-59</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>, - * /</code></td>\n * </tr>\n * <tr>\n * <td align=\"left\"><code>Minutes</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>0-59</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>, - * /</code></td>\n * </tr>\n * <tr>\n * <td align=\"left\"><code>Hours</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>0-23</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>, - * /</code></td>\n * </tr>\n * <tr>\n * <td align=\"left\"><code>Day-of-month</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>1-31</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>, - * ? / L W</code></td>\n * </tr>\n * <tr>\n * <td align=\"left\"><code>Month</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>0-11 or JAN-DEC</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>, - * /</code></td>\n * </tr>\n * <tr>\n * <td align=\"left\"><code>Day-of-Week</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>1-7 or SUN-SAT</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>, - * ? / L #</code></td>\n * </tr>\n * <tr>\n * <td align=\"left\"><code>Year (Optional)</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>empty, 1970-2199</code></td>\n * <td align=\"left\">&nbsp;</th>\n * <td align=\"left\"><code>, - * /</code></td>\n * </tr>\n * </table>\n * <P>\n * The '*' character is used to specify all values. For example, &quot;*&quot; \n * in the minute field means &quot;every minute&quot;.\n * <P>\n * The '?' character is allowed for the day-of-month and day-of-week fields. It\n * is used to specify 'no specific value'. This is useful when you need to\n * specify something in one of the two fields, but not the other.\n * <P>\n * The '-' character is used to specify ranges For example &quot;10-12&quot; in\n * the hour field means &quot;the hours 10, 11 and 12&quot;.\n * <P>\n * The ',' character is used to specify additional values. For example\n * &quot;MON,WED,FRI&quot; in the day-of-week field means &quot;the days Monday,\n * Wednesday, and Friday&quot;.\n * <P>\n * The '/' character is used to specify increments. For example &quot;0/15&quot;\n * in the seconds field means &quot;the seconds 0, 15, 30, and 45&quot;. And \n * &quot;5/15&quot; in the seconds field means &quot;the seconds 5, 20, 35, and\n * 50&quot;.  Specifying '*' before the  '/' is equivalent to specifying 0 is\n * the value to start with. Essentially, for each field in the expression, there\n * is a set of numbers that can be turned on or off. For seconds and minutes, \n * the numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to\n * 31, and for months 0 to 11 (JAN to DEC). The &quot;/&quot; character simply helps you turn\n * on every &quot;nth&quot; value in the given set. Thus &quot;7/6&quot; in the\n * month field only turns on month &quot;7&quot;, it does NOT mean every 6th \n * month, please note that subtlety.  \n * <P>\n * The 'L' character is allowed for the day-of-month and day-of-week fields.\n * This character is short-hand for &quot;last&quot;, but it has different \n * meaning in each of the two fields. For example, the value &quot;L&quot; in \n * the day-of-month field means &quot;the last day of the month&quot; - day 31 \n * for January, day 28 for February on non-leap years. If used in the \n * day-of-week field by itself, it simply means &quot;7&quot; or \n * &quot;SAT&quot;. But if used in the day-of-week field after another value, it\n * means &quot;the last xxx day of the month&quot; - for example &quot;6L&quot;\n * means &quot;the last friday of the month&quot;. You can also specify an offset \n * from the last day of the month, such as \"L-3\" which would mean the third-to-last \n * day of the calendar month. <i>When using the 'L' option, it is important not to \n * specify lists, or ranges of values, as you'll get confusing/unexpected results.</i>\n * <P>\n * The 'W' character is allowed for the day-of-month field.  This character \n * is used to specify the weekday (Monday-Friday) nearest the given day.  As an \n * example, if you were to specify &quot;15W&quot; as the value for the \n * day-of-month field, the meaning is: &quot;the nearest weekday to the 15th of\n * the month&quot;. So if the 15th is a Saturday, the trigger will fire on \n * Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the\n * 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. \n * However if you specify &quot;1W&quot; as the value for day-of-month, and the\n * 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not \n * 'jump' over the boundary of a month's days.  The 'W' character can only be \n * specified when the day-of-month is a single day, not a range or list of days.\n * <P>\n * The 'L' and 'W' characters can also be combined for the day-of-month \n * expression to yield 'LW', which translates to &quot;last weekday of the \n * month&quot;.\n * <P>\n * The '#' character is allowed for the day-of-week field. This character is\n * used to specify &quot;the nth&quot; XXX day of the month. For example, the \n * value of &quot;6#3&quot; in the day-of-week field means the third Friday of \n * the month (day 6 = Friday and &quot;#3&quot; = the 3rd one in the month). \n * Other examples: &quot;2#1&quot; = the first Monday of the month and \n * &quot;4#5&quot; = the fifth Wednesday of the month. Note that if you specify\n * &quot;#5&quot; and there is not 5 of the given day-of-week in the month, then\n * no firing will occur that month.  If the '#' character is used, there can\n * only be one expression in the day-of-week field (&quot;3#1,6#3&quot; is \n * not valid, since there are two expressions).\n * <P>\n * <!--The 'C' character is allowed for the day-of-month and day-of-week fields.\n * This character is short-hand for \"calendar\". This means values are\n * calculated against the associated calendar, if any. If no calendar is\n * associated, then it is equivalent to having an all-inclusive calendar. A\n * value of \"5C\" in the day-of-month field means \"the first day included by the\n * calendar on or after the 5th\". A value of \"1C\" in the day-of-week field\n * means \"the first day included by the calendar on or after Sunday\".-->\n * <P>\n * The legal characters and the names of months and days of the week are not\n * case sensitive.\n * \n * <p>\n * <b>NOTES:</b>\n * <ul>\n * <li>Support for specifying both a day-of-week and a day-of-month value is\n * not complete (you'll need to use the '?' character in one of these fields).\n * </li>\n * <li>Overflowing ranges is supported - that is, having a larger number on \n * the left hand side than the right. You might do 22-2 to catch 10 o'clock \n * at night until 2 o'clock in the morning, or you might have NOV-FEB. It is \n * very important to note that overuse of overflowing ranges creates ranges \n * that don't make sense and no effort has been made to determine which \n * interpretation CronExpression chooses. An example would be \n * \"0 0 14-6 ? * FRI-MON\". </li>\n * </ul>\n * </p>\n * \n * \n * @author Sharada Jambula, James House\n * @author Contributions from Mads Henderson\n * @author Refactoring from CronTrigger to CronExpression by Aaron Craven\n *\n * Borrowed from quartz v2.3.1\n *\n */\npublic final class CronExpression implements Serializable, Cloneable {\n\n    private static final long serialVersionUID = 12423409423L;\n    \n    protected static final int SECOND = 0;\n    protected static final int MINUTE = 1;\n    protected static final int HOUR = 2;\n    protected static final int DAY_OF_MONTH = 3;\n    protected static final int MONTH = 4;\n    protected static final int DAY_OF_WEEK = 5;\n    protected static final int YEAR = 6;\n    protected static final int ALL_SPEC_INT = 99; // '*'\n    protected static final int NO_SPEC_INT = 98; // '?'\n    protected static final Integer ALL_SPEC = ALL_SPEC_INT;\n    protected static final Integer NO_SPEC = NO_SPEC_INT;\n    \n    protected static final Map<String, Integer> monthMap = new HashMap<String, Integer>(20);\n    protected static final Map<String, Integer> dayMap = new HashMap<String, Integer>(60);\n    static {\n        monthMap.put(\"JAN\", 0);\n        monthMap.put(\"FEB\", 1);\n        monthMap.put(\"MAR\", 2);\n        monthMap.put(\"APR\", 3);\n        monthMap.put(\"MAY\", 4);\n        monthMap.put(\"JUN\", 5);\n        monthMap.put(\"JUL\", 6);\n        monthMap.put(\"AUG\", 7);\n        monthMap.put(\"SEP\", 8);\n        monthMap.put(\"OCT\", 9);\n        monthMap.put(\"NOV\", 10);\n        monthMap.put(\"DEC\", 11);\n\n        dayMap.put(\"SUN\", 1);\n        dayMap.put(\"MON\", 2);\n        dayMap.put(\"TUE\", 3);\n        dayMap.put(\"WED\", 4);\n        dayMap.put(\"THU\", 5);\n        dayMap.put(\"FRI\", 6);\n        dayMap.put(\"SAT\", 7);\n    }\n\n    private final String cronExpression;\n    private TimeZone timeZone = null;\n    protected transient TreeSet<Integer> seconds;\n    protected transient TreeSet<Integer> minutes;\n    protected transient TreeSet<Integer> hours;\n    protected transient TreeSet<Integer> daysOfMonth;\n    protected transient TreeSet<Integer> months;\n    protected transient TreeSet<Integer> daysOfWeek;\n    protected transient TreeSet<Integer> years;\n\n    protected transient boolean lastdayOfWeek = false;\n    protected transient int nthdayOfWeek = 0;\n    protected transient boolean lastdayOfMonth = false;\n    protected transient boolean nearestWeekday = false;\n    protected transient int lastdayOffset = 0;\n    protected transient boolean expressionParsed = false;\n    \n    public static final int MAX_YEAR = Calendar.getInstance().get(Calendar.YEAR) + 100;\n\n    /**\n     * Constructs a new <CODE>CronExpression</CODE> based on the specified \n     * parameter.\n     * \n     * @param cronExpression String representation of the cron expression the\n     *                       new object should represent\n     * @throws ParseException\n     *         if the string expression cannot be parsed into a valid \n     *         <CODE>CronExpression</CODE>\n     */\n    public CronExpression(String cronExpression) throws ParseException {\n        if (cronExpression == null) {\n            throw new IllegalArgumentException(\"cronExpression cannot be null\");\n        }\n        \n        this.cronExpression = cronExpression.toUpperCase(Locale.US);\n        \n        buildExpression(this.cronExpression);\n    }\n    \n    /**\n     * Constructs a new {@code CronExpression} as a copy of an existing\n     * instance.\n     * \n     * @param expression\n     *            The existing cron expression to be copied\n     */\n    public CronExpression(CronExpression expression) {\n        /*\n         * We don't call the other constructor here since we need to swallow the\n         * ParseException. We also elide some of the sanity checking as it is\n         * not logically trippable.\n         */\n        this.cronExpression = expression.getCronExpression();\n        try {\n            buildExpression(cronExpression);\n        } catch (ParseException ex) {\n            throw new AssertionError();\n        }\n        if (expression.getTimeZone() != null) {\n            setTimeZone((TimeZone) expression.getTimeZone().clone());\n        }\n    }\n\n    /**\n     * Indicates whether the given date satisfies the cron expression. Note that\n     * milliseconds are ignored, so two Dates falling on different milliseconds\n     * of the same second will always have the same result here.\n     * \n     * @param date the date to evaluate\n     * @return a boolean indicating whether the given date satisfies the cron\n     *         expression\n     */\n    public boolean isSatisfiedBy(Date date) {\n        Calendar testDateCal = Calendar.getInstance(getTimeZone());\n        testDateCal.setTime(date);\n        testDateCal.set(Calendar.MILLISECOND, 0);\n        Date originalDate = testDateCal.getTime();\n        \n        testDateCal.add(Calendar.SECOND, -1);\n        \n        Date timeAfter = getTimeAfter(testDateCal.getTime());\n\n        return ((timeAfter != null) && (timeAfter.equals(originalDate)));\n    }\n    \n    /**\n     * Returns the next date/time <I>after</I> the given date/time which\n     * satisfies the cron expression.\n     * \n     * @param date the date/time at which to begin the search for the next valid\n     *             date/time\n     * @return the next valid date/time\n     */\n    public Date getNextValidTimeAfter(Date date) {\n        return getTimeAfter(date);\n    }\n    \n    /**\n     * Returns the next date/time <I>after</I> the given date/time which does\n     * <I>not</I> satisfy the expression\n     * \n     * @param date the date/time at which to begin the search for the next \n     *             invalid date/time\n     * @return the next valid date/time\n     */\n    public Date getNextInvalidTimeAfter(Date date) {\n        long difference = 1000;\n        \n        //move back to the nearest second so differences will be accurate\n        Calendar adjustCal = Calendar.getInstance(getTimeZone());\n        adjustCal.setTime(date);\n        adjustCal.set(Calendar.MILLISECOND, 0);\n        Date lastDate = adjustCal.getTime();\n        \n        Date newDate;\n        \n        //FUTURE_TODO: (QUARTZ-481) IMPROVE THIS! The following is a BAD solution to this problem. Performance will be very bad here, depending on the cron expression. It is, however A solution.\n        \n        //keep getting the next included time until it's farther than one second\n        // apart. At that point, lastDate is the last valid fire time. We return\n        // the second immediately following it.\n        while (difference == 1000) {\n            newDate = getTimeAfter(lastDate);\n            if(newDate == null)\n                break;\n            \n            difference = newDate.getTime() - lastDate.getTime();\n            \n            if (difference == 1000) {\n                lastDate = newDate;\n            }\n        }\n        \n        return new Date(lastDate.getTime() + 1000);\n    }\n    \n    /**\n     * Returns the time zone for which this <code>CronExpression</code> \n     * will be resolved.\n     */\n    public TimeZone getTimeZone() {\n        if (timeZone == null) {\n            timeZone = TimeZone.getDefault();\n        }\n\n        return timeZone;\n    }\n\n    /**\n     * Sets the time zone for which  this <code>CronExpression</code> \n     * will be resolved.\n     */\n    public void setTimeZone(TimeZone timeZone) {\n        this.timeZone = timeZone;\n    }\n    \n    /**\n     * Returns the string representation of the <CODE>CronExpression</CODE>\n     * \n     * @return a string representation of the <CODE>CronExpression</CODE>\n     */\n    @Override\n    public String toString() {\n        return cronExpression;\n    }\n\n    /**\n     * Indicates whether the specified cron expression can be parsed into a \n     * valid cron expression\n     * \n     * @param cronExpression the expression to evaluate\n     * @return a boolean indicating whether the given expression is a valid cron\n     *         expression\n     */\n    public static boolean isValidExpression(String cronExpression) {\n        \n        try {\n            new CronExpression(cronExpression);\n        } catch (ParseException pe) {\n            return false;\n        }\n        \n        return true;\n    }\n\n    public static void validateExpression(String cronExpression) throws ParseException {\n        \n        new CronExpression(cronExpression);\n    }\n    \n    \n    ////////////////////////////////////////////////////////////////////////////\n    //\n    // Expression Parsing Functions\n    //\n    ////////////////////////////////////////////////////////////////////////////\n\n    protected void buildExpression(String expression) throws ParseException {\n        expressionParsed = true;\n\n        try {\n\n            if (seconds == null) {\n                seconds = new TreeSet<Integer>();\n            }\n            if (minutes == null) {\n                minutes = new TreeSet<Integer>();\n            }\n            if (hours == null) {\n                hours = new TreeSet<Integer>();\n            }\n            if (daysOfMonth == null) {\n                daysOfMonth = new TreeSet<Integer>();\n            }\n            if (months == null) {\n                months = new TreeSet<Integer>();\n            }\n            if (daysOfWeek == null) {\n                daysOfWeek = new TreeSet<Integer>();\n            }\n            if (years == null) {\n                years = new TreeSet<Integer>();\n            }\n\n            int exprOn = SECOND;\n\n            StringTokenizer exprsTok = new StringTokenizer(expression, \" \\t\",\n                    false);\n\n            while (exprsTok.hasMoreTokens() && exprOn <= YEAR) {\n                String expr = exprsTok.nextToken().trim();\n\n                // throw an exception if L is used with other days of the month\n                if(exprOn == DAY_OF_MONTH && expr.indexOf('L') != -1 && expr.length() > 1 && expr.contains(\",\")) {\n                    throw new ParseException(\"Support for specifying 'L' and 'LW' with other days of the month is not implemented\", -1);\n                }\n                // throw an exception if L is used with other days of the week\n                if(exprOn == DAY_OF_WEEK && expr.indexOf('L') != -1 && expr.length() > 1  && expr.contains(\",\")) {\n                    throw new ParseException(\"Support for specifying 'L' with other days of the week is not implemented\", -1);\n                }\n                if(exprOn == DAY_OF_WEEK && expr.indexOf('#') != -1 && expr.indexOf('#', expr.indexOf('#') +1) != -1) {\n                    throw new ParseException(\"Support for specifying multiple \\\"nth\\\" days is not implemented.\", -1);\n                }\n                \n                StringTokenizer vTok = new StringTokenizer(expr, \",\");\n                while (vTok.hasMoreTokens()) {\n                    String v = vTok.nextToken();\n                    storeExpressionVals(0, v, exprOn);\n                }\n\n                exprOn++;\n            }\n\n            if (exprOn <= DAY_OF_WEEK) {\n                throw new ParseException(\"Unexpected end of expression.\",\n                            expression.length());\n            }\n\n            if (exprOn <= YEAR) {\n                storeExpressionVals(0, \"*\", YEAR);\n            }\n\n            TreeSet<Integer> dow = getSet(DAY_OF_WEEK);\n            TreeSet<Integer> dom = getSet(DAY_OF_MONTH);\n\n            // Copying the logic from the UnsupportedOperationException below\n            boolean dayOfMSpec = !dom.contains(NO_SPEC);\n            boolean dayOfWSpec = !dow.contains(NO_SPEC);\n\n            if (!dayOfMSpec || dayOfWSpec) {\n                if (!dayOfWSpec || dayOfMSpec) {\n                    throw new ParseException(\n                            \"Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.\", 0);\n                }\n            }\n        } catch (ParseException pe) {\n            throw pe;\n        } catch (Exception e) {\n            throw new ParseException(\"Illegal cron expression format (\"\n                    + e.toString() + \")\", 0);\n        }\n    }\n\n    protected int storeExpressionVals(int pos, String s, int type)\n        throws ParseException {\n\n        int incr = 0;\n        int i = skipWhiteSpace(pos, s);\n        if (i >= s.length()) {\n            return i;\n        }\n        char c = s.charAt(i);\n        if ((c >= 'A') && (c <= 'Z') && (!s.equals(\"L\")) && (!s.equals(\"LW\")) && (!s.matches(\"^L-[0-9]*[W]?\"))) {\n            String sub = s.substring(i, i + 3);\n            int sval = -1;\n            int eval = -1;\n            if (type == MONTH) {\n                sval = getMonthNumber(sub) + 1;\n                if (sval <= 0) {\n                    throw new ParseException(\"Invalid Month value: '\" + sub + \"'\", i);\n                }\n                if (s.length() > i + 3) {\n                    c = s.charAt(i + 3);\n                    if (c == '-') {\n                        i += 4;\n                        sub = s.substring(i, i + 3);\n                        eval = getMonthNumber(sub) + 1;\n                        if (eval <= 0) {\n                            throw new ParseException(\"Invalid Month value: '\" + sub + \"'\", i);\n                        }\n                    }\n                }\n            } else if (type == DAY_OF_WEEK) {\n                sval = getDayOfWeekNumber(sub);\n                if (sval < 0) {\n                    throw new ParseException(\"Invalid Day-of-Week value: '\"\n                                + sub + \"'\", i);\n                }\n                if (s.length() > i + 3) {\n                    c = s.charAt(i + 3);\n                    if (c == '-') {\n                        i += 4;\n                        sub = s.substring(i, i + 3);\n                        eval = getDayOfWeekNumber(sub);\n                        if (eval < 0) {\n                            throw new ParseException(\n                                    \"Invalid Day-of-Week value: '\" + sub\n                                        + \"'\", i);\n                        }\n                    } else if (c == '#') {\n                        try {\n                            i += 4;\n                            nthdayOfWeek = Integer.parseInt(s.substring(i));\n                            if (nthdayOfWeek < 1 || nthdayOfWeek > 5) {\n                                throw new Exception();\n                            }\n                        } catch (Exception e) {\n                            throw new ParseException(\n                                    \"A numeric value between 1 and 5 must follow the '#' option\",\n                                    i);\n                        }\n                    } else if (c == 'L') {\n                        lastdayOfWeek = true;\n                        i++;\n                    }\n                }\n\n            } else {\n                throw new ParseException(\n                        \"Illegal characters for this position: '\" + sub + \"'\",\n                        i);\n            }\n            if (eval != -1) {\n                incr = 1;\n            }\n            addToSet(sval, eval, incr, type);\n            return (i + 3);\n        }\n\n        if (c == '?') {\n            i++;\n            if ((i + 1) < s.length() \n                    && (s.charAt(i) != ' ' && s.charAt(i + 1) != '\\t')) {\n                throw new ParseException(\"Illegal character after '?': \"\n                            + s.charAt(i), i);\n            }\n            if (type != DAY_OF_WEEK && type != DAY_OF_MONTH) {\n                throw new ParseException(\n                            \"'?' can only be specified for Day-of-Month or Day-of-Week.\",\n                            i);\n            }\n            if (type == DAY_OF_WEEK && !lastdayOfMonth) {\n                int val = daysOfMonth.last();\n                if (val == NO_SPEC_INT) {\n                    throw new ParseException(\n                                \"'?' can only be specified for Day-of-Month -OR- Day-of-Week.\",\n                                i);\n                }\n            }\n\n            addToSet(NO_SPEC_INT, -1, 0, type);\n            return i;\n        }\n\n        if (c == '*' || c == '/') {\n            if (c == '*' && (i + 1) >= s.length()) {\n                addToSet(ALL_SPEC_INT, -1, incr, type);\n                return i + 1;\n            } else if (c == '/'\n                    && ((i + 1) >= s.length() || s.charAt(i + 1) == ' ' || s\n                            .charAt(i + 1) == '\\t')) { \n                throw new ParseException(\"'/' must be followed by an integer.\", i);\n            } else if (c == '*') {\n                i++;\n            }\n            c = s.charAt(i);\n            if (c == '/') { // is an increment specified?\n                i++;\n                if (i >= s.length()) {\n                    throw new ParseException(\"Unexpected end of string.\", i);\n                }\n\n                incr = getNumericValue(s, i);\n\n                i++;\n                if (incr > 10) {\n                    i++;\n                }\n                checkIncrementRange(incr, type, i);\n            } else {\n                incr = 1;\n            }\n\n            addToSet(ALL_SPEC_INT, -1, incr, type);\n            return i;\n        } else if (c == 'L') {\n            i++;\n            if (type == DAY_OF_MONTH) {\n                lastdayOfMonth = true;\n            }\n            if (type == DAY_OF_WEEK) {\n                addToSet(7, 7, 0, type);\n            }\n            if(type == DAY_OF_MONTH && s.length() > i) {\n                c = s.charAt(i);\n                if(c == '-') {\n                    ValueSet vs = getValue(0, s, i+1);\n                    lastdayOffset = vs.value;\n                    if(lastdayOffset > 30)\n                        throw new ParseException(\"Offset from last day must be <= 30\", i+1);\n                    i = vs.pos;\n                }                        \n                if(s.length() > i) {\n                    c = s.charAt(i);\n                    if(c == 'W') {\n                        nearestWeekday = true;\n                        i++;\n                    }\n                }\n            }\n            return i;\n        } else if (c >= '0' && c <= '9') {\n            int val = Integer.parseInt(String.valueOf(c));\n            i++;\n            if (i >= s.length()) {\n                addToSet(val, -1, -1, type);\n            } else {\n                c = s.charAt(i);\n                if (c >= '0' && c <= '9') {\n                    ValueSet vs = getValue(val, s, i);\n                    val = vs.value;\n                    i = vs.pos;\n                }\n                i = checkNext(i, s, val, type);\n                return i;\n            }\n        } else {\n            throw new ParseException(\"Unexpected character: \" + c, i);\n        }\n\n        return i;\n    }\n\n    private void checkIncrementRange(int incr, int type, int idxPos) throws ParseException {\n        if (incr > 59 && (type == SECOND || type == MINUTE)) {\n            throw new ParseException(\"Increment > 60 : \" + incr, idxPos);\n        } else if (incr > 23 && (type == HOUR)) {\n            throw new ParseException(\"Increment > 24 : \" + incr, idxPos);\n        } else if (incr > 31 && (type == DAY_OF_MONTH)) {\n            throw new ParseException(\"Increment > 31 : \" + incr, idxPos);\n        } else if (incr > 7 && (type == DAY_OF_WEEK)) {\n            throw new ParseException(\"Increment > 7 : \" + incr, idxPos);\n        } else if (incr > 12 && (type == MONTH)) {\n            throw new ParseException(\"Increment > 12 : \" + incr, idxPos);\n        }\n    }\n\n    protected int checkNext(int pos, String s, int val, int type)\n        throws ParseException {\n        \n        int end = -1;\n        int i = pos;\n\n        if (i >= s.length()) {\n            addToSet(val, end, -1, type);\n            return i;\n        }\n\n        char c = s.charAt(pos);\n\n        if (c == 'L') {\n            if (type == DAY_OF_WEEK) {\n                if(val < 1 || val > 7)\n                    throw new ParseException(\"Day-of-Week values must be between 1 and 7\", -1);\n                lastdayOfWeek = true;\n            } else {\n                throw new ParseException(\"'L' option is not valid here. (pos=\" + i + \")\", i);\n            }\n            TreeSet<Integer> set = getSet(type);\n            set.add(val);\n            i++;\n            return i;\n        }\n        \n        if (c == 'W') {\n            if (type == DAY_OF_MONTH) {\n                nearestWeekday = true;\n            } else {\n                throw new ParseException(\"'W' option is not valid here. (pos=\" + i + \")\", i);\n            }\n            if(val > 31)\n                throw new ParseException(\"The 'W' option does not make sense with values larger than 31 (max number of days in a month)\", i); \n            TreeSet<Integer> set = getSet(type);\n            set.add(val);\n            i++;\n            return i;\n        }\n\n        if (c == '#') {\n            if (type != DAY_OF_WEEK) {\n                throw new ParseException(\"'#' option is not valid here. (pos=\" + i + \")\", i);\n            }\n            i++;\n            try {\n                nthdayOfWeek = Integer.parseInt(s.substring(i));\n                if (nthdayOfWeek < 1 || nthdayOfWeek > 5) {\n                    throw new Exception();\n                }\n            } catch (Exception e) {\n                throw new ParseException(\n                        \"A numeric value between 1 and 5 must follow the '#' option\",\n                        i);\n            }\n\n            TreeSet<Integer> set = getSet(type);\n            set.add(val);\n            i++;\n            return i;\n        }\n\n        if (c == '-') {\n            i++;\n            c = s.charAt(i);\n            int v = Integer.parseInt(String.valueOf(c));\n            end = v;\n            i++;\n            if (i >= s.length()) {\n                addToSet(val, end, 1, type);\n                return i;\n            }\n            c = s.charAt(i);\n            if (c >= '0' && c <= '9') {\n                ValueSet vs = getValue(v, s, i);\n                end = vs.value;\n                i = vs.pos;\n            }\n            if (i < s.length() && ((c = s.charAt(i)) == '/')) {\n                i++;\n                c = s.charAt(i);\n                int v2 = Integer.parseInt(String.valueOf(c));\n                i++;\n                if (i >= s.length()) {\n                    addToSet(val, end, v2, type);\n                    return i;\n                }\n                c = s.charAt(i);\n                if (c >= '0' && c <= '9') {\n                    ValueSet vs = getValue(v2, s, i);\n                    int v3 = vs.value;\n                    addToSet(val, end, v3, type);\n                    i = vs.pos;\n                    return i;\n                } else {\n                    addToSet(val, end, v2, type);\n                    return i;\n                }\n            } else {\n                addToSet(val, end, 1, type);\n                return i;\n            }\n        }\n\n        if (c == '/') {\n            if ((i + 1) >= s.length() || s.charAt(i + 1) == ' ' || s.charAt(i + 1) == '\\t') {\n                throw new ParseException(\"'/' must be followed by an integer.\", i);\n            }\n\n            i++;\n            c = s.charAt(i);\n            int v2 = Integer.parseInt(String.valueOf(c));\n            i++;\n            if (i >= s.length()) {\n                checkIncrementRange(v2, type, i);\n                addToSet(val, end, v2, type);\n                return i;\n            }\n            c = s.charAt(i);\n            if (c >= '0' && c <= '9') {\n                ValueSet vs = getValue(v2, s, i);\n                int v3 = vs.value;\n                checkIncrementRange(v3, type, i);\n                addToSet(val, end, v3, type);\n                i = vs.pos;\n                return i;\n            } else {\n                throw new ParseException(\"Unexpected character '\" + c + \"' after '/'\", i);\n            }\n        }\n\n        addToSet(val, end, 0, type);\n        i++;\n        return i;\n    }\n\n    public String getCronExpression() {\n        return cronExpression;\n    }\n    \n    public String getExpressionSummary() {\n        StringBuilder buf = new StringBuilder();\n\n        buf.append(\"seconds: \");\n        buf.append(getExpressionSetSummary(seconds));\n        buf.append(\"\\n\");\n        buf.append(\"minutes: \");\n        buf.append(getExpressionSetSummary(minutes));\n        buf.append(\"\\n\");\n        buf.append(\"hours: \");\n        buf.append(getExpressionSetSummary(hours));\n        buf.append(\"\\n\");\n        buf.append(\"daysOfMonth: \");\n        buf.append(getExpressionSetSummary(daysOfMonth));\n        buf.append(\"\\n\");\n        buf.append(\"months: \");\n        buf.append(getExpressionSetSummary(months));\n        buf.append(\"\\n\");\n        buf.append(\"daysOfWeek: \");\n        buf.append(getExpressionSetSummary(daysOfWeek));\n        buf.append(\"\\n\");\n        buf.append(\"lastdayOfWeek: \");\n        buf.append(lastdayOfWeek);\n        buf.append(\"\\n\");\n        buf.append(\"nearestWeekday: \");\n        buf.append(nearestWeekday);\n        buf.append(\"\\n\");\n        buf.append(\"NthDayOfWeek: \");\n        buf.append(nthdayOfWeek);\n        buf.append(\"\\n\");\n        buf.append(\"lastdayOfMonth: \");\n        buf.append(lastdayOfMonth);\n        buf.append(\"\\n\");\n        buf.append(\"years: \");\n        buf.append(getExpressionSetSummary(years));\n        buf.append(\"\\n\");\n\n        return buf.toString();\n    }\n\n    protected String getExpressionSetSummary(java.util.Set<Integer> set) {\n\n        if (set.contains(NO_SPEC)) {\n            return \"?\";\n        }\n        if (set.contains(ALL_SPEC)) {\n            return \"*\";\n        }\n\n        StringBuilder buf = new StringBuilder();\n\n        Iterator<Integer> itr = set.iterator();\n        boolean first = true;\n        while (itr.hasNext()) {\n            Integer iVal = itr.next();\n            String val = iVal.toString();\n            if (!first) {\n                buf.append(\",\");\n            }\n            buf.append(val);\n            first = false;\n        }\n\n        return buf.toString();\n    }\n\n    protected String getExpressionSetSummary(java.util.ArrayList<Integer> list) {\n\n        if (list.contains(NO_SPEC)) {\n            return \"?\";\n        }\n        if (list.contains(ALL_SPEC)) {\n            return \"*\";\n        }\n\n        StringBuilder buf = new StringBuilder();\n\n        Iterator<Integer> itr = list.iterator();\n        boolean first = true;\n        while (itr.hasNext()) {\n            Integer iVal = itr.next();\n            String val = iVal.toString();\n            if (!first) {\n                buf.append(\",\");\n            }\n            buf.append(val);\n            first = false;\n        }\n\n        return buf.toString();\n    }\n\n    protected int skipWhiteSpace(int i, String s) {\n        for (; i < s.length() && (s.charAt(i) == ' ' || s.charAt(i) == '\\t'); i++) {\n        }\n\n        return i;\n    }\n\n    protected int findNextWhiteSpace(int i, String s) {\n        for (; i < s.length() && (s.charAt(i) != ' ' || s.charAt(i) != '\\t'); i++) {\n        }\n\n        return i;\n    }\n\n    protected void addToSet(int val, int end, int incr, int type)\n        throws ParseException {\n        \n        TreeSet<Integer> set = getSet(type);\n\n        if (type == SECOND || type == MINUTE) {\n            if ((val < 0 || val > 59 || end > 59) && (val != ALL_SPEC_INT)) {\n                throw new ParseException(\n                        \"Minute and Second values must be between 0 and 59\",\n                        -1);\n            }\n        } else if (type == HOUR) {\n            if ((val < 0 || val > 23 || end > 23) && (val != ALL_SPEC_INT)) {\n                throw new ParseException(\n                        \"Hour values must be between 0 and 23\", -1);\n            }\n        } else if (type == DAY_OF_MONTH) {\n            if ((val < 1 || val > 31 || end > 31) && (val != ALL_SPEC_INT) \n                    && (val != NO_SPEC_INT)) {\n                throw new ParseException(\n                        \"Day of month values must be between 1 and 31\", -1);\n            }\n        } else if (type == MONTH) {\n            if ((val < 1 || val > 12 || end > 12) && (val != ALL_SPEC_INT)) {\n                throw new ParseException(\n                        \"Month values must be between 1 and 12\", -1);\n            }\n        } else if (type == DAY_OF_WEEK) {\n            if ((val == 0 || val > 7 || end > 7) && (val != ALL_SPEC_INT)\n                    && (val != NO_SPEC_INT)) {\n                throw new ParseException(\n                        \"Day-of-Week values must be between 1 and 7\", -1);\n            }\n        }\n\n        if ((incr == 0 || incr == -1) && val != ALL_SPEC_INT) {\n            if (val != -1) {\n                set.add(val);\n            } else {\n                set.add(NO_SPEC);\n            }\n            \n            return;\n        }\n\n        int startAt = val;\n        int stopAt = end;\n\n        if (val == ALL_SPEC_INT && incr <= 0) {\n            incr = 1;\n            set.add(ALL_SPEC); // put in a marker, but also fill values\n        }\n\n        if (type == SECOND || type == MINUTE) {\n            if (stopAt == -1) {\n                stopAt = 59;\n            }\n            if (startAt == -1 || startAt == ALL_SPEC_INT) {\n                startAt = 0;\n            }\n        } else if (type == HOUR) {\n            if (stopAt == -1) {\n                stopAt = 23;\n            }\n            if (startAt == -1 || startAt == ALL_SPEC_INT) {\n                startAt = 0;\n            }\n        } else if (type == DAY_OF_MONTH) {\n            if (stopAt == -1) {\n                stopAt = 31;\n            }\n            if (startAt == -1 || startAt == ALL_SPEC_INT) {\n                startAt = 1;\n            }\n        } else if (type == MONTH) {\n            if (stopAt == -1) {\n                stopAt = 12;\n            }\n            if (startAt == -1 || startAt == ALL_SPEC_INT) {\n                startAt = 1;\n            }\n        } else if (type == DAY_OF_WEEK) {\n            if (stopAt == -1) {\n                stopAt = 7;\n            }\n            if (startAt == -1 || startAt == ALL_SPEC_INT) {\n                startAt = 1;\n            }\n        } else if (type == YEAR) {\n            if (stopAt == -1) {\n                stopAt = MAX_YEAR;\n            }\n            if (startAt == -1 || startAt == ALL_SPEC_INT) {\n                startAt = 1970;\n            }\n        }\n\n        // if the end of the range is before the start, then we need to overflow into \n        // the next day, month etc. This is done by adding the maximum amount for that \n        // type, and using modulus max to determine the value being added.\n        int max = -1;\n        if (stopAt < startAt) {\n            switch (type) {\n              case       SECOND : max = 60; break;\n              case       MINUTE : max = 60; break;\n              case         HOUR : max = 24; break;\n              case        MONTH : max = 12; break;\n              case  DAY_OF_WEEK : max = 7;  break;\n              case DAY_OF_MONTH : max = 31; break;\n              case         YEAR : throw new IllegalArgumentException(\"Start year must be less than stop year\");\n              default           : throw new IllegalArgumentException(\"Unexpected type encountered\");\n            }\n            stopAt += max;\n        }\n\n        for (int i = startAt; i <= stopAt; i += incr) {\n            if (max == -1) {\n                // ie: there's no max to overflow over\n                set.add(i);\n            } else {\n                // take the modulus to get the real value\n                int i2 = i % max;\n\n                // 1-indexed ranges should not include 0, and should include their max\n                if (i2 == 0 && (type == MONTH || type == DAY_OF_WEEK || type == DAY_OF_MONTH) ) {\n                    i2 = max;\n                }\n\n                set.add(i2);\n            }\n        }\n    }\n\n    TreeSet<Integer> getSet(int type) {\n        switch (type) {\n            case SECOND:\n                return seconds;\n            case MINUTE:\n                return minutes;\n            case HOUR:\n                return hours;\n            case DAY_OF_MONTH:\n                return daysOfMonth;\n            case MONTH:\n                return months;\n            case DAY_OF_WEEK:\n                return daysOfWeek;\n            case YEAR:\n                return years;\n            default:\n                return null;\n        }\n    }\n\n    protected ValueSet getValue(int v, String s, int i) {\n        char c = s.charAt(i);\n        StringBuilder s1 = new StringBuilder(String.valueOf(v));\n        while (c >= '0' && c <= '9') {\n            s1.append(c);\n            i++;\n            if (i >= s.length()) {\n                break;\n            }\n            c = s.charAt(i);\n        }\n        ValueSet val = new ValueSet();\n        \n        val.pos = (i < s.length()) ? i : i + 1;\n        val.value = Integer.parseInt(s1.toString());\n        return val;\n    }\n\n    protected int getNumericValue(String s, int i) {\n        int endOfVal = findNextWhiteSpace(i, s);\n        String val = s.substring(i, endOfVal);\n        return Integer.parseInt(val);\n    }\n\n    protected int getMonthNumber(String s) {\n        Integer integer = monthMap.get(s);\n\n        if (integer == null) {\n            return -1;\n        }\n\n        return integer;\n    }\n\n    protected int getDayOfWeekNumber(String s) {\n        Integer integer = dayMap.get(s);\n\n        if (integer == null) {\n            return -1;\n        }\n\n        return integer;\n    }\n\n    ////////////////////////////////////////////////////////////////////////////\n    //\n    // Computation Functions\n    //\n    ////////////////////////////////////////////////////////////////////////////\n\n    public Date getTimeAfter(Date afterTime) {\n\n        // Computation is based on Gregorian year only.\n        Calendar cl = new java.util.GregorianCalendar(getTimeZone()); \n\n        // move ahead one second, since we're computing the time *after* the\n        // given time\n        afterTime = new Date(afterTime.getTime() + 1000);\n        // CronTrigger does not deal with milliseconds\n        cl.setTime(afterTime);\n        cl.set(Calendar.MILLISECOND, 0);\n\n        boolean gotOne = false;\n        // loop until we've computed the next time, or we've past the endTime\n        while (!gotOne) {\n\n            //if (endTime != null && cl.getTime().after(endTime)) return null;\n            if(cl.get(Calendar.YEAR) > 2999) { // prevent endless loop...\n                return null;\n            }\n\n            SortedSet<Integer> st = null;\n            int t = 0;\n\n            int sec = cl.get(Calendar.SECOND);\n            int min = cl.get(Calendar.MINUTE);\n\n            // get second.................................................\n            st = seconds.tailSet(sec);\n            if (st != null && st.size() != 0) {\n                sec = st.first();\n            } else {\n                sec = seconds.first();\n                min++;\n                cl.set(Calendar.MINUTE, min);\n            }\n            cl.set(Calendar.SECOND, sec);\n\n            min = cl.get(Calendar.MINUTE);\n            int hr = cl.get(Calendar.HOUR_OF_DAY);\n            t = -1;\n\n            // get minute.................................................\n            st = minutes.tailSet(min);\n            if (st != null && st.size() != 0) {\n                t = min;\n                min = st.first();\n            } else {\n                min = minutes.first();\n                hr++;\n            }\n            if (min != t) {\n                cl.set(Calendar.SECOND, 0);\n                cl.set(Calendar.MINUTE, min);\n                setCalendarHour(cl, hr);\n                continue;\n            }\n            cl.set(Calendar.MINUTE, min);\n\n            hr = cl.get(Calendar.HOUR_OF_DAY);\n            int day = cl.get(Calendar.DAY_OF_MONTH);\n            t = -1;\n\n            // get hour...................................................\n            st = hours.tailSet(hr);\n            if (st != null && st.size() != 0) {\n                t = hr;\n                hr = st.first();\n            } else {\n                hr = hours.first();\n                day++;\n            }\n            if (hr != t) {\n                cl.set(Calendar.SECOND, 0);\n                cl.set(Calendar.MINUTE, 0);\n                cl.set(Calendar.DAY_OF_MONTH, day);\n                setCalendarHour(cl, hr);\n                continue;\n            }\n            cl.set(Calendar.HOUR_OF_DAY, hr);\n\n            day = cl.get(Calendar.DAY_OF_MONTH);\n            int mon = cl.get(Calendar.MONTH) + 1;\n            // '+ 1' because calendar is 0-based for this field, and we are\n            // 1-based\n            t = -1;\n            int tmon = mon;\n            \n            // get day...................................................\n            boolean dayOfMSpec = !daysOfMonth.contains(NO_SPEC);\n            boolean dayOfWSpec = !daysOfWeek.contains(NO_SPEC);\n            if (dayOfMSpec && !dayOfWSpec) { // get day by day of month rule\n                st = daysOfMonth.tailSet(day);\n                if (lastdayOfMonth) {\n                    if(!nearestWeekday) {\n                        t = day;\n                        day = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));\n                        day -= lastdayOffset;\n                        if(t > day) {\n                            mon++;\n                            if(mon > 12) { \n                                mon = 1;\n                                tmon = 3333; // ensure test of mon != tmon further below fails\n                                cl.add(Calendar.YEAR, 1);\n                            }\n                            day = 1;\n                        }\n                    } else {\n                        t = day;\n                        day = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));\n                        day -= lastdayOffset;\n                        \n                        Calendar tcal = Calendar.getInstance(getTimeZone());\n                        tcal.set(Calendar.SECOND, 0);\n                        tcal.set(Calendar.MINUTE, 0);\n                        tcal.set(Calendar.HOUR_OF_DAY, 0);\n                        tcal.set(Calendar.DAY_OF_MONTH, day);\n                        tcal.set(Calendar.MONTH, mon - 1);\n                        tcal.set(Calendar.YEAR, cl.get(Calendar.YEAR));\n                        \n                        int ldom = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));\n                        int dow = tcal.get(Calendar.DAY_OF_WEEK);\n\n                        if(dow == Calendar.SATURDAY && day == 1) {\n                            day += 2;\n                        } else if(dow == Calendar.SATURDAY) {\n                            day -= 1;\n                        } else if(dow == Calendar.SUNDAY && day == ldom) { \n                            day -= 2;\n                        } else if(dow == Calendar.SUNDAY) { \n                            day += 1;\n                        }\n                    \n                        tcal.set(Calendar.SECOND, sec);\n                        tcal.set(Calendar.MINUTE, min);\n                        tcal.set(Calendar.HOUR_OF_DAY, hr);\n                        tcal.set(Calendar.DAY_OF_MONTH, day);\n                        tcal.set(Calendar.MONTH, mon - 1);\n                        Date nTime = tcal.getTime();\n                        if(nTime.before(afterTime)) {\n                            day = 1;\n                            mon++;\n                        }\n                    }\n                } else if(nearestWeekday) {\n                    t = day;\n                    day = daysOfMonth.first();\n\n                    Calendar tcal = Calendar.getInstance(getTimeZone());\n                    tcal.set(Calendar.SECOND, 0);\n                    tcal.set(Calendar.MINUTE, 0);\n                    tcal.set(Calendar.HOUR_OF_DAY, 0);\n                    tcal.set(Calendar.DAY_OF_MONTH, day);\n                    tcal.set(Calendar.MONTH, mon - 1);\n                    tcal.set(Calendar.YEAR, cl.get(Calendar.YEAR));\n                    \n                    int ldom = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));\n                    int dow = tcal.get(Calendar.DAY_OF_WEEK);\n\n                    if(dow == Calendar.SATURDAY && day == 1) {\n                        day += 2;\n                    } else if(dow == Calendar.SATURDAY) {\n                        day -= 1;\n                    } else if(dow == Calendar.SUNDAY && day == ldom) { \n                        day -= 2;\n                    } else if(dow == Calendar.SUNDAY) { \n                        day += 1;\n                    }\n                        \n                \n                    tcal.set(Calendar.SECOND, sec);\n                    tcal.set(Calendar.MINUTE, min);\n                    tcal.set(Calendar.HOUR_OF_DAY, hr);\n                    tcal.set(Calendar.DAY_OF_MONTH, day);\n                    tcal.set(Calendar.MONTH, mon - 1);\n                    Date nTime = tcal.getTime();\n                    if(nTime.before(afterTime)) {\n                        day = daysOfMonth.first();\n                        mon++;\n                    }\n                } else if (st != null && st.size() != 0) {\n                    t = day;\n                    day = st.first();\n                    // make sure we don't over-run a short month, such as february\n                    int lastDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));\n                    if (day > lastDay) {\n                        day = daysOfMonth.first();\n                        mon++;\n                    }\n                } else {\n                    day = daysOfMonth.first();\n                    mon++;\n                }\n                \n                if (day != t || mon != tmon) {\n                    cl.set(Calendar.SECOND, 0);\n                    cl.set(Calendar.MINUTE, 0);\n                    cl.set(Calendar.HOUR_OF_DAY, 0);\n                    cl.set(Calendar.DAY_OF_MONTH, day);\n                    cl.set(Calendar.MONTH, mon - 1);\n                    // '- 1' because calendar is 0-based for this field, and we\n                    // are 1-based\n                    continue;\n                }\n            } else if (dayOfWSpec && !dayOfMSpec) { // get day by day of week rule\n                if (lastdayOfWeek) { // are we looking for the last XXX day of\n                    // the month?\n                    int dow = daysOfWeek.first(); // desired\n                    // d-o-w\n                    int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w\n                    int daysToAdd = 0;\n                    if (cDow < dow) {\n                        daysToAdd = dow - cDow;\n                    }\n                    if (cDow > dow) {\n                        daysToAdd = dow + (7 - cDow);\n                    }\n\n                    int lDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));\n\n                    if (day + daysToAdd > lDay) { // did we already miss the\n                        // last one?\n                        cl.set(Calendar.SECOND, 0);\n                        cl.set(Calendar.MINUTE, 0);\n                        cl.set(Calendar.HOUR_OF_DAY, 0);\n                        cl.set(Calendar.DAY_OF_MONTH, 1);\n                        cl.set(Calendar.MONTH, mon);\n                        // no '- 1' here because we are promoting the month\n                        continue;\n                    }\n\n                    // find date of last occurrence of this day in this month...\n                    while ((day + daysToAdd + 7) <= lDay) {\n                        daysToAdd += 7;\n                    }\n\n                    day += daysToAdd;\n\n                    if (daysToAdd > 0) {\n                        cl.set(Calendar.SECOND, 0);\n                        cl.set(Calendar.MINUTE, 0);\n                        cl.set(Calendar.HOUR_OF_DAY, 0);\n                        cl.set(Calendar.DAY_OF_MONTH, day);\n                        cl.set(Calendar.MONTH, mon - 1);\n                        // '- 1' here because we are not promoting the month\n                        continue;\n                    }\n\n                } else if (nthdayOfWeek != 0) {\n                    // are we looking for the Nth XXX day in the month?\n                    int dow = daysOfWeek.first(); // desired\n                    // d-o-w\n                    int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w\n                    int daysToAdd = 0;\n                    if (cDow < dow) {\n                        daysToAdd = dow - cDow;\n                    } else if (cDow > dow) {\n                        daysToAdd = dow + (7 - cDow);\n                    }\n\n                    boolean dayShifted = false;\n                    if (daysToAdd > 0) {\n                        dayShifted = true;\n                    }\n\n                    day += daysToAdd;\n                    int weekOfMonth = day / 7;\n                    if (day % 7 > 0) {\n                        weekOfMonth++;\n                    }\n\n                    daysToAdd = (nthdayOfWeek - weekOfMonth) * 7;\n                    day += daysToAdd;\n                    if (daysToAdd < 0\n                            || day > getLastDayOfMonth(mon, cl\n                                    .get(Calendar.YEAR))) {\n                        cl.set(Calendar.SECOND, 0);\n                        cl.set(Calendar.MINUTE, 0);\n                        cl.set(Calendar.HOUR_OF_DAY, 0);\n                        cl.set(Calendar.DAY_OF_MONTH, 1);\n                        cl.set(Calendar.MONTH, mon);\n                        // no '- 1' here because we are promoting the month\n                        continue;\n                    } else if (daysToAdd > 0 || dayShifted) {\n                        cl.set(Calendar.SECOND, 0);\n                        cl.set(Calendar.MINUTE, 0);\n                        cl.set(Calendar.HOUR_OF_DAY, 0);\n                        cl.set(Calendar.DAY_OF_MONTH, day);\n                        cl.set(Calendar.MONTH, mon - 1);\n                        // '- 1' here because we are NOT promoting the month\n                        continue;\n                    }\n                } else {\n                    int cDow = cl.get(Calendar.DAY_OF_WEEK); // current d-o-w\n                    int dow = daysOfWeek.first(); // desired\n                    // d-o-w\n                    st = daysOfWeek.tailSet(cDow);\n                    if (st != null && st.size() > 0) {\n                        dow = st.first();\n                    }\n\n                    int daysToAdd = 0;\n                    if (cDow < dow) {\n                        daysToAdd = dow - cDow;\n                    }\n                    if (cDow > dow) {\n                        daysToAdd = dow + (7 - cDow);\n                    }\n\n                    int lDay = getLastDayOfMonth(mon, cl.get(Calendar.YEAR));\n\n                    if (day + daysToAdd > lDay) { // will we pass the end of\n                        // the month?\n                        cl.set(Calendar.SECOND, 0);\n                        cl.set(Calendar.MINUTE, 0);\n                        cl.set(Calendar.HOUR_OF_DAY, 0);\n                        cl.set(Calendar.DAY_OF_MONTH, 1);\n                        cl.set(Calendar.MONTH, mon);\n                        // no '- 1' here because we are promoting the month\n                        continue;\n                    } else if (daysToAdd > 0) { // are we swithing days?\n                        cl.set(Calendar.SECOND, 0);\n                        cl.set(Calendar.MINUTE, 0);\n                        cl.set(Calendar.HOUR_OF_DAY, 0);\n                        cl.set(Calendar.DAY_OF_MONTH, day + daysToAdd);\n                        cl.set(Calendar.MONTH, mon - 1);\n                        // '- 1' because calendar is 0-based for this field,\n                        // and we are 1-based\n                        continue;\n                    }\n                }\n            } else { // dayOfWSpec && !dayOfMSpec\n                throw new UnsupportedOperationException(\n                        \"Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.\");\n            }\n            cl.set(Calendar.DAY_OF_MONTH, day);\n\n            mon = cl.get(Calendar.MONTH) + 1;\n            // '+ 1' because calendar is 0-based for this field, and we are\n            // 1-based\n            int year = cl.get(Calendar.YEAR);\n            t = -1;\n\n            // test for expressions that never generate a valid fire date,\n            // but keep looping...\n            if (year > MAX_YEAR) {\n                return null;\n            }\n\n            // get month...................................................\n            st = months.tailSet(mon);\n            if (st != null && st.size() != 0) {\n                t = mon;\n                mon = st.first();\n            } else {\n                mon = months.first();\n                year++;\n            }\n            if (mon != t) {\n                cl.set(Calendar.SECOND, 0);\n                cl.set(Calendar.MINUTE, 0);\n                cl.set(Calendar.HOUR_OF_DAY, 0);\n                cl.set(Calendar.DAY_OF_MONTH, 1);\n                cl.set(Calendar.MONTH, mon - 1);\n                // '- 1' because calendar is 0-based for this field, and we are\n                // 1-based\n                cl.set(Calendar.YEAR, year);\n                continue;\n            }\n            cl.set(Calendar.MONTH, mon - 1);\n            // '- 1' because calendar is 0-based for this field, and we are\n            // 1-based\n\n            year = cl.get(Calendar.YEAR);\n            t = -1;\n\n            // get year...................................................\n            st = years.tailSet(year);\n            if (st != null && st.size() != 0) {\n                t = year;\n                year = st.first();\n            } else {\n                return null; // ran out of years...\n            }\n\n            if (year != t) {\n                cl.set(Calendar.SECOND, 0);\n                cl.set(Calendar.MINUTE, 0);\n                cl.set(Calendar.HOUR_OF_DAY, 0);\n                cl.set(Calendar.DAY_OF_MONTH, 1);\n                cl.set(Calendar.MONTH, 0);\n                // '- 1' because calendar is 0-based for this field, and we are\n                // 1-based\n                cl.set(Calendar.YEAR, year);\n                continue;\n            }\n            cl.set(Calendar.YEAR, year);\n\n            gotOne = true;\n        } // while( !done )\n\n        return cl.getTime();\n    }\n\n    /**\n     * Advance the calendar to the particular hour paying particular attention\n     * to daylight saving problems.\n     * \n     * @param cal the calendar to operate on\n     * @param hour the hour to set\n     */\n    protected void setCalendarHour(Calendar cal, int hour) {\n        cal.set(Calendar.HOUR_OF_DAY, hour);\n        if (cal.get(Calendar.HOUR_OF_DAY) != hour && hour != 24) {\n            cal.set(Calendar.HOUR_OF_DAY, hour + 1);\n        }\n    }\n\n    /**\n     * NOT YET IMPLEMENTED: Returns the time before the given time\n     * that the <code>CronExpression</code> matches.\n     */ \n    public Date getTimeBefore(Date endTime) { \n        // FUTURE_TODO: implement QUARTZ-423\n        return null;\n    }\n\n    /**\n     * NOT YET IMPLEMENTED: Returns the final time that the \n     * <code>CronExpression</code> will match.\n     */\n    public Date getFinalFireTime() {\n        // FUTURE_TODO: implement QUARTZ-423\n        return null;\n    }\n    \n    protected boolean isLeapYear(int year) {\n        return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));\n    }\n\n    protected int getLastDayOfMonth(int monthNum, int year) {\n\n        switch (monthNum) {\n            case 1:\n                return 31;\n            case 2:\n                return (isLeapYear(year)) ? 29 : 28;\n            case 3:\n                return 31;\n            case 4:\n                return 30;\n            case 5:\n                return 31;\n            case 6:\n                return 30;\n            case 7:\n                return 31;\n            case 8:\n                return 31;\n            case 9:\n                return 30;\n            case 10:\n                return 31;\n            case 11:\n                return 30;\n            case 12:\n                return 31;\n            default:\n                throw new IllegalArgumentException(\"Illegal month number: \"\n                        + monthNum);\n        }\n    }\n    \n\n    private void readObject(java.io.ObjectInputStream stream)\n        throws java.io.IOException, ClassNotFoundException {\n        \n        stream.defaultReadObject();\n        try {\n            buildExpression(cronExpression);\n        } catch (Exception ignore) {\n        } // never happens\n    }    \n    \n    @Override\n    @Deprecated\n    public Object clone() {\n        return new CronExpression(this);\n    }\n}\n\nclass ValueSet {\n    public int value;\n\n    public int pos;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/exception/XxlJobException.java",
    "content": "package com.xxl.job.admin.core.exception;\n\n/**\n * @author xuxueli 2019-05-04 23:19:29\n */\npublic class XxlJobException extends RuntimeException {\n\n    public XxlJobException() {\n    }\n    public XxlJobException(String message) {\n        super(message);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java",
    "content": "package com.xxl.job.admin.core.model;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * Created by xuxueli on 16/9/30.\n */\npublic class XxlJobGroup {\n\n    private int id;\n    private String appname;\n    private String title;\n    private int addressType;        // 执行器地址类型：0=自动注册、1=手动录入\n    private String addressList;     // 执行器地址列表，多地址逗号分隔(手动录入)\n    private Date updateTime;\n\n    // registry list\n    private List<String> registryList;  // 执行器地址列表(系统注册)\n    public List<String> getRegistryList() {\n        if (addressList!=null && addressList.trim().length()>0) {\n            registryList = new ArrayList<String>(Arrays.asList(addressList.split(\",\")));\n        }\n        return registryList;\n    }\n\n    public int getId() {\n        return id;\n    }\n\n    public void setId(int id) {\n        this.id = id;\n    }\n\n    public String getAppname() {\n        return appname;\n    }\n\n    public void setAppname(String appname) {\n        this.appname = appname;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\n    }\n\n    public int getAddressType() {\n        return addressType;\n    }\n\n    public void setAddressType(int addressType) {\n        this.addressType = addressType;\n    }\n\n    public String getAddressList() {\n        return addressList;\n    }\n\n    public Date getUpdateTime() {\n        return updateTime;\n    }\n\n    public void setUpdateTime(Date updateTime) {\n        this.updateTime = updateTime;\n    }\n\n    public void setAddressList(String addressList) {\n        this.addressList = addressList;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java",
    "content": "package com.xxl.job.admin.core.model;\n\nimport java.util.Date;\n\n/**\n * xxl-job info\n *\n * @author xuxueli  2016-1-12 18:25:49\n */\npublic class XxlJobInfo {\n\t\n\tprivate int id;\t\t\t\t// 主键ID\n\t\n\tprivate int jobGroup;\t\t// 执行器主键ID\n\tprivate String jobDesc;\n\t\n\tprivate Date addTime;\n\tprivate Date updateTime;\n\t\n\tprivate String author;\t\t// 负责人\n\tprivate String alarmEmail;\t// 报警邮件\n\n\tprivate String scheduleType;\t\t\t// 调度类型\n\tprivate String scheduleConf;\t\t\t// 调度配置，值含义取决于调度类型\n\tprivate String misfireStrategy;\t\t\t// 调度过期策略\n\n\tprivate String executorRouteStrategy;\t// 执行器路由策略\n\tprivate String executorHandler;\t\t    // 执行器，任务Handler名称\n\tprivate String executorParam;\t\t    // 执行器，任务参数\n\tprivate String executorBlockStrategy;\t// 阻塞处理策略\n\tprivate int executorTimeout;     \t\t// 任务执行超时时间，单位秒\n\tprivate int executorFailRetryCount;\t\t// 失败重试次数\n\t\n\tprivate String glueType;\t\t// GLUE类型\t#com.xxl.job.core.glue.GlueTypeEnum\n\tprivate String glueSource;\t\t// GLUE源代码\n\tprivate String glueRemark;\t\t// GLUE备注\n\tprivate Date glueUpdatetime;\t// GLUE更新时间\n\n\tprivate String childJobId;\t\t// 子任务ID，多个逗号分隔\n\n\tprivate int triggerStatus;\t\t// 调度状态：0-停止，1-运行\n\tprivate long triggerLastTime;\t// 上次调度时间\n\tprivate long triggerNextTime;\t// 下次调度时间\n\n\n\tpublic int getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(int id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic int getJobGroup() {\n\t\treturn jobGroup;\n\t}\n\n\tpublic void setJobGroup(int jobGroup) {\n\t\tthis.jobGroup = jobGroup;\n\t}\n\n\tpublic String getJobDesc() {\n\t\treturn jobDesc;\n\t}\n\n\tpublic void setJobDesc(String jobDesc) {\n\t\tthis.jobDesc = jobDesc;\n\t}\n\n\tpublic Date getAddTime() {\n\t\treturn addTime;\n\t}\n\n\tpublic void setAddTime(Date addTime) {\n\t\tthis.addTime = addTime;\n\t}\n\n\tpublic Date getUpdateTime() {\n\t\treturn updateTime;\n\t}\n\n\tpublic void setUpdateTime(Date updateTime) {\n\t\tthis.updateTime = updateTime;\n\t}\n\n\tpublic String getAuthor() {\n\t\treturn author;\n\t}\n\n\tpublic void setAuthor(String author) {\n\t\tthis.author = author;\n\t}\n\n\tpublic String getAlarmEmail() {\n\t\treturn alarmEmail;\n\t}\n\n\tpublic void setAlarmEmail(String alarmEmail) {\n\t\tthis.alarmEmail = alarmEmail;\n\t}\n\n\tpublic String getScheduleType() {\n\t\treturn scheduleType;\n\t}\n\n\tpublic void setScheduleType(String scheduleType) {\n\t\tthis.scheduleType = scheduleType;\n\t}\n\n\tpublic String getScheduleConf() {\n\t\treturn scheduleConf;\n\t}\n\n\tpublic void setScheduleConf(String scheduleConf) {\n\t\tthis.scheduleConf = scheduleConf;\n\t}\n\n\tpublic String getMisfireStrategy() {\n\t\treturn misfireStrategy;\n\t}\n\n\tpublic void setMisfireStrategy(String misfireStrategy) {\n\t\tthis.misfireStrategy = misfireStrategy;\n\t}\n\n\tpublic String getExecutorRouteStrategy() {\n\t\treturn executorRouteStrategy;\n\t}\n\n\tpublic void setExecutorRouteStrategy(String executorRouteStrategy) {\n\t\tthis.executorRouteStrategy = executorRouteStrategy;\n\t}\n\n\tpublic String getExecutorHandler() {\n\t\treturn executorHandler;\n\t}\n\n\tpublic void setExecutorHandler(String executorHandler) {\n\t\tthis.executorHandler = executorHandler;\n\t}\n\n\tpublic String getExecutorParam() {\n\t\treturn executorParam;\n\t}\n\n\tpublic void setExecutorParam(String executorParam) {\n\t\tthis.executorParam = executorParam;\n\t}\n\n\tpublic String getExecutorBlockStrategy() {\n\t\treturn executorBlockStrategy;\n\t}\n\n\tpublic void setExecutorBlockStrategy(String executorBlockStrategy) {\n\t\tthis.executorBlockStrategy = executorBlockStrategy;\n\t}\n\n\tpublic int getExecutorTimeout() {\n\t\treturn executorTimeout;\n\t}\n\n\tpublic void setExecutorTimeout(int executorTimeout) {\n\t\tthis.executorTimeout = executorTimeout;\n\t}\n\n\tpublic int getExecutorFailRetryCount() {\n\t\treturn executorFailRetryCount;\n\t}\n\n\tpublic void setExecutorFailRetryCount(int executorFailRetryCount) {\n\t\tthis.executorFailRetryCount = executorFailRetryCount;\n\t}\n\n\tpublic String getGlueType() {\n\t\treturn glueType;\n\t}\n\n\tpublic void setGlueType(String glueType) {\n\t\tthis.glueType = glueType;\n\t}\n\n\tpublic String getGlueSource() {\n\t\treturn glueSource;\n\t}\n\n\tpublic void setGlueSource(String glueSource) {\n\t\tthis.glueSource = glueSource;\n\t}\n\n\tpublic String getGlueRemark() {\n\t\treturn glueRemark;\n\t}\n\n\tpublic void setGlueRemark(String glueRemark) {\n\t\tthis.glueRemark = glueRemark;\n\t}\n\n\tpublic Date getGlueUpdatetime() {\n\t\treturn glueUpdatetime;\n\t}\n\n\tpublic void setGlueUpdatetime(Date glueUpdatetime) {\n\t\tthis.glueUpdatetime = glueUpdatetime;\n\t}\n\n\tpublic String getChildJobId() {\n\t\treturn childJobId;\n\t}\n\n\tpublic void setChildJobId(String childJobId) {\n\t\tthis.childJobId = childJobId;\n\t}\n\n\tpublic int getTriggerStatus() {\n\t\treturn triggerStatus;\n\t}\n\n\tpublic void setTriggerStatus(int triggerStatus) {\n\t\tthis.triggerStatus = triggerStatus;\n\t}\n\n\tpublic long getTriggerLastTime() {\n\t\treturn triggerLastTime;\n\t}\n\n\tpublic void setTriggerLastTime(long triggerLastTime) {\n\t\tthis.triggerLastTime = triggerLastTime;\n\t}\n\n\tpublic long getTriggerNextTime() {\n\t\treturn triggerNextTime;\n\t}\n\n\tpublic void setTriggerNextTime(long triggerNextTime) {\n\t\tthis.triggerNextTime = triggerNextTime;\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java",
    "content": "package com.xxl.job.admin.core.model;\n\nimport java.util.Date;\n\n/**\n * xxl-job log, used to track trigger process\n * @author xuxueli  2015-12-19 23:19:09\n */\npublic class XxlJobLog {\n\t\n\tprivate long id;\n\t\n\t// job info\n\tprivate int jobGroup;\n\tprivate int jobId;\n\n\t// execute info\n\tprivate String executorAddress;\n\tprivate String executorHandler;\n\tprivate String executorParam;\n\tprivate String executorShardingParam;\n\tprivate int executorFailRetryCount;\n\t\n\t// trigger info\n\tprivate Date triggerTime;\n\tprivate int triggerCode;\n\tprivate String triggerMsg;\n\t\n\t// handle info\n\tprivate Date handleTime;\n\tprivate int handleCode;\n\tprivate String handleMsg;\n\n\t// alarm info\n\tprivate int alarmStatus;\n\n\tpublic long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic int getJobGroup() {\n\t\treturn jobGroup;\n\t}\n\n\tpublic void setJobGroup(int jobGroup) {\n\t\tthis.jobGroup = jobGroup;\n\t}\n\n\tpublic int getJobId() {\n\t\treturn jobId;\n\t}\n\n\tpublic void setJobId(int jobId) {\n\t\tthis.jobId = jobId;\n\t}\n\n\tpublic String getExecutorAddress() {\n\t\treturn executorAddress;\n\t}\n\n\tpublic void setExecutorAddress(String executorAddress) {\n\t\tthis.executorAddress = executorAddress;\n\t}\n\n\tpublic String getExecutorHandler() {\n\t\treturn executorHandler;\n\t}\n\n\tpublic void setExecutorHandler(String executorHandler) {\n\t\tthis.executorHandler = executorHandler;\n\t}\n\n\tpublic String getExecutorParam() {\n\t\treturn executorParam;\n\t}\n\n\tpublic void setExecutorParam(String executorParam) {\n\t\tthis.executorParam = executorParam;\n\t}\n\n\tpublic String getExecutorShardingParam() {\n\t\treturn executorShardingParam;\n\t}\n\n\tpublic void setExecutorShardingParam(String executorShardingParam) {\n\t\tthis.executorShardingParam = executorShardingParam;\n\t}\n\n\tpublic int getExecutorFailRetryCount() {\n\t\treturn executorFailRetryCount;\n\t}\n\n\tpublic void setExecutorFailRetryCount(int executorFailRetryCount) {\n\t\tthis.executorFailRetryCount = executorFailRetryCount;\n\t}\n\n\tpublic Date getTriggerTime() {\n\t\treturn triggerTime;\n\t}\n\n\tpublic void setTriggerTime(Date triggerTime) {\n\t\tthis.triggerTime = triggerTime;\n\t}\n\n\tpublic int getTriggerCode() {\n\t\treturn triggerCode;\n\t}\n\n\tpublic void setTriggerCode(int triggerCode) {\n\t\tthis.triggerCode = triggerCode;\n\t}\n\n\tpublic String getTriggerMsg() {\n\t\treturn triggerMsg;\n\t}\n\n\tpublic void setTriggerMsg(String triggerMsg) {\n\t\tthis.triggerMsg = triggerMsg;\n\t}\n\n\tpublic Date getHandleTime() {\n\t\treturn handleTime;\n\t}\n\n\tpublic void setHandleTime(Date handleTime) {\n\t\tthis.handleTime = handleTime;\n\t}\n\n\tpublic int getHandleCode() {\n\t\treturn handleCode;\n\t}\n\n\tpublic void setHandleCode(int handleCode) {\n\t\tthis.handleCode = handleCode;\n\t}\n\n\tpublic String getHandleMsg() {\n\t\treturn handleMsg;\n\t}\n\n\tpublic void setHandleMsg(String handleMsg) {\n\t\tthis.handleMsg = handleMsg;\n\t}\n\n\tpublic int getAlarmStatus() {\n\t\treturn alarmStatus;\n\t}\n\n\tpublic void setAlarmStatus(int alarmStatus) {\n\t\tthis.alarmStatus = alarmStatus;\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java",
    "content": "package com.xxl.job.admin.core.model;\n\nimport java.util.Date;\n\n/**\n * xxl-job log for glue, used to track job code process\n * @author xuxueli 2016-5-19 17:57:46\n */\npublic class XxlJobLogGlue {\n\t\n\tprivate int id;\n\tprivate int jobId;\t\t\t\t// 任务主键ID\n\tprivate String glueType;\t\t// GLUE类型\t#com.xxl.job.core.glue.GlueTypeEnum\n\tprivate String glueSource;\n\tprivate String glueRemark;\n\tprivate Date addTime;\n\tprivate Date updateTime;\n\n\tpublic int getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(int id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic int getJobId() {\n\t\treturn jobId;\n\t}\n\n\tpublic void setJobId(int jobId) {\n\t\tthis.jobId = jobId;\n\t}\n\n\tpublic String getGlueType() {\n\t\treturn glueType;\n\t}\n\n\tpublic void setGlueType(String glueType) {\n\t\tthis.glueType = glueType;\n\t}\n\n\tpublic String getGlueSource() {\n\t\treturn glueSource;\n\t}\n\n\tpublic void setGlueSource(String glueSource) {\n\t\tthis.glueSource = glueSource;\n\t}\n\n\tpublic String getGlueRemark() {\n\t\treturn glueRemark;\n\t}\n\n\tpublic void setGlueRemark(String glueRemark) {\n\t\tthis.glueRemark = glueRemark;\n\t}\n\n\tpublic Date getAddTime() {\n\t\treturn addTime;\n\t}\n\n\tpublic void setAddTime(Date addTime) {\n\t\tthis.addTime = addTime;\n\t}\n\n\tpublic Date getUpdateTime() {\n\t\treturn updateTime;\n\t}\n\n\tpublic void setUpdateTime(Date updateTime) {\n\t\tthis.updateTime = updateTime;\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/model/XxlJobLogReport.java",
    "content": "package com.xxl.job.admin.core.model;\n\nimport java.util.Date;\n\npublic class XxlJobLogReport {\n\n    private int id;\n\n    private Date triggerDay;\n\n    private int runningCount;\n    private int sucCount;\n    private int failCount;\n\n    public int getId() {\n        return id;\n    }\n\n    public void setId(int id) {\n        this.id = id;\n    }\n\n    public Date getTriggerDay() {\n        return triggerDay;\n    }\n\n    public void setTriggerDay(Date triggerDay) {\n        this.triggerDay = triggerDay;\n    }\n\n    public int getRunningCount() {\n        return runningCount;\n    }\n\n    public void setRunningCount(int runningCount) {\n        this.runningCount = runningCount;\n    }\n\n    public int getSucCount() {\n        return sucCount;\n    }\n\n    public void setSucCount(int sucCount) {\n        this.sucCount = sucCount;\n    }\n\n    public int getFailCount() {\n        return failCount;\n    }\n\n    public void setFailCount(int failCount) {\n        this.failCount = failCount;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/model/XxlJobRegistry.java",
    "content": "package com.xxl.job.admin.core.model;\n\nimport java.util.Date;\n\n/**\n * Created by xuxueli on 16/9/30.\n */\npublic class XxlJobRegistry {\n\n    private int id;\n    private String registryGroup;\n    private String registryKey;\n    private String registryValue;\n    private Date updateTime;\n\n    public int getId() {\n        return id;\n    }\n\n    public void setId(int id) {\n        this.id = id;\n    }\n\n    public String getRegistryGroup() {\n        return registryGroup;\n    }\n\n    public void setRegistryGroup(String registryGroup) {\n        this.registryGroup = registryGroup;\n    }\n\n    public String getRegistryKey() {\n        return registryKey;\n    }\n\n    public void setRegistryKey(String registryKey) {\n        this.registryKey = registryKey;\n    }\n\n    public String getRegistryValue() {\n        return registryValue;\n    }\n\n    public void setRegistryValue(String registryValue) {\n        this.registryValue = registryValue;\n    }\n\n    public Date getUpdateTime() {\n        return updateTime;\n    }\n\n    public void setUpdateTime(Date updateTime) {\n        this.updateTime = updateTime;\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java",
    "content": "package com.xxl.job.admin.core.model;\n\nimport org.springframework.util.StringUtils;\n\n/**\n * @author xuxueli 2019-05-04 16:43:12\n */\npublic class XxlJobUser {\n\t\n\tprivate int id;\n\tprivate String username;\t\t// 账号\n\tprivate String password;\t\t// 密码\n\tprivate int role;\t\t\t\t// 角色：0-普通用户、1-管理员\n\tprivate String permission;\t// 权限：执行器ID列表，多个逗号分割\n\n\tpublic int getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(int id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getUsername() {\n\t\treturn username;\n\t}\n\n\tpublic void setUsername(String username) {\n\t\tthis.username = username;\n\t}\n\n\tpublic String getPassword() {\n\t\treturn password;\n\t}\n\n\tpublic void setPassword(String password) {\n\t\tthis.password = password;\n\t}\n\n\tpublic int getRole() {\n\t\treturn role;\n\t}\n\n\tpublic void setRole(int role) {\n\t\tthis.role = role;\n\t}\n\n\tpublic String getPermission() {\n\t\treturn permission;\n\t}\n\n\tpublic void setPermission(String permission) {\n\t\tthis.permission = permission;\n\t}\n\n\t// plugin\n\tpublic boolean validPermission(int jobGroup){\n\t\tif (this.role == 1) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\tif (StringUtils.hasText(this.permission)) {\n\t\t\t\tfor (String permissionItem : this.permission.split(\",\")) {\n\t\t\t\t\tif (String.valueOf(jobGroup).equals(permissionItem)) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/route/ExecutorRouteStrategyEnum.java",
    "content": "package com.xxl.job.admin.core.route;\n\nimport com.xxl.job.admin.core.route.strategy.*;\nimport com.xxl.job.admin.core.util.I18nUtil;\n\n/**\n * Created by xuxueli on 17/3/10.\n */\npublic enum ExecutorRouteStrategyEnum {\n\n    FIRST(I18nUtil.getString(\"jobconf_route_first\"), new ExecutorRouteFirst()),\n    LAST(I18nUtil.getString(\"jobconf_route_last\"), new ExecutorRouteLast()),\n    ROUND(I18nUtil.getString(\"jobconf_route_round\"), new ExecutorRouteRound()),\n    RANDOM(I18nUtil.getString(\"jobconf_route_random\"), new ExecutorRouteRandom()),\n    CONSISTENT_HASH(I18nUtil.getString(\"jobconf_route_consistenthash\"), new ExecutorRouteConsistentHash()),\n    LEAST_FREQUENTLY_USED(I18nUtil.getString(\"jobconf_route_lfu\"), new ExecutorRouteLFU()),\n    LEAST_RECENTLY_USED(I18nUtil.getString(\"jobconf_route_lru\"), new ExecutorRouteLRU()),\n    FAILOVER(I18nUtil.getString(\"jobconf_route_failover\"), new ExecutorRouteFailover()),\n    BUSYOVER(I18nUtil.getString(\"jobconf_route_busyover\"), new ExecutorRouteBusyover()),\n    SHARDING_BROADCAST(I18nUtil.getString(\"jobconf_route_shard\"), null);\n\n    ExecutorRouteStrategyEnum(String title, ExecutorRouter router) {\n        this.title = title;\n        this.router = router;\n    }\n\n    private String title;\n    private ExecutorRouter router;\n\n    public String getTitle() {\n        return title;\n    }\n    public ExecutorRouter getRouter() {\n        return router;\n    }\n\n    public static ExecutorRouteStrategyEnum match(String name, ExecutorRouteStrategyEnum defaultItem){\n        if (name != null) {\n            for (ExecutorRouteStrategyEnum item: ExecutorRouteStrategyEnum.values()) {\n                if (item.name().equals(name)) {\n                    return item;\n                }\n            }\n        }\n        return defaultItem;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java",
    "content": "package com.xxl.job.admin.core.route;\n\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.biz.model.TriggerParam;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport java.util.List;\n\n/**\n * Created by xuxueli on 17/3/10.\n */\npublic abstract class ExecutorRouter {\n    protected static Logger logger = LoggerFactory.getLogger(ExecutorRouter.class);\n\n    /**\n     * route address\n     *\n     * @param addressList\n     * @return  ReturnT.content=address\n     */\n    public abstract ReturnT<String> route(TriggerParam triggerParam, List<String> addressList);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java",
    "content": "package com.xxl.job.admin.core.route.strategy;\n\nimport com.xxl.job.admin.core.scheduler.XxlJobScheduler;\nimport com.xxl.job.admin.core.route.ExecutorRouter;\nimport com.xxl.job.admin.core.util.I18nUtil;\nimport com.xxl.job.core.biz.ExecutorBiz;\nimport com.xxl.job.core.biz.model.IdleBeatParam;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.biz.model.TriggerParam;\n\nimport java.util.List;\n\n/**\n * Created by xuxueli on 17/3/10.\n */\npublic class ExecutorRouteBusyover extends ExecutorRouter {\n\n    @Override\n    public ReturnT<String> route(TriggerParam triggerParam, List<String> addressList) {\n        StringBuffer idleBeatResultSB = new StringBuffer();\n        for (String address : addressList) {\n            // beat\n            ReturnT<String> idleBeatResult = null;\n            try {\n                ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(address);\n                idleBeatResult = executorBiz.idleBeat(new IdleBeatParam(triggerParam.getJobId()));\n            } catch (Exception e) {\n                logger.error(e.getMessage(), e);\n                idleBeatResult = new ReturnT<String>(ReturnT.FAIL_CODE, \"\"+e );\n            }\n            idleBeatResultSB.append( (idleBeatResultSB.length()>0)?\"<br><br>\":\"\")\n                    .append(I18nUtil.getString(\"jobconf_idleBeat\") + \"：\")\n                    .append(\"<br>address：\").append(address)\n                    .append(\"<br>code：\").append(idleBeatResult.getCode())\n                    .append(\"<br>msg：\").append(idleBeatResult.getMsg());\n\n            // beat success\n            if (idleBeatResult.getCode() == ReturnT.SUCCESS_CODE) {\n                idleBeatResult.setMsg(idleBeatResultSB.toString());\n                idleBeatResult.setContent(address);\n                return idleBeatResult;\n            }\n        }\n\n        return new ReturnT<String>(ReturnT.FAIL_CODE, idleBeatResultSB.toString());\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java",
    "content": "package com.xxl.job.admin.core.route.strategy;\n\nimport com.xxl.job.admin.core.route.ExecutorRouter;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.biz.model.TriggerParam;\n\nimport java.io.UnsupportedEncodingException;\nimport java.security.MessageDigest;\nimport java.security.NoSuchAlgorithmException;\nimport java.util.List;\nimport java.util.SortedMap;\nimport java.util.TreeMap;\n\n/**\n * 分组下机器地址相同，不同JOB均匀散列在不同机器上，保证分组下机器分配JOB平均；且每个JOB固定调度其中一台机器；\n *      a、virtual node：解决不均衡问题\n *      b、hash method replace hashCode：String的hashCode可能重复，需要进一步扩大hashCode的取值范围\n * Created by xuxueli on 17/3/10.\n */\npublic class ExecutorRouteConsistentHash extends ExecutorRouter {\n\n    private static int VIRTUAL_NODE_NUM = 100;\n\n    /**\n     * get hash code on 2^32 ring (md5散列的方式计算hash值)\n     * @param key\n     * @return\n     */\n    private static long hash(String key) {\n\n        // md5 byte\n        MessageDigest md5;\n        try {\n            md5 = MessageDigest.getInstance(\"MD5\");\n        } catch (NoSuchAlgorithmException e) {\n            throw new RuntimeException(\"MD5 not supported\", e);\n        }\n        md5.reset();\n        byte[] keyBytes = null;\n        try {\n            keyBytes = key.getBytes(\"UTF-8\");\n        } catch (UnsupportedEncodingException e) {\n            throw new RuntimeException(\"Unknown string :\" + key, e);\n        }\n\n        md5.update(keyBytes);\n        byte[] digest = md5.digest();\n\n        // hash code, Truncate to 32-bits\n        long hashCode = ((long) (digest[3] & 0xFF) << 24)\n                | ((long) (digest[2] & 0xFF) << 16)\n                | ((long) (digest[1] & 0xFF) << 8)\n                | (digest[0] & 0xFF);\n\n        long truncateHashCode = hashCode & 0xffffffffL;\n        return truncateHashCode;\n    }\n\n    public String hashJob(int jobId, List<String> addressList) {\n\n        // ------A1------A2-------A3------\n        // -----------J1------------------\n        TreeMap<Long, String> addressRing = new TreeMap<Long, String>();\n        for (String address: addressList) {\n            for (int i = 0; i < VIRTUAL_NODE_NUM; i++) {\n                long addressHash = hash(\"SHARD-\" + address + \"-NODE-\" + i);\n                addressRing.put(addressHash, address);\n            }\n        }\n\n        long jobHash = hash(String.valueOf(jobId));\n        SortedMap<Long, String> lastRing = addressRing.tailMap(jobHash);\n        if (!lastRing.isEmpty()) {\n            return lastRing.get(lastRing.firstKey());\n        }\n        return addressRing.firstEntry().getValue();\n    }\n\n    @Override\n    public ReturnT<String> route(TriggerParam triggerParam, List<String> addressList) {\n        String address = hashJob(triggerParam.getJobId(), addressList);\n        return new ReturnT<String>(address);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java",
    "content": "package com.xxl.job.admin.core.route.strategy;\n\nimport com.xxl.job.admin.core.scheduler.XxlJobScheduler;\nimport com.xxl.job.admin.core.route.ExecutorRouter;\nimport com.xxl.job.admin.core.util.I18nUtil;\nimport com.xxl.job.core.biz.ExecutorBiz;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.biz.model.TriggerParam;\n\nimport java.util.List;\n\n/**\n * Created by xuxueli on 17/3/10.\n */\npublic class ExecutorRouteFailover extends ExecutorRouter {\n\n    @Override\n    public ReturnT<String> route(TriggerParam triggerParam, List<String> addressList) {\n\n        StringBuffer beatResultSB = new StringBuffer();\n        for (String address : addressList) {\n            // beat\n            ReturnT<String> beatResult = null;\n            try {\n                ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(address);\n                beatResult = executorBiz.beat();\n            } catch (Exception e) {\n                logger.error(e.getMessage(), e);\n                beatResult = new ReturnT<String>(ReturnT.FAIL_CODE, \"\"+e );\n            }\n            beatResultSB.append( (beatResultSB.length()>0)?\"<br><br>\":\"\")\n                    .append(I18nUtil.getString(\"jobconf_beat\") + \"：\")\n                    .append(\"<br>address：\").append(address)\n                    .append(\"<br>code：\").append(beatResult.getCode())\n                    .append(\"<br>msg：\").append(beatResult.getMsg());\n\n            // beat success\n            if (beatResult.getCode() == ReturnT.SUCCESS_CODE) {\n\n                beatResult.setMsg(beatResultSB.toString());\n                beatResult.setContent(address);\n                return beatResult;\n            }\n        }\n        return new ReturnT<String>(ReturnT.FAIL_CODE, beatResultSB.toString());\n\n    }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFirst.java",
    "content": "package com.xxl.job.admin.core.route.strategy;\n\nimport com.xxl.job.admin.core.route.ExecutorRouter;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.biz.model.TriggerParam;\n\nimport java.util.List;\n\n/**\n * Created by xuxueli on 17/3/10.\n */\npublic class ExecutorRouteFirst extends ExecutorRouter {\n\n    @Override\n    public ReturnT<String> route(TriggerParam triggerParam, List<String> addressList){\n        return new ReturnT<String>(addressList.get(0));\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java",
    "content": "package com.xxl.job.admin.core.route.strategy;\n\nimport com.xxl.job.admin.core.route.ExecutorRouter;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.biz.model.TriggerParam;\n\nimport java.util.*;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\n\n/**\n * 单个JOB对应的每个执行器，使用频率最低的优先被选举\n *      a(*)、LFU(Least Frequently Used)：最不经常使用，频率/次数\n *      b、LRU(Least Recently Used)：最近最久未使用，时间\n *\n * Created by xuxueli on 17/3/10.\n */\npublic class ExecutorRouteLFU extends ExecutorRouter {\n\n    private static ConcurrentMap<Integer, HashMap<String, Integer>> jobLfuMap = new ConcurrentHashMap<Integer, HashMap<String, Integer>>();\n    private static long CACHE_VALID_TIME = 0;\n\n    public String route(int jobId, List<String> addressList) {\n\n        // cache clear\n        if (System.currentTimeMillis() > CACHE_VALID_TIME) {\n            jobLfuMap.clear();\n            CACHE_VALID_TIME = System.currentTimeMillis() + 1000*60*60*24;\n        }\n\n        // lfu item init\n        HashMap<String, Integer> lfuItemMap = jobLfuMap.get(jobId);     // Key排序可以用TreeMap+构造入参Compare；Value排序暂时只能通过ArrayList；\n        if (lfuItemMap == null) {\n            lfuItemMap = new HashMap<String, Integer>();\n            jobLfuMap.putIfAbsent(jobId, lfuItemMap);   // 避免重复覆盖\n        }\n\n        // put new\n        for (String address: addressList) {\n            if (!lfuItemMap.containsKey(address) || lfuItemMap.get(address) >1000000 ) {\n                lfuItemMap.put(address, new Random().nextInt(addressList.size()));  // 初始化时主动Random一次，缓解首次压力\n            }\n        }\n        // remove old\n        List<String> delKeys = new ArrayList<>();\n        for (String existKey: lfuItemMap.keySet()) {\n            if (!addressList.contains(existKey)) {\n                delKeys.add(existKey);\n            }\n        }\n        if (delKeys.size() > 0) {\n            for (String delKey: delKeys) {\n                lfuItemMap.remove(delKey);\n            }\n        }\n\n        // load least userd count address\n        List<Map.Entry<String, Integer>> lfuItemList = new ArrayList<Map.Entry<String, Integer>>(lfuItemMap.entrySet());\n        Collections.sort(lfuItemList, new Comparator<Map.Entry<String, Integer>>() {\n            @Override\n            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {\n                return o1.getValue().compareTo(o2.getValue());\n            }\n        });\n\n        Map.Entry<String, Integer> addressItem = lfuItemList.get(0);\n        String minAddress = addressItem.getKey();\n        addressItem.setValue(addressItem.getValue() + 1);\n\n        return addressItem.getKey();\n    }\n\n    @Override\n    public ReturnT<String> route(TriggerParam triggerParam, List<String> addressList) {\n        String address = route(triggerParam.getJobId(), addressList);\n        return new ReturnT<String>(address);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java",
    "content": "package com.xxl.job.admin.core.route.strategy;\n\nimport com.xxl.job.admin.core.route.ExecutorRouter;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.biz.model.TriggerParam;\n\nimport java.util.ArrayList;\nimport java.util.LinkedHashMap;\nimport java.util.List;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\n\n/**\n * 单个JOB对应的每个执行器，最久为使用的优先被选举\n *      a、LFU(Least Frequently Used)：最不经常使用，频率/次数\n *      b(*)、LRU(Least Recently Used)：最近最久未使用，时间\n *\n * Created by xuxueli on 17/3/10.\n */\npublic class ExecutorRouteLRU extends ExecutorRouter {\n\n    private static ConcurrentMap<Integer, LinkedHashMap<String, String>> jobLRUMap = new ConcurrentHashMap<Integer, LinkedHashMap<String, String>>();\n    private static long CACHE_VALID_TIME = 0;\n\n    public String route(int jobId, List<String> addressList) {\n\n        // cache clear\n        if (System.currentTimeMillis() > CACHE_VALID_TIME) {\n            jobLRUMap.clear();\n            CACHE_VALID_TIME = System.currentTimeMillis() + 1000*60*60*24;\n        }\n\n        // init lru\n        LinkedHashMap<String, String> lruItem = jobLRUMap.get(jobId);\n        if (lruItem == null) {\n            /**\n             * LinkedHashMap\n             *      a、accessOrder：true=访问顺序排序（get/put时排序）；false=插入顺序排期；\n             *      b、removeEldestEntry：新增元素时将会调用，返回true时会删除最老元素；可封装LinkedHashMap并重写该方法，比如定义最大容量，超出是返回true即可实现固定长度的LRU算法；\n             */\n            lruItem = new LinkedHashMap<String, String>(16, 0.75f, true);\n            jobLRUMap.putIfAbsent(jobId, lruItem);\n        }\n\n        // put new\n        for (String address: addressList) {\n            if (!lruItem.containsKey(address)) {\n                lruItem.put(address, address);\n            }\n        }\n        // remove old\n        List<String> delKeys = new ArrayList<>();\n        for (String existKey: lruItem.keySet()) {\n            if (!addressList.contains(existKey)) {\n                delKeys.add(existKey);\n            }\n        }\n        if (delKeys.size() > 0) {\n            for (String delKey: delKeys) {\n                lruItem.remove(delKey);\n            }\n        }\n\n        // load\n        String eldestKey = lruItem.entrySet().iterator().next().getKey();\n        String eldestValue = lruItem.get(eldestKey);\n        return eldestValue;\n    }\n\n    @Override\n    public ReturnT<String> route(TriggerParam triggerParam, List<String> addressList) {\n        String address = route(triggerParam.getJobId(), addressList);\n        return new ReturnT<String>(address);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLast.java",
    "content": "package com.xxl.job.admin.core.route.strategy;\n\nimport com.xxl.job.admin.core.route.ExecutorRouter;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.biz.model.TriggerParam;\n\nimport java.util.List;\n\n/**\n * Created by xuxueli on 17/3/10.\n */\npublic class ExecutorRouteLast extends ExecutorRouter {\n\n    @Override\n    public ReturnT<String> route(TriggerParam triggerParam, List<String> addressList) {\n        return new ReturnT<String>(addressList.get(addressList.size()-1));\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java",
    "content": "package com.xxl.job.admin.core.route.strategy;\n\nimport com.xxl.job.admin.core.route.ExecutorRouter;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.biz.model.TriggerParam;\n\nimport java.util.List;\nimport java.util.Random;\n\n/**\n * Created by xuxueli on 17/3/10.\n */\npublic class ExecutorRouteRandom extends ExecutorRouter {\n\n    private static Random localRandom = new Random();\n\n    @Override\n    public ReturnT<String> route(TriggerParam triggerParam, List<String> addressList) {\n        String address = addressList.get(localRandom.nextInt(addressList.size()));\n        return new ReturnT<String>(address);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java",
    "content": "package com.xxl.job.admin.core.route.strategy;\n\nimport com.xxl.job.admin.core.route.ExecutorRouter;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.biz.model.TriggerParam;\n\nimport java.util.List;\nimport java.util.Random;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\nimport java.util.concurrent.atomic.AtomicInteger;\n\n/**\n * Created by xuxueli on 17/3/10.\n */\npublic class ExecutorRouteRound extends ExecutorRouter {\n\n    private static ConcurrentMap<Integer, AtomicInteger> routeCountEachJob = new ConcurrentHashMap<>();\n    private static long CACHE_VALID_TIME = 0;\n\n    private static int count(int jobId) {\n        // cache clear\n        if (System.currentTimeMillis() > CACHE_VALID_TIME) {\n            routeCountEachJob.clear();\n            CACHE_VALID_TIME = System.currentTimeMillis() + 1000*60*60*24;\n        }\n\n        AtomicInteger count = routeCountEachJob.get(jobId);\n        if (count == null || count.get() > 1000000) {\n            // 初始化时主动Random一次，缓解首次压力\n            count = new AtomicInteger(new Random().nextInt(100));\n        } else {\n            // count++\n            count.addAndGet(1);\n        }\n        routeCountEachJob.put(jobId, count);\n        return count.get();\n    }\n\n    @Override\n    public ReturnT<String> route(TriggerParam triggerParam, List<String> addressList) {\n        String address = addressList.get(count(triggerParam.getJobId())%addressList.size());\n        return new ReturnT<String>(address);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/scheduler/MisfireStrategyEnum.java",
    "content": "package com.xxl.job.admin.core.scheduler;\n\nimport com.xxl.job.admin.core.util.I18nUtil;\n\n/**\n * @author xuxueli 2020-10-29 21:11:23\n */\npublic enum MisfireStrategyEnum {\n\n    /**\n     * do nothing\n     */\n    DO_NOTHING(I18nUtil.getString(\"misfire_strategy_do_nothing\")),\n\n    /**\n     * fire once now\n     */\n    FIRE_ONCE_NOW(I18nUtil.getString(\"misfire_strategy_fire_once_now\"));\n\n    private String title;\n\n    MisfireStrategyEnum(String title) {\n        this.title = title;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public static MisfireStrategyEnum match(String name, MisfireStrategyEnum defaultItem){\n        for (MisfireStrategyEnum item: MisfireStrategyEnum.values()) {\n            if (item.name().equals(name)) {\n                return item;\n            }\n        }\n        return defaultItem;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/scheduler/ScheduleTypeEnum.java",
    "content": "package com.xxl.job.admin.core.scheduler;\n\nimport com.xxl.job.admin.core.util.I18nUtil;\n\n/**\n * @author xuxueli 2020-10-29 21:11:23\n */\npublic enum ScheduleTypeEnum {\n\n    NONE(I18nUtil.getString(\"schedule_type_none\")),\n\n    /**\n     * schedule by cron\n     */\n    CRON(I18nUtil.getString(\"schedule_type_cron\")),\n\n    /**\n     * schedule by fixed rate (in seconds)\n     */\n    FIX_RATE(I18nUtil.getString(\"schedule_type_fix_rate\")),\n\n    /**\n     * schedule by fix delay (in seconds)， after the last time\n     */\n    /*FIX_DELAY(I18nUtil.getString(\"schedule_type_fix_delay\"))*/;\n\n    private String title;\n\n    ScheduleTypeEnum(String title) {\n        this.title = title;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public static ScheduleTypeEnum match(String name, ScheduleTypeEnum defaultItem){\n        for (ScheduleTypeEnum item: ScheduleTypeEnum.values()) {\n            if (item.name().equals(name)) {\n                return item;\n            }\n        }\n        return defaultItem;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/scheduler/XxlJobScheduler.java",
    "content": "package com.xxl.job.admin.core.scheduler;\n\nimport com.xxl.job.admin.core.conf.XxlJobAdminConfig;\nimport com.xxl.job.admin.core.thread.*;\nimport com.xxl.job.admin.core.util.I18nUtil;\nimport com.xxl.job.core.biz.ExecutorBiz;\nimport com.xxl.job.core.biz.client.ExecutorBizClient;\nimport com.xxl.job.core.enums.ExecutorBlockStrategyEnum;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\n\n/**\n * @author xuxueli 2018-10-28 00:18:17\n */\n\npublic class XxlJobScheduler  {\n    private static final Logger logger = LoggerFactory.getLogger(XxlJobScheduler.class);\n\n\n    public void init() throws Exception {\n        // init i18n\n        initI18n();\n\n        // admin trigger pool start\n        JobTriggerPoolHelper.toStart();\n\n        // admin registry monitor run\n        JobRegistryHelper.getInstance().start();\n\n        // admin fail-monitor run\n        JobFailMonitorHelper.getInstance().start();\n\n        // admin lose-monitor run ( depend on JobTriggerPoolHelper )\n        JobCompleteHelper.getInstance().start();\n\n        // admin log report start\n        JobLogReportHelper.getInstance().start();\n\n        // start-schedule  ( depend on JobTriggerPoolHelper )\n        JobScheduleHelper.getInstance().start();\n\n        logger.info(\">>>>>>>>> init xxl-job admin success.\");\n    }\n\n    \n    public void destroy() throws Exception {\n\n        // stop-schedule\n        JobScheduleHelper.getInstance().toStop();\n\n        // admin log report stop\n        JobLogReportHelper.getInstance().toStop();\n\n        // admin lose-monitor stop\n        JobCompleteHelper.getInstance().toStop();\n\n        // admin fail-monitor stop\n        JobFailMonitorHelper.getInstance().toStop();\n\n        // admin registry stop\n        JobRegistryHelper.getInstance().toStop();\n\n        // admin trigger pool stop\n        JobTriggerPoolHelper.toStop();\n\n    }\n\n    // ---------------------- I18n ----------------------\n\n    private void initI18n(){\n        for (ExecutorBlockStrategyEnum item:ExecutorBlockStrategyEnum.values()) {\n            item.setTitle(I18nUtil.getString(\"jobconf_block_\".concat(item.name())));\n        }\n    }\n\n    // ---------------------- executor-client ----------------------\n    private static ConcurrentMap<String, ExecutorBiz> executorBizRepository = new ConcurrentHashMap<String, ExecutorBiz>();\n    public static ExecutorBiz getExecutorBiz(String address) throws Exception {\n        // valid\n        if (address==null || address.trim().length()==0) {\n            return null;\n        }\n\n        // load-cache\n        address = address.trim();\n        ExecutorBiz executorBiz = executorBizRepository.get(address);\n        if (executorBiz != null) {\n            return executorBiz;\n        }\n\n        // set-cache\n        executorBiz = new ExecutorBizClient(address, XxlJobAdminConfig.getAdminConfig().getAccessToken());\n\n        executorBizRepository.put(address, executorBiz);\n        return executorBiz;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java",
    "content": "package com.xxl.job.admin.core.thread;\n\nimport com.xxl.job.admin.core.complete.XxlJobCompleter;\nimport com.xxl.job.admin.core.conf.XxlJobAdminConfig;\nimport com.xxl.job.admin.core.model.XxlJobLog;\nimport com.xxl.job.admin.core.util.I18nUtil;\nimport com.xxl.job.core.biz.model.HandleCallbackParam;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.util.DateUtil;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport java.util.Date;\nimport java.util.List;\nimport java.util.concurrent.*;\n\n/**\n * job lose-monitor instance\n *\n * @author xuxueli 2015-9-1 18:05:56\n */\npublic class JobCompleteHelper {\n\tprivate static Logger logger = LoggerFactory.getLogger(JobCompleteHelper.class);\n\t\n\tprivate static JobCompleteHelper instance = new JobCompleteHelper();\n\tpublic static JobCompleteHelper getInstance(){\n\t\treturn instance;\n\t}\n\n\t// ---------------------- monitor ----------------------\n\n\tprivate ThreadPoolExecutor callbackThreadPool = null;\n\tprivate Thread monitorThread;\n\tprivate volatile boolean toStop = false;\n\tpublic void start(){\n\n\t\t// for callback\n\t\tcallbackThreadPool = new ThreadPoolExecutor(\n\t\t\t\t2,\n\t\t\t\t20,\n\t\t\t\t30L,\n\t\t\t\tTimeUnit.SECONDS,\n\t\t\t\tnew LinkedBlockingQueue<Runnable>(3000),\n\t\t\t\tnew ThreadFactory() {\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic Thread newThread(Runnable r) {\n\t\t\t\t\t\treturn new Thread(r, \"xxl-job, admin JobLosedMonitorHelper-callbackThreadPool-\" + r.hashCode());\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tnew RejectedExecutionHandler() {\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {\n\t\t\t\t\t\tr.run();\n\t\t\t\t\t\tlogger.warn(\">>>>>>>>>>> xxl-job, callback too fast, match threadpool rejected handler(run now).\");\n\t\t\t\t\t}\n\t\t\t\t});\n\n\n\t\t// for monitor\n\t\tmonitorThread = new Thread(new Runnable() {\n\n\t\t\t@Override\n\t\t\tpublic void run() {\n\n\t\t\t\t// wait for JobTriggerPoolHelper-init\n\t\t\t\ttry {\n\t\t\t\t\tTimeUnit.MILLISECONDS.sleep(50);\n\t\t\t\t} catch (InterruptedException e) {\n\t\t\t\t\tif (!toStop) {\n\t\t\t\t\t\tlogger.error(e.getMessage(), e);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// monitor\n\t\t\t\twhile (!toStop) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// 任务结果丢失处理：调度记录停留在 \"运行中\" 状态超过10min，且对应执行器心跳注册失败不在线，则将本地调度主动标记失败；\n\t\t\t\t\t\tDate losedTime = DateUtil.addMinutes(new Date(), -10);\n\t\t\t\t\t\tList<Long> losedJobIds  = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findLostJobIds(losedTime);\n\n\t\t\t\t\t\tif (losedJobIds!=null && losedJobIds.size()>0) {\n\t\t\t\t\t\t\tfor (Long logId: losedJobIds) {\n\n\t\t\t\t\t\t\t\tXxlJobLog jobLog = new XxlJobLog();\n\t\t\t\t\t\t\t\tjobLog.setId(logId);\n\n\t\t\t\t\t\t\t\tjobLog.setHandleTime(new Date());\n\t\t\t\t\t\t\t\tjobLog.setHandleCode(ReturnT.FAIL_CODE);\n\t\t\t\t\t\t\t\tjobLog.setHandleMsg( I18nUtil.getString(\"joblog_lost_fail\") );\n\n\t\t\t\t\t\t\t\tXxlJobCompleter.updateHandleInfoAndFinish(jobLog);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\tif (!toStop) {\n\t\t\t\t\t\t\tlogger.error(\">>>>>>>>>>> xxl-job, job fail monitor thread error:{}\", e);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n                    try {\n                        TimeUnit.SECONDS.sleep(60);\n                    } catch (Exception e) {\n                        if (!toStop) {\n                            logger.error(e.getMessage(), e);\n                        }\n                    }\n\n                }\n\n\t\t\t\tlogger.info(\">>>>>>>>>>> xxl-job, JobLosedMonitorHelper stop\");\n\n\t\t\t}\n\t\t});\n\t\tmonitorThread.setDaemon(true);\n\t\tmonitorThread.setName(\"xxl-job, admin JobLosedMonitorHelper\");\n\t\tmonitorThread.start();\n\t}\n\n\tpublic void toStop(){\n\t\ttoStop = true;\n\n\t\t// stop registryOrRemoveThreadPool\n\t\tcallbackThreadPool.shutdownNow();\n\n\t\t// stop monitorThread (interrupt and wait)\n\t\tmonitorThread.interrupt();\n\t\ttry {\n\t\t\tmonitorThread.join();\n\t\t} catch (InterruptedException e) {\n\t\t\tlogger.error(e.getMessage(), e);\n\t\t}\n\t}\n\n\n\t// ---------------------- helper ----------------------\n\n\tpublic ReturnT<String> callback(List<HandleCallbackParam> callbackParamList) {\n\n\t\tcallbackThreadPool.execute(new Runnable() {\n\t\t\t@Override\n\t\t\tpublic void run() {\n\t\t\t\tfor (HandleCallbackParam handleCallbackParam: callbackParamList) {\n\t\t\t\t\tReturnT<String> callbackResult = callback(handleCallbackParam);\n\t\t\t\t\tlogger.debug(\">>>>>>>>> JobApiController.callback {}, handleCallbackParam={}, callbackResult={}\",\n\t\t\t\t\t\t\t(callbackResult.getCode()== ReturnT.SUCCESS_CODE?\"success\":\"fail\"), handleCallbackParam, callbackResult);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn ReturnT.SUCCESS;\n\t}\n\n\tprivate ReturnT<String> callback(HandleCallbackParam handleCallbackParam) {\n\t\t// valid log item\n\t\tXxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(handleCallbackParam.getLogId());\n\t\tif (log == null) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, \"log item not found.\");\n\t\t}\n\t\tif (log.getHandleCode() > 0) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, \"log repeate callback.\");     // avoid repeat callback, trigger child job etc\n\t\t}\n\n\t\t// handle msg\n\t\tStringBuffer handleMsg = new StringBuffer();\n\t\tif (log.getHandleMsg()!=null) {\n\t\t\thandleMsg.append(log.getHandleMsg()).append(\"<br>\");\n\t\t}\n\t\tif (handleCallbackParam.getHandleMsg() != null) {\n\t\t\thandleMsg.append(handleCallbackParam.getHandleMsg());\n\t\t}\n\n\t\t// success, save log\n\t\tlog.setHandleTime(new Date());\n\t\tlog.setHandleCode(handleCallbackParam.getHandleCode());\n\t\tlog.setHandleMsg(handleMsg.toString());\n\t\tXxlJobCompleter.updateHandleInfoAndFinish(log);\n\n\t\treturn ReturnT.SUCCESS;\n\t}\n\n\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java",
    "content": "package com.xxl.job.admin.core.thread;\n\nimport com.xxl.job.admin.core.conf.XxlJobAdminConfig;\nimport com.xxl.job.admin.core.model.XxlJobInfo;\nimport com.xxl.job.admin.core.model.XxlJobLog;\nimport com.xxl.job.admin.core.trigger.TriggerTypeEnum;\nimport com.xxl.job.admin.core.util.I18nUtil;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * job monitor instance\n *\n * @author xuxueli 2015-9-1 18:05:56\n */\npublic class JobFailMonitorHelper {\n\tprivate static Logger logger = LoggerFactory.getLogger(JobFailMonitorHelper.class);\n\t\n\tprivate static JobFailMonitorHelper instance = new JobFailMonitorHelper();\n\tpublic static JobFailMonitorHelper getInstance(){\n\t\treturn instance;\n\t}\n\n\t// ---------------------- monitor ----------------------\n\n\tprivate Thread monitorThread;\n\tprivate volatile boolean toStop = false;\n\tpublic void start(){\n\t\tmonitorThread = new Thread(new Runnable() {\n\n\t\t\t@Override\n\t\t\tpublic void run() {\n\n\t\t\t\t// monitor\n\t\t\t\twhile (!toStop) {\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tList<Long> failLogIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findFailJobLogIds(1000);\n\t\t\t\t\t\tif (failLogIds!=null && !failLogIds.isEmpty()) {\n\t\t\t\t\t\t\tfor (long failLogId: failLogIds) {\n\n\t\t\t\t\t\t\t\t// lock log\n\t\t\t\t\t\t\t\tint lockRet = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, 0, -1);\n\t\t\t\t\t\t\t\tif (lockRet < 1) {\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tXxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(failLogId);\n\t\t\t\t\t\t\t\tXxlJobInfo info = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(log.getJobId());\n\n\t\t\t\t\t\t\t\t// 1、fail retry monitor\n\t\t\t\t\t\t\t\tif (log.getExecutorFailRetryCount() > 0) {\n\t\t\t\t\t\t\t\t\tJobTriggerPoolHelper.trigger(log.getJobId(), TriggerTypeEnum.RETRY, (log.getExecutorFailRetryCount()-1), log.getExecutorShardingParam(), log.getExecutorParam(), null);\n\t\t\t\t\t\t\t\t\tString retryMsg = \"<br><br><span style=\\\"color:#F39C12;\\\" > >>>>>>>>>>>\"+ I18nUtil.getString(\"jobconf_trigger_type_retry\") +\"<<<<<<<<<<< </span><br>\";\n\t\t\t\t\t\t\t\t\tlog.setTriggerMsg(log.getTriggerMsg() + retryMsg);\n\t\t\t\t\t\t\t\t\tXxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateTriggerInfo(log);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// 2、fail alarm monitor\n\t\t\t\t\t\t\t\tint newAlarmStatus = 0;\t\t// 告警状态：0-默认、-1=锁定状态、1-无需告警、2-告警成功、3-告警失败\n\t\t\t\t\t\t\t\tif (info != null) {\n\t\t\t\t\t\t\t\t\tboolean alarmResult = XxlJobAdminConfig.getAdminConfig().getJobAlarmer().alarm(info, log);\n\t\t\t\t\t\t\t\t\tnewAlarmStatus = alarmResult?2:3;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewAlarmStatus = 1;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tXxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, -1, newAlarmStatus);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\tif (!toStop) {\n\t\t\t\t\t\t\tlogger.error(\">>>>>>>>>>> xxl-job, job fail monitor thread error:{}\", e);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n                    try {\n                        TimeUnit.SECONDS.sleep(10);\n                    } catch (Exception e) {\n                        if (!toStop) {\n                            logger.error(e.getMessage(), e);\n                        }\n                    }\n\n                }\n\n\t\t\t\tlogger.info(\">>>>>>>>>>> xxl-job, job fail monitor thread stop\");\n\n\t\t\t}\n\t\t});\n\t\tmonitorThread.setDaemon(true);\n\t\tmonitorThread.setName(\"xxl-job, admin JobFailMonitorHelper\");\n\t\tmonitorThread.start();\n\t}\n\n\tpublic void toStop(){\n\t\ttoStop = true;\n\t\t// interrupt and wait\n\t\tmonitorThread.interrupt();\n\t\ttry {\n\t\t\tmonitorThread.join();\n\t\t} catch (InterruptedException e) {\n\t\t\tlogger.error(e.getMessage(), e);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java",
    "content": "package com.xxl.job.admin.core.thread;\n\nimport com.xxl.job.admin.core.conf.XxlJobAdminConfig;\nimport com.xxl.job.admin.core.model.XxlJobLogReport;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport java.util.Calendar;\nimport java.util.Date;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * job log report helper\n *\n * @author xuxueli 2019-11-22\n */\npublic class JobLogReportHelper {\n    private static Logger logger = LoggerFactory.getLogger(JobLogReportHelper.class);\n\n    private static JobLogReportHelper instance = new JobLogReportHelper();\n    public static JobLogReportHelper getInstance(){\n        return instance;\n    }\n\n\n    private Thread logrThread;\n    private volatile boolean toStop = false;\n    public void start(){\n        logrThread = new Thread(new Runnable() {\n\n            @Override\n            public void run() {\n\n                // last clean log time\n                long lastCleanLogTime = 0;\n\n\n                while (!toStop) {\n\n                    // 1、log-report refresh: refresh log report in 3 days\n                    try {\n\n                        for (int i = 0; i < 3; i++) {\n\n                            // today\n                            Calendar itemDay = Calendar.getInstance();\n                            itemDay.add(Calendar.DAY_OF_MONTH, -i);\n                            itemDay.set(Calendar.HOUR_OF_DAY, 0);\n                            itemDay.set(Calendar.MINUTE, 0);\n                            itemDay.set(Calendar.SECOND, 0);\n                            itemDay.set(Calendar.MILLISECOND, 0);\n\n                            Date todayFrom = itemDay.getTime();\n\n                            itemDay.set(Calendar.HOUR_OF_DAY, 23);\n                            itemDay.set(Calendar.MINUTE, 59);\n                            itemDay.set(Calendar.SECOND, 59);\n                            itemDay.set(Calendar.MILLISECOND, 999);\n\n                            Date todayTo = itemDay.getTime();\n\n                            // refresh log-report every minute\n                            XxlJobLogReport xxlJobLogReport = new XxlJobLogReport();\n                            xxlJobLogReport.setTriggerDay(todayFrom);\n                            xxlJobLogReport.setRunningCount(0);\n                            xxlJobLogReport.setSucCount(0);\n                            xxlJobLogReport.setFailCount(0);\n\n                            Map<String, Object> triggerCountMap = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findLogReport(todayFrom, todayTo);\n                            if (triggerCountMap!=null && triggerCountMap.size()>0) {\n                                int triggerDayCount = triggerCountMap.containsKey(\"triggerDayCount\")?Integer.valueOf(String.valueOf(triggerCountMap.get(\"triggerDayCount\"))):0;\n                                int triggerDayCountRunning = triggerCountMap.containsKey(\"triggerDayCountRunning\")?Integer.valueOf(String.valueOf(triggerCountMap.get(\"triggerDayCountRunning\"))):0;\n                                int triggerDayCountSuc = triggerCountMap.containsKey(\"triggerDayCountSuc\")?Integer.valueOf(String.valueOf(triggerCountMap.get(\"triggerDayCountSuc\"))):0;\n                                int triggerDayCountFail = triggerDayCount - triggerDayCountRunning - triggerDayCountSuc;\n\n                                xxlJobLogReport.setRunningCount(triggerDayCountRunning);\n                                xxlJobLogReport.setSucCount(triggerDayCountSuc);\n                                xxlJobLogReport.setFailCount(triggerDayCountFail);\n                            }\n\n                            // do refresh\n                            int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobLogReportDao().update(xxlJobLogReport);\n                            if (ret < 1) {\n                                XxlJobAdminConfig.getAdminConfig().getXxlJobLogReportDao().save(xxlJobLogReport);\n                            }\n                        }\n\n                    } catch (Exception e) {\n                        if (!toStop) {\n                            logger.error(\">>>>>>>>>>> xxl-job, job log report thread error:{}\", e);\n                        }\n                    }\n\n                    // 2、log-clean: switch open & once each day\n                    if (XxlJobAdminConfig.getAdminConfig().getLogretentiondays()>0\n                            && System.currentTimeMillis() - lastCleanLogTime > 24*60*60*1000) {\n\n                        // expire-time\n                        Calendar expiredDay = Calendar.getInstance();\n                        expiredDay.add(Calendar.DAY_OF_MONTH, -1 * XxlJobAdminConfig.getAdminConfig().getLogretentiondays());\n                        expiredDay.set(Calendar.HOUR_OF_DAY, 0);\n                        expiredDay.set(Calendar.MINUTE, 0);\n                        expiredDay.set(Calendar.SECOND, 0);\n                        expiredDay.set(Calendar.MILLISECOND, 0);\n                        Date clearBeforeTime = expiredDay.getTime();\n\n                        // clean expired log\n                        List<Long> logIds = null;\n                        do {\n                            logIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findClearLogIds(0, 0, clearBeforeTime, 0, 1000);\n                            if (logIds!=null && logIds.size()>0) {\n                                XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().clearLog(logIds);\n                            }\n                        } while (logIds!=null && logIds.size()>0);\n\n                        // update clean time\n                        lastCleanLogTime = System.currentTimeMillis();\n                    }\n\n                    try {\n                        TimeUnit.MINUTES.sleep(1);\n                    } catch (Exception e) {\n                        if (!toStop) {\n                            logger.error(e.getMessage(), e);\n                        }\n                    }\n\n                }\n\n                logger.info(\">>>>>>>>>>> xxl-job, job log report thread stop\");\n\n            }\n        });\n        logrThread.setDaemon(true);\n        logrThread.setName(\"xxl-job, admin JobLogReportHelper\");\n        logrThread.start();\n    }\n\n    public void toStop(){\n        toStop = true;\n        // interrupt and wait\n        logrThread.interrupt();\n        try {\n            logrThread.join();\n        } catch (InterruptedException e) {\n            logger.error(e.getMessage(), e);\n        }\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java",
    "content": "package com.xxl.job.admin.core.thread;\n\nimport com.xxl.job.admin.core.conf.XxlJobAdminConfig;\nimport com.xxl.job.admin.core.model.XxlJobGroup;\nimport com.xxl.job.admin.core.model.XxlJobRegistry;\nimport com.xxl.job.core.biz.model.RegistryParam;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.enums.RegistryConfig;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.util.StringUtils;\n\nimport java.util.*;\nimport java.util.concurrent.*;\n\n/**\n * job registry instance\n * @author xuxueli 2016-10-02 19:10:24\n */\npublic class JobRegistryHelper {\n\tprivate static Logger logger = LoggerFactory.getLogger(JobRegistryHelper.class);\n\n\tprivate static JobRegistryHelper instance = new JobRegistryHelper();\n\tpublic static JobRegistryHelper getInstance(){\n\t\treturn instance;\n\t}\n\n\tprivate ThreadPoolExecutor registryOrRemoveThreadPool = null;\n\tprivate Thread registryMonitorThread;\n\tprivate volatile boolean toStop = false;\n\n\tpublic void start(){\n\n\t\t// for registry or remove\n\t\tregistryOrRemoveThreadPool = new ThreadPoolExecutor(\n\t\t\t\t2,\n\t\t\t\t10,\n\t\t\t\t30L,\n\t\t\t\tTimeUnit.SECONDS,\n\t\t\t\tnew LinkedBlockingQueue<Runnable>(2000),\n\t\t\t\tnew ThreadFactory() {\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic Thread newThread(Runnable r) {\n\t\t\t\t\t\treturn new Thread(r, \"xxl-job, admin JobRegistryMonitorHelper-registryOrRemoveThreadPool-\" + r.hashCode());\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tnew RejectedExecutionHandler() {\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {\n\t\t\t\t\t\tr.run();\n\t\t\t\t\t\tlogger.warn(\">>>>>>>>>>> xxl-job, registry or remove too fast, match threadpool rejected handler(run now).\");\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t// for monitor\n\t\tregistryMonitorThread = new Thread(new Runnable() {\n\t\t\t@Override\n\t\t\tpublic void run() {\n\t\t\t\twhile (!toStop) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// auto registry group\n\t\t\t\t\t\tList<XxlJobGroup> groupList = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().findByAddressType(0);\n\t\t\t\t\t\tif (groupList!=null && !groupList.isEmpty()) {\n\n\t\t\t\t\t\t\t// remove dead address (admin/executor)\n\t\t\t\t\t\t\tList<Integer> ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT, new Date());\n\t\t\t\t\t\t\tif (ids!=null && ids.size()>0) {\n\t\t\t\t\t\t\t\tXxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().removeDead(ids);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// fresh online address (admin/executor)\n\t\t\t\t\t\t\tHashMap<String, List<String>> appAddressMap = new HashMap<String, List<String>>();\n\t\t\t\t\t\t\tList<XxlJobRegistry> list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAll(RegistryConfig.DEAD_TIMEOUT, new Date());\n\t\t\t\t\t\t\tif (list != null) {\n\t\t\t\t\t\t\t\tfor (XxlJobRegistry item: list) {\n\t\t\t\t\t\t\t\t\tif (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {\n\t\t\t\t\t\t\t\t\t\tString appname = item.getRegistryKey();\n\t\t\t\t\t\t\t\t\t\tList<String> registryList = appAddressMap.get(appname);\n\t\t\t\t\t\t\t\t\t\tif (registryList == null) {\n\t\t\t\t\t\t\t\t\t\t\tregistryList = new ArrayList<String>();\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif (!registryList.contains(item.getRegistryValue())) {\n\t\t\t\t\t\t\t\t\t\t\tregistryList.add(item.getRegistryValue());\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tappAddressMap.put(appname, registryList);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// fresh group address\n\t\t\t\t\t\t\tfor (XxlJobGroup group: groupList) {\n\t\t\t\t\t\t\t\tList<String> registryList = appAddressMap.get(group.getAppname());\n\t\t\t\t\t\t\t\tString addressListStr = null;\n\t\t\t\t\t\t\t\tif (registryList!=null && !registryList.isEmpty()) {\n\t\t\t\t\t\t\t\t\tCollections.sort(registryList);\n\t\t\t\t\t\t\t\t\tStringBuilder addressListSB = new StringBuilder();\n\t\t\t\t\t\t\t\t\tfor (String item:registryList) {\n\t\t\t\t\t\t\t\t\t\taddressListSB.append(item).append(\",\");\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\taddressListStr = addressListSB.toString();\n\t\t\t\t\t\t\t\t\taddressListStr = addressListStr.substring(0, addressListStr.length()-1);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tgroup.setAddressList(addressListStr);\n\t\t\t\t\t\t\t\tgroup.setUpdateTime(new Date());\n\n\t\t\t\t\t\t\t\tXxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().update(group);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\tif (!toStop) {\n\t\t\t\t\t\t\tlogger.error(\">>>>>>>>>>> xxl-job, job registry monitor thread error:{}\", e);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tTimeUnit.SECONDS.sleep(RegistryConfig.BEAT_TIMEOUT);\n\t\t\t\t\t} catch (InterruptedException e) {\n\t\t\t\t\t\tif (!toStop) {\n\t\t\t\t\t\t\tlogger.error(\">>>>>>>>>>> xxl-job, job registry monitor thread error:{}\", e);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlogger.info(\">>>>>>>>>>> xxl-job, job registry monitor thread stop\");\n\t\t\t}\n\t\t});\n\t\tregistryMonitorThread.setDaemon(true);\n\t\tregistryMonitorThread.setName(\"xxl-job, admin JobRegistryMonitorHelper-registryMonitorThread\");\n\t\tregistryMonitorThread.start();\n\t}\n\n\tpublic void toStop(){\n\t\ttoStop = true;\n\n\t\t// stop registryOrRemoveThreadPool\n\t\tregistryOrRemoveThreadPool.shutdownNow();\n\n\t\t// stop monitir (interrupt and wait)\n\t\tregistryMonitorThread.interrupt();\n\t\ttry {\n\t\t\tregistryMonitorThread.join();\n\t\t} catch (InterruptedException e) {\n\t\t\tlogger.error(e.getMessage(), e);\n\t\t}\n\t}\n\n\n\t// ---------------------- helper ----------------------\n\n\tpublic ReturnT<String> registry(RegistryParam registryParam) {\n\n\t\t// valid\n\t\tif (!StringUtils.hasText(registryParam.getRegistryGroup())\n\t\t\t\t|| !StringUtils.hasText(registryParam.getRegistryKey())\n\t\t\t\t|| !StringUtils.hasText(registryParam.getRegistryValue())) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, \"Illegal Argument.\");\n\t\t}\n\n\t\t// async execute\n\t\tregistryOrRemoveThreadPool.execute(new Runnable() {\n\t\t\t@Override\n\t\t\tpublic void run() {\n\t\t\t\tint ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryUpdate(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date());\n\t\t\t\tif (ret < 1) {\n\t\t\t\t\tXxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registrySave(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date());\n\n\t\t\t\t\t// fresh\n\t\t\t\t\tfreshGroupRegistryInfo(registryParam);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn ReturnT.SUCCESS;\n\t}\n\n\tpublic ReturnT<String> registryRemove(RegistryParam registryParam) {\n\n\t\t// valid\n\t\tif (!StringUtils.hasText(registryParam.getRegistryGroup())\n\t\t\t\t|| !StringUtils.hasText(registryParam.getRegistryKey())\n\t\t\t\t|| !StringUtils.hasText(registryParam.getRegistryValue())) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, \"Illegal Argument.\");\n\t\t}\n\n\t\t// async execute\n\t\tregistryOrRemoveThreadPool.execute(new Runnable() {\n\t\t\t@Override\n\t\t\tpublic void run() {\n\t\t\t\tint ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryDelete(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue());\n\t\t\t\tif (ret > 0) {\n\t\t\t\t\t// fresh\n\t\t\t\t\tfreshGroupRegistryInfo(registryParam);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn ReturnT.SUCCESS;\n\t}\n\n\tprivate void freshGroupRegistryInfo(RegistryParam registryParam){\n\t\t// Under consideration, prevent affecting core tables\n\t}\n\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java",
    "content": "package com.xxl.job.admin.core.thread;\n\nimport com.xxl.job.admin.core.conf.XxlJobAdminConfig;\nimport com.xxl.job.admin.core.cron.CronExpression;\nimport com.xxl.job.admin.core.model.XxlJobInfo;\nimport com.xxl.job.admin.core.scheduler.MisfireStrategyEnum;\nimport com.xxl.job.admin.core.scheduler.ScheduleTypeEnum;\nimport com.xxl.job.admin.core.trigger.TriggerTypeEnum;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport java.sql.Connection;\nimport java.sql.PreparedStatement;\nimport java.sql.SQLException;\nimport java.util.*;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * @author xuxueli 2019-05-21\n */\npublic class JobScheduleHelper {\n    private static Logger logger = LoggerFactory.getLogger(JobScheduleHelper.class);\n\n    private static JobScheduleHelper instance = new JobScheduleHelper();\n    public static JobScheduleHelper getInstance(){\n        return instance;\n    }\n\n    public static final long PRE_READ_MS = 5000;    // pre read\n\n    private Thread scheduleThread;\n    private Thread ringThread;\n    private volatile boolean scheduleThreadToStop = false;\n    private volatile boolean ringThreadToStop = false;\n    private volatile static Map<Integer, List<Integer>> ringData = new ConcurrentHashMap<>();\n\n    public void start(){\n\n        // schedule thread\n        scheduleThread = new Thread(new Runnable() {\n            @Override\n            public void run() {\n\n                try {\n                    TimeUnit.MILLISECONDS.sleep(5000 - System.currentTimeMillis()%1000 );\n                } catch (InterruptedException e) {\n                    if (!scheduleThreadToStop) {\n                        logger.error(e.getMessage(), e);\n                    }\n                }\n                logger.info(\">>>>>>>>> init xxl-job admin scheduler success.\");\n\n                // pre-read count: treadpool-size * trigger-qps (each trigger cost 50ms, qps = 1000/50 = 20)\n                int preReadCount = (XxlJobAdminConfig.getAdminConfig().getTriggerPoolFastMax() + XxlJobAdminConfig.getAdminConfig().getTriggerPoolSlowMax()) * 20;\n\n                while (!scheduleThreadToStop) {\n\n                    // Scan Job\n                    long start = System.currentTimeMillis();\n\n                    Connection conn = null;\n                    Boolean connAutoCommit = null;\n                    PreparedStatement preparedStatement = null;\n\n                    boolean preReadSuc = true;\n                    try {\n\n                        conn = XxlJobAdminConfig.getAdminConfig().getDataSource().getConnection();\n                        connAutoCommit = conn.getAutoCommit();\n                        conn.setAutoCommit(false);\n\n                        preparedStatement = conn.prepareStatement(  \"select * from xxl_job_lock where lock_name = 'schedule_lock' for update\" );\n                        preparedStatement.execute();\n\n                        // tx start\n\n                        // 1、pre read\n                        long nowTime = System.currentTimeMillis();\n                        List<XxlJobInfo> scheduleList = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleJobQuery(nowTime + PRE_READ_MS, preReadCount);\n                        if (scheduleList!=null && scheduleList.size()>0) {\n                            // 2、push time-ring\n                            for (XxlJobInfo jobInfo: scheduleList) {\n\n                                // time-ring jump\n                                if (nowTime > jobInfo.getTriggerNextTime() + PRE_READ_MS) {\n                                    // 2.1、trigger-expire > 5s：pass && make next-trigger-time\n                                    logger.warn(\">>>>>>>>>>> xxl-job, schedule misfire, jobId = \" + jobInfo.getId());\n\n                                    // 1、misfire match\n                                    MisfireStrategyEnum misfireStrategyEnum = MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), MisfireStrategyEnum.DO_NOTHING);\n                                    if (MisfireStrategyEnum.FIRE_ONCE_NOW == misfireStrategyEnum) {\n                                        // FIRE_ONCE_NOW 》 trigger\n                                        JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.MISFIRE, -1, null, null, null);\n                                        logger.debug(\">>>>>>>>>>> xxl-job, schedule push trigger : jobId = \" + jobInfo.getId() );\n                                    }\n\n                                    // 2、fresh next\n                                    refreshNextValidTime(jobInfo, new Date());\n\n                                } else if (nowTime > jobInfo.getTriggerNextTime()) {\n                                    // 2.2、trigger-expire < 5s：direct-trigger && make next-trigger-time\n\n                                    // 1、trigger\n                                    JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.CRON, -1, null, null, null);\n                                    logger.debug(\">>>>>>>>>>> xxl-job, schedule push trigger : jobId = \" + jobInfo.getId() );\n\n                                    // 2、fresh next\n                                    refreshNextValidTime(jobInfo, new Date());\n\n                                    // next-trigger-time in 5s, pre-read again\n                                    if (jobInfo.getTriggerStatus()==1 && nowTime + PRE_READ_MS > jobInfo.getTriggerNextTime()) {\n\n                                        // 1、make ring second\n                                        int ringSecond = (int)((jobInfo.getTriggerNextTime()/1000)%60);\n\n                                        // 2、push time ring\n                                        pushTimeRing(ringSecond, jobInfo.getId());\n\n                                        // 3、fresh next\n                                        refreshNextValidTime(jobInfo, new Date(jobInfo.getTriggerNextTime()));\n\n                                    }\n\n                                } else {\n                                    // 2.3、trigger-pre-read：time-ring trigger && make next-trigger-time\n\n                                    // 1、make ring second\n                                    int ringSecond = (int)((jobInfo.getTriggerNextTime()/1000)%60);\n\n                                    // 2、push time ring\n                                    pushTimeRing(ringSecond, jobInfo.getId());\n\n                                    // 3、fresh next\n                                    refreshNextValidTime(jobInfo, new Date(jobInfo.getTriggerNextTime()));\n\n                                }\n\n                            }\n\n                            // 3、update trigger info\n                            for (XxlJobInfo jobInfo: scheduleList) {\n                                XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleUpdate(jobInfo);\n                            }\n\n                        } else {\n                            preReadSuc = false;\n                        }\n\n                        // tx stop\n\n\n                    } catch (Exception e) {\n                        if (!scheduleThreadToStop) {\n                            logger.error(\">>>>>>>>>>> xxl-job, JobScheduleHelper#scheduleThread error:{}\", e);\n                        }\n                    } finally {\n\n                        // commit\n                        if (conn != null) {\n                            try {\n                                conn.commit();\n                            } catch (SQLException e) {\n                                if (!scheduleThreadToStop) {\n                                    logger.error(e.getMessage(), e);\n                                }\n                            }\n                            try {\n                                conn.setAutoCommit(connAutoCommit);\n                            } catch (SQLException e) {\n                                if (!scheduleThreadToStop) {\n                                    logger.error(e.getMessage(), e);\n                                }\n                            }\n                            try {\n                                conn.close();\n                            } catch (SQLException e) {\n                                if (!scheduleThreadToStop) {\n                                    logger.error(e.getMessage(), e);\n                                }\n                            }\n                        }\n\n                        // close PreparedStatement\n                        if (null != preparedStatement) {\n                            try {\n                                preparedStatement.close();\n                            } catch (SQLException e) {\n                                if (!scheduleThreadToStop) {\n                                    logger.error(e.getMessage(), e);\n                                }\n                            }\n                        }\n                    }\n                    long cost = System.currentTimeMillis()-start;\n\n\n                    // Wait seconds, align second\n                    if (cost < 1000) {  // scan-overtime, not wait\n                        try {\n                            // pre-read period: success > scan each second; fail > skip this period;\n                            TimeUnit.MILLISECONDS.sleep((preReadSuc?1000:PRE_READ_MS) - System.currentTimeMillis()%1000);\n                        } catch (InterruptedException e) {\n                            if (!scheduleThreadToStop) {\n                                logger.error(e.getMessage(), e);\n                            }\n                        }\n                    }\n\n                }\n\n                logger.info(\">>>>>>>>>>> xxl-job, JobScheduleHelper#scheduleThread stop\");\n            }\n        });\n        scheduleThread.setDaemon(true);\n        scheduleThread.setName(\"xxl-job, admin JobScheduleHelper#scheduleThread\");\n        scheduleThread.start();\n\n\n        // ring thread\n        ringThread = new Thread(new Runnable() {\n            @Override\n            public void run() {\n\n                while (!ringThreadToStop) {\n\n                    // align second\n                    try {\n                        TimeUnit.MILLISECONDS.sleep(1000 - System.currentTimeMillis() % 1000);\n                    } catch (InterruptedException e) {\n                        if (!ringThreadToStop) {\n                            logger.error(e.getMessage(), e);\n                        }\n                    }\n\n                    try {\n                        // second data\n                        List<Integer> ringItemData = new ArrayList<>();\n                        int nowSecond = Calendar.getInstance().get(Calendar.SECOND);   // 避免处理耗时太长，跨过刻度，向前校验一个刻度；\n                        for (int i = 0; i < 2; i++) {\n                            List<Integer> tmpData = ringData.remove( (nowSecond+60-i)%60 );\n                            if (tmpData != null) {\n                                ringItemData.addAll(tmpData);\n                            }\n                        }\n\n                        // ring trigger\n                        logger.debug(\">>>>>>>>>>> xxl-job, time-ring beat : \" + nowSecond + \" = \" + Arrays.asList(ringItemData) );\n                        if (ringItemData.size() > 0) {\n                            // do trigger\n                            for (int jobId: ringItemData) {\n                                // do trigger\n                                JobTriggerPoolHelper.trigger(jobId, TriggerTypeEnum.CRON, -1, null, null, null);\n                            }\n                            // clear\n                            ringItemData.clear();\n                        }\n                    } catch (Exception e) {\n                        if (!ringThreadToStop) {\n                            logger.error(\">>>>>>>>>>> xxl-job, JobScheduleHelper#ringThread error:{}\", e);\n                        }\n                    }\n                }\n                logger.info(\">>>>>>>>>>> xxl-job, JobScheduleHelper#ringThread stop\");\n            }\n        });\n        ringThread.setDaemon(true);\n        ringThread.setName(\"xxl-job, admin JobScheduleHelper#ringThread\");\n        ringThread.start();\n    }\n\n    private void refreshNextValidTime(XxlJobInfo jobInfo, Date fromTime) throws Exception {\n        Date nextValidTime = generateNextValidTime(jobInfo, fromTime);\n        if (nextValidTime != null) {\n            jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());\n            jobInfo.setTriggerNextTime(nextValidTime.getTime());\n        } else {\n            jobInfo.setTriggerStatus(0);\n            jobInfo.setTriggerLastTime(0);\n            jobInfo.setTriggerNextTime(0);\n            logger.warn(\">>>>>>>>>>> xxl-job, refreshNextValidTime fail for job: jobId={}, scheduleType={}, scheduleConf={}\",\n                    jobInfo.getId(), jobInfo.getScheduleType(), jobInfo.getScheduleConf());\n        }\n    }\n\n    private void pushTimeRing(int ringSecond, int jobId){\n        // push async ring\n        List<Integer> ringItemData = ringData.get(ringSecond);\n        if (ringItemData == null) {\n            ringItemData = new ArrayList<Integer>();\n            ringData.put(ringSecond, ringItemData);\n        }\n        ringItemData.add(jobId);\n\n        logger.debug(\">>>>>>>>>>> xxl-job, schedule push time-ring : \" + ringSecond + \" = \" + Arrays.asList(ringItemData) );\n    }\n\n    public void toStop(){\n\n        // 1、stop schedule\n        scheduleThreadToStop = true;\n        try {\n            TimeUnit.SECONDS.sleep(1);  // wait\n        } catch (InterruptedException e) {\n            logger.error(e.getMessage(), e);\n        }\n        if (scheduleThread.getState() != Thread.State.TERMINATED){\n            // interrupt and wait\n            scheduleThread.interrupt();\n            try {\n                scheduleThread.join();\n            } catch (InterruptedException e) {\n                logger.error(e.getMessage(), e);\n            }\n        }\n\n        // if has ring data\n        boolean hasRingData = false;\n        if (!ringData.isEmpty()) {\n            for (int second : ringData.keySet()) {\n                List<Integer> tmpData = ringData.get(second);\n                if (tmpData!=null && tmpData.size()>0) {\n                    hasRingData = true;\n                    break;\n                }\n            }\n        }\n        if (hasRingData) {\n            try {\n                TimeUnit.SECONDS.sleep(8);\n            } catch (InterruptedException e) {\n                logger.error(e.getMessage(), e);\n            }\n        }\n\n        // stop ring (wait job-in-memory stop)\n        ringThreadToStop = true;\n        try {\n            TimeUnit.SECONDS.sleep(1);\n        } catch (InterruptedException e) {\n            logger.error(e.getMessage(), e);\n        }\n        if (ringThread.getState() != Thread.State.TERMINATED){\n            // interrupt and wait\n            ringThread.interrupt();\n            try {\n                ringThread.join();\n            } catch (InterruptedException e) {\n                logger.error(e.getMessage(), e);\n            }\n        }\n\n        logger.info(\">>>>>>>>>>> xxl-job, JobScheduleHelper stop\");\n    }\n\n\n    // ---------------------- tools ----------------------\n    public static Date generateNextValidTime(XxlJobInfo jobInfo, Date fromTime) throws Exception {\n        ScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), null);\n        if (ScheduleTypeEnum.CRON == scheduleTypeEnum) {\n            Date nextValidTime = new CronExpression(jobInfo.getScheduleConf()).getNextValidTimeAfter(fromTime);\n            return nextValidTime;\n        } else if (ScheduleTypeEnum.FIX_RATE == scheduleTypeEnum /*|| ScheduleTypeEnum.FIX_DELAY == scheduleTypeEnum*/) {\n            return new Date(fromTime.getTime() + Integer.valueOf(jobInfo.getScheduleConf())*1000 );\n        }\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java",
    "content": "package com.xxl.job.admin.core.thread;\n\nimport com.xxl.job.admin.core.conf.XxlJobAdminConfig;\nimport com.xxl.job.admin.core.trigger.TriggerTypeEnum;\nimport com.xxl.job.admin.core.trigger.XxlJobTrigger;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport java.util.concurrent.*;\nimport java.util.concurrent.atomic.AtomicInteger;\n\n/**\n * job trigger thread pool helper\n *\n * @author xuxueli 2018-07-03 21:08:07\n */\npublic class JobTriggerPoolHelper {\n    private static Logger logger = LoggerFactory.getLogger(JobTriggerPoolHelper.class);\n\n\n    // ---------------------- trigger pool ----------------------\n\n    // fast/slow thread pool\n    private ThreadPoolExecutor fastTriggerPool = null;\n    private ThreadPoolExecutor slowTriggerPool = null;\n\n    public void start(){\n        fastTriggerPool = new ThreadPoolExecutor(\n                10,\n                XxlJobAdminConfig.getAdminConfig().getTriggerPoolFastMax(),\n                60L,\n                TimeUnit.SECONDS,\n                new LinkedBlockingQueue<Runnable>(1000),\n                new ThreadFactory() {\n                    @Override\n                    public Thread newThread(Runnable r) {\n                        return new Thread(r, \"xxl-job, admin JobTriggerPoolHelper-fastTriggerPool-\" + r.hashCode());\n                    }\n                });\n\n        slowTriggerPool = new ThreadPoolExecutor(\n                10,\n                XxlJobAdminConfig.getAdminConfig().getTriggerPoolSlowMax(),\n                60L,\n                TimeUnit.SECONDS,\n                new LinkedBlockingQueue<Runnable>(2000),\n                new ThreadFactory() {\n                    @Override\n                    public Thread newThread(Runnable r) {\n                        return new Thread(r, \"xxl-job, admin JobTriggerPoolHelper-slowTriggerPool-\" + r.hashCode());\n                    }\n                });\n    }\n\n\n    public void stop() {\n        //triggerPool.shutdown();\n        fastTriggerPool.shutdownNow();\n        slowTriggerPool.shutdownNow();\n        logger.info(\">>>>>>>>> xxl-job trigger thread pool shutdown success.\");\n    }\n\n\n    // job timeout count\n    private volatile long minTim = System.currentTimeMillis()/60000;     // ms > min\n    private volatile ConcurrentMap<Integer, AtomicInteger> jobTimeoutCountMap = new ConcurrentHashMap<>();\n\n\n    /**\n     * add trigger\n     */\n    public void addTrigger(final int jobId,\n                           final TriggerTypeEnum triggerType,\n                           final int failRetryCount,\n                           final String executorShardingParam,\n                           final String executorParam,\n                           final String addressList) {\n\n        // choose thread pool\n        ThreadPoolExecutor triggerPool_ = fastTriggerPool;\n        AtomicInteger jobTimeoutCount = jobTimeoutCountMap.get(jobId);\n        if (jobTimeoutCount!=null && jobTimeoutCount.get() > 10) {      // job-timeout 10 times in 1 min\n            triggerPool_ = slowTriggerPool;\n        }\n\n        // trigger\n        triggerPool_.execute(new Runnable() {\n            @Override\n            public void run() {\n\n                long start = System.currentTimeMillis();\n\n                try {\n                    // do trigger\n                    XxlJobTrigger.trigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam, addressList);\n                } catch (Exception e) {\n                    logger.error(e.getMessage(), e);\n                } finally {\n\n                    // check timeout-count-map\n                    long minTim_now = System.currentTimeMillis()/60000;\n                    if (minTim != minTim_now) {\n                        minTim = minTim_now;\n                        jobTimeoutCountMap.clear();\n                    }\n\n                    // incr timeout-count-map\n                    long cost = System.currentTimeMillis()-start;\n                    if (cost > 500) {       // ob-timeout threshold 500ms\n                        AtomicInteger timeoutCount = jobTimeoutCountMap.putIfAbsent(jobId, new AtomicInteger(1));\n                        if (timeoutCount != null) {\n                            timeoutCount.incrementAndGet();\n                        }\n                    }\n\n                }\n\n            }\n        });\n    }\n\n\n\n    // ---------------------- helper ----------------------\n\n    private static JobTriggerPoolHelper helper = new JobTriggerPoolHelper();\n\n    public static void toStart() {\n        helper.start();\n    }\n    public static void toStop() {\n        helper.stop();\n    }\n\n    /**\n     * @param jobId\n     * @param triggerType\n     * @param failRetryCount\n     * \t\t\t>=0: use this param\n     * \t\t\t<0: use param from job info config\n     * @param executorShardingParam\n     * @param executorParam\n     *          null: use job param\n     *          not null: cover job param\n     */\n    public static void trigger(int jobId, TriggerTypeEnum triggerType, int failRetryCount, String executorShardingParam, String executorParam, String addressList) {\n        helper.addTrigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam, addressList);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/trigger/TriggerTypeEnum.java",
    "content": "package com.xxl.job.admin.core.trigger;\n\nimport com.xxl.job.admin.core.util.I18nUtil;\n\n/**\n * trigger type enum\n *\n * @author xuxueli 2018-09-16 04:56:41\n */\npublic enum TriggerTypeEnum {\n\n    MANUAL(I18nUtil.getString(\"jobconf_trigger_type_manual\")),\n    CRON(I18nUtil.getString(\"jobconf_trigger_type_cron\")),\n    RETRY(I18nUtil.getString(\"jobconf_trigger_type_retry\")),\n    PARENT(I18nUtil.getString(\"jobconf_trigger_type_parent\")),\n    API(I18nUtil.getString(\"jobconf_trigger_type_api\")),\n    MISFIRE(I18nUtil.getString(\"jobconf_trigger_type_misfire\"));\n\n    private TriggerTypeEnum(String title){\n        this.title = title;\n    }\n    private String title;\n    public String getTitle() {\n        return title;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java",
    "content": "package com.xxl.job.admin.core.trigger;\n\nimport com.xxl.job.admin.core.conf.XxlJobAdminConfig;\nimport com.xxl.job.admin.core.model.XxlJobGroup;\nimport com.xxl.job.admin.core.model.XxlJobInfo;\nimport com.xxl.job.admin.core.model.XxlJobLog;\nimport com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;\nimport com.xxl.job.admin.core.scheduler.XxlJobScheduler;\nimport com.xxl.job.admin.core.util.I18nUtil;\nimport com.xxl.job.core.biz.ExecutorBiz;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.biz.model.TriggerParam;\nimport com.xxl.job.core.enums.ExecutorBlockStrategyEnum;\nimport com.xxl.job.core.util.IpUtil;\nimport com.xxl.job.core.util.ThrowableUtil;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport java.util.Date;\n\n/**\n * xxl-job trigger\n * Created by xuxueli on 17/7/13.\n */\npublic class XxlJobTrigger {\n    private static Logger logger = LoggerFactory.getLogger(XxlJobTrigger.class);\n\n    /**\n     * trigger job\n     *\n     * @param jobId\n     * @param triggerType\n     * @param failRetryCount\n     * \t\t\t>=0: use this param\n     * \t\t\t<0: use param from job info config\n     * @param executorShardingParam\n     * @param executorParam\n     *          null: use job param\n     *          not null: cover job param\n     * @param addressList\n     *          null: use executor addressList\n     *          not null: cover\n     */\n    public static void trigger(int jobId,\n                               TriggerTypeEnum triggerType,\n                               int failRetryCount,\n                               String executorShardingParam,\n                               String executorParam,\n                               String addressList) {\n\n        // load data\n        XxlJobInfo jobInfo = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(jobId);\n        if (jobInfo == null) {\n            logger.warn(\">>>>>>>>>>>> trigger fail, jobId invalid，jobId={}\", jobId);\n            return;\n        }\n        if (executorParam != null) {\n            jobInfo.setExecutorParam(executorParam);\n        }\n        int finalFailRetryCount = failRetryCount>=0?failRetryCount:jobInfo.getExecutorFailRetryCount();\n        XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().load(jobInfo.getJobGroup());\n\n        // cover addressList\n        if (addressList!=null && addressList.trim().length()>0) {\n            group.setAddressType(1);\n            group.setAddressList(addressList.trim());\n        }\n\n        // sharding param\n        int[] shardingParam = null;\n        if (executorShardingParam!=null){\n            String[] shardingArr = executorShardingParam.split(\"/\");\n            if (shardingArr.length==2 && isNumeric(shardingArr[0]) && isNumeric(shardingArr[1])) {\n                shardingParam = new int[2];\n                shardingParam[0] = Integer.valueOf(shardingArr[0]);\n                shardingParam[1] = Integer.valueOf(shardingArr[1]);\n            }\n        }\n        if (ExecutorRouteStrategyEnum.SHARDING_BROADCAST==ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null)\n                && group.getRegistryList()!=null && !group.getRegistryList().isEmpty()\n                && shardingParam==null) {\n            for (int i = 0; i < group.getRegistryList().size(); i++) {\n                processTrigger(group, jobInfo, finalFailRetryCount, triggerType, i, group.getRegistryList().size());\n            }\n        } else {\n            if (shardingParam == null) {\n                shardingParam = new int[]{0, 1};\n            }\n            processTrigger(group, jobInfo, finalFailRetryCount, triggerType, shardingParam[0], shardingParam[1]);\n        }\n\n    }\n\n    private static boolean isNumeric(String str){\n        try {\n            int result = Integer.valueOf(str);\n            return true;\n        } catch (NumberFormatException e) {\n            return false;\n        }\n    }\n\n    /**\n     * @param group                     job group, registry list may be empty\n     * @param jobInfo\n     * @param finalFailRetryCount\n     * @param triggerType\n     * @param index                     sharding index\n     * @param total                     sharding index\n     */\n    private static void processTrigger(XxlJobGroup group, XxlJobInfo jobInfo, int finalFailRetryCount, TriggerTypeEnum triggerType, int index, int total){\n\n        // param\n        ExecutorBlockStrategyEnum blockStrategy = ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), ExecutorBlockStrategyEnum.SERIAL_EXECUTION);  // block strategy\n        ExecutorRouteStrategyEnum executorRouteStrategyEnum = ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null);    // route strategy\n        String shardingParam = (ExecutorRouteStrategyEnum.SHARDING_BROADCAST==executorRouteStrategyEnum)?String.valueOf(index).concat(\"/\").concat(String.valueOf(total)):null;\n\n        // 1、save log-id\n        XxlJobLog jobLog = new XxlJobLog();\n        jobLog.setJobGroup(jobInfo.getJobGroup());\n        jobLog.setJobId(jobInfo.getId());\n        jobLog.setTriggerTime(new Date());\n        XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().save(jobLog);\n        logger.debug(\">>>>>>>>>>> xxl-job trigger start, jobId:{}\", jobLog.getId());\n\n        // 2、init trigger-param\n        TriggerParam triggerParam = new TriggerParam();\n        triggerParam.setJobId(jobInfo.getId());\n        triggerParam.setExecutorHandler(jobInfo.getExecutorHandler());\n        triggerParam.setExecutorParams(jobInfo.getExecutorParam());\n        triggerParam.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy());\n        triggerParam.setExecutorTimeout(jobInfo.getExecutorTimeout());\n        triggerParam.setLogId(jobLog.getId());\n        triggerParam.setLogDateTime(jobLog.getTriggerTime().getTime());\n        triggerParam.setGlueType(jobInfo.getGlueType());\n        triggerParam.setGlueSource(jobInfo.getGlueSource());\n        triggerParam.setGlueUpdatetime(jobInfo.getGlueUpdatetime().getTime());\n        triggerParam.setBroadcastIndex(index);\n        triggerParam.setBroadcastTotal(total);\n\n        // 3、init address\n        String address = null;\n        ReturnT<String> routeAddressResult = null;\n        if (group.getRegistryList()!=null && !group.getRegistryList().isEmpty()) {\n            if (ExecutorRouteStrategyEnum.SHARDING_BROADCAST == executorRouteStrategyEnum) {\n                if (index < group.getRegistryList().size()) {\n                    address = group.getRegistryList().get(index);\n                } else {\n                    address = group.getRegistryList().get(0);\n                }\n            } else {\n                routeAddressResult = executorRouteStrategyEnum.getRouter().route(triggerParam, group.getRegistryList());\n                if (routeAddressResult.getCode() == ReturnT.SUCCESS_CODE) {\n                    address = routeAddressResult.getContent();\n                }\n            }\n        } else {\n            routeAddressResult = new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString(\"jobconf_trigger_address_empty\"));\n        }\n\n        // 4、trigger remote executor\n        ReturnT<String> triggerResult = null;\n        if (address != null) {\n            triggerResult = runExecutor(triggerParam, address);\n        } else {\n            triggerResult = new ReturnT<String>(ReturnT.FAIL_CODE, null);\n        }\n\n        // 5、collection trigger info\n        StringBuffer triggerMsgSb = new StringBuffer();\n        triggerMsgSb.append(I18nUtil.getString(\"jobconf_trigger_type\")).append(\"：\").append(triggerType.getTitle());\n        triggerMsgSb.append(\"<br>\").append(I18nUtil.getString(\"jobconf_trigger_admin_adress\")).append(\"：\").append(IpUtil.getIp());\n        triggerMsgSb.append(\"<br>\").append(I18nUtil.getString(\"jobconf_trigger_exe_regtype\")).append(\"：\")\n                .append( (group.getAddressType() == 0)?I18nUtil.getString(\"jobgroup_field_addressType_0\"):I18nUtil.getString(\"jobgroup_field_addressType_1\") );\n        triggerMsgSb.append(\"<br>\").append(I18nUtil.getString(\"jobconf_trigger_exe_regaddress\")).append(\"：\").append(group.getRegistryList());\n        triggerMsgSb.append(\"<br>\").append(I18nUtil.getString(\"jobinfo_field_executorRouteStrategy\")).append(\"：\").append(executorRouteStrategyEnum.getTitle());\n        if (shardingParam != null) {\n            triggerMsgSb.append(\"(\"+shardingParam+\")\");\n        }\n        triggerMsgSb.append(\"<br>\").append(I18nUtil.getString(\"jobinfo_field_executorBlockStrategy\")).append(\"：\").append(blockStrategy.getTitle());\n        triggerMsgSb.append(\"<br>\").append(I18nUtil.getString(\"jobinfo_field_timeout\")).append(\"：\").append(jobInfo.getExecutorTimeout());\n        triggerMsgSb.append(\"<br>\").append(I18nUtil.getString(\"jobinfo_field_executorFailRetryCount\")).append(\"：\").append(finalFailRetryCount);\n\n        triggerMsgSb.append(\"<br><br><span style=\\\"color:#00c0ef;\\\" > >>>>>>>>>>>\"+ I18nUtil.getString(\"jobconf_trigger_run\") +\"<<<<<<<<<<< </span><br>\")\n                .append((routeAddressResult!=null&&routeAddressResult.getMsg()!=null)?routeAddressResult.getMsg()+\"<br><br>\":\"\").append(triggerResult.getMsg()!=null?triggerResult.getMsg():\"\");\n\n        // 6、save log trigger-info\n        jobLog.setExecutorAddress(address);\n        jobLog.setExecutorHandler(jobInfo.getExecutorHandler());\n        jobLog.setExecutorParam(jobInfo.getExecutorParam());\n        jobLog.setExecutorShardingParam(shardingParam);\n        jobLog.setExecutorFailRetryCount(finalFailRetryCount);\n        //jobLog.setTriggerTime();\n        jobLog.setTriggerCode(triggerResult.getCode());\n        jobLog.setTriggerMsg(triggerMsgSb.toString());\n        XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateTriggerInfo(jobLog);\n\n        logger.debug(\">>>>>>>>>>> xxl-job trigger end, jobId:{}\", jobLog.getId());\n    }\n\n    /**\n     * run executor\n     * @param triggerParam\n     * @param address\n     * @return\n     */\n    public static ReturnT<String> runExecutor(TriggerParam triggerParam, String address){\n        ReturnT<String> runResult = null;\n        try {\n            ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(address);\n            runResult = executorBiz.run(triggerParam);\n        } catch (Exception e) {\n            logger.error(\">>>>>>>>>>> xxl-job trigger error, please check if the executor[{}] is running.\", address, e);\n            runResult = new ReturnT<String>(ReturnT.FAIL_CODE, ThrowableUtil.toString(e));\n        }\n\n        StringBuffer runResultSB = new StringBuffer(I18nUtil.getString(\"jobconf_trigger_run\") + \"：\");\n        runResultSB.append(\"<br>address：\").append(address);\n        runResultSB.append(\"<br>code：\").append(runResult.getCode());\n        runResultSB.append(\"<br>msg：\").append(runResult.getMsg());\n\n        runResult.setMsg(runResultSB.toString());\n        return runResult;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/util/CookieUtil.java",
    "content": "package com.xxl.job.admin.core.util;\n\nimport jakarta.servlet.http.Cookie;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\n\n/**\n * Cookie.Util\n *\n * @author xuxueli 2015-12-12 18:01:06\n */\npublic class CookieUtil {\n\n\t// 默认缓存时间,单位/秒, 2H\n\tprivate static final int COOKIE_MAX_AGE = Integer.MAX_VALUE;\n\t// 保存路径,根路径\n\tprivate static final String COOKIE_PATH = \"/\";\n\t\n\t/**\n\t * 保存\n\t *\n\t * @param response\n\t * @param key\n\t * @param value\n\t * @param ifRemember \n\t */\n\tpublic static void set(HttpServletResponse response, String key, String value, boolean ifRemember) {\n\t\tint age = ifRemember?COOKIE_MAX_AGE:-1;\n\t\tset(response, key, value, null, COOKIE_PATH, age, true);\n\t}\n\n\t/**\n\t * 保存\n\t *\n\t * @param response\n\t * @param key\n\t * @param value\n\t * @param maxAge\n\t */\n\tprivate static void set(HttpServletResponse response, String key, String value, String domain, String path, int maxAge, boolean isHttpOnly) {\n\t\tCookie cookie = new Cookie(key, value);\n\t\tif (domain != null) {\n\t\t\tcookie.setDomain(domain);\n\t\t}\n\t\tcookie.setPath(path);\n\t\tcookie.setMaxAge(maxAge);\n\t\tcookie.setHttpOnly(isHttpOnly);\n\t\tresponse.addCookie(cookie);\n\t}\n\t\n\t/**\n\t * 查询value\n\t *\n\t * @param request\n\t * @param key\n\t * @return\n\t */\n\tpublic static String getValue(HttpServletRequest request, String key) {\n\t\tCookie cookie = get(request, key);\n\t\tif (cookie != null) {\n\t\t\treturn cookie.getValue();\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * 查询Cookie\n\t *\n\t * @param request\n\t * @param key\n\t */\n\tprivate static Cookie get(HttpServletRequest request, String key) {\n\t\tCookie[] arr_cookie = request.getCookies();\n\t\tif (arr_cookie != null && arr_cookie.length > 0) {\n\t\t\tfor (Cookie cookie : arr_cookie) {\n\t\t\t\tif (cookie.getName().equals(key)) {\n\t\t\t\t\treturn cookie;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\t\n\t/**\n\t * 删除Cookie\n\t *\n\t * @param request\n\t * @param response\n\t * @param key\n\t */\n\tpublic static void remove(HttpServletRequest request, HttpServletResponse response, String key) {\n\t\tCookie cookie = get(request, key);\n\t\tif (cookie != null) {\n\t\t\tset(response, key, \"\", null, COOKIE_PATH, 0, true);\n\t\t}\n\t}\n\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/util/FtlUtil.java",
    "content": "package com.xxl.job.admin.core.util;\n\nimport freemarker.ext.beans.BeansWrapper;\nimport freemarker.ext.beans.BeansWrapperBuilder;\nimport freemarker.template.Configuration;\nimport freemarker.template.TemplateHashModel;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n/**\n * ftl util\n *\n * @author xuxueli 2018-01-17 20:37:48\n */\npublic class FtlUtil {\n    private static Logger logger = LoggerFactory.getLogger(FtlUtil.class);\n\n    private static BeansWrapper wrapper = new BeansWrapperBuilder(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS).build();     //BeansWrapper.getDefaultInstance();\n\n    public static TemplateHashModel generateStaticModel(String packageName) {\n        try {\n            TemplateHashModel staticModels = wrapper.getStaticModels();\n            TemplateHashModel fileStatics = (TemplateHashModel) staticModels.get(packageName);\n            return fileStatics;\n        } catch (Exception e) {\n            logger.error(e.getMessage(), e);\n        }\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/util/I18nUtil.java",
    "content": "package com.xxl.job.admin.core.util;\n\nimport com.xxl.job.admin.core.conf.XxlJobAdminConfig;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.core.io.ClassPathResource;\nimport org.springframework.core.io.Resource;\nimport org.springframework.core.io.support.EncodedResource;\nimport org.springframework.core.io.support.PropertiesLoaderUtils;\n\nimport java.io.IOException;\nimport java.text.MessageFormat;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Properties;\n\n/**\n * i18n util\n *\n * @author xuxueli 2018-01-17 20:39:06\n */\npublic class I18nUtil {\n    private static Logger logger = LoggerFactory.getLogger(I18nUtil.class);\n\n    private static Properties prop = null;\n    public static Properties loadI18nProp(){\n        if (prop != null) {\n            return prop;\n        }\n        try {\n            // build i18n prop\n            String i18n = XxlJobAdminConfig.getAdminConfig().getI18n();\n            String i18nFile = MessageFormat.format(\"i18n/message_{0}.properties\", i18n);\n\n            // load prop\n            Resource resource = new ClassPathResource(i18nFile);\n            EncodedResource encodedResource = new EncodedResource(resource,\"UTF-8\");\n            prop = PropertiesLoaderUtils.loadProperties(encodedResource);\n        } catch (IOException e) {\n            logger.error(e.getMessage(), e);\n        }\n        return prop;\n    }\n\n    /**\n     * get val of i18n key\n     *\n     * @param key\n     * @return\n     */\n    public static String getString(String key) {\n        return loadI18nProp().getProperty(key);\n    }\n\n    /**\n     * get mult val of i18n mult key, as json\n     *\n     * @param keys\n     * @return\n     */\n    public static String getMultString(String... keys) {\n        Map<String, String> map = new HashMap<String, String>();\n\n        Properties prop = loadI18nProp();\n        if (keys!=null && keys.length>0) {\n            for (String key: keys) {\n                map.put(key, prop.getProperty(key));\n            }\n        } else {\n            for (String key: prop.stringPropertyNames()) {\n                map.put(key, prop.getProperty(key));\n            }\n        }\n\n        String json = JacksonUtil.writeValueAsString(map);\n        return json;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/util/JacksonUtil.java",
    "content": "package com.xxl.job.admin.core.util;\n\nimport com.fasterxml.jackson.core.JsonGenerationException;\nimport com.fasterxml.jackson.core.JsonParseException;\nimport com.fasterxml.jackson.databind.JavaType;\nimport com.fasterxml.jackson.databind.JsonMappingException;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport java.io.IOException;\n\n/**\n * Jackson util\n * \n * 1、obj need private and set/get；\n * 2、do not support inner class；\n * \n * @author xuxueli 2015-9-25 18:02:56\n */\npublic class JacksonUtil {\n\tprivate static Logger logger = LoggerFactory.getLogger(JacksonUtil.class);\n\n    private final static ObjectMapper objectMapper = new ObjectMapper();\n    public static ObjectMapper getInstance() {\n        return objectMapper;\n    }\n\n    /**\n     * bean、array、List、Map --> json\n     * \n     * @param obj\n     * @return json string\n     * @throws Exception\n     */\n    public static String writeValueAsString(Object obj) {\n    \ttry {\n\t\t\treturn getInstance().writeValueAsString(obj);\n\t\t} catch (JsonGenerationException e) {\n\t\t\tlogger.error(e.getMessage(), e);\n\t\t} catch (JsonMappingException e) {\n\t\t\tlogger.error(e.getMessage(), e);\n\t\t} catch (IOException e) {\n\t\t\tlogger.error(e.getMessage(), e);\n\t\t}\n        return null;\n    }\n\n    /**\n     * string --> bean、Map、List(array)\n     * \n     * @param jsonStr\n     * @param clazz\n     * @return obj\n     * @throws Exception\n     */\n    public static <T> T readValue(String jsonStr, Class<T> clazz) {\n    \ttry {\n\t\t\treturn getInstance().readValue(jsonStr, clazz);\n\t\t} catch (JsonParseException e) {\n\t\t\tlogger.error(e.getMessage(), e);\n\t\t} catch (JsonMappingException e) {\n\t\t\tlogger.error(e.getMessage(), e);\n\t\t} catch (IOException e) {\n\t\t\tlogger.error(e.getMessage(), e);\n\t\t}\n    \treturn null;\n    }\n\n\t/**\n\t * string --> List<Bean>...\n\t *\n\t * @param jsonStr\n\t * @param parametrized\n\t * @param parameterClasses\n\t * @param <T>\n\t * @return\n\t */\n\tpublic static <T> T readValue(String jsonStr, Class<?> parametrized, Class<?>... parameterClasses) {\n\t\ttry {\n\t\t\tJavaType javaType = getInstance().getTypeFactory().constructParametricType(parametrized, parameterClasses);\n\t\t\treturn getInstance().readValue(jsonStr, javaType);\n\t\t} catch (JsonParseException e) {\n\t\t\tlogger.error(e.getMessage(), e);\n\t\t} catch (JsonMappingException e) {\n\t\t\tlogger.error(e.getMessage(), e);\n\t\t} catch (IOException e) {\n\t\t\tlogger.error(e.getMessage(), e);\n\t\t}\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/core/util/LocalCacheUtil.java",
    "content": "package com.xxl.job.admin.core.util;\n\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\n\n/**\n * local cache tool\n *\n * @author xuxueli 2018-01-22 21:37:34\n */\npublic class LocalCacheUtil {\n\n    private static ConcurrentMap<String, LocalCacheData> cacheRepository = new ConcurrentHashMap<String, LocalCacheData>();   // 类型建议用抽象父类，兼容性更好；\n    private static class LocalCacheData{\n        private String key;\n        private Object val;\n        private long timeoutTime;\n\n        public LocalCacheData() {\n        }\n\n        public LocalCacheData(String key, Object val, long timeoutTime) {\n            this.key = key;\n            this.val = val;\n            this.timeoutTime = timeoutTime;\n        }\n\n        public String getKey() {\n            return key;\n        }\n\n        public void setKey(String key) {\n            this.key = key;\n        }\n\n        public Object getVal() {\n            return val;\n        }\n\n        public void setVal(Object val) {\n            this.val = val;\n        }\n\n        public long getTimeoutTime() {\n            return timeoutTime;\n        }\n\n        public void setTimeoutTime(long timeoutTime) {\n            this.timeoutTime = timeoutTime;\n        }\n    }\n\n\n    /**\n     * set cache\n     *\n     * @param key\n     * @param val\n     * @param cacheTime\n     * @return\n     */\n    public static boolean set(String key, Object val, long cacheTime){\n\n        // clean timeout cache, before set new cache (avoid cache too much)\n        cleanTimeoutCache();\n\n        // set new cache\n        if (key==null || key.trim().length()==0) {\n            return false;\n        }\n        if (val == null) {\n            remove(key);\n        }\n        if (cacheTime <= 0) {\n            remove(key);\n        }\n        long timeoutTime = System.currentTimeMillis() + cacheTime;\n        LocalCacheData localCacheData = new LocalCacheData(key, val, timeoutTime);\n        cacheRepository.put(localCacheData.getKey(), localCacheData);\n        return true;\n    }\n\n    /**\n     * remove cache\n     *\n     * @param key\n     * @return\n     */\n    public static boolean remove(String key){\n        if (key==null || key.trim().length()==0) {\n            return false;\n        }\n        cacheRepository.remove(key);\n        return true;\n    }\n\n    /**\n     * get cache\n     *\n     * @param key\n     * @return\n     */\n    public static Object get(String key){\n        if (key==null || key.trim().length()==0) {\n            return null;\n        }\n        LocalCacheData localCacheData = cacheRepository.get(key);\n        if (localCacheData!=null && System.currentTimeMillis()<localCacheData.getTimeoutTime()) {\n            return localCacheData.getVal();\n        } else {\n            remove(key);\n            return null;\n        }\n    }\n\n    /**\n     * clean timeout cache\n     *\n     * @return\n     */\n    public static boolean cleanTimeoutCache(){\n        if (!cacheRepository.keySet().isEmpty()) {\n            for (String key: cacheRepository.keySet()) {\n                LocalCacheData localCacheData = cacheRepository.get(key);\n                if (localCacheData!=null && System.currentTimeMillis()>=localCacheData.getTimeoutTime()) {\n                    cacheRepository.remove(key);\n                }\n            }\n        }\n        return true;\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/dao/XxlJobGroupDao.java",
    "content": "package com.xxl.job.admin.dao;\n\nimport com.xxl.job.admin.core.model.XxlJobGroup;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\n\nimport java.util.List;\n\n/**\n * Created by xuxueli on 16/9/30.\n */\n@Mapper\npublic interface XxlJobGroupDao {\n\n    public List<XxlJobGroup> findAll();\n\n    public List<XxlJobGroup> findByAddressType(@Param(\"addressType\") int addressType);\n\n    public int save(XxlJobGroup xxlJobGroup);\n\n    public int update(XxlJobGroup xxlJobGroup);\n\n    public int remove(@Param(\"id\") int id);\n\n    public XxlJobGroup load(@Param(\"id\") int id);\n\n    public List<XxlJobGroup> pageList(@Param(\"offset\") int offset,\n                                      @Param(\"pagesize\") int pagesize,\n                                      @Param(\"appname\") String appname,\n                                      @Param(\"title\") String title);\n\n    public int pageListCount(@Param(\"offset\") int offset,\n                             @Param(\"pagesize\") int pagesize,\n                             @Param(\"appname\") String appname,\n                             @Param(\"title\") String title);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java",
    "content": "package com.xxl.job.admin.dao;\n\nimport com.xxl.job.admin.core.model.XxlJobInfo;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\n\nimport java.util.List;\n\n\n/**\n * job info\n * @author xuxueli 2016-1-12 18:03:45\n */\n@Mapper\npublic interface XxlJobInfoDao {\n\n\tpublic List<XxlJobInfo> pageList(@Param(\"offset\") int offset,\n\t\t\t\t\t\t\t\t\t @Param(\"pagesize\") int pagesize,\n\t\t\t\t\t\t\t\t\t @Param(\"jobGroup\") int jobGroup,\n\t\t\t\t\t\t\t\t\t @Param(\"triggerStatus\") int triggerStatus,\n\t\t\t\t\t\t\t\t\t @Param(\"jobDesc\") String jobDesc,\n\t\t\t\t\t\t\t\t\t @Param(\"executorHandler\") String executorHandler,\n\t\t\t\t\t\t\t\t\t @Param(\"author\") String author);\n\tpublic int pageListCount(@Param(\"offset\") int offset,\n\t\t\t\t\t\t\t @Param(\"pagesize\") int pagesize,\n\t\t\t\t\t\t\t @Param(\"jobGroup\") int jobGroup,\n\t\t\t\t\t\t\t @Param(\"triggerStatus\") int triggerStatus,\n\t\t\t\t\t\t\t @Param(\"jobDesc\") String jobDesc,\n\t\t\t\t\t\t\t @Param(\"executorHandler\") String executorHandler,\n\t\t\t\t\t\t\t @Param(\"author\") String author);\n\t\n\tpublic int save(XxlJobInfo info);\n\n\tpublic XxlJobInfo loadById(@Param(\"id\") int id);\n\t\n\tpublic int update(XxlJobInfo xxlJobInfo);\n\t\n\tpublic int delete(@Param(\"id\") long id);\n\n\tpublic List<XxlJobInfo> getJobsByGroup(@Param(\"jobGroup\") int jobGroup);\n\n\tpublic int findAllCount();\n\n\tpublic List<XxlJobInfo> scheduleJobQuery(@Param(\"maxNextTime\") long maxNextTime, @Param(\"pagesize\") int pagesize );\n\n\tpublic int scheduleUpdate(XxlJobInfo xxlJobInfo);\n\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java",
    "content": "package com.xxl.job.admin.dao;\n\nimport com.xxl.job.admin.core.model.XxlJobLog;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\n\nimport java.util.Date;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * job log\n * @author xuxueli 2016-1-12 18:03:06\n */\n@Mapper\npublic interface XxlJobLogDao {\n\n\t// exist jobId not use jobGroup, not exist use jobGroup\n\tpublic List<XxlJobLog> pageList(@Param(\"offset\") int offset,\n\t\t\t\t\t\t\t\t\t@Param(\"pagesize\") int pagesize,\n\t\t\t\t\t\t\t\t\t@Param(\"jobGroup\") int jobGroup,\n\t\t\t\t\t\t\t\t\t@Param(\"jobId\") int jobId,\n\t\t\t\t\t\t\t\t\t@Param(\"triggerTimeStart\") Date triggerTimeStart,\n\t\t\t\t\t\t\t\t\t@Param(\"triggerTimeEnd\") Date triggerTimeEnd,\n\t\t\t\t\t\t\t\t\t@Param(\"logStatus\") int logStatus);\n\tpublic int pageListCount(@Param(\"offset\") int offset,\n\t\t\t\t\t\t\t @Param(\"pagesize\") int pagesize,\n\t\t\t\t\t\t\t @Param(\"jobGroup\") int jobGroup,\n\t\t\t\t\t\t\t @Param(\"jobId\") int jobId,\n\t\t\t\t\t\t\t @Param(\"triggerTimeStart\") Date triggerTimeStart,\n\t\t\t\t\t\t\t @Param(\"triggerTimeEnd\") Date triggerTimeEnd,\n\t\t\t\t\t\t\t @Param(\"logStatus\") int logStatus);\n\t\n\tpublic XxlJobLog load(@Param(\"id\") long id);\n\n\tpublic long save(XxlJobLog xxlJobLog);\n\n\tpublic int updateTriggerInfo(XxlJobLog xxlJobLog);\n\n\tpublic int updateHandleInfo(XxlJobLog xxlJobLog);\n\t\n\tpublic int delete(@Param(\"jobId\") int jobId);\n\n\tpublic Map<String, Object> findLogReport(@Param(\"from\") Date from,\n\t\t\t\t\t\t\t\t\t\t\t @Param(\"to\") Date to);\n\n\tpublic List<Long> findClearLogIds(@Param(\"jobGroup\") int jobGroup,\n\t\t\t\t\t\t\t\t\t  @Param(\"jobId\") int jobId,\n\t\t\t\t\t\t\t\t\t  @Param(\"clearBeforeTime\") Date clearBeforeTime,\n\t\t\t\t\t\t\t\t\t  @Param(\"clearBeforeNum\") int clearBeforeNum,\n\t\t\t\t\t\t\t\t\t  @Param(\"pagesize\") int pagesize);\n\tpublic int clearLog(@Param(\"logIds\") List<Long> logIds);\n\n\tpublic List<Long> findFailJobLogIds(@Param(\"pagesize\") int pagesize);\n\n\tpublic int updateAlarmStatus(@Param(\"logId\") long logId,\n\t\t\t\t\t\t\t\t @Param(\"oldAlarmStatus\") int oldAlarmStatus,\n\t\t\t\t\t\t\t\t @Param(\"newAlarmStatus\") int newAlarmStatus);\n\n\tpublic List<Long> findLostJobIds(@Param(\"losedTime\") Date losedTime);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java",
    "content": "package com.xxl.job.admin.dao;\n\nimport com.xxl.job.admin.core.model.XxlJobLogGlue;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\n\nimport java.util.List;\n\n/**\n * job log for glue\n * @author xuxueli 2016-5-19 18:04:56\n */\n@Mapper\npublic interface XxlJobLogGlueDao {\n\t\n\tpublic int save(XxlJobLogGlue xxlJobLogGlue);\n\t\n\tpublic List<XxlJobLogGlue> findByJobId(@Param(\"jobId\") int jobId);\n\n\tpublic int removeOld(@Param(\"jobId\") int jobId, @Param(\"limit\") int limit);\n\n\tpublic int deleteByJobId(@Param(\"jobId\") int jobId);\n\t\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java",
    "content": "package com.xxl.job.admin.dao;\n\nimport com.xxl.job.admin.core.model.XxlJobLogReport;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\n\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * job log\n * @author xuxueli 2019-11-22\n */\n@Mapper\npublic interface XxlJobLogReportDao {\n\n\tpublic int save(XxlJobLogReport xxlJobLogReport);\n\n\tpublic int update(XxlJobLogReport xxlJobLogReport);\n\n\tpublic List<XxlJobLogReport> queryLogReport(@Param(\"triggerDayFrom\") Date triggerDayFrom,\n\t\t\t\t\t\t\t\t\t\t\t\t@Param(\"triggerDayTo\") Date triggerDayTo);\n\n\tpublic XxlJobLogReport queryLogReportTotal();\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java",
    "content": "package com.xxl.job.admin.dao;\n\nimport com.xxl.job.admin.core.model.XxlJobRegistry;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\n\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * Created by xuxueli on 16/9/30.\n */\n@Mapper\npublic interface XxlJobRegistryDao {\n\n    public List<Integer> findDead(@Param(\"timeout\") int timeout,\n                                  @Param(\"nowTime\") Date nowTime);\n\n    public int removeDead(@Param(\"ids\") List<Integer> ids);\n\n    public List<XxlJobRegistry> findAll(@Param(\"timeout\") int timeout,\n                                        @Param(\"nowTime\") Date nowTime);\n\n    public int registryUpdate(@Param(\"registryGroup\") String registryGroup,\n                              @Param(\"registryKey\") String registryKey,\n                              @Param(\"registryValue\") String registryValue,\n                              @Param(\"updateTime\") Date updateTime);\n\n    public int registrySave(@Param(\"registryGroup\") String registryGroup,\n                            @Param(\"registryKey\") String registryKey,\n                            @Param(\"registryValue\") String registryValue,\n                            @Param(\"updateTime\") Date updateTime);\n\n    public int registryDelete(@Param(\"registryGroup\") String registryGroup,\n                          @Param(\"registryKey\") String registryKey,\n                          @Param(\"registryValue\") String registryValue);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java",
    "content": "package com.xxl.job.admin.dao;\n\nimport com.xxl.job.admin.core.model.XxlJobUser;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport java.util.List;\n\n/**\n * @author xuxueli 2019-05-04 16:44:59\n */\n@Mapper\npublic interface XxlJobUserDao {\n\n\tpublic List<XxlJobUser> pageList(@Param(\"offset\") int offset,\n                                     @Param(\"pagesize\") int pagesize,\n                                     @Param(\"username\") String username,\n\t\t\t\t\t\t\t\t\t @Param(\"role\") int role);\n\tpublic int pageListCount(@Param(\"offset\") int offset,\n\t\t\t\t\t\t\t @Param(\"pagesize\") int pagesize,\n\t\t\t\t\t\t\t @Param(\"username\") String username,\n\t\t\t\t\t\t\t @Param(\"role\") int role);\n\n\tpublic XxlJobUser loadByUserName(@Param(\"username\") String username);\n\n\tpublic int save(XxlJobUser xxlJobUser);\n\n\tpublic int update(XxlJobUser xxlJobUser);\n\t\n\tpublic int delete(@Param(\"id\") int id);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/service/LoginService.java",
    "content": "package com.xxl.job.admin.service;\n\nimport com.xxl.job.admin.core.model.XxlJobUser;\nimport com.xxl.job.admin.core.util.CookieUtil;\nimport com.xxl.job.admin.core.util.I18nUtil;\nimport com.xxl.job.admin.core.util.JacksonUtil;\nimport com.xxl.job.admin.dao.XxlJobUserDao;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.util.DigestUtils;\n\nimport jakarta.annotation.Resource;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.math.BigInteger;\n\n/**\n * @author xuxueli 2019-05-04 22:13:264\n */\n@Configuration\npublic class LoginService {\n\n    public static final String LOGIN_IDENTITY_KEY = \"XXL_JOB_LOGIN_IDENTITY\";\n\n    @Resource\n    private XxlJobUserDao xxlJobUserDao;\n\n\n    private String makeToken(XxlJobUser xxlJobUser){\n        String tokenJson = JacksonUtil.writeValueAsString(xxlJobUser);\n        String tokenHex = new BigInteger(tokenJson.getBytes()).toString(16);\n        return tokenHex;\n    }\n    private XxlJobUser parseToken(String tokenHex){\n        XxlJobUser xxlJobUser = null;\n        if (tokenHex != null) {\n            String tokenJson = new String(new BigInteger(tokenHex, 16).toByteArray());      // username_password(md5)\n            xxlJobUser = JacksonUtil.readValue(tokenJson, XxlJobUser.class);\n        }\n        return xxlJobUser;\n    }\n\n\n    public ReturnT<String> login(HttpServletRequest request, HttpServletResponse response, String username, String password, boolean ifRemember){\n\n        // param\n        if (username==null || username.trim().length()==0 || password==null || password.trim().length()==0){\n            return new ReturnT<String>(500, I18nUtil.getString(\"login_param_empty\"));\n        }\n\n        // valid passowrd\n        XxlJobUser xxlJobUser = xxlJobUserDao.loadByUserName(username);\n        if (xxlJobUser == null) {\n            return new ReturnT<String>(500, I18nUtil.getString(\"login_param_unvalid\"));\n        }\n        String passwordMd5 = DigestUtils.md5DigestAsHex(password.getBytes());\n        if (!passwordMd5.equals(xxlJobUser.getPassword())) {\n            return new ReturnT<String>(500, I18nUtil.getString(\"login_param_unvalid\"));\n        }\n\n        String loginToken = makeToken(xxlJobUser);\n\n        // do login\n        CookieUtil.set(response, LOGIN_IDENTITY_KEY, loginToken, ifRemember);\n        return ReturnT.SUCCESS;\n    }\n\n    /**\n     * logout\n     *\n     * @param request\n     * @param response\n     */\n    public ReturnT<String> logout(HttpServletRequest request, HttpServletResponse response){\n        CookieUtil.remove(request, response, LOGIN_IDENTITY_KEY);\n        return ReturnT.SUCCESS;\n    }\n\n    /**\n     * logout\n     *\n     * @param request\n     * @return\n     */\n    public XxlJobUser ifLogin(HttpServletRequest request, HttpServletResponse response){\n        String cookieToken = CookieUtil.getValue(request, LOGIN_IDENTITY_KEY);\n        if (cookieToken != null) {\n            XxlJobUser cookieUser = null;\n            try {\n                cookieUser = parseToken(cookieToken);\n            } catch (Exception e) {\n                logout(request, response);\n            }\n            if (cookieUser != null) {\n                XxlJobUser dbUser = xxlJobUserDao.loadByUserName(cookieUser.getUsername());\n                if (dbUser != null) {\n                    if (cookieUser.getPassword().equals(dbUser.getPassword())) {\n                        return dbUser;\n                    }\n                }\n            }\n        }\n        return null;\n    }\n\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/service/XxlJobService.java",
    "content": "package com.xxl.job.admin.service;\n\n\nimport com.xxl.job.admin.core.model.XxlJobInfo;\nimport com.xxl.job.admin.core.model.XxlJobUser;\nimport com.xxl.job.core.biz.model.ReturnT;\n\nimport java.util.Date;\nimport java.util.Map;\n\n/**\n * core job action for xxl-job\n * \n * @author xuxueli 2016-5-28 15:30:33\n */\npublic interface XxlJobService {\n\n\t/**\n\t * page list\n\t *\n\t * @param start\n\t * @param length\n\t * @param jobGroup\n\t * @param jobDesc\n\t * @param executorHandler\n\t * @param author\n\t * @return\n\t */\n\tpublic Map<String, Object> pageList(int start, int length, int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author);\n\n\t/**\n\t * add job\n\t *\n\t * @param jobInfo\n\t * @return\n\t */\n\tpublic ReturnT<String> add(XxlJobInfo jobInfo);\n\n\t/**\n\t * update job\n\t *\n\t * @param jobInfo\n\t * @return\n\t */\n\tpublic ReturnT<String> update(XxlJobInfo jobInfo);\n\n\t/**\n\t * remove job\n\t * \t *\n\t * @param id\n\t * @return\n\t */\n\tpublic ReturnT<String> remove(int id);\n\n\t/**\n\t * start job\n\t *\n\t * @param id\n\t * @return\n\t */\n\tpublic ReturnT<String> start(int id);\n\n\t/**\n\t * stop job\n\t *\n\t * @param id\n\t * @return\n\t */\n\tpublic ReturnT<String> stop(int id);\n\n\t/**\n\t * trigger\n\t *\n\t * @param loginUser\n\t * @param jobId\n\t * @param executorParam\n\t * @param addressList\n\t * @return\n\t */\n\tpublic ReturnT<String> trigger(XxlJobUser loginUser, int jobId, String executorParam, String addressList);\n\n\t/**\n\t * dashboard info\n\t *\n\t * @return\n\t */\n\tpublic Map<String,Object> dashboardInfo();\n\n\t/**\n\t * chart info\n\t *\n\t * @param startDate\n\t * @param endDate\n\t * @return\n\t */\n\tpublic ReturnT<Map<String,Object>> chartInfo(Date startDate, Date endDate);\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java",
    "content": "package com.xxl.job.admin.service.impl;\n\nimport com.xxl.job.admin.core.thread.JobCompleteHelper;\nimport com.xxl.job.admin.core.thread.JobRegistryHelper;\nimport com.xxl.job.core.biz.AdminBiz;\nimport com.xxl.job.core.biz.model.HandleCallbackParam;\nimport com.xxl.job.core.biz.model.RegistryParam;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport org.springframework.stereotype.Service;\n\nimport jakarta.annotation.Resource;\nimport java.text.MessageFormat;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * @author xuxueli 2017-07-27 21:54:20\n */\n@Service\npublic class AdminBizImpl implements AdminBiz {\n\n\n    @Override\n    public ReturnT<String> callback(List<HandleCallbackParam> callbackParamList) {\n        return JobCompleteHelper.getInstance().callback(callbackParamList);\n    }\n\n    @Override\n    public ReturnT<String> registry(RegistryParam registryParam) {\n        return JobRegistryHelper.getInstance().registry(registryParam);\n    }\n\n    @Override\n    public ReturnT<String> registryRemove(RegistryParam registryParam) {\n        return JobRegistryHelper.getInstance().registryRemove(registryParam);\n    }\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java",
    "content": "package com.xxl.job.admin.service.impl;\n\nimport com.xxl.job.admin.core.cron.CronExpression;\nimport com.xxl.job.admin.core.model.XxlJobGroup;\nimport com.xxl.job.admin.core.model.XxlJobInfo;\nimport com.xxl.job.admin.core.model.XxlJobLogReport;\nimport com.xxl.job.admin.core.model.XxlJobUser;\nimport com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;\nimport com.xxl.job.admin.core.scheduler.MisfireStrategyEnum;\nimport com.xxl.job.admin.core.scheduler.ScheduleTypeEnum;\nimport com.xxl.job.admin.core.thread.JobScheduleHelper;\nimport com.xxl.job.admin.core.thread.JobTriggerPoolHelper;\nimport com.xxl.job.admin.core.trigger.TriggerTypeEnum;\nimport com.xxl.job.admin.core.util.I18nUtil;\nimport com.xxl.job.admin.dao.*;\nimport com.xxl.job.admin.service.XxlJobService;\nimport com.xxl.job.core.biz.model.ReturnT;\nimport com.xxl.job.core.enums.ExecutorBlockStrategyEnum;\nimport com.xxl.job.core.glue.GlueTypeEnum;\nimport com.xxl.job.core.util.DateUtil;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.stereotype.Service;\n\nimport jakarta.annotation.Resource;\nimport java.text.MessageFormat;\nimport java.util.*;\n\n/**\n * core job action for xxl-job\n * @author xuxueli 2016-5-28 15:30:33\n */\n@Service\npublic class XxlJobServiceImpl implements XxlJobService {\n\tprivate static Logger logger = LoggerFactory.getLogger(XxlJobServiceImpl.class);\n\n\t@Resource\n\tprivate XxlJobGroupDao xxlJobGroupDao;\n\t@Resource\n\tprivate XxlJobInfoDao xxlJobInfoDao;\n\t@Resource\n\tpublic XxlJobLogDao xxlJobLogDao;\n\t@Resource\n\tprivate XxlJobLogGlueDao xxlJobLogGlueDao;\n\t@Resource\n\tprivate XxlJobLogReportDao xxlJobLogReportDao;\n\t\n\t@Override\n\tpublic Map<String, Object> pageList(int start, int length, int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) {\n\n\t\t// page list\n\t\tList<XxlJobInfo> list = xxlJobInfoDao.pageList(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author);\n\t\tint list_count = xxlJobInfoDao.pageListCount(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author);\n\t\t\n\t\t// package result\n\t\tMap<String, Object> maps = new HashMap<String, Object>();\n\t    maps.put(\"recordsTotal\", list_count);\t\t// 总记录数\n\t    maps.put(\"recordsFiltered\", list_count);\t// 过滤后的总记录数\n\t    maps.put(\"data\", list);  \t\t\t\t\t// 分页列表\n\t\treturn maps;\n\t}\n\n\t@Override\n\tpublic ReturnT<String> add(XxlJobInfo jobInfo) {\n\n\t\t// valid base\n\t\tXxlJobGroup group = xxlJobGroupDao.load(jobInfo.getJobGroup());\n\t\tif (group == null) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"system_please_choose\")+I18nUtil.getString(\"jobinfo_field_jobgroup\")) );\n\t\t}\n\t\tif (jobInfo.getJobDesc()==null || jobInfo.getJobDesc().trim().length()==0) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"system_please_input\")+I18nUtil.getString(\"jobinfo_field_jobdesc\")) );\n\t\t}\n\t\tif (jobInfo.getAuthor()==null || jobInfo.getAuthor().trim().length()==0) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"system_please_input\")+I18nUtil.getString(\"jobinfo_field_author\")) );\n\t\t}\n\n\t\t// valid trigger\n\t\tScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), null);\n\t\tif (scheduleTypeEnum == null) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"schedule_type\")+I18nUtil.getString(\"system_unvalid\")) );\n\t\t}\n\t\tif (scheduleTypeEnum == ScheduleTypeEnum.CRON) {\n\t\t\tif (jobInfo.getScheduleConf()==null || !CronExpression.isValidExpression(jobInfo.getScheduleConf())) {\n\t\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, \"Cron\"+I18nUtil.getString(\"system_unvalid\"));\n\t\t\t}\n\t\t} else if (scheduleTypeEnum == ScheduleTypeEnum.FIX_RATE/* || scheduleTypeEnum == ScheduleTypeEnum.FIX_DELAY*/) {\n\t\t\tif (jobInfo.getScheduleConf() == null) {\n\t\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"schedule_type\")) );\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tint fixSecond = Integer.valueOf(jobInfo.getScheduleConf());\n\t\t\t\tif (fixSecond < 1) {\n\t\t\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"schedule_type\")+I18nUtil.getString(\"system_unvalid\")) );\n\t\t\t\t}\n\t\t\t} catch (Exception e) {\n\t\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"schedule_type\")+I18nUtil.getString(\"system_unvalid\")) );\n\t\t\t}\n\t\t}\n\n\t\t// valid job\n\t\tif (GlueTypeEnum.match(jobInfo.getGlueType()) == null) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"jobinfo_field_gluetype\")+I18nUtil.getString(\"system_unvalid\")) );\n\t\t}\n\t\tif (GlueTypeEnum.BEAN==GlueTypeEnum.match(jobInfo.getGlueType()) && (jobInfo.getExecutorHandler()==null || jobInfo.getExecutorHandler().trim().length()==0) ) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"system_please_input\")+\"JobHandler\") );\n\t\t}\n\t\t// 》fix \"\\r\" in shell\n\t\tif (GlueTypeEnum.GLUE_SHELL==GlueTypeEnum.match(jobInfo.getGlueType()) && jobInfo.getGlueSource()!=null) {\n\t\t\tjobInfo.setGlueSource(jobInfo.getGlueSource().replaceAll(\"\\r\", \"\"));\n\t\t}\n\n\t\t// valid advanced\n\t\tif (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"jobinfo_field_executorRouteStrategy\")+I18nUtil.getString(\"system_unvalid\")) );\n\t\t}\n\t\tif (MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), null) == null) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"misfire_strategy\")+I18nUtil.getString(\"system_unvalid\")) );\n\t\t}\n\t\tif (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"jobinfo_field_executorBlockStrategy\")+I18nUtil.getString(\"system_unvalid\")) );\n\t\t}\n\n\t\t// 》ChildJobId valid\n\t\tif (jobInfo.getChildJobId()!=null && jobInfo.getChildJobId().trim().length()>0) {\n\t\t\tString[] childJobIds = jobInfo.getChildJobId().split(\",\");\n\t\t\tfor (String childJobIdItem: childJobIds) {\n\t\t\t\tif (childJobIdItem!=null && childJobIdItem.trim().length()>0 && isNumeric(childJobIdItem)) {\n\t\t\t\t\tXxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.parseInt(childJobIdItem));\n\t\t\t\t\tif (childJobInfo==null) {\n\t\t\t\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE,\n\t\t\t\t\t\t\t\tMessageFormat.format((I18nUtil.getString(\"jobinfo_field_childJobId\")+\"({0})\"+I18nUtil.getString(\"system_not_found\")), childJobIdItem));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE,\n\t\t\t\t\t\t\tMessageFormat.format((I18nUtil.getString(\"jobinfo_field_childJobId\")+\"({0})\"+I18nUtil.getString(\"system_unvalid\")), childJobIdItem));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// join , avoid \"xxx,,\"\n\t\t\tString temp = \"\";\n\t\t\tfor (String item:childJobIds) {\n\t\t\t\ttemp += item + \",\";\n\t\t\t}\n\t\t\ttemp = temp.substring(0, temp.length()-1);\n\n\t\t\tjobInfo.setChildJobId(temp);\n\t\t}\n\n\t\t// add in db\n\t\tjobInfo.setAddTime(new Date());\n\t\tjobInfo.setUpdateTime(new Date());\n\t\tjobInfo.setGlueUpdatetime(new Date());\n\t\txxlJobInfoDao.save(jobInfo);\n\t\tif (jobInfo.getId() < 1) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"jobinfo_field_add\")+I18nUtil.getString(\"system_fail\")) );\n\t\t}\n\n\t\treturn new ReturnT<String>(String.valueOf(jobInfo.getId()));\n\t}\n\n\tprivate boolean isNumeric(String str){\n\t\ttry {\n\t\t\tint result = Integer.valueOf(str);\n\t\t\treturn true;\n\t\t} catch (NumberFormatException e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t@Override\n\tpublic ReturnT<String> update(XxlJobInfo jobInfo) {\n\n\t\t// valid base\n\t\tif (jobInfo.getJobDesc()==null || jobInfo.getJobDesc().trim().length()==0) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"system_please_input\")+I18nUtil.getString(\"jobinfo_field_jobdesc\")) );\n\t\t}\n\t\tif (jobInfo.getAuthor()==null || jobInfo.getAuthor().trim().length()==0) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"system_please_input\")+I18nUtil.getString(\"jobinfo_field_author\")) );\n\t\t}\n\n\t\t// valid trigger\n\t\tScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(jobInfo.getScheduleType(), null);\n\t\tif (scheduleTypeEnum == null) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"schedule_type\")+I18nUtil.getString(\"system_unvalid\")) );\n\t\t}\n\t\tif (scheduleTypeEnum == ScheduleTypeEnum.CRON) {\n\t\t\tif (jobInfo.getScheduleConf()==null || !CronExpression.isValidExpression(jobInfo.getScheduleConf())) {\n\t\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, \"Cron\"+I18nUtil.getString(\"system_unvalid\") );\n\t\t\t}\n\t\t} else if (scheduleTypeEnum == ScheduleTypeEnum.FIX_RATE /*|| scheduleTypeEnum == ScheduleTypeEnum.FIX_DELAY*/) {\n\t\t\tif (jobInfo.getScheduleConf() == null) {\n\t\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"schedule_type\")+I18nUtil.getString(\"system_unvalid\")) );\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tint fixSecond = Integer.valueOf(jobInfo.getScheduleConf());\n\t\t\t\tif (fixSecond < 1) {\n\t\t\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"schedule_type\")+I18nUtil.getString(\"system_unvalid\")) );\n\t\t\t\t}\n\t\t\t} catch (Exception e) {\n\t\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"schedule_type\")+I18nUtil.getString(\"system_unvalid\")) );\n\t\t\t}\n\t\t}\n\n\t\t// valid advanced\n\t\tif (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"jobinfo_field_executorRouteStrategy\")+I18nUtil.getString(\"system_unvalid\")) );\n\t\t}\n\t\tif (MisfireStrategyEnum.match(jobInfo.getMisfireStrategy(), null) == null) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"misfire_strategy\")+I18nUtil.getString(\"system_unvalid\")) );\n\t\t}\n\t\tif (ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), null) == null) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"jobinfo_field_executorBlockStrategy\")+I18nUtil.getString(\"system_unvalid\")) );\n\t\t}\n\n\t\t// 》ChildJobId valid\n\t\tif (jobInfo.getChildJobId()!=null && jobInfo.getChildJobId().trim().length()>0) {\n\t\t\tString[] childJobIds = jobInfo.getChildJobId().split(\",\");\n\t\t\tfor (String childJobIdItem: childJobIds) {\n\t\t\t\tif (childJobIdItem!=null && childJobIdItem.trim().length()>0 && isNumeric(childJobIdItem)) {\n\t\t\t\t\tXxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.parseInt(childJobIdItem));\n\t\t\t\t\tif (childJobInfo==null) {\n\t\t\t\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE,\n\t\t\t\t\t\t\t\tMessageFormat.format((I18nUtil.getString(\"jobinfo_field_childJobId\")+\"({0})\"+I18nUtil.getString(\"system_not_found\")), childJobIdItem));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE,\n\t\t\t\t\t\t\tMessageFormat.format((I18nUtil.getString(\"jobinfo_field_childJobId\")+\"({0})\"+I18nUtil.getString(\"system_unvalid\")), childJobIdItem));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// join , avoid \"xxx,,\"\n\t\t\tString temp = \"\";\n\t\t\tfor (String item:childJobIds) {\n\t\t\t\ttemp += item + \",\";\n\t\t\t}\n\t\t\ttemp = temp.substring(0, temp.length()-1);\n\n\t\t\tjobInfo.setChildJobId(temp);\n\t\t}\n\n\t\t// group valid\n\t\tXxlJobGroup jobGroup = xxlJobGroupDao.load(jobInfo.getJobGroup());\n\t\tif (jobGroup == null) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"jobinfo_field_jobgroup\")+I18nUtil.getString(\"system_unvalid\")) );\n\t\t}\n\n\t\t// stage job info\n\t\tXxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(jobInfo.getId());\n\t\tif (exists_jobInfo == null) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"jobinfo_field_id\")+I18nUtil.getString(\"system_not_found\")) );\n\t\t}\n\n\t\t// next trigger time (5s后生效，避开预读周期)\n\t\tlong nextTriggerTime = exists_jobInfo.getTriggerNextTime();\n\t\tboolean scheduleDataNotChanged = jobInfo.getScheduleType().equals(exists_jobInfo.getScheduleType()) && jobInfo.getScheduleConf().equals(exists_jobInfo.getScheduleConf());\n\t\tif (exists_jobInfo.getTriggerStatus() == 1 && !scheduleDataNotChanged) {\n\t\t\ttry {\n\t\t\t\tDate nextValidTime = JobScheduleHelper.generateNextValidTime(jobInfo, new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS));\n\t\t\t\tif (nextValidTime == null) {\n\t\t\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"schedule_type\")+I18nUtil.getString(\"system_unvalid\")) );\n\t\t\t\t}\n\t\t\t\tnextTriggerTime = nextValidTime.getTime();\n\t\t\t} catch (Exception e) {\n\t\t\t\tlogger.error(e.getMessage(), e);\n\t\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"schedule_type\")+I18nUtil.getString(\"system_unvalid\")) );\n\t\t\t}\n\t\t}\n\n\t\texists_jobInfo.setJobGroup(jobInfo.getJobGroup());\n\t\texists_jobInfo.setJobDesc(jobInfo.getJobDesc());\n\t\texists_jobInfo.setAuthor(jobInfo.getAuthor());\n\t\texists_jobInfo.setAlarmEmail(jobInfo.getAlarmEmail());\n\t\texists_jobInfo.setScheduleType(jobInfo.getScheduleType());\n\t\texists_jobInfo.setScheduleConf(jobInfo.getScheduleConf());\n\t\texists_jobInfo.setMisfireStrategy(jobInfo.getMisfireStrategy());\n\t\texists_jobInfo.setExecutorRouteStrategy(jobInfo.getExecutorRouteStrategy());\n\t\texists_jobInfo.setExecutorHandler(jobInfo.getExecutorHandler());\n\t\texists_jobInfo.setExecutorParam(jobInfo.getExecutorParam());\n\t\texists_jobInfo.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy());\n\t\texists_jobInfo.setExecutorTimeout(jobInfo.getExecutorTimeout());\n\t\texists_jobInfo.setExecutorFailRetryCount(jobInfo.getExecutorFailRetryCount());\n\t\texists_jobInfo.setChildJobId(jobInfo.getChildJobId());\n\t\texists_jobInfo.setTriggerNextTime(nextTriggerTime);\n\n\t\texists_jobInfo.setUpdateTime(new Date());\n        xxlJobInfoDao.update(exists_jobInfo);\n\n\n\t\treturn ReturnT.SUCCESS;\n\t}\n\n\t@Override\n\tpublic ReturnT<String> remove(int id) {\n\t\tXxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);\n\t\tif (xxlJobInfo == null) {\n\t\t\treturn ReturnT.SUCCESS;\n\t\t}\n\n\t\txxlJobInfoDao.delete(id);\n\t\txxlJobLogDao.delete(id);\n\t\txxlJobLogGlueDao.deleteByJobId(id);\n\t\treturn ReturnT.SUCCESS;\n\t}\n\n\t@Override\n\tpublic ReturnT<String> start(int id) {\n\t\tXxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);\n\n\t\t// valid\n\t\tScheduleTypeEnum scheduleTypeEnum = ScheduleTypeEnum.match(xxlJobInfo.getScheduleType(), ScheduleTypeEnum.NONE);\n\t\tif (ScheduleTypeEnum.NONE == scheduleTypeEnum) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"schedule_type_none_limit_start\")) );\n\t\t}\n\n\t\t// next trigger time (5s后生效，避开预读周期)\n\t\tlong nextTriggerTime = 0;\n\t\ttry {\n\t\t\tDate nextValidTime = JobScheduleHelper.generateNextValidTime(xxlJobInfo, new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS));\n\t\t\tif (nextValidTime == null) {\n\t\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"schedule_type\")+I18nUtil.getString(\"system_unvalid\")) );\n\t\t\t}\n\t\t\tnextTriggerTime = nextValidTime.getTime();\n\t\t} catch (Exception e) {\n\t\t\tlogger.error(e.getMessage(), e);\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString(\"schedule_type\")+I18nUtil.getString(\"system_unvalid\")) );\n\t\t}\n\n\t\txxlJobInfo.setTriggerStatus(1);\n\t\txxlJobInfo.setTriggerLastTime(0);\n\t\txxlJobInfo.setTriggerNextTime(nextTriggerTime);\n\n\t\txxlJobInfo.setUpdateTime(new Date());\n\t\txxlJobInfoDao.update(xxlJobInfo);\n\t\treturn ReturnT.SUCCESS;\n\t}\n\n\t@Override\n\tpublic ReturnT<String> stop(int id) {\n        XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);\n\n\t\txxlJobInfo.setTriggerStatus(0);\n\t\txxlJobInfo.setTriggerLastTime(0);\n\t\txxlJobInfo.setTriggerNextTime(0);\n\n\t\txxlJobInfo.setUpdateTime(new Date());\n\t\txxlJobInfoDao.update(xxlJobInfo);\n\t\treturn ReturnT.SUCCESS;\n\t}\n\n\n\n\t@Override\n\tpublic ReturnT<String> trigger(XxlJobUser loginUser, int jobId, String executorParam, String addressList) {\n\t\t// permission\n\t\tif (loginUser == null) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL.getCode(), I18nUtil.getString(\"system_permission_limit\"));\n\t\t}\n\t\tXxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(jobId);\n\t\tif (xxlJobInfo == null) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL.getCode(), I18nUtil.getString(\"jobinfo_glue_jobid_unvalid\"));\n\t\t}\n\t\tif (!hasPermission(loginUser, xxlJobInfo.getJobGroup())) {\n\t\t\treturn new ReturnT<String>(ReturnT.FAIL.getCode(), I18nUtil.getString(\"system_permission_limit\"));\n\t\t}\n\n\t\t// force cover job param\n\t\tif (executorParam == null) {\n\t\t\texecutorParam = \"\";\n\t\t}\n\n\t\tJobTriggerPoolHelper.trigger(jobId, TriggerTypeEnum.MANUAL, -1, null, executorParam, addressList);\n\t\treturn ReturnT.SUCCESS;\n\t}\n\n\tprivate boolean hasPermission(XxlJobUser loginUser, int jobGroup){\n\t\tif (loginUser.getRole() == 1) {\n\t\t\treturn true;\n\t\t}\n\t\tList<String> groupIdStrs = new ArrayList<>();\n\t\tif (loginUser.getPermission()!=null && loginUser.getPermission().trim().length()>0) {\n\t\t\tgroupIdStrs = Arrays.asList(loginUser.getPermission().trim().split(\",\"));\n\t\t}\n\t\treturn groupIdStrs.contains(String.valueOf(jobGroup));\n\t}\n\n\t@Override\n\tpublic Map<String, Object> dashboardInfo() {\n\n\t\tint jobInfoCount = xxlJobInfoDao.findAllCount();\n\t\tint jobLogCount = 0;\n\t\tint jobLogSuccessCount = 0;\n\t\tXxlJobLogReport xxlJobLogReport = xxlJobLogReportDao.queryLogReportTotal();\n\t\tif (xxlJobLogReport != null) {\n\t\t\tjobLogCount = xxlJobLogReport.getRunningCount() + xxlJobLogReport.getSucCount() + xxlJobLogReport.getFailCount();\n\t\t\tjobLogSuccessCount = xxlJobLogReport.getSucCount();\n\t\t}\n\n\t\t// executor count\n\t\tSet<String> executorAddressSet = new HashSet<String>();\n\t\tList<XxlJobGroup> groupList = xxlJobGroupDao.findAll();\n\n\t\tif (groupList!=null && !groupList.isEmpty()) {\n\t\t\tfor (XxlJobGroup group: groupList) {\n\t\t\t\tif (group.getRegistryList()!=null && !group.getRegistryList().isEmpty()) {\n\t\t\t\t\texecutorAddressSet.addAll(group.getRegistryList());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tint executorCount = executorAddressSet.size();\n\n\t\tMap<String, Object> dashboardMap = new HashMap<String, Object>();\n\t\tdashboardMap.put(\"jobInfoCount\", jobInfoCount);\n\t\tdashboardMap.put(\"jobLogCount\", jobLogCount);\n\t\tdashboardMap.put(\"jobLogSuccessCount\", jobLogSuccessCount);\n\t\tdashboardMap.put(\"executorCount\", executorCount);\n\t\treturn dashboardMap;\n\t}\n\n\t@Override\n\tpublic ReturnT<Map<String, Object>> chartInfo(Date startDate, Date endDate) {\n\n\t\t// process\n\t\tList<String> triggerDayList = new ArrayList<String>();\n\t\tList<Integer> triggerDayCountRunningList = new ArrayList<Integer>();\n\t\tList<Integer> triggerDayCountSucList = new ArrayList<Integer>();\n\t\tList<Integer> triggerDayCountFailList = new ArrayList<Integer>();\n\t\tint triggerCountRunningTotal = 0;\n\t\tint triggerCountSucTotal = 0;\n\t\tint triggerCountFailTotal = 0;\n\n\t\tList<XxlJobLogReport> logReportList = xxlJobLogReportDao.queryLogReport(startDate, endDate);\n\n\t\tif (logReportList!=null && logReportList.size()>0) {\n\t\t\tfor (XxlJobLogReport item: logReportList) {\n\t\t\t\tString day = DateUtil.formatDate(item.getTriggerDay());\n\t\t\t\tint triggerDayCountRunning = item.getRunningCount();\n\t\t\t\tint triggerDayCountSuc = item.getSucCount();\n\t\t\t\tint triggerDayCountFail = item.getFailCount();\n\n\t\t\t\ttriggerDayList.add(day);\n\t\t\t\ttriggerDayCountRunningList.add(triggerDayCountRunning);\n\t\t\t\ttriggerDayCountSucList.add(triggerDayCountSuc);\n\t\t\t\ttriggerDayCountFailList.add(triggerDayCountFail);\n\n\t\t\t\ttriggerCountRunningTotal += triggerDayCountRunning;\n\t\t\t\ttriggerCountSucTotal += triggerDayCountSuc;\n\t\t\t\ttriggerCountFailTotal += triggerDayCountFail;\n\t\t\t}\n\t\t} else {\n\t\t\tfor (int i = -6; i <= 0; i++) {\n\t\t\t\ttriggerDayList.add(DateUtil.formatDate(DateUtil.addDays(new Date(), i)));\n\t\t\t\ttriggerDayCountRunningList.add(0);\n\t\t\t\ttriggerDayCountSucList.add(0);\n\t\t\t\ttriggerDayCountFailList.add(0);\n\t\t\t}\n\t\t}\n\n\t\tMap<String, Object> result = new HashMap<String, Object>();\n\t\tresult.put(\"triggerDayList\", triggerDayList);\n\t\tresult.put(\"triggerDayCountRunningList\", triggerDayCountRunningList);\n\t\tresult.put(\"triggerDayCountSucList\", triggerDayCountSucList);\n\t\tresult.put(\"triggerDayCountFailList\", triggerDayCountFailList);\n\n\t\tresult.put(\"triggerCountRunningTotal\", triggerCountRunningTotal);\n\t\tresult.put(\"triggerCountSucTotal\", triggerCountSucTotal);\n\t\tresult.put(\"triggerCountFailTotal\", triggerCountFailTotal);\n\n\t\treturn new ReturnT<Map<String, Object>>(result);\n\t}\n\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/application.yml",
    "content": "server:\n  port: 9080\n  servlet:\n    context-path: /xxl-job-admin\n  #数据源配置\nspring:\n  datasource:\n    url: jdbc:mysql://jeecg-boot-mysql:3306/xxl_job?Unicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai\n    username: ${MYSQL-USER:root}\n    password: ${MYSQL-PWD:root}\n    driver-class-name: com.mysql.jdbc.Driver\n    type: com.zaxxer.hikari.HikariDataSource\n    hikari:\n      minimum-idle: 10\n      maximum-pool-size: 30\n      auto-commit: true\n      idle-timeout: 30000\n      pool-name: HikariCP\n      max-lifetime: 900000\n      connection-timeout: 10000\n      connection-test-query: SELECT 1\n  #邮箱配置\n  mail:\n    host: smtphz.qiye.163.com\n    port: 994\n    username: zhuwei@aboatedu.com\n    from: zhuwei@aboatedu.com\n    password: zwass1314\n    properties:\n      mail:\n        smtp:\n          auth: true\n          starttls:\n            enable: true\n            required: true\n          socketFactory:\n            class: javax.net.ssl.SSLSocketFactory\n  #MVC配置\n  mvc:\n    servlet:\n      load-on-startup: 0\n    static-path-pattern: /static/**\n  resources:\n    static-locations: classpath:/static/\n  #freemarker配置\n  freemarker:\n    templateLoaderPath=classpath: /templates/\n    suffix: .ftl\n    charset: UTF-8\n    request-context-attribute: request\n    settings:\n      number_format: 0.##########\n#通用配置，开放端点\nmanagement:\n  server:\n    servlet:\n      context-path: /actuator\n  health:\n    mail:\n      enabled: false\n#mybatis配置\nmybatis:\n  mapper-locations: classpath:/mybatis-mapper/*Mapper.xml\n#XXL-job配置\nxxl:\n  job:\n    login:\n      username: admin\n      password: 123456\n    accessToken:\n    i18n: zh_CN\n    #触发池\n    triggerpool:\n      fast:\n        max: 200\n      slow:\n        max: 100\n    logretentiondays: 30"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/i18n/message_en.properties",
    "content": "admin_name=Scheduling Center\nadmin_name_full=Distributed Task Scheduling Platform XXL-JOB\nadmin_version=2.4.2-SNAPSHOT\nadmin_i18n=en\n\n## system\nsystem_tips=System message\nsystem_ok=Confirm \nsystem_close=Close\nsystem_save=Save \nsystem_cancel=Cancel\nsystem_search=Search\nsystem_status=Status\nsystem_opt=Operate\nsystem_please_input=please input \nsystem_please_choose=please choose \nsystem_success=success\nsystem_fail=fail\nsystem_add_suc=add success\nsystem_add_fail=add fail\nsystem_update_suc=update success\nsystem_update_fail=update fail\nsystem_all=All\nsystem_api_error=net error\nsystem_show=Show\nsystem_empty=Empty\nsystem_opt_suc=operate success\nsystem_opt_fail=operate fail\nsystem_opt_edit=Edit\nsystem_opt_del=Delete\nsystem_opt_copy=Copy\nsystem_unvalid=illegal\nsystem_not_found=not exist\nsystem_nav=Navigation\nsystem_digits=digits\nsystem_lengh_limit=Length limit\nsystem_permission_limit=Permission limit\nsystem_welcome=Welcome\n\n## daterangepicker\ndaterangepicker_ranges_recent_hour=recent one hour\ndaterangepicker_ranges_today=today\ndaterangepicker_ranges_yesterday=yesterday\ndaterangepicker_ranges_this_month=this month\ndaterangepicker_ranges_last_month=last month\ndaterangepicker_ranges_recent_week=recent one week\ndaterangepicker_ranges_recent_month=recent one month\ndaterangepicker_custom_name=custom\ndaterangepicker_custom_starttime=start time\ndaterangepicker_custom_endtime=end time\ndaterangepicker_custom_daysofweek=Sun,Mon,Tue,Wed,Thu,Fri,Sat\ndaterangepicker_custom_monthnames=Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec\n\n## dataTable\ndataTable_sProcessing=processing...\ndataTable_sLengthMenu= _MENU_ records per page\ndataTable_sZeroRecords=No matching results\ndataTable_sInfo=page _PAGE_  ( Total _PAGES_ pages，_TOTAL_ records )\ndataTable_sInfoEmpty=No Record\ndataTable_sInfoFiltered=(Filtered by _MAX_ results)\ndataTable_sSearch=Search\ndataTable_sEmptyTable=Table data is empty\ndataTable_sLoadingRecords=Loading...\ndataTable_sFirst=FIRST PAGE\ndataTable_sPrevious=Previous Page\ndataTable_sNext=Next Page\ndataTable_sLast=LAST PAGE\ndataTable_sSortAscending=: Rank this column in ascending order\ndataTable_sSortDescending=: Rank this column in descending order\n\n## login\nlogin_btn=Login\nlogin_remember_me=Remember Me\nlogin_username_placeholder=Please enter username\nlogin_password_placeholder=Please enter password\nlogin_username_empty=Please enter username\nlogin_username_lt_4=Username length should not be less than 4\nlogin_password_empty=Please enter password\nlogin_password_lt_4=Password length should not be less than 4\nlogin_success=Login success\nlogin_fail=Login fail\nlogin_param_empty=Username or password is empty\nlogin_param_unvalid=Username or password error\n\n## logout\nlogout_btn=Logout\nlogout_confirm=Confirm logout?\nlogout_success=Logout success\nlogout_fail=Logout fail\n\n## change pwd\nchange_pwd=Change password\nchange_pwd_suc_to_logout=Change password successful, about to log out login\nchange_pwd_field_newpwd=new password\n\n## dashboard\njob_dashboard_name=Run report\njob_dashboard_job_num=Job number\njob_dashboard_job_num_tip=The number of tasks running in the scheduling center\njob_dashboard_trigger_num=trigger number\njob_dashboard_trigger_num_tip=The number of trigger record scheduled by the scheduling center\njob_dashboard_jobgroup_num=Executor number\njob_dashboard_jobgroup_num_tip=The number of online executor machines perceived by the scheduling center\njob_dashboard_report=Scheduling report\njob_dashboard_report_loaddata_fail=Scheduling report load data error\njob_dashboard_date_report=Date distribution\njob_dashboard_rate_report=Percentage distribution\n\n## job info\njobinfo_name=Job Manage\njobinfo_job=Job\njobinfo_field_add=Add Job\njobinfo_field_update=Edit Job\njobinfo_field_id=Job ID\njobinfo_field_jobgroup=Executor\njobinfo_field_jobdesc=Job description\njobinfo_field_timeout=Job timeout period\njobinfo_field_gluetype=GLUE Type\njobinfo_field_executorparam=Param\njobinfo_field_author=Author\njobinfo_field_alarmemail=Alarm email\njobinfo_field_alarmemail_placeholder=Please enter alarm mail, if there are more than one comma separated\njobinfo_field_executorRouteStrategy=Route Strategy\njobinfo_field_childJobId=Child Job ID\njobinfo_field_childJobId_placeholder=Please enter the Child job ID, if there are more than one comma separated\njobinfo_field_executorBlockStrategy=Block Strategy\njobinfo_field_executorFailRetryCount=Fail Retry Count\njobinfo_field_executorFailRetryCount_placeholder=Fail Retry Count. effect if greater than zero\njobinfo_script_location=Script location\njobinfo_shard_index=Shard index\njobinfo_shard_total=Shard total\njobinfo_opt_stop=Stop\njobinfo_opt_start=Start\njobinfo_opt_log=Query Log\njobinfo_opt_run=Run Once\njobinfo_opt_run_tips=Please input the address for this trigger. Null will be obtained from the executor\njobinfo_opt_registryinfo=Registry Info\njobinfo_opt_next_time=Next trigger time\njobinfo_glue_remark=Resource Remark\njobinfo_glue_remark_limit=Resource Remark length is limited to 4~100\njobinfo_glue_rollback=Version Backtrack\njobinfo_glue_jobid_unvalid=Job ID is illegal\njobinfo_glue_gluetype_unvalid=The job is not GLUE Type\njobinfo_field_executorTimeout_placeholder=Job Timeout period，in seconds. effect if greater than zero\nschedule_type=Schedule Type\nschedule_type_none=None\nschedule_type_cron=Cron\nschedule_type_fix_rate=Fix rate\nschedule_type_fix_delay=Fix delay\nschedule_type_none_limit_start=The current schedule type disables startup\nmisfire_strategy=Misfire strategy\nmisfire_strategy_do_nothing=Do nothing\nmisfire_strategy_fire_once_now=Fire once now\njobinfo_conf_base=Base configuration\njobinfo_conf_schedule=Schedule configuration\njobinfo_conf_job=Job configuration\njobinfo_conf_advanced=Advanced configuration\n\n## job log\njoblog_name=Trigger Log\njoblog_status=Status\njoblog_status_all=All\njoblog_status_suc=Success\njoblog_status_fail=Fail\njoblog_status_running=Running\njoblog_field_triggerTime=Trigger Time\njoblog_field_triggerCode=Trigger Result\njoblog_field_triggerMsg=Trigger Msg\njoblog_field_handleTime=Handle Time\njoblog_field_handleCode=Handle Result\njoblog_field_handleMsg=Trigger Msg\njoblog_field_executorAddress=Executor Address\njoblog_clean=Clean\njoblog_clean_log=Clean Log\njoblog_clean_type=Clean Type\njoblog_clean_type_1=Clean up log data a month ago\njoblog_clean_type_2=Clean up log data three month ago\njoblog_clean_type_3=Clean up log data six month ago\njoblog_clean_type_4=Clean up log data a year ago\njoblog_clean_type_5=Clean up log data a thousand record ago\njoblog_clean_type_6=Clean up log data ten thousand record ago\njoblog_clean_type_7=Clean up log data thirty thousand record ago\njoblog_clean_type_8=Clean up log data hundred thousand record ago\njoblog_clean_type_9=Clean up all log data\njoblog_clean_type_unvalid=Clean type is illegal\njoblog_handleCode_200=Success\njoblog_handleCode_500=Fail\njoblog_handleCode_502=Timeout\njoblog_kill_log=Kill Job\njoblog_kill_log_limit=Trigger Fail, can not kill job\njoblog_kill_log_byman=Manual operation, kill job\njoblog_lost_fail=Job result lost, marked as failure\njoblog_rolling_log=Rolling log\njoblog_rolling_log_refresh=Refresh \njoblog_rolling_log_triggerfail=The job trigger fail, can not view the rolling log\njoblog_rolling_log_failoften=The request for the Rolling log is terminated, the number of failed requests exceeds the limit, Reload the log on the refresh page\njoblog_logid_unvalid=Log ID is illegal\n\n## job group\njobgroup_name=Executor Manage\njobgroup_list=Executor List\njobgroup_add=Add Executor\njobgroup_edit=Edit Executor\njobgroup_del=Delete Executor\njobgroup_field_title=Title\njobgroup_field_addressType=Registry Type\njobgroup_field_addressType_0=Automatic registration\njobgroup_field_addressType_1=Manual registration\njobgroup_field_addressType_limit=Manually registration type, the machine address must not be empty\njobgroup_field_registryList=machine address\njobgroup_field_registryList_unvalid=registry machine address is illegal\njobgroup_field_registryList_placeholder=Please enter the machine address, if there are more than one comma separated\njobgroup_field_appname_limit=Limit the beginning of a lowercase letter, consists of lowercase letters、number and hyphen.\njobgroup_field_appname_length=AppName length is limited to 4~64\njobgroup_field_title_length=Title length is limited to 4~12\njobgroup_field_order_digits=Please enter a positive integer\njobgroup_field_orderrange=Order is limited to 1~1000\njobgroup_del_limit_0=Refuse to delete, the executor is being used\njobgroup_del_limit_1=Refuses to delete, the system retains at least one executor\njobgroup_empty=There is no valid executor. Please contact the administrator\n\n## job conf\njobconf_block_SERIAL_EXECUTION=Serial execution\njobconf_block_DISCARD_LATER=Discard Later\njobconf_block_COVER_EARLY=Cover Early\njobconf_route_first=First\njobconf_route_last=Last\njobconf_route_round=Round\njobconf_route_random=Random\njobconf_route_consistenthash=Consistent Hash\njobconf_route_lfu=Least Frequently Used\njobconf_route_lru=Least Recently Used\njobconf_route_failover=Failover\njobconf_route_busyover=Busyover\njobconf_route_shard=Sharding Broadcast\njobconf_idleBeat=Idle check\njobconf_beat=Heartbeats\njobconf_monitor=Task Scheduling Center monitor alarm\njobconf_monitor_detail=monitor alarm details\njobconf_monitor_alarm_title=Alarm Type\njobconf_monitor_alarm_type=Trigger Fail\njobconf_monitor_alarm_content=Alarm Content\njobconf_trigger_admin_adress=Trigger machine address\njobconf_trigger_exe_regtype=Execotor-Registry Type\njobconf_trigger_exe_regaddress=Execotor-Registry Address\njobconf_trigger_address_empty=Trigger Fail：registry address is empty\njobconf_trigger_run=Trigger Job\njobconf_trigger_child_run=Trigger child job\njobconf_callback_child_msg1={0}/{1} [Job ID={2}], Trigger {3}, Trigger msg: {4} <br>\njobconf_callback_child_msg2={0}/{1} [Job ID={2}], Trigger Fail, Trigger msg: Job ID is illegal <br>\njobconf_trigger_type=Job trigger type\njobconf_trigger_type_cron=Cron trigger\njobconf_trigger_type_manual=Manual trigger\njobconf_trigger_type_parent=Parent job trigger\njobconf_trigger_type_api=Api trigger\njobconf_trigger_type_retry=Fail retry trigger\njobconf_trigger_type_misfire=Misfire compensation trigger\n\n## user\nuser_manage=User Manage\nuser_username=Username\nuser_password=Password\nuser_role=Role\nuser_role_admin=Admin User\nuser_role_normal=Normal User\nuser_permission=Permission\nuser_add=Add User\nuser_update=Edit User\nuser_username_repeat=Username Repeat\nuser_username_valid=Restrictions start with a lowercase letter and consist of lowercase letters and Numbers\nuser_password_update_placeholder=Please input password, empty means not update\nuser_update_loginuser_limit=Operation of current login account is not allowed\n\n## help\njob_help=Tutorial\njob_help_document=Official Document\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/i18n/message_zh_CN.properties",
    "content": "admin_name=任务调度中心\nadmin_name_full=分布式任务调度平台XXL-JOB\nadmin_version=2.4.2-SNAPSHOT\nadmin_i18n=\n\n## system\nsystem_tips=系统提示\nsystem_ok=确定\nsystem_close=关闭\nsystem_save=保存\nsystem_cancel=取消\nsystem_search=搜索\nsystem_status=状态\nsystem_opt=操作\nsystem_please_input=请输入\nsystem_please_choose=请选择\nsystem_success=成功\nsystem_fail=失败\nsystem_add_suc=新增成功\nsystem_add_fail=新增失败\nsystem_update_suc=更新成功\nsystem_update_fail=更新失败\nsystem_all=全部\nsystem_api_error=接口异常\nsystem_show=查看\nsystem_empty=无\nsystem_opt_suc=操作成功\nsystem_opt_fail=操作失败\nsystem_opt_edit=编辑\nsystem_opt_del=删除\nsystem_opt_copy=复制\nsystem_unvalid=非法\nsystem_not_found=不存在\nsystem_nav=导航\nsystem_digits=整数\nsystem_lengh_limit=长度限制\nsystem_permission_limit=权限拦截\nsystem_welcome=欢迎\n\n## daterangepicker\ndaterangepicker_ranges_recent_hour=最近一小时\ndaterangepicker_ranges_today=今日\ndaterangepicker_ranges_yesterday=昨日\ndaterangepicker_ranges_this_month=本月\ndaterangepicker_ranges_last_month=上个月\ndaterangepicker_ranges_recent_week=最近一周\ndaterangepicker_ranges_recent_month=最近一月\ndaterangepicker_custom_name=自定义\ndaterangepicker_custom_starttime=起始时间\ndaterangepicker_custom_endtime=结束时间\ndaterangepicker_custom_daysofweek=日,一,二,三,四,五,六\ndaterangepicker_custom_monthnames=一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月\n\n## dataTable\ndataTable_sProcessing=处理中...\ndataTable_sLengthMenu=每页 _MENU_ 条记录\ndataTable_sZeroRecords=没有匹配结果\ndataTable_sInfo=第 _PAGE_ 页 ( 总共 _PAGES_ 页，_TOTAL_ 条记录 )\ndataTable_sInfoEmpty=无记录\ndataTable_sInfoFiltered=(由 _MAX_ 项结果过滤)\ndataTable_sSearch=搜索\ndataTable_sEmptyTable=表中数据为空\ndataTable_sLoadingRecords=载入中...\ndataTable_sFirst=首页\ndataTable_sPrevious=上页\ndataTable_sNext=下页\ndataTable_sLast=末页\ndataTable_sSortAscending=: 以升序排列此列\ndataTable_sSortDescending=: 以降序排列此列\n\n## login\nlogin_btn=登录\nlogin_remember_me=记住密码\nlogin_username_placeholder=请输入登录账号\nlogin_password_placeholder=请输入登录密码\nlogin_username_empty=请输入登录账号\nlogin_username_lt_4=登录账号不应低于4位\nlogin_password_empty=请输入登录密码\nlogin_password_lt_4=登录密码不应低于4位\nlogin_success=登录成功\nlogin_fail=登录失败\nlogin_param_empty=账号或密码为空\nlogin_param_unvalid=账号或密码错误\n\n## logout\nlogout_btn=注销\nlogout_confirm=确认注销登录?\nlogout_success=注销成功\nlogout_fail=注销失败\n\n## change pwd\nchange_pwd=修改密码\nchange_pwd_suc_to_logout=修改密码成功，即将注销登陆\nchange_pwd_field_newpwd=新密码\n\n## dashboard\njob_dashboard_name=运行报表\njob_dashboard_job_num=任务数量\njob_dashboard_job_num_tip=调度中心运行的任务数量\njob_dashboard_trigger_num=调度次数\njob_dashboard_trigger_num_tip=调度中心触发的调度次数\njob_dashboard_jobgroup_num=执行器数量\njob_dashboard_jobgroup_num_tip=调度中心在线的执行器机器数量\njob_dashboard_report=调度报表\njob_dashboard_report_loaddata_fail=调度报表数据加载异常\njob_dashboard_date_report=日期分布图\njob_dashboard_rate_report=成功比例图\n\n## job info\njobinfo_name=任务管理\njobinfo_job=任务\njobinfo_field_add=新增\njobinfo_field_update=更新任务\njobinfo_field_id=任务ID\njobinfo_field_jobgroup=执行器\njobinfo_field_jobdesc=任务描述\njobinfo_field_gluetype=运行模式\njobinfo_field_executorparam=任务参数\njobinfo_field_author=负责人\njobinfo_field_timeout=任务超时时间\njobinfo_field_alarmemail=报警邮件\njobinfo_field_alarmemail_placeholder=请输入报警邮件，多个邮件地址则逗号分隔\njobinfo_field_executorRouteStrategy=路由策略\njobinfo_field_childJobId=子任务ID\njobinfo_field_childJobId_placeholder=请输入子任务的任务ID,如存在多个则逗号分隔\njobinfo_field_executorBlockStrategy=阻塞处理策略\njobinfo_field_executorFailRetryCount=失败重试次数\njobinfo_field_executorFailRetryCount_placeholder=失败重试次数，大于零时生效\njobinfo_script_location=脚本位置\njobinfo_shard_index=分片序号\njobinfo_shard_total=分片总数\njobinfo_opt_stop=停止\njobinfo_opt_start=启动\njobinfo_opt_log=查询日志\njobinfo_opt_run=执行一次\njobinfo_opt_run_tips=请输入本次执行的机器地址，为空则从执行器获取\njobinfo_opt_registryinfo=注册节点\njobinfo_opt_next_time=下次执行时间\njobinfo_glue_remark=源码备注\njobinfo_glue_remark_limit=源码备注长度限制为4~100\njobinfo_glue_rollback=版本回溯\njobinfo_glue_jobid_unvalid=任务ID非法\njobinfo_glue_gluetype_unvalid=该任务非GLUE模式\njobinfo_field_executorTimeout_placeholder=任务超时时间，单位秒，大于零时生效\nschedule_type=调度类型\nschedule_type_none=无\nschedule_type_cron=CRON\nschedule_type_fix_rate=固定速度\nschedule_type_fix_delay=固定延迟\nschedule_type_none_limit_start=当前调度类型禁止启动\nmisfire_strategy=调度过期策略\nmisfire_strategy_do_nothing=忽略\nmisfire_strategy_fire_once_now=立即执行一次\njobinfo_conf_base=基础配置\njobinfo_conf_schedule=调度配置\njobinfo_conf_job=任务配置\njobinfo_conf_advanced=高级配置\n\n## job log\njoblog_name=调度日志\njoblog_status=状态\njoblog_status_all=全部\njoblog_status_suc=成功\njoblog_status_fail=失败\njoblog_status_running=进行中\njoblog_field_triggerTime=调度时间\njoblog_field_triggerCode=调度结果\njoblog_field_triggerMsg=调度备注\njoblog_field_handleTime=执行时间\njoblog_field_handleCode=执行结果\njoblog_field_handleMsg=执行备注\njoblog_field_executorAddress=执行器地址\njoblog_clean=清理\njoblog_clean_log=日志清理\njoblog_clean_type=清理方式\njoblog_clean_type_1=清理一个月之前日志数据\njoblog_clean_type_2=清理三个月之前日志数据\njoblog_clean_type_3=清理六个月之前日志数据\njoblog_clean_type_4=清理一年之前日志数据\njoblog_clean_type_5=清理一千条以前日志数据\njoblog_clean_type_6=清理一万条以前日志数据\njoblog_clean_type_7=清理三万条以前日志数据\njoblog_clean_type_8=清理十万条以前日志数据\njoblog_clean_type_9=清理所有日志数据\njoblog_clean_type_unvalid=清理类型参数异常\njoblog_handleCode_200=成功\njoblog_handleCode_500=失败\njoblog_handleCode_502=失败(超时)\njoblog_kill_log=终止任务\njoblog_kill_log_limit=调度失败，无法终止日志\njoblog_kill_log_byman=人为操作，主动终止\njoblog_lost_fail=任务结果丢失，标记失败\njoblog_rolling_log=执行日志\njoblog_rolling_log_refresh=刷新\njoblog_rolling_log_triggerfail=任务发起调度失败，无法查看执行日志\njoblog_rolling_log_failoften=终止请求Rolling日志,请求失败次数超上限,可刷新页面重新加载日志\njoblog_logid_unvalid=日志ID非法\n\n## job group\njobgroup_name=执行器管理\njobgroup_list=执行器列表\njobgroup_add=新增执行器\njobgroup_edit=编辑执行器\njobgroup_del=删除执行器\njobgroup_field_title=名称\njobgroup_field_addressType=注册方式\njobgroup_field_addressType_0=自动注册\njobgroup_field_addressType_1=手动录入\njobgroup_field_addressType_limit=手动录入注册方式，机器地址不可为空\njobgroup_field_registryList=机器地址\njobgroup_field_registryList_unvalid=机器地址格式非法\njobgroup_field_registryList_placeholder=请输入执行器地址列表，多地址逗号分隔\njobgroup_field_appname_limit=限制以小写字母开头，由小写字母、数字和中划线组成\njobgroup_field_appname_length=AppName长度限制为4~64\njobgroup_field_title_length=名称长度限制为4~12\njobgroup_field_order_digits=请输入整数\njobgroup_field_orderrange=取值范围为1~1000\njobgroup_del_limit_0=拒绝删除，该执行器使用中\njobgroup_del_limit_1=拒绝删除, 系统至少保留一个执行器\njobgroup_empty=不存在有效执行器,请联系管理员\n\n## job conf\njobconf_block_SERIAL_EXECUTION=单机串行\njobconf_block_DISCARD_LATER=丢弃后续调度\njobconf_block_COVER_EARLY=覆盖之前调度\njobconf_route_first=第一个\njobconf_route_last=最后一个\njobconf_route_round=轮询\njobconf_route_random=随机\njobconf_route_consistenthash=一致性HASH\njobconf_route_lfu=最不经常使用\njobconf_route_lru=最近最久未使用\njobconf_route_failover=故障转移\njobconf_route_busyover=忙碌转移\njobconf_route_shard=分片广播\njobconf_idleBeat=空闲检测\njobconf_beat=心跳检测\njobconf_monitor=任务调度中心监控报警\njobconf_monitor_detail=监控告警明细\njobconf_monitor_alarm_title=告警类型\njobconf_monitor_alarm_type=调度失败\njobconf_monitor_alarm_content=告警内容\njobconf_trigger_admin_adress=调度机器\njobconf_trigger_exe_regtype=执行器-注册方式\njobconf_trigger_exe_regaddress=执行器-地址列表\njobconf_trigger_address_empty=调度失败：执行器地址为空\njobconf_trigger_run=触发调度\njobconf_trigger_child_run=触发子任务\njobconf_callback_child_msg1={0}/{1} [任务ID={2}], 触发{3}, 触发备注: {4} <br>\njobconf_callback_child_msg2={0}/{1} [任务ID={2}], 触发失败, 触发备注: 任务ID格式错误 <br>\njobconf_trigger_type=任务触发类型\njobconf_trigger_type_cron=Cron触发\njobconf_trigger_type_manual=手动触发\njobconf_trigger_type_parent=父任务触发\njobconf_trigger_type_api=API触发\njobconf_trigger_type_retry=失败重试触发\njobconf_trigger_type_misfire=调度过期补偿\n\n## user\nuser_manage=用户管理\nuser_username=账号\nuser_password=密码\nuser_role=角色\nuser_role_admin=管理员\nuser_role_normal=普通用户\nuser_permission=权限\nuser_add=新增用户\nuser_update=更新用户\nuser_username_repeat=账号重复\nuser_username_valid=限制以小写字母开头，由小写字母、数字组成\nuser_password_update_placeholder=请输入新密码，为空则不更新密码\nuser_update_loginuser_limit=禁止操作当前登录账号\n\n## help\njob_help=使用教程\njob_help_document=官方文档"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/i18n/message_zh_TC.properties",
    "content": "admin_name=任務調度中心\nadmin_name_full=分布式任務調度平臺XXL-JOB\nadmin_version=2.4.2-SNAPSHOT\nadmin_i18n=\n\n## system\nsystem_tips=系統提示\nsystem_ok=確定\nsystem_close=關閉\nsystem_save=儲存\nsystem_cancel=取消\nsystem_search=搜尋\nsystem_status=狀態\nsystem_opt=操作\nsystem_please_input=請輸入\nsystem_please_choose=请選擇\nsystem_success=成功\nsystem_fail=失敗\nsystem_add_suc=新增成功\nsystem_add_fail=新增失敗\nsystem_update_suc=更新成功\nsystem_update_fail=更新失敗\nsystem_all=全部\nsystem_api_error=API錯誤\nsystem_show=查看\nsystem_empty=無\nsystem_opt_suc=操作成功\nsystem_opt_fail=操作失敗\nsystem_opt_edit=編輯\nsystem_opt_del=刪除\nsystem_opt_copy=復制\nsystem_unvalid=非法\nsystem_not_found=不存在\nsystem_nav=導航\nsystem_digits=整數\nsystem_lengh_limit=長度限制\nsystem_permission_limit=權限控管\nsystem_welcome=歡迎\n\n## daterangepicker\ndaterangepicker_ranges_recent_hour=最近一小時\ndaterangepicker_ranges_today=今日\ndaterangepicker_ranges_yesterday=昨日\ndaterangepicker_ranges_this_month=本月\ndaterangepicker_ranges_last_month=上個月\ndaterangepicker_ranges_recent_week=最近一周\ndaterangepicker_ranges_recent_month=最近一月\ndaterangepicker_custom_name=自定義\ndaterangepicker_custom_starttime=起始時間\ndaterangepicker_custom_endtime=結束時間\ndaterangepicker_custom_daysofweek=日,一,二,三,四,五,六\ndaterangepicker_custom_monthnames=一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月\n\n## dataTable\ndataTable_sProcessing=處理中...\ndataTable_sLengthMenu=每頁 _MENU_ 條記錄\ndataTable_sZeroRecords=沒有相符合記錄\ndataTable_sInfo=第 _PAGE_ 頁 ( 總共 _PAGES_ 頁，_TOTAL_ 條記錄 )\ndataTable_sInfoEmpty=無記錄\ndataTable_sInfoFiltered=(由 _MAX_ 項結果過濾)\ndataTable_sSearch=搜尋\ndataTable_sEmptyTable=表中資料為空\ndataTable_sLoadingRecords=載入中...\ndataTable_sFirst=首頁\ndataTable_sPrevious=上頁\ndataTable_sNext=下頁\ndataTable_sLast=末頁\ndataTable_sSortAscending=: 以升幂排序此列\ndataTable_sSortDescending=: 以降幂排序此列\n\n## login\nlogin_btn=登入\nlogin_remember_me=記住密碼\nlogin_username_placeholder=請輸入登入帳號\nlogin_password_placeholder=請輸入登入密碼\nlogin_username_empty=請輸入登入帳號\nlogin_username_lt_4=登入帳號不應低於4位數\nlogin_password_empty=請輸入登入密碼\nlogin_password_lt_4=登入密碼不應低於4位數\nlogin_success=登入成功\nlogin_fail=登入失敗\nlogin_param_empty=帳號或密碼為空值\nlogin_param_unvalid=帳號或密碼錯誤\n\n## logout\nlogout_btn=登出\nlogout_confirm=確認登出?\nlogout_success=登出成功\nlogout_fail=登出失敗\n\n## change pwd\nchange_pwd=修改密碼\nchange_pwd_suc_to_logout=修改密碼成功，即將登出\nchange_pwd_field_newpwd=新密碼\n\n## dashboard\njob_dashboard_name=運行報表\njob_dashboard_job_num=任務數量\njob_dashboard_job_num_tip=調度中心運行的任務數量\njob_dashboard_trigger_num=調度次數\njob_dashboard_trigger_num_tip=調度中心觸發的調度次數\njob_dashboard_jobgroup_num=執行器數量\njob_dashboard_jobgroup_num_tip=調度中心在線的執行器機器數量\njob_dashboard_report=調度報表\njob_dashboard_report_loaddata_fail=調度報表資料加載異常\njob_dashboard_date_report=日期分布圖\njob_dashboard_rate_report=成功比例圖\n\n## job info\njobinfo_name=任務管理\njobinfo_job=任務\njobinfo_field_add=新增\njobinfo_field_update=更新任務\njobinfo_field_id=任務ID\njobinfo_field_jobgroup=執行器\njobinfo_field_jobdesc=任務描述\njobinfo_field_gluetype=運行模式\njobinfo_field_executorparam=任務參數\njobinfo_field_author=負責人\njobinfo_field_timeout=任務超時秒數\njobinfo_field_alarmemail=告警郵件\njobinfo_field_alarmemail_placeholder=輸入多個告警郵件地址，請以逗號分隔\njobinfo_field_executorRouteStrategy=路由策略\njobinfo_field_childJobId=子任務ID\njobinfo_field_childJobId_placeholder=輸入子任務ID，如有多個請以逗號分隔\njobinfo_field_executorBlockStrategy=阻塞處理策略\njobinfo_field_executorFailRetryCount=失敗重試次數\njobinfo_field_executorFailRetryCount_placeholder=失敗重試次數，大於零時生效\njobinfo_script_location=腳本位置\njobinfo_shard_index=分片序號\njobinfo_shard_total=分片總數\njobinfo_opt_stop=停止\njobinfo_opt_start=啟動\njobinfo_opt_log=查詢日誌\njobinfo_opt_run=執行一次\njobinfo_opt_run_tips=請輸入本次執行的機器地址，為空則從執行器獲取\njobinfo_opt_registryinfo=注冊節點\njobinfo_opt_next_time=下次執行時間\njobinfo_glue_remark=源碼備註\njobinfo_glue_remark_limit=源碼備註長度限制為4~100\njobinfo_glue_rollback=版本回復\njobinfo_glue_jobid_unvalid=任務ID非法\njobinfo_glue_gluetype_unvalid=該任務非GLUE模式\njobinfo_field_executorTimeout_placeholder=任務超時時間，單位秒，大於零時生效\nschedule_type=調度類型\nschedule_type_none=無\nschedule_type_cron=CRON\nschedule_type_fix_rate=固定速度\nschedule_type_fix_delay=固定延遲\nschedule_type_none_limit_start=當前調度類型禁止啟動\nmisfire_strategy=調度過期策略\nmisfire_strategy_do_nothing=忽略\nmisfire_strategy_fire_once_now=立即執行壹次\njobinfo_conf_base=基礎配置\njobinfo_conf_schedule=調度配置\njobinfo_conf_job=任務配置\njobinfo_conf_advanced=高級配置\n\n## job log\njoblog_name=調度日誌\njoblog_status=狀態\njoblog_status_all=全部\njoblog_status_suc=成功\njoblog_status_fail=失敗\njoblog_status_running=進行中\njoblog_field_triggerTime=調度時間\njoblog_field_triggerCode=調度結果\njoblog_field_triggerMsg=調度備註\njoblog_field_handleTime=執行時間\njoblog_field_handleCode=執行结果\njoblog_field_handleMsg=執行備註\njoblog_field_executorAddress=執行器地址\njoblog_clean=清理\njoblog_clean_log=日誌清理\njoblog_clean_type=清理方式\njoblog_clean_type_1=清理一個月之前日誌資料\njoblog_clean_type_2=清理三個月之前日誌資料\njoblog_clean_type_3=清理六個月之前日誌資料\njoblog_clean_type_4=清理一年之前日誌資料\njoblog_clean_type_5=清理一千條以前日誌資料\njoblog_clean_type_6=清理一萬條以前日誌資料\njoblog_clean_type_7=清理三萬條以前日誌資料\njoblog_clean_type_8=清理十萬條以前日誌資料\njoblog_clean_type_9=清理所有日誌資料\njoblog_clean_type_unvalid=清理類型參数異常\njoblog_handleCode_200=成功\njoblog_handleCode_500=失敗\njoblog_handleCode_502=失敗(超時)\njoblog_kill_log=终止任務\njoblog_kill_log_limit=調度失敗，無法终止日誌\njoblog_kill_log_byman=人為操作，主動終止\njoblog_lost_fail=任務結果丟失，標記失敗\njoblog_rolling_log=執行日誌\njoblog_rolling_log_refresh=更新\njoblog_rolling_log_triggerfail=任務發起調度失敗，無法查看執行日誌\njoblog_rolling_log_failoften=終止請求Rolling日誌，請求失敗次數超上限，可刷新頁面重新加載日誌\njoblog_logid_unvalid=日誌ID非法\n\n## job group\njobgroup_name=執行器管理\njobgroup_list=執行器列表\njobgroup_add=新增執行器\njobgroup_edit=編輯執行器\njobgroup_del=刪除執行器\njobgroup_field_title=名稱\njobgroup_field_addressType=注冊方式\njobgroup_field_addressType_0=自動注冊\njobgroup_field_addressType_1=手動登錄\njobgroup_field_addressType_limit=手動登錄注冊方式，機器地址不可為空\njobgroup_field_registryList=機器地址\njobgroup_field_registryList_unvalid=機器地址格式非法\njobgroup_field_registryList_placeholder=請輸入執行器地址列表，多個地址請以逗號分隔\njobgroup_field_appname_limit=限制以小寫字母開頭，由小寫字母、數字和中划線組成\njobgroup_field_appname_length=AppName長度限制為4~64\njobgroup_field_title_length=名稱長度限制為4~12\njobgroup_field_order_digits=請輸入整數\njobgroup_field_orderrange=取值範圍為1~1000\njobgroup_del_limit_0=拒絕刪除，該執行器使用中\njobgroup_del_limit_1=拒絕删除，系统至少保留一個執行器\njobgroup_empty=不存在有效執行器，請聯絡系統管理員\n\n## job conf\njobconf_block_SERIAL_EXECUTION=單機串行\njobconf_block_DISCARD_LATER=丢棄后續調度\njobconf_block_COVER_EARLY=覆蓋之前調度\njobconf_route_first=第一個\njobconf_route_last=最後一個\njobconf_route_round=輪詢\njobconf_route_random=隨機\njobconf_route_consistenthash=一致性HASH\njobconf_route_lfu=最不經常使用\njobconf_route_lru=最近最久未使用\njobconf_route_failover=故障轉移\njobconf_route_busyover=忙碌轉移\njobconf_route_shard=分片廣播\njobconf_idleBeat=空閒檢測\njobconf_beat=心跳檢測\njobconf_monitor=任務調度中心監控告警\njobconf_monitor_detail=監控告警明细\njobconf_monitor_alarm_title=告警類型\njobconf_monitor_alarm_type=調度失敗\njobconf_monitor_alarm_content=告警内容\njobconf_trigger_admin_adress=調度機器\njobconf_trigger_exe_regtype=執行器-注冊方式\njobconf_trigger_exe_regaddress=執行器-地址列表\njobconf_trigger_address_empty=調度失敗：執行器地址為空\njobconf_trigger_run=觸發調度\njobconf_trigger_child_run=觸發子任務\njobconf_callback_child_msg1={0}/{1} [任務ID={2}], 觸發{3}, 觸發備註: {4} <br>\njobconf_callback_child_msg2={0}/{1} [任務ID={2}], 觸發失败, 觸發備註: 任務ID格式錯誤 <br>\njobconf_trigger_type=任務觸發類型\njobconf_trigger_type_cron=Cron觸發\njobconf_trigger_type_manual=手動觸發\njobconf_trigger_type_parent=父任務觸發\njobconf_trigger_type_api=API觸發\njobconf_trigger_type_retry=失敗重試觸發\njobconf_trigger_type_misfire=調度過期補償\n\n## user\nuser_manage=用户管理\nuser_username=帳號\nuser_password=密碼\nuser_role=角色\nuser_role_admin=管理員\nuser_role_normal=普通用戶\nuser_permission=權限\nuser_add=新增用戶\nuser_update=更新用戶\nuser_username_repeat=帳號重複\nuser_username_valid=限制以小寫字母開頭，由小寫字母、數字組成\nuser_password_update_placeholder=請輸入新密碼，為空則不更新密碼\nuser_update_loginuser_limit=禁止操作當前登入帳號\n\n## help\njob_help=使用教程\njob_help_document=官方文件"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration debug=\"false\" scan=\"true\" scanPeriod=\"1 seconds\">\n\n    <contextName>logback</contextName>\n    <property name=\"log.path\" value=\"/data/applogs/xxl-job/xxl-job-admin.log\"/>\n\n    <appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder>\n            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>\n        </encoder>\n    </appender>\n\n    <appender name=\"file\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <file>${log.path}</file>\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>\n        </rollingPolicy>\n        <encoder>\n            <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n\n            </pattern>\n        </encoder>\n    </appender>\n\n    <root level=\"info\">\n        <appender-ref ref=\"console\"/>\n        <appender-ref ref=\"file\"/>\n    </root>\n\n</configuration>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \n\t\"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.xxl.job.admin.dao.XxlJobGroupDao\">\n\t\n\t<resultMap id=\"XxlJobGroup\" type=\"com.xxl.job.admin.core.model.XxlJobGroup\" >\n\t\t<result column=\"id\" property=\"id\" />\n\t    <result column=\"app_name\" property=\"appname\" />\n\t    <result column=\"title\" property=\"title\" />\n\t\t<result column=\"address_type\" property=\"addressType\" />\n\t\t<result column=\"address_list\" property=\"addressList\" />\n\t\t<result column=\"update_time\" property=\"updateTime\" />\n\t</resultMap>\n\n\t<sql id=\"Base_Column_List\">\n\t\tt.id,\n\t\tt.app_name,\n\t\tt.title,\n\t\tt.address_type,\n\t\tt.address_list,\n\t\tt.update_time\n\t</sql>\n\n\t<select id=\"findAll\" resultMap=\"XxlJobGroup\">\n\t\tSELECT <include refid=\"Base_Column_List\" />\n\t\tFROM xxl_job_group AS t\n\t\tORDER BY t.app_name, t.title, t.id ASC\n\t</select>\n\n\t<select id=\"findByAddressType\" parameterType=\"java.lang.Integer\" resultMap=\"XxlJobGroup\">\n\t\tSELECT <include refid=\"Base_Column_List\" />\n\t\tFROM xxl_job_group AS t\n\t\tWHERE t.address_type = #{addressType}\n\t\tORDER BY t.app_name, t.title, t.id ASC\n\t</select>\n\n\t<insert id=\"save\" parameterType=\"com.xxl.job.admin.core.model.XxlJobGroup\" useGeneratedKeys=\"true\" keyProperty=\"id\" >\n\t\tINSERT INTO xxl_job_group ( `app_name`, `title`, `address_type`, `address_list`, `update_time`)\n\t\tvalues ( #{appname}, #{title}, #{addressType}, #{addressList}, #{updateTime} );\n\t</insert>\n\n\t<update id=\"update\" parameterType=\"com.xxl.job.admin.core.model.XxlJobGroup\" >\n\t\tUPDATE xxl_job_group\n\t\tSET `app_name` = #{appname},\n\t\t\t`title` = #{title},\n\t\t\t`address_type` = #{addressType},\n\t\t\t`address_list` = #{addressList},\n\t\t\t`update_time` = #{updateTime}\n\t\tWHERE id = #{id}\n\t</update>\n\n\t<delete id=\"remove\" parameterType=\"java.lang.Integer\" >\n\t\tDELETE FROM xxl_job_group\n\t\tWHERE id = #{id}\n\t</delete>\n\n\t<select id=\"load\" parameterType=\"java.lang.Integer\" resultMap=\"XxlJobGroup\">\n\t\tSELECT <include refid=\"Base_Column_List\" />\n\t\tFROM xxl_job_group AS t\n\t\tWHERE t.id = #{id}\n\t</select>\n\n\t<select id=\"pageList\" parameterType=\"java.util.HashMap\" resultMap=\"XxlJobGroup\">\n\t\tSELECT <include refid=\"Base_Column_List\" />\n\t\tFROM xxl_job_group AS t\n\t\t<trim prefix=\"WHERE\" prefixOverrides=\"AND | OR\" >\n\t\t\t<if test=\"appname != null and appname != ''\">\n\t\t\t\tAND t.app_name like CONCAT(CONCAT('%', #{appname}), '%')\n\t\t\t</if>\n\t\t\t<if test=\"title != null and title != ''\">\n\t\t\t\tAND t.title like CONCAT(CONCAT('%', #{title}), '%')\n\t\t\t</if>\n\t\t</trim>\n\t\tORDER BY t.app_name, t.title, t.id ASC\n\t\tLIMIT #{offset}, #{pagesize}\n\t</select>\n\n\t<select id=\"pageListCount\" parameterType=\"java.util.HashMap\" resultType=\"int\">\n\t\tSELECT count(1)\n\t\tFROM xxl_job_group AS t\n\t\t<trim prefix=\"WHERE\" prefixOverrides=\"AND | OR\" >\n\t\t\t<if test=\"appname != null and appname != ''\">\n\t\t\t\tAND t.app_name like CONCAT(CONCAT('%', #{appname}), '%')\n\t\t\t</if>\n\t\t\t<if test=\"title != null and title != ''\">\n\t\t\t\tAND t.title like CONCAT(CONCAT('%', #{title}), '%')\n\t\t\t</if>\n\t\t</trim>\n\t</select>\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n\t\"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.xxl.job.admin.dao.XxlJobInfoDao\">\n\n\t<resultMap id=\"XxlJobInfo\" type=\"com.xxl.job.admin.core.model.XxlJobInfo\" >\n\t\t<result column=\"id\" property=\"id\" />\n\n\t\t<result column=\"job_group\" property=\"jobGroup\" />\n\t    <result column=\"job_desc\" property=\"jobDesc\" />\n\n\t    <result column=\"add_time\" property=\"addTime\" />\n\t    <result column=\"update_time\" property=\"updateTime\" />\n\n\t    <result column=\"author\" property=\"author\" />\n\t    <result column=\"alarm_email\" property=\"alarmEmail\" />\n\n\t\t<result column=\"schedule_type\" property=\"scheduleType\" />\n\t\t<result column=\"schedule_conf\" property=\"scheduleConf\" />\n\t\t<result column=\"misfire_strategy\" property=\"misfireStrategy\" />\n\n\t\t<result column=\"executor_route_strategy\" property=\"executorRouteStrategy\" />\n\t\t<result column=\"executor_handler\" property=\"executorHandler\" />\n\t    <result column=\"executor_param\" property=\"executorParam\" />\n\t\t<result column=\"executor_block_strategy\" property=\"executorBlockStrategy\" />\n\t\t<result column=\"executor_timeout\" property=\"executorTimeout\" />\n\t\t<result column=\"executor_fail_retry_count\" property=\"executorFailRetryCount\" />\n\n\t    <result column=\"glue_type\" property=\"glueType\" />\n\t    <result column=\"glue_source\" property=\"glueSource\" />\n\t    <result column=\"glue_remark\" property=\"glueRemark\" />\n\t\t<result column=\"glue_updatetime\" property=\"glueUpdatetime\" />\n\n\t\t<result column=\"child_jobid\" property=\"childJobId\" />\n\n\t\t<result column=\"trigger_status\" property=\"triggerStatus\" />\n\t\t<result column=\"trigger_last_time\" property=\"triggerLastTime\" />\n\t\t<result column=\"trigger_next_time\" property=\"triggerNextTime\" />\n\t</resultMap>\n\n\t<sql id=\"Base_Column_List\">\n\t\tt.id,\n\t\tt.job_group,\n\t\tt.job_desc,\n\t\tt.add_time,\n\t\tt.update_time,\n\t\tt.author,\n\t\tt.alarm_email,\n\t\tt.schedule_type,\n\t\tt.schedule_conf,\n\t\tt.misfire_strategy,\n\t\tt.executor_route_strategy,\n\t\tt.executor_handler,\n\t\tt.executor_param,\n\t\tt.executor_block_strategy,\n\t\tt.executor_timeout,\n\t\tt.executor_fail_retry_count,\n\t\tt.glue_type,\n\t\tt.glue_source,\n\t\tt.glue_remark,\n\t\tt.glue_updatetime,\n\t\tt.child_jobid,\n\t\tt.trigger_status,\n\t\tt.trigger_last_time,\n\t\tt.trigger_next_time\n\t</sql>\n\n\t<select id=\"pageList\" parameterType=\"java.util.HashMap\" resultMap=\"XxlJobInfo\">\n\t\tSELECT <include refid=\"Base_Column_List\" />\n\t\tFROM xxl_job_info AS t\n\t\t<trim prefix=\"WHERE\" prefixOverrides=\"AND | OR\" >\n\t\t\t<if test=\"jobGroup gt 0\">\n\t\t\t\tAND t.job_group = #{jobGroup}\n\t\t\t</if>\n            <if test=\"triggerStatus gte 0\">\n                AND t.trigger_status = #{triggerStatus}\n            </if>\n\t\t\t<if test=\"jobDesc != null and jobDesc != ''\">\n\t\t\t\tAND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%')\n\t\t\t</if>\n\t\t\t<if test=\"executorHandler != null and executorHandler != ''\">\n\t\t\t\tAND t.executor_handler like CONCAT(CONCAT('%', #{executorHandler}), '%')\n\t\t\t</if>\n\t\t\t<if test=\"author != null and author != ''\">\n\t\t\t\tAND t.author like CONCAT(CONCAT('%', #{author}), '%')\n\t\t\t</if>\n\t\t</trim>\n\t\tORDER BY id DESC\n\t\tLIMIT #{offset}, #{pagesize}\n\t</select>\n\n\t<select id=\"pageListCount\" parameterType=\"java.util.HashMap\" resultType=\"int\">\n\t\tSELECT count(1)\n\t\tFROM xxl_job_info AS t\n\t\t<trim prefix=\"WHERE\" prefixOverrides=\"AND | OR\" >\n\t\t\t<if test=\"jobGroup gt 0\">\n\t\t\t\tAND t.job_group = #{jobGroup}\n\t\t\t</if>\n            <if test=\"triggerStatus gte 0\">\n                AND t.trigger_status = #{triggerStatus}\n            </if>\n\t\t\t<if test=\"jobDesc != null and jobDesc != ''\">\n\t\t\t\tAND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%')\n\t\t\t</if>\n\t\t\t<if test=\"executorHandler != null and executorHandler != ''\">\n\t\t\t\tAND t.executor_handler like CONCAT(CONCAT('%', #{executorHandler}), '%')\n\t\t\t</if>\n\t\t\t<if test=\"author != null and author != ''\">\n\t\t\t\tAND t.author like CONCAT(CONCAT('%', #{author}), '%')\n\t\t\t</if>\n\t\t</trim>\n\t</select>\n\n\t<insert id=\"save\" parameterType=\"com.xxl.job.admin.core.model.XxlJobInfo\" useGeneratedKeys=\"true\" keyProperty=\"id\" >\n\t\tINSERT INTO xxl_job_info (\n\t\t\tjob_group,\n\t\t\tjob_desc,\n\t\t\tadd_time,\n\t\t\tupdate_time,\n\t\t\tauthor,\n\t\t\talarm_email,\n\t\t\tschedule_type,\n\t\t\tschedule_conf,\n\t\t\tmisfire_strategy,\n            executor_route_strategy,\n\t\t\texecutor_handler,\n\t\t\texecutor_param,\n\t\t\texecutor_block_strategy,\n\t\t\texecutor_timeout,\n\t\t\texecutor_fail_retry_count,\n\t\t\tglue_type,\n\t\t\tglue_source,\n\t\t\tglue_remark,\n\t\t\tglue_updatetime,\n\t\t\tchild_jobid,\n\t\t\ttrigger_status,\n\t\t\ttrigger_last_time,\n\t\t\ttrigger_next_time\n\t\t) VALUES (\n\t\t\t#{jobGroup},\n\t\t\t#{jobDesc},\n\t\t\t#{addTime},\n\t\t\t#{updateTime},\n\t\t\t#{author},\n\t\t\t#{alarmEmail},\n\t\t\t#{scheduleType},\n\t\t\t#{scheduleConf},\n\t\t\t#{misfireStrategy},\n\t\t\t#{executorRouteStrategy},\n\t\t\t#{executorHandler},\n\t\t\t#{executorParam},\n\t\t\t#{executorBlockStrategy},\n\t\t\t#{executorTimeout},\n\t\t\t#{executorFailRetryCount},\n\t\t\t#{glueType},\n\t\t\t#{glueSource},\n\t\t\t#{glueRemark},\n\t\t\t#{glueUpdatetime},\n\t\t\t#{childJobId},\n\t\t\t#{triggerStatus},\n\t\t\t#{triggerLastTime},\n\t\t\t#{triggerNextTime}\n\t\t);\n\t\t<!--<selectKey resultType=\"java.lang.Integer\" order=\"AFTER\" keyProperty=\"id\">\n\t\t\tSELECT LAST_INSERT_ID()\n\t\t\t/*SELECT @@IDENTITY AS id*/\n\t\t</selectKey>-->\n\t</insert>\n\n\t<select id=\"loadById\" parameterType=\"java.util.HashMap\" resultMap=\"XxlJobInfo\">\n\t\tSELECT <include refid=\"Base_Column_List\" />\n\t\tFROM xxl_job_info AS t\n\t\tWHERE t.id = #{id}\n\t</select>\n\n\t<update id=\"update\" parameterType=\"com.xxl.job.admin.core.model.XxlJobInfo\" >\n\t\tUPDATE xxl_job_info\n\t\tSET\n\t\t\tjob_group = #{jobGroup},\n\t\t\tjob_desc = #{jobDesc},\n\t\t\tupdate_time = #{updateTime},\n\t\t\tauthor = #{author},\n\t\t\talarm_email = #{alarmEmail},\n\t\t\tschedule_type = #{scheduleType},\n\t\t\tschedule_conf = #{scheduleConf},\n\t\t\tmisfire_strategy = #{misfireStrategy},\n\t\t\texecutor_route_strategy = #{executorRouteStrategy},\n\t\t\texecutor_handler = #{executorHandler},\n\t\t\texecutor_param = #{executorParam},\n\t\t\texecutor_block_strategy = #{executorBlockStrategy},\n\t\t\texecutor_timeout = ${executorTimeout},\n\t\t\texecutor_fail_retry_count = ${executorFailRetryCount},\n\t\t\tglue_type = #{glueType},\n\t\t\tglue_source = #{glueSource},\n\t\t\tglue_remark = #{glueRemark},\n\t\t\tglue_updatetime = #{glueUpdatetime},\n\t\t\tchild_jobid = #{childJobId},\n\t\t\ttrigger_status = #{triggerStatus},\n\t\t\ttrigger_last_time = #{triggerLastTime},\n\t\t\ttrigger_next_time = #{triggerNextTime}\n\t\tWHERE id = #{id}\n\t</update>\n\n\t<delete id=\"delete\" parameterType=\"java.util.HashMap\">\n\t\tDELETE\n\t\tFROM xxl_job_info\n\t\tWHERE id = #{id}\n\t</delete>\n\n\t<select id=\"getJobsByGroup\" parameterType=\"java.util.HashMap\" resultMap=\"XxlJobInfo\">\n\t\tSELECT <include refid=\"Base_Column_List\" />\n\t\tFROM xxl_job_info AS t\n\t\tWHERE t.job_group = #{jobGroup}\n\t</select>\n\n\t<select id=\"findAllCount\" resultType=\"int\">\n\t\tSELECT count(1)\n\t\tFROM xxl_job_info\n\t</select>\n\n\n\t<select id=\"scheduleJobQuery\" parameterType=\"java.util.HashMap\" resultMap=\"XxlJobInfo\">\n\t\tSELECT <include refid=\"Base_Column_List\" />\n\t\tFROM xxl_job_info AS t\n\t\tWHERE t.trigger_status = 1\n\t\t\tand t.trigger_next_time <![CDATA[ <= ]]> #{maxNextTime}\n\t\tORDER BY id ASC\n\t\tLIMIT #{pagesize}\n\t</select>\n\n\t<update id=\"scheduleUpdate\" parameterType=\"com.xxl.job.admin.core.model.XxlJobInfo\"  >\n\t\tUPDATE xxl_job_info\n\t\tSET\n\t\t\ttrigger_last_time = #{triggerLastTime},\n\t\t\ttrigger_next_time = #{triggerNextTime},\n\t\t\ttrigger_status = #{triggerStatus}\n\t\tWHERE id = #{id}\n\t</update>\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \n\t\"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.xxl.job.admin.dao.XxlJobLogGlueDao\">\n\t\n\t<resultMap id=\"XxlJobLogGlue\" type=\"com.xxl.job.admin.core.model.XxlJobLogGlue\" >\n\t\t<result column=\"id\" property=\"id\" />\n\t    <result column=\"job_id\" property=\"jobId\" />\n\t\t<result column=\"glue_type\" property=\"glueType\" />\n\t    <result column=\"glue_source\" property=\"glueSource\" />\n\t    <result column=\"glue_remark\" property=\"glueRemark\" />\n\t    <result column=\"add_time\" property=\"addTime\" />\n\t    <result column=\"update_time\" property=\"updateTime\" />\n\t</resultMap>\n\n\t<sql id=\"Base_Column_List\">\n\t\tt.id,\n\t\tt.job_id,\n\t\tt.glue_type,\n\t\tt.glue_source,\n\t\tt.glue_remark,\n\t\tt.add_time,\n\t\tt.update_time\n\t</sql>\n\t\n\t<insert id=\"save\" parameterType=\"com.xxl.job.admin.core.model.XxlJobLogGlue\" useGeneratedKeys=\"true\" keyProperty=\"id\" >\n\t\tINSERT INTO xxl_job_logglue (\n\t\t\t`job_id`,\n\t\t\t`glue_type`,\n\t\t\t`glue_source`,\n\t\t\t`glue_remark`,\n\t\t\t`add_time`, \n\t\t\t`update_time`\n\t\t) VALUES (\n\t\t\t#{jobId},\n\t\t\t#{glueType},\n\t\t\t#{glueSource},\n\t\t\t#{glueRemark},\n\t\t\t#{addTime},\n\t\t\t#{updateTime}\n\t\t);\n\t\t<!--<selectKey resultType=\"java.lang.Integer\" order=\"AFTER\" keyProperty=\"id\">\n\t\t\tSELECT LAST_INSERT_ID() \n\t\t</selectKey>-->\n\t</insert>\n\t\n\t<select id=\"findByJobId\" parameterType=\"java.lang.Integer\" resultMap=\"XxlJobLogGlue\">\n\t\tSELECT <include refid=\"Base_Column_List\" />\n\t\tFROM xxl_job_logglue AS t\n\t\tWHERE t.job_id = #{jobId}\n\t\tORDER BY id DESC\n\t</select>\n\t\n\t<delete id=\"removeOld\" >\n\t\tDELETE FROM xxl_job_logglue\n\t\tWHERE id NOT in(\n\t\t\tSELECT id FROM(\n\t\t\t\tSELECT id FROM xxl_job_logglue\n\t\t\t\tWHERE `job_id` = #{jobId}\n\t\t\t\tORDER BY update_time desc\n\t\t\t\tLIMIT 0, #{limit}\n\t\t\t) t1\n\t\t) AND `job_id` = #{jobId}\n\t</delete>\n\t\n\t<delete id=\"deleteByJobId\" parameterType=\"java.lang.Integer\" >\n\t\tDELETE FROM xxl_job_logglue\n\t\tWHERE `job_id` = #{jobId}\n\t</delete>\n\t\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \n\t\"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.xxl.job.admin.dao.XxlJobLogDao\">\n\t\n\t<resultMap id=\"XxlJobLog\" type=\"com.xxl.job.admin.core.model.XxlJobLog\" >\n\t\t<result column=\"id\" property=\"id\" />\n\n\t\t<result column=\"job_group\" property=\"jobGroup\" />\n\t\t<result column=\"job_id\" property=\"jobId\" />\n\n\t\t<result column=\"executor_address\" property=\"executorAddress\" />\n\t\t<result column=\"executor_handler\" property=\"executorHandler\" />\n\t    <result column=\"executor_param\" property=\"executorParam\" />\n\t\t<result column=\"executor_sharding_param\" property=\"executorShardingParam\" />\n\t\t<result column=\"executor_fail_retry_count\" property=\"executorFailRetryCount\" />\n\t    \n\t    <result column=\"trigger_time\" property=\"triggerTime\" />\n\t    <result column=\"trigger_code\" property=\"triggerCode\" />\n\t    <result column=\"trigger_msg\" property=\"triggerMsg\" />\n\t    \n\t    <result column=\"handle_time\" property=\"handleTime\" />\n\t    <result column=\"handle_code\" property=\"handleCode\" />\n\t    <result column=\"handle_msg\" property=\"handleMsg\" />\n\n\t\t<result column=\"alarm_status\" property=\"alarmStatus\" />\n\t</resultMap>\n\n\t<sql id=\"Base_Column_List\">\n\t\tt.id,\n\t\tt.job_group,\n\t\tt.job_id,\n\t\tt.executor_address,\n\t\tt.executor_handler,\n\t\tt.executor_param,\n\t\tt.executor_sharding_param,\n\t\tt.executor_fail_retry_count,\n\t\tt.trigger_time,\n\t\tt.trigger_code,\n\t\tt.trigger_msg,\n\t\tt.handle_time,\n\t\tt.handle_code,\n\t\tt.handle_msg,\n\t\tt.alarm_status\n\t</sql>\n\t\n\t<select id=\"pageList\" resultMap=\"XxlJobLog\">\n\t\tSELECT <include refid=\"Base_Column_List\" />\n\t\tFROM xxl_job_log AS t\n\t\t<trim prefix=\"WHERE\" prefixOverrides=\"AND | OR\" >\n\t\t\t<if test=\"jobId==0 and jobGroup gt 0\">\n\t\t\t\tAND t.job_group = #{jobGroup}\n\t\t\t</if>\n\t\t\t<if test=\"jobId gt 0\">\n\t\t\t\tAND t.job_id = #{jobId}\n\t\t\t</if>\n\t\t\t<if test=\"triggerTimeStart != null\">\n\t\t\t\tAND t.trigger_time <![CDATA[ >= ]]> #{triggerTimeStart}\n\t\t\t</if>\n\t\t\t<if test=\"triggerTimeEnd != null\">\n\t\t\t\tAND t.trigger_time <![CDATA[ <= ]]> #{triggerTimeEnd}\n\t\t\t</if>\n\t\t\t<if test=\"logStatus == 1\" >\n\t\t\t\tAND t.handle_code = 200\n\t\t\t</if>\n\t\t\t<if test=\"logStatus == 2\" >\n\t\t\t\tAND (\n\t\t\t\t\tt.trigger_code NOT IN (0, 200) OR\n\t\t\t\t\tt.handle_code NOT IN (0, 200)\n\t\t\t\t)\n\t\t\t</if>\n\t\t\t<if test=\"logStatus == 3\" >\n\t\t\t\tAND t.trigger_code = 200\n\t\t\t\tAND t.handle_code = 0\n\t\t\t</if>\n\t\t</trim>\n\t\tORDER BY t.trigger_time DESC\n\t\tLIMIT #{offset}, #{pagesize}\n\t</select>\n\t\n\t<select id=\"pageListCount\" resultType=\"int\">\n\t\tSELECT count(1)\n\t\tFROM xxl_job_log AS t\n\t\t<trim prefix=\"WHERE\" prefixOverrides=\"AND | OR\" >\n\t\t\t<if test=\"jobId==0 and jobGroup gt 0\">\n\t\t\t\tAND t.job_group = #{jobGroup}\n\t\t\t</if>\n\t\t\t<if test=\"jobId gt 0\">\n\t\t\t\tAND t.job_id = #{jobId}\n\t\t\t</if>\n\t\t\t<if test=\"triggerTimeStart != null\">\n\t\t\t\tAND t.trigger_time <![CDATA[ >= ]]> #{triggerTimeStart}\n\t\t\t</if>\n\t\t\t<if test=\"triggerTimeEnd != null\">\n\t\t\t\tAND t.trigger_time <![CDATA[ <= ]]> #{triggerTimeEnd}\n\t\t\t</if>\n\t\t\t<if test=\"logStatus == 1\" >\n\t\t\t\tAND t.handle_code = 200\n\t\t\t</if>\n\t\t\t<if test=\"logStatus == 2\" >\n\t\t\t\tAND (\n\t\t\t\t\tt.trigger_code NOT IN (0, 200) OR\n\t\t\t\t\tt.handle_code NOT IN (0, 200)\n\t\t\t\t)\n\t\t\t</if>\n\t\t\t<if test=\"logStatus == 3\" >\n\t\t\t\tAND t.trigger_code = 200\n\t\t\t\tAND t.handle_code = 0\n\t\t\t</if>\n\t\t</trim>\n\t</select>\n\t\n\t<select id=\"load\" parameterType=\"java.lang.Long\" resultMap=\"XxlJobLog\">\n\t\tSELECT <include refid=\"Base_Column_List\" />\n\t\tFROM xxl_job_log AS t\n\t\tWHERE t.id = #{id}\n\t</select>\n\n\t\n\t<insert id=\"save\" parameterType=\"com.xxl.job.admin.core.model.XxlJobLog\" useGeneratedKeys=\"true\" keyProperty=\"id\" >\n\t\tINSERT INTO xxl_job_log (\n\t\t\t`job_group`,\n\t\t\t`job_id`,\n\t\t\t`trigger_time`,\n\t\t\t`trigger_code`,\n\t\t\t`handle_code`\n\t\t) VALUES (\n\t\t\t#{jobGroup},\n\t\t\t#{jobId},\n\t\t\t#{triggerTime},\n\t\t\t#{triggerCode},\n\t\t\t#{handleCode}\n\t\t);\n\t\t<!--<selectKey resultType=\"java.lang.Integer\" order=\"AFTER\" keyProperty=\"id\">\n\t\t\tSELECT LAST_INSERT_ID() \n\t\t</selectKey>-->\n\t</insert>\n\n\t<update id=\"updateTriggerInfo\" >\n\t\tUPDATE xxl_job_log\n\t\tSET\n\t\t\t`trigger_time`= #{triggerTime},\n\t\t\t`trigger_code`= #{triggerCode},\n\t\t\t`trigger_msg`= #{triggerMsg},\n\t\t\t`executor_address`= #{executorAddress},\n\t\t\t`executor_handler`=#{executorHandler},\n\t\t\t`executor_param`= #{executorParam},\n\t\t\t`executor_sharding_param`= #{executorShardingParam},\n\t\t\t`executor_fail_retry_count`= #{executorFailRetryCount}\n\t\tWHERE `id`= #{id}\n\t</update>\n\n\t<update id=\"updateHandleInfo\">\n\t\tUPDATE xxl_job_log\n\t\tSET \n\t\t\t`handle_time`= #{handleTime}, \n\t\t\t`handle_code`= #{handleCode},\n\t\t\t`handle_msg`= #{handleMsg}\n\t\tWHERE `id`= #{id}\n\t</update>\n\t\n\t<delete id=\"delete\" >\n\t\tdelete from xxl_job_log\n\t\tWHERE job_id = #{jobId}\n\t</delete>\n\n    <!--<select id=\"triggerCountByDay\" resultType=\"java.util.Map\" >\n\t\tSELECT\n\t\t\tDATE_FORMAT(trigger_time,'%Y-%m-%d') triggerDay,\n\t\t\tCOUNT(handle_code) triggerDayCount,\n\t\t\tSUM(CASE WHEN (trigger_code in (0, 200) and handle_code = 0) then 1 else 0 end) as triggerDayCountRunning,\n\t\t\tSUM(CASE WHEN handle_code = 200 then 1 else 0 end) as triggerDayCountSuc\n\t\tFROM xxl_job_log\n\t\tWHERE trigger_time BETWEEN #{from} and #{to}\n\t\tGROUP BY triggerDay\n\t\tORDER BY triggerDay\n    </select>-->\n\n    <select id=\"findLogReport\" resultType=\"java.util.Map\" >\n\t\tSELECT\n\t\t\tCOUNT(handle_code) triggerDayCount,\n\t\t\tSUM(CASE WHEN (trigger_code in (0, 200) and handle_code = 0) then 1 else 0 end) as triggerDayCountRunning,\n\t\t\tSUM(CASE WHEN handle_code = 200 then 1 else 0 end) as triggerDayCountSuc\n\t\tFROM xxl_job_log\n\t\tWHERE trigger_time BETWEEN #{from} and #{to}\n    </select>\n\n\t<select id=\"findClearLogIds\" resultType=\"long\" >\n\t\tSELECT id FROM xxl_job_log\n\t\t<trim prefix=\"WHERE\" prefixOverrides=\"AND | OR\" >\n\t\t\t<if test=\"jobGroup gt 0\">\n\t\t\t\tAND job_group = #{jobGroup}\n\t\t\t</if>\n\t\t\t<if test=\"jobId gt 0\">\n\t\t\t\tAND job_id = #{jobId}\n\t\t\t</if>\n\t\t\t<if test=\"clearBeforeTime != null\">\n\t\t\t\tAND trigger_time <![CDATA[ <= ]]> #{clearBeforeTime}\n\t\t\t</if>\n\t\t\t<if test=\"clearBeforeNum gt 0\">\n\t\t\t\tAND id NOT in(\n\t\t\t\tSELECT id FROM(\n\t\t\t\tSELECT id FROM xxl_job_log AS t\n\t\t\t\t<trim prefix=\"WHERE\" prefixOverrides=\"AND | OR\" >\n\t\t\t\t\t<if test=\"jobGroup gt 0\">\n\t\t\t\t\t\tAND t.job_group = #{jobGroup}\n\t\t\t\t\t</if>\n\t\t\t\t\t<if test=\"jobId gt 0\">\n\t\t\t\t\t\tAND t.job_id = #{jobId}\n\t\t\t\t\t</if>\n\t\t\t\t</trim>\n\t\t\t\tORDER BY t.trigger_time desc\n\t\t\t\tLIMIT 0, #{clearBeforeNum}\n\t\t\t\t) t1\n\t\t\t\t)\n\t\t\t</if>\n\t\t</trim>\n\t\torder by id asc\n\t\tLIMIT #{pagesize}\n\t</select>\n\n\t<delete id=\"clearLog\" >\n\t\tdelete from xxl_job_log\n\t\tWHERE id in\n\t\t<foreach collection=\"logIds\" item=\"item\" open=\"(\" close=\")\" separator=\",\" >\n\t\t\t#{item}\n\t\t</foreach>\n\t</delete>\n\n\t<select id=\"findFailJobLogIds\" resultType=\"long\" >\n\t\tSELECT id FROM `xxl_job_log`\n\t\tWHERE !(\n\t\t\t(trigger_code in (0, 200) and handle_code = 0)\n\t\t\tOR\n\t\t\t(handle_code = 200)\n\t\t)\n\t\tAND `alarm_status` = 0\n\t\tORDER BY id ASC\n\t\tLIMIT #{pagesize}\n\t</select>\n\n\t<update id=\"updateAlarmStatus\" >\n\t\tUPDATE xxl_job_log\n\t\tSET\n\t\t\t`alarm_status` = #{newAlarmStatus}\n\t\tWHERE `id`= #{logId} AND `alarm_status` = #{oldAlarmStatus}\n\t</update>\n\n\t<select id=\"findLostJobIds\" resultType=\"long\" >\n\t\tSELECT\n\t\t\tt.id\n\t\tFROM\n\t\t\txxl_job_log t\n\t\t\tLEFT JOIN xxl_job_registry t2 ON t.executor_address = t2.registry_value\n\t\tWHERE\n\t\t\tt.trigger_code = 200\n\t\t\t\tAND t.handle_code = 0\n\t\t\t\tAND t.trigger_time <![CDATA[ <= ]]> #{losedTime}\n\t\t\t\tAND t2.id IS NULL;\n\t</select>\n\t<!--\n\tSELECT t.id\n\tFROM xxl_job_log AS t\n\tWHERE t.trigger_code = 200\n\t\tand t.handle_code = 0\n\t\tand t.trigger_time <![CDATA[ <= ]]> #{losedTime}\n\t\tand t.executor_address not in (\n\t\t\tSELECT t2.registry_value\n\t\t\tFROM xxl_job_registry AS t2\n\t\t)\n\t-->\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/mybatis-mapper/XxlJobLogReportMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \n\t\"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.xxl.job.admin.dao.XxlJobLogReportDao\">\n\t\n\t<resultMap id=\"XxlJobLogReport\" type=\"com.xxl.job.admin.core.model.XxlJobLogReport\" >\n\t\t<result column=\"id\" property=\"id\" />\n\t    <result column=\"trigger_day\" property=\"triggerDay\" />\n\t\t<result column=\"running_count\" property=\"runningCount\" />\n\t    <result column=\"suc_count\" property=\"sucCount\" />\n\t    <result column=\"fail_count\" property=\"failCount\" />\n\t</resultMap>\n\n\t<sql id=\"Base_Column_List\">\n\t\tt.id,\n\t\tt.trigger_day,\n\t\tt.running_count,\n\t\tt.suc_count,\n\t\tt.fail_count\n\t</sql>\n\t\n\t<insert id=\"save\" parameterType=\"com.xxl.job.admin.core.model.XxlJobLogReport\" useGeneratedKeys=\"true\" keyProperty=\"id\" >\n\t\tINSERT INTO xxl_job_log_report (\n\t\t\t`trigger_day`,\n\t\t\t`running_count`,\n\t\t\t`suc_count`,\n\t\t\t`fail_count`\n\t\t) VALUES (\n\t\t\t#{triggerDay},\n\t\t\t#{runningCount},\n\t\t\t#{sucCount},\n\t\t\t#{failCount}\n\t\t);\n\t\t<!--<selectKey resultType=\"java.lang.Integer\" order=\"AFTER\" keyProperty=\"id\">\n\t\t\tSELECT LAST_INSERT_ID() \n\t\t</selectKey>-->\n\t</insert>\n\n\t<update id=\"update\" >\n        UPDATE xxl_job_log_report\n        SET `running_count` = #{runningCount},\n        \t`suc_count` = #{sucCount},\n        \t`fail_count` = #{failCount}\n        WHERE `trigger_day` = #{triggerDay}\n    </update>\n\n\t<select id=\"queryLogReport\" resultMap=\"XxlJobLogReport\">\n\t\tSELECT <include refid=\"Base_Column_List\" />\n\t\tFROM xxl_job_log_report AS t\n\t\tWHERE t.trigger_day between #{triggerDayFrom} and #{triggerDayTo}\n\t\tORDER BY t.trigger_day ASC\n\t</select>\n\n\t<select id=\"queryLogReportTotal\" resultMap=\"XxlJobLogReport\">\n\t\tSELECT\n\t\t\tSUM(running_count) running_count,\n\t\t\tSUM(suc_count) suc_count,\n\t\t\tSUM(fail_count) fail_count\n\t\tFROM xxl_job_log_report AS t\n\t</select>\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \n\t\"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.xxl.job.admin.dao.XxlJobRegistryDao\">\n\t\n\t<resultMap id=\"XxlJobRegistry\" type=\"com.xxl.job.admin.core.model.XxlJobRegistry\" >\n\t\t<result column=\"id\" property=\"id\" />\n\t    <result column=\"registry_group\" property=\"registryGroup\" />\n\t    <result column=\"registry_key\" property=\"registryKey\" />\n\t    <result column=\"registry_value\" property=\"registryValue\" />\n\t\t<result column=\"update_time\" property=\"updateTime\" />\n\t</resultMap>\n\n\t<sql id=\"Base_Column_List\">\n\t\tt.id,\n\t\tt.registry_group,\n\t\tt.registry_key,\n\t\tt.registry_value,\n\t\tt.update_time\n\t</sql>\n\n\t<select id=\"findDead\" parameterType=\"java.util.HashMap\" resultType=\"java.lang.Integer\" >\n\t\tSELECT t.id\n\t\tFROM xxl_job_registry AS t\n\t\tWHERE t.update_time <![CDATA[ < ]]> DATE_ADD(#{nowTime},INTERVAL -#{timeout} SECOND)\n\t</select>\n\t\n\t<delete id=\"removeDead\" parameterType=\"java.lang.Integer\" >\n\t\tDELETE FROM xxl_job_registry\n\t\tWHERE id in\n\t\t<foreach collection=\"ids\" item=\"item\" open=\"(\" close=\")\" separator=\",\" >\n\t\t\t#{item}\n\t\t</foreach>\n\t</delete>\n\n\t<select id=\"findAll\" parameterType=\"java.util.HashMap\" resultMap=\"XxlJobRegistry\">\n\t\tSELECT <include refid=\"Base_Column_List\" />\n\t\tFROM xxl_job_registry AS t\n\t\tWHERE t.update_time <![CDATA[ > ]]> DATE_ADD(#{nowTime},INTERVAL -#{timeout} SECOND)\n\t</select>\n\n    <update id=\"registryUpdate\" >\n        UPDATE xxl_job_registry\n        SET `update_time` = #{updateTime}\n        WHERE `registry_group` = #{registryGroup}\n          AND `registry_key` = #{registryKey}\n          AND `registry_value` = #{registryValue}\n    </update>\n\n    <insert id=\"registrySave\" >\n        INSERT INTO xxl_job_registry( `registry_group` , `registry_key` , `registry_value`, `update_time`)\n        VALUES( #{registryGroup}  , #{registryKey} , #{registryValue}, #{updateTime})\n    </insert>\n\n\t<delete id=\"registryDelete\" >\n\t\tDELETE FROM xxl_job_registry\n\t\tWHERE registry_group = #{registryGroup}\n\t\t\tAND registry_key = #{registryKey}\n\t\t\tAND registry_value = #{registryValue}\n\t</delete>\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/mybatis-mapper/XxlJobUserMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n\t\"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.xxl.job.admin.dao.XxlJobUserDao\">\n\n\t<resultMap id=\"XxlJobUser\" type=\"com.xxl.job.admin.core.model.XxlJobUser\" >\n\t\t<result column=\"id\" property=\"id\" />\n\t\t<result column=\"username\" property=\"username\" />\n\t    <result column=\"password\" property=\"password\" />\n\t    <result column=\"role\" property=\"role\" />\n\t    <result column=\"permission\" property=\"permission\" />\n\t</resultMap>\n\n\t<sql id=\"Base_Column_List\">\n\t\tt.id,\n\t\tt.username,\n\t\tt.password,\n\t\tt.role,\n\t\tt.permission\n\t</sql>\n\n\t<select id=\"pageList\" parameterType=\"java.util.HashMap\" resultMap=\"XxlJobUser\">\n\t\tSELECT <include refid=\"Base_Column_List\" />\n\t\tFROM xxl_job_user AS t\n\t\t<trim prefix=\"WHERE\" prefixOverrides=\"AND | OR\" >\n\t\t\t<if test=\"username != null and username != ''\">\n\t\t\t\tAND t.username like CONCAT(CONCAT('%', #{username}), '%')\n\t\t\t</if>\n\t\t\t<if test=\"role gt -1\">\n\t\t\t\tAND t.role = #{role}\n\t\t\t</if>\n\t\t</trim>\n\t\tORDER BY username ASC\n\t\tLIMIT #{offset}, #{pagesize}\n\t</select>\n\n\t<select id=\"pageListCount\" parameterType=\"java.util.HashMap\" resultType=\"int\">\n\t\tSELECT count(1)\n\t\tFROM xxl_job_user AS t\n\t\t<trim prefix=\"WHERE\" prefixOverrides=\"AND | OR\" >\n\t\t\t<if test=\"username != null and username != ''\">\n\t\t\t\tAND t.username like CONCAT(CONCAT('%', #{username}), '%')\n\t\t\t</if>\n\t\t\t<if test=\"role gt -1\">\n\t\t\t\tAND t.role = #{role}\n\t\t\t</if>\n\t\t</trim>\n\t</select>\n\n\t<select id=\"loadByUserName\" parameterType=\"java.util.HashMap\" resultMap=\"XxlJobUser\">\n\t\tSELECT <include refid=\"Base_Column_List\" />\n\t\tFROM xxl_job_user AS t\n\t\tWHERE t.username = #{username}\n\t</select>\n\n\t<insert id=\"save\" parameterType=\"com.xxl.job.admin.core.model.XxlJobUser\" useGeneratedKeys=\"true\" keyProperty=\"id\" >\n\t\tINSERT INTO xxl_job_user (\n\t\t\tusername,\n\t\t\tpassword,\n\t\t\trole,\n\t\t\tpermission\n\t\t) VALUES (\n\t\t\t#{username},\n\t\t\t#{password},\n\t\t\t#{role},\n\t\t\t#{permission}\n\t\t);\n\t</insert>\n\n\t<update id=\"update\" parameterType=\"com.xxl.job.admin.core.model.XxlJobUser\" >\n\t\tUPDATE xxl_job_user\n\t\tSET\n\t\t\t<if test=\"password != null and password != ''\">\n\t\t\t\tpassword = #{password},\n\t\t\t</if>\n\t\t\trole = #{role},\n\t\t\tpermission = #{permission}\n\t\tWHERE id = #{id}\n\t</update>\n\n\t<delete id=\"delete\" parameterType=\"java.util.HashMap\">\n\t\tDELETE\n\t\tFROM xxl_job_user\n\t\tWHERE id = #{id}\n\t</delete>\n\n</mapper>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/adminlte/bower_components/PACE/themes/blue/pace-theme-flash.css",
    "content": "/* This is a compiled file, you should be editing the file in the templates directory */\n.pace {\n  -webkit-pointer-events: none;\n  pointer-events: none;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n}\n\n.pace-inactive {\n  display: none;\n}\n\n.pace .pace-progress {\n  background: #2299dd;\n  position: fixed;\n  z-index: 2000;\n  top: 0;\n  right: 100%;\n  width: 100%;\n  height: 2px;\n}\n\n.pace .pace-progress-inner {\n  display: block;\n  position: absolute;\n  right: 0px;\n  width: 100px;\n  height: 100%;\n  box-shadow: 0 0 10px #2299dd, 0 0 5px #2299dd;\n  opacity: 1.0;\n  -webkit-transform: rotate(3deg) translate(0px, -4px);\n  -moz-transform: rotate(3deg) translate(0px, -4px);\n  -ms-transform: rotate(3deg) translate(0px, -4px);\n  -o-transform: rotate(3deg) translate(0px, -4px);\n  transform: rotate(3deg) translate(0px, -4px);\n}\n\n.pace .pace-activity {\n  display: block;\n  position: fixed;\n  z-index: 2000;\n  top: 15px;\n  right: 15px;\n  width: 14px;\n  height: 14px;\n  border: solid 2px transparent;\n  border-top-color: #2299dd;\n  border-left-color: #2299dd;\n  border-radius: 10px;\n  -webkit-animation: pace-spinner 400ms linear infinite;\n  -moz-animation: pace-spinner 400ms linear infinite;\n  -ms-animation: pace-spinner 400ms linear infinite;\n  -o-animation: pace-spinner 400ms linear infinite;\n  animation: pace-spinner 400ms linear infinite;\n}\n\n@-webkit-keyframes pace-spinner {\n  0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); }\n  100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); }\n}\n@-moz-keyframes pace-spinner {\n  0% { -moz-transform: rotate(0deg); transform: rotate(0deg); }\n  100% { -moz-transform: rotate(360deg); transform: rotate(360deg); }\n}\n@-o-keyframes pace-spinner {\n  0% { -o-transform: rotate(0deg); transform: rotate(0deg); }\n  100% { -o-transform: rotate(360deg); transform: rotate(360deg); }\n}\n@-ms-keyframes pace-spinner {\n  0% { -ms-transform: rotate(0deg); transform: rotate(0deg); }\n  100% { -ms-transform: rotate(360deg); transform: rotate(360deg); }\n}\n@keyframes pace-spinner {\n  0% { transform: rotate(0deg); transform: rotate(0deg); }\n  100% { transform: rotate(360deg); transform: rotate(360deg); }\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.css",
    "content": ".daterangepicker {\n  position: absolute;\n  color: inherit;\n  background-color: #fff;\n  border-radius: 4px;\n  width: 278px;\n  padding: 4px;\n  margin-top: 1px;\n  top: 100px;\n  left: 20px;\n  /* Calendars */ }\n  .daterangepicker:before, .daterangepicker:after {\n    position: absolute;\n    display: inline-block;\n    border-bottom-color: rgba(0, 0, 0, 0.2);\n    content: ''; }\n  .daterangepicker:before {\n    top: -7px;\n    border-right: 7px solid transparent;\n    border-left: 7px solid transparent;\n    border-bottom: 7px solid #ccc; }\n  .daterangepicker:after {\n    top: -6px;\n    border-right: 6px solid transparent;\n    border-bottom: 6px solid #fff;\n    border-left: 6px solid transparent; }\n  .daterangepicker.opensleft:before {\n    right: 9px; }\n  .daterangepicker.opensleft:after {\n    right: 10px; }\n  .daterangepicker.openscenter:before {\n    left: 0;\n    right: 0;\n    width: 0;\n    margin-left: auto;\n    margin-right: auto; }\n  .daterangepicker.openscenter:after {\n    left: 0;\n    right: 0;\n    width: 0;\n    margin-left: auto;\n    margin-right: auto; }\n  .daterangepicker.opensright:before {\n    left: 9px; }\n  .daterangepicker.opensright:after {\n    left: 10px; }\n  .daterangepicker.dropup {\n    margin-top: -5px; }\n    .daterangepicker.dropup:before {\n      top: initial;\n      bottom: -7px;\n      border-bottom: initial;\n      border-top: 7px solid #ccc; }\n    .daterangepicker.dropup:after {\n      top: initial;\n      bottom: -6px;\n      border-bottom: initial;\n      border-top: 6px solid #fff; }\n  .daterangepicker.dropdown-menu {\n    max-width: none;\n    z-index: 3001; }\n  .daterangepicker.single .ranges, .daterangepicker.single .calendar {\n    float: none; }\n  .daterangepicker.show-calendar .calendar {\n    display: block; }\n  .daterangepicker .calendar {\n    display: none;\n    max-width: 270px;\n    margin: 4px; }\n    .daterangepicker .calendar.single .calendar-table {\n      border: none; }\n    .daterangepicker .calendar th, .daterangepicker .calendar td {\n      white-space: nowrap;\n      text-align: center;\n      min-width: 32px; }\n  .daterangepicker .calendar-table {\n    border: 1px solid #fff;\n    padding: 4px;\n    border-radius: 4px;\n    background-color: #fff; }\n  .daterangepicker table {\n    width: 100%;\n    margin: 0; }\n  .daterangepicker td, .daterangepicker th {\n    text-align: center;\n    width: 20px;\n    height: 20px;\n    border-radius: 4px;\n    border: 1px solid transparent;\n    white-space: nowrap;\n    cursor: pointer; }\n    .daterangepicker td.available:hover, .daterangepicker th.available:hover {\n      background-color: #eee;\n      border-color: transparent;\n      color: inherit; }\n    .daterangepicker td.week, .daterangepicker th.week {\n      font-size: 80%;\n      color: #ccc; }\n  .daterangepicker td.off, .daterangepicker td.off.in-range, .daterangepicker td.off.start-date, .daterangepicker td.off.end-date {\n    background-color: #fff;\n    border-color: transparent;\n    color: #999; }\n  .daterangepicker td.in-range {\n    background-color: #ebf4f8;\n    border-color: transparent;\n    color: #000;\n    border-radius: 0; }\n  .daterangepicker td.start-date {\n    border-radius: 4px 0 0 4px; }\n  .daterangepicker td.end-date {\n    border-radius: 0 4px 4px 0; }\n  .daterangepicker td.start-date.end-date {\n    border-radius: 4px; }\n  .daterangepicker td.active, .daterangepicker td.active:hover {\n    background-color: #357ebd;\n    border-color: transparent;\n    color: #fff; }\n  .daterangepicker th.month {\n    width: auto; }\n  .daterangepicker td.disabled, .daterangepicker option.disabled {\n    color: #999;\n    cursor: not-allowed;\n    text-decoration: line-through; }\n  .daterangepicker select.monthselect, .daterangepicker select.yearselect {\n    font-size: 12px;\n    padding: 1px;\n    height: auto;\n    margin: 0;\n    cursor: default; }\n  .daterangepicker select.monthselect {\n    margin-right: 2%;\n    width: 56%; }\n  .daterangepicker select.yearselect {\n    width: 40%; }\n  .daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect {\n    width: 50px;\n    margin-bottom: 0; }\n  .daterangepicker .input-mini {\n    border: 1px solid #ccc;\n    border-radius: 4px;\n    color: #555;\n    height: 30px;\n    line-height: 30px;\n    display: block;\n    vertical-align: middle;\n    margin: 0 0 5px 0;\n    padding: 0 6px 0 28px;\n    width: 100%; }\n    .daterangepicker .input-mini.active {\n      border: 1px solid #08c;\n      border-radius: 4px; }\n  .daterangepicker .daterangepicker_input {\n    position: relative; }\n    .daterangepicker .daterangepicker_input i {\n      position: absolute;\n      left: 8px;\n      top: 8px; }\n  .daterangepicker.rtl .input-mini {\n    padding-right: 28px;\n    padding-left: 6px; }\n  .daterangepicker.rtl .daterangepicker_input i {\n    left: auto;\n    right: 8px; }\n  .daterangepicker .calendar-time {\n    text-align: center;\n    margin: 5px auto;\n    line-height: 30px;\n    position: relative;\n    padding-left: 28px; }\n    .daterangepicker .calendar-time select.disabled {\n      color: #ccc;\n      cursor: not-allowed; }\n\n.ranges {\n  font-size: 11px;\n  float: none;\n  margin: 4px;\n  text-align: left; }\n  .ranges ul {\n    list-style: none;\n    margin: 0 auto;\n    padding: 0;\n    width: 100%; }\n  .ranges li {\n    font-size: 13px;\n    background-color: #f5f5f5;\n    border: 1px solid #f5f5f5;\n    border-radius: 4px;\n    color: #08c;\n    padding: 3px 12px;\n    margin-bottom: 8px;\n    cursor: pointer; }\n    .ranges li:hover {\n      background-color: #08c;\n      border: 1px solid #08c;\n      color: #fff; }\n    .ranges li.active {\n      background-color: #08c;\n      border: 1px solid #08c;\n      color: #fff; }\n\n/*  Larger Screen Styling */\n@media (min-width: 564px) {\n  .daterangepicker {\n    width: auto; }\n    .daterangepicker .ranges ul {\n      width: 160px; }\n    .daterangepicker.single .ranges ul {\n      width: 100%; }\n    .daterangepicker.single .calendar.left {\n      clear: none; }\n    .daterangepicker.single.ltr .ranges, .daterangepicker.single.ltr .calendar {\n      float: left; }\n    .daterangepicker.single.rtl .ranges, .daterangepicker.single.rtl .calendar {\n      float: right; }\n    .daterangepicker.ltr {\n      direction: ltr;\n      text-align: left; }\n      .daterangepicker.ltr .calendar.left {\n        clear: left;\n        margin-right: 0; }\n        .daterangepicker.ltr .calendar.left .calendar-table {\n          border-right: none;\n          border-top-right-radius: 0;\n          border-bottom-right-radius: 0; }\n      .daterangepicker.ltr .calendar.right {\n        margin-left: 0; }\n        .daterangepicker.ltr .calendar.right .calendar-table {\n          border-left: none;\n          border-top-left-radius: 0;\n          border-bottom-left-radius: 0; }\n      .daterangepicker.ltr .left .daterangepicker_input {\n        padding-right: 12px; }\n      .daterangepicker.ltr .calendar.left .calendar-table {\n        padding-right: 12px; }\n      .daterangepicker.ltr .ranges, .daterangepicker.ltr .calendar {\n        float: left; }\n    .daterangepicker.rtl {\n      direction: rtl;\n      text-align: right; }\n      .daterangepicker.rtl .calendar.left {\n        clear: right;\n        margin-left: 0; }\n        .daterangepicker.rtl .calendar.left .calendar-table {\n          border-left: none;\n          border-top-left-radius: 0;\n          border-bottom-left-radius: 0; }\n      .daterangepicker.rtl .calendar.right {\n        margin-right: 0; }\n        .daterangepicker.rtl .calendar.right .calendar-table {\n          border-right: none;\n          border-top-right-radius: 0;\n          border-bottom-right-radius: 0; }\n      .daterangepicker.rtl .left .daterangepicker_input {\n        padding-left: 12px; }\n      .daterangepicker.rtl .calendar.left .calendar-table {\n        padding-left: 12px; }\n      .daterangepicker.rtl .ranges, .daterangepicker.rtl .calendar {\n        text-align: right;\n        float: right; } }\n@media (min-width: 730px) {\n  .daterangepicker .ranges {\n    width: auto; }\n  .daterangepicker.ltr .ranges {\n    float: left; }\n  .daterangepicker.rtl .ranges {\n    float: right; }\n  .daterangepicker .calendar.left {\n    clear: none !important; } }\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.js",
    "content": "/**\n* @version: 2.1.27\n* @author: Dan Grossman http://www.dangrossman.info/\n* @copyright: Copyright (c) 2012-2017 Dan Grossman. All rights reserved.\n* @license: Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php\n* @website: http://www.daterangepicker.com/\n*/\n// Follow the UMD template https://github.com/umdjs/umd/blob/master/templates/returnExportsGlobal.js\n(function (root, factory) {\n    if (typeof define === 'function' && define.amd) {\n        // AMD. Make globaly available as well\n        define(['moment', 'jquery'], function (moment, jquery) {\n            if (!jquery.fn) jquery.fn = {}; // webpack server rendering\n            return factory(moment, jquery);\n        });\n    } else if (typeof module === 'object' && module.exports) {\n        // Node / Browserify\n        //isomorphic issue\n        var jQuery = (typeof window != 'undefined') ? window.jQuery : undefined;\n        if (!jQuery) {\n            jQuery = require('jquery');\n            if (!jQuery.fn) jQuery.fn = {};\n        }\n        var moment = (typeof window != 'undefined' && typeof window.moment != 'undefined') ? window.moment : require('moment');\n        module.exports = factory(moment, jQuery);\n    } else {\n        // Browser globals\n        root.daterangepicker = factory(root.moment, root.jQuery);\n    }\n}(this, function(moment, $) {\n    var DateRangePicker = function(element, options, cb) {\n\n        //default settings for options\n        this.parentEl = 'body';\n        this.element = $(element);\n        this.startDate = moment().startOf('day');\n        this.endDate = moment().endOf('day');\n        this.minDate = false;\n        this.maxDate = false;\n        this.dateLimit = false;\n        this.autoApply = false;\n        this.singleDatePicker = false;\n        this.showDropdowns = false;\n        this.showWeekNumbers = false;\n        this.showISOWeekNumbers = false;\n        this.showCustomRangeLabel = true;\n        this.timePicker = false;\n        this.timePicker24Hour = false;\n        this.timePickerIncrement = 1;\n        this.timePickerSeconds = false;\n        this.linkedCalendars = true;\n        this.autoUpdateInput = true;\n        this.alwaysShowCalendars = false;\n        this.ranges = {};\n\n        this.opens = 'right';\n        if (this.element.hasClass('pull-right'))\n            this.opens = 'left';\n\n        this.drops = 'down';\n        if (this.element.hasClass('dropup'))\n            this.drops = 'up';\n\n        this.buttonClasses = 'btn btn-sm';\n        this.applyClass = 'btn-success';\n        this.cancelClass = 'btn-default';\n\n        this.locale = {\n            direction: 'ltr',\n            format: moment.localeData().longDateFormat('L'),\n            separator: ' - ',\n            applyLabel: 'Apply',\n            cancelLabel: 'Cancel',\n            weekLabel: 'W',\n            customRangeLabel: 'Custom Range',\n            daysOfWeek: moment.weekdaysMin(),\n            monthNames: moment.monthsShort(),\n            firstDay: moment.localeData().firstDayOfWeek()\n        };\n\n        this.callback = function() { };\n\n        //some state information\n        this.isShowing = false;\n        this.leftCalendar = {};\n        this.rightCalendar = {};\n\n        //custom options from user\n        if (typeof options !== 'object' || options === null)\n            options = {};\n\n        //allow setting options with data attributes\n        //data-api options will be overwritten with custom javascript options\n        options = $.extend(this.element.data(), options);\n\n        //html template for the picker UI\n        if (typeof options.template !== 'string' && !(options.template instanceof $))\n            options.template = '<div class=\"daterangepicker dropdown-menu\">' +\n                '<div class=\"calendar left\">' +\n                    '<div class=\"daterangepicker_input\">' +\n                      '<input class=\"input-mini form-control\" type=\"text\" name=\"daterangepicker_start\" value=\"\" />' +\n                      '<i class=\"fa fa-calendar glyphicon glyphicon-calendar\"></i>' +\n                      '<div class=\"calendar-time\">' +\n                        '<div></div>' +\n                        '<i class=\"fa fa-clock-o glyphicon glyphicon-time\"></i>' +\n                      '</div>' +\n                    '</div>' +\n                    '<div class=\"calendar-table\"></div>' +\n                '</div>' +\n                '<div class=\"calendar right\">' +\n                    '<div class=\"daterangepicker_input\">' +\n                      '<input class=\"input-mini form-control\" type=\"text\" name=\"daterangepicker_end\" value=\"\" />' +\n                      '<i class=\"fa fa-calendar glyphicon glyphicon-calendar\"></i>' +\n                      '<div class=\"calendar-time\">' +\n                        '<div></div>' +\n                        '<i class=\"fa fa-clock-o glyphicon glyphicon-time\"></i>' +\n                      '</div>' +\n                    '</div>' +\n                    '<div class=\"calendar-table\"></div>' +\n                '</div>' +\n                '<div class=\"ranges\">' +\n                    '<div class=\"range_inputs\">' +\n                        '<button class=\"applyBtn\" disabled=\"disabled\" type=\"button\"></button> ' +\n                        '<button class=\"cancelBtn\" type=\"button\"></button>' +\n                    '</div>' +\n                '</div>' +\n            '</div>';\n\n        this.parentEl = (options.parentEl && $(options.parentEl).length) ? $(options.parentEl) : $(this.parentEl);\n        this.container = $(options.template).appendTo(this.parentEl);\n\n        //\n        // handle all the possible options overriding defaults\n        //\n\n        if (typeof options.locale === 'object') {\n\n            if (typeof options.locale.direction === 'string')\n                this.locale.direction = options.locale.direction;\n\n            if (typeof options.locale.format === 'string')\n                this.locale.format = options.locale.format;\n\n            if (typeof options.locale.separator === 'string')\n                this.locale.separator = options.locale.separator;\n\n            if (typeof options.locale.daysOfWeek === 'object')\n                this.locale.daysOfWeek = options.locale.daysOfWeek.slice();\n\n            if (typeof options.locale.monthNames === 'object')\n              this.locale.monthNames = options.locale.monthNames.slice();\n\n            if (typeof options.locale.firstDay === 'number')\n              this.locale.firstDay = options.locale.firstDay;\n\n            if (typeof options.locale.applyLabel === 'string')\n              this.locale.applyLabel = options.locale.applyLabel;\n\n            if (typeof options.locale.cancelLabel === 'string')\n              this.locale.cancelLabel = options.locale.cancelLabel;\n\n            if (typeof options.locale.weekLabel === 'string')\n              this.locale.weekLabel = options.locale.weekLabel;\n\n            if (typeof options.locale.customRangeLabel === 'string'){\n                //Support unicode chars in the custom range name.\n                var elem = document.createElement('textarea');\n                elem.innerHTML = options.locale.customRangeLabel;\n                var rangeHtml = elem.value;\n                this.locale.customRangeLabel = rangeHtml;\n            }\n        }\n        this.container.addClass(this.locale.direction);\n\n        if (typeof options.startDate === 'string')\n            this.startDate = moment(options.startDate, this.locale.format);\n\n        if (typeof options.endDate === 'string')\n            this.endDate = moment(options.endDate, this.locale.format);\n\n        if (typeof options.minDate === 'string')\n            this.minDate = moment(options.minDate, this.locale.format);\n\n        if (typeof options.maxDate === 'string')\n            this.maxDate = moment(options.maxDate, this.locale.format);\n\n        if (typeof options.startDate === 'object')\n            this.startDate = moment(options.startDate);\n\n        if (typeof options.endDate === 'object')\n            this.endDate = moment(options.endDate);\n\n        if (typeof options.minDate === 'object')\n            this.minDate = moment(options.minDate);\n\n        if (typeof options.maxDate === 'object')\n            this.maxDate = moment(options.maxDate);\n\n        // sanity check for bad options\n        if (this.minDate && this.startDate.isBefore(this.minDate))\n            this.startDate = this.minDate.clone();\n\n        // sanity check for bad options\n        if (this.maxDate && this.endDate.isAfter(this.maxDate))\n            this.endDate = this.maxDate.clone();\n\n        if (typeof options.applyClass === 'string')\n            this.applyClass = options.applyClass;\n\n        if (typeof options.cancelClass === 'string')\n            this.cancelClass = options.cancelClass;\n\n        if (typeof options.dateLimit === 'object')\n            this.dateLimit = options.dateLimit;\n\n        if (typeof options.opens === 'string')\n            this.opens = options.opens;\n\n        if (typeof options.drops === 'string')\n            this.drops = options.drops;\n\n        if (typeof options.showWeekNumbers === 'boolean')\n            this.showWeekNumbers = options.showWeekNumbers;\n\n        if (typeof options.showISOWeekNumbers === 'boolean')\n            this.showISOWeekNumbers = options.showISOWeekNumbers;\n\n        if (typeof options.buttonClasses === 'string')\n            this.buttonClasses = options.buttonClasses;\n\n        if (typeof options.buttonClasses === 'object')\n            this.buttonClasses = options.buttonClasses.join(' ');\n\n        if (typeof options.showDropdowns === 'boolean')\n            this.showDropdowns = options.showDropdowns;\n\n        if (typeof options.showCustomRangeLabel === 'boolean')\n            this.showCustomRangeLabel = options.showCustomRangeLabel;\n\n        if (typeof options.singleDatePicker === 'boolean') {\n            this.singleDatePicker = options.singleDatePicker;\n            if (this.singleDatePicker)\n                this.endDate = this.startDate.clone();\n        }\n\n        if (typeof options.timePicker === 'boolean')\n            this.timePicker = options.timePicker;\n\n        if (typeof options.timePickerSeconds === 'boolean')\n            this.timePickerSeconds = options.timePickerSeconds;\n\n        if (typeof options.timePickerIncrement === 'number')\n            this.timePickerIncrement = options.timePickerIncrement;\n\n        if (typeof options.timePicker24Hour === 'boolean')\n            this.timePicker24Hour = options.timePicker24Hour;\n\n        if (typeof options.autoApply === 'boolean')\n            this.autoApply = options.autoApply;\n\n        if (typeof options.autoUpdateInput === 'boolean')\n            this.autoUpdateInput = options.autoUpdateInput;\n\n        if (typeof options.linkedCalendars === 'boolean')\n            this.linkedCalendars = options.linkedCalendars;\n\n        if (typeof options.isInvalidDate === 'function')\n            this.isInvalidDate = options.isInvalidDate;\n\n        if (typeof options.isCustomDate === 'function')\n            this.isCustomDate = options.isCustomDate;\n\n        if (typeof options.alwaysShowCalendars === 'boolean')\n            this.alwaysShowCalendars = options.alwaysShowCalendars;\n\n        // update day names order to firstDay\n        if (this.locale.firstDay != 0) {\n            var iterator = this.locale.firstDay;\n            while (iterator > 0) {\n                this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift());\n                iterator--;\n            }\n        }\n\n        var start, end, range;\n\n        //if no start/end dates set, check if an input element contains initial values\n        if (typeof options.startDate === 'undefined' && typeof options.endDate === 'undefined') {\n            if ($(this.element).is('input[type=text]')) {\n                var val = $(this.element).val(),\n                    split = val.split(this.locale.separator);\n\n                start = end = null;\n\n                if (split.length == 2) {\n                    start = moment(split[0], this.locale.format);\n                    end = moment(split[1], this.locale.format);\n                } else if (this.singleDatePicker && val !== \"\") {\n                    start = moment(val, this.locale.format);\n                    end = moment(val, this.locale.format);\n                }\n                if (start !== null && end !== null) {\n                    this.setStartDate(start);\n                    this.setEndDate(end);\n                }\n            }\n        }\n\n        if (typeof options.ranges === 'object') {\n            for (range in options.ranges) {\n\n                if (typeof options.ranges[range][0] === 'string')\n                    start = moment(options.ranges[range][0], this.locale.format);\n                else\n                    start = moment(options.ranges[range][0]);\n\n                if (typeof options.ranges[range][1] === 'string')\n                    end = moment(options.ranges[range][1], this.locale.format);\n                else\n                    end = moment(options.ranges[range][1]);\n\n                // If the start or end date exceed those allowed by the minDate or dateLimit\n                // options, shorten the range to the allowable period.\n                if (this.minDate && start.isBefore(this.minDate))\n                    start = this.minDate.clone();\n\n                var maxDate = this.maxDate;\n                if (this.dateLimit && maxDate && start.clone().add(this.dateLimit).isAfter(maxDate))\n                    maxDate = start.clone().add(this.dateLimit);\n                if (maxDate && end.isAfter(maxDate))\n                    end = maxDate.clone();\n\n                // If the end of the range is before the minimum or the start of the range is\n                // after the maximum, don't display this range option at all.\n                if ((this.minDate && end.isBefore(this.minDate, this.timepicker ? 'minute' : 'day')) \n                  || (maxDate && start.isAfter(maxDate, this.timepicker ? 'minute' : 'day')))\n                    continue;\n\n                //Support unicode chars in the range names.\n                var elem = document.createElement('textarea');\n                elem.innerHTML = range;\n                var rangeHtml = elem.value;\n\n                this.ranges[rangeHtml] = [start, end];\n            }\n\n            var list = '<ul>';\n            for (range in this.ranges) {\n                list += '<li data-range-key=\"' + range + '\">' + range + '</li>';\n            }\n            if (this.showCustomRangeLabel) {\n                list += '<li data-range-key=\"' + this.locale.customRangeLabel + '\">' + this.locale.customRangeLabel + '</li>';\n            }\n            list += '</ul>';\n            this.container.find('.ranges').prepend(list);\n        }\n\n        if (typeof cb === 'function') {\n            this.callback = cb;\n        }\n\n        if (!this.timePicker) {\n            this.startDate = this.startDate.startOf('day');\n            this.endDate = this.endDate.endOf('day');\n            this.container.find('.calendar-time').hide();\n        }\n\n        //can't be used together for now\n        if (this.timePicker && this.autoApply)\n            this.autoApply = false;\n\n        if (this.autoApply && typeof options.ranges !== 'object') {\n            this.container.find('.ranges').hide();\n        } else if (this.autoApply) {\n            this.container.find('.applyBtn, .cancelBtn').addClass('hide');\n        }\n\n        if (this.singleDatePicker) {\n            this.container.addClass('single');\n            this.container.find('.calendar.left').addClass('single');\n            this.container.find('.calendar.left').show();\n            this.container.find('.calendar.right').hide();\n            this.container.find('.daterangepicker_input input, .daterangepicker_input > i').hide();\n            if (this.timePicker) {\n                this.container.find('.ranges ul').hide();\n            } else {\n                this.container.find('.ranges').hide();\n            }\n        }\n\n        if ((typeof options.ranges === 'undefined' && !this.singleDatePicker) || this.alwaysShowCalendars) {\n            this.container.addClass('show-calendar');\n        }\n\n        this.container.addClass('opens' + this.opens);\n\n        //swap the position of the predefined ranges if opens right\n        if (typeof options.ranges !== 'undefined' && this.opens == 'right') {\n            this.container.find('.ranges').prependTo( this.container.find('.calendar.left').parent() );\n        }\n\n        //apply CSS classes and labels to buttons\n        this.container.find('.applyBtn, .cancelBtn').addClass(this.buttonClasses);\n        if (this.applyClass.length)\n            this.container.find('.applyBtn').addClass(this.applyClass);\n        if (this.cancelClass.length)\n            this.container.find('.cancelBtn').addClass(this.cancelClass);\n        this.container.find('.applyBtn').html(this.locale.applyLabel);\n        this.container.find('.cancelBtn').html(this.locale.cancelLabel);\n\n        //\n        // event listeners\n        //\n\n        this.container.find('.calendar')\n            .on('click.daterangepicker', '.prev', $.proxy(this.clickPrev, this))\n            .on('click.daterangepicker', '.next', $.proxy(this.clickNext, this))\n            .on('mousedown.daterangepicker', 'td.available', $.proxy(this.clickDate, this))\n            .on('mouseenter.daterangepicker', 'td.available', $.proxy(this.hoverDate, this))\n            .on('mouseleave.daterangepicker', 'td.available', $.proxy(this.updateFormInputs, this))\n            .on('change.daterangepicker', 'select.yearselect', $.proxy(this.monthOrYearChanged, this))\n            .on('change.daterangepicker', 'select.monthselect', $.proxy(this.monthOrYearChanged, this))\n            .on('change.daterangepicker', 'select.hourselect,select.minuteselect,select.secondselect,select.ampmselect', $.proxy(this.timeChanged, this))\n            .on('click.daterangepicker', '.daterangepicker_input input', $.proxy(this.showCalendars, this))\n            .on('focus.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsFocused, this))\n            .on('blur.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsBlurred, this))\n            .on('change.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsChanged, this))\n            .on('keydown.daterangepicker', '.daterangepicker_input input', $.proxy(this.formInputsKeydown, this));\n\n        this.container.find('.ranges')\n            .on('click.daterangepicker', 'button.applyBtn', $.proxy(this.clickApply, this))\n            .on('click.daterangepicker', 'button.cancelBtn', $.proxy(this.clickCancel, this))\n            .on('click.daterangepicker', 'li', $.proxy(this.clickRange, this))\n            .on('mouseenter.daterangepicker', 'li', $.proxy(this.hoverRange, this))\n            .on('mouseleave.daterangepicker', 'li', $.proxy(this.updateFormInputs, this));\n\n        if (this.element.is('input') || this.element.is('button')) {\n            this.element.on({\n                'click.daterangepicker': $.proxy(this.show, this),\n                'focus.daterangepicker': $.proxy(this.show, this),\n                'keyup.daterangepicker': $.proxy(this.elementChanged, this),\n                'keydown.daterangepicker': $.proxy(this.keydown, this) //IE 11 compatibility\n            });\n        } else {\n            this.element.on('click.daterangepicker', $.proxy(this.toggle, this));\n            this.element.on('keydown.daterangepicker', $.proxy(this.toggle, this));\n        }\n\n        //\n        // if attached to a text input, set the initial value\n        //\n\n        if (this.element.is('input') && !this.singleDatePicker && this.autoUpdateInput) {\n            this.element.val(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format));\n            this.element.trigger('change');\n        } else if (this.element.is('input') && this.autoUpdateInput) {\n            this.element.val(this.startDate.format(this.locale.format));\n            this.element.trigger('change');\n        }\n\n    };\n\n    DateRangePicker.prototype = {\n\n        constructor: DateRangePicker,\n\n        setStartDate: function(startDate) {\n            if (typeof startDate === 'string')\n                this.startDate = moment(startDate, this.locale.format);\n\n            if (typeof startDate === 'object')\n                this.startDate = moment(startDate);\n\n            if (!this.timePicker)\n                this.startDate = this.startDate.startOf('day');\n\n            if (this.timePicker && this.timePickerIncrement)\n                this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement);\n\n            if (this.minDate && this.startDate.isBefore(this.minDate)) {\n                this.startDate = this.minDate.clone();\n                if (this.timePicker && this.timePickerIncrement)\n                    this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement);\n            }\n\n            if (this.maxDate && this.startDate.isAfter(this.maxDate)) {\n                this.startDate = this.maxDate.clone();\n                if (this.timePicker && this.timePickerIncrement)\n                    this.startDate.minute(Math.floor(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement);\n            }\n\n            if (!this.isShowing)\n                this.updateElement();\n\n            this.updateMonthsInView();\n        },\n\n        setEndDate: function(endDate) {\n            if (typeof endDate === 'string')\n                this.endDate = moment(endDate, this.locale.format);\n\n            if (typeof endDate === 'object')\n                this.endDate = moment(endDate);\n\n            if (!this.timePicker)\n                this.endDate = this.endDate.add(1,'d').startOf('day').subtract(1,'second');\n\n            if (this.timePicker && this.timePickerIncrement)\n                this.endDate.minute(Math.round(this.endDate.minute() / this.timePickerIncrement) * this.timePickerIncrement);\n\n            if (this.endDate.isBefore(this.startDate))\n                this.endDate = this.startDate.clone();\n\n            if (this.maxDate && this.endDate.isAfter(this.maxDate))\n                this.endDate = this.maxDate.clone();\n\n            if (this.dateLimit && this.startDate.clone().add(this.dateLimit).isBefore(this.endDate))\n                this.endDate = this.startDate.clone().add(this.dateLimit);\n\n            this.previousRightTime = this.endDate.clone();\n\n            if (!this.isShowing)\n                this.updateElement();\n\n            this.updateMonthsInView();\n        },\n\n        isInvalidDate: function() {\n            return false;\n        },\n\n        isCustomDate: function() {\n            return false;\n        },\n\n        updateView: function() {\n            if (this.timePicker) {\n                this.renderTimePicker('left');\n                this.renderTimePicker('right');\n                if (!this.endDate) {\n                    this.container.find('.right .calendar-time select').attr('disabled', 'disabled').addClass('disabled');\n                } else {\n                    this.container.find('.right .calendar-time select').removeAttr('disabled').removeClass('disabled');\n                }\n            }\n            if (this.endDate) {\n                this.container.find('input[name=\"daterangepicker_end\"]').removeClass('active');\n                this.container.find('input[name=\"daterangepicker_start\"]').addClass('active');\n            } else {\n                this.container.find('input[name=\"daterangepicker_end\"]').addClass('active');\n                this.container.find('input[name=\"daterangepicker_start\"]').removeClass('active');\n            }\n            this.updateMonthsInView();\n            this.updateCalendars();\n            this.updateFormInputs();\n        },\n\n        updateMonthsInView: function() {\n            if (this.endDate) {\n\n                //if both dates are visible already, do nothing\n                if (!this.singleDatePicker && this.leftCalendar.month && this.rightCalendar.month &&\n                    (this.startDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.startDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM'))\n                    &&\n                    (this.endDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.endDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM'))\n                    ) {\n                    return;\n                }\n\n                this.leftCalendar.month = this.startDate.clone().date(2);\n                if (!this.linkedCalendars && (this.endDate.month() != this.startDate.month() || this.endDate.year() != this.startDate.year())) {\n                    this.rightCalendar.month = this.endDate.clone().date(2);\n                } else {\n                    this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month');\n                }\n\n            } else {\n                if (this.leftCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM') && this.rightCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM')) {\n                    this.leftCalendar.month = this.startDate.clone().date(2);\n                    this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month');\n                }\n            }\n            if (this.maxDate && this.linkedCalendars && !this.singleDatePicker && this.rightCalendar.month > this.maxDate) {\n              this.rightCalendar.month = this.maxDate.clone().date(2);\n              this.leftCalendar.month = this.maxDate.clone().date(2).subtract(1, 'month');\n            }\n        },\n\n        updateCalendars: function() {\n\n            if (this.timePicker) {\n                var hour, minute, second;\n                if (this.endDate) {\n                    hour = parseInt(this.container.find('.left .hourselect').val(), 10);\n                    minute = parseInt(this.container.find('.left .minuteselect').val(), 10);\n                    second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0;\n                    if (!this.timePicker24Hour) {\n                        var ampm = this.container.find('.left .ampmselect').val();\n                        if (ampm === 'PM' && hour < 12)\n                            hour += 12;\n                        if (ampm === 'AM' && hour === 12)\n                            hour = 0;\n                    }\n                } else {\n                    hour = parseInt(this.container.find('.right .hourselect').val(), 10);\n                    minute = parseInt(this.container.find('.right .minuteselect').val(), 10);\n                    second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0;\n                    if (!this.timePicker24Hour) {\n                        var ampm = this.container.find('.right .ampmselect').val();\n                        if (ampm === 'PM' && hour < 12)\n                            hour += 12;\n                        if (ampm === 'AM' && hour === 12)\n                            hour = 0;\n                    }\n                }\n                this.leftCalendar.month.hour(hour).minute(minute).second(second);\n                this.rightCalendar.month.hour(hour).minute(minute).second(second);\n            }\n\n            this.renderCalendar('left');\n            this.renderCalendar('right');\n\n            //highlight any predefined range matching the current start and end dates\n            this.container.find('.ranges li').removeClass('active');\n            if (this.endDate == null) return;\n\n            this.calculateChosenLabel();\n        },\n\n        renderCalendar: function(side) {\n\n            //\n            // Build the matrix of dates that will populate the calendar\n            //\n\n            var calendar = side == 'left' ? this.leftCalendar : this.rightCalendar;\n            var month = calendar.month.month();\n            var year = calendar.month.year();\n            var hour = calendar.month.hour();\n            var minute = calendar.month.minute();\n            var second = calendar.month.second();\n            var daysInMonth = moment([year, month]).daysInMonth();\n            var firstDay = moment([year, month, 1]);\n            var lastDay = moment([year, month, daysInMonth]);\n            var lastMonth = moment(firstDay).subtract(1, 'month').month();\n            var lastYear = moment(firstDay).subtract(1, 'month').year();\n            var daysInLastMonth = moment([lastYear, lastMonth]).daysInMonth();\n            var dayOfWeek = firstDay.day();\n\n            //initialize a 6 rows x 7 columns array for the calendar\n            var calendar = [];\n            calendar.firstDay = firstDay;\n            calendar.lastDay = lastDay;\n\n            for (var i = 0; i < 6; i++) {\n                calendar[i] = [];\n            }\n\n            //populate the calendar with date objects\n            var startDay = daysInLastMonth - dayOfWeek + this.locale.firstDay + 1;\n            if (startDay > daysInLastMonth)\n                startDay -= 7;\n\n            if (dayOfWeek == this.locale.firstDay)\n                startDay = daysInLastMonth - 6;\n\n            var curDate = moment([lastYear, lastMonth, startDay, 12, minute, second]);\n\n            var col, row;\n            for (var i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = moment(curDate).add(24, 'hour')) {\n                if (i > 0 && col % 7 === 0) {\n                    col = 0;\n                    row++;\n                }\n                calendar[row][col] = curDate.clone().hour(hour).minute(minute).second(second);\n                curDate.hour(12);\n\n                if (this.minDate && calendar[row][col].format('YYYY-MM-DD') == this.minDate.format('YYYY-MM-DD') && calendar[row][col].isBefore(this.minDate) && side == 'left') {\n                    calendar[row][col] = this.minDate.clone();\n                }\n\n                if (this.maxDate && calendar[row][col].format('YYYY-MM-DD') == this.maxDate.format('YYYY-MM-DD') && calendar[row][col].isAfter(this.maxDate) && side == 'right') {\n                    calendar[row][col] = this.maxDate.clone();\n                }\n\n            }\n\n            //make the calendar object available to hoverDate/clickDate\n            if (side == 'left') {\n                this.leftCalendar.calendar = calendar;\n            } else {\n                this.rightCalendar.calendar = calendar;\n            }\n\n            //\n            // Display the calendar\n            //\n\n            var minDate = side == 'left' ? this.minDate : this.startDate;\n            var maxDate = this.maxDate;\n            var selected = side == 'left' ? this.startDate : this.endDate;\n            var arrow = this.locale.direction == 'ltr' ? {left: 'chevron-left', right: 'chevron-right'} : {left: 'chevron-right', right: 'chevron-left'};\n\n            var html = '<table class=\"table-condensed\">';\n            html += '<thead>';\n            html += '<tr>';\n\n            // add empty cell for week number\n            if (this.showWeekNumbers || this.showISOWeekNumbers)\n                html += '<th></th>';\n\n            if ((!minDate || minDate.isBefore(calendar.firstDay)) && (!this.linkedCalendars || side == 'left')) {\n                html += '<th class=\"prev available\"><i class=\"fa fa-' + arrow.left + ' glyphicon glyphicon-' + arrow.left + '\"></i></th>';\n            } else {\n                html += '<th></th>';\n            }\n\n            var dateHtml = this.locale.monthNames[calendar[1][1].month()] + calendar[1][1].format(\" YYYY\");\n\n            if (this.showDropdowns) {\n                var currentMonth = calendar[1][1].month();\n                var currentYear = calendar[1][1].year();\n                var maxYear = (maxDate && maxDate.year()) || (currentYear + 5);\n                var minYear = (minDate && minDate.year()) || (currentYear - 50);\n                var inMinYear = currentYear == minYear;\n                var inMaxYear = currentYear == maxYear;\n\n                var monthHtml = '<select class=\"monthselect\">';\n                for (var m = 0; m < 12; m++) {\n                    if ((!inMinYear || m >= minDate.month()) && (!inMaxYear || m <= maxDate.month())) {\n                        monthHtml += \"<option value='\" + m + \"'\" +\n                            (m === currentMonth ? \" selected='selected'\" : \"\") +\n                            \">\" + this.locale.monthNames[m] + \"</option>\";\n                    } else {\n                        monthHtml += \"<option value='\" + m + \"'\" +\n                            (m === currentMonth ? \" selected='selected'\" : \"\") +\n                            \" disabled='disabled'>\" + this.locale.monthNames[m] + \"</option>\";\n                    }\n                }\n                monthHtml += \"</select>\";\n\n                var yearHtml = '<select class=\"yearselect\">';\n                for (var y = minYear; y <= maxYear; y++) {\n                    yearHtml += '<option value=\"' + y + '\"' +\n                        (y === currentYear ? ' selected=\"selected\"' : '') +\n                        '>' + y + '</option>';\n                }\n                yearHtml += '</select>';\n\n                dateHtml = monthHtml + yearHtml;\n            }\n\n            html += '<th colspan=\"5\" class=\"month\">' + dateHtml + '</th>';\n            if ((!maxDate || maxDate.isAfter(calendar.lastDay)) && (!this.linkedCalendars || side == 'right' || this.singleDatePicker)) {\n                html += '<th class=\"next available\"><i class=\"fa fa-' + arrow.right + ' glyphicon glyphicon-' + arrow.right + '\"></i></th>';\n            } else {\n                html += '<th></th>';\n            }\n\n            html += '</tr>';\n            html += '<tr>';\n\n            // add week number label\n            if (this.showWeekNumbers || this.showISOWeekNumbers)\n                html += '<th class=\"week\">' + this.locale.weekLabel + '</th>';\n\n            $.each(this.locale.daysOfWeek, function(index, dayOfWeek) {\n                html += '<th>' + dayOfWeek + '</th>';\n            });\n\n            html += '</tr>';\n            html += '</thead>';\n            html += '<tbody>';\n\n            //adjust maxDate to reflect the dateLimit setting in order to\n            //grey out end dates beyond the dateLimit\n            if (this.endDate == null && this.dateLimit) {\n                var maxLimit = this.startDate.clone().add(this.dateLimit).endOf('day');\n                if (!maxDate || maxLimit.isBefore(maxDate)) {\n                    maxDate = maxLimit;\n                }\n            }\n\n            for (var row = 0; row < 6; row++) {\n                html += '<tr>';\n\n                // add week number\n                if (this.showWeekNumbers)\n                    html += '<td class=\"week\">' + calendar[row][0].week() + '</td>';\n                else if (this.showISOWeekNumbers)\n                    html += '<td class=\"week\">' + calendar[row][0].isoWeek() + '</td>';\n\n                for (var col = 0; col < 7; col++) {\n\n                    var classes = [];\n\n                    //highlight today's date\n                    if (calendar[row][col].isSame(new Date(), \"day\"))\n                        classes.push('today');\n\n                    //highlight weekends\n                    if (calendar[row][col].isoWeekday() > 5)\n                        classes.push('weekend');\n\n                    //grey out the dates in other months displayed at beginning and end of this calendar\n                    if (calendar[row][col].month() != calendar[1][1].month())\n                        classes.push('off');\n\n                    //don't allow selection of dates before the minimum date\n                    if (this.minDate && calendar[row][col].isBefore(this.minDate, 'day'))\n                        classes.push('off', 'disabled');\n\n                    //don't allow selection of dates after the maximum date\n                    if (maxDate && calendar[row][col].isAfter(maxDate, 'day'))\n                        classes.push('off', 'disabled');\n\n                    //don't allow selection of date if a custom function decides it's invalid\n                    if (this.isInvalidDate(calendar[row][col]))\n                        classes.push('off', 'disabled');\n\n                    //highlight the currently selected start date\n                    if (calendar[row][col].format('YYYY-MM-DD') == this.startDate.format('YYYY-MM-DD'))\n                        classes.push('active', 'start-date');\n\n                    //highlight the currently selected end date\n                    if (this.endDate != null && calendar[row][col].format('YYYY-MM-DD') == this.endDate.format('YYYY-MM-DD'))\n                        classes.push('active', 'end-date');\n\n                    //highlight dates in-between the selected dates\n                    if (this.endDate != null && calendar[row][col] > this.startDate && calendar[row][col] < this.endDate)\n                        classes.push('in-range');\n\n                    //apply custom classes for this date\n                    var isCustom = this.isCustomDate(calendar[row][col]);\n                    if (isCustom !== false) {\n                        if (typeof isCustom === 'string')\n                            classes.push(isCustom);\n                        else\n                            Array.prototype.push.apply(classes, isCustom);\n                    }\n\n                    var cname = '', disabled = false;\n                    for (var i = 0; i < classes.length; i++) {\n                        cname += classes[i] + ' ';\n                        if (classes[i] == 'disabled')\n                            disabled = true;\n                    }\n                    if (!disabled)\n                        cname += 'available';\n\n                    html += '<td class=\"' + cname.replace(/^\\s+|\\s+$/g, '') + '\" data-title=\"' + 'r' + row + 'c' + col + '\">' + calendar[row][col].date() + '</td>';\n\n                }\n                html += '</tr>';\n            }\n\n            html += '</tbody>';\n            html += '</table>';\n\n            this.container.find('.calendar.' + side + ' .calendar-table').html(html);\n\n        },\n\n        renderTimePicker: function(side) {\n\n            // Don't bother updating the time picker if it's currently disabled\n            // because an end date hasn't been clicked yet\n            if (side == 'right' && !this.endDate) return;\n\n            var html, selected, minDate, maxDate = this.maxDate;\n\n            if (this.dateLimit && (!this.maxDate || this.startDate.clone().add(this.dateLimit).isAfter(this.maxDate)))\n                maxDate = this.startDate.clone().add(this.dateLimit);\n\n            if (side == 'left') {\n                selected = this.startDate.clone();\n                minDate = this.minDate;\n            } else if (side == 'right') {\n                selected = this.endDate.clone();\n                minDate = this.startDate;\n\n                //Preserve the time already selected\n                var timeSelector = this.container.find('.calendar.right .calendar-time div');\n                if (timeSelector.html() != '') {\n\n                    selected.hour(timeSelector.find('.hourselect option:selected').val() || selected.hour());\n                    selected.minute(timeSelector.find('.minuteselect option:selected').val() || selected.minute());\n                    selected.second(timeSelector.find('.secondselect option:selected').val() || selected.second());\n\n                    if (!this.timePicker24Hour) {\n                        var ampm = timeSelector.find('.ampmselect option:selected').val();\n                        if (ampm === 'PM' && selected.hour() < 12)\n                            selected.hour(selected.hour() + 12);\n                        if (ampm === 'AM' && selected.hour() === 12)\n                            selected.hour(0);\n                    }\n\n                }\n\n                if (selected.isBefore(this.startDate))\n                    selected = this.startDate.clone();\n\n                if (maxDate && selected.isAfter(maxDate))\n                    selected = maxDate.clone();\n\n            }\n\n            //\n            // hours\n            //\n\n            html = '<select class=\"hourselect\">';\n\n            var start = this.timePicker24Hour ? 0 : 1;\n            var end = this.timePicker24Hour ? 23 : 12;\n\n            for (var i = start; i <= end; i++) {\n                var i_in_24 = i;\n                if (!this.timePicker24Hour)\n                    i_in_24 = selected.hour() >= 12 ? (i == 12 ? 12 : i + 12) : (i == 12 ? 0 : i);\n\n                var time = selected.clone().hour(i_in_24);\n                var disabled = false;\n                if (minDate && time.minute(59).isBefore(minDate))\n                    disabled = true;\n                if (maxDate && time.minute(0).isAfter(maxDate))\n                    disabled = true;\n\n                if (i_in_24 == selected.hour() && !disabled) {\n                    html += '<option value=\"' + i + '\" selected=\"selected\">' + i + '</option>';\n                } else if (disabled) {\n                    html += '<option value=\"' + i + '\" disabled=\"disabled\" class=\"disabled\">' + i + '</option>';\n                } else {\n                    html += '<option value=\"' + i + '\">' + i + '</option>';\n                }\n            }\n\n            html += '</select> ';\n\n            //\n            // minutes\n            //\n\n            html += ': <select class=\"minuteselect\">';\n\n            for (var i = 0; i < 60; i += this.timePickerIncrement) {\n                var padded = i < 10 ? '0' + i : i;\n                var time = selected.clone().minute(i);\n\n                var disabled = false;\n                if (minDate && time.second(59).isBefore(minDate))\n                    disabled = true;\n                if (maxDate && time.second(0).isAfter(maxDate))\n                    disabled = true;\n\n                if (selected.minute() == i && !disabled) {\n                    html += '<option value=\"' + i + '\" selected=\"selected\">' + padded + '</option>';\n                } else if (disabled) {\n                    html += '<option value=\"' + i + '\" disabled=\"disabled\" class=\"disabled\">' + padded + '</option>';\n                } else {\n                    html += '<option value=\"' + i + '\">' + padded + '</option>';\n                }\n            }\n\n            html += '</select> ';\n\n            //\n            // seconds\n            //\n\n            if (this.timePickerSeconds) {\n                html += ': <select class=\"secondselect\">';\n\n                for (var i = 0; i < 60; i++) {\n                    var padded = i < 10 ? '0' + i : i;\n                    var time = selected.clone().second(i);\n\n                    var disabled = false;\n                    if (minDate && time.isBefore(minDate))\n                        disabled = true;\n                    if (maxDate && time.isAfter(maxDate))\n                        disabled = true;\n\n                    if (selected.second() == i && !disabled) {\n                        html += '<option value=\"' + i + '\" selected=\"selected\">' + padded + '</option>';\n                    } else if (disabled) {\n                        html += '<option value=\"' + i + '\" disabled=\"disabled\" class=\"disabled\">' + padded + '</option>';\n                    } else {\n                        html += '<option value=\"' + i + '\">' + padded + '</option>';\n                    }\n                }\n\n                html += '</select> ';\n            }\n\n            //\n            // AM/PM\n            //\n\n            if (!this.timePicker24Hour) {\n                html += '<select class=\"ampmselect\">';\n\n                var am_html = '';\n                var pm_html = '';\n\n                if (minDate && selected.clone().hour(12).minute(0).second(0).isBefore(minDate))\n                    am_html = ' disabled=\"disabled\" class=\"disabled\"';\n\n                if (maxDate && selected.clone().hour(0).minute(0).second(0).isAfter(maxDate))\n                    pm_html = ' disabled=\"disabled\" class=\"disabled\"';\n\n                if (selected.hour() >= 12) {\n                    html += '<option value=\"AM\"' + am_html + '>AM</option><option value=\"PM\" selected=\"selected\"' + pm_html + '>PM</option>';\n                } else {\n                    html += '<option value=\"AM\" selected=\"selected\"' + am_html + '>AM</option><option value=\"PM\"' + pm_html + '>PM</option>';\n                }\n\n                html += '</select>';\n            }\n\n            this.container.find('.calendar.' + side + ' .calendar-time div').html(html);\n\n        },\n\n        updateFormInputs: function() {\n\n            //ignore mouse movements while an above-calendar text input has focus\n            if (this.container.find('input[name=daterangepicker_start]').is(\":focus\") || this.container.find('input[name=daterangepicker_end]').is(\":focus\"))\n                return;\n\n            this.container.find('input[name=daterangepicker_start]').val(this.startDate.format(this.locale.format));\n            if (this.endDate)\n                this.container.find('input[name=daterangepicker_end]').val(this.endDate.format(this.locale.format));\n\n            if (this.singleDatePicker || (this.endDate && (this.startDate.isBefore(this.endDate) || this.startDate.isSame(this.endDate)))) {\n                this.container.find('button.applyBtn').removeAttr('disabled');\n            } else {\n                this.container.find('button.applyBtn').attr('disabled', 'disabled');\n            }\n\n        },\n\n        move: function() {\n            var parentOffset = { top: 0, left: 0 },\n                containerTop;\n            var parentRightEdge = $(window).width();\n            if (!this.parentEl.is('body')) {\n                parentOffset = {\n                    top: this.parentEl.offset().top - this.parentEl.scrollTop(),\n                    left: this.parentEl.offset().left - this.parentEl.scrollLeft()\n                };\n                parentRightEdge = this.parentEl[0].clientWidth + this.parentEl.offset().left;\n            }\n\n            if (this.drops == 'up')\n                containerTop = this.element.offset().top - this.container.outerHeight() - parentOffset.top;\n            else\n                containerTop = this.element.offset().top + this.element.outerHeight() - parentOffset.top;\n            this.container[this.drops == 'up' ? 'addClass' : 'removeClass']('dropup');\n\n            if (this.opens == 'left') {\n                this.container.css({\n                    top: containerTop,\n                    right: parentRightEdge - this.element.offset().left - this.element.outerWidth(),\n                    left: 'auto'\n                });\n                if (this.container.offset().left < 0) {\n                    this.container.css({\n                        right: 'auto',\n                        left: 9\n                    });\n                }\n            } else if (this.opens == 'center') {\n                this.container.css({\n                    top: containerTop,\n                    left: this.element.offset().left - parentOffset.left + this.element.outerWidth() / 2\n                            - this.container.outerWidth() / 2,\n                    right: 'auto'\n                });\n                if (this.container.offset().left < 0) {\n                    this.container.css({\n                        right: 'auto',\n                        left: 9\n                    });\n                }\n            } else {\n                this.container.css({\n                    top: containerTop,\n                    left: this.element.offset().left - parentOffset.left,\n                    right: 'auto'\n                });\n                if (this.container.offset().left + this.container.outerWidth() > $(window).width()) {\n                    this.container.css({\n                        left: 'auto',\n                        right: 0\n                    });\n                }\n            }\n        },\n\n        show: function(e) {\n            if (this.isShowing) return;\n\n            // Create a click proxy that is private to this instance of datepicker, for unbinding\n            this._outsideClickProxy = $.proxy(function(e) { this.outsideClick(e); }, this);\n\n            // Bind global datepicker mousedown for hiding and\n            $(document)\n              .on('mousedown.daterangepicker', this._outsideClickProxy)\n              // also support mobile devices\n              .on('touchend.daterangepicker', this._outsideClickProxy)\n              // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them\n              .on('click.daterangepicker', '[data-toggle=dropdown]', this._outsideClickProxy)\n              // and also close when focus changes to outside the picker (eg. tabbing between controls)\n              .on('focusin.daterangepicker', this._outsideClickProxy);\n\n            // Reposition the picker if the window is resized while it's open\n            $(window).on('resize.daterangepicker', $.proxy(function(e) { this.move(e); }, this));\n\n            this.oldStartDate = this.startDate.clone();\n            this.oldEndDate = this.endDate.clone();\n            this.previousRightTime = this.endDate.clone();\n\n            this.updateView();\n            this.container.show();\n            this.move();\n            this.element.trigger('show.daterangepicker', this);\n            this.isShowing = true;\n        },\n\n        hide: function(e) {\n            if (!this.isShowing) return;\n\n            //incomplete date selection, revert to last values\n            if (!this.endDate) {\n                this.startDate = this.oldStartDate.clone();\n                this.endDate = this.oldEndDate.clone();\n            }\n\n            //if a new date range was selected, invoke the user callback function\n            if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate))\n                this.callback(this.startDate, this.endDate, this.chosenLabel);\n\n            //if picker is attached to a text input, update it\n            this.updateElement();\n\n            $(document).off('.daterangepicker');\n            $(window).off('.daterangepicker');\n            this.container.hide();\n            this.element.trigger('hide.daterangepicker', this);\n            this.isShowing = false;\n        },\n\n        toggle: function(e) {\n            if (this.isShowing) {\n                this.hide();\n            } else {\n                this.show();\n            }\n        },\n\n        outsideClick: function(e) {\n            var target = $(e.target);\n            // if the page is clicked anywhere except within the daterangerpicker/button\n            // itself then call this.hide()\n            if (\n                // ie modal dialog fix\n                e.type == \"focusin\" ||\n                target.closest(this.element).length ||\n                target.closest(this.container).length ||\n                target.closest('.calendar-table').length\n                ) return;\n            this.hide();\n            this.element.trigger('outsideClick.daterangepicker', this);\n        },\n\n        showCalendars: function() {\n            this.container.addClass('show-calendar');\n            this.move();\n            this.element.trigger('showCalendar.daterangepicker', this);\n        },\n\n        hideCalendars: function() {\n            this.container.removeClass('show-calendar');\n            this.element.trigger('hideCalendar.daterangepicker', this);\n        },\n\n        hoverRange: function(e) {\n\n            //ignore mouse movements while an above-calendar text input has focus\n            if (this.container.find('input[name=daterangepicker_start]').is(\":focus\") || this.container.find('input[name=daterangepicker_end]').is(\":focus\"))\n                return;\n\n            var label = e.target.getAttribute('data-range-key');\n\n            if (label == this.locale.customRangeLabel) {\n                this.updateView();\n            } else {\n                var dates = this.ranges[label];\n                this.container.find('input[name=daterangepicker_start]').val(dates[0].format(this.locale.format));\n                this.container.find('input[name=daterangepicker_end]').val(dates[1].format(this.locale.format));\n            }\n\n        },\n\n        clickRange: function(e) {\n            var label = e.target.getAttribute('data-range-key');\n            this.chosenLabel = label;\n            if (label == this.locale.customRangeLabel) {\n                this.showCalendars();\n            } else {\n                var dates = this.ranges[label];\n                this.startDate = dates[0];\n                this.endDate = dates[1];\n\n                if (!this.timePicker) {\n                    this.startDate.startOf('day');\n                    this.endDate.endOf('day');\n                }\n\n                if (!this.alwaysShowCalendars)\n                    this.hideCalendars();\n                this.clickApply();\n            }\n        },\n\n        clickPrev: function(e) {\n            var cal = $(e.target).parents('.calendar');\n            if (cal.hasClass('left')) {\n                this.leftCalendar.month.subtract(1, 'month');\n                if (this.linkedCalendars)\n                    this.rightCalendar.month.subtract(1, 'month');\n            } else {\n                this.rightCalendar.month.subtract(1, 'month');\n            }\n            this.updateCalendars();\n        },\n\n        clickNext: function(e) {\n            var cal = $(e.target).parents('.calendar');\n            if (cal.hasClass('left')) {\n                this.leftCalendar.month.add(1, 'month');\n            } else {\n                this.rightCalendar.month.add(1, 'month');\n                if (this.linkedCalendars)\n                    this.leftCalendar.month.add(1, 'month');\n            }\n            this.updateCalendars();\n        },\n\n        hoverDate: function(e) {\n\n            //ignore mouse movements while an above-calendar text input has focus\n            //if (this.container.find('input[name=daterangepicker_start]').is(\":focus\") || this.container.find('input[name=daterangepicker_end]').is(\":focus\"))\n            //    return;\n\n            //ignore dates that can't be selected\n            if (!$(e.target).hasClass('available')) return;\n\n            //have the text inputs above calendars reflect the date being hovered over\n            var title = $(e.target).attr('data-title');\n            var row = title.substr(1, 1);\n            var col = title.substr(3, 1);\n            var cal = $(e.target).parents('.calendar');\n            var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col];\n\n            if (this.endDate && !this.container.find('input[name=daterangepicker_start]').is(\":focus\")) {\n                this.container.find('input[name=daterangepicker_start]').val(date.format(this.locale.format));\n            } else if (!this.endDate && !this.container.find('input[name=daterangepicker_end]').is(\":focus\")) {\n                this.container.find('input[name=daterangepicker_end]').val(date.format(this.locale.format));\n            }\n\n            //highlight the dates between the start date and the date being hovered as a potential end date\n            var leftCalendar = this.leftCalendar;\n            var rightCalendar = this.rightCalendar;\n            var startDate = this.startDate;\n            if (!this.endDate) {\n                this.container.find('.calendar tbody td').each(function(index, el) {\n\n                    //skip week numbers, only look at dates\n                    if ($(el).hasClass('week')) return;\n\n                    var title = $(el).attr('data-title');\n                    var row = title.substr(1, 1);\n                    var col = title.substr(3, 1);\n                    var cal = $(el).parents('.calendar');\n                    var dt = cal.hasClass('left') ? leftCalendar.calendar[row][col] : rightCalendar.calendar[row][col];\n\n                    if ((dt.isAfter(startDate) && dt.isBefore(date)) || dt.isSame(date, 'day')) {\n                        $(el).addClass('in-range');\n                    } else {\n                        $(el).removeClass('in-range');\n                    }\n\n                });\n            }\n\n        },\n\n        clickDate: function(e) {\n\n            if (!$(e.target).hasClass('available')) return;\n\n            var title = $(e.target).attr('data-title');\n            var row = title.substr(1, 1);\n            var col = title.substr(3, 1);\n            var cal = $(e.target).parents('.calendar');\n            var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col];\n\n            //\n            // this function needs to do a few things:\n            // * alternate between selecting a start and end date for the range,\n            // * if the time picker is enabled, apply the hour/minute/second from the select boxes to the clicked date\n            // * if autoapply is enabled, and an end date was chosen, apply the selection\n            // * if single date picker mode, and time picker isn't enabled, apply the selection immediately\n            // * if one of the inputs above the calendars was focused, cancel that manual input\n            //\n\n            if (this.endDate || date.isBefore(this.startDate, 'day')) { //picking start\n                if (this.timePicker) {\n                    var hour = parseInt(this.container.find('.left .hourselect').val(), 10);\n                    if (!this.timePicker24Hour) {\n                        var ampm = this.container.find('.left .ampmselect').val();\n                        if (ampm === 'PM' && hour < 12)\n                            hour += 12;\n                        if (ampm === 'AM' && hour === 12)\n                            hour = 0;\n                    }\n                    var minute = parseInt(this.container.find('.left .minuteselect').val(), 10);\n                    var second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0;\n                    date = date.clone().hour(hour).minute(minute).second(second);\n                }\n                this.endDate = null;\n                this.setStartDate(date.clone());\n            } else if (!this.endDate && date.isBefore(this.startDate)) {\n                //special case: clicking the same date for start/end,\n                //but the time of the end date is before the start date\n                this.setEndDate(this.startDate.clone());\n            } else { // picking end\n                if (this.timePicker) {\n                    var hour = parseInt(this.container.find('.right .hourselect').val(), 10);\n                    if (!this.timePicker24Hour) {\n                        var ampm = this.container.find('.right .ampmselect').val();\n                        if (ampm === 'PM' && hour < 12)\n                            hour += 12;\n                        if (ampm === 'AM' && hour === 12)\n                            hour = 0;\n                    }\n                    var minute = parseInt(this.container.find('.right .minuteselect').val(), 10);\n                    var second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0;\n                    date = date.clone().hour(hour).minute(minute).second(second);\n                }\n                this.setEndDate(date.clone());\n                if (this.autoApply) {\n                  this.calculateChosenLabel();\n                  this.clickApply();\n                }\n            }\n\n            if (this.singleDatePicker) {\n                this.setEndDate(this.startDate);\n                if (!this.timePicker)\n                    this.clickApply();\n            }\n\n            this.updateView();\n\n            //This is to cancel the blur event handler if the mouse was in one of the inputs\n            e.stopPropagation();\n\n        },\n\n        calculateChosenLabel: function () {\n            var customRange = true;\n            var i = 0;\n            for (var range in this.ranges) {\n              if (this.timePicker) {\n                    var format = this.timePickerSeconds ? \"YYYY-MM-DD hh:mm:ss\" : \"YYYY-MM-DD hh:mm\";\n                    //ignore times when comparing dates if time picker seconds is not enabled\n                    if (this.startDate.format(format) == this.ranges[range][0].format(format) && this.endDate.format(format) == this.ranges[range][1].format(format)) {\n                        customRange = false;\n                        this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').html();\n                        break;\n                    }\n                } else {\n                    //ignore times when comparing dates if time picker is not enabled\n                    if (this.startDate.format('YYYY-MM-DD') == this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') == this.ranges[range][1].format('YYYY-MM-DD')) {\n                        customRange = false;\n                        this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').html();\n                        break;\n                    }\n                }\n                i++;\n            }\n            if (customRange) {\n                if (this.showCustomRangeLabel) {\n                    this.chosenLabel = this.container.find('.ranges li:last').addClass('active').html();\n                } else {\n                    this.chosenLabel = null;\n                }\n                this.showCalendars();\n            }\n        },\n\n        clickApply: function(e) {\n            this.hide();\n            this.element.trigger('apply.daterangepicker', this);\n        },\n\n        clickCancel: function(e) {\n            this.startDate = this.oldStartDate;\n            this.endDate = this.oldEndDate;\n            this.hide();\n            this.element.trigger('cancel.daterangepicker', this);\n        },\n\n        monthOrYearChanged: function(e) {\n            var isLeft = $(e.target).closest('.calendar').hasClass('left'),\n                leftOrRight = isLeft ? 'left' : 'right',\n                cal = this.container.find('.calendar.'+leftOrRight);\n\n            // Month must be Number for new moment versions\n            var month = parseInt(cal.find('.monthselect').val(), 10);\n            var year = cal.find('.yearselect').val();\n\n            if (!isLeft) {\n                if (year < this.startDate.year() || (year == this.startDate.year() && month < this.startDate.month())) {\n                    month = this.startDate.month();\n                    year = this.startDate.year();\n                }\n            }\n\n            if (this.minDate) {\n                if (year < this.minDate.year() || (year == this.minDate.year() && month < this.minDate.month())) {\n                    month = this.minDate.month();\n                    year = this.minDate.year();\n                }\n            }\n\n            if (this.maxDate) {\n                if (year > this.maxDate.year() || (year == this.maxDate.year() && month > this.maxDate.month())) {\n                    month = this.maxDate.month();\n                    year = this.maxDate.year();\n                }\n            }\n\n            if (isLeft) {\n                this.leftCalendar.month.month(month).year(year);\n                if (this.linkedCalendars)\n                    this.rightCalendar.month = this.leftCalendar.month.clone().add(1, 'month');\n            } else {\n                this.rightCalendar.month.month(month).year(year);\n                if (this.linkedCalendars)\n                    this.leftCalendar.month = this.rightCalendar.month.clone().subtract(1, 'month');\n            }\n            this.updateCalendars();\n        },\n\n        timeChanged: function(e) {\n\n            var cal = $(e.target).closest('.calendar'),\n                isLeft = cal.hasClass('left');\n\n            var hour = parseInt(cal.find('.hourselect').val(), 10);\n            var minute = parseInt(cal.find('.minuteselect').val(), 10);\n            var second = this.timePickerSeconds ? parseInt(cal.find('.secondselect').val(), 10) : 0;\n\n            if (!this.timePicker24Hour) {\n                var ampm = cal.find('.ampmselect').val();\n                if (ampm === 'PM' && hour < 12)\n                    hour += 12;\n                if (ampm === 'AM' && hour === 12)\n                    hour = 0;\n            }\n\n            if (isLeft) {\n                var start = this.startDate.clone();\n                start.hour(hour);\n                start.minute(minute);\n                start.second(second);\n                this.setStartDate(start);\n                if (this.singleDatePicker) {\n                    this.endDate = this.startDate.clone();\n                } else if (this.endDate && this.endDate.format('YYYY-MM-DD') == start.format('YYYY-MM-DD') && this.endDate.isBefore(start)) {\n                    this.setEndDate(start.clone());\n                }\n            } else if (this.endDate) {\n                var end = this.endDate.clone();\n                end.hour(hour);\n                end.minute(minute);\n                end.second(second);\n                this.setEndDate(end);\n            }\n\n            //update the calendars so all clickable dates reflect the new time component\n            this.updateCalendars();\n\n            //update the form inputs above the calendars with the new time\n            this.updateFormInputs();\n\n            //re-render the time pickers because changing one selection can affect what's enabled in another\n            this.renderTimePicker('left');\n            this.renderTimePicker('right');\n\n        },\n\n        formInputsChanged: function(e) {\n            var isRight = $(e.target).closest('.calendar').hasClass('right');\n            var start = moment(this.container.find('input[name=\"daterangepicker_start\"]').val(), this.locale.format);\n            var end = moment(this.container.find('input[name=\"daterangepicker_end\"]').val(), this.locale.format);\n\n            if (start.isValid() && end.isValid()) {\n\n                if (isRight && end.isBefore(start))\n                    start = end.clone();\n\n                this.setStartDate(start);\n                this.setEndDate(end);\n\n                if (isRight) {\n                    this.container.find('input[name=\"daterangepicker_start\"]').val(this.startDate.format(this.locale.format));\n                } else {\n                    this.container.find('input[name=\"daterangepicker_end\"]').val(this.endDate.format(this.locale.format));\n                }\n\n            }\n\n            this.updateView();\n        },\n\n        formInputsFocused: function(e) {\n\n            // Highlight the focused input\n            this.container.find('input[name=\"daterangepicker_start\"], input[name=\"daterangepicker_end\"]').removeClass('active');\n            $(e.target).addClass('active');\n\n            // Set the state such that if the user goes back to using a mouse, \n            // the calendars are aware we're selecting the end of the range, not\n            // the start. This allows someone to edit the end of a date range without\n            // re-selecting the beginning, by clicking on the end date input then\n            // using the calendar.\n            var isRight = $(e.target).closest('.calendar').hasClass('right');\n            if (isRight) {\n                this.endDate = null;\n                this.setStartDate(this.startDate.clone());\n                this.updateView();\n            }\n\n        },\n\n        formInputsBlurred: function(e) {\n\n            // this function has one purpose right now: if you tab from the first\n            // text input to the second in the UI, the endDate is nulled so that\n            // you can click another, but if you tab out without clicking anything\n            // or changing the input value, the old endDate should be retained\n\n            if (!this.endDate) {\n                var val = this.container.find('input[name=\"daterangepicker_end\"]').val();\n                var end = moment(val, this.locale.format);\n                if (end.isValid()) {\n                    this.setEndDate(end);\n                    this.updateView();\n                }\n            }\n\n        },\n\n        formInputsKeydown: function(e) {\n            // This function ensures that if the 'enter' key was pressed in the input, then the calendars\n            // are updated with the startDate and endDate.\n            // This behaviour is automatic in Chrome/Firefox/Edge but not in IE 11 hence why this exists.\n            // Other browsers and versions of IE are untested and the behaviour is unknown.\n            if (e.keyCode === 13) {\n                // Prevent the calendar from being updated twice on Chrome/Firefox/Edge\n                e.preventDefault(); \n                this.formInputsChanged(e);\n            }\n        },\n\n\n        elementChanged: function() {\n            if (!this.element.is('input')) return;\n            if (!this.element.val().length) return;\n\n            var dateString = this.element.val().split(this.locale.separator),\n                start = null,\n                end = null;\n\n            if (dateString.length === 2) {\n                start = moment(dateString[0], this.locale.format);\n                end = moment(dateString[1], this.locale.format);\n            }\n\n            if (this.singleDatePicker || start === null || end === null) {\n                start = moment(this.element.val(), this.locale.format);\n                end = start;\n            }\n\n            if (!start.isValid() || !end.isValid()) return;\n\n            this.setStartDate(start);\n            this.setEndDate(end);\n            this.updateView();\n        },\n\n        keydown: function(e) {\n            //hide on tab or enter\n            if ((e.keyCode === 9) || (e.keyCode === 13)) {\n                this.hide();\n            }\n\n            //hide on esc and prevent propagation\n            if (e.keyCode === 27) {\n                e.preventDefault();\n                e.stopPropagation();\n\n                this.hide();\n            }\n        },\n\n        updateElement: function() {\n            if (this.element.is('input') && !this.singleDatePicker && this.autoUpdateInput) {\n                this.element.val(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format));\n                this.element.trigger('change');\n            } else if (this.element.is('input') && this.autoUpdateInput) {\n                this.element.val(this.startDate.format(this.locale.format));\n                this.element.trigger('change');\n            }\n        },\n\n        remove: function() {\n            this.container.remove();\n            this.element.off('.daterangepicker');\n            this.element.removeData();\n        }\n\n    };\n\n    $.fn.daterangepicker = function(options, callback) {\n        var implementOptions = $.extend(true, {}, $.fn.daterangepicker.defaultOptions, options);\n        this.each(function() {\n            var el = $(this);\n            if (el.data('daterangepicker'))\n                el.data('daterangepicker').remove();\n            el.data('daterangepicker', new DateRangePicker(el, implementOptions, callback));\n        });\n        return this;\n    };\n\n    return DateRangePicker;\n\n}));\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/adminlte/bower_components/fastclick/fastclick.js",
    "content": ";(function () {\n\t'use strict';\n\n\t/**\n\t * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs.\n\t *\n\t * @codingstandard ftlabs-jsv2\n\t * @copyright The Financial Times Limited [All Rights Reserved]\n\t * @license MIT License (see LICENSE.txt)\n\t */\n\n\t/*jslint browser:true, node:true*/\n\t/*global define, Event, Node*/\n\n\n\t/**\n\t * Instantiate fast-clicking listeners on the specified layer.\n\t *\n\t * @constructor\n\t * @param {Element} layer The layer to listen on\n\t * @param {Object} [options={}] The options to override the defaults\n\t */\n\tfunction FastClick(layer, options) {\n\t\tvar oldOnClick;\n\n\t\toptions = options || {};\n\n\t\t/**\n\t\t * Whether a click is currently being tracked.\n\t\t *\n\t\t * @type boolean\n\t\t */\n\t\tthis.trackingClick = false;\n\n\n\t\t/**\n\t\t * Timestamp for when click tracking started.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.trackingClickStart = 0;\n\n\n\t\t/**\n\t\t * The element being tracked for a click.\n\t\t *\n\t\t * @type EventTarget\n\t\t */\n\t\tthis.targetElement = null;\n\n\n\t\t/**\n\t\t * X-coordinate of touch start event.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.touchStartX = 0;\n\n\n\t\t/**\n\t\t * Y-coordinate of touch start event.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.touchStartY = 0;\n\n\n\t\t/**\n\t\t * ID of the last touch, retrieved from Touch.identifier.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.lastTouchIdentifier = 0;\n\n\n\t\t/**\n\t\t * Touchmove boundary, beyond which a click will be cancelled.\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.touchBoundary = options.touchBoundary || 10;\n\n\n\t\t/**\n\t\t * The FastClick layer.\n\t\t *\n\t\t * @type Element\n\t\t */\n\t\tthis.layer = layer;\n\n\t\t/**\n\t\t * The minimum time between tap(touchstart and touchend) events\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.tapDelay = options.tapDelay || 200;\n\n\t\t/**\n\t\t * The maximum time for a tap\n\t\t *\n\t\t * @type number\n\t\t */\n\t\tthis.tapTimeout = options.tapTimeout || 700;\n\n\t\tif (FastClick.notNeeded(layer)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Some old versions of Android don't have Function.prototype.bind\n\t\tfunction bind(method, context) {\n\t\t\treturn function() { return method.apply(context, arguments); };\n\t\t}\n\n\n\t\tvar methods = ['onMouse', 'onClick', 'onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel'];\n\t\tvar context = this;\n\t\tfor (var i = 0, l = methods.length; i < l; i++) {\n\t\t\tcontext[methods[i]] = bind(context[methods[i]], context);\n\t\t}\n\n\t\t// Set up event handlers as required\n\t\tif (deviceIsAndroid) {\n\t\t\tlayer.addEventListener('mouseover', this.onMouse, true);\n\t\t\tlayer.addEventListener('mousedown', this.onMouse, true);\n\t\t\tlayer.addEventListener('mouseup', this.onMouse, true);\n\t\t}\n\n\t\tlayer.addEventListener('click', this.onClick, true);\n\t\tlayer.addEventListener('touchstart', this.onTouchStart, false);\n\t\tlayer.addEventListener('touchmove', this.onTouchMove, false);\n\t\tlayer.addEventListener('touchend', this.onTouchEnd, false);\n\t\tlayer.addEventListener('touchcancel', this.onTouchCancel, false);\n\n\t\t// Hack is required for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)\n\t\t// which is how FastClick normally stops click events bubbling to callbacks registered on the FastClick\n\t\t// layer when they are cancelled.\n\t\tif (!Event.prototype.stopImmediatePropagation) {\n\t\t\tlayer.removeEventListener = function(type, callback, capture) {\n\t\t\t\tvar rmv = Node.prototype.removeEventListener;\n\t\t\t\tif (type === 'click') {\n\t\t\t\t\trmv.call(layer, type, callback.hijacked || callback, capture);\n\t\t\t\t} else {\n\t\t\t\t\trmv.call(layer, type, callback, capture);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tlayer.addEventListener = function(type, callback, capture) {\n\t\t\t\tvar adv = Node.prototype.addEventListener;\n\t\t\t\tif (type === 'click') {\n\t\t\t\t\tadv.call(layer, type, callback.hijacked || (callback.hijacked = function(event) {\n\t\t\t\t\t\tif (!event.propagationStopped) {\n\t\t\t\t\t\t\tcallback(event);\n\t\t\t\t\t\t}\n\t\t\t\t\t}), capture);\n\t\t\t\t} else {\n\t\t\t\t\tadv.call(layer, type, callback, capture);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t// If a handler is already declared in the element's onclick attribute, it will be fired before\n\t\t// FastClick's onClick handler. Fix this by pulling out the user-defined handler function and\n\t\t// adding it as listener.\n\t\tif (typeof layer.onclick === 'function') {\n\n\t\t\t// Android browser on at least 3.2 requires a new reference to the function in layer.onclick\n\t\t\t// - the old one won't work if passed to addEventListener directly.\n\t\t\toldOnClick = layer.onclick;\n\t\t\tlayer.addEventListener('click', function(event) {\n\t\t\t\toldOnClick(event);\n\t\t\t}, false);\n\t\t\tlayer.onclick = null;\n\t\t}\n\t}\n\n\t/**\n\t* Windows Phone 8.1 fakes user agent string to look like Android and iPhone.\n\t*\n\t* @type boolean\n\t*/\n\tvar deviceIsWindowsPhone = navigator.userAgent.indexOf(\"Windows Phone\") >= 0;\n\n\t/**\n\t * Android requires exceptions.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0 && !deviceIsWindowsPhone;\n\n\n\t/**\n\t * iOS requires exceptions.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent) && !deviceIsWindowsPhone;\n\n\n\t/**\n\t * iOS 4 requires an exception for select elements.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsIOS4 = deviceIsIOS && (/OS 4_\\d(_\\d)?/).test(navigator.userAgent);\n\n\n\t/**\n\t * iOS 6.0-7.* requires the target element to be manually derived\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsIOSWithBadTarget = deviceIsIOS && (/OS [6-7]_\\d/).test(navigator.userAgent);\n\n\t/**\n\t * BlackBerry requires exceptions.\n\t *\n\t * @type boolean\n\t */\n\tvar deviceIsBlackBerry10 = navigator.userAgent.indexOf('BB10') > 0;\n\n\t/**\n\t * Determine whether a given element requires a native click.\n\t *\n\t * @param {EventTarget|Element} target Target DOM element\n\t * @returns {boolean} Returns true if the element needs a native click\n\t */\n\tFastClick.prototype.needsClick = function(target) {\n\t\tswitch (target.nodeName.toLowerCase()) {\n\n\t\t// Don't send a synthetic click to disabled inputs (issue #62)\n\t\tcase 'button':\n\t\tcase 'select':\n\t\tcase 'textarea':\n\t\t\tif (target.disabled) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'input':\n\n\t\t\t// File inputs need real clicks on iOS 6 due to a browser bug (issue #68)\n\t\t\tif ((deviceIsIOS && target.type === 'file') || target.disabled) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'label':\n\t\tcase 'iframe': // iOS8 homescreen apps can prevent events bubbling into frames\n\t\tcase 'video':\n\t\t\treturn true;\n\t\t}\n\n\t\treturn (/\\bneedsclick\\b/).test(target.className);\n\t};\n\n\n\t/**\n\t * Determine whether a given element requires a call to focus to simulate click into element.\n\t *\n\t * @param {EventTarget|Element} target Target DOM element\n\t * @returns {boolean} Returns true if the element requires a call to focus to simulate native click.\n\t */\n\tFastClick.prototype.needsFocus = function(target) {\n\t\tswitch (target.nodeName.toLowerCase()) {\n\t\tcase 'textarea':\n\t\t\treturn true;\n\t\tcase 'select':\n\t\t\treturn !deviceIsAndroid;\n\t\tcase 'input':\n\t\t\tswitch (target.type) {\n\t\t\tcase 'button':\n\t\t\tcase 'checkbox':\n\t\t\tcase 'file':\n\t\t\tcase 'image':\n\t\t\tcase 'radio':\n\t\t\tcase 'submit':\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// No point in attempting to focus disabled inputs\n\t\t\treturn !target.disabled && !target.readOnly;\n\t\tdefault:\n\t\t\treturn (/\\bneedsfocus\\b/).test(target.className);\n\t\t}\n\t};\n\n\n\t/**\n\t * Send a click event to the specified element.\n\t *\n\t * @param {EventTarget|Element} targetElement\n\t * @param {Event} event\n\t */\n\tFastClick.prototype.sendClick = function(targetElement, event) {\n\t\tvar clickEvent, touch;\n\n\t\t// On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24)\n\t\tif (document.activeElement && document.activeElement !== targetElement) {\n\t\t\tdocument.activeElement.blur();\n\t\t}\n\n\t\ttouch = event.changedTouches[0];\n\n\t\t// Synthesise a click event, with an extra attribute so it can be tracked\n\t\tclickEvent = document.createEvent('MouseEvents');\n\t\tclickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);\n\t\tclickEvent.forwardedTouchEvent = true;\n\t\ttargetElement.dispatchEvent(clickEvent);\n\t};\n\n\tFastClick.prototype.determineEventType = function(targetElement) {\n\n\t\t//Issue #159: Android Chrome Select Box does not open with a synthetic click event\n\t\tif (deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') {\n\t\t\treturn 'mousedown';\n\t\t}\n\n\t\treturn 'click';\n\t};\n\n\n\t/**\n\t * @param {EventTarget|Element} targetElement\n\t */\n\tFastClick.prototype.focus = function(targetElement) {\n\t\tvar length;\n\n\t\t// Issue #160: on iOS 7, some input elements (e.g. date datetime month) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724.\n\t\tif (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month') {\n\t\t\tlength = targetElement.value.length;\n\t\t\ttargetElement.setSelectionRange(length, length);\n\t\t} else {\n\t\t\ttargetElement.focus();\n\t\t}\n\t};\n\n\n\t/**\n\t * Check whether the given target element is a child of a scrollable layer and if so, set a flag on it.\n\t *\n\t * @param {EventTarget|Element} targetElement\n\t */\n\tFastClick.prototype.updateScrollParent = function(targetElement) {\n\t\tvar scrollParent, parentElement;\n\n\t\tscrollParent = targetElement.fastClickScrollParent;\n\n\t\t// Attempt to discover whether the target element is contained within a scrollable layer. Re-check if the\n\t\t// target element was moved to another parent.\n\t\tif (!scrollParent || !scrollParent.contains(targetElement)) {\n\t\t\tparentElement = targetElement;\n\t\t\tdo {\n\t\t\t\tif (parentElement.scrollHeight > parentElement.offsetHeight) {\n\t\t\t\t\tscrollParent = parentElement;\n\t\t\t\t\ttargetElement.fastClickScrollParent = parentElement;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tparentElement = parentElement.parentElement;\n\t\t\t} while (parentElement);\n\t\t}\n\n\t\t// Always update the scroll top tracker if possible.\n\t\tif (scrollParent) {\n\t\t\tscrollParent.fastClickLastScrollTop = scrollParent.scrollTop;\n\t\t}\n\t};\n\n\n\t/**\n\t * @param {EventTarget} targetElement\n\t * @returns {Element|EventTarget}\n\t */\n\tFastClick.prototype.getTargetElementFromEventTarget = function(eventTarget) {\n\n\t\t// On some older browsers (notably Safari on iOS 4.1 - see issue #56) the event target may be a text node.\n\t\tif (eventTarget.nodeType === Node.TEXT_NODE) {\n\t\t\treturn eventTarget.parentNode;\n\t\t}\n\n\t\treturn eventTarget;\n\t};\n\n\n\t/**\n\t * On touch start, record the position and scroll offset.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onTouchStart = function(event) {\n\t\tvar targetElement, touch, selection;\n\n\t\t// Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111).\n\t\tif (event.targetTouches.length > 1) {\n\t\t\treturn true;\n\t\t}\n\n\t\ttargetElement = this.getTargetElementFromEventTarget(event.target);\n\t\ttouch = event.targetTouches[0];\n\n\t\tif (deviceIsIOS) {\n\n\t\t\t// Only trusted events will deselect text on iOS (issue #49)\n\t\t\tselection = window.getSelection();\n\t\t\tif (selection.rangeCount && !selection.isCollapsed) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (!deviceIsIOS4) {\n\n\t\t\t\t// Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23):\n\t\t\t\t// when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched\n\t\t\t\t// with the same identifier as the touch event that previously triggered the click that triggered the alert.\n\t\t\t\t// Sadly, there is an issue on iOS 4 that causes some normal touch events to have the same identifier as an\n\t\t\t\t// immediately preceeding touch event (issue #52), so this fix is unavailable on that platform.\n\t\t\t\t// Issue 120: touch.identifier is 0 when Chrome dev tools 'Emulate touch events' is set with an iOS device UA string,\n\t\t\t\t// which causes all touch events to be ignored. As this block only applies to iOS, and iOS identifiers are always long,\n\t\t\t\t// random integers, it's safe to to continue if the identifier is 0 here.\n\t\t\t\tif (touch.identifier && touch.identifier === this.lastTouchIdentifier) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tthis.lastTouchIdentifier = touch.identifier;\n\n\t\t\t\t// If the target element is a child of a scrollable layer (using -webkit-overflow-scrolling: touch) and:\n\t\t\t\t// 1) the user does a fling scroll on the scrollable layer\n\t\t\t\t// 2) the user stops the fling scroll with another tap\n\t\t\t\t// then the event.target of the last 'touchend' event will be the element that was under the user's finger\n\t\t\t\t// when the fling scroll was started, causing FastClick to send a click event to that layer - unless a check\n\t\t\t\t// is made to ensure that a parent layer was not scrolled before sending a synthetic click (issue #42).\n\t\t\t\tthis.updateScrollParent(targetElement);\n\t\t\t}\n\t\t}\n\n\t\tthis.trackingClick = true;\n\t\tthis.trackingClickStart = event.timeStamp;\n\t\tthis.targetElement = targetElement;\n\n\t\tthis.touchStartX = touch.pageX;\n\t\tthis.touchStartY = touch.pageY;\n\n\t\t// Prevent phantom clicks on fast double-tap (issue #36)\n\t\tif ((event.timeStamp - this.lastClickTime) < this.tapDelay) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\treturn true;\n\t};\n\n\n\t/**\n\t * Based on a touchmove event object, check whether the touch has moved past a boundary since it started.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.touchHasMoved = function(event) {\n\t\tvar touch = event.changedTouches[0], boundary = this.touchBoundary;\n\n\t\tif (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\n\t/**\n\t * Update the last position.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onTouchMove = function(event) {\n\t\tif (!this.trackingClick) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// If the touch has moved, cancel the click tracking\n\t\tif (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) {\n\t\t\tthis.trackingClick = false;\n\t\t\tthis.targetElement = null;\n\t\t}\n\n\t\treturn true;\n\t};\n\n\n\t/**\n\t * Attempt to find the labelled control for the given label element.\n\t *\n\t * @param {EventTarget|HTMLLabelElement} labelElement\n\t * @returns {Element|null}\n\t */\n\tFastClick.prototype.findControl = function(labelElement) {\n\n\t\t// Fast path for newer browsers supporting the HTML5 control attribute\n\t\tif (labelElement.control !== undefined) {\n\t\t\treturn labelElement.control;\n\t\t}\n\n\t\t// All browsers under test that support touch events also support the HTML5 htmlFor attribute\n\t\tif (labelElement.htmlFor) {\n\t\t\treturn document.getElementById(labelElement.htmlFor);\n\t\t}\n\n\t\t// If no for attribute exists, attempt to retrieve the first labellable descendant element\n\t\t// the list of which is defined here: http://www.w3.org/TR/html5/forms.html#category-label\n\t\treturn labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea');\n\t};\n\n\n\t/**\n\t * On touch end, determine whether to send a click event at once.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onTouchEnd = function(event) {\n\t\tvar forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement;\n\n\t\tif (!this.trackingClick) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Prevent phantom clicks on fast double-tap (issue #36)\n\t\tif ((event.timeStamp - this.lastClickTime) < this.tapDelay) {\n\t\t\tthis.cancelNextClick = true;\n\t\t\treturn true;\n\t\t}\n\n\t\tif ((event.timeStamp - this.trackingClickStart) > this.tapTimeout) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Reset to prevent wrong click cancel on input (issue #156).\n\t\tthis.cancelNextClick = false;\n\n\t\tthis.lastClickTime = event.timeStamp;\n\n\t\ttrackingClickStart = this.trackingClickStart;\n\t\tthis.trackingClick = false;\n\t\tthis.trackingClickStart = 0;\n\n\t\t// On some iOS devices, the targetElement supplied with the event is invalid if the layer\n\t\t// is performing a transition or scroll, and has to be re-detected manually. Note that\n\t\t// for this to function correctly, it must be called *after* the event target is checked!\n\t\t// See issue #57; also filed as rdar://13048589 .\n\t\tif (deviceIsIOSWithBadTarget) {\n\t\t\ttouch = event.changedTouches[0];\n\n\t\t\t// In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null\n\t\t\ttargetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement;\n\t\t\ttargetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent;\n\t\t}\n\n\t\ttargetTagName = targetElement.tagName.toLowerCase();\n\t\tif (targetTagName === 'label') {\n\t\t\tforElement = this.findControl(targetElement);\n\t\t\tif (forElement) {\n\t\t\t\tthis.focus(targetElement);\n\t\t\t\tif (deviceIsAndroid) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\ttargetElement = forElement;\n\t\t\t}\n\t\t} else if (this.needsFocus(targetElement)) {\n\n\t\t\t// Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through.\n\t\t\t// Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37).\n\t\t\tif ((event.timeStamp - trackingClickStart) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) {\n\t\t\t\tthis.targetElement = null;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis.focus(targetElement);\n\t\t\tthis.sendClick(targetElement, event);\n\n\t\t\t// Select elements need the event to go through on iOS 4, otherwise the selector menu won't open.\n\t\t\t// Also this breaks opening selects when VoiceOver is active on iOS6, iOS7 (and possibly others)\n\t\t\tif (!deviceIsIOS || targetTagName !== 'select') {\n\t\t\t\tthis.targetElement = null;\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\tif (deviceIsIOS && !deviceIsIOS4) {\n\n\t\t\t// Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled\n\t\t\t// and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42).\n\t\t\tscrollParent = targetElement.fastClickScrollParent;\n\t\t\tif (scrollParent && scrollParent.fastClickLastScrollTop !== scrollParent.scrollTop) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Prevent the actual click from going though - unless the target node is marked as requiring\n\t\t// real clicks or if it is in the whitelist in which case only non-programmatic clicks are permitted.\n\t\tif (!this.needsClick(targetElement)) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.sendClick(targetElement, event);\n\t\t}\n\n\t\treturn false;\n\t};\n\n\n\t/**\n\t * On touch cancel, stop tracking the click.\n\t *\n\t * @returns {void}\n\t */\n\tFastClick.prototype.onTouchCancel = function() {\n\t\tthis.trackingClick = false;\n\t\tthis.targetElement = null;\n\t};\n\n\n\t/**\n\t * Determine mouse events which should be permitted.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onMouse = function(event) {\n\n\t\t// If a target element was never set (because a touch event was never fired) allow the event\n\t\tif (!this.targetElement) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (event.forwardedTouchEvent) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Programmatically generated events targeting a specific element should be permitted\n\t\tif (!event.cancelable) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Derive and check the target element to see whether the mouse event needs to be permitted;\n\t\t// unless explicitly enabled, prevent non-touch click events from triggering actions,\n\t\t// to prevent ghost/doubleclicks.\n\t\tif (!this.needsClick(this.targetElement) || this.cancelNextClick) {\n\n\t\t\t// Prevent any user-added listeners declared on FastClick element from being fired.\n\t\t\tif (event.stopImmediatePropagation) {\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t} else {\n\n\t\t\t\t// Part of the hack for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)\n\t\t\t\tevent.propagationStopped = true;\n\t\t\t}\n\n\t\t\t// Cancel the event\n\t\t\tevent.stopPropagation();\n\t\t\tevent.preventDefault();\n\n\t\t\treturn false;\n\t\t}\n\n\t\t// If the mouse event is permitted, return true for the action to go through.\n\t\treturn true;\n\t};\n\n\n\t/**\n\t * On actual clicks, determine whether this is a touch-generated click, a click action occurring\n\t * naturally after a delay after a touch (which needs to be cancelled to avoid duplication), or\n\t * an actual click which should be permitted.\n\t *\n\t * @param {Event} event\n\t * @returns {boolean}\n\t */\n\tFastClick.prototype.onClick = function(event) {\n\t\tvar permitted;\n\n\t\t// It's possible for another FastClick-like library delivered with third-party code to fire a click event before FastClick does (issue #44). In that case, set the click-tracking flag back to false and return early. This will cause onTouchEnd to return early.\n\t\tif (this.trackingClick) {\n\t\t\tthis.targetElement = null;\n\t\t\tthis.trackingClick = false;\n\t\t\treturn true;\n\t\t}\n\n\t\t// Very odd behaviour on iOS (issue #18): if a submit element is present inside a form and the user hits enter in the iOS simulator or clicks the Go button on the pop-up OS keyboard the a kind of 'fake' click event will be triggered with the submit-type input element as the target.\n\t\tif (event.target.type === 'submit' && event.detail === 0) {\n\t\t\treturn true;\n\t\t}\n\n\t\tpermitted = this.onMouse(event);\n\n\t\t// Only unset targetElement if the click is not permitted. This will ensure that the check for !targetElement in onMouse fails and the browser's click doesn't go through.\n\t\tif (!permitted) {\n\t\t\tthis.targetElement = null;\n\t\t}\n\n\t\t// If clicks are permitted, return true for the action to go through.\n\t\treturn permitted;\n\t};\n\n\n\t/**\n\t * Remove all FastClick's event listeners.\n\t *\n\t * @returns {void}\n\t */\n\tFastClick.prototype.destroy = function() {\n\t\tvar layer = this.layer;\n\n\t\tif (deviceIsAndroid) {\n\t\t\tlayer.removeEventListener('mouseover', this.onMouse, true);\n\t\t\tlayer.removeEventListener('mousedown', this.onMouse, true);\n\t\t\tlayer.removeEventListener('mouseup', this.onMouse, true);\n\t\t}\n\n\t\tlayer.removeEventListener('click', this.onClick, true);\n\t\tlayer.removeEventListener('touchstart', this.onTouchStart, false);\n\t\tlayer.removeEventListener('touchmove', this.onTouchMove, false);\n\t\tlayer.removeEventListener('touchend', this.onTouchEnd, false);\n\t\tlayer.removeEventListener('touchcancel', this.onTouchCancel, false);\n\t};\n\n\n\t/**\n\t * Check whether FastClick is needed.\n\t *\n\t * @param {Element} layer The layer to listen on\n\t */\n\tFastClick.notNeeded = function(layer) {\n\t\tvar metaViewport;\n\t\tvar chromeVersion;\n\t\tvar blackberryVersion;\n\t\tvar firefoxVersion;\n\n\t\t// Devices that don't support touch don't need FastClick\n\t\tif (typeof window.ontouchstart === 'undefined') {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Chrome version - zero for other browsers\n\t\tchromeVersion = +(/Chrome\\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];\n\n\t\tif (chromeVersion) {\n\n\t\t\tif (deviceIsAndroid) {\n\t\t\t\tmetaViewport = document.querySelector('meta[name=viewport]');\n\n\t\t\t\tif (metaViewport) {\n\t\t\t\t\t// Chrome on Android with user-scalable=\"no\" doesn't need FastClick (issue #89)\n\t\t\t\t\tif (metaViewport.content.indexOf('user-scalable=no') !== -1) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t// Chrome 32 and above with width=device-width or less don't need FastClick\n\t\t\t\t\tif (chromeVersion > 31 && document.documentElement.scrollWidth <= window.outerWidth) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Chrome desktop doesn't need FastClick (issue #15)\n\t\t\t} else {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tif (deviceIsBlackBerry10) {\n\t\t\tblackberryVersion = navigator.userAgent.match(/Version\\/([0-9]*)\\.([0-9]*)/);\n\n\t\t\t// BlackBerry 10.3+ does not require Fastclick library.\n\t\t\t// https://github.com/ftlabs/fastclick/issues/251\n\t\t\tif (blackberryVersion[1] >= 10 && blackberryVersion[2] >= 3) {\n\t\t\t\tmetaViewport = document.querySelector('meta[name=viewport]');\n\n\t\t\t\tif (metaViewport) {\n\t\t\t\t\t// user-scalable=no eliminates click delay.\n\t\t\t\t\tif (metaViewport.content.indexOf('user-scalable=no') !== -1) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t// width=device-width (or less than device-width) eliminates click delay.\n\t\t\t\t\tif (document.documentElement.scrollWidth <= window.outerWidth) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// IE10 with -ms-touch-action: none or manipulation, which disables double-tap-to-zoom (issue #97)\n\t\tif (layer.style.msTouchAction === 'none' || layer.style.touchAction === 'manipulation') {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Firefox version - zero for other browsers\n\t\tfirefoxVersion = +(/Firefox\\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];\n\n\t\tif (firefoxVersion >= 27) {\n\t\t\t// Firefox 27+ does not have tap delay if the content is not zoomable - https://bugzilla.mozilla.org/show_bug.cgi?id=922896\n\n\t\t\tmetaViewport = document.querySelector('meta[name=viewport]');\n\t\t\tif (metaViewport && (metaViewport.content.indexOf('user-scalable=no') !== -1 || document.documentElement.scrollWidth <= window.outerWidth)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// IE11: prefixed -ms-touch-action is no longer supported and it's recomended to use non-prefixed version\n\t\t// http://msdn.microsoft.com/en-us/library/windows/apps/Hh767313.aspx\n\t\tif (layer.style.touchAction === 'none' || layer.style.touchAction === 'manipulation') {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\n\t/**\n\t * Factory method for creating a FastClick object\n\t *\n\t * @param {Element} layer The layer to listen on\n\t * @param {Object} [options={}] The options to override the defaults\n\t */\n\tFastClick.attach = function(layer, options) {\n\t\treturn new FastClick(layer, options);\n\t};\n\n\n\tif (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine(function() {\n\t\t\treturn FastClick;\n\t\t});\n\t} else if (typeof module !== 'undefined' && module.exports) {\n\t\tmodule.exports = FastClick.attach;\n\t\tmodule.exports.FastClick = FastClick;\n\t} else {\n\t\twindow.FastClick = FastClick;\n\t}\n}());\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/adminlte/plugins/iCheck/square/blue.css",
    "content": "/* iCheck plugin Square skin, blue\n----------------------------------- */\n.icheckbox_square-blue,\n.iradio_square-blue {\n    display: inline-block;\n    *display: inline;\n    vertical-align: middle;\n    margin: 0;\n    padding: 0;\n    width: 22px;\n    height: 22px;\n    background: url(blue.png) no-repeat;\n    border: none;\n    cursor: pointer;\n}\n\n.icheckbox_square-blue {\n    background-position: 0 0;\n}\n    .icheckbox_square-blue.hover {\n        background-position: -24px 0;\n    }\n    .icheckbox_square-blue.checked {\n        background-position: -48px 0;\n    }\n    .icheckbox_square-blue.disabled {\n        background-position: -72px 0;\n        cursor: default;\n    }\n    .icheckbox_square-blue.checked.disabled {\n        background-position: -96px 0;\n    }\n\n.iradio_square-blue {\n    background-position: -120px 0;\n}\n    .iradio_square-blue.hover {\n        background-position: -144px 0;\n    }\n    .iradio_square-blue.checked {\n        background-position: -168px 0;\n    }\n    .iradio_square-blue.disabled {\n        background-position: -192px 0;\n        cursor: default;\n    }\n    .iradio_square-blue.checked.disabled {\n        background-position: -216px 0;\n    }\n\n/* Retina support */\n@media only screen and (-webkit-min-device-pixel-ratio: 1.5),\n       only screen and (-moz-min-device-pixel-ratio: 1.5),\n       only screen and (-o-min-device-pixel-ratio: 3/2),\n       only screen and (min-device-pixel-ratio: 1.5) {\n    .icheckbox_square-blue,\n    .iradio_square-blue {\n        background-image: url(blue@2x.png);\n        -webkit-background-size: 240px 24px;\n        background-size: 240px 24px;\n    }\n}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/js/common.1.js",
    "content": "$(function(){\n\n\t// logout\n\t$(\"#logoutBtn\").click(function(){\n\t\tlayer.confirm( I18n.logout_confirm , {\n\t\t\ticon: 3,\n\t\t\ttitle: I18n.system_tips ,\n            btn: [ I18n.system_ok, I18n.system_cancel ]\n\t\t}, function(index){\n\t\t\tlayer.close(index);\n\n\t\t\t$.post(base_url + \"/logout\", function(data, status) {\n\t\t\t\tif (data.code == \"200\") {\n                    layer.msg( I18n.logout_success );\n                    setTimeout(function(){\n                        window.location.href = base_url + \"/\";\n                    }, 500);\n\t\t\t\t} else {\n\t\t\t\t\tlayer.open({\n\t\t\t\t\t\ttitle: I18n.system_tips ,\n                        btn: [ I18n.system_ok ],\n\t\t\t\t\t\tcontent: (data.msg || I18n.logout_fail),\n\t\t\t\t\t\ticon: '2'\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t});\n\n\t// slideToTop\n\tvar slideToTop = $(\"<div />\");\n\tslideToTop.html('<i class=\"fa fa-chevron-up\"></i>');\n\tslideToTop.css({\n\t\tposition: 'fixed',\n\t\tbottom: '20px',\n\t\tright: '25px',\n\t\twidth: '40px',\n\t\theight: '40px',\n\t\tcolor: '#eee',\n\t\t'font-size': '',\n\t\t'line-height': '40px',\n\t\t'text-align': 'center',\n\t\t'background-color': '#222d32',\n\t\tcursor: 'pointer',\n\t\t'border-radius': '5px',\n\t\t'z-index': '99999',\n\t\topacity: '.7',\n\t\t'display': 'none'\n\t});\n\tslideToTop.on('mouseenter', function () {\n\t\t$(this).css('opacity', '1');\n\t});\n\tslideToTop.on('mouseout', function () {\n\t\t$(this).css('opacity', '.7');\n\t});\n\t$('.wrapper').append(slideToTop);\n\t$(window).scroll(function () {\n\t\tif ($(window).scrollTop() >= 150) {\n\t\t\tif (!$(slideToTop).is(':visible')) {\n\t\t\t\t$(slideToTop).fadeIn(500);\n\t\t\t}\n\t\t} else {\n\t\t\t$(slideToTop).fadeOut(500);\n\t\t}\n\t});\n\t$(slideToTop).click(function () {\n\t\t$(\"html,body\").animate({\t\t// firefox ie not support body, chrome support body. but found that new version chrome not support body too.\n\t\t\tscrollTop: 0\n\t\t}, 100);\n\t});\n\n\t// left menu status v: js + server + cookie\n\t$('.sidebar-toggle').click(function(){\n\t\tvar xxljob_adminlte_settings = $.cookie('xxljob_adminlte_settings');\t// on=open，off=close\n\t\tif ('off' == xxljob_adminlte_settings) {\n            xxljob_adminlte_settings = 'on';\n\t\t} else {\n            xxljob_adminlte_settings = 'off';\n\t\t}\n\t\t$.cookie('xxljob_adminlte_settings', xxljob_adminlte_settings, { expires: 7 });\t//$.cookie('the_cookie', '', { expires: -1 });\n\t});\n\n\t// left menu status v1: js + cookie\n\t/*\n\t var xxljob_adminlte_settings = $.cookie('xxljob_adminlte_settings');\n\t if (xxljob_adminlte_settings == 'off') {\n\t \t$('body').addClass('sidebar-collapse');\n\t }\n\t */\n\n\n    // update pwd\n    $('#updatePwd').on('click', function(){\n        $('#updatePwdModal').modal({backdrop: false, keyboard: false}).modal('show');\n    });\n    var updatePwdModalValidate = $(\"#updatePwdModal .form\").validate({\n        errorElement : 'span',\n        errorClass : 'help-block',\n        focusInvalid : true,\n        rules : {\n            password : {\n                required : true ,\n                rangelength:[4,50]\n            }\n        },\n        messages : {\n            password : {\n                required : '请输入密码'  ,\n                rangelength : \"密码长度限制为4~50\"\n            }\n        },\n        highlight : function(element) {\n            $(element).closest('.form-group').addClass('has-error');\n        },\n        success : function(label) {\n            label.closest('.form-group').removeClass('has-error');\n            label.remove();\n        },\n        errorPlacement : function(error, element) {\n            element.parent('div').append(error);\n        },\n        submitHandler : function(form) {\n            $.post(base_url + \"/user/updatePwd\",  $(\"#updatePwdModal .form\").serialize(), function(data, status) {\n                if (data.code == 200) {\n                    $('#updatePwdModal').modal('hide');\n\n                    layer.msg( I18n.change_pwd_suc_to_logout );\n                    setTimeout(function(){\n                        $.post(base_url + \"/logout\", function(data, status) {\n                            if (data.code == 200) {\n                                window.location.href = base_url + \"/\";\n                            } else {\n                                layer.open({\n                                    icon: '2',\n                                    content: (data.msg|| I18n.logout_fail)\n                                });\n                            }\n                        });\n                    }, 500);\n                } else {\n                    layer.open({\n                        icon: '2',\n                        content: (data.msg|| I18n.change_pwd + I18n.system_fail )\n                    });\n                }\n            });\n        }\n    });\n    $(\"#updatePwdModal\").on('hide.bs.modal', function () {\n        $(\"#updatePwdModal .form\")[0].reset();\n        updatePwdModalValidate.resetForm();\n        $(\"#updatePwdModal .form .form-group\").removeClass(\"has-error\");\n    });\n\t\n});\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/js/index.js",
    "content": "/**\n * Created by xuxueli on 17/4/24.\n */\n$(function () {\n\n    // filter Time\n    var rangesConf = {};\n    rangesConf[I18n.daterangepicker_ranges_today] = [moment().startOf('day'), moment().endOf('day')];\n    rangesConf[I18n.daterangepicker_ranges_yesterday] = [moment().subtract(1, 'days').startOf('day'), moment().subtract(1, 'days').endOf('day')];\n    rangesConf[I18n.daterangepicker_ranges_this_month] = [moment().startOf('month'), moment().endOf('month')];\n    rangesConf[I18n.daterangepicker_ranges_last_month] = [moment().subtract(1, 'months').startOf('month'), moment().subtract(1, 'months').endOf('month')];\n    rangesConf[I18n.daterangepicker_ranges_recent_week] = [moment().subtract(1, 'weeks').startOf('day'), moment().endOf('day')];\n    rangesConf[I18n.daterangepicker_ranges_recent_month] = [moment().subtract(1, 'months').startOf('day'), moment().endOf('day')];\n\n    $('#filterTime').daterangepicker({\n        autoApply:false,\n        singleDatePicker:false,\n        showDropdowns:false,        // 是否显示年月选择条件\n        timePicker: true, \t\t\t// 是否显示小时和分钟选择条件\n        timePickerIncrement: 10, \t// 时间的增量，单位为分钟\n        timePicker24Hour : true,\n        opens : 'left', //日期选择框的弹出位置\n        ranges: rangesConf,\n        locale : {\n            format: 'YYYY-MM-DD HH:mm:ss',\n            separator : ' - ',\n            customRangeLabel : I18n.daterangepicker_custom_name ,\n            applyLabel : I18n.system_ok ,\n            cancelLabel : I18n.system_cancel ,\n            fromLabel : I18n.daterangepicker_custom_starttime ,\n            toLabel : I18n.daterangepicker_custom_endtime ,\n            daysOfWeek : I18n.daterangepicker_custom_daysofweek.split(',') ,        // '日', '一', '二', '三', '四', '五', '六'\n            monthNames : I18n.daterangepicker_custom_monthnames.split(',') ,        // '一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'\n            firstDay : 1\n        },\n        startDate: rangesConf[I18n.daterangepicker_ranges_recent_week][0] ,\n        endDate: rangesConf[I18n.daterangepicker_ranges_recent_week][1]\n    }, function (start, end, label) {\n        freshChartDate(start, end);\n    });\n    freshChartDate(rangesConf[I18n.daterangepicker_ranges_recent_week][0], rangesConf[I18n.daterangepicker_ranges_recent_week][1]);\n\n    /**\n     * fresh Chart Date\n     *\n     * @param startDate\n     * @param endDate\n     */\n    function freshChartDate(startDate, endDate) {\n        $.ajax({\n            type : 'POST',\n            url : base_url + '/chartInfo',\n            data : {\n                'startDate':startDate.format('YYYY-MM-DD HH:mm:ss'),\n                'endDate':endDate.format('YYYY-MM-DD HH:mm:ss')\n            },\n            dataType : \"json\",\n            success : function(data){\n                if (data.code == 200) {\n                    lineChartInit(data)\n                    pieChartInit(data);\n                } else {\n                    layer.open({\n                        title: I18n.system_tips ,\n                        btn: [ I18n.system_ok ],\n                        content: (data.msg || I18n.job_dashboard_report_loaddata_fail ),\n                        icon: '2'\n                    });\n                }\n            }\n        });\n    }\n\n    /**\n     * line Chart Init\n     */\n    function lineChartInit(data) {\n        var option = {\n               title: {\n                   text: I18n.job_dashboard_date_report\n               },\n               tooltip : {\n                   trigger: 'axis',\n                   axisPointer: {\n                       type: 'cross',\n                       label: {\n                           backgroundColor: '#6a7985'\n                       }\n                   }\n               },\n               legend: {\n                   data:[I18n.joblog_status_suc, I18n.joblog_status_fail, I18n.joblog_status_running]\n               },\n               toolbox: {\n                   feature: {\n                       /*saveAsImage: {}*/\n                   }\n               },\n               grid: {\n                   left: '3%',\n                   right: '4%',\n                   bottom: '3%',\n                   containLabel: true\n               },\n               xAxis : [\n                   {\n                       type : 'category',\n                       boundaryGap : false,\n                       data : data.content.triggerDayList\n                   }\n               ],\n               yAxis : [\n                   {\n                       type : 'value'\n                   }\n               ],\n               series : [\n                   {\n                       name:I18n.joblog_status_suc,\n                       type:'line',\n                       stack: 'Total',\n                       areaStyle: {normal: {}},\n                       data: data.content.triggerDayCountSucList\n                   },\n                   {\n                       name:I18n.joblog_status_fail,\n                       type:'line',\n                       stack: 'Total',\n                       label: {\n                           normal: {\n                               show: true,\n                               position: 'top'\n                           }\n                       },\n                       areaStyle: {normal: {}},\n                       data: data.content.triggerDayCountFailList\n                   },\n                   {\n                       name:I18n.joblog_status_running,\n                       type:'line',\n                       stack: 'Total',\n                       areaStyle: {normal: {}},\n                       data: data.content.triggerDayCountRunningList\n                   }\n               ],\n                color:['#00A65A', '#c23632', '#F39C12']\n        };\n\n        var lineChart = echarts.init(document.getElementById('lineChart'));\n        lineChart.setOption(option);\n    }\n\n    /**\n     * pie Chart Init\n     */\n    function pieChartInit(data) {\n        var option = {\n            title : {\n                text: I18n.job_dashboard_rate_report ,\n                /*subtext: 'subtext',*/\n                x:'center'\n            },\n            tooltip : {\n                trigger: 'item',\n                formatter: \"{b} : {c} ({d}%)\"\n            },\n            legend: {\n                orient: 'vertical',\n                left: 'left',\n                data: [I18n.joblog_status_suc, I18n.joblog_status_fail, I18n.joblog_status_running ]\n            },\n            series : [\n                {\n                    //name: '分布比例',\n                    type: 'pie',\n                    radius : '55%',\n                    center: ['50%', '60%'],\n                    data:[\n                        {\n                            name:I18n.joblog_status_suc,\n                            value:data.content.triggerCountSucTotal\n                        },\n                        {\n                            name:I18n.joblog_status_fail,\n                            value:data.content.triggerCountFailTotal\n                        },\n                        {\n                            name:I18n.joblog_status_running,\n                            value:data.content.triggerCountRunningTotal\n                        }\n                    ],\n                    itemStyle: {\n                        emphasis: {\n                            shadowBlur: 10,\n                            shadowOffsetX: 0,\n                            shadowColor: 'rgba(0, 0, 0, 0.5)'\n                        }\n                    }\n                }\n            ],\n            color:['#00A65A', '#c23632', '#F39C12']\n        };\n        var pieChart = echarts.init(document.getElementById('pieChart'));\n        pieChart.setOption(option);\n    }\n\n});\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/js/jobcode.index.1.js",
    "content": "$(function() {\n\n\t// init code editor\n\tvar codeEditor;\n\tfunction initIde(glueSource) {\n\t\tif (codeEditor == null) {\n            codeEditor = CodeMirror(document.getElementById(\"ideWindow\"), {\n                mode : ideMode,\n                lineNumbers : true,\n                matchBrackets : true,\n                value: glueSource\n            });\n\t\t} else {\n            codeEditor.setValue(glueSource);\n\t\t}\n\t}\n\n\tinitIde($(\"#version_now\").val());\n\n\t// code change\n\t$(\".source_version\").click(function(){\n\t\tvar sourceId = $(this).attr('version');\n\t\tvar temp = $( \"#\" + sourceId ).val();\n\n\t\t//codeEditor.setValue('');\n\t\tinitIde(temp);\n\t});\n\n\t// code source save\n\t$(\"#save\").click(function() {\n\t\t$('#saveModal').modal({backdrop: false, keyboard: false}).modal('show');\n\t});\n\n\t$(\"#saveModal .ok\").click(function() {\n\n\t\tvar glueSource = codeEditor.getValue();\n\t\tvar glueRemark = $(\"#glueRemark\").val();\n\t\t\n\t\tif (!glueRemark) {\n\t\t\tlayer.open({\n\t\t\t\ttitle: I18n.system_tips,\n                btn: [ I18n.system_ok],\n\t\t\t\tcontent: I18n.system_please_input + I18n.jobinfo_glue_remark ,\n\t\t\t\ticon: '2'\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (glueRemark.length <4 || glueRemark.length > 100) {\n\t\t\tlayer.open({\n\t\t\t\ttitle: I18n.system_tips ,\n                btn: [ I18n.system_ok ],\n\t\t\t\tcontent: I18n.jobinfo_glue_remark_limit ,\n\t\t\t\ticon: '2'\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t$.ajax({\n\t\t\ttype : 'POST',\n\t\t\turl : base_url + '/jobcode/save',\n\t\t\tdata : {\n\t\t\t\t'id' : id,\n\t\t\t\t'glueSource' : glueSource,\n\t\t\t\t'glueRemark' : glueRemark\n\t\t\t},\n\t\t\tdataType : \"json\",\n\t\t\tsuccess : function(data){\n\t\t\t\tif (data.code == 200) {\n\t\t\t\t\tlayer.open({\n\t\t\t\t\t\ttitle: I18n.system_tips,\n                        btn: [ I18n.system_ok ],\n\t\t\t\t\t\tcontent: (I18n.system_save + I18n.system_success) ,\n\t\t\t\t\t\ticon: '1',\n\t\t\t\t\t\tend: function(layero, index){\n\t\t\t\t\t\t\t//$(window).unbind('beforeunload');\n\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tlayer.open({\n\t\t\t\t\t\ttitle: I18n.system_tips,\n                        btn: [ I18n.system_ok ],\n\t\t\t\t\t\tcontent: (data.msg || (I18n.system_save + I18n.system_fail) ),\n\t\t\t\t\t\ticon: '2'\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t});\n\t\n\t// before upload\n\t/*$(window).bind('beforeunload',function(){\n\t\treturn 'Glue尚未保存，确定离开Glue编辑器？';\n\t});*/\n\t\n});\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/js/jobgroup.index.1.js",
    "content": "$(function() {\n\n\t// init date tables\n\tvar jobGroupTable = $(\"#jobgroup_list\").dataTable({\n\t\t\"deferRender\": true,\n\t\t\"processing\" : true,\n\t\t\"serverSide\": true,\n\t\t\"ajax\": {\n\t\t\turl: base_url + \"/jobgroup/pageList\",\n\t\t\ttype:\"post\",\n\t\t\tdata : function ( d ) {\n\t\t\t\tvar obj = {};\n\t\t\t\tobj.appname = $('#appname').val();\n\t\t\t\tobj.title = $('#title').val();\n\t\t\t\tobj.start = d.start;\n\t\t\t\tobj.length = d.length;\n\t\t\t\treturn obj;\n\t\t\t}\n\t\t},\n\t\t\"searching\": false,\n\t\t\"ordering\": false,\n\t\t//\"scrollX\": true,\t// scroll x，close self-adaption\n\t\t\"columns\": [\n\t\t\t{\n\t\t\t\t\"data\": 'id',\n\t\t\t\t\"visible\" : false\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"data\": 'appname',\n\t\t\t\t\"visible\" : true,\n\t\t\t\t\"width\":'30%'\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"data\": 'title',\n\t\t\t\t\"visible\" : true,\n\t\t\t\t\"width\":'30%'\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"data\": 'addressType',\n\t\t\t\t\"width\":'10%',\n\t\t\t\t\"visible\" : true,\n\t\t\t\t\"render\": function ( data, type, row ) {\n\t\t\t\t\tif (row.addressType == 0) {\n\t\t\t\t\t\treturn I18n.jobgroup_field_addressType_0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn I18n.jobgroup_field_addressType_1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"data\": 'registryList',\n\t\t\t\t\"width\":'15%',\n\t\t\t\t\"visible\" : true,\n\t\t\t\t\"render\": function ( data, type, row ) {\n\t\t\t\t\treturn row.registryList\n\t\t\t\t\t\t?'<a class=\"show_registryList\" href=\"javascript:;\" _id=\"'+ row.id +'\" >'\n\t\t\t\t\t\t\t+ I18n.system_show +' ( ' + row.registryList.length+ ' ）</a>'\n\t\t\t\t\t\t:I18n.system_empty;\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"data\": I18n.system_opt ,\n\t\t\t\t\"width\":'15%',\n\t\t\t\t\"render\": function ( data, type, row ) {\n\t\t\t\t\treturn function(){\n\t\t\t\t\t\t// data\n\t\t\t\t\t\ttableData['key'+row.id] = row;\n\n\t\t\t\t\t\t// opt\n\t\t\t\t\t\tvar html = '<div class=\"btn-group\">\\n' +\n\t\t\t\t\t\t\t'     <button type=\"button\" class=\"btn btn-primary btn-sm\">'+ I18n.system_opt +'</button>\\n' +\n\t\t\t\t\t\t\t'     <button type=\"button\" class=\"btn btn-primary btn-sm dropdown-toggle\" data-toggle=\"dropdown\">\\n' +\n\t\t\t\t\t\t\t'       <span class=\"caret\"></span>\\n' +\n\t\t\t\t\t\t\t'       <span class=\"sr-only\">Toggle Dropdown</span>\\n' +\n\t\t\t\t\t\t\t'     </button>\\n' +\n\t\t\t\t\t\t\t'     <ul class=\"dropdown-menu\" role=\"menu\" _id=\"'+ row.id +'\" >\\n' +\n\t\t\t\t\t\t\t'       <li><a href=\"javascript:void(0);\" class=\"opt_edit\" >'+ I18n.system_opt_edit +'</a></li>\\n' +\n\t\t\t\t\t\t\t'       <li><a href=\"javascript:void(0);\" class=\"opt_del\" >'+ I18n.system_opt_del +'</a></li>\\n' +\n\t\t\t\t\t\t\t'     </ul>\\n' +\n\t\t\t\t\t\t\t'   </div>';\n\n\t\t\t\t\t\treturn html;\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t],\n\t\t\"language\" : {\n\t\t\t\"sProcessing\" : I18n.dataTable_sProcessing ,\n\t\t\t\"sLengthMenu\" : I18n.dataTable_sLengthMenu ,\n\t\t\t\"sZeroRecords\" : I18n.dataTable_sZeroRecords ,\n\t\t\t\"sInfo\" : I18n.dataTable_sInfo ,\n\t\t\t\"sInfoEmpty\" : I18n.dataTable_sInfoEmpty ,\n\t\t\t\"sInfoFiltered\" : I18n.dataTable_sInfoFiltered ,\n\t\t\t\"sInfoPostFix\" : \"\",\n\t\t\t\"sSearch\" : I18n.dataTable_sSearch ,\n\t\t\t\"sUrl\" : \"\",\n\t\t\t\"sEmptyTable\" : I18n.dataTable_sEmptyTable ,\n\t\t\t\"sLoadingRecords\" : I18n.dataTable_sLoadingRecords ,\n\t\t\t\"sInfoThousands\" : \",\",\n\t\t\t\"oPaginate\" : {\n\t\t\t\t\"sFirst\" : I18n.dataTable_sFirst ,\n\t\t\t\t\"sPrevious\" : I18n.dataTable_sPrevious ,\n\t\t\t\t\"sNext\" : I18n.dataTable_sNext ,\n\t\t\t\t\"sLast\" : I18n.dataTable_sLast\n\t\t\t},\n\t\t\t\"oAria\" : {\n\t\t\t\t\"sSortAscending\" : I18n.dataTable_sSortAscending ,\n\t\t\t\t\"sSortDescending\" : I18n.dataTable_sSortDescending\n\t\t\t}\n\t\t}\n\t});\n\n\t// table data\n\tvar tableData = {};\n\n\t// search btn\n\t$('#searchBtn').on('click', function(){\n\t\tjobGroupTable.fnDraw();\n\t});\n\n\t// job registryinfo\n\t$(\"#jobgroup_list\").on('click', '.show_registryList',function() {\n\t\tvar id = $(this).attr(\"_id\");\n\t\tvar row = tableData['key'+id];\n\n\t\t/*var html = '<div>';\n\t\tif (row.registryList) {\n\t\t\tfor (var index in row.registryList) {\n\t\t\t\thtml += (parseInt(index)+1) + '. <span class=\"badge bg-green\" >' + row.registryList[index] + '</span><br>';\n\t\t\t}\n\t\t}\n\t\thtml += '</div>';\n\n\t\tlayer.open({\n\t\t\ttitle: I18n.jobinfo_opt_registryinfo ,\n\t\t\tbtn: [ I18n.system_ok ],\n\t\t\tcontent: html\n\t\t});*/\n\n\t\tvar html = '<table class=\"table table-bordered\"><tbody>';\n\t\tif (row.registryList) {\n\t\t\tfor (var index in row.registryList) {\n\t\t\t\thtml += '<tr><th>' + (parseInt(index)+1) + '</th>';\n\t\t\t\thtml += '<th><span class=\"badge bg-green\" >' + row.registryList[index] + '</span></th><tr>';\n\t\t\t}\n\t\t}\n\t\thtml += '</tbody></table>';\n\n\t\t$('#showRegistryListModal .data').html(html);\n\t\t$('#showRegistryListModal').modal({backdrop: false, keyboard: false}).modal('show');\n\t});\n\n\n\t// opt_del\n\t$(\"#jobgroup_list\").on('click', '.opt_del',function() {\n\t\tvar id = $(this).parents('ul').attr(\"_id\");\n\n\t\tlayer.confirm( (I18n.system_ok + I18n.jobgroup_del + '？') , {\n\t\t\ticon: 3,\n\t\t\ttitle: I18n.system_tips ,\n\t\t\tbtn: [ I18n.system_ok, I18n.system_cancel ]\n\t\t}, function(index){\n\t\t\tlayer.close(index);\n\n\t\t\t$.ajax({\n\t\t\t\ttype : 'POST',\n\t\t\t\turl : base_url + '/jobgroup/remove',\n\t\t\t\tdata : {\"id\":id},\n\t\t\t\tdataType : \"json\",\n\t\t\t\tsuccess : function(data){\n\t\t\t\t\tif (data.code == 200) {\n\t\t\t\t\t\tlayer.open({\n\t\t\t\t\t\t\ttitle: I18n.system_tips ,\n\t\t\t\t\t\t\tbtn: [ I18n.system_ok ],\n\t\t\t\t\t\t\tcontent: (I18n.jobgroup_del + I18n.system_success),\n\t\t\t\t\t\t\ticon: '1',\n\t\t\t\t\t\t\tend: function(layero, index){\n\t\t\t\t\t\t\t\tjobGroupTable.fnDraw();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlayer.open({\n\t\t\t\t\t\t\ttitle: I18n.system_tips,\n\t\t\t\t\t\t\tbtn: [ I18n.system_ok ],\n\t\t\t\t\t\t\tcontent: (data.msg || (I18n.jobgroup_del + I18n.system_fail)),\n\t\t\t\t\t\t\ticon: '2'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\t});\n\n\n\t// jquery.validate “low letters start, limit contants、 letters、numbers and line-through.”\n\tjQuery.validator.addMethod(\"myValid01\", function(value, element) {\n\t\tvar length = value.length;\n\t\tvar valid = /^[a-z][a-zA-Z0-9-]*$/;\n\t\treturn this.optional(element) || valid.test(value);\n\t}, I18n.jobgroup_field_appname_limit );\n\n\t$('.add').on('click', function(){\n\t\t$('#addModal').modal({backdrop: false, keyboard: false}).modal('show');\n\t});\n\tvar addModalValidate = $(\"#addModal .form\").validate({\n\t\terrorElement : 'span',\n\t\terrorClass : 'help-block',\n\t\tfocusInvalid : true,\n\t\trules : {\n\t\t\tappname : {\n\t\t\t\trequired : true,\n\t\t\t\trangelength:[4,64],\n\t\t\t\tmyValid01 : true\n\t\t\t},\n\t\t\ttitle : {\n\t\t\t\trequired : true,\n\t\t\t\trangelength:[4, 12]\n\t\t\t}\n\t\t},\n\t\tmessages : {\n\t\t\tappname : {\n\t\t\t\trequired : I18n.system_please_input+\"AppName\",\n\t\t\t\trangelength: I18n.jobgroup_field_appname_length ,\n\t\t\t\tmyValid01: I18n.jobgroup_field_appname_limit\n\t\t\t},\n\t\t\ttitle : {\n\t\t\t\trequired : I18n.system_please_input + I18n.jobgroup_field_title ,\n\t\t\t\trangelength: I18n.jobgroup_field_title_length\n\t\t\t}\n\t\t},\n\t\thighlight : function(element) {\n\t\t\t$(element).closest('.form-group').addClass('has-error');\n\t\t},\n\t\tsuccess : function(label) {\n\t\t\tlabel.closest('.form-group').removeClass('has-error');\n\t\t\tlabel.remove();\n\t\t},\n\t\terrorPlacement : function(error, element) {\n\t\t\telement.parent('div').append(error);\n\t\t},\n\t\tsubmitHandler : function(form) {\n\t\t\t$.post(base_url + \"/jobgroup/save\",  $(\"#addModal .form\").serialize(), function(data, status) {\n\t\t\t\tif (data.code == \"200\") {\n\t\t\t\t\t$('#addModal').modal('hide');\n\t\t\t\t\tlayer.open({\n\t\t\t\t\t\ttitle: I18n.system_tips ,\n                        btn: [ I18n.system_ok ],\n\t\t\t\t\t\tcontent: I18n.system_add_suc ,\n\t\t\t\t\t\ticon: '1',\n\t\t\t\t\t\tend: function(layero, index){\n\t\t\t\t\t\t\tjobGroupTable.fnDraw();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tlayer.open({\n\t\t\t\t\t\ttitle: I18n.system_tips,\n                        btn: [ I18n.system_ok ],\n\t\t\t\t\t\tcontent: (data.msg || I18n.system_add_fail  ),\n\t\t\t\t\t\ticon: '2'\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t$(\"#addModal\").on('hide.bs.modal', function () {\n\t\t$(\"#addModal .form\")[0].reset();\n\t\taddModalValidate.resetForm();\n\t\t$(\"#addModal .form .form-group\").removeClass(\"has-error\");\n\t});\n\n\t// addressType change\n\t$(\"#addModal input[name=addressType], #updateModal input[name=addressType]\").click(function(){\n\t\tvar addressType = $(this).val();\n\t\tvar $addressList = $(this).parents(\"form\").find(\"textarea[name=addressList]\");\n\t\tif (addressType == 0) {\n            $addressList.css(\"background-color\", \"#eee\");\t// 自动注册\n            $addressList.attr(\"readonly\",\"readonly\");\n\t\t\t$addressList.val(\"\");\n\t\t} else {\n            $addressList.css(\"background-color\", \"white\");\n\t\t\t$addressList.removeAttr(\"readonly\");\n\t\t}\n\t});\n\n\t// opt_edit\n\t$(\"#jobgroup_list\").on('click', '.opt_edit',function() {\n\t\tvar id = $(this).parents('ul').attr(\"_id\");\n\t\tvar row = tableData['key'+id];\n\n\t\t$(\"#updateModal .form input[name='id']\").val( row.id );\n\t\t$(\"#updateModal .form input[name='appname']\").val( row.appname );\n\t\t$(\"#updateModal .form input[name='title']\").val( row.title );\n\n\t\t// 注册方式\n\t\t$(\"#updateModal .form input[name='addressType']\").removeAttr('checked');\n\t\t$(\"#updateModal .form input[name='addressType'][value='\"+ row.addressType +\"']\").click();\n\t\t// 机器地址\n\t\t$(\"#updateModal .form textarea[name='addressList']\").val( row.addressList );\n\n\t\t$('#updateModal').modal({backdrop: false, keyboard: false}).modal('show');\n\t});\n\tvar updateModalValidate = $(\"#updateModal .form\").validate({\n\t\terrorElement : 'span',\n\t\terrorClass : 'help-block',\n\t\tfocusInvalid : true,\n\t\trules : {\n\t\t\tappname : {\n\t\t\t\trequired : true,\n\t\t\t\trangelength:[4,64],\n\t\t\t\tmyValid01 : true\n\t\t\t},\n\t\t\ttitle : {\n\t\t\t\trequired : true,\n\t\t\t\trangelength:[4, 12]\n\t\t\t}\n\t\t},\n\t\tmessages : {\n\t\t\tappname : {\n                required : I18n.system_please_input+\"AppName\",\n                rangelength: I18n.jobgroup_field_appname_length ,\n                myValid01: I18n.jobgroup_field_appname_limit\n            },\n            title : {\n                required : I18n.system_please_input + I18n.jobgroup_field_title ,\n                rangelength: I18n.jobgroup_field_title_length\n            }\n\t\t},\n\t\thighlight : function(element) {\n\t\t\t$(element).closest('.form-group').addClass('has-error');\n\t\t},\n\t\tsuccess : function(label) {\n\t\t\tlabel.closest('.form-group').removeClass('has-error');\n\t\t\tlabel.remove();\n\t\t},\n\t\terrorPlacement : function(error, element) {\n\t\t\telement.parent('div').append(error);\n\t\t},\n\t\tsubmitHandler : function(form) {\n\t\t\t$.post(base_url + \"/jobgroup/update\",  $(\"#updateModal .form\").serialize(), function(data, status) {\n\t\t\t\tif (data.code == \"200\") {\n\t\t\t\t\t$('#updateModal').modal('hide');\n\n\t\t\t\t\tlayer.open({\n\t\t\t\t\t\ttitle: I18n.system_tips ,\n                        btn: [ I18n.system_ok ],\n\t\t\t\t\t\tcontent: I18n.system_update_suc ,\n\t\t\t\t\t\ticon: '1',\n\t\t\t\t\t\tend: function(layero, index){\n\t\t\t\t\t\t\tjobGroupTable.fnDraw();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tlayer.open({\n\t\t\t\t\t\ttitle: I18n.system_tips,\n                        btn: [ I18n.system_ok ],\n\t\t\t\t\t\tcontent: (data.msg || I18n.system_update_fail  ),\n\t\t\t\t\t\ticon: '2'\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t$(\"#updateModal\").on('hide.bs.modal', function () {\n\t\t$(\"#updateModal .form\")[0].reset();\n\t\taddModalValidate.resetForm();\n\t\t$(\"#updateModal .form .form-group\").removeClass(\"has-error\");\n\t});\n\n\t\n});\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/js/jobinfo.index.1.js",
    "content": "$(function() {\n\n\t// init date tables\n\tvar jobTable = $(\"#job_list\").dataTable({\n\t\t\"deferRender\": true,\n\t\t\"processing\" : true,\n\t    \"serverSide\": true,\n\t\t\"ajax\": {\n\t\t\turl: base_url + \"/jobinfo/pageList\",\n\t\t\ttype:\"post\",\n\t        data : function ( d ) {\n\t        \tvar obj = {};\n\t        \tobj.jobGroup = $('#jobGroup').val();\n                obj.triggerStatus = $('#triggerStatus').val();\n                obj.jobDesc = $('#jobDesc').val();\n\t        \tobj.executorHandler = $('#executorHandler').val();\n                obj.author = $('#author').val();\n\t        \tobj.start = d.start;\n\t        \tobj.length = d.length;\n                return obj;\n            }\n\t    },\n\t    \"searching\": false,\n\t    \"ordering\": false,\n\t    //\"scrollX\": true,\t// scroll x，close self-adaption\n\t    \"columns\": [\n\t                {\n\t                \t\"data\": 'id',\n\t\t\t\t\t\t\"bSortable\": false,\n\t\t\t\t\t\t\"visible\" : true,\n\t\t\t\t\t\t\"width\":'7%'\n\t\t\t\t\t},\n\t                {\n\t                \t\"data\": 'jobGroup',\n\t                \t\"visible\" : false,\n\t                \t\"render\": function ( data, type, row ) {\n\t            \t\t\tvar groupMenu = $(\"#jobGroup\").find(\"option\");\n\t            \t\t\tfor ( var index in $(\"#jobGroup\").find(\"option\")) {\n\t            \t\t\t\tif ($(groupMenu[index]).attr('value') == data) {\n\t\t\t\t\t\t\t\t\treturn $(groupMenu[index]).html();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t            \t\t\treturn data;\n\t            \t\t}\n            \t\t},\n\t                {\n\t                \t\"data\": 'jobDesc',\n\t\t\t\t\t\t\"visible\" : true,\n\t\t\t\t\t\t\"width\":'25%'\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"data\": 'scheduleType',\n\t\t\t\t\t\t\"visible\" : true,\n\t\t\t\t\t\t\"width\":'13%',\n\t\t\t\t\t\t\"render\": function ( data, type, row ) {\n\t\t\t\t\t\t\tif (row.scheduleConf) {\n\t\t\t\t\t\t\t\treturn row.scheduleType + '：'+ row.scheduleConf;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treturn row.scheduleType;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"data\": 'glueType',\n\t\t\t\t\t\t\"width\":'25%',\n\t\t\t\t\t\t\"visible\" : true,\n\t\t\t\t\t\t\"render\": function ( data, type, row ) {\n\t\t\t\t\t\t\tvar glueTypeTitle = findGlueTypeTitle(row.glueType);\n                            if (row.executorHandler) {\n                                return glueTypeTitle +\"：\" + row.executorHandler;\n                            } else {\n                                return glueTypeTitle;\n                            }\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t                { \"data\": 'executorParam', \"visible\" : false},\n\t                {\n\t                \t\"data\": 'addTime',\n\t                \t\"visible\" : false,\n\t                \t\"render\": function ( data, type, row ) {\n\t                \t\treturn data?moment(new Date(data)).format(\"YYYY-MM-DD HH:mm:ss\"):\"\";\n\t                \t}\n\t                },\n\t                {\n\t                \t\"data\": 'updateTime',\n\t                \t\"visible\" : false,\n\t                \t\"render\": function ( data, type, row ) {\n\t                \t\treturn data?moment(new Date(data)).format(\"YYYY-MM-DD HH:mm:ss\"):\"\";\n\t                \t}\n\t                },\n\t                { \"data\": 'author', \"visible\" : true, \"width\":'10%'},\n\t                { \"data\": 'alarmEmail', \"visible\" : false},\n\t                {\n\t                \t\"data\": 'triggerStatus',\n\t\t\t\t\t\t\"width\":'10%',\n\t                \t\"visible\" : true,\n\t                \t\"render\": function ( data, type, row ) {\n                            // status\n                            if (1 == data) {\n                                return '<small class=\"label label-success\" >RUNNING</small>';\n                            } else {\n                                return '<small class=\"label label-default\" >STOP</small>';\n                            }\n\t                \t\treturn data;\n\t                \t}\n\t                },\n\t                {\n\t\t\t\t\t\t\"data\": I18n.system_opt ,\n\t\t\t\t\t\t\"width\":'10%',\n\t                \t\"render\": function ( data, type, row ) {\n\t                \t\treturn function(){\n\n                                // status\n                                var start_stop_div = \"\";\n                                if (1 == row.triggerStatus ) {\n                                    start_stop_div = '<li><a href=\"javascript:void(0);\" class=\"job_operate\" _type=\"job_pause\" >'+ I18n.jobinfo_opt_stop +'</a></li>\\n';\n                                } else {\n                                    start_stop_div = '<li><a href=\"javascript:void(0);\" class=\"job_operate\" _type=\"job_resume\" >'+ I18n.jobinfo_opt_start +'</a></li>\\n';\n                                }\n\n                                // job_next_time_html\n\t\t\t\t\t\t\t\tvar job_next_time_html = '';\n\t\t\t\t\t\t\t\tif (row.scheduleType == 'CRON' || row.scheduleType == 'FIX_RATE') {\n\t\t\t\t\t\t\t\t\tjob_next_time_html = '<li><a href=\"javascript:void(0);\" class=\"job_next_time\" >' + I18n.jobinfo_opt_next_time + '</a></li>\\n';\n\t\t\t\t\t\t\t\t}\n\n                                // log url\n                                var logHref = base_url +'/joblog?jobId='+ row.id;\n\n                                // code url\n                                var codeBtn = \"\";\n                                if ('BEAN' != row.glueType) {\n                                    var codeUrl = base_url +'/jobcode?jobId='+ row.id;\n                                    codeBtn = '<li><a href=\"'+ codeUrl +'\" target=\"_blank\" >GLUE IDE</a></li>\\n';\n                                    codeBtn += '<li class=\"divider\"></li>\\n';\n                                }\n\n                                // data\n                                tableData['key'+row.id] = row;\n\n                                // opt\n                                var html = '<div class=\"btn-group\">\\n' +\n                                    '     <button type=\"button\" class=\"btn btn-primary btn-sm\">'+ I18n.system_opt +'</button>\\n' +\n                                    '     <button type=\"button\" class=\"btn btn-primary btn-sm dropdown-toggle\" data-toggle=\"dropdown\">\\n' +\n                                    '       <span class=\"caret\"></span>\\n' +\n                                    '       <span class=\"sr-only\">Toggle Dropdown</span>\\n' +\n                                    '     </button>\\n' +\n                                    '     <ul class=\"dropdown-menu\" role=\"menu\" _id=\"'+ row.id +'\" >\\n' +\n                                    '       <li><a href=\"javascript:void(0);\" class=\"job_trigger\" >'+ I18n.jobinfo_opt_run +'</a></li>\\n' +\n                                    '       <li><a href=\"'+ logHref +'\">'+ I18n.jobinfo_opt_log +'</a></li>\\n' +\n                                    '       <li><a href=\"javascript:void(0);\" class=\"job_registryinfo\" >' + I18n.jobinfo_opt_registryinfo + '</a></li>\\n' +\n\t\t\t\t\t\t\t\t\tjob_next_time_html +\n                                    '       <li class=\"divider\"></li>\\n' +\n                                    codeBtn +\n                                    start_stop_div +\n                                    '       <li><a href=\"javascript:void(0);\" class=\"update\" >'+ I18n.system_opt_edit +'</a></li>\\n' +\n                                    '       <li><a href=\"javascript:void(0);\" class=\"job_operate\" _type=\"job_del\" >'+ I18n.system_opt_del +'</a></li>\\n' +\n\t\t\t\t\t\t\t\t\t'       <li><a href=\"javascript:void(0);\" class=\"job_copy\" >'+ I18n.system_opt_copy +'</a></li>\\n' +\n                                    '     </ul>\\n' +\n                                    '   </div>';\n\n\t                \t\t\treturn html;\n\t\t\t\t\t\t\t};\n\t                \t}\n\t                }\n\t            ],\n\t\t\"language\" : {\n\t\t\t\"sProcessing\" : I18n.dataTable_sProcessing ,\n\t\t\t\"sLengthMenu\" : I18n.dataTable_sLengthMenu ,\n\t\t\t\"sZeroRecords\" : I18n.dataTable_sZeroRecords ,\n\t\t\t\"sInfo\" : I18n.dataTable_sInfo ,\n\t\t\t\"sInfoEmpty\" : I18n.dataTable_sInfoEmpty ,\n\t\t\t\"sInfoFiltered\" : I18n.dataTable_sInfoFiltered ,\n\t\t\t\"sInfoPostFix\" : \"\",\n\t\t\t\"sSearch\" : I18n.dataTable_sSearch ,\n\t\t\t\"sUrl\" : \"\",\n\t\t\t\"sEmptyTable\" : I18n.dataTable_sEmptyTable ,\n\t\t\t\"sLoadingRecords\" : I18n.dataTable_sLoadingRecords ,\n\t\t\t\"sInfoThousands\" : \",\",\n\t\t\t\"oPaginate\" : {\n\t\t\t\t\"sFirst\" : I18n.dataTable_sFirst ,\n\t\t\t\t\"sPrevious\" : I18n.dataTable_sPrevious ,\n\t\t\t\t\"sNext\" : I18n.dataTable_sNext ,\n\t\t\t\t\"sLast\" : I18n.dataTable_sLast\n\t\t\t},\n\t\t\t\"oAria\" : {\n\t\t\t\t\"sSortAscending\" : I18n.dataTable_sSortAscending ,\n\t\t\t\t\"sSortDescending\" : I18n.dataTable_sSortDescending\n\t\t\t}\n\t\t}\n\t});\n\n    // table data\n    var tableData = {};\n\n\t// search btn\n\t$('#searchBtn').on('click', function(){\n\t\tjobTable.fnDraw();\n\t});\n\n\t// jobGroup change\n\t$('#jobGroup').on('change', function(){\n        //reload\n        var jobGroup = $('#jobGroup').val();\n        window.location.href = base_url + \"/jobinfo?jobGroup=\" + jobGroup;\n    });\n\n\t// job operate\n\t$(\"#job_list\").on('click', '.job_operate',function() {\n\t\tvar typeName;\n\t\tvar url;\n\t\tvar needFresh = false;\n\n\t\tvar type = $(this).attr(\"_type\");\n\t\tif (\"job_pause\" == type) {\n\t\t\ttypeName = I18n.jobinfo_opt_stop ;\n\t\t\turl = base_url + \"/jobinfo/stop\";\n\t\t\tneedFresh = true;\n\t\t} else if (\"job_resume\" == type) {\n\t\t\ttypeName = I18n.jobinfo_opt_start ;\n\t\t\turl = base_url + \"/jobinfo/start\";\n\t\t\tneedFresh = true;\n\t\t} else if (\"job_del\" == type) {\n\t\t\ttypeName = I18n.system_opt_del ;\n\t\t\turl = base_url + \"/jobinfo/remove\";\n\t\t\tneedFresh = true;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tvar id = $(this).parents('ul').attr(\"_id\");\n\n\t\tlayer.confirm( I18n.system_ok + typeName + '?', {\n\t\t\ticon: 3,\n\t\t\ttitle: I18n.system_tips ,\n            btn: [ I18n.system_ok, I18n.system_cancel ]\n\t\t}, function(index){\n\t\t\tlayer.close(index);\n\n\t\t\t$.ajax({\n\t\t\t\ttype : 'POST',\n\t\t\t\turl : url,\n\t\t\t\tdata : {\n\t\t\t\t\t\"id\" : id\n\t\t\t\t},\n\t\t\t\tdataType : \"json\",\n\t\t\t\tsuccess : function(data){\n\t\t\t\t\tif (data.code == 200) {\n                        layer.msg( typeName + I18n.system_success );\n                        if (needFresh) {\n                            //window.location.reload();\n                            jobTable.fnDraw(false);\n                        }\n\t\t\t\t\t} else {\n                        layer.msg( data.msg || typeName + I18n.system_fail );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t});\n\n    // job trigger\n    $(\"#job_list\").on('click', '.job_trigger',function() {\n        var id = $(this).parents('ul').attr(\"_id\");\n        var row = tableData['key'+id];\n\n        $(\"#jobTriggerModal .form input[name='id']\").val( row.id );\n        $(\"#jobTriggerModal .form textarea[name='executorParam']\").val( row.executorParam );\n\n        $('#jobTriggerModal').modal({backdrop: false, keyboard: false}).modal('show');\n    });\n    $(\"#jobTriggerModal .ok\").on('click',function() {\n        $.ajax({\n            type : 'POST',\n            url : base_url + \"/jobinfo/trigger\",\n            data : {\n                \"id\" : $(\"#jobTriggerModal .form input[name='id']\").val(),\n                \"executorParam\" : $(\"#jobTriggerModal .textarea[name='executorParam']\").val(),\n\t\t\t\t\"addressList\" : $(\"#jobTriggerModal .textarea[name='addressList']\").val()\n            },\n            dataType : \"json\",\n            success : function(data){\n                if (data.code == 200) {\n                    $('#jobTriggerModal').modal('hide');\n\n                    layer.msg( I18n.jobinfo_opt_run + I18n.system_success );\n                } else {\n                    layer.msg( data.msg || I18n.jobinfo_opt_run + I18n.system_fail );\n                }\n            }\n        });\n    });\n    $(\"#jobTriggerModal\").on('hide.bs.modal', function () {\n        $(\"#jobTriggerModal .form\")[0].reset();\n    });\n\n\n    // job registryinfo\n    $(\"#job_list\").on('click', '.job_registryinfo',function() {\n        var id = $(this).parents('ul').attr(\"_id\");\n        var row = tableData['key'+id];\n\n        var jobGroup = row.jobGroup;\n\n        $.ajax({\n            type : 'POST',\n            url : base_url + \"/jobgroup/loadById\",\n            data : {\n                \"id\" : jobGroup\n            },\n            dataType : \"json\",\n            success : function(data){\n\n                var html = '<div>';\n                if (data.code == 200 && data.content.registryList) {\n                    for (var index in data.content.registryList) {\n                        html += (parseInt(index)+1) + '. <span class=\"badge bg-green\" >' + data.content.registryList[index] + '</span><br>';\n                    }\n                }\n                html += '</div>';\n\n                layer.open({\n                    title: I18n.jobinfo_opt_registryinfo ,\n                    btn: [ I18n.system_ok ],\n                    content: html\n                });\n\n            }\n        });\n\n    });\n\n    // job_next_time\n    $(\"#job_list\").on('click', '.job_next_time',function() {\n        var id = $(this).parents('ul').attr(\"_id\");\n        var row = tableData['key'+id];\n\n        $.ajax({\n            type : 'POST',\n            url : base_url + \"/jobinfo/nextTriggerTime\",\n            data : {\n                \"scheduleType\" : row.scheduleType,\n\t\t\t\t\"scheduleConf\" : row.scheduleConf\n            },\n            dataType : \"json\",\n            success : function(data){\n\n            \tif (data.code != 200) {\n                    layer.open({\n                        title: I18n.jobinfo_opt_next_time ,\n                        btn: [ I18n.system_ok ],\n                        content: data.msg\n                    });\n\t\t\t\t} else {\n                    var html = '<center>';\n                    if (data.code == 200 && data.content) {\n                        for (var index in data.content) {\n                            html += '<span>' + data.content[index] + '</span><br>';\n                        }\n                    }\n                    html += '</center>';\n\n                    layer.open({\n                        title: I18n.jobinfo_opt_next_time ,\n                        btn: [ I18n.system_ok ],\n                        content: html\n                    });\n\t\t\t\t}\n\n            }\n        });\n\n    });\n\n\t// add\n\t$(\".add\").click(function(){\n\n\t\t// init-cronGen\n        $(\"#addModal .form input[name='schedule_conf_CRON']\").show().siblings().remove();\n        $(\"#addModal .form input[name='schedule_conf_CRON']\").cronGen({});\n\n\t\t// 》init scheduleType\n\t\t$(\"#updateModal .form select[name=scheduleType]\").change();\n\n\t\t// 》init glueType\n\t\t$(\"#updateModal .form select[name=glueType]\").change();\n\n\t\t$('#addModal').modal({backdrop: false, keyboard: false}).modal('show');\n\t});\n\tvar addModalValidate = $(\"#addModal .form\").validate({\n\t\terrorElement : 'span',\n        errorClass : 'help-block',\n        focusInvalid : true,\n        rules : {\n\t\t\tjobDesc : {\n\t\t\t\trequired : true,\n\t\t\t\tmaxlength: 50\n\t\t\t},\n\t\t\tauthor : {\n\t\t\t\trequired : true\n\t\t\t}/*,\n            executorTimeout : {\n                digits:true\n            },\n            executorFailRetryCount : {\n                digits:true\n            }*/\n        },\n        messages : {\n            jobDesc : {\n            \trequired : I18n.system_please_input + I18n.jobinfo_field_jobdesc\n            },\n            author : {\n            \trequired : I18n.system_please_input + I18n.jobinfo_field_author\n            }/*,\n            executorTimeout : {\n                digits: I18n.system_please_input + I18n.system_digits\n            },\n            executorFailRetryCount : {\n                digits: I18n.system_please_input + I18n.system_digits\n            }*/\n        },\n\t\thighlight : function(element) {\n            $(element).closest('.form-group').addClass('has-error');\n        },\n        success : function(label) {\n            label.closest('.form-group').removeClass('has-error');\n            label.remove();\n        },\n        errorPlacement : function(error, element) {\n            element.parent('div').append(error);\n        },\n        submitHandler : function(form) {\n\n\t\t\t// process executorTimeout+executorFailRetryCount\n            var executorTimeout = $(\"#addModal .form input[name='executorTimeout']\").val();\n            if(!/^\\d+$/.test(executorTimeout)) {\n                executorTimeout = 0;\n\t\t\t}\n            $(\"#addModal .form input[name='executorTimeout']\").val(executorTimeout);\n            var executorFailRetryCount = $(\"#addModal .form input[name='executorFailRetryCount']\").val();\n            if(!/^\\d+$/.test(executorFailRetryCount)) {\n                executorFailRetryCount = 0;\n            }\n            $(\"#addModal .form input[name='executorFailRetryCount']\").val(executorFailRetryCount);\n\n            // process schedule_conf\n\t\t\tvar scheduleType = $(\"#addModal .form select[name='scheduleType']\").val();\n\t\t\tvar scheduleConf;\n\t\t\tif (scheduleType == 'CRON') {\n\t\t\t\tscheduleConf = $(\"#addModal .form input[name='cronGen_display']\").val();\n\t\t\t} else if (scheduleType == 'FIX_RATE') {\n\t\t\t\tscheduleConf = $(\"#addModal .form input[name='schedule_conf_FIX_RATE']\").val();\n\t\t\t} else if (scheduleType == 'FIX_DELAY') {\n\t\t\t\tscheduleConf = $(\"#addModal .form input[name='schedule_conf_FIX_DELAY']\").val();\n\t\t\t}\n\t\t\t$(\"#addModal .form input[name='scheduleConf']\").val( scheduleConf );\n\n        \t$.post(base_url + \"/jobinfo/add\",  $(\"#addModal .form\").serialize(), function(data, status) {\n    \t\t\tif (data.code == \"200\") {\n\t\t\t\t\t$('#addModal').modal('hide');\n\t\t\t\t\tlayer.open({\n\t\t\t\t\t\ttitle: I18n.system_tips ,\n                        btn: [ I18n.system_ok ],\n\t\t\t\t\t\tcontent: I18n.system_add_suc ,\n\t\t\t\t\t\ticon: '1',\n\t\t\t\t\t\tend: function(layero, index){\n\t\t\t\t\t\t\tjobTable.fnDraw();\n\t\t\t\t\t\t\t//window.location.reload();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n    \t\t\t} else {\n\t\t\t\t\tlayer.open({\n\t\t\t\t\t\ttitle: I18n.system_tips ,\n                        btn: [ I18n.system_ok ],\n\t\t\t\t\t\tcontent: (data.msg || I18n.system_add_fail),\n\t\t\t\t\t\ticon: '2'\n\t\t\t\t\t});\n    \t\t\t}\n    \t\t});\n\t\t}\n\t});\n\t$(\"#addModal\").on('hide.bs.modal', function () {\n        addModalValidate.resetForm();\n\t\t$(\"#addModal .form\")[0].reset();\n\t\t$(\"#addModal .form .form-group\").removeClass(\"has-error\");\n\t\t$(\".remote_panel\").show();\t// remote\n\n\t\t$(\"#addModal .form input[name='executorHandler']\").removeAttr(\"readonly\");\n\t});\n\n\t// scheduleType change\n\t$(\".scheduleType\").change(function(){\n\t\tvar scheduleType = $(this).val();\n\t\t$(this).parents(\"form\").find(\".schedule_conf\").hide();\n\t\t$(this).parents(\"form\").find(\".schedule_conf_\" + scheduleType).show();\n\n\t});\n\n    // glueType change\n    $(\".glueType\").change(function(){\n\t\t// executorHandler\n        var $executorHandler = $(this).parents(\"form\").find(\"input[name='executorHandler']\");\n        var glueType = $(this).val();\n        if ('BEAN' != glueType) {\n            $executorHandler.val(\"\");\n            $executorHandler.attr(\"readonly\",\"readonly\");\n        } else {\n            $executorHandler.removeAttr(\"readonly\");\n        }\n    });\n\n\t$(\"#addModal .glueType\").change(function(){\n\t\t// glueSource\n\t\tvar glueType = $(this).val();\n\t\tif ('GLUE_GROOVY'==glueType){\n\t\t\t$(\"#addModal .form textarea[name='glueSource']\").val( $(\"#addModal .form .glueSource_java\").val() );\n\t\t} else if ('GLUE_SHELL'==glueType){\n\t\t\t$(\"#addModal .form textarea[name='glueSource']\").val( $(\"#addModal .form .glueSource_shell\").val() );\n\t\t} else if ('GLUE_PYTHON'==glueType){\n\t\t\t$(\"#addModal .form textarea[name='glueSource']\").val( $(\"#addModal .form .glueSource_python\").val() );\n\t\t} else if ('GLUE_PHP'==glueType){\n            $(\"#addModal .form textarea[name='glueSource']\").val( $(\"#addModal .form .glueSource_php\").val() );\n        } else if ('GLUE_NODEJS'==glueType){\n\t\t\t$(\"#addModal .form textarea[name='glueSource']\").val( $(\"#addModal .form .glueSource_nodejs\").val() );\n\t\t} else if ('GLUE_POWERSHELL'==glueType){\n            $(\"#addModal .form textarea[name='glueSource']\").val( $(\"#addModal .form .glueSource_powershell\").val() );\n        } else {\n            $(\"#addModal .form textarea[name='glueSource']\").val(\"\");\n\t\t}\n\t});\n\n\t// update\n\t$(\"#job_list\").on('click', '.update',function() {\n\n        var id = $(this).parents('ul').attr(\"_id\");\n        var row = tableData['key'+id];\n\n\t\t// fill base\n\t\t$(\"#updateModal .form input[name='id']\").val( row.id );\n\t\t$('#updateModal .form select[name=jobGroup] option[value='+ row.jobGroup +']').prop('selected', true);\n\t\t$(\"#updateModal .form input[name='jobDesc']\").val( row.jobDesc );\n\t\t$(\"#updateModal .form input[name='author']\").val( row.author );\n\t\t$(\"#updateModal .form input[name='alarmEmail']\").val( row.alarmEmail );\n\n\t\t// fill trigger\n\t\t$('#updateModal .form select[name=scheduleType] option[value='+ row.scheduleType +']').prop('selected', true);\n\t\t$(\"#updateModal .form input[name='scheduleConf']\").val( row.scheduleConf );\n\t\tif (row.scheduleType == 'CRON') {\n\t\t\t$(\"#updateModal .form input[name='schedule_conf_CRON']\").val( row.scheduleConf );\n\t\t} else if (row.scheduleType == 'FIX_RATE') {\n\t\t\t$(\"#updateModal .form input[name='schedule_conf_FIX_RATE']\").val( row.scheduleConf );\n\t\t} else if (row.scheduleType == 'FIX_DELAY') {\n\t\t\t$(\"#updateModal .form input[name='schedule_conf_FIX_DELAY']\").val( row.scheduleConf );\n\t\t}\n\n\t\t// 》init scheduleType\n\t\t$(\"#updateModal .form select[name=scheduleType]\").change();\n\n\t\t// fill job\n\t\t$('#updateModal .form select[name=glueType] option[value='+ row.glueType +']').prop('selected', true);\n\t\t$(\"#updateModal .form input[name='executorHandler']\").val( row.executorHandler );\n\t\t$(\"#updateModal .form textarea[name='executorParam']\").val( row.executorParam );\n\n\t\t// 》init glueType\n\t\t$(\"#updateModal .form select[name=glueType]\").change();\n\n\t\t// 》init-cronGen\n\t\t$(\"#updateModal .form input[name='schedule_conf_CRON']\").show().siblings().remove();\n\t\t$(\"#updateModal .form input[name='schedule_conf_CRON']\").cronGen({});\n\n\t\t// fill advanced\n\t\t$('#updateModal .form select[name=executorRouteStrategy] option[value='+ row.executorRouteStrategy +']').prop('selected', true);\n\t\t$(\"#updateModal .form input[name='childJobId']\").val( row.childJobId );\n\t\t$('#updateModal .form select[name=misfireStrategy] option[value='+ row.misfireStrategy +']').prop('selected', true);\n\t\t$('#updateModal .form select[name=executorBlockStrategy] option[value='+ row.executorBlockStrategy +']').prop('selected', true);\n\t\t$(\"#updateModal .form input[name='executorTimeout']\").val( row.executorTimeout );\n        $(\"#updateModal .form input[name='executorFailRetryCount']\").val( row.executorFailRetryCount );\n\n\t\t// show\n\t\t$('#updateModal').modal({backdrop: false, keyboard: false}).modal('show');\n\t});\n\tvar updateModalValidate = $(\"#updateModal .form\").validate({\n\t\terrorElement : 'span',\n        errorClass : 'help-block',\n        focusInvalid : true,\n\n\t\trules : {\n\t\t\tjobDesc : {\n\t\t\t\trequired : true,\n\t\t\t\tmaxlength: 50\n\t\t\t},\n\t\t\tauthor : {\n\t\t\t\trequired : true\n\t\t\t}\n\t\t},\n\t\tmessages : {\n\t\t\tjobDesc : {\n                required : I18n.system_please_input + I18n.jobinfo_field_jobdesc\n\t\t\t},\n\t\t\tauthor : {\n\t\t\t\trequired : I18n.system_please_input + I18n.jobinfo_field_author\n\t\t\t}\n\t\t},\n\t\thighlight : function(element) {\n            $(element).closest('.form-group').addClass('has-error');\n        },\n        success : function(label) {\n            label.closest('.form-group').removeClass('has-error');\n            label.remove();\n        },\n        errorPlacement : function(error, element) {\n            element.parent('div').append(error);\n        },\n        submitHandler : function(form) {\n\n            // process executorTimeout + executorFailRetryCount\n            var executorTimeout = $(\"#updateModal .form input[name='executorTimeout']\").val();\n            if(!/^\\d+$/.test(executorTimeout)) {\n                executorTimeout = 0;\n            }\n            $(\"#updateModal .form input[name='executorTimeout']\").val(executorTimeout);\n            var executorFailRetryCount = $(\"#updateModal .form input[name='executorFailRetryCount']\").val();\n            if(!/^\\d+$/.test(executorFailRetryCount)) {\n                executorFailRetryCount = 0;\n            }\n            $(\"#updateModal .form input[name='executorFailRetryCount']\").val(executorFailRetryCount);\n\n\n\t\t\t// process schedule_conf\n\t\t\tvar scheduleType = $(\"#updateModal .form select[name='scheduleType']\").val();\n\t\t\tvar scheduleConf;\n\t\t\tif (scheduleType == 'CRON') {\n\t\t\t\tscheduleConf = $(\"#updateModal .form input[name='cronGen_display']\").val();\n\t\t\t} else if (scheduleType == 'FIX_RATE') {\n\t\t\t\tscheduleConf = $(\"#updateModal .form input[name='schedule_conf_FIX_RATE']\").val();\n\t\t\t} else if (scheduleType == 'FIX_DELAY') {\n\t\t\t\tscheduleConf = $(\"#updateModal .form input[name='schedule_conf_FIX_DELAY']\").val();\n\t\t\t}\n\t\t\t$(\"#updateModal .form input[name='scheduleConf']\").val( scheduleConf );\n\n\t\t\t// post\n    \t\t$.post(base_url + \"/jobinfo/update\", $(\"#updateModal .form\").serialize(), function(data, status) {\n    \t\t\tif (data.code == \"200\") {\n\t\t\t\t\t$('#updateModal').modal('hide');\n\t\t\t\t\tlayer.open({\n\t\t\t\t\t\ttitle: I18n.system_tips ,\n                        btn: [ I18n.system_ok ],\n\t\t\t\t\t\tcontent: I18n.system_update_suc ,\n\t\t\t\t\t\ticon: '1',\n\t\t\t\t\t\tend: function(layero, index){\n\t\t\t\t\t\t\t//window.location.reload();\n\t\t\t\t\t\t\tjobTable.fnDraw();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n    \t\t\t} else {\n\t\t\t\t\tlayer.open({\n\t\t\t\t\t\ttitle: I18n.system_tips ,\n                        btn: [ I18n.system_ok ],\n\t\t\t\t\t\tcontent: (data.msg || I18n.system_update_fail ),\n\t\t\t\t\t\ticon: '2'\n\t\t\t\t\t});\n    \t\t\t}\n    \t\t});\n\t\t}\n\t});\n\t$(\"#updateModal\").on('hide.bs.modal', function () {\n        updateModalValidate.resetForm();\n        $(\"#updateModal .form\")[0].reset();\n        $(\"#updateModal .form .form-group\").removeClass(\"has-error\");\n\t});\n\n    /**\n\t * find title by name, GlueType\n     */\n\tfunction findGlueTypeTitle(glueType) {\n\t\tvar glueTypeTitle;\n        $(\"#addModal .form select[name=glueType] option\").each(function () {\n            var name = $(this).val();\n            var title = $(this).text();\n            if (glueType == name) {\n                glueTypeTitle = title;\n                return false\n            }\n        });\n        return glueTypeTitle;\n    }\n\n    // job_copy\n\t$(\"#job_list\").on('click', '.job_copy',function() {\n\n\t\tvar id = $(this).parents('ul').attr(\"_id\");\n\t\tvar row = tableData['key'+id];\n\n\t\t// fill base\n\t\t$('#addModal .form select[name=jobGroup] option[value='+ row.jobGroup +']').prop('selected', true);\n\t\t$(\"#addModal .form input[name='jobDesc']\").val( row.jobDesc );\n\t\t$(\"#addModal .form input[name='author']\").val( row.author );\n\t\t$(\"#addModal .form input[name='alarmEmail']\").val( row.alarmEmail );\n\n\t\t// fill trigger\n\t\t$('#addModal .form select[name=scheduleType] option[value='+ row.scheduleType +']').prop('selected', true);\n\t\t$(\"#addModal .form input[name='scheduleConf']\").val( row.scheduleConf );\n\t\tif (row.scheduleType == 'CRON') {\n\t\t\t$(\"#addModal .form input[name='schedule_conf_CRON']\").val( row.scheduleConf );\n\t\t} else if (row.scheduleType == 'FIX_RATE') {\n\t\t\t$(\"#addModal .form input[name='schedule_conf_FIX_RATE']\").val( row.scheduleConf );\n\t\t} else if (row.scheduleType == 'FIX_DELAY') {\n\t\t\t$(\"#addModal .form input[name='schedule_conf_FIX_DELAY']\").val( row.scheduleConf );\n\t\t}\n\n\t\t// 》init scheduleType\n\t\t$(\"#addModal .form select[name=scheduleType]\").change();\n\n\t\t// fill job\n\t\t$('#addModal .form select[name=glueType] option[value='+ row.glueType +']').prop('selected', true);\n\t\t$(\"#addModal .form input[name='executorHandler']\").val( row.executorHandler );\n\t\t$(\"#addModal .form textarea[name='executorParam']\").val( row.executorParam );\n\n\t\t// 》init glueType\n\t\t$(\"#addModal .form select[name=glueType]\").change();\n\n\t\t// 》init-cronGen\n\t\t$(\"#addModal .form input[name='schedule_conf_CRON']\").show().siblings().remove();\n\t\t$(\"#addModal .form input[name='schedule_conf_CRON']\").cronGen({});\n\n\t\t// fill advanced\n\t\t$('#addModal .form select[name=executorRouteStrategy] option[value='+ row.executorRouteStrategy +']').prop('selected', true);\n\t\t$(\"#addModal .form input[name='childJobId']\").val( row.childJobId );\n\t\t$('#addModal .form select[name=misfireStrategy] option[value='+ row.misfireStrategy +']').prop('selected', true);\n\t\t$('#addModal .form select[name=executorBlockStrategy] option[value='+ row.executorBlockStrategy +']').prop('selected', true);\n\t\t$(\"#addModal .form input[name='executorTimeout']\").val( row.executorTimeout );\n\t\t$(\"#addModal .form input[name='executorFailRetryCount']\").val( row.executorFailRetryCount );\n\n\t\t// show\n\t\t$('#addModal').modal({backdrop: false, keyboard: false}).modal('show');\n\t});\n\n});\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/js/joblog.detail.1.js",
    "content": "$(function() {\n\n    // trigger fail, end\n    if ( !(triggerCode == 200 || handleCode != 0) ) {\n        $('#logConsoleRunning').hide();\n        $('#logConsole').append('<span style=\"color: red;\">'+ I18n.joblog_rolling_log_triggerfail +'</span>');\n        return;\n    }\n\n    // pull log\n    var fromLineNum = 1;    // [from, to], start as 1\n    var pullFailCount = 0;\n    function pullLog() {\n        // pullFailCount, max=20\n        if (pullFailCount++ > 20) {\n            logRunStop('<span style=\"color: red;\">'+ I18n.joblog_rolling_log_failoften +'</span>');\n            return;\n        }\n\n        // load\n        console.log(\"pullLog, fromLineNum:\" + fromLineNum);\n\n        $.ajax({\n            type : 'POST',\n            async: false,   // sync, make log ordered\n            url : base_url + '/joblog/logDetailCat',\n            data : {\n                \"logId\":logId,\n                \"fromLineNum\":fromLineNum\n            },\n            dataType : \"json\",\n            success : function(data){\n\n                if (data.code == 200) {\n                    if (!data.content) {\n                        console.log('pullLog fail');\n                        return;\n                    }\n                    if (fromLineNum != data.content.fromLineNum) {\n                        console.log('pullLog fromLineNum not match');\n                        return;\n                    }\n                    if (fromLineNum > data.content.toLineNum ) {\n                        console.log('pullLog already line-end');\n\n                        // valid end\n                        if (data.content.end) {\n                            logRunStop('<br><span style=\"color: green;\">[Rolling Log Finish]</span>');\n                            return;\n                        }\n\n                        return;\n                    }\n\n                    // append content\n                    fromLineNum = data.content.toLineNum + 1;\n                    $('#logConsole').append(data.content.logContent);\n                    pullFailCount = 0;\n\n                    // scroll to bottom\n                    scrollTo(0, document.body.scrollHeight);        // $('#logConsolePre').scrollTop( document.body.scrollHeight + 300 );\n\n                } else {\n                    console.log('pullLog fail:'+data.msg);\n                }\n            }\n        });\n    }\n\n    // pull first page\n    pullLog();\n\n    // handler already callback, end\n    if (handleCode > 0) {\n        logRunStop('<br><span style=\"color: green;\">[Load Log Finish]</span>');\n        return;\n    }\n\n    // round until end\n    var logRun = setInterval(function () {\n        pullLog()\n    }, 3000);\n    function logRunStop(content){\n        $('#logConsoleRunning').hide();\n        logRun = window.clearInterval(logRun);\n        $('#logConsole').append(content);\n    }\n\n});\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/js/joblog.index.1.js",
    "content": "$(function() {\n\n\t// jobGroup change, job list init and select\n\t$(\"#jobGroup\").on(\"change\", function () {\n\t\tvar jobGroup = $(this).children('option:selected').val();\n\t\t$.ajax({\n\t\t\ttype : 'POST',\n            async: false,   // async, avoid js invoke pagelist before jobId data init\n\t\t\turl : base_url + '/joblog/getJobsByGroup',\n\t\t\tdata : {\"jobGroup\":jobGroup},\n\t\t\tdataType : \"json\",\n\t\t\tsuccess : function(data){\n\t\t\t\tif (data.code == 200) {\n\t\t\t\t\t$(\"#jobId\").html( '<option value=\"0\" >'+ I18n.system_all +'</option>' );\n\t\t\t\t\t$.each(data.content, function (n, value) {\n                        $(\"#jobId\").append('<option value=\"' + value.id + '\" >' + value.jobDesc + '</option>');\n                    });\n                    if ($(\"#jobId\").attr(\"paramVal\")){\n                        $(\"#jobId\").find(\"option[value='\" + $(\"#jobId\").attr(\"paramVal\") + \"']\").attr(\"selected\",true);\n                    }\n\t\t\t\t} else {\n\t\t\t\t\tlayer.open({\n\t\t\t\t\t\ttitle: I18n.system_tips ,\n                        btn: [ I18n.system_ok ],\n\t\t\t\t\t\tcontent: (data.msg || I18n.system_api_error ),\n\t\t\t\t\t\ticon: '2'\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t});\n\tif ($(\"#jobGroup\").attr(\"paramVal\")){\n\t\t$(\"#jobGroup\").find(\"option[value='\" + $(\"#jobGroup\").attr(\"paramVal\") + \"']\").attr(\"selected\",true);\n        $(\"#jobGroup\").change();\n\t}\n\n\t// filter Time\n    var rangesConf = {};\n    rangesConf[I18n.daterangepicker_ranges_recent_hour] = [moment().subtract(1, 'hours'), moment()];\n    rangesConf[I18n.daterangepicker_ranges_today] = [moment().startOf('day'), moment().endOf('day')];\n    rangesConf[I18n.daterangepicker_ranges_yesterday] = [moment().subtract(1, 'days').startOf('day'), moment().subtract(1, 'days').endOf('day')];\n    rangesConf[I18n.daterangepicker_ranges_this_month] = [moment().startOf('month'), moment().endOf('month')];\n    rangesConf[I18n.daterangepicker_ranges_last_month] = [moment().subtract(1, 'months').startOf('month'), moment().subtract(1, 'months').endOf('month')];\n    rangesConf[I18n.daterangepicker_ranges_recent_week] = [moment().subtract(1, 'weeks').startOf('day'), moment().endOf('day')];\n    rangesConf[I18n.daterangepicker_ranges_recent_month] = [moment().subtract(1, 'months').startOf('day'), moment().endOf('day')];\n\n\t$('#filterTime').daterangepicker({\n        autoApply:false,\n        singleDatePicker:false,\n        showDropdowns:false,        // 是否显示年月选择条件\n\t\ttimePicker: true, \t\t\t// 是否显示小时和分钟选择条件\n\t\ttimePickerIncrement: 10, \t// 时间的增量，单位为分钟\n        timePicker24Hour : true,\n        opens : 'left', //日期选择框的弹出位置\n\t\tranges: rangesConf,\n        locale : {\n            format: 'YYYY-MM-DD HH:mm:ss',\n            separator : ' - ',\n            customRangeLabel : I18n.daterangepicker_custom_name ,\n            applyLabel : I18n.system_ok ,\n            cancelLabel : I18n.system_cancel ,\n            fromLabel : I18n.daterangepicker_custom_starttime ,\n            toLabel : I18n.daterangepicker_custom_endtime ,\n            daysOfWeek : I18n.daterangepicker_custom_daysofweek.split(',') ,        // '日', '一', '二', '三', '四', '五', '六'\n            monthNames : I18n.daterangepicker_custom_monthnames.split(',') ,        // '一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'\n            firstDay : 1\n        },\n        startDate: rangesConf[I18n.daterangepicker_ranges_today][0],\n        endDate: rangesConf[I18n.daterangepicker_ranges_today][1]\n\t});\n\n\t// init date tables\n\tvar logTable = $(\"#joblog_list\").dataTable({\n\t\t\"deferRender\": true,\n\t\t\"processing\" : true, \n\t    \"serverSide\": true,\n\t\t\"ajax\": {\n\t        url: base_url + \"/joblog/pageList\" ,\n            type:\"post\",\n\t        data : function ( d ) {\n\t        \tvar obj = {};\n\t        \tobj.jobGroup = $('#jobGroup').val();\n\t        \tobj.jobId = $('#jobId').val();\n                obj.logStatus = $('#logStatus').val();\n\t\t\t\tobj.filterTime = $('#filterTime').val();\n\t        \tobj.start = d.start;\n\t        \tobj.length = d.length;\n                return obj;\n            }\n\t    },\n\t    \"searching\": false,\n\t    \"ordering\": false,\n\t    //\"scrollX\": false,\n\t    \"columns\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"data\": 'jobId',\n\t\t\t\t\t\t\"visible\" : true,\n                        \"width\":'10%',\n\t\t\t\t\t\t\"render\": function ( data, type, row ) {\n\n\t\t\t\t\t\t\tvar jobhandler = '';\n                            if (row.executorHandler) {\n                                jobhandler = \"<br>JobHandler：\" + row.executorHandler;\n                            }\n\n\t\t\t\t\t\t\tvar temp = '';\n\t\t\t\t\t\t\ttemp += I18n.joblog_field_executorAddress + '：' + (row.executorAddress?row.executorAddress:'');\n\t\t\t\t\t\t\ttemp += jobhandler;\n\t\t\t\t\t\t\ttemp += '<br>'+ I18n.jobinfo_field_executorparam +'：' + row.executorParam;\n\n\t\t\t\t\t\t\treturn '<a class=\"logTips\" href=\"javascript:;\" >'+ row.jobId +'<span style=\"display:none;\">'+ temp +'</span></a>';\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{ \"data\": 'jobGroup', \"visible\" : false},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"data\": 'triggerTime',\n                        \"width\":'20%',\n\t\t\t\t\t\t\"render\": function ( data, type, row ) {\n\t\t\t\t\t\t\treturn data?moment(data).format(\"YYYY-MM-DD HH:mm:ss\"):\"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"data\": 'triggerCode',\n                        \"width\":'10%',\n\t\t\t\t\t\t\"render\": function ( data, type, row ) {\n\t\t\t\t\t\t\tvar html = data;\n\t\t\t\t\t\t\tif (data == 200) {\n\t\t\t\t\t\t\t\thtml = '<span style=\"color: green\">'+ I18n.system_success +'</span>';\n\t\t\t\t\t\t\t} else if (data == 500) {\n\t\t\t\t\t\t\t\thtml = '<span style=\"color: red\">'+ I18n.system_fail +'</span>';\n\t\t\t\t\t\t\t} else if (data == 0) {\n                                html = '';\n\t\t\t\t\t\t\t}\n                            return html;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"data\": 'triggerMsg',\n                        \"width\":'10%',\n\t\t\t\t\t\t\"render\": function ( data, type, row ) {\n\t\t\t\t\t\t\treturn data?'<a class=\"logTips\" href=\"javascript:;\" >'+ I18n.system_show +'<span style=\"display:none;\">'+ data +'</span></a>':I18n.system_empty;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t                { \n\t                \t\"data\": 'handleTime',\n                        \"width\":'20%',\n\t                \t\"render\": function ( data, type, row ) {\n\t                \t\treturn data?moment(data).format(\"YYYY-MM-DD HH:mm:ss\"):\"\";\n\t                \t}\n\t                },\n\t                {\n\t\t\t\t\t\t\"data\": 'handleCode',\n                        \"width\":'10%',\n\t\t\t\t\t\t\"render\": function ( data, type, row ) {\n                            var html = data;\n                            if (data == 200) {\n                                html = '<span style=\"color: green\">'+ I18n.joblog_handleCode_200 +'</span>';\n                            } else if (data == 500) {\n                                html = '<span style=\"color: red\">'+ I18n.joblog_handleCode_500 +'</span>';\n                            } else if (data == 502) {\n                                html = '<span style=\"color: red\">'+ I18n.joblog_handleCode_502 +'</span>';\n                            } else if (data == 0) {\n                                html = '';\n                            }\n                            return html;\n\t\t\t\t\t\t}\n\t                },\n\t                { \n\t                \t\"data\": 'handleMsg',\n                        \"width\":'10%',\n\t                \t\"render\": function ( data, type, row ) {\n\t                \t\treturn data?'<a class=\"logTips\" href=\"javascript:;\" >'+ I18n.system_show +'<span style=\"display:none;\">'+ data +'</span></a>':I18n.system_empty;\n\t                \t}\n\t                },\n\t                {\n\t\t\t\t\t\t\"data\": 'handleMsg' ,\n\t\t\t\t\t\t\"bSortable\": false,\n                        \"width\":'10%',\n\t                \t\"render\": function ( data, type, row ) {\n\t                \t\t// better support expression or string, not function\n\t                \t\treturn function () {\n\t\t                \t\tif (row.triggerCode == 200 || row.handleCode != 0){\n\n\t\t                \t\t\t/*var temp = '<a href=\"javascript:;\" class=\"logDetail\" _id=\"'+ row.id +'\">'+ I18n.joblog_rolling_log +'</a>';\n\t\t                \t\t\tif(row.handleCode == 0){\n\t\t                \t\t\t\ttemp += '<br><a href=\"javascript:;\" class=\"logKill\" _id=\"'+ row.id +'\" style=\"color: red;\" >'+ I18n.joblog_kill_log +'</a>';\n\t\t                \t\t\t}*/\n\t\t                \t\t\t//return temp;\n\n\t\t\t\t\t\t\t\t\tvar logKillDiv = '';\n\t\t\t\t\t\t\t\t\tif(row.handleCode == 0){\n\t\t\t\t\t\t\t\t\t\tlogKillDiv = '       <li class=\"divider\"></li>\\n' +\n\t\t\t\t\t\t\t\t\t\t\t'       <li><a href=\"javascript:void(0);\" class=\"logKill\" _id=\"'+ row.id +'\" >'+ I18n.joblog_kill_log +'</a></li>\\n';\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tvar html = '<div class=\"btn-group\">\\n' +\n\t\t\t\t\t\t\t\t\t\t'     <button type=\"button\" class=\"btn btn-primary btn-sm\">'+ I18n.system_opt +'</button>\\n' +\n\t\t\t\t\t\t\t\t\t\t'     <button type=\"button\" class=\"btn btn-primary btn-sm dropdown-toggle\" data-toggle=\"dropdown\">\\n' +\n\t\t\t\t\t\t\t\t\t\t'       <span class=\"caret\"></span>\\n' +\n\t\t\t\t\t\t\t\t\t\t'       <span class=\"sr-only\">Toggle Dropdown</span>\\n' +\n\t\t\t\t\t\t\t\t\t\t'     </button>\\n' +\n\t\t\t\t\t\t\t\t\t\t'     <ul class=\"dropdown-menu\" role=\"menu\" _id=\"'+ row.id +'\" >\\n' +\n\t\t\t\t\t\t\t\t\t\t'       <li><a href=\"javascript:void(0);\" class=\"logDetail\" _id=\"'+ row.id +'\" >'+ I18n.joblog_rolling_log +'</a></li>\\n' +\n\t\t\t\t\t\t\t\t\t\tlogKillDiv +\n\t\t\t\t\t\t\t\t\t\t'     </ul>\\n' +\n\t\t\t\t\t\t\t\t\t\t'   </div>';\n\n\t\t                \t\t\treturn html;\n\t\t                \t\t}\n\t\t                \t\treturn null;\t\n\t                \t\t}\n\t                \t}\n\t                }\n\t            ],\n        \"language\" : {\n            \"sProcessing\" : I18n.dataTable_sProcessing ,\n            \"sLengthMenu\" : I18n.dataTable_sLengthMenu ,\n            \"sZeroRecords\" : I18n.dataTable_sZeroRecords ,\n            \"sInfo\" : I18n.dataTable_sInfo ,\n            \"sInfoEmpty\" : I18n.dataTable_sInfoEmpty ,\n            \"sInfoFiltered\" : I18n.dataTable_sInfoFiltered ,\n            \"sInfoPostFix\" : \"\",\n            \"sSearch\" : I18n.dataTable_sSearch ,\n            \"sUrl\" : \"\",\n            \"sEmptyTable\" : I18n.dataTable_sEmptyTable ,\n            \"sLoadingRecords\" : I18n.dataTable_sLoadingRecords ,\n            \"sInfoThousands\" : \",\",\n            \"oPaginate\" : {\n                \"sFirst\" : I18n.dataTable_sFirst ,\n                \"sPrevious\" : I18n.dataTable_sPrevious ,\n                \"sNext\" : I18n.dataTable_sNext ,\n                \"sLast\" : I18n.dataTable_sLast\n            },\n            \"oAria\" : {\n                \"sSortAscending\" : I18n.dataTable_sSortAscending ,\n                \"sSortDescending\" : I18n.dataTable_sSortDescending\n            }\n        }\n\t});\n    logTable.on('xhr.dt',function(e, settings, json, xhr) {\n        if (json.code && json.code != 200) {\n            layer.msg( json.msg || I18n.system_api_error );\n        }\n    });\n\t\n\t// logTips alert\n\t$('#joblog_list').on('click', '.logTips', function(){\n\t\tvar msg = $(this).find('span').html();\n\t\tComAlertTec.show(msg);\n\t});\n\t\n\t// search Btn\n\t$('#searchBtn').on('click', function(){\n\t\tlogTable.fnDraw();\n\t});\n\t\n\t// logDetail look\n\t$('#joblog_list').on('click', '.logDetail', function(){\n\t\tvar _id = $(this).attr('_id');\n\t\t\n\t\twindow.open(base_url + '/joblog/logDetailPage?id=' + _id);\n\t\treturn;\n\t});\n\n\t/**\n\t * log Kill\n\t */\n\t$('#joblog_list').on('click', '.logKill', function(){\n\t\tvar _id = $(this).attr('_id');\n\n        layer.confirm( (I18n.system_ok + I18n.joblog_kill_log + '?'), {\n        \ticon: 3,\n\t\t\ttitle: I18n.system_tips ,\n            btn: [ I18n.system_ok, I18n.system_cancel ]\n\t\t}, function(index){\n            layer.close(index);\n\n            $.ajax({\n                type : 'POST',\n                url : base_url + '/joblog/logKill',\n                data : {\"id\":_id},\n                dataType : \"json\",\n                success : function(data){\n                    if (data.code == 200) {\n                        layer.open({\n                            title: I18n.system_tips,\n                            btn: [ I18n.system_ok ],\n                            content: I18n.system_opt_suc ,\n                            icon: '1',\n                            end: function(layero, index){\n                                logTable.fnDraw();\n                            }\n                        });\n                    } else {\n                        layer.open({\n                            title: I18n.system_tips,\n                            btn: [ I18n.system_ok ],\n                            content: (data.msg || I18n.system_opt_fail ),\n                            icon: '2'\n                        });\n                    }\n                },\n            });\n        });\n\n\t});\n\n\t/**\n\t * clear Log\n\t */\n\t$('#clearLog').on('click', function(){\n\n\t\tvar jobGroup = $('#jobGroup').val();\n\t\tvar jobId = $('#jobId').val();\n\n\t\tvar jobGroupText = $(\"#jobGroup\").find(\"option:selected\").text();\n\t\tvar jobIdText = $(\"#jobId\").find(\"option:selected\").text();\n\n\t\t$('#clearLogModal input[name=jobGroup]').val(jobGroup);\n\t\t$('#clearLogModal input[name=jobId]').val(jobId);\n\n\t\t$('#clearLogModal .jobGroupText').val(jobGroupText);\n\t\t$('#clearLogModal .jobIdText').val(jobIdText);\n\n\t\t$('#clearLogModal').modal('show');\n\n\t});\n\t$(\"#clearLogModal .ok\").on('click', function(){\n\t\t$.post(base_url + \"/joblog/clearLog\",  $(\"#clearLogModal .form\").serialize(), function(data, status) {\n\t\t\tif (data.code == \"200\") {\n\t\t\t\t$('#clearLogModal').modal('hide');\n\t\t\t\tlayer.open({\n\t\t\t\t\ttitle: I18n.system_tips ,\n                    btn: [ I18n.system_ok ],\n\t\t\t\t\tcontent: (I18n.joblog_clean_log + I18n.system_success) ,\n\t\t\t\t\ticon: '1',\n\t\t\t\t\tend: function(layero, index){\n\t\t\t\t\t\tlogTable.fnDraw();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tlayer.open({\n\t\t\t\t\ttitle: I18n.system_tips ,\n                    btn: [ I18n.system_ok ],\n\t\t\t\t\tcontent: (data.msg || (I18n.joblog_clean_log + I18n.system_fail) ),\n\t\t\t\t\ticon: '2'\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t});\n\t$(\"#clearLogModal\").on('hide.bs.modal', function () {\n\t\t$(\"#clearLogModal .form\")[0].reset();\n\t});\n\n});\n\n\n// Com Alert by Tec theme\nvar ComAlertTec = {\n\thtml:function(){\n\t\tvar html =\n\t\t\t'<div class=\"modal fade\" id=\"ComAlertTec\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"myModalLabel\" aria-hidden=\"true\">' +\n\t\t\t'\t<div class=\"modal-dialog modal-lg-\">' +\n\t\t\t'\t\t<div class=\"modal-content-tec\">' +\n\t\t\t'\t\t\t<div class=\"modal-body\">' +\n\t\t\t'\t\t\t\t<div class=\"alert\" style=\"color:#fff;word-wrap: break-word;\">' +\n\t\t\t'\t\t\t\t</div>' +\n\t\t\t'\t\t\t</div>' +\n\t\t\t'\t\t\t\t<div class=\"modal-footer\">' +\n\t\t\t'\t\t\t\t<div class=\"text-center\" >' +\n\t\t\t'\t\t\t\t\t<button type=\"button\" class=\"btn btn-info ok\" data-dismiss=\"modal\" >'+ I18n.system_ok +'</button>' +\n\t\t\t'\t\t\t\t</div>' +\n\t\t\t'\t\t\t</div>' +\n\t\t\t'\t\t</div>' +\n\t\t\t'\t</div>' +\n\t\t\t'</div>';\n\t\treturn html;\n\t},\n\tshow:function(msg, callback){\n\t\t// dom init\n\t\tif ($('#ComAlertTec').length == 0){\n\t\t\t$('body').append(ComAlertTec.html());\n\t\t}\n\n\t\t// init com alert\n\t\t$('#ComAlertTec .alert').html(msg);\n\t\t$('#ComAlertTec').modal('show');\n\n\t\t$('#ComAlertTec .ok').click(function(){\n\t\t\t$('#ComAlertTec').modal('hide');\n\t\t\tif(typeof callback == 'function') {\n\t\t\t\tcallback();\n\t\t\t}\n\t\t});\n\t}\n};\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/js/login.1.js",
    "content": "$(function(){\n\n\t// input iCheck\n    $('input').iCheck({\n      checkboxClass: 'icheckbox_square-blue',\n      radioClass: 'iradio_square-blue',\n      increaseArea: '20%' // optional\n    });\n    \n\t// login Form Valid\n\tvar loginFormValid = $(\"#loginForm\").validate({\n\t\terrorElement : 'span',  \n        errorClass : 'help-block',\n        focusInvalid : true,  \n        rules : {  \n        \tuserName : {  \n        \t\trequired : true ,\n                minlength: 4,\n                maxlength: 18\n            },  \n            password : {  \n            \trequired : true ,\n                minlength: 4,\n                maxlength: 18\n            } \n        }, \n        messages : {  \n        \tuserName : {  \n                required  : I18n.login_username_empty,\n                minlength : I18n.login_username_lt_4\n            },\n            password : {\n            \trequired  : I18n.login_password_empty  ,\n                minlength : I18n.login_password_lt_4\n                /*,maxlength:\"登录密码不应超过18位\"*/\n            }\n        }, \n\t\thighlight : function(element) {  \n            $(element).closest('.form-group').addClass('has-error');  \n        },\n        success : function(label) {  \n            label.closest('.form-group').removeClass('has-error');  \n            label.remove();  \n        },\n        errorPlacement : function(error, element) {  \n            element.parent('div').append(error);  \n        },\n        submitHandler : function(form) {\n\t\t\t$.post(base_url + \"/login\", $(\"#loginForm\").serialize(), function(data, status) {\n\t\t\t\tif (data.code == \"200\") {\n                    layer.msg( I18n.login_success );\n                    setTimeout(function(){\n                        window.location.href = base_url + \"/\";\n                    }, 500);\n\t\t\t\t} else {\n                    layer.open({\n                        title: I18n.system_tips,\n                        btn: [ I18n.system_ok ],\n                        content: (data.msg || I18n.login_fail ),\n                        icon: '2'\n                    });\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n});"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/js/user.index.1.js",
    "content": "$(function() {\n\n\t// init date tables\n\tvar userListTable = $(\"#user_list\").dataTable({\n\t\t\"deferRender\": true,\n\t\t\"processing\" : true, \n\t    \"serverSide\": true,\n\t\t\"ajax\": {\n\t\t\turl: base_url + \"/user/pageList\",\n\t\t\ttype:\"post\",\n\t        data : function ( d ) {\n\t        \tvar obj = {};\n                obj.username = $('#username').val();\n                obj.role = $('#role').val();\n\t        \tobj.start = d.start;\n\t        \tobj.length = d.length;\n                return obj;\n            }\n\t    },\n\t    \"searching\": false,\n\t    \"ordering\": false,\n\t    //\"scrollX\": true,\t// scroll x，close self-adaption\n\t    \"columns\": [\n\t                {\n\t                \t\"data\": 'id',\n\t\t\t\t\t\t\"visible\" : false,\n\t\t\t\t\t\t\"width\":'10%'\n\t\t\t\t\t},\n\t                {\n\t                \t\"data\": 'username',\n\t\t\t\t\t\t\"visible\" : true,\n\t\t\t\t\t\t\"width\":'20%'\n\t\t\t\t\t},\n\t                {\n\t                \t\"data\": 'password',\n\t\t\t\t\t\t\"visible\" : false,\n                        \"width\":'20%',\n                        \"render\": function ( data, type, row ) {\n                            return '*********';\n                        }\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"data\": 'role',\n\t\t\t\t\t\t\"visible\" : true,\n\t\t\t\t\t\t\"width\":'10%',\n                        \"render\": function ( data, type, row ) {\n                            if (data == 1) {\n                                return I18n.user_role_admin\n                            } else {\n                                return I18n.user_role_normal\n                            }\n                        }\n\t\t\t\t\t},\n\t                {\n\t                \t\"data\": 'permission',\n\t\t\t\t\t\t\"width\":'10%',\n\t                \t\"visible\" : false\n\t                },\n\t                {\n\t\t\t\t\t\t\"data\": I18n.system_opt ,\n\t\t\t\t\t\t\"width\":'15%',\n\t                \t\"render\": function ( data, type, row ) {\n\t                \t\treturn function(){\n\t\t\t\t\t\t\t\t// html\n                                tableData['key'+row.id] = row;\n\t\t\t\t\t\t\t\tvar html = '<p id=\"'+ row.id +'\" >'+\n\t\t\t\t\t\t\t\t\t'<button class=\"btn btn-warning btn-xs update\" type=\"button\">'+ I18n.system_opt_edit +'</button>  '+\n\t\t\t\t\t\t\t\t\t'<button class=\"btn btn-danger btn-xs delete\" type=\"button\">'+ I18n.system_opt_del +'</button>  '+\n\t\t\t\t\t\t\t\t\t'</p>';\n\n\t                \t\t\treturn html;\n\t\t\t\t\t\t\t};\n\t                \t}\n\t                }\n\t            ],\n\t\t\"language\" : {\n\t\t\t\"sProcessing\" : I18n.dataTable_sProcessing ,\n\t\t\t\"sLengthMenu\" : I18n.dataTable_sLengthMenu ,\n\t\t\t\"sZeroRecords\" : I18n.dataTable_sZeroRecords ,\n\t\t\t\"sInfo\" : I18n.dataTable_sInfo ,\n\t\t\t\"sInfoEmpty\" : I18n.dataTable_sInfoEmpty ,\n\t\t\t\"sInfoFiltered\" : I18n.dataTable_sInfoFiltered ,\n\t\t\t\"sInfoPostFix\" : \"\",\n\t\t\t\"sSearch\" : I18n.dataTable_sSearch ,\n\t\t\t\"sUrl\" : \"\",\n\t\t\t\"sEmptyTable\" : I18n.dataTable_sEmptyTable ,\n\t\t\t\"sLoadingRecords\" : I18n.dataTable_sLoadingRecords ,\n\t\t\t\"sInfoThousands\" : \",\",\n\t\t\t\"oPaginate\" : {\n\t\t\t\t\"sFirst\" : I18n.dataTable_sFirst ,\n\t\t\t\t\"sPrevious\" : I18n.dataTable_sPrevious ,\n\t\t\t\t\"sNext\" : I18n.dataTable_sNext ,\n\t\t\t\t\"sLast\" : I18n.dataTable_sLast\n\t\t\t},\n\t\t\t\"oAria\" : {\n\t\t\t\t\"sSortAscending\" : I18n.dataTable_sSortAscending ,\n\t\t\t\t\"sSortDescending\" : I18n.dataTable_sSortDescending\n\t\t\t}\n\t\t}\n\t});\n\n    // table data\n    var tableData = {};\n\n\t// search btn\n\t$('#searchBtn').on('click', function(){\n        userListTable.fnDraw();\n\t});\n\t\n\t// job operate\n\t$(\"#user_list\").on('click', '.delete',function() {\n\t\tvar id = $(this).parent('p').attr(\"id\");\n\n\t\tlayer.confirm( I18n.system_ok + I18n.system_opt_del + '?', {\n\t\t\ticon: 3,\n\t\t\ttitle: I18n.system_tips ,\n            btn: [ I18n.system_ok, I18n.system_cancel ]\n\t\t}, function(index){\n\t\t\tlayer.close(index);\n\n\t\t\t$.ajax({\n\t\t\t\ttype : 'POST',\n\t\t\t\turl : base_url + \"/user/remove\",\n\t\t\t\tdata : {\n\t\t\t\t\t\"id\" : id\n\t\t\t\t},\n\t\t\t\tdataType : \"json\",\n\t\t\t\tsuccess : function(data){\n\t\t\t\t\tif (data.code == 200) {\n                        layer.msg( I18n.system_success );\n\t\t\t\t\t\tuserListTable.fnDraw(false);\n\t\t\t\t\t} else {\n                        layer.msg( data.msg || I18n.system_opt_del + I18n.system_fail );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t});\n\n\t// add role\n    $(\"#addModal .form input[name=role]\").change(function () {\n\t\tvar role = $(this).val();\n\t\tif (role == 1) {\n            $(\"#addModal .form input[name=permission]\").parents('.form-group').hide();\n\t\t} else {\n            $(\"#addModal .form input[name=permission]\").parents('.form-group').show();\n\t\t}\n        $(\"#addModal .form input[name='permission']\").prop(\"checked\",false);\n    });\n\n    jQuery.validator.addMethod(\"myValid01\", function(value, element) {\n        var length = value.length;\n        var valid = /^[a-z][a-z0-9]*$/;\n        return this.optional(element) || valid.test(value);\n    }, I18n.user_username_valid );\n\n\t// add\n\t$(\".add\").click(function(){\n\t\t$('#addModal').modal({backdrop: false, keyboard: false}).modal('show');\n\t});\n\tvar addModalValidate = $(\"#addModal .form\").validate({\n\t\terrorElement : 'span',  \n        errorClass : 'help-block',\n        focusInvalid : true,  \n        rules : {\n            username : {\n\t\t\t\trequired : true,\n                rangelength:[4, 20],\n                myValid01: true\n\t\t\t},\n            password : {\n                required : true,\n                rangelength:[4, 20]\n            }\n        }, \n        messages : {\n            username : {\n            \trequired : I18n.system_please_input + I18n.user_username,\n                rangelength: I18n.system_lengh_limit + \"[4-20]\"\n            },\n            password : {\n                required : I18n.system_please_input + I18n.user_password,\n                rangelength: I18n.system_lengh_limit + \"[4-20]\"\n            }\n        },\n\t\thighlight : function(element) {  \n            $(element).closest('.form-group').addClass('has-error');  \n        },\n        success : function(label) {  \n            label.closest('.form-group').removeClass('has-error');  \n            label.remove();  \n        },\n        errorPlacement : function(error, element) {  \n            element.parent('div').append(error);  \n        },\n        submitHandler : function(form) {\n\n            var permissionArr = [];\n            $(\"#addModal .form input[name=permission]:checked\").each(function(){\n                permissionArr.push($(this).val());\n            });\n\n\t\t\tvar paramData = {\n\t\t\t\t\"username\": $(\"#addModal .form input[name=username]\").val(),\n                \"password\": $(\"#addModal .form input[name=password]\").val(),\n                \"role\": $(\"#addModal .form input[name=role]:checked\").val(),\n                \"permission\": permissionArr.join(',')\n\t\t\t};\n\n        \t$.post(base_url + \"/user/add\", paramData, function(data, status) {\n    \t\t\tif (data.code == \"200\") {\n\t\t\t\t\t$('#addModal').modal('hide');\n\n                    layer.msg( I18n.system_add_suc );\n                    userListTable.fnDraw();\n    \t\t\t} else {\n\t\t\t\t\tlayer.open({\n\t\t\t\t\t\ttitle: I18n.system_tips ,\n                        btn: [ I18n.system_ok ],\n\t\t\t\t\t\tcontent: (data.msg || I18n.system_add_fail),\n\t\t\t\t\t\ticon: '2'\n\t\t\t\t\t});\n    \t\t\t}\n    \t\t});\n\t\t}\n\t});\n\t$(\"#addModal\").on('hide.bs.modal', function () {\n\t\t$(\"#addModal .form\")[0].reset();\n\t\taddModalValidate.resetForm();\n\t\t$(\"#addModal .form .form-group\").removeClass(\"has-error\");\n\t\t$(\".remote_panel\").show();\t// remote\n\n        $(\"#addModal .form input[name=permission]\").parents('.form-group').show();\n\t});\n\n    // update role\n    $(\"#updateModal .form input[name=role]\").change(function () {\n        var role = $(this).val();\n        if (role == 1) {\n            $(\"#updateModal .form input[name=permission]\").parents('.form-group').hide();\n        } else {\n            $(\"#updateModal .form input[name=permission]\").parents('.form-group').show();\n        }\n        $(\"#updateModal .form input[name='permission']\").prop(\"checked\",false);\n    });\n\n\t// update\n\t$(\"#user_list\").on('click', '.update',function() {\n\n        var id = $(this).parent('p').attr(\"id\");\n        var row = tableData['key'+id];\n\n\t\t// base data\n\t\t$(\"#updateModal .form input[name='id']\").val( row.id );\n\t\t$(\"#updateModal .form input[name='username']\").val( row.username );\n\t\t$(\"#updateModal .form input[name='password']\").val( '' );\n\t\t$(\"#updateModal .form input[name='role'][value='\"+ row.role +\"']\").click();\n        var permissionArr = [];\n        if (row.permission) {\n            permissionArr = row.permission.split(\",\");\n\t\t}\n        $(\"#updateModal .form input[name='permission']\").each(function () {\n            if($.inArray($(this).val(), permissionArr) > -1) {\n                $(this).prop(\"checked\",true);\n            } else {\n                $(this).prop(\"checked\",false);\n            }\n        });\n\n\t\t// show\n\t\t$('#updateModal').modal({backdrop: false, keyboard: false}).modal('show');\n\t});\n\tvar updateModalValidate = $(\"#updateModal .form\").validate({\n\t\terrorElement : 'span',  \n        errorClass : 'help-block',\n        focusInvalid : true,\n\t\thighlight : function(element) {\n            $(element).closest('.form-group').addClass('has-error');  \n        },\n        success : function(label) {  \n            label.closest('.form-group').removeClass('has-error');  \n            label.remove();  \n        },\n        errorPlacement : function(error, element) {  \n            element.parent('div').append(error);  \n        },\n        submitHandler : function(form) {\n\n            var permissionArr =[];\n            $(\"#updateModal .form input[name=permission]:checked\").each(function(){\n                permissionArr.push($(this).val());\n            });\n\n            var paramData = {\n                \"id\": $(\"#updateModal .form input[name=id]\").val(),\n                \"username\": $(\"#updateModal .form input[name=username]\").val(),\n                \"password\": $(\"#updateModal .form input[name=password]\").val(),\n                \"role\": $(\"#updateModal .form input[name=role]:checked\").val(),\n                \"permission\": permissionArr.join(',')\n            };\n\n            $.post(base_url + \"/user/update\", paramData, function(data, status) {\n                if (data.code == \"200\") {\n                    $('#updateModal').modal('hide');\n\n                    layer.msg( I18n.system_update_suc );\n                    userListTable.fnDraw();\n                } else {\n                    layer.open({\n                        title: I18n.system_tips ,\n                        btn: [ I18n.system_ok ],\n                        content: (data.msg || I18n.system_update_fail),\n                        icon: '2'\n                    });\n                }\n            });\n\t\t}\n\t});\n\t$(\"#updateModal\").on('hide.bs.modal', function () {\n        $(\"#updateModal .form\")[0].reset();\n        updateModalValidate.resetForm();\n        $(\"#updateModal .form .form-group\").removeClass(\"has-error\");\n        $(\".remote_panel\").show();\t// remote\n\n        $(\"#updateModal .form input[name=permission]\").parents('.form-group').show();\n\t});\n\n});\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/plugins/codemirror/addon/hint/anyword-hint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var WORD = /[\\w$]+/, RANGE = 500;\n\n  CodeMirror.registerHelper(\"hint\", \"anyword\", function(editor, options) {\n    var word = options && options.word || WORD;\n    var range = options && options.range || RANGE;\n    var cur = editor.getCursor(), curLine = editor.getLine(cur.line);\n    var end = cur.ch, start = end;\n    while (start && word.test(curLine.charAt(start - 1))) --start;\n    var curWord = start != end && curLine.slice(start, end);\n\n    var list = options && options.list || [], seen = {};\n    var re = new RegExp(word.source, \"g\");\n    for (var dir = -1; dir <= 1; dir += 2) {\n      var line = cur.line, endLine = Math.min(Math.max(line + dir * range, editor.firstLine()), editor.lastLine()) + dir;\n      for (; line != endLine; line += dir) {\n        var text = editor.getLine(line), m;\n        while (m = re.exec(text)) {\n          if (line == cur.line && m[0] === curWord) continue;\n          if ((!curWord || m[0].lastIndexOf(curWord, 0) == 0) && !Object.prototype.hasOwnProperty.call(seen, m[0])) {\n            seen[m[0]] = true;\n            list.push(m[0]);\n          }\n        }\n      }\n    }\n    return {list: list, from: CodeMirror.Pos(cur.line, start), to: CodeMirror.Pos(cur.line, end)};\n  });\n});\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/plugins/codemirror/addon/hint/show-hint.css",
    "content": ".CodeMirror-hints {\n  position: absolute;\n  z-index: 10;\n  overflow: hidden;\n  list-style: none;\n\n  margin: 0;\n  padding: 2px;\n\n  -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n  -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n  box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n  border-radius: 3px;\n  border: 1px solid silver;\n\n  background: white;\n  font-size: 90%;\n  font-family: monospace;\n\n  max-height: 20em;\n  overflow-y: auto;\n}\n\n.CodeMirror-hint {\n  margin: 0;\n  padding: 0 4px;\n  border-radius: 2px;\n  white-space: pre;\n  color: black;\n  cursor: pointer;\n}\n\nli.CodeMirror-hint-active {\n  background: #08f;\n  color: white;\n}\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/plugins/codemirror/addon/hint/show-hint.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var HINT_ELEMENT_CLASS        = \"CodeMirror-hint\";\n  var ACTIVE_HINT_ELEMENT_CLASS = \"CodeMirror-hint-active\";\n\n  // This is the old interface, kept around for now to stay\n  // backwards-compatible.\n  CodeMirror.showHint = function(cm, getHints, options) {\n    if (!getHints) return cm.showHint(options);\n    if (options && options.async) getHints.async = true;\n    var newOpts = {hint: getHints};\n    if (options) for (var prop in options) newOpts[prop] = options[prop];\n    return cm.showHint(newOpts);\n  };\n\n  CodeMirror.defineExtension(\"showHint\", function(options) {\n    options = parseOptions(this, this.getCursor(\"start\"), options);\n    var selections = this.listSelections()\n    if (selections.length > 1) return;\n    // By default, don't allow completion when something is selected.\n    // A hint function can have a `supportsSelection` property to\n    // indicate that it can handle selections.\n    if (this.somethingSelected()) {\n      if (!options.hint.supportsSelection) return;\n      // Don't try with cross-line selections\n      for (var i = 0; i < selections.length; i++)\n        if (selections[i].head.line != selections[i].anchor.line) return;\n    }\n\n    if (this.state.completionActive) this.state.completionActive.close();\n    var completion = this.state.completionActive = new Completion(this, options);\n    if (!completion.options.hint) return;\n\n    CodeMirror.signal(this, \"startCompletion\", this);\n    completion.update(true);\n  });\n\n  function Completion(cm, options) {\n    this.cm = cm;\n    this.options = options;\n    this.widget = null;\n    this.debounce = 0;\n    this.tick = 0;\n    this.startPos = this.cm.getCursor(\"start\");\n    this.startLen = this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length;\n\n    var self = this;\n    cm.on(\"cursorActivity\", this.activityFunc = function() { self.cursorActivity(); });\n  }\n\n  var requestAnimationFrame = window.requestAnimationFrame || function(fn) {\n    return setTimeout(fn, 1000/60);\n  };\n  var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout;\n\n  Completion.prototype = {\n    close: function() {\n      if (!this.active()) return;\n      this.cm.state.completionActive = null;\n      this.tick = null;\n      this.cm.off(\"cursorActivity\", this.activityFunc);\n\n      if (this.widget && this.data) CodeMirror.signal(this.data, \"close\");\n      if (this.widget) this.widget.close();\n      CodeMirror.signal(this.cm, \"endCompletion\", this.cm);\n    },\n\n    active: function() {\n      return this.cm.state.completionActive == this;\n    },\n\n    pick: function(data, i) {\n      var completion = data.list[i];\n      if (completion.hint) completion.hint(this.cm, data, completion);\n      else this.cm.replaceRange(getText(completion), completion.from || data.from,\n                                completion.to || data.to, \"complete\");\n      CodeMirror.signal(data, \"pick\", completion);\n      this.close();\n    },\n\n    cursorActivity: function() {\n      if (this.debounce) {\n        cancelAnimationFrame(this.debounce);\n        this.debounce = 0;\n      }\n\n      var pos = this.cm.getCursor(), line = this.cm.getLine(pos.line);\n      if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch ||\n          pos.ch < this.startPos.ch || this.cm.somethingSelected() ||\n          (!pos.ch || this.options.closeCharacters.test(line.charAt(pos.ch - 1)))) {\n        this.close();\n      } else {\n        var self = this;\n        this.debounce = requestAnimationFrame(function() {self.update();});\n        if (this.widget) this.widget.disable();\n      }\n    },\n\n    update: function(first) {\n      if (this.tick == null) return\n      var self = this, myTick = ++this.tick\n      fetchHints(this.options.hint, this.cm, this.options, function(data) {\n        if (self.tick == myTick) self.finishUpdate(data, first)\n      })\n    },\n\n    finishUpdate: function(data, first) {\n      if (this.data) CodeMirror.signal(this.data, \"update\");\n\n      var picked = (this.widget && this.widget.picked) || (first && this.options.completeSingle);\n      if (this.widget) this.widget.close();\n\n      this.data = data;\n\n      if (data && data.list.length) {\n        if (picked && data.list.length == 1) {\n          this.pick(data, 0);\n        } else {\n          this.widget = new Widget(this, data);\n          CodeMirror.signal(data, \"shown\");\n        }\n      }\n    }\n  };\n\n  function parseOptions(cm, pos, options) {\n    var editor = cm.options.hintOptions;\n    var out = {};\n    for (var prop in defaultOptions) out[prop] = defaultOptions[prop];\n    if (editor) for (var prop in editor)\n      if (editor[prop] !== undefined) out[prop] = editor[prop];\n    if (options) for (var prop in options)\n      if (options[prop] !== undefined) out[prop] = options[prop];\n    if (out.hint.resolve) out.hint = out.hint.resolve(cm, pos)\n    return out;\n  }\n\n  function getText(completion) {\n    if (typeof completion == \"string\") return completion;\n    else return completion.text;\n  }\n\n  function buildKeyMap(completion, handle) {\n    var baseMap = {\n      Up: function() {handle.moveFocus(-1);},\n      Down: function() {handle.moveFocus(1);},\n      PageUp: function() {handle.moveFocus(-handle.menuSize() + 1, true);},\n      PageDown: function() {handle.moveFocus(handle.menuSize() - 1, true);},\n      Home: function() {handle.setFocus(0);},\n      End: function() {handle.setFocus(handle.length - 1);},\n      Enter: handle.pick,\n      Tab: handle.pick,\n      Esc: handle.close\n    };\n    var custom = completion.options.customKeys;\n    var ourMap = custom ? {} : baseMap;\n    function addBinding(key, val) {\n      var bound;\n      if (typeof val != \"string\")\n        bound = function(cm) { return val(cm, handle); };\n      // This mechanism is deprecated\n      else if (baseMap.hasOwnProperty(val))\n        bound = baseMap[val];\n      else\n        bound = val;\n      ourMap[key] = bound;\n    }\n    if (custom)\n      for (var key in custom) if (custom.hasOwnProperty(key))\n        addBinding(key, custom[key]);\n    var extra = completion.options.extraKeys;\n    if (extra)\n      for (var key in extra) if (extra.hasOwnProperty(key))\n        addBinding(key, extra[key]);\n    return ourMap;\n  }\n\n  function getHintElement(hintsElement, el) {\n    while (el && el != hintsElement) {\n      if (el.nodeName.toUpperCase() === \"LI\" && el.parentNode == hintsElement) return el;\n      el = el.parentNode;\n    }\n  }\n\n  function Widget(completion, data) {\n    this.completion = completion;\n    this.data = data;\n    this.picked = false;\n    var widget = this, cm = completion.cm;\n\n    var hints = this.hints = document.createElement(\"ul\");\n    var theme = completion.cm.options.theme;\n    hints.className = \"CodeMirror-hints \" + theme;\n    this.selectedHint = data.selectedHint || 0;\n\n    var completions = data.list;\n    for (var i = 0; i < completions.length; ++i) {\n      var elt = hints.appendChild(document.createElement(\"li\")), cur = completions[i];\n      var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? \"\" : \" \" + ACTIVE_HINT_ELEMENT_CLASS);\n      if (cur.className != null) className = cur.className + \" \" + className;\n      elt.className = className;\n      if (cur.render) cur.render(elt, data, cur);\n      else elt.appendChild(document.createTextNode(cur.displayText || getText(cur)));\n      elt.hintId = i;\n    }\n\n    var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null);\n    var left = pos.left, top = pos.bottom, below = true;\n    hints.style.left = left + \"px\";\n    hints.style.top = top + \"px\";\n    // If we're at the edge of the screen, then we want the menu to appear on the left of the cursor.\n    var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth);\n    var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight);\n    (completion.options.container || document.body).appendChild(hints);\n    var box = hints.getBoundingClientRect(), overlapY = box.bottom - winH;\n    var scrolls = hints.scrollHeight > hints.clientHeight + 1\n    var startScroll = cm.getScrollInfo();\n\n    if (overlapY > 0) {\n      var height = box.bottom - box.top, curTop = pos.top - (pos.bottom - box.top);\n      if (curTop - height > 0) { // Fits above cursor\n        hints.style.top = (top = pos.top - height) + \"px\";\n        below = false;\n      } else if (height > winH) {\n        hints.style.height = (winH - 5) + \"px\";\n        hints.style.top = (top = pos.bottom - box.top) + \"px\";\n        var cursor = cm.getCursor();\n        if (data.from.ch != cursor.ch) {\n          pos = cm.cursorCoords(cursor);\n          hints.style.left = (left = pos.left) + \"px\";\n          box = hints.getBoundingClientRect();\n        }\n      }\n    }\n    var overlapX = box.right - winW;\n    if (overlapX > 0) {\n      if (box.right - box.left > winW) {\n        hints.style.width = (winW - 5) + \"px\";\n        overlapX -= (box.right - box.left) - winW;\n      }\n      hints.style.left = (left = pos.left - overlapX) + \"px\";\n    }\n    if (scrolls) for (var node = hints.firstChild; node; node = node.nextSibling)\n      node.style.paddingRight = cm.display.nativeBarWidth + \"px\"\n\n    cm.addKeyMap(this.keyMap = buildKeyMap(completion, {\n      moveFocus: function(n, avoidWrap) { widget.changeActive(widget.selectedHint + n, avoidWrap); },\n      setFocus: function(n) { widget.changeActive(n); },\n      menuSize: function() { return widget.screenAmount(); },\n      length: completions.length,\n      close: function() { completion.close(); },\n      pick: function() { widget.pick(); },\n      data: data\n    }));\n\n    if (completion.options.closeOnUnfocus) {\n      var closingOnBlur;\n      cm.on(\"blur\", this.onBlur = function() { closingOnBlur = setTimeout(function() { completion.close(); }, 100); });\n      cm.on(\"focus\", this.onFocus = function() { clearTimeout(closingOnBlur); });\n    }\n\n    cm.on(\"scroll\", this.onScroll = function() {\n      var curScroll = cm.getScrollInfo(), editor = cm.getWrapperElement().getBoundingClientRect();\n      var newTop = top + startScroll.top - curScroll.top;\n      var point = newTop - (window.pageYOffset || (document.documentElement || document.body).scrollTop);\n      if (!below) point += hints.offsetHeight;\n      if (point <= editor.top || point >= editor.bottom) return completion.close();\n      hints.style.top = newTop + \"px\";\n      hints.style.left = (left + startScroll.left - curScroll.left) + \"px\";\n    });\n\n    CodeMirror.on(hints, \"dblclick\", function(e) {\n      var t = getHintElement(hints, e.target || e.srcElement);\n      if (t && t.hintId != null) {widget.changeActive(t.hintId); widget.pick();}\n    });\n\n    CodeMirror.on(hints, \"click\", function(e) {\n      var t = getHintElement(hints, e.target || e.srcElement);\n      if (t && t.hintId != null) {\n        widget.changeActive(t.hintId);\n        if (completion.options.completeOnSingleClick) widget.pick();\n      }\n    });\n\n    CodeMirror.on(hints, \"mousedown\", function() {\n      setTimeout(function(){cm.focus();}, 20);\n    });\n\n    CodeMirror.signal(data, \"select\", completions[this.selectedHint], hints.childNodes[this.selectedHint]);\n    return true;\n  }\n\n  Widget.prototype = {\n    close: function() {\n      if (this.completion.widget != this) return;\n      this.completion.widget = null;\n      this.hints.parentNode.removeChild(this.hints);\n      this.completion.cm.removeKeyMap(this.keyMap);\n\n      var cm = this.completion.cm;\n      if (this.completion.options.closeOnUnfocus) {\n        cm.off(\"blur\", this.onBlur);\n        cm.off(\"focus\", this.onFocus);\n      }\n      cm.off(\"scroll\", this.onScroll);\n    },\n\n    disable: function() {\n      this.completion.cm.removeKeyMap(this.keyMap);\n      var widget = this;\n      this.keyMap = {Enter: function() { widget.picked = true; }};\n      this.completion.cm.addKeyMap(this.keyMap);\n    },\n\n    pick: function() {\n      this.completion.pick(this.data, this.selectedHint);\n    },\n\n    changeActive: function(i, avoidWrap) {\n      if (i >= this.data.list.length)\n        i = avoidWrap ? this.data.list.length - 1 : 0;\n      else if (i < 0)\n        i = avoidWrap ? 0  : this.data.list.length - 1;\n      if (this.selectedHint == i) return;\n      var node = this.hints.childNodes[this.selectedHint];\n      if (node) node.className = node.className.replace(\" \" + ACTIVE_HINT_ELEMENT_CLASS, \"\");\n      node = this.hints.childNodes[this.selectedHint = i];\n      node.className += \" \" + ACTIVE_HINT_ELEMENT_CLASS;\n      if (node.offsetTop < this.hints.scrollTop)\n        this.hints.scrollTop = node.offsetTop - 3;\n      else if (node.offsetTop + node.offsetHeight > this.hints.scrollTop + this.hints.clientHeight)\n        this.hints.scrollTop = node.offsetTop + node.offsetHeight - this.hints.clientHeight + 3;\n      CodeMirror.signal(this.data, \"select\", this.data.list[this.selectedHint], node);\n    },\n\n    screenAmount: function() {\n      return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1;\n    }\n  };\n\n  function applicableHelpers(cm, helpers) {\n    if (!cm.somethingSelected()) return helpers\n    var result = []\n    for (var i = 0; i < helpers.length; i++)\n      if (helpers[i].supportsSelection) result.push(helpers[i])\n    return result\n  }\n\n  function fetchHints(hint, cm, options, callback) {\n    if (hint.async) {\n      hint(cm, callback, options)\n    } else {\n      var result = hint(cm, options)\n      if (result && result.then) result.then(callback)\n      else callback(result)\n    }\n  }\n\n  function resolveAutoHints(cm, pos) {\n    var helpers = cm.getHelpers(pos, \"hint\"), words\n    if (helpers.length) {\n      var resolved = function(cm, callback, options) {\n        var app = applicableHelpers(cm, helpers);\n        function run(i) {\n          if (i == app.length) return callback(null)\n          fetchHints(app[i], cm, options, function(result) {\n            if (result && result.list.length > 0) callback(result)\n            else run(i + 1)\n          })\n        }\n        run(0)\n      }\n      resolved.async = true\n      resolved.supportsSelection = true\n      return resolved\n    } else if (words = cm.getHelper(cm.getCursor(), \"hintWords\")) {\n      return function(cm) { return CodeMirror.hint.fromList(cm, {words: words}) }\n    } else if (CodeMirror.hint.anyword) {\n      return function(cm, options) { return CodeMirror.hint.anyword(cm, options) }\n    } else {\n      return function() {}\n    }\n  }\n\n  CodeMirror.registerHelper(\"hint\", \"auto\", {\n    resolve: resolveAutoHints\n  });\n\n  CodeMirror.registerHelper(\"hint\", \"fromList\", function(cm, options) {\n    var cur = cm.getCursor(), token = cm.getTokenAt(cur)\n    var term, from = CodeMirror.Pos(cur.line, token.start), to = cur\n    if (token.start < cur.ch && /\\w/.test(token.string.charAt(cur.ch - token.start - 1))) {\n      term = token.string.substr(0, cur.ch - token.start)\n    } else {\n      term = \"\"\n      from = cur\n    }\n    var found = [];\n    for (var i = 0; i < options.words.length; i++) {\n      var word = options.words[i];\n      if (word.slice(0, term.length) == term)\n        found.push(word);\n    }\n\n    if (found.length) return {list: found, from: from, to: to};\n  });\n\n  CodeMirror.commands.autocomplete = CodeMirror.showHint;\n\n  var defaultOptions = {\n    hint: CodeMirror.hint.auto,\n    completeSingle: true,\n    alignWithWord: true,\n    closeCharacters: /[\\s()\\[\\]{};:>,]/,\n    closeOnUnfocus: true,\n    completeOnSingleClick: true,\n    container: null,\n    customKeys: null,\n    extraKeys: null\n  };\n\n  CodeMirror.defineOption(\"hintOptions\", null);\n});\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/plugins/codemirror/lib/codemirror.css",
    "content": "/* BASICS */\n\n.CodeMirror {\n  /* Set height, width, borders, and global font properties here */\n  font-family: monospace;\n  height: 300px;\n  color: black;\n  direction: ltr;\n}\n\n/* PADDING */\n\n.CodeMirror-lines {\n  padding: 4px 0; /* Vertical padding around content */\n}\n.CodeMirror pre {\n  padding: 0 4px; /* Horizontal padding of content */\n}\n\n.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n  background-color: white; /* The little square between H and V scrollbars */\n}\n\n/* GUTTER */\n\n.CodeMirror-gutters {\n  border-right: 1px solid #ddd;\n  background-color: #f7f7f7;\n  white-space: nowrap;\n}\n.CodeMirror-linenumbers {}\n.CodeMirror-linenumber {\n  padding: 0 3px 0 5px;\n  min-width: 20px;\n  text-align: right;\n  color: #999;\n  white-space: nowrap;\n}\n\n.CodeMirror-guttermarker { color: black; }\n.CodeMirror-guttermarker-subtle { color: #999; }\n\n/* CURSOR */\n\n.CodeMirror-cursor {\n  border-left: 1px solid black;\n  border-right: none;\n  width: 0;\n}\n/* Shown when moving in bi-directional text */\n.CodeMirror div.CodeMirror-secondarycursor {\n  border-left: 1px solid silver;\n}\n.cm-fat-cursor .CodeMirror-cursor {\n  width: auto;\n  border: 0 !important;\n  background: #7e7;\n}\n.cm-fat-cursor div.CodeMirror-cursors {\n  z-index: 1;\n}\n.cm-fat-cursor-mark {\n  background-color: rgba(20, 255, 20, 0.5);\n  -webkit-animation: blink 1.06s steps(1) infinite;\n  -moz-animation: blink 1.06s steps(1) infinite;\n  animation: blink 1.06s steps(1) infinite;\n}\n.cm-animate-fat-cursor {\n  width: auto;\n  border: 0;\n  -webkit-animation: blink 1.06s steps(1) infinite;\n  -moz-animation: blink 1.06s steps(1) infinite;\n  animation: blink 1.06s steps(1) infinite;\n  background-color: #7e7;\n}\n@-moz-keyframes blink {\n  0% {}\n  50% { background-color: transparent; }\n  100% {}\n}\n@-webkit-keyframes blink {\n  0% {}\n  50% { background-color: transparent; }\n  100% {}\n}\n@keyframes blink {\n  0% {}\n  50% { background-color: transparent; }\n  100% {}\n}\n\n/* Can style cursor different in overwrite (non-insert) mode */\n.CodeMirror-overwrite .CodeMirror-cursor {}\n\n.cm-tab { display: inline-block; text-decoration: inherit; }\n\n.CodeMirror-rulers {\n  position: absolute;\n  left: 0; right: 0; top: -50px; bottom: -20px;\n  overflow: hidden;\n}\n.CodeMirror-ruler {\n  border-left: 1px solid #ccc;\n  top: 0; bottom: 0;\n  position: absolute;\n}\n\n/* DEFAULT THEME */\n\n.cm-s-default .cm-header {color: blue;}\n.cm-s-default .cm-quote {color: #090;}\n.cm-negative {color: #d44;}\n.cm-positive {color: #292;}\n.cm-header, .cm-strong {font-weight: bold;}\n.cm-em {font-style: italic;}\n.cm-link {text-decoration: underline;}\n.cm-strikethrough {text-decoration: line-through;}\n\n.cm-s-default .cm-keyword {color: #708;}\n.cm-s-default .cm-atom {color: #219;}\n.cm-s-default .cm-number {color: #164;}\n.cm-s-default .cm-def {color: #00f;}\n.cm-s-default .cm-variable,\n.cm-s-default .cm-punctuation,\n.cm-s-default .cm-property,\n.cm-s-default .cm-operator {}\n.cm-s-default .cm-variable-2 {color: #05a;}\n.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}\n.cm-s-default .cm-comment {color: #a50;}\n.cm-s-default .cm-string {color: #a11;}\n.cm-s-default .cm-string-2 {color: #f50;}\n.cm-s-default .cm-meta {color: #555;}\n.cm-s-default .cm-qualifier {color: #555;}\n.cm-s-default .cm-builtin {color: #30a;}\n.cm-s-default .cm-bracket {color: #997;}\n.cm-s-default .cm-tag {color: #170;}\n.cm-s-default .cm-attribute {color: #00c;}\n.cm-s-default .cm-hr {color: #999;}\n.cm-s-default .cm-link {color: #00c;}\n\n.cm-s-default .cm-error {color: #f00;}\n.cm-invalidchar {color: #f00;}\n\n.CodeMirror-composing { border-bottom: 2px solid; }\n\n/* Default styles for common addons */\n\ndiv.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}\ndiv.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}\n.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }\n.CodeMirror-activeline-background {background: #e8f2ff;}\n\n/* STOP */\n\n/* The rest of this file contains styles related to the mechanics of\n   the editor. You probably shouldn't touch them. */\n\n.CodeMirror {\n  position: relative;\n  overflow: hidden;\n  background: white;\n}\n\n.CodeMirror-scroll {\n  overflow: scroll !important; /* Things will break if this is overridden */\n  /* 30px is the magic margin used to hide the element's real scrollbars */\n  /* See overflow: hidden in .CodeMirror */\n  margin-bottom: -30px; margin-right: -30px;\n  padding-bottom: 30px;\n  height: 100%;\n  outline: none; /* Prevent dragging from highlighting the element */\n  position: relative;\n}\n.CodeMirror-sizer {\n  position: relative;\n  border-right: 30px solid transparent;\n}\n\n/* The fake, visible scrollbars. Used to force redraw during scrolling\n   before actual scrolling happens, thus preventing shaking and\n   flickering artifacts. */\n.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n  position: absolute;\n  z-index: 6;\n  display: none;\n}\n.CodeMirror-vscrollbar {\n  right: 0; top: 0;\n  overflow-x: hidden;\n  overflow-y: scroll;\n}\n.CodeMirror-hscrollbar {\n  bottom: 0; left: 0;\n  overflow-y: hidden;\n  overflow-x: scroll;\n}\n.CodeMirror-scrollbar-filler {\n  right: 0; bottom: 0;\n}\n.CodeMirror-gutter-filler {\n  left: 0; bottom: 0;\n}\n\n.CodeMirror-gutters {\n  position: absolute; left: 0; top: 0;\n  min-height: 100%;\n  z-index: 3;\n}\n.CodeMirror-gutter {\n  white-space: normal;\n  height: 100%;\n  display: inline-block;\n  vertical-align: top;\n  margin-bottom: -30px;\n}\n.CodeMirror-gutter-wrapper {\n  position: absolute;\n  z-index: 4;\n  background: none !important;\n  border: none !important;\n}\n.CodeMirror-gutter-background {\n  position: absolute;\n  top: 0; bottom: 0;\n  z-index: 4;\n}\n.CodeMirror-gutter-elt {\n  position: absolute;\n  cursor: default;\n  z-index: 4;\n}\n.CodeMirror-gutter-wrapper ::selection { background-color: transparent }\n.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }\n\n.CodeMirror-lines {\n  cursor: text;\n  min-height: 1px; /* prevents collapsing before first draw */\n}\n.CodeMirror pre {\n  /* Reset some styles that the rest of the page might have set */\n  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;\n  border-width: 0;\n  background: transparent;\n  font-family: inherit;\n  font-size: inherit;\n  margin: 0;\n  white-space: pre;\n  word-wrap: normal;\n  line-height: inherit;\n  color: inherit;\n  z-index: 2;\n  position: relative;\n  overflow: visible;\n  -webkit-tap-highlight-color: transparent;\n  -webkit-font-variant-ligatures: contextual;\n  font-variant-ligatures: contextual;\n}\n.CodeMirror-wrap pre {\n  word-wrap: break-word;\n  white-space: pre-wrap;\n  word-break: normal;\n}\n\n.CodeMirror-linebackground {\n  position: absolute;\n  left: 0; right: 0; top: 0; bottom: 0;\n  z-index: 0;\n}\n\n.CodeMirror-linewidget {\n  position: relative;\n  z-index: 2;\n  padding: 0.1px; /* Force widget margins to stay inside of the container */\n}\n\n.CodeMirror-widget {}\n\n.CodeMirror-rtl pre { direction: rtl; }\n\n.CodeMirror-code {\n  outline: none;\n}\n\n/* Force content-box sizing for the elements where we expect it */\n.CodeMirror-scroll,\n.CodeMirror-sizer,\n.CodeMirror-gutter,\n.CodeMirror-gutters,\n.CodeMirror-linenumber {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n}\n\n.CodeMirror-measure {\n  position: absolute;\n  width: 100%;\n  height: 0;\n  overflow: hidden;\n  visibility: hidden;\n}\n\n.CodeMirror-cursor {\n  position: absolute;\n  pointer-events: none;\n}\n.CodeMirror-measure pre { position: static; }\n\ndiv.CodeMirror-cursors {\n  visibility: hidden;\n  position: relative;\n  z-index: 3;\n}\ndiv.CodeMirror-dragcursors {\n  visibility: visible;\n}\n\n.CodeMirror-focused div.CodeMirror-cursors {\n  visibility: visible;\n}\n\n.CodeMirror-selected { background: #d9d9d9; }\n.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }\n.CodeMirror-crosshair { cursor: crosshair; }\n.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }\n.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }\n\n.cm-searching {\n  background-color: #ffa;\n  background-color: rgba(255, 255, 0, .4);\n}\n\n/* Used to force a border model for a node */\n.cm-force-border { padding-right: .1px; }\n\n@media print {\n  /* Hide the cursor when printing */\n  .CodeMirror div.CodeMirror-cursors {\n    visibility: hidden;\n  }\n}\n\n/* See issue #2901 */\n.cm-tab-wrap-hack:after { content: ''; }\n\n/* Help users use markselection to safely style text background */\nspan.CodeMirror-selectedtext { background: none; }\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/plugins/codemirror/lib/codemirror.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n// This is CodeMirror (https://codemirror.net), a code editor\n// implemented in JavaScript on top of the browser's DOM.\n//\n// You can find some technical background for some of the code below\n// at http://marijnhaverbeke.nl/blog/#cm-internals .\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global.CodeMirror = factory());\n}(this, (function () { 'use strict';\n\n  // Kludges for bugs and behavior differences that can't be feature\n  // detected are enabled based on userAgent etc sniffing.\n  var userAgent = navigator.userAgent;\n  var platform = navigator.platform;\n\n  var gecko = /gecko\\/\\d/i.test(userAgent);\n  var ie_upto10 = /MSIE \\d/.test(userAgent);\n  var ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(userAgent);\n  var edge = /Edge\\/(\\d+)/.exec(userAgent);\n  var ie = ie_upto10 || ie_11up || edge;\n  var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]);\n  var webkit = !edge && /WebKit\\//.test(userAgent);\n  var qtwebkit = webkit && /Qt\\/\\d+\\.\\d+/.test(userAgent);\n  var chrome = !edge && /Chrome\\//.test(userAgent);\n  var presto = /Opera\\//.test(userAgent);\n  var safari = /Apple Computer/.test(navigator.vendor);\n  var mac_geMountainLion = /Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(userAgent);\n  var phantom = /PhantomJS/.test(userAgent);\n\n  var ios = !edge && /AppleWebKit/.test(userAgent) && /Mobile\\/\\w+/.test(userAgent);\n  var android = /Android/.test(userAgent);\n  // This is woefully incomplete. Suggestions for alternative methods welcome.\n  var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);\n  var mac = ios || /Mac/.test(platform);\n  var chromeOS = /\\bCrOS\\b/.test(userAgent);\n  var windows = /win/i.test(platform);\n\n  var presto_version = presto && userAgent.match(/Version\\/(\\d*\\.\\d*)/);\n  if (presto_version) { presto_version = Number(presto_version[1]); }\n  if (presto_version && presto_version >= 15) { presto = false; webkit = true; }\n  // Some browsers use the wrong event properties to signal cmd/ctrl on OS X\n  var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));\n  var captureRightClick = gecko || (ie && ie_version >= 9);\n\n  function classTest(cls) { return new RegExp(\"(^|\\\\s)\" + cls + \"(?:$|\\\\s)\\\\s*\") }\n\n  var rmClass = function(node, cls) {\n    var current = node.className;\n    var match = classTest(cls).exec(current);\n    if (match) {\n      var after = current.slice(match.index + match[0].length);\n      node.className = current.slice(0, match.index) + (after ? match[1] + after : \"\");\n    }\n  };\n\n  function removeChildren(e) {\n    for (var count = e.childNodes.length; count > 0; --count)\n      { e.removeChild(e.firstChild); }\n    return e\n  }\n\n  function removeChildrenAndAdd(parent, e) {\n    return removeChildren(parent).appendChild(e)\n  }\n\n  function elt(tag, content, className, style) {\n    var e = document.createElement(tag);\n    if (className) { e.className = className; }\n    if (style) { e.style.cssText = style; }\n    if (typeof content == \"string\") { e.appendChild(document.createTextNode(content)); }\n    else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } }\n    return e\n  }\n  // wrapper for elt, which removes the elt from the accessibility tree\n  function eltP(tag, content, className, style) {\n    var e = elt(tag, content, className, style);\n    e.setAttribute(\"role\", \"presentation\");\n    return e\n  }\n\n  var range;\n  if (document.createRange) { range = function(node, start, end, endNode) {\n    var r = document.createRange();\n    r.setEnd(endNode || node, end);\n    r.setStart(node, start);\n    return r\n  }; }\n  else { range = function(node, start, end) {\n    var r = document.body.createTextRange();\n    try { r.moveToElementText(node.parentNode); }\n    catch(e) { return r }\n    r.collapse(true);\n    r.moveEnd(\"character\", end);\n    r.moveStart(\"character\", start);\n    return r\n  }; }\n\n  function contains(parent, child) {\n    if (child.nodeType == 3) // Android browser always returns false when child is a textnode\n      { child = child.parentNode; }\n    if (parent.contains)\n      { return parent.contains(child) }\n    do {\n      if (child.nodeType == 11) { child = child.host; }\n      if (child == parent) { return true }\n    } while (child = child.parentNode)\n  }\n\n  function activeElt() {\n    // IE and Edge may throw an \"Unspecified Error\" when accessing document.activeElement.\n    // IE < 10 will throw when accessed while the page is loading or in an iframe.\n    // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.\n    var activeElement;\n    try {\n      activeElement = document.activeElement;\n    } catch(e) {\n      activeElement = document.body || null;\n    }\n    while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement)\n      { activeElement = activeElement.shadowRoot.activeElement; }\n    return activeElement\n  }\n\n  function addClass(node, cls) {\n    var current = node.className;\n    if (!classTest(cls).test(current)) { node.className += (current ? \" \" : \"\") + cls; }\n  }\n  function joinClasses(a, b) {\n    var as = a.split(\" \");\n    for (var i = 0; i < as.length; i++)\n      { if (as[i] && !classTest(as[i]).test(b)) { b += \" \" + as[i]; } }\n    return b\n  }\n\n  var selectInput = function(node) { node.select(); };\n  if (ios) // Mobile Safari apparently has a bug where select() is broken.\n    { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; }\n  else if (ie) // Suppress mysterious IE10 errors\n    { selectInput = function(node) { try { node.select(); } catch(_e) {} }; }\n\n  function bind(f) {\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function(){return f.apply(null, args)}\n  }\n\n  function copyObj(obj, target, overwrite) {\n    if (!target) { target = {}; }\n    for (var prop in obj)\n      { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))\n        { target[prop] = obj[prop]; } }\n    return target\n  }\n\n  // Counts the column offset in a string, taking tabs into account.\n  // Used mostly to find indentation.\n  function countColumn(string, end, tabSize, startIndex, startValue) {\n    if (end == null) {\n      end = string.search(/[^\\s\\u00a0]/);\n      if (end == -1) { end = string.length; }\n    }\n    for (var i = startIndex || 0, n = startValue || 0;;) {\n      var nextTab = string.indexOf(\"\\t\", i);\n      if (nextTab < 0 || nextTab >= end)\n        { return n + (end - i) }\n      n += nextTab - i;\n      n += tabSize - (n % tabSize);\n      i = nextTab + 1;\n    }\n  }\n\n  var Delayed = function() {this.id = null;};\n  Delayed.prototype.set = function (ms, f) {\n    clearTimeout(this.id);\n    this.id = setTimeout(f, ms);\n  };\n\n  function indexOf(array, elt) {\n    for (var i = 0; i < array.length; ++i)\n      { if (array[i] == elt) { return i } }\n    return -1\n  }\n\n  // Number of pixels added to scroller and sizer to hide scrollbar\n  var scrollerGap = 30;\n\n  // Returned or thrown by various protocols to signal 'I'm not\n  // handling this'.\n  var Pass = {toString: function(){return \"CodeMirror.Pass\"}};\n\n  // Reused option objects for setSelection & friends\n  var sel_dontScroll = {scroll: false}, sel_mouse = {origin: \"*mouse\"}, sel_move = {origin: \"+move\"};\n\n  // The inverse of countColumn -- find the offset that corresponds to\n  // a particular column.\n  function findColumn(string, goal, tabSize) {\n    for (var pos = 0, col = 0;;) {\n      var nextTab = string.indexOf(\"\\t\", pos);\n      if (nextTab == -1) { nextTab = string.length; }\n      var skipped = nextTab - pos;\n      if (nextTab == string.length || col + skipped >= goal)\n        { return pos + Math.min(skipped, goal - col) }\n      col += nextTab - pos;\n      col += tabSize - (col % tabSize);\n      pos = nextTab + 1;\n      if (col >= goal) { return pos }\n    }\n  }\n\n  var spaceStrs = [\"\"];\n  function spaceStr(n) {\n    while (spaceStrs.length <= n)\n      { spaceStrs.push(lst(spaceStrs) + \" \"); }\n    return spaceStrs[n]\n  }\n\n  function lst(arr) { return arr[arr.length-1] }\n\n  function map(array, f) {\n    var out = [];\n    for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); }\n    return out\n  }\n\n  function insertSorted(array, value, score) {\n    var pos = 0, priority = score(value);\n    while (pos < array.length && score(array[pos]) <= priority) { pos++; }\n    array.splice(pos, 0, value);\n  }\n\n  function nothing() {}\n\n  function createObj(base, props) {\n    var inst;\n    if (Object.create) {\n      inst = Object.create(base);\n    } else {\n      nothing.prototype = base;\n      inst = new nothing();\n    }\n    if (props) { copyObj(props, inst); }\n    return inst\n  }\n\n  var nonASCIISingleCaseWordChar = /[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/;\n  function isWordCharBasic(ch) {\n    return /\\w/.test(ch) || ch > \"\\x80\" &&\n      (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch))\n  }\n  function isWordChar(ch, helper) {\n    if (!helper) { return isWordCharBasic(ch) }\n    if (helper.source.indexOf(\"\\\\w\") > -1 && isWordCharBasic(ch)) { return true }\n    return helper.test(ch)\n  }\n\n  function isEmpty(obj) {\n    for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } }\n    return true\n  }\n\n  // Extending unicode characters. A series of a non-extending char +\n  // any number of extending chars is treated as a single unit as far\n  // as editing and measuring is concerned. This is not fully correct,\n  // since some scripts/fonts/browsers also treat other configurations\n  // of code points as a group.\n  var extendingChars = /[\\u0300-\\u036f\\u0483-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u065e\\u0670\\u06d6-\\u06dc\\u06de-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0900-\\u0902\\u093c\\u0941-\\u0948\\u094d\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81\\u0a82\\u0abc\\u0ac1-\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d3e\\u0d41-\\u0d44\\u0d4d\\u0d57\\u0d62\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86\\u0f87\\u0f90-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039\\u103a\\u103d\\u103e\\u1058\\u1059\\u105e-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108d\\u109d\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193b\\u1a17\\u1a18\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1b00-\\u1b03\\u1b34\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80\\u1b81\\u1ba2-\\u1ba5\\u1ba8\\u1ba9\\u1c2c-\\u1c33\\u1c36\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1dc0-\\u1de6\\u1dfd-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\ua672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua825\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc\\uaa29-\\uaa2e\\uaa31\\uaa32\\uaa35\\uaa36\\uaa43\\uaa4c\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe5\\uabe8\\uabed\\udc00-\\udfff\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]/;\n  function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) }\n\n  // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range.\n  function skipExtendingChars(str, pos, dir) {\n    while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; }\n    return pos\n  }\n\n  // Returns the value from the range [`from`; `to`] that satisfies\n  // `pred` and is closest to `from`. Assumes that at least `to`\n  // satisfies `pred`. Supports `from` being greater than `to`.\n  function findFirst(pred, from, to) {\n    // At any point we are certain `to` satisfies `pred`, don't know\n    // whether `from` does.\n    var dir = from > to ? -1 : 1;\n    for (;;) {\n      if (from == to) { return from }\n      var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF);\n      if (mid == from) { return pred(mid) ? from : to }\n      if (pred(mid)) { to = mid; }\n      else { from = mid + dir; }\n    }\n  }\n\n  // The display handles the DOM integration, both for input reading\n  // and content drawing. It holds references to DOM nodes and\n  // display-related state.\n\n  function Display(place, doc, input) {\n    var d = this;\n    this.input = input;\n\n    // Covers bottom-right square when both scrollbars are present.\n    d.scrollbarFiller = elt(\"div\", null, \"CodeMirror-scrollbar-filler\");\n    d.scrollbarFiller.setAttribute(\"cm-not-content\", \"true\");\n    // Covers bottom of gutter when coverGutterNextToScrollbar is on\n    // and h scrollbar is present.\n    d.gutterFiller = elt(\"div\", null, \"CodeMirror-gutter-filler\");\n    d.gutterFiller.setAttribute(\"cm-not-content\", \"true\");\n    // Will contain the actual code, positioned to cover the viewport.\n    d.lineDiv = eltP(\"div\", null, \"CodeMirror-code\");\n    // Elements are added to these to represent selection and cursors.\n    d.selectionDiv = elt(\"div\", null, null, \"position: relative; z-index: 1\");\n    d.cursorDiv = elt(\"div\", null, \"CodeMirror-cursors\");\n    // A visibility: hidden element used to find the size of things.\n    d.measure = elt(\"div\", null, \"CodeMirror-measure\");\n    // When lines outside of the viewport are measured, they are drawn in this.\n    d.lineMeasure = elt(\"div\", null, \"CodeMirror-measure\");\n    // Wraps everything that needs to exist inside the vertically-padded coordinate system\n    d.lineSpace = eltP(\"div\", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],\n                      null, \"position: relative; outline: none\");\n    var lines = eltP(\"div\", [d.lineSpace], \"CodeMirror-lines\");\n    // Moved around its parent to cover visible view.\n    d.mover = elt(\"div\", [lines], null, \"position: relative\");\n    // Set to the height of the document, allowing scrolling.\n    d.sizer = elt(\"div\", [d.mover], \"CodeMirror-sizer\");\n    d.sizerWidth = null;\n    // Behavior of elts with overflow: auto and padding is\n    // inconsistent across browsers. This is used to ensure the\n    // scrollable area is big enough.\n    d.heightForcer = elt(\"div\", null, null, \"position: absolute; height: \" + scrollerGap + \"px; width: 1px;\");\n    // Will contain the gutters, if any.\n    d.gutters = elt(\"div\", null, \"CodeMirror-gutters\");\n    d.lineGutter = null;\n    // Actual scrollable element.\n    d.scroller = elt(\"div\", [d.sizer, d.heightForcer, d.gutters], \"CodeMirror-scroll\");\n    d.scroller.setAttribute(\"tabIndex\", \"-1\");\n    // The element in which the editor lives.\n    d.wrapper = elt(\"div\", [d.scrollbarFiller, d.gutterFiller, d.scroller], \"CodeMirror\");\n\n    // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)\n    if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }\n    if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; }\n\n    if (place) {\n      if (place.appendChild) { place.appendChild(d.wrapper); }\n      else { place(d.wrapper); }\n    }\n\n    // Current rendered range (may be bigger than the view window).\n    d.viewFrom = d.viewTo = doc.first;\n    d.reportedViewFrom = d.reportedViewTo = doc.first;\n    // Information about the rendered lines.\n    d.view = [];\n    d.renderedView = null;\n    // Holds info about a single rendered line when it was rendered\n    // for measurement, while not in view.\n    d.externalMeasured = null;\n    // Empty space (in pixels) above the view\n    d.viewOffset = 0;\n    d.lastWrapHeight = d.lastWrapWidth = 0;\n    d.updateLineNumbers = null;\n\n    d.nativeBarWidth = d.barHeight = d.barWidth = 0;\n    d.scrollbarsClipped = false;\n\n    // Used to only resize the line number gutter when necessary (when\n    // the amount of lines crosses a boundary that makes its width change)\n    d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;\n    // Set to true when a non-horizontal-scrolling line widget is\n    // added. As an optimization, line widget aligning is skipped when\n    // this is false.\n    d.alignWidgets = false;\n\n    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n\n    // Tracks the maximum line length so that the horizontal scrollbar\n    // can be kept static when scrolling.\n    d.maxLine = null;\n    d.maxLineLength = 0;\n    d.maxLineChanged = false;\n\n    // Used for measuring wheel scrolling granularity\n    d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;\n\n    // True when shift is held down.\n    d.shift = false;\n\n    // Used to track whether anything happened since the context menu\n    // was opened.\n    d.selForContextMenu = null;\n\n    d.activeTouch = null;\n\n    input.init(d);\n  }\n\n  // Find the line object corresponding to the given line number.\n  function getLine(doc, n) {\n    n -= doc.first;\n    if (n < 0 || n >= doc.size) { throw new Error(\"There is no line \" + (n + doc.first) + \" in the document.\") }\n    var chunk = doc;\n    while (!chunk.lines) {\n      for (var i = 0;; ++i) {\n        var child = chunk.children[i], sz = child.chunkSize();\n        if (n < sz) { chunk = child; break }\n        n -= sz;\n      }\n    }\n    return chunk.lines[n]\n  }\n\n  // Get the part of a document between two positions, as an array of\n  // strings.\n  function getBetween(doc, start, end) {\n    var out = [], n = start.line;\n    doc.iter(start.line, end.line + 1, function (line) {\n      var text = line.text;\n      if (n == end.line) { text = text.slice(0, end.ch); }\n      if (n == start.line) { text = text.slice(start.ch); }\n      out.push(text);\n      ++n;\n    });\n    return out\n  }\n  // Get the lines between from and to, as array of strings.\n  function getLines(doc, from, to) {\n    var out = [];\n    doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value\n    return out\n  }\n\n  // Update the height of a line, propagating the height change\n  // upwards to parent nodes.\n  function updateLineHeight(line, height) {\n    var diff = height - line.height;\n    if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } }\n  }\n\n  // Given a line object, find its line number by walking up through\n  // its parent links.\n  function lineNo(line) {\n    if (line.parent == null) { return null }\n    var cur = line.parent, no = indexOf(cur.lines, line);\n    for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {\n      for (var i = 0;; ++i) {\n        if (chunk.children[i] == cur) { break }\n        no += chunk.children[i].chunkSize();\n      }\n    }\n    return no + cur.first\n  }\n\n  // Find the line at the given vertical position, using the height\n  // information in the document tree.\n  function lineAtHeight(chunk, h) {\n    var n = chunk.first;\n    outer: do {\n      for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) {\n        var child = chunk.children[i$1], ch = child.height;\n        if (h < ch) { chunk = child; continue outer }\n        h -= ch;\n        n += child.chunkSize();\n      }\n      return n\n    } while (!chunk.lines)\n    var i = 0;\n    for (; i < chunk.lines.length; ++i) {\n      var line = chunk.lines[i], lh = line.height;\n      if (h < lh) { break }\n      h -= lh;\n    }\n    return n + i\n  }\n\n  function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}\n\n  function lineNumberFor(options, i) {\n    return String(options.lineNumberFormatter(i + options.firstLineNumber))\n  }\n\n  // A Pos instance represents a position within the text.\n  function Pos(line, ch, sticky) {\n    if ( sticky === void 0 ) sticky = null;\n\n    if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) }\n    this.line = line;\n    this.ch = ch;\n    this.sticky = sticky;\n  }\n\n  // Compare two positions, return 0 if they are the same, a negative\n  // number when a is less, and a positive number otherwise.\n  function cmp(a, b) { return a.line - b.line || a.ch - b.ch }\n\n  function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 }\n\n  function copyPos(x) {return Pos(x.line, x.ch)}\n  function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }\n  function minPos(a, b) { return cmp(a, b) < 0 ? a : b }\n\n  // Most of the external API clips given positions to make sure they\n  // actually exist within the document.\n  function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))}\n  function clipPos(doc, pos) {\n    if (pos.line < doc.first) { return Pos(doc.first, 0) }\n    var last = doc.first + doc.size - 1;\n    if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) }\n    return clipToLen(pos, getLine(doc, pos.line).text.length)\n  }\n  function clipToLen(pos, linelen) {\n    var ch = pos.ch;\n    if (ch == null || ch > linelen) { return Pos(pos.line, linelen) }\n    else if (ch < 0) { return Pos(pos.line, 0) }\n    else { return pos }\n  }\n  function clipPosArray(doc, array) {\n    var out = [];\n    for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); }\n    return out\n  }\n\n  // Optimize some code when these features are not used.\n  var sawReadOnlySpans = false, sawCollapsedSpans = false;\n\n  function seeReadOnlySpans() {\n    sawReadOnlySpans = true;\n  }\n\n  function seeCollapsedSpans() {\n    sawCollapsedSpans = true;\n  }\n\n  // TEXTMARKER SPANS\n\n  function MarkedSpan(marker, from, to) {\n    this.marker = marker;\n    this.from = from; this.to = to;\n  }\n\n  // Search an array of spans for a span matching the given marker.\n  function getMarkedSpanFor(spans, marker) {\n    if (spans) { for (var i = 0; i < spans.length; ++i) {\n      var span = spans[i];\n      if (span.marker == marker) { return span }\n    } }\n  }\n  // Remove a span from an array, returning undefined if no spans are\n  // left (we don't store arrays for lines without spans).\n  function removeMarkedSpan(spans, span) {\n    var r;\n    for (var i = 0; i < spans.length; ++i)\n      { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } }\n    return r\n  }\n  // Add a span to a line.\n  function addMarkedSpan(line, span) {\n    line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];\n    span.marker.attachLine(line);\n  }\n\n  // Used for the algorithm that adjusts markers for a change in the\n  // document. These functions cut an array of spans at a given\n  // character position, returning an array of remaining chunks (or\n  // undefined if nothing remains).\n  function markedSpansBefore(old, startCh, isInsert) {\n    var nw;\n    if (old) { for (var i = 0; i < old.length; ++i) {\n      var span = old[i], marker = span.marker;\n      var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);\n      if (startsBefore || span.from == startCh && marker.type == \"bookmark\" && (!isInsert || !span.marker.insertLeft)) {\n        var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh)\n        ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));\n      }\n    } }\n    return nw\n  }\n  function markedSpansAfter(old, endCh, isInsert) {\n    var nw;\n    if (old) { for (var i = 0; i < old.length; ++i) {\n      var span = old[i], marker = span.marker;\n      var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);\n      if (endsAfter || span.from == endCh && marker.type == \"bookmark\" && (!isInsert || span.marker.insertLeft)) {\n        var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh)\n        ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,\n                                              span.to == null ? null : span.to - endCh));\n      }\n    } }\n    return nw\n  }\n\n  // Given a change object, compute the new set of marker spans that\n  // cover the line in which the change took place. Removes spans\n  // entirely within the change, reconnects spans belonging to the\n  // same marker that appear on both sides of the change, and cuts off\n  // spans partially within the change. Returns an array of span\n  // arrays with one element for each line in (after) the change.\n  function stretchSpansOverChange(doc, change) {\n    if (change.full) { return null }\n    var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;\n    var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;\n    if (!oldFirst && !oldLast) { return null }\n\n    var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;\n    // Get the spans that 'stick out' on both sides\n    var first = markedSpansBefore(oldFirst, startCh, isInsert);\n    var last = markedSpansAfter(oldLast, endCh, isInsert);\n\n    // Next, merge those two ends\n    var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);\n    if (first) {\n      // Fix up .to properties of first\n      for (var i = 0; i < first.length; ++i) {\n        var span = first[i];\n        if (span.to == null) {\n          var found = getMarkedSpanFor(last, span.marker);\n          if (!found) { span.to = startCh; }\n          else if (sameLine) { span.to = found.to == null ? null : found.to + offset; }\n        }\n      }\n    }\n    if (last) {\n      // Fix up .from in last (or move them into first in case of sameLine)\n      for (var i$1 = 0; i$1 < last.length; ++i$1) {\n        var span$1 = last[i$1];\n        if (span$1.to != null) { span$1.to += offset; }\n        if (span$1.from == null) {\n          var found$1 = getMarkedSpanFor(first, span$1.marker);\n          if (!found$1) {\n            span$1.from = offset;\n            if (sameLine) { (first || (first = [])).push(span$1); }\n          }\n        } else {\n          span$1.from += offset;\n          if (sameLine) { (first || (first = [])).push(span$1); }\n        }\n      }\n    }\n    // Make sure we didn't create any zero-length spans\n    if (first) { first = clearEmptySpans(first); }\n    if (last && last != first) { last = clearEmptySpans(last); }\n\n    var newMarkers = [first];\n    if (!sameLine) {\n      // Fill gap with whole-line-spans\n      var gap = change.text.length - 2, gapMarkers;\n      if (gap > 0 && first)\n        { for (var i$2 = 0; i$2 < first.length; ++i$2)\n          { if (first[i$2].to == null)\n            { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } }\n      for (var i$3 = 0; i$3 < gap; ++i$3)\n        { newMarkers.push(gapMarkers); }\n      newMarkers.push(last);\n    }\n    return newMarkers\n  }\n\n  // Remove spans that are empty and don't have a clearWhenEmpty\n  // option of false.\n  function clearEmptySpans(spans) {\n    for (var i = 0; i < spans.length; ++i) {\n      var span = spans[i];\n      if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)\n        { spans.splice(i--, 1); }\n    }\n    if (!spans.length) { return null }\n    return spans\n  }\n\n  // Used to 'clip' out readOnly ranges when making a change.\n  function removeReadOnlyRanges(doc, from, to) {\n    var markers = null;\n    doc.iter(from.line, to.line + 1, function (line) {\n      if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {\n        var mark = line.markedSpans[i].marker;\n        if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))\n          { (markers || (markers = [])).push(mark); }\n      } }\n    });\n    if (!markers) { return null }\n    var parts = [{from: from, to: to}];\n    for (var i = 0; i < markers.length; ++i) {\n      var mk = markers[i], m = mk.find(0);\n      for (var j = 0; j < parts.length; ++j) {\n        var p = parts[j];\n        if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue }\n        var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);\n        if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)\n          { newParts.push({from: p.from, to: m.from}); }\n        if (dto > 0 || !mk.inclusiveRight && !dto)\n          { newParts.push({from: m.to, to: p.to}); }\n        parts.splice.apply(parts, newParts);\n        j += newParts.length - 3;\n      }\n    }\n    return parts\n  }\n\n  // Connect or disconnect spans from a line.\n  function detachMarkedSpans(line) {\n    var spans = line.markedSpans;\n    if (!spans) { return }\n    for (var i = 0; i < spans.length; ++i)\n      { spans[i].marker.detachLine(line); }\n    line.markedSpans = null;\n  }\n  function attachMarkedSpans(line, spans) {\n    if (!spans) { return }\n    for (var i = 0; i < spans.length; ++i)\n      { spans[i].marker.attachLine(line); }\n    line.markedSpans = spans;\n  }\n\n  // Helpers used when computing which overlapping collapsed span\n  // counts as the larger one.\n  function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }\n  function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }\n\n  // Returns a number indicating which of two overlapping collapsed\n  // spans is larger (and thus includes the other). Falls back to\n  // comparing ids when the spans cover exactly the same range.\n  function compareCollapsedMarkers(a, b) {\n    var lenDiff = a.lines.length - b.lines.length;\n    if (lenDiff != 0) { return lenDiff }\n    var aPos = a.find(), bPos = b.find();\n    var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);\n    if (fromCmp) { return -fromCmp }\n    var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);\n    if (toCmp) { return toCmp }\n    return b.id - a.id\n  }\n\n  // Find out whether a line ends or starts in a collapsed span. If\n  // so, return the marker for that span.\n  function collapsedSpanAtSide(line, start) {\n    var sps = sawCollapsedSpans && line.markedSpans, found;\n    if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {\n      sp = sps[i];\n      if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&\n          (!found || compareCollapsedMarkers(found, sp.marker) < 0))\n        { found = sp.marker; }\n    } }\n    return found\n  }\n  function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) }\n  function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) }\n\n  function collapsedSpanAround(line, ch) {\n    var sps = sawCollapsedSpans && line.markedSpans, found;\n    if (sps) { for (var i = 0; i < sps.length; ++i) {\n      var sp = sps[i];\n      if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) &&\n          (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; }\n    } }\n    return found\n  }\n\n  // Test whether there exists a collapsed span that partially\n  // overlaps (covers the start or end, but not both) of a new span.\n  // Such overlap is not allowed.\n  function conflictingCollapsedRange(doc, lineNo$$1, from, to, marker) {\n    var line = getLine(doc, lineNo$$1);\n    var sps = sawCollapsedSpans && line.markedSpans;\n    if (sps) { for (var i = 0; i < sps.length; ++i) {\n      var sp = sps[i];\n      if (!sp.marker.collapsed) { continue }\n      var found = sp.marker.find(0);\n      var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);\n      var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);\n      if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue }\n      if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||\n          fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))\n        { return true }\n    } }\n  }\n\n  // A visual line is a line as drawn on the screen. Folding, for\n  // example, can cause multiple logical lines to appear on the same\n  // visual line. This finds the start of the visual line that the\n  // given line is part of (usually that is the line itself).\n  function visualLine(line) {\n    var merged;\n    while (merged = collapsedSpanAtStart(line))\n      { line = merged.find(-1, true).line; }\n    return line\n  }\n\n  function visualLineEnd(line) {\n    var merged;\n    while (merged = collapsedSpanAtEnd(line))\n      { line = merged.find(1, true).line; }\n    return line\n  }\n\n  // Returns an array of logical lines that continue the visual line\n  // started by the argument, or undefined if there are no such lines.\n  function visualLineContinued(line) {\n    var merged, lines;\n    while (merged = collapsedSpanAtEnd(line)) {\n      line = merged.find(1, true).line\n      ;(lines || (lines = [])).push(line);\n    }\n    return lines\n  }\n\n  // Get the line number of the start of the visual line that the\n  // given line number is part of.\n  function visualLineNo(doc, lineN) {\n    var line = getLine(doc, lineN), vis = visualLine(line);\n    if (line == vis) { return lineN }\n    return lineNo(vis)\n  }\n\n  // Get the line number of the start of the next visual line after\n  // the given line.\n  function visualLineEndNo(doc, lineN) {\n    if (lineN > doc.lastLine()) { return lineN }\n    var line = getLine(doc, lineN), merged;\n    if (!lineIsHidden(doc, line)) { return lineN }\n    while (merged = collapsedSpanAtEnd(line))\n      { line = merged.find(1, true).line; }\n    return lineNo(line) + 1\n  }\n\n  // Compute whether a line is hidden. Lines count as hidden when they\n  // are part of a visual line that starts with another line, or when\n  // they are entirely covered by collapsed, non-widget span.\n  function lineIsHidden(doc, line) {\n    var sps = sawCollapsedSpans && line.markedSpans;\n    if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {\n      sp = sps[i];\n      if (!sp.marker.collapsed) { continue }\n      if (sp.from == null) { return true }\n      if (sp.marker.widgetNode) { continue }\n      if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))\n        { return true }\n    } }\n  }\n  function lineIsHiddenInner(doc, line, span) {\n    if (span.to == null) {\n      var end = span.marker.find(1, true);\n      return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker))\n    }\n    if (span.marker.inclusiveRight && span.to == line.text.length)\n      { return true }\n    for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) {\n      sp = line.markedSpans[i];\n      if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&\n          (sp.to == null || sp.to != span.from) &&\n          (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&\n          lineIsHiddenInner(doc, line, sp)) { return true }\n    }\n  }\n\n  // Find the height above the given line.\n  function heightAtLine(lineObj) {\n    lineObj = visualLine(lineObj);\n\n    var h = 0, chunk = lineObj.parent;\n    for (var i = 0; i < chunk.lines.length; ++i) {\n      var line = chunk.lines[i];\n      if (line == lineObj) { break }\n      else { h += line.height; }\n    }\n    for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {\n      for (var i$1 = 0; i$1 < p.children.length; ++i$1) {\n        var cur = p.children[i$1];\n        if (cur == chunk) { break }\n        else { h += cur.height; }\n      }\n    }\n    return h\n  }\n\n  // Compute the character length of a line, taking into account\n  // collapsed ranges (see markText) that might hide parts, and join\n  // other lines onto it.\n  function lineLength(line) {\n    if (line.height == 0) { return 0 }\n    var len = line.text.length, merged, cur = line;\n    while (merged = collapsedSpanAtStart(cur)) {\n      var found = merged.find(0, true);\n      cur = found.from.line;\n      len += found.from.ch - found.to.ch;\n    }\n    cur = line;\n    while (merged = collapsedSpanAtEnd(cur)) {\n      var found$1 = merged.find(0, true);\n      len -= cur.text.length - found$1.from.ch;\n      cur = found$1.to.line;\n      len += cur.text.length - found$1.to.ch;\n    }\n    return len\n  }\n\n  // Find the longest line in the document.\n  function findMaxLine(cm) {\n    var d = cm.display, doc = cm.doc;\n    d.maxLine = getLine(doc, doc.first);\n    d.maxLineLength = lineLength(d.maxLine);\n    d.maxLineChanged = true;\n    doc.iter(function (line) {\n      var len = lineLength(line);\n      if (len > d.maxLineLength) {\n        d.maxLineLength = len;\n        d.maxLine = line;\n      }\n    });\n  }\n\n  // BIDI HELPERS\n\n  function iterateBidiSections(order, from, to, f) {\n    if (!order) { return f(from, to, \"ltr\", 0) }\n    var found = false;\n    for (var i = 0; i < order.length; ++i) {\n      var part = order[i];\n      if (part.from < to && part.to > from || from == to && part.to == from) {\n        f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? \"rtl\" : \"ltr\", i);\n        found = true;\n      }\n    }\n    if (!found) { f(from, to, \"ltr\"); }\n  }\n\n  var bidiOther = null;\n  function getBidiPartAt(order, ch, sticky) {\n    var found;\n    bidiOther = null;\n    for (var i = 0; i < order.length; ++i) {\n      var cur = order[i];\n      if (cur.from < ch && cur.to > ch) { return i }\n      if (cur.to == ch) {\n        if (cur.from != cur.to && sticky == \"before\") { found = i; }\n        else { bidiOther = i; }\n      }\n      if (cur.from == ch) {\n        if (cur.from != cur.to && sticky != \"before\") { found = i; }\n        else { bidiOther = i; }\n      }\n    }\n    return found != null ? found : bidiOther\n  }\n\n  // Bidirectional ordering algorithm\n  // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm\n  // that this (partially) implements.\n\n  // One-char codes used for character types:\n  // L (L):   Left-to-Right\n  // R (R):   Right-to-Left\n  // r (AL):  Right-to-Left Arabic\n  // 1 (EN):  European Number\n  // + (ES):  European Number Separator\n  // % (ET):  European Number Terminator\n  // n (AN):  Arabic Number\n  // , (CS):  Common Number Separator\n  // m (NSM): Non-Spacing Mark\n  // b (BN):  Boundary Neutral\n  // s (B):   Paragraph Separator\n  // t (S):   Segment Separator\n  // w (WS):  Whitespace\n  // N (ON):  Other Neutrals\n\n  // Returns null if characters are ordered as they appear\n  // (left-to-right), or an array of sections ({from, to, level}\n  // objects) in the order in which they occur visually.\n  var bidiOrdering = (function() {\n    // Character types for codepoints 0 to 0xff\n    var lowTypes = \"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\";\n    // Character types for codepoints 0x600 to 0x6f9\n    var arabicTypes = \"nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111\";\n    function charType(code) {\n      if (code <= 0xf7) { return lowTypes.charAt(code) }\n      else if (0x590 <= code && code <= 0x5f4) { return \"R\" }\n      else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) }\n      else if (0x6ee <= code && code <= 0x8ac) { return \"r\" }\n      else if (0x2000 <= code && code <= 0x200b) { return \"w\" }\n      else if (code == 0x200c) { return \"b\" }\n      else { return \"L\" }\n    }\n\n    var bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n    var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;\n\n    function BidiSpan(level, from, to) {\n      this.level = level;\n      this.from = from; this.to = to;\n    }\n\n    return function(str, direction) {\n      var outerType = direction == \"ltr\" ? \"L\" : \"R\";\n\n      if (str.length == 0 || direction == \"ltr\" && !bidiRE.test(str)) { return false }\n      var len = str.length, types = [];\n      for (var i = 0; i < len; ++i)\n        { types.push(charType(str.charCodeAt(i))); }\n\n      // W1. Examine each non-spacing mark (NSM) in the level run, and\n      // change the type of the NSM to the type of the previous\n      // character. If the NSM is at the start of the level run, it will\n      // get the type of sor.\n      for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) {\n        var type = types[i$1];\n        if (type == \"m\") { types[i$1] = prev; }\n        else { prev = type; }\n      }\n\n      // W2. Search backwards from each instance of a European number\n      // until the first strong type (R, L, AL, or sor) is found. If an\n      // AL is found, change the type of the European number to Arabic\n      // number.\n      // W3. Change all ALs to R.\n      for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) {\n        var type$1 = types[i$2];\n        if (type$1 == \"1\" && cur == \"r\") { types[i$2] = \"n\"; }\n        else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == \"r\") { types[i$2] = \"R\"; } }\n      }\n\n      // W4. A single European separator between two European numbers\n      // changes to a European number. A single common separator between\n      // two numbers of the same type changes to that type.\n      for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) {\n        var type$2 = types[i$3];\n        if (type$2 == \"+\" && prev$1 == \"1\" && types[i$3+1] == \"1\") { types[i$3] = \"1\"; }\n        else if (type$2 == \",\" && prev$1 == types[i$3+1] &&\n                 (prev$1 == \"1\" || prev$1 == \"n\")) { types[i$3] = prev$1; }\n        prev$1 = type$2;\n      }\n\n      // W5. A sequence of European terminators adjacent to European\n      // numbers changes to all European numbers.\n      // W6. Otherwise, separators and terminators change to Other\n      // Neutral.\n      for (var i$4 = 0; i$4 < len; ++i$4) {\n        var type$3 = types[i$4];\n        if (type$3 == \",\") { types[i$4] = \"N\"; }\n        else if (type$3 == \"%\") {\n          var end = (void 0);\n          for (end = i$4 + 1; end < len && types[end] == \"%\"; ++end) {}\n          var replace = (i$4 && types[i$4-1] == \"!\") || (end < len && types[end] == \"1\") ? \"1\" : \"N\";\n          for (var j = i$4; j < end; ++j) { types[j] = replace; }\n          i$4 = end - 1;\n        }\n      }\n\n      // W7. Search backwards from each instance of a European number\n      // until the first strong type (R, L, or sor) is found. If an L is\n      // found, then change the type of the European number to L.\n      for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) {\n        var type$4 = types[i$5];\n        if (cur$1 == \"L\" && type$4 == \"1\") { types[i$5] = \"L\"; }\n        else if (isStrong.test(type$4)) { cur$1 = type$4; }\n      }\n\n      // N1. A sequence of neutrals takes the direction of the\n      // surrounding strong text if the text on both sides has the same\n      // direction. European and Arabic numbers act as if they were R in\n      // terms of their influence on neutrals. Start-of-level-run (sor)\n      // and end-of-level-run (eor) are used at level run boundaries.\n      // N2. Any remaining neutrals take the embedding direction.\n      for (var i$6 = 0; i$6 < len; ++i$6) {\n        if (isNeutral.test(types[i$6])) {\n          var end$1 = (void 0);\n          for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {}\n          var before = (i$6 ? types[i$6-1] : outerType) == \"L\";\n          var after = (end$1 < len ? types[end$1] : outerType) == \"L\";\n          var replace$1 = before == after ? (before ? \"L\" : \"R\") : outerType;\n          for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; }\n          i$6 = end$1 - 1;\n        }\n      }\n\n      // Here we depart from the documented algorithm, in order to avoid\n      // building up an actual levels array. Since there are only three\n      // levels (0, 1, 2) in an implementation that doesn't take\n      // explicit embedding into account, we can build up the order on\n      // the fly, without following the level-based algorithm.\n      var order = [], m;\n      for (var i$7 = 0; i$7 < len;) {\n        if (countsAsLeft.test(types[i$7])) {\n          var start = i$7;\n          for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {}\n          order.push(new BidiSpan(0, start, i$7));\n        } else {\n          var pos = i$7, at = order.length;\n          for (++i$7; i$7 < len && types[i$7] != \"L\"; ++i$7) {}\n          for (var j$2 = pos; j$2 < i$7;) {\n            if (countsAsNum.test(types[j$2])) {\n              if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); }\n              var nstart = j$2;\n              for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {}\n              order.splice(at, 0, new BidiSpan(2, nstart, j$2));\n              pos = j$2;\n            } else { ++j$2; }\n          }\n          if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); }\n        }\n      }\n      if (direction == \"ltr\") {\n        if (order[0].level == 1 && (m = str.match(/^\\s+/))) {\n          order[0].from = m[0].length;\n          order.unshift(new BidiSpan(0, 0, m[0].length));\n        }\n        if (lst(order).level == 1 && (m = str.match(/\\s+$/))) {\n          lst(order).to -= m[0].length;\n          order.push(new BidiSpan(0, len - m[0].length, len));\n        }\n      }\n\n      return direction == \"rtl\" ? order.reverse() : order\n    }\n  })();\n\n  // Get the bidi ordering for the given line (and cache it). Returns\n  // false for lines that are fully left-to-right, and an array of\n  // BidiSpan objects otherwise.\n  function getOrder(line, direction) {\n    var order = line.order;\n    if (order == null) { order = line.order = bidiOrdering(line.text, direction); }\n    return order\n  }\n\n  // EVENT HANDLING\n\n  // Lightweight event framework. on/off also work on DOM nodes,\n  // registering native DOM handlers.\n\n  var noHandlers = [];\n\n  var on = function(emitter, type, f) {\n    if (emitter.addEventListener) {\n      emitter.addEventListener(type, f, false);\n    } else if (emitter.attachEvent) {\n      emitter.attachEvent(\"on\" + type, f);\n    } else {\n      var map$$1 = emitter._handlers || (emitter._handlers = {});\n      map$$1[type] = (map$$1[type] || noHandlers).concat(f);\n    }\n  };\n\n  function getHandlers(emitter, type) {\n    return emitter._handlers && emitter._handlers[type] || noHandlers\n  }\n\n  function off(emitter, type, f) {\n    if (emitter.removeEventListener) {\n      emitter.removeEventListener(type, f, false);\n    } else if (emitter.detachEvent) {\n      emitter.detachEvent(\"on\" + type, f);\n    } else {\n      var map$$1 = emitter._handlers, arr = map$$1 && map$$1[type];\n      if (arr) {\n        var index = indexOf(arr, f);\n        if (index > -1)\n          { map$$1[type] = arr.slice(0, index).concat(arr.slice(index + 1)); }\n      }\n    }\n  }\n\n  function signal(emitter, type /*, values...*/) {\n    var handlers = getHandlers(emitter, type);\n    if (!handlers.length) { return }\n    var args = Array.prototype.slice.call(arguments, 2);\n    for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); }\n  }\n\n  // The DOM events that CodeMirror handles can be overridden by\n  // registering a (non-DOM) handler on the editor for the event name,\n  // and preventDefault-ing the event in that handler.\n  function signalDOMEvent(cm, e, override) {\n    if (typeof e == \"string\")\n      { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; }\n    signal(cm, override || e.type, cm, e);\n    return e_defaultPrevented(e) || e.codemirrorIgnore\n  }\n\n  function signalCursorActivity(cm) {\n    var arr = cm._handlers && cm._handlers.cursorActivity;\n    if (!arr) { return }\n    var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);\n    for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1)\n      { set.push(arr[i]); } }\n  }\n\n  function hasHandler(emitter, type) {\n    return getHandlers(emitter, type).length > 0\n  }\n\n  // Add on and off methods to a constructor's prototype, to make\n  // registering events on such objects more convenient.\n  function eventMixin(ctor) {\n    ctor.prototype.on = function(type, f) {on(this, type, f);};\n    ctor.prototype.off = function(type, f) {off(this, type, f);};\n  }\n\n  // Due to the fact that we still support jurassic IE versions, some\n  // compatibility wrappers are needed.\n\n  function e_preventDefault(e) {\n    if (e.preventDefault) { e.preventDefault(); }\n    else { e.returnValue = false; }\n  }\n  function e_stopPropagation(e) {\n    if (e.stopPropagation) { e.stopPropagation(); }\n    else { e.cancelBubble = true; }\n  }\n  function e_defaultPrevented(e) {\n    return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false\n  }\n  function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}\n\n  function e_target(e) {return e.target || e.srcElement}\n  function e_button(e) {\n    var b = e.which;\n    if (b == null) {\n      if (e.button & 1) { b = 1; }\n      else if (e.button & 2) { b = 3; }\n      else if (e.button & 4) { b = 2; }\n    }\n    if (mac && e.ctrlKey && b == 1) { b = 3; }\n    return b\n  }\n\n  // Detect drag-and-drop\n  var dragAndDrop = function() {\n    // There is *some* kind of drag-and-drop support in IE6-8, but I\n    // couldn't get it to work yet.\n    if (ie && ie_version < 9) { return false }\n    var div = elt('div');\n    return \"draggable\" in div || \"dragDrop\" in div\n  }();\n\n  var zwspSupported;\n  function zeroWidthElement(measure) {\n    if (zwspSupported == null) {\n      var test = elt(\"span\", \"\\u200b\");\n      removeChildrenAndAdd(measure, elt(\"span\", [test, document.createTextNode(\"x\")]));\n      if (measure.firstChild.offsetHeight != 0)\n        { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); }\n    }\n    var node = zwspSupported ? elt(\"span\", \"\\u200b\") :\n      elt(\"span\", \"\\u00a0\", null, \"display: inline-block; width: 1px; margin-right: -1px\");\n    node.setAttribute(\"cm-text\", \"\");\n    return node\n  }\n\n  // Feature-detect IE's crummy client rect reporting for bidi text\n  var badBidiRects;\n  function hasBadBidiRects(measure) {\n    if (badBidiRects != null) { return badBidiRects }\n    var txt = removeChildrenAndAdd(measure, document.createTextNode(\"A\\u062eA\"));\n    var r0 = range(txt, 0, 1).getBoundingClientRect();\n    var r1 = range(txt, 1, 2).getBoundingClientRect();\n    removeChildren(measure);\n    if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780)\n    return badBidiRects = (r1.right - r0.right < 3)\n  }\n\n  // See if \"\".split is the broken IE version, if so, provide an\n  // alternative way to split lines.\n  var splitLinesAuto = \"\\n\\nb\".split(/\\n/).length != 3 ? function (string) {\n    var pos = 0, result = [], l = string.length;\n    while (pos <= l) {\n      var nl = string.indexOf(\"\\n\", pos);\n      if (nl == -1) { nl = string.length; }\n      var line = string.slice(pos, string.charAt(nl - 1) == \"\\r\" ? nl - 1 : nl);\n      var rt = line.indexOf(\"\\r\");\n      if (rt != -1) {\n        result.push(line.slice(0, rt));\n        pos += rt + 1;\n      } else {\n        result.push(line);\n        pos = nl + 1;\n      }\n    }\n    return result\n  } : function (string) { return string.split(/\\r\\n?|\\n/); };\n\n  var hasSelection = window.getSelection ? function (te) {\n    try { return te.selectionStart != te.selectionEnd }\n    catch(e) { return false }\n  } : function (te) {\n    var range$$1;\n    try {range$$1 = te.ownerDocument.selection.createRange();}\n    catch(e) {}\n    if (!range$$1 || range$$1.parentElement() != te) { return false }\n    return range$$1.compareEndPoints(\"StartToEnd\", range$$1) != 0\n  };\n\n  var hasCopyEvent = (function () {\n    var e = elt(\"div\");\n    if (\"oncopy\" in e) { return true }\n    e.setAttribute(\"oncopy\", \"return;\");\n    return typeof e.oncopy == \"function\"\n  })();\n\n  var badZoomedRects = null;\n  function hasBadZoomedRects(measure) {\n    if (badZoomedRects != null) { return badZoomedRects }\n    var node = removeChildrenAndAdd(measure, elt(\"span\", \"x\"));\n    var normal = node.getBoundingClientRect();\n    var fromRange = range(node, 0, 1).getBoundingClientRect();\n    return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1\n  }\n\n  // Known modes, by name and by MIME\n  var modes = {}, mimeModes = {};\n\n  // Extra arguments are stored as the mode's dependencies, which is\n  // used by (legacy) mechanisms like loadmode.js to automatically\n  // load a mode. (Preferred mechanism is the require/define calls.)\n  function defineMode(name, mode) {\n    if (arguments.length > 2)\n      { mode.dependencies = Array.prototype.slice.call(arguments, 2); }\n    modes[name] = mode;\n  }\n\n  function defineMIME(mime, spec) {\n    mimeModes[mime] = spec;\n  }\n\n  // Given a MIME type, a {name, ...options} config object, or a name\n  // string, return a mode config object.\n  function resolveMode(spec) {\n    if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec)) {\n      spec = mimeModes[spec];\n    } else if (spec && typeof spec.name == \"string\" && mimeModes.hasOwnProperty(spec.name)) {\n      var found = mimeModes[spec.name];\n      if (typeof found == \"string\") { found = {name: found}; }\n      spec = createObj(found, spec);\n      spec.name = found.name;\n    } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(spec)) {\n      return resolveMode(\"application/xml\")\n    } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(spec)) {\n      return resolveMode(\"application/json\")\n    }\n    if (typeof spec == \"string\") { return {name: spec} }\n    else { return spec || {name: \"null\"} }\n  }\n\n  // Given a mode spec (anything that resolveMode accepts), find and\n  // initialize an actual mode object.\n  function getMode(options, spec) {\n    spec = resolveMode(spec);\n    var mfactory = modes[spec.name];\n    if (!mfactory) { return getMode(options, \"text/plain\") }\n    var modeObj = mfactory(options, spec);\n    if (modeExtensions.hasOwnProperty(spec.name)) {\n      var exts = modeExtensions[spec.name];\n      for (var prop in exts) {\n        if (!exts.hasOwnProperty(prop)) { continue }\n        if (modeObj.hasOwnProperty(prop)) { modeObj[\"_\" + prop] = modeObj[prop]; }\n        modeObj[prop] = exts[prop];\n      }\n    }\n    modeObj.name = spec.name;\n    if (spec.helperType) { modeObj.helperType = spec.helperType; }\n    if (spec.modeProps) { for (var prop$1 in spec.modeProps)\n      { modeObj[prop$1] = spec.modeProps[prop$1]; } }\n\n    return modeObj\n  }\n\n  // This can be used to attach properties to mode objects from\n  // outside the actual mode definition.\n  var modeExtensions = {};\n  function extendMode(mode, properties) {\n    var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});\n    copyObj(properties, exts);\n  }\n\n  function copyState(mode, state) {\n    if (state === true) { return state }\n    if (mode.copyState) { return mode.copyState(state) }\n    var nstate = {};\n    for (var n in state) {\n      var val = state[n];\n      if (val instanceof Array) { val = val.concat([]); }\n      nstate[n] = val;\n    }\n    return nstate\n  }\n\n  // Given a mode and a state (for that mode), find the inner mode and\n  // state at the position that the state refers to.\n  function innerMode(mode, state) {\n    var info;\n    while (mode.innerMode) {\n      info = mode.innerMode(state);\n      if (!info || info.mode == mode) { break }\n      state = info.state;\n      mode = info.mode;\n    }\n    return info || {mode: mode, state: state}\n  }\n\n  function startState(mode, a1, a2) {\n    return mode.startState ? mode.startState(a1, a2) : true\n  }\n\n  // STRING STREAM\n\n  // Fed to the mode parsers, provides helper functions to make\n  // parsers more succinct.\n\n  var StringStream = function(string, tabSize, lineOracle) {\n    this.pos = this.start = 0;\n    this.string = string;\n    this.tabSize = tabSize || 8;\n    this.lastColumnPos = this.lastColumnValue = 0;\n    this.lineStart = 0;\n    this.lineOracle = lineOracle;\n  };\n\n  StringStream.prototype.eol = function () {return this.pos >= this.string.length};\n  StringStream.prototype.sol = function () {return this.pos == this.lineStart};\n  StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined};\n  StringStream.prototype.next = function () {\n    if (this.pos < this.string.length)\n      { return this.string.charAt(this.pos++) }\n  };\n  StringStream.prototype.eat = function (match) {\n    var ch = this.string.charAt(this.pos);\n    var ok;\n    if (typeof match == \"string\") { ok = ch == match; }\n    else { ok = ch && (match.test ? match.test(ch) : match(ch)); }\n    if (ok) {++this.pos; return ch}\n  };\n  StringStream.prototype.eatWhile = function (match) {\n    var start = this.pos;\n    while (this.eat(match)){}\n    return this.pos > start\n  };\n  StringStream.prototype.eatSpace = function () {\n      var this$1 = this;\n\n    var start = this.pos;\n    while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) { ++this$1.pos; }\n    return this.pos > start\n  };\n  StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;};\n  StringStream.prototype.skipTo = function (ch) {\n    var found = this.string.indexOf(ch, this.pos);\n    if (found > -1) {this.pos = found; return true}\n  };\n  StringStream.prototype.backUp = function (n) {this.pos -= n;};\n  StringStream.prototype.column = function () {\n    if (this.lastColumnPos < this.start) {\n      this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);\n      this.lastColumnPos = this.start;\n    }\n    return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n  };\n  StringStream.prototype.indentation = function () {\n    return countColumn(this.string, null, this.tabSize) -\n      (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)\n  };\n  StringStream.prototype.match = function (pattern, consume, caseInsensitive) {\n    if (typeof pattern == \"string\") {\n      var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };\n      var substr = this.string.substr(this.pos, pattern.length);\n      if (cased(substr) == cased(pattern)) {\n        if (consume !== false) { this.pos += pattern.length; }\n        return true\n      }\n    } else {\n      var match = this.string.slice(this.pos).match(pattern);\n      if (match && match.index > 0) { return null }\n      if (match && consume !== false) { this.pos += match[0].length; }\n      return match\n    }\n  };\n  StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)};\n  StringStream.prototype.hideFirstChars = function (n, inner) {\n    this.lineStart += n;\n    try { return inner() }\n    finally { this.lineStart -= n; }\n  };\n  StringStream.prototype.lookAhead = function (n) {\n    var oracle = this.lineOracle;\n    return oracle && oracle.lookAhead(n)\n  };\n  StringStream.prototype.baseToken = function () {\n    var oracle = this.lineOracle;\n    return oracle && oracle.baseToken(this.pos)\n  };\n\n  var SavedContext = function(state, lookAhead) {\n    this.state = state;\n    this.lookAhead = lookAhead;\n  };\n\n  var Context = function(doc, state, line, lookAhead) {\n    this.state = state;\n    this.doc = doc;\n    this.line = line;\n    this.maxLookAhead = lookAhead || 0;\n    this.baseTokens = null;\n    this.baseTokenPos = 1;\n  };\n\n  Context.prototype.lookAhead = function (n) {\n    var line = this.doc.getLine(this.line + n);\n    if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; }\n    return line\n  };\n\n  Context.prototype.baseToken = function (n) {\n      var this$1 = this;\n\n    if (!this.baseTokens) { return null }\n    while (this.baseTokens[this.baseTokenPos] <= n)\n      { this$1.baseTokenPos += 2; }\n    var type = this.baseTokens[this.baseTokenPos + 1];\n    return {type: type && type.replace(/( |^)overlay .*/, \"\"),\n            size: this.baseTokens[this.baseTokenPos] - n}\n  };\n\n  Context.prototype.nextLine = function () {\n    this.line++;\n    if (this.maxLookAhead > 0) { this.maxLookAhead--; }\n  };\n\n  Context.fromSaved = function (doc, saved, line) {\n    if (saved instanceof SavedContext)\n      { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) }\n    else\n      { return new Context(doc, copyState(doc.mode, saved), line) }\n  };\n\n  Context.prototype.save = function (copy) {\n    var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state;\n    return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state\n  };\n\n\n  // Compute a style array (an array starting with a mode generation\n  // -- for invalidation -- followed by pairs of end positions and\n  // style strings), which is used to highlight the tokens on the\n  // line.\n  function highlightLine(cm, line, context, forceToEnd) {\n    // A styles array always starts with a number identifying the\n    // mode/overlays that it is based on (for easy invalidation).\n    var st = [cm.state.modeGen], lineClasses = {};\n    // Compute the base array of styles\n    runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); },\n            lineClasses, forceToEnd);\n    var state = context.state;\n\n    // Run overlays, adjust style array.\n    var loop = function ( o ) {\n      context.baseTokens = st;\n      var overlay = cm.state.overlays[o], i = 1, at = 0;\n      context.state = true;\n      runMode(cm, line.text, overlay.mode, context, function (end, style) {\n        var start = i;\n        // Ensure there's a token end at the current position, and that i points at it\n        while (at < end) {\n          var i_end = st[i];\n          if (i_end > end)\n            { st.splice(i, 1, end, st[i+1], i_end); }\n          i += 2;\n          at = Math.min(end, i_end);\n        }\n        if (!style) { return }\n        if (overlay.opaque) {\n          st.splice(start, i - start, end, \"overlay \" + style);\n          i = start + 2;\n        } else {\n          for (; start < i; start += 2) {\n            var cur = st[start+1];\n            st[start+1] = (cur ? cur + \" \" : \"\") + \"overlay \" + style;\n          }\n        }\n      }, lineClasses);\n      context.state = state;\n      context.baseTokens = null;\n      context.baseTokenPos = 1;\n    };\n\n    for (var o = 0; o < cm.state.overlays.length; ++o) loop( o );\n\n    return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null}\n  }\n\n  function getLineStyles(cm, line, updateFrontier) {\n    if (!line.styles || line.styles[0] != cm.state.modeGen) {\n      var context = getContextBefore(cm, lineNo(line));\n      var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state);\n      var result = highlightLine(cm, line, context);\n      if (resetState) { context.state = resetState; }\n      line.stateAfter = context.save(!resetState);\n      line.styles = result.styles;\n      if (result.classes) { line.styleClasses = result.classes; }\n      else if (line.styleClasses) { line.styleClasses = null; }\n      if (updateFrontier === cm.doc.highlightFrontier)\n        { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); }\n    }\n    return line.styles\n  }\n\n  function getContextBefore(cm, n, precise) {\n    var doc = cm.doc, display = cm.display;\n    if (!doc.mode.startState) { return new Context(doc, true, n) }\n    var start = findStartLine(cm, n, precise);\n    var saved = start > doc.first && getLine(doc, start - 1).stateAfter;\n    var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start);\n\n    doc.iter(start, n, function (line) {\n      processLine(cm, line.text, context);\n      var pos = context.line;\n      line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null;\n      context.nextLine();\n    });\n    if (precise) { doc.modeFrontier = context.line; }\n    return context\n  }\n\n  // Lightweight form of highlight -- proceed over this line and\n  // update state, but don't save a style array. Used for lines that\n  // aren't currently visible.\n  function processLine(cm, text, context, startAt) {\n    var mode = cm.doc.mode;\n    var stream = new StringStream(text, cm.options.tabSize, context);\n    stream.start = stream.pos = startAt || 0;\n    if (text == \"\") { callBlankLine(mode, context.state); }\n    while (!stream.eol()) {\n      readToken(mode, stream, context.state);\n      stream.start = stream.pos;\n    }\n  }\n\n  function callBlankLine(mode, state) {\n    if (mode.blankLine) { return mode.blankLine(state) }\n    if (!mode.innerMode) { return }\n    var inner = innerMode(mode, state);\n    if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) }\n  }\n\n  function readToken(mode, stream, state, inner) {\n    for (var i = 0; i < 10; i++) {\n      if (inner) { inner[0] = innerMode(mode, state).mode; }\n      var style = mode.token(stream, state);\n      if (stream.pos > stream.start) { return style }\n    }\n    throw new Error(\"Mode \" + mode.name + \" failed to advance stream.\")\n  }\n\n  var Token = function(stream, type, state) {\n    this.start = stream.start; this.end = stream.pos;\n    this.string = stream.current();\n    this.type = type || null;\n    this.state = state;\n  };\n\n  // Utility for getTokenAt and getLineTokens\n  function takeToken(cm, pos, precise, asArray) {\n    var doc = cm.doc, mode = doc.mode, style;\n    pos = clipPos(doc, pos);\n    var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise);\n    var stream = new StringStream(line.text, cm.options.tabSize, context), tokens;\n    if (asArray) { tokens = []; }\n    while ((asArray || stream.pos < pos.ch) && !stream.eol()) {\n      stream.start = stream.pos;\n      style = readToken(mode, stream, context.state);\n      if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); }\n    }\n    return asArray ? tokens : new Token(stream, style, context.state)\n  }\n\n  function extractLineClasses(type, output) {\n    if (type) { for (;;) {\n      var lineClass = type.match(/(?:^|\\s+)line-(background-)?(\\S+)/);\n      if (!lineClass) { break }\n      type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);\n      var prop = lineClass[1] ? \"bgClass\" : \"textClass\";\n      if (output[prop] == null)\n        { output[prop] = lineClass[2]; }\n      else if (!(new RegExp(\"(?:^|\\s)\" + lineClass[2] + \"(?:$|\\s)\")).test(output[prop]))\n        { output[prop] += \" \" + lineClass[2]; }\n    } }\n    return type\n  }\n\n  // Run the given mode's parser over a line, calling f for each token.\n  function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {\n    var flattenSpans = mode.flattenSpans;\n    if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; }\n    var curStart = 0, curStyle = null;\n    var stream = new StringStream(text, cm.options.tabSize, context), style;\n    var inner = cm.options.addModeClass && [null];\n    if (text == \"\") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); }\n    while (!stream.eol()) {\n      if (stream.pos > cm.options.maxHighlightLength) {\n        flattenSpans = false;\n        if (forceToEnd) { processLine(cm, text, context, stream.pos); }\n        stream.pos = text.length;\n        style = null;\n      } else {\n        style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses);\n      }\n      if (inner) {\n        var mName = inner[0].name;\n        if (mName) { style = \"m-\" + (style ? mName + \" \" + style : mName); }\n      }\n      if (!flattenSpans || curStyle != style) {\n        while (curStart < stream.start) {\n          curStart = Math.min(stream.start, curStart + 5000);\n          f(curStart, curStyle);\n        }\n        curStyle = style;\n      }\n      stream.start = stream.pos;\n    }\n    while (curStart < stream.pos) {\n      // Webkit seems to refuse to render text nodes longer than 57444\n      // characters, and returns inaccurate measurements in nodes\n      // starting around 5000 chars.\n      var pos = Math.min(stream.pos, curStart + 5000);\n      f(pos, curStyle);\n      curStart = pos;\n    }\n  }\n\n  // Finds the line to start with when starting a parse. Tries to\n  // find a line with a stateAfter, so that it can start with a\n  // valid state. If that fails, it returns the line with the\n  // smallest indentation, which tends to need the least context to\n  // parse correctly.\n  function findStartLine(cm, n, precise) {\n    var minindent, minline, doc = cm.doc;\n    var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);\n    for (var search = n; search > lim; --search) {\n      if (search <= doc.first) { return doc.first }\n      var line = getLine(doc, search - 1), after = line.stateAfter;\n      if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier))\n        { return search }\n      var indented = countColumn(line.text, null, cm.options.tabSize);\n      if (minline == null || minindent > indented) {\n        minline = search - 1;\n        minindent = indented;\n      }\n    }\n    return minline\n  }\n\n  function retreatFrontier(doc, n) {\n    doc.modeFrontier = Math.min(doc.modeFrontier, n);\n    if (doc.highlightFrontier < n - 10) { return }\n    var start = doc.first;\n    for (var line = n - 1; line > start; line--) {\n      var saved = getLine(doc, line).stateAfter;\n      // change is on 3\n      // state on line 1 looked ahead 2 -- so saw 3\n      // test 1 + 2 < 3 should cover this\n      if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) {\n        start = line + 1;\n        break\n      }\n    }\n    doc.highlightFrontier = Math.min(doc.highlightFrontier, start);\n  }\n\n  // LINE DATA STRUCTURE\n\n  // Line objects. These hold state related to a line, including\n  // highlighting info (the styles array).\n  var Line = function(text, markedSpans, estimateHeight) {\n    this.text = text;\n    attachMarkedSpans(this, markedSpans);\n    this.height = estimateHeight ? estimateHeight(this) : 1;\n  };\n\n  Line.prototype.lineNo = function () { return lineNo(this) };\n  eventMixin(Line);\n\n  // Change the content (text, markers) of a line. Automatically\n  // invalidates cached information and tries to re-estimate the\n  // line's height.\n  function updateLine(line, text, markedSpans, estimateHeight) {\n    line.text = text;\n    if (line.stateAfter) { line.stateAfter = null; }\n    if (line.styles) { line.styles = null; }\n    if (line.order != null) { line.order = null; }\n    detachMarkedSpans(line);\n    attachMarkedSpans(line, markedSpans);\n    var estHeight = estimateHeight ? estimateHeight(line) : 1;\n    if (estHeight != line.height) { updateLineHeight(line, estHeight); }\n  }\n\n  // Detach a line from the document tree and its markers.\n  function cleanUpLine(line) {\n    line.parent = null;\n    detachMarkedSpans(line);\n  }\n\n  // Convert a style as returned by a mode (either null, or a string\n  // containing one or more styles) to a CSS style. This is cached,\n  // and also looks for line-wide styles.\n  var styleToClassCache = {}, styleToClassCacheWithMode = {};\n  function interpretTokenStyle(style, options) {\n    if (!style || /^\\s*$/.test(style)) { return null }\n    var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;\n    return cache[style] ||\n      (cache[style] = style.replace(/\\S+/g, \"cm-$&\"))\n  }\n\n  // Render the DOM representation of the text of a line. Also builds\n  // up a 'line map', which points at the DOM nodes that represent\n  // specific stretches of text, and is used by the measuring code.\n  // The returned object contains the DOM node, this map, and\n  // information about line-wide styles that were set by the mode.\n  function buildLineContent(cm, lineView) {\n    // The padding-right forces the element to have a 'border', which\n    // is needed on Webkit to be able to get line-level bounding\n    // rectangles for it (in measureChar).\n    var content = eltP(\"span\", null, null, webkit ? \"padding-right: .1px\" : null);\n    var builder = {pre: eltP(\"pre\", [content], \"CodeMirror-line\"), content: content,\n                   col: 0, pos: 0, cm: cm,\n                   trailingSpace: false,\n                   splitSpaces: cm.getOption(\"lineWrapping\")};\n    lineView.measure = {};\n\n    // Iterate over the logical lines that make up this visual line.\n    for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {\n      var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0);\n      builder.pos = 0;\n      builder.addToken = buildToken;\n      // Optionally wire in some hacks into the token-rendering\n      // algorithm, to deal with browser quirks.\n      if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction)))\n        { builder.addToken = buildTokenBadBidi(builder.addToken, order); }\n      builder.map = [];\n      var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);\n      insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));\n      if (line.styleClasses) {\n        if (line.styleClasses.bgClass)\n          { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || \"\"); }\n        if (line.styleClasses.textClass)\n          { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || \"\"); }\n      }\n\n      // Ensure at least a single node is present, for measuring.\n      if (builder.map.length == 0)\n        { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); }\n\n      // Store the map and a cache object for the current logical line\n      if (i == 0) {\n        lineView.measure.map = builder.map;\n        lineView.measure.cache = {};\n      } else {\n  (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map)\n        ;(lineView.measure.caches || (lineView.measure.caches = [])).push({});\n      }\n    }\n\n    // See issue #2901\n    if (webkit) {\n      var last = builder.content.lastChild;\n      if (/\\bcm-tab\\b/.test(last.className) || (last.querySelector && last.querySelector(\".cm-tab\")))\n        { builder.content.className = \"cm-tab-wrap-hack\"; }\n    }\n\n    signal(cm, \"renderLine\", cm, lineView.line, builder.pre);\n    if (builder.pre.className)\n      { builder.textClass = joinClasses(builder.pre.className, builder.textClass || \"\"); }\n\n    return builder\n  }\n\n  function defaultSpecialCharPlaceholder(ch) {\n    var token = elt(\"span\", \"\\u2022\", \"cm-invalidchar\");\n    token.title = \"\\\\u\" + ch.charCodeAt(0).toString(16);\n    token.setAttribute(\"aria-label\", token.title);\n    return token\n  }\n\n  // Build up the DOM representation for a single token, and add it to\n  // the line map. Takes care to render special characters separately.\n  function buildToken(builder, text, style, startStyle, endStyle, title, css) {\n    if (!text) { return }\n    var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text;\n    var special = builder.cm.state.specialChars, mustWrap = false;\n    var content;\n    if (!special.test(text)) {\n      builder.col += text.length;\n      content = document.createTextNode(displayText);\n      builder.map.push(builder.pos, builder.pos + text.length, content);\n      if (ie && ie_version < 9) { mustWrap = true; }\n      builder.pos += text.length;\n    } else {\n      content = document.createDocumentFragment();\n      var pos = 0;\n      while (true) {\n        special.lastIndex = pos;\n        var m = special.exec(text);\n        var skipped = m ? m.index - pos : text.length - pos;\n        if (skipped) {\n          var txt = document.createTextNode(displayText.slice(pos, pos + skipped));\n          if (ie && ie_version < 9) { content.appendChild(elt(\"span\", [txt])); }\n          else { content.appendChild(txt); }\n          builder.map.push(builder.pos, builder.pos + skipped, txt);\n          builder.col += skipped;\n          builder.pos += skipped;\n        }\n        if (!m) { break }\n        pos += skipped + 1;\n        var txt$1 = (void 0);\n        if (m[0] == \"\\t\") {\n          var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;\n          txt$1 = content.appendChild(elt(\"span\", spaceStr(tabWidth), \"cm-tab\"));\n          txt$1.setAttribute(\"role\", \"presentation\");\n          txt$1.setAttribute(\"cm-text\", \"\\t\");\n          builder.col += tabWidth;\n        } else if (m[0] == \"\\r\" || m[0] == \"\\n\") {\n          txt$1 = content.appendChild(elt(\"span\", m[0] == \"\\r\" ? \"\\u240d\" : \"\\u2424\", \"cm-invalidchar\"));\n          txt$1.setAttribute(\"cm-text\", m[0]);\n          builder.col += 1;\n        } else {\n          txt$1 = builder.cm.options.specialCharPlaceholder(m[0]);\n          txt$1.setAttribute(\"cm-text\", m[0]);\n          if (ie && ie_version < 9) { content.appendChild(elt(\"span\", [txt$1])); }\n          else { content.appendChild(txt$1); }\n          builder.col += 1;\n        }\n        builder.map.push(builder.pos, builder.pos + 1, txt$1);\n        builder.pos++;\n      }\n    }\n    builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32;\n    if (style || startStyle || endStyle || mustWrap || css) {\n      var fullStyle = style || \"\";\n      if (startStyle) { fullStyle += startStyle; }\n      if (endStyle) { fullStyle += endStyle; }\n      var token = elt(\"span\", [content], fullStyle, css);\n      if (title) { token.title = title; }\n      return builder.content.appendChild(token)\n    }\n    builder.content.appendChild(content);\n  }\n\n  // Change some spaces to NBSP to prevent the browser from collapsing\n  // trailing spaces at the end of a line when rendering text (issue #1362).\n  function splitSpaces(text, trailingBefore) {\n    if (text.length > 1 && !/  /.test(text)) { return text }\n    var spaceBefore = trailingBefore, result = \"\";\n    for (var i = 0; i < text.length; i++) {\n      var ch = text.charAt(i);\n      if (ch == \" \" && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32))\n        { ch = \"\\u00a0\"; }\n      result += ch;\n      spaceBefore = ch == \" \";\n    }\n    return result\n  }\n\n  // Work around nonsense dimensions being reported for stretches of\n  // right-to-left text.\n  function buildTokenBadBidi(inner, order) {\n    return function (builder, text, style, startStyle, endStyle, title, css) {\n      style = style ? style + \" cm-force-border\" : \"cm-force-border\";\n      var start = builder.pos, end = start + text.length;\n      for (;;) {\n        // Find the part that overlaps with the start of this text\n        var part = (void 0);\n        for (var i = 0; i < order.length; i++) {\n          part = order[i];\n          if (part.to > start && part.from <= start) { break }\n        }\n        if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, title, css) }\n        inner(builder, text.slice(0, part.to - start), style, startStyle, null, title, css);\n        startStyle = null;\n        text = text.slice(part.to - start);\n        start = part.to;\n      }\n    }\n  }\n\n  function buildCollapsedSpan(builder, size, marker, ignoreWidget) {\n    var widget = !ignoreWidget && marker.widgetNode;\n    if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); }\n    if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {\n      if (!widget)\n        { widget = builder.content.appendChild(document.createElement(\"span\")); }\n      widget.setAttribute(\"cm-marker\", marker.id);\n    }\n    if (widget) {\n      builder.cm.display.input.setUneditable(widget);\n      builder.content.appendChild(widget);\n    }\n    builder.pos += size;\n    builder.trailingSpace = false;\n  }\n\n  // Outputs a number of spans to make up a line, taking highlighting\n  // and marked text into account.\n  function insertLineContent(line, builder, styles) {\n    var spans = line.markedSpans, allText = line.text, at = 0;\n    if (!spans) {\n      for (var i$1 = 1; i$1 < styles.length; i$1+=2)\n        { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); }\n      return\n    }\n\n    var len = allText.length, pos = 0, i = 1, text = \"\", style, css;\n    var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed;\n    for (;;) {\n      if (nextChange == pos) { // Update current marker set\n        spanStyle = spanEndStyle = spanStartStyle = title = css = \"\";\n        collapsed = null; nextChange = Infinity;\n        var foundBookmarks = [], endStyles = (void 0);\n        for (var j = 0; j < spans.length; ++j) {\n          var sp = spans[j], m = sp.marker;\n          if (m.type == \"bookmark\" && sp.from == pos && m.widgetNode) {\n            foundBookmarks.push(m);\n          } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {\n            if (sp.to != null && sp.to != pos && nextChange > sp.to) {\n              nextChange = sp.to;\n              spanEndStyle = \"\";\n            }\n            if (m.className) { spanStyle += \" \" + m.className; }\n            if (m.css) { css = (css ? css + \";\" : \"\") + m.css; }\n            if (m.startStyle && sp.from == pos) { spanStartStyle += \" \" + m.startStyle; }\n            if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); }\n            if (m.title && !title) { title = m.title; }\n            if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))\n              { collapsed = sp; }\n          } else if (sp.from > pos && nextChange > sp.from) {\n            nextChange = sp.from;\n          }\n        }\n        if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2)\n          { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += \" \" + endStyles[j$1]; } } }\n\n        if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2)\n          { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } }\n        if (collapsed && (collapsed.from || 0) == pos) {\n          buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,\n                             collapsed.marker, collapsed.from == null);\n          if (collapsed.to == null) { return }\n          if (collapsed.to == pos) { collapsed = false; }\n        }\n      }\n      if (pos >= len) { break }\n\n      var upto = Math.min(len, nextChange);\n      while (true) {\n        if (text) {\n          var end = pos + text.length;\n          if (!collapsed) {\n            var tokenText = end > upto ? text.slice(0, upto - pos) : text;\n            builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,\n                             spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : \"\", title, css);\n          }\n          if (end >= upto) {text = text.slice(upto - pos); pos = upto; break}\n          pos = end;\n          spanStartStyle = \"\";\n        }\n        text = allText.slice(at, at = styles[i++]);\n        style = interpretTokenStyle(styles[i++], builder.cm.options);\n      }\n    }\n  }\n\n\n  // These objects are used to represent the visible (currently drawn)\n  // part of the document. A LineView may correspond to multiple\n  // logical lines, if those are connected by collapsed ranges.\n  function LineView(doc, line, lineN) {\n    // The starting line\n    this.line = line;\n    // Continuing lines, if any\n    this.rest = visualLineContinued(line);\n    // Number of logical lines in this visual line\n    this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;\n    this.node = this.text = null;\n    this.hidden = lineIsHidden(doc, line);\n  }\n\n  // Create a range of LineView objects for the given lines.\n  function buildViewArray(cm, from, to) {\n    var array = [], nextPos;\n    for (var pos = from; pos < to; pos = nextPos) {\n      var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);\n      nextPos = pos + view.size;\n      array.push(view);\n    }\n    return array\n  }\n\n  var operationGroup = null;\n\n  function pushOperation(op) {\n    if (operationGroup) {\n      operationGroup.ops.push(op);\n    } else {\n      op.ownsGroup = operationGroup = {\n        ops: [op],\n        delayedCallbacks: []\n      };\n    }\n  }\n\n  function fireCallbacksForOps(group) {\n    // Calls delayed callbacks and cursorActivity handlers until no\n    // new ones appear\n    var callbacks = group.delayedCallbacks, i = 0;\n    do {\n      for (; i < callbacks.length; i++)\n        { callbacks[i].call(null); }\n      for (var j = 0; j < group.ops.length; j++) {\n        var op = group.ops[j];\n        if (op.cursorActivityHandlers)\n          { while (op.cursorActivityCalled < op.cursorActivityHandlers.length)\n            { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } }\n      }\n    } while (i < callbacks.length)\n  }\n\n  function finishOperation(op, endCb) {\n    var group = op.ownsGroup;\n    if (!group) { return }\n\n    try { fireCallbacksForOps(group); }\n    finally {\n      operationGroup = null;\n      endCb(group);\n    }\n  }\n\n  var orphanDelayedCallbacks = null;\n\n  // Often, we want to signal events at a point where we are in the\n  // middle of some work, but don't want the handler to start calling\n  // other methods on the editor, which might be in an inconsistent\n  // state or simply not expect any other events to happen.\n  // signalLater looks whether there are any handlers, and schedules\n  // them to be executed when the last operation ends, or, if no\n  // operation is active, when a timeout fires.\n  function signalLater(emitter, type /*, values...*/) {\n    var arr = getHandlers(emitter, type);\n    if (!arr.length) { return }\n    var args = Array.prototype.slice.call(arguments, 2), list;\n    if (operationGroup) {\n      list = operationGroup.delayedCallbacks;\n    } else if (orphanDelayedCallbacks) {\n      list = orphanDelayedCallbacks;\n    } else {\n      list = orphanDelayedCallbacks = [];\n      setTimeout(fireOrphanDelayed, 0);\n    }\n    var loop = function ( i ) {\n      list.push(function () { return arr[i].apply(null, args); });\n    };\n\n    for (var i = 0; i < arr.length; ++i)\n      loop( i );\n  }\n\n  function fireOrphanDelayed() {\n    var delayed = orphanDelayedCallbacks;\n    orphanDelayedCallbacks = null;\n    for (var i = 0; i < delayed.length; ++i) { delayed[i](); }\n  }\n\n  // When an aspect of a line changes, a string is added to\n  // lineView.changes. This updates the relevant part of the line's\n  // DOM structure.\n  function updateLineForChanges(cm, lineView, lineN, dims) {\n    for (var j = 0; j < lineView.changes.length; j++) {\n      var type = lineView.changes[j];\n      if (type == \"text\") { updateLineText(cm, lineView); }\n      else if (type == \"gutter\") { updateLineGutter(cm, lineView, lineN, dims); }\n      else if (type == \"class\") { updateLineClasses(cm, lineView); }\n      else if (type == \"widget\") { updateLineWidgets(cm, lineView, dims); }\n    }\n    lineView.changes = null;\n  }\n\n  // Lines with gutter elements, widgets or a background class need to\n  // be wrapped, and have the extra elements added to the wrapper div\n  function ensureLineWrapped(lineView) {\n    if (lineView.node == lineView.text) {\n      lineView.node = elt(\"div\", null, null, \"position: relative\");\n      if (lineView.text.parentNode)\n        { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); }\n      lineView.node.appendChild(lineView.text);\n      if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; }\n    }\n    return lineView.node\n  }\n\n  function updateLineBackground(cm, lineView) {\n    var cls = lineView.bgClass ? lineView.bgClass + \" \" + (lineView.line.bgClass || \"\") : lineView.line.bgClass;\n    if (cls) { cls += \" CodeMirror-linebackground\"; }\n    if (lineView.background) {\n      if (cls) { lineView.background.className = cls; }\n      else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }\n    } else if (cls) {\n      var wrap = ensureLineWrapped(lineView);\n      lineView.background = wrap.insertBefore(elt(\"div\", null, cls), wrap.firstChild);\n      cm.display.input.setUneditable(lineView.background);\n    }\n  }\n\n  // Wrapper around buildLineContent which will reuse the structure\n  // in display.externalMeasured when possible.\n  function getLineContent(cm, lineView) {\n    var ext = cm.display.externalMeasured;\n    if (ext && ext.line == lineView.line) {\n      cm.display.externalMeasured = null;\n      lineView.measure = ext.measure;\n      return ext.built\n    }\n    return buildLineContent(cm, lineView)\n  }\n\n  // Redraw the line's text. Interacts with the background and text\n  // classes because the mode may output tokens that influence these\n  // classes.\n  function updateLineText(cm, lineView) {\n    var cls = lineView.text.className;\n    var built = getLineContent(cm, lineView);\n    if (lineView.text == lineView.node) { lineView.node = built.pre; }\n    lineView.text.parentNode.replaceChild(built.pre, lineView.text);\n    lineView.text = built.pre;\n    if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {\n      lineView.bgClass = built.bgClass;\n      lineView.textClass = built.textClass;\n      updateLineClasses(cm, lineView);\n    } else if (cls) {\n      lineView.text.className = cls;\n    }\n  }\n\n  function updateLineClasses(cm, lineView) {\n    updateLineBackground(cm, lineView);\n    if (lineView.line.wrapClass)\n      { ensureLineWrapped(lineView).className = lineView.line.wrapClass; }\n    else if (lineView.node != lineView.text)\n      { lineView.node.className = \"\"; }\n    var textClass = lineView.textClass ? lineView.textClass + \" \" + (lineView.line.textClass || \"\") : lineView.line.textClass;\n    lineView.text.className = textClass || \"\";\n  }\n\n  function updateLineGutter(cm, lineView, lineN, dims) {\n    if (lineView.gutter) {\n      lineView.node.removeChild(lineView.gutter);\n      lineView.gutter = null;\n    }\n    if (lineView.gutterBackground) {\n      lineView.node.removeChild(lineView.gutterBackground);\n      lineView.gutterBackground = null;\n    }\n    if (lineView.line.gutterClass) {\n      var wrap = ensureLineWrapped(lineView);\n      lineView.gutterBackground = elt(\"div\", null, \"CodeMirror-gutter-background \" + lineView.line.gutterClass,\n                                      (\"left: \" + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px; width: \" + (dims.gutterTotalWidth) + \"px\"));\n      cm.display.input.setUneditable(lineView.gutterBackground);\n      wrap.insertBefore(lineView.gutterBackground, lineView.text);\n    }\n    var markers = lineView.line.gutterMarkers;\n    if (cm.options.lineNumbers || markers) {\n      var wrap$1 = ensureLineWrapped(lineView);\n      var gutterWrap = lineView.gutter = elt(\"div\", null, \"CodeMirror-gutter-wrapper\", (\"left: \" + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px\"));\n      cm.display.input.setUneditable(gutterWrap);\n      wrap$1.insertBefore(gutterWrap, lineView.text);\n      if (lineView.line.gutterClass)\n        { gutterWrap.className += \" \" + lineView.line.gutterClass; }\n      if (cm.options.lineNumbers && (!markers || !markers[\"CodeMirror-linenumbers\"]))\n        { lineView.lineNumber = gutterWrap.appendChild(\n          elt(\"div\", lineNumberFor(cm.options, lineN),\n              \"CodeMirror-linenumber CodeMirror-gutter-elt\",\n              (\"left: \" + (dims.gutterLeft[\"CodeMirror-linenumbers\"]) + \"px; width: \" + (cm.display.lineNumInnerWidth) + \"px\"))); }\n      if (markers) { for (var k = 0; k < cm.options.gutters.length; ++k) {\n        var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id];\n        if (found)\n          { gutterWrap.appendChild(elt(\"div\", [found], \"CodeMirror-gutter-elt\",\n                                     (\"left: \" + (dims.gutterLeft[id]) + \"px; width: \" + (dims.gutterWidth[id]) + \"px\"))); }\n      } }\n    }\n  }\n\n  function updateLineWidgets(cm, lineView, dims) {\n    if (lineView.alignable) { lineView.alignable = null; }\n    for (var node = lineView.node.firstChild, next = (void 0); node; node = next) {\n      next = node.nextSibling;\n      if (node.className == \"CodeMirror-linewidget\")\n        { lineView.node.removeChild(node); }\n    }\n    insertLineWidgets(cm, lineView, dims);\n  }\n\n  // Build a line's DOM representation from scratch\n  function buildLineElement(cm, lineView, lineN, dims) {\n    var built = getLineContent(cm, lineView);\n    lineView.text = lineView.node = built.pre;\n    if (built.bgClass) { lineView.bgClass = built.bgClass; }\n    if (built.textClass) { lineView.textClass = built.textClass; }\n\n    updateLineClasses(cm, lineView);\n    updateLineGutter(cm, lineView, lineN, dims);\n    insertLineWidgets(cm, lineView, dims);\n    return lineView.node\n  }\n\n  // A lineView may contain multiple logical lines (when merged by\n  // collapsed spans). The widgets for all of them need to be drawn.\n  function insertLineWidgets(cm, lineView, dims) {\n    insertLineWidgetsFor(cm, lineView.line, lineView, dims, true);\n    if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)\n      { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } }\n  }\n\n  function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {\n    if (!line.widgets) { return }\n    var wrap = ensureLineWrapped(lineView);\n    for (var i = 0, ws = line.widgets; i < ws.length; ++i) {\n      var widget = ws[i], node = elt(\"div\", [widget.node], \"CodeMirror-linewidget\");\n      if (!widget.handleMouseEvents) { node.setAttribute(\"cm-ignore-events\", \"true\"); }\n      positionLineWidget(widget, node, lineView, dims);\n      cm.display.input.setUneditable(node);\n      if (allowAbove && widget.above)\n        { wrap.insertBefore(node, lineView.gutter || lineView.text); }\n      else\n        { wrap.appendChild(node); }\n      signalLater(widget, \"redraw\");\n    }\n  }\n\n  function positionLineWidget(widget, node, lineView, dims) {\n    if (widget.noHScroll) {\n  (lineView.alignable || (lineView.alignable = [])).push(node);\n      var width = dims.wrapperWidth;\n      node.style.left = dims.fixedPos + \"px\";\n      if (!widget.coverGutter) {\n        width -= dims.gutterTotalWidth;\n        node.style.paddingLeft = dims.gutterTotalWidth + \"px\";\n      }\n      node.style.width = width + \"px\";\n    }\n    if (widget.coverGutter) {\n      node.style.zIndex = 5;\n      node.style.position = \"relative\";\n      if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + \"px\"; }\n    }\n  }\n\n  function widgetHeight(widget) {\n    if (widget.height != null) { return widget.height }\n    var cm = widget.doc.cm;\n    if (!cm) { return 0 }\n    if (!contains(document.body, widget.node)) {\n      var parentStyle = \"position: relative;\";\n      if (widget.coverGutter)\n        { parentStyle += \"margin-left: -\" + cm.display.gutters.offsetWidth + \"px;\"; }\n      if (widget.noHScroll)\n        { parentStyle += \"width: \" + cm.display.wrapper.clientWidth + \"px;\"; }\n      removeChildrenAndAdd(cm.display.measure, elt(\"div\", [widget.node], null, parentStyle));\n    }\n    return widget.height = widget.node.parentNode.offsetHeight\n  }\n\n  // Return true when the given mouse event happened in a widget\n  function eventInWidget(display, e) {\n    for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {\n      if (!n || (n.nodeType == 1 && n.getAttribute(\"cm-ignore-events\") == \"true\") ||\n          (n.parentNode == display.sizer && n != display.mover))\n        { return true }\n    }\n  }\n\n  // POSITION MEASUREMENT\n\n  function paddingTop(display) {return display.lineSpace.offsetTop}\n  function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight}\n  function paddingH(display) {\n    if (display.cachedPaddingH) { return display.cachedPaddingH }\n    var e = removeChildrenAndAdd(display.measure, elt(\"pre\", \"x\"));\n    var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;\n    var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};\n    if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; }\n    return data\n  }\n\n  function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }\n  function displayWidth(cm) {\n    return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth\n  }\n  function displayHeight(cm) {\n    return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight\n  }\n\n  // Ensure the lineView.wrapping.heights array is populated. This is\n  // an array of bottom offsets for the lines that make up a drawn\n  // line. When lineWrapping is on, there might be more than one\n  // height.\n  function ensureLineHeights(cm, lineView, rect) {\n    var wrapping = cm.options.lineWrapping;\n    var curWidth = wrapping && displayWidth(cm);\n    if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {\n      var heights = lineView.measure.heights = [];\n      if (wrapping) {\n        lineView.measure.width = curWidth;\n        var rects = lineView.text.firstChild.getClientRects();\n        for (var i = 0; i < rects.length - 1; i++) {\n          var cur = rects[i], next = rects[i + 1];\n          if (Math.abs(cur.bottom - next.bottom) > 2)\n            { heights.push((cur.bottom + next.top) / 2 - rect.top); }\n        }\n      }\n      heights.push(rect.bottom - rect.top);\n    }\n  }\n\n  // Find a line map (mapping character offsets to text nodes) and a\n  // measurement cache for the given line number. (A line view might\n  // contain multiple lines when collapsed ranges are present.)\n  function mapFromLineView(lineView, line, lineN) {\n    if (lineView.line == line)\n      { return {map: lineView.measure.map, cache: lineView.measure.cache} }\n    for (var i = 0; i < lineView.rest.length; i++)\n      { if (lineView.rest[i] == line)\n        { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } }\n    for (var i$1 = 0; i$1 < lineView.rest.length; i$1++)\n      { if (lineNo(lineView.rest[i$1]) > lineN)\n        { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } }\n  }\n\n  // Render a line into the hidden node display.externalMeasured. Used\n  // when measurement is needed for a line that's not in the viewport.\n  function updateExternalMeasurement(cm, line) {\n    line = visualLine(line);\n    var lineN = lineNo(line);\n    var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);\n    view.lineN = lineN;\n    var built = view.built = buildLineContent(cm, view);\n    view.text = built.pre;\n    removeChildrenAndAdd(cm.display.lineMeasure, built.pre);\n    return view\n  }\n\n  // Get a {top, bottom, left, right} box (in line-local coordinates)\n  // for a given character.\n  function measureChar(cm, line, ch, bias) {\n    return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias)\n  }\n\n  // Find a line view that corresponds to the given line number.\n  function findViewForLine(cm, lineN) {\n    if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)\n      { return cm.display.view[findViewIndex(cm, lineN)] }\n    var ext = cm.display.externalMeasured;\n    if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)\n      { return ext }\n  }\n\n  // Measurement can be split in two steps, the set-up work that\n  // applies to the whole line, and the measurement of the actual\n  // character. Functions like coordsChar, that need to do a lot of\n  // measurements in a row, can thus ensure that the set-up work is\n  // only done once.\n  function prepareMeasureForLine(cm, line) {\n    var lineN = lineNo(line);\n    var view = findViewForLine(cm, lineN);\n    if (view && !view.text) {\n      view = null;\n    } else if (view && view.changes) {\n      updateLineForChanges(cm, view, lineN, getDimensions(cm));\n      cm.curOp.forceUpdate = true;\n    }\n    if (!view)\n      { view = updateExternalMeasurement(cm, line); }\n\n    var info = mapFromLineView(view, line, lineN);\n    return {\n      line: line, view: view, rect: null,\n      map: info.map, cache: info.cache, before: info.before,\n      hasHeights: false\n    }\n  }\n\n  // Given a prepared measurement object, measures the position of an\n  // actual character (or fetches it from the cache).\n  function measureCharPrepared(cm, prepared, ch, bias, varHeight) {\n    if (prepared.before) { ch = -1; }\n    var key = ch + (bias || \"\"), found;\n    if (prepared.cache.hasOwnProperty(key)) {\n      found = prepared.cache[key];\n    } else {\n      if (!prepared.rect)\n        { prepared.rect = prepared.view.text.getBoundingClientRect(); }\n      if (!prepared.hasHeights) {\n        ensureLineHeights(cm, prepared.view, prepared.rect);\n        prepared.hasHeights = true;\n      }\n      found = measureCharInner(cm, prepared, ch, bias);\n      if (!found.bogus) { prepared.cache[key] = found; }\n    }\n    return {left: found.left, right: found.right,\n            top: varHeight ? found.rtop : found.top,\n            bottom: varHeight ? found.rbottom : found.bottom}\n  }\n\n  var nullRect = {left: 0, right: 0, top: 0, bottom: 0};\n\n  function nodeAndOffsetInLineMap(map$$1, ch, bias) {\n    var node, start, end, collapse, mStart, mEnd;\n    // First, search the line map for the text node corresponding to,\n    // or closest to, the target character.\n    for (var i = 0; i < map$$1.length; i += 3) {\n      mStart = map$$1[i];\n      mEnd = map$$1[i + 1];\n      if (ch < mStart) {\n        start = 0; end = 1;\n        collapse = \"left\";\n      } else if (ch < mEnd) {\n        start = ch - mStart;\n        end = start + 1;\n      } else if (i == map$$1.length - 3 || ch == mEnd && map$$1[i + 3] > ch) {\n        end = mEnd - mStart;\n        start = end - 1;\n        if (ch >= mEnd) { collapse = \"right\"; }\n      }\n      if (start != null) {\n        node = map$$1[i + 2];\n        if (mStart == mEnd && bias == (node.insertLeft ? \"left\" : \"right\"))\n          { collapse = bias; }\n        if (bias == \"left\" && start == 0)\n          { while (i && map$$1[i - 2] == map$$1[i - 3] && map$$1[i - 1].insertLeft) {\n            node = map$$1[(i -= 3) + 2];\n            collapse = \"left\";\n          } }\n        if (bias == \"right\" && start == mEnd - mStart)\n          { while (i < map$$1.length - 3 && map$$1[i + 3] == map$$1[i + 4] && !map$$1[i + 5].insertLeft) {\n            node = map$$1[(i += 3) + 2];\n            collapse = \"right\";\n          } }\n        break\n      }\n    }\n    return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}\n  }\n\n  function getUsefulRect(rects, bias) {\n    var rect = nullRect;\n    if (bias == \"left\") { for (var i = 0; i < rects.length; i++) {\n      if ((rect = rects[i]).left != rect.right) { break }\n    } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) {\n      if ((rect = rects[i$1]).left != rect.right) { break }\n    } }\n    return rect\n  }\n\n  function measureCharInner(cm, prepared, ch, bias) {\n    var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);\n    var node = place.node, start = place.start, end = place.end, collapse = place.collapse;\n\n    var rect;\n    if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.\n      for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned\n        while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; }\n        while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; }\n        if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)\n          { rect = node.parentNode.getBoundingClientRect(); }\n        else\n          { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); }\n        if (rect.left || rect.right || start == 0) { break }\n        end = start;\n        start = start - 1;\n        collapse = \"right\";\n      }\n      if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); }\n    } else { // If it is a widget, simply get the box for the whole widget.\n      if (start > 0) { collapse = bias = \"right\"; }\n      var rects;\n      if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)\n        { rect = rects[bias == \"right\" ? rects.length - 1 : 0]; }\n      else\n        { rect = node.getBoundingClientRect(); }\n    }\n    if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {\n      var rSpan = node.parentNode.getClientRects()[0];\n      if (rSpan)\n        { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; }\n      else\n        { rect = nullRect; }\n    }\n\n    var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;\n    var mid = (rtop + rbot) / 2;\n    var heights = prepared.view.measure.heights;\n    var i = 0;\n    for (; i < heights.length - 1; i++)\n      { if (mid < heights[i]) { break } }\n    var top = i ? heights[i - 1] : 0, bot = heights[i];\n    var result = {left: (collapse == \"right\" ? rect.right : rect.left) - prepared.rect.left,\n                  right: (collapse == \"left\" ? rect.left : rect.right) - prepared.rect.left,\n                  top: top, bottom: bot};\n    if (!rect.left && !rect.right) { result.bogus = true; }\n    if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }\n\n    return result\n  }\n\n  // Work around problem with bounding client rects on ranges being\n  // returned incorrectly when zoomed on IE10 and below.\n  function maybeUpdateRectForZooming(measure, rect) {\n    if (!window.screen || screen.logicalXDPI == null ||\n        screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))\n      { return rect }\n    var scaleX = screen.logicalXDPI / screen.deviceXDPI;\n    var scaleY = screen.logicalYDPI / screen.deviceYDPI;\n    return {left: rect.left * scaleX, right: rect.right * scaleX,\n            top: rect.top * scaleY, bottom: rect.bottom * scaleY}\n  }\n\n  function clearLineMeasurementCacheFor(lineView) {\n    if (lineView.measure) {\n      lineView.measure.cache = {};\n      lineView.measure.heights = null;\n      if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)\n        { lineView.measure.caches[i] = {}; } }\n    }\n  }\n\n  function clearLineMeasurementCache(cm) {\n    cm.display.externalMeasure = null;\n    removeChildren(cm.display.lineMeasure);\n    for (var i = 0; i < cm.display.view.length; i++)\n      { clearLineMeasurementCacheFor(cm.display.view[i]); }\n  }\n\n  function clearCaches(cm) {\n    clearLineMeasurementCache(cm);\n    cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;\n    if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; }\n    cm.display.lineNumChars = null;\n  }\n\n  function pageScrollX() {\n    // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206\n    // which causes page_Offset and bounding client rects to use\n    // different reference viewports and invalidate our calculations.\n    if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) }\n    return window.pageXOffset || (document.documentElement || document.body).scrollLeft\n  }\n  function pageScrollY() {\n    if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) }\n    return window.pageYOffset || (document.documentElement || document.body).scrollTop\n  }\n\n  function widgetTopHeight(lineObj) {\n    var height = 0;\n    if (lineObj.widgets) { for (var i = 0; i < lineObj.widgets.length; ++i) { if (lineObj.widgets[i].above)\n      { height += widgetHeight(lineObj.widgets[i]); } } }\n    return height\n  }\n\n  // Converts a {top, bottom, left, right} box from line-local\n  // coordinates into another coordinate system. Context may be one of\n  // \"line\", \"div\" (display.lineDiv), \"local\"./null (editor), \"window\",\n  // or \"page\".\n  function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {\n    if (!includeWidgets) {\n      var height = widgetTopHeight(lineObj);\n      rect.top += height; rect.bottom += height;\n    }\n    if (context == \"line\") { return rect }\n    if (!context) { context = \"local\"; }\n    var yOff = heightAtLine(lineObj);\n    if (context == \"local\") { yOff += paddingTop(cm.display); }\n    else { yOff -= cm.display.viewOffset; }\n    if (context == \"page\" || context == \"window\") {\n      var lOff = cm.display.lineSpace.getBoundingClientRect();\n      yOff += lOff.top + (context == \"window\" ? 0 : pageScrollY());\n      var xOff = lOff.left + (context == \"window\" ? 0 : pageScrollX());\n      rect.left += xOff; rect.right += xOff;\n    }\n    rect.top += yOff; rect.bottom += yOff;\n    return rect\n  }\n\n  // Coverts a box from \"div\" coords to another coordinate system.\n  // Context may be \"window\", \"page\", \"div\", or \"local\"./null.\n  function fromCoordSystem(cm, coords, context) {\n    if (context == \"div\") { return coords }\n    var left = coords.left, top = coords.top;\n    // First move into \"page\" coordinate system\n    if (context == \"page\") {\n      left -= pageScrollX();\n      top -= pageScrollY();\n    } else if (context == \"local\" || !context) {\n      var localBox = cm.display.sizer.getBoundingClientRect();\n      left += localBox.left;\n      top += localBox.top;\n    }\n\n    var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();\n    return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}\n  }\n\n  function charCoords(cm, pos, context, lineObj, bias) {\n    if (!lineObj) { lineObj = getLine(cm.doc, pos.line); }\n    return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context)\n  }\n\n  // Returns a box for a given cursor position, which may have an\n  // 'other' property containing the position of the secondary cursor\n  // on a bidi boundary.\n  // A cursor Pos(line, char, \"before\") is on the same visual line as `char - 1`\n  // and after `char - 1` in writing order of `char - 1`\n  // A cursor Pos(line, char, \"after\") is on the same visual line as `char`\n  // and before `char` in writing order of `char`\n  // Examples (upper-case letters are RTL, lower-case are LTR):\n  //     Pos(0, 1, ...)\n  //     before   after\n  // ab     a|b     a|b\n  // aB     a|B     aB|\n  // Ab     |Ab     A|b\n  // AB     B|A     B|A\n  // Every position after the last character on a line is considered to stick\n  // to the last character on the line.\n  function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {\n    lineObj = lineObj || getLine(cm.doc, pos.line);\n    if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }\n    function get(ch, right) {\n      var m = measureCharPrepared(cm, preparedMeasure, ch, right ? \"right\" : \"left\", varHeight);\n      if (right) { m.left = m.right; } else { m.right = m.left; }\n      return intoCoordSystem(cm, lineObj, m, context)\n    }\n    var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky;\n    if (ch >= lineObj.text.length) {\n      ch = lineObj.text.length;\n      sticky = \"before\";\n    } else if (ch <= 0) {\n      ch = 0;\n      sticky = \"after\";\n    }\n    if (!order) { return get(sticky == \"before\" ? ch - 1 : ch, sticky == \"before\") }\n\n    function getBidi(ch, partPos, invert) {\n      var part = order[partPos], right = part.level == 1;\n      return get(invert ? ch - 1 : ch, right != invert)\n    }\n    var partPos = getBidiPartAt(order, ch, sticky);\n    var other = bidiOther;\n    var val = getBidi(ch, partPos, sticky == \"before\");\n    if (other != null) { val.other = getBidi(ch, other, sticky != \"before\"); }\n    return val\n  }\n\n  // Used to cheaply estimate the coordinates for a position. Used for\n  // intermediate scroll updates.\n  function estimateCoords(cm, pos) {\n    var left = 0;\n    pos = clipPos(cm.doc, pos);\n    if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; }\n    var lineObj = getLine(cm.doc, pos.line);\n    var top = heightAtLine(lineObj) + paddingTop(cm.display);\n    return {left: left, right: left, top: top, bottom: top + lineObj.height}\n  }\n\n  // Positions returned by coordsChar contain some extra information.\n  // xRel is the relative x position of the input coordinates compared\n  // to the found position (so xRel > 0 means the coordinates are to\n  // the right of the character position, for example). When outside\n  // is true, that means the coordinates lie outside the line's\n  // vertical range.\n  function PosWithInfo(line, ch, sticky, outside, xRel) {\n    var pos = Pos(line, ch, sticky);\n    pos.xRel = xRel;\n    if (outside) { pos.outside = true; }\n    return pos\n  }\n\n  // Compute the character position closest to the given coordinates.\n  // Input must be lineSpace-local (\"div\" coordinate system).\n  function coordsChar(cm, x, y) {\n    var doc = cm.doc;\n    y += cm.display.viewOffset;\n    if (y < 0) { return PosWithInfo(doc.first, 0, null, true, -1) }\n    var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;\n    if (lineN > last)\n      { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, true, 1) }\n    if (x < 0) { x = 0; }\n\n    var lineObj = getLine(doc, lineN);\n    for (;;) {\n      var found = coordsCharInner(cm, lineObj, lineN, x, y);\n      var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 ? 1 : 0));\n      if (!collapsed) { return found }\n      var rangeEnd = collapsed.find(1);\n      if (rangeEnd.line == lineN) { return rangeEnd }\n      lineObj = getLine(doc, lineN = rangeEnd.line);\n    }\n  }\n\n  function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {\n    y -= widgetTopHeight(lineObj);\n    var end = lineObj.text.length;\n    var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0);\n    end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end);\n    return {begin: begin, end: end}\n  }\n\n  function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {\n    if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }\n    var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), \"line\").top;\n    return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop)\n  }\n\n  // Returns true if the given side of a box is after the given\n  // coordinates, in top-to-bottom, left-to-right order.\n  function boxIsAfter(box, x, y, left) {\n    return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x\n  }\n\n  function coordsCharInner(cm, lineObj, lineNo$$1, x, y) {\n    // Move y into line-local coordinate space\n    y -= heightAtLine(lineObj);\n    var preparedMeasure = prepareMeasureForLine(cm, lineObj);\n    // When directly calling `measureCharPrepared`, we have to adjust\n    // for the widgets at this line.\n    var widgetHeight$$1 = widgetTopHeight(lineObj);\n    var begin = 0, end = lineObj.text.length, ltr = true;\n\n    var order = getOrder(lineObj, cm.doc.direction);\n    // If the line isn't plain left-to-right text, first figure out\n    // which bidi section the coordinates fall into.\n    if (order) {\n      var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)\n                   (cm, lineObj, lineNo$$1, preparedMeasure, order, x, y);\n      ltr = part.level != 1;\n      // The awkward -1 offsets are needed because findFirst (called\n      // on these below) will treat its first bound as inclusive,\n      // second as exclusive, but we want to actually address the\n      // characters in the part's range\n      begin = ltr ? part.from : part.to - 1;\n      end = ltr ? part.to : part.from - 1;\n    }\n\n    // A binary search to find the first character whose bounding box\n    // starts after the coordinates. If we run across any whose box wrap\n    // the coordinates, store that.\n    var chAround = null, boxAround = null;\n    var ch = findFirst(function (ch) {\n      var box = measureCharPrepared(cm, preparedMeasure, ch);\n      box.top += widgetHeight$$1; box.bottom += widgetHeight$$1;\n      if (!boxIsAfter(box, x, y, false)) { return false }\n      if (box.top <= y && box.left <= x) {\n        chAround = ch;\n        boxAround = box;\n      }\n      return true\n    }, begin, end);\n\n    var baseX, sticky, outside = false;\n    // If a box around the coordinates was found, use that\n    if (boxAround) {\n      // Distinguish coordinates nearer to the left or right side of the box\n      var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr;\n      ch = chAround + (atStart ? 0 : 1);\n      sticky = atStart ? \"after\" : \"before\";\n      baseX = atLeft ? boxAround.left : boxAround.right;\n    } else {\n      // (Adjust for extended bound, if necessary.)\n      if (!ltr && (ch == end || ch == begin)) { ch++; }\n      // To determine which side to associate with, get the box to the\n      // left of the character and compare it's vertical position to the\n      // coordinates\n      sticky = ch == 0 ? \"after\" : ch == lineObj.text.length ? \"before\" :\n        (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight$$1 <= y) == ltr ?\n        \"after\" : \"before\";\n      // Now get accurate coordinates for this place, in order to get a\n      // base X position\n      var coords = cursorCoords(cm, Pos(lineNo$$1, ch, sticky), \"line\", lineObj, preparedMeasure);\n      baseX = coords.left;\n      outside = y < coords.top || y >= coords.bottom;\n    }\n\n    ch = skipExtendingChars(lineObj.text, ch, 1);\n    return PosWithInfo(lineNo$$1, ch, sticky, outside, x - baseX)\n  }\n\n  function coordsBidiPart(cm, lineObj, lineNo$$1, preparedMeasure, order, x, y) {\n    // Bidi parts are sorted left-to-right, and in a non-line-wrapping\n    // situation, we can take this ordering to correspond to the visual\n    // ordering. This finds the first part whose end is after the given\n    // coordinates.\n    var index = findFirst(function (i) {\n      var part = order[i], ltr = part.level != 1;\n      return boxIsAfter(cursorCoords(cm, Pos(lineNo$$1, ltr ? part.to : part.from, ltr ? \"before\" : \"after\"),\n                                     \"line\", lineObj, preparedMeasure), x, y, true)\n    }, 0, order.length - 1);\n    var part = order[index];\n    // If this isn't the first part, the part's start is also after\n    // the coordinates, and the coordinates aren't on the same line as\n    // that start, move one part back.\n    if (index > 0) {\n      var ltr = part.level != 1;\n      var start = cursorCoords(cm, Pos(lineNo$$1, ltr ? part.from : part.to, ltr ? \"after\" : \"before\"),\n                               \"line\", lineObj, preparedMeasure);\n      if (boxIsAfter(start, x, y, true) && start.top > y)\n        { part = order[index - 1]; }\n    }\n    return part\n  }\n\n  function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) {\n    // In a wrapped line, rtl text on wrapping boundaries can do things\n    // that don't correspond to the ordering in our `order` array at\n    // all, so a binary search doesn't work, and we want to return a\n    // part that only spans one line so that the binary search in\n    // coordsCharInner is safe. As such, we first find the extent of the\n    // wrapped line, and then do a flat search in which we discard any\n    // spans that aren't on the line.\n    var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y);\n    var begin = ref.begin;\n    var end = ref.end;\n    if (/\\s/.test(lineObj.text.charAt(end - 1))) { end--; }\n    var part = null, closestDist = null;\n    for (var i = 0; i < order.length; i++) {\n      var p = order[i];\n      if (p.from >= end || p.to <= begin) { continue }\n      var ltr = p.level != 1;\n      var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right;\n      // Weigh against spans ending before this, so that they are only\n      // picked if nothing ends after\n      var dist = endX < x ? x - endX + 1e9 : endX - x;\n      if (!part || closestDist > dist) {\n        part = p;\n        closestDist = dist;\n      }\n    }\n    if (!part) { part = order[order.length - 1]; }\n    // Clip the part to the wrapped line.\n    if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; }\n    if (part.to > end) { part = {from: part.from, to: end, level: part.level}; }\n    return part\n  }\n\n  var measureText;\n  // Compute the default text height.\n  function textHeight(display) {\n    if (display.cachedTextHeight != null) { return display.cachedTextHeight }\n    if (measureText == null) {\n      measureText = elt(\"pre\");\n      // Measure a bunch of lines, for browsers that compute\n      // fractional heights.\n      for (var i = 0; i < 49; ++i) {\n        measureText.appendChild(document.createTextNode(\"x\"));\n        measureText.appendChild(elt(\"br\"));\n      }\n      measureText.appendChild(document.createTextNode(\"x\"));\n    }\n    removeChildrenAndAdd(display.measure, measureText);\n    var height = measureText.offsetHeight / 50;\n    if (height > 3) { display.cachedTextHeight = height; }\n    removeChildren(display.measure);\n    return height || 1\n  }\n\n  // Compute the default character width.\n  function charWidth(display) {\n    if (display.cachedCharWidth != null) { return display.cachedCharWidth }\n    var anchor = elt(\"span\", \"xxxxxxxxxx\");\n    var pre = elt(\"pre\", [anchor]);\n    removeChildrenAndAdd(display.measure, pre);\n    var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;\n    if (width > 2) { display.cachedCharWidth = width; }\n    return width || 10\n  }\n\n  // Do a bulk-read of the DOM positions and sizes needed to draw the\n  // view, so that we don't interleave reading and writing to the DOM.\n  function getDimensions(cm) {\n    var d = cm.display, left = {}, width = {};\n    var gutterLeft = d.gutters.clientLeft;\n    for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {\n      left[cm.options.gutters[i]] = n.offsetLeft + n.clientLeft + gutterLeft;\n      width[cm.options.gutters[i]] = n.clientWidth;\n    }\n    return {fixedPos: compensateForHScroll(d),\n            gutterTotalWidth: d.gutters.offsetWidth,\n            gutterLeft: left,\n            gutterWidth: width,\n            wrapperWidth: d.wrapper.clientWidth}\n  }\n\n  // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,\n  // but using getBoundingClientRect to get a sub-pixel-accurate\n  // result.\n  function compensateForHScroll(display) {\n    return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left\n  }\n\n  // Returns a function that estimates the height of a line, to use as\n  // first approximation until the line becomes visible (and is thus\n  // properly measurable).\n  function estimateHeight(cm) {\n    var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;\n    var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);\n    return function (line) {\n      if (lineIsHidden(cm.doc, line)) { return 0 }\n\n      var widgetsHeight = 0;\n      if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) {\n        if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; }\n      } }\n\n      if (wrapping)\n        { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th }\n      else\n        { return widgetsHeight + th }\n    }\n  }\n\n  function estimateLineHeights(cm) {\n    var doc = cm.doc, est = estimateHeight(cm);\n    doc.iter(function (line) {\n      var estHeight = est(line);\n      if (estHeight != line.height) { updateLineHeight(line, estHeight); }\n    });\n  }\n\n  // Given a mouse event, find the corresponding position. If liberal\n  // is false, it checks whether a gutter or scrollbar was clicked,\n  // and returns null if it was. forRect is used by rectangular\n  // selections, and tries to estimate a character position even for\n  // coordinates beyond the right of the text.\n  function posFromMouse(cm, e, liberal, forRect) {\n    var display = cm.display;\n    if (!liberal && e_target(e).getAttribute(\"cm-not-content\") == \"true\") { return null }\n\n    var x, y, space = display.lineSpace.getBoundingClientRect();\n    // Fails unpredictably on IE[67] when mouse is dragged around quickly.\n    try { x = e.clientX - space.left; y = e.clientY - space.top; }\n    catch (e) { return null }\n    var coords = coordsChar(cm, x, y), line;\n    if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {\n      var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;\n      coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));\n    }\n    return coords\n  }\n\n  // Find the view element corresponding to a given line. Return null\n  // when the line isn't visible.\n  function findViewIndex(cm, n) {\n    if (n >= cm.display.viewTo) { return null }\n    n -= cm.display.viewFrom;\n    if (n < 0) { return null }\n    var view = cm.display.view;\n    for (var i = 0; i < view.length; i++) {\n      n -= view[i].size;\n      if (n < 0) { return i }\n    }\n  }\n\n  function updateSelection(cm) {\n    cm.display.input.showSelection(cm.display.input.prepareSelection());\n  }\n\n  function prepareSelection(cm, primary) {\n    if ( primary === void 0 ) primary = true;\n\n    var doc = cm.doc, result = {};\n    var curFragment = result.cursors = document.createDocumentFragment();\n    var selFragment = result.selection = document.createDocumentFragment();\n\n    for (var i = 0; i < doc.sel.ranges.length; i++) {\n      if (!primary && i == doc.sel.primIndex) { continue }\n      var range$$1 = doc.sel.ranges[i];\n      if (range$$1.from().line >= cm.display.viewTo || range$$1.to().line < cm.display.viewFrom) { continue }\n      var collapsed = range$$1.empty();\n      if (collapsed || cm.options.showCursorWhenSelecting)\n        { drawSelectionCursor(cm, range$$1.head, curFragment); }\n      if (!collapsed)\n        { drawSelectionRange(cm, range$$1, selFragment); }\n    }\n    return result\n  }\n\n  // Draws a cursor for the given range\n  function drawSelectionCursor(cm, head, output) {\n    var pos = cursorCoords(cm, head, \"div\", null, null, !cm.options.singleCursorHeightPerLine);\n\n    var cursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor\"));\n    cursor.style.left = pos.left + \"px\";\n    cursor.style.top = pos.top + \"px\";\n    cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + \"px\";\n\n    if (pos.other) {\n      // Secondary cursor, shown when on a 'jump' in bi-directional text\n      var otherCursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor CodeMirror-secondarycursor\"));\n      otherCursor.style.display = \"\";\n      otherCursor.style.left = pos.other.left + \"px\";\n      otherCursor.style.top = pos.other.top + \"px\";\n      otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + \"px\";\n    }\n  }\n\n  function cmpCoords(a, b) { return a.top - b.top || a.left - b.left }\n\n  // Draws the given range as a highlighted selection\n  function drawSelectionRange(cm, range$$1, output) {\n    var display = cm.display, doc = cm.doc;\n    var fragment = document.createDocumentFragment();\n    var padding = paddingH(cm.display), leftSide = padding.left;\n    var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right;\n    var docLTR = doc.direction == \"ltr\";\n\n    function add(left, top, width, bottom) {\n      if (top < 0) { top = 0; }\n      top = Math.round(top);\n      bottom = Math.round(bottom);\n      fragment.appendChild(elt(\"div\", null, \"CodeMirror-selected\", (\"position: absolute; left: \" + left + \"px;\\n                             top: \" + top + \"px; width: \" + (width == null ? rightSide - left : width) + \"px;\\n                             height: \" + (bottom - top) + \"px\")));\n    }\n\n    function drawForLine(line, fromArg, toArg) {\n      var lineObj = getLine(doc, line);\n      var lineLen = lineObj.text.length;\n      var start, end;\n      function coords(ch, bias) {\n        return charCoords(cm, Pos(line, ch), \"div\", lineObj, bias)\n      }\n\n      function wrapX(pos, dir, side) {\n        var extent = wrappedLineExtentChar(cm, lineObj, null, pos);\n        var prop = (dir == \"ltr\") == (side == \"after\") ? \"left\" : \"right\";\n        var ch = side == \"after\" ? extent.begin : extent.end - (/\\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1);\n        return coords(ch, prop)[prop]\n      }\n\n      var order = getOrder(lineObj, doc.direction);\n      iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) {\n        var ltr = dir == \"ltr\";\n        var fromPos = coords(from, ltr ? \"left\" : \"right\");\n        var toPos = coords(to - 1, ltr ? \"right\" : \"left\");\n\n        var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen;\n        var first = i == 0, last = !order || i == order.length - 1;\n        if (toPos.top - fromPos.top <= 3) { // Single line\n          var openLeft = (docLTR ? openStart : openEnd) && first;\n          var openRight = (docLTR ? openEnd : openStart) && last;\n          var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left;\n          var right = openRight ? rightSide : (ltr ? toPos : fromPos).right;\n          add(left, fromPos.top, right - left, fromPos.bottom);\n        } else { // Multiple lines\n          var topLeft, topRight, botLeft, botRight;\n          if (ltr) {\n            topLeft = docLTR && openStart && first ? leftSide : fromPos.left;\n            topRight = docLTR ? rightSide : wrapX(from, dir, \"before\");\n            botLeft = docLTR ? leftSide : wrapX(to, dir, \"after\");\n            botRight = docLTR && openEnd && last ? rightSide : toPos.right;\n          } else {\n            topLeft = !docLTR ? leftSide : wrapX(from, dir, \"before\");\n            topRight = !docLTR && openStart && first ? rightSide : fromPos.right;\n            botLeft = !docLTR && openEnd && last ? leftSide : toPos.left;\n            botRight = !docLTR ? rightSide : wrapX(to, dir, \"after\");\n          }\n          add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom);\n          if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); }\n          add(botLeft, toPos.top, botRight - botLeft, toPos.bottom);\n        }\n\n        if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; }\n        if (cmpCoords(toPos, start) < 0) { start = toPos; }\n        if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; }\n        if (cmpCoords(toPos, end) < 0) { end = toPos; }\n      });\n      return {start: start, end: end}\n    }\n\n    var sFrom = range$$1.from(), sTo = range$$1.to();\n    if (sFrom.line == sTo.line) {\n      drawForLine(sFrom.line, sFrom.ch, sTo.ch);\n    } else {\n      var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);\n      var singleVLine = visualLine(fromLine) == visualLine(toLine);\n      var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;\n      var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;\n      if (singleVLine) {\n        if (leftEnd.top < rightStart.top - 2) {\n          add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);\n          add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);\n        } else {\n          add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);\n        }\n      }\n      if (leftEnd.bottom < rightStart.top)\n        { add(leftSide, leftEnd.bottom, null, rightStart.top); }\n    }\n\n    output.appendChild(fragment);\n  }\n\n  // Cursor-blinking\n  function restartBlink(cm) {\n    if (!cm.state.focused) { return }\n    var display = cm.display;\n    clearInterval(display.blinker);\n    var on = true;\n    display.cursorDiv.style.visibility = \"\";\n    if (cm.options.cursorBlinkRate > 0)\n      { display.blinker = setInterval(function () { return display.cursorDiv.style.visibility = (on = !on) ? \"\" : \"hidden\"; },\n        cm.options.cursorBlinkRate); }\n    else if (cm.options.cursorBlinkRate < 0)\n      { display.cursorDiv.style.visibility = \"hidden\"; }\n  }\n\n  function ensureFocus(cm) {\n    if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm); }\n  }\n\n  function delayBlurEvent(cm) {\n    cm.state.delayingBlurEvent = true;\n    setTimeout(function () { if (cm.state.delayingBlurEvent) {\n      cm.state.delayingBlurEvent = false;\n      onBlur(cm);\n    } }, 100);\n  }\n\n  function onFocus(cm, e) {\n    if (cm.state.delayingBlurEvent) { cm.state.delayingBlurEvent = false; }\n\n    if (cm.options.readOnly == \"nocursor\") { return }\n    if (!cm.state.focused) {\n      signal(cm, \"focus\", cm, e);\n      cm.state.focused = true;\n      addClass(cm.display.wrapper, \"CodeMirror-focused\");\n      // This test prevents this from firing when a context\n      // menu is closed (since the input reset would kill the\n      // select-all detection hack)\n      if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {\n        cm.display.input.reset();\n        if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730\n      }\n      cm.display.input.receivedFocus();\n    }\n    restartBlink(cm);\n  }\n  function onBlur(cm, e) {\n    if (cm.state.delayingBlurEvent) { return }\n\n    if (cm.state.focused) {\n      signal(cm, \"blur\", cm, e);\n      cm.state.focused = false;\n      rmClass(cm.display.wrapper, \"CodeMirror-focused\");\n    }\n    clearInterval(cm.display.blinker);\n    setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150);\n  }\n\n  // Read the actual heights of the rendered lines, and update their\n  // stored heights to match.\n  function updateHeightsInViewport(cm) {\n    var display = cm.display;\n    var prevBottom = display.lineDiv.offsetTop;\n    for (var i = 0; i < display.view.length; i++) {\n      var cur = display.view[i], height = (void 0);\n      if (cur.hidden) { continue }\n      if (ie && ie_version < 8) {\n        var bot = cur.node.offsetTop + cur.node.offsetHeight;\n        height = bot - prevBottom;\n        prevBottom = bot;\n      } else {\n        var box = cur.node.getBoundingClientRect();\n        height = box.bottom - box.top;\n      }\n      var diff = cur.line.height - height;\n      if (height < 2) { height = textHeight(display); }\n      if (diff > .005 || diff < -.005) {\n        updateLineHeight(cur.line, height);\n        updateWidgetHeight(cur.line);\n        if (cur.rest) { for (var j = 0; j < cur.rest.length; j++)\n          { updateWidgetHeight(cur.rest[j]); } }\n      }\n    }\n  }\n\n  // Read and store the height of line widgets associated with the\n  // given line.\n  function updateWidgetHeight(line) {\n    if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) {\n      var w = line.widgets[i], parent = w.node.parentNode;\n      if (parent) { w.height = parent.offsetHeight; }\n    } }\n  }\n\n  // Compute the lines that are visible in a given viewport (defaults\n  // the the current scroll position). viewport may contain top,\n  // height, and ensure (see op.scrollToPos) properties.\n  function visibleLines(display, doc, viewport) {\n    var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;\n    top = Math.floor(top - paddingTop(display));\n    var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;\n\n    var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);\n    // Ensure is a {from: {line, ch}, to: {line, ch}} object, and\n    // forces those lines into the viewport (if possible).\n    if (viewport && viewport.ensure) {\n      var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;\n      if (ensureFrom < from) {\n        from = ensureFrom;\n        to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight);\n      } else if (Math.min(ensureTo, doc.lastLine()) >= to) {\n        from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight);\n        to = ensureTo;\n      }\n    }\n    return {from: from, to: Math.max(to, from + 1)}\n  }\n\n  // Re-align line numbers and gutter marks to compensate for\n  // horizontal scrolling.\n  function alignHorizontally(cm) {\n    var display = cm.display, view = display.view;\n    if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return }\n    var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;\n    var gutterW = display.gutters.offsetWidth, left = comp + \"px\";\n    for (var i = 0; i < view.length; i++) { if (!view[i].hidden) {\n      if (cm.options.fixedGutter) {\n        if (view[i].gutter)\n          { view[i].gutter.style.left = left; }\n        if (view[i].gutterBackground)\n          { view[i].gutterBackground.style.left = left; }\n      }\n      var align = view[i].alignable;\n      if (align) { for (var j = 0; j < align.length; j++)\n        { align[j].style.left = left; } }\n    } }\n    if (cm.options.fixedGutter)\n      { display.gutters.style.left = (comp + gutterW) + \"px\"; }\n  }\n\n  // Used to ensure that the line number gutter is still the right\n  // size for the current document size. Returns true when an update\n  // is needed.\n  function maybeUpdateLineNumberWidth(cm) {\n    if (!cm.options.lineNumbers) { return false }\n    var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;\n    if (last.length != display.lineNumChars) {\n      var test = display.measure.appendChild(elt(\"div\", [elt(\"div\", last)],\n                                                 \"CodeMirror-linenumber CodeMirror-gutter-elt\"));\n      var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;\n      display.lineGutter.style.width = \"\";\n      display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1;\n      display.lineNumWidth = display.lineNumInnerWidth + padding;\n      display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;\n      display.lineGutter.style.width = display.lineNumWidth + \"px\";\n      updateGutterSpace(cm);\n      return true\n    }\n    return false\n  }\n\n  // SCROLLING THINGS INTO VIEW\n\n  // If an editor sits on the top or bottom of the window, partially\n  // scrolled out of view, this ensures that the cursor is visible.\n  function maybeScrollWindow(cm, rect) {\n    if (signalDOMEvent(cm, \"scrollCursorIntoView\")) { return }\n\n    var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;\n    if (rect.top + box.top < 0) { doScroll = true; }\n    else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false; }\n    if (doScroll != null && !phantom) {\n      var scrollNode = elt(\"div\", \"\\u200b\", null, (\"position: absolute;\\n                         top: \" + (rect.top - display.viewOffset - paddingTop(cm.display)) + \"px;\\n                         height: \" + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + \"px;\\n                         left: \" + (rect.left) + \"px; width: \" + (Math.max(2, rect.right - rect.left)) + \"px;\"));\n      cm.display.lineSpace.appendChild(scrollNode);\n      scrollNode.scrollIntoView(doScroll);\n      cm.display.lineSpace.removeChild(scrollNode);\n    }\n  }\n\n  // Scroll a given position into view (immediately), verifying that\n  // it actually became visible (as line heights are accurately\n  // measured, the position of something may 'drift' during drawing).\n  function scrollPosIntoView(cm, pos, end, margin) {\n    if (margin == null) { margin = 0; }\n    var rect;\n    if (!cm.options.lineWrapping && pos == end) {\n      // Set pos and end to the cursor positions around the character pos sticks to\n      // If pos.sticky == \"before\", that is around pos.ch - 1, otherwise around pos.ch\n      // If pos == Pos(_, 0, \"before\"), pos and end are unchanged\n      pos = pos.ch ? Pos(pos.line, pos.sticky == \"before\" ? pos.ch - 1 : pos.ch, \"after\") : pos;\n      end = pos.sticky == \"before\" ? Pos(pos.line, pos.ch + 1, \"before\") : pos;\n    }\n    for (var limit = 0; limit < 5; limit++) {\n      var changed = false;\n      var coords = cursorCoords(cm, pos);\n      var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);\n      rect = {left: Math.min(coords.left, endCoords.left),\n              top: Math.min(coords.top, endCoords.top) - margin,\n              right: Math.max(coords.left, endCoords.left),\n              bottom: Math.max(coords.bottom, endCoords.bottom) + margin};\n      var scrollPos = calculateScrollPos(cm, rect);\n      var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;\n      if (scrollPos.scrollTop != null) {\n        updateScrollTop(cm, scrollPos.scrollTop);\n        if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; }\n      }\n      if (scrollPos.scrollLeft != null) {\n        setScrollLeft(cm, scrollPos.scrollLeft);\n        if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; }\n      }\n      if (!changed) { break }\n    }\n    return rect\n  }\n\n  // Scroll a given set of coordinates into view (immediately).\n  function scrollIntoView(cm, rect) {\n    var scrollPos = calculateScrollPos(cm, rect);\n    if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); }\n    if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); }\n  }\n\n  // Calculate a new scroll position needed to scroll the given\n  // rectangle into view. Returns an object with scrollTop and\n  // scrollLeft properties. When these are undefined, the\n  // vertical/horizontal position does not need to be adjusted.\n  function calculateScrollPos(cm, rect) {\n    var display = cm.display, snapMargin = textHeight(cm.display);\n    if (rect.top < 0) { rect.top = 0; }\n    var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;\n    var screen = displayHeight(cm), result = {};\n    if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; }\n    var docBottom = cm.doc.height + paddingVert(display);\n    var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin;\n    if (rect.top < screentop) {\n      result.scrollTop = atTop ? 0 : rect.top;\n    } else if (rect.bottom > screentop + screen) {\n      var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen);\n      if (newTop != screentop) { result.scrollTop = newTop; }\n    }\n\n    var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft;\n    var screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0);\n    var tooWide = rect.right - rect.left > screenw;\n    if (tooWide) { rect.right = rect.left + screenw; }\n    if (rect.left < 10)\n      { result.scrollLeft = 0; }\n    else if (rect.left < screenleft)\n      { result.scrollLeft = Math.max(0, rect.left - (tooWide ? 0 : 10)); }\n    else if (rect.right > screenw + screenleft - 3)\n      { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; }\n    return result\n  }\n\n  // Store a relative adjustment to the scroll position in the current\n  // operation (to be applied when the operation finishes).\n  function addToScrollTop(cm, top) {\n    if (top == null) { return }\n    resolveScrollToPos(cm);\n    cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;\n  }\n\n  // Make sure that at the end of the operation the current cursor is\n  // shown.\n  function ensureCursorVisible(cm) {\n    resolveScrollToPos(cm);\n    var cur = cm.getCursor();\n    cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin};\n  }\n\n  function scrollToCoords(cm, x, y) {\n    if (x != null || y != null) { resolveScrollToPos(cm); }\n    if (x != null) { cm.curOp.scrollLeft = x; }\n    if (y != null) { cm.curOp.scrollTop = y; }\n  }\n\n  function scrollToRange(cm, range$$1) {\n    resolveScrollToPos(cm);\n    cm.curOp.scrollToPos = range$$1;\n  }\n\n  // When an operation has its scrollToPos property set, and another\n  // scroll action is applied before the end of the operation, this\n  // 'simulates' scrolling that position into view in a cheap way, so\n  // that the effect of intermediate scroll commands is not ignored.\n  function resolveScrollToPos(cm) {\n    var range$$1 = cm.curOp.scrollToPos;\n    if (range$$1) {\n      cm.curOp.scrollToPos = null;\n      var from = estimateCoords(cm, range$$1.from), to = estimateCoords(cm, range$$1.to);\n      scrollToCoordsRange(cm, from, to, range$$1.margin);\n    }\n  }\n\n  function scrollToCoordsRange(cm, from, to, margin) {\n    var sPos = calculateScrollPos(cm, {\n      left: Math.min(from.left, to.left),\n      top: Math.min(from.top, to.top) - margin,\n      right: Math.max(from.right, to.right),\n      bottom: Math.max(from.bottom, to.bottom) + margin\n    });\n    scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop);\n  }\n\n  // Sync the scrollable area and scrollbars, ensure the viewport\n  // covers the visible area.\n  function updateScrollTop(cm, val) {\n    if (Math.abs(cm.doc.scrollTop - val) < 2) { return }\n    if (!gecko) { updateDisplaySimple(cm, {top: val}); }\n    setScrollTop(cm, val, true);\n    if (gecko) { updateDisplaySimple(cm); }\n    startWorker(cm, 100);\n  }\n\n  function setScrollTop(cm, val, forceScroll) {\n    val = Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val);\n    if (cm.display.scroller.scrollTop == val && !forceScroll) { return }\n    cm.doc.scrollTop = val;\n    cm.display.scrollbars.setScrollTop(val);\n    if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; }\n  }\n\n  // Sync scroller and scrollbar, ensure the gutter elements are\n  // aligned.\n  function setScrollLeft(cm, val, isScroller, forceScroll) {\n    val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);\n    if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return }\n    cm.doc.scrollLeft = val;\n    alignHorizontally(cm);\n    if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; }\n    cm.display.scrollbars.setScrollLeft(val);\n  }\n\n  // SCROLLBARS\n\n  // Prepare DOM reads needed to update the scrollbars. Done in one\n  // shot to minimize update/measure roundtrips.\n  function measureForScrollbars(cm) {\n    var d = cm.display, gutterW = d.gutters.offsetWidth;\n    var docH = Math.round(cm.doc.height + paddingVert(cm.display));\n    return {\n      clientHeight: d.scroller.clientHeight,\n      viewHeight: d.wrapper.clientHeight,\n      scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,\n      viewWidth: d.wrapper.clientWidth,\n      barLeft: cm.options.fixedGutter ? gutterW : 0,\n      docHeight: docH,\n      scrollHeight: docH + scrollGap(cm) + d.barHeight,\n      nativeBarWidth: d.nativeBarWidth,\n      gutterWidth: gutterW\n    }\n  }\n\n  var NativeScrollbars = function(place, scroll, cm) {\n    this.cm = cm;\n    var vert = this.vert = elt(\"div\", [elt(\"div\", null, null, \"min-width: 1px\")], \"CodeMirror-vscrollbar\");\n    var horiz = this.horiz = elt(\"div\", [elt(\"div\", null, null, \"height: 100%; min-height: 1px\")], \"CodeMirror-hscrollbar\");\n    vert.tabIndex = horiz.tabIndex = -1;\n    place(vert); place(horiz);\n\n    on(vert, \"scroll\", function () {\n      if (vert.clientHeight) { scroll(vert.scrollTop, \"vertical\"); }\n    });\n    on(horiz, \"scroll\", function () {\n      if (horiz.clientWidth) { scroll(horiz.scrollLeft, \"horizontal\"); }\n    });\n\n    this.checkedZeroWidth = false;\n    // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).\n    if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = \"18px\"; }\n  };\n\n  NativeScrollbars.prototype.update = function (measure) {\n    var needsH = measure.scrollWidth > measure.clientWidth + 1;\n    var needsV = measure.scrollHeight > measure.clientHeight + 1;\n    var sWidth = measure.nativeBarWidth;\n\n    if (needsV) {\n      this.vert.style.display = \"block\";\n      this.vert.style.bottom = needsH ? sWidth + \"px\" : \"0\";\n      var totalHeight = measure.viewHeight - (needsH ? sWidth : 0);\n      // A bug in IE8 can cause this value to be negative, so guard it.\n      this.vert.firstChild.style.height =\n        Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + \"px\";\n    } else {\n      this.vert.style.display = \"\";\n      this.vert.firstChild.style.height = \"0\";\n    }\n\n    if (needsH) {\n      this.horiz.style.display = \"block\";\n      this.horiz.style.right = needsV ? sWidth + \"px\" : \"0\";\n      this.horiz.style.left = measure.barLeft + \"px\";\n      var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);\n      this.horiz.firstChild.style.width =\n        Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + \"px\";\n    } else {\n      this.horiz.style.display = \"\";\n      this.horiz.firstChild.style.width = \"0\";\n    }\n\n    if (!this.checkedZeroWidth && measure.clientHeight > 0) {\n      if (sWidth == 0) { this.zeroWidthHack(); }\n      this.checkedZeroWidth = true;\n    }\n\n    return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0}\n  };\n\n  NativeScrollbars.prototype.setScrollLeft = function (pos) {\n    if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; }\n    if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, \"horiz\"); }\n  };\n\n  NativeScrollbars.prototype.setScrollTop = function (pos) {\n    if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; }\n    if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, \"vert\"); }\n  };\n\n  NativeScrollbars.prototype.zeroWidthHack = function () {\n    var w = mac && !mac_geMountainLion ? \"12px\" : \"18px\";\n    this.horiz.style.height = this.vert.style.width = w;\n    this.horiz.style.pointerEvents = this.vert.style.pointerEvents = \"none\";\n    this.disableHoriz = new Delayed;\n    this.disableVert = new Delayed;\n  };\n\n  NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) {\n    bar.style.pointerEvents = \"auto\";\n    function maybeDisable() {\n      // To find out whether the scrollbar is still visible, we\n      // check whether the element under the pixel in the bottom\n      // right corner of the scrollbar box is the scrollbar box\n      // itself (when the bar is still visible) or its filler child\n      // (when the bar is hidden). If it is still visible, we keep\n      // it enabled, if it's hidden, we disable pointer events.\n      var box = bar.getBoundingClientRect();\n      var elt$$1 = type == \"vert\" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2)\n          : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1);\n      if (elt$$1 != bar) { bar.style.pointerEvents = \"none\"; }\n      else { delay.set(1000, maybeDisable); }\n    }\n    delay.set(1000, maybeDisable);\n  };\n\n  NativeScrollbars.prototype.clear = function () {\n    var parent = this.horiz.parentNode;\n    parent.removeChild(this.horiz);\n    parent.removeChild(this.vert);\n  };\n\n  var NullScrollbars = function () {};\n\n  NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} };\n  NullScrollbars.prototype.setScrollLeft = function () {};\n  NullScrollbars.prototype.setScrollTop = function () {};\n  NullScrollbars.prototype.clear = function () {};\n\n  function updateScrollbars(cm, measure) {\n    if (!measure) { measure = measureForScrollbars(cm); }\n    var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight;\n    updateScrollbarsInner(cm, measure);\n    for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {\n      if (startWidth != cm.display.barWidth && cm.options.lineWrapping)\n        { updateHeightsInViewport(cm); }\n      updateScrollbarsInner(cm, measureForScrollbars(cm));\n      startWidth = cm.display.barWidth; startHeight = cm.display.barHeight;\n    }\n  }\n\n  // Re-synchronize the fake scrollbars with the actual size of the\n  // content.\n  function updateScrollbarsInner(cm, measure) {\n    var d = cm.display;\n    var sizes = d.scrollbars.update(measure);\n\n    d.sizer.style.paddingRight = (d.barWidth = sizes.right) + \"px\";\n    d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + \"px\";\n    d.heightForcer.style.borderBottom = sizes.bottom + \"px solid transparent\";\n\n    if (sizes.right && sizes.bottom) {\n      d.scrollbarFiller.style.display = \"block\";\n      d.scrollbarFiller.style.height = sizes.bottom + \"px\";\n      d.scrollbarFiller.style.width = sizes.right + \"px\";\n    } else { d.scrollbarFiller.style.display = \"\"; }\n    if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {\n      d.gutterFiller.style.display = \"block\";\n      d.gutterFiller.style.height = sizes.bottom + \"px\";\n      d.gutterFiller.style.width = measure.gutterWidth + \"px\";\n    } else { d.gutterFiller.style.display = \"\"; }\n  }\n\n  var scrollbarModel = {\"native\": NativeScrollbars, \"null\": NullScrollbars};\n\n  function initScrollbars(cm) {\n    if (cm.display.scrollbars) {\n      cm.display.scrollbars.clear();\n      if (cm.display.scrollbars.addClass)\n        { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); }\n    }\n\n    cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) {\n      cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);\n      // Prevent clicks in the scrollbars from killing focus\n      on(node, \"mousedown\", function () {\n        if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); }\n      });\n      node.setAttribute(\"cm-not-content\", \"true\");\n    }, function (pos, axis) {\n      if (axis == \"horizontal\") { setScrollLeft(cm, pos); }\n      else { updateScrollTop(cm, pos); }\n    }, cm);\n    if (cm.display.scrollbars.addClass)\n      { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); }\n  }\n\n  // Operations are used to wrap a series of changes to the editor\n  // state in such a way that each change won't have to update the\n  // cursor and display (which would be awkward, slow, and\n  // error-prone). Instead, display updates are batched and then all\n  // combined and executed at once.\n\n  var nextOpId = 0;\n  // Start a new operation.\n  function startOperation(cm) {\n    cm.curOp = {\n      cm: cm,\n      viewChanged: false,      // Flag that indicates that lines might need to be redrawn\n      startHeight: cm.doc.height, // Used to detect need to update scrollbar\n      forceUpdate: false,      // Used to force a redraw\n      updateInput: null,       // Whether to reset the input textarea\n      typing: false,           // Whether this reset should be careful to leave existing text (for compositing)\n      changeObjs: null,        // Accumulated changes, for firing change events\n      cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on\n      cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already\n      selectionChanged: false, // Whether the selection needs to be redrawn\n      updateMaxLine: false,    // Set when the widest line needs to be determined anew\n      scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet\n      scrollToPos: null,       // Used to scroll to a specific position\n      focus: false,\n      id: ++nextOpId           // Unique ID\n    };\n    pushOperation(cm.curOp);\n  }\n\n  // Finish an operation, updating the display and signalling delayed events\n  function endOperation(cm) {\n    var op = cm.curOp;\n    if (op) { finishOperation(op, function (group) {\n      for (var i = 0; i < group.ops.length; i++)\n        { group.ops[i].cm.curOp = null; }\n      endOperations(group);\n    }); }\n  }\n\n  // The DOM updates done when an operation finishes are batched so\n  // that the minimum number of relayouts are required.\n  function endOperations(group) {\n    var ops = group.ops;\n    for (var i = 0; i < ops.length; i++) // Read DOM\n      { endOperation_R1(ops[i]); }\n    for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe)\n      { endOperation_W1(ops[i$1]); }\n    for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM\n      { endOperation_R2(ops[i$2]); }\n    for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe)\n      { endOperation_W2(ops[i$3]); }\n    for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM\n      { endOperation_finish(ops[i$4]); }\n  }\n\n  function endOperation_R1(op) {\n    var cm = op.cm, display = cm.display;\n    maybeClipScrollbars(cm);\n    if (op.updateMaxLine) { findMaxLine(cm); }\n\n    op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||\n      op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||\n                         op.scrollToPos.to.line >= display.viewTo) ||\n      display.maxLineChanged && cm.options.lineWrapping;\n    op.update = op.mustUpdate &&\n      new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);\n  }\n\n  function endOperation_W1(op) {\n    op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);\n  }\n\n  function endOperation_R2(op) {\n    var cm = op.cm, display = cm.display;\n    if (op.updatedDisplay) { updateHeightsInViewport(cm); }\n\n    op.barMeasure = measureForScrollbars(cm);\n\n    // If the max line changed since it was last measured, measure it,\n    // and ensure the document's width matches it.\n    // updateDisplay_W2 will use these properties to do the actual resizing\n    if (display.maxLineChanged && !cm.options.lineWrapping) {\n      op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;\n      cm.display.sizerWidth = op.adjustWidthTo;\n      op.barMeasure.scrollWidth =\n        Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth);\n      op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm));\n    }\n\n    if (op.updatedDisplay || op.selectionChanged)\n      { op.preparedSelection = display.input.prepareSelection(); }\n  }\n\n  function endOperation_W2(op) {\n    var cm = op.cm;\n\n    if (op.adjustWidthTo != null) {\n      cm.display.sizer.style.minWidth = op.adjustWidthTo + \"px\";\n      if (op.maxScrollLeft < cm.doc.scrollLeft)\n        { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); }\n      cm.display.maxLineChanged = false;\n    }\n\n    var takeFocus = op.focus && op.focus == activeElt();\n    if (op.preparedSelection)\n      { cm.display.input.showSelection(op.preparedSelection, takeFocus); }\n    if (op.updatedDisplay || op.startHeight != cm.doc.height)\n      { updateScrollbars(cm, op.barMeasure); }\n    if (op.updatedDisplay)\n      { setDocumentHeight(cm, op.barMeasure); }\n\n    if (op.selectionChanged) { restartBlink(cm); }\n\n    if (cm.state.focused && op.updateInput)\n      { cm.display.input.reset(op.typing); }\n    if (takeFocus) { ensureFocus(op.cm); }\n  }\n\n  function endOperation_finish(op) {\n    var cm = op.cm, display = cm.display, doc = cm.doc;\n\n    if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); }\n\n    // Abort mouse wheel delta measurement, when scrolling explicitly\n    if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))\n      { display.wheelStartX = display.wheelStartY = null; }\n\n    // Propagate the scroll position to the actual DOM scroller\n    if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); }\n\n    if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); }\n    // If we need to scroll a specific position into view, do so.\n    if (op.scrollToPos) {\n      var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),\n                                   clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);\n      maybeScrollWindow(cm, rect);\n    }\n\n    // Fire events for markers that are hidden/unidden by editing or\n    // undoing\n    var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;\n    if (hidden) { for (var i = 0; i < hidden.length; ++i)\n      { if (!hidden[i].lines.length) { signal(hidden[i], \"hide\"); } } }\n    if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1)\n      { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], \"unhide\"); } } }\n\n    if (display.wrapper.offsetHeight)\n      { doc.scrollTop = cm.display.scroller.scrollTop; }\n\n    // Fire change events, and delayed event handlers\n    if (op.changeObjs)\n      { signal(cm, \"changes\", cm, op.changeObjs); }\n    if (op.update)\n      { op.update.finish(); }\n  }\n\n  // Run the given function in an operation\n  function runInOp(cm, f) {\n    if (cm.curOp) { return f() }\n    startOperation(cm);\n    try { return f() }\n    finally { endOperation(cm); }\n  }\n  // Wraps a function in an operation. Returns the wrapped function.\n  function operation(cm, f) {\n    return function() {\n      if (cm.curOp) { return f.apply(cm, arguments) }\n      startOperation(cm);\n      try { return f.apply(cm, arguments) }\n      finally { endOperation(cm); }\n    }\n  }\n  // Used to add methods to editor and doc instances, wrapping them in\n  // operations.\n  function methodOp(f) {\n    return function() {\n      if (this.curOp) { return f.apply(this, arguments) }\n      startOperation(this);\n      try { return f.apply(this, arguments) }\n      finally { endOperation(this); }\n    }\n  }\n  function docMethodOp(f) {\n    return function() {\n      var cm = this.cm;\n      if (!cm || cm.curOp) { return f.apply(this, arguments) }\n      startOperation(cm);\n      try { return f.apply(this, arguments) }\n      finally { endOperation(cm); }\n    }\n  }\n\n  // Updates the display.view data structure for a given change to the\n  // document. From and to are in pre-change coordinates. Lendiff is\n  // the amount of lines added or subtracted by the change. This is\n  // used for changes that span multiple lines, or change the way\n  // lines are divided into visual lines. regLineChange (below)\n  // registers single-line changes.\n  function regChange(cm, from, to, lendiff) {\n    if (from == null) { from = cm.doc.first; }\n    if (to == null) { to = cm.doc.first + cm.doc.size; }\n    if (!lendiff) { lendiff = 0; }\n\n    var display = cm.display;\n    if (lendiff && to < display.viewTo &&\n        (display.updateLineNumbers == null || display.updateLineNumbers > from))\n      { display.updateLineNumbers = from; }\n\n    cm.curOp.viewChanged = true;\n\n    if (from >= display.viewTo) { // Change after\n      if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)\n        { resetView(cm); }\n    } else if (to <= display.viewFrom) { // Change before\n      if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {\n        resetView(cm);\n      } else {\n        display.viewFrom += lendiff;\n        display.viewTo += lendiff;\n      }\n    } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap\n      resetView(cm);\n    } else if (from <= display.viewFrom) { // Top overlap\n      var cut = viewCuttingPoint(cm, to, to + lendiff, 1);\n      if (cut) {\n        display.view = display.view.slice(cut.index);\n        display.viewFrom = cut.lineN;\n        display.viewTo += lendiff;\n      } else {\n        resetView(cm);\n      }\n    } else if (to >= display.viewTo) { // Bottom overlap\n      var cut$1 = viewCuttingPoint(cm, from, from, -1);\n      if (cut$1) {\n        display.view = display.view.slice(0, cut$1.index);\n        display.viewTo = cut$1.lineN;\n      } else {\n        resetView(cm);\n      }\n    } else { // Gap in the middle\n      var cutTop = viewCuttingPoint(cm, from, from, -1);\n      var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);\n      if (cutTop && cutBot) {\n        display.view = display.view.slice(0, cutTop.index)\n          .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))\n          .concat(display.view.slice(cutBot.index));\n        display.viewTo += lendiff;\n      } else {\n        resetView(cm);\n      }\n    }\n\n    var ext = display.externalMeasured;\n    if (ext) {\n      if (to < ext.lineN)\n        { ext.lineN += lendiff; }\n      else if (from < ext.lineN + ext.size)\n        { display.externalMeasured = null; }\n    }\n  }\n\n  // Register a change to a single line. Type must be one of \"text\",\n  // \"gutter\", \"class\", \"widget\"\n  function regLineChange(cm, line, type) {\n    cm.curOp.viewChanged = true;\n    var display = cm.display, ext = cm.display.externalMeasured;\n    if (ext && line >= ext.lineN && line < ext.lineN + ext.size)\n      { display.externalMeasured = null; }\n\n    if (line < display.viewFrom || line >= display.viewTo) { return }\n    var lineView = display.view[findViewIndex(cm, line)];\n    if (lineView.node == null) { return }\n    var arr = lineView.changes || (lineView.changes = []);\n    if (indexOf(arr, type) == -1) { arr.push(type); }\n  }\n\n  // Clear the view.\n  function resetView(cm) {\n    cm.display.viewFrom = cm.display.viewTo = cm.doc.first;\n    cm.display.view = [];\n    cm.display.viewOffset = 0;\n  }\n\n  function viewCuttingPoint(cm, oldN, newN, dir) {\n    var index = findViewIndex(cm, oldN), diff, view = cm.display.view;\n    if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)\n      { return {index: index, lineN: newN} }\n    var n = cm.display.viewFrom;\n    for (var i = 0; i < index; i++)\n      { n += view[i].size; }\n    if (n != oldN) {\n      if (dir > 0) {\n        if (index == view.length - 1) { return null }\n        diff = (n + view[index].size) - oldN;\n        index++;\n      } else {\n        diff = n - oldN;\n      }\n      oldN += diff; newN += diff;\n    }\n    while (visualLineNo(cm.doc, newN) != newN) {\n      if (index == (dir < 0 ? 0 : view.length - 1)) { return null }\n      newN += dir * view[index - (dir < 0 ? 1 : 0)].size;\n      index += dir;\n    }\n    return {index: index, lineN: newN}\n  }\n\n  // Force the view to cover a given range, adding empty view element\n  // or clipping off existing ones as needed.\n  function adjustView(cm, from, to) {\n    var display = cm.display, view = display.view;\n    if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {\n      display.view = buildViewArray(cm, from, to);\n      display.viewFrom = from;\n    } else {\n      if (display.viewFrom > from)\n        { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); }\n      else if (display.viewFrom < from)\n        { display.view = display.view.slice(findViewIndex(cm, from)); }\n      display.viewFrom = from;\n      if (display.viewTo < to)\n        { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); }\n      else if (display.viewTo > to)\n        { display.view = display.view.slice(0, findViewIndex(cm, to)); }\n    }\n    display.viewTo = to;\n  }\n\n  // Count the number of lines in the view whose DOM representation is\n  // out of date (or nonexistent).\n  function countDirtyView(cm) {\n    var view = cm.display.view, dirty = 0;\n    for (var i = 0; i < view.length; i++) {\n      var lineView = view[i];\n      if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; }\n    }\n    return dirty\n  }\n\n  // HIGHLIGHT WORKER\n\n  function startWorker(cm, time) {\n    if (cm.doc.highlightFrontier < cm.display.viewTo)\n      { cm.state.highlight.set(time, bind(highlightWorker, cm)); }\n  }\n\n  function highlightWorker(cm) {\n    var doc = cm.doc;\n    if (doc.highlightFrontier >= cm.display.viewTo) { return }\n    var end = +new Date + cm.options.workTime;\n    var context = getContextBefore(cm, doc.highlightFrontier);\n    var changedLines = [];\n\n    doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) {\n      if (context.line >= cm.display.viewFrom) { // Visible\n        var oldStyles = line.styles;\n        var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null;\n        var highlighted = highlightLine(cm, line, context, true);\n        if (resetState) { context.state = resetState; }\n        line.styles = highlighted.styles;\n        var oldCls = line.styleClasses, newCls = highlighted.classes;\n        if (newCls) { line.styleClasses = newCls; }\n        else if (oldCls) { line.styleClasses = null; }\n        var ischange = !oldStyles || oldStyles.length != line.styles.length ||\n          oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);\n        for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; }\n        if (ischange) { changedLines.push(context.line); }\n        line.stateAfter = context.save();\n        context.nextLine();\n      } else {\n        if (line.text.length <= cm.options.maxHighlightLength)\n          { processLine(cm, line.text, context); }\n        line.stateAfter = context.line % 5 == 0 ? context.save() : null;\n        context.nextLine();\n      }\n      if (+new Date > end) {\n        startWorker(cm, cm.options.workDelay);\n        return true\n      }\n    });\n    doc.highlightFrontier = context.line;\n    doc.modeFrontier = Math.max(doc.modeFrontier, context.line);\n    if (changedLines.length) { runInOp(cm, function () {\n      for (var i = 0; i < changedLines.length; i++)\n        { regLineChange(cm, changedLines[i], \"text\"); }\n    }); }\n  }\n\n  // DISPLAY DRAWING\n\n  var DisplayUpdate = function(cm, viewport, force) {\n    var display = cm.display;\n\n    this.viewport = viewport;\n    // Store some values that we'll need later (but don't want to force a relayout for)\n    this.visible = visibleLines(display, cm.doc, viewport);\n    this.editorIsHidden = !display.wrapper.offsetWidth;\n    this.wrapperHeight = display.wrapper.clientHeight;\n    this.wrapperWidth = display.wrapper.clientWidth;\n    this.oldDisplayWidth = displayWidth(cm);\n    this.force = force;\n    this.dims = getDimensions(cm);\n    this.events = [];\n  };\n\n  DisplayUpdate.prototype.signal = function (emitter, type) {\n    if (hasHandler(emitter, type))\n      { this.events.push(arguments); }\n  };\n  DisplayUpdate.prototype.finish = function () {\n      var this$1 = this;\n\n    for (var i = 0; i < this.events.length; i++)\n      { signal.apply(null, this$1.events[i]); }\n  };\n\n  function maybeClipScrollbars(cm) {\n    var display = cm.display;\n    if (!display.scrollbarsClipped && display.scroller.offsetWidth) {\n      display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth;\n      display.heightForcer.style.height = scrollGap(cm) + \"px\";\n      display.sizer.style.marginBottom = -display.nativeBarWidth + \"px\";\n      display.sizer.style.borderRightWidth = scrollGap(cm) + \"px\";\n      display.scrollbarsClipped = true;\n    }\n  }\n\n  function selectionSnapshot(cm) {\n    if (cm.hasFocus()) { return null }\n    var active = activeElt();\n    if (!active || !contains(cm.display.lineDiv, active)) { return null }\n    var result = {activeElt: active};\n    if (window.getSelection) {\n      var sel = window.getSelection();\n      if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) {\n        result.anchorNode = sel.anchorNode;\n        result.anchorOffset = sel.anchorOffset;\n        result.focusNode = sel.focusNode;\n        result.focusOffset = sel.focusOffset;\n      }\n    }\n    return result\n  }\n\n  function restoreSelection(snapshot) {\n    if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { return }\n    snapshot.activeElt.focus();\n    if (snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) {\n      var sel = window.getSelection(), range$$1 = document.createRange();\n      range$$1.setEnd(snapshot.anchorNode, snapshot.anchorOffset);\n      range$$1.collapse(false);\n      sel.removeAllRanges();\n      sel.addRange(range$$1);\n      sel.extend(snapshot.focusNode, snapshot.focusOffset);\n    }\n  }\n\n  // Does the actual updating of the line display. Bails out\n  // (returning false) when there is nothing to be done and forced is\n  // false.\n  function updateDisplayIfNeeded(cm, update) {\n    var display = cm.display, doc = cm.doc;\n\n    if (update.editorIsHidden) {\n      resetView(cm);\n      return false\n    }\n\n    // Bail out if the visible area is already rendered and nothing changed.\n    if (!update.force &&\n        update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&\n        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&\n        display.renderedView == display.view && countDirtyView(cm) == 0)\n      { return false }\n\n    if (maybeUpdateLineNumberWidth(cm)) {\n      resetView(cm);\n      update.dims = getDimensions(cm);\n    }\n\n    // Compute a suitable new viewport (from & to)\n    var end = doc.first + doc.size;\n    var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);\n    var to = Math.min(end, update.visible.to + cm.options.viewportMargin);\n    if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); }\n    if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); }\n    if (sawCollapsedSpans) {\n      from = visualLineNo(cm.doc, from);\n      to = visualLineEndNo(cm.doc, to);\n    }\n\n    var different = from != display.viewFrom || to != display.viewTo ||\n      display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth;\n    adjustView(cm, from, to);\n\n    display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));\n    // Position the mover div to align with the current scroll position\n    cm.display.mover.style.top = display.viewOffset + \"px\";\n\n    var toUpdate = countDirtyView(cm);\n    if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&\n        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))\n      { return false }\n\n    // For big changes, we hide the enclosing element during the\n    // update, since that speeds up the operations on most browsers.\n    var selSnapshot = selectionSnapshot(cm);\n    if (toUpdate > 4) { display.lineDiv.style.display = \"none\"; }\n    patchDisplay(cm, display.updateLineNumbers, update.dims);\n    if (toUpdate > 4) { display.lineDiv.style.display = \"\"; }\n    display.renderedView = display.view;\n    // There might have been a widget with a focused element that got\n    // hidden or updated, if so re-focus it.\n    restoreSelection(selSnapshot);\n\n    // Prevent selection and cursors from interfering with the scroll\n    // width and height.\n    removeChildren(display.cursorDiv);\n    removeChildren(display.selectionDiv);\n    display.gutters.style.height = display.sizer.style.minHeight = 0;\n\n    if (different) {\n      display.lastWrapHeight = update.wrapperHeight;\n      display.lastWrapWidth = update.wrapperWidth;\n      startWorker(cm, 400);\n    }\n\n    display.updateLineNumbers = null;\n\n    return true\n  }\n\n  function postUpdateDisplay(cm, update) {\n    var viewport = update.viewport;\n\n    for (var first = true;; first = false) {\n      if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {\n        // Clip forced viewport to actual scrollable area.\n        if (viewport && viewport.top != null)\n          { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; }\n        // Updated line heights might result in the drawn area not\n        // actually covering the viewport. Keep looping until it does.\n        update.visible = visibleLines(cm.display, cm.doc, viewport);\n        if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)\n          { break }\n      }\n      if (!updateDisplayIfNeeded(cm, update)) { break }\n      updateHeightsInViewport(cm);\n      var barMeasure = measureForScrollbars(cm);\n      updateSelection(cm);\n      updateScrollbars(cm, barMeasure);\n      setDocumentHeight(cm, barMeasure);\n      update.force = false;\n    }\n\n    update.signal(cm, \"update\", cm);\n    if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {\n      update.signal(cm, \"viewportChange\", cm, cm.display.viewFrom, cm.display.viewTo);\n      cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;\n    }\n  }\n\n  function updateDisplaySimple(cm, viewport) {\n    var update = new DisplayUpdate(cm, viewport);\n    if (updateDisplayIfNeeded(cm, update)) {\n      updateHeightsInViewport(cm);\n      postUpdateDisplay(cm, update);\n      var barMeasure = measureForScrollbars(cm);\n      updateSelection(cm);\n      updateScrollbars(cm, barMeasure);\n      setDocumentHeight(cm, barMeasure);\n      update.finish();\n    }\n  }\n\n  // Sync the actual display DOM structure with display.view, removing\n  // nodes for lines that are no longer in view, and creating the ones\n  // that are not there yet, and updating the ones that are out of\n  // date.\n  function patchDisplay(cm, updateNumbersFrom, dims) {\n    var display = cm.display, lineNumbers = cm.options.lineNumbers;\n    var container = display.lineDiv, cur = container.firstChild;\n\n    function rm(node) {\n      var next = node.nextSibling;\n      // Works around a throw-scroll bug in OS X Webkit\n      if (webkit && mac && cm.display.currentWheelTarget == node)\n        { node.style.display = \"none\"; }\n      else\n        { node.parentNode.removeChild(node); }\n      return next\n    }\n\n    var view = display.view, lineN = display.viewFrom;\n    // Loop over the elements in the view, syncing cur (the DOM nodes\n    // in display.lineDiv) with the view as we go.\n    for (var i = 0; i < view.length; i++) {\n      var lineView = view[i];\n      if (lineView.hidden) ; else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet\n        var node = buildLineElement(cm, lineView, lineN, dims);\n        container.insertBefore(node, cur);\n      } else { // Already drawn\n        while (cur != lineView.node) { cur = rm(cur); }\n        var updateNumber = lineNumbers && updateNumbersFrom != null &&\n          updateNumbersFrom <= lineN && lineView.lineNumber;\n        if (lineView.changes) {\n          if (indexOf(lineView.changes, \"gutter\") > -1) { updateNumber = false; }\n          updateLineForChanges(cm, lineView, lineN, dims);\n        }\n        if (updateNumber) {\n          removeChildren(lineView.lineNumber);\n          lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));\n        }\n        cur = lineView.node.nextSibling;\n      }\n      lineN += lineView.size;\n    }\n    while (cur) { cur = rm(cur); }\n  }\n\n  function updateGutterSpace(cm) {\n    var width = cm.display.gutters.offsetWidth;\n    cm.display.sizer.style.marginLeft = width + \"px\";\n  }\n\n  function setDocumentHeight(cm, measure) {\n    cm.display.sizer.style.minHeight = measure.docHeight + \"px\";\n    cm.display.heightForcer.style.top = measure.docHeight + \"px\";\n    cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + \"px\";\n  }\n\n  // Rebuild the gutter elements, ensure the margin to the left of the\n  // code matches their width.\n  function updateGutters(cm) {\n    var gutters = cm.display.gutters, specs = cm.options.gutters;\n    removeChildren(gutters);\n    var i = 0;\n    for (; i < specs.length; ++i) {\n      var gutterClass = specs[i];\n      var gElt = gutters.appendChild(elt(\"div\", null, \"CodeMirror-gutter \" + gutterClass));\n      if (gutterClass == \"CodeMirror-linenumbers\") {\n        cm.display.lineGutter = gElt;\n        gElt.style.width = (cm.display.lineNumWidth || 1) + \"px\";\n      }\n    }\n    gutters.style.display = i ? \"\" : \"none\";\n    updateGutterSpace(cm);\n  }\n\n  // Make sure the gutters options contains the element\n  // \"CodeMirror-linenumbers\" when the lineNumbers option is true.\n  function setGuttersForLineNumbers(options) {\n    var found = indexOf(options.gutters, \"CodeMirror-linenumbers\");\n    if (found == -1 && options.lineNumbers) {\n      options.gutters = options.gutters.concat([\"CodeMirror-linenumbers\"]);\n    } else if (found > -1 && !options.lineNumbers) {\n      options.gutters = options.gutters.slice(0);\n      options.gutters.splice(found, 1);\n    }\n  }\n\n  // Since the delta values reported on mouse wheel events are\n  // unstandardized between browsers and even browser versions, and\n  // generally horribly unpredictable, this code starts by measuring\n  // the scroll effect that the first few mouse wheel events have,\n  // and, from that, detects the way it can convert deltas to pixel\n  // offsets afterwards.\n  //\n  // The reason we want to know the amount a wheel event will scroll\n  // is that it gives us a chance to update the display before the\n  // actual scrolling happens, reducing flickering.\n\n  var wheelSamples = 0, wheelPixelsPerUnit = null;\n  // Fill in a browser-detected starting value on browsers where we\n  // know one. These don't have to be accurate -- the result of them\n  // being wrong would just be a slight flicker on the first wheel\n  // scroll (if it is large enough).\n  if (ie) { wheelPixelsPerUnit = -.53; }\n  else if (gecko) { wheelPixelsPerUnit = 15; }\n  else if (chrome) { wheelPixelsPerUnit = -.7; }\n  else if (safari) { wheelPixelsPerUnit = -1/3; }\n\n  function wheelEventDelta(e) {\n    var dx = e.wheelDeltaX, dy = e.wheelDeltaY;\n    if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; }\n    if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; }\n    else if (dy == null) { dy = e.wheelDelta; }\n    return {x: dx, y: dy}\n  }\n  function wheelEventPixels(e) {\n    var delta = wheelEventDelta(e);\n    delta.x *= wheelPixelsPerUnit;\n    delta.y *= wheelPixelsPerUnit;\n    return delta\n  }\n\n  function onScrollWheel(cm, e) {\n    var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;\n\n    var display = cm.display, scroll = display.scroller;\n    // Quit if there's nothing to scroll here\n    var canScrollX = scroll.scrollWidth > scroll.clientWidth;\n    var canScrollY = scroll.scrollHeight > scroll.clientHeight;\n    if (!(dx && canScrollX || dy && canScrollY)) { return }\n\n    // Webkit browsers on OS X abort momentum scrolls when the target\n    // of the scroll event is removed from the scrollable element.\n    // This hack (see related code in patchDisplay) makes sure the\n    // element is kept around.\n    if (dy && mac && webkit) {\n      outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {\n        for (var i = 0; i < view.length; i++) {\n          if (view[i].node == cur) {\n            cm.display.currentWheelTarget = cur;\n            break outer\n          }\n        }\n      }\n    }\n\n    // On some browsers, horizontal scrolling will cause redraws to\n    // happen before the gutter has been realigned, causing it to\n    // wriggle around in a most unseemly way. When we have an\n    // estimated pixels/delta value, we just handle horizontal\n    // scrolling entirely here. It'll be slightly off from native, but\n    // better than glitching out.\n    if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {\n      if (dy && canScrollY)\n        { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * wheelPixelsPerUnit)); }\n      setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * wheelPixelsPerUnit));\n      // Only prevent default scrolling if vertical scrolling is\n      // actually possible. Otherwise, it causes vertical scroll\n      // jitter on OSX trackpads when deltaX is small and deltaY\n      // is large (issue #3579)\n      if (!dy || (dy && canScrollY))\n        { e_preventDefault(e); }\n      display.wheelStartX = null; // Abort measurement, if in progress\n      return\n    }\n\n    // 'Project' the visible viewport to cover the area that is being\n    // scrolled into view (if we know enough to estimate it).\n    if (dy && wheelPixelsPerUnit != null) {\n      var pixels = dy * wheelPixelsPerUnit;\n      var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;\n      if (pixels < 0) { top = Math.max(0, top + pixels - 50); }\n      else { bot = Math.min(cm.doc.height, bot + pixels + 50); }\n      updateDisplaySimple(cm, {top: top, bottom: bot});\n    }\n\n    if (wheelSamples < 20) {\n      if (display.wheelStartX == null) {\n        display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;\n        display.wheelDX = dx; display.wheelDY = dy;\n        setTimeout(function () {\n          if (display.wheelStartX == null) { return }\n          var movedX = scroll.scrollLeft - display.wheelStartX;\n          var movedY = scroll.scrollTop - display.wheelStartY;\n          var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||\n            (movedX && display.wheelDX && movedX / display.wheelDX);\n          display.wheelStartX = display.wheelStartY = null;\n          if (!sample) { return }\n          wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);\n          ++wheelSamples;\n        }, 200);\n      } else {\n        display.wheelDX += dx; display.wheelDY += dy;\n      }\n    }\n  }\n\n  // Selection objects are immutable. A new one is created every time\n  // the selection changes. A selection is one or more non-overlapping\n  // (and non-touching) ranges, sorted, and an integer that indicates\n  // which one is the primary selection (the one that's scrolled into\n  // view, that getCursor returns, etc).\n  var Selection = function(ranges, primIndex) {\n    this.ranges = ranges;\n    this.primIndex = primIndex;\n  };\n\n  Selection.prototype.primary = function () { return this.ranges[this.primIndex] };\n\n  Selection.prototype.equals = function (other) {\n      var this$1 = this;\n\n    if (other == this) { return true }\n    if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false }\n    for (var i = 0; i < this.ranges.length; i++) {\n      var here = this$1.ranges[i], there = other.ranges[i];\n      if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false }\n    }\n    return true\n  };\n\n  Selection.prototype.deepCopy = function () {\n      var this$1 = this;\n\n    var out = [];\n    for (var i = 0; i < this.ranges.length; i++)\n      { out[i] = new Range(copyPos(this$1.ranges[i].anchor), copyPos(this$1.ranges[i].head)); }\n    return new Selection(out, this.primIndex)\n  };\n\n  Selection.prototype.somethingSelected = function () {\n      var this$1 = this;\n\n    for (var i = 0; i < this.ranges.length; i++)\n      { if (!this$1.ranges[i].empty()) { return true } }\n    return false\n  };\n\n  Selection.prototype.contains = function (pos, end) {\n      var this$1 = this;\n\n    if (!end) { end = pos; }\n    for (var i = 0; i < this.ranges.length; i++) {\n      var range = this$1.ranges[i];\n      if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)\n        { return i }\n    }\n    return -1\n  };\n\n  var Range = function(anchor, head) {\n    this.anchor = anchor; this.head = head;\n  };\n\n  Range.prototype.from = function () { return minPos(this.anchor, this.head) };\n  Range.prototype.to = function () { return maxPos(this.anchor, this.head) };\n  Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch };\n\n  // Take an unsorted, potentially overlapping set of ranges, and\n  // build a selection out of it. 'Consumes' ranges array (modifying\n  // it).\n  function normalizeSelection(cm, ranges, primIndex) {\n    var mayTouch = cm && cm.options.selectionsMayTouch;\n    var prim = ranges[primIndex];\n    ranges.sort(function (a, b) { return cmp(a.from(), b.from()); });\n    primIndex = indexOf(ranges, prim);\n    for (var i = 1; i < ranges.length; i++) {\n      var cur = ranges[i], prev = ranges[i - 1];\n      var diff = cmp(prev.to(), cur.from());\n      if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) {\n        var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());\n        var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;\n        if (i <= primIndex) { --primIndex; }\n        ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));\n      }\n    }\n    return new Selection(ranges, primIndex)\n  }\n\n  function simpleSelection(anchor, head) {\n    return new Selection([new Range(anchor, head || anchor)], 0)\n  }\n\n  // Compute the position of the end of a change (its 'to' property\n  // refers to the pre-change end).\n  function changeEnd(change) {\n    if (!change.text) { return change.to }\n    return Pos(change.from.line + change.text.length - 1,\n               lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0))\n  }\n\n  // Adjust a position to refer to the post-change position of the\n  // same text, or the end of the change if the change covers it.\n  function adjustForChange(pos, change) {\n    if (cmp(pos, change.from) < 0) { return pos }\n    if (cmp(pos, change.to) <= 0) { return changeEnd(change) }\n\n    var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;\n    if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; }\n    return Pos(line, ch)\n  }\n\n  function computeSelAfterChange(doc, change) {\n    var out = [];\n    for (var i = 0; i < doc.sel.ranges.length; i++) {\n      var range = doc.sel.ranges[i];\n      out.push(new Range(adjustForChange(range.anchor, change),\n                         adjustForChange(range.head, change)));\n    }\n    return normalizeSelection(doc.cm, out, doc.sel.primIndex)\n  }\n\n  function offsetPos(pos, old, nw) {\n    if (pos.line == old.line)\n      { return Pos(nw.line, pos.ch - old.ch + nw.ch) }\n    else\n      { return Pos(nw.line + (pos.line - old.line), pos.ch) }\n  }\n\n  // Used by replaceSelections to allow moving the selection to the\n  // start or around the replaced test. Hint may be \"start\" or \"around\".\n  function computeReplacedSel(doc, changes, hint) {\n    var out = [];\n    var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;\n    for (var i = 0; i < changes.length; i++) {\n      var change = changes[i];\n      var from = offsetPos(change.from, oldPrev, newPrev);\n      var to = offsetPos(changeEnd(change), oldPrev, newPrev);\n      oldPrev = change.to;\n      newPrev = to;\n      if (hint == \"around\") {\n        var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;\n        out[i] = new Range(inv ? to : from, inv ? from : to);\n      } else {\n        out[i] = new Range(from, from);\n      }\n    }\n    return new Selection(out, doc.sel.primIndex)\n  }\n\n  // Used to get the editor into a consistent state again when options change.\n\n  function loadMode(cm) {\n    cm.doc.mode = getMode(cm.options, cm.doc.modeOption);\n    resetModeState(cm);\n  }\n\n  function resetModeState(cm) {\n    cm.doc.iter(function (line) {\n      if (line.stateAfter) { line.stateAfter = null; }\n      if (line.styles) { line.styles = null; }\n    });\n    cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first;\n    startWorker(cm, 100);\n    cm.state.modeGen++;\n    if (cm.curOp) { regChange(cm); }\n  }\n\n  // DOCUMENT DATA STRUCTURE\n\n  // By default, updates that start and end at the beginning of a line\n  // are treated specially, in order to make the association of line\n  // widgets and marker elements with the text behave more intuitive.\n  function isWholeLineUpdate(doc, change) {\n    return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == \"\" &&\n      (!doc.cm || doc.cm.options.wholeLineUpdateBefore)\n  }\n\n  // Perform a change on the document data structure.\n  function updateDoc(doc, change, markedSpans, estimateHeight$$1) {\n    function spansFor(n) {return markedSpans ? markedSpans[n] : null}\n    function update(line, text, spans) {\n      updateLine(line, text, spans, estimateHeight$$1);\n      signalLater(line, \"change\", line, change);\n    }\n    function linesFor(start, end) {\n      var result = [];\n      for (var i = start; i < end; ++i)\n        { result.push(new Line(text[i], spansFor(i), estimateHeight$$1)); }\n      return result\n    }\n\n    var from = change.from, to = change.to, text = change.text;\n    var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);\n    var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;\n\n    // Adjust the line structure\n    if (change.full) {\n      doc.insert(0, linesFor(0, text.length));\n      doc.remove(text.length, doc.size - text.length);\n    } else if (isWholeLineUpdate(doc, change)) {\n      // This is a whole-line replace. Treated specially to make\n      // sure line objects move the way they are supposed to.\n      var added = linesFor(0, text.length - 1);\n      update(lastLine, lastLine.text, lastSpans);\n      if (nlines) { doc.remove(from.line, nlines); }\n      if (added.length) { doc.insert(from.line, added); }\n    } else if (firstLine == lastLine) {\n      if (text.length == 1) {\n        update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);\n      } else {\n        var added$1 = linesFor(1, text.length - 1);\n        added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight$$1));\n        update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n        doc.insert(from.line + 1, added$1);\n      }\n    } else if (text.length == 1) {\n      update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));\n      doc.remove(from.line + 1, nlines);\n    } else {\n      update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n      update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);\n      var added$2 = linesFor(1, text.length - 1);\n      if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); }\n      doc.insert(from.line + 1, added$2);\n    }\n\n    signalLater(doc, \"change\", doc, change);\n  }\n\n  // Call f for all linked documents.\n  function linkedDocs(doc, f, sharedHistOnly) {\n    function propagate(doc, skip, sharedHist) {\n      if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) {\n        var rel = doc.linked[i];\n        if (rel.doc == skip) { continue }\n        var shared = sharedHist && rel.sharedHist;\n        if (sharedHistOnly && !shared) { continue }\n        f(rel.doc, shared);\n        propagate(rel.doc, doc, shared);\n      } }\n    }\n    propagate(doc, null, true);\n  }\n\n  // Attach a document to an editor.\n  function attachDoc(cm, doc) {\n    if (doc.cm) { throw new Error(\"This document is already in use.\") }\n    cm.doc = doc;\n    doc.cm = cm;\n    estimateLineHeights(cm);\n    loadMode(cm);\n    setDirectionClass(cm);\n    if (!cm.options.lineWrapping) { findMaxLine(cm); }\n    cm.options.mode = doc.modeOption;\n    regChange(cm);\n  }\n\n  function setDirectionClass(cm) {\n  (cm.doc.direction == \"rtl\" ? addClass : rmClass)(cm.display.lineDiv, \"CodeMirror-rtl\");\n  }\n\n  function directionChanged(cm) {\n    runInOp(cm, function () {\n      setDirectionClass(cm);\n      regChange(cm);\n    });\n  }\n\n  function History(startGen) {\n    // Arrays of change events and selections. Doing something adds an\n    // event to done and clears undo. Undoing moves events from done\n    // to undone, redoing moves them in the other direction.\n    this.done = []; this.undone = [];\n    this.undoDepth = Infinity;\n    // Used to track when changes can be merged into a single undo\n    // event\n    this.lastModTime = this.lastSelTime = 0;\n    this.lastOp = this.lastSelOp = null;\n    this.lastOrigin = this.lastSelOrigin = null;\n    // Used by the isClean() method\n    this.generation = this.maxGeneration = startGen || 1;\n  }\n\n  // Create a history change event from an updateDoc-style change\n  // object.\n  function historyChangeFromChange(doc, change) {\n    var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};\n    attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);\n    linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true);\n    return histChange\n  }\n\n  // Pop all selection events off the end of a history array. Stop at\n  // a change event.\n  function clearSelectionEvents(array) {\n    while (array.length) {\n      var last = lst(array);\n      if (last.ranges) { array.pop(); }\n      else { break }\n    }\n  }\n\n  // Find the top change event in the history. Pop off selection\n  // events that are in the way.\n  function lastChangeEvent(hist, force) {\n    if (force) {\n      clearSelectionEvents(hist.done);\n      return lst(hist.done)\n    } else if (hist.done.length && !lst(hist.done).ranges) {\n      return lst(hist.done)\n    } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {\n      hist.done.pop();\n      return lst(hist.done)\n    }\n  }\n\n  // Register a change in the history. Merges changes that are within\n  // a single operation, or are close together with an origin that\n  // allows merging (starting with \"+\") into a single event.\n  function addChangeToHistory(doc, change, selAfter, opId) {\n    var hist = doc.history;\n    hist.undone.length = 0;\n    var time = +new Date, cur;\n    var last;\n\n    if ((hist.lastOp == opId ||\n         hist.lastOrigin == change.origin && change.origin &&\n         ((change.origin.charAt(0) == \"+\" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) ||\n          change.origin.charAt(0) == \"*\")) &&\n        (cur = lastChangeEvent(hist, hist.lastOp == opId))) {\n      // Merge this change into the last event\n      last = lst(cur.changes);\n      if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {\n        // Optimized case for simple insertion -- don't want to add\n        // new changesets for every character typed\n        last.to = changeEnd(change);\n      } else {\n        // Add new sub-event\n        cur.changes.push(historyChangeFromChange(doc, change));\n      }\n    } else {\n      // Can not be merged, start a new event.\n      var before = lst(hist.done);\n      if (!before || !before.ranges)\n        { pushSelectionToHistory(doc.sel, hist.done); }\n      cur = {changes: [historyChangeFromChange(doc, change)],\n             generation: hist.generation};\n      hist.done.push(cur);\n      while (hist.done.length > hist.undoDepth) {\n        hist.done.shift();\n        if (!hist.done[0].ranges) { hist.done.shift(); }\n      }\n    }\n    hist.done.push(selAfter);\n    hist.generation = ++hist.maxGeneration;\n    hist.lastModTime = hist.lastSelTime = time;\n    hist.lastOp = hist.lastSelOp = opId;\n    hist.lastOrigin = hist.lastSelOrigin = change.origin;\n\n    if (!last) { signal(doc, \"historyAdded\"); }\n  }\n\n  function selectionEventCanBeMerged(doc, origin, prev, sel) {\n    var ch = origin.charAt(0);\n    return ch == \"*\" ||\n      ch == \"+\" &&\n      prev.ranges.length == sel.ranges.length &&\n      prev.somethingSelected() == sel.somethingSelected() &&\n      new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500)\n  }\n\n  // Called whenever the selection changes, sets the new selection as\n  // the pending selection in the history, and pushes the old pending\n  // selection into the 'done' array when it was significantly\n  // different (in number of selected ranges, emptiness, or time).\n  function addSelectionToHistory(doc, sel, opId, options) {\n    var hist = doc.history, origin = options && options.origin;\n\n    // A new event is started when the previous origin does not match\n    // the current, or the origins don't allow matching. Origins\n    // starting with * are always merged, those starting with + are\n    // merged when similar and close together in time.\n    if (opId == hist.lastSelOp ||\n        (origin && hist.lastSelOrigin == origin &&\n         (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||\n          selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))\n      { hist.done[hist.done.length - 1] = sel; }\n    else\n      { pushSelectionToHistory(sel, hist.done); }\n\n    hist.lastSelTime = +new Date;\n    hist.lastSelOrigin = origin;\n    hist.lastSelOp = opId;\n    if (options && options.clearRedo !== false)\n      { clearSelectionEvents(hist.undone); }\n  }\n\n  function pushSelectionToHistory(sel, dest) {\n    var top = lst(dest);\n    if (!(top && top.ranges && top.equals(sel)))\n      { dest.push(sel); }\n  }\n\n  // Used to store marked span information in the history.\n  function attachLocalSpans(doc, change, from, to) {\n    var existing = change[\"spans_\" + doc.id], n = 0;\n    doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) {\n      if (line.markedSpans)\n        { (existing || (existing = change[\"spans_\" + doc.id] = {}))[n] = line.markedSpans; }\n      ++n;\n    });\n  }\n\n  // When un/re-doing restores text containing marked spans, those\n  // that have been explicitly cleared should not be restored.\n  function removeClearedSpans(spans) {\n    if (!spans) { return null }\n    var out;\n    for (var i = 0; i < spans.length; ++i) {\n      if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } }\n      else if (out) { out.push(spans[i]); }\n    }\n    return !out ? spans : out.length ? out : null\n  }\n\n  // Retrieve and filter the old marked spans stored in a change event.\n  function getOldSpans(doc, change) {\n    var found = change[\"spans_\" + doc.id];\n    if (!found) { return null }\n    var nw = [];\n    for (var i = 0; i < change.text.length; ++i)\n      { nw.push(removeClearedSpans(found[i])); }\n    return nw\n  }\n\n  // Used for un/re-doing changes from the history. Combines the\n  // result of computing the existing spans with the set of spans that\n  // existed in the history (so that deleting around a span and then\n  // undoing brings back the span).\n  function mergeOldSpans(doc, change) {\n    var old = getOldSpans(doc, change);\n    var stretched = stretchSpansOverChange(doc, change);\n    if (!old) { return stretched }\n    if (!stretched) { return old }\n\n    for (var i = 0; i < old.length; ++i) {\n      var oldCur = old[i], stretchCur = stretched[i];\n      if (oldCur && stretchCur) {\n        spans: for (var j = 0; j < stretchCur.length; ++j) {\n          var span = stretchCur[j];\n          for (var k = 0; k < oldCur.length; ++k)\n            { if (oldCur[k].marker == span.marker) { continue spans } }\n          oldCur.push(span);\n        }\n      } else if (stretchCur) {\n        old[i] = stretchCur;\n      }\n    }\n    return old\n  }\n\n  // Used both to provide a JSON-safe object in .getHistory, and, when\n  // detaching a document, to split the history in two\n  function copyHistoryArray(events, newGroup, instantiateSel) {\n    var copy = [];\n    for (var i = 0; i < events.length; ++i) {\n      var event = events[i];\n      if (event.ranges) {\n        copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);\n        continue\n      }\n      var changes = event.changes, newChanges = [];\n      copy.push({changes: newChanges});\n      for (var j = 0; j < changes.length; ++j) {\n        var change = changes[j], m = (void 0);\n        newChanges.push({from: change.from, to: change.to, text: change.text});\n        if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\\d+)$/)) {\n          if (indexOf(newGroup, Number(m[1])) > -1) {\n            lst(newChanges)[prop] = change[prop];\n            delete change[prop];\n          }\n        } } }\n      }\n    }\n    return copy\n  }\n\n  // The 'scroll' parameter given to many of these indicated whether\n  // the new cursor position should be scrolled into view after\n  // modifying the selection.\n\n  // If shift is held or the extend flag is set, extends a range to\n  // include a given position (and optionally a second position).\n  // Otherwise, simply returns the range between the given positions.\n  // Used for cursor motion and such.\n  function extendRange(range, head, other, extend) {\n    if (extend) {\n      var anchor = range.anchor;\n      if (other) {\n        var posBefore = cmp(head, anchor) < 0;\n        if (posBefore != (cmp(other, anchor) < 0)) {\n          anchor = head;\n          head = other;\n        } else if (posBefore != (cmp(head, other) < 0)) {\n          head = other;\n        }\n      }\n      return new Range(anchor, head)\n    } else {\n      return new Range(other || head, head)\n    }\n  }\n\n  // Extend the primary selection range, discard the rest.\n  function extendSelection(doc, head, other, options, extend) {\n    if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); }\n    setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options);\n  }\n\n  // Extend all selections (pos is an array of selections with length\n  // equal the number of selections)\n  function extendSelections(doc, heads, options) {\n    var out = [];\n    var extend = doc.cm && (doc.cm.display.shift || doc.extend);\n    for (var i = 0; i < doc.sel.ranges.length; i++)\n      { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); }\n    var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex);\n    setSelection(doc, newSel, options);\n  }\n\n  // Updates a single range in the selection.\n  function replaceOneSelection(doc, i, range, options) {\n    var ranges = doc.sel.ranges.slice(0);\n    ranges[i] = range;\n    setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options);\n  }\n\n  // Reset the selection to a single range.\n  function setSimpleSelection(doc, anchor, head, options) {\n    setSelection(doc, simpleSelection(anchor, head), options);\n  }\n\n  // Give beforeSelectionChange handlers a change to influence a\n  // selection update.\n  function filterSelectionChange(doc, sel, options) {\n    var obj = {\n      ranges: sel.ranges,\n      update: function(ranges) {\n        var this$1 = this;\n\n        this.ranges = [];\n        for (var i = 0; i < ranges.length; i++)\n          { this$1.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),\n                                     clipPos(doc, ranges[i].head)); }\n      },\n      origin: options && options.origin\n    };\n    signal(doc, \"beforeSelectionChange\", doc, obj);\n    if (doc.cm) { signal(doc.cm, \"beforeSelectionChange\", doc.cm, obj); }\n    if (obj.ranges != sel.ranges) { return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1) }\n    else { return sel }\n  }\n\n  function setSelectionReplaceHistory(doc, sel, options) {\n    var done = doc.history.done, last = lst(done);\n    if (last && last.ranges) {\n      done[done.length - 1] = sel;\n      setSelectionNoUndo(doc, sel, options);\n    } else {\n      setSelection(doc, sel, options);\n    }\n  }\n\n  // Set a new selection.\n  function setSelection(doc, sel, options) {\n    setSelectionNoUndo(doc, sel, options);\n    addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);\n  }\n\n  function setSelectionNoUndo(doc, sel, options) {\n    if (hasHandler(doc, \"beforeSelectionChange\") || doc.cm && hasHandler(doc.cm, \"beforeSelectionChange\"))\n      { sel = filterSelectionChange(doc, sel, options); }\n\n    var bias = options && options.bias ||\n      (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);\n    setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));\n\n    if (!(options && options.scroll === false) && doc.cm)\n      { ensureCursorVisible(doc.cm); }\n  }\n\n  function setSelectionInner(doc, sel) {\n    if (sel.equals(doc.sel)) { return }\n\n    doc.sel = sel;\n\n    if (doc.cm) {\n      doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true;\n      signalCursorActivity(doc.cm);\n    }\n    signalLater(doc, \"cursorActivity\", doc);\n  }\n\n  // Verify that the selection does not partially select any atomic\n  // marked ranges.\n  function reCheckSelection(doc) {\n    setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false));\n  }\n\n  // Return a selection that does not partially select any atomic\n  // ranges.\n  function skipAtomicInSelection(doc, sel, bias, mayClear) {\n    var out;\n    for (var i = 0; i < sel.ranges.length; i++) {\n      var range = sel.ranges[i];\n      var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i];\n      var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear);\n      var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear);\n      if (out || newAnchor != range.anchor || newHead != range.head) {\n        if (!out) { out = sel.ranges.slice(0, i); }\n        out[i] = new Range(newAnchor, newHead);\n      }\n    }\n    return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel\n  }\n\n  function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {\n    var line = getLine(doc, pos.line);\n    if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {\n      var sp = line.markedSpans[i], m = sp.marker;\n      if ((sp.from == null || (m.inclusiveLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&\n          (sp.to == null || (m.inclusiveRight ? sp.to >= pos.ch : sp.to > pos.ch))) {\n        if (mayClear) {\n          signal(m, \"beforeCursorEnter\");\n          if (m.explicitlyCleared) {\n            if (!line.markedSpans) { break }\n            else {--i; continue}\n          }\n        }\n        if (!m.atomic) { continue }\n\n        if (oldPos) {\n          var near = m.find(dir < 0 ? 1 : -1), diff = (void 0);\n          if (dir < 0 ? m.inclusiveRight : m.inclusiveLeft)\n            { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); }\n          if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0))\n            { return skipAtomicInner(doc, near, pos, dir, mayClear) }\n        }\n\n        var far = m.find(dir < 0 ? -1 : 1);\n        if (dir < 0 ? m.inclusiveLeft : m.inclusiveRight)\n          { far = movePos(doc, far, dir, far.line == pos.line ? line : null); }\n        return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null\n      }\n    } }\n    return pos\n  }\n\n  // Ensure a given position is not inside an atomic range.\n  function skipAtomic(doc, pos, oldPos, bias, mayClear) {\n    var dir = bias || 1;\n    var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) ||\n        (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) ||\n        skipAtomicInner(doc, pos, oldPos, -dir, mayClear) ||\n        (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true));\n    if (!found) {\n      doc.cantEdit = true;\n      return Pos(doc.first, 0)\n    }\n    return found\n  }\n\n  function movePos(doc, pos, dir, line) {\n    if (dir < 0 && pos.ch == 0) {\n      if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) }\n      else { return null }\n    } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) {\n      if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) }\n      else { return null }\n    } else {\n      return new Pos(pos.line, pos.ch + dir)\n    }\n  }\n\n  function selectAll(cm) {\n    cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);\n  }\n\n  // UPDATING\n\n  // Allow \"beforeChange\" event handlers to influence a change\n  function filterChange(doc, change, update) {\n    var obj = {\n      canceled: false,\n      from: change.from,\n      to: change.to,\n      text: change.text,\n      origin: change.origin,\n      cancel: function () { return obj.canceled = true; }\n    };\n    if (update) { obj.update = function (from, to, text, origin) {\n      if (from) { obj.from = clipPos(doc, from); }\n      if (to) { obj.to = clipPos(doc, to); }\n      if (text) { obj.text = text; }\n      if (origin !== undefined) { obj.origin = origin; }\n    }; }\n    signal(doc, \"beforeChange\", doc, obj);\n    if (doc.cm) { signal(doc.cm, \"beforeChange\", doc.cm, obj); }\n\n    if (obj.canceled) { return null }\n    return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin}\n  }\n\n  // Apply a change to a document, and add it to the document's\n  // history, and propagating it to all linked documents.\n  function makeChange(doc, change, ignoreReadOnly) {\n    if (doc.cm) {\n      if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) }\n      if (doc.cm.state.suppressEdits) { return }\n    }\n\n    if (hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\")) {\n      change = filterChange(doc, change, true);\n      if (!change) { return }\n    }\n\n    // Possibly split or suppress the update based on the presence\n    // of read-only spans in its range.\n    var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);\n    if (split) {\n      for (var i = split.length - 1; i >= 0; --i)\n        { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [\"\"] : change.text, origin: change.origin}); }\n    } else {\n      makeChangeInner(doc, change);\n    }\n  }\n\n  function makeChangeInner(doc, change) {\n    if (change.text.length == 1 && change.text[0] == \"\" && cmp(change.from, change.to) == 0) { return }\n    var selAfter = computeSelAfterChange(doc, change);\n    addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);\n\n    makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));\n    var rebased = [];\n\n    linkedDocs(doc, function (doc, sharedHist) {\n      if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n        rebaseHist(doc.history, change);\n        rebased.push(doc.history);\n      }\n      makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));\n    });\n  }\n\n  // Revert a change stored in a document's history.\n  function makeChangeFromHistory(doc, type, allowSelectionOnly) {\n    var suppress = doc.cm && doc.cm.state.suppressEdits;\n    if (suppress && !allowSelectionOnly) { return }\n\n    var hist = doc.history, event, selAfter = doc.sel;\n    var source = type == \"undo\" ? hist.done : hist.undone, dest = type == \"undo\" ? hist.undone : hist.done;\n\n    // Verify that there is a useable event (so that ctrl-z won't\n    // needlessly clear selection events)\n    var i = 0;\n    for (; i < source.length; i++) {\n      event = source[i];\n      if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)\n        { break }\n    }\n    if (i == source.length) { return }\n    hist.lastOrigin = hist.lastSelOrigin = null;\n\n    for (;;) {\n      event = source.pop();\n      if (event.ranges) {\n        pushSelectionToHistory(event, dest);\n        if (allowSelectionOnly && !event.equals(doc.sel)) {\n          setSelection(doc, event, {clearRedo: false});\n          return\n        }\n        selAfter = event;\n      } else if (suppress) {\n        source.push(event);\n        return\n      } else { break }\n    }\n\n    // Build up a reverse change object to add to the opposite history\n    // stack (redo when undoing, and vice versa).\n    var antiChanges = [];\n    pushSelectionToHistory(selAfter, dest);\n    dest.push({changes: antiChanges, generation: hist.generation});\n    hist.generation = event.generation || ++hist.maxGeneration;\n\n    var filter = hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\");\n\n    var loop = function ( i ) {\n      var change = event.changes[i];\n      change.origin = type;\n      if (filter && !filterChange(doc, change, false)) {\n        source.length = 0;\n        return {}\n      }\n\n      antiChanges.push(historyChangeFromChange(doc, change));\n\n      var after = i ? computeSelAfterChange(doc, change) : lst(source);\n      makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));\n      if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); }\n      var rebased = [];\n\n      // Propagate to the linked documents\n      linkedDocs(doc, function (doc, sharedHist) {\n        if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n          rebaseHist(doc.history, change);\n          rebased.push(doc.history);\n        }\n        makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));\n      });\n    };\n\n    for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) {\n      var returned = loop( i$1 );\n\n      if ( returned ) return returned.v;\n    }\n  }\n\n  // Sub-views need their line numbers shifted when text is added\n  // above or below them in the parent document.\n  function shiftDoc(doc, distance) {\n    if (distance == 0) { return }\n    doc.first += distance;\n    doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range(\n      Pos(range.anchor.line + distance, range.anchor.ch),\n      Pos(range.head.line + distance, range.head.ch)\n    ); }), doc.sel.primIndex);\n    if (doc.cm) {\n      regChange(doc.cm, doc.first, doc.first - distance, distance);\n      for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)\n        { regLineChange(doc.cm, l, \"gutter\"); }\n    }\n  }\n\n  // More lower-level change function, handling only a single document\n  // (not linked ones).\n  function makeChangeSingleDoc(doc, change, selAfter, spans) {\n    if (doc.cm && !doc.cm.curOp)\n      { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) }\n\n    if (change.to.line < doc.first) {\n      shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));\n      return\n    }\n    if (change.from.line > doc.lastLine()) { return }\n\n    // Clip the change to the size of this doc\n    if (change.from.line < doc.first) {\n      var shift = change.text.length - 1 - (doc.first - change.from.line);\n      shiftDoc(doc, shift);\n      change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),\n                text: [lst(change.text)], origin: change.origin};\n    }\n    var last = doc.lastLine();\n    if (change.to.line > last) {\n      change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),\n                text: [change.text[0]], origin: change.origin};\n    }\n\n    change.removed = getBetween(doc, change.from, change.to);\n\n    if (!selAfter) { selAfter = computeSelAfterChange(doc, change); }\n    if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); }\n    else { updateDoc(doc, change, spans); }\n    setSelectionNoUndo(doc, selAfter, sel_dontScroll);\n  }\n\n  // Handle the interaction of a change to a document with the editor\n  // that this document is part of.\n  function makeChangeSingleDocInEditor(cm, change, spans) {\n    var doc = cm.doc, display = cm.display, from = change.from, to = change.to;\n\n    var recomputeMaxLength = false, checkWidthStart = from.line;\n    if (!cm.options.lineWrapping) {\n      checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));\n      doc.iter(checkWidthStart, to.line + 1, function (line) {\n        if (line == display.maxLine) {\n          recomputeMaxLength = true;\n          return true\n        }\n      });\n    }\n\n    if (doc.sel.contains(change.from, change.to) > -1)\n      { signalCursorActivity(cm); }\n\n    updateDoc(doc, change, spans, estimateHeight(cm));\n\n    if (!cm.options.lineWrapping) {\n      doc.iter(checkWidthStart, from.line + change.text.length, function (line) {\n        var len = lineLength(line);\n        if (len > display.maxLineLength) {\n          display.maxLine = line;\n          display.maxLineLength = len;\n          display.maxLineChanged = true;\n          recomputeMaxLength = false;\n        }\n      });\n      if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; }\n    }\n\n    retreatFrontier(doc, from.line);\n    startWorker(cm, 400);\n\n    var lendiff = change.text.length - (to.line - from.line) - 1;\n    // Remember that these lines changed, for updating the display\n    if (change.full)\n      { regChange(cm); }\n    else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))\n      { regLineChange(cm, from.line, \"text\"); }\n    else\n      { regChange(cm, from.line, to.line + 1, lendiff); }\n\n    var changesHandler = hasHandler(cm, \"changes\"), changeHandler = hasHandler(cm, \"change\");\n    if (changeHandler || changesHandler) {\n      var obj = {\n        from: from, to: to,\n        text: change.text,\n        removed: change.removed,\n        origin: change.origin\n      };\n      if (changeHandler) { signalLater(cm, \"change\", cm, obj); }\n      if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); }\n    }\n    cm.display.selForContextMenu = null;\n  }\n\n  function replaceRange(doc, code, from, to, origin) {\n    var assign;\n\n    if (!to) { to = from; }\n    if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); }\n    if (typeof code == \"string\") { code = doc.splitLines(code); }\n    makeChange(doc, {from: from, to: to, text: code, origin: origin});\n  }\n\n  // Rebasing/resetting history to deal with externally-sourced changes\n\n  function rebaseHistSelSingle(pos, from, to, diff) {\n    if (to < pos.line) {\n      pos.line += diff;\n    } else if (from < pos.line) {\n      pos.line = from;\n      pos.ch = 0;\n    }\n  }\n\n  // Tries to rebase an array of history events given a change in the\n  // document. If the change touches the same lines as the event, the\n  // event, and everything 'behind' it, is discarded. If the change is\n  // before the event, the event's positions are updated. Uses a\n  // copy-on-write scheme for the positions, to avoid having to\n  // reallocate them all on every rebase, but also avoid problems with\n  // shared position objects being unsafely updated.\n  function rebaseHistArray(array, from, to, diff) {\n    for (var i = 0; i < array.length; ++i) {\n      var sub = array[i], ok = true;\n      if (sub.ranges) {\n        if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }\n        for (var j = 0; j < sub.ranges.length; j++) {\n          rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);\n          rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);\n        }\n        continue\n      }\n      for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) {\n        var cur = sub.changes[j$1];\n        if (to < cur.from.line) {\n          cur.from = Pos(cur.from.line + diff, cur.from.ch);\n          cur.to = Pos(cur.to.line + diff, cur.to.ch);\n        } else if (from <= cur.to.line) {\n          ok = false;\n          break\n        }\n      }\n      if (!ok) {\n        array.splice(0, i + 1);\n        i = 0;\n      }\n    }\n  }\n\n  function rebaseHist(hist, change) {\n    var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;\n    rebaseHistArray(hist.done, from, to, diff);\n    rebaseHistArray(hist.undone, from, to, diff);\n  }\n\n  // Utility for applying a change to a line by handle or number,\n  // returning the number and optionally registering the line as\n  // changed.\n  function changeLine(doc, handle, changeType, op) {\n    var no = handle, line = handle;\n    if (typeof handle == \"number\") { line = getLine(doc, clipLine(doc, handle)); }\n    else { no = lineNo(handle); }\n    if (no == null) { return null }\n    if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); }\n    return line\n  }\n\n  // The document is represented as a BTree consisting of leaves, with\n  // chunk of lines in them, and branches, with up to ten leaves or\n  // other branch nodes below them. The top node is always a branch\n  // node, and is the document object itself (meaning it has\n  // additional methods and properties).\n  //\n  // All nodes have parent links. The tree is used both to go from\n  // line numbers to line objects, and to go from objects to numbers.\n  // It also indexes by height, and is used to convert between height\n  // and line object, and to find the total height of the document.\n  //\n  // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html\n\n  function LeafChunk(lines) {\n    var this$1 = this;\n\n    this.lines = lines;\n    this.parent = null;\n    var height = 0;\n    for (var i = 0; i < lines.length; ++i) {\n      lines[i].parent = this$1;\n      height += lines[i].height;\n    }\n    this.height = height;\n  }\n\n  LeafChunk.prototype = {\n    chunkSize: function() { return this.lines.length },\n\n    // Remove the n lines at offset 'at'.\n    removeInner: function(at, n) {\n      var this$1 = this;\n\n      for (var i = at, e = at + n; i < e; ++i) {\n        var line = this$1.lines[i];\n        this$1.height -= line.height;\n        cleanUpLine(line);\n        signalLater(line, \"delete\");\n      }\n      this.lines.splice(at, n);\n    },\n\n    // Helper used to collapse a small branch into a single leaf.\n    collapse: function(lines) {\n      lines.push.apply(lines, this.lines);\n    },\n\n    // Insert the given array of lines at offset 'at', count them as\n    // having the given height.\n    insertInner: function(at, lines, height) {\n      var this$1 = this;\n\n      this.height += height;\n      this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));\n      for (var i = 0; i < lines.length; ++i) { lines[i].parent = this$1; }\n    },\n\n    // Used to iterate over a part of the tree.\n    iterN: function(at, n, op) {\n      var this$1 = this;\n\n      for (var e = at + n; at < e; ++at)\n        { if (op(this$1.lines[at])) { return true } }\n    }\n  };\n\n  function BranchChunk(children) {\n    var this$1 = this;\n\n    this.children = children;\n    var size = 0, height = 0;\n    for (var i = 0; i < children.length; ++i) {\n      var ch = children[i];\n      size += ch.chunkSize(); height += ch.height;\n      ch.parent = this$1;\n    }\n    this.size = size;\n    this.height = height;\n    this.parent = null;\n  }\n\n  BranchChunk.prototype = {\n    chunkSize: function() { return this.size },\n\n    removeInner: function(at, n) {\n      var this$1 = this;\n\n      this.size -= n;\n      for (var i = 0; i < this.children.length; ++i) {\n        var child = this$1.children[i], sz = child.chunkSize();\n        if (at < sz) {\n          var rm = Math.min(n, sz - at), oldHeight = child.height;\n          child.removeInner(at, rm);\n          this$1.height -= oldHeight - child.height;\n          if (sz == rm) { this$1.children.splice(i--, 1); child.parent = null; }\n          if ((n -= rm) == 0) { break }\n          at = 0;\n        } else { at -= sz; }\n      }\n      // If the result is smaller than 25 lines, ensure that it is a\n      // single leaf node.\n      if (this.size - n < 25 &&\n          (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {\n        var lines = [];\n        this.collapse(lines);\n        this.children = [new LeafChunk(lines)];\n        this.children[0].parent = this;\n      }\n    },\n\n    collapse: function(lines) {\n      var this$1 = this;\n\n      for (var i = 0; i < this.children.length; ++i) { this$1.children[i].collapse(lines); }\n    },\n\n    insertInner: function(at, lines, height) {\n      var this$1 = this;\n\n      this.size += lines.length;\n      this.height += height;\n      for (var i = 0; i < this.children.length; ++i) {\n        var child = this$1.children[i], sz = child.chunkSize();\n        if (at <= sz) {\n          child.insertInner(at, lines, height);\n          if (child.lines && child.lines.length > 50) {\n            // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced.\n            // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest.\n            var remaining = child.lines.length % 25 + 25;\n            for (var pos = remaining; pos < child.lines.length;) {\n              var leaf = new LeafChunk(child.lines.slice(pos, pos += 25));\n              child.height -= leaf.height;\n              this$1.children.splice(++i, 0, leaf);\n              leaf.parent = this$1;\n            }\n            child.lines = child.lines.slice(0, remaining);\n            this$1.maybeSpill();\n          }\n          break\n        }\n        at -= sz;\n      }\n    },\n\n    // When a node has grown, check whether it should be split.\n    maybeSpill: function() {\n      if (this.children.length <= 10) { return }\n      var me = this;\n      do {\n        var spilled = me.children.splice(me.children.length - 5, 5);\n        var sibling = new BranchChunk(spilled);\n        if (!me.parent) { // Become the parent node\n          var copy = new BranchChunk(me.children);\n          copy.parent = me;\n          me.children = [copy, sibling];\n          me = copy;\n       } else {\n          me.size -= sibling.size;\n          me.height -= sibling.height;\n          var myIndex = indexOf(me.parent.children, me);\n          me.parent.children.splice(myIndex + 1, 0, sibling);\n        }\n        sibling.parent = me.parent;\n      } while (me.children.length > 10)\n      me.parent.maybeSpill();\n    },\n\n    iterN: function(at, n, op) {\n      var this$1 = this;\n\n      for (var i = 0; i < this.children.length; ++i) {\n        var child = this$1.children[i], sz = child.chunkSize();\n        if (at < sz) {\n          var used = Math.min(n, sz - at);\n          if (child.iterN(at, used, op)) { return true }\n          if ((n -= used) == 0) { break }\n          at = 0;\n        } else { at -= sz; }\n      }\n    }\n  };\n\n  // Line widgets are block elements displayed above or below a line.\n\n  var LineWidget = function(doc, node, options) {\n    var this$1 = this;\n\n    if (options) { for (var opt in options) { if (options.hasOwnProperty(opt))\n      { this$1[opt] = options[opt]; } } }\n    this.doc = doc;\n    this.node = node;\n  };\n\n  LineWidget.prototype.clear = function () {\n      var this$1 = this;\n\n    var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);\n    if (no == null || !ws) { return }\n    for (var i = 0; i < ws.length; ++i) { if (ws[i] == this$1) { ws.splice(i--, 1); } }\n    if (!ws.length) { line.widgets = null; }\n    var height = widgetHeight(this);\n    updateLineHeight(line, Math.max(0, line.height - height));\n    if (cm) {\n      runInOp(cm, function () {\n        adjustScrollWhenAboveVisible(cm, line, -height);\n        regLineChange(cm, no, \"widget\");\n      });\n      signalLater(cm, \"lineWidgetCleared\", cm, this, no);\n    }\n  };\n\n  LineWidget.prototype.changed = function () {\n      var this$1 = this;\n\n    var oldH = this.height, cm = this.doc.cm, line = this.line;\n    this.height = null;\n    var diff = widgetHeight(this) - oldH;\n    if (!diff) { return }\n    if (!lineIsHidden(this.doc, line)) { updateLineHeight(line, line.height + diff); }\n    if (cm) {\n      runInOp(cm, function () {\n        cm.curOp.forceUpdate = true;\n        adjustScrollWhenAboveVisible(cm, line, diff);\n        signalLater(cm, \"lineWidgetChanged\", cm, this$1, lineNo(line));\n      });\n    }\n  };\n  eventMixin(LineWidget);\n\n  function adjustScrollWhenAboveVisible(cm, line, diff) {\n    if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))\n      { addToScrollTop(cm, diff); }\n  }\n\n  function addLineWidget(doc, handle, node, options) {\n    var widget = new LineWidget(doc, node, options);\n    var cm = doc.cm;\n    if (cm && widget.noHScroll) { cm.display.alignWidgets = true; }\n    changeLine(doc, handle, \"widget\", function (line) {\n      var widgets = line.widgets || (line.widgets = []);\n      if (widget.insertAt == null) { widgets.push(widget); }\n      else { widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget); }\n      widget.line = line;\n      if (cm && !lineIsHidden(doc, line)) {\n        var aboveVisible = heightAtLine(line) < doc.scrollTop;\n        updateLineHeight(line, line.height + widgetHeight(widget));\n        if (aboveVisible) { addToScrollTop(cm, widget.height); }\n        cm.curOp.forceUpdate = true;\n      }\n      return true\n    });\n    if (cm) { signalLater(cm, \"lineWidgetAdded\", cm, widget, typeof handle == \"number\" ? handle : lineNo(handle)); }\n    return widget\n  }\n\n  // TEXTMARKERS\n\n  // Created with markText and setBookmark methods. A TextMarker is a\n  // handle that can be used to clear or find a marked position in the\n  // document. Line objects hold arrays (markedSpans) containing\n  // {from, to, marker} object pointing to such marker objects, and\n  // indicating that such a marker is present on that line. Multiple\n  // lines may point to the same marker when it spans across lines.\n  // The spans will have null for their from/to properties when the\n  // marker continues beyond the start/end of the line. Markers have\n  // links back to the lines they currently touch.\n\n  // Collapsed markers have unique ids, in order to be able to order\n  // them, which is needed for uniquely determining an outer marker\n  // when they overlap (they may nest, but not partially overlap).\n  var nextMarkerId = 0;\n\n  var TextMarker = function(doc, type) {\n    this.lines = [];\n    this.type = type;\n    this.doc = doc;\n    this.id = ++nextMarkerId;\n  };\n\n  // Clear the marker.\n  TextMarker.prototype.clear = function () {\n      var this$1 = this;\n\n    if (this.explicitlyCleared) { return }\n    var cm = this.doc.cm, withOp = cm && !cm.curOp;\n    if (withOp) { startOperation(cm); }\n    if (hasHandler(this, \"clear\")) {\n      var found = this.find();\n      if (found) { signalLater(this, \"clear\", found.from, found.to); }\n    }\n    var min = null, max = null;\n    for (var i = 0; i < this.lines.length; ++i) {\n      var line = this$1.lines[i];\n      var span = getMarkedSpanFor(line.markedSpans, this$1);\n      if (cm && !this$1.collapsed) { regLineChange(cm, lineNo(line), \"text\"); }\n      else if (cm) {\n        if (span.to != null) { max = lineNo(line); }\n        if (span.from != null) { min = lineNo(line); }\n      }\n      line.markedSpans = removeMarkedSpan(line.markedSpans, span);\n      if (span.from == null && this$1.collapsed && !lineIsHidden(this$1.doc, line) && cm)\n        { updateLineHeight(line, textHeight(cm.display)); }\n    }\n    if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) {\n      var visual = visualLine(this$1.lines[i$1]), len = lineLength(visual);\n      if (len > cm.display.maxLineLength) {\n        cm.display.maxLine = visual;\n        cm.display.maxLineLength = len;\n        cm.display.maxLineChanged = true;\n      }\n    } }\n\n    if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); }\n    this.lines.length = 0;\n    this.explicitlyCleared = true;\n    if (this.atomic && this.doc.cantEdit) {\n      this.doc.cantEdit = false;\n      if (cm) { reCheckSelection(cm.doc); }\n    }\n    if (cm) { signalLater(cm, \"markerCleared\", cm, this, min, max); }\n    if (withOp) { endOperation(cm); }\n    if (this.parent) { this.parent.clear(); }\n  };\n\n  // Find the position of the marker in the document. Returns a {from,\n  // to} object by default. Side can be passed to get a specific side\n  // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the\n  // Pos objects returned contain a line object, rather than a line\n  // number (used to prevent looking up the same line twice).\n  TextMarker.prototype.find = function (side, lineObj) {\n      var this$1 = this;\n\n    if (side == null && this.type == \"bookmark\") { side = 1; }\n    var from, to;\n    for (var i = 0; i < this.lines.length; ++i) {\n      var line = this$1.lines[i];\n      var span = getMarkedSpanFor(line.markedSpans, this$1);\n      if (span.from != null) {\n        from = Pos(lineObj ? line : lineNo(line), span.from);\n        if (side == -1) { return from }\n      }\n      if (span.to != null) {\n        to = Pos(lineObj ? line : lineNo(line), span.to);\n        if (side == 1) { return to }\n      }\n    }\n    return from && {from: from, to: to}\n  };\n\n  // Signals that the marker's widget changed, and surrounding layout\n  // should be recomputed.\n  TextMarker.prototype.changed = function () {\n      var this$1 = this;\n\n    var pos = this.find(-1, true), widget = this, cm = this.doc.cm;\n    if (!pos || !cm) { return }\n    runInOp(cm, function () {\n      var line = pos.line, lineN = lineNo(pos.line);\n      var view = findViewForLine(cm, lineN);\n      if (view) {\n        clearLineMeasurementCacheFor(view);\n        cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;\n      }\n      cm.curOp.updateMaxLine = true;\n      if (!lineIsHidden(widget.doc, line) && widget.height != null) {\n        var oldHeight = widget.height;\n        widget.height = null;\n        var dHeight = widgetHeight(widget) - oldHeight;\n        if (dHeight)\n          { updateLineHeight(line, line.height + dHeight); }\n      }\n      signalLater(cm, \"markerChanged\", cm, this$1);\n    });\n  };\n\n  TextMarker.prototype.attachLine = function (line) {\n    if (!this.lines.length && this.doc.cm) {\n      var op = this.doc.cm.curOp;\n      if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)\n        { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); }\n    }\n    this.lines.push(line);\n  };\n\n  TextMarker.prototype.detachLine = function (line) {\n    this.lines.splice(indexOf(this.lines, line), 1);\n    if (!this.lines.length && this.doc.cm) {\n      var op = this.doc.cm.curOp\n      ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);\n    }\n  };\n  eventMixin(TextMarker);\n\n  // Create a marker, wire it up to the right lines, and\n  function markText(doc, from, to, options, type) {\n    // Shared markers (across linked documents) are handled separately\n    // (markTextShared will call out to this again, once per\n    // document).\n    if (options && options.shared) { return markTextShared(doc, from, to, options, type) }\n    // Ensure we are in an operation.\n    if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) }\n\n    var marker = new TextMarker(doc, type), diff = cmp(from, to);\n    if (options) { copyObj(options, marker, false); }\n    // Don't connect empty markers unless clearWhenEmpty is false\n    if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)\n      { return marker }\n    if (marker.replacedWith) {\n      // Showing up as a widget implies collapsed (widget replaces text)\n      marker.collapsed = true;\n      marker.widgetNode = eltP(\"span\", [marker.replacedWith], \"CodeMirror-widget\");\n      if (!options.handleMouseEvents) { marker.widgetNode.setAttribute(\"cm-ignore-events\", \"true\"); }\n      if (options.insertLeft) { marker.widgetNode.insertLeft = true; }\n    }\n    if (marker.collapsed) {\n      if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||\n          from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))\n        { throw new Error(\"Inserting collapsed marker partially overlapping an existing one\") }\n      seeCollapsedSpans();\n    }\n\n    if (marker.addToHistory)\n      { addChangeToHistory(doc, {from: from, to: to, origin: \"markText\"}, doc.sel, NaN); }\n\n    var curLine = from.line, cm = doc.cm, updateMaxLine;\n    doc.iter(curLine, to.line + 1, function (line) {\n      if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)\n        { updateMaxLine = true; }\n      if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); }\n      addMarkedSpan(line, new MarkedSpan(marker,\n                                         curLine == from.line ? from.ch : null,\n                                         curLine == to.line ? to.ch : null));\n      ++curLine;\n    });\n    // lineIsHidden depends on the presence of the spans, so needs a second pass\n    if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) {\n      if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); }\n    }); }\n\n    if (marker.clearOnEnter) { on(marker, \"beforeCursorEnter\", function () { return marker.clear(); }); }\n\n    if (marker.readOnly) {\n      seeReadOnlySpans();\n      if (doc.history.done.length || doc.history.undone.length)\n        { doc.clearHistory(); }\n    }\n    if (marker.collapsed) {\n      marker.id = ++nextMarkerId;\n      marker.atomic = true;\n    }\n    if (cm) {\n      // Sync editor state\n      if (updateMaxLine) { cm.curOp.updateMaxLine = true; }\n      if (marker.collapsed)\n        { regChange(cm, from.line, to.line + 1); }\n      else if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.css)\n        { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, \"text\"); } }\n      if (marker.atomic) { reCheckSelection(cm.doc); }\n      signalLater(cm, \"markerAdded\", cm, marker);\n    }\n    return marker\n  }\n\n  // SHARED TEXTMARKERS\n\n  // A shared marker spans multiple linked documents. It is\n  // implemented as a meta-marker-object controlling multiple normal\n  // markers.\n  var SharedTextMarker = function(markers, primary) {\n    var this$1 = this;\n\n    this.markers = markers;\n    this.primary = primary;\n    for (var i = 0; i < markers.length; ++i)\n      { markers[i].parent = this$1; }\n  };\n\n  SharedTextMarker.prototype.clear = function () {\n      var this$1 = this;\n\n    if (this.explicitlyCleared) { return }\n    this.explicitlyCleared = true;\n    for (var i = 0; i < this.markers.length; ++i)\n      { this$1.markers[i].clear(); }\n    signalLater(this, \"clear\");\n  };\n\n  SharedTextMarker.prototype.find = function (side, lineObj) {\n    return this.primary.find(side, lineObj)\n  };\n  eventMixin(SharedTextMarker);\n\n  function markTextShared(doc, from, to, options, type) {\n    options = copyObj(options);\n    options.shared = false;\n    var markers = [markText(doc, from, to, options, type)], primary = markers[0];\n    var widget = options.widgetNode;\n    linkedDocs(doc, function (doc) {\n      if (widget) { options.widgetNode = widget.cloneNode(true); }\n      markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));\n      for (var i = 0; i < doc.linked.length; ++i)\n        { if (doc.linked[i].isParent) { return } }\n      primary = lst(markers);\n    });\n    return new SharedTextMarker(markers, primary)\n  }\n\n  function findSharedMarkers(doc) {\n    return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; })\n  }\n\n  function copySharedMarkers(doc, markers) {\n    for (var i = 0; i < markers.length; i++) {\n      var marker = markers[i], pos = marker.find();\n      var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);\n      if (cmp(mFrom, mTo)) {\n        var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);\n        marker.markers.push(subMark);\n        subMark.parent = marker;\n      }\n    }\n  }\n\n  function detachSharedMarkers(markers) {\n    var loop = function ( i ) {\n      var marker = markers[i], linked = [marker.primary.doc];\n      linkedDocs(marker.primary.doc, function (d) { return linked.push(d); });\n      for (var j = 0; j < marker.markers.length; j++) {\n        var subMarker = marker.markers[j];\n        if (indexOf(linked, subMarker.doc) == -1) {\n          subMarker.parent = null;\n          marker.markers.splice(j--, 1);\n        }\n      }\n    };\n\n    for (var i = 0; i < markers.length; i++) loop( i );\n  }\n\n  var nextDocId = 0;\n  var Doc = function(text, mode, firstLine, lineSep, direction) {\n    if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) }\n    if (firstLine == null) { firstLine = 0; }\n\n    BranchChunk.call(this, [new LeafChunk([new Line(\"\", null)])]);\n    this.first = firstLine;\n    this.scrollTop = this.scrollLeft = 0;\n    this.cantEdit = false;\n    this.cleanGeneration = 1;\n    this.modeFrontier = this.highlightFrontier = firstLine;\n    var start = Pos(firstLine, 0);\n    this.sel = simpleSelection(start);\n    this.history = new History(null);\n    this.id = ++nextDocId;\n    this.modeOption = mode;\n    this.lineSep = lineSep;\n    this.direction = (direction == \"rtl\") ? \"rtl\" : \"ltr\";\n    this.extend = false;\n\n    if (typeof text == \"string\") { text = this.splitLines(text); }\n    updateDoc(this, {from: start, to: start, text: text});\n    setSelection(this, simpleSelection(start), sel_dontScroll);\n  };\n\n  Doc.prototype = createObj(BranchChunk.prototype, {\n    constructor: Doc,\n    // Iterate over the document. Supports two forms -- with only one\n    // argument, it calls that for each line in the document. With\n    // three, it iterates over the range given by the first two (with\n    // the second being non-inclusive).\n    iter: function(from, to, op) {\n      if (op) { this.iterN(from - this.first, to - from, op); }\n      else { this.iterN(this.first, this.first + this.size, from); }\n    },\n\n    // Non-public interface for adding and removing lines.\n    insert: function(at, lines) {\n      var height = 0;\n      for (var i = 0; i < lines.length; ++i) { height += lines[i].height; }\n      this.insertInner(at - this.first, lines, height);\n    },\n    remove: function(at, n) { this.removeInner(at - this.first, n); },\n\n    // From here, the methods are part of the public interface. Most\n    // are also available from CodeMirror (editor) instances.\n\n    getValue: function(lineSep) {\n      var lines = getLines(this, this.first, this.first + this.size);\n      if (lineSep === false) { return lines }\n      return lines.join(lineSep || this.lineSeparator())\n    },\n    setValue: docMethodOp(function(code) {\n      var top = Pos(this.first, 0), last = this.first + this.size - 1;\n      makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),\n                        text: this.splitLines(code), origin: \"setValue\", full: true}, true);\n      if (this.cm) { scrollToCoords(this.cm, 0, 0); }\n      setSelection(this, simpleSelection(top), sel_dontScroll);\n    }),\n    replaceRange: function(code, from, to, origin) {\n      from = clipPos(this, from);\n      to = to ? clipPos(this, to) : from;\n      replaceRange(this, code, from, to, origin);\n    },\n    getRange: function(from, to, lineSep) {\n      var lines = getBetween(this, clipPos(this, from), clipPos(this, to));\n      if (lineSep === false) { return lines }\n      return lines.join(lineSep || this.lineSeparator())\n    },\n\n    getLine: function(line) {var l = this.getLineHandle(line); return l && l.text},\n\n    getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }},\n    getLineNumber: function(line) {return lineNo(line)},\n\n    getLineHandleVisualStart: function(line) {\n      if (typeof line == \"number\") { line = getLine(this, line); }\n      return visualLine(line)\n    },\n\n    lineCount: function() {return this.size},\n    firstLine: function() {return this.first},\n    lastLine: function() {return this.first + this.size - 1},\n\n    clipPos: function(pos) {return clipPos(this, pos)},\n\n    getCursor: function(start) {\n      var range$$1 = this.sel.primary(), pos;\n      if (start == null || start == \"head\") { pos = range$$1.head; }\n      else if (start == \"anchor\") { pos = range$$1.anchor; }\n      else if (start == \"end\" || start == \"to\" || start === false) { pos = range$$1.to(); }\n      else { pos = range$$1.from(); }\n      return pos\n    },\n    listSelections: function() { return this.sel.ranges },\n    somethingSelected: function() {return this.sel.somethingSelected()},\n\n    setCursor: docMethodOp(function(line, ch, options) {\n      setSimpleSelection(this, clipPos(this, typeof line == \"number\" ? Pos(line, ch || 0) : line), null, options);\n    }),\n    setSelection: docMethodOp(function(anchor, head, options) {\n      setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);\n    }),\n    extendSelection: docMethodOp(function(head, other, options) {\n      extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);\n    }),\n    extendSelections: docMethodOp(function(heads, options) {\n      extendSelections(this, clipPosArray(this, heads), options);\n    }),\n    extendSelectionsBy: docMethodOp(function(f, options) {\n      var heads = map(this.sel.ranges, f);\n      extendSelections(this, clipPosArray(this, heads), options);\n    }),\n    setSelections: docMethodOp(function(ranges, primary, options) {\n      var this$1 = this;\n\n      if (!ranges.length) { return }\n      var out = [];\n      for (var i = 0; i < ranges.length; i++)\n        { out[i] = new Range(clipPos(this$1, ranges[i].anchor),\n                           clipPos(this$1, ranges[i].head)); }\n      if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); }\n      setSelection(this, normalizeSelection(this.cm, out, primary), options);\n    }),\n    addSelection: docMethodOp(function(anchor, head, options) {\n      var ranges = this.sel.ranges.slice(0);\n      ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));\n      setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options);\n    }),\n\n    getSelection: function(lineSep) {\n      var this$1 = this;\n\n      var ranges = this.sel.ranges, lines;\n      for (var i = 0; i < ranges.length; i++) {\n        var sel = getBetween(this$1, ranges[i].from(), ranges[i].to());\n        lines = lines ? lines.concat(sel) : sel;\n      }\n      if (lineSep === false) { return lines }\n      else { return lines.join(lineSep || this.lineSeparator()) }\n    },\n    getSelections: function(lineSep) {\n      var this$1 = this;\n\n      var parts = [], ranges = this.sel.ranges;\n      for (var i = 0; i < ranges.length; i++) {\n        var sel = getBetween(this$1, ranges[i].from(), ranges[i].to());\n        if (lineSep !== false) { sel = sel.join(lineSep || this$1.lineSeparator()); }\n        parts[i] = sel;\n      }\n      return parts\n    },\n    replaceSelection: function(code, collapse, origin) {\n      var dup = [];\n      for (var i = 0; i < this.sel.ranges.length; i++)\n        { dup[i] = code; }\n      this.replaceSelections(dup, collapse, origin || \"+input\");\n    },\n    replaceSelections: docMethodOp(function(code, collapse, origin) {\n      var this$1 = this;\n\n      var changes = [], sel = this.sel;\n      for (var i = 0; i < sel.ranges.length; i++) {\n        var range$$1 = sel.ranges[i];\n        changes[i] = {from: range$$1.from(), to: range$$1.to(), text: this$1.splitLines(code[i]), origin: origin};\n      }\n      var newSel = collapse && collapse != \"end\" && computeReplacedSel(this, changes, collapse);\n      for (var i$1 = changes.length - 1; i$1 >= 0; i$1--)\n        { makeChange(this$1, changes[i$1]); }\n      if (newSel) { setSelectionReplaceHistory(this, newSel); }\n      else if (this.cm) { ensureCursorVisible(this.cm); }\n    }),\n    undo: docMethodOp(function() {makeChangeFromHistory(this, \"undo\");}),\n    redo: docMethodOp(function() {makeChangeFromHistory(this, \"redo\");}),\n    undoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"undo\", true);}),\n    redoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"redo\", true);}),\n\n    setExtending: function(val) {this.extend = val;},\n    getExtending: function() {return this.extend},\n\n    historySize: function() {\n      var hist = this.history, done = 0, undone = 0;\n      for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } }\n      for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } }\n      return {undo: done, redo: undone}\n    },\n    clearHistory: function() {this.history = new History(this.history.maxGeneration);},\n\n    markClean: function() {\n      this.cleanGeneration = this.changeGeneration(true);\n    },\n    changeGeneration: function(forceSplit) {\n      if (forceSplit)\n        { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; }\n      return this.history.generation\n    },\n    isClean: function (gen) {\n      return this.history.generation == (gen || this.cleanGeneration)\n    },\n\n    getHistory: function() {\n      return {done: copyHistoryArray(this.history.done),\n              undone: copyHistoryArray(this.history.undone)}\n    },\n    setHistory: function(histData) {\n      var hist = this.history = new History(this.history.maxGeneration);\n      hist.done = copyHistoryArray(histData.done.slice(0), null, true);\n      hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);\n    },\n\n    setGutterMarker: docMethodOp(function(line, gutterID, value) {\n      return changeLine(this, line, \"gutter\", function (line) {\n        var markers = line.gutterMarkers || (line.gutterMarkers = {});\n        markers[gutterID] = value;\n        if (!value && isEmpty(markers)) { line.gutterMarkers = null; }\n        return true\n      })\n    }),\n\n    clearGutter: docMethodOp(function(gutterID) {\n      var this$1 = this;\n\n      this.iter(function (line) {\n        if (line.gutterMarkers && line.gutterMarkers[gutterID]) {\n          changeLine(this$1, line, \"gutter\", function () {\n            line.gutterMarkers[gutterID] = null;\n            if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; }\n            return true\n          });\n        }\n      });\n    }),\n\n    lineInfo: function(line) {\n      var n;\n      if (typeof line == \"number\") {\n        if (!isLine(this, line)) { return null }\n        n = line;\n        line = getLine(this, line);\n        if (!line) { return null }\n      } else {\n        n = lineNo(line);\n        if (n == null) { return null }\n      }\n      return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,\n              textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,\n              widgets: line.widgets}\n    },\n\n    addLineClass: docMethodOp(function(handle, where, cls) {\n      return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function (line) {\n        var prop = where == \"text\" ? \"textClass\"\n                 : where == \"background\" ? \"bgClass\"\n                 : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n        if (!line[prop]) { line[prop] = cls; }\n        else if (classTest(cls).test(line[prop])) { return false }\n        else { line[prop] += \" \" + cls; }\n        return true\n      })\n    }),\n    removeLineClass: docMethodOp(function(handle, where, cls) {\n      return changeLine(this, handle, where == \"gutter\" ? \"gutter\" : \"class\", function (line) {\n        var prop = where == \"text\" ? \"textClass\"\n                 : where == \"background\" ? \"bgClass\"\n                 : where == \"gutter\" ? \"gutterClass\" : \"wrapClass\";\n        var cur = line[prop];\n        if (!cur) { return false }\n        else if (cls == null) { line[prop] = null; }\n        else {\n          var found = cur.match(classTest(cls));\n          if (!found) { return false }\n          var end = found.index + found[0].length;\n          line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? \"\" : \" \") + cur.slice(end) || null;\n        }\n        return true\n      })\n    }),\n\n    addLineWidget: docMethodOp(function(handle, node, options) {\n      return addLineWidget(this, handle, node, options)\n    }),\n    removeLineWidget: function(widget) { widget.clear(); },\n\n    markText: function(from, to, options) {\n      return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || \"range\")\n    },\n    setBookmark: function(pos, options) {\n      var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),\n                      insertLeft: options && options.insertLeft,\n                      clearWhenEmpty: false, shared: options && options.shared,\n                      handleMouseEvents: options && options.handleMouseEvents};\n      pos = clipPos(this, pos);\n      return markText(this, pos, pos, realOpts, \"bookmark\")\n    },\n    findMarksAt: function(pos) {\n      pos = clipPos(this, pos);\n      var markers = [], spans = getLine(this, pos.line).markedSpans;\n      if (spans) { for (var i = 0; i < spans.length; ++i) {\n        var span = spans[i];\n        if ((span.from == null || span.from <= pos.ch) &&\n            (span.to == null || span.to >= pos.ch))\n          { markers.push(span.marker.parent || span.marker); }\n      } }\n      return markers\n    },\n    findMarks: function(from, to, filter) {\n      from = clipPos(this, from); to = clipPos(this, to);\n      var found = [], lineNo$$1 = from.line;\n      this.iter(from.line, to.line + 1, function (line) {\n        var spans = line.markedSpans;\n        if (spans) { for (var i = 0; i < spans.length; i++) {\n          var span = spans[i];\n          if (!(span.to != null && lineNo$$1 == from.line && from.ch >= span.to ||\n                span.from == null && lineNo$$1 != from.line ||\n                span.from != null && lineNo$$1 == to.line && span.from >= to.ch) &&\n              (!filter || filter(span.marker)))\n            { found.push(span.marker.parent || span.marker); }\n        } }\n        ++lineNo$$1;\n      });\n      return found\n    },\n    getAllMarks: function() {\n      var markers = [];\n      this.iter(function (line) {\n        var sps = line.markedSpans;\n        if (sps) { for (var i = 0; i < sps.length; ++i)\n          { if (sps[i].from != null) { markers.push(sps[i].marker); } } }\n      });\n      return markers\n    },\n\n    posFromIndex: function(off) {\n      var ch, lineNo$$1 = this.first, sepSize = this.lineSeparator().length;\n      this.iter(function (line) {\n        var sz = line.text.length + sepSize;\n        if (sz > off) { ch = off; return true }\n        off -= sz;\n        ++lineNo$$1;\n      });\n      return clipPos(this, Pos(lineNo$$1, ch))\n    },\n    indexFromPos: function (coords) {\n      coords = clipPos(this, coords);\n      var index = coords.ch;\n      if (coords.line < this.first || coords.ch < 0) { return 0 }\n      var sepSize = this.lineSeparator().length;\n      this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value\n        index += line.text.length + sepSize;\n      });\n      return index\n    },\n\n    copy: function(copyHistory) {\n      var doc = new Doc(getLines(this, this.first, this.first + this.size),\n                        this.modeOption, this.first, this.lineSep, this.direction);\n      doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;\n      doc.sel = this.sel;\n      doc.extend = false;\n      if (copyHistory) {\n        doc.history.undoDepth = this.history.undoDepth;\n        doc.setHistory(this.getHistory());\n      }\n      return doc\n    },\n\n    linkedDoc: function(options) {\n      if (!options) { options = {}; }\n      var from = this.first, to = this.first + this.size;\n      if (options.from != null && options.from > from) { from = options.from; }\n      if (options.to != null && options.to < to) { to = options.to; }\n      var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction);\n      if (options.sharedHist) { copy.history = this.history\n      ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});\n      copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];\n      copySharedMarkers(copy, findSharedMarkers(this));\n      return copy\n    },\n    unlinkDoc: function(other) {\n      var this$1 = this;\n\n      if (other instanceof CodeMirror) { other = other.doc; }\n      if (this.linked) { for (var i = 0; i < this.linked.length; ++i) {\n        var link = this$1.linked[i];\n        if (link.doc != other) { continue }\n        this$1.linked.splice(i, 1);\n        other.unlinkDoc(this$1);\n        detachSharedMarkers(findSharedMarkers(this$1));\n        break\n      } }\n      // If the histories were shared, split them again\n      if (other.history == this.history) {\n        var splitIds = [other.id];\n        linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true);\n        other.history = new History(null);\n        other.history.done = copyHistoryArray(this.history.done, splitIds);\n        other.history.undone = copyHistoryArray(this.history.undone, splitIds);\n      }\n    },\n    iterLinkedDocs: function(f) {linkedDocs(this, f);},\n\n    getMode: function() {return this.mode},\n    getEditor: function() {return this.cm},\n\n    splitLines: function(str) {\n      if (this.lineSep) { return str.split(this.lineSep) }\n      return splitLinesAuto(str)\n    },\n    lineSeparator: function() { return this.lineSep || \"\\n\" },\n\n    setDirection: docMethodOp(function (dir) {\n      if (dir != \"rtl\") { dir = \"ltr\"; }\n      if (dir == this.direction) { return }\n      this.direction = dir;\n      this.iter(function (line) { return line.order = null; });\n      if (this.cm) { directionChanged(this.cm); }\n    })\n  });\n\n  // Public alias.\n  Doc.prototype.eachLine = Doc.prototype.iter;\n\n  // Kludge to work around strange IE behavior where it'll sometimes\n  // re-fire a series of drag-related events right after the drop (#1551)\n  var lastDrop = 0;\n\n  function onDrop(e) {\n    var cm = this;\n    clearDragCursor(cm);\n    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))\n      { return }\n    e_preventDefault(e);\n    if (ie) { lastDrop = +new Date; }\n    var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;\n    if (!pos || cm.isReadOnly()) { return }\n    // Might be a file drop, in which case we simply extract the text\n    // and insert it.\n    if (files && files.length && window.FileReader && window.File) {\n      var n = files.length, text = Array(n), read = 0;\n      var loadFile = function (file, i) {\n        if (cm.options.allowDropFileTypes &&\n            indexOf(cm.options.allowDropFileTypes, file.type) == -1)\n          { return }\n\n        var reader = new FileReader;\n        reader.onload = operation(cm, function () {\n          var content = reader.result;\n          if (/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(content)) { content = \"\"; }\n          text[i] = content;\n          if (++read == n) {\n            pos = clipPos(cm.doc, pos);\n            var change = {from: pos, to: pos,\n                          text: cm.doc.splitLines(text.join(cm.doc.lineSeparator())),\n                          origin: \"paste\"};\n            makeChange(cm.doc, change);\n            setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change)));\n          }\n        });\n        reader.readAsText(file);\n      };\n      for (var i = 0; i < n; ++i) { loadFile(files[i], i); }\n    } else { // Normal drop\n      // Don't do a replace if the drop happened inside of the selected text.\n      if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {\n        cm.state.draggingText(e);\n        // Ensure the editor is re-focused\n        setTimeout(function () { return cm.display.input.focus(); }, 20);\n        return\n      }\n      try {\n        var text$1 = e.dataTransfer.getData(\"Text\");\n        if (text$1) {\n          var selected;\n          if (cm.state.draggingText && !cm.state.draggingText.copy)\n            { selected = cm.listSelections(); }\n          setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));\n          if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1)\n            { replaceRange(cm.doc, \"\", selected[i$1].anchor, selected[i$1].head, \"drag\"); } }\n          cm.replaceSelection(text$1, \"around\", \"paste\");\n          cm.display.input.focus();\n        }\n      }\n      catch(e){}\n    }\n  }\n\n  function onDragStart(cm, e) {\n    if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return }\n    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return }\n\n    e.dataTransfer.setData(\"Text\", cm.getSelection());\n    e.dataTransfer.effectAllowed = \"copyMove\";\n\n    // Use dummy image instead of default browsers image.\n    // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.\n    if (e.dataTransfer.setDragImage && !safari) {\n      var img = elt(\"img\", null, null, \"position: fixed; left: 0; top: 0;\");\n      img.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n      if (presto) {\n        img.width = img.height = 1;\n        cm.display.wrapper.appendChild(img);\n        // Force a relayout, or Opera won't use our image for some obscure reason\n        img._top = img.offsetTop;\n      }\n      e.dataTransfer.setDragImage(img, 0, 0);\n      if (presto) { img.parentNode.removeChild(img); }\n    }\n  }\n\n  function onDragOver(cm, e) {\n    var pos = posFromMouse(cm, e);\n    if (!pos) { return }\n    var frag = document.createDocumentFragment();\n    drawSelectionCursor(cm, pos, frag);\n    if (!cm.display.dragCursor) {\n      cm.display.dragCursor = elt(\"div\", null, \"CodeMirror-cursors CodeMirror-dragcursors\");\n      cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv);\n    }\n    removeChildrenAndAdd(cm.display.dragCursor, frag);\n  }\n\n  function clearDragCursor(cm) {\n    if (cm.display.dragCursor) {\n      cm.display.lineSpace.removeChild(cm.display.dragCursor);\n      cm.display.dragCursor = null;\n    }\n  }\n\n  // These must be handled carefully, because naively registering a\n  // handler for each editor will cause the editors to never be\n  // garbage collected.\n\n  function forEachCodeMirror(f) {\n    if (!document.getElementsByClassName) { return }\n    var byClass = document.getElementsByClassName(\"CodeMirror\");\n    for (var i = 0; i < byClass.length; i++) {\n      var cm = byClass[i].CodeMirror;\n      if (cm) { f(cm); }\n    }\n  }\n\n  var globalsRegistered = false;\n  function ensureGlobalHandlers() {\n    if (globalsRegistered) { return }\n    registerGlobalHandlers();\n    globalsRegistered = true;\n  }\n  function registerGlobalHandlers() {\n    // When the window resizes, we need to refresh active editors.\n    var resizeTimer;\n    on(window, \"resize\", function () {\n      if (resizeTimer == null) { resizeTimer = setTimeout(function () {\n        resizeTimer = null;\n        forEachCodeMirror(onResize);\n      }, 100); }\n    });\n    // When the window loses focus, we want to show the editor as blurred\n    on(window, \"blur\", function () { return forEachCodeMirror(onBlur); });\n  }\n  // Called when the window resizes\n  function onResize(cm) {\n    var d = cm.display;\n    // Might be a text scaling operation, clear size caches.\n    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n    d.scrollbarsClipped = false;\n    cm.setSize();\n  }\n\n  var keyNames = {\n    3: \"Pause\", 8: \"Backspace\", 9: \"Tab\", 13: \"Enter\", 16: \"Shift\", 17: \"Ctrl\", 18: \"Alt\",\n    19: \"Pause\", 20: \"CapsLock\", 27: \"Esc\", 32: \"Space\", 33: \"PageUp\", 34: \"PageDown\", 35: \"End\",\n    36: \"Home\", 37: \"Left\", 38: \"Up\", 39: \"Right\", 40: \"Down\", 44: \"PrintScrn\", 45: \"Insert\",\n    46: \"Delete\", 59: \";\", 61: \"=\", 91: \"Mod\", 92: \"Mod\", 93: \"Mod\",\n    106: \"*\", 107: \"=\", 109: \"-\", 110: \".\", 111: \"/\", 127: \"Delete\", 145: \"ScrollLock\",\n    173: \"-\", 186: \";\", 187: \"=\", 188: \",\", 189: \"-\", 190: \".\", 191: \"/\", 192: \"`\", 219: \"[\", 220: \"\\\\\",\n    221: \"]\", 222: \"'\", 63232: \"Up\", 63233: \"Down\", 63234: \"Left\", 63235: \"Right\", 63272: \"Delete\",\n    63273: \"Home\", 63275: \"End\", 63276: \"PageUp\", 63277: \"PageDown\", 63302: \"Insert\"\n  };\n\n  // Number keys\n  for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); }\n  // Alphabetic keys\n  for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); }\n  // Function keys\n  for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = \"F\" + i$2; }\n\n  var keyMap = {};\n\n  keyMap.basic = {\n    \"Left\": \"goCharLeft\", \"Right\": \"goCharRight\", \"Up\": \"goLineUp\", \"Down\": \"goLineDown\",\n    \"End\": \"goLineEnd\", \"Home\": \"goLineStartSmart\", \"PageUp\": \"goPageUp\", \"PageDown\": \"goPageDown\",\n    \"Delete\": \"delCharAfter\", \"Backspace\": \"delCharBefore\", \"Shift-Backspace\": \"delCharBefore\",\n    \"Tab\": \"defaultTab\", \"Shift-Tab\": \"indentAuto\",\n    \"Enter\": \"newlineAndIndent\", \"Insert\": \"toggleOverwrite\",\n    \"Esc\": \"singleSelection\"\n  };\n  // Note that the save and find-related commands aren't defined by\n  // default. User code or addons can define them. Unknown commands\n  // are simply ignored.\n  keyMap.pcDefault = {\n    \"Ctrl-A\": \"selectAll\", \"Ctrl-D\": \"deleteLine\", \"Ctrl-Z\": \"undo\", \"Shift-Ctrl-Z\": \"redo\", \"Ctrl-Y\": \"redo\",\n    \"Ctrl-Home\": \"goDocStart\", \"Ctrl-End\": \"goDocEnd\", \"Ctrl-Up\": \"goLineUp\", \"Ctrl-Down\": \"goLineDown\",\n    \"Ctrl-Left\": \"goGroupLeft\", \"Ctrl-Right\": \"goGroupRight\", \"Alt-Left\": \"goLineStart\", \"Alt-Right\": \"goLineEnd\",\n    \"Ctrl-Backspace\": \"delGroupBefore\", \"Ctrl-Delete\": \"delGroupAfter\", \"Ctrl-S\": \"save\", \"Ctrl-F\": \"find\",\n    \"Ctrl-G\": \"findNext\", \"Shift-Ctrl-G\": \"findPrev\", \"Shift-Ctrl-F\": \"replace\", \"Shift-Ctrl-R\": \"replaceAll\",\n    \"Ctrl-[\": \"indentLess\", \"Ctrl-]\": \"indentMore\",\n    \"Ctrl-U\": \"undoSelection\", \"Shift-Ctrl-U\": \"redoSelection\", \"Alt-U\": \"redoSelection\",\n    \"fallthrough\": \"basic\"\n  };\n  // Very basic readline/emacs-style bindings, which are standard on Mac.\n  keyMap.emacsy = {\n    \"Ctrl-F\": \"goCharRight\", \"Ctrl-B\": \"goCharLeft\", \"Ctrl-P\": \"goLineUp\", \"Ctrl-N\": \"goLineDown\",\n    \"Alt-F\": \"goWordRight\", \"Alt-B\": \"goWordLeft\", \"Ctrl-A\": \"goLineStart\", \"Ctrl-E\": \"goLineEnd\",\n    \"Ctrl-V\": \"goPageDown\", \"Shift-Ctrl-V\": \"goPageUp\", \"Ctrl-D\": \"delCharAfter\", \"Ctrl-H\": \"delCharBefore\",\n    \"Alt-D\": \"delWordAfter\", \"Alt-Backspace\": \"delWordBefore\", \"Ctrl-K\": \"killLine\", \"Ctrl-T\": \"transposeChars\",\n    \"Ctrl-O\": \"openLine\"\n  };\n  keyMap.macDefault = {\n    \"Cmd-A\": \"selectAll\", \"Cmd-D\": \"deleteLine\", \"Cmd-Z\": \"undo\", \"Shift-Cmd-Z\": \"redo\", \"Cmd-Y\": \"redo\",\n    \"Cmd-Home\": \"goDocStart\", \"Cmd-Up\": \"goDocStart\", \"Cmd-End\": \"goDocEnd\", \"Cmd-Down\": \"goDocEnd\", \"Alt-Left\": \"goGroupLeft\",\n    \"Alt-Right\": \"goGroupRight\", \"Cmd-Left\": \"goLineLeft\", \"Cmd-Right\": \"goLineRight\", \"Alt-Backspace\": \"delGroupBefore\",\n    \"Ctrl-Alt-Backspace\": \"delGroupAfter\", \"Alt-Delete\": \"delGroupAfter\", \"Cmd-S\": \"save\", \"Cmd-F\": \"find\",\n    \"Cmd-G\": \"findNext\", \"Shift-Cmd-G\": \"findPrev\", \"Cmd-Alt-F\": \"replace\", \"Shift-Cmd-Alt-F\": \"replaceAll\",\n    \"Cmd-[\": \"indentLess\", \"Cmd-]\": \"indentMore\", \"Cmd-Backspace\": \"delWrappedLineLeft\", \"Cmd-Delete\": \"delWrappedLineRight\",\n    \"Cmd-U\": \"undoSelection\", \"Shift-Cmd-U\": \"redoSelection\", \"Ctrl-Up\": \"goDocStart\", \"Ctrl-Down\": \"goDocEnd\",\n    \"fallthrough\": [\"basic\", \"emacsy\"]\n  };\n  keyMap[\"default\"] = mac ? keyMap.macDefault : keyMap.pcDefault;\n\n  // KEYMAP DISPATCH\n\n  function normalizeKeyName(name) {\n    var parts = name.split(/-(?!$)/);\n    name = parts[parts.length - 1];\n    var alt, ctrl, shift, cmd;\n    for (var i = 0; i < parts.length - 1; i++) {\n      var mod = parts[i];\n      if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; }\n      else if (/^a(lt)?$/i.test(mod)) { alt = true; }\n      else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; }\n      else if (/^s(hift)?$/i.test(mod)) { shift = true; }\n      else { throw new Error(\"Unrecognized modifier name: \" + mod) }\n    }\n    if (alt) { name = \"Alt-\" + name; }\n    if (ctrl) { name = \"Ctrl-\" + name; }\n    if (cmd) { name = \"Cmd-\" + name; }\n    if (shift) { name = \"Shift-\" + name; }\n    return name\n  }\n\n  // This is a kludge to keep keymaps mostly working as raw objects\n  // (backwards compatibility) while at the same time support features\n  // like normalization and multi-stroke key bindings. It compiles a\n  // new normalized keymap, and then updates the old object to reflect\n  // this.\n  function normalizeKeyMap(keymap) {\n    var copy = {};\n    for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) {\n      var value = keymap[keyname];\n      if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue }\n      if (value == \"...\") { delete keymap[keyname]; continue }\n\n      var keys = map(keyname.split(\" \"), normalizeKeyName);\n      for (var i = 0; i < keys.length; i++) {\n        var val = (void 0), name = (void 0);\n        if (i == keys.length - 1) {\n          name = keys.join(\" \");\n          val = value;\n        } else {\n          name = keys.slice(0, i + 1).join(\" \");\n          val = \"...\";\n        }\n        var prev = copy[name];\n        if (!prev) { copy[name] = val; }\n        else if (prev != val) { throw new Error(\"Inconsistent bindings for \" + name) }\n      }\n      delete keymap[keyname];\n    } }\n    for (var prop in copy) { keymap[prop] = copy[prop]; }\n    return keymap\n  }\n\n  function lookupKey(key, map$$1, handle, context) {\n    map$$1 = getKeyMap(map$$1);\n    var found = map$$1.call ? map$$1.call(key, context) : map$$1[key];\n    if (found === false) { return \"nothing\" }\n    if (found === \"...\") { return \"multi\" }\n    if (found != null && handle(found)) { return \"handled\" }\n\n    if (map$$1.fallthrough) {\n      if (Object.prototype.toString.call(map$$1.fallthrough) != \"[object Array]\")\n        { return lookupKey(key, map$$1.fallthrough, handle, context) }\n      for (var i = 0; i < map$$1.fallthrough.length; i++) {\n        var result = lookupKey(key, map$$1.fallthrough[i], handle, context);\n        if (result) { return result }\n      }\n    }\n  }\n\n  // Modifier key presses don't count as 'real' key presses for the\n  // purpose of keymap fallthrough.\n  function isModifierKey(value) {\n    var name = typeof value == \"string\" ? value : keyNames[value.keyCode];\n    return name == \"Ctrl\" || name == \"Alt\" || name == \"Shift\" || name == \"Mod\"\n  }\n\n  function addModifierNames(name, event, noShift) {\n    var base = name;\n    if (event.altKey && base != \"Alt\") { name = \"Alt-\" + name; }\n    if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != \"Ctrl\") { name = \"Ctrl-\" + name; }\n    if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != \"Cmd\") { name = \"Cmd-\" + name; }\n    if (!noShift && event.shiftKey && base != \"Shift\") { name = \"Shift-\" + name; }\n    return name\n  }\n\n  // Look up the name of a key as indicated by an event object.\n  function keyName(event, noShift) {\n    if (presto && event.keyCode == 34 && event[\"char\"]) { return false }\n    var name = keyNames[event.keyCode];\n    if (name == null || event.altGraphKey) { return false }\n    // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause,\n    // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+)\n    if (event.keyCode == 3 && event.code) { name = event.code; }\n    return addModifierNames(name, event, noShift)\n  }\n\n  function getKeyMap(val) {\n    return typeof val == \"string\" ? keyMap[val] : val\n  }\n\n  // Helper for deleting text near the selection(s), used to implement\n  // backspace, delete, and similar functionality.\n  function deleteNearSelection(cm, compute) {\n    var ranges = cm.doc.sel.ranges, kill = [];\n    // Build up a set of ranges to kill first, merging overlapping\n    // ranges.\n    for (var i = 0; i < ranges.length; i++) {\n      var toKill = compute(ranges[i]);\n      while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {\n        var replaced = kill.pop();\n        if (cmp(replaced.from, toKill.from) < 0) {\n          toKill.from = replaced.from;\n          break\n        }\n      }\n      kill.push(toKill);\n    }\n    // Next, remove those actual ranges.\n    runInOp(cm, function () {\n      for (var i = kill.length - 1; i >= 0; i--)\n        { replaceRange(cm.doc, \"\", kill[i].from, kill[i].to, \"+delete\"); }\n      ensureCursorVisible(cm);\n    });\n  }\n\n  function moveCharLogically(line, ch, dir) {\n    var target = skipExtendingChars(line.text, ch + dir, dir);\n    return target < 0 || target > line.text.length ? null : target\n  }\n\n  function moveLogically(line, start, dir) {\n    var ch = moveCharLogically(line, start.ch, dir);\n    return ch == null ? null : new Pos(start.line, ch, dir < 0 ? \"after\" : \"before\")\n  }\n\n  function endOfLine(visually, cm, lineObj, lineNo, dir) {\n    if (visually) {\n      var order = getOrder(lineObj, cm.doc.direction);\n      if (order) {\n        var part = dir < 0 ? lst(order) : order[0];\n        var moveInStorageOrder = (dir < 0) == (part.level == 1);\n        var sticky = moveInStorageOrder ? \"after\" : \"before\";\n        var ch;\n        // With a wrapped rtl chunk (possibly spanning multiple bidi parts),\n        // it could be that the last bidi part is not on the last visual line,\n        // since visual lines contain content order-consecutive chunks.\n        // Thus, in rtl, we are looking for the first (content-order) character\n        // in the rtl chunk that is on the last line (that is, the same line\n        // as the last (content-order) character).\n        if (part.level > 0 || cm.doc.direction == \"rtl\") {\n          var prep = prepareMeasureForLine(cm, lineObj);\n          ch = dir < 0 ? lineObj.text.length - 1 : 0;\n          var targetTop = measureCharPrepared(cm, prep, ch).top;\n          ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch);\n          if (sticky == \"before\") { ch = moveCharLogically(lineObj, ch, 1); }\n        } else { ch = dir < 0 ? part.to : part.from; }\n        return new Pos(lineNo, ch, sticky)\n      }\n    }\n    return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? \"before\" : \"after\")\n  }\n\n  function moveVisually(cm, line, start, dir) {\n    var bidi = getOrder(line, cm.doc.direction);\n    if (!bidi) { return moveLogically(line, start, dir) }\n    if (start.ch >= line.text.length) {\n      start.ch = line.text.length;\n      start.sticky = \"before\";\n    } else if (start.ch <= 0) {\n      start.ch = 0;\n      start.sticky = \"after\";\n    }\n    var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos];\n    if (cm.doc.direction == \"ltr\" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) {\n      // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines,\n      // nothing interesting happens.\n      return moveLogically(line, start, dir)\n    }\n\n    var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); };\n    var prep;\n    var getWrappedLineExtent = function (ch) {\n      if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} }\n      prep = prep || prepareMeasureForLine(cm, line);\n      return wrappedLineExtentChar(cm, line, prep, ch)\n    };\n    var wrappedLineExtent = getWrappedLineExtent(start.sticky == \"before\" ? mv(start, -1) : start.ch);\n\n    if (cm.doc.direction == \"rtl\" || part.level == 1) {\n      var moveInStorageOrder = (part.level == 1) == (dir < 0);\n      var ch = mv(start, moveInStorageOrder ? 1 : -1);\n      if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) {\n        // Case 2: We move within an rtl part or in an rtl editor on the same visual line\n        var sticky = moveInStorageOrder ? \"before\" : \"after\";\n        return new Pos(start.line, ch, sticky)\n      }\n    }\n\n    // Case 3: Could not move within this bidi part in this visual line, so leave\n    // the current bidi part\n\n    var searchInVisualLine = function (partPos, dir, wrappedLineExtent) {\n      var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder\n        ? new Pos(start.line, mv(ch, 1), \"before\")\n        : new Pos(start.line, ch, \"after\"); };\n\n      for (; partPos >= 0 && partPos < bidi.length; partPos += dir) {\n        var part = bidi[partPos];\n        var moveInStorageOrder = (dir > 0) == (part.level != 1);\n        var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1);\n        if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) }\n        ch = moveInStorageOrder ? part.from : mv(part.to, -1);\n        if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) }\n      }\n    };\n\n    // Case 3a: Look for other bidi parts on the same visual line\n    var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent);\n    if (res) { return res }\n\n    // Case 3b: Look for other bidi parts on the next visual line\n    var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1);\n    if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) {\n      res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh));\n      if (res) { return res }\n    }\n\n    // Case 4: Nowhere to move\n    return null\n  }\n\n  // Commands are parameter-less actions that can be performed on an\n  // editor, mostly used for keybindings.\n  var commands = {\n    selectAll: selectAll,\n    singleSelection: function (cm) { return cm.setSelection(cm.getCursor(\"anchor\"), cm.getCursor(\"head\"), sel_dontScroll); },\n    killLine: function (cm) { return deleteNearSelection(cm, function (range) {\n      if (range.empty()) {\n        var len = getLine(cm.doc, range.head.line).text.length;\n        if (range.head.ch == len && range.head.line < cm.lastLine())\n          { return {from: range.head, to: Pos(range.head.line + 1, 0)} }\n        else\n          { return {from: range.head, to: Pos(range.head.line, len)} }\n      } else {\n        return {from: range.from(), to: range.to()}\n      }\n    }); },\n    deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({\n      from: Pos(range.from().line, 0),\n      to: clipPos(cm.doc, Pos(range.to().line + 1, 0))\n    }); }); },\n    delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({\n      from: Pos(range.from().line, 0), to: range.from()\n    }); }); },\n    delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) {\n      var top = cm.charCoords(range.head, \"div\").top + 5;\n      var leftPos = cm.coordsChar({left: 0, top: top}, \"div\");\n      return {from: leftPos, to: range.from()}\n    }); },\n    delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) {\n      var top = cm.charCoords(range.head, \"div\").top + 5;\n      var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\");\n      return {from: range.from(), to: rightPos }\n    }); },\n    undo: function (cm) { return cm.undo(); },\n    redo: function (cm) { return cm.redo(); },\n    undoSelection: function (cm) { return cm.undoSelection(); },\n    redoSelection: function (cm) { return cm.redoSelection(); },\n    goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); },\n    goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); },\n    goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); },\n      {origin: \"+move\", bias: 1}\n    ); },\n    goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); },\n      {origin: \"+move\", bias: 1}\n    ); },\n    goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); },\n      {origin: \"+move\", bias: -1}\n    ); },\n    goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) {\n      var top = cm.cursorCoords(range.head, \"div\").top + 5;\n      return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\")\n    }, sel_move); },\n    goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) {\n      var top = cm.cursorCoords(range.head, \"div\").top + 5;\n      return cm.coordsChar({left: 0, top: top}, \"div\")\n    }, sel_move); },\n    goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) {\n      var top = cm.cursorCoords(range.head, \"div\").top + 5;\n      var pos = cm.coordsChar({left: 0, top: top}, \"div\");\n      if (pos.ch < cm.getLine(pos.line).search(/\\S/)) { return lineStartSmart(cm, range.head) }\n      return pos\n    }, sel_move); },\n    goLineUp: function (cm) { return cm.moveV(-1, \"line\"); },\n    goLineDown: function (cm) { return cm.moveV(1, \"line\"); },\n    goPageUp: function (cm) { return cm.moveV(-1, \"page\"); },\n    goPageDown: function (cm) { return cm.moveV(1, \"page\"); },\n    goCharLeft: function (cm) { return cm.moveH(-1, \"char\"); },\n    goCharRight: function (cm) { return cm.moveH(1, \"char\"); },\n    goColumnLeft: function (cm) { return cm.moveH(-1, \"column\"); },\n    goColumnRight: function (cm) { return cm.moveH(1, \"column\"); },\n    goWordLeft: function (cm) { return cm.moveH(-1, \"word\"); },\n    goGroupRight: function (cm) { return cm.moveH(1, \"group\"); },\n    goGroupLeft: function (cm) { return cm.moveH(-1, \"group\"); },\n    goWordRight: function (cm) { return cm.moveH(1, \"word\"); },\n    delCharBefore: function (cm) { return cm.deleteH(-1, \"char\"); },\n    delCharAfter: function (cm) { return cm.deleteH(1, \"char\"); },\n    delWordBefore: function (cm) { return cm.deleteH(-1, \"word\"); },\n    delWordAfter: function (cm) { return cm.deleteH(1, \"word\"); },\n    delGroupBefore: function (cm) { return cm.deleteH(-1, \"group\"); },\n    delGroupAfter: function (cm) { return cm.deleteH(1, \"group\"); },\n    indentAuto: function (cm) { return cm.indentSelection(\"smart\"); },\n    indentMore: function (cm) { return cm.indentSelection(\"add\"); },\n    indentLess: function (cm) { return cm.indentSelection(\"subtract\"); },\n    insertTab: function (cm) { return cm.replaceSelection(\"\\t\"); },\n    insertSoftTab: function (cm) {\n      var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;\n      for (var i = 0; i < ranges.length; i++) {\n        var pos = ranges[i].from();\n        var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);\n        spaces.push(spaceStr(tabSize - col % tabSize));\n      }\n      cm.replaceSelections(spaces);\n    },\n    defaultTab: function (cm) {\n      if (cm.somethingSelected()) { cm.indentSelection(\"add\"); }\n      else { cm.execCommand(\"insertTab\"); }\n    },\n    // Swap the two chars left and right of each selection's head.\n    // Move cursor behind the two swapped characters afterwards.\n    //\n    // Doesn't consider line feeds a character.\n    // Doesn't scan more than one line above to find a character.\n    // Doesn't do anything on an empty line.\n    // Doesn't do anything with non-empty selections.\n    transposeChars: function (cm) { return runInOp(cm, function () {\n      var ranges = cm.listSelections(), newSel = [];\n      for (var i = 0; i < ranges.length; i++) {\n        if (!ranges[i].empty()) { continue }\n        var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;\n        if (line) {\n          if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); }\n          if (cur.ch > 0) {\n            cur = new Pos(cur.line, cur.ch + 1);\n            cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),\n                            Pos(cur.line, cur.ch - 2), cur, \"+transpose\");\n          } else if (cur.line > cm.doc.first) {\n            var prev = getLine(cm.doc, cur.line - 1).text;\n            if (prev) {\n              cur = new Pos(cur.line, 1);\n              cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +\n                              prev.charAt(prev.length - 1),\n                              Pos(cur.line - 1, prev.length - 1), cur, \"+transpose\");\n            }\n          }\n        }\n        newSel.push(new Range(cur, cur));\n      }\n      cm.setSelections(newSel);\n    }); },\n    newlineAndIndent: function (cm) { return runInOp(cm, function () {\n      var sels = cm.listSelections();\n      for (var i = sels.length - 1; i >= 0; i--)\n        { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, \"+input\"); }\n      sels = cm.listSelections();\n      for (var i$1 = 0; i$1 < sels.length; i$1++)\n        { cm.indentLine(sels[i$1].from().line, null, true); }\n      ensureCursorVisible(cm);\n    }); },\n    openLine: function (cm) { return cm.replaceSelection(\"\\n\", \"start\"); },\n    toggleOverwrite: function (cm) { return cm.toggleOverwrite(); }\n  };\n\n\n  function lineStart(cm, lineN) {\n    var line = getLine(cm.doc, lineN);\n    var visual = visualLine(line);\n    if (visual != line) { lineN = lineNo(visual); }\n    return endOfLine(true, cm, visual, lineN, 1)\n  }\n  function lineEnd(cm, lineN) {\n    var line = getLine(cm.doc, lineN);\n    var visual = visualLineEnd(line);\n    if (visual != line) { lineN = lineNo(visual); }\n    return endOfLine(true, cm, line, lineN, -1)\n  }\n  function lineStartSmart(cm, pos) {\n    var start = lineStart(cm, pos.line);\n    var line = getLine(cm.doc, start.line);\n    var order = getOrder(line, cm.doc.direction);\n    if (!order || order[0].level == 0) {\n      var firstNonWS = Math.max(0, line.text.search(/\\S/));\n      var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;\n      return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky)\n    }\n    return start\n  }\n\n  // Run a handler that was bound to a key.\n  function doHandleBinding(cm, bound, dropShift) {\n    if (typeof bound == \"string\") {\n      bound = commands[bound];\n      if (!bound) { return false }\n    }\n    // Ensure previous input has been read, so that the handler sees a\n    // consistent view of the document\n    cm.display.input.ensurePolled();\n    var prevShift = cm.display.shift, done = false;\n    try {\n      if (cm.isReadOnly()) { cm.state.suppressEdits = true; }\n      if (dropShift) { cm.display.shift = false; }\n      done = bound(cm) != Pass;\n    } finally {\n      cm.display.shift = prevShift;\n      cm.state.suppressEdits = false;\n    }\n    return done\n  }\n\n  function lookupKeyForEditor(cm, name, handle) {\n    for (var i = 0; i < cm.state.keyMaps.length; i++) {\n      var result = lookupKey(name, cm.state.keyMaps[i], handle, cm);\n      if (result) { return result }\n    }\n    return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))\n      || lookupKey(name, cm.options.keyMap, handle, cm)\n  }\n\n  // Note that, despite the name, this function is also used to check\n  // for bound mouse clicks.\n\n  var stopSeq = new Delayed;\n\n  function dispatchKey(cm, name, e, handle) {\n    var seq = cm.state.keySeq;\n    if (seq) {\n      if (isModifierKey(name)) { return \"handled\" }\n      if (/\\'$/.test(name))\n        { cm.state.keySeq = null; }\n      else\n        { stopSeq.set(50, function () {\n          if (cm.state.keySeq == seq) {\n            cm.state.keySeq = null;\n            cm.display.input.reset();\n          }\n        }); }\n      if (dispatchKeyInner(cm, seq + \" \" + name, e, handle)) { return true }\n    }\n    return dispatchKeyInner(cm, name, e, handle)\n  }\n\n  function dispatchKeyInner(cm, name, e, handle) {\n    var result = lookupKeyForEditor(cm, name, handle);\n\n    if (result == \"multi\")\n      { cm.state.keySeq = name; }\n    if (result == \"handled\")\n      { signalLater(cm, \"keyHandled\", cm, name, e); }\n\n    if (result == \"handled\" || result == \"multi\") {\n      e_preventDefault(e);\n      restartBlink(cm);\n    }\n\n    return !!result\n  }\n\n  // Handle a key from the keydown event.\n  function handleKeyBinding(cm, e) {\n    var name = keyName(e, true);\n    if (!name) { return false }\n\n    if (e.shiftKey && !cm.state.keySeq) {\n      // First try to resolve full name (including 'Shift-'). Failing\n      // that, see if there is a cursor-motion command (starting with\n      // 'go') bound to the keyname without 'Shift-'.\n      return dispatchKey(cm, \"Shift-\" + name, e, function (b) { return doHandleBinding(cm, b, true); })\n          || dispatchKey(cm, name, e, function (b) {\n               if (typeof b == \"string\" ? /^go[A-Z]/.test(b) : b.motion)\n                 { return doHandleBinding(cm, b) }\n             })\n    } else {\n      return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); })\n    }\n  }\n\n  // Handle a key from the keypress event\n  function handleCharBinding(cm, e, ch) {\n    return dispatchKey(cm, \"'\" + ch + \"'\", e, function (b) { return doHandleBinding(cm, b, true); })\n  }\n\n  var lastStoppedKey = null;\n  function onKeyDown(e) {\n    var cm = this;\n    cm.curOp.focus = activeElt();\n    if (signalDOMEvent(cm, e)) { return }\n    // IE does strange things with escape.\n    if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; }\n    var code = e.keyCode;\n    cm.display.shift = code == 16 || e.shiftKey;\n    var handled = handleKeyBinding(cm, e);\n    if (presto) {\n      lastStoppedKey = handled ? code : null;\n      // Opera has no cut event... we try to at least catch the key combo\n      if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))\n        { cm.replaceSelection(\"\", null, \"cut\"); }\n    }\n\n    // Turn mouse into crosshair when Alt is held on Mac.\n    if (code == 18 && !/\\bCodeMirror-crosshair\\b/.test(cm.display.lineDiv.className))\n      { showCrossHair(cm); }\n  }\n\n  function showCrossHair(cm) {\n    var lineDiv = cm.display.lineDiv;\n    addClass(lineDiv, \"CodeMirror-crosshair\");\n\n    function up(e) {\n      if (e.keyCode == 18 || !e.altKey) {\n        rmClass(lineDiv, \"CodeMirror-crosshair\");\n        off(document, \"keyup\", up);\n        off(document, \"mouseover\", up);\n      }\n    }\n    on(document, \"keyup\", up);\n    on(document, \"mouseover\", up);\n  }\n\n  function onKeyUp(e) {\n    if (e.keyCode == 16) { this.doc.sel.shift = false; }\n    signalDOMEvent(this, e);\n  }\n\n  function onKeyPress(e) {\n    var cm = this;\n    if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return }\n    var keyCode = e.keyCode, charCode = e.charCode;\n    if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return}\n    if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return }\n    var ch = String.fromCharCode(charCode == null ? keyCode : charCode);\n    // Some browsers fire keypress events for backspace\n    if (ch == \"\\x08\") { return }\n    if (handleCharBinding(cm, e, ch)) { return }\n    cm.display.input.onKeyPress(e);\n  }\n\n  var DOUBLECLICK_DELAY = 400;\n\n  var PastClick = function(time, pos, button) {\n    this.time = time;\n    this.pos = pos;\n    this.button = button;\n  };\n\n  PastClick.prototype.compare = function (time, pos, button) {\n    return this.time + DOUBLECLICK_DELAY > time &&\n      cmp(pos, this.pos) == 0 && button == this.button\n  };\n\n  var lastClick, lastDoubleClick;\n  function clickRepeat(pos, button) {\n    var now = +new Date;\n    if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) {\n      lastClick = lastDoubleClick = null;\n      return \"triple\"\n    } else if (lastClick && lastClick.compare(now, pos, button)) {\n      lastDoubleClick = new PastClick(now, pos, button);\n      lastClick = null;\n      return \"double\"\n    } else {\n      lastClick = new PastClick(now, pos, button);\n      lastDoubleClick = null;\n      return \"single\"\n    }\n  }\n\n  // A mouse down can be a single click, double click, triple click,\n  // start of selection drag, start of text drag, new cursor\n  // (ctrl-click), rectangle drag (alt-drag), or xwin\n  // middle-click-paste. Or it might be a click on something we should\n  // not interfere with, such as a scrollbar or widget.\n  function onMouseDown(e) {\n    var cm = this, display = cm.display;\n    if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return }\n    display.input.ensurePolled();\n    display.shift = e.shiftKey;\n\n    if (eventInWidget(display, e)) {\n      if (!webkit) {\n        // Briefly turn off draggability, to allow widgets to do\n        // normal dragging things.\n        display.scroller.draggable = false;\n        setTimeout(function () { return display.scroller.draggable = true; }, 100);\n      }\n      return\n    }\n    if (clickInGutter(cm, e)) { return }\n    var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : \"single\";\n    window.focus();\n\n    // #3261: make sure, that we're not starting a second selection\n    if (button == 1 && cm.state.selectingText)\n      { cm.state.selectingText(e); }\n\n    if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return }\n\n    if (button == 1) {\n      if (pos) { leftButtonDown(cm, pos, repeat, e); }\n      else if (e_target(e) == display.scroller) { e_preventDefault(e); }\n    } else if (button == 2) {\n      if (pos) { extendSelection(cm.doc, pos); }\n      setTimeout(function () { return display.input.focus(); }, 20);\n    } else if (button == 3) {\n      if (captureRightClick) { cm.display.input.onContextMenu(e); }\n      else { delayBlurEvent(cm); }\n    }\n  }\n\n  function handleMappedButton(cm, button, pos, repeat, event) {\n    var name = \"Click\";\n    if (repeat == \"double\") { name = \"Double\" + name; }\n    else if (repeat == \"triple\") { name = \"Triple\" + name; }\n    name = (button == 1 ? \"Left\" : button == 2 ? \"Middle\" : \"Right\") + name;\n\n    return dispatchKey(cm,  addModifierNames(name, event), event, function (bound) {\n      if (typeof bound == \"string\") { bound = commands[bound]; }\n      if (!bound) { return false }\n      var done = false;\n      try {\n        if (cm.isReadOnly()) { cm.state.suppressEdits = true; }\n        done = bound(cm, pos) != Pass;\n      } finally {\n        cm.state.suppressEdits = false;\n      }\n      return done\n    })\n  }\n\n  function configureMouse(cm, repeat, event) {\n    var option = cm.getOption(\"configureMouse\");\n    var value = option ? option(cm, repeat, event) : {};\n    if (value.unit == null) {\n      var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey;\n      value.unit = rect ? \"rectangle\" : repeat == \"single\" ? \"char\" : repeat == \"double\" ? \"word\" : \"line\";\n    }\n    if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; }\n    if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; }\n    if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); }\n    return value\n  }\n\n  function leftButtonDown(cm, pos, repeat, event) {\n    if (ie) { setTimeout(bind(ensureFocus, cm), 0); }\n    else { cm.curOp.focus = activeElt(); }\n\n    var behavior = configureMouse(cm, repeat, event);\n\n    var sel = cm.doc.sel, contained;\n    if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&\n        repeat == \"single\" && (contained = sel.contains(pos)) > -1 &&\n        (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) &&\n        (cmp(contained.to(), pos) > 0 || pos.xRel < 0))\n      { leftButtonStartDrag(cm, event, pos, behavior); }\n    else\n      { leftButtonSelect(cm, event, pos, behavior); }\n  }\n\n  // Start a text drag. When it ends, see if any dragging actually\n  // happen, and treat as a click if it didn't.\n  function leftButtonStartDrag(cm, event, pos, behavior) {\n    var display = cm.display, moved = false;\n    var dragEnd = operation(cm, function (e) {\n      if (webkit) { display.scroller.draggable = false; }\n      cm.state.draggingText = false;\n      off(display.wrapper.ownerDocument, \"mouseup\", dragEnd);\n      off(display.wrapper.ownerDocument, \"mousemove\", mouseMove);\n      off(display.scroller, \"dragstart\", dragStart);\n      off(display.scroller, \"drop\", dragEnd);\n      if (!moved) {\n        e_preventDefault(e);\n        if (!behavior.addNew)\n          { extendSelection(cm.doc, pos, null, null, behavior.extend); }\n        // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)\n        if (webkit || ie && ie_version == 9)\n          { setTimeout(function () {display.wrapper.ownerDocument.body.focus(); display.input.focus();}, 20); }\n        else\n          { display.input.focus(); }\n      }\n    });\n    var mouseMove = function(e2) {\n      moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10;\n    };\n    var dragStart = function () { return moved = true; };\n    // Let the drag handler handle this.\n    if (webkit) { display.scroller.draggable = true; }\n    cm.state.draggingText = dragEnd;\n    dragEnd.copy = !behavior.moveOnDrag;\n    // IE's approach to draggable\n    if (display.scroller.dragDrop) { display.scroller.dragDrop(); }\n    on(display.wrapper.ownerDocument, \"mouseup\", dragEnd);\n    on(display.wrapper.ownerDocument, \"mousemove\", mouseMove);\n    on(display.scroller, \"dragstart\", dragStart);\n    on(display.scroller, \"drop\", dragEnd);\n\n    delayBlurEvent(cm);\n    setTimeout(function () { return display.input.focus(); }, 20);\n  }\n\n  function rangeForUnit(cm, pos, unit) {\n    if (unit == \"char\") { return new Range(pos, pos) }\n    if (unit == \"word\") { return cm.findWordAt(pos) }\n    if (unit == \"line\") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) }\n    var result = unit(cm, pos);\n    return new Range(result.from, result.to)\n  }\n\n  // Normal selection, as opposed to text dragging.\n  function leftButtonSelect(cm, event, start, behavior) {\n    var display = cm.display, doc = cm.doc;\n    e_preventDefault(event);\n\n    var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;\n    if (behavior.addNew && !behavior.extend) {\n      ourIndex = doc.sel.contains(start);\n      if (ourIndex > -1)\n        { ourRange = ranges[ourIndex]; }\n      else\n        { ourRange = new Range(start, start); }\n    } else {\n      ourRange = doc.sel.primary();\n      ourIndex = doc.sel.primIndex;\n    }\n\n    if (behavior.unit == \"rectangle\") {\n      if (!behavior.addNew) { ourRange = new Range(start, start); }\n      start = posFromMouse(cm, event, true, true);\n      ourIndex = -1;\n    } else {\n      var range$$1 = rangeForUnit(cm, start, behavior.unit);\n      if (behavior.extend)\n        { ourRange = extendRange(ourRange, range$$1.anchor, range$$1.head, behavior.extend); }\n      else\n        { ourRange = range$$1; }\n    }\n\n    if (!behavior.addNew) {\n      ourIndex = 0;\n      setSelection(doc, new Selection([ourRange], 0), sel_mouse);\n      startSel = doc.sel;\n    } else if (ourIndex == -1) {\n      ourIndex = ranges.length;\n      setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex),\n                   {scroll: false, origin: \"*mouse\"});\n    } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == \"char\" && !behavior.extend) {\n      setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),\n                   {scroll: false, origin: \"*mouse\"});\n      startSel = doc.sel;\n    } else {\n      replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);\n    }\n\n    var lastPos = start;\n    function extendTo(pos) {\n      if (cmp(lastPos, pos) == 0) { return }\n      lastPos = pos;\n\n      if (behavior.unit == \"rectangle\") {\n        var ranges = [], tabSize = cm.options.tabSize;\n        var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);\n        var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);\n        var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);\n        for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));\n             line <= end; line++) {\n          var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);\n          if (left == right)\n            { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); }\n          else if (text.length > leftPos)\n            { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); }\n        }\n        if (!ranges.length) { ranges.push(new Range(start, start)); }\n        setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),\n                     {origin: \"*mouse\", scroll: false});\n        cm.scrollIntoView(pos);\n      } else {\n        var oldRange = ourRange;\n        var range$$1 = rangeForUnit(cm, pos, behavior.unit);\n        var anchor = oldRange.anchor, head;\n        if (cmp(range$$1.anchor, anchor) > 0) {\n          head = range$$1.head;\n          anchor = minPos(oldRange.from(), range$$1.anchor);\n        } else {\n          head = range$$1.anchor;\n          anchor = maxPos(oldRange.to(), range$$1.head);\n        }\n        var ranges$1 = startSel.ranges.slice(0);\n        ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head));\n        setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse);\n      }\n    }\n\n    var editorSize = display.wrapper.getBoundingClientRect();\n    // Used to ensure timeout re-tries don't fire when another extend\n    // happened in the meantime (clearTimeout isn't reliable -- at\n    // least on Chrome, the timeouts still happen even when cleared,\n    // if the clear happens after their scheduled firing time).\n    var counter = 0;\n\n    function extend(e) {\n      var curCount = ++counter;\n      var cur = posFromMouse(cm, e, true, behavior.unit == \"rectangle\");\n      if (!cur) { return }\n      if (cmp(cur, lastPos) != 0) {\n        cm.curOp.focus = activeElt();\n        extendTo(cur);\n        var visible = visibleLines(display, doc);\n        if (cur.line >= visible.to || cur.line < visible.from)\n          { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); }\n      } else {\n        var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;\n        if (outside) { setTimeout(operation(cm, function () {\n          if (counter != curCount) { return }\n          display.scroller.scrollTop += outside;\n          extend(e);\n        }), 50); }\n      }\n    }\n\n    function done(e) {\n      cm.state.selectingText = false;\n      counter = Infinity;\n      e_preventDefault(e);\n      display.input.focus();\n      off(display.wrapper.ownerDocument, \"mousemove\", move);\n      off(display.wrapper.ownerDocument, \"mouseup\", up);\n      doc.history.lastSelOrigin = null;\n    }\n\n    var move = operation(cm, function (e) {\n      if (e.buttons === 0 || !e_button(e)) { done(e); }\n      else { extend(e); }\n    });\n    var up = operation(cm, done);\n    cm.state.selectingText = up;\n    on(display.wrapper.ownerDocument, \"mousemove\", move);\n    on(display.wrapper.ownerDocument, \"mouseup\", up);\n  }\n\n  // Used when mouse-selecting to adjust the anchor to the proper side\n  // of a bidi jump depending on the visual position of the head.\n  function bidiSimplify(cm, range$$1) {\n    var anchor = range$$1.anchor;\n    var head = range$$1.head;\n    var anchorLine = getLine(cm.doc, anchor.line);\n    if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range$$1 }\n    var order = getOrder(anchorLine);\n    if (!order) { return range$$1 }\n    var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index];\n    if (part.from != anchor.ch && part.to != anchor.ch) { return range$$1 }\n    var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1);\n    if (boundary == 0 || boundary == order.length) { return range$$1 }\n\n    // Compute the relative visual position of the head compared to the\n    // anchor (<0 is to the left, >0 to the right)\n    var leftSide;\n    if (head.line != anchor.line) {\n      leftSide = (head.line - anchor.line) * (cm.doc.direction == \"ltr\" ? 1 : -1) > 0;\n    } else {\n      var headIndex = getBidiPartAt(order, head.ch, head.sticky);\n      var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1);\n      if (headIndex == boundary - 1 || headIndex == boundary)\n        { leftSide = dir < 0; }\n      else\n        { leftSide = dir > 0; }\n    }\n\n    var usePart = order[boundary + (leftSide ? -1 : 0)];\n    var from = leftSide == (usePart.level == 1);\n    var ch = from ? usePart.from : usePart.to, sticky = from ? \"after\" : \"before\";\n    return anchor.ch == ch && anchor.sticky == sticky ? range$$1 : new Range(new Pos(anchor.line, ch, sticky), head)\n  }\n\n\n  // Determines whether an event happened in the gutter, and fires the\n  // handlers for the corresponding event.\n  function gutterEvent(cm, e, type, prevent) {\n    var mX, mY;\n    if (e.touches) {\n      mX = e.touches[0].clientX;\n      mY = e.touches[0].clientY;\n    } else {\n      try { mX = e.clientX; mY = e.clientY; }\n      catch(e) { return false }\n    }\n    if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false }\n    if (prevent) { e_preventDefault(e); }\n\n    var display = cm.display;\n    var lineBox = display.lineDiv.getBoundingClientRect();\n\n    if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) }\n    mY -= lineBox.top - display.viewOffset;\n\n    for (var i = 0; i < cm.options.gutters.length; ++i) {\n      var g = display.gutters.childNodes[i];\n      if (g && g.getBoundingClientRect().right >= mX) {\n        var line = lineAtHeight(cm.doc, mY);\n        var gutter = cm.options.gutters[i];\n        signal(cm, type, cm, line, gutter, e);\n        return e_defaultPrevented(e)\n      }\n    }\n  }\n\n  function clickInGutter(cm, e) {\n    return gutterEvent(cm, e, \"gutterClick\", true)\n  }\n\n  // CONTEXT MENU HANDLING\n\n  // To make the context menu work, we need to briefly unhide the\n  // textarea (making it as unobtrusive as possible) to let the\n  // right-click take effect on it.\n  function onContextMenu(cm, e) {\n    if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return }\n    if (signalDOMEvent(cm, e, \"contextmenu\")) { return }\n    if (!captureRightClick) { cm.display.input.onContextMenu(e); }\n  }\n\n  function contextMenuInGutter(cm, e) {\n    if (!hasHandler(cm, \"gutterContextMenu\")) { return false }\n    return gutterEvent(cm, e, \"gutterContextMenu\", false)\n  }\n\n  function themeChanged(cm) {\n    cm.display.wrapper.className = cm.display.wrapper.className.replace(/\\s*cm-s-\\S+/g, \"\") +\n      cm.options.theme.replace(/(^|\\s)\\s*/g, \" cm-s-\");\n    clearCaches(cm);\n  }\n\n  var Init = {toString: function(){return \"CodeMirror.Init\"}};\n\n  var defaults = {};\n  var optionHandlers = {};\n\n  function defineOptions(CodeMirror) {\n    var optionHandlers = CodeMirror.optionHandlers;\n\n    function option(name, deflt, handle, notOnInit) {\n      CodeMirror.defaults[name] = deflt;\n      if (handle) { optionHandlers[name] =\n        notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; }\n    }\n\n    CodeMirror.defineOption = option;\n\n    // Passed to option handlers when there is no old value.\n    CodeMirror.Init = Init;\n\n    // These two are, on init, called from the constructor because they\n    // have to be initialized before the editor can start at all.\n    option(\"value\", \"\", function (cm, val) { return cm.setValue(val); }, true);\n    option(\"mode\", null, function (cm, val) {\n      cm.doc.modeOption = val;\n      loadMode(cm);\n    }, true);\n\n    option(\"indentUnit\", 2, loadMode, true);\n    option(\"indentWithTabs\", false);\n    option(\"smartIndent\", true);\n    option(\"tabSize\", 4, function (cm) {\n      resetModeState(cm);\n      clearCaches(cm);\n      regChange(cm);\n    }, true);\n\n    option(\"lineSeparator\", null, function (cm, val) {\n      cm.doc.lineSep = val;\n      if (!val) { return }\n      var newBreaks = [], lineNo = cm.doc.first;\n      cm.doc.iter(function (line) {\n        for (var pos = 0;;) {\n          var found = line.text.indexOf(val, pos);\n          if (found == -1) { break }\n          pos = found + val.length;\n          newBreaks.push(Pos(lineNo, found));\n        }\n        lineNo++;\n      });\n      for (var i = newBreaks.length - 1; i >= 0; i--)\n        { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); }\n    });\n    option(\"specialChars\", /[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u061c\\u200b-\\u200f\\u2028\\u2029\\ufeff]/g, function (cm, val, old) {\n      cm.state.specialChars = new RegExp(val.source + (val.test(\"\\t\") ? \"\" : \"|\\t\"), \"g\");\n      if (old != Init) { cm.refresh(); }\n    });\n    option(\"specialCharPlaceholder\", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true);\n    option(\"electricChars\", true);\n    option(\"inputStyle\", mobile ? \"contenteditable\" : \"textarea\", function () {\n      throw new Error(\"inputStyle can not (yet) be changed in a running editor\") // FIXME\n    }, true);\n    option(\"spellcheck\", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true);\n    option(\"rtlMoveVisually\", !windows);\n    option(\"wholeLineUpdateBefore\", true);\n\n    option(\"theme\", \"default\", function (cm) {\n      themeChanged(cm);\n      guttersChanged(cm);\n    }, true);\n    option(\"keyMap\", \"default\", function (cm, val, old) {\n      var next = getKeyMap(val);\n      var prev = old != Init && getKeyMap(old);\n      if (prev && prev.detach) { prev.detach(cm, next); }\n      if (next.attach) { next.attach(cm, prev || null); }\n    });\n    option(\"extraKeys\", null);\n    option(\"configureMouse\", null);\n\n    option(\"lineWrapping\", false, wrappingChanged, true);\n    option(\"gutters\", [], function (cm) {\n      setGuttersForLineNumbers(cm.options);\n      guttersChanged(cm);\n    }, true);\n    option(\"fixedGutter\", true, function (cm, val) {\n      cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + \"px\" : \"0\";\n      cm.refresh();\n    }, true);\n    option(\"coverGutterNextToScrollbar\", false, function (cm) { return updateScrollbars(cm); }, true);\n    option(\"scrollbarStyle\", \"native\", function (cm) {\n      initScrollbars(cm);\n      updateScrollbars(cm);\n      cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);\n      cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);\n    }, true);\n    option(\"lineNumbers\", false, function (cm) {\n      setGuttersForLineNumbers(cm.options);\n      guttersChanged(cm);\n    }, true);\n    option(\"firstLineNumber\", 1, guttersChanged, true);\n    option(\"lineNumberFormatter\", function (integer) { return integer; }, guttersChanged, true);\n    option(\"showCursorWhenSelecting\", false, updateSelection, true);\n\n    option(\"resetSelectionOnContextMenu\", true);\n    option(\"lineWiseCopyCut\", true);\n    option(\"pasteLinesPerSelection\", true);\n    option(\"selectionsMayTouch\", false);\n\n    option(\"readOnly\", false, function (cm, val) {\n      if (val == \"nocursor\") {\n        onBlur(cm);\n        cm.display.input.blur();\n      }\n      cm.display.input.readOnlyChanged(val);\n    });\n    option(\"disableInput\", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true);\n    option(\"dragDrop\", true, dragDropChanged);\n    option(\"allowDropFileTypes\", null);\n\n    option(\"cursorBlinkRate\", 530);\n    option(\"cursorScrollMargin\", 0);\n    option(\"cursorHeight\", 1, updateSelection, true);\n    option(\"singleCursorHeightPerLine\", true, updateSelection, true);\n    option(\"workTime\", 100);\n    option(\"workDelay\", 100);\n    option(\"flattenSpans\", true, resetModeState, true);\n    option(\"addModeClass\", false, resetModeState, true);\n    option(\"pollInterval\", 100);\n    option(\"undoDepth\", 200, function (cm, val) { return cm.doc.history.undoDepth = val; });\n    option(\"historyEventDelay\", 1250);\n    option(\"viewportMargin\", 10, function (cm) { return cm.refresh(); }, true);\n    option(\"maxHighlightLength\", 10000, resetModeState, true);\n    option(\"moveInputWithCursor\", true, function (cm, val) {\n      if (!val) { cm.display.input.resetPosition(); }\n    });\n\n    option(\"tabindex\", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || \"\"; });\n    option(\"autofocus\", null);\n    option(\"direction\", \"ltr\", function (cm, val) { return cm.doc.setDirection(val); }, true);\n    option(\"phrases\", null);\n  }\n\n  function guttersChanged(cm) {\n    updateGutters(cm);\n    regChange(cm);\n    alignHorizontally(cm);\n  }\n\n  function dragDropChanged(cm, value, old) {\n    var wasOn = old && old != Init;\n    if (!value != !wasOn) {\n      var funcs = cm.display.dragFunctions;\n      var toggle = value ? on : off;\n      toggle(cm.display.scroller, \"dragstart\", funcs.start);\n      toggle(cm.display.scroller, \"dragenter\", funcs.enter);\n      toggle(cm.display.scroller, \"dragover\", funcs.over);\n      toggle(cm.display.scroller, \"dragleave\", funcs.leave);\n      toggle(cm.display.scroller, \"drop\", funcs.drop);\n    }\n  }\n\n  function wrappingChanged(cm) {\n    if (cm.options.lineWrapping) {\n      addClass(cm.display.wrapper, \"CodeMirror-wrap\");\n      cm.display.sizer.style.minWidth = \"\";\n      cm.display.sizerWidth = null;\n    } else {\n      rmClass(cm.display.wrapper, \"CodeMirror-wrap\");\n      findMaxLine(cm);\n    }\n    estimateLineHeights(cm);\n    regChange(cm);\n    clearCaches(cm);\n    setTimeout(function () { return updateScrollbars(cm); }, 100);\n  }\n\n  // A CodeMirror instance represents an editor. This is the object\n  // that user code is usually dealing with.\n\n  function CodeMirror(place, options) {\n    var this$1 = this;\n\n    if (!(this instanceof CodeMirror)) { return new CodeMirror(place, options) }\n\n    this.options = options = options ? copyObj(options) : {};\n    // Determine effective options based on given values and defaults.\n    copyObj(defaults, options, false);\n    setGuttersForLineNumbers(options);\n\n    var doc = options.value;\n    if (typeof doc == \"string\") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); }\n    else if (options.mode) { doc.modeOption = options.mode; }\n    this.doc = doc;\n\n    var input = new CodeMirror.inputStyles[options.inputStyle](this);\n    var display = this.display = new Display(place, doc, input);\n    display.wrapper.CodeMirror = this;\n    updateGutters(this);\n    themeChanged(this);\n    if (options.lineWrapping)\n      { this.display.wrapper.className += \" CodeMirror-wrap\"; }\n    initScrollbars(this);\n\n    this.state = {\n      keyMaps: [],  // stores maps added by addKeyMap\n      overlays: [], // highlighting overlays, as added by addOverlay\n      modeGen: 0,   // bumped when mode/overlay changes, used to invalidate highlighting info\n      overwrite: false,\n      delayingBlurEvent: false,\n      focused: false,\n      suppressEdits: false, // used to disable editing during key handlers when in readOnly mode\n      pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in input.poll\n      selectingText: false,\n      draggingText: false,\n      highlight: new Delayed(), // stores highlight worker timeout\n      keySeq: null,  // Unfinished key sequence\n      specialChars: null\n    };\n\n    if (options.autofocus && !mobile) { display.input.focus(); }\n\n    // Override magic textarea content restore that IE sometimes does\n    // on our hidden textarea on reload\n    if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); }\n\n    registerEventHandlers(this);\n    ensureGlobalHandlers();\n\n    startOperation(this);\n    this.curOp.forceUpdate = true;\n    attachDoc(this, doc);\n\n    if ((options.autofocus && !mobile) || this.hasFocus())\n      { setTimeout(bind(onFocus, this), 20); }\n    else\n      { onBlur(this); }\n\n    for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt))\n      { optionHandlers[opt](this$1, options[opt], Init); } }\n    maybeUpdateLineNumberWidth(this);\n    if (options.finishInit) { options.finishInit(this); }\n    for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this$1); }\n    endOperation(this);\n    // Suppress optimizelegibility in Webkit, since it breaks text\n    // measuring on line wrapping boundaries.\n    if (webkit && options.lineWrapping &&\n        getComputedStyle(display.lineDiv).textRendering == \"optimizelegibility\")\n      { display.lineDiv.style.textRendering = \"auto\"; }\n  }\n\n  // The default configuration options.\n  CodeMirror.defaults = defaults;\n  // Functions to run when options are changed.\n  CodeMirror.optionHandlers = optionHandlers;\n\n  // Attach the necessary event handlers when initializing the editor\n  function registerEventHandlers(cm) {\n    var d = cm.display;\n    on(d.scroller, \"mousedown\", operation(cm, onMouseDown));\n    // Older IE's will not fire a second mousedown for a double click\n    if (ie && ie_version < 11)\n      { on(d.scroller, \"dblclick\", operation(cm, function (e) {\n        if (signalDOMEvent(cm, e)) { return }\n        var pos = posFromMouse(cm, e);\n        if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return }\n        e_preventDefault(e);\n        var word = cm.findWordAt(pos);\n        extendSelection(cm.doc, word.anchor, word.head);\n      })); }\n    else\n      { on(d.scroller, \"dblclick\", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); }\n    // Some browsers fire contextmenu *after* opening the menu, at\n    // which point we can't mess with it anymore. Context menu is\n    // handled in onMouseDown for these browsers.\n    on(d.scroller, \"contextmenu\", function (e) { return onContextMenu(cm, e); });\n\n    // Used to suppress mouse event handling when a touch happens\n    var touchFinished, prevTouch = {end: 0};\n    function finishTouch() {\n      if (d.activeTouch) {\n        touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000);\n        prevTouch = d.activeTouch;\n        prevTouch.end = +new Date;\n      }\n    }\n    function isMouseLikeTouchEvent(e) {\n      if (e.touches.length != 1) { return false }\n      var touch = e.touches[0];\n      return touch.radiusX <= 1 && touch.radiusY <= 1\n    }\n    function farAway(touch, other) {\n      if (other.left == null) { return true }\n      var dx = other.left - touch.left, dy = other.top - touch.top;\n      return dx * dx + dy * dy > 20 * 20\n    }\n    on(d.scroller, \"touchstart\", function (e) {\n      if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) {\n        d.input.ensurePolled();\n        clearTimeout(touchFinished);\n        var now = +new Date;\n        d.activeTouch = {start: now, moved: false,\n                         prev: now - prevTouch.end <= 300 ? prevTouch : null};\n        if (e.touches.length == 1) {\n          d.activeTouch.left = e.touches[0].pageX;\n          d.activeTouch.top = e.touches[0].pageY;\n        }\n      }\n    });\n    on(d.scroller, \"touchmove\", function () {\n      if (d.activeTouch) { d.activeTouch.moved = true; }\n    });\n    on(d.scroller, \"touchend\", function (e) {\n      var touch = d.activeTouch;\n      if (touch && !eventInWidget(d, e) && touch.left != null &&\n          !touch.moved && new Date - touch.start < 300) {\n        var pos = cm.coordsChar(d.activeTouch, \"page\"), range;\n        if (!touch.prev || farAway(touch, touch.prev)) // Single tap\n          { range = new Range(pos, pos); }\n        else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap\n          { range = cm.findWordAt(pos); }\n        else // Triple tap\n          { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); }\n        cm.setSelection(range.anchor, range.head);\n        cm.focus();\n        e_preventDefault(e);\n      }\n      finishTouch();\n    });\n    on(d.scroller, \"touchcancel\", finishTouch);\n\n    // Sync scrolling between fake scrollbars and real scrollable\n    // area, ensure viewport is updated when scrolling.\n    on(d.scroller, \"scroll\", function () {\n      if (d.scroller.clientHeight) {\n        updateScrollTop(cm, d.scroller.scrollTop);\n        setScrollLeft(cm, d.scroller.scrollLeft, true);\n        signal(cm, \"scroll\", cm);\n      }\n    });\n\n    // Listen to wheel events in order to try and update the viewport on time.\n    on(d.scroller, \"mousewheel\", function (e) { return onScrollWheel(cm, e); });\n    on(d.scroller, \"DOMMouseScroll\", function (e) { return onScrollWheel(cm, e); });\n\n    // Prevent wrapper from ever scrolling\n    on(d.wrapper, \"scroll\", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });\n\n    d.dragFunctions = {\n      enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }},\n      over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }},\n      start: function (e) { return onDragStart(cm, e); },\n      drop: operation(cm, onDrop),\n      leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }}\n    };\n\n    var inp = d.input.getField();\n    on(inp, \"keyup\", function (e) { return onKeyUp.call(cm, e); });\n    on(inp, \"keydown\", operation(cm, onKeyDown));\n    on(inp, \"keypress\", operation(cm, onKeyPress));\n    on(inp, \"focus\", function (e) { return onFocus(cm, e); });\n    on(inp, \"blur\", function (e) { return onBlur(cm, e); });\n  }\n\n  var initHooks = [];\n  CodeMirror.defineInitHook = function (f) { return initHooks.push(f); };\n\n  // Indent the given line. The how parameter can be \"smart\",\n  // \"add\"/null, \"subtract\", or \"prev\". When aggressive is false\n  // (typically set to true for forced single-line indents), empty\n  // lines are not indented, and places where the mode returns Pass\n  // are left alone.\n  function indentLine(cm, n, how, aggressive) {\n    var doc = cm.doc, state;\n    if (how == null) { how = \"add\"; }\n    if (how == \"smart\") {\n      // Fall back to \"prev\" when the mode doesn't have an indentation\n      // method.\n      if (!doc.mode.indent) { how = \"prev\"; }\n      else { state = getContextBefore(cm, n).state; }\n    }\n\n    var tabSize = cm.options.tabSize;\n    var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);\n    if (line.stateAfter) { line.stateAfter = null; }\n    var curSpaceString = line.text.match(/^\\s*/)[0], indentation;\n    if (!aggressive && !/\\S/.test(line.text)) {\n      indentation = 0;\n      how = \"not\";\n    } else if (how == \"smart\") {\n      indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);\n      if (indentation == Pass || indentation > 150) {\n        if (!aggressive) { return }\n        how = \"prev\";\n      }\n    }\n    if (how == \"prev\") {\n      if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); }\n      else { indentation = 0; }\n    } else if (how == \"add\") {\n      indentation = curSpace + cm.options.indentUnit;\n    } else if (how == \"subtract\") {\n      indentation = curSpace - cm.options.indentUnit;\n    } else if (typeof how == \"number\") {\n      indentation = curSpace + how;\n    }\n    indentation = Math.max(0, indentation);\n\n    var indentString = \"\", pos = 0;\n    if (cm.options.indentWithTabs)\n      { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += \"\\t\";} }\n    if (pos < indentation) { indentString += spaceStr(indentation - pos); }\n\n    if (indentString != curSpaceString) {\n      replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), \"+input\");\n      line.stateAfter = null;\n      return true\n    } else {\n      // Ensure that, if the cursor was in the whitespace at the start\n      // of the line, it is moved to the end of that space.\n      for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) {\n        var range = doc.sel.ranges[i$1];\n        if (range.head.line == n && range.head.ch < curSpaceString.length) {\n          var pos$1 = Pos(n, curSpaceString.length);\n          replaceOneSelection(doc, i$1, new Range(pos$1, pos$1));\n          break\n        }\n      }\n    }\n  }\n\n  // This will be set to a {lineWise: bool, text: [string]} object, so\n  // that, when pasting, we know what kind of selections the copied\n  // text was made out of.\n  var lastCopied = null;\n\n  function setLastCopied(newLastCopied) {\n    lastCopied = newLastCopied;\n  }\n\n  function applyTextInput(cm, inserted, deleted, sel, origin) {\n    var doc = cm.doc;\n    cm.display.shift = false;\n    if (!sel) { sel = doc.sel; }\n\n    var paste = cm.state.pasteIncoming || origin == \"paste\";\n    var textLines = splitLinesAuto(inserted), multiPaste = null;\n    // When pasting N lines into N selections, insert one line per selection\n    if (paste && sel.ranges.length > 1) {\n      if (lastCopied && lastCopied.text.join(\"\\n\") == inserted) {\n        if (sel.ranges.length % lastCopied.text.length == 0) {\n          multiPaste = [];\n          for (var i = 0; i < lastCopied.text.length; i++)\n            { multiPaste.push(doc.splitLines(lastCopied.text[i])); }\n        }\n      } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) {\n        multiPaste = map(textLines, function (l) { return [l]; });\n      }\n    }\n\n    var updateInput;\n    // Normal behavior is to insert the new text into every selection\n    for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) {\n      var range$$1 = sel.ranges[i$1];\n      var from = range$$1.from(), to = range$$1.to();\n      if (range$$1.empty()) {\n        if (deleted && deleted > 0) // Handle deletion\n          { from = Pos(from.line, from.ch - deleted); }\n        else if (cm.state.overwrite && !paste) // Handle overwrite\n          { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); }\n        else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join(\"\\n\") == inserted)\n          { from = to = Pos(from.line, 0); }\n      }\n      updateInput = cm.curOp.updateInput;\n      var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines,\n                         origin: origin || (paste ? \"paste\" : cm.state.cutIncoming ? \"cut\" : \"+input\")};\n      makeChange(cm.doc, changeEvent);\n      signalLater(cm, \"inputRead\", cm, changeEvent);\n    }\n    if (inserted && !paste)\n      { triggerElectric(cm, inserted); }\n\n    ensureCursorVisible(cm);\n    cm.curOp.updateInput = updateInput;\n    cm.curOp.typing = true;\n    cm.state.pasteIncoming = cm.state.cutIncoming = false;\n  }\n\n  function handlePaste(e, cm) {\n    var pasted = e.clipboardData && e.clipboardData.getData(\"Text\");\n    if (pasted) {\n      e.preventDefault();\n      if (!cm.isReadOnly() && !cm.options.disableInput)\n        { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, \"paste\"); }); }\n      return true\n    }\n  }\n\n  function triggerElectric(cm, inserted) {\n    // When an 'electric' character is inserted, immediately trigger a reindent\n    if (!cm.options.electricChars || !cm.options.smartIndent) { return }\n    var sel = cm.doc.sel;\n\n    for (var i = sel.ranges.length - 1; i >= 0; i--) {\n      var range$$1 = sel.ranges[i];\n      if (range$$1.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range$$1.head.line)) { continue }\n      var mode = cm.getModeAt(range$$1.head);\n      var indented = false;\n      if (mode.electricChars) {\n        for (var j = 0; j < mode.electricChars.length; j++)\n          { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {\n            indented = indentLine(cm, range$$1.head.line, \"smart\");\n            break\n          } }\n      } else if (mode.electricInput) {\n        if (mode.electricInput.test(getLine(cm.doc, range$$1.head.line).text.slice(0, range$$1.head.ch)))\n          { indented = indentLine(cm, range$$1.head.line, \"smart\"); }\n      }\n      if (indented) { signalLater(cm, \"electricInput\", cm, range$$1.head.line); }\n    }\n  }\n\n  function copyableRanges(cm) {\n    var text = [], ranges = [];\n    for (var i = 0; i < cm.doc.sel.ranges.length; i++) {\n      var line = cm.doc.sel.ranges[i].head.line;\n      var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};\n      ranges.push(lineRange);\n      text.push(cm.getRange(lineRange.anchor, lineRange.head));\n    }\n    return {text: text, ranges: ranges}\n  }\n\n  function disableBrowserMagic(field, spellcheck) {\n    field.setAttribute(\"autocorrect\", \"off\");\n    field.setAttribute(\"autocapitalize\", \"off\");\n    field.setAttribute(\"spellcheck\", !!spellcheck);\n  }\n\n  function hiddenTextarea() {\n    var te = elt(\"textarea\", null, null, \"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none\");\n    var div = elt(\"div\", [te], null, \"overflow: hidden; position: relative; width: 3px; height: 0px;\");\n    // The textarea is kept positioned near the cursor to prevent the\n    // fact that it'll be scrolled into view on input from scrolling\n    // our fake cursor out of view. On webkit, when wrap=off, paste is\n    // very slow. So make the area wide instead.\n    if (webkit) { te.style.width = \"1000px\"; }\n    else { te.setAttribute(\"wrap\", \"off\"); }\n    // If border: 0; -- iOS fails to open keyboard (issue #1287)\n    if (ios) { te.style.border = \"1px solid black\"; }\n    disableBrowserMagic(te);\n    return div\n  }\n\n  // The publicly visible API. Note that methodOp(f) means\n  // 'wrap f in an operation, performed on its `this` parameter'.\n\n  // This is not the complete set of editor methods. Most of the\n  // methods defined on the Doc type are also injected into\n  // CodeMirror.prototype, for backwards compatibility and\n  // convenience.\n\n  function addEditorMethods(CodeMirror) {\n    var optionHandlers = CodeMirror.optionHandlers;\n\n    var helpers = CodeMirror.helpers = {};\n\n    CodeMirror.prototype = {\n      constructor: CodeMirror,\n      focus: function(){window.focus(); this.display.input.focus();},\n\n      setOption: function(option, value) {\n        var options = this.options, old = options[option];\n        if (options[option] == value && option != \"mode\") { return }\n        options[option] = value;\n        if (optionHandlers.hasOwnProperty(option))\n          { operation(this, optionHandlers[option])(this, value, old); }\n        signal(this, \"optionChange\", this, option);\n      },\n\n      getOption: function(option) {return this.options[option]},\n      getDoc: function() {return this.doc},\n\n      addKeyMap: function(map$$1, bottom) {\n        this.state.keyMaps[bottom ? \"push\" : \"unshift\"](getKeyMap(map$$1));\n      },\n      removeKeyMap: function(map$$1) {\n        var maps = this.state.keyMaps;\n        for (var i = 0; i < maps.length; ++i)\n          { if (maps[i] == map$$1 || maps[i].name == map$$1) {\n            maps.splice(i, 1);\n            return true\n          } }\n      },\n\n      addOverlay: methodOp(function(spec, options) {\n        var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);\n        if (mode.startState) { throw new Error(\"Overlays may not be stateful.\") }\n        insertSorted(this.state.overlays,\n                     {mode: mode, modeSpec: spec, opaque: options && options.opaque,\n                      priority: (options && options.priority) || 0},\n                     function (overlay) { return overlay.priority; });\n        this.state.modeGen++;\n        regChange(this);\n      }),\n      removeOverlay: methodOp(function(spec) {\n        var this$1 = this;\n\n        var overlays = this.state.overlays;\n        for (var i = 0; i < overlays.length; ++i) {\n          var cur = overlays[i].modeSpec;\n          if (cur == spec || typeof spec == \"string\" && cur.name == spec) {\n            overlays.splice(i, 1);\n            this$1.state.modeGen++;\n            regChange(this$1);\n            return\n          }\n        }\n      }),\n\n      indentLine: methodOp(function(n, dir, aggressive) {\n        if (typeof dir != \"string\" && typeof dir != \"number\") {\n          if (dir == null) { dir = this.options.smartIndent ? \"smart\" : \"prev\"; }\n          else { dir = dir ? \"add\" : \"subtract\"; }\n        }\n        if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); }\n      }),\n      indentSelection: methodOp(function(how) {\n        var this$1 = this;\n\n        var ranges = this.doc.sel.ranges, end = -1;\n        for (var i = 0; i < ranges.length; i++) {\n          var range$$1 = ranges[i];\n          if (!range$$1.empty()) {\n            var from = range$$1.from(), to = range$$1.to();\n            var start = Math.max(end, from.line);\n            end = Math.min(this$1.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;\n            for (var j = start; j < end; ++j)\n              { indentLine(this$1, j, how); }\n            var newRanges = this$1.doc.sel.ranges;\n            if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)\n              { replaceOneSelection(this$1.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); }\n          } else if (range$$1.head.line > end) {\n            indentLine(this$1, range$$1.head.line, how, true);\n            end = range$$1.head.line;\n            if (i == this$1.doc.sel.primIndex) { ensureCursorVisible(this$1); }\n          }\n        }\n      }),\n\n      // Fetch the parser token for a given character. Useful for hacks\n      // that want to inspect the mode state (say, for completion).\n      getTokenAt: function(pos, precise) {\n        return takeToken(this, pos, precise)\n      },\n\n      getLineTokens: function(line, precise) {\n        return takeToken(this, Pos(line), precise, true)\n      },\n\n      getTokenTypeAt: function(pos) {\n        pos = clipPos(this.doc, pos);\n        var styles = getLineStyles(this, getLine(this.doc, pos.line));\n        var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;\n        var type;\n        if (ch == 0) { type = styles[2]; }\n        else { for (;;) {\n          var mid = (before + after) >> 1;\n          if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; }\n          else if (styles[mid * 2 + 1] < ch) { before = mid + 1; }\n          else { type = styles[mid * 2 + 2]; break }\n        } }\n        var cut = type ? type.indexOf(\"overlay \") : -1;\n        return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1)\n      },\n\n      getModeAt: function(pos) {\n        var mode = this.doc.mode;\n        if (!mode.innerMode) { return mode }\n        return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode\n      },\n\n      getHelper: function(pos, type) {\n        return this.getHelpers(pos, type)[0]\n      },\n\n      getHelpers: function(pos, type) {\n        var this$1 = this;\n\n        var found = [];\n        if (!helpers.hasOwnProperty(type)) { return found }\n        var help = helpers[type], mode = this.getModeAt(pos);\n        if (typeof mode[type] == \"string\") {\n          if (help[mode[type]]) { found.push(help[mode[type]]); }\n        } else if (mode[type]) {\n          for (var i = 0; i < mode[type].length; i++) {\n            var val = help[mode[type][i]];\n            if (val) { found.push(val); }\n          }\n        } else if (mode.helperType && help[mode.helperType]) {\n          found.push(help[mode.helperType]);\n        } else if (help[mode.name]) {\n          found.push(help[mode.name]);\n        }\n        for (var i$1 = 0; i$1 < help._global.length; i$1++) {\n          var cur = help._global[i$1];\n          if (cur.pred(mode, this$1) && indexOf(found, cur.val) == -1)\n            { found.push(cur.val); }\n        }\n        return found\n      },\n\n      getStateAfter: function(line, precise) {\n        var doc = this.doc;\n        line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);\n        return getContextBefore(this, line + 1, precise).state\n      },\n\n      cursorCoords: function(start, mode) {\n        var pos, range$$1 = this.doc.sel.primary();\n        if (start == null) { pos = range$$1.head; }\n        else if (typeof start == \"object\") { pos = clipPos(this.doc, start); }\n        else { pos = start ? range$$1.from() : range$$1.to(); }\n        return cursorCoords(this, pos, mode || \"page\")\n      },\n\n      charCoords: function(pos, mode) {\n        return charCoords(this, clipPos(this.doc, pos), mode || \"page\")\n      },\n\n      coordsChar: function(coords, mode) {\n        coords = fromCoordSystem(this, coords, mode || \"page\");\n        return coordsChar(this, coords.left, coords.top)\n      },\n\n      lineAtHeight: function(height, mode) {\n        height = fromCoordSystem(this, {top: height, left: 0}, mode || \"page\").top;\n        return lineAtHeight(this.doc, height + this.display.viewOffset)\n      },\n      heightAtLine: function(line, mode, includeWidgets) {\n        var end = false, lineObj;\n        if (typeof line == \"number\") {\n          var last = this.doc.first + this.doc.size - 1;\n          if (line < this.doc.first) { line = this.doc.first; }\n          else if (line > last) { line = last; end = true; }\n          lineObj = getLine(this.doc, line);\n        } else {\n          lineObj = line;\n        }\n        return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || \"page\", includeWidgets || end).top +\n          (end ? this.doc.height - heightAtLine(lineObj) : 0)\n      },\n\n      defaultTextHeight: function() { return textHeight(this.display) },\n      defaultCharWidth: function() { return charWidth(this.display) },\n\n      getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}},\n\n      addWidget: function(pos, node, scroll, vert, horiz) {\n        var display = this.display;\n        pos = cursorCoords(this, clipPos(this.doc, pos));\n        var top = pos.bottom, left = pos.left;\n        node.style.position = \"absolute\";\n        node.setAttribute(\"cm-ignore-events\", \"true\");\n        this.display.input.setUneditable(node);\n        display.sizer.appendChild(node);\n        if (vert == \"over\") {\n          top = pos.top;\n        } else if (vert == \"above\" || vert == \"near\") {\n          var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),\n          hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);\n          // Default to positioning above (if specified and possible); otherwise default to positioning below\n          if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)\n            { top = pos.top - node.offsetHeight; }\n          else if (pos.bottom + node.offsetHeight <= vspace)\n            { top = pos.bottom; }\n          if (left + node.offsetWidth > hspace)\n            { left = hspace - node.offsetWidth; }\n        }\n        node.style.top = top + \"px\";\n        node.style.left = node.style.right = \"\";\n        if (horiz == \"right\") {\n          left = display.sizer.clientWidth - node.offsetWidth;\n          node.style.right = \"0px\";\n        } else {\n          if (horiz == \"left\") { left = 0; }\n          else if (horiz == \"middle\") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; }\n          node.style.left = left + \"px\";\n        }\n        if (scroll)\n          { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); }\n      },\n\n      triggerOnKeyDown: methodOp(onKeyDown),\n      triggerOnKeyPress: methodOp(onKeyPress),\n      triggerOnKeyUp: onKeyUp,\n      triggerOnMouseDown: methodOp(onMouseDown),\n\n      execCommand: function(cmd) {\n        if (commands.hasOwnProperty(cmd))\n          { return commands[cmd].call(null, this) }\n      },\n\n      triggerElectric: methodOp(function(text) { triggerElectric(this, text); }),\n\n      findPosH: function(from, amount, unit, visually) {\n        var this$1 = this;\n\n        var dir = 1;\n        if (amount < 0) { dir = -1; amount = -amount; }\n        var cur = clipPos(this.doc, from);\n        for (var i = 0; i < amount; ++i) {\n          cur = findPosH(this$1.doc, cur, dir, unit, visually);\n          if (cur.hitSide) { break }\n        }\n        return cur\n      },\n\n      moveH: methodOp(function(dir, unit) {\n        var this$1 = this;\n\n        this.extendSelectionsBy(function (range$$1) {\n          if (this$1.display.shift || this$1.doc.extend || range$$1.empty())\n            { return findPosH(this$1.doc, range$$1.head, dir, unit, this$1.options.rtlMoveVisually) }\n          else\n            { return dir < 0 ? range$$1.from() : range$$1.to() }\n        }, sel_move);\n      }),\n\n      deleteH: methodOp(function(dir, unit) {\n        var sel = this.doc.sel, doc = this.doc;\n        if (sel.somethingSelected())\n          { doc.replaceSelection(\"\", null, \"+delete\"); }\n        else\n          { deleteNearSelection(this, function (range$$1) {\n            var other = findPosH(doc, range$$1.head, dir, unit, false);\n            return dir < 0 ? {from: other, to: range$$1.head} : {from: range$$1.head, to: other}\n          }); }\n      }),\n\n      findPosV: function(from, amount, unit, goalColumn) {\n        var this$1 = this;\n\n        var dir = 1, x = goalColumn;\n        if (amount < 0) { dir = -1; amount = -amount; }\n        var cur = clipPos(this.doc, from);\n        for (var i = 0; i < amount; ++i) {\n          var coords = cursorCoords(this$1, cur, \"div\");\n          if (x == null) { x = coords.left; }\n          else { coords.left = x; }\n          cur = findPosV(this$1, coords, dir, unit);\n          if (cur.hitSide) { break }\n        }\n        return cur\n      },\n\n      moveV: methodOp(function(dir, unit) {\n        var this$1 = this;\n\n        var doc = this.doc, goals = [];\n        var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected();\n        doc.extendSelectionsBy(function (range$$1) {\n          if (collapse)\n            { return dir < 0 ? range$$1.from() : range$$1.to() }\n          var headPos = cursorCoords(this$1, range$$1.head, \"div\");\n          if (range$$1.goalColumn != null) { headPos.left = range$$1.goalColumn; }\n          goals.push(headPos.left);\n          var pos = findPosV(this$1, headPos, dir, unit);\n          if (unit == \"page\" && range$$1 == doc.sel.primary())\n            { addToScrollTop(this$1, charCoords(this$1, pos, \"div\").top - headPos.top); }\n          return pos\n        }, sel_move);\n        if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++)\n          { doc.sel.ranges[i].goalColumn = goals[i]; } }\n      }),\n\n      // Find the word at the given position (as returned by coordsChar).\n      findWordAt: function(pos) {\n        var doc = this.doc, line = getLine(doc, pos.line).text;\n        var start = pos.ch, end = pos.ch;\n        if (line) {\n          var helper = this.getHelper(pos, \"wordChars\");\n          if ((pos.sticky == \"before\" || end == line.length) && start) { --start; } else { ++end; }\n          var startChar = line.charAt(start);\n          var check = isWordChar(startChar, helper)\n            ? function (ch) { return isWordChar(ch, helper); }\n            : /\\s/.test(startChar) ? function (ch) { return /\\s/.test(ch); }\n            : function (ch) { return (!/\\s/.test(ch) && !isWordChar(ch)); };\n          while (start > 0 && check(line.charAt(start - 1))) { --start; }\n          while (end < line.length && check(line.charAt(end))) { ++end; }\n        }\n        return new Range(Pos(pos.line, start), Pos(pos.line, end))\n      },\n\n      toggleOverwrite: function(value) {\n        if (value != null && value == this.state.overwrite) { return }\n        if (this.state.overwrite = !this.state.overwrite)\n          { addClass(this.display.cursorDiv, \"CodeMirror-overwrite\"); }\n        else\n          { rmClass(this.display.cursorDiv, \"CodeMirror-overwrite\"); }\n\n        signal(this, \"overwriteToggle\", this, this.state.overwrite);\n      },\n      hasFocus: function() { return this.display.input.getField() == activeElt() },\n      isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) },\n\n      scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }),\n      getScrollInfo: function() {\n        var scroller = this.display.scroller;\n        return {left: scroller.scrollLeft, top: scroller.scrollTop,\n                height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,\n                width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,\n                clientHeight: displayHeight(this), clientWidth: displayWidth(this)}\n      },\n\n      scrollIntoView: methodOp(function(range$$1, margin) {\n        if (range$$1 == null) {\n          range$$1 = {from: this.doc.sel.primary().head, to: null};\n          if (margin == null) { margin = this.options.cursorScrollMargin; }\n        } else if (typeof range$$1 == \"number\") {\n          range$$1 = {from: Pos(range$$1, 0), to: null};\n        } else if (range$$1.from == null) {\n          range$$1 = {from: range$$1, to: null};\n        }\n        if (!range$$1.to) { range$$1.to = range$$1.from; }\n        range$$1.margin = margin || 0;\n\n        if (range$$1.from.line != null) {\n          scrollToRange(this, range$$1);\n        } else {\n          scrollToCoordsRange(this, range$$1.from, range$$1.to, range$$1.margin);\n        }\n      }),\n\n      setSize: methodOp(function(width, height) {\n        var this$1 = this;\n\n        var interpret = function (val) { return typeof val == \"number\" || /^\\d+$/.test(String(val)) ? val + \"px\" : val; };\n        if (width != null) { this.display.wrapper.style.width = interpret(width); }\n        if (height != null) { this.display.wrapper.style.height = interpret(height); }\n        if (this.options.lineWrapping) { clearLineMeasurementCache(this); }\n        var lineNo$$1 = this.display.viewFrom;\n        this.doc.iter(lineNo$$1, this.display.viewTo, function (line) {\n          if (line.widgets) { for (var i = 0; i < line.widgets.length; i++)\n            { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo$$1, \"widget\"); break } } }\n          ++lineNo$$1;\n        });\n        this.curOp.forceUpdate = true;\n        signal(this, \"refresh\", this);\n      }),\n\n      operation: function(f){return runInOp(this, f)},\n      startOperation: function(){return startOperation(this)},\n      endOperation: function(){return endOperation(this)},\n\n      refresh: methodOp(function() {\n        var oldHeight = this.display.cachedTextHeight;\n        regChange(this);\n        this.curOp.forceUpdate = true;\n        clearCaches(this);\n        scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop);\n        updateGutterSpace(this);\n        if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5)\n          { estimateLineHeights(this); }\n        signal(this, \"refresh\", this);\n      }),\n\n      swapDoc: methodOp(function(doc) {\n        var old = this.doc;\n        old.cm = null;\n        attachDoc(this, doc);\n        clearCaches(this);\n        this.display.input.reset();\n        scrollToCoords(this, doc.scrollLeft, doc.scrollTop);\n        this.curOp.forceScroll = true;\n        signalLater(this, \"swapDoc\", this, old);\n        return old\n      }),\n\n      phrase: function(phraseText) {\n        var phrases = this.options.phrases;\n        return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText\n      },\n\n      getInputField: function(){return this.display.input.getField()},\n      getWrapperElement: function(){return this.display.wrapper},\n      getScrollerElement: function(){return this.display.scroller},\n      getGutterElement: function(){return this.display.gutters}\n    };\n    eventMixin(CodeMirror);\n\n    CodeMirror.registerHelper = function(type, name, value) {\n      if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; }\n      helpers[type][name] = value;\n    };\n    CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {\n      CodeMirror.registerHelper(type, name, value);\n      helpers[type]._global.push({pred: predicate, val: value});\n    };\n  }\n\n  // Used for horizontal relative motion. Dir is -1 or 1 (left or\n  // right), unit can be \"char\", \"column\" (like char, but doesn't\n  // cross line boundaries), \"word\" (across next word), or \"group\" (to\n  // the start of next group of word or non-word-non-whitespace\n  // chars). The visually param controls whether, in right-to-left\n  // text, direction 1 means to move towards the next index in the\n  // string, or towards the character to the right of the current\n  // position. The resulting position will have a hitSide=true\n  // property if it reached the end of the document.\n  function findPosH(doc, pos, dir, unit, visually) {\n    var oldPos = pos;\n    var origDir = dir;\n    var lineObj = getLine(doc, pos.line);\n    function findNextLine() {\n      var l = pos.line + dir;\n      if (l < doc.first || l >= doc.first + doc.size) { return false }\n      pos = new Pos(l, pos.ch, pos.sticky);\n      return lineObj = getLine(doc, l)\n    }\n    function moveOnce(boundToLine) {\n      var next;\n      if (visually) {\n        next = moveVisually(doc.cm, lineObj, pos, dir);\n      } else {\n        next = moveLogically(lineObj, pos, dir);\n      }\n      if (next == null) {\n        if (!boundToLine && findNextLine())\n          { pos = endOfLine(visually, doc.cm, lineObj, pos.line, dir); }\n        else\n          { return false }\n      } else {\n        pos = next;\n      }\n      return true\n    }\n\n    if (unit == \"char\") {\n      moveOnce();\n    } else if (unit == \"column\") {\n      moveOnce(true);\n    } else if (unit == \"word\" || unit == \"group\") {\n      var sawType = null, group = unit == \"group\";\n      var helper = doc.cm && doc.cm.getHelper(pos, \"wordChars\");\n      for (var first = true;; first = false) {\n        if (dir < 0 && !moveOnce(!first)) { break }\n        var cur = lineObj.text.charAt(pos.ch) || \"\\n\";\n        var type = isWordChar(cur, helper) ? \"w\"\n          : group && cur == \"\\n\" ? \"n\"\n          : !group || /\\s/.test(cur) ? null\n          : \"p\";\n        if (group && !first && !type) { type = \"s\"; }\n        if (sawType && sawType != type) {\n          if (dir < 0) {dir = 1; moveOnce(); pos.sticky = \"after\";}\n          break\n        }\n\n        if (type) { sawType = type; }\n        if (dir > 0 && !moveOnce(!first)) { break }\n      }\n    }\n    var result = skipAtomic(doc, pos, oldPos, origDir, true);\n    if (equalCursorPos(oldPos, result)) { result.hitSide = true; }\n    return result\n  }\n\n  // For relative vertical movement. Dir may be -1 or 1. Unit can be\n  // \"page\" or \"line\". The resulting position will have a hitSide=true\n  // property if it reached the end of the document.\n  function findPosV(cm, pos, dir, unit) {\n    var doc = cm.doc, x = pos.left, y;\n    if (unit == \"page\") {\n      var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);\n      var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3);\n      y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount;\n\n    } else if (unit == \"line\") {\n      y = dir > 0 ? pos.bottom + 3 : pos.top - 3;\n    }\n    var target;\n    for (;;) {\n      target = coordsChar(cm, x, y);\n      if (!target.outside) { break }\n      if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break }\n      y += dir * 5;\n    }\n    return target\n  }\n\n  // CONTENTEDITABLE INPUT STYLE\n\n  var ContentEditableInput = function(cm) {\n    this.cm = cm;\n    this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;\n    this.polling = new Delayed();\n    this.composing = null;\n    this.gracePeriod = false;\n    this.readDOMTimeout = null;\n  };\n\n  ContentEditableInput.prototype.init = function (display) {\n      var this$1 = this;\n\n    var input = this, cm = input.cm;\n    var div = input.div = display.lineDiv;\n    disableBrowserMagic(div, cm.options.spellcheck);\n\n    on(div, \"paste\", function (e) {\n      if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }\n      // IE doesn't fire input events, so we schedule a read for the pasted content in this way\n      if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); }\n    });\n\n    on(div, \"compositionstart\", function (e) {\n      this$1.composing = {data: e.data, done: false};\n    });\n    on(div, \"compositionupdate\", function (e) {\n      if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; }\n    });\n    on(div, \"compositionend\", function (e) {\n      if (this$1.composing) {\n        if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); }\n        this$1.composing.done = true;\n      }\n    });\n\n    on(div, \"touchstart\", function () { return input.forceCompositionEnd(); });\n\n    on(div, \"input\", function () {\n      if (!this$1.composing) { this$1.readFromDOMSoon(); }\n    });\n\n    function onCopyCut(e) {\n      if (signalDOMEvent(cm, e)) { return }\n      if (cm.somethingSelected()) {\n        setLastCopied({lineWise: false, text: cm.getSelections()});\n        if (e.type == \"cut\") { cm.replaceSelection(\"\", null, \"cut\"); }\n      } else if (!cm.options.lineWiseCopyCut) {\n        return\n      } else {\n        var ranges = copyableRanges(cm);\n        setLastCopied({lineWise: true, text: ranges.text});\n        if (e.type == \"cut\") {\n          cm.operation(function () {\n            cm.setSelections(ranges.ranges, 0, sel_dontScroll);\n            cm.replaceSelection(\"\", null, \"cut\");\n          });\n        }\n      }\n      if (e.clipboardData) {\n        e.clipboardData.clearData();\n        var content = lastCopied.text.join(\"\\n\");\n        // iOS exposes the clipboard API, but seems to discard content inserted into it\n        e.clipboardData.setData(\"Text\", content);\n        if (e.clipboardData.getData(\"Text\") == content) {\n          e.preventDefault();\n          return\n        }\n      }\n      // Old-fashioned briefly-focus-a-textarea hack\n      var kludge = hiddenTextarea(), te = kludge.firstChild;\n      cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);\n      te.value = lastCopied.text.join(\"\\n\");\n      var hadFocus = document.activeElement;\n      selectInput(te);\n      setTimeout(function () {\n        cm.display.lineSpace.removeChild(kludge);\n        hadFocus.focus();\n        if (hadFocus == div) { input.showPrimarySelection(); }\n      }, 50);\n    }\n    on(div, \"copy\", onCopyCut);\n    on(div, \"cut\", onCopyCut);\n  };\n\n  ContentEditableInput.prototype.prepareSelection = function () {\n    var result = prepareSelection(this.cm, false);\n    result.focus = this.cm.state.focused;\n    return result\n  };\n\n  ContentEditableInput.prototype.showSelection = function (info, takeFocus) {\n    if (!info || !this.cm.display.view.length) { return }\n    if (info.focus || takeFocus) { this.showPrimarySelection(); }\n    this.showMultipleSelections(info);\n  };\n\n  ContentEditableInput.prototype.getSelection = function () {\n    return this.cm.display.wrapper.ownerDocument.getSelection()\n  };\n\n  ContentEditableInput.prototype.showPrimarySelection = function () {\n    var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary();\n    var from = prim.from(), to = prim.to();\n\n    if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) {\n      sel.removeAllRanges();\n      return\n    }\n\n    var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);\n    var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset);\n    if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&\n        cmp(minPos(curAnchor, curFocus), from) == 0 &&\n        cmp(maxPos(curAnchor, curFocus), to) == 0)\n      { return }\n\n    var view = cm.display.view;\n    var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) ||\n        {node: view[0].measure.map[2], offset: 0};\n    var end = to.line < cm.display.viewTo && posToDOM(cm, to);\n    if (!end) {\n      var measure = view[view.length - 1].measure;\n      var map$$1 = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map;\n      end = {node: map$$1[map$$1.length - 1], offset: map$$1[map$$1.length - 2] - map$$1[map$$1.length - 3]};\n    }\n\n    if (!start || !end) {\n      sel.removeAllRanges();\n      return\n    }\n\n    var old = sel.rangeCount && sel.getRangeAt(0), rng;\n    try { rng = range(start.node, start.offset, end.offset, end.node); }\n    catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible\n    if (rng) {\n      if (!gecko && cm.state.focused) {\n        sel.collapse(start.node, start.offset);\n        if (!rng.collapsed) {\n          sel.removeAllRanges();\n          sel.addRange(rng);\n        }\n      } else {\n        sel.removeAllRanges();\n        sel.addRange(rng);\n      }\n      if (old && sel.anchorNode == null) { sel.addRange(old); }\n      else if (gecko) { this.startGracePeriod(); }\n    }\n    this.rememberSelection();\n  };\n\n  ContentEditableInput.prototype.startGracePeriod = function () {\n      var this$1 = this;\n\n    clearTimeout(this.gracePeriod);\n    this.gracePeriod = setTimeout(function () {\n      this$1.gracePeriod = false;\n      if (this$1.selectionChanged())\n        { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); }\n    }, 20);\n  };\n\n  ContentEditableInput.prototype.showMultipleSelections = function (info) {\n    removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);\n    removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);\n  };\n\n  ContentEditableInput.prototype.rememberSelection = function () {\n    var sel = this.getSelection();\n    this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;\n    this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;\n  };\n\n  ContentEditableInput.prototype.selectionInEditor = function () {\n    var sel = this.getSelection();\n    if (!sel.rangeCount) { return false }\n    var node = sel.getRangeAt(0).commonAncestorContainer;\n    return contains(this.div, node)\n  };\n\n  ContentEditableInput.prototype.focus = function () {\n    if (this.cm.options.readOnly != \"nocursor\") {\n      if (!this.selectionInEditor())\n        { this.showSelection(this.prepareSelection(), true); }\n      this.div.focus();\n    }\n  };\n  ContentEditableInput.prototype.blur = function () { this.div.blur(); };\n  ContentEditableInput.prototype.getField = function () { return this.div };\n\n  ContentEditableInput.prototype.supportsTouch = function () { return true };\n\n  ContentEditableInput.prototype.receivedFocus = function () {\n    var input = this;\n    if (this.selectionInEditor())\n      { this.pollSelection(); }\n    else\n      { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); }\n\n    function poll() {\n      if (input.cm.state.focused) {\n        input.pollSelection();\n        input.polling.set(input.cm.options.pollInterval, poll);\n      }\n    }\n    this.polling.set(this.cm.options.pollInterval, poll);\n  };\n\n  ContentEditableInput.prototype.selectionChanged = function () {\n    var sel = this.getSelection();\n    return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||\n      sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset\n  };\n\n  ContentEditableInput.prototype.pollSelection = function () {\n    if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return }\n    var sel = this.getSelection(), cm = this.cm;\n    // On Android Chrome (version 56, at least), backspacing into an\n    // uneditable block element will put the cursor in that element,\n    // and then, because it's not editable, hide the virtual keyboard.\n    // Because Android doesn't allow us to actually detect backspace\n    // presses in a sane way, this code checks for when that happens\n    // and simulates a backspace press in this case.\n    if (android && chrome && this.cm.options.gutters.length && isInGutter(sel.anchorNode)) {\n      this.cm.triggerOnKeyDown({type: \"keydown\", keyCode: 8, preventDefault: Math.abs});\n      this.blur();\n      this.focus();\n      return\n    }\n    if (this.composing) { return }\n    this.rememberSelection();\n    var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);\n    var head = domToPos(cm, sel.focusNode, sel.focusOffset);\n    if (anchor && head) { runInOp(cm, function () {\n      setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll);\n      if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; }\n    }); }\n  };\n\n  ContentEditableInput.prototype.pollContent = function () {\n    if (this.readDOMTimeout != null) {\n      clearTimeout(this.readDOMTimeout);\n      this.readDOMTimeout = null;\n    }\n\n    var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary();\n    var from = sel.from(), to = sel.to();\n    if (from.ch == 0 && from.line > cm.firstLine())\n      { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); }\n    if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine())\n      { to = Pos(to.line + 1, 0); }\n    if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false }\n\n    var fromIndex, fromLine, fromNode;\n    if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {\n      fromLine = lineNo(display.view[0].line);\n      fromNode = display.view[0].node;\n    } else {\n      fromLine = lineNo(display.view[fromIndex].line);\n      fromNode = display.view[fromIndex - 1].node.nextSibling;\n    }\n    var toIndex = findViewIndex(cm, to.line);\n    var toLine, toNode;\n    if (toIndex == display.view.length - 1) {\n      toLine = display.viewTo - 1;\n      toNode = display.lineDiv.lastChild;\n    } else {\n      toLine = lineNo(display.view[toIndex + 1].line) - 1;\n      toNode = display.view[toIndex + 1].node.previousSibling;\n    }\n\n    if (!fromNode) { return false }\n    var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine));\n    var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length));\n    while (newText.length > 1 && oldText.length > 1) {\n      if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; }\n      else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; }\n      else { break }\n    }\n\n    var cutFront = 0, cutEnd = 0;\n    var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length);\n    while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))\n      { ++cutFront; }\n    var newBot = lst(newText), oldBot = lst(oldText);\n    var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),\n                             oldBot.length - (oldText.length == 1 ? cutFront : 0));\n    while (cutEnd < maxCutEnd &&\n           newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))\n      { ++cutEnd; }\n    // Try to move start of change to start of selection if ambiguous\n    if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) {\n      while (cutFront && cutFront > from.ch &&\n             newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) {\n        cutFront--;\n        cutEnd++;\n      }\n    }\n\n    newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\\u200b+/, \"\");\n    newText[0] = newText[0].slice(cutFront).replace(/\\u200b+$/, \"\");\n\n    var chFrom = Pos(fromLine, cutFront);\n    var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0);\n    if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {\n      replaceRange(cm.doc, newText, chFrom, chTo, \"+input\");\n      return true\n    }\n  };\n\n  ContentEditableInput.prototype.ensurePolled = function () {\n    this.forceCompositionEnd();\n  };\n  ContentEditableInput.prototype.reset = function () {\n    this.forceCompositionEnd();\n  };\n  ContentEditableInput.prototype.forceCompositionEnd = function () {\n    if (!this.composing) { return }\n    clearTimeout(this.readDOMTimeout);\n    this.composing = null;\n    this.updateFromDOM();\n    this.div.blur();\n    this.div.focus();\n  };\n  ContentEditableInput.prototype.readFromDOMSoon = function () {\n      var this$1 = this;\n\n    if (this.readDOMTimeout != null) { return }\n    this.readDOMTimeout = setTimeout(function () {\n      this$1.readDOMTimeout = null;\n      if (this$1.composing) {\n        if (this$1.composing.done) { this$1.composing = null; }\n        else { return }\n      }\n      this$1.updateFromDOM();\n    }, 80);\n  };\n\n  ContentEditableInput.prototype.updateFromDOM = function () {\n      var this$1 = this;\n\n    if (this.cm.isReadOnly() || !this.pollContent())\n      { runInOp(this.cm, function () { return regChange(this$1.cm); }); }\n  };\n\n  ContentEditableInput.prototype.setUneditable = function (node) {\n    node.contentEditable = \"false\";\n  };\n\n  ContentEditableInput.prototype.onKeyPress = function (e) {\n    if (e.charCode == 0 || this.composing) { return }\n    e.preventDefault();\n    if (!this.cm.isReadOnly())\n      { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); }\n  };\n\n  ContentEditableInput.prototype.readOnlyChanged = function (val) {\n    this.div.contentEditable = String(val != \"nocursor\");\n  };\n\n  ContentEditableInput.prototype.onContextMenu = function () {};\n  ContentEditableInput.prototype.resetPosition = function () {};\n\n  ContentEditableInput.prototype.needsContentAttribute = true;\n\n  function posToDOM(cm, pos) {\n    var view = findViewForLine(cm, pos.line);\n    if (!view || view.hidden) { return null }\n    var line = getLine(cm.doc, pos.line);\n    var info = mapFromLineView(view, line, pos.line);\n\n    var order = getOrder(line, cm.doc.direction), side = \"left\";\n    if (order) {\n      var partPos = getBidiPartAt(order, pos.ch);\n      side = partPos % 2 ? \"right\" : \"left\";\n    }\n    var result = nodeAndOffsetInLineMap(info.map, pos.ch, side);\n    result.offset = result.collapse == \"right\" ? result.end : result.start;\n    return result\n  }\n\n  function isInGutter(node) {\n    for (var scan = node; scan; scan = scan.parentNode)\n      { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } }\n    return false\n  }\n\n  function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }\n\n  function domTextBetween(cm, from, to, fromLine, toLine) {\n    var text = \"\", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false;\n    function recognizeMarker(id) { return function (marker) { return marker.id == id; } }\n    function close() {\n      if (closing) {\n        text += lineSep;\n        if (extraLinebreak) { text += lineSep; }\n        closing = extraLinebreak = false;\n      }\n    }\n    function addText(str) {\n      if (str) {\n        close();\n        text += str;\n      }\n    }\n    function walk(node) {\n      if (node.nodeType == 1) {\n        var cmText = node.getAttribute(\"cm-text\");\n        if (cmText) {\n          addText(cmText);\n          return\n        }\n        var markerID = node.getAttribute(\"cm-marker\"), range$$1;\n        if (markerID) {\n          var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID));\n          if (found.length && (range$$1 = found[0].find(0)))\n            { addText(getBetween(cm.doc, range$$1.from, range$$1.to).join(lineSep)); }\n          return\n        }\n        if (node.getAttribute(\"contenteditable\") == \"false\") { return }\n        var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName);\n        if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return }\n\n        if (isBlock) { close(); }\n        for (var i = 0; i < node.childNodes.length; i++)\n          { walk(node.childNodes[i]); }\n\n        if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; }\n        if (isBlock) { closing = true; }\n      } else if (node.nodeType == 3) {\n        addText(node.nodeValue.replace(/\\u200b/g, \"\").replace(/\\u00a0/g, \" \"));\n      }\n    }\n    for (;;) {\n      walk(from);\n      if (from == to) { break }\n      from = from.nextSibling;\n      extraLinebreak = false;\n    }\n    return text\n  }\n\n  function domToPos(cm, node, offset) {\n    var lineNode;\n    if (node == cm.display.lineDiv) {\n      lineNode = cm.display.lineDiv.childNodes[offset];\n      if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) }\n      node = null; offset = 0;\n    } else {\n      for (lineNode = node;; lineNode = lineNode.parentNode) {\n        if (!lineNode || lineNode == cm.display.lineDiv) { return null }\n        if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break }\n      }\n    }\n    for (var i = 0; i < cm.display.view.length; i++) {\n      var lineView = cm.display.view[i];\n      if (lineView.node == lineNode)\n        { return locateNodeInLineView(lineView, node, offset) }\n    }\n  }\n\n  function locateNodeInLineView(lineView, node, offset) {\n    var wrapper = lineView.text.firstChild, bad = false;\n    if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) }\n    if (node == wrapper) {\n      bad = true;\n      node = wrapper.childNodes[offset];\n      offset = 0;\n      if (!node) {\n        var line = lineView.rest ? lst(lineView.rest) : lineView.line;\n        return badPos(Pos(lineNo(line), line.text.length), bad)\n      }\n    }\n\n    var textNode = node.nodeType == 3 ? node : null, topNode = node;\n    if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {\n      textNode = node.firstChild;\n      if (offset) { offset = textNode.nodeValue.length; }\n    }\n    while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; }\n    var measure = lineView.measure, maps = measure.maps;\n\n    function find(textNode, topNode, offset) {\n      for (var i = -1; i < (maps ? maps.length : 0); i++) {\n        var map$$1 = i < 0 ? measure.map : maps[i];\n        for (var j = 0; j < map$$1.length; j += 3) {\n          var curNode = map$$1[j + 2];\n          if (curNode == textNode || curNode == topNode) {\n            var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]);\n            var ch = map$$1[j] + offset;\n            if (offset < 0 || curNode != textNode) { ch = map$$1[j + (offset ? 1 : 0)]; }\n            return Pos(line, ch)\n          }\n        }\n      }\n    }\n    var found = find(textNode, topNode, offset);\n    if (found) { return badPos(found, bad) }\n\n    // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems\n    for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {\n      found = find(after, after.firstChild, 0);\n      if (found)\n        { return badPos(Pos(found.line, found.ch - dist), bad) }\n      else\n        { dist += after.textContent.length; }\n    }\n    for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) {\n      found = find(before, before.firstChild, -1);\n      if (found)\n        { return badPos(Pos(found.line, found.ch + dist$1), bad) }\n      else\n        { dist$1 += before.textContent.length; }\n    }\n  }\n\n  // TEXTAREA INPUT STYLE\n\n  var TextareaInput = function(cm) {\n    this.cm = cm;\n    // See input.poll and input.reset\n    this.prevInput = \"\";\n\n    // Flag that indicates whether we expect input to appear real soon\n    // now (after some event like 'keypress' or 'input') and are\n    // polling intensively.\n    this.pollingFast = false;\n    // Self-resetting timeout for the poller\n    this.polling = new Delayed();\n    // Used to work around IE issue with selection being forgotten when focus moves away from textarea\n    this.hasSelection = false;\n    this.composing = null;\n  };\n\n  TextareaInput.prototype.init = function (display) {\n      var this$1 = this;\n\n    var input = this, cm = this.cm;\n    this.createField(display);\n    var te = this.textarea;\n\n    display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild);\n\n    // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)\n    if (ios) { te.style.width = \"0px\"; }\n\n    on(te, \"input\", function () {\n      if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; }\n      input.poll();\n    });\n\n    on(te, \"paste\", function (e) {\n      if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }\n\n      cm.state.pasteIncoming = true;\n      input.fastPoll();\n    });\n\n    function prepareCopyCut(e) {\n      if (signalDOMEvent(cm, e)) { return }\n      if (cm.somethingSelected()) {\n        setLastCopied({lineWise: false, text: cm.getSelections()});\n      } else if (!cm.options.lineWiseCopyCut) {\n        return\n      } else {\n        var ranges = copyableRanges(cm);\n        setLastCopied({lineWise: true, text: ranges.text});\n        if (e.type == \"cut\") {\n          cm.setSelections(ranges.ranges, null, sel_dontScroll);\n        } else {\n          input.prevInput = \"\";\n          te.value = ranges.text.join(\"\\n\");\n          selectInput(te);\n        }\n      }\n      if (e.type == \"cut\") { cm.state.cutIncoming = true; }\n    }\n    on(te, \"cut\", prepareCopyCut);\n    on(te, \"copy\", prepareCopyCut);\n\n    on(display.scroller, \"paste\", function (e) {\n      if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return }\n      cm.state.pasteIncoming = true;\n      input.focus();\n    });\n\n    // Prevent normal selection in the editor (we handle our own)\n    on(display.lineSpace, \"selectstart\", function (e) {\n      if (!eventInWidget(display, e)) { e_preventDefault(e); }\n    });\n\n    on(te, \"compositionstart\", function () {\n      var start = cm.getCursor(\"from\");\n      if (input.composing) { input.composing.range.clear(); }\n      input.composing = {\n        start: start,\n        range: cm.markText(start, cm.getCursor(\"to\"), {className: \"CodeMirror-composing\"})\n      };\n    });\n    on(te, \"compositionend\", function () {\n      if (input.composing) {\n        input.poll();\n        input.composing.range.clear();\n        input.composing = null;\n      }\n    });\n  };\n\n  TextareaInput.prototype.createField = function (_display) {\n    // Wraps and hides input textarea\n    this.wrapper = hiddenTextarea();\n    // The semihidden textarea that is focused when the editor is\n    // focused, and receives input.\n    this.textarea = this.wrapper.firstChild;\n  };\n\n  TextareaInput.prototype.prepareSelection = function () {\n    // Redraw the selection and/or cursor\n    var cm = this.cm, display = cm.display, doc = cm.doc;\n    var result = prepareSelection(cm);\n\n    // Move the hidden textarea near the cursor to prevent scrolling artifacts\n    if (cm.options.moveInputWithCursor) {\n      var headPos = cursorCoords(cm, doc.sel.primary().head, \"div\");\n      var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();\n      result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,\n                                          headPos.top + lineOff.top - wrapOff.top));\n      result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,\n                                           headPos.left + lineOff.left - wrapOff.left));\n    }\n\n    return result\n  };\n\n  TextareaInput.prototype.showSelection = function (drawn) {\n    var cm = this.cm, display = cm.display;\n    removeChildrenAndAdd(display.cursorDiv, drawn.cursors);\n    removeChildrenAndAdd(display.selectionDiv, drawn.selection);\n    if (drawn.teTop != null) {\n      this.wrapper.style.top = drawn.teTop + \"px\";\n      this.wrapper.style.left = drawn.teLeft + \"px\";\n    }\n  };\n\n  // Reset the input to correspond to the selection (or to be empty,\n  // when not typing and nothing is selected)\n  TextareaInput.prototype.reset = function (typing) {\n    if (this.contextMenuPending || this.composing) { return }\n    var cm = this.cm;\n    if (cm.somethingSelected()) {\n      this.prevInput = \"\";\n      var content = cm.getSelection();\n      this.textarea.value = content;\n      if (cm.state.focused) { selectInput(this.textarea); }\n      if (ie && ie_version >= 9) { this.hasSelection = content; }\n    } else if (!typing) {\n      this.prevInput = this.textarea.value = \"\";\n      if (ie && ie_version >= 9) { this.hasSelection = null; }\n    }\n  };\n\n  TextareaInput.prototype.getField = function () { return this.textarea };\n\n  TextareaInput.prototype.supportsTouch = function () { return false };\n\n  TextareaInput.prototype.focus = function () {\n    if (this.cm.options.readOnly != \"nocursor\" && (!mobile || activeElt() != this.textarea)) {\n      try { this.textarea.focus(); }\n      catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM\n    }\n  };\n\n  TextareaInput.prototype.blur = function () { this.textarea.blur(); };\n\n  TextareaInput.prototype.resetPosition = function () {\n    this.wrapper.style.top = this.wrapper.style.left = 0;\n  };\n\n  TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); };\n\n  // Poll for input changes, using the normal rate of polling. This\n  // runs as long as the editor is focused.\n  TextareaInput.prototype.slowPoll = function () {\n      var this$1 = this;\n\n    if (this.pollingFast) { return }\n    this.polling.set(this.cm.options.pollInterval, function () {\n      this$1.poll();\n      if (this$1.cm.state.focused) { this$1.slowPoll(); }\n    });\n  };\n\n  // When an event has just come in that is likely to add or change\n  // something in the input textarea, we poll faster, to ensure that\n  // the change appears on the screen quickly.\n  TextareaInput.prototype.fastPoll = function () {\n    var missed = false, input = this;\n    input.pollingFast = true;\n    function p() {\n      var changed = input.poll();\n      if (!changed && !missed) {missed = true; input.polling.set(60, p);}\n      else {input.pollingFast = false; input.slowPoll();}\n    }\n    input.polling.set(20, p);\n  };\n\n  // Read input from the textarea, and update the document to match.\n  // When something is selected, it is present in the textarea, and\n  // selected (unless it is huge, in which case a placeholder is\n  // used). When nothing is selected, the cursor sits after previously\n  // seen text (can be empty), which is stored in prevInput (we must\n  // not reset the textarea when typing, because that breaks IME).\n  TextareaInput.prototype.poll = function () {\n      var this$1 = this;\n\n    var cm = this.cm, input = this.textarea, prevInput = this.prevInput;\n    // Since this is called a *lot*, try to bail out as cheaply as\n    // possible when it is clear that nothing happened. hasSelection\n    // will be the case when there is a lot of text in the textarea,\n    // in which case reading its value would be expensive.\n    if (this.contextMenuPending || !cm.state.focused ||\n        (hasSelection(input) && !prevInput && !this.composing) ||\n        cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq)\n      { return false }\n\n    var text = input.value;\n    // If nothing changed, bail.\n    if (text == prevInput && !cm.somethingSelected()) { return false }\n    // Work around nonsensical selection resetting in IE9/10, and\n    // inexplicable appearance of private area unicode characters on\n    // some key combos in Mac (#2689).\n    if (ie && ie_version >= 9 && this.hasSelection === text ||\n        mac && /[\\uf700-\\uf7ff]/.test(text)) {\n      cm.display.input.reset();\n      return false\n    }\n\n    if (cm.doc.sel == cm.display.selForContextMenu) {\n      var first = text.charCodeAt(0);\n      if (first == 0x200b && !prevInput) { prevInput = \"\\u200b\"; }\n      if (first == 0x21da) { this.reset(); return this.cm.execCommand(\"undo\") }\n    }\n    // Find the part of the input that is actually new\n    var same = 0, l = Math.min(prevInput.length, text.length);\n    while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; }\n\n    runInOp(cm, function () {\n      applyTextInput(cm, text.slice(same), prevInput.length - same,\n                     null, this$1.composing ? \"*compose\" : null);\n\n      // Don't leave long text in the textarea, since it makes further polling slow\n      if (text.length > 1000 || text.indexOf(\"\\n\") > -1) { input.value = this$1.prevInput = \"\"; }\n      else { this$1.prevInput = text; }\n\n      if (this$1.composing) {\n        this$1.composing.range.clear();\n        this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor(\"to\"),\n                                           {className: \"CodeMirror-composing\"});\n      }\n    });\n    return true\n  };\n\n  TextareaInput.prototype.ensurePolled = function () {\n    if (this.pollingFast && this.poll()) { this.pollingFast = false; }\n  };\n\n  TextareaInput.prototype.onKeyPress = function () {\n    if (ie && ie_version >= 9) { this.hasSelection = null; }\n    this.fastPoll();\n  };\n\n  TextareaInput.prototype.onContextMenu = function (e) {\n    var input = this, cm = input.cm, display = cm.display, te = input.textarea;\n    var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;\n    if (!pos || presto) { return } // Opera is difficult.\n\n    // Reset the current text selection only if the click is done outside of the selection\n    // and 'resetSelectionOnContextMenu' option is true.\n    var reset = cm.options.resetSelectionOnContextMenu;\n    if (reset && cm.doc.sel.contains(pos) == -1)\n      { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); }\n\n    var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText;\n    input.wrapper.style.cssText = \"position: absolute\";\n    var wrapperBox = input.wrapper.getBoundingClientRect();\n    te.style.cssText = \"position: absolute; width: 30px; height: 30px;\\n      top: \" + (e.clientY - wrapperBox.top - 5) + \"px; left: \" + (e.clientX - wrapperBox.left - 5) + \"px;\\n      z-index: 1000; background: \" + (ie ? \"rgba(255, 255, 255, .05)\" : \"transparent\") + \";\\n      outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\";\n    var oldScrollY;\n    if (webkit) { oldScrollY = window.scrollY; } // Work around Chrome issue (#2712)\n    display.input.focus();\n    if (webkit) { window.scrollTo(null, oldScrollY); }\n    display.input.reset();\n    // Adds \"Select all\" to context menu in FF\n    if (!cm.somethingSelected()) { te.value = input.prevInput = \" \"; }\n    input.contextMenuPending = true;\n    display.selForContextMenu = cm.doc.sel;\n    clearTimeout(display.detectingSelectAll);\n\n    // Select-all will be greyed out if there's nothing to select, so\n    // this adds a zero-width space so that we can later check whether\n    // it got selected.\n    function prepareSelectAllHack() {\n      if (te.selectionStart != null) {\n        var selected = cm.somethingSelected();\n        var extval = \"\\u200b\" + (selected ? te.value : \"\");\n        te.value = \"\\u21da\"; // Used to catch context-menu undo\n        te.value = extval;\n        input.prevInput = selected ? \"\" : \"\\u200b\";\n        te.selectionStart = 1; te.selectionEnd = extval.length;\n        // Re-set this, in case some other handler touched the\n        // selection in the meantime.\n        display.selForContextMenu = cm.doc.sel;\n      }\n    }\n    function rehide() {\n      input.contextMenuPending = false;\n      input.wrapper.style.cssText = oldWrapperCSS;\n      te.style.cssText = oldCSS;\n      if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); }\n\n      // Try to detect the user choosing select-all\n      if (te.selectionStart != null) {\n        if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); }\n        var i = 0, poll = function () {\n          if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&\n              te.selectionEnd > 0 && input.prevInput == \"\\u200b\") {\n            operation(cm, selectAll)(cm);\n          } else if (i++ < 10) {\n            display.detectingSelectAll = setTimeout(poll, 500);\n          } else {\n            display.selForContextMenu = null;\n            display.input.reset();\n          }\n        };\n        display.detectingSelectAll = setTimeout(poll, 200);\n      }\n    }\n\n    if (ie && ie_version >= 9) { prepareSelectAllHack(); }\n    if (captureRightClick) {\n      e_stop(e);\n      var mouseup = function () {\n        off(window, \"mouseup\", mouseup);\n        setTimeout(rehide, 20);\n      };\n      on(window, \"mouseup\", mouseup);\n    } else {\n      setTimeout(rehide, 50);\n    }\n  };\n\n  TextareaInput.prototype.readOnlyChanged = function (val) {\n    if (!val) { this.reset(); }\n    this.textarea.disabled = val == \"nocursor\";\n  };\n\n  TextareaInput.prototype.setUneditable = function () {};\n\n  TextareaInput.prototype.needsContentAttribute = false;\n\n  function fromTextArea(textarea, options) {\n    options = options ? copyObj(options) : {};\n    options.value = textarea.value;\n    if (!options.tabindex && textarea.tabIndex)\n      { options.tabindex = textarea.tabIndex; }\n    if (!options.placeholder && textarea.placeholder)\n      { options.placeholder = textarea.placeholder; }\n    // Set autofocus to true if this textarea is focused, or if it has\n    // autofocus and no other element is focused.\n    if (options.autofocus == null) {\n      var hasFocus = activeElt();\n      options.autofocus = hasFocus == textarea ||\n        textarea.getAttribute(\"autofocus\") != null && hasFocus == document.body;\n    }\n\n    function save() {textarea.value = cm.getValue();}\n\n    var realSubmit;\n    if (textarea.form) {\n      on(textarea.form, \"submit\", save);\n      // Deplorable hack to make the submit method do the right thing.\n      if (!options.leaveSubmitMethodAlone) {\n        var form = textarea.form;\n        realSubmit = form.submit;\n        try {\n          var wrappedSubmit = form.submit = function () {\n            save();\n            form.submit = realSubmit;\n            form.submit();\n            form.submit = wrappedSubmit;\n          };\n        } catch(e) {}\n      }\n    }\n\n    options.finishInit = function (cm) {\n      cm.save = save;\n      cm.getTextArea = function () { return textarea; };\n      cm.toTextArea = function () {\n        cm.toTextArea = isNaN; // Prevent this from being ran twice\n        save();\n        textarea.parentNode.removeChild(cm.getWrapperElement());\n        textarea.style.display = \"\";\n        if (textarea.form) {\n          off(textarea.form, \"submit\", save);\n          if (typeof textarea.form.submit == \"function\")\n            { textarea.form.submit = realSubmit; }\n        }\n      };\n    };\n\n    textarea.style.display = \"none\";\n    var cm = CodeMirror(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); },\n      options);\n    return cm\n  }\n\n  function addLegacyProps(CodeMirror) {\n    CodeMirror.off = off;\n    CodeMirror.on = on;\n    CodeMirror.wheelEventPixels = wheelEventPixels;\n    CodeMirror.Doc = Doc;\n    CodeMirror.splitLines = splitLinesAuto;\n    CodeMirror.countColumn = countColumn;\n    CodeMirror.findColumn = findColumn;\n    CodeMirror.isWordChar = isWordCharBasic;\n    CodeMirror.Pass = Pass;\n    CodeMirror.signal = signal;\n    CodeMirror.Line = Line;\n    CodeMirror.changeEnd = changeEnd;\n    CodeMirror.scrollbarModel = scrollbarModel;\n    CodeMirror.Pos = Pos;\n    CodeMirror.cmpPos = cmp;\n    CodeMirror.modes = modes;\n    CodeMirror.mimeModes = mimeModes;\n    CodeMirror.resolveMode = resolveMode;\n    CodeMirror.getMode = getMode;\n    CodeMirror.modeExtensions = modeExtensions;\n    CodeMirror.extendMode = extendMode;\n    CodeMirror.copyState = copyState;\n    CodeMirror.startState = startState;\n    CodeMirror.innerMode = innerMode;\n    CodeMirror.commands = commands;\n    CodeMirror.keyMap = keyMap;\n    CodeMirror.keyName = keyName;\n    CodeMirror.isModifierKey = isModifierKey;\n    CodeMirror.lookupKey = lookupKey;\n    CodeMirror.normalizeKeyMap = normalizeKeyMap;\n    CodeMirror.StringStream = StringStream;\n    CodeMirror.SharedTextMarker = SharedTextMarker;\n    CodeMirror.TextMarker = TextMarker;\n    CodeMirror.LineWidget = LineWidget;\n    CodeMirror.e_preventDefault = e_preventDefault;\n    CodeMirror.e_stopPropagation = e_stopPropagation;\n    CodeMirror.e_stop = e_stop;\n    CodeMirror.addClass = addClass;\n    CodeMirror.contains = contains;\n    CodeMirror.rmClass = rmClass;\n    CodeMirror.keyNames = keyNames;\n  }\n\n  // EDITOR CONSTRUCTOR\n\n  defineOptions(CodeMirror);\n\n  addEditorMethods(CodeMirror);\n\n  // Set up methods on CodeMirror's prototype to redirect to the editor's document.\n  var dontDelegate = \"iter insert remove copy getEditor constructor\".split(\" \");\n  for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)\n    { CodeMirror.prototype[prop] = (function(method) {\n      return function() {return method.apply(this.doc, arguments)}\n    })(Doc.prototype[prop]); } }\n\n  eventMixin(Doc);\n  CodeMirror.inputStyles = {\"textarea\": TextareaInput, \"contenteditable\": ContentEditableInput};\n\n  // Extra arguments are stored as the mode's dependencies, which is\n  // used by (legacy) mechanisms like loadmode.js to automatically\n  // load a mode. (Preferred mechanism is the require/define calls.)\n  CodeMirror.defineMode = function(name/*, mode, …*/) {\n    if (!CodeMirror.defaults.mode && name != \"null\") { CodeMirror.defaults.mode = name; }\n    defineMode.apply(this, arguments);\n  };\n\n  CodeMirror.defineMIME = defineMIME;\n\n  // Minimal default mode.\n  CodeMirror.defineMode(\"null\", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); });\n  CodeMirror.defineMIME(\"text/plain\", \"null\");\n\n  // EXTENSIONS\n\n  CodeMirror.defineExtension = function (name, func) {\n    CodeMirror.prototype[name] = func;\n  };\n  CodeMirror.defineDocExtension = function (name, func) {\n    Doc.prototype[name] = func;\n  };\n\n  CodeMirror.fromTextArea = fromTextArea;\n\n  addLegacyProps(CodeMirror);\n\n  CodeMirror.version = \"5.41.0\";\n\n  return CodeMirror;\n\n})));\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/plugins/codemirror/mode/clike/clike.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nfunction Context(indented, column, type, info, align, prev) {\n  this.indented = indented;\n  this.column = column;\n  this.type = type;\n  this.info = info;\n  this.align = align;\n  this.prev = prev;\n}\nfunction pushContext(state, col, type, info) {\n  var indent = state.indented;\n  if (state.context && state.context.type == \"statement\" && type != \"statement\")\n    indent = state.context.indented;\n  return state.context = new Context(indent, col, type, info, null, state.context);\n}\nfunction popContext(state) {\n  var t = state.context.type;\n  if (t == \")\" || t == \"]\" || t == \"}\")\n    state.indented = state.context.indented;\n  return state.context = state.context.prev;\n}\n\nfunction typeBefore(stream, state, pos) {\n  if (state.prevToken == \"variable\" || state.prevToken == \"type\") return true;\n  if (/\\S(?:[^- ]>|[*\\]])\\s*$|\\*$/.test(stream.string.slice(0, pos))) return true;\n  if (state.typeAtEndOfLine && stream.column() == stream.indentation()) return true;\n}\n\nfunction isTopScope(context) {\n  for (;;) {\n    if (!context || context.type == \"top\") return true;\n    if (context.type == \"}\" && context.prev.info != \"namespace\") return false;\n    context = context.prev;\n  }\n}\n\nCodeMirror.defineMode(\"clike\", function(config, parserConfig) {\n  var indentUnit = config.indentUnit,\n      statementIndentUnit = parserConfig.statementIndentUnit || indentUnit,\n      dontAlignCalls = parserConfig.dontAlignCalls,\n      keywords = parserConfig.keywords || {},\n      types = parserConfig.types || {},\n      builtin = parserConfig.builtin || {},\n      blockKeywords = parserConfig.blockKeywords || {},\n      defKeywords = parserConfig.defKeywords || {},\n      atoms = parserConfig.atoms || {},\n      hooks = parserConfig.hooks || {},\n      multiLineStrings = parserConfig.multiLineStrings,\n      indentStatements = parserConfig.indentStatements !== false,\n      indentSwitch = parserConfig.indentSwitch !== false,\n      namespaceSeparator = parserConfig.namespaceSeparator,\n      isPunctuationChar = parserConfig.isPunctuationChar || /[\\[\\]{}\\(\\),;\\:\\.]/,\n      numberStart = parserConfig.numberStart || /[\\d\\.]/,\n      number = parserConfig.number || /^(?:0x[a-f\\d]+|0b[01]+|(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?)(u|ll?|l|f)?/i,\n      isOperatorChar = parserConfig.isOperatorChar || /[+\\-*&%=<>!?|\\/]/,\n      isIdentifierChar = parserConfig.isIdentifierChar || /[\\w\\$_\\xa1-\\uffff]/,\n      // An optional function that takes a {string} token and returns true if it\n      // should be treated as a builtin.\n      isReservedIdentifier = parserConfig.isReservedIdentifier || false;\n\n  var curPunc, isDefKeyword;\n\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (hooks[ch]) {\n      var result = hooks[ch](stream, state);\n      if (result !== false) return result;\n    }\n    if (ch == '\"' || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    }\n    if (isPunctuationChar.test(ch)) {\n      curPunc = ch;\n      return null;\n    }\n    if (numberStart.test(ch)) {\n      stream.backUp(1)\n      if (stream.match(number)) return \"number\"\n      stream.next()\n    }\n    if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      }\n      if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return \"comment\";\n      }\n    }\n    if (isOperatorChar.test(ch)) {\n      while (!stream.match(/^\\/[\\/*]/, false) && stream.eat(isOperatorChar)) {}\n      return \"operator\";\n    }\n    stream.eatWhile(isIdentifierChar);\n    if (namespaceSeparator) while (stream.match(namespaceSeparator))\n      stream.eatWhile(isIdentifierChar);\n\n    var cur = stream.current();\n    if (contains(keywords, cur)) {\n      if (contains(blockKeywords, cur)) curPunc = \"newstatement\";\n      if (contains(defKeywords, cur)) isDefKeyword = true;\n      return \"keyword\";\n    }\n    if (contains(types, cur)) return \"type\";\n    if (contains(builtin, cur)\n        || (isReservedIdentifier && isReservedIdentifier(cur))) {\n      if (contains(blockKeywords, cur)) curPunc = \"newstatement\";\n      return \"builtin\";\n    }\n    if (contains(atoms, cur)) return \"atom\";\n    return \"variable\";\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) {end = true; break;}\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (end || !(escaped || multiLineStrings))\n        state.tokenize = null;\n      return \"string\";\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = null;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return \"comment\";\n  }\n\n  function maybeEOL(stream, state) {\n    if (parserConfig.typeFirstDefinitions && stream.eol() && isTopScope(state.context))\n      state.typeAtEndOfLine = typeBefore(stream, state, stream.pos)\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      return {\n        tokenize: null,\n        context: new Context((basecolumn || 0) - indentUnit, 0, \"top\", null, false),\n        indented: 0,\n        startOfLine: true,\n        prevToken: null\n      };\n    },\n\n    token: function(stream, state) {\n      var ctx = state.context;\n      if (stream.sol()) {\n        if (ctx.align == null) ctx.align = false;\n        state.indented = stream.indentation();\n        state.startOfLine = true;\n      }\n      if (stream.eatSpace()) { maybeEOL(stream, state); return null; }\n      curPunc = isDefKeyword = null;\n      var style = (state.tokenize || tokenBase)(stream, state);\n      if (style == \"comment\" || style == \"meta\") return style;\n      if (ctx.align == null) ctx.align = true;\n\n      if (curPunc == \";\" || curPunc == \":\" || (curPunc == \",\" && stream.match(/^\\s*(?:\\/\\/.*)?$/, false)))\n        while (state.context.type == \"statement\") popContext(state);\n      else if (curPunc == \"{\") pushContext(state, stream.column(), \"}\");\n      else if (curPunc == \"[\") pushContext(state, stream.column(), \"]\");\n      else if (curPunc == \"(\") pushContext(state, stream.column(), \")\");\n      else if (curPunc == \"}\") {\n        while (ctx.type == \"statement\") ctx = popContext(state);\n        if (ctx.type == \"}\") ctx = popContext(state);\n        while (ctx.type == \"statement\") ctx = popContext(state);\n      }\n      else if (curPunc == ctx.type) popContext(state);\n      else if (indentStatements &&\n               (((ctx.type == \"}\" || ctx.type == \"top\") && curPunc != \";\") ||\n                (ctx.type == \"statement\" && curPunc == \"newstatement\"))) {\n        pushContext(state, stream.column(), \"statement\", stream.current());\n      }\n\n      if (style == \"variable\" &&\n          ((state.prevToken == \"def\" ||\n            (parserConfig.typeFirstDefinitions && typeBefore(stream, state, stream.start) &&\n             isTopScope(state.context) && stream.match(/^\\s*\\(/, false)))))\n        style = \"def\";\n\n      if (hooks.token) {\n        var result = hooks.token(stream, state, style);\n        if (result !== undefined) style = result;\n      }\n\n      if (style == \"def\" && parserConfig.styleDefs === false) style = \"variable\";\n\n      state.startOfLine = false;\n      state.prevToken = isDefKeyword ? \"def\" : style || curPunc;\n      maybeEOL(stream, state);\n      return style;\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize != tokenBase && state.tokenize != null || state.typeAtEndOfLine) return CodeMirror.Pass;\n      var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);\n      var closing = firstChar == ctx.type;\n      if (ctx.type == \"statement\" && firstChar == \"}\") ctx = ctx.prev;\n      if (parserConfig.dontIndentStatements)\n        while (ctx.type == \"statement\" && parserConfig.dontIndentStatements.test(ctx.info))\n          ctx = ctx.prev\n      if (hooks.indent) {\n        var hook = hooks.indent(state, ctx, textAfter, indentUnit);\n        if (typeof hook == \"number\") return hook\n      }\n      var switchBlock = ctx.prev && ctx.prev.info == \"switch\";\n      if (parserConfig.allmanIndentation && /[{(]/.test(firstChar)) {\n        while (ctx.type != \"top\" && ctx.type != \"}\") ctx = ctx.prev\n        return ctx.indented\n      }\n      if (ctx.type == \"statement\")\n        return ctx.indented + (firstChar == \"{\" ? 0 : statementIndentUnit);\n      if (ctx.align && (!dontAlignCalls || ctx.type != \")\"))\n        return ctx.column + (closing ? 0 : 1);\n      if (ctx.type == \")\" && !closing)\n        return ctx.indented + statementIndentUnit;\n\n      return ctx.indented + (closing ? 0 : indentUnit) +\n        (!closing && switchBlock && !/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 0);\n    },\n\n    electricInput: indentSwitch ? /^\\s*(?:case .*?:|default:|\\{\\}?|\\})$/ : /^\\s*[{}]$/,\n    blockCommentStart: \"/*\",\n    blockCommentEnd: \"*/\",\n    blockCommentContinue: \" * \",\n    lineComment: \"//\",\n    fold: \"brace\"\n  };\n});\n\n  function words(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n  function contains(words, word) {\n    if (typeof words === \"function\") {\n      return words(word);\n    } else {\n      return words.propertyIsEnumerable(word);\n    }\n  }\n  var cKeywords = \"auto if break case register continue return default do sizeof \" +\n    \"static else struct switch extern typedef union for goto while enum const \" +\n    \"volatile inline restrict asm fortran\";\n\n  // Do not use this. Use the cTypes function below. This is global just to avoid\n  // excessive calls when cTypes is being called multiple times during a parse.\n  var basicCTypes = words(\"int long char short double float unsigned signed \" +\n    \"void bool\");\n\n  // Do not use this. Use the objCTypes function below. This is global just to avoid\n  // excessive calls when objCTypes is being called multiple times during a parse.\n  var basicObjCTypes = words(\"SEL instancetype id Class Protocol BOOL\");\n\n  // Returns true if identifier is a \"C\" type.\n  // C type is defined as those that are reserved by the compiler (basicTypes),\n  // and those that end in _t (Reserved by POSIX for types)\n  // http://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html\n  function cTypes(identifier) {\n    return contains(basicCTypes, identifier) || /.+_t/.test(identifier);\n  }\n\n  // Returns true if identifier is a \"Objective C\" type.\n  function objCTypes(identifier) {\n    return cTypes(identifier) || contains(basicObjCTypes, identifier);\n  }\n\n  var cBlockKeywords = \"case do else for if switch while struct enum union\";\n  var cDefKeywords = \"struct enum union\";\n\n  function cppHook(stream, state) {\n    if (!state.startOfLine) return false\n    for (var ch, next = null; ch = stream.peek();) {\n      if (ch == \"\\\\\" && stream.match(/^.$/)) {\n        next = cppHook\n        break\n      } else if (ch == \"/\" && stream.match(/^\\/[\\/\\*]/, false)) {\n        break\n      }\n      stream.next()\n    }\n    state.tokenize = next\n    return \"meta\"\n  }\n\n  function pointerHook(_stream, state) {\n    if (state.prevToken == \"type\") return \"type\";\n    return false;\n  }\n\n  // For C and C++ (and ObjC): identifiers starting with __\n  // or _ followed by a capital letter are reserved for the compiler.\n  function cIsReservedIdentifier(token) {\n    if (!token || token.length < 2) return false;\n    if (token[0] != '_') return false;\n    return (token[1] == '_') || (token[1] !== token[1].toLowerCase());\n  }\n\n  function cpp14Literal(stream) {\n    stream.eatWhile(/[\\w\\.']/);\n    return \"number\";\n  }\n\n  function cpp11StringHook(stream, state) {\n    stream.backUp(1);\n    // Raw strings.\n    if (stream.match(/(R|u8R|uR|UR|LR)/)) {\n      var match = stream.match(/\"([^\\s\\\\()]{0,16})\\(/);\n      if (!match) {\n        return false;\n      }\n      state.cpp11RawStringDelim = match[1];\n      state.tokenize = tokenRawString;\n      return tokenRawString(stream, state);\n    }\n    // Unicode strings/chars.\n    if (stream.match(/(u8|u|U|L)/)) {\n      if (stream.match(/[\"']/, /* eat */ false)) {\n        return \"string\";\n      }\n      return false;\n    }\n    // Ignore this hook.\n    stream.next();\n    return false;\n  }\n\n  function cppLooksLikeConstructor(word) {\n    var lastTwo = /(\\w+)::~?(\\w+)$/.exec(word);\n    return lastTwo && lastTwo[1] == lastTwo[2];\n  }\n\n  // C#-style strings where \"\" escapes a quote.\n  function tokenAtString(stream, state) {\n    var next;\n    while ((next = stream.next()) != null) {\n      if (next == '\"' && !stream.eat('\"')) {\n        state.tokenize = null;\n        break;\n      }\n    }\n    return \"string\";\n  }\n\n  // C++11 raw string literal is <prefix>\"<delim>( anything )<delim>\", where\n  // <delim> can be a string up to 16 characters long.\n  function tokenRawString(stream, state) {\n    // Escape characters that have special regex meanings.\n    var delim = state.cpp11RawStringDelim.replace(/[^\\w\\s]/g, '\\\\$&');\n    var match = stream.match(new RegExp(\".*?\\\\)\" + delim + '\"'));\n    if (match)\n      state.tokenize = null;\n    else\n      stream.skipToEnd();\n    return \"string\";\n  }\n\n  function def(mimes, mode) {\n    if (typeof mimes == \"string\") mimes = [mimes];\n    var words = [];\n    function add(obj) {\n      if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop))\n        words.push(prop);\n    }\n    add(mode.keywords);\n    add(mode.types);\n    add(mode.builtin);\n    add(mode.atoms);\n    if (words.length) {\n      mode.helperType = mimes[0];\n      CodeMirror.registerHelper(\"hintWords\", mimes[0], words);\n    }\n\n    for (var i = 0; i < mimes.length; ++i)\n      CodeMirror.defineMIME(mimes[i], mode);\n  }\n\n  def([\"text/x-csrc\", \"text/x-c\", \"text/x-chdr\"], {\n    name: \"clike\",\n    keywords: words(cKeywords),\n    types: cTypes,\n    blockKeywords: words(cBlockKeywords),\n    defKeywords: words(cDefKeywords),\n    typeFirstDefinitions: true,\n    atoms: words(\"NULL true false\"),\n    isReservedIdentifier: cIsReservedIdentifier,\n    hooks: {\n      \"#\": cppHook,\n      \"*\": pointerHook,\n    },\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  def([\"text/x-c++src\", \"text/x-c++hdr\"], {\n    name: \"clike\",\n    keywords: words(cKeywords + \" dynamic_cast namespace reinterpret_cast try explicit new \" +\n                    \"static_cast typeid catch operator template typename class friend private \" +\n                    \"this using const_cast public throw virtual delete mutable protected \" +\n                    \"alignas alignof constexpr decltype nullptr noexcept thread_local final \" +\n                    \"static_assert override\"),\n    types: cTypes,\n    blockKeywords: words(cBlockKeywords +\" class try catch finally\"),\n    defKeywords: words(cDefKeywords + \" class namespace\"),\n    typeFirstDefinitions: true,\n    atoms: words(\"true false NULL\"),\n    dontIndentStatements: /^template$/,\n    isIdentifierChar: /[\\w\\$_~\\xa1-\\uffff]/,\n    isReservedIdentifier: cIsReservedIdentifier,\n    hooks: {\n      \"#\": cppHook,\n      \"*\": pointerHook,\n      \"u\": cpp11StringHook,\n      \"U\": cpp11StringHook,\n      \"L\": cpp11StringHook,\n      \"R\": cpp11StringHook,\n      \"0\": cpp14Literal,\n      \"1\": cpp14Literal,\n      \"2\": cpp14Literal,\n      \"3\": cpp14Literal,\n      \"4\": cpp14Literal,\n      \"5\": cpp14Literal,\n      \"6\": cpp14Literal,\n      \"7\": cpp14Literal,\n      \"8\": cpp14Literal,\n      \"9\": cpp14Literal,\n      token: function(stream, state, style) {\n        if (style == \"variable\" && stream.peek() == \"(\" &&\n            (state.prevToken == \";\" || state.prevToken == null ||\n             state.prevToken == \"}\") &&\n            cppLooksLikeConstructor(stream.current()))\n          return \"def\";\n      }\n    },\n    namespaceSeparator: \"::\",\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  def(\"text/x-java\", {\n    name: \"clike\",\n    keywords: words(\"abstract assert break case catch class const continue default \" +\n                    \"do else enum extends final finally float for goto if implements import \" +\n                    \"instanceof interface native new package private protected public \" +\n                    \"return static strictfp super switch synchronized this throw throws transient \" +\n                    \"try volatile while @interface\"),\n    types: words(\"byte short int long float double boolean char void Boolean Byte Character Double Float \" +\n                 \"Integer Long Number Object Short String StringBuffer StringBuilder Void\"),\n    blockKeywords: words(\"catch class do else finally for if switch try while\"),\n    defKeywords: words(\"class interface enum @interface\"),\n    typeFirstDefinitions: true,\n    atoms: words(\"true false null\"),\n    number: /^(?:0x[a-f\\d_]+|0b[01_]+|(?:[\\d_]+\\.?\\d*|\\.\\d+)(?:e[-+]?[\\d_]+)?)(u|ll?|l|f)?/i,\n    hooks: {\n      \"@\": function(stream) {\n        // Don't match the @interface keyword.\n        if (stream.match('interface', false)) return false;\n\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"meta\";\n      }\n    },\n    modeProps: {fold: [\"brace\", \"import\"]}\n  });\n\n  def(\"text/x-csharp\", {\n    name: \"clike\",\n    keywords: words(\"abstract as async await base break case catch checked class const continue\" +\n                    \" default delegate do else enum event explicit extern finally fixed for\" +\n                    \" foreach goto if implicit in interface internal is lock namespace new\" +\n                    \" operator out override params private protected public readonly ref return sealed\" +\n                    \" sizeof stackalloc static struct switch this throw try typeof unchecked\" +\n                    \" unsafe using virtual void volatile while add alias ascending descending dynamic from get\" +\n                    \" global group into join let orderby partial remove select set value var yield\"),\n    types: words(\"Action Boolean Byte Char DateTime DateTimeOffset Decimal Double Func\" +\n                 \" Guid Int16 Int32 Int64 Object SByte Single String Task TimeSpan UInt16 UInt32\" +\n                 \" UInt64 bool byte char decimal double short int long object\"  +\n                 \" sbyte float string ushort uint ulong\"),\n    blockKeywords: words(\"catch class do else finally for foreach if struct switch try while\"),\n    defKeywords: words(\"class interface namespace struct var\"),\n    typeFirstDefinitions: true,\n    atoms: words(\"true false null\"),\n    hooks: {\n      \"@\": function(stream, state) {\n        if (stream.eat('\"')) {\n          state.tokenize = tokenAtString;\n          return tokenAtString(stream, state);\n        }\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"meta\";\n      }\n    }\n  });\n\n  function tokenTripleString(stream, state) {\n    var escaped = false;\n    while (!stream.eol()) {\n      if (!escaped && stream.match('\"\"\"')) {\n        state.tokenize = null;\n        break;\n      }\n      escaped = stream.next() == \"\\\\\" && !escaped;\n    }\n    return \"string\";\n  }\n\n  function tokenNestedComment(depth) {\n    return function (stream, state) {\n      var ch\n      while (ch = stream.next()) {\n        if (ch == \"*\" && stream.eat(\"/\")) {\n          if (depth == 1) {\n            state.tokenize = null\n            break\n          } else {\n            state.tokenize = tokenNestedComment(depth - 1)\n            return state.tokenize(stream, state)\n          }\n        } else if (ch == \"/\" && stream.eat(\"*\")) {\n          state.tokenize = tokenNestedComment(depth + 1)\n          return state.tokenize(stream, state)\n        }\n      }\n      return \"comment\"\n    }\n  }\n\n  def(\"text/x-scala\", {\n    name: \"clike\",\n    keywords: words(\n      /* scala */\n      \"abstract case catch class def do else extends final finally for forSome if \" +\n      \"implicit import lazy match new null object override package private protected return \" +\n      \"sealed super this throw trait try type val var while with yield _ \" +\n\n      /* package scala */\n      \"assert assume require print println printf readLine readBoolean readByte readShort \" +\n      \"readChar readInt readLong readFloat readDouble\"\n    ),\n    types: words(\n      \"AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either \" +\n      \"Enumeration Equiv Error Exception Fractional Function IndexedSeq Int Integral Iterable \" +\n      \"Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering \" +\n      \"Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder \" +\n      \"StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector \" +\n\n      /* package java.lang */\n      \"Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable \" +\n      \"Compiler Double Exception Float Integer Long Math Number Object Package Pair Process \" +\n      \"Runtime Runnable SecurityManager Short StackTraceElement StrictMath String \" +\n      \"StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void\"\n    ),\n    multiLineStrings: true,\n    blockKeywords: words(\"catch class enum do else finally for forSome if match switch try while\"),\n    defKeywords: words(\"class enum def object package trait type val var\"),\n    atoms: words(\"true false null\"),\n    indentStatements: false,\n    indentSwitch: false,\n    isOperatorChar: /[+\\-*&%=<>!?|\\/#:@]/,\n    hooks: {\n      \"@\": function(stream) {\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"meta\";\n      },\n      '\"': function(stream, state) {\n        if (!stream.match('\"\"')) return false;\n        state.tokenize = tokenTripleString;\n        return state.tokenize(stream, state);\n      },\n      \"'\": function(stream) {\n        stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n        return \"atom\";\n      },\n      \"=\": function(stream, state) {\n        var cx = state.context\n        if (cx.type == \"}\" && cx.align && stream.eat(\">\")) {\n          state.context = new Context(cx.indented, cx.column, cx.type, cx.info, null, cx.prev)\n          return \"operator\"\n        } else {\n          return false\n        }\n      },\n\n      \"/\": function(stream, state) {\n        if (!stream.eat(\"*\")) return false\n        state.tokenize = tokenNestedComment(1)\n        return state.tokenize(stream, state)\n      }\n    },\n    modeProps: {closeBrackets: {pairs: '()[]{}\"\"', triples: '\"'}}\n  });\n\n  function tokenKotlinString(tripleString){\n    return function (stream, state) {\n      var escaped = false, next, end = false;\n      while (!stream.eol()) {\n        if (!tripleString && !escaped && stream.match('\"') ) {end = true; break;}\n        if (tripleString && stream.match('\"\"\"')) {end = true; break;}\n        next = stream.next();\n        if(!escaped && next == \"$\" && stream.match('{'))\n          stream.skipTo(\"}\");\n        escaped = !escaped && next == \"\\\\\" && !tripleString;\n      }\n      if (end || !tripleString)\n        state.tokenize = null;\n      return \"string\";\n    }\n  }\n\n  def(\"text/x-kotlin\", {\n    name: \"clike\",\n    keywords: words(\n      /*keywords*/\n      \"package as typealias class interface this super val operator \" +\n      \"var fun for is in This throw return annotation \" +\n      \"break continue object if else while do try when !in !is as? \" +\n\n      /*soft keywords*/\n      \"file import where by get set abstract enum open inner override private public internal \" +\n      \"protected catch finally out final vararg reified dynamic companion constructor init \" +\n      \"sealed field property receiver param sparam lateinit data inline noinline tailrec \" +\n      \"external annotation crossinline const operator infix suspend actual expect setparam\"\n    ),\n    types: words(\n      /* package java.lang */\n      \"Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable \" +\n      \"Compiler Double Exception Float Integer Long Math Number Object Package Pair Process \" +\n      \"Runtime Runnable SecurityManager Short StackTraceElement StrictMath String \" +\n      \"StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void Annotation Any BooleanArray \" +\n      \"ByteArray Char CharArray DeprecationLevel DoubleArray Enum FloatArray Function Int IntArray Lazy \" +\n      \"LazyThreadSafetyMode LongArray Nothing ShortArray Unit\"\n    ),\n    intendSwitch: false,\n    indentStatements: false,\n    multiLineStrings: true,\n    number: /^(?:0x[a-f\\d_]+|0b[01_]+|(?:[\\d_]+(\\.\\d+)?|\\.\\d+)(?:e[-+]?[\\d_]+)?)(u|ll?|l|f)?/i,\n    blockKeywords: words(\"catch class do else finally for if where try while enum\"),\n    defKeywords: words(\"class val var object interface fun\"),\n    atoms: words(\"true false null this\"),\n    hooks: {\n      \"@\": function(stream) {\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"meta\";\n      },\n      '\"': function(stream, state) {\n        state.tokenize = tokenKotlinString(stream.match('\"\"'));\n        return state.tokenize(stream, state);\n      },\n      indent: function(state, ctx, textAfter, indentUnit) {\n        var firstChar = textAfter && textAfter.charAt(0);\n        if ((state.prevToken == \"}\" || state.prevToken == \")\") && textAfter == \"\")\n          return state.indented;\n        if (state.prevToken == \"operator\" && textAfter != \"}\" ||\n          state.prevToken == \"variable\" && firstChar == \".\" ||\n          (state.prevToken == \"}\" || state.prevToken == \")\") && firstChar == \".\")\n          return indentUnit * 2 + ctx.indented;\n        if (ctx.align && ctx.type == \"}\")\n          return ctx.indented + (state.context.type == (textAfter || \"\").charAt(0) ? 0 : indentUnit);\n      }\n    },\n    modeProps: {closeBrackets: {triples: '\"'}}\n  });\n\n  def([\"x-shader/x-vertex\", \"x-shader/x-fragment\"], {\n    name: \"clike\",\n    keywords: words(\"sampler1D sampler2D sampler3D samplerCube \" +\n                    \"sampler1DShadow sampler2DShadow \" +\n                    \"const attribute uniform varying \" +\n                    \"break continue discard return \" +\n                    \"for while do if else struct \" +\n                    \"in out inout\"),\n    types: words(\"float int bool void \" +\n                 \"vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 \" +\n                 \"mat2 mat3 mat4\"),\n    blockKeywords: words(\"for while do if else struct\"),\n    builtin: words(\"radians degrees sin cos tan asin acos atan \" +\n                    \"pow exp log exp2 sqrt inversesqrt \" +\n                    \"abs sign floor ceil fract mod min max clamp mix step smoothstep \" +\n                    \"length distance dot cross normalize ftransform faceforward \" +\n                    \"reflect refract matrixCompMult \" +\n                    \"lessThan lessThanEqual greaterThan greaterThanEqual \" +\n                    \"equal notEqual any all not \" +\n                    \"texture1D texture1DProj texture1DLod texture1DProjLod \" +\n                    \"texture2D texture2DProj texture2DLod texture2DProjLod \" +\n                    \"texture3D texture3DProj texture3DLod texture3DProjLod \" +\n                    \"textureCube textureCubeLod \" +\n                    \"shadow1D shadow2D shadow1DProj shadow2DProj \" +\n                    \"shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod \" +\n                    \"dFdx dFdy fwidth \" +\n                    \"noise1 noise2 noise3 noise4\"),\n    atoms: words(\"true false \" +\n                \"gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex \" +\n                \"gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 \" +\n                \"gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 \" +\n                \"gl_FogCoord gl_PointCoord \" +\n                \"gl_Position gl_PointSize gl_ClipVertex \" +\n                \"gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor \" +\n                \"gl_TexCoord gl_FogFragCoord \" +\n                \"gl_FragCoord gl_FrontFacing \" +\n                \"gl_FragData gl_FragDepth \" +\n                \"gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix \" +\n                \"gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse \" +\n                \"gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse \" +\n                \"gl_TexureMatrixTranspose gl_ModelViewMatrixInverseTranspose \" +\n                \"gl_ProjectionMatrixInverseTranspose \" +\n                \"gl_ModelViewProjectionMatrixInverseTranspose \" +\n                \"gl_TextureMatrixInverseTranspose \" +\n                \"gl_NormalScale gl_DepthRange gl_ClipPlane \" +\n                \"gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel \" +\n                \"gl_FrontLightModelProduct gl_BackLightModelProduct \" +\n                \"gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ \" +\n                \"gl_FogParameters \" +\n                \"gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords \" +\n                \"gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats \" +\n                \"gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits \" +\n                \"gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits \" +\n                \"gl_MaxDrawBuffers\"),\n    indentSwitch: false,\n    hooks: {\"#\": cppHook},\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  def(\"text/x-nesc\", {\n    name: \"clike\",\n    keywords: words(cKeywords + \" as atomic async call command component components configuration event generic \" +\n                    \"implementation includes interface module new norace nx_struct nx_union post provides \" +\n                    \"signal task uses abstract extends\"),\n    types: cTypes,\n    blockKeywords: words(cBlockKeywords),\n    atoms: words(\"null true false\"),\n    hooks: {\"#\": cppHook},\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  def(\"text/x-objectivec\", {\n    name: \"clike\",\n    keywords: words(cKeywords + \" bycopy byref in inout oneway out self super atomic nonatomic retain copy \" +\n                    \"readwrite readonly strong weak assign typeof nullable nonnull null_resettable _cmd \" +\n                    \"@interface @implementation @end @protocol @encode @property @synthesize @dynamic @class \" +\n                    \"@public @package @private @protected @required @optional @try @catch @finally @import \" +\n                    \"@selector @encode @defs @synchronized @autoreleasepool @compatibility_alias @available\"),\n    types: objCTypes,\n    builtin: words(\"FOUNDATION_EXPORT FOUNDATION_EXTERN NS_INLINE NS_FORMAT_FUNCTION NS_RETURNS_RETAINED \" +\n                   \"NS_ERROR_ENUM NS_RETURNS_NOT_RETAINED NS_RETURNS_INNER_POINTER NS_DESIGNATED_INITIALIZER \" +\n                   \"NS_ENUM NS_OPTIONS NS_REQUIRES_NIL_TERMINATION NS_ASSUME_NONNULL_BEGIN \" +\n                   \"NS_ASSUME_NONNULL_END NS_SWIFT_NAME NS_REFINED_FOR_SWIFT\"),\n    blockKeywords: words(cBlockKeywords + \" @synthesize @try @catch @finally @autoreleasepool @synchronized\"),\n    defKeywords: words(cDefKeywords + \" @interface @implementation @protocol @class\"),\n    dontIndentStatements: /^@.*$/,\n    typeFirstDefinitions: true,\n    atoms: words(\"YES NO NULL Nil nil true false nullptr\"),\n    isReservedIdentifier: cIsReservedIdentifier,\n    hooks: {\n      \"#\": cppHook,\n      \"*\": pointerHook,\n    },\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  def(\"text/x-squirrel\", {\n    name: \"clike\",\n    keywords: words(\"base break clone continue const default delete enum extends function in class\" +\n                    \" foreach local resume return this throw typeof yield constructor instanceof static\"),\n    types: cTypes,\n    blockKeywords: words(\"case catch class else for foreach if switch try while\"),\n    defKeywords: words(\"function local class\"),\n    typeFirstDefinitions: true,\n    atoms: words(\"true false null\"),\n    hooks: {\"#\": cppHook},\n    modeProps: {fold: [\"brace\", \"include\"]}\n  });\n\n  // Ceylon Strings need to deal with interpolation\n  var stringTokenizer = null;\n  function tokenCeylonString(type) {\n    return function(stream, state) {\n      var escaped = false, next, end = false;\n      while (!stream.eol()) {\n        if (!escaped && stream.match('\"') &&\n              (type == \"single\" || stream.match('\"\"'))) {\n          end = true;\n          break;\n        }\n        if (!escaped && stream.match('``')) {\n          stringTokenizer = tokenCeylonString(type);\n          end = true;\n          break;\n        }\n        next = stream.next();\n        escaped = type == \"single\" && !escaped && next == \"\\\\\";\n      }\n      if (end)\n          state.tokenize = null;\n      return \"string\";\n    }\n  }\n\n  def(\"text/x-ceylon\", {\n    name: \"clike\",\n    keywords: words(\"abstracts alias assembly assert assign break case catch class continue dynamic else\" +\n                    \" exists extends finally for function given if import in interface is let module new\" +\n                    \" nonempty object of out outer package return satisfies super switch then this throw\" +\n                    \" try value void while\"),\n    types: function(word) {\n        // In Ceylon all identifiers that start with an uppercase are types\n        var first = word.charAt(0);\n        return (first === first.toUpperCase() && first !== first.toLowerCase());\n    },\n    blockKeywords: words(\"case catch class dynamic else finally for function if interface module new object switch try while\"),\n    defKeywords: words(\"class dynamic function interface module object package value\"),\n    builtin: words(\"abstract actual aliased annotation by default deprecated doc final formal late license\" +\n                   \" native optional sealed see serializable shared suppressWarnings tagged throws variable\"),\n    isPunctuationChar: /[\\[\\]{}\\(\\),;\\:\\.`]/,\n    isOperatorChar: /[+\\-*&%=<>!?|^~:\\/]/,\n    numberStart: /[\\d#$]/,\n    number: /^(?:#[\\da-fA-F_]+|\\$[01_]+|[\\d_]+[kMGTPmunpf]?|[\\d_]+\\.[\\d_]+(?:[eE][-+]?\\d+|[kMGTPmunpf]|)|)/i,\n    multiLineStrings: true,\n    typeFirstDefinitions: true,\n    atoms: words(\"true false null larger smaller equal empty finished\"),\n    indentSwitch: false,\n    styleDefs: false,\n    hooks: {\n      \"@\": function(stream) {\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"meta\";\n      },\n      '\"': function(stream, state) {\n          state.tokenize = tokenCeylonString(stream.match('\"\"') ? \"triple\" : \"single\");\n          return state.tokenize(stream, state);\n        },\n      '`': function(stream, state) {\n          if (!stringTokenizer || !stream.match('`')) return false;\n          state.tokenize = stringTokenizer;\n          stringTokenizer = null;\n          return state.tokenize(stream, state);\n        },\n      \"'\": function(stream) {\n        stream.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);\n        return \"atom\";\n      },\n      token: function(_stream, state, style) {\n          if ((style == \"variable\" || style == \"type\") &&\n              state.prevToken == \".\") {\n            return \"variable-2\";\n          }\n        }\n    },\n    modeProps: {\n        fold: [\"brace\", \"import\"],\n        closeBrackets: {triples: '\"'}\n    }\n  });\n\n});\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/plugins/codemirror/mode/javascript/javascript.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"javascript\", function(config, parserConfig) {\n  var indentUnit = config.indentUnit;\n  var statementIndent = parserConfig.statementIndent;\n  var jsonldMode = parserConfig.jsonld;\n  var jsonMode = parserConfig.json || jsonldMode;\n  var isTS = parserConfig.typescript;\n  var wordRE = parserConfig.wordCharacters || /[\\w$\\xa1-\\uffff]/;\n\n  // Tokenizer\n\n  var keywords = function(){\n    function kw(type) {return {type: type, style: \"keyword\"};}\n    var A = kw(\"keyword a\"), B = kw(\"keyword b\"), C = kw(\"keyword c\"), D = kw(\"keyword d\");\n    var operator = kw(\"operator\"), atom = {type: \"atom\", style: \"atom\"};\n\n    return {\n      \"if\": kw(\"if\"), \"while\": A, \"with\": A, \"else\": B, \"do\": B, \"try\": B, \"finally\": B,\n      \"return\": D, \"break\": D, \"continue\": D, \"new\": kw(\"new\"), \"delete\": C, \"void\": C, \"throw\": C,\n      \"debugger\": kw(\"debugger\"), \"var\": kw(\"var\"), \"const\": kw(\"var\"), \"let\": kw(\"var\"),\n      \"function\": kw(\"function\"), \"catch\": kw(\"catch\"),\n      \"for\": kw(\"for\"), \"switch\": kw(\"switch\"), \"case\": kw(\"case\"), \"default\": kw(\"default\"),\n      \"in\": operator, \"typeof\": operator, \"instanceof\": operator,\n      \"true\": atom, \"false\": atom, \"null\": atom, \"undefined\": atom, \"NaN\": atom, \"Infinity\": atom,\n      \"this\": kw(\"this\"), \"class\": kw(\"class\"), \"super\": kw(\"atom\"),\n      \"yield\": C, \"export\": kw(\"export\"), \"import\": kw(\"import\"), \"extends\": C,\n      \"await\": C\n    };\n  }();\n\n  var isOperatorChar = /[+\\-*&%=<>!?|~^@]/;\n  var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)\"/;\n\n  function readRegexp(stream) {\n    var escaped = false, next, inSet = false;\n    while ((next = stream.next()) != null) {\n      if (!escaped) {\n        if (next == \"/\" && !inSet) return;\n        if (next == \"[\") inSet = true;\n        else if (inSet && next == \"]\") inSet = false;\n      }\n      escaped = !escaped && next == \"\\\\\";\n    }\n  }\n\n  // Used as scratch variables to communicate multiple values without\n  // consing up tons of objects.\n  var type, content;\n  function ret(tp, style, cont) {\n    type = tp; content = cont;\n    return style;\n  }\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (ch == '\"' || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    } else if (ch == \".\" && stream.match(/^\\d+(?:[eE][+\\-]?\\d+)?/)) {\n      return ret(\"number\", \"number\");\n    } else if (ch == \".\" && stream.match(\"..\")) {\n      return ret(\"spread\", \"meta\");\n    } else if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n      return ret(ch);\n    } else if (ch == \"=\" && stream.eat(\">\")) {\n      return ret(\"=>\", \"operator\");\n    } else if (ch == \"0\" && stream.match(/^(?:x[\\da-f]+|o[0-7]+|b[01]+)n?/i)) {\n      return ret(\"number\", \"number\");\n    } else if (/\\d/.test(ch)) {\n      stream.match(/^\\d*(?:n|(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)?/);\n      return ret(\"number\", \"number\");\n    } else if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      } else if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return ret(\"comment\", \"comment\");\n      } else if (expressionAllowed(stream, state, 1)) {\n        readRegexp(stream);\n        stream.match(/^\\b(([gimyus])(?![gimyus]*\\2))+\\b/);\n        return ret(\"regexp\", \"string-2\");\n      } else {\n        stream.eat(\"=\");\n        return ret(\"operator\", \"operator\", stream.current());\n      }\n    } else if (ch == \"`\") {\n      state.tokenize = tokenQuasi;\n      return tokenQuasi(stream, state);\n    } else if (ch == \"#\") {\n      stream.skipToEnd();\n      return ret(\"error\", \"error\");\n    } else if (isOperatorChar.test(ch)) {\n      if (ch != \">\" || !state.lexical || state.lexical.type != \">\") {\n        if (stream.eat(\"=\")) {\n          if (ch == \"!\" || ch == \"=\") stream.eat(\"=\")\n        } else if (/[<>*+\\-]/.test(ch)) {\n          stream.eat(ch)\n          if (ch == \">\") stream.eat(ch)\n        }\n      }\n      return ret(\"operator\", \"operator\", stream.current());\n    } else if (wordRE.test(ch)) {\n      stream.eatWhile(wordRE);\n      var word = stream.current()\n      if (state.lastType != \".\") {\n        if (keywords.propertyIsEnumerable(word)) {\n          var kw = keywords[word]\n          return ret(kw.type, kw.style, word)\n        }\n        if (word == \"async\" && stream.match(/^(\\s|\\/\\*.*?\\*\\/)*[\\[\\(\\w]/, false))\n          return ret(\"async\", \"keyword\", word)\n      }\n      return ret(\"variable\", \"variable\", word)\n    }\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next;\n      if (jsonldMode && stream.peek() == \"@\" && stream.match(isJsonldKeyword)){\n        state.tokenize = tokenBase;\n        return ret(\"jsonld-keyword\", \"meta\");\n      }\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) break;\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (!escaped) state.tokenize = tokenBase;\n      return ret(\"string\", \"string\");\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return ret(\"comment\", \"comment\");\n  }\n\n  function tokenQuasi(stream, state) {\n    var escaped = false, next;\n    while ((next = stream.next()) != null) {\n      if (!escaped && (next == \"`\" || next == \"$\" && stream.eat(\"{\"))) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      escaped = !escaped && next == \"\\\\\";\n    }\n    return ret(\"quasi\", \"string-2\", stream.current());\n  }\n\n  var brackets = \"([{}])\";\n  // This is a crude lookahead trick to try and notice that we're\n  // parsing the argument patterns for a fat-arrow function before we\n  // actually hit the arrow token. It only works if the arrow is on\n  // the same line as the arguments and there's no strange noise\n  // (comments) in between. Fallback is to only notice when we hit the\n  // arrow, and not declare the arguments as locals for the arrow\n  // body.\n  function findFatArrow(stream, state) {\n    if (state.fatArrowAt) state.fatArrowAt = null;\n    var arrow = stream.string.indexOf(\"=>\", stream.start);\n    if (arrow < 0) return;\n\n    if (isTS) { // Try to skip TypeScript return type declarations after the arguments\n      var m = /:\\s*(?:\\w+(?:<[^>]*>|\\[\\])?|\\{[^}]*\\})\\s*$/.exec(stream.string.slice(stream.start, arrow))\n      if (m) arrow = m.index\n    }\n\n    var depth = 0, sawSomething = false;\n    for (var pos = arrow - 1; pos >= 0; --pos) {\n      var ch = stream.string.charAt(pos);\n      var bracket = brackets.indexOf(ch);\n      if (bracket >= 0 && bracket < 3) {\n        if (!depth) { ++pos; break; }\n        if (--depth == 0) { if (ch == \"(\") sawSomething = true; break; }\n      } else if (bracket >= 3 && bracket < 6) {\n        ++depth;\n      } else if (wordRE.test(ch)) {\n        sawSomething = true;\n      } else if (/[\"'\\/]/.test(ch)) {\n        return;\n      } else if (sawSomething && !depth) {\n        ++pos;\n        break;\n      }\n    }\n    if (sawSomething && !depth) state.fatArrowAt = pos;\n  }\n\n  // Parser\n\n  var atomicTypes = {\"atom\": true, \"number\": true, \"variable\": true, \"string\": true, \"regexp\": true, \"this\": true, \"jsonld-keyword\": true};\n\n  function JSLexical(indented, column, type, align, prev, info) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.prev = prev;\n    this.info = info;\n    if (align != null) this.align = align;\n  }\n\n  function inScope(state, varname) {\n    for (var v = state.localVars; v; v = v.next)\n      if (v.name == varname) return true;\n    for (var cx = state.context; cx; cx = cx.prev) {\n      for (var v = cx.vars; v; v = v.next)\n        if (v.name == varname) return true;\n    }\n  }\n\n  function parseJS(state, style, type, content, stream) {\n    var cc = state.cc;\n    // Communicate our context to the combinators.\n    // (Less wasteful than consing up a hundred closures on every call.)\n    cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style;\n\n    if (!state.lexical.hasOwnProperty(\"align\"))\n      state.lexical.align = true;\n\n    while(true) {\n      var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;\n      if (combinator(type, content)) {\n        while(cc.length && cc[cc.length - 1].lex)\n          cc.pop()();\n        if (cx.marked) return cx.marked;\n        if (type == \"variable\" && inScope(state, content)) return \"variable-2\";\n        return style;\n      }\n    }\n  }\n\n  // Combinator utils\n\n  var cx = {state: null, column: null, marked: null, cc: null};\n  function pass() {\n    for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);\n  }\n  function cont() {\n    pass.apply(null, arguments);\n    return true;\n  }\n  function inList(name, list) {\n    for (var v = list; v; v = v.next) if (v.name == name) return true\n    return false;\n  }\n  function register(varname) {\n    var state = cx.state;\n    cx.marked = \"def\";\n    if (state.context) {\n      if (state.lexical.info == \"var\" && state.context && state.context.block) {\n        // FIXME function decls are also not block scoped\n        var newContext = registerVarScoped(varname, state.context)\n        if (newContext != null) {\n          state.context = newContext\n          return\n        }\n      } else if (!inList(varname, state.localVars)) {\n        state.localVars = new Var(varname, state.localVars)\n        return\n      }\n    }\n    // Fall through means this is global\n    if (parserConfig.globalVars && !inList(varname, state.globalVars))\n      state.globalVars = new Var(varname, state.globalVars)\n  }\n  function registerVarScoped(varname, context) {\n    if (!context) {\n      return null\n    } else if (context.block) {\n      var inner = registerVarScoped(varname, context.prev)\n      if (!inner) return null\n      if (inner == context.prev) return context\n      return new Context(inner, context.vars, true)\n    } else if (inList(varname, context.vars)) {\n      return context\n    } else {\n      return new Context(context.prev, new Var(varname, context.vars), false)\n    }\n  }\n\n  function isModifier(name) {\n    return name == \"public\" || name == \"private\" || name == \"protected\" || name == \"abstract\" || name == \"readonly\"\n  }\n\n  // Combinators\n\n  function Context(prev, vars, block) { this.prev = prev; this.vars = vars; this.block = block }\n  function Var(name, next) { this.name = name; this.next = next }\n\n  var defaultVars = new Var(\"this\", new Var(\"arguments\", null))\n  function pushcontext() {\n    cx.state.context = new Context(cx.state.context, cx.state.localVars, false)\n    cx.state.localVars = defaultVars\n  }\n  function pushblockcontext() {\n    cx.state.context = new Context(cx.state.context, cx.state.localVars, true)\n    cx.state.localVars = null\n  }\n  function popcontext() {\n    cx.state.localVars = cx.state.context.vars\n    cx.state.context = cx.state.context.prev\n  }\n  popcontext.lex = true\n  function pushlex(type, info) {\n    var result = function() {\n      var state = cx.state, indent = state.indented;\n      if (state.lexical.type == \"stat\") indent = state.lexical.indented;\n      else for (var outer = state.lexical; outer && outer.type == \")\" && outer.align; outer = outer.prev)\n        indent = outer.indented;\n      state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);\n    };\n    result.lex = true;\n    return result;\n  }\n  function poplex() {\n    var state = cx.state;\n    if (state.lexical.prev) {\n      if (state.lexical.type == \")\")\n        state.indented = state.lexical.indented;\n      state.lexical = state.lexical.prev;\n    }\n  }\n  poplex.lex = true;\n\n  function expect(wanted) {\n    function exp(type) {\n      if (type == wanted) return cont();\n      else if (wanted == \";\" || type == \"}\" || type == \")\" || type == \"]\") return pass();\n      else return cont(exp);\n    };\n    return exp;\n  }\n\n  function statement(type, value) {\n    if (type == \"var\") return cont(pushlex(\"vardef\", value), vardef, expect(\";\"), poplex);\n    if (type == \"keyword a\") return cont(pushlex(\"form\"), parenExpr, statement, poplex);\n    if (type == \"keyword b\") return cont(pushlex(\"form\"), statement, poplex);\n    if (type == \"keyword d\") return cx.stream.match(/^\\s*$/, false) ? cont() : cont(pushlex(\"stat\"), maybeexpression, expect(\";\"), poplex);\n    if (type == \"debugger\") return cont(expect(\";\"));\n    if (type == \"{\") return cont(pushlex(\"}\"), pushblockcontext, block, poplex, popcontext);\n    if (type == \";\") return cont();\n    if (type == \"if\") {\n      if (cx.state.lexical.info == \"else\" && cx.state.cc[cx.state.cc.length - 1] == poplex)\n        cx.state.cc.pop()();\n      return cont(pushlex(\"form\"), parenExpr, statement, poplex, maybeelse);\n    }\n    if (type == \"function\") return cont(functiondef);\n    if (type == \"for\") return cont(pushlex(\"form\"), forspec, statement, poplex);\n    if (type == \"class\" || (isTS && value == \"interface\")) { cx.marked = \"keyword\"; return cont(pushlex(\"form\"), className, poplex); }\n    if (type == \"variable\") {\n      if (isTS && value == \"declare\") {\n        cx.marked = \"keyword\"\n        return cont(statement)\n      } else if (isTS && (value == \"module\" || value == \"enum\" || value == \"type\") && cx.stream.match(/^\\s*\\w/, false)) {\n        cx.marked = \"keyword\"\n        if (value == \"enum\") return cont(enumdef);\n        else if (value == \"type\") return cont(typeexpr, expect(\"operator\"), typeexpr, expect(\";\"));\n        else return cont(pushlex(\"form\"), pattern, expect(\"{\"), pushlex(\"}\"), block, poplex, poplex)\n      } else if (isTS && value == \"namespace\") {\n        cx.marked = \"keyword\"\n        return cont(pushlex(\"form\"), expression, block, poplex)\n      } else if (isTS && value == \"abstract\") {\n        cx.marked = \"keyword\"\n        return cont(statement)\n      } else {\n        return cont(pushlex(\"stat\"), maybelabel);\n      }\n    }\n    if (type == \"switch\") return cont(pushlex(\"form\"), parenExpr, expect(\"{\"), pushlex(\"}\", \"switch\"), pushblockcontext,\n                                      block, poplex, poplex, popcontext);\n    if (type == \"case\") return cont(expression, expect(\":\"));\n    if (type == \"default\") return cont(expect(\":\"));\n    if (type == \"catch\") return cont(pushlex(\"form\"), pushcontext, maybeCatchBinding, statement, poplex, popcontext);\n    if (type == \"export\") return cont(pushlex(\"stat\"), afterExport, poplex);\n    if (type == \"import\") return cont(pushlex(\"stat\"), afterImport, poplex);\n    if (type == \"async\") return cont(statement)\n    if (value == \"@\") return cont(expression, statement)\n    return pass(pushlex(\"stat\"), expression, expect(\";\"), poplex);\n  }\n  function maybeCatchBinding(type) {\n    if (type == \"(\") return cont(funarg, expect(\")\"))\n  }\n  function expression(type, value) {\n    return expressionInner(type, value, false);\n  }\n  function expressionNoComma(type, value) {\n    return expressionInner(type, value, true);\n  }\n  function parenExpr(type) {\n    if (type != \"(\") return pass()\n    return cont(pushlex(\")\"), expression, expect(\")\"), poplex)\n  }\n  function expressionInner(type, value, noComma) {\n    if (cx.state.fatArrowAt == cx.stream.start) {\n      var body = noComma ? arrowBodyNoComma : arrowBody;\n      if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, expect(\"=>\"), body, popcontext);\n      else if (type == \"variable\") return pass(pushcontext, pattern, expect(\"=>\"), body, popcontext);\n    }\n\n    var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;\n    if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);\n    if (type == \"function\") return cont(functiondef, maybeop);\n    if (type == \"class\" || (isTS && value == \"interface\")) { cx.marked = \"keyword\"; return cont(pushlex(\"form\"), classExpression, poplex); }\n    if (type == \"keyword c\" || type == \"async\") return cont(noComma ? expressionNoComma : expression);\n    if (type == \"(\") return cont(pushlex(\")\"), maybeexpression, expect(\")\"), poplex, maybeop);\n    if (type == \"operator\" || type == \"spread\") return cont(noComma ? expressionNoComma : expression);\n    if (type == \"[\") return cont(pushlex(\"]\"), arrayLiteral, poplex, maybeop);\n    if (type == \"{\") return contCommasep(objprop, \"}\", null, maybeop);\n    if (type == \"quasi\") return pass(quasi, maybeop);\n    if (type == \"new\") return cont(maybeTarget(noComma));\n    if (type == \"import\") return cont(expression);\n    return cont();\n  }\n  function maybeexpression(type) {\n    if (type.match(/[;\\}\\)\\],]/)) return pass();\n    return pass(expression);\n  }\n\n  function maybeoperatorComma(type, value) {\n    if (type == \",\") return cont(expression);\n    return maybeoperatorNoComma(type, value, false);\n  }\n  function maybeoperatorNoComma(type, value, noComma) {\n    var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;\n    var expr = noComma == false ? expression : expressionNoComma;\n    if (type == \"=>\") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);\n    if (type == \"operator\") {\n      if (/\\+\\+|--/.test(value) || isTS && value == \"!\") return cont(me);\n      if (isTS && value == \"<\" && cx.stream.match(/^([^>]|<.*?>)*>\\s*\\(/, false))\n        return cont(pushlex(\">\"), commasep(typeexpr, \">\"), poplex, me);\n      if (value == \"?\") return cont(expression, expect(\":\"), expr);\n      return cont(expr);\n    }\n    if (type == \"quasi\") { return pass(quasi, me); }\n    if (type == \";\") return;\n    if (type == \"(\") return contCommasep(expressionNoComma, \")\", \"call\", me);\n    if (type == \".\") return cont(property, me);\n    if (type == \"[\") return cont(pushlex(\"]\"), maybeexpression, expect(\"]\"), poplex, me);\n    if (isTS && value == \"as\") { cx.marked = \"keyword\"; return cont(typeexpr, me) }\n    if (type == \"regexp\") {\n      cx.state.lastType = cx.marked = \"operator\"\n      cx.stream.backUp(cx.stream.pos - cx.stream.start - 1)\n      return cont(expr)\n    }\n  }\n  function quasi(type, value) {\n    if (type != \"quasi\") return pass();\n    if (value.slice(value.length - 2) != \"${\") return cont(quasi);\n    return cont(expression, continueQuasi);\n  }\n  function continueQuasi(type) {\n    if (type == \"}\") {\n      cx.marked = \"string-2\";\n      cx.state.tokenize = tokenQuasi;\n      return cont(quasi);\n    }\n  }\n  function arrowBody(type) {\n    findFatArrow(cx.stream, cx.state);\n    return pass(type == \"{\" ? statement : expression);\n  }\n  function arrowBodyNoComma(type) {\n    findFatArrow(cx.stream, cx.state);\n    return pass(type == \"{\" ? statement : expressionNoComma);\n  }\n  function maybeTarget(noComma) {\n    return function(type) {\n      if (type == \".\") return cont(noComma ? targetNoComma : target);\n      else if (type == \"variable\" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma)\n      else return pass(noComma ? expressionNoComma : expression);\n    };\n  }\n  function target(_, value) {\n    if (value == \"target\") { cx.marked = \"keyword\"; return cont(maybeoperatorComma); }\n  }\n  function targetNoComma(_, value) {\n    if (value == \"target\") { cx.marked = \"keyword\"; return cont(maybeoperatorNoComma); }\n  }\n  function maybelabel(type) {\n    if (type == \":\") return cont(poplex, statement);\n    return pass(maybeoperatorComma, expect(\";\"), poplex);\n  }\n  function property(type) {\n    if (type == \"variable\") {cx.marked = \"property\"; return cont();}\n  }\n  function objprop(type, value) {\n    if (type == \"async\") {\n      cx.marked = \"property\";\n      return cont(objprop);\n    } else if (type == \"variable\" || cx.style == \"keyword\") {\n      cx.marked = \"property\";\n      if (value == \"get\" || value == \"set\") return cont(getterSetter);\n      var m // Work around fat-arrow-detection complication for detecting typescript typed arrow params\n      if (isTS && cx.state.fatArrowAt == cx.stream.start && (m = cx.stream.match(/^\\s*:\\s*/, false)))\n        cx.state.fatArrowAt = cx.stream.pos + m[0].length\n      return cont(afterprop);\n    } else if (type == \"number\" || type == \"string\") {\n      cx.marked = jsonldMode ? \"property\" : (cx.style + \" property\");\n      return cont(afterprop);\n    } else if (type == \"jsonld-keyword\") {\n      return cont(afterprop);\n    } else if (isTS && isModifier(value)) {\n      cx.marked = \"keyword\"\n      return cont(objprop)\n    } else if (type == \"[\") {\n      return cont(expression, maybetype, expect(\"]\"), afterprop);\n    } else if (type == \"spread\") {\n      return cont(expressionNoComma, afterprop);\n    } else if (value == \"*\") {\n      cx.marked = \"keyword\";\n      return cont(objprop);\n    } else if (type == \":\") {\n      return pass(afterprop)\n    }\n  }\n  function getterSetter(type) {\n    if (type != \"variable\") return pass(afterprop);\n    cx.marked = \"property\";\n    return cont(functiondef);\n  }\n  function afterprop(type) {\n    if (type == \":\") return cont(expressionNoComma);\n    if (type == \"(\") return pass(functiondef);\n  }\n  function commasep(what, end, sep) {\n    function proceed(type, value) {\n      if (sep ? sep.indexOf(type) > -1 : type == \",\") {\n        var lex = cx.state.lexical;\n        if (lex.info == \"call\") lex.pos = (lex.pos || 0) + 1;\n        return cont(function(type, value) {\n          if (type == end || value == end) return pass()\n          return pass(what)\n        }, proceed);\n      }\n      if (type == end || value == end) return cont();\n      return cont(expect(end));\n    }\n    return function(type, value) {\n      if (type == end || value == end) return cont();\n      return pass(what, proceed);\n    };\n  }\n  function contCommasep(what, end, info) {\n    for (var i = 3; i < arguments.length; i++)\n      cx.cc.push(arguments[i]);\n    return cont(pushlex(end, info), commasep(what, end), poplex);\n  }\n  function block(type) {\n    if (type == \"}\") return cont();\n    return pass(statement, block);\n  }\n  function maybetype(type, value) {\n    if (isTS) {\n      if (type == \":\") return cont(typeexpr);\n      if (value == \"?\") return cont(maybetype);\n    }\n  }\n  function mayberettype(type) {\n    if (isTS && type == \":\") {\n      if (cx.stream.match(/^\\s*\\w+\\s+is\\b/, false)) return cont(expression, isKW, typeexpr)\n      else return cont(typeexpr)\n    }\n  }\n  function isKW(_, value) {\n    if (value == \"is\") {\n      cx.marked = \"keyword\"\n      return cont()\n    }\n  }\n  function typeexpr(type, value) {\n    if (value == \"keyof\" || value == \"typeof\") {\n      cx.marked = \"keyword\"\n      return cont(value == \"keyof\" ? typeexpr : expressionNoComma)\n    }\n    if (type == \"variable\" || value == \"void\") {\n      cx.marked = \"type\"\n      return cont(afterType)\n    }\n    if (type == \"string\" || type == \"number\" || type == \"atom\") return cont(afterType);\n    if (type == \"[\") return cont(pushlex(\"]\"), commasep(typeexpr, \"]\", \",\"), poplex, afterType)\n    if (type == \"{\") return cont(pushlex(\"}\"), commasep(typeprop, \"}\", \",;\"), poplex, afterType)\n    if (type == \"(\") return cont(commasep(typearg, \")\"), maybeReturnType)\n    if (type == \"<\") return cont(commasep(typeexpr, \">\"), typeexpr)\n  }\n  function maybeReturnType(type) {\n    if (type == \"=>\") return cont(typeexpr)\n  }\n  function typeprop(type, value) {\n    if (type == \"variable\" || cx.style == \"keyword\") {\n      cx.marked = \"property\"\n      return cont(typeprop)\n    } else if (value == \"?\") {\n      return cont(typeprop)\n    } else if (type == \":\") {\n      return cont(typeexpr)\n    } else if (type == \"[\") {\n      return cont(expression, maybetype, expect(\"]\"), typeprop)\n    }\n  }\n  function typearg(type, value) {\n    if (type == \"variable\" && cx.stream.match(/^\\s*[?:]/, false) || value == \"?\") return cont(typearg)\n    if (type == \":\") return cont(typeexpr)\n    return pass(typeexpr)\n  }\n  function afterType(type, value) {\n    if (value == \"<\") return cont(pushlex(\">\"), commasep(typeexpr, \">\"), poplex, afterType)\n    if (value == \"|\" || type == \".\" || value == \"&\") return cont(typeexpr)\n    if (type == \"[\") return cont(expect(\"]\"), afterType)\n    if (value == \"extends\" || value == \"implements\") { cx.marked = \"keyword\"; return cont(typeexpr) }\n  }\n  function maybeTypeArgs(_, value) {\n    if (value == \"<\") return cont(pushlex(\">\"), commasep(typeexpr, \">\"), poplex, afterType)\n  }\n  function typeparam() {\n    return pass(typeexpr, maybeTypeDefault)\n  }\n  function maybeTypeDefault(_, value) {\n    if (value == \"=\") return cont(typeexpr)\n  }\n  function vardef(_, value) {\n    if (value == \"enum\") {cx.marked = \"keyword\"; return cont(enumdef)}\n    return pass(pattern, maybetype, maybeAssign, vardefCont);\n  }\n  function pattern(type, value) {\n    if (isTS && isModifier(value)) { cx.marked = \"keyword\"; return cont(pattern) }\n    if (type == \"variable\") { register(value); return cont(); }\n    if (type == \"spread\") return cont(pattern);\n    if (type == \"[\") return contCommasep(eltpattern, \"]\");\n    if (type == \"{\") return contCommasep(proppattern, \"}\");\n  }\n  function proppattern(type, value) {\n    if (type == \"variable\" && !cx.stream.match(/^\\s*:/, false)) {\n      register(value);\n      return cont(maybeAssign);\n    }\n    if (type == \"variable\") cx.marked = \"property\";\n    if (type == \"spread\") return cont(pattern);\n    if (type == \"}\") return pass();\n    return cont(expect(\":\"), pattern, maybeAssign);\n  }\n  function eltpattern() {\n    return pass(pattern, maybeAssign)\n  }\n  function maybeAssign(_type, value) {\n    if (value == \"=\") return cont(expressionNoComma);\n  }\n  function vardefCont(type) {\n    if (type == \",\") return cont(vardef);\n  }\n  function maybeelse(type, value) {\n    if (type == \"keyword b\" && value == \"else\") return cont(pushlex(\"form\", \"else\"), statement, poplex);\n  }\n  function forspec(type, value) {\n    if (value == \"await\") return cont(forspec);\n    if (type == \"(\") return cont(pushlex(\")\"), forspec1, expect(\")\"), poplex);\n  }\n  function forspec1(type) {\n    if (type == \"var\") return cont(vardef, expect(\";\"), forspec2);\n    if (type == \";\") return cont(forspec2);\n    if (type == \"variable\") return cont(formaybeinof);\n    return pass(expression, expect(\";\"), forspec2);\n  }\n  function formaybeinof(_type, value) {\n    if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression); }\n    return cont(maybeoperatorComma, forspec2);\n  }\n  function forspec2(type, value) {\n    if (type == \";\") return cont(forspec3);\n    if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression); }\n    return pass(expression, expect(\";\"), forspec3);\n  }\n  function forspec3(type) {\n    if (type != \")\") cont(expression);\n  }\n  function functiondef(type, value) {\n    if (value == \"*\") {cx.marked = \"keyword\"; return cont(functiondef);}\n    if (type == \"variable\") {register(value); return cont(functiondef);}\n    if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, mayberettype, statement, popcontext);\n    if (isTS && value == \"<\") return cont(pushlex(\">\"), commasep(typeparam, \">\"), poplex, functiondef)\n  }\n  function funarg(type, value) {\n    if (value == \"@\") cont(expression, funarg)\n    if (type == \"spread\") return cont(funarg);\n    if (isTS && isModifier(value)) { cx.marked = \"keyword\"; return cont(funarg); }\n    return pass(pattern, maybetype, maybeAssign);\n  }\n  function classExpression(type, value) {\n    // Class expressions may have an optional name.\n    if (type == \"variable\") return className(type, value);\n    return classNameAfter(type, value);\n  }\n  function className(type, value) {\n    if (type == \"variable\") {register(value); return cont(classNameAfter);}\n  }\n  function classNameAfter(type, value) {\n    if (value == \"<\") return cont(pushlex(\">\"), commasep(typeparam, \">\"), poplex, classNameAfter)\n    if (value == \"extends\" || value == \"implements\" || (isTS && type == \",\")) {\n      if (value == \"implements\") cx.marked = \"keyword\";\n      return cont(isTS ? typeexpr : expression, classNameAfter);\n    }\n    if (type == \"{\") return cont(pushlex(\"}\"), classBody, poplex);\n  }\n  function classBody(type, value) {\n    if (type == \"async\" ||\n        (type == \"variable\" &&\n         (value == \"static\" || value == \"get\" || value == \"set\" || (isTS && isModifier(value))) &&\n         cx.stream.match(/^\\s+[\\w$\\xa1-\\uffff]/, false))) {\n      cx.marked = \"keyword\";\n      return cont(classBody);\n    }\n    if (type == \"variable\" || cx.style == \"keyword\") {\n      cx.marked = \"property\";\n      return cont(isTS ? classfield : functiondef, classBody);\n    }\n    if (type == \"[\")\n      return cont(expression, maybetype, expect(\"]\"), isTS ? classfield : functiondef, classBody)\n    if (value == \"*\") {\n      cx.marked = \"keyword\";\n      return cont(classBody);\n    }\n    if (type == \";\") return cont(classBody);\n    if (type == \"}\") return cont();\n    if (value == \"@\") return cont(expression, classBody)\n  }\n  function classfield(type, value) {\n    if (value == \"?\") return cont(classfield)\n    if (type == \":\") return cont(typeexpr, maybeAssign)\n    if (value == \"=\") return cont(expressionNoComma)\n    return pass(functiondef)\n  }\n  function afterExport(type, value) {\n    if (value == \"*\") { cx.marked = \"keyword\"; return cont(maybeFrom, expect(\";\")); }\n    if (value == \"default\") { cx.marked = \"keyword\"; return cont(expression, expect(\";\")); }\n    if (type == \"{\") return cont(commasep(exportField, \"}\"), maybeFrom, expect(\";\"));\n    return pass(statement);\n  }\n  function exportField(type, value) {\n    if (value == \"as\") { cx.marked = \"keyword\"; return cont(expect(\"variable\")); }\n    if (type == \"variable\") return pass(expressionNoComma, exportField);\n  }\n  function afterImport(type) {\n    if (type == \"string\") return cont();\n    if (type == \"(\") return pass(expression);\n    return pass(importSpec, maybeMoreImports, maybeFrom);\n  }\n  function importSpec(type, value) {\n    if (type == \"{\") return contCommasep(importSpec, \"}\");\n    if (type == \"variable\") register(value);\n    if (value == \"*\") cx.marked = \"keyword\";\n    return cont(maybeAs);\n  }\n  function maybeMoreImports(type) {\n    if (type == \",\") return cont(importSpec, maybeMoreImports)\n  }\n  function maybeAs(_type, value) {\n    if (value == \"as\") { cx.marked = \"keyword\"; return cont(importSpec); }\n  }\n  function maybeFrom(_type, value) {\n    if (value == \"from\") { cx.marked = \"keyword\"; return cont(expression); }\n  }\n  function arrayLiteral(type) {\n    if (type == \"]\") return cont();\n    return pass(commasep(expressionNoComma, \"]\"));\n  }\n  function enumdef() {\n    return pass(pushlex(\"form\"), pattern, expect(\"{\"), pushlex(\"}\"), commasep(enummember, \"}\"), poplex, poplex)\n  }\n  function enummember() {\n    return pass(pattern, maybeAssign);\n  }\n\n  function isContinuedStatement(state, textAfter) {\n    return state.lastType == \"operator\" || state.lastType == \",\" ||\n      isOperatorChar.test(textAfter.charAt(0)) ||\n      /[,.]/.test(textAfter.charAt(0));\n  }\n\n  function expressionAllowed(stream, state, backUp) {\n    return state.tokenize == tokenBase &&\n      /^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\\[{}\\(,;:]|=>)$/.test(state.lastType) ||\n      (state.lastType == \"quasi\" && /\\{\\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))))\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      var state = {\n        tokenize: tokenBase,\n        lastType: \"sof\",\n        cc: [],\n        lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, \"block\", false),\n        localVars: parserConfig.localVars,\n        context: parserConfig.localVars && new Context(null, null, false),\n        indented: basecolumn || 0\n      };\n      if (parserConfig.globalVars && typeof parserConfig.globalVars == \"object\")\n        state.globalVars = parserConfig.globalVars;\n      return state;\n    },\n\n    token: function(stream, state) {\n      if (stream.sol()) {\n        if (!state.lexical.hasOwnProperty(\"align\"))\n          state.lexical.align = false;\n        state.indented = stream.indentation();\n        findFatArrow(stream, state);\n      }\n      if (state.tokenize != tokenComment && stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n      if (type == \"comment\") return style;\n      state.lastType = type == \"operator\" && (content == \"++\" || content == \"--\") ? \"incdec\" : type;\n      return parseJS(state, style, type, content, stream);\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize == tokenComment) return CodeMirror.Pass;\n      if (state.tokenize != tokenBase) return 0;\n      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top\n      // Kludge to prevent 'maybelse' from blocking lexical scope pops\n      if (!/^\\s*else\\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {\n        var c = state.cc[i];\n        if (c == poplex) lexical = lexical.prev;\n        else if (c != maybeelse) break;\n      }\n      while ((lexical.type == \"stat\" || lexical.type == \"form\") &&\n             (firstChar == \"}\" || ((top = state.cc[state.cc.length - 1]) &&\n                                   (top == maybeoperatorComma || top == maybeoperatorNoComma) &&\n                                   !/^[,\\.=+\\-*:?[\\(]/.test(textAfter))))\n        lexical = lexical.prev;\n      if (statementIndent && lexical.type == \")\" && lexical.prev.type == \"stat\")\n        lexical = lexical.prev;\n      var type = lexical.type, closing = firstChar == type;\n\n      if (type == \"vardef\") return lexical.indented + (state.lastType == \"operator\" || state.lastType == \",\" ? lexical.info.length + 1 : 0);\n      else if (type == \"form\" && firstChar == \"{\") return lexical.indented;\n      else if (type == \"form\") return lexical.indented + indentUnit;\n      else if (type == \"stat\")\n        return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0);\n      else if (lexical.info == \"switch\" && !closing && parserConfig.doubleIndentSwitch != false)\n        return lexical.indented + (/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 2 * indentUnit);\n      else if (lexical.align) return lexical.column + (closing ? 0 : 1);\n      else return lexical.indented + (closing ? 0 : indentUnit);\n    },\n\n    electricInput: /^\\s*(?:case .*?:|default:|\\{|\\})$/,\n    blockCommentStart: jsonMode ? null : \"/*\",\n    blockCommentEnd: jsonMode ? null : \"*/\",\n    blockCommentContinue: jsonMode ? null : \" * \",\n    lineComment: jsonMode ? null : \"//\",\n    fold: \"brace\",\n    closeBrackets: \"()[]{}''\\\"\\\"``\",\n\n    helperType: jsonMode ? \"json\" : \"javascript\",\n    jsonldMode: jsonldMode,\n    jsonMode: jsonMode,\n\n    expressionAllowed: expressionAllowed,\n\n    skipExpression: function(state) {\n      var top = state.cc[state.cc.length - 1]\n      if (top == expression || top == expressionNoComma) state.cc.pop()\n    }\n  };\n});\n\nCodeMirror.registerHelper(\"wordChars\", \"javascript\", /[\\w$]/);\n\nCodeMirror.defineMIME(\"text/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"text/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/x-javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/json\", {name: \"javascript\", json: true});\nCodeMirror.defineMIME(\"application/x-json\", {name: \"javascript\", json: true});\nCodeMirror.defineMIME(\"application/ld+json\", {name: \"javascript\", jsonld: true});\nCodeMirror.defineMIME(\"text/typescript\", { name: \"javascript\", typescript: true });\nCodeMirror.defineMIME(\"application/typescript\", { name: \"javascript\", typescript: true });\n\n});\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/plugins/codemirror/mode/php/php.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../htmlmixed/htmlmixed\"), require(\"../clike/clike\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../htmlmixed/htmlmixed\", \"../clike/clike\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function keywords(str) {\n    var obj = {}, words = str.split(\" \");\n    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;\n    return obj;\n  }\n\n  // Helper for phpString\n  function matchSequence(list, end, escapes) {\n    if (list.length == 0) return phpString(end);\n    return function (stream, state) {\n      var patterns = list[0];\n      for (var i = 0; i < patterns.length; i++) if (stream.match(patterns[i][0])) {\n        state.tokenize = matchSequence(list.slice(1), end);\n        return patterns[i][1];\n      }\n      state.tokenize = phpString(end, escapes);\n      return \"string\";\n    };\n  }\n  function phpString(closing, escapes) {\n    return function(stream, state) { return phpString_(stream, state, closing, escapes); };\n  }\n  function phpString_(stream, state, closing, escapes) {\n    // \"Complex\" syntax\n    if (escapes !== false && stream.match(\"${\", false) || stream.match(\"{$\", false)) {\n      state.tokenize = null;\n      return \"string\";\n    }\n\n    // Simple syntax\n    if (escapes !== false && stream.match(/^\\$[a-zA-Z_][a-zA-Z0-9_]*/)) {\n      // After the variable name there may appear array or object operator.\n      if (stream.match(\"[\", false)) {\n        // Match array operator\n        state.tokenize = matchSequence([\n          [[\"[\", null]],\n          [[/\\d[\\w\\.]*/, \"number\"],\n           [/\\$[a-zA-Z_][a-zA-Z0-9_]*/, \"variable-2\"],\n           [/[\\w\\$]+/, \"variable\"]],\n          [[\"]\", null]]\n        ], closing, escapes);\n      }\n      if (stream.match(/\\-\\>\\w/, false)) {\n        // Match object operator\n        state.tokenize = matchSequence([\n          [[\"->\", null]],\n          [[/[\\w]+/, \"variable\"]]\n        ], closing, escapes);\n      }\n      return \"variable-2\";\n    }\n\n    var escaped = false;\n    // Normal string\n    while (!stream.eol() &&\n           (escaped || escapes === false ||\n            (!stream.match(\"{$\", false) &&\n             !stream.match(/^(\\$[a-zA-Z_][a-zA-Z0-9_]*|\\$\\{)/, false)))) {\n      if (!escaped && stream.match(closing)) {\n        state.tokenize = null;\n        state.tokStack.pop(); state.tokStack.pop();\n        break;\n      }\n      escaped = stream.next() == \"\\\\\" && !escaped;\n    }\n    return \"string\";\n  }\n\n  var phpKeywords = \"abstract and array as break case catch class clone const continue declare default \" +\n    \"do else elseif enddeclare endfor endforeach endif endswitch endwhile extends final \" +\n    \"for foreach function global goto if implements interface instanceof namespace \" +\n    \"new or private protected public static switch throw trait try use var while xor \" +\n    \"die echo empty exit eval include include_once isset list require require_once return \" +\n    \"print unset __halt_compiler self static parent yield insteadof finally\";\n  var phpAtoms = \"true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__\";\n  var phpBuiltin = \"func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents file_put_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists array_intersect_key array_combine array_column pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count\";\n  CodeMirror.registerHelper(\"hintWords\", \"php\", [phpKeywords, phpAtoms, phpBuiltin].join(\" \").split(\" \"));\n  CodeMirror.registerHelper(\"wordChars\", \"php\", /[\\w$]/);\n\n  var phpConfig = {\n    name: \"clike\",\n    helperType: \"php\",\n    keywords: keywords(phpKeywords),\n    blockKeywords: keywords(\"catch do else elseif for foreach if switch try while finally\"),\n    defKeywords: keywords(\"class function interface namespace trait\"),\n    atoms: keywords(phpAtoms),\n    builtin: keywords(phpBuiltin),\n    multiLineStrings: true,\n    hooks: {\n      \"$\": function(stream) {\n        stream.eatWhile(/[\\w\\$_]/);\n        return \"variable-2\";\n      },\n      \"<\": function(stream, state) {\n        var before;\n        if (before = stream.match(/<<\\s*/)) {\n          var quoted = stream.eat(/['\"]/);\n          stream.eatWhile(/[\\w\\.]/);\n          var delim = stream.current().slice(before[0].length + (quoted ? 2 : 1));\n          if (quoted) stream.eat(quoted);\n          if (delim) {\n            (state.tokStack || (state.tokStack = [])).push(delim, 0);\n            state.tokenize = phpString(delim, quoted != \"'\");\n            return \"string\";\n          }\n        }\n        return false;\n      },\n      \"#\": function(stream) {\n        while (!stream.eol() && !stream.match(\"?>\", false)) stream.next();\n        return \"comment\";\n      },\n      \"/\": function(stream) {\n        if (stream.eat(\"/\")) {\n          while (!stream.eol() && !stream.match(\"?>\", false)) stream.next();\n          return \"comment\";\n        }\n        return false;\n      },\n      '\"': function(_stream, state) {\n        (state.tokStack || (state.tokStack = [])).push('\"', 0);\n        state.tokenize = phpString('\"');\n        return \"string\";\n      },\n      \"{\": function(_stream, state) {\n        if (state.tokStack && state.tokStack.length)\n          state.tokStack[state.tokStack.length - 1]++;\n        return false;\n      },\n      \"}\": function(_stream, state) {\n        if (state.tokStack && state.tokStack.length > 0 &&\n            !--state.tokStack[state.tokStack.length - 1]) {\n          state.tokenize = phpString(state.tokStack[state.tokStack.length - 2]);\n        }\n        return false;\n      }\n    }\n  };\n\n  CodeMirror.defineMode(\"php\", function(config, parserConfig) {\n    var htmlMode = CodeMirror.getMode(config, (parserConfig && parserConfig.htmlMode) || \"text/html\");\n    var phpMode = CodeMirror.getMode(config, phpConfig);\n\n    function dispatch(stream, state) {\n      var isPHP = state.curMode == phpMode;\n      if (stream.sol() && state.pending && state.pending != '\"' && state.pending != \"'\") state.pending = null;\n      if (!isPHP) {\n        if (stream.match(/^<\\?\\w*/)) {\n          state.curMode = phpMode;\n          if (!state.php) state.php = CodeMirror.startState(phpMode, htmlMode.indent(state.html, \"\"))\n          state.curState = state.php;\n          return \"meta\";\n        }\n        if (state.pending == '\"' || state.pending == \"'\") {\n          while (!stream.eol() && stream.next() != state.pending) {}\n          var style = \"string\";\n        } else if (state.pending && stream.pos < state.pending.end) {\n          stream.pos = state.pending.end;\n          var style = state.pending.style;\n        } else {\n          var style = htmlMode.token(stream, state.curState);\n        }\n        if (state.pending) state.pending = null;\n        var cur = stream.current(), openPHP = cur.search(/<\\?/), m;\n        if (openPHP != -1) {\n          if (style == \"string\" && (m = cur.match(/[\\'\\\"]$/)) && !/\\?>/.test(cur)) state.pending = m[0];\n          else state.pending = {end: stream.pos, style: style};\n          stream.backUp(cur.length - openPHP);\n        }\n        return style;\n      } else if (isPHP && state.php.tokenize == null && stream.match(\"?>\")) {\n        state.curMode = htmlMode;\n        state.curState = state.html;\n        if (!state.php.context.prev) state.php = null;\n        return \"meta\";\n      } else {\n        return phpMode.token(stream, state.curState);\n      }\n    }\n\n    return {\n      startState: function() {\n        var html = CodeMirror.startState(htmlMode)\n        var php = parserConfig.startOpen ? CodeMirror.startState(phpMode) : null\n        return {html: html,\n                php: php,\n                curMode: parserConfig.startOpen ? phpMode : htmlMode,\n                curState: parserConfig.startOpen ? php : html,\n                pending: null};\n      },\n\n      copyState: function(state) {\n        var html = state.html, htmlNew = CodeMirror.copyState(htmlMode, html),\n            php = state.php, phpNew = php && CodeMirror.copyState(phpMode, php), cur;\n        if (state.curMode == htmlMode) cur = htmlNew;\n        else cur = phpNew;\n        return {html: htmlNew, php: phpNew, curMode: state.curMode, curState: cur,\n                pending: state.pending};\n      },\n\n      token: dispatch,\n\n      indent: function(state, textAfter) {\n        if ((state.curMode != phpMode && /^\\s*<\\//.test(textAfter)) ||\n            (state.curMode == phpMode && /^\\?>/.test(textAfter)))\n          return htmlMode.indent(state.html, textAfter);\n        return state.curMode.indent(state.curState, textAfter);\n      },\n\n      blockCommentStart: \"/*\",\n      blockCommentEnd: \"*/\",\n      lineComment: \"//\",\n\n      innerMode: function(state) { return {state: state.curState, mode: state.curMode}; }\n    };\n  }, \"htmlmixed\", \"clike\");\n\n  CodeMirror.defineMIME(\"application/x-httpd-php\", \"php\");\n  CodeMirror.defineMIME(\"application/x-httpd-php-open\", {name: \"php\", startOpen: true});\n  CodeMirror.defineMIME(\"text/x-php\", phpConfig);\n});\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/plugins/codemirror/mode/powershell/powershell.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  'use strict';\n  if (typeof exports == 'object' && typeof module == 'object') // CommonJS\n    mod(require('../../lib/codemirror'));\n  else if (typeof define == 'function' && define.amd) // AMD\n    define(['../../lib/codemirror'], mod);\n  else // Plain browser env\n    mod(window.CodeMirror);\n})(function(CodeMirror) {\n'use strict';\n\nCodeMirror.defineMode('powershell', function() {\n  function buildRegexp(patterns, options) {\n    options = options || {};\n    var prefix = options.prefix !== undefined ? options.prefix : '^';\n    var suffix = options.suffix !== undefined ? options.suffix : '\\\\b';\n\n    for (var i = 0; i < patterns.length; i++) {\n      if (patterns[i] instanceof RegExp) {\n        patterns[i] = patterns[i].source;\n      }\n      else {\n        patterns[i] = patterns[i].replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n      }\n    }\n\n    return new RegExp(prefix + '(' + patterns.join('|') + ')' + suffix, 'i');\n  }\n\n  var notCharacterOrDash = '(?=[^A-Za-z\\\\d\\\\-_]|$)';\n  var varNames = /[\\w\\-:]/\n  var keywords = buildRegexp([\n    /begin|break|catch|continue|data|default|do|dynamicparam/,\n    /else|elseif|end|exit|filter|finally|for|foreach|from|function|if|in/,\n    /param|process|return|switch|throw|trap|try|until|where|while/\n  ], { suffix: notCharacterOrDash });\n\n  var punctuation = /[\\[\\]{},;`\\.]|@[({]/;\n  var wordOperators = buildRegexp([\n    'f',\n    /b?not/,\n    /[ic]?split/, 'join',\n    /is(not)?/, 'as',\n    /[ic]?(eq|ne|[gl][te])/,\n    /[ic]?(not)?(like|match|contains)/,\n    /[ic]?replace/,\n    /b?(and|or|xor)/\n  ], { prefix: '-' });\n  var symbolOperators = /[+\\-*\\/%]=|\\+\\+|--|\\.\\.|[+\\-*&^%:=!|\\/]|<(?!#)|(?!#)>/;\n  var operators = buildRegexp([wordOperators, symbolOperators], { suffix: '' });\n\n  var numbers = /^((0x[\\da-f]+)|((\\d+\\.\\d+|\\d\\.|\\.\\d+|\\d+)(e[\\+\\-]?\\d+)?))[ld]?([kmgtp]b)?/i;\n\n  var identifiers = /^[A-Za-z\\_][A-Za-z\\-\\_\\d]*\\b/;\n\n  var symbolBuiltins = /[A-Z]:|%|\\?/i;\n  var namedBuiltins = buildRegexp([\n    /Add-(Computer|Content|History|Member|PSSnapin|Type)/,\n    /Checkpoint-Computer/,\n    /Clear-(Content|EventLog|History|Host|Item(Property)?|Variable)/,\n    /Compare-Object/,\n    /Complete-Transaction/,\n    /Connect-PSSession/,\n    /ConvertFrom-(Csv|Json|SecureString|StringData)/,\n    /Convert-Path/,\n    /ConvertTo-(Csv|Html|Json|SecureString|Xml)/,\n    /Copy-Item(Property)?/,\n    /Debug-Process/,\n    /Disable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)/,\n    /Disconnect-PSSession/,\n    /Enable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)/,\n    /(Enter|Exit)-PSSession/,\n    /Export-(Alias|Clixml|Console|Counter|Csv|FormatData|ModuleMember|PSSession)/,\n    /ForEach-Object/,\n    /Format-(Custom|List|Table|Wide)/,\n    new RegExp('Get-(Acl|Alias|AuthenticodeSignature|ChildItem|Command|ComputerRestorePoint|Content|ControlPanelItem|Counter|Credential'\n      + '|Culture|Date|Event|EventLog|EventSubscriber|ExecutionPolicy|FormatData|Help|History|Host|HotFix|Item|ItemProperty|Job'\n      + '|Location|Member|Module|PfxCertificate|Process|PSBreakpoint|PSCallStack|PSDrive|PSProvider|PSSession|PSSessionConfiguration'\n      + '|PSSnapin|Random|Service|TraceSource|Transaction|TypeData|UICulture|Unique|Variable|Verb|WinEvent|WmiObject)'),\n    /Group-Object/,\n    /Import-(Alias|Clixml|Counter|Csv|LocalizedData|Module|PSSession)/,\n    /ImportSystemModules/,\n    /Invoke-(Command|Expression|History|Item|RestMethod|WebRequest|WmiMethod)/,\n    /Join-Path/,\n    /Limit-EventLog/,\n    /Measure-(Command|Object)/,\n    /Move-Item(Property)?/,\n    new RegExp('New-(Alias|Event|EventLog|Item(Property)?|Module|ModuleManifest|Object|PSDrive|PSSession|PSSessionConfigurationFile'\n      + '|PSSessionOption|PSTransportOption|Service|TimeSpan|Variable|WebServiceProxy|WinEvent)'),\n    /Out-(Default|File|GridView|Host|Null|Printer|String)/,\n    /Pause/,\n    /(Pop|Push)-Location/,\n    /Read-Host/,\n    /Receive-(Job|PSSession)/,\n    /Register-(EngineEvent|ObjectEvent|PSSessionConfiguration|WmiEvent)/,\n    /Remove-(Computer|Event|EventLog|Item(Property)?|Job|Module|PSBreakpoint|PSDrive|PSSession|PSSnapin|TypeData|Variable|WmiObject)/,\n    /Rename-(Computer|Item(Property)?)/,\n    /Reset-ComputerMachinePassword/,\n    /Resolve-Path/,\n    /Restart-(Computer|Service)/,\n    /Restore-Computer/,\n    /Resume-(Job|Service)/,\n    /Save-Help/,\n    /Select-(Object|String|Xml)/,\n    /Send-MailMessage/,\n    new RegExp('Set-(Acl|Alias|AuthenticodeSignature|Content|Date|ExecutionPolicy|Item(Property)?|Location|PSBreakpoint|PSDebug' +\n               '|PSSessionConfiguration|Service|StrictMode|TraceSource|Variable|WmiInstance)'),\n    /Show-(Command|ControlPanelItem|EventLog)/,\n    /Sort-Object/,\n    /Split-Path/,\n    /Start-(Job|Process|Service|Sleep|Transaction|Transcript)/,\n    /Stop-(Computer|Job|Process|Service|Transcript)/,\n    /Suspend-(Job|Service)/,\n    /TabExpansion2/,\n    /Tee-Object/,\n    /Test-(ComputerSecureChannel|Connection|ModuleManifest|Path|PSSessionConfigurationFile)/,\n    /Trace-Command/,\n    /Unblock-File/,\n    /Undo-Transaction/,\n    /Unregister-(Event|PSSessionConfiguration)/,\n    /Update-(FormatData|Help|List|TypeData)/,\n    /Use-Transaction/,\n    /Wait-(Event|Job|Process)/,\n    /Where-Object/,\n    /Write-(Debug|Error|EventLog|Host|Output|Progress|Verbose|Warning)/,\n    /cd|help|mkdir|more|oss|prompt/,\n    /ac|asnp|cat|cd|chdir|clc|clear|clhy|cli|clp|cls|clv|cnsn|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|dnsn|ebp/,\n    /echo|epal|epcsv|epsn|erase|etsn|exsn|fc|fl|foreach|ft|fw|gal|gbp|gc|gci|gcm|gcs|gdr|ghy|gi|gjb|gl|gm|gmo|gp|gps/,\n    /group|gsn|gsnp|gsv|gu|gv|gwmi|h|history|icm|iex|ihy|ii|ipal|ipcsv|ipmo|ipsn|irm|ise|iwmi|iwr|kill|lp|ls|man|md/,\n    /measure|mi|mount|move|mp|mv|nal|ndr|ni|nmo|npssc|nsn|nv|ogv|oh|popd|ps|pushd|pwd|r|rbp|rcjb|rcsn|rd|rdr|ren|ri/,\n    /rjb|rm|rmdir|rmo|rni|rnp|rp|rsn|rsnp|rujb|rv|rvpa|rwmi|sajb|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls/,\n    /sort|sp|spjb|spps|spsv|start|sujb|sv|swmi|tee|trcm|type|where|wjb|write/\n  ], { prefix: '', suffix: '' });\n  var variableBuiltins = buildRegexp([\n    /[$?^_]|Args|ConfirmPreference|ConsoleFileName|DebugPreference|Error|ErrorActionPreference|ErrorView|ExecutionContext/,\n    /FormatEnumerationLimit|Home|Host|Input|MaximumAliasCount|MaximumDriveCount|MaximumErrorCount|MaximumFunctionCount/,\n    /MaximumHistoryCount|MaximumVariableCount|MyInvocation|NestedPromptLevel|OutputEncoding|Pid|Profile|ProgressPreference/,\n    /PSBoundParameters|PSCommandPath|PSCulture|PSDefaultParameterValues|PSEmailServer|PSHome|PSScriptRoot|PSSessionApplicationName/,\n    /PSSessionConfigurationName|PSSessionOption|PSUICulture|PSVersionTable|Pwd|ShellId|StackTrace|VerbosePreference/,\n    /WarningPreference|WhatIfPreference/,\n\n    /Event|EventArgs|EventSubscriber|Sender/,\n    /Matches|Ofs|ForEach|LastExitCode|PSCmdlet|PSItem|PSSenderInfo|This/,\n    /true|false|null/\n  ], { prefix: '\\\\$', suffix: '' });\n\n  var builtins = buildRegexp([symbolBuiltins, namedBuiltins, variableBuiltins], { suffix: notCharacterOrDash });\n\n  var grammar = {\n    keyword: keywords,\n    number: numbers,\n    operator: operators,\n    builtin: builtins,\n    punctuation: punctuation,\n    identifier: identifiers\n  };\n\n  // tokenizers\n  function tokenBase(stream, state) {\n    // Handle Comments\n    //var ch = stream.peek();\n\n    var parent = state.returnStack[state.returnStack.length - 1];\n    if (parent && parent.shouldReturnFrom(state)) {\n      state.tokenize = parent.tokenize;\n      state.returnStack.pop();\n      return state.tokenize(stream, state);\n    }\n\n    if (stream.eatSpace()) {\n      return null;\n    }\n\n    if (stream.eat('(')) {\n      state.bracketNesting += 1;\n      return 'punctuation';\n    }\n\n    if (stream.eat(')')) {\n      state.bracketNesting -= 1;\n      return 'punctuation';\n    }\n\n    for (var key in grammar) {\n      if (stream.match(grammar[key])) {\n        return key;\n      }\n    }\n\n    var ch = stream.next();\n\n    // single-quote string\n    if (ch === \"'\") {\n      return tokenSingleQuoteString(stream, state);\n    }\n\n    if (ch === '$') {\n      return tokenVariable(stream, state);\n    }\n\n    // double-quote string\n    if (ch === '\"') {\n      return tokenDoubleQuoteString(stream, state);\n    }\n\n    if (ch === '<' && stream.eat('#')) {\n      state.tokenize = tokenComment;\n      return tokenComment(stream, state);\n    }\n\n    if (ch === '#') {\n      stream.skipToEnd();\n      return 'comment';\n    }\n\n    if (ch === '@') {\n      var quoteMatch = stream.eat(/[\"']/);\n      if (quoteMatch && stream.eol()) {\n        state.tokenize = tokenMultiString;\n        state.startQuote = quoteMatch[0];\n        return tokenMultiString(stream, state);\n      } else if (stream.eol()) {\n        return 'error';\n      } else if (stream.peek().match(/[({]/)) {\n        return 'punctuation';\n      } else if (stream.peek().match(varNames)) {\n        // splatted variable\n        return tokenVariable(stream, state);\n      }\n    }\n    return 'error';\n  }\n\n  function tokenSingleQuoteString(stream, state) {\n    var ch;\n    while ((ch = stream.peek()) != null) {\n      stream.next();\n\n      if (ch === \"'\" && !stream.eat(\"'\")) {\n        state.tokenize = tokenBase;\n        return 'string';\n      }\n    }\n\n    return 'error';\n  }\n\n  function tokenDoubleQuoteString(stream, state) {\n    var ch;\n    while ((ch = stream.peek()) != null) {\n      if (ch === '$') {\n        state.tokenize = tokenStringInterpolation;\n        return 'string';\n      }\n\n      stream.next();\n      if (ch === '`') {\n        stream.next();\n        continue;\n      }\n\n      if (ch === '\"' && !stream.eat('\"')) {\n        state.tokenize = tokenBase;\n        return 'string';\n      }\n    }\n\n    return 'error';\n  }\n\n  function tokenStringInterpolation(stream, state) {\n    return tokenInterpolation(stream, state, tokenDoubleQuoteString);\n  }\n\n  function tokenMultiStringReturn(stream, state) {\n    state.tokenize = tokenMultiString;\n    state.startQuote = '\"'\n    return tokenMultiString(stream, state);\n  }\n\n  function tokenHereStringInterpolation(stream, state) {\n    return tokenInterpolation(stream, state, tokenMultiStringReturn);\n  }\n\n  function tokenInterpolation(stream, state, parentTokenize) {\n    if (stream.match('$(')) {\n      var savedBracketNesting = state.bracketNesting;\n      state.returnStack.push({\n        /*jshint loopfunc:true */\n        shouldReturnFrom: function(state) {\n          return state.bracketNesting === savedBracketNesting;\n        },\n        tokenize: parentTokenize\n      });\n      state.tokenize = tokenBase;\n      state.bracketNesting += 1;\n      return 'punctuation';\n    } else {\n      stream.next();\n      state.returnStack.push({\n        shouldReturnFrom: function() { return true; },\n        tokenize: parentTokenize\n      });\n      state.tokenize = tokenVariable;\n      return state.tokenize(stream, state);\n    }\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while ((ch = stream.next()) != null) {\n      if (maybeEnd && ch == '>') {\n          state.tokenize = tokenBase;\n          break;\n      }\n      maybeEnd = (ch === '#');\n    }\n    return 'comment';\n  }\n\n  function tokenVariable(stream, state) {\n    var ch = stream.peek();\n    if (stream.eat('{')) {\n      state.tokenize = tokenVariableWithBraces;\n      return tokenVariableWithBraces(stream, state);\n    } else if (ch != undefined && ch.match(varNames)) {\n      stream.eatWhile(varNames);\n      state.tokenize = tokenBase;\n      return 'variable-2';\n    } else {\n      state.tokenize = tokenBase;\n      return 'error';\n    }\n  }\n\n  function tokenVariableWithBraces(stream, state) {\n    var ch;\n    while ((ch = stream.next()) != null) {\n      if (ch === '}') {\n        state.tokenize = tokenBase;\n        break;\n      }\n    }\n    return 'variable-2';\n  }\n\n  function tokenMultiString(stream, state) {\n    var quote = state.startQuote;\n    if (stream.sol() && stream.match(new RegExp(quote + '@'))) {\n      state.tokenize = tokenBase;\n    }\n    else if (quote === '\"') {\n      while (!stream.eol()) {\n        var ch = stream.peek();\n        if (ch === '$') {\n          state.tokenize = tokenHereStringInterpolation;\n          return 'string';\n        }\n\n        stream.next();\n        if (ch === '`') {\n          stream.next();\n        }\n      }\n    }\n    else {\n      stream.skipToEnd();\n    }\n\n    return 'string';\n  }\n\n  var external = {\n    startState: function() {\n      return {\n        returnStack: [],\n        bracketNesting: 0,\n        tokenize: tokenBase\n      };\n    },\n\n    token: function(stream, state) {\n      return state.tokenize(stream, state);\n    },\n\n    blockCommentStart: '<#',\n    blockCommentEnd: '#>',\n    lineComment: '#',\n    fold: 'brace'\n  };\n  return external;\n});\n\nCodeMirror.defineMIME('application/x-powershell', 'powershell');\n});\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/plugins/codemirror/mode/python/python.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  function wordRegexp(words) {\n    return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\");\n  }\n\n  var wordOperators = wordRegexp([\"and\", \"or\", \"not\", \"is\"]);\n  var commonKeywords = [\"as\", \"assert\", \"break\", \"class\", \"continue\",\n                        \"def\", \"del\", \"elif\", \"else\", \"except\", \"finally\",\n                        \"for\", \"from\", \"global\", \"if\", \"import\",\n                        \"lambda\", \"pass\", \"raise\", \"return\",\n                        \"try\", \"while\", \"with\", \"yield\", \"in\"];\n  var commonBuiltins = [\"abs\", \"all\", \"any\", \"bin\", \"bool\", \"bytearray\", \"callable\", \"chr\",\n                        \"classmethod\", \"compile\", \"complex\", \"delattr\", \"dict\", \"dir\", \"divmod\",\n                        \"enumerate\", \"eval\", \"filter\", \"float\", \"format\", \"frozenset\",\n                        \"getattr\", \"globals\", \"hasattr\", \"hash\", \"help\", \"hex\", \"id\",\n                        \"input\", \"int\", \"isinstance\", \"issubclass\", \"iter\", \"len\",\n                        \"list\", \"locals\", \"map\", \"max\", \"memoryview\", \"min\", \"next\",\n                        \"object\", \"oct\", \"open\", \"ord\", \"pow\", \"property\", \"range\",\n                        \"repr\", \"reversed\", \"round\", \"set\", \"setattr\", \"slice\",\n                        \"sorted\", \"staticmethod\", \"str\", \"sum\", \"super\", \"tuple\",\n                        \"type\", \"vars\", \"zip\", \"__import__\", \"NotImplemented\",\n                        \"Ellipsis\", \"__debug__\"];\n  CodeMirror.registerHelper(\"hintWords\", \"python\", commonKeywords.concat(commonBuiltins));\n\n  function top(state) {\n    return state.scopes[state.scopes.length - 1];\n  }\n\n  CodeMirror.defineMode(\"python\", function(conf, parserConf) {\n    var ERRORCLASS = \"error\";\n\n    var delimiters = parserConf.delimiters || parserConf.singleDelimiters || /^[\\(\\)\\[\\]\\{\\}@,:`=;\\.\\\\]/;\n    //               (Backwards-compatiblity with old, cumbersome config system)\n    var operators = [parserConf.singleOperators, parserConf.doubleOperators, parserConf.doubleDelimiters, parserConf.tripleDelimiters,\n                     parserConf.operators || /^([-+*/%\\/&|^]=?|[<>=]+|\\/\\/=?|\\*\\*=?|!=|[~!@])/]\n    for (var i = 0; i < operators.length; i++) if (!operators[i]) operators.splice(i--, 1)\n\n    var hangingIndent = parserConf.hangingIndent || conf.indentUnit;\n\n    var myKeywords = commonKeywords, myBuiltins = commonBuiltins;\n    if (parserConf.extra_keywords != undefined)\n      myKeywords = myKeywords.concat(parserConf.extra_keywords);\n\n    if (parserConf.extra_builtins != undefined)\n      myBuiltins = myBuiltins.concat(parserConf.extra_builtins);\n\n    var py3 = !(parserConf.version && Number(parserConf.version) < 3)\n    if (py3) {\n      // since http://legacy.python.org/dev/peps/pep-0465/ @ is also an operator\n      var identifiers = parserConf.identifiers|| /^[_A-Za-z\\u00A1-\\uFFFF][_A-Za-z0-9\\u00A1-\\uFFFF]*/;\n      myKeywords = myKeywords.concat([\"nonlocal\", \"False\", \"True\", \"None\", \"async\", \"await\"]);\n      myBuiltins = myBuiltins.concat([\"ascii\", \"bytes\", \"exec\", \"print\"]);\n      var stringPrefixes = new RegExp(\"^(([rbuf]|(br)|(fr))?('{3}|\\\"{3}|['\\\"]))\", \"i\");\n    } else {\n      var identifiers = parserConf.identifiers|| /^[_A-Za-z][_A-Za-z0-9]*/;\n      myKeywords = myKeywords.concat([\"exec\", \"print\"]);\n      myBuiltins = myBuiltins.concat([\"apply\", \"basestring\", \"buffer\", \"cmp\", \"coerce\", \"execfile\",\n                                      \"file\", \"intern\", \"long\", \"raw_input\", \"reduce\", \"reload\",\n                                      \"unichr\", \"unicode\", \"xrange\", \"False\", \"True\", \"None\"]);\n      var stringPrefixes = new RegExp(\"^(([rubf]|(ur)|(br))?('{3}|\\\"{3}|['\\\"]))\", \"i\");\n    }\n    var keywords = wordRegexp(myKeywords);\n    var builtins = wordRegexp(myBuiltins);\n\n    // tokenizers\n    function tokenBase(stream, state) {\n      var sol = stream.sol() && state.lastToken != \"\\\\\"\n      if (sol) state.indent = stream.indentation()\n      // Handle scope changes\n      if (sol && top(state).type == \"py\") {\n        var scopeOffset = top(state).offset;\n        if (stream.eatSpace()) {\n          var lineOffset = stream.indentation();\n          if (lineOffset > scopeOffset)\n            pushPyScope(state);\n          else if (lineOffset < scopeOffset && dedent(stream, state) && stream.peek() != \"#\")\n            state.errorToken = true;\n          return null;\n        } else {\n          var style = tokenBaseInner(stream, state);\n          if (scopeOffset > 0 && dedent(stream, state))\n            style += \" \" + ERRORCLASS;\n          return style;\n        }\n      }\n      return tokenBaseInner(stream, state);\n    }\n\n    function tokenBaseInner(stream, state) {\n      if (stream.eatSpace()) return null;\n\n      // Handle Comments\n      if (stream.match(/^#.*/)) return \"comment\";\n\n      // Handle Number Literals\n      if (stream.match(/^[0-9\\.]/, false)) {\n        var floatLiteral = false;\n        // Floats\n        if (stream.match(/^[\\d_]*\\.\\d+(e[\\+\\-]?\\d+)?/i)) { floatLiteral = true; }\n        if (stream.match(/^[\\d_]+\\.\\d*/)) { floatLiteral = true; }\n        if (stream.match(/^\\.\\d+/)) { floatLiteral = true; }\n        if (floatLiteral) {\n          // Float literals may be \"imaginary\"\n          stream.eat(/J/i);\n          return \"number\";\n        }\n        // Integers\n        var intLiteral = false;\n        // Hex\n        if (stream.match(/^0x[0-9a-f_]+/i)) intLiteral = true;\n        // Binary\n        if (stream.match(/^0b[01_]+/i)) intLiteral = true;\n        // Octal\n        if (stream.match(/^0o[0-7_]+/i)) intLiteral = true;\n        // Decimal\n        if (stream.match(/^[1-9][\\d_]*(e[\\+\\-]?[\\d_]+)?/)) {\n          // Decimal literals may be \"imaginary\"\n          stream.eat(/J/i);\n          // TODO - Can you have imaginary longs?\n          intLiteral = true;\n        }\n        // Zero by itself with no other piece of number.\n        if (stream.match(/^0(?![\\dx])/i)) intLiteral = true;\n        if (intLiteral) {\n          // Integer literals may be \"long\"\n          stream.eat(/L/i);\n          return \"number\";\n        }\n      }\n\n      // Handle Strings\n      if (stream.match(stringPrefixes)) {\n        var isFmtString = stream.current().toLowerCase().indexOf('f') !== -1;\n        if (!isFmtString) {\n          state.tokenize = tokenStringFactory(stream.current());\n          return state.tokenize(stream, state);\n        } else {\n          state.tokenize = formatStringFactory(stream.current(), state.tokenize);\n          return state.tokenize(stream, state);\n        }\n      }\n\n      for (var i = 0; i < operators.length; i++)\n        if (stream.match(operators[i])) return \"operator\"\n\n      if (stream.match(delimiters)) return \"punctuation\";\n\n      if (state.lastToken == \".\" && stream.match(identifiers))\n        return \"property\";\n\n      if (stream.match(keywords) || stream.match(wordOperators))\n        return \"keyword\";\n\n      if (stream.match(builtins))\n        return \"builtin\";\n\n      if (stream.match(/^(self|cls)\\b/))\n        return \"variable-2\";\n\n      if (stream.match(identifiers)) {\n        if (state.lastToken == \"def\" || state.lastToken == \"class\")\n          return \"def\";\n        return \"variable\";\n      }\n\n      // Handle non-detected items\n      stream.next();\n      return ERRORCLASS;\n    }\n\n    function formatStringFactory(delimiter, tokenOuter) {\n      while (\"rubf\".indexOf(delimiter.charAt(0).toLowerCase()) >= 0)\n        delimiter = delimiter.substr(1);\n\n      var singleline = delimiter.length == 1;\n      var OUTCLASS = \"string\";\n\n      function tokenFString(stream, state) {\n        // inside f-str Expression\n        if (stream.match(delimiter)) {\n          // expression ends pre-maturally, but very common in editing\n          // Could show error to remind users to close brace here\n          state.tokenize = tokenString\n          return OUTCLASS;\n        } else if (stream.match('{')) {\n          // starting brace, if not eaten below\n          return \"punctuation\";\n        } else if (stream.match('}')) {\n          // return to regular inside string state\n          state.tokenize = tokenString\n          return \"punctuation\";\n        } else {\n          // use tokenBaseInner to parse the expression\n          return tokenBaseInner(stream, state);\n        }\n      }\n\n      function tokenString(stream, state) {\n        while (!stream.eol()) {\n          stream.eatWhile(/[^'\"\\{\\}\\\\]/);\n          if (stream.eat(\"\\\\\")) {\n            stream.next();\n            if (singleline && stream.eol())\n              return OUTCLASS;\n          } else if (stream.match(delimiter)) {\n            state.tokenize = tokenOuter;\n            return OUTCLASS;\n          } else if (stream.match('{{')) {\n            // ignore {{ in f-str\n            return OUTCLASS;\n          } else if (stream.match('{', false)) {\n            // switch to nested mode\n            state.tokenize = tokenFString\n            if (stream.current()) {\n              return OUTCLASS;\n            } else {\n              // need to return something, so eat the starting {\n              stream.next();\n              return \"punctuation\";\n            }\n          } else if (stream.match('}}')) {\n            return OUTCLASS;\n          } else if (stream.match('}')) {\n            // single } in f-string is an error\n            return ERRORCLASS;\n          } else {\n            stream.eat(/['\"]/);\n          }\n        }\n        if (singleline) {\n          if (parserConf.singleLineStringErrors)\n            return ERRORCLASS;\n          else\n            state.tokenize = tokenOuter;\n        }\n        return OUTCLASS;\n      }\n      tokenString.isString = true;\n      return tokenString;\n    }\n\n    function tokenStringFactory(delimiter) {\n      while (\"rubf\".indexOf(delimiter.charAt(0).toLowerCase()) >= 0)\n        delimiter = delimiter.substr(1);\n\n      var singleline = delimiter.length == 1;\n      var OUTCLASS = \"string\";\n\n      function tokenString(stream, state) {\n        while (!stream.eol()) {\n          stream.eatWhile(/[^'\"\\\\]/);\n          if (stream.eat(\"\\\\\")) {\n            stream.next();\n            if (singleline && stream.eol())\n              return OUTCLASS;\n          } else if (stream.match(delimiter)) {\n            state.tokenize = tokenBase;\n            return OUTCLASS;\n          } else {\n            stream.eat(/['\"]/);\n          }\n        }\n        if (singleline) {\n          if (parserConf.singleLineStringErrors)\n            return ERRORCLASS;\n          else\n            state.tokenize = tokenBase;\n        }\n        return OUTCLASS;\n      }\n      tokenString.isString = true;\n      return tokenString;\n    }\n\n    function pushPyScope(state) {\n      while (top(state).type != \"py\") state.scopes.pop()\n      state.scopes.push({offset: top(state).offset + conf.indentUnit,\n                         type: \"py\",\n                         align: null})\n    }\n\n    function pushBracketScope(stream, state, type) {\n      var align = stream.match(/^([\\s\\[\\{\\(]|#.*)*$/, false) ? null : stream.column() + 1\n      state.scopes.push({offset: state.indent + hangingIndent,\n                         type: type,\n                         align: align})\n    }\n\n    function dedent(stream, state) {\n      var indented = stream.indentation();\n      while (state.scopes.length > 1 && top(state).offset > indented) {\n        if (top(state).type != \"py\") return true;\n        state.scopes.pop();\n      }\n      return top(state).offset != indented;\n    }\n\n    function tokenLexer(stream, state) {\n      if (stream.sol()) state.beginningOfLine = true;\n\n      var style = state.tokenize(stream, state);\n      var current = stream.current();\n\n      // Handle decorators\n      if (state.beginningOfLine && current == \"@\")\n        return stream.match(identifiers, false) ? \"meta\" : py3 ? \"operator\" : ERRORCLASS;\n\n      if (/\\S/.test(current)) state.beginningOfLine = false;\n\n      if ((style == \"variable\" || style == \"builtin\")\n          && state.lastToken == \"meta\")\n        style = \"meta\";\n\n      // Handle scope changes.\n      if (current == \"pass\" || current == \"return\")\n        state.dedent += 1;\n\n      if (current == \"lambda\") state.lambda = true;\n      if (current == \":\" && !state.lambda && top(state).type == \"py\")\n        pushPyScope(state);\n\n      if (current.length == 1 && !/string|comment/.test(style)) {\n        var delimiter_index = \"[({\".indexOf(current);\n        if (delimiter_index != -1)\n          pushBracketScope(stream, state, \"])}\".slice(delimiter_index, delimiter_index+1));\n\n        delimiter_index = \"])}\".indexOf(current);\n        if (delimiter_index != -1) {\n          if (top(state).type == current) state.indent = state.scopes.pop().offset - hangingIndent\n          else return ERRORCLASS;\n        }\n      }\n      if (state.dedent > 0 && stream.eol() && top(state).type == \"py\") {\n        if (state.scopes.length > 1) state.scopes.pop();\n        state.dedent -= 1;\n      }\n\n      return style;\n    }\n\n    var external = {\n      startState: function(basecolumn) {\n        return {\n          tokenize: tokenBase,\n          scopes: [{offset: basecolumn || 0, type: \"py\", align: null}],\n          indent: basecolumn || 0,\n          lastToken: null,\n          lambda: false,\n          dedent: 0\n        };\n      },\n\n      token: function(stream, state) {\n        var addErr = state.errorToken;\n        if (addErr) state.errorToken = false;\n        var style = tokenLexer(stream, state);\n\n        if (style && style != \"comment\")\n          state.lastToken = (style == \"keyword\" || style == \"punctuation\") ? stream.current() : style;\n        if (style == \"punctuation\") style = null;\n\n        if (stream.eol() && state.lambda)\n          state.lambda = false;\n        return addErr ? style + \" \" + ERRORCLASS : style;\n      },\n\n      indent: function(state, textAfter) {\n        if (state.tokenize != tokenBase)\n          return state.tokenize.isString ? CodeMirror.Pass : 0;\n\n        var scope = top(state), closing = scope.type == textAfter.charAt(0)\n        if (scope.align != null)\n          return scope.align - (closing ? 1 : 0)\n        else\n          return scope.offset - (closing ? hangingIndent : 0)\n      },\n\n      electricInput: /^\\s*[\\}\\]\\)]$/,\n      closeBrackets: {triples: \"'\\\"\"},\n      lineComment: \"#\",\n      fold: \"indent\"\n    };\n    return external;\n  });\n\n  CodeMirror.defineMIME(\"text/x-python\", \"python\");\n\n  var words = function(str) { return str.split(\" \"); };\n\n  CodeMirror.defineMIME(\"text/x-cython\", {\n    name: \"python\",\n    extra_keywords: words(\"by cdef cimport cpdef ctypedef enum except \"+\n                          \"extern gil include nogil property public \"+\n                          \"readonly struct union DEF IF ELIF ELSE\")\n  });\n\n});\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/plugins/codemirror/mode/shell/shell.js",
    "content": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode('shell', function() {\n\n  var words = {};\n  function define(style, dict) {\n    for(var i = 0; i < dict.length; i++) {\n      words[dict[i]] = style;\n    }\n  };\n\n  var commonAtoms = [\"true\", \"false\"];\n  var commonKeywords = [\"if\", \"then\", \"do\", \"else\", \"elif\", \"while\", \"until\", \"for\", \"in\", \"esac\", \"fi\",\n    \"fin\", \"fil\", \"done\", \"exit\", \"set\", \"unset\", \"export\", \"function\"];\n  var commonCommands = [\"ab\", \"awk\", \"bash\", \"beep\", \"cat\", \"cc\", \"cd\", \"chown\", \"chmod\", \"chroot\", \"clear\",\n    \"cp\", \"curl\", \"cut\", \"diff\", \"echo\", \"find\", \"gawk\", \"gcc\", \"get\", \"git\", \"grep\", \"hg\", \"kill\", \"killall\",\n    \"ln\", \"ls\", \"make\", \"mkdir\", \"openssl\", \"mv\", \"nc\", \"nl\", \"node\", \"npm\", \"ping\", \"ps\", \"restart\", \"rm\",\n    \"rmdir\", \"sed\", \"service\", \"sh\", \"shopt\", \"shred\", \"source\", \"sort\", \"sleep\", \"ssh\", \"start\", \"stop\",\n    \"su\", \"sudo\", \"svn\", \"tee\", \"telnet\", \"top\", \"touch\", \"vi\", \"vim\", \"wall\", \"wc\", \"wget\", \"who\", \"write\",\n    \"yes\", \"zsh\"];\n\n  CodeMirror.registerHelper(\"hintWords\", \"shell\", commonAtoms.concat(commonKeywords, commonCommands));\n\n  define('atom', commonAtoms);\n  define('keyword', commonKeywords);\n  define('builtin', commonCommands);\n\n  function tokenBase(stream, state) {\n    if (stream.eatSpace()) return null;\n\n    var sol = stream.sol();\n    var ch = stream.next();\n\n    if (ch === '\\\\') {\n      stream.next();\n      return null;\n    }\n    if (ch === '\\'' || ch === '\"' || ch === '`') {\n      state.tokens.unshift(tokenString(ch, ch === \"`\" ? \"quote\" : \"string\"));\n      return tokenize(stream, state);\n    }\n    if (ch === '#') {\n      if (sol && stream.eat('!')) {\n        stream.skipToEnd();\n        return 'meta'; // 'comment'?\n      }\n      stream.skipToEnd();\n      return 'comment';\n    }\n    if (ch === '$') {\n      state.tokens.unshift(tokenDollar);\n      return tokenize(stream, state);\n    }\n    if (ch === '+' || ch === '=') {\n      return 'operator';\n    }\n    if (ch === '-') {\n      stream.eat('-');\n      stream.eatWhile(/\\w/);\n      return 'attribute';\n    }\n    if (/\\d/.test(ch)) {\n      stream.eatWhile(/\\d/);\n      if(stream.eol() || !/\\w/.test(stream.peek())) {\n        return 'number';\n      }\n    }\n    stream.eatWhile(/[\\w-]/);\n    var cur = stream.current();\n    if (stream.peek() === '=' && /\\w+/.test(cur)) return 'def';\n    return words.hasOwnProperty(cur) ? words[cur] : null;\n  }\n\n  function tokenString(quote, style) {\n    var close = quote == \"(\" ? \")\" : quote == \"{\" ? \"}\" : quote\n    return function(stream, state) {\n      var next, escaped = false;\n      while ((next = stream.next()) != null) {\n        if (next === close && !escaped) {\n          state.tokens.shift();\n          break;\n        } else if (next === '$' && !escaped && quote !== \"'\" && stream.peek() != close) {\n          escaped = true;\n          stream.backUp(1);\n          state.tokens.unshift(tokenDollar);\n          break;\n        } else if (!escaped && quote !== close && next === quote) {\n          state.tokens.unshift(tokenString(quote, style))\n          return tokenize(stream, state)\n        } else if (!escaped && /['\"]/.test(next) && !/['\"]/.test(quote)) {\n          state.tokens.unshift(tokenStringStart(next, \"string\"));\n          stream.backUp(1);\n          break;\n        }\n        escaped = !escaped && next === '\\\\';\n      }\n      return style;\n    };\n  };\n\n  function tokenStringStart(quote, style) {\n    return function(stream, state) {\n      state.tokens[0] = tokenString(quote, style)\n      stream.next()\n      return tokenize(stream, state)\n    }\n  }\n\n  var tokenDollar = function(stream, state) {\n    if (state.tokens.length > 1) stream.eat('$');\n    var ch = stream.next()\n    if (/['\"({]/.test(ch)) {\n      state.tokens[0] = tokenString(ch, ch == \"(\" ? \"quote\" : ch == \"{\" ? \"def\" : \"string\");\n      return tokenize(stream, state);\n    }\n    if (!/\\d/.test(ch)) stream.eatWhile(/\\w/);\n    state.tokens.shift();\n    return 'def';\n  };\n\n  function tokenize(stream, state) {\n    return (state.tokens[0] || tokenBase) (stream, state);\n  };\n\n  return {\n    startState: function() {return {tokens:[]};},\n    token: function(stream, state) {\n      return tokenize(stream, state);\n    },\n    closeBrackets: \"()[]{}''\\\"\\\"``\",\n    lineComment: '#',\n    fold: \"brace\"\n  };\n});\n\nCodeMirror.defineMIME('text/x-sh', 'shell');\n// Apache uses a slightly different Media Type for Shell scripts\n// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types\nCodeMirror.defineMIME('application/x-sh', 'shell');\n\n});\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/plugins/cronGen/cronGen.js",
    "content": "﻿(function ($) {\n    // var resultsName = \"\";\n    var inputElement;\n    var displayElement;\n    $.fn.extend({\n        cronGen: function (options) {\n            if (options == null) {\n              options = {};\n            }\n            options = $.extend({}, $.fn.cronGen.defaultOptions, options);\n            //create top menu\n            var cronContainer = $(\"<div/>\", { id: \"CronContainer\", style: \"display:none;width:300px;height:300px;\" });\n            var mainDiv = $(\"<div/>\", { id: \"CronGenMainDiv\", style: \"width:410px;height:420px;\" });\n            var topMenu = $(\"<ul/>\", { \"class\": \"nav nav-tabs\", id: \"CronGenTabs\" });\n            $('<li/>', { 'class': 'active' }).html($('<a id=\"SecondlyTab\" href=\"#Secondly\">秒</a>')).appendTo(topMenu);\n            $('<li/>').html($('<a id=\"MinutesTab\" href=\"#Minutes\">分钟</a>')).appendTo(topMenu);\n            $('<li/>').html($('<a id=\"HourlyTab\" href=\"#Hourly\">小时</a>')).appendTo(topMenu);\n            $('<li/>').html($('<a id=\"DailyTab\" href=\"#Daily\">日</a>')).appendTo(topMenu);\n            $('<li/>').html($('<a id=\"MonthlyTab\" href=\"#Monthly\">月</a>')).appendTo(topMenu);\n            $('<li/>').html($('<a id=\"WeeklyTab\" href=\"#Weekly\">周</a>')).appendTo(topMenu);\n            $('<li/>').html($('<a id=\"YearlyTab\" href=\"#Yearly\">年</a>')).appendTo(topMenu);\n            $(topMenu).appendTo(mainDiv);\n\n            //create what's inside the tabs\n            var container = $(\"<div/>\", { \"class\": \"container-fluid\", \"style\": \"margin-top: 30px;margin-left: -14px;\" });\n            var row = $(\"<div/>\", { \"class\": \"row-fluid\" });\n            var span12 = $(\"<div/>\", { \"class\": \"span12\" });\n            var tabContent = $(\"<div/>\", { \"class\": \"tab-content\", \"style\": \"border:0px; margin-top:-20px;\" });\n\n\n            //creating the secondsTab\n            var secondsTab = $(\"<div/>\", { \"class\": \"tab-pane active\", id: \"Secondly\" });\n            var seconds1 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"1\", name : \"second\"}).appendTo(seconds1);\n            $(seconds1).append(\"每秒 允许的通配符[, - * /]\");\n            $(seconds1).appendTo(secondsTab);\n\n            var seconds2 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"2\", name : \"second\"}).appendTo(seconds2);\n            $(seconds2).append(\"周期 从\");\n            $(\"<input/>\",{type : \"text\", id : \"secondStart_0\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(seconds2);\n            $(seconds2).append(\"-\");\n            $(\"<input/>\",{type : \"text\", id : \"secondEnd_0\", value : \"2\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(seconds2);\n            $(seconds2).append(\"秒\");\n            $(seconds2).appendTo(secondsTab);\n\n            var seconds3 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"3\", name : \"second\"}).appendTo(seconds3);\n            $(seconds3).append(\"从\");\n            $(\"<input/>\",{type : \"text\", id : \"secondStart_1\", value : \"0\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(seconds3);\n            $(seconds3).append(\"秒开始,每\");\n            $(\"<input/>\",{type : \"text\", id : \"secondEnd_1\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(seconds3);\n            $(seconds3).append(\"秒执行一次\");\n            $(seconds3).appendTo(secondsTab);\n\n            var seconds4 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"4\", name : \"second\", id: \"sencond_appoint\"}).appendTo(seconds4);\n            $(seconds4).append(\"指定\");\n            $(seconds4).appendTo(secondsTab);\n\n            $(secondsTab).append('<div class=\"imp secondList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"0\">00<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"1\">01<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"2\">02<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"3\">03<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"4\">04<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"5\">05<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"6\">06<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"7\">07<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"8\">08<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"9\">09</div>');\n            $(secondsTab).append('<div class=\"imp secondList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"10\">10<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"11\">11<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"12\">12<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"13\">13<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"14\">14<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"15\">15<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"16\">16<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"17\">17<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"18\">18<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"19\">19</div>');\n            $(secondsTab).append('<div class=\"imp secondList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"20\">20<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"21\">21<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"22\">22<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"23\">23<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"24\">24<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"25\">25<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"26\">26<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"27\">27<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"28\">28<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"29\">29</div>');\n            $(secondsTab).append('<div class=\"imp secondList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"30\">30<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"31\">31<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"32\">32<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"33\">33<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"34\">34<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"35\">35<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"36\">36<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"37\">37<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"38\">38<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"39\">39</div>');\n            $(secondsTab).append('<div class=\"imp secondList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"40\">40<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"41\">41<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"42\">42<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"43\">43<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"44\">44<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"45\">45<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"46\">46<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"47\">47<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"48\">48<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"49\">49</div>');\n            $(secondsTab).append('<div class=\"imp secondList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"50\">50<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"51\">51<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"52\">52<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"53\">53<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"54\">54<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"55\">55<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"56\">56<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"57\">57<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"58\">58<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"59\">59</div>');\n            $(\"<input/>\",{type : \"hidden\", id : \"secondHidden\"}).appendTo(secondsTab);\n            $(secondsTab).appendTo(tabContent);\n\n            //creating the minutesTab\n            var minutesTab = $(\"<div/>\", { \"class\": \"tab-pane\", id: \"Minutes\" });\n\n            var minutes1 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"1\", name : \"min\"}).appendTo(minutes1);\n            $(minutes1).append(\"每分钟 允许的通配符[, - * /]\");\n            $(minutes1).appendTo(minutesTab);\n\n            var minutes2 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"2\", name : \"min\"}).appendTo(minutes2);\n            $(minutes2).append(\"周期 从\");\n            $(\"<input/>\",{type : \"text\", id : \"minStart_0\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(minutes2);\n            $(minutes2).append(\"-\");\n            $(\"<input/>\",{type : \"text\", id : \"minEnd_0\", value : \"2\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(minutes2);\n            $(minutes2).append(\"分钟\");\n            $(minutes2).appendTo(minutesTab);\n\n            var minutes3 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"3\", name : \"min\"}).appendTo(minutes3);\n            $(minutes3).append(\"从\");\n            $(\"<input/>\",{type : \"text\", id : \"minStart_1\", value : \"0\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(minutes3);\n            $(minutes3).append(\"分钟开始,每\");\n            $(\"<input/>\",{type : \"text\", id : \"minEnd_1\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(minutes3);\n            $(minutes3).append(\"分钟执行一次\");\n            $(minutes3).appendTo(minutesTab);\n\n            var minutes4 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"4\", name : \"min\", id: \"min_appoint\"}).appendTo(minutes4);\n            $(minutes4).append(\"指定\");\n            $(minutes4).appendTo(minutesTab);\n\n            $(minutesTab).append('<div class=\"imp minList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"0\">00<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"1\">01<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"2\">02<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"3\">03<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"4\">04<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"5\">05<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"6\">06<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"7\">07<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"8\">08<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"9\">09</div>');\n            $(minutesTab).append('<div class=\"imp minList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"10\">10<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"11\">11<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"12\">12<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"13\">13<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"14\">14<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"15\">15<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"16\">16<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"17\">17<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"18\">18<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"19\">19</div>');\n            $(minutesTab).append('<div class=\"imp minList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"20\">20<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"21\">21<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"22\">22<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"23\">23<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"24\">24<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"25\">25<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"26\">26<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"27\">27<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"28\">28<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"29\">29</div>');\n            $(minutesTab).append('<div class=\"imp minList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"30\">30<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"31\">31<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"32\">32<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"33\">33<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"34\">34<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"35\">35<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"36\">36<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"37\">37<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"38\">38<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"39\">39</div>');\n            $(minutesTab).append('<div class=\"imp minList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"40\">40<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"41\">41<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"42\">42<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"43\">43<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"44\">44<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"45\">45<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"46\">46<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"47\">47<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"48\">48<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"49\">49</div>');\n            $(minutesTab).append('<div class=\"imp minList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"50\">50<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"51\">51<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"52\">52<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"53\">53<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"54\">54<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"55\">55<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"56\">56<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"57\">57<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"58\">58<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"59\">59</div>');\n            $(\"<input/>\",{type : \"hidden\", id : \"minHidden\"}).appendTo(minutesTab);\n            $(minutesTab).appendTo(tabContent);\n\n            //creating the hourlyTab\n            var hourlyTab = $(\"<div/>\", { \"class\": \"tab-pane\", id: \"Hourly\" });\n\n            var hourly1 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"1\", name : \"hour\"}).appendTo(hourly1);\n            $(hourly1).append(\"每小时 允许的通配符[, - * /]\");\n            $(hourly1).appendTo(hourlyTab);\n\n            var hourly2 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"2\", name : \"hour\"}).appendTo(hourly2);\n            $(hourly2).append(\"周期 从\");\n            $(\"<input/>\",{type : \"text\", id : \"hourStart_0\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(hourly2);\n            $(hourly2).append(\"-\");\n            $(\"<input/>\",{type : \"text\", id : \"hourEnd_0\", value : \"2\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(hourly2);\n            $(hourly2).append(\"小时\");\n            $(hourly2).appendTo(hourlyTab);\n\n            var hourly3 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"3\", name : \"hour\"}).appendTo(hourly3);\n            $(hourly3).append(\"从\");\n            $(\"<input/>\",{type : \"text\", id : \"hourStart_1\", value : \"0\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(hourly3);\n            $(hourly3).append(\"小时开始,每\");\n            $(\"<input/>\",{type : \"text\", id : \"hourEnd_1\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(hourly3);\n            $(hourly3).append(\"小时执行一次\");\n            $(hourly3).appendTo(hourlyTab);\n\n            var hourly4 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"4\", name : \"hour\", id: \"hour_appoint\"}).appendTo(hourly4);\n            $(hourly4).append(\"指定\");\n            $(hourly4).appendTo(hourlyTab);\n\n            $(hourlyTab).append('<div class=\"imp hourList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"0\">00<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"1\">01<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"2\">02<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"3\">03<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"4\">04<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"5\">05</div>');\n            $(hourlyTab).append('<div class=\"imp hourList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"6\">06<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"7\">07<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"8\">08<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"9\">09<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"10\">10<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"11\">11</div>');\n            $(hourlyTab).append('<div class=\"imp hourList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"12\">12<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"13\">13<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"14\">14<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"15\">15<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"16\">16<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"17\">17</div>');\n            $(hourlyTab).append('<div class=\"imp hourList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"18\">18<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"19\">19<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"20\">20<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"21\">21<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"22\">22<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"23\">23</div>');\n            $(\"<input/>\",{type : \"hidden\", id : \"hourHidden\"}).appendTo(hourlyTab);\n            $(hourlyTab).appendTo(tabContent);\n\n\n            //creating the dailyTab\n            var dailyTab = $(\"<div/>\", { \"class\": \"tab-pane\", id: \"Daily\" });\n\n            var daily1 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"1\", name : \"day\"}).appendTo(daily1);\n            $(daily1).append(\"每天 允许的通配符[, - * / L W]\");\n            $(daily1).appendTo(dailyTab);\n\n            var daily5 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"2\", name : \"day\"}).appendTo(daily5);\n            $(daily5).append(\"不指定\");\n            $(daily5).appendTo(dailyTab);\n\n            var daily2 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"3\", name : \"day\"}).appendTo(daily2);\n            $(daily2).append(\"周期 从\");\n            $(\"<input/>\",{type : \"text\", id : \"dayStart_0\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(daily2);\n            $(daily2).append(\"-\");\n            $(\"<input/>\",{type : \"text\", id : \"dayEnd_0\", value : \"2\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(daily2);\n            $(daily2).append(\"日\");\n            $(daily2).appendTo(dailyTab);\n\n            var daily3 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"4\", name : \"day\"}).appendTo(daily3);\n            $(daily3).append(\"从\");\n            $(\"<input/>\",{type : \"text\", id : \"dayStart_1\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(daily3);\n            $(daily3).append(\"日开始,每\");\n            $(\"<input/>\",{type : \"text\", id : \"dayEnd_1\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(daily3);\n            $(daily3).append(\"天执行一次\");\n            $(daily3).appendTo(dailyTab);\n\n            var daily6 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"5\", name : \"day\"}).appendTo(daily6);\n            $(daily6).append(\"每月\");\n            $(\"<input/>\",{type : \"text\", id : \"dayStart_2\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(daily6);\n            $(daily6).append(\"号最近的那个工作日\");\n            $(daily6).appendTo(dailyTab);\n\n            var daily7 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"6\", name : \"day\"}).appendTo(daily7);\n            $(daily7).append(\"本月最后一天\");\n            $(daily7).appendTo(dailyTab);\n\n            var daily4 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"7\", name : \"day\", id: \"day_appoint\"}).appendTo(daily4);\n            $(daily4).append(\"指定\");\n            $(daily4).appendTo(dailyTab);\n\n            $(dailyTab).append('<div class=\"imp dayList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"1\">01<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"2\">02<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"3\">03<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"4\">04<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"5\">05<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"6\">06<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"7\">07<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"8\">08<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"9\">09<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"10\">10</div>');\n            $(dailyTab).append('<div class=\"imp dayList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"11\">11<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"12\">12<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"13\">13<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"14\">14<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"15\">15<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"16\">16<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"17\">17<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"18\">18<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"19\">19<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"20\">20</div>');\n            $(dailyTab).append('<div class=\"imp dayList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"21\">21<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"22\">22<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"23\">23<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"24\">24<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"25\">25<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"26\">26<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"27\">27<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"28\">28<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"29\">29<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"30\">30</div>');\n            $(dailyTab).append('<div class=\"imp dayList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"31\">31</div>');\n            $(\"<input/>\",{type : \"hidden\", id : \"dayHidden\"}).appendTo(dailyTab);\n            $(dailyTab).appendTo(tabContent);\n\n\n            //creating the monthlyTab\n            var monthlyTab = $(\"<div/>\", { \"class\": \"tab-pane\", id: \"Monthly\" });\n\n            var monthly1 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"1\", name : \"month\"}).appendTo(monthly1);\n            $(monthly1).append(\"每月 允许的通配符[, - * /]\");\n            $(monthly1).appendTo(monthlyTab);\n\n            var monthly2 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"2\", name : \"month\"}).appendTo(monthly2);\n            $(monthly2).append(\"不指定\");\n            $(monthly2).appendTo(monthlyTab);\n\n            var monthly3 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"3\", name : \"month\"}).appendTo(monthly3);\n            $(monthly3).append(\"周期 从\");\n            $(\"<input/>\",{type : \"text\", id : \"monthStart_0\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(monthly3);\n            $(monthly3).append(\"-\");\n            $(\"<input/>\",{type : \"text\", id : \"monthEnd_0\", value : \"2\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(monthly3);\n            $(monthly3).append(\"月\");\n            $(monthly3).appendTo(monthlyTab);\n\n            var monthly4 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"4\", name : \"month\"}).appendTo(monthly4);\n            $(monthly4).append(\"从\");\n            $(\"<input/>\",{type : \"text\", id : \"monthStart_1\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(monthly4);\n            $(monthly4).append(\"月开始,每\");\n            $(\"<input/>\",{type : \"text\", id : \"monthEnd_1\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(monthly4);\n            $(monthly4).append(\"月执行一次\");\n            $(monthly4).appendTo(monthlyTab);\n\n            var monthly5 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"5\", name : \"month\", id: \"month_appoint\"}).appendTo(monthly5);\n            $(monthly5).append(\"指定\");\n            $(monthly5).appendTo(monthlyTab);\n\n            $(monthlyTab).append('<div class=\"imp monthList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"1\">01<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"2\">02<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"3\">03<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"4\">04<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"5\">05<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"6\">06</div>');\n            $(monthlyTab).append('<div class=\"imp monthList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"7\">07<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"8\">08<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"9\">09<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"10\">10<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"11\">11<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"12\">12</div>');\n            $(\"<input/>\",{type : \"hidden\", id : \"monthHidden\"}).appendTo(monthlyTab);\n            $(monthlyTab).appendTo(tabContent);\n\n            //creating the weeklyTab\n            var weeklyTab = $(\"<div/>\", { \"class\": \"tab-pane\", id: \"Weekly\" });\n\n            var weekly1 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"1\", name : \"week\"}).appendTo(weekly1);\n            $(weekly1).append(\"每周 允许的通配符[, - * / L #]\");\n            $(weekly1).appendTo(weeklyTab);\n\n            var weekly2 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"2\", name : \"week\"}).appendTo(weekly2);\n            $(weekly2).append(\"不指定\");\n            $(weekly2).appendTo(weeklyTab);\n\n            var weekly3 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"3\", name : \"week\"}).appendTo(weekly3);\n            $(weekly3).append(\"周期 从星期\");\n            $(\"<input/>\",{type : \"text\", id : \"weekStart_0\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(weekly3);\n            $(weekly3).append(\"-\");\n            $(\"<input/>\",{type : \"text\", id : \"weekEnd_0\", value : \"2\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(weekly3);\n            $(weekly3).appendTo(weeklyTab);\n\n            var weekly4 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"4\", name : \"week\"}).appendTo(weekly4);\n            $(weekly4).append(\"第\");\n            $(\"<input/>\",{type : \"text\", id : \"weekStart_1\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(weekly4);\n            $(weekly4).append(\"周的星期\");\n            $(\"<input/>\",{type : \"text\", id : \"weekEnd_1\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(weekly4);\n            $(weekly4).appendTo(weeklyTab);\n\n            var weekly5 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"5\", name : \"week\"}).appendTo(weekly5);\n            $(weekly5).append(\"本月最后一个星期\");\n            $(\"<input/>\",{type : \"text\", id : \"weekStart_2\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(weekly5);\n            $(weekly5).appendTo(weeklyTab);\n\n            var weekly6 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"6\", name : \"week\", id: \"week_appoint\"}).appendTo(weekly6);\n            $(weekly6).append(\"指定\");\n            $(weekly6).appendTo(weeklyTab);\n\n            $(weeklyTab).append('<div class=\"imp weekList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"1\">1<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"2\">2<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"3\">3<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"4\">4<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"5\">5<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"6\">6<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"7\">7</div>');\n\n            $(\"<input/>\",{type : \"hidden\", id : \"weekHidden\"}).appendTo(weeklyTab);\n            $(weeklyTab).appendTo(tabContent);\n\n            //creating the yearlyTab\n            var yearlyTab = $(\"<div/>\", { \"class\": \"tab-pane\", id: \"Yearly\" });\n\n            var yearly1 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"1\", name : \"year\"}).appendTo(yearly1);\n            $(yearly1).append(\"不指定 允许的通配符[, - * /] 非必填\");\n            $(yearly1).appendTo(yearlyTab);\n\n            var yearly3 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"2\", name : \"year\"}).appendTo(yearly3);\n            $(yearly3).append(\"每年\");\n            $(yearly3).appendTo(yearlyTab);\n\n            var yearly2 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"3\", name : \"year\"}).appendTo(yearly2);\n            $(yearly2).append(\"周期从\");\n            $(\"<input/>\",{type : \"text\", id : \"yearStart_0\", value : \"2016\", style:\"width:45px; height:20px;\"}).appendTo(yearly2);\n            $(yearly2).append(\"-\");\n            $(\"<input/>\",{type : \"text\", id : \"yearEnd_0\", value : \"2017\", style:\"width:45px; height:20px;\"}).appendTo(yearly2);\n            $(yearly2).append(\"年\");\n            $(yearly2).appendTo(yearlyTab);\n            $(\"<input/>\",{type : \"hidden\", id : \"yearHidden\"}).appendTo(yearlyTab);\n            $(yearlyTab).appendTo(tabContent);\n\n            $(tabContent).appendTo(span12);\n\n            //creating the button and results input\n            // resultsName = $(this).prop(\"id\");\n            // $(this).prop(\"name\", resultsName);\n\n            var runTime = '<br style=\"padding-top: 10px\"><label>最近运行时间: </label></br><textarea id=\"runTime\" rows=\"6\" style=\"width: 90%;resize: none;background: none;border: none;outline: none;\" readonly = readonly></textarea></div>';\n\n            $(span12).appendTo(row);\n            $(row).appendTo(container);\n            $(container).appendTo(mainDiv);\n            $(runTime).appendTo(mainDiv);\n            $(cronContainer).append(mainDiv);\n\n            var that = $(this);\n\n            // Hide the original input\n            that.hide();\n\n            // Replace the input with an input group\n            var $g = $(\"<div>\").addClass(\"input-group\");\n            // Add an input\n            var $i = $(\"<input>\", { type: 'text', placeholder: 'cron表达式...', name: 'cronGen_display' }).addClass(\"form-control\").val($(that).val());\n            $i.appendTo($g);\n            // Add the button\n            var $b = $(\"<button class=\\\"btn btn-default\\\"><i class=\\\"fa fa-edit\\\"></i></button>\");\n            // Put button inside span\n            var $s = $(\"<span>\").addClass(\"input-group-btn\");\n            $b.appendTo($s);\n            $s.appendTo($g);\n\n            $(this).before($g);\n\n            inputElement = that;\n            displayElement = $i;\n\n            $b.popover({\n                html: true,\n                content: function () {\n                    return $(cronContainer).html();\n                },\n                template: '<div class=\"popover\" style=\"max-width:500px !important; width:425px;left:-341.656px;\"><div class=\"arrow\"></div><div class=\"popover-inner\"><h3 class=\"popover-title\"></h3><div class=\"popover-content\"><p></p></div></div></div>',\n                sanitize:false,\n                placement: options.direction\n\n            }).on('click', function (e) {\n                if (inputElement.val().trim() !== '') {\n                    refreshRunTime();\n                }\n                e.preventDefault();\n\n                //fillDataOfMinutesAndHoursSelectOptions();\n                //fillDayWeekInMonth();\n                //fillInWeekDays();\n                //fillInMonths();\n\n                $.fn.cronGen.tools.cronParse(inputElement.val());\n\n                //绑定指定事件\n                $.fn.cronGen.tools.initChangeEvent();\n\n\n                $('#CronGenTabs a').click(function (e) {\n                    e.preventDefault();\n                    $(this).tab('show');\n                    //generate();\n                });\n                $(\"#CronGenMainDiv select,input\").change(function (e) {\n                    generate();\n                    refreshRunTime();\n                });\n                $(\"#CronGenMainDiv input\").focus(function (e) {\n                    generate();\n                });\n                //generate();\n            });\n            return;\n        }\n    });\n\n\n    var fillInMonths = function () {\n        var days = [\n            { text: \"一月\", val: \"1\" },\n            { text: \"二月\", val: \"2\" },\n            { text: \"三月\", val: \"3\" },\n            { text: \"四月\", val: \"4\" },\n            { text: \"五月\", val: \"5\" },\n            { text: \"六月\", val: \"6\" },\n            { text: \"七月\", val: \"7\" },\n            { text: \"八月\", val: \"8\" },\n            { text: \"九月\", val: \"9\" },\n            { text: \"十月\", val: \"10\" },\n            { text: \"十一月\", val: \"11\" },\n            { text: \"十二月\", val: \"12\" }\n        ];\n        $(\".months\").each(function () {\n            fillOptions(this, days);\n        });\n    };\n\n    var fillOptions = function (elements, options) {\n        for (var i = 0; i < options.length; i++)\n            $(elements).append(\"<option value='\" + options[i].val + \"'>\" + options[i].text + \"</option>\");\n    };\n    var fillDataOfMinutesAndHoursSelectOptions = function () {\n        for (var i = 0; i < 60; i++) {\n            if (i < 24) {\n                $(\".hours\").each(function () { $(this).append(timeSelectOption(i)); });\n            }\n            $(\".minutes\").each(function () { $(this).append(timeSelectOption(i)); });\n        }\n    };\n    var fillInWeekDays = function () {\n        var days = [\n            { text: \"周一\", val: \"2\" },\n            { text: \"周二\", val: \"3\" },\n            { text: \"周三\", val: \"4\" },\n            { text: \"周四\", val: \"5\" },\n            { text: \"周五\", val: \"6\" },\n            { text: \"周六\", val: \"7\" },\n            { text: \"周天\", val: \"1\" }\n        ];\n        $(\".week-days\").each(function () {\n            fillOptions(this, days);\n        });\n\n    };\n    var fillDayWeekInMonth = function () {\n        var days = [\n            { text: \"第一个\", val: \"1\" },\n            { text: \"第二个\", val: \"2\" },\n            { text: \"第三个\", val: \"3\" },\n            { text: \"第四个\", val: \"4\" }\n        ];\n        $(\".day-order-in-month\").each(function () {\n            fillOptions(this, days);\n        });\n    };\n    var displayTimeUnit = function (unit) {\n        if (unit.toString().length == 1)\n            return \"0\" + unit;\n        return unit;\n    };\n    var timeSelectOption = function (i) {\n        return \"<option id='\" + i + \"'>\" + displayTimeUnit(i) + \"</option>\";\n    };\n\n    var generate = function () {\n\n        var activeTab = $(\"ul#CronGenTabs li.active a\").prop(\"id\");\n        if (activeTab == undefined) {\n            return;\n        }\n        var results = \"\";\n        switch (activeTab) {\n            case \"SecondlyTab\":\n                switch ($(\"input:radio[name=second]:checked\").val()) {\n                    case \"1\":\n                        $.fn.cronGen.tools.everyTime(\"second\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"2\":\n                        $.fn.cronGen.tools.cycle(\"second\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"3\":\n                        $.fn.cronGen.tools.startOn(\"second\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"4\":\n                    \t$.fn.cronGen.tools.initCheckBox(\"second\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                }\n                break;\n            case \"MinutesTab\":\n                switch ($(\"input:radio[name=min]:checked\").val()) {\n                    case \"1\":\n                        $.fn.cronGen.tools.everyTime(\"min\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"2\":\n                        $.fn.cronGen.tools.cycle(\"min\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"3\":\n                        $.fn.cronGen.tools.startOn(\"min\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"4\":\n                    \t$.fn.cronGen.tools.initCheckBox(\"min\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                }\n                break;\n            case \"HourlyTab\":\n                switch ($(\"input:radio[name=hour]:checked\").val()) {\n                    case \"1\":\n                       $.fn.cronGen.tools.everyTime(\"hour\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"2\":\n                       $.fn.cronGen.tools.cycle(\"hour\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"3\":\n                        $.fn.cronGen.tools.startOn(\"hour\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"4\":\n                    \t$.fn.cronGen.tools.initCheckBox(\"hour\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                }\n                break;\n            case \"DailyTab\":\n                switch ($(\"input:radio[name=day]:checked\").val()) {\n                    case \"1\":\n                        $.fn.cronGen.tools.everyTime(\"day\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"2\":\n                        $.fn.cronGen.tools.unAppoint(\"day\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"3\":\n                        $.fn.cronGen.tools.cycle(\"day\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"4\":\n                        $.fn.cronGen.tools.startOn(\"day\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"5\":\n                        $.fn.cronGen.tools.workDay(\"day\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"6\":\n                        $.fn.cronGen.tools.lastDay(\"day\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"7\":\n                    \t$.fn.cronGen.tools.initCheckBox(\"day\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                }\n                break;\n            case \"WeeklyTab\":\n                switch ($(\"input:radio[name=week]:checked\").val()) {\n                    case \"1\":\n                        $.fn.cronGen.tools.everyTime(\"week\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"2\":\n                        $.fn.cronGen.tools.unAppoint(\"week\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"3\":\n                        $.fn.cronGen.tools.cycle(\"week\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"4\":\n                        $.fn.cronGen.tools.startOn(\"week\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"5\":\n                        $.fn.cronGen.tools.lastWeek(\"week\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"6\":\n                    \t$.fn.cronGen.tools.initCheckBox(\"week\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                }\n                break;\n            case \"MonthlyTab\":\n                switch ($(\"input:radio[name=month]:checked\").val()) {\n                    case \"1\":\n                        $.fn.cronGen.tools.everyTime(\"month\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"2\":\n                        $.fn.cronGen.tools.unAppoint(\"month\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"3\":\n                        $.fn.cronGen.tools.cycle(\"month\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"4\":\n                        $.fn.cronGen.tools.startOn(\"month\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"5\":\n                    \t$.fn.cronGen.tools.initCheckBox(\"month\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                }\n                break;\n            case \"YearlyTab\":\n                switch ($(\"input:radio[name=year]:checked\").val()) {\n                    case \"1\":\n                        $.fn.cronGen.tools.unAppoint(\"year\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"2\":\n                        $.fn.cronGen.tools.everyTime(\"year\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"3\":\n                        $.fn.cronGen.tools.cycle(\"year\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                }\n                break;\n        }\n\n        // Update original control\n        inputElement.val(results);\n        // Update display\n        displayElement.val(results);\n    };\n\n    var refreshRunTime = function () {\n        $.ajax({\n            type : 'GET',\n            url : base_url + \"/jobinfo/nextTriggerTime\",\n            data : {\n                \"scheduleType\" : 'CRON',\n                \"scheduleConf\" : inputElement.val()\n            },\n            dataType : \"json\",\n            success : function(data){\n                if (data.code === 200) {\n                    $('#runTime').val(data.content.join(\"\\n\"));\n                } else {\n                    $('#runTime').val(data.msg);\n                }\n            }\n        });\n    };\n\n})(jQuery);\n\n(function($) {\n    $.fn.cronGen.defaultOptions = {\n        direction : 'bottom'\n    };\n    $.fn.cronGen.tools = {\n        /**\n         * 每周期\n         */\n        everyTime : function(dom){\n            $(\"#\"+dom+\"Hidden\").val(\"*\");\n            $.fn.cronGen.tools.clearCheckbox(dom);\n        },\n        /**\n         * 不指定\n         */\n        unAppoint : function(dom){\n            var val = \"?\";\n            if (dom == \"year\")\n            {\n                val = \"\";\n            }\n            $(\"#\"+dom+\"Hidden\").val(val);\n            $.fn.cronGen.tools.clearCheckbox(dom);\n        },\n        /**\n         * 周期\n         */\n        cycle : function(dom){\n            var start = $(\"#\"+dom+\"Start_0\").val();\n            var end = $(\"#\"+dom+\"End_0\").val();\n            $(\"#\"+dom+\"Hidden\").val(start + \"-\" + end);\n            $.fn.cronGen.tools.clearCheckbox(dom);\n        },\n        /**\n         * 从开始\n         */\n        startOn : function(dom) {\n            var start = $(\"#\"+dom+\"Start_1\").val();\n            var end = $(\"#\"+dom+\"End_1\").val();\n            $(\"#\"+dom+\"Hidden\").val(start + \"/\" + end);\n            $.fn.cronGen.tools.clearCheckbox(dom);\n        },\n        /**\n         * 最后一天\n         */\n        lastDay : function(dom){\n            $(\"#\"+dom+\"Hidden\").val(\"L\");\n            $.fn.cronGen.tools.clearCheckbox(dom);\n        },\n        /**\n         * 每周的某一天\n         */\n        weekOfDay : function(dom){\n            var start = $(\"#\"+dom+\"Start_0\").val();\n            var end = $(\"#\"+dom+\"End_0\").val();\n            $(\"#\"+dom+\"Hidden\").val(start + \"#\" + end);\n            $.fn.cronGen.tools.clearCheckbox(dom);\n        },\n        /**\n         * 最后一周\n         */\n        lastWeek : function(dom){\n            var start = $(\"#\"+dom+\"Start_2\").val();\n            $(\"#\"+dom+\"Hidden\").val(start+\"L\");\n            $.fn.cronGen.tools.clearCheckbox(dom);\n        },\n        /**\n         * 工作日\n         */\n        workDay : function(dom) {\n            var start = $(\"#\"+dom+\"Start_2\").val();\n            $(\"#\"+dom+\"Hidden\").val(start + \"W\");\n            $.fn.cronGen.tools.clearCheckbox(dom);\n        },\n        initChangeEvent : function(){\n            var secondList = $(\".secondList\").children();\n            $(\"#sencond_appoint\").click(function(){\n                if (this.checked) {\n                    if ($(secondList).filter(\":checked\").length == 0) {\n                        $(secondList.eq(0)).attr(\"checked\", true);\n                    }\n                    secondList.eq(0).change();\n                }\n            });\n\n            secondList.change(function() {\n                var sencond_appoint = $(\"#sencond_appoint\").prop(\"checked\");\n                if (sencond_appoint) {\n                    var vals = [];\n                    secondList.each(function() {\n                        if (this.checked) {\n                            vals.push(this.value);\n                        }\n                    });\n                    var val = \"?\";\n                    if (vals.length > 0 && vals.length < 59) {\n                        val = vals.join(\",\");\n                    }else if(vals.length == 59){\n                        val = \"*\";\n                    }\n                    $(\"#secondHidden\").val(val);\n                }\n            });\n\n            var minList = $(\".minList\").children();\n            $(\"#min_appoint\").click(function(){\n                if (this.checked) {\n                    if ($(minList).filter(\":checked\").length == 0) {\n                        $(minList.eq(0)).attr(\"checked\", true);\n                    }\n                    minList.eq(0).change();\n                }\n            });\n\n            minList.change(function() {\n                var min_appoint = $(\"#min_appoint\").prop(\"checked\");\n                if (min_appoint) {\n                    var vals = [];\n                    minList.each(function() {\n                        if (this.checked) {\n                            vals.push(this.value);\n                        }\n                    });\n                    var val = \"?\";\n                    if (vals.length > 0 && vals.length < 59) {\n                        val = vals.join(\",\");\n                    }else if(vals.length == 59){\n                        val = \"*\";\n                    }\n                    $(\"#minHidden\").val(val);\n                }\n            });\n\n            var hourList = $(\".hourList\").children();\n            $(\"#hour_appoint\").click(function(){\n                if (this.checked) {\n                    if ($(hourList).filter(\":checked\").length == 0) {\n                        $(hourList.eq(0)).attr(\"checked\", true);\n                    }\n                    hourList.eq(0).change();\n                }\n            });\n\n            hourList.change(function() {\n                var hour_appoint = $(\"#hour_appoint\").prop(\"checked\");\n                if (hour_appoint) {\n                    var vals = [];\n                    hourList.each(function() {\n                        if (this.checked) {\n                            vals.push(this.value);\n                        }\n                    });\n                    var val = \"?\";\n                    if (vals.length > 0 && vals.length < 24) {\n                        val = vals.join(\",\");\n                    }else if(vals.length == 24){\n                        val = \"*\";\n                    }\n                    $(\"#hourHidden\").val(val);\n                }\n            });\n\n            var dayList = $(\".dayList\").children();\n            $(\"#day_appoint\").click(function(){\n                if (this.checked) {\n                    if ($(dayList).filter(\":checked\").length == 0) {\n                        $(dayList.eq(0)).attr(\"checked\", true);\n                    }\n                    dayList.eq(0).change();\n                }\n            });\n\n            dayList.change(function() {\n                var day_appoint = $(\"#day_appoint\").prop(\"checked\");\n                if (day_appoint) {\n                    var vals = [];\n                    dayList.each(function() {\n                        if (this.checked) {\n                            vals.push(this.value);\n                        }\n                    });\n                    var val = \"?\";\n                    if (vals.length > 0 && vals.length < 31) {\n                        val = vals.join(\",\");\n                    }else if(vals.length == 31){\n                        val = \"*\";\n                    }\n                   $(\"#dayHidden\").val(val);\n                }\n            });\n\n            var monthList = $(\".monthList\").children();\n            $(\"#month_appoint\").click(function(){\n                if (this.checked) {\n                    if ($(monthList).filter(\":checked\").length == 0) {\n                        $(monthList.eq(0)).attr(\"checked\", true);\n                    }\n                    monthList.eq(0).change();\n                }\n            });\n\n            monthList.change(function() {\n                var month_appoint = $(\"#month_appoint\").prop(\"checked\");\n                if (month_appoint) {\n                    var vals = [];\n                    monthList.each(function() {\n                        if (this.checked) {\n                            vals.push(this.value);\n                        }\n                    });\n                    var val = \"?\";\n                    if (vals.length > 0 && vals.length < 12) {\n                        val = vals.join(\",\");\n                    }else if(vals.length == 12){\n                        val = \"*\";\n                    }\n                    $(\"#monthHidden\").val(val);\n                }\n            });\n\n            var weekList = $(\".weekList\").children();\n            $(\"#week_appoint\").click(function(){\n                if (this.checked) {\n                    if ($(weekList).filter(\":checked\").length == 0) {\n                        $(weekList.eq(0)).attr(\"checked\", true);\n                    }\n                    weekList.eq(0).change();\n                }\n            });\n\n            weekList.change(function() {\n                var week_appoint = $(\"#week_appoint\").prop(\"checked\");\n                if (week_appoint) {\n                    var vals = [];\n                    weekList.each(function() {\n                        if (this.checked) {\n                            vals.push(this.value);\n                        }\n                    });\n                    var val = \"?\";\n                    if (vals.length > 0 && vals.length < 7) {\n                        val = vals.join(\",\");\n                    }else if(vals.length == 7){\n                        val = \"*\";\n                    }\n                   $(\"#weekHidden\").val(val);\n                }\n            });\n        },\n        initObj : function(strVal, strid){\n            var ary = null;\n            var objRadio = $(\"input[name='\" + strid + \"'\");\n            if (strVal == \"*\") {\n                objRadio.eq(0).attr(\"checked\", \"checked\");\n            } else if (strVal.split('-').length > 1) {\n                ary = strVal.split('-');\n                objRadio.eq(1).attr(\"checked\", \"checked\");\n                $(\"#\" + strid + \"Start_0\").val(ary[0]);\n                $(\"#\" + strid + \"End_0\").val(ary[1]);\n            } else if (strVal.split('/').length > 1) {\n                ary = strVal.split('/');\n                objRadio.eq(2).attr(\"checked\", \"checked\");\n                $(\"#\" + strid + \"Start_1\").val(ary[0]);\n                $(\"#\" + strid + \"End_1\").val(ary[1]);\n            } else {\n                objRadio.eq(3).attr(\"checked\", \"checked\");\n                if (strVal != \"?\") {\n                    ary = strVal.split(\",\");\n                    for (var i = 0; i < ary.length; i++) {\n                        $(\".\" + strid + \"List input[value='\" + ary[i] + \"']\").attr(\"checked\", \"checked\");\n                    }\n                    $.fn.cronGen.tools.initCheckBox(strid);\n                }\n            }\n        },\n        initDay : function(strVal) {\n            var ary = null;\n            var objRadio = $(\"input[name='day'\");\n            if (strVal == \"*\") {\n                objRadio.eq(0).attr(\"checked\", \"checked\");\n            } else if (strVal == \"?\") {\n                objRadio.eq(1).attr(\"checked\", \"checked\");\n            } else if (strVal.split('-').length > 1) {\n                ary = strVal.split('-');\n                objRadio.eq(2).attr(\"checked\", \"checked\");\n                $(\"#dayStart_0\").val(ary[0]);\n                $(\"#dayEnd_0\").val(ary[1]);\n            } else if (strVal.split('/').length > 1) {\n                ary = strVal.split('/');\n                objRadio.eq(3).attr(\"checked\", \"checked\");\n                $(\"#dayStart_1\").val(ary[0]);\n                $(\"#dayEnd_1\").val(ary[1]);\n            } else if (strVal.split('W').length > 1) {\n                ary = strVal.split('W');\n                objRadio.eq(4).attr(\"checked\", \"checked\");\n                $(\"#dayStart_2\").val(ary[0]);\n            } else if (strVal == \"L\") {\n                objRadio.eq(5).attr(\"checked\", \"checked\");\n            } else {\n                objRadio.eq(6).attr(\"checked\", \"checked\");\n                ary = strVal.split(\",\");\n                for (var i = 0; i < ary.length; i++) {\n                    $(\".dayList input[value='\" + ary[i] + \"']\").attr(\"checked\", \"checked\");\n                }\n                $.fn.cronGen.tools.initCheckBox(\"day\");\n            }\n        },\n        initMonth : function(strVal) {\n            var ary = null;\n            var objRadio = $(\"input[name='month'\");\n            if (strVal == \"*\") {\n                objRadio.eq(0).attr(\"checked\", \"checked\");\n            } else if (strVal == \"?\") {\n                objRadio.eq(1).attr(\"checked\", \"checked\");\n            } else if (strVal.split('-').length > 1) {\n                ary = strVal.split('-');\n                objRadio.eq(2).attr(\"checked\", \"checked\");\n                $(\"#monthStart_0\").val(ary[0]);\n                $(\"#monthEnd_0\").val(ary[1]);\n            } else if (strVal.split('/').length > 1) {\n                ary = strVal.split('/');\n                objRadio.eq(3).attr(\"checked\", \"checked\");\n                $(\"#monthStart_1\").val(ary[0]);\n                $(\"#monthEnd_1\").val(ary[1]);\n\n            } else {\n                objRadio.eq(4).attr(\"checked\", \"checked\");\n\n                ary = strVal.split(\",\");\n                for (var i = 0; i < ary.length; i++) {\n                    $(\".monthList input[value='\" + ary[i] + \"']\").attr(\"checked\", \"checked\");\n                }\n                $.fn.cronGen.tools.initCheckBox(\"month\");\n            }\n        },\n        initWeek : function(strVal) {\n            var ary = null;\n            var objRadio = $(\"input[name='week'\");\n            if (strVal == \"*\") {\n                objRadio.eq(0).attr(\"checked\", \"checked\");\n            } else if (strVal == \"?\") {\n                objRadio.eq(1).attr(\"checked\", \"checked\");\n            } else if (strVal.split('/').length > 1) {\n                ary = strVal.split('/');\n                objRadio.eq(2).attr(\"checked\", \"checked\");\n                $(\"#weekStart_0\").val(ary[0]);\n                $(\"#weekEnd_0\").val(ary[1]);\n            } else if (strVal.split('-').length > 1) {\n                ary = strVal.split('-');\n                objRadio.eq(3).attr(\"checked\", \"checked\");\n                $(\"#weekStart_1\").val(ary[0]);\n                $(\"#weekEnd_1\").val(ary[1]);\n            } else if (strVal.split('L').length > 1) {\n                ary = strVal.split('L');\n                objRadio.eq(4).attr(\"checked\", \"checked\");\n                $(\"#weekStart_2\").val(ary[0]);\n            } else {\n                objRadio.eq(5).attr(\"checked\", \"checked\");\n                ary = strVal.split(\",\");\n                for (var i = 0; i < ary.length; i++) {\n                    $(\".weekList input[value='\" + ary[i] + \"']\").attr(\"checked\", \"checked\");\n                }\n                $.fn.cronGen.tools.initCheckBox(\"week\");\n            }\n        },\n        initYear : function(strVal) {\n            var ary = null;\n            var objRadio = $(\"input[name='year'\");\n            if (strVal == \"*\") {\n                objRadio.eq(1).attr(\"checked\", \"checked\");\n            } else if (strVal.split('-').length > 1) {\n                ary = strVal.split('-');\n                objRadio.eq(2).attr(\"checked\", \"checked\");\n                $(\"#yearStart_0\").val(ary[0]);\n                $(\"#yearEnd_0\").val(ary[1]);\n            }\n        },\n        cronParse : function(cronExpress) {\n            //获取参数中表达式的值\n            if (cronExpress) {\n                var regs = cronExpress.split(' ');\n                $(\"#secondHidden\").val(regs[0]);\n                $(\"#minHidden\").val(regs[1]);\n                $(\"#hourHidden\").val(regs[2]);\n                $(\"#dayHidden\").val(regs[3]);\n                $(\"#monthHidden\").val(regs[4]);\n                $(\"#weekHidden\").val(regs[5]);\n\n                $.fn.cronGen.tools.initObj(regs[0], \"second\");\n                $.fn.cronGen.tools.initObj(regs[1], \"min\");\n                $.fn.cronGen.tools.initObj(regs[2], \"hour\");\n                $.fn.cronGen.tools.initDay(regs[3]);\n                $.fn.cronGen.tools.initMonth(regs[4]);\n                $.fn.cronGen.tools.initWeek(regs[5]);\n\n                if (regs.length > 6) {\n                    $(\"input[name=yearHidden]\").val(regs[6]);\n                    $.fn.cronGen.tools.initYear(regs[6]);\n                }\n            }\n    \t},\n        cronResult : function() {\n            var result;\n            var second = $(\"#secondHidden\").val();\n            second = second== \"\" ? \"*\":second;\n            var minute = $(\"#minHidden\").val();\n            minute = minute== \"\" ? \"*\":minute;\n            var hour = $(\"#hourHidden\").val();\n            hour = hour== \"\" ? \"*\":hour;\n            var day = $(\"#dayHidden\").val();\n            day = day== \"\" ? \"*\":day;\n            var month = $(\"#monthHidden\").val();\n            month = month== \"\" ? \"*\":month;\n            var week = $(\"#weekHidden\").val();\n            week = week== \"\" ? \"?\":week;\n            var year = $(\"#yearHidden\").val();\n            if(year!=\"\")\n            {\n                result = second+\" \"+minute+\" \"+hour+\" \"+day+\" \"+month+\" \"+week+\" \"+year;\n            }else\n            {\n                result = second+\" \"+minute+\" \"+hour+\" \"+day+\" \"+month+\" \"+week;\n            }\n            return result;\n        },\n        clearCheckbox : function(dom){\n        \t//清除选中的checkbox\n            var list = $(\".\"+dom+\"List\").children().filter(\":checked\");\n            if ($(list).length > 0) {\n            \t$.each(list, function(index){\n            \t\t$(this).attr(\"checked\", false);\n            \t\t$(this).attr(\"disabled\", \"disabled\");\n            \t\t$(this).change();\n            \t});\n            }\n        },\n        initCheckBox : function(dom) {\n        \t//移除checkbox禁用\n            var list = $(\".\"+dom+\"List\").children();\n            if ($(list).length > 0) {\n            \t$.each(list, function(index){\n            \t\t$(this).removeAttr(\"disabled\");\n            \t});\n            }\n        }\n    };\n})(jQuery);\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/plugins/cronGen/cronGen_en.js",
    "content": "﻿(function ($) {\n    // var resultsName = \"\";\n    var inputElement;\n    var displayElement;\n    $.fn.extend({\n        cronGen: function (options) {\n            if (options == null) {\n              options = {};\n            }\n            options = $.extend({}, $.fn.cronGen.defaultOptions, options);\n            //create top menu\n            var cronContainer = $(\"<div/>\", { id: \"CronContainer\", style: \"display:none;width:300px;height:300px;\" });\n            var mainDiv = $(\"<div/>\", { id: \"CronGenMainDiv\", style: \"width:410px;height:420px;\" });\n            var topMenu = $(\"<ul/>\", { \"class\": \"nav nav-tabs\", id: \"CronGenTabs\" });\n            $('<li/>', { 'class': 'active' }).html($('<a id=\"SecondlyTab\" href=\"#Secondly\">秒</a>')).appendTo(topMenu);\n            $('<li/>').html($('<a id=\"MinutesTab\" href=\"#Minutes\">Minute</a>')).appendTo(topMenu);\n            $('<li/>').html($('<a id=\"HourlyTab\" href=\"#Hourly\">Hour</a>')).appendTo(topMenu);\n            $('<li/>').html($('<a id=\"DailyTab\" href=\"#Daily\">Day</a>')).appendTo(topMenu);\n            $('<li/>').html($('<a id=\"MonthlyTab\" href=\"#Monthly\">Month</a>')).appendTo(topMenu);\n            $('<li/>').html($('<a id=\"WeeklyTab\" href=\"#Weekly\">Week</a>')).appendTo(topMenu);\n            $('<li/>').html($('<a id=\"YearlyTab\" href=\"#Yearly\">Year</a>')).appendTo(topMenu);\n            $(topMenu).appendTo(mainDiv);\n\n            //create what's inside the tabs\n            var container = $(\"<div/>\", { \"class\": \"container-fluid\", \"style\": \"margin-top: 30px;margin-left: -14px;\" });\n            var row = $(\"<div/>\", { \"class\": \"row-fluid\" });\n            var span12 = $(\"<div/>\", { \"class\": \"span12\" });\n            var tabContent = $(\"<div/>\", { \"class\": \"tab-content\", \"style\": \"border:0px; margin-top:-20px;\" });\n\n\n            //creating the secondsTab\n            var secondsTab = $(\"<div/>\", { \"class\": \"tab-pane active\", id: \"Secondly\" });\n            var seconds1 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"1\", name : \"second\"}).appendTo(seconds1);\n            $(seconds1).append(\"Per second, allowed wildcard[, - * /]\");\n            $(seconds1).appendTo(secondsTab);\n\n            var seconds2 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"2\", name : \"second\"}).appendTo(seconds2);\n            $(seconds2).append(\"Cycle, from\");\n            $(\"<input/>\",{type : \"text\", id : \"secondStart_0\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(seconds2);\n            $(seconds2).append(\"-\");\n            $(\"<input/>\",{type : \"text\", id : \"secondEnd_0\", value : \"2\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(seconds2);\n            $(seconds2).append(\"second\");\n            $(seconds2).appendTo(secondsTab);\n\n            var seconds3 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"3\", name : \"second\"}).appendTo(seconds3);\n            $(seconds3).append(\"from\");\n            $(\"<input/>\",{type : \"text\", id : \"secondStart_1\", value : \"0\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(seconds3);\n            $(seconds3).append(\"seconds start, per\");\n            $(\"<input/>\",{type : \"text\", id : \"secondEnd_1\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(seconds3);\n            $(seconds3).append(\"second execute once\");\n            $(seconds3).appendTo(secondsTab);\n\n            var seconds4 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"4\", name : \"second\", id: \"sencond_appoint\"}).appendTo(seconds4);\n            $(seconds4).append(\"specify\");\n            $(seconds4).appendTo(secondsTab);\n\n            $(secondsTab).append('<div class=\"imp secondList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"0\">00<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"1\">01<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"2\">02<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"3\">03<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"4\">04<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"5\">05<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"6\">06<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"7\">07<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"8\">08<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"9\">09</div>');\n            $(secondsTab).append('<div class=\"imp secondList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"10\">10<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"11\">11<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"12\">12<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"13\">13<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"14\">14<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"15\">15<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"16\">16<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"17\">17<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"18\">18<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"19\">19</div>');\n            $(secondsTab).append('<div class=\"imp secondList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"20\">20<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"21\">21<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"22\">22<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"23\">23<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"24\">24<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"25\">25<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"26\">26<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"27\">27<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"28\">28<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"29\">29</div>');\n            $(secondsTab).append('<div class=\"imp secondList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"30\">30<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"31\">31<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"32\">32<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"33\">33<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"34\">34<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"35\">35<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"36\">36<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"37\">37<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"38\">38<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"39\">39</div>');\n            $(secondsTab).append('<div class=\"imp secondList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"40\">40<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"41\">41<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"42\">42<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"43\">43<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"44\">44<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"45\">45<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"46\">46<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"47\">47<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"48\">48<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"49\">49</div>');\n            $(secondsTab).append('<div class=\"imp secondList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"50\">50<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"51\">51<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"52\">52<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"53\">53<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"54\">54<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"55\">55<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"56\">56<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"57\">57<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"58\">58<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"59\">59</div>');\n            $(\"<input/>\",{type : \"hidden\", id : \"secondHidden\"}).appendTo(secondsTab);\n            $(secondsTab).appendTo(tabContent);\n\n            //creating the minutesTab\n            var minutesTab = $(\"<div/>\", { \"class\": \"tab-pane\", id: \"Minutes\" });\n\n            var minutes1 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"1\", name : \"min\"}).appendTo(minutes1);\n            $(minutes1).append(\"Per minute, allowed wildcard[, - * /]\");\n            $(minutes1).appendTo(minutesTab);\n\n            var minutes2 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"2\", name : \"min\"}).appendTo(minutes2);\n            $(minutes2).append(\"Cycle, from\");\n            $(\"<input/>\",{type : \"text\", id : \"minStart_0\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(minutes2);\n            $(minutes2).append(\"-\");\n            $(\"<input/>\",{type : \"text\", id : \"minEnd_0\", value : \"2\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(minutes2);\n            $(minutes2).append(\"minute\");\n            $(minutes2).appendTo(minutesTab);\n\n            var minutes3 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"3\", name : \"min\"}).appendTo(minutes3);\n            $(minutes3).append(\"from\");\n            $(\"<input/>\",{type : \"text\", id : \"minStart_1\", value : \"0\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(minutes3);\n            $(minutes3).append(\"seconds start, per\");\n            $(\"<input/>\",{type : \"text\", id : \"minEnd_1\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(minutes3);\n            $(minutes3).append(\"second execute once\");\n            $(minutes3).appendTo(minutesTab);\n\n            var minutes4 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"4\", name : \"min\", id: \"min_appoint\"}).appendTo(minutes4);\n            $(minutes4).append(\"specify\");\n            $(minutes4).appendTo(minutesTab);\n\n            $(minutesTab).append('<div class=\"imp minList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"0\">00<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"1\">01<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"2\">02<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"3\">03<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"4\">04<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"5\">05<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"6\">06<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"7\">07<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"8\">08<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"9\">09</div>');\n            $(minutesTab).append('<div class=\"imp minList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"10\">10<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"11\">11<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"12\">12<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"13\">13<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"14\">14<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"15\">15<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"16\">16<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"17\">17<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"18\">18<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"19\">19</div>');\n            $(minutesTab).append('<div class=\"imp minList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"20\">20<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"21\">21<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"22\">22<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"23\">23<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"24\">24<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"25\">25<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"26\">26<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"27\">27<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"28\">28<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"29\">29</div>');\n            $(minutesTab).append('<div class=\"imp minList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"30\">30<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"31\">31<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"32\">32<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"33\">33<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"34\">34<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"35\">35<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"36\">36<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"37\">37<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"38\">38<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"39\">39</div>');\n            $(minutesTab).append('<div class=\"imp minList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"40\">40<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"41\">41<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"42\">42<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"43\">43<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"44\">44<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"45\">45<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"46\">46<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"47\">47<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"48\">48<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"49\">49</div>');\n            $(minutesTab).append('<div class=\"imp minList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"50\">50<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"51\">51<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"52\">52<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"53\">53<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"54\">54<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"55\">55<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"56\">56<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"57\">57<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"58\">58<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"59\">59</div>');\n            $(\"<input/>\",{type : \"hidden\", id : \"minHidden\"}).appendTo(minutesTab);\n            $(minutesTab).appendTo(tabContent);\n\n            //creating the hourlyTab\n            var hourlyTab = $(\"<div/>\", { \"class\": \"tab-pane\", id: \"Hourly\" });\n\n            var hourly1 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"1\", name : \"hour\"}).appendTo(hourly1);\n            $(hourly1).append(\"Per hour, allowed wildcard[, - * /]\");\n            $(hourly1).appendTo(hourlyTab);\n\n            var hourly2 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"2\", name : \"hour\"}).appendTo(hourly2);\n            $(hourly2).append(\"Cycle, from\");\n            $(\"<input/>\",{type : \"text\", id : \"hourStart_0\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(hourly2);\n            $(hourly2).append(\"-\");\n            $(\"<input/>\",{type : \"text\", id : \"hourEnd_0\", value : \"2\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(hourly2);\n            $(hourly2).append(\"hour\");\n            $(hourly2).appendTo(hourlyTab);\n\n            var hourly3 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"3\", name : \"hour\"}).appendTo(hourly3);\n            $(hourly3).append(\"from\");\n            $(\"<input/>\",{type : \"text\", id : \"hourStart_1\", value : \"0\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(hourly3);\n            $(hourly3).append(\"hour start, per\");\n            $(\"<input/>\",{type : \"text\", id : \"hourEnd_1\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(hourly3);\n            $(hourly3).append(\"hour execute once\");\n            $(hourly3).appendTo(hourlyTab);\n\n            var hourly4 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"4\", name : \"hour\", id: \"hour_appoint\"}).appendTo(hourly4);\n            $(hourly4).append(\"specify\");\n            $(hourly4).appendTo(hourlyTab);\n\n            $(hourlyTab).append('<div class=\"imp hourList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"0\">00<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"1\">01<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"2\">02<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"3\">03<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"4\">04<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"5\">05</div>');\n            $(hourlyTab).append('<div class=\"imp hourList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"6\">06<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"7\">07<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"8\">08<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"9\">09<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"10\">10<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"11\">11</div>');\n            $(hourlyTab).append('<div class=\"imp hourList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"12\">12<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"13\">13<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"14\">14<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"15\">15<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"16\">16<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"17\">17</div>');\n            $(hourlyTab).append('<div class=\"imp hourList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"18\">18<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"19\">19<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"20\">20<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"21\">21<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"22\">22<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"23\">23</div>');\n            $(\"<input/>\",{type : \"hidden\", id : \"hourHidden\"}).appendTo(hourlyTab);\n            $(hourlyTab).appendTo(tabContent);\n\n\n            //creating the dailyTab\n            var dailyTab = $(\"<div/>\", { \"class\": \"tab-pane\", id: \"Daily\" });\n\n            var daily1 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"1\", name : \"day\"}).appendTo(daily1);\n            $(daily1).append(\"Per day, allowed wildcard[, - * / L W]\");\n            $(daily1).appendTo(dailyTab);\n\n            var daily5 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"2\", name : \"day\"}).appendTo(daily5);\n            $(daily5).append(\"not specify\");\n            $(daily5).appendTo(dailyTab);\n\n            var daily2 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"3\", name : \"day\"}).appendTo(daily2);\n            $(daily2).append(\"Cycle, from\");\n            $(\"<input/>\",{type : \"text\", id : \"dayStart_0\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(daily2);\n            $(daily2).append(\"-\");\n            $(\"<input/>\",{type : \"text\", id : \"dayEnd_0\", value : \"2\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(daily2);\n            $(daily2).append(\"day\");\n            $(daily2).appendTo(dailyTab);\n\n            var daily3 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"4\", name : \"day\"}).appendTo(daily3);\n            $(daily3).append(\"from\");\n            $(\"<input/>\",{type : \"text\", id : \"dayStart_1\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(daily3);\n            $(daily3).append(\"day start, per\");\n            $(\"<input/>\",{type : \"text\", id : \"dayEnd_1\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(daily3);\n            $(daily3).append(\"day execute once\");\n            $(daily3).appendTo(dailyTab);\n\n            var daily6 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"5\", name : \"day\"}).appendTo(daily6);\n            $(daily6).append(\"The most recent working day on the 1\");\n            $(\"<input/>\",{type : \"text\", id : \"dayStart_2\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(daily6);\n            $(daily6).append(\" of each month\");\n            $(daily6).appendTo(dailyTab);\n\n            var daily7 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"6\", name : \"day\"}).appendTo(daily7);\n            $(daily7).append(\"The last day of the month\");\n            $(daily7).appendTo(dailyTab);\n\n            var daily4 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"7\", name : \"day\", id: \"day_appoint\"}).appendTo(daily4);\n            $(daily4).append(\"specify\");\n            $(daily4).appendTo(dailyTab);\n\n            $(dailyTab).append('<div class=\"imp dayList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"1\">01<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"2\">02<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"3\">03<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"4\">04<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"5\">05<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"6\">06<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"7\">07<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"8\">08<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"9\">09<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"10\">10</div>');\n            $(dailyTab).append('<div class=\"imp dayList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"11\">11<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"12\">12<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"13\">13<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"14\">14<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"15\">15<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"16\">16<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"17\">17<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"18\">18<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"19\">19<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"20\">20</div>');\n            $(dailyTab).append('<div class=\"imp dayList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"21\">21<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"22\">22<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"23\">23<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"24\">24<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"25\">25<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"26\">26<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"27\">27<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"28\">28<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"29\">29<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"30\">30</div>');\n            $(dailyTab).append('<div class=\"imp dayList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"31\">31</div>');\n            $(\"<input/>\",{type : \"hidden\", id : \"dayHidden\"}).appendTo(dailyTab);\n            $(dailyTab).appendTo(tabContent);\n\n\n            //creating the monthlyTab\n            var monthlyTab = $(\"<div/>\", { \"class\": \"tab-pane\", id: \"Monthly\" });\n\n            var monthly1 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"1\", name : \"month\"}).appendTo(monthly1);\n            $(monthly1).append(\"Per month, allowed wildcard[, - * /]\");\n            $(monthly1).appendTo(monthlyTab);\n\n            var monthly2 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"2\", name : \"month\"}).appendTo(monthly2);\n            $(monthly2).append(\"not specify\");\n            $(monthly2).appendTo(monthlyTab);\n\n            var monthly3 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"3\", name : \"month\"}).appendTo(monthly3);\n            $(monthly3).append(\"Cycle, from\");\n            $(\"<input/>\",{type : \"text\", id : \"monthStart_0\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(monthly3);\n            $(monthly3).append(\"-\");\n            $(\"<input/>\",{type : \"text\", id : \"monthEnd_0\", value : \"2\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(monthly3);\n            $(monthly3).append(\"month\");\n            $(monthly3).appendTo(monthlyTab);\n\n            var monthly4 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"4\", name : \"month\"}).appendTo(monthly4);\n            $(monthly4).append(\"Starting from \");\n            $(\"<input/>\",{type : \"text\", id : \"monthStart_1\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(monthly4);\n            $(monthly4).append(\"day, once every\");\n            $(\"<input/>\",{type : \"text\", id : \"monthEnd_1\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(monthly4);\n            $(monthly4).append(\"month\");\n            $(monthly4).appendTo(monthlyTab);\n\n            var monthly5 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"5\", name : \"month\", id: \"month_appoint\"}).appendTo(monthly5);\n            $(monthly5).append(\"specify\");\n            $(monthly5).appendTo(monthlyTab);\n\n            $(monthlyTab).append('<div class=\"imp monthList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"1\">01<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"2\">02<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"3\">03<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"4\">04<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"5\">05<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"6\">06</div>');\n            $(monthlyTab).append('<div class=\"imp monthList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"7\">07<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"8\">08<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"9\">09<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"10\">10<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"11\">11<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"12\">12</div>');\n            $(\"<input/>\",{type : \"hidden\", id : \"monthHidden\"}).appendTo(monthlyTab);\n            $(monthlyTab).appendTo(tabContent);\n\n            //creating the weeklyTab\n            var weeklyTab = $(\"<div/>\", { \"class\": \"tab-pane\", id: \"Weekly\" });\n\n            var weekly1 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"1\", name : \"week\"}).appendTo(weekly1);\n            $(weekly1).append(\"Per week, allowed wildcard[, - * / L #]\");\n            $(weekly1).appendTo(weeklyTab);\n\n            var weekly2 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"2\", name : \"week\"}).appendTo(weekly2);\n            $(weekly2).append(\"not specify\");\n            $(weekly2).appendTo(weeklyTab);\n\n            var weekly3 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"3\", name : \"week\"}).appendTo(weekly3);\n            $(weekly3).append(\"Cycle, from week\");\n            $(\"<input/>\",{type : \"text\", id : \"weekStart_0\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(weekly3);\n            $(weekly3).append(\"-\");\n            $(\"<input/>\",{type : \"text\", id : \"weekEnd_0\", value : \"2\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(weekly3);\n            $(weekly3).appendTo(weeklyTab);\n\n            var weekly4 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"4\", name : \"week\"}).appendTo(weekly4);\n            $(weekly4).append(\"The\");\n            $(\"<input/>\",{type : \"text\", id : \"weekStart_1\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(weekly4);\n            $(weekly4).append(\"th week, and day \");\n            $(\"<input/>\",{type : \"text\", id : \"weekEnd_1\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(weekly4);\n            $(weekly4).appendTo(weeklyTab);\n\n            var weekly5 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"5\", name : \"week\"}).appendTo(weekly5);\n            $(weekly5).append(\"Last week of the month\");\n            $(\"<input/>\",{type : \"text\", id : \"weekStart_2\", value : \"1\", style:\"width:35px; height:20px; text-align: center; margin: 0 3px;\"}).appendTo(weekly5);\n            $(weekly5).appendTo(weeklyTab);\n\n            var weekly6 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"6\", name : \"week\", id: \"week_appoint\"}).appendTo(weekly6);\n            $(weekly6).append(\"specify\");\n            $(weekly6).appendTo(weeklyTab);\n\n            $(weeklyTab).append('<div class=\"imp weekList\"><input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"1\">1<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"2\">2<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"3\">3<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"4\">4<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"5\">5<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"6\">6<input type=\"checkbox\" disabled=\"disabled\" style=\"margin-left: 5px\"  value=\"7\">7</div>');\n\n            $(\"<input/>\",{type : \"hidden\", id : \"weekHidden\"}).appendTo(weeklyTab);\n            $(weeklyTab).appendTo(tabContent);\n\n            //creating the yearlyTab\n            var yearlyTab = $(\"<div/>\", { \"class\": \"tab-pane\", id: \"Yearly\" });\n\n            var yearly1 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"1\", name : \"year\"}).appendTo(yearly1);\n            $(yearly1).append(\"not specify allowed wildcard[, - * /] not required\");\n            $(yearly1).appendTo(yearlyTab);\n\n            var yearly3 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"2\", name : \"year\"}).appendTo(yearly3);\n            $(yearly3).append(\"Per year\");\n            $(yearly3).appendTo(yearlyTab);\n\n            var yearly2 = $(\"<div/>\",{\"class\":\"line\"});\n            $(\"<input/>\",{type : \"radio\", value : \"3\", name : \"year\"}).appendTo(yearly2);\n            $(yearly2).append(\"Cycle, from \");\n            $(\"<input/>\",{type : \"text\", id : \"yearStart_0\", value : \"2016\", style:\"width:45px; height:20px;\"}).appendTo(yearly2);\n            $(yearly2).append(\"-\");\n            $(\"<input/>\",{type : \"text\", id : \"yearEnd_0\", value : \"2017\", style:\"width:45px; height:20px;\"}).appendTo(yearly2);\n            $(yearly2).append(\"year\");\n            $(yearly2).appendTo(yearlyTab);\n            $(\"<input/>\",{type : \"hidden\", id : \"yearHidden\"}).appendTo(yearlyTab);\n            $(yearlyTab).appendTo(tabContent);\n\n            $(tabContent).appendTo(span12);\n\n            //creating the button and results input\n            // resultsName = $(this).prop(\"id\");\n            // $(this).prop(\"name\", resultsName);\n\n            var runTime = '<br style=\"padding-top: 10px\"><label>Recent Run Time: </label></br><textarea id=\"runTime\" rows=\"6\" style=\"width: 90%;resize: none;background: none;border: none;outline: none;\" readonly = readonly></textarea></div>';\n\n            $(span12).appendTo(row);\n            $(row).appendTo(container);\n            $(container).appendTo(mainDiv);\n            $(runTime).appendTo(mainDiv);\n            $(cronContainer).append(mainDiv);\n\n            var that = $(this);\n\n            // Hide the original input\n            that.hide();\n\n            // Replace the input with an input group\n            var $g = $(\"<div>\").addClass(\"input-group\");\n            // Add an input\n            var $i = $(\"<input>\", { type: 'text', placeholder: 'cron expression...', name: 'cronGen_display' }).addClass(\"form-control\").val($(that).val());\n            $i.appendTo($g);\n            // Add the button\n            var $b = $(\"<button class=\\\"btn btn-default\\\"><i class=\\\"fa fa-edit\\\"></i></button>\");\n            // Put button inside span\n            var $s = $(\"<span>\").addClass(\"input-group-btn\");\n            $b.appendTo($s);\n            $s.appendTo($g);\n\n            $(this).before($g);\n\n            inputElement = that;\n            displayElement = $i;\n\n            $b.popover({\n                html: true,\n                content: function () {\n                    return $(cronContainer).html();\n                },\n                template: '<div class=\"popover\" style=\"max-width:500px !important; width:425px;left:-341.656px;\"><div class=\"arrow\"></div><div class=\"popover-inner\"><h3 class=\"popover-title\"></h3><div class=\"popover-content\"><p></p></div></div></div>',\n                sanitize:false,\n                placement: options.direction\n\n            }).on('click', function (e) {\n                if (inputElement.val().trim() !== '') {\n                    refreshRunTime();\n                }\n                e.preventDefault();\n\n                //fillDataOfMinutesAndHoursSelectOptions();\n                //fillDayWeekInMonth();\n                //fillInWeekDays();\n                //fillInMonths();\n\n                $.fn.cronGen.tools.cronParse(inputElement.val());\n\n                //绑定指定事件\n                $.fn.cronGen.tools.initChangeEvent();\n\n\n                $('#CronGenTabs a').click(function (e) {\n                    e.preventDefault();\n                    $(this).tab('show');\n                    //generate();\n                });\n                $(\"#CronGenMainDiv select,input\").change(function (e) {\n                    generate();\n                    refreshRunTime();\n                });\n                $(\"#CronGenMainDiv input\").focus(function (e) {\n                    generate();\n                });\n                //generate();\n            });\n            return;\n        }\n    });\n\n\n    var fillInMonths = function () {\n        var days = [\n            { text: \"January\", val: \"1\" },\n            { text: \"February\", val: \"2\" },\n            { text: \"March\", val: \"3\" },\n            { text: \"April\", val: \"4\" },\n            { text: \"May\", val: \"5\" },\n            { text: \"June\", val: \"6\" },\n            { text: \"July\", val: \"7\" },\n            { text: \"August\", val: \"8\" },\n            { text: \"September\", val: \"9\" },\n            { text: \"October\", val: \"10\" },\n            { text: \"November\", val: \"11\" },\n            { text: \"December\", val: \"12\" }\n        ];\n        $(\".months\").each(function () {\n            fillOptions(this, days);\n        });\n    };\n\n    var fillOptions = function (elements, options) {\n        for (var i = 0; i < options.length; i++)\n            $(elements).append(\"<option value='\" + options[i].val + \"'>\" + options[i].text + \"</option>\");\n    };\n    var fillDataOfMinutesAndHoursSelectOptions = function () {\n        for (var i = 0; i < 60; i++) {\n            if (i < 24) {\n                $(\".hours\").each(function () { $(this).append(timeSelectOption(i)); });\n            }\n            $(\".minutes\").each(function () { $(this).append(timeSelectOption(i)); });\n        }\n    };\n    var fillInWeekDays = function () {\n        var days = [\n            { text: \"Tuesday\", val: \"2\" },\n            { text: \"Wednesday\", val: \"3\" },\n            { text: \"Thursday\", val: \"4\" },\n            { text: \"Friday\", val: \"5\" },\n            { text: \"Saturday\", val: \"6\" },\n            { text: \"Sunday\", val: \"7\" },\n            { text: \"Monday\", val: \"1\" }\n        ];\n        $(\".week-days\").each(function () {\n            fillOptions(this, days);\n        });\n\n    };\n    var fillDayWeekInMonth = function () {\n        var days = [\n            { text: \"First\", val: \"1\" },\n            { text: \"Second\", val: \"2\" },\n            { text: \"Third\", val: \"3\" },\n            { text: \"Fourth\", val: \"4\" }\n        ];\n        $(\".day-order-in-month\").each(function () {\n            fillOptions(this, days);\n        });\n    };\n    var displayTimeUnit = function (unit) {\n        if (unit.toString().length == 1)\n            return \"0\" + unit;\n        return unit;\n    };\n    var timeSelectOption = function (i) {\n        return \"<option id='\" + i + \"'>\" + displayTimeUnit(i) + \"</option>\";\n    };\n\n    var generate = function () {\n\n        var activeTab = $(\"ul#CronGenTabs li.active a\").prop(\"id\");\n        if (activeTab == undefined) {\n            return;\n        }\n        var results = \"\";\n        switch (activeTab) {\n            case \"SecondlyTab\":\n                switch ($(\"input:radio[name=second]:checked\").val()) {\n                    case \"1\":\n                        $.fn.cronGen.tools.everyTime(\"second\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"2\":\n                        $.fn.cronGen.tools.cycle(\"second\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"3\":\n                        $.fn.cronGen.tools.startOn(\"second\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"4\":\n                    \t$.fn.cronGen.tools.initCheckBox(\"second\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                }\n                break;\n            case \"MinutesTab\":\n                switch ($(\"input:radio[name=min]:checked\").val()) {\n                    case \"1\":\n                        $.fn.cronGen.tools.everyTime(\"min\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"2\":\n                        $.fn.cronGen.tools.cycle(\"min\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"3\":\n                        $.fn.cronGen.tools.startOn(\"min\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"4\":\n                    \t$.fn.cronGen.tools.initCheckBox(\"min\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                }\n                break;\n            case \"HourlyTab\":\n                switch ($(\"input:radio[name=hour]:checked\").val()) {\n                    case \"1\":\n                       $.fn.cronGen.tools.everyTime(\"hour\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"2\":\n                       $.fn.cronGen.tools.cycle(\"hour\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"3\":\n                        $.fn.cronGen.tools.startOn(\"hour\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"4\":\n                    \t$.fn.cronGen.tools.initCheckBox(\"hour\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                }\n                break;\n            case \"DailyTab\":\n                switch ($(\"input:radio[name=day]:checked\").val()) {\n                    case \"1\":\n                        $.fn.cronGen.tools.everyTime(\"day\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"2\":\n                        $.fn.cronGen.tools.unAppoint(\"day\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"3\":\n                        $.fn.cronGen.tools.cycle(\"day\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"4\":\n                        $.fn.cronGen.tools.startOn(\"day\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"5\":\n                        $.fn.cronGen.tools.workDay(\"day\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"6\":\n                        $.fn.cronGen.tools.lastDay(\"day\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"7\":\n                    \t$.fn.cronGen.tools.initCheckBox(\"day\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                }\n                break;\n            case \"WeeklyTab\":\n                switch ($(\"input:radio[name=week]:checked\").val()) {\n                    case \"1\":\n                        $.fn.cronGen.tools.everyTime(\"week\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"2\":\n                        $.fn.cronGen.tools.unAppoint(\"week\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"3\":\n                        $.fn.cronGen.tools.cycle(\"week\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"4\":\n                        $.fn.cronGen.tools.startOn(\"week\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"5\":\n                        $.fn.cronGen.tools.lastWeek(\"week\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"6\":\n                    \t$.fn.cronGen.tools.initCheckBox(\"week\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                }\n                break;\n            case \"MonthlyTab\":\n                switch ($(\"input:radio[name=month]:checked\").val()) {\n                    case \"1\":\n                        $.fn.cronGen.tools.everyTime(\"month\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"2\":\n                        $.fn.cronGen.tools.unAppoint(\"month\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"3\":\n                        $.fn.cronGen.tools.cycle(\"month\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"4\":\n                        $.fn.cronGen.tools.startOn(\"month\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"5\":\n                    \t$.fn.cronGen.tools.initCheckBox(\"month\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                }\n                break;\n            case \"YearlyTab\":\n                switch ($(\"input:radio[name=year]:checked\").val()) {\n                    case \"1\":\n                        $.fn.cronGen.tools.unAppoint(\"year\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"2\":\n                        $.fn.cronGen.tools.everyTime(\"year\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                    case \"3\":\n                        $.fn.cronGen.tools.cycle(\"year\");\n                        results = $.fn.cronGen.tools.cronResult();\n                        break;\n                }\n                break;\n        }\n\n        // Update original control\n        inputElement.val(results);\n        // Update display\n        displayElement.val(results);\n    };\n\n    var refreshRunTime = function () {\n        $.ajax({\n            type : 'GET',\n            url : base_url + \"/jobinfo/nextTriggerTime\",\n            data : {\n                \"scheduleType\" : 'CRON',\n                \"scheduleConf\" : inputElement.val()\n            },\n            dataType : \"json\",\n            success : function(data){\n                if (data.code === 200) {\n                    $('#runTime').val(data.content.join(\"\\n\"));\n                } else {\n                    $('#runTime').val(data.msg);\n                }\n            }\n        });\n    };\n\n})(jQuery);\n\n(function($) {\n    $.fn.cronGen.defaultOptions = {\n        direction : 'bottom'\n    };\n    $.fn.cronGen.tools = {\n        /**\n         * 每周期\n         */\n        everyTime : function(dom){\n            $(\"#\"+dom+\"Hidden\").val(\"*\");\n            $.fn.cronGen.tools.clearCheckbox(dom);\n        },\n        /**\n         * 不指定\n         */\n        unAppoint : function(dom){\n            var val = \"?\";\n            if (dom == \"year\")\n            {\n                val = \"\";\n            }\n            $(\"#\"+dom+\"Hidden\").val(val);\n            $.fn.cronGen.tools.clearCheckbox(dom);\n        },\n        /**\n         * 周期\n         */\n        cycle : function(dom){\n            var start = $(\"#\"+dom+\"Start_0\").val();\n            var end = $(\"#\"+dom+\"End_0\").val();\n            $(\"#\"+dom+\"Hidden\").val(start + \"-\" + end);\n            $.fn.cronGen.tools.clearCheckbox(dom);\n        },\n        /**\n         * 从开始\n         */\n        startOn : function(dom) {\n            var start = $(\"#\"+dom+\"Start_1\").val();\n            var end = $(\"#\"+dom+\"End_1\").val();\n            $(\"#\"+dom+\"Hidden\").val(start + \"/\" + end);\n            $.fn.cronGen.tools.clearCheckbox(dom);\n        },\n        /**\n         * 最后一天\n         */\n        lastDay : function(dom){\n            $(\"#\"+dom+\"Hidden\").val(\"L\");\n            $.fn.cronGen.tools.clearCheckbox(dom);\n        },\n        /**\n         * 每周的某一天\n         */\n        weekOfDay : function(dom){\n            var start = $(\"#\"+dom+\"Start_0\").val();\n            var end = $(\"#\"+dom+\"End_0\").val();\n            $(\"#\"+dom+\"Hidden\").val(start + \"#\" + end);\n            $.fn.cronGen.tools.clearCheckbox(dom);\n        },\n        /**\n         * 最后一周\n         */\n        lastWeek : function(dom){\n            var start = $(\"#\"+dom+\"Start_2\").val();\n            $(\"#\"+dom+\"Hidden\").val(start+\"L\");\n            $.fn.cronGen.tools.clearCheckbox(dom);\n        },\n        /**\n         * 工作日\n         */\n        workDay : function(dom) {\n            var start = $(\"#\"+dom+\"Start_2\").val();\n            $(\"#\"+dom+\"Hidden\").val(start + \"W\");\n            $.fn.cronGen.tools.clearCheckbox(dom);\n        },\n        initChangeEvent : function(){\n            var secondList = $(\".secondList\").children();\n            $(\"#sencond_appoint\").click(function(){\n                if (this.checked) {\n                    if ($(secondList).filter(\":checked\").length == 0) {\n                        $(secondList.eq(0)).attr(\"checked\", true);\n                    }\n                    secondList.eq(0).change();\n                }\n            });\n\n            secondList.change(function() {\n                var sencond_appoint = $(\"#sencond_appoint\").prop(\"checked\");\n                if (sencond_appoint) {\n                    var vals = [];\n                    secondList.each(function() {\n                        if (this.checked) {\n                            vals.push(this.value);\n                        }\n                    });\n                    var val = \"?\";\n                    if (vals.length > 0 && vals.length < 59) {\n                        val = vals.join(\",\");\n                    }else if(vals.length == 59){\n                        val = \"*\";\n                    }\n                    $(\"#secondHidden\").val(val);\n                }\n            });\n\n            var minList = $(\".minList\").children();\n            $(\"#min_appoint\").click(function(){\n                if (this.checked) {\n                    if ($(minList).filter(\":checked\").length == 0) {\n                        $(minList.eq(0)).attr(\"checked\", true);\n                    }\n                    minList.eq(0).change();\n                }\n            });\n\n            minList.change(function() {\n                var min_appoint = $(\"#min_appoint\").prop(\"checked\");\n                if (min_appoint) {\n                    var vals = [];\n                    minList.each(function() {\n                        if (this.checked) {\n                            vals.push(this.value);\n                        }\n                    });\n                    var val = \"?\";\n                    if (vals.length > 0 && vals.length < 59) {\n                        val = vals.join(\",\");\n                    }else if(vals.length == 59){\n                        val = \"*\";\n                    }\n                    $(\"#minHidden\").val(val);\n                }\n            });\n\n            var hourList = $(\".hourList\").children();\n            $(\"#hour_appoint\").click(function(){\n                if (this.checked) {\n                    if ($(hourList).filter(\":checked\").length == 0) {\n                        $(hourList.eq(0)).attr(\"checked\", true);\n                    }\n                    hourList.eq(0).change();\n                }\n            });\n\n            hourList.change(function() {\n                var hour_appoint = $(\"#hour_appoint\").prop(\"checked\");\n                if (hour_appoint) {\n                    var vals = [];\n                    hourList.each(function() {\n                        if (this.checked) {\n                            vals.push(this.value);\n                        }\n                    });\n                    var val = \"?\";\n                    if (vals.length > 0 && vals.length < 24) {\n                        val = vals.join(\",\");\n                    }else if(vals.length == 24){\n                        val = \"*\";\n                    }\n                    $(\"#hourHidden\").val(val);\n                }\n            });\n\n            var dayList = $(\".dayList\").children();\n            $(\"#day_appoint\").click(function(){\n                if (this.checked) {\n                    if ($(dayList).filter(\":checked\").length == 0) {\n                        $(dayList.eq(0)).attr(\"checked\", true);\n                    }\n                    dayList.eq(0).change();\n                }\n            });\n\n            dayList.change(function() {\n                var day_appoint = $(\"#day_appoint\").prop(\"checked\");\n                if (day_appoint) {\n                    var vals = [];\n                    dayList.each(function() {\n                        if (this.checked) {\n                            vals.push(this.value);\n                        }\n                    });\n                    var val = \"?\";\n                    if (vals.length > 0 && vals.length < 31) {\n                        val = vals.join(\",\");\n                    }else if(vals.length == 31){\n                        val = \"*\";\n                    }\n                   $(\"#dayHidden\").val(val);\n                }\n            });\n\n            var monthList = $(\".monthList\").children();\n            $(\"#month_appoint\").click(function(){\n                if (this.checked) {\n                    if ($(monthList).filter(\":checked\").length == 0) {\n                        $(monthList.eq(0)).attr(\"checked\", true);\n                    }\n                    monthList.eq(0).change();\n                }\n            });\n\n            monthList.change(function() {\n                var month_appoint = $(\"#month_appoint\").prop(\"checked\");\n                if (month_appoint) {\n                    var vals = [];\n                    monthList.each(function() {\n                        if (this.checked) {\n                            vals.push(this.value);\n                        }\n                    });\n                    var val = \"?\";\n                    if (vals.length > 0 && vals.length < 12) {\n                        val = vals.join(\",\");\n                    }else if(vals.length == 12){\n                        val = \"*\";\n                    }\n                    $(\"#monthHidden\").val(val);\n                }\n            });\n\n            var weekList = $(\".weekList\").children();\n            $(\"#week_appoint\").click(function(){\n                if (this.checked) {\n                    if ($(weekList).filter(\":checked\").length == 0) {\n                        $(weekList.eq(0)).attr(\"checked\", true);\n                    }\n                    weekList.eq(0).change();\n                }\n            });\n\n            weekList.change(function() {\n                var week_appoint = $(\"#week_appoint\").prop(\"checked\");\n                if (week_appoint) {\n                    var vals = [];\n                    weekList.each(function() {\n                        if (this.checked) {\n                            vals.push(this.value);\n                        }\n                    });\n                    var val = \"?\";\n                    if (vals.length > 0 && vals.length < 7) {\n                        val = vals.join(\",\");\n                    }else if(vals.length == 7){\n                        val = \"*\";\n                    }\n                   $(\"#weekHidden\").val(val);\n                }\n            });\n        },\n        initObj : function(strVal, strid){\n            var ary = null;\n            var objRadio = $(\"input[name='\" + strid + \"'\");\n            if (strVal == \"*\") {\n                objRadio.eq(0).attr(\"checked\", \"checked\");\n            } else if (strVal.split('-').length > 1) {\n                ary = strVal.split('-');\n                objRadio.eq(1).attr(\"checked\", \"checked\");\n                $(\"#\" + strid + \"Start_0\").val(ary[0]);\n                $(\"#\" + strid + \"End_0\").val(ary[1]);\n            } else if (strVal.split('/').length > 1) {\n                ary = strVal.split('/');\n                objRadio.eq(2).attr(\"checked\", \"checked\");\n                $(\"#\" + strid + \"Start_1\").val(ary[0]);\n                $(\"#\" + strid + \"End_1\").val(ary[1]);\n            } else {\n                objRadio.eq(3).attr(\"checked\", \"checked\");\n                if (strVal != \"?\") {\n                    ary = strVal.split(\",\");\n                    for (var i = 0; i < ary.length; i++) {\n                        $(\".\" + strid + \"List input[value='\" + ary[i] + \"']\").attr(\"checked\", \"checked\");\n                    }\n                    $.fn.cronGen.tools.initCheckBox(strid);\n                }\n            }\n        },\n        initDay : function(strVal) {\n            var ary = null;\n            var objRadio = $(\"input[name='day'\");\n            if (strVal == \"*\") {\n                objRadio.eq(0).attr(\"checked\", \"checked\");\n            } else if (strVal == \"?\") {\n                objRadio.eq(1).attr(\"checked\", \"checked\");\n            } else if (strVal.split('-').length > 1) {\n                ary = strVal.split('-');\n                objRadio.eq(2).attr(\"checked\", \"checked\");\n                $(\"#dayStart_0\").val(ary[0]);\n                $(\"#dayEnd_0\").val(ary[1]);\n            } else if (strVal.split('/').length > 1) {\n                ary = strVal.split('/');\n                objRadio.eq(3).attr(\"checked\", \"checked\");\n                $(\"#dayStart_1\").val(ary[0]);\n                $(\"#dayEnd_1\").val(ary[1]);\n            } else if (strVal.split('W').length > 1) {\n                ary = strVal.split('W');\n                objRadio.eq(4).attr(\"checked\", \"checked\");\n                $(\"#dayStart_2\").val(ary[0]);\n            } else if (strVal == \"L\") {\n                objRadio.eq(5).attr(\"checked\", \"checked\");\n            } else {\n                objRadio.eq(6).attr(\"checked\", \"checked\");\n                ary = strVal.split(\",\");\n                for (var i = 0; i < ary.length; i++) {\n                    $(\".dayList input[value='\" + ary[i] + \"']\").attr(\"checked\", \"checked\");\n                }\n                $.fn.cronGen.tools.initCheckBox(\"day\");\n            }\n        },\n        initMonth : function(strVal) {\n            var ary = null;\n            var objRadio = $(\"input[name='month'\");\n            if (strVal == \"*\") {\n                objRadio.eq(0).attr(\"checked\", \"checked\");\n            } else if (strVal == \"?\") {\n                objRadio.eq(1).attr(\"checked\", \"checked\");\n            } else if (strVal.split('-').length > 1) {\n                ary = strVal.split('-');\n                objRadio.eq(2).attr(\"checked\", \"checked\");\n                $(\"#monthStart_0\").val(ary[0]);\n                $(\"#monthEnd_0\").val(ary[1]);\n            } else if (strVal.split('/').length > 1) {\n                ary = strVal.split('/');\n                objRadio.eq(3).attr(\"checked\", \"checked\");\n                $(\"#monthStart_1\").val(ary[0]);\n                $(\"#monthEnd_1\").val(ary[1]);\n\n            } else {\n                objRadio.eq(4).attr(\"checked\", \"checked\");\n\n                ary = strVal.split(\",\");\n                for (var i = 0; i < ary.length; i++) {\n                    $(\".monthList input[value='\" + ary[i] + \"']\").attr(\"checked\", \"checked\");\n                }\n                $.fn.cronGen.tools.initCheckBox(\"month\");\n            }\n        },\n        initWeek : function(strVal) {\n            var ary = null;\n            var objRadio = $(\"input[name='week'\");\n            if (strVal == \"*\") {\n                objRadio.eq(0).attr(\"checked\", \"checked\");\n            } else if (strVal == \"?\") {\n                objRadio.eq(1).attr(\"checked\", \"checked\");\n            } else if (strVal.split('/').length > 1) {\n                ary = strVal.split('/');\n                objRadio.eq(2).attr(\"checked\", \"checked\");\n                $(\"#weekStart_0\").val(ary[0]);\n                $(\"#weekEnd_0\").val(ary[1]);\n            } else if (strVal.split('-').length > 1) {\n                ary = strVal.split('-');\n                objRadio.eq(3).attr(\"checked\", \"checked\");\n                $(\"#weekStart_1\").val(ary[0]);\n                $(\"#weekEnd_1\").val(ary[1]);\n            } else if (strVal.split('L').length > 1) {\n                ary = strVal.split('L');\n                objRadio.eq(4).attr(\"checked\", \"checked\");\n                $(\"#weekStart_2\").val(ary[0]);\n            } else {\n                objRadio.eq(5).attr(\"checked\", \"checked\");\n                ary = strVal.split(\",\");\n                for (var i = 0; i < ary.length; i++) {\n                    $(\".weekList input[value='\" + ary[i] + \"']\").attr(\"checked\", \"checked\");\n                }\n                $.fn.cronGen.tools.initCheckBox(\"week\");\n            }\n        },\n        initYear : function(strVal) {\n            var ary = null;\n            var objRadio = $(\"input[name='year'\");\n            if (strVal == \"*\") {\n                objRadio.eq(1).attr(\"checked\", \"checked\");\n            } else if (strVal.split('-').length > 1) {\n                ary = strVal.split('-');\n                objRadio.eq(2).attr(\"checked\", \"checked\");\n                $(\"#yearStart_0\").val(ary[0]);\n                $(\"#yearEnd_0\").val(ary[1]);\n            }\n        },\n        cronParse : function(cronExpress) {\n            //获取参数中表达式的值\n            if (cronExpress) {\n                var regs = cronExpress.split(' ');\n                $(\"#secondHidden\").val(regs[0]);\n                $(\"#minHidden\").val(regs[1]);\n                $(\"#hourHidden\").val(regs[2]);\n                $(\"#dayHidden\").val(regs[3]);\n                $(\"#monthHidden\").val(regs[4]);\n                $(\"#weekHidden\").val(regs[5]);\n\n                $.fn.cronGen.tools.initObj(regs[0], \"second\");\n                $.fn.cronGen.tools.initObj(regs[1], \"min\");\n                $.fn.cronGen.tools.initObj(regs[2], \"hour\");\n                $.fn.cronGen.tools.initDay(regs[3]);\n                $.fn.cronGen.tools.initMonth(regs[4]);\n                $.fn.cronGen.tools.initWeek(regs[5]);\n\n                if (regs.length > 6) {\n                    $(\"input[name=yearHidden]\").val(regs[6]);\n                    $.fn.cronGen.tools.initYear(regs[6]);\n                }\n            }\n    \t},\n        cronResult : function() {\n            var result;\n            var second = $(\"#secondHidden\").val();\n            second = second== \"\" ? \"*\":second;\n            var minute = $(\"#minHidden\").val();\n            minute = minute== \"\" ? \"*\":minute;\n            var hour = $(\"#hourHidden\").val();\n            hour = hour== \"\" ? \"*\":hour;\n            var day = $(\"#dayHidden\").val();\n            day = day== \"\" ? \"*\":day;\n            var month = $(\"#monthHidden\").val();\n            month = month== \"\" ? \"*\":month;\n            var week = $(\"#weekHidden\").val();\n            week = week== \"\" ? \"?\":week;\n            var year = $(\"#yearHidden\").val();\n            if(year!=\"\")\n            {\n                result = second+\" \"+minute+\" \"+hour+\" \"+day+\" \"+month+\" \"+week+\" \"+year;\n            }else\n            {\n                result = second+\" \"+minute+\" \"+hour+\" \"+day+\" \"+month+\" \"+week;\n            }\n            return result;\n        },\n        clearCheckbox : function(dom){\n        \t//清除选中的checkbox\n            var list = $(\".\"+dom+\"List\").children().filter(\":checked\");\n            if ($(list).length > 0) {\n            \t$.each(list, function(index){\n            \t\t$(this).attr(\"checked\", false);\n            \t\t$(this).attr(\"disabled\", \"disabled\");\n            \t\t$(this).change();\n            \t});\n            }\n        },\n        initCheckBox : function(dom) {\n        \t//移除checkbox禁用\n            var list = $(\".\"+dom+\"List\").children();\n            if ($(list).length > 0) {\n            \t$.each(list, function(index){\n            \t\t$(this).removeAttr(\"disabled\");\n            \t});\n            }\n        }\n    };\n})(jQuery);\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/plugins/jquery/jquery.cookie.js",
    "content": "/*!\n * jQuery Cookie Plugin v1.4.1\n * https://github.com/carhartl/jquery-cookie\n *\n * Copyright 2013 Klaus Hartl\n * Released under the MIT license\n */\n(function (factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\t// AMD\n\t\tdefine(['jquery'], factory);\n\t} else if (typeof exports === 'object') {\n\t\t// CommonJS\n\t\tfactory(require('jquery'));\n\t} else {\n\t\t// Browser globals\n\t\tfactory(jQuery);\n\t}\n}(function ($) {\n\n\tvar pluses = /\\+/g;\n\n\tfunction encode(s) {\n\t\treturn config.raw ? s : encodeURIComponent(s);\n\t}\n\n\tfunction decode(s) {\n\t\treturn config.raw ? s : decodeURIComponent(s);\n\t}\n\n\tfunction stringifyCookieValue(value) {\n\t\treturn encode(config.json ? JSON.stringify(value) : String(value));\n\t}\n\n\tfunction parseCookieValue(s) {\n\t\tif (s.indexOf('\"') === 0) {\n\t\t\t// This is a quoted cookie as according to RFC2068, unescape...\n\t\t\ts = s.slice(1, -1).replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, '\\\\');\n\t\t}\n\n\t\ttry {\n\t\t\t// Replace server-side written pluses with spaces.\n\t\t\t// If we can't decode the cookie, ignore it, it's unusable.\n\t\t\t// If we can't parse the cookie, ignore it, it's unusable.\n\t\t\ts = decodeURIComponent(s.replace(pluses, ' '));\n\t\t\treturn config.json ? JSON.parse(s) : s;\n\t\t} catch(e) {}\n\t}\n\n\tfunction read(s, converter) {\n\t\tvar value = config.raw ? s : parseCookieValue(s);\n\t\treturn $.isFunction(converter) ? converter(value) : value;\n\t}\n\n\tvar config = $.cookie = function (key, value, options) {\n\n\t\t// Write\n\n\t\tif (value !== undefined && !$.isFunction(value)) {\n\t\t\toptions = $.extend({}, config.defaults, options);\n\n\t\t\tif (typeof options.expires === 'number') {\n\t\t\t\tvar days = options.expires, t = options.expires = new Date();\n\t\t\t\tt.setTime(+t + days * 864e+5);\n\t\t\t}\n\n\t\t\treturn (document.cookie = [\n\t\t\t\tencode(key), '=', stringifyCookieValue(value),\n\t\t\t\toptions.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE\n\t\t\t\toptions.path    ? '; path=' + options.path : '',\n\t\t\t\toptions.domain  ? '; domain=' + options.domain : '',\n\t\t\t\toptions.secure  ? '; secure' : ''\n\t\t\t].join(''));\n\t\t}\n\n\t\t// Read\n\n\t\tvar result = key ? undefined : {};\n\n\t\t// To prevent the for loop in the first place assign an empty array\n\t\t// in case there are no cookies at all. Also prevents odd result when\n\t\t// calling $.cookie().\n\t\tvar cookies = document.cookie ? document.cookie.split('; ') : [];\n\n\t\tfor (var i = 0, l = cookies.length; i < l; i++) {\n\t\t\tvar parts = cookies[i].split('=');\n\t\t\tvar name = decode(parts.shift());\n\t\t\tvar cookie = parts.join('=');\n\n\t\t\tif (key && key === name) {\n\t\t\t\t// If second argument (value) is a function it's a converter...\n\t\t\t\tresult = read(cookie, value);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Prevent storing a cookie that we couldn't decode.\n\t\t\tif (!key && (cookie = read(cookie)) !== undefined) {\n\t\t\t\tresult[name] = cookie;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\tconfig.defaults = {};\n\n\t$.removeCookie = function (key, options) {\n\t\tif ($.cookie(key) === undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Must not alter options, thus extending a fresh object...\n\t\t$.cookie(key, '', $.extend({}, options, { expires: -1 }));\n\t\treturn !$.cookie(key);\n\t};\n\n}));\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/plugins/layer/layer.js",
    "content": "/*! layer-v3.1.1 Web弹层组件 MIT License  http://layer.layui.com/  By 贤心 */\n ;!function(e,t){\"use strict\";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;n>0;n--)if(\"interactive\"===t[n].readyState){e=t[n].src;break}return e||t[i].src}();return e.substring(0,e.lastIndexOf(\"/\")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:[\"&#x786E;&#x5B9A;\",\"&#x53D6;&#x6D88;\"],type:[\"dialog\",\"page\",\"iframe\",\"loading\",\"tips\"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?\"getPropertyValue\":\"getAttribute\"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName(\"head\")[0],s=document.createElement(\"link\");\"string\"==typeof i&&(n=i);var l=(n||t).replace(/\\.|\\//g,\"\"),f=\"layuicss-\"+l,c=0;s.rel=\"stylesheet\",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),\"function\"==typeof i&&!function u(){return++c>80?e.console&&console.error(\"layer.css: Invalid\"):void(1989===parseInt(o.getStyle(document.getElementById(f),\"width\"))?i():setTimeout(u,100))}()}}},r={v:\"3.1.1\",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||\"ActiveXObject\"in e)&&((t.match(/msie\\s(\\d+)/)||[])[1]||\"11\")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,\"string\"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss(\"modules/layer/\"+e.extend):o.link(\"theme/\"+e.extend),this):this},ready:function(e){var t=\"layer\",i=\"\",n=(a?\"modules/layer/\":\"theme/\")+\"default/layer.css?v=\"+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a=\"function\"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s=\"function\"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s=\"function\"==typeof n,f=o.config.skin,c=(f?f+\" \"+f+\"-msg\":\"\")||\"layui-layer-msg\",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+\" layui-layer-hui\",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+\" \"+(n.skin||\"layui-layer-hui\")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=[\"layui-layer\",\".layui-layer-title\",\".layui-layer-main\",\".layui-layer-dialog\",\"layui-layer-iframe\",\"layui-layer-content\",\"layui-layer-btn\",\"layui-layer-close\"];l.anim=[\"layer-anim-00\",\"layer-anim-01\",\"layer-anim-02\",\"layer-anim-03\",\"layer-anim-04\",\"layer-anim-05\",\"layer-anim-06\"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:\"&#x4FE1;&#x606F;\",offset:\"auto\",area:\"auto\",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f=\"object\"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'<div class=\"layui-layer-title\" style=\"'+(f?r.title[1]:\"\")+'\">'+(f?r.title[0]:r.title)+\"</div>\":\"\";return r.zIndex=s,t([r.shade?'<div class=\"layui-layer-shade\" id=\"layui-layer-shade'+a+'\" times=\"'+a+'\" style=\"'+(\"z-index:\"+(s-1)+\"; \")+'\"></div>':\"\",'<div class=\"'+l[0]+(\" layui-layer-\"+o.type[r.type])+(0!=r.type&&2!=r.type||r.shade?\"\":\" layui-layer-border\")+\" \"+(r.skin||\"\")+'\" id=\"'+l[0]+a+'\" type=\"'+o.type[r.type]+'\" times=\"'+a+'\" showtime=\"'+r.time+'\" conType=\"'+(e?\"object\":\"string\")+'\" style=\"z-index: '+s+\"; width:\"+r.area[0]+\";height:\"+r.area[1]+(r.fixed?\"\":\";position:absolute;\")+'\">'+(e&&2!=r.type?\"\":u)+'<div id=\"'+(r.id||\"\")+'\" class=\"layui-layer-content'+(0==r.type&&r.icon!==-1?\" layui-layer-padding\":\"\")+(3==r.type?\" layui-layer-loading\"+r.icon:\"\")+'\">'+(0==r.type&&r.icon!==-1?'<i class=\"layui-layer-ico layui-layer-ico'+r.icon+'\"></i>':\"\")+(1==r.type&&e?\"\":r.content||\"\")+'</div><span class=\"layui-layer-setwin\">'+function(){var e=c?'<a class=\"layui-layer-min\" href=\"javascript:;\"><cite></cite></a><a class=\"layui-layer-ico layui-layer-max\" href=\"javascript:;\"></a>':\"\";return r.closeBtn&&(e+='<a class=\"layui-layer-ico '+l[7]+\" \"+l[7]+(r.title?r.closeBtn:4==r.type?\"1\":\"2\")+'\" href=\"javascript:;\"></a>'),e}()+\"</span>\"+(r.btn?function(){var e=\"\";\"string\"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t<i;t++)e+='<a class=\"'+l[6]+t+'\">'+r.btn[t]+\"</a>\";return'<div class=\"'+l[6]+\" layui-layer-btn-\"+(r.btnAlign||\"\")+'\">'+e+\"</div>\"}():\"\")+(r.resize?'<span class=\"layui-layer-resize\"></span>':\"\")+\"</div>\"],u,i('<div class=\"layui-layer-move\"></div>')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f=\"object\"==typeof s,c=i(\"body\");if(!t.id||!i(\"#\"+t.id)[0]){switch(\"string\"==typeof t.area&&(t.area=\"auto\"===t.area?[\"\",\"\"]:[t.area,\"\"]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn=\"btn\"in t?t.btn:o.btn[0],r.closeAll(\"dialog\");break;case 2:var s=t.content=f?t.content:[t.content||\"http://layer.layui.com\",\"auto\"];t.content='<iframe scrolling=\"'+(t.content[1]||\"auto\")+'\" allowtransparency=\"true\" id=\"'+l[4]+a+'\" name=\"'+l[4]+a+'\" onload=\"this.className=\\'\\';\" class=\"layui-layer-load\" frameborder=\"0\" src=\"'+t.content[0]+'\"></iframe>';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll(\"loading\");break;case 4:f||(t.content=[t.content,\"body\"]),t.follow=t.content[1],t.content=t.content[0]+'<i class=\"layui-layer-TipsG\"></i>',delete t.title,t.tips=\"object\"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll(\"tips\")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i(\"body\").append(n[1])}():function(){s.parents(\".\"+l[0])[0]||(s.data(\"display\",s.css(\"display\")).show().addClass(\"layui-layer-wrap\").wrap(n[1]),i(\"#\"+l[0]+a).find(\".\"+l[5]).before(r))}()}():c.append(n[1]),i(\".layui-layer-move\")[0]||c.append(o.moveElem=u),e.layero=i(\"#\"+l[0]+a),t.scrollbar||l.html.css(\"overflow\",\"hidden\").attr(\"layer-full\",a)}).auto(a),i(\"#layui-layer-shade\"+e.index).css({\"background-color\":t.shade[1]||\"#000\",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find(\"iframe\").attr(\"src\",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on(\"resize\",function(){e.offset(),(/^\\d+%$/.test(t.area[0])||/^\\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u=\"layer-anim \"+l.anim[t.anim];e.layero.addClass(u).one(\"webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend\",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data(\"isOutAnim\",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i(\"#\"+l[0]+e);\"\"===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find(\".\"+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css(\"padding-top\"))))};switch(a.type){case 2:u(\"iframe\");break;default:\"\"===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u(\".\"+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u(\".\"+l[5])):u(\".\"+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o=\"object\"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):\"auto\"!==t.offset&&(\"t\"===t.offset?e.offsetTop=0:\"r\"===t.offset?e.offsetLeft=n.width()-a[0]:\"b\"===t.offset?e.offsetTop=n.height()-a[1]:\"l\"===t.offset?e.offsetLeft=0:\"lt\"===t.offset?(e.offsetTop=0,e.offsetLeft=0):\"lb\"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):\"rt\"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):\"rb\"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr(\"minLeft\")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css(\"left\")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i(\"body\"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(\".layui-layer-TipsG\"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:\"auto\"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass(\"layui-layer-TipsB\").addClass(\"layui-layer-TipsT\").css(\"border-right-color\",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass(\"layui-layer-TipsL\").addClass(\"layui-layer-TipsR\").css(\"border-bottom-color\",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass(\"layui-layer-TipsT\").addClass(\"layui-layer-TipsB\").css(\"border-right-color\",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass(\"layui-layer-TipsR\").addClass(\"layui-layer-TipsL\").css(\"border-bottom-color\",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find(\".\"+l[5]).css({\"background-color\":t.tips[1],\"padding-right\":t.closeBtn?\"30px\":\"\"}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(\".layui-layer-resize\"),c={};return t.move&&l.css(\"cursor\",\"move\"),l.on(\"mousedown\",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css(\"left\")),e.clientY-parseFloat(s.css(\"top\"))],o.moveElem.css(\"cursor\",\"move\").show())}),f.on(\"mousedown\",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css(\"cursor\",\"se-resize\").show()}),a.on(\"mousemove\",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l=\"fixed\"===s.css(\"position\");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;a<c.stX&&(a=c.stX),a>f&&(a=f),o<c.stY&&(o=c.stY),o>u&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on(\"mouseup\",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find(\"iframe\").on(\"load\",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find(\".\"+l[6]).children(\"a\").on(\"click\",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a[\"btn\"+(e+1)]&&a[\"btn\"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find(\".\"+l[7]).on(\"click\",e),a.shadeClose&&i(\"#layui-layer-shade\"+t.index).on(\"click\",function(){r.close(t.index)}),n.find(\".layui-layer-min\").on(\"click\",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(\".layui-layer-max\").on(\"click\",function(){i(this).hasClass(\"layui-layer-maxmin\")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i(\"select\"),function(e,t){var n=i(this);n.parents(\".\"+l[0])[0]||1==n.attr(\"layer\")&&i(\".\"+l[0]).length<1&&n.removeAttr(\"layer\").show(),n=null})},s.pt.IE6=function(e){i(\"select\").each(function(e,t){var n=i(this);n.parents(\".\"+l[0])[0]||\"none\"===n.css(\"display\")||n.attr({layer:\"1\"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css(\"z-index\",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on(\"mousedown\",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css(\"margin-left\"))];e.find(\".layui-layer-max\").addClass(\"layui-layer-maxmin\"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr(\"layer-full\")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty(\"overflow\"):l.html[0].style.removeAttribute(\"overflow\"),l.html.removeAttr(\"layer-full\"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i(\".\"+l[4]).attr(\"times\"),i(\"#\"+l[0]+t).find(\"iframe\").contents().find(e)},r.getFrameIndex=function(e){return i(\"#\"+e).parents(\".\"+l[4]).attr(\"times\")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame(\"html\",e).outerHeight(),n=i(\"#\"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find(\".\"+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find(\"iframe\").css({height:t})}},r.iframeSrc=function(e,t){i(\"#\"+l[0]+e).find(\"iframe\").attr(\"src\",t)},r.style=function(e,t,n){var a=i(\"#\"+l[0]+e),r=a.find(\".layui-layer-content\"),s=a.attr(\"type\"),f=a.find(l[1]).outerHeight()||0,c=a.find(\".\"+l[6]).outerHeight()||0;a.attr(\"minLeft\");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find(\".\"+l[6]).outerHeight(),s===o.type[2]?a.find(\"iframe\").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css(\"padding-top\"))-parseFloat(r.css(\"padding-bottom\"))}))},r.min=function(e,t){var a=i(\"#\"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr(\"minLeft\")||181*o.minIndex+\"px\",c=a.css(\"position\");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr(\"position\",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:\"fixed\",overflow:\"hidden\"},!0),a.find(\".layui-layer-min\").hide(),\"page\"===a.attr(\"type\")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr(\"minLeft\")||o.minIndex++,a.attr(\"minLeft\",f)},r.restore=function(e){var t=i(\"#\"+l[0]+e),n=t.attr(\"area\").split(\",\");t.attr(\"type\");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr(\"position\"),overflow:\"visible\"},!0),t.find(\".layui-layer-max\").removeClass(\"layui-layer-maxmin\"),t.find(\".layui-layer-min\").show(),\"page\"===t.attr(\"type\")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i(\"#\"+l[0]+e);o.record(a),l.html.attr(\"layer-full\")||l.html.css(\"overflow\",\"hidden\").attr(\"layer-full\",e),clearTimeout(t),t=setTimeout(function(){var t=\"fixed\"===a.css(\"position\");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(\".layui-layer-min\").hide()},100)},r.title=function(e,t){var n=i(\"#\"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i(\"#\"+l[0]+e),n=t.attr(\"type\"),a=\"layer-anim-close\";if(t[0]){var s=\"layui-layer-wrap\",f=function(){if(n===o.type[1]&&\"object\"===t.attr(\"conType\")){t.children(\":not(.\"+l[5]+\")\").remove();for(var a=t.find(\".\"+s),r=0;r<2;r++)a.unwrap();a.css(\"display\",a.data(\"display\")).removeClass(s)}else{if(n===o.type[2])try{var f=i(\"#\"+l[4]+e)[0];f.contentWindow.document.write(\"\"),f.contentWindow.close(),t.find(\".\"+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML=\"\",t.remove()}\"function\"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data(\"isOutAnim\")&&t.addClass(\"layer-anim \"+a),i(\"#layui-layer-moves, #layui-layer-shade\"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr(\"minLeft\")&&(o.minIndex--,o.minLeft.push(t.attr(\"minLeft\"))),r.ie&&r.ie<10||!t.data(\"isOutAnim\")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i(\".\"+l[0]),function(){var t=i(this),n=e?t.attr(\"type\")===e:1;n&&r.close(t.attr(\"times\")),n=null})};var f=r.cache||{},c=function(e){return f.skin?\" \"+f.skin+\" \"+f.skin+\"-\"+e:\"\"};r.prompt=function(e,t){var a=\"\";if(e=e||{},\"function\"==typeof e&&(t=e),e.area){var o=e.area;a='style=\"width: '+o[0]+\"; height: \"+o[1]+';\"',delete e.area}var s,l=2==e.formType?'<textarea class=\"layui-layer-input\"'+a+\">\"+(e.value||\"\")+\"</textarea>\":function(){return'<input type=\"'+(1==e.formType?\"password\":\"text\")+'\" class=\"layui-layer-input\" value=\"'+(e.value||\"\")+'\">'}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:[\"&#x786E;&#x5B9A;\",\"&#x53D6;&#x6D88;\"],content:l,skin:\"layui-layer-prompt\"+c(\"prompt\"),maxWidth:n.width(),success:function(e){s=e.find(\".layui-layer-input\"),s.focus(),\"function\"==typeof f&&f(e)},resize:!1,yes:function(i){var n=s.val();\"\"===n?s.focus():n.length>(e.maxlength||500)?r.tips(\"&#x6700;&#x591A;&#x8F93;&#x5165;\"+(e.maxlength||500)+\"&#x4E2A;&#x5B57;&#x6570;\",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n=\"layui-this\",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:\"layui-layer-tab\"+c(\"tab\"),resize:!1,title:function(){var e=t.length,i=1,a=\"\";if(e>0)for(a='<span class=\"'+n+'\">'+t[0].title+\"</span>\";i<e;i++)a+=\"<span>\"+t[i].title+\"</span>\";return a}(),content:'<ul class=\"layui-layer-tabmain\">'+function(){var e=t.length,i=1,a=\"\";if(e>0)for(a='<li class=\"layui-layer-tabli '+n+'\">'+(t[0].content||\"no content\")+\"</li>\";i<e;i++)a+='<li class=\"layui-layer-tabli\">'+(t[i].content||\"no  content\")+\"</li>\";return a}()+\"</ul>\",success:function(t){var o=t.find(\".layui-layer-title\").children(),r=t.find(\".layui-layer-tabmain\").children();o.on(\"mousedown\",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),\"function\"==typeof e.change&&e.change(o)}),\"function\"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||\"img\";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg(\"&#x6CA1;&#x6709;&#x56FE;&#x7247;\")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr(\"layer-index\",e),u.push({alt:t.attr(\"alt\"),pid:t.attr(\"layer-pid\"),src:t.attr(\"layer-src\")||t.attr(\"src\"),thumb:t.attr(\"src\")})})};if(h(),0===u.length)return;if(n||p.on(\"click\",t.img,function(){var e=i(this),n=e.attr(\"layer-index\");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(\".layui-layer-imgprev\").on(\"click\",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(\".layui-layer-imgnext\").on(\"click\",function(e){e.preventDefault(),s.imgnext()}),i(document).on(\"keyup\",s.keyup)},s.loadi=r.load(1,{shade:!(\"shade\"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:\"layui-layer-photos\",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]<r[1]&&(a[0]=a[0]/r[1],a[1]=a[1]/r[1])}return[a[0]+\"px\",a[1]+\"px\"]}(),title:!1,shade:.9,shadeClose:!0,closeBtn:!1,move:\".layui-layer-phimg img\",moveType:1,scrollbar:!1,moveOut:!0,isOutAnim:!1,skin:\"layui-layer-photos\"+c(\"photos\"),content:'<div class=\"layui-layer-phimg\"><img src=\"'+u[d].src+'\" alt=\"'+(u[d].alt||\"\")+'\" layer-pid=\"'+u[d].pid+'\"><div class=\"layui-layer-imgsee\">'+(u.length>1?'<span class=\"layui-layer-imguide\"><a href=\"javascript:;\" class=\"layui-layer-iconext layui-layer-imgprev\"></a><a href=\"javascript:;\" class=\"layui-layer-iconext layui-layer-imgnext\"></a></span>':\"\")+'<div class=\"layui-layer-imgbar\" style=\"display:'+(a?\"block\":\"\")+'\"><span class=\"layui-layer-imgtit\"><a href=\"javascript:;\">'+(u[d].alt||\"\")+\"</a><em>\"+s.imgIndex+\"/\"+u.length+\"</em></span></div></div></div>\",success:function(e,i){s.bigimg=e.find(\".layui-layer-phimg\"),s.imgsee=e.find(\".layui-layer-imguide,.layui-layer-imgbar\"),s.event(e),t.tab&&t.tab(u[d],e),\"function\"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off(\"keyup\",s.keyup)}},t))},function(){r.close(s.loadi),r.msg(\"&#x5F53;&#x524D;&#x56FE;&#x7247;&#x5730;&#x5740;&#x5F02;&#x5E38;<br>&#x662F;&#x5426;&#x7EE7;&#x7EED;&#x67E5;&#x770B;&#x4E0B;&#x4E00;&#x5F20;&#xFF1F;\",{time:3e4,btn:[\"&#x4E0B;&#x4E00;&#x5F20;\",\"&#x4E0D;&#x770B;&#x4E86;\"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i(\"html\"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define(\"jquery\",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t(\"layer\",r)})):\"function\"==typeof define&&define.amd?define([\"jquery\"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window);"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/static/plugins/layer/theme/default/layer.css",
    "content": ".layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+\"px\")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:230px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:43px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}}"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/templates/common/common.exception.ftl",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"UTF-8\">\n\t<title>Error</title>\n    <style type=\"text/css\"> \n        body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }\n        div.dialog {\n            width: 80%;\n            padding: 1em 4em;\n            margin: 4em auto 0 auto;\n            border: 1px solid #ccc;\n            border-right-color: #999;\n            border-bottom-color: #999;\n        }\n        h1 { font-size: 100%; color: #f00; line-height: 1.5em; }\n    </style>\n    \n</head> \n</head>\n<body> \n\n\t<div class=\"dialog\"> \n\t    <h1>System Error</h1>\n\t    <p>${exceptionMsg}</p>\n\t\t<a href=\"javascript:window.location.href='${request.contextPath}/'\">Back</a>\n\t    </p> \n\t</div>\n\n</body>\n</html>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/templates/common/common.macro.ftl",
    "content": "<#macro commonStyle>\n\n\t<#-- favicon -->\n\t<link rel=\"icon\" href=\"${request.contextPath}/static/favicon.ico\" />\n\n\t<meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <!-- Tell the browser to be responsive to screen width -->\n    <meta content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\" name=\"viewport\">\n    <!-- Bootstrap -->\n    <link rel=\"stylesheet\" href=\"${request.contextPath}/static/adminlte/bower_components/bootstrap/css/bootstrap.min.css\">\n    <!-- Font Awesome -->\n    <link rel=\"stylesheet\" href=\"${request.contextPath}/static/adminlte/bower_components/font-awesome/css/font-awesome.min.css\">\n    <!-- Ionicons -->\n    <link rel=\"stylesheet\" href=\"${request.contextPath}/static/adminlte/bower_components/Ionicons/css/ionicons.min.css\">\n    <!-- Theme style -->\n    <link rel=\"stylesheet\" href=\"${request.contextPath}/static/adminlte/dist/css/AdminLTE.min.css\">\n    <!-- AdminLTE Skins. Choose a skin from the css/skins folder instead of downloading all of them to reduce the load. -->\n    <link rel=\"stylesheet\" href=\"${request.contextPath}/static/adminlte/dist/css/skins/_all-skins.min.css\">\n      \n\t<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->\n    <!--[if lt IE 9]>\n    <script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n    <script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n    <![endif]-->\n\n\t<!-- pace -->\n\t<link rel=\"stylesheet\" href=\"${request.contextPath}/static/adminlte/bower_components/PACE/themes/blue/pace-theme-flash.css\">\n\n\t<#-- i18n -->\n\t<#global I18n = I18nUtil.getMultString()?eval />\n\n</#macro>\n\n<#macro commonScript>\n\t<!-- jQuery -->\n\t<script src=\"${request.contextPath}/static/adminlte/bower_components/jquery/jquery.min.js\"></script>\n\t<!-- Bootstrap -->\n\t<script src=\"${request.contextPath}/static/adminlte/bower_components/bootstrap/js/bootstrap.min.js\"></script>\n\t<!-- FastClick -->\n\t<script src=\"${request.contextPath}/static/adminlte/bower_components/fastclick/fastclick.js\"></script>\n\t<!-- AdminLTE App -->\n\t<script src=\"${request.contextPath}/static/adminlte/dist/js/adminlte.min.js\"></script>\n\t<!-- jquery.slimscroll -->\n\t<script src=\"${request.contextPath}/static/adminlte/bower_components/jquery-slimscroll/jquery.slimscroll.min.js\"></script>\n\n    <!-- pace -->\n    <script src=\"${request.contextPath}/static/adminlte/bower_components/PACE/pace.min.js\"></script>\n    <#-- jquery cookie -->\n\t<script src=\"${request.contextPath}/static/plugins/jquery/jquery.cookie.js\"></script>\n\t<#-- jquery.validate -->\n\t<script src=\"${request.contextPath}/static/plugins/jquery/jquery.validate.min.js\"></script>\n\n\t<#-- layer -->\n\t<script src=\"${request.contextPath}/static/plugins/layer/layer.js\"></script>\n\n\t<#-- common -->\n    <script src=\"${request.contextPath}/static/js/common.1.js\"></script>\n    <script>\n\t\tvar base_url = '${request.contextPath}';\n        var I18n = ${I18nUtil.getMultString()};\n\t</script>\n\n</#macro>\n\n<#macro commonHeader>\n\t<header class=\"main-header\">\n\t\t<a href=\"${request.contextPath}/\" class=\"logo\">\n\t\t\t<span class=\"logo-mini\"><b>XXL</b></span>\n\t\t\t<span class=\"logo-lg\"><b>${I18n.admin_name}</b></span>\n\t\t</a>\n\t\t<nav class=\"navbar navbar-static-top\" role=\"navigation\">\n\n\t\t\t<a href=\"#\" class=\"sidebar-toggle\" data-toggle=\"push-menu\" role=\"button\">\n                <span class=\"sr-only\">Toggle navigation</span>\n                <span class=\"icon-bar\"></span>\n                <span class=\"icon-bar\"></span>\n                <span class=\"icon-bar\"></span>\n            </a>\n\n          \t<div class=\"navbar-custom-menu\">\n\t\t\t\t<ul class=\"nav navbar-nav\">\n\t\t\t\t\t<#-- login user -->\n                    <li class=\"dropdown\">\n                        <a href=\"javascript:\" class=\"dropdown-toggle\" data-toggle=\"dropdown\" aria-expanded=\"false\">\n                            ${I18n.system_welcome} ${XXL_JOB_LOGIN_IDENTITY.username}\n                            <span class=\"caret\"></span>\n                        </a>\n                        <ul class=\"dropdown-menu\" role=\"menu\">\n                            <li id=\"updatePwd\" ><a href=\"javascript:\">${I18n.change_pwd}</a></li>\n                            <li id=\"logoutBtn\" ><a href=\"javascript:\">${I18n.logout_btn}</a></li>\n                        </ul>\n                    </li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\n\t\t</nav>\n\t</header>\n\n\t<!-- 修改密码.模态框 -->\n\t<div class=\"modal fade\" id=\"updatePwdModal\" tabindex=\"-1\" role=\"dialog\"  aria-hidden=\"true\">\n\t\t<div class=\"modal-dialog \">\n\t\t\t<div class=\"modal-content\">\n\t\t\t\t<div class=\"modal-header\">\n\t\t\t\t\t<h4 class=\"modal-title\" >${I18n.change_pwd}</h4>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"modal-body\">\n\t\t\t\t\t<form class=\"form-horizontal form\" role=\"form\" >\n\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t<label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.change_pwd_field_newpwd}<font color=\"red\">*</font></label>\n\t\t\t\t\t\t\t<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" name=\"password\" placeholder=\"${I18n.system_please_input} ${I18n.change_pwd_field_newpwd}\" maxlength=\"18\" ></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<hr>\n\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t<div class=\"col-sm-offset-3 col-sm-6\">\n\t\t\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-primary\"  >${I18n.system_save}</button>\n\t\t\t\t\t\t\t\t<button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">${I18n.system_cancel}</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n</#macro>\n\n<#macro commonLeft pageName >\n\t<!-- Left side column. contains the logo and sidebar -->\n\t<aside class=\"main-sidebar\">\n\t\t<!-- sidebar: style can be found in sidebar.less -->\n\t\t<section class=\"sidebar\">\n\t\t\t<!-- sidebar menu: : style can be found in sidebar.less -->\n\t\t\t<ul class=\"sidebar-menu\">\n                <li class=\"header\">${I18n.system_nav}</li>\n                <li class=\"nav-click <#if pageName == \"index\">active</#if>\" ><a href=\"${request.contextPath}/\"><i class=\"fa fa-circle-o text-aqua\"></i><span>${I18n.job_dashboard_name}</span></a></li>\n\t\t\t\t<li class=\"nav-click <#if pageName == \"jobinfo\">active</#if>\" ><a href=\"${request.contextPath}/jobinfo\"><i class=\"fa fa-circle-o text-yellow\"></i><span>${I18n.jobinfo_name}</span></a></li>\n\t\t\t\t<li class=\"nav-click <#if pageName == \"joblog\">active</#if>\" ><a href=\"${request.contextPath}/joblog\"><i class=\"fa fa-circle-o text-green\"></i><span>${I18n.joblog_name}</span></a></li>\n\t\t\t\t<#if XXL_JOB_LOGIN_IDENTITY.role == 1>\n                    <li class=\"nav-click <#if pageName == \"jobgroup\">active</#if>\" ><a href=\"${request.contextPath}/jobgroup\"><i class=\"fa fa-circle-o text-red\"></i><span>${I18n.jobgroup_name}</span></a></li>\n                    <li class=\"nav-click <#if pageName == \"user\">active</#if>\" ><a href=\"${request.contextPath}/user\"><i class=\"fa fa-circle-o text-purple\"></i><span>${I18n.user_manage}</span></a></li>\n\t\t\t\t</#if>\n\t\t\t\t<li class=\"nav-click <#if pageName == \"help\">active</#if>\" ><a href=\"${request.contextPath}/help\"><i class=\"fa fa-circle-o text-gray\"></i><span>${I18n.job_help}</span></a></li>\n\t\t\t</ul>\n\t\t</section>\n\t\t<!-- /.sidebar -->\n\t</aside>\n</#macro>\n\n<#macro commonControl >\n\t<!-- Control Sidebar -->\n\t<aside class=\"control-sidebar control-sidebar-dark\">\n\t\t<!-- Create the tabs -->\n\t\t<ul class=\"nav nav-tabs nav-justified control-sidebar-tabs\">\n\t\t\t<li class=\"active\"><a href=\"#control-sidebar-home-tab\" data-toggle=\"tab\"><i class=\"fa fa-home\"></i></a></li>\n\t\t\t<li><a href=\"#control-sidebar-settings-tab\" data-toggle=\"tab\"><i class=\"fa fa-gears\"></i></a></li>\n\t\t</ul>\n\t\t<!-- Tab panes -->\n\t\t<div class=\"tab-content\">\n\t\t\t<!-- Home tab content -->\n\t\t\t<div class=\"tab-pane active\" id=\"control-sidebar-home-tab\">\n\t\t\t\t<h3 class=\"control-sidebar-heading\">近期活动</h3>\n\t\t\t\t<ul class=\"control-sidebar-menu\">\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<a href=\"javascript::;\">\n\t\t\t\t\t\t\t<i class=\"menu-icon fa fa-birthday-cake bg-red\"></i>\n\t\t\t\t\t\t\t<div class=\"menu-info\">\n\t\t\t\t\t\t\t\t<h4 class=\"control-sidebar-subheading\">张三今天过生日</h4>\n\t\t\t\t\t\t\t\t<p>2015-09-10</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<a href=\"javascript::;\"> \n\t\t\t\t\t\t\t<i class=\"menu-icon fa fa-user bg-yellow\"></i>\n\t\t\t\t\t\t\t<div class=\"menu-info\">\n\t\t\t\t\t\t\t\t<h4 class=\"control-sidebar-subheading\">Frodo 更新了资料</h4>\n\t\t\t\t\t\t\t\t<p>更新手机号码 +1(800)555-1234</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<a href=\"javascript::;\"> \n\t\t\t\t\t\t\t<i class=\"menu-icon fa fa-envelope-o bg-light-blue\"></i>\n\t\t\t\t\t\t\t<div class=\"menu-info\">\n\t\t\t\t\t\t\t\t<h4 class=\"control-sidebar-subheading\">Nora 加入邮件列表</h4>\n\t\t\t\t\t\t\t\t<p>nora@example.com</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<a href=\"javascript::;\">\n\t\t\t\t\t\t<i class=\"menu-icon fa fa-file-code-o bg-green\"></i>\n\t\t\t\t\t\t<div class=\"menu-info\">\n\t\t\t\t\t\t\t<h4 class=\"control-sidebar-subheading\">001号定时作业调度</h4>\n\t\t\t\t\t\t\t<p>5秒前执行</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<!-- /.control-sidebar-menu -->\n\t\t\t</div>\n\t\t\t<!-- /.tab-pane -->\n\n\t\t\t<!-- Settings tab content -->\n\t\t\t<div class=\"tab-pane\" id=\"control-sidebar-settings-tab\">\n\t\t\t\t<form method=\"post\">\n\t\t\t\t\t<h3 class=\"control-sidebar-heading\">个人设置</h3>\n\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t<label class=\"control-sidebar-subheading\"> 左侧菜单自适应\n\t\t\t\t\t\t\t<input type=\"checkbox\" class=\"pull-right\" checked>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<p>左侧菜单栏样式自适应</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<!-- /.form-group -->\n\n\t\t\t\t</form>\n\t\t\t</div>\n\t\t\t<!-- /.tab-pane -->\n\t\t</div>\n\t</aside>\n\t<!-- /.control-sidebar -->\n\t<!-- Add the sidebar's background. This div must be placed immediately after the control sidebar -->\n\t<div class=\"control-sidebar-bg\"></div>\n</#macro>\n\n<#macro commonFooter >\n\t<footer class=\"main-footer\">\n        Powered by <b>XXL-JOB</b> ${I18n.admin_version}\n\t\t<div class=\"pull-right hidden-xs\">\n            <strong>Copyright &copy; 2015-${.now?string('yyyy')} &nbsp;\n                <a href=\"https://www.xuxueli.com/\" target=\"_blank\" >xuxueli</a>\n\t\t\t\t&nbsp;\n                <a href=\"https://github.com/xuxueli/xxl-job\" target=\"_blank\" >github</a>\n            </strong><!-- All rights reserved. -->\n\t\t</div>\n\t</footer>\n</#macro>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/templates/help.ftl",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  \t<#import \"./common/common.macro.ftl\" as netCommon>\n\t<@netCommon.commonStyle />\n\t<title>${I18n.admin_name}</title>\n</head>\n<body class=\"hold-transition skin-blue sidebar-mini <#if cookieMap?exists && cookieMap[\"xxljob_adminlte_settings\"]?exists && \"off\" == cookieMap[\"xxljob_adminlte_settings\"].value >sidebar-collapse</#if> \">\n<div class=\"wrapper\">\n\t<!-- header -->\n\t<@netCommon.commonHeader />\n\t<!-- left -->\n\t<@netCommon.commonLeft \"help\" />\n\t\n\t<!-- Content Wrapper. Contains page content -->\n\t<div class=\"content-wrapper\">\n\t\t<!-- Content Header (Page header) -->\n\t\t<section class=\"content-header\">\n\t\t\t<h1>${I18n.job_help}</h1>\n\t\t</section>\n\n\t\t<!-- Main content -->\n\t\t<section class=\"content\">\n\t\t\t<div class=\"callout callout-info\">\n\t\t\t\t<h4>${I18n.admin_name_full}</h4>\n\t\t\t\t<br>\n\t\t\t\t<p>\n\t\t\t\t\t<a target=\"_blank\" href=\"https://github.com/xuxueli/xxl-job\">Github</a>&nbsp;&nbsp;&nbsp;&nbsp;\n\t\t\t\t\t<iframe src=\"https://ghbtns.com/github-btn.html?user=xuxueli&repo=xxl-job&type=star&count=true\" frameborder=\"0\" scrolling=\"0\" width=\"170px\" height=\"20px\" style=\"margin-bottom:-5px;\"></iframe> \n\t\t\t\t\t<br><br>\n                    <a target=\"_blank\" href=\"https://www.xuxueli.com/xxl-job/\">${I18n.job_help_document}</a>\n                    <br><br>\n\n\t\t\t\t</p>\n\t\t\t\t<p></p>\n            </div>\n\t\t</section>\n\t\t<!-- /.content -->\n\t</div>\n\t<!-- /.content-wrapper -->\n\t\n\t<!-- footer -->\n\t<@netCommon.commonFooter />\n</div>\n<@netCommon.commonScript />\n</body>\n</html>\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/templates/index.ftl",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  \t<#import \"./common/common.macro.ftl\" as netCommon>\n\t<@netCommon.commonStyle />\n    <!-- daterangepicker -->\n    <link rel=\"stylesheet\" href=\"${request.contextPath}/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.css\">\n    <title>${I18n.admin_name}</title>\n</head>\n<body class=\"hold-transition skin-blue sidebar-mini <#if cookieMap?exists && cookieMap[\"xxljob_adminlte_settings\"]?exists && \"off\" == cookieMap[\"xxljob_adminlte_settings\"].value >sidebar-collapse</#if> \">\n<div class=\"wrapper\">\n\t<!-- header -->\n\t<@netCommon.commonHeader />\n\t<!-- left -->\n\t<@netCommon.commonLeft \"index\" />\n\t\n\t<!-- Content Wrapper. Contains page content -->\n\t<div class=\"content-wrapper\">\n\t\t<!-- Content Header (Page header) -->\n\t\t<section class=\"content-header\">\n\t\t\t<h1>${I18n.job_dashboard_name}</h1>\n\t\t\t<!--\n\t\t\t<h1>运行报表<small>任务调度中心</small></h1>\n\t\t\t<ol class=\"breadcrumb\">\n\t\t\t\t<li><a><i class=\"fa fa-dashboard\"></i>调度中心</a></li>\n\t\t\t\t<li class=\"active\">使用教程</li>\n\t\t\t</ol>\n\t\t\t-->\n\t\t</section>\n\n\t\t<!-- Main content -->\n\t\t<section class=\"content\">\n\n            <!-- 任务信息 -->\n            <div class=\"row\">\n\n                <#-- 任务信息 -->\n                <div class=\"col-md-4 col-sm-6 col-xs-12\">\n                    <div class=\"info-box bg-aqua\">\n                        <span class=\"info-box-icon\"><i class=\"fa fa-flag-o\"></i></span>\n\n                        <div class=\"info-box-content\">\n                            <span class=\"info-box-text\">${I18n.job_dashboard_job_num}</span>\n                            <span class=\"info-box-number\">${jobInfoCount}</span>\n\n                            <div class=\"progress\">\n                                <div class=\"progress-bar\" style=\"width: 100%\"></div>\n                            </div>\n                            <span class=\"progress-description\">${I18n.job_dashboard_job_num_tip}</span>\n                        </div>\n                    </div>\n                </div>\n\n                <#-- 调度信息 -->\n                <div class=\"col-md-4 col-sm-6 col-xs-12\" >\n                    <div class=\"info-box bg-yellow\">\n                        <span class=\"info-box-icon\"><i class=\"fa fa-calendar\"></i></span>\n\n                        <div class=\"info-box-content\">\n                            <span class=\"info-box-text\">${I18n.job_dashboard_trigger_num}</span>\n                            <span class=\"info-box-number\">${jobLogCount}</span>\n\n                            <div class=\"progress\">\n                                <div class=\"progress-bar\" style=\"width: 100%\" ></div>\n                            </div>\n                            <span class=\"progress-description\">\n                                ${I18n.job_dashboard_trigger_num_tip}\n                                <#--<#if jobLogCount gt 0>\n                                    调度成功率：${(jobLogSuccessCount*100/jobLogCount)?string(\"0.00\")}<small>%</small>\n                                </#if>-->\n                            </span>\n                        </div>\n                    </div>\n                </div>\n\n                <#-- 执行器 -->\n                <div class=\"col-md-4 col-sm-6 col-xs-12\">\n                    <div class=\"info-box bg-green\">\n                        <span class=\"info-box-icon\"><i class=\"fa ion-ios-settings-strong\"></i></span>\n\n                        <div class=\"info-box-content\">\n                            <span class=\"info-box-text\">${I18n.job_dashboard_jobgroup_num}</span>\n                            <span class=\"info-box-number\">${executorCount}</span>\n\n                            <div class=\"progress\">\n                                <div class=\"progress-bar\" style=\"width: 100%\"></div>\n                            </div>\n                            <span class=\"progress-description\">${I18n.job_dashboard_jobgroup_num_tip}</span>\n                        </div>\n                    </div>\n                </div>\n\n            </div>\n\n            <#-- 调度报表：时间区间筛选，左侧折线图 + 右侧饼图 -->\n            <div class=\"row\">\n                <div class=\"col-md-12\">\n                    <div class=\"box\">\n                        <div class=\"box-header with-border\">\n                            <h3 class=\"box-title\">${I18n.job_dashboard_report}</h3>\n                            <#--<input type=\"text\" class=\"form-control\" id=\"filterTime\" readonly >-->\n\n                            <!-- tools box -->\n                            <div class=\"pull-right box-tools\">\n                                <button type=\"button\" class=\"btn btn-primary btn-sm daterange pull-right\" data-toggle=\"tooltip\" id=\"filterTime\" >\n                                    <i class=\"fa fa-calendar\"></i>\n                                </button>\n                                <#--<button type=\"button\" class=\"btn btn-primary btn-sm pull-right\" data-widget=\"collapse\" data-toggle=\"tooltip\" title=\"\" style=\"margin-right: 5px;\" data-original-title=\"Collapse\">\n                                    <i class=\"fa fa-minus\"></i>\n                                </button>-->\n                            </div>\n                            <!-- /. tools -->\n\n                        </div>\n                        <div class=\"box-body\">\n                            <div class=\"row\">\n                                <#-- 左侧折线图 -->\n                                <div class=\"col-md-8\">\n                                    <div id=\"lineChart\" style=\"height: 350px;\"></div>\n                                </div>\n                                <#-- 右侧饼图 -->\n                                <div class=\"col-md-4\">\n                                    <div id=\"pieChart\" style=\"height: 350px;\"></div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n\n\t\t</section>\n\t\t<!-- /.content -->\n\t</div>\n\t<!-- /.content-wrapper -->\n\t\n\t<!-- footer -->\n\t<@netCommon.commonFooter />\n</div>\n<@netCommon.commonScript />\n<!-- daterangepicker -->\n<script src=\"${request.contextPath}/static/adminlte/bower_components/moment/moment.min.js\"></script>\n<script src=\"${request.contextPath}/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.js\"></script>\n<#-- echarts -->\n<script src=\"${request.contextPath}/static/plugins/echarts/echarts.common.min.js\"></script>\n<script src=\"${request.contextPath}/static/js/index.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/templates/jobcode/jobcode.index.ftl",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  \t<#import \"../common/common.macro.ftl\" as netCommon>\n\t<@netCommon.commonStyle />\n\t<link rel=\"stylesheet\" href=\"${request.contextPath}/static/plugins/codemirror/lib/codemirror.css\">\n\t<link rel=\"stylesheet\" href=\"${request.contextPath}/static/plugins/codemirror/addon/hint/show-hint.css\">\n    <title>${I18n.admin_name}</title>\n\t<style type=\"text/css\">\n\t\t.CodeMirror {\n      \t\tfont-size:16px;\n            width: 100%;\n      \t\theight: 100%;\n            /*bottom: 0;\n            top: 0px;*/\n            position: absolute;\n\t\t}\n    </style>\n</head>\n<body class=\"skin-blue fixed layout-top-nav\">\n\n\t<div class=\"wrapper\">\n\n        <header class=\"main-header\">\n            <nav class=\"navbar navbar-static-top\">\n                <div class=\"container\">\n\t\t\t\t\t<#-- icon -->\n                    <div class=\"navbar-header\">\n                        <a class=\"navbar-brand\"><b>Web</b>IDE</a>\n                        <button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#navbar-collapse\">\n                            <i class=\"fa fa-bars\"></i>\n                        </button>\n                    </div>\n\n                    <#-- left nav -->\n                    <div class=\"collapse navbar-collapse pull-left\" id=\"navbar-collapse\">\n                        <ul class=\"nav navbar-nav\">\n                            <li class=\"active\" ><a href=\"javascript:;\">\n                                <span class=\"sr-only\">(current)</span>\n                                【<#list GlueTypeEnum as item><#if item == jobInfo.glueType>${item.desc}</#if></#list>】\n                                ${jobInfo.jobDesc}\n                            </a></li>\n                        </ul>\n                    </div>\n\n\t\t\t\t\t<#-- right nav -->\n                    <div class=\"navbar-custom-menu\">\n                        <ul class=\"nav navbar-nav\">\n                            <li class=\"dropdown\">\n                                <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\" aria-expanded=\"false\">${I18n.jobinfo_glue_rollback} <span class=\"caret\"></span></a>\n                                <ul class=\"dropdown-menu\" role=\"menu\">\n                                    <li <#if jobLogGlues?exists && jobLogGlues?size gt 0 >style=\"display: none;\"</#if> >\n                                        <a href=\"javascript:;\" class=\"source_version\" version=\"version_now\" glueType=\"${jobInfo.glueType}\" >\n                                            <#list GlueTypeEnum as item><#if item == jobInfo.glueType>${item.desc}</#if></#list>： ${jobInfo.glueRemark}\n                                        </a>\n                                    </li>\n                                    <textarea id=\"version_now\" style=\"display:none;\" >${jobInfo.glueSource}</textarea>\n\t\t\t\t\t\t\t\t\t<#if jobLogGlues?exists && jobLogGlues?size gt 0 >\n\t\t\t\t\t\t\t\t\t\t<#list jobLogGlues as glue>\n                                            <li>\n                                                <a href=\"javascript:;\" class=\"source_version\" version=\"version_${glue.id}\" glueType=\"${glue.glueType}\" >\n                                                    <#list GlueTypeEnum as item><#if item == glue.glueType>${item.desc}</#if></#list>： ${glue.glueRemark}\n                                                </a>\n                                            </li>\n                                            <textarea id=\"version_${glue.id}\" style=\"display:none;\" >${glue.glueSource}</textarea>\n\t\t\t\t\t\t\t\t\t\t</#list>\n\t\t\t\t\t\t\t\t\t</#if>\n                                </ul>\n                            </li>\n                            <li id=\"save\" >\n\t\t\t\t\t\t\t\t<a href=\"javascript:;\" >\n\t\t\t\t\t\t\t\t\t<i class=\"fa fa-fw fa-save\" ></i>\n                                    ${I18n.system_save}\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t</li>\n                            <li>\n                                <a href=\"javascript:window.close();\" >\n                                    <i class=\"fa fa-fw fa-close\" ></i>\n                                ${I18n.system_close}\n                                </a>\n                            </li>\n                        </ul>\n                    </div>\n\n                </div>\n            </nav>\n        </header>\n\n\t\t<div class=\"content-wrapper\" id=\"ideWindow\" ></div>\n\n\t\t<!-- footer -->\n\t\t<#--<@netCommon.commonFooter />-->\n\t</div>\n\n    <!-- 保存.模态框 -->\n    <div class=\"modal fade\" id=\"saveModal\" tabindex=\"-1\" role=\"dialog\"  aria-hidden=\"true\">\n        <div class=\"modal-dialog \">\n            <div class=\"modal-content\">\n                <div class=\"modal-header\">\n                    <h4 class=\"modal-title\" ><i class=\"fa fa-fw fa-save\"></i>${I18n.system_save}</h4>\n                </div>\n                <div class=\"modal-body\">\n                    <div class=\"form-horizontal form\" role=\"form\" >\n                        <div class=\"form-group\">\n                            <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_glue_remark}<font color=\"red\">*</font></label>\n                            <div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"glueRemark\" placeholder=\"${I18n.system_please_input}${I18n.jobinfo_glue_remark}\" maxlength=\"64\" ></div>\n                        </div>\n                        <hr>\n                        <div class=\"form-group\">\n                            <div class=\"col-sm-offset-3 col-sm-6\">\n                                <button type=\"button\" class=\"btn btn-primary ok\" >${I18n.system_save}</button>\n                                <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">${I18n.system_cancel}</button>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n\t\n<@netCommon.commonScript />\n\n\n    <#assign glueTypeModeSrc = \"${request.contextPath}/static/plugins/codemirror/mode/clike/clike.js\" />\n    <#assign glueTypeIdeMode = \"text/x-java\" />\n\n    <#if jobInfo.glueType == \"GLUE_GROOVY\" >\n        <#assign glueTypeModeSrc = \"${request.contextPath}/static/plugins/codemirror/mode/clike/clike.js\" />\n        <#assign glueTypeIdeMode = \"text/x-java\" />\n    <#elseif jobInfo.glueType == \"GLUE_SHELL\" >\n        <#assign glueTypeModeSrc = \"${request.contextPath}/static/plugins/codemirror/mode/shell/shell.js\" />\n        <#assign glueTypeIdeMode = \"text/x-sh\" />\n    <#elseif jobInfo.glueType == \"GLUE_PYTHON\" >\n        <#assign glueTypeModeSrc = \"${request.contextPath}/static/plugins/codemirror/mode/python/python.js\" />\n        <#assign glueTypeIdeMode = \"text/x-python\" />\n    <#elseif jobInfo.glueType == \"GLUE_PHP\" >\n        <#assign glueTypeModeSrc = \"${request.contextPath}/static/plugins/codemirror/mode/php/php.js\" />\n        <#assign glueTypeIdeMode = \"text/x-php\" />\n        <#assign glueTypeModeSrc02 = \"${request.contextPath}/static/plugins/codemirror/mode/clike/clike.js\" />\n    <#elseif jobInfo.glueType == \"GLUE_NODEJS\" >\n        <#assign glueTypeModeSrc = \"${request.contextPath}/static/plugins/codemirror/mode/javascript/javascript.js\" />\n        <#assign glueTypeIdeMode = \"text/javascript\" />\n    <#elseif jobInfo.glueType == \"GLUE_POWERSHELL\" >\n        <#assign glueTypeModeSrc = \"${request.contextPath}/static/plugins/codemirror/mode/powershell/powershell.js\" />\n        <#assign glueTypeIdeMode = \"powershell\" />\n    </#if>\n\n\n<script src=\"${request.contextPath}/static/plugins/codemirror/lib/codemirror.js\"></script>\n<script src=\"${glueTypeModeSrc}\"></script>\n<#if glueTypeModeSrc02?exists>\n    <script src=\"${glueTypeModeSrc02}\"></script>\n</#if>\n<script src=\"${request.contextPath}/static/plugins/codemirror/addon/hint/show-hint.js\"></script>\n<script src=\"${request.contextPath}/static/plugins/codemirror/addon/hint/anyword-hint.js\"></script>\n\n<script>\nvar id = '${jobInfo.id}';\nvar ideMode = '${glueTypeIdeMode}';\n</script>\n<script src=\"${request.contextPath}/static/js/jobcode.index.1.js\"></script>\n\n</body>\n</html>\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/templates/jobgroup/jobgroup.index.ftl",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  \t<#import \"../common/common.macro.ftl\" as netCommon>\n\t<@netCommon.commonStyle />\n\t<!-- DataTables -->\n  \t<link rel=\"stylesheet\" href=\"${request.contextPath}/static/adminlte/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css\">\n    <title>${I18n.admin_name}</title>\n</head>\n<body class=\"hold-transition skin-blue sidebar-mini <#if cookieMap?exists && cookieMap[\"xxljob_adminlte_settings\"]?exists && \"off\" == cookieMap[\"xxljob_adminlte_settings\"].value >sidebar-collapse</#if> \">\n<div class=\"wrapper\">\n\t<!-- header -->\n\t<@netCommon.commonHeader />\n\t<!-- left -->\n\t<@netCommon.commonLeft \"jobgroup\" />\n\t\n\t<!-- Content Wrapper. Contains page content -->\n\t<div class=\"content-wrapper\">\n\t\t<!-- Content Header (Page header) -->\n\t\t<section class=\"content-header\">\n\t\t\t<h1>${I18n.jobgroup_name}</h1>\n\t\t</section>\n\n\t\t<!-- Main content -->\n\t    <section class=\"content\">\n\n            <div class=\"row\">\n                <div class=\"col-xs-3\">\n                    <div class=\"input-group\">\n                        <span class=\"input-group-addon\">AppName</span>\n                        <input type=\"text\" class=\"form-control\" id=\"appname\" placeholder=\"${I18n.system_please_input}AppName\" >\n                    </div>\n                </div>\n                <div class=\"col-xs-3\">\n                    <div class=\"input-group\">\n                        <span class=\"input-group-addon\">${I18n.jobgroup_field_title}</span>\n                        <input type=\"text\" class=\"form-control\" id=\"title\" placeholder=\"${I18n.jobgroup_field_title}\" >\n                    </div>\n                </div>\n                <div class=\"col-xs-2\">\n                    <button class=\"btn btn-block btn-info\" id=\"searchBtn\">${I18n.system_search}</button>\n                </div>\n                <div class=\"col-xs-2\">\n                    <button class=\"btn btn-block btn-success add\" type=\"button\">${I18n.jobinfo_field_add}</button>\n                </div>\n            </div>\n\t\t\t\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"col-xs-12\">\n\t\t\t\t\t<div class=\"box\">\n\t\t\t            <div class=\"box-body\">\n\t\t\t              \t<table id=\"jobgroup_list\" class=\"table table-bordered table-striped display\" width=\"100%\" >\n\t\t\t\t                <thead>\n\t\t\t\t\t            \t<tr>\n                                        <th name=\"id\" >ID</th>\n                                        <th name=\"appname\" >AppName</th>\n                                        <th name=\"title\" >${I18n.jobgroup_field_title}</th>\n                                        <th name=\"addressType\" >${I18n.jobgroup_field_addressType}</th>\n                                        <th name=\"registryList\" >OnLine ${I18n.jobgroup_field_registryList}</th>\n                                        <th>${I18n.system_opt}</th>\n\t\t\t\t\t                </tr>\n\t\t\t\t                </thead>\n                                <tbody>\n\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t    </section>\n\t</div>\n\n    <!-- 注册列表查看.模态框 -->\n    <div class=\"modal fade\" id=\"showRegistryListModal\" tabindex=\"-1\" role=\"dialog\"  aria-hidden=\"true\">\n        <div class=\"modal-dialog modal-sm\">\n            <div class=\"modal-content\">\n                <div class=\"modal-header\">\n                    <h4 class=\"modal-title\" >${I18n.jobinfo_opt_registryinfo}</h4>\n                </div>\n                <div class=\"modal-body\">\n                    <div class=\"data\" style=\"word-wrap: break-word;\"></div>\n                </div>\n                <div class=\"modal-footer\">\n                    <div class=\"text-center\" >\n                        <button type=\"button\" class=\"btn btn-info ok\" data-dismiss=\"modal\" >${I18n.system_ok}</button>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <!-- 新增.模态框 -->\n    <div class=\"modal fade\" id=\"addModal\" tabindex=\"-1\" role=\"dialog\"  aria-hidden=\"true\">\n        <div class=\"modal-dialog \">\n            <div class=\"modal-content\">\n                <div class=\"modal-header\">\n                    <h4 class=\"modal-title\" >${I18n.jobgroup_add}</h4>\n                </div>\n                <div class=\"modal-body\">\n                    <form class=\"form-horizontal form\" role=\"form\" >\n                        <div class=\"form-group\">\n                            <label for=\"lastname\" class=\"col-sm-2 control-label\">AppName<font color=\"red\">*</font></label>\n                            <div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" name=\"appname\" placeholder=\"${I18n.system_please_input}AppName\" maxlength=\"64\" ></div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.jobgroup_field_title}<font color=\"red\">*</font></label>\n                            <div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" name=\"title\" placeholder=\"${I18n.system_please_input}${I18n.jobgroup_field_title}\" maxlength=\"12\" ></div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.jobgroup_field_addressType}<font color=\"red\">*</font></label>\n                            <div class=\"col-sm-10\">\n                                <input type=\"radio\" name=\"addressType\" value=\"0\" checked />${I18n.jobgroup_field_addressType_0}\n                                &nbsp;&nbsp;&nbsp;&nbsp;\n                                <input type=\"radio\" name=\"addressType\" value=\"1\" />${I18n.jobgroup_field_addressType_1}\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.jobgroup_field_registryList}<font color=\"red\">*</font></label>\n                            <div class=\"col-sm-10\">\n                                <textarea class=\"textarea\" name=\"addressList\" maxlength=\"20000\" placeholder=\"${I18n.jobgroup_field_registryList_placeholder}\" readonly=\"readonly\" style=\"background-color:#eee; width: 100%; height: 100px; font-size: 14px; line-height: 15px; border: 1px solid #dddddd; padding: 5px;\"></textarea>\n                            </div>\n                        </div>\n                        <hr>\n                        <div class=\"form-group\">\n                            <div class=\"col-sm-offset-3 col-sm-6\">\n                                <button type=\"submit\" class=\"btn btn-primary\"  >${I18n.system_save}</button>\n                                <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">${I18n.system_cancel}</button>\n                            </div>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <!-- 更新.模态框 -->\n    <div class=\"modal fade\" id=\"updateModal\" tabindex=\"-1\" role=\"dialog\"  aria-hidden=\"true\">\n        <div class=\"modal-dialog \">\n            <div class=\"modal-content\">\n                <div class=\"modal-header\">\n                    <h4 class=\"modal-title\" >${I18n.jobgroup_edit}</h4>\n                </div>\n                <div class=\"modal-body\">\n                    <form class=\"form-horizontal form\" role=\"form\" >\n                        <div class=\"form-group\">\n                            <label for=\"lastname\" class=\"col-sm-2 control-label\">AppName<font color=\"red\">*</font></label>\n                            <div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" name=\"appname\" placeholder=\"${I18n.system_please_input}AppName\" maxlength=\"64\" ></div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.jobgroup_field_title}<font color=\"red\">*</font></label>\n                            <div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" name=\"title\" placeholder=\"${I18n.system_please_input}${I18n.jobgroup_field_title}\" maxlength=\"12\" ></div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.jobgroup_field_addressType}<font color=\"red\">*</font></label>\n                            <div class=\"col-sm-10\">\n                                <input type=\"radio\" name=\"addressType\" value=\"0\" />${I18n.jobgroup_field_addressType_0}\n                                &nbsp;&nbsp;&nbsp;&nbsp;\n                                <input type=\"radio\" name=\"addressType\" value=\"1\" />${I18n.jobgroup_field_addressType_1}\n                            </div>\n                        </div>\n                        <div class=\"form-group\">\n                            <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.jobgroup_field_registryList}<font color=\"red\">*</font></label>\n                            <div class=\"col-sm-10\">\n                                <textarea class=\"textarea\" name=\"addressList\" maxlength=\"20000\" placeholder=\"${I18n.jobgroup_field_registryList_placeholder}\" readonly=\"readonly\" style=\"background-color:#eee; width: 100%; height: 100px; font-size: 14px; line-height: 15px; border: 1px solid #dddddd; padding: 5px;\"></textarea>\n                            </div>\n                        </div>\n                        <hr>\n                        <div class=\"form-group\">\n                            <div class=\"col-sm-offset-3 col-sm-6\">\n                                <button type=\"submit\" class=\"btn btn-primary\"  >${I18n.system_save}</button>\n                                <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">${I18n.system_cancel}</button>\n                                <input type=\"hidden\" name=\"id\" >\n                            </div>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        </div>\n    </div>\n\t\n\t<!-- footer -->\n\t<@netCommon.commonFooter />\n</div>\n\n<@netCommon.commonScript />\n<!-- DataTables -->\n<script src=\"${request.contextPath}/static/adminlte/bower_components/datatables.net/js/jquery.dataTables.min.js\"></script>\n<script src=\"${request.contextPath}/static/adminlte/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js\"></script>\n<script src=\"${request.contextPath}/static/js/jobgroup.index.1.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/templates/jobinfo/jobinfo.index.ftl",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  \t<#import \"../common/common.macro.ftl\" as netCommon>\n\t<@netCommon.commonStyle />\n\t<!-- DataTables -->\n  \t<link rel=\"stylesheet\" href=\"${request.contextPath}/static/adminlte/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css\">\n    <title>${I18n.admin_name}</title>\n</head>\n<body class=\"hold-transition skin-blue sidebar-mini <#if cookieMap?exists && cookieMap[\"xxljob_adminlte_settings\"]?exists && \"off\" == cookieMap[\"xxljob_adminlte_settings\"].value >sidebar-collapse</#if>\">\n<div class=\"wrapper\">\n\t<!-- header -->\n\t<@netCommon.commonHeader />\n\t<!-- left -->\n\t<@netCommon.commonLeft \"jobinfo\" />\n\t\n\t<!-- Content Wrapper. Contains page content -->\n\t<div class=\"content-wrapper\">\n\t\t<!-- Content Header (Page header) -->\n\t\t<section class=\"content-header\">\n\t\t\t<h1>${I18n.jobinfo_name}</h1>\n\t\t</section>\n\t\t\n\t\t<!-- Main content -->\n\t    <section class=\"content\">\n\t    \n\t    \t<div class=\"row\">\n\t    \t\t<div class=\"col-xs-3\">\n\t              \t<div class=\"input-group\">\n\t                \t<span class=\"input-group-addon\">${I18n.jobinfo_field_jobgroup}</span>\n                \t\t<select class=\"form-control\" id=\"jobGroup\" >\n                \t\t\t<#list JobGroupList as group>\n                \t\t\t\t<option value=\"${group.id}\" <#if jobGroup==group.id>selected</#if> >${group.title}</option>\n                \t\t\t</#list>\n\t                  \t</select>\n\t              \t</div>\n\t            </div>\n                <div class=\"col-xs-1\">\n                    <div class=\"input-group\">\n                        <select class=\"form-control\" id=\"triggerStatus\" >\n                            <option value=\"-1\" >${I18n.system_all}</option>\n                            <option value=\"0\" >${I18n.jobinfo_opt_stop}</option>\n                            <option value=\"1\" >${I18n.jobinfo_opt_start}</option>\n                        </select>\n                    </div>\n                </div>\n                <div class=\"col-xs-2\">\n                    <div class=\"input-group\">\n                        <input type=\"text\" class=\"form-control\" id=\"jobDesc\" placeholder=\"${I18n.system_please_input}${I18n.jobinfo_field_jobdesc}\" >\n                    </div>\n                </div>\n                <div class=\"col-xs-2\">\n                    <div class=\"input-group\">\n                        <input type=\"text\" class=\"form-control\" id=\"executorHandler\" placeholder=\"${I18n.system_please_input}JobHandler\" >\n                    </div>\n                </div>\n                <div class=\"col-xs-2\">\n                    <div class=\"input-group\">\n                        <input type=\"text\" class=\"form-control\" id=\"author\" placeholder=\"${I18n.system_please_input}${I18n.jobinfo_field_author}\" >\n                    </div>\n                </div>\n\t            <div class=\"col-xs-1\">\n\t            \t<button class=\"btn btn-block btn-info\" id=\"searchBtn\">${I18n.system_search}</button>\n\t            </div>\n\t            <div class=\"col-xs-1\">\n\t            \t<button class=\"btn btn-block btn-success add\" type=\"button\">${I18n.jobinfo_field_add}</button>\n\t            </div>\n          \t</div>\n\t    \t\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"col-xs-12\">\n\t\t\t\t\t<div class=\"box\">\n\t\t\t            <#--<div class=\"box-header hide\">\n\t\t\t            \t<h3 class=\"box-title\">调度列表</h3>\n\t\t\t            </div>-->\n\t\t\t            <div class=\"box-body\" >\n\t\t\t              \t<table id=\"job_list\" class=\"table table-bordered table-striped\" width=\"100%\" >\n\t\t\t\t                <thead>\n\t\t\t\t\t            \t<tr>\n\t\t\t\t\t            \t\t<th name=\"id\" >${I18n.jobinfo_field_id}</th>\n\t\t\t\t\t                \t<th name=\"jobGroup\" >${I18n.jobinfo_field_jobgroup}</th>\n\t\t\t\t\t                  \t<th name=\"jobDesc\" >${I18n.jobinfo_field_jobdesc}</th>\n                                        <th name=\"scheduleType\" >${I18n.schedule_type}</th>\n                                        <th name=\"glueType\" >${I18n.jobinfo_field_gluetype}</th>\n                                        <th name=\"executorParam\" >${I18n.jobinfo_field_executorparam}</th>\n\t\t\t\t\t                  \t<th name=\"addTime\" >addTime</th>\n\t\t\t\t\t                  \t<th name=\"updateTime\" >updateTime</th>\n\t\t\t\t\t                  \t<th name=\"author\" >${I18n.jobinfo_field_author}</th>\n\t\t\t\t\t                  \t<th name=\"alarmEmail\" >${I18n.jobinfo_field_alarmemail}</th>\n\t\t\t\t\t                  \t<th name=\"triggerStatus\" >${I18n.system_status}</th>\n\t\t\t\t\t                  \t<th>${I18n.system_opt}</th>\n\t\t\t\t\t                </tr>\n\t\t\t\t                </thead>\n\t\t\t\t                <tbody></tbody>\n\t\t\t\t                <tfoot></tfoot>\n\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t    </section>\n\t</div>\n\t\n\t<!-- footer -->\n\t<@netCommon.commonFooter />\n</div>\n\n<!-- job新增.模态框 -->\n<div class=\"modal fade\" id=\"addModal\" tabindex=\"-1\" role=\"dialog\"  aria-hidden=\"true\">\n\t<div class=\"modal-dialog modal-lg\">\n\t\t<div class=\"modal-content\">\n\t\t\t<div class=\"modal-header\">\n            \t<h4 class=\"modal-title\" >${I18n.jobinfo_field_add}</h4>\n         \t</div>\n         \t<div class=\"modal-body\">\n\t\t\t\t<form class=\"form-horizontal form\" role=\"form\" >\n\n                    <p style=\"margin: 0 0 10px;text-align: left;border-bottom: 1px solid #e5e5e5;color: gray;\">${I18n.jobinfo_conf_base}</p>    <#-- 基础信息 -->\n\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t<label for=\"firstname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_jobgroup}<font color=\"red\">*</font></label>\n\t\t\t\t\t\t<div class=\"col-sm-4\">\n\t\t\t\t\t\t\t<select class=\"form-control\" name=\"jobGroup\" >\n\t\t            \t\t\t<#list JobGroupList as group>\n\t\t            \t\t\t\t<option value=\"${group.id}\" <#if jobGroup==group.id>selected</#if> >${group.title}</option>\n\t\t            \t\t\t</#list>\n\t\t                  \t</select>\n\t\t\t\t\t\t</div>\n\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_jobdesc}<font color=\"red\">*</font></label>\n                        <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"jobDesc\" placeholder=\"${I18n.system_please_input}${I18n.jobinfo_field_jobdesc}\" maxlength=\"50\" ></div>\n\t\t\t\t\t</div>\n                    <div class=\"form-group\">\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_author}<font color=\"red\">*</font></label>\n                        <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"author\" placeholder=\"${I18n.system_please_input}${I18n.jobinfo_field_author}\" maxlength=\"50\" ></div>\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_alarmemail}<font color=\"black\">*</font></label>\n                        <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"alarmEmail\" placeholder=\"${I18n.jobinfo_field_alarmemail_placeholder}\" maxlength=\"100\" ></div>\n                    </div>\n\n                    <br>\n                    <p style=\"margin: 0 0 10px;text-align: left;border-bottom: 1px solid #e5e5e5;color: gray;\">${I18n.jobinfo_conf_schedule}</p>    <#-- 调度 -->\n                    <div class=\"form-group\">\n                        <label for=\"firstname\" class=\"col-sm-2 control-label\">${I18n.schedule_type}<font color=\"red\">*</font></label>\n                        <div class=\"col-sm-4\">\n                            <select class=\"form-control scheduleType\" name=\"scheduleType\" >\n                                <#list ScheduleTypeEnum as item>\n                                    <option value=\"${item}\" <#if 'CRON' == item >selected</#if> >${item.title}</option>\n                                </#list>\n                            </select>\n                        </div>\n\n                        <input type=\"hidden\" name=\"scheduleConf\" />\n                        <div class=\"schedule_conf schedule_conf_NONE\" style=\"display: none\" >\n                        </div>\n                        <div class=\"schedule_conf schedule_conf_CRON\" >\n                            <label for=\"lastname\" class=\"col-sm-2 control-label\">Cron<font color=\"red\">*</font></label>\n                            <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"schedule_conf_CRON\" placeholder=\"${I18n.system_please_input}Cron\" maxlength=\"128\" ></div>\n                        </div>\n                        <div class=\"schedule_conf schedule_conf_FIX_RATE\" style=\"display: none\" >\n                            <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.schedule_type_fix_rate}<font color=\"red\">*</font></label>\n                            <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"schedule_conf_FIX_RATE\" placeholder=\"${I18n.system_please_input} （ Second ）\" maxlength=\"10\" onkeyup=\"this.value=this.value.replace(/\\D/g,'')\" onafterpaste=\"this.value=this.value.replace(/\\D/g,'')\" ></div>\n                        </div>\n                        <div class=\"schedule_conf schedule_conf_FIX_DELAY\" style=\"display: none\" >\n                            <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.schedule_type_fix_delay}<font color=\"red\">*</font></label>\n                            <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"schedule_conf_FIX_DELAY\" placeholder=\"${I18n.system_please_input} （ Second ）\" maxlength=\"10\" onkeyup=\"this.value=this.value.replace(/\\D/g,'')\" onafterpaste=\"this.value=this.value.replace(/\\D/g,'')\" ></div>\n                        </div>\n                    </div>\n\n                    <br>\n                    <p style=\"margin: 0 0 10px;text-align: left;border-bottom: 1px solid #e5e5e5;color: gray;\">${I18n.jobinfo_conf_job}</p>    <#-- 任务配置 -->\n\n                    <div class=\"form-group\">\n                        <label for=\"firstname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_gluetype}<font color=\"red\">*</font></label>\n                        <div class=\"col-sm-4\">\n                            <select class=\"form-control glueType\" name=\"glueType\" >\n                                <#list GlueTypeEnum as item>\n                                    <option value=\"${item}\" >${item.desc}</option>\n                                </#list>\n                            </select>\n                        </div>\n                        <label for=\"firstname\" class=\"col-sm-2 control-label\">JobHandler<font color=\"red\">*</font></label>\n                        <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"executorHandler\" placeholder=\"${I18n.system_please_input}JobHandler\" maxlength=\"100\" ></div>\n                    </div>\n\n                    <div class=\"form-group\">\n                        <label for=\"firstname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_executorparam}<font color=\"black\">*</font></label>\n                        <div class=\"col-sm-10\">\n                            <textarea class=\"textarea form-control\" name=\"executorParam\" placeholder=\"${I18n.system_please_input}${I18n.jobinfo_field_executorparam}\" maxlength=\"512\" style=\"height: 63px; line-height: 1.2;\"></textarea>\n                        </div>\n                    </div>\n\n                    <br>\n                    <p style=\"margin: 0 0 10px;text-align: left;border-bottom: 1px solid #e5e5e5;color: gray;\">${I18n.jobinfo_conf_advanced}</p>    <#-- 高级配置 -->\n\n                    <div class=\"form-group\">\n                        <label for=\"firstname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_executorRouteStrategy}<font color=\"black\">*</font></label>\n                        <div class=\"col-sm-4\">\n                            <select class=\"form-control\" name=\"executorRouteStrategy\" >\n\t\t\t\t\t\t\t<#list ExecutorRouteStrategyEnum as item>\n                                <option value=\"${item}\" >${item.title}</option>\n\t\t\t\t\t\t\t</#list>\n                            </select>\n                        </div>\n\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_childJobId}<font color=\"black\">*</font></label>\n                        <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"childJobId\" placeholder=\"${I18n.jobinfo_field_childJobId_placeholder}\" maxlength=\"100\" ></div>\n                    </div>\n\n                    <div class=\"form-group\">\n                        <label for=\"firstname\" class=\"col-sm-2 control-label\">${I18n.misfire_strategy}<font color=\"black\">*</font></label>\n                        <div class=\"col-sm-4\">\n                            <select class=\"form-control\" name=\"misfireStrategy\" >\n                                <#list MisfireStrategyEnum as item>\n                                    <option value=\"${item}\" <#if 'DO_NOTHING' == item >selected</#if> >${item.title}</option>\n                                </#list>\n                            </select>\n                        </div>\n\n                        <label for=\"firstname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_executorBlockStrategy}<font color=\"black\">*</font></label>\n                        <div class=\"col-sm-4\">\n                            <select class=\"form-control\" name=\"executorBlockStrategy\" >\n\t\t\t\t\t\t\t\t<#list ExecutorBlockStrategyEnum as item>\n                                    <option value=\"${item}\" >${item.title}</option>\n                                </#list>\n                            </select>\n                        </div>\n                    </div>\n\n                    <div class=\"form-group\">\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_timeout}<font color=\"black\">*</font></label>\n                        <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"executorTimeout\" placeholder=\"${I18n.jobinfo_field_executorTimeout_placeholder}\" maxlength=\"6\" onkeyup=\"this.value=this.value.replace(/\\D/g,'')\" onafterpaste=\"this.value=this.value.replace(/\\D/g,'')\" ></div>\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_executorFailRetryCount}<font color=\"black\">*</font></label>\n                        <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"executorFailRetryCount\" placeholder=\"${I18n.jobinfo_field_executorFailRetryCount_placeholder}\" maxlength=\"4\" onkeyup=\"this.value=this.value.replace(/\\D/g,'')\" onafterpaste=\"this.value=this.value.replace(/\\D/g,'')\" ></div>\n                    </div>\n\n                    <hr>\n\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t<div class=\"col-sm-offset-3 col-sm-6\">\n\t\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-primary\"  >${I18n.system_save}</button>\n\t\t\t\t\t\t\t<button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">${I18n.system_cancel}</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n<input type=\"hidden\" name=\"glueRemark\" value=\"GLUE代码初始化\" >\n<textarea name=\"glueSource\" style=\"display:none;\" ></textarea>\n<textarea class=\"glueSource_java\" style=\"display:none;\" >\npackage com.xxl.job.service.handler;\n\nimport com.xxl.job.core.context.XxlJobHelper;\nimport com.xxl.job.core.handler.IJobHandler;\n\npublic class DemoGlueJobHandler extends IJobHandler {\n\n\t@Override\n\tpublic void execute() throws Exception {\n\t\tXxlJobHelper.log(\"XXL-JOB, Hello World.\");\n\t}\n\n}\n</textarea>\n<textarea class=\"glueSource_shell\" style=\"display:none;\" >\n#!/bin/bash\necho \"xxl-job: hello shell\"\n\necho \"${I18n.jobinfo_script_location}：$0\"\necho \"${I18n.jobinfo_field_executorparam}：$1\"\necho \"${I18n.jobinfo_shard_index} = $2\"\necho \"${I18n.jobinfo_shard_total} = $3\"\n<#--echo \"参数数量：$#\"\nfor param in $*\ndo\n    echo \"参数 : $param\"\n    sleep 1s\ndone-->\n\necho \"Good bye!\"\nexit 0\n</textarea>\n<textarea class=\"glueSource_python\" style=\"display:none;\" >\n#!/usr/bin/python\n# -*- coding: UTF-8 -*-\nimport time\nimport sys\n\nprint \"xxl-job: hello python\"\n\nprint \"${I18n.jobinfo_script_location}：\", sys.argv[0]\nprint \"${I18n.jobinfo_field_executorparam}：\", sys.argv[1]\nprint \"${I18n.jobinfo_shard_index}：\", sys.argv[2]\nprint \"${I18n.jobinfo_shard_total}：\", sys.argv[3]\n<#--for i in range(1, len(sys.argv)):\n\ttime.sleep(1)\n\tprint \"参数\", i, sys.argv[i]-->\n\nprint \"Good bye!\"\nexit(0)\n<#--\nimport logging\nlogging.basicConfig(level=logging.DEBUG)\nlogging.info(\"脚本文件：\" + sys.argv[0])\n-->\n</textarea>\n<#--这里有问题，新建一个运行模式为 php 的任务后，GLUE 中没有下边的 php 代码-->\n<textarea class=\"glueSource_php\" style=\"display:none;\" >\n<?php\n\n    echo \"xxl-job: hello php  \\n\";\n\n    echo \"${I18n.jobinfo_script_location}：$argv[0]  \\n\";\n    echo \"${I18n.jobinfo_field_executorparam}：$argv[1]  \\n\";\n    echo \"${I18n.jobinfo_shard_index} = $argv[2]  \\n\";\n    echo \"${I18n.jobinfo_shard_total} = $argv[3]  \\n\";\n\n    echo \"Good bye!  \\n\";\n    exit(0);\n\n?>\n</textarea>\n<textarea class=\"glueSource_nodejs\" style=\"display:none;\" >\n#!/usr/bin/env node\nconsole.log(\"xxl-job: hello nodejs\")\n\nvar arguments = process.argv\n\nconsole.log(\"${I18n.jobinfo_script_location}: \" + arguments[1])\nconsole.log(\"${I18n.jobinfo_field_executorparam}: \" + arguments[2])\nconsole.log(\"${I18n.jobinfo_shard_index}: \" + arguments[3])\nconsole.log(\"${I18n.jobinfo_shard_total}: \" + arguments[4])\n<#--for (var i = 2; i < arguments.length; i++){\n\tconsole.log(\"参数 %s = %s\", (i-1), arguments[i]);\n}-->\n\nconsole.log(\"Good bye!\")\nprocess.exit(0)\n</textarea>\n<textarea class=\"glueSource_powershell\" style=\"display:none;\" >\nWrite-Host \"xxl-job: hello powershell\"\n\nWrite-Host \"${I18n.jobinfo_script_location}: \" $MyInvocation.MyCommand.Definition\nWrite-Host \"${I18n.jobinfo_field_executorparam}: \"\n\tif ($args.Count -gt 2) { $args[0..($args.Count-3)] }\nWrite-Host \"${I18n.jobinfo_shard_index}: \" $args[$args.Count-2]\nWrite-Host \"${I18n.jobinfo_shard_total}: \" $args[$args.Count-1]\n\nWrite-Host \"Good bye!\"\nexit 0\n</textarea>\n\t\t\t\t</form>\n         \t</div>\n\t\t</div>\n\t</div>\n</div>\n\n<!-- 更新.模态框 -->\n<div class=\"modal fade\" id=\"updateModal\" tabindex=\"-1\" role=\"dialog\"  aria-hidden=\"true\">\n\t<div class=\"modal-dialog modal-lg\">\n\t\t<div class=\"modal-content\">\n\t\t\t<div class=\"modal-header\">\n            \t<h4 class=\"modal-title\" >${I18n.jobinfo_field_update}</h4>\n         \t</div>\n         \t<div class=\"modal-body\">\n\t\t\t\t<form class=\"form-horizontal form\" role=\"form\" >\n\n                    <p style=\"margin: 0 0 10px;text-align: left;border-bottom: 1px solid #e5e5e5;color: gray;\">${I18n.jobinfo_conf_base}</p>    <#-- 基础信息 -->\n                    <div class=\"form-group\">\n                        <label for=\"firstname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_jobgroup}<font color=\"red\">*</font></label>\n                        <div class=\"col-sm-4\">\n                            <select class=\"form-control\" name=\"jobGroup\" >\n                                <#list JobGroupList as group>\n                                    <option value=\"${group.id}\" >${group.title}</option>\n                                </#list>\n                            </select>\n                        </div>\n\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_jobdesc}<font color=\"red\">*</font></label>\n                        <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"jobDesc\" placeholder=\"${I18n.system_please_input}${I18n.jobinfo_field_jobdesc}\" maxlength=\"50\" ></div>\n                    </div>\n                    <div class=\"form-group\">\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_author}<font color=\"red\">*</font></label>\n                        <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"author\" placeholder=\"${I18n.system_please_input}${I18n.jobinfo_field_author}\" maxlength=\"50\" ></div>\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_alarmemail}<font color=\"black\">*</font></label>\n                        <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"alarmEmail\" placeholder=\"${I18n.jobinfo_field_alarmemail_placeholder}\" maxlength=\"100\" ></div>\n                    </div>\n\n                    <br>\n                    <p style=\"margin: 0 0 10px;text-align: left;border-bottom: 1px solid #e5e5e5;color: gray;\">${I18n.jobinfo_conf_schedule}</p>    <#-- 调度配置 -->\n                    <div class=\"form-group\">\n                        <label for=\"firstname\" class=\"col-sm-2 control-label\">${I18n.schedule_type}<font color=\"red\">*</font></label>\n                        <div class=\"col-sm-4\">\n                            <select class=\"form-control scheduleType\" name=\"scheduleType\" >\n                                <#list ScheduleTypeEnum as item>\n                                    <option value=\"${item}\" >${item.title}</option>\n                                </#list>\n                            </select>\n                        </div>\n\n                        <input type=\"hidden\" name=\"scheduleConf\" />\n                        <div class=\"schedule_conf schedule_conf_NONE\" style=\"display: none\" >\n                        </div>\n                        <div class=\"schedule_conf schedule_conf_CRON\" >\n                            <label for=\"lastname\" class=\"col-sm-2 control-label\">Cron<font color=\"red\">*</font></label>\n                            <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"schedule_conf_CRON\" placeholder=\"${I18n.system_please_input}Cron\" maxlength=\"128\" ></div>\n                        </div>\n                        <div class=\"schedule_conf schedule_conf_FIX_RATE\" style=\"display: none\" >\n                            <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.schedule_type_fix_rate}<font color=\"red\">*</font></label>\n                            <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"schedule_conf_FIX_RATE\" placeholder=\"${I18n.system_please_input} （ Second ）\" maxlength=\"10\" onkeyup=\"this.value=this.value.replace(/\\D/g,'')\" onafterpaste=\"this.value=this.value.replace(/\\D/g,'')\" ></div>\n                        </div>\n                        <div class=\"schedule_conf schedule_conf_FIX_DELAY\" style=\"display: none\" >\n                            <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.schedule_type_fix_delay}<font color=\"red\">*</font></label>\n                            <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"schedule_conf_FIX_DELAY\" placeholder=\"${I18n.system_please_input} （ Second ）\" maxlength=\"10\" onkeyup=\"this.value=this.value.replace(/\\D/g,'')\" onafterpaste=\"this.value=this.value.replace(/\\D/g,'')\" ></div>\n                        </div>\n                    </div>\n\n                    <br>\n                    <p style=\"margin: 0 0 10px;text-align: left;border-bottom: 1px solid #e5e5e5;color: gray;\">${I18n.jobinfo_conf_job}</p>    <#-- 任务配置 -->\n\n                    <div class=\"form-group\">\n                        <label for=\"firstname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_gluetype}<font color=\"red\">*</font></label>\n                        <div class=\"col-sm-4\">\n                            <select class=\"form-control glueType\" name=\"glueType\" disabled >\n                                <#list GlueTypeEnum as item>\n                                    <option value=\"${item}\" >${item.desc}</option>\n                                </#list>\n                            </select>\n                        </div>\n                        <label for=\"firstname\" class=\"col-sm-2 control-label\">JobHandler<font color=\"red\">*</font></label>\n                        <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"executorHandler\" placeholder=\"${I18n.system_please_input}JobHandler\" maxlength=\"100\" ></div>\n                    </div>\n\n                    <div class=\"form-group\">\n                        <label for=\"firstname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_executorparam}<font color=\"black\">*</font></label>\n                        <div class=\"col-sm-10\">\n                            <textarea class=\"textarea form-control\" name=\"executorParam\" placeholder=\"${I18n.system_please_input}${I18n.jobinfo_field_executorparam}\" maxlength=\"512\" style=\"height: 63px; line-height: 1.2;\"></textarea>\n                        </div>\n                    </div>\n\n                    <br>\n                    <p style=\"margin: 0 0 10px;text-align: left;border-bottom: 1px solid #e5e5e5;color: gray;\">${I18n.jobinfo_conf_advanced}</p>    <#-- 高级配置 -->\n\n                    <div class=\"form-group\">\n                        <label for=\"firstname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_executorRouteStrategy}<font color=\"red\">*</font></label>\n                        <div class=\"col-sm-4\">\n                            <select class=\"form-control\" name=\"executorRouteStrategy\" >\n                                <#list ExecutorRouteStrategyEnum as item>\n                                    <option value=\"${item}\" >${item.title}</option>\n                                </#list>\n                            </select>\n                        </div>\n\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_childJobId}<font color=\"black\">*</font></label>\n                        <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"childJobId\" placeholder=\"${I18n.jobinfo_field_childJobId_placeholder}\" maxlength=\"100\" ></div>\n                    </div>\n\n                    <div class=\"form-group\">\n                        <label for=\"firstname\" class=\"col-sm-2 control-label\">${I18n.misfire_strategy}<font color=\"black\">*</font></label>\n                        <div class=\"col-sm-4\">\n                            <select class=\"form-control\" name=\"misfireStrategy\" >\n                                <#list MisfireStrategyEnum as item>\n                                    <option value=\"${item}\" <#if 'DO_NOTHING' == item >selected</#if> >${item.title}</option>\n                                </#list>\n                            </select>\n                        </div>\n\n                        <label for=\"firstname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_executorBlockStrategy}<font color=\"red\">*</font></label>\n                        <div class=\"col-sm-4\">\n                            <select class=\"form-control\" name=\"executorBlockStrategy\" >\n                                <#list ExecutorBlockStrategyEnum as item>\n                                    <option value=\"${item}\" >${item.title}</option>\n                                </#list>\n                            </select>\n                        </div>\n                    </div>\n\n                    <div class=\"form-group\">\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_timeout}<font color=\"black\">*</font></label>\n                        <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"executorTimeout\" placeholder=\"${I18n.jobinfo_field_executorTimeout_placeholder}\" maxlength=\"6\" onkeyup=\"this.value=this.value.replace(/\\D/g,'')\" onafterpaste=\"this.value=this.value.replace(/\\D/g,'')\" ></div>\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_executorFailRetryCount}<font color=\"black\">*</font></label>\n                        <div class=\"col-sm-4\"><input type=\"text\" class=\"form-control\" name=\"executorFailRetryCount\" placeholder=\"${I18n.jobinfo_field_executorFailRetryCount_placeholder}\" maxlength=\"4\" onkeyup=\"this.value=this.value.replace(/\\D/g,'')\" onafterpaste=\"this.value=this.value.replace(/\\D/g,'')\" ></div>\n                    </div>\n\n\t\t\t\t\t<hr>\n\t\t\t\t\t<div class=\"form-group\">\n                        <div class=\"col-sm-offset-3 col-sm-6\">\n\t\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-primary\"  >${I18n.system_save}</button>\n\t\t\t\t\t\t\t<button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">${I18n.system_cancel}</button>\n                            <input type=\"hidden\" name=\"id\" >\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t</form>\n         \t</div>\n\t\t</div>\n\t</div>\n</div>\n\n<#-- trigger -->\n<div class=\"modal fade\" id=\"jobTriggerModal\" tabindex=\"-1\" role=\"dialog\"  aria-hidden=\"true\">\n    <div class=\"modal-dialog \">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <h4 class=\"modal-title\" >${I18n.jobinfo_opt_run}</h4>\n            </div>\n            <div class=\"modal-body\">\n                <form class=\"form-horizontal form\" role=\"form\" >\n                    <div class=\"form-group\">\n                        <label for=\"firstname\" class=\"col-sm-2 control-label\">${I18n.jobinfo_field_executorparam}<font color=\"black\">*</font></label>\n                        <div class=\"col-sm-10\">\n                            <textarea class=\"textarea form-control\" name=\"executorParam\" placeholder=\"${I18n.system_please_input}${I18n.jobinfo_field_executorparam}\" maxlength=\"512\" style=\"height: 63px; line-height: 1.2;\"></textarea>\n                        </div>\n                    </div>\n                    <div class=\"form-group\">\n                        <label for=\"firstname\" class=\"col-sm-2 control-label\">${I18n.jobgroup_field_registryList}<font color=\"black\">*</font></label>\n                        <div class=\"col-sm-10\">\n                            <textarea class=\"textarea form-control\" name=\"addressList\" placeholder=\"${I18n.jobinfo_opt_run_tips}\" maxlength=\"512\" style=\"height: 63px; line-height: 1.2;\"></textarea>\n                        </div>\n                    </div>\n                    <hr>\n                    <div class=\"form-group\">\n                        <div class=\"col-sm-offset-3 col-sm-6\">\n                            <button type=\"button\" class=\"btn btn-primary ok\" >${I18n.system_save}</button>\n                            <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">${I18n.system_cancel}</button>\n                            <input type=\"hidden\" name=\"id\" >\n                        </div>\n                    </div>\n                </form>\n            </div>\n        </div>\n    </div>\n</div>\n\n<@netCommon.commonScript />\n<!-- DataTables -->\n<script src=\"${request.contextPath}/static/adminlte/bower_components/datatables.net/js/jquery.dataTables.min.js\"></script>\n<script src=\"${request.contextPath}/static/adminlte/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js\"></script>\n<!-- moment -->\n<script src=\"${request.contextPath}/static/adminlte/bower_components/moment/moment.min.js\"></script>\n<#-- cronGen -->\n<script src=\"${request.contextPath}/static/plugins/cronGen/cronGen<#if I18n.admin_i18n?default('')?length gt 0 >_${I18n.admin_i18n}</#if>.js\"></script>\n<script src=\"${request.contextPath}/static/js/jobinfo.index.1.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/templates/joblog/joblog.detail.ftl",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <#import \"../common/common.macro.ftl\" as netCommon>\n    <@netCommon.commonStyle />\n    <title>${I18n.admin_name}</title>\n</head>\n<body class=\"hold-transition skin-blue layout-top-nav\">\n\n<div class=\"wrapper\">\n\n    <header class=\"main-header\">\n        <nav class=\"navbar navbar-static-top\">\n            <div class=\"container\">\n                <#-- icon -->\n                <div class=\"navbar-header\">\n                    <a class=\"navbar-brand\"><b>${I18n.joblog_rolling_log}</b> Console</a>\n                    <button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#navbar-collapse\">\n                        <i class=\"fa fa-bars\"></i>\n                    </button>\n                </div>\n\n                <#-- left nav -->\n                <div class=\"collapse navbar-collapse pull-left\" id=\"navbar-collapse\">\n                    <ul class=\"nav navbar-nav\">\n                        <#--<li class=\"active\" ><a href=\"javascript:;\">任务：<span class=\"sr-only\">(current)</span></a></li>-->\n                    </ul>\n                </div>\n\n                <#-- right nav -->\n                <div class=\"navbar-custom-menu\">\n                    <ul class=\"nav navbar-nav\">\n                        <li>\n                            <a href=\"javascript:window.location.reload();\" >\n                                <i class=\"fa fa-fw fa-refresh\" ></i>\n                                ${I18n.joblog_rolling_log_refresh}\n                            </a>\n                        </li>\n                    </ul>\n                </div>\n\n            </div>\n        </nav>\n    </header>\n\n    <div class=\"content-wrapper\" >\n        <section class=\"content\">\n            <pre style=\"font-size:12px;position:relative;\" >\n                <div id=\"logConsole\"></div>\n                <li class=\"fa fa-refresh fa-spin\" style=\"font-size: 20px;float: left;\" id=\"logConsoleRunning\" ></li>\n            </pre>\n        </section>\n    </div>\n\n    <!-- footer -->\n    <@netCommon.commonFooter />\n\n</div>\n\n<@netCommon.commonScript />\n<script>\n    // 参数\n    var triggerCode = '${triggerCode}';\n    var handleCode = '${handleCode}';\n    var logId = '${logId}';\n</script>\n<script src=\"${request.contextPath}/static/js/joblog.detail.1.js\"></script>\n\n</body>\n</html>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/templates/joblog/joblog.index.ftl",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  \t<#import \"../common/common.macro.ftl\" as netCommon>\n\t<@netCommon.commonStyle />\n\t<!-- DataTables -->\n  \t<link rel=\"stylesheet\" href=\"${request.contextPath}/static/adminlte/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css\">\n  \t<!-- daterangepicker -->\n  \t<link rel=\"stylesheet\" href=\"${request.contextPath}/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.css\">\n    <title>${I18n.admin_name}</title>\n</head>\n<body class=\"hold-transition skin-blue sidebar-mini <#if cookieMap?exists && cookieMap[\"xxljob_adminlte_settings\"]?exists && \"off\" == cookieMap[\"xxljob_adminlte_settings\"].value >sidebar-collapse</#if> \">\n<div class=\"wrapper\">\n\t<!-- header -->\n\t<@netCommon.commonHeader />\n\t<!-- left -->\n\t<@netCommon.commonLeft \"joblog\" />\n\t\n\t<!-- Content Wrapper. Contains page content -->\n\t<div class=\"content-wrapper\">\n\t\t<!-- Content Header (Page header) -->\n\t\t<section class=\"content-header\">\n\t\t\t<h1>${I18n.joblog_name}</h1>\n\t\t</section>\n\t\t\n\t\t<!-- Main content -->\n\t    <section class=\"content\">\n\t    \t<div class=\"row\">\n\t    \t\t<div class=\"col-xs-2\">\n \t\t\t\t\t<div class=\"input-group\">\n\t                \t<span class=\"input-group-addon\">${I18n.jobinfo_field_jobgroup}</span>\n                \t\t<select class=\"form-control\" id=\"jobGroup\"  paramVal=\"<#if jobInfo?exists>${jobInfo.jobGroup}</#if>\" >\n                            <#if XXL_JOB_LOGIN_IDENTITY.role == 1>\n                                <option value=\"0\" >${I18n.system_all}</option>  <#-- 仅管理员支持查询全部；普通用户仅支持查询有权限的 jobGroup -->\n                            </#if>\n                \t\t\t<#list JobGroupList as group>\n                \t\t\t\t<option value=\"${group.id}\" >${group.title}</option>\n                \t\t\t</#list>\n\t                  \t</select>\n\t              \t</div>\n\t            </div>\n\t            <div class=\"col-xs-2\">\n\t              \t<div class=\"input-group\">\n\t                \t<span class=\"input-group-addon\">${I18n.jobinfo_job}</span>\n                        <select class=\"form-control\" id=\"jobId\" paramVal=\"<#if jobInfo?exists>${jobInfo.id}</#if>\" >\n                            <option value=\"0\" >${I18n.system_all}</option>\n\t\t\t\t\t\t</select>\n\t              \t</div>\n\t            </div>\n\n                <div class=\"col-xs-2\">\n                    <div class=\"input-group\">\n                        <span class=\"input-group-addon\">${I18n.joblog_status}</span>\n                        <select class=\"form-control\" id=\"logStatus\" >\n                            <option value=\"-1\" >${I18n.joblog_status_all}</option>\n                            <option value=\"1\" >${I18n.joblog_status_suc}</option>\n                            <option value=\"2\" >${I18n.joblog_status_fail}</option>\n                            <option value=\"3\" >${I18n.joblog_status_running}</option>\n                        </select>\n                    </div>\n                </div>\n\n\t            <div class=\"col-xs-4\">\n              \t\t<div class=\"input-group\">\n                \t\t<span class=\"input-group-addon\">\n\t                  \t\t${I18n.joblog_field_triggerTime}\n\t                \t</span>\n\t                \t<input type=\"text\" class=\"form-control\" id=\"filterTime\" readonly >\n\t              \t</div>\n\t            </div>\n\n                <div class=\"col-xs-1\">\n                    <button class=\"btn btn-block btn-info\" id=\"searchBtn\">${I18n.system_search}</button>\n                </div>\n\n\t            <div class=\"col-xs-1\">\n                    <button class=\"btn btn-block btn-default\" id=\"clearLog\">${I18n.joblog_clean}</button>\n\t            </div>\n          \t</div>\n\t\t\t\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"col-xs-12\">\n\t\t\t\t\t<div class=\"box\">\n\t\t\t            <#--<div class=\"box-header hide\"><h3 class=\"box-title\">调度日志</h3></div>-->\n\t\t\t            <div class=\"box-body\">\n\t\t\t              \t<table id=\"joblog_list\" class=\"table table-bordered table-striped display\" width=\"100%\" >\n\t\t\t\t                <thead>\n\t\t\t\t\t            \t<tr>\n                                        <th name=\"jobId\" >${I18n.jobinfo_field_id}</th>\n                                        <th name=\"jobGroup\" >jobGroup</th>\n\t\t\t\t\t\t\t\t\t\t<#--<th name=\"executorAddress\" >执行器地址</th>\n\t\t\t\t\t\t\t\t\t\t<th name=\"glueType\" >运行模式</th>\n                                      \t<th name=\"executorParam\" >任务参数</th>-->\n                                        <th name=\"triggerTime\" >${I18n.joblog_field_triggerTime}</th>\n                                        <th name=\"triggerCode\" >${I18n.joblog_field_triggerCode}</th>\n                                        <th name=\"triggerMsg\" >${I18n.joblog_field_triggerMsg}</th>\n\t\t\t\t\t                  \t<th name=\"handleTime\" >${I18n.joblog_field_handleTime}</th>\n\t\t\t\t\t                  \t<th name=\"handleCode\" >${I18n.joblog_field_handleCode}</th>\n\t\t\t\t\t                  \t<th name=\"handleMsg\" >${I18n.joblog_field_handleMsg}</th>\n\t\t\t\t\t                  \t<th name=\"handleMsg\" >${I18n.system_opt}</th>\n\t\t\t\t\t                </tr>\n\t\t\t\t                </thead>\n\t\t\t\t                <tbody></tbody>\n\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t    </section>\n\t</div>\n\t\n\t<!-- footer -->\n\t<@netCommon.commonFooter />\n</div>\n\n<!-- 日志清理.模态框 -->\n<div class=\"modal fade\" id=\"clearLogModal\" tabindex=\"-1\" role=\"dialog\"  aria-hidden=\"true\">\n    <div class=\"modal-dialog\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <h4 class=\"modal-title\" >${I18n.joblog_clean_log}</h4>\n            </div>\n            <div class=\"modal-body\">\n                <form class=\"form-horizontal form\" role=\"form\" >\n                    <div class=\"form-group\">\n                        <label class=\"col-sm-3 control-label\">${I18n.jobinfo_field_jobgroup}：</label>\n                        <div class=\"col-sm-9\">\n                            <input type=\"text\" class=\"form-control jobGroupText\" readonly >\n\t\t\t\t\t\t\t<input type=\"hidden\" name=\"jobGroup\" >\n\t\t\t\t\t\t</div>\n                    </div>\n\n                    <div class=\"form-group\">\n                        <label class=\"col-sm-3 control-label\">${I18n.jobinfo_job}：</label>\n                        <div class=\"col-sm-9\">\n                            <input type=\"text\" class=\"form-control jobIdText\" readonly >\n                            <input type=\"hidden\" name=\"jobId\" >\n\t\t\t\t\t\t</div>\n                    </div>\n\n                    <div class=\"form-group\">\n                        <label class=\"col-sm-3 control-label\">${I18n.joblog_clean_type}：</label>\n                        <div class=\"col-sm-9\">\n                            <select class=\"form-control\" name=\"type\" >\n                                <option value=\"1\" >${I18n.joblog_clean_type_1}</option>\n                                <option value=\"2\" >${I18n.joblog_clean_type_2}</option>\n                                <option value=\"3\" >${I18n.joblog_clean_type_3}</option>\n                                <option value=\"4\" >${I18n.joblog_clean_type_4}</option>\n                                <option value=\"5\" >${I18n.joblog_clean_type_5}</option>\n                                <option value=\"6\" >${I18n.joblog_clean_type_6}</option>\n                                <option value=\"7\" >${I18n.joblog_clean_type_7}</option>\n                                <option value=\"8\" >${I18n.joblog_clean_type_8}</option>\n                                <option value=\"9\" >${I18n.joblog_clean_type_9}</option>\n                            </select>\n                        </div>\n                    </div>\n\n                    <hr>\n                    <div class=\"form-group\">\n                        <div class=\"col-sm-offset-3 col-sm-6\">\n                            <button type=\"button\" class=\"btn btn-primary ok\" >${I18n.system_ok}</button>\n                            <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">${I18n.system_cancel}</button>\n                        </div>\n                    </div>\n                </form>\n            </div>\n        </div>\n    </div>\n</div>\n\n<@netCommon.commonScript />\n<!-- DataTables -->\n<script src=\"${request.contextPath}/static/adminlte/bower_components/datatables.net/js/jquery.dataTables.min.js\"></script>\n<script src=\"${request.contextPath}/static/adminlte/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js\"></script>\n<!-- daterangepicker -->\n<script src=\"${request.contextPath}/static/adminlte/bower_components/moment/moment.min.js\"></script>\n<script src=\"${request.contextPath}/static/adminlte/bower_components/bootstrap-daterangepicker/daterangepicker.js\"></script>\n<script src=\"${request.contextPath}/static/js/joblog.index.1.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/templates/login.ftl",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  \t<#import \"./common/common.macro.ftl\" as netCommon>\n\t<@netCommon.commonStyle />\n    <link rel=\"stylesheet\" href=\"${request.contextPath}/static/adminlte/plugins/iCheck/square/blue.css\">\n\t<title>${I18n.admin_name}</title>\n</head>\n<body class=\"hold-transition login-page\">\n\t<div class=\"login-box\">\n\t\t<div class=\"login-logo\">\n\t\t\t<a><b>XXL</b>JOB</a>\n\t\t</div>\n\t\t<form id=\"loginForm\" method=\"post\" >\n\t\t\t<div class=\"login-box-body\">\n\t\t\t\t<p class=\"login-box-msg\">${I18n.admin_name}</p>\n\t\t\t\t<div class=\"form-group has-feedback\">\n\t            \t<input type=\"text\" name=\"userName\" class=\"form-control\" placeholder=\"${I18n.login_username_placeholder}\"  maxlength=\"18\" >\n\t            \t<span class=\"glyphicon glyphicon-envelope form-control-feedback\"></span>\n\t\t\t\t</div>\n\t          \t<div class=\"form-group has-feedback\">\n\t            \t<input type=\"password\" name=\"password\" class=\"form-control\" placeholder=\"${I18n.login_password_placeholder}\"  maxlength=\"18\" >\n\t            \t<span class=\"glyphicon glyphicon-lock form-control-feedback\"></span>\n\t          \t</div>\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<div class=\"col-xs-8\">\n\t\t              \t<div class=\"checkbox icheck\">\n\t\t                \t<label>\n\t\t                  \t\t<input type=\"checkbox\" name=\"ifRemember\" > &nbsp; ${I18n.login_remember_me}\n\t\t                \t</label>\n\t\t\t\t\t\t</div>\n\t\t            </div><!-- /.col -->\n\t\t            <div class=\"col-xs-4\">\n\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-primary btn-block btn-flat\">${I18n.login_btn}</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</form>\n\t</div>\n<@netCommon.commonScript />\n<script src=\"${request.contextPath}/static/adminlte/plugins/iCheck/icheck.min.js\"></script>\n<script src=\"${request.contextPath}/static/js/login.1.js\"></script>\n\n</body>\n</html>\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/resources/templates/user/user.index.ftl",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  \t<#import \"../common/common.macro.ftl\" as netCommon>\n\t<@netCommon.commonStyle />\n\t<!-- DataTables -->\n  \t<link rel=\"stylesheet\" href=\"${request.contextPath}/static/adminlte/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css\">\n    <title>${I18n.admin_name}</title>\n</head>\n<body class=\"hold-transition skin-blue sidebar-mini <#if cookieMap?exists && cookieMap[\"xxljob_adminlte_settings\"]?exists && \"off\" == cookieMap[\"xxljob_adminlte_settings\"].value >sidebar-collapse</#if>\">\n<div class=\"wrapper\">\n\t<!-- header -->\n\t<@netCommon.commonHeader />\n\t<!-- left -->\n\t<@netCommon.commonLeft \"user\" />\n\t\n\t<!-- Content Wrapper. Contains page content -->\n\t<div class=\"content-wrapper\">\n\t\t<!-- Content Header (Page header) -->\n\t\t<section class=\"content-header\">\n\t\t\t<h1>${I18n.user_manage}</h1>\n\t\t</section>\n\t\t\n\t\t<!-- Main content -->\n\t    <section class=\"content\">\n\t    \n\t    \t<div class=\"row\">\n                <div class=\"col-xs-3\">\n                    <div class=\"input-group\">\n                        <span class=\"input-group-addon\">${I18n.user_role}</span>\n                        <select class=\"form-control\" id=\"role\" >\n                            <option value=\"-1\" >${I18n.system_all}</option>\n                            <option value=\"1\" >${I18n.user_role_admin}</option>\n                            <option value=\"0\" >${I18n.user_role_normal}</option>\n                        </select>\n                    </div>\n                </div>\n                <div class=\"col-xs-3\">\n                    <div class=\"input-group\">\n                        <span class=\"input-group-addon\">${I18n.user_username}</span>\n                        <input type=\"text\" class=\"form-control\" id=\"username\" autocomplete=\"on\" >\n                    </div>\n                </div>\n\t            <div class=\"col-xs-1\">\n\t            \t<button class=\"btn btn-block btn-info\" id=\"searchBtn\">${I18n.system_search}</button>\n\t            </div>\n\t            <div class=\"col-xs-2\">\n\t            \t<button class=\"btn btn-block btn-success add\" type=\"button\">${I18n.user_add}</button>\n\t            </div>\n          \t</div>\n\t    \t\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"col-xs-12\">\n\t\t\t\t\t<div class=\"box\">\n\t\t\t            <div class=\"box-body\" >\n\t\t\t              \t<table id=\"user_list\" class=\"table table-bordered table-striped\" width=\"100%\" >\n\t\t\t\t                <thead>\n\t\t\t\t\t            \t<tr>\n                                        <th name=\"id\" >ID</th>\n                                        <th name=\"username\" >${I18n.user_username}</th>\n\t\t\t\t\t                  \t<th name=\"password\" >${I18n.user_password}</th>\n                                        <th name=\"role\" >${I18n.user_role}</th>\n\t\t\t\t\t                  \t<th name=\"permission\" >${I18n.user_permission}</th>\n\t\t\t\t\t                  \t<th>${I18n.system_opt}</th>\n\t\t\t\t\t                </tr>\n\t\t\t\t                </thead>\n\t\t\t\t                <tbody></tbody>\n\t\t\t\t                <tfoot></tfoot>\n\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t    </section>\n\t</div>\n\t\n\t<!-- footer -->\n\t<@netCommon.commonFooter />\n</div>\n\n<!-- 新增.模态框 -->\n<div class=\"modal fade\" id=\"addModal\" tabindex=\"-1\" role=\"dialog\"  aria-hidden=\"true\">\n\t<div class=\"modal-dialog\">\n\t\t<div class=\"modal-content\">\n\t\t\t<div class=\"modal-header\">\n            \t<h4 class=\"modal-title\" >${I18n.user_add}</h4>\n         \t</div>\n         \t<div class=\"modal-body\">\n\t\t\t\t<form class=\"form-horizontal form\" role=\"form\" >\n                    <div class=\"form-group\">\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.user_username}<font color=\"red\">*</font></label>\n                        <div class=\"col-sm-8\"><input type=\"text\" class=\"form-control\" name=\"username\" placeholder=\"${I18n.system_please_input}${I18n.user_username}\" maxlength=\"20\" ></div>\n                    </div>\n                    <div class=\"form-group\">\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.user_password}<font color=\"red\">*</font></label>\n                        <div class=\"col-sm-8\"><input type=\"text\" class=\"form-control\" name=\"password\" placeholder=\"${I18n.system_please_input}${I18n.user_password}\" maxlength=\"20\" ></div>\n                    </div>\n                    <div class=\"form-group\">\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.user_role}<font color=\"red\">*</font></label>\n                        <div class=\"col-sm-10\">\n                            <input type=\"radio\" name=\"role\" value=\"0\" checked />${I18n.user_role_normal}\n                            &nbsp;&nbsp;&nbsp;&nbsp;\n                            <input type=\"radio\" name=\"role\" value=\"1\" />${I18n.user_role_admin}\n                        </div>\n                    </div>\n                    <div class=\"form-group\">\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.user_permission}<font color=\"black\">*</font></label>\n                        <div class=\"col-sm-10\">\n\t\t\t\t\t\t\t<#if groupList?exists && groupList?size gt 0>\n\t\t\t\t\t\t\t\t<#list groupList as item>\n                                    <input type=\"checkbox\" name=\"permission\" value=\"${item.id}\" />${item.title}(${item.appname})<br>\n\t\t\t\t\t\t\t\t</#list>\n\t\t\t\t\t\t\t</#if>\n                        </div>\n                    </div>\n\n                    <hr>\n\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t<div class=\"col-sm-offset-3 col-sm-6\">\n\t\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-primary\"  >${I18n.system_save}</button>\n\t\t\t\t\t\t\t<button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">${I18n.system_cancel}</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t</form>\n         \t</div>\n\t\t</div>\n\t</div>\n</div>\n\n<!-- 更新.模态框 -->\n<div class=\"modal fade\" id=\"updateModal\" tabindex=\"-1\" role=\"dialog\"  aria-hidden=\"true\">\n\t<div class=\"modal-dialog\">\n\t\t<div class=\"modal-content\">\n\t\t\t<div class=\"modal-header\">\n            \t<h4 class=\"modal-title\" >${I18n.user_update}</h4>\n         \t</div>\n         \t<div class=\"modal-body\">\n\t\t\t\t<form class=\"form-horizontal form\" role=\"form\" >\n                    <div class=\"form-group\">\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.user_username}<font color=\"red\">*</font></label>\n                        <div class=\"col-sm-8\"><input type=\"text\" class=\"form-control\" name=\"username\" placeholder=\"${I18n.system_please_input}${I18n.user_username}\" maxlength=\"20\" readonly ></div>\n                    </div>\n                    <div class=\"form-group\">\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.user_password}<font color=\"red\">*</font></label>\n                        <div class=\"col-sm-8\"><input type=\"text\" class=\"form-control\" name=\"password\" placeholder=\"${I18n.user_password_update_placeholder}\" maxlength=\"20\" ></div>\n                    </div>\n                    <div class=\"form-group\">\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.user_role}<font color=\"red\">*</font></label>\n                        <div class=\"col-sm-10\">\n                            <input type=\"radio\" name=\"role\" value=\"0\" />${I18n.user_role_normal}\n                            &nbsp;&nbsp;&nbsp;&nbsp;\n                            <input type=\"radio\" name=\"role\" value=\"1\" />${I18n.user_role_admin}\n                        </div>\n                    </div>\n                    <div class=\"form-group\">\n                        <label for=\"lastname\" class=\"col-sm-2 control-label\">${I18n.user_permission}<font color=\"black\">*</font></label>\n                        <div class=\"col-sm-10\">\n\t\t\t\t\t\t<#if groupList?exists && groupList?size gt 0>\n\t\t\t\t\t\t\t<#list groupList as item>\n                                <input type=\"checkbox\" name=\"permission\" value=\"${item.id}\" />${item.title}(${item.appname})<br>\n\t\t\t\t\t\t\t</#list>\n\t\t\t\t\t\t</#if>\n                        </div>\n                    </div>\n\n\t\t\t\t\t<hr>\n\t\t\t\t\t<div class=\"form-group\">\n                        <div class=\"col-sm-offset-3 col-sm-6\">\n\t\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-primary\"  >${I18n.system_save}</button>\n\t\t\t\t\t\t\t<button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">${I18n.system_cancel}</button>\n                            <input type=\"hidden\" name=\"id\" >\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t</form>\n         \t</div>\n\t\t</div>\n\t</div>\n</div>\n\n<@netCommon.commonScript />\n<!-- DataTables -->\n<script src=\"${request.contextPath}/static/adminlte/bower_components/datatables.net/js/jquery.dataTables.min.js\"></script>\n<script src=\"${request.contextPath}/static/adminlte/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js\"></script>\n<script src=\"${request.contextPath}/static/js/user.index.1.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/jeecg-visual/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-server-cloud</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>jeecg-visual</artifactId>\n    <packaging>pom</packaging>\n    \n    <modules>\n        <!-- 微服务所需要的中间件 -->\n        <module>jeecg-cloud-sentinel</module>\n        <module>jeecg-cloud-monitor</module>\n        <module>jeecg-cloud-xxljob</module>\n        <!-- 微服务测试示例-->\n        <module>jeecg-cloud-test</module>\n    </modules>\n\n\n</project>"
  },
  {
    "path": "jeecg-boot/jeecg-server-cloud/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>jeecg-boot-parent</artifactId>\n        <groupId>org.jeecgframework.boot3</groupId>\n        <version>3.9.1</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>jeecg-server-cloud</artifactId>\n    <packaging>pom</packaging>\n    <name>JEECG SERVER CLOUD</name>\n    \n    <modules>\n        <module>jeecg-cloud-gateway</module>\n        <module>jeecg-cloud-nacos</module>\n        <module>jeecg-system-cloud-start</module>\n        <module>jeecg-demo-cloud-start</module>\n        \n        <!-- 监控和测试例子 -->\n        <module>jeecg-visual</module>\n    </modules>\n\n</project>"
  },
  {
    "path": "jeecg-boot/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>org.jeecgframework.boot3</groupId>\n  <artifactId>jeecg-boot-parent</artifactId>\n  <version>3.9.1</version>\n  <packaging>pom</packaging>\n  <name>JEECG BOOT ${project.version}</name>\n\n\t<developers>\n\t\t<developer>\n\t\t\t<name>北京国炬信息技术有限公司</name>\n\t\t\t<email>jeecgos@163.com</email>\n\t\t\t<url>http://www.guojusoft.com</url>\n\t\t</developer>\n\t</developers>\n\n\t<scm>\n\t\t<connection>http://www.jeecg.com</connection>\n\t\t<developerConnection>http://guojusoft.com</developerConnection>\n\t\t<url>http://www.jeecg.com/vip</url>\n\t</scm>\n\t\n  \t<parent>\n\t    <groupId>org.springframework.boot</groupId>\n\t    <artifactId>spring-boot-starter-parent</artifactId>\n\t    <version>3.5.5</version>\n\t    <relativePath/>\n\t</parent>\n\n\t<properties>\n\t\t<jeecgboot.version>3.9.1</jeecgboot.version>\n\t\t<!-- JDK版本支持17、21、24 -->\n\t\t<java.version>17</java.version>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\n\t\t<!-- 微服务 -->\n\t\t<spring-cloud.version>2025.0.0</spring-cloud.version>\n        <spring-cloud-alibaba.version>2023.0.3.3</spring-cloud-alibaba.version>\n\t\t<alibaba.nacos.version>2.0.4</alibaba.nacos.version>\n\n\t\t<xxl-job-core.version>2.4.1</xxl-job-core.version>\n        <fastjson.version>2.0.57</fastjson.version>\n        <aviator.version>5.2.6</aviator.version>\n\t\t<pegdown.version>1.6.0</pegdown.version>\n\t\t<commonmark.version>0.17.0</commonmark.version>\n\t\t<knife4j-spring-boot-starter.version>4.5.0</knife4j-spring-boot-starter.version>\n\t\t<!-- 数据库驱动 -->\n\t\t<postgresql.version>42.2.25</postgresql.version>\n\t\t<ojdbc6.version>11.2.0.3</ojdbc6.version>\n\t\t<sqljdbc4.version>12.6.1.jre8</sqljdbc4.version>\n\t\t<mysql-connector-java.version>8.0.27</mysql-connector-java.version>\n        <hutool.version>5.8.25</hutool.version>\n\t\t<!-- 国产数据库驱动 -->\n\t\t<kingbase8.version>9.0.0</kingbase8.version>\n\t\t<dm8.version>8.1.3.140</dm8.version>\n\n\t\t<!-- 积木报表-->\n\t\t<jimureport-spring-boot-starter.version>2.3.0</jimureport-spring-boot-starter.version>\n\t\t<jimubi-spring-boot-starter.version>2.3.0</jimubi-spring-boot-starter.version>\n\t\t<minidao.version>1.10.18</minidao.version>\n\t\t<autopoi-web.version>2.0.4</autopoi-web.version>\n\t\t\n\t\t<!-- 持久层 -->\n\t\t<mybatis-plus.version>3.5.12</mybatis-plus.version>\n\t\t<dynamic-datasource-spring-boot-starter.version>4.3.1</dynamic-datasource-spring-boot-starter.version>\n\t\t<druid.version>1.2.24</druid.version>\n\n\t\t<commons-io.version>2.20.0</commons-io.version>\n\t\t<commons-fileupload.version>1.5</commons-fileupload.version>\n\t\t<commons.version>2.6</commons.version>\n\t\t<aliyun-java-sdk-dysmsapi.version>2.1.0</aliyun-java-sdk-dysmsapi.version>\n\t\t<aliyun.oss.version>3.17.3</aliyun.oss.version>\n        <tencentcloud-sdk-java-sms.version>3.1.407</tencentcloud-sdk-java-sms.version>\n\t\t<!-- shiro -->\n\t\t<shiro.version>2.0.5</shiro.version>\n\t\t<shiro-redis.version>3.2.3</shiro-redis.version>\n\t\t<java-jwt.version>4.5.0</java-jwt.version>\n\t\t<codegenerate.version>1.5.5</codegenerate.version>\n\t\t<minio.version>8.5.7</minio.version>\n\t\t<justauth-spring-boot-starter.version>1.4.0</justauth-spring-boot-starter.version>\n\t\t<dom4j.version>1.6.1</dom4j.version>\n\t\t<qiniu-java-sdk.version>7.4.0</qiniu-java-sdk.version>\n\t\t<jedis.version>3.8.0</jedis.version>\n\t\t<baidu-java-sdk.version>4.16.19</baidu-java-sdk.version>\n\t</properties>\n\n\t<modules>\n        <module>jeecg-boot-base-core</module>\n        <module>jeecg-module-system</module>\n\t\t<module>jeecg-boot-module</module>\n    </modules>\n\n\t<repositories>\n\t\t<repository>\n            <id>aliyun</id>\n            <name>aliyun Repository</name>\n            <url>https://maven.aliyun.com/repository/public</url>\n            <snapshots>\n\t\t\t\t<enabled>false</enabled>\n\t\t\t</snapshots>\n        </repository>\n\t\t<repository>\n            <id>jeecg</id>\n            <name>jeecg Repository</name>\n            <url>https://maven.jeecg.org/nexus/content/repositories/jeecg</url>\n            <snapshots>\n\t\t\t\t<enabled>false</enabled>\n\t\t\t</snapshots>\n\t\t</repository>\n\t\t<repository>\n\t\t\t<id>jeecg-snapshots</id>\n\t\t\t<name>jeecg-snapshots Repository</name>\n\t\t\t<url>https://oss.sonatype.org/content/repositories/snapshots</url>\n\t\t\t<releases>\n\t\t\t\t<enabled>false</enabled>\n\t\t\t</releases>\n\t\t\t<snapshots>\n\t\t\t\t<enabled>true</enabled>\n\t\t\t</snapshots>\n\t\t</repository>\n\t</repositories>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<artifactId>asm</artifactId>\n\t\t\t\t\t<groupId>org.ow2.asm</groupId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.junit.platform</groupId>\n\t\t\t<artifactId>junit-platform-launcher</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<!-- Lombok -->\n\t\t<dependency>\n\t\t\t<groupId>org.projectlombok</groupId>\n\t\t\t<artifactId>lombok</artifactId>\n\t\t</dependency>\n\t\t<!-- json -->\n\t\t<dependency>\n\t\t\t<groupId>com.alibaba</groupId>\n\t\t\t<artifactId>fastjson</artifactId>\n\t\t\t<version>${fastjson.version}</version>\n\t\t</dependency>\n\t\t<!-- markdown -->\n\t\t<!--<dependency>\n\t\t\t<groupId>org.pegdown</groupId>\n\t\t\t<artifactId>pegdown</artifactId>\n\t\t\t<version>${pegdown.version}</version>\n\t\t</dependency>-->\n\t\t<!--markdown 解析 https://github.com/commonmark/commonmark-java -->\n\t\t<dependency>\n\t\t\t<groupId>org.commonmark</groupId>\n\t\t\t<artifactId>commonmark</artifactId>\n\t\t\t<version>${commonmark.version}</version>\n\t\t</dependency>\n\t</dependencies>\n\n\t<dependencyManagement>\n\t\t<dependencies>\n\t\t\t<!-- spring-cloud-->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t\t<artifactId>spring-cloud-dependencies</artifactId>\n                <version>${spring-cloud.version}</version>\n\t\t\t\t<type>pom</type>\n\t\t\t\t<scope>import</scope>\n\t\t\t</dependency>\n\t\t\t<!-- spring-cloud-alibaba -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>com.alibaba.cloud</groupId>\n\t\t\t\t<artifactId>spring-cloud-alibaba-dependencies</artifactId>\n                <version>${spring-cloud-alibaba.version}</version>\n\t\t\t\t<type>pom</type>\n\t\t\t\t<scope>import</scope>\n\t\t\t</dependency>\n\n\t\t\t<!-- system 模块-->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t\t<artifactId>jeecg-system-biz</artifactId>\n\t\t\t\t<version>${jeecgboot.version}</version>\n\t\t\t</dependency>\n\n\t\t\t<!-- jeecg tools -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t\t<artifactId>jeecg-boot-common</artifactId>\n\t\t\t\t<version>${jeecgboot.version}</version>\n\t\t\t</dependency>\n\t\t\t<!-- jeecg core -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t\t<artifactId>jeecg-boot-base-core</artifactId>\n\t\t\t\t<version>${jeecgboot.version}</version>\n\t\t\t</dependency>\n\t\t\t<!-- system 单体 api -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t\t<artifactId>jeecg-system-local-api</artifactId>\n\t\t\t\t<version>${jeecgboot.version}</version>\n\t\t\t</dependency>\n\t\t\t<!-- system 微服务 api -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t\t<artifactId>jeecg-system-cloud-api</artifactId>\n\t\t\t\t<version>${jeecgboot.version}</version>\n\t\t\t</dependency>\n\n            <!--微服务启动依赖-->\n            <dependency>\n                <groupId>org.jeecgframework.boot3</groupId>\n                <artifactId>jeecg-boot-starter-cloud</artifactId>\n                <version>${jeecgboot.version}</version>\n            </dependency>\n\t\t\t<!--xxl-job定时任务-->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t\t<artifactId>jeecg-boot-starter-job</artifactId>\n\t\t\t\t<version>3.9.1</version>\n\t\t\t</dependency>\n\t\t\t<!--redis分布式锁-->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t\t<artifactId>jeecg-boot-starter-lock</artifactId>\n\t\t\t\t<version>${jeecgboot.version}</version>\n\t\t\t</dependency>\n\t\t\t<!--rabbitmq消息队列-->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t\t<artifactId>jeecg-boot-starter-rabbitmq</artifactId>\n\t\t\t\t<version>${jeecgboot.version}</version>\n\t\t\t\t<exclusions>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<groupId>joda-time</groupId>\n\t\t\t\t\t\t<artifactId>joda-time</artifactId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t</exclusions>\n\t\t\t</dependency>\n\t\t\t<!--rocketmq-->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t\t<artifactId>jeecg-boot-starter-rocketmq</artifactId>\n\t\t\t\t<version>${jeecgboot.version}</version>\n\t\t\t</dependency>\n\t\t\t<!--分库分表shardingsphere-->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t\t<artifactId>jeecg-boot-starter-shardingsphere</artifactId>\n\t\t\t\t<version>3.9.1</version>\n\t\t\t</dependency>\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t\t<artifactId>jeecg-boot-starter-shardingsphere-nacos</artifactId>\n\t\t\t\t<version>3.9.1</version>\n\t\t\t</dependency>\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.hibernate</groupId>\n\t\t\t\t<artifactId>hibernate-core</artifactId>\n\t\t\t\t<version>5.6.7.Final</version>\n\t\t\t\t<exclusions>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<groupId>commons-collections</groupId>\n\t\t\t\t\t\t<artifactId>commons-collections</artifactId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t</exclusions>\n\t\t\t</dependency>\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t\t<artifactId>hibernate-re</artifactId>\n\t\t\t\t<version>3.9.1-beta</version>\n\t\t\t</dependency>\n\n\t\t\t<!--mongon db-->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t\t<artifactId>jeecg-boot-starter-mongon</artifactId>\n\t\t\t\t<version>${jeecgboot.version}</version>\n\t\t\t</dependency>\n\t\t\t<!--人大金仓驱动 版本号V008R006C005B0013 -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework</groupId>\n\t\t\t\t<artifactId>kingbase8</artifactId>\n\t\t\t\t<version>9.0.0</version>\n\t\t\t\t<scope>runtime</scope>\n\t\t\t</dependency>\n\t\t\t<!--达梦8数据库最新驱动 版本号1-3-26-2023.07.26-197096-20046-ENT -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>com.dameng</groupId>\n\t\t\t\t<artifactId>DmJdbcDriver18</artifactId>\n\t\t\t\t<version>${dm8.version}</version>\n\t\t\t</dependency>\n\t\t\t<dependency>\n\t\t\t\t<groupId>com.dameng</groupId>\n\t\t\t\t<artifactId>DmDialect-for-hibernate5.0</artifactId>\n\t\t\t\t<version>${dm8.version}</version>\n\t\t\t</dependency>\n\t\t\t<!-- 七牛云SDK -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>com.qiniu</groupId>\n\t\t\t\t<artifactId>qiniu-java-sdk</artifactId>\n\t\t\t\t<version>${qiniu-java-sdk.version}</version>\n\t\t\t\t<exclusions>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<artifactId>okhttp</artifactId>\n\t\t\t\t\t\t<groupId>com.squareup.okhttp3</groupId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t</exclusions>\n\t\t\t</dependency>\n\t\t\t<!-- 百度SDK （OCR） -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>com.baidu.aip</groupId>\n\t\t\t\t<artifactId>java-sdk</artifactId>\n\t\t\t\t<version>${baidu-java-sdk.version}</version>\n\t\t\t\t<exclusions>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t\t\t\t<artifactId>slf4j-simple</artifactId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t</exclusions>\n\t\t\t</dependency>\n\t\t\t<!-- dom4j -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>dom4j</groupId>\n\t\t\t\t<artifactId>dom4j</artifactId>\n\t\t\t\t<version>${dom4j.version}</version>\n\t\t\t</dependency>\n\t\t\t<!-- update-begin-author:chenrui -date:20240104  for：[issue/5723]指定jaxb-runtime版本 -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.glassfish.jaxb</groupId>\n\t\t\t\t<artifactId>jaxb-runtime</artifactId>\n\t\t\t\t<version>2.3.3</version>\n\t\t\t</dependency>\n\t\t\t<!-- update-end-author:chenrui -date:20240104  for：[issue/5723]指定jaxb-runtime版本 -->\n\t\t\t\n\t\t\t<!-- fileupload -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>commons-fileupload</groupId>\n\t\t\t\t<artifactId>commons-fileupload</artifactId>\n\t\t\t\t<version>${commons-fileupload.version}</version>\n\t\t\t\t<exclusions>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<artifactId>commons-io</artifactId>\n\t\t\t\t\t\t<groupId>commons-io</groupId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t</exclusions>\n\t\t\t</dependency>\n\n\t\t\t<!-- justauth第三方登录  -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>com.xkcoding.justauth</groupId>\n\t\t\t\t<artifactId>justauth-spring-boot-starter</artifactId>\n\t\t\t\t<version>${justauth-spring-boot-starter.version}</version>\n\t\t\t\t<exclusions>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<artifactId>hutool-core</artifactId>\n\t\t\t\t\t\t<groupId>cn.hutool</groupId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<artifactId>fastjson</artifactId>\n\t\t\t\t\t\t<groupId>com.alibaba</groupId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t</exclusions>\n\t\t\t</dependency>\n\t\t\t<dependency>\n\t\t\t\t<groupId>com.squareup.okhttp3</groupId>\n\t\t\t\t<artifactId>okhttp</artifactId>\n\t\t\t\t<version>4.4.1</version>\n\t\t\t</dependency>\n\t\t\t<!-- hutool工具类-->\n\t\t\t<dependency>\n\t\t\t\t<groupId>cn.hutool</groupId>\n\t\t\t\t<artifactId>hutool-core</artifactId>\n\t\t\t\t<version>${hutool.version}</version>\n\t\t\t</dependency>\n\t\t\t<dependency>\n\t\t\t\t<groupId>cn.hutool</groupId>\n\t\t\t\t<artifactId>hutool-crypto</artifactId>\n\t\t\t\t<version>${hutool.version}</version>\n\t\t\t</dependency>\n\t\t\t<!--minio-->\n\t\t\t<dependency>\n\t\t\t\t<groupId>io.minio</groupId>\n\t\t\t\t<artifactId>minio</artifactId>\n\t\t\t\t<version>${minio.version}</version>\n\t\t\t\t<exclusions>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<artifactId>okio</artifactId>\n\t\t\t\t\t\t<groupId>com.squareup.okio</groupId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<artifactId>okhttp</artifactId>\n\t\t\t\t\t\t<groupId>com.squareup.okhttp3</groupId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t</exclusions>\n\t\t\t</dependency>\n\t\t\t<!-- 企业微信和钉钉 SDK -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework</groupId>\n\t\t\t\t<artifactId>weixin4j</artifactId>\n\t\t\t\t<version>2.0.4</version>\n\t\t\t\t<exclusions>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<artifactId>commons-beanutils</artifactId>\n\t\t\t\t\t\t<groupId>commons-beanutils</groupId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<artifactId>commons-lang</artifactId>\n\t\t\t\t\t\t<groupId>commons-lang</groupId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<artifactId>commons-collections</artifactId>\n\t\t\t\t\t\t<groupId>commons-collections</groupId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<artifactId>commons-logging</artifactId>\n\t\t\t\t\t\t<groupId>commons-logging</groupId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<artifactId>commons-io</artifactId>\n\t\t\t\t\t\t<groupId>commons-io</groupId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t</exclusions>\n\t\t\t</dependency>\n\t\t\t<!-- minidao -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t\t<artifactId>minidao-spring-boot-starter-jsqlparser-4.9</artifactId>\n\t\t\t\t<version>${minidao.version}</version>\n\t\t\t\t<exclusions>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<artifactId>druid</artifactId>\n\t\t\t\t\t\t<groupId>com.alibaba</groupId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t</exclusions>\n\t\t\t</dependency>\n\t\t\t<!-- 积木报表-->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework.jimureport</groupId>\n\t\t\t\t<artifactId>jimureport-spring-boot3-starter</artifactId>\n\t\t\t\t<version>${jimureport-spring-boot-starter.version}</version>\n\t\t\t\t<exclusions>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<groupId>commons-io</groupId>\n\t\t\t\t\t\t<artifactId>commons-io</artifactId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<groupId>com.alibaba</groupId>\n\t\t\t\t\t\t<artifactId>fastjson</artifactId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<artifactId>commons-lang</artifactId>\n\t\t\t\t\t\t<groupId>commons-lang</groupId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<artifactId>checker-qual</artifactId>\n\t\t\t\t\t\t<groupId>org.checkerframework</groupId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<artifactId>druid</artifactId>\n\t\t\t\t\t\t<groupId>com.alibaba</groupId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<artifactId>jsqlparser</artifactId>\n\t\t\t\t\t\t<groupId>com.github.jsqlparser</groupId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<groupId>io.minio</groupId>\n\t\t\t\t\t\t<artifactId>minio</artifactId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<groupId>org.apache.poi</groupId>\n\t\t\t\t\t\t<artifactId>ooxml-schemas</artifactId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t</exclusions>\n\t\t\t</dependency>\n\t\t\t<!-- AutoPoi Excel工具类-->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework</groupId>\n\t\t\t\t<artifactId>autopoi-spring-boot-3-starter</artifactId>\n\t\t\t\t<version>${autopoi-web.version}</version>\n\t\t\t\t<exclusions>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<groupId>commons-codec</groupId>\n\t\t\t\t\t\t<artifactId>commons-codec</artifactId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<artifactId>xercesImpl</artifactId>\n\t\t\t\t\t\t<groupId>xerces</groupId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<artifactId>guava</artifactId>\n\t\t\t\t\t\t<groupId>com.google.guava</groupId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<groupId>commons-io</groupId>\n\t\t\t\t\t\t<artifactId>commons-io</artifactId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t</exclusions>\n\t\t\t</dependency>\n\t\t\t<!-- mongo、redis和文件数据集支持包，按需引入 -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework.jimureport</groupId>\n\t\t\t\t<artifactId>jimureport-nosql-starter</artifactId>\n\t\t\t\t<version>2.1.0</version>\n\t\t\t\t<exclusions>\n                    <exclusion>\n                        <groupId>org.apache.calcite</groupId>\n                        <artifactId>calcite-elasticsearch</artifactId>\n                    </exclusion>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<groupId>org.apache.commons</groupId>\n\t\t\t\t\t\t<artifactId>commons-text</artifactId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<groupId>org.apache.httpcomponents</groupId>\n\t\t\t\t\t\t<artifactId>httpclient</artifactId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t</exclusions>\n\t\t\t</dependency>\n\t\t\t<!-- 后台导出接口Echart图表支持包，按需引入 -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework.jimureport</groupId>\n\t\t\t\t<artifactId>jimureport-echarts-starter</artifactId>\n\t\t\t\t<version>2.2.0</version>\n\t\t\t</dependency>\n            <!-- 积木BI大屏和仪表盘 -->\n            <dependency>\n                <groupId>org.jeecgframework.jimureport</groupId>\n                <artifactId>jimubi-spring-boot3-starter</artifactId>\n                <version>${jimubi-spring-boot-starter.version}</version>\n\t\t\t\t<exclusions>\n\t\t\t\t\t<exclusion>\n\t\t\t\t\t\t<groupId>com.github.jsqlparser</groupId>\n\t\t\t\t\t\t<artifactId>jsqlparser</artifactId>\n\t\t\t\t\t</exclusion>\n\t\t\t\t</exclusions>\n            </dependency>\n\t\t\t<!-- chatgpt -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.jeecgframework.boot3</groupId>\n\t\t\t\t<artifactId>jeecg-boot-starter-chatgpt</artifactId>\n                <version>3.9.1.1</version>\n\t\t\t</dependency>\n\t\t\t<!--flyway 支持 mysql5.7+、MariaDB10.3.16-->\n\t\t\t<!--mysql5.6，需要把版本号改成5.2.1-->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.flywaydb</groupId>\n\t\t\t\t<artifactId>flyway-core</artifactId>\n\t\t\t\t<version>7.15.0</version>\n\t\t\t</dependency>\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.apache.commons</groupId>\n\t\t\t\t<artifactId>commons-compress</artifactId>\n\t\t\t\t<version>1.27.1</version>\n\t\t\t</dependency>\n\t\t</dependencies>\n\t</dependencyManagement>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<!-- 指定JDK编译版本 -->\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <configuration>\n                    <source>${java.version}</source>\n                    <target>${java.version}</target>\n                    <encoding>UTF-8</encoding>\n                </configuration>\n            </plugin>\n            <!-- 打包跳过测试 -->\n            <plugin>\n\t\t        <groupId>org.apache.maven.plugins</groupId>\n\t\t        <artifactId>maven-surefire-plugin</artifactId>\n\t\t        <configuration>\n\t\t          <skipTests>true</skipTests>\n\t\t        </configuration>\n\t        </plugin>\n\t         <!-- 避免font文件的二进制文件格式压缩破坏 -->\n\t         <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.3.1</version>\n                <configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n                    <nonFilteredFileExtensions>\n\t\t\t\t\t\t<!-- 常见的二进制文件类型 -->\n                        <nonFilteredFileExtension>woff</nonFilteredFileExtension>\n                        <nonFilteredFileExtension>woff2</nonFilteredFileExtension>\n                        <nonFilteredFileExtension>eot</nonFilteredFileExtension>\n                        <nonFilteredFileExtension>ttf</nonFilteredFileExtension>\n                        <nonFilteredFileExtension>svg</nonFilteredFileExtension>\n                        <nonFilteredFileExtension>glb</nonFilteredFileExtension>\n                        <nonFilteredFileExtension>wasm</nonFilteredFileExtension>\n                        <nonFilteredFileExtension>ico</nonFilteredFileExtension>\n\t\t\t\t\t\t<nonFilteredFileExtension>swf</nonFilteredFileExtension>\n\t\t\t\t\t\t<nonFilteredFileExtension>mp3</nonFilteredFileExtension>\n\t\t\t\t\t\t<nonFilteredFileExtension>mp4</nonFilteredFileExtension>\n\t\t\t\t\t\t<nonFilteredFileExtension>jpg</nonFilteredFileExtension>\n\t\t\t\t\t\t<nonFilteredFileExtension>png</nonFilteredFileExtension>\n\t\t\t\t\t\t<nonFilteredFileExtension>gif</nonFilteredFileExtension>\n\t\t\t\t\t\t<nonFilteredFileExtension>pdf</nonFilteredFileExtension>\n\t\t\t\t\t\t<nonFilteredFileExtension>bcmap</nonFilteredFileExtension>\n\t\t\t\t\t\t<nonFilteredFileExtension>cmap</nonFilteredFileExtension>\n\t\t\t\t\t\t<nonFilteredFileExtension>cur</nonFilteredFileExtension>\n\t\t\t\t\t\t<nonFilteredFileExtension>zip</nonFilteredFileExtension>\n                    </nonFilteredFileExtensions>\n                </configuration>\n            </plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n                <directory>src/main/resources</directory>\n                <filtering>true</filtering>\n            </resource>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/java</directory>\n\t\t\t\t<includes>\n\t\t\t\t\t<include>**/*.xml</include>\n\t\t\t\t\t<include>**/*.json</include>\n\t\t\t\t\t<include>**/*.ftl</include>\n\t\t\t\t</includes>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n\n\t<distributionManagement>\n\t\t<repository>\n\t\t\t<id>jeecg</id>\n\t\t\t<name>jeecg Repository</name>\n\t\t\t<url>http://maven.jeecg.com:8090/nexus/content/repositories/jeecg</url>\n\t\t</repository>\n\t\t<snapshotRepository>\n\t\t\t<id>jeecg-snapshots</id>\n\t\t\t<name>jeecg Snapshot Repository</name>\n\t\t\t<url>http://maven.jeecg.com:8090/nexus/content/repositories/snapshots/</url>\n\t\t</snapshotRepository>\n\t</distributionManagement>\n\t\n    <!-- 环境 -->\n    <profiles>\n        <!-- 开发 -->\n        <profile>\n            <id>dev</id>\n            <activation>\n                <!--默认激活配置-->\n                <activeByDefault>true</activeByDefault>\n            </activation>\n            <properties>\n                <!--当前环境-->\n                <profile.name>dev</profile.name>\n                <!--Nacos服务地址-->\n                <config.server-addr>jeecg-boot-nacos:8848</config.server-addr>\n\t\t\t\t<!--Nacos配置中心命名空间,用于支持多环境.这里必须使用ID，不能使用名称,默认为空-->\n\t\t\t\t<config.namespace>springboot3</config.namespace>\n\t\t\t\t<!--Nacos配置分组名称-->\n\t\t\t\t<config.group>DEFAULT_GROUP</config.group>\n\t\t\t\t<!--Nacos用户名-->\n\t\t\t\t<config.username></config.username>\n\t\t\t\t<!--Nacos密码-->\n\t\t\t\t<config.password></config.password>\n            </properties>\n        </profile>\n\t\t<!-- 测试Nacos开启鉴权、设置分组和命名空间\n\t\t<profile>\n\t\t\t<id>dev</id>\n\t\t\t<properties>\n\t\t\t\t<profile.name>dev</profile.name>\n\t\t\t\t<config.server-addr>jeecg-boot-nacos:8848</config.server-addr>\n\t\t\t\t<config.namespace>ac14ab82-51f8-4f0c-aa5b-25fb8384bfb6</config.namespace>\n\t\t\t\t<config.group>JEECGDEV_GROUP</config.group>\n\t\t\t\t<config.username>nacos</config.username>\n\t\t\t\t<config.password>nacos</config.password>\n\t\t\t</properties>\n\t\t</profile> -->\n        <!-- 测试 -->\n        <profile>\n            <id>test</id>\n            <properties>\n                <!--当前环境-->\n                <profile.name>test</profile.name>\n                <!--Nacos服务地址-->\n                <config.server-addr>jeecg-boot-nacos:8848</config.server-addr>\n\t\t\t\t<!--Nacos配置中心命名空间,用于支持多环境.这里必须使用ID，不能使用名称,默认为空-->\n\t\t\t\t<config.namespace>springboot3</config.namespace>\n\t\t\t\t<!--Nacos配置分组名称-->\n\t\t\t\t<config.group>DEFAULT_GROUP</config.group>\n\t\t\t\t<!--Nacos用户名-->\n\t\t\t\t<config.username></config.username>\n\t\t\t\t<!--Nacos密码-->\n\t\t\t\t<config.password></config.password>\n            </properties>\n        </profile>\n        <!-- docker打包用 -->\n        <profile>\n            <id>docker</id>\n            <properties>\n                <!--当前环境-->\n                <profile.name>docker</profile.name>\n                <!--Nacos服务地址-->\n                <config.server-addr>jeecg-boot-nacos:8848</config.server-addr>\n                <!--Nacos配置中心命名空间,用于支持多环境.这里必须使用ID，不能使用名称,默认为空-->\n                <config.namespace>springboot3</config.namespace>\n                <!--Nacos配置分组名称-->\n                <config.group>DEFAULT_GROUP</config.group>\n                <!--Nacos用户名-->\n                <config.username></config.username>\n                <!--Nacos密码-->\n                <config.password></config.password>\n            </properties>\n        </profile>\n        <!-- 生产 -->\n        <profile>\n            <id>prod</id>\n            <properties>\n                <!--当前环境-->\n                <profile.name>prod</profile.name>\n                <!--Nacos服务地址-->\n                <config.server-addr>jeecg-boot-nacos:8848</config.server-addr>\n\t\t\t\t<!--Nacos配置中心命名空间,用于支持多环境.这里必须使用ID，不能使用名称,默认为空-->\n\t\t\t\t<config.namespace>springboot3</config.namespace>\n\t\t\t\t<!--Nacos配置分组名称-->\n\t\t\t\t<config.group>DEFAULT_GROUP</config.group>\n\t\t\t\t<!--Nacos用户名-->\n\t\t\t\t<config.username></config.username>\n\t\t\t\t<!--Nacos密码-->\n\t\t\t\t<config.password></config.password>\n            </properties>\n        </profile>\n\t\t<!-- SpringCloud运行环境 -->\n\t\t<profile>\n\t\t\t<id>SpringCloud</id>\n\t\t\t<activation>\n\t\t\t\t<!--默认激活配置-->\n\t\t\t\t<activeByDefault>true</activeByDefault>\n\t\t\t</activation>\n\t\t\t<modules>\n\t\t\t\t<!-- 微服务模块 -->\n\t\t\t\t<module>jeecg-server-cloud</module>\n\t\t\t</modules>\n\t\t</profile>\n    </profiles>\n</project>"
  },
  {
    "path": "jeecgboot-vue3/.editorconfig",
    "content": "root = true\n\n[*]\ncharset=utf-8\nend_of_line=lf\ninsert_final_newline=true\nindent_style=space\nindent_size=2\nmax_line_length = 100\n\n[*.{yml,yaml,json}]\nindent_style = space\nindent_size = 2\n\n[*.md]\ntrim_trailing_whitespace = false\n\n[Makefile]\nindent_style = tab\n"
  },
  {
    "path": "jeecgboot-vue3/.eslintignore",
    "content": "\n*.sh\nnode_modules\n*.md\n*.woff\n*.ttf\n.vscode\n.idea\ndist\n/public\n/docs\n.husky\n.local\n/bin\nDockerfile\n"
  },
  {
    "path": "jeecgboot-vue3/.eslintrc.js",
    "content": "// @ts-check\nconst { defineConfig } = require('eslint-define-config');\nmodule.exports = defineConfig({\n  root: true,\n  env: {\n    browser: true,\n    node: true,\n    es6: true,\n  },\n  parser: 'vue-eslint-parser',\n  parserOptions: {\n    parser: '@typescript-eslint/parser',\n    ecmaVersion: 2020,\n    sourceType: 'module',\n    jsxPragma: 'React',\n    ecmaFeatures: {\n      jsx: true,\n    },\n  },\n  extends: [\n    'plugin:vue/vue3-recommended',\n    'plugin:@typescript-eslint/recommended',\n    'prettier',\n    'plugin:prettier/recommended',\n    'plugin:jest/recommended',\n  ],\n  rules: {\n    'prettier/prettier': 'off', // 彻底关闭 prettier 校验规则\n    'vue/script-setup-uses-vars': 'error',\n    '@typescript-eslint/ban-ts-ignore': 'off',\n    '@typescript-eslint/explicit-function-return-type': 'off',\n    '@typescript-eslint/no-explicit-any': 'off',\n    '@typescript-eslint/no-var-requires': 'off',\n    '@typescript-eslint/no-empty-function': 'off',\n    'vue/custom-event-name-casing': 'off',\n    'no-use-before-define': 'off',\n    '@typescript-eslint/no-use-before-define': 'off',\n    '@typescript-eslint/ban-ts-comment': 'off',\n    '@typescript-eslint/ban-types': 'off',\n    '@typescript-eslint/no-non-null-assertion': 'off',\n    '@typescript-eslint/explicit-module-boundary-types': 'off',\n    '@typescript-eslint/no-unused-vars': [\n      'error',\n      {\n        argsIgnorePattern: '^_',\n        varsIgnorePattern: '^_',\n      },\n    ],\n    'no-unused-vars': [\n      'error',\n      {\n        argsIgnorePattern: '^_',\n        varsIgnorePattern: '^_',\n      },\n    ],\n    'space-before-function-paren': 'off',\n\n    'vue/attributes-order': 'off',\n    'vue/one-component-per-file': 'off',\n    'vue/html-closing-bracket-newline': 'off',\n    'vue/max-attributes-per-line': 'off',\n    'vue/multiline-html-element-content-newline': 'off',\n    'vue/singleline-html-element-content-newline': 'off',\n    'vue/attribute-hyphenation': 'off',\n    'vue/require-default-prop': 'off',\n    'vue/html-self-closing': [\n      'error',\n      {\n        html: {\n          void: 'always',\n          normal: 'any',\n          component: 'any',\n        },\n        svg: 'always',\n        math: 'always',\n      },\n    ],\n  },\n});\n"
  },
  {
    "path": "jeecgboot-vue3/.gitignore",
    "content": "node_modules\n.DS_Store\n.github\ndist\n.cache\n.playwright-mcp\n\ntests/server/static\ntests/server/static/upload\n\n.local\n# local env files\n.env.local\n.env.*.local\n.eslintcache\n\n# Log files\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\n\n# Editor directories and files\n.idea\n.svn\n# .vscode\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n/os_del.cmd\nos_del.cmd\n/.vscode/\n/.history/\n/svn clear.bat\n.claude\n"
  },
  {
    "path": "jeecgboot-vue3/.gitpod.yml",
    "content": "ports:\n  - port: 3344\n    onOpen: open-preview\ntasks:\n  - init: yarn\n    command: yarn dev\n"
  },
  {
    "path": "jeecgboot-vue3/.npmrc",
    "content": "shamefully-hoist=true\nstrict-peer-dependencies=false\n\nelectron_mirror=https://npmmirror.com/mirrors/electron/\nelectron_builder_binaries_mirror=https://npmmirror.com/mirrors/electron-builder-binaries/\n"
  },
  {
    "path": "jeecgboot-vue3/.prettierignore",
    "content": "/dist/*\n.local\n.output.js\n/node_modules/**\n\n**/*.svg\n**/*.sh\n\n/public/*\n"
  },
  {
    "path": "jeecgboot-vue3/.stylelintignore",
    "content": "/dist/*\n/public/*\npublic/*\n"
  },
  {
    "path": "jeecgboot-vue3/.yarnclean",
    "content": "# test directories\n__tests__\ntest\ntests\npowered-test\n\n# asset directories\ndocs\ndoc\nwebsite\nimages\nassets\n\n# examples\nexample\nexamples\n\n# code coverage directories\ncoverage\n.nyc_output\n\n# build scripts\nMakefile\nGulpfile.js\nGruntfile.js\n\n# configs\nappveyor.yml\ncircle.yml\ncodeship-services.yml\ncodeship-steps.yml\nwercker.yml\n.tern-project\n.gitattributes\n.editorconfig\n.*ignore\n.eslintrc\n.jshintrc\n.flowconfig\n.documentup.json\n.yarn-metadata.json\n.travis.yml\n\n# misc\n*.md\n\n!istanbul-reports/lib/html/assets\n!istanbul-api/node_modules/istanbul-reports/lib/html/assets\n"
  },
  {
    "path": "jeecgboot-vue3/CLAUDE.md",
    "content": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nJeecgBoot Vue3 frontend — an enterprise low-code platform built with Vue 3 + Vite 6 + Ant Design Vue 4 + TypeScript. Uses pnpm as package manager. Node 18 or 20+ required (`engines: \"^18 || >=20\"`).\n\n## Common Commands\n\n```bash\npnpm dev              # Start dev server (port 3100, mock enabled)\npnpm build            # Production build (output: dist/)\npnpm build:docker     # Docker production build\npnpm build:dockercloud # Docker cloud production build\npnpm build:report     # Build with bundle visualizer\npnpm preview          # Build + preview\n\n# Linting (no unified \"lint\" script — run individually)\nnpx eslint src/path/to/file.vue          # Lint specific file\nnpx stylelint \"src/**/*.{vue,less,css}\"  # Stylelint\npnpm batch:prettier                       # Format all src files\n\n# Testing (Jest configured but not integrated into npm scripts)\n# Tests exist in tests/ directory but no test script in package.json\n# Run manually if needed: npx jest\n\npnpm clean:cache      # Clear Vite cache\npnpm gen:icon         # Regenerate icon data\npnpm reinstall        # Clean reinstall all dependencies\n```\n\n## Path Aliases\n\n- `/@/` and `@/` → `src/`\n- `/#/` and `#/` → `types/`\n- `~icons/{collection}/{name}` → unplugin-icons (compile-time icon imports)\n\nThe `/@/` prefix (with leading slash) is the project's conventional alias — prefer it for consistency.\n\n## Architecture\n\n### Bootstrap Sequence (src/main.ts)\n\n`createApp` → createRouter → setupStore (pinia) → setupProps → i18n → initAppConfigStore → registerPackages (@jeecg/online) → registerGlobComp (core Ant Design components) → SSO login → registerSuper (dynamic module discovery) → setupRouter → guards → directives → error handler → registerThirdComp (vxe-table, emoji, dayjs) → setupElectron → router.isReady() → mount\n\n### Routing & Permissions\n\n- **Permission mode: BACK** — routes and menus are fetched from the backend API via `getBackMenuAndPerms()`\n- Dynamic routes added at runtime in `src/store/modules/permission.ts`\n- Static routes: login, oauth2-login, token-login, error pages, AI dashboard\n- Router mode: HTML5 history (hash mode when running in Electron)\n- Super modules discovered dynamically via `import.meta.glob('./**/register.ts')` in `src/views/super/registerSuper.ts`\n\n### State Management (Pinia)\n\nKey stores in `src/store/modules/`:\n- `user.ts` (app-user) — auth token, user info, roles, tenant, dict items\n- `permission.ts` (app-permission) — dynamic routes, permission codes, backend menus\n- `app.ts` (app) — project config, theme, layout settings\n- `locale.ts` (app-locale) — i18n locale\n- `multipleTab.ts` (app-multiple-tab) — tab state\n\nAuth persisted in localStorage via `src/utils/auth/index.ts`.\n\n### API Layer\n\n- Custom Axios wrapper: `src/utils/http/axios/` — configured instance exported as `defHttp`\n- All requests signed with MD5 via `signMd5Utils`\n- Tenant ID injected as header when `VITE_GLOB_TENANT_MODE` is enabled\n- Response format: `{ code, result, message, success }` where `code === 200` is success\n\n### Component Registration\n\n- **Auto-import**: `unplugin-vue-components` with `AntDesignVueResolver` auto-imports all Ant Design Vue components (no manual import needed in templates)\n- **Global manual**: `registerGlobComp.ts` registers Icon, AIcon, JUploadButton, Button, TinyMCE Editor\n- **Third-party**: `registerThirdComp.ts` registers vxe-table (full import), custom vxe cell components, emoji picker, dayjs plugins\n- **Async loading**: Heavy components use `src/utils/factory/createAsyncComponent.tsx`\n\n### Icon System\n\nThree icon approaches:\n1. **Iconify runtime** — `<Icon icon=\"mdi:home\" />` via `@iconify/iconify` CDN lazy-load\n2. **SVG sprites** — `<Icon icon=\"icon-name|svg\" />` via `vite-plugin-svg-icons`\n3. **unplugin-icons** — `import IconName from '~icons/collection/name'` for compile-time tree-shaken icons\n\n### Theme System\n\n- Less variables generated by `build/generate/generateModifyVars.ts`\n- Dark mode via Ant Design Vue `theme.darkAlgorithm`\n- CSS variable `--j-global-primary-color` set dynamically from theme color\n- CSS class prefix: `jeecg` (defined in `src/settings/designSetting.ts`)\n\n### External Packages\n\n- `@jeecg/online` and `@jeecg/aiflow` are external monorepo packages excluded from Vite optimizeDeps (CJS compatibility issues)\n- Registered via `registerPackages(app)` in main.ts\n\n### Performance Optimization Patterns\n\n**Critical: Use dynamic imports for non-critical modules**\n- Static `import` at top of file causes the entire dependency chain to load on initial page\n- Use `await import('module')` or `import('path/to/module').then()` for lazy loading\n- Key files using dynamic imports:\n  - `src/settings/registerThirdComp.ts` — vxe-table, emoji picker (loaded after mount)\n  - `src/views/super/registerSuper.ts` — dynamic module discovery\n  - Non-critical Ant Design Vue components loaded asynchronously\n\n**Vite optimizeDeps**\n- Pre-bundled dependencies in `vite.config.ts` include: dayjs, axios, pinia, nprogress, qs, crypto-js, md5, sortablejs, xe-utils, vue-i18n, lodash-es, xss, mockjs\n- External packages (`@jeecg/*`) excluded due to CJS issues\n\n### Micro-Frontend (Qiankun)\n\n- Can run as master (hosting sub-apps) or child (embedded in parent)\n- Config in `src/qiankun/`, sub-apps via `VITE_APP_SUB_*` env vars\n- Child mode activated when `VITE_GLOB_QIANKUN_MICRO_APP_NAME` is set\n\n### Electron Support\n\n- `src/electron/` — uses hash router mode\n- Platform detected via `VITE_GLOB_RUN_PLATFORM === 'electron'`\n\n## Key Configuration\n\n### Environment Variables\n\n- `.env` — base config (port 3100, app title, SSO/qiankun flags)\n- `.env.development` — mock enabled, proxy to `localhost:8080/jeecg-boot`\n- `.env.production` — mock disabled, gzip compression\n- `.env.docker` — Docker production build config\n- `.env.dockercloud` — Docker cloud production build config\n- `.env.prod_electron` — Electron production build config\n- `VITE_GLOB_*` vars are injected at runtime via `dist/_app.config.js` (changeable post-build)\n\n### Build\n\n- Manual chunks: `vue-vendor`, `antd-vue-vendor`, `vxe-table-vendor`, `emoji-mart-vue-fast`, `china-area-data-vendor`\n- Post-build: `build/script/postBuild.ts` generates runtime config; `copyChat.ts` copies chat assets\n- Console/debugger stripped in production via esbuild\n\n## Code Style\n\n- **Prettier**: 150 char width, single quotes, trailing commas (es5), 2-space indent, `endOfLine: 'auto'`, `vueIndentScriptAndStyle: true` (indent inside `<script>`/`<style>`), `htmlWhitespaceSensitivity: 'strict'`\n- **ESLint**: Vue3 recommended + TypeScript recommended + Prettier. `any` is allowed. Unused vars prefixed with `_` are ignored. Note: `prettier/prettier` rule is `'off'` — Prettier is not enforced via ESLint, run it separately\n- **Commits**: Conventional commits enforced via commitlint. Types: feat, fix, perf, style, docs, test, refactor, build, ci, chore, revert, wip, workflow, types, release. Max header: 108 chars\n- **i18n**: Chinese (zh-CN) and English supported. Locale files in `src/locales/lang/`\n\n## Important Directories\n\n```\nbuild/                    # Vite plugins, build scripts, theme generation\nsrc/api/                  # API definitions (sys/, common/, demo/)\nsrc/components/jeecg/     # Jeecg-specific components (JVxeTable, OnLine, etc.)\nsrc/layouts/default/      # Main app layout (header, sider, tabs, menu)\nsrc/settings/             # Project settings (design, components, locale, encryption)\nsrc/utils/http/axios/     # HTTP client configuration\nsrc/views/system/         # System management pages (user, role, menu, dict, etc.)\nsrc/views/super/          # Dynamically-discovered extension modules\ntypes/                    # Global TypeScript declarations\n```\n"
  },
  {
    "path": "jeecgboot-vue3/Dockerfile",
    "content": "FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/nginx\nMAINTAINER jeecgos@163.com\nVOLUME /tmp\nENV LANG en_US.UTF-8\nRUN echo \"server {  \\\n                      listen       80; \\\n                      location   /jeecgboot/ { \\\n                      proxy_pass              http://jeecg-boot-system:8080/jeecg-boot/; \\\n                      proxy_redirect          off; \\\n                      proxy_set_header        Host jeecg-boot-system; \\\n                      proxy_set_header        X-Real-IP \\$remote_addr; \\\n                      proxy_set_header        X-Forwarded-For \\$proxy_add_x_forwarded_for; \\\n                  } \\\n                  #解决Router(mode: 'history')模式下，刷新路由地址不能找到页面的问题 \\\n                  location / { \\\n                     root   /var/www/html/; \\\n                      index  index.html index.htm; \\\n                      if (!-e \\$request_filename) { \\\n                          rewrite ^(.*)\\$ /index.html?s=\\$1 last; \\\n                          break; \\\n                      } \\\n                  } \\\n                  access_log  /var/log/nginx/access.log ; \\\n              } \" > /etc/nginx/conf.d/default.conf \\\n    &&  mkdir  -p  /var/www \\\n    &&  mkdir -p /var/www/html\n\nADD dist/ /var/www/html/\nEXPOSE 80\nEXPOSE 443\n"
  },
  {
    "path": "jeecgboot-vue3/Dockerfile.cloud",
    "content": "FROM registry.cn-hangzhou.aliyuncs.com/dockerhub_mirror/nginx\nMAINTAINER jeecgos@163.com\nVOLUME /tmp\nENV LANG en_US.UTF-8\nRUN echo \"server {  \\\n                      listen       80; \\\n                      location   /jeecgboot/ { \\\n                      proxy_pass              http://jeecg-boot-gateway:9999/; \\\n                      proxy_redirect          off; \\\n                      proxy_set_header        Host jeecg-boot-system; \\\n                      proxy_set_header        X-Real-IP \\$remote_addr; \\\n                      proxy_set_header        X-Forwarded-For \\$proxy_add_x_forwarded_for; \\\n                  } \\\n                  #解决Router(mode: 'history')模式下，刷新路由地址不能找到页面的问题 \\\n                  location / { \\\n                     root   /var/www/html/; \\\n                      index  index.html index.htm; \\\n                      if (!-e \\$request_filename) { \\\n                          rewrite ^(.*)\\$ /index.html?s=\\$1 last; \\\n                          break; \\\n                      } \\\n                  } \\\n                  access_log  /var/log/nginx/access.log ; \\\n              } \" > /etc/nginx/conf.d/default.conf \\\n    &&  mkdir  -p  /var/www \\\n    &&  mkdir -p /var/www/html\n\nADD dist/ /var/www/html/\nEXPOSE 80\nEXPOSE 443\n"
  },
  {
    "path": "jeecgboot-vue3/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020-present, Jeecg\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nIn any case, you must not make any such use of this software as to develop software which may be considered competitive with this software.\n\nJeecgBoot 是由 北京国炬信息技术有限公司 发行的软件。 总部位于北京，地址：中国·北京·朝阳区科荟前街1号院奥林佳泰大厦。邮箱：jeecgos@163.com\n本软件受适用的国家软件著作权法（包括国际条约）和开源协议 双重保护许可。\n  \n开源协议中文释意如下：\n1.JeecgBoot开源版本无任何限制，在遵循本开源协议条款下，允许商用使用，不会造成侵权行为。\n2.允许基于本平台软件开展业务系统开发。\n3.在任何情况下，您不得使用本软件开发可能被认为与本软件竞争的软件。\n\t \n最终解释权归：http://www.jeecg.com\n"
  },
  {
    "path": "jeecgboot-vue3/PWA-README.md",
    "content": "# PWA 功能说明\n\n## 概述\n\n项目集成了 `vite-plugin-pwa` 插件，**适配按需加载**，实现资源缓存优化和离线支持。\n\n**升级亮点**：通过集成 vite-plugin-pwa 实现渐进式 Web 应用，提升了首屏加载速度，同时异步加载系统资源，点击菜单响应更迅速。\n\n**核心设计**：只预缓存关键资源，按需加载的路由组件 chunk 通过运行时缓存策略处理，避免预缓存过多资源。\n\n## 核心文件\n\n### 构建生成的文件\n\n- **`sw.js`** - Service Worker 文件，由 `vite-plugin-pwa` 自动生成，包含：\n  - 预缓存资源列表（HTML、CSS、核心 JS、静态资源）\n  - 运行时缓存策略（JS chunk、CSS、图片、API 等）\n  - 缓存清理和更新逻辑\n\n- **`workbox-*.js`** - Workbox 运行时库，Service Worker 的核心依赖\n\n- **`manifest.webmanifest`** - PWA 清单文件，定义应用元数据\n\n### 配置文件\n\n- **`build/vite/plugin/pwa.ts`** - PWA 插件配置\n  - **预缓存策略**：只缓存关键资源\n    - 入口文件：`index.html`、`manifest.webmanifest`\n    - 核心 JS：入口 JS（`js/index-*.js`）、vendor chunk（`js/*-vendor-*.js`）\n    - 静态资源：CSS、图片、字体等\n    - **不预缓存**：按需加载的路由组件 chunk（避免预缓存过多资源）\n  - **运行时缓存**：按需加载的资源通过运行时缓存策略处理\n    - 按需加载的 JS chunk：NetworkFirst（优先网络，失败后使用缓存）\n    - CSS、图片、API 等：按需缓存\n  - **注册方式**：`injectRegister: 'inline'`（内联到 HTML，避免缓存问题）\n\n## 功能特性\n\n1. **资源缓存优化** - 通过缓存策略提升加载速度\n2. **离线支持** - 缓存静态资源，支持离线访问\n\n## 缓存策略\n\n### 预缓存（Precache）\n\n| 资源类型 | 说明 |\n|---------|------|\n| `index.html` | 入口 HTML 文件 |\n| `manifest.webmanifest` | PWA 清单文件 |\n| `js/index-*.js` | 入口 JS 文件 |\n| `js/*-vendor-*.js` | 核心 vendor chunk（Vue、Ant Design Vue 等） |\n| `assets/index-*.css` | **仅入口 CSS**（主样式文件） |\n| `favicon.ico`、`logo.png` | **仅关键静态资源**（logo、图标） |\n\n**重要优化**：\n- ❌ **不预缓存**：路由组件的 CSS（避免登录页加载全部 CSS）\n- ❌ **不预缓存**：路由组件的 JS chunk（按需加载）\n- ❌ **不预缓存**：所有图片和字体（按需加载）\n- ✅ **只预缓存**：登录页和首屏必需的关键资源\n\n**效果**：访问登录页时，只加载登录页相关资源，不会预加载系统大部分资源。\n\n### 运行时缓存（Runtime Cache）\n\n| 资源类型 | 策略 | 有效期 | 说明 |\n|---------|------|--------|------|\n| 按需加载 JS chunk | NetworkFirst | 7天 | 优先网络，失败后使用缓存 |\n| 路由组件 CSS | CacheFirst | 30天 | **按需加载**，优先缓存 |\n| 图片 | CacheFirst | 30天 | 优先缓存 |\n| API 请求 | NetworkFirst | 5分钟 | 优先网络，短时缓存 |\n| Google Fonts | CacheFirst | 365天 | 长期缓存 |\n\n**优势**：\n- ✅ **减少预缓存体积 80%+**：只预缓存关键资源，不预缓存路由组件 CSS/JS\n- ✅ **登录页加载优化**：访问登录页时只加载登录页资源，不会加载系统大部分资源\n- ✅ **按需加载**：路由组件的 CSS 和 JS 只在访问对应页面时加载和缓存\n- ✅ **节省存储空间**：按需加载的 chunk 只在需要时缓存\n- ✅ **网络优先策略**：确保用户获取最新代码\n\n## 性能提升分析\n\n### 首次访问（无缓存）\n\n- **Service Worker 注册**：~50-100ms（后台异步，不影响页面加载）\n- **预缓存安装**：~200-500ms（后台进行，关键资源已加载）\n- **页面加载**：无影响（Service Worker 在后台工作）\n\n### 二次访问（有缓存）\n\n| 指标 | 无 PWA | 有 PWA | 提升 |\n|------|--------|--------|------|\n| **首屏加载时间** | 2-5s | 0.5-1.5s | **60-70%** ⬇️ |\n| **关键资源加载** | 网络请求 | 缓存读取 | **90%+** ⬇️ |\n| **CSS 加载** | 100-300ms | <10ms | **95%+** ⬇️ |\n| **图片加载** | 200-500ms | <10ms | **95%+** ⬇️ |\n| **离线访问** | ❌ 不可用 | ✅ 可用 | - |\n\n### 按需加载优化\n\n- **预缓存体积**：仅 ~1-3MB（关键资源），而非全部资源（**减少 80%+**）\n- **Service Worker 安装时间**：减少 **60-80%**\n- **登录页加载**：只加载登录页资源，**不加载系统大部分资源**\n- **存储空间**：节省 **70-85%**（不预缓存路由组件 CSS/JS）\n\n### 实际场景性能提升\n\n1. **弱网环境（3G/4G）**\n   - 首屏加载：**3-5s → 0.8-1.5s**（提升 60-70%）\n   - 页面切换：**1-2s → 0.2-0.5s**（提升 75-80%）\n\n2. **离线访问**\n   - 已访问页面：**完全可用**\n   - 未访问页面：**部分可用**（关键资源已缓存）\n\n3. **重复访问**\n   - 资源加载：**网络 → 缓存**（提升 90%+）\n   - 用户体验：**秒开**（<100ms）\n\n## 前端体验优化建议\n\n### 1. 资源加载优化\n\n- ✅ **已实现**：\n  - 只预缓存关键资源（入口 JS、vendor、入口 CSS、logo）\n  - 路由组件的 CSS 和 JS **不预缓存**，按需加载\n  - 访问登录页时只加载登录页资源，不会加载系统大部分资源\n- 💡 **建议**：确保静态资源（图片、字体）使用 CDN，配合缓存策略\n\n### 2. 网络策略优化\n\n- ✅ **已实现**：JS chunk 使用 NetworkFirst（3s 超时）\n- 💡 **建议**：可根据实际网络情况调整 `networkTimeoutSeconds`\n  - 弱网环境：可适当增加超时时间（5-8s）\n  - 强网环境：可减少超时时间（1-2s）\n\n### 3. 缓存策略优化\n\n- ✅ **已实现**：CSS、图片使用 CacheFirst（30天）\n- 💡 **建议**：\n  - 静态资源（logo、图标）：可延长至 90-180 天\n  - 业务图片：保持 30 天，确保内容更新及时\n\n### 4. 存储空间管理\n\n- ✅ **已实现**：按需加载 chunk 限制 100 个，7 天过期\n- 💡 **建议**：\n  - 监控缓存使用情况（Chrome DevTools → Application → Storage）\n  - 根据用户访问模式调整 `maxEntries` 和 `maxAgeSeconds`\n\n### 5. 用户体验优化\n\n- ✅ **已实现**：Service Worker 后台注册，不阻塞页面加载\n- 💡 **建议**：\n  - 添加加载提示（可选）：显示\"正在准备离线功能\"\n  - 错误处理：Service Worker 注册失败时优雅降级\n\n### 6. 性能监控\n\n建议监控以下指标：\n- **FCP（First Contentful Paint）**：目标 < 1.5s\n- **LCP（Largest Contentful Paint）**：目标 < 2.5s\n- **TTI（Time to Interactive）**：目标 < 3.5s\n- **缓存命中率**：目标 > 80%\n\n## 注意事项\n\n1. **仅生产环境生效** - 开发环境默认禁用\n2. **HTTPS 要求** - Service Worker 仅在 HTTPS 或 localhost 下工作\n3. **注册代码内联** - 使用 `injectRegister: 'inline'` 避免 `registerSW.js` 缓存问题\n4. **手动注册** - Service Worker 通过内联代码自动注册，但**不包含自动更新检测功能**\n5. **按需加载适配** - 配置已优化适配 Vue Router 的按需加载，只预缓存关键资源，路由组件 chunk 按需缓存\n\n## 禁用 PWA\n\n如需禁用 PWA 功能，在 `build/vite/plugin/index.ts` 中注释：\n\n```typescript\n// vitePlugins.push(configPwaPlugin(isBuild));\n```\n\n## 故障排查\n\n### 清除 Service Worker\n\n浏览器控制台执行：\n\n```javascript\nnavigator.serviceWorker.getRegistrations().then(registrations => {\n  registrations.forEach(registration => registration.unregister());\n});\n```\n\n### 检查 Service Worker 状态\n\n- Chrome DevTools → Application → Service Workers\n- 查看注册状态和缓存内容\n"
  },
  {
    "path": "jeecgboot-vue3/README.md",
    "content": "JeecgBoot 企业级低代码开发平台\n===============\n当前最新版本： 3.9.1（预计发布时间：2026-01-22）\n\n[![AUR](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE)\n[![](https://img.shields.io/badge/Author-北京国炬软件-orange.svg)](http://jeecg.com/aboutusIndex)\n[![](https://img.shields.io/badge/version-3.9.1-brightgreen.svg)](https://github.com\n/zhangdaiscott/jeecg-boot)\n[![GitHub stars](https://img.shields.io/github/stars/zhangdaiscott/jeecg-boot.svg?style=social&label=Stars)](https://github.com/zhangdaiscott/jeecg-boot)\n[![GitHub forks](https://img.shields.io/github/forks/zhangdaiscott/jeecg-boot.svg?style=social&label=Fork)](https://github.com/zhangdaiscott/jeecg-boot)\n\n\n\n## 简介\nJeecgBoot-Vue3采用 Vue3.0、Vite、 Ant-Design-Vue4、TypeScript 等新技术方案，包括二次封装组件、utils、hooks、动态菜单、权限校验、按钮级别权限控制等功能。\n \n> 强大的代码生成器让前后端代码一键生成! JeecgBoot引领低代码开发模式(OnlineCoding-> 代码生成-> 手工MERGE)， 帮助解决Java项目70%的重复工作，让开发更多关注业务。既能快速提高效率，节省成本，同时又不失灵活性\n\n\n## 开发环境搭建\n\n- [前端开发环境准备](https://help.jeecg.com/setup/dev)\n- [前端项目快速启动](https://help.jeecg.com/setup/startup)\n- [通过IDEA启动项目](https://help.jeecg.com/java/setup/idea/startup)\n\n## 技术文档\n\n-   官方文档：[https://help.jeecg.com](https://help.jeecg.com)\n-   快速入门：[快速入门](http://jeecg.com/doc/quickstart) | [常见问题](http://help.jeecg.com/qa) \n-   QQ交流群：964611995、⑩716488839(满)、⑨808791225(满)、其他满\n-   在线演示 ：  [系统演示](http://boot3.jeecg.com)   | [APP演示](http://jeecg.com/appIndex)\n> 演示系统的登录账号密码，请点击 [获取账号密码](http://jeecg.com/doc/demo) 获取\n\n\n## 安装与使用\n\n*   本地环境安装 `Node.js 、npm 、pnpm`\n*   Node.js 版本要求`Node 20+` 版本以上\n\n ` ( 因为Vite5 不再支持已 EOL 的 Node.js 14 / 16 / 17 / 19，现在需要 Node 20+ )`\n\n\n  \n- Get the project code\n\n```bash\ngit clone https://github.com/jeecgboot/JeecgBoot.git\n```\n\n- Installation dependencies\n\n```bash\ncd JeecgBoot/jeecgboot-vue3\n\npnpm install\n```\n\n- 配置接口地址 `.env.development`\n\n```bash\nVITE_PROXY = [[\"/jeecgboot\",\"http://localhost:8080/jeecg-boot\"],[\"/upload\",\"http://localhost:3300/upload\"]]\nVITE_GLOB_DOMAIN_URL=http://localhost:8080/jeecg-boot\n```\n\n> 说明：把`http://localhost:8080/jeecg-boot` 换成自己地址，其他不用改。\n\n\n- run\n\n```bash\npnpm dev\n```\n\n\n- build\n\n```bash\npnpm build\n```\n\n## 入门必备\n\n本项目需要一定前端基础知识，请确保掌握 Vue 的基础知识，以便能处理一些常见的问题。 建议在开发前先学一下以下内容，提前了解和学习这些知识，会对项目理解非常有帮助:\n\n*   [JeecgBoot文档](http://help.jeecg.com)\n*   [Vue3 文档](https://cn.vuejs.org/)\n*   [Vben文档](https://doc.vvbin.cn)\n*   [Ant-Design-Vue](https://www.antdv.com/docs/vue/introduce-cn/)\n*   [TypeScript](https://www.typescriptlang.org/)\n*   [Vue-router](https://router.vuejs.org/zh)\n*   [Es6](https://es6.ruanyifeng.com/)\n*   [Vitejs](https://cn.vitejs.dev/guide/)\n*   [Pinia(vuex替代方案)](https://pinia.esm.dev/introduction.html)\n*   [Vue-RFCS](https://github.com/vuejs/rfcs)\n*   [vxetable文档](https://vxetable.cn)\n\n\n##   浏览器支持\n\n**本地开发**推荐使用`Chrome 最新版`浏览器，**不支持**`Chrome 90`以下版本。\n\n**生产环境**支持现代浏览器，不支持 IE。\n\n| [![IE](https://raw.githubusercontent.com/alrra/browser-logos/master/src/archive/internet-explorer_9-11/internet-explorer_9-11_48x48.png)](http://godban.github.io/browsers-support-badges/)IE | [![ Edge](https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png)](http://godban.github.io/browsers-support-badges/)Edge | [![Firefox](https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png)](http://godban.github.io/browsers-support-badges/)Firefox | [![Chrome](https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png)](http://godban.github.io/browsers-support-badges/)Chrome | [![Safari](https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png)](http://godban.github.io/browsers-support-badges/)Safari |\n| --- | --- | --- | --- | --- |\n| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions |\n"
  },
  {
    "path": "jeecgboot-vue3/build/config/themeConfig.ts",
    "content": "import { generate } from '@ant-design/colors';\nimport setting from '/@/settings/projectSetting';\n\n// 代码逻辑说明: 【JHHB-579】去掉写死的主题色，根据导航栏模式确定主题色\nexport const primaryColor = setting.themeColor;\nexport const darkMode = setting.themeMode;\ntype Fn = (...arg: any) => any;\n\ntype GenerateTheme = 'default' | 'dark';\n\nexport interface GenerateColorsParams {\n  mixLighten: Fn;\n  mixDarken: Fn;\n  tinycolor: any;\n  color?: string;\n}\n\nexport function generateAntColors(color: string, theme: GenerateTheme = 'default') {\n  return generate(color, {\n    theme,\n  });\n}\n\nexport function getThemeColors(color?: string) {\n  const tc = color || primaryColor;\n  const lightColors = generateAntColors(tc);\n  const primary = lightColors[5];\n  const modeColors = generateAntColors(primary, 'dark');\n\n  return [...lightColors, ...modeColors];\n}\n\nexport function generateColors({\n  color = primaryColor,\n  mixLighten,\n  mixDarken,\n  tinycolor,\n}: GenerateColorsParams) {\n  const arr = new Array(19).fill(0);\n  const lightens = arr.map((_t, i) => {\n    return mixLighten(color, i / 5);\n  });\n\n  const darkens = arr.map((_t, i) => {\n    return mixDarken(color, i / 5);\n  });\n\n  const alphaColors = arr.map((_t, i) => {\n    return tinycolor(color)\n      .setAlpha(i / 20)\n      .toRgbString();\n  });\n\n  const shortAlphaColors = alphaColors.map((item) => item.replace(/\\s/g, '').replace(/0\\./g, '.'));\n\n  const tinycolorLightens = arr\n    .map((_t, i) => {\n      return tinycolor(color)\n        .lighten(i * 5)\n        .toHexString();\n    })\n    .filter((item) => item !== '#ffffff');\n\n  const tinycolorDarkens = arr\n    .map((_t, i) => {\n      return tinycolor(color)\n        .darken(i * 5)\n        .toHexString();\n    })\n    .filter((item) => item !== '#000000');\n  return [\n    ...lightens,\n    ...darkens,\n    ...alphaColors,\n    ...shortAlphaColors,\n    ...tinycolorDarkens,\n    ...tinycolorLightens,\n  ].filter((item) => !item.includes('-'));\n}\n"
  },
  {
    "path": "jeecgboot-vue3/build/constant.ts",
    "content": "/**\n * The name of the configuration file entered in the production environment\n */\nexport const GLOB_CONFIG_FILE_NAME = '_app.config.js';\n\nexport const OUTPUT_DIR = 'dist';\n"
  },
  {
    "path": "jeecgboot-vue3/build/generate/generateModifyVars.ts",
    "content": "import { primaryColor } from '../config/themeConfig';\n// import { getThemeVariables } from 'ant-design-vue/dist/theme';\nimport { resolve } from 'path';\nimport { generate } from '@ant-design/colors';\nimport { theme } from 'ant-design-vue/lib';\nimport convertLegacyToken from 'ant-design-vue/lib/theme/convertLegacyToken';\nconst { defaultAlgorithm, defaultSeed } = theme;\n\nfunction generateAntColors(color: string, theme: 'default' | 'dark' = 'default') {\n  return generate(color, {\n    theme,\n  });\n}\n\n/**\n * less global variable\n */\nexport function generateModifyVars() {\n  const palettes = generateAntColors(primaryColor);\n  const primary = palettes[5];\n\n  const primaryColorObj: Record<string, string> = {};\n\n  for (let index = 0; index < 10; index++) {\n    primaryColorObj[`primary-${index + 1}`] = palettes[index];\n  }\n\n  const mapToken = defaultAlgorithm(defaultSeed);\n  const v3Token = convertLegacyToken(mapToken);\n  return {\n    ...v3Token,\n    // ...modifyVars,\n    // Used for global import to avoid the need to import each style file separately\n    // reference:  Avoid repeated references\n    hack: `true; @import (reference) \"${resolve('src/design/config.less')}\";`,\n    'primary-color': primary,\n    ...primaryColorObj,\n    'info-color': primary,\n    'processing-color': primary,\n    'success-color': '#55D187', //  Success color\n    'error-color': '#ED6F6F', //  False color\n    'warning-color': '#EFBD47', //   Warning color\n    //'border-color-base': '#EEEEEE',\n    'font-size-base': '14px', //  Main font size\n    'border-radius-base': '2px', //  Component/float fillet\n    'link-color': primary, //   Link color\n    'app-content-background': '#fafafa', //   Link color\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/build/generate/icon/index.ts",
    "content": "import path from 'path';\nimport fs from 'fs-extra';\nimport inquirer from 'inquirer';\nimport colors from 'picocolors';\nimport pkg from '../../../package.json';\n\nasync function generateIcon() {\n  const dir = path.resolve(process.cwd(), 'node_modules/@iconify/json');\n\n  const raw = await fs.readJSON(path.join(dir, 'collections.json'));\n\n  const collections = Object.entries(raw).map(([id, v]) => ({\n    ...(v as any),\n    id,\n  }));\n\n  const choices = collections.map((item) => ({ key: item.id, value: item.id, name: item.name }));\n\n  inquirer\n    .prompt([\n      {\n        type: 'list',\n        name: 'useType',\n        choices: [\n          { key: 'local', value: 'local', name: 'Local' },\n          { key: 'onLine', value: 'onLine', name: 'OnLine' },\n        ],\n        message: 'How to use icons?',\n      },\n      {\n        type: 'list',\n        name: 'iconSet',\n        choices: choices,\n        message: 'Select the icon set that needs to be generated?',\n      },\n      {\n        type: 'input',\n        name: 'output',\n        message: 'Select the icon set that needs to be generated?',\n        default: 'src/components/Icon/data',\n      },\n    ])\n    .then(async (answers) => {\n      const { iconSet, output, useType } = answers;\n      const outputDir = path.resolve(process.cwd(), output);\n      fs.ensureDir(outputDir);\n      const genCollections = collections.filter((item) => [iconSet].includes(item.id));\n      const prefixSet: string[] = [];\n      for (const info of genCollections) {\n        const data = await fs.readJSON(path.join(dir, 'json', `${info.id}.json`));\n        if (data) {\n          const { prefix } = data;\n          const isLocal = useType === 'local';\n          const icons = Object.keys(data.icons).map((item) => `${isLocal ? prefix + ':' : ''}${item}`);\n\n          await fs.writeFileSync(\n            path.join(output, `icons.data.ts`),\n            `export default ${isLocal ? JSON.stringify(icons) : JSON.stringify({ prefix, icons })}`\n          );\n          prefixSet.push(prefix);\n        }\n      }\n      fs.emptyDir(path.join(process.cwd(), 'node_modules/.vite'));\n      console.log(`✨ ${colors.cyan(`[${pkg.name}]`)}` + ' - Icon generated successfully:' + `[${prefixSet}]`);\n    });\n}\n\ngenerateIcon();\n"
  },
  {
    "path": "jeecgboot-vue3/build/getConfigFileName.ts",
    "content": "/**\n * Get the configuration file variable name\n * @param env\n */\nexport const getConfigFileName = (env: Record<string, any>) => {\n  return `__PRODUCTION__${env.VITE_GLOB_APP_SHORT_NAME || '__APP'}__CONF__`.toUpperCase().replace(/\\s/g, '');\n};\n"
  },
  {
    "path": "jeecgboot-vue3/build/script/buildConf.ts",
    "content": "/**\n * 生成外部配置文件，用于生产发布后配置，无需重新打包\n */\nimport { GLOB_CONFIG_FILE_NAME, OUTPUT_DIR } from '../constant';\nimport fs, { writeFileSync } from 'fs-extra';\nimport colors from 'picocolors';\n\nimport { getEnvConfig, getRootPath } from '../utils';\nimport { getConfigFileName } from '../getConfigFileName';\n\nimport pkg from '../../package.json';\n\ninterface CreateConfigParams {\n  configName: string;\n  config: any;\n  configFileName?: string;\n}\n\nfunction createConfig(params: CreateConfigParams) {\n  const { configName, config, configFileName } = params;\n  try {\n    const windowConf = `window.${configName}`;\n    // Ensure that the variable will not be modified\n    let configStr = `${windowConf}=${JSON.stringify(config)};`;\n    configStr += `\n      Object.freeze(${windowConf});\n      Object.defineProperty(window, \"${configName}\", {\n        configurable: false,\n        writable: false,\n      });\n    `.replace(/\\s/g, '');\n\n    fs.mkdirp(getRootPath(OUTPUT_DIR));\n    writeFileSync(getRootPath(`${OUTPUT_DIR}/${configFileName}`), configStr);\n\n    console.log(colors.cyan(`✨ [${pkg.name}]`) + ` - configuration file is build successfully:`);\n    console.log(colors.gray(OUTPUT_DIR + '/' + colors.green(configFileName)) + '\\n');\n\n    // 如果是 Electron 环境，还需要将配置文件写入到 JSON 文件中\n    if (config.VITE_GLOB_RUN_PLATFORM === 'electron') {\n      writeFileSync(getRootPath(`${OUTPUT_DIR}/electron/env.json`), JSON.stringify(config));\n      console.log(colors.cyan(`✨ [${pkg.name}]`) + ` - electron env file is build successfully:`);\n      console.log(colors.gray(OUTPUT_DIR + '/' + colors.green('electron/env.json')) + '\\n');\n    }\n\n  } catch (error) {\n    console.log(colors.red('configuration file configuration file failed to package:\\n' + error));\n  }\n}\n\nexport function runBuildConfig() {\n  const config = getEnvConfig();\n  const configFileName = getConfigFileName(config);\n  createConfig({ config, configName: configFileName, configFileName: GLOB_CONFIG_FILE_NAME });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/build/script/copyChat.ts",
    "content": "const fs = require('fs-extra');\nconst path = require('path');\n\nconst sourceDir = path.join(__dirname, '../../src/views/super/airag/aiapp/chat/js'); // 源目录\nconst destDir = path.join(__dirname, '../../dist', 'chat'); // 目标目录\n\n// 复制目录\nfs.copy(sourceDir, destDir)\n  .then(() => {\n    console.log(`成功将 ${sourceDir} 复制到 ${destDir}`);\n  })\n  .catch(err => {\n    console.error(`复制目录失败: ${err.message}`);\n  });"
  },
  {
    "path": "jeecgboot-vue3/build/script/postBuild.ts",
    "content": "// #!/usr/bin/env node\n\nimport { runBuildConfig } from './buildConf';\nimport colors from 'picocolors';\n\nimport pkg from '../../package.json';\n\nexport const runBuild = async () => {\n  try {\n    const argvList = process.argv.splice(2);\n\n    // Generate configuration file\n    if (!argvList.includes('disabled-config')) {\n      runBuildConfig();\n    }\n\n    console.log(`✨ ${colors.cyan(`[${pkg.name}]`)}` + ' - build successfully!');\n  } catch (error) {\n    console.log(colors.red('vite build error:\\n' + error));\n    process.exit(1);\n  }\n};\nrunBuild();\n"
  },
  {
    "path": "jeecgboot-vue3/build/utils.ts",
    "content": "import fs from 'fs';\nimport path from 'path';\nimport dotenv from 'dotenv';\n\nexport function isDevFn(mode: string): boolean {\n  return mode === 'development';\n}\n\nexport function isProdFn(mode: string): boolean {\n  return mode === 'production';\n}\n\n/**\n * Whether to generate package preview\n */\nexport function isReportMode(): boolean {\n  return process.env.REPORT === 'true';\n}\n\n// Read all environment variable configuration files to process.env\nexport function wrapperEnv(envConf: Recordable): ViteEnv {\n  const ret: any = {};\n\n  for (const envName of Object.keys(envConf)) {\n    let realName = envConf[envName].replace(/\\\\n/g, '\\n');\n    realName = realName === 'true' ? true : realName === 'false' ? false : realName;\n\n    if (envName === 'VITE_PORT') {\n      realName = Number(realName);\n    }\n    if (envName === 'VITE_PROXY' && realName) {\n      try {\n        realName = JSON.parse(realName.replace(/'/g, '\"'));\n      } catch (error) {\n        console.log(\"PARSE VITE PROXY ERROR:\", error);\n        realName = '';\n      }\n    }\n    ret[envName] = realName;\n    if (typeof realName === 'string') {\n      process.env[envName] = realName;\n    } else if (typeof realName === 'object') {\n      process.env[envName] = JSON.stringify(realName);\n    }\n  }\n  return ret;\n}\n\n/**\n * 获取当前环境下生效的配置文件名\n */\nfunction getConfFiles() {\n\n  // 代码逻辑说明: 【QQYUN-9685】构建 electron 桌面应用\n  const {VITE_GLOB_RUN_PLATFORM} = process.env\n  if (VITE_GLOB_RUN_PLATFORM === 'electron') {\n    return ['.env', '.env.prod_electron'];\n  }\n\n  const script = process.env.npm_lifecycle_script;\n  // 代码逻辑说明: 【QQYUN-8690】修正获取当前环境下的文件名\n  const reg = new RegExp('NODE_ENV=([a-z_\\\\d]+)');\n  const result = reg.exec(script as string) as any;\n  if (result) {\n    const mode = result[1] as string;\n    return ['.env', `.env.${mode}`];\n  }\n  return ['.env', '.env.production'];\n}\n\n/**\n * Get the environment variables starting with the specified prefix\n * @param match prefix\n * @param confFiles ext\n */\nexport function getEnvConfig(match = 'VITE_GLOB_', confFiles = getConfFiles()) {\n  let envConfig = {};\n  confFiles.forEach((item) => {\n    try {\n      const env = dotenv.parse(fs.readFileSync(path.resolve(process.cwd(), item)));\n      envConfig = { ...envConfig, ...env };\n    } catch (e) {\n      console.error(`Error in parsing ${item}`, e);\n    }\n  });\n  const reg = new RegExp(`^(${match})`);\n  Object.keys(envConfig).forEach((key) => {\n    if (!reg.test(key)) {\n      Reflect.deleteProperty(envConfig, key);\n    }\n  });\n  return envConfig;\n}\n\n/**\n * Get user root directory\n * @param dir file path\n */\nexport function getRootPath(...dir: string[]) {\n  return path.resolve(process.cwd(), ...dir);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/build/vite/plugin/compress.ts",
    "content": "/**\n * Used to package and output gzip. Note that this does not work properly in Vite, the specific reason is still being investigated\n * https://github.com/anncwb/vite-plugin-compression\n */\nimport type { PluginOption } from 'vite';\nimport compressPlugin from 'vite-plugin-compression';\n\nexport function configCompressPlugin(compress: 'gzip' | 'brotli' | 'none', deleteOriginFile = false): PluginOption | PluginOption[] {\n  const compressList = compress.split(',');\n\n  const plugins: PluginOption[] = [];\n\n  if (compressList.includes('gzip')) {\n    plugins.push(\n      compressPlugin({\n        verbose: true,\n        disable: false,\n        threshold: 10240,\n        algorithm: 'gzip',\n        ext: '.gz',\n        deleteOriginFile,\n      })\n    );\n  }\n\n  if (compressList.includes('brotli')) {\n    plugins.push(\n      compressPlugin({\n        ext: '.br',\n        algorithm: 'brotliCompress',\n        deleteOriginFile,\n      })\n    );\n  }\n  return plugins;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/build/vite/plugin/electron.ts",
    "content": "// import electron from 'vite-plugin-electron/simple'\n//\n// export function configElectronPlugin(_viteEnv: ViteEnv, isBuild: boolean) {\n//   return electron({\n//     main: {\n//       // 主进程入口\n//       entry: 'electron/main.ts',\n//       vite: {\n//         build: {\n//           sourcemap: !isBuild,\n//           outDir: 'dist/electron',\n//         },\n//       },\n//       onstart: ({startup}) => {\n//         // 开发热重载\n//         startup()\n//       },\n//     },\n//     preload: {\n//       input: 'electron/preload/index.ts',\n//       vite: {\n//         build: {\n//           sourcemap: !isBuild,\n//           outDir: 'dist/electron/preload',\n//         },\n//       },\n//       onstart: ({startup}) => {\n//         // 开发热重载\n//         startup()\n//       },\n//     }\n//   })\n//\n// }\n"
  },
  {
    "path": "jeecgboot-vue3/build/vite/plugin/html.ts",
    "content": "/**\n * Plugin to minimize and use ejs template syntax in index.html.\n * https://github.com/anncwb/vite-plugin-html\n */\nimport type { PluginOption } from 'vite';\nimport { createHtmlPlugin } from 'vite-plugin-html';\nimport pkg from '../../../package.json';\nimport { GLOB_CONFIG_FILE_NAME } from '../../constant';\n\nexport function configHtmlPlugin(env: ViteEnv, isBuild: boolean, isQiankunMicro: boolean) {\n  const { VITE_GLOB_APP_TITLE, VITE_PUBLIC_PATH } = env;\n\n  const path = VITE_PUBLIC_PATH.endsWith('/') ? VITE_PUBLIC_PATH : `${VITE_PUBLIC_PATH}/`;\n\n  const getAppConfigSrc = () => {\n    return `${path || '/'}${GLOB_CONFIG_FILE_NAME}?v=${pkg.version}-${new Date().getTime()}`;\n  };\n\n  // 【JEECG作为乾坤子应用】补充静态资源前缀\n  const {VITE_GLOB_QIANKUN_MICRO_APP_ENTRY} = env;\n  const basePublicPath = isQiankunMicro ? VITE_GLOB_QIANKUN_MICRO_APP_ENTRY : '';\n\n  const htmlPlugin: PluginOption[] = createHtmlPlugin({\n    minify: isBuild,\n    inject: {\n      // 修改模板html的标题\n      data: {\n        title: VITE_GLOB_APP_TITLE,\n        basePublicPath: basePublicPath,\n      },\n      // 将app.config.js文件注入到模板html中\n      tags: isBuild\n        ? [\n            {\n              tag: 'script',\n              attrs: {\n                src: getAppConfigSrc(),\n              },\n            },\n          ]\n        : [],\n    },\n  });\n  return htmlPlugin;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/build/vite/plugin/imagemin.ts",
    "content": "// 【图片压缩插件】\n// Image resource files used to compress the output of the production environment\n// https://github.com/anncwb/vite-plugin-imagemin\nimport viteImagemin from 'vite-plugin-imagemin';\n\nexport function configImageminPlugin() {\n  const plugin = viteImagemin({\n    gifsicle: {\n      optimizationLevel: 7,\n      interlaced: false,\n    },\n    optipng: {\n      optimizationLevel: 7,\n    },\n    mozjpeg: {\n      quality: 20,\n    },\n    pngquant: {\n      quality: [0.8, 0.9],\n      speed: 4,\n    },\n    svgo: {\n      plugins: [\n        {\n          name: 'removeViewBox',\n        },\n        {\n          name: 'removeEmptyAttrs',\n          active: false,\n        },\n      ],\n    },\n  });\n  return plugin;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/build/vite/plugin/index.ts",
    "content": "import { PluginOption } from 'vite';\nimport vue from '@vitejs/plugin-vue';\nimport vueJsx from '@vitejs/plugin-vue-jsx';\nimport purgeIcons from 'vite-plugin-purge-icons';\nimport UnoCSS from 'unocss/vite';\nimport { presetTypography, presetUno } from 'unocss';\n\n// 本地调试https配置方法\nimport VitePluginCertificate from 'vite-plugin-mkcert';\n//[issues/555]开发环境，vscode断点调试，文件或行数对不上\nimport vueSetupExtend from 'vite-plugin-vue-setup-extend-plus';\nimport { configHtmlPlugin } from './html';\nimport { configMockPlugin } from './mock';\nimport { configCompressPlugin } from './compress';\nimport { configVisualizerConfig } from './visualizer';\nimport { configThemePlugin } from './theme';\nimport { configSvgIconsPlugin } from './svgSprite';\nimport { configQiankunMicroPlugin } from './qiankunMicro';\nimport { configPwaPlugin } from './pwa';\n// // electron plugin\n// import { configElectronPlugin } from \"./electron\";\n// //预编译加载插件(不支持vite3作废)\n// import OptimizationPersist from 'vite-plugin-optimize-persist';\n// import PkgConfig from 'vite-plugin-package-config';\n\n/**\n *\n * @param viteEnv\n * @param isBuild\n * @param isQiankunMicro 是否【JEECG作为乾坤子应用】\n */\nexport function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean, isQiankunMicro: boolean) {\n  const { VITE_USE_MOCK, VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE } = viteEnv;\n\n  const vitePlugins: (PluginOption | PluginOption[])[] = [\n    // have to\n    vue(),\n    // have to\n    vueJsx(),\n    // support name\n    vueSetupExtend(),\n    // @ts-ignore\n    VitePluginCertificate({\n      source: 'coding',\n    }),\n  ];\n\n  vitePlugins.push(UnoCSS({ presets: [presetUno(), presetTypography()] }));\n\n  // vite-plugin-html\n  vitePlugins.push(configHtmlPlugin(viteEnv, isBuild, isQiankunMicro));\n\n  // vite-plugin-svg-icons\n  vitePlugins.push(configSvgIconsPlugin(isBuild));\n\n  // vite-plugin-mock\n  VITE_USE_MOCK && vitePlugins.push(configMockPlugin(isBuild));\n\n  // vite-plugin-purge-icons\n  vitePlugins.push(purgeIcons());\n\n  // rollup-plugin-visualizer\n  vitePlugins.push(configVisualizerConfig());\n\n  // vite-plugin-theme\n  vitePlugins.push(configThemePlugin(isBuild));\n\n  // 【JEECG作为乾坤子应用】注册乾坤子应用模式插件\n  if (isQiankunMicro) {\n    // vite-plugin-qiankun\n    vitePlugins.push(...configQiankunMicroPlugin(viteEnv))\n  }\n\n  // // electron plugin\n  const isElectron = viteEnv.VITE_GLOB_RUN_PLATFORM === 'electron';\n  // if (isElectron) {\n  //   vitePlugins.push(configElectronPlugin(viteEnv, isBuild))\n  // }\n\n  // The following plugins only work in the production environment\n  if (isBuild) {\n    \n    // rollup-plugin-gzip\n    vitePlugins.push(configCompressPlugin(VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE));\n\n    // vite-plugin-pwa (PWA 插件注册)\n    if (!isElectron) {\n      vitePlugins.push(configPwaPlugin(isBuild));\n    }\n  }\n\n  // //vite-plugin-theme【预编译加载插件，解决vite首次打开界面加载慢问题】\n  // vitePlugins.push(PkgConfig());\n  // vitePlugins.push(OptimizationPersist());\n  return vitePlugins;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/build/vite/plugin/mock.ts",
    "content": "/**\n * Mock plugin for development and production.\n * https://github.com/anncwb/vite-plugin-mock\n */\nimport { viteMockServe } from 'vite-plugin-mock';\n\nexport function configMockPlugin(isBuild: boolean) {\n  return viteMockServe({\n    ignore: /^\\_/,\n    mockPath: 'mock',\n    localEnabled: !isBuild,\n    prodEnabled: isBuild,\n    injectCode: `\n      import { setupProdMockServer } from '../mock/_createProductionServer';\n\n      setupProdMockServer();\n      `,\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/build/vite/plugin/pwa.ts",
    "content": "/**\n * PWA 插件配置 - 适配按需加载\n */\nimport { VitePWA } from 'vite-plugin-pwa';\nimport type { VitePWAOptions } from 'vite-plugin-pwa';\nimport type { PluginOption } from 'vite';\n\nexport function configPwaPlugin(isBuild: boolean): PluginOption | PluginOption[] {\n  if (!isBuild) {\n    console.log('非生产环境不启用 PWA 插件!');\n    return [];\n  }\n\n  const pwaOptions: Partial<VitePWAOptions> = {\n    registerType: 'manual',\n    injectRegister: 'inline', // 将 Service Worker 注册代码内联到 HTML 中，避免缓存问题\n    includeAssets: ['favicon.ico', 'logo.png'],\n    manifest: {\n      name: 'JeecgBoot',\n      short_name: 'Jeecg',\n      theme_color: '#ffffff',\n      icons: [\n        {\n          src: '/logo.png',\n          sizes: '192x192',\n          type: 'image/png',\n        },\n        {\n          src: '/logo.png',\n          sizes: '512x512',\n          type: 'image/png',\n        },\n      ],\n    },\n    workbox: {\n      maximumFileSizeToCacheInBytes: 10 * 1024 * 1024, // 10MB\n      cleanupOutdatedCaches: true,\n      \n      // 预缓存：只缓存关键资源，不预缓存路由组件 CSS/JS（避免登录页加载全部资源）\n      globPatterns: [\n        'index.html', // 必须预缓存（避免 non-precached-url 错误）\n        'manifest.webmanifest',\n        'assets/index-*.css', // 仅入口 CSS\n        'favicon.ico',\n        'logo.png',\n        'js/index-*.js',\n        'js/*-vendor-*.js',\n      ],\n      \n      // 不使用导航回退功能\n      navigateFallback: undefined,\n      \n      // 运行时缓存：按需加载的资源\n      runtimeCaching: [\n        {\n          urlPattern: /\\/js\\/.*\\.js$/i,\n          handler: 'NetworkFirst',\n          options: {\n            cacheName: 'js-chunks-cache',\n            networkTimeoutSeconds: 3,\n            expiration: {\n              maxEntries: 100,\n              maxAgeSeconds: 60 * 60 * 24 * 7, // 7天\n            },\n            cacheableResponse: {\n              statuses: [0, 200],\n            },\n          },\n        },\n        {\n          urlPattern: /\\/assets\\/.*\\.css$/i,\n          handler: 'CacheFirst',\n          options: {\n            cacheName: 'css-cache',\n            expiration: {\n              maxEntries: 50,\n              maxAgeSeconds: 60 * 60 * 24 * 30, // 30天\n            },\n            cacheableResponse: {\n              statuses: [0, 200],\n            },\n          },\n        },\n        // Google Fonts\n        {\n          urlPattern: /^https:\\/\\/fonts\\.googleapis\\.com\\/.*/i,\n          handler: 'CacheFirst',\n          options: {\n            cacheName: 'google-fonts-cache',\n            expiration: {\n              maxEntries: 10,\n              maxAgeSeconds: 60 * 60 * 24 * 365,\n            },\n            cacheableResponse: {\n              statuses: [0, 200],\n            },\n          },\n        },\n        // 图片资源\n        {\n          urlPattern: /\\.(?:png|jpg|jpeg|svg|gif|webp)$/,\n          handler: 'CacheFirst',\n          options: {\n            cacheName: 'image-cache',\n            expiration: {\n              maxEntries: 100,\n              maxAgeSeconds: 60 * 60 * 24 * 30,\n            },\n          },\n        },\n        // API 请求\n        {\n          urlPattern: /\\/api\\/.*/i,\n          handler: 'NetworkFirst',\n          options: {\n            cacheName: 'api-cache',\n            networkTimeoutSeconds: 10,\n            expiration: {\n              maxEntries: 50,\n              maxAgeSeconds: 60 * 5,\n            },\n            cacheableResponse: {\n              statuses: [0, 200],\n            },\n          },\n        },\n      ],\n      // 启用立即更新：新 SW 立即激活并接管页面\n      skipWaiting: true,\n      clientsClaim: true,\n    },\n    devOptions: {\n      enabled: false,\n    },\n  };\n\n  return VitePWA(pwaOptions);\n}\n\n"
  },
  {
    "path": "jeecgboot-vue3/build/vite/plugin/qiankunMicro.ts",
    "content": "import qiankun from 'vite-plugin-qiankun';\n\n/**\n * 【JEECG作为乾坤子应用】Vite适配乾坤以子应用模式运行\n * @param env\n */\nexport function configQiankunMicroPlugin(env: ViteEnv) {\n  const {VITE_GLOB_QIANKUN_MICRO_APP_NAME} = env\n\n  return [\n    qiankun(VITE_GLOB_QIANKUN_MICRO_APP_NAME!, {\n      useDevMode: true,\n    })\n  ]\n\n}\n"
  },
  {
    "path": "jeecgboot-vue3/build/vite/plugin/styleImport.ts",
    "content": "/**\n * 【样式按需加载插件 ——主要处理antd的样式】\n *  Introduces component library styles on demand.\n * https://github.com/anncwb/vite-plugin-style-import\n */\nimport { createStyleImportPlugin } from 'vite-plugin-style-import';\n\nexport function configStyleImportPlugin(_isBuild: boolean) {\n  if (!_isBuild) {\n    return [];\n  }\n  const styleImportPlugin = createStyleImportPlugin({\n    libs: [\n      {\n        libraryName: 'ant-design-vue',\n        esModule: true,\n        resolveStyle: (name) => {\n          // 这里是无需额外引入样式文件的“子组件”列表\n          const ignoreList = [\n            'anchor-link',\n            'sub-menu',\n            'menu-item',\n            'menu-divider',\n            'menu-item-group',\n            'breadcrumb-item',\n            'breadcrumb-separator',\n            'form-item',\n            'step',\n            'select-option',\n            'select-opt-group',\n            'card-grid',\n            'card-meta',\n            'collapse-panel',\n            'descriptions-item',\n            'list-item',\n            'list-item-meta',\n            'table-column',\n            'table-column-group',\n            'tab-pane',\n            'tab-content',\n            'timeline-item',\n            'tree-node',\n            'skeleton-input',\n            'skeleton-avatar',\n            'skeleton-title',\n            'skeleton-paragraph',\n            'skeleton-image',\n            'skeleton-button',\n          ];\n          // 这里是需要额外引入样式的子组件列表\n          // 单独引入子组件时需引入组件样式，否则会在打包后导致子组件样式丢失\n          const replaceList = {\n            'typography-text': 'typography',\n            'typography-title': 'typography',\n            'typography-paragraph': 'typography',\n            'typography-link': 'typography',\n            'dropdown-button': 'dropdown',\n            'input-password': 'input',\n            'input-search': 'input',\n            'input-group': 'input',\n            'radio-group': 'radio',\n            'checkbox-group': 'checkbox',\n            'layout-sider': 'layout',\n            'layout-content': 'layout',\n            'layout-footer': 'layout',\n            'layout-header': 'layout',\n            'month-picker': 'date-picker',\n            'range-picker': 'date-picker',\n            'image-preview-group': 'image',\n          };\n\n          return ignoreList.includes(name)\n            ? ''\n            : replaceList.hasOwnProperty(name)\n            ? `ant-design-vue/es/${replaceList[name]}/style/index`\n            : `ant-design-vue/es/${name}/style/index`;\n        },\n      },\n    ],\n  });\n  return styleImportPlugin;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/build/vite/plugin/svgSprite.ts",
    "content": "/**\n *  Vite Plugin for fast creating SVG sprites.\n * https://github.com/anncwb/vite-plugin-svg-icons\n */\n\nimport { createSvgIconsPlugin } from 'vite-plugin-svg-icons';\nimport path from 'path';\n\nexport function configSvgIconsPlugin(isBuild: boolean) {\n  const svgIconsPlugin = createSvgIconsPlugin({\n    iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],\n    svgoOptions: isBuild,\n    // default\n    symbolId: 'icon-[dir]-[name]',\n  });\n  return svgIconsPlugin;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/build/vite/plugin/theme.ts",
    "content": "/**\n * Vite plugin for website theme color switching\n * https://github.com/anncwb/vite-plugin-theme\n */\nimport type { PluginOption } from 'vite';\nimport path from 'path';\nimport { viteThemePlugin, antdDarkThemePlugin, mixLighten, mixDarken, tinycolor } from '@rys-fe/vite-plugin-theme';\nimport { getThemeColors, generateColors } from '../../config/themeConfig';\nimport { generateModifyVars } from '../../generate/generateModifyVars';\n\nexport function configThemePlugin(isBuild: boolean): PluginOption[] {\n  const colors = generateColors({\n    mixDarken,\n    mixLighten,\n    tinycolor,\n  });\n\n  // update-begin-修复编译后主题色切换不生效黑屏的问题-----------------------\n  // https://github.com/vbenjs/vue-vben-admin/issues/1445\n  // 抽取出viteThemePlugin插件，下方会根据不同环境设置enforce\n  const vite_theme_plugin = viteThemePlugin({\n    resolveSelector: (s) => {\n      s = s.trim();\n      switch (s) {\n        case '.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon':\n          return '.ant-steps-item-icon > .ant-steps-icon';\n        case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled)':\n        case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover':\n        case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active':\n          return s;\n        case '.ant-steps-item-icon > .ant-steps-icon':\n          return s;\n        case '.ant-select-item-option-selected:not(.ant-select-item-option-disabled)':\n          return s;\n        default:\n          if (s.indexOf('.ant-btn') >= -1) {\n            // 按钮被重新定制过，需要过滤掉class防止覆盖\n            return s;\n          }\n      }\n      return s.startsWith('[data-theme') ? s : `[data-theme] ${s}`;\n    },\n    colorVariables: [...getThemeColors(), ...colors],\n  });\n  vite_theme_plugin.forEach(function (item) {\n    //对vite:theme插件特殊配置\n    if ('vite:theme' === item.name) {\n      // 打包时去除enforce: \"post\"，vite 2.6.x适配，否则生成app-theme-style为空，因为async transform(code, id) {的code没有正确获取\n      if (isBuild) {\n        delete item.enforce;\n      }\n    }\n  });\n  // update-end-修复编译后主题色切换不生效黑屏的问题-----------------------\n\n  const plugin = [\n    vite_theme_plugin,\n    antdDarkThemePlugin({\n      preloadFiles: [\n        // path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/reset.css'),\n        //path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/antd.dark.less'),\n        path.resolve(process.cwd(), 'src/design/index.less'),\n      ],\n      filter: (id) => (isBuild ? !id.endsWith('antd.less') : true),\n      // extractCss: false,\n      darkModifyVars: {\n        ...generateModifyVars(true),\n        'text-color': '#c9d1d9',\n        'primary-1': 'rgb(255 255 255 / 8%)',\n        'text-color-base': '#c9d1d9',\n        'component-background': '#151515',\n        'heading-color': 'rgb(255 255 255 / 65%)',\n        // black: '#0e1117',\n        // #8b949e\n        'text-color-secondary': '#8b949e',\n        'border-color-base': '#303030',\n        'header-light-bottom-border-color': '#303030',\n        // 'border-color-split': '#30363d',\n        'item-active-bg': '#111b26',\n        'app-content-background': '#1e1e1e',\n        'tree-node-selected-bg': '#11263c',\n\n        'alert-success-border-color': '#274916',\n        'alert-success-bg-color': '#162312',\n        'alert-success-icon-color': '#49aa19',\n        'alert-info-border-color': '#153450',\n        'alert-info-bg-color': '#111b26',\n        'alert-info-icon-color': '#177ddc',\n        'alert-warning-border-color': '#594214',\n        'alert-warning-bg-color': '#2b2111',\n        'alert-warning-icon-color': '#d89614',\n        'alert-error-border-color': '#58181c',\n        'alert-error-bg-color': '#2a1215',\n        'alert-error-icon-color': '#a61d24',\n      },\n    }),\n  ];\n\n  return plugin as unknown as PluginOption[];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/build/vite/plugin/visualizer.ts",
    "content": "/**\n * Package file volume analysis\n */\nimport visualizer from 'rollup-plugin-visualizer';\nimport { isReportMode } from '../../utils';\n\nexport function configVisualizerConfig() {\n  if (isReportMode()) {\n    return visualizer({\n      filename: './node_modules/.cache/visualizer/stats.html',\n      open: true,\n      gzipSize: true,\n      brotliSize: true,\n    }) as Plugin;\n  }\n  return [];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/build/vite/proxy.ts",
    "content": "/**\n * Used to parse the .env.development proxy configuration\n */\nimport type { ProxyOptions } from 'vite';\n\ntype ProxyItem = [string, string];\n\ntype ProxyList = ProxyItem[];\n\ntype ProxyTargetList = Record<string, ProxyOptions>;\n\nconst httpsRE = /^https:\\/\\//;\n\n/**\n * Generate proxy\n * @param list\n */\nexport function createProxy(list: ProxyList = []) {\n  const ret: ProxyTargetList = {};\n  for (const [prefix, target] of list) {\n    const isHttps = httpsRE.test(target);\n\n    // https://github.com/http-party/node-http-proxy#options\n    ret[prefix] = {\n      target: target,\n      changeOrigin: true,\n      ws: true,\n      rewrite: (path) => path.replace(new RegExp(`^${prefix}`), ''),\n      // https is require secure=false\n      ...(isHttps ? { secure: false } : {}),\n    };\n  }\n  return ret;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/commitlint.config.js",
    "content": "module.exports = {\n  ignores: [(commit) => commit.includes('init')],\n  extends: ['@commitlint/config-conventional'],\n  rules: {\n    'body-leading-blank': [2, 'always'],\n    'footer-leading-blank': [1, 'always'],\n    'header-max-length': [2, 'always', 108],\n    'subject-empty': [2, 'never'],\n    'type-empty': [2, 'never'],\n    'type-enum': [\n      2,\n      'always',\n      [\n        'feat',\n        'fix',\n        'perf',\n        'style',\n        'docs',\n        'test',\n        'refactor',\n        'build',\n        'ci',\n        'chore',\n        'revert',\n        'wip',\n        'workflow',\n        'types',\n        'release',\n      ],\n    ],\n  },\n};\n"
  },
  {
    "path": "jeecgboot-vue3/electron/env.ts",
    "content": "// 不能直接使用 process.env，会报错\nexport const $ps = process;\n\nexport const isDev = !!$ps.env.VITE_DEV_SERVER_URL;\n\nexport const $env = getEnv();\n\nfunction getEnv() {\n  if (isDev) {\n    return $ps.env;\n  }\n  // 非开发环境，从 JSON 文件中获取环境变量\n  const env = require('./env.json');\n  return {\n    ...$ps.env,\n    ...env,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/electron/ipc/index.ts",
    "content": "import { Tray, ipcMain, BrowserWindow, app, Notification } from 'electron';\nimport type { NotificationConstructorOptions, IpcMainInvokeEvent } from 'electron';\nimport { openInBrowser } from '../utils';\nimport { omit } from 'lodash-es';\n\nipcMain.on('open-in-browser', (event: IpcMainInvokeEvent, url: string) => openInBrowser(url));\n// 处理任务栏闪烁\nipcMain.on('notify-flash', (event: IpcMainInvokeEvent, count: number = 0) => {\n  const win = BrowserWindow.getAllWindows()[0];\n  if (!win) return;\n  if (win.isFocused()) return;\n  if (process.platform === 'win32') {\n    // windows\n    win.flashFrame(true);\n  } else if (process.platform === 'darwin') {\n    // Mac\n    if (app.dock) {\n      app.dock.bounce('informational');\n      // 设置角标(未读消息)\n      if (count > 0) {\n        app.dock.setBadge(count.toString());\n      } else {\n        app.dock.setBadge('');\n      }\n    }\n  }\n});\n// 通知 (点击通知打开指定页面)\nipcMain.on('notify-with-path', (event: IpcMainInvokeEvent, options: NotificationConstructorOptions & { path: string }) => {\n  const win = BrowserWindow.getAllWindows()[0];\n  if (!win) return;\n  if (win.isFocused()) return;\n  const notification = new Notification({\n    ...omit(options, 'path'),\n  });\n  notification.on('click', () => {\n    if (win.isMinimized()) win.restore();\n    win.show();\n    win.focus();\n    // win.webContents.send('navigate-to', options.path);\n  });\n  notification.show();\n});\n"
  },
  {
    "path": "jeecgboot-vue3/electron/main.ts",
    "content": "import { app, BrowserWindow, Menu } from 'electron';\nimport { isDev } from './env';\nimport { createMainWindow, createIndexWindow } from './utils/window';\nimport { getAppInfo } from './utils';\nimport './ipc';\n\n// 隐藏所有菜单\nMenu.setApplicationMenu(null);\n\nlet mainWindow: BrowserWindow | null = null;\n\nfunction main() {\n  mainWindow = createMainWindow();\n  // 代码逻辑说明: 【JHHB-13】桌面应用消息通知\n  mainWindow.on('focus', () => {\n    // 清除任务栏闪烁\n    if (process.platform === 'win32') {\n      mainWindow!.flashFrame(false);\n    }\n  });\n  return mainWindow;\n}\n\n// 非开发环境，只允许一个实例运行\nif (!isDev) {\n  // 是否取得了单一实例锁\n  const gotTheLock = app.requestSingleInstanceLock();\n\n  if (gotTheLock) {\n    app.on('second-instance', () => {\n      // 开启一个新的窗口\n      createIndexWindow();\n    });\n  } else {\n    // 没有取得单一实例锁，则退出应用\n    app.exit(0);\n  }\n}\n\n// 生命周期管理\napp.whenReady().then(() => {\n  // 获取应用信息\n  const $appInfo = getAppInfo();\n  if ($appInfo?.productName && $appInfo?.appId) {\n    app.setName($appInfo.productName);\n    app.setAppUserModelId($appInfo.appId);\n  }\n\n  main();\n\n  app.on('activate', () => {\n    if (BrowserWindow.getAllWindows().length === 0) {\n      main();\n    }\n  });\n});\n\napp.on('window-all-closed', () => {\n  if (process.platform !== 'darwin') {\n    app.quit();\n  }\n});\n"
  },
  {
    "path": "jeecgboot-vue3/electron/paths.ts",
    "content": "import path from 'path'\nimport {isDev} from \"./env\";\n\nexport const _PATHS = getPaths()\n\nfunction getPaths() {\n  const _root = __dirname;\n  const publicRoot = path.join(_root, isDev ? '../../public' : '..');\n  const preloadRoot = path.join(_root, 'preload')\n\n  return {\n    electronRoot: _root,\n    publicRoot,\n    preloadRoot,\n\n    appIcon: path.join(_root, `icons/app.ico`).replace(/[\\\\/]dist[\\\\/]/, '/'),\n  }\n}"
  },
  {
    "path": "jeecgboot-vue3/electron/preload/index.ts",
    "content": "import { contextBridge, ipcRenderer } from 'electron';\nimport { ElectronEnum } from '../../src/enums/jeecgEnum';\n\ncontextBridge.exposeInMainWorld(ElectronEnum.ELECTRON_API, {\n  openInBrowser: (url: string) => ipcRenderer.send('open-in-browser', url),\n  // 发送消息通知\n  sendNotification: (title: string, body: string, path: string) => {\n    ipcRenderer.send('notify-with-path', { title, body, path });\n  },\n  // 绑定路由跳转\n  onNavigate: (cb: (path: string) => void) => {\n    ipcRenderer.on('navigate-to', (_, path) => cb(path));\n  },\n  // 任务栏闪\n  sendNotifyFlash: () => ipcRenderer.send('notify-flash'),\n  // 托盘闪动\n  trayFlash: () => ipcRenderer.send('tray-flash'),\n  // 托盘停止闪动\n  trayFlashStop: () => ipcRenderer.send('tray-flash-stop'),\n});\n"
  },
  {
    "path": "jeecgboot-vue3/electron/script/buildAfter.ts",
    "content": "console.log('build elctron is done.');"
  },
  {
    "path": "jeecgboot-vue3/electron/script/buildBefore.ts",
    "content": "import path from 'path';\nimport fs from 'fs';\n\nconst root = path.join(__dirname, '../../');\nconst electronDistRoot = path.join(root, 'dist/electron');\n\nlet yamlName = 'electron-builder.yaml';\nconst sourcePath = fs.readFileSync(path.join(root, yamlName), 'utf-8');\n\ntry {\n  // 通过正则表达式匹配 appId 和 productName\n  const appIdMatch = sourcePath.match(/appId:\\s*['\"]([^'\"]+)['\"]/);\n  const productNameMatch = sourcePath.match(/productName:\\s*['\"]([^'\"]+)['\"]/);\n  if (appIdMatch && productNameMatch) {\n    const fileContent = `${appIdMatch[0]}\\n${productNameMatch[0]}`;\n    yamlName = 'env.yaml';\n    const targetPath = path.join(electronDistRoot, yamlName);\n    fs.writeFileSync(targetPath, fileContent, 'utf-8');\n    console.log(`✨ write dist ${yamlName} successfully.`);\n  } else {\n    throw new Error('appId or productName not found');\n  }\n} catch (e) {\n  console.error(e);\n  console.error(`请检查 ${yamlName} 是否存在，或者内容是否正确`);\n  process.exit(1);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/electron/utils/index.ts",
    "content": "import fs from 'fs';\nimport path from 'path'\nimport {shell, dialog} from 'electron'\nimport {_PATHS} from \"../paths\";\nimport {isDev} from \"../env\";\n\n// 通过浏览器打开链接\nexport function openInBrowser(url: string) {\n  return shell.openExternal(url);\n}\n\n\nexport function getAppInfo(): any {\n  try {\n    const yamlPath = isDev ? path.join(_PATHS.publicRoot, '../electron-builder.yaml') : path.join(_PATHS.electronRoot, 'env.yaml');\n    const yamlContent = fs.readFileSync(yamlPath, 'utf-8');\n    // 通过正则表达式匹配 appId 和 productName\n    const appIdMatch = yamlContent.match(/appId:\\s*['\"]([^'\"]+)['\"]/);\n    const productNameMatch = yamlContent.match(/productName:\\s*['\"]([^'\"]+)['\"]/);\n    const appId = appIdMatch ? appIdMatch[1] : '';\n    const productName = productNameMatch ? productNameMatch[1] : '';\n    return {appId, productName}\n  } catch (e) {\n    dialog.showMessageBoxSync(null, {\n      type: 'error',\n      title: '错误',\n      message: '应用启动失败，请从官网下载最新版本安装包后重新安装！',\n    });\n    process.exit(-1);\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/electron/utils/tray.ts",
    "content": "// tray = 系统托盘\nimport path from 'path';\nimport { Tray, Menu, app, dialog, nativeImage, BrowserWindow, Notification, ipcMain } from 'electron';\nimport type { IpcMainInvokeEvent } from 'electron';\nimport {_PATHS} from '../paths';\nimport {$env, isDev} from '../env';\n\nconst TrayIcons = {\n  // 代码逻辑说明: 【JHHB-13】桌面应用消息通知\n  normal: nativeImage.createFromPath(\n    process.platform === 'win32'\n      ? path.join(_PATHS.publicRoot, 'logo.png')\n      : path.join(_PATHS.electronRoot, './icons/mac/tray-icon.png').replace(/[\\\\/]dist[\\\\/]/, '/')\n  ),\n  empty: nativeImage.createEmpty(),\n};\n\n// 创建托盘图标\nexport function createTray(win: BrowserWindow) {\n  const tray = new Tray(TrayIcons.normal);\n\n  const TrayUtils = useTray(tray, win);\n\n  tray.setToolTip($env.VITE_GLOB_APP_TITLE! + (isDev ? ' (开发环境)' : ''));\n\n  // 左键托盘图标显示主窗口\n  tray.on('click', () => TrayUtils.showMainWindow());\n  // 右键托盘图标显示托盘菜单\n  tray.on('right-click', () => showTrayContextMenu());\n\n  function showTrayContextMenu() {\n    const trayContextMenu = getTrayMenus(win, TrayUtils);\n    // 弹出托盘菜单，不使用 setContextMenu 方法是因为要实时更新菜单内容\n    tray.popUpContextMenu(trayContextMenu);\n  }\n}\n\nexport function useTray(tray: Tray, win: BrowserWindow) {\n  let isBlinking = false;\n  let blinkTimer: NodeJS.Timeout | null = null;\n\n  function showMainWindow() {\n    win.show();\n  }\n\n  // 开始闪动\n  function startBlink() {\n    isBlinking = true;\n    tray.setImage(TrayIcons.empty);\n    blinkTimer = setTimeout(() => {\n      tray.setImage(TrayIcons.normal);\n      setTimeout(() => {\n        if (isBlinking) {\n          startBlink();\n        }\n      }, 500);\n    }, 500);\n  }\n\n  // 结束闪动\n  function stopBlink() {\n    isBlinking = false;\n    if (blinkTimer) {\n      clearTimeout(blinkTimer);\n      blinkTimer = null;\n    }\n    tray.setImage(TrayIcons.normal);\n  }\n  ipcMain.on('tray-flash', (event: IpcMainInvokeEvent) => {\n    // 仅在 Windows 系统中闪烁\n    if (process.platform === 'win32') {\n      startBlink();\n    }\n  });\n  ipcMain.on('tray-flash-stop', (event: IpcMainInvokeEvent) => {\n    // 仅在 Windows 系统中停止闪烁\n    if (process.platform === 'win32') {\n      stopBlink();\n    }\n  });\n  win.on('focus', () => {\n    stopBlink();\n  });\n  // 发送桌面通知\n  function sendDesktopNotice() {\n    // 判断是否支持桌面通知\n    if (!Notification.isSupported()) {\n      // todo 实际开发中不需要提示，直接返回或者换一种提示方式\n      dialog.showMessageBoxSync(win, {\n        type: 'error',\n        title: '错误',\n        message: '当前系统不支持桌面通知',\n      });\n      return;\n    }\n    const ins = new Notification({\n      title: '通知标题',\n      body: '通知内容第一行\\n通知内容第二行',\n      // icon: TrayIcons.normal.resize({width: 32, height: 32}),\n    });\n\n    ins.on('click', () => {\n      dialog.showMessageBoxSync(win, {\n        type: 'info',\n        title: '提示',\n        message: '通知被点击',\n      });\n    });\n\n    ins.show();\n  }\n\n  return {\n    showMainWindow,\n\n    startBlink,\n    stopBlink,\n    isBlinking: () => isBlinking,\n\n    sendDesktopNotice,\n  };\n}\n\nconst MenuIcon = {\n  exit: nativeImage\n    .createFromDataURL(\n      'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACJ0lEQVR4nH1TzWvUQBRP7fpxsWqVXsSLiAevRWhhN28msRJo981kay4WRBCF/QdEFJpbaUHw4kFBQTwUKX4gKh48KPiBBcGLJ1F0uzPZ7ibWXf0DIjObielS+mDIm/fxm9/85sWyBixN06E0CIaV3wB2XhC8puOWNZSG4Y7B+k2mi7Kl9l2n9rHnzvbWJoLRYn7r5jTViQjwzM8ynlC+AFyVgN2NU8G+Rnn6QETx3FfP223A/jeHfWqCsAUJ7Hlryh9Te0nYqiDsz9rE6VHVIABvNwEf/ADYk4OsZPeVFbwiCHtcZBVR9k4CJhJmDuUxwEVJ8H4fINOkC9Vjbeq/UTR1IgPturX3f93Z35+B7ddxgJL6dih/skF9zE9KCJ//5bDLpii1+npIuzolKTubC5gBxzarJo6vWWjrUP+etFlF+ds9lRFOXalN+NPEmxvRDS3KH34v8+PFIgNmTh0EahH+InGCwzoQEbYcuTMnlR8aYbaxGHFvRNiznssP6sA65UsxrdU1+hYnFhlpAGAkdvzlPLFu88mY8pcrVjCsxcqGapC2eYW249/tUH4xS4QaVQLeigi/YWJqPl4DlNRSrAwzSaoXIspeWUYrI9qXINglgT1qAt5JPG+kkNN5BSAJuyoJfhAVdmST4PlPBFASNs6rIgnspqC8HlF+SQAuRQTfKpYiEy6fwuIdP42P71T+t0l/TBKcE8AXm4DXBfB6w50+apgUhf4HZ5j+Z5+zNTAAAAAASUVORK5CYII='\n    )\n    .resize({\n      width: 16,\n      height: 16,\n    }),\n};\n\n// 设置托盘菜单\nfunction getTrayMenus(win: BrowserWindow, TrayUtils: ReturnType<typeof useTray>) {\n  const {startBlink, stopBlink, sendDesktopNotice} = TrayUtils;\n  const isBlinking = TrayUtils.isBlinking();\n\n  return Menu.buildFromTemplate([\n    ...(isDev\n      ? [\n        {\n          label: '开发工具',\n          submenu: [\n            {\n              label: '以下菜单仅显示在开发环境',\n              sublabel: '当前为开发环境',\n              enabled: false,\n            },\n            {type: 'separator'},\n            {\n              label: '切换 DevTools',\n              click: () => win.webContents.toggleDevTools(),\n            },\n            {\n              label: `托盘图标${isBlinking ? '停止' : '开始'}闪烁`,\n              sublabel: '模拟新消息提醒',\n              click: () => (isBlinking ? stopBlink() : startBlink()),\n            },\n            {\n              label: '发送桌面通知示例',\n              click: () => sendDesktopNotice(),\n            },\n          ],\n        },\n        {type: 'separator'},\n      ]\n      : ([] as any)),\n    {\n      label: '显示主窗口',\n      // 文件图标\n      icon: TrayIcons.normal.resize({width: 16, height: 16}),\n      click: () => win.show(),\n    },\n    {type: 'separator'},\n    {\n      label: '退出',\n      // base64图标\n      icon: MenuIcon.exit,\n      click: () => {\n        // 弹出是否确认退出提示框\n        const choice = dialog.showMessageBoxSync(win, {\n          type: 'question',\n          title: '提示',\n          message: '确定要退出应用吗？',\n          buttons: ['退出', '取消'],\n          defaultId: 1,\n          cancelId: 1,\n          noLink: true,\n        });\n        // 用户选择了退出，直接 exit\n        if (choice === 0) {\n          // global.isQuitting = true;\n          app.exit(0);\n        }\n      },\n    },\n  ]);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/electron/utils/window.ts",
    "content": "import type {BrowserWindowConstructorOptions} from 'electron';\nimport {app, BrowserWindow, dialog} from 'electron';\nimport path from 'path';\nimport {_PATHS} from '../paths';\nimport {$env, isDev} from '../env';\nimport {createTray} from './tray';\n\n// 获取公共窗口选项\nexport function getBrowserWindowOptions(options?: BrowserWindowConstructorOptions): BrowserWindowConstructorOptions {\n  return {\n    width: 1200,\n    height: 800,\n    webPreferences: {\n      preload: path.join(_PATHS.preloadRoot, 'index.js'),\n      nodeIntegration: false,\n      contextIsolation: true,\n    },\n    // 应用图标\n    icon: isDev ? _PATHS.appIcon : void 0,\n    ...options,\n  }\n}\n\n// 创建窗口\nexport function createBrowserWindow(options?: BrowserWindowConstructorOptions) {\n  const win = new BrowserWindow(getBrowserWindowOptions(options));\n  // 代码逻辑说明: 【JHHB-13】桌面应用消息通知\n  if (process.platform === 'darwin') { // 仅 macOS 生效\n    if (app.dock) {\n      app.dock.setIcon(path.join(_PATHS.electronRoot, './icons/mac/dock.png').replace(/[\\\\/]dist[\\\\/]/, '/'));\n    }\n  }\n\n  // 设置窗口打开处理器\n  win.webContents.setWindowOpenHandler(() => {\n    return {\n      action: 'allow',\n      // 覆写新窗口的选项，用于调整默认尺寸和加载preload脚本等\n      overrideBrowserWindowOptions: getBrowserWindowOptions(),\n    }\n  });\n\n  // 当 beforeunload 阻止窗口关闭时触发\n  win.webContents.on('will-prevent-unload', () => {\n    const choice = dialog.showMessageBoxSync(win, {\n      type: 'question',\n      title: '确认关闭吗？',\n      message: '系统可能不会保存您所做的更改。',\n      buttons: ['关闭', '取消'],\n      defaultId: 1,\n      cancelId: 1,\n      noLink: true,\n    });\n    // 用户选择了关闭，直接销毁窗口\n    if (choice === 0) {\n      win.destroy();\n    }\n  });\n\n  return win;\n}\n\n// 创建主窗口、系统托盘\nexport function createMainWindow() {\n  const win = createIndexWindow()\n\n  // 设置系统托盘图标\n  createTray(win);\n\n  // 主窗口尝试关闭时，默认不直接退出应用，而是隐藏到托盘\n  win.on('close', (event) => {\n    event.preventDefault();\n    win.hide();\n  });\n\n  return win;\n}\n\n// 创建索引窗口\nexport function createIndexWindow() {\n  const win = createBrowserWindow({\n    width: 1600,\n    height: 1000,\n    title: $env.VITE_GLOB_APP_TITLE!,\n  });\n\n  // 开发环境加载Vite服务，生产加载打包文件\n  if (isDev) {\n    let serverUrl = $env.VITE_DEV_SERVER_URL! as string;\n    // 【JHHB-936】由于wps预览不能使用localhost访问，所以把localhost替换为127.0.0.1\n    serverUrl = serverUrl.replace('localhost', '127.0.0.1');\n    win.loadURL(serverUrl)\n    // 开发环境下，自动打开调试工具\n    // win.webContents.openDevTools()\n  } else {\n    win.loadFile(path.join(_PATHS.publicRoot, 'index.html'));\n  }\n\n  return win;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/electron-builder.yaml",
    "content": "appId: 'com.jeecg.boot3'\n# 产品名称\nproductName: 'jeecgboot'\nfiles:\n  # 仅包含 dist 目录下所有文件\n  - 'dist/**/*'\n  # 特别排除 node_modules 目录\n  - '!node_modules'\ndirectories:\n  # 输出目录\n  output: 'dist-electron'\nwin:\n  # win exe 程序图标\n  icon: 'electron/icons/app.ico'\n  artifactName: 'jeecgboot-setup-${version}.exe'\n# 安装包配置\nnsis:\n  oneClick: false\n  # 是否允许用户选择安装目录\n  allowToChangeInstallationDirectory: true\n  # 是否创建桌面快捷方式\n  createDesktopShortcut: true\n  # 安装程序的图标\n  installerIcon: 'electron/icons/installer.ico'\n"
  },
  {
    "path": "jeecgboot-vue3/electron.md",
    "content": "# Electron桌面应用打包\n\n- 1.安装依赖很慢，得10分钟左右\n- 2.electron桌面应用打包文档\n  https://help.jeecg.com/ui/setup/electron-build\n- 3.临时注释掉electron功能\n 注释代码：build/vite/plugin/electron.ts\n 修改build/vite/plugin/index.ts，搜索`electron plugin`注释相关逻辑代码\n 修改package.json删除相关依赖\n\n```yaml\n{\n  \"main\": \"dist/electron/main.js\",\n  \"scripts\": {\n    \"electron:dev\": \"cross-env VITE_GLOB_RUN_PLATFORM=electron npm run dev\",\n    \"electron:build-all\": \"npm run electron:build-web && npm run electron:build-app\",\n    \"electron:build-web\": \"cross-env VITE_GLOB_RUN_PLATFORM=electron NODE_ENV=production NODE_OPTIONS=--max-old-space-size=8192 vite build --mode prod_electron && cross-env VITE_GLOB_RUN_PLATFORM=electron esno ./build/script/postBuild.ts && esno ./build/script/copyChat.ts\",\n    \"electron:build-app\": \"esno ./electron/script/buildBefore.ts && electron-builder && esno ./electron/script/buildAfter.ts\",\n    \"electron:install\": \"cross-env ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ node node_modules/electron/install.js\",\n  },\n  \"devDependencies\": {\n    \"electron\": \"35.1.4\",\n    \"electron-builder\": \"^26.0.12\",\n    \"vite-plugin-electron\": \"^0.29.0\",\n  },\n}\n```\n\n> 提示：在执行`pnpm install`后如果Electron安装失败，可以尝试运行`npm run electron:install`进行安装\n\n# Electron桌面通知示例和代码位置\n\n1. 代码位置：electron/utils/tray.ts\n2. 发送系统通知调用：sendDesktopNotice\n3. 开始托盘图标闪动调用：startBlink\n4. 停止托盘图标闪动调用：stopBlink\n"
  },
  {
    "path": "jeecgboot-vue3/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"zh_CN\" id=\"htmlRoot\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\" />\n    <meta name=\"renderer\" content=\"webkit\" />\n    <meta\n      name=\"viewport\"\n      content=\"width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0\"\n    />\n\n    <title><%= title %></title>\n    <link rel=\"icon\" href=\"<%= basePublicPath %>/logo.png\" />\n    <!-- 全局配置 -->\n    <script>\n      window._CONFIG = {};\n    </script>\n  </head>\n  <body>\n    <script>\n      (() => {\n        var htmlRoot = document.getElementById('htmlRoot');\n        var theme = window.localStorage.getItem('__APP__DARK__MODE__');\n        if (htmlRoot && theme) {\n          htmlRoot.setAttribute('data-theme', theme);\n          theme = htmlRoot = null;\n        }\n      })();\n    </script>\n    <div id=\"app\">\n      <style>\n        html[data-theme='dark'] .app-loading {\n          background-color: #2c344a;\n        }\n\n        html[data-theme='dark'] .app-loading .app-loading-title {\n          color: rgba(255, 255, 255, 0.85);\n        }\n\n        .app-loading {\n          display: flex;\n          width: 100%;\n          height: 100%;\n          justify-content: center;\n          align-items: center;\n          flex-direction: column;\n          background-color: #f4f7f9;\n        }\n\n        .app-loading .app-loading-wrap {\n          position: absolute;\n          top: 50%;\n          left: 50%;\n          display: flex;\n          -webkit-transform: translate3d(-50%, -50%, 0);\n          transform: translate3d(-50%, -50%, 0);\n          justify-content: center;\n          align-items: center;\n          flex-direction: column;\n        }\n\n        .app-loading .dots {\n          display: flex;\n          padding: 98px;\n          justify-content: center;\n          align-items: center;\n        }\n\n        .app-loading .app-loading-title {\n          display: flex;\n          margin-top: 30px;\n          font-size: 30px;\n          color: rgba(0, 0, 0, 0.85);\n          justify-content: center;\n          align-items: center;\n        }\n\n        .app-loading .app-loading-logo {\n          display: block;\n          width: 90px;\n          margin: 0 auto;\n          margin-bottom: 20px;\n        }\n\n        .dot {\n          position: relative;\n          display: inline-block;\n          width: 48px;\n          height: 48px;\n          margin-top: 30px;\n          font-size: 32px;\n          transform: rotate(45deg);\n          box-sizing: border-box;\n          animation: antRotate 1.2s infinite linear;\n        }\n\n        .dot i {\n          position: absolute;\n          display: block;\n          width: 20px;\n          height: 20px;\n          background-color: #0065cc;\n          border-radius: 100%;\n          opacity: 0.3;\n          transform: scale(0.75);\n          animation: antSpinMove 1s infinite linear alternate;\n          transform-origin: 50% 50%;\n        }\n\n        .dot i:nth-child(1) {\n          top: 0;\n          left: 0;\n        }\n\n        .dot i:nth-child(2) {\n          top: 0;\n          right: 0;\n          -webkit-animation-delay: 0.4s;\n          animation-delay: 0.4s;\n        }\n\n        .dot i:nth-child(3) {\n          right: 0;\n          bottom: 0;\n          -webkit-animation-delay: 0.8s;\n          animation-delay: 0.8s;\n        }\n\n        .dot i:nth-child(4) {\n          bottom: 0;\n          left: 0;\n          -webkit-animation-delay: 1.2s;\n          animation-delay: 1.2s;\n        }\n        @keyframes antRotate {\n          to {\n            -webkit-transform: rotate(405deg);\n            transform: rotate(405deg);\n          }\n        }\n        @-webkit-keyframes antRotate {\n          to {\n            -webkit-transform: rotate(405deg);\n            transform: rotate(405deg);\n          }\n        }\n        @keyframes antSpinMove {\n          to {\n            opacity: 1;\n          }\n        }\n        @-webkit-keyframes antSpinMove {\n          to {\n            opacity: 1;\n          }\n        }\n      </style>\n      <div class=\"app-loading\">\n        <div class=\"app-loading-wrap\">\n          <img src=\"<%= basePublicPath %>/resource/img/logo.png\" class=\"app-loading-logo\" alt=\"Logo\" />\n          <div class=\"app-loading-dots\">\n            <span class=\"dot dot-spin\"><i></i><i></i><i></i><i></i></span>\n          </div>\n          <div class=\"app-loading-title\"><%= title %></div>\n        </div>\n      </div>\n    </div>\n    <script type=\"module\" src=\"/src/main.ts\"></script>\n    <!-- 百度统计 -->\n    <script>\n      var _hmt = _hmt || [];\n      (function() {\n        var hm = document.createElement(\"script\");\n        hm.src = \"https://hm.baidu.com/hm.js?0febd9e3cacb3f627ddac64d52caac39\";\n        var s = document.getElementsByTagName(\"script\")[0];\n        s.parentNode.insertBefore(hm, s);\n      })();\n    </script>\n\n  </body>\n</html>\n"
  },
  {
    "path": "jeecgboot-vue3/jest.config.mjs",
    "content": "export default {\n  preset: 'ts-jest',\n  roots: ['<rootDir>/tests/'],\n  clearMocks: true,\n  moduleDirectories: ['node_modules', 'src'],\n  moduleFileExtensions: ['js', 'ts', 'vue', 'tsx', 'jsx', 'json', 'node'],\n  modulePaths: ['<rootDir>/src', '<rootDir>/node_modules'],\n  testMatch: [\n    '**/tests/**/*.[jt]s?(x)',\n    '**/?(*.)+(spec|test).[tj]s?(x)',\n    '(/__tests__/.*|(\\\\.|/)(test|spec))\\\\.(js|ts)$',\n  ],\n  testPathIgnorePatterns: [\n    '<rootDir>/tests/server/',\n    '<rootDir>/tests/__mocks__/',\n    '/node_modules/',\n  ],\n  transform: {\n    '^.+\\\\.tsx?$': 'ts-jest',\n  },\n  transformIgnorePatterns: ['<rootDir>/tests/__mocks__/', '/node_modules/'],\n  // A map from regular expressions to module names that allow to stub out resources with a single module\n  moduleNameMapper: {\n    '\\\\.(vs|fs|vert|frag|glsl|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':\n      '<rootDir>/tests/__mocks__/fileMock.ts',\n    '\\\\.(sass|s?css|less)$': '<rootDir>/tests/__mocks__/styleMock.ts',\n    '\\\\?worker$': '<rootDir>/tests/__mocks__/workerMock.ts',\n    '^/@/(.*)$': '<rootDir>/src/$1',\n  },\n  testEnvironment: 'jsdom',\n  verbose: true,\n  collectCoverage: false,\n  coverageDirectory: 'coverage',\n  collectCoverageFrom: ['src/**/*.{js,ts,vue}'],\n  coveragePathIgnorePatterns: ['^.+\\\\.d\\\\.ts$'],\n};\n"
  },
  {
    "path": "jeecgboot-vue3/mock/_createProductionServer.ts",
    "content": "import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer';\n\nconst modules = import.meta.glob('./**/*.ts', { eager: true });\n\nconst mockModules: any[] = [];\nObject.keys(modules).forEach((key) => {\n  if (key.includes('/_')) {\n    return;\n  }\n  mockModules.push(...(modules as Recordable)[key].default);\n});\n\n/**\n * Used in a production environment. Need to manually import all modules\n */\nexport function setupProdMockServer() {\n  createProdMockServer(mockModules);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/mock/_util.ts",
    "content": "// Interface data format used to return a unified format\n\nexport function resultSuccess<T = Recordable>(result: T, { message = 'ok' } = {}) {\n  return {\n    code: 0,\n    result,\n    message,\n    type: 'success',\n  };\n}\n\nexport function resultPageSuccess<T = any>(\n  pageNo: number,\n  pageSize: number,\n  list: T[],\n  { message = 'ok' } = {}\n) {\n  const pageData = pagination(pageNo, pageSize, list);\n\n  return {\n    ...resultSuccess({\n      records: pageData,\n      total: list.length,\n    }),\n    message,\n  };\n}\n\nexport function resultError(message = 'Request failed', { code = -1, result = null } = {}) {\n  return {\n    code,\n    result,\n    message,\n    type: 'error',\n  };\n}\n\nexport function pagination<T = any>(pageNo: number, pageSize: number, array: T[]): T[] {\n  const offset = (pageNo - 1) * Number(pageSize);\n  const ret =\n    offset + Number(pageSize) >= array.length\n      ? array.slice(offset, array.length)\n      : array.slice(offset, offset + Number(pageSize));\n  return ret;\n}\n\nexport interface requestParams {\n  method: string;\n  body: any;\n  headers?: { authorization?: string };\n  query: any;\n}\n\n/**\n * @description 本函数用于从request数据中获取token，请根据项目的实际情况修改\n *\n */\nexport function getRequestToken({ headers }: requestParams): string | undefined {\n  return headers?.authorization;\n}\n\n//TODO 接口父路径（写死不够灵活）\nexport const baseUrl = '/jeecgboot/mock';\n"
  },
  {
    "path": "jeecgboot-vue3/mock/demo/account.ts",
    "content": "import { MockMethod } from 'vite-plugin-mock';\nimport { resultSuccess, resultError, baseUrl } from '../_util';\nimport { ResultEnum } from '../../src/enums/httpEnum';\nconst userInfo = {\n  name: 'Jeecg',\n  userid: '00000001',\n  email: 'test@gmail.com',\n  signature: '海纳百川，有容乃大',\n  introduction: '微笑着，努力着，欣赏着',\n  title: '交互专家',\n  group: '某某某事业群－某某平台部－某某技术部－UED',\n  tags: [\n    {\n      key: '0',\n      label: '很有想法的',\n    },\n    {\n      key: '1',\n      label: '专注设计',\n    },\n    {\n      key: '2',\n      label: '辣~',\n    },\n    {\n      key: '3',\n      label: '大长腿',\n    },\n    {\n      key: '4',\n      label: '川妹子',\n    },\n    {\n      key: '5',\n      label: '海纳百川',\n    },\n  ],\n  notifyCount: 12,\n  unreadCount: 11,\n  country: 'China',\n  address: 'Xiamen City 77',\n  phone: '0592-268888888',\n};\n\nexport default [\n  {\n    url: `${baseUrl}/account/getAccountInfo`,\n    timeout: 1000,\n    method: 'get',\n    response: () => {\n      return resultSuccess(userInfo);\n    },\n  },\n  {\n    url: `${baseUrl}/user/sessionTimeout`,\n    method: 'post',\n    statusCode: 401,\n    response: () => {\n      return resultError();\n    },\n  },\n  {\n    url: '/basic-api/user/tokenExpired',\n    method: 'post',\n    statusCode: 200,\n    response: () => {\n      return resultError('Token Expired!', { code: ResultEnum.TIMEOUT as number });\n    },\n  },\n] as MockMethod[];\n"
  },
  {
    "path": "jeecgboot-vue3/mock/demo/select-demo.ts",
    "content": "import { MockMethod } from 'vite-plugin-mock';\nimport { resultSuccess, baseUrl } from '../_util';\n\nconst demoList = (keyword, count = 20) => {\n  const result = {\n    list: [] as any[],\n  };\n  for (let index = 0; index < count; index++) {\n    //根据搜索关键词做一下匹配\n    let name = `选项${index}`;\n    if(keyword && name.indexOf(keyword)!=-1){\n      result.list.push({\n        name: `选项${index}`,\n        id: `${index}`,\n      });\n    }else if(!keyword){\n      result.list.push({\n        name: `选项${index}`,\n        id: `${index}`,\n      });\n    }\n  }\n  return result;\n};\n\nexport default [\n  {\n    url: `${baseUrl}/select/getDemoOptions`,\n    timeout: 1000,\n    method: 'get',\n    response: ({ query }) => {\n      const { keyword,count} = query;\n      console.log(\"查询条件：\", keyword);\n      return resultSuccess(demoList(keyword,count));\n    },\n  },\n] as MockMethod[];\n"
  },
  {
    "path": "jeecgboot-vue3/mock/demo/system.ts",
    "content": "import { MockMethod } from 'vite-plugin-mock';\nimport { resultError, resultPageSuccess, resultSuccess, baseUrl } from '../_util';\n\nconst accountList = (() => {\n    const result: any[] = [];\n    for (let index = 0; index < 20; index++) {\n        result.push({\n            id: `${index}`,\n            account: '@first',\n            email: '@email',\n            nickname: '@cname()',\n            role: '@first',\n            createTime: '@datetime',\n            remark: '@cword(10,20)',\n            'status|1': ['0', '1'],\n        });\n    }\n    return result;\n})();\n\nconst userList = (() => {\n    const result: any[] = [];\n    for (let index = 0; index < 20; index++) {\n        result.push({\n            id: `${index}`,\n            username: '@first',\n            email: '@email',\n            realname: '@cname()',\n            createTime: '@datetime',\n            remark: '@cword(10,20)',\n            avatar: 'https://q1.qlogo.cn/g?b=qq&nk=190848757&s=640'\n        });\n    }\n    return result;\n})();\n\nconst roleList = (() => {\n    const result: any[] = [];\n    for (let index = 0; index < 4; index++) {\n        result.push({\n            id: index + 1,\n            orderNo: `${index + 1}`,\n            roleName: ['超级管理员', '管理员', '文章管理员', '普通用户'][index],\n            roleValue: '@first',\n            createTime: '@datetime',\n            remark: '@cword(10,20)',\n            menu: [['0', '1', '2'], ['0', '1'], ['0', '2'], ['2']][index],\n            'status|1': ['0', '1'],\n        });\n    }\n    return result;\n})();\n\nconst newRoleList = (() => {\n    const result: any[] = [];\n    for (let index = 0; index < 4; index++) {\n        result.push({\n            id: index + 1,\n            orderNo: `${index + 1}`,\n            roleName: ['超级管理员', '管理员', '文章管理员', '普通用户'][index],\n            roleCode: '@first',\n            createTime: '@datetime',\n            remark: '@cword(10,20)'\n        });\n    }\n    return result;\n})();\n\nconst testList = (() => {\n    const result: any[] = [];\n    for (let index = 0; index < 4; index++) {\n        result.push({\n            id: index + 1,\n            orderNo: `${index + 1}`,\n            testName: ['数据1', '数据2', '数据3', '数据4'][index],\n            testValue: '@first',\n            createTime: '@datetime'\n        });\n    }\n    return result;\n})();\n\nconst tableDemoList = (() => {\n    const result: any[] = [];\n    for (let index = 0; index < 4; index++) {\n        result.push({\n            id: index + 1,\n            orderCode: '2008200' + `${index + 1}`,\n            orderMoney: '@natural(1000,3000)',\n            ctype: '@natural(1,2)',\n            content: '@cword(10,20)',\n            orderDate: '@datetime'\n        });\n    }\n    return result;\n})();\n\nconst deptList = (() => {\n    const result: any[] = [];\n    for (let index = 0; index < 3; index++) {\n        result.push({\n            id: `${index}`,\n            deptName: ['华东分部', '华南分部', '西北分部'][index],\n            orderNo: index + 1,\n            createTime: '@datetime',\n            remark: '@cword(10,20)',\n            'status|1': ['0', '0', '1'],\n            children: (() => {\n                const children: any[] = [];\n                for (let j = 0; j < 4; j++) {\n                    children.push({\n                        id: `${index}-${j}`,\n                        deptName: ['研发部', '市场部', '商务部', '财务部'][j],\n                        orderNo: j + 1,\n                        createTime: '@datetime',\n                        remark: '@cword(10,20)',\n                        'status|1': ['0', '1'],\n                        parentDept: `${index}`,\n                        children: undefined,\n                    });\n                }\n                return children;\n            })(),\n        });\n    }\n    return result;\n})();\n\nconst menuList = (() => {\n    const result: any[] = [];\n    for (let index = 0; index < 3; index++) {\n        result.push({\n            id: `${index}`,\n            icon: ['ion:layers-outline', 'ion:git-compare-outline', 'ion:tv-outline'][index],\n            component: 'LAYOUT',\n            type: '0',\n            menuName: ['Dashboard', '权限管理', '功能'][index],\n            permission: '',\n            orderNo: index + 1,\n            createTime: '@datetime',\n            'status|1': ['0', '0', '1'],\n            children: (() => {\n                const children: any[] = [];\n                for (let j = 0; j < 4; j++) {\n                    children.push({\n                        id: `${index}-${j}`,\n                        type: '1',\n                        menuName: ['菜单1', '菜单2', '菜单3', '菜单4'][j],\n                        icon: 'ion:document',\n                        permission: ['menu1:view', 'menu2:add', 'menu3:update', 'menu4:del'][index],\n                        component: [\n                            '/dashboard/welcome/index',\n                            '/dashboard/Analysis/index',\n                            '/dashboard/workbench/index',\n                            '/dashboard/test/index',\n                        ][j],\n                        orderNo: j + 1,\n                        createTime: '@datetime',\n                        'status|1': ['0', '1'],\n                        parentMenu: `${index}`,\n                        children: (() => {\n                            const children: any[] = [];\n                            for (let k = 0; k < 4; k++) {\n                                children.push({\n                                    id: `${index}-${j}-${k}`,\n                                    type: '2',\n                                    menuName: '按钮' + (j + 1) + '-' + (k + 1),\n                                    icon: '',\n                                    permission:\n                                        ['menu1:view', 'menu2:add', 'menu3:update', 'menu4:del'][index] +\n                                        ':btn' +\n                                        (k + 1),\n                                    component: [\n                                        '/dashboard/welcome/index',\n                                        '/dashboard/Analysis/index',\n                                        '/dashboard/workbench/index',\n                                        '/dashboard/test/index',\n                                    ][j],\n                                    orderNo: j + 1,\n                                    createTime: '@datetime',\n                                    'status|1': ['0', '1'],\n                                    parentMenu: `${index}-${j}`,\n                                    children: undefined,\n                                });\n                            }\n                            return children;\n                        })(),\n                    });\n                }\n                return children;\n            })(),\n        });\n    }\n    return result;\n})();\n\nexport default [\n  {\n    url: `${baseUrl}/system/getAccountList`,\n    timeout: 100,\n    method: 'get',\n    response: ({ query }) => {\n      const { page = 1, pageSize = 20 } = query;\n      return resultPageSuccess(page, pageSize, accountList);\n    },\n  },\n  {\n    url: `${baseUrl}/sys/user/list`,\n    timeout: 100,\n    method: 'get',\n    response: ({ query }) => {\n      const { page = 1, pageSize = 20 } = query;\n      return resultPageSuccess(page, pageSize, userList);\n    },\n  },\n  {\n    url: `${baseUrl}/system/getRoleListByPage`,\n    timeout: 100,\n    method: 'get',\n    response: ({ query }) => {\n      const { page = 1, pageSize = 20 } = query;\n      return resultPageSuccess(page, pageSize, roleList);\n    },\n  },\n  {\n    url: `${baseUrl}/sys/role/list`,\n    timeout: 100,\n    method: 'get',\n    response: ({ query }) => {\n      const { page = 1, pageSize = 20 } = query;\n      return resultPageSuccess(page, pageSize, newRoleList);\n    },\n  },\n  {\n    url: `${baseUrl}/system/getTestListByPage`,\n    timeout: 100,\n    method: 'get',\n    response: ({ query }) => {\n      const { page = 1, pageSize = 20 } = query;\n      return resultPageSuccess(page, pageSize, testList);\n    },\n  },\n  {\n    url: `${baseUrl}/system/getDemoTableListByPage`,\n    timeout: 100,\n    method: 'get',\n    response: ({ query }) => {\n      const { page = 1, pageSize = 20 } = query;\n      return resultPageSuccess(page, pageSize, tableDemoList);\n    },\n  },\n  {\n    url: `${baseUrl}/system/setRoleStatus`,\n    timeout: 500,\n    method: 'post',\n    response: ({ query }) => {\n      const { id, status } = query;\n      return resultSuccess({ id, status });\n    },\n  },\n  {\n    url: `${baseUrl}/system/getAllRoleList`,\n    timeout: 100,\n    method: 'get',\n    response: () => {\n      return resultSuccess(roleList);\n    },\n  },\n  {\n    url: `${baseUrl}/system/getDeptList`,\n    timeout: 100,\n    method: 'get',\n    response: () => {\n      return resultSuccess(deptList);\n    },\n  },\n  {\n    url: `${baseUrl}/system/getMenuList`,\n    timeout: 100,\n    method: 'get',\n    response: () => {\n      return resultSuccess(menuList);\n    },\n  },\n  {\n    url: `${baseUrl}/system/accountExist`,\n    timeout: 500,\n    method: 'post',\n    response: ({ body }) => {\n      const { account } = body || {};\n      if (account && account.indexOf('admin') !== -1) {\n        return resultError('该字段不能包含admin');\n      } else {\n        return resultSuccess(`${account} can use`);\n      }\n    },\n  },\n] as MockMethod[];\n"
  },
  {
    "path": "jeecgboot-vue3/mock/demo/table-demo.ts",
    "content": "import { MockMethod } from 'vite-plugin-mock';\nimport { Random } from 'mockjs';\nimport { resultPageSuccess, baseUrl } from '../_util';\n\nfunction getRandomPics(count = 10): string[] {\n  const arr: string[] = [];\n  for (let i = 0; i < count; i++) {\n    arr.push(Random.image('800x600', Random.color(), Random.color(), Random.title()));\n  }\n  return arr;\n}\n\nconst demoList = (() => {\n  const result: any[] = [];\n  for (let index = 0; index < 200; index++) {\n    result.push({\n      id: `${index}`,\n      beginTime: '@datetime',\n      endTime: '@datetime',\n      address: '@city()',\n      name: '@cname()',\n      name1: '@cname()',\n      name2: '@cname()',\n      name3: '@cname()',\n      name4: '@cname()',\n      name5: '@cname()',\n      name6: '@cname()',\n      name7: '@cname()',\n      name8: '@cname()',\n      avatar: Random.image('400x400', Random.color(), Random.color(), Random.first()),\n      imgArr: getRandomPics(Math.ceil(Math.random() * 3) + 1),\n      imgs: getRandomPics(Math.ceil(Math.random() * 3) + 1),\n      age: Math.ceil(Math.random() * 30) + 1,\n      score: Math.ceil(Math.random() * 80) + 1,\n      date: `@date('yyyy-MM-dd')`,\n      time: `@time('HH:mm')`,\n      'no|100000-10000000': 100000,\n      'status|1': ['normal', 'enable', 'disable'],\n    });\n  }\n  return result;\n})();\n\nexport default [\n  {\n    url: `${baseUrl}/table/getDemoList`,\n    timeout: 100,\n    method: 'get',\n    response: ({ query }) => {\n      const { page = 1, pageSize = 20 } = query;\n      // 代码逻辑说明: 【issues/6943】mock翻页之后数据id和图片没自动刷新\n      const pageNo = +(query.pageNo ?? page);\n      return resultPageSuccess(pageNo, +pageSize, demoList);\n    },\n  },\n] as MockMethod[];\n"
  },
  {
    "path": "jeecgboot-vue3/mock/demo/tree-demo.ts",
    "content": "import { MockMethod } from 'vite-plugin-mock';\nimport { resultSuccess, baseUrl } from '../_util';\n\nconst demoTreeList = (keyword) => {\n  const result = {\n    list: [] as Recordable[],\n  };\n  for (let index = 0; index < 5; index++) {\n    const children: Recordable[] = [];\n    for (let j = 0; j < 3; j++) {\n      children.push({\n        title: `${keyword ?? ''}选项${index}-${j}`,\n        value: `${index}-${j}`,\n        key: `${index}-${j}`,\n      });\n    }\n    result.list.push({\n      title: `${keyword ?? ''}选项${index}`,\n      value: `${index}`,\n      key: `${index}`,\n      children,\n    });\n  }\n  return result;\n};\n\nexport default [\n  {\n    url: `${baseUrl}/tree/getDemoOptions`,\n    timeout: 1000,\n    method: 'get',\n    response: ({ query }) => {\n      const { keyword } = query;\n      console.log(\"查询条件：\", keyword);\n      return resultSuccess(demoTreeList(keyword));\n    },\n  },\n] as MockMethod[];\n"
  },
  {
    "path": "jeecgboot-vue3/mock/sys/menu.ts",
    "content": "import { resultSuccess, resultError, getRequestToken, requestParams,baseUrl} from '../_util';\nimport { MockMethod } from 'vite-plugin-mock';\nimport { createFakeUserList } from './user';\nimport { PageEnum } from '/@/enums/pageEnum';\n\n// single\nconst dashboardRoute = {\n  path: '/dashboard',\n  name: 'Dashboard',\n  component: 'LAYOUT',\n  redirect: PageEnum.BASE_HOME,\n  meta: {\n    title: 'routes.dashboard.dashboard',\n    hideChildrenInMenu: true,\n    icon: 'bx:bx-home',\n  },\n  children: [\n    {\n      path: 'analysis',\n      name: 'Analysis',\n      component: '/dashboard/Analysis/index',\n      meta: {\n        hideMenu: true,\n        hideBreadcrumb: true,\n        title: 'routes.dashboard.analysis',\n        currentActiveMenu: '/dashboard',\n        icon: 'bx:bx-home',\n      },\n    },\n    {\n      path: 'workbench',\n      name: 'Workbench',\n      component: '/dashboard/workbench/index',\n      meta: {\n        hideMenu: true,\n        hideBreadcrumb: true,\n        title: 'routes.dashboard.workbench',\n        currentActiveMenu: '/dashboard',\n        icon: 'bx:bx-home',\n      },\n    },\n  ],\n};\n\nconst backRoute = {\n  path: 'back',\n  name: 'PermissionBackDemo',\n  meta: {\n    title: 'routes.demo.permission.back',\n  },\n\n  children: [\n    {\n      path: 'page',\n      name: 'BackAuthPage',\n      component: '/demo/permission/back/index',\n      meta: {\n        title: 'routes.demo.permission.backPage',\n      },\n    },\n    {\n      path: 'btn',\n      name: 'BackAuthBtn',\n      component: '/demo/permission/back/Btn',\n      meta: {\n        title: 'routes.demo.permission.backBtn',\n      },\n    },\n  ],\n};\n\nconst authRoute = {\n  path: '/permission',\n  name: 'Permission',\n  component: 'LAYOUT',\n  redirect: '/permission/front/page',\n  meta: {\n    icon: 'carbon:user-role',\n    title: 'routes.demo.permission.permission',\n  },\n  children: [backRoute],\n};\n\nconst levelRoute = {\n  path: '/level',\n  name: 'Level',\n  component: 'LAYOUT',\n  redirect: '/level/menu1/menu1-1',\n  meta: {\n    icon: 'carbon:user-role',\n    title: 'routes.demo.level.level',\n  },\n\n  children: [\n    {\n      path: 'menu1',\n      name: 'Menu1Demo',\n      meta: {\n        title: 'Menu1',\n      },\n      children: [\n        {\n          path: 'menu1-1',\n          name: 'Menu11Demo',\n          meta: {\n            title: 'Menu1-1',\n          },\n          children: [\n            {\n              path: 'menu1-1-1',\n              name: 'Menu111Demo',\n              component: '/demo/level/Menu111',\n              meta: {\n                title: 'Menu111',\n              },\n            },\n          ],\n        },\n        {\n          path: 'menu1-2',\n          name: 'Menu12Demo',\n          component: '/demo/level/Menu12',\n          meta: {\n            title: 'Menu1-2',\n          },\n        },\n      ],\n    },\n    {\n      path: 'menu2',\n      name: 'Menu2Demo',\n      component: '/demo/level/Menu2',\n      meta: {\n        title: 'Menu2',\n      },\n    },\n  ],\n};\n\nconst sysRoute = {\n  path: '/system',\n  name: 'System',\n  component: 'LAYOUT',\n  redirect: '/system/account',\n  meta: {\n    icon: 'ion:settings-outline',\n    title: 'routes.demo.system.moduleName',\n  },\n  children: [\n    {\n      path: 'account',\n      name: 'AccountManagement',\n      meta: {\n        title: 'routes.demo.system.account',\n        ignoreKeepAlive: true,\n      },\n      component: '/demo/system/account/index',\n    },\n    {\n      path: 'account_detail/:id',\n      name: 'AccountDetail',\n      meta: {\n        hideMenu: true,\n        title: 'routes.demo.system.account_detail',\n        ignoreKeepAlive: true,\n        showMenu: false,\n        currentActiveMenu: '/system/account',\n      },\n      component: '/demo/system/account/AccountDetail',\n    },\n    {\n      path: 'role',\n      name: 'RoleManagement',\n      meta: {\n        title: 'routes.demo.system.role',\n        ignoreKeepAlive: true,\n      },\n      component: '/demo/system/role/index',\n    },\n\n    {\n      path: 'menu',\n      name: 'MenuManagement',\n      meta: {\n        title: 'routes.demo.system.menu',\n        ignoreKeepAlive: true,\n      },\n      component: '/demo/system/menu/index',\n    },\n    {\n      path: 'dept',\n      name: 'DeptManagement',\n      meta: {\n        title: 'routes.demo.system.dept',\n        ignoreKeepAlive: true,\n      },\n      component: '/demo/system/dept/index',\n    },\n    {\n      path: 'changePassword',\n      name: 'ChangePassword',\n      meta: {\n        title: 'routes.demo.system.password',\n        ignoreKeepAlive: true,\n      },\n      component: '/demo/system/password/index',\n    },\n  ],\n};\n\nconst linkRoute = {\n  path: '/link',\n  name: 'Link',\n  component: 'LAYOUT',\n  meta: {\n    icon: 'ion:tv-outline',\n    title: 'routes.demo.iframe.frame',\n  },\n  children: [\n    {\n      path: 'doc',\n      name: 'Doc',\n      meta: {\n        title: 'routes.demo.iframe.doc',\n        frameSrc: 'https://vvbin.cn/doc-next/',\n      },\n    },\n    {\n      path: 'https://vvbin.cn/doc-next/',\n      name: 'DocExternal',\n      component: 'LAYOUT',\n      meta: {\n        title: 'routes.demo.iframe.docExternal',\n      },\n    },\n  ],\n};\n\nexport default [\n  {\n    url: `${baseUrl}/sys/permission/getUserPermissionByToken`,\n    timeout: 1000,\n    method: 'get',\n    response: (request: requestParams) => {\n      const token = getRequestToken(request);\n      if (!token) {\n        return resultError('Invalid token!');\n      }\n      const checkUser = createFakeUserList().find((item) => item.token === token);\n      if (!checkUser) {\n        return resultError('Invalid user token!');\n      }\n      const id = checkUser.userId;\n      let menu: Object[];\n      switch (id) {\n        case '1':\n          dashboardRoute.redirect = dashboardRoute.path + '/' + dashboardRoute.children[0].path;\n          menu = [dashboardRoute, authRoute, levelRoute, sysRoute, linkRoute];\n          break;\n        case '2':\n          dashboardRoute.redirect = dashboardRoute.path + '/' + dashboardRoute.children[1].path;\n          menu = [dashboardRoute, authRoute, levelRoute, linkRoute];\n          break;\n        default:\n          menu = [];\n      }\n\n      return resultSuccess(menu);\n    },\n  },\n] as MockMethod[];\n"
  },
  {
    "path": "jeecgboot-vue3/mock/sys/user.ts",
    "content": "import { MockMethod } from 'vite-plugin-mock';\nimport { resultError, resultSuccess, getRequestToken, requestParams, baseUrl } from '../_util';\nimport { PageEnum } from '/@/enums/pageEnum';\nexport function createFakeUserList() {\n  return [\n    {\n      userId: '1',\n      username: 'admin',\n      realname: '管理员',\n      avatar: 'https://q1.qlogo.cn/g?b=qq&nk=190848757&s=640',\n      desc: 'manager',\n      password: '123456',\n      token: 'fakeToken1',\n      homePath: PageEnum.BASE_HOME,\n      roles: [\n        {\n          roleName: 'Super Admin',\n          value: 'super',\n        },\n      ],\n    },\n    {\n      userId: '2',\n      username: 'jeecg',\n      password: '123456',\n      realname: '测试用户',\n      avatar: 'https://q1.qlogo.cn/g?b=qq&nk=339449197&s=640',\n      desc: 'tester',\n      token: 'fakeToken2',\n      homePath: PageEnum.BASE_HOME,\n      roles: [\n        {\n          roleName: 'Tester',\n          value: 'test',\n        },\n      ],\n    },\n  ];\n}\n\nconst fakeCodeList: any = {\n  '1': ['1000', '3000', '5000'],\n\n  '2': ['2000', '4000', '6000'],\n};\n\nexport default [\n  // mock user login\n  {\n    url: `${baseUrl}/sys/login`,\n    timeout: 200,\n    method: 'post',\n    response: ({ body }) => {\n      const { username, password } = body;\n      const checkUser = createFakeUserList().find(\n        (item) => item.username === username && password === item.password\n      );\n      if (!checkUser) {\n        return resultError('Incorrect account or password！');\n      }\n      const { userId, username: _username, token, realname, desc, roles } = checkUser;\n      return resultSuccess({\n        roles,\n        userId,\n        username: _username,\n        token,\n        realname,\n        desc,\n      });\n    },\n  },\n  {\n    url: `${baseUrl}/sys/user/getUserInfo`,\n    method: 'get',\n    response: (request: requestParams) => {\n      const token = getRequestToken(request);\n      if (!token) return resultError('Invalid token');\n      const checkUser = createFakeUserList().find((item) => item.token === token);\n      if (!checkUser) {\n        return resultError('The corresponding user information was not obtained!');\n      }\n      return resultSuccess(checkUser);\n    },\n  },\n  {\n    url: `${baseUrl}/sys/permission/getPermCode`,\n    timeout: 200,\n    method: 'get',\n    response: (request: requestParams) => {\n      const token = getRequestToken(request);\n      if (!token) return resultError('Invalid token');\n      const checkUser = createFakeUserList().find((item) => item.token === token);\n      if (!checkUser) {\n        return resultError('Invalid token!');\n      }\n      const codeList = fakeCodeList[checkUser.userId];\n\n      return resultSuccess(codeList);\n    },\n  },\n  {\n    url: `${baseUrl}/sys/logout`,\n    timeout: 200,\n    method: 'get',\n    response: (request: requestParams) => {\n      const token = getRequestToken(request);\n      if (!token) return resultError('Invalid token');\n      const checkUser = createFakeUserList().find((item) => item.token === token);\n      if (!checkUser) {\n        return resultError('Invalid token!');\n      }\n      return resultSuccess(undefined, { message: 'Token has been destroyed' });\n    },\n  },\n  {\n    url: `${baseUrl}/sys/randomImage/1629428467008`,\n    timeout: 200,\n    method: 'get',\n    response: (request: requestParams) => {\n      const result =\n        'data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAjAGkDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3h/ME5lErCKNSHi8rO44yCp65/P060gmdbbIaKecxl0VDsEmOmMk8cgZ96dcypFGpkEm0uOUzxznJI6DjnPH54ryTWNW1+P436T4ftNev4LTU7Brhw9tbCSHiZxGrNCcKCijkMeuSSOAD1KJ7hrTZNK0d1Iz7egGVPRSV6HGRkE4z1xV5SWQEqVJGSpxke3FeYL4n1PSfi5pXhK7vxrFlf27XVveyQRrcQHa4KFo1CMhMLdFUjfy2F59NjZm3Bl2kMRxnGO3JA7Y/HI7UAVrjfbWt3NJLNKmCwVAoaNcc4PHTk8+n5rKs1tDGtsdw5X94GkOT90ls5xnr14PYDNeUfDzxvq3xCuNZvG8SNp1zBKHtdFgtYpFjhAADuWXfKpJwwRkIwcFd6geg+Dm12Tw9bN4hkX+0Y5bmKcLGVV9s7KjLkA7dijBPLAgnJ5oWgGrb36zBtqyPh9oKwuvG4DncByCeeexPsLHm7jH5amSNxnzFI2gY479/bNVrxYZpRD57Q3JRkikRFLxlgfmUspGQEbrkccg8V5l8PfEOt6h4p8YW+r+JJf7M8OXZhjWWC2jjMQaZSZWWNSMLGDkFQD1BHFAHq7usMcksjnYoLHI+6AOen0pqllZfNkUMWZVUdG5yOvOcD+dcclt4j1/XlvtM8T3dn4cIc7kgt2a4PGwwBoTiLqfMZm34+VQpVz0Ou2t/eWfk2GrXGmTNxHcW9ukxV8EAOrqwKZIJ+6fl+8M0AXjHcb5GWdcN9xWjyF6ehGe/5j05jmdri3cxPJGI3YOAOXABGARnGTjkcjpwenmvwt8Y61czeIdM8b6g0esaW3mTR3SwQJFAB99dijcOpZySoBjI+8TXR+EtK16SNdR1rWL64WUNPaWtxbxQGBXbKCVY0VjKq/f525dgBxuKA6i4ZfsSEyq0R275Wm8v5f7wZe/TjgHNWqiiSWNEV5vNwp3MygFj68cAdeMen4y0wKk6Mtysp3yQsvktEoyPmI+YgnGB9O57dPIfGML3H7SnhaGO+msXfS2C3EIjLqcXPTzFZeenIPXjnFeyiIJIzx4XzH3SZBO75ccc8dF/L3zXHah4D0K58US+ILuLUPtcMeI5l1G5WT5i+VjYSDYCW2hVIHLDaMg0AX9K8FaVZ+IJPEVxPc6rrTAxLf3rqzRJgKURUVUToeQoPzNk8mt0qRJF5uTMVdBNGuAucHoScdByeOPcAxRw3MdzOpuC3nZkQiEBY8EcMf4sggfRT0qYQSJBJGJWlGwKodirZxjlxzzxzjIOfYAA8Tn+HehfErRoPGvhDUP7J1uQCaWK3YmJLpQWZT0aN95X5xxgBgp3ZPb/AAi8U6r4q8BRajriv9qW5khFy6hBcrkEOoCqAAW2cZ5Q85yBdtPAfhSTSv7Og0mWxiWH7PcQ288lq86Y2/vjEy+cCM8sW6t6mukt9PttNsobLTbC0gtY34gjURIgzuJVVGM55xxz3oAnZf8ASI38vcQrLu3fdBwenccfy96+abbwjqHiu8+K1lpt/NFJBqYlW1MwSO5KzzECRmBJwA2ASBuKljxkfSF9ai7jeESzRtJGy5R3UAdCcoVIOGOCCD36qMc9oHgHw/oGrSalpMd1a3DuWnRb6Z1lYr/y2VnYOw3sQT03Z96AMn4W+PP+Et0xrLVZmi8TaerRX9pJH5Rba2BIE9egbGMMSCACtdxOHuYmXy3CCVRjIHmLkbs5HTrx3A9DXJN8LvCraj/adpa3SajtZBqC6rdGaMhdgw3mZOB8uMjgY9q39X0Sx1myuLLUknWwbLSLDdyQrKGUhgxRlOPvZUnac5OT0AseQfEHT7u71CP4keHrbTZJtFSGWQ/Zmk+3gMytMByDGm0BXwrbVdwwVYmPqXhvxDZeKdEj1bRL6AWM42NvT9/DLtVQkmWOXBx16jbjIINGl+GdPs9I/seG6nSAfIY7e/n3qqEBVSQuZI1A25RWABOOhO7P8NeA/DejRveaBpb2IuW2k/bJmDxjIDlJNyk4LYyOjHBGaAOwjeQogYxtIuBNtbhTjPH6cHsalqlbWMFrcSNuVnkkeZAwG5c/eI79wOO2O+SbtABSMiuMMoYZBwRnkHIP50UUALRRRQAUUUUAFFFFACBVUsVUAscsQOpxjn8AKWiigBFVUQIihVUYAAwAKY8EUkqSOgZ0BCk9uQf5qD+FFFAElFFFAH//2Q==';\n      return resultSuccess(result);\n    },\n  },\n] as MockMethod[];\n"
  },
  {
    "path": "jeecgboot-vue3/npm",
    "content": ""
  },
  {
    "path": "jeecgboot-vue3/package.json",
    "content": "{\n  \"name\": \"jeecgboot-vue3\",\n  \"version\": \"3.9.1\",\n  \"author\": {\n    \"name\": \"北京国炬信息技术有限公司\",\n    \"email\": \"jeecgos@163.com\",\n    \"url\": \"https://www.jeecg.com\"\n  },\n  \"scripts\": {\n    \"pinstall\": \"pnpm install\",\n    \"clean:cache\": \"rimraf node_modules/.cache/ && rimraf node_modules/.vite\",\n    \"dev\": \"vite\",\n    \"build\": \"cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=8192 vite build && esno ./build/script/postBuild.ts && esno ./build/script/copyChat.ts\",\n    \"build:docker\": \"cross-env NODE_ENV=docker NODE_OPTIONS=--max-old-space-size=8192 vite build --mode docker && esno ./build/script/postBuild.ts && esno ./build/script/copyChat.ts\",\n    \"build:dockercloud\": \"cross-env NODE_ENV=dockercloud NODE_OPTIONS=--max-old-space-size=8192 vite build --mode dockercloud && esno ./build/script/postBuild.ts && esno ./build/script/copyChat.ts\",\n    \"build:report\": \"pnpm clean:cache && cross-env REPORT=true npm run build\",\n    \"preview\": \"npm run build && vite preview\",\n    \"reinstall\": \"rimraf pnpm-lock.yaml && rimraf yarn.lock && rimraf package.lock.json && rimraf node_modules && npm run install\",\n    \"clean:lib\": \"rimraf node_modules\",\n    \"gen:icon\": \"esno ./build/generate/icon/index.ts\",\n    \"batch:prettier\": \"prettier --write  \\\"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\\\"\",\n    \"upgrade:log\": \"conventional-changelog -p angular -i CHANGELOG.md -s\",\n    \"husky:install\": \"husky install\"\n  },\n  \"dependencies\": {\n    \"@jeecg/online\": \"3.9.1-RC\",\n    \"@jeecg/aiflow\":\"3.9.1-beta\",\n    \"@logicflow/core\": \"^2.0.10\",\n    \"@logicflow/extension\": \"^2.0.14\",\n    \"@logicflow/vue-node-registry\": \"^1.0.12\",\n    \"@iconify/iconify\": \"^3.1.1\",\n    \"@ant-design/colors\": \"^7.2.1\",\n    \"@ant-design/icons-vue\": \"^7.0.1\",\n    \"@vue/shared\": \"^3.5.22\",\n    \"@vueuse/core\": \"^10.11.1\",\n    \"@tinymce/tinymce-vue\": \"4.0.7\",\n    \"@zxcvbn-ts/core\": \"^3.0.4\",\n    \"ant-design-vue\": \"^4.2.6\",\n    \"axios\": \"^1.12.2\",\n    \"china-area-data\": \"^5.0.1\",\n    \"@vant/area-data\": \"^1.5.2\",\n    \"clipboard\": \"^2.0.11\",\n    \"codemirror\": \"^5.65.20\",\n    \"cron-parser\": \"^4.9.0\",\n    \"cropperjs\": \"^1.6.2\",\n    \"crypto-js\": \"^4.2.0\",\n    \"dayjs\": \"^1.11.18\",\n    \"dom-align\": \"^1.12.4\",\n    \"echarts\": \"^5.6.0\",\n    \"emoji-mart-vue-fast\": \"^15.0.5\",\n    \"enquire.js\": \"^2.1.6\",\n    \"intro.js\": \"^7.2.0\",\n    \"lodash-es\": \"^4.17.21\",\n    \"lodash.get\": \"^4.4.2\",\n    \"markdown-it\": \"^14.1.0\",\n    \"markdown-it-link-attributes\": \"^4.0.1\",\n    \"event-source-polyfill\": \"^1.0.31\",\n    \"highlight.js\": \"^11.11.1\",\n    \"@traptitech/markdown-it-katex\": \"^3.6.0\",\n    \"md5\": \"^2.3.0\",\n    \"mockjs\": \"^1.1.0\",\n    \"nprogress\": \"^0.2.0\",\n    \"path-to-regexp\": \"^6.3.0\",\n    \"pinia\": \"2.1.7\",\n    \"print-js\": \"^1.6.0\",\n    \"pinyin-pro\": \"^3.27.0\",\n    \"qs\": \"^6.14.0\",\n    \"qrcode\": \"^1.5.4\",\n    \"resize-observer-polyfill\": \"^1.5.1\",\n    \"showdown\": \"^2.1.0\",\n    \"sortablejs\": \"^1.15.6\",\n    \"swagger-ui-dist\": \"^5.29.3\",\n    \"tinymce\": \"6.6.2\",\n    \"vditor\": \"^3.11.2\",\n    \"vue\": \"^3.5.22\",\n    \"vue-cropper\": \"^0.6.5\",\n    \"vue-cropperjs\": \"^5.0.0\",\n    \"vue-i18n\": \"^9.14.5\",\n    \"vue-infinite-scroll\": \"^2.0.2\",\n    \"vue-print-nb-jeecg\": \"^1.0.13\",\n    \"vue-router\": \"^4.5.1\",\n    \"vue-types\": \"^5.1.3\",\n    \"vuedraggable\": \"^4.1.0\",\n    \"vxe-table\": \"4.13.31\",\n    \"vxe-pc-ui\": \"4.6.12\",\n    \"vxe-table-plugin-antd\": \"4.0.8\",\n    \"xe-utils\": \"3.5.26\",\n    \"xss\": \"^1.0.15\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/cli\": \"^18.6.1\",\n    \"@commitlint/config-conventional\": \"^18.6.3\",\n    \"@iconify/json\": \"^2.2.394\",\n    \"@purge-icons/generated\": \"^0.10.0\",\n    \"@types/codemirror\": \"^5.60.16\",\n    \"@types/crypto-js\": \"^4.2.2\",\n    \"@types/fs-extra\": \"^11.0.4\",\n    \"@types/inquirer\": \"^9.0.9\",\n    \"@types/intro.js\": \"^5.1.5\",\n    \"@types/jest\": \"^29.5.14\",\n    \"@types/lodash-es\": \"^4.17.12\",\n    \"@types/mockjs\": \"^1.0.10\",\n    \"@types/node\": \"^20.19.20\",\n    \"@types/nprogress\": \"^0.2.3\",\n    \"@types/qrcode\": \"^1.5.5\",\n    \"@types/qs\": \"^6.14.0\",\n    \"@types/pinyin\": \"^2.10.2\",\n    \"@types/showdown\": \"^2.0.6\",\n    \"@types/sortablejs\": \"^1.15.8\",\n    \"@typescript-eslint/eslint-plugin\": \"^6.21.0\",\n    \"@typescript-eslint/parser\": \"^6.21.0\",\n    \"@vitejs/plugin-vue\": \"5.2.4\",\n    \"@vitejs/plugin-vue-jsx\": \"4.1.1\",\n    \"@vue/compiler-sfc\": \"^3.5.22\",\n    \"@vue/test-utils\": \"^2.4.6\",\n    \"autoprefixer\": \"^10.4.21\",\n    \"commitizen\": \"^4.3.1\",\n    \"conventional-changelog-cli\": \"^4.1.0\",\n    \"cross-env\": \"^7.0.3\",\n    \"cz-git\": \"^1.12.0\",\n    \"czg\": \"^1.12.0\",\n    \"dotenv\": \"^16.6.1\",\n    \"eslint\": \"^8.57.1\",\n    \"eslint-config-prettier\": \"^9.1.2\",\n    \"eslint-define-config\": \"^2.1.0\",\n    \"eslint-plugin-jest\": \"^27.9.0\",\n    \"eslint-plugin-prettier\": \"^5.5.4\",\n    \"eslint-plugin-vue\": \"^9.33.0\",\n    \"esno\": \"^4.8.0\",\n    \"fs-extra\": \"^11.3.2\",\n    \"http-server\": \"^14.1.1\",\n    \"husky\": \"^8.0.3\",\n    \"inquirer\": \"^9.3.8\",\n    \"is-ci\": \"^3.0.1\",\n    \"jest\": \"^29.7.0\",\n    \"less\": \"^4.4.2\",\n    \"lint-staged\": \"15.2.2\",\n    \"npm-run-all\": \"^4.1.5\",\n    \"picocolors\": \"^1.1.1\",\n    \"postcss\": \"^8.5.6\",\n    \"postcss-html\": \"^1.8.0\",\n    \"postcss-less\": \"^6.0.0\",\n    \"prettier\": \"^3.6.2\",\n    \"pretty-quick\": \"^4.2.2\",\n    \"rimraf\": \"^5.0.10\",\n    \"rollup\": \"4.52.5\",\n    \"rollup-plugin-visualizer\": \"5.14.0\",\n    \"stylelint\": \"^16.25.0\",\n    \"stylelint-config-prettier\": \"^9.0.5\",\n    \"stylelint-config-recommended\": \"^14.0.1\",\n    \"stylelint-config-recommended-vue\": \"^1.6.1\",\n    \"stylelint-config-standard\": \"^36.0.1\",\n    \"stylelint-order\": \"^6.0.4\",\n    \"ts-jest\": \"^29.4.4\",\n    \"ts-node\": \"^10.9.2\",\n    \"typescript\": \"^5.9.3\",\n    \"vite\": \"^6.3.6\",\n    \"vite-plugin-compression\": \"^0.5.1\",\n    \"vite-plugin-html\": \"^3.2.2\",\n    \"vite-plugin-mkcert\": \"^1.17.9\",\n    \"vite-plugin-mock\": \"^2.9.8\",\n    \"vite-plugin-optimize-persist\": \"^0.1.2\",\n    \"vite-plugin-package-config\": \"^0.1.1\",\n    \"vite-plugin-purge-icons\": \"^0.10.0\",\n    \"vite-plugin-svg-icons\": \"^2.0.1\",\n    \"vite-plugin-pwa\": \"^1.1.0\",\n    \"workbox-window\": \"^7.3.0\",\n    \"vite-plugin-qiankun\": \"^1.0.15\",\n    \"@rys-fe/vite-plugin-theme\": \"^0.8.6\",\n    \"vite-plugin-vue-setup-extend-plus\": \"^0.1.0\",\n    \"unocss\": \"^0.58.9\",\n    \"vue-eslint-parser\": \"^9.4.3\",\n    \"vue-tsc\": \"^1.8.27\",\n    \"dingtalk-jsapi\": \"^3.2.0\",\n    \"big.js\": \"^6.2.2\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/jeecgboot/JeecgBoot.git\"\n  },\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/jeecgboot/JeecgBoot/issues\"\n  },\n  \"homepage\": \"https://www.jeecg.com\",\n  \"engines\": {\n    \"node\": \"^18 || >=20\"\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/postcss.config.js",
    "content": "module.exports = {\n  plugins: {\n    autoprefixer: {},\n  },\n};\n"
  },
  {
    "path": "jeecgboot-vue3/prettier.config.js",
    "content": "module.exports = {\n  printWidth: 150,\n  tabWidth: 2,\n  useTabs: false,\n  semi: true, //语句末尾使用分号\n  vueIndentScriptAndStyle: true,\n  singleQuote: true, // 使用单引号\n  quoteProps: 'as-needed',\n  bracketSpacing: true,\n  trailingComma: 'es5',\n  jsxBracketSameLine: false,\n  jsxSingleQuote: false,\n  arrowParens: 'always',\n  insertPragma: false,\n  requirePragma: false,\n  proseWrap: 'never',\n  htmlWhitespaceSensitivity: 'strict',\n  endOfLine: 'auto', // 自动处理换行符（LF/CRLF）\n  rangeStart: 0,\n};\n"
  },
  {
    "path": "jeecgboot-vue3/public/resource/js/iconfont.js",
    "content": "window._iconfont_svg_string_3814468='<svg><symbol id=\"icon-file-excel-fill\" viewBox=\"0 0 1024 1024\"><path d=\"M854.6 288.7c6 6 9.4 14.1 9.4 22.6V928c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32h424.7c8.5 0 16.7 3.4 22.7 9.4l215.2 215.3zM790.2 326L602 137.8V326h188.2zM575.341 477.839l-61.216 102.307-61.839-102.351a12 12 0 0 0-10.27-5.795h-38.437a12 12 0 0 0-6.406 1.853c-5.604 3.538-7.279 10.949-3.741 16.553l82.333 130.422-83.449 132.787a12 12 0 0 0-1.84 6.385c0 6.627 5.373 12 12 12h34.466a12 12 0 0 0 10.208-5.692l62.707-101.474 62.29 101.445A12 12 0 0 0 582.375 772h37.486a12 12 0 0 0 6.484-1.903c5.577-3.58 7.195-11.004 3.614-16.58l-83.831-130.551 85.296-132.47a12 12 0 0 0 1.91-6.496c0-6.627-5.372-12-12-12h-35.695a12 12 0 0 0-10.297 5.839z\"  ></path></symbol><symbol id=\"icon-file-unknown-fill\" viewBox=\"0 0 1024 1024\"><path d=\"M854.6 288.7c6 6 9.4 14.1 9.4 22.6V928c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32h424.7c8.5 0 16.7 3.4 22.7 9.4l215.2 215.3zM790.2 326L602 137.8V326h188.2zM402 549c0 5.4 4.4 9.5 9.8 9.5h32.4c5.4 0 9.8-4.2 9.8-9.4 0-28.2 25.8-51.6 58-51.6s58 23.4 58 51.5c0 25.3-21 47.2-49.3 50.9-19.3 2.8-34.5 20.3-34.7 40.1v32c0 5.5 4.5 10 10 10h32c5.5 0 10-4.5 10-10v-12.2c0-6 4-11.5 9.7-13.3 44.6-14.4 75-54 74.3-98.9-0.8-55.5-49.2-100.8-108.5-101.6-61.4-0.7-111.5 45.6-111.5 103z m110 227c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"  ></path></symbol><symbol id=\"icon-file-text-fill\" viewBox=\"0 0 1024 1024\"><path d=\"M854.6 288.7c6 6 9.4 14.1 9.4 22.6V928c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32h424.7c8.5 0 16.7 3.4 22.7 9.4l215.2 215.3zM790.2 326L602 137.8V326h188.2zM320 482a8 8 0 0 0-8 8v48a8 8 0 0 0 8 8h384a8 8 0 0 0 8-8v-48a8 8 0 0 0-8-8H320z m0 136a8 8 0 0 0-8 8v48a8 8 0 0 0 8 8h184a8 8 0 0 0 8-8v-48a8 8 0 0 0-8-8H320z\"  ></path></symbol><symbol id=\"icon-file-zip-fill\" viewBox=\"0 0 1024 1024\"><path d=\"M854.6 288.7c6 6 9.4 14.1 9.4 22.6V928c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32h424.7c8.5 0 16.7 3.4 22.7 9.4l215.2 215.3zM790.2 326L602 137.8V326h188.2zM296 136v64h64v-64h-64z m64 64v64h64v-64h-64z m-64 64v64h64v-64h-64z m64 64v64h64v-64h-64z m-64 64v64h64v-64h-64z m64 64v64h64v-64h-64z m-64 64v64h64v-64h-64z m0 64v160h128V584H296z m48 48h32v64h-32v-64z\"  ></path></symbol><symbol id=\"icon-file-ppt-fill\" viewBox=\"0 0 1024 1024\"><path d=\"M854.6 288.7c6 6 9.4 14.1 9.4 22.6V928c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32h424.7c8.5 0 16.7 3.4 22.7 9.4l215.2 215.3zM790.2 326L602 137.8V326h188.2zM468.526 760v-91.537h59.277c60.57 0 100.197-39.655 100.197-98.125C628 512.116 588.424 472 528.016 472H424c-6.627 0-12 5.373-12 12v276c0 6.627 5.373 12 12 12h32.526c6.628 0 12-5.373 12-12z m0-139.326h34.907c47.815 0 67.186-12.937 67.186-50.336 0-32.045-18.117-50.121-49.87-50.121h-52.223v100.457z\"  ></path></symbol><symbol id=\"icon-file-word-fill\" viewBox=\"0 0 1024 1024\"><path d=\"M854.6 288.7c6 6 9.4 14.1 9.4 22.6V928c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32h424.7c8.5 0 16.7 3.4 22.7 9.4l215.2 215.3zM790.2 326L602 137.8V326h188.2zM512 566.095l52.814 197.012a12 12 0 0 0 11.59 8.893h31.78a12 12 0 0 0 11.587-8.878l74.375-276a12 12 0 0 0 0.413-3.122c0-6.627-5.373-12-12-12h-35.576a12 12 0 0 0-11.695 9.31l-45.79 199.105-49.76-199.321A12 12 0 0 0 528.097 472h-32.192a12 12 0 0 0-11.643 9.094l-49.66 198.927-46.096-198.732a12 12 0 0 0-11.69-9.289h-35.381a12 12 0 0 0-3.115 0.411c-6.4 1.72-10.194 8.303-8.474 14.703l74.173 276A12 12 0 0 0 415.606 772h31.99a12 12 0 0 0 11.59-8.893L512 566.095z\"  ></path></symbol><symbol id=\"icon-file-pdf-fill\" viewBox=\"0 0 1024 1024\"><path d=\"M854.6 288.7c6 6 9.4 14.1 9.4 22.6V928c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32h424.7c8.5 0 16.7 3.4 22.7 9.4l215.2 215.3zM790.2 326L602 137.8V326h188.2zM633.217 637.256c-15.174-0.489-31.314 0.67-49.65 2.964-24.298-14.987-40.654-35.582-52.274-65.827 0.28-1.152 0.86-3.538 1.063-4.38 0.474-1.958 0.867-3.594 1.243-5.185 4.293-18.13 6.615-31.358 7.3-44.695 0.518-10.074-0.04-19.368-1.827-27.976-3.298-18.584-16.454-29.453-33.021-30.126-15.446-0.627-29.649 7.993-33.281 21.373-5.913 21.612-2.45 50.07 10.08 98.582-15.964 38.056-37.052 82.661-51.203 107.539-18.885 9.74-33.604 18.605-45.953 28.427-16.303 12.966-26.48 26.29-29.286 40.306-1.355 6.48 0.692 14.966 5.36 21.912 5.296 7.879 13.282 12.991 22.855 13.735 24.152 1.877 53.83-23.024 86.59-79.258 3.295-1.09 6.78-2.257 11.026-3.69 2.323-0.783 10.464-3.538 11.91-4.026 7.521-2.54 12.98-4.36 18.376-6.116 23.396-7.612 41.096-12.429 57.21-15.163 27.973 14.973 60.316 24.796 82.098 24.796 17.979 0 30.126-9.319 34.515-23.985 3.857-12.886 0.794-27.824-7.473-36.084-8.56-8.41-24.3-12.434-45.658-13.123z m-247.985 128.42v-0.36l0.126-0.338c1.275-3.421 3.157-7.008 5.6-10.758 4.284-6.576 10.173-13.5 17.472-20.865 3.92-3.955 8.002-7.8 12.79-12.12 1.073-0.969 7.91-7.059 9.189-8.25l11.176-10.407-8.12 12.934c-12.326 19.638-23.46 33.78-33.013 43.004-3.507 3.387-6.6 5.9-9.091 7.505-1.027 0.662-1.916 1.144-2.613 1.424-0.409 0.163-0.771 0.268-1.13 0.302a2.202 2.202 0 0 1-1.117-0.16 2.068 2.068 0 0 1-1.269-1.911z m125.934-218.269l-2.26 4.007-1.39-4.385c-3.114-9.829-5.387-24.641-6.016-37.997-0.716-15.197 0.49-24.323 5.286-24.323 6.74 0 9.831 10.808 10.076 27.053 0.216 14.28-2.03 29.142-5.696 35.645z m-5.81 58.464l1.534-4.05 2.088 3.795c11.69 21.245 26.858 38.967 43.538 51.315l3.595 2.662-4.38 0.904c-16.328 3.372-31.544 8.457-52.34 16.842 2.174-0.876-21.623 8.863-27.638 11.169l-5.252 2.013 2.802-4.877c12.35-21.496 23.758-47.326 36.052-79.773z m157.626 76.261c-7.864 3.104-24.777 0.329-54.569-12.387l-7.561-3.227 8.199-0.607c23.295-1.724 39.807-0.44 49.422 3.08 4.09 1.498 6.824 3.388 8.037 5.553 1.31 2.336 0.71 4.81-1.362 6.31-0.448 0.427-1.155 0.88-2.166 1.278z\"  ></path></symbol><symbol id=\"icon-location-fill\" viewBox=\"0 0 1024 1024\"><path d=\"M512 92C330.05 92 182 240.05 182 422c0 175.65 295.71 487.53 308.28 500.7C495.95 928.67 503.81 932 512 932c0.21 0 0.45 0 0.66 0 8.43 0 16.38-3.93 21.93-10.26l102.39-117.3C773.03 637.79 842 509.12 842 422 842 240.05 693.95 92 512 92zM512 572c-82.86 0-150-67.14-150-150s67.14-150 150-150 150 67.14 150 150S594.86 572 512 572z\"  ></path></symbol><symbol id=\"icon-location\" viewBox=\"0 0 1024 1024\"><path d=\"M512 97.52381c175.055238 0 316.952381 140.312381 316.952381 313.392761 0 3.657143-0.073143 7.314286-0.219429 11.044572-3.900952 103.570286-61.805714 220.038095-156.842666 338.139428a1352.289524 1352.289524 0 0 1-148.382476 156.306286L512 926.47619l-11.50781-10.069333-13.824-12.531809a1352.289524 1352.289524 0 0 1-134.582857-143.774477c-95.012571-118.101333-152.917333-234.569143-156.818285-338.163809A292.08381 292.08381 0 0 1 195.047619 410.940952c0-170.715429 138.044952-309.540571 309.784381-313.295238L512 97.52381z m0 69.095619c-137.97181 0-249.027048 109.83619-249.027048 244.297142 0 2.755048 0.048762 5.558857 0.146286 8.387048 3.145143 82.724571 51.541333 185.173333 141.55581 297.008762a1271.271619 1271.271619 0 0 0 91.91619 102.058667l15.408762 15.11619 15.408762-15.11619a1271.271619 1271.271619 0 0 0 91.91619-102.058667c90.014476-111.835429 138.410667-214.308571 141.55581-297.008762 0.097524-2.82819 0.146286-5.607619 0.146286-8.387048 0-134.460952-111.055238-244.297143-249.027048-244.297142z m0 80.627809c87.527619 0 158.47619 72.167619 158.47619 161.231238 0 89.039238-70.948571 161.231238-158.47619 161.231238s-158.47619-72.167619-158.47619-161.231238c0-89.039238 70.948571-161.231238 158.47619-161.231238z m0 69.095619c-50.005333 0-90.550857 41.252571-90.550857 92.135619 0 50.883048 40.545524 92.135619 90.550857 92.135619s90.550857-41.252571 90.550857-92.135619c0-50.883048-40.545524-92.135619-90.550857-92.135619z\"  ></path></symbol><symbol id=\"icon-drag-1\" viewBox=\"0 0 1024 1024\"><path d=\"M251.28928375 164.38571167h173.80714416v173.80714416H251.28928375V164.38571167z m0 260.71071626h173.80714416v173.80714416H251.28928375V425.09642791z m0 260.71071624h173.80714416v173.80714416H251.28928375v-173.80714416z m347.61428834-521.4214325h173.80714416v173.80714416h-173.80714418V164.38571167z m0 260.71071626h173.80714414v173.80714416h-173.80714414V425.09642791z m0 260.71071624h173.80714414v173.80714416h-173.80714414v-173.80714416z\"  ></path></symbol><symbol id=\"icon-drag-2\" viewBox=\"0 0 1024 1024\"><path d=\"M469.333333 256a85.333333 85.333333 0 1 1-85.333333-85.333333 85.333333 85.333333 0 0 1 85.333333 85.333333z m-85.333333 170.666667a85.333333 85.333333 0 1 0 85.333333 85.333333 85.333333 85.333333 0 0 0-85.333333-85.333333z m0 256a85.333333 85.333333 0 1 0 85.333333 85.333333 85.333333 85.333333 0 0 0-85.333333-85.333333z m256-341.333334a85.333333 85.333333 0 1 0-85.333333-85.333333 85.333333 85.333333 0 0 0 85.333333 85.333333z m0 85.333334a85.333333 85.333333 0 1 0 85.333333 85.333333 85.333333 85.333333 0 0 0-85.333333-85.333333z m0 256a85.333333 85.333333 0 1 0 85.333333 85.333333 85.333333 85.333333 0 0 0-85.333333-85.333333z\"  ></path></symbol><symbol id=\"icon-drag-3\" viewBox=\"0 0 1024 1024\"><path d=\"M147.91111147 238.93333333a45.51111147 45.51111147 0 0 1 45.5111104-45.51111146h637.15555626a45.51111147 45.51111147 0 1 1 0 91.02222293H193.42222187a45.51111147 45.51111147 0 0 1-45.5111104-45.51111147z m0 182.0444448a45.51111147 45.51111147 0 0 1 45.5111104-45.51111146h637.15555626a45.51111147 45.51111147 0 1 1 0 91.02222186H193.42222187a45.51111147 45.51111147 0 0 1-45.5111104-45.5111104z m0 182.04444374a45.51111147 45.51111147 0 0 1 45.5111104-45.5111104h637.15555626a45.51111147 45.51111147 0 1 1 0 91.02222186H193.42222187a45.51111147 45.51111147 0 0 1-45.5111104-45.51111146z m0 182.0444448a45.51111147 45.51111147 0 0 1 45.5111104-45.51111147h637.15555626a45.51111147 45.51111147 0 1 1 0 91.02222293H193.42222187a45.51111147 45.51111147 0 0 1-45.5111104-45.51111146z\"  ></path></symbol><symbol id=\"icon-eye\" viewBox=\"0 0 1024 1024\"><path d=\"M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3-7.7 16.2-7.7 35.2 0 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766z\"  ></path><path d=\"M508 336c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176z m0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z\"  ></path></symbol><symbol id=\"icon-eye-close\" viewBox=\"0 0 1024 1024\"><path d=\"M955.733333 492.8c-6.4-12.8-162.133333-317.866667-443.733333-317.866667-23.466667 0-46.933333 2.133333-70.4 6.4-17.066667 4.266667-29.866667 19.2-25.6 36.266667 4.266667 17.066667 19.2 29.866667 36.266667 25.6 19.2-4.266667 38.4-4.266667 57.6-4.266667 209.066667 0 345.6 209.066667 379.733333 266.666667-10.666667 19.2-32 53.333333-64 91.733333-10.666667 12.8-8.533333 34.133333 4.266667 44.8 6.4 4.266667 12.8 6.4 21.333333 6.4s19.2-4.266667 25.6-10.666666c51.2-61.866667 78.933333-115.2 78.933333-117.333334 6.4-8.533333 6.4-19.2 0-27.733333zM215.466667 125.866667c-12.8-12.8-32-12.8-44.8 0-12.8 12.8-12.8 32 0 44.8l91.733333 91.733333C138.666667 354.133333 72.533333 484.266667 68.266667 490.666667c-4.266667 8.533333-4.266667 19.2 0 29.866666 6.4 12.8 162.133333 315.733333 443.733333 315.733334 83.2 0 164.266667-27.733333 241.066667-81.066667l96 96c6.4 6.4 14.933333 8.533333 23.466666 8.533333s17.066667-2.133333 23.466667-8.533333c12.8-12.8 12.8-32 0-44.8L215.466667 125.866667z m243.2 334.933333l104.533333 104.533333c-12.8 12.8-32 21.333333-51.2 21.333334-40.533333 0-74.666667-34.133333-74.666667-74.666667 0-19.2 8.533333-38.4 21.333334-51.2zM512 772.266667c-209.066667 0-345.6-209.066667-379.733333-266.666667 21.333333-36.266667 81.066667-130.133333 174.933333-196.266667l104.533333 104.533334c-25.6 25.6-38.4 59.733333-38.4 96 0 76.8 61.866667 138.666667 138.666667 138.666666 36.266667 0 70.4-14.933333 96-38.4l98.133333 98.133334c-61.866667 42.666667-128 64-194.133333 64z\" fill=\"#666666\" ></path></symbol><symbol id=\"icon-sigma\" viewBox=\"0 0 1024 1024\"><path d=\"M752 856H272.8c-9.6 0-17.6-5.6-21.6-13.6s-2.4-18.4 3.2-25.6l254.4-311.2-241.6-298.4c-5.6-7.2-7.2-16.8-3.2-25.6s12.8-13.6 21.6-13.6H728c13.6 0 24 10.4 24 24s-10.4 24-24 24H336l221.6 274.4c7.2 8.8 7.2 21.6 0 30.4L323.2 808H752c13.6 0 24 10.4 24 24s-10.4 24-24 24z\"  ></path></symbol><symbol id=\"icon-time1\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.96 64 64 264.96 64 512s200.96 448 448 448 448-200.96 448-448S759.04 64 512 64zM512 895.712c-211.584 0-383.712-172.16-383.712-383.712C128.288 300.416 300.416 128.288 512 128.288c211.552 0 383.712 172.128 383.712 383.712C895.712 723.552 723.552 895.712 512 895.712z\"  ></path><path d=\"M671.968 512 512 512 512 288.064c0-17.76-14.24-32.128-32-32.128s-32 14.4-32 32.128L448 544c0 17.76 14.272 32 32 32l191.968 0c17.76 0 32.128-14.24 32.128-32S689.728 512 671.968 512z\"  ></path></symbol><symbol id=\"icon-select2\" viewBox=\"0 0 1024 1024\"><path d=\"M768 160 256 160C204.8 160 160 204.8 160 256l0 512c0 51.2 44.8 96 96 96l512 0c51.2 0 96-44.8 96-96L864 256C864 204.8 819.2 160 768 160zM800 768c0 19.2-12.8 32-32 32L256 800c-19.2 0-32-12.8-32-32L224 256c0-19.2 12.8-32 32-32l512 0c19.2 0 32 12.8 32 32L800 768z\"  ></path><path d=\"M448 672c-6.4 0-19.2 0-25.6-6.4l-128-128c-12.8-12.8-12.8-32 0-44.8s32-12.8 44.8 0L448 595.2l230.4-230.4c12.8-12.8 32-12.8 44.8 0s12.8 32 0 44.8l-256 256C467.2 672 454.4 672 448 672z\"  ></path></symbol><symbol id=\"icon-department\" viewBox=\"0 0 1024 1024\"><path d=\"M926.592 922.688l-157.312 0c-18.432 0-33.344-21.056-33.344-46.976L735.936 745.6c0-25.984 14.912-46.976 33.344-46.976l157.312 0c18.432 0 33.408 20.992 33.408 46.976l0 130.048C960 901.632 945.088 922.688 926.592 922.688zM773.312 513.152l-224 0L549.312 624 512 624 512 513.152 249.472 513.152C171.008 513.216 174.848 566.976 174.848 624L138.688 624 138.688 569.28c0-49.472 39.552-94.144 88.448-94.208L512 474.688 512 400l37.312 0 0 74.688 260.16 0c48.896 0.064 74.624 25.152 74.688 74.688L884.16 624 848 624C847.936 550.272 835.712 513.216 773.312 513.152zM653.504 325.312 406.528 325.312c-24.256 0-43.84-21.824-43.84-48.768L362.688 150.08c0-26.944 19.648-48.768 43.84-48.768l246.976 0c24.256 0 43.968 21.824 43.968 48.768l0 126.464C697.472 303.488 677.824 325.312 653.504 325.312zM288 745.6l0 130.048c0 25.92-14.976 46.976-33.344 46.976L97.344 922.624C78.912 922.688 64 901.632 64 875.712L64 745.6c0-25.984 14.912-46.976 33.344-46.976l157.312 0C273.024 698.688 288 719.68 288 745.6zM433.344 698.688l157.312 0c18.432 0 33.344 20.992 33.344 46.976l0 130.048c0 25.92-14.912 46.976-33.344 46.976L433.344 922.688c-18.432 0-33.344-21.056-33.344-46.976L400 745.6C400 719.68 414.912 698.688 433.344 698.688z\"  ></path></symbol><symbol id=\"icon-tipsdepartmentdown\" viewBox=\"0 0 1025 1024\"><path d=\"M211.451008 532.32448 509.990336 532.32448 509.990336 658.368 552.443008 658.368 552.443008 532.31936 807.169408 532.31936C878.11072 532.31936 892.079872 574.52288 892.079872 658.368L933.177408 658.368 933.177408 573.45792C938.679552 532.06464 909.579584 494.04416 868.18656 488.54208 861.563648 487.6608 854.849088 487.66592 848.226176 488.5472L552.40224 488.5472 552.40224 403.64224 509.949568 403.64224 509.949568 488.55232 185.978368 489.06176C129.103104 491.91488 84.673728 539.23776 85.40224 596.17408L85.40224 658.368 126.540544 658.368C126.540544 593.49952 122.296768 532.36544 211.451008 532.32448L211.451008 532.32448ZM390.014208 318.73152 670.890816 318.73152C699.960192 317.13152 722.284352 292.36224 720.85792 263.28256L720.85792 119.44896C722.279296 90.36928 699.955072 65.6 670.890816 64L390.014208 64C360.970304 65.61984 338.681728 90.38976 340.128576 119.44896L340.128576 263.28768C338.681728 292.34176 360.965248 317.11168 390.014208 318.73152L390.014208 318.73152ZM217.263872 723.2 38.405248 723.2C13.605056 728.1312-3.033664 751.56608 0.491712 776.60608L0.491712 924.5152C-3.013312 949.55008 13.615232 972.9696 38.405248 977.92128L217.263872 977.92128C242.058944 972.9696 258.697664 949.5552 255.218112 924.5152L255.218112 776.60608C258.723136 751.56096 242.06912 728.1312 217.263872 723.2L217.263872 723.2ZM601.314624 723.2 422.410112 723.2C397.594688 728.11136 380.950848 751.56096 384.49664 776.60608L384.49664 924.5152C380.991616 949.55008 397.62016 972.9696 422.410112 977.92128L601.314624 977.92128C626.104576 972.9696 642.728064 949.55008 639.228096 924.5152L639.228096 776.60608C642.748416 751.56608 626.114816 728.1312 601.314624 723.2L601.314624 723.2ZM1023.218112 776.60608C1026.743552 751.55584 1010.084416 728.11136 985.263872 723.2L806.405248 723.2C781.605056 728.1312 764.966336 751.56608 768.491712 776.60608L768.491712 924.5152C764.986688 949.55008 781.615232 972.9696 806.405248 977.92128L985.263872 977.92128C1010.06912 972.99008 1026.71808 949.56032 1023.218112 924.5152L1023.218112 776.60608 1023.218112 776.60608ZM959.785728 813.93792C961.55072 801.39648 953.210368 789.65888 940.783936 787.2L851.238144 787.2C838.821952 789.66912 830.491712 801.4016 832.256768 813.93792L832.256768 887.98848C830.501952 900.52224 838.827008 912.24704 851.238144 914.7264L940.783936 914.7264C953.202688 912.25728 961.537984 900.52736 959.785728 887.98848L959.785728 813.93792 959.785728 813.93792ZM575.785728 813.93792C577.55072 801.39648 569.210368 789.65888 556.783936 787.2L467.238144 787.2C454.821952 789.66912 446.491712 801.4016 448.256768 813.93792L448.256768 887.98848C446.501952 900.52224 454.827008 912.24704 467.238144 914.7264L556.783936 914.7264C569.202688 912.25728 577.537984 900.52736 575.785728 887.98848L575.785728 813.93792 575.785728 813.93792ZM191.785728 813.93792C193.55072 801.39648 185.210368 789.65888 172.783936 787.2L83.238144 787.2C70.821952 789.66912 62.491712 801.4016 64.256768 813.93792L64.256768 887.98848C62.501952 900.52224 70.827008 912.24704 83.238144 914.7264L172.783936 914.7264C185.202688 912.25728 193.537984 900.52736 191.785728 887.98848L191.785728 813.93792 191.785728 813.93792Z\" fill=\"#333\" ></path></symbol><symbol id=\"icon-input1\" viewBox=\"0 0 1024 1024\"><path d=\"M118.784 727.04h778.24V296.96h-778.24v430.08zM77.824 256h860.16v512H77.824V256zM194.56 409.6v204.8c0 12.288 8.192 20.48 20.48 20.48s20.48-8.192 20.48-20.48V409.6c0-12.288-8.192-20.48-20.48-20.48s-20.48 8.192-20.48 20.48z\"  ></path></symbol><symbol id=\"icon-calendar\" viewBox=\"0 0 1024 1024\"><path d=\"M853.333333 149.333333h-138.666666V106.666667c0-17.066667-14.933333-32-32-32s-32 14.933333-32 32v42.666666h-277.333334V106.666667c0-17.066667-14.933333-32-32-32s-32 14.933333-32 32v42.666666H170.666667c-40.533333 0-74.666667 34.133333-74.666667 74.666667v618.666667C96 883.2 130.133333 917.333333 170.666667 917.333333h682.666666c40.533333 0 74.666667-34.133333 74.666667-74.666666v-618.666667C928 183.466667 893.866667 149.333333 853.333333 149.333333zM170.666667 213.333333h138.666666v64c0 17.066667 14.933333 32 32 32s32-14.933333 32-32v-64h277.333334v64c0 17.066667 14.933333 32 32 32s32-14.933333 32-32v-64H853.333333c6.4 0 10.666667 4.266667 10.666667 10.666667v194.133333c-4.266667-2.133333-6.4-2.133333-10.666667-2.133333H170.666667c-4.266667 0-6.4 0-10.666667 2.133333v-194.133333c0-6.4 4.266667-10.666667 10.666667-10.666667z m682.666666 640H170.666667c-6.4 0-10.666667-4.266667-10.666667-10.666666V477.866667c4.266667 2.133333 6.4 2.133333 10.666667 2.133333h682.666666c4.266667 0 6.4 0 10.666667-2.133333v364.8c0 6.4-4.266667 10.666667-10.666667 10.666666z\"  ></path><path d=\"M384 608h-85.333333c-17.066667 0-32 14.933333-32 32s14.933333 32 32 32h85.333333c17.066667 0 32-14.933333 32-32s-14.933333-32-32-32zM725.333333 608h-192c-17.066667 0-32 14.933333-32 32s14.933333 32 32 32h192c17.066667 0 32-14.933333 32-32s-14.933333-32-32-32z\"  ></path></symbol><symbol id=\"icon-email1\" viewBox=\"0 0 1024 1024\"><path d=\"M874.666667 181.333333H149.333333c-40.533333 0-74.666667 34.133333-74.666666 74.666667v512c0 40.533333 34.133333 74.666667 74.666666 74.666667h725.333334c40.533333 0 74.666667-34.133333 74.666666-74.666667V256c0-40.533333-34.133333-74.666667-74.666666-74.666667z m-725.333334 64h725.333334c6.4 0 10.666667 4.266667 10.666666 10.666667v25.6L512 516.266667l-373.333333-234.666667V256c0-6.4 4.266667-10.666667 10.666666-10.666667z m725.333334 533.333334H149.333333c-6.4 0-10.666667-4.266667-10.666666-10.666667V356.266667l356.266666 224c4.266667 4.266667 10.666667 4.266667 17.066667 4.266666s12.8-2.133333 17.066667-4.266666l356.266666-224V768c0 6.4-4.266667 10.666667-10.666666 10.666667z\"  ></path></symbol><symbol id=\"icon-user1\" viewBox=\"0 0 1024 1024\"><path d=\"M512 74.666667C270.933333 74.666667 74.666667 270.933333 74.666667 512S270.933333 949.333333 512 949.333333 949.333333 753.066667 949.333333 512 753.066667 74.666667 512 74.666667zM288 810.666667c0-123.733333 100.266667-224 224-224S736 686.933333 736 810.666667c-61.866667 46.933333-140.8 74.666667-224 74.666666s-162.133333-27.733333-224-74.666666z m128-384c0-53.333333 42.666667-96 96-96s96 42.666667 96 96-42.666667 96-96 96-96-42.666667-96-96z m377.6 328.533333c-19.2-96-85.333333-174.933333-174.933333-211.2 32-29.866667 51.2-70.4 51.2-117.333333 0-87.466667-72.533333-160-160-160s-160 72.533333-160 160c0 46.933333 19.2 87.466667 51.2 117.333333-89.6 36.266667-155.733333 115.2-174.933334 211.2-55.466667-66.133333-91.733333-149.333333-91.733333-243.2 0-204.8 168.533333-373.333333 373.333333-373.333333S885.333333 307.2 885.333333 512c0 93.866667-34.133333 177.066667-91.733333 243.2z\"  ></path></symbol><symbol id=\"icon-number1\" viewBox=\"0 0 1024 1024\"><path d=\"M279.273 791.273h512a46.545 46.545 0 0 1 0 93.09h-512a46.545 46.545 0 0 1 0-93.09z m33.838-617.984v478.347H193.722V395.171c0-37.004-0.884-59.299-2.653-66.746a24.948 24.948 0 0 0-14.615-16.99c-8.006-3.863-25.786-5.771-53.341-5.771H111.29v-55.855c57.717-12.38 101.562-37.888 131.491-76.52h70.284z m303.71 396.8v81.547H354.163v-68.235c77.778-127.256 124.044-206.01 138.706-236.218 14.662-30.255 22.016-53.854 22.016-70.75 0-13.032-2.234-22.714-6.656-29.137-4.422-6.377-11.171-9.588-20.247-9.588a22.249 22.249 0 0 0-20.201 10.612c-4.469 7.121-6.656 21.178-6.656 42.263v45.522H354.164V318.65c0-26.763 1.397-47.942 4.143-63.348 2.746-15.5 9.542-30.72 20.387-45.661 10.798-14.988 24.902-26.298 42.217-33.978 17.361-7.68 38.167-11.544 62.37-11.544 47.477 0 83.317 11.776 107.707 35.328 24.296 23.552 36.445 53.341 36.445 89.368 0 27.368-6.842 56.32-20.48 86.853-13.731 30.534-54.04 95.325-121.018 194.42H616.82z m270.615-189.394c18.152 6.098 31.65 16.105 40.494 29.976 8.844 13.917 13.312 46.452 13.312 97.652 0 38.028-4.329 67.49-13.033 88.53-8.657 20.945-23.598 36.91-44.87 47.848-21.27 10.938-48.593 16.384-81.873 16.384-37.795 0-67.49-6.33-89.088-19.084-21.55-12.66-35.747-28.253-42.542-46.638-6.796-18.432-10.194-50.362-10.194-95.884v-37.841h119.39v77.73c0 20.667 1.21 33.84 3.723 39.425 2.42 5.585 7.913 8.424 16.337 8.424 9.31 0 15.36-3.537 18.34-10.612 2.932-7.121 4.421-25.6 4.421-55.575v-33.047c0-18.34-2.048-31.744-6.19-40.216a30.72 30.72 0 0 0-18.34-16.71c-8.052-2.653-23.738-4.189-46.964-4.561V357.05c28.393 0 45.894-1.07 52.597-3.258a22.947 22.947 0 0 0 14.475-14.15c2.933-7.307 4.422-18.711 4.422-34.257V278.76c0-16.757-1.722-27.741-5.12-33.048-3.49-5.352-8.844-8.005-16.151-8.005-8.285 0-13.964 2.792-16.99 8.378-3.025 5.632-4.56 17.64-4.56 35.933v39.284h-119.39V280.53c0-45.66 10.473-76.567 31.325-92.625 20.9-16.058 54.086-24.064 99.608-24.064 56.878 0 95.51 11.17 115.805 33.373 20.293 22.249 30.394 53.202 30.394 92.765 0 26.81-3.63 46.173-10.892 58.089-7.307 11.916-20.107 22.807-38.446 32.628z\"  ></path></symbol><symbol id=\"icon-190tree\" viewBox=\"0 0 1024 1024\"><path d=\"M800 832c-41.6 0-76.8 25.6-89.6 64H288c-19.2 0-32-12.8-32-32V537.6c0 3.2 22.4 6.4 32 6.4h422.4c12.8 38.4 48 64 89.6 64 54.4 0 96-41.6 96-96s-41.6-96-96-96c-41.6 0-76.8 25.6-89.6 64H288c-19.2 0-32-12.8-32-32V185.6c32-12.8 64-48 64-89.6 0-54.4-41.6-96-96-96-51.2 0-96 41.6-96 96 0 41.6 32 76.8 64 89.6V864c0 54.4 44.8 96 96 96h422.4c12.8 38.4 48 64 89.6 64 54.4 0 96-41.6 96-96s-41.6-96-96-96z m0-384c35.2 0 64 28.8 64 64s-28.8 64-64 64-64-28.8-64-64 28.8-64 64-64zM160 96c0-35.2 28.8-64 64-64s64 28.8 64 64-28.8 64-64 64-64-28.8-64-64z m640 896c-35.2 0-64-28.8-64-64s28.8-64 64-64 64 28.8 64 64-28.8 64-64 64z\"  ></path></symbol><symbol id=\"icon-dict-fill\" viewBox=\"0 0 1024 1024\"><path d=\"M764 888H200V324a4 4 0 0 0-4-4h-64a4 4 0 0 0-4 4v596a40 40 0 0 0 40 40h596a4 4 0 0 0 4-4v-64a4 4 0 0 0-4-4zM551.9 311.8h-57.5v327.1h56.8c83 0 120.4-60.6 120.4-172.6 0-99.9-40.2-154.5-119.7-154.5zM856 128H312a40 40 0 0 0-40 40v608a40 40 0 0 0 40 40h544a40 40 0 0 0 40-40V168a40 40 0 0 0-40-40zM552.8 694H430.2a4 4 0 0 1-4-4V260a4 4 0 0 1 4-4h128.5c116 0 183.1 74.2 183.1 208.9 0 144.8-63.5 229.1-189 229.1z\"  ></path></symbol><symbol id=\"icon-user\" viewBox=\"0 0 1024 1024\"><path d=\"M648.6 538.9c63.2-46.6 104.2-121.6 104.2-206C752.8 191.8 638 77 496.9 77S241 191.8 241 332.9c0 84.4 41.1 159.4 104.2 206C200.4 598.7 98.3 741.4 98.3 907.5c0 22.1 17.9 40 40 40s40-17.9 40-40c0-175.8 143-318.7 318.7-318.7s318.7 143 318.7 318.7c0 22.1 17.9 40 40 40s40-17.9 40-40c-0.1-166.1-102.3-308.8-247.1-368.6z m-327.7-206c0-97.1 79-176 176-176s176 79 176 176-79 176-176 176-176-79-176-176z\"  ></path></symbol><symbol id=\"icon-user-circle\" viewBox=\"0 0 1024 1024\"><path d=\"M509.44 1018.368c-141.312 0-277.504-59.904-372.736-164.352l-19.968-21.504 19.968-21.504c95.744-104.448 231.424-164.352 372.736-164.352 141.312 0 277.504 59.904 372.736 164.352l19.968 21.504-19.968 21.504c-95.232 104.448-231.424 164.352-372.736 164.352zM204.8 832.512c81.92 77.824 190.976 121.856 304.64 121.856 113.664 0 222.72-44.032 304.64-121.856-81.92-77.824-190.976-121.856-304.64-121.856-113.664 0-222.72 44.032-304.64 121.856zM509.952 600.576c-89.088 0-161.792-72.704-161.792-161.792 0-89.088 72.704-161.792 161.792-161.792s161.792 72.704 161.792 161.792c0 89.088-72.192 161.792-161.792 161.792z m0-259.584c-53.76 0-97.792 44.032-97.792 97.792s44.032 97.792 97.792 97.792 97.792-44.032 97.792-97.792-43.52-97.792-97.792-97.792z\"  ></path><path d=\"M119.296 719.36c-33.792-63.488-51.2-134.144-51.2-206.848 0-243.712 198.144-441.344 441.344-441.344s441.344 198.144 441.344 441.344c0 72.192-17.92 143.36-51.2 206.336 16.384 15.36 31.744 31.744 46.08 49.152 45.568-77.312 69.12-165.376 69.12-255.488 0-279.04-226.816-505.856-505.856-505.856C230.4 7.168 4.096 233.984 4.096 512.512c0 90.112 24.064 178.688 69.632 255.488 13.824-16.896 29.184-33.28 45.568-48.64z\"  ></path></symbol><symbol id=\"icon-dict\" viewBox=\"0 0 1024 1024\"><path d=\"M487.204 238.103h-81.567v340.516h81.567c59.425 0 102.943-13.871 130.303-41.101 26.721-27.868 40.083-70.88 40.083-129.158 0-59.678-13.362-103.329-40.083-129.923-27.359-27.104-70.877-40.336-130.303-40.336z\"  ></path><path d=\"M778.859 61.224H245.306c-59.678 0-108.414 48.738-108.414 108.414v689.437c0 59.677 48.737 108.414 108.414 108.414h533.553c42.628 0 79.657-24.941 97.346-60.826H252.559c-22.269 0-40.591-18.197-40.591-40.59v-51.282c0-22.269 18.197-40.59 40.591-40.59h487.874c80.801 0 146.845-66.042 146.845-146.845V169.641c0-59.678-48.862-108.418-108.418-108.418zM677.696 581.291c-40.083 42.374-98.235 63.626-175.73 63.626H327.507v-473.11h174.458c77.494 0 135.647 21.25 175.73 63.625 38.048 39.703 57.518 97.346 57.518 172.931 0 74.95-19.468 132.59-57.516 172.93z\"  ></path></symbol><symbol id=\"icon-btn\" viewBox=\"0 0 1828 1024\"><path d=\"M1322.88370217 78.26335901C1554.20991077 78.26335901 1745.77692672 273.44484711 1745.77692672 512s-191.56701595 433.73664099-426.50769668 433.73664099H509.62750045C274.68682069 945.73664099 83.11980375 750.55515289 83.11980375 512S274.68682069 78.26335901 509.62750045 78.26335901h813.25620172m0-72.28944H509.62750045C234.92762806 5.97391901 10.83036375 233.68565546 10.83036375 512s224.0972643 506.02608099 498.7971367 506.02608099h813.25620172C1593.96910242 1018.02608099 1818.0663677 790.31434454 1818.0663677 512S1593.96910242 5.97391901 1322.88370217 5.97391901z\"  ></path><path d=\"M715.65240499 501.15658355c28.91577619-14.4578876 39.75919165-36.1447205 39.75919265-65.0604957-3.61447214-46.98813595-28.91577619-75.90391215-83.13285646-75.90391215H589.14588474c-21.68683191 0-32.53024835 10.84341645-32.53024835 32.53024835v249.39856834c0 21.68683191 10.84341645 32.53024835 32.53024835 32.53024836h90.36180075c65.0604957-3.61447214 97.59074405-36.1447205 101.20521619-97.59074505-3.61447214-43.3736638-25.30130405-68.67496785-65.06049669-75.90391215z m-93.9762719-86.7473276h32.53024835c21.68683191 0 36.1447205 10.84341645 36.1447195 32.53024835 0 21.68683191-14.4578876 32.53024835-36.1447195 36.14471951h-32.53024835v-68.67496786z m50.60260809 198.79596024h-50.60260809v-72.28944h46.98813595c28.91577619 0 43.3736638 10.84341645 46.98813595 36.14471951-3.61447214 21.68683191-18.07235974 32.53024835-43.37366381 36.14472049zM968.66544549 356.57770356H806.01420573c-14.4578876 0-25.30130405 10.84341645-25.30130405 28.91577619 0 21.68683191 10.84341645 32.53024835 25.30130405 32.53024835h46.98813596v224.09726429c0 21.68683191 10.84341645 32.53024835 32.53024735 32.53024836 21.68683191 0 32.53024835-10.84341645 32.53024835-32.53024836v-224.09726431h46.98813596c18.07235974 0 28.91577619-10.84341645 28.91577619-32.53024833 3.61447214-18.07235974-7.22894431-28.91577619-25.30130405-28.91577619zM1239.75084573 352.9632314c-21.68683191 0-32.53024835 14.4578876-32.53024733 36.1447205v166.2657119L1066.25618955 367.42112001c-7.22894431-10.84341645-14.4578876-14.4578876-28.91577622-14.45788861-21.68683191 0-32.53024835 14.4578876-32.53024734 36.1447205v253.01304049c0 21.68683191 10.84341645 32.53024835 32.53024734 32.53024836s32.53024835-10.84341645 32.53024835-32.53024836V475.8552795l137.34993672 184.33807265c7.22894431 7.22894431 14.4578876 10.84341645 28.91577617 10.84341643 21.68683191 0 32.53024835-10.84341645 32.53024736-32.53024833v-253.0130405c0-18.07235974-10.84341645-32.53024835-28.9157762-32.53024835z\"  ></path></symbol><symbol id=\"icon-btn2\" viewBox=\"0 0 1024 1024\"><path d=\"M839.68 220.72888889h-72.81777778a36.40888889 36.40888889 0 0 0-36.22684444-36.40888889H111.32017778C91.47733333 184.32 75.09333333 200.74040889 75.09333333 220.98375111v472.80583111A36.40888889 36.40888889 0 0 0 111.32017778 730.45333333H111.50222222v72.81777778H75.09333333c-40.19541333 0-72.81777778-32.40391111-72.81777778-72.70855111V184.21077333C2.27555555 144.05176889 35.11637333 111.50222222 75.09333333 111.50222222h691.76888889c40.19541333 0 72.81777778 32.40391111 72.81777778 72.70855111V220.72888889zM147.91111111 329.77351111A72.81777778 72.81777778 0 0 1 220.91093333 257.13777778h727.81368889A72.81777778 72.81777778 0 0 1 1021.72444445 329.77351111v510.08853334A72.81777778 72.81777778 0 0 1 948.72462222 912.49777778H220.91093333A72.81777778 72.81777778 0 0 1 147.91111111 839.86204445v-510.08853334z m72.81777778 36.84579556v436.39694222A36.37248 36.37248 0 0 0 256.84650667 839.68h655.94254222c19.55157333 0 36.11761778-16.384 36.11761778-36.66375111V366.61930667A36.37248 36.37248 0 0 0 912.78904889 329.95555555H256.84650667C237.29493333 329.95555555 220.72888889 346.33955555 220.72888889 366.61930667z m249.43729778 271.24622222c0 13.83537778-2.18453333 26.36003555-6.5536 37.50115556-4.33265778 11.14112-10.37653333 20.53461333-18.05880889 28.21688888-7.68227555 7.64586667-16.60245333 13.54410667-26.76053333 17.62190222a86.54392889 86.54392889 0 0 1-32.51313778 6.08028445H293.54666667V439.18222222h82.35690666c9.75758222 0 18.93262222 1.82044445 27.52512 5.42492445 8.59249778 3.64088889 16.20195555 8.66531555 22.90119112 15.10968888 6.66282667 6.48078222 11.90570667 14.45432889 15.76504888 23.9570489a83.99530667 83.99530667 0 0 1 4.40547556 45.36547555c-0.87381333 4.84238222-2.18453333 9.42990222-3.82293334 13.79896889-1.67480889 4.36906667-3.78652445 8.33763555-6.37155555 11.94211556a31.60291555 31.60291555 0 0 1-8.84736 8.59249777c5.13365333 1.82044445 10.26730667 5.09724445 15.40096 9.93962667 5.09724445 4.80597333 9.75758222 10.55857778 13.83537778 17.14858666a91.85962667 91.85962667 0 0 1 13.47128889 47.40437334z m-57.70808889 0c0-12.63388445-3.71370667-22.02737778-11.17752889-28.21688889a38.19292445 38.19292445 0 0 0-25.01290667-9.24785778h-28.47175111v74.49258667h28.47175111c4.62392889 0 9.10222222-0.72817778 13.47128889-2.25735111a33.20490667 33.20490667 0 0 0 11.54161778-6.77205333 33.31413333 33.31413333 0 0 0 8.08277333-11.5052089c2.07530667-4.66033778 3.09475555-10.15808 3.09475556-16.49322666z m-18.85980445-117.85557334c0-10.55857778-2.76707555-18.05880889-8.26481778-22.5735111a28.69020445 28.69020445 0 0 0-18.67776-6.77205334h-18.85980444v58.25422222h18.85980444c6.91768889 0 13.14360889-2.18453333 18.67776-6.5536 5.49774222-4.36906667 8.26481778-11.79648 8.26481778-22.35505778z m189.47185778-24.83086222v232.10666667h-59.23726222v-232.54357333h-74.27413334V439.18222222h207.42144v55.99687111h-73.91004444zM830.75982222 730.45333333l-89.12896-163.18464v160.01706667H682.02951111V439.18222222h48.09614222l86.36188445 145.63555556v-145.63555556H876.08888889v291.27111111h-45.32906667z\"  ></path></symbol><symbol id=\"icon-btn3\" viewBox=\"0 0 1536 1024\"><path d=\"M452.488242 541.251023h-100.802821v113.623092h99.272956c22.504318 0 40.41904-3.564586 53.224012-10.709057 16.369558-9.179191 24.569636-23.559925 24.569635-43.998924 0-20.989751-6.119461-35.814145-17.914722-45.054532q-18.419577-13.829982-58.34906-13.860579zM497.527475 479.367974c10.2195-8.735531 15.880001-22.550214 15.880001-41.489945 0-17.379269-5.660501-30.184241-15.880001-37.818269-11.24451-8.184779-28.654376-12.315415-53.224012-12.315415h-92.618042v104.367407h91.593032c25.594645 0 43.494069-4.589596 54.249022-12.743778z\"  ></path><path d=\"M1407.980877 0H128.003825A128.003825 128.003825 0 0 0 0 128.003825v767.99235a128.003825 128.003825 0 0 0 128.003825 128.003825h1279.977052a128.003825 128.003825 0 0 0 128.003824-128.003825v-767.99235A128.003825 128.003825 0 0 0 1407.980877 0zM550.751487 682.503481c-21.509905 14.30424-52.199002 21.418113-91.103476 21.418113H291.806496V338.620372h167.351959c36.334299 0 64.958078 8.689635 85.458272 26.130099 18.909134 16.369558 28.623779 38.36902 28.623779 65.998386 0 20.439-5.094451 37.879463-14.809096 52.183703-9.745242 13.325126-23.559925 22.947979-41.964203 30.19954 24.034183 4.589596 41.964204 14.30424 54.249021 29.17453 11.749365 14.319539 17.899423 34.253683 17.899423 58.823319 0 36.869752-12.804972 63.994263-37.864164 81.373532zM916.297487 389.809663h-119.742552v314.188425h-59.878926V389.809663h-119.711955v-51.189291h299.333433z m346.59097 314.188425h-58.333761L1021.949981 436.868318h-2.05002v267.12977h-59.94012V338.620372h59.878926L1200.485254 602.262049h1.988825V338.620372h60.368482z\"  ></path></symbol><symbol id=\"icon-popup2\" viewBox=\"0 0 1024 1024\"><path d=\"M989 614.5c-19.3 0-35 15.7-35 35v232.9c0 39.5-32.1 71.6-71.6 71.6H141.6c-6.7 0-13.2-1-19.4-2.7L486 587.5V773c0 19.3 15.7 35 35 35s35-15.7 35-35V501.3c0-0.3 0-0.5-0.1-0.8 0-0.3 0-0.6-0.1-0.9 0-0.3-0.1-0.7-0.1-1 0-0.2-0.1-0.4-0.1-0.7-0.1-0.4-0.1-0.7-0.2-1.1 0-0.2-0.1-0.4-0.1-0.6-0.1-0.4-0.2-0.7-0.2-1.1 0-0.2-0.1-0.4-0.1-0.6-0.1-0.4-0.2-0.7-0.3-1.1-0.1-0.2-0.1-0.4-0.2-0.6-0.1-0.3-0.2-0.6-0.3-1-0.1-0.2-0.1-0.4-0.2-0.7l-0.3-0.9c-0.1-0.3-0.2-0.5-0.3-0.8-0.1-0.3-0.2-0.5-0.3-0.7-0.1-0.3-0.3-0.6-0.4-0.8l-0.3-0.6c-0.2-0.3-0.3-0.6-0.5-0.9-0.1-0.2-0.2-0.4-0.3-0.5-0.2-0.3-0.4-0.6-0.6-1-0.1-0.2-0.2-0.3-0.3-0.5-0.2-0.3-0.4-0.6-0.6-1-0.1-0.2-0.2-0.3-0.3-0.5l-0.6-0.9c-0.1-0.2-0.3-0.3-0.4-0.5-0.2-0.3-0.4-0.5-0.6-0.8-0.2-0.2-0.4-0.4-0.6-0.7-0.2-0.2-0.4-0.4-0.5-0.6-0.4-0.4-0.8-0.8-1.2-1.3-0.4-0.4-0.8-0.8-1.3-1.2-0.2-0.2-0.4-0.4-0.6-0.5-0.2-0.2-0.5-0.4-0.7-0.6-0.3-0.2-0.5-0.4-0.8-0.6-0.2-0.1-0.4-0.3-0.5-0.4l-0.9-0.6c-0.2-0.1-0.3-0.2-0.5-0.3l-0.9-0.6c-0.2-0.1-0.3-0.2-0.5-0.3-0.3-0.2-0.6-0.4-1-0.5-0.2-0.1-0.4-0.2-0.5-0.3-0.3-0.2-0.6-0.3-0.9-0.5l-0.6-0.3c-0.3-0.1-0.6-0.3-0.8-0.4-0.2-0.1-0.5-0.2-0.7-0.3-0.3-0.1-0.5-0.2-0.8-0.3l-0.9-0.3c-0.2-0.1-0.5-0.2-0.7-0.2-0.3-0.1-0.6-0.2-1-0.3-0.2-0.1-0.4-0.1-0.6-0.2-0.3-0.1-0.7-0.2-1.1-0.3-0.2 0-0.4-0.1-0.6-0.1-0.4-0.1-0.7-0.2-1.1-0.2-0.2 0-0.4-0.1-0.6-0.1-0.4-0.1-0.7-0.1-1.1-0.2-0.2 0-0.5-0.1-0.7-0.1-0.3 0-0.7-0.1-1-0.1-0.3 0-0.6 0-0.9-0.1-0.3 0-0.5 0-0.8-0.1H251c-19.3 0-35 15.7-35 35s15.7 35 35 35h185.5L72.7 901.8c-1.7-6.2-2.7-12.7-2.7-19.4V141.6c0-39.5 32.1-71.6 71.6-71.6h232.9c19.3 0 35-15.7 35-35s-15.7-35-35-35H141.6C63.5 0 0 63.5 0 141.6v740.8C0 960.5 63.5 1024 141.6 1024h740.8c78.1 0 141.6-63.5 141.6-141.6V649.5c0-19.3-15.7-35-35-35z\"  ></path><path d=\"M899.7 0H748.3C679.7 0 624 55.7 624 124.3v151.4c0 68.7 55.7 124.3 124.3 124.3h151.4c68.7 0 124.3-55.7 124.3-124.3V124.3C1024 55.7 968.3 0 899.7 0zM954 275.7c0 30-24.4 54.3-54.3 54.3H748.3c-30 0-54.3-24.4-54.3-54.3V124.3c0-30 24.4-54.3 54.3-54.3h151.4c30 0 54.3 24.4 54.3 54.3v151.4z\"  ></path></symbol><symbol id=\"icon-popup\" viewBox=\"0 0 1024 1024\"><path d=\"M819.2 102.4 408.5248 102.4C352.256 102.4 307.2 147.456 307.2 203.776L307.2 614.4c0 56.32 46.08 102.4 102.4 102.4l409.6 0c56.32 0 102.4-46.08 102.4-102.4L921.6 204.8C921.6 148.48 875.52 102.4 819.2 102.4zM819.2 614.4 409.6 614.4 409.6 204.8l409.6 0L819.2 614.4zM204.8 512 102.4 512l0 307.2c0 56.32 46.08 102.4 102.4 102.4l307.2 0 0-102.4L204.8 819.2 204.8 512z\"  ></path></symbol><symbol id=\"icon-depart2\" viewBox=\"0 0 1024 1024\"><path d=\"M411.20278261 292.83431884H612.91594203c12.10991304-1.42469565 21.37043478-11.63501449 21.37043478-24.10110145V73.90608696c0-13.41588406-10.92266666-24.33855073-24.33855072-24.33855073h-195.89565218c-13.41588406 0-24.33855073 10.92266666-24.33855072 24.33855073v194.70840579c0 12.46608696 9.37924638 22.67640579 21.48915942 24.21982609zM438.39072464 98.24463769h147.21855072v146.03130434H438.39072464v-146.03130434zM171.26028986 536.33855073h316.40115941V681.77623188h48.67710146V536.33855073H852.73971014V681.77623188h48.67710145V513.89959421c0-14.4844058-11.75373913-26.23814493-26.23814493-26.23814494H536.33855073V342.10504348h-48.67710146v145.67513043H150.83965217c-15.55292754 0-28.25646377 12.70353623-28.25646376 28.25646378V681.77623188h48.67710145V536.33855073zM609.3542029 731.04695652H414.6457971c-13.41588406 0-24.33855073 10.92266666-24.33855072 24.33855073v194.70840579c0 13.41588406 10.92266666 24.33855073 24.33855072 24.33855073h194.7084058c13.41588406 0 24.33855073-10.92266666 24.33855072-24.33855073V755.38550725c0-13.41588406-10.92266666-24.33855073-24.33855072-24.33855073z m-24.33855073 194.70840579h-146.03130434v-146.03130434h146.03130434v146.03130434zM244.27594203 731.04695652h-194.7084058c-13.41588406 0-24.33855073 10.92266666-24.33855072 24.33855073v194.70840579c0 13.41588406 10.92266666 24.33855073 24.33855072 24.33855073h194.7084058c13.41588406 0 24.33855073-10.92266666 24.33855072-24.33855073V755.38550725c0-13.41588406-10.92266666-24.33855073-24.33855072-24.33855073z m-24.33855072 194.70840579H73.90608696v-146.03130434h146.03130435v146.03130434zM974.43246377 731.04695652h-194.7084058c-13.41588406 0-24.33855073 10.92266666-24.33855072 24.33855073v194.70840579c0 13.41588406 10.92266666 24.33855073 24.33855072 24.33855073h194.7084058c13.41588406 0 24.33855073-10.92266666 24.33855072-24.33855073V755.38550725c0-14.60313044-9.73542029-24.33855073-24.33855072-24.33855073z m-24.33855073 194.70840579H804.06260869v-146.03130434h146.03130435v146.03130434z\"  ></path></symbol><symbol id=\"icon-card\" viewBox=\"0 0 1024 1024\"><path d=\"M96.8 466.9h414.8V98.2H96.8v368.7z m46.1-322.6h322.6v276.5H142.9V144.3z m0 0M557.7 927.8h368.7V651.3H557.7v276.5z m46.1-230.5h276.5v184.3H603.8V697.3z m0 0M557.7 98.2v506.9h368.7V98.2H557.7z m322.6 460.9H603.8V144.3h276.5v414.8z m0 0M96.8 927.8h414.8V513H96.8v414.8z m46.1-368.7h322.6v322.6H142.9V559.1z m0 0\"  ></path></symbol><symbol id=\"icon-tab\" viewBox=\"0 0 1024 1024\"><path d=\"M960 960H64V64h480v224h416v672zM128 896h768V352H480V128H128v768z\"  ></path><path d=\"M608 128h288v96h-288z\"  ></path></symbol><symbol id=\"icon-tab1\" viewBox=\"0 0 1024 1024\"><path d=\"M343.25 315.125V118.25H62v787.5h900V315.125H343.25z m562.5 534.375H118.25V174.5h168.75v196.875h618.75v478.125z\"  ></path><path d=\"M652.625 118.25h-253.125v140.625h253.125V118.25z m-56.25 84.375h-140.625V174.5h140.625v28.125zM708.875 118.25v140.625h253.125V118.25h-253.125z m196.875 84.375h-140.625V174.5h140.625v28.125z\"  ></path></symbol><symbol id=\"icon-tab2\" viewBox=\"0 0 1024 1024\"><path d=\"M615.3846875 68.9234375H408.6153125c-12.9234375 0-22.153125 11.0765625-22.153125 24v46.153125c0 12.9234375 11.0765625 24 22.153125 24h206.769375c12.9234375 0 22.153125-11.0765625 22.153125-24v-46.153125c1.846875-12.9234375-9.2296875-24-22.153125-24z m315.691875 0H724.308125c-12.9234375 0-24 11.0765625-24 24v46.153125c0 12.9234375 11.0765625 24 24 24h206.7684375c12.9234375-1.8459375 24-11.0765625 24-24v-46.153125c0-12.9234375-11.0765625-24-24-24z m0 155.0765625H345.846875c-12.9225 0-24-11.0765625-24-24V92.9234375c0-12.9234375-11.0765625-24-24-24H92.9234375c-12.9234375 0-24 11.0765625-24 24v840c0 11.0765625 11.0765625 22.153125 24 22.153125h838.153125c12.9234375 0 24-11.0765625 24-24V248c0-12.9234375-11.0765625-24-24-24z\"  ></path></symbol><symbol id=\"icon-text\" viewBox=\"0 0 1024 1024\"><path d=\"M962.9656745 932.80074644c-4.52473921-61.83810252-6.03298562-125.18445145-6.03298561-187.02255398 0-31.67317446 0-61.83810252 1.50824638-93.51127698 0-28.65668166 3.01649281-57.31336332-7.54123201-84.46179856-24.13194244-61.83810252-105.57724821-73.90407375-164.39885791-73.90407375-30.16492806 0-60.32985613 4.52473921-90.49478419 12.06597121-21.11544964 6.03298562-42.2308993 13.57421762-60.3298561 22.62369605l19.60720322 48.26388489c4.52473921 9.04947843 6.03298562 19.60720323 7.54123203 28.65668166 39.21440646-18.09895683 78.42881296-28.65668166 117.64321942-28.65668166 61.83810252 0 92.00303057 24.13194244 92.00303057 72.39582735v22.62369604c-9.04947843 0-24.13194244-1.50824641-43.73914568-1.50824639-78.42881296 0-137.25042267 12.06597121-179.48132195 34.68966726-40.72265287 24.13194244-61.83810252 64.85459532-61.83810253 123.67620504 0 43.73914569 13.57421762 78.42881296 40.72265288 102.5607554 27.14843525 24.13194244 61.83810252 36.19791367 102.56075542 36.19791368 36.19791367 0 66.36284173-4.52473921 88.98653777-15.08246403s42.2308993-25.64018885 57.3133633-46.75563849h3.01649283c1.50824641 10.55772482 3.01649281 27.14843525 7.54123202 51.28037771 0 1.50824641 67.87108813 0 75.41232014 0 1.50824641-10.55772482 0-16.59071043 0-24.13194245zM873.97913671 780.46785973c0 10.55772482-1.50824641 21.11544964-6.03298561 31.67317447-3.01649281 7.54123201-6.03298562 15.08246403-12.06597122 22.62369604-18.09895683 25.64018885-49.77213131 39.21440646-79.93705936 45.2473921-19.60720323 3.01649281-37.70616007 1.50824641-57.3133633-1.50824641-15.08246403-3.01649281-30.16492806-10.55772482-37.70616008-24.13194245-13.57421762-21.11544964-10.55772482-54.29687052 4.5247392-73.90407375 9.04947843-12.06597121 22.62369604-19.60720323 36.19791368-24.13194245 37.70616007-12.06597121 81.44530576-12.06597121 119.15146583-12.06597121l33.18142086 1.50824639v34.68966727zM585.90407375 607.01952339L371.73308452 76.11678954c-3.01649281-10.55772482-12.06597121-16.59071043-22.62369604-16.59071043h-67.87108814c-10.55772482 0-21.11544964 7.54123201-24.13194244 16.59071043l-196.0720324 530.90273385c-4.52473921 10.55772482 3.01649281 22.62369604 13.57421763 22.62369604h75.41232016c10.55772482 0 21.11544964-9.04947843 24.13194245-19.60720324l49.77213129-138.75866906h193.05553958l55.80511693 138.75866906c3.01649281 10.55772482 13.57421762 19.60720323 24.13194243 19.60720324h73.90407375c12.06597121 0 21.11544964-12.06597121 15.08246403-22.62369604zM263.13934351 367.20834531l55.80511691-144.79165468 61.83810251 144.79165468h-117.64321942z\"  ></path></symbol><symbol id=\"icon-divider\" viewBox=\"0 0 1024 1024\"><path d=\"M129.70666667 129.70666667h764.58666666a54.61333333 54.61333333 0 0 1 0 109.22666666H129.70666667a54.61333333 54.61333333 0 1 1 0-109.22666666z m0 655.36h764.58666666a54.61333333 54.61333333 0 0 1 0 109.22666666H129.70666667a54.61333333 54.61333333 0 0 1 0-109.22666666z m0-327.68h140.41088a54.61333333 54.61333333 0 1 1 0 109.22666666H129.70666667a54.61333333 54.61333333 0 0 1 0-109.22666666z m312.06058666 0h140.46549334a54.61333333 54.61333333 0 0 1 0 109.22666666H441.76725333a54.61333333 54.61333333 0 0 1 0-109.22666666z m312.1152 0H894.29333333a54.61333333 54.61333333 0 0 1 0 109.22666666h-140.41088a54.61333333 54.61333333 0 0 1 0-109.22666666z\"  ></path></symbol><symbol id=\"icon-markdown\" viewBox=\"0 0 1024 1024\"><path d=\"M92 192C42.24 192 0 232.128 0 282.016v459.968C0 791.904 42.24 832 92 832h840C981.76 832 1024 791.872 1024 741.984V282.016C1024 232.16 981.76 192 932 192z m0 64h840c16.512 0 28 12.256 28 26.016v459.968c0 13.76-11.52 26.016-28 26.016H92C75.488 768 64 755.744 64 741.984V282.016c0-13.76 11.52-25.984 28-25.984zM160 352v320h96v-212.992l96 127.008 96-127.04V672h96V352h-96l-96 128-96-128z m544 0v160h-96l144 160 144-160h-96v-160z\"  ></path></symbol><symbol id=\"icon-tree\" viewBox=\"0 0 1024 1024\"><path d=\"M251.255027 267.144745a89.048248 89.048248 0 1 0 0-178.096497 89.048248 89.048248 0 0 0 0 178.096497z m0 89.048248A178.096497 178.096497 0 1 1 251.255027 0.03657a178.096497 178.096497 0 0 1 0 356.192993z\"  ></path><path d=\"M206.712617 267.144745h89.048249v44.542409a89.048248 89.048248 0 0 0 89.048248 89.048248h267.108175v89.011678h-267.108175a177.255384 177.255384 0 0 1-89.084818-23.807149l0.03657 246.409485a89.048248 89.048248 0 0 0 89.048248 89.048248h267.108175v89.048249h-267.108175a178.096497 178.096497 0 0 1-178.096497-178.096497V267.144745z\"  ></path><path d=\"M785.471376 934.951752a89.048248 89.048248 0 1 0 0-178.096497 89.048248 89.048248 0 0 0 0 178.096497z m0 89.048248a178.096497 178.096497 0 1 1 0-356.192993 178.096497 178.096497 0 0 1 0 356.192993zM785.471376 534.28949a89.048248 89.048248 0 1 0 0-178.096497 89.048248 89.048248 0 0 0 0 178.096497z m0 89.011678a178.096497 178.096497 0 1 1 0-356.156423 178.096497 178.096497 0 0 1 0 356.192993z\"  ></path></symbol><symbol id=\"icon-map\" viewBox=\"0 0 1024 1024\"><path d=\"M649.6 960c-12.8 0-25.6-9.6-28.8-22.4-6.4-16 3.2-35.2 19.2-41.6l256-86.4V428.8l-115.2 38.4c-16 6.4-35.2-3.2-41.6-19.2-6.4-16 3.2-35.2 19.2-41.6l160-51.2c9.6-6.4 19.2-3.2 28.8 3.2 6.4 6.4 12.8 16 12.8 25.6v448c0 12.8-9.6 25.6-22.4 28.8l-278.4 96c-3.2 3.2-6.4 3.2-9.6 3.2z\"  ></path><path d=\"M649.6 960c-3.2 0-6.4 0-9.6-3.2l-278.4-96c-16-6.4-25.6-22.4-19.2-41.6 6.4-16 22.4-25.6 41.6-19.2l278.4 96c16 6.4 25.6 22.4 19.2 41.6-6.4 12.8-19.2 22.4-32 22.4z\"  ></path><path d=\"M96 960c-6.4 0-12.8-3.2-19.2-6.4-9.6-6.4-12.8-16-12.8-25.6V480c0-12.8 9.6-25.6 22.4-28.8l73.6-28.8c16-6.4 35.2 3.2 41.6 19.2s-3.2 35.2-19.2 41.6l-54.4 19.2v380.8l233.6-80c16-6.4 35.2 3.2 41.6 19.2 6.4 16-3.2 35.2-19.2 41.6l-278.4 96H96z\"  ></path><path d=\"M480 416c-54.4 0-96-41.6-96-96s41.6-96 96-96 96 41.6 96 96-41.6 96-96 96z m0-128c-19.2 0-32 12.8-32 32s12.8 32 32 32 32-12.8 32-32-12.8-32-32-32z\"  ></path><path d=\"M480 688l-22.4-25.6C435.2 640 256 435.2 256 320c0-124.8 99.2-224 224-224s224 99.2 224 224c0 115.2-179.2 320-201.6 342.4l-22.4 25.6zM480 160c-89.6 0-160 70.4-160 160 0 60.8 89.6 188.8 160 272 70.4-83.2 160-211.2 160-272 0-89.6-70.4-160-160-160z\"  ></path></symbol><symbol id=\"icon-jm-print\" viewBox=\"0 0 1024 1024\"><path d=\"M362.666667 853.333333l298.666667 0c12.8 0 21.333333-8.533333 21.333333-21.333333 0-12.8-8.533333-21.333333-21.333333-21.333333L362.666667 810.666667c-12.8 0-21.333333 8.533333-21.333333 21.333333C341.333333 844.8 349.866667 853.333333 362.666667 853.333333zM362.666667 768l213.333333 0c12.8 0 21.333333-8.533333 21.333333-21.333333 0-12.8-8.533333-21.333333-21.333333-21.333333L362.666667 725.333333c-12.8 0-21.333333 8.533333-21.333333 21.333333C341.333333 759.466667 349.866667 768 362.666667 768zM853.333333 298.666667l-42.666667 0L810.666667 85.333333c0-23.466667-19.2-42.666667-42.666667-42.666667L256 42.666667c-23.466667 0-42.666667 19.2-42.666667 42.666667l0 213.333333L170.666667 298.666667c-70.4 0-128 57.6-128 128l0 341.333333c0 70.4 57.6 128 128 128l42.666667 0 0 42.666667c0 23.466667 19.2 42.666667 42.666667 42.666667l512 0c23.466667 0 42.666667-19.2 42.666667-42.666667l0-42.666667 42.666667 0c70.4 0 128-57.6 128-128L981.333333 426.666667C981.333333 356.266667 923.733333 298.666667 853.333333 298.666667zM256 85.333333l512 0 0 213.333333L256 298.666667 256 85.333333zM768 896l0 42.666667L256 938.666667l0-42.666667L256 682.666667l512 0L768 896zM938.666667 768c0 46.933333-38.4 85.333333-85.333333 85.333333l-42.666667 0 0-170.666667c0-23.466667-19.2-42.666667-42.666667-42.666667L256 640c-23.466667 0-42.666667 19.2-42.666667 42.666667l0 170.666667L170.666667 853.333333c-46.933333 0-85.333333-38.4-85.333333-85.333333L85.333333 426.666667c0-46.933333 38.4-85.333333 85.333333-85.333333l682.666667 0c46.933333 0 85.333333 38.4 85.333333 85.333333L938.666667 768zM810.666667 426.666667c-23.466667 0-42.666667 19.2-42.666667 42.666667s19.2 42.666667 42.666667 42.666667 42.666667-19.2 42.666667-42.666667S834.133333 426.666667 810.666667 426.666667zM682.666667 426.666667c-23.466667 0-42.666667 19.2-42.666667 42.666667s19.2 42.666667 42.666667 42.666667 42.666667-19.2 42.666667-42.666667S706.133333 426.666667 682.666667 426.666667z\"  ></path></symbol><symbol id=\"icon-phone\" viewBox=\"0 0 1024 1024\"><path d=\"M402.176 208.981333c-28.245333-40.256-50.901333-53.653333-81.258667-47.957333-13.098667 2.453333-21.184 6.869333-36.053333 19.712l-11.328 9.941333-22.037333 18.282667-5.76 5.034667c-3.242667 2.986667-5.589333 5.44-8.597334 8.853333-56 63.402667-71.509333 162.56-38.912 255.786667 23.445333 66.986667 65.28 133.546667 124.928 200.064 63.253333 70.549333 116.416 114.944 177.557334 147.328 48 25.386667 84.757333 36.522667 127.466666 37.824 51.626667 1.6 97.088-10.069333 134.442667-34.261334a141.866667 141.866667 0 0 0 17.109333-13.290666l7.253334-6.613334 14.293333-13.312 4.842667-4.309333 9.557333-8.256c19.285333-17.194667 25.536-27.946667 26.816-44.949333 1.92-25.941333-9.813333-46.144-43.52-74.986667l-22.805333-19.093333-10.602667-9.258667-10.026667-8.597333c-32.576-26.901333-56.704-35.605333-87.68-30.933334-21.248 3.178667-33.493333 10.624-55.189333 33.344l-9.578667 10.197334c-15.786667 16.64-24.789333 22.976-38.101333 25.642666-19.477333 3.904-38.826667-6.165333-70.229333-31.68-40.469333-32.853333-74.048-70.592-102.912-115.456-20.010667-31.296-27.904-55.04-21.824-76.650666 2.474667-8.746667 8.448-14.912 21.056-24.661334l13.12-9.898666 2.112-1.642667 19.904-16.234667c17.6-14.72 24.746667-24.746667 28.501333-40.106666 7.786667-31.594667 0.426667-57.813333-28.373333-102.933334l-13.674667-21.205333-4.864-7.466667-5.632-8.256z\"  ></path></symbol><symbol id=\"icon-mobile-phone\" viewBox=\"0 0 1024 1024\"><path d=\"M746.666667 949.333333H277.333333c-40.533333 0-74.666667-34.133333-74.666666-74.666666V149.333333c0-40.533333 34.133333-74.666667 74.666666-74.666666h469.333334c40.533333 0 74.666667 34.133333 74.666666 74.666666v725.333334c0 40.533333-34.133333 74.666667-74.666666 74.666666z m-469.333334-810.666666c-6.4 0-10.666667 4.266667-10.666666 10.666666v725.333334c0 6.4 4.266667 10.666667 10.666666 10.666666h469.333334c6.4 0 10.666667-4.266667 10.666666-10.666666V149.333333c0-6.4-4.266667-10.666667-10.666666-10.666666H277.333333z\"  ></path><path d=\"M512 768m-42.666667 0a42.666667 42.666667 0 1 0 85.333334 0 42.666667 42.666667 0 1 0-85.333334 0Z\"  ></path><path d=\"M597.333333 245.333333h-170.666666c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h170.666666c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32z\"  ></path></symbol><symbol id=\"icon-email-filled\" viewBox=\"0 0 1024 1024\"><path d=\"M512.01284373 570.17116374l443.25167787-369.30789546c-2.401856-0.4367008-4.55967361-1.43854507-7.05143893-1.43854507L75.81260588 199.42472214c-2.44038933 0-4.61105067 0.98899947-7.01290669 1.43854507L512.01284373 570.17116374zM987.87582293 239.08746348c0-4.16150507-1.1431296-8.01475093-2.401856-11.803776L671.2674816 489.17594241l314.6817184 314.7459392c0.80918187-3.1725056 1.92662293-6.22941333 1.92662293-9.65880213L987.87582293 239.08746348zM38.56456533 227.24515521c-1.22019413 3.81471361-2.44038933 7.61658239-2.44038933 11.84230827l0 555.16277226c0 3.46792107 1.1945056 6.51198508 1.97799893 9.68449067l314.78447147-314.77162773L38.56456533 227.24515521zM640.62133548 514.65873921l-115.94415787 96.5751776c-3.63489492 3.09544107-8.13034773 4.58536213-12.66433388 4.58536213-4.4954528 0-9.01659413-1.48992214-12.6900224-4.58536213l-115.8414048-96.52380053L66.21802454 831.96066454c3.12112852 0.8220256 6.21656959 1.9651552 9.59458134 1.9651552l872.41332051 0c3.44223253 0 6.5376736-1.13028587 9.72302294-1.9651552L640.62133548 514.65873921z\"  ></path></symbol><symbol id=\"icon-email\" viewBox=\"0 0 1024 1024\"><path d=\"M981.48588027 334.89335562V815.7849815a82.85044939 82.85044939 0 0 1-82.85044939 82.85044938H125.36456912a82.85044939 82.85044939 0 0 1-82.85044939-82.85044938V334.89335562l82.85044939 70.22956468V815.7849815h773.27086176V405.1229203l82.85044939-70.22956468zM898.63543088 125.36456912a83.87227117 83.87227117 0 0 1 29.54999276 5.41289689 82.35334669 82.35334669 0 0 1 34.68672191 25.13130254 83.26470163 83.26470163 0 0 1 12.0961656 20.02219237c3.59018571 8.5059799 5.79953147 17.72999617 6.35186822 27.42349875L981.48588027 208.2150185v27.61681732L565.76994165 590.43175918a82.85044939 82.85044939 0 0 1-103.42497721 3.2864003l-4.11490609-3.31401798L42.51411973 235.83183582v-27.61681732a82.57428165 82.57428165 0 0 1 45.48489672-73.95783361A82.68474848 82.68474848 0 0 1 125.36456912 125.36456912h773.27086176z m-12.4275674 82.85044938h-748.41572696L512 527.3825672 886.20786348 208.2150185z\"  ></path></symbol><symbol id=\"icon-qrcode\" viewBox=\"0 0 1024 1024\"><path d=\"M423.836543 114.819049l0-0.274246L204.08256 114.544803c-45.911656 0-83.09451 36.932144-83.356476 82.59309l-0.023536 0 0 207.579709c0 2.468215 0.500397 4.782933 1.239224 7.000438 6.678096 39.245839 40.831964 69.164243 82.140789 69.164243L423.836543 480.882282l0-0.237407c38.877449-2.432399 70.477144-31.363312 76.798107-68.926836 0.763386-2.217505 1.289366-4.532223 1.289366-7.000438L501.924016 197.137893l-0.025583 0C501.683539 153.253406 467.244168 117.538997 423.836543 114.819049zM458.038506 393.46021c0 24.14798-19.654642 43.705408-43.88551 43.705408L208.445938 437.165618c-24.230867 0-43.858904-19.557428-43.858904-43.705408L164.587034 201.980177c0-24.149003 19.628036-43.717687 43.858904-43.717687l205.708082 0c24.230867 0 43.88551 19.569708 43.88551 43.717687L458.039529 393.46021zM902.246517 195.111746c-0.215918-42.799782-33.818223-77.644381-76.153424-80.304977l0-0.261966L634.384863 114.544803c-44.790112 0-81.040734 36.037774-81.304747 80.56592l-0.023536 0 0 202.511273c0 2.407839 0.476861 4.673439 1.240247 6.831592 6.487761 38.292118 39.830147 67.472717 80.08906 67.472717l191.70823 0 0-0.226151c37.921681-2.385327 68.734454-30.613228 74.961272-67.246567 0.738827-2.158153 1.216711-4.423753 1.216711-6.831592L902.2721 195.111746 902.246517 195.111746zM859.461061 386.638851c0 23.551392-19.152199 42.643216-42.813085 42.643216L638.678656 429.282067c-23.658839 0-42.834574-19.091824-42.834574-42.643216L595.844082 199.832258c0-23.552415 19.175735-42.643216 42.834574-42.643216l177.969321 0c23.660886 0 42.813085 19.091824 42.813085 42.643216L859.461061 386.638851zM415.680792 539.887141l0-0.260943L201.839473 539.626197c-44.670385 0-80.874959 35.94363-81.114412 80.375585l-0.023536 0 0 201.974038c0 2.420119 0.477884 4.687766 1.215688 6.821359 6.464225 38.181601 39.73498 67.316152 79.922261 67.316152L415.680792 896.113331l0-0.236384c37.824467-2.350534 68.567655-30.529317 74.744331-67.079768 0.762363-2.133593 1.24127-4.40124 1.24127-6.821359L491.666394 620.001783l-0.049119 0C491.402381 577.308425 457.919802 542.53648 415.680792 539.887141zM448.975083 811.04077c0 23.493064-19.127639 42.524512-42.691311 42.524512L212.953601 853.565283c0 0-0.022513 0-0.047072 0l-6.822382 0c-23.563672 0-42.690288-19.031449-42.690288-42.524512L163.393859 624.687502c0-23.469528 19.126616-42.525536 42.690288-42.525536l200.200648 0c23.563672 0 42.691311 19.056008 42.691311 42.525536L448.976106 811.04077zM721.154066 753.120616c-14.741749 0-26.66736 11.508102-26.66736 25.699312l0 51.395554c0 14.228049 11.924587 25.721825 26.66736 25.721825 14.736633 0 26.663266-11.492752 26.663266-25.721825l0-51.395554C747.817332 764.628718 735.891721 753.120616 721.154066 753.120616zM834.775846 727.398792c-14.739702 0-26.665313 11.494799-26.665313 25.697265l0 77.118402c0 14.214746 11.924587 25.701358 26.665313 25.701358 14.763239 0 26.688849-11.487635 26.688849-25.701358l0-77.118402C861.464695 738.894613 849.538061 727.398792 834.775846 727.398792zM834.775846 573.172221c-14.739702 0-26.665313 11.506055-26.665313 25.722848l0 51.395554c0 14.189164 11.924587 25.697265 26.665313 25.697265 14.763239 0 26.688849-11.508102 26.688849-25.697265l0-51.395554C861.464695 584.679299 849.538061 573.172221 834.775846 573.172221zM721.154066 573.195757c-14.741749 0-26.66736 11.507078-26.66736 25.709545L694.486706 701.735295c0 14.192234 11.924587 25.686009 26.66736 25.686009 14.736633 0 26.663266-11.492752 26.663266-25.686009L747.817332 598.905302C747.817332 584.702835 735.891721 573.195757 721.154066 573.195757zM606.050538 701.735295c-14.68956 0-26.640754 11.435447-26.640754 25.663496l0 102.81669c0 14.214746 11.951193 25.701358 26.640754 25.701358 14.787798 0 26.712385-11.487635 26.712385-25.701358L632.762923 727.398792C632.763946 713.170742 620.838336 701.735295 606.050538 701.735295zM606.050538 573.172221c-14.68956 0-26.640754 11.506055-26.640754 25.722848l0 25.709545c0 14.201443 11.951193 25.686009 26.640754 25.686009 14.787798 0 26.712385-11.484565 26.712385-25.686009l0-25.709545C632.763946 584.679299 620.838336 573.172221 606.050538 573.172221z\"  ></path></symbol><symbol id=\"icon-save\" viewBox=\"0 0 1024 1024\"><path d=\"M753.38336182 141.58221435H164.75650023v740.8355713h694.48699952v-634.97543336L753.38336182 141.58221435z m-125.18749238 45.60699463v185.39428711H395.75778198v-185.39428711h232.43808747zM349.40921021 836.81079102V579.90065766l21.13494872-21.1812973h282.91168214l21.13494872 21.18129729v256.91013337H349.40921021z m463.48571777 0h-91.95556641V564.97641755L668.0092926 512H355.9907074L303.06063843 564.97641755v271.83437347H211.10507203V187.18920898h138.30413818v232.0672989h325.18157958V187.18920898h57.70397188l80.60016631 81.34174348v568.27983856z m-278.09143066-602.53143311h47.7853775v92.69714355H534.80349732v-92.69714355z\"  ></path></symbol><symbol id=\"icon-link\" viewBox=\"0 0 1024 1024\"><path d=\"M928 896 416 896C380.656 896 352 867.344 352 832L352 448C352 412.656 380.656 384 416 384L512 384C529.68 384 544 398.336 544 416 544 433.68 529.68 448 512 448L416 448 416 832 928 832 928 448 768 448C750.32 448 736 433.68 736 416 736 398.336 750.32 384 768 384L928 384C963.344 384 992 412.656 992 448L992 832C992 867.344 963.344 896 928 896ZM608 640 512 640C494.336 640 480 625.68 480 608 480 590.32 494.336 576 512 576L608 576 608 192 96 192 96 576 256 576C273.68 576 288 590.32 288 608 288 625.68 273.68 640 256 640L96 640C60.656 640 32 611.344 32 576L32 192C32 156.656 60.656 128 96 128L608 128C643.344 128 672 156.656 672 192L672 576C672 611.344 643.344 640 608 640Z\"  ></path></symbol><symbol id=\"icon-field\" viewBox=\"0 0 1024 1024\"><path d=\"M905.53963457 264.16739029H724.64948675c-27.47873238 0-49.71026963-22.23153725-49.71026963-49.71026963s22.23153725-49.71026963 49.71026963-49.71026963h180.89014782c27.47873238 0 49.71026963 22.23153725 49.71026962 49.71026963s-22.23153725 49.71026963-49.71026962 49.71026963zM905.53963457 474.0551954H724.64948675c-27.47873238 0-49.71026963-22.23153725-49.71026963-49.71026963s22.23153725-49.71026963 49.71026963-49.71026962h180.89014782c27.47873238 0 49.71026963 22.23153725 49.71026962 49.71026962s-22.23153725 49.71026963-49.71026962 49.71026963zM905.53963457 682.56215968H724.64948675c-27.47873238 0-49.71026963-22.23153725-49.71026963-49.71026963s22.23153725-49.71026963 49.71026963-49.71026963h180.89014782c27.47873238 0 49.71026963 22.23153725 49.71026962 49.71026963s-22.23153725 49.71026963-49.71026962 49.71026963zM905.53963457 892.44996478H121.22204708c-27.47873238 0-49.71026963-22.23153725-49.71026963-49.71026963s22.23153725-49.71026963 49.71026963-49.71026964h784.31758749c27.47873238 0 49.71026963 22.23153725 49.71026962 49.71026964s-22.23153725 49.71026963-49.71026962 49.71026963zM432.04931635 210.45268228v388.29243944c-4.41869063 46.39625165 19.88410785 67.52311625 73.04647953 63.10442561h19.88410785v33.14017975H219.67599776v-33.14017975H249.64024362c44.18690634 2.20934532 66.41844358-18.7794352 66.41844358-63.10442561V210.45268228h-102.8726413c-55.371717-11.04672658-85.19787878 22.09345317-89.61656943 99.55862334h-36.45419772l16.57008988-159.34903097h26.5121438c4.41869063 6.62803595 9.94205392 11.04672658 16.57008988 13.25607188 4.41869063 4.41869063 12.15139925 5.5233633 23.19812583 3.31401798h404.86252931c15.46541722 2.20934532 28.72148912-3.31401797 39.7682157-16.57008986h29.82616178l13.2560719 159.34903097h-33.14017975c-6.62803595-77.46517017-37.69695447-110.60534992-92.93058738-99.55862334h-99.55862335z\"  ></path></symbol><symbol id=\"icon-field-1\" viewBox=\"0 0 1024 1024\"><path d=\"M373.64622187 123.6385184H87.22962987a24.27259307 24.27259307 0 0 0-24.27259307 24.27259307v285.20296213a24.27259307 24.27259307 0 0 0 24.27259307 24.27259307h285.2029632a24.27259307 24.27259307 0 0 0 24.272592-24.27259307V147.91111147a24.27259307 24.27259307 0 0 0-23.0589632-24.27259307z m-24.272592 285.2029632h-236.65777814V172.7905184h236.65777814zM859.70488853 185.53362987H468.91614827a24.27259307 24.27259307 0 1 0 0 48.54518506h390.78874026a24.27259307 24.27259307 0 0 0 0-48.54518506zM468.91614827 365.75762987h245.76a24.27259307 24.27259307 0 1 0 0-48.54518507H468.91614827a24.27259307 24.27259307 0 0 0 0 48.54518507zM373.64622187 566.61333333H87.22962987a24.27259307 24.27259307 0 0 0-24.27259307 24.27259307V876.08888853a24.27259307 24.27259307 0 0 0 24.27259307 24.27259307h285.2029632a24.27259307 24.27259307 0 0 0 24.272592-24.27259307v-285.20296213a24.27259307 24.27259307 0 0 0-23.0589632-24.27259307z m-24.272592 284.59614827h-236.65777814V615.1585184h236.65777814zM859.70488853 628.5084448H468.91614827a24.27259307 24.27259307 0 0 0 0 48.54518507h390.78874026a24.27259307 24.27259307 0 0 0 0-48.54518507zM714.67614827 760.18725973H468.91614827a24.27259307 24.27259307 0 0 0 0 48.54518507h245.76a24.27259307 24.27259307 0 0 0 0-48.54518507z\"  ></path></symbol><symbol id=\"icon-fullscreen\" viewBox=\"0 0 1024 1024\"><path d=\"M290 236.4l43.9-43.9c4.7-4.7 1.9-12.8-4.7-13.6L169 160c-5.1-0.6-9.5 3.7-8.9 8.9L179 329.1c0.8 6.6 8.9 9.4 13.6 4.7l43.7-43.7L370 423.7c3.1 3.1 8.2 3.1 11.3 0l42.4-42.3c3.1-3.1 3.1-8.2 0-11.3L290 236.4zM642.7 423.7c3.1 3.1 8.2 3.1 11.3 0l133.7-133.6 43.7 43.7c4.7 4.7 12.8 1.9 13.6-4.7L863.9 169c0.6-5.1-3.7-9.5-8.9-8.9L694.8 179c-6.6 0.8-9.4 8.9-4.7 13.6l43.9 43.9L600.3 370c-3.1 3.1-3.1 8.2 0 11.3l42.4 42.4zM845 694.9c-0.8-6.6-8.9-9.4-13.6-4.7l-43.7 43.7L654 600.3c-3.1-3.1-8.2-3.1-11.3 0l-42.4 42.3c-3.1 3.1-3.1 8.2 0 11.3L734 787.6l-43.9 43.9c-4.7 4.7-1.9 12.8 4.7 13.6L855 864c5.1 0.6 9.5-3.7 8.9-8.9L845 694.9zM381.3 600.3c-3.1-3.1-8.2-3.1-11.3 0L236.3 733.9l-43.7-43.7c-4.7-4.7-12.8-1.9-13.6 4.7L160.1 855c-0.6 5.1 3.7 9.5 8.9 8.9L329.2 845c6.6-0.8 9.4-8.9 4.7-13.6L290 787.6 423.7 654c3.1-3.1 3.1-8.2 0-11.3l-42.4-42.4z\"  ></path></symbol><symbol id=\"icon-fullscreen-exit\" viewBox=\"0 0 1024 1024\"><path d=\"M391 240.9c-0.8-6.6-8.9-9.4-13.6-4.7l-43.7 43.7L200 146.3c-3.1-3.1-8.2-3.1-11.3 0l-42.4 42.3c-3.1 3.1-3.1 8.2 0 11.3L280 333.6l-43.9 43.9c-4.7 4.7-1.9 12.8 4.7 13.6L401 410c5.1 0.6 9.5-3.7 8.9-8.9L391 240.9zM401.1 614.1L240.8 633c-6.6 0.8-9.4 8.9-4.7 13.6l43.9 43.9L146.3 824c-3.1 3.1-3.1 8.2 0 11.3l42.4 42.3c3.1 3.1 8.2 3.1 11.3 0L333.7 744l43.7 43.7c4.7 4.7 12.8 1.9 13.6-4.7l18.9-160.1c0.6-5.1-3.7-9.4-8.8-8.8zM622.9 409.9L783.2 391c6.6-0.8 9.4-8.9 4.7-13.6L744 333.6 877.7 200c3.1-3.1 3.1-8.2 0-11.3l-42.4-42.3c-3.1-3.1-8.2-3.1-11.3 0L690.3 279.9l-43.7-43.7c-4.7-4.7-12.8-1.9-13.6 4.7L614.1 401c-0.6 5.2 3.7 9.5 8.8 8.9zM744 690.4l43.9-43.9c4.7-4.7 1.9-12.8-4.7-13.6L623 614c-5.1-0.6-9.5 3.7-8.9 8.9L633 783.1c0.8 6.6 8.9 9.4 13.6 4.7l43.7-43.7L824 877.7c3.1 3.1 8.2 3.1 11.3 0l42.4-42.3c3.1-3.1 3.1-8.2 0-11.3L744 690.4z\"  ></path></symbol><symbol id=\"icon-money\" viewBox=\"0 0 1048 1024\"><path d=\"M524.2752 0C241.516134 0 12.288102 229.228032 12.288102 511.976038c0 117.534003 39.610982 225.814016 106.203955 312.231014l38.47895-40.06103C100.53417 708.109005 67.143168 613.944013 67.143168 511.976038c0-252.460954 204.668006-457.120973 457.132032-457.120973 252.45399 0 457.120973 204.660019 457.120973 457.120973 0 252.468019-204.668006 457.12896-457.120973 457.12896-91.12105 0-176.011981-26.66496-247.303987-72.611021l-34.630042 42.907955c80.855962 53.441024 177.760973 84.558029 281.934029 84.558029 282.755994 0 511.984026-229.224038 511.984026-511.984026C1036.258202 229.228032 807.03017 0 524.2752 0zM304.851149 566.841958 304.851149 621.697024 505.983181 621.697024 505.983181 767.966003 505.983181 767.97399 505.983181 767.97399 505.983181 804.54697 560.838144 804.54697 560.838144 767.97399 560.83712 767.97399 560.838144 767.966003 560.838144 621.697024 761.973146 621.697024 761.973146 566.841958 560.838144 566.841958 560.838144 457.136026 761.973146 457.136026 761.973146 402.270003 600.358195 402.270003 718.125158 284.499968 678.615142 244.985958 533.40713 390.177997 388.213146 244.985958 348.695142 284.499968 466.462106 402.270003 304.851149 402.270003 304.851149 457.136026 505.983181 457.136026 505.983181 566.841958Z\"  ></path></symbol><symbol id=\"icon-integer\" viewBox=\"0 0 1024 1024\"><path d=\"M514.077312 702.673667c40.199561 0 70.936609-16.709567 92.211145-50.126654 1.876744-2.951215 3.570315-6.145977 5.279237-9.317203 19.652596 39.590694 52.199872 59.443857 97.718579 59.443857 40.196491 0 70.932516-16.709567 92.207052-50.126654 21.272489-33.419134 31.909757-80.859609 31.909757-142.327566 0-124.82596-39.174208-187.237405-117.515461-187.237405-41.081651 0-72.479755 16.748453-94.189196 50.242288-2.00568 3.100618-3.826142 6.459109-5.646604 9.812483-19.24225-40.009226-51.016931-60.055794-95.372138-60.055794-41.080627 0-72.475662 16.748453-94.186126 50.242288-21.714558 33.503045-32.573883 82.008782-32.573883 145.528468C393.919674 641.367393 433.973926 702.673667 514.077312 702.673667zM712.807469 381.76075c32.127721 0 48.196699 43.767829 48.196699 131.304512 0 87.220481-16.506952 130.828674-49.517787 130.828674-33.600259 0-50.39783-42.343387-50.39783-127.037325C661.089573 426.790316 678.329213 381.76075 712.807469 381.76075zM517.598508 381.76075c32.131815 0 48.196699 43.767829 48.196699 131.304512 0 87.220481-16.504906 130.828674-49.51574 130.828674-33.600259 0-50.395784-42.343387-50.395784-127.037325C465.884706 426.790316 483.124346 381.76075 517.598508 381.76075z\"  ></path><path d=\"M285.863656 416.20933l0 285.908682 64.385403 0 0-381.212258-56.681954 0.181125c-29.344329 24.019043-64.11525 42.345434-104.314811 54.984289l0 65.651232c12.763698-1.575892 26.77583-5.64558 42.035372-12.20395C246.544139 422.962128 277.05913 424.424432 285.863656 416.20933z\"  ></path><path d=\"M897.529587 66.766636 124.898615 66.766636c-35.558867 0-64.385403 28.827559-64.385403 64.385403l0 760.717641c0 35.558867 28.827559 64.387449 64.385403 64.387449l772.630972 0c35.558867 0 64.385403-28.828582 64.385403-64.387449L961.91499 131.153062C961.916013 95.594195 933.088454 66.766636 897.529587 66.766636zM897.529587 892.719025 124.898615 892.719025 124.898615 130.299625l772.630972 0L897.529587 892.719025z\"  ></path></symbol><symbol id=\"icon-tiaoma\" viewBox=\"0 0 1024 1024\"><path d=\"M392.687614 869.933065l29.827329 0L422.514943 154.067958 392.687614 154.067958 392.687614 869.933065zM452.342272 869.933065l29.830399 0L482.172671 154.067958l-29.830399 0L452.342272 869.933065zM243.547899 869.933065l89.485057 0L333.032956 154.067958l-89.485057 0L243.547899 869.933065zM64.583924 869.933065l119.309316 0L183.89324 154.067958l-119.309316-0.002047L64.583924 869.933065zM512 869.933065l89.481987 0L601.481987 154.067958l-89.481987 0L512 869.933065zM840.102666 154.067958l0 715.865107L959.415053 869.933065 959.415053 154.067958 840.102666 154.067958zM750.621702 869.933065l59.654658 0L810.276361 154.067958l-59.654658 0L750.621702 869.933065zM631.309316 869.933065l59.654658 0L690.963974 154.067958l-59.654658 0L631.309316 869.933065z\"  ></path></symbol><symbol id=\"icon-zuhe\" viewBox=\"0 0 1042 1024\"><path d=\"M1036.74608 135.558l-5.363-2.926a35.596 35.596 0 0 0-7.315-7.314L814.39208 4.876a36.084 36.084 0 0 0-34.133 0L570.58308 125.318l-5.852 5.852-8.29 4.876a10.728 10.728 0 0 0-5.363 9.264v20.48l-10.24-5.851a36.084 36.084 0 0 0-36.084 0l-10.24 5.851v-19.504a10.728 10.728 0 0 0-6.827-10.728l-8.29-4.876s-3.413-4.389-5.85-5.852L263.87008 4.876a36.084 36.084 0 0 0-36.084 0L18.11008 125.318a35.109 35.109 0 0 0-7.802 7.802l-5.364 2.926a10.728 10.728 0 0 0-4.876 10.24v263.802a10.728 10.728 0 0 0 5.364 9.264l5.364 2.926a34.621 34.621 0 0 0 7.802 7.802l209.676 120.442a36.084 36.084 0 0 0 36.084 0l11.703-6.827v10.24a36.571 36.571 0 0 0 16.579 31.208l5.364 2.926-19.018 10.727a10.728 10.728 0 0 0-5.363 9.265v265.265a10.24 10.24 0 0 0 4.876 8.777 35.596 35.596 0 0 0 14.14 16.579l209.677 120.442a36.084 36.084 0 0 0 36.084 0l209.676-120.442a35.596 35.596 0 0 0 14.14-16.58 10.24 10.24 0 0 0 4.877-8.776V608.06a10.728 10.728 0 0 0-5.364-9.265L743.20008 588.07l5.365-2.926a36.571 36.571 0 0 0 18.041-31.208v-10.24l11.703 6.827a36.084 36.084 0 0 0 36.084 0l209.676-120.442a36.084 36.084 0 0 0 7.315-7.314l5.363-2.926a10.728 10.728 0 0 0 5.364-9.265v-264.29a10.728 10.728 0 0 0-5.364-10.727zM526.21008 466.164a10.728 10.728 0 0 0-10.24 0l-163.84 92.16-23.893-14.141v-31.208l146.286-83.383 5.851-5.851 7.314-4.389a10.728 10.728 0 0 0 5.364-9.264V226.743l28.282-16.092 28.282 16.092v183.345a10.728 10.728 0 0 0 5.364 9.264l8.29 4.389a35.109 35.109 0 0 0 5.85 5.851l146.286 83.383v30.72l-23.893 14.141z\"  ></path></symbol><symbol id=\"icon-col-2\" viewBox=\"0 0 1024 1024\"><path d=\"M921.6 0H102.4C45.8 0 0 45.8 0 102.4v819.3C0 978.2 45.8 1024 102.4 1024h819.3c56.5 0 102.4-45.8 102.4-102.4V102.4C1024 45.8 978.2 0 921.6 0zM435.2 819.2h-256c-14.1 0-25.6-11.5-25.6-25.6 0-14.1 11.5-25.6 25.6-25.6h256c14.1 0 25.6 11.5 25.6 25.6 0 14.1-11.5 25.6-25.6 25.6z m25.6-190.1c0 20.1-16.4 36.5-36.5 36.5H190.1c-20.1 0-36.5-16.4-36.5-36.5V241.3c0-20.1 16.4-36.5 36.5-36.5h234.2c20.1 0 36.5 16.4 36.5 36.5v387.8z m384 190.1h-256c-14.1 0-25.6-11.5-25.6-25.6 0-14.1 11.5-25.6 25.6-25.6h256c14.1 0 25.6 11.5 25.6 25.6 0 14.1-11.5 25.6-25.6 25.6z m25.6-190.1c0 20.1-16.4 36.5-36.5 36.5H599.7c-20.1 0-36.5-16.4-36.5-36.5V241.3c0-20.1 16.4-36.5 36.5-36.5h234.2c20.1 0 36.5 16.4 36.5 36.5v387.8z\"  ></path></symbol><symbol id=\"icon-col-3\" viewBox=\"0 0 1024 1024\"><path d=\"M921.6 0H102.4C45.8 0 0 45.8 0 102.4v819.3C0 978.2 45.8 1024 102.4 1024h819.3c56.5 0 102.4-45.8 102.4-102.4V102.4C1024 45.8 978.2 0 921.6 0zM307.2 819.2H204.8c-14.1 0-25.6-11.5-25.6-25.6 0-14.1 11.5-25.6 25.6-25.6h102.4c14.1 0 25.6 11.5 25.6 25.6 0 14.1-11.5 25.6-25.6 25.6z m25.6-190.1c0 20.1-16.4 36.5-36.5 36.5h-80.6c-20.1 0-36.5-16.4-36.5-36.5V241.3c0-20.1 16.4-36.5 36.5-36.5h80.6c20.1 0 36.5 16.4 36.5 36.5v387.8z m230.4 190.1H460.8c-14.1 0-25.6-11.5-25.6-25.6 0-14.1 11.5-25.6 25.6-25.6h102.4c14.1 0 25.6 11.5 25.6 25.6 0 14.1-11.5 25.6-25.6 25.6z m25.6-190.1c0 20.1-16.4 36.5-36.5 36.5h-80.6c-20.1 0-36.5-16.4-36.5-36.5V241.3c0-20.1 16.4-36.5 36.5-36.5h80.6c20.1 0 36.5 16.4 36.5 36.5v387.8z m230.4 190.1H716.8c-14.1 0-25.6-11.5-25.6-25.6 0-14.1 11.5-25.6 25.6-25.6h102.4c14.1 0 25.6 11.5 25.6 25.6 0 14.1-11.5 25.6-25.6 25.6z m25.6-190.1c0 20.1-16.4 36.5-36.5 36.5h-80.6c-20.1 0-36.5-16.4-36.5-36.5V241.3c0-20.1 16.4-36.5 36.5-36.5h80.6c20.1 0 36.5 16.4 36.5 36.5v387.8z\"  ></path></symbol><symbol id=\"icon-col-4\" viewBox=\"0 0 1024 1024\"><path d=\"M921.6 0H102.4C45.8 0 0 45.8 0 102.4v819.3C0 978.2 45.8 1024 102.4 1024h819.3c56.5 0 102.4-45.8 102.4-102.4V102.4C1024 45.8 978.2 0 921.6 0zM113.3 241.3c0-20.1 16.4-36.5 36.5-36.5h80.6c20.1 0 36.5 16.4 36.5 36.5v387.8c0 20.1-16.4 36.5-36.5 36.5h-80.6c-20.1 0-36.5-16.4-36.5-36.5V241.3z m128 577.9H138.9c-14.1 0-25.6-11.5-25.6-25.6s11.5-25.6 25.6-25.6h102.4c14.1 0 25.6 11.5 25.6 25.6 0 14.1-11.5 25.6-25.6 25.6z m214.6 0H353.5c-14.1 0-25.6-11.5-25.6-25.6s11.5-25.6 25.6-25.6h102.4c14.1 0 25.6 11.5 25.6 25.6s-11.5 25.6-25.6 25.6z m25.6-190.1c0 20.1-16.4 36.5-36.5 36.5h-80.6c-20.1 0-36.5-16.4-36.5-36.5V241.3c0-20.1 16.4-36.5 36.5-36.5H445c20.1 0 36.5 16.4 36.5 36.5v387.8z m189.1 190.1H568.2c-14.1 0-25.6-11.5-25.6-25.6s11.5-25.6 25.6-25.6h102.4c14.1 0 25.6 11.5 25.6 25.6s-11.5 25.6-25.6 25.6z m25.6-190.1c0 20.1-16.4 36.5-36.5 36.5h-80.6c-20.1 0-36.5-16.4-36.5-36.5V241.3c0-20.1 16.4-36.5 36.5-36.5h80.6c20.1 0 36.5 16.4 36.5 36.5v387.8z m189 190.1H782.8c-14.1 0-25.6-11.5-25.6-25.6s11.5-25.6 25.6-25.6h102.4c14.1 0 25.6 11.5 25.6 25.6s-11.5 25.6-25.6 25.6z m25.6-190.1c0 20.1-16.4 36.5-36.5 36.5h-80.6c-20.1 0-36.5-16.4-36.5-36.5V241.3c0-20.1 16.4-36.5 36.5-36.5h80.6c20.1 0 36.5 16.4 36.5 36.5v387.8z\"  ></path></symbol><symbol id=\"icon-col-1\" viewBox=\"0 0 1024 1024\"><path d=\"M921.6 0H102.4C45.8 0 0 45.8 0 102.4v819.3C0 978.2 45.8 1024 102.4 1024h819.3c56.5 0 102.4-45.8 102.4-102.4V102.4C1024 45.8 978.2 0 921.6 0z m-76.8 819.2H179.2c-14.1 0-25.6-11.5-25.6-25.6s11.5-25.6 25.6-25.6h665.6c14.1 0 25.6 11.5 25.6 25.6 0 14.1-11.5 25.6-25.6 25.6z m25.6-190.1c0 20.1-16.4 36.5-36.5 36.5H190.1c-20.1 0-36.5-16.4-36.5-36.5V241.3c0-20.1 16.4-36.5 36.5-36.5h643.8c20.1 0 36.5 16.4 36.5 36.5v387.8z\"  ></path></symbol><symbol id=\"icon-zuzhijuese\" viewBox=\"0 0 1024 1024\"><path d=\"M853.333333 256h-341.333333l-85.333333-85.333333H170.666667a85.333333 85.333333 0 0 0-85.333334 85.333333v512a85.333333 85.333333 0 0 0 85.333334 85.333333h682.666666a85.333333 85.333333 0 0 0 85.333334-85.333333V341.333333a85.333333 85.333333 0 0 0-85.333334-85.333333z m-341.333333 85.333333a106.666667 106.666667 0 1 1-106.666667 106.666667A106.24 106.24 0 0 1 512 341.333333z m192 426.666667h-384v-42.666667a128 128 0 0 1 128-128h128a128 128 0 0 1 128 128v42.666667z\"  ></path></symbol><symbol id=\"icon-hashtag\" viewBox=\"0 0 1024 1024\"><path d=\"M870.4 448a64 64 0 0 0 0-128h-114.56l26.88-148.48a64 64 0 0 0-126.08-23.04l-32 171.52h-156.8l26.88-148.48a64 64 0 0 0-126.08-23.04l-32 171.52H198.4a64 64 0 1 0 0 128h116.16l-23.36 128H153.6a64 64 0 0 0 0 128h114.56l-26.88 148.48a64 64 0 1 0 126.08 23.04l32-171.52h157.76l-26.88 148.48a64 64 0 1 0 126.08 23.04l32-171.52h137.28a64 64 0 1 0 0-128h-116.16l23.36-128z m-291.2 128h-157.76l23.36-128h157.76z\"  ></path></symbol><symbol id=\"icon-formula\" viewBox=\"0 0 1024 1024\"><path d=\"M471.2 358.3h-130l19-90.4a133.5 133.5 0 0 1 130.3-106.2h52.7a32.9 32.9 0 1 0 0-65.7h-52.7c-93.8 0-175.6 66.7-194.6 158.6l-21.8 103.7H128.8a32.9 32.9 0 0 0 0 65.7h131.6l-97.3 464.5a32.7 32.7 0 0 0 25.5 38.8 30.5 30.5 0 0 0 6.7 0.7 32.9 32.9 0 0 0 32.1-26.2L327.5 424h143.7a32.9 32.9 0 1 0 0-65.7zM758.4 712l160-160a32.8 32.8 0 1 0-46.5-46.4L712 665.5 552 505.6a32.8 32.8 0 1 0-46.4 46.4l160 160-160 159.9a32.8 32.8 0 1 0 46.4 46.5l160-160 159.9 160a32.9 32.9 0 0 0 46.5-46.5z\"  ></path></symbol><symbol id=\"icon-t\" viewBox=\"0 0 1024 1024\"><path d=\"M851.968 167.936l0 109.568-281.6 0 0 587.776-116.736 0 0-587.776-281.6 0 0-109.568 679.936 0z\"  ></path></symbol><symbol id=\"icon-t-filled\" viewBox=\"0 0 1024 1024\"><path d=\"M832 64 192 64C121.344 64 64 121.344 64 192l0 640c0 70.656 57.344 128 128 128l640 0c70.656 0 128-57.344 128-128L960 192C960 121.344 902.656 64 832 64zM768 320 576 320l0 448c0 35.392-28.608 64-64 64s-64-28.608-64-64L448 320 256 320C220.608 320 192 291.392 192 256s28.608-64 64-64l512 0c35.392 0 64 28.608 64 64S803.392 320 768 320z\"  ></path></symbol><symbol id=\"icon-select\" viewBox=\"0 0 1024 1024\"><path d=\"M912.14545437 992L111.85454563 992A79.85454563 79.85454563 0 0 1 32 912.14545437L32 111.85454563A79.85454563 79.85454563 0 0 1 111.85454563 32l800.29090875 0A79.85454563 79.85454563 0 0 1 992 111.85454563l0 800.29090875A79.85454563 79.85454563 0 0 1 912.14545437 992zM111.85454563 111.85454563l-1e-8 800.29090875 800.29090875 0L912.14545437 111.85454563z\"  ></path><path d=\"M224 520.72727281l205.52727281 205.52727282 370.47272719-370.47272719-58.03636406-58.03636406-312.43636313 311.99999999-147.49090875-147.49090874L224 520.72727281z\"  ></path></symbol><symbol id=\"icon-number\" viewBox=\"0 0 1224 1024\"><path d=\"M0 901.567122h1224.462246v122.432878H0zM122.165946 745.589771h145.12211V10.310343h-101.137624a113.030935 113.030935 0 0 1-5.279325 23.490029C142.393471 95.076129 101.063477 124.690768 14.859223 124.690768h-13.198312v109.279055h120.490205zM400.991403 563.808979a402.222256 402.222256 0 0 0-35.175725 181.780792h397.550943v-130.722604H538.194526c7.044043-27.568159 17.587863-45.971647 49.248981-82.719307 7.044043-8.17109 14.073256-16.31252 21.117299-23.490028 139.842786-146.041543 161.835029-194.030012 156.555704-303.309067C757.197523 54.205852 682.441692-17.272645 517.967001 6.217384a147.450352 147.450352 0 0 0-62.447293 22.466789c-61.572349 39.832208-85.31448 88.843916-87.983801 188.928641 0 10.217569 0 20.420309 0.874944 30.637879h137.203124c-0.874944-9.194329-0.874944-17.365419-0.874945-25.536509 2.639662-78.596688 24.631905-108.255815 58.932687-110.287465 33.425837-1.02324 56.352342 26.544919 57.167968 92.922046 0.874944 71.478497-19.278433 116.426905-118.740317 218.54328-55.373591 57.197627-80.005496 91.943295-101.107965 139.916934zM819.644816 529.078141a246.452519 246.452519 0 0 0 0.874944 43.910338c13.198312 127.652884 69.491336 181.780792 197.900528 181.780792 120.490205 0 179.437721-53.104668 198.716153-171.563223 21.117299-130.722604-20.227525-209.348951-80.910099-228.760849a39.209366 39.209366 0 0 0-14.9482-3.06972c30.786174-8.17109 55.41808-31.661119 73.005942-75.630775 8.793931-21.443549 13.198312-49.026538 13.198311-87.820676-1.764718-136.847214-84.439536-212.418671-242.759958-180.757552-72.116168 14.295699-124.894586 75.630775-136.328179 162.368893-2.639662 16.31252-2.639662 32.62504-1.749888 49.026537h134.563461a150.490413 150.490413 0 0 1-0.889774-19.411899c2.639662-55.151147 16.712918-78.596688 42.219768-85.789026 38.705161-10.20274 60.682575 14.295699 63.322237 84.765787 3.514607 76.594697-25.50685 110.287465-87.954142 109.264225-5.279325-1.02324-11.433594-1.02324-16.712919-2.04648v106.209335h13.198312c84.439536 0 101.152454 17.365419 101.152454 115.403665 0 83.742546-12.323367 110.287465-43.094712 117.435315-43.094712 11.240809-66.851673-15.318939-73.005942-91.943295a104.933993 104.933993 0 0 1 0-23.490029z\"  ></path></symbol><symbol id=\"icon-shangchuan\" viewBox=\"0 0 1024 1024\"><path d=\"M646.791 799v-31.447c0-8.837 7.164-16 16-16H735c88.127 0 159.569-71.46 159.569-159.61 0-88.15-71.442-159.61-159.569-159.61-11.454 0-26.738 2.548-45.854 7.645a7.931 7.931 0 0 1-9.616-10.01c7.907-25.529 11.861-45.89 11.861-61.083 0-99.1-80.316-179.438-179.391-179.438-99.075 0-179.391 80.337-179.391 179.438 0 15.193 3.954 35.554 11.861 61.083a7.929 7.929 0 0 1-9.616 10.01c-19.116-5.097-34.4-7.646-45.854-7.646-88.127 0-159.569 71.46-159.569 159.61 0 88.15 71.442 159.61 159.569 159.61h73.2c8.837 0 16 7.164 16 16V799c0 8.837-7.163 16-16 16H289c-123.16 0-223-99.866-223-223.058 0-116.51 89.304-212.156 203.18-222.188-0.002-0.29-0.002-0.58-0.002-0.87C269.178 234.745 377.893 126 512 126s242.822 108.743 242.822 242.885l-0.001 0.869C868.696 379.786 958 475.432 958 591.942 958 715.134 858.16 815 735 815h-72.209c-8.836 0-16-7.163-16-16z m-168.66-301.848l-79.364 69.93c-13.636 11.031-33.643 8.931-44.685-4.691-11.043-13.622-8.94-33.607 4.696-44.638l126.696-108.219c11-11.252 28.92-12.857 41.826-3.141L664.347 516.97c14.014 10.55 16.814 30.449 6.253 44.447-10.56 14-30.48 16.796-44.494 6.247l-84.431-70.973v286.57c0 17.529-14.225 31.738-31.772 31.738-17.547 0-31.772-14.21-31.772-31.738v-286.11z\"  ></path></symbol><symbol id=\"icon-drag\" viewBox=\"0 0 1024 1024\"><path d=\"M909.3 506.3L781.7 405.6c-4.7-3.7-11.7-0.4-11.7 5.7V476H548V254h64.8c6 0 9.4-7 5.7-11.7L517.7 114.7c-2.9-3.7-8.5-3.7-11.3 0L405.6 242.3c-3.7 4.7-0.4 11.7 5.7 11.7H476v222H254v-64.8c0-6-7-9.4-11.7-5.7L114.7 506.3c-3.7 2.9-3.7 8.5 0 11.3l127.5 100.8c4.7 3.7 11.7 0.4 11.7-5.7V548h222v222h-64.8c-6 0-9.4 7-5.7 11.7l100.8 127.5c2.9 3.7 8.5 3.7 11.3 0l100.8-127.5c3.7-4.7 0.4-11.7-5.7-11.7H548V548h222v64.8c0 6 7 9.4 11.7 5.7l127.5-100.8c3.7-2.9 3.7-8.5 0.1-11.4z\"  ></path></symbol><symbol id=\"icon-grid\" viewBox=\"0 0 1024 1024\"><path d=\"M128 469.333333 469.333333 469.333333 469.333333 128 128 128M128 896 469.333333 896 469.333333 554.666667 128 554.666667M554.666667 896 896 896 896 554.666667 554.666667 554.666667M554.666667 128 554.666667 469.333333 896 469.333333 896 128\"  ></path></symbol><symbol id=\"icon-trash\" viewBox=\"0 0 1024 1024\"><path d=\"M394.95161173 414.51738453l0 351.0632448q0 8.5327872-5.4853632 14.0181504t-14.0181504 5.4853632l-39.0070272 0q-8.5327872 0-14.0181504-5.4853632t-5.4853632-14.0181504l0-351.0632448q0-8.5327872 5.4853632-14.0181504t14.0181504-5.4853632l39.0070272 0q8.5327872 0 14.0181504 5.4853632t5.4853632 14.0181504z m156.0281088 0l0 351.0632448q0 8.5327872-5.4853632 14.0181504t-14.0181504 5.4853632l-39.0070272 0q-8.5327872 0-14.0181504-5.4853632t-5.4853632-14.0181504l0-351.0632448q0-8.5327872 5.4853632-14.0181504t14.0181504-5.4853632l39.0070272 0q8.5327872 0 14.0181504 5.4853632t5.4853632 14.0181504z m156.0281088 0l0 351.0632448q0 8.5327872-5.4853632 14.0181504t-14.0181504 5.4853632l-39.0070272 0q-8.5327872 0-14.0181504-5.4853632t-5.4853632-14.0181504l0-351.0632448q0-8.5327872 5.4853632-14.0181504t14.0181504-5.4853632l39.0070272 0q8.5327872 0 14.0181504 5.4853632t5.4853632 14.0181504z m78.0140544 441.2669952l0-577.7915904-546.0983808 0 0 577.7915904q0 13.4086656 4.2663936 24.6841344t8.8375296 16.4560896 6.3995904 5.1806208l507.0913536 0q1.8284544 0 6.3995904-5.1806208t8.8375296-16.4560896 4.2663936-24.6841344z m-409.5737856-655.8056448l273.0491904 0-29.2552704-71.3097216q-4.2663936-5.4853632-10.3612416-6.7043328l-193.2066816 0q-6.094848 1.2189696-10.3612416 6.7043328z m565.6018944 19.5035136l0 39.0070272q0 8.5327872-5.4853632 14.0181504t-14.0181504 5.4853632l-58.5105408 0 0 577.7915904q0 50.5872384-28.6457856 87.4610688t-68.8717824 36.8738304l-507.0913536 0q-40.2259968 0-68.8717824-35.6548608t-28.6457856-86.2420992l0-580.2295296-58.5105408 0q-8.5327872 0-14.0181504-5.4853632t-5.4853632-14.0181504l0-39.0070272q0-8.5327872 5.4853632-14.0181504t14.0181504-5.4853632l188.3308032 0 42.663936-101.7839616q9.142272-22.5509376 32.9121792-38.3975424t48.1492992-15.8466048l195.035136 0q24.379392 0 48.1492992 15.8466048t32.9121792 38.3975424l42.663936 101.7839616 188.3308032 0q8.5327872 0 14.0181504 5.4853632t5.4853632 14.0181504z\"  ></path></symbol><symbol id=\"icon-ic\" viewBox=\"0 0 1536 1024\"><path d=\"M1187.84 460.8h-327.68c-22.528 0-40.96-18.432-40.96-40.96V92.16c0-22.528 18.432-40.96 40.96-40.96h327.68c22.528 0 40.96 18.432 40.96 40.96v327.68c0 22.528-18.432 40.96-40.96 40.96z\"  ></path><path d=\"M1126.4 512v358.4c0 28.16-23.04 51.2-51.2 51.2H409.6c-28.16 0-51.2-23.04-51.2-51.2V307.2c0-28.16 23.04-51.2 51.2-51.2h358.4V153.6H389.12c-45.056 0-81.92 36.864-81.92 81.92v655.36c0 45.056 36.864 81.92 81.92 81.92h706.56c45.056 0 81.92-36.864 81.92-81.92v-378.88h-51.2z\"  ></path></symbol><symbol id=\"icon-date\" viewBox=\"0 0 1024 1024\"><path d=\"M205 552h120c13.3 0 24-10.7 24-24s-10.7-24-24-24H205c-13.3 0-24 10.7-24 24s10.7 24 24 24zM453 552h120c13.3 0 24-10.7 24-24s-10.7-24-24-24H453c-13.3 0-24 10.7-24 24s10.7 24 24 24zM701 552h120c13.3 0 24-10.7 24-24s-10.7-24-24-24H701c-13.3 0-24 10.7-24 24s10.7 24 24 24zM205 687h120c13.3 0 24-10.7 24-24s-10.7-24-24-24H205c-13.3 0-24 10.7-24 24s10.7 24 24 24zM453 687h120c13.3 0 24-10.7 24-24s-10.7-24-24-24H453c-13.3 0-24 10.7-24 24s10.7 24 24 24zM701 687h120c13.3 0 24-10.7 24-24s-10.7-24-24-24H701c-13.3 0-24 10.7-24 24s10.7 24 24 24zM205 823h120c13.3 0 24-10.7 24-24s-10.7-24-24-24H205c-13.3 0-24 10.7-24 24s10.7 24 24 24zM453 823h120c13.3 0 24-10.7 24-24s-10.7-24-24-24H453c-13.3 0-24 10.7-24 24s10.7 24 24 24zM701 823h120c13.3 0 24-10.7 24-24s-10.7-24-24-24H701c-13.3 0-24 10.7-24 24s10.7 24 24 24z\"  ></path><path d=\"M870 116H745V64c0-13.3-10.7-24-24-24s-24 10.7-24 24v52H327V64c0-13.3-10.7-24-24-24s-24 10.7-24 24v52H154c-51.9 0-94 42.1-94 94v692c0 51.9 42.1 94 94 94h716c51.9 0 94-42.1 94-94V210c0-51.9-42.1-94-94-94z m46 786c0 25.4-20.6 46-46 46H154c-25.4 0-46-20.6-46-46V387h808v515z m0-563H108V210c0-25.4 20.6-46 46-46h125v68c0 13.3 10.7 24 24 24s24-10.7 24-24v-68h370v68c0 13.3 10.7 24 24 24s24-10.7 24-24v-68h125c25.4 0 46 20.6 46 46v129z\"  ></path></symbol><symbol id=\"icon-fuwenbenkuang\" viewBox=\"0 0 1024 1024\"><path d=\"M218.316 307.727h87.886v205.06h-29.297v29.295h117.179v-29.294H364.79V307.727h87.882v29.293h29.294v-87.882H189.022v87.882h29.294v-29.293z m322.242 58.59h292.945v58.588H540.558v-58.588z m0 117.177h292.945v58.588H540.558v-58.588z m-351.536 117.18h644.481v58.588h-644.48v-58.587z m0 117.176h644.481v58.588h-644.48V717.85z m351.536-468.713h292.945v58.589H540.558v-58.589z m420.923 713.13H61.045V63.309h900.436v898.958z m-864.62-35.816h828.804V99.125H96.861V926.45z\"  ></path></symbol><symbol id=\"icon-bars\" viewBox=\"0 0 1024 1024\"><path d=\"M170.666667 490.666667l682.666666 0 0 42.666666-682.666666 0 0-42.666666Z\"  ></path><path d=\"M170.666667 704l682.666666 0 0 42.666667-682.666666 0 0-42.666667Z\"  ></path><path d=\"M170.666667 277.333333l682.666666 0 0 42.666667-682.666666 0 0-42.666667Z\"  ></path></symbol><symbol id=\"icon-slider\" viewBox=\"0 0 1024 1024\"><path d=\"M901.12 122.88h-757.76c-20.48 0-34.133333 13.653333-34.133333 34.133333v6.826667c0 20.48 13.653333 34.133333 34.133333 34.133333h757.76c6.826667 0 13.653333 0 20.48-6.826666s6.826667-13.653333 6.826667-20.48v-6.826667c0-27.306667-13.653333-40.96-27.306667-40.96z\"  ></path><path d=\"M764.586667 88.746667h-68.266667c-20.48 0-34.133333 13.653333-34.133333 34.133333v68.266667c0 20.48 13.653333 34.133333 34.133333 34.133333h68.266667c20.48 0 34.133333-13.653333 34.133333-34.133333v-68.266667c0-20.48-13.653333-34.133333-34.133333-34.133333zM901.12 430.08h-757.76c-20.48 0-34.133333 13.653333-34.133333 34.133333v6.826667c0 20.48 13.653333 34.133333 34.133333 34.133333h757.76c20.48 0 34.133333-13.653333 34.133333-34.133333v-6.826667c-6.826667-20.48-20.48-34.133333-34.133333-34.133333z\"  ></path><path d=\"M552.96 395.946667h-68.266667c-20.48 0-34.133333 13.653333-34.133333 34.133333v68.266667c0 20.48 13.653333 34.133333 34.133333 34.133333h68.266667c20.48 0 34.133333-13.653333 34.133333-34.133333v-68.266667c0-20.48-13.653333-34.133333-34.133333-34.133333zM901.12 737.28h-757.76c-6.826667 0-13.653333 0-20.48 6.826667-6.826667 6.826667-6.826667 13.653333-6.826667 20.48v6.826666c0 20.48 13.653333 34.133333 34.133334 34.133334h757.76c20.48 0 34.133333-13.653333 34.133333-34.133334v-6.826666c-13.653333-13.653333-27.306667-27.306667-40.96-27.306667z\"  ></path><path d=\"M354.986667 703.146667h-68.266667c-20.48 0-34.133333 13.653333-34.133333 34.133333v68.266667c0 20.48 13.653333 34.133333 34.133333 34.133333h68.266667c20.48 0 34.133333-13.653333 34.133333-34.133333v-68.266667c0-20.48-13.653333-34.133333-34.133333-34.133333z\"  ></path></symbol><symbol id=\"icon-color\" viewBox=\"0 0 1024 1024\"><path d=\"M297.78046416 323.45884442c0-38.83614815 31.06891852-69.90506667 66.02145186-69.90506666s66.02145185 31.06891852 66.02145186 69.90506666S402.63806416 389.48029628 363.80191602 389.48029628s-66.02145185-31.06891852-66.02145186-66.02145186zM165.73756046 459.38536294C165.73756046 420.54921479 196.80647899 389.48029628 231.75901232 389.48029628s66.02145185 31.06891852 66.02145184 69.90506666-31.06891852 66.02145185-66.02145184 66.02145185-66.02145185-31.06891852-66.02145186-66.02145185zM476.42674566 276.85546665c0-38.83614815 31.06891852-69.90506667 66.02145184-69.90506667 34.95253333 0 66.02145185 31.06891852 66.02145185 69.90506665s-31.06891852 66.02145185-66.02145185 66.02145186c-34.95253333 0-66.02145185-31.06891852-66.02145184-66.02145184zM476.42674566 661.33333331c0-50.48699259 38.83614815-89.32314075 89.32314073-89.32314076s89.32314075 38.83614815 89.32314074 89.32314076-38.83614815 89.32314075-89.32314074 89.32314075-89.32314075-38.83614815-89.32314073-89.32314075z\"  ></path><path d=\"M519.14650861 164.23063701C297.78046416 164.23063701 119.13418269 315.69161479 119.13418269 505.98874073s178.64628148 337.87448889 400.01232592 337.87448888c62.13783703 0 108.74121482-7.76722963 147.57736297-23.30168888 27.1853037-11.65084445 50.48699259-27.1853037 62.13783703-46.60337779 27.1853037-42.71976297 7.76722963-104.8576-11.65084445-143.69374815-42.71976297-89.32314075-3.88361482-128.15928889 15.53445927-139.81013333 11.65084445-7.76722963 23.30168889-11.65084445 34.95253333-11.65084445 19.41807408 0 50.48699259 7.76722963 81.55591112 54.37060741 15.53445925 27.1853037 34.95253333 34.95253333 42.71976295 34.95253334 15.53445925 0 27.1853037-27.1853037 27.18530371-69.90506667 0-182.5298963-178.64628148-333.99087408-400.01232593-333.99087408z m0 722.35235556c-116.50844445 0-229.13327408-38.83614815-310.68918518-112.62482963-42.71976297-34.95253333-73.78868148-77.6722963-97.09037037-124.27567408-23.30168889-42.71976297-34.95253333-93.20675555-34.95253333-147.57736296S88.06526416 401.13114073 111.36695306 350.64414813c23.30168889-46.60337778 54.37060741-85.43952592 97.09037037-124.27567407C290.01323454 156.46340739 402.63806416 117.62725923 519.14650861 117.62725923s229.13327408 38.83614815 310.68918519 112.62482963c42.71976297 34.95253333 73.78868148 77.6722963 97.09037036 124.27567408 23.30168889 46.60337778 34.95253333 97.09037037 34.95253334 151.46097777 0 85.43952592-34.95253333 112.62482963-69.90506667 112.62482963-27.1853037 0-58.25422222-19.41807408-81.5559111-54.3706074-15.53445925-23.30168889-31.06891852-34.95253333-42.71976297-34.95253333-3.88361482 0-7.76722963 0-11.65084444 3.88361481-23.30168889 15.53445925-11.65084445 58.25422222 0 77.67229629 34.95253333 73.78868148 38.83614815 139.81013333 7.76722962 190.29712592-34.95253333 58.25422222-116.50844445 85.43952592-244.66773333 85.43952592z\"  ></path></symbol><symbol id=\"icon-radio-active\" viewBox=\"0 0 1024 1024\"><path d=\"M512 4.533c-279.803 0-507.467 227.665-507.467 507.467 0 279.839 227.629 507.467 507.467 507.467 279.839 0 507.467-227.629 507.467-507.467 0-279.803-227.629-507.467-507.467-507.467zM512 946.65c-239.68 0-434.65-195.006-434.65-434.65 0-239.68 194.97-434.65 434.65-434.65 239.644 0 434.65 194.97 434.65 434.65 0 239.644-195.006 434.65-434.65 434.65zM512 329.955c-100.38 0-182.045 81.665-182.045 182.045s81.665 182.045 182.045 182.045 182.045-81.665 182.045-182.045-81.665-182.045-182.045-182.045z\"  ></path></symbol><symbol id=\"icon-input\" viewBox=\"0 0 1669 1024\"><path d=\"M1398.66921433 732.06637047c0 70.6134846-45.10390102 127.64034389-100.83679598 127.64034389L366.82504671 859.70671436C311.18457777 859.70671436 265.98825072 802.67985575 265.98825072 732.06637047L265.98825072 292.02605556C265.98825072 221.41257027 311.18457777 164.38571167 366.82504671 164.38571167l931.09979834 0c55.73289429 0 100.836796 57.0268586 100.83679599 127.54791786L1398.76164038 732.06637047zM1362.43821147 286.48049352c0-51.01916714-41.40686012-92.42602727-92.42602726-92.42602726L394.83013288 194.05446626c-51.01916714 0-92.42602727 41.40686012-92.42602726 92.42602726l0 451.13143898c0 51.11159317 41.40686012 92.42602727 92.42602726 92.42602727l875.18205134 0c51.01916714 0 92.42602727-41.3144341 92.42602725-92.42602727L1362.43821147 286.48049352z\"  ></path><path d=\"M447.23569039 723.84045447c0 16.0821286-12.93964383 28.9293464-28.92934643 28.92934639l0 0c-15.89727654 0-28.9293464-12.8472178-28.92934639-28.9293464l0-392.81061538c0-15.89727654 12.93964383-28.9293464 28.92934639-28.92934639l0 0c15.89727654 0 28.9293464 12.93964383 28.92934643 28.92934639L447.23569039 723.84045447z\"  ></path><path d=\"M556.94538452 690.75193637m-34.65976047 0a0.25460031 0.25460031 0 1 0 69.31952028 0 0.25460031 0.25460031 0 1 0-69.31952028 0Z\"  ></path><path d=\"M691.33282806 690.75193637m-34.65976048 0a0.25460031 0.25460031 0 1 0 69.31952028 0 0.25460031 0.25460031 0 1 0-69.31952028 0Z\"  ></path><path d=\"M821.2838225 690.75193637m-34.65976049 0a0.25460031 0.25460031 0 1 0 69.3195203 0 0.25460031 0.25460031 0 1 0-69.3195203 0Z\"  ></path></symbol><symbol id=\"icon-switch\" viewBox=\"0 0 1024 1024\"><path d=\"M729.008 806.496 295.008 806.496C140.912 806.496 16 681.584 16 527.504l0-31.008c0-154.08 124.912-278.992 279.008-278.992l434 0c154.08 0 279.008 124.912 279.008 278.992l0 31.008C1008 681.584 883.088 806.496 729.008 806.496zM946.96 496.768c0-119.696-97.04-216.736-216.736-216.736L294.384 280.032c-119.696 0-216.736 97.04-216.736 216.736l0 31.008c0 119.696 97.04 216.736 216.736 216.736L730.24 744.512c119.696 0 216.736-97.04 216.736-216.736L946.976 496.768zM702.32 672.576c-90.72 0-164.272-73.536-164.272-164.256 0-90.72 73.552-164.272 164.272-164.272 90.72 0 164.272 73.536 164.272 164.272C866.592 599.04 793.04 672.576 702.32 672.576z\"  ></path></symbol><symbol id=\"icon-checkbox\" viewBox=\"0 0 1024 1024\"><path d=\"M797.8 248.4c-11.4-11.6-30.2-11.6-41.6-0.2L409.2 592.4l-146.8-148c-11.4-11.6-30.2-11.6-41.6-0.2l-55.8 55.4c-11.6 11.4-11.6 30.2-0.2 41.6l222.8 224.6c11.4 11.6 30.2 11.6 41.6 0.2l423.6-420.2c11.6-11.4 11.6-30.2 0.2-41.6l-55.2-55.8z\"  ></path><path d=\"M857 59h-696c-55.2 0-100 44.8-100 100v696c0 55.2 44.8 100 100 100h696c55.2 0 100-44.8 100-100v-696c0-55.2-44.8-100-100-100z m53.8 777.8c0 39.8-32.2 72-72 72H179.2c-39.8 0-72-32.2-72-72V177.2c0-39.8 32.2-72 72-72h659.6c39.8 0 72 32.2 72 72v659.6z\"  ></path></symbol><symbol id=\"icon-tooltip\" viewBox=\"0 0 1024 1024\"><path d=\"M511.999488 64.900126c-247.025093 0-447.290209 200.147436-447.290209 447.085548 0 246.909459 200.264093 447.115224 447.290209 447.115224s447.290209-200.205764 447.290209-447.115224C959.288674 265.046538 759.024581 64.900126 511.999488 64.900126L511.999488 64.900126zM511.999488 895.276267c-211.386408 0-383.348921-172.020842-383.348921-383.291616 0-211.299427 171.962513-383.203612 383.348921-383.203612 211.444736 0 383.408273 171.904185 383.408273 383.203612C895.407762 723.255425 723.444225 895.276267 511.999488 895.276267L511.999488 895.276267zM511.999488 256.486582c-88.048335 0-159.734004 71.685669-159.734004 159.647023l0 32.028461 63.881936 0 0-32.028461c0-52.759621 42.976814-95.764064 95.852068-95.764064 52.876278 0 95.852068 43.004443 95.852068 95.764064 0 35.987632-20.73116 56.019875-54.506405 85.835947-32.66905 28.767184-73.257467 64.521502-73.257467 126.716007l0 42.97579 63.881936 0 0-42.97579c0-31.679513 19.624966-50.547233 51.595099-78.848813 33.95023-29.815049 76.168774-67.083861 76.168774-133.703141C671.733493 328.172251 600.106152 256.486582 511.999488 256.486582L511.999488 256.486582zM480.087685 703.57213l63.881936 0 0 63.940265L480.087685 767.512395 480.087685 703.57213 480.087685 703.57213zM480.087685 703.57213\"  ></path></symbol><symbol id=\"icon-tupian\" viewBox=\"0 0 1170 1024\"><path d=\"M1060.432916 0H109.768851A109.768851 109.768851 0 0 0 0 109.768851v804.462298a109.768851 109.768851 0 0 0 109.768851 109.768851h950.664065a109.768851 109.768851 0 0 0 109.768851-109.768851V109.768851A109.768851 109.768851 0 0 0 1060.432916 0zM109.768851 73.218409h950.781591a36.550442 36.550442 0 0 1 36.550442 36.550442v430.731092c-58.762768-48.302996-161.127511-113.529668-283.706646-113.529669-113.059566 0-224.473775 87.556525-332.127166 172.292437-82.267876 64.874096-167.943992 131.981178-227.76449 131.981177-84.030759 0-155.956387-61.818432-180.284173-85.323539V109.768851a36.667967 36.667967 0 0 1 36.550442-36.550442z m950.781591 877.680707H109.768851a36.550442 36.550442 0 0 1-36.550442-36.550442V740.645931c43.837025 31.026742 107.300815 63.698841 180.284173 63.698841 85.206014 0 176.288305-71.690577 273.011822-147.612074s199.793412-156.66154 286.99736-156.66154c157.131642 0 282.061288 138.327557 283.119018 139.737863v274.422128a36.550442 36.550442 0 0 1-36.550442 36.550442z\"  ></path><path d=\"M303.450935 501.716516a147.259497 147.259497 0 1 0-147.259497-147.612074 147.259497 147.259497 0 0 0 147.259497 147.612074z m0-220.948009a73.335935 73.335935 0 1 1-72.748307 73.335935 73.335935 73.335935 0 0 1 73.21841-73.335935z\"  ></path></symbol><symbol id=\"icon-rate\" viewBox=\"0 0 1024 1024\"><path d=\"M512.161682 66.028832c-7.767917 0-23.348778 6.231935-43.649126 46.343491-48.821939 87.162152-125.945457 229.404784-125.945457 229.404784s-140.995221 27.38572-231.952816 44.577265c-44.614104 7.344269-59.193147 47.083341-36.548404 75.05644 63.996546 77.008908 177.216167 204.165959 177.216167 204.165959s-18.48091 139.628084-28.888957 234.942917c-3.384074 36.602639 15.915481 57.597813 42.837644 57.597813 8.772804 0 18.367323-2.248204 28.256554-6.9022 76.339666-37.858236 192.462406-95.745644 218.751143-108.816335 25.840528 13.211906 140.817166 72.034617 216.300324 110.004393 9.775644 4.686742 19.295462 6.934946 27.958772 6.934946 26.621311 0 45.695738-20.957311 42.314735-57.634652-10.261715-95.458095-28.554336-235.31233-28.554336-235.31233s111.922069-127.270639 175.171602-204.391087c22.381753-28.043706 7.990998-67.821665-36.106336-75.197656-89.908706-17.238616-229.310639-44.650943-229.310639-44.650943S603.786473 199.717647 555.523259 112.451118c-17.066701-32.216749-30.122041-42.547025-38.377052-45.388746C516.367471 66.659189 514.695389 66.028832 512.161682 66.028832L512.161682 66.028832 512.161682 66.028832zM512.161682 66.028832\"  ></path></symbol><symbol id=\"icon-time\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.96 64 64 264.96 64 512s200.96 448 448 448 448-200.96 448-448S759.04 64 512 64z m0 831.712c-211.584 0-383.712-172.16-383.712-383.712 0-211.584 172.128-383.712 383.712-383.712 211.552 0 383.712 172.128 383.712 383.712 0 211.552-172.16 383.712-383.712 383.712z\"  ></path><path d=\"M671.968 512H512V288.064c0-17.76-14.24-32.128-32-32.128s-32 14.4-32 32.128V544c0 17.76 14.272 32 32 32h191.968c17.76 0 32.128-14.24 32.128-32s-14.368-32-32.128-32z\"  ></path></symbol><symbol id=\"icon-clone\" viewBox=\"0 0 1024 1024\"><path d=\"M897.71428583 881.64285753l2e-8-546.42857168q0-6.52901748-4.77120499-11.30022335t-11.30022333-4.77120497l-546.42857168 0q-6.52901748 0-11.30022335 4.77120497t-4.77120497 11.30022335l0 546.42857168q0 6.52901748 4.77120497 11.30022333t11.30022335 4.77120499l546.42857168 0q6.52901748 0 11.30022333-4.77120499t4.77120499-11.30022333z m64.28571417-546.42857168l0 546.42857168q0 33.14732167-23.60491084 56.75223251t-56.75223252 23.60491085l-546.42857167 0q-33.14732167 0-56.75223252-23.60491085t-23.60491084-56.75223251l0-546.42857168q0-33.14732167 23.60491084-56.75223252t56.75223252-23.60491084l546.42857167 0q33.14732167 0 56.75223252 23.60491084t23.60491084 56.75223252z m-192.85714247-192.85714249l0 80.35714249-64.28571417 0 0-80.35714249q0-6.52901748-4.77120498-11.30022334t-11.30022335-4.77120498l-546.42857167 0q-6.52901748 0-11.30022334 4.77120498t-4.77120498 11.30022334l0 546.42857168q0 6.52901748 4.77120498 11.30022334t11.30022334 4.77120498l80.35714247 0 0 64.28571417-80.35714247 0q-33.14732167 0-56.75223252-23.60491085t-23.60491084-56.75223251l0-546.42857168q0-33.14732167 23.60491084-56.75223252t56.75223252-23.60491084l546.42857167 0q33.14732167 0 56.75223252 23.60491084t23.60491084 56.75223252z\"  ></path></symbol><symbol id=\"icon-jilianxuanze\" viewBox=\"0 0 1024 1024\"><path d=\"M128 512V224c0-16 12.8-32 32-32h384c19.2 0 32 12.8 32 32v288c0 16-12.8 32-32 32h-32v64h64c35.2 0 64-28.8 64-64V192c0-35.2-28.8-64-64-64H128c-35.2 0-64 28.8-64 64v352c0 35.2 28.8 64 64 64h192v-64H160c-16 0-32-12.8-32-32z\"  ></path><path d=\"M896 416H704v64h160c19.2 0 32 12.8 32 32v288c0 16-12.8 32-32 32H480c-19.2 0-32-12.8-32-32V512c0-16 12.8-32 32-32h32v-64h-64c-35.2 0-64 28.8-64 64v352c0 35.2 28.8 64 64 64h448c35.2 0 64-28.8 64-64V480c0-35.2-28.8-64-64-64z\"  ></path></symbol><symbol id=\"icon-textarea\" viewBox=\"0 0 1024 1024\"><path d=\"M64.60757333 814.92195555h885.46417778V209.07804445h-885.46417778v605.8439111zM18.00419555 162.47466667h978.67093334v699.05066666H18.00419555V162.47466667z m885.46417778 466.03377778l-139.81013333 139.81013333h139.81013333V628.50844445z m-752.64455111-291.27111112v233.01688889c0 13.98101333 9.32067555 23.30168889 23.30168889 23.30168889s23.30168889-9.32067555 23.30168889-23.30168889V337.23733333c0-13.98101333-9.32067555-23.30168889-23.30168889-23.30168888s-23.30168889 9.32067555-23.30168889 23.30168888z\"  ></path></symbol><symbol id=\"icon-clear\" viewBox=\"0 0 1024 1024\"><path d=\"M883.2 403.2l-147.2-44.8 57.6-224c0-6.4 0-19.2-6.4-25.6-6.4-6.4-12.8-12.8-19.2-12.8L627.2 57.6c-6.4 0-19.2 0-25.6 0C595.2 70.4 588.8 76.8 588.8 83.2L524.8 300.8 358.4 256c-6.4 0-19.2 0-25.6 0S320 275.2 320 281.6l-89.6 320C211.2 684.8 128 768 128 768c-6.4 6.4-12.8 19.2-6.4 32 0 12.8 12.8 19.2 25.6 25.6l524.8 140.8c0 0 6.4 0 6.4 0 6.4 0 19.2-6.4 25.6-12.8 6.4-6.4 83.2-89.6 115.2-179.2 32-83.2 89.6-326.4 89.6-332.8C908.8 422.4 896 409.6 883.2 403.2zM755.2 748.8c-25.6 57.6-70.4 115.2-89.6 147.2l-70.4-19.2c32-38.4 70.4-96 89.6-160 6.4-19.2-6.4-32-25.6-38.4-19.2-6.4-32 6.4-38.4 25.6-19.2 70.4-76.8 134.4-96 153.6l-57.6-12.8c32-38.4 70.4-96 83.2-153.6 6.4-19.2-6.4-32-25.6-38.4-19.2-6.4-32 6.4-38.4 25.6-19.2 64-70.4 128-89.6 153.6l-64-19.2c32-38.4 70.4-96 89.6-153.6 6.4-19.2-6.4-32-25.6-38.4C384 608 364.8 620.8 364.8 633.6c-19.2 64-70.4 128-96 153.6l-57.6-19.2c32-38.4 70.4-96 83.2-153.6l76.8-294.4 166.4 44.8c6.4 0 19.2 0 25.6 0C569.6 364.8 576 358.4 582.4 352L640 128l83.2 19.2-57.6 224c-6.4 19.2 6.4 32 19.2 38.4L832 454.4C819.2 524.8 780.8 691.2 755.2 748.8z\"  ></path><path d=\"M364.8 473.6C364.8 492.8 371.2 505.6 390.4 512l339.2 96c0 0 6.4 0 6.4 0 12.8 0 25.6-6.4 32-25.6 6.4-19.2-6.4-32-19.2-38.4L409.6 448C390.4 448 371.2 454.4 364.8 473.6z\"  ></path></symbol><symbol id=\"icon-table\" viewBox=\"0 0 1024 1024\"><path d=\"M928.229 784.149c0 44.024-36.02 80.044-80.044 80.044L175.815 864.193c-44.024 0-80.044-36.02-80.044-80.044L95.771 239.851c0-44.024 36.02-80.044 80.044-80.044l672.369 0c44.024 0 80.044 36.02 80.044 80.044L928.228 784.149zM351.912 303.886c0-9.005-7.004-16.009-16.009-16.009L175.815 287.877c-9.005 0-16.009 7.004-16.009 16.009l0 96.053c0 9.005 7.004 16.009 16.009 16.009l160.088 0c9.005 0 16.009-7.004 16.009-16.009L351.912 303.886zM351.912 495.991c0-9.005-7.004-16.009-16.009-16.009L175.815 479.982c-9.005 0-16.009 7.004-16.009 16.009l0 96.053c0 9.005 7.004 16.009 16.009 16.009l160.088 0c9.005 0 16.009-7.004 16.009-16.009L351.912 495.991zM351.912 688.097c0-9.005-7.004-16.009-16.009-16.009L175.815 672.088c-9.005 0-16.009 7.004-16.009 16.009l0 96.053c0 9.005 7.004 16.009 16.009 16.009l160.088 0c9.005 0 16.009-7.004 16.009-16.009L351.912 688.097zM608.053 303.886c0-9.005-7.004-16.009-16.009-16.009L431.956 287.877c-9.005 0-16.009 7.004-16.009 16.009l0 96.053c0 9.005 7.004 16.009 16.009 16.009l160.088 0c9.005 0 16.009-7.004 16.009-16.009L608.053 303.886zM608.053 495.991c0-9.005-7.004-16.009-16.009-16.009L431.956 479.982c-9.005 0-16.009 7.004-16.009 16.009l0 96.053c0 9.005 7.004 16.009 16.009 16.009l160.088 0c9.005 0 16.009-7.004 16.009-16.009L608.053 495.991zM608.053 688.097c0-9.005-7.004-16.009-16.009-16.009L431.956 672.088c-9.005 0-16.009 7.004-16.009 16.009l0 96.053c0 9.005 7.004 16.009 16.009 16.009l160.088 0c9.005 0 16.009-7.004 16.009-16.009L608.053 688.097zM864.193 303.886c0-9.005-7.004-16.009-16.009-16.009L688.097 287.877c-9.005 0-16.009 7.004-16.009 16.009l0 96.053c0 9.005 7.004 16.009 16.009 16.009l160.088 0c9.005 0 16.009-7.004 16.009-16.009L864.194 303.886zM864.193 495.991c0-9.005-7.004-16.009-16.009-16.009L688.097 479.982c-9.005 0-16.009 7.004-16.009 16.009l0 96.053c0 9.005 7.004 16.009 16.009 16.009l160.088 0c9.005 0 16.009-7.004 16.009-16.009L864.194 495.991zM864.193 688.097c0-9.005-7.004-16.009-16.009-16.009L688.097 672.088c-9.005 0-16.009 7.004-16.009 16.009l0 96.053c0 9.005 7.004 16.009 16.009 16.009l160.088 0c9.005 0 16.009-7.004 16.009-16.009L864.194 688.097z\"  ></path></symbol><symbol id=\"icon-depart\" viewBox=\"0 0 1024 1024\"><path d=\"M916.23451733 477.51649173L547.318336 477.51649173 547.318336 255.34498133 696.308 255.34498133 696.308 34.66668053 331.7635616 34.66668053 331.7635616 255.34498133 478.22732907 255.34498133 478.22732907 477.51649173 108.1573568 477.51649173 108.1573568 534.23985493 108.1573568 551.07119467 108.1573568 771.74949653 34.4369952 771.74949653 34.4369952 989.33331947 254.03822507 989.33331947 254.03822507 771.74949653 181.86461973 771.74949653 181.86461973 551.07119467 478.22732907 551.07119467 478.22732907 771.74949653 402.9722176 771.74949653 402.9722176 989.33331947 622.57344747 989.33331947 622.57344747 771.74949653 547.318336 771.74949653 547.318336 551.07119467 842.90712107 551.07119467 842.90712107 771.74949653 769.98797333 771.74949653 769.98797333 989.33331947 989.5619136 989.33331947 989.5619136 771.74949653 916.23451733 771.74949653Z\"  ></path></symbol></svg>',function(l){var c=(c=document.getElementsByTagName(\"script\"))[c.length-1],h=c.getAttribute(\"data-injectcss\"),c=c.getAttribute(\"data-disable-injectsvg\");if(!c){var a,o,t,z,i,v=function(c,h){h.parentNode.insertBefore(c,h)};if(h&&!l.__iconfont__svg__cssinject__){l.__iconfont__svg__cssinject__=!0;try{document.write(\"<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>\")}catch(c){console&&console.log(c)}}a=function(){var c,h=document.createElement(\"div\");h.innerHTML=l._iconfont_svg_string_3814468,(h=h.getElementsByTagName(\"svg\")[0])&&(h.setAttribute(\"aria-hidden\",\"true\"),h.style.position=\"absolute\",h.style.width=0,h.style.height=0,h.style.overflow=\"hidden\",h=h,(c=document.body).firstChild?v(h,c.firstChild):c.appendChild(h))},document.addEventListener?~[\"complete\",\"loaded\",\"interactive\"].indexOf(document.readyState)?setTimeout(a,0):(o=function(){document.removeEventListener(\"DOMContentLoaded\",o,!1),a()},document.addEventListener(\"DOMContentLoaded\",o,!1)):document.attachEvent&&(t=a,z=l.document,i=!1,m(),z.onreadystatechange=function(){\"complete\"==z.readyState&&(z.onreadystatechange=null,s())})}function s(){i||(i=!0,t())}function m(){try{z.documentElement.doScroll(\"left\")}catch(c){return void setTimeout(m,50)}s()}}(window);"
  },
  {
    "path": "jeecgboot-vue3/public/resource/tinymce/langs/en.js",
    "content": "tinymce.addI18n('es', {\n  Redo: 'Rehacer',\n  Undo: 'Deshacer',\n  Cut: 'Cortar',\n  Copy: 'Copiar',\n  Paste: 'Pegar',\n  'Select all': 'Seleccionar todo',\n  'New document': 'Nuevo documento',\n  Ok: 'Ok',\n  Cancel: 'Cancelar',\n  'Visual aids': 'Ayudas visuales',\n  Bold: 'Negrita',\n  Italic: 'Cursiva',\n  Underline: 'Subrayado',\n  Strikethrough: 'Tachado',\n  Superscript: 'Super\\u00edndice',\n  Subscript: 'Sub\\u00edndice',\n  'Clear formatting': 'Limpiar formato',\n  'Align left': 'Alinear a la izquierda',\n  'Align center': 'Alinear al centro',\n  'Align right': 'Alinear a la derecha',\n  Justify: 'Justificar',\n  'Bullet list': 'Lista de vi\\u00f1etas',\n  'Numbered list': 'Lista numerada',\n  'Decrease indent': 'Disminuir sangr\\u00eda',\n  'Increase indent': 'Incrementar sangr\\u00eda',\n  Close: 'Cerrar',\n  Formats: 'Formatos',\n  \"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\\/C\\/V keyboard shortcuts instead.\": 'Su navegador no es compatible con el acceso directo al portapapeles. Use las teclas Crtl+X\\/C\\/V de su teclado.',\n  Headers: 'Encabezados',\n  'Header 1': 'Encabezado 1',\n  'Header 2': 'Encabezado 2',\n  'Header 3': 'Encabezado 3',\n  'Header 4': 'Encabezado 4',\n  'Header 5': 'Encabezado 5',\n  'Header 6': 'Encabezado 6',\n  Headings: 'Encabezados',\n  'Heading 1': 'Encabezado 1',\n  'Heading 2': 'Encabezado 2',\n  'Heading 3': 'Encabezado 3',\n  'Heading 4': 'Encabezado 4',\n  'Heading 5': 'Encabezado 5',\n  'Heading 6': 'Encabezado 6',\n  Preformatted: 'Con formato previo',\n  Div: 'Div',\n  Pre: 'Pre',\n  Code: 'C\\u00f3digo',\n  Paragraph: 'P\\u00e1rrafo',\n  Blockquote: 'Blockquote',\n  Inline: 'Alineado',\n  Blocks: 'Bloques',\n  'Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.': 'Pegar est\\u00e1 ahora en modo de texto plano. El contenido se pegar\\u00e1 como texto plano hasta que desactive esta opci\\u00f3n.',\n  Fonts: 'Fuentes',\n  'Font Sizes': 'Tama\\u00f1os de fuente',\n  Class: 'Clase',\n  'Browse for an image': 'Buscar una imagen',\n  OR: 'OR',\n  'Drop an image here': 'Arrastre una imagen aqu\\u00ed',\n  Upload: 'Cargar',\n  Block: 'Bloque',\n  Align: 'Alinear',\n  Default: 'Por defecto',\n  Circle: 'C\\u00edrculo',\n  Disc: 'Disco',\n  Square: 'Cuadrado',\n  'Lower Alpha': 'Inferior Alfa',\n  'Lower Greek': 'Inferior Griega',\n  'Lower Roman': 'Inferior Romana',\n  'Upper Alpha': 'Superior Alfa',\n  'Upper Roman': 'Superior Romana',\n  'Anchor...': 'Anclaje...',\n  Name: 'Nombre',\n  Id: 'Id',\n  'Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.': 'Deber\\u00eda comenzar por una letra, seguida solo de letras, n\\u00fameros, guiones, puntos, dos puntos o guiones bajos.',\n  'You have unsaved changes are you sure you want to navigate away?': 'Tiene cambios sin guardar. \\u00bfEst\\u00e1 seguro de que quiere salir?',\n  'Restore last draft': 'Restaurar el \\u00faltimo borrador',\n  'Special character...': 'Car\\u00e1cter especial...',\n  'Source code': 'C\\u00f3digo fuente',\n  'Insert\\/Edit code sample': 'Insertar\\/editar c\\u00f3digo de prueba',\n  Language: 'Idioma',\n  'Code sample...': 'Ejemplo de c\\u00f3digo...',\n  'Color Picker': 'Selector de colores',\n  R: 'R',\n  G: 'V',\n  B: 'A',\n  'Left to right': 'De izquierda a derecha',\n  'Right to left': 'De derecha a izquierda',\n  'Emoticons...': 'Emoticones...',\n  'Metadata and Document Properties': 'Metadatos y propiedades del documento',\n  Title: 'T\\u00edtulo',\n  Keywords: 'Palabras clave',\n  Description: 'Descripci\\u00f3n',\n  Robots: 'Robots',\n  Author: 'Autor',\n  Encoding: 'Codificaci\\u00f3n',\n  Fullscreen: 'Pantalla completa',\n  Action: 'Acci\\u00f3n',\n  Shortcut: 'Atajo',\n  Help: 'Ayuda',\n  Address: 'Direcci\\u00f3n',\n  'Focus to menubar': 'Enfocar la barra del men\\u00fa',\n  'Focus to toolbar': 'Enfocar la barra de herramientas',\n  'Focus to element path': 'Enfocar la ruta del elemento',\n  'Focus to contextual toolbar': 'Enfocar la barra de herramientas contextual',\n  'Insert link (if link plugin activated)': 'Insertar enlace (si el complemento de enlace est\\u00e1 activado)',\n  'Save (if save plugin activated)': 'Guardar (si el componente de salvar est\\u00e1 activado)',\n  'Find (if searchreplace plugin activated)': 'Buscar (si el complemento buscar-remplazar est\\u00e1 activado)',\n  'Plugins installed ({0}):': 'Plugins instalados ({0}):',\n  'Premium plugins:': 'Complementos premium:',\n  'Learn more...': 'Aprende m\\u00e1s...',\n  'You are using {0}': 'Estas usando {0}',\n  Plugins: 'Complementos',\n  'Handy Shortcuts': 'Accesos directos',\n  'Horizontal line': 'L\\u00ednea horizontal',\n  'Insert\\/edit image': 'Insertar\\/editar imagen',\n  'Image description': 'Descripci\\u00f3n de la imagen',\n  Source: 'Enlace',\n  Dimensions: 'Dimensiones',\n  'Constrain proportions': 'Restringir proporciones',\n  General: 'General',\n  Advanced: 'Avanzado',\n  Style: 'Estilo',\n  'Vertical space': 'Espacio vertical',\n  'Horizontal space': 'Espacio horizontal',\n  Border: 'Borde',\n  'Insert image': 'Insertar imagen',\n  'Image...': 'Imagen...',\n  'Image list': 'Lista de im\\u00e1genes',\n  'Rotate counterclockwise': 'Girar a la izquierda',\n  'Rotate clockwise': 'Girar a la derecha',\n  'Flip vertically': 'Invertir verticalmente',\n  'Flip horizontally': 'Invertir horizontalmente',\n  'Edit image': 'Editar imagen',\n  'Image options': 'Opciones de imagen',\n  'Zoom in': 'Acercar',\n  'Zoom out': 'Alejar',\n  Crop: 'Recortar',\n  Resize: 'Redimensionar',\n  Orientation: 'Orientaci\\u00f3n',\n  Brightness: 'Brillo',\n  Sharpen: 'Forma',\n  Contrast: 'Contraste',\n  'Color levels': 'Niveles de color',\n  Gamma: 'Gamma',\n  Invert: 'Invertir',\n  Apply: 'Aplicar',\n  Back: 'Atr\\u00e1s',\n  'Insert date\\/time': 'Insertar fecha\\/hora',\n  'Date\\/time': 'Fecha\\/hora',\n  'Insert\\/Edit Link': 'Insertar\\/editar enlace',\n  'Insert\\/edit link': 'Insertar\\/editar enlace',\n  'Text to display': 'Texto para mostrar',\n  Url: 'URL',\n  'Open link in...': 'Abrir enlace en...',\n  'Current window': 'Ventana actual',\n  None: 'Ninguno',\n  'New window': 'Nueva ventana',\n  'Remove link': 'Quitar enlace',\n  Anchors: 'Anclas',\n  'Link...': 'Enlace...',\n  'Paste or type a link': 'Pega o introduce un enlace',\n  'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?': 'El enlace que has introducido no parece ser una direcci\\u00f3n de correo electr\\u00f3nico. Quieres a\\u00f1adir el prefijo necesario mailto: ?',\n  'The URL you entered seems to be an external link. Do you want to add the required http:\\/\\/ prefix?': 'El enlace que has introducido no parece ser una enlace externo. Quieres a\\u00f1adir el prefijo necesario http:\\/\\/ ?',\n  'Link list': 'Lista de enlaces',\n  'Insert video': 'Insertar video',\n  'Insert\\/edit video': 'Insertar\\/editar video',\n  'Insert\\/edit media': 'Insertar\\/editar medio',\n  'Alternative source': 'Enlace alternativo',\n  'Alternative source URL': 'Origen de URL alternativo',\n  'Media poster (Image URL)': 'P\\u00f3ster de medio (URL de imagen)',\n  'Paste your embed code below:': 'Pega tu c\\u00f3digo embebido debajo',\n  Embed: 'Incrustado',\n  'Media...': 'Medios...',\n  'Nonbreaking space': 'Espacio fijo',\n  'Page break': 'Salto de p\\u00e1gina',\n  'Paste as text': 'Pegar como texto',\n  Preview: 'Previsualizar',\n  'Print...': 'Imprimir...',\n  Save: 'Guardar',\n  Find: 'Buscar',\n  'Replace with': 'Reemplazar con',\n  Replace: 'Reemplazar',\n  'Replace all': 'Reemplazar todo',\n  Previous: 'Anterior',\n  Next: 'Siguiente',\n  'Find and replace...': 'Buscar y reemplazar...',\n  'Could not find the specified string.': 'No se encuentra la cadena de texto especificada',\n  'Match case': 'Coincidencia exacta',\n  'Find whole words only': 'Solo palabras completas',\n  'Spell check': 'Revisar ortograf\\u00eda',\n  Ignore: 'Ignorar',\n  'Ignore all': 'Ignorar todos',\n  Finish: 'Finalizar',\n  'Add to Dictionary': 'A\\u00f1adir al Diccionario',\n  'Insert table': 'Insertar tabla',\n  'Table properties': 'Propiedades de la tabla',\n  'Delete table': 'Eliminar tabla',\n  Cell: 'Celda',\n  Row: 'Fila',\n  Column: 'Columna',\n  'Cell properties': 'Propiedades de la celda',\n  'Merge cells': 'Combinar celdas',\n  'Split cell': 'Dividir celdas',\n  'Insert row before': 'Insertar fila antes',\n  'Insert row after': 'Insertar fila despu\\u00e9s ',\n  'Delete row': 'Eliminar fila',\n  'Row properties': 'Propiedades de la fila',\n  'Cut row': 'Cortar fila',\n  'Copy row': 'Copiar fila',\n  'Paste row before': 'Pegar la fila antes',\n  'Paste row after': 'Pegar la fila despu\\u00e9s',\n  'Insert column before': 'Insertar columna antes',\n  'Insert column after': 'Insertar columna despu\\u00e9s',\n  'Delete column': 'Eliminar columna',\n  Cols: 'Columnas',\n  Rows: 'Filas',\n  Width: 'Ancho',\n  Height: 'Alto',\n  'Cell spacing': 'Espacio entre celdas',\n  'Cell padding': 'Relleno de celda',\n  'Show caption': 'Mostrar t\\u00edtulo',\n  Left: 'Izquierda',\n  Center: 'Centrado',\n  Right: 'Derecha',\n  'Cell type': 'Tipo de celda',\n  Scope: '\\u00c1mbito',\n  Alignment: 'Alineaci\\u00f3n',\n  'H Align': 'Alineamiento Horizontal',\n  'V Align': 'Alineamiento Vertical',\n  Top: 'Arriba',\n  Middle: 'Centro',\n  Bottom: 'Abajo',\n  'Header cell': 'Celda de la cebecera',\n  'Row group': 'Grupo de filas',\n  'Column group': 'Grupo de columnas',\n  'Row type': 'Tipo de fila',\n  Header: 'Cabecera',\n  Body: 'Cuerpo',\n  Footer: 'Pie de p\\u00e1gina',\n  'Border color': 'Color del borde',\n  'Insert template...': 'Insertar plantilla...',\n  Templates: 'Plantillas',\n  Template: 'Plantilla',\n  'Text color': 'Color del texto',\n  'Background color': 'Color de fondo',\n  'Custom...': 'Personalizar...',\n  'Custom color': 'Color personalizado',\n  'No color': 'Sin color',\n  'Remove color': 'Quitar color',\n  'Table of Contents': 'Tabla de contenidos',\n  'Show blocks': 'Mostrar bloques',\n  'Show invisible characters': 'Mostrar caracteres invisibles',\n  'Word count': 'Contar palabras',\n  Count: 'Recuento',\n  Document: 'Documento',\n  Selection: 'Selecci\\u00f3n',\n  Words: 'Palabras',\n  'Words: {0}': 'Palabras: {0}',\n  '{0} words': '{0} palabras',\n  File: 'Archivo',\n  Edit: 'Editar',\n  Insert: 'Insertar',\n  View: 'Ver',\n  Format: 'Formato',\n  Table: 'Tabla',\n  Tools: 'Herramientas',\n  'Powered by {0}': 'Desarrollado por {0}',\n  'Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help': '\\u00c1rea de texto enriquecido. Pulse ALT-F9 para el menu. Pulse ALT-F10 para la barra de herramientas. Pulse ALT-0 para ayuda',\n  'Image title': 'Titulo de imagen',\n  'Border width': 'Ancho de borde',\n  'Border style': 'Estilo de borde',\n  Error: 'Error',\n  Warn: 'Advertencia',\n  Valid: 'V\\u00e1lido',\n  'To open the popup, press Shift+Enter': 'Para abrir el elemento emergente, pulse May\\u00fas+Intro',\n  'Rich Text Area. Press ALT-0 for help.': '\\u00c1rea de texto enriquecido. Pulse ALT-0 para abrir la ayuda.',\n  'System Font': 'Fuente de sistema',\n  'Failed to upload image: {0}': 'Fallo al cargar imagen: {0}',\n  'Failed to load plugin: {0} from url {1}': 'Fallo al cargar complemento: {0} desde URL {1}',\n  'Failed to load plugin url: {0}': 'Fallo al cargar URL del complemento: {0}',\n  'Failed to initialize plugin: {0}': 'Fallo al iniciar el complemento: {0}',\n  example: 'ejemplo',\n  Search: 'Buscar',\n  All: 'Todo',\n  Currency: 'Divisa',\n  Text: 'Texto',\n  Quotations: 'Comillas',\n  Mathematical: 'S\\u00edmbolo matem\\u00e1tico',\n  'Extended Latin': 'Latino extendido A',\n  Symbols: 'S\\u00edmbolos',\n  Arrows: 'Flechas',\n  'User Defined': 'Definido por el usuario',\n  'dollar sign': 'signo de d\\u00f3lar',\n  'currency sign': 'signo de divisa',\n  'euro-currency sign': 'signo de euro',\n  'colon sign': 'signo de dos puntos',\n  'cruzeiro sign': 'signo de cruceiro',\n  'french franc sign': 'signo de franco franc\\u00e9s',\n  'lira sign': 'signo de lira',\n  'mill sign': 'signo de mill',\n  'naira sign': 'signo de naira',\n  'peseta sign': 'signo de peseta',\n  'rupee sign': 'signo de rupia',\n  'won sign': 'signo de won',\n  'new sheqel sign': 'signo de nuevo s\\u00e9quel',\n  'dong sign': 'signo de dong',\n  'kip sign': 'signo de kip',\n  'tugrik sign': 'signo de tugrik',\n  'drachma sign': 'signo de dracma',\n  'german penny symbol': 'signo de penique alem\\u00e1n',\n  'peso sign': 'signo de peso',\n  'guarani sign': 'signo de guaran\\u00ed',\n  'austral sign': 'signo de austral',\n  'hryvnia sign': 'signo de grivna',\n  'cedi sign': 'signo de cedi',\n  'livre tournois sign': 'signo de libra tornesa',\n  'spesmilo sign': 'signo de spesmilo',\n  'tenge sign': 'signo de tenge',\n  'indian rupee sign': 'signo de rupia india',\n  'turkish lira sign': 'signo de lira turca',\n  'nordic mark sign': 'signo de marco n\\u00f3rdico',\n  'manat sign': 'signo de manat',\n  'ruble sign': 'signo de rublo',\n  'yen character': 'car\\u00e1cter de yen',\n  'yuan character': 'car\\u00e1cter de yuan',\n  'yuan character, in hong kong and taiwan': 'car\\u00e1cter de yuan en Hong Kong y Taiw\\u00e1n',\n  'yen\\/yuan character variant one': 'Variante uno de car\\u00e1cter de yen\\/yuan',\n  'Loading emoticons...': 'Cargando emoticonos...',\n  'Could not load emoticons': 'No se han podido cargar los emoticonos',\n  People: 'Personas',\n  'Animals and Nature': 'Animales y naturaleza',\n  'Food and Drink': 'Comida y bebida',\n  Activity: 'Actividad',\n  'Travel and Places': 'Viajes y lugares',\n  Objects: 'Objetos',\n  Flags: 'Banderas',\n  Characters: 'Caracteres',\n  'Characters (no spaces)': 'Caracteres (sin espacios)',\n  '{0} characters': '{0} caracteres',\n  'Error: Form submit field collision.': 'Error: Colisi\\u00f3n de campo al enviar formulario.',\n  'Error: No form element found.': 'Error: No se encuentra ning\\u00fan elemento de formulario.',\n  Update: 'Actualizar',\n  'Color swatch': 'Muestrario de colores',\n  Turquoise: 'Turquesa',\n  Green: 'Verde',\n  Blue: 'Azul',\n  Purple: 'P\\u00farpura',\n  'Navy Blue': 'Azul marino',\n  'Dark Turquoise': 'Turquesa oscuro',\n  'Dark Green': 'Verde oscuro',\n  'Medium Blue': 'Azul medio',\n  'Medium Purple': 'P\\u00farpura medio',\n  'Midnight Blue': 'Azul medio',\n  Yellow: 'Amarillo',\n  Orange: 'Naranja',\n  Red: 'Rojo',\n  'Light Gray': 'Gris claro',\n  Gray: 'Gris',\n  'Dark Yellow': 'Amarillo oscuro',\n  'Dark Orange': 'Naranja oscuro',\n  'Dark Red': 'Rojo oscuro',\n  'Medium Gray': 'Gris medio',\n  'Dark Gray': 'Gris oscuro',\n  'Light Green': 'Verde claro',\n  'Light Yellow': 'Amarillo claro',\n  'Light Red': 'Rojo claro',\n  'Light Purple': 'Morado claro',\n  'Light Blue': 'Azul claro',\n  'Dark Purple': 'Morado oscuro',\n  'Dark Blue': 'Azul oscuro',\n  Black: 'Negro',\n  White: 'Blanco',\n  'Switch to or from fullscreen mode': 'Activar o desactivar modo pantalla completa',\n  'Open help dialog': 'Abrir di\\u00e1logo de ayuda',\n  history: 'historial',\n  styles: 'estilos',\n  formatting: 'formato',\n  alignment: 'alineaci\\u00f3n',\n  indentation: 'sangr\\u00eda',\n  'permanent pen': 'bol\\u00edgrafo permanente',\n  comments: 'comentarios',\n  'Format Painter': 'Copiar formato',\n  'Insert\\/edit iframe': 'Insertar\\/editar iframe',\n  Capitalization: 'Uso de may\\u00fasculas',\n  lowercase: 'min\\u00fasculas',\n  UPPERCASE: 'MAY\\u00daSCULAS',\n  'Title Case': 'Tipo T\\u00edtulo',\n  'Permanent Pen Properties': 'Propiedades del bol\\u00edgrafo permanente',\n  'Permanent pen properties...': 'Propiedades del bol\\u00edgrafo permanente...',\n  Font: 'Fuente',\n  Size: 'Tama\\u00f1o',\n  'More...': 'M\\u00e1s...',\n  'Spellcheck Language': 'Corrector',\n  'Select...': 'Seleccionar...',\n  Preferences: 'Preferencias',\n  Yes: 'S\\u00ed',\n  No: 'No',\n  'Keyboard Navigation': 'Navegaci\\u00f3n con el teclado',\n  Version: 'Versi\\u00f3n',\n  Anchor: 'Ancla',\n  'Special character': 'Car\\u00e1cter especial',\n  'Code sample': 'Ejemplo de c\\u00f3digo',\n  Color: 'Color',\n  Emoticons: 'Emoticonos',\n  'Document properties': 'Propiedades del documento',\n  Image: 'Imagen',\n  'Insert link': 'Insertar enlace',\n  Target: 'Destino',\n  Link: 'Enlace',\n  Poster: 'Miniatura',\n  Media: 'Media',\n  Print: 'Imprimir',\n  Prev: 'Anterior',\n  'Find and replace': 'Buscar y reemplazar',\n  'Whole words': 'Palabras completas',\n  Spellcheck: 'Corrector ortogr\\u00e1fico',\n  Caption: 'Subt\\u00edtulo',\n  'Insert template': 'Insertar plantilla'\n})\n"
  },
  {
    "path": "jeecgboot-vue3/public/resource/tinymce/langs/zh_CN.js",
    "content": "tinymce.addI18n('zh_CN',{\n\"Redo\": \"\\u91cd\\u505a\",\n\"Undo\": \"\\u64a4\\u9500\",\n\"Cut\": \"\\u526a\\u5207\",\n\"Copy\": \"\\u590d\\u5236\",\n\"Paste\": \"\\u7c98\\u8d34\",\n\"Select all\": \"\\u5168\\u9009\",\n\"New document\": \"\\u65b0\\u6587\\u4ef6\",\n\"Ok\": \"\\u786e\\u5b9a\",\n\"Cancel\": \"\\u53d6\\u6d88\",\n\"Visual aids\": \"\\u7f51\\u683c\\u7ebf\",\n\"Bold\": \"\\u7c97\\u4f53\",\n\"Italic\": \"\\u659c\\u4f53\",\n\"Underline\": \"\\u4e0b\\u5212\\u7ebf\",\n\"Strikethrough\": \"\\u5220\\u9664\\u7ebf\",\n\"Superscript\": \"\\u4e0a\\u6807\",\n\"Subscript\": \"\\u4e0b\\u6807\",\n\"Clear formatting\": \"\\u6e05\\u9664\\u683c\\u5f0f\",\n\"Align left\": \"\\u5de6\\u8fb9\\u5bf9\\u9f50\",\n\"Align center\": \"\\u4e2d\\u95f4\\u5bf9\\u9f50\",\n\"Align right\": \"\\u53f3\\u8fb9\\u5bf9\\u9f50\",\n\"Justify\": \"\\u4e24\\u7aef\\u5bf9\\u9f50\",\n\"Bullet list\": \"\\u9879\\u76ee\\u7b26\\u53f7\",\n\"Numbered list\": \"\\u7f16\\u53f7\\u5217\\u8868\",\n\"Decrease indent\": \"\\u51cf\\u5c11\\u7f29\\u8fdb\",\n\"Increase indent\": \"\\u589e\\u52a0\\u7f29\\u8fdb\",\n\"Close\": \"\\u5173\\u95ed\",\n\"Formats\": \"\\u683c\\u5f0f\",\n\"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\\/C\\/V keyboard shortcuts instead.\": \"\\u4f60\\u7684\\u6d4f\\u89c8\\u5668\\u4e0d\\u652f\\u6301\\u6253\\u5f00\\u526a\\u8d34\\u677f\\uff0c\\u8bf7\\u4f7f\\u7528Ctrl+X\\/C\\/V\\u7b49\\u5feb\\u6377\\u952e\\u3002\",\n\"Headers\": \"\\u6807\\u9898\",\n\"Header 1\": \"\\u6807\\u98981\",\n\"Header 2\": \"\\u6807\\u98982\",\n\"Header 3\": \"\\u6807\\u98983\",\n\"Header 4\": \"\\u6807\\u98984\",\n\"Header 5\": \"\\u6807\\u98985\",\n\"Header 6\": \"\\u6807\\u98986\",\n\"Headings\": \"\\u6807\\u9898\",\n\"Heading 1\": \"\\u6807\\u98981\",\n\"Heading 2\": \"\\u6807\\u98982\",\n\"Heading 3\": \"\\u6807\\u98983\",\n\"Heading 4\": \"\\u6807\\u98984\",\n\"Heading 5\": \"\\u6807\\u98985\",\n\"Heading 6\": \"\\u6807\\u98986\",\n\"Preformatted\": \"\\u9884\\u5148\\u683c\\u5f0f\\u5316\\u7684\",\n\"Div\": \"Div\",\n\"Pre\": \"Pre\",\n\"Code\": \"\\u4ee3\\u7801\",\n\"Paragraph\": \"\\u6bb5\\u843d\",\n\"Blockquote\": \"\\u5f15\\u6587\\u533a\\u5757\",\n\"Inline\": \"\\u6587\\u672c\",\n\"Blocks\": \"\\u57fa\\u5757\",\n\"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.\": \"\\u5f53\\u524d\\u4e3a\\u7eaf\\u6587\\u672c\\u7c98\\u8d34\\u6a21\\u5f0f\\uff0c\\u518d\\u6b21\\u70b9\\u51fb\\u53ef\\u4ee5\\u56de\\u5230\\u666e\\u901a\\u7c98\\u8d34\\u6a21\\u5f0f\\u3002\",\n\"Fonts\": \"\\u5b57\\u4f53\",\n\"Font Sizes\": \"\\u5b57\\u53f7\",\n\"Class\": \"\\u7c7b\\u578b\",\n\"Browse for an image\": \"\\u6d4f\\u89c8\\u56fe\\u50cf\",\n\"OR\": \"\\u6216\",\n\"Drop an image here\": \"\\u62d6\\u653e\\u4e00\\u5f20\\u56fe\\u50cf\\u81f3\\u6b64\",\n\"Upload\": \"\\u4e0a\\u4f20\",\n\"Block\": \"\\u5757\",\n\"Align\": \"\\u5bf9\\u9f50\",\n\"Default\": \"\\u9ed8\\u8ba4\",\n\"Circle\": \"\\u7a7a\\u5fc3\\u5706\",\n\"Disc\": \"\\u5b9e\\u5fc3\\u5706\",\n\"Square\": \"\\u65b9\\u5757\",\n\"Lower Alpha\": \"\\u5c0f\\u5199\\u82f1\\u6587\\u5b57\\u6bcd\",\n\"Lower Greek\": \"\\u5c0f\\u5199\\u5e0c\\u814a\\u5b57\\u6bcd\",\n\"Lower Roman\": \"\\u5c0f\\u5199\\u7f57\\u9a6c\\u5b57\\u6bcd\",\n\"Upper Alpha\": \"\\u5927\\u5199\\u82f1\\u6587\\u5b57\\u6bcd\",\n\"Upper Roman\": \"\\u5927\\u5199\\u7f57\\u9a6c\\u5b57\\u6bcd\",\n\"Anchor...\": \"\\u951a\\u70b9...\",\n\"Name\": \"\\u540d\\u79f0\",\n\"Id\": \"\\u6807\\u8bc6\\u7b26\",\n\"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.\": \"\\u6807\\u8bc6\\u7b26\\u5e94\\u8be5\\u4ee5\\u5b57\\u6bcd\\u5f00\\u5934\\uff0c\\u540e\\u8ddf\\u5b57\\u6bcd\\u3001\\u6570\\u5b57\\u3001\\u7834\\u6298\\u53f7\\u3001\\u70b9\\u3001\\u5192\\u53f7\\u6216\\u4e0b\\u5212\\u7ebf\\u3002\",\n\"You have unsaved changes are you sure you want to navigate away?\": \"\\u4f60\\u8fd8\\u6709\\u6587\\u6863\\u5c1a\\u672a\\u4fdd\\u5b58\\uff0c\\u786e\\u5b9a\\u8981\\u79bb\\u5f00\\uff1f\",\n\"Restore last draft\": \"\\u6062\\u590d\\u4e0a\\u6b21\\u7684\\u8349\\u7a3f\",\n\"Special characters...\": \"\\u7279\\u6b8a\\u5b57\\u7b26...\",\n\"Source code\": \"\\u6e90\\u4ee3\\u7801\",\n\"Insert\\/Edit code sample\": \"\\u63d2\\u5165\\/\\u7f16\\u8f91\\u4ee3\\u7801\\u793a\\u4f8b\",\n\"Language\": \"\\u8bed\\u8a00\",\n\"Code sample...\": \"\\u793a\\u4f8b\\u4ee3\\u7801...\",\n\"Color Picker\": \"\\u9009\\u8272\\u5668\",\n\"R\": \"R\",\n\"G\": \"G\",\n\"B\": \"B\",\n\"Left to right\": \"\\u4ece\\u5de6\\u5230\\u53f3\",\n\"Right to left\": \"\\u4ece\\u53f3\\u5230\\u5de6\",\n\"Emoticons...\": \"\\u8868\\u60c5\\u7b26\\u53f7...\",\n\"Metadata and Document Properties\": \"\\u5143\\u6570\\u636e\\u548c\\u6587\\u6863\\u5c5e\\u6027\",\n\"Title\": \"\\u6807\\u9898\",\n\"Keywords\": \"\\u5173\\u952e\\u8bcd\",\n\"Description\": \"\\u63cf\\u8ff0\",\n\"Robots\": \"\\u673a\\u5668\\u4eba\",\n\"Author\": \"\\u4f5c\\u8005\",\n\"Encoding\": \"\\u7f16\\u7801\",\n\"Fullscreen\": \"\\u5168\\u5c4f\",\n\"Action\": \"\\u64cd\\u4f5c\",\n\"Shortcut\": \"\\u5feb\\u6377\\u952e\",\n\"Help\": \"\\u5e2e\\u52a9\",\n\"Address\": \"\\u5730\\u5740\",\n\"Focus to menubar\": \"\\u79fb\\u52a8\\u7126\\u70b9\\u5230\\u83dc\\u5355\\u680f\",\n\"Focus to toolbar\": \"\\u79fb\\u52a8\\u7126\\u70b9\\u5230\\u5de5\\u5177\\u680f\",\n\"Focus to element path\": \"\\u79fb\\u52a8\\u7126\\u70b9\\u5230\\u5143\\u7d20\\u8def\\u5f84\",\n\"Focus to contextual toolbar\": \"\\u79fb\\u52a8\\u7126\\u70b9\\u5230\\u4e0a\\u4e0b\\u6587\\u83dc\\u5355\",\n\"Insert link (if link plugin activated)\": \"\\u63d2\\u5165\\u94fe\\u63a5 (\\u5982\\u679c\\u94fe\\u63a5\\u63d2\\u4ef6\\u5df2\\u6fc0\\u6d3b)\",\n\"Save (if save plugin activated)\": \"\\u4fdd\\u5b58(\\u5982\\u679c\\u4fdd\\u5b58\\u63d2\\u4ef6\\u5df2\\u6fc0\\u6d3b)\",\n\"Find (if searchreplace plugin activated)\": \"\\u67e5\\u627e(\\u5982\\u679c\\u67e5\\u627e\\u66ff\\u6362\\u63d2\\u4ef6\\u5df2\\u6fc0\\u6d3b)\",\n\"Plugins installed ({0}):\": \"\\u5df2\\u5b89\\u88c5\\u63d2\\u4ef6 ({0}):\",\n\"Premium plugins:\": \"\\u4f18\\u79c0\\u63d2\\u4ef6\\uff1a\",\n\"Learn more...\": \"\\u4e86\\u89e3\\u66f4\\u591a...\",\n\"You are using {0}\": \"\\u4f60\\u6b63\\u5728\\u4f7f\\u7528 {0}\",\n\"Plugins\": \"\\u63d2\\u4ef6\",\n\"Handy Shortcuts\": \"\\u5feb\\u6377\\u952e\",\n\"Horizontal line\": \"\\u6c34\\u5e73\\u5206\\u5272\\u7ebf\",\n\"Insert\\/edit image\": \"\\u63d2\\u5165\\/\\u7f16\\u8f91\\u56fe\\u7247\",\n\"Image description\": \"\\u56fe\\u7247\\u63cf\\u8ff0\",\n\"Source\": \"\\u5730\\u5740\",\n\"Dimensions\": \"\\u5927\\u5c0f\",\n\"Constrain proportions\": \"\\u4fdd\\u6301\\u7eb5\\u6a2a\\u6bd4\",\n\"General\": \"\\u666e\\u901a\",\n\"Advanced\": \"\\u9ad8\\u7ea7\",\n\"Style\": \"\\u6837\\u5f0f\",\n\"Vertical space\": \"\\u5782\\u76f4\\u8fb9\\u8ddd\",\n\"Horizontal space\": \"\\u6c34\\u5e73\\u8fb9\\u8ddd\",\n\"Border\": \"\\u8fb9\\u6846\",\n\"Insert image\": \"\\u63d2\\u5165\\u56fe\\u7247\",\n\"Image...\": \"\\u56fe\\u7247...\",\n\"Image list\": \"\\u56fe\\u7247\\u5217\\u8868\",\n\"Rotate counterclockwise\": \"\\u9006\\u65f6\\u9488\\u65cb\\u8f6c\",\n\"Rotate clockwise\": \"\\u987a\\u65f6\\u9488\\u65cb\\u8f6c\",\n\"Flip vertically\": \"\\u5782\\u76f4\\u7ffb\\u8f6c\",\n\"Flip horizontally\": \"\\u6c34\\u5e73\\u7ffb\\u8f6c\",\n\"Edit image\": \"\\u7f16\\u8f91\\u56fe\\u7247\",\n\"Image options\": \"\\u56fe\\u7247\\u9009\\u9879\",\n\"Zoom in\": \"\\u653e\\u5927\",\n\"Zoom out\": \"\\u7f29\\u5c0f\",\n\"Crop\": \"\\u88c1\\u526a\",\n\"Resize\": \"\\u8c03\\u6574\\u5927\\u5c0f\",\n\"Orientation\": \"\\u65b9\\u5411\",\n\"Brightness\": \"\\u4eae\\u5ea6\",\n\"Sharpen\": \"\\u9510\\u5316\",\n\"Contrast\": \"\\u5bf9\\u6bd4\\u5ea6\",\n\"Color levels\": \"\\u989c\\u8272\\u5c42\\u6b21\",\n\"Gamma\": \"\\u4f3d\\u9a6c\\u503c\",\n\"Invert\": \"\\u53cd\\u8f6c\",\n\"Apply\": \"\\u5e94\\u7528\",\n\"Back\": \"\\u540e\\u9000\",\n\"Insert date\\/time\": \"\\u63d2\\u5165\\u65e5\\u671f\\/\\u65f6\\u95f4\",\n\"Date\\/time\": \"\\u65e5\\u671f\\/\\u65f6\\u95f4\",\n\"Insert\\/Edit Link\": \"\\u63d2\\u5165\\/\\u7f16\\u8f91\\u94fe\\u63a5\",\n\"Insert\\/edit link\": \"\\u63d2\\u5165\\/\\u7f16\\u8f91\\u94fe\\u63a5\",\n\"Text to display\": \"\\u663e\\u793a\\u6587\\u5b57\",\n\"Url\": \"\\u5730\\u5740\",\n\"Open link in...\": \"\\u94fe\\u63a5\\u6253\\u5f00\\u4f4d\\u7f6e...\",\n\"Current window\": \"\\u5f53\\u524d\\u7a97\\u53e3\",\n\"None\": \"\\u65e0\",\n\"New window\": \"\\u5728\\u65b0\\u7a97\\u53e3\\u6253\\u5f00\",\n\"Remove link\": \"\\u5220\\u9664\\u94fe\\u63a5\",\n\"Anchors\": \"\\u951a\\u70b9\",\n\"Link...\": \"\\u94fe\\u63a5...\",\n\"Paste or type a link\": \"\\u7c98\\u8d34\\u6216\\u8f93\\u5165\\u94fe\\u63a5\",\n\"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?\": \"\\u4f60\\u6240\\u586b\\u5199\\u7684URL\\u5730\\u5740\\u4e3a\\u90ae\\u4ef6\\u5730\\u5740\\uff0c\\u9700\\u8981\\u52a0\\u4e0amailto:\\u524d\\u7f00\\u5417\\uff1f\",\n\"The URL you entered seems to be an external link. Do you want to add the required http:\\/\\/ prefix?\": \"\\u4f60\\u6240\\u586b\\u5199\\u7684URL\\u5730\\u5740\\u5c5e\\u4e8e\\u5916\\u90e8\\u94fe\\u63a5\\uff0c\\u9700\\u8981\\u52a0\\u4e0ahttp:\\/\\/:\\u524d\\u7f00\\u5417\\uff1f\",\n\"Link list\": \"\\u94fe\\u63a5\\u5217\\u8868\",\n\"Insert video\": \"\\u63d2\\u5165\\u89c6\\u9891\",\n\"Insert\\/edit video\": \"\\u63d2\\u5165\\/\\u7f16\\u8f91\\u89c6\\u9891\",\n\"Insert\\/edit media\": \"\\u63d2\\u5165\\/\\u7f16\\u8f91\\u5a92\\u4f53\",\n\"Alternative source\": \"\\u955c\\u50cf\",\n\"Alternative source URL\": \"\\u66ff\\u4ee3\\u6765\\u6e90\\u7f51\\u5740\",\n\"Media poster (Image URL)\": \"\\u5c01\\u9762(\\u56fe\\u7247\\u5730\\u5740)\",\n\"Paste your embed code below:\": \"\\u5c06\\u5185\\u5d4c\\u4ee3\\u7801\\u7c98\\u8d34\\u5728\\u4e0b\\u9762:\",\n\"Embed\": \"\\u5185\\u5d4c\",\n\"Media...\": \"\\u591a\\u5a92\\u4f53...\",\n\"Nonbreaking space\": \"\\u4e0d\\u95f4\\u65ad\\u7a7a\\u683c\",\n\"Page break\": \"\\u5206\\u9875\\u7b26\",\n\"Paste as text\": \"\\u7c98\\u8d34\\u4e3a\\u6587\\u672c\",\n\"Preview\": \"\\u9884\\u89c8\",\n\"Print...\": \"\\u6253\\u5370...\",\n\"Save\": \"\\u4fdd\\u5b58\",\n\"Find\": \"\\u67e5\\u627e\",\n\"Replace with\": \"\\u66ff\\u6362\\u4e3a\",\n\"Replace\": \"\\u66ff\\u6362\",\n\"Replace all\": \"\\u5168\\u90e8\\u66ff\\u6362\",\n\"Previous\": \"\\u4e0a\\u4e00\\u4e2a\",\n\"Next\": \"\\u4e0b\\u4e00\\u4e2a\",\n\"Find and replace...\": \"\\u67e5\\u627e\\u5e76\\u66ff\\u6362...\",\n\"Could not find the specified string.\": \"\\u672a\\u627e\\u5230\\u641c\\u7d22\\u5185\\u5bb9.\",\n\"Match case\": \"\\u533a\\u5206\\u5927\\u5c0f\\u5199\",\n\"Find whole words only\": \"\\u5168\\u5b57\\u5339\\u914d\",\n\"Spell check\": \"\\u62fc\\u5199\\u68c0\\u67e5\",\n\"Ignore\": \"\\u5ffd\\u7565\",\n\"Ignore all\": \"\\u5168\\u90e8\\u5ffd\\u7565\",\n\"Finish\": \"\\u5b8c\\u6210\",\n\"Add to Dictionary\": \"\\u6dfb\\u52a0\\u5230\\u5b57\\u5178\",\n\"Insert table\": \"\\u63d2\\u5165\\u8868\\u683c\",\n\"Table properties\": \"\\u8868\\u683c\\u5c5e\\u6027\",\n\"Delete table\": \"\\u5220\\u9664\\u8868\\u683c\",\n\"Cell\": \"\\u5355\\u5143\\u683c\",\n\"Row\": \"\\u884c\",\n\"Column\": \"\\u5217\",\n\"Cell properties\": \"\\u5355\\u5143\\u683c\\u5c5e\\u6027\",\n\"Merge cells\": \"\\u5408\\u5e76\\u5355\\u5143\\u683c\",\n\"Split cell\": \"\\u62c6\\u5206\\u5355\\u5143\\u683c\",\n\"Insert row before\": \"\\u5728\\u4e0a\\u65b9\\u63d2\\u5165\",\n\"Insert row after\": \"\\u5728\\u4e0b\\u65b9\\u63d2\\u5165\",\n\"Delete row\": \"\\u5220\\u9664\\u884c\",\n\"Row properties\": \"\\u884c\\u5c5e\\u6027\",\n\"Cut row\": \"\\u526a\\u5207\\u884c\",\n\"Copy row\": \"\\u590d\\u5236\\u884c\",\n\"Paste row before\": \"\\u7c98\\u8d34\\u5230\\u4e0a\\u65b9\",\n\"Paste row after\": \"\\u7c98\\u8d34\\u5230\\u4e0b\\u65b9\",\n\"Insert column before\": \"\\u5728\\u5de6\\u4fa7\\u63d2\\u5165\",\n\"Insert column after\": \"\\u5728\\u53f3\\u4fa7\\u63d2\\u5165\",\n\"Delete column\": \"\\u5220\\u9664\\u5217\",\n\"Cols\": \"\\u5217\",\n\"Rows\": \"\\u884c\",\n\"Width\": \"\\u5bbd\",\n\"Height\": \"\\u9ad8\",\n\"Cell spacing\": \"\\u5355\\u5143\\u683c\\u5916\\u95f4\\u8ddd\",\n\"Cell padding\": \"\\u5355\\u5143\\u683c\\u5185\\u8fb9\\u8ddd\",\n\"Show caption\": \"\\u663e\\u793a\\u6807\\u9898\",\n\"Left\": \"\\u5de6\\u5bf9\\u9f50\",\n\"Center\": \"\\u5c45\\u4e2d\",\n\"Right\": \"\\u53f3\\u5bf9\\u9f50\",\n\"Cell type\": \"\\u5355\\u5143\\u683c\\u7c7b\\u578b\",\n\"Scope\": \"\\u8303\\u56f4\",\n\"Alignment\": \"\\u5bf9\\u9f50\\u65b9\\u5f0f\",\n\"H Align\": \"\\u6c34\\u5e73\\u5bf9\\u9f50\",\n\"V Align\": \"\\u5782\\u76f4\\u5bf9\\u9f50\",\n\"Top\": \"\\u9876\\u90e8\\u5bf9\\u9f50\",\n\"Middle\": \"\\u5782\\u76f4\\u5c45\\u4e2d\",\n\"Bottom\": \"\\u5e95\\u90e8\\u5bf9\\u9f50\",\n\"Header cell\": \"\\u8868\\u5934\\u5355\\u5143\\u683c\",\n\"Row group\": \"\\u884c\\u7ec4\",\n\"Column group\": \"\\u5217\\u7ec4\",\n\"Row type\": \"\\u884c\\u7c7b\\u578b\",\n\"Header\": \"\\u8868\\u5934\",\n\"Body\": \"\\u8868\\u4f53\",\n\"Footer\": \"\\u8868\\u5c3e\",\n\"Border color\": \"\\u8fb9\\u6846\\u989c\\u8272\",\n\"Insert template...\": \"\\u63d2\\u5165\\u6a21\\u677f...\",\n\"Templates\": \"\\u6a21\\u677f\",\n\"Template\": \"\\u6a21\\u677f\",\n\"Text color\": \"\\u6587\\u5b57\\u989c\\u8272\",\n\"Background color\": \"\\u80cc\\u666f\\u8272\",\n\"Custom...\": \"\\u81ea\\u5b9a\\u4e49...\",\n\"Custom color\": \"\\u81ea\\u5b9a\\u4e49\\u989c\\u8272\",\n\"No color\": \"\\u65e0\",\n\"Remove color\": \"\\u79fb\\u9664\\u989c\\u8272\",\n\"Table of Contents\": \"\\u5185\\u5bb9\\u5217\\u8868\",\n\"Show blocks\": \"\\u663e\\u793a\\u533a\\u5757\\u8fb9\\u6846\",\n\"Show invisible characters\": \"\\u663e\\u793a\\u4e0d\\u53ef\\u89c1\\u5b57\\u7b26\",\n\"Word count\": \"\\u5b57\\u6570\",\n\"Words: {0}\": \"\\u5b57\\u6570\\uff1a{0}\",\n\"{0} words\": \"{0} \\u5b57\",\n\"File\": \"\\u6587\\u4ef6\",\n\"Edit\": \"\\u7f16\\u8f91\",\n\"Insert\": \"\\u63d2\\u5165\",\n\"View\": \"\\u89c6\\u56fe\",\n\"Format\": \"\\u683c\\u5f0f\",\n\"Table\": \"\\u8868\\u683c\",\n\"Tools\": \"\\u5de5\\u5177\",\n\"Powered by {0}\": \"\\u7531{0}\\u9a71\\u52a8\",\n\"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help\": \"\\u5728\\u7f16\\u8f91\\u533a\\u6309ALT-F9\\u6253\\u5f00\\u83dc\\u5355\\uff0c\\u6309ALT-F10\\u6253\\u5f00\\u5de5\\u5177\\u680f\\uff0c\\u6309ALT-0\\u67e5\\u770b\\u5e2e\\u52a9\",\n\"Image title\": \"\\u56fe\\u7247\\u6807\\u9898\",\n\"Border width\": \"\\u8fb9\\u6846\\u5bbd\\u5ea6\",\n\"Border style\": \"\\u8fb9\\u6846\\u6837\\u5f0f\",\n\"Error\": \"\\u9519\\u8bef\",\n\"Warn\": \"\\u8b66\\u544a\",\n\"Valid\": \"\\u6709\\u6548\",\n\"To open the popup, press Shift+Enter\": \"\\u6309Shitf+Enter\\u952e\\u6253\\u5f00\\u5bf9\\u8bdd\\u6846\",\n\"Rich Text Area. Press ALT-0 for help.\": \"\\u7f16\\u8f91\\u533a\\u3002\\u6309Alt+0\\u952e\\u6253\\u5f00\\u5e2e\\u52a9\\u3002\",\n\"System Font\": \"\\u7cfb\\u7edf\\u5b57\\u4f53\",\n\"Failed to upload image: {0}\": \"\\u56fe\\u7247\\u4e0a\\u4f20\\u5931\\u8d25: {0}\",\n\"Failed to load plugin: {0} from url {1}\": \"\\u63d2\\u4ef6\\u52a0\\u8f7d\\u5931\\u8d25: {0} \\u6765\\u81ea\\u94fe\\u63a5 {1}\",\n\"Failed to load plugin url: {0}\": \"\\u63d2\\u4ef6\\u52a0\\u8f7d\\u5931\\u8d25 \\u94fe\\u63a5: {0}\",\n\"Failed to initialize plugin: {0}\": \"\\u63d2\\u4ef6\\u521d\\u59cb\\u5316\\u5931\\u8d25: {0}\",\n\"example\": \"\\u793a\\u4f8b\",\n\"Search\": \"\\u641c\\u7d22\",\n\"All\": \"\\u5168\\u90e8\",\n\"Currency\": \"\\u8d27\\u5e01\",\n\"Text\": \"\\u6587\\u5b57\",\n\"Quotations\": \"\\u5f15\\u7528\",\n\"Mathematical\": \"\\u6570\\u5b66\",\n\"Extended Latin\": \"\\u62c9\\u4e01\\u8bed\\u6269\\u5145\",\n\"Symbols\": \"\\u7b26\\u53f7\",\n\"Arrows\": \"\\u7bad\\u5934\",\n\"User Defined\": \"\\u81ea\\u5b9a\\u4e49\",\n\"dollar sign\": \"\\u7f8e\\u5143\\u7b26\\u53f7\",\n\"currency sign\": \"\\u8d27\\u5e01\\u7b26\\u53f7\",\n\"euro-currency sign\": \"\\u6b27\\u5143\\u7b26\\u53f7\",\n\"colon sign\": \"\\u5192\\u53f7\",\n\"cruzeiro sign\": \"\\u514b\\u9c81\\u8d5b\\u7f57\\u5e01\\u7b26\\u53f7\",\n\"french franc sign\": \"\\u6cd5\\u90ce\\u7b26\\u53f7\",\n\"lira sign\": \"\\u91cc\\u62c9\\u7b26\\u53f7\",\n\"mill sign\": \"\\u5bc6\\u5c14\\u7b26\\u53f7\",\n\"naira sign\": \"\\u5948\\u62c9\\u7b26\\u53f7\",\n\"peseta sign\": \"\\u6bd4\\u585e\\u5854\\u7b26\\u53f7\",\n\"rupee sign\": \"\\u5362\\u6bd4\\u7b26\\u53f7\",\n\"won sign\": \"\\u97e9\\u5143\\u7b26\\u53f7\",\n\"new sheqel sign\": \"\\u65b0\\u8c22\\u514b\\u5c14\\u7b26\\u53f7\",\n\"dong sign\": \"\\u8d8a\\u5357\\u76fe\\u7b26\\u53f7\",\n\"kip sign\": \"\\u8001\\u631d\\u57fa\\u666e\\u7b26\\u53f7\",\n\"tugrik sign\": \"\\u56fe\\u683c\\u91cc\\u514b\\u7b26\\u53f7\",\n\"drachma sign\": \"\\u5fb7\\u62c9\\u514b\\u9a6c\\u7b26\\u53f7\",\n\"german penny symbol\": \"\\u5fb7\\u56fd\\u4fbf\\u58eb\\u7b26\\u53f7\",\n\"peso sign\": \"\\u6bd4\\u7d22\\u7b26\\u53f7\",\n\"guarani sign\": \"\\u74dc\\u62c9\\u5c3c\\u7b26\\u53f7\",\n\"austral sign\": \"\\u6fb3\\u5143\\u7b26\\u53f7\",\n\"hryvnia sign\": \"\\u683c\\u91cc\\u592b\\u5c3c\\u4e9a\\u7b26\\u53f7\",\n\"cedi sign\": \"\\u585e\\u5730\\u7b26\\u53f7\",\n\"livre tournois sign\": \"\\u91cc\\u5f17\\u5f17\\u5c14\\u7b26\\u53f7\",\n\"spesmilo sign\": \"spesmilo\\u7b26\\u53f7\",\n\"tenge sign\": \"\\u575a\\u6208\\u7b26\\u53f7\",\n\"indian rupee sign\": \"\\u5370\\u5ea6\\u5362\\u6bd4\",\n\"turkish lira sign\": \"\\u571f\\u8033\\u5176\\u91cc\\u62c9\",\n\"nordic mark sign\": \"\\u5317\\u6b27\\u9a6c\\u514b\",\n\"manat sign\": \"\\u9a6c\\u7eb3\\u7279\\u7b26\\u53f7\",\n\"ruble sign\": \"\\u5362\\u5e03\\u7b26\\u53f7\",\n\"yen character\": \"\\u65e5\\u5143\\u5b57\\u6837\",\n\"yuan character\": \"\\u4eba\\u6c11\\u5e01\\u5143\\u5b57\\u6837\",\n\"yuan character, in hong kong and taiwan\": \"\\u5143\\u5b57\\u6837\\uff08\\u6e2f\\u53f0\\u5730\\u533a\\uff09\",\n\"yen\\/yuan character variant one\": \"\\u5143\\u5b57\\u6837\\uff08\\u5927\\u5199\\uff09\",\n\"Loading emoticons...\": \"\\u52a0\\u8f7d\\u8868\\u60c5\\u7b26\\u53f7...\",\n\"Could not load emoticons\": \"\\u4e0d\\u80fd\\u52a0\\u8f7d\\u8868\\u60c5\\u7b26\\u53f7\",\n\"People\": \"\\u4eba\\u7c7b\",\n\"Animals and Nature\": \"\\u52a8\\u7269\\u548c\\u81ea\\u7136\",\n\"Food and Drink\": \"\\u98df\\u7269\\u548c\\u996e\\u54c1\",\n\"Activity\": \"\\u6d3b\\u52a8\",\n\"Travel and Places\": \"\\u65c5\\u6e38\\u548c\\u5730\\u70b9\",\n\"Objects\": \"\\u7269\\u4ef6\",\n\"Flags\": \"\\u65d7\\u5e1c\",\n\"Characters\": \"\\u5b57\\u7b26\",\n\"Characters (no spaces)\": \"\\u5b57\\u7b26(\\u65e0\\u7a7a\\u683c)\",\n\"Error: Form submit field collision.\": \"\\u9519\\u8bef: \\u8868\\u5355\\u63d0\\u4ea4\\u5b57\\u6bb5\\u51b2\\u7a81\\u3002\",\n\"Error: No form element found.\": \"\\u9519\\u8bef: \\u6ca1\\u6709\\u8868\\u5355\\u63a7\\u4ef6\\u3002\",\n\"Update\": \"\\u66f4\\u65b0\",\n\"Color swatch\": \"\\u989c\\u8272\\u6837\\u672c\",\n\"Turquoise\": \"\\u9752\\u7eff\\u8272\",\n\"Green\": \"\\u7eff\\u8272\",\n\"Blue\": \"\\u84dd\\u8272\",\n\"Purple\": \"\\u7d2b\\u8272\",\n\"Navy Blue\": \"\\u6d77\\u519b\\u84dd\",\n\"Dark Turquoise\": \"\\u6df1\\u84dd\\u7eff\\u8272\",\n\"Dark Green\": \"\\u6df1\\u7eff\\u8272\",\n\"Medium Blue\": \"\\u4e2d\\u84dd\\u8272\",\n\"Medium Purple\": \"\\u4e2d\\u7d2b\\u8272\",\n\"Midnight Blue\": \"\\u6df1\\u84dd\\u8272\",\n\"Yellow\": \"\\u9ec4\\u8272\",\n\"Orange\": \"\\u6a59\\u8272\",\n\"Red\": \"\\u7ea2\\u8272\",\n\"Light Gray\": \"\\u6d45\\u7070\\u8272\",\n\"Gray\": \"\\u7070\\u8272\",\n\"Dark Yellow\": \"\\u6697\\u9ec4\\u8272\",\n\"Dark Orange\": \"\\u6df1\\u6a59\\u8272\",\n\"Dark Red\": \"\\u6df1\\u7ea2\\u8272\",\n\"Medium Gray\": \"\\u4e2d\\u7070\\u8272\",\n\"Dark Gray\": \"\\u6df1\\u7070\\u8272\",\n\"Black\": \"\\u9ed1\\u8272\",\n\"White\": \"\\u767d\\u8272\",\n\"Switch to or from fullscreen mode\": \"\\u5207\\u6362\\u5168\\u5c4f\\u6a21\\u5f0f\",\n\"Open help dialog\": \"\\u6253\\u5f00\\u5e2e\\u52a9\\u5bf9\\u8bdd\\u6846\",\n\"history\": \"\\u5386\\u53f2\",\n\"styles\": \"\\u6837\\u5f0f\",\n\"formatting\": \"\\u683c\\u5f0f\\u5316\",\n\"alignment\": \"\\u5bf9\\u9f50\",\n\"indentation\": \"\\u7f29\\u8fdb\",\n\"permanent pen\": \"\\u8bb0\\u53f7\\u7b14\",\n\"comments\": \"\\u5907\\u6ce8\",\n\"Anchor\": \"\\u951a\\u70b9\",\n\"Special character\": \"\\u7279\\u6b8a\\u7b26\\u53f7\",\n\"Code sample\": \"\\u4ee3\\u7801\\u793a\\u4f8b\",\n\"Color\": \"\\u989c\\u8272\",\n\"Emoticons\": \"\\u8868\\u60c5\",\n\"Document properties\": \"\\u6587\\u6863\\u5c5e\\u6027\",\n\"Image\": \"\\u56fe\\u7247\",\n\"Insert link\": \"\\u63d2\\u5165\\u94fe\\u63a5\",\n\"Target\": \"\\u6253\\u5f00\\u65b9\\u5f0f\",\n\"Link\": \"\\u94fe\\u63a5\",\n\"Poster\": \"\\u5c01\\u9762\",\n\"Media\": \"\\u5a92\\u4f53\",\n\"Print\": \"\\u6253\\u5370\",\n\"Prev\": \"\\u4e0a\\u4e00\\u4e2a\",\n\"Find and replace\": \"\\u67e5\\u627e\\u548c\\u66ff\\u6362\",\n\"Whole words\": \"\\u5168\\u5b57\\u5339\\u914d\",\n\"Spellcheck\": \"\\u62fc\\u5199\\u68c0\\u67e5\",\n\"Caption\": \"\\u6807\\u9898\",\n\"Insert template\": \"\\u63d2\\u5165\\u6a21\\u677f\"\n});"
  },
  {
    "path": "jeecgboot-vue3/public/resource/tinymce/skins/ui/jeecg/content.css",
    "content": "/**\n* Copyright (c) Tiny Technologies, Inc. All rights reserved.\n* Licensed under the LGPL or a commercial license.\n* For LGPL see License.txt in the project root for license information.\n* For commercial licenses see https://www.tiny.cloud/\n*/\n.mce-content-body .mce-item-anchor {\n  background: transparent url(\"data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A\") no-repeat center;\n  cursor: default;\n  display: inline-block;\n  height: 12px !important;\n  padding: 0 2px;\n  -webkit-user-modify: read-only;\n  -moz-user-modify: read-only;\n  -webkit-user-select: all;\n  -ms-user-select: all;\n      user-select: all;\n  width: 8px !important;\n}\n.mce-content-body .mce-item-anchor[data-mce-selected] {\n  outline-offset: 1px;\n}\n.tox-comments-visible .tox-comment {\n  background-color: #fff0b7;\n}\n.tox-comments-visible .tox-comment--active {\n  background-color: #ffe168;\n}\n.tox-checklist > li:not(.tox-checklist--hidden) {\n  list-style: none;\n  margin: 0.25em 0;\n}\n.tox-checklist > li:not(.tox-checklist--hidden)::before {\n  content: url(\"data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A\");\n  cursor: pointer;\n  height: 1em;\n  margin-left: -1.5em;\n  margin-top: 0.125em;\n  position: absolute;\n  width: 1em;\n}\n.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before {\n  content: url(\"data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A\");\n}\n[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before {\n  margin-left: 0;\n  margin-right: -1.5em;\n}\n/* stylelint-disable */\n/* http://prismjs.com/ */\n/**\n * prism.js default theme for JavaScript, CSS and HTML\n * Based on dabblet (http://dabblet.com)\n * @author Lea Verou\n */\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n  color: black;\n  background: none;\n  text-shadow: 0 1px white;\n  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n  font-size: 1em;\n  text-align: left;\n  white-space: pre;\n  word-spacing: normal;\n  word-break: normal;\n  word-wrap: normal;\n  line-height: 1.5;\n  -moz-tab-size: 4;\n  tab-size: 4;\n  -webkit-hyphens: none;\n  -ms-hyphens: none;\n  hyphens: none;\n}\npre[class*=\"language-\"]::selection,\npre[class*=\"language-\"] ::selection,\ncode[class*=\"language-\"]::selection,\ncode[class*=\"language-\"] ::selection {\n  text-shadow: none;\n  background: #b3d4fc;\n}\n@media print {\n  code[class*=\"language-\"],\n  pre[class*=\"language-\"] {\n    text-shadow: none;\n  }\n}\n/* Code blocks */\npre[class*=\"language-\"] {\n  padding: 1em;\n  margin: 0.5em 0;\n  overflow: auto;\n}\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n  background: #f5f2f0;\n}\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n  padding: 0.1em;\n  border-radius: 0.3em;\n  white-space: normal;\n}\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n  color: slategray;\n}\n.token.punctuation {\n  color: #999;\n}\n.namespace {\n  opacity: 0.7;\n}\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.constant,\n.token.symbol,\n.token.deleted {\n  color: #905;\n}\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.inserted {\n  color: #690;\n}\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string {\n  color: #9a6e3a;\n  background: hsla(0, 0%, 100%, 0.5);\n}\n.token.atrule,\n.token.attr-value,\n.token.keyword {\n  color: #07a;\n}\n.token.function,\n.token.class-name {\n  color: #DD4A68;\n}\n.token.regex,\n.token.important,\n.token.variable {\n  color: #e90;\n}\n.token.important,\n.token.bold {\n  font-weight: bold;\n}\n.token.italic {\n  font-style: italic;\n}\n.token.entity {\n  cursor: help;\n}\n/* stylelint-enable */\n.mce-content-body {\n  overflow-wrap: break-word;\n  word-wrap: break-word;\n}\n.mce-content-body .mce-visual-caret {\n  background-color: black;\n  background-color: currentColor;\n  position: absolute;\n}\n.mce-content-body .mce-visual-caret-hidden {\n  display: none;\n}\n.mce-content-body *[data-mce-caret] {\n  left: -1000px;\n  margin: 0;\n  padding: 0;\n  position: absolute;\n  right: auto;\n  top: 0;\n}\n.mce-content-body .mce-offscreen-selection {\n  left: -2000000px;\n  max-width: 1000000px;\n  position: absolute;\n}\n.mce-content-body *[contentEditable=false] {\n  cursor: default;\n}\n.mce-content-body *[contentEditable=true] {\n  cursor: text;\n}\n.tox-cursor-format-painter {\n  cursor: url(\"data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A\"), default;\n}\n.mce-content-body figure.align-left {\n  float: left;\n}\n.mce-content-body figure.align-right {\n  float: right;\n}\n.mce-content-body figure.image.align-center {\n  display: table;\n  margin-left: auto;\n  margin-right: auto;\n}\n.mce-preview-object {\n  border: 1px solid gray;\n  display: inline-block;\n  line-height: 0;\n  margin: 0 2px 0 2px;\n  position: relative;\n}\n.mce-preview-object .mce-shim {\n  background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);\n  height: 100%;\n  left: 0;\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.mce-preview-object[data-mce-selected=\"2\"] .mce-shim {\n  display: none;\n}\n.mce-object {\n  background: transparent url(\"data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A\") no-repeat center;\n  border: 1px dashed #aaa;\n}\n.mce-pagebreak {\n  border: 1px dashed #aaa;\n  cursor: default;\n  display: block;\n  height: 5px;\n  margin-top: 15px;\n  page-break-before: always;\n  width: 100%;\n}\n@media print {\n  .mce-pagebreak {\n    border: 0;\n  }\n}\n.tiny-pageembed .mce-shim {\n  background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);\n  height: 100%;\n  left: 0;\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.tiny-pageembed[data-mce-selected=\"2\"] .mce-shim {\n  display: none;\n}\n.tiny-pageembed {\n  display: inline-block;\n  position: relative;\n}\n.tiny-pageembed--21by9,\n.tiny-pageembed--16by9,\n.tiny-pageembed--4by3,\n.tiny-pageembed--1by1 {\n  display: block;\n  overflow: hidden;\n  padding: 0;\n  position: relative;\n  width: 100%;\n}\n.tiny-pageembed--21by9 {\n  padding-top: 42.857143%;\n}\n.tiny-pageembed--16by9 {\n  padding-top: 56.25%;\n}\n.tiny-pageembed--4by3 {\n  padding-top: 75%;\n}\n.tiny-pageembed--1by1 {\n  padding-top: 100%;\n}\n.tiny-pageembed--21by9 iframe,\n.tiny-pageembed--16by9 iframe,\n.tiny-pageembed--4by3 iframe,\n.tiny-pageembed--1by1 iframe {\n  border: 0;\n  height: 100%;\n  left: 0;\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.mce-content-body[data-mce-placeholder] {\n  position: relative;\n}\n.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {\n  color: rgba(84, 111, 94, 0.7);\n  content: attr(data-mce-placeholder);\n  position: absolute;\n}\n.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before {\n  left: 1px;\n}\n.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before {\n  right: 1px;\n}\n.mce-content-body div.mce-resizehandle {\n  background-color: #4099ff;\n  border-color: #4099ff;\n  border-style: solid;\n  border-width: 1px;\n  box-sizing: border-box;\n  height: 10px;\n  position: absolute;\n  width: 10px;\n  z-index: 10000;\n}\n.mce-content-body div.mce-resizehandle:hover {\n  background-color: #4099ff;\n}\n.mce-content-body div.mce-resizehandle:nth-of-type(1) {\n  cursor: nwse-resize;\n}\n.mce-content-body div.mce-resizehandle:nth-of-type(2) {\n  cursor: nesw-resize;\n}\n.mce-content-body div.mce-resizehandle:nth-of-type(3) {\n  cursor: nwse-resize;\n}\n.mce-content-body div.mce-resizehandle:nth-of-type(4) {\n  cursor: nesw-resize;\n}\n.mce-content-body .mce-resize-backdrop {\n  z-index: 10000;\n}\n.mce-content-body .mce-clonedresizable {\n  cursor: default;\n  opacity: 0.5;\n  outline: 1px dashed black;\n  position: absolute;\n  z-index: 10001;\n}\n.mce-content-body .mce-clonedresizable.mce-resizetable-columns th,\n.mce-content-body .mce-clonedresizable.mce-resizetable-columns td {\n  border: 0;\n}\n.mce-content-body .mce-resize-helper {\n  background: #555;\n  background: rgba(0, 0, 0, 0.75);\n  border: 1px;\n  border-radius: 3px;\n  color: white;\n  display: none;\n  font-family: sans-serif;\n  font-size: 12px;\n  line-height: 14px;\n  margin: 5px 10px;\n  padding: 5px;\n  position: absolute;\n  white-space: nowrap;\n  z-index: 10002;\n}\n.tox-rtc-user-selection {\n  position: relative;\n}\n.tox-rtc-user-cursor {\n  bottom: 0;\n  cursor: default;\n  position: absolute;\n  top: 0;\n  width: 2px;\n}\n.tox-rtc-user-cursor::before {\n  background-color: inherit;\n  border-radius: 50%;\n  content: '';\n  display: block;\n  height: 8px;\n  position: absolute;\n  right: -3px;\n  top: -3px;\n  width: 8px;\n}\n.tox-rtc-user-cursor:hover::after {\n  background-color: inherit;\n  border-radius: 100px;\n  box-sizing: border-box;\n  color: #fff;\n  content: attr(data-user);\n  display: block;\n  font-size: 12px;\n  font-weight: normal;\n  left: -5px;\n  min-height: 8px;\n  min-width: 8px;\n  padding: 0 12px;\n  position: absolute;\n  top: -11px;\n  white-space: nowrap;\n  z-index: 1000;\n}\n.tox-rtc-user-selection--1 .tox-rtc-user-cursor {\n  background-color: #2dc26b;\n}\n.tox-rtc-user-selection--2 .tox-rtc-user-cursor {\n  background-color: #e03e2d;\n}\n.tox-rtc-user-selection--3 .tox-rtc-user-cursor {\n  background-color: #f1c40f;\n}\n.tox-rtc-user-selection--4 .tox-rtc-user-cursor {\n  background-color: #3598db;\n}\n.tox-rtc-user-selection--5 .tox-rtc-user-cursor {\n  background-color: #b96ad9;\n}\n.tox-rtc-user-selection--6 .tox-rtc-user-cursor {\n  background-color: #e67e23;\n}\n.tox-rtc-user-selection--7 .tox-rtc-user-cursor {\n  background-color: #aaa69d;\n}\n.tox-rtc-user-selection--8 .tox-rtc-user-cursor {\n  background-color: #f368e0;\n}\n.tox-rtc-remote-image {\n  background: #eaeaea url(\"data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A\") no-repeat center center;\n  border: 1px solid #ccc;\n  min-height: 240px;\n  min-width: 320px;\n}\n.mce-match-marker {\n  background: #aaa;\n  color: #fff;\n}\n.mce-match-marker-selected {\n  background: #39f;\n  color: #fff;\n}\n.mce-match-marker-selected::selection {\n  background: #39f;\n  color: #fff;\n}\n.mce-content-body img[data-mce-selected],\n.mce-content-body video[data-mce-selected],\n.mce-content-body audio[data-mce-selected],\n.mce-content-body object[data-mce-selected],\n.mce-content-body embed[data-mce-selected],\n.mce-content-body table[data-mce-selected] {\n  outline: 3px solid #b4d7ff;\n}\n.mce-content-body hr[data-mce-selected] {\n  outline: 3px solid #b4d7ff;\n  outline-offset: 1px;\n}\n.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus {\n  outline: 3px solid #b4d7ff;\n}\n.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover {\n  outline: 3px solid #b4d7ff;\n}\n.mce-content-body *[contentEditable=false][data-mce-selected] {\n  cursor: not-allowed;\n  outline: 3px solid #b4d7ff;\n}\n.mce-content-body.mce-content-readonly *[contentEditable=true]:focus,\n.mce-content-body.mce-content-readonly *[contentEditable=true]:hover {\n  outline: none;\n}\n.mce-content-body *[data-mce-selected=\"inline-boundary\"] {\n  background-color: #b4d7ff;\n}\n.mce-content-body .mce-edit-focus {\n  outline: 3px solid #b4d7ff;\n}\n.mce-content-body td[data-mce-selected],\n.mce-content-body th[data-mce-selected] {\n  position: relative;\n}\n.mce-content-body td[data-mce-selected]::selection,\n.mce-content-body th[data-mce-selected]::selection {\n  background: none;\n}\n.mce-content-body td[data-mce-selected] *,\n.mce-content-body th[data-mce-selected] * {\n  outline: none;\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n.mce-content-body td[data-mce-selected]::after,\n.mce-content-body th[data-mce-selected]::after {\n  background-color: rgba(180, 215, 255, 0.7);\n  border: 1px solid rgba(180, 215, 255, 0.7);\n  bottom: -1px;\n  content: '';\n  left: -1px;\n  mix-blend-mode: multiply;\n  position: absolute;\n  right: -1px;\n  top: -1px;\n}\n@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\n  .mce-content-body td[data-mce-selected]::after,\n  .mce-content-body th[data-mce-selected]::after {\n    border-color: rgba(0, 84, 180, 0.7);\n  }\n}\n.mce-content-body img::selection {\n  background: none;\n}\n.ephox-snooker-resizer-bar {\n  background-color: #b4d7ff;\n  opacity: 0;\n  -webkit-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.ephox-snooker-resizer-cols {\n  cursor: col-resize;\n}\n.ephox-snooker-resizer-rows {\n  cursor: row-resize;\n}\n.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging {\n  opacity: 1;\n}\n.mce-spellchecker-word {\n  background-image: url(\"data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A\");\n  background-position: 0 calc(100% + 1px);\n  background-repeat: repeat-x;\n  background-size: auto 6px;\n  cursor: default;\n  height: 2rem;\n}\n.mce-spellchecker-grammar {\n  background-image: url(\"data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A\");\n  background-position: 0 calc(100% + 1px);\n  background-repeat: repeat-x;\n  background-size: auto 6px;\n  cursor: default;\n}\n.mce-toc {\n  border: 1px solid gray;\n}\n.mce-toc h2 {\n  margin: 4px;\n}\n.mce-toc li {\n  list-style-type: none;\n}\ntable[style*=\"border-width: 0px\"],\n.mce-item-table:not([border]),\n.mce-item-table[border=\"0\"],\ntable[style*=\"border-width: 0px\"] td,\n.mce-item-table:not([border]) td,\n.mce-item-table[border=\"0\"] td,\ntable[style*=\"border-width: 0px\"] th,\n.mce-item-table:not([border]) th,\n.mce-item-table[border=\"0\"] th,\ntable[style*=\"border-width: 0px\"] caption,\n.mce-item-table:not([border]) caption,\n.mce-item-table[border=\"0\"] caption {\n  border: 1px dashed #bbb;\n}\n.mce-visualblocks p,\n.mce-visualblocks h1,\n.mce-visualblocks h2,\n.mce-visualblocks h3,\n.mce-visualblocks h4,\n.mce-visualblocks h5,\n.mce-visualblocks h6,\n.mce-visualblocks div:not([data-mce-bogus]),\n.mce-visualblocks section,\n.mce-visualblocks article,\n.mce-visualblocks blockquote,\n.mce-visualblocks address,\n.mce-visualblocks pre,\n.mce-visualblocks figure,\n.mce-visualblocks figcaption,\n.mce-visualblocks hgroup,\n.mce-visualblocks aside,\n.mce-visualblocks ul,\n.mce-visualblocks ol,\n.mce-visualblocks dl {\n  background-repeat: no-repeat;\n  border: 1px dashed #bbb;\n  margin-left: 3px;\n  padding-top: 10px;\n}\n.mce-visualblocks p {\n  background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);\n}\n.mce-visualblocks h1 {\n  background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);\n}\n.mce-visualblocks h2 {\n  background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);\n}\n.mce-visualblocks h3 {\n  background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);\n}\n.mce-visualblocks h4 {\n  background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);\n}\n.mce-visualblocks h5 {\n  background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);\n}\n.mce-visualblocks h6 {\n  background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);\n}\n.mce-visualblocks div:not([data-mce-bogus]) {\n  background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);\n}\n.mce-visualblocks section {\n  background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);\n}\n.mce-visualblocks article {\n  background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);\n}\n.mce-visualblocks blockquote {\n  background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);\n}\n.mce-visualblocks address {\n  background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);\n}\n.mce-visualblocks pre {\n  background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);\n}\n.mce-visualblocks figure {\n  background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);\n}\n.mce-visualblocks figcaption {\n  border: 1px dashed #bbb;\n}\n.mce-visualblocks hgroup {\n  background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);\n}\n.mce-visualblocks aside {\n  background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);\n}\n.mce-visualblocks ul {\n  background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);\n}\n.mce-visualblocks ol {\n  background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);\n}\n.mce-visualblocks dl {\n  background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);\n}\n.mce-visualblocks:not([dir=rtl]) p,\n.mce-visualblocks:not([dir=rtl]) h1,\n.mce-visualblocks:not([dir=rtl]) h2,\n.mce-visualblocks:not([dir=rtl]) h3,\n.mce-visualblocks:not([dir=rtl]) h4,\n.mce-visualblocks:not([dir=rtl]) h5,\n.mce-visualblocks:not([dir=rtl]) h6,\n.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),\n.mce-visualblocks:not([dir=rtl]) section,\n.mce-visualblocks:not([dir=rtl]) article,\n.mce-visualblocks:not([dir=rtl]) blockquote,\n.mce-visualblocks:not([dir=rtl]) address,\n.mce-visualblocks:not([dir=rtl]) pre,\n.mce-visualblocks:not([dir=rtl]) figure,\n.mce-visualblocks:not([dir=rtl]) figcaption,\n.mce-visualblocks:not([dir=rtl]) hgroup,\n.mce-visualblocks:not([dir=rtl]) aside,\n.mce-visualblocks:not([dir=rtl]) ul,\n.mce-visualblocks:not([dir=rtl]) ol,\n.mce-visualblocks:not([dir=rtl]) dl {\n  margin-left: 3px;\n}\n.mce-visualblocks[dir=rtl] p,\n.mce-visualblocks[dir=rtl] h1,\n.mce-visualblocks[dir=rtl] h2,\n.mce-visualblocks[dir=rtl] h3,\n.mce-visualblocks[dir=rtl] h4,\n.mce-visualblocks[dir=rtl] h5,\n.mce-visualblocks[dir=rtl] h6,\n.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),\n.mce-visualblocks[dir=rtl] section,\n.mce-visualblocks[dir=rtl] article,\n.mce-visualblocks[dir=rtl] blockquote,\n.mce-visualblocks[dir=rtl] address,\n.mce-visualblocks[dir=rtl] pre,\n.mce-visualblocks[dir=rtl] figure,\n.mce-visualblocks[dir=rtl] figcaption,\n.mce-visualblocks[dir=rtl] hgroup,\n.mce-visualblocks[dir=rtl] aside,\n.mce-visualblocks[dir=rtl] ul,\n.mce-visualblocks[dir=rtl] ol,\n.mce-visualblocks[dir=rtl] dl {\n  background-position-x: right;\n  margin-right: 3px;\n}\n.mce-nbsp,\n.mce-shy {\n  background: #aaa;\n}\n.mce-shy::after {\n  content: '-';\n}\nbody {\n  font-family: sans-serif;\n}\ntable {\n  border-collapse: collapse;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/public/resource/tinymce/skins/ui/jeecg/content.inline.css",
    "content": "/**\n* Copyright (c) Tiny Technologies, Inc. All rights reserved.\n* Licensed under the LGPL or a commercial license.\n* For LGPL see License.txt in the project root for license information.\n* For commercial licenses see https://www.tiny.cloud/\n*/\n.mce-content-body .mce-item-anchor {\n  background: transparent url(\"data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A\") no-repeat center;\n  cursor: default;\n  display: inline-block;\n  height: 12px !important;\n  padding: 0 2px;\n  -webkit-user-modify: read-only;\n  -moz-user-modify: read-only;\n  -webkit-user-select: all;\n  -ms-user-select: all;\n      user-select: all;\n  width: 8px !important;\n}\n.mce-content-body .mce-item-anchor[data-mce-selected] {\n  outline-offset: 1px;\n}\n.tox-comments-visible .tox-comment {\n  background-color: #fff0b7;\n}\n.tox-comments-visible .tox-comment--active {\n  background-color: #ffe168;\n}\n.tox-checklist > li:not(.tox-checklist--hidden) {\n  list-style: none;\n  margin: 0.25em 0;\n}\n.tox-checklist > li:not(.tox-checklist--hidden)::before {\n  content: url(\"data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A\");\n  cursor: pointer;\n  height: 1em;\n  margin-left: -1.5em;\n  margin-top: 0.125em;\n  position: absolute;\n  width: 1em;\n}\n.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before {\n  content: url(\"data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A\");\n}\n[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before {\n  margin-left: 0;\n  margin-right: -1.5em;\n}\n/* stylelint-disable */\n/* http://prismjs.com/ */\n/**\n * prism.js default theme for JavaScript, CSS and HTML\n * Based on dabblet (http://dabblet.com)\n * @author Lea Verou\n */\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n  color: black;\n  background: none;\n  text-shadow: 0 1px white;\n  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n  font-size: 1em;\n  text-align: left;\n  white-space: pre;\n  word-spacing: normal;\n  word-break: normal;\n  word-wrap: normal;\n  line-height: 1.5;\n  -moz-tab-size: 4;\n  tab-size: 4;\n  -webkit-hyphens: none;\n  -ms-hyphens: none;\n  hyphens: none;\n}\npre[class*=\"language-\"]::selection,\npre[class*=\"language-\"] ::selection,\ncode[class*=\"language-\"]::selection,\ncode[class*=\"language-\"] ::selection {\n  text-shadow: none;\n  background: #b3d4fc;\n}\n@media print {\n  code[class*=\"language-\"],\n  pre[class*=\"language-\"] {\n    text-shadow: none;\n  }\n}\n/* Code blocks */\npre[class*=\"language-\"] {\n  padding: 1em;\n  margin: 0.5em 0;\n  overflow: auto;\n}\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n  background: #f5f2f0;\n}\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n  padding: 0.1em;\n  border-radius: 0.3em;\n  white-space: normal;\n}\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n  color: slategray;\n}\n.token.punctuation {\n  color: #999;\n}\n.namespace {\n  opacity: 0.7;\n}\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.constant,\n.token.symbol,\n.token.deleted {\n  color: #905;\n}\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.inserted {\n  color: #690;\n}\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string {\n  color: #9a6e3a;\n  background: hsla(0, 0%, 100%, 0.5);\n}\n.token.atrule,\n.token.attr-value,\n.token.keyword {\n  color: #07a;\n}\n.token.function,\n.token.class-name {\n  color: #DD4A68;\n}\n.token.regex,\n.token.important,\n.token.variable {\n  color: #e90;\n}\n.token.important,\n.token.bold {\n  font-weight: bold;\n}\n.token.italic {\n  font-style: italic;\n}\n.token.entity {\n  cursor: help;\n}\n/* stylelint-enable */\n.mce-content-body {\n  overflow-wrap: break-word;\n  word-wrap: break-word;\n}\n.mce-content-body .mce-visual-caret {\n  background-color: black;\n  background-color: currentColor;\n  position: absolute;\n}\n.mce-content-body .mce-visual-caret-hidden {\n  display: none;\n}\n.mce-content-body *[data-mce-caret] {\n  left: -1000px;\n  margin: 0;\n  padding: 0;\n  position: absolute;\n  right: auto;\n  top: 0;\n}\n.mce-content-body .mce-offscreen-selection {\n  left: -2000000px;\n  max-width: 1000000px;\n  position: absolute;\n}\n.mce-content-body *[contentEditable=false] {\n  cursor: default;\n}\n.mce-content-body *[contentEditable=true] {\n  cursor: text;\n}\n.tox-cursor-format-painter {\n  cursor: url(\"data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A\"), default;\n}\n.mce-content-body figure.align-left {\n  float: left;\n}\n.mce-content-body figure.align-right {\n  float: right;\n}\n.mce-content-body figure.image.align-center {\n  display: table;\n  margin-left: auto;\n  margin-right: auto;\n}\n.mce-preview-object {\n  border: 1px solid gray;\n  display: inline-block;\n  line-height: 0;\n  margin: 0 2px 0 2px;\n  position: relative;\n}\n.mce-preview-object .mce-shim {\n  background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);\n  height: 100%;\n  left: 0;\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.mce-preview-object[data-mce-selected=\"2\"] .mce-shim {\n  display: none;\n}\n.mce-object {\n  background: transparent url(\"data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A\") no-repeat center;\n  border: 1px dashed #aaa;\n}\n.mce-pagebreak {\n  border: 1px dashed #aaa;\n  cursor: default;\n  display: block;\n  height: 5px;\n  margin-top: 15px;\n  page-break-before: always;\n  width: 100%;\n}\n@media print {\n  .mce-pagebreak {\n    border: 0;\n  }\n}\n.tiny-pageembed .mce-shim {\n  background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);\n  height: 100%;\n  left: 0;\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.tiny-pageembed[data-mce-selected=\"2\"] .mce-shim {\n  display: none;\n}\n.tiny-pageembed {\n  display: inline-block;\n  position: relative;\n}\n.tiny-pageembed--21by9,\n.tiny-pageembed--16by9,\n.tiny-pageembed--4by3,\n.tiny-pageembed--1by1 {\n  display: block;\n  overflow: hidden;\n  padding: 0;\n  position: relative;\n  width: 100%;\n}\n.tiny-pageembed--21by9 {\n  padding-top: 42.857143%;\n}\n.tiny-pageembed--16by9 {\n  padding-top: 56.25%;\n}\n.tiny-pageembed--4by3 {\n  padding-top: 75%;\n}\n.tiny-pageembed--1by1 {\n  padding-top: 100%;\n}\n.tiny-pageembed--21by9 iframe,\n.tiny-pageembed--16by9 iframe,\n.tiny-pageembed--4by3 iframe,\n.tiny-pageembed--1by1 iframe {\n  border: 0;\n  height: 100%;\n  left: 0;\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.mce-content-body[data-mce-placeholder] {\n  position: relative;\n}\n.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {\n  color: rgba(84, 111, 94, 0.7);\n  content: attr(data-mce-placeholder);\n  position: absolute;\n}\n.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before {\n  left: 1px;\n}\n.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before {\n  right: 1px;\n}\n.mce-content-body div.mce-resizehandle {\n  background-color: #4099ff;\n  border-color: #4099ff;\n  border-style: solid;\n  border-width: 1px;\n  box-sizing: border-box;\n  height: 10px;\n  position: absolute;\n  width: 10px;\n  z-index: 10000;\n}\n.mce-content-body div.mce-resizehandle:hover {\n  background-color: #4099ff;\n}\n.mce-content-body div.mce-resizehandle:nth-of-type(1) {\n  cursor: nwse-resize;\n}\n.mce-content-body div.mce-resizehandle:nth-of-type(2) {\n  cursor: nesw-resize;\n}\n.mce-content-body div.mce-resizehandle:nth-of-type(3) {\n  cursor: nwse-resize;\n}\n.mce-content-body div.mce-resizehandle:nth-of-type(4) {\n  cursor: nesw-resize;\n}\n.mce-content-body .mce-resize-backdrop {\n  z-index: 10000;\n}\n.mce-content-body .mce-clonedresizable {\n  cursor: default;\n  opacity: 0.5;\n  outline: 1px dashed black;\n  position: absolute;\n  z-index: 10001;\n}\n.mce-content-body .mce-clonedresizable.mce-resizetable-columns th,\n.mce-content-body .mce-clonedresizable.mce-resizetable-columns td {\n  border: 0;\n}\n.mce-content-body .mce-resize-helper {\n  background: #555;\n  background: rgba(0, 0, 0, 0.75);\n  border: 1px;\n  border-radius: 3px;\n  color: white;\n  display: none;\n  font-family: sans-serif;\n  font-size: 12px;\n  line-height: 14px;\n  margin: 5px 10px;\n  padding: 5px;\n  position: absolute;\n  white-space: nowrap;\n  z-index: 10002;\n}\n.tox-rtc-user-selection {\n  position: relative;\n}\n.tox-rtc-user-cursor {\n  bottom: 0;\n  cursor: default;\n  position: absolute;\n  top: 0;\n  width: 2px;\n}\n.tox-rtc-user-cursor::before {\n  background-color: inherit;\n  border-radius: 50%;\n  content: '';\n  display: block;\n  height: 8px;\n  position: absolute;\n  right: -3px;\n  top: -3px;\n  width: 8px;\n}\n.tox-rtc-user-cursor:hover::after {\n  background-color: inherit;\n  border-radius: 100px;\n  box-sizing: border-box;\n  color: #fff;\n  content: attr(data-user);\n  display: block;\n  font-size: 12px;\n  font-weight: normal;\n  left: -5px;\n  min-height: 8px;\n  min-width: 8px;\n  padding: 0 12px;\n  position: absolute;\n  top: -11px;\n  white-space: nowrap;\n  z-index: 1000;\n}\n.tox-rtc-user-selection--1 .tox-rtc-user-cursor {\n  background-color: #2dc26b;\n}\n.tox-rtc-user-selection--2 .tox-rtc-user-cursor {\n  background-color: #e03e2d;\n}\n.tox-rtc-user-selection--3 .tox-rtc-user-cursor {\n  background-color: #f1c40f;\n}\n.tox-rtc-user-selection--4 .tox-rtc-user-cursor {\n  background-color: #3598db;\n}\n.tox-rtc-user-selection--5 .tox-rtc-user-cursor {\n  background-color: #b96ad9;\n}\n.tox-rtc-user-selection--6 .tox-rtc-user-cursor {\n  background-color: #e67e23;\n}\n.tox-rtc-user-selection--7 .tox-rtc-user-cursor {\n  background-color: #aaa69d;\n}\n.tox-rtc-user-selection--8 .tox-rtc-user-cursor {\n  background-color: #f368e0;\n}\n.tox-rtc-remote-image {\n  background: #eaeaea url(\"data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A\") no-repeat center center;\n  border: 1px solid #ccc;\n  min-height: 240px;\n  min-width: 320px;\n}\n.mce-match-marker {\n  background: #aaa;\n  color: #fff;\n}\n.mce-match-marker-selected {\n  background: #39f;\n  color: #fff;\n}\n.mce-match-marker-selected::selection {\n  background: #39f;\n  color: #fff;\n}\n.mce-content-body img[data-mce-selected],\n.mce-content-body video[data-mce-selected],\n.mce-content-body audio[data-mce-selected],\n.mce-content-body object[data-mce-selected],\n.mce-content-body embed[data-mce-selected],\n.mce-content-body table[data-mce-selected] {\n  outline: 3px solid #b4d7ff;\n}\n.mce-content-body hr[data-mce-selected] {\n  outline: 3px solid #b4d7ff;\n  outline-offset: 1px;\n}\n.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus {\n  outline: 3px solid #b4d7ff;\n}\n.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover {\n  outline: 3px solid #b4d7ff;\n}\n.mce-content-body *[contentEditable=false][data-mce-selected] {\n  cursor: not-allowed;\n  outline: 3px solid #b4d7ff;\n}\n.mce-content-body.mce-content-readonly *[contentEditable=true]:focus,\n.mce-content-body.mce-content-readonly *[contentEditable=true]:hover {\n  outline: none;\n}\n.mce-content-body *[data-mce-selected=\"inline-boundary\"] {\n  background-color: #b4d7ff;\n}\n.mce-content-body .mce-edit-focus {\n  outline: 3px solid #b4d7ff;\n}\n.mce-content-body td[data-mce-selected],\n.mce-content-body th[data-mce-selected] {\n  position: relative;\n}\n.mce-content-body td[data-mce-selected]::selection,\n.mce-content-body th[data-mce-selected]::selection {\n  background: none;\n}\n.mce-content-body td[data-mce-selected] *,\n.mce-content-body th[data-mce-selected] * {\n  outline: none;\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n.mce-content-body td[data-mce-selected]::after,\n.mce-content-body th[data-mce-selected]::after {\n  background-color: rgba(180, 215, 255, 0.7);\n  border: 1px solid rgba(180, 215, 255, 0.7);\n  bottom: -1px;\n  content: '';\n  left: -1px;\n  mix-blend-mode: multiply;\n  position: absolute;\n  right: -1px;\n  top: -1px;\n}\n@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\n  .mce-content-body td[data-mce-selected]::after,\n  .mce-content-body th[data-mce-selected]::after {\n    border-color: rgba(0, 84, 180, 0.7);\n  }\n}\n.mce-content-body img::selection {\n  background: none;\n}\n.ephox-snooker-resizer-bar {\n  background-color: #b4d7ff;\n  opacity: 0;\n  -webkit-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.ephox-snooker-resizer-cols {\n  cursor: col-resize;\n}\n.ephox-snooker-resizer-rows {\n  cursor: row-resize;\n}\n.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging {\n  opacity: 1;\n}\n.mce-spellchecker-word {\n  background-image: url(\"data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A\");\n  background-position: 0 calc(100% + 1px);\n  background-repeat: repeat-x;\n  background-size: auto 6px;\n  cursor: default;\n  height: 2rem;\n}\n.mce-spellchecker-grammar {\n  background-image: url(\"data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A\");\n  background-position: 0 calc(100% + 1px);\n  background-repeat: repeat-x;\n  background-size: auto 6px;\n  cursor: default;\n}\n.mce-toc {\n  border: 1px solid gray;\n}\n.mce-toc h2 {\n  margin: 4px;\n}\n.mce-toc li {\n  list-style-type: none;\n}\ntable[style*=\"border-width: 0px\"],\n.mce-item-table:not([border]),\n.mce-item-table[border=\"0\"],\ntable[style*=\"border-width: 0px\"] td,\n.mce-item-table:not([border]) td,\n.mce-item-table[border=\"0\"] td,\ntable[style*=\"border-width: 0px\"] th,\n.mce-item-table:not([border]) th,\n.mce-item-table[border=\"0\"] th,\ntable[style*=\"border-width: 0px\"] caption,\n.mce-item-table:not([border]) caption,\n.mce-item-table[border=\"0\"] caption {\n  border: 1px dashed #bbb;\n}\n.mce-visualblocks p,\n.mce-visualblocks h1,\n.mce-visualblocks h2,\n.mce-visualblocks h3,\n.mce-visualblocks h4,\n.mce-visualblocks h5,\n.mce-visualblocks h6,\n.mce-visualblocks div:not([data-mce-bogus]),\n.mce-visualblocks section,\n.mce-visualblocks article,\n.mce-visualblocks blockquote,\n.mce-visualblocks address,\n.mce-visualblocks pre,\n.mce-visualblocks figure,\n.mce-visualblocks figcaption,\n.mce-visualblocks hgroup,\n.mce-visualblocks aside,\n.mce-visualblocks ul,\n.mce-visualblocks ol,\n.mce-visualblocks dl {\n  background-repeat: no-repeat;\n  border: 1px dashed #bbb;\n  margin-left: 3px;\n  padding-top: 10px;\n}\n.mce-visualblocks p {\n  background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);\n}\n.mce-visualblocks h1 {\n  background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);\n}\n.mce-visualblocks h2 {\n  background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);\n}\n.mce-visualblocks h3 {\n  background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);\n}\n.mce-visualblocks h4 {\n  background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);\n}\n.mce-visualblocks h5 {\n  background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);\n}\n.mce-visualblocks h6 {\n  background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);\n}\n.mce-visualblocks div:not([data-mce-bogus]) {\n  background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);\n}\n.mce-visualblocks section {\n  background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);\n}\n.mce-visualblocks article {\n  background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);\n}\n.mce-visualblocks blockquote {\n  background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);\n}\n.mce-visualblocks address {\n  background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);\n}\n.mce-visualblocks pre {\n  background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);\n}\n.mce-visualblocks figure {\n  background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);\n}\n.mce-visualblocks figcaption {\n  border: 1px dashed #bbb;\n}\n.mce-visualblocks hgroup {\n  background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);\n}\n.mce-visualblocks aside {\n  background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);\n}\n.mce-visualblocks ul {\n  background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);\n}\n.mce-visualblocks ol {\n  background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);\n}\n.mce-visualblocks dl {\n  background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);\n}\n.mce-visualblocks:not([dir=rtl]) p,\n.mce-visualblocks:not([dir=rtl]) h1,\n.mce-visualblocks:not([dir=rtl]) h2,\n.mce-visualblocks:not([dir=rtl]) h3,\n.mce-visualblocks:not([dir=rtl]) h4,\n.mce-visualblocks:not([dir=rtl]) h5,\n.mce-visualblocks:not([dir=rtl]) h6,\n.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),\n.mce-visualblocks:not([dir=rtl]) section,\n.mce-visualblocks:not([dir=rtl]) article,\n.mce-visualblocks:not([dir=rtl]) blockquote,\n.mce-visualblocks:not([dir=rtl]) address,\n.mce-visualblocks:not([dir=rtl]) pre,\n.mce-visualblocks:not([dir=rtl]) figure,\n.mce-visualblocks:not([dir=rtl]) figcaption,\n.mce-visualblocks:not([dir=rtl]) hgroup,\n.mce-visualblocks:not([dir=rtl]) aside,\n.mce-visualblocks:not([dir=rtl]) ul,\n.mce-visualblocks:not([dir=rtl]) ol,\n.mce-visualblocks:not([dir=rtl]) dl {\n  margin-left: 3px;\n}\n.mce-visualblocks[dir=rtl] p,\n.mce-visualblocks[dir=rtl] h1,\n.mce-visualblocks[dir=rtl] h2,\n.mce-visualblocks[dir=rtl] h3,\n.mce-visualblocks[dir=rtl] h4,\n.mce-visualblocks[dir=rtl] h5,\n.mce-visualblocks[dir=rtl] h6,\n.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),\n.mce-visualblocks[dir=rtl] section,\n.mce-visualblocks[dir=rtl] article,\n.mce-visualblocks[dir=rtl] blockquote,\n.mce-visualblocks[dir=rtl] address,\n.mce-visualblocks[dir=rtl] pre,\n.mce-visualblocks[dir=rtl] figure,\n.mce-visualblocks[dir=rtl] figcaption,\n.mce-visualblocks[dir=rtl] hgroup,\n.mce-visualblocks[dir=rtl] aside,\n.mce-visualblocks[dir=rtl] ul,\n.mce-visualblocks[dir=rtl] ol,\n.mce-visualblocks[dir=rtl] dl {\n  background-position-x: right;\n  margin-right: 3px;\n}\n.mce-nbsp,\n.mce-shy {\n  background: #aaa;\n}\n.mce-shy::after {\n  content: '-';\n}\n"
  },
  {
    "path": "jeecgboot-vue3/public/resource/tinymce/skins/ui/jeecg/content.mobile.css",
    "content": "/**\n* Copyright (c) Tiny Technologies, Inc. All rights reserved.\n* Licensed under the LGPL or a commercial license.\n* For LGPL see License.txt in the project root for license information.\n* For commercial licenses see https://www.tiny.cloud/\n*/\n.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection {\n  /* Note: this file is used inside the content, so isn't part of theming */\n  background-color: green;\n  display: inline-block;\n  opacity: 0.5;\n  position: absolute;\n}\nbody {\n  -webkit-text-size-adjust: none;\n}\nbody img {\n  /* this is related to the content margin */\n  max-width: 96vw;\n}\nbody table img {\n  max-width: 95%;\n}\nbody {\n  font-family: sans-serif;\n}\ntable {\n  border-collapse: collapse;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/public/resource/tinymce/skins/ui/jeecg/skin.css",
    "content": "/**\n* Copyright (c) Tiny Technologies, Inc. All rights reserved.\n* Licensed under the LGPL or a commercial license.\n* For LGPL see License.txt in the project root for license information.\n* For commercial licenses see https://www.tiny.cloud/\n*/\n.tox {\n  box-shadow: none;\n  box-sizing: content-box;\n  color: rgba(84, 111, 94, 0.85);\n  cursor: auto;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n  font-size: 10px;\n  font-style: normal;\n  font-weight: normal;\n  line-height: normal;\n  -webkit-tap-highlight-color: transparent;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  vertical-align: initial;\n  white-space: normal;\n}\n.tox *:not(svg):not(rect) {\n  box-sizing: inherit;\n  color: inherit;\n  cursor: inherit;\n  direction: inherit;\n  font-family: inherit;\n  font-size: inherit;\n  font-style: inherit;\n  font-weight: inherit;\n  line-height: inherit;\n  -webkit-tap-highlight-color: inherit;\n  text-align: inherit;\n  text-decoration: inherit;\n  text-shadow: inherit;\n  text-transform: inherit;\n  vertical-align: inherit;\n  white-space: inherit;\n}\n.tox *:not(svg):not(rect) {\n  /* stylelint-disable-line no-duplicate-selectors */\n  background: transparent;\n  border: 0;\n  box-shadow: none;\n  float: none;\n  height: auto;\n  margin: 0;\n  max-width: none;\n  outline: 0;\n  padding: 0;\n  position: static;\n  width: auto;\n}\n.tox:not([dir=rtl]) {\n  direction: ltr;\n  text-align: left;\n}\n.tox[dir=rtl] {\n  direction: rtl;\n  text-align: right;\n}\n.tox-tinymce {\n  border: 1px solid #d9d9d9;\n  border-radius: 0px;\n  box-shadow: none;\n  box-sizing: border-box;\n  display: flex;\n  flex-direction: column;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n  overflow: hidden;\n  position: relative;\n  visibility: inherit !important;\n}\n.tox-tinymce-inline {\n  border: none;\n  box-shadow: none;\n}\n.tox-tinymce-inline .tox-editor-header {\n  background-color: transparent;\n  border: 1px solid #d9d9d9;\n  border-radius: 0px;\n  box-shadow: none;\n}\n.tox-tinymce-aux {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n  z-index: 1300;\n}\n.tox-tinymce *:focus,\n.tox-tinymce-aux *:focus {\n  outline: none;\n}\nbutton::-moz-focus-inner {\n  border: 0;\n}\n.tox[dir=rtl] .tox-icon--flip svg {\n  transform: rotateY(180deg);\n}\n.tox .accessibility-issue__header {\n  align-items: center;\n  display: flex;\n  margin-bottom: 2.5px;\n}\n.tox .accessibility-issue__description {\n  align-items: stretch;\n  border: 1px solid #d9d9d9;\n  border-radius: 3px;\n  display: flex;\n  justify-content: space-between;\n}\n.tox .accessibility-issue__description > div {\n  padding-bottom: 2.5px;\n}\n.tox .accessibility-issue__description > div > div {\n  align-items: center;\n  display: flex;\n  margin-bottom: 2.5px;\n}\n.tox .accessibility-issue__description > *:last-child:not(:only-child) {\n  border-color: #d9d9d9;\n  border-style: solid;\n}\n.tox .accessibility-issue__repair {\n  margin-top: 16px;\n}\n.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description {\n  background-color: rgba(10, 143, 233, 0.1);\n  border-color: rgba(10, 143, 233, 0.4);\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description > *:last-child {\n  border-color: rgba(10, 143, 233, 0.4);\n}\n.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2 {\n  color: #0a8fe9;\n}\n.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg {\n  fill: #0a8fe9;\n}\n.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon {\n  color: #0a8fe9;\n}\n.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description {\n  background-color: rgba(255, 165, 0, 0.1);\n  border-color: rgba(255, 165, 0, 0.5);\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description > *:last-child {\n  border-color: rgba(255, 165, 0, 0.5);\n}\n.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2 {\n  color: #cc8500;\n}\n.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg {\n  fill: #cc8500;\n}\n.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon {\n  color: #cc8500;\n}\n.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description {\n  background-color: rgba(204, 0, 0, 0.1);\n  border-color: rgba(204, 0, 0, 0.4);\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description > *:last-child {\n  border-color: rgba(204, 0, 0, 0.4);\n}\n.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2 {\n  color: #c00;\n}\n.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg {\n  fill: #c00;\n}\n.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon {\n  color: #c00;\n}\n.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description {\n  background-color: rgba(120, 171, 70, 0.1);\n  border-color: rgba(120, 171, 70, 0.4);\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description > *:last-child {\n  border-color: rgba(120, 171, 70, 0.4);\n}\n.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2 {\n  color: #78AB46;\n}\n.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg {\n  fill: #78AB46;\n}\n.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon {\n  color: #78AB46;\n}\n.tox .tox-dialog__body-content .accessibility-issue__header h1,\n.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2 {\n  margin-top: 0;\n}\n.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button {\n  margin-left: 2.5px;\n}\n.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) {\n  margin-left: auto;\n}\n.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description {\n  padding: 2.5px 2.5px 2.5px 5px;\n}\n.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description > *:last-child {\n  border-left-width: 1px;\n  padding-left: 2.5px;\n}\n.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button {\n  margin-right: 2.5px;\n}\n.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) {\n  margin-right: auto;\n}\n.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description {\n  padding: 2.5px 5px 2.5px 2.5px;\n}\n.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description > *:last-child {\n  border-right-width: 1px;\n  padding-right: 2.5px;\n}\n.tox .tox-anchorbar {\n  display: flex;\n  flex: 0 0 auto;\n}\n.tox .tox-bar {\n  display: flex;\n  flex: 0 0 auto;\n}\n.tox .tox-button {\n  background-color: #0a8fe9;\n  background-image: none;\n  background-position: 0 0;\n  background-repeat: repeat;\n  border-color: #0a8fe9;\n  border-radius: 3px;\n  border-style: solid;\n  border-width: 1px;\n  box-shadow: none;\n  box-sizing: border-box;\n  color: #fff;\n  cursor: pointer;\n  display: inline-block;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n  font-size: 8.75px;\n  font-style: normal;\n  font-weight: normal;\n  letter-spacing: normal;\n  line-height: 24px;\n  margin: 0;\n  outline: none;\n  padding: 2.5px 10px;\n  text-align: center;\n  text-decoration: none;\n  text-transform: none;\n  white-space: nowrap;\n}\n.tox .tox-button[disabled] {\n  background-color: #0a8fe9;\n  background-image: none;\n  border-color: #0a8fe9;\n  box-shadow: none;\n  color: rgba(255, 255, 255, 0.5);\n  cursor: not-allowed;\n}\n.tox .tox-button:focus:not(:disabled) {\n  background-color: #0980d1;\n  background-image: none;\n  border-color: #0980d1;\n  box-shadow: none;\n  color: #fff;\n}\n.tox .tox-button:hover:not(:disabled) {\n  background-color: #0980d1;\n  background-image: none;\n  border-color: #0980d1;\n  box-shadow: none;\n  color: #fff;\n}\n.tox .tox-button:active:not(:disabled) {\n  background-color: #0871b8;\n  background-image: none;\n  border-color: #0871b8;\n  box-shadow: none;\n  color: #fff;\n}\n.tox .tox-button--secondary {\n  background-color: #f0f0f0;\n  background-image: none;\n  background-position: 0 0;\n  background-repeat: repeat;\n  border-color: #f0f0f0;\n  border-radius: 3px;\n  border-style: solid;\n  border-width: 1px;\n  box-shadow: none;\n  color: rgba(84, 111, 94, 0.85);\n  font-size: 8.75px;\n  font-style: normal;\n  font-weight: normal;\n  letter-spacing: normal;\n  outline: none;\n  padding: 2.5px 10px;\n  text-decoration: none;\n  text-transform: none;\n}\n.tox .tox-button--secondary[disabled] {\n  background-color: #f0f0f0;\n  background-image: none;\n  border-color: #f0f0f0;\n  box-shadow: none;\n  color: rgba(84, 111, 94, 0.5);\n}\n.tox .tox-button--secondary:focus:not(:disabled) {\n  background-color: #e3e3e3;\n  background-image: none;\n  border-color: #e3e3e3;\n  box-shadow: none;\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-button--secondary:hover:not(:disabled) {\n  background-color: #e3e3e3;\n  background-image: none;\n  border-color: #e3e3e3;\n  box-shadow: none;\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-button--secondary:active:not(:disabled) {\n  background-color: #d6d6d6;\n  background-image: none;\n  border-color: #d6d6d6;\n  box-shadow: none;\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-button--icon,\n.tox .tox-button.tox-button--icon,\n.tox .tox-button.tox-button--secondary.tox-button--icon {\n  padding: 2.5px;\n}\n.tox .tox-button--icon .tox-icon svg,\n.tox .tox-button.tox-button--icon .tox-icon svg,\n.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg {\n  display: block;\n  fill: currentColor;\n}\n.tox .tox-button-link {\n  background: 0;\n  border: none;\n  box-sizing: border-box;\n  cursor: pointer;\n  display: inline-block;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n  font-size: 10px;\n  font-weight: normal;\n  line-height: 1.3;\n  margin: 0;\n  padding: 0;\n  white-space: nowrap;\n}\n.tox .tox-button-link--sm {\n  font-size: 8.75px;\n}\n.tox .tox-button--naked {\n  background-color: transparent;\n  border-color: transparent;\n  box-shadow: unset;\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-button--naked[disabled] {\n  background-color: #f0f0f0;\n  border-color: #f0f0f0;\n  box-shadow: none;\n  color: rgba(84, 111, 94, 0.5);\n}\n.tox .tox-button--naked:hover:not(:disabled) {\n  background-color: #e3e3e3;\n  border-color: #e3e3e3;\n  box-shadow: none;\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-button--naked:focus:not(:disabled) {\n  background-color: #e3e3e3;\n  border-color: #e3e3e3;\n  box-shadow: none;\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-button--naked:active:not(:disabled) {\n  background-color: #d6d6d6;\n  border-color: #d6d6d6;\n  box-shadow: none;\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-button--naked .tox-icon svg {\n  fill: currentColor;\n}\n.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) {\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-checkbox {\n  align-items: center;\n  border-radius: 3px;\n  cursor: pointer;\n  display: flex;\n  height: 36px;\n  min-width: 36px;\n}\n.tox .tox-checkbox__input {\n  /* Hide from view but visible to screen readers */\n  height: 1px;\n  overflow: hidden;\n  position: absolute;\n  top: auto;\n  width: 1px;\n}\n.tox .tox-checkbox__icons {\n  align-items: center;\n  border-radius: 3px;\n  box-shadow: 0 0 0 2px transparent;\n  box-sizing: content-box;\n  display: flex;\n  height: 24px;\n  justify-content: center;\n  padding: calc(2.5px - 1px);\n  width: 24px;\n}\n.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {\n  display: block;\n  fill: rgba(84, 111, 94, 0.3);\n}\n.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {\n  display: none;\n  fill: #0a8fe9;\n}\n.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg {\n  display: none;\n  fill: #0a8fe9;\n}\n.tox .tox-checkbox--disabled {\n  color: rgba(84, 111, 94, 0.5);\n  cursor: not-allowed;\n}\n.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg {\n  fill: rgba(84, 111, 94, 0.5);\n}\n.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {\n  fill: rgba(84, 111, 94, 0.5);\n}\n.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {\n  fill: rgba(84, 111, 94, 0.5);\n}\n.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {\n  display: none;\n}\n.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg {\n  display: block;\n}\n.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {\n  display: none;\n}\n.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {\n  display: block;\n}\n.tox input.tox-checkbox__input:focus + .tox-checkbox__icons {\n  border-radius: 3px;\n  box-shadow: inset 0 0 0 1px #0a8fe9;\n  padding: calc(2.5px - 1px);\n}\n.tox:not([dir=rtl]) .tox-checkbox__label {\n  margin-left: 2.5px;\n}\n.tox:not([dir=rtl]) .tox-checkbox__input {\n  left: -10000px;\n}\n.tox:not([dir=rtl]) .tox-bar .tox-checkbox {\n  margin-left: 2.5px;\n}\n.tox[dir=rtl] .tox-checkbox__label {\n  margin-right: 2.5px;\n}\n.tox[dir=rtl] .tox-checkbox__input {\n  right: -10000px;\n}\n.tox[dir=rtl] .tox-bar .tox-checkbox {\n  margin-right: 2.5px;\n}\n.tox {\n  /* stylelint-disable-next-line no-descending-specificity */\n}\n.tox .tox-collection--toolbar .tox-collection__group {\n  display: flex;\n  padding: 0;\n}\n.tox .tox-collection--grid .tox-collection__group {\n  display: flex;\n  flex-wrap: wrap;\n  max-height: 208px;\n  overflow-x: hidden;\n  overflow-y: auto;\n  padding: 0;\n}\n.tox .tox-collection--list .tox-collection__group {\n  border-bottom-width: 0;\n  border-color: #d9d9d9;\n  border-left-width: 0;\n  border-right-width: 0;\n  border-style: solid;\n  border-top-width: 1px;\n  padding: 2.5px 0;\n}\n.tox .tox-collection--list .tox-collection__group:first-child {\n  border-top-width: 0;\n}\n.tox .tox-collection__group-heading {\n  background-color: #f3f3f3;\n  color: rgba(84, 111, 94, 0.7);\n  cursor: default;\n  font-size: 12px;\n  font-style: normal;\n  font-weight: normal;\n  margin-bottom: 2.5px;\n  margin-top: -2.5px;\n  padding: 2.5px 5px;\n  text-transform: none;\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n.tox .tox-collection__item {\n  align-items: center;\n  color: rgba(84, 111, 94, 0.85);\n  cursor: pointer;\n  display: flex;\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n.tox .tox-collection--list .tox-collection__item {\n  padding: 2.5px 5px;\n}\n.tox .tox-collection--toolbar .tox-collection__item {\n  border-radius: 3px;\n  padding: 2.5px;\n}\n.tox .tox-collection--grid .tox-collection__item {\n  border-radius: 3px;\n  padding: 2.5px;\n}\n.tox .tox-collection--list .tox-collection__item--enabled {\n  background-color: #fff;\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-collection--list .tox-collection__item--active {\n  background-color: #e5e9e7;\n}\n.tox .tox-collection--toolbar .tox-collection__item--enabled {\n  background-color: #e5e9e7;\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-collection--toolbar .tox-collection__item--active {\n  background-color: #e5e9e7;\n}\n.tox .tox-collection--grid .tox-collection__item--enabled {\n  background-color: #e5e9e7;\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled) {\n  background-color: #e5e9e7;\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled) {\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled) {\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-collection__item-icon,\n.tox .tox-collection__item-checkmark {\n  align-items: center;\n  display: flex;\n  height: 24px;\n  justify-content: center;\n  width: 24px;\n}\n.tox .tox-collection__item-icon svg,\n.tox .tox-collection__item-checkmark svg {\n  fill: currentColor;\n}\n.tox .tox-collection--toolbar-lg .tox-collection__item-icon {\n  height: 48px;\n  width: 48px;\n}\n.tox .tox-collection__item-label {\n  color: currentColor;\n  display: inline-block;\n  flex: 1;\n  -ms-flex-preferred-size: auto;\n  font-size: 8.75px;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 24px;\n  text-transform: none;\n  word-break: break-all;\n}\n.tox .tox-collection__item-accessory {\n  color: rgba(84, 111, 94, 0.7);\n  display: inline-block;\n  font-size: 8.75px;\n  height: 24px;\n  line-height: 24px;\n  text-transform: none;\n}\n.tox .tox-collection__item-caret {\n  align-items: center;\n  display: flex;\n  min-height: 24px;\n}\n.tox .tox-collection__item-caret::after {\n  content: '';\n  font-size: 0;\n  min-height: inherit;\n}\n.tox .tox-collection__item-caret svg {\n  fill: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-collection__item--state-disabled {\n  background-color: transparent;\n  color: rgba(84, 111, 94, 0.5);\n  cursor: not-allowed;\n}\n.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg {\n  fill: rgba(84, 111, 94, 0.5);\n}\n.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg {\n  display: none;\n}\n.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory + .tox-collection__item-checkmark {\n  display: none;\n}\n.tox .tox-collection--horizontal {\n  background-color: #fff;\n  border: 1px solid #d9d9d9;\n  border-radius: 3px;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\n  display: flex;\n  flex: 0 0 auto;\n  flex-shrink: 0;\n  flex-wrap: nowrap;\n  margin-bottom: 0;\n  overflow-x: auto;\n  padding: 0;\n}\n.tox .tox-collection--horizontal .tox-collection__group {\n  align-items: center;\n  display: flex;\n  flex-wrap: nowrap;\n  margin: 0;\n  padding: 0 2.5px;\n}\n.tox .tox-collection--horizontal .tox-collection__item {\n  height: 34px;\n  margin: 2px 0 3px 0;\n  padding: 0 4px;\n}\n.tox .tox-collection--horizontal .tox-collection__item-label {\n  white-space: nowrap;\n}\n.tox .tox-collection--horizontal .tox-collection__item-caret {\n  margin-left: 4px;\n}\n.tox .tox-collection__item-container {\n  display: flex;\n}\n.tox .tox-collection__item-container--row {\n  align-items: center;\n  flex: 1 1 auto;\n  flex-direction: row;\n}\n.tox .tox-collection__item-container--row.tox-collection__item-container--align-left {\n  margin-right: auto;\n}\n.tox .tox-collection__item-container--row.tox-collection__item-container--align-right {\n  justify-content: flex-end;\n  margin-left: auto;\n}\n.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top {\n  align-items: flex-start;\n  margin-bottom: auto;\n}\n.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle {\n  align-items: center;\n}\n.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom {\n  align-items: flex-end;\n  margin-top: auto;\n}\n.tox .tox-collection__item-container--column {\n  -ms-grid-row-align: center;\n      align-self: center;\n  flex: 1 1 auto;\n  flex-direction: column;\n}\n.tox .tox-collection__item-container--column.tox-collection__item-container--align-left {\n  align-items: flex-start;\n}\n.tox .tox-collection__item-container--column.tox-collection__item-container--align-right {\n  align-items: flex-end;\n}\n.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top {\n  align-self: flex-start;\n}\n.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle {\n  -ms-grid-row-align: center;\n      align-self: center;\n}\n.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom {\n  align-self: flex-end;\n}\n.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type) {\n  border-right: 1px solid #d9d9d9;\n}\n.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > *:not(:first-child) {\n  margin-left: 5px;\n}\n.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child {\n  margin-left: 2.5px;\n}\n.tox:not([dir=rtl]) .tox-collection__item-accessory {\n  margin-left: 10px;\n  text-align: right;\n}\n.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret {\n  margin-left: 10px;\n}\n.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type) {\n  border-left: 1px solid #d9d9d9;\n}\n.tox[dir=rtl] .tox-collection--list .tox-collection__item > *:not(:first-child) {\n  margin-right: 5px;\n}\n.tox[dir=rtl] .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child {\n  margin-right: 2.5px;\n}\n.tox[dir=rtl] .tox-collection__item-accessory {\n  margin-right: 10px;\n  text-align: left;\n}\n.tox[dir=rtl] .tox-collection .tox-collection__item-caret {\n  margin-right: 10px;\n  transform: rotateY(180deg);\n}\n.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret {\n  margin-right: 4px;\n}\n.tox .tox-color-picker-container {\n  display: flex;\n  flex-direction: row;\n  height: 225px;\n  margin: 0;\n}\n.tox .tox-sv-palette {\n  box-sizing: border-box;\n  display: flex;\n  height: 100%;\n}\n.tox .tox-sv-palette-spectrum {\n  height: 100%;\n}\n.tox .tox-sv-palette,\n.tox .tox-sv-palette-spectrum {\n  width: 225px;\n}\n.tox .tox-sv-palette-thumb {\n  background: none;\n  border: 1px solid black;\n  border-radius: 50%;\n  box-sizing: content-box;\n  height: 12px;\n  position: absolute;\n  width: 12px;\n}\n.tox .tox-sv-palette-inner-thumb {\n  border: 1px solid white;\n  border-radius: 50%;\n  height: 10px;\n  position: absolute;\n  width: 10px;\n}\n.tox .tox-hue-slider {\n  box-sizing: border-box;\n  height: 100%;\n  width: 25px;\n}\n.tox .tox-hue-slider-spectrum {\n  background: linear-gradient(to bottom, #f00, #ff0080, #f0f, #8000ff, #00f, #0080ff, #0ff, #00ff80, #0f0, #80ff00, #ff0, #ff8000, #f00);\n  height: 100%;\n  width: 100%;\n}\n.tox .tox-hue-slider,\n.tox .tox-hue-slider-spectrum {\n  width: 20px;\n}\n.tox .tox-hue-slider-thumb {\n  background: white;\n  border: 1px solid black;\n  box-sizing: content-box;\n  height: 4px;\n  width: 100%;\n}\n.tox .tox-rgb-form {\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n}\n.tox .tox-rgb-form div {\n  align-items: center;\n  display: flex;\n  justify-content: space-between;\n  margin-bottom: 5px;\n  width: inherit;\n}\n.tox .tox-rgb-form input {\n  width: 6em;\n}\n.tox .tox-rgb-form input.tox-invalid {\n  /* Need !important to override Chrome's focus styling unfortunately */\n  border: 1px solid red !important;\n}\n.tox .tox-rgb-form .tox-rgba-preview {\n  border: 1px solid black;\n  flex-grow: 2;\n  margin-bottom: 0;\n}\n.tox:not([dir=rtl]) .tox-sv-palette {\n  margin-right: 15px;\n}\n.tox:not([dir=rtl]) .tox-hue-slider {\n  margin-right: 15px;\n}\n.tox:not([dir=rtl]) .tox-hue-slider-thumb {\n  margin-left: -1px;\n}\n.tox:not([dir=rtl]) .tox-rgb-form label {\n  margin-right: 0.5em;\n}\n.tox[dir=rtl] .tox-sv-palette {\n  margin-left: 15px;\n}\n.tox[dir=rtl] .tox-hue-slider {\n  margin-left: 15px;\n}\n.tox[dir=rtl] .tox-hue-slider-thumb {\n  margin-right: -1px;\n}\n.tox[dir=rtl] .tox-rgb-form label {\n  margin-left: 0.5em;\n}\n.tox .tox-toolbar .tox-swatches,\n.tox .tox-toolbar__primary .tox-swatches,\n.tox .tox-toolbar__overflow .tox-swatches {\n  margin: 2px 0 3px 4px;\n}\n.tox .tox-collection--list .tox-collection__group .tox-swatches-menu {\n  border: 0;\n  margin: -2.5px 0;\n}\n.tox .tox-swatches__row {\n  display: flex;\n}\n.tox .tox-swatch {\n  height: 30px;\n  transition: transform 0.15s, box-shadow 0.15s;\n  width: 30px;\n}\n.tox .tox-swatch:hover,\n.tox .tox-swatch:focus {\n  box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset;\n  transform: scale(0.8);\n}\n.tox .tox-swatch--remove {\n  align-items: center;\n  display: flex;\n  justify-content: center;\n}\n.tox .tox-swatch--remove svg path {\n  stroke: #e74c3c;\n}\n.tox .tox-swatches__picker-btn {\n  align-items: center;\n  background-color: transparent;\n  border: 0;\n  cursor: pointer;\n  display: flex;\n  height: 30px;\n  justify-content: center;\n  outline: none;\n  padding: 0;\n  width: 30px;\n}\n.tox .tox-swatches__picker-btn svg {\n  height: 24px;\n  width: 24px;\n}\n.tox .tox-swatches__picker-btn:hover {\n  background: #e5e9e7;\n}\n.tox:not([dir=rtl]) .tox-swatches__picker-btn {\n  margin-left: auto;\n}\n.tox[dir=rtl] .tox-swatches__picker-btn {\n  margin-right: auto;\n}\n.tox .tox-comment-thread {\n  background: #fff;\n  position: relative;\n}\n.tox .tox-comment-thread > *:not(:first-child) {\n  margin-top: 5px;\n}\n.tox .tox-comment {\n  background: #fff;\n  border: 1px solid #d9d9d9;\n  border-radius: 3px;\n  box-shadow: 0 4px 8px 0 rgba(84, 111, 94, 0.1);\n  padding: 5px 5px 10px 5px;\n  position: relative;\n}\n.tox .tox-comment__header {\n  align-items: center;\n  color: rgba(84, 111, 94, 0.85);\n  display: flex;\n  justify-content: space-between;\n}\n.tox .tox-comment__date {\n  color: rgba(84, 111, 94, 0.7);\n  font-size: 12px;\n}\n.tox .tox-comment__body {\n  color: rgba(84, 111, 94, 0.85);\n  font-size: 8.75px;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1.3;\n  margin-top: 5px;\n  position: relative;\n  text-transform: initial;\n}\n.tox .tox-comment__body textarea {\n  resize: none;\n  white-space: normal;\n  width: 100%;\n}\n.tox .tox-comment__expander {\n  padding-top: 5px;\n}\n.tox .tox-comment__expander p {\n  color: rgba(84, 111, 94, 0.7);\n  font-size: 8.75px;\n  font-style: normal;\n}\n.tox .tox-comment__body p {\n  margin: 0;\n}\n.tox .tox-comment__buttonspacing {\n  padding-top: 10px;\n  text-align: center;\n}\n.tox .tox-comment-thread__overlay::after {\n  background: #fff;\n  bottom: 0;\n  content: \"\";\n  display: flex;\n  left: 0;\n  opacity: 0.9;\n  position: absolute;\n  right: 0;\n  top: 0;\n  z-index: 5;\n}\n.tox .tox-comment__reply {\n  display: flex;\n  flex-shrink: 0;\n  flex-wrap: wrap;\n  justify-content: flex-end;\n  margin-top: 5px;\n}\n.tox .tox-comment__reply > *:first-child {\n  margin-bottom: 5px;\n  width: 100%;\n}\n.tox .tox-comment__edit {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-end;\n  margin-top: 10px;\n}\n.tox .tox-comment__gradient::after {\n  background: linear-gradient(rgba(255, 255, 255, 0), #fff);\n  bottom: 0;\n  content: \"\";\n  display: block;\n  height: 5em;\n  margin-top: -40px;\n  position: absolute;\n  width: 100%;\n}\n.tox .tox-comment__overlay {\n  background: #fff;\n  bottom: 0;\n  display: flex;\n  flex-direction: column;\n  flex-grow: 1;\n  left: 0;\n  opacity: 0.9;\n  position: absolute;\n  right: 0;\n  text-align: center;\n  top: 0;\n  z-index: 5;\n}\n.tox .tox-comment__loading-text {\n  align-items: center;\n  color: rgba(84, 111, 94, 0.85);\n  display: flex;\n  flex-direction: column;\n  position: relative;\n}\n.tox .tox-comment__loading-text > div {\n  padding-bottom: 10px;\n}\n.tox .tox-comment__overlaytext {\n  bottom: 0;\n  flex-direction: column;\n  font-size: 8.75px;\n  left: 0;\n  padding: 1em;\n  position: absolute;\n  right: 0;\n  top: 0;\n  z-index: 10;\n}\n.tox .tox-comment__overlaytext p {\n  background-color: #fff;\n  box-shadow: 0 0 8px 8px #fff;\n  color: rgba(84, 111, 94, 0.85);\n  text-align: center;\n}\n.tox .tox-comment__overlaytext div:nth-of-type(2) {\n  font-size: 0.8em;\n}\n.tox .tox-comment__busy-spinner {\n  align-items: center;\n  background-color: #fff;\n  bottom: 0;\n  display: flex;\n  justify-content: center;\n  left: 0;\n  position: absolute;\n  right: 0;\n  top: 0;\n  z-index: 20;\n}\n.tox .tox-comment__scroll {\n  display: flex;\n  flex-direction: column;\n  flex-shrink: 1;\n  overflow: auto;\n}\n.tox .tox-conversations {\n  margin: 5px;\n}\n.tox:not([dir=rtl]) .tox-comment__edit {\n  margin-left: 5px;\n}\n.tox:not([dir=rtl]) .tox-comment__buttonspacing > *:last-child,\n.tox:not([dir=rtl]) .tox-comment__edit > *:last-child,\n.tox:not([dir=rtl]) .tox-comment__reply > *:last-child {\n  margin-left: 5px;\n}\n.tox[dir=rtl] .tox-comment__edit {\n  margin-right: 5px;\n}\n.tox[dir=rtl] .tox-comment__buttonspacing > *:last-child,\n.tox[dir=rtl] .tox-comment__edit > *:last-child,\n.tox[dir=rtl] .tox-comment__reply > *:last-child {\n  margin-right: 5px;\n}\n.tox .tox-user {\n  align-items: center;\n  display: flex;\n}\n.tox .tox-user__avatar svg {\n  fill: rgba(84, 111, 94, 0.7);\n}\n.tox .tox-user__name {\n  color: rgba(84, 111, 94, 0.7);\n  font-size: 12px;\n  font-style: normal;\n  font-weight: normal;\n  text-transform: uppercase;\n}\n.tox:not([dir=rtl]) .tox-user__avatar svg {\n  margin-right: 5px;\n}\n.tox:not([dir=rtl]) .tox-user__avatar + .tox-user__name {\n  margin-left: 5px;\n}\n.tox[dir=rtl] .tox-user__avatar svg {\n  margin-left: 5px;\n}\n.tox[dir=rtl] .tox-user__avatar + .tox-user__name {\n  margin-right: 5px;\n}\n.tox .tox-dialog-wrap {\n  align-items: center;\n  bottom: 0;\n  display: flex;\n  justify-content: center;\n  left: 0;\n  position: fixed;\n  right: 0;\n  top: 0;\n  z-index: 1100;\n}\n.tox .tox-dialog-wrap__backdrop {\n  background-color: rgba(255, 255, 255, 0.75);\n  bottom: 0;\n  left: 0;\n  position: absolute;\n  right: 0;\n  top: 0;\n  z-index: 1;\n}\n.tox .tox-dialog-wrap__backdrop--opaque {\n  background-color: #fff;\n}\n.tox .tox-dialog {\n  background-color: #fff;\n  border-color: #d9d9d9;\n  border-radius: 3px;\n  border-style: solid;\n  border-width: 1px;\n  box-shadow: 0 16px 16px -10px rgba(84, 111, 94, 0.15), 0 0 40px 1px rgba(84, 111, 94, 0.15);\n  display: flex;\n  flex-direction: column;\n  max-height: 100%;\n  max-width: 480px;\n  overflow: hidden;\n  position: relative;\n  width: 95vw;\n  z-index: 2;\n}\n@media only screen and (max-width:767px) {\n  body:not(.tox-force-desktop) .tox .tox-dialog {\n    align-self: flex-start;\n    margin: 5px auto;\n    width: calc(100vw - 10px);\n  }\n}\n.tox .tox-dialog-inline {\n  z-index: 1100;\n}\n.tox .tox-dialog__header {\n  align-items: center;\n  background-color: #fff;\n  border-bottom: none;\n  color: rgba(84, 111, 94, 0.85);\n  display: flex;\n  font-size: 10px;\n  justify-content: space-between;\n  padding: 5px 10px 0 10px;\n  position: relative;\n}\n.tox .tox-dialog__header .tox-button {\n  z-index: 1;\n}\n.tox .tox-dialog__draghandle {\n  cursor: grab;\n  height: 100%;\n  left: 0;\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.tox .tox-dialog__draghandle:active {\n  cursor: grabbing;\n}\n.tox .tox-dialog__dismiss {\n  margin-left: auto;\n}\n.tox .tox-dialog__title {\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n  font-size: 12.5px;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1.3;\n  margin: 0;\n  text-transform: none;\n}\n.tox .tox-dialog__body {\n  color: rgba(84, 111, 94, 0.85);\n  display: flex;\n  flex: 1;\n  -ms-flex-preferred-size: auto;\n  font-size: 10px;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1.3;\n  min-width: 0;\n  text-align: left;\n  text-transform: none;\n}\n@media only screen and (max-width:767px) {\n  body:not(.tox-force-desktop) .tox .tox-dialog__body {\n    flex-direction: column;\n  }\n}\n.tox .tox-dialog__body-nav {\n  align-items: flex-start;\n  display: flex;\n  flex-direction: column;\n  padding: 10px 10px;\n}\n@media only screen and (max-width:767px) {\n  body:not(.tox-force-desktop) .tox .tox-dialog__body-nav {\n    flex-direction: row;\n    -webkit-overflow-scrolling: touch;\n    overflow-x: auto;\n    padding-bottom: 0;\n  }\n}\n.tox .tox-dialog__body-nav-item {\n  border-bottom: 2px solid transparent;\n  color: rgba(84, 111, 94, 0.7);\n  display: inline-block;\n  font-size: 8.75px;\n  line-height: 1.3;\n  margin-bottom: 5px;\n  text-decoration: none;\n  white-space: nowrap;\n}\n.tox .tox-dialog__body-nav-item:focus {\n  background-color: rgba(10, 143, 233, 0.1);\n}\n.tox .tox-dialog__body-nav-item--active {\n  border-bottom: 2px solid #0a8fe9;\n  color: #0a8fe9;\n}\n.tox .tox-dialog__body-content {\n  box-sizing: border-box;\n  display: flex;\n  flex: 1;\n  flex-direction: column;\n  -ms-flex-preferred-size: auto;\n  max-height: 650px;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n  padding: 10px 10px;\n}\n.tox .tox-dialog__body-content > * {\n  margin-bottom: 0;\n  margin-top: 10px;\n}\n.tox .tox-dialog__body-content > *:first-child {\n  margin-top: 0;\n}\n.tox .tox-dialog__body-content > *:last-child {\n  margin-bottom: 0;\n}\n.tox .tox-dialog__body-content > *:only-child {\n  margin-bottom: 0;\n  margin-top: 0;\n}\n.tox .tox-dialog__body-content a {\n  color: #0a8fe9;\n  cursor: pointer;\n  text-decoration: none;\n}\n.tox .tox-dialog__body-content a:hover,\n.tox .tox-dialog__body-content a:focus {\n  color: #0871b8;\n  text-decoration: none;\n}\n.tox .tox-dialog__body-content a:active {\n  color: #0871b8;\n  text-decoration: none;\n}\n.tox .tox-dialog__body-content svg {\n  fill: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-dialog__body-content ul {\n  display: block;\n  list-style-type: disc;\n  margin-bottom: 10px;\n  -webkit-margin-end: 0;\n          margin-inline-end: 0;\n  -webkit-margin-start: 0;\n          margin-inline-start: 0;\n  -webkit-padding-start: 2.5rem;\n          padding-inline-start: 2.5rem;\n}\n.tox .tox-dialog__body-content .tox-form__group h1 {\n  color: rgba(84, 111, 94, 0.85);\n  font-size: 12.5px;\n  font-style: normal;\n  font-weight: normal;\n  letter-spacing: normal;\n  margin-bottom: 10px;\n  margin-top: 2rem;\n  text-transform: none;\n}\n.tox .tox-dialog__body-content .tox-form__group h2 {\n  color: rgba(84, 111, 94, 0.85);\n  font-size: 10px;\n  font-style: normal;\n  font-weight: normal;\n  letter-spacing: normal;\n  margin-bottom: 10px;\n  margin-top: 2rem;\n  text-transform: none;\n}\n.tox .tox-dialog__body-content .tox-form__group p {\n  margin-bottom: 10px;\n}\n.tox .tox-dialog__body-content .tox-form__group h1:first-child,\n.tox .tox-dialog__body-content .tox-form__group h2:first-child,\n.tox .tox-dialog__body-content .tox-form__group p:first-child {\n  margin-top: 0;\n}\n.tox .tox-dialog__body-content .tox-form__group h1:last-child,\n.tox .tox-dialog__body-content .tox-form__group h2:last-child,\n.tox .tox-dialog__body-content .tox-form__group p:last-child {\n  margin-bottom: 0;\n}\n.tox .tox-dialog__body-content .tox-form__group h1:only-child,\n.tox .tox-dialog__body-content .tox-form__group h2:only-child,\n.tox .tox-dialog__body-content .tox-form__group p:only-child {\n  margin-bottom: 0;\n  margin-top: 0;\n}\n.tox .tox-dialog--width-lg {\n  height: 650px;\n  max-width: 1200px;\n}\n.tox .tox-dialog--width-md {\n  max-width: 800px;\n}\n.tox .tox-dialog--width-md .tox-dialog__body-content {\n  overflow: auto;\n}\n.tox .tox-dialog__body-content--centered {\n  text-align: center;\n}\n.tox .tox-dialog__footer {\n  align-items: center;\n  background-color: #fff;\n  border-top: 1px solid #d9d9d9;\n  display: flex;\n  justify-content: space-between;\n  padding: 5px 10px;\n}\n.tox .tox-dialog__footer-start,\n.tox .tox-dialog__footer-end {\n  display: flex;\n}\n.tox .tox-dialog__busy-spinner {\n  align-items: center;\n  background-color: rgba(255, 255, 255, 0.75);\n  bottom: 0;\n  display: flex;\n  justify-content: center;\n  left: 0;\n  position: absolute;\n  right: 0;\n  top: 0;\n  z-index: 3;\n}\n.tox .tox-dialog__table {\n  border-collapse: collapse;\n  width: 100%;\n}\n.tox .tox-dialog__table thead th {\n  font-weight: normal;\n  padding-bottom: 5px;\n}\n.tox .tox-dialog__table tbody tr {\n  border-bottom: 1px solid #d9d9d9;\n}\n.tox .tox-dialog__table tbody tr:last-child {\n  border-bottom: none;\n}\n.tox .tox-dialog__table td {\n  padding-bottom: 5px;\n  padding-top: 5px;\n}\n.tox .tox-dialog__popups {\n  position: absolute;\n  width: 100%;\n  z-index: 1100;\n}\n.tox .tox-dialog__body-iframe {\n  display: flex;\n  flex: 1;\n  flex-direction: column;\n  -ms-flex-preferred-size: auto;\n}\n.tox .tox-dialog__body-iframe .tox-navobj {\n  display: flex;\n  flex: 1;\n  -ms-flex-preferred-size: auto;\n}\n.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2) {\n  flex: 1;\n  -ms-flex-preferred-size: auto;\n  height: 100%;\n}\n.tox .tox-dialog-dock-fadeout {\n  opacity: 0;\n  visibility: hidden;\n}\n.tox .tox-dialog-dock-fadein {\n  opacity: 1;\n  visibility: visible;\n}\n.tox .tox-dialog-dock-transition {\n  transition: visibility 0s linear 0.3s, opacity 0.3s ease;\n}\n.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein {\n  transition-delay: 0s;\n}\n.tox.tox-platform-ie {\n  /* IE11 CSS styles go here */\n}\n.tox.tox-platform-ie .tox-dialog-wrap {\n  position: -ms-device-fixed;\n}\n@media only screen and (max-width:767px) {\n  body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav {\n    margin-right: 0;\n  }\n}\n@media only screen and (max-width:767px) {\n  body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child) {\n    margin-left: 5px;\n  }\n}\n.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start > *,\n.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end > * {\n  margin-left: 5px;\n}\n.tox[dir=rtl] .tox-dialog__body {\n  text-align: right;\n}\n@media only screen and (max-width:767px) {\n  body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav {\n    margin-left: 0;\n  }\n}\n@media only screen and (max-width:767px) {\n  body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child) {\n    margin-right: 5px;\n  }\n}\n.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start > *,\n.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end > * {\n  margin-right: 5px;\n}\nbody.tox-dialog__disable-scroll {\n  overflow: hidden;\n}\n.tox .tox-dropzone-container {\n  display: flex;\n  flex: 1;\n  -ms-flex-preferred-size: auto;\n}\n.tox .tox-dropzone {\n  align-items: center;\n  background: #fff;\n  border: 2px dashed #d9d9d9;\n  box-sizing: border-box;\n  display: flex;\n  flex-direction: column;\n  flex-grow: 1;\n  justify-content: center;\n  min-height: 100px;\n  padding: 10px;\n}\n.tox .tox-dropzone p {\n  color: rgba(84, 111, 94, 0.7);\n  margin: 0 0 10px 0;\n}\n.tox .tox-edit-area {\n  display: flex;\n  flex: 1;\n  -ms-flex-preferred-size: auto;\n  overflow: hidden;\n  position: relative;\n}\n.tox .tox-edit-area__iframe {\n  background-color: #fff;\n  border: 0;\n  box-sizing: border-box;\n  flex: 1;\n  -ms-flex-preferred-size: auto;\n  height: 100%;\n  position: absolute;\n  width: 100%;\n}\n.tox.tox-inline-edit-area {\n  border: 1px dotted #d9d9d9;\n}\n.tox .tox-editor-container {\n  display: flex;\n  flex: 1 1 auto;\n  flex-direction: column;\n  overflow: hidden;\n}\n.tox .tox-editor-header {\n  z-index: 1;\n}\n.tox:not(.tox-tinymce-inline) .tox-editor-header {\n  box-shadow: none;\n  transition: box-shadow 0.5s;\n}\n.tox.tox-tinymce--toolbar-bottom .tox-editor-header,\n.tox.tox-tinymce-inline .tox-editor-header {\n  margin-bottom: -1px;\n}\n.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header {\n  background-color: transparent;\n  box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25);\n}\n.tox-editor-dock-fadeout {\n  opacity: 0;\n  visibility: hidden;\n}\n.tox-editor-dock-fadein {\n  opacity: 1;\n  visibility: visible;\n}\n.tox-editor-dock-transition {\n  transition: visibility 0s linear 0.25s, opacity 0.25s ease;\n}\n.tox-editor-dock-transition.tox-editor-dock-fadein {\n  transition-delay: 0s;\n}\n.tox .tox-control-wrap {\n  flex: 1;\n  position: relative;\n}\n.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,\n.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,\n.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid {\n  display: none;\n}\n.tox .tox-control-wrap svg {\n  display: block;\n}\n.tox .tox-control-wrap__status-icon-wrap {\n  position: absolute;\n  top: 50%;\n  transform: translateY(-50%);\n}\n.tox .tox-control-wrap__status-icon-invalid svg {\n  fill: #c00;\n}\n.tox .tox-control-wrap__status-icon-unknown svg {\n  fill: orange;\n}\n.tox .tox-control-wrap__status-icon-valid svg {\n  fill: green;\n}\n.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,\n.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,\n.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield {\n  padding-right: 20px;\n}\n.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap {\n  right: 2.5px;\n}\n.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,\n.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,\n.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield {\n  padding-left: 20px;\n}\n.tox[dir=rtl] .tox-control-wrap__status-icon-wrap {\n  left: 2.5px;\n}\n.tox .tox-autocompleter {\n  max-width: 25em;\n}\n.tox .tox-autocompleter .tox-menu {\n  max-width: 25em;\n}\n.tox .tox-autocompleter .tox-autocompleter-highlight {\n  font-weight: normal;\n}\n.tox .tox-color-input {\n  display: flex;\n  position: relative;\n  z-index: 1;\n}\n.tox .tox-color-input .tox-textfield {\n  z-index: -1;\n}\n.tox .tox-color-input span {\n  border-color: rgba(84, 111, 94, 0.2);\n  border-radius: 3px;\n  border-style: solid;\n  border-width: 1px;\n  box-shadow: none;\n  box-sizing: border-box;\n  height: 24px;\n  position: absolute;\n  top: 6px;\n  width: 24px;\n}\n.tox .tox-color-input span:hover:not([aria-disabled=true]),\n.tox .tox-color-input span:focus:not([aria-disabled=true]) {\n  border-color: #0a8fe9;\n  cursor: pointer;\n}\n.tox .tox-color-input span::before {\n  background-image: linear-gradient(45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), linear-gradient(-45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%), linear-gradient(-45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%);\n  background-position: 0 0, 0 6px, 6px -6px, -6px 0;\n  background-size: 12px 12px;\n  border: 1px solid #fff;\n  border-radius: 3px;\n  box-sizing: border-box;\n  content: '';\n  height: 24px;\n  left: -1px;\n  position: absolute;\n  top: -1px;\n  width: 24px;\n  z-index: -1;\n}\n.tox .tox-color-input span[aria-disabled=true] {\n  cursor: not-allowed;\n}\n.tox:not([dir=rtl]) .tox-color-input {\n  /* stylelint-disable-next-line no-descending-specificity */\n}\n.tox:not([dir=rtl]) .tox-color-input .tox-textfield {\n  padding-left: 36px;\n}\n.tox:not([dir=rtl]) .tox-color-input span {\n  left: 6px;\n}\n.tox[dir=\"rtl\"] .tox-color-input {\n  /* stylelint-disable-next-line no-descending-specificity */\n}\n.tox[dir=\"rtl\"] .tox-color-input .tox-textfield {\n  padding-right: 36px;\n}\n.tox[dir=\"rtl\"] .tox-color-input span {\n  right: 6px;\n}\n.tox .tox-label,\n.tox .tox-toolbar-label {\n  color: rgba(84, 111, 94, 0.7);\n  display: block;\n  font-size: 8.75px;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1.3;\n  padding: 0 5px 0 0;\n  text-transform: none;\n  white-space: nowrap;\n}\n.tox .tox-toolbar-label {\n  padding: 0 5px;\n}\n.tox[dir=rtl] .tox-label {\n  padding: 0 0 0 5px;\n}\n.tox .tox-form {\n  display: flex;\n  flex: 1;\n  flex-direction: column;\n  -ms-flex-preferred-size: auto;\n}\n.tox .tox-form__group {\n  box-sizing: border-box;\n  margin-bottom: 2.5px;\n}\n.tox .tox-form-group--maximize {\n  flex: 1;\n}\n.tox .tox-form__group--error {\n  color: #c00;\n}\n.tox .tox-form__group--collection {\n  display: flex;\n}\n.tox .tox-form__grid {\n  display: flex;\n  flex-direction: row;\n  flex-wrap: wrap;\n  justify-content: space-between;\n}\n.tox .tox-form__grid--2col > .tox-form__group {\n  width: calc(50% - (5px / 2));\n}\n.tox .tox-form__grid--3col > .tox-form__group {\n  width: calc(100% / 3 - (5px / 2));\n}\n.tox .tox-form__grid--4col > .tox-form__group {\n  width: calc(25% - (5px / 2));\n}\n.tox .tox-form__controls-h-stack {\n  align-items: center;\n  display: flex;\n}\n.tox .tox-form__group--inline {\n  align-items: center;\n  display: flex;\n}\n.tox .tox-form__group--stretched {\n  display: flex;\n  flex: 1;\n  flex-direction: column;\n  -ms-flex-preferred-size: auto;\n}\n.tox .tox-form__group--stretched .tox-textarea {\n  flex: 1;\n  -ms-flex-preferred-size: auto;\n}\n.tox .tox-form__group--stretched .tox-navobj {\n  display: flex;\n  flex: 1;\n  -ms-flex-preferred-size: auto;\n}\n.tox .tox-form__group--stretched .tox-navobj :nth-child(2) {\n  flex: 1;\n  -ms-flex-preferred-size: auto;\n  height: 100%;\n}\n.tox:not([dir=rtl]) .tox-form__controls-h-stack > *:not(:first-child) {\n  margin-left: 2.5px;\n}\n.tox[dir=rtl] .tox-form__controls-h-stack > *:not(:first-child) {\n  margin-right: 2.5px;\n}\n.tox .tox-lock.tox-locked .tox-lock-icon__unlock,\n.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock {\n  display: none;\n}\n.tox .tox-textfield,\n.tox .tox-toolbar-textfield,\n.tox .tox-listboxfield .tox-listbox--select,\n.tox .tox-textarea {\n  -webkit-appearance: none;\n     -moz-appearance: none;\n          appearance: none;\n  background-color: #fff;\n  border-color: #d9d9d9;\n  border-radius: 3px;\n  border-style: solid;\n  border-width: 1px;\n  box-shadow: none;\n  box-sizing: border-box;\n  color: rgba(84, 111, 94, 0.85);\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n  font-size: 10px;\n  line-height: 24px;\n  margin: 0;\n  min-height: 34px;\n  outline: none;\n  padding: 5px 3.25px;\n  resize: none;\n  width: 100%;\n}\n.tox .tox-textfield[disabled],\n.tox .tox-textarea[disabled] {\n  background-color: #f2f2f2;\n  color: rgba(84, 111, 94, 0.85);\n  cursor: not-allowed;\n}\n.tox .tox-textfield:focus,\n.tox .tox-listboxfield .tox-listbox--select:focus,\n.tox .tox-textarea:focus {\n  background-color: #fff;\n  border-color: #0a8fe9;\n  box-shadow: none;\n  outline: none;\n}\n.tox .tox-toolbar-textfield {\n  border-width: 0;\n  margin-bottom: 3px;\n  margin-top: 2px;\n  max-width: 250px;\n}\n.tox .tox-naked-btn {\n  background-color: transparent;\n  border: 0;\n  border-color: transparent;\n  box-shadow: unset;\n  color: #0a8fe9;\n  cursor: pointer;\n  display: block;\n  margin: 0;\n  padding: 0;\n}\n.tox .tox-naked-btn svg {\n  display: block;\n  fill: rgba(84, 111, 94, 0.85);\n}\n.tox:not([dir=rtl]) .tox-toolbar-textfield + * {\n  margin-left: 2.5px;\n}\n.tox[dir=rtl] .tox-toolbar-textfield + * {\n  margin-right: 2.5px;\n}\n.tox .tox-listboxfield {\n  cursor: pointer;\n  position: relative;\n}\n.tox .tox-listboxfield .tox-listbox--select[disabled] {\n  background-color: #f2f2f2;\n  color: rgba(84, 111, 94, 0.85);\n  cursor: not-allowed;\n}\n.tox .tox-listbox__select-label {\n  cursor: default;\n  flex: 1;\n  margin: 0 4px;\n}\n.tox .tox-listbox__select-chevron {\n  align-items: center;\n  display: flex;\n  justify-content: center;\n  width: 10px;\n}\n.tox .tox-listbox__select-chevron svg {\n  fill: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-listboxfield .tox-listbox--select {\n  align-items: center;\n  display: flex;\n}\n.tox:not([dir=rtl]) .tox-listboxfield svg {\n  right: 5px;\n}\n.tox[dir=rtl] .tox-listboxfield svg {\n  left: 5px;\n}\n.tox .tox-selectfield {\n  cursor: pointer;\n  position: relative;\n}\n.tox .tox-selectfield select {\n  -webkit-appearance: none;\n     -moz-appearance: none;\n          appearance: none;\n  background-color: #fff;\n  border-color: #d9d9d9;\n  border-radius: 3px;\n  border-style: solid;\n  border-width: 1px;\n  box-shadow: none;\n  box-sizing: border-box;\n  color: rgba(84, 111, 94, 0.85);\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n  font-size: 10px;\n  line-height: 24px;\n  margin: 0;\n  min-height: 34px;\n  outline: none;\n  padding: 5px 3.25px;\n  resize: none;\n  width: 100%;\n}\n.tox .tox-selectfield select[disabled] {\n  background-color: #f2f2f2;\n  color: rgba(84, 111, 94, 0.85);\n  cursor: not-allowed;\n}\n.tox .tox-selectfield select::-ms-expand {\n  display: none;\n}\n.tox .tox-selectfield select:focus {\n  background-color: #fff;\n  border-color: #0a8fe9;\n  box-shadow: none;\n  outline: none;\n}\n.tox .tox-selectfield svg {\n  pointer-events: none;\n  position: absolute;\n  top: 50%;\n  transform: translateY(-50%);\n}\n.tox:not([dir=rtl]) .tox-selectfield select[size=\"0\"],\n.tox:not([dir=rtl]) .tox-selectfield select[size=\"1\"] {\n  padding-right: 15px;\n}\n.tox:not([dir=rtl]) .tox-selectfield svg {\n  right: 5px;\n}\n.tox[dir=rtl] .tox-selectfield select[size=\"0\"],\n.tox[dir=rtl] .tox-selectfield select[size=\"1\"] {\n  padding-left: 15px;\n}\n.tox[dir=rtl] .tox-selectfield svg {\n  left: 5px;\n}\n.tox .tox-textarea {\n  -webkit-appearance: textarea;\n     -moz-appearance: textarea;\n          appearance: textarea;\n  white-space: pre-wrap;\n}\n.tox-fullscreen {\n  border: 0;\n  height: 100%;\n  left: 0;\n  margin: 0;\n  overflow: hidden;\n  -ms-scroll-chaining: none;\n      overscroll-behavior: none;\n  padding: 0;\n  position: fixed;\n  top: 0;\n  touch-action: pinch-zoom;\n  width: 100%;\n}\n.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle {\n  display: none;\n}\n.tox.tox-tinymce.tox-fullscreen {\n  background-color: transparent;\n  z-index: 1200;\n}\n.tox-shadowhost.tox-fullscreen {\n  z-index: 1200;\n}\n.tox-fullscreen .tox.tox-tinymce-aux,\n.tox-fullscreen ~ .tox.tox-tinymce-aux {\n  z-index: 1201;\n}\n.tox .tox-help__more-link {\n  list-style: none;\n  margin-top: 1em;\n}\n.tox .tox-image-tools {\n  width: 100%;\n}\n.tox .tox-image-tools__toolbar {\n  align-items: center;\n  display: flex;\n  justify-content: center;\n}\n.tox .tox-image-tools__image {\n  background-color: #666;\n  height: 380px;\n  overflow: auto;\n  position: relative;\n  width: 100%;\n}\n.tox .tox-image-tools__image,\n.tox .tox-image-tools__image + .tox-image-tools__toolbar {\n  margin-top: 5px;\n}\n.tox .tox-image-tools__image-bg {\n  background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==);\n}\n.tox .tox-image-tools__toolbar > .tox-spacer {\n  flex: 1;\n  -ms-flex-preferred-size: auto;\n}\n.tox .tox-croprect-block {\n  background: black;\n  filter: alpha(opacity=50);\n  opacity: 0.5;\n  position: absolute;\n  zoom: 1;\n}\n.tox .tox-croprect-handle {\n  border: 2px solid white;\n  height: 20px;\n  left: 0;\n  position: absolute;\n  top: 0;\n  width: 20px;\n}\n.tox .tox-croprect-handle-move {\n  border: 0;\n  cursor: move;\n  position: absolute;\n}\n.tox .tox-croprect-handle-nw {\n  border-width: 2px 0 0 2px;\n  cursor: nw-resize;\n  left: 100px;\n  margin: -2px 0 0 -2px;\n  top: 100px;\n}\n.tox .tox-croprect-handle-ne {\n  border-width: 2px 2px 0 0;\n  cursor: ne-resize;\n  left: 200px;\n  margin: -2px 0 0 -20px;\n  top: 100px;\n}\n.tox .tox-croprect-handle-sw {\n  border-width: 0 0 2px 2px;\n  cursor: sw-resize;\n  left: 100px;\n  margin: -20px 2px 0 -2px;\n  top: 200px;\n}\n.tox .tox-croprect-handle-se {\n  border-width: 0 2px 2px 0;\n  cursor: se-resize;\n  left: 200px;\n  margin: -20px 0 0 -20px;\n  top: 200px;\n}\n.tox:not([dir=rtl]) .tox-image-tools__toolbar > .tox-slider:not(:first-of-type) {\n  margin-left: 5px;\n}\n.tox:not([dir=rtl]) .tox-image-tools__toolbar > .tox-button + .tox-slider {\n  margin-left: 20px;\n}\n.tox:not([dir=rtl]) .tox-image-tools__toolbar > .tox-slider + .tox-button {\n  margin-left: 20px;\n}\n.tox[dir=rtl] .tox-image-tools__toolbar > .tox-slider:not(:first-of-type) {\n  margin-right: 5px;\n}\n.tox[dir=rtl] .tox-image-tools__toolbar > .tox-button + .tox-slider {\n  margin-right: 20px;\n}\n.tox[dir=rtl] .tox-image-tools__toolbar > .tox-slider + .tox-button {\n  margin-right: 20px;\n}\n.tox .tox-insert-table-picker {\n  display: flex;\n  flex-wrap: wrap;\n  width: 110px;\n}\n.tox .tox-insert-table-picker > div {\n  border-color: #d9d9d9;\n  border-style: solid;\n  border-width: 0 1px 1px 0;\n  box-sizing: border-box;\n  height: 11px;\n  width: 11px;\n}\n.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker {\n  margin: -2.5px 0;\n}\n.tox .tox-insert-table-picker .tox-insert-table-picker__selected {\n  background-color: rgba(10, 143, 233, 0.5);\n  border-color: rgba(10, 143, 233, 0.5);\n}\n.tox .tox-insert-table-picker__label {\n  color: rgba(84, 111, 94, 0.7);\n  display: block;\n  font-size: 8.75px;\n  padding: 2.5px;\n  text-align: center;\n  width: 100%;\n}\n.tox:not([dir=rtl]) {\n  /* stylelint-disable-next-line no-descending-specificity */\n}\n.tox:not([dir=rtl]) .tox-insert-table-picker > div:nth-child(10n) {\n  border-right: 0;\n}\n.tox[dir=rtl] {\n  /* stylelint-disable-next-line no-descending-specificity */\n}\n.tox[dir=rtl] .tox-insert-table-picker > div:nth-child(10n+1) {\n  border-right: 0;\n}\n.tox {\n  /* stylelint-disable */\n  /* stylelint-enable */\n}\n.tox .tox-menu {\n  background-color: #fff;\n  border: 1px solid #d9d9d9;\n  border-radius: 3px;\n  box-shadow: 0 4px 8px 0 rgba(84, 111, 94, 0.1);\n  display: inline-block;\n  overflow: hidden;\n  vertical-align: top;\n  z-index: 1150;\n}\n.tox .tox-menu.tox-collection.tox-collection--list {\n  padding: 0;\n}\n.tox .tox-menu.tox-collection.tox-collection--toolbar {\n  padding: 2.5px;\n}\n.tox .tox-menu.tox-collection.tox-collection--grid {\n  padding: 2.5px;\n}\n.tox .tox-menu__label h1,\n.tox .tox-menu__label h2,\n.tox .tox-menu__label h3,\n.tox .tox-menu__label h4,\n.tox .tox-menu__label h5,\n.tox .tox-menu__label h6,\n.tox .tox-menu__label p,\n.tox .tox-menu__label blockquote,\n.tox .tox-menu__label code {\n  margin: 0;\n}\n.tox .tox-menubar {\n  background: url(\"data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23d9d9d9'/%3E%3C/svg%3E\") left 0 top 0 #fff;\n  background-color: #fff;\n  display: flex;\n  flex: 0 0 auto;\n  flex-shrink: 0;\n  flex-wrap: wrap;\n  padding: 0 4px 0 4px;\n}\n.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar {\n  border-top: 1px solid #d9d9d9;\n}\n/* Deprecated. Remove in next major release */\n.tox .tox-mbtn {\n  align-items: center;\n  background: transparent;\n  border: 0;\n  border-radius: 3px;\n  box-shadow: none;\n  color: #817f7c;\n  display: flex;\n  flex: 0 0 auto;\n  font-size: 8.75px;\n  font-style: normal;\n  font-weight: normal;\n  height: 34px;\n  justify-content: center;\n  margin: 2px 0 3px 0;\n  outline: none;\n  overflow: hidden;\n  padding: 0 4px;\n  text-transform: none;\n  width: auto;\n}\n.tox .tox-mbtn[disabled] {\n  background-color: transparent;\n  border: 0;\n  box-shadow: none;\n  color: rgba(129, 127, 124, 0.5);\n  cursor: not-allowed;\n}\n.tox .tox-mbtn:focus:not(:disabled) {\n  background: #e5e9e7;\n  border: 0;\n  box-shadow: none;\n  color: #0a9fe5;\n}\n.tox .tox-mbtn--active {\n  background: #e5e9e7;\n  border: 0;\n  box-shadow: none;\n  color: rgba(41, 159, 250, 0.88);\n}\n.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active) {\n  background: #e5e9e7;\n  border: 0;\n  box-shadow: none;\n  color: #0a9fe5;\n}\n.tox .tox-mbtn__select-label {\n  cursor: default;\n  font-weight: normal;\n  margin: 0 4px;\n}\n.tox .tox-mbtn[disabled] .tox-mbtn__select-label {\n  cursor: not-allowed;\n}\n.tox .tox-mbtn__select-chevron {\n  align-items: center;\n  display: flex;\n  justify-content: center;\n  width: 16px;\n  display: none;\n}\n.tox .tox-notification {\n  border-radius: 3px;\n  border-style: solid;\n  border-width: 1px;\n  box-shadow: none;\n  box-sizing: border-box;\n  display: -ms-grid;\n  display: grid;\n  font-size: 8.75px;\n  font-weight: normal;\n  -ms-grid-columns: minmax(40px, 1fr) auto minmax(40px, 1fr);\n  grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr);\n  margin-top: 2.5px;\n  opacity: 0;\n  padding: 2.5px;\n  transition: transform 100ms ease-in, opacity 150ms ease-in;\n}\n.tox .tox-notification p {\n  font-size: 8.75px;\n  font-weight: normal;\n}\n.tox .tox-notification a {\n  cursor: pointer;\n  text-decoration: underline;\n}\n.tox .tox-notification--in {\n  opacity: 1;\n}\n.tox .tox-notification--success {\n  background-color: #e4eeda;\n  border-color: #d7e6c8;\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-notification--success p {\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-notification--success a {\n  color: #547831;\n}\n.tox .tox-notification--success svg {\n  fill: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-notification--error {\n  background-color: #f8dede;\n  border-color: #f2bfbf;\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-notification--error p {\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-notification--error a {\n  color: #c00;\n}\n.tox .tox-notification--error svg {\n  fill: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-notification--warn,\n.tox .tox-notification--warning {\n  background-color: #fffaea;\n  border-color: #ffe89d;\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-notification--warn p,\n.tox .tox-notification--warning p {\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-notification--warn a,\n.tox .tox-notification--warning a {\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-notification--warn svg,\n.tox .tox-notification--warning svg {\n  fill: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-notification--info {\n  background-color: #d9edf7;\n  border-color: #779ecb;\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-notification--info p {\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-notification--info a {\n  color: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-notification--info svg {\n  fill: rgba(84, 111, 94, 0.85);\n}\n.tox .tox-notification__body {\n  -ms-grid-row-align: center;\n      align-self: center;\n  color: rgba(84, 111, 94, 0.85);\n  font-size: 14px;\n  -ms-grid-column-span: 1;\n  grid-column-end: 3;\n  -ms-grid-column: 2;\n      grid-column-start: 2;\n  -ms-grid-row-span: 1;\n  grid-row-end: 2;\n  -ms-grid-row: 1;\n      grid-row-start: 1;\n  text-align: center;\n  white-space: normal;\n  word-break: break-all;\n  word-break: break-word;\n}\n.tox .tox-notification__body > * {\n  margin: 0;\n}\n.tox .tox-notification__body > * + * {\n  margin-top: 1rem;\n}\n.tox .tox-notification__icon {\n  -ms-grid-row-align: center;\n      align-self: center;\n  -ms-grid-column-span: 1;\n  grid-column-end: 2;\n  -ms-grid-column: 1;\n      grid-column-start: 1;\n  -ms-grid-row-span: 1;\n  grid-row-end: 2;\n  -ms-grid-row: 1;\n      grid-row-start: 1;\n  -ms-grid-column-align: end;\n      justify-self: end;\n}\n.tox .tox-notification__icon svg {\n  display: block;\n}\n.tox .tox-notification__dismiss {\n  -ms-grid-row-align: start;\n      align-self: start;\n  -ms-grid-column-span: 1;\n  grid-column-end: 4;\n  -ms-grid-column: 3;\n      grid-column-start: 3;\n  -ms-grid-row-span: 1;\n  grid-row-end: 2;\n  -ms-grid-row: 1;\n      grid-row-start: 1;\n  -ms-grid-column-align: end;\n      justify-self: end;\n}\n.tox .tox-notification .tox-progress-bar {\n  -ms-grid-column-span: 3;\n  grid-column-end: 4;\n  -ms-grid-column: 1;\n      grid-column-start: 1;\n  -ms-grid-row-span: 1;\n  grid-row-end: 3;\n  -ms-grid-row: 2;\n      grid-row-start: 2;\n  -ms-grid-column-align: center;\n      justify-self: center;\n}\n.tox .tox-pop {\n  display: inline-block;\n  position: relative;\n}\n.tox .tox-pop--resizing {\n  transition: width 0.1s ease;\n}\n.tox .tox-pop--resizing .tox-toolbar,\n.tox .tox-pop--resizing .tox-toolbar__group {\n  flex-wrap: nowrap;\n}\n.tox .tox-pop--transition {\n  transition: 0.15s ease;\n  transition-property: left, right, top, bottom;\n}\n.tox .tox-pop--transition::before,\n.tox .tox-pop--transition::after {\n  transition: all 0.15s, visibility 0s, opacity 0.075s ease 0.075s;\n}\n.tox .tox-pop__dialog {\n  background-color: #fff;\n  border: 1px solid #d9d9d9;\n  border-radius: 3px;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\n  min-width: 0;\n  overflow: hidden;\n}\n.tox .tox-pop__dialog > *:not(.tox-toolbar) {\n  margin: 2.5px 2.5px 2.5px 5px;\n}\n.tox .tox-pop__dialog .tox-toolbar {\n  background-color: transparent;\n  margin-bottom: -1px;\n}\n.tox .tox-pop::before,\n.tox .tox-pop::after {\n  border-style: solid;\n  content: '';\n  display: block;\n  height: 0;\n  opacity: 1;\n  position: absolute;\n  width: 0;\n}\n.tox .tox-pop.tox-pop--inset::before,\n.tox .tox-pop.tox-pop--inset::after {\n  opacity: 0;\n  transition: all 0s 0.15s, visibility 0s, opacity 0.075s ease;\n}\n.tox .tox-pop.tox-pop--bottom::before,\n.tox .tox-pop.tox-pop--bottom::after {\n  left: 50%;\n  top: 100%;\n}\n.tox .tox-pop.tox-pop--bottom::after {\n  border-color: #fff transparent transparent transparent;\n  border-width: 8px;\n  margin-left: -8px;\n  margin-top: -1px;\n}\n.tox .tox-pop.tox-pop--bottom::before {\n  border-color: #d9d9d9 transparent transparent transparent;\n  border-width: 9px;\n  margin-left: -9px;\n}\n.tox .tox-pop.tox-pop--top::before,\n.tox .tox-pop.tox-pop--top::after {\n  left: 50%;\n  top: 0;\n  transform: translateY(-100%);\n}\n.tox .tox-pop.tox-pop--top::after {\n  border-color: transparent transparent #fff transparent;\n  border-width: 8px;\n  margin-left: -8px;\n  margin-top: 1px;\n}\n.tox .tox-pop.tox-pop--top::before {\n  border-color: transparent transparent #d9d9d9 transparent;\n  border-width: 9px;\n  margin-left: -9px;\n}\n.tox .tox-pop.tox-pop--left::before,\n.tox .tox-pop.tox-pop--left::after {\n  left: 0;\n  top: calc(50% - 1px);\n  transform: translateY(-50%);\n}\n.tox .tox-pop.tox-pop--left::after {\n  border-color: transparent #fff transparent transparent;\n  border-width: 8px;\n  margin-left: -15px;\n}\n.tox .tox-pop.tox-pop--left::before {\n  border-color: transparent #d9d9d9 transparent transparent;\n  border-width: 10px;\n  margin-left: -19px;\n}\n.tox .tox-pop.tox-pop--right::before,\n.tox .tox-pop.tox-pop--right::after {\n  left: 100%;\n  top: calc(50% + 1px);\n  transform: translateY(-50%);\n}\n.tox .tox-pop.tox-pop--right::after {\n  border-color: transparent transparent transparent #fff;\n  border-width: 8px;\n  margin-left: -1px;\n}\n.tox .tox-pop.tox-pop--right::before {\n  border-color: transparent transparent transparent #d9d9d9;\n  border-width: 10px;\n  margin-left: -1px;\n}\n.tox .tox-pop.tox-pop--align-left::before,\n.tox .tox-pop.tox-pop--align-left::after {\n  left: 20px;\n}\n.tox .tox-pop.tox-pop--align-right::before,\n.tox .tox-pop.tox-pop--align-right::after {\n  left: calc(100% - 20px);\n}\n.tox .tox-sidebar-wrap {\n  display: flex;\n  flex-direction: row;\n  flex-grow: 1;\n  -ms-flex-preferred-size: 0;\n  min-height: 0;\n}\n.tox .tox-sidebar {\n  background-color: #fff;\n  display: flex;\n  flex-direction: row;\n  justify-content: flex-end;\n}\n.tox .tox-sidebar__slider {\n  display: flex;\n  overflow: hidden;\n}\n.tox .tox-sidebar__pane-container {\n  display: flex;\n}\n.tox .tox-sidebar__pane {\n  display: flex;\n}\n.tox .tox-sidebar--sliding-closed {\n  opacity: 0;\n}\n.tox .tox-sidebar--sliding-open {\n  opacity: 1;\n}\n.tox .tox-sidebar--sliding-growing,\n.tox .tox-sidebar--sliding-shrinking {\n  transition: width 0.5s ease, opacity 0.5s ease;\n}\n.tox .tox-selector {\n  background-color: #4099ff;\n  border-color: #4099ff;\n  border-style: solid;\n  border-width: 1px;\n  box-sizing: border-box;\n  display: inline-block;\n  height: 10px;\n  position: absolute;\n  width: 10px;\n}\n.tox.tox-platform-touch .tox-selector {\n  height: 12px;\n  width: 12px;\n}\n.tox .tox-slider {\n  align-items: center;\n  display: flex;\n  flex: 1;\n  -ms-flex-preferred-size: auto;\n  height: 24px;\n  justify-content: center;\n  position: relative;\n}\n.tox .tox-slider__rail {\n  background-color: transparent;\n  border: 1px solid #d9d9d9;\n  border-radius: 3px;\n  height: 10px;\n  min-width: 120px;\n  width: 100%;\n}\n.tox .tox-slider__handle {\n  background-color: #0a8fe9;\n  border: 2px solid #0871b8;\n  border-radius: 3px;\n  box-shadow: none;\n  height: 24px;\n  left: 50%;\n  position: absolute;\n  top: 50%;\n  transform: translateX(-50%) translateY(-50%);\n  width: 14px;\n}\n.tox .tox-source-code {\n  overflow: auto;\n}\n.tox .tox-spinner {\n  display: flex;\n}\n.tox .tox-spinner > div {\n  animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both;\n  background-color: rgba(84, 111, 94, 0.7);\n  border-radius: 100%;\n  height: 5px;\n  width: 5px;\n}\n.tox .tox-spinner > div:nth-child(1) {\n  animation-delay: -0.32s;\n}\n.tox .tox-spinner > div:nth-child(2) {\n  animation-delay: -0.16s;\n}\n@keyframes tam-bouncing-dots {\n  0%,\n  80%,\n  100% {\n    transform: scale(0);\n  }\n  40% {\n    transform: scale(1);\n  }\n}\n.tox:not([dir=rtl]) .tox-spinner > div:not(:first-child) {\n  margin-left: 2.5px;\n}\n.tox[dir=rtl] .tox-spinner > div:not(:first-child) {\n  margin-right: 2.5px;\n}\n.tox .tox-statusbar {\n  align-items: center;\n  background-color: #fff;\n  border-top: 1px solid #d9d9d9;\n  color: rgba(84, 111, 94, 0.7);\n  display: flex;\n  flex: 0 0 auto;\n  font-size: 12px;\n  font-weight: normal;\n  height: 18px;\n  overflow: hidden;\n  padding: 0 5px;\n  position: relative;\n  text-transform: uppercase;\n}\n.tox .tox-statusbar__text-container {\n  display: flex;\n  flex: 1 1 auto;\n  justify-content: flex-end;\n  overflow: hidden;\n}\n.tox .tox-statusbar__path {\n  display: flex;\n  flex: 1 1 auto;\n  margin-right: auto;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.tox .tox-statusbar__path > * {\n  display: inline;\n  white-space: nowrap;\n}\n.tox .tox-statusbar__wordcount {\n  flex: 0 0 auto;\n  margin-left: 1ch;\n}\n.tox .tox-statusbar a,\n.tox .tox-statusbar__path-item,\n.tox .tox-statusbar__wordcount {\n  color: rgba(84, 111, 94, 0.7);\n  text-decoration: none;\n}\n.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),\n.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),\n.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]),\n.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),\n.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),\n.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]) {\n  cursor: pointer;\n  text-decoration: underline;\n}\n.tox .tox-statusbar__resize-handle {\n  align-items: flex-end;\n  align-self: stretch;\n  cursor: nwse-resize;\n  display: flex;\n  flex: 0 0 auto;\n  justify-content: flex-end;\n  margin-left: auto;\n  margin-right: -5px;\n  padding-left: 1ch;\n}\n.tox .tox-statusbar__resize-handle svg {\n  display: block;\n  fill: rgba(84, 111, 94, 0.7);\n}\n.tox .tox-statusbar__resize-handle:focus svg {\n  background-color: #e5e9e7;\n  border-radius: 1px;\n  box-shadow: 0 0 0 2px #e5e9e7;\n}\n.tox:not([dir=rtl]) .tox-statusbar__path > * {\n  margin-right: 2.5px;\n}\n.tox:not([dir=rtl]) .tox-statusbar__branding {\n  margin-left: 1ch;\n}\n.tox[dir=rtl] .tox-statusbar {\n  flex-direction: row-reverse;\n}\n.tox[dir=rtl] .tox-statusbar__path > * {\n  margin-left: 2.5px;\n}\n.tox .tox-throbber {\n  z-index: 1299;\n}\n.tox .tox-throbber__busy-spinner {\n  align-items: center;\n  background-color: rgba(255, 255, 255, 0.6);\n  bottom: 0;\n  display: flex;\n  justify-content: center;\n  left: 0;\n  position: absolute;\n  right: 0;\n  top: 0;\n}\n.tox .tox-tbtn {\n  align-items: center;\n  background: transparent;\n  border: 0;\n  border-radius: 3px;\n  box-shadow: none;\n  color: #817f7c;\n  display: flex;\n  flex: 0 0 auto;\n  font-size: 8.75px;\n  font-style: normal;\n  font-weight: normal;\n  height: 34px;\n  justify-content: center;\n  margin: 2px 0 3px 0;\n  outline: none;\n  overflow: hidden;\n  padding: 0;\n  text-transform: none;\n  width: 34px;\n}\n.tox .tox-tbtn svg {\n  display: block;\n  fill: #817f7c;\n}\n.tox .tox-tbtn.tox-tbtn-more {\n  padding-left: 5px;\n  padding-right: 5px;\n  width: inherit;\n}\n.tox .tox-tbtn:focus {\n  background: #e5e9e7;\n  border: 0;\n  box-shadow: none;\n}\n.tox .tox-tbtn:hover {\n  background: #e5e9e7;\n  border: 0;\n  box-shadow: none;\n  color: #0a9fe5;\n}\n.tox .tox-tbtn:hover svg {\n  fill: #0a9fe5;\n}\n.tox .tox-tbtn:active {\n  background: #e5e9e7;\n  border: 0;\n  box-shadow: none;\n  color: rgba(41, 159, 250, 0.88);\n}\n.tox .tox-tbtn:active svg {\n  fill: rgba(41, 159, 250, 0.88);\n}\n.tox .tox-tbtn--disabled,\n.tox .tox-tbtn--disabled:hover,\n.tox .tox-tbtn:disabled,\n.tox .tox-tbtn:disabled:hover {\n  background: transparent;\n  border: 0;\n  box-shadow: none;\n  color: rgba(129, 127, 124, 0.5);\n  cursor: not-allowed;\n}\n.tox .tox-tbtn--disabled svg,\n.tox .tox-tbtn--disabled:hover svg,\n.tox .tox-tbtn:disabled svg,\n.tox .tox-tbtn:disabled:hover svg {\n  /* stylelint-disable-line no-descending-specificity */\n  fill: rgba(129, 127, 124, 0.5);\n}\n.tox .tox-tbtn--enabled,\n.tox .tox-tbtn--enabled:hover {\n  background: #e5e9e7;\n  border: 0;\n  box-shadow: none;\n  color: rgba(41, 159, 250, 0.88);\n}\n.tox .tox-tbtn--enabled > *,\n.tox .tox-tbtn--enabled:hover > * {\n  transform: none;\n}\n.tox .tox-tbtn--enabled svg,\n.tox .tox-tbtn--enabled:hover svg {\n  /* stylelint-disable-line no-descending-specificity */\n  fill: rgba(41, 159, 250, 0.88);\n}\n.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) {\n  color: #ee930e;\n}\n.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg {\n  fill: #ee930e;\n}\n.tox .tox-tbtn:active > * {\n  transform: none;\n}\n.tox .tox-tbtn--md {\n  height: 51px;\n  width: 51px;\n}\n.tox .tox-tbtn--lg {\n  flex-direction: column;\n  height: 68px;\n  width: 68px;\n}\n.tox .tox-tbtn--return {\n  -ms-grid-row-align: stretch;\n      align-self: stretch;\n  height: unset;\n  width: 16px;\n}\n.tox .tox-tbtn--labeled {\n  padding: 0 4px;\n  width: unset;\n}\n.tox .tox-tbtn__vlabel {\n  display: block;\n  font-size: 10px;\n  font-weight: normal;\n  letter-spacing: -0.025em;\n  margin-bottom: 2.5px;\n  white-space: nowrap;\n}\n.tox .tox-tbtn--select {\n  margin: 2px 0 3px 0;\n  padding: 0 4px;\n  width: auto;\n}\n.tox .tox-tbtn__select-label {\n  cursor: default;\n  font-weight: normal;\n  margin: 0 4px;\n}\n.tox .tox-tbtn__select-chevron {\n  align-items: center;\n  display: flex;\n  justify-content: center;\n  width: 10px;\n}\n.tox .tox-tbtn__select-chevron svg {\n  fill: rgba(129, 127, 124, 0.5);\n}\n.tox .tox-tbtn--bespoke .tox-tbtn__select-label {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  width: 7em;\n}\n.tox .tox-split-button {\n  border: 0;\n  border-radius: 3px;\n  box-sizing: border-box;\n  display: flex;\n  margin: 2px 0 3px 0;\n  overflow: hidden;\n}\n.tox .tox-split-button:hover {\n  box-shadow: 0 0 0 1px #e5e9e7 inset;\n}\n.tox .tox-split-button:focus {\n  background: #e5e9e7;\n  box-shadow: none;\n  color: #ee930e;\n}\n.tox .tox-split-button > * {\n  border-radius: 0;\n}\n.tox .tox-split-button__chevron {\n  width: 10px;\n}\n.tox .tox-split-button__chevron svg {\n  fill: rgba(129, 127, 124, 0.5);\n}\n.tox .tox-split-button .tox-tbtn {\n  margin: 0;\n}\n.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child {\n  width: 30px;\n}\n.tox.tox-platform-touch .tox-split-button__chevron {\n  width: 14px;\n}\n.tox .tox-split-button.tox-tbtn--disabled:hover,\n.tox .tox-split-button.tox-tbtn--disabled:focus,\n.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,\n.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus {\n  background: transparent;\n  box-shadow: none;\n  color: rgba(129, 127, 124, 0.5);\n}\n.tox .tox-toolbar-overlord {\n  background-color: #fff;\n}\n.tox .tox-toolbar,\n.tox .tox-toolbar__primary,\n.tox .tox-toolbar__overflow {\n  background: url(\"data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23d9d9d9'/%3E%3C/svg%3E\") left 0 top 0 #fff;\n  background-color: #fff;\n  display: flex;\n  flex: 0 0 auto;\n  flex-shrink: 0;\n  flex-wrap: wrap;\n  padding: 0 0;\n}\n.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed {\n  height: 0;\n  opacity: 0;\n  padding-bottom: 0;\n  padding-top: 0;\n  visibility: hidden;\n}\n.tox .tox-toolbar__overflow--growing {\n  transition: height 0.3s ease, opacity 0.2s linear 0.1s;\n}\n.tox .tox-toolbar__overflow--shrinking {\n  transition: opacity 0.3s ease, height 0.2s linear 0.1s, visibility 0s linear 0.3s;\n}\n.tox .tox-menubar + .tox-toolbar,\n.tox .tox-menubar + .tox-toolbar-overlord .tox-toolbar__primary {\n  border-top: 1px solid #d9d9d9;\n  margin-top: -1px;\n}\n.tox .tox-toolbar--scrolling {\n  flex-wrap: nowrap;\n  overflow-x: auto;\n}\n.tox .tox-pop .tox-toolbar {\n  border-width: 0;\n}\n.tox .tox-toolbar--no-divider {\n  background-image: none;\n}\n.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child,\n.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary {\n  border-top: 1px solid #d9d9d9;\n}\n.tox.tox-tinymce-aux .tox-toolbar__overflow {\n  background-color: #fff;\n  border: 1px solid #d9d9d9;\n  border-radius: 3px;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\n}\n.tox .tox-toolbar__group {\n  align-items: center;\n  display: flex;\n  flex-wrap: wrap;\n  margin: 0 0;\n  padding: 0 4px 0 4px;\n}\n.tox .tox-toolbar__group--pull-right {\n  margin-left: auto;\n}\n.tox .tox-toolbar--scrolling .tox-toolbar__group {\n  flex-shrink: 0;\n  flex-wrap: nowrap;\n}\n.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type) {\n  border-right: 1px solid #d9d9d9;\n}\n.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type) {\n  border-left: 1px solid #d9d9d9;\n}\n.tox .tox-tooltip {\n  display: inline-block;\n  padding: 5px;\n  position: relative;\n}\n.tox .tox-tooltip__body {\n  background-color: rgba(84, 111, 94, 0.85);\n  border-radius: 3px;\n  box-shadow: 0 2px 4px rgba(84, 111, 94, 0.3);\n  color: rgba(255, 255, 255, 0.75);\n  font-size: 8.75px;\n  font-style: normal;\n  font-weight: normal;\n  padding: 2.5px 5px;\n  text-transform: none;\n}\n.tox .tox-tooltip__arrow {\n  position: absolute;\n}\n.tox .tox-tooltip--down .tox-tooltip__arrow {\n  border-left: 5px solid transparent;\n  border-right: 5px solid transparent;\n  border-top: 5px solid rgba(84, 111, 94, 0.85);\n  bottom: 0;\n  left: 50%;\n  position: absolute;\n  transform: translateX(-50%);\n}\n.tox .tox-tooltip--up .tox-tooltip__arrow {\n  border-bottom: 5px solid rgba(84, 111, 94, 0.85);\n  border-left: 5px solid transparent;\n  border-right: 5px solid transparent;\n  left: 50%;\n  position: absolute;\n  top: 0;\n  transform: translateX(-50%);\n}\n.tox .tox-tooltip--right .tox-tooltip__arrow {\n  border-bottom: 5px solid transparent;\n  border-left: 5px solid rgba(84, 111, 94, 0.85);\n  border-top: 5px solid transparent;\n  position: absolute;\n  right: 0;\n  top: 50%;\n  transform: translateY(-50%);\n}\n.tox .tox-tooltip--left .tox-tooltip__arrow {\n  border-bottom: 5px solid transparent;\n  border-right: 5px solid rgba(84, 111, 94, 0.85);\n  border-top: 5px solid transparent;\n  left: 0;\n  position: absolute;\n  top: 50%;\n  transform: translateY(-50%);\n}\n.tox .tox-well {\n  border: 1px solid #d9d9d9;\n  border-radius: 3px;\n  padding: 5px;\n  width: 100%;\n}\n.tox .tox-well > *:first-child {\n  margin-top: 0;\n}\n.tox .tox-well > *:last-child {\n  margin-bottom: 0;\n}\n.tox .tox-well > *:only-child {\n  margin: 0;\n}\n.tox .tox-custom-editor {\n  border: 1px solid #d9d9d9;\n  border-radius: 3px;\n  display: flex;\n  flex: 1;\n  position: relative;\n}\n/* stylelint-disable */\n.tox {\n  /* stylelint-enable */\n}\n.tox .tox-dialog-loading::before {\n  background-color: rgba(0, 0, 0, 0.5);\n  content: \"\";\n  height: 100%;\n  position: absolute;\n  width: 100%;\n  z-index: 1000;\n}\n.tox .tox-tab {\n  cursor: pointer;\n}\n.tox .tox-dialog__content-js {\n  display: flex;\n  flex: 1;\n  -ms-flex-preferred-size: auto;\n}\n.tox .tox-dialog__body-content .tox-collection {\n  display: flex;\n  flex: 1;\n  -ms-flex-preferred-size: auto;\n}\n.tox .tox-image-tools-edit-panel {\n  height: 60px;\n}\n.tox .tox-image-tools__sidebar {\n  height: 60px;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/public/resource/tinymce/skins/ui/jeecg/skin.mobile.css",
    "content": "/**\n* Copyright (c) Tiny Technologies, Inc. All rights reserved.\n* Licensed under the LGPL or a commercial license.\n* For LGPL see License.txt in the project root for license information.\n* For commercial licenses see https://www.tiny.cloud/\n*/\n/* RESET all the things! */\n.tinymce-mobile-outer-container {\n  all: initial;\n  display: block;\n}\n.tinymce-mobile-outer-container * {\n  border: 0;\n  box-sizing: initial;\n  cursor: inherit;\n  float: none;\n  line-height: 1;\n  margin: 0;\n  outline: 0;\n  padding: 0;\n  -webkit-tap-highlight-color: transparent;\n  /* TBIO-3691, stop the gray flicker on touch. */\n  text-shadow: none;\n  white-space: nowrap;\n}\n.tinymce-mobile-icon-arrow-back::before {\n  content: \"\\e5cd\";\n}\n.tinymce-mobile-icon-image::before {\n  content: \"\\e412\";\n}\n.tinymce-mobile-icon-cancel-circle::before {\n  content: \"\\e5c9\";\n}\n.tinymce-mobile-icon-full-dot::before {\n  content: \"\\e061\";\n}\n.tinymce-mobile-icon-align-center::before {\n  content: \"\\e234\";\n}\n.tinymce-mobile-icon-align-left::before {\n  content: \"\\e236\";\n}\n.tinymce-mobile-icon-align-right::before {\n  content: \"\\e237\";\n}\n.tinymce-mobile-icon-bold::before {\n  content: \"\\e238\";\n}\n.tinymce-mobile-icon-italic::before {\n  content: \"\\e23f\";\n}\n.tinymce-mobile-icon-unordered-list::before {\n  content: \"\\e241\";\n}\n.tinymce-mobile-icon-ordered-list::before {\n  content: \"\\e242\";\n}\n.tinymce-mobile-icon-font-size::before {\n  content: \"\\e245\";\n}\n.tinymce-mobile-icon-underline::before {\n  content: \"\\e249\";\n}\n.tinymce-mobile-icon-link::before {\n  content: \"\\e157\";\n}\n.tinymce-mobile-icon-unlink::before {\n  content: \"\\eca2\";\n}\n.tinymce-mobile-icon-color::before {\n  content: \"\\e891\";\n}\n.tinymce-mobile-icon-previous::before {\n  content: \"\\e314\";\n}\n.tinymce-mobile-icon-next::before {\n  content: \"\\e315\";\n}\n.tinymce-mobile-icon-large-font::before,\n.tinymce-mobile-icon-style-formats::before {\n  content: \"\\e264\";\n}\n.tinymce-mobile-icon-undo::before {\n  content: \"\\e166\";\n}\n.tinymce-mobile-icon-redo::before {\n  content: \"\\e15a\";\n}\n.tinymce-mobile-icon-removeformat::before {\n  content: \"\\e239\";\n}\n.tinymce-mobile-icon-small-font::before {\n  content: \"\\e906\";\n}\n.tinymce-mobile-icon-readonly-back::before,\n.tinymce-mobile-format-matches::after {\n  content: \"\\e5ca\";\n}\n.tinymce-mobile-icon-small-heading::before {\n  content: \"small\";\n}\n.tinymce-mobile-icon-large-heading::before {\n  content: \"large\";\n}\n.tinymce-mobile-icon-small-heading::before,\n.tinymce-mobile-icon-large-heading::before {\n  font-family: sans-serif;\n  font-size: 80%;\n}\n.tinymce-mobile-mask-edit-icon::before {\n  content: \"\\e254\";\n}\n.tinymce-mobile-icon-back::before {\n  content: \"\\e5c4\";\n}\n.tinymce-mobile-icon-heading::before {\n  /* TODO: Translate */\n  content: \"Headings\";\n  font-family: sans-serif;\n  font-size: 80%;\n  font-weight: bold;\n}\n.tinymce-mobile-icon-h1::before {\n  content: \"H1\";\n  font-weight: bold;\n}\n.tinymce-mobile-icon-h2::before {\n  content: \"H2\";\n  font-weight: bold;\n}\n.tinymce-mobile-icon-h3::before {\n  content: \"H3\";\n  font-weight: bold;\n}\n.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask {\n  align-items: center;\n  display: flex;\n  justify-content: center;\n  background: rgba(51, 51, 51, 0.5);\n  height: 100%;\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container {\n  align-items: center;\n  border-radius: 50%;\n  display: flex;\n  flex-direction: column;\n  font-family: sans-serif;\n  font-size: 1em;\n  justify-content: space-between;\n}\n.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item {\n  align-items: center;\n  display: flex;\n  justify-content: center;\n  border-radius: 50%;\n  height: 2.1em;\n  width: 2.1em;\n}\n.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section {\n  align-items: center;\n  display: flex;\n  justify-content: center;\n  flex-direction: column;\n  font-size: 1em;\n}\n@media only screen and (min-device-width:700px) {\n  .tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section {\n    font-size: 1.2em;\n  }\n}\n.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon {\n  align-items: center;\n  display: flex;\n  justify-content: center;\n  border-radius: 50%;\n  height: 2.1em;\n  width: 2.1em;\n  background-color: white;\n  color: #207ab7;\n}\n.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before {\n  content: \"\\e900\";\n  font-family: 'tinymce-mobile', sans-serif;\n}\n.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon {\n  z-index: 2;\n}\n.tinymce-mobile-android-container.tinymce-mobile-android-maximized {\n  background: #ffffff;\n  border: none;\n  bottom: 0;\n  display: flex;\n  flex-direction: column;\n  left: 0;\n  position: fixed;\n  right: 0;\n  top: 0;\n}\n.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized) {\n  position: relative;\n}\n.tinymce-mobile-android-container .tinymce-mobile-editor-socket {\n  display: flex;\n  flex-grow: 1;\n}\n.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe {\n  display: flex !important;\n  flex-grow: 1;\n  height: auto !important;\n}\n.tinymce-mobile-android-scroll-reload {\n  overflow: hidden;\n}\n:not(.tinymce-mobile-readonly-mode) > .tinymce-mobile-android-selection-context-toolbar {\n  margin-top: 23px;\n}\n.tinymce-mobile-toolstrip {\n  background: #fff;\n  display: flex;\n  flex: 0 0 auto;\n  z-index: 1;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar {\n  align-items: center;\n  background-color: #fff;\n  border-bottom: 1px solid #cccccc;\n  display: flex;\n  flex: 1;\n  height: 2.5em;\n  width: 100%;\n  /* Make it no larger than the toolstrip, so that it needs to scroll */\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group {\n  align-items: center;\n  display: flex;\n  height: 100%;\n  flex-shrink: 1;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group > div {\n  align-items: center;\n  display: flex;\n  height: 100%;\n  flex: 1;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container {\n  background: #f44336;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group {\n  flex-grow: 1;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item {\n  padding-left: 0.5em;\n  padding-right: 0.5em;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button {\n  align-items: center;\n  display: flex;\n  height: 80%;\n  margin-left: 2px;\n  margin-right: 2px;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected {\n  background: #d4dbd7;\n  color: #cccccc;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type {\n  background: #207ab7;\n  color: #eceff1;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar {\n  /* Note, this file is imported inside .tinymce-mobile-context-toolbar, so that prefix is on everything here. */\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group {\n  align-items: center;\n  display: flex;\n  height: 100%;\n  flex: 1;\n  padding-bottom: 0.4em;\n  padding-top: 0.4em;\n  /* Make any buttons appearing on the left and right display in the centre (e.g. color edges) */\n  /* For widgets like the colour picker, use the whole height */\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog {\n  display: flex;\n  min-height: 1.5em;\n  overflow: hidden;\n  padding-left: 0;\n  padding-right: 0;\n  position: relative;\n  width: 100%;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain {\n  display: flex;\n  height: 100%;\n  transition: left cubic-bezier(0.4, 0, 1, 1) 0.15s;\n  width: 100%;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen {\n  display: flex;\n  flex: 0 0 auto;\n  justify-content: space-between;\n  width: 100%;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input {\n  font-family: Sans-serif;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container {\n  display: flex;\n  flex-grow: 1;\n  position: relative;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x {\n  -ms-grid-row-align: center;\n      align-self: center;\n  background: inherit;\n  border: none;\n  border-radius: 50%;\n  color: #888;\n  font-size: 0.6em;\n  font-weight: bold;\n  height: 100%;\n  padding-right: 2px;\n  position: absolute;\n  right: 0;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x {\n  display: none;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous,\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next {\n  align-items: center;\n  display: flex;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before,\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before {\n  align-items: center;\n  display: flex;\n  font-weight: bold;\n  height: 100%;\n  padding-left: 0.5em;\n  padding-right: 0.5em;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before,\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before {\n  visibility: hidden;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item {\n  color: #cccccc;\n  font-size: 10px;\n  line-height: 10px;\n  margin: 0 2px;\n  padding-top: 3px;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active {\n  color: #d4dbd7;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before {\n  margin-left: 0.5em;\n  margin-right: 0.9em;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before {\n  margin-left: 0.9em;\n  margin-right: 0.5em;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider {\n  display: flex;\n  flex: 1;\n  margin-left: 0;\n  margin-right: 0;\n  padding: 0.28em 0;\n  position: relative;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container {\n  align-items: center;\n  display: flex;\n  flex-grow: 1;\n  height: 100%;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line {\n  background: #cccccc;\n  display: flex;\n  flex: 1;\n  height: 0.2em;\n  margin-bottom: 0.3em;\n  margin-top: 0.3em;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container {\n  padding-left: 2em;\n  padding-right: 2em;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container {\n  align-items: center;\n  display: flex;\n  flex-grow: 1;\n  height: 100%;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient {\n  background: linear-gradient(to right, hsl(0, 100%, 50%) 0%, hsl(60, 100%, 50%) 17%, hsl(120, 100%, 50%) 33%, hsl(180, 100%, 50%) 50%, hsl(240, 100%, 50%) 67%, hsl(300, 100%, 50%) 83%, hsl(0, 100%, 50%) 100%);\n  display: flex;\n  flex: 1;\n  height: 0.2em;\n  margin-bottom: 0.3em;\n  margin-top: 0.3em;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black {\n  /* Not part of theming */\n  background: black;\n  height: 0.2em;\n  margin-bottom: 0.3em;\n  margin-top: 0.3em;\n  width: 1.2em;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white {\n  /* Not part of theming */\n  background: white;\n  height: 0.2em;\n  margin-bottom: 0.3em;\n  margin-top: 0.3em;\n  width: 1.2em;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb {\n  /* vertically centering trick (margin: auto, top: 0, bottom: 0). On iOS and Safari, if you leave\n     * out these values, then it shows the thumb at the top of the spectrum. This is probably because it is\n     * absolutely positioned with only a left value, and not a top. Note, on Chrome it seems to be fine without\n     * this approach.\n    */\n  align-items: center;\n  background-clip: padding-box;\n  background-color: #455a64;\n  border: 0.5em solid rgba(136, 136, 136, 0);\n  border-radius: 3em;\n  bottom: 0;\n  color: #fff;\n  display: flex;\n  height: 0.5em;\n  justify-content: center;\n  left: -10px;\n  margin: auto;\n  position: absolute;\n  top: 0;\n  transition: border 120ms cubic-bezier(0.39, 0.58, 0.57, 1);\n  width: 0.5em;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active {\n  border: 0.5em solid rgba(136, 136, 136, 0.39);\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group > div {\n  align-items: center;\n  display: flex;\n  height: 100%;\n  flex: 1;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper {\n  flex-direction: column;\n  justify-content: center;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item {\n  align-items: center;\n  display: flex;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog) {\n  height: 100%;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container {\n  display: flex;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input {\n  background: #ffffff;\n  border: none;\n  border-radius: 0;\n  color: #455a64;\n  flex-grow: 1;\n  font-size: 0.85em;\n  padding-bottom: 0.1em;\n  padding-left: 5px;\n  padding-top: 0.1em;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder {\n  /* WebKit, Blink, Edge */\n  color: #888;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input:-ms-input-placeholder {\n  /* WebKit, Blink, Edge */\n  color: #888;\n}\n.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder {\n  /* WebKit, Blink, Edge */\n  color: #888;\n}\n/* dropup */\n.tinymce-mobile-dropup {\n  background: white;\n  display: flex;\n  overflow: hidden;\n  width: 100%;\n}\n.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking {\n  transition: height 0.3s ease-out;\n}\n.tinymce-mobile-dropup.tinymce-mobile-dropup-growing {\n  transition: height 0.3s ease-in;\n}\n.tinymce-mobile-dropup.tinymce-mobile-dropup-closed {\n  flex-grow: 0;\n}\n.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing) {\n  flex-grow: 1;\n}\n/* TODO min-height for device size and orientation */\n.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) {\n  min-height: 200px;\n}\n@media only screen and (orientation: landscape) {\n  .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) {\n    min-height: 200px;\n  }\n}\n@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : landscape) {\n  .tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) {\n    min-height: 150px;\n  }\n}\n/* styles menu */\n.tinymce-mobile-styles-menu {\n  font-family: sans-serif;\n  outline: 4px solid black;\n  overflow: hidden;\n  position: relative;\n  width: 100%;\n}\n.tinymce-mobile-styles-menu [role=\"menu\"] {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  position: absolute;\n  width: 100%;\n}\n.tinymce-mobile-styles-menu [role=\"menu\"].transitioning {\n  transition: transform 0.5s ease-in-out;\n}\n.tinymce-mobile-styles-menu .tinymce-mobile-styles-item {\n  border-bottom: 1px solid #ddd;\n  color: #455a64;\n  cursor: pointer;\n  display: flex;\n  padding: 1em 1em;\n  position: relative;\n}\n.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before {\n  color: #455a64;\n  content: \"\\e314\";\n  font-family: 'tinymce-mobile', sans-serif;\n}\n.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after {\n  color: #455a64;\n  content: \"\\e315\";\n  font-family: 'tinymce-mobile', sans-serif;\n  padding-left: 1em;\n  padding-right: 1em;\n  position: absolute;\n  right: 0;\n}\n.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after {\n  font-family: 'tinymce-mobile', sans-serif;\n  padding-left: 1em;\n  padding-right: 1em;\n  position: absolute;\n  right: 0;\n}\n.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator,\n.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser {\n  align-items: center;\n  background: #fff;\n  border-top: #455a64;\n  color: #455a64;\n  display: flex;\n  min-height: 2.5em;\n  padding-left: 1em;\n  padding-right: 1em;\n}\n.tinymce-mobile-styles-menu [data-transitioning-destination=\"before\"][data-transitioning-state],\n.tinymce-mobile-styles-menu [data-transitioning-state=\"before\"] {\n  transform: translate(-100%);\n}\n.tinymce-mobile-styles-menu [data-transitioning-destination=\"current\"][data-transitioning-state],\n.tinymce-mobile-styles-menu [data-transitioning-state=\"current\"] {\n  transform: translate(0%);\n}\n.tinymce-mobile-styles-menu [data-transitioning-destination=\"after\"][data-transitioning-state],\n.tinymce-mobile-styles-menu [data-transitioning-state=\"after\"] {\n  transform: translate(100%);\n}\n@font-face {\n  font-family: 'tinymce-mobile';\n  font-style: normal;\n  font-weight: normal;\n  src: url('fonts/tinymce-mobile.woff?8x92w3') format('woff');\n}\n@media (min-device-width: 700px) {\n  .tinymce-mobile-outer-container,\n  .tinymce-mobile-outer-container input {\n    font-size: 25px;\n  }\n}\n@media (max-device-width: 700px) {\n  .tinymce-mobile-outer-container,\n  .tinymce-mobile-outer-container input {\n    font-size: 18px;\n  }\n}\n.tinymce-mobile-icon {\n  font-family: 'tinymce-mobile', sans-serif;\n}\n.mixin-flex-and-centre {\n  align-items: center;\n  display: flex;\n  justify-content: center;\n}\n.mixin-flex-bar {\n  align-items: center;\n  display: flex;\n  height: 100%;\n}\n.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe {\n  background-color: #fff;\n  width: 100%;\n}\n.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon {\n  /* Note, on the iPod touch in landscape, this isn't visible when the navbar appears */\n  background-color: #207ab7;\n  border-radius: 50%;\n  bottom: 1em;\n  color: white;\n  font-size: 1em;\n  height: 2.1em;\n  position: fixed;\n  right: 2em;\n  width: 2.1em;\n  align-items: center;\n  display: flex;\n  justify-content: center;\n}\n@media only screen and (min-device-width:700px) {\n  .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon {\n    font-size: 1.2em;\n  }\n}\n.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket {\n  height: 300px;\n  overflow: hidden;\n}\n.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe {\n  height: 100%;\n}\n.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip {\n  display: none;\n}\n/*\n  Note, that if you don't include this (::-webkit-file-upload-button), the toolbar width gets\n  increased and the whole body becomes scrollable. It's important!\n */\ninput[type=\"file\"]::-webkit-file-upload-button {\n  display: none;\n}\n@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : landscape) {\n  .tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon {\n    bottom: 50%;\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/App.vue",
    "content": "<template>\n  <ConfigProvider :theme=\"appTheme\" :locale=\"getAntdLocale\">\n    <AppProvider>\n      <RouterView />\n    </AppProvider>\n  </ConfigProvider>\n</template>\n\n<script lang=\"ts\" setup>\n  import { watch, ref } from 'vue';\n  import { theme } from 'ant-design-vue';\n  import { ConfigProvider } from 'ant-design-vue';\n  import { AppProvider } from '/@/components/Application';\n  import { useTitle } from '/@/hooks/web/useTitle';\n  import { useLocale } from '/@/locales/useLocale';\n  import { useAppStore } from '/@/store/modules/app';\n  import { useRootSetting } from '/@/hooks/setting/useRootSetting';\n  import { ThemeEnum } from '/@/enums/appEnum';\n  import { changeTheme } from '/@/logics/theme/index';\n\n  const appStore = useAppStore();\n  // 解决日期时间国际化问题\n  import 'dayjs/locale/zh-cn';\n  // support Multi-language\n  const { getAntdLocale } = useLocale();\n\n  useTitle();\n  /**\n   * 2024-04-07\n   * liaozhiyang\n   * 暗黑模式下默认文字白色，白天模式默认文字 #333\n   * */\n  const modeAction = (data) => {\n    if (data.token) {\n      if (getDarkMode.value === ThemeEnum.DARK) {\n        Object.assign(data.token, { colorTextBase: 'fff' });\n      } else {\n        Object.assign(data.token, { colorTextBase: '#333' });\n      }\n\n      // 定义主题色 css 变量\n      if (data.token.colorPrimary) {\n        document.documentElement.style.setProperty('--j-global-primary-color', data.token.colorPrimary);\n      }\n    }\n  };\n  // 代码逻辑说明: 【QQYUN-6366】升级到antd4.x\n  const appTheme: any = ref({});\n  const { getDarkMode } = useRootSetting();\n  watch(\n    () => getDarkMode.value,\n    (newValue) => {\n      delete appTheme.value.algorithm;\n      if (newValue === ThemeEnum.DARK) {\n        appTheme.value.algorithm = theme.darkAlgorithm;\n      }\n      // 代码逻辑说明: 【QQYUN-8570】生产环境暗黑模式下主题色不生效\n      if (import.meta.env.PROD) {\n        changeTheme(appStore.getProjectConfig.themeColor);\n      }\n      modeAction(appTheme.value);\n      appTheme.value = {\n        ...appTheme.value,\n      };\n    },\n    { immediate: true }\n  );\n  watch(\n    appStore.getProjectConfig,\n    (newValue) => {\n      const primary = newValue.themeColor;\n      const result = {\n        ...appTheme.value,\n        ...{\n          token: {\n            colorPrimary: primary,\n            wireframe: true,\n            fontSize: 14,\n            colorTextBase: '#333',\n            colorSuccess: '#55D187',\n            colorInfo: primary,\n            borderRadius: 4,\n            sizeStep: 4,\n            sizeUnit: 4,\n            colorWarning: '#EFBD47',\n            colorError: '#ED6F6F',\n            fontFamily:\n              '-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol',\n          },\n        },\n      };\n      appTheme.value = result;\n      modeAction(result);\n    },\n    { immediate: true }\n  );\n  setTimeout(() => {\n    appStore.getProjectConfig?.themeColor && changeTheme(appStore.getProjectConfig.themeColor);\n  }, 300);\n\n</script>\n<style lang=\"less\">\n  // 代码逻辑说明: 【QQYUN-5839】windi会影响到html2canvas绘制的图片样式\n  img {\n    display: inline-block;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/api/common/api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { message } from 'ant-design-vue';\nimport { useGlobSetting } from '/@/hooks/setting';\nconst globSetting = useGlobSetting();\nconst baseUploadUrl = globSetting.uploadUrl;\nenum Api {\n  positionList = '/sys/position/list',\n  userList = '/sys/user/list',\n  roleList = '/sys/role/list',\n  queryDepartTreeSync = '/sys/sysDepart/queryDepartTreeSync',\n  queryTreeList = '/sys/sysDepart/queryTreeList',\n  loadTreeData = '/sys/category/loadTreeData',\n  loadDictItem = '/sys/category/loadDictItem',\n  getDictItems = '/sys/dict/getDictItems/',\n  getTableList = '/sys/user/queryUserComponentData',\n  getCategoryData = '/sys/category/loadAllData',\n  refreshDragCache = '/drag/page/refreshCache',\n  refreshDefaultIndexCache = '/sys/sysRoleIndex/cleanDefaultIndexCache',\n  //异步获取部门和岗位\n  queryDepartAndPostTreeSync = '/sys/sysDepart/queryDepartAndPostTreeSync',\n  //查询部门岗位下的用户\n  queryDepartPostUserPageList = '/sys/user/queryDepartPostUserPageList',\n  //查询所选部门的所有父节点ID\n  queryAllParentId = '/sys/sysDepart/queryAllParentId',\n}\n\n/**\n * 上传父路径\n */\nexport const uploadUrl = `${baseUploadUrl}/sys/common/upload`;\n\n/**\n * 职务列表\n * @param params\n */\nexport const getPositionList = (params) => {\n  return defHttp.get({ url: Api.positionList, params });\n};\n\n/**\n * 用户列表\n * @param params\n */\nexport const getUserList = (params) => {\n  return defHttp.get({ url: Api.userList, params });\n};\n\n/**\n * 角色列表\n * @param params\n */\nexport const getRoleList = (params) => {\n  return defHttp.get({ url: Api.roleList, params });\n};\n\n/**\n * 异步获取部门树列表\n */\nexport const queryDepartTreeSync = (params?) => {\n  return defHttp.get({ url: Api.queryDepartTreeSync, params });\n};\n/**\n * 异步获取部门职位树列表\n */\nexport const queryDepartAndPostTreeSync = (params?) => {\n  return defHttp.get({ url: Api.queryDepartAndPostTreeSync, params });\n};\n\n/**\n * 获取部门树列表\n */\nexport const queryTreeList = (params?) => {\n  return defHttp.get({ url: Api.queryTreeList, params });\n};\n\n/**\n * 分类字典树控件 加载节点\n */\nexport const loadTreeData = (params?) => {\n  return defHttp.get({ url: Api.loadTreeData, params });\n};\n\n/**\n * 根据字典code加载字典text\n */\nexport const loadDictItem = (params?) => {\n  return defHttp.get({ url: Api.loadDictItem, params });\n};\n\n/**\n * 根据字典code加载字典text\n */\nexport const getDictItems = (dictCode) => {\n  return defHttp.get({ url: Api.getDictItems + dictCode }, { joinTime: false });\n};\n/**\n * 部门用户modal选择列表加载list\n */\nexport const getTableList = (params) => {\n  return defHttp.get({ url: Api.getTableList, params });\n};\n\n/**\n * 部门岗位用户modal【查询部门岗位下的用户】\n */\nexport const queryDepartPostUserPageList = (params) => {\n  return defHttp.get({ url: Api.queryDepartPostUserPageList, params });\n};\n\n/**\n * 查询所选部门的所有父节点ID\n */\nexport const queryAllParentId = (params) => {\n  return defHttp.get({ url: Api.queryAllParentId, params });\n};\n\n/**\n * 加载全部分类字典数据\n */\nexport const loadCategoryData = (params) => {\n  return defHttp.get({ url: Api.getCategoryData, params });\n};\n/**\n * 文件上传\n */\nexport const uploadFile = (params, success) => {\n  return defHttp.uploadFile({ url: uploadUrl }, params, { success });\n};\n/**\n * 下载文件\n * @param url 文件路径\n * @param fileName 文件名\n * @param parameter\n * @returns {*}\n */\nexport const downloadFile = (url, fileName?, parameter?) => {\n  return getFileblob(url, parameter).then((data) => {\n    if (!data || data.size === 0) {\n      message.warning('文件下载失败');\n      return;\n    }\n    if (typeof window.navigator.msSaveBlob !== 'undefined') {\n      window.navigator.msSaveBlob(new Blob([data]), fileName);\n    } else {\n      let url = window.URL.createObjectURL(new Blob([data]));\n      let link = document.createElement('a');\n      link.style.display = 'none';\n      link.href = url;\n      link.setAttribute('download', fileName);\n      document.body.appendChild(link);\n      link.click();\n      document.body.removeChild(link); //下载完成移除元素\n      window.URL.revokeObjectURL(url); //释放掉blob对象\n    }\n  });\n};\n\n/**\n * 下载文件 用于excel导出\n * @param url\n * @param parameter\n * @returns {*}\n */\nexport const getFileblob = (url, parameter) => {\n  return defHttp.get(\n    {\n      url: url,\n      params: parameter,\n      responseType: 'blob',\n    },\n    { isTransformResponse: false }\n  );\n};\n\n/**\n * 【用于评论功能】自定义文件上传-方法\n */\nexport const uploadMyFile = (url, data) => {\n  return defHttp.uploadMyFile(url, data);\n};\n/**\n * 刷新仪表盘缓存\n * @param params\n */\nexport const refreshDragCache = () => defHttp.get({ url: Api.refreshDragCache }, { isTransformResponse: false });\n/**\n * 刷新默认首页缓存\n * @param params\n */\nexport const refreshHomeCache = () => defHttp.get({ url: Api.refreshDefaultIndexCache }, { isTransformResponse: false });\n"
  },
  {
    "path": "jeecgboot-vue3/src/api/demo/account.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { GetAccountInfoModel } from './model/accountModel';\n\nenum Api {\n  ACCOUNT_INFO = '/mock/account/getAccountInfo',\n  SESSION_TIMEOUT = '/mock/user/sessionTimeout',\n  TOKEN_EXPIRED = '/mock/user/tokenExpired',\n}\n\n// Get personal center-basic settings\n\nexport const accountInfoApi = () => defHttp.get<GetAccountInfoModel>({ url: Api.ACCOUNT_INFO });\n\nexport const sessionTimeoutApi = () => defHttp.post<void>({ url: Api.SESSION_TIMEOUT });\n\nexport const tokenExpiredApi = () => defHttp.post<void>({ url: Api.TOKEN_EXPIRED });\n"
  },
  {
    "path": "jeecgboot-vue3/src/api/demo/error.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\n\nenum Api {\n  // The address does not exist\n  Error = '/error',\n}\n\n/**\n * @description: Trigger ajax error\n */\n\nexport const fireErrorApi = () => defHttp.get({ url: Api.Error });\n"
  },
  {
    "path": "jeecgboot-vue3/src/api/demo/model/accountModel.ts",
    "content": "export interface GetAccountInfoModel {\n  email: string;\n  name: string;\n  introduction: string;\n  phone: string;\n  address: string;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/api/demo/model/optionsModel.ts",
    "content": "import { BasicFetchResult } from '/@/api/model/baseModel';\n\nexport interface DemoOptionsItem {\n  label: string;\n  value: string;\n}\n\nexport interface selectParams {\n  id: number | string;\n}\n\n/**\n * @description: Request list return value\n */\nexport type DemoOptionsGetResultModel = BasicFetchResult<DemoOptionsItem>;\n"
  },
  {
    "path": "jeecgboot-vue3/src/api/demo/model/systemModel.ts",
    "content": "import { BasicPageParams, BasicFetchResult } from '/@/api/model/baseModel';\n\nexport type AccountParams = BasicPageParams & {\n  account?: string;\n  nickname?: string;\n};\n\nexport type RoleParams = {\n  roleName?: string;\n  status?: string;\n};\n\nexport type TestParams = {\n  testName?: string;\n};\n\nexport type RolePageParams = BasicPageParams & RoleParams;\n\nexport type TestPageParams = BasicPageParams & TestParams;\n\nexport type UserPageParams = BasicPageParams & UserParams;\n\nexport type DeptParams = {\n  deptName?: string;\n  status?: string;\n};\n\nexport type UserParams = {\n  username?: string;\n};\n\nexport type MenuParams = {\n  menuName?: string;\n  status?: string;\n};\n\nexport interface AccountListItem {\n  id: string;\n  account: string;\n  email: string;\n  nickname: string;\n  role: number;\n  createTime: string;\n  remark: string;\n  status: number;\n}\n\nexport interface DeptListItem {\n  id: string;\n  orderNo: string;\n  createTime: string;\n  remark: string;\n  status: number;\n}\n\nexport interface MenuListItem {\n  id: string;\n  orderNo: string;\n  createTime: string;\n  status: number;\n  icon: string;\n  component: string;\n  permission: string;\n}\n\nexport interface RoleListItem {\n  id: string;\n  roleName: string;\n  roleValue: string;\n  status: number;\n  orderNo: string;\n  createTime: string;\n}\nexport interface TestListItem {\n  id: string;\n  testName: string;\n  testValue: string;\n  createTime: string;\n}\n\nexport interface UserListItem {\n  id: string;\n  username: string;\n  password: string;\n  realname: string;\n}\n\n/**\n * @description: Request list return value\n */\nexport type AccountListGetResultModel = BasicFetchResult<AccountListItem>;\n\nexport type DeptListGetResultModel = BasicFetchResult<DeptListItem>;\n\nexport type MenuListGetResultModel = BasicFetchResult<MenuListItem>;\n\nexport type RolePageListGetResultModel = BasicFetchResult<RoleListItem>;\n\nexport type RoleListGetResultModel = RoleListItem[];\n\nexport type TestListGetResultModel = TestListItem[];\n\nexport type UserListGetResultModel = UserListItem[];\n"
  },
  {
    "path": "jeecgboot-vue3/src/api/demo/model/tableModel.ts",
    "content": "import { BasicPageParams, BasicFetchResult } from '/@/api/model/baseModel';\n/**\n * @description: Request list interface parameters\n */\nexport type DemoParams = BasicPageParams;\n\nexport interface DemoListItem {\n  id: string;\n  beginTime: string;\n  endTime: string;\n  address: string;\n  name: string;\n  no: number;\n  status: number;\n}\n\n/**\n * @description: Request list return value\n */\nexport type DemoListGetResultModel = BasicFetchResult<DemoListItem>;\n"
  },
  {
    "path": "jeecgboot-vue3/src/api/demo/select.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { DemoOptionsItem, selectParams } from './model/optionsModel';\nenum Api {\n  OPTIONS_LIST = '/mock/select/getDemoOptions',\n}\n\n/**\n * @description: Get sample options value\n */\nexport const optionsListApi = (params?: selectParams) => defHttp.get<DemoOptionsItem[]>({ url: Api.OPTIONS_LIST, params });\n"
  },
  {
    "path": "jeecgboot-vue3/src/api/demo/system.ts",
    "content": "import {\n  AccountParams,\n  DeptListItem,\n  MenuParams,\n  RoleParams,\n  TestPageParams,\n  RolePageParams,\n  MenuListGetResultModel,\n  DeptListGetResultModel,\n  AccountListGetResultModel,\n  RolePageListGetResultModel,\n  RoleListGetResultModel,\n  TestListGetResultModel,\n} from './model/systemModel';\nimport { defHttp } from '/@/utils/http/axios';\n\nenum Api {\n  AccountList = '/mock/system/getAccountList',\n  IsAccountExist = '/mock/system/accountExist',\n  DeptList = '/mock/system/getDeptList',\n  setRoleStatus = '/mock/system/setRoleStatus',\n  MenuList = '/mock/system/getMenuList',\n  RolePageList = '/mock/system/getRoleListByPage',\n  DemoTableList = '/mock/system/getDemoTableListByPage',\n  TestPageList = '/mock/system/getTestListByPage',\n  GetAllRoleList = '/mock/system/getAllRoleList',\n}\n\nexport const getAccountList = (params: AccountParams) => defHttp.get<AccountListGetResultModel>({ url: Api.AccountList, params });\n\nexport const getDeptList = (params?: DeptListItem) => defHttp.get<DeptListGetResultModel>({ url: Api.DeptList, params });\n\nexport const getMenuList = (params?: MenuParams) => defHttp.get<MenuListGetResultModel>({ url: Api.MenuList, params });\n\nexport const getRoleListByPage = (params?: RolePageParams) => defHttp.get<RolePageListGetResultModel>({ url: Api.RolePageList, params });\n\nexport const getAllRoleList = (params?: RoleParams) => defHttp.get<RoleListGetResultModel>({ url: Api.GetAllRoleList, params });\n\nexport const setRoleStatus = (id: number, status: string) => defHttp.post({ url: Api.setRoleStatus, params: { id, status } });\n\nexport const getTestListByPage = (params?: TestPageParams) => defHttp.get<TestListGetResultModel>({ url: Api.TestPageList, params });\n\nexport const getDemoTableListByPage = (params) => defHttp.get({ url: Api.DemoTableList, params });\n\nexport const isAccountExist = (account: string) => defHttp.post({ url: Api.IsAccountExist, params: { account } }, { errorMessageMode: 'none' });\n"
  },
  {
    "path": "jeecgboot-vue3/src/api/demo/table.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { DemoParams, DemoListGetResultModel } from './model/tableModel';\n\nenum Api {\n  DEMO_LIST = '/mock/table/getDemoList',\n}\n\n/**\n * @description: Get sample list value\n */\n\nexport const demoListApi = (params: DemoParams) =>\n  defHttp.get<DemoListGetResultModel>({\n    url: Api.DEMO_LIST,\n    params,\n    headers: {\n      ignoreCancelToken: true,\n    },\n  });\n"
  },
  {
    "path": "jeecgboot-vue3/src/api/demo/tree.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\n\nenum Api {\n  TREE_OPTIONS_LIST = '/mock/tree/getDemoOptions',\n}\n\n/**\n * @description: Get sample options value\n */\nexport const treeOptionsListApi = (params?: Recordable) => defHttp.get<Recordable[]>({ url: Api.TREE_OPTIONS_LIST, params });\n"
  },
  {
    "path": "jeecgboot-vue3/src/api/model/baseModel.ts",
    "content": "export interface BasicPageParams {\n  page: number;\n  pageSize: number;\n}\n\nexport interface BasicFetchResult<T extends any> {\n  items: T[];\n  total: number;\n}\n\nexport interface BasicResult<T extends any> {\n  records: T[];\n  total: number;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/api/sys/menu.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { getMenuListResultModel } from './model/menuModel';\nimport { useUserStoreWithOut } from '@/store/modules/user';\nimport { setAuthCache } from '@/utils/auth';\nimport { TOKEN_KEY } from '@/enums/cacheEnum';\nimport { router } from '@/router';\nimport { PageEnum } from '@/enums/pageEnum';\n\nenum Api {\n  GetMenuList = '/sys/permission/getUserPermissionByToken',\n  // 【QQYUN-8487】\n  // SwitchVue3Menu = '/sys/switchVue3Menu',\n}\n\n/**\n * @description: Get user menu based on id\n */\n\nexport const getMenuList = () => {\n  return new Promise((resolve) => {\n    //为了兼容mock和接口数据\n    defHttp.get<getMenuListResultModel>({ url: Api.GetMenuList }).then((res) => {\n      if (Array.isArray(res)) {\n        resolve(res);\n      } else {\n        resolve(res['menu']);\n      }\n    });\n  });\n};\n\n/**\n * @description: 获取后台菜单权限和按钮权限\n */\nexport function getBackMenuAndPerms() {\n  return defHttp.get({ url: Api.GetMenuList }).catch((e) => {\n    console.log('接口 getBackMenuAndPerms 异常错误信息：', e);\n    // Token过期失效，直接跳转登录页面 2025-09-08 scott\n    if (e && (e.message.includes('timeout') || e.message.includes('401') || e.message.includes('500'))) {\n      const userStore = useUserStoreWithOut();\n      userStore.setToken('');\n      setAuthCache(TOKEN_KEY, null);\n      router.push({\n        path: PageEnum.BASE_LOGIN,\n        query: {\n          // 传入当前的路由，登录成功后跳转到当前路由\n          redirect: router.currentRoute.value.fullPath,\n        }\n      });\n    }\n  });\n}\n\n/**\n * 切换成vue3菜单\n */\n// export const switchVue3Menu = () => {\n//   return new Promise((resolve) => {\n//     defHttp.get({ url: Api.SwitchVue3Menu });\n//   });\n// };\n"
  },
  {
    "path": "jeecgboot-vue3/src/api/sys/model/menuModel.ts",
    "content": "import type { RouteMeta } from 'vue-router';\nexport interface RouteItem {\n  path: string;\n  component: any;\n  meta: RouteMeta;\n  name?: string;\n  alias?: string | string[];\n  redirect?: string;\n  caseSensitive?: boolean;\n  children?: RouteItem[];\n}\n\n/**\n * @description: Get menu return value\n */\nexport type getMenuListResultModel = RouteItem[];\n"
  },
  {
    "path": "jeecgboot-vue3/src/api/sys/model/uploadModel.ts",
    "content": "export interface UploadApiResult {\n  message: string;\n  code: number;\n  url: string;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/api/sys/model/userModel.ts",
    "content": "/**\n * @description: Login interface parameters\n */\nexport interface LoginParams {\n  username: string;\n  password: string;\n}\n\nexport interface ThirdLoginParams {\n  token: string;\n  thirdType: string;\n}\n\nexport interface RoleInfo {\n  roleName: string;\n  value: string;\n}\n\n/**\n * @description: Login interface return value\n */\nexport interface LoginResultModel {\n  userId: string | number;\n  token: string;\n  role: RoleInfo;\n  userInfo?: any\n}\n\n/**\n * @description: Get user information return value\n */\nexport interface GetUserInfoModel {\n  roles: RoleInfo[];\n  // 用户id\n  userId: string | number;\n  // 用户名\n  username: string;\n  // 真实名字\n  realname: string;\n  // 头像\n  avatar: string;\n  // 介绍\n  desc?: string;\n  // 用户信息\n  userInfo?: any;\n  // 缓存字典项\n  sysAllDictItems?: any;\n}\n\n/**\n * @description: Get user information return value\n */\nexport interface GetResultModel {\n  code: number;\n  message: string;\n  result: object;\n  success: Boolean;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/api/sys/upload.ts",
    "content": "import { UploadApiResult } from './model/uploadModel';\nimport { defHttp } from '/@/utils/http/axios';\nimport { UploadFileParams } from '/#/axios';\nimport { useGlobSetting } from '/@/hooks/setting';\n\nconst { uploadUrl = '' } = useGlobSetting();\n\n/**\n * @description: Upload interface\n */\nexport function uploadApi(params: UploadFileParams, onUploadProgress: (progressEvent: ProgressEvent) => void) {\n  return defHttp.uploadFile<UploadApiResult>(\n    {\n      url: uploadUrl,\n      onUploadProgress,\n    },\n    params\n  );\n}\n/**\n * @description: Upload interface\n */\nexport function uploadImg(params: UploadFileParams, onUploadProgress: (progressEvent: ProgressEvent) => void) {\n  return defHttp.uploadFile<UploadApiResult>(\n    {\n      url: `${uploadUrl}/sys/common/upload`,\n      onUploadProgress,\n    },\n    params,\n    { isReturnResponse: true }\n  );\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/api/sys/user.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { LoginParams, LoginResultModel, GetUserInfoModel } from './model/userModel';\n\nimport { ErrorMessageMode } from '/#/axios';\nimport { useMessage } from '/@/hooks/web/useMessage';\nimport { useUserStoreWithOut } from '/@/store/modules/user';\nimport { setAuthCache } from '/@/utils/auth';\nimport { TOKEN_KEY } from '/@/enums/cacheEnum';\nimport { router } from '/@/router';\nimport { PageEnum } from '/@/enums/pageEnum';\nimport { ExceptionEnum } from \"@/enums/exceptionEnum\";\n\nconst { createErrorModal } = useMessage();\nenum Api {\n  Login = '/sys/login',\n  phoneLogin = '/sys/phoneLogin',\n  Logout = '/sys/logout',\n  GetUserInfo = '/sys/user/getUserInfo',\n  // 获取系统权限\n  // 1、查询用户拥有的按钮/表单访问权限\n  // 2、所有权限\n  // 3、系统安全模式\n  GetPermCode = '/sys/permission/getPermCode',\n  //新加的获取图形验证码的接口\n  getInputCode = '/sys/randomImage',\n  //获取短信验证码的接口\n  getCaptcha = '/sys/sms',\n  //注册接口\n  registerApi = '/sys/user/register',\n  //校验用户接口\n  checkOnlyUser = '/sys/user/checkOnlyUser',\n  //SSO登录校验\n  validateCasLogin = '/sys/cas/client/validateLogin',\n  //校验手机号\n  phoneVerify = '/sys/user/phoneVerification',\n  //修改密码\n  passwordChange = '/sys/user/passwordChange',\n  //第三方登录\n  thirdLogin = '/sys/thirdLogin/getLoginUser',\n  //第三方登录\n  getThirdCaptcha = '/sys/thirdSms',\n  //获取二维码信息\n  getLoginQrcode = '/sys/getLoginQrcode',\n  //监控二维码扫描状态\n  getQrcodeToken = '/sys/getQrcodeToken',\n}\n\n/**\n * @description: user login api\n */\nexport function loginApi(params: LoginParams, mode: ErrorMessageMode = 'modal') {\n  return defHttp.post<LoginResultModel>(\n    {\n      url: Api.Login,\n      params,\n    },\n    {\n      errorMessageMode: mode,\n    }\n  );\n}\n\n/**\n * @description: user phoneLogin api\n */\nexport function phoneLoginApi(params: LoginParams, mode: ErrorMessageMode = 'modal') {\n  return defHttp.post<LoginResultModel>(\n    {\n      url: Api.phoneLogin,\n      params,\n    },\n    {\n      errorMessageMode: mode,\n    }\n  );\n}\n\n/**\n * @description: getUserInfo\n */\nexport function getUserInfo() {\n  return defHttp.get<GetUserInfoModel>({ url: Api.GetUserInfo }, {}).catch((e) => {\n    // Token过期失效，直接跳转登录页面\n    if (e && (e.message.includes('timeout') || e.message.includes('401'))) {\n      //接口不通时跳转到登录界面\n      const userStore = useUserStoreWithOut();\n      userStore.setToken('');\n      setAuthCache(TOKEN_KEY, null);\n      router.push({\n        path: PageEnum.BASE_LOGIN,\n        query: {\n          // 传入当前的路由，登录成功后跳转到当前路由\n          redirect: router.currentRoute.value.fullPath,\n        }\n      });\n    }\n  });\n}\n\nexport function getPermCode() {\n  return defHttp.get({ url: Api.GetPermCode });\n}\n\nexport function doLogout() {\n  return defHttp.get({ url: Api.Logout });\n}\n\nexport function getCodeInfo(currdatetime) {\n  let url = Api.getInputCode + `/${currdatetime}`;\n  return defHttp.get({ url: url });\n}\n/**\n * @description: 获取短信验证码\n */\nexport function getCaptcha(params) {\n  return new Promise((resolve, reject) => {\n    defHttp.post({ url: Api.getCaptcha, params }, { isTransformResponse: false }).then((res) => {\n      console.log(res);\n      if (res.success) {\n        resolve(true);\n      } else {\n        // 代码逻辑说明: 【QQYUN-9005】同一个IP，1分钟超过5次短信，则提示需要验证码---\n        if(res.code != ExceptionEnum.PHONE_SMS_FAIL_CODE){\n          createErrorModal({ title: '错误提示', content: res.message || '未知问题' });\n          reject();\n        }\n        reject(res);\n      }\n    }).catch((res)=>{\n      createErrorModal({ title: '错误提示', content: res.message || '未知问题' });\n      reject();\n    });\n  });\n}\n\n/**\n * @description: 注册接口\n */\nexport function register(params) {\n  return defHttp.post({ url: Api.registerApi, params }, { isReturnNativeResponse: true });\n}\n\n/**\n *校验用户是否存在\n * @param params\n */\nexport const checkOnlyUser = (params) => defHttp.get({ url: Api.checkOnlyUser, params }, { isTransformResponse: false });\n/**\n *校验手机号码\n * @param params\n */\nexport const phoneVerify = (params) => defHttp.post({ url: Api.phoneVerify, params }, { isTransformResponse: false });\n/**\n *密码修改\n * @param params\n */\nexport const passwordChange = (params) => defHttp.get({ url: Api.passwordChange, params }, { isTransformResponse: false });\n/**\n * @description: 第三方登录\n */\nexport function thirdLogin(params, mode: ErrorMessageMode = 'modal') {\n  //==========begin 第三方登录/auth2登录需要传递租户id===========\n  let tenantId = \"0\";\n  if(!params.tenantId){\n    tenantId = params.tenantId;\n  }\n  //==========end 第三方登录/auth2登录需要传递租户id===========\n  return defHttp.get<LoginResultModel>(\n    {\n      url: `${Api.thirdLogin}/${params.token}/${params.thirdType}/${tenantId}`,\n    },\n    {\n      errorMessageMode: mode,\n    }\n  );\n}\n/**\n * @description: 获取第三方短信验证码\n */\nexport function setThirdCaptcha(params) {\n  return new Promise((resolve, reject) => {\n    defHttp.post({ url: Api.getThirdCaptcha, params }, { isTransformResponse: false }).then((res) => {\n      console.log(res);\n      if (res.success) {\n        resolve(true);\n      } else {\n        createErrorModal({ title: '错误提示', content: res.message || '未知问题' });\n        reject();\n      }\n    });\n  });\n}\n\n/**\n * 获取登录二维码信息\n */\nexport function getLoginQrcode() {\n  let url = Api.getLoginQrcode;\n  return defHttp.get({ url: url });\n}\n\n/**\n * 监控扫码状态\n */\nexport function getQrcodeToken(params) {\n  let url = Api.getQrcodeToken;\n  return defHttp.get({ url: url, params });\n}\n\n/**\n * SSO登录校验\n */\nexport async function validateCasLogin(params) {\n  let url = Api.validateCasLogin;\n  return defHttp.get({ url: url, params });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/assets/icons/js/iconfont.js",
    "content": "window._iconfont_svg_string_3814468='<svg><symbol id=\"icon-time1\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.96 64 64 264.96 64 512s200.96 448 448 448 448-200.96 448-448S759.04 64 512 64zM512 895.712c-211.584 0-383.712-172.16-383.712-383.712C128.288 300.416 300.416 128.288 512 128.288c211.552 0 383.712 172.128 383.712 383.712C895.712 723.552 723.552 895.712 512 895.712z\"  ></path><path d=\"M671.968 512 512 512 512 288.064c0-17.76-14.24-32.128-32-32.128s-32 14.4-32 32.128L448 544c0 17.76 14.272 32 32 32l191.968 0c17.76 0 32.128-14.24 32.128-32S689.728 512 671.968 512z\"  ></path></symbol><symbol id=\"icon-select2\" viewBox=\"0 0 1024 1024\"><path d=\"M768 160 256 160C204.8 160 160 204.8 160 256l0 512c0 51.2 44.8 96 96 96l512 0c51.2 0 96-44.8 96-96L864 256C864 204.8 819.2 160 768 160zM800 768c0 19.2-12.8 32-32 32L256 800c-19.2 0-32-12.8-32-32L224 256c0-19.2 12.8-32 32-32l512 0c19.2 0 32 12.8 32 32L800 768z\"  ></path><path d=\"M448 672c-6.4 0-19.2 0-25.6-6.4l-128-128c-12.8-12.8-12.8-32 0-44.8s32-12.8 44.8 0L448 595.2l230.4-230.4c12.8-12.8 32-12.8 44.8 0s12.8 32 0 44.8l-256 256C467.2 672 454.4 672 448 672z\"  ></path></symbol><symbol id=\"icon-department\" viewBox=\"0 0 1024 1024\"><path d=\"M926.592 922.688l-157.312 0c-18.432 0-33.344-21.056-33.344-46.976L735.936 745.6c0-25.984 14.912-46.976 33.344-46.976l157.312 0c18.432 0 33.408 20.992 33.408 46.976l0 130.048C960 901.632 945.088 922.688 926.592 922.688zM773.312 513.152l-224 0L549.312 624 512 624 512 513.152 249.472 513.152C171.008 513.216 174.848 566.976 174.848 624L138.688 624 138.688 569.28c0-49.472 39.552-94.144 88.448-94.208L512 474.688 512 400l37.312 0 0 74.688 260.16 0c48.896 0.064 74.624 25.152 74.688 74.688L884.16 624 848 624C847.936 550.272 835.712 513.216 773.312 513.152zM653.504 325.312 406.528 325.312c-24.256 0-43.84-21.824-43.84-48.768L362.688 150.08c0-26.944 19.648-48.768 43.84-48.768l246.976 0c24.256 0 43.968 21.824 43.968 48.768l0 126.464C697.472 303.488 677.824 325.312 653.504 325.312zM288 745.6l0 130.048c0 25.92-14.976 46.976-33.344 46.976L97.344 922.624C78.912 922.688 64 901.632 64 875.712L64 745.6c0-25.984 14.912-46.976 33.344-46.976l157.312 0C273.024 698.688 288 719.68 288 745.6zM433.344 698.688l157.312 0c18.432 0 33.344 20.992 33.344 46.976l0 130.048c0 25.92-14.912 46.976-33.344 46.976L433.344 922.688c-18.432 0-33.344-21.056-33.344-46.976L400 745.6C400 719.68 414.912 698.688 433.344 698.688z\"  ></path></symbol><symbol id=\"icon-tipsdepartmentdown\" viewBox=\"0 0 1025 1024\"><path d=\"M211.451008 532.32448 509.990336 532.32448 509.990336 658.368 552.443008 658.368 552.443008 532.31936 807.169408 532.31936C878.11072 532.31936 892.079872 574.52288 892.079872 658.368L933.177408 658.368 933.177408 573.45792C938.679552 532.06464 909.579584 494.04416 868.18656 488.54208 861.563648 487.6608 854.849088 487.66592 848.226176 488.5472L552.40224 488.5472 552.40224 403.64224 509.949568 403.64224 509.949568 488.55232 185.978368 489.06176C129.103104 491.91488 84.673728 539.23776 85.40224 596.17408L85.40224 658.368 126.540544 658.368C126.540544 593.49952 122.296768 532.36544 211.451008 532.32448L211.451008 532.32448ZM390.014208 318.73152 670.890816 318.73152C699.960192 317.13152 722.284352 292.36224 720.85792 263.28256L720.85792 119.44896C722.279296 90.36928 699.955072 65.6 670.890816 64L390.014208 64C360.970304 65.61984 338.681728 90.38976 340.128576 119.44896L340.128576 263.28768C338.681728 292.34176 360.965248 317.11168 390.014208 318.73152L390.014208 318.73152ZM217.263872 723.2 38.405248 723.2C13.605056 728.1312-3.033664 751.56608 0.491712 776.60608L0.491712 924.5152C-3.013312 949.55008 13.615232 972.9696 38.405248 977.92128L217.263872 977.92128C242.058944 972.9696 258.697664 949.5552 255.218112 924.5152L255.218112 776.60608C258.723136 751.56096 242.06912 728.1312 217.263872 723.2L217.263872 723.2ZM601.314624 723.2 422.410112 723.2C397.594688 728.11136 380.950848 751.56096 384.49664 776.60608L384.49664 924.5152C380.991616 949.55008 397.62016 972.9696 422.410112 977.92128L601.314624 977.92128C626.104576 972.9696 642.728064 949.55008 639.228096 924.5152L639.228096 776.60608C642.748416 751.56608 626.114816 728.1312 601.314624 723.2L601.314624 723.2ZM1023.218112 776.60608C1026.743552 751.55584 1010.084416 728.11136 985.263872 723.2L806.405248 723.2C781.605056 728.1312 764.966336 751.56608 768.491712 776.60608L768.491712 924.5152C764.986688 949.55008 781.615232 972.9696 806.405248 977.92128L985.263872 977.92128C1010.06912 972.99008 1026.71808 949.56032 1023.218112 924.5152L1023.218112 776.60608 1023.218112 776.60608ZM959.785728 813.93792C961.55072 801.39648 953.210368 789.65888 940.783936 787.2L851.238144 787.2C838.821952 789.66912 830.491712 801.4016 832.256768 813.93792L832.256768 887.98848C830.501952 900.52224 838.827008 912.24704 851.238144 914.7264L940.783936 914.7264C953.202688 912.25728 961.537984 900.52736 959.785728 887.98848L959.785728 813.93792 959.785728 813.93792ZM575.785728 813.93792C577.55072 801.39648 569.210368 789.65888 556.783936 787.2L467.238144 787.2C454.821952 789.66912 446.491712 801.4016 448.256768 813.93792L448.256768 887.98848C446.501952 900.52224 454.827008 912.24704 467.238144 914.7264L556.783936 914.7264C569.202688 912.25728 577.537984 900.52736 575.785728 887.98848L575.785728 813.93792 575.785728 813.93792ZM191.785728 813.93792C193.55072 801.39648 185.210368 789.65888 172.783936 787.2L83.238144 787.2C70.821952 789.66912 62.491712 801.4016 64.256768 813.93792L64.256768 887.98848C62.501952 900.52224 70.827008 912.24704 83.238144 914.7264L172.783936 914.7264C185.202688 912.25728 193.537984 900.52736 191.785728 887.98848L191.785728 813.93792 191.785728 813.93792Z\" fill=\"#333\" ></path></symbol><symbol id=\"icon-input1\" viewBox=\"0 0 1024 1024\"><path d=\"M118.784 727.04h778.24V296.96h-778.24v430.08zM77.824 256h860.16v512H77.824V256zM194.56 409.6v204.8c0 12.288 8.192 20.48 20.48 20.48s20.48-8.192 20.48-20.48V409.6c0-12.288-8.192-20.48-20.48-20.48s-20.48 8.192-20.48 20.48z\"  ></path></symbol><symbol id=\"icon-calendar\" viewBox=\"0 0 1024 1024\"><path d=\"M853.333333 149.333333h-138.666666V106.666667c0-17.066667-14.933333-32-32-32s-32 14.933333-32 32v42.666666h-277.333334V106.666667c0-17.066667-14.933333-32-32-32s-32 14.933333-32 32v42.666666H170.666667c-40.533333 0-74.666667 34.133333-74.666667 74.666667v618.666667C96 883.2 130.133333 917.333333 170.666667 917.333333h682.666666c40.533333 0 74.666667-34.133333 74.666667-74.666666v-618.666667C928 183.466667 893.866667 149.333333 853.333333 149.333333zM170.666667 213.333333h138.666666v64c0 17.066667 14.933333 32 32 32s32-14.933333 32-32v-64h277.333334v64c0 17.066667 14.933333 32 32 32s32-14.933333 32-32v-64H853.333333c6.4 0 10.666667 4.266667 10.666667 10.666667v194.133333c-4.266667-2.133333-6.4-2.133333-10.666667-2.133333H170.666667c-4.266667 0-6.4 0-10.666667 2.133333v-194.133333c0-6.4 4.266667-10.666667 10.666667-10.666667z m682.666666 640H170.666667c-6.4 0-10.666667-4.266667-10.666667-10.666666V477.866667c4.266667 2.133333 6.4 2.133333 10.666667 2.133333h682.666666c4.266667 0 6.4 0 10.666667-2.133333v364.8c0 6.4-4.266667 10.666667-10.666667 10.666666z\"  ></path><path d=\"M384 608h-85.333333c-17.066667 0-32 14.933333-32 32s14.933333 32 32 32h85.333333c17.066667 0 32-14.933333 32-32s-14.933333-32-32-32zM725.333333 608h-192c-17.066667 0-32 14.933333-32 32s14.933333 32 32 32h192c17.066667 0 32-14.933333 32-32s-14.933333-32-32-32z\"  ></path></symbol><symbol id=\"icon-email1\" viewBox=\"0 0 1024 1024\"><path d=\"M874.666667 181.333333H149.333333c-40.533333 0-74.666667 34.133333-74.666666 74.666667v512c0 40.533333 34.133333 74.666667 74.666666 74.666667h725.333334c40.533333 0 74.666667-34.133333 74.666666-74.666667V256c0-40.533333-34.133333-74.666667-74.666666-74.666667z m-725.333334 64h725.333334c6.4 0 10.666667 4.266667 10.666666 10.666667v25.6L512 516.266667l-373.333333-234.666667V256c0-6.4 4.266667-10.666667 10.666666-10.666667z m725.333334 533.333334H149.333333c-6.4 0-10.666667-4.266667-10.666666-10.666667V356.266667l356.266666 224c4.266667 4.266667 10.666667 4.266667 17.066667 4.266666s12.8-2.133333 17.066667-4.266666l356.266666-224V768c0 6.4-4.266667 10.666667-10.666666 10.666667z\"  ></path></symbol><symbol id=\"icon-user1\" viewBox=\"0 0 1024 1024\"><path d=\"M512 74.666667C270.933333 74.666667 74.666667 270.933333 74.666667 512S270.933333 949.333333 512 949.333333 949.333333 753.066667 949.333333 512 753.066667 74.666667 512 74.666667zM288 810.666667c0-123.733333 100.266667-224 224-224S736 686.933333 736 810.666667c-61.866667 46.933333-140.8 74.666667-224 74.666666s-162.133333-27.733333-224-74.666666z m128-384c0-53.333333 42.666667-96 96-96s96 42.666667 96 96-42.666667 96-96 96-96-42.666667-96-96z m377.6 328.533333c-19.2-96-85.333333-174.933333-174.933333-211.2 32-29.866667 51.2-70.4 51.2-117.333333 0-87.466667-72.533333-160-160-160s-160 72.533333-160 160c0 46.933333 19.2 87.466667 51.2 117.333333-89.6 36.266667-155.733333 115.2-174.933334 211.2-55.466667-66.133333-91.733333-149.333333-91.733333-243.2 0-204.8 168.533333-373.333333 373.333333-373.333333S885.333333 307.2 885.333333 512c0 93.866667-34.133333 177.066667-91.733333 243.2z\"  ></path></symbol><symbol id=\"icon-number1\" viewBox=\"0 0 1024 1024\"><path d=\"M279.273 791.273h512a46.545 46.545 0 0 1 0 93.09h-512a46.545 46.545 0 0 1 0-93.09z m33.838-617.984v478.347H193.722V395.171c0-37.004-0.884-59.299-2.653-66.746a24.948 24.948 0 0 0-14.615-16.99c-8.006-3.863-25.786-5.771-53.341-5.771H111.29v-55.855c57.717-12.38 101.562-37.888 131.491-76.52h70.284z m303.71 396.8v81.547H354.163v-68.235c77.778-127.256 124.044-206.01 138.706-236.218 14.662-30.255 22.016-53.854 22.016-70.75 0-13.032-2.234-22.714-6.656-29.137-4.422-6.377-11.171-9.588-20.247-9.588a22.249 22.249 0 0 0-20.201 10.612c-4.469 7.121-6.656 21.178-6.656 42.263v45.522H354.164V318.65c0-26.763 1.397-47.942 4.143-63.348 2.746-15.5 9.542-30.72 20.387-45.661 10.798-14.988 24.902-26.298 42.217-33.978 17.361-7.68 38.167-11.544 62.37-11.544 47.477 0 83.317 11.776 107.707 35.328 24.296 23.552 36.445 53.341 36.445 89.368 0 27.368-6.842 56.32-20.48 86.853-13.731 30.534-54.04 95.325-121.018 194.42H616.82z m270.615-189.394c18.152 6.098 31.65 16.105 40.494 29.976 8.844 13.917 13.312 46.452 13.312 97.652 0 38.028-4.329 67.49-13.033 88.53-8.657 20.945-23.598 36.91-44.87 47.848-21.27 10.938-48.593 16.384-81.873 16.384-37.795 0-67.49-6.33-89.088-19.084-21.55-12.66-35.747-28.253-42.542-46.638-6.796-18.432-10.194-50.362-10.194-95.884v-37.841h119.39v77.73c0 20.667 1.21 33.84 3.723 39.425 2.42 5.585 7.913 8.424 16.337 8.424 9.31 0 15.36-3.537 18.34-10.612 2.932-7.121 4.421-25.6 4.421-55.575v-33.047c0-18.34-2.048-31.744-6.19-40.216a30.72 30.72 0 0 0-18.34-16.71c-8.052-2.653-23.738-4.189-46.964-4.561V357.05c28.393 0 45.894-1.07 52.597-3.258a22.947 22.947 0 0 0 14.475-14.15c2.933-7.307 4.422-18.711 4.422-34.257V278.76c0-16.757-1.722-27.741-5.12-33.048-3.49-5.352-8.844-8.005-16.151-8.005-8.285 0-13.964 2.792-16.99 8.378-3.025 5.632-4.56 17.64-4.56 35.933v39.284h-119.39V280.53c0-45.66 10.473-76.567 31.325-92.625 20.9-16.058 54.086-24.064 99.608-24.064 56.878 0 95.51 11.17 115.805 33.373 20.293 22.249 30.394 53.202 30.394 92.765 0 26.81-3.63 46.173-10.892 58.089-7.307 11.916-20.107 22.807-38.446 32.628z\"  ></path></symbol><symbol id=\"icon-190tree\" viewBox=\"0 0 1024 1024\"><path d=\"M800 832c-41.6 0-76.8 25.6-89.6 64H288c-19.2 0-32-12.8-32-32V537.6c0 3.2 22.4 6.4 32 6.4h422.4c12.8 38.4 48 64 89.6 64 54.4 0 96-41.6 96-96s-41.6-96-96-96c-41.6 0-76.8 25.6-89.6 64H288c-19.2 0-32-12.8-32-32V185.6c32-12.8 64-48 64-89.6 0-54.4-41.6-96-96-96-51.2 0-96 41.6-96 96 0 41.6 32 76.8 64 89.6V864c0 54.4 44.8 96 96 96h422.4c12.8 38.4 48 64 89.6 64 54.4 0 96-41.6 96-96s-41.6-96-96-96z m0-384c35.2 0 64 28.8 64 64s-28.8 64-64 64-64-28.8-64-64 28.8-64 64-64zM160 96c0-35.2 28.8-64 64-64s64 28.8 64 64-28.8 64-64 64-64-28.8-64-64z m640 896c-35.2 0-64-28.8-64-64s28.8-64 64-64 64 28.8 64 64-28.8 64-64 64z\"  ></path></symbol><symbol id=\"icon-dict-fill\" viewBox=\"0 0 1024 1024\"><path d=\"M764 888H200V324a4 4 0 0 0-4-4h-64a4 4 0 0 0-4 4v596a40 40 0 0 0 40 40h596a4 4 0 0 0 4-4v-64a4 4 0 0 0-4-4zM551.9 311.8h-57.5v327.1h56.8c83 0 120.4-60.6 120.4-172.6 0-99.9-40.2-154.5-119.7-154.5zM856 128H312a40 40 0 0 0-40 40v608a40 40 0 0 0 40 40h544a40 40 0 0 0 40-40V168a40 40 0 0 0-40-40zM552.8 694H430.2a4 4 0 0 1-4-4V260a4 4 0 0 1 4-4h128.5c116 0 183.1 74.2 183.1 208.9 0 144.8-63.5 229.1-189 229.1z\"  ></path></symbol><symbol id=\"icon-user\" viewBox=\"0 0 1024 1024\"><path d=\"M648.6 538.9c63.2-46.6 104.2-121.6 104.2-206C752.8 191.8 638 77 496.9 77S241 191.8 241 332.9c0 84.4 41.1 159.4 104.2 206C200.4 598.7 98.3 741.4 98.3 907.5c0 22.1 17.9 40 40 40s40-17.9 40-40c0-175.8 143-318.7 318.7-318.7s318.7 143 318.7 318.7c0 22.1 17.9 40 40 40s40-17.9 40-40c-0.1-166.1-102.3-308.8-247.1-368.6z m-327.7-206c0-97.1 79-176 176-176s176 79 176 176-79 176-176 176-176-79-176-176z\"  ></path></symbol><symbol id=\"icon-user-circle\" viewBox=\"0 0 1024 1024\"><path d=\"M509.44 1018.368c-141.312 0-277.504-59.904-372.736-164.352l-19.968-21.504 19.968-21.504c95.744-104.448 231.424-164.352 372.736-164.352 141.312 0 277.504 59.904 372.736 164.352l19.968 21.504-19.968 21.504c-95.232 104.448-231.424 164.352-372.736 164.352zM204.8 832.512c81.92 77.824 190.976 121.856 304.64 121.856 113.664 0 222.72-44.032 304.64-121.856-81.92-77.824-190.976-121.856-304.64-121.856-113.664 0-222.72 44.032-304.64 121.856zM509.952 600.576c-89.088 0-161.792-72.704-161.792-161.792 0-89.088 72.704-161.792 161.792-161.792s161.792 72.704 161.792 161.792c0 89.088-72.192 161.792-161.792 161.792z m0-259.584c-53.76 0-97.792 44.032-97.792 97.792s44.032 97.792 97.792 97.792 97.792-44.032 97.792-97.792-43.52-97.792-97.792-97.792z\"  ></path><path d=\"M119.296 719.36c-33.792-63.488-51.2-134.144-51.2-206.848 0-243.712 198.144-441.344 441.344-441.344s441.344 198.144 441.344 441.344c0 72.192-17.92 143.36-51.2 206.336 16.384 15.36 31.744 31.744 46.08 49.152 45.568-77.312 69.12-165.376 69.12-255.488 0-279.04-226.816-505.856-505.856-505.856C230.4 7.168 4.096 233.984 4.096 512.512c0 90.112 24.064 178.688 69.632 255.488 13.824-16.896 29.184-33.28 45.568-48.64z\"  ></path></symbol><symbol id=\"icon-dict\" viewBox=\"0 0 1024 1024\"><path d=\"M487.204 238.103h-81.567v340.516h81.567c59.425 0 102.943-13.871 130.303-41.101 26.721-27.868 40.083-70.88 40.083-129.158 0-59.678-13.362-103.329-40.083-129.923-27.359-27.104-70.877-40.336-130.303-40.336z\"  ></path><path d=\"M778.859 61.224H245.306c-59.678 0-108.414 48.738-108.414 108.414v689.437c0 59.677 48.737 108.414 108.414 108.414h533.553c42.628 0 79.657-24.941 97.346-60.826H252.559c-22.269 0-40.591-18.197-40.591-40.59v-51.282c0-22.269 18.197-40.59 40.591-40.59h487.874c80.801 0 146.845-66.042 146.845-146.845V169.641c0-59.678-48.862-108.418-108.418-108.418zM677.696 581.291c-40.083 42.374-98.235 63.626-175.73 63.626H327.507v-473.11h174.458c77.494 0 135.647 21.25 175.73 63.625 38.048 39.703 57.518 97.346 57.518 172.931 0 74.95-19.468 132.59-57.516 172.93z\"  ></path></symbol><symbol id=\"icon-btn\" viewBox=\"0 0 1828 1024\"><path d=\"M1322.88370217 78.26335901C1554.20991077 78.26335901 1745.77692672 273.44484711 1745.77692672 512s-191.56701595 433.73664099-426.50769668 433.73664099H509.62750045C274.68682069 945.73664099 83.11980375 750.55515289 83.11980375 512S274.68682069 78.26335901 509.62750045 78.26335901h813.25620172m0-72.28944H509.62750045C234.92762806 5.97391901 10.83036375 233.68565546 10.83036375 512s224.0972643 506.02608099 498.7971367 506.02608099h813.25620172C1593.96910242 1018.02608099 1818.0663677 790.31434454 1818.0663677 512S1593.96910242 5.97391901 1322.88370217 5.97391901z\"  ></path><path d=\"M715.65240499 501.15658355c28.91577619-14.4578876 39.75919165-36.1447205 39.75919265-65.0604957-3.61447214-46.98813595-28.91577619-75.90391215-83.13285646-75.90391215H589.14588474c-21.68683191 0-32.53024835 10.84341645-32.53024835 32.53024835v249.39856834c0 21.68683191 10.84341645 32.53024835 32.53024835 32.53024836h90.36180075c65.0604957-3.61447214 97.59074405-36.1447205 101.20521619-97.59074505-3.61447214-43.3736638-25.30130405-68.67496785-65.06049669-75.90391215z m-93.9762719-86.7473276h32.53024835c21.68683191 0 36.1447205 10.84341645 36.1447195 32.53024835 0 21.68683191-14.4578876 32.53024835-36.1447195 36.14471951h-32.53024835v-68.67496786z m50.60260809 198.79596024h-50.60260809v-72.28944h46.98813595c28.91577619 0 43.3736638 10.84341645 46.98813595 36.14471951-3.61447214 21.68683191-18.07235974 32.53024835-43.37366381 36.14472049zM968.66544549 356.57770356H806.01420573c-14.4578876 0-25.30130405 10.84341645-25.30130405 28.91577619 0 21.68683191 10.84341645 32.53024835 25.30130405 32.53024835h46.98813596v224.09726429c0 21.68683191 10.84341645 32.53024835 32.53024735 32.53024836 21.68683191 0 32.53024835-10.84341645 32.53024835-32.53024836v-224.09726431h46.98813596c18.07235974 0 28.91577619-10.84341645 28.91577619-32.53024833 3.61447214-18.07235974-7.22894431-28.91577619-25.30130405-28.91577619zM1239.75084573 352.9632314c-21.68683191 0-32.53024835 14.4578876-32.53024733 36.1447205v166.2657119L1066.25618955 367.42112001c-7.22894431-10.84341645-14.4578876-14.4578876-28.91577622-14.45788861-21.68683191 0-32.53024835 14.4578876-32.53024734 36.1447205v253.01304049c0 21.68683191 10.84341645 32.53024835 32.53024734 32.53024836s32.53024835-10.84341645 32.53024835-32.53024836V475.8552795l137.34993672 184.33807265c7.22894431 7.22894431 14.4578876 10.84341645 28.91577617 10.84341643 21.68683191 0 32.53024835-10.84341645 32.53024736-32.53024833v-253.0130405c0-18.07235974-10.84341645-32.53024835-28.9157762-32.53024835z\"  ></path></symbol><symbol id=\"icon-btn2\" viewBox=\"0 0 1024 1024\"><path d=\"M839.68 220.72888889h-72.81777778a36.40888889 36.40888889 0 0 0-36.22684444-36.40888889H111.32017778C91.47733333 184.32 75.09333333 200.74040889 75.09333333 220.98375111v472.80583111A36.40888889 36.40888889 0 0 0 111.32017778 730.45333333H111.50222222v72.81777778H75.09333333c-40.19541333 0-72.81777778-32.40391111-72.81777778-72.70855111V184.21077333C2.27555555 144.05176889 35.11637333 111.50222222 75.09333333 111.50222222h691.76888889c40.19541333 0 72.81777778 32.40391111 72.81777778 72.70855111V220.72888889zM147.91111111 329.77351111A72.81777778 72.81777778 0 0 1 220.91093333 257.13777778h727.81368889A72.81777778 72.81777778 0 0 1 1021.72444445 329.77351111v510.08853334A72.81777778 72.81777778 0 0 1 948.72462222 912.49777778H220.91093333A72.81777778 72.81777778 0 0 1 147.91111111 839.86204445v-510.08853334z m72.81777778 36.84579556v436.39694222A36.37248 36.37248 0 0 0 256.84650667 839.68h655.94254222c19.55157333 0 36.11761778-16.384 36.11761778-36.66375111V366.61930667A36.37248 36.37248 0 0 0 912.78904889 329.95555555H256.84650667C237.29493333 329.95555555 220.72888889 346.33955555 220.72888889 366.61930667z m249.43729778 271.24622222c0 13.83537778-2.18453333 26.36003555-6.5536 37.50115556-4.33265778 11.14112-10.37653333 20.53461333-18.05880889 28.21688888-7.68227555 7.64586667-16.60245333 13.54410667-26.76053333 17.62190222a86.54392889 86.54392889 0 0 1-32.51313778 6.08028445H293.54666667V439.18222222h82.35690666c9.75758222 0 18.93262222 1.82044445 27.52512 5.42492445 8.59249778 3.64088889 16.20195555 8.66531555 22.90119112 15.10968888 6.66282667 6.48078222 11.90570667 14.45432889 15.76504888 23.9570489a83.99530667 83.99530667 0 0 1 4.40547556 45.36547555c-0.87381333 4.84238222-2.18453333 9.42990222-3.82293334 13.79896889-1.67480889 4.36906667-3.78652445 8.33763555-6.37155555 11.94211556a31.60291555 31.60291555 0 0 1-8.84736 8.59249777c5.13365333 1.82044445 10.26730667 5.09724445 15.40096 9.93962667 5.09724445 4.80597333 9.75758222 10.55857778 13.83537778 17.14858666a91.85962667 91.85962667 0 0 1 13.47128889 47.40437334z m-57.70808889 0c0-12.63388445-3.71370667-22.02737778-11.17752889-28.21688889a38.19292445 38.19292445 0 0 0-25.01290667-9.24785778h-28.47175111v74.49258667h28.47175111c4.62392889 0 9.10222222-0.72817778 13.47128889-2.25735111a33.20490667 33.20490667 0 0 0 11.54161778-6.77205333 33.31413333 33.31413333 0 0 0 8.08277333-11.5052089c2.07530667-4.66033778 3.09475555-10.15808 3.09475556-16.49322666z m-18.85980445-117.85557334c0-10.55857778-2.76707555-18.05880889-8.26481778-22.5735111a28.69020445 28.69020445 0 0 0-18.67776-6.77205334h-18.85980444v58.25422222h18.85980444c6.91768889 0 13.14360889-2.18453333 18.67776-6.5536 5.49774222-4.36906667 8.26481778-11.79648 8.26481778-22.35505778z m189.47185778-24.83086222v232.10666667h-59.23726222v-232.54357333h-74.27413334V439.18222222h207.42144v55.99687111h-73.91004444zM830.75982222 730.45333333l-89.12896-163.18464v160.01706667H682.02951111V439.18222222h48.09614222l86.36188445 145.63555556v-145.63555556H876.08888889v291.27111111h-45.32906667z\"  ></path></symbol><symbol id=\"icon-btn3\" viewBox=\"0 0 1536 1024\"><path d=\"M452.488242 541.251023h-100.802821v113.623092h99.272956c22.504318 0 40.41904-3.564586 53.224012-10.709057 16.369558-9.179191 24.569636-23.559925 24.569635-43.998924 0-20.989751-6.119461-35.814145-17.914722-45.054532q-18.419577-13.829982-58.34906-13.860579zM497.527475 479.367974c10.2195-8.735531 15.880001-22.550214 15.880001-41.489945 0-17.379269-5.660501-30.184241-15.880001-37.818269-11.24451-8.184779-28.654376-12.315415-53.224012-12.315415h-92.618042v104.367407h91.593032c25.594645 0 43.494069-4.589596 54.249022-12.743778z\"  ></path><path d=\"M1407.980877 0H128.003825A128.003825 128.003825 0 0 0 0 128.003825v767.99235a128.003825 128.003825 0 0 0 128.003825 128.003825h1279.977052a128.003825 128.003825 0 0 0 128.003824-128.003825v-767.99235A128.003825 128.003825 0 0 0 1407.980877 0zM550.751487 682.503481c-21.509905 14.30424-52.199002 21.418113-91.103476 21.418113H291.806496V338.620372h167.351959c36.334299 0 64.958078 8.689635 85.458272 26.130099 18.909134 16.369558 28.623779 38.36902 28.623779 65.998386 0 20.439-5.094451 37.879463-14.809096 52.183703-9.745242 13.325126-23.559925 22.947979-41.964203 30.19954 24.034183 4.589596 41.964204 14.30424 54.249021 29.17453 11.749365 14.319539 17.899423 34.253683 17.899423 58.823319 0 36.869752-12.804972 63.994263-37.864164 81.373532zM916.297487 389.809663h-119.742552v314.188425h-59.878926V389.809663h-119.711955v-51.189291h299.333433z m346.59097 314.188425h-58.333761L1021.949981 436.868318h-2.05002v267.12977h-59.94012V338.620372h59.878926L1200.485254 602.262049h1.988825V338.620372h60.368482z\"  ></path></symbol><symbol id=\"icon-popup2\" viewBox=\"0 0 1024 1024\"><path d=\"M989 614.5c-19.3 0-35 15.7-35 35v232.9c0 39.5-32.1 71.6-71.6 71.6H141.6c-6.7 0-13.2-1-19.4-2.7L486 587.5V773c0 19.3 15.7 35 35 35s35-15.7 35-35V501.3c0-0.3 0-0.5-0.1-0.8 0-0.3 0-0.6-0.1-0.9 0-0.3-0.1-0.7-0.1-1 0-0.2-0.1-0.4-0.1-0.7-0.1-0.4-0.1-0.7-0.2-1.1 0-0.2-0.1-0.4-0.1-0.6-0.1-0.4-0.2-0.7-0.2-1.1 0-0.2-0.1-0.4-0.1-0.6-0.1-0.4-0.2-0.7-0.3-1.1-0.1-0.2-0.1-0.4-0.2-0.6-0.1-0.3-0.2-0.6-0.3-1-0.1-0.2-0.1-0.4-0.2-0.7l-0.3-0.9c-0.1-0.3-0.2-0.5-0.3-0.8-0.1-0.3-0.2-0.5-0.3-0.7-0.1-0.3-0.3-0.6-0.4-0.8l-0.3-0.6c-0.2-0.3-0.3-0.6-0.5-0.9-0.1-0.2-0.2-0.4-0.3-0.5-0.2-0.3-0.4-0.6-0.6-1-0.1-0.2-0.2-0.3-0.3-0.5-0.2-0.3-0.4-0.6-0.6-1-0.1-0.2-0.2-0.3-0.3-0.5l-0.6-0.9c-0.1-0.2-0.3-0.3-0.4-0.5-0.2-0.3-0.4-0.5-0.6-0.8-0.2-0.2-0.4-0.4-0.6-0.7-0.2-0.2-0.4-0.4-0.5-0.6-0.4-0.4-0.8-0.8-1.2-1.3-0.4-0.4-0.8-0.8-1.3-1.2-0.2-0.2-0.4-0.4-0.6-0.5-0.2-0.2-0.5-0.4-0.7-0.6-0.3-0.2-0.5-0.4-0.8-0.6-0.2-0.1-0.4-0.3-0.5-0.4l-0.9-0.6c-0.2-0.1-0.3-0.2-0.5-0.3l-0.9-0.6c-0.2-0.1-0.3-0.2-0.5-0.3-0.3-0.2-0.6-0.4-1-0.5-0.2-0.1-0.4-0.2-0.5-0.3-0.3-0.2-0.6-0.3-0.9-0.5l-0.6-0.3c-0.3-0.1-0.6-0.3-0.8-0.4-0.2-0.1-0.5-0.2-0.7-0.3-0.3-0.1-0.5-0.2-0.8-0.3l-0.9-0.3c-0.2-0.1-0.5-0.2-0.7-0.2-0.3-0.1-0.6-0.2-1-0.3-0.2-0.1-0.4-0.1-0.6-0.2-0.3-0.1-0.7-0.2-1.1-0.3-0.2 0-0.4-0.1-0.6-0.1-0.4-0.1-0.7-0.2-1.1-0.2-0.2 0-0.4-0.1-0.6-0.1-0.4-0.1-0.7-0.1-1.1-0.2-0.2 0-0.5-0.1-0.7-0.1-0.3 0-0.7-0.1-1-0.1-0.3 0-0.6 0-0.9-0.1-0.3 0-0.5 0-0.8-0.1H251c-19.3 0-35 15.7-35 35s15.7 35 35 35h185.5L72.7 901.8c-1.7-6.2-2.7-12.7-2.7-19.4V141.6c0-39.5 32.1-71.6 71.6-71.6h232.9c19.3 0 35-15.7 35-35s-15.7-35-35-35H141.6C63.5 0 0 63.5 0 141.6v740.8C0 960.5 63.5 1024 141.6 1024h740.8c78.1 0 141.6-63.5 141.6-141.6V649.5c0-19.3-15.7-35-35-35z\"  ></path><path d=\"M899.7 0H748.3C679.7 0 624 55.7 624 124.3v151.4c0 68.7 55.7 124.3 124.3 124.3h151.4c68.7 0 124.3-55.7 124.3-124.3V124.3C1024 55.7 968.3 0 899.7 0zM954 275.7c0 30-24.4 54.3-54.3 54.3H748.3c-30 0-54.3-24.4-54.3-54.3V124.3c0-30 24.4-54.3 54.3-54.3h151.4c30 0 54.3 24.4 54.3 54.3v151.4z\"  ></path></symbol><symbol id=\"icon-popup\" viewBox=\"0 0 1024 1024\"><path d=\"M819.2 102.4 408.5248 102.4C352.256 102.4 307.2 147.456 307.2 203.776L307.2 614.4c0 56.32 46.08 102.4 102.4 102.4l409.6 0c56.32 0 102.4-46.08 102.4-102.4L921.6 204.8C921.6 148.48 875.52 102.4 819.2 102.4zM819.2 614.4 409.6 614.4 409.6 204.8l409.6 0L819.2 614.4zM204.8 512 102.4 512l0 307.2c0 56.32 46.08 102.4 102.4 102.4l307.2 0 0-102.4L204.8 819.2 204.8 512z\"  ></path></symbol><symbol id=\"icon-depart2\" viewBox=\"0 0 1024 1024\"><path d=\"M411.20278261 292.83431884H612.91594203c12.10991304-1.42469565 21.37043478-11.63501449 21.37043478-24.10110145V73.90608696c0-13.41588406-10.92266666-24.33855073-24.33855072-24.33855073h-195.89565218c-13.41588406 0-24.33855073 10.92266666-24.33855072 24.33855073v194.70840579c0 12.46608696 9.37924638 22.67640579 21.48915942 24.21982609zM438.39072464 98.24463769h147.21855072v146.03130434H438.39072464v-146.03130434zM171.26028986 536.33855073h316.40115941V681.77623188h48.67710146V536.33855073H852.73971014V681.77623188h48.67710145V513.89959421c0-14.4844058-11.75373913-26.23814493-26.23814493-26.23814494H536.33855073V342.10504348h-48.67710146v145.67513043H150.83965217c-15.55292754 0-28.25646377 12.70353623-28.25646376 28.25646378V681.77623188h48.67710145V536.33855073zM609.3542029 731.04695652H414.6457971c-13.41588406 0-24.33855073 10.92266666-24.33855072 24.33855073v194.70840579c0 13.41588406 10.92266666 24.33855073 24.33855072 24.33855073h194.7084058c13.41588406 0 24.33855073-10.92266666 24.33855072-24.33855073V755.38550725c0-13.41588406-10.92266666-24.33855073-24.33855072-24.33855073z m-24.33855073 194.70840579h-146.03130434v-146.03130434h146.03130434v146.03130434zM244.27594203 731.04695652h-194.7084058c-13.41588406 0-24.33855073 10.92266666-24.33855072 24.33855073v194.70840579c0 13.41588406 10.92266666 24.33855073 24.33855072 24.33855073h194.7084058c13.41588406 0 24.33855073-10.92266666 24.33855072-24.33855073V755.38550725c0-13.41588406-10.92266666-24.33855073-24.33855072-24.33855073z m-24.33855072 194.70840579H73.90608696v-146.03130434h146.03130435v146.03130434zM974.43246377 731.04695652h-194.7084058c-13.41588406 0-24.33855073 10.92266666-24.33855072 24.33855073v194.70840579c0 13.41588406 10.92266666 24.33855073 24.33855072 24.33855073h194.7084058c13.41588406 0 24.33855073-10.92266666 24.33855072-24.33855073V755.38550725c0-14.60313044-9.73542029-24.33855073-24.33855072-24.33855073z m-24.33855073 194.70840579H804.06260869v-146.03130434h146.03130435v146.03130434z\"  ></path></symbol><symbol id=\"icon-card\" viewBox=\"0 0 1024 1024\"><path d=\"M96.8 466.9h414.8V98.2H96.8v368.7z m46.1-322.6h322.6v276.5H142.9V144.3z m0 0M557.7 927.8h368.7V651.3H557.7v276.5z m46.1-230.5h276.5v184.3H603.8V697.3z m0 0M557.7 98.2v506.9h368.7V98.2H557.7z m322.6 460.9H603.8V144.3h276.5v414.8z m0 0M96.8 927.8h414.8V513H96.8v414.8z m46.1-368.7h322.6v322.6H142.9V559.1z m0 0\"  ></path></symbol><symbol id=\"icon-tab\" viewBox=\"0 0 1024 1024\"><path d=\"M960 960H64V64h480v224h416v672zM128 896h768V352H480V128H128v768z\"  ></path><path d=\"M608 128h288v96h-288z\"  ></path></symbol><symbol id=\"icon-tab1\" viewBox=\"0 0 1024 1024\"><path d=\"M343.25 315.125V118.25H62v787.5h900V315.125H343.25z m562.5 534.375H118.25V174.5h168.75v196.875h618.75v478.125z\"  ></path><path d=\"M652.625 118.25h-253.125v140.625h253.125V118.25z m-56.25 84.375h-140.625V174.5h140.625v28.125zM708.875 118.25v140.625h253.125V118.25h-253.125z m196.875 84.375h-140.625V174.5h140.625v28.125z\"  ></path></symbol><symbol id=\"icon-tab2\" viewBox=\"0 0 1024 1024\"><path d=\"M615.3846875 68.9234375H408.6153125c-12.9234375 0-22.153125 11.0765625-22.153125 24v46.153125c0 12.9234375 11.0765625 24 22.153125 24h206.769375c12.9234375 0 22.153125-11.0765625 22.153125-24v-46.153125c1.846875-12.9234375-9.2296875-24-22.153125-24z m315.691875 0H724.308125c-12.9234375 0-24 11.0765625-24 24v46.153125c0 12.9234375 11.0765625 24 24 24h206.7684375c12.9234375-1.8459375 24-11.0765625 24-24v-46.153125c0-12.9234375-11.0765625-24-24-24z m0 155.0765625H345.846875c-12.9225 0-24-11.0765625-24-24V92.9234375c0-12.9234375-11.0765625-24-24-24H92.9234375c-12.9234375 0-24 11.0765625-24 24v840c0 11.0765625 11.0765625 22.153125 24 22.153125h838.153125c12.9234375 0 24-11.0765625 24-24V248c0-12.9234375-11.0765625-24-24-24z\"  ></path></symbol><symbol id=\"icon-text\" viewBox=\"0 0 1024 1024\"><path d=\"M962.9656745 932.80074644c-4.52473921-61.83810252-6.03298562-125.18445145-6.03298561-187.02255398 0-31.67317446 0-61.83810252 1.50824638-93.51127698 0-28.65668166 3.01649281-57.31336332-7.54123201-84.46179856-24.13194244-61.83810252-105.57724821-73.90407375-164.39885791-73.90407375-30.16492806 0-60.32985613 4.52473921-90.49478419 12.06597121-21.11544964 6.03298562-42.2308993 13.57421762-60.3298561 22.62369605l19.60720322 48.26388489c4.52473921 9.04947843 6.03298562 19.60720323 7.54123203 28.65668166 39.21440646-18.09895683 78.42881296-28.65668166 117.64321942-28.65668166 61.83810252 0 92.00303057 24.13194244 92.00303057 72.39582735v22.62369604c-9.04947843 0-24.13194244-1.50824641-43.73914568-1.50824639-78.42881296 0-137.25042267 12.06597121-179.48132195 34.68966726-40.72265287 24.13194244-61.83810252 64.85459532-61.83810253 123.67620504 0 43.73914569 13.57421762 78.42881296 40.72265288 102.5607554 27.14843525 24.13194244 61.83810252 36.19791367 102.56075542 36.19791368 36.19791367 0 66.36284173-4.52473921 88.98653777-15.08246403s42.2308993-25.64018885 57.3133633-46.75563849h3.01649283c1.50824641 10.55772482 3.01649281 27.14843525 7.54123202 51.28037771 0 1.50824641 67.87108813 0 75.41232014 0 1.50824641-10.55772482 0-16.59071043 0-24.13194245zM873.97913671 780.46785973c0 10.55772482-1.50824641 21.11544964-6.03298561 31.67317447-3.01649281 7.54123201-6.03298562 15.08246403-12.06597122 22.62369604-18.09895683 25.64018885-49.77213131 39.21440646-79.93705936 45.2473921-19.60720323 3.01649281-37.70616007 1.50824641-57.3133633-1.50824641-15.08246403-3.01649281-30.16492806-10.55772482-37.70616008-24.13194245-13.57421762-21.11544964-10.55772482-54.29687052 4.5247392-73.90407375 9.04947843-12.06597121 22.62369604-19.60720323 36.19791368-24.13194245 37.70616007-12.06597121 81.44530576-12.06597121 119.15146583-12.06597121l33.18142086 1.50824639v34.68966727zM585.90407375 607.01952339L371.73308452 76.11678954c-3.01649281-10.55772482-12.06597121-16.59071043-22.62369604-16.59071043h-67.87108814c-10.55772482 0-21.11544964 7.54123201-24.13194244 16.59071043l-196.0720324 530.90273385c-4.52473921 10.55772482 3.01649281 22.62369604 13.57421763 22.62369604h75.41232016c10.55772482 0 21.11544964-9.04947843 24.13194245-19.60720324l49.77213129-138.75866906h193.05553958l55.80511693 138.75866906c3.01649281 10.55772482 13.57421762 19.60720323 24.13194243 19.60720324h73.90407375c12.06597121 0 21.11544964-12.06597121 15.08246403-22.62369604zM263.13934351 367.20834531l55.80511691-144.79165468 61.83810251 144.79165468h-117.64321942z\"  ></path></symbol><symbol id=\"icon-divider\" viewBox=\"0 0 1024 1024\"><path d=\"M129.70666667 129.70666667h764.58666666a54.61333333 54.61333333 0 0 1 0 109.22666666H129.70666667a54.61333333 54.61333333 0 1 1 0-109.22666666z m0 655.36h764.58666666a54.61333333 54.61333333 0 0 1 0 109.22666666H129.70666667a54.61333333 54.61333333 0 0 1 0-109.22666666z m0-327.68h140.41088a54.61333333 54.61333333 0 1 1 0 109.22666666H129.70666667a54.61333333 54.61333333 0 0 1 0-109.22666666z m312.06058666 0h140.46549334a54.61333333 54.61333333 0 0 1 0 109.22666666H441.76725333a54.61333333 54.61333333 0 0 1 0-109.22666666z m312.1152 0H894.29333333a54.61333333 54.61333333 0 0 1 0 109.22666666h-140.41088a54.61333333 54.61333333 0 0 1 0-109.22666666z\"  ></path></symbol><symbol id=\"icon-markdown\" viewBox=\"0 0 1024 1024\"><path d=\"M92 192C42.24 192 0 232.128 0 282.016v459.968C0 791.904 42.24 832 92 832h840C981.76 832 1024 791.872 1024 741.984V282.016C1024 232.16 981.76 192 932 192z m0 64h840c16.512 0 28 12.256 28 26.016v459.968c0 13.76-11.52 26.016-28 26.016H92C75.488 768 64 755.744 64 741.984V282.016c0-13.76 11.52-25.984 28-25.984zM160 352v320h96v-212.992l96 127.008 96-127.04V672h96V352h-96l-96 128-96-128z m544 0v160h-96l144 160 144-160h-96v-160z\"  ></path></symbol><symbol id=\"icon-tree\" viewBox=\"0 0 1024 1024\"><path d=\"M251.255027 267.144745a89.048248 89.048248 0 1 0 0-178.096497 89.048248 89.048248 0 0 0 0 178.096497z m0 89.048248A178.096497 178.096497 0 1 1 251.255027 0.03657a178.096497 178.096497 0 0 1 0 356.192993z\"  ></path><path d=\"M206.712617 267.144745h89.048249v44.542409a89.048248 89.048248 0 0 0 89.048248 89.048248h267.108175v89.011678h-267.108175a177.255384 177.255384 0 0 1-89.084818-23.807149l0.03657 246.409485a89.048248 89.048248 0 0 0 89.048248 89.048248h267.108175v89.048249h-267.108175a178.096497 178.096497 0 0 1-178.096497-178.096497V267.144745z\"  ></path><path d=\"M785.471376 934.951752a89.048248 89.048248 0 1 0 0-178.096497 89.048248 89.048248 0 0 0 0 178.096497z m0 89.048248a178.096497 178.096497 0 1 1 0-356.192993 178.096497 178.096497 0 0 1 0 356.192993zM785.471376 534.28949a89.048248 89.048248 0 1 0 0-178.096497 89.048248 89.048248 0 0 0 0 178.096497z m0 89.011678a178.096497 178.096497 0 1 1 0-356.156423 178.096497 178.096497 0 0 1 0 356.192993z\"  ></path></symbol><symbol id=\"icon-map\" viewBox=\"0 0 1024 1024\"><path d=\"M649.6 960c-12.8 0-25.6-9.6-28.8-22.4-6.4-16 3.2-35.2 19.2-41.6l256-86.4V428.8l-115.2 38.4c-16 6.4-35.2-3.2-41.6-19.2-6.4-16 3.2-35.2 19.2-41.6l160-51.2c9.6-6.4 19.2-3.2 28.8 3.2 6.4 6.4 12.8 16 12.8 25.6v448c0 12.8-9.6 25.6-22.4 28.8l-278.4 96c-3.2 3.2-6.4 3.2-9.6 3.2z\"  ></path><path d=\"M649.6 960c-3.2 0-6.4 0-9.6-3.2l-278.4-96c-16-6.4-25.6-22.4-19.2-41.6 6.4-16 22.4-25.6 41.6-19.2l278.4 96c16 6.4 25.6 22.4 19.2 41.6-6.4 12.8-19.2 22.4-32 22.4z\"  ></path><path d=\"M96 960c-6.4 0-12.8-3.2-19.2-6.4-9.6-6.4-12.8-16-12.8-25.6V480c0-12.8 9.6-25.6 22.4-28.8l73.6-28.8c16-6.4 35.2 3.2 41.6 19.2s-3.2 35.2-19.2 41.6l-54.4 19.2v380.8l233.6-80c16-6.4 35.2 3.2 41.6 19.2 6.4 16-3.2 35.2-19.2 41.6l-278.4 96H96z\"  ></path><path d=\"M480 416c-54.4 0-96-41.6-96-96s41.6-96 96-96 96 41.6 96 96-41.6 96-96 96z m0-128c-19.2 0-32 12.8-32 32s12.8 32 32 32 32-12.8 32-32-12.8-32-32-32z\"  ></path><path d=\"M480 688l-22.4-25.6C435.2 640 256 435.2 256 320c0-124.8 99.2-224 224-224s224 99.2 224 224c0 115.2-179.2 320-201.6 342.4l-22.4 25.6zM480 160c-89.6 0-160 70.4-160 160 0 60.8 89.6 188.8 160 272 70.4-83.2 160-211.2 160-272 0-89.6-70.4-160-160-160z\"  ></path></symbol><symbol id=\"icon-jm-print\" viewBox=\"0 0 1024 1024\"><path d=\"M362.666667 853.333333l298.666667 0c12.8 0 21.333333-8.533333 21.333333-21.333333 0-12.8-8.533333-21.333333-21.333333-21.333333L362.666667 810.666667c-12.8 0-21.333333 8.533333-21.333333 21.333333C341.333333 844.8 349.866667 853.333333 362.666667 853.333333zM362.666667 768l213.333333 0c12.8 0 21.333333-8.533333 21.333333-21.333333 0-12.8-8.533333-21.333333-21.333333-21.333333L362.666667 725.333333c-12.8 0-21.333333 8.533333-21.333333 21.333333C341.333333 759.466667 349.866667 768 362.666667 768zM853.333333 298.666667l-42.666667 0L810.666667 85.333333c0-23.466667-19.2-42.666667-42.666667-42.666667L256 42.666667c-23.466667 0-42.666667 19.2-42.666667 42.666667l0 213.333333L170.666667 298.666667c-70.4 0-128 57.6-128 128l0 341.333333c0 70.4 57.6 128 128 128l42.666667 0 0 42.666667c0 23.466667 19.2 42.666667 42.666667 42.666667l512 0c23.466667 0 42.666667-19.2 42.666667-42.666667l0-42.666667 42.666667 0c70.4 0 128-57.6 128-128L981.333333 426.666667C981.333333 356.266667 923.733333 298.666667 853.333333 298.666667zM256 85.333333l512 0 0 213.333333L256 298.666667 256 85.333333zM768 896l0 42.666667L256 938.666667l0-42.666667L256 682.666667l512 0L768 896zM938.666667 768c0 46.933333-38.4 85.333333-85.333333 85.333333l-42.666667 0 0-170.666667c0-23.466667-19.2-42.666667-42.666667-42.666667L256 640c-23.466667 0-42.666667 19.2-42.666667 42.666667l0 170.666667L170.666667 853.333333c-46.933333 0-85.333333-38.4-85.333333-85.333333L85.333333 426.666667c0-46.933333 38.4-85.333333 85.333333-85.333333l682.666667 0c46.933333 0 85.333333 38.4 85.333333 85.333333L938.666667 768zM810.666667 426.666667c-23.466667 0-42.666667 19.2-42.666667 42.666667s19.2 42.666667 42.666667 42.666667 42.666667-19.2 42.666667-42.666667S834.133333 426.666667 810.666667 426.666667zM682.666667 426.666667c-23.466667 0-42.666667 19.2-42.666667 42.666667s19.2 42.666667 42.666667 42.666667 42.666667-19.2 42.666667-42.666667S706.133333 426.666667 682.666667 426.666667z\"  ></path></symbol><symbol id=\"icon-phone\" viewBox=\"0 0 1024 1024\"><path d=\"M402.176 208.981333c-28.245333-40.256-50.901333-53.653333-81.258667-47.957333-13.098667 2.453333-21.184 6.869333-36.053333 19.712l-11.328 9.941333-22.037333 18.282667-5.76 5.034667c-3.242667 2.986667-5.589333 5.44-8.597334 8.853333-56 63.402667-71.509333 162.56-38.912 255.786667 23.445333 66.986667 65.28 133.546667 124.928 200.064 63.253333 70.549333 116.416 114.944 177.557334 147.328 48 25.386667 84.757333 36.522667 127.466666 37.824 51.626667 1.6 97.088-10.069333 134.442667-34.261334a141.866667 141.866667 0 0 0 17.109333-13.290666l7.253334-6.613334 14.293333-13.312 4.842667-4.309333 9.557333-8.256c19.285333-17.194667 25.536-27.946667 26.816-44.949333 1.92-25.941333-9.813333-46.144-43.52-74.986667l-22.805333-19.093333-10.602667-9.258667-10.026667-8.597333c-32.576-26.901333-56.704-35.605333-87.68-30.933334-21.248 3.178667-33.493333 10.624-55.189333 33.344l-9.578667 10.197334c-15.786667 16.64-24.789333 22.976-38.101333 25.642666-19.477333 3.904-38.826667-6.165333-70.229333-31.68-40.469333-32.853333-74.048-70.592-102.912-115.456-20.010667-31.296-27.904-55.04-21.824-76.650666 2.474667-8.746667 8.448-14.912 21.056-24.661334l13.12-9.898666 2.112-1.642667 19.904-16.234667c17.6-14.72 24.746667-24.746667 28.501333-40.106666 7.786667-31.594667 0.426667-57.813333-28.373333-102.933334l-13.674667-21.205333-4.864-7.466667-5.632-8.256z\"  ></path></symbol><symbol id=\"icon-mobile-phone\" viewBox=\"0 0 1024 1024\"><path d=\"M746.666667 949.333333H277.333333c-40.533333 0-74.666667-34.133333-74.666666-74.666666V149.333333c0-40.533333 34.133333-74.666667 74.666666-74.666666h469.333334c40.533333 0 74.666667 34.133333 74.666666 74.666666v725.333334c0 40.533333-34.133333 74.666667-74.666666 74.666666z m-469.333334-810.666666c-6.4 0-10.666667 4.266667-10.666666 10.666666v725.333334c0 6.4 4.266667 10.666667 10.666666 10.666666h469.333334c6.4 0 10.666667-4.266667 10.666666-10.666666V149.333333c0-6.4-4.266667-10.666667-10.666666-10.666666H277.333333z\"  ></path><path d=\"M512 768m-42.666667 0a42.666667 42.666667 0 1 0 85.333334 0 42.666667 42.666667 0 1 0-85.333334 0Z\"  ></path><path d=\"M597.333333 245.333333h-170.666666c-17.066667 0-32-14.933333-32-32s14.933333-32 32-32h170.666666c17.066667 0 32 14.933333 32 32s-14.933333 32-32 32z\"  ></path></symbol><symbol id=\"icon-email-filled\" viewBox=\"0 0 1024 1024\"><path d=\"M512.01284373 570.17116374l443.25167787-369.30789546c-2.401856-0.4367008-4.55967361-1.43854507-7.05143893-1.43854507L75.81260588 199.42472214c-2.44038933 0-4.61105067 0.98899947-7.01290669 1.43854507L512.01284373 570.17116374zM987.87582293 239.08746348c0-4.16150507-1.1431296-8.01475093-2.401856-11.803776L671.2674816 489.17594241l314.6817184 314.7459392c0.80918187-3.1725056 1.92662293-6.22941333 1.92662293-9.65880213L987.87582293 239.08746348zM38.56456533 227.24515521c-1.22019413 3.81471361-2.44038933 7.61658239-2.44038933 11.84230827l0 555.16277226c0 3.46792107 1.1945056 6.51198508 1.97799893 9.68449067l314.78447147-314.77162773L38.56456533 227.24515521zM640.62133548 514.65873921l-115.94415787 96.5751776c-3.63489492 3.09544107-8.13034773 4.58536213-12.66433388 4.58536213-4.4954528 0-9.01659413-1.48992214-12.6900224-4.58536213l-115.8414048-96.52380053L66.21802454 831.96066454c3.12112852 0.8220256 6.21656959 1.9651552 9.59458134 1.9651552l872.41332051 0c3.44223253 0 6.5376736-1.13028587 9.72302294-1.9651552L640.62133548 514.65873921z\"  ></path></symbol><symbol id=\"icon-email\" viewBox=\"0 0 1024 1024\"><path d=\"M981.48588027 334.89335562V815.7849815a82.85044939 82.85044939 0 0 1-82.85044939 82.85044938H125.36456912a82.85044939 82.85044939 0 0 1-82.85044939-82.85044938V334.89335562l82.85044939 70.22956468V815.7849815h773.27086176V405.1229203l82.85044939-70.22956468zM898.63543088 125.36456912a83.87227117 83.87227117 0 0 1 29.54999276 5.41289689 82.35334669 82.35334669 0 0 1 34.68672191 25.13130254 83.26470163 83.26470163 0 0 1 12.0961656 20.02219237c3.59018571 8.5059799 5.79953147 17.72999617 6.35186822 27.42349875L981.48588027 208.2150185v27.61681732L565.76994165 590.43175918a82.85044939 82.85044939 0 0 1-103.42497721 3.2864003l-4.11490609-3.31401798L42.51411973 235.83183582v-27.61681732a82.57428165 82.57428165 0 0 1 45.48489672-73.95783361A82.68474848 82.68474848 0 0 1 125.36456912 125.36456912h773.27086176z m-12.4275674 82.85044938h-748.41572696L512 527.3825672 886.20786348 208.2150185z\"  ></path></symbol><symbol id=\"icon-qrcode\" viewBox=\"0 0 1024 1024\"><path d=\"M423.836543 114.819049l0-0.274246L204.08256 114.544803c-45.911656 0-83.09451 36.932144-83.356476 82.59309l-0.023536 0 0 207.579709c0 2.468215 0.500397 4.782933 1.239224 7.000438 6.678096 39.245839 40.831964 69.164243 82.140789 69.164243L423.836543 480.882282l0-0.237407c38.877449-2.432399 70.477144-31.363312 76.798107-68.926836 0.763386-2.217505 1.289366-4.532223 1.289366-7.000438L501.924016 197.137893l-0.025583 0C501.683539 153.253406 467.244168 117.538997 423.836543 114.819049zM458.038506 393.46021c0 24.14798-19.654642 43.705408-43.88551 43.705408L208.445938 437.165618c-24.230867 0-43.858904-19.557428-43.858904-43.705408L164.587034 201.980177c0-24.149003 19.628036-43.717687 43.858904-43.717687l205.708082 0c24.230867 0 43.88551 19.569708 43.88551 43.717687L458.039529 393.46021zM902.246517 195.111746c-0.215918-42.799782-33.818223-77.644381-76.153424-80.304977l0-0.261966L634.384863 114.544803c-44.790112 0-81.040734 36.037774-81.304747 80.56592l-0.023536 0 0 202.511273c0 2.407839 0.476861 4.673439 1.240247 6.831592 6.487761 38.292118 39.830147 67.472717 80.08906 67.472717l191.70823 0 0-0.226151c37.921681-2.385327 68.734454-30.613228 74.961272-67.246567 0.738827-2.158153 1.216711-4.423753 1.216711-6.831592L902.2721 195.111746 902.246517 195.111746zM859.461061 386.638851c0 23.551392-19.152199 42.643216-42.813085 42.643216L638.678656 429.282067c-23.658839 0-42.834574-19.091824-42.834574-42.643216L595.844082 199.832258c0-23.552415 19.175735-42.643216 42.834574-42.643216l177.969321 0c23.660886 0 42.813085 19.091824 42.813085 42.643216L859.461061 386.638851zM415.680792 539.887141l0-0.260943L201.839473 539.626197c-44.670385 0-80.874959 35.94363-81.114412 80.375585l-0.023536 0 0 201.974038c0 2.420119 0.477884 4.687766 1.215688 6.821359 6.464225 38.181601 39.73498 67.316152 79.922261 67.316152L415.680792 896.113331l0-0.236384c37.824467-2.350534 68.567655-30.529317 74.744331-67.079768 0.762363-2.133593 1.24127-4.40124 1.24127-6.821359L491.666394 620.001783l-0.049119 0C491.402381 577.308425 457.919802 542.53648 415.680792 539.887141zM448.975083 811.04077c0 23.493064-19.127639 42.524512-42.691311 42.524512L212.953601 853.565283c0 0-0.022513 0-0.047072 0l-6.822382 0c-23.563672 0-42.690288-19.031449-42.690288-42.524512L163.393859 624.687502c0-23.469528 19.126616-42.525536 42.690288-42.525536l200.200648 0c23.563672 0 42.691311 19.056008 42.691311 42.525536L448.976106 811.04077zM721.154066 753.120616c-14.741749 0-26.66736 11.508102-26.66736 25.699312l0 51.395554c0 14.228049 11.924587 25.721825 26.66736 25.721825 14.736633 0 26.663266-11.492752 26.663266-25.721825l0-51.395554C747.817332 764.628718 735.891721 753.120616 721.154066 753.120616zM834.775846 727.398792c-14.739702 0-26.665313 11.494799-26.665313 25.697265l0 77.118402c0 14.214746 11.924587 25.701358 26.665313 25.701358 14.763239 0 26.688849-11.487635 26.688849-25.701358l0-77.118402C861.464695 738.894613 849.538061 727.398792 834.775846 727.398792zM834.775846 573.172221c-14.739702 0-26.665313 11.506055-26.665313 25.722848l0 51.395554c0 14.189164 11.924587 25.697265 26.665313 25.697265 14.763239 0 26.688849-11.508102 26.688849-25.697265l0-51.395554C861.464695 584.679299 849.538061 573.172221 834.775846 573.172221zM721.154066 573.195757c-14.741749 0-26.66736 11.507078-26.66736 25.709545L694.486706 701.735295c0 14.192234 11.924587 25.686009 26.66736 25.686009 14.736633 0 26.663266-11.492752 26.663266-25.686009L747.817332 598.905302C747.817332 584.702835 735.891721 573.195757 721.154066 573.195757zM606.050538 701.735295c-14.68956 0-26.640754 11.435447-26.640754 25.663496l0 102.81669c0 14.214746 11.951193 25.701358 26.640754 25.701358 14.787798 0 26.712385-11.487635 26.712385-25.701358L632.762923 727.398792C632.763946 713.170742 620.838336 701.735295 606.050538 701.735295zM606.050538 573.172221c-14.68956 0-26.640754 11.506055-26.640754 25.722848l0 25.709545c0 14.201443 11.951193 25.686009 26.640754 25.686009 14.787798 0 26.712385-11.484565 26.712385-25.686009l0-25.709545C632.763946 584.679299 620.838336 573.172221 606.050538 573.172221z\"  ></path></symbol><symbol id=\"icon-save\" viewBox=\"0 0 1024 1024\"><path d=\"M753.38336182 141.58221435H164.75650023v740.8355713h694.48699952v-634.97543336L753.38336182 141.58221435z m-125.18749238 45.60699463v185.39428711H395.75778198v-185.39428711h232.43808747zM349.40921021 836.81079102V579.90065766l21.13494872-21.1812973h282.91168214l21.13494872 21.18129729v256.91013337H349.40921021z m463.48571777 0h-91.95556641V564.97641755L668.0092926 512H355.9907074L303.06063843 564.97641755v271.83437347H211.10507203V187.18920898h138.30413818v232.0672989h325.18157958V187.18920898h57.70397188l80.60016631 81.34174348v568.27983856z m-278.09143066-602.53143311h47.7853775v92.69714355H534.80349732v-92.69714355z\"  ></path></symbol><symbol id=\"icon-link\" viewBox=\"0 0 1024 1024\"><path d=\"M928 896 416 896C380.656 896 352 867.344 352 832L352 448C352 412.656 380.656 384 416 384L512 384C529.68 384 544 398.336 544 416 544 433.68 529.68 448 512 448L416 448 416 832 928 832 928 448 768 448C750.32 448 736 433.68 736 416 736 398.336 750.32 384 768 384L928 384C963.344 384 992 412.656 992 448L992 832C992 867.344 963.344 896 928 896ZM608 640 512 640C494.336 640 480 625.68 480 608 480 590.32 494.336 576 512 576L608 576 608 192 96 192 96 576 256 576C273.68 576 288 590.32 288 608 288 625.68 273.68 640 256 640L96 640C60.656 640 32 611.344 32 576L32 192C32 156.656 60.656 128 96 128L608 128C643.344 128 672 156.656 672 192L672 576C672 611.344 643.344 640 608 640Z\"  ></path></symbol><symbol id=\"icon-field\" viewBox=\"0 0 1024 1024\"><path d=\"M905.53963457 264.16739029H724.64948675c-27.47873238 0-49.71026963-22.23153725-49.71026963-49.71026963s22.23153725-49.71026963 49.71026963-49.71026963h180.89014782c27.47873238 0 49.71026963 22.23153725 49.71026962 49.71026963s-22.23153725 49.71026963-49.71026962 49.71026963zM905.53963457 474.0551954H724.64948675c-27.47873238 0-49.71026963-22.23153725-49.71026963-49.71026963s22.23153725-49.71026963 49.71026963-49.71026962h180.89014782c27.47873238 0 49.71026963 22.23153725 49.71026962 49.71026962s-22.23153725 49.71026963-49.71026962 49.71026963zM905.53963457 682.56215968H724.64948675c-27.47873238 0-49.71026963-22.23153725-49.71026963-49.71026963s22.23153725-49.71026963 49.71026963-49.71026963h180.89014782c27.47873238 0 49.71026963 22.23153725 49.71026962 49.71026963s-22.23153725 49.71026963-49.71026962 49.71026963zM905.53963457 892.44996478H121.22204708c-27.47873238 0-49.71026963-22.23153725-49.71026963-49.71026963s22.23153725-49.71026963 49.71026963-49.71026964h784.31758749c27.47873238 0 49.71026963 22.23153725 49.71026962 49.71026964s-22.23153725 49.71026963-49.71026962 49.71026963zM432.04931635 210.45268228v388.29243944c-4.41869063 46.39625165 19.88410785 67.52311625 73.04647953 63.10442561h19.88410785v33.14017975H219.67599776v-33.14017975H249.64024362c44.18690634 2.20934532 66.41844358-18.7794352 66.41844358-63.10442561V210.45268228h-102.8726413c-55.371717-11.04672658-85.19787878 22.09345317-89.61656943 99.55862334h-36.45419772l16.57008988-159.34903097h26.5121438c4.41869063 6.62803595 9.94205392 11.04672658 16.57008988 13.25607188 4.41869063 4.41869063 12.15139925 5.5233633 23.19812583 3.31401798h404.86252931c15.46541722 2.20934532 28.72148912-3.31401797 39.7682157-16.57008986h29.82616178l13.2560719 159.34903097h-33.14017975c-6.62803595-77.46517017-37.69695447-110.60534992-92.93058738-99.55862334h-99.55862335z\"  ></path></symbol><symbol id=\"icon-field-1\" viewBox=\"0 0 1024 1024\"><path d=\"M373.64622187 123.6385184H87.22962987a24.27259307 24.27259307 0 0 0-24.27259307 24.27259307v285.20296213a24.27259307 24.27259307 0 0 0 24.27259307 24.27259307h285.2029632a24.27259307 24.27259307 0 0 0 24.272592-24.27259307V147.91111147a24.27259307 24.27259307 0 0 0-23.0589632-24.27259307z m-24.272592 285.2029632h-236.65777814V172.7905184h236.65777814zM859.70488853 185.53362987H468.91614827a24.27259307 24.27259307 0 1 0 0 48.54518506h390.78874026a24.27259307 24.27259307 0 0 0 0-48.54518506zM468.91614827 365.75762987h245.76a24.27259307 24.27259307 0 1 0 0-48.54518507H468.91614827a24.27259307 24.27259307 0 0 0 0 48.54518507zM373.64622187 566.61333333H87.22962987a24.27259307 24.27259307 0 0 0-24.27259307 24.27259307V876.08888853a24.27259307 24.27259307 0 0 0 24.27259307 24.27259307h285.2029632a24.27259307 24.27259307 0 0 0 24.272592-24.27259307v-285.20296213a24.27259307 24.27259307 0 0 0-23.0589632-24.27259307z m-24.272592 284.59614827h-236.65777814V615.1585184h236.65777814zM859.70488853 628.5084448H468.91614827a24.27259307 24.27259307 0 0 0 0 48.54518507h390.78874026a24.27259307 24.27259307 0 0 0 0-48.54518507zM714.67614827 760.18725973H468.91614827a24.27259307 24.27259307 0 0 0 0 48.54518507h245.76a24.27259307 24.27259307 0 0 0 0-48.54518507z\"  ></path></symbol><symbol id=\"icon-fullscreen\" viewBox=\"0 0 1024 1024\"><path d=\"M290 236.4l43.9-43.9c4.7-4.7 1.9-12.8-4.7-13.6L169 160c-5.1-0.6-9.5 3.7-8.9 8.9L179 329.1c0.8 6.6 8.9 9.4 13.6 4.7l43.7-43.7L370 423.7c3.1 3.1 8.2 3.1 11.3 0l42.4-42.3c3.1-3.1 3.1-8.2 0-11.3L290 236.4zM642.7 423.7c3.1 3.1 8.2 3.1 11.3 0l133.7-133.6 43.7 43.7c4.7 4.7 12.8 1.9 13.6-4.7L863.9 169c0.6-5.1-3.7-9.5-8.9-8.9L694.8 179c-6.6 0.8-9.4 8.9-4.7 13.6l43.9 43.9L600.3 370c-3.1 3.1-3.1 8.2 0 11.3l42.4 42.4zM845 694.9c-0.8-6.6-8.9-9.4-13.6-4.7l-43.7 43.7L654 600.3c-3.1-3.1-8.2-3.1-11.3 0l-42.4 42.3c-3.1 3.1-3.1 8.2 0 11.3L734 787.6l-43.9 43.9c-4.7 4.7-1.9 12.8 4.7 13.6L855 864c5.1 0.6 9.5-3.7 8.9-8.9L845 694.9zM381.3 600.3c-3.1-3.1-8.2-3.1-11.3 0L236.3 733.9l-43.7-43.7c-4.7-4.7-12.8-1.9-13.6 4.7L160.1 855c-0.6 5.1 3.7 9.5 8.9 8.9L329.2 845c6.6-0.8 9.4-8.9 4.7-13.6L290 787.6 423.7 654c3.1-3.1 3.1-8.2 0-11.3l-42.4-42.4z\"  ></path></symbol><symbol id=\"icon-fullscreen-exit\" viewBox=\"0 0 1024 1024\"><path d=\"M391 240.9c-0.8-6.6-8.9-9.4-13.6-4.7l-43.7 43.7L200 146.3c-3.1-3.1-8.2-3.1-11.3 0l-42.4 42.3c-3.1 3.1-3.1 8.2 0 11.3L280 333.6l-43.9 43.9c-4.7 4.7-1.9 12.8 4.7 13.6L401 410c5.1 0.6 9.5-3.7 8.9-8.9L391 240.9zM401.1 614.1L240.8 633c-6.6 0.8-9.4 8.9-4.7 13.6l43.9 43.9L146.3 824c-3.1 3.1-3.1 8.2 0 11.3l42.4 42.3c3.1 3.1 8.2 3.1 11.3 0L333.7 744l43.7 43.7c4.7 4.7 12.8 1.9 13.6-4.7l18.9-160.1c0.6-5.1-3.7-9.4-8.8-8.8zM622.9 409.9L783.2 391c6.6-0.8 9.4-8.9 4.7-13.6L744 333.6 877.7 200c3.1-3.1 3.1-8.2 0-11.3l-42.4-42.3c-3.1-3.1-8.2-3.1-11.3 0L690.3 279.9l-43.7-43.7c-4.7-4.7-12.8-1.9-13.6 4.7L614.1 401c-0.6 5.2 3.7 9.5 8.8 8.9zM744 690.4l43.9-43.9c4.7-4.7 1.9-12.8-4.7-13.6L623 614c-5.1-0.6-9.5 3.7-8.9 8.9L633 783.1c0.8 6.6 8.9 9.4 13.6 4.7l43.7-43.7L824 877.7c3.1 3.1 8.2 3.1 11.3 0l42.4-42.3c3.1-3.1 3.1-8.2 0-11.3L744 690.4z\"  ></path></symbol><symbol id=\"icon-money\" viewBox=\"0 0 1048 1024\"><path d=\"M524.2752 0C241.516134 0 12.288102 229.228032 12.288102 511.976038c0 117.534003 39.610982 225.814016 106.203955 312.231014l38.47895-40.06103C100.53417 708.109005 67.143168 613.944013 67.143168 511.976038c0-252.460954 204.668006-457.120973 457.132032-457.120973 252.45399 0 457.120973 204.660019 457.120973 457.120973 0 252.468019-204.668006 457.12896-457.120973 457.12896-91.12105 0-176.011981-26.66496-247.303987-72.611021l-34.630042 42.907955c80.855962 53.441024 177.760973 84.558029 281.934029 84.558029 282.755994 0 511.984026-229.224038 511.984026-511.984026C1036.258202 229.228032 807.03017 0 524.2752 0zM304.851149 566.841958 304.851149 621.697024 505.983181 621.697024 505.983181 767.966003 505.983181 767.97399 505.983181 767.97399 505.983181 804.54697 560.838144 804.54697 560.838144 767.97399 560.83712 767.97399 560.838144 767.966003 560.838144 621.697024 761.973146 621.697024 761.973146 566.841958 560.838144 566.841958 560.838144 457.136026 761.973146 457.136026 761.973146 402.270003 600.358195 402.270003 718.125158 284.499968 678.615142 244.985958 533.40713 390.177997 388.213146 244.985958 348.695142 284.499968 466.462106 402.270003 304.851149 402.270003 304.851149 457.136026 505.983181 457.136026 505.983181 566.841958Z\"  ></path></symbol><symbol id=\"icon-integer\" viewBox=\"0 0 1024 1024\"><path d=\"M514.077312 702.673667c40.199561 0 70.936609-16.709567 92.211145-50.126654 1.876744-2.951215 3.570315-6.145977 5.279237-9.317203 19.652596 39.590694 52.199872 59.443857 97.718579 59.443857 40.196491 0 70.932516-16.709567 92.207052-50.126654 21.272489-33.419134 31.909757-80.859609 31.909757-142.327566 0-124.82596-39.174208-187.237405-117.515461-187.237405-41.081651 0-72.479755 16.748453-94.189196 50.242288-2.00568 3.100618-3.826142 6.459109-5.646604 9.812483-19.24225-40.009226-51.016931-60.055794-95.372138-60.055794-41.080627 0-72.475662 16.748453-94.186126 50.242288-21.714558 33.503045-32.573883 82.008782-32.573883 145.528468C393.919674 641.367393 433.973926 702.673667 514.077312 702.673667zM712.807469 381.76075c32.127721 0 48.196699 43.767829 48.196699 131.304512 0 87.220481-16.506952 130.828674-49.517787 130.828674-33.600259 0-50.39783-42.343387-50.39783-127.037325C661.089573 426.790316 678.329213 381.76075 712.807469 381.76075zM517.598508 381.76075c32.131815 0 48.196699 43.767829 48.196699 131.304512 0 87.220481-16.504906 130.828674-49.51574 130.828674-33.600259 0-50.395784-42.343387-50.395784-127.037325C465.884706 426.790316 483.124346 381.76075 517.598508 381.76075z\"  ></path><path d=\"M285.863656 416.20933l0 285.908682 64.385403 0 0-381.212258-56.681954 0.181125c-29.344329 24.019043-64.11525 42.345434-104.314811 54.984289l0 65.651232c12.763698-1.575892 26.77583-5.64558 42.035372-12.20395C246.544139 422.962128 277.05913 424.424432 285.863656 416.20933z\"  ></path><path d=\"M897.529587 66.766636 124.898615 66.766636c-35.558867 0-64.385403 28.827559-64.385403 64.385403l0 760.717641c0 35.558867 28.827559 64.387449 64.385403 64.387449l772.630972 0c35.558867 0 64.385403-28.828582 64.385403-64.387449L961.91499 131.153062C961.916013 95.594195 933.088454 66.766636 897.529587 66.766636zM897.529587 892.719025 124.898615 892.719025 124.898615 130.299625l772.630972 0L897.529587 892.719025z\"  ></path></symbol><symbol id=\"icon-tiaoma\" viewBox=\"0 0 1024 1024\"><path d=\"M392.687614 869.933065l29.827329 0L422.514943 154.067958 392.687614 154.067958 392.687614 869.933065zM452.342272 869.933065l29.830399 0L482.172671 154.067958l-29.830399 0L452.342272 869.933065zM243.547899 869.933065l89.485057 0L333.032956 154.067958l-89.485057 0L243.547899 869.933065zM64.583924 869.933065l119.309316 0L183.89324 154.067958l-119.309316-0.002047L64.583924 869.933065zM512 869.933065l89.481987 0L601.481987 154.067958l-89.481987 0L512 869.933065zM840.102666 154.067958l0 715.865107L959.415053 869.933065 959.415053 154.067958 840.102666 154.067958zM750.621702 869.933065l59.654658 0L810.276361 154.067958l-59.654658 0L750.621702 869.933065zM631.309316 869.933065l59.654658 0L690.963974 154.067958l-59.654658 0L631.309316 869.933065z\"  ></path></symbol><symbol id=\"icon-zuhe\" viewBox=\"0 0 1042 1024\"><path d=\"M1036.74608 135.558l-5.363-2.926a35.596 35.596 0 0 0-7.315-7.314L814.39208 4.876a36.084 36.084 0 0 0-34.133 0L570.58308 125.318l-5.852 5.852-8.29 4.876a10.728 10.728 0 0 0-5.363 9.264v20.48l-10.24-5.851a36.084 36.084 0 0 0-36.084 0l-10.24 5.851v-19.504a10.728 10.728 0 0 0-6.827-10.728l-8.29-4.876s-3.413-4.389-5.85-5.852L263.87008 4.876a36.084 36.084 0 0 0-36.084 0L18.11008 125.318a35.109 35.109 0 0 0-7.802 7.802l-5.364 2.926a10.728 10.728 0 0 0-4.876 10.24v263.802a10.728 10.728 0 0 0 5.364 9.264l5.364 2.926a34.621 34.621 0 0 0 7.802 7.802l209.676 120.442a36.084 36.084 0 0 0 36.084 0l11.703-6.827v10.24a36.571 36.571 0 0 0 16.579 31.208l5.364 2.926-19.018 10.727a10.728 10.728 0 0 0-5.363 9.265v265.265a10.24 10.24 0 0 0 4.876 8.777 35.596 35.596 0 0 0 14.14 16.579l209.677 120.442a36.084 36.084 0 0 0 36.084 0l209.676-120.442a35.596 35.596 0 0 0 14.14-16.58 10.24 10.24 0 0 0 4.877-8.776V608.06a10.728 10.728 0 0 0-5.364-9.265L743.20008 588.07l5.365-2.926a36.571 36.571 0 0 0 18.041-31.208v-10.24l11.703 6.827a36.084 36.084 0 0 0 36.084 0l209.676-120.442a36.084 36.084 0 0 0 7.315-7.314l5.363-2.926a10.728 10.728 0 0 0 5.364-9.265v-264.29a10.728 10.728 0 0 0-5.364-10.727zM526.21008 466.164a10.728 10.728 0 0 0-10.24 0l-163.84 92.16-23.893-14.141v-31.208l146.286-83.383 5.851-5.851 7.314-4.389a10.728 10.728 0 0 0 5.364-9.264V226.743l28.282-16.092 28.282 16.092v183.345a10.728 10.728 0 0 0 5.364 9.264l8.29 4.389a35.109 35.109 0 0 0 5.85 5.851l146.286 83.383v30.72l-23.893 14.141z\"  ></path></symbol><symbol id=\"icon-col-2\" viewBox=\"0 0 1024 1024\"><path d=\"M921.6 0H102.4C45.8 0 0 45.8 0 102.4v819.3C0 978.2 45.8 1024 102.4 1024h819.3c56.5 0 102.4-45.8 102.4-102.4V102.4C1024 45.8 978.2 0 921.6 0zM435.2 819.2h-256c-14.1 0-25.6-11.5-25.6-25.6 0-14.1 11.5-25.6 25.6-25.6h256c14.1 0 25.6 11.5 25.6 25.6 0 14.1-11.5 25.6-25.6 25.6z m25.6-190.1c0 20.1-16.4 36.5-36.5 36.5H190.1c-20.1 0-36.5-16.4-36.5-36.5V241.3c0-20.1 16.4-36.5 36.5-36.5h234.2c20.1 0 36.5 16.4 36.5 36.5v387.8z m384 190.1h-256c-14.1 0-25.6-11.5-25.6-25.6 0-14.1 11.5-25.6 25.6-25.6h256c14.1 0 25.6 11.5 25.6 25.6 0 14.1-11.5 25.6-25.6 25.6z m25.6-190.1c0 20.1-16.4 36.5-36.5 36.5H599.7c-20.1 0-36.5-16.4-36.5-36.5V241.3c0-20.1 16.4-36.5 36.5-36.5h234.2c20.1 0 36.5 16.4 36.5 36.5v387.8z\"  ></path></symbol><symbol id=\"icon-col-3\" viewBox=\"0 0 1024 1024\"><path d=\"M921.6 0H102.4C45.8 0 0 45.8 0 102.4v819.3C0 978.2 45.8 1024 102.4 1024h819.3c56.5 0 102.4-45.8 102.4-102.4V102.4C1024 45.8 978.2 0 921.6 0zM307.2 819.2H204.8c-14.1 0-25.6-11.5-25.6-25.6 0-14.1 11.5-25.6 25.6-25.6h102.4c14.1 0 25.6 11.5 25.6 25.6 0 14.1-11.5 25.6-25.6 25.6z m25.6-190.1c0 20.1-16.4 36.5-36.5 36.5h-80.6c-20.1 0-36.5-16.4-36.5-36.5V241.3c0-20.1 16.4-36.5 36.5-36.5h80.6c20.1 0 36.5 16.4 36.5 36.5v387.8z m230.4 190.1H460.8c-14.1 0-25.6-11.5-25.6-25.6 0-14.1 11.5-25.6 25.6-25.6h102.4c14.1 0 25.6 11.5 25.6 25.6 0 14.1-11.5 25.6-25.6 25.6z m25.6-190.1c0 20.1-16.4 36.5-36.5 36.5h-80.6c-20.1 0-36.5-16.4-36.5-36.5V241.3c0-20.1 16.4-36.5 36.5-36.5h80.6c20.1 0 36.5 16.4 36.5 36.5v387.8z m230.4 190.1H716.8c-14.1 0-25.6-11.5-25.6-25.6 0-14.1 11.5-25.6 25.6-25.6h102.4c14.1 0 25.6 11.5 25.6 25.6 0 14.1-11.5 25.6-25.6 25.6z m25.6-190.1c0 20.1-16.4 36.5-36.5 36.5h-80.6c-20.1 0-36.5-16.4-36.5-36.5V241.3c0-20.1 16.4-36.5 36.5-36.5h80.6c20.1 0 36.5 16.4 36.5 36.5v387.8z\"  ></path></symbol><symbol id=\"icon-col-4\" viewBox=\"0 0 1024 1024\"><path d=\"M921.6 0H102.4C45.8 0 0 45.8 0 102.4v819.3C0 978.2 45.8 1024 102.4 1024h819.3c56.5 0 102.4-45.8 102.4-102.4V102.4C1024 45.8 978.2 0 921.6 0zM113.3 241.3c0-20.1 16.4-36.5 36.5-36.5h80.6c20.1 0 36.5 16.4 36.5 36.5v387.8c0 20.1-16.4 36.5-36.5 36.5h-80.6c-20.1 0-36.5-16.4-36.5-36.5V241.3z m128 577.9H138.9c-14.1 0-25.6-11.5-25.6-25.6s11.5-25.6 25.6-25.6h102.4c14.1 0 25.6 11.5 25.6 25.6 0 14.1-11.5 25.6-25.6 25.6z m214.6 0H353.5c-14.1 0-25.6-11.5-25.6-25.6s11.5-25.6 25.6-25.6h102.4c14.1 0 25.6 11.5 25.6 25.6s-11.5 25.6-25.6 25.6z m25.6-190.1c0 20.1-16.4 36.5-36.5 36.5h-80.6c-20.1 0-36.5-16.4-36.5-36.5V241.3c0-20.1 16.4-36.5 36.5-36.5H445c20.1 0 36.5 16.4 36.5 36.5v387.8z m189.1 190.1H568.2c-14.1 0-25.6-11.5-25.6-25.6s11.5-25.6 25.6-25.6h102.4c14.1 0 25.6 11.5 25.6 25.6s-11.5 25.6-25.6 25.6z m25.6-190.1c0 20.1-16.4 36.5-36.5 36.5h-80.6c-20.1 0-36.5-16.4-36.5-36.5V241.3c0-20.1 16.4-36.5 36.5-36.5h80.6c20.1 0 36.5 16.4 36.5 36.5v387.8z m189 190.1H782.8c-14.1 0-25.6-11.5-25.6-25.6s11.5-25.6 25.6-25.6h102.4c14.1 0 25.6 11.5 25.6 25.6s-11.5 25.6-25.6 25.6z m25.6-190.1c0 20.1-16.4 36.5-36.5 36.5h-80.6c-20.1 0-36.5-16.4-36.5-36.5V241.3c0-20.1 16.4-36.5 36.5-36.5h80.6c20.1 0 36.5 16.4 36.5 36.5v387.8z\"  ></path></symbol><symbol id=\"icon-col-1\" viewBox=\"0 0 1024 1024\"><path d=\"M921.6 0H102.4C45.8 0 0 45.8 0 102.4v819.3C0 978.2 45.8 1024 102.4 1024h819.3c56.5 0 102.4-45.8 102.4-102.4V102.4C1024 45.8 978.2 0 921.6 0z m-76.8 819.2H179.2c-14.1 0-25.6-11.5-25.6-25.6s11.5-25.6 25.6-25.6h665.6c14.1 0 25.6 11.5 25.6 25.6 0 14.1-11.5 25.6-25.6 25.6z m25.6-190.1c0 20.1-16.4 36.5-36.5 36.5H190.1c-20.1 0-36.5-16.4-36.5-36.5V241.3c0-20.1 16.4-36.5 36.5-36.5h643.8c20.1 0 36.5 16.4 36.5 36.5v387.8z\"  ></path></symbol><symbol id=\"icon-zuzhijuese\" viewBox=\"0 0 1024 1024\"><path d=\"M853.333333 256h-341.333333l-85.333333-85.333333H170.666667a85.333333 85.333333 0 0 0-85.333334 85.333333v512a85.333333 85.333333 0 0 0 85.333334 85.333333h682.666666a85.333333 85.333333 0 0 0 85.333334-85.333333V341.333333a85.333333 85.333333 0 0 0-85.333334-85.333333z m-341.333333 85.333333a106.666667 106.666667 0 1 1-106.666667 106.666667A106.24 106.24 0 0 1 512 341.333333z m192 426.666667h-384v-42.666667a128 128 0 0 1 128-128h128a128 128 0 0 1 128 128v42.666667z\"  ></path></symbol><symbol id=\"icon-hashtag\" viewBox=\"0 0 1024 1024\"><path d=\"M870.4 448a64 64 0 0 0 0-128h-114.56l26.88-148.48a64 64 0 0 0-126.08-23.04l-32 171.52h-156.8l26.88-148.48a64 64 0 0 0-126.08-23.04l-32 171.52H198.4a64 64 0 1 0 0 128h116.16l-23.36 128H153.6a64 64 0 0 0 0 128h114.56l-26.88 148.48a64 64 0 1 0 126.08 23.04l32-171.52h157.76l-26.88 148.48a64 64 0 1 0 126.08 23.04l32-171.52h137.28a64 64 0 1 0 0-128h-116.16l23.36-128z m-291.2 128h-157.76l23.36-128h157.76z\"  ></path></symbol><symbol id=\"icon-formula\" viewBox=\"0 0 1024 1024\"><path d=\"M471.2 358.3h-130l19-90.4a133.5 133.5 0 0 1 130.3-106.2h52.7a32.9 32.9 0 1 0 0-65.7h-52.7c-93.8 0-175.6 66.7-194.6 158.6l-21.8 103.7H128.8a32.9 32.9 0 0 0 0 65.7h131.6l-97.3 464.5a32.7 32.7 0 0 0 25.5 38.8 30.5 30.5 0 0 0 6.7 0.7 32.9 32.9 0 0 0 32.1-26.2L327.5 424h143.7a32.9 32.9 0 1 0 0-65.7zM758.4 712l160-160a32.8 32.8 0 1 0-46.5-46.4L712 665.5 552 505.6a32.8 32.8 0 1 0-46.4 46.4l160 160-160 159.9a32.8 32.8 0 1 0 46.4 46.5l160-160 159.9 160a32.9 32.9 0 0 0 46.5-46.5z\"  ></path></symbol><symbol id=\"icon-t\" viewBox=\"0 0 1024 1024\"><path d=\"M851.968 167.936l0 109.568-281.6 0 0 587.776-116.736 0 0-587.776-281.6 0 0-109.568 679.936 0z\"  ></path></symbol><symbol id=\"icon-t-filled\" viewBox=\"0 0 1024 1024\"><path d=\"M832 64 192 64C121.344 64 64 121.344 64 192l0 640c0 70.656 57.344 128 128 128l640 0c70.656 0 128-57.344 128-128L960 192C960 121.344 902.656 64 832 64zM768 320 576 320l0 448c0 35.392-28.608 64-64 64s-64-28.608-64-64L448 320 256 320C220.608 320 192 291.392 192 256s28.608-64 64-64l512 0c35.392 0 64 28.608 64 64S803.392 320 768 320z\"  ></path></symbol><symbol id=\"icon-select\" viewBox=\"0 0 1024 1024\"><path d=\"M912.14545437 992L111.85454563 992A79.85454563 79.85454563 0 0 1 32 912.14545437L32 111.85454563A79.85454563 79.85454563 0 0 1 111.85454563 32l800.29090875 0A79.85454563 79.85454563 0 0 1 992 111.85454563l0 800.29090875A79.85454563 79.85454563 0 0 1 912.14545437 992zM111.85454563 111.85454563l-1e-8 800.29090875 800.29090875 0L912.14545437 111.85454563z\"  ></path><path d=\"M224 520.72727281l205.52727281 205.52727282 370.47272719-370.47272719-58.03636406-58.03636406-312.43636313 311.99999999-147.49090875-147.49090874L224 520.72727281z\"  ></path></symbol><symbol id=\"icon-number\" viewBox=\"0 0 1224 1024\"><path d=\"M0 901.567122h1224.462246v122.432878H0zM122.165946 745.589771h145.12211V10.310343h-101.137624a113.030935 113.030935 0 0 1-5.279325 23.490029C142.393471 95.076129 101.063477 124.690768 14.859223 124.690768h-13.198312v109.279055h120.490205zM400.991403 563.808979a402.222256 402.222256 0 0 0-35.175725 181.780792h397.550943v-130.722604H538.194526c7.044043-27.568159 17.587863-45.971647 49.248981-82.719307 7.044043-8.17109 14.073256-16.31252 21.117299-23.490028 139.842786-146.041543 161.835029-194.030012 156.555704-303.309067C757.197523 54.205852 682.441692-17.272645 517.967001 6.217384a147.450352 147.450352 0 0 0-62.447293 22.466789c-61.572349 39.832208-85.31448 88.843916-87.983801 188.928641 0 10.217569 0 20.420309 0.874944 30.637879h137.203124c-0.874944-9.194329-0.874944-17.365419-0.874945-25.536509 2.639662-78.596688 24.631905-108.255815 58.932687-110.287465 33.425837-1.02324 56.352342 26.544919 57.167968 92.922046 0.874944 71.478497-19.278433 116.426905-118.740317 218.54328-55.373591 57.197627-80.005496 91.943295-101.107965 139.916934zM819.644816 529.078141a246.452519 246.452519 0 0 0 0.874944 43.910338c13.198312 127.652884 69.491336 181.780792 197.900528 181.780792 120.490205 0 179.437721-53.104668 198.716153-171.563223 21.117299-130.722604-20.227525-209.348951-80.910099-228.760849a39.209366 39.209366 0 0 0-14.9482-3.06972c30.786174-8.17109 55.41808-31.661119 73.005942-75.630775 8.793931-21.443549 13.198312-49.026538 13.198311-87.820676-1.764718-136.847214-84.439536-212.418671-242.759958-180.757552-72.116168 14.295699-124.894586 75.630775-136.328179 162.368893-2.639662 16.31252-2.639662 32.62504-1.749888 49.026537h134.563461a150.490413 150.490413 0 0 1-0.889774-19.411899c2.639662-55.151147 16.712918-78.596688 42.219768-85.789026 38.705161-10.20274 60.682575 14.295699 63.322237 84.765787 3.514607 76.594697-25.50685 110.287465-87.954142 109.264225-5.279325-1.02324-11.433594-1.02324-16.712919-2.04648v106.209335h13.198312c84.439536 0 101.152454 17.365419 101.152454 115.403665 0 83.742546-12.323367 110.287465-43.094712 117.435315-43.094712 11.240809-66.851673-15.318939-73.005942-91.943295a104.933993 104.933993 0 0 1 0-23.490029z\"  ></path></symbol><symbol id=\"icon-shangchuan\" viewBox=\"0 0 1024 1024\"><path d=\"M646.791 799v-31.447c0-8.837 7.164-16 16-16H735c88.127 0 159.569-71.46 159.569-159.61 0-88.15-71.442-159.61-159.569-159.61-11.454 0-26.738 2.548-45.854 7.645a7.931 7.931 0 0 1-9.616-10.01c7.907-25.529 11.861-45.89 11.861-61.083 0-99.1-80.316-179.438-179.391-179.438-99.075 0-179.391 80.337-179.391 179.438 0 15.193 3.954 35.554 11.861 61.083a7.929 7.929 0 0 1-9.616 10.01c-19.116-5.097-34.4-7.646-45.854-7.646-88.127 0-159.569 71.46-159.569 159.61 0 88.15 71.442 159.61 159.569 159.61h73.2c8.837 0 16 7.164 16 16V799c0 8.837-7.163 16-16 16H289c-123.16 0-223-99.866-223-223.058 0-116.51 89.304-212.156 203.18-222.188-0.002-0.29-0.002-0.58-0.002-0.87C269.178 234.745 377.893 126 512 126s242.822 108.743 242.822 242.885l-0.001 0.869C868.696 379.786 958 475.432 958 591.942 958 715.134 858.16 815 735 815h-72.209c-8.836 0-16-7.163-16-16z m-168.66-301.848l-79.364 69.93c-13.636 11.031-33.643 8.931-44.685-4.691-11.043-13.622-8.94-33.607 4.696-44.638l126.696-108.219c11-11.252 28.92-12.857 41.826-3.141L664.347 516.97c14.014 10.55 16.814 30.449 6.253 44.447-10.56 14-30.48 16.796-44.494 6.247l-84.431-70.973v286.57c0 17.529-14.225 31.738-31.772 31.738-17.547 0-31.772-14.21-31.772-31.738v-286.11z\"  ></path></symbol><symbol id=\"icon-drag\" viewBox=\"0 0 1024 1024\"><path d=\"M909.3 506.3L781.7 405.6c-4.7-3.7-11.7-0.4-11.7 5.7V476H548V254h64.8c6 0 9.4-7 5.7-11.7L517.7 114.7c-2.9-3.7-8.5-3.7-11.3 0L405.6 242.3c-3.7 4.7-0.4 11.7 5.7 11.7H476v222H254v-64.8c0-6-7-9.4-11.7-5.7L114.7 506.3c-3.7 2.9-3.7 8.5 0 11.3l127.5 100.8c4.7 3.7 11.7 0.4 11.7-5.7V548h222v222h-64.8c-6 0-9.4 7-5.7 11.7l100.8 127.5c2.9 3.7 8.5 3.7 11.3 0l100.8-127.5c3.7-4.7 0.4-11.7-5.7-11.7H548V548h222v64.8c0 6 7 9.4 11.7 5.7l127.5-100.8c3.7-2.9 3.7-8.5 0.1-11.4z\"  ></path></symbol><symbol id=\"icon-grid\" viewBox=\"0 0 1024 1024\"><path d=\"M128 469.333333 469.333333 469.333333 469.333333 128 128 128M128 896 469.333333 896 469.333333 554.666667 128 554.666667M554.666667 896 896 896 896 554.666667 554.666667 554.666667M554.666667 128 554.666667 469.333333 896 469.333333 896 128\"  ></path></symbol><symbol id=\"icon-trash\" viewBox=\"0 0 1024 1024\"><path d=\"M394.95161173 414.51738453l0 351.0632448q0 8.5327872-5.4853632 14.0181504t-14.0181504 5.4853632l-39.0070272 0q-8.5327872 0-14.0181504-5.4853632t-5.4853632-14.0181504l0-351.0632448q0-8.5327872 5.4853632-14.0181504t14.0181504-5.4853632l39.0070272 0q8.5327872 0 14.0181504 5.4853632t5.4853632 14.0181504z m156.0281088 0l0 351.0632448q0 8.5327872-5.4853632 14.0181504t-14.0181504 5.4853632l-39.0070272 0q-8.5327872 0-14.0181504-5.4853632t-5.4853632-14.0181504l0-351.0632448q0-8.5327872 5.4853632-14.0181504t14.0181504-5.4853632l39.0070272 0q8.5327872 0 14.0181504 5.4853632t5.4853632 14.0181504z m156.0281088 0l0 351.0632448q0 8.5327872-5.4853632 14.0181504t-14.0181504 5.4853632l-39.0070272 0q-8.5327872 0-14.0181504-5.4853632t-5.4853632-14.0181504l0-351.0632448q0-8.5327872 5.4853632-14.0181504t14.0181504-5.4853632l39.0070272 0q8.5327872 0 14.0181504 5.4853632t5.4853632 14.0181504z m78.0140544 441.2669952l0-577.7915904-546.0983808 0 0 577.7915904q0 13.4086656 4.2663936 24.6841344t8.8375296 16.4560896 6.3995904 5.1806208l507.0913536 0q1.8284544 0 6.3995904-5.1806208t8.8375296-16.4560896 4.2663936-24.6841344z m-409.5737856-655.8056448l273.0491904 0-29.2552704-71.3097216q-4.2663936-5.4853632-10.3612416-6.7043328l-193.2066816 0q-6.094848 1.2189696-10.3612416 6.7043328z m565.6018944 19.5035136l0 39.0070272q0 8.5327872-5.4853632 14.0181504t-14.0181504 5.4853632l-58.5105408 0 0 577.7915904q0 50.5872384-28.6457856 87.4610688t-68.8717824 36.8738304l-507.0913536 0q-40.2259968 0-68.8717824-35.6548608t-28.6457856-86.2420992l0-580.2295296-58.5105408 0q-8.5327872 0-14.0181504-5.4853632t-5.4853632-14.0181504l0-39.0070272q0-8.5327872 5.4853632-14.0181504t14.0181504-5.4853632l188.3308032 0 42.663936-101.7839616q9.142272-22.5509376 32.9121792-38.3975424t48.1492992-15.8466048l195.035136 0q24.379392 0 48.1492992 15.8466048t32.9121792 38.3975424l42.663936 101.7839616 188.3308032 0q8.5327872 0 14.0181504 5.4853632t5.4853632 14.0181504z\"  ></path></symbol><symbol id=\"icon-ic\" viewBox=\"0 0 1536 1024\"><path d=\"M1187.84 460.8h-327.68c-22.528 0-40.96-18.432-40.96-40.96V92.16c0-22.528 18.432-40.96 40.96-40.96h327.68c22.528 0 40.96 18.432 40.96 40.96v327.68c0 22.528-18.432 40.96-40.96 40.96z\"  ></path><path d=\"M1126.4 512v358.4c0 28.16-23.04 51.2-51.2 51.2H409.6c-28.16 0-51.2-23.04-51.2-51.2V307.2c0-28.16 23.04-51.2 51.2-51.2h358.4V153.6H389.12c-45.056 0-81.92 36.864-81.92 81.92v655.36c0 45.056 36.864 81.92 81.92 81.92h706.56c45.056 0 81.92-36.864 81.92-81.92v-378.88h-51.2z\"  ></path></symbol><symbol id=\"icon-date\" viewBox=\"0 0 1024 1024\"><path d=\"M205 552h120c13.3 0 24-10.7 24-24s-10.7-24-24-24H205c-13.3 0-24 10.7-24 24s10.7 24 24 24zM453 552h120c13.3 0 24-10.7 24-24s-10.7-24-24-24H453c-13.3 0-24 10.7-24 24s10.7 24 24 24zM701 552h120c13.3 0 24-10.7 24-24s-10.7-24-24-24H701c-13.3 0-24 10.7-24 24s10.7 24 24 24zM205 687h120c13.3 0 24-10.7 24-24s-10.7-24-24-24H205c-13.3 0-24 10.7-24 24s10.7 24 24 24zM453 687h120c13.3 0 24-10.7 24-24s-10.7-24-24-24H453c-13.3 0-24 10.7-24 24s10.7 24 24 24zM701 687h120c13.3 0 24-10.7 24-24s-10.7-24-24-24H701c-13.3 0-24 10.7-24 24s10.7 24 24 24zM205 823h120c13.3 0 24-10.7 24-24s-10.7-24-24-24H205c-13.3 0-24 10.7-24 24s10.7 24 24 24zM453 823h120c13.3 0 24-10.7 24-24s-10.7-24-24-24H453c-13.3 0-24 10.7-24 24s10.7 24 24 24zM701 823h120c13.3 0 24-10.7 24-24s-10.7-24-24-24H701c-13.3 0-24 10.7-24 24s10.7 24 24 24z\"  ></path><path d=\"M870 116H745V64c0-13.3-10.7-24-24-24s-24 10.7-24 24v52H327V64c0-13.3-10.7-24-24-24s-24 10.7-24 24v52H154c-51.9 0-94 42.1-94 94v692c0 51.9 42.1 94 94 94h716c51.9 0 94-42.1 94-94V210c0-51.9-42.1-94-94-94z m46 786c0 25.4-20.6 46-46 46H154c-25.4 0-46-20.6-46-46V387h808v515z m0-563H108V210c0-25.4 20.6-46 46-46h125v68c0 13.3 10.7 24 24 24s24-10.7 24-24v-68h370v68c0 13.3 10.7 24 24 24s24-10.7 24-24v-68h125c25.4 0 46 20.6 46 46v129z\"  ></path></symbol><symbol id=\"icon-fuwenbenkuang\" viewBox=\"0 0 1024 1024\"><path d=\"M218.316 307.727h87.886v205.06h-29.297v29.295h117.179v-29.294H364.79V307.727h87.882v29.293h29.294v-87.882H189.022v87.882h29.294v-29.293z m322.242 58.59h292.945v58.588H540.558v-58.588z m0 117.177h292.945v58.588H540.558v-58.588z m-351.536 117.18h644.481v58.588h-644.48v-58.587z m0 117.176h644.481v58.588h-644.48V717.85z m351.536-468.713h292.945v58.589H540.558v-58.589z m420.923 713.13H61.045V63.309h900.436v898.958z m-864.62-35.816h828.804V99.125H96.861V926.45z\"  ></path></symbol><symbol id=\"icon-bars\" viewBox=\"0 0 1024 1024\"><path d=\"M170.666667 490.666667l682.666666 0 0 42.666666-682.666666 0 0-42.666666Z\"  ></path><path d=\"M170.666667 704l682.666666 0 0 42.666667-682.666666 0 0-42.666667Z\"  ></path><path d=\"M170.666667 277.333333l682.666666 0 0 42.666667-682.666666 0 0-42.666667Z\"  ></path></symbol><symbol id=\"icon-slider\" viewBox=\"0 0 1024 1024\"><path d=\"M901.12 122.88h-757.76c-20.48 0-34.133333 13.653333-34.133333 34.133333v6.826667c0 20.48 13.653333 34.133333 34.133333 34.133333h757.76c6.826667 0 13.653333 0 20.48-6.826666s6.826667-13.653333 6.826667-20.48v-6.826667c0-27.306667-13.653333-40.96-27.306667-40.96z\"  ></path><path d=\"M764.586667 88.746667h-68.266667c-20.48 0-34.133333 13.653333-34.133333 34.133333v68.266667c0 20.48 13.653333 34.133333 34.133333 34.133333h68.266667c20.48 0 34.133333-13.653333 34.133333-34.133333v-68.266667c0-20.48-13.653333-34.133333-34.133333-34.133333zM901.12 430.08h-757.76c-20.48 0-34.133333 13.653333-34.133333 34.133333v6.826667c0 20.48 13.653333 34.133333 34.133333 34.133333h757.76c20.48 0 34.133333-13.653333 34.133333-34.133333v-6.826667c-6.826667-20.48-20.48-34.133333-34.133333-34.133333z\"  ></path><path d=\"M552.96 395.946667h-68.266667c-20.48 0-34.133333 13.653333-34.133333 34.133333v68.266667c0 20.48 13.653333 34.133333 34.133333 34.133333h68.266667c20.48 0 34.133333-13.653333 34.133333-34.133333v-68.266667c0-20.48-13.653333-34.133333-34.133333-34.133333zM901.12 737.28h-757.76c-6.826667 0-13.653333 0-20.48 6.826667-6.826667 6.826667-6.826667 13.653333-6.826667 20.48v6.826666c0 20.48 13.653333 34.133333 34.133334 34.133334h757.76c20.48 0 34.133333-13.653333 34.133333-34.133334v-6.826666c-13.653333-13.653333-27.306667-27.306667-40.96-27.306667z\"  ></path><path d=\"M354.986667 703.146667h-68.266667c-20.48 0-34.133333 13.653333-34.133333 34.133333v68.266667c0 20.48 13.653333 34.133333 34.133333 34.133333h68.266667c20.48 0 34.133333-13.653333 34.133333-34.133333v-68.266667c0-20.48-13.653333-34.133333-34.133333-34.133333z\"  ></path></symbol><symbol id=\"icon-color\" viewBox=\"0 0 1024 1024\"><path d=\"M297.78046416 323.45884442c0-38.83614815 31.06891852-69.90506667 66.02145186-69.90506666s66.02145185 31.06891852 66.02145186 69.90506666S402.63806416 389.48029628 363.80191602 389.48029628s-66.02145185-31.06891852-66.02145186-66.02145186zM165.73756046 459.38536294C165.73756046 420.54921479 196.80647899 389.48029628 231.75901232 389.48029628s66.02145185 31.06891852 66.02145184 69.90506666-31.06891852 66.02145185-66.02145184 66.02145185-66.02145185-31.06891852-66.02145186-66.02145185zM476.42674566 276.85546665c0-38.83614815 31.06891852-69.90506667 66.02145184-69.90506667 34.95253333 0 66.02145185 31.06891852 66.02145185 69.90506665s-31.06891852 66.02145185-66.02145185 66.02145186c-34.95253333 0-66.02145185-31.06891852-66.02145184-66.02145184zM476.42674566 661.33333331c0-50.48699259 38.83614815-89.32314075 89.32314073-89.32314076s89.32314075 38.83614815 89.32314074 89.32314076-38.83614815 89.32314075-89.32314074 89.32314075-89.32314075-38.83614815-89.32314073-89.32314075z\"  ></path><path d=\"M519.14650861 164.23063701C297.78046416 164.23063701 119.13418269 315.69161479 119.13418269 505.98874073s178.64628148 337.87448889 400.01232592 337.87448888c62.13783703 0 108.74121482-7.76722963 147.57736297-23.30168888 27.1853037-11.65084445 50.48699259-27.1853037 62.13783703-46.60337779 27.1853037-42.71976297 7.76722963-104.8576-11.65084445-143.69374815-42.71976297-89.32314075-3.88361482-128.15928889 15.53445927-139.81013333 11.65084445-7.76722963 23.30168889-11.65084445 34.95253333-11.65084445 19.41807408 0 50.48699259 7.76722963 81.55591112 54.37060741 15.53445925 27.1853037 34.95253333 34.95253333 42.71976295 34.95253334 15.53445925 0 27.1853037-27.1853037 27.18530371-69.90506667 0-182.5298963-178.64628148-333.99087408-400.01232593-333.99087408z m0 722.35235556c-116.50844445 0-229.13327408-38.83614815-310.68918518-112.62482963-42.71976297-34.95253333-73.78868148-77.6722963-97.09037037-124.27567408-23.30168889-42.71976297-34.95253333-93.20675555-34.95253333-147.57736296S88.06526416 401.13114073 111.36695306 350.64414813c23.30168889-46.60337778 54.37060741-85.43952592 97.09037037-124.27567407C290.01323454 156.46340739 402.63806416 117.62725923 519.14650861 117.62725923s229.13327408 38.83614815 310.68918519 112.62482963c42.71976297 34.95253333 73.78868148 77.6722963 97.09037036 124.27567408 23.30168889 46.60337778 34.95253333 97.09037037 34.95253334 151.46097777 0 85.43952592-34.95253333 112.62482963-69.90506667 112.62482963-27.1853037 0-58.25422222-19.41807408-81.5559111-54.3706074-15.53445925-23.30168889-31.06891852-34.95253333-42.71976297-34.95253333-3.88361482 0-7.76722963 0-11.65084444 3.88361481-23.30168889 15.53445925-11.65084445 58.25422222 0 77.67229629 34.95253333 73.78868148 38.83614815 139.81013333 7.76722962 190.29712592-34.95253333 58.25422222-116.50844445 85.43952592-244.66773333 85.43952592z\"  ></path></symbol><symbol id=\"icon-radio-active\" viewBox=\"0 0 1024 1024\"><path d=\"M512 4.533c-279.803 0-507.467 227.665-507.467 507.467 0 279.839 227.629 507.467 507.467 507.467 279.839 0 507.467-227.629 507.467-507.467 0-279.803-227.629-507.467-507.467-507.467zM512 946.65c-239.68 0-434.65-195.006-434.65-434.65 0-239.68 194.97-434.65 434.65-434.65 239.644 0 434.65 194.97 434.65 434.65 0 239.644-195.006 434.65-434.65 434.65zM512 329.955c-100.38 0-182.045 81.665-182.045 182.045s81.665 182.045 182.045 182.045 182.045-81.665 182.045-182.045-81.665-182.045-182.045-182.045z\"  ></path></symbol><symbol id=\"icon-input\" viewBox=\"0 0 1669 1024\"><path d=\"M1398.66921433 732.06637047c0 70.6134846-45.10390102 127.64034389-100.83679598 127.64034389L366.82504671 859.70671436C311.18457777 859.70671436 265.98825072 802.67985575 265.98825072 732.06637047L265.98825072 292.02605556C265.98825072 221.41257027 311.18457777 164.38571167 366.82504671 164.38571167l931.09979834 0c55.73289429 0 100.836796 57.0268586 100.83679599 127.54791786L1398.76164038 732.06637047zM1362.43821147 286.48049352c0-51.01916714-41.40686012-92.42602727-92.42602726-92.42602726L394.83013288 194.05446626c-51.01916714 0-92.42602727 41.40686012-92.42602726 92.42602726l0 451.13143898c0 51.11159317 41.40686012 92.42602727 92.42602726 92.42602727l875.18205134 0c51.01916714 0 92.42602727-41.3144341 92.42602725-92.42602727L1362.43821147 286.48049352z\"  ></path><path d=\"M447.23569039 723.84045447c0 16.0821286-12.93964383 28.9293464-28.92934643 28.92934639l0 0c-15.89727654 0-28.9293464-12.8472178-28.92934639-28.9293464l0-392.81061538c0-15.89727654 12.93964383-28.9293464 28.92934639-28.92934639l0 0c15.89727654 0 28.9293464 12.93964383 28.92934643 28.92934639L447.23569039 723.84045447z\"  ></path><path d=\"M556.94538452 690.75193637m-34.65976047 0a0.25460031 0.25460031 0 1 0 69.31952028 0 0.25460031 0.25460031 0 1 0-69.31952028 0Z\"  ></path><path d=\"M691.33282806 690.75193637m-34.65976048 0a0.25460031 0.25460031 0 1 0 69.31952028 0 0.25460031 0.25460031 0 1 0-69.31952028 0Z\"  ></path><path d=\"M821.2838225 690.75193637m-34.65976049 0a0.25460031 0.25460031 0 1 0 69.3195203 0 0.25460031 0.25460031 0 1 0-69.3195203 0Z\"  ></path></symbol><symbol id=\"icon-switch\" viewBox=\"0 0 1024 1024\"><path d=\"M729.008 806.496 295.008 806.496C140.912 806.496 16 681.584 16 527.504l0-31.008c0-154.08 124.912-278.992 279.008-278.992l434 0c154.08 0 279.008 124.912 279.008 278.992l0 31.008C1008 681.584 883.088 806.496 729.008 806.496zM946.96 496.768c0-119.696-97.04-216.736-216.736-216.736L294.384 280.032c-119.696 0-216.736 97.04-216.736 216.736l0 31.008c0 119.696 97.04 216.736 216.736 216.736L730.24 744.512c119.696 0 216.736-97.04 216.736-216.736L946.976 496.768zM702.32 672.576c-90.72 0-164.272-73.536-164.272-164.256 0-90.72 73.552-164.272 164.272-164.272 90.72 0 164.272 73.536 164.272 164.272C866.592 599.04 793.04 672.576 702.32 672.576z\"  ></path></symbol><symbol id=\"icon-checkbox\" viewBox=\"0 0 1024 1024\"><path d=\"M797.8 248.4c-11.4-11.6-30.2-11.6-41.6-0.2L409.2 592.4l-146.8-148c-11.4-11.6-30.2-11.6-41.6-0.2l-55.8 55.4c-11.6 11.4-11.6 30.2-0.2 41.6l222.8 224.6c11.4 11.6 30.2 11.6 41.6 0.2l423.6-420.2c11.6-11.4 11.6-30.2 0.2-41.6l-55.2-55.8z\"  ></path><path d=\"M857 59h-696c-55.2 0-100 44.8-100 100v696c0 55.2 44.8 100 100 100h696c55.2 0 100-44.8 100-100v-696c0-55.2-44.8-100-100-100z m53.8 777.8c0 39.8-32.2 72-72 72H179.2c-39.8 0-72-32.2-72-72V177.2c0-39.8 32.2-72 72-72h659.6c39.8 0 72 32.2 72 72v659.6z\"  ></path></symbol><symbol id=\"icon-tooltip\" viewBox=\"0 0 1024 1024\"><path d=\"M511.999488 64.900126c-247.025093 0-447.290209 200.147436-447.290209 447.085548 0 246.909459 200.264093 447.115224 447.290209 447.115224s447.290209-200.205764 447.290209-447.115224C959.288674 265.046538 759.024581 64.900126 511.999488 64.900126L511.999488 64.900126zM511.999488 895.276267c-211.386408 0-383.348921-172.020842-383.348921-383.291616 0-211.299427 171.962513-383.203612 383.348921-383.203612 211.444736 0 383.408273 171.904185 383.408273 383.203612C895.407762 723.255425 723.444225 895.276267 511.999488 895.276267L511.999488 895.276267zM511.999488 256.486582c-88.048335 0-159.734004 71.685669-159.734004 159.647023l0 32.028461 63.881936 0 0-32.028461c0-52.759621 42.976814-95.764064 95.852068-95.764064 52.876278 0 95.852068 43.004443 95.852068 95.764064 0 35.987632-20.73116 56.019875-54.506405 85.835947-32.66905 28.767184-73.257467 64.521502-73.257467 126.716007l0 42.97579 63.881936 0 0-42.97579c0-31.679513 19.624966-50.547233 51.595099-78.848813 33.95023-29.815049 76.168774-67.083861 76.168774-133.703141C671.733493 328.172251 600.106152 256.486582 511.999488 256.486582L511.999488 256.486582zM480.087685 703.57213l63.881936 0 0 63.940265L480.087685 767.512395 480.087685 703.57213 480.087685 703.57213zM480.087685 703.57213\"  ></path></symbol><symbol id=\"icon-tupian\" viewBox=\"0 0 1170 1024\"><path d=\"M1060.432916 0H109.768851A109.768851 109.768851 0 0 0 0 109.768851v804.462298a109.768851 109.768851 0 0 0 109.768851 109.768851h950.664065a109.768851 109.768851 0 0 0 109.768851-109.768851V109.768851A109.768851 109.768851 0 0 0 1060.432916 0zM109.768851 73.218409h950.781591a36.550442 36.550442 0 0 1 36.550442 36.550442v430.731092c-58.762768-48.302996-161.127511-113.529668-283.706646-113.529669-113.059566 0-224.473775 87.556525-332.127166 172.292437-82.267876 64.874096-167.943992 131.981178-227.76449 131.981177-84.030759 0-155.956387-61.818432-180.284173-85.323539V109.768851a36.667967 36.667967 0 0 1 36.550442-36.550442z m950.781591 877.680707H109.768851a36.550442 36.550442 0 0 1-36.550442-36.550442V740.645931c43.837025 31.026742 107.300815 63.698841 180.284173 63.698841 85.206014 0 176.288305-71.690577 273.011822-147.612074s199.793412-156.66154 286.99736-156.66154c157.131642 0 282.061288 138.327557 283.119018 139.737863v274.422128a36.550442 36.550442 0 0 1-36.550442 36.550442z\"  ></path><path d=\"M303.450935 501.716516a147.259497 147.259497 0 1 0-147.259497-147.612074 147.259497 147.259497 0 0 0 147.259497 147.612074z m0-220.948009a73.335935 73.335935 0 1 1-72.748307 73.335935 73.335935 73.335935 0 0 1 73.21841-73.335935z\"  ></path></symbol><symbol id=\"icon-rate\" viewBox=\"0 0 1024 1024\"><path d=\"M512.161682 66.028832c-7.767917 0-23.348778 6.231935-43.649126 46.343491-48.821939 87.162152-125.945457 229.404784-125.945457 229.404784s-140.995221 27.38572-231.952816 44.577265c-44.614104 7.344269-59.193147 47.083341-36.548404 75.05644 63.996546 77.008908 177.216167 204.165959 177.216167 204.165959s-18.48091 139.628084-28.888957 234.942917c-3.384074 36.602639 15.915481 57.597813 42.837644 57.597813 8.772804 0 18.367323-2.248204 28.256554-6.9022 76.339666-37.858236 192.462406-95.745644 218.751143-108.816335 25.840528 13.211906 140.817166 72.034617 216.300324 110.004393 9.775644 4.686742 19.295462 6.934946 27.958772 6.934946 26.621311 0 45.695738-20.957311 42.314735-57.634652-10.261715-95.458095-28.554336-235.31233-28.554336-235.31233s111.922069-127.270639 175.171602-204.391087c22.381753-28.043706 7.990998-67.821665-36.106336-75.197656-89.908706-17.238616-229.310639-44.650943-229.310639-44.650943S603.786473 199.717647 555.523259 112.451118c-17.066701-32.216749-30.122041-42.547025-38.377052-45.388746C516.367471 66.659189 514.695389 66.028832 512.161682 66.028832L512.161682 66.028832 512.161682 66.028832zM512.161682 66.028832\"  ></path></symbol><symbol id=\"icon-time\" viewBox=\"0 0 1024 1024\"><path d=\"M512 64C264.96 64 64 264.96 64 512s200.96 448 448 448 448-200.96 448-448S759.04 64 512 64z m0 831.712c-211.584 0-383.712-172.16-383.712-383.712 0-211.584 172.128-383.712 383.712-383.712 211.552 0 383.712 172.128 383.712 383.712 0 211.552-172.16 383.712-383.712 383.712z\"  ></path><path d=\"M671.968 512H512V288.064c0-17.76-14.24-32.128-32-32.128s-32 14.4-32 32.128V544c0 17.76 14.272 32 32 32h191.968c17.76 0 32.128-14.24 32.128-32s-14.368-32-32.128-32z\"  ></path></symbol><symbol id=\"icon-clone\" viewBox=\"0 0 1024 1024\"><path d=\"M897.71428583 881.64285753l2e-8-546.42857168q0-6.52901748-4.77120499-11.30022335t-11.30022333-4.77120497l-546.42857168 0q-6.52901748 0-11.30022335 4.77120497t-4.77120497 11.30022335l0 546.42857168q0 6.52901748 4.77120497 11.30022333t11.30022335 4.77120499l546.42857168 0q6.52901748 0 11.30022333-4.77120499t4.77120499-11.30022333z m64.28571417-546.42857168l0 546.42857168q0 33.14732167-23.60491084 56.75223251t-56.75223252 23.60491085l-546.42857167 0q-33.14732167 0-56.75223252-23.60491085t-23.60491084-56.75223251l0-546.42857168q0-33.14732167 23.60491084-56.75223252t56.75223252-23.60491084l546.42857167 0q33.14732167 0 56.75223252 23.60491084t23.60491084 56.75223252z m-192.85714247-192.85714249l0 80.35714249-64.28571417 0 0-80.35714249q0-6.52901748-4.77120498-11.30022334t-11.30022335-4.77120498l-546.42857167 0q-6.52901748 0-11.30022334 4.77120498t-4.77120498 11.30022334l0 546.42857168q0 6.52901748 4.77120498 11.30022334t11.30022334 4.77120498l80.35714247 0 0 64.28571417-80.35714247 0q-33.14732167 0-56.75223252-23.60491085t-23.60491084-56.75223251l0-546.42857168q0-33.14732167 23.60491084-56.75223252t56.75223252-23.60491084l546.42857167 0q33.14732167 0 56.75223252 23.60491084t23.60491084 56.75223252z\"  ></path></symbol><symbol id=\"icon-jilianxuanze\" viewBox=\"0 0 1024 1024\"><path d=\"M128 512V224c0-16 12.8-32 32-32h384c19.2 0 32 12.8 32 32v288c0 16-12.8 32-32 32h-32v64h64c35.2 0 64-28.8 64-64V192c0-35.2-28.8-64-64-64H128c-35.2 0-64 28.8-64 64v352c0 35.2 28.8 64 64 64h192v-64H160c-16 0-32-12.8-32-32z\"  ></path><path d=\"M896 416H704v64h160c19.2 0 32 12.8 32 32v288c0 16-12.8 32-32 32H480c-19.2 0-32-12.8-32-32V512c0-16 12.8-32 32-32h32v-64h-64c-35.2 0-64 28.8-64 64v352c0 35.2 28.8 64 64 64h448c35.2 0 64-28.8 64-64V480c0-35.2-28.8-64-64-64z\"  ></path></symbol><symbol id=\"icon-textarea\" viewBox=\"0 0 1024 1024\"><path d=\"M64.60757333 814.92195555h885.46417778V209.07804445h-885.46417778v605.8439111zM18.00419555 162.47466667h978.67093334v699.05066666H18.00419555V162.47466667z m885.46417778 466.03377778l-139.81013333 139.81013333h139.81013333V628.50844445z m-752.64455111-291.27111112v233.01688889c0 13.98101333 9.32067555 23.30168889 23.30168889 23.30168889s23.30168889-9.32067555 23.30168889-23.30168889V337.23733333c0-13.98101333-9.32067555-23.30168889-23.30168889-23.30168888s-23.30168889 9.32067555-23.30168889 23.30168888z\"  ></path></symbol><symbol id=\"icon-clear\" viewBox=\"0 0 1024 1024\"><path d=\"M883.2 403.2l-147.2-44.8 57.6-224c0-6.4 0-19.2-6.4-25.6-6.4-6.4-12.8-12.8-19.2-12.8L627.2 57.6c-6.4 0-19.2 0-25.6 0C595.2 70.4 588.8 76.8 588.8 83.2L524.8 300.8 358.4 256c-6.4 0-19.2 0-25.6 0S320 275.2 320 281.6l-89.6 320C211.2 684.8 128 768 128 768c-6.4 6.4-12.8 19.2-6.4 32 0 12.8 12.8 19.2 25.6 25.6l524.8 140.8c0 0 6.4 0 6.4 0 6.4 0 19.2-6.4 25.6-12.8 6.4-6.4 83.2-89.6 115.2-179.2 32-83.2 89.6-326.4 89.6-332.8C908.8 422.4 896 409.6 883.2 403.2zM755.2 748.8c-25.6 57.6-70.4 115.2-89.6 147.2l-70.4-19.2c32-38.4 70.4-96 89.6-160 6.4-19.2-6.4-32-25.6-38.4-19.2-6.4-32 6.4-38.4 25.6-19.2 70.4-76.8 134.4-96 153.6l-57.6-12.8c32-38.4 70.4-96 83.2-153.6 6.4-19.2-6.4-32-25.6-38.4-19.2-6.4-32 6.4-38.4 25.6-19.2 64-70.4 128-89.6 153.6l-64-19.2c32-38.4 70.4-96 89.6-153.6 6.4-19.2-6.4-32-25.6-38.4C384 608 364.8 620.8 364.8 633.6c-19.2 64-70.4 128-96 153.6l-57.6-19.2c32-38.4 70.4-96 83.2-153.6l76.8-294.4 166.4 44.8c6.4 0 19.2 0 25.6 0C569.6 364.8 576 358.4 582.4 352L640 128l83.2 19.2-57.6 224c-6.4 19.2 6.4 32 19.2 38.4L832 454.4C819.2 524.8 780.8 691.2 755.2 748.8z\"  ></path><path d=\"M364.8 473.6C364.8 492.8 371.2 505.6 390.4 512l339.2 96c0 0 6.4 0 6.4 0 12.8 0 25.6-6.4 32-25.6 6.4-19.2-6.4-32-19.2-38.4L409.6 448C390.4 448 371.2 454.4 364.8 473.6z\"  ></path></symbol><symbol id=\"icon-table\" viewBox=\"0 0 1024 1024\"><path d=\"M928.229 784.149c0 44.024-36.02 80.044-80.044 80.044L175.815 864.193c-44.024 0-80.044-36.02-80.044-80.044L95.771 239.851c0-44.024 36.02-80.044 80.044-80.044l672.369 0c44.024 0 80.044 36.02 80.044 80.044L928.228 784.149zM351.912 303.886c0-9.005-7.004-16.009-16.009-16.009L175.815 287.877c-9.005 0-16.009 7.004-16.009 16.009l0 96.053c0 9.005 7.004 16.009 16.009 16.009l160.088 0c9.005 0 16.009-7.004 16.009-16.009L351.912 303.886zM351.912 495.991c0-9.005-7.004-16.009-16.009-16.009L175.815 479.982c-9.005 0-16.009 7.004-16.009 16.009l0 96.053c0 9.005 7.004 16.009 16.009 16.009l160.088 0c9.005 0 16.009-7.004 16.009-16.009L351.912 495.991zM351.912 688.097c0-9.005-7.004-16.009-16.009-16.009L175.815 672.088c-9.005 0-16.009 7.004-16.009 16.009l0 96.053c0 9.005 7.004 16.009 16.009 16.009l160.088 0c9.005 0 16.009-7.004 16.009-16.009L351.912 688.097zM608.053 303.886c0-9.005-7.004-16.009-16.009-16.009L431.956 287.877c-9.005 0-16.009 7.004-16.009 16.009l0 96.053c0 9.005 7.004 16.009 16.009 16.009l160.088 0c9.005 0 16.009-7.004 16.009-16.009L608.053 303.886zM608.053 495.991c0-9.005-7.004-16.009-16.009-16.009L431.956 479.982c-9.005 0-16.009 7.004-16.009 16.009l0 96.053c0 9.005 7.004 16.009 16.009 16.009l160.088 0c9.005 0 16.009-7.004 16.009-16.009L608.053 495.991zM608.053 688.097c0-9.005-7.004-16.009-16.009-16.009L431.956 672.088c-9.005 0-16.009 7.004-16.009 16.009l0 96.053c0 9.005 7.004 16.009 16.009 16.009l160.088 0c9.005 0 16.009-7.004 16.009-16.009L608.053 688.097zM864.193 303.886c0-9.005-7.004-16.009-16.009-16.009L688.097 287.877c-9.005 0-16.009 7.004-16.009 16.009l0 96.053c0 9.005 7.004 16.009 16.009 16.009l160.088 0c9.005 0 16.009-7.004 16.009-16.009L864.194 303.886zM864.193 495.991c0-9.005-7.004-16.009-16.009-16.009L688.097 479.982c-9.005 0-16.009 7.004-16.009 16.009l0 96.053c0 9.005 7.004 16.009 16.009 16.009l160.088 0c9.005 0 16.009-7.004 16.009-16.009L864.194 495.991zM864.193 688.097c0-9.005-7.004-16.009-16.009-16.009L688.097 672.088c-9.005 0-16.009 7.004-16.009 16.009l0 96.053c0 9.005 7.004 16.009 16.009 16.009l160.088 0c9.005 0 16.009-7.004 16.009-16.009L864.194 688.097z\"  ></path></symbol><symbol id=\"icon-depart\" viewBox=\"0 0 1024 1024\"><path d=\"M916.23451733 477.51649173L547.318336 477.51649173 547.318336 255.34498133 696.308 255.34498133 696.308 34.66668053 331.7635616 34.66668053 331.7635616 255.34498133 478.22732907 255.34498133 478.22732907 477.51649173 108.1573568 477.51649173 108.1573568 534.23985493 108.1573568 551.07119467 108.1573568 771.74949653 34.4369952 771.74949653 34.4369952 989.33331947 254.03822507 989.33331947 254.03822507 771.74949653 181.86461973 771.74949653 181.86461973 551.07119467 478.22732907 551.07119467 478.22732907 771.74949653 402.9722176 771.74949653 402.9722176 989.33331947 622.57344747 989.33331947 622.57344747 771.74949653 547.318336 771.74949653 547.318336 551.07119467 842.90712107 551.07119467 842.90712107 771.74949653 769.98797333 771.74949653 769.98797333 989.33331947 989.5619136 989.33331947 989.5619136 771.74949653 916.23451733 771.74949653Z\"  ></path></symbol></svg>',function(l){var c=(c=document.getElementsByTagName(\"script\"))[c.length-1],h=c.getAttribute(\"data-injectcss\"),c=c.getAttribute(\"data-disable-injectsvg\");if(!c){var a,t,o,z,i,v=function(c,h){h.parentNode.insertBefore(c,h)};if(h&&!l.__iconfont__svg__cssinject__){l.__iconfont__svg__cssinject__=!0;try{document.write(\"<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>\")}catch(c){console&&console.log(c)}}a=function(){var c,h=document.createElement(\"div\");h.innerHTML=l._iconfont_svg_string_3814468,(h=h.getElementsByTagName(\"svg\")[0])&&(h.setAttribute(\"aria-hidden\",\"true\"),h.style.position=\"absolute\",h.style.width=0,h.style.height=0,h.style.overflow=\"hidden\",h=h,(c=document.body).firstChild?v(h,c.firstChild):c.appendChild(h))},document.addEventListener?~[\"complete\",\"loaded\",\"interactive\"].indexOf(document.readyState)?setTimeout(a,0):(t=function(){document.removeEventListener(\"DOMContentLoaded\",t,!1),a()},document.addEventListener(\"DOMContentLoaded\",t,!1)):document.attachEvent&&(o=a,z=l.document,i=!1,m(),z.onreadystatechange=function(){\"complete\"==z.readyState&&(z.onreadystatechange=null,s())})}function s(){i||(i=!0,o())}function m(){try{z.documentElement.doScroll(\"left\")}catch(c){return void setTimeout(m,50)}s()}}(window);"
  },
  {
    "path": "jeecgboot-vue3/src/assets/less/JAreaLinkage.less",
    "content": ".area-zoom-in-top-enter-active,\n.area-zoom-in-top-leave-active {\n  opacity: 1;\n  transform: scaleY(1);\n}\n\n.area-zoom-in-top-enter,\n.area-zoom-in-top-leave-active {\n  opacity: 0;\n  transform: scaleY(0);\n}\n\n.area-select {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n  color: rgba(0, 0, 0, 0.65);\n  font-size: 14px;\n  font-variant: tabular-nums;\n  line-height: 1.5;\n  list-style: none;\n  font-feature-settings: 'tnum';\n  position: relative;\n  outline: 0;\n  display: block;\n  background-color: #fff;\n  border: 1px solid #d9d9d9;\n  border-top-width: 1.02px;\n  border-radius: 4px;\n  outline: none;\n  transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);\n  -webkit-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.area-select-wrap .area-select {\n  display: inline-block;\n}\n\n.area-select * {\n  box-sizing: border-box;\n}\n\n.area-select:hover {\n  border-color: #40a9ff;\n  border-right-width: 1px !important;\n  outline: 0;\n}\n\n.area-select:active {\n  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);\n}\n\n.area-select.small {\n  width: 126px;\n}\n\n.area-select.medium {\n  width: 160px;\n}\n\n.area-select.large {\n  width: 194px;\n}\n\n.area-select.is-disabled {\n  background: #eceff5;\n  cursor: not-allowed;\n}\n\n.area-select.is-disabled:hover {\n  border-color: #e1e2e6;\n}\n\n.area-select.is-disabled .area-selected-trigger {\n  cursor: not-allowed;\n}\n\n.area-select .area-selected-trigger {\n  position: relative;\n  display: block;\n  font-size: 14px;\n  cursor: pointer;\n  margin: 0;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  height: 100%;\n  padding: 8px 20px 7px 12px;\n}\n\n.area-select .area-select-icon {\n  position: absolute;\n  top: 50%;\n  margin-top: -2px;\n  right: 6px;\n  content: '';\n  width: 0;\n  height: 0;\n  border: 6px solid transparent;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  transition: all 0.3s linear;\n  transform-origin: center;\n}\n\n.area-select .area-select-icon.active {\n  margin-top: -8px;\n  transform: rotate(180deg);\n}\n\n.area-selectable-list-wrap {\n  position: absolute;\n  width: 100%;\n  max-height: 275px;\n  z-index: 15000;\n  background-color: #fff;\n  box-sizing: border-box;\n  overflow-x: auto;\n  margin: 2px 0;\n  border-radius: 4px;\n  outline: none;\n  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n\n  transition: opacity 0.15s, transform 0.3s !important;\n  transform-origin: center top !important;\n}\n\n.area-selectable-list {\n  position: relative;\n  margin: 0;\n  padding: 6px 0;\n  width: 100%;\n  font-size: 14px;\n  color: #565656;\n  list-style: none;\n}\n\n.area-selectable-list .area-select-option {\n  position: relative;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  cursor: pointer;\n  padding: 0 15px 0 10px;\n  height: 32px;\n  line-height: 32px;\n}\n\n.area-selectable-list .area-select-option.hover {\n  background-color: #e6f7ff;\n}\n\n.area-selectable-list .area-select-option.selected {\n  color: rgba(0, 0, 0, 0.65);\n  font-weight: 600;\n  background-color: #efefef;\n}\n\n.cascader-menu-list-wrap {\n  position: absolute;\n  white-space: nowrap;\n  z-index: 15000;\n  background-color: #fff;\n  box-sizing: border-box;\n  overflow: hidden;\n  font-size: 0;\n  margin: 2px 0;\n  border-radius: 4px;\n  outline: none;\n  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n\n  transition: opacity 0.15s, transform 0.3s !important;\n  transform-origin: center top !important;\n}\n\n.cascader-menu-list {\n  position: relative;\n  margin: 0;\n  font-size: 14px;\n  color: #565656;\n  padding: 6px 0;\n  list-style: none;\n  display: inline-block;\n  height: 204px;\n  overflow-x: hidden;\n  overflow-y: auto;\n  min-width: 160px;\n  vertical-align: top;\n  background-color: #fff;\n  border-right: 1px solid #e4e7ed;\n}\n\n.cascader-menu-list:last-child {\n  border-right: none;\n}\n\n.cascader-menu-list .cascader-menu-option {\n  position: relative;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  cursor: pointer;\n  padding: 0 15px 0 10px;\n  height: 32px;\n  line-height: 32px;\n}\n\n.cascader-menu-list .cascader-menu-option.hover,\n.cascader-menu-list .cascader-menu-option:hover {\n  background-color: #e6f7ff;\n}\n\n.cascader-menu-list .cascader-menu-option.selected {\n  color: rgba(0, 0, 0, 0.65);\n  font-weight: 600;\n  background-color: #efefef;\n}\n\n.cascader-menu-list .cascader-menu-option.cascader-menu-extensible:after {\n  position: absolute;\n  top: 50%;\n  margin-top: -4px;\n  right: 5px;\n  content: '';\n  width: 0;\n  height: 0;\n  border: 4px solid transparent;\n  border-left-color: #a1a4ad;\n}\n\n.cascader-menu-list::-webkit-scrollbar,\n.area-selectable-list-wrap::-webkit-scrollbar {\n  width: 8px;\n  background: transparent;\n}\n\n.area-selectable-list-wrap::-webkit-scrollbar-button:vertical:decremen,\n.area-selectable-list-wrap::-webkit-scrollbar-button:vertical:end:decrement,\n.area-selectable-list-wrap::-webkit-scrollbar-button:vertical:increment,\n.area-selectable-list-wrap::-webkit-scrollbar-button:vertical:start:increment,\n.cascader-menu-list::-webkit-scrollbar-button:vertical:decremen,\n.cascader-menu-list::-webkit-scrollbar-button:vertical:end:decrement,\n.cascader-menu-list::-webkit-scrollbar-button:vertical:increment,\n.cascader-menu-list::-webkit-scrollbar-button:vertical:start:increment {\n  display: none;\n}\n\n.cascader-menu-list::-webkit-scrollbar-thumb:vertical,\n.area-selectable-list-wrap::-webkit-scrollbar-thumb:vertical {\n  background-color: #b8b8b8;\n  border-radius: 4px;\n}\n\n.cascader-menu-list::-webkit-scrollbar-thumb:vertical:hover,\n.area-selectable-list-wrap::-webkit-scrollbar-thumb:vertical:hover {\n  background-color: #777;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/assets/loginmini/style/base.less",
    "content": "::-webkit-input-placeholder {\n  /* WebKit browsers */\n  color: #868686;\n  font-size: 15px;\n}\n\n::-moz-placeholder {\n  /* Mozilla Firefox 19+ */\n  color: #868686;\n  font-size: 15px;\n}\n\n:-ms-input-placeholder {\n  /* Internet Explorer 10+ */\n  color: #868686;\n  font-size: 15px;\n}\n\ninput:-webkit-autofill {\n  transition: background-color 5000s ease-in-out 0s;\n}\n\nhtml {\n  scroll-behavior: smooth;\n}\n\nhtml,\nbody {\n  color: #333;\n  margin: 0;\n  height: 100%;\n  font-family: 'Myriad Set Pro', 'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  font-weight: normal;\n}\n\n* {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n\na {\n  text-decoration: none;\n  color: #000;\n}\n\na,\nlabel,\nbutton,\ninput,\nselect {\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nimg {\n  max-width: 100%;\n  height: auto;\n  display: block;\n  border: 0;\n}\n\nbody {\n  background: #e3f0ff;\n  color: #666;\n}\n\nhtml,\nbody,\ndiv,\ndl,\ndt,\ndd,\nol,\nul,\nli,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np,\nblockquote,\npre,\nbutton,\nfieldset,\nform,\ninput,\nlegend,\ntextarea,\nth,\ntd {\n  margin: 0;\n  padding: 0;\n}\n\na {\n  text-decoration: none;\n  color: #08acee;\n}\n\nbutton {\n  outline: 0;\n}\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  outline: none;\n}\n\nli {\n  list-style: none;\n}\n\na {\n  color: #666;\n}\n\n.clearfix::after {\n  clear: both;\n  content: '.';\n  display: block;\n  height: 0;\n  visibility: hidden;\n}\n\n.clearfix {\n}\n\n.divHeight {\n  width: 100%;\n  height: 10px;\n  background: #f5f5f5;\n  position: relative;\n  overflow: hidden;\n}\n\n.r-line {\n  position: relative;\n}\n\n.r-line:after {\n  content: '';\n  position: absolute;\n  z-index: 0;\n  top: 0;\n  right: 0;\n  height: 100%;\n  border-right: 1px solid #d9d9d9;\n  -webkit-transform: scaleX(0.5);\n  transform: scaleX(0.5);\n  -webkit-transform-origin: 100% 0;\n  transform-origin: 100% 0;\n}\n\n.b-line {\n  position: relative;\n}\n\n.b-line:after {\n  content: '';\n  position: absolute;\n  z-index: 2;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 1px;\n  border-bottom: 1px solid #dedede;\n  -webkit-transform: scaleY(0.5);\n  transform: scaleY(0.5);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n}\n\n.aui-arrow {\n  position: relative;\n  padding-right: 0.8rem;\n}\n\n.aui-arrow span {\n  font-size: 0.8rem;\n  color: #9b9b9b;\n}\n\n.aui-arrow:after {\n  content: ' ';\n  display: inline-block;\n  height: 6px;\n  width: 6px;\n  border-width: 2px 2px 0 0;\n  border-color: #848484;\n  border-style: solid;\n  -webkit-transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0);\n  transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0);\n  position: relative;\n  position: absolute;\n  top: 50%;\n  margin-top: -4px;\n  right: 2px;\n  border-radius: 1px;\n}\n\n.aui-flex {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  position: relative;\n}\n\n.aui-flex-box {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  flex: 1;\n  min-width: 0;\n  font-size: 14px;\n  color: #333;\n}\n\n/* 必要布局样式css */\n.aui-flexView {\n  width: 100%;\n  height: 100%;\n  margin: 0 auto;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  -ms-flex-direction: column;\n  flex-direction: column;\n}\n\n.aui-scrollView {\n  width: 100%;\n  height: 100%;\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  -ms-flex: 1;\n  flex: 1;\n  overflow-y: auto;\n  overflow-x: hidden;\n  -webkit-overflow-scrolling: touch;\n  position: relative;\n  padding-bottom: 53px;\n}\n\n.aui-navBar {\n  height: 44px;\n  position: relative;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  z-index: 102;\n  background-color: #5064eb;\n}\n\n.aui-navBar-item {\n  height: 44px;\n  min-width: 15%;\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 0 15%;\n  -ms-flex: 0 0 15%;\n  flex: 0 0 15%;\n  padding: 0 0.9rem;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  -ms-flex-align: center;\n  align-items: center;\n  font-size: 0.7rem;\n  white-space: nowrap;\n  overflow: hidden;\n  color: #808080;\n  position: relative;\n}\n\n.aui-navBar-item:first-child {\n  -webkit-box-ordinal-group: 2;\n  -webkit-order: 1;\n  -ms-flex-order: 1;\n  order: 1;\n  margin-right: -25%;\n  font-size: 0.9rem;\n  font-weight: bold;\n}\n\n.aui-navBar-item:last-child {\n  -webkit-box-ordinal-group: 4;\n  -webkit-order: 3;\n  -ms-flex-order: 3;\n  order: 3;\n  -webkit-box-pack: end;\n  -webkit-justify-content: flex-end;\n  -ms-flex-pack: end;\n  justify-content: flex-end;\n}\n\n.aui-center {\n  -webkit-box-ordinal-group: 3;\n  -webkit-order: 2;\n  -ms-flex-order: 2;\n  order: 2;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n  -ms-flex-pack: center;\n  justify-content: center;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  -ms-flex-align: center;\n  align-items: center;\n  height: 44px;\n  width: 80%;\n  margin-left: 22%;\n}\n\n.aui-center-title {\n  text-align: center;\n  width: 100%;\n  white-space: nowrap;\n  overflow: hidden;\n  display: block;\n  text-overflow: ellipsis;\n  font-size: 0.95rem;\n  color: #fff;\n  font-weight: 500;\n}\n\n.icon {\n  width: 20px;\n  height: 20px;\n  display: block;\n  border: none;\n  float: left;\n  background-size: 20px;\n  background-repeat: no-repeat;\n  position: relative;\n}\n\n.login-background-img {\n  background-image: url(../icon/jeecg_bg.png);\n  background-size: cover;\n  background-position: top center;\n  background-repeat: no-repeat;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/assets/loginmini/style/home.less",
    "content": ".aui-content {\n  padding: 40px 60px;\n  min-height: 100vh;\n}\n\n.aui-container {\n  max-width: 1000px;\n  margin: 0 auto;\n  box-shadow: 0 4px 8px 1px rgba(0, 0, 0, 0.2);\n  position: fixed;\n  top: 50%;\n  left: 50%;\n  width: 92%;\n  height: auto;\n  -webkit-transform: translateX(-50%) translateY(-50%);\n  -moz-transform: translateX(-50%) translateY(-50%);\n  -ms-transform: translateX(-50%) translateY(-50%);\n  transform: translateX(-50%) translateY(-50%);\n  -webkit-transform: translateX(-50%) translateY(-50%);\n}\n\n.aui-form {\n  width: 100%;\n  background: #eee;\n  display: -webkit-box;\n  display: -moz-box;\n  display: -ms-flexbox;\n  display: -webkit-flex;\n  display: flex;\n}\n\n.aui-image {\n  padding: 180px 80px;\n  flex-basis: 60%;\n  -webkit-flex-basis: 60%;\n  background-color: #0198cd;\n  background-image: url(../icon/jeecg_ad.png);\n  background-size: cover;\n}\n\n.aui-image-text {\n  top: 50%;\n  left: 50%;\n  width: 100%;\n}\n\n.aui-formBox {\n  flex-basis: 40%;\n  -webkit-flex-basis: 40%;\n  box-sizing: border-box;\n  padding: 30px 20px;\n  background: #fff;\n  box-shadow: 2px 9px 49px -17px rgba(0, 0, 0, 0.1);\n}\n\n.aui-logo {\n  width: 180px;\n  height: 80px;\n  position: absolute;\n  top: 2%;\n  left: 8%;\n  z-index: 4;\n}\n\n.aui-account-line {\n  padding-top: 20px;\n  padding-bottom: 40px;\n}\n\n.aui-code-line {\n  position: absolute;\n  right: 0;\n  top: 0;\n  border-left: 3px solid #fff;\n  height: 42px;\n  padding: 0 15px;\n  line-height: 40px;\n  font-size: 14px;\n  cursor: pointer;\n}\n\n.aui-eye {\n  position: absolute;\n  right: 20px;\n  top: 10px;\n  width: 20px;\n  cursor: pointer;\n}\n\n.aui-input-line {\n  background: #f5f5f9;\n  border-radius: 2px;\n  position: relative;\n  margin: 12px 0;\n}\n\n.aui-input-line input {\n  width: 100%;\n  padding: 12px 10px;\n  border: none;\n  color: #333333;\n  font-size: 14px;\n  background: unset;\n  padding-left: 40px;\n}\n\n.aui-input-line .icon {\n  position: absolute;\n  top: 10px;\n  left: 10px;\n}\n\n.icon-line-user {\n  background-image: url(../icon/icon-line-user.png);\n}\n\n.icon-line-tel {\n  background-image: url(../icon/icon-line-tel.png);\n}\n\n.icon-line-msg {\n  background-image: url(../icon/icon-line-msg.png);\n}\n\n.icon-line-pad {\n  background-image: url(../icon/icon-line-pad.png);\n}\n\n.aui-forgot .aui-input-line input {\n  padding-left: 20px;\n}\n\n.aui-forgot .aui-input-line {\n  background: none;\n  border: 1px solid #dbdbdb;\n  border-radius: 2px;\n}\n\n.aui-forgot .aui-input-line:focus {\n  border-color: #1b90ff;\n}\n\n.aui-forgot .aui-input-line:hover {\n  border-color: #1b90ff;\n}\n\n.aui-forgot .aui-input-line .aui-code-line {\n  border-left: 1px solid #dbdbdb;\n  height: 40px;\n  color: #1b90ff;\n}\n\n.aui-step-box {\n  width: 100%;\n  height: auto;\n  position: relative;\n  overflow: hidden;\n  margin-top: 50px;\n  margin-bottom: 20px;\n}\n\n.aui-step-box::after {\n  position: absolute;\n  top: 20px;\n  left: 50%;\n  width: 76%;\n  margin-left: -38%;\n  height: 1px;\n  background: #bcbcbc;\n  content: '';\n}\n\n.aui-step-item {\n  width: 33.333%;\n  float: left;\n  text-align: center;\n  position: relative;\n  z-index: 2;\n}\n\n.aui-step-tags em {\n  width: 40px;\n  height: 40px;\n  border: 8px solid #fff;\n  line-height: 1.3;\n  border-radius: 100px;\n  background: #bcbcbc;\n  display: block;\n  margin: 0 auto;\n  font-style: normal;\n  color: #fff;\n  font-size: 19px;\n  font-weight: 500;\n}\n\n.aui-step-tags p {\n  font-size: 14px;\n  color: #bcbcbc;\n}\n\n.activeStep .aui-step-tags em {\n  background: #1b90ff;\n}\n\n.activeStep .aui-step-tags p {\n  color: #1b90ff;\n}\n\n.aui-success {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  height: 80px;\n  width: 100%;\n  margin-top: -40px;\n  margin-left: -50%;\n}\n\n.aui-success-icon {\n  width: 40px;\n  margin: 0 auto;\n}\n\n.aui-success h3 {\n  width: 100%;\n  text-align: center;\n  color: #515151;\n  font-size: 18px;\n  padding-top: 20px;\n}\n\n.aui-form-nav {\n  text-align: center;\n  padding-bottom: 20px;\n}\n\n.aui-form-nav .aui-flex-box {\n  color: #040404;\n  font-size: 18px;\n  font-weight: 500;\n  cursor: pointer;\n}\n\n.aui-clear-left {\n  text-align: left;\n}\n\n.aui-clear-left .activeNav::after {\n  left: 18px;\n}\n\n.activeNav {\n  position: relative;\n}\n\n.activeNav::after {\n  content: '';\n  position: absolute;\n  z-index: 0;\n  bottom: -10px;\n  left: 50%;\n  margin-left: -15px;\n  width: 30px;\n  height: 4px;\n  background: #1b90ff;\n  border-radius: 100px;\n}\n\n.phone .aui-inputClear {\n  padding-left: 0;\n}\n\n.phone .aui-inputClear input {\n  //padding-left: 1px;\n}\n\n.phone .aui-inputClear .aui-code {\n  text-align: right;\n  width: auto;\n  bottom: 10px;\n}\n\n.phone .aui-inputClear .aui-code a {\n  color: #1b90ff;\n  font-size: 14px;\n}\n\n.phoneChina {\n  position: absolute;\n  bottom: 10px;\n  left: 0;\n  font-size: 14px;\n  color: #040404;\n}\n\n.phoneChina::after {\n  position: absolute;\n  right: -25px;\n  bottom: 0;\n  content: '';\n  background-image: url(../icon/icon_dow.png);\n  background-size: 18px;\n  width: 18px;\n  height: 18px;\n}\n\n.phoneChina:before {\n  position: absolute;\n  right: -42px;\n  bottom: -15px;\n  content: ' ';\n  background: #fff;\n  width: 18px;\n  height: 18px;\n}\n\n.aui-ewm {\n  width: 280px;\n  margin: 0 auto;\n}\n\n.aui-formEwm {\n  padding: 50px 40px 55px 40px;\n}\n\n.aui-inputClear {\n  width: 100%;\n  border-bottom: 1px solid #cccccc;\n  position: relative;\n  padding-left: 20px;\n  background: #fff;\n  margin-bottom: 8px;\n  margin-top: 20px;\n}\n\n.aui-inputClear .icon {\n  position: absolute;\n  top: 10px;\n  left: 0;\n}\n\n.aui-inputClear input {\n  width: 100%;\n  padding: 10px;\n  border: none;\n  color: #333333;\n  font-size: 14px;\n  background: none;\n}\n\n.aui-code {\n  position: absolute;\n  right: 8px;\n  bottom: 0;\n  width: 115px;\n  cursor: pointer;\n}\n\n.icon-code {\n  background-image: url(../icon/icon-user.png);\n}\n\n.icon-password {\n  background-image: url(../icon/icon-password.png);\n}\n.icon-depart {\n  top: 5px !important;\n  background-image: url(../icon/icon-depart.png);\n}\n.icon-code {\n  background-image: url(../icon/icon-code.png);\n}\n\n.aui-inputClear:focus {\n  border-bottom: 1px solid #1b90ff;\n}\n\n.aui-inputClear:hover {\n  border-bottom: 1px solid #1b90ff;\n}\n\n.aui-choice {\n  position: relative;\n  font-size: 12px;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  position: relative;\n  color: #040404;\n}\n\n.aui-choice input {\n  width: 14px;\n  height: 14px;\n  cursor: pointer;\n}\n\n.aui-forget a {\n  color: #1b90ff;\n  font-size: 12px;\n}\n\n.aui-forget a:hover {\n  text-decoration: underline;\n}\n\n.aui-formButton {\n  padding-top: 10px;\n}\n\n.aui-formButton a {\n  height: 42px;\n  padding: 10px 15px;\n  font-size: 14px;\n  border-radius: 8px;\n  border-color: #67b5ff;\n  background: #1b90ff;\n  width: 100%;\n  cursor: pointer;\n  border: none;\n  color: #fff;\n  margin: 8px 0;\n  display: block;\n  text-align: center;\n}\n\n.aui-formButton a:focus {\n  opacity: 0.9;\n}\n\n.aui-formButton a:hover {\n  opacity: 0.9;\n}\n\n.aui-formButton .aui-linek-code {\n  background: #fff;\n  color: #3c3c3c;\n  border: 1px solid #dbdbdb;\n}\n\n.aui-formButton .aui-linek-code:hover {\n  color: #1b90ff;\n  border: 1px solid #1b90ff;\n}\n\n.aui-third-text {\n  font-size: 12px;\n  color: #3c3c3c;\n  margin-top: 25px;\n  margin-bottom: 25px;\n}\n\n.aui-third-text span {\n  color: #afafaf;\n  display: block;\n  width: 38%;\n  margin: 0 auto;\n  text-align: center;\n  position: relative;\n  background: #fff;\n  z-index: 100;\n  font-size: 12px;\n}\n\n.aui-third-border {\n  position: relative;\n}\n\n.aui-third-border::after {\n  content: '';\n  position: absolute;\n  z-index: 0;\n  top: 8px;\n  left: 0;\n  width: 100%;\n  height: 1px;\n  border-top: 1px solid #d9d9d9;\n  -webkit-transform: scaleY(0.5);\n  transform: scaleY(0.5);\n  -webkit-transform-origin: 0 100%;\n  transform-origin: 0 100%;\n}\n\n.aui-third-login {\n  width: 30px;\n  height: 30px;\n  margin: 0 auto;\n  border-radius: 100px;\n}\n\n.aui-third-login a {\n  font-size: 22px;\n  margin: 0 auto;\n  border-radius: 100px;\n  display: inline-block;\n  color: #888;\n}\n\n.aui-third-login a:hover {\n  color: #1b90ff;\n  cursor: pointer;\n}\n\n.aui-third-login:hover {\n  cursor: pointer;\n}\n\n@media (max-width: 320px) {\n  .aui-form {\n    flex-direction: column;\n  }\n\n  .aui-image {\n    order: 2;\n    display: none;\n  }\n\n  .aui-container {\n    width: 100%;\n    max-width: 550px;\n    margin-top: 10px;\n  }\n\n  .aui-content {\n    justify-content: initial;\n    width: 100%;\n    padding: 20px;\n  }\n}\n\n@media (min-width: 321px) and (max-width: 375px) {\n  .aui-form {\n    flex-direction: column;\n  }\n\n  .aui-image {\n    order: 2;\n    display: none;\n  }\n\n  .aui-container {\n    width: 90%;\n    max-width: 550px;\n  }\n\n  .aui-content {\n    justify-content: initial;\n    width: 100%;\n    padding: 20px;\n  }\n}\n\n@media (min-width: 375px) and (max-width: 425px) {\n  .aui-form {\n    flex-direction: column;\n  }\n\n  .aui-image {\n    order: 2;\n    display: none;\n  }\n\n  .aui-container {\n    width: 90%;\n    max-width: 550px;\n  }\n\n  .aui-content {\n    justify-content: initial;\n    width: 100%;\n    padding: 40px;\n  }\n}\n\n@media (min-width: 425px) and (max-width: 768px) {\n  .aui-form {\n    flex-direction: column;\n  }\n\n  .aui-image {\n    order: 2;\n    display: none;\n  }\n\n  .aui-container {\n    width: 90%;\n    max-width: 550px;\n  }\n\n  .aui-content {\n    justify-content: initial;\n    width: 100%;\n    padding: 40px;\n  }\n\n  .aui-step-box::after {\n    width: 70%;\n    margin-left: -35%;\n  }\n}\n\n@media only screen and (max-width: 767px) {\n  .aui-logo {\n    top: 3%;\n  }\n}\n\n@media screen and (max-width: 300px) {\n  .aui-logo {\n    top: 3%;\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Application/index.ts",
    "content": "import { withInstall } from '/@/utils';\n\nimport appLogo from './src/AppLogo.vue';\nimport appProvider from './src/AppProvider.vue';\nimport appSearch from './src/search/AppSearch.vue';\nimport appLocalePicker from './src/AppLocalePicker.vue';\nimport appDarkModeToggle from './src/AppDarkModeToggle.vue';\n\nexport { useAppProviderContext } from './src/useAppContext';\n\nexport const AppLogo = withInstall(appLogo);\nexport const AppProvider = withInstall(appProvider);\nexport const AppSearch = withInstall(appSearch);\nexport const AppLocalePicker = withInstall(appLocalePicker);\nexport const AppDarkModeToggle = withInstall(appDarkModeToggle);\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Application/src/AppDarkModeToggle.vue",
    "content": "<template>\n  <div v-if=\"getShowDarkModeToggle\" :class=\"getClass\" @click=\"toggleDarkMode\">\n    <div :class=\"`${prefixCls}-inner`\"> </div>\n    <SvgIcon size=\"14\" name=\"sun\" />\n    <SvgIcon size=\"14\" name=\"moon\" />\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { computed, unref } from 'vue';\n  import { SvgIcon } from '/@/components/Icon';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useRootSetting } from '/@/hooks/setting/useRootSetting';\n  import { updateHeaderBgColor, updateSidebarBgColor } from '/@/logics/theme/updateBackground';\n  import { updateDarkTheme } from '/@/logics/theme/dark';\n  import { ThemeEnum } from '/@/enums/appEnum';\n\n  const { prefixCls } = useDesign('dark-switch');\n  const { getDarkMode, setDarkMode, getShowDarkModeToggle } = useRootSetting();\n\n  const isDark = computed(() => getDarkMode.value === ThemeEnum.DARK);\n\n  const getClass = computed(() => [\n    prefixCls,\n    {\n      [`${prefixCls}--dark`]: unref(isDark),\n    },\n  ]);\n\n  function toggleDarkMode() {\n    const darkMode = getDarkMode.value === ThemeEnum.DARK ? ThemeEnum.LIGHT : ThemeEnum.DARK;\n    setDarkMode(darkMode);\n    updateDarkTheme(darkMode);\n    updateHeaderBgColor();\n    updateSidebarBgColor();\n  }\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-dark-switch';\n\n  html[data-theme='dark'] {\n    .@{prefix-cls} {\n      border: 1px solid rgb(196, 188, 188);\n    }\n  }\n\n  .@{prefix-cls} {\n    position: relative;\n    display: flex;\n    width: 50px;\n    height: 26px;\n    padding: 0 6px;\n    margin-left: auto;\n    cursor: pointer;\n    background-color: #151515;\n    border-radius: 30px;\n    justify-content: space-between;\n    align-items: center;\n\n    &-inner {\n      position: absolute;\n      z-index: 1;\n      width: 18px;\n      height: 18px;\n      background-color: #fff;\n      border-radius: 50%;\n      transition: transform 0.5s, background-color 0.5s;\n      will-change: transform;\n    }\n\n    &--dark {\n      .@{prefix-cls}-inner {\n        transform: translateX(calc(100% + 2px));\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Application/src/AppLocalePicker.vue",
    "content": "<!--\n * @Author: Vben\n * @Description: Multi-language switching component\n-->\n<template>\n  <Dropdown\n    placement=\"bottom\"\n    :trigger=\"['click']\"\n    :dropMenuList=\"localeList\"\n    :selectedKeys=\"selectedKeys\"\n    @menuEvent=\"handleMenuEvent\"\n    overlayClassName=\"app-locale-picker-overlay\"\n  >\n    <span class=\"cursor-pointer flex items-center\">\n      <Icon icon=\"ion:language\" />\n      <span v-if=\"showText\" class=\"ml-1\">{{ getLocaleText }}</span>\n    </span>\n  </Dropdown>\n</template>\n<script lang=\"ts\" setup>\n  import type { LocaleType } from '/#/config';\n  import type { DropMenu } from '/@/components/Dropdown';\n  import { ref, watchEffect, unref, computed } from 'vue';\n  import { Dropdown } from '/@/components/Dropdown';\n  import { Icon } from '/@/components/Icon';\n  import { useLocale } from '/@/locales/useLocale';\n  import { localeList } from '/@/settings/localeSetting';\n\n  const props = defineProps({\n    /**\n     * Whether to display text\n     */\n    showText: { type: Boolean, default: true },\n    /**\n     * Whether to refresh the interface when changing\n     */\n    reload: { type: Boolean },\n  });\n\n  const selectedKeys = ref<string[]>([]);\n\n  const { changeLocale, getLocale } = useLocale();\n\n  const getLocaleText = computed(() => {\n    const key = selectedKeys.value[0];\n    if (!key) {\n      return '';\n    }\n    return localeList.find((item) => item.event === key)?.text;\n  });\n\n  watchEffect(() => {\n    selectedKeys.value = [unref(getLocale)];\n  });\n\n  async function toggleLocale(lang: LocaleType | string) {\n    await changeLocale(lang as LocaleType);\n    selectedKeys.value = [lang as string];\n    props.reload && location.reload();\n  }\n\n  function handleMenuEvent(menu: DropMenu) {\n    if (unref(getLocale) === menu.event) {\n      return;\n    }\n    toggleLocale(menu.event as string);\n  }\n</script>\n\n<style lang=\"less\">\n  .app-locale-picker-overlay {\n    .ant-dropdown-menu-item {\n      min-width: 160px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Application/src/AppLogo.vue",
    "content": "<!--\n * @Author: Jeecg\n * @Description: logo component\n-->\n<template>\n  <div class=\"anticon\" :class=\"getAppLogoClass\" @click=\"goHome\">\n    <img src=\"../../../assets/images/logo.png\" />\n    <div class=\"ml-2 truncate md:opacity-100\" :class=\"getTitleClass\" v-show=\"showTitle\">\n      {{ shortTitle }}\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { computed, unref } from 'vue';\n  import { useGlobSetting } from '/@/hooks/setting';\n  import { useGo } from '/@/hooks/web/usePage';\n  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { PageEnum } from '/@/enums/pageEnum';\n  import { useUserStore } from '/@/store/modules/user';\n\n  const props = defineProps({\n    /**\n     * The theme of the current parent component\n     */\n    theme: { type: String, validator: (v: string) => ['light', 'dark'].includes(v) },\n    /**\n     * Whether to show title\n     */\n    showTitle: { type: Boolean, default: true },\n    /**\n     * The title is also displayed when the menu is collapsed\n     */\n    alwaysShowTitle: { type: Boolean },\n  });\n\n  const { prefixCls } = useDesign('app-logo');\n  const { getCollapsedShowTitle } = useMenuSetting();\n  const userStore = useUserStore();\n  const { title, shortTitle } = useGlobSetting();\n  \n  const go = useGo();\n\n  const getAppLogoClass = computed(() => [prefixCls, props.theme, { 'collapsed-show-title': unref(getCollapsedShowTitle) }]);\n\n  const getTitleClass = computed(() => [\n    `${prefixCls}__title`,\n    {\n      'xs:opacity-0': !props.alwaysShowTitle,\n    },\n  ]);\n\n  function goHome() {\n    go(userStore.getUserInfo.homePath || PageEnum.BASE_HOME);\n  }\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-app-logo';\n\n  .@{prefix-cls} {\n    display: flex;\n    align-items: center;\n    padding-left: 7px;\n    cursor: pointer;\n    transition: all 0.2s ease;\n    //左侧菜单模式和左侧菜单混合模式加渐变背景色\n    &.jeecg-layout-mix-sider-logo,&.jeecg-layout-menu-logo{\n      background:@sider-logo-bg-color;\n    }\n    // &.light {\n    //   border-bottom: 1px solid @border-color-base;\n    // }\n\n    &.collapsed-show-title {\n      padding-left: 20px;\n    }\n\n    &.light &__title {\n      color: @primary-color;\n    }\n\n    &.dark &__title {\n      color: @white;\n    }\n\n    &__title {\n      font-size: 18px;\n      font-weight: 600;\n      transition: all 0.5s;\n      line-height: normal;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Application/src/AppProvider.vue",
    "content": "<script lang=\"ts\">\n  import { defineComponent, toRefs, ref, unref } from 'vue';\n  import { createAppProviderContext } from './useAppContext';\n  import { createBreakpointListen } from '/@/hooks/event/useBreakpoint';\n  import { prefixCls } from '/@/settings/designSetting';\n  import { useAppStore } from '/@/store/modules/app';\n  import { MenuModeEnum, MenuTypeEnum } from '/@/enums/menuEnum';\n\n  const props = {\n    /**\n     * class style prefix\n     */\n    prefixCls: { type: String, default: prefixCls },\n  };\n\n  export default defineComponent({\n    name: 'AppProvider',\n    inheritAttrs: false,\n    props,\n    setup(props, { slots }) {\n      const isMobile = ref(false);\n      const isSetState = ref(false);\n\n      const appStore = useAppStore();\n\n      // Monitor screen breakpoint information changes\n      createBreakpointListen(({ screenMap, sizeEnum, width }) => {\n        const lgWidth = screenMap.get(sizeEnum.LG);\n        if (lgWidth) {\n          isMobile.value = width.value - 1 < lgWidth;\n        }\n        handleRestoreState();\n      });\n\n      const { prefixCls } = toRefs(props);\n\n      // Inject variables into the global\n      createAppProviderContext({ prefixCls, isMobile });\n\n      /**\n       * Used to maintain the state before the window changes\n       */\n      function handleRestoreState() {\n        if (unref(isMobile)) {\n          if (!unref(isSetState)) {\n            isSetState.value = true;\n            const {\n              menuSetting: { type: menuType, mode: menuMode, collapsed: menuCollapsed, split: menuSplit },\n            } = appStore.getProjectConfig;\n            appStore.setProjectConfig({\n              menuSetting: {\n                type: MenuTypeEnum.SIDEBAR,\n                mode: MenuModeEnum.INLINE,\n                split: false,\n              },\n            });\n            appStore.setBeforeMiniInfo({ menuMode, menuCollapsed, menuType, menuSplit });\n          }\n        } else {\n          if (unref(isSetState)) {\n            isSetState.value = false;\n            const { menuMode, menuCollapsed, menuType, menuSplit } = appStore.getBeforeMiniInfo;\n            appStore.setProjectConfig({\n              menuSetting: {\n                type: menuType,\n                mode: menuMode,\n                collapsed: menuCollapsed,\n                split: menuSplit,\n              },\n            });\n          }\n        }\n      }\n      return () => slots.default?.();\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Application/src/search/AppSearch.vue",
    "content": "<script lang=\"tsx\">\n  import { defineComponent, ref, unref } from 'vue';\n  import { Tooltip } from 'ant-design-vue';\n  import { SearchOutlined } from '@ant-design/icons-vue';\n  import AppSearchModal from './AppSearchModal.vue';\n  import { useI18n } from '/@/hooks/web/useI18n';\n\n  export default defineComponent({\n    name: 'AppSearch',\n    setup() {\n      const showModal = ref(false);\n      const { t } = useI18n();\n\n      function changeModal(show: boolean) {\n        showModal.value = show;\n      }\n\n      return () => {\n        return (\n          <div class=\"p-1\" onClick={changeModal.bind(null, true)}>\n            <Tooltip>\n              {{\n                title: () => t('common.searchText'),\n                default: () => <SearchOutlined />,\n              }}\n            </Tooltip>\n            <AppSearchModal onClose={changeModal.bind(null, false)} visible={unref(showModal)} />\n          </div>\n        );\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Application/src/search/AppSearchFooter.vue",
    "content": "<template>\n  <div :class=\"`${prefixCls}`\">\n    <AppSearchKeyItem :class=\"`${prefixCls}-item`\" icon=\"ant-design:enter-outlined\" />\n    <span>{{ t('component.app.toSearch') }}</span>\n    <AppSearchKeyItem :class=\"`${prefixCls}-item`\" icon=\"ion:arrow-up-outline\" />\n    <AppSearchKeyItem :class=\"`${prefixCls}-item`\" icon=\"ion:arrow-down-outline\" />\n    <span>{{ t('component.app.toNavigate') }}</span>\n    <AppSearchKeyItem :class=\"`${prefixCls}-item`\" icon=\"mdi:keyboard-esc\" />\n    <span>{{ t('common.closeText') }}</span>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import AppSearchKeyItem from './AppSearchKeyItem.vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  const { prefixCls } = useDesign('app-search-footer');\n  const { t } = useI18n();\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-app-search-footer';\n\n  .@{prefix-cls} {\n    position: relative;\n    display: flex;\n    height: 44px;\n    padding: 0 16px;\n    font-size: 12px;\n    color: #666;\n    background-color: @component-background;\n    border-top: 1px solid @border-color-base;\n    border-radius: 0 0 16px 16px;\n    align-items: center;\n    flex-shrink: 0;\n\n    &-item {\n      display: flex;\n      width: 20px;\n      height: 18px;\n      padding-bottom: 2px;\n      margin-right: 0.4em;\n      background-color: linear-gradient(-225deg, #d5dbe4, #f8f8f8);\n      border-radius: 2px;\n      box-shadow: inset 0 -2px 0 0 #cdcde6, inset 0 0 1px 1px #fff, 0 1px 2px 1px rgba(30, 35, 90, 0.4);\n      align-items: center;\n      justify-content: center;\n\n      &:nth-child(2),\n      &:nth-child(3),\n      &:nth-child(6) {\n        margin-left: 14px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Application/src/search/AppSearchKeyItem.vue",
    "content": "<template>\n  <span :class=\"$attrs.class\">\n    <Icon :icon=\"icon\" />\n  </span>\n</template>\n<script lang=\"ts\" setup>\n  import { Icon } from '/@/components/Icon';\n  defineProps({\n    icon: String,\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Application/src/search/AppSearchModal.vue",
    "content": "<template>\n  <Teleport to=\"body\">\n    <transition name=\"zoom-fade\" mode=\"out-in\">\n      <div :class=\"getClass\" @click.stop v-if=\"visible\">\n        <div :class=\"`${prefixCls}-content`\" v-click-outside=\"handleClose\">\n          <div :class=\"`${prefixCls}-input__wrapper`\">\n            <a-input :class=\"`${prefixCls}-input`\" :placeholder=\"t('common.searchText')\" ref=\"inputRef\" allow-clear @change=\"handleSearch\">\n              <template #prefix>\n                <SearchOutlined />\n              </template>\n            </a-input>\n            <span :class=\"`${prefixCls}-cancel`\" @click=\"handleClose\">\n              {{ t('common.cancelText') }}\n            </span>\n          </div>\n\n          <div :class=\"`${prefixCls}-not-data`\" v-show=\"getIsNotData\">\n            {{ t('component.app.searchNotData') }}\n          </div>\n\n          <ul :class=\"`${prefixCls}-list`\" v-show=\"!getIsNotData\" ref=\"scrollWrap\">\n            <li\n              :ref=\"setRefs(index)\"\n              v-for=\"(item, index) in searchResult\"\n              :key=\"item.path\"\n              :data-index=\"index\"\n              @mouseenter=\"handleMouseenter\"\n              @click=\"handleEnter\"\n              :class=\"[\n                `${prefixCls}-list__item`,\n                {\n                  [`${prefixCls}-list__item--active`]: activeIndex === index,\n                },\n              ]\"\n            >\n              <div :class=\"`${prefixCls}-list__item-icon`\">\n                <Icon :icon=\"item.icon || 'mdi:form-select'\" :size=\"20\" />\n              </div>\n              <div :class=\"`${prefixCls}-list__item-text`\">\n                {{ item.name }}\n              </div>\n              <div :class=\"`${prefixCls}-list__item-enter`\">\n                <Icon icon=\"ant-design:enter-outlined\" :size=\"20\" />\n              </div>\n            </li>\n          </ul>\n          <AppSearchFooter />\n        </div>\n      </div>\n    </transition>\n  </Teleport>\n</template>\n\n<script lang=\"ts\" setup>\n  import { computed, unref, ref, watch, nextTick } from 'vue';\n  import { SearchOutlined } from '@ant-design/icons-vue';\n  import AppSearchFooter from './AppSearchFooter.vue';\n  import Icon from '/@/components/Icon';\n  // @ts-ignore\n  import vClickOutside from '/@/directives/clickOutside';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useRefs } from '/@/hooks/core/useRefs';\n  import { useMenuSearch } from './useMenuSearch';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useAppInject } from '/@/hooks/web/useAppInject';\n\n  const props = defineProps({\n    visible: { type: Boolean },\n  });\n\n  const emit = defineEmits(['close']);\n\n  const scrollWrap = ref(null);\n  const inputRef = ref<Nullable<HTMLElement>>(null);\n\n  const { t } = useI18n();\n  const { prefixCls } = useDesign('app-search-modal');\n  const [refs, setRefs] = useRefs();\n  const { getIsMobile } = useAppInject();\n\n  const { handleSearch, searchResult, keyword, activeIndex, handleEnter, handleMouseenter } = useMenuSearch(refs, scrollWrap, emit);\n\n  const getIsNotData = computed(() => !keyword || unref(searchResult).length === 0);\n\n  const getClass = computed(() => {\n    return [\n      prefixCls,\n      {\n        [`${prefixCls}--mobile`]: unref(getIsMobile),\n      },\n    ];\n  });\n\n  watch(\n    () => props.visible,\n    (visible: boolean) => {\n      visible &&\n        nextTick(() => {\n          unref(inputRef)?.focus();\n        });\n    }\n  );\n\n  function handleClose() {\n    searchResult.value = [];\n    emit('close');\n  }\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-app-search-modal';\n  @footer-prefix-cls: ~'@{namespace}-app-search-footer';\n  .@{prefix-cls} {\n    position: fixed;\n    top: 0;\n    left: 0;\n    z-index: 800;\n    display: flex;\n    width: 100%;\n    height: 100%;\n    padding-top: 50px;\n    background-color: rgba(0, 0, 0, 0.25);\n    justify-content: center;\n\n    &--mobile {\n      padding: 0;\n\n      > div {\n        width: 100%;\n      }\n\n      .@{prefix-cls}-input {\n        width: calc(100% - 38px);\n      }\n\n      .@{prefix-cls}-cancel {\n        display: inline-block;\n      }\n\n      .@{prefix-cls}-content {\n        width: 100%;\n        height: 100%;\n        border-radius: 0;\n      }\n\n      .@{footer-prefix-cls} {\n        display: none;\n      }\n\n      .@{prefix-cls}-list {\n        height: calc(100% - 80px);\n        max-height: unset;\n\n        &__item {\n          &-enter {\n            opacity: 0 !important;\n          }\n        }\n      }\n    }\n\n    &-content {\n      position: relative;\n      width: 632px;\n      margin: 0 auto auto auto;\n      background-color: @component-background;\n      border-radius: 16px;\n      box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n      flex-direction: column;\n    }\n\n    &-input__wrapper {\n      display: flex;\n      padding: 14px 14px 0 14px;\n      justify-content: space-between;\n      align-items: center;\n    }\n\n    &-input {\n      width: 100%;\n      height: 48px;\n      font-size: 1.3em;\n      color: #1c1e21;\n      border-radius: 6px;\n\n      span[role='img'] {\n        color: #999;\n      }\n    }\n\n    &-cancel {\n      display: none;\n      font-size: 1em;\n      color: #666;\n    }\n\n    &-not-data {\n      display: flex;\n      width: 100%;\n      height: 100px;\n      font-size: 0.9;\n      color: rgb(150 159 175);\n      align-items: center;\n      justify-content: center;\n    }\n\n    &-list {\n      max-height: 472px;\n      padding: 0 14px;\n      padding-bottom: 20px;\n      margin: 0 auto;\n      margin-top: 14px;\n      overflow: auto;\n\n      &__item {\n        position: relative;\n        display: flex;\n        width: 100%;\n        height: 56px;\n        padding-bottom: 4px;\n        padding-left: 14px;\n        margin-top: 8px;\n        font-size: 14px;\n        color: @text-color-base;\n        cursor: pointer;\n        // background-color: @component-background;\n        border-radius: 4px;\n        box-shadow: 0 1px 3px 0 #d4d9e1;\n        align-items: center;\n\n        > div:first-child,\n        > div:last-child {\n          display: flex;\n          align-items: center;\n        }\n\n        &--active {\n          color: #fff;\n          background-color: @primary-color;\n\n          .@{prefix-cls}-list__item-enter {\n            opacity: 1;\n          }\n        }\n\n        &-icon {\n          width: 30px;\n        }\n\n        &-text {\n          flex: 1;\n        }\n\n        &-enter {\n          width: 30px;\n          opacity: 0;\n        }\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Application/src/search/useMenuSearch.ts",
    "content": "import type { Menu } from '/@/router/types';\nimport { ref, onBeforeMount, unref, Ref, nextTick } from 'vue';\nimport { getMenus } from '/@/router/menus';\nimport { cloneDeep } from 'lodash-es';\nimport { filter, forEach } from '/@/utils/helper/treeHelper';\nimport { useGo } from '/@/hooks/web/usePage';\nimport { useScrollTo } from '/@/hooks/event/useScrollTo';\nimport { onKeyStroke, useDebounceFn } from '@vueuse/core';\nimport { useI18n } from '/@/hooks/web/useI18n';\nimport { URL_HASH_TAB } from '/@/utils';\n\nexport interface SearchResult {\n  name: string;\n  path: string;\n  icon?: string;\n  internalOrExternal: boolean;\n}\n\n// Translate special characters\nfunction transform(c: string) {\n  const code: string[] = ['$', '(', ')', '*', '+', '.', '[', ']', '?', '\\\\', '^', '{', '}', '|'];\n  return code.includes(c) ? `\\\\${c}` : c;\n}\n\nfunction createSearchReg(key: string) {\n  const keys = [...key].map((item) => transform(item));\n  const str = ['', ...keys, ''].join('.*');\n  return new RegExp(str, 'i');\n}\n\nexport function useMenuSearch(refs: Ref<HTMLElement[]>, scrollWrap: Ref<ElRef>, emit: EmitType) {\n  const searchResult = ref<SearchResult[]>([]);\n  const keyword = ref('');\n  const activeIndex = ref(-1);\n\n  let menuList: Menu[] = [];\n\n  const { t } = useI18n();\n  const go = useGo();\n  const handleSearch = useDebounceFn(search, 200);\n\n  onBeforeMount(async () => {\n    const list = await getMenus();\n    menuList = cloneDeep(list);\n    forEach(menuList, (item) => {\n      item.name = t(item.name);\n    });\n  });\n\n  function search(e: ChangeEvent) {\n    e?.stopPropagation();\n    const key = e.target.value;\n    keyword.value = key.trim();\n    if (!key) {\n      searchResult.value = [];\n      return;\n    }\n    const reg = createSearchReg(unref(keyword));\n    const filterMenu = filter(menuList, (item) => {\n      // 【issues/33】包含子菜单时，不添加到搜索队列\n      if (Array.isArray(item.children)) {\n        return false;\n      }\n      return reg.test(item.name) && !item.hideMenu;\n    });\n    searchResult.value = handlerSearchResult(filterMenu, reg);\n    activeIndex.value = 0;\n  }\n\n  function handlerSearchResult(filterMenu: Menu[], reg: RegExp, parent?: Menu) {\n    const ret: SearchResult[] = [];\n    filterMenu.forEach((item) => {\n      const { name, path, icon, children, hideMenu, meta, internalOrExternal } = item;\n      if (!hideMenu && reg.test(name) && (!children?.length || meta?.hideChildrenInMenu)) {\n        ret.push({\n          name: parent?.name ? `${parent.name} > ${name}` : name,\n          path,\n          icon,\n          internalOrExternal\n        });\n      }\n      if (!meta?.hideChildrenInMenu && Array.isArray(children) && children.length) {\n        ret.push(...handlerSearchResult(children, reg, item));\n      }\n    });\n    return ret;\n  }\n\n  // Activate when the mouse moves to a certain line\n  function handleMouseenter(e: any) {\n    const index = e.target.dataset.index;\n    activeIndex.value = Number(index);\n  }\n\n  // Arrow key up\n  function handleUp() {\n    if (!searchResult.value.length) return;\n    activeIndex.value--;\n    if (activeIndex.value < 0) {\n      activeIndex.value = searchResult.value.length - 1;\n    }\n    handleScroll();\n  }\n\n  // Arrow key down\n  function handleDown() {\n    if (!searchResult.value.length) return;\n    activeIndex.value++;\n    if (activeIndex.value > searchResult.value.length - 1) {\n      activeIndex.value = 0;\n    }\n    handleScroll();\n  }\n\n  // When the keyboard up and down keys move to an invisible place\n  // the scroll bar needs to scroll automatically\n  function handleScroll() {\n    const refList = unref(refs);\n    if (!refList || !Array.isArray(refList) || refList.length === 0 || !unref(scrollWrap)) {\n      return;\n    }\n\n    const index = unref(activeIndex);\n    const currentRef = refList[index];\n    if (!currentRef) {\n      return;\n    }\n    const wrapEl = unref(scrollWrap);\n    if (!wrapEl) {\n      return;\n    }\n    const scrollHeight = currentRef.offsetTop + currentRef.offsetHeight;\n    const wrapHeight = wrapEl.offsetHeight;\n    const { start } = useScrollTo({\n      el: wrapEl,\n      duration: 100,\n      to: scrollHeight - wrapHeight,\n    });\n    start();\n  }\n\n  // enter keyboard event\n  async function handleEnter() {\n    if (!searchResult.value.length) {\n      return;\n    }\n    const result = unref(searchResult);\n    const index = unref(activeIndex);\n    if (result.length === 0 || index < 0) {\n      return;\n    }\n    const to = result[index];\n    handleClose();\n    await nextTick();\n\n    // 代码逻辑说明: 【QQYUN-8369】搜索区分大小写，外部链接新页打开\n    if (to.internalOrExternal) {\n      // 代码逻辑说明: 【QQYUN-8773】配置外部网址在顶部菜单模式和搜索打不开\n      const path = to.path.replace(URL_HASH_TAB, '#');\n      window.open(path, '_blank');\n    } else {\n      go(to.path);\n    }\n  }\n\n  // close search modal\n  function handleClose() {\n    searchResult.value = [];\n    emit('close');\n  }\n\n  // enter search\n  onKeyStroke('Enter', handleEnter);\n  // Monitor keyboard arrow keys\n  onKeyStroke('ArrowUp', handleUp);\n  onKeyStroke('ArrowDown', handleDown);\n  // esc close\n  onKeyStroke('Escape', handleClose);\n\n  return { handleSearch, searchResult, keyword, activeIndex, handleMouseenter, handleEnter };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Application/src/useAppContext.ts",
    "content": "import { InjectionKey, Ref } from 'vue';\nimport { createContext, useContext } from '/@/hooks/core/useContext';\n\nexport interface AppProviderContextProps {\n  prefixCls: Ref<string>;\n  isMobile: Ref<boolean>;\n}\n\nconst key: InjectionKey<AppProviderContextProps> = Symbol();\n\nexport function createAppProviderContext(context: AppProviderContextProps) {\n  return createContext<AppProviderContextProps>(context, key);\n}\n\nexport function useAppProviderContext() {\n  return useContext<AppProviderContextProps>(key);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Authority/index.ts",
    "content": "import { withInstall } from '/@/utils';\nimport authority from './src/Authority.vue';\n\nexport const Authority = withInstall(authority);\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Authority/src/Authority.vue",
    "content": "<!--\n Access control component for fine-grained access control.\n-->\n<script lang=\"ts\">\n  import type { PropType } from 'vue';\n  import { defineComponent } from 'vue';\n  import { RoleEnum } from '/@/enums/roleEnum';\n  import { usePermission } from '/@/hooks/web/usePermission';\n  import { getSlot } from '/@/utils/helper/tsxHelper';\n\n  export default defineComponent({\n    name: 'Authority',\n    props: {\n      /**\n       * Specified role is visible\n       * When the permission mode is the role mode, the value value can pass the role value.\n       * When the permission mode is background, the value value can pass the code permission value\n       * @default ''\n       */\n      value: {\n        type: [Number, Array, String] as PropType<RoleEnum | RoleEnum[] | string | string[]>,\n        default: '',\n      },\n    },\n    setup(props, { slots }) {\n      const { hasPermission } = usePermission();\n\n      /**\n       * Render role button\n       */\n      function renderAuth() {\n        const { value } = props;\n        if (!value) {\n          return getSlot(slots);\n        }\n        return hasPermission(value) ? getSlot(slots) : null;\n      }\n\n      return () => {\n        // Role-based value control\n        return renderAuth();\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Basic/index.ts",
    "content": "import { withInstall } from '/@/utils';\nimport basicArrow from './src/BasicArrow.vue';\nimport basicTitle from './src/BasicTitle.vue';\nimport basicHelp from './src/BasicHelp.vue';\n\nexport const BasicArrow = withInstall(basicArrow);\nexport const BasicTitle = withInstall(basicTitle);\nexport const BasicHelp = withInstall(basicHelp);\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Basic/src/BasicArrow.vue",
    "content": "<!--\n * @Author: Vben\n * @Description: Arrow component with animation\n-->\n<template>\n  <span :class=\"getClass\">\n    <Icon icon=\"ion:chevron-forward\" :style=\"$attrs.iconStyle\" />\n  </span>\n</template>\n<script lang=\"ts\" setup>\n  import { computed } from 'vue';\n  import { Icon } from '/@/components/Icon';\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  const props = defineProps({\n    /**\n     * Arrow expand state\n     */\n    expand: { type: Boolean },\n    /**\n     * Arrow up by default\n     */\n    up: { type: Boolean },\n    /**\n     * Arrow down by default\n     */\n    down: { type: Boolean },\n    /**\n     * Cancel padding/margin for inline\n     */\n    inset: { type: Boolean },\n  });\n\n  const { prefixCls } = useDesign('basic-arrow');\n\n  // get component class\n  const getClass = computed(() => {\n    const { expand, up, down, inset } = props;\n    return [\n      prefixCls,\n      {\n        [`${prefixCls}--active`]: expand,\n        up,\n        inset,\n        down,\n      },\n    ];\n  });\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-basic-arrow';\n\n  .@{prefix-cls} {\n    display: inline-block;\n    cursor: pointer;\n    transform: rotate(0deg);\n    transition: all 0.3s ease 0.1s;\n    transform-origin: center center;\n\n    &--active {\n      transform: rotate(90deg);\n    }\n\n    &.inset {\n      line-height: 0px;\n    }\n\n    &.up {\n      transform: rotate(-90deg);\n    }\n\n    &.down {\n      transform: rotate(90deg);\n    }\n\n    &.up.@{prefix-cls}--active {\n      transform: rotate(90deg);\n    }\n\n    &.down.@{prefix-cls}--active {\n      transform: rotate(-90deg);\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Basic/src/BasicHelp.vue",
    "content": "<script lang=\"tsx\">\n  import type { CSSProperties, PropType } from 'vue';\n  import { defineComponent, computed, unref } from 'vue';\n  import { Tooltip } from 'ant-design-vue';\n  import { InfoCircleOutlined } from '@ant-design/icons-vue';\n  import { getPopupContainer } from '/@/utils';\n  import { isString, isArray } from '/@/utils/is';\n  import { getSlot } from '/@/utils/helper/tsxHelper';\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  const props = {\n    /**\n     * Help text max-width\n     * @default: 600px\n     */\n    maxWidth: { type: String, default: '600px' },\n    /**\n     * Whether to display the serial number\n     * @default: false\n     */\n    showIndex: { type: Boolean },\n    /**\n     * Help text font color\n     * @default: #ffffff\n     */\n    color: { type: String, default: '#ffffff' },\n    /**\n     * Help text font size\n     * @default: 14px\n     */\n    fontSize: { type: String, default: '14px' },\n    /**\n     * Help text list\n     */\n    placement: { type: String, default: 'right' },\n    /**\n     * Help text list\n     */\n    text: { type: [Array, String] as PropType<string[] | string> },\n  };\n\n  export default defineComponent({\n    name: 'BasicHelp',\n    components: { Tooltip },\n    props,\n    setup(props, { slots }) {\n      const { prefixCls } = useDesign('basic-help');\n\n      const getTooltipStyle = computed((): CSSProperties => ({ color: props.color, fontSize: props.fontSize }));\n\n      const getOverlayStyle = computed((): CSSProperties => ({ maxWidth: props.maxWidth }));\n\n      function renderTitle() {\n        const textList = props.text;\n\n        if (isString(textList)) {\n          return <p>{textList}</p>;\n        }\n\n        if (isArray(textList)) {\n          return textList.map((text, index) => {\n            return (\n              <p key={text}>\n                <>\n                  {props.showIndex ? `${index + 1}. ` : ''}\n                  {text}\n                </>\n              </p>\n            );\n          });\n        }\n        return null;\n      }\n\n      return () => {\n        return (\n          <Tooltip\n            overlayClassName={`${prefixCls}__wrap`}\n            title={<div style={unref(getTooltipStyle)}>{renderTitle()}</div>}\n            autoAdjustOverflow={true}\n            overlayStyle={unref(getOverlayStyle)}\n            placement={props.placement as 'right'}\n            getPopupContainer={() => getPopupContainer()}\n          >\n            <span class={prefixCls}>{getSlot(slots) || <InfoCircleOutlined />}</span>\n          </Tooltip>\n        );\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-basic-help';\n\n  .@{prefix-cls} {\n    display: inline-block;\n    margin-left: 6px;\n    font-size: 14px;\n    color: @text-color-help-dark;\n    cursor: pointer;\n\n    &:hover {\n      color: @primary-color;\n    }\n\n    &__wrap {\n      p {\n        margin-bottom: 0;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Basic/src/BasicTitle.vue",
    "content": "<template>\n  <span :class=\"getClass\">\n    <slot></slot>\n    <BasicHelp :class=\"`${prefixCls}-help`\" v-if=\"helpMessage\" :text=\"helpMessage\" />\n  </span>\n</template>\n<script lang=\"ts\" setup>\n  import type { PropType } from 'vue';\n  import { useSlots, computed } from 'vue';\n  import BasicHelp from './BasicHelp.vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  const props = defineProps({\n    /**\n     * Help text list or string\n     * @default: ''\n     */\n    helpMessage: {\n      type: [String, Array] as PropType<string | string[]>,\n      default: '',\n    },\n    /**\n     * Whether the color block on the left side of the title\n     * @default: false\n     */\n    span: { type: Boolean },\n    /**\n     * Whether to default the text, that is, not bold\n     * @default: false\n     */\n    normal: { type: Boolean },\n  });\n\n  const { prefixCls } = useDesign('basic-title');\n  const slots = useSlots();\n  const getClass = computed(() => [\n    prefixCls,\n    { [`${prefixCls}-show-span`]: props.span && slots.default },\n    { [`${prefixCls}-normal`]: props.normal },\n  ]);\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-basic-title';\n\n  .@{prefix-cls} {\n    position: relative;\n    display: flex;\n    padding-left: 7px;\n    font-size: 16px;\n    font-weight: 500;\n    line-height: 24px;\n    color: @text-color-base;\n    cursor: move;\n    user-select: none;\n\n    &.is-drawer {\n      cursor: default;\n    }\n\n    &-normal {\n      font-size: 14px;\n      font-weight: 500;\n    }\n\n    &-show-span::before {\n      position: absolute;\n      top: 4px;\n      left: 0;\n      width: 3px;\n      height: 16px;\n      margin-right: 4px;\n      background-color: @primary-color;\n      content: '';\n    }\n\n    &-help {\n      margin-left: 10px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Button/index.ts",
    "content": "import { withInstall } from '/@/utils';\nimport type { ExtractPropTypes } from 'vue';\nimport button from './src/BasicButton.vue';\nimport jUploadButton from './src/JUploadButton.vue';\nimport popConfirmButton from './src/PopConfirmButton.vue';\nimport { buttonProps } from './src/props';\n\nexport const Button = withInstall(button);\nexport const JUploadButton = withInstall(jUploadButton);\nexport const PopConfirmButton = withInstall(popConfirmButton);\nexport declare type ButtonProps = Partial<ExtractPropTypes<typeof buttonProps>>;\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Button/src/BasicButton.vue",
    "content": "<template>\n  <Button v-bind=\"getBindValue\" :class=\"getButtonClass\" @click=\"onClick\">\n    <template v-if=\"preIcon\" #icon>\n      <Icon :icon=\"preIcon\" :size=\"iconSize\" />\n    </template>\n    <template #default=\"data\">\n      <slot v-bind=\"data || {}\"></slot>\n      <Icon :icon=\"postIcon\" v-if=\"postIcon\" :size=\"iconSize\" />\n    </template>\n  </Button>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  export default defineComponent({\n    name: 'AButton',\n    inheritAttrs: false,\n  });\n</script>\n<script lang=\"ts\" setup>\n  import { computed, unref } from 'vue';\n  import { Button } from 'ant-design-vue';\n  import Icon from '/@/components/Icon/src/Icon.vue';\n  import { buttonProps } from './props';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  const props = defineProps(buttonProps);\n  // get component class\n  const attrs = useAttrs({ excludeDefaultKeys: false });\n  const getButtonClass = computed(() => {\n    const { color, disabled } = props;\n    return [\n      {\n        [`ant-btn-${color}`]: !!color,\n        [`is-disabled`]: disabled,\n      },\n    ];\n  });\n\n  // get inherit binding value\n  const getBindValue = computed(() => ({ ...unref(attrs), ...props }));\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Button/src/JUploadButton.vue",
    "content": "<template>\n  <a-upload name=\"file\" :showUploadList=\"false\" :customRequest=\"(file) => onClick(file)\">\n    <Button :type=\"type\" :class=\"getButtonClass\" :disabled=\"props.disabled\">\n      <template #default=\"data\">\n        <Icon :icon=\"preIcon\" v-if=\"preIcon\" :size=\"iconSize\" />\n        <slot v-bind=\"data || {}\"></slot>\n        <Icon :icon=\"postIcon\" v-if=\"postIcon\" :size=\"iconSize\" />\n      </template>\n    </Button>\n  </a-upload>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  export default defineComponent({\n    name: 'JUploadButton',\n    inheritAttrs: false,\n  });\n</script>\n<script lang=\"ts\" setup>\n  import { computed, unref } from 'vue';\n  import { Button } from 'ant-design-vue';\n  import Icon from '/@/components/Icon/src/Icon.vue';\n  import { buttonProps } from './props';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  const props = defineProps(buttonProps);\n  // get component class\n  const attrs = useAttrs({ excludeDefaultKeys: false });\n  const getButtonClass = computed(() => {\n    const { color, disabled } = props;\n    return [\n      {\n        [`ant-btn-${color}`]: !!color,\n        [`is-disabled`]: disabled,\n      },\n    ];\n  });\n\n  // get inherit binding value\n  const getBindValue = computed(() => ({ ...unref(attrs), ...props }));\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Button/src/PopConfirmButton.vue",
    "content": "<script lang=\"ts\">\n  import { computed, defineComponent, h, unref } from 'vue';\n  import BasicButton from './BasicButton.vue';\n  import { Popconfirm } from 'ant-design-vue';\n  import { extendSlots } from '/@/utils/helper/tsxHelper';\n  import { omit } from 'lodash-es';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { propTypes } from '/@/utils/propTypes';\n\n  const props = {\n    class: propTypes.any,\n    /**\n     * Whether to enable the drop-down menu\n     * @default: true\n     */\n    enable: {\n      type: Boolean,\n      default: true,\n    },\n  };\n\n  export default defineComponent({\n    name: 'PopButton',\n    inheritAttrs: false,\n    props,\n    setup(props, { slots }) {\n      const { t } = useI18n();\n      const attrs = useAttrs();\n\n      // get inherit binding value\n      const getBindValues = computed(() => {\n        return Object.assign(\n          {\n            okText: t('common.okText'),\n            cancelText: t('common.cancelText'),\n          },\n          { ...props, ...unref(attrs) }\n        );\n      });\n\n      return () => {\n        const bindValues = omit(unref(getBindValues), 'icon');\n        const btnBind = omit(bindValues, 'title') as Recordable;\n        if (btnBind.disabled) btnBind.color = '';\n        const Button = h(BasicButton, btnBind, extendSlots(slots));\n\n        // If it is not enabled, it is a normal button\n        if (!props.enable) {\n          return Button;\n        }\n        return h(Popconfirm, bindValues, { default: () => Button });\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Button/src/props.ts",
    "content": "export const buttonProps = {\n  color: { type: String, validator: (v) => ['error', 'warning', 'success', ''].includes(v) },\n  loading: { type: Boolean },\n  disabled: { type: Boolean },\n  /**\n   * Text before icon.\n   */\n  preIcon: { type: String },\n  /**\n   * Text after icon.\n   */\n  postIcon: { type: String },\n  type: { type: String },\n  /**\n   * preIcon and postIcon icon size.\n   * @default: 15\n   */\n  iconSize: { type: Number, default: 15 },\n  isUpload: { type: Boolean, default: false },\n  onClick: { type: Function as PropType<(...args) => any>, default: null },\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/CardList/index.ts",
    "content": "import { withInstall } from '/@/utils';\nimport cardList from './src/CardList.vue';\n\nexport const CardList = withInstall(cardList);\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/CardList/src/CardList.vue",
    "content": "<template>\n  <div class=\"p-2\">\n    <div class=\"bg-white mb-2 p-4\">\n      <BasicForm @register=\"registerForm\" />\n    </div>\n    {{ sliderProp.width }}\n    <div class=\"bg-white p-2\">\n      <List :grid=\"{ gutter: 5, xs: 1, sm: 2, md: 4, lg: 4, xl: 6, xxl: grid }\" :data-source=\"data\" :pagination=\"paginationProp\">\n        <template #header>\n          <div class=\"flex justify-end space-x-2\"\n            ><slot name=\"header\"></slot>\n            <Tooltip>\n              <template #title>\n                <div class=\"w-50\">每行显示数量</div><Slider id=\"slider\" v-bind=\"sliderProp\" v-model:value=\"grid\" @change=\"sliderChange\"\n              /></template>\n              <Button><TableOutlined /></Button>\n            </Tooltip>\n            <Tooltip @click=\"fetch\">\n              <template #title>刷新</template>\n              <Button><RedoOutlined /></Button>\n            </Tooltip>\n          </div>\n        </template>\n        <template #renderItem=\"{ item }\">\n          <ListItem>\n            <Card>\n              <template #title></template>\n              <template #cover>\n                <div :class=\"height\">\n                  <Image :src=\"item.imgs[0]\" />\n                </div>\n              </template>\n              <template class=\"ant-card-actions\" #actions>\n                <!--              <SettingOutlined key=\"setting\" />-->\n                <EditOutlined key=\"edit\" />\n                <Dropdown\n                  :trigger=\"['hover']\"\n                  :dropMenuList=\"[\n                    {\n                      text: '删除',\n                      event: '1',\n                      popConfirm: {\n                        title: '是否确认删除',\n                        confirm: handleDelete.bind(null, item.id),\n                      },\n                    },\n                  ]\"\n                  popconfirm\n                >\n                  <EllipsisOutlined key=\"ellipsis\" />\n                </Dropdown>\n              </template>\n\n              <CardMeta>\n                <template #title>\n                  <TypographyText :content=\"item.name\" :ellipsis=\"{ tooltip: item.address }\" />\n                </template>\n                <template #avatar>\n                  <Avatar :src=\"item.avatar\" />\n                </template>\n                <template #description>{{ item.time }}</template>\n              </CardMeta>\n            </Card>\n          </ListItem>\n        </template>\n      </List>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { computed, onMounted, ref } from 'vue';\n  import { EditOutlined, EllipsisOutlined, RedoOutlined, TableOutlined } from '@ant-design/icons-vue';\n  import { List, Card, Image, Typography, Tooltip, Slider, Avatar } from 'ant-design-vue';\n  import { Dropdown } from '/@/components/Dropdown';\n  import { BasicForm, useForm } from '/@/components/Form';\n  import { propTypes } from '/@/utils/propTypes';\n  import { Button } from '/@/components/Button';\n  import { isFunction } from '/@/utils/is';\n  import { useSlider, grid } from './data';\n  const ListItem = List.Item;\n  const CardMeta = Card.Meta;\n  const TypographyText = Typography.Text;\n  // 获取slider属性\n  const sliderProp = computed(() => useSlider(4));\n  // 组件接收参数\n  const props = defineProps({\n    // 请求API的参数\n    params: propTypes.object.def({}),\n    //api\n    api: propTypes.func,\n  });\n  //暴露内部方法\n  const emit = defineEmits(['getMethod', 'delete']);\n  //数据\n  const data = ref([]);\n  // 切换每行个数\n  // cover图片自适应高度\n  //修改pageSize并重新请求数据\n\n  const height = computed(() => {\n    return `h-${120 - grid.value * 6}`;\n  });\n  //表单\n  const [registerForm, { validate }] = useForm({\n    schemas: [{ field: 'type', component: 'Input', label: '类型' }],\n    labelWidth: 80,\n    baseColProps: { span: 6 },\n    actionColOptions: { span: 24 },\n    autoSubmitOnEnter: true,\n    submitFunc: handleSubmit,\n  });\n  //表单提交\n  async function handleSubmit() {\n    const data = await validate();\n    await fetch(data);\n  }\n  function sliderChange(n) {\n    pageSize.value = n * 4;\n    fetch();\n  }\n\n  // 自动请求并暴露内部方法\n  onMounted(() => {\n    fetch();\n    emit('getMethod', fetch);\n  });\n\n  async function fetch(p = {}) {\n    const { api, params } = props;\n    if (api && isFunction(api)) {\n      const res = await api({ ...params, page: page.value, pageSize: pageSize.value, ...p });\n      data.value = res.items;\n      total.value = res.total;\n    }\n  }\n  //分页相关\n  const page = ref(1);\n  const pageSize = ref(36);\n  const total = ref(0);\n  const paginationProp = ref({\n    showSizeChanger: false,\n    showQuickJumper: true,\n    pageSize,\n    current: page,\n    total,\n    showTotal: (total) => `总 ${total} 条`,\n    onChange: pageChange,\n    onShowSizeChange: pageSizeChange,\n  });\n\n  function pageChange(p, pz) {\n    page.value = p;\n    pageSize.value = pz;\n    fetch();\n  }\n  function pageSizeChange(current, size) {\n    pageSize.value = size;\n    fetch();\n  }\n\n  async function handleDelete(id) {\n    emit('delete', id);\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/CardList/src/data.ts",
    "content": "import { ref } from 'vue';\n//每行个数\nexport const grid = ref(12);\n// slider属性\nexport const useSlider = (min = 6, max = 12) => {\n  // 每行显示个数滑动条\n  const getMarks = () => {\n    const l = {};\n    for (let i = min; i < max + 1; i++) {\n      l[i] = {\n        style: {\n          color: '#fff',\n        },\n        label: i,\n      };\n    }\n    return l;\n  };\n  return {\n    min,\n    max,\n    marks: getMarks(),\n    step: 1,\n  };\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/ClickOutSide/index.ts",
    "content": "import { withInstall } from '/@/utils';\nimport clickOutSide from './src/ClickOutSide.vue';\n\nexport const ClickOutSide = withInstall(clickOutSide);\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/ClickOutSide/src/ClickOutSide.vue",
    "content": "<template>\n  <div ref=\"wrap\">\n    <slot></slot>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, onMounted } from 'vue';\n  import { onClickOutside } from '@vueuse/core';\n  const emit = defineEmits(['mounted', 'clickOutside']);\n  const wrap = ref<ElRef>(null);\n\n  onClickOutside(wrap, () => {\n    emit('clickOutside');\n  });\n\n  onMounted(() => {\n    emit('mounted');\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/CodeEditor/index.ts",
    "content": "import { withInstall } from '/@/utils';\nimport codeEditor from './src/CodeEditor.vue';\n\nexport const CodeEditor = withInstall(codeEditor);\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/CodeEditor/src/CodeEditor.vue",
    "content": "<template>\n  <div class=\"h-full\">\n    <CodeMirrorEditor :value=\"getValue\" @change=\"handleValueChange\" :mode=\"mode\" :readonly=\"readonly\" />\n  </div>\n</template>\n\n<script lang=\"ts\">\n  const MODE = {\n    JSON: 'application/json',\n    html: 'htmlmixed',\n    js: 'javascript',\n  };\n</script>\n<script lang=\"ts\" setup>\n  import { computed } from 'vue';\n  import CodeMirrorEditor from './codemirror/CodeMirror.vue';\n  import { isString } from '/@/utils/is';\n  \n  const props = defineProps({\n    value: { type: [Object, String] as PropType<Record<string, any> | string> },\n    mode: { type: String, default: MODE.JSON },\n    readonly: { type: Boolean },\n    autoFormat: { type: Boolean, default: true },\n  });\n\n  const emit = defineEmits(['change', 'update:value', 'format-error']);\n\n  const getValue = computed(() => {\n    const { value, mode, autoFormat } = props;\n    if (!autoFormat || mode !== MODE.JSON) {\n      return value as string;\n    }\n    let result = value;\n    if (isString(value)) {\n      try {\n        result = JSON.parse(value);\n      } catch (e) {\n        emit('format-error', value);\n        return value as string;\n      }\n    }\n    return JSON.stringify(result, null, 2);\n  });\n\n  function handleValueChange(v) {\n    emit('update:value', v);\n    emit('change', v);\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/CodeEditor/src/codemirror/CodeMirror.vue",
    "content": "<template>\n  <div class=\"relative !h-full w-full overflow-hidden\" ref=\"el\"> </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, onMounted, onUnmounted, watchEffect, watch, unref, nextTick } from 'vue';\n  import { useDebounceFn } from '@vueuse/core';\n  import { useAppStore } from '/@/store/modules/app';\n  import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn';\n  import CodeMirror from 'codemirror';\n  // css\n  import './codemirror.css';\n  import 'codemirror/theme/idea.css';\n  import 'codemirror/theme/material-palenight.css';\n  // modes\n  import 'codemirror/mode/javascript/javascript';\n  import 'codemirror/mode/css/css';\n  import 'codemirror/mode/htmlmixed/htmlmixed';\n\n  const props = defineProps({\n    mode: { type: String, default: 'application/json' },\n    value: { type: String, default: '' },\n    readonly: { type: Boolean, default: false },\n  });\n\n  const emit = defineEmits(['change']);\n\n  const el = ref();\n  let editor: Nullable<CodeMirror.Editor>;\n\n  const debounceRefresh = useDebounceFn(refresh, 100);\n  const appStore = useAppStore();\n\n  watch(\n    () => props.value,\n    async (value) => {\n      await nextTick();\n      const oldValue = editor?.getValue();\n      if (value !== oldValue) {\n        editor?.setValue(value ? value : '');\n      }\n    },\n    { flush: 'post' }\n  );\n\n  watchEffect(() => {\n    editor?.setOption('mode', props.mode);\n  });\n\n  watch(\n    () => appStore.getDarkMode,\n    async () => {\n      setTheme();\n    },\n    {\n      immediate: true,\n    }\n  );\n\n  function setTheme() {\n    unref(editor)?.setOption('theme', appStore.getDarkMode === 'light' ? 'idea' : 'material-palenight');\n  }\n\n  function refresh() {\n    editor?.refresh();\n  }\n\n  async function init() {\n    const addonOptions = {\n      autoCloseBrackets: true,\n      autoCloseTags: true,\n      foldGutter: true,\n      gutters: ['CodeMirror-linenumbers'],\n    };\n\n    editor = CodeMirror(el.value!, {\n      value: '',\n      mode: props.mode,\n      readOnly: props.readonly,\n      tabSize: 2,\n      theme: 'material-palenight',\n      lineWrapping: true,\n      lineNumbers: true,\n      ...addonOptions,\n    });\n    editor?.setValue(props.value);\n    setTheme();\n    editor?.on('change', () => {\n      emit('change', editor?.getValue());\n    });\n  }\n\n  onMounted(async () => {\n    await nextTick();\n    init();\n    useWindowSizeFn(debounceRefresh);\n  });\n\n  onUnmounted(() => {\n    editor = null;\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/CodeEditor/src/codemirror/codeMirror.ts",
    "content": "import CodeMirror from 'codemirror';\nimport './codemirror.css';\nimport 'codemirror/theme/idea.css';\nimport 'codemirror/theme/material-palenight.css';\n// import 'codemirror/addon/lint/lint.css';\n\n// modes\nimport 'codemirror/mode/javascript/javascript';\nimport 'codemirror/mode/css/css';\nimport 'codemirror/mode/htmlmixed/htmlmixed';\n// addons\n// import 'codemirror/addon/edit/closebrackets';\n// import 'codemirror/addon/edit/closetag';\n// import 'codemirror/addon/comment/comment';\n// import 'codemirror/addon/fold/foldcode';\n// import 'codemirror/addon/fold/foldgutter';\n// import 'codemirror/addon/fold/brace-fold';\n// import 'codemirror/addon/fold/indent-fold';\n// import 'codemirror/addon/lint/json-lint';\n// import 'codemirror/addon/fold/comment-fold';\nexport { CodeMirror };\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/CodeEditor/src/codemirror/codemirror.css",
    "content": "/* BASICS */\n\n.CodeMirror {\n  --base: #545281;\n  --comment: hsl(210, 25%, 60%);\n  --keyword: #af4ab1;\n  --variable: #0055d1;\n  --function: #c25205;\n  --string: #2ba46d;\n  --number: #c25205;\n  --tags: #d00;\n  --qualifier: #ff6032;\n  --important: var(--string);\n\n  position: relative;\n  height: auto;\n  height: 100%;\n  overflow: hidden;\n  font-family: var(--font-code);\n  background: white;\n  direction: ltr;\n}\n\n/* PADDING */\n\n.CodeMirror-lines {\n  min-height: 1px; /* prevents collapsing before first draw */\n  padding: 4px 0; /* Vertical padding around content */\n  cursor: text;\n}\n\n.CodeMirror-scrollbar-filler,\n.CodeMirror-gutter-filler {\n  background-color: white; /* The little square between H and V scrollbars */\n}\n\n/* GUTTER */\n\n.CodeMirror-gutters {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 3;\n  min-height: 100%;\n  white-space: nowrap;\n  background-color: transparent;\n  border-right: 1px solid #ddd;\n}\n\n.CodeMirror-linenumber {\n  min-width: 20px;\n  padding: 0 3px 0 5px;\n  color: var(--comment);\n  text-align: right;\n  white-space: nowrap;\n  opacity: 0.6;\n}\n\n.CodeMirror-guttermarker {\n  color: black;\n}\n\n.CodeMirror-guttermarker-subtle {\n  color: #999;\n}\n\n/* FOLD GUTTER */\n\n.CodeMirror-foldmarker {\n  font-family: arial;\n  line-height: 0.3;\n  color: #414141;\n  text-shadow: #f96 1px 1px 2px, #f96 -1px -1px 2px, #f96 1px -1px 2px, #f96 -1px 1px 2px;\n  cursor: pointer;\n}\n\n.CodeMirror-foldgutter {\n  width: 0.7em;\n}\n\n.CodeMirror-foldgutter-open,\n.CodeMirror-foldgutter-folded {\n  cursor: pointer;\n}\n\n.CodeMirror-foldgutter-open::after,\n.CodeMirror-foldgutter-folded::after {\n  position: relative;\n  top: -0.1em;\n  display: inline-block;\n  font-size: 0.8em;\n  content: '>';\n  opacity: 0.8;\n  transform: rotate(90deg);\n  transition: transform 0.2s;\n}\n\n.CodeMirror-foldgutter-folded::after {\n  transform: none;\n}\n\n/* CURSOR */\n\n.CodeMirror-cursor {\n  position: absolute;\n  width: 0;\n  pointer-events: none;\n  border-right: none;\n  border-left: 1px solid black;\n}\n\n/* Shown when moving in bi-directional text */\n.CodeMirror div.CodeMirror-secondarycursor {\n  border-left: 1px solid silver;\n}\n\n.cm-fat-cursor .CodeMirror-cursor {\n  width: auto;\n  background: #7e7;\n  border: 0 !important;\n}\n\n.cm-fat-cursor div.CodeMirror-cursors {\n  z-index: 1;\n}\n\n.cm-fat-cursor-mark {\n  background-color: rgba(20, 255, 20, 0.5);\n  -webkit-animation: blink 1.06s steps(1) infinite;\n  -moz-animation: blink 1.06s steps(1) infinite;\n  animation: blink 1.06s steps(1) infinite;\n}\n\n.cm-animate-fat-cursor {\n  width: auto;\n  background-color: #7e7;\n  border: 0;\n  -webkit-animation: blink 1.06s steps(1) infinite;\n  -moz-animation: blink 1.06s steps(1) infinite;\n  animation: blink 1.06s steps(1) infinite;\n}\n@-moz-keyframes blink {\n  50% {\n    background-color: transparent;\n  }\n}\n@-webkit-keyframes blink {\n  50% {\n    background-color: transparent;\n  }\n}\n@keyframes blink {\n  50% {\n    background-color: transparent;\n  }\n}\n\n.cm-tab {\n  display: inline-block;\n  text-decoration: inherit;\n}\n\n.CodeMirror-rulers {\n  position: absolute;\n  top: -50px;\n  right: 0;\n  bottom: -20px;\n  left: 0;\n  overflow: hidden;\n}\n\n.CodeMirror-ruler {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  border-left: 1px solid #ccc;\n}\n\n/* DEFAULT THEME */\n.cm-s-default.CodeMirror {\n  background-color: transparent;\n}\n\n.cm-s-default .cm-header {\n  color: blue;\n}\n\n.cm-s-default .cm-quote {\n  color: #090;\n}\n\n.cm-negative {\n  color: #d44;\n}\n\n.cm-positive {\n  color: #292;\n}\n\n.cm-header,\n.cm-strong {\n  font-weight: bold;\n}\n\n.cm-em {\n  font-style: italic;\n}\n\n.cm-link {\n  text-decoration: underline;\n}\n\n.cm-strikethrough {\n  text-decoration: line-through;\n}\n\n.cm-s-default .cm-atom,\n.cm-s-default .cm-def,\n.cm-s-default .cm-property,\n.cm-s-default .cm-variable-2,\n.cm-s-default .cm-variable-3,\n.cm-s-default .cm-punctuation {\n  color: var(--base);\n}\n\n.cm-s-default .cm-hr,\n.cm-s-default .cm-comment {\n  color: var(--comment);\n}\n\n.cm-s-default .cm-attribute,\n.cm-s-default .cm-keyword {\n  color: var(--keyword);\n}\n\n.cm-s-default .cm-variable {\n  color: var(--variable);\n}\n\n.cm-s-default .cm-bracket,\n.cm-s-default .cm-tag {\n  color: var(--tags);\n}\n\n.cm-s-default .cm-number {\n  color: var(--number);\n}\n\n.cm-s-default .cm-string,\n.cm-s-default .cm-string-2 {\n  color: var(--string);\n}\n\n.cm-s-default .cm-type {\n  color: #085;\n}\n\n.cm-s-default .cm-meta {\n  color: #555;\n}\n\n.cm-s-default .cm-qualifier {\n  color: var(--qualifier);\n}\n\n.cm-s-default .cm-builtin {\n  color: #7539ff;\n}\n\n.cm-s-default .cm-link {\n  color: var(--flash);\n}\n\n.cm-s-default .cm-error {\n  color: #ff008c;\n}\n\n.cm-invalidchar {\n  color: #ff008c;\n}\n\n.CodeMirror-composing {\n  border-bottom: 2px solid;\n}\n\n/* Default styles for common addons */\n\ndiv.CodeMirror span.CodeMirror-matchingbracket {\n  color: #0b0;\n}\n\ndiv.CodeMirror span.CodeMirror-nonmatchingbracket {\n  color: #a22;\n}\n\n.CodeMirror-matchingtag {\n  background: rgba(255, 150, 0, 0.3);\n}\n\n.CodeMirror-activeline-background {\n  background: #e8f2ff;\n}\n\n/* STOP */\n\n/* The rest of this file contains styles related to the mechanics of\n   the editor. You probably shouldn't touch them. */\n\n.CodeMirror-scroll {\n  position: relative;\n  height: 100%;\n  padding-bottom: 30px;\n  margin-right: -30px;\n\n  /* 30px is the magic margin used to hide the element's real scrollbars */\n\n  /* See overflow: hidden in .CodeMirror */\n  margin-bottom: -30px;\n  overflow: scroll !important; /* Things will break if this is overridden */\n  outline: none; /* Prevent dragging from highlighting the element */\n}\n\n.CodeMirror-sizer {\n  position: relative;\n  margin-bottom: 20px !important;\n  border-right: 30px solid transparent;\n}\n\n/* The fake, visible scrollbars. Used to force redraw during scrolling\n   before actual scrolling happens, thus preventing shaking and\n   flickering artifacts. */\n.CodeMirror-vscrollbar,\n.CodeMirror-hscrollbar,\n.CodeMirror-scrollbar-filler,\n.CodeMirror-gutter-filler {\n  position: absolute;\n  z-index: 6;\n  display: none;\n}\n\n.CodeMirror-vscrollbar {\n  top: 0;\n  right: 0;\n  overflow-x: hidden;\n  overflow-y: scroll;\n}\n\n.CodeMirror-hscrollbar {\n  bottom: 0;\n  left: 0;\n  overflow-x: scroll;\n  overflow-y: hidden;\n}\n\n.CodeMirror-scrollbar-filler {\n  right: 0;\n  bottom: 0;\n}\n\n.CodeMirror-gutter-filler {\n  bottom: 0;\n  left: 0;\n}\n\n.CodeMirror-gutter {\n  display: inline-block;\n  height: 100%;\n  margin-bottom: -30px;\n  white-space: normal;\n  vertical-align: top;\n}\n\n.CodeMirror-gutter-wrapper {\n  position: absolute;\n  z-index: 4;\n  background: none !important;\n  border: none !important;\n}\n\n.CodeMirror-gutter-background {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  z-index: 4;\n}\n\n.CodeMirror-gutter-elt {\n  position: absolute;\n  z-index: 4;\n  cursor: default;\n}\n\n.CodeMirror-gutter-wrapper ::selection {\n  background-color: transparent;\n}\n\n.CodeMirror-gutter-wrapper ::-moz-selection {\n  background-color: transparent;\n}\n\n.CodeMirror pre {\n  position: relative;\n  z-index: 2;\n  padding: 0 4px; /* Horizontal padding of content */\n  margin: 0;\n  overflow: visible;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n  color: inherit;\n  word-wrap: normal;\n  white-space: pre;\n  background: transparent;\n  border-width: 0;\n\n  /* Reset some styles that the rest of the page might have set */\n  -moz-border-radius: 0;\n  -webkit-border-radius: 0;\n  border-radius: 0;\n  -webkit-tap-highlight-color: transparent;\n  -webkit-font-variant-ligatures: contextual;\n  font-variant-ligatures: contextual;\n}\n\n.CodeMirror-wrap pre {\n  word-break: normal;\n  word-wrap: break-word;\n  white-space: pre-wrap;\n}\n\n.CodeMirror-linebackground {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 0;\n}\n\n.CodeMirror-linewidget {\n  position: relative;\n  z-index: 2;\n  padding: 0.1px; /* Force widget margins to stay inside of the container */\n}\n\n.CodeMirror-rtl pre {\n  direction: rtl;\n}\n\n.CodeMirror-code {\n  outline: none;\n}\n\n/* Force content-box sizing for the elements where we expect it */\n.CodeMirror-scroll,\n.CodeMirror-sizer,\n.CodeMirror-gutter,\n.CodeMirror-gutters,\n.CodeMirror-linenumber {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n}\n\n.CodeMirror-measure {\n  position: absolute;\n  width: 100%;\n  height: 0;\n  overflow: hidden;\n  visibility: hidden;\n}\n\n.CodeMirror-measure pre {\n  position: static;\n}\n\ndiv.CodeMirror-cursors {\n  position: relative;\n  z-index: 3;\n  visibility: hidden;\n}\n\ndiv.CodeMirror-dragcursors {\n  visibility: visible;\n}\n\n.CodeMirror-focused div.CodeMirror-cursors {\n  visibility: visible;\n}\n\n.CodeMirror-selected {\n  background: #d9d9d9;\n}\n\n.CodeMirror-focused .CodeMirror-selected {\n  background: #d7d4f0;\n}\n\n.CodeMirror-crosshair {\n  cursor: crosshair;\n}\n\n.CodeMirror-line::selection,\n.CodeMirror-line > span::selection,\n.CodeMirror-line > span > span::selection {\n  background: #d7d4f0;\n}\n\n.CodeMirror-line::-moz-selection,\n.CodeMirror-line > span::-moz-selection,\n.CodeMirror-line > span > span::-moz-selection {\n  background: #d7d4f0;\n}\n\n.cm-searching {\n  background-color: #ffa;\n  background-color: rgba(255, 255, 0, 0.4);\n}\n\n/* Used to force a border model for a node */\n.cm-force-border {\n  padding-right: 0.1px;\n}\n\n@media print {\n  /* Hide the cursor when printing */\n  .CodeMirror div.CodeMirror-cursors {\n    visibility: hidden;\n  }\n}\n\n/* See issue #2901 */\n.cm-tab-wrap-hack::after {\n  content: '';\n}\n\n/* Help users use markselection to safely style text background */\nspan.CodeMirror-selectedtext {\n  background: none;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/CodeEditor/src/typing.ts",
    "content": "export enum MODE {\n  JSON = 'application/json',\n  HTML = 'htmlmixed',\n  JS = 'javascript',\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Container/index.ts",
    "content": "import { withInstall } from '/@/utils';\nimport collapseContainer from './src/collapse/CollapseContainer.vue';\nimport scrollContainer from './src/ScrollContainer.vue';\nimport lazyContainer from './src/LazyContainer.vue';\n\nexport const CollapseContainer = withInstall(collapseContainer);\nexport const ScrollContainer = withInstall(scrollContainer);\nexport const LazyContainer = withInstall(lazyContainer);\n\nexport * from './src/typing';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Container/src/LazyContainer.vue",
    "content": "<template>\n  <transition-group class=\"h-full w-full\" v-bind=\"$attrs\" ref=\"elRef\" :name=\"transitionName\" :tag=\"tag\" mode=\"out-in\">\n    <div key=\"component\" v-if=\"isInit\">\n      <slot :loading=\"loading\"></slot>\n    </div>\n    <div key=\"skeleton\" v-else>\n      <slot name=\"skeleton\" v-if=\"$slots.skeleton\"></slot>\n      <Skeleton v-else />\n    </div>\n  </transition-group>\n</template>\n<script lang=\"ts\">\n  import type { PropType } from 'vue';\n  import { defineComponent, reactive, onMounted, ref, toRef, toRefs } from 'vue';\n  import { Skeleton } from 'ant-design-vue';\n  import { useTimeoutFn } from '/@/hooks/core/useTimeout';\n  import { useIntersectionObserver } from '/@/hooks/event/useIntersectionObserver';\n\n  interface State {\n    isInit: boolean;\n    loading: boolean;\n    intersectionObserverInstance: IntersectionObserver | null;\n  }\n\n  const props = {\n    /**\n     * Waiting time, if the time is specified, whether visible or not, it will be automatically loaded after the specified time\n     */\n    timeout: { type: Number },\n    /**\n     * The viewport where the component is located.\n     * If the component is scrolling in the page container, the viewport is the container\n     */\n    viewport: {\n      type: (typeof window !== 'undefined' ? window.HTMLElement : Object) as PropType<HTMLElement>,\n      default: () => null,\n    },\n    /**\n     * Preload threshold, css unit\n     */\n    threshold: { type: String, default: '0px' },\n    /**\n     * The scroll direction of the viewport, vertical represents the vertical direction, horizontal represents the horizontal direction\n     */\n    direction: {\n      type: String,\n      default: 'vertical',\n      validator: (v) => ['vertical', 'horizontal'].includes(v),\n    },\n    /**\n     * The label name of the outer container that wraps the component\n     */\n    tag: { type: String, default: 'div' },\n    maxWaitingTime: { type: Number, default: 80 },\n    /**\n     * transition name\n     */\n    transitionName: { type: String, default: 'lazy-container' },\n  };\n\n  export default defineComponent({\n    name: 'LazyContainer',\n    components: { Skeleton },\n    inheritAttrs: false,\n    props,\n    emits: ['init'],\n    setup(props, { emit }) {\n      const elRef = ref();\n      const state = reactive<State>({\n        isInit: false,\n        loading: false,\n        intersectionObserverInstance: null,\n      });\n\n      onMounted(() => {\n        immediateInit();\n        initIntersectionObserver();\n      });\n\n      // If there is a set delay time, it will be executed immediately\n      function immediateInit() {\n        const { timeout } = props;\n        timeout &&\n          useTimeoutFn(() => {\n            init();\n          }, timeout);\n      }\n\n      function init() {\n        state.loading = true;\n\n        useTimeoutFn(() => {\n          if (state.isInit) return;\n          state.isInit = true;\n          emit('init');\n        }, props.maxWaitingTime || 80);\n      }\n\n      function initIntersectionObserver() {\n        const { timeout, direction, threshold } = props;\n        if (timeout) return;\n        // According to the scrolling direction to construct the viewport margin, used to load in advance\n        let rootMargin = '0px';\n        switch (direction) {\n          case 'vertical':\n            rootMargin = `${threshold} 0px`;\n            break;\n          case 'horizontal':\n            rootMargin = `0px ${threshold}`;\n            break;\n        }\n\n        try {\n          const { stop, observer } = useIntersectionObserver({\n            rootMargin,\n            target: toRef(elRef.value, '$el'),\n            onIntersect: (entries: any[]) => {\n              const isIntersecting = entries[0].isIntersecting || entries[0].intersectionRatio;\n              if (isIntersecting) {\n                init();\n                if (observer) {\n                  stop();\n                }\n              }\n            },\n            root: toRef(props, 'viewport'),\n          });\n        } catch (e) {\n          init();\n        }\n      }\n      return {\n        elRef,\n        ...toRefs(state),\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Container/src/ScrollContainer.vue",
    "content": "<template>\n  <Scrollbar ref=\"scrollbarRef\" class=\"scroll-container\" v-bind=\"$attrs\">\n    <slot></slot>\n  </Scrollbar>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, ref, unref, nextTick } from 'vue';\n  import { Scrollbar, ScrollbarType } from '/@/components/Scrollbar';\n  import { useScrollTo } from '/@/hooks/event/useScrollTo';\n\n  export default defineComponent({\n    name: 'ScrollContainer',\n    components: { Scrollbar },\n    setup() {\n      const scrollbarRef = ref<Nullable<ScrollbarType>>(null);\n\n      /**\n       * Scroll to the specified position\n       */\n      function scrollTo(to: number, duration = 500) {\n        const scrollbar = unref(scrollbarRef);\n        if (!scrollbar) {\n          return;\n        }\n        nextTick(() => {\n          const wrap = unref(scrollbar.wrap);\n          if (!wrap) {\n            return;\n          }\n          const { start } = useScrollTo({\n            el: wrap,\n            to,\n            duration,\n          });\n          start();\n        });\n      }\n\n      function getScrollWrap() {\n        const scrollbar = unref(scrollbarRef);\n        if (!scrollbar) {\n          return null;\n        }\n        return scrollbar.wrap;\n      }\n\n      /**\n       * Scroll to the bottom\n       */\n      function scrollBottom() {\n        const scrollbar = unref(scrollbarRef);\n        if (!scrollbar) {\n          return;\n        }\n        nextTick(() => {\n          const wrap = unref(scrollbar.wrap) as any;\n          if (!wrap) {\n            return;\n          }\n          const scrollHeight = wrap.scrollHeight as number;\n          const { start } = useScrollTo({\n            el: wrap,\n            to: scrollHeight,\n          });\n          start();\n        });\n      }\n\n      return {\n        scrollbarRef,\n        scrollTo,\n        scrollBottom,\n        getScrollWrap,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  .scroll-container {\n    width: 100%;\n    height: 100%;\n\n    .scrollbar__wrap {\n      margin-bottom: 18px !important;\n      overflow-x: hidden;\n    }\n\n    .scrollbar__view {\n      box-sizing: border-box;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Container/src/collapse/CollapseContainer.vue",
    "content": "<template>\n  <div :class=\"prefixCls\">\n    <CollapseHeader v-bind=\"$props\" :prefixCls=\"prefixCls\" :show=\"show\" @expand=\"handleExpand\">\n      <template #title>\n        <slot name=\"title\"></slot>\n      </template>\n      <template #action>\n        <slot name=\"action\"></slot>\n      </template>\n    </CollapseHeader>\n\n    <div class=\"p-2\">\n      <CollapseTransition :enable=\"canExpan\">\n        <Skeleton v-if=\"loading\" :active=\"loading\" />\n        <div :class=\"`${prefixCls}__body`\" v-else v-show=\"show\">\n          <slot></slot>\n        </div>\n      </CollapseTransition>\n    </div>\n    <div :class=\"`${prefixCls}__footer`\" v-if=\"$slots.footer\">\n      <slot name=\"footer\"></slot>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import type { PropType } from 'vue';\n  import { ref } from 'vue';\n  // component\n  import { Skeleton } from 'ant-design-vue';\n  import { CollapseTransition } from '/@/components/Transition';\n  import CollapseHeader from './CollapseHeader.vue';\n  import { triggerWindowResize } from '/@/utils/event';\n  // hook\n  import { useTimeoutFn } from '/@/hooks/core/useTimeout';\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  const props = defineProps({\n    title: { type: String, default: '' },\n    defaultExpan: { type: Boolean, default: true },\n    loading: { type: Boolean },\n    /**\n     *  Can it be expanded\n     */\n    canExpan: { type: Boolean, default: true },\n    /**\n     * Warm reminder on the right side of the title\n     */\n    helpMessage: {\n      type: [Array, String] as PropType<string[] | string>,\n      default: '',\n    },\n    /**\n     * Whether to trigger window.resize when expanding and contracting,\n     * Can adapt to tables and forms, when the form shrinks, the form triggers resize to adapt to the height\n     */\n    triggerWindowResize: { type: Boolean },\n    /**\n     * Delayed loading time\n     */\n    lazyTime: { type: Number, default: 0 },\n  });\n  // 代码逻辑说明: 【issues/7402】CollapseContainer组件增加默认不展开属性\n  const show = ref(props.defaultExpan);\n\n  const { prefixCls } = useDesign('collapse-container');\n\n  /**\n   * @description: Handling development events\n   */\n  function handleExpand() {\n    show.value = !show.value;\n    if (props.triggerWindowResize) {\n      // 200 milliseconds here is because the expansion has animation,\n      useTimeoutFn(triggerWindowResize, 200);\n    }\n  }\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-collapse-container';\n\n  .@{prefix-cls} {\n    background-color: @component-background;\n    border-radius: 2px;\n    transition: all 0.3s ease-in-out;\n\n    &__header {\n      display: flex;\n      height: 32px;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid @border-color-light;\n    }\n\n    &__footer {\n      border-top: 1px solid @border-color-light;\n    }\n\n    &__action {\n      display: flex;\n      text-align: right;\n      flex: 1;\n      align-items: center;\n      justify-content: flex-end;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Container/src/collapse/CollapseHeader.vue",
    "content": "<template>\n  <div :class=\"[`${prefixCls}__header px-2 py-5`, $attrs.class]\">\n    <BasicTitle :helpMessage=\"helpMessage\" normal>\n      <template v-if=\"title\">\n        {{ title }}\n      </template>\n      <template v-else>\n        <slot name=\"title\"></slot>\n      </template>\n    </BasicTitle>\n    <div :class=\"`${prefixCls}__action`\">\n      <slot name=\"action\"></slot>\n      <BasicArrow v-if=\"canExpan\" up :expand=\"show\" @click=\"$emit('expand')\" />\n    </div>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicArrow, BasicTitle } from '/@/components/Basic';\n\n  const props = {\n    prefixCls: { type: String },\n    helpMessage: {\n      type: [Array, String] as PropType<string[] | string>,\n      default: '',\n    },\n    title: { type: String },\n    show: { type: Boolean },\n    canExpan: { type: Boolean },\n  };\n\n  export default defineComponent({\n    components: { BasicArrow, BasicTitle },\n    inheritAttrs: false,\n    props,\n    emits: ['expand'],\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Container/src/typing.ts",
    "content": "export type ScrollType = 'default' | 'main';\n\nexport interface CollapseContainerOptions {\n  canExpand?: boolean;\n  title?: string;\n  helpMessage?: Array<any> | string;\n}\nexport interface ScrollContainerOptions {\n  enableScroll?: boolean;\n  type?: ScrollType;\n}\n\nexport type ScrollActionType = RefType<{\n  scrollBottom: () => void;\n  getScrollWrap: () => Nullable<HTMLElement>;\n  scrollTo: (top: number) => void;\n}>;\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/ContextMenu/index.ts",
    "content": "export { createContextMenu, destroyContextMenu } from './src/createContextMenu';\n\nexport * from './src/typing';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/ContextMenu/src/ContextMenu.vue",
    "content": "<script lang=\"tsx\">\n  import type { ContextMenuItem, ItemContentProps, Axis } from './typing';\n  import type { FunctionalComponent, CSSProperties } from 'vue';\n  import { defineComponent, nextTick, onMounted, computed, ref, unref, onUnmounted } from 'vue';\n  import Icon from '/@/components/Icon';\n  import { Menu, Divider } from 'ant-design-vue';\n\n  const prefixCls = 'context-menu';\n\n  const props = {\n    width: { type: Number, default: 156 },\n    customEvent: { type: Object as PropType<Event>, default: null },\n    styles: { type: Object as PropType<CSSProperties> },\n    showIcon: { type: Boolean, default: true },\n    axis: {\n      // The position of the right mouse button click\n      type: Object as PropType<Axis>,\n      default() {\n        return { x: 0, y: 0 };\n      },\n    },\n    items: {\n      // The most important list, if not, will not be displayed\n      type: Array as PropType<ContextMenuItem[]>,\n      default() {\n        return [];\n      },\n    },\n  };\n\n  const ItemContent: FunctionalComponent<ItemContentProps> = (props) => {\n    const { item } = props;\n    return (\n      <span style=\"display: inline-block; width: 100%; \" class=\"px-4\" onClick={props.handler.bind(null, item)}>\n        {props.showIcon && item.icon && <Icon class=\"mr-2\" icon={item.icon} />}\n        <span>{item.label}</span>\n      </span>\n    );\n  };\n\n  export default defineComponent({\n    name: 'ContextMenu',\n    props,\n    setup(props) {\n      const wrapRef = ref(null);\n      const showRef = ref(false);\n\n      const getStyle = computed((): CSSProperties => {\n        const { axis, items, styles, width } = props;\n        const { x, y } = axis || { x: 0, y: 0 };\n        const menuHeight = (items || []).length * 40;\n        const menuWidth = width;\n        const body = document.body;\n\n        const left = body.clientWidth < x + menuWidth ? x - menuWidth : x;\n        const top = body.clientHeight < y + menuHeight ? y - menuHeight : y;\n        return {\n          ...styles,\n          width: `${width}px`,\n          left: `${left + 1}px`,\n          top: `${top + 1}px`,\n        };\n      });\n\n      onMounted(() => {\n        nextTick(() => (showRef.value = true));\n      });\n\n      onUnmounted(() => {\n        const el = unref(wrapRef);\n        el && document.body.removeChild(el);\n      });\n\n      function handleAction(item: ContextMenuItem, e: MouseEvent) {\n        const { handler, disabled } = item;\n        if (disabled) {\n          return;\n        }\n        showRef.value = false;\n        e?.stopPropagation();\n        e?.preventDefault();\n        handler?.();\n      }\n\n      function renderMenuItem(items: ContextMenuItem[]) {\n        return items.map((item) => {\n          const { disabled, label, children, divider = false } = item;\n\n          const contentProps = {\n            item,\n            handler: handleAction,\n            showIcon: props.showIcon,\n          };\n\n          if (!children || children.length === 0) {\n            return (\n              <>\n                <Menu.Item disabled={disabled} class={`${prefixCls}__item`} key={label}>\n                  <ItemContent {...contentProps} />\n                </Menu.Item>\n                {divider ? <Divider key={`d-${label}`} /> : null}\n              </>\n            );\n          }\n          if (!unref(showRef)) return null;\n\n          return (\n            <Menu.SubMenu key={label} disabled={disabled} popupClassName={`${prefixCls}__popup`}>\n              {{\n                title: () => <ItemContent {...contentProps} />,\n                default: () => renderMenuItem(children),\n              }}\n            </Menu.SubMenu>\n          );\n        });\n      }\n      return () => {\n        if (!unref(showRef)) {\n          return null;\n        }\n        const { items } = props;\n        return (\n          <Menu inlineIndent={12} mode=\"vertical\" class={prefixCls} ref={wrapRef} style={unref(getStyle)}>\n            {renderMenuItem(items)}\n          </Menu>\n        );\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @default-height: 42px !important;\n\n  @small-height: 36px !important;\n\n  @large-height: 36px !important;\n\n  .item-style() {\n    li {\n      display: inline-block;\n      // 代码逻辑说明: 【TV360X-1576】右键样式选中缺少了一块---\n      width: 100% !important;\n      height: @default-height;\n      margin: 0 !important;\n      line-height: @default-height;\n\n      span {\n        line-height: @default-height;\n      }\n\n      > div {\n        margin: 0 !important;\n      }\n\n      &:not(.ant-menu-item-disabled):hover {\n        color: @text-color-base;\n        background-color: @item-hover-bg;\n      }\n    }\n  }\n\n  .context-menu {\n    position: fixed;\n    top: 0;\n    left: 0;\n    z-index: 200;\n    display: block;\n    width: 156px;\n    margin: 0;\n    list-style: none;\n    background-color: @component-background;\n    border: 1px solid rgba(0, 0, 0, 0.08);\n    border-radius: 0.25rem;\n    box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.1), 0 1px 5px 0 rgba(0, 0, 0, 0.06);\n    background-clip: padding-box;\n    user-select: none;\n\n    .item-style();\n\n    .ant-divider {\n      margin: 0 0;\n    }\n\n    &__popup {\n      .ant-divider {\n        margin: 0 0;\n      }\n\n      .item-style();\n    }\n\n    .ant-menu-submenu-title,\n    .ant-menu-item {\n      padding: 0 !important;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/ContextMenu/src/createContextMenu.ts",
    "content": "import contextMenuVue from './ContextMenu.vue';\nimport { isClient } from '/@/utils/is';\nimport { CreateContextOptions, ContextMenuProps } from './typing';\nimport { createVNode, render } from 'vue';\n\nconst menuManager: {\n  domList: Element[];\n  resolve: Fn;\n} = {\n  domList: [],\n  resolve: () => {},\n};\n\nexport const createContextMenu = function (options: CreateContextOptions) {\n  const { event } = options || {};\n\n  event && event?.preventDefault();\n\n  if (!isClient) {\n    return;\n  }\n  return new Promise((resolve) => {\n    const body = document.body;\n\n    const container = document.createElement('div');\n    const propsData: Partial<ContextMenuProps> = {};\n    if (options.styles) {\n      propsData.styles = options.styles;\n    }\n\n    if (options.items) {\n      propsData.items = options.items;\n    }\n\n    if (options.event) {\n      propsData.customEvent = event;\n      propsData.axis = { x: event.clientX, y: event.clientY };\n    }\n\n    const vm = createVNode(contextMenuVue, propsData);\n    render(vm, container);\n\n    const handleClick = function () {\n      menuManager.resolve('');\n    };\n\n    menuManager.domList.push(container);\n\n    const remove = function () {\n      menuManager.domList.forEach((dom: Element) => {\n        try {\n          dom && body.removeChild(dom);\n        } catch (error) {}\n      });\n      body.removeEventListener('click', handleClick);\n      body.removeEventListener('scroll', handleClick);\n    };\n\n    menuManager.resolve = function (arg) {\n      remove();\n      resolve(arg);\n    };\n    remove();\n    body.appendChild(container);\n    body.addEventListener('click', handleClick);\n    body.addEventListener('scroll', handleClick);\n  });\n};\n\nexport const destroyContextMenu = function () {\n  if (menuManager) {\n    menuManager.resolve('');\n    menuManager.domList = [];\n  }\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/ContextMenu/src/typing.ts",
    "content": "export interface Axis {\n  x: number;\n  y: number;\n}\n\nexport interface ContextMenuItem {\n  label: string;\n  icon?: string;\n  disabled?: boolean;\n  handler?: Fn;\n  divider?: boolean;\n  children?: ContextMenuItem[];\n}\nexport interface CreateContextOptions {\n  event: MouseEvent;\n  icon?: string;\n  styles?: any;\n  items?: ContextMenuItem[];\n}\n\nexport interface ContextMenuProps {\n  event?: MouseEvent;\n  styles?: any;\n  items: ContextMenuItem[];\n  customEvent?: MouseEvent;\n  axis?: Axis;\n  width?: number;\n  showIcon?: boolean;\n}\n\nexport interface ItemContentProps {\n  showIcon: boolean | undefined;\n  item: ContextMenuItem;\n  handler: Fn;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/CountDown/index.ts",
    "content": "import { withInstall } from '/@/utils';\nimport countButton from './src/CountButton.vue';\nimport countdownInput from './src/CountdownInput.vue';\n\nexport const CountdownInput = withInstall(countdownInput);\nexport const CountButton = withInstall(countButton);\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/CountDown/src/CountButton.vue",
    "content": "<template>\n  <Button v-bind=\"$attrs\" :disabled=\"isStart\" @click=\"handleStart\" :loading=\"loading\">\n    {{ getButtonText }}\n  </Button>\n  <!-- 图片验证码弹窗 -->\n  <CaptchaModal @register=\"captchaRegisterModal\" @ok=\"handleStart\" />\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, watchEffect, computed, unref } from 'vue';\n  import { Button } from 'ant-design-vue';\n  import { useCountdown } from './useCountdown';\n  import { isFunction } from '/@/utils/is';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useModal } from \"@/components/Modal\";\n  import { createAsyncComponent } from \"@/utils/factory/createAsyncComponent\";\n  import { ExceptionEnum } from \"@/enums/exceptionEnum\";\n  const CaptchaModal = createAsyncComponent(() => import('/@/components/jeecg/captcha/CaptchaModal.vue'));\n  const [captchaRegisterModal, { openModal: openCaptchaModal }] = useModal();\n\n  const props = {\n    value: { type: [Object, Number, String, Array] },\n    count: { type: Number, default: 60 },\n    beforeStartFunc: {\n      type: Function as PropType<() => Promise<boolean>>,\n      default: null,\n    },\n  };\n\n  export default defineComponent({\n    name: 'CountButton',\n    components: { Button, CaptchaModal },\n    props,\n    setup(props) {\n      const loading = ref(false);\n\n      const { currentCount, isStart, start, reset } = useCountdown(props.count);\n      const { t } = useI18n();\n\n      const getButtonText = computed(() => {\n        return !unref(isStart) ? t('component.countdown.normalText') : t('component.countdown.sendText', [unref(currentCount)]);\n      });\n\n      watchEffect(() => {\n        props.value === undefined && reset();\n      });\n\n      /**\n       * @description: Judge whether there is an external function before execution, and decide whether to start after execution\n       */\n      async function handleStart() {\n        const { beforeStartFunc } = props;\n        if (beforeStartFunc && isFunction(beforeStartFunc)) {\n          loading.value = true;\n          try {\n            // 代码逻辑说明: 【QQYUN-9005】同一个IP，1分钟超过5次短信，则提示需要验证码---\n            const canStart = await beforeStartFunc().catch((res) =>{\n              if(res.code === ExceptionEnum.PHONE_SMS_FAIL_CODE){\n                openCaptchaModal(true, {});\n              }\n            });\n            canStart && start();\n          } finally {\n            loading.value = false;\n          }\n        } else {\n          start();\n        }\n      }\n      return { handleStart, currentCount, loading, getButtonText, isStart, captchaRegisterModal };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/CountDown/src/CountdownInput.vue",
    "content": "<template>\n  <a-input v-bind=\"$attrs\" :class=\"prefixCls\" :size=\"size\" :value=\"state\">\n    <template #addonAfter>\n      <CountButton :size=\"size\" :count=\"count\" :value=\"state\" :beforeStartFunc=\"sendCodeApi\" />\n    </template>\n    <template #[item]=\"data\" v-for=\"item in Object.keys($slots).filter((k) => k !== 'addonAfter')\">\n      <slot :name=\"item\" v-bind=\"data || {}\"></slot>\n    </template>\n  </a-input>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType } from 'vue';\n  import CountButton from './CountButton.vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useRuleFormItem } from '/@/hooks/component/useFormItemSingle';\n\n  const props = {\n    value: { type: String },\n    size: { type: String, validator: (v) => ['default', 'large', 'small'].includes(v) },\n    count: { type: Number, default: 60 },\n    sendCodeApi: {\n      type: Function as PropType<() => Promise<boolean>>,\n      default: null,\n    },\n  };\n\n  export default defineComponent({\n    name: 'CountDownInput',\n    components: { CountButton },\n    inheritAttrs: false,\n    props,\n    setup(props) {\n      const { prefixCls } = useDesign('countdown-input');\n      const [state] = useRuleFormItem(props);\n\n      return { prefixCls, state };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-countdown-input';\n\n  .@{prefix-cls} {\n    .ant-input-group-addon {\n      padding-right: 0;\n      background-color: transparent;\n      border: none;\n\n      button {\n        font-size: 14px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/CountDown/src/useCountdown.ts",
    "content": "import { ref, unref } from 'vue';\nimport { tryOnUnmounted } from '@vueuse/core';\n\nexport function useCountdown(count: number) {\n  const currentCount = ref(count);\n\n  const isStart = ref(false);\n\n  let timerId: ReturnType<typeof setInterval> | null;\n\n  function clear() {\n    timerId && window.clearInterval(timerId);\n  }\n\n  function stop() {\n    isStart.value = false;\n    clear();\n    timerId = null;\n  }\n\n  function start() {\n    if (unref(isStart) || !!timerId) {\n      return;\n    }\n    isStart.value = true;\n    timerId = setInterval(() => {\n      if (unref(currentCount) === 1) {\n        stop();\n        currentCount.value = count;\n      } else {\n        currentCount.value -= 1;\n      }\n    }, 1000);\n  }\n\n  function reset() {\n    currentCount.value = count;\n    stop();\n  }\n\n  function restart() {\n    reset();\n    start();\n  }\n\n  tryOnUnmounted(() => {\n    reset();\n  });\n\n  return { start, reset, restart, clear, stop, currentCount, isStart };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/CountTo/index.ts",
    "content": "import { withInstall } from '/@/utils';\nimport countTo from './src/CountTo.vue';\n\nexport const CountTo = withInstall(countTo);\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/CountTo/src/CountTo.vue",
    "content": "<template>\n  <span :style=\"{ color }\">\n    {{ value }}\n  </span>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, computed, watchEffect, unref, onMounted, watch } from 'vue';\n  import { useTransition, TransitionPresets } from '@vueuse/core';\n  import { isNumber } from '/@/utils/is';\n\n  const props = {\n    startVal: { type: Number, default: 0 },\n    endVal: { type: Number, default: 2021 },\n    duration: { type: Number, default: 1500 },\n    autoplay: { type: Boolean, default: true },\n    decimals: {\n      type: Number,\n      default: 0,\n      validator(value: number) {\n        return value >= 0;\n      },\n    },\n    prefix: { type: String, default: '' },\n    suffix: { type: String, default: '' },\n    separator: { type: String, default: ',' },\n    decimal: { type: String, default: '.' },\n    /**\n     * font color\n     */\n    color: { type: String },\n    /**\n     * Turn on digital animation\n     */\n    useEasing: { type: Boolean, default: true },\n    /**\n     * Digital animation\n     */\n    transition: { type: String, default: 'linear' },\n  };\n\n  export default defineComponent({\n    name: 'CountTo',\n    props,\n    emits: ['onStarted', 'onFinished'],\n    setup(props, { emit }) {\n      const source = ref(props.startVal);\n      const disabled = ref(false);\n      let outputValue = useTransition(source);\n\n      const value = computed(() => formatNumber(unref(outputValue)));\n\n      watchEffect(() => {\n        source.value = props.startVal;\n      });\n\n      watch([() => props.startVal, () => props.endVal], () => {\n        if (props.autoplay) {\n          start();\n        }\n      });\n\n      onMounted(() => {\n        props.autoplay && start();\n      });\n\n      function start() {\n        run();\n        source.value = props.endVal;\n      }\n\n      function reset() {\n        source.value = props.startVal;\n        run();\n      }\n\n      function run() {\n        outputValue = useTransition(source, {\n          disabled,\n          duration: props.duration,\n          onFinished: () => emit('onFinished'),\n          onStarted: () => emit('onStarted'),\n          ...(props.useEasing ? { transition: TransitionPresets[props.transition] } : {}),\n        });\n      }\n\n      function formatNumber(num: number | string) {\n        if (!num && num !== 0) {\n          return '';\n        }\n        const { decimals, decimal, separator, suffix, prefix } = props;\n        num = Number(num).toFixed(decimals);\n        num += '';\n\n        const x = num.split('.');\n        let x1 = x[0];\n        const x2 = x.length > 1 ? decimal + x[1] : '';\n\n        const rgx = /(\\d+)(\\d{3})/;\n        if (separator && !isNumber(separator)) {\n          while (rgx.test(x1)) {\n            x1 = x1.replace(rgx, '$1' + separator + '$2');\n          }\n        }\n        return prefix + x1 + x2 + suffix;\n      }\n\n      return { value, start, reset };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Cropper/index.ts",
    "content": "import { withInstall } from '/@/utils';\nimport cropperImage from './src/Cropper.vue';\nimport avatarCropper from './src/CropperAvatar.vue';\n\nexport * from './src/typing';\nexport const CropperImage = withInstall(cropperImage);\nexport const CropperAvatar = withInstall(avatarCropper);\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Cropper/src/CopperModal.vue",
    "content": "<template>\n  <BasicModal\n    v-bind=\"$attrs\"\n    @register=\"register\"\n    :title=\"t('component.cropper.modalTitle')\"\n    width=\"800px\"\n    :canFullscreen=\"false\"\n    @ok=\"handleOk\"\n    :okText=\"t('component.cropper.okText')\"\n  >\n    <div :class=\"prefixCls\">\n      <div :class=\"`${prefixCls}-left`\">\n        <div :class=\"`${prefixCls}-cropper`\">\n          <CropperImage v-if=\"src\" :src=\"src\" height=\"300px\" :circled=\"circled\" @cropend=\"handleCropend\" @ready=\"handleReady\" />\n        </div>\n\n        <div :class=\"`${prefixCls}-toolbar`\">\n          <Upload :fileList=\"[]\" accept=\"image/*\" :beforeUpload=\"handleBeforeUpload\">\n            <Tooltip :title=\"t('component.cropper.selectImage')\" placement=\"bottom\">\n              <a-button size=\"small\" preIcon=\"ant-design:upload-outlined\" type=\"primary\" />\n            </Tooltip>\n          </Upload>\n          <Space>\n            <Tooltip :title=\"t('component.cropper.btn_reset')\" placement=\"bottom\">\n              <a-button type=\"primary\" preIcon=\"ant-design:reload-outlined\" size=\"small\" :disabled=\"!src\" @click=\"handlerToolbar('reset')\" />\n            </Tooltip>\n            <Tooltip :title=\"t('component.cropper.btn_rotate_left')\" placement=\"bottom\">\n              <a-button\n                type=\"primary\"\n                preIcon=\"ant-design:rotate-left-outlined\"\n                size=\"small\"\n                :disabled=\"!src\"\n                @click=\"handlerToolbar('rotate', -45)\"\n              />\n            </Tooltip>\n            <Tooltip :title=\"t('component.cropper.btn_rotate_right')\" placement=\"bottom\">\n              <a-button\n                type=\"primary\"\n                preIcon=\"ant-design:rotate-right-outlined\"\n                size=\"small\"\n                :disabled=\"!src\"\n                @click=\"handlerToolbar('rotate', 45)\"\n              />\n            </Tooltip>\n            <Tooltip :title=\"t('component.cropper.btn_scale_x')\" placement=\"bottom\">\n              <a-button type=\"primary\" preIcon=\"vaadin:arrows-long-h\" size=\"small\" :disabled=\"!src\" @click=\"handlerToolbar('scaleX')\" />\n            </Tooltip>\n            <Tooltip :title=\"t('component.cropper.btn_scale_y')\" placement=\"bottom\">\n              <a-button type=\"primary\" preIcon=\"vaadin:arrows-long-v\" size=\"small\" :disabled=\"!src\" @click=\"handlerToolbar('scaleY')\" />\n            </Tooltip>\n            <Tooltip :title=\"t('component.cropper.btn_zoom_in')\" placement=\"bottom\">\n              <a-button type=\"primary\" preIcon=\"ant-design:zoom-in-outlined\" size=\"small\" :disabled=\"!src\" @click=\"handlerToolbar('zoom', 0.1)\" />\n            </Tooltip>\n            <Tooltip :title=\"t('component.cropper.btn_zoom_out')\" placement=\"bottom\">\n              <a-button type=\"primary\" preIcon=\"ant-design:zoom-out-outlined\" size=\"small\" :disabled=\"!src\" @click=\"handlerToolbar('zoom', -0.1)\" />\n            </Tooltip>\n          </Space>\n        </div>\n      </div>\n      <div :class=\"`${prefixCls}-right`\">\n        <div :class=\"`${prefixCls}-preview`\">\n          <img :src=\"previewSource\" v-if=\"previewSource\" :alt=\"t('component.cropper.preview')\" />\n        </div>\n        <template v-if=\"previewSource\">\n          <div :class=\"`${prefixCls}-group`\">\n            <Avatar :src=\"previewSource\" size=\"large\" />\n            <Avatar :src=\"previewSource\" :size=\"48\" />\n            <Avatar :src=\"previewSource\" :size=\"64\" />\n            <Avatar :src=\"previewSource\" :size=\"80\" />\n          </div>\n        </template>\n      </div>\n    </div>\n  </BasicModal>\n</template>\n<script lang=\"ts\">\n  import type { CropendResult, Cropper } from './typing';\n\n  import { defineComponent, ref } from 'vue';\n  import CropperImage from './Cropper.vue';\n  import { Space, Upload, Avatar, Tooltip } from 'ant-design-vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { dataURLtoBlob } from '/@/utils/file/base64Conver';\n  import { isFunction } from '/@/utils/is';\n  import { useI18n } from '/@/hooks/web/useI18n';\n\n  type apiFunParams = { file: Blob; name: string; filename: string };\n\n  const props = {\n    circled: { type: Boolean, default: true },\n    uploadApi: {\n      type: Function as PropType<(params: apiFunParams) => Promise<any>>,\n    },\n  };\n\n  export default defineComponent({\n    name: 'CropperModal',\n    components: { BasicModal, Space, CropperImage, Upload, Avatar, Tooltip },\n    props,\n    emits: ['uploadSuccess', 'register'],\n    setup(props, { emit }) {\n      let filename = '';\n      const src = ref('');\n      const previewSource = ref('');\n      const cropper = ref<Cropper>();\n      let scaleX = 1;\n      let scaleY = 1;\n\n      const { prefixCls } = useDesign('cropper-am');\n      const [register, { closeModal, setModalProps }] = useModalInner();\n      const { t } = useI18n();\n\n      // Block upload\n      function handleBeforeUpload(file: File) {\n        const reader = new FileReader();\n        reader.readAsDataURL(file);\n        src.value = '';\n        previewSource.value = '';\n        reader.onload = function (e) {\n          src.value = (e.target?.result as string) ?? '';\n          filename = file.name;\n        };\n        return false;\n      }\n\n      function handleCropend({ imgBase64 }: CropendResult) {\n        previewSource.value = imgBase64;\n      }\n\n      function handleReady(cropperInstance: Cropper) {\n        cropper.value = cropperInstance;\n      }\n\n      function handlerToolbar(event: string, arg?: number) {\n        if (event === 'scaleX') {\n          scaleX = arg = scaleX === -1 ? 1 : -1;\n        }\n        if (event === 'scaleY') {\n          scaleY = arg = scaleY === -1 ? 1 : -1;\n        }\n        cropper?.value?.[event]?.(arg);\n      }\n\n      async function handleOk() {\n        const uploadApi = props.uploadApi;\n        if (uploadApi && isFunction(uploadApi)) {\n          const blob = dataURLtoBlob(previewSource.value);\n          try {\n            setModalProps({ confirmLoading: true });\n            const result = await uploadApi({ name: 'file', file: blob, filename });\n            emit('uploadSuccess', {\n              source: previewSource.value,\n              data: result.data || result.message,\n            });\n            closeModal();\n          } finally {\n            setModalProps({ confirmLoading: false });\n          }\n        }\n      }\n\n      return {\n        t,\n        prefixCls,\n        src,\n        register,\n        previewSource,\n        handleBeforeUpload,\n        handleCropend,\n        handleReady,\n        handlerToolbar,\n        handleOk,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-cropper-am';\n\n  .@{prefix-cls} {\n    display: flex;\n\n    &-left,\n    &-right {\n      height: 340px;\n    }\n\n    &-left {\n      width: 55%;\n    }\n\n    &-right {\n      width: 45%;\n    }\n\n    &-cropper {\n      height: 300px;\n      background: #eee;\n      background-image: linear-gradient(45deg, rgba(0, 0, 0, 0.25) 25%, transparent 0, transparent 75%, rgba(0, 0, 0, 0.25) 0),\n        linear-gradient(45deg, rgba(0, 0, 0, 0.25) 25%, transparent 0, transparent 75%, rgba(0, 0, 0, 0.25) 0);\n      background-position: 0 0, 12px 12px;\n      background-size: 24px 24px;\n    }\n\n    &-toolbar {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-top: 10px;\n    }\n\n    &-preview {\n      width: 220px;\n      height: 220px;\n      margin: 0 auto;\n      overflow: hidden;\n      border: 1px solid @border-color-base;\n      border-radius: 50%;\n\n      img {\n        width: 100%;\n        height: 100%;\n      }\n    }\n\n    &-group {\n      display: flex;\n      padding-top: 8px;\n      margin-top: 8px;\n      border-top: 1px solid @border-color-base;\n      justify-content: space-around;\n      align-items: center;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Cropper/src/Cropper.vue",
    "content": "<template>\n  <div :class=\"getClass\" :style=\"getWrapperStyle\">\n    <img v-show=\"isReady\" ref=\"imgElRef\" :src=\"src\" :alt=\"alt\" :crossorigin=\"crossorigin\" :style=\"getImageStyle\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import type { CSSProperties } from 'vue';\n  import { defineComponent, onMounted, ref, unref, computed, onUnmounted } from 'vue';\n  import Cropper from 'cropperjs';\n  import 'cropperjs/dist/cropper.css';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useDebounceFn } from '@vueuse/core';\n\n  type Options = Cropper.Options;\n\n  const defaultOptions: Options = {\n    aspectRatio: 1,\n    zoomable: true,\n    zoomOnTouch: true,\n    zoomOnWheel: true,\n    cropBoxMovable: true,\n    cropBoxResizable: true,\n    toggleDragModeOnDblclick: true,\n    autoCrop: true,\n    background: true,\n    highlight: true,\n    center: true,\n    responsive: true,\n    restore: true,\n    checkCrossOrigin: true,\n    checkOrientation: true,\n    scalable: true,\n    modal: true,\n    guides: true,\n    movable: true,\n    rotatable: true,\n  };\n\n  const props = {\n    src: { type: String, required: true },\n    alt: { type: String },\n    circled: { type: Boolean, default: false },\n    realTimePreview: { type: Boolean, default: true },\n    height: { type: [String, Number], default: '360px' },\n    crossorigin: {\n      type: String as PropType<'' | 'anonymous' | 'use-credentials' | undefined>,\n      default: undefined,\n    },\n    imageStyle: { type: Object as PropType<CSSProperties>, default: () => ({}) },\n    options: { type: Object as PropType<Options>, default: () => ({}) },\n  };\n\n  export default defineComponent({\n    name: 'CropperImage',\n    props,\n    emits: ['cropend', 'ready', 'cropendError'],\n    setup(props, { attrs, emit }) {\n      const imgElRef = ref<ElRef<HTMLImageElement>>();\n      const cropper = ref<Nullable<Cropper>>();\n      const isReady = ref(false);\n\n      const { prefixCls } = useDesign('cropper-image');\n      const debounceRealTimeCroppered = useDebounceFn(realTimeCroppered, 80);\n\n      const getImageStyle = computed((): CSSProperties => {\n        return {\n          height: props.height,\n          maxWidth: '100%',\n          ...props.imageStyle,\n        };\n      });\n\n      const getClass = computed(() => {\n        return [\n          prefixCls,\n          attrs.class,\n          {\n            [`${prefixCls}--circled`]: props.circled,\n          },\n        ];\n      });\n\n      const getWrapperStyle = computed((): CSSProperties => {\n        return { height: `${props.height}`.replace(/px/, '') + 'px' };\n      });\n\n      onMounted(init);\n\n      onUnmounted(() => {\n        cropper.value?.destroy();\n      });\n\n      async function init() {\n        const imgEl = unref(imgElRef);\n        if (!imgEl) {\n          return;\n        }\n        cropper.value = new Cropper(imgEl, {\n          ...defaultOptions,\n          ready: () => {\n            isReady.value = true;\n            realTimeCroppered();\n            emit('ready', cropper.value);\n          },\n          crop() {\n            debounceRealTimeCroppered();\n          },\n          zoom() {\n            debounceRealTimeCroppered();\n          },\n          cropmove() {\n            debounceRealTimeCroppered();\n          },\n          ...props.options,\n        });\n      }\n\n      // Real-time display preview\n      function realTimeCroppered() {\n        props.realTimePreview && croppered();\n      }\n\n      // event: return base64 and width and height information after cropping\n      function croppered() {\n        if (!cropper.value) {\n          return;\n        }\n        let imgInfo = cropper.value.getData();\n        const canvas = props.circled ? getRoundedCanvas() : cropper.value.getCroppedCanvas();\n        canvas.toBlob((blob) => {\n          if (!blob) {\n            return;\n          }\n          let fileReader: FileReader = new FileReader();\n          fileReader.readAsDataURL(blob);\n          fileReader.onloadend = (e) => {\n            emit('cropend', {\n              imgBase64: e.target?.result ?? '',\n              imgInfo,\n            });\n          };\n          fileReader.onerror = () => {\n            emit('cropendError');\n          };\n        }, 'image/png');\n      }\n\n      // Get a circular picture canvas\n      function getRoundedCanvas() {\n        const sourceCanvas = cropper.value!.getCroppedCanvas();\n        const canvas = document.createElement('canvas');\n        const context = canvas.getContext('2d')!;\n        const width = sourceCanvas.width;\n        const height = sourceCanvas.height;\n        canvas.width = width;\n        canvas.height = height;\n        context.imageSmoothingEnabled = true;\n        context.drawImage(sourceCanvas, 0, 0, width, height);\n        context.globalCompositeOperation = 'destination-in';\n        context.beginPath();\n        context.arc(width / 2, height / 2, Math.min(width, height) / 2, 0, 2 * Math.PI, true);\n        context.fill();\n        return canvas;\n      }\n\n      return { getClass, imgElRef, getWrapperStyle, getImageStyle, isReady, croppered };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-cropper-image';\n\n  .@{prefix-cls} {\n    &--circled {\n      .cropper-view-box,\n      .cropper-face {\n        border-radius: 50%;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Cropper/src/CropperAvatar.vue",
    "content": "<template>\n  <div :class=\"getClass\" :style=\"getStyle\">\n    <div :class=\"`${prefixCls}-image-wrapper`\" :style=\"getImageWrapperStyle\" @click=\"openModal\">\n      <div :class=\"`${prefixCls}-image-mask`\" :style=\"getImageWrapperStyle\">\n        <Icon icon=\"ant-design:cloud-upload-outlined\" :size=\"getIconWidth\" :style=\"getImageWrapperStyle\" color=\"#d6d6d6\" />\n      </div>\n      <img :src=\"sourceValue\" v-if=\"sourceValue\" alt=\"avatar\" />\n    </div>\n    <a-button :class=\"`${prefixCls}-upload-btn`\" @click=\"openModal\" v-if=\"showBtn\" v-bind=\"btnProps\">\n      {{ btnText ? btnText : t('component.cropper.selectImage') }}\n    </a-button>\n\n    <CopperModal @register=\"register\" @uploadSuccess=\"handleUploadSuccess\" :uploadApi=\"uploadApi\" :src=\"sourceValue\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, computed, CSSProperties, unref, ref, watchEffect, watch, PropType } from 'vue';\n  import CopperModal from './CopperModal.vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useModal } from '/@/components/Modal';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import type { ButtonProps } from '/@/components/Button';\n  import Icon from '/@/components/Icon';\n\n  const props = {\n    width: { type: [String, Number], default: '200px' },\n    value: { type: String },\n    showBtn: { type: Boolean, default: true },\n    btnProps: { type: Object as PropType<ButtonProps> },\n    btnText: { type: String, default: '' },\n    uploadApi: { type: Function as PropType<({ file: Blob, name: string }) => Promise<void>> },\n  };\n\n  export default defineComponent({\n    name: 'CropperAvatar',\n    components: { CopperModal, Icon },\n    props,\n    emits: ['update:value', 'change'],\n    setup(props, { emit, expose }) {\n      const sourceValue = ref(props.value || '');\n      const { prefixCls } = useDesign('cropper-avatar');\n      const [register, { openModal, closeModal }] = useModal();\n      const { createMessage } = useMessage();\n      const { t } = useI18n();\n\n      const getClass = computed(() => [prefixCls]);\n\n      const getWidth = computed(() => `${props.width}`.replace(/px/, '') + 'px');\n\n      const getIconWidth = computed(() => parseInt(`${props.width}`.replace(/px/, '')) / 2 + 'px');\n\n      const getStyle = computed((): CSSProperties => ({ width: unref(getWidth) }));\n\n      const getImageWrapperStyle = computed((): CSSProperties => ({ width: unref(getWidth), height: unref(getWidth) }));\n\n      watchEffect(() => {\n        sourceValue.value = props.value || '';\n      });\n\n      watch(\n        () => sourceValue.value,\n        (v: string) => {\n          emit('update:value', v);\n        }\n      );\n\n      function handleUploadSuccess({ source, data }) {\n        sourceValue.value = source;\n        emit('change', source, data);\n        createMessage.success(t('component.cropper.uploadSuccess'));\n      }\n\n      expose({ openModal: openModal.bind(null, true), closeModal });\n\n      return {\n        t,\n        prefixCls,\n        register,\n        openModal: openModal as any,\n        getIconWidth,\n        sourceValue,\n        getClass,\n        getImageWrapperStyle,\n        getStyle,\n        handleUploadSuccess,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-cropper-avatar';\n\n  .@{prefix-cls} {\n    display: inline-block;\n    text-align: center;\n\n    &-image-wrapper {\n      overflow: hidden;\n      cursor: pointer;\n      background: @component-background;\n      border: 1px solid @border-color-base;\n      border-radius: 50%;\n\n      img {\n        width: 100%;\n      }\n    }\n\n    &-image-mask {\n      opacity: 0;\n      position: absolute;\n      width: inherit;\n      height: inherit;\n      border-radius: inherit;\n      border: inherit;\n      background: rgba(0, 0, 0, 0.4);\n      cursor: pointer;\n      -webkit-transition: opacity 0.4s;\n      transition: opacity 0.4s;\n\n      :deep(svg) {\n        margin: auto;\n      }\n    }\n\n    &-image-mask:hover {\n      opacity: 40;\n    }\n\n    &-upload-btn {\n      margin: 10px auto;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Cropper/src/typing.ts",
    "content": "import type Cropper from 'cropperjs';\n\nexport interface CropendResult {\n  imgBase64: string;\n  imgInfo: Cropper.Data;\n}\n\nexport type { Cropper };\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Description/index.ts",
    "content": "import { withInstall } from '/@/utils';\nimport description from './src/Description.vue';\n\nexport * from './src/typing';\nexport { useDescription } from './src/useDescription';\nexport const Description = withInstall(description);\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Description/src/Description.vue",
    "content": "<script lang=\"tsx\">\n  import type { DescriptionProps, DescInstance, DescItem } from './typing';\n  import type { DescriptionsProps } from 'ant-design-vue/es/descriptions/index';\n  import type { CSSProperties } from 'vue';\n  import type { CollapseContainerOptions } from '/@/components/Container/index';\n  import { defineComponent, computed, ref, unref } from 'vue';\n  import { get } from 'lodash-es';\n  import { Descriptions } from 'ant-design-vue';\n  import { CollapseContainer } from '/@/components/Container/index';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { isFunction } from '/@/utils/is';\n  import { getSlot } from '/@/utils/helper/tsxHelper';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n\n  const props = {\n    useCollapse: { type: Boolean, default: true },\n    title: { type: String, default: '' },\n    size: {\n      type: String,\n      validator: (v) => ['small', 'default', 'middle', undefined].includes(v),\n      default: 'small',\n    },\n    bordered: { type: Boolean, default: true },\n    column: {\n      type: [Number, Object] as PropType<number | Recordable>,\n      default: () => {\n        return { xxl: 4, xl: 3, lg: 3, md: 3, sm: 2, xs: 1 };\n      },\n    },\n    collapseOptions: {\n      type: Object as PropType<CollapseContainerOptions>,\n      default: null,\n    },\n    schema: {\n      type: Array as PropType<DescItem[]>,\n      default: () => [],\n    },\n    data: { type: Object },\n  };\n\n  export default defineComponent({\n    name: 'Description',\n    props,\n    emits: ['register'],\n    setup(props, { slots, emit }) {\n      const propsRef = ref<Partial<DescriptionProps> | null>(null);\n\n      const { prefixCls } = useDesign('description');\n      const attrs = useAttrs();\n\n      // Custom title component: get title\n      const getMergeProps = computed(() => {\n        return {\n          ...props,\n          ...(unref(propsRef) as Recordable),\n        } as DescriptionProps;\n      });\n\n      const getProps = computed(() => {\n        const opt = {\n          ...unref(getMergeProps),\n          title: undefined,\n        };\n        return opt as DescriptionProps;\n      });\n\n      /**\n       * @description: Whether to setting title\n       */\n      const useWrapper = computed(() => !!unref(getMergeProps).title);\n\n      /**\n       * @description: Get configuration Collapse\n       */\n      const getCollapseOptions = computed((): CollapseContainerOptions => {\n        return {\n          // Cannot be expanded by default\n          canExpand: false,\n          ...unref(getProps).collapseOptions,\n        };\n      });\n\n      const getDescriptionsProps = computed(() => {\n        return { ...unref(attrs), ...unref(getProps) } as DescriptionsProps;\n      });\n\n      /**\n       * @description:设置desc\n       */\n      function setDescProps(descProps: Partial<DescriptionProps>): void {\n        // Keep the last setDrawerProps\n        propsRef.value = { ...(unref(propsRef) as Recordable), ...descProps } as Recordable;\n      }\n\n      // Prevent line breaks\n      function renderLabel({ label, labelMinWidth, labelStyle }: DescItem) {\n        if (!labelStyle && !labelMinWidth) {\n          return label;\n        }\n\n        const labelStyles: CSSProperties = {\n          ...labelStyle,\n          minWidth: `${labelMinWidth}px `,\n        };\n        return <div style={labelStyles}>{label}</div>;\n      }\n\n      function renderItem() {\n        const { schema, data } = unref(getProps);\n        return unref(schema)\n          .map((item) => {\n            const { render, field, span, show, contentMinWidth } = item;\n\n            if (show && isFunction(show) && !show(data)) {\n              return null;\n            }\n\n            const getContent = () => {\n              const _data = unref(getProps)?.data;\n              if (!_data) {\n                return null;\n              }\n              const getField = get(_data, field);\n              return isFunction(render) ? render(getField, _data) : getField ?? '';\n            };\n\n            const width = contentMinWidth;\n            return (\n              <Descriptions.Item label={renderLabel(item)} key={field} span={span}>\n                {() => {\n                  if (!contentMinWidth) {\n                    return getContent();\n                  }\n                  const style: CSSProperties = {\n                    minWidth: `${width}px`,\n                  };\n                  return <div style={style}>{getContent()}</div>;\n                }}\n              </Descriptions.Item>\n            );\n          })\n          .filter((item) => !!item);\n      }\n\n      const renderDesc = () => {\n        return (\n          <Descriptions class={`${prefixCls}`} {...(unref(getDescriptionsProps) as any)}>\n            {renderItem()}\n          </Descriptions>\n        );\n      };\n\n      const renderContainer = () => {\n        const content = props.useCollapse ? renderDesc() : <div>{renderDesc()}</div>;\n        // Reduce the dom level\n        if (!props.useCollapse) {\n          return content;\n        }\n\n        const { canExpand, helpMessage } = unref(getCollapseOptions);\n        const { title } = unref(getMergeProps);\n\n        return (\n          <CollapseContainer title={title} canExpan={canExpand} helpMessage={helpMessage}>\n            {{\n              default: () => content,\n              action: () => getSlot(slots, 'action'),\n            }}\n          </CollapseContainer>\n        );\n      };\n\n      const methods: DescInstance = {\n        setDescProps,\n      };\n\n      emit('register', methods);\n      return () => (unref(useWrapper) ? renderContainer() : renderDesc());\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Description/src/typing.ts",
    "content": "import type { VNode, CSSProperties } from 'vue';\nimport type { CollapseContainerOptions } from '/@/components/Container/index';\nimport type { DescriptionsProps } from 'ant-design-vue/es/descriptions/index';\n\nexport interface DescItem {\n  labelMinWidth?: number;\n  contentMinWidth?: number;\n  labelStyle?: CSSProperties;\n  field: string;\n  label: string | VNode | JSX.Element;\n  // Merge column\n  span?: number;\n  show?: (...arg: any) => boolean;\n  // render\n  render?: (val: any, data: Recordable) => VNode | undefined | JSX.Element | Element | string | number;\n}\n\nexport interface DescriptionProps extends DescriptionsProps {\n  // Whether to include the collapse component\n  useCollapse?: boolean;\n  /**\n   * item configuration\n   * @type DescItem\n   */\n  schema: DescItem[];\n  /**\n   * 数据\n   * @type object\n   */\n  data: Recordable;\n  /**\n   * Built-in CollapseContainer component configuration\n   * @type CollapseContainerOptions\n   */\n  collapseOptions?: CollapseContainerOptions;\n}\n\nexport interface DescInstance {\n  setDescProps(descProps: Partial<DescriptionProps>): void;\n}\n\nexport type Register = (descInstance: DescInstance) => void;\n\n/**\n * @description:\n */\nexport type UseDescReturnType = [Register, DescInstance];\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Description/src/useDescription.ts",
    "content": "import type { DescriptionProps, DescInstance, UseDescReturnType } from './typing';\nimport { ref, getCurrentInstance, unref, onUnmounted } from 'vue';\nimport { isProdMode } from '/@/utils/env';\n\nexport function useDescription(props?: Partial<DescriptionProps>): UseDescReturnType {\n  if (!getCurrentInstance()) {\n    throw new Error('useDescription() can only be used inside setup() or functional components!');\n  }\n  const desc = ref<Nullable<DescInstance>>(null);\n  const loaded = ref(false);\n\n  function register(instance: DescInstance) {\n    // update-begin--author:liaozhiyang---date:20251223---for:【pull/9125】在抽屉中配置destroy-on-close，再次打开未正确渲染\n    isProdMode() &&\n      onUnmounted(() => {\n        desc.value = null;\n        loaded.value = false;\n      });\n    if (unref(loaded) && isProdMode() && instance === unref(desc)) return;\n    // update-end--author:liaozhiyang---date:20251223---for:【pull/9125】在抽屉中配置destroy-on-close，再次打开未正确渲染\n    desc.value = instance;\n    props && instance.setDescProps(props);\n    loaded.value = true;\n  }\n\n  const methods: DescInstance = {\n    setDescProps: (descProps: Partial<DescriptionProps>): void => {\n      unref(desc)?.setDescProps(descProps);\n    },\n  };\n\n  return [register, methods];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Drawer/index.ts",
    "content": "import { withInstall } from '/@/utils';\nimport basicDrawer from './src/BasicDrawer.vue';\n\nexport const BasicDrawer = withInstall(basicDrawer);\nexport * from './src/typing';\nexport { useDrawer, useDrawerInner } from './src/useDrawer';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Drawer/src/BasicDrawer.vue",
    "content": "<template>\n  <Drawer :class=\"prefixCls\" @close=\"onClose\" v-bind=\"getBindValues\">\n    <template #title v-if=\"!$slots.title\">\n      <DrawerHeader :title=\"getMergeProps.title\" :isDetail=\"isDetail\" :showDetailBack=\"showDetailBack\" @close=\"onClose\">\n        <template #titleToolbar>\n          <slot name=\"titleToolbar\"></slot>\n        </template>\n      </DrawerHeader>\n    </template>\n    <template v-else #title>\n      <slot name=\"title\"></slot>\n    </template>\n\n    <ScrollContainer :style=\"getScrollContentStyle\" v-loading=\"getLoading\" :loading-tip=\"loadingText || t('common.loadingText')\">\n      <slot></slot>\n    </ScrollContainer>\n    <DrawerFooter v-bind=\"getProps\" @close=\"onClose\" @ok=\"handleOk\" :height=\"getFooterHeight\">\n      <template #[item]=\"data\" v-for=\"item in Object.keys($slots)\">\n        <slot :name=\"item\" v-bind=\"data || {}\"></slot>\n      </template>\n    </DrawerFooter>\n  </Drawer>\n</template>\n<script lang=\"ts\">\n  import type { DrawerInstance, DrawerProps } from './typing';\n  import type { CSSProperties } from 'vue';\n  import { defineComponent, ref, computed, watch, unref, nextTick, toRaw, getCurrentInstance } from 'vue';\n  import { Drawer } from 'ant-design-vue';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { isFunction, isNumber } from '/@/utils/is';\n  import { deepMerge } from '/@/utils';\n  import DrawerFooter from './components/DrawerFooter.vue';\n  import DrawerHeader from './components/DrawerHeader.vue';\n  import { ScrollContainer } from '/@/components/Container';\n  import { basicProps } from './props';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { cloneDeep } from 'lodash-es';\n\n  export default defineComponent({\n    components: { Drawer, ScrollContainer, DrawerFooter, DrawerHeader },\n    inheritAttrs: false,\n    props: basicProps,\n    emits: ['visible-change', 'open-change', 'ok', 'close', 'register'],\n    setup(props, { emit }) {\n      const visibleRef = ref(false);\n      const attrs = useAttrs();\n      const propsRef = ref<Partial<Nullable<DrawerProps>>>(null);\n\n      const { t } = useI18n();\n      const { prefixVar, prefixCls } = useDesign('basic-drawer');\n\n      const drawerInstance: DrawerInstance = {\n        setDrawerProps: setDrawerProps,\n        emitVisible: undefined,\n      };\n\n      const instance = getCurrentInstance();\n\n      instance && emit('register', drawerInstance, instance.uid);\n\n      const getMergeProps = computed((): DrawerProps => {\n        // 代码逻辑说明: 【QQYUN-8389】vue3.4以上版本导致角色抽屉隐藏footer逻辑错误（toRaw改成cloneDeep，否则props的变化不会触发computed）\n        return { ...deepMerge(cloneDeep(props), unref(propsRef)) };\n      });\n\n      const getProps = computed((): DrawerProps => {\n        // 代码逻辑说明: 【QQYUN-6366】升级到antd4.x\n        const opt = {\n          placement: 'right',\n          ...unref(attrs),\n          ...unref(getMergeProps),\n          open: unref(visibleRef),\n        };\n        opt.title = undefined;\n        let { isDetail, width, wrapClassName, getContainer } = opt;\n        if (isDetail) {\n          if (!width) {\n            opt.width = '100%';\n          }\n          const detailCls = `${prefixCls}__detail`;\n          wrapClassName = opt['class'] ? opt['class'] : wrapClassName;\n          opt.class = wrapClassName ? `${wrapClassName} ${detailCls}` : detailCls;\n\n          if (!getContainer) {\n            // TODO type error?\n            opt.getContainer = `.${prefixVar}-layout-content` as any;\n          }\n        }\n        return opt as DrawerProps;\n      });\n\n      const getBindValues = computed((): DrawerProps => {\n        return {\n          ...attrs,\n          ...unref(getProps),\n        };\n      });\n\n      // Custom implementation of the bottom button,\n      const getFooterHeight = computed(() => {\n        const { footerHeight, showFooter } = unref(getProps);\n        if (showFooter && footerHeight) {\n          return isNumber(footerHeight) ? `${footerHeight}px` : `${footerHeight.replace('px', '')}px`;\n        }\n        return `0px`;\n      });\n\n      const getScrollContentStyle = computed((): CSSProperties => {\n        const footerHeight = unref(getFooterHeight);\n        return {\n          position: 'relative',\n          height: `calc(100% - ${footerHeight})`,\n        };\n      });\n\n      const getLoading = computed(() => {\n        return !!unref(getProps)?.loading;\n      });\n\n      watch(\n        () => props.visible,\n        (newVal, oldVal) => {\n          if (newVal !== oldVal) visibleRef.value = newVal;\n        },\n        { deep: true }\n      );\n\n      watch(\n        () => props.open,\n        (newVal, oldVal) => {\n          if (newVal !== oldVal) visibleRef.value = newVal;\n        },\n        { deep: true }\n      );\n\n      watch(\n        () => visibleRef.value,\n        (visible) => {\n          nextTick(() => {\n            emit('visible-change', visible);\n            emit('open-change', visible);\n            instance && drawerInstance.emitVisible?.(visible, instance.uid);\n          });\n        }\n      );\n\n      // Cancel event\n      async function onClose(e: Recordable) {\n        const { closeFunc } = unref(getProps);\n        emit('close', e);\n        if (closeFunc && isFunction(closeFunc)) {\n          const res = await closeFunc();\n          visibleRef.value = !res;\n          return;\n        }\n        visibleRef.value = false;\n      }\n\n      function setDrawerProps(props: Partial<DrawerProps>): void {\n        // Keep the last setDrawerProps\n        propsRef.value = deepMerge(unref(propsRef) || ({} as any), props);\n\n        if (Reflect.has(props, 'visible')) {\n          visibleRef.value = !!props.visible;\n        }\n        if (Reflect.has(props, 'open')) {\n          visibleRef.value = !!props.open;\n        }\n      }\n\n      function handleOk() {\n        emit('ok');\n      }\n\n      return {\n        onClose,\n        t,\n        prefixCls,\n        getMergeProps: getMergeProps as any,\n        getScrollContentStyle,\n        getProps: getProps as any,\n        getLoading,\n        getBindValues,\n        getFooterHeight,\n        handleOk,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @header-height: 60px;\n  @detail-header-height: 40px;\n  @prefix-cls: ~'@{namespace}-basic-drawer';\n  @prefix-cls-detail: ~'@{namespace}-basic-drawer__detail';\n\n  .@{prefix-cls} {\n    .ant-drawer-wrapper-body {\n      overflow: hidden;\n    }\n\n    .ant-drawer-close {\n      &:hover {\n        color: @error-color;\n      }\n    }\n\n    .ant-drawer-body {\n      height: calc(100% - @header-height);\n      padding: 0;\n      background-color: @component-background;\n\n      .scrollbar__wrap {\n        padding: 16px !important;\n        margin-bottom: 0 !important;\n      }\n\n      > .scrollbar > .scrollbar__bar.is-horizontal {\n        display: none;\n      }\n    }\n  }\n\n  .@{prefix-cls-detail} {\n    position: absolute;\n\n    .ant-drawer-header {\n      width: 100%;\n      height: @detail-header-height;\n      padding: 0;\n      border-top: 1px solid @border-color-base;\n      box-sizing: border-box;\n    }\n\n    .ant-drawer-title {\n      height: 100%;\n    }\n\n    .ant-drawer-close {\n      height: @detail-header-height;\n      line-height: @detail-header-height;\n    }\n\n    .scrollbar__wrap {\n      padding: 0 !important;\n    }\n\n    .ant-drawer-body {\n      height: calc(100% - @detail-header-height);\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Drawer/src/components/DrawerFooter.vue",
    "content": "<template>\n  <div :class=\"prefixCls\" :style=\"getStyle\" v-if=\"showFooter || $slots.footer\">\n    <template v-if=\"!$slots.footer\">\n      <slot name=\"insertFooter\"></slot>\n      <a-button v-bind=\"cancelButtonProps\" @click=\"handleClose\" class=\"mr-2\" v-if=\"showCancelBtn\">\n        {{ cancelText }}\n      </a-button>\n      <slot name=\"centerFooter\"></slot>\n      <a-button :type=\"okType\" @click=\"handleOk\" v-bind=\"okButtonProps\" class=\"mr-2\" :loading=\"confirmLoading\" v-if=\"showOkBtn\">\n        {{ okText }}\n      </a-button>\n      <slot name=\"appendFooter\"></slot>\n    </template>\n\n    <template v-else>\n      <slot name=\"footer\"></slot>\n    </template>\n  </div>\n</template>\n<script lang=\"ts\">\n  import type { CSSProperties } from 'vue';\n  import { defineComponent, computed } from 'vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  import { footerProps } from '../props';\n  export default defineComponent({\n    name: 'BasicDrawerFooter',\n    props: {\n      ...footerProps,\n      height: {\n        type: String,\n        default: '60px',\n      },\n    },\n    emits: ['ok', 'close'],\n    setup(props, { emit }) {\n      const { prefixCls } = useDesign('basic-drawer-footer');\n\n      const getStyle = computed((): CSSProperties => {\n        const heightStr = `${props.height}`;\n        return {\n          height: heightStr,\n          lineHeight: heightStr,\n        };\n      });\n\n      function handleOk() {\n        emit('ok');\n      }\n\n      function handleClose() {\n        emit('close');\n      }\n      return { handleOk, prefixCls, handleClose, getStyle };\n    },\n  });\n</script>\n\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-basic-drawer-footer';\n  @footer-height: 60px;\n  .@{prefix-cls} {\n    position: absolute;\n    bottom: 0;\n    width: 100%;\n    padding: 0 12px 0 20px;\n    text-align: right;\n    background-color: @component-background;\n    border-top: 1px solid @border-color-base;\n\n    > * {\n      margin-right: 8px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Drawer/src/components/DrawerHeader.vue",
    "content": "<template>\n  <BasicTitle v-if=\"!isDetail\" :class=\"[prefixCls, 'is-drawer']\">\n    <slot name=\"title\"></slot>\n    {{ !$slots.title ? title : '' }}\n  </BasicTitle>\n\n  <div :class=\"[prefixCls, `${prefixCls}--detail`]\" v-else>\n    <span :class=\"`${prefixCls}__twrap`\">\n      <span @click=\"handleClose\" v-if=\"showDetailBack\">\n        <ArrowLeftOutlined :class=\"`${prefixCls}__back`\" />\n      </span>\n      <span v-if=\"title\">{{ title }}</span>\n    </span>\n\n    <span :class=\"`${prefixCls}__toolbar`\">\n      <slot name=\"titleToolbar\"></slot>\n    </span>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTitle } from '/@/components/Basic';\n  import { ArrowLeftOutlined } from '@ant-design/icons-vue';\n\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  import { propTypes } from '/@/utils/propTypes';\n  export default defineComponent({\n    name: 'BasicDrawerHeader',\n    components: { BasicTitle, ArrowLeftOutlined },\n    props: {\n      isDetail: propTypes.bool,\n      showDetailBack: propTypes.bool,\n      title: propTypes.string,\n    },\n    emits: ['close'],\n    setup(_, { emit }) {\n      const { prefixCls } = useDesign('basic-drawer-header');\n\n      function handleClose() {\n        emit('close');\n      }\n\n      return { prefixCls, handleClose };\n    },\n  });\n</script>\n\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-basic-drawer-header';\n  @footer-height: 60px;\n  .@{prefix-cls} {\n    display: flex;\n    height: 100%;\n    align-items: center;\n\n    &__back {\n      padding: 0 12px;\n      cursor: pointer;\n\n      &:hover {\n        color: @primary-color;\n      }\n    }\n\n    &__twrap {\n      flex: 1;\n    }\n\n    &__toolbar {\n      padding-right: 50px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Drawer/src/props.ts",
    "content": "import type { PropType } from 'vue';\n\nimport { useI18n } from '/@/hooks/web/useI18n';\nconst { t } = useI18n();\n\nexport const footerProps = {\n  confirmLoading: { type: Boolean },\n  /**\n   * @description: Show close button\n   */\n  showCancelBtn: { type: Boolean, default: true },\n  cancelButtonProps: Object as PropType<Recordable>,\n  cancelText: { type: String, default: t('common.cancelText') },\n  /**\n   * @description: Show confirmation button\n   */\n  showOkBtn: { type: Boolean, default: true },\n  okButtonProps: Object as PropType<Recordable>,\n  okText: { type: String, default: t('common.okText') },\n  okType: { type: String, default: 'primary' },\n  showFooter: { type: Boolean },\n  footerHeight: {\n    type: [String, Number] as PropType<string | number>,\n    default: 60,\n  },\n};\nexport const basicProps = {\n  class: {type: [String, Object, Array]},\n  isDetail: { type: Boolean },\n  title: { type: String, default: '' },\n  loadingText: { type: String },\n  showDetailBack: { type: Boolean, default: true },\n  visible: { type: Boolean },\n  open: { type: Boolean },\n  loading: { type: Boolean },\n  maskClosable: { type: Boolean, default: true },\n  getContainer: {\n    type: [Object, String, Function, Boolean] as PropType<any>,\n    default: () => 'body',\n  },\n  closeFunc: {\n    type: [Function, Object] as PropType<any>,\n    default: null,\n  },\n  destroyOnClose: { type: Boolean },\n  ...footerProps,\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Drawer/src/typing.ts",
    "content": "import type { ButtonProps } from 'ant-design-vue/lib/button/buttonTypes';\nimport type { CSSProperties, VNodeChild, ComputedRef } from 'vue';\nimport type { ScrollContainerOptions } from '/@/components/Container/index';\n\nexport interface DrawerInstance {\n  setDrawerProps: (props: Partial<DrawerProps> | boolean) => void;\n  emitVisible?: (visible: boolean, uid: number) => void;\n}\n\nexport interface ReturnMethods extends DrawerInstance {\n  openDrawer: <T = any>(visible?: boolean, data?: T, openOnSet?: boolean) => void;\n  closeDrawer: () => void;\n  getVisible?: ComputedRef<boolean>;\n  getOpen?: ComputedRef<boolean>;\n}\n\nexport type RegisterFn = (drawerInstance: DrawerInstance, uuid?: string) => void;\n\nexport interface ReturnInnerMethods extends DrawerInstance {\n  closeDrawer: () => void;\n  changeLoading: (loading: boolean) => void;\n  changeOkLoading: (loading: boolean) => void;\n  getVisible?: ComputedRef<boolean>;\n  getOpen?: ComputedRef<boolean>;\n}\n\nexport type UseDrawerReturnType = [RegisterFn, ReturnMethods];\n\nexport type UseDrawerInnerReturnType = [RegisterFn, ReturnInnerMethods];\n\nexport interface DrawerFooterProps {\n  showOkBtn: boolean;\n  showCancelBtn: boolean;\n  /**\n   * Text of the Cancel button\n   * @default 'cancel'\n   * @type string\n   */\n  cancelText: string;\n  /**\n   * Text of the OK button\n   * @default 'OK'\n   * @type string\n   */\n  okText: string;\n\n  /**\n   * Button type of the OK button\n   * @default 'primary'\n   * @type string\n   */\n  okType: 'primary' | 'danger' | 'dashed' | 'ghost' | 'default';\n  /**\n   * The ok button props, follow jsx rules\n   * @type object\n   */\n  okButtonProps: { props: ButtonProps; on: {} };\n\n  /**\n   * The cancel button props, follow jsx rules\n   * @type object\n   */\n  cancelButtonProps: { props: ButtonProps; on: {} };\n  /**\n   * Whether to apply loading visual effect for OK button or not\n   * @default false\n   * @type boolean\n   */\n  confirmLoading: boolean;\n\n  showFooter: boolean;\n  footerHeight: string | number;\n}\nexport interface DrawerProps extends DrawerFooterProps {\n  isDetail?: boolean;\n  loading?: boolean;\n  showDetailBack?: boolean;\n  visible?: boolean;\n  open?: boolean;\n  /**\n   * Built-in ScrollContainer component configuration\n   * @type ScrollContainerOptions\n   */\n  scrollOptions?: ScrollContainerOptions;\n  closeFunc?: () => Promise<any>;\n  triggerWindowResize?: boolean;\n  /**\n   * Whether a close (x) button is visible on top right of the Drawer dialog or not.\n   * @default true\n   * @type boolean\n   */\n  closable?: boolean;\n\n  /**\n   * Whether to unmount child components on closing drawer or not.\n   * @default false\n   * @type boolean\n   */\n  destroyOnClose?: boolean;\n\n  /**\n   * Return the mounted node for Drawer.\n   * @default 'body'\n   * @type any ( HTMLElement| () => HTMLElement | string)\n   */\n  getContainer?: () => HTMLElement | string;\n\n  /**\n   * Whether to show mask or not.\n   * @default true\n   * @type boolean\n   */\n  mask?: boolean;\n\n  /**\n   * Clicking on the mask (area outside the Drawer) to close the Drawer or not.\n   * @default true\n   * @type boolean\n   */\n  maskClosable?: boolean;\n\n  /**\n   * Style for Drawer's mask element.\n   * @default {}\n   * @type object\n   */\n  maskStyle?: CSSProperties;\n\n  /**\n   * The title for Drawer.\n   * @type any (string | slot)\n   */\n  title?: VNodeChild | JSX.Element;\n\n  /**\n   * The class name of the container of the Drawer dialog.\n   * @type string\n   */\n  class?: string;\n  // 兼容老版本的写法（后续可能会删除，优先写class）\n  wrapClassName?: string;\n\n  /**\n   * Style of wrapper element which **contains mask** compare to `drawerStyle`\n   * @type object\n   */\n  wrapStyle?: CSSProperties;\n\n  /**\n   * Style of the popup layer element\n   * @type object\n   */\n  drawerStyle?: CSSProperties;\n\n  /**\n   * Style of floating layer, typically used for adjusting its position.\n   * @type object\n   */\n  bodyStyle?: CSSProperties;\n  headerStyle?: CSSProperties;\n\n  /**\n   * Width of the Drawer dialog.\n   * @default 256\n   * @type string | number\n   */\n  width?: string | number;\n\n  /**\n   * placement is top or bottom, height of the Drawer dialog.\n   * @type string | number\n   */\n  height?: string | number;\n\n  /**\n   * The z-index of the Drawer.\n   * @default 1000\n   * @type number\n   */\n  zIndex?: number;\n\n  /**\n   * The placement of the Drawer.\n   * @default 'right'\n   * @type string\n   */\n  placement?: 'top' | 'right' | 'bottom' | 'left';\n  afterVisibleChange?: (visible?: boolean) => void;\n  keyboard?: boolean;\n  /**\n   * Specify a callback that will be called when a user clicks mask, close button or Cancel button.\n   */\n  onClose?: (e?: Event) => void;\n}\nexport interface DrawerActionType {\n  scrollBottom: () => void;\n  scrollTo: (to: number) => void;\n  getScrollWrap: () => Element | null;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Drawer/src/useDrawer.ts",
    "content": "import type { UseDrawerReturnType, DrawerInstance, ReturnMethods, DrawerProps, UseDrawerInnerReturnType } from './typing';\nimport { ref, getCurrentInstance, unref, reactive, watchEffect, nextTick, toRaw, computed } from 'vue';\nimport { isProdMode } from '/@/utils/env';\nimport { isFunction } from '/@/utils/is';\nimport { tryOnUnmounted } from '@vueuse/core';\nimport { isEqual } from 'lodash-es';\nimport { error } from '/@/utils/log';\n\nconst dataTransferRef = reactive<any>({});\n\nconst visibleData = reactive<{ [key: number]: boolean }>({});\n\n/**\n * @description: Applicable to separate drawer and call outside\n */\nexport function useDrawer(): UseDrawerReturnType {\n  if (!getCurrentInstance()) {\n    throw new Error('useDrawer() can only be used inside setup() or functional components!');\n  }\n  const drawer = ref<DrawerInstance | null>(null);\n  const loaded = ref<Nullable<boolean>>(false);\n  const uid = ref<string>('');\n\n  function register(drawerInstance: DrawerInstance, uuid: string) {\n    isProdMode() &&\n      tryOnUnmounted(() => {\n        drawer.value = null;\n        loaded.value = null;\n        dataTransferRef[unref(uid)] = null;\n      });\n\n    if (unref(loaded) && isProdMode() && drawerInstance === unref(drawer)) {\n      return;\n    }\n    uid.value = uuid;\n    drawer.value = drawerInstance;\n    loaded.value = true;\n\n    drawerInstance.emitVisible = (visible: boolean, uid: number) => {\n      visibleData[uid] = visible;\n    };\n  }\n\n  const getInstance = () => {\n    const instance = unref(drawer);\n    if (!instance) {\n      error('useDrawer instance is undefined!');\n    }\n    return instance;\n  };\n\n  const methods: ReturnMethods = {\n    setDrawerProps: (props: Partial<DrawerProps>): void => {\n      getInstance()?.setDrawerProps(props);\n    },\n\n    getVisible: computed((): boolean => {\n      return visibleData[~~unref(uid)];\n    }),\n\n    getOpen: computed((): boolean => {\n      return visibleData[~~unref(uid)];\n    }),\n\n    openDrawer: <T = any>(visible = true, data?: T, openOnSet = true): void => {\n      // 代码逻辑说明: 【QQYUN-6366】升级到antd4.x\n      getInstance()?.setDrawerProps({\n        open: visible,\n      });\n      if (!data) return;\n\n      if (openOnSet) {\n        dataTransferRef[unref(uid)] = null;\n        dataTransferRef[unref(uid)] = toRaw(data);\n        return;\n      }\n      const equal = isEqual(toRaw(dataTransferRef[unref(uid)]), toRaw(data));\n      if (!equal) {\n        dataTransferRef[unref(uid)] = toRaw(data);\n      }\n    },\n    closeDrawer: () => {\n      // 代码逻辑说明: 【QQYUN-6366】升级到antd4.x\n      getInstance()?.setDrawerProps({ open: false });\n    },\n  };\n\n  return [register, methods];\n}\n\nexport const useDrawerInner = (callbackFn?: Fn): UseDrawerInnerReturnType => {\n  const drawerInstanceRef = ref<Nullable<DrawerInstance>>(null);\n  const currentInstance = getCurrentInstance();\n  const uidRef = ref<string>('');\n\n  if (!getCurrentInstance()) {\n    throw new Error('useDrawerInner() can only be used inside setup() or functional components!');\n  }\n\n  const getInstance = () => {\n    const instance = unref(drawerInstanceRef);\n    if (!instance) {\n      error('useDrawerInner instance is undefined!');\n      return;\n    }\n    return instance;\n  };\n\n  const register = (modalInstance: DrawerInstance, uuid: string) => {\n    isProdMode() &&\n      tryOnUnmounted(() => {\n        drawerInstanceRef.value = null;\n      });\n\n    uidRef.value = uuid;\n    drawerInstanceRef.value = modalInstance;\n    currentInstance?.emit('register', modalInstance, uuid);\n  };\n\n  watchEffect(() => {\n    const data = dataTransferRef[unref(uidRef)];\n    if (!data) return;\n    if (!callbackFn || !isFunction(callbackFn)) return;\n    nextTick(() => {\n      callbackFn(data);\n    });\n  });\n\n  return [\n    register,\n    {\n      changeLoading: (loading = true) => {\n        getInstance()?.setDrawerProps({ loading });\n      },\n\n      changeOkLoading: (loading = true) => {\n        getInstance()?.setDrawerProps({ confirmLoading: loading });\n      },\n      getVisible: computed((): boolean => {\n        return visibleData[~~unref(uidRef)];\n      }),\n      getOpen: computed((): boolean => {\n        return visibleData[~~unref(uidRef)];\n      }),\n      closeDrawer: () => {\n        getInstance()?.setDrawerProps({ open: false });\n      },\n\n      setDrawerProps: (props: Partial<DrawerProps>) => {\n        getInstance()?.setDrawerProps(props);\n      },\n    },\n  ];\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Dropdown/index.ts",
    "content": "import { withInstall } from '/@/utils';\nimport dropdown from './src/Dropdown.vue';\n\nexport * from './src/typing';\nexport const Dropdown = withInstall(dropdown);\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Dropdown/src/Dropdown.vue",
    "content": "<template>\n  <a-dropdown :class=\"[prefixCls]\" :trigger=\"trigger\" v-bind=\"$attrs\">\n    <span>\n      <slot></slot>\n    </span>\n    <template #overlay>\n      <a-menu :class=\"[`${prefixCls}-menu`]\" :selectedKeys=\"selectedKeys\">\n        <template v-for=\"item in dropMenuList\" :key=\"`${item.event}`\">\n          <a-menu-item\n            v-if=\"!item.hide\"\n            v-bind=\"getAttr(item.event)\"\n            @click=\"handleClickMenu(item)\"\n            :disabled=\"item.disabled\"\n            :class=\"[{ 'is-pop-confirm': item.popConfirm }, item.class ?? []]\"\n          >\n            <a-popconfirm :disabled=\"item.disabled\" v-if=\"popconfirm && item.popConfirm\" v-bind=\"getPopConfirmAttrs(item.popConfirm)\">\n              <template #icon v-if=\"item.popConfirm.icon\">\n                <Icon v-if=\"item.iconColor\" :icon=\"item.popConfirm.icon\" :color=\"item.iconColor\" />\n                <Icon v-else :icon=\"item.popConfirm.icon\" />\n              </template>\n              <div class=\"dropdown-event-area\">\n                <Icon :icon=\"item.icon\" v-if=\"item.icon && item.iconColor\" :color=\"item.iconColor\" />\n                <Icon :icon=\"item.icon\" v-else-if=\"item.icon\" />\n                <span class=\"ml-1\">{{ item.text }}</span>\n              </div>\n            </a-popconfirm>\n            <!--  设置动态插槽   -->\n            <template v-else-if=\"item.slot\">\n              <slot :name=\"item.slot\" :label=\"item.text\"></slot>\n            </template>\n            <template v-else>\n              <Icon :icon=\"item.icon\" v-if=\"item.icon && item.iconColor\" :color=\"item.iconColor\" />\n              <Icon :icon=\"item.icon\" v-else-if=\"item.icon\" />\n              <span class=\"ml-1\">{{ item.text }}</span>\n            </template>\n          </a-menu-item>\n          <a-menu-divider v-if=\"item.divider\" :key=\"`d-${item.event}`\" />\n        </template>\n      </a-menu>\n    </template>\n  </a-dropdown>\n</template>\n\n<script lang=\"ts\" setup>\n  import { computed, PropType, ref } from 'vue';\n  import type { DropMenu } from './typing';\n  import { Dropdown, Menu, Popconfirm } from 'ant-design-vue';\n  import { Icon } from '/@/components/Icon';\n  import { omit } from 'lodash-es';\n  import { isFunction } from '/@/utils/is';\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  const ADropdown = Dropdown;\n  const AMenu = Menu;\n  const AMenuItem = Menu.Item;\n  const AMenuDivider = Menu.Divider;\n  const APopconfirm = Popconfirm;\n\n  const { prefixCls } = useDesign('basic-dropdown');\n  const props = defineProps({\n    popconfirm: Boolean,\n    /**\n     * the trigger mode which executes the drop-down action\n     * @default ['hover']\n     * @type string[]\n     */\n    trigger: {\n      type: [Array] as PropType<('contextmenu' | 'click' | 'hover')[]>,\n      default: () => {\n        return ['contextmenu'];\n      },\n    },\n    dropMenuList: {\n      type: Array as PropType<(DropMenu & Recordable)[]>,\n      default: () => [],\n    },\n    selectedKeys: {\n      type: Array as PropType<string[]>,\n      default: () => [],\n    },\n  });\n\n  const emit = defineEmits(['menuEvent']);\n\n  function handleClickMenu(item: DropMenu) {\n    const { event } = item;\n    const menu = props.dropMenuList.find((item) => `${item.event}` === `${event}`);\n    emit('menuEvent', menu);\n    item.onClick?.();\n  }\n\n  const getPopConfirmAttrs = computed(() => {\n    return (attrs) => {\n      const originAttrs = omit(attrs, ['confirm', 'cancel', 'icon']);\n      if (!attrs.onConfirm && attrs.confirm && isFunction(attrs.confirm)) originAttrs['onConfirm'] = attrs.confirm;\n      if (!attrs.onCancel && attrs.cancel && isFunction(attrs.cancel)) originAttrs['onCancel'] = attrs.cancel;\n      return originAttrs;\n    };\n  });\n\n  const getAttr = (key: string | number) => ({ key });\n</script>\n\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-basic-dropdown';\n\n  .@{prefix-cls} {\n    // 代码逻辑说明: 【VUEN-180】更多下拉菜单，只有点到字上才有效，点到空白处什么都不会发生，体验不好\n    &-menu .ant-dropdown-menu-item.is-pop-confirm {\n      padding: 0;\n\n      .dropdown-event-area {\n        padding: 5px 12px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Dropdown/src/typing.ts",
    "content": "export interface DropMenu {\n  onClick?: Fn;\n  to?: string;\n  icon?: string;\n  event: string | number;\n  text: string;\n  disabled?: boolean;\n  // 是否隐藏\n  hide?: boolean;\n  divider?: boolean;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/index.ts",
    "content": "import BasicForm from './src/BasicForm.vue';\n\nexport * from './src/types/form';\nexport * from './src/types/formItem';\n\nexport { useComponentRegister } from './src/hooks/useComponentRegister';\nexport { useForm } from './src/hooks/useForm';\n\nexport { default as ApiSelect } from './src/components/ApiSelect.vue';\nexport { default as RadioButtonGroup } from './src/components/RadioButtonGroup.vue';\nexport { default as ApiTreeSelect } from './src/components/ApiTreeSelect.vue';\nexport { default as ApiRadioGroup } from './src/components/ApiRadioGroup.vue';\n//Jeecg自定义组件\nexport { default as JAreaLinkage } from './src/jeecg/components/JAreaLinkage.vue';\nexport { default as JSelectUser } from './src/jeecg/components/JSelectUser.vue';\nexport { default as JSelectDept } from './src/jeecg/components/JSelectDept.vue';\nexport { default as JSelectDepartPost } from './src/jeecg/components/JSelectDepartPost.vue';\nexport { default as JSelectUserByDeptPost } from './src/jeecg/components/JSelectUserByDeptPost.vue';\nexport { default as JCodeEditor } from './src/jeecg/components/JCodeEditor.vue';\nexport { default as JCategorySelect } from './src/jeecg/components/JCategorySelect.vue';\nexport { default as JSelectMultiple } from './src/jeecg/components/JSelectMultiple.vue';\nexport { default as JPopup } from './src/jeecg/components/JPopup.vue';\nexport { default as JAreaSelect } from './src/jeecg/components/JAreaSelect.vue';\nexport { JEasyCron, JEasyCronInner, JEasyCronModal } from '/@/components/Form/src/jeecg/components/JEasyCron';\nexport { default as JCheckbox } from './src/jeecg/components/JCheckbox.vue';\nexport { default as JInput } from './src/jeecg/components/JInput.vue';\nexport { default as JEllipsis } from './src/jeecg/components/JEllipsis.vue';\nexport { default as JDictSelectTag } from './src/jeecg/components/JDictSelectTag.vue';\nexport { default as JTreeSelect } from './src/jeecg/components/JTreeSelect.vue';\nexport { default as JSearchSelect } from './src/jeecg/components/JSearchSelect.vue';\nexport { default as JSelectUserByDept } from './src/jeecg/components/JSelectUserByDept.vue';\nexport { default as JSelectUserByDepartment } from './src/jeecg/components/JSelectUserByDepartment.vue';\nexport { default as JEditor } from './src/jeecg/components/JEditor.vue';\nexport { default as JImageUpload } from './src/jeecg/components/JImageUpload.vue';\n// Jeecg自定义校验\nexport { JCronValidator } from '/@/components/Form/src/jeecg/components/JEasyCron';\n\nexport { BasicForm };\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/BasicForm.vue",
    "content": "<template>\n  <Form v-bind=\"getBindValue\" :class=\"getFormClass\" ref=\"formElRef\" :model=\"formModel\" @keypress.enter=\"handleEnterPress\">\n    <Row v-bind=\"getRow\">\n      <slot name=\"formHeader\"></slot>\n      <template v-for=\"schema in getSchema\" :key=\"schema.field\">\n        <FormItem\n          :tableAction=\"tableAction\"\n          :formActionType=\"formActionType\"\n          :schema=\"schema\"\n          :formProps=\"getProps\"\n          :allDefaultValues=\"defaultValueRef\"\n          :formModel=\"formModel\"\n          :formName=\"getBindValue.name\"\n          :source=\"getBindValue.source\"\n          :setFormModel=\"setFormModel\"\n          :validateFields=\"validateFields\"\n          :clearValidate=\"clearValidate\"\n          v-auth=\"schema.auth\"\n        >\n          <template #[item]=\"data\" v-for=\"item in Object.keys($slots)\">\n            <slot :name=\"item\" v-bind=\"data || {}\"></slot>\n          </template>\n        </FormItem>\n      </template>\n\n      <FormAction v-bind=\"getFormActionBindProps\" @toggle-advanced=\"handleToggleAdvanced\">\n        <template #[item]=\"data\" v-for=\"item in ['resetBefore', 'submitBefore', 'advanceBefore', 'advanceAfter']\">\n          <slot :name=\"item\" v-bind=\"data || {}\"></slot>\n        </template>\n      </FormAction>\n      <slot name=\"formFooter\"></slot>\n    </Row>\n  </Form>\n</template>\n<script lang=\"ts\">\n  import type { FormActionType, FormProps, FormSchema } from './types/form';\n  import type { AdvanceState } from './types/hooks';\n  import type { Ref } from 'vue';\n\n  import { defineComponent, reactive, ref, computed, unref, onMounted, watch, nextTick } from 'vue';\n  import { Form, Row } from 'ant-design-vue';\n  import FormItem from './components/FormItem.vue';\n  import FormAction from './components/FormAction.vue';\n\n  import { dateItemType } from './helper';\n  import { dateUtil } from '/@/utils/dateUtil';\n\n  // import { cloneDeep } from 'lodash-es';\n  import { deepMerge } from '/@/utils';\n\n  import { useFormValues } from './hooks/useFormValues';\n  import useAdvanced from './hooks/useAdvanced';\n  import { useFormEvents } from './hooks/useFormEvents';\n  import { createFormContext } from './hooks/useFormContext';\n  import { useAutoFocus } from './hooks/useAutoFocus';\n  import { useModalContext } from '/@/components/Modal';\n\n  import { basicProps } from './props';\n  import componentSetting from '/@/settings/componentSetting';\n\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import dayjs from 'dayjs';\n  import { useDebounceFn } from '@vueuse/core';\n  import { isFunction, isObject } from '/@/utils/is';\n\n  export default defineComponent({\n    name: 'BasicForm',\n    components: { FormItem, Form, Row, FormAction },\n    props: basicProps,\n    emits: ['advanced-change', 'reset', 'submit', 'register'],\n    setup(props, { emit, attrs }) {\n      const formModel = reactive<Recordable>({});\n      const modalFn = useModalContext();\n\n      const advanceState = reactive<AdvanceState>({\n        // 默认是收起状态\n        isAdvanced: false,\n        hideAdvanceBtn: true,\n        isLoad: false,\n        actionSpan: 6,\n      });\n\n      const defaultValueRef = ref<Recordable>({});\n      const isInitedDefaultRef = ref(false);\n      const propsRef = ref<Partial<FormProps>>({});\n      const schemaRef = ref<Nullable<FormSchema[]>>(null);\n      const formElRef = ref<Nullable<FormActionType>>(null);\n\n      const { prefixCls } = useDesign('basic-form');\n\n      // Get the basic configuration of the form\n      const getProps = computed((): FormProps => {\n        let mergeProps = { ...props, ...unref(propsRef) } as FormProps;\n        // 代码逻辑说明: 如果用户设置了labelWidth，则使labelCol失效，解决labelWidth设置无效的问题\n        if (mergeProps.labelWidth) {\n          mergeProps.labelCol = undefined;\n        }\n        // 代码逻辑说明: 【QQYUN-6566】BasicForm支持一行显示(inline)\n        if (mergeProps.layout === 'inline') {\n          if (mergeProps.labelCol === componentSetting.form.labelCol) {\n            mergeProps.labelCol = undefined;\n          }\n          if (mergeProps.wrapperCol === componentSetting.form.wrapperCol) {\n            mergeProps.wrapperCol = undefined;\n          }\n        }\n        return mergeProps;\n      });\n\n      const getFormClass = computed(() => {\n        return [\n          prefixCls,\n          {\n            [`${prefixCls}--compact`]: unref(getProps).compact,\n            'jeecg-form-detail-effect': unref(getProps).disabled\n          },\n        ];\n      });\n\n      // Get uniform row style and Row configuration for the entire form\n      const getRow = computed((): Recordable => {\n        const { baseRowStyle = {}, rowProps } = unref(getProps);\n        return {\n          style: baseRowStyle,\n          ...rowProps,\n        };\n      });\n\n      const getBindValue = computed(() => {\n        const bindValue = { ...attrs, ...props, ...unref(getProps) } as Recordable;\n        // 代码逻辑说明: 【issues/8484】分类字典中的新增弹窗的label点击会触发查询区域的input\n        if (bindValue.name === undefined && bindValue.source === 'table-query') {\n          bindValue.name = 'top-query-form';\n        }\n        return bindValue;\n      });\n\n      const getSchema = computed((): FormSchema[] => {\n        const schemas: FormSchema[] = unref(schemaRef) || (unref(getProps).schemas as any);\n        for (const schema of schemas) {\n          const { defaultValue, component, componentProps } = schema;\n          // handle date type\n          if (defaultValue && dateItemType.includes(component)) {\n            // 代码逻辑说明: 【issues/435】代码生成的日期控件赋默认值报错------------\n            let valueFormat:string = \"\";\n            // 代码逻辑说明: 【issues/8683】DatePicker组件的componentProps使用函数形式时初始值获取不对\n            if(isObject(componentProps)) {\n              valueFormat = componentProps?.valueFormat;\n            } else if (isFunction(componentProps)) {\n              try {\n                // @ts-ignore\n                valueFormat = componentProps({schema, tableAction: props.tableAction, formModel})?.valueFormat;\n              } catch (error) {\n              }\n            }\n            // update-end--author:liaozhiyang---date:20250818---for【issues/8683】DatePicker组件的componentProps使用函数形式时初始值获取不对\n            if(!valueFormat){\n              console.warn(\"未配置valueFormat,可能导致格式化错误！\");\n            }\n            if (!Array.isArray(defaultValue)) {\n              // 代码逻辑说明: [issues/215]列表页查询框（日期选择框）设置初始时间，一进入页面时，后台报日期转换类型错误的------------\n              if(valueFormat){\n                // schema.defaultValue = dateUtil(defaultValue).format(valueFormat);\n                // 代码逻辑说明: 【TV360X-346 】时间组件填写默认值有问题\n                schema.defaultValue = dateUtil(defaultValue, valueFormat).format(valueFormat);\n              }else{\n                schema.defaultValue = dateUtil(defaultValue);\n              }\n            } else {\n              const def: dayjs.Dayjs[] = [];\n              defaultValue.forEach((item) => {\n                // 代码逻辑说明: [issues/215]列表页查询框（日期选择框）设置初始时间，一进入页面时，后台报日期转换类型错误的------------\n                if(valueFormat){\n                  // 代码逻辑说明: 【TV360X-346 】时间组件填写默认值有问题\n                  def.push(dateUtil(item, valueFormat).format(valueFormat));\n                }else{\n                  def.push(dateUtil(item));\n                }\n              });\n              // 代码逻辑说明: 【issues/1114】rangepicker等时间控件报错（vue3.4以上版本有问题）\n              def.forEach((item, index) => {\n                defaultValue[index] = item;\n              });\n            }\n          }\n        }\n        if (unref(getProps).showAdvancedButton) {\n          return schemas.filter((schema) => schema.component !== 'Divider') as FormSchema[];\n        } else {\n          return schemas as FormSchema[];\n        }\n      });\n\n      const { handleToggleAdvanced } = useAdvanced({\n        advanceState,\n        emit,\n        getProps,\n        getSchema,\n        formModel,\n        defaultValueRef,\n      });\n\n      const { handleFormValues, initDefault } = useFormValues({\n        getProps,\n        defaultValueRef,\n        getSchema,\n        formModel,\n      });\n\n      useAutoFocus({\n        getSchema,\n        getProps,\n        isInitedDefault: isInitedDefaultRef,\n        formElRef: formElRef as Ref<FormActionType>,\n      });\n\n      const {\n        handleSubmit,\n        setFieldsValue,\n        clearValidate,\n        validate,\n        validateFields,\n        getFieldsValue,\n        updateSchema,\n        resetSchema,\n        getSchemaByField,\n        appendSchemaByField,\n        removeSchemaByFiled,\n        resetFields,\n        scrollToField,\n      } = useFormEvents({\n        emit,\n        getProps,\n        formModel,\n        getSchema,\n        defaultValueRef,\n        formElRef: formElRef as Ref<FormActionType>,\n        schemaRef: schemaRef as Ref<FormSchema[]>,\n        handleFormValues,\n      });\n\n      createFormContext({\n        resetAction: resetFields,\n        submitAction: handleSubmit,\n      });\n\n      watch(\n        () => unref(getProps).model,\n        () => {\n          const { model } = unref(getProps);\n          if (!model) return;\n          setFieldsValue(model);\n        },\n        {\n          immediate: true,\n        }\n      );\n\n      watch(\n        () => unref(getProps).schemas,\n        (schemas) => {\n          resetSchema(schemas ?? []);\n        }\n      );\n\n      watch(\n        () => getSchema.value,\n        (schema) => {\n          nextTick(() => {\n            //  Solve the problem of modal adaptive height calculation when the form is placed in the modal\n            modalFn?.redoModalHeight?.();\n          });\n          if (unref(isInitedDefaultRef)) {\n            return;\n          }\n          if (schema?.length) {\n            initDefault();\n            isInitedDefaultRef.value = true;\n          }\n        }\n      );\n\n      async function setProps(formProps: Partial<FormProps>): Promise<void> {\n        propsRef.value = deepMerge(unref(propsRef) || {}, formProps);\n      }\n\n      // 代码逻辑说明: QQYUN-3121 【优化】表单视图问题#scott测试 8、此功能未实现\n      const onFormSubmitWhenChange = useDebounceFn(handleSubmit, 300);\n      function setFormModel(key: string, value: any) {\n        formModel[key] = value;\n        // const { validateTrigger } = unref(getBindValue);\n        // if (!validateTrigger || validateTrigger === 'change') {\n        //   validateFields([key]).catch((_) => {});\n        // }\n        if(props.autoSearch === true){\n          onFormSubmitWhenChange();\n        }\n      }\n\n      function handleEnterPress(e: KeyboardEvent) {\n        const { autoSubmitOnEnter } = unref(getProps);\n        if (!autoSubmitOnEnter) return;\n        if (e.key === 'Enter' && e.target && e.target instanceof HTMLElement) {\n          const target: HTMLElement = e.target as HTMLElement;\n          if (target && target.tagName && target.tagName.toUpperCase() == 'INPUT') {\n            handleSubmit();\n          }\n        }\n      }\n\n      /**\n       * 获取 componentProps，处理可能是函数的情况\n       * @param schema\n       */\n      function getSchemaComponentProps(schema: FormSchema) {\n        if (typeof schema.componentProps === 'function') {\n          return schema.componentProps({\n            schema,\n            tableAction: props.tableAction,\n            formActionType,\n            formModel,\n          })\n        }\n        return schema.componentProps\n      }\n\n      const formActionType: Partial<FormActionType> = {\n        getFieldsValue,\n        setFieldsValue,\n        resetFields,\n        updateSchema,\n        resetSchema,\n        setProps,\n        getProps,\n        getSchemaByField,\n        removeSchemaByFiled,\n        appendSchemaByField,\n        clearValidate,\n        validateFields,\n        validate,\n        submit: handleSubmit,\n        scrollToField: scrollToField,\n        getSchemaComponentProps,\n      };\n\n      onMounted(() => {\n        initDefault();\n        emit('register', formActionType);\n      });\n\n      return {\n        getBindValue,\n        handleToggleAdvanced,\n        handleEnterPress,\n        formModel,\n        defaultValueRef,\n        advanceState,\n        getRow,\n        getProps,\n        formElRef,\n        getSchema,\n        formActionType: formActionType as any,\n        setFormModel,\n        getFormClass,\n        getFormActionBindProps: computed((): Recordable => ({ ...getProps.value, ...advanceState })),\n        ...formActionType,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-basic-form';\n\n  .@{prefix-cls} {\n    .ant-form-item {\n      &-label label::after {\n        margin: 0 6px 0 2px;\n      }\n\n      &-with-help {\n        margin-bottom: 0;\n      }\n      //&:not(.ant-form-item-with-help) {\n      //  margin-bottom: 24px;\n      //}\n      // 代码逻辑说明: 【TV360X-1420】校验时闪动\n      &-has-error {\n        margin-bottom: 24px;\n      }\n\n      // 表单组件中间件样式\n      .j-form-item-middleware {\n        flex: 1;\n        width: 100%\n      }\n\n      &.suffix-item {\n        .ant-form-item-children {\n          display: flex;\n        }\n\n        .ant-form-item-control {\n          margin-top: 4px;\n        }\n\n        // 【QQYUN-12876】当紧凑型 suffix 时，表单组件中间件的宽度不占满\n        &.suffix-compact .j-form-item-middleware {\n          flex: unset;\n          width: auto;\n        }\n\n        .suffix {\n          display: inline-flex;\n          padding-left: 6px;\n          margin-top: 1px;\n          line-height: 1;\n          align-items: center;\n        }\n      }\n    }\n    /*【美化表单】form的字体改小一号*/\n/*    .ant-form-item-label > label{\n      font-size: 13px;\n    }\n    .ant-form-item .ant-select {\n      font-size: 13px;\n    }\n    .ant-select-item-option-selected {\n      font-size: 13px;\n    }\n    .ant-select-item-option-content {\n      font-size: 13px;\n    }\n    .ant-input {\n      font-size: 13px;\n    }*/\n    /*【美化表单】form的字体改小一号*/\n    \n    .ant-form-explain {\n      font-size: 14px;\n    }\n\n    &--compact {\n      .ant-form-item {\n        margin-bottom: 8px !important;\n      }\n    }\n    // 代码逻辑说明: 【QQYUN-6566】BasicForm支持一行显示(inline)\n    &.ant-form-inline {\n      & > .ant-row {\n        .ant-col { width:auto !important; }\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/componentMap.ts",
    "content": "/**\n * 目前实现了异步加载的组件清单 ：\n * JAreaLinkage\n * JEditor\n * JMarkdownEditor\n * JCodeEditor\n * JEasyCron\n */\nimport type { Component } from 'vue';\nimport type { ComponentType } from './types/index';\nimport { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n/**\n * Component list, register here to setting it in the form\n */\nimport {\n  Input,\n  Select,\n  Radio,\n  Checkbox,\n  AutoComplete,\n  Cascader,\n  DatePicker,\n  InputNumber,\n  Switch,\n  TimePicker,\n  TreeSelect,\n  Slider,\n  Rate,\n  Divider,\n} from 'ant-design-vue';\nimport ApiRadioGroup from './components/ApiRadioGroup.vue';\nimport RadioButtonGroup from './components/RadioButtonGroup.vue';\nimport ApiSelect from './components/ApiSelect.vue';\nimport ApiTreeSelect from './components/ApiTreeSelect.vue';\nimport { BasicUpload } from '/@/components/Upload';\nimport { StrengthMeter } from '/@/components/StrengthMeter';\nimport { IconPicker } from '/@/components/Icon';\nimport { CountdownInput } from '/@/components/CountDown';\n//自定义组件\n// import JAreaLinkage from './jeecg/components/JAreaLinkage.vue';\nimport JSelectUser from './jeecg/components/JSelectUser.vue';\nimport JSelectPosition from './jeecg/components/JSelectPosition.vue';\nimport JSelectRole from './jeecg/components/JSelectRole.vue';\nimport JImageUpload from './jeecg/components/JImageUpload.vue';\nimport JDictSelectTag from './jeecg/components/JDictSelectTag.vue';\nimport JSelectDept from './jeecg/components/JSelectDept.vue';\nimport JSelectDepartPost from './jeecg/components/JSelectDepartPost.vue';\nimport JAreaSelect from './jeecg/components/JAreaSelect.vue';\nimport JEditor from './jeecg/components/JEditor.vue';\n// import JMarkdownEditor from './jeecg/components/JMarkdownEditor.vue';\nimport JSelectInput from './jeecg/components/JSelectInput.vue';\n// import JCodeEditor from './jeecg/components/JCodeEditor.vue';\nimport JCategorySelect from './jeecg/components/JCategorySelect.vue';\nimport JSelectMultiple from './jeecg/components/JSelectMultiple.vue';\nimport JPopup from './jeecg/components/JPopup.vue';\n// 代码逻辑说明: 【QQYUN-7961】popupDict字典\nimport JPopupDict from './jeecg/components/JPopupDict.vue';\nimport JSwitch from './jeecg/components/JSwitch.vue';\nimport JTreeDict from './jeecg/components/JTreeDict.vue';\nimport JInputPop from './jeecg/components/JInputPop.vue';\n// import { JEasyCron } from './jeecg/components/JEasyCron';\nimport JCheckbox from './jeecg/components/JCheckbox.vue';\nimport JInput from './jeecg/components/JInput.vue';\nimport JTreeSelect from './jeecg/components/JTreeSelect.vue';\nimport JEllipsis from './jeecg/components/JEllipsis.vue';\nimport JSelectUserByDept from './jeecg/components/JSelectUserByDept.vue';\nimport JSelectUserByDepartment from './jeecg/components/JSelectUserByDepartment.vue';\nimport JLinkTableCard from './jeecg/components/JLinkTableCard/JLinkTableCard.vue';\n\nimport JUpload from './jeecg/components/JUpload/JUpload.vue';\nimport JSearchSelect from './jeecg/components/JSearchSelect.vue';\nimport JAddInput from './jeecg/components/JAddInput.vue';\nimport { Time } from '/@/components/Time';\nimport JRangeNumber from './jeecg/components/JRangeNumber.vue';\nimport UserSelect from './jeecg/components/userSelect/index.vue';\nimport JRangeDate from './jeecg/components/JRangeDate.vue'\nimport JRangeTime from './jeecg/components/JRangeTime.vue'\nimport JInputSelect from './jeecg/components/JInputSelect.vue'\nimport RoleSelectInput from './jeecg/components/roleSelect/RoleSelectInput.vue';\nimport JSelectUserByDeptPost from './jeecg/components/JSelectUserByDeptPost.vue';\nimport JDatePickerMultiple from './jeecg/components/JDatePickerMultiple.vue';\nimport {DatePickerInFilter, CascaderPcaInFilter} from \"@/components/InFilter\";\n\nconst componentMap = new Map<ComponentType, Component>();\n\ncomponentMap.set('Time', Time);\ncomponentMap.set('Input', Input);\ncomponentMap.set('InputGroup', Input.Group);\ncomponentMap.set('InputPassword', Input.Password);\ncomponentMap.set('InputSearch', Input.Search);\ncomponentMap.set('InputTextArea', Input.TextArea);\ncomponentMap.set('InputNumber', InputNumber);\ncomponentMap.set('AutoComplete', AutoComplete);\n\ncomponentMap.set('Select', Select);\ncomponentMap.set('ApiSelect', ApiSelect);\ncomponentMap.set('TreeSelect', TreeSelect);\ncomponentMap.set('ApiTreeSelect', ApiTreeSelect);\ncomponentMap.set('ApiRadioGroup', ApiRadioGroup);\ncomponentMap.set('Switch', Switch);\ncomponentMap.set('RadioButtonGroup', RadioButtonGroup);\ncomponentMap.set('RadioGroup', Radio.Group);\ncomponentMap.set('Checkbox', Checkbox);\ncomponentMap.set('CheckboxGroup', Checkbox.Group);\ncomponentMap.set('Cascader', Cascader);\ncomponentMap.set('Slider', Slider);\ncomponentMap.set('Rate', Rate);\n\ncomponentMap.set('DatePicker', DatePicker);\ncomponentMap.set('MonthPicker', DatePicker.MonthPicker);\ncomponentMap.set('RangePicker', DatePicker.RangePicker);\ncomponentMap.set('WeekPicker', DatePicker.WeekPicker);\ncomponentMap.set('TimePicker', TimePicker);\ncomponentMap.set('DatePickerInFilter', DatePickerInFilter);\ncomponentMap.set('JDatePickerMultiple', JDatePickerMultiple);\ncomponentMap.set('StrengthMeter', StrengthMeter);\ncomponentMap.set('IconPicker', IconPicker);\ncomponentMap.set('InputCountDown', CountdownInput);\n\ncomponentMap.set('Upload', BasicUpload);\ncomponentMap.set('Divider', Divider);\n\n//注册自定义组件\n\ncomponentMap.set(\n  'JAreaLinkage',\n  createAsyncComponent(() => import('./jeecg/components/JAreaLinkage.vue'))\n);\ncomponentMap.set('JSelectPosition', JSelectPosition);\ncomponentMap.set('JSelectUser', JSelectUser);\ncomponentMap.set('JSelectRole', JSelectRole);\ncomponentMap.set('JImageUpload', JImageUpload);\ncomponentMap.set('JDictSelectTag', JDictSelectTag);\ncomponentMap.set('JSelectDept', JSelectDept);\ncomponentMap.set('JAreaSelect', JAreaSelect);\ncomponentMap.set('JLinkTableCard', JLinkTableCard);\n// componentMap.set(\n//   'JEditor',\n//   createAsyncComponent(() => import('./jeecg/components/JEditor.vue'))\n// );\ncomponentMap.set('JEditor', JEditor);\ncomponentMap.set(\n  'JMarkdownEditor',\n  createAsyncComponent(() => import('./jeecg/components/JMarkdownEditor.vue'))\n);\ncomponentMap.set('JSelectInput', JSelectInput);\ncomponentMap.set(\n  'JCodeEditor',\n  createAsyncComponent(() => import('./jeecg/components/JCodeEditor.vue'))\n);\ncomponentMap.set('JCategorySelect', JCategorySelect);\ncomponentMap.set('JSelectMultiple', JSelectMultiple);\ncomponentMap.set('JPopup', JPopup);\n// 代码逻辑说明: 【QQYUN-7961】popupDict字典\ncomponentMap.set('JPopupDict', JPopupDict);\ncomponentMap.set('JSwitch', JSwitch);\ncomponentMap.set('JTreeDict', JTreeDict);\ncomponentMap.set('JInputPop', JInputPop);\ncomponentMap.set(\n  'JEasyCron',\n  createAsyncComponent(() => import('./jeecg/components/JEasyCron/EasyCronInput.vue'))\n);\ncomponentMap.set('JCheckbox', JCheckbox);\ncomponentMap.set('JInput', JInput);\ncomponentMap.set('JTreeSelect', JTreeSelect);\ncomponentMap.set('JEllipsis', JEllipsis);\ncomponentMap.set('JSelectUserByDept', JSelectUserByDept);\ncomponentMap.set('JSelectUserByDepartment', JSelectUserByDepartment);\ncomponentMap.set('JUpload', JUpload);\ncomponentMap.set('JSearchSelect', JSearchSelect);\ncomponentMap.set('JAddInput', JAddInput);\ncomponentMap.set('JRangeNumber', JRangeNumber);\ncomponentMap.set('CascaderPcaInFilter', CascaderPcaInFilter);\ncomponentMap.set('UserSelect', UserSelect);\ncomponentMap.set('RangeDate', JRangeDate);\ncomponentMap.set('RangeTime', JRangeTime);\ncomponentMap.set('RoleSelect', RoleSelectInput);\ncomponentMap.set('JInputSelect', JInputSelect);\ncomponentMap.set('JSelectDepartPost', JSelectDepartPost);\ncomponentMap.set('JSelectUserByDeptPost', JSelectUserByDeptPost);\n\ncomponentMap.set('OnlineSelectCascade', createAsyncComponent(() => {\n  return import('@jeecg/online').then(mod => mod.OnlineSelectCascade);\n}));\ncomponentMap.set('LinkTableCard', createAsyncComponent(() => {\n  return import('@jeecg/online').then(mod => mod.LinkTableCard);\n}));\ncomponentMap.set('LinkTableSelect', createAsyncComponent(() => {\n  return import('@jeecg/online').then(mod => mod.LinkTableSelect);\n}));\n\nexport function add(compName: ComponentType, component: Component) {\n  componentMap.set(compName, component);\n}\n\nexport function del(compName: ComponentType) {\n  componentMap.delete(compName);\n}\n\nexport { componentMap };\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/components/ApiRadioGroup.vue",
    "content": "<!--\n * @Description:It is troublesome to implement radio button group in the form. So it is extracted independently as a separate component\n-->\n<template>\n  <RadioGroup v-bind=\"attrs\" v-model:value=\"state\" button-style=\"solid\" @change=\"handleChange\">\n    <template v-for=\"item in getOptions\" :key=\"`${item.value}`\">\n      <RadioButton v-if=\"props.isBtn\" :value=\"item.value\" :disabled=\"item.disabled\">\n        {{ item.label }}\n      </RadioButton>\n      <Radio v-else :value=\"item.value\" :disabled=\"item.disabled\">\n        {{ item.label }}\n      </Radio>\n    </template>\n  </RadioGroup>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, ref, watchEffect, computed, unref, watch } from 'vue';\n  import { Radio } from 'ant-design-vue';\n  import { isFunction } from '/@/utils/is';\n  import { useRuleFormItem } from '/@/hooks/component/useFormItem';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { propTypes } from '/@/utils/propTypes';\n  import { get, omit } from 'lodash-es';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  type OptionsItem = { label: string; value: string | number | boolean; disabled?: boolean };\n\n  export default defineComponent({\n    name: 'ApiRadioGroup',\n    components: {\n      RadioGroup: Radio.Group,\n      RadioButton: Radio.Button,\n      Radio,\n    },\n    props: {\n      api: {\n        type: Function as PropType<(arg?: Recordable | string) => Promise<OptionsItem[]>>,\n        default: null,\n      },\n      params: {\n        type: [Object, String] as PropType<Recordable | string>,\n        default: () => ({}),\n      },\n      value: {\n        type: [String, Number, Boolean] as PropType<string | number | boolean>,\n      },\n      isBtn: {\n        type: [Boolean] as PropType<boolean>,\n        default: false,\n      },\n      numberToString: propTypes.bool,\n      resultField: propTypes.string.def(''),\n      labelField: propTypes.string.def('label'),\n      valueField: propTypes.string.def('value'),\n      immediate: propTypes.bool.def(true),\n    },\n    emits: ['options-change', 'change'],\n    setup(props, { emit }) {\n      const options = ref<OptionsItem[]>([]);\n      const loading = ref(false);\n      const isFirstLoad = ref(true);\n      const emitData = ref<any[]>([]);\n      const attrs = useAttrs();\n      const { t } = useI18n();\n      // Embedded in the form, just use the hook binding to perform form verification\n      const [state] = useRuleFormItem(props);\n\n      // Processing options value\n      const getOptions = computed(() => {\n        const { labelField, valueField, numberToString } = props;\n\n        return unref(options).reduce((prev, next: Recordable) => {\n          if (next) {\n            const value = next[valueField];\n            prev.push({\n              label: next[labelField],\n              value: numberToString ? `${value}` : value,\n              ...omit(next, [labelField, valueField]),\n            });\n          }\n          return prev;\n        }, [] as OptionsItem[]);\n      });\n\n      watchEffect(() => {\n        props.immediate && fetch();\n      });\n\n      watch(\n        () => props.params,\n        () => {\n          !unref(isFirstLoad) && fetch();\n        },\n        { deep: true }\n      );\n\n      async function fetch() {\n        const api = props.api;\n        if (!api || !isFunction(api)) return;\n        options.value = [];\n        try {\n          loading.value = true;\n          const res = await api(props.params);\n          if (Array.isArray(res)) {\n            options.value = res;\n            emitChange();\n            return;\n          }\n          if (props.resultField) {\n            options.value = get(res, props.resultField) || [];\n          }\n          emitChange();\n        } catch (error) {\n          console.warn(error);\n        } finally {\n          loading.value = false;\n        }\n      }\n\n      function emitChange() {\n        emit('options-change', unref(getOptions));\n      }\n\n      function handleChange(_, ...args) {\n        emitData.value = args;\n      }\n\n      return { state, getOptions, attrs, loading, t, handleChange, props };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/components/ApiSelect.vue",
    "content": "<template>\n  <Select\n    v-bind=\"attrs_\"\n    v-model:value=\"state\"\n    :options=\"getOptions\"\n    show-search\n    :filter-option=\"filterOption\"\n    @change=\"handleChange\"\n    @dropdownVisibleChange=\"handleFetch\"\n    @popupScroll=\"handlePopupScroll\"\n  >\n    <template #[item]=\"data\" v-for=\"item in Object.keys($slots)\">\n      <slot :name=\"item\" v-bind=\"data || {}\"></slot>\n    </template>\n    <template #suffixIcon v-if=\"loading\">\n      <LoadingOutlined spin />\n    </template>\n    <template #notFoundContent v-if=\"loading\">\n      <span>\n        <LoadingOutlined spin class=\"mr-1\" />\n        {{ t('component.form.apiSelectNotFound') }}\n      </span>\n    </template>\n  </Select>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, ref, watchEffect, computed, unref, watch } from 'vue';\n  import { Select } from 'ant-design-vue';\n  import { isFunction } from '/@/utils/is';\n  import { useRuleFormItem } from '/@/hooks/component/useFormItem';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { get, omit } from 'lodash-es';\n  import { LoadingOutlined } from '@ant-design/icons-vue';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { propTypes } from '/@/utils/propTypes';\n  import { isNumber } from '/@/utils/is';\n\n  type OptionsItem = { label: string; value: string; disabled?: boolean };\n  //文档 https://help.jeecg.com/ui/apiSelect#pageconfig%E5%8F%82%E6%95%B0%E9%85%8D%E7%BD%AE\n  export default defineComponent({\n    name: 'ApiSelect',\n    components: {\n      Select,\n      LoadingOutlined,\n    },\n    inheritAttrs: false,\n    props: {\n      value: [Array, String, Number],\n      numberToString: propTypes.bool,\n      api: {\n        type: Function as PropType<(arg?: Recordable) => Promise<OptionsItem[]>>,\n        default: null,\n      },\n      // api params\n      params: {\n        type: Object as PropType<Recordable>,\n        default: () => ({}),\n      },\n      //分页配置\n      pageConfig: {\n        type: Object as PropType<Recordable>,\n        default: () => ({ isPage: false }),\n      },\n      // support xxx.xxx.xx\n      resultField: propTypes.string.def(''),\n      labelField: propTypes.string.def('label'),\n      valueField: propTypes.string.def('value'),\n      immediate: propTypes.bool.def(true),\n    },\n    emits: ['options-change', 'change'],\n    setup(props, { emit }) {\n      const options = ref<OptionsItem[]>([]);\n      const loading = ref(false);\n      const isFirstLoad = ref(true);\n      const emitData = ref<any[]>([]);\n      const attrs = useAttrs();\n      const { t } = useI18n();\n      // 代码逻辑说明: 【QQYUN-11831】ApiSelect 分页下拉方案 #7883\n      const hasMore = ref(true);\n      const pagination = ref({\n        pageNo: 1,\n        pageSize: 10,\n        total: 0,\n      });\n      const defPageConfig = { isPage: false, pageField: 'pageNo', pageSizeField: 'pageSize', totalField: 'total', listField: 'records' };\n      // update-end--author:liusq---date:20250407---for：【QQYUN-11831】ApiSelect 分页下拉方案 #7883\n      // Embedded in the form, just use the hook binding to perform form verification\n      const [state, setState] = useRuleFormItem(props, 'value', 'change', emitData);\n      // 代码逻辑说明: 【QQYUN-6308】解决警告\n      let vModalValue: any;\n      const attrs_ = computed(() => {\n        let obj: any = unref(attrs) || {};\n        if (obj && obj['onUpdate:value']) {\n          vModalValue = obj['onUpdate:value'];\n          delete obj['onUpdate:value'];\n        }\n        // 代码逻辑说明: 【issues/5467】ApiSelect修复覆盖了用户传递的方法\n        if (obj['filterOption'] === undefined) {\n          // 代码逻辑说明: 【issues/5305】无法按照预期进行搜索\n          obj['filterOption'] = (inputValue, option) => {\n            if (typeof option['label'] === 'string') {\n              return option['label'].toLowerCase().indexOf(inputValue.toLowerCase()) != -1;\n            } else {\n              return true;\n            }\n          };\n        }\n        return obj;\n      });\n      // 代码逻辑说明: 【QQYUN-6308】解决警告\n      const getOptions = computed(() => {\n        const { labelField, valueField, numberToString } = props;\n        return unref(options).reduce((prev, next: Recordable) => {\n          if (next) {\n            const value = next[valueField];\n            prev.push({\n              ...omit(next, [labelField, valueField]),\n              label: next[labelField],\n              value: numberToString ? `${value}` : value,\n            });\n          }\n          return prev;\n        }, [] as OptionsItem[]);\n      });\n      // 代码逻辑说明: 【issues/8527】apiSelect分页加载重复请求\n      watch(\n        () => props.immediate,\n        () => {\n          props.immediate && fetch();\n        },\n        { immediate: true }\n      );\n      watch(\n        () => [props.api, props.pageConfig, props.resultField, props.params],\n        () => {\n          props.immediate && fetch();\n        },\n        { deep: true }\n      );\n\n      watch(\n        () => props.params,\n        () => {\n          !unref(isFirstLoad) && fetch();\n        },\n        { deep: true }\n      );\n      //监听数值修改，查询数据\n      watchEffect(() => {\n        props.value && handleFetch();\n      });\n      /**\n       * 筛选流程\n       * @param input\n       * @param option\n       */\n      const filterOption = (input: string, option: any) => {\n        return option.value.toLowerCase().indexOf(input.toLowerCase()) >= 0 || option.label.indexOf(input) >= 0;\n      };\n      async function fetch() {\n        const api = props.api;\n        if (!api || !isFunction(api)) return;\n        // 代码逻辑说明: 【QQYUN-11831】ApiSelect 分页下拉方案 #7883\n        if (!props.pageConfig.isPage || pagination.value.pageNo == 1) {\n          options.value = [];\n        }\n        try {\n          loading.value = true;\n          let { isPage, pageField, pageSizeField, totalField, listField } = { ...defPageConfig, ...props.pageConfig };\n          let params = isPage\n            ? { ...props.params, [pageField]: pagination.value.pageNo, [pageSizeField]: pagination.value.pageSize }\n            : { ...props.params };\n          const res = await api(params);\n          if (isPage) {\n            // 代码逻辑说明: 【QQYUN-11831】ApiSelect 分页下拉方案 #7883\n            options.value = [...options.value, ...res[listField]];\n            pagination.value.total = res[totalField] || 0;\n            hasMore.value = res[totalField] ? options.value.length < res[totalField] : res[listField] < pagination.value.pageSize;\n          } else {\n            if (Array.isArray(res)) {\n              options.value = res;\n              emitChange();\n              return;\n            }\n            if (props.resultField) {\n              options.value = get(res, props.resultField) || [];\n            }\n          }\n          emitChange();\n        } catch (error) {\n          console.warn(error);\n        } finally {\n          loading.value = false;\n          ['multiple', 'tags'].includes(unref(attrs).mode) && !Array.isArray(unref(state)) && setState([]);\n          initValue();\n        }\n      }\n\n      function initValue() {\n        let value = props.value;\n        // 代码逻辑说明: 【issues/8037】初始化值单选的值被错误地写入数组值\n        if (['multiple', 'tags'].includes(unref(attrs).mode)) {\n          if (value && typeof value === 'string' && value != 'null' && value != 'undefined') {\n            state.value = value.split(',');\n          } else if (isNumber(value)) {\n            state.value = [value];\n          }\n        } else {\n          state.value = value;\n        }\n      }\n\n      async function handleFetch() {\n        if (!props.immediate && unref(isFirstLoad)) {\n          await fetch();\n          isFirstLoad.value = false;\n        }\n      }\n\n      function emitChange() {\n        emit('options-change', unref(getOptions));\n      }\n\n      function handleChange(_, ...args) {\n        vModalValue && vModalValue(_);\n        emitData.value = args;\n      }\n      // 滚动加载更多\n      function handlePopupScroll(e) {\n        const { scrollTop, scrollHeight, clientHeight } = e.target;\n        const isNearBottom = scrollHeight - scrollTop <= clientHeight + 20;\n        if (props.pageConfig.isPage && isNearBottom && hasMore.value && !loading.value) {\n          pagination.value.pageNo += 1;\n          fetch();\n        }\n      }\n      return { state, attrs_, attrs, getOptions, loading, t, handleFetch, handleChange, handlePopupScroll,filterOption };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/components/ApiTreeSelect.vue",
    "content": "<template>\n  <a-tree-select v-bind=\"getAttrs\" @change=\"handleChange\">\n    <template #[item]=\"data\" v-for=\"item in Object.keys($slots)\">\n      <slot :name=\"item\" v-bind=\"data || {}\"></slot>\n    </template>\n    <template #suffixIcon v-if=\"loading\">\n      <LoadingOutlined spin />\n    </template>\n  </a-tree-select>\n</template>\n\n<script lang=\"ts\">\n  import { computed, defineComponent, watch, ref, onMounted, unref } from 'vue';\n  import { TreeSelect } from 'ant-design-vue';\n  import { isArray, isFunction } from '/@/utils/is';\n  import { get } from 'lodash-es';\n  import { propTypes } from '/@/utils/propTypes';\n  import { LoadingOutlined } from '@ant-design/icons-vue';\n  export default defineComponent({\n    name: 'ApiTreeSelect',\n    components: { ATreeSelect: TreeSelect, LoadingOutlined },\n    props: {\n      api: { type: Function as PropType<(arg?: Recordable) => Promise<Recordable>> },\n      params: { type: Object },\n      immediate: { type: Boolean, default: true },\n      resultField: propTypes.string.def(''),\n    },\n    emits: ['options-change', 'change'],\n    setup(props, { attrs, emit }) {\n      const treeData = ref<Recordable[]>([]);\n      const isFirstLoaded = ref<Boolean>(false);\n      const loading = ref(false);\n      const getAttrs = computed(() => {\n        return {\n          ...(props.api ? { treeData: unref(treeData) } : {}),\n          ...attrs,\n        };\n      });\n\n      function handleChange(...args) {\n        emit('change', ...args);\n      }\n\n      watch(\n        () => props.params,\n        () => {\n          // 代码逻辑说明: 【QQYUN-8346】 ApiTreeSelect组件入参变化时，不及时刷新数据 #1054---\n          unref(isFirstLoaded) && fetch();\n        },\n        { deep: true }\n      );\n\n      watch(\n        () => props.immediate,\n        (v) => {\n          v && !isFirstLoaded.value && fetch();\n        }\n      );\n\n      onMounted(() => {\n        props.immediate && fetch();\n      });\n\n      async function fetch() {\n        const { api } = props;\n        if (!api || !isFunction(api)) return;\n        loading.value = true;\n        treeData.value = [];\n        let result;\n        try {\n          result = await api(props.params);\n        } catch (e) {\n          console.error(e);\n        }\n        loading.value = false;\n        if (!result) return;\n        if (!isArray(result)) {\n          result = get(result, props.resultField);\n        }\n        treeData.value = (result as Recordable[]) || [];\n        isFirstLoaded.value = true;\n        emit('options-change', treeData.value);\n      }\n      return { getAttrs, loading, handleChange };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/components/FormAction.vue",
    "content": "<template>\n  <a-col v-bind=\"actionColOpt\" v-if=\"showActionButtonGroup\">\n    <div class=\"btnArea\" style=\"width: 100%\" :style=\"{ textAlign: actionColOpt.style.textAlign }\">\n      <FormItem>\n        <slot name=\"submitBefore\"></slot>\n        <Button type=\"primary\" class=\"mr-2\" v-bind=\"getSubmitBtnOptions\" @click=\"submitAction\" v-if=\"showSubmitButton\">\n          {{ getSubmitBtnOptions.text }}\n        </Button>\n\n        <slot name=\"resetBefore\"></slot>\n        <Button type=\"default\" class=\"mr-2\" v-bind=\"getResetBtnOptions\" @click=\"resetAction\" v-if=\"showResetButton\">\n          {{ getResetBtnOptions.text }}\n        </Button>\n\n        <slot name=\"advanceBefore\"></slot>\n        <Button type=\"link\" size=\"small\" @click=\"toggleAdvanced\" v-if=\"showAdvancedButton && !hideAdvanceBtn\">\n          {{ isAdvanced ? t('component.form.putAway') : t('component.form.unfold') }}\n          <BasicArrow class=\"ml-1\" :expand=\"!isAdvanced\" up />\n        </Button>\n        <slot name=\"advanceAfter\"></slot>\n      </FormItem>\n    </div>\n  </a-col>\n</template>\n<script lang=\"ts\">\n  import type { ColEx } from '../types/index';\n  //import type { ButtonProps } from 'ant-design-vue/es/button/buttonTypes';\n  import { defineComponent, computed, PropType } from 'vue';\n  import { Form, Col } from 'ant-design-vue';\n  import { Button, ButtonProps } from '/@/components/Button';\n  import { BasicArrow } from '/@/components/Basic';\n  import { useFormContext } from '../hooks/useFormContext';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { propTypes } from '/@/utils/propTypes';\n\n  type ButtonOptions = Partial<ButtonProps> & { text: string };\n\n  export default defineComponent({\n    name: 'BasicFormAction',\n    components: {\n      FormItem: Form.Item,\n      Button,\n      BasicArrow,\n      [Col.name]: Col,\n    },\n    props: {\n      showActionButtonGroup: propTypes.bool.def(true),\n      showResetButton: propTypes.bool.def(true),\n      showSubmitButton: propTypes.bool.def(true),\n      showAdvancedButton: propTypes.bool.def(true),\n      resetButtonOptions: {\n        type: Object as PropType<ButtonOptions>,\n        default: () => ({}),\n      },\n      submitButtonOptions: {\n        type: Object as PropType<ButtonOptions>,\n        default: () => ({}),\n      },\n      actionColOptions: {\n        type: Object as PropType<Partial<ColEx>>,\n        default: () => ({}),\n      },\n      actionSpan: propTypes.number.def(6),\n      isAdvanced: propTypes.bool,\n      hideAdvanceBtn: propTypes.bool,\n      layout: propTypes.oneOf(['horizontal', 'vertical', 'inline']).def('horizontal'),\n    },\n    emits: ['toggle-advanced'],\n    setup(props, { emit }) {\n      const { t } = useI18n();\n\n      const actionColOpt = computed(() => {\n        const { showAdvancedButton, actionSpan: span, actionColOptions } = props;\n        const actionSpan = 24 - span;\n        const advancedSpanObj = showAdvancedButton ? { span: actionSpan < 6 ? 24 : actionSpan } : {};\n        // 代码逻辑说明: 【QQYUN-6566】BasicForm支持一行显示(inline)\n        const defaultSpan = props.layout == 'inline' ? {} : { span: showAdvancedButton ? 6 : 4 };\n        const actionColOpt: Partial<ColEx> = {\n          style: { textAlign: 'right' },\n          ...defaultSpan,\n          ...advancedSpanObj,\n          ...actionColOptions,\n        };\n        \n        \n        \n        return actionColOpt;\n      });\n\n      const getResetBtnOptions = computed((): ButtonOptions => {\n        return Object.assign(\n          {\n            text: t('common.resetText'),\n            preIcon: 'ic:baseline-restart-alt',\n          },\n          props.resetButtonOptions\n        );\n      });\n\n      const getSubmitBtnOptions = computed(() => {\n        return Object.assign(\n          {},\n          {\n            text: t('common.queryText'),\n            preIcon: 'ant-design:search-outlined',\n          },\n          props.submitButtonOptions\n        );\n      });\n\n      function toggleAdvanced() {\n        emit('toggle-advanced');\n      }\n\n      return {\n        t,\n        actionColOpt,\n        getResetBtnOptions,\n        getSubmitBtnOptions,\n        toggleAdvanced,\n        ...useFormContext(),\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  // 代码逻辑说明: 【TV360X-999】在1753px宽度下 流程设计页面查询的展开换行了\n  .btnArea {\n    :deep(.ant-form-item-control-input-content) {\n      display: flex;\n      align-items: center;\n      .ant-btn-link {\n        padding-left: 0;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/components/FormItem.vue",
    "content": "<script lang=\"tsx\">\n  import { NamePath, ValidateOptions } from 'ant-design-vue/lib/form/interface';\n  import type { PropType, Ref } from 'vue';\n  import type { FormActionType, FormProps } from '../types/form';\n  import type { FormSchema } from '../types/form';\n  import type { ValidationRule } from 'ant-design-vue/lib/form/Form';\n  import type { TableActionType } from '/@/components/Table';\n  import { defineComponent, computed, unref, toRefs } from 'vue';\n  import { Form, Col, Divider } from 'ant-design-vue';\n  import { componentMap } from '../componentMap';\n  import { BasicHelp } from '/@/components/Basic';\n  import { isBoolean, isFunction, isNull } from '/@/utils/is';\n  import { getSlot } from '/@/utils/helper/tsxHelper';\n  import { createPlaceholderMessage, setComponentRuleType } from '../helper';\n  import { upperFirst, cloneDeep } from 'lodash-es';\n  import { useItemLabelWidth } from '../hooks/useLabelWidth';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useAppInject } from '/@/hooks/web/useAppInject';\n  import { usePermission } from '/@/hooks/web/usePermission';\n  import Middleware from './Middleware.vue';\n  import { useLocaleStoreWithOut } from '/@/store/modules/locale';\n\n  export default defineComponent({\n    name: 'BasicFormItem',\n    inheritAttrs: false,\n    props: {\n      schema: {\n        type: Object as PropType<FormSchema>,\n        default: () => ({}),\n      },\n      formProps: {\n        type: Object as PropType<FormProps>,\n        default: () => ({}),\n      },\n      allDefaultValues: {\n        type: Object as PropType<Recordable>,\n        default: () => ({}),\n      },\n      formModel: {\n        type: Object as PropType<Recordable>,\n        default: () => ({}),\n      },\n      setFormModel: {\n        type: Function as PropType<(key: string, value: any) => void>,\n        default: null,\n      },\n      validateFields: {\n        type: Function as PropType<(nameList?: NamePath[] | undefined, options?: ValidateOptions) => Promise<any>>,\n        default: null,\n      },\n      tableAction: {\n        type: Object as PropType<TableActionType>,\n      },\n      formActionType: {\n        type: Object as PropType<FormActionType>,\n      },\n      // 代码逻辑说明: 【TV360X-857】解决禁用状态下触发校验\n      clearValidate: {\n        type: Function,\n        default: null,\n      },\n      // 代码逻辑说明: 【TV360X-1511】blur不生效\n      formName: {\n        type: String,\n        default: '',\n      },\n      source: {\n        type: String,\n        default: '',\n      },\n    },\n    setup(props, { slots }) {\n      const { t } = useI18n();\n      const localeStore = useLocaleStoreWithOut();\n      const { schema, formProps } = toRefs(props) as {\n        schema: Ref<FormSchema>;\n        formProps: Ref<FormProps>;\n      };\n\n      const itemLabelWidthProp = useItemLabelWidth(schema, formProps);\n\n      const getValues = computed(() => {\n        const { allDefaultValues, formModel, schema } = props;\n        const { mergeDynamicData } = props.formProps;\n        return {\n          field: schema.field,\n          model: formModel,\n          values: {\n            ...mergeDynamicData,\n            ...allDefaultValues,\n            ...formModel,\n          } as Recordable,\n          schema: schema,\n        };\n      });\n\n      const getComponentsProps = computed(() => {\n        const { schema, tableAction, formModel, formActionType } = props;\n        let { componentProps = {} } = schema;\n        if (isFunction(componentProps)) {\n          componentProps = componentProps({ schema, tableAction, formModel, formActionType }) ?? {};\n        }\n        if (schema.component === 'Divider') {\n          // 代码逻辑说明: 【QQYUN-6603】分割线标题位置显示不正确---\n          componentProps = Object.assign({ type: 'horizontal',orientation:'left', plain: true, }, componentProps);\n        }\n        return componentProps as Recordable;\n      });\n\n      const getDisable = computed(() => {\n        const { disabled: globDisabled } = props.formProps;\n        // 代码逻辑说明: 【TV360X-594】表单全局禁用则dynamicDisabled不生效\n        if (!!globDisabled) {\n          return globDisabled;\n        }\n        const { dynamicDisabled } = props.schema;\n        const { disabled: itemDisabled = false } = unref(getComponentsProps);\n        let disabled = !!globDisabled || itemDisabled;\n        if (isBoolean(dynamicDisabled)) {\n          disabled = dynamicDisabled;\n        }\n        if (isFunction(dynamicDisabled)) {\n          disabled = dynamicDisabled(unref(getValues));\n        }\n        return disabled;\n      });\n\n      // 代码逻辑说明: 【QQYUN-8377】formSchema props支持动态修改\n      const getDynamicPropsValue = computed(() => {\n        const { dynamicPropsVal, dynamicPropskey } = props.schema;\n        if (dynamicPropskey == null) {\n          return null;\n        } else {\n          const { [dynamicPropskey]: itemValue } = unref(getComponentsProps);\n          let value = itemValue;\n          if (isFunction(dynamicPropsVal)) {\n            value = dynamicPropsVal(unref(getValues));\n            return value;\n          }\n        }\n      });\n\n      function getShow(): { isShow: boolean; isIfShow: boolean } {\n        const { show, ifShow } = props.schema;\n        const { showAdvancedButton } = props.formProps;\n        const itemIsAdvanced = showAdvancedButton ? (isBoolean(props.schema.isAdvanced) ? props.schema.isAdvanced : true) : true;\n\n        let isShow = true;\n        let isIfShow = true;\n\n        if (isBoolean(show)) {\n          isShow = show;\n        }\n        if (isBoolean(ifShow)) {\n          isIfShow = ifShow;\n        }\n        if (isFunction(show)) {\n          isShow = show(unref(getValues));\n        }\n        if (isFunction(ifShow)) {\n          isIfShow = ifShow(unref(getValues));\n        }\n        isShow = isShow && itemIsAdvanced;\n        return { isShow, isIfShow };\n      }\n      // 代码逻辑说明: 【TV360X-434】validator校验执行两次\n      let vSwitchArr: any = [],\n        prevValidatorArr: any = [];\n      const hijackValidator = (rules) => {\n        vSwitchArr = [];\n        prevValidatorArr = [];\n        rules.forEach((item, index) => {\n          const fn = item.validator;\n          vSwitchArr.push(true);\n          prevValidatorArr.push(null);\n          if (isFunction(fn)) {\n            item.validator = (rule, value, callback) => {\n              if (vSwitchArr[index]) {\n                vSwitchArr[index] = false;\n                setTimeout(() => {\n                  vSwitchArr[index] = true;\n                }, 100);\n                const result = fn(rule, value, callback);\n                prevValidatorArr[index] = result;\n                return result;\n              } else {\n                return prevValidatorArr[index];\n              }\n            };\n          }\n        });\n      };\n      function handleRules(): ValidationRule[] {\n        const { rules: defRules = [], component, rulesMessageJoinLabel, label, dynamicRules, required, auth, field } = props.schema;\n        // 代码逻辑说明: 【TV360X-857】解决禁用状态下触发校验\n        const { disabled: globDisabled } = props.formProps;\n        const { disabled: itemDisabled = false } = unref(getComponentsProps);\n        if (!!globDisabled || !!itemDisabled) {\n          props.clearValidate(field);\n          return [];\n        }\n        // 代码逻辑说明: 【TV360X-842】必填项v-auth、show隐藏的情况下表单无法提交\n        const { hasPermission } = usePermission();\n        const { isShow } = getShow();\n        if ((auth && !hasPermission(auth)) || !isShow) {\n          return [];\n        }\n        if (isFunction(dynamicRules)) {\n          // 代码逻辑说明: 【issues/1244】标识了必填，但是必填标识没显示\n          const ruleArr = dynamicRules(unref(getValues)) as ValidationRule[];\n          if (required) {\n            ruleArr.unshift({ required: true });\n          }\n          // 代码逻辑说明: 【TV360X-434】validator校验执行两次\n          hijackValidator(ruleArr);\n          return ruleArr;\n        }\n\n        let rules: ValidationRule[] = cloneDeep(defRules) as ValidationRule[];\n        const { rulesMessageJoinLabel: globalRulesMessageJoinLabel } = props.formProps;\n\n        const joinLabel = Reflect.has(props.schema, 'rulesMessageJoinLabel') ? rulesMessageJoinLabel : globalRulesMessageJoinLabel;\n        const defaultMsg = createPlaceholderMessage(component) + `${joinLabel ? label : ''}`;\n\n        function validator(rule: any, value: any) {\n          const msg = rule.message || defaultMsg;\n          if (value === undefined || isNull(value)) {\n            // 空值\n            return Promise.reject(msg);\n          } else if (Array.isArray(value) && value.length === 0) {\n            // 数组类型\n            return Promise.reject(msg);\n          } else if (typeof value === 'string' && value.trim() === '') {\n            // 空字符串\n            return Promise.reject(msg);\n          } else if (\n            typeof value === 'object' &&\n            Reflect.has(value, 'checked') &&\n            Reflect.has(value, 'halfChecked') &&\n            Array.isArray(value.checked) &&\n            Array.isArray(value.halfChecked) &&\n            value.checked.length === 0 &&\n            value.halfChecked.length === 0\n          ) {\n            // 非关联选择的tree组件\n            return Promise.reject(msg);\n          }\n          return Promise.resolve();\n        }\n\n        const getRequired = isFunction(required) ? required(unref(getValues)) : required;\n\n        if ((!rules || rules.length === 0) && getRequired) {\n          rules = [{ required: getRequired, validator }];\n        }\n\n        const requiredRuleIndex: number = rules.findIndex((rule) => Reflect.has(rule, 'required') && !Reflect.has(rule, 'validator'));\n\n        if (requiredRuleIndex !== -1) {\n          const rule = rules[requiredRuleIndex];\n          const { isShow } = getShow();\n          if (!isShow) {\n            rule.required = false;\n          }\n          if (component) {\n            //https://github.com/vbenjs/vue-vben-admin/pull/3082 github修复原文\n            /*if (!Reflect.has(rule, 'type')) {\n              rule.type = component === 'InputNumber' ? 'number' : 'string';\n            }*/\n\n            rule.message = rule.message || defaultMsg;\n\n            if (component.includes('Input') || component.includes('Textarea')) {\n              rule.whitespace = true;\n            }\n            const valueFormat = unref(getComponentsProps)?.valueFormat;\n            setComponentRuleType(rule, component, valueFormat);\n          }\n        }\n\n        // Maximum input length rule check\n        const characterInx = rules.findIndex((val) => val.max);\n        if (characterInx !== -1 && !rules[characterInx].validator) {\n          rules[characterInx].message = rules[characterInx].message || t('component.form.maxTip', [rules[characterInx].max] as Recordable);\n        }\n        // 代码逻辑说明: 【QQYUN-7495】pattern由字符串改成正则传递给antd（因使用InputNumber时发现正则无效）\n        rules.forEach((item) => {\n          if (typeof item.pattern === 'string') {\n            try {\n              const reg = new Function('item', `return ${item.pattern}`)(item);\n              if (Object.prototype.toString.call(reg) === '[object RegExp]') {\n                item.pattern = reg;\n              } else {\n                item.pattern = new RegExp(item.pattern);\n              }\n            } catch (error) {\n              item.pattern = new RegExp(item.pattern);\n            }\n          }\n        });\n        // 代码逻辑说明: 【TV360X-434】validator校验执行两次\n        hijackValidator(rules);\n        return rules;\n      }\n\n      function renderComponent() {\n        const { renderComponentContent, component, field, changeEvent = 'change', valueField, componentProps, dynamicRules, rules:defRules = [] } = props.schema;\n\n        const isCheck = component && ['Switch', 'Checkbox'].includes(component);\n        // 代码逻辑说明: 【QQYUN-6679】input去空格\n        let isTrim = false;\n        if (component === 'Input' && componentProps && componentProps.trim) {\n          isTrim = true;\n        }\n        const eventKey = `on${upperFirst(changeEvent)}`;\n        const getRules = (): ValidationRule[] => {\n          const dyRules = isFunction(dynamicRules) ? dynamicRules(unref(getValues)) : [];\n          return [...dyRules, ...defRules];\n        };\n        // 代码逻辑说明: 【issues/752】表单校验dynamicRules 无法 使用失去焦点后校验 trigger: 'blur'\n        const on = {\n          [eventKey]: (...args: Nullable<Recordable>[]) => {\n            const [e] = args;\n            if (propsData[eventKey]) {\n              propsData[eventKey](...args);\n              // 代码逻辑说明: 【issues/8791】js增强popup弹框的onlChange()没生效\n              if (eventKey == 'onPopUpChange') {\n                return;\n              }\n            }\n            const target = e ? e.target : null;\n            // 代码逻辑说明: 【QQYUN-6679】input去空格\n            let value;\n            if (target) {\n              if (isCheck) {\n                value = target.checked;\n              } else {\n                value = isTrim ? target.value.trim() : target.value;\n              }\n            } else {\n              value = e;\n            }\n            props.setFormModel(field, value);\n            // 代码逻辑说明: 【TV360X-1511】blur不生效\n            const findItem = getRules().find((item) => item?.trigger === 'blur');\n            if (!findItem) {\n              // 代码逻辑说明: 【TV360X-341】有值之后必填校验不消失\n              props.validateFields([field]).catch((_) => {});\n            }\n          },\n          // onBlur: () => {\n          //   props.validateFields([field], { triggerName: 'blur' }).catch((_) => {});\n          // },\n        };\n        const Comp = componentMap.get(component) as ReturnType<typeof defineComponent>;\n\n        const { autoSetPlaceHolder, size } = props.formProps;\n        const propsData: Recordable = {\n          allowClear: true,\n          getPopupContainer: (trigger: Element) => {\n\n            return trigger?.parentNode;\n          },\n          size,\n          ...unref(getComponentsProps),\n          disabled: unref(getDisable),\n        };\n        // 代码逻辑说明: 【QQYUN-8377】formSchema props支持动态修改\n        const dynamicPropskey = props.schema.dynamicPropskey;\n        if (dynamicPropskey) {\n          propsData[dynamicPropskey] = unref(getDynamicPropsValue);\n        }\n\n        // const isCreatePlaceholder = !propsData.disabled && autoSetPlaceHolder;\n        const isCreatePlaceholder = !!autoSetPlaceHolder;\n\n        // RangePicker place是一个数组\n        if (isCreatePlaceholder && component !== 'RangePicker' && component) {\n          //自动设置placeholder\n          // 代码逻辑说明: 【issues/6908】多语言无刷新切换时，BasicColumn和FormSchema里面的值不能正常切换\n          let label = isFunction(props.schema.label) ? props.schema.label() : props.schema.label;\n          if (localeStore.getLocale === 'en' && !(/^\\s/.test(label))) {\n            label = ' ' + label;\n          }\n          propsData.placeholder = unref(getComponentsProps)?.placeholder || createPlaceholderMessage(component) + label;\n        }\n        propsData.codeField = field;\n        propsData.formValues = unref(getValues);\n\n        const bindValue: Recordable = {\n          [valueField || (isCheck ? 'checked' : 'value')]: props.formModel[field],\n        };\n\n        const compAttr: Recordable = {\n          ...propsData,\n          ...on,\n          ...bindValue,\n        };\n\n        if (!renderComponentContent) {\n          return <Comp {...compAttr} />;\n        }\n        const compSlot = isFunction(renderComponentContent)\n          ? { ...renderComponentContent(unref(getValues)) }\n          : {\n              default: () => renderComponentContent,\n            };\n        return <Comp {...compAttr}>{compSlot}</Comp>;\n      }\n\n      /**\n       *渲染Label\n       * @updateBy:zyf\n       */\n      function renderLabelHelpMessage() {\n        //label宽度支持自定义\n        const { label: itemLabel, helpMessage, helpComponentProps, subLabel, labelLength } = props.schema;\n        // 代码逻辑说明: 【issues/6908】多语言无刷新切换时，BasicColumn和FormSchema里面的值不能正常切换\n        const label = isFunction(itemLabel) ? itemLabel() : itemLabel;\n        let showLabel: string = label + '';\n        // 代码逻辑说明: 【TV360X-98】label展示的文字必须和labelLength配置一致\n        if (labelLength) {\n          showLabel = showLabel.substr(0, labelLength);\n        }\n        const titleObj = { title: label };\n        const renderLabel = subLabel ? (\n          <span>\n            {label} <span class=\"text-secondary\">{subLabel}</span>\n          </span>\n        ) : labelLength ? (\n          <label {...titleObj}>{showLabel}</label>\n        ) : (\n          label\n        );\n        const getHelpMessage = isFunction(helpMessage) ? helpMessage(unref(getValues)) : helpMessage;\n        if (!getHelpMessage || (Array.isArray(getHelpMessage) && getHelpMessage.length === 0)) {\n          return renderLabel;\n        }\n        return (\n          <span>\n            {renderLabel}\n            <BasicHelp placement=\"top\" class=\"mx-1\" text={getHelpMessage} {...helpComponentProps} />\n          </span>\n        );\n      }\n\n      function renderItem() {\n        const { itemProps, slot, render, field, suffix, suffixCompact, component } = props.schema;\n        const { labelCol, wrapperCol } = unref(itemLabelWidthProp);\n        const { colon } = props.formProps;\n\n        // 代码逻辑说明: itemProps 属性支持函数形式\n        let getItemProps = itemProps;\n        if (typeof getItemProps === 'function') {\n          getItemProps = getItemProps(unref(getValues));\n        }\n\n        if (component === 'Divider') {\n          return (\n            <Col span={24}>\n              <Divider {...unref(getComponentsProps)}>{renderLabelHelpMessage()}</Divider>\n            </Col>\n          );\n        } else {\n          const getContent = () => {\n            return slot ? getSlot(slots, slot, unref(getValues)) : render ? render(unref(getValues)) : renderComponent();\n          };\n\n          const showSuffix = !!suffix;\n          const getSuffix = isFunction(suffix) ? suffix(unref(getValues)) : suffix;\n          return (\n            <Form.Item\n              name={field}\n              colon={colon}\n              class={{ 'suffix-item': showSuffix, 'suffix-compact': showSuffix && suffixCompact }}\n              {...(getItemProps as Recordable)}\n              label={renderLabelHelpMessage()}\n              rules={handleRules()}\n              // 代码逻辑说明: 【issues/1244】标识了必填，但是必填标识没显示\n              validateFirst = { true }\n              labelCol={labelCol}\n              wrapperCol={wrapperCol}\n            >\n              <div style=\"display:flex\">\n                {/* author: sunjianlei for: 【VUEN-744】此处加上 width: 100%; 因为要防止组件宽度超出 FormItem */}\n                {/* update-begin--author:liaozhiyang---date:20240510---for：【TV360X-719】表单校验不通过项滚动到可视区内 */}\n                <Middleware formName={props.formName} fieldName={field} source={props.source}>{getContent()}</Middleware>\n                {/* update-end--author:liaozhiyang---date:20240510---for：【TV360X-719】表单校验不通过项滚动到可视区内 */}\n                {showSuffix && <span class=\"suffix\">{getSuffix}</span>}\n              </div>\n            </Form.Item>\n          );\n        }\n      }\n\n      return () => {\n        const { colProps = {}, colSlot, renderColContent, component } = props.schema;\n        if (!componentMap.has(component)) {\n          return null;\n        }\n\n        const { baseColProps = {} } = props.formProps;\n        // 代码逻辑说明: 【issues-641】调整表格搜索表单的span配置无效\n        const { getIsMobile } = useAppInject();\n        let realColProps;\n        realColProps = { ...baseColProps, ...colProps };\n        if (colProps['span'] && !unref(getIsMobile)) {\n          ['xs', 'sm', 'md', 'lg', 'xl', 'xxl'].forEach((name) => delete realColProps[name]);\n        }\n        const { isIfShow, isShow } = getShow();\n        const values = unref(getValues);\n\n        const getContent = () => {\n          return colSlot ? getSlot(slots, colSlot, values) : renderColContent ? renderColContent(values) : renderItem();\n        };\n\n        return (\n          isIfShow && (\n            <Col {...realColProps} v-show={isShow}>\n              {getContent()}\n            </Col>\n          )\n        );\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/components/Middleware.vue",
    "content": "<template>\n  <div :id=\"formItemId\" class=\"j-form-item-middleware\">\n    <slot></slot>\n  </div>\n</template>\n\n<script setup>\n  import { ref } from 'vue';\n  // 代码逻辑说明: 【TV360X-1511】blur不生效\n  const formItemId = ref(null);\n  const props = defineProps(['formName', 'fieldName', 'source']);\n  if (props.formName && props.fieldName && props.source !== 'table-query') {\n    formItemId.value = `${props.formName}_${props.fieldName}`;\n  }\n</script>\n\n<style lang=\"less\" scoped>\n  // 代码逻辑说明: 【TV360X-1253】代码生成查询区域和新增组件没撑满\n  div > :deep(.ant-picker) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/components/RadioButtonGroup.vue",
    "content": "<!--\n * @Description:It is troublesome to implement radio button group in the form. So it is extracted independently as a separate component\n-->\n<template>\n  <RadioGroup v-bind=\"attrs\" v-model:value=\"state\" button-style=\"solid\">\n    <template v-for=\"item in getOptions\" :key=\"`${item.value}`\">\n      <RadioButton :value=\"item.value\" :disabled=\"item.disabled\">\n        {{ item.label }}\n      </RadioButton>\n    </template>\n  </RadioGroup>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, computed } from 'vue';\n  import { Radio } from 'ant-design-vue';\n  import { isString } from '/@/utils/is';\n  import { useRuleFormItem } from '/@/hooks/component/useFormItem';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n\n  type OptionsItem = { label: string; value: string | number | boolean; disabled?: boolean };\n  type RadioItem = string | OptionsItem;\n\n  export default defineComponent({\n    name: 'RadioButtonGroup',\n    components: {\n      RadioGroup: Radio.Group,\n      RadioButton: Radio.Button,\n    },\n    props: {\n      value: {\n        type: [String, Number, Boolean] as PropType<string | number | boolean>,\n      },\n      options: {\n        type: Array as PropType<RadioItem[]>,\n        default: () => [],\n      },\n    },\n    setup(props) {\n      const attrs = useAttrs();\n      // Embedded in the form, just use the hook binding to perform form verification\n      const [state] = useRuleFormItem(props);\n\n      // Processing options value\n      const getOptions = computed((): OptionsItem[] => {\n        const { options } = props;\n        if (!options || options?.length === 0) return [];\n\n        const isStringArr = options.some((item) => isString(item));\n        if (!isStringArr) return options as OptionsItem[];\n\n        return options.map((item) => ({ label: item, value: item })) as OptionsItem[];\n      });\n\n      return { state, getOptions, attrs };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/container/JFormContainer.vue",
    "content": "<template>\n  <div :class=\"formDisabled ? 'jeecg-form-container-disabled jeecg-form-detail-effect' : 'jeecg-and-modal-form'\">\n    <fieldset :disabled=\"formDisabled\">\n      <slot name=\"detail\"></slot>\n    </fieldset>\n    <slot name=\"edit\"> </slot>\n    <fieldset disabled>\n      <slot></slot>\n    </fieldset>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, watch } from 'vue';\n\n  export default defineComponent({\n    name: 'JForm',\n    props: {\n      disabled: {\n        type: Boolean,\n        default: false,\n        required: false,\n      },\n    },\n    setup(props, { emit }) {\n      const formDisabled = ref<boolean>(props.disabled);\n\n      watch(\n        () => props.disabled,\n        (value) => {\n          formDisabled.value = value;\n        }\n      );\n\n      return {\n        formDisabled,\n      };\n    },\n  });\n</script>\n\n<style scoped lang=\"less\">\n  // 代码逻辑说明: 【TV360X-1090】表单label超长省略显示\n  .jeecg-and-modal-form {\n    :deep(.ant-form-item-label) {\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n      padding-right: 6px;\n      > label {\n        line-height: 32px;\n        display: inline;\n        &::after {\n          margin-right: 0;\n        }\n      }\n    }\n  }\n  // update-end--author:liaozhiyang---date:20240719---for：【TV360X-1090】表单label超长省略显示\n  .jeecg-form-container-disabled {\n    cursor: not-allowed;\n  }\n  .jeecg-form-container-disabled fieldset[disabled] {\n    -ms-pointer-events: none;\n    pointer-events: none;\n  }\n  .jeecg-form-container-disabled :deep(.ant-select) {\n    -ms-pointer-events: none;\n    pointer-events: none;\n  }\n  // update-begin--author:liaozhiyang---date:20240605---for：【TV360X-857】online代码生成详情样式调整\n  // begin antdv 禁用样式\n  // .jeecg-form-container-disabled :deep(.ant-input-number),\n  // .jeecg-form-container-disabled :deep(.ant-input),\n  // .jeecg-form-container-disabled :deep(.ant-input-password),\n  // .jeecg-form-container-disabled :deep(.ant-select-single .ant-select-selector),\n  // .jeecg-form-container-disabled :deep(.ant-radio-wrapper .ant-radio-checked .ant-radio-inner),\n  // .jeecg-form-container-disabled :deep(.ant-switch),\n  // .jeecg-form-container-disabled :deep(.ant-picker),\n  // .jeecg-form-container-disabled :deep(.ant-select:not(.ant-select-customize-input) .ant-select-selector),\n  // .jeecg-form-container-disabled :deep(.ant-input-affix-wrapper),\n  // .jeecg-form-container-disabled :deep(.tox .tox-toolbar__group),\n  // .jeecg-form-container-disabled :deep(.tox .tox-edit-area__iframe),\n  // .jeecg-form-container-disabled :deep(.vditor-toolbar),\n  // .jeecg-form-container-disabled :deep(.vditor-preview),\n  // .jeecg-form-container-disabled :deep(.jeecg-tinymce-img-upload) {\n  //   background: rgba(51, 51, 51, 0.04);\n  // }\n\n  // .jeecg-form-container-disabled :deep(.ant-radio-wrapper),\n  // .jeecg-form-container-disabled :deep(.ant-checkbox-wrapper),\n  // .jeecg-form-container-disabled :deep(.ant-btn) {\n  //   color: rgba(0, 0, 0, 0.65);\n  // }\n  // .jeecg-form-container-disabled :deep(.ant-radio-wrapper .ant-radio-inner:after),\n  // .jeecg-form-container-disabled :deep(.ant-checkbox-checked .ant-checkbox-inner) {\n  //   background-color: rgba(51, 51, 51, 0.25);\n  // }\n  // .jeecg-form-container-disabled :deep(.ant-radio-inner),\n  // .jeecg-form-container-disabled :deep(.ant-checkbox-inner) {\n  //   border-color: rgba(51, 51, 51, 0.25) !important;\n  // }\n  // .jeecg-form-container-disabled :deep(.ant-input-password > .ant-input),\n  // .jeecg-form-container-disabled :deep(.ant-input-affix-wrapper .ant-input) {\n  //   background: none;\n  // }\n  html[data-theme='light'] {\n    .jeecg-form-detail-effect {\n      :deep(.ant-select-selector),\n      :deep(.ant-btn),\n      :deep(.ant-input),\n      :deep(.ant-input-affix-wrapper),\n      :deep(.ant-picker),\n      :deep(.ant-input-number) {\n        color: #606266 !important;\n      }\n      :deep(.ant-select) {\n        color: #606266 !important;\n      }\n      :deep(.ant-select-selection-item-content),:deep(.ant-select-selection-item),:deep(input) {\n        color: #606266 !important;\n      }\n\n      :deep(.ant-radio-wrapper),\n      :deep(.ant-checkbox-wrapper),\n      :deep(.ant-btn) {\n        color: rgba(0, 0, 0, 0.65);\n      }\n      :deep(.ant-radio-wrapper .ant-radio-inner:after),\n      :deep(.ant-checkbox-checked .ant-checkbox-inner) {\n        color: #606266 !important;\n      }\n      :deep(.ant-radio-inner),\n      :deep(.ant-checkbox-inner) {\n        border-color: rgba(51, 51, 51, 0.25) !important;\n        background-color: rgba(51, 51, 51, 0.04) !important;\n      }\n      :deep(.ant-checkbox-checked .ant-checkbox-inner::after), :deep(.ant-tree-checkbox-checked .ant-tree-checkbox-inner::after){\n        border-color: rgba(51, 51, 51, 0.25) !important;\n      }\n      :deep(.ant-switch) {\n        background-color: rgba(51, 51, 51, 0.25);\n      }\n      :deep(.tox .tox-toolbar__group),\n      :deep(.tox .tox-edit-area__iframe),\n      :deep(.vditor-toolbar),\n      :deep(.vditor-preview),\n      :deep(.jeecg-tinymce-img-upload) {\n        background: rgba(51, 51, 51, 0.04);\n      }\n    }\n  }\n\n  html[data-theme='dark'] {\n    .jeecg-form-detail-effect {\n      :deep(.ant-select-selector),\n      :deep(.ant-btn),\n      :deep(.ant-input),\n      :deep(.ant-input-affix-wrapper),\n      :deep(.ant-picker),\n      :deep(.ant-input-number) {\n        color: rgba(255, 255, 255, 0.25) !important;\n        //background-color: rgba(255, 255, 255, 0.08) !important;\n      }\n      :deep(.ant-select) {\n        color: rgba(255, 255, 255, 0.25) !important;\n      }\n      :deep(.ant-select-selection-item-content),:deep(.ant-select-selection-item),:deep(input) {\n        color: rgba(255, 255, 255, 0.25) !important;\n      }\n\n      :deep(.ant-radio-wrapper),\n      :deep(.ant-checkbox-wrapper){\n        color: rgba(255, 255, 255, 0.25);\n      }\n      :deep(.ant-radio-wrapper .ant-radio-inner:after),\n      :deep(.ant-checkbox-checked .ant-checkbox-inner) {\n        background-color: rgba(255, 255, 255, 0.08);\n      }\n      :deep(.ant-radio-inner),\n      :deep(.ant-checkbox-inner) {\n        border-color: #424242 !important;\n        background-color: rgba(255, 255, 255, 0.08);\n      }\n      :deep(.ant-switch) {\n        background-color: rgba(51, 51, 51, 0.25);\n        opacity: 0.65;\n      }\n      :deep(.tox .tox-toolbar__group),\n      :deep(.tox .tox-edit-area__iframe),\n      :deep(.vditor-toolbar),\n      :deep(.vditor-preview),\n      :deep(.jeecg-tinymce-img-upload) {\n        background: rgba(51, 51, 51, 0.04);\n      }\n    }\n  }\n  // end antdv 禁用样式\n  // 代码逻辑说明: 【TV360X-857】online代码生成详情样式调整\n  .jeecg-form-container-disabled :deep(.ant-upload-select) {\n    cursor: grabbing;\n  }\n  .jeecg-form-container-disabled :deep(.ant-upload-list) {\n    cursor: grabbing;\n  }\n  .jeecg-form-container-disabled fieldset[disabled] :deep(.ant-upload-list){\n    // -ms-pointer-events: auto !important;\n    // pointer-events: auto !important;\n  }\n  .jeecg-form-container-disabled fieldset[disabled] iframe {\n    -ms-pointer-events: auto !important;\n    pointer-events: auto !important;\n  }\n  .jeecg-form-container-disabled :deep(.ant-upload-list-item-actions .anticon-delete),\n  .jeecg-form-container-disabled :deep(.ant-upload-list-item .anticon-close) {\n    display: none;\n  }\n  .jeecg-form-container-disabled :deep(.vditor-sv) {\n    display: none !important;\n    background: rgba(51, 51, 51, 0.04);\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/helper.ts",
    "content": "import type { ValidationRule } from 'ant-design-vue/lib/form/Form';\nimport type { ComponentType } from './types/index';\nimport { useI18n } from '/@/hooks/web/useI18n';\nimport { dateUtil } from '/@/utils/dateUtil';\nimport { isNumber, isObject } from '/@/utils/is';\n\nconst { t } = useI18n();\n\n/**\n * @description: 生成placeholder\n */\nexport function createPlaceholderMessage(component: ComponentType) {\n  if (component.includes('Input') || component.includes('Complete')) {\n    return t('common.inputText');\n  }\n  if (component.includes('Picker')) {\n    return t('common.chooseText');\n  }\n  if (\n    component.includes('Select') ||\n    component.includes('Cascader') ||\n    component.includes('Checkbox') ||\n    component.includes('Radio') ||\n    component.includes('Switch')\n  ) {\n    // return `请选择${label}`;\n    return t('common.chooseText');\n  }\n  return '';\n}\n\nconst DATE_TYPE = ['DatePicker', 'MonthPicker', 'WeekPicker', 'TimePicker'];\n\nfunction genType() {\n  return [...DATE_TYPE, 'RangePicker'];\n}\n\nexport function setComponentRuleType(rule: ValidationRule, component: ComponentType, valueFormat: string) {\n  //https://github.com/vbenjs/vue-vben-admin/pull/3082 github修复原文\n  if (Reflect.has(rule, 'type')) {\n    return;\n  }\n  if (['DatePicker', 'MonthPicker', 'WeekPicker', 'TimePicker'].includes(component)) {\n    rule.type = valueFormat ? 'string' : 'object';\n  } else if (['RangePicker', 'Upload', 'CheckboxGroup', 'TimePicker'].includes(component)) {\n    rule.type = 'array';\n  } else if (['InputNumber'].includes(component)) {\n    rule.type = 'number';\n  }\n}\n\nexport function processDateValue(attr: Recordable, component: string) {\n  const { valueFormat, value } = attr;\n  if (valueFormat) {\n    attr.value = isObject(value) ? dateUtil(value).format(valueFormat) : value;\n  } else if (DATE_TYPE.includes(component) && value) {\n    attr.value = dateUtil(attr.value);\n  }\n}\n\nexport function handleInputNumberValue(component?: ComponentType, val?: any) {\n  if (!component) return val;\n  if (['Input', 'InputPassword', 'InputSearch', 'InputTextArea'].includes(component)) {\n    return val && isNumber(val) ? `${val}` : val;\n  }\n  return val;\n}\n/** \n*liaozhiyang\n*2023-12-26\n*某些组件的传值需要把字符串类型转成数值类型\n*/ \nexport function handleInputStringValue(component?: ComponentType, val?: any) {\n  if (!component) return val;\n  // 代码逻辑说明: 【TV360X-13】InputNumber设置精确3位小数传入''变成了0.00\n  if (['InputNumber'].includes(component) && typeof val === 'string' && val != '') {\n    return Number(val);\n  }\n  return val;\n}\n\n/**\n * 时间字段\n */\nexport const dateItemType = genType();\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/hooks/useAdvanced.ts",
    "content": "import type { ColEx } from '../types';\nimport type { AdvanceState } from '../types/hooks';\nimport type { ComputedRef, Ref } from 'vue';\nimport type { FormProps, FormSchema } from '../types/form';\nimport { computed, unref, watch } from 'vue';\nimport { isBoolean, isFunction, isNumber, isObject } from '/@/utils/is';\nimport { useBreakpoint } from '/@/hooks/event/useBreakpoint';\nimport { useDebounceFn } from '@vueuse/core';\n\nconst BASIC_COL_LEN = 24;\n\ninterface UseAdvancedContext {\n  advanceState: AdvanceState;\n  emit: EmitType;\n  getProps: ComputedRef<FormProps>;\n  getSchema: ComputedRef<FormSchema[]>;\n  formModel: Recordable;\n  defaultValueRef: Ref<Recordable>;\n}\n\nexport default function ({ advanceState, emit, getProps, getSchema, formModel, defaultValueRef }: UseAdvancedContext) {\n  const { realWidthRef, screenEnum, screenRef } = useBreakpoint();\n\n  const getEmptySpan = computed((): number => {\n    if (!advanceState.isAdvanced) {\n      return 0;\n    }\n    // For some special cases, you need to manually specify additional blank lines\n    const emptySpan = unref(getProps).emptySpan || 0;\n\n    if (isNumber(emptySpan)) {\n      return emptySpan;\n    }\n    if (isObject(emptySpan)) {\n      const { span = 0 } = emptySpan;\n      const screen = unref(screenRef) as string;\n\n      const screenSpan = (emptySpan as any)[screen.toLowerCase()];\n      return screenSpan || span || 0;\n    }\n    return 0;\n  });\n\n  const debounceUpdateAdvanced = useDebounceFn(updateAdvanced, 30);\n\n  watch(\n    [() => unref(getSchema), () => advanceState.isAdvanced, () => unref(realWidthRef)],\n    () => {\n      const { showAdvancedButton } = unref(getProps);\n      if (showAdvancedButton) {\n        debounceUpdateAdvanced();\n      }\n    },\n    { immediate: true }\n  );\n\n  function getAdvanced(itemCol: Partial<ColEx>, itemColSum = 0, isLastAction = false, index = 0) {\n    const width = unref(realWidthRef);\n\n    const mdWidth =\n      parseInt(itemCol.md as string) || parseInt(itemCol.xs as string) || parseInt(itemCol.sm as string) || (itemCol.span as number) || BASIC_COL_LEN;\n\n    const lgWidth = parseInt(itemCol.lg as string) || mdWidth;\n    const xlWidth = parseInt(itemCol.xl as string) || lgWidth;\n    const xxlWidth = parseInt(itemCol.xxl as string) || xlWidth;\n    if (width <= screenEnum.LG) {\n      itemColSum += mdWidth;\n    } else if (width < screenEnum.XL) {\n      itemColSum += lgWidth;\n    } else if (width < screenEnum.XXL) {\n      itemColSum += xlWidth;\n    } else {\n      itemColSum += xxlWidth;\n    }\n\n    let autoAdvancedCol = unref(getProps).autoAdvancedCol ?? 3;\n\n    if (isLastAction) {\n      advanceState.hideAdvanceBtn = unref(getSchema).length <= autoAdvancedCol;\n      // 代码逻辑说明: 注释掉该逻辑，使小于等于2行时，也显示展开收起按钮\n      /* if (itemColSum <= BASIC_COL_LEN * 2) {\n        // 小于等于2行时，不显示折叠和展开按钮\n        advanceState.hideAdvanceBtn = true;\n        advanceState.isAdvanced = true;\n      } else */\n      /*if (itemColSum > BASIC_COL_LEN * 2 && itemColSum <= BASIC_COL_LEN * (unref(getProps).autoAdvancedLine || 3)) {\n        advanceState.hideAdvanceBtn = false;\n\n        // 默认超过 3 行折叠\n      } else*/\n      if (!advanceState.isLoad) {\n        advanceState.isLoad = true;\n        advanceState.isAdvanced = !advanceState.isAdvanced;\n        // 代码逻辑说明: 如果总列数大于 autoAdvancedCol，就默认折叠\n        if (unref(getSchema).length > autoAdvancedCol) {\n          advanceState.hideAdvanceBtn = false;\n          advanceState.isAdvanced = false;\n        }\n      }\n      return { isAdvanced: advanceState.isAdvanced, itemColSum };\n    }\n    if (itemColSum > BASIC_COL_LEN * (unref(getProps).alwaysShowLines || 1)) {\n      return { isAdvanced: advanceState.isAdvanced, itemColSum };\n    } else if (!advanceState.isAdvanced && index + 1 > autoAdvancedCol) {\n      // 如果当前是收起状态，并且当前列下标 > autoAdvancedCol，就隐藏\n      return { isAdvanced: false, itemColSum };\n    } else {\n      // The first line is always displayed\n      return { isAdvanced: true, itemColSum };\n    }\n  }\n\n  function updateAdvanced() {\n    let itemColSum = 0;\n    let realItemColSum = 0;\n    const { baseColProps = {} } = unref(getProps);\n\n    const schemas = unref(getSchema);\n    for (let i = 0; i < schemas.length; i++) {\n      const schema = schemas[i];\n      const { show, colProps } = schema;\n      let isShow = true;\n\n      if (isBoolean(show)) {\n        isShow = show;\n      }\n\n      if (isFunction(show)) {\n        isShow = show({\n          schema: schema,\n          model: formModel,\n          field: schema.field,\n          values: {\n            ...unref(defaultValueRef),\n            ...formModel,\n          },\n        });\n      }\n\n      if (isShow && (colProps || baseColProps)) {\n        const { itemColSum: sum, isAdvanced } = getAdvanced({ ...baseColProps, ...colProps }, itemColSum, false, i);\n\n        itemColSum = sum || 0;\n        if (isAdvanced) {\n          realItemColSum = itemColSum;\n        }\n        schema.isAdvanced = isAdvanced;\n      }\n    }\n\n    advanceState.actionSpan = (realItemColSum % BASIC_COL_LEN) + unref(getEmptySpan);\n\n    getAdvanced(unref(getProps).actionColOptions || { span: BASIC_COL_LEN }, itemColSum, true);\n\n    emit('advanced-change');\n  }\n\n  function handleToggleAdvanced() {\n    advanceState.isAdvanced = !advanceState.isAdvanced;\n  }\n\n  return { handleToggleAdvanced };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/hooks/useAutoFocus.ts",
    "content": "import type { ComputedRef, Ref } from 'vue';\nimport type { FormSchema, FormActionType, FormProps } from '../types/form';\n\nimport { unref, nextTick, watchEffect } from 'vue';\n\ninterface UseAutoFocusContext {\n  getSchema: ComputedRef<FormSchema[]>;\n  getProps: ComputedRef<FormProps>;\n  isInitedDefault: Ref<boolean>;\n  formElRef: Ref<FormActionType>;\n}\nexport async function useAutoFocus({ getSchema, getProps, formElRef, isInitedDefault }: UseAutoFocusContext) {\n  watchEffect(async () => {\n    if (unref(isInitedDefault) || !unref(getProps).autoFocusFirstItem) {\n      return;\n    }\n    await nextTick();\n    const schemas = unref(getSchema);\n    const formEl = unref(formElRef);\n    const el = (formEl as any)?.$el as HTMLElement;\n    if (!formEl || !el || !schemas || schemas.length === 0) {\n      return;\n    }\n\n    const firstItem = schemas[0];\n    // Only open when the first form item is input type\n    if (!firstItem.component.includes('Input')) {\n      return;\n    }\n\n    const inputEl = el.querySelector('.ant-row:first-child input') as Nullable<HTMLInputElement>;\n    if (!inputEl) return;\n    inputEl?.focus();\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/hooks/useComponentRegister.ts",
    "content": "import type { ComponentType } from '../types/index';\nimport { tryOnUnmounted } from '@vueuse/core';\nimport { add, del } from '../componentMap';\nimport type { Component } from 'vue';\n\nexport function useComponentRegister(compName: ComponentType, comp: Component) {\n  add(compName, comp);\n  tryOnUnmounted(() => {\n    del(compName);\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/hooks/useForm.ts",
    "content": "import type { FormProps, FormActionType, UseFormReturnType, FormSchema } from '../types/form';\nimport type { NamePath, ValidateOptions } from 'ant-design-vue/lib/form/interface';\nimport type { DynamicProps } from '/#/utils';\nimport { handleRangeValue } from '../utils/formUtils';\nimport { ref, onUnmounted, unref, nextTick, watch } from 'vue';\nimport { isProdMode } from '/@/utils/env';\nimport { error } from '/@/utils/log';\nimport { getDynamicProps, getValueType, getValueTypeBySchema } from '/@/utils';\nexport declare type ValidateFields = (nameList?: NamePath[], options?: ValidateOptions) => Promise<Recordable>;\n\ntype Props = Partial<DynamicProps<FormProps>>;\n\nexport function useForm(props?: Props): UseFormReturnType {\n  const formRef = ref<Nullable<FormActionType>>(null);\n  const loadedRef = ref<Nullable<boolean>>(false);\n\n  async function getForm() {\n    const form = unref(formRef);\n    if (!form) {\n      error('The form instance has not been obtained, please make sure that the form has been rendered when performing the form operation!');\n    }\n    await nextTick();\n    return form as FormActionType;\n  }\n\n  function register(instance: FormActionType) {\n    isProdMode() &&\n      onUnmounted(() => {\n        formRef.value = null;\n        loadedRef.value = null;\n      });\n    if (unref(loadedRef) && isProdMode() && instance === unref(formRef)) return;\n\n    formRef.value = instance;\n    loadedRef.value = true;\n\n    watch(\n      () => props,\n      () => {\n        props && instance.setProps(getDynamicProps(props));\n      },\n      {\n        immediate: true,\n        deep: true,\n      }\n    );\n  }\n\n  const methods: FormActionType = {\n    scrollToField: async (name: NamePath, options?: ScrollOptions | undefined) => {\n      const form = await getForm();\n      form.scrollToField(name, options);\n    },\n    setProps: async (formProps: Partial<FormProps>) => {\n      const form = await getForm();\n      form.setProps(formProps);\n    },\n\n    updateSchema: async (data: Partial<FormSchema> | Partial<FormSchema>[]) => {\n      const form = await getForm();\n      form.updateSchema(data);\n    },\n\n    resetSchema: async (data: Partial<FormSchema> | Partial<FormSchema>[]) => {\n      const form = await getForm();\n      form.resetSchema(data);\n    },\n\n    clearValidate: async (name?: string | string[]) => {\n      const form = await getForm();\n      form.clearValidate(name);\n    },\n\n    resetFields: async () => {\n      getForm().then(async (form) => {\n        await form.resetFields();\n      });\n    },\n\n    removeSchemaByFiled: async (field: string | string[]) => {\n      unref(formRef)?.removeSchemaByFiled(field);\n    },\n\n    // TODO promisify\n    getFieldsValue: <T>() => {\n      // 代码逻辑说明: VUEN-1341【流程】编码方式 流程节点编辑表单时，填写数据报错 包括用户组件、部门组件、省市区\n      let values = unref(formRef)?.getFieldsValue() as T;\n      if(values){\n        Object.keys(values).map(key=>{\n          if (values[key] instanceof Array) {\n            // 代码逻辑说明: 【issues/4330】判断如果是对象数组，则不拼接\n            let isObject = typeof (values[key][0] || '') === 'object';\n            if (!isObject) {\n              values[key] = values[key].join(',');\n            }\n          }\n        });\n      }\n      return values;\n    },\n\n    setFieldsValue: async <T>(values: T) => {\n      const form = await getForm();\n      form.setFieldsValue<T>(values);\n    },\n\n    appendSchemaByField: async (schema: FormSchema, prefixField: string | undefined, first: boolean) => {\n      const form = await getForm();\n      form.appendSchemaByField(schema, prefixField, first);\n    },\n\n    submit: async (): Promise<any> => {\n      const form = await getForm();\n      return form.submit();\n    },\n\n    /**\n     * 表单验证并返回表单值\n     * @update:添加表单值转换逻辑\n     * @updateBy:zyf\n     * @updateDate:2021-09-02\n     */\n    validate: async (nameList?: NamePath[]): Promise<Recordable> => {\n      const form = await getForm();\n      let getProps = props || form.getProps;\n      let values = form.validate(nameList).then((values) => {\n        for (let key in values) {\n          if (values[key] instanceof Array) {\n            let valueType = getValueTypeBySchema(form.getSchemaByField(key)!, form);\n            if (valueType === 'string') {\n              values[key] = values[key].join(',');\n            }\n          }\n        }\n        //--@updateBy-begin----author:liusq---date:20210916------for:处理区域事件字典信息------\n        return handleRangeValue(getProps, values);\n        //--@updateBy-end----author:liusq---date:20210916------for:处理区域事件字典信息------\n      });\n      return values;\n    },\n    validateFields: async (nameList?: NamePath[], options?: ValidateOptions): Promise<Recordable> => {\n      const form = await getForm();\n      return form.validateFields(nameList, options);\n    },\n  };\n\n  return [register, methods];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/hooks/useFormContext.ts",
    "content": "import type { InjectionKey } from 'vue';\nimport { createContext, useContext } from '/@/hooks/core/useContext';\n\nexport interface FormContextProps {\n  resetAction: () => Promise<void>;\n  submitAction: () => Promise<void>;\n}\n\nconst key: InjectionKey<FormContextProps> = Symbol();\n\nexport function createFormContext(context: FormContextProps) {\n  return createContext<FormContextProps>(context, key);\n}\n\nexport function useFormContext() {\n  return useContext<FormContextProps>(key);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/hooks/useFormEvents.ts",
    "content": "import type { ComputedRef, Ref } from 'vue';\nimport type { FormProps, FormSchema, FormActionType } from '../types/form';\nimport type { NamePath, ValidateOptions } from 'ant-design-vue/lib/form/interface';\nimport { unref, toRaw } from 'vue';\nimport { isArray, isFunction, isObject, isString } from '/@/utils/is';\nimport { deepMerge, getValueType } from '/@/utils';\nimport { dateItemType, handleInputNumberValue, handleInputStringValue } from '../helper';\nimport { dateUtil } from '/@/utils/dateUtil';\nimport { cloneDeep, uniqBy } from 'lodash-es';\nimport { error } from '/@/utils/log';\n\ninterface UseFormActionContext {\n  emit: EmitType;\n  getProps: ComputedRef<FormProps>;\n  getSchema: ComputedRef<FormSchema[]>;\n  formModel: Recordable;\n  defaultValueRef: Ref<Recordable>;\n  formElRef: Ref<FormActionType>;\n  schemaRef: Ref<FormSchema[]>;\n  handleFormValues: Fn;\n}\nexport function useFormEvents({\n  emit,\n  getProps,\n  formModel,\n  getSchema,\n  defaultValueRef,\n  formElRef,\n  schemaRef,\n  handleFormValues,\n}: UseFormActionContext) {\n  async function resetFields(): Promise<void> {\n    const { resetFunc, submitOnReset } = unref(getProps);\n    resetFunc && isFunction(resetFunc) && (await resetFunc());\n\n    const formEl = unref(formElRef);\n    if (!formEl) return;\n\n    Object.keys(formModel).forEach((key) => {\n      formModel[key] = defaultValueRef.value[key];\n    });\n    clearValidate();\n    emit('reset', toRaw(formModel));\n    submitOnReset && handleSubmit();\n  }\n\n  /**\n   * @description: Set form value\n   */\n  async function setFieldsValue(values: Recordable): Promise<void> {\n    const fields = unref(getSchema)\n      .map((item) => item.field)\n      .filter(Boolean);\n\n    const validKeys: string[] = [];\n    Object.keys(values).forEach((key) => {\n      const schema = unref(getSchema).find((item) => item.field === key);\n      let value = values[key];\n\n      //antd3升级后，online表单时间控件选中值报js错 TypeError: Reflect.has called on non-object\n      if(!(values instanceof Object)){\n        return;\n      }\n      \n      const hasKey = Reflect.has(values, key);\n\n      value = handleInputNumberValue(schema?.component, value);\n      // 代码逻辑说明: 【QQYUN-7535】popup回填字段inputNumber组件验证错误\n      value = handleInputStringValue(schema?.component, value);\n      // 0| '' is allow\n      if (hasKey && fields.includes(key)) {\n        // time type\n        if (itemIsDateType(key)) {\n          if (Array.isArray(value)) {\n            const arr: any[] = [];\n            for (const ele of value) {\n              arr.push(ele ? dateUtil(ele) : null);\n            }\n            formModel[key] = arr;\n          } else {\n            const { componentProps } = schema || {};\n            let _props = componentProps as any;\n            if (typeof componentProps === 'function') {\n              _props = _props({ formModel });\n            }\n            formModel[key] = value ? (_props?.valueFormat ? value : dateUtil(value)) : null;\n          }\n        } else {\n          formModel[key] = value;\n        }\n        validKeys.push(key);\n      }\n    });\n    validateFields(validKeys).catch((_) => {});\n  }\n\n  /**\n   *  根据字段名获取schema\n   * @param field\n   */\n  function getSchemaByField(field: string): Nullable<FormSchema> {\n    if (!isString(field)) {\n      return null\n    }\n    const schemaList: FormSchema[] = unref(getSchema);\n    const index = schemaList.findIndex((schema) => schema.field === field);\n    if (index !== -1) {\n      return cloneDeep(schemaList[index]);\n    }\n    return null\n  }\n\n  /**\n   * @description: Delete based on field name\n   */\n  async function removeSchemaByFiled(fields: string | string[]): Promise<void> {\n    const schemaList: FormSchema[] = cloneDeep(unref(getSchema));\n    if (!fields) {\n      return;\n    }\n\n    let fieldList: string[] = isString(fields) ? [fields] : fields;\n    if (isString(fields)) {\n      fieldList = [fields];\n    }\n    for (const field of fieldList) {\n      _removeSchemaByFiled(field, schemaList);\n    }\n    schemaRef.value = schemaList;\n  }\n\n  /**\n   * @description: Delete based on field name\n   */\n  function _removeSchemaByFiled(field: string, schemaList: FormSchema[]): void {\n    if (isString(field)) {\n      const index = schemaList.findIndex((schema) => schema.field === field);\n      if (index !== -1) {\n        delete formModel[field];\n        schemaList.splice(index, 1);\n      }\n    }\n  }\n\n  /**\n   * @description: Insert after a certain field, if not insert the last\n   */\n  async function appendSchemaByField(schema: FormSchema, prefixField?: string, first = false) {\n    const schemaList: FormSchema[] = cloneDeep(unref(getSchema));\n\n    const index = schemaList.findIndex((schema) => schema.field === prefixField);\n    const hasInList = schemaList.some((item) => item.field === prefixField || schema.field);\n\n    if (!hasInList) return;\n\n    if (!prefixField || index === -1 || first) {\n      first ? schemaList.unshift(schema) : schemaList.push(schema);\n      schemaRef.value = schemaList;\n      return;\n    }\n    if (index !== -1) {\n      schemaList.splice(index + 1, 0, schema);\n    }\n    schemaRef.value = schemaList;\n  }\n\n  async function resetSchema(data: Partial<FormSchema> | Partial<FormSchema>[]) {\n    let updateData: Partial<FormSchema>[] = [];\n    if (isObject(data)) {\n      updateData.push(data as FormSchema);\n    }\n    if (isArray(data)) {\n      updateData = [...data];\n    }\n\n    const hasField = updateData.every((item) => item.component === 'Divider' || (Reflect.has(item, 'field') && item.field));\n\n    if (!hasField) {\n      error('All children of the form Schema array that need to be updated must contain the `field` field');\n      return;\n    }\n    schemaRef.value = updateData as FormSchema[];\n  }\n\n  async function updateSchema(data: Partial<FormSchema> | Partial<FormSchema>[]) {\n    let updateData: Partial<FormSchema>[] = [];\n    if (isObject(data)) {\n      updateData.push(data as FormSchema);\n    }\n    if (isArray(data)) {\n      updateData = [...data];\n    }\n\n    const hasField = updateData.every((item) => item.component === 'Divider' || (Reflect.has(item, 'field') && item.field));\n\n    if (!hasField) {\n      error('All children of the form Schema array that need to be updated must contain the `field` field');\n      return;\n    }\n    const schema: FormSchema[] = [];\n    updateData.forEach((item) => {\n      unref(getSchema).forEach((val) => {\n        if (val.field === item.field) {\n          const newSchema = deepMerge(val, item);\n          schema.push(newSchema as FormSchema);\n        } else {\n          schema.push(val);\n        }\n      });\n    });\n    schemaRef.value = uniqBy(schema, 'field');\n  }\n\n  function getFieldsValue(): Recordable {\n    const formEl = unref(formElRef);\n    if (!formEl) return {};\n    return handleFormValues(toRaw(unref(formModel)));\n  }\n\n  /**\n   * @description: Is it time\n   */\n  function itemIsDateType(key: string) {\n    return unref(getSchema).some((item) => {\n      return item.field === key ? dateItemType.includes(item.component) : false;\n    });\n  }\n\n  async function validateFields(nameList?: NamePath[] | undefined, options?: ValidateOptions) {\n    return unref(formElRef)?.validateFields(nameList, options);\n  }\n\n  async function validate(nameList?: NamePath[] | undefined) {\n    return await unref(formElRef)?.validate(nameList);\n  }\n\n  async function clearValidate(name?: string | string[]) {\n    await unref(formElRef)?.clearValidate(name);\n  }\n\n  async function scrollToField(name: NamePath, options?: ScrollOptions | undefined) {\n    await unref(formElRef)?.scrollToField(name, options);\n  }\n\n  /**\n   * @description: Form submission\n   */\n  async function handleSubmit(e?: Event): Promise<void> {\n    e && e.preventDefault();\n    const { submitFunc } = unref(getProps);\n    if (submitFunc && isFunction(submitFunc)) {\n      await submitFunc();\n      return;\n    }\n    const formEl = unref(formElRef);\n    if (!formEl) return;\n    try {\n      const values = await validate();\n      //代码逻辑说明: 对查询表单提交的数组处理成字符串------\n      for (let key in values) {\n        if (values[key] instanceof Array) {\n          let valueType = getValueType(getProps, key);\n          if (valueType === 'string') {\n            values[key] = values[key].join(',');\n          }\n        }\n      }\n      const res = handleFormValues(values);\n      emit('submit', res);\n    } catch (error) {\n      // 代码逻辑说明: 列表查询表单会触发校验错误导致重置失败，原因不明\n      emit('submit', {});\n      console.error('query form validate error, please ignore!', error)\n      //throw new Error(error);\n    }\n  }\n\n  return {\n    handleSubmit,\n    clearValidate,\n    validate,\n    validateFields,\n    getFieldsValue,\n    updateSchema,\n    resetSchema,\n    getSchemaByField,\n    appendSchemaByField,\n    removeSchemaByFiled,\n    resetFields,\n    setFieldsValue,\n    scrollToField,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/hooks/useFormValues.ts",
    "content": "import { isArray, isFunction, isObject, isString, isNullOrUnDef } from '/@/utils/is';\nimport { unref } from 'vue';\nimport type { Ref, ComputedRef } from 'vue';\nimport type { FormProps, FormSchema } from '../types/form';\nimport dayjs from \"dayjs\";\nimport { set } from 'lodash-es';\nimport { handleRangeValue } from '/@/components/Form/src/utils/formUtils';\n\ninterface UseFormValuesContext {\n  defaultValueRef: Ref<any>;\n  getSchema: ComputedRef<FormSchema[]>;\n  getProps: ComputedRef<FormProps>;\n  formModel: Recordable;\n}\nexport function useFormValues({ defaultValueRef, getSchema, formModel, getProps }: UseFormValuesContext) {\n  // Processing form values\n  function handleFormValues(values: Recordable) {\n    if (!isObject(values)) {\n      return {};\n    }\n    const res: Recordable = {};\n    for (const item of Object.entries(values)) {\n      let [, value] = item;\n      const [key] = item;\n      if (!key || (isArray(value) && value.length === 0) || isFunction(value)) {\n        continue;\n      }\n      const transformDateFunc = unref(getProps).transformDateFunc;\n      if (isObject(value)) {\n        value = transformDateFunc?.(value);\n      }\n      // 判断是否是dayjs实例\n      if (isArray(value) && dayjs.isDayjs(value[0]) && dayjs.isDayjs(value[1])) {\n        value = value.map((item) => transformDateFunc?.(item));\n      }\n      // Remove spaces\n      if (isString(value)) {\n        value = value.trim();\n      }\n      set(res, key, value);\n    }\n    return handleRangeValue(getProps, res);\n  }\n\n  function initDefault() {\n    const schemas = unref(getSchema);\n    const obj: Recordable = {};\n    schemas.forEach((item) => {\n      const { defaultValue } = item;\n      if (!isNullOrUnDef(defaultValue)) {\n        obj[item.field] = defaultValue;\n        formModel[item.field] = defaultValue;\n      }\n    });\n    defaultValueRef.value = obj;\n  }\n\n  return { handleFormValues, initDefault };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/hooks/useLabelWidth.ts",
    "content": "import type { Ref } from 'vue';\nimport type { FormProps, FormSchema } from '../types/form';\n\nimport { computed, unref } from 'vue';\nimport { isNumber } from '/@/utils/is';\n\nexport function useItemLabelWidth(schemaItemRef: Ref<FormSchema>, propsRef: Ref<FormProps>) {\n  return computed(() => {\n    const schemaItem = unref(schemaItemRef);\n    const { labelCol = {}, wrapperCol = {} } = schemaItem.itemProps || {};\n    const { labelWidth, disabledLabelWidth } = schemaItem;\n\n    const { labelWidth: globalLabelWidth, labelCol: globalLabelCol, wrapperCol: globWrapperCol,layout } = unref(propsRef);\n\n    // 代码逻辑说明: 禁用全局 labelWidth，不自动设置 textAlign --------\n    if (disabledLabelWidth) {\n      return { labelCol, wrapperCol };\n    }\n\n    // If labelWidth is set globally, all items setting\n    if (!globalLabelWidth && !labelWidth && !globalLabelCol) {\n      labelCol.style = {\n        textAlign: 'left',\n      };\n      return { labelCol, wrapperCol };\n    }\n    let width = labelWidth || globalLabelWidth;\n    let col = { ...globalLabelCol, ...labelCol };\n    const wrapCol = { ...globWrapperCol, ...wrapperCol };\n\n    if (width) {\n      width = isNumber(width) ? `${width}px` : width;\n      // 代码逻辑说明: 【issues/6865】配置单个的labelWidth不生效\n      col = {};\n    }\n\n    return {\n      labelCol: { style: { width: width ? width : '100%' }, ...col },\n      wrapperCol: {\n        style: { width: layout === 'vertical' ? '100%' : `calc(100% - ${width})` },\n        ...wrapCol,\n      },\n    };\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JAddInput.vue",
    "content": "<template>\n  <div v-for=\"(param, index) in dynamicInput.params\" :key=\"index\" style=\"display: flex\">\n    <a-input placeholder=\"请输入参数key\" v-model:value=\"param.label\" style=\"width: 30%; margin-bottom: 5px\" @input=\"emitChange\" />\n    <a-input placeholder=\"请输入参数value\" v-model:value=\"param.value\" style=\"width: 30%; margin: 0 0 5px 5px\" @input=\"emitChange\" />\n    <MinusCircleOutlined\n      v-if=\"dynamicInput.params.length > min\"\n      class=\"dynamic-delete-button\"\n      @click=\"remove(param)\"\n      style=\"width: 50px\"\n    ></MinusCircleOutlined>\n  </div>\n  <div>\n    <a-button type=\"dashed\" style=\"width: 60%\" @click=\"add\">\n      <PlusOutlined />\n      新增\n    </a-button>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons-vue';\n  import { defineComponent, reactive, ref, UnwrapRef, watchEffect } from 'vue';\n  import { propTypes } from '/@/utils/propTypes';\n  import { isEmpty } from '/@/utils/is';\n  import { tryOnMounted, tryOnUnmounted } from '@vueuse/core';\n  interface Params {\n    label: string;\n    value: string;\n  }\n\n  export default defineComponent({\n    name: 'JAddInput',\n    props: {\n      value: propTypes.string.def(''),\n      //自定义删除按钮多少才会显示\n      min: propTypes.integer.def(1),\n    },\n    emits: ['change', 'update:value'],\n    setup(props, { emit }) {\n      //input动态数据\n      const dynamicInput: UnwrapRef<{ params: Params[] }> = reactive({ params: [] });\n      //删除Input\n      const remove = (item: Params) => {\n        let index = dynamicInput.params.indexOf(item);\n        if (index !== -1) {\n          dynamicInput.params.splice(index, 1);\n        }\n        emitChange();\n      };\n      //新增Input\n      const add = () => {\n        dynamicInput.params.push({\n          label: '',\n          value: '',\n        });\n        emitChange();\n      };\n\n      //监听传入数据value\n      watchEffect(() => {\n        initVal();\n      });\n\n      /**\n       * 初始化数值\n       */\n      function initVal() {\n        console.log('props.value', props.value);\n        dynamicInput.params = [];\n        if (props.value && props.value.indexOf('{') == 0) {\n          let jsonObj = JSON.parse(props.value);\n          Object.keys(jsonObj).forEach((key) => {\n            dynamicInput.params.push({ label: key, value: jsonObj[key] });\n          });\n        }\n      }\n      /**\n       * 数值改变\n       */\n      function emitChange() {\n        let obj = {};\n        if (dynamicInput.params.length > 0) {\n          dynamicInput.params.forEach((item) => {\n            obj[item['label']] = item['value'];\n          });\n        }\n        emit('change', isEmpty(obj) ? '' : JSON.stringify(obj));\n        emit('update:value', isEmpty(obj) ? '' : JSON.stringify(obj));\n      }\n\n      return {\n        dynamicInput,\n        emitChange,\n        remove,\n        add,\n      };\n    },\n    components: {\n      MinusCircleOutlined,\n      PlusOutlined,\n    },\n  });\n</script>\n<style scoped>\n  .dynamic-delete-button {\n    cursor: pointer;\n    position: relative;\n    top: 4px;\n    font-size: 24px;\n    color: #999;\n    transition: all 0.3s;\n  }\n\n  .dynamic-delete-button:hover {\n    color: #777;\n  }\n\n  .dynamic-delete-button[disabled] {\n    cursor: not-allowed;\n    opacity: 0.5;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JAreaLinkage.vue",
    "content": "<template>\n  <Cascader v-bind=\"attrs\" :value=\"cascaderValue\" :options=\"getOptions\" @change=\"handleChange\" />\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, ref, reactive, watchEffect, computed, unref, watch, onMounted } from 'vue';\n  import { Cascader } from 'ant-design-vue';\n  import { provinceAndCityData, regionData, provinceAndCityDataPlus, regionDataPlus } from '../../utils/areaDataUtil';\n  import { useRuleFormItem } from '/@/hooks/component/useFormItem';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { isArray } from '/@/utils/is';\n\n  export default defineComponent({\n    name: 'JAreaLinkage',\n    components: {\n      Cascader,\n    },\n    inheritAttrs: false,\n    props: {\n      value: propTypes.oneOfType([propTypes.object, propTypes.array, propTypes.string]),\n      //是否显示区县\n      showArea: propTypes.bool.def(true),\n      //是否是全部\n      showAll: propTypes.bool.def(false),\n      // 存储数据 （all时：传递到外面的是数组；province, city, region传递外面的是字符串）\n      saveCode: propTypes.oneOf(['province', 'city', 'region', 'all']).def('all'),\n    },\n    emits: ['options-change', 'change', 'update:value'],\n    setup(props, { emit, refs }) {\n      const emitData = ref<any[]>([]);\n      const attrs = useAttrs();\n      // const [state] = useRuleFormItem(props, 'value', 'change', emitData);\n      const cascaderValue = ref([]);\n      const getOptions = computed(() => {\n        if (props.showArea && props.showAll) {\n          return regionDataPlus;\n        }\n        if (props.showArea && !props.showAll) {\n          return regionData;\n        }\n        if (!props.showArea && !props.showAll) {\n          return provinceAndCityData;\n        }\n        if (!props.showArea && props.showAll) {\n          return provinceAndCityDataPlus;\n        }\n      });\n      /**\n       * 监听value变化\n       */\n      watchEffect(() => {\n        // 代码逻辑说明: 【TV360X-1223】省市区换新组件\n        if (props.value) {\n          initValue();\n        } else {\n          cascaderValue.value = [];\n        }\n      });\n\n      /**\n       * 将字符串值转化为数组\n       */\n      function initValue() {\n        let value = props.value ? props.value : [];\n        // 代码逻辑说明: 【TV360X-501】省市区换新组件\n        if (value && typeof value === 'string' && value != 'null' && value != 'undefined') {\n          const arr = value.split(',');\n          cascaderValue.value = transform(arr);\n        } else if (isArray(value)) {\n          if (value.length) {\n            cascaderValue.value = transform(value);\n          } else {\n            cascaderValue.value = [];\n          }\n        }\n      }\n      function transform(arr) {\n        let result: any = [];\n        if (props.saveCode === 'region') {\n          const regionCode = arr[0];\n          result = [`${regionCode.substring(0, 2)}0000`, `${regionCode.substring(0, 2)}${regionCode.substring(2, 4)}00`, regionCode];\n        } else if (props.saveCode === 'city') {\n          const cityCode = arr[0];\n          result = [`${cityCode.substring(0, 2)}0000`, cityCode];\n        } else if (props.saveCode === 'province') {\n          const provinceCode = arr[0];\n          result = [provinceCode];\n        } else {\n          result = arr;\n        }\n        return result;\n      }\n      /**\n       * liaozhiyang\n       * 2024-06-17\n       * 【TV360X-1224】省市区组件默认传到外面的值是字符串逗号分隔\n       * */\n      const send = (data) => {\n        let result = data;\n        if (result) {\n          if (props.saveCode === 'all') {\n            // 传递的是数组\n          } else {\n            // 传递的是字符串\n            result = data.join(',');\n          }\n        }\n        emit('change', result);\n        emit('update:value', result);\n      };\n\n      function handleChange(arr, ...args) {\n        // 代码逻辑说明: 【TV360X-501】省市区换新组件\n        if (arr?.length) {\n          let result: any = [];\n          if (props.saveCode === 'region') {\n            // 可能只有两位（选择香港时，只有省区）\n            result = [arr[arr.length - 1]];\n          } else if (props.saveCode === 'city') {\n            result = [arr[1]];\n          } else if (props.saveCode === 'province') {\n            result = [arr[0]];\n          } else {\n            result = arr;\n          }\n          send(result);\n        } else {\n          send(arr);\n        }\n        // emitData.value = args;\n        // 上面改的v-model:value导致选中数据没有显示\n        // state.value = result;\n      }\n      \n      return {\n        cascaderValue,\n        attrs,\n        regionData,\n        getOptions,\n        handleChange,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JAreaSelect.vue",
    "content": "<template>\n  <a-form-item-rest>\n    <div class=\"area-select\">\n      <!--省份-->\n      <a-select v-model:value=\"province\" @change=\"proChange\" allowClear :disabled=\"disabled\">\n        <template v-for=\"item in provinceOptions\" :key=\"`${item.value}`\">\n          <a-select-option :value=\"item.value\">{{ item.label }}</a-select-option>\n        </template>\n      </a-select>\n      <!--城市-->\n      <a-select v-if=\"level >= 2\" v-model:value=\"city\" @change=\"cityChange\" :disabled=\"disabled\">\n        <template v-for=\"item in cityOptions\" :key=\"`${item.value}`\">\n          <a-select-option :value=\"item.value\">{{ item.label }}</a-select-option>\n        </template>\n      </a-select>\n      <!--地区-->\n      <a-select v-if=\"level >= 3\" v-model:value=\"area\" @change=\"areaChange\" :disabled=\"disabled\">\n        <template v-for=\"item in areaOptions\" :key=\"`${item.value}`\">\n          <a-select-option :value=\"item.value\">{{ item.label }}</a-select-option>\n        </template>\n      </a-select>\n    </div>\n  </a-form-item-rest>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, ref, reactive, watchEffect, computed, unref, watch, onMounted, onUnmounted, toRefs } from 'vue';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useRuleFormItem } from '/@/hooks/component/useFormItem';\n  import { provinceOptions, getDataByCode, getRealCode } from '../../utils/areaDataUtil';\n\n  export default defineComponent({\n    name: 'JAreaSelect',\n    props: {\n      value: [Array, String],\n      province: [String],\n      city: [String],\n      area: [String],\n      level: propTypes.number.def(3),\n      disabled: propTypes.bool.def(false),\n      codeField: propTypes.string,\n      size: propTypes.string,\n      placeholder: propTypes.string,\n      formValues: propTypes.any,\n      allowClear: propTypes.bool.def(false),\n      getPopupContainer: {\n        type: Function,\n        default: (node) => node?.parentNode,\n      },\n    },\n    emits: ['change', 'update:value','update:area','update:city','update:province'],\n    setup(props, { emit, refs }) {\n      const emitData = ref<any[]>([]);\n      //下拉框的选择值\n      const pca = reactive({\n        province: '',\n        city: '',\n        area: '',\n      });\n      //表单值\n      const [state] = useRuleFormItem(props, 'value', 'change', emitData);\n      //城市下拉框的选项\n      const cityOptions = computed(() => {\n        return pca.province ? getDataByCode(pca.province) : [];\n      });\n      //地区下拉框的选项\n      const areaOptions = computed(() => {\n        return pca.city ? getDataByCode(pca.city) : [];\n      });\n      /**\n       * 监听props值\n       */\n      watchEffect(() => {\n        props && initValue();\n      });\n\n      /**\n       * 监听组件值变化\n       */\n      watch(pca, (newVal) => {\n        if (!props.value) {\n          emit('update:province', pca.province);\n          emit('update:city', pca.city);\n          emit('update:area', pca.area);\n        }\n      });\n      /**\n       * 数据初始化\n       */\n      function initValue() {\n        if (props.value) {\n          //传参是数组的情况下的处理\n          if (Array.isArray(props.value)) {\n            pca.province = props.value[0];\n            pca.city = props.value[1] ? props.value[1] : '';\n            pca.area = props.value[2] ? props.value[2] : '';\n          } else {\n            //传参是数值\n            let valueArr = getRealCode(props.value, props.level);\n            if (valueArr) {\n              pca.province = valueArr[0];\n              pca.city = props.level >= 2 && valueArr[1] ? valueArr[1] : '';\n              pca.area = props.level >= 3 && valueArr[2] ? valueArr[2] : '';\n            }\n          }\n        } else {\n          //绑定三个数据的情况\n          pca.province = props.province ? props.province : '';\n          pca.city = props.city ? props.city : '';\n          pca.area = props.area ? props.area : '';\n        }\n      }\n\n      /**\n       * 省份change事件\n       */\n      function proChange(val) {\n        pca.city = val && getDataByCode(val)[0]?.value;\n        pca.area = pca.city && getDataByCode(pca.city)[0]?.value;\n        state.value = props.level <= 1 ? val : props.level <= 2 ? pca.city : pca.area;\n        emit('update:value', unref(state));\n      }\n\n      /**\n       * 城市change事件\n       */\n      function cityChange(val) {\n        pca.area = val && getDataByCode(val)[0]?.value;\n        state.value = props.level <= 2 ? val : pca.area;\n        emit('update:value', unref(state));\n      }\n\n      /**\n       * 区域change事件\n       */\n      function areaChange(val) {\n        state.value = val;\n        emit('update:value', unref(state));\n      }\n\n      return {\n        ...toRefs(pca),\n        provinceOptions,\n        cityOptions,\n        areaOptions,\n        proChange,\n        cityChange,\n        areaChange,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .area-select {\n    width: 100%;\n\n    /* update-begin-author:taoyan date:2023-2-18 for: QQYUN-4292【online表单】高级查询 2.省市县样式问题 */\n   /* display: flex;*/\n\n    .ant-select {\n      width: calc(33.3% - 7px)\n    }\n    /* update-end-author:taoyan date:2023-2-18 for:  QQYUN-4292【online表单】高级查询 2.省市县样式问题 */\n\n    .ant-select:not(:first-child) {\n      margin-left: 10px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JCategorySelect.vue",
    "content": "<!--下拉树-->\n<template>\n  <a-tree-select\n    allowClear\n    labelInValue\n    style=\"width: 100%\"\n    :disabled=\"disabled\"\n    :dropdownStyle=\"{ maxHeight: '400px', overflow: 'auto' }\"\n    showCheckedStrategy=\"SHOW_ALL\"\n    :placeholder=\"placeholder\"\n    :loadData=\"asyncLoadTreeData\"\n    :value=\"treeValue\"\n    :treeData=\"treeData\"\n    :multiple=\"multiple\"\n    @change=\"onChange\"\n  >\n  </a-tree-select>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, unref, watch, nextTick } from 'vue';\n  import { useRuleFormItem } from '/@/hooks/component/useFormItem';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { loadDictItem, loadTreeData } from '/@/api/common/api';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  const { createMessage, createErrorModal } = useMessage();\n  export default defineComponent({\n    name: 'JCategorySelect',\n    components: {},\n    inheritAttrs: false,\n    props: {\n      value: propTypes.oneOfType([propTypes.string, propTypes.array]),\n      placeholder: {\n        type: String,\n        default: '请选择',\n        required: false,\n      },\n      disabled: {\n        type: Boolean,\n        default: false,\n        required: false,\n      },\n      condition: {\n        type: String,\n        default: '',\n        required: false,\n      },\n      // 是否支持多选\n      multiple: {\n        type: [Boolean, String],\n        default: false,\n      },\n      loadTriggleChange: {\n        type: Boolean,\n        default: false,\n        required: false,\n      },\n      pid: {\n        type: String,\n        default: '',\n        required: false,\n      },\n      pcode: {\n        type: String,\n        default: '',\n        required: false,\n      },\n      back: {\n        type: String,\n        default: '',\n        required: false,\n      },\n    },\n    emits: ['options-change', 'change', 'update:value'],\n    setup(props, { emit, refs }) {\n      console.info(props);\n      const emitData = ref<any[]>([]);\n      const treeData = ref<any[]>([]);\n      const treeValue = ref();\n      const attrs = useAttrs();\n      const [state, , , formItemContext] = useRuleFormItem(props, 'value', 'change', emitData);\n      watch(\n        () => props.value,\n        () => {\n          loadItemByCode();\n        },\n        // 代码逻辑说明: 【TV360X-480】封装表单和原生表单，默认值生成有问题的字段：分类字典树附默认值不生效---\n        { deep: true, immediate: true }\n      );\n      watch(\n        () => props.pcode,\n        () => {\n          loadRoot();\n        },\n        { deep: true, immediate: true }\n      );\n\n      function loadRoot() {\n        let param = {\n          pid: props.pid,\n          pcode: !props.pcode ? '0' : props.pcode,\n          condition: props.condition,\n        };\n        console.info(param);\n        loadTreeData(param).then((res) => {\n            if(res && res.length>0){\n                for (let i of res) {\n                    i.value = i.key;\n                    if (i.leaf == false) {\n                        i.isLeaf = false;\n                    } else if (i.leaf == true) {\n                        i.isLeaf = true;\n                    }\n                }\n                treeData.value = res;\n\t\t\t\t\t\t}\n        });\n      }\n\n      function loadItemByCode() {\n        if (!props.value || props.value == '0') {\n          if(props.multiple){\n            treeValue.value = [];\n          }else{\n            treeValue.value = { value: null, label: null };\n          }\n        } else {\n          console.log(\"props.value:::\",props.value)\n          loadDictItem({ ids: props.value }).then((res) => {\n            let values = props.value.split(',');\n            treeValue.value = res.map((item, index) => ({\n              key: values[index],\n              value: values[index],\n              label: item,\n            }));\n            if(!props.multiple){\n              treeValue.value = treeValue.value[0];\n            }\n            onLoadTriggleChange(res[0]);\n          });\n        }\n      }\n\n      function onLoadTriggleChange(text) {\n        //只有单选才会触发\n        if (!props.multiple && props.loadTriggleChange) {\n          backValue(props.value, text);\n        }\n      }\n\n      function backValue(value, label) {\n        let obj = {};\n        if (props.back) {\n          obj[props.back] = label;\n        }\n        emit('change', value, obj);\n        emit(\"update:value\",value)\n      }\n\n      function asyncLoadTreeData(treeNode) {\n        let dataRef = treeNode.dataRef;\n        return new Promise<void>((resolve) => {\n          if (treeNode.children && treeNode.children.length > 0) {\n            resolve();\n            return;\n          }\n          let pid = dataRef.key;\n          let param = {\n            pid: pid,\n            condition: props.condition,\n          };\n          loadTreeData(param).then((res) => {\n            if (res) {\n              for (let i of res) {\n                i.value = i.key;\n                if (i.leaf == false) {\n                  i.isLeaf = false;\n                } else if (i.leaf == true) {\n                  i.isLeaf = true;\n                }\n              }\n              addChildren(pid, res, treeData.value);\n              resolve();\n            }\n          });\n        });\n      }\n\n      function addChildren(pid, children, treeArray) {\n        if (treeArray && treeArray.length > 0) {\n          for (let item of treeArray) {\n            if (item.key == pid) {\n              if (!children || children.length == 0) {\n                item.isLeaf = true;\n              } else {\n                item.children = children;\n              }\n              break;\n            } else {\n              addChildren(pid, children, item.children);\n            }\n          }\n        }\n      }\n\n      function onChange(value) {\n        if (!value) {\n          emit('change', '');\n          treeValue.value = '';\n          emit(\"update:value\",'')\n        } else if (Array.isArray(value)) {\n          let labels = [];\n          let values = value.map((item) => {\n            labels.push(item.label);\n            return item.value;\n          });\n          backValue(values.join(','), labels.join(','));\n          treeValue.value = value;\n        } else {\n          backValue(value.value, value.label);\n          treeValue.value = value;\n        }\n        // 代码逻辑说明: 【QQYUN-9110】组件有值校验没消失\n        nextTick(() => {\n          formItemContext?.onFieldChange();\n        });\n      }\n\n      function getCurrTreeData() {\n        return treeData;\n      }\n\n      function validateProp() {\n        let mycondition = props.condition;\n        return new Promise((resolve, reject) => {\n          if (!mycondition) {\n            resolve();\n          } else {\n            try {\n              let test = JSON.parse(mycondition);\n              if (typeof test == 'object' && test) {\n                resolve();\n              } else {\n                createMessage.error('组件JTreeSelect-condition传值有误，需要一个json字符串!');\n                reject();\n              }\n            } catch (e) {\n              createMessage.error('组件JTreeSelect-condition传值有误，需要一个json字符串!');\n              reject();\n            }\n          }\n        });\n      }\n\n      return {\n        state,\n        attrs,\n        onChange,\n        treeData,\n        treeValue,\n        asyncLoadTreeData,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JCheckbox.vue",
    "content": "<template>\n  <a-checkbox-group v-bind=\"attrs\" v-model:value=\"checkboxArray\" :options=\"checkOptions\" @change=\"handleChange\">\n    <template #label=\"{label, value}\">\n      <span :class=\"[useDicColor && getDicColor(value) ? 'colorText' : '']\" :style=\"{ backgroundColor: `${getDicColor(value)}` }\">{{ label }}</span>\n    </template>\n  </a-checkbox-group>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, computed, watch, watchEffect, ref, unref } from 'vue';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import {getDictItems} from \"@/api/common/api\";\n\n  export default defineComponent({\n    name: 'JCheckbox',\n    props: {\n      value:propTypes.oneOfType([propTypes.string, propTypes.number]),\n      dictCode: propTypes.string,\n      useDicColor: propTypes.bool.def(false),\n      options: {\n        type: Array,\n        default: () => [],\n      },\n    },\n    emits: ['change', 'update:value'],\n    setup(props, { emit }) {\n      const attrs = useAttrs();\n      //checkbox选项\n      const checkOptions = ref<any[]>([]);\n      //checkbox数值\n      const checkboxArray = ref<any[]>([]);\n      /**\n       * 监听value\n       */\n      watchEffect(() => {\n        // 代码逻辑说明: issues/I5E7YX AUTO在线表单进入功能测试之后一直卡在功能测试界面\n        let temp = props.value;\n        if(!temp && temp!==0){\n          checkboxArray.value = []\n        }else{\n          temp = temp + '';\n          checkboxArray.value = temp.split(',')\n        }\n        // 代码逻辑说明: 调用表单的 resetFields不会清空当前信息，界面显示上一次的数据\n        if (props.value === '' || props.value === undefined) {\n          checkboxArray.value = [];\n        }\n      });\n      /**\n       * 监听字典code\n       */\n      watchEffect(() => {\n        props && initOptions();\n      });\n\n      /**\n       * 初始化选项\n       */\n      async function initOptions() {\n        //根据options, 初始化选项\n        if (props.options && props.options.length > 0) {\n          checkOptions.value = props.options;\n          return;\n        }\n        //根据字典Code, 初始化选项\n        if (props.dictCode) {\n          loadDictOptions()\n        }\n      }\n\n      // 根据字典code查询字典项\n      function loadDictOptions() {\n        // 代码逻辑说明: 字典数据请求前将参数编码处理，但是不能直接编码，因为可能之前已经编码过了\n        let temp = props.dictCode || '';\n        if (temp.indexOf(',') > 0 && temp.indexOf(' ') > 0) {\n          // 编码后 是不包含空格的\n          temp = encodeURI(temp);\n        }\n        getDictItems(temp).then((res) => {\n          if (res) {\n            checkOptions.value = res.map((item) => ({value: item.value, label: item.text, color: item.color}));\n            //console.info('res', dictOptions.value);\n          } else {\n            console.error('getDictItems error: : ', res);\n            checkOptions.value = [];\n          }\n        });\n      }\n\n      /**\n       * change事件\n       * @param $event\n       */\n      function handleChange($event) {\n        emit('update:value', $event.join(','));\n        emit('change', $event.join(','));\n      }\n      const getDicColor = (value) => {\n        if (props.useDicColor) {\n          const findItem = checkOptions.value.find((item) => item.value == value);\n          if (findItem) {\n            return findItem.color;\n          }\n        }\n        return null;\n      };\n      return { checkboxArray, checkOptions, attrs, handleChange, getDicColor };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  // 代码逻辑说明: 【QQYUN-7799】字典组件（原生组件除外）加上颜色配置\n  .colorText {\n    display: inline-block;\n    height: 20px;\n    line-height: 20px;\n    padding: 0 6px;\n    border-radius: 8px;\n    background-color: red;\n    color: #fff;\n    font-size: 12px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JCodeEditor.vue",
    "content": "<template>\n  <div ref=\"containerRef\" v-bind=\"boxBindProps\">\n    <!-- 全屏按钮 -->\n    <a-icon v-if=\"fullScreen\" class=\"full-screen-icon\" :type=\"fullScreenIcon\" @click=\"onToggleFullScreen\" />\n    <textarea ref=\"textarea\" v-bind=\"getBindValue\"></textarea>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, onMounted, reactive, ref, watch, unref, computed } from 'vue';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useRuleFormItem } from '/@/hooks/component/useFormItem';\n  // 引入全局实例\n  import _CodeMirror, { EditorFromTextArea } from 'codemirror';\n  // 核心样式\n  import 'codemirror/lib/codemirror.css';\n  // 引入主题后还需要在 options 中指定主题才会生效\n  import 'codemirror/theme/idea.css';\n  // 需要引入具体的语法高亮库才会有对应的语法高亮效果\n  import 'codemirror/mode/javascript/javascript.js';\n  import 'codemirror/mode/css/css.js';\n  import 'codemirror/mode/xml/xml.js';\n  import 'codemirror/mode/clike/clike.js';\n  import 'codemirror/mode/markdown/markdown.js';\n  import 'codemirror/mode/python/python.js';\n  import 'codemirror/mode/r/r.js';\n  import 'codemirror/mode/shell/shell.js';\n  import 'codemirror/mode/sql/sql.js';\n  import 'codemirror/mode/swift/swift.js';\n  import 'codemirror/mode/vue/vue.js';\n  // 折叠资源引入:开始\n  import 'codemirror/addon/fold/foldgutter.css';\n  import 'codemirror/addon/fold/foldcode.js';\n  import 'codemirror/addon/fold/brace-fold.js';\n  import 'codemirror/addon/fold/comment-fold.js';\n  import 'codemirror/addon/fold/indent-fold.js';\n  import 'codemirror/addon/fold/foldgutter.js';\n  // 折叠资源引入:结束\n  //光标行背景高亮，配置里面也需要styleActiveLine设置为true\n  import 'codemirror/addon/selection/active-line.js';\n  // 支持代码自动补全\n  import 'codemirror/addon/hint/show-hint.css';\n  import 'codemirror/addon/hint/show-hint.js';\n  import 'codemirror/addon/hint/anyword-hint.js';\n  // 匹配括号\n  import 'codemirror/addon/edit/matchbrackets';\n  // 占位符\n  import 'codemirror/addon/display/placeholder.js';\n  \n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { isJsonObjectString } from '/@/utils/is.ts';\n  // 代码提示\n  import { useCodeHinting } from '../hooks/useCodeHinting';\n\n  import { useRootSetting } from '/@/hooks/setting/useRootSetting';\n  import { ThemeEnum } from '/@/enums/appEnum';\n  export default defineComponent({\n    name: 'JCodeEditor',\n    // 不将 attrs 的属性绑定到 html 标签上\n    inheritAttrs: false,\n    components: {},\n    props: {\n      value: propTypes.string.def(''),\n      height: propTypes.string.def('auto'),\n      disabled: propTypes.bool.def(false),\n      // 是否显示全屏按钮\n      fullScreen: propTypes.bool.def(false),\n      // 全屏以后的z-index\n      zIndex: propTypes.any.def(1500),\n      theme: propTypes.string.def('idea'),\n      language: propTypes.string.def(''),\n      // 代码提示\n      keywords: propTypes.array.def([]),\n    },\n    emits: ['change', 'update:value'],\n    setup(props, { emit }) {\n      const { getDarkMode } = useRootSetting();\n      const containerRef = ref(null);\n      const { prefixCls } = useDesign('code-editer');\n      const CodeMirror = window.CodeMirror || _CodeMirror;\n      const emitData = ref<object>();\n      //表单值\n      const [state] = useRuleFormItem(props, 'value', 'change', emitData);\n      const textarea = ref<HTMLTextAreaElement>();\n      let coder: Nullable<EditorFromTextArea> = null;\n      const attrs = useAttrs();\n      const height = ref(props.height);\n      const options = reactive({\n        // 缩进格式\n        tabSize: 2,\n        // 主题，对应主题库 JS 需要提前引入\n        // 代码逻辑说明: 【QQYUN-8639】暗黑主题适配\n        theme: getDarkMode.value == ThemeEnum.DARK ? 'monokai' : props.theme,\n        smartIndent: true, // 是否智能缩进\n        // 显示行号\n        lineNumbers: true,\n        line: true,\n        // 启用代码折叠相关功能:开始\n        foldGutter: true,\n        lineWrapping: true,\n        gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter', 'CodeMirror-lint-markers'],\n        // 启用代码折叠相关功能:结束\n        // 光标行高亮\n        styleActiveLine: true,\n        // 代码逻辑说明: 【issues/869】JCodeEditor组件初始化时没有设置mode\n        mode: props.language,\n        // 代码逻辑说明: 【TV360X-898】代码生成之后的预览改成只读\n        readOnly: props.disabled,\n        // 匹配括号\n        matchBrackets: true,\n        extraKeys: {\n          // Tab: function autoFormat(editor) {\n          //   //var totalLines = editor.lineCount();\n          //   //editor.autoFormatRange({line:0, ch:0}, {line:totalLines});\n          //   setValue(innerValue, false);\n          // },\n          'Cmd-/': (cm) => comment(cm),\n          'Ctrl-/': (cm) => comment(cm),\n        },\n      });\n      // 内部存储值，初始为 props.value\n      let innerValue = props.value ?? '';\n      // 全屏状态\n      const isFullScreen = ref(false);\n      const fullScreenIcon = computed(() => (isFullScreen.value ? 'fullscreen-exit' : 'fullscreen'));\n      // 外部盒子参数\n      const boxBindProps = computed(() => {\n        let _props = {\n          class: [\n            prefixCls,\n            'full-screen-parent',\n            'auto-height',\n            {\n              'full-screen': isFullScreen.value,\n            },\n          ],\n          style: {},\n        };\n        if (isFullScreen.value) {\n          _props.style['z-index'] = props.zIndex;\n        }\n        return _props;\n      });\n      // 代码逻辑说明: 【QQYUN-5955】online js增强，加入代码提示\n      const { codeHintingMount, codeHintingRegistry } = useCodeHinting(CodeMirror, props.keywords, props.language);\n      codeHintingRegistry();\n      /**\n       * 监听组件值\n       */\n      watch(\n        () => props.value,\n        () => {\n          if (innerValue != props.value) {\n            setValue(props.value, false);\n          }\n        }\n      );\n      onMounted(() => {\n        initialize();\n        // 代码逻辑说明: 【QQYUN-8473】代码编辑器首次加载会有遮挡\n        setTimeout(() => {\n          refresh();\n        }, 150);\n      });\n\n      /**\n       * 组件赋值\n       * @param value\n       * @param trigger 是否触发 change 事件\n       */\n      function setValue(value: string, trigger = true) {\n        if (value && isJsonObjectString(value)) {\n          value = JSON.stringify(JSON.parse(value), null, 2);\n        }\n        coder?.setValue(value ?? '');\n        innerValue = value;\n        trigger && emitChange(innerValue);\n        // 代码逻辑说明: 【QQYUN-9231】代码编辑器有遮挡\n        setTimeout(() => {\n          refresh();\n          // 再次刷下防止小概率下遮挡问题\n          setTimeout(() => {\n            refresh();\n          }, 600);\n        }, 400);\n      }\n\n      //编辑器值修改事件\n      function onChange(obj) {\n        let value = obj.getValue();\n        innerValue = value || '';\n        if (props.value != innerValue) {\n          emitChange(innerValue);\n        }\n      }\n\n      function emitChange(value) {\n        emit('change', value);\n        emit('update:value', value);\n      }\n\n      //组件初始化\n      function initialize() {\n        coder = CodeMirror.fromTextArea(textarea.value!, options);\n        //绑定值修改事件\n        coder.on('change', onChange);\n        // 初始化成功时赋值一次\n        setValue(innerValue, false);\n        // 代码逻辑说明: 【QQYUN-5955】online js增强，加入代码提示\n        codeHintingMount(coder);\n      }\n\n      // 切换全屏状态\n      function onToggleFullScreen() {\n        isFullScreen.value = !isFullScreen.value;\n      }\n\n      // 代码逻辑说明: codeEditor禁用功能\n      watch(\n        () => props.disabled,\n        (val) => {\n          if (coder) {\n            coder.setOption('readOnly', val);\n          }\n        }\n      );\n      \n      // 支持动态设置语言\n      watch(()=>props.language, (val)=>{\n        if(val && coder){\n          coder.setOption('mode', val);\n        }\n      });\n\n      const getBindValue = Object.assign({}, unref(props), unref(attrs));\n\n      // 代码逻辑说明: VUEN-2480【严重bug】online vue3测试的问题 8、online js增强样式问题\n      function refresh(){\n        if(coder){\n          coder.refresh();\n        }\n      }\n\n      /**\n       * 2024-04-01\n       * liaozhiyang\n       * 代码批量注释\n       */\n      function comment(cm) {\n        var selection = cm.getSelection();\n        var start = cm.getCursor('start');\n        var end = cm.getCursor('end');\n        var isCommented = selection.startsWith('//');\n        if (isCommented) {\n          // 如果已经被注释，取消注释\n          cm.replaceRange(selection.replace(/\\n\\/\\/\\s/g, '\\n').replace(/^\\/\\/\\s/, ''), start, end);\n        } else {\n          // 添加注释\n          cm.replaceRange('// ' + selection.replace(/\\n(?=.)/g, '\\n// '), start, end);\n        }\n      }\n\n      return {\n        state,\n        textarea,\n        boxBindProps,\n        getBindValue,\n        setValue,\n        isFullScreen,\n        fullScreenIcon,\n        onToggleFullScreen,\n        refresh,\n        containerRef,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\">\n  //noinspection LessUnresolvedVariable\n  @prefix-cls: ~'@{namespace}-code-editer';\n  .@{prefix-cls} {\n    &.auto-height {\n      .CodeMirror {\n        height: v-bind(height) !important;\n        min-height: 100px;\n      }\n    }\n\n    /* 全屏样式 */\n\n    &.full-screen-parent {\n      position: relative;\n\n      .full-screen-icon {\n        opacity: 0;\n        color: black;\n        width: 20px;\n        height: 20px;\n        line-height: 24px;\n        background-color: white;\n        position: absolute;\n        top: 2px;\n        right: 2px;\n        z-index: 9;\n        cursor: pointer;\n        transition: opacity 0.3s;\n        padding: 2px 0 0 1.5px;\n      }\n\n      &:hover {\n        .full-screen-icon {\n          opacity: 1;\n\n          &:hover {\n            background-color: rgba(255, 255, 255, 0.88);\n          }\n        }\n      }\n\n      &.full-screen {\n        position: fixed;\n        top: 0;\n        right: 0;\n        bottom: 0;\n        left: 0;\n        padding: 8px;\n        background-color: #f5f5f5;\n\n        .full-screen-icon {\n          top: 12px;\n          right: 12px;\n        }\n\n        .full-screen-child,\n        .CodeMirror {\n          height: 100%;\n          max-height: 100%;\n          min-height: 100%;\n        }\n      }\n\n      .full-screen-child {\n        height: 100%;\n      }\n    }\n    \n    /** VUEN-2344【vue3】这个样式有问题，是不是加个边框 */\n    .CodeMirror{\n      border: 1px solid #ddd;\n    }\n    .CodeMirror pre.CodeMirror-placeholder {\n      color: #cacaca;\n      font-family: -apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;\n    }\n  }\n  .CodeMirror-hints.idea,\n  .CodeMirror-hints.monokai {\n    z-index: 1001;\n    max-width: 600px;\n    max-height: 300px;\n  }\n  // 代码逻辑说明: 【QQYUN-8639】暗黑主题适配\n  html[data-theme='dark'] {\n    .@{prefix-cls} {\n      .CodeMirror {\n        border: 1px solid #3a3a3a;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JDatePickerMultiple.vue",
    "content": "<!-- 多选日期 -->\n<template>\n  <div class=\"j-date-multiple\" ref=\"wrapperRef\">\n    <!-- 显示选中项：使用 ASelect 多选标签模式，禁止自身下拉，仅作展示与清空/删除入口 -->\n    <a-select\n      :value=\"displayValues\"\n      mode=\"multiple\"\n      :placeholder=\"placeholder\"\n      :disabled=\"disabled\"\n      allowClear\n      :open=\"false\"\n      :getPopupContainer=\"getParentContainer\"\n      v-bind=\"attrs\"\n      @change=\"onSelectChange\"\n      @click=\"openPanel\"\n    />\n\n    <!-- 隐形触发器，仅用于承载弹出层与月份切换，面板受控打开 -->\n    <a-date-picker\n      ref=\"pickerRef\"\n      :value=\"void 0\"\n      :open=\"open\"\n      :getPopupContainer=\"getParentContainer\"\n      :inputReadOnly=\"true\"\n      :allowClear=\"false\"\n      :disabledDate=\"disabledDate\"\n      :format=\"format\"\n      :showToday=\"false\"\n      @openChange=\"onOpenChange\"\n      class=\"hidden-picker\"\n      popupClassName=\"j-date-multiple-popup\"\n    >\n      <template #dateRender=\"{ current }\">\n        <div\n          class=\"ant-picker-cell-inner jdm-cell\"\n          :class=\"{ 'is-selected': isSelected(current) }\"\n          @click.stop.prevent=\"onCellClick(current)\"\n        >\n          {{ current.date() }}\n        </div>\n      </template>\n    </a-date-picker>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {computed, nextTick, onMounted, ref, watch} from 'vue';\nimport dayjs, {Dayjs} from 'dayjs';\nimport {propTypes} from '/@/utils/propTypes';\nimport {useAttrs} from '/@/hooks/core/useAttrs';\nimport {useRuleFormItem} from '/@/hooks/component/useFormItem';\nimport {setPopContainer} from '/@/utils';\n\nconst props = defineProps({\n  value: propTypes.string.def(''), // 多个日期用分隔符拼接\n  placeholder: propTypes.string.def('请选择日期'),\n  separator: propTypes.string.def(','),\n  format: propTypes.string.def('YYYY-MM-DD'), // 展示格式\n  valueFormat: propTypes.string.def('YYYY-MM-DD'), // 存储格式\n  disabled: propTypes.bool.def(false),\n  popContainer: propTypes.string.def(''),\n  // 透传给 DatePicker 的禁用规则\n  disabledDate: {\n    type: Function as unknown as () => (current: Dayjs) => boolean,\n    default: undefined,\n  },\n});\n\nconst emit = defineEmits(['change', 'update:value']);\n\n// attrs 透传到 ASelect 以复用大小/样式等\nconst attrs = useAttrs();\n\n// 与表单校验联动\nconst emitData = ref<any[]>([]);\nconst [, , , formItemContext] = useRuleFormItem(props as any, 'value', 'change', emitData);\n\nconst wrapperRef = ref<HTMLElement | null>(null);\nconst pickerRef = ref();\nconst open = ref(false);\n\n// 内部选中列表（存储格式字符串数组）\nconst selectedValueStrings = ref<string[]>([]);\n\n// 从外部 value 初始化/同步内部选中\nwatch(\n  () => props.value,\n  (val) => {\n    if (!val) {\n      selectedValueStrings.value = [];\n    } else {\n      const arr = String(val)\n        .split(props.separator)\n        .map((s) => s && s.trim())\n        .filter((s) => !!s) as string[];\n      // 去重\n      const set = new Set(arr);\n      selectedValueStrings.value = Array.from(set);\n    }\n  },\n  {immediate: true}\n);\n\n// 展示值（格式化为 format）\nconst displayValues = computed<string[]>(() => {\n  return selectedValueStrings.value.map((sv) => {\n    const d = dayjs(sv, props.valueFormat);\n    if (d.isValid()) {\n      return d.format(props.format);\n    } else {\n      return sv;\n    }\n  });\n});\n\n// 选择器容器：优先 popContainer，其次使用本组件包裹元素\nfunction getParentContainer(node: HTMLElement) {\n  if (!props.popContainer) {\n    return wrapperRef.value ?? node?.parentNode;\n  } else {\n    return setPopContainer(node, props.popContainer);\n  }\n}\n\nfunction openPanel() {\n  if (props.disabled) {\n    return;\n  }\n  open.value = true;\n}\n\nfunction onOpenChange(val: boolean) {\n  // 仅在外部点击时关闭；日期点击由我们拦截，不会触发默认关闭\n  open.value = val;\n}\n\nfunction isSelected(current: Dayjs) {\n  const key = current.format(props.valueFormat);\n  return selectedValueStrings.value.includes(key);\n}\n\nfunction onCellClick(current: Dayjs) {\n  if (props.disabled) {\n    return;\n  }\n  if (props.disabledDate && props.disabledDate(current)) {\n    return;\n  }\n  const key = current.format(props.valueFormat);\n  const idx = selectedValueStrings.value.indexOf(key);\n  if (idx >= 0) {\n    selectedValueStrings.value.splice(idx, 1);\n  } else {\n    selectedValueStrings.value.push(key);\n  }\n  triggerChange();\n  // 保持面板开启\n  nextTick(() => {\n    open.value = true;\n  });\n}\n\nfunction onSelectChange(nextDisplayValues: string[]) {\n  // 从展示值还原为存储格式\n  const nextStoreValues: string[] = [];\n  for (const dv of nextDisplayValues) {\n    const d = dayjs(dv, props.format);\n    if (d.isValid()) {\n      nextStoreValues.push(d.format(props.valueFormat));\n    }\n  }\n  // 去重\n  const set = new Set(nextStoreValues);\n  selectedValueStrings.value = Array.from(set);\n  triggerChange();\n}\n\nfunction triggerChange() {\n  const joined = selectedValueStrings.value.join(props.separator);\n  emit('change', joined);\n  emit('update:value', joined);\n  nextTick(() => {\n    if (formItemContext && formItemContext.onFieldChange) {\n      formItemContext.onFieldChange();\n    }\n  });\n}\n\nonMounted(() => {\n  // nothing now\n});\n\n</script>\n\n<style lang=\"less\">\n.j-date-multiple {\n  position: relative;\n  width: 100%;\n\n  .hidden-picker {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 32px;\n    opacity: 0;\n    pointer-events: none;\n  }\n}\n\n.j-date-multiple-popup.ant-picker-dropdown {\n  .ant-picker-cell {\n    .ant-picker-cell-inner.jdm-cell {\n      &.is-selected {\n        color: #fff !important;\n        // noinspection LessUnresolvedVariable\n        background-color: @primary-color !important;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JDictSelectTag.vue",
    "content": "<template>\n  <a-radio-group v-if=\"compType === CompTypeEnum.Radio\" v-bind=\"attrs\" v-model:value=\"state\" @change=\"handleChangeRadio\">\n    <template v-for=\"item in dictOptions\" :key=\"`${item.value}`\">\n      <a-radio :value=\"item.value\">\n        <span :class=\"[useDicColor && item.color ? 'colorText' : '']\" :style=\"{ backgroundColor: `${useDicColor && item.color}` }\">\n          {{ item.label }}\n        </span>\n      </a-radio>\n    </template>\n  </a-radio-group>\n\n  <a-radio-group\n    v-else-if=\"compType === CompTypeEnum.RadioButton\"\n    v-bind=\"attrs\"\n    v-model:value=\"state\"\n    buttonStyle=\"solid\"\n    @change=\"handleChangeRadio\"\n  >\n    <template v-for=\"item in dictOptions\" :key=\"`${item.value}`\">\n      <a-radio-button :value=\"item.value\">\n        {{ item.label }}\n      </a-radio-button>\n    </template>\n  </a-radio-group>\n\n  <template v-else-if=\"compType === CompTypeEnum.Select\">\n    <!-- 显示加载效果 -->\n    <a-input v-if=\"loadingEcho\" readOnly placeholder=\"加载中…\">\n      <template #prefix>\n        <LoadingOutlined />\n      </template>\n    </a-input>\n    <a-select\n      v-else\n      :placeholder=\"placeholder\"\n      v-bind=\"attrs\"\n      v-model:value=\"state\"\n      :filterOption=\"handleFilterOption\"\n      :getPopupContainer=\"getPopupContainer\"\n      :style=\"style\"\n      @change=\"handleChange\"\n    >\n      <a-select-option v-if=\"showChooseOption\" :value=\"null\">请选择…</a-select-option>\n      <template v-for=\"item in dictOptions\" :key=\"`${item.value}`\">\n        <a-select-option :value=\"item.value\">\n          <span\n            :class=\"[useDicColor && item.color ? 'colorText' : '']\"\n            :style=\"{ backgroundColor: `${useDicColor && item.color}` }\"\n            :title=\"item.label\"\n          >\n            {{ item.label }}\n          </span>\n        </a-select-option>\n      </template>\n    </a-select>\n  </template>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, ref, reactive, watchEffect, computed, unref, watch, onMounted, nextTick } from 'vue';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { initDictOptions } from '/@/utils/dict';\n  import { get, omit } from 'lodash-es';\n  import { useRuleFormItem } from '/@/hooks/component/useFormItem';\n  import { CompTypeEnum } from '/@/enums/CompTypeEnum';\n  import { LoadingOutlined } from '@ant-design/icons-vue';\n\n  export default defineComponent({\n    name: 'JDictSelectTag',\n    inheritAttrs: false,\n    components: { LoadingOutlined },\n    props: {\n      value: propTypes.oneOfType([propTypes.string, propTypes.number, propTypes.array]),\n      dictCode: propTypes.string,\n      type: propTypes.string,\n      placeholder: propTypes.string,\n      stringToNumber: propTypes.bool,\n      useDicColor: propTypes.bool.def(false),\n      getPopupContainer: {\n        type: Function,\n        default: (node) => node?.parentNode,\n      },\n      // 是否显示【请选择】选项\n      showChooseOption: propTypes.bool.def(true),\n      // 下拉项-online使用\n      options: {\n        type: Array,\n        default: [],\n        required: false,\n      },\n      style: propTypes.any,\n      // 搜索时是否只搜索label\n      onlySearchByLabel: propTypes.bool.def(false),\n    },\n    emits: ['options-change', 'change','update:value'],\n    setup(props, { emit, refs }) {\n      const dictOptions = ref<any[]>([]);\n      const attrs = useAttrs();\n      const [state, , , formItemContext] = useRuleFormItem(props, 'value', 'change');\n      const getBindValue = Object.assign({}, unref(props), unref(attrs));\n      // 是否正在加载回显数据\n      const loadingEcho = ref<boolean>(false);\n      // 是否是首次加载回显，只有首次加载，才会显示 loading\n      let isFirstLoadEcho = true;\n\n      //组件类型\n      const compType = computed(() => {\n        return !props.type || props.type === 'list' ? 'select' : props.type;\n      });\n      /**\n       * 监听字典code\n       */\n      watchEffect(() => {\n        if (props.dictCode) {\n          loadingEcho.value = isFirstLoadEcho;\n          isFirstLoadEcho = false;\n          initDictData().finally(() => {\n            loadingEcho.value = isFirstLoadEcho;\n          });\n        }\n        //update-begin-author:taoyan date: 如果没有提供dictCode 可以走options的配置--\n        if (!props.dictCode) {\n          dictOptions.value = props.options;\n        }\n        //update-end-author:taoyan date: 如果没有提供dictCode 可以走options的配置--\n      });\n\n      // 此处添加空值的change事件,即当组件调用地代码设置value为''也能触发change事件\n      watch(\n        () => props.value,\n        () => {\n          if (props.value === '') {\n            emit('change', '');\n            nextTick(() => formItemContext.onFieldChange());\n          }\n        }\n      );\n\n      async function initDictData() {\n        let { dictCode, stringToNumber } = props;\n        //根据字典Code, 初始化字典数组\n        const dictData = await initDictOptions(dictCode);\n        dictOptions.value = dictData.reduce((prev, next) => {\n          if (next) {\n            const value = next['value'];\n            prev.push({\n              label: next['text'] || next['label'],\n              value: stringToNumber ? +value : value,\n              color: next['color'],\n              ...omit(next, ['text', 'value', 'color']),\n            });\n          }\n          return prev;\n        }, []);\n      }\n\n      function handleChange(e) {\n        const { mode } = unref<Recordable>(getBindValue);\n        let changeValue:any;\n        // 兼容多选模式\n        \n        //采用一个值，不然的话state值变换触发多个change\n        if (mode === 'multiple') {\n          changeValue = e?.target?.value ?? e;\n          // 过滤掉空值\n          if (changeValue == null || changeValue === '') {\n            changeValue = [];\n          }\n          if (Array.isArray(changeValue)) {\n            changeValue = changeValue.filter((item) => item != null && item !== '');\n          }\n        } else {\n          changeValue = e?.target?.value ?? e;\n        }\n        state.value = changeValue;\n\n        // 代码逻辑说明: 【issues/4507】JDictSelectTag组件使用时，浏览器给出警告提示：Expected Function, got Array------------\n        emit('update:value',changeValue)\n        \n        // nextTick(() => formItemContext.onFieldChange());\n      }\n\n      /** 单选radio的值变化事件 */\n      function handleChangeRadio(e) {\n        state.value = e?.target?.value ?? e;\n        // 代码逻辑说明: 【issues/506】JDictSelectTag 组件 type=\"radio\" 没有返回值------------\n        emit('update:value',e?.target?.value ?? e)\n      }\n\n      /** 用于搜索下拉框中的内容 */\n      function handleFilterOption(input, option) {\n        // 代码逻辑说明: 【QQYUN-6514】 配置的时候，Y轴不能输入多个字段了，控制台报错\n        if (typeof option.children === 'function') {\n          // 在 label 中搜索\n          let labelIf = option.children()[0]?.children.toLowerCase().indexOf(input.toLowerCase()) >= 0;\n          if (labelIf) {\n            return true;\n          }\n        }\n        if (props.onlySearchByLabel) {\n          // 如果开启了只在 label 中搜索，就不继续往下搜索value了\n          return false;\n        }\n        // 在 value 中搜索\n        return (option.value || '').toString().toLowerCase().indexOf(input.toLowerCase()) >= 0;\n      }\n\n      return {\n        state,\n        compType,\n        attrs,\n        loadingEcho,\n        getBindValue,\n        dictOptions,\n        CompTypeEnum,\n        handleChange,\n        handleChangeRadio,\n        handleFilterOption,\n      };\n    },\n  });\n</script>\n<style scoped lang=\"less\">\n  // 代码逻辑说明: 【QQYUN-7799】字典组件（原生组件除外）加上颜色配置\n  .colorText {\n    display: inline-block;\n    height: 20px;\n    line-height: 20px;\n    padding: 0 6px;\n    border-radius: 8px;\n    background-color: red;\n    color: #fff;\n    font-size: 12px;\n  }\n  // 代码逻辑说明: 【QQYUN-7799】字典组件（原生组件除外）加上颜色配置\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JEasyCron/EasyCronInner.vue",
    "content": "<template>\n  <div :class=\"`${prefixCls}`\">\n    <div class=\"content\">\n      <a-tabs :size=\"`small`\" v-model:activeKey=\"activeKey\">\n        <a-tab-pane tab=\"秒\" key=\"second\" v-if=\"!hideSecond\">\n          <SecondUI v-model:value=\"second\" :disabled=\"disabled\" />\n        </a-tab-pane>\n        <a-tab-pane tab=\"分\" key=\"minute\">\n          <MinuteUI v-model:value=\"minute\" :disabled=\"disabled\" />\n        </a-tab-pane>\n        <a-tab-pane tab=\"时\" key=\"hour\">\n          <HourUI v-model:value=\"hour\" :disabled=\"disabled\" />\n        </a-tab-pane>\n        <a-tab-pane tab=\"日\" key=\"day\">\n          <DayUI v-model:value=\"day\" :week=\"week\" :disabled=\"disabled\" />\n        </a-tab-pane>\n        <a-tab-pane tab=\"月\" key=\"month\">\n          <MonthUI v-model:value=\"month\" :disabled=\"disabled\" />\n        </a-tab-pane>\n        <a-tab-pane tab=\"周\" key=\"week\">\n          <WeekUI v-model:value=\"week\" :day=\"day\" :disabled=\"disabled\" />\n        </a-tab-pane>\n        <a-tab-pane tab=\"年\" key=\"year\" v-if=\"!hideYear && !hideSecond\">\n          <YearUI v-model:value=\"year\" :disabled=\"disabled\" />\n        </a-tab-pane>\n      </a-tabs>\n      <a-divider />\n      <!-- 执行时间预览 -->\n      <div style=\"overflow: hidden\">\n        <a-row :gutter=\"8\">\n          <a-col :span=\"18\" style=\"margin-top: 22px\">\n            <a-row :gutter=\"8\">\n              <a-col :span=\"8\" style=\"margin-bottom: 12px\">\n                <a-input v-model:value=\"inputValues.second\" @blur=\"onInputBlur\">\n                  <template #addonBefore>\n                    <span class=\"allow-click\" @click=\"activeKey = 'second'\">秒</span>\n                  </template>\n                </a-input>\n              </a-col>\n              <a-col :span=\"8\" style=\"margin-bottom: 12px\">\n                <a-input v-model:value=\"inputValues.minute\" @blur=\"onInputBlur\">\n                  <template #addonBefore>\n                    <span class=\"allow-click\" @click=\"activeKey = 'minute'\">分</span>\n                  </template>\n                </a-input>\n              </a-col>\n              <a-col :span=\"8\" style=\"margin-bottom: 12px\">\n                <a-input v-model:value=\"inputValues.hour\" @blur=\"onInputBlur\">\n                  <template #addonBefore>\n                    <span class=\"allow-click\" @click=\"activeKey = 'hour'\">时</span>\n                  </template>\n                </a-input>\n              </a-col>\n              <a-col :span=\"8\" style=\"margin-bottom: 12px\">\n                <a-input v-model:value=\"inputValues.day\" @blur=\"onInputBlur\">\n                  <template #addonBefore>\n                    <span class=\"allow-click\" @click=\"activeKey = 'day'\">日</span>\n                  </template>\n                </a-input>\n              </a-col>\n              <a-col :span=\"8\" style=\"margin-bottom: 12px\">\n                <a-input v-model:value=\"inputValues.month\" @blur=\"onInputBlur\">\n                  <template #addonBefore>\n                    <span class=\"allow-click\" @click=\"activeKey = 'month'\">月</span>\n                  </template>\n                </a-input>\n              </a-col>\n              <a-col :span=\"8\" style=\"margin-bottom: 12px\">\n                <a-input v-model:value=\"inputValues.week\" @blur=\"onInputBlur\">\n                  <template #addonBefore>\n                    <span class=\"allow-click\" @click=\"activeKey = 'week'\">周</span>\n                  </template>\n                </a-input>\n              </a-col>\n              <a-col :span=\"8\">\n                <a-input v-model:value=\"inputValues.year\" @blur=\"onInputBlur\">\n                  <template #addonBefore>\n                    <span class=\"allow-click\" @click=\"activeKey = 'year'\">年</span>\n                  </template>\n                </a-input>\n              </a-col>\n              <a-col :span=\"16\">\n                <a-input v-model:value=\"inputValues.cron\" @blur=\"onInputCronBlur\">\n                  <template #addonBefore>\n                    <a-tooltip title=\"Cron表达式\">式</a-tooltip>\n                  </template>\n                </a-input>\n              </a-col>\n            </a-row>\n          </a-col>\n          <a-col :span=\"6\">\n            <div>近十次执行时间（不含年）</div>\n            <a-textarea type=\"textarea\" :value=\"preTimeList\" :rows=\"5\" />\n          </a-col>\n        </a-row>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { computed, reactive, ref, watch, provide } from 'vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import CronParser from 'cron-parser';\n  import SecondUI from './tabs/SecondUI.vue';\n  import MinuteUI from './tabs/MinuteUI.vue';\n  import HourUI from './tabs/HourUI.vue';\n  import DayUI from './tabs/DayUI.vue';\n  import MonthUI from './tabs/MonthUI.vue';\n  import WeekUI from './tabs/WeekUI.vue';\n  import YearUI from './tabs/YearUI.vue';\n  import { cronEmits, cronProps } from './easy.cron.data';\n  import { dateFormat, simpleDebounce } from '/@/utils/common/compUtils';\n\n  const { prefixCls } = useDesign('easy-cron-inner');\n  provide('prefixCls', prefixCls);\n  const emit = defineEmits([...cronEmits]);\n  const props = defineProps({ ...cronProps });\n  const activeKey = ref(props.hideSecond ? 'minute' : 'second');\n  const second = ref('*');\n  const minute = ref('*');\n  const hour = ref('*');\n  const day = ref('*');\n  const month = ref('*');\n  const week = ref('?');\n  const year = ref('*');\n  const inputValues = reactive({\n    second: '',\n    minute: '',\n    hour: '',\n    day: '',\n    month: '',\n    week: '',\n    year: '',\n    cron: '',\n  });\n  const preTimeList = ref('执行预览，会忽略年份参数。');\n\n  // cron表达式\n  const cronValueInner = computed(() => {\n    let result: string[] = [];\n    if (!props.hideSecond) {\n      result.push(second.value ? second.value : '*');\n    }\n    result.push(minute.value ? minute.value : '*');\n    result.push(hour.value ? hour.value : '*');\n    result.push(day.value ? day.value : '*');\n    result.push(month.value ? month.value : '*');\n    result.push(week.value ? week.value : '?');\n    if (!props.hideYear && !props.hideSecond) result.push(year.value ? year.value : '*');\n    return result.join(' ');\n  });\n  // 不含年\n  const cronValueNoYear = computed(() => {\n    const v = cronValueInner.value;\n    if (props.hideYear || props.hideSecond) return v;\n    const vs = v.split(' ');\n    if (vs.length >= 6) {\n      // 转成 Quartz 的规则\n      vs[5] = convertWeekToQuartz(vs[5]);\n    }\n    return vs.slice(0, vs.length - 1).join(' ');\n  });\n  const calTriggerList = simpleDebounce(calTriggerListInner, 500);\n\n  watch(\n    () => props.value,\n    (newVal) => {\n      if (newVal === cronValueInner.value) {\n        return;\n      }\n      formatValue();\n    }\n  );\n\n  watch(cronValueInner, (newValue) => {\n    calTriggerList();\n    emitValue(newValue);\n    assignInput();\n  });\n\n  // watch(minute, () => {\n  //   if (second.value === '*') {\n  //     second.value = '0'\n  //   }\n  // })\n  // watch(hour, () => {\n  //   if (minute.value === '*') {\n  //     minute.value = '0'\n  //   }\n  // })\n  // watch(day, () => {\n  //   if (day.value !== '?' && hour.value === '*') {\n  //     hour.value = '0'\n  //   }\n  // })\n  // watch(week, () => {\n  //   if (week.value !== '?' && hour.value === '*') {\n  //     hour.value = '0'\n  //   }\n  // })\n  // watch(month, () => {\n  //   if (day.value === '?' && week.value === '*') {\n  //     week.value = '1'\n  //   } else if (week.value === '?' && day.value === '*') {\n  //     day.value = '1'\n  //   }\n  // })\n  // watch(year, () => {\n  //   if (month.value === '*') {\n  //     month.value = '1'\n  //   }\n  // })\n\n  assignInput();\n  formatValue();\n  calTriggerListInner();\n\n  function assignInput() {\n    inputValues.second = second.value;\n    inputValues.minute = minute.value;\n    inputValues.hour = hour.value;\n    inputValues.day = day.value;\n    inputValues.month = month.value;\n    inputValues.week = week.value;\n    inputValues.year = year.value;\n    inputValues.cron = cronValueInner.value;\n  }\n\n  function formatValue() {\n    if (!props.value) return;\n    const values = props.value.split(' ').filter((item) => !!item);\n    if (!values || values.length <= 0) return;\n    let i = 0;\n    if (!props.hideSecond) second.value = values[i++];\n    if (values.length > i) minute.value = values[i++];\n    if (values.length > i) hour.value = values[i++];\n    if (values.length > i) day.value = values[i++];\n    if (values.length > i) month.value = values[i++];\n    if (values.length > i) week.value = values[i++];\n    if (values.length > i) year.value = values[i];\n    assignInput();\n  }\n\n  // Quartz 的规则：\n  // 1 = 周日，2 = 周一，3 = 周二，4 = 周三，5 = 周四，6 = 周五，7 = 周六\n  function convertWeekToQuartz(week: string) {\n    let convert = (v: string) => {\n      if (v === '0') {\n        return '1';\n      }\n      if (v === '1') {\n        return '0';\n      }\n      return (Number.parseInt(v) - 1).toString();\n    };\n    // 匹配示例 1-7 or 1/7\n    let patten1 = /^([0-7])([-/])([0-7])$/;\n    // 匹配示例 1,4,7\n    let patten2 = /^([0-7])(,[0-7])+$/;\n    if (/^[0-7]$/.test(week)) {\n      return convert(week);\n    } else if (patten1.test(week)) {\n      return week.replace(patten1, ($0, before, separator, after) => {\n        if (separator === '/') {\n          return convert(before) + separator + after;\n        } else {\n          return convert(before) + separator + convert(after);\n        }\n      });\n    } else if (patten2.test(week)) {\n      return week\n        .split(',')\n        .map((v) => convert(v))\n        .join(',');\n    }\n    return week;\n  }\n\n  function calTriggerListInner() {\n    // 设置了回调函数\n    if (props.remote) {\n      props.remote(cronValueInner.value, +new Date(), (v) => {\n        preTimeList.value = v;\n      });\n      return;\n    }\n    const format = 'yyyy-MM-dd hh:mm:ss';\n    const options = {\n      currentDate: dateFormat(new Date(), format),\n    };\n    const iter = CronParser.parseExpression(cronValueNoYear.value, options);\n    const result: string[] = [];\n    for (let i = 1; i <= 10; i++) {\n      result.push(dateFormat(new Date(iter.next() as any), format));\n    }\n    preTimeList.value = result.length > 0 ? result.join('\\n') : '无执行时间';\n  }\n\n  function onInputBlur() {\n    second.value = inputValues.second;\n    minute.value = inputValues.minute;\n    hour.value = inputValues.hour;\n    day.value = inputValues.day;\n    month.value = inputValues.month;\n    week.value = inputValues.week;\n    year.value = inputValues.year;\n  }\n\n  function onInputCronBlur(event) {\n    emitValue(event.target.value);\n  }\n\n  function emitValue(value) {\n    emit('change', value);\n    emit('update:value', value);\n  }\n</script>\n<style lang=\"less\">\n  @import 'easy.cron.inner';\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JEasyCron/EasyCronInput.vue",
    "content": "<template>\n  <div :class=\"`${prefixCls}`\">\n    <a-input :placeholder=\"placeholder\" v-model:value=\"editCronValue\" :disabled=\"disabled\">\n      <template #addonAfter>\n        <a class=\"open-btn\" :disabled=\"disabled ? 'disabled' : null\" @click=\"showConfigModal\">\n          <Icon icon=\"ant-design:setting-outlined\" />\n          <span>选择</span>\n        </a>\n      </template>\n    </a-input>\n    <EasyCronModal\n      @register=\"registerModal\"\n      v-model:value=\"editCronValue\"\n      :exeStartTime=\"exeStartTime\"\n      :hideYear=\"hideYear\"\n      :remote=\"remote\"\n      :hideSecond=\"hideSecond\"\n    />\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, watch } from 'vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useModal } from '/@/components/Modal';\n  import { propTypes } from '/@/utils/propTypes';\n  import Icon from '/@/components/Icon/src/Icon.vue';\n  import EasyCronModal from './EasyCronModal.vue';\n  import { cronEmits, cronProps } from './easy.cron.data';\n\n  const { prefixCls } = useDesign('easy-cron-input');\n  const emit = defineEmits([...cronEmits]);\n  const props = defineProps({\n    ...cronProps,\n    placeholder: propTypes.string.def('请输入cron表达式'),\n    exeStartTime: propTypes.oneOfType([propTypes.number, propTypes.string, propTypes.object]).def(0),\n  });\n  const [registerModal, { openModal }] = useModal();\n  const editCronValue = ref(props.value);\n\n  watch(\n    () => props.value,\n    (newVal) => {\n      if (newVal !== editCronValue.value) {\n        editCronValue.value = newVal;\n      }\n    }\n  );\n  watch(editCronValue, (newVal) => {\n    emit('change', newVal);\n    emit('update:value', newVal);\n  });\n\n  function showConfigModal() {\n    if (!props.disabled) {\n      openModal();\n    }\n  }\n</script>\n\n<style lang=\"less\">\n  @import 'easy.cron.input';\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JEasyCron/EasyCronModal.vue",
    "content": "<template>\n  <BasicModal @register=\"registerModal\" title=\"Cron表达式\" width=\"1000px\" @ok=\"onOk\">\n    <EasyCron v-bind=\"attrs\" />\n  </BasicModal>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import EasyCron from './EasyCronInner.vue';\n\n  export default defineComponent({\n    name: 'EasyCronModal',\n    inheritAttrs: false,\n    components: { BasicModal, EasyCron },\n    setup() {\n      const attrs = useAttrs();\n      const [registerModal, { closeModal }] = useModalInner();\n\n      function onOk() {\n        closeModal();\n      }\n\n      return { attrs, registerModal, onOk };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JEasyCron/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 知行合一\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JEasyCron/easy.cron.data.ts",
    "content": "import { propTypes } from '/@/utils/propTypes';\n\nexport const cronEmits = ['change', 'update:value'];\nexport const cronProps = {\n  value: propTypes.string.def(''),\n  disabled: propTypes.bool.def(false),\n  hideSecond: propTypes.bool.def(false),\n  hideYear: propTypes.bool.def(false),\n  remote: propTypes.func,\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JEasyCron/easy.cron.inner.less",
    "content": "//noinspection LessUnresolvedVariable\n@prefix-cls: ~'@{namespace}-easy-cron-inner';\n\n.@{prefix-cls} {\n  .content {\n    .ant-checkbox-wrapper + .ant-checkbox-wrapper {\n      margin-left: 0;\n    }\n  }\n\n  &-config-list {\n    text-align: left;\n    margin: 0 10px 10px 10px;\n\n    .item {\n      margin-top: 5px;\n      font-size: 14px;\n\n      span {\n        padding: 0 2px;\n      }\n    }\n\n    .choice {\n      padding: 5px 8px;\n    }\n\n    .w60 {\n      width: 60px;\n      min-width: 60px;\n    }\n\n    .w80 {\n      width: 80px;\n      min-width: 80px;\n    }\n\n    .list {\n      margin: 0 20px;\n    }\n\n    .list-check-item {\n      padding: 1px 3px;\n      width: 4em;\n    }\n\n    .list-cn .list-check-item {\n      width: 5em;\n    }\n\n    .tip-info {\n      color: #999;\n    }\n  }\n\n  .allow-click {\n    cursor: pointer;\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JEasyCron/easy.cron.input.less",
    "content": "//noinspection LessUnresolvedVariable\n@prefix-cls: ~'@{namespace}-easy-cron-input';\n\n.@{prefix-cls} {\n  a.open-btn {\n    cursor: pointer;\n\n    .app-iconify {\n      position: relative;\n      top: 1px;\n      right: 2px;\n    }\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JEasyCron/index.ts",
    "content": "// 原开源项目地址：https://gitee.com/toktok/easy-cron\n\nexport { default as JEasyCron } from './EasyCronInput.vue';\nexport { default as JEasyCronInner } from './EasyCronInner.vue';\nexport { default as JEasyCronModal } from './EasyCronModal.vue';\nexport { default as JCronValidator } from './validator';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JEasyCron/tabs/DayUI.vue",
    "content": "<template>\n  <div :class=\"`${prefixCls}-config-list`\">\n    <a-radio-group v-model:value=\"type\">\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.unset\" v-bind=\"beforeRadioAttrs\">不设置</a-radio>\n        <span class=\"tip-info\">日和周只能设置其中之一</span>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.every\" v-bind=\"beforeRadioAttrs\">每日</a-radio>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.range\" v-bind=\"beforeRadioAttrs\">区间</a-radio>\n        <span> 从 </span>\n        <InputNumber v-model:value=\"valueRange.start\" v-bind=\"typeRangeAttrs\" />\n        <span> 日 至 </span>\n        <InputNumber v-model:value=\"valueRange.end\" v-bind=\"typeRangeAttrs\" />\n        <span> 日 </span>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.loop\" v-bind=\"beforeRadioAttrs\">循环</a-radio>\n        <span> 从 </span>\n        <InputNumber v-model:value=\"valueLoop.start\" v-bind=\"typeLoopAttrs\" />\n        <span> 日开始，间隔 </span>\n        <InputNumber v-model:value=\"valueLoop.interval\" v-bind=\"typeLoopAttrs\" />\n        <span> 日 </span>\n      </div>\n<!--       工作日暂不支持，会报错，先隐藏了 -->\n<!--      <div class=\"item\">-->\n<!--        <a-radio :value=\"TypeEnum.work\" v-bind=\"beforeRadioAttrs\">工作日</a-radio>-->\n<!--        <span> 本月 </span>-->\n<!--        <InputNumber v-model:value=\"valueWork\" v-bind=\"typeWorkAttrs\" />-->\n<!--        <span> 日，最近的工作日 </span>-->\n<!--      </div>-->\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.last\" v-bind=\"beforeRadioAttrs\">最后一日</a-radio>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.specify\" v-bind=\"beforeRadioAttrs\">指定</a-radio>\n        <div class=\"list\">\n          <a-checkbox-group v-model:value=\"valueList\">\n            <template v-for=\"i in specifyRange\" :key=\"i\">\n              <a-checkbox :value=\"i\" v-bind=\"typeSpecifyAttrs\">{{ i }}</a-checkbox>\n            </template>\n          </a-checkbox-group>\n        </div>\n      </div>\n    </a-radio-group>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { computed, defineComponent, watch } from 'vue';\n  import { InputNumber } from 'ant-design-vue';\n  import { TypeEnum, useTabEmits, useTabProps, useTabSetup } from './useTabMixin';\n\n  export default defineComponent({\n    name: 'DayUI',\n    components: { InputNumber },\n    props: useTabProps({\n      defaultValue: '*',\n      props: {\n        week: { type: String, default: '?' },\n      },\n    }),\n    emits: useTabEmits(),\n    setup(props, context) {\n      const disabledChoice = computed(() => {\n        return (props.week && props.week !== '?') || props.disabled;\n      });\n      const setup = useTabSetup(props, context, {\n        defaultValue: '*',\n        valueWork: 1,\n        minValue: 1,\n        maxValue: 31,\n        valueRange: { start: 1, end: 31 },\n        valueLoop: { start: 1, interval: 1 },\n        disabled: disabledChoice,\n      });\n      const typeWorkAttrs = computed(() => ({\n        disabled: setup.type.value !== TypeEnum.work || props.disabled || disabledChoice.value,\n        ...setup.inputNumberAttrs.value,\n      }));\n\n      watch(\n        () => props.week,\n        () => {\n          setup.updateValue(disabledChoice.value ? '?' : setup.computeValue.value);\n        }\n      );\n\n      return { ...setup, typeWorkAttrs };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JEasyCron/tabs/HourUI.vue",
    "content": "<template>\n  <div :class=\"`${prefixCls}-config-list`\">\n    <a-radio-group v-model:value=\"type\">\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.every\" v-bind=\"beforeRadioAttrs\">每时</a-radio>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.range\" v-bind=\"beforeRadioAttrs\">区间</a-radio>\n        <span> 从 </span>\n        <InputNumber v-model:value=\"valueRange.start\" v-bind=\"typeRangeAttrs\" />\n        <span> 时 至 </span>\n        <InputNumber v-model:value=\"valueRange.end\" v-bind=\"typeRangeAttrs\" />\n        <span> 时 </span>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.loop\" v-bind=\"beforeRadioAttrs\">循环</a-radio>\n        <span> 从 </span>\n        <InputNumber v-model:value=\"valueLoop.start\" v-bind=\"typeLoopAttrs\" />\n        <span> 时开始，间隔 </span>\n        <InputNumber v-model:value=\"valueLoop.interval\" v-bind=\"typeLoopAttrs\" />\n        <span> 时 </span>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.specify\" v-bind=\"beforeRadioAttrs\">指定</a-radio>\n        <div class=\"list\">\n          <a-checkbox-group v-model:value=\"valueList\">\n            <template v-for=\"i in specifyRange\" :key=\"i\">\n              <a-checkbox :value=\"i\" v-bind=\"typeSpecifyAttrs\">{{ i }}</a-checkbox>\n            </template>\n          </a-checkbox-group>\n        </div>\n      </div>\n    </a-radio-group>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { InputNumber } from 'ant-design-vue';\n  import { useTabProps, useTabEmits, useTabSetup } from './useTabMixin';\n\n  export default defineComponent({\n    name: 'HourUI',\n    components: { InputNumber },\n    props: useTabProps({\n      defaultValue: '*',\n    }),\n    emits: useTabEmits(),\n    setup(props, context) {\n      return useTabSetup(props, context, {\n        defaultValue: '*',\n        minValue: 0,\n        maxValue: 23,\n        valueRange: { start: 0, end: 23 },\n        valueLoop: { start: 0, interval: 1 },\n      });\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JEasyCron/tabs/MinuteUI.vue",
    "content": "<template>\n  <div :class=\"`${prefixCls}-config-list`\">\n    <a-radio-group v-model:value=\"type\">\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.every\" v-bind=\"beforeRadioAttrs\">每分</a-radio>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.range\" v-bind=\"beforeRadioAttrs\">区间</a-radio>\n        <span> 从 </span>\n        <InputNumber v-model:value=\"valueRange.start\" v-bind=\"typeRangeAttrs\" />\n        <span> 分 至 </span>\n        <InputNumber v-model:value=\"valueRange.end\" v-bind=\"typeRangeAttrs\" />\n        <span> 分 </span>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.loop\" v-bind=\"beforeRadioAttrs\">循环</a-radio>\n        <span> 从 </span>\n        <InputNumber v-model:value=\"valueLoop.start\" v-bind=\"typeLoopAttrs\" />\n        <span> 分开始，间隔 </span>\n        <InputNumber v-model:value=\"valueLoop.interval\" v-bind=\"typeLoopAttrs\" />\n        <span> 分 </span>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.specify\" v-bind=\"beforeRadioAttrs\">指定</a-radio>\n        <div class=\"list\">\n          <a-checkbox-group v-model:value=\"valueList\">\n            <template v-for=\"i in specifyRange\" :key=\"i\">\n              <a-checkbox :value=\"i\" v-bind=\"typeSpecifyAttrs\">{{ i }}</a-checkbox>\n            </template>\n          </a-checkbox-group>\n        </div>\n      </div>\n    </a-radio-group>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { InputNumber } from 'ant-design-vue';\n  import { useTabProps, useTabEmits, useTabSetup } from './useTabMixin';\n\n  export default defineComponent({\n    name: 'MinuteUI',\n    components: { InputNumber },\n    props: useTabProps({\n      defaultValue: '*',\n    }),\n    emits: useTabEmits(),\n    setup(props, context) {\n      return useTabSetup(props, context, {\n        defaultValue: '*',\n        minValue: 0,\n        maxValue: 59,\n        valueRange: { start: 0, end: 59 },\n        valueLoop: { start: 0, interval: 1 },\n      });\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JEasyCron/tabs/MonthUI.vue",
    "content": "<template>\n  <div :class=\"`${prefixCls}-config-list`\">\n    <a-radio-group v-model:value=\"type\">\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.every\" v-bind=\"beforeRadioAttrs\">每月</a-radio>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.range\" v-bind=\"beforeRadioAttrs\">区间</a-radio>\n        <span> 从 </span>\n        <InputNumber v-model:value=\"valueRange.start\" v-bind=\"typeRangeAttrs\" />\n        <span> 月 至 </span>\n        <InputNumber v-model:value=\"valueRange.end\" v-bind=\"typeRangeAttrs\" />\n        <span> 月 </span>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.loop\" v-bind=\"beforeRadioAttrs\">循环</a-radio>\n        <span> 从 </span>\n        <InputNumber v-model:value=\"valueLoop.start\" v-bind=\"typeLoopAttrs\" />\n        <span> 月开始，间隔 </span>\n        <InputNumber v-model:value=\"valueLoop.interval\" v-bind=\"typeLoopAttrs\" />\n        <span> 月 </span>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.specify\" v-bind=\"beforeRadioAttrs\">指定</a-radio>\n        <div class=\"list\">\n          <a-checkbox-group v-model:value=\"valueList\">\n            <template v-for=\"i in specifyRange\" :key=\"i\">\n              <a-checkbox :value=\"i\" v-bind=\"typeSpecifyAttrs\">{{ i }}</a-checkbox>\n            </template>\n          </a-checkbox-group>\n        </div>\n      </div>\n    </a-radio-group>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { InputNumber } from 'ant-design-vue';\n  import { useTabProps, useTabEmits, useTabSetup } from './useTabMixin';\n\n  export default defineComponent({\n    name: 'MonthUI',\n    components: { InputNumber },\n    props: useTabProps({\n      defaultValue: '*',\n    }),\n    emits: useTabEmits(),\n    setup(props, context) {\n      return useTabSetup(props, context, {\n        defaultValue: '*',\n        minValue: 1,\n        maxValue: 12,\n        valueRange: { start: 1, end: 12 },\n        valueLoop: { start: 1, interval: 1 },\n      });\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JEasyCron/tabs/SecondUI.vue",
    "content": "<template>\n  <div :class=\"`${prefixCls}-config-list`\">\n    <a-radio-group v-model:value=\"type\">\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.every\" v-bind=\"beforeRadioAttrs\">每秒</a-radio>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.range\" v-bind=\"beforeRadioAttrs\">区间</a-radio>\n        <span> 从 </span>\n        <InputNumber v-model:value=\"valueRange.start\" v-bind=\"typeRangeAttrs\" />\n        <span> 秒 至 </span>\n        <InputNumber v-model:value=\"valueRange.end\" v-bind=\"typeRangeAttrs\" />\n        <span> 秒 </span>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.loop\" v-bind=\"beforeRadioAttrs\">循环</a-radio>\n        <span> 从 </span>\n        <InputNumber v-model:value=\"valueLoop.start\" v-bind=\"typeLoopAttrs\" />\n        <span> 秒开始，间隔 </span>\n        <InputNumber v-model:value=\"valueLoop.interval\" v-bind=\"typeLoopAttrs\" />\n        <span> 秒 </span>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.specify\" v-bind=\"beforeRadioAttrs\">指定</a-radio>\n        <div class=\"list\">\n          <a-checkbox-group v-model:value=\"valueList\">\n            <template v-for=\"i in specifyRange\" :key=\"i\">\n              <a-checkbox :value=\"i\" v-bind=\"typeSpecifyAttrs\">{{ i }}</a-checkbox>\n            </template>\n          </a-checkbox-group>\n        </div>\n      </div>\n    </a-radio-group>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { InputNumber } from 'ant-design-vue';\n  import { useTabProps, useTabEmits, useTabSetup } from './useTabMixin';\n\n  export default defineComponent({\n    name: 'SecondUI',\n    components: { InputNumber },\n    props: useTabProps({\n      defaultValue: '*',\n    }),\n    emits: useTabEmits(),\n    setup(props, context) {\n      return useTabSetup(props, context, {\n        defaultValue: '*',\n        minValue: 0,\n        maxValue: 59,\n        valueRange: { start: 0, end: 59 },\n        valueLoop: { start: 0, interval: 1 },\n      });\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JEasyCron/tabs/WeekUI.vue",
    "content": "<template>\n  <div :class=\"`${prefixCls}-config-list`\">\n    <a-radio-group v-model:value=\"type\">\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.unset\" v-bind=\"beforeRadioAttrs\">不设置</a-radio>\n        <span class=\"tip-info\">日和周只能设置其中之一</span>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.range\" v-bind=\"beforeRadioAttrs\">区间</a-radio>\n        <span> 从 </span>\n        <a-select v-model:value=\"valueRange.start\" :options=\"weekOptions\" v-bind=\"typeRangeSelectAttrs\" />\n        <span> 至 </span>\n        <a-select v-model:value=\"valueRange.end\" :options=\"weekOptions\" v-bind=\"typeRangeSelectAttrs\" />\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.loop\" v-bind=\"beforeRadioAttrs\">循环</a-radio>\n        <span> 从 </span>\n        <a-select v-model:value=\"valueLoop.start\" :options=\"weekOptions\" v-bind=\"typeLoopSelectAttrs\" />\n        <span> 开始，间隔 </span>\n        <InputNumber v-model:value=\"valueLoop.interval\" v-bind=\"typeLoopAttrs\" />\n        <span> 天 </span>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.specify\" v-bind=\"beforeRadioAttrs\">指定</a-radio>\n        <div class=\"list list-cn\">\n          <a-checkbox-group v-model:value=\"valueList\">\n            <template v-for=\"opt in weekOptions\" :key=\"i\">\n              <a-checkbox :value=\"opt.value\" v-bind=\"typeSpecifyAttrs\">{{ opt.label }}</a-checkbox>\n            </template>\n          </a-checkbox-group>\n        </div>\n      </div>\n    </a-radio-group>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { computed, watch, defineComponent } from 'vue';\n  import { InputNumber } from 'ant-design-vue';\n  import { useTabProps, useTabEmits, useTabSetup, TypeEnum } from './useTabMixin';\n\n  const WEEK_MAP_EN = {\n    '1': 'SUN',\n    '2': 'MON',\n    '3': 'TUE',\n    '4': 'WED',\n    '5': 'THU',\n    '6': 'FRI',\n    '7': 'SAT',\n  };\n\n  const WEEK_MAP_CN = {\n    '1': '周日',\n    '2': '周一',\n    '3': '周二',\n    '4': '周三',\n    '5': '周四',\n    '6': '周五',\n    '7': '周六',\n  };\n\n  export default defineComponent({\n    name: 'WeekUI',\n    components: { InputNumber },\n    props: useTabProps({\n      defaultValue: '?',\n      props: {\n        day: { type: String, default: '*' },\n      },\n    }),\n    emits: useTabEmits(),\n    setup(props, context) {\n      const disabledChoice = computed(() => {\n        return (props.day && props.day !== '?') || props.disabled;\n      });\n      const setup = useTabSetup(props, context, {\n        defaultType: TypeEnum.unset,\n        defaultValue: '?',\n        minValue: 1,\n        maxValue: 7,\n        // 0,7表示周日 1表示周一\n        valueRange: { start: 1, end: 7 },\n        valueLoop: { start: 2, interval: 1 },\n        disabled: disabledChoice,\n      });\n      const weekOptions = computed(() => {\n        let options: { label: string; value: number }[] = [];\n        for (let weekKey of Object.keys(WEEK_MAP_CN)) {\n          let weekName: string = WEEK_MAP_CN[weekKey];\n          options.push({\n            value: Number.parseInt(weekKey),\n            label: weekName,\n          });\n        }\n        return options;\n      });\n\n      const typeRangeSelectAttrs = computed(() => ({\n        class: ['w80'],\n        disabled: setup.typeRangeAttrs.value.disabled,\n      }));\n\n      const typeLoopSelectAttrs = computed(() => ({\n        class: ['w80'],\n        disabled: setup.typeLoopAttrs.value.disabled,\n      }));\n\n      watch(\n        () => props.day,\n        () => {\n          setup.updateValue(disabledChoice.value ? '?' : setup.computeValue.value);\n        }\n      );\n\n      return {\n        ...setup,\n        weekOptions,\n        typeLoopSelectAttrs,\n        typeRangeSelectAttrs,\n        WEEK_MAP_CN,\n        WEEK_MAP_EN,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JEasyCron/tabs/YearUI.vue",
    "content": "<template>\n  <div :class=\"`${prefixCls}-config-list`\">\n    <a-radio-group v-model:value=\"type\">\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.every\" v-bind=\"beforeRadioAttrs\">每年</a-radio>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.range\" v-bind=\"beforeRadioAttrs\">区间</a-radio>\n        <span> 从 </span>\n        <InputNumber class=\"w80\" v-model:value=\"valueRange.start\" v-bind=\"typeRangeAttrs\" />\n        <span> 年 至 </span>\n        <InputNumber class=\"w80\" v-model:value=\"valueRange.end\" v-bind=\"typeRangeAttrs\" />\n        <span> 年 </span>\n      </div>\n      <div class=\"item\">\n        <a-radio :value=\"TypeEnum.loop\" v-bind=\"beforeRadioAttrs\">循环</a-radio>\n        <span> 从 </span>\n        <InputNumber class=\"w80\" v-model:value=\"valueLoop.start\" v-bind=\"typeLoopAttrs\" />\n        <span> 年开始，间隔 </span>\n        <InputNumber class=\"w80\" v-model:value=\"valueLoop.interval\" v-bind=\"typeLoopAttrs\" />\n        <span> 年 </span>\n      </div>\n    </a-radio-group>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { InputNumber } from 'ant-design-vue';\n  import { useTabProps, useTabEmits, useTabSetup } from './useTabMixin';\n\n  export default defineComponent({\n    name: 'YearUI',\n    components: { InputNumber },\n    props: useTabProps({\n      defaultValue: '*',\n    }),\n    emits: useTabEmits(),\n    setup(props, context) {\n      const nowYear = new Date().getFullYear();\n      return useTabSetup(props, context, {\n        defaultValue: '*',\n        minValue: 0,\n        valueRange: { start: nowYear, end: nowYear + 100 },\n        valueLoop: { start: nowYear, interval: 1 },\n      });\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JEasyCron/tabs/useTabMixin.ts",
    "content": "// 主要用于日和星期的互斥使用\nimport { computed, inject, reactive, ref, unref, watch } from 'vue';\nimport { propTypes } from '/@/utils/propTypes';\n\nexport enum TypeEnum {\n  unset = 'UNSET',\n  every = 'EVERY',\n  range = 'RANGE',\n  loop = 'LOOP',\n  work = 'WORK',\n  last = 'LAST',\n  specify = 'SPECIFY',\n}\n\n// use 公共 props\nexport function useTabProps(options) {\n  const defaultValue = options?.defaultValue ?? '?';\n  return {\n    value: propTypes.string.def(defaultValue),\n    disabled: propTypes.bool.def(false),\n    ...options?.props,\n  };\n}\n\n// use 公共 emits\nexport function useTabEmits() {\n  return ['change', 'update:value'];\n}\n\n// use 公共 setup\nexport function useTabSetup(props, context, options) {\n  const { emit } = context;\n  const prefixCls = inject('prefixCls');\n  const defaultValue = ref(options?.defaultValue ?? '?');\n  // 类型\n  const type = ref(options.defaultType ?? TypeEnum.every);\n  const valueList = ref<any[]>([]);\n  // 对于不同的类型，所定义的值也有所不同\n  const valueRange = reactive(options.valueRange);\n  const valueLoop = reactive(options.valueLoop);\n  const valueWeek = reactive(options.valueWeek);\n  const valueWork = ref(options.valueWork);\n  const maxValue = ref(options.maxValue);\n  const minValue = ref(options.minValue);\n\n  // 根据不同的类型计算出的value\n  const computeValue = computed(() => {\n    let valueArray: any[] = [];\n    switch (type.value) {\n      case TypeEnum.unset:\n        valueArray.push('?');\n        break;\n      case TypeEnum.every:\n        valueArray.push('*');\n        break;\n      case TypeEnum.range:\n        valueArray.push(`${valueRange.start}-${valueRange.end}`);\n        break;\n      case TypeEnum.loop:\n        valueArray.push(`${valueLoop.start}/${valueLoop.interval}`);\n        break;\n      case TypeEnum.work:\n        valueArray.push(`${valueWork.value}W`);\n        break;\n      case TypeEnum.last:\n        valueArray.push('L');\n        break;\n      case TypeEnum.specify:\n        if (valueList.value.length === 0) {\n          valueList.value.push(minValue.value);\n        }\n        valueArray.push(valueList.value.join(','));\n        break;\n      default:\n        valueArray.push(defaultValue.value);\n        break;\n    }\n    return valueArray.length > 0 ? valueArray.join('') : defaultValue.value;\n  });\n  // 指定值范围区间，介于最小值和最大值之间\n  const specifyRange = computed(() => {\n    let range: number[] = [];\n    if (maxValue.value != null) {\n      for (let i = minValue.value; i <= maxValue.value; i++) {\n        range.push(i);\n      }\n    }\n    return range;\n  });\n\n  watch(\n    () => props.value,\n    (val) => {\n      if (val !== computeValue.value) {\n        parseValue(val);\n      }\n    },\n    { immediate: true }\n  );\n\n  watch(computeValue, (v) => updateValue(v));\n\n  function updateValue(value) {\n    emit('change', value);\n    emit('update:value', value);\n  }\n\n  /**\n   * parseValue\n   * @param value\n   */\n  function parseValue(value) {\n    if (value === computeValue.value) {\n      return;\n    }\n    try {\n      if (!value || value === defaultValue.value) {\n        type.value = TypeEnum.every;\n      } else if (value.indexOf('?') >= 0) {\n        type.value = TypeEnum.unset;\n      } else if (value.indexOf('-') >= 0) {\n        type.value = TypeEnum.range;\n        const values = value.split('-');\n        if (values.length >= 2) {\n          valueRange.start = parseInt(values[0]);\n          valueRange.end = parseInt(values[1]);\n        }\n      } else if (value.indexOf('/') >= 0) {\n        type.value = TypeEnum.loop;\n        const values = value.split('/');\n        if (values.length >= 2) {\n          valueLoop.start = value[0] === '*' ? 0 : parseInt(values[0]);\n          valueLoop.interval = parseInt(values[1]);\n        }\n      } else if (value.indexOf('W') >= 0) {\n        type.value = TypeEnum.work;\n        const values = value.split('W');\n        if (!values[0] && !isNaN(values[0])) {\n          valueWork.value = parseInt(values[0]);\n        }\n      } else if (value.indexOf('L') >= 0) {\n        type.value = TypeEnum.last;\n      } else if (value.indexOf(',') >= 0 || !isNaN(value)) {\n        type.value = TypeEnum.specify;\n        valueList.value = value.split(',').map((item) => parseInt(item));\n      } else {\n        type.value = TypeEnum.every;\n      }\n    } catch (e) {\n      type.value = TypeEnum.every;\n    }\n  }\n\n  const beforeRadioAttrs = computed(() => ({\n    class: ['choice'],\n    disabled: props.disabled || unref(options.disabled),\n  }));\n  const inputNumberAttrs = computed(() => ({\n    class: ['w60'],\n    max: maxValue.value,\n    min: minValue.value,\n    precision: 0,\n  }));\n  const typeRangeAttrs = computed(() => ({\n    disabled: type.value !== TypeEnum.range || props.disabled || unref(options.disabled),\n    ...inputNumberAttrs.value,\n  }));\n  const typeLoopAttrs = computed(() => ({\n    disabled: type.value !== TypeEnum.loop || props.disabled || unref(options.disabled),\n    ...inputNumberAttrs.value,\n  }));\n  const typeSpecifyAttrs = computed(() => ({\n    disabled: type.value !== TypeEnum.specify || props.disabled || unref(options.disabled),\n    class: ['list-check-item'],\n  }));\n\n  return {\n    type,\n    TypeEnum,\n    prefixCls,\n    defaultValue,\n    valueRange,\n    valueLoop,\n    valueWeek,\n    valueList,\n    valueWork,\n    maxValue,\n    minValue,\n    computeValue,\n    specifyRange,\n    updateValue,\n    parseValue,\n    beforeRadioAttrs,\n    inputNumberAttrs,\n    typeRangeAttrs,\n    typeLoopAttrs,\n    typeSpecifyAttrs,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JEasyCron/validator.ts",
    "content": "import CronParser from 'cron-parser';\nimport type { ValidatorRule } from 'ant-design-vue/lib/form/interface';\n\nconst cronRule: ValidatorRule = {\n  validator({}, value) {\n    // 没填写就不校验\n    if (!value) {\n      return Promise.resolve();\n    }\n    const values: string[] = value.split(' ').filter((item) => !!item);\n    if (values.length > 7) {\n      return Promise.reject('Cron表达式最多7项！');\n    }\n    // 检查第7项\n    let val: string = value;\n    if (values.length === 7) {\n      const year = values[6];\n      if (year !== '*' && year !== '?') {\n        let yearValues: string[] = [];\n        if (year.indexOf('-') >= 0) {\n          yearValues = year.split('-');\n        } else if (year.indexOf('/')) {\n          yearValues = year.split('/');\n        } else {\n          yearValues = [year];\n        }\n        // 判断是否都是数字\n        const checkYear = yearValues.some((item) => isNaN(Number(item)));\n        if (checkYear) {\n          return Promise.reject('Cron表达式参数[年]错误：' + year);\n        }\n      }\n      // 取其中的前六项\n      val = values.slice(0, 6).join(' ');\n    }\n    // 6位 没有年\n    // 5位没有秒、年\n    try {\n      const iter = CronParser.parseExpression(val);\n      iter.next();\n      return Promise.resolve();\n    } catch (e) {\n      return Promise.reject('Cron表达式错误：' + e);\n    }\n  },\n};\n\nexport default cronRule.validator;\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JEditor.vue",
    "content": "<template>\n  <Tinymce v-bind=\"bindProps\" @change=\"onChange\" />\n</template>\n\n<script lang=\"ts\">\n  import { computed, defineComponent, nextTick } from 'vue';\n\n  import { Tinymce } from '/@/components/Tinymce';\n  import { propTypes } from '/@/utils/propTypes';\n  import { Form } from 'ant-design-vue';\n\n  export default defineComponent({\n    name: 'JEditor',\n    // 不将 attrs 的属性绑定到 html 标签上\n    inheritAttrs: false,\n    components: { Tinymce },\n    props: {\n      value: propTypes.string.def(''),\n      disabled: propTypes.bool.def(false),\n      //是否聚焦\n      autoFocus: propTypes.bool.def(true),\n    },\n    emits: ['change', 'update:value'],\n    setup(props, { emit, attrs }) {\n      // 合并 props 和 attrs\n      const bindProps = computed(() => Object.assign({}, props, attrs));\n      const formItemContext = Form.useInjectFormItemContext();\n      // value change 事件\n      function onChange(value) {\n        emit('change', value);\n        emit('update:value', value);\n        // 代码逻辑说明: 【QQYUN-9110】组件有值校验没消失\n        nextTick(() => {\n          formItemContext?.onFieldChange();\n        });\n      }\n\n      return {\n        bindProps,\n        onChange,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JEllipsis.vue",
    "content": "<template>\n  <a-tooltip placement=\"topLeft\">\n    <template #title>\n      <span>{{ value }}</span>\n    </template>\n    {{ showText }}\n  </a-tooltip>\n</template>\n<script lang=\"ts\" setup>\n  import { computed } from 'vue';\n  import { propTypes } from '/@/utils/propTypes';\n\n  const props = defineProps({\n    value: propTypes.oneOfType([propTypes.string, propTypes.number, propTypes.array]),\n    length: propTypes.number.def(25),\n  });\n  //显示的文本\n  const showText = computed(() =>\n    props.value ? (props.value.length > props.length ? props.value.slice(0, props.length) + '...' : props.value) : props.value\n  );\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JFormContainer.vue",
    "content": "<template>\n  <div :class=\"disabled ? 'jeecg-form-container-disabled' : ''\">\n    <fieldset :disabled=\"disabled\">\n      <slot></slot>\n    </fieldset>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n\n  export default defineComponent({\n    name: 'JFormContainer',\n    props: {\n      disabled: {\n        type: Boolean,\n        default: false,\n        required: false,\n      },\n    },\n  });\n</script>\n\n<style lang=\"less\">\n  .jeecg-form-container-disabled {\n    cursor: not-allowed;\n\n    fieldset[disabled] {\n      -ms-pointer-events: none;\n      pointer-events: none;\n    }\n\n    .ant-select {\n      -ms-pointer-events: none;\n      pointer-events: none;\n    }\n\n    .ant-upload-select {\n      display: none;\n    }\n\n    .ant-upload-list {\n      cursor: grabbing;\n    }\n\n    fieldset[disabled]{\n      .anticon-delete{\n        display: none !important;\n      }\n    }\n  }\n\n  .jeecg-form-container-disabled fieldset[disabled] .ant-upload-list {\n    -ms-pointer-events: auto !important;\n    pointer-events: auto !important;\n  }\n\n  .jeecg-form-container-disabled .ant-upload-list-item-actions .anticon-delete,\n  .jeecg-form-container-disabled .ant-upload-list-item .anticon-close {\n    display: none;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JImageUpload.vue",
    "content": "<template>\n  <div class=\"clearfix\">\n    <a-upload\n      :listType=\"listType\"\n      accept=\"image/*\"\n      :multiple=\"multiple\"\n      :action=\"uploadUrl\"\n      :headers=\"headers\"\n      :data=\"{ biz: bizPath }\"\n      v-model:fileList=\"uploadFileList\"\n      :beforeUpload=\"beforeUpload\"\n      :disabled=\"disabled\"\n      @change=\"handleChange\"\n      @preview=\"handlePreview\"\n    >\n      <div v-if=\"uploadVisible\">\n        <div v-if=\"listType == 'picture-card'\">\n          <LoadingOutlined v-if=\"loading\" />\n          <UploadOutlined v-else />\n          <div class=\"ant-upload-text\">{{ text }}</div>\n        </div>\n        <a-button v-if=\"listType == 'picture'\" :disabled=\"disabled\">\n          <UploadOutlined></UploadOutlined>\n          {{ text }}\n        </a-button>\n      </div>\n    </a-upload>\n    <a-modal :width=\"previewWidth\" :open=\"previewVisible\" :footer=\"null\" @cancel=\"handleCancel()\">\n      <img alt=\"example\" style=\"width: 100%\" :src=\"previewImage\" />\n    </a-modal>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, ref, reactive, watchEffect, computed, unref, watch, onMounted, nextTick } from 'vue';\n  import { LoadingOutlined, UploadOutlined } from '@ant-design/icons-vue';\n  import { useRuleFormItem } from '/@/hooks/component/useFormItem';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { getFileAccessHttpUrl, getHeaders, getRandom } from '/@/utils/common/compUtils';\n  import { uploadUrl as systemUploadUrl } from '/@/api/common/api';\n  import { getToken } from '/@/utils/auth';\n\n  const { createMessage, createErrorModal } = useMessage();\n  export default defineComponent({\n    name: 'JImageUpload',\n    components: { LoadingOutlined, UploadOutlined },\n    inheritAttrs: false,\n    props: {\n      //绑定值\n      value: propTypes.oneOfType([propTypes.string, propTypes.array]),\n      //按钮文本\n      listType: {\n        type: String,\n        required: false,\n        default: 'picture-card',\n      },\n      //按钮文本\n      text: {\n        type: String,\n        required: false,\n        default: '上传',\n      },\n      //这个属性用于控制文件上传的业务路径\n      bizPath: {\n        type: String,\n        required: false,\n        default: 'temp',\n      },\n      //是否禁用\n      disabled: {\n        type: Boolean,\n        required: false,\n        default: false,\n      },\n      //上传数量\n      fileMax: {\n        type: Number,\n        required: false,\n        default: 1,\n      },\n      uploadUrl: {\n        type: String,\n        default: systemUploadUrl,\n      },\n      previewWidth: {\n        type: Number,\n        required: false,\n        default: 520,\n      },\n    },\n    emits: ['options-change', 'change', 'update:value'],\n    setup(props, { emit, refs }) {\n      const emitData = ref<any[]>([]);\n      const attrs = useAttrs();\n      const [state] = useRuleFormItem(props, 'value', 'change', emitData);\n      //获取文件名\n      const getFileName = (path) => {\n        if (path.lastIndexOf('\\\\') >= 0) {\n          let reg = new RegExp('\\\\\\\\', 'g');\n          path = path.replace(reg, '/');\n        }\n        return path.substring(path.lastIndexOf('/') + 1);\n      };\n      //token\n      const headers = getHeaders();\n      //上传状态\n      const loading = ref<boolean>(false);\n      //是否是初始化加载\n      const initTag = ref<boolean>(true);\n      //文件列表\n      let uploadFileList = ref<any[]>([]);\n      //预览图\n      const previewImage = ref<string | undefined>('');\n      //预览框状态\n      const previewVisible = ref<boolean>(false);\n\n      //计算是否开启多图上传\n      const multiple = computed(() => {\n        return props['fileMax'] > 1 || props['fileMax'] === 0;\n      });\n\n      //计算是否可以继续上传\n      const uploadVisible = computed(() => {\n        if (props['fileMax'] === 0) {\n          return true;\n        }\n        return uploadFileList.value.length < props['fileMax'];\n      });\n\n      /**\n       * 监听value变化\n       */\n      watch(\n        () => props.value,\n        (val, prevCount) => {\n         // 代码逻辑说明: 【issues/556】JImageUpload组件value赋初始值没显示图片------------\n            if (val && val instanceof Array) {\n            val = val.join(',');\n          }\n          if (initTag.value == true) {\n            initFileList(val);\n          }\n        },\n        { immediate: true }\n      );\n\n      /**\n       * 初始化文件列表\n       */\n      function initFileList(paths) {\n        if (!paths || paths.length == 0) {\n          uploadFileList.value = [];\n          return;\n        }\n        let files = [];\n        let arr = paths.split(',');\n        arr.forEach((value) => {\n          let url = getFileAccessHttpUrl(value);\n          files.push({\n            uid: getRandom(10),\n            name: getFileName(value),\n            status: 'done',\n            url: url,\n            response: {\n              status: 'history',\n              message: value,\n            },\n          });\n        });\n        uploadFileList.value = files;\n      }\n\n      /**\n       * 上传前校验\n       */\n      function beforeUpload(file) {\n        let fileType = file.type;\n        if (fileType.indexOf('image') < 0) {\n          createMessage.info('请上传图片');\n          return false;\n        }\n      }\n      /**\n       * 文件上传结果回调\n       */\n      function handleChange({ file, fileList, event }) {\n        initTag.value = false;\n        // uploadFileList.value = fileList;\n        if (file.status === 'error') {\n          createMessage.error(`${file.name} 上传失败.`);\n        }\n        // 代码逻辑说明: 【TV360X-1640】上传图片大小超出限制显示优化\n        if (file.status === 'done' && file.response.success === false) {\n          const failIndex = uploadFileList.value.findIndex((item) => item.uid === file.uid);\n          if (failIndex != -1) {\n            uploadFileList.value.splice(failIndex, 1);\n          }\n          createMessage.warning(file.response.message);\n          return;\n        }\n        let fileUrls = [];\n        let noUploadingFileCount = 0;\n        if (file.status != 'uploading') {\n          fileList.forEach((file) => {\n            if (file.status === 'done') {\n              fileUrls.push(file.response.message);\n            }\n            if (file.status != 'uploading') {\n              noUploadingFileCount++;\n            }\n          });\n          if (file.status === 'removed') {\n            handleDelete(file);\n          }\n          if (noUploadingFileCount == fileList.length) {\n            state.value = fileUrls.join(',');\n            emit('update:value', fileUrls.join(','));\n            // 代码逻辑说明: [issues/248]原生表单内使用图片组件,关闭弹窗图片组件值不会被清空------------\n            nextTick(() => {\n              initTag.value = true;\n            });\n          }\n        }\n      }\n\n      /**\n       * 删除图片\n       */\n      function handleDelete(file) {\n        //如有需要新增 删除逻辑\n        console.log(file);\n      }\n\n      /**\n       * 预览图片\n       */\n      function handlePreview(file) {\n        previewImage.value = file.url || file.thumbUrl;\n        previewVisible.value = true;\n      }\n\n      function getAvatarView() {\n        if (uploadFileList.length > 0) {\n          let url = uploadFileList[0].url;\n          return getFileAccessHttpUrl(url, null);\n        }\n      }\n\n      function handleCancel() {\n        previewVisible.value = false;\n      }\n\n      return {\n        state,\n        attrs,\n        previewImage,\n        previewVisible,\n        uploadFileList,\n        multiple,\n        headers,\n        loading,\n        beforeUpload,\n        uploadVisible,\n        handlePreview,\n        handleCancel,\n        handleChange,\n      };\n    },\n  });\n</script>\n<style scoped>\n  .ant-upload-select-picture-card i {\n    font-size: 32px;\n    color: #999;\n  }\n\n  .ant-upload-select-picture-card .ant-upload-text {\n    margin-top: 8px;\n    color: #666;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JImportModal.vue",
    "content": "<template>\n  <div>\n    <BasicModal v-bind=\"$attrs\" @register=\"register\" title=\"导入EXCEL\" :width=\"600\" @cancel=\"handleClose\" :confirmLoading=\"uploading\" destroyOnClose>\n      <!--是否校验-->\n      <div style=\"margin: 0 5px 5px\" v-if=\"online\">\n        <span style=\"display: inline-block; height: 32px; line-height: 32px; vertical-align: middle\">是否开启校验:</span>\n        <span style=\"margin-left: 6px\">\n          <a-switch :checked=\"validateStatus == 1\" @change=\"handleChangeValidateStatus\" checked-children=\"是\" un-checked-children=\"否\" />\n        </span>\n      </div>\n      <!--上传-->\n      <a-upload name=\"file\" accept=\".xls,.xlsx\" :multiple=\"true\" :fileList=\"fileList\" @remove=\"handleRemove\" :beforeUpload=\"beforeUpload\">\n        <a-button preIcon=\"ant-design:upload-outlined\">选择导入文件</a-button>\n      </a-upload>\n      <!--页脚-->\n      <template #footer>\n        <a-button @click=\"handleClose\">关闭</a-button>\n        <a-button type=\"primary\" @click=\"handleImport\" :disabled=\"uploadDisabled\" :loading=\"uploading\">{{\n          uploading ? '上传中...' : '开始上传'\n        }}</a-button>\n      </template>\n    </BasicModal>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, ref, unref, watchEffect, computed } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { defHttp } from '/@/utils/http/axios';\n  import { useGlobSetting } from '/@/hooks/setting';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { isObject } from '/@/utils/is';\n\n  export default defineComponent({\n    name: 'JImportModal',\n    components: {\n      BasicModal,\n    },\n    props: {\n      url: {\n        type: String,\n        default: '',\n        required: false,\n      },\n      biz: {\n        type: String,\n        default: '',\n        required: false,\n      },\n      //是否online导入\n      online: {\n        type: Boolean,\n        default: false,\n        required: false,\n      },\n    },\n    emits: ['ok', 'register'],\n    setup(props, { emit, refs }) {\n      const { createMessage, createWarningModal } = useMessage();\n      //注册弹框\n      const [register, { closeModal }] = useModalInner((data) => {\n        reset(data);\n      });\n      const glob = useGlobSetting();\n      const attrs = useAttrs();\n      const uploading = ref(false);\n      //文件集合\n      const fileList = ref([]);\n      //上传url\n      const uploadAction = ref('');\n      const foreignKeys = ref('');\n      //校验状态\n      const validateStatus = ref(0);\n      const getBindValue = Object.assign({}, unref(props), unref(attrs));\n      //监听url\n      watchEffect(() => {\n        props.url && (uploadAction.value = `${glob.uploadUrl}${props.url}`);\n      });\n      //按钮disabled状态\n      const uploadDisabled = computed(() => !(unref(fileList).length > 0));\n\n      //关闭方法\n      function handleClose() {\n        // 代码逻辑说明: 【QQYUN-7477】关闭弹窗清空内容（之前上传失败关闭后不会清除）\n        closeModal();\n        reset();\n      }\n\n      //校验状态切换\n      function handleChangeValidateStatus(checked) {\n        validateStatus.value = !!checked ? 1 : 0;\n      }\n\n      //移除上传文件\n      function handleRemove(file) {\n        const index = unref(fileList).indexOf(file);\n        const newFileList = unref(fileList).slice();\n        newFileList.splice(index, 1);\n        fileList.value = newFileList;\n      }\n\n      //上传前处理\n      function beforeUpload(file) {\n        fileList.value = [...unref(fileList), file];\n        return false;\n      }\n\n      //文件上传\n      function handleImport() {\n        let { biz, online } = props;\n        const formData = new FormData();\n        if (biz) {\n          formData.append('isSingleTableImport', biz);\n        }\n        if (unref(foreignKeys) && unref(foreignKeys).length > 0) {\n          formData.append('foreignKeys', unref(foreignKeys));\n        }\n        // 代码逻辑说明: 【issues/6124】当用户没有【Online表单开发】页面的权限时用户无权导入从表数据\n        if (isObject(foreignKeys.value)) {\n          formData.append('foreignKeys', JSON.stringify(foreignKeys.value));\n        }\n        if (!!online) {\n          formData.append('validateStatus', unref(validateStatus));\n        }\n        unref(fileList).forEach((file) => {\n          formData.append('files[]', file);\n        });\n        uploading.value = true;\n\n        //TODO 请求怎样处理的问题\n        let headers = {\n          'Content-Type': 'multipart/form-data;boundary = ' + new Date().getTime(),\n        };\n        defHttp.post({ url: props.url, params: formData, headers }, { isTransformResponse: false }).then((res) => {\n          uploading.value = false;\n          if (res.success) {\n            if (res.code == 201) {\n              errorTip(res.message, res.result);\n            } else {\n              createMessage.success(res.message);\n            }\n            handleClose();\n            reset();\n            emit('ok');\n          } else {\n            createMessage.warning(res.message);\n          }\n        }).catch(() => {\n          uploading.value = false;\n        });\n      }\n\n      //错误信息提示\n      function errorTip(tipMessage, fileUrl) {\n        let href = glob.uploadUrl + fileUrl;\n        createWarningModal({\n          title: '导入成功,但是有错误数据!',\n          centered: false,\n          content: `<div>\n                        <span>${tipMessage}</span><br/>\n                        <span>具体详情请<a href = ${href} target=\"_blank\"> 点击下载 </a> </span>\n                      </div>`,\n        });\n      }\n\n      //重置\n      function reset(arg?) {\n        fileList.value = [];\n        uploading.value = false;\n        foreignKeys.value = arg;\n        validateStatus.value = 0;\n      }\n\n      return {\n        register,\n        getBindValue,\n        uploadDisabled,\n        fileList,\n        uploading,\n        validateStatus,\n        handleClose,\n        handleChangeValidateStatus,\n        handleRemove,\n        beforeUpload,\n        handleImport,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JInput.vue",
    "content": "<template>\n  <a-input v-bind=\"getBindValue\" v-model:value=\"showText\" @input=\"backValue\"></a-input>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, PropType, ref, watchEffect, unref, watch, computed } from 'vue';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { propTypes } from '/@/utils/propTypes';\n  import { JInputTypeEnum } from '/@/enums/jeecgEnum.ts';\n  import { omit } from 'lodash-es';\n\n  export default defineComponent({\n    name: 'JInput',\n    inheritAttrs: false,\n    props: {\n      value: propTypes.string.def(''),\n      type: propTypes.string.def(JInputTypeEnum.JINPUT_QUERY_LIKE),\n      placeholder: propTypes.string.def(''),\n      trim: propTypes.bool.def(false),\n      class: propTypes.string,\n      style: propTypes.object,\n    },\n    emits: ['change', 'update:value'],\n    setup(props, { emit }) {\n      const attrs = useAttrs();\n      //表单值\n      const showText = ref('');\n      //绑定属性\n      const getBindValue = computed(() => {\n        return omit(Object.assign({}, unref(props), unref(attrs)), ['value']);\n      });\n      //监听类型变化\n      watch(\n        () => props.type,\n        (val) => {\n          val && backValue({ target: { value: unref(showText) } });\n        }\n      );\n      //监听value变化\n      watch(\n        () => props.value,\n        () => {\n          initVal();\n        },\n        { immediate: true }\n      );\n\n      /**\n       * 初始化数值\n       */\n      function initVal() {\n        if (!props.value) {\n          showText.value = '';\n        } else {\n          let text = props.value;\n          switch (props.type) {\n            case JInputTypeEnum.JINPUT_QUERY_LIKE:\n              //修复路由传参的值传送到jinput框被前后各截取了一位 #1336\n              if (text.indexOf('*') != -1) {\n                text = text.substring(1, text.length - 1);\n              }\n              break;\n            case JInputTypeEnum.JINPUT_QUERY_NE:\n              text = text.substring(1);\n              break;\n            case JInputTypeEnum.JINPUT_QUERY_GE:\n              text = text.substring(2);\n              break;\n            case JInputTypeEnum.JINPUT_QUERY_LE:\n              text = text.substring(2);\n              break;\n            default:\n          }\n          showText.value = text;\n        }\n      }\n\n      /**\n       * 返回值\n       */\n      function backValue(e) {\n        let text = e?.target?.value ?? '';\n        if (text && !!props.trim) {\n          text = text.trim();\n        }\n        switch (props.type) {\n          case JInputTypeEnum.JINPUT_QUERY_LIKE:\n            text = '*' + text + '*';\n            break;\n          case JInputTypeEnum.JINPUT_QUERY_NE:\n            text = '!' + text;\n            break;\n          case JInputTypeEnum.JINPUT_QUERY_GE:\n            text = '>=' + text;\n            break;\n          case JInputTypeEnum.JINPUT_QUERY_LE:\n            text = '<=' + text;\n            break;\n          default:\n        }\n        emit('change', text);\n        emit('update:value', text);\n      }\n\n      return { showText, attrs, getBindValue, backValue };\n    },\n  });\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JInputPop.vue",
    "content": "<template>\n  <a-popover\n    trigger=\"contextmenu\"\n    v-model:open=\"visible\"\n    :overlayClassName=\"`${prefixCls}-popover`\"\n    :getPopupContainer=\"getPopupContainer\"\n    :placement=\"position\"\n  >\n    <template #title>\n      <span :class=\"title ? 'title' : 'emptyTitle'\">{{ title }}</span>\n      <span style=\"float: right\" title=\"关闭\">\n        <Icon icon=\"ant-design:close-outlined\" @click=\"visible = false\" />\n      </span>\n    </template>\n    <template #content>\n      <a-textarea ref=\"textareaRef\" :value=\"innerValue\" :disabled=\"disabled\" :style=\"textareaStyle\" v-bind=\"attrs\" @input=\"onInputChange\" @blur=\"onInputBlur\" />\n    </template>\n    <a-input :class=\"`${prefixCls}-input`\" :value=\"innerValue\" :disabled=\"disabled\" v-bind=\"attrs\" @change=\"onInputChange\" @blur=\"onInputBlur\">\n      <template #suffix>\n        <Icon icon=\"ant-design:fullscreen-outlined\" @click.stop=\"onShowPopup\" />\n      </template>\n    </a-input>\n  </a-popover>\n</template>\n\n<script lang=\"ts\" setup>\n  import { computed, nextTick, ref, watch } from 'vue';\n  import Icon from '/@/components/Icon/src/Icon.vue';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  const { prefixCls } = useDesign('j-input-popup');\n  const props = defineProps({\n    // v-model:value\n    value: propTypes.string.def(''),\n    title: propTypes.string.def(''),\n    // 弹出框显示位置\n    position: propTypes.string.def('right'),\n    width: propTypes.number.def(300),\n    height: propTypes.number.def(150),\n    disabled: propTypes.bool.def(false),\n    // 弹出框挂载的元素ID\n    popContainer: propTypes.oneOfType([propTypes.string, propTypes.func]).def(''),\n  });\n  const attrs = useAttrs();\n  const emit = defineEmits(['change', 'update:value', 'blur']);\n\n  const visible = ref<boolean>(false);\n  const innerValue = ref<string>('');\n  // textarea ref对象\n  const textareaRef = ref();\n  // textarea 样式\n  const textareaStyle = computed(() => ({\n    height: `${props.height}px`,\n    width: `${props.width}px`,\n  }));\n\n  watch(\n    () => props.value,\n    (value) => {\n      if (value && value.length > 0) {\n        innerValue.value = value;\n      }\n    },\n    { immediate: true }\n  );\n\n  function onInputChange(event) {\n    innerValue.value = event.target.value;\n    emitValue(innerValue.value);\n  }\n\n  async function onShowPopup() {\n    visible.value = true;\n    await nextTick();\n    textareaRef.value?.focus();\n  }\n\n  // 获取弹出框挂载的元素\n  function getPopupContainer(node) {\n    if (!props.popContainer) {\n      return node?.parentNode;\n    } else if (typeof props.popContainer === 'function') {\n      return props.popContainer(node);\n    } else {\n      return document.getElementById(props.popContainer);\n    }\n  }\n\n  function emitValue(value) {\n    emit('change', value);\n    emit('update:value', value);\n  }\n\n  const onInputBlur = (event) => {\n    emit('blur', event);\n  }\n</script>\n\n<style lang=\"less\">\n  //noinspection LessUnresolvedVariable\n  @prefix-cls: ~'@{namespace}-j-input-popup';\n\n  .@{prefix-cls} {\n    &-popover {\n      // 代码逻辑说明: 【TV360X-144】jVxetable中的多行文本组件当title没有时去掉多余的线\n      .ant-popover-title:has(.emptyTitle) {\n        border-bottom: none;\n      }\n    }\n\n    &-input {\n      .app-iconify {\n        cursor: pointer;\n        color: #666666;\n        transition: color 0.3s;\n\n        &:hover {\n          color: black;\n        }\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JInputSelect.vue",
    "content": "<template>\n  <div class=\"JInputSelect\">\n    <a-input-group compact>\n      <a-select\n        v-bind=\"$attrs\"\n        :placeholder=\"selectPlaceholder\"\n        v-if=\"selectLocation === 'left'\"\n        v-model:value=\"selectVal\"\n        @change=\"handleSelectChange\"\n      >\n        <a-select-option v-for=\"item in options\" :key=\"item.value\">{{ item.label }}</a-select-option>\n      </a-select>\n      <a-input v-bind=\"$attrs\" :placeholder=\"inputPlaceholder\" v-model:value=\"inputVal\" @change=\"handleInputChange\" />\n      <a-select\n        v-bind=\"$attrs\"\n        :placeholder=\"selectPlaceholder\"\n        v-if=\"selectLocation === 'right'\"\n        v-model:value=\"selectVal\"\n        @change=\"handleSelectChange\"\n        :style=\"{width:props.selectWidth}\"\n      >\n        <a-select-option v-for=\"item in options\" :key=\"item.value\">{{ item.label }}</a-select-option>\n      </a-select>\n    </a-input-group>\n  </div>\n</template>\n\n<script setup name=\"JInputSelect\" lang=\"ts\">\n  import { ref, watchEffect } from 'vue';\n  import { propTypes } from '/@/utils/propTypes';\n  const props = defineProps({\n    value: propTypes.string.def(''),\n    options: propTypes.array.def([]),\n    selectLocation: propTypes.oneOf(['left', 'right']).def('right'),\n    selectPlaceholder: propTypes.string.def(''),\n    inputPlaceholder: propTypes.string.def(''),\n    selectWidth:propTypes.string.def('auto'),\n  });\n  const emit = defineEmits(['update:value', 'change']);\n  const selectVal = ref<string>();\n  const inputVal = ref<string>();\n\n  \n  const handleInputChange = (e) => {\n    const val = e.target.value;\n    setSelectValByInputVal(val);\n    emits(val);\n  };\n  const handleSelectChange = (val) => {\n    inputVal.value = val;\n    emits(val);\n  };\n  const setSelectValByInputVal = (val) => {\n    const findItem = props.options.find((item) => item.value === val);\n    if (findItem) {\n      selectVal.value = val;\n    } else {\n      selectVal.value = undefined;\n    }\n  }\n  watchEffect(() => {\n    inputVal.value = props.value;\n    setSelectValByInputVal(props.value);\n  });\n  const emits = (val) => {\n    emit('update:value', val);\n    emit('change', val);\n  };\n</script>\n\n<style lang=\"less\" scoped>\n  .JInputSelect {\n    .ant-input-group {\n      display: flex;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JLinkTableCard/JLinkTableCard.vue",
    "content": "<template>\n  <div ref=\"tableLinkCardRef\">\n    <div class=\"table-link-card\">\n      <div style=\"width: 100%; height: 100%\">\n        <div class=\"card-button\" v-if=\"showButton\">\n          <a-button @click=\"handleAddRecord\"><PlusOutlined />记 录</a-button>\n        </div>\n\n        <a-row>\n          <a-col :span=\"fixedSpan ? fixedSpan : itemSpan\" v-for=\"(record, index) in selectRecords\" :key=\"index\">\n            <div class=\"card-item\" :class=\"{ 'disabled-chunk': detail == true }\">\n              <!-- -->\n              <div class=\"card-item-left\" :class=\"{ 'show-right-image': getImageSrc(record) }\">\n                <span class=\"card-delete\" v-if=\"disabled == false\">\n                  <minus-circle-filled @click=\"(e) => handleDeleteRecord(e, index)\" />\n                </span>\n                <div class=\"card-inner\">\n                  <div class=\"card-main-content\">{{ getMainContent(record) }}</div>\n                  <div class=\"other-content\">\n                    <a-row>\n                      <a-col :span=\"columnSpan\" v-for=\"(col, cIndex) in realShowColumns\" :key=\"cIndex\">\n                        <span class=\"label ellipsis\">{{ col.title }}</span>\n                        <span class=\"text ellipsis\">{{ record[col.dataIndex] }}</span>\n                      </a-col>\n                    </a-row>\n                  </div>\n                </div>\n              </div>\n\n              <div class=\"card-item-image\" v-if=\"getImageSrc(record)\">\n                <img v-if=\"getImageSrc(record)\" :src=\"getImageSrc(record)\" @error=\"handleImageError\" />\n              </div>\n            </div>\n          </a-col>\n        </a-row>\n      </div>\n    </div>\n    <LinkTableListModal @register=\"registerListModal\" :multi=\"multi\" :id=\"popTableName\" @success=\"addCard\" />\n  </div>\n</template>\n\n<script>\n  import { propTypes } from '/@/utils/propTypes';\n  import { PlusOutlined, MinusCircleFilled } from '@ant-design/icons-vue';\n  import { computed, ref, watch, onMounted } from 'vue';\n  import { useLinkTable } from './hooks/useLinkTable';\n  import { useModal } from '/@/components/Modal';\n  import placeholderImage from '/@/assets/images/placeholderImage.png';\n  import { createAsyncComponent } from '@/utils/factory/createAsyncComponent';\n\n  export default {\n    name: 'JLinkTableCard',\n    inheritAttrs: false,\n    props: {\n      // value字段\n      valueField: propTypes.string.def(''),\n      // 文本字段\n      textField: propTypes.string.def(''),\n      // 关联表名\n      tableName: propTypes.string.def(''),\n      // 是否多选\n      multi: propTypes.bool.def(false),\n      value: propTypes.oneOfType([propTypes.string, propTypes.number]),\n      // [\"表单字段,表字典字段\",\"表单字段,表字典字段\"]\n      linkFields: propTypes.array.def([]),\n      //是否是禁用页面\n      disabled: propTypes.bool.def(false),\n      // 是否是detail页面\n      detail: propTypes.bool.def(false),\n      // 图片字段\n      imageField: propTypes.string.def(''),\n    },\n    components: {\n      PlusOutlined,\n      MinusCircleFilled,\n      LinkTableListModal: createAsyncComponent(() => import('./components/LinkTableListModal.vue'), { loading: true }),\n    },\n    emits: ['change', 'update:value'],\n    setup(props, { emit }) {\n      const popTableName = computed(() => {\n        return props.tableName;\n      });\n      //注册model\n      const [registerListModal, { openModal: openListModal }] = useModal();\n      const selectValue = ref([]);\n      const selectRecords = ref([]);\n      const tableLinkCardRef = ref(null);\n      const fixedSpan = ref(0);\n\n      const showButton = computed(() => {\n        if (props.disabled == true) {\n          return false;\n        }\n        if (props.multi === false) {\n          //单选且有值\n          if (selectRecords.value.length > 0) {\n            return false;\n          }\n        }\n        return true;\n      });\n\n      const {\n        auths,\n        otherColumns,\n        realShowColumns,\n        tableColumns,\n        textFieldArray,\n        transData,\n        loadOne,\n        compareData,\n        formatData,\n        initFormData,\n        getImageSrc,\n        showImage,\n      } = useLinkTable(props);\n\n      const itemSpan = computed(() => {\n        if (props.multi === true) {\n          return 12;\n        }\n        return 24;\n      });\n\n      const columnSpan = computed(() => {\n        if (props.multi === true) {\n          return 24;\n        }\n        return 12;\n      });\n\n      function getMainContent(record) {\n        if (record) {\n          if (textFieldArray.value.length > 0) {\n            let field = textFieldArray.value[0];\n            return record[field];\n          }\n        }\n      }\n\n      function prevent(e) {\n        e?.stopPropagation();\n        e?.preventDefault();\n      }\n\n\n      function handleAddRecord(e) {\n        prevent(e);\n        openListModal(true, {\n          // 代码逻辑说明: 【TV360X-43】修复关联记录可以添加重复数据\n          selectedRowKeys: selectRecords.value.map((item) => item.id),\n          selectedRows: [...selectRecords.value],\n        });\n      }\n\n      function addCard(data) {\n        // 代码逻辑说明: 【TV360X-43】修复关联记录可以添加重复数据\n        let arr = [];\n        for (let item of data) {\n          let temp = { ...item };\n          transData(temp);\n          arr.push(temp);\n        }\n        selectRecords.value = arr;\n        emitValue();\n      }\n\n      function updateCardData(formData) {\n        let arr = selectRecords.value;\n        for (let i = 0; i < arr.length; i++) {\n          if (arr[i].id === formData.id) {\n            let temp = { ...formData };\n            transData(temp);\n            arr.splice(i, 1, temp);\n          }\n        }\n        selectRecords.value = arr;\n        emitValue();\n      }\n\n      function handleDeleteRecord(e, index) {\n        prevent(e);\n        let temp = selectRecords.value;\n        if (temp && temp.length > index) {\n          temp.splice(index, 1);\n          selectRecords.value = temp;\n        }\n        emitValue();\n      }\n\n      function emitValue() {\n        let arr = selectRecords.value;\n        let values = [];\n        let formData = {};\n        let linkFieldArray = props.linkFields;\n        if (arr.length > 0) {\n          for (let i = 0; i < arr.length; i++) {\n            values.push(arr[i][props.valueField]);\n            initFormData(formData, linkFieldArray, arr[i]);\n          }\n        } else {\n          initFormData(formData, linkFieldArray);\n        }\n        let text = values.join(',');\n        formatData(formData);\n        emit('change', text, formData);\n        emit('update:value', text);\n      }\n\n      watch(\n        () => props.value,\n        async (val) => {\n          if (val) {\n            let flag = compareData(selectRecords.value, val);\n            if (flag === false) {\n              let arr = await loadOne(val);\n              selectRecords.value = arr;\n            }\n            //保证表单其他值回显成功\n            if (props.linkFields && props.linkFields.length > 0) {\n              emitValue();\n            }\n          } else {\n            selectRecords.value = [];\n          }\n        },\n        { immediate: true }\n      );\n\n      onMounted(() => {\n        // 代码逻辑说明: 【TV360X-281】分辨率小时关联记录文字被图片挤没了\n        if (tableLinkCardRef.value.offsetWidth < 250) {\n          fixedSpan.value = 24;\n        }\n      });\n      // 代码逻辑说明: 【TV360X-389】下拉和卡片关联记录图裂开给个默认图片\n      const handleImageError = (event) => {\n        event.target.src = placeholderImage;\n      };\n\n      return {\n        popTableName,\n        selectRecords,\n        otherColumns,\n        realShowColumns,\n        showButton,\n        selectValue,\n        handleAddRecord,\n        handleDeleteRecord,\n        getMainContent,\n        itemSpan,\n        columnSpan,\n        tableColumns,\n        addCard,\n        registerListModal,\n        updateCardData,\n        getImageSrc,\n        showImage,\n        auths,\n        tableLinkCardRef,\n        fixedSpan,\n        placeholderImage,\n        handleImageError,\n      };\n    },\n  };\n</script>\n\n<style scoped lang=\"less\">\n  .table-link-card {\n    box-sizing: border-box;\n    position: relative;\n    width: 100%;\n    .card-button {\n      margin-bottom: 10px !important;\n    }\n    .card-item {\n      width: calc(100% - 10px);\n      display: inline-flex;\n      flex-direction: row;\n      margin: 0px 10px 10px 0px;\n      position: relative;\n      border-radius: 3px;\n      background-color: rgb(255, 255, 255);\n      box-shadow:\n        rgb(0 0 0 / 12%) 0px 1px 4px 0px,\n        rgb(0 0 0 / 12%) 0px 0px 2px 0px;\n      cursor: pointer;\n      &:hover {\n        /*  box-shadow: rgb(0 0 0 / 12%) 0px 4px 12px 0px, rgb(0 0 0 / 12%) 0px 0px 2px 0px;*/\n        .card-item-left {\n          .card-delete {\n            display: inline-block;\n          }\n        }\n      }\n\n      &.disabled-chunk {\n        background: none;\n        box-shadow: none;\n      }\n\n      .card-item-image {\n        width: 100px;\n        padding-right: 8px;\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        overflow: hidden;\n        img {\n          width: 100%;\n        }\n      }\n\n      .card-item-left {\n        width: 100%;\n        display: inline-block;\n        &.show-right-image {\n          width: calc(100% - 100px);\n        }\n        .card-delete {\n          position: absolute;\n          top: -8px;\n          right: -8px;\n          font-size: 16px;\n          color: #757575;\n          line-height: 1em;\n          overflow: hidden;\n          display: none;\n        }\n\n        .card-inner {\n          flex: 1 1 0%;\n          padding: 12px 16px;\n          overflow: hidden;\n          padding-bottom: 10px;\n\n          .card-main-content {\n            overflow: hidden;\n            text-overflow: ellipsis;\n            vertical-align: top;\n            white-space: nowrap;\n            margin-bottom: 8px;\n            font-weight: 500;\n            font-size: 14px;\n            line-height: 20px;\n            color: rgb(51, 51, 51);\n          }\n\n          .other-content {\n            .text {\n              font-size: 12px !important;\n              display: inline-block;\n              width: 80%;\n            }\n            .label {\n              max-width: 160px;\n              color: rgb(158, 158, 158);\n              padding-right: 0.7em;\n              display: inline-block;\n            }\n            .ellipsis {\n              overflow: hidden;\n              height: 22px;\n              line-height: 22px;\n              text-overflow: ellipsis;\n              /*   vertical-align: top;*/\n              white-space: nowrap;\n            }\n          }\n        }\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JLinkTableCard/components/LinkTableListModal.vue",
    "content": "<template>\n  <BasicModal\n    @register=\"registerModal\"\n    :width=\"popModalFixedWidth\"\n    :dialogStyle=\"{ top: '70px' }\"\n    :bodyStyle=\"popBodyStyle\"\n    :title=\"modalTitle\"\n    wrapClassName=\"jeecg-online-pop-list-modal\"\n  >\n    <template #footer>\n      <a-button key=\"back\" @click=\"handleCancel\">关闭</a-button>\n      <a-button :disabled=\"submitDisabled\" key=\"submit\" type=\"primary\" @click=\"handleSubmit\" :loading=\"submitLoading\">确定</a-button>\n    </template>\n\n    <BasicTable ref=\"tableRef\" @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <template #tableTitle>\n        <a-input-search v-model:value=\"searchText\" @search=\"onSearch\" placeholder=\"请输入关键词，按回车搜索\" style=\"width: 240px\" />\n      </template>\n\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\"> </TableAction>\n      </template>\n\n      <template #fileSlot=\"{ text }\">\n        <span v-if=\"!text\" style=\"font-size: 12px; font-style: italic\">无文件</span>\n        <a-button v-else :ghost=\"true\" type=\"primary\" preIcon=\"ant-design:download\" size=\"small\" @click=\"downloadRowFile(text)\"> 下载 </a-button>\n      </template>\n\n      <template #imgSlot=\"{ text }\">\n        <span v-if=\"!text\" style=\"font-size: 12px; font-style: italic\">无图片</span>\n        <img v-else :src=\"getImgView(text)\" alt=\"图片不存在\" class=\"online-cell-image\" @click=\"viewOnlineCellImage(text)\" />\n      </template>\n\n      <template #htmlSlot=\"{ text }\">\n        <div v-html=\"text\"></div>\n      </template>\n\n      <template #pcaSlot=\"{ text }\">\n        <div :title=\"getPcaText(text)\">{{ getPcaText(text) }}</div>\n      </template>\n\n      <template #dateSlot=\"{ text, column }\">\n        <span>{{ getFormatDate(text, column) }}</span>\n      </template>\n    </BasicTable>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, watch, ref, toRaw, computed, nextTick } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { defHttp } from '/@/utils/http/axios';\n  import { useTableColumns } from '../hooks/useTableColumns';\n  import { createAsyncComponent } from '@/utils/factory/createAsyncComponent';\n  import { useFixedHeightModal } from '../hooks/useLinkTable';\n\n  export default defineComponent({\n    name: 'LinkTableListModal',\n    props: {\n      /**可以是表名 可以是ID*/\n      id: {\n        type: String,\n        default: '',\n      },\n      multi: {\n        type: Boolean,\n        default: false,\n      },\n      addAuth: {\n        type: Boolean,\n        default: true,\n      },\n    },\n    components: {\n      BasicModal,\n      BasicTable: createAsyncComponent(() => import('/@/components/Table/src/BasicTable.vue'), { loading: true, delay: 1000 }),\n      TableAction: createAsyncComponent(() => import('/@/components/Table/src/components/TableAction.vue'), { loading: true, delay: 1000 }),\n    },\n    emits: ['success', 'register'],\n    setup(props, { emit }) {\n      const { createMessage: $message } = useMessage();\n      const tableRef = ref(null);\n      // 弹窗高度控制\n      const { popModalFixedWidth, resetBodyStyle, popBodyStyle } = useFixedHeightModal();\n      const searchText = ref('');\n      const modalWidth = ref(800);\n      //useModalInner\n      const [registerModal, { closeModal }] = useModalInner((data) => {\n        searchText.value = '';\n        selectedRowKeys.value = data.selectedRowKeys;\n        selectedRows.value = data.selectedRows;\n        setTimeout(async () => {\n          await setPagination({ current: 1 });\n          await reload(); // 等待表格加载\n          resetBodyStyle();\n        }, 100);\n      });\n\n      function handleCancel() {\n        closeModal();\n      }\n      const submitDisabled = computed(() => {\n        const arr = selectedRowKeys.value;\n        if (arr && arr.length > 0) {\n          return false;\n        }\n        return true;\n      });\n      const submitLoading = ref(false);\n      function handleSubmit() {\n        submitLoading.value = true;\n        let arr = toRaw(selectedRows.value);\n        if (arr && arr.length > 0) {\n          emit('success', arr);\n          closeModal();\n        }\n        setTimeout(() => {\n          submitLoading.value = false;\n        }, 200);\n      }\n\n      //---------------------列表------------------------\n      function queryTableData(params) {\n        const url = '/online/cgform/api/getData/' + props.id;\n        return defHttp.get({ url, params });\n      }\n\n      function list(params) {\n        params['column'] = 'id';\n        return new Promise(async (resolve, _reject) => {\n          const aa = await queryTableData(params);\n          resolve(aa);\n        });\n      }\n\n      const onlineTableContext = {\n        isPopList: true,\n        reloadTable() {\n          console.log('reloadTable');\n        },\n        isTree() {\n          return false;\n        },\n      };\n      const extConfigJson = ref<any>({});\n\n      // 处理 BasicTable 的配置\n      const { columns, downloadRowFile, getImgView, getPcaText, getFormatDate, handleColumnResult, hrefComponent, viewOnlineCellImage } =\n        useTableColumns(onlineTableContext, extConfigJson);\n\n      /**\n       * 查询table列信息 及其他配置\n       */\n      function getColumnList() {\n        const url = '/online/cgform/api/getColumns/' + props.id;\n        return new Promise((resolve, reject) => {\n          defHttp.get({ url }, { isTransformResponse: false }).then((res) => {\n            if (res.success) {\n              resolve(res.result);\n            } else {\n              $message.warning(res.message);\n              reject();\n            }\n          });\n        });\n      }\n\n      const modalTitle = ref('');\n      watch(\n        () => props.id,\n        async () => {\n          let columnResult: any = await getColumnList();\n          handleColumnResult(columnResult);\n          modalTitle.value = columnResult.description;\n        },\n        { immediate: true }\n      );\n\n      const { tableContext } = useListPage({\n        designScope: 'process-design',\n        pagination: true,\n        tableProps: {\n          title: '',\n          api: list,\n          clickToRowSelect: true,\n          columns: columns,\n          showTableSetting: false,\n          immediate: false,\n          //showIndexColumn: true,\n          canResize: false,\n          showActionColumn: false,\n          actionColumn: {\n            dataIndex: 'action',\n            slots: { customRender: 'action' },\n          },\n          useSearchForm: false,\n          beforeFetch: (params) => {\n            return addQueryParams(params);\n          },\n        },\n      });\n      const [registerTable, { reload, setPagination }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext;\n      watch(\n        () => props.multi,\n        (val) => {\n          if (val == true) {\n            rowSelection.type = 'checkbox';\n          } else {\n            rowSelection.type = 'radio';\n          }\n        },\n        { immediate: true }\n      );\n\n      /**\n       * 操作栏\n       */\n      function getTableAction(record) {\n        return [\n          {\n            label: '编辑',\n            onClick: handleUpdate.bind(null, record),\n          },\n        ];\n      }\n\n      function handleUpdate(record) {\n        console.log('handleUpdate', record);\n      }\n\n      function onSearch() {\n        reload();\n      }\n      const eqConditonTypes = ['int', 'double', 'Date', 'Datetime', 'BigDecimal'];\n      function addQueryParams(params) {\n        let text = searchText.value;\n        if (!text) {\n          params['superQueryMatchType'] = 'or';\n          params['superQueryParams'] = '';\n          return params;\n        }\n        let arr = columns.value;\n        let conditions: any[] = [];\n        if (arr && arr.length > 0) {\n          for (let item of arr) {\n            if (item.dbType) {\n              if (item.dbType == 'string') {\n                conditions.push({ field: item.dataIndex, type: item.dbType.toLowerCase(), rule: 'like', val: text });\n              } else if (item.dbType == 'Date') {\n                if (text.length == '2020-10-10'.length) {\n                  conditions.push({ field: item.dataIndex, type: item.dbType.toLowerCase(), rule: 'eq', val: text });\n                }\n              } else if (item.dbType == 'Datetime') {\n                if (text.length == '2020-10-10 10:10:10'.length) {\n                  conditions.push({ field: item.dataIndex, type: item.dbType.toLowerCase(), rule: 'eq', val: text });\n                }\n              } else if (eqConditonTypes.indexOf(item.dbType)) {\n                conditions.push({ field: item.dataIndex, type: item.dbType.toLowerCase(), rule: 'eq', val: text });\n              } else {\n                //text blob不做处理\n              }\n            }\n          }\n        }\n        params['superQueryMatchType'] = 'or';\n        params['superQueryParams'] = encodeURI(JSON.stringify(conditions));\n        return params;\n      }\n\n      // modal数据新增完成 直接关闭list，将新增的数据带回表单\n      function handleDataSave(data) {\n        console.log('handleDateSave', data);\n        // 代码逻辑说明: 【issues/8163】关联记录新增丢失\n        let arr = [data, ...selectedRows.value];\n        emit('success', arr);\n        closeModal();\n        //reload();\n      }\n\n      return {\n        registerModal,\n        modalWidth,\n        handleCancel,\n        submitDisabled,\n        submitLoading,\n        handleSubmit,\n\n        registerTable,\n        getTableAction,\n        searchText,\n        onSearch,\n\n        downloadRowFile,\n        getImgView,\n        getPcaText,\n        getFormatDate,\n        hrefComponent,\n        viewOnlineCellImage,\n        rowSelection,\n        modalTitle,\n\n        reload,\n\n        popModalFixedWidth,\n        popBodyStyle,\n        handleDataSave,\n\n        tableRef,\n      };\n    },\n  });\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JLinkTableCard/hooks/useLinkTable.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { ref, watchEffect, computed, reactive } from 'vue';\nimport { pick } from 'lodash-es';\nimport { filterMultiDictText } from '/@/utils/dict/JDictSelectUtil';\nimport { getFileAccessHttpUrl } from '/@/utils/common/compUtils';\n\nfunction queryTableData(tableName, params) {\n  const url = '/online/cgform/api/getData/' + tableName;\n  return defHttp.get({ url, params });\n}\n\nfunction queryTableColumns(tableName, params) {\n  const url = '/online/cgform/api/getColumns/' + tableName;\n  return defHttp.get({ url, params });\n}\n\nexport function useLinkTable(props) {\n  //TODO 目前只支持查询第一页的数据，可以输入关键字搜索\n  const pageNo = ref('1');\n  // 查询列\n  const baseParam = ref<any>({});\n  // 搜素条件\n  const searchParam = ref<any>({});\n  // 第一个文本列\n  const mainContentField = ref('');\n  //权限数据\n  const auths = reactive({\n    add: true,\n    update: true,\n  });\n\n  //显示列\n  const textFieldArray = computed(() => {\n    if (props.textField) {\n      return props.textField.split(',');\n    }\n    return [];\n  });\n  const otherColumns = ref<any[]>([]);\n  // 展示的列 配置的很多列，但是只展示三行\n  const realShowColumns = computed(() => {\n    const columns = otherColumns.value;\n    if (props.multi == true) {\n      return columns.slice(0, 3);\n    } else {\n      return columns.slice(0, 6);\n    }\n  });\n\n  watchEffect(async () => {\n    const table = props.tableName;\n    if (table) {\n      const valueField = props.valueField || '';\n      const textField = props.textField || '';\n      const arr: any[] = [];\n      if (valueField) {\n        arr.push(valueField);\n      }\n      if (textField) {\n        const temp = textField.split(',');\n        mainContentField.value = temp[0];\n        for (const field of temp) {\n          arr.push(field);\n        }\n      }\n      const imageField = props.imageField || '';\n      if (imageField) {\n        arr.push(imageField);\n      }\n      baseParam.value = {\n        linkTableSelectFields: arr.join(','),\n      };\n      await resetTableColumns();\n      await reloadTableLinkOptions();\n    }\n  });\n\n  const otherFields = computed(() => {\n    const textField = props.textField || '';\n    const others: any[] = [];\n    let labelField = '';\n    if (textField) {\n      const temp = textField.split(',');\n      labelField = temp[0];\n      for (let i = 0; i < temp.length; i++) {\n        if (i > 0) {\n          others.push(temp[i]);\n        }\n      }\n    }\n    return {\n      others,\n      labelField,\n    };\n  });\n\n  // 选项\n  const selectOptions = ref<any[]>([]);\n  const tableColumns = ref<any[]>([]);\n  const dictOptions = ref<any>({});\n\n  async function resetTableColumns() {\n    const params = baseParam.value;\n    const data = await queryTableColumns(props.tableName, params);\n    tableColumns.value = data.columns;\n    if (data.columns) {\n      const imageField = props.imageField;\n      const arr = data.columns.filter((c) => c.dataIndex != mainContentField.value && c.dataIndex != imageField);\n      otherColumns.value = arr;\n    }\n    dictOptions.value = data.dictOptions;\n    // 权限数据\n    console.log('隐藏的按钮', data.hideColumns);\n    if (data.hideColumns) {\n      const hideCols = data.hideColumns;\n      if (hideCols.indexOf('add') >= 0) {\n        auths.add = false;\n      } else {\n        auths.add = true;\n      }\n      if (hideCols.indexOf('update') >= 0) {\n        auths.update = false;\n      } else {\n        auths.update = true;\n      }\n    }\n  }\n\n  async function reloadTableLinkOptions() {\n    const params = getLoadDataParams();\n    const data = await queryTableData(props.tableName, params);\n    const records = data.records;\n    //tableTitle.value = data.head.tableTxt;\n    const dataList: any[] = [];\n    const { others, labelField } = otherFields.value;\n    const imageField = props.imageField;\n    if (records && records.length > 0) {\n      for (const rd of records) {\n        const temp = { ...rd };\n        transData(temp);\n        const result = Object.assign({}, pick(temp, others), { id: temp.id, label: temp[labelField], value: temp[props.valueField] });\n        if (imageField) {\n          result[imageField] = temp[imageField];\n        }\n        dataList.push(result);\n      }\n    }\n    //添加一个空对象 为add操作占位\n    // 代码逻辑说明: 【TV360X-1095】高级查询关联记录去掉编辑按钮及去掉记录按钮\n    props.editBtnShow && dataList.push({});\n    selectOptions.value = dataList;\n  }\n\n  /**\n   * 数据简单翻译-字典\n   * @param data\n   */\n  function transData(data) {\n    const columns = tableColumns.value;\n    const dictInfo = dictOptions.value;\n    for (const c of columns) {\n      const { dataIndex, customRender } = c;\n      if (data[dataIndex] || data[dataIndex] === 0) {\n        if (customRender && customRender == dataIndex) {\n          //这样的就是 字典数据了 可以直接翻译\n          if (dictInfo[customRender]) {\n            data[dataIndex] = filterMultiDictText(dictInfo[customRender], data[dataIndex]);\n            continue;\n          }\n        }\n      }\n      // 兼容后台翻译字段\n      const dictText = data[dataIndex + '_dictText'];\n      if (dictText) {\n        data[dataIndex] = dictText;\n      }\n    }\n  }\n\n  //获取加载数据的查询条件\n  function getLoadDataParams() {\n    const params = Object.assign({ pageSize: 100, pageNo: pageNo.value }, baseParam.value, searchParam.value);\n    return params;\n  }\n\n  //设置查询条件\n  function addQueryParams(text) {\n    if (!text) {\n      searchParam.value = {};\n    } else {\n      const arr = textFieldArray.value;\n      const params: any[] = [];\n      const fields: any[] = [];\n      for (let i = 0; i < arr.length; i++) {\n        if (i <= 1) {\n          fields.push(arr[i]);\n          params.push({ field: arr[i], rule: 'like', val: text });\n        }\n      }\n      // params[arr[i]] = `*${text}*`\n      // params['selectConditionFields'] = fields.join(',')\n      // searchParam.value = params;\n      params['superQueryMatchType'] = 'or';\n      params['superQueryParams'] = encodeURI(JSON.stringify(params));\n      searchParam.value = params;\n    }\n  }\n\n  async function loadOne(value) {\n    if (!value) {\n      return [];\n    }\n    let valueFieldName = props.valueField;\n    let params = {\n      ...baseParam.value,\n      pageSize: 100,\n      pageNo: pageNo.value,\n    };\n    params['superQueryMatchType'] = 'and';\n    let valueCondition = [{ field: valueFieldName, rule: 'in', val: value }];\n    params['superQueryParams'] = encodeURI(JSON.stringify(valueCondition));\n    const data = await queryTableData(props.tableName, params);\n    let records = data.records;\n    //tableTitle.value = data.head.tableTxt;\n    let dataList: any[] = [];\n    if (records && records.length > 0) {\n      for (let item of records) {\n        let temp = { ...item };\n        transData(temp);\n        dataList.push(temp);\n      }\n    }\n    return dataList;\n  }\n\n  /**\n   * true:数据一致；false:数据不一致\n   * @param arr\n   * @param value\n   */\n  function compareData(arr, value) {\n    if (!arr || arr.length == 0) {\n      return false;\n    }\n    const valueArray = value.split(',');\n    if (valueArray.length != arr.length) {\n      return false;\n    }\n    let flag = true;\n    for (const item of arr) {\n      const temp = item[props.valueField];\n      if (valueArray.indexOf(temp) < 0) {\n        flag = false;\n      }\n    }\n    return flag;\n  }\n\n  function formatData(formData) {\n    Object.keys(formData).map((k) => {\n      if (formData[k] instanceof Array) {\n        formData[k] = formData[k].join(',');\n      }\n    });\n  }\n\n  function initFormData(formData, linkFieldArray, record) {\n    if (!record) {\n      record = {};\n    }\n    if (linkFieldArray && linkFieldArray.length > 0) {\n      for (const str of linkFieldArray) {\n        const arr = str.split(',');\n        //[\"表单字段,表字典字段\"]\n        const field = arr[0];\n        const dictField = arr[1];\n        if (!formData[field]) {\n          const value = record[dictField] || '';\n          formData[field] = [value];\n        } else {\n          formData[field].push(record[dictField]);\n        }\n      }\n    }\n  }\n\n  // 获取图片地址\n  function getImageSrc(item) {\n    if (props.imageField) {\n      let url = item[props.imageField];\n      // 代码逻辑说明: 【TV360X-38】关联记录空间，被关联数据优多个图片时，封面图片不展示\n      if (typeof url === 'string') {\n        // 有多张图时默认取第一张\n        url = url.split(',')[0];\n      }\n      return getFileAccessHttpUrl(url);\n    }\n    return '';\n  }\n  const showImage = computed(() => {\n    if (props.imageField) {\n      return true;\n    } else {\n      return false;\n    }\n  });\n\n  return {\n    pageNo,\n    otherColumns,\n    realShowColumns,\n    selectOptions,\n    reloadTableLinkOptions,\n    textFieldArray,\n    addQueryParams,\n    tableColumns,\n    transData,\n    mainContentField,\n    loadOne,\n    compareData,\n    formatData,\n    initFormData,\n    getImageSrc,\n    showImage,\n    auths,\n  };\n}\n\n/**\n * 使用固定高度的modal\n */\nexport function useFixedHeightModal() {\n  const minWidth = 800;\n  const popModalFixedWidth = ref(800);\n  let tempWidth = window.innerWidth - 300;\n  if (tempWidth < minWidth) {\n    tempWidth = minWidth;\n  }\n  popModalFixedWidth.value = tempWidth;\n\n  // 弹窗高度控制\n  const popBodyStyle = ref({});\n  function resetBodyStyle() {\n    const height = window.innerHeight - 210;\n    popBodyStyle.value = {\n      height: height + 'px',\n      overflowY: 'auto',\n    };\n  }\n\n  return {\n    popModalFixedWidth,\n    popBodyStyle,\n    resetBodyStyle,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JLinkTableCard/hooks/useTableColumns.ts",
    "content": "import type { Ref } from 'vue';\nimport { HrefSlots, OnlineColumn } from '/@/components/jeecg/OnLine/types/onlineConfig';\nimport { filterMultiDictText } from '/@/utils/dict/JDictSelectUtil';\nimport { computed, defineAsyncComponent, h, reactive, ref, toRaw, unref, watch, markRaw } from 'vue';\nimport { useRouter } from 'vue-router';\nimport { getFileAccessHttpUrl } from '/@/utils/common/compUtils';\nimport { getAreaTextByCode } from '/@/components/Form/src/utils/Area';\nimport { createImgPreview } from '/@/components/Preview/index';\nimport { importViewsFile, _eval } from '/@/utils';\nimport { useModal } from '/@/components/Modal';\nimport { getToken } from '/@/utils/auth';\nimport { downloadFile } from '/@/api/common/api';\nimport { getWeekMonthQuarterYear, split } from '/@/utils';\n/**\n * 获取实际列表需要的column配置\n * @param onlineTableContext 从数据库中查出来的数据\n * @param extConfigJson 扩展配置JSON\n */\nexport function useTableColumns(onlineTableContext, extConfigJson: Ref<any | undefined>) {\n  // 获取路由器对象 href跳转用到\n  let router = useRouter();\n\n  // 列信息\n  const columns = ref<Array<OnlineColumn>>([]);\n  // 是否有bpm_status\n  //const hasBpmStatus = ref<boolean>(false)\n  // 字典信息\n  const dictOptionInfo = ref<any>({});\n  //已选择的值\n  const selectedKeys = ref<any[]>([]);\n  //选择的行记录\n  //const selectRows = ref<Array<any>>([]);\n  // 选择列配置 --computed有问题\n  const rowSelection = ref<any>(null);\n  // 是否有滚动条\n  let enableScrollBar = ref(true);\n  // table属性scroll\n  let tableScroll = computed(() => {\n    if (enableScrollBar.value == true) {\n      return undefined;\n    } else {\n      // X轴没有滚动条\n      return { x: false };\n    }\n  });\n\n  //用于 online列表的 某列的点击弹窗事件-弹窗显示其他表单\n  const [registerOnlineHrefModal, { openModal: openOnlineHrefModal }] = useModal();\n  const hrefMainTableId = ref('')\n  // 用于 online表单中 弹出别的表单\n  const [registerPopModal, { openModal: openPopModal }] = useModal();\n  const popTableId = ref('')\n\n  // 对查询列信息的请求结果 处理方法\n  function handleColumnResult(result, type = 'checkbox') {\n    // 字典设置\n    dictOptionInfo.value = result.dictOptions;\n    // rowSelection设置\n    if (result.checkboxFlag == 'Y') {\n      rowSelection.value = {\n        selectedRowKeys: selectedKeys,\n        onChange: onSelectChange,\n        type,\n      };\n    } else {\n      rowSelection.value = null;\n    }\n    // 是否允许滚动条\n    enableScrollBar.value = result.scrollFlag == 1;\n\n    let dataColumns = result.columns;\n    dataColumns.forEach((column) => {\n      // update-begin--author:liaozhiyang---date:20230818---for：【QQYUN-4161】列支持固定功能\n      if (column.fieldExtendJson) {\n        const json = JSON.parse(column.fieldExtendJson);\n        if (!!json.isFixed) {\n          column.fixed = 'left';\n        }\n      }\n      // update-end--author:liaozhiyang---date:20230818---for：【QQYUN-4161】列支持固定功能\n      // update-begin--author:liaozhiyang---date:20240517---for：【TV360X-129】增加富文本控件配置href跳转\n      if (column.hrefSlotName && column.scopedSlots) {\n        const obj = result.fieldHrefSlots?.find((item) => item.slotName === column.hrefSlotName);\n        if (obj) {\n          column.fieldHref = obj;\n        }\n      }\n      // update-end--author:liaozhiyang---date:20240517---for：【TV360X-129】增加富文本控件配置href跳转\n      Object.keys(column).map((key) => {\n        // 删掉空值的字段（不删除 空字符串('') 或 数字 0 ）\n        if (column[key] == null) {\n          delete column[key];\n        }\n      });\n    });\n\n    // href 跳转\n    let fieldHrefSlots: HrefSlots[] = result.fieldHrefSlots;\n    const fieldHrefSlotKeysMap = {};\n    fieldHrefSlots.forEach((item) => (fieldHrefSlotKeysMap[item.slotName] = item));\n\n    let tableColumns: OnlineColumn[] = [];\n    // 处理列中的 href 跳转和 dict 字典，使两者可以兼容存在\n    tableColumns = handleColumnHrefAndDict(dataColumns, fieldHrefSlotKeysMap);\n    // 是否有 bpm_status字段 如果有，列表操作按钮需要增加提交流程按钮\n    bpmStatusFilter(tableColumns);\n\n    console.log('-----列表列配置----', tableColumns);\n    // 如果是树列表 需要设置第一列字段 及 第一列align\n    if (onlineTableContext.isTree() === true) {\n      // 找到第一列的配置\n      let firstField = result.textField;\n      let index = -1;\n      for (let i = 0; i < tableColumns.length; i++) {\n        if (tableColumns[i].dataIndex == firstField) {\n          index = i;\n          break;\n        }\n      }\n      if (index > 0) {\n        //如果是0或是-1不需要处理\n        let deleteColumns = tableColumns.splice(index, 1);\n        tableColumns.unshift(deleteColumns[0]);\n      }\n      //第一列居左\n      if (tableColumns.length > 0) {\n        tableColumns[0].align = 'left';\n      }\n    }\n    columns.value = tableColumns;\n    // 列发生了变化，需要重新渲染表格\n    onlineTableContext.reloadTable();\n  }\n\n  /**\n   * 表格选择事件 [expose]\n   * @param selectedRowKeys\n   * @param selectRow\n   */\n  function onSelectChange(selectedRowKeys, selectedRows) {\n    selectedKeys.value = selectedRowKeys;\n    onlineTableContext['selectedRows'] = toRaw(selectedRows);\n    onlineTableContext['selectedRowKeys'] = toRaw(selectedRowKeys);\n  }\n\n  /**\n   * 处理列的href和字典翻译\n   */\n  function handleColumnHrefAndDict(columns: OnlineColumn[], fieldHrefSlotKeysMap: {}): OnlineColumn[] {\n    for (let column of columns) {\n      let { customRender, hrefSlotName, fieldType } = column;\n      // online 报表中类型配置为日期（yyyy-MM-dd ），但是实际展示为日期时间格式(yyyy-MM-dd HH:mm:ss) issues/3042\n      if (fieldType == 'date' || fieldType == 'Date') {\n        column.customRender = ({ text }) => {\n          if (!text) {\n            return '';\n          }\n          if (text.length > 10) {\n            return text.substring(0, 10);\n          }\n          return text;\n        };\n      } else if (fieldType == 'link_table') {\n        // 关联记录列表展示\n        // update-begin--author:liaozhiyang---date:20250318---for：【issues/7930】表格列表中支持关联记录配置是否只读\n        const fieldExtendJson = column.fieldExtendJson ?? '{}';\n        const json = JSON.parse(fieldExtendJson);\n        // update-end--author:liaozhiyang---date:20250318---for：【issues/7930】表格列表中支持关联记录配置是否只读\n        column.customRender = ({ text, record }) => {\n          if (!text) {\n            return '';\n          }\n          if(onlineTableContext.isPopList===true){\n            // 如果是弹窗的列表，关联记录的列只支持数据翻译，不需要跳转逻辑\n            return record[column.dataIndex+\"_dictText\"]\n          }else{\n            let tempIdArray = (text+'').split(',');\n            //update-begin-author:taoyan date:2023-2-15 for: QQYUN-4286【online表单】主子表开启联合查询 功能测试报错打不开\n            let tempLabelArray = [];\n            if(record[column.dataIndex+\"_dictText\"]){\n              tempLabelArray = record[column.dataIndex+\"_dictText\"].split(',');\n            }\n            //update-end-author:taoyan date:2023-2-15 for: QQYUN-4286【online表单】主子表开启联合查询 功能测试报错打不开\n            let renderResult:any = []\n            if(renderResult.length==0){\n              return ''\n            }\n            //如果需要显示全，但是会换行：display: flex;width: 100%;flex-wrap: wrap;flex-direction: row;\n            return h('div',{style:{'overflow':'hidden'}}, renderResult);\n          }\n        };\n      } else if (fieldType === 'popup_dict') {\n        // update-begin--author:liaozhiyang---date:20240402---for：【QQYUN-8833】JPopupDict的列表翻译\n        column.customRender = ({ text, record }) => {\n          const dict = record[column.dataIndex + '_dictText'];\n          if (dict != undefined) {\n            return record[column.dataIndex + '_dictText'];\n          }\n          return text;\n        };\n        // update-end--author:liaozhiyang---date:20240402---for：【QQYUN-8833】JPopupDict的列表翻译\n      } else {\n        if (!hrefSlotName && column.scopedSlots && column.scopedSlots.customRender) {\n          //【Online报表】字典和href互斥 这里通过fieldHrefSlotKeysMap 先找到是href的列\n          if (fieldHrefSlotKeysMap.hasOwnProperty(column.scopedSlots.customRender)) {\n            hrefSlotName = column.scopedSlots.customRender;\n          }\n        }\n        // 如果 customRender 有值则代表使用了字典\n        // 如果 hrefSlotName 有值则代表使用了href跳转\n        // 两者可以兼容。兼容的具体思路为：先获取到字典替换的值，再添加href链接跳转\n        if (customRender || hrefSlotName) {\n          let dictCode = customRender as string;\n          let replaceFlag = '_replace_text_';\n          // 自定义渲染函数的列 需要手动配置ellipsis\n          column.ellipsis = true;\n          column.customRender = ({ text, record }) => {\n            let value = text;\n            // 如果 dictCode 有值，就进行字典转换\n            if (dictCode) {\n              if (dictCode.startsWith(replaceFlag)) {\n                let textFieldName = dictCode.replace(replaceFlag, '');\n                value = record[textFieldName];\n              } else {\n                value = filterMultiDictText(unref(dictOptionInfo)[dictCode], text + '');\n              }\n            }\n            // 扩展参数设置列的内容长度\n            if (column.showLength) {\n              if (value && value.length > column.showLength) {\n                value = value.substr(0, column.showLength) + '...';\n              }\n            }\n            // 如果 hrefSlotName 有值，就生成一个 a 标签，包裹住字典替换后（或原生）的值\n            if (hrefSlotName) {\n              let field = fieldHrefSlotKeysMap[hrefSlotName];\n              if (field) {\n                return h(\n                  'a',\n                  {\n                    onClick: () => handleClickFieldHref(field, record),\n                  },\n                  value\n                );\n              }\n            }\n            return value;\n          };\n        }\n\n        //  老版本叫scopedSlots 新版叫slots\n        if (column.scopedSlots) {\n          // slot的列 需要手动配置ellipsis\n          column.ellipsis = true;\n          let slots = column.scopedSlots;\n          column['slots'] = slots;\n          delete column.scopedSlots;\n        }\n      }\n    }\n    return columns;\n  }\n\n  /**\n   * href 点击事件\n   * @param field\n   * @param record\n   */\n  function handleClickFieldHref(field, record) {\n    let href = field.href;\n    let urlPattern = /(ht|f)tp(s?)\\:\\/\\/[0-9a-zA-Z]([-.\\w]*[0-9a-zA-Z])*(:(0-9)*)*(\\/?)([a-zA-Z0-9\\-\\.\\?\\,\\'\\/\\\\\\+&amp;%\\$#_]*)?/;\n    let compPattern = /\\.vue(\\?.*)?$/;\n    let jsPattern = /{{([^}]+)}}/g; // {{ xxx }}\n    if (typeof href === 'string') {\n      if(href.startsWith('ONLINE:')){\n        // ONLINE:tableId:fieldName\n        let arr = href.split(':')\n        hrefMainTableId.value = arr[1];\n        let fieldName = arr[2];\n        openOnlineHrefModal(true, {\n          isUpdate: true,\n          disableSubmit: true,\n          hideSub: true,\n          record:{id: record[fieldName]},\n        })\n      }else{\n        href = href.trim().replace(/\\${([^}]+)?}/g, (_s1, s2) => record[s2]);\n        // 执行 {{...}} JS增强语句\n        if (jsPattern.test(href)) {\n          href = href.replace(jsPattern, function (text, s0) {\n            try {\n              // 支持 {{ ACCESS_TOKEN }} 占位符\n              if (s0.trim() === 'ACCESS_TOKEN') {\n                return getToken()\n              }\n\n              // update-begin--author:liaozhiyang---date:20230904---for：【QQYUN-6390】eval替换成new Function，解决build警告\n              return _eval(s0);\n              // update-end--author:liaozhiyang---date:20230904---for：【QQYUN-6390】eval替换成new Function，解决build警告\n            } catch (e) {\n              console.error(e);\n              return text;\n            }\n          });\n        }\n        if (urlPattern.test(href)) {\n          window.open(href, '_blank');\n        } else if (compPattern.test(href)) {\n          // 处理弹框\n          openHrefCompModal(href);\n        } else {\n          router.push(href);\n        }\n      }\n    }\n  }\n\n  // 样式\n  const dialogStyle = {\n    top: 0,\n    left: 0,\n    height: '100%',\n    margin: 0,\n    padding: 0,\n  };\n\n  // update-begin--author:liaozhiyang---date:20231218---for：【QQYUN-6366】升级到antd4.x\n  // 弹窗属性配置\n  const hrefComponent = reactive({\n    model: {\n      title: '',\n      okText: '关闭',\n      width: '100%',\n      open: false,\n      destroyOnClose: true,\n      style: dialogStyle,\n      // dialogStyle: dialogStyle,\n      bodyStyle: { padding: '8px', height: 'calc(100vh - 108px)', overflow: 'auto', overflowX: 'hidden' },\n      // 隐藏掉取消按钮\n      cancelButtonProps: { style: { display: 'none' } },\n    },\n    on: {\n      ok: () => (hrefComponent.model.open = false),\n      cancel: () => (hrefComponent.model.open = false),\n    },\n    is: <any>null,\n    params: {},\n  });\n  // update-end--author:liaozhiyang---date:20231218---for：【QQYUN-6366】升级到antd4.x\n\n  // 超链点击事件--> 打开一个modal窗口\n  function openHrefCompModal(href) {\n    // 解析 href 参数\n    let index = href.indexOf('?');\n    let path = href;\n    if (index !== -1) {\n      path = href.substring(0, index);\n      let paramString = href.substring(index + 1, href.length);\n      let paramArray = paramString.split('&');\n      let params = {};\n      paramArray.forEach((paramObject) => {\n        let paramItem = paramObject.split('=');\n        params[paramItem[0]] = paramItem[1];\n      });\n      hrefComponent.params = params;\n    } else {\n      hrefComponent.params = {};\n    }\n    // update-begin--author:liaozhiyang---date:20231218---for：【QQYUN-6366】升级到antd4.x\n    hrefComponent.model.open = true;\n    // update-end--author:liaozhiyang---date:20231218---for：【QQYUN-6366】升级到antd4.x\n    hrefComponent.model.title = '操作';\n    hrefComponent.is = markRaw(defineAsyncComponent(() => importViewsFile(path)));\n  }\n\n  //如果是树列表 操作列只能右侧固定\n  let fixedAction:any = 'left';\n  if(onlineTableContext.isTree()){\n    fixedAction = 'right'\n  }\n  const actionColumn = reactive<OnlineColumn>({\n    title: '操作',\n    dataIndex: 'action',\n    slots: { customRender: 'action' },\n    fixed: fixedAction,\n    align: 'center',\n    width: 150,\n  });\n\n  // 监听扩展参数的固定列配置，动态改变操作列的固定方式\n  watch(() => extConfigJson?.value, () => {\n    if (extConfigJson?.value?.tableFixedAction === 1) {\n      actionColumn.fixed = extConfigJson?.value?.tableFixedActionType || 'right';\n      // 如果是树列表 操作列只能右侧固定\n      if(onlineTableContext.isTree()){\n        actionColumn.fixed = 'right'\n      }\n    }\n  });\n\n  // 流程按钮状态\n  function bpmStatusFilter(tableColumns: OnlineColumn[]): boolean {\n    let flag = false;\n    for (let i = 0; i < tableColumns.length; i++) {\n      let item = tableColumns[i];\n      let fieldName = item.dataIndex;\n      if (fieldName!.toLowerCase() == 'bpm_status') {\n        flag = true;\n        break;\n      }\n    }\n    onlineTableContext['hasBpmStatus'] = flag;\n    return flag;\n  }\n\n  /**\n   * 文件\n   * @param text\n   */\n  function downloadRowFile(text, record, column, id) {\n    if (!text) {\n      return;\n    }\n    // update-begin--author:liaozhiyang---date:20240124---for：【QQYUN-8020】online 表单有多个文件走下载接口\n    if (text.indexOf(',') > 0) {\n      downloadFile(`/online/cgform/field/download/${id}/${record.id}/${column.dataIndex}`, `文件_${record.id}.zip`);\n    } else {\n      const url = getFileAccessHttpUrl(text);\n      window.open(url);\n    }\n    // update-end--author:liaozhiyang---date:20240124---for：【QQYUN-8020】online 表单有多个文件走下载接口\n  }\n\n  /**\n   * 图片\n   * @param text\n   */\n  function getImgView(text) {\n    if (text && text.indexOf(',') > 0) {\n      // update-begin--author:liaozhiyang---date:20250325---for：【issues/7990】图片参数中包含逗号会错误的识别成多张图\n      text = split(text)[0];\n      // update-end--author:liaozhiyang---date:20250325---for：【issues/7990】图片参数中包含逗号会错误的识别成多张图\n    }\n    return getFileAccessHttpUrl(text);\n  }\n\n  /**\n   * 根据编码获取省市区文本\n   * @param code\n   */\n  function getPcaText(code) {\n    if (!code) {\n      return '';\n    }\n    return getAreaTextByCode(code);\n  }\n\n  /**\n   * 日期格式化\n   * @param text\n   */\n  function getFormatDate(text, column) {\n    if (!text) {\n      return '';\n    }\n    let a = text;\n    if (a.length > 10) {\n      a = a.substring(0, 10);\n    }\n    // update-begin--author:liaozhiyang---date:20240430---for：【issues/6094】online 日期(年月日)控件增加年、年月，年周，年季度等格式\n    let fieldExtendJson = column?.fieldExtendJson;\n    if (fieldExtendJson) {\n      fieldExtendJson = JSON.parse(fieldExtendJson);\n      if (fieldExtendJson.picker && fieldExtendJson.picker != 'default') {\n        const result = getWeekMonthQuarterYear(a);\n        return result[fieldExtendJson.picker];\n      }\n    }\n    // update-end--author:liaozhiyang---date:20240430---for：【issues/6094】online 日期(年月日)控件增加年、年月，年周，年季度等格式\n    return a;\n  }\n\n  watch(selectedKeys, () => {\n    onlineTableContext['selectedRowKeys'] = toRaw(selectedKeys.value);\n  });\n\n  onlineTableContext['clearSelectedRow'] = () => {\n    selectedKeys.value = [];\n    onlineTableContext['selectedRows'] = [];\n    onlineTableContext['selectedRowKeys'] = [];\n  };\n\n  /**\n   * 预览列表 cell 图片\n   * @param text\n   */\n  function viewOnlineCellImage(text) {\n    if (text) {\n      let imgList: any = [];\n      // update-begin--author:liaozhiyang---date:20250325---for：【issues/7990】图片参数中包含逗号会错误的识别成多张图\n      const arr = split(text);\n      // update-end--author:liaozhiyang---date:20250325---for：【issues/7990】图片参数中包含逗号会错误的识别成多张图\n      for (let str of arr) {\n        if (str) {\n          imgList.push(getFileAccessHttpUrl(str));\n        }\n      }\n      createImgPreview({ imageList: imgList });\n    }\n  }\n\n  /**\n   * link table控件在列表上显示 支持点击跳转表单\n   * @param id\n   * @param hrefTableName\n   */\n  const onlinePopModalRef = ref();\n  async function handleClickLinkTable(id, hrefTableName, isListReadOnly){\n    popTableId.value = hrefTableName;\n    let formStatus =  await onlinePopModalRef.value.getFormStatus();\n    // 判断当前表单是否支持编辑，不能编辑跳详情表单\n    if(formStatus==true){\n      hrefMainTableId.value = hrefTableName;\n      openOnlineHrefModal(true, {\n        isUpdate: true,\n        disableSubmit: true,\n        hideSub: true,\n        record:{id: id},\n      })\n    }else{\n      openPopModal(true, {\n        isUpdate: true,\n        // update-begin--author:liaozhiyang---date:20250318---for：【issues/7930】表格列表中支持关联记录配置是否只读\n        disableSubmit: isListReadOnly ? true : false,\n        // update-end--author:liaozhiyang---date:20250318---for：【issues/7930】表格列表中支持关联记录配置是否只读\n        record: {\n          id: id\n        }\n      });\n    }\n  }\n  \n  return {\n    columns,\n    actionColumn,\n    selectedKeys,\n    rowSelection,\n    enableScrollBar,\n    tableScroll,\n    downloadRowFile,\n    getImgView,\n    getPcaText,\n    getFormatDate,\n    handleColumnResult,\n    onSelectChange,\n    hrefComponent,\n    viewOnlineCellImage,\n    hrefMainTableId,\n    registerOnlineHrefModal,\n    registerPopModal,\n    openPopModal,\n    openOnlineHrefModal,\n    onlinePopModalRef,\n    popTableId,\n    handleClickFieldHref,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JMarkdownEditor.vue",
    "content": "<template>\n  <MarkDown v-bind=\"bindProps\" @change=\"onChange\" @get=\"onGetVditor\" />\n</template>\n\n<script lang=\"ts\">\n  import { computed, defineComponent, watch, nextTick } from 'vue';\n  import { MarkDown } from '/@/components/Markdown';\n  import { propTypes } from '/@/utils/propTypes';\n  import { Form } from 'ant-design-vue';\n  export default defineComponent({\n    name: 'JMarkdownEditor',\n    // 不将 attrs 的属性绑定到 html 标签上\n    inheritAttrs: false,\n    components: { MarkDown },\n    props: {\n      value: propTypes.string.def(''),\n      disabled: propTypes.bool.def(false),\n    },\n    emits: ['change', 'update:value'],\n    setup(props, { emit, attrs }) {\n      // markdown 组件实例\n      let mdRef: any = null;\n      // vditor 组件实例\n      let vditorRef: any = null;\n      // 合并 props 和 attrs\n      const bindProps = computed(() => Object.assign({}, props, attrs));\n      const formItemContext = Form.useInjectFormItemContext();\n      // 相当于 onMounted\n      function onGetVditor(instance) {\n        mdRef = instance;\n        vditorRef = mdRef.getVditor();\n\n        // 监听禁用，切换编辑器禁用状态\n        watch(\n          () => props.disabled,\n          (disabled) => (disabled ? vditorRef.disabled() : vditorRef.enable()),\n          { immediate: true }\n        );\n      }\n\n      // value change 事件\n      function onChange(value) {\n        emit('change', value);\n        emit('update:value', value);\n        // 代码逻辑说明: 【QQYUN-9110】组件有值校验没消失\n        nextTick(() => {\n          formItemContext?.onFieldChange();\n        });\n      }\n\n      return {\n        bindProps,\n\n        onChange,\n        onGetVditor,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JPopup.vue",
    "content": "<!--popup组件-->\n<template>\n  <div class=\"JPopup components-input-demo-presuffix\" v-if=\"avalid\">\n    <!--输入框-->\n    <a-input @click=\"handleOpen\" :value=\"innerShowText || showText\" :placeholder=\"placeholder\" readOnly v-bind=\"attrs\">\n      <template #prefix>\n        <Icon icon=\"ant-design:cluster-outlined\"></Icon>\n      </template>\n      <!-- <template #suffix>\n                <Icon icon=\"ant-design:close-circle-outlined\" @click=\"handleEmpty\" title=\"清空\" v-if=\"showText\"></Icon>\n            </template>-->\n    </a-input>\n    <a-form-item>\n      <!--popup弹窗-->\n      <JPopupOnlReportModal\n        @register=\"regModal\"\n        :code=\"code\"\n        :multi=\"multi\"\n        :sorter=\"sorter\"\n        :groupId=\"uniqGroupId\"\n        :param=\"param\"\n        :showAdvancedButton=\"showAdvancedButton\"\n        :getContainer=\"getContainer\"\n        :getFormValues=\"getFormValues\"\n        @ok=\"callBack\"\n      ></JPopupOnlReportModal>\n    </a-form-item>\n  </div>\n</template>\n<script lang=\"ts\">\n  import JPopupOnlReportModal from './modal/JPopupOnlReportModal.vue';\n  import { defineComponent, ref, reactive, onMounted, watchEffect, watch, computed, unref } from 'vue';\n  import { useModal } from '/@/components/Modal';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  export default defineComponent({\n    name: 'JPopup',\n    components: {\n      JPopupOnlReportModal,\n    },\n    inheritAttrs: false,\n    props: {\n      code: propTypes.string.def(''),\n      value: propTypes.string.def(''),\n      sorter: propTypes.string.def(''),\n      width: propTypes.number.def(1200),\n      placeholder: propTypes.string.def('请选择'),\n      multi: propTypes.bool.def(false),\n      param: propTypes.object.def({}),\n      spliter: propTypes.string.def(','),\n      groupId: propTypes.string.def(''),\n      formElRef: propTypes.object,\n      setFieldsValue: propTypes.func,\n      getFormValues: propTypes.func,\n      getContainer: propTypes.func,\n      fieldConfig: {\n        type: Array,\n        default: () => [],\n      },\n      showAdvancedButton: propTypes.bool.def(true),\n      // 是否是在 筛选（search） 中使用\n      inSearch: propTypes.bool.def(false),\n    },\n    emits: ['update:value', 'register', 'popUpChange', 'focus'],\n    setup(props, { emit, refs }) {\n      const { createMessage } = useMessage();\n      const attrs = useAttrs();\n      //pop是否展示\n      const avalid = ref(true);\n      const showText = ref('');\n      const innerShowText = ref('')\n      //注册model\n      const [regModal, { openModal }] = useModal();\n      //表单值\n      let {code, fieldConfig } = props;\n      //唯一分组groupId\n      const uniqGroupId = computed(() => (props.groupId ? `${props.groupId}_${code}_${fieldConfig[0]['source']}_${fieldConfig[0]['target']}` : ''));\n      /**\n       * 判断popup配置项是否正确\n       */\n      onMounted(() => {\n        if (props.fieldConfig.length == 0) {\n          createMessage.error('popup参数未正确配置!');\n          avalid.value = false;\n        }\n      });\n      /**\n       * 监听value数值\n       */\n      watch(\n        () => props.value,\n        (val) => {\n          showText.value = val && val.length > 0 ? val.split(props.spliter).join(',') : '';\n        },\n        { immediate: true }\n      );\n\n      /**\n       * 打开pop弹出框\n       */\n      function handleOpen() {\n        emit('focus');\n        // 代码逻辑说明: 【TV360X-317】禁用后JPopup和JPopupdic还可以点击出弹窗\n        !attrs.value.disabled && openModal(true);\n      }\n\n      /**\n       * TODO 清空\n       */\n      function handleEmpty() {\n        showText.value = '';\n      }\n\n      /**\n       * 传值回调\n       */\n      function callBack(rows) {\n        let { fieldConfig } = props;\n        //匹配popup设置的回调值\n        let values = {};\n        let labels = []\n        for (let item of fieldConfig) {\n          let val = rows.map((row) => row[item.source]);\n          // 代码逻辑说明: 【QQYUN-7535】数组只有一个且是number类型，join会改变值的类型为string\n          val = val.length == 1 ? val[0] : val.join(',');\n          item.target.split(',').forEach((target) => {\n            values[target] = val;\n          });\n\n          if (props.inSearch) {\n            // 处理显示值\n            if (item.label) {\n              let txt = rows.map((row) => row[item.label]);\n              txt = txt.length == 1 ? txt[0] : txt.join(',');\n              labels.push(txt);\n            } else {\n              labels.push(val);\n            }\n          }\n\n        }\n        innerShowText.value = labels.join(',');\n        //传入表单示例方式赋值\n        props.formElRef && props.formElRef.setFieldsValue(values);\n        //传入赋值方法方式赋值\n        props.setFieldsValue && props.setFieldsValue(values);\n        // 代码逻辑说明: 【issues/5213】JPopup抛出change事件\n        emit('popUpChange', values);\n      }\n\n      return {\n        showText,\n        innerShowText,\n        avalid,\n        uniqGroupId,\n        attrs,\n        regModal,\n        handleOpen,\n        handleEmpty,\n        callBack,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  // 代码逻辑说明: 【QQYUN-9260】必填模式下会影响到弹窗内antd组件的样式\n  .JPopup {\n    > .ant-form-item {\n      display: none;\n    }\n  }\n  .components-input-demo-presuffix .anticon-close-circle {\n    cursor: pointer;\n    color: #ccc;\n    transition: color 0.3s;\n    font-size: 12px;\n  }\n\n  .components-input-demo-presuffix .anticon-close-circle:hover {\n    color: #f5222d;\n  }\n\n  .components-input-demo-presuffix .anticon-close-circle:active {\n    color: #666;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JPopupDict.vue",
    "content": "<!--popup组件-->\n<template>\n  <div class=\"JPopupDict components-input-demo-presuffix\">\n    <!--输入框-->\n    <a-select v-model:value=\"showText\" v-bind=\"attrs\" :mode=\"multi ? 'multiple' : ''\" @click=\"handleOpen\" readOnly :loading=\"loading\">\n      <a-select-option v-for=\"item in options\" :value=\"item.value\">{{ item.text }}</a-select-option>\n    </a-select>\n    <a-form-item>\n      <!--popup弹窗-->\n      <JPopupOnlReportModal\n        @register=\"regModal\"\n        :code=\"code\"\n        :multi=\"multi\"\n        :selected=\"selected\"\n        :rowkey=\"valueFiled\"\n        :sorter=\"sorter\"\n        :groupId=\"''\"\n        :param=\"param\"\n        :getFormValues=\"getFormValues\"\n        :getContainer=\"getContainer\"\n        :showAdvancedButton=\"showAdvancedButton\"\n        @ok=\"callBack\"\n      />\n    </a-form-item>\n  </div>\n</template>\n<script lang=\"ts\">\n  import JPopupOnlReportModal from './modal/JPopupOnlReportModal.vue';\n  import { defineComponent, ref, nextTick, watch, reactive, unref } from 'vue';\n  import { useModal } from '/@/components/Modal';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { defHttp } from '/@/utils/http/axios';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  //定义请求url信息\n  const configUrl = reactive({\n    getColumns: '/online/cgreport/api/getRpColumns/',\n    getData: '/online/cgreport/api/getData/',\n  });\n\n  export default defineComponent({\n    name: 'JPopupDict',\n    components: {\n      JPopupOnlReportModal,\n    },\n    inheritAttrs: false,\n    props: {\n      /**\n       * 示例：demo,name,id\n       * demo: online报表编码\n       * name: online报表的字段，用户显示的label\n       * id: online报表的字段，用于存储key\n       */\n      dictCode: propTypes.string.def(''),\n      value: propTypes.string.def(''),\n      sorter: propTypes.string.def(''),\n      multi: propTypes.bool.def(false),\n      param: propTypes.object.def({}),\n      spliter: propTypes.string.def(','),\n      getFormValues: propTypes.func,\n      getContainer: propTypes.func,\n      showAdvancedButton: propTypes.bool.def(true),\n    },\n    emits: ['update:value', 'register', 'change'],\n    setup(props, { emit }) {\n      const { createMessage } = useMessage();\n      const attrs = useAttrs();\n      const showText = ref<any>(props.multi ? [] : '');\n      const options = ref<any>([]);\n      const cgRpConfigId = ref('');\n      const loading = ref(false);\n      const code = props.dictCode.split(',')[0];\n      const labelFiled = props.dictCode.split(',')[1];\n      const valueFiled = props.dictCode.split(',')[2];\n      const selected = ref([]);\n      if (!code || !valueFiled || !labelFiled) {\n        createMessage.error('popupDict参数未正确配置!');\n      }\n      //注册model\n      const [regModal, { openModal }] = useModal();\n\n      /**\n       * 打开pop弹出框\n       */\n      function handleOpen() {\n        // 代码逻辑说明: 【TV360X-317】禁用后JPopup和JPopupdic还可以点击出弹窗\n        !attrs.value.disabled && openModal(true);\n      }\n      /**\n       * 监听value数值\n       */\n      watch(\n        () => props.value,\n        (val) => {\n          const callBack = () => {\n            if (props.multi) {\n              showText.value = val && val.length > 0 ? val.split(props.spliter) : [];\n            } else {\n              showText.value = val ?? '';\n            }\n          };\n          if (props.value || props.defaultValue) {\n            if (cgRpConfigId.value) {\n              loadData({ callBack });\n            } else {\n              loadColumnsInfo({ callBack });\n            }\n          } else {\n            callBack();\n          }\n        },\n        { immediate: true }\n      );\n      watch(\n        () => showText.value,\n        (val) => {\n          let result;\n          if (props.multi) {\n            result = val.join(',');\n          } else {\n            result = val;\n          }\n          nextTick(() => {\n            emit('change', result);\n            emit('update:value', result);\n          });\n        }\n      );\n      /**\n       * 加载列信息\n       */\n      function loadColumnsInfo({ callBack }) {\n        loading.value = true;\n        let url = `${configUrl.getColumns}${code}`;\n        defHttp\n          .get({ url }, { isTransformResponse: false, successMessageMode: 'none' })\n          .then((res) => {\n            if (res.success) {\n              cgRpConfigId.value = res.result.cgRpConfigId;\n              loadData({ callBack });\n            }\n          })\n          .catch((err) => {\n            loading.value = false;\n            callBack?.();\n          });\n      }\n      function loadData({ callBack }) {\n        loading.value = true;\n        let url = `${configUrl.getData}${unref(cgRpConfigId)}`;\n        defHttp\n          .get(\n            { url, params: { ['force_' + valueFiled]: props.value || props.defaultValue } },\n            { isTransformResponse: false, successMessageMode: 'none' }\n          )\n          .then((res) => {\n            let data = res.result;\n            if (data.records?.length) {\n              options.value = data.records.map((item) => {\n                return { value: item[valueFiled], text: item[labelFiled] };\n              });\n              selected.value = data.records;\n            }\n          })\n          .finally(() => {\n            loading.value = false;\n            callBack?.();\n          });\n      }\n      /**\n       * 传值回调\n       */\n      function callBack(rows) {\n        const dataOptions: any = [];\n        const dataValue: any = [];\n        let result;\n        rows.forEach((item) => {\n          dataOptions.push({ value: item[valueFiled], text: item[labelFiled] });\n          dataValue.push(item[valueFiled]);\n        });\n        options.value = dataOptions;\n        if (props.multi) {\n          showText.value = dataValue;\n          result = dataValue.join(props.spliter);\n        } else {\n          showText.value = dataValue[0];\n          result = dataValue[0];\n        }\n        nextTick(() => {\n          emit('change', result);\n          emit('update:value', result);\n        });\n      }\n\n      return {\n        showText,\n        attrs,\n        regModal,\n        handleOpen,\n        callBack,\n        code,\n        options,\n        loading,\n        selected,\n        valueFiled,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  // 代码逻辑说明: 【QQYUN-9260】必填模式下会影响到弹窗内antd组件的样式\n  .JPopupDict {\n    > .ant-form-item {\n      display: none;\n    }\n  }\n  .components-input-demo-presuffix {\n    :deep(.ant-select-dropdown) {\n      display: none !important;\n    }\n  }\n  .components-input-demo-presuffix .anticon-close-circle {\n    cursor: pointer;\n    color: #ccc;\n    transition: color 0.3s;\n    font-size: 12px;\n  }\n\n  .components-input-demo-presuffix .anticon-close-circle:hover {\n    color: #f5222d;\n  }\n\n  .components-input-demo-presuffix .anticon-close-circle:active {\n    color: #666;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JRangeDate.vue",
    "content": "<template>\n    <a-range-picker v-model:value=\"rangeValue\" @change=\"handleChange\" :show-time=\"datetime\" :placeholder=\"placeholder\" :valueFormat=\"valueFormat\"/>\n</template>\n\n<script>\n    import { defineComponent, ref, watch, computed } from 'vue';\n    import { propTypes } from '/@/utils/propTypes';\n    import { Form } from 'ant-design-vue';\n\n    const placeholder = ['开始日期', '结束日期']\n    /**\n     * 用于范围查询\n     */\n    export default defineComponent({\n        name: \"JRangeDate\",\n        props:{\n            value: propTypes.string.def(''),\n            datetime: propTypes.bool.def(false),\n            placeholder: propTypes.string.def(''),\n        },\n        emits:['change', 'update:value'],\n        setup(props, {emit}){\n            const rangeValue = ref([])\n            const formItemContext = Form.useInjectFormItemContext();\n\n            watch(()=>props.value, (val)=>{\n                if(val){\n                    rangeValue.value = val.split(',')\n                }else{\n                    rangeValue.value = []\n                }\n            }, {immediate: true});\n\n            const valueFormat = computed(()=>{\n                if(props.datetime === true){\n                    return 'YYYY-MM-DD HH:mm:ss'\n                }else{\n                    return 'YYYY-MM-DD'\n                }\n            });\n\n            function handleChange(arr){\n                let str = ''\n                if(arr && arr.length>0){\n                  // 代码逻辑说明: [issues/6368] rangeDate去掉判断允许起始项或结束项为空兼容allowEmpty\n                  str = arr.join(',')\n                }\n                emit('change', str);\n                emit('update:value', str);\n                formItemContext.onFieldChange();\n            }\n            return {\n                rangeValue,\n                placeholder,\n                valueFormat,\n                handleChange\n            }\n        }\n    });\n</script>\n\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JRangeNumber.vue",
    "content": "<template>\n  <a-input-group>\n    <a-input-number v-bind=\"attrs\" :value=\"beginValue\" style=\"width: calc(50% - 15px)\" placeholder=\"最小值\" @change=\"handleChangeBegin\" />\n    <a-input style=\"width: 30px; border-left: 0; pointer-events: none; background-color: #fff\" placeholder=\"~\" disabled />\n    <a-input-number v-bind=\"attrs\" :value=\"endValue\" style=\"width: calc(50% - 15px); border-left: 0\" placeholder=\"最大值\" @change=\"handleChangeEnd\" />\n  </a-input-group>\n</template>\n\n<script>\n  /**\n   * 查询条件用-数值范围查询\n   */\n  import { ref, watch } from 'vue';\n  import { Form } from 'ant-design-vue';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  \n  export default {\n    name: 'JRangeNumber',\n    props: {\n      value: propTypes.oneOfType([propTypes.string, propTypes.array]),\n    },\n    emits: ['change', 'update:value', 'blur'],\n    setup(props, { emit }) {\n      const beginValue = ref('');\n      const endValue = ref('');\n      const attrs = useAttrs();\n      const formItemContext = Form.useInjectFormItemContext();\n      \n      function handleChangeBegin(e) {\n        beginValue.value = e;\n        emitArray();\n      }\n\n      function handleChangeEnd(e) {\n        endValue.value = e;\n        emitArray();\n      }\n\n      function emitArray() {\n        let arr = [];\n        // 代码逻辑说明: 【TV360X-1749】数量0输入不了，输入清空了\n        let begin = beginValue.value ?? '';\n        let end = endValue.value ?? '';\n        arr.push(begin);\n        arr.push(end);\n        emit('change', arr);\n        emit('update:value', arr);\n        formItemContext.onFieldChange();\n      }\n\n      watch(\n        () => props.value,\n        (val) => {\n          if (val && val.length == 2) {\n            beginValue.value = val[0];\n            endValue.value = val[1];\n          } else {\n            beginValue.value = '';\n            endValue.value = '';\n          }\n        }, {immediate: true}\n      );\n      \n      return {\n        beginValue,\n        endValue,\n        handleChangeBegin,\n        handleChangeEnd,\n        attrs,\n      };\n    },\n  };\n</script>\n\n<style lang=\"less\" scoped>\n  // 代码逻辑说明: 【TV360X-214】范围查询控件没有根据配置格式化\n  .ant-input-group {\n    display: flex;\n    .ant-input-number {\n      &:first-child {\n        border-top-right-radius: 0;\n        border-bottom-right-radius: 0;\n      }\n      &:last-child {\n        border-top-left-radius: 0;\n        border-bottom-left-radius: 0;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JRangeTime.vue",
    "content": "<template>\n    <a-time-range-picker v-model:value=\"rangeValue\" @change=\"handleChange\" :placeholder=\"placeholder\" :valueFormat=\"format\" :format=\"format\"/>\n</template>\n\n<script>\n    import { defineComponent, ref, watch } from 'vue';\n    import { propTypes } from '/@/utils/propTypes';\n    import { Form } from 'ant-design-vue';\n\n    const placeholder = ['开始时间', '结束时间']\n    /**\n     * 用于时间-time组件的范围查询\n     */\n    export default defineComponent({\n        name: \"JRangeTime\",\n        props:{\n            value: propTypes.string.def(''),\n            format: propTypes.string.def('HH:mm:ss'),\n            placeholder: propTypes.string.def(''),\n        },\n        emits:['change', 'update:value'],\n        setup(props, {emit}){\n            const rangeValue = ref([])\n            const formItemContext = Form.useInjectFormItemContext();\n\n            watch(()=>props.value, (val)=>{\n                if(val){\n                    rangeValue.value = val.split(',')\n                }else{\n                    rangeValue.value = []\n                }\n            }, {immediate: true});\n\n\n            function handleChange(arr){\n                let str = ''\n                if(arr && arr.length>0){\n                    if(arr[1] && arr[0]){\n                        str = arr.join(',')\n                    }\n                }\n                emit('change', str);\n                emit('update:value', str);\n                formItemContext.onFieldChange();\n            }\n            return {\n                rangeValue,\n                placeholder,\n                handleChange\n            }\n        }\n    });\n</script>"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JSearchSelect.vue",
    "content": "<template>\n  <!--异步字典下拉搜素-->\n  <a-select\n    v-if=\"async\"\n    v-bind=\"attrs\"\n    v-model:value=\"selectedAsyncValue\"\n    showSearch\n    labelInValue\n    allowClear\n    :getPopupContainer=\"getParentContainer\"\n    :placeholder=\"placeholder\"\n    :filterOption=\"isDictTable ? false : filterOption\"\n    :notFoundContent=\"loading ? undefined : null\"\n    @focus=\"handleAsyncFocus\"\n    @search=\"loadData\"\n    @change=\"handleAsyncChange\"\n    @popupScroll=\"handlePopupScroll\"\n    :mode=\"multiple?'multiple':''\"\n    @select=\"handleSelect\"\n    @deselect=\"handleDeSelect\"\n  >\n    <template #notFoundContent>\n      <a-spin size=\"small\" />\n    </template>\n    <a-select-option v-for=\"d in options\" :key=\"d?.value\" :value=\"d?.value\">{{ d?.text }}</a-select-option>\n  </a-select>\n  <!--字典下拉搜素-->\n  <a-select\n    v-else\n    v-model:value=\"selectedValue\"\n    v-bind=\"attrs\"\n    showSearch\n    :getPopupContainer=\"getParentContainer\"\n    :placeholder=\"placeholder\"\n    :filterOption=\"filterOption\"\n    :notFoundContent=\"loading ? undefined : null\"\n    :dropdownAlign=\"{overflow: {adjustY: adjustY }}\"\n    @change=\"handleChange\"\n    :mode=\"multiple?'multiple':''\"\n    @select=\"handleSelect\"\n    @deselect=\"handleDeSelect\"\n  >\n    <template #notFoundContent>\n      <a-spin v-if=\"loading\" size=\"small\" />\n    </template>\n    <a-select-option v-for=\"d in options\" :key=\"d?.value\" :value=\"d?.value\">\n      <span :class=\"[useDicColor && d.color ? 'colorText' : '']\" :style=\"{ backgroundColor: `${useDicColor && d.color}` }\">{{ d?.text || d?.label }}</span>\n    </a-select-option>\n  </a-select>\n</template>\n\n<script lang=\"ts\">\n  import { useDebounceFn } from '@vueuse/core';\n  import { defineComponent, PropType, ref, reactive, watchEffect, computed, unref, watch, onMounted } from 'vue';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { initDictOptions } from '/@/utils/dict/index';\n  import { defHttp } from '/@/utils/http/axios';\n  import { debounce } from 'lodash-es';\n  import { setPopContainer } from '/@/utils';\n  import { isObject } from '/@/utils/is';\n\n  export default defineComponent({\n    name: 'JSearchSelect',\n    inheritAttrs: false,\n    props: {\n      value: propTypes.oneOfType([propTypes.string, propTypes.number]),\n      dict: propTypes.string,\n      dictOptions: {\n        type: Array,\n        default: () => [],\n      },\n      async: propTypes.bool.def(false),\n      placeholder: propTypes.string,\n      popContainer: propTypes.string,\n      pageSize: propTypes.number.def(10),\n      getPopupContainer: {\n        type: Function,\n        default: (node) => node?.parentNode,\n      },\n      //默认开启Y轴溢出位置调整，因此在可视空间不足时下拉框位置会自动上移，导致Select的输入框被遮挡。需要注意的是，默认情况是是可视空间，而不是所拥有的空间\n      // 代码逻辑说明: [issue/286]下拉搜索框遮挡问题\n      adjustY:propTypes.bool.def(true),\n      //是否在有值后立即触发change\n      immediateChange: propTypes.bool.def(false),\n      //支持传入查询参数，如排序信息\n      params:{\n        type: Object,\n        default: ()=>{}\n      },\n      //是否为多选\n      multiple:{\n        type: Boolean,\n        default: false\n      },\n      useDicColor: {\n        type: Boolean,\n        default: false,\n      },\n    },\n    emits: ['change', 'update:value'],\n    setup(props, { emit, refs }) {\n      const options = ref<any[]>([]);\n      const loading = ref(false);\n      // 代码逻辑说明: 【issues/897】JSearchSelect组件添加class/style样式不生效\n      const attrs = useAttrs({'excludeDefaultKeys': false});\n      const selectedValue = ref([]);\n      const selectedAsyncValue = ref([]);\n      const lastLoad = ref(0);\n      // 是否根据value加载text\n      const loadSelectText = ref(true);\n      // 异步(字典表) - 滚动加载时会用到\n      let isHasData = true;\n      let scrollLoading = false;\n      let pageNo = 1;\n      let searchKeyword = '';\n\n      // 是否是字典表\n      const isDictTable = computed(() => {\n        if (props.dict) {\n          return props.dict.split(',').length >= 2\n        }\n        return false;\n      })\n\n      /**\n       * 监听字典code\n       */\n      watch(() => props.dict, () => {\n        if (!props.dict) {\n          return\n        }\n        if (isDictTable.value) {\n          initDictTableData();\n        } else {\n          initDictCodeData();\n        }\n      }, {immediate: true});\n\n      /**\n       * 监听value\n       */\n      watch(\n        () => props.value,\n        (val) => {\n          if (val || val === 0) {\n            initSelectValue();\n          } else {\n            selectedValue.value = [];\n            selectedAsyncValue.value = [];\n          }\n        },\n        { immediate: true }\n      );\n      /**\n       * 监听dictOptions\n       */\n      watch(\n        () => props.dictOptions,\n        (val) => {\n          if (val && val.length >= 0) {\n            options.value = [...val];\n          }\n        },\n        { immediate: true }\n      );\n      /**\n       * 异步查询数据\n       */\n      const loadData = debounce(async function loadData(value) {\n        if (!isDictTable.value) {\n          return;\n        }\n        // 代码逻辑说明: 【TV360X-1898】JsearchSelect组件传入字典表格式则支持滚动加载\n        pageNo = 1;\n        isHasData = true;\n        searchKeyword = value;\n \n        lastLoad.value += 1;\n        const currentLoad = unref(lastLoad);\n        options.value = [];\n        loading.value = true;\n        let keywordInfo = getKeywordParam(value);\n        // 代码逻辑说明: [QQYUN-8800]JSearchSelect的search事件在中文输入还没拼字成功时会触发，导致后端SQL注入 #6049------------\n        keywordInfo = keywordInfo.replaceAll(\"'\", '');\n        // 字典code格式：table,text,code\n        defHttp\n          .get({\n            url: `/sys/dict/loadDict/${props.dict}`,\n            params: { keyword: keywordInfo, pageSize: props.pageSize, pageNo },\n          })\n          .then((res) => {\n            loading.value = false;\n            if (res && res.length > 0) {\n              if (currentLoad != unref(lastLoad)) {\n                return;\n              }\n              options.value = res;\n              // 代码逻辑说明: 【TV360X-1898】JsearchSelect组件传入字典表格式则支持滚动加载\n              pageNo++;\n            } else {\n              // 代码逻辑说明: 【TV360X-1898】JsearchSelect组件传入字典表格式则支持滚动加载\n              pageNo == 1 && (isHasData = false);\n            }\n          });\n      }, 300);\n      /**\n       * 初始化value\n       */\n      function initSelectValue() {\n        // 代码逻辑说明: 下拉搜索组件每次选中值会触发value的监听事件，触发此方法，但是实际不需要\n        if (loadSelectText.value === false) {\n          loadSelectText.value = true;\n          return;\n        }\n        let { async, value, dict } = props;\n        if (async) {\n          if (!selectedAsyncValue || !selectedAsyncValue.key || selectedAsyncValue.key !== value) {\n            defHttp.get({ url: `/sys/dict/loadDictItem/${dict}`, params: { key: value } }).then((res) => {\n              if (res && res.length > 0) {\n                //判断组件是否为多选\n                if(props.multiple){\n                  if(value){\n                    let arr: any = [];\n                    //多选返回的是以逗号拼接的方式\n                    let values = value.toString().split(',');\n                    for (let i = 0; i < res.length; i++) {\n                      let obj = {\n                        key: values[i],\n                        label: res[i],\n                      };\n                      arr.push(obj);\n                      selectedValue.value.push(obj.key);\n                    }\n                    selectedAsyncValue.value = arr;\n                  }\n                } else {\n                  let obj = {\n                    key: value,\n                    label: res,\n                  };\n                  if (props.value == value) {\n                    selectedAsyncValue.value = { ...obj };\n                  }\n                  // 代码逻辑说明: 值改变触发change事件--用于online关联记录配置页面\n                  if(props.immediateChange == true){\n                    emit('change', props.value);\n                  }\n                }\n              }\n            });\n          }\n        } else {\n          // 代码逻辑说明: 【issues/8101】前端dict组件导致内存溢出问题：搜索组件支持多选---\n          if(!props.multiple){\n            selectedValue.value = value.toString();\n            if(props.immediateChange == true){\n              emit('change', value.toString());\n            }\n          }else{\n            //多选的情况下需要转成数组\n            selectedValue.value = value.toString().split(',');\n          }\n        }\n      }\n\n      /**\n       * 初始化字典下拉数据\n       */\n      async function initDictTableData() {\n        let { dict, async, dictOptions, pageSize } = props;\n        if (!async) {\n          //如果字典项集合有数据\n          if (dictOptions && dictOptions.length > 0) {\n            options.value = dictOptions;\n          } else {\n            //根据字典Code, 初始化字典数组\n            let dictStr = '';\n            if (dict) {\n              let arr = dict.split(',');\n              if (arr[0].indexOf('where') > 0) {\n                let tbInfo = arr[0].split('where');\n                dictStr = tbInfo[0].trim() + ',' + arr[1] + ',' + arr[2] + ',' + encodeURIComponent(tbInfo[1]);\n              } else {\n                dictStr = dict;\n              }\n              //根据字典Code, 初始化字典数组\n              const dictData = await initDictOptions(dictStr);\n              options.value = dictData;\n            }\n          }\n        } else {\n          if (!dict) {\n            console.error('搜索组件未配置字典项');\n          } else {\n            // 代码逻辑说明: 【TV360X-1898】JsearchSelect组件传入字典表格式则支持滚动加载\n            pageNo = 1;\n            isHasData = true;\n            searchKeyword = '';\n\n            //异步一开始也加载一点数据\n            loading.value = true;\n            let keywordInfo = getKeywordParam('');\n            defHttp\n              .get({\n                url: `/sys/dict/loadDict/${dict}`,\n                params: { pageSize: pageSize, keyword: keywordInfo, pageNo },\n              })\n              .then((res) => {\n                loading.value = false;\n                if (res && res.length > 0) {\n                  options.value = res;\n                  // 代码逻辑说明: 【TV360X-1898】JsearchSelect组件传入字典表格式则支持滚动加载\n                  pageNo++;\n                } else {\n                  // 代码逻辑说明: 【TV360X-1898】JsearchSelect组件传入字典表格式则支持滚动加载\n                  pageNo == 1 && (isHasData = false);\n                }\n              });\n          }\n        }\n      }\n\n      /**\n       * 查询数据字典\n       */\n      async function initDictCodeData() {\n        options.value = await initDictOptions(props.dict);\n      }\n\n      /**\n       * 同步改变事件\n       * */\n      function handleChange(value) {\n        //多选也会触发change事件，需要判断如果时多选不需要赋值\n        if(!props.multiple){\n          selectedValue.value = value;\n          callback();\n        }\n      }\n      /**\n       * 异步改变事件\n       * */\n      function handleAsyncChange(selectedObj) {\n          // 单选情况下使用change事件\n          if(!props.multiple){\n            if (selectedObj) {\n              selectedAsyncValue.value = selectedObj;\n              selectedValue.value = selectedObj.key;\n            } else {\n              selectedAsyncValue.value = null;\n              selectedValue.value = null;\n              options.value = null;\n              loadData('');\n            }\n            callback();\n            // 点x清空时需要把loadSelectText设置true\n            selectedObj ?? (loadSelectText.value = true);\n          }\n      }\n\n      /**\n       * 异步值选中事件\n       * @param selectedObj\n       */\n      function handleSelect(selectedObj){\n        let key = selectedObj;\n        if(props.async){\n          key = selectedObj.key;\n        }\n        //多选情况下使用select事件\n        if(props.multiple && key){\n          //异步的时候才需要在selectedValue数组中添加值操作，同步的情况下直接走更新值操作\n          if(props.async){\n            selectedValue.value.push(key);\n          }\n          selectedObj ?? (loadSelectText.value = true);\n          callback();\n        }\n      }\n      \n      /**\n       * 异步值取消选中事件\n       * @param selectedObj\n       */\n      function handleDeSelect(selectedObj){\n        let key = selectedObj;\n        if(props.async){\n          key = selectedObj.key;\n        }\n        //多选情况下使用select事件\n        if(props.multiple){\n          //异步的时候才需要在selectedValue数组中删除值操作，同步的情况下直接走更新值操作\n          if(props.async){\n            let findIndex = selectedValue.value.findIndex(item => item === key);\n            if(findIndex != -1){\n              selectedValue.value.splice(findIndex,1);\n            }\n          }\n          selectedObj ?? (loadSelectText.value = true);\n          callback();\n        }\n      }\n      \n      /**\n       *回调方法\n       * */\n      function callback() {\n        loadSelectText.value = false;\n        //单选直接走更新值操作\n        if(!props.multiple){\n          emit('change', unref(selectedValue));\n          emit('update:value', unref(selectedValue));\n        } else {\n          //多选需要把数组转成字符串\n          emit('change', unref(selectedValue).join(\",\"));\n          emit('update:value', unref(selectedValue).join(\",\"));\n        }\n      }\n      /**\n       * 过滤选中option\n       */\n      function filterOption(input, option) {\n        // 代码逻辑说明: issues/218 所有功能表单的下拉搜索框搜索无效\n        let value = '', label = '';\n        try {\n          value = option.value;\n          label = option.children()[0].children;\n        }catch (e) {\n          console.log('获取下拉项失败', e)\n        }\n        let str = input.toLowerCase();\n        return value.toLowerCase().indexOf(str) >= 0 || label.toLowerCase().indexOf(str) >= 0;\n      }\n\n      function getParentContainer(node) {\n        // 代码逻辑说明: getPopupContainer一直有值 导致popContainer的逻辑永远走不进去，把它挪到前面判断\n        if (props.popContainer) {\n          // 代码逻辑说明: 【QQYUN-9339】有多个modal弹窗内都有下拉字典多选和下拉搜索组件时，打开另一个modal时组件的options不展示\n          return setPopContainer(node, props.popContainer);\n        } else {\n          if (typeof props.getPopupContainer === 'function') {\n            return props.getPopupContainer(node);\n          } else {\n            return node?.parentNode;\n          }\n        }\n      }\n\n      //获取关键词参数 支持设置排序信息\n      function getKeywordParam(text){\n        // 如果设定了排序信息，需要写入排序信息，在关键词后加 [orderby:create_time,desc]\n        if(props.params && props.params.column && props.params.order){\n          let temp = text||''\n          \n          // 代码逻辑说明: /issues/4905 表单生成器字段配置时，选择关联字段，在进行高级配置时，无法加载数据库列表，提示 Sgin签名校验错误！ #4905\n          temp = temp+'[orderby:'+props.params.column+','+props.params.order+']'\n          return encodeURI(temp);\n          \n        }else{\n          return text;\n        }\n      }\n      // 代码逻辑说明: 【TV360X-26】下拉搜索控件选中选项后再次点击下拉应该显示初始的下拉选项，而不是只展示选中结果\n      const handleAsyncFocus = () => {\n        // 代码逻辑说明: 【issues/6681】异步查询不生效\n        if ((isObject(selectedAsyncValue.value) || selectedAsyncValue.value?.length) && isDictTable.value && props.async) {\n          // 代码逻辑说明: 【TV360X-2062】下拉搜索选择第二页数据后，第一次点击时(得到焦点)滚动条没复原到初始位置且数据会加载第二页数据(应该只加载第一页数据)\n          options.value = [];\n          initDictTableData();\n        }\n        // 代码逻辑说明: 【TV360X-2348】得到焦点时options选项显示第一页内容（解决新增时显示非第一页内容）\n        if (Array.isArray(selectedAsyncValue.value) && selectedAsyncValue.value.length === 0 && isDictTable.value && props.async) {\n          if (pageNo > 2) {\n            options.value = [];\n            initDictTableData();\n          }\n        }\n        attrs.onFocus?.();\n      };\n\n      /**\n       * 2024-07-30\n       * liaozhiyang\n       * 【TV360X-1898】JsearchSelect组件传入字典表格式则支持滚动加载\n       * */\n      const handlePopupScroll = async (e) => {\n        // 字典表才才支持滚动加载\n        if (isDictTable.value) {\n          const { target } = e;\n          const { scrollTop, scrollHeight, clientHeight } = target;\n          if (!scrollLoading && isHasData && scrollTop + clientHeight >= scrollHeight - 10) {\n            scrollLoading = true;\n            let keywordInfo = getKeywordParam(searchKeyword);\n\n            defHttp\n              .get({ url: `/sys/dict/loadDict/${props.dict}`, params: { pageSize: props.pageSize, keyword: keywordInfo, pageNo } })\n              .then((res) => {\n                loading.value = false;\n                if (res?.length > 0) {\n                  // 防止开源只更新了前端代码没更新后端代码（第一页和第二页面的第一条数据相同则是后端代码没更新，没分页）\n                  if (JSON.stringify(res[0]) === JSON.stringify(options.value[0])) {\n                    isHasData =  false;\n                    return;\n                  }\n                  options.value.push(...res);\n                  pageNo++;\n                } else {\n                  isHasData = false;\n                }\n              })\n              .finally(() => {\n                scrollLoading = false;\n              })\n              .catch(() => {\n                pageNo != 1 && pageNo--;\n              });\n          }\n        }\n      };\n\n      return {\n        attrs,\n        options,\n        loading,\n        isDictTable,\n        selectedValue,\n        selectedAsyncValue,\n        loadData: useDebounceFn(loadData, 800),\n        getParentContainer,\n        filterOption,\n        handleChange,\n        handleAsyncChange,\n        handleAsyncFocus,\n        handlePopupScroll,\n        handleSelect,\n        handleDeSelect,\n      };\n    },\n  });\n</script>\n\n<style scoped>\n.colorText {\n  display: inline-block;\n  height: 20px;\n  line-height: 20px;\n  padding: 0 6px;\n  border-radius: 8px;\n  background-color: red;\n  color: #fff;\n  font-size: 12px;\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JSelectDepartPost.vue",
    "content": "<!--部门选择组件-->\n<template>\n  <div class=\"JSelectDepartPost\">\n    <JSelectBiz @change=\"handleSelectChange\" @handleOpen=\"handleOpen\" :loading=\"loadingEcho\" v-bind=\"attrs\" :isCustomRenderTag=\"isCustomRenderTag\" :rowKey=\"getBindValue?.rowKey\"/>\n    <a-form-item>\n      <DeptSelectModal @register=\"regModal\" @getSelectResult=\"setValue\" modalTitle=\"部门岗位选择\" v-bind=\"getBindValue\" :multiple=\"multiple\" @close=\"handleClose\" :izShowDepPath=\"izShowDepPath\"/>\n    </a-form-item>\n  </div>\n</template>\n<script lang=\"ts\">\n  import DeptSelectModal from './modal/DeptSelectModal.vue';\n  import JSelectBiz from './base/JSelectBiz.vue';\n  import { defineComponent, ref, reactive, watchEffect, watch, provide, unref, toRaw } from 'vue';\n  import { useModal } from '/@/components/Modal';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { SelectValue } from 'ant-design-vue/es/select';\n  import { cloneDeep } from 'lodash-es';\n\n  export default defineComponent({\n    name: 'JSelectDepartPost',\n    components: {\n      DeptSelectModal,\n      JSelectBiz,\n    },\n    inheritAttrs: false,\n    props: {\n      value: propTypes.oneOfType([propTypes.string, propTypes.array]),\n      // 是否允许多选，默认 true\n      multiple: propTypes.bool.def(true),\n      //是否只选择岗位\n      izOnlySelectDepartPost: propTypes.bool.def(true),\n      // 自定义渲染tag\n      isCustomRenderTag: propTypes.bool.def(true),\n      //是否显示部门路径（用户部门选择主岗位和兼职岗位需要显示全路径）\n      izShowDepPath: propTypes.bool.def(false),\n    },\n    emits: ['options-change', 'change', 'select', 'update:value'],\n    setup(props, { emit, refs }) {\n      const emitData = ref<any[]>();\n      //注册model\n      const [regModal, { openModal }] = useModal();\n      //下拉框选项值\n      const selectOptions = ref<SelectValue>([]);\n      //下拉框选中值\n      let selectValues = reactive<Recordable>({\n        value: [],\n      });\n      let tempSave: any = [];\n\n      // 是否正在加载回显数据\n      const loadingEcho = ref<boolean>(false);\n      //下发 selectOptions,xxxBiz组件接收\n      provide('selectOptions', selectOptions);\n      //下发 selectValues,xxxBiz组件接收\n      provide('selectValues', selectValues);\n      //下发 loadingEcho,xxxBiz组件接收\n      provide('loadingEcho', loadingEcho);\n\n      const tag = ref(false);\n      const attrs = useAttrs();\n\n      /**\n       * 监听组件值\n       */\n      watchEffect(() => {\n        tempSave = [];\n        props.value && initValue();\n      });\n\n      watch(\n        () => props.value,\n        () => {\n          initValue();\n        }\n      );\n\n      watch(selectOptions, () => {\n        if (selectOptions) {\n          emit('select', toRaw(unref(selectOptions)), toRaw(unref(selectValues)));\n        }\n      });\n\n      /**\n       * 打卡弹出框\n       */\n      function handleOpen() {\n        tag.value = true;\n        openModal(true, {\n          isUpdate: false,\n        });\n      }\n\n      /**\n       * 将字符串值转化为数组\n       */\n      function initValue() {\n        let value = props.value ? props.value : [];\n        if (value && typeof value === 'string') {\n          selectValues.value = value.split(',');\n          tempSave = value.split(',');\n        } else {\n          selectValues.value = value;\n          tempSave = cloneDeep(value);\n        }\n      }\n\n      /**\n       * 设置下拉框的值\n       */\n      function setValue(options, values) {\n        selectOptions.value = options;\n        selectValues.value = values;\n        send(values);\n      }\n      const getBindValue = Object.assign({}, unref(props), unref(attrs));\n\n      const handleClose = () => {\n        if (tempSave.length) {\n          selectValues.value = cloneDeep(tempSave);\n        } else {\n          send(tempSave);\n        }\n      };\n      const handleSelectChange = (values) => {\n        tempSave = cloneDeep(values);\n        send(tempSave);\n      };\n      const send = (values) => {\n        let result = typeof props.value == 'string' ? values.join(',') : values;\n        emit('update:value', result);\n        emit('change', result);\n        if (!values || values.length == 0) {\n          emit('select', null, null);\n        }\n      };\n\n      return {\n        // state,\n        attrs,\n        selectOptions,\n        selectValues,\n        loadingEcho,\n        getBindValue,\n        tag,\n        regModal,\n        setValue,\n        handleOpen,\n        handleClose,\n        handleSelectChange,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .JSelectDepartPost {\n    > .ant-form-item {\n      display: none;\n    }\n  }\n  .j-select-row {\n    @width: 82px;\n\n    .left {\n      width: calc(100% - @width - 8px);\n    }\n\n    .right {\n      width: @width;\n    }\n\n    .full {\n      width: 100%;\n    }\n\n    :deep(.ant-select-search__field) {\n      display: none !important;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JSelectDept.vue",
    "content": "<!--部门选择组件-->\n<template>\n  <div class=\"JSelectDept\">\n    <JSelectBiz  @change=\"handleSelectChange\" @handleOpen=\"handleOpen\" :loading=\"loadingEcho\" v-bind=\"attrs\" :isCustomRenderTag=\"isCustomRenderTag\" :rowKey=\"getBindValue?.rowKey\"/>\n    <a-form-item>\n      <DeptSelectModal @register=\"regModal\" @getSelectResult=\"setValue\" v-bind=\"getBindValue\" :multiple=\"multiple\" @close=\"handleClose\"/>\n    </a-form-item>\n  </div>\n</template>\n<script lang=\"ts\">\n  import DeptSelectModal from './modal/DeptSelectModal.vue';\n  import JSelectBiz from './base/JSelectBiz.vue';\n  import { defineComponent, ref, reactive, watchEffect, watch, provide, unref, toRaw } from 'vue';\n  import { useModal } from '/@/components/Modal';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useRuleFormItem } from '/@/hooks/component/useFormItem';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { SelectValue } from 'ant-design-vue/es/select';\n  import { cloneDeep } from 'lodash-es';\n\n  export default defineComponent({\n    name: 'JSelectDept',\n    components: {\n      DeptSelectModal,\n      JSelectBiz,\n    },\n    inheritAttrs: false,\n    props: {\n      value: propTypes.oneOfType([propTypes.string, propTypes.array]),\n      // 是否允许多选，默认 true\n      multiple: propTypes.bool.def(true),\n      // 自定义渲染tag\n      isCustomRenderTag: propTypes.bool.def(true),\n    },\n    emits: ['options-change', 'change', 'select', 'update:value'],\n    setup(props, { emit, refs }) {\n      const emitData = ref<any[]>();\n      //注册model\n      const [regModal, { openModal }] = useModal();\n      //表单值\n      // const [state] = useRuleFormItem(props, 'value', 'change', emitData);\n      //下拉框选项值\n      const selectOptions = ref<SelectValue>([]);\n      //下拉框选中值\n      let selectValues = reactive<Recordable>({\n        value: [],\n      });\n      let tempSave: any = [];\n\n      // 是否正在加载回显数据\n      const loadingEcho = ref<boolean>(false);\n      //下发 selectOptions,xxxBiz组件接收\n      provide('selectOptions', selectOptions);\n      //下发 selectValues,xxxBiz组件接收\n      provide('selectValues', selectValues);\n      //下发 loadingEcho,xxxBiz组件接收\n      provide('loadingEcho', loadingEcho);\n\n      const tag = ref(false);\n      const attrs = useAttrs();\n\n      /**\n       * 监听组件值\n       */\n      watchEffect(() => {\n        // 代码逻辑说明: [TV360X-840]用户授权，没有选择，点取消，也会回显一个选过的用户\n        tempSave = [];\n        props.value && initValue();\n      });\n\n      // 代码逻辑说明: 为了解决弹窗form初始化赋值问题 ---\n      watch(\n        () => props.value,\n        () => {\n          initValue();\n        }\n      );\n      /**\n       * 监听selectValues变化\n       */\n      // watch(selectValues, () => {\n      //   if (selectValues) {\n      //     state.value = selectValues.value;\n      //   }\n      // });\n      /**\n       * 监听selectOptions变化\n       */\n      watch(selectOptions, () => {\n        if (selectOptions) {\n          emit('select', toRaw(unref(selectOptions)), toRaw(unref(selectValues)));\n        }\n      });\n\n      /**\n       * 打卡弹出框\n       */\n      function handleOpen() {\n        tag.value = true;\n        openModal(true, {\n          isUpdate: false,\n        });\n      }\n\n      /**\n       * 将字符串值转化为数组\n       */\n      function initValue() {\n        let value = props.value ? props.value : [];\n        if (value && typeof value === 'string') {\n          // state.value = value.split(',');\n          selectValues.value = value.split(',');\n          tempSave = value.split(',');\n        } else {\n          // 【VUEN-857】兼容数组（行编辑的用法问题）\n          selectValues.value = value;\n          tempSave = cloneDeep(value);\n        }\n      }\n\n      /**\n       * 设置下拉框的值\n       */\n      function setValue(options, values) {\n        selectOptions.value = options;\n        //emitData.value = values.join(\",\");\n        // state.value = values;\n        selectValues.value = values;\n        send(values);\n      }\n      const getBindValue = Object.assign({}, unref(props), unref(attrs));\n\n       // 代码逻辑说明: 【TV360X-414】部门设置了默认值，查询重置变成空了(同步JSelectUser组件改法)\n      const handleClose = () => {\n        if (tempSave.length) {\n          selectValues.value = cloneDeep(tempSave);\n        } else {\n          send(tempSave);\n        }\n      };\n      const handleSelectChange = (values) => {\n        tempSave = cloneDeep(values);\n        send(tempSave);\n      };\n      const send = (values) => {\n        let result = typeof props.value == 'string' ? values.join(',') : values;\n        emit('update:value', result);\n        emit('change', result);\n        // 代码逻辑说明: 【TV360X-1648】用户编辑界面“所属部门”与“负责部门”联动出错（同步之前丢的代码）\n        if (!values || values.length == 0) {\n          emit('select', null, null);\n        }\n      };\n      \n      return {\n        // state,\n        attrs,\n        selectOptions,\n        selectValues,\n        loadingEcho,\n        getBindValue,\n        tag,\n        regModal,\n        setValue,\n        handleOpen,\n        handleClose,\n        handleSelectChange,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  // 代码逻辑说明: 【QQYUN-9260】必填模式下会影响到弹窗内antd组件的样式\n  .JSelectDept {\n    > .ant-form-item {\n      display: none;\n    }\n  }\n  .j-select-row {\n    @width: 82px;\n\n    .left {\n      width: calc(100% - @width - 8px);\n    }\n\n    .right {\n      width: @width;\n    }\n\n    .full {\n      width: 100%;\n    }\n\n    :deep(.ant-select-search__field) {\n      display: none !important;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JSelectInput.vue",
    "content": "<template>\n  <a-select v-bind=\"bindProps\" @change=\"onChange\" @search=\"onSearch\" />\n</template>\n\n<script lang=\"ts\">\n  import { propTypes } from '/@/utils/propTypes';\n  import { defineComponent, ref, watch, computed } from 'vue';\n\n  // 可以输入的下拉框（此组件暂时没有人用）\n  export default defineComponent({\n    name: 'JSelectInput',\n    props: {\n      options: propTypes.array.def(() => []),\n    },\n    emits: ['change', 'update:value'],\n    setup(props, { emit, attrs }) {\n      // 内部 options 选项\n      const options = ref<any[]>([]);\n      // 监听外部 options 变化，并覆盖内部 options\n      watch(\n        () => props.options,\n        () => {\n          options.value = [...props.options];\n        },\n        { deep: true, immediate: true }\n      );\n      // 合并 props 和 attrs\n      const bindProps: any = computed(() =>\n        Object.assign(\n          {\n            showSearch: true,\n          },\n          props,\n          attrs,\n          {\n            options: options.value,\n          }\n        )\n      );\n\n      function onChange(...args: any[]) {\n        deleteSearchAdd(args[0]);\n        emit('change', ...args);\n        emit('update:value', args[0]);\n      }\n\n      function onSearch(value) {\n        // 是否找到了对应的项，找不到则添加这一项\n        let foundIt =\n          options.value.findIndex((option) => {\n            return option.value.toString() === value.toString();\n          }) !== -1;\n        // !!value ：不添加空值\n        if (!foundIt && !!value) {\n          deleteSearchAdd(value);\n          // searchAdd 是否是通过搜索添加的\n          options.value.push({ value: value, searchAdd: true });\n          //onChange(value,{ value })\n        } else if (foundIt) {\n          onChange(value);\n        }\n      }\n\n      // 删除无用的因搜索（用户输入）而创建的项\n      function deleteSearchAdd(value = '') {\n        let indexes: any[] = [];\n        options.value.forEach((option, index) => {\n          if (option.searchAdd) {\n            if ((option.value ?? '').toString() !== value.toString()) {\n              indexes.push(index);\n            }\n          }\n        });\n        // 翻转删除数组中的项\n        for (let index of indexes.reverse()) {\n          options.value.splice(index, 1);\n        }\n      }\n\n      return {\n        bindProps,\n        onChange,\n        onSearch,\n      };\n    },\n  });\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JSelectMultiple.vue",
    "content": "<!--字典下拉多选-->\n<template>\n  <a-select\n    :value=\"arrayValue\"\n    @change=\"onChange\"\n    mode=\"multiple\"\n    :filter-option=\"filterOption\"\n    :disabled=\"disabled\"\n    :placeholder=\"placeholder\"\n    allowClear\n    :getPopupContainer=\"getParentContainer\"\n  >\n    <template v-for=\"item of getOptions\" :key=\"item.key\">\n      <a-select-option :value=\"item.value\" :getPopupContainer=\"getParentContainer\">\n        <span :class=\"item.class\" :style=\"item.style\">{{ item.text }}</span>\n      </a-select-option>\n    </template>\n  </a-select>\n</template>\n<script lang=\"ts\">\n  import { computed, defineComponent, onMounted, ref, nextTick, watch } from 'vue';\n  import { useRuleFormItem } from '/@/hooks/component/useFormItem';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { getDictItems } from '/@/api/common/api';\n  import { setPopContainer } from '/@/utils';\n\n  export default defineComponent({\n    name: 'JSelectMultiple',\n    components: {},\n    inheritAttrs: false,\n    props: {\n      value: propTypes.oneOfType([propTypes.string, propTypes.array]),\n      placeholder: {\n        type: String,\n        default: '请选择',\n        required: false,\n      },\n      readOnly: {\n        type: Boolean,\n        required: false,\n        default: false,\n      },\n      options: {\n        type: Array,\n        default: () => [],\n        required: false,\n      },\n      triggerChange: {\n        type: Boolean,\n        required: false,\n        default: true,\n      },\n      spliter: {\n        type: String,\n        required: false,\n        default: ',',\n      },\n      popContainer: {\n        type: String,\n        default: '',\n        required: false,\n      },\n      dictCode: {\n        type: String,\n        required: false,\n      },\n      disabled: {\n        type: Boolean,\n        default: false,\n      },\n      useDicColor: {\n        type: Boolean,\n        default: false,\n      },\n    },\n    emits: ['options-change', 'change', 'input', 'update:value'],\n    setup(props, { emit, refs }) {\n      //console.info(props);\n      const emitData = ref<any[]>([]);\n      const arrayValue = ref<any[]>(!props.value ? [] : props.value.split(props.spliter));\n      const dictOptions = ref<any[]>([]);\n      const attrs = useAttrs();\n      const [state, , , formItemContext] = useRuleFormItem(props, 'value', 'change', emitData);\n\n      // 处理下拉选项\n      const getOptions = computed(() => {\n        if (!Array.isArray(dictOptions.value)) {\n          return [];\n        }\n        return dictOptions.value.map((item, index) => {\n          const {useDicColor} = props;\n          const text = item.text || item.label || item.label || '';\n          const key = item.value + '_' + text + '_' + index;\n          return {\n            key: key,\n            text: text,\n            value: item.value,\n            color: item.color,\n            class: [useDicColor && item.color ? 'colorText' : ''],\n            style: {backgroundColor: `${useDicColor && item.color}`},\n          };\n        });\n      });\n\n      onMounted(() => {\n        if (props.dictCode) {\n          loadDictOptions();\n        } else {\n          dictOptions.value = props.options;\n        }\n      });\n\n      watch(\n          () => props.dictCode,\n          () => {\n            if (props.dictCode) {\n              loadDictOptions();\n            } else {\n              dictOptions.value = props.options;\n            }\n          }\n      );\n\n      watch(\n        () => props.value,\n        (val) => {\n          if (!val) {\n            arrayValue.value = [];\n          } else {\n            arrayValue.value = props.value.split(props.spliter);\n          }\n        }\n      );\n\n      //适用于 动态改变下拉选项的操作\n      watch(()=>props.options, ()=>{\n        if (props.dictCode) {\n          // nothing to do\n        } else {\n          dictOptions.value = props.options;\n        }\n      });\n\n      function onChange(selectedValue) {\n        if (props.triggerChange) {\n          emit('change', selectedValue.join(props.spliter));\n          emit('update:value', selectedValue.join(props.spliter));\n        } else {\n          emit('input', selectedValue.join(props.spliter));\n          emit('update:value', selectedValue.join(props.spliter));\n        }\n        // 代码逻辑说明: 【QQYUN-9110】组件有值校验没消失\n        nextTick(() => {\n          formItemContext?.onFieldChange();\n        });\n      }\n\n      function getParentContainer(node) {\n        if (!props.popContainer) {\n          return node?.parentNode;\n        } else {\n          // 代码逻辑说明: 【QQYUN-9339】有多个modal弹窗内都有下拉字典多选和下拉搜索组件时，打开另一个modal时组件的options不展示\n          return setPopContainer(node, props.popContainer);\n        }\n      }\n\n      // 根据字典code查询字典项\n      function loadDictOptions() {\n        // 代码逻辑说明: 字典数据请求前将参数编码处理，但是不能直接编码，因为可能之前已经编码过了\n        let temp = props.dictCode || '';\n        if (temp.indexOf(',') > 0 && temp.indexOf(' ') > 0) {\n          // 编码后 是不包含空格的\n          temp = encodeURI(temp);\n        }\n        getDictItems(temp).then((res) => {\n          if (res) {\n            dictOptions.value = res.map((item) => ({ value: item.value, label: item.text, color:item.color }));\n            //console.info('res', dictOptions.value);\n          } else {\n            console.error('getDictItems error: : ', res);\n            dictOptions.value = [];\n          }\n        });\n      }\n\n      // 代码逻辑说明: VUEN-1145 下拉多选，搜索时，查不到数据\n      function filterOption(input, option) {\n        return option.children()[0].children.toLowerCase().indexOf(input.toLowerCase()) >= 0;\n      }\n\n      return {\n        state,\n        attrs,\n        getOptions,\n        dictOptions,\n        onChange,\n        arrayValue,\n        getParentContainer,\n        filterOption,\n      };\n    },\n  });\n</script>\n<style scoped lang='less'>\n.colorText{\n  display: inline-block;\n    height: 20px;\n    line-height: 20px;\n    padding: 0 6px;\n    border-radius: 8px;\n    background-color: red;\n    color: #fff;\n    font-size: 12px;\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JSelectPosition.vue",
    "content": "<!--职务选择组件-->\n<template>\n  <div class=\"JSelectPosition\">\n    <JSelectBiz @handleOpen=\"handleOpen\" :loading=\"loadingEcho\" v-bind=\"attrs\" @change=\"(changeValue) => $emit('update:value', changeValue)\"></JSelectBiz>\n    <a-form-item>\n      <PositionSelectModal @register=\"regModal\" @getSelectResult=\"setValue\" v-bind=\"getBindValue\"></PositionSelectModal>\n    </a-form-item>\n  </div>\n</template>\n<script lang=\"ts\">\n  import PositionSelectModal from './modal/PositionSelectModal.vue';\n  import JSelectBiz from './base/JSelectBiz.vue';\n  import { defineComponent, ref, reactive, watchEffect, watch, provide, computed, unref } from 'vue';\n  import { useModal } from '/@/components/Modal';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useRuleFormItem } from '/@/hooks/component/useFormItem';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { SelectValue } from 'ant-design-vue/es/select';\n\n  export default defineComponent({\n    name: 'JSelectPosition',\n    components: {\n      PositionSelectModal,\n      JSelectBiz,\n    },\n    inheritAttrs: false,\n    props: {\n      value: propTypes.oneOfType([propTypes.string, propTypes.array]),\n      labelKey: {\n        type: String,\n        default: 'name',\n      },\n      rowKey: {\n        type: String,\n        default: 'id',\n      },\n      params: {\n        type: Object,\n        default: () => {},\n      },\n    },\n    emits: ['options-change', 'change', 'update:value'],\n    setup(props, { emit, refs }) {\n      const emitData = ref<any[]>();\n      //注册model\n      const [regModal, { openModal }] = useModal();\n      //表单值\n      const [state] = useRuleFormItem(props, 'value', 'change', emitData);\n      //下拉框选项值\n      const selectOptions = ref<SelectValue>([]);\n      //下拉框选中值\n      let selectValues = reactive<any>({\n        value: [],\n        change: false,\n      });\n      // 是否正在加载回显数据\n      const loadingEcho = ref<boolean>(false);\n      //下发 selectOptions,xxxBiz组件接收\n      provide('selectOptions', selectOptions);\n      //下发 selectValues,xxxBiz组件接收\n      provide('selectValues', selectValues);\n      //下发 loadingEcho,xxxBiz组件接收\n      provide('loadingEcho', loadingEcho);\n\n      const tag = ref(false);\n      const attrs = useAttrs();\n\n      /**\n       * 监听组件值\n       */\n      // 代码逻辑说明: 【pull/8014】插槽方式弹窗中取消该数据checkbox的选中状态，需要点击第二次才生效。\n      watch(\n        () => props.value,\n        () => {\n          if (props.value) {\n            initValue();\n          } else {\n            // 代码逻辑说明: 【issues/8233】resetFields时无法重置\n            if (selectValues.value?.length) {\n              selectValues.value = [];\n            }\n          }\n        },\n        { deep: true, immediate: true }\n      );\n\n      /**\n       * 监听selectValues变化\n       */\n      watch(selectValues, () => {\n        if (selectValues) {\n          state.value = selectValues.value;\n        }\n      });\n\n      /**\n       * 打卡弹出框\n       */\n      function handleOpen() {\n        tag.value = true;\n        openModal(true, {\n          isUpdate: false,\n        });\n      }\n\n      /**\n       * 将字符串值转化为数组\n       */\n      function initValue() {\n        let value = props.value ? props.value : [];\n        if (value && typeof value === 'string' && value != 'null' && value != 'undefined') {\n          state.value = value.split(',');\n          selectValues.value = value.split(',');\n        }\n      }\n\n      /**\n       * 设置下拉框的值\n       */\n      function setValue(options, values) {\n        selectOptions.value = options;\n        //emitData.value = values.join(\",\");\n        state.value = values;\n        selectValues.value = values;\n        // 代码逻辑说明: 选择职务组件v-model方式绑定值不生效\n        emit('update:value', values.join(','));\n\n      }\n\n      const getBindValue = Object.assign({}, unref(props), unref(attrs));\n      return {\n        state,\n        getBindValue,\n        attrs,\n        selectOptions,\n        selectValues,\n        loadingEcho,\n        tag,\n        regModal,\n        setValue,\n        handleOpen,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  // 代码逻辑说明: 【QQYUN-9260】必填模式下会影响到弹窗内antd组件的样式\n  .JSelectPosition {\n    > .ant-form-item {\n      display: none;\n    }\n  }\n  .j-select-row {\n    @width: 82px;\n\n    .left {\n      width: calc(100% - @width - 8px);\n    }\n\n    .right {\n      width: @width;\n    }\n\n    .full {\n      width: 100%;\n    }\n\n    :deep(.ant-select-search__field) {\n      display: none !important;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JSelectRole.vue",
    "content": "<!--角色选择组件-->\n<template>\n  <div class=\"JSelectRole\">\n    <JSelectBiz @handleOpen=\"handleOpen\" :loading=\"loadingEcho\" v-bind=\"attrs\"></JSelectBiz>\n    <a-form-item>\n      <RoleSelectModal @register=\"regModal\" @getSelectResult=\"setValue\" v-bind=\"getBindValue\"></RoleSelectModal>\n    </a-form-item>\n  </div>\n</template>\n<script lang=\"ts\">\n  import RoleSelectModal from './modal/RoleSelectModal.vue';\n  import JSelectBiz from './base/JSelectBiz.vue';\n  import { defineComponent, ref, unref, reactive, watchEffect, watch, provide } from 'vue';\n  import { useModal } from '/@/components/Modal';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useRuleFormItem } from '/@/hooks/component/useFormItem';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { SelectValue } from 'ant-design-vue/es/select';\n\n  export default defineComponent({\n    name: 'JSelectRole',\n    components: {\n      RoleSelectModal,\n      JSelectBiz,\n    },\n    inheritAttrs: false,\n    props: {\n      value: propTypes.oneOfType([propTypes.string, propTypes.array]),\n      labelKey: {\n        type: String,\n        default: 'roleName',\n      },\n      rowKey: {\n        type: String,\n        default: 'id',\n      },\n      params: {\n        type: Object,\n        default: () => {},\n      },\n    },\n    emits: ['options-change', 'change', 'update:value'],\n    setup(props, { emit, refs }) {\n      const emitData = ref<any[]>();\n      //注册model\n      const [regModal, { openModal }] = useModal();\n      //表单值\n      const [state] = useRuleFormItem(props, 'value', 'change', emitData);\n      //下拉框选项值\n      const selectOptions = ref<SelectValue>([]);\n      //下拉框选中值\n      let selectValues = reactive<Recordable>({\n        value: [],\n        change: false,\n      });\n      // 是否正在加载回显数据\n      const loadingEcho = ref<boolean>(false);\n      //下发 selectOptions,xxxBiz组件接收\n      provide('selectOptions', selectOptions);\n      //下发 selectValues,xxxBiz组件接收\n      provide('selectValues', selectValues);\n      //下发 loadingEcho,xxxBiz组件接收\n      provide('loadingEcho', loadingEcho);\n\n      const tag = ref(false);\n      const attrs = useAttrs();\n\n      /**\n       * 监听组件值\n       */\n      watchEffect(() => {\n        props.value && initValue();\n        // 查询条件重置的时候，清空界面显示\n        if (!props.value) {\n          selectValues.value = [];\n        }\n      });\n\n      /**\n       * 监听selectValues变化\n       */\n      watch(selectValues, () => {\n        if (selectValues) {\n          state.value = selectValues.value;\n        }\n      });\n\n      /**\n       * 打卡弹出框\n       */\n      function handleOpen() {\n        tag.value = true;\n        openModal(true, {\n          isUpdate: false,\n        });\n      }\n\n      /**\n       * 将字符串值转化为数组\n       */\n      function initValue() {\n        let value = props.value ? props.value : [];\n        if (value && typeof value === 'string' && value != 'null' && value != 'undefined') {\n          state.value = value.split(',');\n          selectValues.value = value.split(',');\n        } else {\n          selectValues.value = value;\n        }\n      }\n\n      /**\n       * 设置下拉框的值\n       */\n      function setValue(options, values) {\n        selectOptions.value = options;\n        //emitData.value = values.join(\",\");\n        state.value = values;\n        selectValues.value = values;\n        // 代码逻辑说明: 【issues/7948】修复JselectRole组件不支持双向绑定\n        emit('update:value', values);\n      }\n      const getBindValue = Object.assign({}, unref(props), unref(attrs));\n      return {\n        state,\n        attrs,\n        getBindValue,\n        selectOptions,\n        selectValues,\n        loadingEcho,\n        tag,\n        regModal,\n        setValue,\n        handleOpen,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  // 代码逻辑说明: 【QQYUN-9260】必填模式下会影响到弹窗内antd组件的样式\n  .JSelectRole {\n    > .ant-form-item {\n      display: none;\n    }\n  }\n  .j-select-row {\n    @width: 82px;\n\n    .left {\n      width: calc(100% - @width - 8px);\n    }\n\n    .right {\n      width: @width;\n    }\n\n    .full {\n      width: 100%;\n    }\n\n    :deep(.ant-select-search__field) {\n      display: none !important;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JSelectUser.vue",
    "content": "<!--用户选择组件-->\n<template>\n  <div class=\"JselectUser\">\n    <JSelectBiz @change=\"handleSelectChange\" @handleOpen=\"handleOpen\" :loading=\"loadingEcho\" v-bind=\"attrs\"></JSelectBiz>\n    <a-form-item>\n      <UserSelectModal\n        :rowKey=\"rowKey\"\n        @register=\"regModal\"\n        @getSelectResult=\"setValue\"\n        v-bind=\"getBindValue\"\n        :excludeUserIdList=\"excludeUserIdList\"\n        @close=\"handleClose\"\n      />\n    </a-form-item>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { unref } from 'vue';\n  import UserSelectModal from './modal/UserSelectModal.vue';\n  import JSelectBiz from './base/JSelectBiz.vue';\n  import { defineComponent, ref, reactive, watchEffect, watch, provide } from 'vue';\n  import { useModal } from '/@/components/Modal';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useRuleFormItem } from '/@/hooks/component/useFormItem';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { SelectValue } from 'ant-design-vue/es/select';\n  import { cloneDeep } from 'lodash-es';\n  export default defineComponent({\n    name: 'JSelectUser',\n    components: {\n      UserSelectModal,\n      JSelectBiz,\n    },\n    inheritAttrs: false,\n    props: {\n      value: propTypes.oneOfType([propTypes.string, propTypes.array]),\n      labelKey: {\n        type: String,\n        default: 'realname',\n      },\n      rowKey: {\n        type: String,\n        default: 'username',\n      },\n      params: {\n        type: Object,\n        default: () => {},\n      },\n      //排除用户id的集合\n      excludeUserIdList:{\n        type: Array,\n        default: () => [],\n      }\n    },\n    emits: ['options-change', 'change', 'update:value'],\n    setup(props, { emit }) {\n      const emitData = ref<any[]>();\n      //注册model\n      const [regModal, { openModal }] = useModal();\n      //表单值\n      // const [state] = useRuleFormItem(props, 'value', 'change', emitData);\n      //下拉框选项值\n      const selectOptions = ref<SelectValue>([]);\n      //下拉框选中值\n      let selectValues = reactive<Recordable>({\n        value: [],\n        change: false,\n      });\n      let tempSave: any = [];\n      // 是否正在加载回显数据\n      const loadingEcho = ref<boolean>(false);\n      //下发 selectOptions,xxxBiz组件接收\n      provide('selectOptions', selectOptions);\n      //下发 selectValues,xxxBiz组件接收\n      provide('selectValues', selectValues);\n      //下发 loadingEcho,xxxBiz组件接收\n      provide('loadingEcho', loadingEcho);\n\n      const tag = ref(false);\n      const attrs = useAttrs();\n\n      /**\n       * 监听组件值\n       */\n      watchEffect(() => {\n        // 代码逻辑说明: [TV360X-840]用户授权，没有选择，点取消，也会回显一个选过的用户\n        tempSave = [];\n        props.value && initValue();\n        // 查询条件重置的时候 界面显示未清空\n        if (!props.value) {\n          selectValues.value = [];\n        }\n      });\n\n      /**\n       * 监听selectValues变化\n       */\n      // watch(selectValues, () => {\n      //   if (selectValues) {\n      //     state.value = selectValues.value;\n      //   }\n      // });\n\n      // 代码逻辑说明: 【QQYUN-5685】5、离职人员可以选自己------------\n      const excludeUserIdList = ref<any>([]);\n      \n      /**\n       * 需要监听一下excludeUserIdList，否则modal获取不到\n       */ \n      watch(()=>props.excludeUserIdList,(data)=>{\n        excludeUserIdList.value = data;\n      },{ immediate: true })\n      \n      /**\n       * 打卡弹出框\n       */\n      function handleOpen() {\n        tag.value = true;\n        openModal(true, {\n          isUpdate: false,\n        });\n      }\n\n      /**\n       * 将字符串值转化为数组\n       */\n      function initValue() {\n        let value = props.value ? props.value : [];\n        if (value && typeof value === 'string' && value != 'null' && value != 'undefined') {\n          // state.value = value.split(',');\n          selectValues.value = value.split(',');\n          tempSave = value.split(',');\n        } else {\n          // 【VUEN-857】兼容数组（行编辑的用法问题）\n          selectValues.value = value;\n          tempSave = cloneDeep(value);\n        }\n      }\n\n      /**\n       * 设置下拉框的值\n       */\n      function setValue(options, values) {\n        selectOptions.value = options;\n        //emitData.value = values.join(\",\");\n        // state.value = values;\n        selectValues.value = values;\n        send(values);\n      }\n      const getBindValue = Object.assign({}, unref(props), unref(attrs));\n      // 代码逻辑说明: 【QQYUN-9366】用户选择组件取消和关闭会把选择数据带入\n      const handleClose = () => {\n        if (tempSave.length) {\n          selectValues.value = cloneDeep(tempSave);\n        } else {\n          send(tempSave);\n        }\n      };\n      const handleSelectChange = (values) => {\n        tempSave = cloneDeep(values);\n        send(tempSave);\n      };\n      const send = (values) => {\n        let result = typeof props.value == \"string\" ? values.join(',') : values;\n        emit('update:value', result);\n        emit('change', result);\n      };\n      return {\n        // state,\n        attrs,\n        selectOptions,\n        getBindValue,\n        selectValues,\n        loadingEcho,\n        tag,\n        regModal,\n        setValue,\n        handleOpen,\n        excludeUserIdList,\n        handleClose,\n        handleSelectChange,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  // 代码逻辑说明: 【QQYUN-9260】必填模式下会影响到弹窗内antd组件的样式\n  .JselectUser {\n    > .ant-form-item {\n      display: none;\n    }\n  }\n  .j-select-row {\n    @width: 82px;\n\n    .left {\n      width: calc(100% - @width - 8px);\n    }\n\n    .right {\n      width: @width;\n    }\n\n    .full {\n      width: 100%;\n    }\n\n    :deep(.ant-select-search__field) {\n      display: none !important;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JSelectUserByDepartment.vue",
    "content": "<!--用户选择组件-->\n<template>\n  <div>\n    <JSelectBiz @handleOpen=\"handleOpen\" :loading=\"loadingEcho\" v-bind=\"attrs\" @change=\"handleSelectChange\"></JSelectBiz>\n    <JSelectUserByDepartmentModal\n      v-if=\"modalShow\"\n      :selectedUser=\"selectOptions\"\n      :modalTitle=\"modalTitle\"\n      :rowKey=\"rowKey\"\n      :labelKey=\"labelKey\"\n      :isRadioSelection=\"isRadioSelection\"\n      :params=\"params\"\n      @register=\"regModal\"\n      @change=\"setValue\"\n      @close=\"() => (modalShow = false)\"\n      v-bind=\"attrs\"\n    ></JSelectUserByDepartmentModal>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, reactive, watch, provide } from 'vue';\n  import JSelectUserByDepartmentModal from './modal/JSelectUserByDepartmentModal.vue';\n  import JSelectBiz from './base/JSelectBiz.vue';\n  import { useModal } from '/@/components/Modal';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { SelectValue } from 'ant-design-vue/es/select';\n  import { isArray, isString, isObject } from '/@/utils/is';\n  import { getTableList as getTableListOrigin } from '/@/api/common/api';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  defineOptions({ name: 'JSelectUserByDepartment' });\n  const props = defineProps({\n    value: propTypes.oneOfType([propTypes.string, propTypes.array]),\n    modalTitle: {\n      type: String,\n      default: '部门用户选择',\n    },\n    rowKey: {\n      type: String,\n      default: 'username',\n    },\n    labelKey: {\n      type: String,\n      default: 'realname',\n    },\n    //查询参数\n    params: {\n      type: Object,\n      default: () => {},\n    },\n    isRadioSelection: {\n      type: Boolean,\n      default: false,\n    },\n  });\n  const emit = defineEmits(['options-change', 'change', 'update:value']);\n  const { createMessage } = useMessage();\n  //注册model\n  const [regModal, { openModal }] = useModal();\n  // 是否显示弹窗\n  const modalShow = ref(false);\n  //下拉框选项值\n  const selectOptions: any = ref<SelectValue>([]);\n  //下拉框选中值\n  let selectValues: any = reactive<object>({\n    value: [],\n    change: false,\n  });\n  // 是否正在加载回显数据\n  const loadingEcho = ref<boolean>(false);\n  //下发 selectOptions,xxxBiz组件接收\n  provide('selectOptions', selectOptions);\n  //下发 selectValues,xxxBiz组件接收\n  provide('selectValues', selectValues);\n  //下发 loadingEcho,xxxBiz组件接收\n  provide('loadingEcho', loadingEcho);\n\n  const attrs: any = useAttrs();\n\n  // 打开弹窗\n  function handleOpen() {\n    modalShow.value = true;\n    setTimeout(() => {\n      openModal(true, {\n        isUpdate: false,\n      });\n    }, 0);\n  }\n  const handleSelectChange = (data) => {\n    selectOptions.value = selectOptions.value.filter((item) => data.includes(item[props.rowKey]));\n    setValue(selectOptions.value);\n  };\n  // 设置下拉框的值\n  const setValue = (data) => {\n    selectOptions.value = data.map((item) => {\n      return {\n        ...item,\n        label: item[props.labelKey],\n        value: item[props.rowKey],\n      };\n    });\n    selectValues.value = data.map((item) => item[props.rowKey]);\n    // 更新value\n    emit('update:value', selectValues.value);\n    // 触发change事件（不转是因为basicForm提交时会自动将字符串转化为数组）\n    emit('change', selectValues.value);\n    // 触发options-change事件\n    emit('options-change', selectOptions.value);\n  };\n  // 翻译\n  const transform = () => {\n    let value = props.value;\n    let len;\n    if (isArray(value) || isString(value)) {\n      if (isArray(value)) {\n        len = value.length;\n        value = value.join(',');\n      } else {\n        len = value.split(',').length;\n      }\n      value = value.trim();\n      if (value) {\n        // 如果value的值在selectedUser中存在，则不请求翻译\n        let isNotRequestTransform = false;\n        isNotRequestTransform = value.split(',').every((value) => !!selectOptions.value.find((item) => item[props.rowKey] === value));\n        if (isNotRequestTransform) {\n          selectValues.value = value.split(',')\n          return;\n        }\n        const params = { isMultiTranslate: true, pageSize: len, [props.rowKey]: value };\n        if (isObject(attrs.params)) {\n          Object.assign(params, attrs.params);\n        }\n        getTableListOrigin(params).then((result: any) => {\n          const records = result.records ?? [];\n          selectValues.value = records.map((item) => item[props.rowKey]);\n          selectOptions.value = records.map((item) => {\n            return {\n              ...item,\n              label: item[props.labelKey],\n              value: item[props.rowKey],\n            };\n          });\n        });\n      }\n    } else {\n      selectValues.value = [];\n    }\n  };\n  // 监听value变化\n  watch(\n    () => props.value,\n    () => {\n      transform();\n    },\n    { deep: true, immediate: true }\n  );\n</script>\n<style lang=\"less\" scoped>\n  .j-select-row {\n    @width: 82px;\n    .left {\n      width: calc(100% - @width - 8px);\n    }\n    .right {\n      width: @width;\n    }\n    .full {\n      width: 100%;\n    }\n    :deep(.ant-select-search__field) {\n      display: none !important;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JSelectUserByDept.vue",
    "content": "<!--用户选择组件-->\n<template>\n  <div>\n    <JSelectBiz @change=\"handleChange\" @handleOpen=\"handleOpen\" :loading=\"loadingEcho\" v-bind=\"attrs\"></JSelectBiz>\n    <UserSelectByDepModal :rowKey=\"rowKey\" @register=\"regModal\" @getSelectResult=\"setValue\" v-bind=\"getBindValue\"></UserSelectByDepModal>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { unref } from 'vue';\n  import UserSelectByDepModal from './modal/UserSelectByDepModal.vue';\n  import JSelectBiz from './base/JSelectBiz.vue';\n  import { defineComponent, ref, reactive, watchEffect, watch, provide } from 'vue';\n  import { useModal } from '/@/components/Modal';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useRuleFormItem } from '/@/hooks/component/useFormItem';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { SelectValue } from 'ant-design-vue/es/select';\n  export default defineComponent({\n    name: 'JSelectUserByDept',\n    components: {\n      UserSelectByDepModal,\n      JSelectBiz,\n    },\n    inheritAttrs: false,\n    props: {\n      value: propTypes.oneOfType([propTypes.string, propTypes.array]),\n      rowKey: {\n        type: String,\n        default: 'username',\n      },\n      labelKey: {\n        type: String,\n        default: 'realname',\n      },\n    },\n    emits: ['options-change', 'change', 'update:value'],\n    setup(props, { emit, refs }) {\n      const emitData = ref<any[]>();\n      //注册model\n      const [regModal, { openModal }] = useModal();\n      //表单值\n      const [state] = useRuleFormItem(props, 'value', 'change', emitData);\n      //下拉框选项值\n      const selectOptions = ref<SelectValue>([]);\n      //下拉框选中值\n      let selectValues = reactive<object>({\n        value: [],\n        change: false,\n      });\n      // 是否正在加载回显数据\n      const loadingEcho = ref<boolean>(false);\n      //下发 selectOptions,xxxBiz组件接收\n      provide('selectOptions', selectOptions);\n      //下发 selectValues,xxxBiz组件接收\n      provide('selectValues', selectValues);\n      //下发 loadingEcho,xxxBiz组件接收\n      provide('loadingEcho', loadingEcho);\n\n      const tag = ref(false);\n      const attrs = useAttrs();\n\n      /**\n       * 监听组件值\n       */\n      watchEffect(() => {\n        initValue();\n      });\n\n      /**\n       * 监听selectValues变化\n       */\n      watch(selectValues, () => {\n        if (selectValues) {\n          // 代码逻辑说明: 【QQYUN-12869】通过部门选择用户组件，必填状态下选择用户后，点击重置后，会出校验信息\n          if (props.value === undefined && selectValues.value?.length == 0) {\n            return;\n          }\n          state.value = selectValues.value;\n        }\n      });\n\n      /**\n       * 打卡弹出框\n       */\n      function handleOpen() {\n        tag.value = true;\n        openModal(true, {\n          isUpdate: false,\n        });\n      }\n\n      /**\n       * 将字符串值转化为数组\n       */\n      function initValue() {\n        let value = props.value ? props.value : [];\n        if (value && typeof value === 'string' && value != 'null' && value != 'undefined') {\n          state.value = value.split(',');\n          selectValues.value = value.split(',');\n        } else {\n          selectValues.value = value;\n        }\n      }\n\n      /**\n       * 设置下拉框的值\n       */\n      function setValue(options, values) {\n        selectOptions.value = options;\n        //emitData.value = values.join(\",\");\n        state.value = values;\n        selectValues.value = values;\n        emit('update:value', values);\n        emit('options-change', options);\n      }\n\n      function handleChange(values) {\n        emit('update:value', values);\n      }\n      const getBindValue = Object.assign({}, unref(props), unref(attrs));\n      return {\n        state,\n        attrs,\n        selectOptions,\n        getBindValue,\n        selectValues,\n        loadingEcho,\n        tag,\n        regModal,\n        setValue,\n        handleOpen,\n        handleChange,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .j-select-row {\n    @width: 82px;\n\n    .left {\n      width: calc(100% - @width - 8px);\n    }\n\n    .right {\n      width: @width;\n    }\n\n    .full {\n      width: 100%;\n    }\n\n    :deep(.ant-select-search__field) {\n      display: none !important;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JSelectUserByDeptPost.vue",
    "content": "<!--用户选择组件-->\n<template>\n  <div>\n    <JSelectBiz @change=\"handleChange\" @handleOpen=\"handleOpen\" :loading=\"loadingEcho\" v-bind=\"attrs\"></JSelectBiz>\n    <UserSelectByDepPostModal :rowKey=\"rowKey\" @register=\"regModal\" @getSelectResult=\"setValue\" v-bind=\"getBindValue\"></UserSelectByDepPostModal>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { unref } from 'vue';\n  import UserSelectByDepPostModal from './modal/UserSelectByDepPostModal.vue';\n  import JSelectBiz from './base/JSelectBiz.vue';\n  import { defineComponent, ref, reactive, watchEffect, watch, provide } from 'vue';\n  import { useModal } from '/@/components/Modal';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useRuleFormItem } from '/@/hooks/component/useFormItem';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { SelectValue } from 'ant-design-vue/es/select';\n  export default defineComponent({\n    name: 'JSelectUserByDeptPost',\n    components: {\n      UserSelectByDepPostModal,\n      JSelectBiz,\n    },\n    inheritAttrs: false,\n    props: {\n      value: propTypes.oneOfType([propTypes.string, propTypes.array]),\n      rowKey: {\n        type: String,\n        default: 'username',\n      },\n      labelKey: {\n        type: String,\n        default: 'realname',\n      },\n    },\n    emits: ['options-change', 'change', 'update:value'],\n    setup(props, { emit, refs }) {\n      const emitData = ref<any[]>();\n      //注册model\n      const [regModal, { openModal }] = useModal();\n      //表单值\n      const [state] = useRuleFormItem(props, 'value', 'change', emitData);\n      //下拉框选项值\n      const selectOptions = ref<SelectValue>([]);\n      //下拉框选中值\n      let selectValues = reactive<object>({\n        value: [],\n        change: false,\n      });\n      // 是否正在加载回显数据\n      const loadingEcho = ref<boolean>(false);\n      //下发 selectOptions,xxxBiz组件接收\n      provide('selectOptions', selectOptions);\n      //下发 selectValues,xxxBiz组件接收\n      provide('selectValues', selectValues);\n      //下发 loadingEcho,xxxBiz组件接收\n      provide('loadingEcho', loadingEcho);\n\n      const tag = ref(false);\n      const attrs = useAttrs();\n\n      /**\n       * 监听组件值\n       */\n      watchEffect(() => {\n        initValue();\n      });\n\n      /**\n       * 监听selectValues变化\n       */\n      watch(selectValues, () => {\n        if (selectValues) {\n          // 代码逻辑说明: 【QQYUN-12869】通过部门选择用户组件，必填状态下选择用户后，点击重置后，会出校验信息\n          if (props.value === undefined && selectValues.value?.length == 0) {\n            return;\n          }\n          state.value = selectValues.value;\n        }\n      });\n\n      /**\n       * 打卡弹出框\n       */\n      function handleOpen() {\n        tag.value = true;\n        openModal(true, {\n          isUpdate: false,\n        });\n      }\n\n      /**\n       * 将字符串值转化为数组\n       */\n      function initValue() {\n        let value = props.value ? props.value : [];\n        if (value && typeof value === 'string' && value != 'null' && value != 'undefined') {\n          state.value = value.split(',');\n          selectValues.value = value.split(',');\n        } else {\n          selectValues.value = value;\n        }\n      }\n\n      /**\n       * 设置下拉框的值\n       */\n      function setValue(options, values) {\n        selectOptions.value = options;\n        //emitData.value = values.join(\",\");\n        state.value = values;\n        selectValues.value = values;\n        emit('update:value', values);\n        emit('options-change', options);\n      }\n\n      function handleChange(values) {\n        emit('update:value', values);\n      }\n      const getBindValue = Object.assign({}, unref(props), unref(attrs));\n      return {\n        state,\n        attrs,\n        selectOptions,\n        getBindValue,\n        selectValues,\n        loadingEcho,\n        tag,\n        regModal,\n        setValue,\n        handleOpen,\n        handleChange,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .j-select-row {\n    @width: 82px;\n\n    .left {\n      width: calc(100% - @width - 8px);\n    }\n\n    .right {\n      width: @width;\n    }\n\n    .full {\n      width: 100%;\n    }\n\n    :deep(.ant-select-search__field) {\n      display: none !important;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JSwitch.vue",
    "content": "<template>\n  <div :class=\"prefixCls\">\n    <a-select\n      v-if=\"query\"\n      v-model:value=\"state\"\n      :options=\"selectOptions\"\n      :disabled=\"disabled\"\n      style=\"width: 100%\"\n      v-bind=\"attrs\"\n      @change=\"onSelectChange\"\n    />\n    <a-switch v-else v-model:checked=\"checked\" :disabled=\"disabled\" v-bind=\"attrs\" @change=\"onSwitchChange\" />\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { computed, ref, watch } from 'vue';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useRuleFormItem } from '/@/hooks/component/useFormItem';\n  const { prefixCls } = useDesign('j-switch');\n  const props = defineProps({\n    // v-model:value\n    value: propTypes.oneOfType([propTypes.string, propTypes.number]),\n    // 取值 options\n    options: propTypes.array.def(() => ['Y', 'N']),\n    // 文本 options\n    labelOptions: propTypes.array.def(() => ['是', '否']),\n    // 是否使用下拉\n    query: propTypes.bool.def(false),\n    // 是否禁用\n    disabled: propTypes.bool.def(false),\n  });\n  const attrs = useAttrs();\n  const emit = defineEmits(['change', 'update:value']);\n\n  const checked = ref<boolean>(false);\n  const [state] = useRuleFormItem(props, 'value', 'change');\n  watch(\n    () => props.value,\n    (val) => {\n      if (!props.query) {\n        // 代码逻辑说明: 【QQYUN-7473】options使用[0,1]，导致开关无法切换\n        if (!val && !props.options.includes(val)) {\n          checked.value = false;\n          emitValue(props.options[1]);\n        } else {\n          checked.value = props.options[0] == val;\n        }\n      }\n    },\n    { immediate: true }\n  );\n\n  const selectOptions = computed(() => {\n    let options: any[] = [];\n    options.push({ value: props.options[0], label: props.labelOptions[0] });\n    options.push({ value: props.options[1], label: props.labelOptions[1] });\n    return options;\n  });\n\n  function onSwitchChange(checked) {\n    let flag = checked === false ? props.options[1] : props.options[0];\n    emitValue(flag);\n  }\n\n  function onSelectChange(value) {\n    emitValue(value);\n  }\n\n  function emitValue(value) {\n    emit('change', value);\n    emit('update:value', value);\n  }\n</script>\n\n<style lang=\"less\">\n  //noinspection LessUnresolvedVariable\n  @prefix-cls: ~'@{namespace}-j-switch';\n\n  .@{prefix-cls} {\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JTreeDict.vue",
    "content": "<template>\n  <TreeSelect\n    :class=\"prefixCls\"\n    :value=\"treeValue\"\n    :treeData=\"treeData\"\n    :loadData=\"asyncLoadTreeData\"\n    allowClear\n    labelInValue\n    :dropdownStyle=\"{ maxHeight: '400px', overflow: 'auto' }\"\n    style=\"width: 100%\"\n    v-bind=\"attrs\"\n    @change=\"onChange\"\n  >\n  </TreeSelect>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, watch } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { TreeSelect } from 'ant-design-vue';\n\n  enum Api {\n    view = '/sys/category/loadOne',\n    root = '/sys/category/loadTreeRoot',\n    children = '/sys/category/loadTreeChildren',\n  }\n\n  const { prefixCls } = useDesign('j-tree-dict');\n  const props = defineProps({\n    // v-model:value\n    value: propTypes.string.def(''),\n    field: propTypes.string.def('id'),\n    parentCode: propTypes.string.def(''),\n    async: propTypes.bool.def(false),\n  });\n  const attrs = useAttrs();\n  const emit = defineEmits(['change', 'update:value']);\n\n  const treeData = ref<any[]>([]);\n  const treeValue = ref<any>(null);\n\n  watch(\n    () => props.value,\n    () => loadViewInfo(),\n    { deep: true, immediate: true }\n  );\n  watch(\n    () => props.parentCode,\n    () => loadRoot(),\n    { deep: true, immediate: true }\n  );\n\n  async function loadViewInfo() {\n    if (!props.value || props.value == '0') {\n      treeValue.value = { value: null, label: null };\n    } else {\n      let params = { field: props.field, val: props.value };\n      let result = await defHttp.get({ url: Api.view, params });\n      treeValue.value = {\n        value: props.value,\n        label: result.name,\n      };\n    }\n  }\n\n  async function loadRoot() {\n    let params = {\n      async: props.async,\n      pcode: props.parentCode,\n    };\n    let result = await defHttp.get({ url: Api.root, params });\n    treeData.value = [...result];\n    handleTreeNodeValue(result);\n  }\n\n  async function asyncLoadTreeData(treeNode) {\n    if (!props.async || treeNode.dataRef.children) {\n      return Promise.resolve();\n    }\n    let pid = treeNode.dataRef.key;\n    let params = { pid: pid };\n    let result = await defHttp.get({ url: Api.children, params });\n    handleTreeNodeValue(result);\n    addChildren(pid, result, treeData.value);\n    treeData.value = [...treeData.value];\n    return Promise.resolve();\n  }\n\n  function addChildren(pid, children, treeArray) {\n    if (treeArray && treeArray.length > 0) {\n      for (let item of treeArray) {\n        if (item.key == pid) {\n          if (!children || children.length == 0) {\n            item.leaf = true;\n          } else {\n            item.children = children;\n          }\n          break;\n        } else {\n          addChildren(pid, children, item.children);\n        }\n      }\n    }\n  }\n\n  function handleTreeNodeValue(result) {\n    let storeField = props.field == 'code' ? 'code' : 'key';\n    for (let i of result) {\n      i.value = i[storeField];\n      i.isLeaf = i.leaf;\n      if (i.children && i.children.length > 0) {\n        handleTreeNodeValue(i.children);\n      }\n    }\n  }\n\n  function onChange(value) {\n    if (!value) {\n      emitValue('');\n    } else {\n      emitValue(value.value);\n    }\n    treeValue.value = value;\n  }\n\n  function emitValue(value) {\n    emit('change', value);\n    emit('update:value', value);\n  }\n</script>\n\n<style lang=\"less\">\n  //noinspection LessUnresolvedVariable\n  @prefix-cls: ~'@{namespace}-j-tree-dict';\n\n  .@{prefix-cls} {\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JTreeSelect.vue",
    "content": "<template>\n  <a-tree-select\n    v-if=\"show\"\n    allowClear\n    labelInValue\n    style=\"width: 100%\"\n    :getPopupContainer=\"(node) => node?.parentNode\"\n    :dropdownStyle=\"{ maxHeight: '400px', overflow: 'auto' }\"\n    :placeholder=\"placeholder\"\n    :loadData=\"asyncLoadTreeData\"\n    :value=\"treeValue\"\n    :treeData=\"treeData\"\n    :multiple=\"multiple\"\n    v-bind=\"attrs\"\n    @change=\"onChange\"\n    @search=\"onSearch\"\n    :tree-checkable=\"treeCheckAble\"\n    :tagRender=\"tagRender\"\n  >\n    <template #[name]=\"data\" v-for=\"name in slotNamesGroup\" :key=\"name\">\n      <slot :name=\"name\" v-bind=\"data\"></slot>\n    </template>\n  </a-tree-select>\n</template>\n<script lang=\"ts\" setup>\n  /*\n   * 异步树加载组件 通过传入表名 显示字段 存储字段 加载一个树控件\n   * <j-tree-select dict=\"aa_tree_test,aad,id\" pid-field=\"pid\" ></j-tree-select>\n   * */\n  import { ref, watch, unref, nextTick, computed } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { TreeSelect } from 'ant-design-vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { isObject, isArray } from '/@/utils/is';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  enum Api {\n    url = '/sys/dict/loadTreeData',\n    view = '/sys/dict/loadDictItem/',\n  }\n\n  const props = defineProps({\n    value: propTypes.string.def(''),\n    placeholder: propTypes.string.def('请选择'),\n    dict: propTypes.string.def('id'),\n    parentCode: propTypes.string.def(''),\n    pidField: propTypes.string.def('pid'),\n    // 代码逻辑说明: JTreeSelect组件pidValue还原成空，否则会影响自定义组件树示例------------\n    pidValue: propTypes.string.def(''),\n    hasChildField: propTypes.string.def(''),\n    converIsLeafVal: propTypes.integer.def(1),\n    condition: propTypes.string.def(''),\n    multiple: propTypes.bool.def(false),\n    loadTriggleChange: propTypes.bool.def(false),\n    reload: propTypes.number.def(1),\n    // 代码逻辑说明: issues/4173 Online JTreeSelect控件changeOptions方法未生效\n    url: propTypes.string.def(''),\n    params: propTypes.object.def({}),\n    //默认没有选择框\n    treeCheckAble: propTypes.bool.def(false),\n    hiddenNodeKey: propTypes.string.def(''),\n    //多选时渲染tag文本\n    tagRender: propTypes.func,\n  });\n  const attrs = useAttrs();\n  const { t } = useI18n();\n  const emit = defineEmits(['change', 'update:value']);\n  const slots = defineSlots();\n  const { createMessage } = useMessage();\n  //树形下拉数据\n  const treeData = ref<any[]>([]);\n  //选择数据\n  const treeValue = ref<any>(null);\n  const tableName = ref<any>('');\n  const text = ref<any>('');\n  const code = ref<any>('');\n  const show = ref<boolean>(true);\n  /**\n   * 监听value数据并初始化\n   */\n  watch(\n    () => props.value,\n    () => loadItemByCode(),\n    { deep: true, immediate: true }\n  );\n  /**\n   * 监听dict变化\n   */\n  // 代码逻辑说明: 【issues/1283】JtreeSelect组件初始调用了两次接口\n  watch(\n    () => props.dict,\n    () => {\n      initDictInfo();\n      loadRoot();\n    }\n  );\n  // 代码逻辑说明: 【TV360X-87】树表编辑时不可选自己及子孙节点当父节点\n  watch(\n    () => props.hiddenNodeKey,\n    () => {\n      if (treeData.value?.length && props.hiddenNodeKey) {\n        handleHiddenNode(treeData.value);\n        treeData.value = [...treeData.value];\n      }\n    }\n  );\n\n  // 代码逻辑说明: VUEN-1056 15、严重——online树表单，添加的时候，父亲节点是空的\n  watch(\n    () => props.reload,\n    async () => {\n      treeData.value = [];\n      // 代码逻辑说明: 【TV360X-88】online树表重复新增时父节点数据加载不全且已开的子节点不重新加载\n      show.value = false;\n      nextTick(() => {\n        show.value = true;\n      });\n      await loadRoot();\n    },\n    {\n      immediate: false,\n    }\n  );\n\n  /**\n   * 根据code获取下拉数据并回显\n   */\n  async function loadItemByCode() {\n    if (!props.value || props.value == '0') {\n      if(props.multiple){\n        treeValue.value = [];\n      }else{\n        treeValue.value = { label: null, value: null };\n      }\n    } else {\n      // 代码逻辑说明: issues/4173 Online JTreeSelect控件changeOptions方法未生效\n      if(props.url){\n        getItemFromTreeData();\n      }else{\n        // 代码逻辑说明: 【issues/8093】选择节点后会先变成编码再显示label文字\n        if (props.value) {\n          if (isArray(treeValue.value)) {\n            let isNotRequestTransform = false;\n            const value = isArray(props.value) ? props.value : props.value.split(',');\n            isNotRequestTransform = value.every((value) => !!treeValue.value.find((item) => item.value === value));\n            if (isNotRequestTransform) {\n              return;\n            }\n          } else if (isObject(treeValue.value) && unref(treeValue).label != null) {\n            if (props.value == unref(treeValue).value) {\n              // 不需要再去请求翻译\n              return;\n            }\n          }\n        }\n        let params = { key: props.value };\n        let result = await defHttp.get({ url: `${Api.view}${props.dict}`, params }, { isTransformResponse: false });\n        if (result.success) {\n          if(props.multiple){\n            let values = props.value.split(',');\n            treeValue.value = result.result.map((item, index) => ({\n              key: values[index],\n              value: values[index],\n              label: translateTitle(item),\n            }));\n          }else{\n            treeValue.value = { key: props.value, value: props.value, label: translateTitle(result.result[0]) };\n          }\n          onLoadTriggleChange(result.result[0]);\n        }\n      }\n    }\n  }\n\n  function onLoadTriggleChange(text) {\n    //只有单选才会触发\n    if (!props.multiple && props.loadTriggleChange) {\n      emit('change', props.value, text);\n    }\n  }\n\n  /**\n   * 初始化数据\n   */\n  function initDictInfo() {\n    let arr = props.dict?.split(',');\n    tableName.value = arr[0];\n    text.value = arr[1];\n    code.value = arr[2];\n  }\n\n  /**\n   * 加载下拉树形数据\n   */\n  async function loadRoot() {\n    let params = {\n      pid: props.pidValue,\n      pidField: props.pidField,\n      hasChildField: props.hasChildField,\n      converIsLeafVal: props.converIsLeafVal,\n      condition: props.condition,\n      tableName: unref(tableName),\n      text: unref(text),\n      code: unref(code),\n    };\n    let res = await defHttp.get({ url: Api.url, params }, { isTransformResponse: false });\n    if (res.success && res.result) {\n      for (let i of res.result) {\n        i.title = translateTitle(i.title);\n        i.value = i.key;\n        i.isLeaf = !!i.leaf;\n      }\n      // 代码逻辑说明: 【TV360X-87】树表编辑时不可选自己及子孙节点当父节点\n      handleHiddenNode(res.result);\n      treeData.value = [...res.result];\n    } else {\n      console.log('数根节点查询结果异常', res);\n    }\n  }\n\n  /**\n   * 翻译\n   * @param text\n   */\n  function translateTitle(text) {\n    if (text.includes(\"t('\") && t) {\n      return new Function('t', `return ${text}`)(t);\n    }\n    return text;\n  }\n  /**\n   * 异步加载数据\n   */\n  async function asyncLoadTreeData(treeNode) {\n    if (treeNode.dataRef.children) {\n      return Promise.resolve();\n    }\n    if (props.url) {\n      return Promise.resolve();\n    }\n    let pid = treeNode.dataRef.key;\n    let params = {\n      pid: pid,\n      pidField: props.pidField,\n      hasChildField: props.hasChildField,\n      converIsLeafVal: props.converIsLeafVal,\n      condition: props.condition,\n      tableName: unref(tableName),\n      text: unref(text),\n      code: unref(code),\n    };\n    let res = await defHttp.get({ url: Api.url, params }, { isTransformResponse: false });\n    if (res.success) {\n      for (let i of res.result) {\n        i.title = translateTitle(i.title);\n        i.value = i.key;\n        i.isLeaf = !!i.leaf;\n      }\n      // 代码逻辑说明: 【TV360X-87】树表编辑时不可选自己及子孙节点当父节点\n      handleHiddenNode(res.result);\n      //添加子节点\n      addChildren(pid, res.result, treeData.value);\n      treeData.value = [...treeData.value];\n    }\n    return Promise.resolve();\n  }\n\n  /**\n   * 加载子节点\n   */\n  function addChildren(pid, children, treeArray) {\n    if (treeArray && treeArray.length > 0) {\n      for (let item of treeArray) {\n        if (item.key == pid) {\n          if (!children || children.length == 0) {\n            item.isLeaf = true;\n          } else {\n            item.children = children;\n          }\n          break;\n        } else {\n          addChildren(pid, children, item.children);\n        }\n      }\n    }\n  }\n\n  /**\n   * 选中树节点事件\n   */\n  function onChange(value) {\n    if (!value) {\n      emitValue('');\n    } else if (value instanceof Array) {\n      emitValue(value.map((item) => item.value).join(','));\n    } else {\n      emitValue(value.value);\n    }\n    // 代码逻辑说明: 【issues/8093】删除后会先变成编码再显示label文字\n    if (isArray(value)) {\n      // 编辑删除时有选中的值是异步（第二级以上的）会不显示label\n      value.forEach((item) => {\n        if (item.label === undefined && item.value != null) {\n          const findItem = treeValue.value.find((o) => o.value === item.value);\n          if (findItem) {\n            item.label = findItem.label;\n          }\n        }\n      });\n      treeValue.value = value;\n    } else {\n      treeValue.value = value;\n    }\n  }\n\n  function emitValue(value) {\n    emit('change', value);\n    emit('update:value', value);\n  }\n\n  /**\n   * 文本框值变化\n   */\n  function onSearch(value) {\n    console.log(value);\n  }\n\n  /**\n   * 校验条件配置是否有误\n   */\n  function validateProp() {\n    let mycondition = props.condition;\n    return new Promise((resolve, reject) => {\n      if (!mycondition) {\n        resolve();\n      } else {\n        try {\n          let test = JSON.parse(mycondition);\n          if (typeof test == 'object' && test) {\n            resolve();\n          } else {\n            createMessage.error('组件JTreeSelect-condition传值有误，需要一个json字符串!');\n            reject();\n          }\n        } catch (e) {\n          createMessage.error('组件JTreeSelect-condition传值有误，需要一个json字符串!');\n          reject();\n        }\n      }\n    });\n  }\n\n  // 代码逻辑说明: issues/4173 Online JTreeSelect控件changeOptions方法未生效\n  watch(()=>props.url, async (val)=>{\n    if(val){\n      await loadRootByUrl();\n    }\n  });\n\n  /**\n   * 根据自定义的请求地址加载数据\n   */\n  async function loadRootByUrl(){\n    let url = props.url;\n    let params = props.params;\n    let res = await defHttp.get({ url, params }, { isTransformResponse: false });\n    if (res.success && res.result) {\n      for (let i of res.result) {\n        i.title = translateTitle(i.title);\n        i.key = i.value;\n        i.isLeaf = !!i.leaf;\n      }\n      // 代码逻辑说明: 【TV360X-87】树表编辑时不可选自己及子孙节点当父节点\n      handleHiddenNode(res.result);\n      treeData.value = [...res.result];\n    } else {\n      console.log('数根节点查询结果异常', res);\n    }\n  }\n\n  /**\n   * 根据已有的树数据 翻译选项\n   */\n  function getItemFromTreeData(){\n    let data = treeData.value;\n    let arr = []\n    findChildrenNode(data, arr);\n    if(arr.length>0){\n      treeValue.value = arr\n      onLoadTriggleChange(arr[0]);\n    }\n  }\n\n  /**\n   * 递归找子节点\n   * @param data\n   * @param arr\n   */\n  function findChildrenNode(data, arr){\n    let val = props.value;\n    if(data && data.length){\n      for(let item of data){\n        if(val===item.value){\n          arr.push({\n            key: item.key,\n            value: item.value,\n            label: item.label||item.title\n          })\n        }else{\n          findChildrenNode(item.children, arr)\n        }\n      }\n    }\n  }\n\n  /**\n   * 2024-05-23\n   * liaozhiyang\n   * 过滤掉指定节点(包含其子孙节点)\n   */\n  function handleHiddenNode(data) {\n    if (props.hiddenNodeKey && data?.length) {\n      for (let i = 0, len = data.length; i < len; i++) {\n        const item = data[i];\n        if (item.key == props.hiddenNodeKey) {\n          data.splice(i, 1);\n          i--;\n          len--;\n          return;\n        }\n      }\n    }\n  }\n  /**\n   * 2024-07-30\n   * liaozhiyang\n   * 【issues/6953】JTreeSelect 组件能支持antdv 对应的a-tree-select 组件的插槽\n   */\n  const slotNamesGroup = computed(() => {\n    const native: string[] = [];\n    if (isObject(slots)) {\n      for (const name of Object.keys(slots)) {\n        native.push(name);\n      }\n    }\n    return native;\n  });\n  // onCreated\n  validateProp().then(() => {\n    initDictInfo();\n    loadRoot();\n    loadItemByCode();\n  });\n</script>\n\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JUpload/JUpload.vue",
    "content": "<template>\n  <div ref=\"containerRef\" :class=\"`${prefixCls}-container`\">\n    <a-upload\n      :headers=\"headers\"\n      :multiple=\"multiple\"\n      :action=\"uploadUrl\"\n      :fileList=\"fileList\"\n      :disabled=\"disabled\"\n      v-bind=\"bindProps\"\n      @remove=\"onRemove\"\n      @change=\"onFileChange\"\n      @preview=\"onFilePreview\"\n    >\n      <template v-if=\"isImageMode\">\n        <div v-if=\"!isMaxCount\">\n          <Icon icon=\"ant-design:plus-outlined\" />\n          <div class=\"ant-upload-text\">{{ text }}</div>\n        </div>\n      </template>\n      <a-button v-else-if=\"buttonVisible\" :disabled=\"buttonDisabled\">\n        <Icon icon=\"ant-design:upload-outlined\" />\n        <span>{{ text }}</span>\n      </a-button>\n    </a-upload>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, reactive, computed, watch, nextTick, createApp,unref } from 'vue';\n  import { Icon } from '/@/components/Icon';\n  import { getToken } from '/@/utils/auth';\n  import { uploadUrl } from '/@/api/common/api';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { createImgPreview } from '/@/components/Preview/index';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { UploadTypeEnum } from './upload.data';\n  import { getFileAccessHttpUrl, getHeaders } from '/@/utils/common/compUtils';\n  import UploadItemActions from './components/UploadItemActions.vue';\n  import { split } from '/@/utils/index';\n\n  const { createMessage, createConfirm } = useMessage();\n  const { prefixCls } = useDesign('j-upload');\n  const attrs = useAttrs();\n  const emit = defineEmits(['change', 'update:value']);\n  const props = defineProps({\n    value: propTypes.oneOfType([propTypes.string, propTypes.array]),\n    text: propTypes.string.def('上传'),\n    fileType: propTypes.string.def(UploadTypeEnum.all),\n    /*这个属性用于控制文件上传的业务路径*/\n    bizPath: propTypes.string.def('temp'),\n    /**\n     * 是否返回url，\n     * true：仅返回url\n     * false：返回fileName filePath fileSize\n     */\n    returnUrl: propTypes.bool.def(true),\n    // 最大上传数量\n    maxCount: propTypes.number.def(0),\n    buttonVisible: propTypes.bool.def(true),\n    multiple: propTypes.bool.def(true),\n    // 是否显示左右移动按钮\n    mover: propTypes.bool.def(true),\n    // 是否显示下载按钮\n    download: propTypes.bool.def(true),\n    // 删除时是否显示确认框\n    removeConfirm: propTypes.bool.def(false),\n    beforeUpload: propTypes.func,\n    disabled: propTypes.bool.def(false),\n    // 替换前一个文件，用于超出最大数量依然允许上传\n    replaceLastOne: propTypes.bool.def(false),\n  });\n\n  const headers = getHeaders();\n  const fileList = ref<any[]>([]);\n  const uploadGoOn = ref<boolean>(true);\n  // refs\n  const containerRef = ref();\n  // 是否达到了最大上传数量\n  const isMaxCount = computed(() => props.maxCount > 0 && fileList.value.length >= props.maxCount);\n  // 当前是否是上传图片模式\n  const isImageMode = computed(() => props.fileType === UploadTypeEnum.image);\n  // 上传按钮是否禁用\n  const buttonDisabled = computed(()=>{\n    if(props.disabled === true){\n      return true;\n    }\n    if(isMaxCount.value === true){\n      if(props.replaceLastOne === true){\n        return false\n      }else{\n        return true;\n      }\n    }\n    return false\n  });\n  // 合并 props 和 attrs\n  const bindProps = computed(() => {\n    // 代码逻辑说明: [issue/455]上传组件传入accept限制上传文件类型无效\n    const bind: any = Object.assign({}, props, unref(attrs));\n\n    bind.name = 'file';\n    bind.listType = isImageMode.value ? 'picture-card' : 'text';\n    bind.class = [bind.class, { 'upload-disabled': props.disabled }];\n    bind.data = { biz: props.bizPath, ...bind.data };\n    // 代码逻辑说明: 自定义beforeUpload return false，并不能中断上传过程\n    if (!bind.beforeUpload) {\n      bind.beforeUpload = onBeforeUpload;\n    }\n    // 如果当前是图片上传模式，就只能上传图片\n    if (isImageMode.value && !bind.accept) {\n      bind.accept = 'image/*';\n    }\n    return bind;\n  });\n\n  watch(\n    () => props.value,\n    (val) => {\n      if (Array.isArray(val)) {\n        if (props.returnUrl) {\n          parsePathsValue(val.join(','));\n        } else {\n          parseArrayValue(val);\n        }\n      } else {\n        // 代码逻辑说明: [issues/5327]Upload组件returnUrl为false时上传的字段值返回了一个'[object Object]' ------------\n        if (props.returnUrl) {\n          parsePathsValue(val);\n        } else {\n          val && parseArrayValue(JSON.parse(val));\n        }\n      }\n    },\n    { immediate: true }\n  );\n\n  watch(fileList, () => nextTick(() => addActionsListener()), { immediate: true });\n\n  const antUploadItemCls = 'ant-upload-list-item';\n\n  // Listener\n  function addActionsListener() {\n    if (!isImageMode.value) {\n      return;\n    }\n    const uploadItems = containerRef.value ? containerRef.value.getElementsByClassName(antUploadItemCls) : null;\n    if (!uploadItems || uploadItems.length === 0) {\n      return;\n    }\n    for (const uploadItem of uploadItems) {\n      let hasActions = uploadItem.getAttribute('data-has-actions') === 'true';\n      if (!hasActions) {\n        uploadItem.addEventListener('mouseover', onAddActionsButton);\n      }\n    }\n  }\n\n  // 添加可左右移动的按钮\n  function onAddActionsButton(event) {\n    const getUploadItem = () => {\n      for (const path of event.path) {\n        if (path.classList.contains(antUploadItemCls)) {\n          return path;\n        } else if (path.classList.contains(`${prefixCls}-container`)) {\n          return null;\n        }\n      }\n      return null;\n    };\n    const uploadItem = getUploadItem();\n    if (!uploadItem) {\n      return;\n    }\n    const actions = uploadItem.getElementsByClassName('ant-upload-list-item-actions');\n    if (!actions || actions.length === 0) {\n      return;\n    }\n    // 添加操作按钮\n    const div = document.createElement('div');\n    div.className = 'upload-actions-container';\n    createApp(UploadItemActions, {\n      element: uploadItem,\n      fileList: fileList,\n      mover: props.mover,\n      download: props.download,\n      emitValue: emitValue,\n    }).mount(div);\n    actions[0].appendChild(div);\n    uploadItem.setAttribute('data-has-actions', 'true');\n    uploadItem.removeEventListener('mouseover', onAddActionsButton);\n  }\n\n  // 解析数据库存储的逗号分割\n  function parsePathsValue(paths) {\n    if (!paths || paths.length == 0) {\n      fileList.value = [];\n      return;\n    }\n    let list: any[] = [];\n    // 代码逻辑说明: 【issues/7990】图片参数中包含逗号会错误的识别成多张图\n    const result = split(paths);\n    for (const item of result) {\n      let url = getFileAccessHttpUrl(item);\n      list.push({\n        uid: uidGenerator(),\n        name: getFileName(item),\n        status: 'done',\n        url: url,\n        response: { status: 'history', message: item },\n      });\n    }\n    fileList.value = list;\n  }\n\n  // 解析数组值\n  function parseArrayValue(array) {\n    if (!array || array.length == 0) {\n      fileList.value = [];\n      return;\n    }\n    let list: any[] = [];\n    for (const item of array) {\n      let url = getFileAccessHttpUrl(item.filePath);\n      list.push({\n        uid: uidGenerator(),\n        name: item.fileName,\n        url: url,\n        status: 'done',\n        response: { status: 'history', message: item.filePath },\n      });\n    }\n    fileList.value = list;\n  }\n\n  // 文件上传之前的操作\n  function onBeforeUpload(file) {\n    uploadGoOn.value = true;\n    if (isImageMode.value) {\n      if (file.type.indexOf('image') < 0) {\n        createMessage.warning('请上传图片');\n        uploadGoOn.value = false;\n        return false;\n      }\n    }\n    // 扩展 beforeUpload 验证\n    if (typeof props.beforeUpload === 'function') {\n      return props.beforeUpload(file);\n    }\n    return true;\n  }\n\n  // 删除处理事件\n  function onRemove() {\n    if (props.removeConfirm) {\n      return new Promise((resolve) => {\n        createConfirm({\n          title: '删除',\n          content: `确定要删除这${isImageMode.value ? '张图片' : '个文件'}吗？`,\n          iconType: 'warning',\n          onOk: () => resolve(true),\n          onCancel: () => resolve(false),\n        });\n      });\n    }\n    return true;\n  }\n\n  // upload组件change事件\n  function onFileChange(info) {\n    if (!info.file.status && uploadGoOn.value === false) {\n      info.fileList.pop();\n    }\n    let fileListTemp = info.fileList;\n    // 限制最大上传数\n    if (props.maxCount > 0) {\n      let count = fileListTemp.length;\n      if (count >= props.maxCount) {\n        let diffNum = props.maxCount - fileListTemp.length;\n        if (diffNum >= 0) {\n          fileListTemp = fileListTemp.slice(-props.maxCount);\n        } else {\n          return;\n        }\n      }\n    }\n    if (info.file.status === 'done') {\n      let successFileList = [];\n      if (info.file.response.success) {\n        successFileList = fileListTemp.map((file) => {\n          if (file.response) {\n            let reUrl = file.response.message;\n            file.url = getFileAccessHttpUrl(reUrl);\n          }\n          return file;\n        });\n      }else{\n        successFileList = fileListTemp.filter(item=>{\n          return item.uid!=info.file.uid;\n        });\n        createMessage.error(`${info.file.name} 上传失败.`);\n      }\n      fileListTemp = successFileList;\n    } else if (info.file.status === 'error') {\n      createMessage.error(`${info.file.name} 上传失败.`);\n    }\n    // beforeUpload 返回false，则没有status\n    info.file.status && (fileList.value = fileListTemp);\n    if (info.file.status === 'done' || info.file.status === 'removed') {\n      //returnUrl为true时仅返回文件路径\n      if (props.returnUrl) {\n        handlePathChange();\n      } else {\n        //returnUrl为false时返回文件名称、文件路径及文件大小\n        let newFileList: any[] = [];\n        for (const item of fileListTemp) {\n          if (item.status === 'done') {\n            let fileJson = {\n              fileName: item.name,\n              filePath: item.response.message,\n              fileSize: item.size,\n            };\n            newFileList.push(fileJson);\n          }else{\n            return;\n          }\n        }\n        // 代码逻辑说明: [issues/5327]Upload组件returnUrl为false时上传的字段值返回了一个'[object Object]' ------------\n        emitValue(JSON.stringify(newFileList));\n      }\n    }\n  }\n\n  function handlePathChange() {\n    let uploadFiles = fileList.value;\n    let path = '';\n    if (!uploadFiles || uploadFiles.length == 0) {\n      path = '';\n    }\n    let pathList: string[] = [];\n    for (const item of uploadFiles) {\n      if (item.status === 'done') {\n        pathList.push(item.response.message);\n      } else {\n        return;\n      }\n    }\n    if (pathList.length > 0) {\n      path = pathList.join(',');\n    }\n    emitValue(path);\n  }\n\n  // 预览文件、图片\n  function onFilePreview(file) {\n    if (isImageMode.value) {\n      createImgPreview({ imageList: [file.url], maskClosable: true });\n    } else {\n      window.open(file.url);\n    }\n  }\n\n  function emitValue(value) {\n    emit('change', value);\n    emit('update:value', value);\n  }\n\n  function uidGenerator() {\n    return '-' + parseInt(Math.random() * 10000 + 1, 10);\n  }\n\n  function getFileName(path) {\n    if (path.lastIndexOf('\\\\') >= 0) {\n      let reg = new RegExp('\\\\\\\\', 'g');\n      path = path.replace(reg, '/');\n    }\n    return path.substring(path.lastIndexOf('/') + 1);\n  }\n\n  defineExpose({\n    addActionsListener,\n  });\n</script>\n\n<style lang=\"less\">\n  //noinspection LessUnresolvedVariable\n  @prefix-cls: ~'@{namespace}-j-upload';\n\n  .@{prefix-cls} {\n    &-container {\n      position: relative;\n\n      .upload-disabled {\n        .ant-upload-list-item {\n          .anticon-close {\n            display: none;\n          }\n\n          .anticon-delete {\n            display: none;\n          }\n        }\n\n        /* update-begin-author:taoyan date:2022-5-24 for:VUEN-1093详情界面 图片下载按钮显示不全*/\n        .upload-download-handler {\n          right: 6px !important;\n        }\n        /* update-end-author:taoyan date:2022-5-24 for:VUEN-1093详情界面 图片下载按钮显示不全*/\n      }\n      .ant-upload-text-icon {\n        color: @primary-color;\n      }\n      .ant-upload-list-item {\n        .upload-actions-container {\n          position: absolute;\n          top: -31px;\n          left: -18px;\n          z-index: 11;\n          width: 84px;\n          height: 84px;\n          line-height: 28px;\n          text-align: center;\n          pointer-events: none;\n\n          a {\n            opacity: 0.9;\n            margin: 0 5px;\n            cursor: pointer;\n            transition: opacity 0.3s;\n\n            .anticon {\n              color: #fff;\n              font-size: 16px;\n            }\n\n            &:hover {\n              opacity: 1;\n            }\n          }\n\n          .upload-mover-handler,\n          .upload-download-handler {\n            position: absolute;\n            pointer-events: auto;\n          }\n\n          .upload-mover-handler {\n            width: 100%;\n            bottom: 0;\n          }\n\n          .upload-download-handler {\n            top: -4px;\n            right: -4px;\n          }\n        }\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JUpload/JUploadModal.vue",
    "content": "<template>\n  <BasicModal @register=\"registerModal\" :title=\"modalTitle\" :width=\"width\" @ok=\"handleOk\" v-bind=\"$attrs\">\n    <JUpload ref=\"uploadRef\" :value=\"value\" v-bind=\"uploadBinds.props\" @change=\"emitValue\" />\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, unref, reactive, computed, nextTick } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import JUpload from './JUpload.vue';\n  import { UploadTypeEnum } from './upload.data';\n  import { propTypes } from '/@/utils/propTypes';\n\n  const { createMessage } = useMessage();\n  const emit = defineEmits(['change', 'update:value', 'register']);\n  const props = defineProps({\n    value: propTypes.oneOfType([propTypes.string, propTypes.array]),\n    width: propTypes.number.def(520),\n  });\n\n  const uploadRef = ref();\n  const uploadBinds = reactive({ props: {} as any });\n  const modalTitle = computed(() => (uploadBinds.props?.fileType === UploadTypeEnum.image ? '图片上传' : '文件上传'));\n\n  // 注册弹窗\n  const [registerModal, { closeModal }] = useModalInner(async (data) => {\n    uploadBinds.props = unref(data) || {};\n    if ([UploadTypeEnum.image, 'img', 'picture'].includes(uploadBinds.props?.fileType)) {\n      uploadBinds.props.fileType = UploadTypeEnum.image;\n    } else {\n      uploadBinds.props.fileType = UploadTypeEnum.file;\n    }\n    nextTick(() => uploadRef.value.addActionsListener());\n  });\n\n  function handleOk() {\n    closeModal();\n  }\n\n  function emitValue(value) {\n    emit('change', value);\n    emit('update:value', value);\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JUpload/components/UploadItemActions.vue",
    "content": "<template>\n  <div v-show=\"download\" class=\"upload-download-handler\">\n    <a class=\"download\" title=\"下载\" @click=\"onDownload\">\n      <Icon icon=\"ant-design:download\" />\n    </a>\n  </div>\n  <div v-show=\"mover && list.length > 1\" class=\"upload-mover-handler\">\n    <a title=\"向前移动\" @click=\"onMoveForward\">\n      <Icon icon=\"ant-design:arrow-left\" />\n    </a>\n    <a title=\"向后移动\" @click=\"onMoveBack\">\n      <Icon icon=\"ant-design:arrow-right\" />\n    </a>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { unref, computed } from 'vue';\n  import { Icon } from '/@/components/Icon';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  const { createMessage } = useMessage();\n\n  const props = defineProps({\n    element: { type: HTMLElement, required: true },\n    fileList: { type: Object, required: true },\n    mover: { type: Boolean, required: true },\n    download: { type: Boolean, required: true },\n    emitValue: { type: Function, required: true },\n  });\n  const list = computed(() => unref(props.fileList));\n\n  // 向前移动图片\n  function onMoveForward() {\n    let index = getIndexByUrl();\n    if (index === -1) {\n      createMessage.warn('移动失败：' + index);\n      return;\n    }\n    if (index === 0) {\n      doSwap(index, unref(list).length - 1);\n      return;\n    }\n    doSwap(index, index - 1);\n  }\n\n  // 向后移动图片\n  function onMoveBack() {\n    let index = getIndexByUrl();\n    if (index === -1) {\n      createMessage.warn('移动失败：' + index);\n      return;\n    }\n    if (index == unref(list).length - 1) {\n      doSwap(index, 0);\n      return;\n    }\n    doSwap(index, index + 1);\n  }\n\n  function doSwap(oldIndex, newIndex) {\n    if (oldIndex !== newIndex) {\n      let array: any[] = [...(unref(list) as Array<any>)];\n      let temp = array[oldIndex];\n      array[oldIndex] = array[newIndex];\n      array[newIndex] = temp;\n      props.emitValue(array.map((i) => i.url).join(','));\n    }\n  }\n\n  function getIndexByUrl() {\n    const url = props.element?.getElementsByTagName('img')[0]?.src;\n    if (url) {\n      const fileList: any = unref(list);\n      for (let i = 0; i < fileList.length; i++) {\n        let current = fileList[i].url;\n        const replace = url.replace(window.location.origin, '');\n        if (current === replace || encodeURI(current) === replace) {\n          return i;\n        }\n      }\n    }\n    return -1;\n  }\n\n  function onDownload() {\n    const url = props.element?.getElementsByTagName('img')[0]?.src;\n    window.open(url);\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JUpload/index.ts",
    "content": "export { UploadTypeEnum } from './upload.data';\nexport { default as JUpload } from './JUpload.vue';\nexport { default as JUploadModal } from './JUploadModal.vue';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/JUpload/upload.data.ts",
    "content": "export enum UploadTypeEnum {\n  all = 'all',\n  image = 'image',\n  file = 'file',\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/TreeIcon/TreeIcon.vue",
    "content": "<template>\n  <div>\n    <svg\n      class=\"svg-company\"\n      v-if=\"orgCategory && (orgCategory === '1' || orgCategory === '4')\"\n      viewBox=\"0 0 1024 1024\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      width=\"256\"\n      height=\"256\"\n    >\n      <path\n        d=\"M234.9 226.9c0-25.9 25.1-46.9 56-46.9h226.9c30.5 0 55.3 21.1 55.3 46.9v580.9h40V340.2h132.5c25.9 0 46.9 21.1 46.9 46.9v413.5h40V387.2c0-47.9-39-86.9-86.9-86.9H613v-73.4c0-23.7-10.2-45.8-28.7-62.3-17.9-15.9-41.5-24.7-66.6-24.7H290.9c-52.9 0-96 39-96 86.9v580.9h40V226.9zM145.8 841.2h734.9v40H145.8z\"\n        fill=\"#333333\"\n        p-id=\"10104\"\n      ></path>\n      <path\n        d=\"M286.9 354.1h124.7v40H286.9zM448.1 353.9h63.2v40h-63.2zM286.9 489.1h124.7v40H286.9zM448.1 488.9h63.2v40h-63.2zM286.9 616.6h124.7v40H286.9zM448.1 616.3h63.2v40h-63.2zM638.5 433.1h71v40h-71zM730.2 433h36v40h-36zM638.5 557.9h71v40h-71zM730.2 557.7h36v40h-36zM638.5 684.7h71v40h-71zM730.2 684.5h36v40h-36z\"\n        fill=\"#333333\"\n      ></path>\n    </svg>\n    <svg class=\"svg-depart\" v-if=\"orgCategory === '2'\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" width=\"256\" height=\"256\">\n      <path\n        d=\"M192 384H64V64h320v320H256v256h128v128h384V512h-128V192h320v320h-128v320H384v128H64v-320h128V384z m128 320H128v192h192v-192z m576-448h-192v192h192V256zM320 128H128v192h192V128z\"\n        p-id=\"8946\"\n      ></path>\n    </svg>\n    <svg\n      class=\"svg-post\"\n      v-if=\"orgCategory === '3'\"\n      viewBox=\"0 0 1024 1024\"\n      version=\"1.1\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      p-id=\"11309\"\n      width=\"256\"\n      height=\"256\"\n    >\n      <path\n        d=\"M866.346667 89.6H207.573333C167.253333 89.6 134.4 122.453333 134.4 162.773333v146.346667h64V162.773333c0-5.12 4.266667-9.173333 9.173333-9.173333h658.773334c5.12 0 9.173333 4.053333 9.173333 9.173333v699.946667c0 5.12-4.053333 9.173333-9.173333 9.173333H207.573333c-5.12 0-9.173333-4.053333-9.173333-9.173333v-144h-64v144c0 40.32 32.853333 73.173333 73.173333 73.173333h658.773334c40.32 0 73.173333-32.853333 73.173333-73.173333V162.773333c0-40.32-32.853333-73.173333-73.173333-73.173333z\"\n        p-id=\"11310\"\n      ></path>\n      <path\n        d=\"M134.4 428.16h64V597.333333h-64zM120.96 400.64h82.346667c17.706667 0 32-14.293333 32-32s-14.293333-32-32-32H120.96c-17.706667 0-32 14.293333-32 32s14.506667 32 32 32zM233.386667 657.493333c0-17.706667-14.293333-32-32-32H119.04c-17.706667 0-32 14.293333-32 32s14.293333 32 32 32h82.346667c17.706667 0 32-14.293333 32-32zM384.213333 655.146667l146.346667 139.306666c6.186667 5.973333 14.08 8.746667 21.973333 8.746667s15.786667-2.986667 21.973334-8.746667l148.053333-139.306666c8.746667-8.106667 12.16-20.48 8.746667-32l-64.853334-228.053334 39.68-122.666666c3.2-9.813333 1.493333-20.48-4.48-28.586667s-15.573333-13.226667-25.813333-13.226667H428.586667a31.872 31.872 0 0 0-30.293334 41.813334l40.96 126.933333-63.786666 224c-3.2 11.306667 0.213333 23.68 8.746666 31.786667z m168.533334 72.32l-110.506667-105.173334 56.96-199.893333h108.373333l56.96 199.893333-111.786666 105.173334z m78.933333-432.64l-19.413333 60.16h-120.32l-19.413334-60.16h159.146667z\"\n        p-id=\"11311\"\n      ></path>\n    </svg>\n    <span :title=\"title\">{{ title }}</span>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\n  import { defineProps } from 'vue';\n  const props = defineProps({\n    orgCategory: String,\n    title: String,\n  });\n</script>\n\n<style scoped lang=\"less\">\n  .svg-company {\n    width: 18px;\n    height: 18px;\n    position: relative;\n    top: 2px;\n    right: 2px;\n  }\n  .svg-depart,\n  .svg-post {\n    width: 14px;\n    height: 16px;\n    position: relative;\n    top: 3px;\n    right: 2px;\n  }\n  html[data-theme='light'] {\n    .svg-post{\n      path { fill: #333333; }\n    }\n    .svg-company{\n      path { fill: #333333; }\n    }\n    .svg-depart{\n      path { fill: #333333; }\n    }\n  }\n  html[data-theme='dark'] {\n    .svg-post{\n      path { fill: #ffffff; }\n    }\n    .svg-company{\n      path { fill: #ffffff; }\n    }\n    .svg-depart{\n      path { fill: #ffffff; }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/base/JSelectBiz.vue",
    "content": "<template>\n  <div>\n    <div v-if=\"isDetailsMode\">\n      <p class=\"detailStr\" :title=\"detailStr\">{{ detailStr }}</p>\n    </div>\n    <a-row v-else class=\"j-select-row\" type=\"flex\" :gutter=\"8\">\n      <a-col class=\"left\" :class=\"{ full: !showButton }\">\n        <!-- 显示加载效果 -->\n        <a-input v-if=\"loading\" readOnly placeholder=\"加载中…\">\n          <template #prefix>\n            <LoadingOutlined />\n          </template>\n        </a-input>\n        <a-select\n          v-else\n          ref=\"select\"\n          v-model:value=\"selectValues.value\"\n          :placeholder=\"placeholder\"\n          :mode=\"multiple\"\n          :open=\"false\"\n          :disabled=\"disabled\"\n          :options=\"options\"\n          :maxTagCount=\"maxTagCount\"\n          @change=\"handleChange\"\n          style=\"width: 100%\"\n          @click=\"!disabled && openModal(false)\"\n          v-bind=\"attrs\"\n        >\n          <template v-if=\"isCustomRenderTag\" #tagRender=\"{ label, value, option}\">\n            <a-tag class=\"ant-select-selection-item\" style=\"margin-right: 4px\">\n              <span class=\"ant-select-selection-item-content\" style=\"font-size: 14px;max-width: 300px\" :title=\"tagRender(label, value, false)\">{{ tagRender(label, value, true) }}</span>\n              <span class=\"ant-select-selection-item-remove\">\n                <Icon icon=\"ant-design:close-outlined\" size=\"12\" @click=\"handleRemoveClick(value)\"></Icon>\n              </span>\n            </a-tag>\n          </template>\n        </a-select>\n      </a-col>\n      <a-col v-if=\"showButton\" class=\"right\">\n        <a-button v-if=\"buttonIcon\" :preIcon=\"buttonIcon\" type=\"primary\" @click=\"openModal(true)\" :disabled=\"disabled\">\n          {{ buttonText }}\n        </a-button>\n        <a-button v-else type=\"primary\" @click=\"openModal(true)\" :disabled=\"disabled\">\n          {{ buttonText }}\n        </a-button>\n      </a-col>\n    </a-row>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, inject, reactive, watch } from 'vue';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { LoadingOutlined } from '@ant-design/icons-vue';\n  import { getDepartPathNameByOrgCode } from \"@/utils/common/compUtils\";\n\n  export default defineComponent({\n    name: 'JSelectBiz',\n    components: { LoadingOutlined },\n    inheritAttrs: false,\n    props: {\n      showButton: propTypes.bool.def(true),\n      buttonText: propTypes.string.def('选择'),\n      disabled: propTypes.bool.def(false),\n      placeholder: {\n        type: String,\n        default: '请选择',\n      },\n      // 是否支持多选，默认 true\n      multiple: {\n        type: String,\n        default: 'multiple',\n      },\n      // 是否正在加载\n      loading: propTypes.bool.def(false),\n      // 最多显示多少个 tag\n      maxTagCount: propTypes.number,\n      // buttonIcon\n      buttonIcon: propTypes.string.def(''),\n      // 【TV360X-1002】是否是详情模式\n      isDetailsMode: propTypes.bool.def(false),\n      //是否自定义渲染tag\n      isCustomRenderTag: propTypes.bool.def(false),\n      rowKey: propTypes.string.def('id'),\n    },\n    emits: ['handleOpen', 'change'],\n    setup(props, { emit, refs }) {\n      //接收下拉框选项\n      const options = inject('selectOptions') || ref([]);\n      //接收选择的值\n      const selectValues = inject('selectValues') || ref({});\n      const attrs = useAttrs();\n      const detailStr = ref('');\n\n      //存放部门名称\n      const departNamePath = ref<Record<string, string>>({});\n      \n      /**\n       * 打开弹出框\n       */\n      function openModal(isButton) {\n        if (props.showButton && isButton) {\n          emit('handleOpen');\n        }\n        if (!props.showButton && !isButton) {\n          emit('handleOpen');\n        }\n      }\n\n      /**\n       * 下拉框值改变事件\n       */\n      function handleChange(value) {\n        selectValues.value = value;\n        selectValues.change = true;\n        emit('change', value);\n      }\n      \n      /**\n       * 多选tag自定义渲染\n       *\n       * @param label\n       * @param value\n       * @param isEllipsis 是否省略\n       */\n      function tagRender(label, value, isEllipsis) {\n        if (departNamePath.value[value]) {\n           //是否需要省略显示\n           if(!isEllipsis){\n             return departNamePath.value[value];\n           } else {\n             let departName = departNamePath.value[value];\n             //超过20则截取后20位的字符，前面加省略号\n             if(departName && departName.length >= 20){\n               const name:any = departName.substring(departName.length - 20);\n               return '...' + name;\n             } else {\n               return departName;\n             }\n           }\n        }\n        //判断rowKey是否为orgCode\n        if(props?.rowKey && props?.rowKey === 'orgCode'){\n          getDepartPathNameByOrgCode(value, label, '').then((data) => {\n            departNamePath.value[value] = data;\n          });\n        } else {\n          //否则按照id处理\n          getDepartPathNameByOrgCode('', label, value).then((data) => {\n            departNamePath.value[value] = data;\n          });\n        }\n      }\n\n      /**\n       * tag删除\n       * \n       * @param value\n       */\n      function handleRemoveClick(value) {\n        if(selectValues?.value){\n          let values = selectValues?.value.filter(item => item !== value);\n          handleChange(values);\n        }\n      }\n      // -update-begin--author:liaozhiyang---date:20240617---for：【TV360X-1002】详情页面行编辑用户组件和部门组件显示方式优化\n      watch(\n        [selectValues, options],\n        () => {\n          if (props.isDetailsMode) {\n            if (Array.isArray(selectValues.value) && Array.isArray(options.value)) {\n              const result = options.value.map((item) => item.label);\n              detailStr.value = result.join(',');\n            }\n          }\n        },\n        { immediate: true }\n      );\n      // -update-end--author:liaozhiyang---date:20240617---for：【TV360X-1002】详情页面行编辑用户组件和部门组件显示方式优化\n\n      return {\n        attrs,\n        selectValues,\n        options,\n        handleChange,\n        openModal,\n        detailStr,\n        tagRender,\n        handleRemoveClick,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .j-select-row {\n    @width: 82px;\n\n    .left {\n      width: calc(100% - @width - 8px);\n    }\n\n    .right {\n      width: @width;\n    }\n\n    .full {\n      width: 100%;\n    }\n\n    :deep(.ant-select-search__field) {\n      display: none !important;\n    }\n  }\n  .detailStr {\n    margin: 0;\n    max-width: 100%;\n    overflow: hidden;\n    text-overflow: ellipsis;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/base/JTreeBiz.vue",
    "content": "<template>\n  <div>\n    <a-row class=\"j-select-row\" type=\"flex\" :gutter=\"8\">\n      <a-col class=\"left\" :class=\"{ full: !showButton }\">\n        <a-select\n          ref=\"select\"\n          v-model:value=\"selectValues.value\"\n          :mode=\"multiple\"\n          :open=\"false\"\n          :options=\"options\"\n          @change=\"handleChange\"\n          style=\"width: 100%\"\n        />\n      </a-col>\n      <a-col v-if=\"showButton\" class=\"right\">\n        <a-button type=\"primary\" @click=\"openModal\">选择</a-button>\n      </a-col>\n    </a-row>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, inject, reactive } from 'vue';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n\n  export default defineComponent({\n    name: 'JSelectBiz',\n    components: {},\n    inheritAttrs: false,\n    props: {\n      showButton: propTypes.bool.def(true),\n      // 是否支持多选，默认 true\n      multiple: {\n        type: Boolean,\n        default: 'multiple',\n      },\n    },\n    emits: ['btnOk'],\n    setup(props, { emit, refs }) {\n      //接收下拉框选项\n      const options = inject('selectOptions') || ref([]);\n      //接收选择的值\n      const selectValues = inject('selectValues') || ref({});\n      const attrs = useAttrs();\n\n      /**\n       * 打开弹出框\n       */\n      function openModal() {\n        emit('btnOk');\n      }\n\n      /**\n       * 下拉框值改变事件\n       */\n      function handleChange(value) {\n        selectValues.value = value;\n        selectValues.change = true;\n      }\n\n      return {\n        attrs,\n        selectValues,\n        options,\n        handleChange,\n        openModal,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .j-select-row {\n    @width: 82px;\n\n    .left {\n      width: calc(100% - @width - 8px);\n    }\n\n    .right {\n      width: @width;\n    }\n\n    .full {\n      width: 100%;\n    }\n\n    :deep(.ant-select-search__field) {\n      display: none !important;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/modal/DeptSelectModal.vue",
    "content": "<!--部门选择框-->\n<template>\n  <div>\n    <BasicModal v-bind=\"$attrs\" @register=\"register\" :title=\"modalTitle\" width=\"600px\" :minHeight=\"300\" :maxHeight=\"maxHeight\" @ok=\"handleOk\" destroyOnClose @visible-change=\"visibleChange\">\n      <a-input-search v-if=\"izOnlySelectDepartPost\" placeholder=\"按岗位名称搜索…\" style=\"margin-bottom: 10px\" @search=\"onSearch\" @change=\"handelSearchChange\"/>\n      <BasicTree\n        ref=\"treeRef\"\n        :treeData=\"treeData\"\n        :load-data=\"sync == false ? null : onLoadData\"\n        v-bind=\"getBindValue\"\n        @select=\"onSelect\"\n        @check=\"onCheck\"\n        :fieldNames=\"fieldNames\"\n        :checkedKeys=\"checkedKeys\"\n        :expandedKeys=\"expandedKeys\"\n        :multiple=\"multiple\"\n        :checkStrictly=\"getCheckStrictly\"\n        :key=\"reloadKey\"\n      >\n        <template #title=\"{ orgCategory, title, orgCode }\">\n          <TreeIcon :orgCategory=\"orgCategory\" :title=\"getTitle(orgCategory, title, orgCode)\"></TreeIcon>\n        </template>\n      </BasicTree>\n      <!--树操作部分-->\n      <template #insertFooter>\n        <a-dropdown placement=\"top\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item v-if=\"multiple\" key=\"1\" @click=\"checkALL(true)\">全部勾选</a-menu-item>\n              <a-menu-item v-if=\"multiple\" key=\"2\" @click=\"checkALL(false)\">取消全选</a-menu-item>\n              <a-menu-item key=\"3\" @click=\"expandAll(true)\">展开全部</a-menu-item>\n              <a-menu-item key=\"4\" @click=\"expandAll(false)\">折叠全部</a-menu-item>\n              <a-menu-item v-if=\"multiple\" key=\"5\" @click=\"toggleCheckStrictly(false)\">层级关联</a-menu-item>\n              <a-menu-item v-if=\"multiple\" key=\"6\" @click=\"toggleCheckStrictly(true)\">层级独立</a-menu-item>\n            </a-menu>\n          </template>\n          <a-button style=\"float: left\"> 树操作 <Icon icon=\"ant-design:up-outlined\" /> </a-button>\n        </a-dropdown>\n      </template>\n    </BasicModal>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, unref, reactive } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { queryDepartTreeSync, queryTreeList, queryDepartAndPostTreeSync } from '/@/api/common/api';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { treeProps } from '/@/components/Form/src/jeecg/props/props';\n  import { BasicTree, TreeActionType } from '/@/components/Tree';\n  import { useTreeBiz } from '/@/components/Form/src/jeecg/hooks/useTreeBiz';\n  import {propTypes} from \"/@/utils/propTypes\";\n  import { omit } from 'lodash-es';\n  import TreeIcon from '@/components/Form/src/jeecg/components/TreeIcon/TreeIcon.vue';\n  import { getDepartPathNameByOrgCode } from \"@/utils/common/compUtils\";\n\n  export default defineComponent({\n    name: 'DeptSelectModal',\n    components: {\n      TreeIcon,\n      BasicModal,\n      BasicTree,\n    },\n    props: {\n      ...treeProps,\n      //选择框标题\n      modalTitle: {\n        type: String,\n        default: '部门选择',\n      },\n      // 代码逻辑说明: 【QQYUN-7678】部门组件内容过多没有滚动条（给一个默认最大高）\n      maxHeight: {\n        type: Number,\n        default: 500,\n      },\n      value: propTypes.oneOfType([propTypes.string, propTypes.array]),\n      //查询参数\n      params: {\n        type: Object,\n        default: () => ({}),\n      },\n      //是否显示部门路径（用户部门选择主岗位和兼职岗位需要显示全路径）\n      izShowDepPath: {\n        type: Boolean,\n        default: false,\n      },\n    },\n    emits: ['register', 'getSelectResult', 'close'],\n    setup(props, { emit }) {\n      //注册弹框\n      const [register, { closeModal }] = useModalInner();\n      const attrs = useAttrs();\n      const treeRef = ref<Nullable<TreeActionType>>(null);\n      //加载树key\n      const reloadKey = ref<number>(Math.random());\n      \n      // 代码逻辑说明: 部门选择警告类型不匹配\n      let propValue = props.value === ''?[]:props.value;\n      // 确保传递给BasicTree的value是数组格式\n      if (propValue && typeof propValue === 'string') {\n        propValue = propValue.split(',');\n      }\n      // 代码逻辑说明: [issues/538]JSelectDept组件受 dynamicDisabled 影响\n      let temp = Object.assign({}, unref(props), unref(attrs), {value: propValue},{disabled: false});\n      const getBindValue = omit(temp, 'multiple');\n      \n      const queryUrl = getQueryUrl();\n      const [{ visibleChange, checkedKeys, getCheckStrictly, getSelectTreeData, onCheck, onLoadData, treeData, checkALL, expandAll, onSelect, onSearch, expandedKeys, checkStrictly }] =\n        useTreeBiz(treeRef, queryUrl, getBindValue, props, emit);\n      const searchInfo = ref(props.params || {});\n      const tree = ref([]);\n      //替换treeNode中key字段为treeData中对应的字段\n      const fieldNames = {\n        key: props.rowKey,\n      };\n      // {children:'children', title:'title', key:'key' }\n      /**\n       * 确定选择\n       */\n      function handleOk() {\n        getSelectTreeData((options, values) => {\n          //回传选项和已选择的值\n          emit('getSelectResult', options, values);\n          //关闭弹窗\n          closeModal();\n        });\n      }\n\n      /** 获取查询数据方法 */\n      function getQueryUrl() {\n        let queryFn = props.izOnlySelectDepartPost ? queryDepartAndPostTreeSync :props.sync ? queryDepartTreeSync : queryTreeList;\n        // 代码逻辑说明: issues/I5F3P4 online配置部门选择后编辑，查看数据应该显示部门名称，不是部门代码\n        return (params) => queryFn(Object.assign({}, params, { primaryKey: props.rowKey }));\n      }\n\n      /**\n       * 搜索值改变事件\n       * @param value\n       */\n      function handelSearchChange(value) {\n        if(!value.target.value){\n          reloadKey.value = Math.random();\n        }\n      }\n\n      /**\n       * 设置层级关联和层级独立\n       * \n       * @param value\n       */\n      function toggleCheckStrictly(value) {\n        checkStrictly.value = value;\n      }\n\n      //标题缓存\n      const titleCache = reactive<Record<string, string>>({});\n      \n      /**\n       * 获取标题\n       * @param orgCategory\n       * @param title\n       * @param orgCode\n       */\n      function getTitle(orgCategory, title, orgCode) {\n        if(props.izShowDepPath && orgCategory === '2'){\n          const cached = titleCache[orgCode];\n          if (cached){\n            return cached;\n          }\n          getDepartPathNameByOrgCode(orgCode,title,\"\").then(res=>{\n            if(res){\n              titleCache[orgCode] =  title + \"(\" + res.substring(0, res.lastIndexOf('/')) + \")\";\n            }else{\n              titleCache[orgCode] =  title;\n            }\n          });\n          return title;\n        } else {\n          return title;\n        }\n      }\n      \n      return {\n        tree,\n        handleOk,\n        searchInfo,\n        treeRef,\n        treeData,\n        onCheck,\n        onSelect,\n        checkALL,\n        expandAll,\n        fieldNames,\n        checkedKeys,\n        expandedKeys,\n        register,\n        getBindValue,\n        getCheckStrictly,\n        visibleChange,\n        onLoadData,\n        onSearch,\n        reloadKey,\n        handelSearchChange,\n        toggleCheckStrictly,\n        getTitle,\n      };\n    },\n  });\n</script>\n<style>\n  .svg-company {\n    width: 18px;\n    height: 18px;\n    position: relative;\n    top: 1px;\n    right: 2px;\n  }\n  .svg-depart,.svg-post {\n    width: 14px;\n    height: 16px;\n    position: relative;\n    right: 2px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/modal/JPopupOnlReportModal.vue",
    "content": "<template>\n  <!--popup选择框-->\n  <div>\n    <BasicModal\n      v-bind=\"$attrs\"\n      @register=\"register\"\n      :title=\"title\"\n      :width=\"1200\"\n      @ok=\"handleSubmit\"\n      @cancel=\"handleCancel\"\n      cancelText=\"关闭\"\n      wrapClassName=\"j-popup-modal\"\n      @visible-change=\"visibleChange\"\n    >\n      <div class=\"jeecg-basic-table-form-container\">\n        <a-form ref=\"formRef\" v-if=\"showSearchFlag\" :model=\"queryParam\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\" @keyup.enter.native=\"searchQuery\">\n          <a-row :gutter=\"24\">\n            <template v-for=\"(item, index) in queryInfo\">\n              <template v-if=\"item.hidden === '1'\">\n                <a-col :md=\"8\" :sm=\"24\" :key=\"'query' + index\" v-show=\"toggleSearchStatus\">\n                  <SearchFormItem :formElRef=\"formRef\" :queryParam=\"queryParam\" :item=\"item\" :dictOptions=\"dictOptions\"></SearchFormItem>\n                </a-col>\n              </template>\n              <template v-else>\n                <a-col :md=\"8\" :sm=\"24\" :key=\"'query' + index\">\n                  <SearchFormItem :formElRef=\"formRef\" :queryParam=\"queryParam\" :item=\"item\" :dictOptions=\"dictOptions\"></SearchFormItem>\n                </a-col>\n              </template>\n            </template>\n\n            <a-col :md=\"8\" :sm=\"8\" v-if=\"showAdvancedButton\">\n              <span style=\"float: left; overflow: hidden\" class=\"table-page-search-submitButtons\">\n                <a-col :lg=\"6\">\n                  <a-button type=\"primary\" preIcon=\"ant-design:search-outlined\" @click=\"searchQuery\">查询</a-button>\n                  <a-button preIcon=\"ant-design:reload-outlined\" @click=\"searchReset\" style=\"margin-left: 8px\">重置</a-button>\n                  <a @click=\"handleToggleSearch\" style=\"margin-left: 8px\">\n                    {{ toggleSearchStatus ? '收起' : '展开' }}\n                    <Icon :icon=\"toggleSearchStatus ? 'ant-design:up-outlined' : 'ant-design:down-outlined'\" />\n                  </a>\n                </a-col>\n              </span>\n            </a-col>\n          </a-row>\n        </a-form>\n      </div>\n\n      <BasicTable\n        ref=\"tableRef\"\n        :canResize=\"false\"\n        :bordered=\"true\"\n        :loading=\"loading\"\n        :rowKey=\"rowkey ? rowkey : combineRowKey\"\n        :columns=\"columns\"\n        :showIndexColumn=\"false\"\n        :dataSource=\"dataSource\"\n        :pagination=\"pagination\"\n        :rowSelection=\"rowSelection\"\n        @row-click=\"clickThenCheck\"\n        @change=\"handleChangeInTable\"\n      >\n        <template #tableTitle></template>\n         <template #bodyCell=\"{text, column}\">\n          <template v-if=\"column.fieldType === 'Image'\">\n            <span v-if=\"!text\" style=\"font-size: 12px; font-style: italic\">无图片</span>\n            <img v-else :src=\"getImgView(text)\" alt=\"图片不存在\" class=\"cellIamge\" @click=\"viewOnlineCellImage($event, text)\" />\n          </template>\n        </template>\n      </BasicTable>\n    </BasicModal>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, unref, ref, watch, watchEffect, reactive, computed } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { usePopBiz } from '/@/components/jeecg/OnLine/hooks/usePopBiz';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';\n  import { createImgPreview } from '/@/components/Preview/index';\n\n  export default defineComponent({\n    name: 'JPopupOnlReportModal',\n    components: {\n      //此处需要异步加载BasicTable\n      BasicModal,\n      SearchFormItem: createAsyncComponent(() => import('/@/components/jeecg/OnLine/SearchFormItem.vue'), { loading: false }),\n      BasicTable: createAsyncComponent(() => import('/@/components/Table/src/BasicTable.vue'), {\n        loading: true,\n      }),\n    },\n    props: ['multi', 'code', 'sorter', 'groupId', 'param','showAdvancedButton', 'getFormValues', 'selected', 'rowkey'],\n    emits: ['ok', 'register'],\n    setup(props, { emit }) {\n      const { createMessage } = useMessage();\n      const labelCol = reactive({\n        xs: { span: 24 },\n        sm: { span: 6 },\n      });\n      const wrapperCol = reactive({\n        xs: { span: 24 },\n        sm: { span: 18 },\n      });\n      //注册弹框\n      const [register, { closeModal }] = useModalInner();\n      const formRef = ref();\n      const tableRef = ref();\n      const toggleSearchStatus = ref(false);\n      const attrs = useAttrs();\n      const tableScroll = ref({ x: true });\n      // 代码逻辑说明: 【issues/675】子表字段Popup弹框数据不更新\n      const getBindValue = computed(() => {\n        return Object.assign({}, unref(props), unref(attrs));\n      });\n      const [\n        {\n          visibleChange,\n          loadColumnsInfo,\n          dynamicParamHandler,\n          loadData,\n          handleChangeInTable,\n          combineRowKey,\n          clickThenCheck,\n          filterUnuseSelect,\n          getOkSelectRows,\n        },\n        {\n          visible,\n          rowSelection,\n          checkedKeys,\n          selectRows,\n          pagination,\n          dataSource,\n          columns,\n          loading,\n          title,\n          iSorter,\n          queryInfo,\n          queryParam,\n          dictOptions,\n        },\n      ] = usePopBiz(getBindValue,tableRef);\n\n      const showSearchFlag = computed(() => unref(queryInfo) && unref(queryInfo).length > 0);\n      /**\n       *监听code\n       */\n      watch(\n        () => props.code,\n        () => {\n          loadColumnsInfo();\n        }\n      );\n      /**\n       *监听popup动态参数 支持系统变量语法\n       */\n      watch(\n        () => props.param,\n        () => {\n          // 代码逻辑说明: 【issues/901】JPopup组件配置param参数后异常\n          if (visible.value) {\n            dynamicParamHandler();\n            loadData();\n          }\n        }\n      );\n      /**\n       *监听sorter排序字段\n       */\n      watchEffect(() => {\n        if (props.sorter) {\n          let arr = props.sorter.split('=');\n          if (arr.length === 2 && ['asc', 'desc'].includes(arr[1].toLowerCase())) {\n            iSorter.value = { column: arr[0], order: arr[1].toLowerCase() };\n            // 排序字段受控\n            unref(columns).forEach((col) => {\n              if (col.dataIndex === unref(iSorter).column) {\n                col['sortOrder'] = unref(iSorter).order === 'asc' ? 'ascend' : 'descend';\n              } else {\n                col['sortOrder'] = false;\n              }\n            });\n          } else {\n            console.warn('【JPopup】sorter参数不合法');\n          }\n        }\n      });\n\n      // 代码逻辑说明: VUEN-1156 popup 多数据有分页时，选中其他页，关闭popup 再点开，分页仍然选中上一次点击的分页，但数据是第一页的数据 未刷新\n      watch(\n        () => pagination.current,\n        (current) => {\n          if (current) {\n            tableRef.value.setPagination({\n              current: current,\n            });\n          }\n        }\n      );\n\n      function handleToggleSearch() {\n        toggleSearchStatus.value = !unref(toggleSearchStatus);\n      }\n      /**\n       * 取消/关闭\n       */\n      function handleCancel() {\n        closeModal();\n        checkedKeys.value = [];\n        selectRows.value = [];\n        // 代码逻辑说明: 【issues/742】选择后删除默认仍然存在\n        tableRef.value.clearSelectedRowKeys();\n      }\n\n      /**\n       *确认提交\n       */\n      function handleSubmit() {\n        filterUnuseSelect();\n        if (!props.multi && unref(selectRows) && unref(selectRows).length > 1) {\n          createMessage.warning('只能选择一条记录');\n          return false;\n        }\n        if (!unref(selectRows) || unref(selectRows).length == 0) {\n          createMessage.warning('至少选择一条记录');\n          return false;\n        }\n        // 代码逻辑说明: VUEN-1155 popup 选择数据时，会选择多条重复数据\n        let rows = getOkSelectRows!();\n        emit('ok', rows);\n        handleCancel();\n      }\n\n      /**\n       * 查询\n       */\n      function searchQuery() {\n        loadData(1);\n      }\n      /**\n       * 重置\n       */\n      function searchReset() {\n        queryParam.value = {};\n        loadData(1);\n      }\n\n      /**\n       * 2024-07-24\n       * liaozhiyang\n       * 【TV360X-1756】报表添加图片类型\n       * 图片\n       * @param text\n       */\n      function getImgView(text) {\n        if (text && text.indexOf(',') > 0) {\n          text = text.substring(0, text.indexOf(','));\n        }\n        return getFileAccessHttpUrl(text);\n      }\n      /**\n       * 2024-07-24\n       * liaozhiyang\n       * 【TV360X-1756】报表添加图片类型\n       * 预览列表 cell 图片\n       * @param text\n       */\n      function viewOnlineCellImage(e, text) {\n        e.stopPropagation();\n        if (text) {\n          let imgList: any = [];\n          let arr = text.split(',');\n          for (let str of arr) {\n            if (str) {\n              imgList.push(getFileAccessHttpUrl(str));\n            }\n          }\n          createImgPreview({ imageList: imgList });\n        }\n      }\n      // 代码逻辑说明: 【issues/3656】popupdict回显\n      watchEffect(() => {\n        if (props.selected && props.rowkey) {\n          const selected = props.multi ? props.selected : [props.selected];\n          checkedKeys!.value = selected.map((item) => item[props.rowkey]);\n          selectRows!.value = selected;\n        }\n      });\n      return {\n        attrs,\n        register,\n        tableScroll,\n        dataSource,\n        pagination,\n        columns,\n        rowSelection,\n        checkedKeys,\n        loading,\n        title,\n        handleCancel,\n        handleSubmit,\n        clickThenCheck,\n        loadData,\n        combineRowKey,\n        handleChangeInTable,\n        visibleChange,\n        queryInfo,\n        queryParam,\n        tableRef,\n        formRef,\n        labelCol,\n        wrapperCol,\n        dictOptions,\n        showSearchFlag,\n        toggleSearchStatus,\n        handleToggleSearch,\n        searchQuery,\n        searchReset,\n        getImgView,\n        viewOnlineCellImage,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .jeecg-basic-table-form-container {\n    padding: 5px;\n\n    .table-page-search-submitButtons {\n      display: block;\n      margin-bottom: 0;\n      white-space: nowrap;\n    }\n  }\n  :deep(.jeecg-basic-table .ant-table-wrapper .ant-table-title){\n    min-height: 0;\n  }\n  .cellIamge {\n    height: 25px !important;\n    margin: 0 auto;\n    max-width: 80px;\n    font-size: 12px;\n    font-style: italic;\n    cursor: pointer;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/modal/JSelectUserByDepartmentModal.vue",
    "content": "<template>\n  <BasicModal\n    wrapClassName=\"JSelectUserByDepartmentModal\"\n    v-bind=\"$attrs\"\n    @register=\"register\"\n    :title=\"modalTitle\"\n    width=\"800px\"\n    @ok=\"handleOk\"\n    destroyOnClose\n    @visible-change=\"visibleChange\"\n  >\n    <div class=\"j-select-user-by-dept\">\n      <div class=\"modal-content\">\n        <!-- 左侧搜索和组织列表 -->\n        <div class=\"left-content\">\n          <!-- 搜索框 -->\n          <div class=\"search-box\">\n            <a-input v-model:value.trim=\"searchText\" placeholder=\"搜索\" @change=\"handleSearch\" @pressEnter=\"handleSearch\" allowClear />\n          </div>\n          <!-- 组织架构 -->\n          <div class=\"tree-box\">\n            <template v-if=\"searchText.length\">\n              <template v-if=\"searchResult.depart.length || searchResult.user.length\">\n                <div class=\"search-result\">\n                  <template v-if=\"searchResult.user.length\">\n                    <div class=\"search-user\">\n                      <p class=\"search-user-title\">人员</p>\n                      <template v-for=\"item in searchResult.user\" :key=\"item.id\">\n                        <div class=\"search-user-item\" @click=\"handleSearchUserCheck(item)\">\n                          <a-checkbox v-model:checked=\"item.checked\" />\n                          <div class=\"right\">\n                            <div class=\"search-user-item-circle\">\n                              <img v-if=\"item.avatar\" :src=\"getFileAccessHttpUrl(item.avatar)\" alt=\"avatar\" />\n                            </div>\n                            <div class=\"search-user-item-info\">\n                              <div class=\"search-user-item-name\">{{ item.realname }}</div>\n                              <div class=\"search-user-item-org\">{{ item.orgCodeTxt }}</div>\n                            </div>\n                          </div>\n                        </div>\n                      </template>\n                    </div>\n                  </template>\n                  <template v-if=\"searchResult.depart.length\">\n                    <div class=\"search-depart\">\n                      <p class=\"search-depart-title\">部门</p>\n                      <template v-for=\"item in searchResult.depart\" :key=\"item.id\">\n                        <div class=\"search-depart-item\" @click=\"handleSearchDepartClick(item)\">\n                          <a-checkbox v-model:checked=\"item.checked\" @click.stop @change=\"($event) => handleSearchDepartCheck($event, item)\" />\n                          <div class=\"search-depart-item-name\">{{ getDepartName(item.departName, item.departNameAbbr) }}</div>\n                          <RightOutlined />\n                        </div>\n                      </template>\n                    </div>\n                  </template>\n                </div>\n              </template>\n              <template v-else>\n                <div class=\"no-data\">\n                  <a-empty description=\"暂无数据\" />\n                </div>\n              </template>\n            </template>\n            <template v-else>\n              <div ref=\"breadcrumbBoxRef\">\n                <a-breadcrumb v-if=\"breadcrumb.length\">\n                  <a-breadcrumb-item @click=\"handleBreadcrumbClick()\">\n                    <HomeOutlined />\n                  </a-breadcrumb-item>\n                  <template v-for=\"item in breadcrumb\" :key=\"item?.id\">\n                    <a-breadcrumb-item @click=\"handleBreadcrumbClick(item)\">\n                      <span>{{ getDepartName(item.departName, item.departNameAbbr) }}</span>\n                    </a-breadcrumb-item>\n                  </template>\n                </a-breadcrumb>\n              </div>\n              <div v-if=\"currentDepartUsers.length\">\n                <!-- 当前部门用户树 -->\n                <div class=\"depart-users-tree\">\n                  <div v-if=\"!currentDepartTree.length\" class=\"allChecked\">\n                    <a-checkbox v-model:checked=\"currentDepartAllUsers\" @change=\"handleAllUsers\">全选</a-checkbox>\n                  </div>\n                  <template v-for=\"item in currentDepartUsers\" :key=\"item.id\">\n                    <div class=\"depart-users-tree-item\" @click=\"handleDepartUsersTreeCheck(item)\">\n                      <a-checkbox v-model:checked=\"item.checked\" />\n                      <div class=\"right\">\n                        <div class=\"depart-users-tree-item-circle\">\n                          <img v-if=\"item.avatar\" :src=\"getFileAccessHttpUrl(item.avatar)\" alt=\"avatar\" />\n                        </div>\n                        <div class=\"depart-users-tree-item-name\">{{ item.realname }}</div>\n                      </div>\n                    </div>\n                  </template>\n                </div>\n              </div>\n              <!-- 部门树 -->\n              <div v-if=\"currentDepartTree.length\" class=\"depart-tree\">\n                <template v-for=\"item in currentDepartTree\" :key=\"item.id\">\n                  <div class=\"depart-tree-item\" @click=\"handleDepartTreeClick(item)\">\n                    <a-checkbox v-model:checked=\"item.checked\" @click.stop @change=\"($event) => handleDepartTreeCheck($event, item)\" />\n                    <div class=\"depart-tree-item-name\">{{ getDepartName(item.departName, item.departNameAbbr) }}</div>\n                    <RightOutlined />\n                  </div>\n                </template>\n              </div>\n              <div v-if=\"currentDepartTree.length === 0 && currentDepartUsers.length === 0\" class=\"no-data\">\n                <a-empty description=\"暂无数据\" />\n              </div>\n            </template>\n          </div>\n        </div>\n        <!-- 右侧已选人员展示 -->\n        <div class=\"right-content\">\n          <div class=\"selected-header\"> 已选人员：{{ selectedUsers.length }}人 </div>\n          <div class=\"selected-users\">\n            <div class=\"content\">\n              <div v-for=\"user in selectedUsers\" :key=\"user.id\" class=\"user-avatar\" @click=\"handleDelUser(user)\">\n                <div class=\"avatar-circle\">\n                  <img v-if=\"user.avatar\" :src=\"getFileAccessHttpUrl(user.avatar)\" alt=\"avatar\" />\n                  <div class=\"mask\">\n                    <CloseOutlined></CloseOutlined>\n                  </div>\n                </div>\n                <div class=\"user-name\">{{ user.realname }}</div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </BasicModal>\n</template>\n\n<script setup lang=\"ts\">\n  import { ref, reactive, watch } from 'vue';\n  import { RightOutlined, HomeOutlined, CloseOutlined } from '@ant-design/icons-vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { queryTreeList, getTableList as getTableListOrigin } from '/@/api/common/api';\n  import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';\n  import { isArray } from '/@/utils/is';\n  import { defHttp } from '/@/utils/http/axios';\n\n  defineOptions({ name: 'JSelectUserByDepartmentModal' });\n  const props = defineProps({\n    // ...selectProps,\n    //回传value字段名\n    rowKey: {\n      type: String,\n      default: 'id',\n    },\n    //回传文本字段名\n    labelKey: {\n      type: String,\n      default: 'name',\n    },\n    modalTitle: {\n      type: String,\n      default: '部门用户选择',\n    },\n    selectedUser: {\n      type: Array,\n      default: () => [],\n    },\n    //查询参数\n    params: {\n      type: Object,\n      default: () => {},\n    },\n    // 是否启用公司简称\n    useCompanyShortName: {\n      type: Boolean,\n      default: true,\n    },\n    //最大选择数量\n    maxSelectCount: {\n      type: Number,\n      default: 0,\n    },\n    // 是否单选\n    isRadioSelection: {\n      type: Boolean,\n      default: false,\n    },\n  });\n  const emit = defineEmits(['close', 'register', 'change']);\n  import { useMessage } from '/@/hooks/web/useMessage';\n  const { createMessage } = useMessage();\n  // 搜索文本\n  const searchText = ref('');\n  const breadcrumb = ref<any[]>([]);\n  // 部门树(整颗树)\n  const departTree = ref([]);\n  // 当前部门树\n  const currentDepartTree = ref<any[]>([]);\n  // 选中的部门节点\n  const checkedDepartIds = ref<string[]>([]);\n  // 当前部门用户\n  const currentDepartUsers = ref([]);\n  // 已选用户\n  const selectedUsers = ref<any[]>([]);\n  // 全选\n  const currentDepartAllUsers = ref(false);\n  // 搜索结构\n  const searchResult: any = reactive({\n    depart: [],\n    user: [],\n  });\n  // 面包屑框\n  const breadcrumbBoxRef = ref();\n  // 映射部门和人员的关系\n  const cacheDepartUser = {};\n  //注册弹框\n  const [register, { closeModal }] = useModalInner(async (data) => {\n    // 初始化\n    if (props.selectedUser.length) {\n      // 编辑时，传进来已选中的数据\n      selectedUsers.value = props.selectedUser;\n    }\n    getQueryTreeList();\n  });\n  const visibleChange = (visible) => {\n    if (visible === false) {\n      setTimeout(() => {\n        emit('close');\n      }, 300);\n    }\n  };\n  const handleOk = () => {\n    if (selectedUsers.value.length == 0) {\n      createMessage.warning('请选择人员');\n      return;\n    }\n    if (props.isRadioSelection && selectedUsers.value.length > 1) {\n      createMessage.warning('只允许选择一个用户');\n      return;\n    }\n    if (props.maxSelectCount && selectedUsers.value.length > props.maxSelectCount) {\n      createMessage.warning(`最多只能选择${props.maxSelectCount}个用户`);\n      return;\n    }\n    emit('change', selectedUsers.value);\n    closeModal();\n  };\n  // 搜索人员/部门\n  const handleSearch = () => {\n    if (searchText.value) {\n      defHttp\n        .get({\n          url: `/sys/user/listAll`,\n          params: {\n            column: 'createTime',\n            order: 'desc',\n            pageNo: 1,\n            pageSize: 100,\n            realname: `*${searchText.value}*`,\n          },\n        })\n        .then((result: any) => {\n          result.records?.forEach((item) => {\n            const findItem = selectedUsers.value.find((user) => user.id == item.id);\n            if (findItem) {\n              // 能在右侧找到说明选中了，左侧同样需要选中。\n              item.checked = true;\n            } else {\n              item.checked = false;\n            }\n          });\n          searchResult.user = result.records ?? [];\n        });\n      searchResult.depart = getDepartByName(searchText.value) ?? [];\n    } else {\n      searchResult.user = [];\n      searchResult.depart = [];\n    }\n  };\n  // 面包屑\n  const handleBreadcrumbClick = (item?) => {\n    // 先清空\n    currentDepartUsers.value = [];\n    if (item) {\n      const findIndex = breadcrumb.value.findIndex((o) => o.id === item.id);\n      if (findIndex != -1) {\n        breadcrumb.value = breadcrumb.value.filter((item, index) => {\n          console.log(item);\n          return index <= findIndex;\n        });\n      }\n      const data = getDepartTreeNodeById(item.id, departTree.value);\n      currentDepartTree.value = data.children;\n    } else {\n      // 根节点\n      currentDepartTree.value = departTree.value;\n      breadcrumb.value = [];\n    }\n  };\n  // 点击部门树复选框触发\n  const handleDepartTreeCheck = (e, item) => {\n    const { target } = e;\n    if (target.checked) {\n      // 选中\n      getUsersByDeptId(item['id']).then((users) => {\n        addUsers(users);\n      });\n      checkedDepartIds.value.push((item as any).id);\n      // 检查父节点下所有子节点是否选中\n      const parentItem = getDepartTreeParentById(item.id);\n      if (parentItem?.children) {\n        const isChildAllChecked = parentItem.children.every((item) => item.checked);\n        if (isChildAllChecked) {\n          parentItem.checked = true;\n        } else {\n          parentItem.checked = false;\n        }\n      }\n    } else {\n      // 取消选中\n      const findIndex = checkedDepartIds.value.findIndex((o: any) => o.id === item.id);\n      if (findIndex != -1) {\n        checkedDepartIds.value.splice(findIndex, 1);\n      }\n      // 如果父节点是选中，则需要取消\n      const parentItem = getDepartTreeParentById(item.id);\n      if (parentItem) {\n        parentItem.checked = false;\n      }\n      getUsersByDeptId(item['id']).then((users) => {\n        users.forEach((item) => {\n          const findIndex = selectedUsers.value.findIndex((user) => user.id === item.id);\n          if (findIndex != -1) {\n            selectedUsers.value.splice(findIndex, 1);\n          }\n        });\n      });\n    }\n  };\n  // 点击部门树节点触发\n  const handleDepartTreeClick = (item) => {\n    breadcrumb.value = [...breadcrumb.value, item];\n    if (item.children) {\n      // 有子节点，则显示部门\n      if (item.checked) {\n        // 父节点勾选，则子节点全部勾选\n        item.children.forEach((item) => {\n          item.checked = true;\n        });\n      }\n      currentDepartTree.value = item.children;\n      defHttp\n        .get({\n          url: '/sys/sysDepart/getUsersByDepartId',\n          params: {\n            id: item['id'],\n          },\n        })\n        .then((res: any) => {\n          const result = res ?? [];\n          if (item.checked) {\n            // 父节点勾选，则默认勾选\n            result.forEach((item) => {\n              item.checked = true;\n            });\n          }\n          // 右侧勾选了，则默认勾选（用户存在多部门，在别的部门被选中了）\n          if (selectedUsers.value.length) {\n            result.forEach((item) => {\n              const findItem = selectedUsers.value.find((user) => user.id === item.id);\n              if (findItem) {\n                // 说明在selectedUsers中被找到\n                item.checked = true;\n              }\n            });\n          }\n          currentDepartUsers.value = result.sort((a, b) => a.sort - b.sort );\n        });\n    } else {\n      // 没有子节点，则显示用户\n      currentDepartTree.value = [];\n      getTableList({\n        departId: item['id'],\n      }).then((res: any) => {\n        if (res?.records) {\n          let checked = true;\n          res.records.forEach((item) => {\n            const findItem = selectedUsers.value.find((user) => user.id == item.id);\n            if (findItem) {\n              // 能在右侧找到说明选中了，左侧同样需要选中。\n              item.checked = true;\n            } else {\n              item.checked = false;\n              checked = false;\n            }\n          });\n          currentDepartAllUsers.value = checked;\n          currentDepartUsers.value = res.records.sort((a, b) => a.sort - b.sort );\n        }\n      });\n    }\n  };\n  // 点击部门用户树复选框触发\n  const handleDepartUsersTreeCheck = (item) => {\n    item.checked = !item.checked;\n    if (item.checked) {\n      addUsers(item);\n    } else {\n      selectedUsers.value = selectedUsers.value.filter((user) => user.id !== item.id);\n    }\n    if (item.checked == false) {\n      // 有一个是false，则全选false\n      currentDepartAllUsers.value = false;\n    }\n  };\n  // 全选\n  const handleAllUsers = ({ target }) => {\n    const { checked } = target;\n    if (checked) {\n      currentDepartUsers.value.forEach((item: any) => (item.checked = true));\n      addUsers(currentDepartUsers.value);\n    } else {\n      currentDepartUsers.value.forEach((item: any) => (item.checked = false));\n      selectedUsers.value = selectedUsers.value.filter((user) => {\n        const userId = user.id;\n        const findItem = currentDepartUsers.value.find((item: any) => item.id === userId);\n        if (findItem) {\n          return false;\n        } else {\n          return true;\n        }\n      });\n    }\n  };\n  // 删除人员\n  const handleDelUser = (item) => {\n    const findIndex = selectedUsers.value.findIndex((user) => user.id === item.id);\n    if (findIndex != -1) {\n      selectedUsers.value.splice(findIndex, 1);\n    }\n    const findItem: any = currentDepartUsers.value.find((user: any) => user.id === item.id);\n    if (findItem) {\n      findItem.checked = false;\n      currentDepartAllUsers.value = false;\n    }\n  };\n  // 点击搜索用户复选框\n  const handleSearchUserCheck = (item) => {\n    item.checked = !item.checked;\n    if (item.checked) {\n      addUsers(item);\n    } else {\n      selectedUsers.value = selectedUsers.value.filter((user) => user.id !== item.id);\n    }\n  };\n  // 点击搜索部门复选框\n  const handleSearchDepartCheck = (e, item) => {\n    handleDepartTreeCheck(e, item);\n  };\n  // 点击搜索部门\n  const handleSearchDepartClick = (item) => {\n    searchResult.depart = [];\n    searchResult.user = [];\n    breadcrumb.value = getPathToNodeById(item.id);\n    handleDepartTreeClick(item);\n  };\n  // 添加人员到右侧\n  const addUsers = (users) => {\n    let newUsers: any = [];\n    if (isArray(users)) {\n      // selectedUsers里面没有才添加（防止重复）\n      newUsers = users.filter((user: any) => !selectedUsers.value.find((item) => item.id === user.id));\n    } else {\n      if (!selectedUsers.value.find((user) => user.id === users.id)) {\n        // selectedUsers里面没有才添加（防止重复）\n        newUsers = [users];\n      }\n    }\n    selectedUsers.value = [...selectedUsers.value, ...newUsers];\n    const result = currentDepartUsers.value.every((item: any) => !!item.checked);\n    currentDepartAllUsers.value = result;\n  };\n  watch(breadcrumb, () => {\n    setTimeout(() => {\n      breadcrumbScrollToRight();\n    }, 0);\n  });\n  const breadcrumbScrollToRight = () => {\n    const olEle = breadcrumbBoxRef.value?.querySelector('ol');\n    if (olEle) {\n      olEle.scrollLeft = 30000;\n    }\n  };\n  // 解析参数\n  const parseParams = (params) => {\n    if (props?.params) {\n      return {\n        ...params,\n        ...props.params,\n      };\n    }\n    return params;\n  };\n  const getQueryTreeList = (params?) => {\n    params = parseParams(params);\n    queryTreeList({ ...params }).then((res) => {\n      if (res) {\n        departTree.value = res;\n        currentDepartTree.value = res;\n      }\n    });\n  };\n  // 根据部门id获取用户\n  const getTableList = (params) => {\n    params = parseParams(params);\n    return getTableListOrigin({ ...params });\n  };\n  const getUsersByDeptId = (id) => {\n    return new Promise<any[]>((resolve) => {\n      if (cacheDepartUser[id]) {\n        resolve(cacheDepartUser[id]);\n      } else {\n        getTableList({\n          departId: id,\n        }).then((res: any) => {\n          cacheDepartUser[id] = res.records ?? [];\n          if (res?.records?.length) {\n            resolve(res.records ?? []);\n          }\n        });\n      }\n    });\n  };\n  // 根据id获取根节点到当前节点路径\n  const getPathToNodeById = (id: string, tree = departTree.value, path = []): any[] => {\n    for (const node of tree) {\n      if ((node as any).id === id) {\n        return [...path];\n      }\n      if ((node as any).children) {\n        const foundPath = getPathToNodeById(id, (node as any).children, [...path, node]);\n        if (foundPath.length) {\n          return foundPath;\n        }\n      }\n    }\n    return [];\n  };\n  // 根据id获取部门树父节点数据\n  const getDepartTreeParentById = (id: string, tree = departTree.value, parent = null): any => {\n    for (const node of tree) {\n      if ((node as any).id === id) {\n        return parent;\n      }\n      if ((node as any).children) {\n        const found = getDepartTreeParentById(id, (node as any).children, node);\n        if (found) {\n          return found;\n        }\n      }\n    }\n    return null;\n  };\n  // 通过名称搜索部门支持模糊\n  const getDepartByName = (name: string, tree = departTree.value): any[] => {\n    const result: any[] = [];\n    const search = (nodes: any[]) => {\n      for (const node of nodes) {\n        if (getDepartName(node.departName, node.departNameAbbr)?.toLowerCase().includes(name.toLowerCase())) {\n          result.push(node);\n        }\n        if (node.children?.length) {\n          search(node.children);\n        }\n      }\n    };\n    search(tree);\n    return result;\n  };\n  // 根据id获取部门树当前节点数据\n  const getDepartTreeNodeById = (id: string, tree = departTree.value): any => {\n    for (const node of tree) {\n      if ((node as any).id === id) {\n        return node;\n      }\n      if ((node as any).children) {\n        const found = getDepartTreeNodeById(id, (node as any).children);\n        if (found) {\n          return found;\n        }\n      }\n    }\n    return null;\n  };\n  // 获取部门名称（如果启用公司简称且公司简称不为空，则返回公司简称）\n  function getDepartName(departName, departNameAbbr) {\n    if (props.useCompanyShortName && departNameAbbr) {\n      return departNameAbbr;\n    }\n    return departName;\n  }\n</script>\n<style lang=\"less\">\n  .JSelectUserByDepartmentModal {\n    .scroll-container {\n      padding: 0;\n    }\n  }\n</style>\n<style lang=\"less\" scoped>\n  .j-select-user-by-dept {\n    background: #fff;\n    border-radius: 4px;\n  }\n  .modal-content {\n    display: flex;\n    padding: 20px;\n    padding-bottom: 0;\n    padding-left: 0;\n    height: 400px;\n    font-size: 12px;\n  }\n  .left-content {\n    display: flex;\n    flex-direction: column;\n    flex: 1;\n    border-right: 1px solid #e8e8e8;\n    .search-box {\n      :deep(.ant-input-affix-wrapper) {\n        border-color: #d9d9d9 !important;\n      }\n      margin: 0 16px 16px 16px;\n    }\n    :deep(.ant-breadcrumb) {\n      font-size: 12px;\n      margin-left: 16px;\n      margin-right: 16px;\n      color: inherit;\n      cursor: pointer;\n      ol {\n        flex-wrap: nowrap;\n        overflow-x: auto;\n        /* 美化滚动条 */\n        &::-webkit-scrollbar {\n          width: 4px;\n          height: 3px;\n          background: #f5f5f5;\n          border-radius: 2px;\n        }\n        &::-webkit-scrollbar-thumb {\n          background: #bfbfbf;\n          border-radius: 3px;\n          transition: background-color 0.2s ease;\n          &:hover {\n            background: #999;\n          }\n        }\n        &::-webkit-scrollbar-track {\n          background: #f5f5f5;\n          border-radius: 3px;\n        }\n      }\n      li {\n        flex: none;\n        .ant-breadcrumb-link {\n          cursor: pointer;\n          &:hover {\n            color: @primary-color;\n          }\n        }\n        &:last-child {\n          .ant-breadcrumb-link {\n            pointer-events: none;\n          }\n        }\n      }\n    }\n    .tree-box {\n      display: flex;\n      flex-direction: column;\n      flex: 1;\n      overflow-y: auto;\n      .no-data {\n        flex: 1;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n      }\n    }\n    .depart-tree {\n      .depart-tree-item {\n        padding: 0 16px;\n        line-height: 40px;\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        cursor: pointer;\n        &:hover {\n          background-color: #f4f6fa;\n        }\n      }\n      .depart-tree-item-name {\n        flex: 1;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        margin: 0 8px;\n      }\n    }\n  }\n  .depart-users-tree {\n    .allChecked {\n      padding: 0 16px;\n      margin-bottom: 16px;\n      padding-top: 12px;\n      :deep(.ant-checkbox-wrapper) {\n        font-size: 12px;\n      }\n    }\n    .depart-users-tree-item {\n      line-height: 50px;\n      padding: 0 16px;\n      display: flex;\n      cursor: pointer;\n      &:hover {\n        background-color: #f4f6fa;\n      }\n      .right {\n        flex: 1;\n        display: flex;\n        align-items: center;\n        margin: 0 8px;\n      }\n      .depart-users-tree-item-circle {\n        width: 36px;\n        height: 36px;\n        border-radius: 50%;\n        background-color: #aaa;\n        overflow: hidden;\n        img {\n          display: block;\n          width: 100%;\n          height: 100%;\n        }\n      }\n      .depart-users-tree-item-name {\n        margin-left: 8px;\n      }\n    }\n  }\n  .search-depart {\n    margin-bottom: 8px;\n    .search-depart-title {\n      padding-left: 16px;\n      font-size: 14px;\n      font-weight: 500;\n      margin-bottom: 8px;\n    }\n    .search-depart-item {\n      display: flex;\n      align-items: center;\n      padding: 8px 16px;\n      cursor: pointer;\n      &:hover {\n        background-color: #f4f6fa;\n      }\n      .search-depart-item-name {\n        margin-left: 8px;\n        flex: 1;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n      }\n    }\n  }\n\n  .search-user {\n    margin-bottom: 8px;\n    .search-user-title {\n      font-size: 14px;\n      font-weight: 500;\n      margin-bottom: 8px;\n      padding-left: 16px;\n    }\n    .search-user-item {\n      display: flex;\n      align-items: center;\n      padding: 8px 16px;\n      cursor: pointer;\n      &:hover {\n        background-color: #f4f6fa;\n      }\n      .right {\n        flex: 1;\n        display: flex;\n        align-items: center;\n        margin: 0 8px;\n      }\n      .search-user-item-info {\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        margin-left: 8px;\n      }\n      .search-user-item-circle {\n        width: 36px;\n        height: 36px;\n        border-radius: 50%;\n        overflow: hidden;\n        background-color: #aaa;\n      }\n      .search-user-item-name {\n        flex: 1;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n      }\n      .search-user-item-org {\n        color: #999;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n      }\n    }\n  }\n  .right-content {\n    width: 400px;\n    display: flex;\n    flex-direction: column;\n    padding-left: 16px;\n    .selected-header {\n      margin-bottom: 16px;\n    }\n    .selected-users {\n      flex: 1;\n      overflow: hidden auto;\n    }\n    .content {\n      display: grid;\n      grid-template-columns: repeat(5, 1fr);\n      gap: 8px;\n    }\n    .user-avatar {\n      text-align: center;\n      width: 70px;\n      cursor: pointer;\n    }\n    .avatar-circle {\n      width: 40px;\n      height: 40px;\n      border-radius: 50%;\n      overflow: hidden;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      color: white;\n      margin: 0 auto 8px;\n      position: relative;\n      background-color: rgba(0, 0, 0, 0.5);\n      img {\n        width: 100%;\n        height: 100%;\n      }\n      &:hover {\n        .mask {\n          opacity: 1;\n        }\n      }\n      .mask {\n        opacity: 0;\n        transition: opacity;\n        width: 100%;\n        height: 100%;\n        position: absolute;\n        top: 0;\n        left: 0;\n        background-color: rgba(0, 0, 0, 0.5);\n        font-size: 16px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n      }\n    }\n    .user-name {\n      text-align: center;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n      width: 100%;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/modal/PositionSelectModal.vue",
    "content": "<!--职务选择框-->\n<template>\n  <div>\n    <BasicModal\n      v-bind=\"$attrs\"\n      @register=\"register\"\n      :title=\"modalTitle\"\n      width=\"1100px\"\n      wrapClassName=\"j-user-select-modal\"\n      @ok=\"handleOk\"\n      destroyOnClose\n      @visible-change=\"visibleChange\"\n    >\n      <a-row>\n        <a-col :span=\"showSelected ? 18 : 24\">\n          <BasicTable\n            :columns=\"columns\"\n            :bordered=\"true\"\n            :useSearchForm=\"true\"\n            :formConfig=\"formConfig\"\n            :api=\"getPositionList\"\n            :searchInfo=\"searchInfo\"\n            :rowSelection=\"rowSelection\"\n            :indexColumnProps=\"indexColumnProps\"\n            v-bind=\"getBindValue\"\n          ></BasicTable>\n        </a-col>\n        <a-col :span=\"showSelected ? 6 : 0\">\n          <BasicTable\n            v-bind=\"selectedTable\"\n            :dataSource=\"selectRows\"\n            :useSearchForm=\"true\"\n            :formConfig=\"{ showActionButtonGroup: false, baseRowStyle: { minHeight: '40px' } }\"\n          >\n            <!--操作栏-->\n            <template #action=\"{ record }\">\n              <a href=\"javascript:void(0)\" @click=\"handleDeleteSelected(record)\"><Icon icon=\"ant-design:delete-outlined\"></Icon></a>\n            </template>\n          </BasicTable>\n        </a-col>\n      </a-row>\n    </BasicModal>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { getPositionList } from '/@/api/common/api';\n  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n  import { useSelectBiz } from '/@/components/Form/src/jeecg/hooks/useSelectBiz';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { selectProps } from '/@/components/Form/src/jeecg/props/props';\n\n  export default defineComponent({\n    name: 'PositionSelectModal',\n    components: {\n      //此处需要异步加载BasicTable\n      BasicModal,\n      BasicTable: createAsyncComponent(() => import('/@/components/Table/src/BasicTable.vue'), {\n        loading: true,\n      }),\n    },\n    props: {\n      ...selectProps,\n      //选择框标题\n      modalTitle: {\n        type: String,\n        default: '职务选择',\n      },\n    },\n    emits: ['register', 'getSelectResult'],\n    setup(props, { emit, refs }) {\n      //注册弹框\n      const [register, { closeModal }] = useModalInner();\n      const attrs = useAttrs();\n      //表格配置\n      const config = {\n        canResize: false,\n        bordered: true,\n        size: 'small',\n        //改成读取rowKey,自定义传递参数\n        rowKey: props.rowKey,\n      };\n      const getBindValue = Object.assign({}, unref(props), unref(attrs), config);\n      const [{ rowSelection, visibleChange, indexColumnProps, getSelectResult, handleDeleteSelected, selectRows }] = useSelectBiz(\n        getPositionList,\n        getBindValue\n      );\n      const searchInfo = ref(props.params);\n      //查询form\n      const formConfig = {\n        labelCol: {\n          span: 4,\n        },\n        baseColProps: {\n          xs: 24,\n          sm: 10,\n          md: 10,\n          lg: 10,\n          xl: 10,\n          xxl: 10,\n        },\n        // 代码逻辑说明: [issues/5514]组件页面显示错位\n        actionColOptions: {\n            xs: 24,\n            sm: 8,\n            md: 8,\n            lg: 8,\n            xl: 8,\n            xxl: 8,\n        },\n        schemas: [\n          {\n            label: '职务名称',\n            field: 'name',\n            component: 'JInput',\n            colProps: { span: 10 },\n          },\n        ],\n      };\n      //定义表格列\n      const columns = [\n        {\n          title: '职务名称',\n          dataIndex: 'name',\n          // width: 180,\n        },\n        {\n          title: '职务级别',\n          dataIndex: 'postLevel',\n        },\n      ];\n      //已选择的table信息\n      const selectedTable = {\n        pagination: false,\n        showIndexColumn: false,\n        scroll: { y: 390 },\n        size: 'small',\n        canResize: false,\n        bordered: true,\n        rowKey: 'id',\n        columns: [\n          {\n            title: '职务名称',\n            dataIndex: 'name',\n            width: 40,\n          },\n          {\n            title: '操作',\n            dataIndex: 'action',\n            align: 'center',\n            width: 40,\n            slots: { customRender: 'action' },\n          },\n        ],\n      };\n      /**\n       * 确定选择\n       */\n      function handleOk() {\n        getSelectResult((options, values) => {\n          //回传选项和已选择的值\n          emit('getSelectResult', options, values);\n          //关闭弹窗\n          closeModal();\n        });\n      }\n      return {\n        handleOk,\n        getPositionList,\n        register,\n        visibleChange,\n        getBindValue,\n        formConfig,\n        indexColumnProps,\n        columns,\n        rowSelection,\n\n        selectedTable,\n        selectRows,\n        handleDeleteSelected,\n        searchInfo,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/modal/RoleSelectModal.vue",
    "content": "<!--角色选择框-->\n<template>\n  <div>\n    <BasicModal v-bind=\"$attrs\" @register=\"register\" :title=\"modalTitle\" width=\"800px\" @ok=\"handleOk\" destroyOnClose @visible-change=\"visibleChange\">\n      <BasicTable\n        :columns=\"columns\"\n        v-bind=\"config\"\n        :useSearchForm=\"true\"\n        :formConfig=\"formConfig\"\n        :api=\"getRoleList\"\n        :searchInfo=\"searchInfo\"\n        :rowSelection=\"rowSelection\"\n        :indexColumnProps=\"indexColumnProps\"\n      ></BasicTable>\n    </BasicModal>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { getRoleList } from '/@/api/common/api';\n  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n  import { useSelectBiz } from '/@/components/Form/src/jeecg/hooks/useSelectBiz';\n  import { selectProps } from '/@/components/Form/src/jeecg/props/props';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n\n  export default defineComponent({\n    name: 'UserSelectModal',\n    components: {\n      //此处需要异步加载BasicTable\n      BasicModal,\n      BasicTable: createAsyncComponent(() => import('/@/components/Table/src/BasicTable.vue'), {\n        loading: true,\n      }),\n    },\n    props: {\n      ...selectProps,\n      //选择框标题\n      modalTitle: {\n        type: String,\n        default: '角色选择',\n      },\n    },\n    emits: ['register', 'getSelectResult'],\n    setup(props, { emit, refs }) {\n      //注册弹框\n      const [register, { closeModal }] = useModalInner();\n      const attrs = useAttrs();\n      //表格配置\n      const config = {\n        canResize: false,\n        bordered: true,\n        size: 'small',\n        rowKey: unref(props).rowKey,\n      };\n      const getBindValue = Object.assign({}, unref(props), unref(attrs), config);\n      const [{ rowSelection, indexColumnProps, visibleChange, getSelectResult }] = useSelectBiz(getRoleList, getBindValue);\n      const searchInfo = ref(props.params);\n      //查询form\n      const formConfig = {\n        //labelWidth: 220,\n        baseColProps: {\n          xs: 24,\n          sm: 24,\n          md: 24,\n          lg: 14,\n          xl: 14,\n          xxl: 14,\n        },\n        // 代码逻辑说明: [issues/5514]组件页面显示错位\n        actionColOptions: {\n            xs: 24,\n            sm: 8,\n            md: 8,\n            lg: 8,\n            xl: 8,\n            xxl: 8,\n        },\n        schemas: [\n          {\n            label: '角色名称',\n            field: 'roleName',\n            component: 'Input',\n          },\n        ],\n      };\n      //定义表格列\n      const columns = [\n        {\n          title: '角色名称',\n          dataIndex: 'roleName',\n          width: 240,\n          align: 'left',\n        },\n        {\n          title: '角色编码',\n          dataIndex: 'roleCode',\n          // width: 40,\n        },\n      ];\n\n      /**\n       * 确定选择\n       */\n      function handleOk() {\n        getSelectResult((options, values) => {\n          //回传选项和已选择的值\n          emit('getSelectResult', options, values);\n          //关闭弹窗\n          closeModal();\n        });\n      }\n\n      return {\n        config,\n        handleOk,\n        searchInfo,\n        register,\n        indexColumnProps,\n        visibleChange,\n        getRoleList,\n        formConfig,\n        getBindValue,\n        columns,\n        rowSelection,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/modal/UserSelectByDepModal.vue",
    "content": "<!--通过部门选择用户-->\n<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"register\" :title=\"modalTitle\" width=\"1200px\" @ok=\"handleOk\" destroyOnClose @visible-change=\"visibleChange\">\n    <a-row :gutter=\"10\">\n      <a-col :md=\"7\" :sm=\"24\" style=\"height: 613px;overflow: auto \">\n        <a-card :style=\"{ minHeight: '613px', overflow: 'auto' }\">\n          <!--组织机构-->\n          <BasicTree\n            ref=\"treeRef\"\n            :style=\"{ minWidth: '250px' }\"\n            selectable\n            @select=\"onDepSelect\"\n            :load-data=\"loadChildrenTreeData\"\n            :treeData=\"departTree\"\n            :selectedKeys=\"selectedDepIds\"\n            :expandedKeys=\"expandedKeys\"\n            :clickRowToExpand=\"false\"\n          >\n            <template #title=\"{ orgCategory, title }\">\n              <TreeIcon :orgCategory=\"orgCategory\" :title=\"title\"></TreeIcon>\n            </template>\n          </BasicTree>\n        </a-card>\n      </a-col>\n      <a-col :md=\"17\" :sm=\"24\">\n        <a-card :style=\"{ minHeight: '613px', overflow: 'auto' }\">\n          <!--用户列表-->\n          <BasicTable ref=\"tableRef\" v-bind=\"getBindValue\" :searchInfo=\"searchInfo\" :api=\"getTableList\" :rowSelection=\"rowSelection\" :defSort=\"{ column: '', order: '' }\"></BasicTable>\n        </a-card>\n      </a-col>\n    </a-row>\n  </BasicModal>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, unref, ref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicTree } from '/@/components/Tree/index';\n  import { queryTreeList, getTableList as getTableListOrigin } from '/@/api/common/api';\n  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n  import { useSelectBiz } from '/@/components/Form/src/jeecg/hooks/useSelectBiz';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { queryDepartTreeSync as queryDepartTreeSyncOrigin } from '/@/views/system/depart/depart.api';\n  import { selectProps } from '/@/components/Form/src/jeecg/props/props';\n  import TreeIcon from '@/components/Form/src/jeecg/components/TreeIcon/TreeIcon.vue';\n  export default defineComponent({\n    name: 'UserSelectByDepModal',\n    components: {\n      TreeIcon,\n      //此处需要异步加载BasicTable\n      BasicModal,\n      BasicTree,\n      BasicTable: createAsyncComponent(() => import('/@/components/Table/src/BasicTable.vue'), {\n        loading: true,\n      }),\n    },\n    props: {\n      ...selectProps,\n      //选择框标题\n      modalTitle: {\n        type: String,\n        default: '部门用户选择',\n      },\n    },\n    emits: ['register', 'getSelectResult'],\n    setup(props, { emit, refs }) {\n      const tableRef = ref();\n      const treeRef = ref();\n      //注册弹框\n      const [register, { closeModal }] = useModalInner(async (data) => {\n        await queryDepartTree();\n      });\n      const attrs = useAttrs();\n      const departTree = ref([]);\n      const selectedDepIds = ref([]);\n      const expandedKeys = ref([]);\n      const searchInfo = {};\n      /**\n       *表格配置\n       */\n      const tableProps = {\n        columns: [\n          {\n            title: '用户账号',\n            dataIndex: 'username',\n            width: 180,\n          },\n          {\n            title: '用户姓名',\n            dataIndex: 'realname',\n            width: 180,\n          },\n          {\n            title: '性别',\n            dataIndex: 'sex_dictText',\n            width: 80,\n          },\n          {\n            title: '手机号码',\n            dataIndex: 'phone',\n            customRender:( { record, text })=>{\n              if(record.izHideContact && record.izHideContact === '1'){\n                return '/';\n              }\n              return text;\n            }\n            // width: 50,\n          },\n        ],\n        useSearchForm: true,\n        canResize: false,\n        showIndexColumn: false,\n        striped: true,\n        bordered: true,\n        size: 'small',\n        formConfig: {\n          //labelWidth: 200,\n          baseColProps: {\n            xs: 24,\n            sm: 8,\n            md: 6,\n            lg: 8,\n            xl: 6,\n            xxl: 8,\n          },\n          // 代码逻辑说明: [issues/5514]组件页面显示错位\n          actionColOptions: {\n              xs: 24,\n              sm: 12,\n              md: 12,\n              lg: 12,\n              xl: 8,\n              xxl: 8,\n          },\n          schemas: [\n            {\n              label: '账号',\n              field: 'username',\n              component: 'Input',\n            },\n            {\n              label: '姓名',\n              field: 'realname',\n              component: 'Input',\n            },\n          ],\n          resetFunc: customResetFunc,\n        },\n      };\n      const getBindValue = Object.assign({}, unref(props), unref(attrs), tableProps);\n      const [{ rowSelection, visibleChange, indexColumnProps, getSelectResult, reset }] = useSelectBiz(getTableList, getBindValue);\n\n      function getTableList(params) {\n        params = parseParams(params);\n        return getTableListOrigin({...params});\n      }\n\n      function queryDepartTreeSync(params) {\n        params = parseParams(params);\n        return queryDepartTreeSyncOrigin({...params});\n      }\n\n      /**\n       * 解析参数\n       * @param params\n       */\n      function parseParams(params) {\n        if (props?.params) {\n          return {\n            ...params,\n            ...props.params,\n          }\n        }\n        return params;\n      }\n\n      /**\n       * 加载树形数据\n       */\n      function queryDepartTree() {\n        queryDepartTreeSync().then((res) => {\n          if (res) {\n            departTree.value = res;\n            // 默认展开父节点\n            //expandedKeys.value = unref(departTree).map(item => item.id)\n          }\n        });\n      }\n      /**\n       * 加载子级部门\n       */\n      async function loadChildrenTreeData(treeNode) {\n        try {\n          const result = await queryDepartTreeSync({\n            pid: treeNode.eventKey,\n          });\n          const asyncTreeAction = unref(treeRef);\n          if (asyncTreeAction) {\n            asyncTreeAction.updateNodeByKey(treeNode.eventKey, { children: result });\n            asyncTreeAction.setExpandedKeys([treeNode.eventKey, ...asyncTreeAction.getExpandedKeys()]);\n          }\n        } catch (e) {\n          console.error(e);\n        }\n        return Promise.resolve();\n      }\n      /**\n       * 点击树节点,筛选出对应的用户\n       */\n      function onDepSelect(keys) {\n        if (keys[0] != null) {\n          if (unref(selectedDepIds)[0] !== keys[0]) {\n            selectedDepIds.value = [keys[0]];\n          }\n          searchInfo['departId'] = unref(selectedDepIds).join(',');\n          tableRef.value.reload();\n        }\n      }\n      /**\n       * 自定义重置方法\n       * */\n      async function customResetFunc() {\n        console.log('自定义查询');\n        //树节点清空\n        selectedDepIds.value = [];\n        //查询条件清空\n        searchInfo['departId'] = '';\n        //选择项清空\n        reset();\n      }\n      /**\n       * 确定选择\n       */\n      function handleOk() {\n        getSelectResult((options, values) => {\n          //回传选项和已选择的值\n          emit('getSelectResult', options, values);\n          //关闭弹窗\n          closeModal();\n        });\n      }\n\n      return {\n        //config,\n        handleOk,\n        searchInfo,\n        register,\n        indexColumnProps,\n        visibleChange,\n        getBindValue,\n        rowSelection,\n\n        departTree,\n        selectedDepIds,\n        expandedKeys,\n        treeRef,\n        tableRef,\n        getTableList,\n        onDepSelect,\n        loadChildrenTreeData,\n      };\n    },\n  });\n</script>\n\n<style scoped lang=\"less\"></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/modal/UserSelectByDepPostModal.vue",
    "content": "<!--通过部门选择用户-->\n<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"register\" :title=\"modalTitle\" width=\"1200px\" @ok=\"handleOk\" destroyOnClose @visible-change=\"visibleChange\">\n    <a-row :gutter=\"10\">\n      <a-col :md=\"7\" :sm=\"24\">\n        <a-card :style=\"{ minHeight: '613px', overflow: 'auto' }\">\n          <a-input-search placeholder=\"按岗位名称搜索…\" style=\"margin-bottom: 10px\" @search=\"onSearch\" @change=\"handelSearchChange\"/>\n          <!--组织机构-->\n          <BasicTree\n            ref=\"treeRef\"\n            :style=\"{ minWidth: '250px' }\"\n            selectable\n            @select=\"onDepSelect\"\n            :load-data=\"loadChildrenTreeData\"\n            :treeData=\"departTree\"\n            :selectedKeys=\"selectedDepIds\"\n            :expandedKeys=\"expandedKeys\"\n            :clickRowToExpand=\"false\"\n            :key=\"reloadKey\"\n          >\n            <template #title=\"{ orgCategory, title }\">\n              <TreeIcon :orgCategory=\"orgCategory\" :title=\"title\"></TreeIcon>\n            </template>\n          </BasicTree>\n        </a-card>\n      </a-col>\n      <a-col :md=\"17\" :sm=\"24\">\n        <a-card :style=\"{ minHeight: '613px', overflow: 'auto' }\">\n          <!--用户列表-->\n          <BasicTable ref=\"tableRef\" v-bind=\"getBindValue\" :searchInfo=\"searchInfo\" :api=\"getTableList\" :rowSelection=\"rowSelection\"></BasicTable>\n        </a-card>\n      </a-col>\n    </a-row>\n  </BasicModal>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, unref, ref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicTree } from '/@/components/Tree/index';\n  import { queryDepartPostUserPageList as getTableListOrigin} from '/@/api/common/api';\n  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n  import { useSelectBiz } from '/@/components/Form/src/jeecg/hooks/useSelectBiz';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import TreeIcon from '/@/components/Form/src/jeecg/components/TreeIcon/TreeIcon.vue';\n  import { queryDepartAndPostTreeSync as queryDepartTreeSyncOrigin } from '/@/views/system/depart/depart.api';\n  import { selectProps } from '/@/components/Form/src/jeecg/props/props';\n  import {defHttp} from \"@/utils/http/axios\";\n  export default defineComponent({\n    name: 'UserSelectByDepPostModal',\n    components: {\n      //此处需要异步加载BasicTable\n      BasicModal,\n      BasicTree,\n      BasicTable: createAsyncComponent(() => import('/@/components/Table/src/BasicTable.vue'), {\n        loading: true,\n      }),\n      TreeIcon,\n    },\n    props: {\n      ...selectProps,\n      //选择框标题\n      modalTitle: {\n        type: String,\n        default: '部门用户选择',\n      },\n    },\n    emits: ['register', 'getSelectResult'],\n    setup(props, { emit, refs }) {\n      const tableRef = ref();\n      const treeRef = ref();\n      //注册弹框\n      const [register, { closeModal }] = useModalInner(async (data) => {\n        await queryDepartTree();\n      });\n      const attrs = useAttrs();\n      const departTree = ref<any>([]);\n      const selectedDepIds = ref([]);\n      const expandedKeys = ref([]);\n      const searchInfo = {};\n      //树加载的key\n      const reloadKey = ref(Math.random());\n      \n      /**\n       *表格配置\n       */\n      const tableProps = {\n        columns: [\n          {\n            title: '用户账号',\n            dataIndex: 'username',\n            width: 180,\n          },\n          {\n            title: '用户姓名',\n            dataIndex: 'realname',\n            width: 180,\n          },\n          {\n            title: '性别',\n            dataIndex: 'sex_dictText',\n            width: 80,\n          },\n          {\n            title: '手机号码',\n            dataIndex: 'phone',\n            customRender:( { record, text })=>{\n              if(record.izHideContact && record.izHideContact === '1'){\n                return '/';\n              }\n              return text;\n            }\n          },\n        ],\n        useSearchForm: true,\n        canResize: false,\n        showIndexColumn: false,\n        striped: true,\n        bordered: true,\n        size: 'small',\n        formConfig: {\n          //labelWidth: 200,\n          baseColProps: {\n            xs: 24,\n            sm: 8,\n            md: 6,\n            lg: 8,\n            xl: 6,\n            xxl: 10,\n          },\n          // 代码逻辑说明: [issues/5514]组件页面显示错位\n          actionColOptions: {\n            xs: 24,\n            sm: 12,\n            md: 12,\n            lg: 12,\n            xl: 8,\n            xxl: 8,\n          },\n          schemas: [\n            {\n              label: '账号',\n              field: 'username',\n              component: 'Input',\n            },\n          ],\n          resetFunc: customResetFunc,\n        },\n      };\n      const getBindValue = Object.assign({}, unref(props), unref(attrs), tableProps);\n      const [{ rowSelection, visibleChange, indexColumnProps, getSelectResult, reset }] = useSelectBiz(getTableList, getBindValue);\n\n      function getTableList(params) {\n        params = parseParams(params);\n        return getTableListOrigin({ ...params });\n      }\n\n      function queryDepartTreeSync(params) {\n        params = parseParams(params);\n        return queryDepartTreeSyncOrigin({ ...params });\n      }\n\n      /**\n       * 解析参数\n       * @param params\n       */\n      function parseParams(params) {\n        if (props?.params) {\n          return {\n            ...params,\n            ...props.params,\n          };\n        }\n        return params;\n      }\n\n      /**\n       * 加载树形数据\n       */\n      function queryDepartTree() {\n        queryDepartTreeSync({}).then((res) => {\n          if (res) {\n            departTree.value = res;\n          }\n        });\n      }\n\n      /**\n       * 加载子级部门\n       */\n      async function loadChildrenTreeData(treeNode) {\n        try {\n          const result = await queryDepartTreeSync({\n            pid: treeNode.eventKey,\n          });\n          const asyncTreeAction = unref(treeRef);\n          if (asyncTreeAction) {\n            asyncTreeAction.updateNodeByKey(treeNode.eventKey, { children: result });\n            asyncTreeAction.setExpandedKeys([treeNode.eventKey, ...asyncTreeAction.getExpandedKeys()]);\n          }\n        } catch (e) {\n          console.error(e);\n        }\n        return Promise.resolve();\n      }\n      /**\n       * 点击树节点,筛选出对应的用户\n       */\n      function onDepSelect(keys) {\n        if (keys[0] != null) {\n          if (unref(selectedDepIds)[0] !== keys[0]) {\n            selectedDepIds.value = [keys[0]];\n          }\n          searchInfo['departId'] = unref(selectedDepIds).join(',');\n          tableRef.value.reload();\n        }\n      }\n      /**\n       * 自定义重置方法\n       * */\n      async function customResetFunc() {\n        console.log('自定义查询');\n        //树节点清空\n        selectedDepIds.value = [];\n        //查询条件清空\n        searchInfo['departId'] = '';\n        //选择项清空\n        reset();\n      }\n      /**\n       * 确定选择\n       */\n      function handleOk() {\n        getSelectResult((options, values) => {\n          //回传选项和已选择的值\n          emit('getSelectResult', options, values);\n          //关闭弹窗\n          closeModal();\n        });\n      }\n\n      /**\n       * 岗位搜索\n       *\n       * @param value\n       */\n      async function onSearch(value) {\n        if(value){\n          let result = await defHttp.get({ url: \"/sys/sysDepart/searchBy\", params: { keyWord: value, orgCategory: \"3\",...props.params } });\n          if (Array.isArray(result)) {\n            departTree.value = result;\n          } else {\n            departTree.value = [];\n          }\n        } else {\n          departTree.value = [];\n          await queryDepartTree();\n        }\n      }\n\n      /**\n       * 搜索值改变事件\n       * @param value\n       */\n      function handelSearchChange(value) {\n        if(!value.target.value){\n          reloadKey.value = Math.random();\n        }\n      }\n\n      return {\n        //config,\n        handleOk,\n        searchInfo,\n        register,\n        indexColumnProps,\n        visibleChange,\n        getBindValue,\n        rowSelection,\n\n        departTree,\n        selectedDepIds,\n        expandedKeys,\n        treeRef,\n        tableRef,\n        getTableList,\n        onDepSelect,\n        loadChildrenTreeData,\n        onSearch,\n        handelSearchChange,\n        reloadKey,\n      };\n    },\n  });\n</script>\n\n<style scoped lang=\"less\"></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/modal/UserSelectModal.vue",
    "content": "<!--用户选择框-->\n<template>\n  <div>\n    <BasicModal\n      v-bind=\"$attrs\"\n      @register=\"register\"\n      :title=\"modalTitle\"\n      :width=\"showSelected ? '1200px' : '900px'\"\n      :wrapClassName=\"modalWrapClassName\"\n      @ok=\"handleOk\"\n      @cancel=\"handleCancel\"\n      :maxHeight=\"maxHeight\"\n      :centered=\"true\"\n      destroyOnClose\n      @visible-change=\"visibleChange\"\n      \n    >\n      <a-row>\n        <a-col :span=\"showSelected ? 18 : 24\">\n          <BasicTable\n            ref=\"tableRef\"\n            :columns=\"columns\"\n            :scroll=\"tableScroll\"\n            v-bind=\"getBindValue\"\n            :useSearchForm=\"true\"\n            :formConfig=\"formConfig\"\n            :api=\"hasCustomApi ? customListApi : getUserList\"\n            :searchInfo=\"searchInfo\"\n            :rowSelection=\"rowSelection\"\n            :indexColumnProps=\"indexColumnProps\"\n            :afterFetch=\"afterFetch\"\n            :beforeFetch=\"beforeFetch\"\n            :defSort=\"{ column: '', order: '' }\"\n          >\n            <template #tableTitle></template>\n          </BasicTable>\n        </a-col>\n        <a-col :span=\"showSelected ? 6 : 0\">\n          <BasicTable\n            v-bind=\"selectedTable\"\n            :dataSource=\"selectRows\"\n            :useSearchForm=\"true\"\n            :formConfig=\"{ showActionButtonGroup: false, baseRowStyle: { minHeight: '40px' } }\"\n          >\n            <!--操作栏-->\n            <template #action=\"{ record }\">\n              <a href=\"javascript:void(0)\" @click=\"handleDeleteSelected(record)\"><Icon icon=\"ant-design:delete-outlined\"></Icon></a>\n            </template>\n          </BasicTable>\n        </a-col>\n      </a-row>\n    </BasicModal>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, unref, ref, watch, computed } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { getUserList } from '/@/api/common/api';\n  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n  import { useSelectBiz } from '/@/components/Form/src/jeecg/hooks/useSelectBiz';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { selectProps } from '/@/components/Form/src/jeecg/props/props';\n  import { isArray, cloneDeep } from 'lodash-es';\n  export default defineComponent({\n    name: 'UserSelectModal',\n    components: {\n      //此处需要异步加载BasicTable\n      BasicModal,\n      BasicTable: createAsyncComponent(() => import('/@/components/Table/src/BasicTable.vue'), {\n        loading: true,\n      }),\n    },\n    props: {\n      ...selectProps,\n      //选择框标题\n      modalTitle: {\n        type: String,\n        default: '选择用户',\n      },\n      //排除用户id的集合\n      excludeUserIdList: {\n        type: Array,\n        default: [],\n      },\n\n      // wrap类名\n      modalWrapClassName: {\n        type: String,\n        default: 'j-user-select-modal',\n      },\n      // 查询table数据使用的自定义接口\n      customListApi: {type: Function},\n      // 自定义接口的查询条件是否使用 JInput\n      customApiJInput: {type: Boolean, default: true},\n      // 自定义表单配置条件\n      customFormConfig: {type: Object},\n      // 自定义表格列\n      customTableColumns: {type: Array},\n    },\n    emits: ['register', 'getSelectResult', 'close'],\n    setup(props, { emit, refs }) {\n      // 代码逻辑说明: VUEN-1086 【移动端】用户选择 查询按钮 效果不好 列表展示没有滚动条\n      const tableScroll = ref<any>({ x: false });\n      const tableRef = ref();\n      const maxHeight = ref(600);\n\n      const hasCustomApi = computed(() => typeof props.customListApi === 'function');\n\n      //注册弹框\n      const [register, { closeModal }] = useModalInner(() => {\n        if (window.innerWidth < 900) {\n          tableScroll.value = { x: 900 };\n        } else {\n          tableScroll.value = { x: false };\n        }\n        // 代码逻辑说明: VUEN-1112 一对多 用户选择 未显示选择条数，及清空\n        setTimeout(() => {\n          // update-begin--author:liaozhiyang---date:20260120--for：【issues/9275】用户组件第二次点击取消时勾选值还是回显了\n          let selectedData = selectValues['value'];\n          if (isArray(selectedData)) {\n            selectedData = cloneDeep(selectedData);\n          }\n          // update-end--author:liaozhiyang---date:20260120--for：【issues/9275】用户组件第二次点击取消时勾选值还是回显了\n          if (tableRef.value) {\n            tableRef.value.setSelectedRowKeys(selectedData || []);\n          }\n        }, 800);\n      });\n      const attrs = useAttrs();\n      //表格配置\n      const config = {\n        canResize: false,\n        bordered: true,\n        size: 'small',\n      };\n      const getBindValue = Object.assign({}, unref(props), unref(attrs), config);\n      const [{ rowSelection, visibleChange, selectValues, indexColumnProps, getSelectResult, handleDeleteSelected, selectRows }] = useSelectBiz(\n        getUserList,\n        getBindValue,\n        emit\n      );\n      const searchInfo = ref(props.params);\n      // 代码逻辑说明: 【issues/657】右侧选中列表删除无效\n      watch(rowSelection.selectedRowKeys, (newVal) => {\n        // 代码逻辑说明: null指针异常导致控制台报错页面不显示------------\n        if(tableRef.value){\n          tableRef.value.setSelectedRowKeys(newVal);\n        }\n      });\n      //查询form\n      const formConfig = {\n        baseColProps: {\n          xs: 24,\n          sm: 8,\n          md: 6,\n          lg: 8,\n          xl: 6,\n          xxl: 6,\n        },\n        // 代码逻辑说明: VUEN-1086 【移动端】用户选择 查询按钮 效果不好 列表展示没有滚动条---查询表单按钮的栅格布局和表单的保持一致\n        actionColOptions: {\n          xs: 24,\n          sm: 8,\n          md: 8,\n          lg: 8,\n          xl: 8,\n          xxl: 8,\n        },\n        schemas: [\n          {\n            label: '账号',\n            field: 'username',\n            component: (hasCustomApi.value && !props.customApiJInput) ? 'Input' : 'JInput',\n          },\n          {\n            label: '姓名',\n            field: 'realname',\n            component: (hasCustomApi.value && !props.customApiJInput) ? 'Input' : 'JInput',\n          },\n        ],\n        autoSubmitOnEnter: true,\n\n        ...props.customFormConfig,\n      };\n      //定义表格列\n      const columns = props.customTableColumns?.length ? props.customTableColumns : [\n        {\n          title: '用户账号',\n          dataIndex: 'username',\n          width: 120,\n          align: 'left',\n        },\n        {\n          title: '用户姓名',\n          dataIndex: 'realname',\n          width: 120,\n        },\n        {\n          title: '性别',\n          dataIndex: 'sex_dictText',\n          width: 50,\n        },\n        {\n          title: '手机号码',\n          dataIndex: 'phone',\n          width: 120,\n          customRender:( { record, text })=>{\n            if(record.izHideContact && record.izHideContact === '1'){\n              return '/';\n            }\n            return text;\n          }\n        },\n        {\n          title: '邮箱',\n          dataIndex: 'email',\n          customRender:( { record, text })=>{\n            if(record.izHideContact && record.izHideContact === '1'){\n              return text?'/':'';\n            }\n            return text;\n          }\n          // width: 40,\n        },\n        {\n          title: '状态',\n          dataIndex: 'status_dictText',\n          width: 80,\n        },\n      ];\n      //已选择的table信息\n      const selectedTable = {\n        pagination: false,\n        showIndexColumn: false,\n        scroll: { y: 390 },\n        size: 'small',\n        canResize: false,\n        bordered: true,\n        rowKey: 'id',\n        columns: [\n          {\n            title: '用户姓名',\n            dataIndex: 'realname',\n            width: 40,\n          },\n          {\n            title: '操作',\n            dataIndex: 'action',\n            align: 'center',\n            width: 40,\n            slots: { customRender: 'action' },\n          },\n        ],\n      };\n      /**\n       * 确定选择\n       */\n      function handleOk() {\n        getSelectResult((options, values) => {\n          //回传选项和已选择的值\n          emit('getSelectResult', options, values);\n          //关闭弹窗\n          closeModal();\n        });\n      }\n      \n      /**\n       * 用户返回结果逻辑查询\n       */\n      function afterFetch(record) {\n        let excludeList = props.excludeUserIdList;\n        if(!excludeList){\n          return record;\n        }\n        let arr:any[] = [];\n        //如果存在过滤用户id集合，并且后台返回的数据不为空\n        if(excludeList.length>0 && record && record.length>0){\n          for(let item of record){\n            if(excludeList.indexOf(item.id)<0){\n              arr.push({...item})\n            }\n          }\n          return arr;\n        }\n        return record;\n      }\n      // 代码逻辑说明: 【QQYUN-9366】用户选择组件取消和关闭会把选择数据带入\n      const handleCancel = () => {\n        emit('close');\n      };\n\n      // 代码逻辑说明: 【TV360X-305】小屏幕展示10条\n      const clientHeight = document.documentElement.clientHeight * 200;\n      maxHeight.value = clientHeight > 600 ? 600 : clientHeight;\n\n      /**\n       * 请求之前根据创建时间排序\n       *\n       * @param params\n       */\n      function beforeFetch(params) {\n        return Object.assign({ column: 'createTime', order: 'desc' }, params);\n      }\n\n      return {\n        //config,\n        handleOk,\n        searchInfo,\n        register,\n        indexColumnProps,\n        visibleChange,\n        getBindValue,\n        getUserList,\n        formConfig,\n        columns,\n        rowSelection,\n        selectRows,\n        selectedTable,\n        handleDeleteSelected,\n        tableScroll,\n        tableRef,\n        afterFetch,\n        handleCancel,\n        maxHeight,\n        beforeFetch,\n        hasCustomApi,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/positionSelect/PositionSelectModal.vue",
    "content": "<template>\n    <BasicModal\n        @register=\"register\"\n        :getContainer=\"getContainer\"\n        :canFullscreen=\"false\"\n        :title=\"title\"\n        :width=\"500\"\n        destroyOnClose\n        @ok=\"handleOk\"\n        wrapClassName=\"j-user-select-modal2\" >\n\n        <div style=\"position: relative; min-height: 350px\">\n            <div style=\"width: 100%\">\n                <a-input v-model:value=\"searchText\" allowClear style=\"width: 100%\" placeholder=\"搜索\">\n                    <template #prefix>\n                        <SearchOutlined style=\"color: #c0c0c0\" />\n                    </template>\n                </a-input>\n            </div>\n\n            <!-- tabs -->\n            <div class=\"modal-select-list-container\">\n                <div class=\"scroll\">\n                    <div class=\"content\" style=\"right: -10px\">\n                        \n                        <label class=\"item\" v-for=\"item in showDataList\" @click=\"(e)=>onSelect(e, item)\">\n                            <a-checkbox v-model:checked=\"item.checked\">\n                                <span>{{ item.name }}</span>\n                            </a-checkbox>\n                        </label>\n                    </div>\n                    \n                </div>\n            </div>\n\n            <!-- 选中用户 -->\n            <div class=\"selected-users\" style=\"width: 100%; overflow-x: hidden\">\n                <SelectedUserItem v-for=\"item in selectedList\" :info=\"item\" @unSelect=\"unSelect\" />\n            </div>\n        </div>\n    </BasicModal>\n</template>\n\n<script lang=\"ts\">\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { SearchOutlined, CloseOutlined } from '@ant-design/icons-vue';\n  import SelectedUserItem from '../userSelect/SelectedUserItem.vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { computed, ref, toRaw, watch } from 'vue';\n  \n  export default {\n    name: 'PositionSelectModal',\n    components: {\n      BasicModal,\n      SearchOutlined,\n      CloseOutlined,\n      SelectedUserItem,\n    },\n    props: {\n      multi: {\n        type: Boolean,\n        default: true,\n      },\n      getContainer: {\n        type: Function,\n        default: null,\n      },\n      title:{\n        type: String,\n        default: '',\n      },\n      type: {\n        type: String,\n        default: 'sys_position',\n      },\n      appId: {\n        type: String,\n        default: '',\n      }\n    },\n    emits: ['selected', 'register'],\n    setup(props, { emit }) {\n\n      const searchText = ref('');\n      const selectedIdList = computed(() => {\n        let arr = selectedList.value;\n        if (!arr || arr.length == 0) {\n          return [];\n        } else {\n          return arr.map((k) => k.id);\n        }\n      });\n\n      watch(()=>props.appId, async (val)=>{\n        if(val){\n          await loadDataList();\n        }\n      }, {immediate: true});\n      \n      \n      // 弹窗事件\n      const [register] = useModalInner(() => {\n        let list = dataList.value;\n        if(!list || list.length ==0 ){\n        }\n        for(let item of list){\n          item.checked = false\n        }\n      });\n\n      // 确定事件\n      function handleOk() {\n        let arr = toRaw(selectedIdList.value);\n        emit('selected', arr);\n      }\n      \n      const dataList = ref<any[]>([]);\n      const showDataList = computed(()=>{\n        let list = dataList.value;\n        if(!list || list.length ==0 ){\n          return []\n        }\n        let text = searchText.value;\n        if(!text){\n          return list\n        }\n        return list.filter(item=>item.name.indexOf(text)>=0)\n      });\n  \n      const selectedList = computed(()=>{\n        let list = dataList.value;\n        if(!list || list.length ==0 ){\n          return []\n        }\n        return list.filter(item=>item.checked)\n      });\n\n      function unSelect(id) {\n        let list = dataList.value;\n        if(!list || list.length ==0 ){\n          return;\n        }\n        let arr = list.filter(item=>item.id == id);\n        arr[0].checked = false;\n      }\n      \n      async function loadDataList() {\n        let params = {\n          pageNo: 1,\n          pageSize: 200,\n          column: 'createTime',\n          order: 'desc'\n        };\n        const url = '/sys/position/list'\n        const data = await defHttp.get({ url, params }, { isTransformResponse: false });\n        if (data.success) {\n          const { records } = data.result;\n          let arr:any[] = [];\n          if(records && records.length>0){\n            for(let item of records){\n              arr.push({\n                id: item.id,\n                name: item.name || item.roleName,\n                selectType: props.type,\n                checked: false\n              })\n            }\n          }\n          dataList.value = arr;\n        } else {\n          console.error(data.message);\n        }\n        console.log('loadDataList', data);\n      }\n\n\n      function onSelect(e, item) {\n        prevent(e);\n        console.log('onselect');\n        item.checked = !item.checked;\n      }\n\n      function prevent(e) {\n        e.preventDefault();\n        e.stopPropagation();\n      }\n\n      return {\n        register,\n        showDataList,\n        searchText,\n        handleOk,\n        selectedList,\n        selectedIdList,\n        unSelect,\n        onSelect\n      \n      };\n    },\n  };\n</script>\n<style scoped lang=\"less\">\n    .modal-select-list-container{\n        height: 352px;\n        margin-top: 12px;\n        overflow: auto;\n        .scroll{\n            height: 100%;\n            position: relative;\n            width: 100%;\n            overflow: hidden;\n            .content{\n                bottom: 0;\n                left: 0;\n                overflow: scroll;\n                overflow-x: hidden;\n                position: absolute;\n                right: 0;\n                top: 0;\n                .item{\n                    padding: 7px 5px;\n                    cursor: pointer;\n                    display: block;\n                    &:hover{\n                        background-color: #f5f5f5;\n                    }\n                }\n               \n            }\n        }\n\n       \n    }\n</style>\n\n<style lang=\"less\">\n    .j-user-select-modal2 {\n        .depart-select {\n            .ant-select-selector {\n                color: #fff !important;\n                background-color: #409eff !important;\n                border-radius: 5px !important;\n            }\n            .ant-select-selection-item,\n            .ant-select-arrow {\n                color: #fff !important;\n            }\n        }\n        .my-search {\n            position: absolute;\n            top: 14px;\n            z-index: 1;\n            &.all-width {\n                width: 100%;\n            }\n\n            .anticon {\n                cursor: pointer;\n                &:hover {\n                    color: #0a8fe9 !important;\n                }\n            }\n            .hidden {\n                display: none;\n            }\n        }\n\n        .my-tabs {\n        }\n\n        .selected-users {\n            display: flex;\n            flex-wrap: wrap;\n            flex-direction: row;\n            padding-top: 15px;\n        }\n\n        .scroll-container {\n            padding-bottom: 0 !important;\n        }\n    }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/roleSelect/RoleSelectInput.vue",
    "content": "<template>\n  <div>\n    <div @click=\"showModal\" :class=\"disabled ? 'select-input disabled-select' : 'select-input'\">\n      <template v-if=\"selectedList.length > 0\">\n        <template v-for=\"(item, index) in selectedList\">\n          <SelectedUserItem v-if=\"index < maxSelectCount\" :info=\"item\" @unSelect=\"unSelect\" query />\n        </template>\n      </template>\n      <span v-else style=\"height: 30px; line-height: 30px; display: inline-block; margin-left: 7px; color: #bfbfbf\">请选择</span>\n      <div v-if=\"ellipsisInfo.status\" class=\"user-selected-item\">\n        <div class=\"user-select-ellipsis\">\n          <span style=\"color: red\">+{{ ellipsisInfo.count }}...</span>\n        </div>\n      </div>\n    </div>\n    <RoleSelectModal :appId=\"currentAppId\" :multi=\"multi\" :getContainer=\"getContainer\" title=\"选择组织角色\" @register=\"registerRoleModal\" @selected=\"onSelected\" />\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { useModal } from '/@/components/Modal';\n  import { defHttp } from '/@/utils/http/axios';\n  import { computed, ref, watch, watchEffect, defineComponent } from 'vue';\n  import RoleSelectModal from './RoleSelectModal.vue';\n  import SelectedUserItem from '../userSelect/SelectedUserItem.vue';\n  import { Form } from 'ant-design-vue';\n  import { useUserStore } from '/@/store/modules/user';\n\n  const maxCount = 3;\n\n  export default defineComponent({\n    name: 'RoleSelectInput',\n    components: {\n      RoleSelectModal,\n      SelectedUserItem,\n    },\n    props: {\n      disabled: {\n        type: Boolean,\n        default: false,\n      },\n      // 代码逻辑说明: 【issues/8078】角色选择组件点击文字部分会一直选中\n      maxSelectCount: {\n        type: Number,\n        default: 2,\n      },\n      store: {\n        type: String,\n        default: 'id',\n      },\n      value: {\n        type: String,\n        default: '',\n      },\n      multi: {\n        type: Boolean,\n        default: false,\n      },\n      getContainer: {\n        type: Function,\n        default: null,\n      },\n      appId: {\n        type: String,\n        default: '',\n      },\n    },\n    emits: ['update:value', 'change'],\n    setup(props, { emit }) {\n      const formItemContext = Form.useInjectFormItemContext();\n      const selectedList = ref<any[]>([]);\n      const loading = ref(true);\n\n      const [registerRoleModal, { openModal: openRoleModal, closeModal: closeRoleModal }] = useModal();\n      function showModal(e) {\n        e.preventDefault();\n        e.stopPropagation();\n        let list = selectedList.value.map((item) => item.id);\n        openRoleModal(true, {\n          list,\n        });\n      }\n\n      const ellipsisInfo = computed(() => {\n        let max = props.maxSelectCount;\n        let len = selectedList.value.length;\n        if (len > max) {\n          return { status: true, count: len - max };\n        } else {\n          return { status: false };\n        }\n      });\n\n      function unSelect(id) {\n        console.log('unSelectUser', id);\n        loading.value = false;\n        let arr = selectedList.value;\n        let index = -1;\n        for (let i = 0; i < arr.length; i++) {\n          if (arr[i].id == id) {\n            index = i;\n            break;\n          }\n        }\n        if (index >= 0) {\n          arr.splice(index, 1);\n          selectedList.value = arr;\n          onSelectedChange();\n        }\n      }\n\n      function onSelectedChange() {\n        let temp: any[] = [];\n        let arr = selectedList.value;\n        if (arr && arr.length > 0) {\n          temp = arr.map((k) => {\n            return k[props.store];\n          });\n        }\n        let str = temp.join(',');\n        emit('update:value', str);\n        emit('change', str);\n        formItemContext.onFieldChange();\n        console.log('选中数据', str);\n      }\n\n      function onSelected(_v, values) {\n        console.log('角色选择完毕：', values);\n        loading.value = false;\n        if (values && values.length > 0) {\n          selectedList.value = values;\n        } else {\n          selectedList.value = [];\n        }\n        onSelectedChange();\n        closeRoleModal();\n      }\n\n      // 目前仅用于数据重新加载的一个状态\n      const currentAppId = ref('');\n      const userStore = useUserStore();\n      watchEffect(() => {\n        let tenantId = userStore.getTenant;\n        let appId = props.appId;\n        if (appId) {\n          currentAppId.value = appId;\n        } else {\n          currentAppId.value = new Date().getTime() + '-' + tenantId;\n        }\n      });\n\n      watch(\n        () => props.value,\n        async (val) => {\n          if (val) {\n            if (loading.value === true) {\n              await getRoleList(val);\n            }\n          } else {\n            selectedList.value = [];\n          }\n          loading.value = true;\n        },\n        { immediate: true }\n      );\n\n      /**\n       * 获取角色列表\n       * @param ids\n       */\n      async function getRoleList(ids) {\n        const url = '/sys/role/listByTenant';\n        let params = {\n          [props.store]: ids,\n          pageSize: 200\n        };\n        // 特殊条件处理（因为后台实体是roleCode，所以折中一下，不能直接改，会出问题）\n        if (props.store === 'code') {\n          params.roleCode = ids;\n        }\n        selectedList.value = [];\n        const data = await defHttp.get({ url, params }, { isTransformResponse: false });\n        console.log('getRoleList>>', data);\n        if (data.success) {\n          const { records } = data.result;\n          let arr: any[] = [];\n          if (records && records.length > 0) {\n            for (let item of records) {\n              arr.push({\n                id: item.id,\n                name: item.name || item.roleName,\n                code: item.roleCode,\n                checked: true,\n                selectType: 'sys_role',\n              });\n            }\n            // 根据 ids 的顺序对 arr 进行排序\n            if (props.store === 'code') {\n              arr.sort((a, b) => ids.indexOf(a.code) - ids.indexOf(b.code));\n            } else {\n              arr.sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id));\n            }\n          }\n          selectedList.value = arr;\n        } else {\n          console.error(data.message);\n        }\n      }\n\n      return {\n        selectedList,\n        ellipsisInfo,\n        registerRoleModal,\n        closeRoleModal,\n        showModal,\n        onSelected,\n        unSelect,\n        currentAppId,\n      };\n    },\n  });\n</script>\n\n<style scoped lang=\"less\">\n  .select-input {\n    padding: 0 5px;\n    background-color: #fff;\n    border: 1px solid #ccc;\n    border-radius: 3px;\n    box-sizing: border-box;\n    display: flex;\n    color: #9e9e9e;\n    font-size: 14px;\n    flex-wrap: nowrap;\n    min-height: 32px;\n    overflow-x: hidden;\n    &.disabled-select {\n      cursor: not-allowed;\n      background-color: #f5f5f5 !important;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/roleSelect/RoleSelectModal.vue",
    "content": "<template>\n    <BasicModal\n        @register=\"register\"\n        :getContainer=\"getContainer\"\n        :canFullscreen=\"false\"\n        :title=\"title\"\n        :width=\"500\"\n        destroyOnClose\n        @ok=\"handleOk\"\n        wrapClassName=\"j-user-select-modal2\" >\n\n        <div style=\"position: relative; min-height: 350px\">\n            <div style=\"width: 100%\">\n                <a-input v-model:value=\"searchText\" allowClear style=\"width: 100%\" placeholder=\"搜索\">\n                    <template #prefix>\n                        <SearchOutlined style=\"color: #c0c0c0\" />\n                    </template>\n                </a-input>\n            </div>\n\n            <!-- tabs -->\n            <div class=\"modal-select-list-container\">\n                <div class=\"scroll\">\n                    <div class=\"content\" style=\"right: -10px\">\n                        \n                        <label class=\"item\" v-for=\"item in showDataList\" @click=\"(e)=>onSelect(e, item)\">\n                            <a-checkbox v-model:checked=\"item.checked\">\n                                <span class=\"text\">{{ item.name }}</span>\n                            </a-checkbox>\n                        </label>\n                    </div>\n                    \n                </div>\n            </div>\n\n            <!-- 选中用户 -->\n            <div class=\"selected-users\" style=\"width: 100%; overflow-x: hidden\">\n                <SelectedUserItem v-for=\"item in selectedList\" :info=\"item\" @unSelect=\"unSelect\" />\n            </div>\n        </div>\n    </BasicModal>\n</template>\n\n<script lang=\"ts\">\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { SearchOutlined, CloseOutlined } from '@ant-design/icons-vue';\n  import SelectedUserItem from '../userSelect/SelectedUserItem.vue';\n  import { defHttp } from '/@/utils/http/axios';\n\n  import { computed, ref, toRaw, watch } from 'vue';\n  export default {\n    name: 'RoleSelectModal',\n    components: {\n      BasicModal,\n      SearchOutlined,\n      CloseOutlined,\n      SelectedUserItem,\n    },\n    props: {\n      multi: {\n        type: Boolean,\n        default: true,\n      },\n      getContainer: {\n        type: Function,\n        default: null,\n      },\n      title:{\n        type: String,\n        default: '',\n      },\n      type: {\n        type: String,\n        default: 'sys_role',\n      },\n      appId: {\n        type: String,\n        default: '',\n      }\n    },\n    emits: ['selected', 'register'],\n    setup(props, { emit }) {\n\n      const searchText = ref('');\n      const selectedIdList = computed(() => {\n        let arr = selectedList.value;\n        if (!arr || arr.length == 0) {\n          return [];\n        } else {\n          return arr.map((k) => k.id);\n        }\n      });\n\n      watch(()=>props.appId, async (val)=>{\n        if(val){\n          await loadDataList();\n        }\n      }, {immediate: true});\n      \n      \n      // 弹窗事件\n      const [register] = useModalInner((data) => {\n        let list = dataList.value;\n        if(!list || list.length ==0 ){\n        }else{\n          let selectedIdList = data.list || [];\n          for(let item of list){\n            if(selectedIdList.indexOf(item.id)>=0){\n              item.checked = true;\n            }else{\n              item.checked = false;\n            }\n          }\n        }\n      });\n\n      // 确定事件\n      function handleOk() {\n        let arr = toRaw(selectedIdList.value);\n        emit('selected', arr, toRaw(selectedList.value));\n      }\n      \n      const dataList = ref<any[]>([]);\n      const showDataList = computed(()=>{\n        let list = dataList.value;\n        if(!list || list.length ==0 ){\n          return []\n        }\n        let text = searchText.value;\n        if(!text){\n          return list\n        }\n        return list.filter(item=>item.name.indexOf(text)>=0)\n      });\n\n      const selectedKeys = ref<string[]>([]);\n      const selectedList = computed(()=>{\n        let list = dataList.value;\n        if(!list || list.length ==0 ){\n          return []\n        }\n        list = list.filter(item=>item.checked)\n        // 根据 selectedKeys 的顺序排序\n        let arr: any[] = [];\n        for (let key of selectedKeys.value) {\n          let item = list.find(item => item.id == key);\n          if (item) {\n            arr.push(item);\n          }\n        }\n        return arr;\n      });\n\n      function unSelect(id) {\n        let list = dataList.value;\n        if(!list || list.length ==0 ){\n          return;\n        }\n        // 代码逻辑说明: 【issues/8078】角色选择组件点击文字部分会一直选中\n        let findItem = list.find((item) => item.id == id);\n        findItem.checked = false;\n        selectedKeys.value = selectedKeys.value.filter((key) => key != id);\n      }\n      \n      async function loadDataList() {\n        let params = {\n          pageNo: 1,\n          pageSize: 200,\n          column: 'createTime',\n          order: 'desc'\n        };\n        const url = '/sys/role/listByTenant';\n        const data = await defHttp.get({ url, params }, { isTransformResponse: false });\n        if (data.success) {\n          const { records } = data.result;\n          let arr:any[] = [];\n          if(records && records.length>0){\n            for(let item of records){\n              arr.push({\n                id: item.id,\n                name: item.name || item.roleName,\n                code: item.roleCode,\n                selectType: props.type,\n                checked: false\n              })\n            }\n          }\n          dataList.value = arr;\n        } else {\n          console.error(data.message);\n        }\n        console.log('loadDataList', data);\n      }\n\n      function onSelect(e, item) {\n        prevent(e);\n        // 单选模式下，先清除所有选中状态\n        if (!props.multi) {\n          dataList.value.forEach(dataItem => {\n            if (dataItem.id != item.id) {\n              dataItem.checked = false;\n            }\n          });\n          // 清空已选择的keys\n          selectedKeys.value = [];\n        }\n\n        // 切换当前项的选中状态\n        item.checked = !item.checked;\n\n        // 更新selectedKeys数组\n        if (item.checked) {\n          selectedKeys.value.push(item.id);\n        } else {\n          selectedKeys.value = selectedKeys.value.filter(key => key !== item.id);\n        }\n      }\n\n      function prevent(e) {\n        e.preventDefault();\n        e.stopPropagation();\n      }\n\n      return {\n        register,\n        showDataList,\n        searchText,\n        handleOk,\n        selectedList,\n        selectedIdList,\n        unSelect,\n        onSelect\n      \n      };\n    },\n  };\n</script>\n<style scoped lang=\"less\">\n    .modal-select-list-container{\n        height: 352px;\n        margin-top: 12px;\n        overflow: auto;\n        .scroll{\n            height: 100%;\n            position: relative;\n            width: 100%;\n            overflow: hidden;\n            .content{\n                bottom: 0;\n                left: 0;\n                overflow: scroll;\n                overflow-x: hidden;\n                position: absolute;\n                right: 0;\n                top: 0;\n                .item{\n                    padding: 7px 5px;\n                    cursor: pointer;\n                    display: block;\n                    &:hover{\n                        background-color: #f5f5f5;\n                    }\n                }\n               \n            }\n        }\n\n       \n    }\n</style>\n\n<style lang=\"less\">\n    .j-user-select-modal2 {\n        .depart-select {\n            .ant-select-selector {\n                color: #fff !important;\n                background-color: #409eff !important;\n                border-radius: 5px !important;\n            }\n            .ant-select-selection-item,\n            .ant-select-arrow {\n                color: #fff !important;\n            }\n        }\n        .my-search {\n            position: absolute;\n            top: 14px;\n            z-index: 1;\n            &.all-width {\n                width: 100%;\n            }\n\n            .anticon {\n                cursor: pointer;\n                &:hover {\n                    color: #0a8fe9 !important;\n                }\n            }\n            .hidden {\n                display: none;\n            }\n        }\n\n        .my-tabs {\n        }\n\n        .selected-users {\n            display: flex;\n            flex-wrap: wrap;\n            flex-direction: row;\n            padding-top: 15px;\n        }\n\n        .scroll-container {\n            padding-bottom: 0 !important;\n        }\n    }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/userSelect/FilteredUserSelectModal.vue",
    "content": "<template>\n  <BasicModal\n    @register=\"register\"\n    :getContainer=\"getContainer\"\n    :canFullscreen=\"false\"\n    destroyOnClose\n    title=\"会签人员选择\"\n    :width=\"600\"\n    wrapClassName=\"j-filtered-user-select-modal\"\n  >\n    <!-- 节点说明 -->\n    <a-select \n      value=\"系统角色会签，请筛选参与人员\" \n      disabled \n      style=\"width: 100%\" \n      class=\"node-label-select\"\n    >\n      <a-select-option value=\"系统角色会签，请筛选参与人员\">\n        系统角色会签，请筛选参与人员\n      </a-select-option>\n    </a-select>\n\n    <div class=\"modal-content\">\n      <!-- 搜索框 -->\n      <div :class=\"['search-wrapper', { 'search-expanded': searchInputStatus }]\">\n        <span v-show=\"!searchInputStatus\" class=\"search-icon\" @click=\"showSearchInput\">\n          <SearchOutlined />\n        </span>\n        <div v-show=\"searchInputStatus\" class=\"search-input\">\n          <a-input \n            v-model:value=\"searchText\" \n            placeholder=\"请输入用户名按回车搜索\"\n            @pressEnter=\"onSearchUser\"\n          >\n            <template #prefix>\n              <SearchOutlined />\n            </template>\n            <template #suffix>\n              <CloseOutlined title=\"退出搜索\" @click=\"clearSearch\" />\n            </template>\n          </a-input>\n        </div>\n      </div>\n\n      <!-- 用户列表 -->\n      <div class=\"user-list-wrapper\">\n        <user-list \n          :multi=\"multi\" \n          :dataList=\"userDataList\" \n          :selectedIdList=\"selectedIdList\" \n          @selected=\"onSelectUser\" \n          @unSelect=\"unSelectUser\" \n        />\n      </div>\n\n      <!-- 已选用户标签 -->\n      <div v-if=\"selectedUserList.length > 0\" class=\"selected-users\">\n        <SelectedUserItem \n          v-for=\"item in selectedUserList\" \n          :key=\"item.id\" \n          :info=\"item\" \n          @unSelect=\"unSelectUser\" \n        />\n      </div>\n    </div>\n\n    <template #footer>\n      <div class=\"modal-footer\">\n        <div class=\"pagination-wrapper\">\n          <a-pagination\n            v-model:current=\"pageNo\"\n            size=\"small\"\n            :total=\"totalRecord\"\n            :pageSize=\"PAGE_SIZE\"\n            show-quick-jumper\n            @change=\"onPageChange\"\n          />\n        </div>\n        <a-button \n          type=\"primary\" \n          :disabled=\"!hasSelectedUser\" \n          @click=\"handleOk\"\n        >\n          确认提交\n        </a-button>\n      </div>\n    </template>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, computed, ref, toRaw, PropType } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { SearchOutlined, CloseOutlined } from '@ant-design/icons-vue';\n  import { Pagination } from 'ant-design-vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import UserList from './UserList.vue';\n  import SelectedUserItem from './SelectedUserItem.vue';\n\n  // 用户数据接口\n  interface UserInfo {\n    id: string;\n    username: string;\n    realname: string;\n    [key: string]: any;\n  }\n\n  // 弹窗打开参数接口\n  interface ModalData {\n    usernames?: string[];\n    list?: UserInfo[];\n  }\n\n  // 常量定义\n  const PAGE_SIZE = 10;\n  const API_URL = '/sys/user/selectUserList';\n\n  export default defineComponent({\n    name: 'FilteredUserSelectModal',\n    components: {\n      BasicModal,\n      SearchOutlined,\n      CloseOutlined,\n      SelectedUserItem,\n      UserList,\n      APagination: Pagination,\n    },\n    props: {\n      // 是否多选\n      multi: {\n        type: Boolean,\n        default: true,\n      },\n      // 容器函数\n      getContainer: {\n        type: Function as PropType<() => HTMLElement>,\n        default: undefined,\n      },\n      // 传入的用户账号列表（用于过滤）\n      usernames: {\n        type: Array as PropType<string[]>,\n        default: () => [],\n      },\n    },\n    emits: ['selected', 'register'],\n    setup(props, { emit }) {\n      // ==================== 状态定义 ====================\n      const selectedUserList = ref<UserInfo[]>([]);\n      const actualUsernames = ref<string[]>([]);\n      const searchInputStatus = ref(false);\n      const searchText = ref('');\n      const pageNo = ref(1);\n      const totalRecord = ref(0);\n      const userDataList = ref<UserInfo[]>([]);\n\n      // ==================== 计算属性 ====================\n      const selectedIdList = computed(() => \n        selectedUserList.value.map((item) => item.id)\n      );\n\n      const hasSelectedUser = computed(() => \n        selectedUserList.value.length > 0\n      );\n\n      // ==================== 弹窗事件 ====================\n      const [register] = useModalInner((data: ModalData) => {\n        initUsernames(data);\n        initSelectedUsers(data);\n        resetSearchState();\n        loadUserList();\n      });\n\n      /**\n       * 初始化用户名列表\n       */\n      function initUsernames(data: ModalData) {\n        if (data?.usernames?.length) {\n          actualUsernames.value = [...data.usernames];\n        } else if (props.usernames?.length) {\n          actualUsernames.value = [...props.usernames];\n        } else {\n          actualUsernames.value = [];\n        }\n      }\n\n      /**\n       * 初始化已选用户\n       */\n      function initSelectedUsers(data: ModalData) {\n        selectedUserList.value = data?.list?.length ? [...data.list] : [];\n      }\n\n      /**\n       * 重置搜索状态\n       */\n      function resetSearchState() {\n        searchText.value = '';\n        searchInputStatus.value = false;\n        pageNo.value = 1;\n      }\n\n      // ==================== 用户操作 ====================\n      /**\n       * 确认选择\n       */\n      function handleOk() {\n        if (!hasSelectedUser.value) return;\n        emit('selected', toRaw(selectedUserList.value));\n      }\n\n      /**\n       * 选中用户\n       */\n      function onSelectUser(info: UserInfo) {\n        if (!props.multi) {\n          selectedUserList.value = [{ ...info }];\n          return;\n        }\n        \n        if (!selectedIdList.value.includes(info.id)) {\n          selectedUserList.value.push({ ...info });\n        }\n      }\n\n      /**\n       * 取消选中用户\n       */\n      function unSelectUser(id: string) {\n        const index = selectedUserList.value.findIndex((item) => item.id === id);\n        if (index >= 0) {\n          selectedUserList.value.splice(index, 1);\n        }\n      }\n\n      // ==================== 搜索功能 ====================\n      /**\n       * 显示搜索框\n       */\n      function showSearchInput(e?: Event) {\n        e?.preventDefault();\n        e?.stopPropagation();\n        searchInputStatus.value = true;\n      }\n\n      /**\n       * 执行搜索\n       */\n      function onSearchUser() {\n        pageNo.value = 1;\n        loadUserList();\n      }\n\n      /**\n       * 清除搜索\n       */\n      function clearSearch(e?: Event) {\n        e?.preventDefault();\n        e?.stopPropagation();\n        searchText.value = '';\n        searchInputStatus.value = false;\n        pageNo.value = 1;\n        loadUserList();\n      }\n\n      // ==================== 分页功能 ====================\n      /**\n       * 翻页处理\n       */\n      function onPageChange() {\n        loadUserList();\n      }\n\n      // ==================== 数据加载 ====================\n      /**\n       * 加载用户列表\n       */\n      async function loadUserList() {\n        if (!actualUsernames.value?.length) {\n          userDataList.value = [];\n          totalRecord.value = 0;\n          return;\n        }\n\n        try {\n          const params: Record<string, any> = {\n            pageNo: pageNo.value,\n            pageSize: PAGE_SIZE,\n            includeUsernameList: actualUsernames.value.join(','),\n          };\n          \n          if (searchText.value.trim()) {\n            params.keyword = searchText.value.trim();\n          }\n\n          const { success, result } = await defHttp.get(\n            { url: API_URL, params }, \n            { isTransformResponse: false }\n          );\n          \n          if (success && result) {\n            userDataList.value = result.records || [];\n            totalRecord.value = result.total || 0;\n          } else {\n            resetUserData();\n          }\n        } catch (error) {\n          console.error('加载用户列表失败:', error);\n          resetUserData();\n        }\n      }\n\n      /**\n       * 重置用户数据\n       */\n      function resetUserData() {\n        userDataList.value = [];\n        totalRecord.value = 0;\n      }\n\n      // ==================== 返回值 ====================\n      return {\n        PAGE_SIZE,\n        register,\n        handleOk,\n        searchText,\n        searchInputStatus,\n        showSearchInput,\n        onSearchUser,\n        clearSearch,\n        pageNo,\n        totalRecord,\n        onPageChange,\n        userDataList,\n        selectedUserList,\n        selectedIdList,\n        hasSelectedUser,\n        onSelectUser,\n        unSelectUser,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .j-filtered-user-select-modal {\n    // 节点说明标签\n    .node-label-select {\n      margin-bottom: 10px;\n      \n      :deep(.ant-select-selector) {\n        color: #fff !important;\n        background-color: #409eff !important;\n        border-radius: 5px !important;\n        cursor: not-allowed !important;\n      }\n      \n      :deep(.ant-select-selection-item),\n      :deep(.ant-select-arrow) {\n        color: #fff !important;\n      }\n    }\n\n    // 弹窗内容区\n    .modal-content {\n      position: relative;\n      min-height: 350px;\n    }\n\n    // 搜索框容器\n    .search-wrapper {\n      position: absolute;\n      top: 14px;\n      z-index: 1;\n      \n      &.search-expanded {\n        width: 100%;\n      }\n\n      .search-icon {\n        margin-left: 10px;\n        color: #c0c0c0;\n        cursor: pointer;\n        transition: color 0.3s;\n        \n        &:hover {\n          color: #0a8fe9;\n        }\n      }\n\n      .search-input {\n        width: 100%;\n        \n        :deep(.anticon) {\n          color: #c0c0c0;\n          cursor: pointer;\n          transition: color 0.3s;\n          \n          &:hover {\n            color: #0a8fe9;\n          }\n        }\n      }\n    }\n\n    // 用户列表\n    .user-list-wrapper {\n      padding-top: 50px;\n    }\n\n    // 已选用户标签\n    .selected-users {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 8px;\n      padding-top: 15px;\n      width: 100%;\n      overflow-x: hidden;\n    }\n\n    // 底部容器\n    .modal-footer {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      width: 100%;\n      gap: 16px;\n      \n      .pagination-wrapper {\n        flex: 1;\n        min-width: 0;\n        \n        :deep(.ant-pagination) {\n          display: flex;\n          justify-content: flex-start;\n        }\n      }\n      \n      .ant-btn {\n        flex-shrink: 0;\n      }\n    }\n\n    // 滚动容器优化\n    :deep(.scroll-container) {\n      padding-bottom: 0 !important;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/userSelect/SelectedUserItem.vue",
    "content": "<template>\n  <div class=\"user-selected-item\">\n    <div\n      style=\"\n        display: flex;\n        flex-direction: row;\n        height: 24px;\n        border-radius: 12px;\n        padding-right: 10px;\n        vertical-align: middle;\n        background-color: #f5f5f5;\n      \"\n    >\n      <span style=\"width: 24px; height: 24px; line-height: 20px; margin-right: 3px; display: inline-block\">\n        <a-avatar v-if=\"info.avatar\" :src=\"getFileAccessHttpUrl(info.avatar)\" :size=\"24\"></a-avatar>\n        \n        <a-avatar v-else-if=\"info.avatarIcon\" class=\"ant-btn-primary\" :size=\"24\" >\n          <template #icon>\n            <Icon :icon=\" 'ant-design:'+info.avatarIcon \" style=\"font-size: 16px;margin-top: 4px\"/>\n          </template>\n        </a-avatar>\n        \n        <a-avatar v-else-if=\"info.selectType == 'sys_role'\" :size=\"24\" style=\"background-color: rgb(255, 173, 0);\">\n          <template #icon>\n            <team-outlined style=\"font-size: 16px\"/>\n          </template>\n        </a-avatar>\n        <a-avatar v-else-if=\"info.selectType == 'sys_position'\" :size=\"24\" style=\"background-color: rgb(245, 34, 45);\">\n          <template #icon>\n            <TagsOutlined style=\"font-size: 16px\"/>\n          </template>\n        </a-avatar>\n        \n        <a-avatar :size=\"24\" v-else>\n          <template #icon><UserOutlined /></template>\n        </a-avatar>\n      </span>\n\n      <div style=\"height: 24px; line-height: 24px\" class=\"ellipsis\">\n        {{ info.realname || info.name }}\n      </div>\n\n      <div v-if=\"showClose\" class=\"icon-close\">\n        <CloseOutlined @click=\"removeSelect\"/>\n      </div>\n    </div>\n\n    <div v-if=\"!showClose\" class=\"icon-remove\">\n      <MinusCircleFilled @click=\"removeSelect\" />\n    </div>\n  </div>\n</template>\n\n<script>\n  import { UserOutlined, CloseOutlined, MinusCircleFilled, TagsOutlined, TeamOutlined } from '@ant-design/icons-vue';\n  import {computed} from 'vue'\n  import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';\n  \n  export default {\n    name: 'SelectedUserItem',\n    components: {\n      UserOutlined,\n      MinusCircleFilled,\n      CloseOutlined,\n      TagsOutlined,\n      TeamOutlined\n    },\n    props: {\n      info: {\n        type: Object,\n        default: () => {},\n      },\n      // 是否作为查询条件\n      query:{\n        type: Boolean,\n        default: false,\n      }\n    },\n    emits: ['unSelect'],\n    setup(props, { emit }) {\n      function removeSelect(e) {\n        e.preventDefault();\n        e.stopPropagation();\n        emit('unSelect', props.info.id);\n      }\n\n      const showClose = computed(()=>{\n        if(props.query===true){\n          return true;\n        }else{\n          return false;\n        }\n      });\n      \n      return {\n        showClose,\n        removeSelect,\n        getFileAccessHttpUrl\n      };\n    },\n  };\n</script>\n\n<style lang=\"less\">\n  .user-selected-item {\n    position: relative;\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    align-items: center;\n    margin-right: 8px;\n    height: 30px;\n    border-radius: 12px;\n    line-height: 30px;\n    vertical-align: middle;\n\n    .ellipsis {\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n    }\n    .icon-remove {\n      position: absolute;\n      top: -10px;\n      right: -4px;\n      font-size: 18px;\n      width: 15px;\n      height: 15px;\n      cursor: pointer;\n      display: none;\n    }\n    \n    .icon-close{\n      height: 22px;\n      line-height: 24px;\n      font-size: 10px;\n      font-weight: bold;\n      margin-left: 7px;\n      &:hover{\n        color: #0a8fe9;\n      }\n    }\n\n    &:hover {\n      .icon-remove {\n        display: block;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/userSelect/UserList.vue",
    "content": "<template>\n  <a-list item-layout=\"horizontal\" :data-source=\"showDataList\">\n    <template #renderItem=\"{ item }\">\n      <a-list-item style=\"padding: 3px 0\">\n        <div class=\"user-select-user-info\" @click=\"(e) => onClickUser(e, item)\">\n          <div style=\"margin-left: 10px\">\n            <a-checkbox v-model:checked=\"checkStatus[item.id]\" v-if=\"multi\" />\n            <a-radio v-model:checked=\"checkStatus[item.id]\" v-else />\n          </div>\n          <div>\n            <a-avatar v-if=\"item.avatar\" :src=\"getFileAccessHttpUrl(item.avatar)\"></a-avatar>\n            <a-avatar v-else-if=\"item.avatarIcon\" class=\"ant-btn-primary\">\n              <template #icon>\n                <Icon :icon=\" 'ant-design:'+item.avatarIcon \" style=\"margin-top: 4px;font-size: 24px;\"/>\n              </template>\n            </a-avatar>\n            <a-avatar v-else>\n              <template #icon><UserOutlined /></template>\n            </a-avatar>\n          </div>\n          <div :style=\"nameStyle\">\n            {{ item.realname }}\n          </div>\n          <div :style=\"departStyle\" class=\"ellipsis\" :title=\"item.orgCodeTxt\">\n            {{ item.orgCodeTxt }}\n          </div>\n          <div style=\"width: 1px\"></div>\n        </div>\n      </a-list-item>\n    </template>\n  </a-list>\n</template>\n\n<script lang=\"ts\">\n  import { UserOutlined } from '@ant-design/icons-vue';\n  import { computed, toRaw, reactive, watchEffect, ref } from 'vue';\n  import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';\n  \n  export default {\n    name: 'UserList',\n    props: {\n      multi: {\n        type: Boolean,\n        default: false,\n      },\n      dataList: {\n        type: Array,\n        default: () => [],\n      },\n      // 是否显示部门文本\n      depart: {\n        type: Boolean,\n        default: false,\n      },\n      selectedIdList: {\n        type: Array,\n        default: () => [],\n      },\n      excludeUserIdList:{\n        type: Array,\n        default: () => [],\n      }\n    },\n    components: {\n      UserOutlined,\n    },\n    emits: ['selected', 'unSelect'],\n    setup(props, { emit }) {\n      function onClickUser(e, user) {\n        e && prevent(e);\n        let status = checkStatus[user.id];\n        if (status === true) {\n          emit('unSelect', user.id);\n        } else {\n          emit('selected', toRaw(user));\n        }\n      }\n\n      function getTwoText(text) {\n        if (!text) {\n          return '';\n        } else {\n          return text.substr(0, 2);\n        }\n      }\n\n      const departStyle = computed(() => {\n        if (props.depart === true) {\n          // 如果显示部门信息\n          return {\n            flex: 1,\n          };\n        } else {\n          return {\n            display: 'none',\n          };\n        }\n      });\n\n      const nameStyle = computed(() => {\n        if (props.depart === true) {\n          // 如果显示部门信息\n          return {\n            width: '200px',\n          };\n        } else {\n          return {\n            flex: 1,\n          };\n        }\n      });\n\n      function onChangeChecked(e) {\n        console.error('onChangeChecked', e);\n      }\n\n     // const showDataList = ref<any[]>([])\n      const checkStatus = reactive<any>({});\n      watchEffect(() => {\n        let arr1 = props.dataList;\n        if (!arr1 || arr1.length === 0) {\n          return;\n        }\n        let idList = props.selectedIdList;\n        for (let item of arr1) {\n          if (idList.indexOf(item.id) >= 0) {\n            checkStatus[item.id] = true;\n          } else {\n            checkStatus[item.id] = false;\n          }\n        }\n        \n      \n      });\n\n      function prevent(e) {\n        e.preventDefault();\n        e.stopPropagation();\n      }\n//代码逻辑说明: 【QQYUN-8239】用户角色，添加用户 返回2页数据，实际只显示一页---\n/*      function records2DataList() {\n        let arr:any[] = [];\n        let excludeList = props.excludeUserIdList;\n        let records = props.dataList;\n        if(records && records.length>0){\n          for(let item of records){\n            if(excludeList.indexOf(item.id)<0){\n              arr.push({...item})\n            }\n          }\n        }\n        return arr;\n      }*/\n      \n      const showDataList = computed(()=>{\n/*        let excludeList = props.excludeUserIdList;\n        if(excludeList && excludeList.length>0){\n          return records2DataList();\n        }*/\n        return props.dataList;\n      });\n\n      return {\n        onClickUser,\n        getTwoText,\n        departStyle,\n        nameStyle,\n        onChangeChecked,\n        checkStatus,\n        showDataList,\n        getFileAccessHttpUrl\n      };\n    },\n  };\n</script>\n\n<style lang=\"less\">\n  .user-select-user-info {\n    display: flex;\n    width: 100%;\n    > div {\n      height: 36px;\n      line-height: 36px;\n      margin-right: 10px;\n    }\n    .ellipsis {\n      text-overflow: ellipsis;\n      white-space: nowrap;\n      overflow: hidden;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/userSelect/UserListAndDepart.vue",
    "content": "<template>\n  <a-row>\n    <a-col :span=\"12\">\n      <div :style=\"containerStyle\">\n        <a-tree\n          v-if=\"treeData.length > 0\"\n          :load-data=\"loadChildren\"\n          showIcon\n          autoExpandParent\n          :treeData=\"treeData\"\n          :selectedKeys=\"selectedKeys\"\n          v-model:expandedKeys=\"expandedKeys\"\n          @select=\"onSelect\"\n        >\n          <template #title=\"{ title, key }\">\n            <FolderFilled style=\"color: #9e9e9e\"/><span style=\"margin-left: 5px\">{{ title }}</span>\n          </template>\n        </a-tree>\n      </div>\n    </a-col>\n    <a-col :span=\"12\" style=\"padding-left: 10px\">\n      <div :style=\"containerStyle\">\n        <user-list :multi=\"multi\" :excludeUserIdList=\"excludeUserIdList\" :dataList=\"userDataList\" :selectedIdList=\"selectedIdList\" @selected=\"onSelectUser\" @unSelect=\"unSelectUser\" />\n      </div>\n    </a-col>\n  </a-row>\n</template>\n\n<script lang=\"ts\">\n  import { defHttp } from '/@/utils/http/axios';\n  import { computed, ref, watch } from 'vue';\n  import UserList from './UserList.vue';\n  import { FolderFilled } from '@ant-design/icons-vue';\n\n  export default {\n    name: 'DepartUserList',\n    components: {\n      UserList,\n      FolderFilled\n    },\n    props: {\n      searchText: {\n        type: String,\n        default: '',\n      },\n      selectedIdList: {\n        type: Array,\n        default: () => [],\n      },\n      excludeUserIdList:{\n        type: Array,\n        default: () => [],\n      },\n      multi: {\n        type: Boolean,\n        default: false,\n      }\n    },\n    emits: ['loaded', 'selected', 'unSelect'],\n    setup(props, { emit }) {\n      //export const queryById = (params) => defHttp.get({ url: Api.queryById, params }, { isTransformResponse: false });\n\n      async function loadDepartTree(pid?) {\n        const url = '/sys/sysDepart/queryDepartTreeSync';\n        let params = {};\n        if (pid) {\n          params['pid'] = pid;\n        }\n        const data = await defHttp.get({ url, params }, { isTransformResponse: false });\n        console.log('loadDepartTree', data);\n        return data;\n      }\n\n      async function initRoot() {\n        console.log('initRoot');\n        const data = await loadDepartTree();\n        if (data.success) {\n          let arr = data.result;\n          fillTitles(arr);\n          treeData.value = arr;\n          emitDepartOptions(arr);\n        } else {\n          console.error(data.message);\n        }\n        clear();\n      }\n\n      function emitDepartOptions(arr) {\n        let options = [];\n        if (arr && arr.length > 0) {\n          options = arr.map((k) => {\n            return {\n              value: k.id,\n              label: k.departName,\n            };\n          });\n        }\n        emit('loaded', options);\n      }\n\n      initRoot();\n\n      const treeData = ref<any[]>([]);\n      const selectedKeys = ref<string[]>([]);\n      const expandedKeys = ref<string[]>([]);\n      const selectedDepartId = ref('');\n      function onSelect(ids, e) {\n        let record = e.node.dataRef;\n        selectedKeys.value = [record.key];\n\n        let id = ids[0];\n        selectedDepartId.value = id;\n        loadUserList();\n      }\n\n      function clear() {\n        selectedDepartId.value = '';\n      }\n      async function loadChildren(treeNode) {\n        console.log('loadChildren', treeNode);\n        const data = await loadDepartTree(treeNode.eventKey);\n        if (data.success) {\n          let arr = data.result;\n          treeNode.dataRef.children = [...arr];\n          fillTitles(treeData.value);\n          treeData.value = [...treeData.value];\n        } else {\n          console.error(data.message);\n        }\n      }\n\n      const maxHeight = ref(300);\n      maxHeight.value = window.innerHeight - 500;\n      const containerStyle = computed(() => {\n        return {\n          'overflow-y': 'auto',\n          // 代码逻辑说明: JHHB-911 【用户选择】用户选择组件 有滚动条时 不好用 没有显示简称\n          'max-height': (maxHeight.value>=300?maxHeight.value:300) + 'px',\n        };\n      });\n\n      const userDataList = ref<any[]>([]);\n      async function loadUserList() {\n        const url = '/sys/user/selectUserList';\n        let params = {\n          pageNo: 1,\n          pageSize: 99,\n        };\n        if (props.searchText) {\n          params['keyword'] = props.searchText;\n        }\n        if (selectedDepartId.value) {\n          params['departId'] = selectedDepartId.value;\n        }\n        // 代码逻辑说明: 【QQYUN-8239】用户角色，添加用户 返回2页数据，实际只显示一页---\n        if(props.excludeUserIdList && props.excludeUserIdList.length>0){\n          params['excludeUserIdList'] = props.excludeUserIdList.join(\",\");\n        }\n        const data = await defHttp.get({ url, params }, { isTransformResponse: false });\n        if (data.success) {\n          const { records } = data.result;\n          userDataList.value = records;\n        } else {\n          console.error(data.message);\n        }\n        console.log('depart-loadUserList', data);\n      }\n      watch(\n        () => props.searchText,\n        () => {\n          loadUserList();\n        }\n      );\n\n      function onSelectUser(info) {\n        emit('selected', info);\n      }\n      function unSelectUser(id) {\n        emit('unSelect', id);\n      }\n      // 递归将 departNameAbbr 赋给 title，并递归处理 children\n      function fillTitles(nodes: any[] = []) {\n        for (const node of nodes) {\n          if (!node) continue;\n          if (node?.departNameAbbr) {\n            node.title = node.departNameAbbr;\n          }\n          if (Array.isArray(node.children) && node.children.length) {\n            fillTitles(node.children);\n          }\n        }\n      }\n      return {\n        containerStyle,\n        treeData,\n        selectedKeys,\n        expandedKeys,\n        onSelect,\n        loadChildren,\n        onSelectUser,\n        unSelectUser,\n        userDataList,\n      };\n    },\n  };\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/userSelect/UserListAndRole.vue",
    "content": "<template>\n  <a-row>\n    <a-col :span=\"12\">\n      <div :style=\"containerStyle\">\n        <a-tree v-if=\"treeData.length > 0\" showIcon :treeData=\"treeData\" :selectedKeys=\"selectedKeys\" @select=\"onSelect\">\n          <template #title=\"{ title, key }\">\n            <UserOutlined style=\"color: #9e9e9e\"/><span style=\"margin-left: 5px\">{{ title }}</span>\n          </template>\n        </a-tree>\n      </div>\n    </a-col>\n    <a-col :span=\"12\" style=\"padding-left: 10px\">\n      <div :style=\"containerStyle\">\n        <user-list :multi=\"multi\" :excludeUserIdList=\"excludeUserIdList\" :dataList=\"userDataList\" :selectedIdList=\"selectedIdList\" @selected=\"onSelectUser\" @unSelect=\"unSelectUser\" />\n      </div>\n    </a-col>\n  </a-row>\n</template>\n\n<script lang=\"ts\">\n  import { computed, ref, watch } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import UserList from './UserList.vue';\n  import { UserOutlined } from '@ant-design/icons-vue';\n\n  export default {\n    name: 'RoleUserList',\n    components: {\n      UserList,\n      UserOutlined\n    },\n    props: {\n      searchText: {\n        type: String,\n        default: '',\n      },\n      selectedIdList: {\n        type: Array,\n        default: () => [],\n      },\n      excludeUserIdList:{\n        type: Array,\n        default: () => [],\n      },\n      multi: {\n        type: Boolean,\n        default: false,\n      }\n    },\n    emits: ['selected', 'unSelect'],\n    setup(props, { emit }) {\n      const treeData = ref<any[]>([]);\n      async function loadRoleList() {\n        const url = '/sys/role/listByTenant';\n        let params = {\n          order: 'desc',\n          column: 'createTime',\n          pageSize: 200,\n        };\n        let arr = [];\n        const data = await defHttp.get({ url, params }, { isTransformResponse: false });\n        if (data.success) {\n          const { records } = data.result;\n          arr = records.map((k) => {\n            return {\n              title: k.roleName,\n              id: k.id,\n              key: k.id,\n            };\n          });\n        }\n        console.log('loadRoleList', data);\n        treeData.value = arr;\n      }\n      loadRoleList();\n\n      const selectedKeys = ref<any[]>([]);\n      const selectedRoleId = ref('');\n      function onSelect(ids, e) {\n        let record = e.node.dataRef;\n        selectedKeys.value = [record.key];\n\n        let id = ids[0];\n        selectedRoleId.value = id;\n        loadUserList();\n      }\n\n      const userDataList = ref<any[]>([]);\n      async function loadUserList() {\n        const url = '/sys/user/selectUserList';\n        let params = {\n          pageNo: 1,\n          pageSize: 99,\n        };\n        if (props.searchText) {\n          params['keyword'] = props.searchText;\n        }\n        if (selectedRoleId.value) {\n          params['roleId'] = selectedRoleId.value;\n        }\n        // 代码逻辑说明: 【QQYUN-8239】用户角色，添加用户 返回2页数据，实际只显示一页---\n        if(props.excludeUserIdList && props.excludeUserIdList.length>0){\n          params['excludeUserIdList'] = props.excludeUserIdList.join(\",\");\n        }\n        const data = await defHttp.get({ url, params }, { isTransformResponse: false });\n        if (data.success) {\n          const { records } = data.result;\n          userDataList.value = records;\n        } else {\n          console.error(data.message);\n        }\n        console.log('role-loadUserList', data);\n      }\n      watch(\n        () => props.searchText,\n        () => {\n          loadUserList();\n        }\n      );\n\n      function onSelectUser(info) {\n        emit('selected', info);\n      }\n      function unSelectUser(id) {\n        emit('unSelect', id);\n      }\n\n      const maxHeight = ref(300);\n      maxHeight.value = window.innerHeight - 300;\n      const containerStyle = computed(() => {\n        return {\n          'overflow-y': 'auto',\n          'max-height': maxHeight.value + 'px',\n        };\n      });\n\n      return {\n        containerStyle,\n        treeData,\n        selectedKeys,\n        onSelect,\n        onSelectUser,\n        unSelectUser,\n        userDataList,\n      };\n    },\n  };\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/userSelect/UserSelectModal.vue",
    "content": "<template>\n  <BasicModal\n    @register=\"register\"\n    :getContainer=\"getContainer\"\n    :canFullscreen=\"false\"\n    destroyOnClose\n    title=\"选择用户\"\n    :width=\"800\"\n    wrapClassName=\"j-user-select-modal2\"\n  >\n    <!-- 部门下拉框 -->\n    <a-select v-model:value=\"selectedDepart\" style=\"width: 100%\" class=\"depart-select\" @change=\"onDepartChange\">\n      <a-select-option v-for=\"item in departOptions\" :value=\"item.value\">{{ item.label }}</a-select-option>\n    </a-select>\n\n    <div style=\"position: relative; min-height: 350px\">\n      <!-- 用户搜索框 -->\n      <div :class=\"searchInputStatus ? 'my-search all-width' : 'my-search'\">\n        <span :class=\"searchInputStatus ? 'hidden' : ''\" style=\"margin-left: 10px\"\n          ><SearchOutlined style=\"color: #c0c0c0\" @click=\"showSearchInput\"\n        /></span>\n        <div style=\"width: 100%\" :class=\"searchInputStatus ? '' : 'hidden'\">\n          <a-input v-model:value=\"searchText\" @pressEnter=\"onSearchUser\" style=\"width: 100%\" placeholder=\"请输入用户名按回车搜索\">\n            <template #prefix>\n              <SearchOutlined style=\"color: #c0c0c0\" />\n            </template>\n            <template #suffix>\n              <CloseOutlined title=\"退出搜索\" @click=\"clearSearch\" />\n            </template>\n          </a-input>\n        </div>\n      </div>\n\n      <!-- tabs -->\n      <div class=\"my-tabs\">\n        <a-tabs v-model:activeKey=\"myActiveKey\" :centered=\"true\" @change=\"onChangeTab\">\n          <!-- 所有用户 -->\n          <a-tab-pane key=\"1\" tab=\"全部\" forceRender>\n            <user-list :multi=\"multi\" :excludeUserIdList=\"excludeUserIdList\" :dataList=\"userDataList\" :selectedIdList=\"selectedIdList\" depart @selected=\"onSelectUser\" @unSelect=\"unSelectUser\" />\n          </a-tab-pane>\n\n          <!-- 部门用户 -->\n          <a-tab-pane key=\"2\" tab=\"按部门\" forceRender>\n            <depart-user-list\n              :searchText=\"searchText\"\n              :selectedIdList=\"selectedIdList\"\n              :excludeUserIdList=\"excludeUserIdList\"\n              @loaded=\"initDepartOptions\"\n              @selected=\"onSelectUser\"\n              @unSelect=\"unSelectUser\"\n            />\n          </a-tab-pane>\n\n          <!-- 角色用户 -->\n          <a-tab-pane key=\"3\" tab=\"按角色\" forceRender>\n            <role-user-list :excludeUserIdList=\"excludeUserIdList\" :searchText=\"searchText\" :selectedIdList=\"selectedIdList\" @selected=\"onSelectUser\" @unSelect=\"unSelectUser\" />\n          </a-tab-pane>\n        </a-tabs>\n      </div>\n\n      <!-- 选中用户 -->\n      <div class=\"selected-users\" style=\"width: 100%; overflow-x: hidden\">\n        <SelectedUserItem v-for=\"item in selectedUserList\" :info=\"item\" @unSelect=\"unSelectUser\" />\n      </div>\n    </div>\n\n    <template #footer>\n      <div style=\"display: flex; justify-content: space-between; width: 100%\">\n        <div class=\"select-user-page-info\">\n          <a-pagination\n            v-if=\"myActiveKey == '1'\"\n            v-model:current=\"pageNo\"\n            size=\"small\"\n            :total=\"totalRecord\"\n            show-quick-jumper\n            @change=\"onPageChange\"\n          />\n        </div>\n        <a-button type=\"primary\" @click=\"handleOk\">确 定</a-button>\n      </div>\n    </template>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\">\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { SearchOutlined, CloseOutlined } from '@ant-design/icons-vue';\n  import UserList from './UserList.vue';\n  import SelectedUserItem from './SelectedUserItem.vue';\n  import DepartUserList from './UserListAndDepart.vue';\n  import RoleUserList from './UserListAndRole.vue';\n  import { Pagination } from 'ant-design-vue';\n  const APagination = Pagination;\n  import { defHttp } from '/@/utils/http/axios';\n\n  import {computed, ref, toRaw, unref} from 'vue';\n  import { useUserStore } from '/@/store/modules/user';\n  import { mySelfData } from './useUserSelect'\n  \n  export default {\n    name: 'UserSelectModal',\n    components: {\n      BasicModal,\n      SearchOutlined,\n      CloseOutlined,\n      SelectedUserItem,\n      UserList,\n      DepartUserList,\n      RoleUserList,\n      APagination,\n    },\n    props: {\n      multi: {\n        type: Boolean,\n        default: false,\n      },\n      getContainer: {\n        type: Function,\n        default: null,\n      },\n      //是否排除我自己\n      izExcludeMy: {\n        type: Boolean,\n        default: false,\n      },\n      //是否在高级查询中作为条件 可以选择当前用户表达式\n      inSuperQuery:{\n        type: Boolean,\n        default: false,\n      }\n    },\n    emits: ['selected', 'register'],\n    setup(props, { emit }) {\n      const myActiveKey = ref('1');\n      const selectedUserList = ref<any[]>([]);\n      const userStore = useUserStore();\n      const selectedIdList = computed(() => {\n        let arr = selectedUserList.value;\n        if (!arr || arr.length == 0) {\n          return [];\n        } else {\n          return arr.map((k) => k.id);\n        }\n      });\n      // QQYUN-4152【应用】已经存在的用户，添加的时候还可以重复选择\n      const excludeUserIdList = ref<any[]>([]);\n\n      // 弹窗事件\n      const [register] = useModalInner((data) => {\n        let list = data.list;\n        if (list && list.length > 0) {\n          selectedUserList.value = [...list];\n        } else {\n          selectedUserList.value = [];\n        }\n        if(data.excludeUserIdList){\n          excludeUserIdList.value = data.excludeUserIdList;\n        }else{\n          excludeUserIdList.value = [];\n        }\n        //如果排除我自己，直接excludeUserIdList.push排除即可\n        if (props.izExcludeMy) {\n          excludeUserIdList.value.push(userStore.getUserInfo.id);\n        }\n        //加载用户列表\n        loadUserList();\n      });\n\n      // 确定事件\n      function handleOk() {\n        let arr = toRaw(selectedUserList.value);\n        emit('selected', arr);\n      }\n\n      /*--------------部门下拉框，用于筛选用户---------------*/\n      const selectedDepart = ref('');\n      const departOptions = ref<any[]>([]);\n      function initDepartOptions(options) {\n        departOptions.value = [{ value: '', label: '全部用户' }, ...options];\n        selectedDepart.value = '';\n      }\n      function onDepartChange() {\n        loadUserList();\n      }\n      /*--------------部门下拉框，用于筛选用户---------------*/\n\n      /*--------------第一页 搜索框---------------*/\n      const searchInputStatus = ref(false);\n      const searchText = ref('');\n      function showSearchInput(e) {\n        e && prevent(e);\n        searchInputStatus.value = true;\n      }\n\n      // 回车事件，触发查询\n      function onSearchUser() {\n        pageNo.value = 1;\n        loadUserList();\n      }\n\n      // 清除按名称筛选\n      function clearSearch(e) {\n        e && prevent(e);\n        pageNo.value = 1;\n        searchText.value = '';\n        searchInputStatus.value = false;\n        loadUserList();\n      }\n      /*--------------第一页 搜索框---------------*/\n\n      /*--------------加载数据---------------*/\n      const pageNo = ref(1);\n      const totalRecord = ref(0);\n      const userDataList = ref<any[]>([]);\n      async function onPageChange() {\n        console.log('onPageChange', pageNo.value);\n        await loadUserList();\n      }\n      async function loadUserList() {\n        const url = '/sys/user/selectUserList';\n        let params = {\n          pageNo: pageNo.value,\n          pageSize: 10,\n        };\n        if (searchText.value) {\n          params['keyword'] = searchText.value;\n        }\n        if (selectedDepart.value) {\n          params['departId'] = selectedDepart.value;\n        }\n\n        // 代码逻辑说明: 【QQYUN-8239】用户角色，添加用户 返回2页数据，实际只显示一页---\n        if(unref(excludeUserIdList) && unref(excludeUserIdList).length>0){\n          params['excludeUserIdList'] = excludeUserIdList.value.join(\",\");\n        }\n        \n        const data = await defHttp.get({ url, params }, { isTransformResponse: false });\n        if (data.success) {\n          let { records, total } = data.result;\n          totalRecord.value = total;\n          initCurrentUserData(records);\n          userDataList.value = records;\n        } else {\n          console.error(data.message);\n        }\n        console.log('loadUserList', data);\n      }\n      \n      // 往用户列表中添加一个 当前用户选项\n      function initCurrentUserData(records) {\n        if(pageNo.value==1 && props.inSuperQuery === true){\n          records.unshift({...mySelfData})\n        }\n      }\n      /*--------------加载数据---------------*/\n\n      /*--------------选中/取消选中---------------*/\n      function onSelectUser(info) {\n        if (props.multi === true) {\n          let arr = selectedUserList.value;\n          let idList = selectedIdList.value;\n          if (idList.indexOf(info.id) < 0) {\n            arr.push({ ...info });\n            selectedUserList.value = arr;\n          }\n        } else {\n          selectedUserList.value = [{ ...info }];\n        }\n      }\n      function unSelectUser(id) {\n        let arr = selectedUserList.value;\n        let index = -1;\n        for (let i = 0; i < arr.length; i++) {\n          if (arr[i].id === id) {\n            index = i;\n            break;\n          }\n        }\n        if (index >= 0) {\n          arr.splice(index, 1);\n          selectedUserList.value = arr;\n        }\n      }\n      /*--------------选中/取消选中---------------*/\n\n      function onChangeTab(tab) {\n        myActiveKey.value = tab;\n      }\n\n      function prevent(e) {\n        e.preventDefault();\n        e.stopPropagation();\n      }\n\n      //加载第一页数据\n      loadUserList();\n\n      return {\n        selectedDepart,\n        departOptions,\n        initDepartOptions,\n        onDepartChange,\n\n        register,\n        handleOk,\n\n        searchText,\n        searchInputStatus,\n        showSearchInput,\n        onSearchUser,\n        clearSearch,\n\n        myActiveKey,\n        onChangeTab,\n\n        pageNo,\n        totalRecord,\n        onPageChange,\n        userDataList,\n        selectedUserList,\n        selectedIdList,\n        onSelectUser,\n        unSelectUser,\n        excludeUserIdList\n      };\n    },\n  };\n</script>\n\n<style lang=\"less\">\n  .j-user-select-modal2 {\n    .depart-select {\n      .ant-select-selector {\n        color: #fff !important;\n        background-color: #409eff !important;\n        border-radius: 5px !important;\n      }\n      .ant-select-selection-item,\n      .ant-select-arrow {\n        color: #fff !important;\n      }\n    }\n    .my-search {\n      position: absolute;\n      top: 14px;\n      z-index: 1;\n      &.all-width {\n        width: 100%;\n      }\n\n      .anticon {\n        cursor: pointer;\n        &:hover {\n          color: #0a8fe9 !important;\n        }\n      }\n      .hidden {\n        display: none;\n      }\n    }\n\n    .my-tabs {\n    }\n\n    .selected-users {\n      display: flex;\n      flex-wrap: wrap;\n      flex-direction: row;\n      padding-top: 15px;\n    }\n\n    .scroll-container {\n      padding-bottom: 0 !important;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/userSelect/index.vue",
    "content": "<template>\n  <div>\n    <div v-if=\"isSearchFormComp\" @click=\"click2Add\" :class=\"disabled?'disabled-user-select':''\" style=\"padding:0 5px;background-color: #fff;border: 1px solid #ccc;border-radius: 3px;box-sizing: border-box;display:flex;color: #9e9e9e;font-size: 14px;flex-wrap: wrap;min-height: 32px;\">\n      <template v-if=\"selectedUserList.length > 0\">\n        <SelectedUserItem v-for=\"item in showUserList\" :info=\"item\" @unSelect=\"unSelectUser\" query />\n      </template>\n      <span v-else style=\"height: 30px;line-height: 30px;display: inline-block;margin-left: 7px;color: #bfbfbf;\">请选择用户</span>\n      <div v-if=\"ellipsisInfo.status\" class=\"user-selected-item\">\n        <div class=\"user-select-ellipsis\">\n          <span style=\"color: red\">+{{ellipsisInfo.count}}...</span>\n        </div>\n      </div>\n    </div>    \n    \n    <div v-else style=\"display: flex; flex-wrap: wrap; flex-direction: row\" >\n      <template v-if=\"selectedUserList.length > 0\">\n        <SelectedUserItem v-for=\"item in selectedUserList\" :info=\"item\" @unSelect=\"unSelectUser\" />\n      </template>\n      <a-button v-if=\"showAddButton\" shape=\"circle\" @click=\"onShowModal\"><PlusOutlined /></a-button>\n    </div>\n\n    <user-select-modal :inSuperQuery=\"inSuperQuery\" :multi=\"multi\" :getContainer=\"getContainer\" @register=\"registerModal\" @selected=\"onSelected\" :izExcludeMy=\"izExcludeMy\"></user-select-modal>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, watch, ref, computed, toRaw } from 'vue';\n  import { Form } from 'ant-design-vue';\n  import { PlusOutlined } from '@ant-design/icons-vue';\n  import { useModal } from '/@/components/Modal';\n  import UserSelectModal from './UserSelectModal.vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import SelectedUserItem from './SelectedUserItem.vue';\n  import { mySelfExpress, mySelfData } from './useUserSelect'\n\n  export default defineComponent({\n    name: 'UserSelect',\n    components: {\n      PlusOutlined,\n      UserSelectModal,\n      SelectedUserItem,\n    },\n    props: {\n      store: {\n        type: String,\n        default: 'id',\n      },\n      value: {\n        type: String,\n        default: '',\n      },\n      multi: {\n        type: Boolean,\n        default: false,\n      },\n      getContainer: {\n        type: Function,\n        default: null,\n      },\n      // 是否作为查询条件\n      query:{\n        type: Boolean,\n        default: false,\n      },\n      //最多显示几个人员-query为true有效\n      maxCount:{\n        type: Number,\n        default: 2\n      },\n      disabled:{\n        type: Boolean,\n        default: false,\n      },\n      //是否排除我自己\n      izExcludeMy:{\n        type: Boolean,\n        default: false,\n      },\n      //是否在高级查询中作为条件 可以选择当前用户\n      inSuperQuery:{\n        type: Boolean,\n        default: false,\n      }\n    },\n    emits: ['update:value', 'change'],\n    setup(props, { emit }) {\n      const formItemContext = Form.useInjectFormItemContext();\n      const loading = ref(true);\n      const selectedUserList = ref<any[]>([]);\n      const showUserList = computed(()=>{\n        let list = selectedUserList.value\n        let max = props.maxCount;\n        if(list.length<=max){\n          return list;\n        }\n        return list.filter((_item, index)=>index<max);\n      });\n      const ellipsisInfo = computed(()=>{\n        let max = props.maxCount;\n        let len = selectedUserList.value.length\n        if(len > max){\n          return {status: true, count: len-max};\n        }else{\n          return {status: false}\n        }\n      });\n\n      // 注册弹窗\n      const [registerModal, { openModal, closeModal }] = useModal();\n      function onShowModal() {\n        if(props.disabled===true){\n          return ;\n        }\n        let list = toRaw(selectedUserList.value);\n        openModal(true, {\n          list,\n        });\n      }\n\n      function onSelected(arr) {\n        console.log('onSelected', arr);\n        selectedUserList.value = arr;\n        onSelectedChange();\n        closeModal();\n      }\n\n      function onSelectedChange() {\n        loading.value = false;\n        let temp: any[] = [];\n        let arr = selectedUserList.value;\n        if (arr && arr.length > 0) {\n          temp = arr.map((k) => {\n            return k[props.store];\n          });\n        }\n        let str = temp.join(',');\n        emit('update:value', str);\n        emit('change', str);\n        formItemContext.onFieldChange();\n        console.log('选中数据', str);\n      }\n\n      watch(\n        () => props.value,\n        async (val) => {\n          if (val) {\n            if (loading.value === true) {\n              await getUserList(val);\n            }\n          } else {\n            selectedUserList.value = [];\n          }\n          loading.value = true;\n        },\n        { immediate: true }\n      );\n\n      async function getUserList(ids) {\n        let hasUserExpress = false;\n        let paramIds = ids;\n        let idList = [];\n        selectedUserList.value = [];\n        if(ids){\n          // 代码逻辑说明: 修复用户选择器逗号分割回显不生效的问题\n          let tempArray = ids.split(',').map(s => s.trim()).filter(s => s != '');\n          if (tempArray.includes(mySelfExpress)) {\n            hasUserExpress = true;\n            idList = tempArray.filter(item => item != mySelfExpress);\n          } else {\n            idList = tempArray;\n          }\n        }\n\n        if(idList.length>0){\n          paramIds = idList.join(',')\n          const url = '/sys/user/list';\n          let params = {\n            [props.store]: paramIds,\n          };\n          const data = await defHttp.get({ url, params }, { isTransformResponse: false });\n          console.log('getUserList', data);\n          if (data.success) {\n            const { records } = data.result;\n            selectedUserList.value = records;\n          } else {\n            console.error(data.message);\n          }\n        }\n        if(hasUserExpress){\n          let temp = selectedUserList.value;\n          temp.push({...mySelfData})\n        }\n      }\n\n      const showAddButton = computed(() => {\n        if(props.disabled === true){\n          return false;\n        }\n        if (props.multi === true) {\n          return true;\n        } else {\n          if (selectedUserList.value.length > 0) {\n            return false;\n          } else {\n            return true;\n          }\n        }\n      });\n\n      function unSelectUser(id) {\n        console.log('unSelectUser', id);\n        let arr = selectedUserList.value;\n        let index = -1;\n        for (let i = 0; i < arr.length; i++) {\n          if (arr[i].id == id) {\n            index = i;\n            break;\n          }\n        }\n        if (index >= 0) {\n          arr.splice(index, 1);\n          selectedUserList.value = arr;\n\n          onSelectedChange();\n        }\n      }\n      \n      function click2Add(e) {\n        e.preventDefault();\n        e.stopPropagation();\n        onShowModal();\n      }\n      \n      const isSearchFormComp = computed(()=>{\n        if(props.query===true){\n          return true;\n        }else{\n          return false\n        }\n      });\n      \n      return {\n        registerModal,\n        onShowModal,\n        isSearchFormComp,\n        onSelected,\n        showAddButton,\n        unSelectUser,\n        selectedUserList,\n        showUserList,\n        ellipsisInfo,\n        click2Add\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .user-select-ellipsis{\n    width: 40px;\n    height: 24px;\n    text-align: center;\n    line-height: 22px;\n    border-radius: 8px;\n    background: #f5f5f5;\n    border: 1px solid #f0f0f0;\n  }\n  .disabled-user-select{\n    cursor: not-allowed;\n    background-color: #f5f5f5 !important;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/components/userSelect/useUserSelect.ts",
    "content": "/**\n * 用户选择组件支持选择 我自己，以表达式的形式传值\n */\nexport const mySelfExpress = '#{sys_user_code}';\n\n/**\n * 用户列表 我自己的数据\n */\nexport const mySelfData = {\n  id: mySelfExpress, username: mySelfExpress, realname: '当前用户', avatarIcon: 'idcard-outlined', avatarColor: 'rgb(75 176 79)'\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/hooks/useCodeHinting.ts",
    "content": "export const useCodeHinting = (CodeMirror, keywords, language) => {\n  const currentKeywords: any = [...keywords];\n  const codeHintingMount = (coder) => {\n    if (keywords.length) {\n      coder.setOption('mode', language);\n      setTimeout(() => {\n        coder!.on('cursorActivity', function () {\n          coder?.showHint({\n            completeSingle: false,\n            // container: containerRef.value\n          });\n        });\n      }, 1e3);\n    }\n  };\n\n  const codeHintingRegistry = () => {\n    // 自定义关键词(.的上一级)\n    const customKeywords: string[] = [];\n\n    currentKeywords.forEach((item) => {\n      if (item.superiors) {\n        customKeywords.push(item.superiors);\n      }\n    });\n    const funcsHint = (cm, callback) => {\n      // 获取光标位置\n      const cur = cm.getCursor();\n      // 获取当前单词的信息\n      const token = cm.getTokenAt(cur);\n      const start = token.start;\n      const end = cur.ch;\n      const str = token.string;\n      let recordKeyword = null;\n      console.log('光标位置：', cur, '单词信息：', token, `start:${start},end:${end},str:${str}`);\n\n      if (str.length) {\n        if (str === '.') {\n          // 查找.前面是否有定义的关键词\n          const curLineCode = cm.getLine(cur.line);\n          for (let i = 0, len = customKeywords.length; i < len; i++) {\n            const k = curLineCode.slice(-(customKeywords[i].length + 1), -1);\n            if (customKeywords.includes(k)) {\n              recordKeyword = k;\n              break;\n            }\n          }\n        } else {\n          // 查找单词前面是否有.this(.关键词)\n          const curLineCode = cm.getLine(cur.line);\n          for (let i = 0, len = customKeywords.length; i < len; i++) {\n            const k = curLineCode.slice(start - (customKeywords[i].length + 1), start);\n            if (k.substr(-1) === '.' && customKeywords.includes(k.replace('.', ''))) {\n              recordKeyword = k.replace('.', '');\n              break;\n            }\n          }\n        }\n        const findIdx = (a, b) => a.toLowerCase().indexOf(b.toLowerCase());\n        let list = currentKeywords.filter((item) => {\n          if (recordKeyword) {\n            // 查特定对象下的属性or方法\n            return item.superiors === recordKeyword;\n          } else {\n            // 查全局属性或者方法\n            return item.superiors == undefined;\n          }\n        });\n        if (str === '.') {\n          if (recordKeyword == null) {\n            list = [];\n          }\n        } else {\n          list = list\n            .filter((item) => {\n              const { text } = item;\n              const index = findIdx(text, str);\n              let result = text.startsWith('.') ? index === 1 : index === 0;\n              return result;\n            })\n            .sort((a, b) => {\n              if (findIdx(a.text, str) < findIdx(b.text, str)) {\n                return -1;\n              } else {\n                return 1;\n              }\n            });\n        }\n\n        if (list.length === 1) {\n          // 只有一个时可能是自己输入，输到最后需要去掉提示。\n          const item = list[0];\n          if (item.text === str || item.text.substring(1) === str) {\n            list = [];\n          }\n        }\n        if (list.length) {\n          // 当str不是点时去掉点\n          if (str != '.') {\n            list = list.map((item) => {\n              if (item.text.indexOf('.') === 0) {\n                return { ...item, text: item.text.substring(1) };\n              }\n              return item;\n            });\n          }\n          callback({\n            list: list,\n            from: CodeMirror.Pos(cur.line, start),\n            to: CodeMirror.Pos(cur.line, end),\n          });\n          // 代码逻辑说明: 【QQYUN-8865】js增强加上鼠标移入提示\n          const item = currentKeywords[0];\n          if (item?.desc) {\n            setTimeout(() => {\n              const elem: HTMLUListElement = document.querySelector('.CodeMirror-hints')!;\n              if (elem) {\n                const childElems = elem.children;\n                Array.from(childElems).forEach((item) => {\n                  const displayText = item.textContent;\n                  const findItem = currentKeywords.find((item) => item.displayText === displayText);\n                  if (findItem) {\n                    item.setAttribute('title', findItem.desc);\n                  }\n                });\n              }\n            }, 0);\n          }\n        } else {\n        }\n      }\n    };\n    funcsHint.async = true;\n    funcsHint.supportsSelection = true;\n    // 自动补全\n    keywords.length && CodeMirror.registerHelper('hint', language, funcsHint);\n  };\n  return {\n    codeHintingRegistry,\n    codeHintingMount,\n  };\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/hooks/useSelectBiz.ts",
    "content": "import { inject, reactive, ref, watch, unref, Ref } from 'vue';\nimport { useMessage } from '/@/hooks/web/useMessage';\nimport { isEmpty } from '@/utils/is';\n\nexport function useSelectBiz(getList, props, emit?) {\n  //接收下拉框选项\n  const selectOptions = inject('selectOptions', ref<Array<object>>([]));\n  //接收已选择的值\n  const selectValues = <object>inject('selectValues', reactive({ value: [], change: false }));\n  // 是否正在加载回显\n  const loadingEcho = inject<Ref<boolean>>('loadingEcho', ref(false));\n  //数据集\n  const dataSource = ref<Array<object>>([]);\n  //已选择的值\n  const checkedKeys = ref<Array<string | number>>([]);\n  //选则的行记录\n  const selectRows = ref<Array<object>>([]);\n  //提示弹窗\n  const $message = useMessage();\n  // 是否是首次加载回显，只有首次加载，才会显示 loading\n  let isFirstLoadEcho = true;\n\n  /**\n   * 监听selectValues变化\n   */\n  watch(\n    selectValues,\n    () => {\n      //if (selectValues['change'] == false && !isEmpty(selectValues['value'])) {\n      if (selectValues['change'] == false && !isEmpty(selectValues['value'])) {\n        // 代码逻辑说明: 【issues/7405】部门选择用户同时全部选择两页用户，回显到父页面。第二页用户显示的不是真是姓名\n        let params = { isMultiTranslate: 'true', pageSize: selectValues.value?.length };\n        params[props.rowKey] = selectValues['value'].join(',');\n        loadingEcho.value = isFirstLoadEcho;\n        isFirstLoadEcho = false;\n        getDataSource(params, true)\n          .then()\n          .finally(() => {\n            loadingEcho.value = isFirstLoadEcho;\n          });\n      }\n      //设置列表默认选中\n      // 代码逻辑说明: 【QQYUN-12155】弹窗中勾选，再点取消，值被选中了\n      checkedKeys['value'] = [...selectValues['value']];\n    },\n    { immediate: true }\n  );\n\n  async function onSelectChange(selectedRowKeys: (string | number)[], selectRow) {\n    checkedKeys.value = selectedRowKeys;\n    //判断全选的问题checkedKeys和selectRows必须一致\n    if (props.showSelected && unref(checkedKeys).length !== unref(selectRow).length) {\n      let { records } = await getList({\n        code: unref(checkedKeys).join(','),\n        pageSize: unref(checkedKeys).length,\n      });\n      selectRows.value = records;\n    } else {\n      selectRows.value = selectRow;\n    }\n  }\n\n  /**\n   * 选择列配置\n   */\n  const rowSelection = {\n    // 代码逻辑说明: 动态设置rowSelection的type值,默认是'checkbox' ---\n    type: props.isRadioSelection ? 'radio' : 'checkbox',\n    columnWidth: 20,\n    selectedRowKeys: checkedKeys,\n    onChange: onSelectChange,\n    //table4.4.0新增属性选中之后是否清空上一页下一页的数据，默认false\n    preserveSelectedRowKeys:true,\n  };\n\n  /**\n   * 序号列配置\n   */\n  const indexColumnProps = {\n    dataIndex: 'index',\n    width: 50,\n  };\n\n  /**\n   * 加载列表数据集\n   * @param params\n   * @param flag 是否是默认回显模式加载\n   */\n  async function getDataSource(params, flag) {\n    let { records } = await getList(params);\n    dataSource.value = records;\n    if (flag) {\n      let options = <any[]>[];\n      records.forEach((item) => {\n        options.push({ label: item[props.labelKey], value: item[props.rowKey] });\n      });\n      selectOptions.value = options;\n    }\n  }\n  async function initSelectRows() {\n    let { records } = await getList({\n      code: selectValues['value'].join(','),\n      pageSize: selectValues['value'].length,\n    });\n    // 代码逻辑说明: 【QQYUN-12155】弹窗中勾选，再点取消，值被选中了\n    checkedKeys['value'] = [...selectValues['value']];\n    selectRows['value'] = records;\n  }\n\n  /**\n   * 弹出框显示隐藏触发事件\n   */\n  async function visibleChange(visible) {\n    if (visible) {\n      // 代码逻辑说明: 【QQYUN-12179】弹窗勾选了值，点击取消再次打开弹窗遗留了上次的勾选的值\n      checkedKeys['value'] = [...selectValues['value']];\n      //设置列表默认选中\n      props.showSelected && initSelectRows();\n    } else {\n      // 代码逻辑说明: 【QQYUN-9366】用户选择组件取消和关闭会把选择数据带入\n      emit?.('close');\n    }\n  }\n\n  /**\n   * 确定选择\n   */\n  function getSelectResult(success) {\n    let options = <any[]>[];\n    let values = <any[]>[];\n    selectRows.value.forEach((item) => {\n      options.push({ label: item[props.labelKey], value: item[props.rowKey] });\n    });\n    checkedKeys.value.forEach((item) => {\n      values.push(item);\n    });\n    selectOptions.value = options;\n    if (props.maxSelectCount && values.length > props.maxSelectCount) {\n      $message.createMessage.warning(`最多只能选择${props.maxSelectCount}条数据`);\n      return false;\n    }\n    success && success(options, values);\n  }\n  //删除已选择的信息\n  function handleDeleteSelected(record) {\n    // 代码逻辑说明: 【issues/424】开启右侧列表后，在右侧列表中删除用户时，逻辑有问题------------\n    checkedKeys.value = checkedKeys.value.filter((item) => item != record[props.rowKey]);\n    selectRows.value = selectRows.value.filter((item) => item[props.rowKey] !== record[props.rowKey]);\n  }\n  //清空选择项\n  function reset() {\n    checkedKeys.value = [];\n    selectRows.value = [];\n  }\n  return [\n    {\n      onSelectChange,\n      getDataSource,\n      visibleChange,\n      selectOptions,\n      selectValues,\n      rowSelection,\n      indexColumnProps,\n      checkedKeys,\n      selectRows,\n      dataSource,\n      getSelectResult,\n      handleDeleteSelected,\n      reset,\n    },\n  ];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/hooks/useTreeBiz.ts",
    "content": "import type { Ref } from 'vue';\nimport { inject, reactive, ref, computed, unref, watch, nextTick } from 'vue';\nimport { TreeActionType } from '/@/components/Tree';\nimport { listToTree } from '/@/utils/common/compUtils';\nimport { isEqual } from 'lodash-es';\nimport { defHttp } from \"@/utils/http/axios\";\nimport { queryAllParentId } from \"/@/api/common/api\";\n\nexport function useTreeBiz(treeRef, getList, props, realProps, emit) {\n  //接收下拉框选项\n  const selectOptions = inject('selectOptions', ref<Array<object>>([]));\n  //接收已选择的值\n  const selectValues = <object>inject('selectValues', reactive({}));\n  // 是否正在加载回显\n  const loadingEcho = inject<Ref<boolean>>('loadingEcho', ref(false));\n  //数据集\n  const treeData = ref<Array<object>>([]);\n  //已选择的值\n  const checkedKeys = ref<Array<string | number>>([]);\n  //选则的行记录\n  const selectRows = ref<Array<object>>([]);\n  //是否是打开弹框模式\n  const openModal = ref(false);\n  //是否层级关联\n  const checkStrictly = ref<boolean>(realProps.multiple ? props.checkStrictly : true);\n  // 是否开启父子关联，如果不可以多选，就始终取消父子关联\n  const getCheckStrictly = computed(() => checkStrictly.value);\n  // 是否是首次加载回显，只有首次加载，才会显示 loading\n  let isFirstLoadEcho = true;\n  let prevSelectValues = [];\n  // 需要展开的父节点ID列表\n  const expandedKeys = ref<Array<string | number>>([]);\n  // 是否启用自动展开功能（可以通过props控制）\n  const enableAutoExpand = props.enableAutoExpand !== false;\n  /**\n   * 监听selectValues变化\n   */\n  watch(\n    selectValues,\n    ({ value: values }: Recordable) => {\n      if(!values){\n        return;\n      }\n      // 代码逻辑说明: 【issues/8232】代码设置JSelectDept组件值没翻译\n      if (values.length > 0) {\n        // 防止多次请求\n        if (isEqual(values, prevSelectValues)) return;\n        prevSelectValues = values;\n        loadingEcho.value = isFirstLoadEcho;\n        isFirstLoadEcho = false;\n        onLoadData(null, values.join(',')).finally(() => {\n          loadingEcho.value = false;\n        });\n      }\n    },\n    { immediate: true }\n  );\n\n  /**\n   * 获取树实例\n   */\n  function getTree() {\n    const tree = unref(treeRef);\n    if (!tree) {\n      //throw new Error('tree is null!');\n      return null;\n    }\n    return tree;\n  }\n\n  /**\n   * 获取需要展开的父节点ID\n   */\n  async function getParentIdsToExpand(selectedIds) {\n    if (!selectedIds || selectedIds.length === 0) return [];\n    \n    try {\n      const result = await queryAllParentId({ \n        departId: selectedIds.join(','),\n        orgCode: props.params?.orgCode \n      });\n      \n      if (result) {\n        const allParentIds = [];\n        // 处理 Map 或 Object 结构\n        const valuesToProcess = result instanceof Map \n          ? Array.from(result.values()) \n          : Object.values(result);\n        \n        // 遍历所有选中节点的父节点\n        valuesToProcess.forEach((nodeData: any) => {\n          if (nodeData && nodeData.parentIds && Array.isArray(nodeData.parentIds)) {\n            // 添加父节点ID（不包含选中节点本身）\n            const parentIds = nodeData.parentIds.filter(id => !selectedIds.includes(id));\n            allParentIds.push(...parentIds);\n          }\n        });\n        \n        return [...new Set(allParentIds)]; // 去重\n      }\n      return [];\n    } catch (error) {\n      console.warn('获取父节点ID失败:', error);\n      return [];\n    }\n  }\n\n  /**\n   * 设置树展开级别\n   */\n  function expandTree() {\n    nextTick(() => {\n      if (props.defaultExpandLevel && props.defaultExpandLevel > 0) {\n        getTree().filterByLevel(props.defaultExpandLevel);\n      }\n      //设置列表默认选中\n      checkedKeys.value = selectValues['value'];\n      \n      // 如果有需要展开的父节点，则展开它们\n      if (expandedKeys.value.length > 0) {\n        getTree().setExpandedKeys(expandedKeys.value);\n      }\n    }).then(() => {\n      // 再次确保展开，因为树可能还没有完全渲染\n      if (expandedKeys.value.length > 0) {\n        setTimeout(() => {\n          getTree().setExpandedKeys(expandedKeys.value);\n        }, 100);\n      }\n    });\n  }\n\n  /**\n   * 树节点选择\n   */\n  function onSelect(keys, info) {\n    if (props.checkable == false) {\n      checkedKeys.value = props.checkStrictly ? keys.checked : keys;\n      const { selectedNodes } = info;\n      let rows = <any[]>[];\n      selectedNodes.forEach((item) => {\n        rows.push(item);\n      });\n      selectRows.value = rows;\n    }\n  }\n\n  /**\n   * 树节点选择\n   */\n  function onCheck(keys, info) {\n    if(!info){\n      return;\n    }\n    if (props.checkable == true) {\n      // 如果不能多选，就只保留最后一个选中的\n      if (!realProps.multiple) {\n        if (info.checked) {\n          // 代码逻辑说明: 单选模式下，设定rowKey，无法选中数据-\n          checkedKeys.value = [info.node.eventKey];\n          let rowKey = props.rowKey;\n          let temp = info.checkedNodes.find((n) => n[rowKey] === info.node.eventKey);\n          selectRows.value = [temp];\n        } else {\n          checkedKeys.value = [];\n          selectRows.value = [];\n        }\n        return;\n      }\n      // 代码逻辑说明: 【JHHB-250】选择部门加一个层级关联/独立的配置，现在是点击就全勾选了---\n      checkedKeys.value = checkStrictly.value ? keys.checked : keys;\n      const { checkedNodes } = info;\n      let rows = <any[]>[];\n      checkedNodes.forEach((item) => {\n        rows.push(item);\n      });\n      selectRows.value = rows;\n    }\n  }\n\n  /**\n   * 勾选全部\n   */\n  async function checkALL(checkAll) {\n    getTree().checkAll(checkAll);\n    // 代码逻辑说明: 【issues/394】所属部门树操作全部勾选不生效/【issues/4646】部门全部勾选后，点击确认按钮，部门信息丢失------------\n    await nextTick();\n    checkedKeys.value = getTree().getCheckedKeys();\n    if(checkAll){\n      getTreeRow();\n    }else{\n      selectRows.value = [];\n    }\n  }\n\n  /**\n   * 获取数列表\n   * @param res\n   */\n  function getTreeRow() {\n    let ids = \"\";\n    if(unref(checkedKeys).length>0){\n      ids = checkedKeys.value.join(\",\");\n    }\n    getList({ids:ids}).then((res) =>{\n      selectRows.value = res;\n    })\n  }\n\n  /**\n   * 展开全部\n   */\n  function expandAll(expandAll) {\n    getTree().expandAll(expandAll);\n  }\n\n  /**\n   * 加载树数据\n   */\n  async function onLoadData(treeNode, ids) {\n    let params = {};\n    let startPid = '';\n    if (treeNode) {\n      startPid = treeNode.eventKey;\n      // 代码逻辑说明: rowkey不设置成id，sync开启异步的时候，点击上级下级不显示------------\n      params['pid'] = treeNode.value;\n    }\n    if (ids) {\n      startPid = '';\n      params['ids'] = ids;\n    }\n\n    if(props.params?.departIds){\n      params['departIds'] = props.params.departIds;\n    }\n    let record = await getList(params);\n    let optionData = record;\n    //只展示公司信息（公司+子公司）\n    if(props.onlyShowCompany){\n      record = getCompanyData(record)\n    }\n    //是否只选择部门岗位\n    if (props.izOnlySelectDepartPost) {\n      setCompanyDepartCheckable(record);\n    }\n    //是否缩写departNameAbbr\n    if (props.izShowDepartNameAbbr) {\n      record = getDepartAbbrData(record);\n    }\n    if (!props.serverTreeData) {\n      //前端处理数据为tree结构\n      record = listToTree(record, props, startPid);\n      if (record.length == 0 && treeNode) {\n        checkHasChild(startPid, treeData.value);\n      }\n    }\n\n    if (openModal.value == true) {\n      //弹框模式下加载全部数据\n      if (!treeNode) {\n        treeData.value = record;\n      } else {\n        return new Promise((resolve: (value?: unknown) => void) => {\n          if (!treeNode.children) {\n            resolve();\n            return;\n          }\n          const asyncTreeAction: TreeActionType | null = unref(treeRef);\n          if (asyncTreeAction) {\n            asyncTreeAction.updateNodeByKey(treeNode.eventKey, { children: record });\n            asyncTreeAction.setExpandedKeys([treeNode.eventKey, ...asyncTreeAction.getExpandedKeys()]);\n          }\n          resolve();\n          return;\n        });\n      }\n      expandTree();\n    } else {\n      const options = <any[]>[];\n      optionData.forEach((item) => {\n        // 代码逻辑说明: issues/I5F3P4 online配置部门选择后编辑，查看数据应该显示部门名称，不是部门代码\n        options.push({ label: item[props.labelKey], value: item[props.rowKey] });\n      });\n      selectOptions.value = options;\n    }\n  }\n\n  /**\n   * 获取到公司/子公司数据\n   * @param record\n   */\n  function getCompanyData(record){\n    const companyData = record.filter(item=>item.orgCategory && ['1','4'].includes(item.orgCategory));\n    return companyData\n  }\n  /**\n   * 获取到公司/子公司数据\n   * @param record\n   */\n  function getDepartAbbrData(record){\n    const departAbbrData = record;\n    departAbbrData.forEach(item=>{\n      item.title = item.departNameAbbr || item.title;\n    })\n    return departAbbrData\n  }\n  /**\n   * 异步加载时检测是否含有下级节点\n   * @param pid 父节点\n   * @param treeArray  tree数据\n   */\n  function checkHasChild(pid, treeArray) {\n    if (treeArray && treeArray.length > 0) {\n      for (let item of treeArray) {\n        if (item.key == pid) {\n          if (!item.child) {\n            item.isLeaf = true;\n          }\n          break;\n        } else {\n          checkHasChild(pid, item.children);\n        }\n      }\n    }\n  }\n\n  /**\n   * 获取已选择数据\n   */\n  function getSelectTreeData(success) {\n    const options = <any[]>[];\n    const values = <any[]>[];\n    selectRows.value.forEach((item) => {\n      options.push({ label: item[props.labelKey], value: item[props.rowKey] });\n    });\n    checkedKeys.value.forEach((item) => {\n      values.push(item);\n    });\n    selectOptions.value = options;\n    success && success(options, values);\n  }\n\n  /**\n   * 弹出框显示隐藏触发事件\n   */\n  async function visibleChange(visible) {\n    if (visible) {\n      //弹出框打开时加载全部数据\n      openModal.value = true;\n      await onLoadData(null, null);\n      \n      // 在数据加载完成后，如果有选中的值且启用了自动展开功能，则展开父节点\n      if (enableAutoExpand && selectValues.value && selectValues.value.length > 0) {\n        try {\n          const selectedIds = selectValues.value;\n          const parentIds = await getParentIdsToExpand(selectedIds);\n          \n          if (parentIds.length > 0) {\n            expandedKeys.value = parentIds;\n            \n            // 延迟展开，确保树已经渲染完成\n            nextTick(() => {\n              try {\n                const tree = getTree();\n                if (tree) {\n                  tree.setExpandedKeys(parentIds);\n\n                  // 再次确保展开\n                  setTimeout(() => {\n                    try {\n                      const tree = getTree();\n                      if (tree) {\n                        tree.setExpandedKeys(parentIds);\n                        console.log('父节点已展开:', parentIds);\n                        // 第三次确保展开，使用更长的延迟\n                        setTimeout(() => {\n                          try {\n                            const tree = getTree();\n                            if (tree) {\n                              tree.setExpandedKeys(parentIds);\n                            }\n                          } catch (error) {\n                            console.warn('展开父节点失败:', error);\n                          }\n                        }, 500);\n                      }\n                    } catch (error) {\n                      console.warn('展开父节点失败:', error);\n                    }\n                  }, 200);\n                }\n              } catch (error) {\n                console.warn('展开父节点失败:', error);\n              }\n            });\n            \n          }\n        } catch (error) {\n          console.warn('获取父节点ID失败:', error);\n        }\n      }\n    } else {\n      openModal.value = false;\n      emit?.('close');\n    }\n  }\n\n  /**\n   * 设置公司部门复选框显示\n   * @param record\n   */\n  function setCompanyDepartCheckable(record) {\n    if (record && record.length > 0) {\n      for (const item of record) {\n        if (item.orgCategory !== '3') {\n          item.checkable = false;\n          item.selectable = false;\n        } else {\n          item.checkable = true;\n          item.selectable = true;\n        }\n        if (item.isLeaf) {\n          setCompanyDepartCheckable(item.children);\n        }\n      }\n    }\n  }\n\n  /**\n   * 岗位搜索\n   *\n   * @param value\n   */\n  async function onSearch(value) {\n    if(value){\n      let result = await defHttp.get({ url: \"/sys/sysDepart/searchBy\", params: { keyWord: value, orgCategory: \"3\",...props.params } });\n      if (Array.isArray(result)) {\n        treeData.value = result;\n      } else {\n        treeData.value = [];\n      }\n    } else {\n      treeData.value = [];\n      await onLoadData(null, null)\n    }\n  }\n\n  return [\n    {\n      visibleChange,\n      selectOptions,\n      selectValues,\n      onLoadData,\n      onCheck,\n      onSelect,\n      checkALL,\n      expandAll,\n      checkedKeys,\n      selectRows,\n      treeData,\n      getCheckStrictly,\n      getSelectTreeData,\n      onSearch,\n      expandedKeys,\n      checkStrictly,\n    },\n  ];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/jeecg/props/props.ts",
    "content": "//下拉选择框组件公共props\nimport { propTypes } from '/@/utils/propTypes';\n\nexport const selectProps = {\n  //是否多选\n  isRadioSelection: {\n    type: Boolean,\n    // 代码逻辑说明: 部门用户组件默认应该单选，否则其他地方有问题------------\n    default: false,\n  },\n  //回传value字段名\n  rowKey: {\n    type: String,\n    default: 'id',\n  },\n  //回传文本字段名\n  labelKey: {\n    type: String,\n    default: 'name',\n  },\n  //查询参数\n  params: {\n    type: Object,\n    default: () => {},\n  },\n  //是否显示选择按钮\n  showButton: propTypes.bool.def(true),\n  //是否显示右侧选中列表\n  showSelected: propTypes.bool.def(false),\n  //最大选择数量\n  maxSelectCount: {\n    type: Number,\n    default: 0,\n  },\n};\n\n//树形选择组件公共props\nexport const treeProps = {\n  //回传value字段名\n  rowKey: {\n    type: String,\n    default: 'key',\n  },\n  //回传文本字段名\n  labelKey: {\n    type: String,\n    default: 'title',\n  },\n  //初始展开的层级\n  defaultExpandLevel: {\n    type: [Number],\n    default: 1,\n  },\n  //根pid值\n  startPid: {\n    type: [Number, String],\n    default: '',\n  },\n  //主键字段\n  primaryKey: {\n    type: [String],\n    default: 'id',\n  },\n  //父ID字段\n  parentKey: {\n    type: [String],\n    default: 'parentId',\n  },\n  //title字段\n  titleKey: {\n    type: [String],\n    default: 'title',\n  },\n  //是否开启服务端转换tree数据结构\n  serverTreeData: propTypes.bool.def(true),\n  //是否开启异步加载数据\n  sync: propTypes.bool.def(true),\n  //是否显示选择按钮\n  showButton: propTypes.bool.def(true),\n  //是否只显示公司\n  onlyShowCompany: propTypes.bool.def(false),\n  //是否显示复选框\n  checkable: propTypes.bool.def(true),\n  //checkable 状态下节点选择完全受控（父子节点选中状态不再关联）\n  checkStrictly: propTypes.bool.def(false),\n  // 是否允许多选，默认 true\n  multiple: propTypes.bool.def(true),\n  // 是否只选择岗位\n  izOnlySelectDepartPost: propTypes.bool.def(false),\n  // 是否显示部门简称\n  izShowDepartNameAbbr: propTypes.bool.def(false),\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/props.ts",
    "content": "import type { FieldMapToTime, FormSchema } from './types/form';\nimport type { CSSProperties, PropType } from 'vue';\nimport type { ColEx } from './types';\nimport type { TableActionType } from '/@/components/Table';\nimport type { ButtonProps } from 'ant-design-vue/es/button/buttonTypes';\nimport type { RowProps } from 'ant-design-vue/lib/grid/Row';\nimport dayjs from \"dayjs\";\nimport { propTypes } from '/@/utils/propTypes';\nimport componentSetting from '/@/settings/componentSetting';\n\nconst { form } = componentSetting;\nexport const basicProps = {\n  model: {\n    type: Object as PropType<Recordable>,\n    default: {},\n  },\n  // 标签宽度  固定宽度\n  labelWidth: {\n    type: [Number, String] as PropType<number | string>,\n    default: 0,\n  },\n  fieldMapToTime: {\n    type: Array as PropType<FieldMapToTime>,\n    default: () => [],\n  },\n  fieldMapToNumber: {\n    type: Array as PropType<FieldMapToTime>,\n    default: () => [],\n  },\n  compact: propTypes.bool,\n  // 表单配置规则\n  schemas: {\n    type: [Array] as PropType<FormSchema[]>,\n    default: () => [],\n  },\n  mergeDynamicData: {\n    type: Object as PropType<Recordable>,\n    default: null,\n  },\n  baseRowStyle: {\n    type: Object as PropType<CSSProperties>,\n  },\n  baseColProps: {\n    type: Object as PropType<Partial<ColEx>>,\n  },\n  autoSetPlaceHolder: propTypes.bool.def(true),\n  // 在INPUT组件上单击回车时，是否自动提交\n  autoSubmitOnEnter: propTypes.bool.def(false),\n  submitOnReset: propTypes.bool,\n  size: propTypes.oneOf(['default', 'small', 'large']).def('default'),\n  // 禁用表单\n  disabled: propTypes.bool,\n  emptySpan: {\n    type: [Number, Object] as PropType<number>,\n    default: 0,\n  },\n  // 是否显示收起展开按钮\n  showAdvancedButton: propTypes.bool,\n  // 转化时间\n  transformDateFunc: {\n    type: Function as PropType<Fn>,\n    default: (date: any) => {\n      // 判断是否是dayjs实例\n      return dayjs.isDayjs(date) ? date?.format('YYYY-MM-DD HH:mm:ss') : date;\n    },\n  },\n  rulesMessageJoinLabel: propTypes.bool.def(true),\n  // 【jeecg】超过3列自动折叠\n  autoAdvancedCol: propTypes.number.def(3),\n  // 超过3行自动折叠\n  // autoAdvancedLine: propTypes.number.def(3),\n  // 不受折叠影响的行数\n  alwaysShowLines: propTypes.number.def(1),\n\n  // 是否显示操作按钮\n  showActionButtonGroup: propTypes.bool.def(true),\n  // 操作列Col配置\n  actionColOptions: Object as PropType<Partial<ColEx>>,\n  // 显示重置按钮\n  showResetButton: propTypes.bool.def(true),\n  // 是否聚焦第一个输入框，只在第一个表单项为input的时候作用\n  autoFocusFirstItem: propTypes.bool,\n  // 重置按钮配置\n  resetButtonOptions: Object as PropType<Partial<ButtonProps>>,\n\n  // 显示确认按钮\n  showSubmitButton: propTypes.bool.def(true),\n  // 确认按钮配置\n  submitButtonOptions: Object as PropType<Partial<ButtonProps>>,\n\n  // 自定义重置函数\n  resetFunc: Function as PropType<() => Promise<void>>,\n  submitFunc: Function as PropType<() => Promise<void>>,\n\n  // 以下为默认props\n  hideRequiredMark: propTypes.bool,\n\n  labelCol: {\n    type: Object as PropType<Partial<ColEx>>,\n    default: form.labelCol,\n  },\n\n  layout: propTypes.oneOf(['horizontal', 'vertical', 'inline']).def('horizontal'),\n  tableAction: {\n    type: Object as PropType<TableActionType>,\n  },\n\n  wrapperCol: {\n    type: Object as PropType<Partial<ColEx>>,\n    default: form.wrapperCol,\n  },\n\n  colon: propTypes.bool.def(form.colon),\n\n  labelAlign: propTypes.string,\n\n  rowProps: Object as PropType<RowProps>,\n  \n  // 当表单是查询条件的时候 当表单改变后自动查询，不需要点击查询按钮\n  autoSearch: propTypes.bool.def(false),\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/types/form.ts",
    "content": "import type { NamePath, RuleObject, ValidateOptions } from 'ant-design-vue/lib/form/interface';\nimport type { VNode, ComputedRef } from 'vue';\nimport type { ButtonProps as AntdButtonProps } from '/@/components/Button';\nimport type { FormItem } from './formItem';\nimport type { ColEx, ComponentType } from './index';\nimport type { TableActionType } from '/@/components/Table/src/types/table';\nimport type { CSSProperties } from 'vue';\nimport type { RowProps } from 'ant-design-vue/lib/grid/Row';\n\nexport type FieldMapToTime = [string, [string, string], string?][];\nexport type FieldMapToNumber = [string, [string, string]][];\n\nexport type Rule = RuleObject & {\n  trigger?: 'blur' | 'change' | ['change', 'blur'];\n};\n\nexport interface RenderCallbackParams {\n  schema: FormSchema;\n  values: Recordable;\n  model: Recordable;\n  field: string;\n}\n\nexport interface ButtonProps extends AntdButtonProps {\n  text?: string;\n}\n\nexport interface FormActionType {\n  submit: () => Promise<void>;\n  setFieldsValue: <T>(values: T) => Promise<void>;\n  resetFields: () => Promise<void>;\n  getFieldsValue: () => Recordable;\n  clearValidate: (name?: string | string[]) => Promise<void>;\n  updateSchema: (data: Partial<FormSchema> | Partial<FormSchema>[]) => Promise<void>;\n  resetSchema: (data: Partial<FormSchema> | Partial<FormSchema>[]) => Promise<void>;\n  setProps: (formProps: Partial<FormProps>) => Promise<void>;\n  getProps: ComputedRef<Partial<FormProps>>;\n  getSchemaByField: (field: string) => Nullable<FormSchema>;\n  removeSchemaByFiled: (field: string | string[]) => Promise<void>;\n  appendSchemaByField: (schema: FormSchema, prefixField: string | undefined, first?: boolean | undefined) => Promise<void>;\n  validateFields: (nameList?: NamePath[], options?: ValidateOptions) => Promise<any>;\n  validate: (nameList?: NamePath[]) => Promise<any>;\n  scrollToField: (name: NamePath, options?: ScrollOptions) => Promise<void>;\n  getSchemaComponentProps: (schema: FormSchema) => Recordable\n}\n\nexport type RegisterFn = (formInstance: FormActionType) => void;\n\nexport type UseFormReturnType = [RegisterFn, FormActionType];\n\nexport interface FormProps {\n  layout?: 'vertical' | 'inline' | 'horizontal';\n  // Form value\n  model?: Recordable;\n  // The width of all items in the entire form\n  labelWidth?: number | string;\n  //alignment\n  labelAlign?: 'left' | 'right';\n  //Row configuration for the entire form\n  rowProps?: RowProps;\n  // Submit form on reset\n  submitOnReset?: boolean;\n  // Col configuration for the entire form\n  labelCol?: Partial<ColEx> | null;\n  // Col configuration for the entire form\n  wrapperCol?: Partial<ColEx> | null;\n\n  // General row style\n  baseRowStyle?: CSSProperties;\n\n  // General col configuration\n  baseColProps?: Partial<ColEx>;\n\n  // Form configuration rules\n  schemas?: FormSchema[];\n  // Function values used to merge into dynamic control form items\n  mergeDynamicData?: Recordable;\n  // Compact mode for search forms\n  compact?: boolean;\n  // Blank line span\n  emptySpan?: number | Partial<ColEx>;\n  // Internal component size of the form\n  size?: 'default' | 'small' | 'large';\n  // Whether to disable\n  disabled?: boolean;\n  // Time interval fields are mapped into multiple\n  fieldMapToTime?: FieldMapToTime;\n  // number interval fields are mapped into multiple\n  fieldMapToNumber?: FieldMapToNumber;\n  // Placeholder is set automatically\n  autoSetPlaceHolder?: boolean;\n  // Auto submit on press enter on input\n  autoSubmitOnEnter?: boolean;\n  // Check whether the information is added to the label\n  rulesMessageJoinLabel?: boolean;\n  // 是否显示展开收起按钮\n  showAdvancedButton?: boolean;\n  // Whether to focus on the first input box, only works when the first form item is input\n  autoFocusFirstItem?: boolean;\n  // 【jeecg】如果 showAdvancedButton 为 true，超过指定列数默认折叠，默认为3\n  autoAdvancedCol?: number;\n  // 如果 showAdvancedButton 为 true，超过指定行数行默认折叠\n  // 代码逻辑说明: 【issues/7261】表格上方查询项autoAdvancedLine配置没有效果（删除autoAdvancedLine）\n  // autoAdvancedLine?: number;\n  // 折叠时始终保持显示的行数\n  alwaysShowLines?: number;\n  // Whether to show the operation button\n  showActionButtonGroup?: boolean;\n\n  // Reset button configuration\n  resetButtonOptions?: Partial<ButtonProps>;\n\n  // Confirm button configuration\n  submitButtonOptions?: Partial<ButtonProps>;\n\n  // Operation column configuration\n  actionColOptions?: Partial<ColEx>;\n\n  // Show reset button\n  showResetButton?: boolean;\n  // Show confirmation button\n  showSubmitButton?: boolean;\n\n  resetFunc?: () => Promise<void>;\n  submitFunc?: () => Promise<void>;\n  transformDateFunc?: (date: any) => string;\n  colon?: boolean;\n}\nexport interface FormSchema {\n  // Field name\n  field: string;\n  // Event name triggered by internal value change, default change\n  changeEvent?: string;\n  // Variable name bound to v-model Default value\n  valueField?: string;\n  // Label name\n  // 代码逻辑说明: 【issues/6908】多语言无刷新切换时，BasicColumn和FormSchema里面的值不能正常切换\n  label: string | VNode | Fn;\n  // Auxiliary text\n  subLabel?: string;\n  // Help text on the right side of the text\n  helpMessage?: string | string[] | ((renderCallbackParams: RenderCallbackParams) => string | string[]);\n  // BaseHelp component props\n  helpComponentProps?: Partial<HelpComponentProps>;\n  // Label width, if it is passed, the labelCol and WrapperCol configured by itemProps will be invalid\n  labelWidth?: string | number;\n  // Disable the adjustment of labelWidth with global settings of formModel, and manually set labelCol and wrapperCol by yourself\n  disabledLabelWidth?: boolean;\n  // render component\n  component: ComponentType;\n  // Component parameters\n  componentProps?:\n    | ((opt: { schema: FormSchema; tableAction: TableActionType; formActionType: FormActionType; formModel: Recordable }) => Recordable)\n    | object;\n  // Required\n  required?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean);\n\n  suffix?: string | number | VueNode | ((values: RenderCallbackParams) => string | number | VueNode);\n  // 【QQYUN-12876】是否是紧凑型 suffix（当组件宽度未占满时，可紧挨着组件右侧）\n  suffixCompact?: boolean;\n\n  // Validation rules\n  rules?: Rule[];\n  // Check whether the information is added to the label\n  rulesMessageJoinLabel?: boolean;\n\n  // Reference formModelItem\n  itemProps?: Partial<FormItem> | ((renderCallbackParams: RenderCallbackParams) => Partial<FormItem>);\n\n  // col configuration outside formModelItem\n  colProps?: Partial<ColEx>;\n\n  // 默认值\n  defaultValue?: any;\n  isAdvanced?: boolean;\n\n  // Matching details components\n  span?: number;\n\n  ifShow?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean);\n\n  show?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean);\n\n  // Render the content in the form-item tag\n  render?: (renderCallbackParams: RenderCallbackParams) => VNode | VNode[] | string;\n\n  // Rendering col content requires outer wrapper form-item\n  renderColContent?: (renderCallbackParams: RenderCallbackParams) => VNode | VNode[] | string;\n\n  renderComponentContent?: ((renderCallbackParams: RenderCallbackParams) => any) | VNode | VNode[] | string;\n\n  // Custom slot, in from-item\n  slot?: string;\n\n  // Custom slot, similar to renderColContent\n  colSlot?: string;\n\n  dynamicDisabled?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean);\n\n  dynamicRules?: (renderCallbackParams: RenderCallbackParams) => Rule[];\n  // 设置组件props的key\n  dynamicPropskey?: string;\n  dynamicPropsVal?: ((renderCallbackParams: RenderCallbackParams) => any);\n\n  // 这个属性自定义的 用于自定义的业务 比如在表单打开的时候修改表单的禁用状态，但是又不能重写componentProps，因为他的内容太多了，所以使用dynamicDisabled和buss实现\n  buss?: any;\n  \n  //label字数控制（label宽度）\n  labelLength?: number;\n  // update-begin--author:liaozhiyang---date:20240529---for【TV360X-460】basicForm支持v-auth指令(权限控制显隐)\n  auth?: string;\n  // update-end--author:liaozhiyang---date:20240529---for【TV360X-460】basicForm支持v-auth指令(权限控制显隐)\n}\nexport interface HelpComponentProps {\n  maxWidth: string;\n  // Whether to display the serial number\n  showIndex: boolean;\n  // Text list\n  text: any;\n  // colour\n  color: string;\n  // font size\n  fontSize: string;\n  icon: string;\n  absolute: boolean;\n  // Positioning\n  position: any;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/types/formItem.ts",
    "content": "import type { NamePath } from 'ant-design-vue/lib/form/interface';\nimport type { ColProps } from 'ant-design-vue/lib/grid/Col';\nimport type { HTMLAttributes, VNodeChild } from 'vue';\n\nexport interface FormItem {\n  /**\n   * Used with label, whether to display : after label text.\n   * @default true\n   * @type boolean\n   */\n  colon?: boolean;\n\n  /**\n   * The extra prompt message. It is similar to help. Usage example: to display error message and prompt message at the same time.\n   * @type any (string | slot)\n   */\n  extra?: string | VNodeChild | JSX.Element;\n\n  /**\n   * Used with validateStatus, this option specifies the validation status icon. Recommended to be used only with Input.\n   * @default false\n   * @type boolean\n   */\n  hasFeedback?: boolean;\n\n  /**\n   * The prompt message. If not provided, the prompt message will be generated by the validation rule.\n   * @type any (string | slot)\n   */\n  help?: string | VNodeChild | JSX.Element;\n\n  /**\n   * Label test\n   * @type any (string | slot)\n   */\n  label?: string | VNodeChild | JSX.Element;\n\n  /**\n   * The layout of label. You can set span offset to something like {span: 3, offset: 12} or sm: {span: 3, offset: 12} same as with <Col>\n   * @type Col\n   */\n  labelCol?: ColProps & HTMLAttributes;\n\n  /**\n   * Whether provided or not, it will be generated by the validation rule.\n   * @default false\n   * @type boolean\n   */\n  required?: boolean;\n\n  /**\n   * The validation status. If not provided, it will be generated by validation rule. options: 'success' 'warning' 'error' 'validating'\n   * @type string\n   */\n  validateStatus?: '' | 'success' | 'warning' | 'error' | 'validating';\n\n  /**\n   * The layout for input controls, same as labelCol\n   * @type Col\n   */\n  wrapperCol?: ColProps;\n  /**\n   * Set sub label htmlFor.\n   */\n  htmlFor?: string;\n  /**\n   * text align of label\n   */\n  labelAlign?: 'left' | 'right';\n  /**\n   * a key of model. In the setting of validate and resetFields method, the attribute is required\n   */\n  name?: NamePath;\n  /**\n   * validation rules of form\n   */\n  rules?: object | object[];\n  /**\n   * Whether to automatically associate form fields. In most cases, you can setting automatic association.\n   * If the conditions for automatic association are not met, you can manually associate them. See the notes below.\n   */\n  autoLink?: boolean;\n  /**\n   * Whether stop validate on first rule of error for this field.\n   */\n  validateFirst?: boolean;\n  /**\n   * When to validate the value of children node\n   */\n  validateTrigger?: string | string[] | false;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/types/hooks.ts",
    "content": "export interface AdvanceState {\n  isAdvanced: boolean;\n  hideAdvanceBtn: boolean;\n  isLoad: boolean;\n  actionSpan: number;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/types/index.ts",
    "content": "type ColSpanType = number | string;\n\nexport interface ColEx {\n  style?: any;\n  /**\n   * raster number of cells to occupy, 0 corresponds to display: none\n   * @default none (0)\n   * @type ColSpanType\n   */\n  span?: ColSpanType;\n\n  /**\n   * raster order, used in flex layout mode\n   * @default 0\n   * @type ColSpanType\n   */\n  order?: ColSpanType;\n\n  /**\n   * the layout fill of flex\n   * @default none\n   * @type ColSpanType\n   */\n  flex?: ColSpanType;\n\n  /**\n   * the number of cells to offset Col from the left\n   * @default 0\n   * @type ColSpanType\n   */\n  offset?: ColSpanType;\n\n  /**\n   * the number of cells that raster is moved to the right\n   * @default 0\n   * @type ColSpanType\n   */\n  push?: ColSpanType;\n\n  /**\n   * the number of cells that raster is moved to the left\n   * @default 0\n   * @type ColSpanType\n   */\n  pull?: ColSpanType;\n\n  /**\n   * <576px and also default setting, could be a span value or an object containing above props\n   * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType\n   */\n  xs?: { span: ColSpanType; offset?: ColSpanType } | ColSpanType;\n\n  /**\n   * ≥576px, could be a span value or an object containing above props\n   * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType\n   */\n  sm?: { span: ColSpanType; offset?: ColSpanType } | ColSpanType;\n\n  /**\n   * ≥768px, could be a span value or an object containing above props\n   * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType\n   */\n  md?: { span: ColSpanType; offset?: ColSpanType } | ColSpanType;\n\n  /**\n   * ≥992px, could be a span value or an object containing above props\n   * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType\n   */\n  lg?: { span: ColSpanType; offset?: ColSpanType } | ColSpanType;\n\n  /**\n   * ≥1200px, could be a span value or an object containing above props\n   * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType\n   */\n  xl?: { span: ColSpanType; offset?: ColSpanType } | ColSpanType;\n\n  /**\n   * ≥1600px, could be a span value or an object containing above props\n   * @type { span: ColSpanType, offset: ColSpanType } | ColSpanType\n   */\n  xxl?: { span: ColSpanType; offset?: ColSpanType } | ColSpanType;\n}\n\nexport type ComponentType =\n  | 'Input'\n  | 'InputGroup'\n  | 'InputPassword'\n  | 'InputSearch'\n  | 'InputTextArea'\n  | 'InputNumber'\n  | 'InputCountDown'\n  | 'Select'\n  | 'ApiSelect'\n  | 'TreeSelect'\n  | 'ApiTreeSelect'\n  | 'ApiRadioGroup'\n  | 'RadioButtonGroup'\n  | 'RadioGroup'\n  | 'Checkbox'\n  | 'CheckboxGroup'\n  | 'AutoComplete'\n  | 'Cascader'\n  | 'DatePicker'\n  | 'MonthPicker'\n  | 'RangePicker'\n  | 'WeekPicker'\n  | 'TimePicker'\n  | 'DatePickerInFilter'\n  | 'JDatePickerMultiple'\n  | 'Switch'\n  | 'StrengthMeter'\n  | 'Upload'\n  | 'IconPicker'\n  | 'Render'\n  | 'Slider'\n  | 'Rate'\n  | 'Divider'\n  | 'JAreaLinkage'\n  | 'JSelectPosition'\n  | 'JSelectRole'\n  | 'JSelectUser'\n  | 'JImageUpload'\n  | 'JDictSelectTag'\n  | 'JSelectDept'\n  | 'JSelectDepartPost'\n  | 'JAreaSelect'\n  | 'JEditor'\n  | 'JMarkdownEditor'\n  | 'JSelectInput'\n  | 'JCodeEditor'\n  | 'JCategorySelect'\n  | 'JSelectMultiple'\n  | 'JPopup'\n  | 'JPopupDict'\n  | 'JSwitch'\n  | 'JEasyCron'\n  | 'JTreeDict'\n  | 'JInputPop'\n  | 'JCheckbox'\n  | 'JInput'\n  | 'JTreeSelect'\n  | 'JEllipsis'\n  | 'JSelectUserByDept'\n  | 'JSelectUserByDeptPost'\n  | 'JSelectUserByDepartment'\n  | 'JUpload'\n  | 'JSearchSelect'\n  | 'JAddInput'\n  | 'Time'\n  | 'OnlineSelectCascade'\n  | 'LinkTableCard'\n  | 'LinkTableSelect'\n  | 'LinkTableForQuery'\n  | 'CascaderPcaForQuery'\n  | 'CascaderPcaInFilter'\n  | 'UserSelect'\n  | 'RoleSelect'\n  | 'RangeDate'\n  | 'RangeNumber'\n  | 'linkRecordSelect'\n  | 'RangeTime'\n  | 'JRangeNumber'\n  | 'JLinkTableCard'\n  | 'JInputSelect';\n\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/utils/Area.ts",
    "content": "import {pcaa as REGION_DATA} from \"@/utils/areaData/pcaUtils\";\n\n/**\n * Area 属性all的类型\n */\ninterface PlainPca {\n  id: string;\n  text: string;\n  pid: string;\n  index: Number;\n}\n\n/**\n * 省市区工具类 -解决列表省市区组件的翻译问题\n */\nclass Area {\n  all: PlainPca[];\n\n  /**\n   * 构造器\n   * @param pcaa\n   */\n  constructor(pcaa?) {\n    if (!pcaa) {\n      pcaa = REGION_DATA;\n    }\n    let arr: PlainPca[] = [];\n    const province = pcaa['86'];\n    Object.keys(province).map((key) => {\n      arr.push({ id: key, text: province[key], pid: '86', index: 1 });\n      const city = pcaa[key];\n      Object.keys(city).map((key2) => {\n        arr.push({ id: key2, text: city[key2], pid: key, index: 2 });\n        const qu = pcaa[key2];\n        if (qu) {\n          Object.keys(qu).map((key3) => {\n            arr.push({ id: key3, text: qu[key3], pid: key2, index: 3 });\n          });\n        }\n      });\n    });\n    this.all = arr;\n  }\n\n  get pca() {\n    return this.all;\n  }\n\n  getCode(text) {\n    if (!text || text.length == 0) {\n      return '';\n    }\n    for (let item of this.all) {\n      if (item.text === text) {\n        return item.id;\n      }\n    }\n  }\n  \n// 代码逻辑说明: [issue/382]省市区组件JAreaLinkage数据不回显---\n  getText(code,index=3) {\n    if (!code || code.length == 0) {\n      return '';\n    }\n    let arr = [];\n    this.getAreaBycode(code, arr, index);\n    return arr.join('/');\n  }\n\n  getRealCode(code) {\n    let arr = [];\n    this.getPcode(code, arr, 3);\n    return arr;\n  }\n\n  getPcode(id, arr, index) {\n    for (let item of this.all) {\n      if (item.id === id && item.index == index) {\n        arr.unshift(id);\n        if (item.pid != '86') {\n          this.getPcode(item.pid, arr, --index);\n        }\n      }\n    }\n  }\n\n  getAreaBycode(code, arr, index) {\n    for (let item of this.all) {\n      if (item.id === code && item.index == index) {\n        arr.unshift(item.text);\n        if (item.pid != '86') {\n          this.getAreaBycode(item.pid, arr, --index);\n        }\n      }\n    }\n  }\n}\nconst jeecgAreaData = new Area();\n\n// 根据code找文本\nconst getAreaTextByCode = function (code) {\n  let index = 3;\n  // 代码逻辑说明: 判断code是否是多code逗号分割的字符串，是的话，获取最后一位的code ---\n  if (code && code.includes(',')) {\n    index = code.split(\",\").length;\n    code = code.substr(code.lastIndexOf(',') + 1);\n  }\n  return jeecgAreaData.getText(code,index);\n};\n\nexport { getAreaTextByCode };\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/utils/GroupRequest.ts",
    "content": "import { getAuthCache, setAuthCache } from '/@/utils/auth';\n/**\n * 将一个请求分组\n *\n * @param getPromise 传入一个可以获取到Promise对象的方法\n * @param groupId 分组ID，如果不传或者为空则不分组\n * @param expire 过期时间，默认 半分钟\n */\nexport function httpGroupRequest(getPromise, groupId, expire = 1000 * 30) {\n  if (groupId == null || groupId === '') {\n    console.log('--------popup----------getFrom  DB-------with---no--groupId ');\n    return getPromise();\n  }\n\n  if (getAuthCache(groupId)) {\n    console.log('---------popup--------getFrom  Cache--------groupId = ' + groupId);\n    return Promise.resolve(getAuthCache(groupId));\n  } else {\n    console.log('--------popup----------getFrom  DB---------groupId = ' + groupId);\n  }\n\n  // 还没有发出请求，就发出第一次的请求\n  return getPromise().then((res) => {\n    setAuthCache(groupId, res);\n    return Promise.resolve(res);\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/utils/areaDataUtil.js",
    "content": "import {pcaa as REGION_DATA} from \"@/utils/areaData/pcaUtils\";\nimport { cloneDeep } from 'lodash-es';\n\n// code转汉字大对象\nconst CodeToText = {};\n// 汉字转code大对象\nconst TextToCode = {};\nconst provinceObject = REGION_DATA['86']; // 省份对象\nconst regionData = [];\nlet provinceAndCityData = [];\n\nCodeToText[''] = '全部';\n\n// 计算省\nfor (const prop in provinceObject) {\n  regionData.push({\n    value: prop, // 省份code值\n    label: provinceObject[prop], // 省份汉字\n  });\n  CodeToText[prop] = provinceObject[prop];\n  TextToCode[provinceObject[prop]] = {\n    code: prop,\n  };\n  TextToCode[provinceObject[prop]]['全部'] = {\n    code: '',\n  };\n}\n// 计算市\nfor (let i = 0, len = regionData.length; i < len; i++) {\n  const provinceCode = regionData[i].value;\n  const provinceText = regionData[i].label;\n  const provinceChildren = [];\n  for (const prop in REGION_DATA[provinceCode]) {\n    provinceChildren.push({\n      value: prop,\n      label: REGION_DATA[provinceCode][prop],\n    });\n    CodeToText[prop] = REGION_DATA[provinceCode][prop];\n    TextToCode[provinceText][REGION_DATA[provinceCode][prop]] = {\n      code: prop,\n    };\n    TextToCode[provinceText][REGION_DATA[provinceCode][prop]]['全部'] = {\n      code: '',\n    };\n  }\n  if (provinceChildren.length) {\n    regionData[i].children = provinceChildren;\n  }\n}\nprovinceAndCityData = cloneDeep(regionData);\n\n// 计算区\nfor (let i = 0, len = regionData.length; i < len; i++) {\n  const province = regionData[i].children;\n  const provinceText = regionData[i].label;\n  if (province) {\n    for (let j = 0, len = province.length; j < len; j++) {\n      const cityCode = province[j].value;\n      const cityText = province[j].label;\n      const cityChildren = [];\n      for (const prop in REGION_DATA[cityCode]) {\n        cityChildren.push({\n          value: prop,\n          label: REGION_DATA[cityCode][prop],\n        });\n        CodeToText[prop] = REGION_DATA[cityCode][prop];\n        TextToCode[provinceText][cityText][REGION_DATA[cityCode][prop]] = {\n          code: prop,\n        };\n      }\n      if (cityChildren.length) {\n        province[j].children = cityChildren;\n      }\n    }\n  }\n}\n\n// 添加“全部”选项\nconst provinceAndCityDataPlus = cloneDeep(provinceAndCityData);\nprovinceAndCityDataPlus.unshift({\n  value: '',\n  label: '全部',\n});\nfor (let i = 0, len = provinceAndCityDataPlus.length; i < len; i++) {\n  const province = provinceAndCityDataPlus[i].children;\n  if (province && province.length) {\n    province.unshift({\n      value: '',\n      label: '全部',\n    });\n    for (let j = 0, len = province.length; j < len; j++) {\n      const city = province[j].children;\n      if (city && city.length) {\n        city.unshift({\n          value: '',\n          label: '全部',\n        });\n      }\n    }\n  }\n}\n\nconst regionDataPlus = cloneDeep(regionData);\nregionDataPlus.unshift({\n  value: '',\n  label: '全部',\n});\nfor (let i = 0, len = regionDataPlus.length; i < len; i++) {\n  const province = regionDataPlus[i].children;\n  if (province && province.length) {\n    province.unshift({\n      value: '',\n      label: '全部',\n    });\n\n    for (let j = 0, len = province.length; j < len; j++) {\n      const city = province[j].children;\n      if (city && city.length) {\n        city.unshift({\n          value: '',\n          label: '全部',\n        });\n      }\n    }\n  }\n}\n//--begin--@updateBy:liusq----date:20210922---for:省市区三级联动需求方法-----\n//省份数据\nconst provinceOptions = [];\nfor (const prop in provinceObject) {\n  provinceOptions.push({\n    value: prop, // 省份code值\n    label: provinceObject[prop], // 省份汉字\n  });\n}\n/**\n * 根据code获取下拉option的数据\n * @param code\n * @returns []\n */\nfunction getDataByCode(code) {\n  let data = [];\n  for (const prop in REGION_DATA[code]) {\n    data.push({\n      value: prop, // 省份code值\n      label: REGION_DATA[code][prop], // 省份汉字\n    });\n  }\n  return data;\n}\n\n/**\n * 获取全部省市区的层级\n * @type {Array}\n */\nconst pca = [];\nObject.keys(provinceObject).map((province) => {\n  pca.push({ id: province, text: provinceObject[province], pid: '86', index: 1 });\n  const cityObject = REGION_DATA[province];\n  Object.keys(cityObject).map((city) => {\n    pca.push({ id: city, text: cityObject[city], pid: province, index: 2 });\n    const areaObject = REGION_DATA[city];\n    if (areaObject) {\n      Object.keys(areaObject).map((area) => {\n        pca.push({ id: area, text: areaObject[area], pid: city, index: 3 });\n      });\n    }\n  });\n});\n\n/**\n * 根据code反推value\n * @param code\n * @param level\n * @returns {Array}\n */\nfunction getRealCode(code, level) {\n  let arr = [];\n  getPcode(code, arr, level);\n  return arr;\n}\nfunction getPcode(id, arr, index) {\n  for (let item of pca) {\n    if (item.id === id && item.index == index) {\n      arr.unshift(id);\n      if (item.pid != '86') {\n        getPcode(item.pid, arr, --index);\n      }\n    }\n  }\n}\n//--end--@updateBy:liusq----date:20210922---for:省市区三级联动需求方法-----\nexport { provinceAndCityData, regionData, provinceAndCityDataPlus, regionDataPlus, getDataByCode, provinceOptions, getRealCode };\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Form/src/utils/formUtils.ts",
    "content": "import { unref } from 'vue';\nimport { dateUtil } from '/@/utils/dateUtil';\n\n/**\n * 表单区间时间数值字段转换\n * @param props\n * @param values\n */\nexport function handleRangeValue(props, values) {\n  //判断是否配置并处理fieldMapToTime\n  const fieldMapToTime = unref(props)?.fieldMapToTime;\n  fieldMapToTime && (values = handleRangeTimeValue(props, values));\n  //判断是否配置并处理fieldMapToNumber\n  const fieldMapToNumber = unref(props)?.fieldMapToNumber;\n  fieldMapToNumber && (values = handleRangeNumberValue(props, values));\n  return values;\n}\n/**\n * 处理时间转换成2个字段\n * @param props\n * @param values\n */\nexport function handleRangeTimeValue(props, values) {\n  const fieldMapToTime = unref(props).fieldMapToTime;\n  if (!fieldMapToTime || !Array.isArray(fieldMapToTime)) {\n    return values;\n  }\n  for (const [field, [startTimeKey, endTimeKey], format = 'YYYY-MM-DD'] of fieldMapToTime) {\n    if (!field || !startTimeKey || !endTimeKey || !values[field]) {\n      continue;\n    }\n\n    // 【issues/I53G9Y】 日期区间组件有可能是字符串\n    let timeValue = values[field];\n    if (!Array.isArray(timeValue)) {\n      timeValue = timeValue.split(',');\n    }\n    const [startTime, endTime]: string[] = timeValue;\n    // 代码逻辑说明: 【issues/7216】当RangePicker组件值允许开始/结束为空时,表单的fieldMapToTime处理异常---\n    startTime && (values[startTimeKey] = dateUtil(startTime).format(format));\n    endTime && (values[endTimeKey] = dateUtil(endTime).format(format));\n    Reflect.deleteProperty(values, field);\n  }\n  return values;\n}\n/**\n * 处理数字转换成2个字段\n * @param props\n * @param values\n * @updateby liusq\n * @updateDate:2021-09-16\n */\nexport function handleRangeNumberValue(props, values) {\n  const fieldMapToNumber = unref(props).fieldMapToNumber;\n  if (!fieldMapToNumber || !Array.isArray(fieldMapToNumber)) {\n    return values;\n  }\n  for (const [field, [startNumberKey, endNumberKey]] of fieldMapToNumber) {\n    if (!field || !startNumberKey || !endNumberKey || !values[field]) {\n      continue;\n    }\n    // 代码逻辑说明: 用于数值的范围查询 数组格式的中间转换不知道哪里出了问题，这里会变成字符串，需要再强制转成数组\n    let temp = values[field];\n    if (typeof temp === 'string') {\n      temp = temp.split(',');\n    }\n    const [startNumber, endNumber]: number[] = temp;\n    values[startNumberKey] = startNumber;\n    values[endNumberKey] = endNumber;\n    Reflect.deleteProperty(values, field);\n  }\n  return values;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Icon/data/icons.data.ts",
    "content": "export default [\n  'ant-design:account-book-filled',\n  'ant-design:account-book-outlined',\n  'ant-design:account-book-twotone',\n  'ant-design:aim-outlined',\n  'ant-design:alert-filled',\n  'ant-design:alert-outlined',\n  'ant-design:alert-twotone',\n  'ant-design:alibaba-outlined',\n  'ant-design:align-center-outlined',\n  'ant-design:align-left-outlined',\n  'ant-design:align-right-outlined',\n  'ant-design:alipay-circle-filled',\n  'ant-design:alipay-circle-outlined',\n  'ant-design:alipay-outlined',\n  'ant-design:alipay-square-filled',\n  'ant-design:aliwangwang-filled',\n  'ant-design:aliwangwang-outlined',\n  'ant-design:aliyun-outlined',\n  'ant-design:amazon-circle-filled',\n  'ant-design:amazon-outlined',\n  'ant-design:amazon-square-filled',\n  'ant-design:android-filled',\n  'ant-design:android-outlined',\n  'ant-design:ant-cloud-outlined',\n  'ant-design:ant-design-outlined',\n  'ant-design:apartment-outlined',\n  'ant-design:api-filled',\n  'ant-design:api-outlined',\n  'ant-design:api-twotone',\n  'ant-design:apple-filled',\n  'ant-design:apple-outlined',\n  'ant-design:appstore-add-outlined',\n  'ant-design:appstore-filled',\n  'ant-design:appstore-outlined',\n  'ant-design:appstore-twotone',\n  'ant-design:area-chart-outlined',\n  'ant-design:arrow-down-outlined',\n  'ant-design:arrow-left-outlined',\n  'ant-design:arrow-right-outlined',\n  'ant-design:arrow-up-outlined',\n  'ant-design:arrows-alt-outlined',\n  'ant-design:audio-filled',\n  'ant-design:audio-muted-outlined',\n  'ant-design:audio-outlined',\n  'ant-design:audio-twotone',\n  'ant-design:audit-outlined',\n  'ant-design:backward-filled',\n  'ant-design:backward-outlined',\n  'ant-design:bank-filled',\n  'ant-design:bank-outlined',\n  'ant-design:bank-twotone',\n  'ant-design:bar-chart-outlined',\n  'ant-design:barcode-outlined',\n  'ant-design:bars-outlined',\n  'ant-design:behance-circle-filled',\n  'ant-design:behance-outlined',\n  'ant-design:behance-square-filled',\n  'ant-design:behance-square-outlined',\n  'ant-design:bell-filled',\n  'ant-design:bell-outlined',\n  'ant-design:bell-twotone',\n  'ant-design:bg-colors-outlined',\n  'ant-design:block-outlined',\n  'ant-design:bold-outlined',\n  'ant-design:book-filled',\n  'ant-design:book-outlined',\n  'ant-design:book-twotone',\n  'ant-design:border-bottom-outlined',\n  'ant-design:border-horizontal-outlined',\n  'ant-design:border-inner-outlined',\n  'ant-design:border-left-outlined',\n  'ant-design:border-outer-outlined',\n  'ant-design:border-outlined',\n  'ant-design:border-right-outlined',\n  'ant-design:border-top-outlined',\n  'ant-design:border-verticle-outlined',\n  'ant-design:borderless-table-outlined',\n  'ant-design:box-plot-filled',\n  'ant-design:box-plot-outlined',\n  'ant-design:box-plot-twotone',\n  'ant-design:branches-outlined',\n  'ant-design:bug-filled',\n  'ant-design:bug-outlined',\n  'ant-design:bug-twotone',\n  'ant-design:build-filled',\n  'ant-design:build-outlined',\n  'ant-design:build-twotone',\n  'ant-design:bulb-filled',\n  'ant-design:bulb-outlined',\n  'ant-design:bulb-twotone',\n  'ant-design:calculator-filled',\n  'ant-design:calculator-outlined',\n  'ant-design:calculator-twotone',\n  'ant-design:calendar-filled',\n  'ant-design:calendar-outlined',\n  'ant-design:calendar-twotone',\n  'ant-design:camera-filled',\n  'ant-design:camera-outlined',\n  'ant-design:camera-twotone',\n  'ant-design:car-filled',\n  'ant-design:car-outlined',\n  'ant-design:car-twotone',\n  'ant-design:caret-down-filled',\n  'ant-design:caret-down-outlined',\n  'ant-design:caret-left-filled',\n  'ant-design:caret-left-outlined',\n  'ant-design:caret-right-filled',\n  'ant-design:caret-right-outlined',\n  'ant-design:caret-up-filled',\n  'ant-design:caret-up-outlined',\n  'ant-design:carry-out-filled',\n  'ant-design:carry-out-outlined',\n  'ant-design:carry-out-twotone',\n  'ant-design:check-circle-filled',\n  'ant-design:check-circle-outlined',\n  'ant-design:check-circle-twotone',\n  'ant-design:check-outlined',\n  'ant-design:check-square-filled',\n  'ant-design:check-square-outlined',\n  'ant-design:check-square-twotone',\n  'ant-design:chrome-filled',\n  'ant-design:chrome-outlined',\n  'ant-design:ci-circle-filled',\n  'ant-design:ci-circle-outlined',\n  'ant-design:ci-circle-twotone',\n  'ant-design:ci-outlined',\n  'ant-design:ci-twotone',\n  'ant-design:clear-outlined',\n  'ant-design:clock-circle-filled',\n  'ant-design:clock-circle-outlined',\n  'ant-design:clock-circle-twotone',\n  'ant-design:close-circle-filled',\n  'ant-design:close-circle-outlined',\n  'ant-design:close-circle-twotone',\n  'ant-design:close-outlined',\n  'ant-design:close-square-filled',\n  'ant-design:close-square-outlined',\n  'ant-design:close-square-twotone',\n  'ant-design:cloud-download-outlined',\n  'ant-design:cloud-filled',\n  'ant-design:cloud-outlined',\n  'ant-design:cloud-server-outlined',\n  'ant-design:cloud-sync-outlined',\n  'ant-design:cloud-twotone',\n  'ant-design:cloud-upload-outlined',\n  'ant-design:cluster-outlined',\n  'ant-design:code-filled',\n  'ant-design:code-outlined',\n  'ant-design:code-sandbox-circle-filled',\n  'ant-design:code-sandbox-outlined',\n  'ant-design:code-sandbox-square-filled',\n  'ant-design:code-twotone',\n  'ant-design:codepen-circle-filled',\n  'ant-design:codepen-circle-outlined',\n  'ant-design:codepen-outlined',\n  'ant-design:codepen-square-filled',\n  'ant-design:coffee-outlined',\n  'ant-design:column-height-outlined',\n  'ant-design:column-width-outlined',\n  'ant-design:comment-outlined',\n  'ant-design:compass-filled',\n  'ant-design:compass-outlined',\n  'ant-design:compass-twotone',\n  'ant-design:compress-outlined',\n  'ant-design:console-sql-outlined',\n  'ant-design:contacts-filled',\n  'ant-design:contacts-outlined',\n  'ant-design:contacts-twotone',\n  'ant-design:container-filled',\n  'ant-design:container-outlined',\n  'ant-design:container-twotone',\n  'ant-design:control-filled',\n  'ant-design:control-outlined',\n  'ant-design:control-twotone',\n  'ant-design:copy-filled',\n  'ant-design:copy-outlined',\n  'ant-design:copy-twotone',\n  'ant-design:copyright-circle-filled',\n  'ant-design:copyright-circle-outlined',\n  'ant-design:copyright-circle-twotone',\n  'ant-design:copyright-outlined',\n  'ant-design:copyright-twotone',\n  'ant-design:credit-card-filled',\n  'ant-design:credit-card-outlined',\n  'ant-design:credit-card-twotone',\n  'ant-design:crown-filled',\n  'ant-design:crown-outlined',\n  'ant-design:crown-twotone',\n  'ant-design:customer-service-filled',\n  'ant-design:customer-service-outlined',\n  'ant-design:customer-service-twotone',\n  'ant-design:dash-outlined',\n  'ant-design:dashboard-filled',\n  'ant-design:dashboard-outlined',\n  'ant-design:dashboard-twotone',\n  'ant-design:database-filled',\n  'ant-design:database-outlined',\n  'ant-design:database-twotone',\n  'ant-design:delete-column-outlined',\n  'ant-design:delete-filled',\n  'ant-design:delete-outlined',\n  'ant-design:delete-row-outlined',\n  'ant-design:delete-twotone',\n  'ant-design:delivered-procedure-outlined',\n  'ant-design:deployment-unit-outlined',\n  'ant-design:desktop-outlined',\n  'ant-design:diff-filled',\n  'ant-design:diff-outlined',\n  'ant-design:diff-twotone',\n  'ant-design:dingding-outlined',\n  'ant-design:dingtalk-circle-filled',\n  'ant-design:dingtalk-outlined',\n  'ant-design:dingtalk-square-filled',\n  'ant-design:disconnect-outlined',\n  'ant-design:dislike-filled',\n  'ant-design:dislike-outlined',\n  'ant-design:dislike-twotone',\n  'ant-design:dollar-circle-filled',\n  'ant-design:dollar-circle-outlined',\n  'ant-design:dollar-circle-twotone',\n  'ant-design:dollar-outlined',\n  'ant-design:dollar-twotone',\n  'ant-design:dot-chart-outlined',\n  'ant-design:double-left-outlined',\n  'ant-design:double-right-outlined',\n  'ant-design:down-circle-filled',\n  'ant-design:down-circle-outlined',\n  'ant-design:down-circle-twotone',\n  'ant-design:down-outlined',\n  'ant-design:down-square-filled',\n  'ant-design:down-square-outlined',\n  'ant-design:down-square-twotone',\n  'ant-design:download-outlined',\n  'ant-design:drag-outlined',\n  'ant-design:dribbble-circle-filled',\n  'ant-design:dribbble-outlined',\n  'ant-design:dribbble-square-filled',\n  'ant-design:dribbble-square-outlined',\n  'ant-design:dropbox-circle-filled',\n  'ant-design:dropbox-outlined',\n  'ant-design:dropbox-square-filled',\n  'ant-design:edit-filled',\n  'ant-design:edit-outlined',\n  'ant-design:edit-twotone',\n  'ant-design:ellipsis-outlined',\n  'ant-design:enter-outlined',\n  'ant-design:environment-filled',\n  'ant-design:environment-outlined',\n  'ant-design:environment-twotone',\n  'ant-design:euro-circle-filled',\n  'ant-design:euro-circle-outlined',\n  'ant-design:euro-circle-twotone',\n  'ant-design:euro-outlined',\n  'ant-design:euro-twotone',\n  'ant-design:exception-outlined',\n  'ant-design:exclamation-circle-filled',\n  'ant-design:exclamation-circle-outlined',\n  'ant-design:exclamation-circle-twotone',\n  'ant-design:exclamation-outlined',\n  'ant-design:expand-alt-outlined',\n  'ant-design:expand-outlined',\n  'ant-design:experiment-filled',\n  'ant-design:experiment-outlined',\n  'ant-design:experiment-twotone',\n  'ant-design:export-outlined',\n  'ant-design:eye-filled',\n  'ant-design:eye-invisible-filled',\n  'ant-design:eye-invisible-outlined',\n  'ant-design:eye-invisible-twotone',\n  'ant-design:eye-outlined',\n  'ant-design:eye-twotone',\n  'ant-design:facebook-filled',\n  'ant-design:facebook-outlined',\n  'ant-design:fall-outlined',\n  'ant-design:fast-backward-filled',\n  'ant-design:fast-backward-outlined',\n  'ant-design:fast-forward-filled',\n  'ant-design:fast-forward-outlined',\n  'ant-design:field-binary-outlined',\n  'ant-design:field-number-outlined',\n  'ant-design:field-string-outlined',\n  'ant-design:field-time-outlined',\n  'ant-design:file-add-filled',\n  'ant-design:file-add-outlined',\n  'ant-design:file-add-twotone',\n  'ant-design:file-done-outlined',\n  'ant-design:file-excel-filled',\n  'ant-design:file-excel-outlined',\n  'ant-design:file-excel-twotone',\n  'ant-design:file-exclamation-filled',\n  'ant-design:file-exclamation-outlined',\n  'ant-design:file-exclamation-twotone',\n  'ant-design:file-filled',\n  'ant-design:file-gif-outlined',\n  'ant-design:file-image-filled',\n  'ant-design:file-image-outlined',\n  'ant-design:file-image-twotone',\n  'ant-design:file-jpg-outlined',\n  'ant-design:file-markdown-filled',\n  'ant-design:file-markdown-outlined',\n  'ant-design:file-markdown-twotone',\n  'ant-design:file-outlined',\n  'ant-design:file-pdf-filled',\n  'ant-design:file-pdf-outlined',\n  'ant-design:file-pdf-twotone',\n  'ant-design:file-ppt-filled',\n  'ant-design:file-ppt-outlined',\n  'ant-design:file-ppt-twotone',\n  'ant-design:file-protect-outlined',\n  'ant-design:file-search-outlined',\n  'ant-design:file-sync-outlined',\n  'ant-design:file-text-filled',\n  'ant-design:file-text-outlined',\n  'ant-design:file-text-twotone',\n  'ant-design:file-twotone',\n  'ant-design:file-unknown-filled',\n  'ant-design:file-unknown-outlined',\n  'ant-design:file-unknown-twotone',\n  'ant-design:file-word-filled',\n  'ant-design:file-word-outlined',\n  'ant-design:file-word-twotone',\n  'ant-design:file-zip-filled',\n  'ant-design:file-zip-outlined',\n  'ant-design:file-zip-twotone',\n  'ant-design:filter-filled',\n  'ant-design:filter-outlined',\n  'ant-design:filter-twotone',\n  'ant-design:fire-filled',\n  'ant-design:fire-outlined',\n  'ant-design:fire-twotone',\n  'ant-design:flag-filled',\n  'ant-design:flag-outlined',\n  'ant-design:flag-twotone',\n  'ant-design:folder-add-filled',\n  'ant-design:folder-add-outlined',\n  'ant-design:folder-add-twotone',\n  'ant-design:folder-filled',\n  'ant-design:folder-open-filled',\n  'ant-design:folder-open-outlined',\n  'ant-design:folder-open-twotone',\n  'ant-design:folder-outlined',\n  'ant-design:folder-twotone',\n  'ant-design:folder-view-outlined',\n  'ant-design:font-colors-outlined',\n  'ant-design:font-size-outlined',\n  'ant-design:fork-outlined',\n  'ant-design:form-outlined',\n  'ant-design:format-painter-filled',\n  'ant-design:format-painter-outlined',\n  'ant-design:forward-filled',\n  'ant-design:forward-outlined',\n  'ant-design:frown-filled',\n  'ant-design:frown-outlined',\n  'ant-design:frown-twotone',\n  'ant-design:fullscreen-exit-outlined',\n  'ant-design:fullscreen-outlined',\n  'ant-design:function-outlined',\n  'ant-design:fund-filled',\n  'ant-design:fund-outlined',\n  'ant-design:fund-projection-screen-outlined',\n  'ant-design:fund-twotone',\n  'ant-design:fund-view-outlined',\n  'ant-design:funnel-plot-filled',\n  'ant-design:funnel-plot-outlined',\n  'ant-design:funnel-plot-twotone',\n  'ant-design:gateway-outlined',\n  'ant-design:gif-outlined',\n  'ant-design:gift-filled',\n  'ant-design:gift-outlined',\n  'ant-design:gift-twotone',\n  'ant-design:github-filled',\n  'ant-design:github-outlined',\n  'ant-design:gitlab-filled',\n  'ant-design:gitlab-outlined',\n  'ant-design:global-outlined',\n  'ant-design:gold-filled',\n  'ant-design:gold-outlined',\n  'ant-design:gold-twotone',\n  'ant-design:golden-filled',\n  'ant-design:google-circle-filled',\n  'ant-design:google-outlined',\n  'ant-design:google-plus-circle-filled',\n  'ant-design:google-plus-outlined',\n  'ant-design:google-plus-square-filled',\n  'ant-design:google-square-filled',\n  'ant-design:group-outlined',\n  'ant-design:hdd-filled',\n  'ant-design:hdd-outlined',\n  'ant-design:hdd-twotone',\n  'ant-design:heart-filled',\n  'ant-design:heart-outlined',\n  'ant-design:heart-twotone',\n  'ant-design:heat-map-outlined',\n  'ant-design:highlight-filled',\n  'ant-design:highlight-outlined',\n  'ant-design:highlight-twotone',\n  'ant-design:history-outlined',\n  'ant-design:holder-outlined',\n  'ant-design:home-filled',\n  'ant-design:home-outlined',\n  'ant-design:home-twotone',\n  'ant-design:hourglass-filled',\n  'ant-design:hourglass-outlined',\n  'ant-design:hourglass-twotone',\n  'ant-design:html5-filled',\n  'ant-design:html5-outlined',\n  'ant-design:html5-twotone',\n  'ant-design:idcard-filled',\n  'ant-design:idcard-outlined',\n  'ant-design:idcard-twotone',\n  'ant-design:ie-circle-filled',\n  'ant-design:ie-outlined',\n  'ant-design:ie-square-filled',\n  'ant-design:import-outlined',\n  'ant-design:inbox-outlined',\n  'ant-design:info-circle-filled',\n  'ant-design:info-circle-outlined',\n  'ant-design:info-circle-twotone',\n  'ant-design:info-outlined',\n  'ant-design:insert-row-above-outlined',\n  'ant-design:insert-row-below-outlined',\n  'ant-design:insert-row-left-outlined',\n  'ant-design:insert-row-right-outlined',\n  'ant-design:instagram-filled',\n  'ant-design:instagram-outlined',\n  'ant-design:insurance-filled',\n  'ant-design:insurance-outlined',\n  'ant-design:insurance-twotone',\n  'ant-design:interaction-filled',\n  'ant-design:interaction-outlined',\n  'ant-design:interaction-twotone',\n  'ant-design:issues-close-outlined',\n  'ant-design:italic-outlined',\n  'ant-design:key-outlined',\n  'ant-design:laptop-outlined',\n  'ant-design:layout-filled',\n  'ant-design:layout-outlined',\n  'ant-design:layout-twotone',\n  'ant-design:left-circle-filled',\n  'ant-design:left-circle-outlined',\n  'ant-design:left-circle-twotone',\n  'ant-design:left-outlined',\n  'ant-design:left-square-filled',\n  'ant-design:left-square-outlined',\n  'ant-design:left-square-twotone',\n  'ant-design:like-filled',\n  'ant-design:like-outlined',\n  'ant-design:like-twotone',\n  'ant-design:line-chart-outlined',\n  'ant-design:line-height-outlined',\n  'ant-design:line-outlined',\n  'ant-design:link-outlined',\n  'ant-design:linkedin-filled',\n  'ant-design:linkedin-outlined',\n  'ant-design:loading-3-quarters-outlined',\n  'ant-design:loading-outlined',\n  'ant-design:lock-filled',\n  'ant-design:lock-outlined',\n  'ant-design:lock-twotone',\n  'ant-design:login-outlined',\n  'ant-design:logout-outlined',\n  'ant-design:mac-command-filled',\n  'ant-design:mac-command-outlined',\n  'ant-design:mail-filled',\n  'ant-design:mail-outlined',\n  'ant-design:mail-twotone',\n  'ant-design:man-outlined',\n  'ant-design:medicine-box-filled',\n  'ant-design:medicine-box-outlined',\n  'ant-design:medicine-box-twotone',\n  'ant-design:medium-circle-filled',\n  'ant-design:medium-outlined',\n  'ant-design:medium-square-filled',\n  'ant-design:medium-workmark-outlined',\n  'ant-design:meh-filled',\n  'ant-design:meh-outlined',\n  'ant-design:meh-twotone',\n  'ant-design:menu-fold-outlined',\n  'ant-design:menu-outlined',\n  'ant-design:menu-unfold-outlined',\n  'ant-design:merge-cells-outlined',\n  'ant-design:message-filled',\n  'ant-design:message-outlined',\n  'ant-design:message-twotone',\n  'ant-design:minus-circle-filled',\n  'ant-design:minus-circle-outlined',\n  'ant-design:minus-circle-twotone',\n  'ant-design:minus-outlined',\n  'ant-design:minus-square-filled',\n  'ant-design:minus-square-outlined',\n  'ant-design:minus-square-twotone',\n  'ant-design:mobile-filled',\n  'ant-design:mobile-outlined',\n  'ant-design:mobile-twotone',\n  'ant-design:money-collect-filled',\n  'ant-design:money-collect-outlined',\n  'ant-design:money-collect-twotone',\n  'ant-design:monitor-outlined',\n  'ant-design:more-outlined',\n  'ant-design:node-collapse-outlined',\n  'ant-design:node-expand-outlined',\n  'ant-design:node-index-outlined',\n  'ant-design:notification-filled',\n  'ant-design:notification-outlined',\n  'ant-design:notification-twotone',\n  'ant-design:number-outlined',\n  'ant-design:one-to-one-outlined',\n  'ant-design:ordered-list-outlined',\n  'ant-design:paper-clip-outlined',\n  'ant-design:partition-outlined',\n  'ant-design:pause-circle-filled',\n  'ant-design:pause-circle-outlined',\n  'ant-design:pause-circle-twotone',\n  'ant-design:pause-outlined',\n  'ant-design:pay-circle-filled',\n  'ant-design:pay-circle-outlined',\n  'ant-design:percentage-outlined',\n  'ant-design:phone-filled',\n  'ant-design:phone-outlined',\n  'ant-design:phone-twotone',\n  'ant-design:pic-center-outlined',\n  'ant-design:pic-left-outlined',\n  'ant-design:pic-right-outlined',\n  'ant-design:picture-filled',\n  'ant-design:picture-outlined',\n  'ant-design:picture-twotone',\n  'ant-design:pie-chart-filled',\n  'ant-design:pie-chart-outlined',\n  'ant-design:pie-chart-twotone',\n  'ant-design:play-circle-filled',\n  'ant-design:play-circle-outlined',\n  'ant-design:play-circle-twotone',\n  'ant-design:play-square-filled',\n  'ant-design:play-square-outlined',\n  'ant-design:play-square-twotone',\n  'ant-design:plus-circle-filled',\n  'ant-design:plus-circle-outlined',\n  'ant-design:plus-circle-twotone',\n  'ant-design:plus-outlined',\n  'ant-design:plus-square-filled',\n  'ant-design:plus-square-outlined',\n  'ant-design:plus-square-twotone',\n  'ant-design:pound-circle-filled',\n  'ant-design:pound-circle-outlined',\n  'ant-design:pound-circle-twotone',\n  'ant-design:pound-outlined',\n  'ant-design:poweroff-outlined',\n  'ant-design:printer-filled',\n  'ant-design:printer-outlined',\n  'ant-design:printer-twotone',\n  'ant-design:profile-filled',\n  'ant-design:profile-outlined',\n  'ant-design:profile-twotone',\n  'ant-design:project-filled',\n  'ant-design:project-outlined',\n  'ant-design:project-twotone',\n  'ant-design:property-safety-filled',\n  'ant-design:property-safety-outlined',\n  'ant-design:property-safety-twotone',\n  'ant-design:pull-request-outlined',\n  'ant-design:pushpin-filled',\n  'ant-design:pushpin-outlined',\n  'ant-design:pushpin-twotone',\n  'ant-design:qq-circle-filled',\n  'ant-design:qq-outlined',\n  'ant-design:qq-square-filled',\n  'ant-design:qrcode-outlined',\n  'ant-design:question-circle-filled',\n  'ant-design:question-circle-outlined',\n  'ant-design:question-circle-twotone',\n  'ant-design:question-outlined',\n  'ant-design:radar-chart-outlined',\n  'ant-design:radius-bottomleft-outlined',\n  'ant-design:radius-bottomright-outlined',\n  'ant-design:radius-setting-outlined',\n  'ant-design:radius-upleft-outlined',\n  'ant-design:radius-upright-outlined',\n  'ant-design:read-filled',\n  'ant-design:read-outlined',\n  'ant-design:reconciliation-filled',\n  'ant-design:reconciliation-outlined',\n  'ant-design:reconciliation-twotone',\n  'ant-design:red-envelope-filled',\n  'ant-design:red-envelope-outlined',\n  'ant-design:red-envelope-twotone',\n  'ant-design:reddit-circle-filled',\n  'ant-design:reddit-outlined',\n  'ant-design:reddit-square-filled',\n  'ant-design:redo-outlined',\n  'ant-design:reload-outlined',\n  'ant-design:rest-filled',\n  'ant-design:rest-outlined',\n  'ant-design:rest-twotone',\n  'ant-design:retweet-outlined',\n  'ant-design:right-circle-filled',\n  'ant-design:right-circle-outlined',\n  'ant-design:right-circle-twotone',\n  'ant-design:right-outlined',\n  'ant-design:right-square-filled',\n  'ant-design:right-square-outlined',\n  'ant-design:right-square-twotone',\n  'ant-design:rise-outlined',\n  'ant-design:robot-filled',\n  'ant-design:robot-outlined',\n  'ant-design:rocket-filled',\n  'ant-design:rocket-outlined',\n  'ant-design:rocket-twotone',\n  'ant-design:rollback-outlined',\n  'ant-design:rotate-left-outlined',\n  'ant-design:rotate-right-outlined',\n  'ant-design:safety-certificate-filled',\n  'ant-design:safety-certificate-outlined',\n  'ant-design:safety-certificate-twotone',\n  'ant-design:safety-outlined',\n  'ant-design:save-filled',\n  'ant-design:save-outlined',\n  'ant-design:save-twotone',\n  'ant-design:scan-outlined',\n  'ant-design:schedule-filled',\n  'ant-design:schedule-outlined',\n  'ant-design:schedule-twotone',\n  'ant-design:scissor-outlined',\n  'ant-design:search-outlined',\n  'ant-design:security-scan-filled',\n  'ant-design:security-scan-outlined',\n  'ant-design:security-scan-twotone',\n  'ant-design:select-outlined',\n  'ant-design:send-outlined',\n  'ant-design:setting-filled',\n  'ant-design:setting-outlined',\n  'ant-design:setting-twotone',\n  'ant-design:shake-outlined',\n  'ant-design:share-alt-outlined',\n  'ant-design:shop-filled',\n  'ant-design:shop-outlined',\n  'ant-design:shop-twotone',\n  'ant-design:shopping-cart-outlined',\n  'ant-design:shopping-filled',\n  'ant-design:shopping-outlined',\n  'ant-design:shopping-twotone',\n  'ant-design:shrink-outlined',\n  'ant-design:signal-filled',\n  'ant-design:sisternode-outlined',\n  'ant-design:sketch-circle-filled',\n  'ant-design:sketch-outlined',\n  'ant-design:sketch-square-filled',\n  'ant-design:skin-filled',\n  'ant-design:skin-outlined',\n  'ant-design:skin-twotone',\n  'ant-design:skype-filled',\n  'ant-design:skype-outlined',\n  'ant-design:slack-circle-filled',\n  'ant-design:slack-outlined',\n  'ant-design:slack-square-filled',\n  'ant-design:slack-square-outlined',\n  'ant-design:sliders-filled',\n  'ant-design:sliders-outlined',\n  'ant-design:sliders-twotone',\n  'ant-design:small-dash-outlined',\n  'ant-design:smile-filled',\n  'ant-design:smile-outlined',\n  'ant-design:smile-twotone',\n  'ant-design:snippets-filled',\n  'ant-design:snippets-outlined',\n  'ant-design:snippets-twotone',\n  'ant-design:solution-outlined',\n  'ant-design:sort-ascending-outlined',\n  'ant-design:sort-descending-outlined',\n  'ant-design:sound-filled',\n  'ant-design:sound-outlined',\n  'ant-design:sound-twotone',\n  'ant-design:split-cells-outlined',\n  'ant-design:star-filled',\n  'ant-design:star-outlined',\n  'ant-design:star-twotone',\n  'ant-design:step-backward-filled',\n  'ant-design:step-backward-outlined',\n  'ant-design:step-forward-filled',\n  'ant-design:step-forward-outlined',\n  'ant-design:stock-outlined',\n  'ant-design:stop-filled',\n  'ant-design:stop-outlined',\n  'ant-design:stop-twotone',\n  'ant-design:strikethrough-outlined',\n  'ant-design:subnode-outlined',\n  'ant-design:swap-left-outlined',\n  'ant-design:swap-outlined',\n  'ant-design:swap-right-outlined',\n  'ant-design:switcher-filled',\n  'ant-design:switcher-outlined',\n  'ant-design:switcher-twotone',\n  'ant-design:sync-outlined',\n  'ant-design:table-outlined',\n  'ant-design:tablet-filled',\n  'ant-design:tablet-outlined',\n  'ant-design:tablet-twotone',\n  'ant-design:tag-filled',\n  'ant-design:tag-outlined',\n  'ant-design:tag-twotone',\n  'ant-design:tags-filled',\n  'ant-design:tags-outlined',\n  'ant-design:tags-twotone',\n  'ant-design:taobao-circle-filled',\n  'ant-design:taobao-circle-outlined',\n  'ant-design:taobao-outlined',\n  'ant-design:taobao-square-filled',\n  'ant-design:team-outlined',\n  'ant-design:thunderbolt-filled',\n  'ant-design:thunderbolt-outlined',\n  'ant-design:thunderbolt-twotone',\n  'ant-design:to-top-outlined',\n  'ant-design:tool-filled',\n  'ant-design:tool-outlined',\n  'ant-design:tool-twotone',\n  'ant-design:trademark-circle-filled',\n  'ant-design:trademark-circle-outlined',\n  'ant-design:trademark-circle-twotone',\n  'ant-design:trademark-outlined',\n  'ant-design:transaction-outlined',\n  'ant-design:translation-outlined',\n  'ant-design:trophy-filled',\n  'ant-design:trophy-outlined',\n  'ant-design:trophy-twotone',\n  'ant-design:twitter-circle-filled',\n  'ant-design:twitter-outlined',\n  'ant-design:twitter-square-filled',\n  'ant-design:underline-outlined',\n  'ant-design:undo-outlined',\n  'ant-design:ungroup-outlined',\n  'ant-design:unlock-filled',\n  'ant-design:unlock-outlined',\n  'ant-design:unlock-twotone',\n  'ant-design:unordered-list-outlined',\n  'ant-design:up-circle-filled',\n  'ant-design:up-circle-outlined',\n  'ant-design:up-circle-twotone',\n  'ant-design:up-outlined',\n  'ant-design:up-square-filled',\n  'ant-design:up-square-outlined',\n  'ant-design:up-square-twotone',\n  'ant-design:upload-outlined',\n  'ant-design:usb-filled',\n  'ant-design:usb-outlined',\n  'ant-design:usb-twotone',\n  'ant-design:user-add-outlined',\n  'ant-design:user-delete-outlined',\n  'ant-design:user-outlined',\n  'ant-design:user-switch-outlined',\n  'ant-design:usergroup-add-outlined',\n  'ant-design:usergroup-delete-outlined',\n  'ant-design:verified-outlined',\n  'ant-design:vertical-align-bottom-outlined',\n  'ant-design:vertical-align-middle-outlined',\n  'ant-design:vertical-align-top-outlined',\n  'ant-design:vertical-left-outlined',\n  'ant-design:vertical-right-outlined',\n  'ant-design:video-camera-add-outlined',\n  'ant-design:video-camera-filled',\n  'ant-design:video-camera-outlined',\n  'ant-design:video-camera-twotone',\n  'ant-design:wallet-filled',\n  'ant-design:wallet-outlined',\n  'ant-design:wallet-twotone',\n  'ant-design:warning-filled',\n  'ant-design:warning-outlined',\n  'ant-design:warning-twotone',\n  'ant-design:wechat-filled',\n  'ant-design:wechat-outlined',\n  'ant-design:weibo-circle-filled',\n  'ant-design:weibo-circle-outlined',\n  'ant-design:weibo-outlined',\n  'ant-design:weibo-square-filled',\n  'ant-design:weibo-square-outlined',\n  'ant-design:whats-app-outlined',\n  'ant-design:wifi-outlined',\n  'ant-design:windows-filled',\n  'ant-design:windows-outlined',\n  'ant-design:woman-outlined',\n  'ant-design:yahoo-filled',\n  'ant-design:yahoo-outlined',\n  'ant-design:youtube-filled',\n  'ant-design:youtube-outlined',\n  'ant-design:yuque-filled',\n  'ant-design:yuque-outlined',\n  'ant-design:zhihu-circle-filled',\n  'ant-design:zhihu-outlined',\n  'ant-design:zhihu-square-filled',\n  'ant-design:zoom-in-outlined',\n  'ant-design:zoom-out-outlined',\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Icon/index.ts",
    "content": "import Icon from './src/Icon.vue';\nimport SvgIcon from './src/SvgIcon.vue';\nimport IconPicker from './src/IconPicker.vue';\n\nexport { Icon, IconPicker, SvgIcon };\n\nexport default Icon;\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Icon/src/Icon.vue",
    "content": "<template>\n  <SvgIcon :size=\"size\" :name=\"getSvgIcon\" v-if=\"isSvgIcon\" :class=\"[$attrs.class, 'anticon']\" :spin=\"spin\" />\n  <span v-else ref=\"elRef\" :class=\"[$attrs.class, 'app-iconify anticon', spin && 'app-iconify-spin']\" :style=\"getWrapStyle\"></span>\n</template>\n<script lang=\"ts\">\n  import type { PropType } from 'vue';\n  import { defineComponent, ref, watch, onMounted, nextTick, unref, computed, CSSProperties } from 'vue';\n  import SvgIcon from './SvgIcon.vue';\n  import Iconify from '@purge-icons/generated';\n  import { isString } from '/@/utils/is';\n  import { propTypes } from '/@/utils/propTypes';\n\n  const SVG_END_WITH_FLAG = '|svg';\n  export default defineComponent({\n    name: 'Icon',\n    components: { SvgIcon },\n    props: {\n      // icon name\n      icon: propTypes.string,\n      // icon color\n      color: propTypes.string,\n      // icon size\n      size: {\n        type: [String, Number] as PropType<string | number>,\n        default: 16,\n      },\n      spin: propTypes.bool.def(false),\n      prefix: propTypes.string.def(''),\n    },\n    setup(props) {\n      const elRef = ref<ElRef>(null);\n\n      const isSvgIcon = computed(() => props.icon?.endsWith(SVG_END_WITH_FLAG));\n      const getSvgIcon = computed(() => props.icon.replace(SVG_END_WITH_FLAG, ''));\n      const getIconRef = computed(() => `${props.prefix ? props.prefix + ':' : ''}${props.icon}`);\n\n      const update = async () => {\n        if (unref(isSvgIcon)) return;\n\n        const el = unref(elRef);\n        if (!el) return;\n\n        await nextTick();\n        const icon = unref(getIconRef);\n        if (!icon) return;\n\n        const svg = Iconify.renderSVG(icon, {});\n        if (svg) {\n          el.textContent = '';\n          el.appendChild(svg);\n        } else {\n          const span = document.createElement('span');\n          span.className = 'iconify';\n          span.dataset.icon = icon;\n          el.textContent = '';\n          el.appendChild(span);\n        }\n      };\n\n      const getWrapStyle = computed((): CSSProperties => {\n        const { size, color } = props;\n        let fs = size;\n        if (isString(size)) {\n          fs = parseInt(size, 10);\n        }\n\n        return {\n          fontSize: `${fs}px`,\n          color: color,\n          display: 'inline-flex',\n        };\n      });\n\n      watch(() => props.icon, update, { flush: 'post' });\n\n      onMounted(update);\n\n      return { elRef, getWrapStyle, isSvgIcon, getSvgIcon };\n    },\n  });\n</script>\n<style lang=\"less\">\n  .app-iconify {\n    display: inline-block;\n    // vertical-align: middle;\n\n    &-spin {\n      svg {\n        animation: loadingCircle 1s infinite linear;\n      }\n    }\n  }\n\n  span.iconify {\n    display: block;\n    min-width: 1em;\n    min-height: 1em;\n    background-color: @iconify-bg-color;\n    border-radius: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Icon/src/IconList.vue",
    "content": "<template>\n  <div class=\"flex justify-between ml-4 mr-5 mb-1\" v-if=\"isSearch\">\n    <a-input :placeholder=\"t('component.icon.search')\" v-model:value=\"searchIconValue\" @change=\"debounceHandleSearchChange\" allowClear />\n  </div>\n  <div v-if=\"getPaginationList.length > 0\">\n    <div class=\"overflow-auto\">\n      <ul class=\"px-2 icon-list\" style=\"padding-right: 0\">\n        <li\n          v-for=\"icon in getPaginationList\"\n          :key=\"icon\"\n          :class=\"currentSelect === icon ? 'icon-border' : ''\"\n          class=\"p-2 w-1/8 cursor-pointer mr-1 mt-1 flex justify-center items-center border border-solid hover:border-primary\"\n          @click=\"handleClick(icon)\"\n          :title=\"icon\"\n        >\n          <SvgIcon v-if=\"isSvgMode\" :name=\"icon\" />\n          <Icon :icon=\"icon\" v-else />\n        </li>\n      </ul>\n    </div>\n    <div class=\"flex py-2 items-center justify-content-right mr-10 mt-5\" v-if=\"getTotal >= pageSize && isPage\">\n      <Pagination\n        showLessItems\n        v-model:current=\"current\"\n        :page-size-options=\"pageSizeOptions\"\n        size=\"small\"\n        v-model:pageSize=\"pageSize\"\n        v-model:total=\"getTotal\"\n        @change=\"handlePageChange\"\n      />\n    </div>\n  </div>\n  <template v-else\n    ><div class=\"p-5\"><empty /></div>\n  </template>\n</template>\n\n<script lang=\"ts\" name=\"icon-list\">\n  import SvgIcon from '@/components/Icon/src/SvgIcon.vue';\n  import Icon from '@/components/Icon/src/Icon.vue';\n  import { defineComponent, ref, unref, watchEffect} from 'vue';\n  import { useDebounceFn } from '@vueuse/core';\n  import { usePagination } from '@/hooks/web/usePagination';\n  import { propTypes } from '@/utils/propTypes';\n  import { useCopyToClipboard } from '@/hooks/web/useCopyToClipboard';\n  import { useI18n } from '@/hooks/web/useI18n';\n  import { useMessage } from '@/hooks/web/useMessage';\n  import { Empty, Pagination } from 'ant-design-vue';\n  export default defineComponent({\n    components: {\n      SvgIcon,\n      Icon,\n      Empty,\n      Pagination,\n    },\n    emits: ['update:value'],\n    props: {\n      currentList: propTypes.any.def([]),\n      clearSelect: propTypes.bool.def(false),\n      copy: propTypes.bool.def(false),\n      isSvgMode: propTypes.bool.def(false),\n      isPage: propTypes.bool.def(false),\n      isSearch: propTypes.bool.def(false),\n      value: propTypes.string.def(''),\n    },\n    setup(props, { emit }) {\n      //选中的值\n      const currentSelect = ref('');\n      //页数\n      const current = ref<number>(1);\n      //每页条数\n      const pageSize = ref<number>(140);\n      //下拉分页显示\n      const pageSizeOptions = ref<any>(['10', '20', '50', '100', '140']);\n      //下拉搜索值\n      const searchIconValue = ref<string>('');\n      const { clipboardRef, isSuccessRef } = useCopyToClipboard(props.value);\n\n      const currentList = ref<any>(props.currentList);\n      const { getPaginationList, getTotal, setCurrentPage, setPageSize } = usePagination(currentList, pageSize.value);\n      const debounceHandleSearchChange = useDebounceFn(handleSearchChange, 100);\n      const { t } = useI18n();\n      const { createMessage } = useMessage();\n      /**\n       * 搜索\n       * @param e\n       */\n      function handleSearchChange(e: ChangeEvent) {\n        const value = e.target.value;\n        console.log(\"value::::\",value)\n        // 代码逻辑说明: 【issues/4947】菜单编辑页面菜单图标选择模板，每页显示数量切换无效------------\n        setCurrentPage(1);\n        current.value = 1;\n        if (!value) {\n          currentList.value = props.currentList;\n          return;\n        }\n        currentList.value = props.currentList.filter((item) => item.includes(value));\n      }\n\n      /**\n       * 图标点击重置页数\n       */\n      function currentSelectClick() {\n        setCurrentPage(1);\n        setPageSize(140);\n        current.value = 1;\n        pageSize.value = 140;\n        currentList.value = props.currentList;\n        searchIconValue.value = '';\n      }\n\n      function handlePageChange(page: number, size: number) {\n        // 代码逻辑说明: 【issues/4947】菜单编辑页面菜单图标选择模板，每页显示数量切换无效------------\n        current.value = page;\n        pageSize.value = size;\n        setPageSize(size);\n        setCurrentPage(page);\n      }\n\n      /**\n       * 图标点击事件\n       * @param icon\n       */\n      function handleClick(icon: string) {\n        if (props.clearSelect === true) {\n          if (currentSelect.value === icon) {\n            currentSelect.value = '';\n          } else {\n            currentSelect.value = icon;\n          }\n        } else {\n          currentSelect.value = icon;\n          if (props.copy) {\n            clipboardRef.value = icon;\n            if (unref(isSuccessRef)) {\n              createMessage.success(t('component.icon.copy'));\n            }\n          }\n        }\n        emit('update:value', currentSelect.value);\n      }\n\n      /**\n       * 获取图标\n       */\n      function getIcon() {\n        return currentSelect.value;\n      }\n\n      watchEffect(() => {\n        currentSelect.value = props.value;\n      });\n\n      return {\n        searchIconValue,\n        debounceHandleSearchChange,\n        getTotal,\n        getPaginationList,\n        handlePageChange,\n        handleClick,\n        currentSelect,\n        t,\n        pageSize,\n        pageSizeOptions,\n        current,\n        getIcon,\n        currentSelectClick,\n      };\n    },\n  });\n</script>\n\n<style scoped lang=\"less\">\n  ul li {\n    width: 32px;\n    height: 32px;\n    float: left;\n    display: flex;\n    margin: 6px;\n  }\n  ul span {\n    font-size: 1.5rem !important;\n    padding: 0.2rem;\n    margin: 0.3rem;\n  }\n  .icon-border {\n    border: 1px solid rgba(24, 144, 255) !important;\n  }\n  .justify-content-right {\n    justify-content: right;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Icon/src/IconPicker.vue",
    "content": "<template>\n  <a-input\n      :class=\"prefixCls\"\n      :value=\"currentSelect\"\n      readOnly\n      :disabled=\"disabled\"\n      :placeholder=\"t('component.icon.placeholder')\"\n      :style=\"{ width }\"\n      @click=\"currentSelectClick\"\n  >\n    <template #suffix v-if=\"allowClear && currentSelect\">\n      <CloseCircleFilled class=\"menu-current-close\" @click.stop=\"clearCurrentSelect\" />\n    </template>\n    <template #addonAfter>\n      <span class=\"cursor-pointer px-2 py-1 flex items-center\" v-if=\"isSvgMode && currentSelect\">\n        <SvgIcon :name=\"currentSelect\" @click=\"currentSelectClick\"/>\n      </span>\n      <Icon v-else :icon=\"currentSelect || 'ion:apps-outline'\" :class=\"['px-2 py-1', {\n          'cursor-pointer': !disabled,\n          'cursor-not-allowed': disabled,\n        }]\"\n        @click=\"currentSelectClick\"\n      />\n    </template>\n  </a-input>\n  <a-modal :bodyStyle=\"{ padding: '24px', paddingTop: mode === 'svg' ? '48px' : '24px'}\" v-bind=\"$attrs\" v-model:open=\"iconOpen\" :keyboard=\"false\" :width=\"800\" @ok=\"handleOk\" :ok-text=\"t('common.okText')\" :cancel-text=\"t('common.cancelText')\">\n    <template v-if=\"mode === 'iconify'\">\n      <a-tabs style=\"padding-left: 15px;padding-right: 15px\">\n        <a-tab-pane tab=\"方向性图标\" key=\"1\">\n          <a-form-item-rest>\n            <icon-list ref=\"iconListRef\" :clear-select=\"clearSelect\" :copy=\"copy\" :is-svg-mode=\"isSvgMode\" :current-list=\"directionIcons\" v-model:value=\"selectIcon\" />\n          </a-form-item-rest>\n        </a-tab-pane>\n        <a-tab-pane tab=\"指示性图标\" key=\"2\">\n          <a-form-item-rest>\n            <icon-list ref=\"iconListRef\" :clear-select=\"clearSelect\" :copy=\"copy\" :is-svg-mode=\"isSvgMode\" :current-list=\"suggestionIcons\" v-model:value=\"selectIcon\" />\n          </a-form-item-rest>\n        </a-tab-pane>\n        <a-tab-pane tab=\"编辑类图标\" key=\"3\">\n          <a-form-item-rest>\n            <icon-list ref=\"iconListRef\" :clear-select=\"clearSelect\" :copy=\"copy\" :is-svg-mode=\"isSvgMode\" :current-list=\"editIcons\" v-model:value=\"selectIcon\" />\n          </a-form-item-rest>\n        </a-tab-pane>\n        <a-tab-pane tab=\"数据类图标\" key=\"4\">\n          <a-form-item-rest>\n            <icon-list ref=\"iconListRef\" :clear-select=\"clearSelect\" :copy=\"copy\" :is-svg-mode=\"isSvgMode\" :current-list=\"dataIcons\" v-model:value=\"selectIcon\" />\n          </a-form-item-rest>\n        </a-tab-pane>\n        <a-tab-pane tab=\"网站通用图标\" key=\"5\">\n          <a-form-item-rest>\n            <icon-list ref=\"iconListRef\" :clear-select=\"clearSelect\" :copy=\"copy\" :is-svg-mode=\"isSvgMode\" :current-list=\"webIcons\" v-model:value=\"selectIcon\" />\n          </a-form-item-rest>\n        </a-tab-pane>\n        <a-tab-pane tab=\"品牌和标识\" key=\"6\">\n          <a-form-item-rest>\n            <icon-list ref=\"iconListRef\" :clear-select=\"clearSelect\" :copy=\"copy\" :is-svg-mode=\"isSvgMode\" :current-list=\"logoIcons\" v-model:value=\"selectIcon\" />\n          </a-form-item-rest>\n        </a-tab-pane>\n        <a-tab-pane tab=\"其他\" key=\"7\">\n          <a-form-item-rest>\n            <icon-list ref=\"iconListRef\" :clear-select=\"clearSelect\" :copy=\"copy\" :is-page=\"true\" :is-search=\"true\" :is-svg-mode=\"isSvgMode\" :current-list=\"otherIcons\" v-model:value=\"selectIcon\" />\n          </a-form-item-rest>\n        </a-tab-pane>\n      </a-tabs>\n    </template>\n    <template v-else>\n      <icon-list ref=\"iconListRef\" :clear-select=\"clearSelect\" :copy=\"copy\" :is-page=\"true\" :is-search=\"true\" :is-svg-mode=\"isSvgMode\" :current-list=\"otherIcons\" v-model:value=\"selectIcon\" />\n    </template>\n  </a-modal>\n</template>\n<script lang=\"ts\" setup name=\"icon-picker\">\n  import { ref, watchEffect, watch, unref, onMounted } from 'vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { Input } from 'ant-design-vue';\n  import Icon from './Icon.vue';\n  import SvgIcon from './SvgIcon.vue';\n\n  import iconsData from '../data/icons.data';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import svgIcons from 'virtual:svg-icons-names';\n  import IconList from \"./IconList.vue\";\n  import { CloseCircleFilled } from '@ant-design/icons-vue';\n  // 没有使用别名引入，是因为WebStorm当前版本还不能正确识别，会报unused警告\n  const AInput = Input;\n\n  function getIcons() {\n    const data = iconsData as any;\n    const prefix: string = data?.prefix ?? '';\n    let result: string[] = [];\n    if (prefix) {\n      result = (data?.icons ?? []).map((item) => `${prefix}:${item}`);\n    } else if (Array.isArray(iconsData)) {\n      result = iconsData as string[];\n    }\n    return result;\n  }\n\n  function getSvgIcons() {\n    return svgIcons.map((icon) => icon.replace('icon-', ''));\n  }\n\n  const props = defineProps({\n    value: propTypes.string,\n    width: propTypes.string.def('100%'),\n    copy: propTypes.bool.def(false),\n    mode: propTypes.oneOf<('svg' | 'iconify')[]>(['svg', 'iconify']).def('iconify'),\n    disabled: propTypes.bool.def(false),\n    clearSelect: propTypes.bool.def(false),\n    allowClear: propTypes.bool.def(false),\n    iconPrefixSave: propTypes.bool.def(true),\n  });\n\n  const emit = defineEmits(['change', 'update:value']);\n\n  const isSvgMode = props.mode === 'svg';\n  const icons = isSvgMode ? getSvgIcons() : getIcons();\n\n  const selectIcon = ref('');\n  const currentSelect = ref('');\n\n  const { t } = useI18n();\n  const { prefixCls } = useDesign('icon-picker');\n\n  // 代码逻辑说明: 【QQYUN-8924】图标库选择组件不如vue2的方便---\n  const iconOpen = ref<boolean>(false);\n  //方向性图标\n  const directionIcons = ['ant-design:step-backward-outlined', 'ant-design:step-forward-outlined', 'ant-design:fast-backward-outlined', 'ant-design:fast-forward-outlined', 'ant-design:shrink-outlined', 'ant-design:arrows-alt-outlined', 'ant-design:down-outlined', 'ant-design:up-outlined', 'ant-design:left-outlined', 'ant-design:right-outlined', 'ant-design:caret-up-outlined', 'ant-design:caret-down-outlined', 'ant-design:caret-left-outlined', 'ant-design:caret-right-outlined', 'ant-design:up-circle-outlined', 'ant-design:down-circle-outlined', 'ant-design:left-circle-outlined', 'ant-design:right-circle-outlined',  'ant-design:double-right-outlined', 'ant-design:double-left-outlined', 'ant-design:vertical-left-outlined', 'ant-design:vertical-right-outlined', 'ant-design:forward-outlined', 'ant-design:backward-outlined', 'ant-design:rollback-outlined', 'ant-design:enter-outlined', 'ant-design:retweet-outlined', 'ant-design:swap-outlined', 'ant-design:swap-left-outlined', 'ant-design:swap-right-outlined', 'ant-design:arrow-up-outlined', 'ant-design:arrow-down-outlined', 'ant-design:arrow-left-outlined', 'ant-design:arrow-right-outlined', 'ant-design:play-circle-outlined', 'ant-design:up-square-outlined', 'ant-design:down-square-outlined', 'ant-design:left-square-outlined', 'ant-design:right-square-outlined', 'ant-design:login-outlined', 'ant-design:logout-outlined', 'ant-design:menu-fold-outlined', 'ant-design:menu-unfold-outlined', 'ant-design:border-bottom-outlined', 'ant-design:border-horizontal-outlined', 'ant-design:border-inner-outlined', 'ant-design:border-left-outlined', 'ant-design:border-right-outlined', 'ant-design:border-top-outlined', 'ant-design:border-verticle-outlined', 'ant-design:pic-center-outlined', 'ant-design:pic-left-outlined', 'ant-design:pic-right-outlined', 'ant-design:radius-bottomleft-outlined', 'ant-design:radius-bottomright-outlined', 'ant-design:radius-upleft-outlined', 'ant-design:radius-upright-outlined', 'ant-design:fullscreen-outlined', 'ant-design:fullscreen-exit-outlined']\n  //提示建议性图标\n  const suggestionIcons = ['ant-design:question-outlined', 'ant-design:question-circle-outlined', 'ant-design:plus-outlined', 'ant-design:plus-circle-outlined', 'ant-design:pause-outlined', 'ant-design:pause-circle-outlined', 'ant-design:minus-outlined', 'ant-design:minus-circle-outlined', 'ant-design:plus-square-outlined', 'ant-design:minus-square-outlined', 'ant-design:info-outlined', 'ant-design:info-circle-outlined', 'ant-design:exclamation-outlined', 'ant-design:exclamation-circle-outlined', 'ant-design:close-outlined', 'ant-design:close-circle-outlined', 'ant-design:close-square-outlined', 'ant-design:check-outlined', 'ant-design:check-circle-outlined', 'ant-design:check-square-outlined', 'ant-design:clock-circle-outlined', 'ant-design:warning-outlined', 'ant-design:issues-close-outlined', 'ant-design:stop-outlined']\n  //编辑类图标\n  const editIcons = ['ant-design:edit-outlined', 'ant-design:form-outlined', 'ant-design:copy-outlined', 'ant-design:scissor-outlined', 'ant-design:delete-outlined', 'ant-design:snippets-outlined', 'ant-design:diff-outlined', 'ant-design:highlight-outlined', 'ant-design:align-center-outlined', 'ant-design:align-left-outlined', 'ant-design:align-right-outlined', 'ant-design:bg-colors-outlined', 'ant-design:bold-outlined', 'ant-design:italic-outlined', 'ant-design:underline-outlined', 'ant-design:strikethrough-outlined', 'ant-design:redo-outlined', 'ant-design:undo-outlined', 'ant-design:zoom-in-outlined', 'ant-design:zoom-out-outlined', 'ant-design:font-colors-outlined', 'ant-design:font-size-outlined', 'ant-design:line-height-outlined', 'ant-design:dash-outlined', 'ant-design:small-dash-outlined', 'ant-design:sort-ascending-outlined', 'ant-design:sort-descending-outlined', 'ant-design:drag-outlined', 'ant-design:ordered-list-outlined', 'ant-design:radius-setting-outlined']\n  //数据类图标\n  const dataIcons = ['ant-design:area-chart-outlined', 'ant-design:pie-chart-outlined', 'ant-design:bar-chart-outlined', 'ant-design:dot-chart-outlined', 'ant-design:line-chart-outlined', 'ant-design:radar-chart-outlined', 'ant-design:heat-map-outlined', 'ant-design:fall-outlined', 'ant-design:rise-outlined', 'ant-design:stock-outlined', 'ant-design:box-plot-outlined', 'ant-design:fund-outlined', 'ant-design:sliders-outlined']\n  //站通用图标\n  const webIcons = ['ant-design:lock-outlined', 'ant-design:unlock-outlined', 'ant-design:bars-outlined', 'ant-design:book-outlined', 'ant-design:calendar-outlined', 'ant-design:cloud-outlined', 'ant-design:cloud-download-outlined', 'ant-design:code-outlined', 'ant-design:copy-outlined', 'ant-design:credit-card-outlined', 'ant-design:delete-outlined', 'ant-design:desktop-outlined', 'ant-design:download-outlined', 'ant-design:ellipsis-outlined', 'ant-design:file-outlined', 'ant-design:file-text-outlined', 'ant-design:file-unknown-outlined', 'ant-design:file-pdf-outlined', 'ant-design:file-word-outlined', 'ant-design:file-excel-outlined', 'ant-design:file-jpg-outlined', 'ant-design:file-ppt-outlined', 'ant-design:file-markdown-outlined', 'ant-design:file-add-outlined', 'ant-design:folder-outlined', 'ant-design:folder-open-outlined', 'ant-design:folder-add-outlined', 'ant-design:hdd-outlined', 'ant-design:frown-outlined', 'ant-design:meh-outlined', 'ant-design:smile-outlined', 'ant-design:inbox-outlined', 'ant-design:laptop-outlined', 'ant-design:appstore-outlined', 'ant-design:link-outlined', 'ant-design:mail-outlined', 'ant-design:mobile-outlined', 'ant-design:notification-outlined', 'ant-design:paper-clip-outlined', 'ant-design:picture-outlined', 'ant-design:poweroff-outlined', 'ant-design:reload-outlined', 'ant-design:search-outlined', 'ant-design:setting-outlined', 'ant-design:share-alt-outlined', 'ant-design:shopping-cart-outlined', 'ant-design:tablet-outlined', 'ant-design:tag-outlined', 'ant-design:tags-outlined', 'ant-design:to-top-outlined', 'ant-design:upload-outlined', 'ant-design:user-outlined', 'ant-design:video-camera-outlined', 'ant-design:home-outlined', 'ant-design:loading-outlined', 'ant-design:loading-3-quarters-outlined', 'ant-design:cloud-upload-outlined', 'ant-design:star-outlined', 'ant-design:heart-outlined', 'ant-design:environment-outlined', 'ant-design:eye-outlined', 'ant-design:camera-outlined', 'ant-design:save-outlined', 'ant-design:team-outlined', 'ant-design:solution-outlined', 'ant-design:phone-outlined', 'ant-design:filter-outlined', 'ant-design:exception-outlined', 'ant-design:export-outlined', 'ant-design:customer-service-outlined', 'ant-design:qrcode-outlined', 'ant-design:scan-outlined', 'ant-design:like-outlined', 'ant-design:dislike-outlined', 'ant-design:message-outlined', 'ant-design:pay-circle-outlined', 'ant-design:calculator-outlined', 'ant-design:pushpin-outlined', 'ant-design:bulb-outlined', 'ant-design:select-outlined', 'ant-design:switcher-outlined', 'ant-design:rocket-outlined', 'ant-design:bell-outlined', 'ant-design:disconnect-outlined', 'ant-design:database-outlined', 'ant-design:compass-outlined', 'ant-design:barcode-outlined', 'ant-design:hourglass-outlined', 'ant-design:key-outlined', 'ant-design:flag-outlined', 'ant-design:layout-outlined', 'ant-design:printer-outlined', 'ant-design:sound-outlined', 'ant-design:usb-outlined', 'ant-design:skin-outlined', 'ant-design:tool-outlined', 'ant-design:sync-outlined', 'ant-design:wifi-outlined', 'ant-design:car-outlined', 'ant-design:schedule-outlined', 'ant-design:user-add-outlined', 'ant-design:user-delete-outlined', 'ant-design:usergroup-add-outlined', 'ant-design:usergroup-delete-outlined', 'ant-design:man-outlined', 'ant-design:woman-outlined', 'ant-design:shop-outlined', 'ant-design:gift-outlined', 'ant-design:idcard-outlined', 'ant-design:medicine-box-outlined', 'ant-design:red-envelope-outlined', 'ant-design:coffee-outlined', 'ant-design:copyright-outlined', 'ant-design:trademark-outlined', 'ant-design:safety-outlined', 'ant-design:wallet-outlined', 'ant-design:bank-outlined', 'ant-design:trophy-outlined', 'ant-design:contacts-outlined', 'ant-design:global-outlined', 'ant-design:shake-outlined', 'ant-design:api-outlined', 'ant-design:fork-outlined', 'ant-design:dashboard-outlined', 'ant-design:table-outlined', 'ant-design:profile-outlined', 'ant-design:alert-outlined', 'ant-design:audit-outlined', 'ant-design:branches-outlined', 'ant-design:build-outlined', 'ant-design:border-outlined', 'ant-design:crown-outlined', 'ant-design:experiment-outlined', 'ant-design:fire-outlined', 'ant-design:money-collect-outlined', 'ant-design:property-safety-outlined', 'ant-design:read-outlined', 'ant-design:reconciliation-outlined', 'ant-design:rest-outlined', 'ant-design:security-scan-outlined', 'ant-design:insurance-outlined', 'ant-design:interation-outlined', 'ant-design:safety-certificate-outlined', 'ant-design:project-outlined', 'ant-design:thunderbolt-outlined', 'ant-design:block-outlined', 'ant-design:cluster-outlined', 'ant-design:deployment-unit-outlined', 'ant-design:dollar-outlined', 'ant-design:euro-outlined', 'ant-design:pound-outlined', 'ant-design:file-done-outlined', 'ant-design:file-exclamation-outlined', 'ant-design:file-protect-outlined', 'ant-design:file-search-outlined', 'ant-design:file-sync-outlined', 'ant-design:gateway-outlined', 'ant-design:gold-outlined', 'ant-design:robot-outlined', 'ant-design:shopping-outlined']\n  //品牌和标识网\n  const logoIcons = ['ant-design:android-outlined', 'ant-design:apple-outlined', 'ant-design:windows-outlined', 'ant-design:ie-outlined', 'ant-design:chrome-outlined', 'ant-design:github-outlined', 'ant-design:aliwangwang-outlined', 'ant-design:dingding-outlined', 'ant-design:weibo-square-outlined', 'ant-design:weibo-circle-outlined', 'ant-design:taobao-circle-outlined', 'ant-design:html5-outlined', 'ant-design:weibo-outlined', 'ant-design:twitter-outlined', 'ant-design:wechat-outlined', 'ant-design:youtube-outlined', 'ant-design:alipay-circle-outlined', 'ant-design:taobao-outlined', 'ant-design:skype-outlined', 'ant-design:qq-outlined', 'ant-design:medium-workmark-outlined', 'ant-design:gitlab-outlined', 'ant-design:medium-outlined', 'ant-design:linkedin-outlined', 'ant-design:google-plus-outlined', 'ant-design:dropbox-outlined', 'ant-design:facebook-outlined', 'ant-design:codepen-outlined', 'ant-design:amazon-outlined', 'ant-design:google-outlined', 'ant-design:codepen-circle-outlined', 'ant-design:alipay-outlined', 'ant-design:ant-design-outlined', 'ant-design:aliyun-outlined', 'ant-design:zhihu-outlined', 'ant-design:slack-outlined', 'ant-design:slack-square-outlined', 'ant-design:behance-outlined', 'ant-design:behance-square-outlined', 'ant-design:dribbble-outlined', 'ant-design:dribbble-square-outlined', 'ant-design:instagram-outlined', 'ant-design:yuque-outlined', 'ant-design:alibaba-outlined', 'ant-design:yahoo-outlined']\n  //其他\n  const otherIcons = ref<any>([]);\n\n  watchEffect(() => {\n    // 代码逻辑说明: 【TV360X-136】按钮图标改成图标组件选择\n    let value = props.value;\n    if (!props.iconPrefixSave && value) {\n      value = `ant-design:${value}`;\n    }\n    currentSelect.value = value;\n  });\n\n  watch(\n    () => currentSelect.value,\n    (v) => {\n      // 代码逻辑说明: 【TV360X-136】按钮图标改成图标组件选择\n      let value = v;\n      if (!props.iconPrefixSave && value) {\n        value = value.split('ant-design:')[1];\n      }\n      emit('update:value', value);\n      return emit('change', value);\n    }\n  );\n\n\n  /**\n   * 图标点击重置页数\n   */\n  function currentSelectClick() {\n    if (props.disabled) {\n      return\n    }\n    iconOpen.value = true;\n    setTimeout(()=>{\n      iconListRef.value.currentSelectClick();\n    },100)\n  }\n\n  function initOtherIcon() {\n    otherIcons.value = icons.filter(item => {\n      if(directionIcons.indexOf(item) === -1 && suggestionIcons.indexOf(item) === -1 && editIcons.indexOf(item) === -1\n         && dataIcons.indexOf(item) === -1 && webIcons.indexOf(item) === -1 && logoIcons.indexOf(item) === -1) {\n          return true;\n      }\n    })\n  }\n\n  const iconListRef = ref();\n\n  /**\n   * 图标弹窗确定事件\n   */\n  function handleOk() {\n    currentSelect.value = selectIcon.value;\n    iconOpen.value = false;\n  }\n\n  /**\n   * 清除当前选择图标\n   */\n  function clearCurrentSelect(){\n    currentSelect.value = '';\n  }\n  onMounted(()=>{\n    //初始化加载图标\n    initOtherIcon();\n  })\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-icon-picker';\n\n  .@{prefix-cls} {\n\n    // 输入框手势图标\n    .ant-input:not([disabled]) {\n      cursor: pointer;\n    }\n\n    .ant-input-group-addon {\n      padding: 0;\n    }\n\n    &-popover {\n      width: 400px;\n\n      .ant-popover-inner-content {\n        padding: 0;\n      }\n\n      .scrollbar {\n        height: 220px;\n      }\n    }\n    //图标样式\n    .menu-current-close {\n      color: #cccccc;\n    }\n  }\n  //图标样式兼容暗黑模式\n  [data-theme='dark'] .@{prefix-cls} {\n    .menu-current-close {\n      color: #4f4f4f;\n      font-size: 12px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Icon/src/SvgIcon.vue",
    "content": "<template>\n  <svg :class=\"[prefixCls, $attrs.class, spin && 'svg-icon-spin']\" :style=\"getStyle\" aria-hidden=\"true\">\n    <use :xlink:href=\"symbolId\" />\n  </svg>\n</template>\n<script lang=\"ts\">\n  import type { CSSProperties } from 'vue';\n  import { defineComponent, computed } from 'vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  export default defineComponent({\n    name: 'SvgIcon',\n    props: {\n      prefix: {\n        type: String,\n        default: 'icon',\n      },\n      name: {\n        type: String,\n        required: true,\n      },\n      size: {\n        type: [Number, String],\n        default: 16,\n      },\n      spin: {\n        type: Boolean,\n        default: false,\n      },\n    },\n    setup(props) {\n      const { prefixCls } = useDesign('svg-icon');\n      const symbolId = computed(() => `#${props.prefix}-${props.name}`);\n\n      const getStyle = computed((): CSSProperties => {\n        const { size } = props;\n        let s = `${size}`;\n        s = `${s.replace('px', '')}px`;\n        return {\n          width: s,\n          height: s,\n        };\n      });\n      return { symbolId, prefixCls, getStyle };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-svg-icon';\n\n  .@{prefix-cls} {\n    display: inline-block;\n    overflow: hidden;\n    vertical-align: -0.15em;\n    fill: currentColor;\n  }\n\n  .svg-icon-spin {\n    animation: loadingCircle 1s infinite linear;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/InFilter/CascaderPcaInFilter.vue",
    "content": "<!-- 省市县选择组件，在筛选中的用法 -->\n<template>\n  <a-space :class=\"[prefixCls]\" direction=\"vertical\">\n  </a-space>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent} from \"vue\";\n\nexport default defineComponent({\n  name: 'CascaderPcaInFilter',\n  inheritAttrs: false,\n})\n</script>\n\n<script lang=\"ts\" setup>\n\n</script>\n\n<style lang=\"less\">\n//noinspection LessUnresolvedVariable\n@prefix-cls: ~'@{namespace}-j-cascader-pca-in-filter';\n\n.@{prefix-cls} {\n  width: 100%;\n}\n\n\n.@{prefix-cls}-menu-item-icon {\n  width: 16px;\n  height: 16px;\n  display: inline-block;\n  margin-right: 6px;\n\n  &, & + span {\n    vertical-align: middle;\n  }\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/InFilter/DatePickerInFilter.vue",
    "content": "<!-- 在筛选中使用的日期选择器（可选择今天、本周等范围） -->\n<template>\n  <a-space :id=\"formItemId\" :class=\"[prefixCls]\" direction=\"vertical\">\n    <a-space-compact block>\n      <!-- 日期范围下拉 -->\n      <a-select v-if=\"isRange\" v-model:value=\"innerValue\">\n        <a-select-option v-for=\"opt of RANGE_OPTIONS\" :key=\"opt.key\" :value=\"opt.key\">\n          {{ opt.label }}\n        </a-select-option>\n        <a-select-option key=\"custom\" value=\"custom\">\n          自定义日期\n        </a-select-option>\n      </a-select>\n      <!-- 自定义日期选择器 -->\n      <DatePicker v-else v-model:value=\"innerValue\" v-model:open=\"datePickerIsOpen\" v-bind=\"attrs\"/>\n      <!-- 右侧下拉菜单 -->\n      <a-dropdown v-if=\"allowSelectRange\" :trigger=\"['click']\">\n        <a-button preIcon=\"ant-design:menu-unfold\"/>\n        <template #overlay>\n          <a-menu @click=\"onMenuClick\">\n            <a-menu-item v-for=\"opt of RANGE_OPTIONS\" :key=\"opt.key\">\n              {{ opt.label }}\n            </a-menu-item>\n            <a-menu-item key=\"custom\">\n              自定义日期\n            </a-menu-item>\n          </a-menu>\n        </template>\n      </a-dropdown>\n    </a-space-compact>\n  </a-space>\n</template>\n\n<script lang=\"ts\">\nimport {defineComponent} from \"vue\";\n\nexport default defineComponent({\n  name: 'DatePickerInFilter',\n  inheritAttrs: false,\n})\n</script>\n\n<script lang=\"ts\" setup>\nimport {ref, watch, computed, nextTick, useAttrs, defineProps} from 'vue'\nimport {DatePicker} from 'ant-design-vue'\nimport {useDesign} from '/@/hooks/web/useDesign';\nimport { Form } from 'ant-design-vue';\nconst formItemContext = Form.useInjectFormItemContext();\n\n// 日期范围选项\nconst RANGE_OPTIONS = [\n  {key: 'TODAY', label: '今天'},\n  {key: 'YESTERDAY', label: '昨天'},\n  {key: 'TOMORROW', label: '明天'},\n  {key: 'THIS_WEEK', label: '本周'},\n  {key: 'LAST_WEEK', label: '上周'},\n  {key: 'NEXT_WEEK', label: '下周'},\n  {key: 'LAST_7_DAYS', label: '过去七天'},\n  {key: 'THIS_MONTH', label: '本月'},\n  {key: 'LAST_MONTH', label: '上月'},\n  {key: 'NEXT_MONTH', label: '下月'},\n];\nconst RANGE_OPTION_KEYS = RANGE_OPTIONS.map(item => item.key)\n\nconst {prefixCls} = useDesign('j-data-picker-in-filter');\nconst props = defineProps({\n  value: {\n    type: [String],\n    default: ''\n  },\n  // 是否允许选择预设范围\n  allowSelectRange: {\n    type: Boolean,\n    default: true,\n  }\n})\nconst emit = defineEmits(['change', 'update:value'])\nconst attrs = useAttrs()\n\n// 组件id\nconst formItemId  = computed(() => formItemContext.id.value)\n\nconst innerValue = ref(props.value)\n// 是否打开日期选择器\nconst datePickerIsOpen = ref(false)\n\n// 判断是否为范围选项\nconst isRange = computed(() => RANGE_OPTION_KEYS.includes(innerValue.value));\n\n// 同步value\nwatch(() => props.value, (val) => {\n  innerValue.value = val\n})\n\n// emit 更改\nwatch(innerValue, (val) => {\n  if (val === 'custom') {\n    val = ''\n    openDatePicker()\n  }\n  emit('change', val)\n  emit('update:value', val)\n  // 代码逻辑说明: 【QQYUN-9227】日期校验没清空\n  formItemContext?.onFieldChange();\n})\n\nwatch(() => props.allowSelectRange, (allow) => {\n  // 如果不允许选择范围，且当前值为范围选项，则清空值\n  if (!allow && isRange.value) {\n    innerValue.value = ''\n  }\n}, {immediate: true});\n\n// 点击右侧下拉菜单\nfunction onMenuClick(event: Recordable) {\n  if (event.key === 'custom') {\n    if (isRange.value) {\n      innerValue.value = '';\n    }\n    openDatePicker()\n  } else {\n    innerValue.value = event.key\n  }\n}\n\n// 打开日期选择器下拉\nasync function openDatePicker() {\n  await nextTick()\n  datePickerIsOpen.value = true\n}\n\n</script>\n\n<style lang=\"less\">\n//noinspection LessUnresolvedVariable\n@prefix-cls: ~'@{namespace}-j-data-picker-in-filter';\n\n.@{prefix-cls} {\n  width: 100%;\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/InFilter/index.ts",
    "content": "export {default as DatePickerInFilter} from './DatePickerInFilter.vue';\nexport {default as CascaderPcaInFilter} from './CascaderPcaInFilter.vue';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/JDragNotice/JDragNotice.vue",
    "content": "<template>\n  <div>\n    <keep-alive>\n      <component\n        v-if=\"currentModal\"\n        v-bind=\"bindParams\"\n        :key=\"currentModal\"\n        :is=\"currentModal\"\n        @register=\"modalRegCache[currentModal].register\"\n        @reply=\"handReply\"\n        @selected=\"reloadPage\"\n      />\n    </keep-alive>\n    <!-- 系统公告弹窗 -->\n    <DynamicNotice ref=\"showDynamNotice\" v-bind=\"bindParams\" />\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, onMounted } from 'vue';\n  import { useDragNotice } from '/@/hooks/web/useDragNotice';\n  import DynamicNotice from '@/views/monitor/mynews/DynamicNotice.vue';\n\n  export default defineComponent({\n    name: 'JDragNotice',\n    components: {\n      DynamicNotice,\n    },\n    setup() {\n      const {\n        initDragWebSocket,\n        currentModal,\n        modalParams,\n        modalRegCache,\n        bindParams,\n        reloadPage,\n      } = useDragNotice();\n\n      onMounted(() => {\n        initDragWebSocket();\n      });\n\n      return {\n        currentModal,\n        modalParams,\n        modalRegCache,\n        bindParams,\n        reloadPage,\n      };\n    },\n  });\n</script>\n\n<style scoped lang=\"less\"></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/JVxeCustom/index.ts",
    "content": "import { registerComponent, registerAsyncComponent, registerASyncComponentReal } from '/@/components/jeecg/JVxeTable';\nimport { JVxeTypes } from '/@/components/jeecg/JVxeTable/types';\nimport { DictSearchSpanCell, DictSearchInputCell } from './src/components/JVxeSelectDictSearchCell';\nimport { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\nexport async function registerJVxeCustom() {\n  // ----------------- ⚠ 注意事项 ⚠ -----------------\n  //  当组件内包含 BasicModal 时，必须使用异步引入！\n  //  否则将会导致 i18n 失效！\n  // ----------------- ⚠ 注意事项 ⚠ -----------------\n\n  // 注册【Popup】（普通封装方式）\n  await registerAsyncComponent(JVxeTypes.popup, import('./src/components/JVxePopupCell.vue'));\n\n  // 注册【字典搜索下拉】组件（高级封装方式）\n  registerComponent(JVxeTypes.selectDictSearch, DictSearchInputCell, DictSearchSpanCell);\n\n  // 注册【文件上传】组件\n  await registerAsyncComponent(JVxeTypes.file, import('./src/components/JVxeFileCell.vue'));\n  // 注册【图片上传】组件\n  await registerAsyncComponent(JVxeTypes.image, import('./src/components/JVxeImageCell.vue'));\n  // 注册【用户选择】组件\n  await registerAsyncComponent(JVxeTypes.userSelect, import('./src/components/JVxeUserSelectCell.vue'));\n  // 注册【部门选择】组件\n  await registerAsyncComponent(JVxeTypes.departSelect, import('./src/components/JVxeDepartSelectCell.vue'));\n  // 注册【省市区选择】组件\n  // await registerAsyncComponent(JVxeTypes.pca, import('./src/components/JVxePcaCell.vue'));\n  // 代码逻辑说明: 【QQYUN-8241】为避免首次加载china-area-data，JVxePcaCell组件需异步加载\n  registerASyncComponentReal(\n    JVxeTypes.pca,\n    createAsyncComponent(() => import('./src/components/JVxePcaCell.vue'))\n  );\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/JVxeCustom/src/components/JVxeDepartSelectCell.vue",
    "content": "<template>\n  <!--  <div>-->\n  <!--    <a-input-->\n  <!--        v-show=\"!departIds\"-->\n  <!--        @click=\"openSelect\"-->\n  <!--        placeholder=\"请点击选择部门\"-->\n  <!--        v-model=\"departNames\"-->\n  <!--        readOnly-->\n  <!--        :disabled=\"componentDisabled\"-->\n  <!--        class=\"jvxe-select-input\">-->\n  <!--      <a-icon slot=\"prefix\" type=\"cluster\" title=\"部门选择控件\"/>-->\n  <!--    </a-input>-->\n  <!--    <j-select-depart-modal-->\n  <!--        ref=\"innerDepartSelectModal\"-->\n  <!--        :modal-width=\"modalWidth\"-->\n  <!--        :multi=\"multi\"-->\n  <!--        :rootOpened=\"rootOpened\"-->\n  <!--        :depart-id=\"departIds\"-->\n  <!--        @ok=\"handleOK\"-->\n  <!--        @initComp=\"initComp\"/>-->\n  <!--    <span style=\"display: inline-block;height:100%;padding-left:14px\" v-if=\"departIds\">-->\n  <!--      <span @click=\"openSelect\" style=\"display: inline-block;vertical-align: middle\">{{ departNames }}</span>-->\n  <!--      <a-icon style=\"margin-left:5px;vertical-align: middle\" type=\"close-circle\" @click=\"handleEmpty\" title=\"清空\"/>-->\n  <!--    </span>-->\n  <!--  </div>-->\n  <div :class=\"[prefixCls]\">\n    <JSelectDept v-bind=\"getProps\" @change=\"handleChange\" />\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { computed, defineComponent } from 'vue';\n  //import { JSelectDept } from '/@/components/Form';\n  import JSelectDept from '/@/components/Form/src/jeecg/components/JSelectDept.vue';\n  import { JVxeComponent } from '/@/components/jeecg/JVxeTable/types';\n  import { useJVxeComponent, useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks';\n\n  // import JSelectDepartModal from '@/components/jeecgbiz/modal/JSelectDepartModal'\n  import { dispatchEvent } from '/@/components/jeecg/JVxeTable/utils';\n  import { isArray, isEmpty, isString } from '/@/utils/is';\n\n  export default defineComponent({\n    name: 'JVxeDepartSelectCell',\n    components: { JSelectDept },\n    props: useJVxeCompProps(),\n    setup(props: JVxeComponent.Props) {\n      const { innerValue, cellProps, handleChangeCommon, useCellDesign } = useJVxeComponent(props);\n      const { prefixCls } = useCellDesign('depart-select');\n\n      const selectedValue = computed(() => {\n        let val: any = innerValue.value;\n        if (val == null) {\n          return val;\n        }\n        if (isEmpty(val)) {\n          return [];\n        }\n        if (isArray(val)) {\n          return val;\n        }\n        if (isString(val)) {\n          return (<string>val).split(',');\n        }\n        return [val];\n      });\n\n      const multiple = computed(() => cellProps.value['multi'] != false);\n\n      const getProps = computed(() => {\n        return {\n          ...cellProps.value,\n          value: selectedValue.value,\n          showButton: false,\n          // 不允许搜索\n          showSearch: false,\n          // 设置最大的显示个数\n          maxTagCount: 1,\n          // 显示提示重写，去掉省略号\n          maxTagPlaceholder: ({ length }) => '+' + length,\n          // -update-begin--author:liaozhiyang---date:20240617---for：【TV360X-1002】详情页面行编辑用户组件和部门组件显示方式优化\n          isDetailsMode: cellProps.value.disabledTable,\n          // -update-end--author:liaozhiyang---date:20240617---for：【TV360X-1002】详情页面行编辑用户组件和部门组件显示方式优化\n        };\n      });\n\n      function handleChange(values) {\n        handleChangeCommon(values.join(','));\n      }\n\n      return {\n        prefixCls,\n        selectedValue,\n        multiple,\n        cellProps,\n        getProps,\n        handleChange,\n      };\n    },\n\n    data() {\n      return {\n        // departNames: '',\n        // departIds: '',\n        // selectedOptions: [],\n        // customReturnField: 'id',\n      };\n    },\n    computed: {\n      // custProps() {\n      //   const { departIds, originColumn: col, caseId, cellProps } = this\n      //   return {\n      //     ...cellProps,\n      //     value: departIds,\n      //     field: col.field || col.key,\n      //     groupId: caseId,\n      //     class: 'jvxe-select',\n      //   }\n      // },\n      // componentDisabled() {\n      //   if (this.cellProps.disabled == true) {\n      //     return true\n      //   }\n      //   return false\n      // },\n      // modalWidth() {\n      //   if (this.cellProps.modalWidth) {\n      //     return this.cellProps.modalWidth\n      //   } else {\n      //     return 500\n      //   }\n      // },\n      // multi() {\n      //   if (this.cellProps.multi == false) {\n      //     return false\n      //   } else {\n      //     return true\n      //   }\n      // },\n      // rootOpened() {\n      //   if (this.cellProps.open == false) {\n      //     return false\n      //   } else {\n      //     return true\n      //   }\n      // },\n    },\n    watch: {\n      // innerValue: {\n      //   immediate: true,\n      //   handler(val) {\n      //     if (val == null || val === '') {\n      //       this.departIds = ''\n      //     } else {\n      //       this.departIds = val\n      //     }\n      //   },\n      // },\n    },\n    methods: {\n      // openSelect() {\n      //   this.$refs.innerDepartSelectModal.show()\n      // },\n      // handleEmpty() {\n      //   this.handleOK('')\n      // },\n      // handleOK(rows, idstr) {\n      //   let value = ''\n      //   if (!rows && rows.length <= 0) {\n      //     this.departNames = ''\n      //     this.departIds = ''\n      //   } else {\n      //     value = rows.map(row => row[this.customReturnField]).join(',')\n      //     this.departNames = rows.map(row => row['departName']).join(',')\n      //     this.departIds = idstr\n      //   }\n      //   this.handleChangeCommon(this.departIds)\n      // },\n      // initComp(departNames) {\n      //   this.departNames = departNames\n      // },\n      // handleChange(value) {\n      //   this.handleChangeCommon(value)\n      // },\n    },\n    enhanced: {\n      switches: {\n        visible: true,\n      },\n      translate: {\n        enabled: false,\n      },\n      aopEvents: {\n        editActived({ $event }) {\n          dispatchEvent({\n            $event,\n            props: this.props,\n            className: '.ant-select .ant-select-selection-search-input',\n            isClick: true,\n          });\n        },\n      },\n    } as JVxeComponent.EnhancedPartial,\n  });\n</script>\n\n<style lang=\"less\">\n  // noinspection LessUnresolvedVariable\n  @prefix-cls: ~'@{namespace}-vxe-cell-depart-select';\n\n  .@{prefix-cls} {\n    // 限制tag最大长度为100px，防止选中文字过多的选项时换行\n    .ant-select .ant-select-selection-overflow-item {\n      max-width: 80px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/JVxeCustom/src/components/JVxeFileCell.vue",
    "content": "<template>\n  <div>\n    <template v-if=\"hasFile\" v-for=\"(file, fileKey) of [innerFile || {}]\" :key=\"fileKey\">\n      <div style=\"position: relative\">\n        <a-tooltip v-if=\"file.status === 'uploading'\" :title=\"`上传中(${Math.floor(file.percent)}%)`\">\n          <LoadingOutlined />\n          <span style=\"margin-left: 5px\">上传中…</span>\n        </a-tooltip>\n\n        <a-tooltip v-else-if=\"file.status === 'done'\" :title=\"file.name\">\n          <Icon icon=\"ant-design:paper-clip\" />\n          <span style=\"margin-left: 5px\">{{ ellipsisFileName }}</span>\n        </a-tooltip>\n\n        <a-tooltip v-else :title=\"file.message || '上传失败'\">\n          <Icon icon=\"ant-design:exclamation-circle\" style=\"color: red\" />\n          <span style=\"margin-left: 5px\">{{ ellipsisFileName }}</span>\n        </a-tooltip>\n\n        <Dropdown :trigger=\"['click']\" placement=\"bottomRight\" style=\"margin-left: 10px\">\n          <a-tooltip title=\"操作\">\n            <Icon v-if=\"file.status !== 'uploading'\" icon=\"ant-design:setting\" style=\"cursor: pointer\" />\n          </a-tooltip>\n          <template #overlay>\n            <a-menu>\n              <a-menu-item v-if=\"originColumn.allowDownload !== false\" @click=\"handleClickDownloadFile\">\n                <span><Icon icon=\"ant-design:download\" />&nbsp;下载</span>\n              </a-menu-item>\n              <a-menu-item :disabled=\"cellProps.disabled\" v-if=\"originColumn.allowRemove !== false\" @click=\"handleClickDeleteFile\">\n                <span><Icon icon=\"ant-design:delete\" />&nbsp;删除</span>\n              </a-menu-item>\n              <a-menu-item :disabled=\"cellProps.disabled\" @click=\"handleMoreOperation\">\n                <span><Icon icon=\"ant-design:bars\" />&nbsp;更多</span>\n              </a-menu-item>\n            </a-menu>\n          </template>\n        </Dropdown>\n      </div>\n    </template>\n\n    <a-upload\n      v-if=\"!cellProps.disabledTable\"\n      v-show=\"!hasFile\"\n      name=\"file\"\n      :data=\"{ isup: 1 }\"\n      :multiple=\"false\"\n      :action=\"uploadAction\"\n      :headers=\"uploadHeaders\"\n      :showUploadList=\"false\"\n      v-bind=\"cellProps\"\n      @change=\"handleChangeUpload\"\n    >\n      <a-button preIcon=\"ant-design:upload\">{{ originColumn.btnText || '点击上传' }}</a-button>\n    </a-upload>\n    <JUploadModal :value=\"modalValue\" @register=\"registerModel\" @change=\"onModalChange\" />\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { UploadTypeEnum } from '/@/components/Form/src/jeecg/components/JUpload';\n  import { JVxeComponent } from '/@/components/jeecg/JVxeTable/types';\n  import { useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks';\n  import { useFileCell, enhanced, components } from '../hooks/useFileCell';\n\n  export default defineComponent({\n    name: 'JVxeFileCell',\n    components: components,\n    props: useJVxeCompProps(),\n    setup(props: JVxeComponent.Props) {\n      return useFileCell(props, UploadTypeEnum.file);\n    },\n    // 【组件增强】注释详见：JVxeComponent.Enhanced\n    enhanced: enhanced,\n  });\n</script>\n\n<style scoped lang=\"less\"></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/JVxeCustom/src/components/JVxeImageCell.vue",
    "content": "<template>\n  <div>\n    <template v-if=\"hasFile\" v-for=\"(file, fileKey) of [innerFile || {}]\" :key=\"fileKey\">\n      <div class=\"j-vxe-image-list\">\n        <template v-if=\"!file || !(file['url'] || file['path'] || file['message'])\">\n          <a-tooltip :title=\"'请稍后: ' + JSON.stringify(file) + (file['url'] || file['path'] || file['message'])\">\n            <LoadingOutlined />\n          </a-tooltip>\n        </template>\n        <template v-else-if=\"file['path']\">\n          <template v-for=\"src of imgList\">\n            <img class=\"j-vxe-image\" :src=\"src\" alt=\"图片错误\" @[clickEvent]=\"handleMoreOperation\" @click=\"handlePreview\" />\n          </template>\n        </template>\n        <a-tooltip v-else :title=\"file.message || '上传失败'\" @[clickEvent]=\"handleClickShowImageError\">\n          <Icon icon=\"ant-design:exclamation-circle\" style=\"color: red\" />\n        </a-tooltip>\n      </div>\n    </template>\n    <div class=\"j-vxe-image-upload\" v-if=\"!cellProps.disabledTable\">\n      <a-upload\n        :accept=\"acceptFileType\"\n        name=\"file\"\n        :data=\"{ isup: 1 }\"\n        :multiple=\"false\"\n        :action=\"uploadAction\"\n        :headers=\"uploadHeaders\"\n        :showUploadList=\"false\"\n        v-bind=\"cellProps\"\n        @change=\"handleChangeUpload\"\n      >\n        <a-button v-if=\"!hasFile\" preIcon=\"ant-design:upload\">{{ originColumn.btnText || '上传图片' }}</a-button>\n        <div v-if=\"hasFile && imgList.length < maxCount\" class=\"j-vxe-plus\" @click=\"\">\n          <Icon icon=\"ant-design:plus\" />\n        </div>\n      </a-upload>\n    </div>\n    <JUploadModal :value=\"modalValue\" @register=\"registerModel\" @change=\"onModalChange\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { computed, defineComponent ,unref } from 'vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { JVxeComponent } from '/@/components/jeecg/JVxeTable/types';\n  import { useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks';\n  import { UploadTypeEnum } from '/@/components/Form/src/jeecg/components/JUpload';\n  import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';\n  import { components, enhanced, useFileCell } from '../hooks/useFileCell';\n  import { createImgPreview } from '/@/components/Preview/index';\n\n  export default defineComponent({\n    name: 'JVxeImageCell',\n    components: components,\n    props: useJVxeCompProps(),\n    setup(props: JVxeComponent.Props) {\n      \n      const { createErrorModal } = useMessage();\n      const setup = useFileCell(props, UploadTypeEnum.image, { multiple: true });\n      // 代码逻辑说明: 【TV360X-470】jVxetable上传图片组件限制类型\n      const acceptFileType = 'image/*';\n      // 代码逻辑说明: 【issues/953】online子表vxe-table展现形式详情图片上传可点击\n      const clickEvent = computed(() => {\n        return unref(setup.cellProps).disabled ? null : 'click';\n      });\n      const { innerFile, maxCount } = setup;\n\n      const imgList = computed(() => {\n        if (innerFile.value) {\n          if (innerFile.value['url']) {\n            return [innerFile.value['url']];\n          } else if (innerFile.value['path']) {\n            let paths = innerFile.value['path'].split(',');\n            return paths.map((p) => getFileAccessHttpUrl(p));\n          }\n        }\n        return [];\n      });\n\n      // 弹出上传出错详细信息\n      function handleClickShowImageError() {\n        let file = innerFile.value || null;\n        if (file && file['message']) {\n          createErrorModal({\n            title: '上传出错',\n            content: '错误信息：' + file['message'],\n            maskClosable: true,\n          });\n        }\n      }\n      // 代码逻辑说明: 【TV360X-121】jvxetable文件组件禁用状态(详情)下可下载\n      const handlePreview = () => {\n        if (unref(setup.cellProps).disabled) {\n          createImgPreview({ imageList: imgList.value });\n        }\n      };\n      return {\n        ...setup,\n        imgList,\n        maxCount,\n        handleClickShowImageError,\n        clickEvent,\n        handlePreview,\n        acceptFileType,\n      };\n    },\n    // 【组件增强】注释详见：JVxeComponent.Enhanced\n    enhanced: enhanced,\n  });\n</script>\n\n<style scoped lang=\"less\">\n  .j-vxe-image {\n    height: 32px;\n    max-width: 100px !important;\n    cursor: pointer;\n    display: inline-block;\n    margin-right: 4px;\n    vertical-align: top;\n\n    &:hover {\n      opacity: 0.8;\n    }\n\n    &:active {\n      opacity: 0.6;\n    }\n  }\n\n  .j-vxe-plus {\n    width: 32px;\n    height: 32px;\n    line-height: 32px;\n    text-align: center;\n    background-color: #fafafa;\n    border: 1px dashed #d9d9d9;\n    border-radius: 2px;\n    cursor: pointer;\n  }\n\n  .j-vxe-image-list,\n  .j-vxe-image-upload {\n    display: inline-block;\n    vertical-align: top;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/JVxeCustom/src/components/JVxePcaCell.vue",
    "content": "<template>\n    <a-cascader v-bind=\"getProps\" class=\"pca-select\" @change=\"handleChange\" />\n</template>\n\n<script lang=\"ts\">\n  import { computed, defineComponent } from 'vue';\n  import { regionData, getRealCode } from '/@/components/Form/src/utils/areaDataUtil';\n  import { JVxeComponent } from '/@/components/jeecg/JVxeTable/types';\n  import { useJVxeComponent, useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks';\n  import { dispatchEvent } from '/@/components/jeecg/JVxeTable/utils';\n\n  export default defineComponent({\n    name: 'JVxePcaCell',\n    props: useJVxeCompProps(),\n    setup(props: JVxeComponent.Props) {\n      const { innerValue, cellProps, handleChangeCommon } = useJVxeComponent(props);\n\n      const selectedValue = computed(() => {\n        let val: any = innerValue.value;\n        if (!val) {\n          return []\n        }\n        let arr = getRealCode(val, 3);\n        return arr;\n      });\n\n      const getProps = computed(() => {\n        return {\n          ...cellProps.value,\n          options: regionData,\n          showOverflow: false,\n          value: selectedValue.value,\n        };\n      });\n      \n      function handleChange(arr) {\n        let str = '';\n        if(arr && arr.length==3){\n          str = arr[2];\n        }\n        handleChangeCommon(str);\n      }\n\n      return {\n        handleChange,\n        selectedValue,\n        getProps\n      };\n    },\n    // 【组件增强】注释详见：JVxeComponent.Enhanced\n    enhanced: {\n      switches: {\n        visible: true,\n      },\n      translate: {\n        enabled: false,\n      },\n      aopEvents: {\n        editActived({ $event }) {\n          dispatchEvent({\n            $event,\n            props: this.props,\n            className: '.ant-select .ant-select-selection-search-input',\n            isClick: true,\n          });\n        },\n      },\n    } as JVxeComponent.EnhancedPartial,\n  });\n</script>\n<style lang=\"less\">\n    .pca-select{\n        .ant-select-selection-placeholder{\n            color: #bfbfbf !important;\n        }\n    }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/JVxeCustom/src/components/JVxePopupCell.vue",
    "content": "<template>\n  <JPopup v-bind=\"popupProps\" @focus=\"handleFocus\" />\n</template>\n<script lang=\"ts\">\n  import { computed, defineComponent, ref } from 'vue';\n  //import { JPopup } from '/@/components/Form';\n  import JPopup from '/@/components/Form/src/jeecg/components/JPopup.vue';\n  import { JVxeComponent } from '/@/components/jeecg/JVxeTable/types';\n  import { useJVxeComponent, useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks';\n  import { dispatchEvent, vModel } from '/@/components/jeecg/JVxeTable/utils';\n  import { isEmpty } from '/@/utils/is';\n\n  export default defineComponent({\n    name: 'JVxePopupCell',\n    components: { JPopup },\n    props: useJVxeCompProps(),\n    setup(props: JVxeComponent.Props) {\n      const { innerValue, row, originColumn, cellProps, handleChangeCommon } = useJVxeComponent(props);\n      const groupId = ref<string>('j-vxe-popup');\n      const popupProps = computed(() => {\n        // 代码逻辑说明: 【issues/5371】一对多子表popup增加多选\n        return {\n          ...cellProps.value,\n          value: innerValue.value,\n          field: originColumn.value.field || originColumn.value.key,\n          code: originColumn.value.popupCode,\n          fieldConfig: originColumn.value.fieldConfig,\n          // orgFields: originColumn.value.orgFields,\n          // destFields: originColumn.value.destFields,\n          groupId: groupId.value,\n          param: originColumn.value.params,\n          sorter: originColumn.value.sorter,\n          setFieldsValue: (values) => {\n            if (!isEmpty(values)) {\n              let popupValue = '';\n              Object.keys(values).forEach((key) => {\n                let currentValue = values[key];\n                // 当前列直接赋值，其他列通过vModel赋值\n                if (key === originColumn.value.key) {\n                  popupValue = currentValue;\n                } else {\n                  vModel(currentValue, row, key);\n                }\n              });\n              handleChangeCommon(popupValue);\n            }\n          },\n        };\n      });\n      // 代码逻辑说明: 【issues/675】子表字段Popup弹框数据不更新\n      const handleFocus = () => {\n        groupId.value = '';\n      };\n      return {\n        handleFocus,\n        popupProps,\n      };\n    },\n    // 【组件增强】注释详见：JVxeComponent.Enhanced\n    enhanced: {\n      aopEvents: {\n        editActived({ $event }) {\n          dispatchEvent({\n            $event,\n            props: this.props,\n            className: '.ant-input',\n            isClick: true,\n          });\n        },\n      },\n    } as JVxeComponent.EnhancedPartial,\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/JVxeCustom/src/components/JVxeSelectDictSearchCell.ts",
    "content": "import { computed, ref, watch, defineComponent, h } from 'vue';\nimport { cloneDeep, debounce } from 'lodash-es';\nimport { defHttp } from '/@/utils/http/axios';\nimport { filterDictText } from '/@/utils/dict/JDictSelectUtil';\nimport { ajaxGetDictItems, getDictItemsByCode } from '/@/utils/dict';\nimport { JVxeComponent } from '/@/components/jeecg/JVxeTable/types';\nimport { dispatchEvent } from '/@/components/jeecg/JVxeTable/utils';\nimport { useResolveComponent as rc } from '/@/components/jeecg/JVxeTable/hooks';\nimport { useJVxeComponent, useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks';\nimport { useMessage } from '/@/hooks/web/useMessage';\n\n/** value - label map，防止重复查询（刷新清空缓存） */\nconst LabelMap = new Map<string, any>();\n// 请求id\nlet requestId = 0;\n\n/** 显示组件，自带翻译 */\nexport const DictSearchSpanCell = defineComponent({\n  name: 'JVxeSelectSearchSpanCell',\n  props: useJVxeCompProps(),\n  setup(props: JVxeComponent.Props) {\n    const { innerOptions, innerSelectValue, innerValue } = useSelectDictSearch(props);\n    return () => {\n      return h('span', {}, [filterDictText(innerOptions.value, innerSelectValue.value || innerValue.value)]);\n    };\n  },\n});\n\n// 输入选择组件\nexport const DictSearchInputCell = defineComponent({\n  name: 'JVxeSelectSearchInputCell',\n  props: useJVxeCompProps(),\n  setup(props: JVxeComponent.Props) {\n    const { createMessage } = useMessage();\n    const { dict, loading, isAsync, options, innerOptions, originColumn, cellProps, innerSelectValue, handleChangeCommon } =\n      useSelectDictSearch(props);\n    const hasRequest = ref(false);\n    // 提示信息\n    const tipsContent = computed(() => {\n      return originColumn.value.tipsContent || '请输入搜索内容';\n    });\n    // 筛选函数\n    const filterOption = computed(() => {\n      if (isAsync.value) {\n        //【jeecgboot-vue3/issues/I5QRT8】JVxeTypes.selectDictSearch sync问题\n        return ()=>true;\n      }\n      return (input, option) => option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0;\n    });\n\n    /** 加载数据 */\n    const loadData = debounce((value) => {\n      const currentRequestId = ++requestId;\n      loading.value = true;\n      innerOptions.value = [];\n      if (value == null || value.trim() === '') {\n        loading.value = false;\n        hasRequest.value = false;\n        return;\n      }\n      // 字典code格式：table,text,code\n      hasRequest.value = true;\n      loadDictByKeyword(dict.value, value)\n        .then((res) => {\n          if (currentRequestId !== requestId) {\n            return;\n          }\n          let { success, result, message } = res;\n          if (success) {\n            innerOptions.value = result;\n            result.forEach((item) => {\n              LabelMap.set(item.value, [item]);\n            });\n          } else {\n            createMessage.warning(message || '查询失败');\n          }\n        })\n        .finally(() => {\n          loading.value = false;\n        });\n    }, 300);\n\n    function handleChange(selectedValue) {\n      innerSelectValue.value = selectedValue;\n      handleChangeCommon(innerSelectValue.value);\n    }\n\n    function handleSearch(value) {\n      if (isAsync.value) {\n        // 在输入时也应该开启加载，因为loadData加了消抖，所以会有800ms的用户主观上认为的卡顿时间\n        loading.value = true;\n        if (innerOptions.value.length > 0) {\n          innerOptions.value = [];\n        }\n        loadData(value);\n      }\n    }\n\n    function renderOptionItem() {\n      let optionItems: any[] = [];\n      options.value.forEach(({ value, text, label, title, disabled }) => {\n        optionItems.push(\n          h(\n            rc('a-select-option'),\n            {\n              key: value,\n              value: value,\n              disabled: disabled,\n            },\n            {\n              default: () => text || label || title,\n            }\n          )\n        );\n      });\n      return optionItems;\n    }\n\n    return () => {\n      return h(\n        rc('a-select'),\n        {\n          ...cellProps.value,\n          value: innerSelectValue.value,\n          filterOption: filterOption.value,\n          showSearch: true,\n          allowClear: true,\n          autofocus: true,\n          defaultOpen: true,\n          style: 'width: 100%',\n          onSearch: handleSearch,\n          onChange: handleChange,\n        },\n        {\n          default: () => renderOptionItem(),\n          notFoundContent: () => {\n            if (loading.value) {\n              return h(rc('a-spin'), { size: 'small' });\n            } else if (hasRequest.value) {\n              return h('div', '没有查询到任何数据');\n            } else {\n              return h('div', [tipsContent.value]);\n            }\n          },\n        }\n      );\n    };\n  },\n  // 【组件增强】注释详见：JVxeComponent.Enhanced\n  enhanced: {\n    aopEvents: {\n      editActived({ $event }) {\n        dispatchEvent({\n          $event,\n          props: this.props,\n          className: '.ant-select .ant-select-selection-search-input',\n          isClick: false,\n          handler: (el) => el.focus(),\n        });\n      },\n    },\n  } as JVxeComponent.EnhancedPartial,\n});\n\nfunction useSelectDictSearch(props) {\n  const setup = useJVxeComponent(props);\n  const { innerValue, originColumn } = setup;\n\n  // 加载状态\n  const loading = ref(false);\n  // 内部选择值\n  const innerSelectValue = ref(null);\n  // 内部 options\n  const innerOptions = ref<any[]>([]);\n\n  const dict = computed(() => originColumn.value.dict);\n  // 是否是异步模式\n  const isAsync = computed(() => {\n    let isAsync = originColumn.value.async;\n    return isAsync != null && isAsync !== '' ? !!isAsync : true;\n  });\n  const options = computed(() => {\n    if (isAsync.value) {\n      return innerOptions.value;\n    } else {\n      return originColumn.value.options || [];\n    }\n  });\n\n  /** 公共属性监听 */\n  watch(\n    innerValue,\n    (value: string) => {\n      if (value == null || value === '') {\n        innerSelectValue.value = null;\n      } else {\n        loadDataByValue(value);\n      }\n    },\n    { immediate: true }\n  );\n  watch(dict, () => loadDataByDict());\n\n  // 根据 value 查询数据，用于回显\n  async function loadDataByValue(value) {\n    if (isAsync.value) {\n      if (innerSelectValue.value !== value) {\n        if (LabelMap.has(value)) {\n          innerOptions.value = cloneDeep(LabelMap.get(value));\n        } else {\n          let result = await loadDictItem(dict.value, value);\n          if (result && result.length > 0) {\n            innerOptions.value = [{ value: value, text: result[0] }];\n            LabelMap.set(value, cloneDeep(innerOptions.value));\n          }\n        }\n      }\n    }\n    innerSelectValue.value = (value || '').toString();\n  }\n\n  // 初始化字典\n  async function loadDataByDict() {\n    if (!isAsync.value) {\n      // 如果字典项集合有数据\n      if (!originColumn.value.options || originColumn.value.options.length === 0) {\n        // 根据字典Code, 初始化字典数组\n        let dictStr = '';\n        if (dict.value) {\n          let arr = dict.value.split(',');\n          if (arr[0].indexOf('where') > 0) {\n            let tbInfo = arr[0].split('where');\n            dictStr = tbInfo[0].trim() + ',' + arr[1] + ',' + arr[2] + ',' + encodeURIComponent(tbInfo[1]);\n          } else {\n            dictStr = dict.value;\n          }\n          if (dict.value.indexOf(',') === -1) {\n            //优先从缓存中读取字典配置\n            let cache = getDictItemsByCode(dict.value);\n            if (cache) {\n              innerOptions.value = cache;\n              return;\n            }\n          }\n          let { success, result } = await ajaxGetDictItems(dictStr, null);\n          if (success) {\n            innerOptions.value = result;\n          }\n        }\n      }\n    }\n  }\n\n  return {\n    ...setup,\n    loading,\n    innerOptions,\n    innerSelectValue,\n    dict,\n    isAsync,\n    options,\n  };\n}\n\n/** 获取字典项 */\nfunction loadDictItem(dict: string, key: string) {\n  return defHttp.get({\n    url: `/sys/dict/loadDictItem/${dict}`,\n    params: {\n      key: key,\n    },\n  });\n}\n\n/** 根据关键字获取字典项（搜索） */\nfunction loadDictByKeyword(dict: string, keyword: string) {\n  return defHttp.get(\n    {\n      url: `/sys/dict/loadDict/${dict}`,\n      params: {\n        keyword: keyword,\n      },\n    },\n    {\n      isTransformResponse: false,\n    }\n  );\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/JVxeCustom/src/components/JVxeUserSelectCell.vue",
    "content": "<template>\n  <div :class=\"[prefixCls]\">\n    <JSelectUser v-bind=\"getProps\" @change=\"handleChange\" />\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { computed, defineComponent } from 'vue';\n  //import { JSelectUser } from '/@/components/Form';\n  import JSelectUser from '/@/components/Form/src/jeecg/components/JSelectUser.vue';\n  import { JVxeComponent } from '/@/components/jeecg/JVxeTable/types';\n  import { useJVxeComponent, useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks';\n  import { dispatchEvent } from '/@/components/jeecg/JVxeTable/utils';\n  import { isArray, isEmpty, isString } from '/@/utils/is';\n\n  export default defineComponent({\n    name: 'JVxeUserSelectCell',\n    components: { JSelectUser },\n    props: useJVxeCompProps(),\n    setup(props: JVxeComponent.Props) {\n      const { innerValue, cellProps, handleChangeCommon, useCellDesign, originColumn } = useJVxeComponent(props);\n      const { prefixCls } = useCellDesign('user-select');\n\n      const selectedValue = computed(() => {\n        let val: any = innerValue.value;\n        if (val == null) {\n          return val;\n        }\n        if (isEmpty(val)) {\n          return [];\n        }\n        if (isArray(val)) {\n          return val;\n        }\n        if (isString(val)) {\n          // @ts-ignore\n          return val.split(',');\n        }\n        return [val];\n      });\n      // @ts-ignore\n      const multiple = computed(() => cellProps.value.multi != false);\n\n      const getProps = computed(() => {\n        return {\n          ...cellProps.value,\n          value: selectedValue.value,\n          showButton: false,\n          // 不允许搜索\n          showSearch: false,\n          // 设置最大的显示个数\n          // 代码逻辑说明: 【issues/7661】vxetable用户组件maxTagCount通过业务传递\n          maxTagCount: originColumn.value.maxTagCount ?? 1,\n          // 显示提示重写，去掉省略号\n          maxTagPlaceholder: ({ length }) => '+' + length,\n          // -update-begin--author:liaozhiyang---date:20240617---for：【TV360X-1002】详情页面行编辑用户组件和部门组件显示方式优化\n          isDetailsMode: cellProps.value.disabledTable,\n          // -update-end--author:liaozhiyang---date:20240617---for：【TV360X-1002】详情页面行编辑用户组件和部门组件显示方式优化\n        };\n      });\n\n      function handleChange(values) {\n        handleChangeCommon(values.join(','));\n      }\n\n      return {\n        prefixCls,\n        selectedValue,\n        multiple,\n        cellProps,\n        getProps,\n        handleChange,\n      };\n    },\n    enhanced: {\n      switches: {\n        visible: true,\n      },\n      translate: {\n        enabled: false,\n      },\n      aopEvents: {\n        editActived({ $event }) {\n          dispatchEvent({\n            $event,\n            props: this.props,\n            className: '.ant-select .ant-select-selection-search-input',\n            isClick: true,\n          });\n        },\n      },\n    } as JVxeComponent.EnhancedPartial,\n  });\n</script>\n\n<style lang=\"less\">\n  // noinspection LessUnresolvedVariable\n  @prefix-cls: ~'@{namespace}-vxe-cell-user-select';\n\n  .@{prefix-cls} {\n    // 限制tag最大长度为100px，防止选中文字过多的选项时换行\n    .ant-select .ant-select-selection-overflow-item {\n      max-width: 80px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/JVxeCustom/src/hooks/useFileCell.ts",
    "content": "import { computed } from 'vue';\nimport { fileGetValue, fileSetValue, useJVxeUploadCell } from '/@/components/jeecg/JVxeTable/src/hooks/cells/useJVxeUploadCell';\nimport { uploadUrl } from '/@/api/common/api';\nimport { JUploadModal, UploadTypeEnum } from '/@/components/Form/src/jeecg/components/JUpload';\nimport { useModal } from '/@/components/Modal';\nimport { JVxeComponent } from '/@/components/jeecg/JVxeTable/src/types/JVxeComponent';\nimport { Icon } from '/@/components/Icon';\nimport { Dropdown } from 'ant-design-vue';\nimport { LoadingOutlined } from '@ant-design/icons-vue';\n\nexport function useFileCell(props, fileType: UploadTypeEnum, options?) {\n  const setup = useJVxeUploadCell(props, { token: true, action: uploadUrl, ...options });\n\n  const { innerFile, handleChangeCommon, originColumn } = setup;\n  const [registerModel, { openModal }] = useModal();\n\n  // 截取文件名\n  const ellipsisFileName = computed(() => {\n    let length = 5;\n    let file = innerFile.value;\n    if (!file || !file.name) {\n      return '';\n    }\n    if (file.name.length > length) {\n      return file.name.substr(0, length) + '…';\n    }\n    return file.name;\n  });\n\n  const modalValue = computed(() => {\n    if (innerFile.value) {\n      if (innerFile.value['url']) {\n        return innerFile.value['url'];\n      } else if (innerFile.value['path']) {\n        return innerFile.value['path'];\n      }\n    }\n    return '';\n  });\n\n  const maxCount = computed(() => {\n    let maxCount = originColumn.value.maxCount;\n    // online 扩展JSON\n    if (originColumn.value && originColumn.value.fieldExtendJson) {\n      let json = JSON.parse(originColumn.value.fieldExtendJson);\n      maxCount = json.uploadnum ? json.uploadnum : 0;\n    }\n    return maxCount ?? 0;\n  });\n\n  // 点击更多按钮\n  function handleMoreOperation() {\n    openModal(true, {\n      removeConfirm: true,\n      mover: true,\n      download: true,\n      ...originColumn.value.props,\n      maxCount: maxCount.value,\n      fileType: fileType,\n      action: originColumn.value.action ?? void 0,\n    });\n  }\n\n  // 更多上传回调\n  function onModalChange(path) {\n    if (path) {\n      // 代码逻辑说明: 【TV360X-235】富文本禁用状态下图片上传按钮文字看不清\n      if (innerFile.value === null) {\n        innerFile.value = {};\n      }\n      innerFile.value.path = path;\n      handleChangeCommon(innerFile.value);\n    } else {\n      // 代码逻辑说明: [issues/530]JVxeTable 的JVxeTypes.image类型，无法全部删除上传图片\n      handleChangeCommon(null);\n    }\n  }\n\n  return {\n    ...setup,\n    modalValue,\n    maxCount,\n    ellipsisFileName,\n    registerModel,\n    onModalChange,\n    handleMoreOperation,\n  };\n}\n\nexport const components = {\n  Icon,\n  Dropdown,\n  LoadingOutlined,\n  JUploadModal,\n};\n\nexport const enhanced = {\n  switches: { visible: true },\n  getValue: (value) => fileGetValue(value),\n  setValue: (value) => fileSetValue(value),\n} as JVxeComponent.EnhancedPartial;\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Loading/index.ts",
    "content": "import Loading from './src/Loading.vue';\n\nexport { Loading };\nexport { useLoading } from './src/useLoading';\nexport { createLoading } from './src/createLoading';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Loading/src/Loading.vue",
    "content": "<template>\n  <section\n    class=\"full-loading\"\n    :class=\"{ absolute, [theme]: !!theme }\"\n    :style=\"[background ? `background-color: ${background}` : '']\"\n    v-show=\"loading\"\n  >\n    <Spin v-bind=\"$attrs\" :tip=\"tip\" :size=\"size\" :spinning=\"loading\" />\n  </section>\n</template>\n<script lang=\"ts\">\n  import { PropType } from 'vue';\n  import { defineComponent } from 'vue';\n  import { Spin } from 'ant-design-vue';\n  import { SizeEnum } from '/@/enums/sizeEnum';\n\n  export default defineComponent({\n    name: 'Loading',\n    components: { Spin },\n    props: {\n      tip: {\n        type: String as PropType<string>,\n        default: '',\n      },\n      size: {\n        type: String as PropType<SizeEnum>,\n        default: SizeEnum.LARGE,\n        validator: (v: SizeEnum): boolean => {\n          return [SizeEnum.DEFAULT, SizeEnum.SMALL, SizeEnum.LARGE].includes(v);\n        },\n      },\n      absolute: {\n        type: Boolean as PropType<boolean>,\n        default: false,\n      },\n      loading: {\n        type: Boolean as PropType<boolean>,\n        default: false,\n      },\n      background: {\n        type: String as PropType<string>,\n      },\n      theme: {\n        type: String as PropType<'dark' | 'light'>,\n      },\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .full-loading {\n    position: fixed;\n    top: 0;\n    left: 0;\n    z-index: 200;\n    display: flex;\n    width: 100%;\n    height: 100%;\n    justify-content: center;\n    align-items: center;\n    background-color: rgba(240, 242, 245, 0.4);\n\n    &.absolute {\n      position: absolute;\n      top: 0;\n      left: 0;\n      z-index: 300;\n    }\n  }\n\n  html[data-theme='dark'] {\n    .full-loading:not(.light) {\n      background-color: @modal-mask-bg;\n    }\n  }\n\n  .full-loading.dark {\n    background-color: @modal-mask-bg;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Loading/src/createLoading.ts",
    "content": "import { VNode, defineComponent } from 'vue';\nimport type { LoadingProps } from './typing';\n\nimport { createVNode, render, reactive, h } from 'vue';\nimport Loading from './Loading.vue';\n\nexport function createLoading(props?: Partial<LoadingProps>, target?: HTMLElement, wait = false) {\n  let vm: Nullable<VNode> = null;\n  const data = reactive({\n    tip: '',\n    loading: true,\n    ...props,\n  });\n\n  const LoadingWrap = defineComponent({\n    render() {\n      return h(Loading, { ...data });\n    },\n  });\n\n  vm = createVNode(LoadingWrap);\n\n  if (wait) {\n    // TODO fix https://github.com/anncwb/vue-Jeecg-admin/issues/438\n    setTimeout(() => {\n      render(vm, document.createElement('div'));\n    }, 0);\n  } else {\n    render(vm, document.createElement('div'));\n  }\n\n  function close() {\n    if (vm?.el && vm.el.parentNode) {\n      vm.el.parentNode.removeChild(vm.el);\n    }\n  }\n\n  function open(target: HTMLElement = document.body) {\n    if (!vm || !vm.el) {\n      return;\n    }\n    target.appendChild(vm.el as HTMLElement);\n  }\n\n  if (target) {\n    open(target);\n  }\n  return {\n    vm,\n    close,\n    open,\n    setTip: (tip: string) => {\n      data.tip = tip;\n    },\n    setLoading: (loading: boolean) => {\n      data.loading = loading;\n    },\n    get loading() {\n      return data.loading;\n    },\n    get $el() {\n      return vm?.el as HTMLElement;\n    },\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Loading/src/typing.ts",
    "content": "import { SizeEnum } from '/@/enums/sizeEnum';\n\nexport interface LoadingProps {\n  tip: string;\n  size: SizeEnum;\n  absolute: boolean;\n  loading: boolean;\n  background: string;\n  theme: 'dark' | 'light';\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Loading/src/useLoading.ts",
    "content": "import { unref } from 'vue';\nimport { createLoading } from './createLoading';\nimport type { LoadingProps } from './typing';\nimport type { Ref } from 'vue';\n\nexport interface UseLoadingOptions {\n  target?: any;\n  props?: Partial<LoadingProps>;\n}\n\ninterface Fn {\n  (): void;\n}\n\nexport function useLoading(props: Partial<LoadingProps>): [Fn, Fn, (string) => void];\nexport function useLoading(opt: Partial<UseLoadingOptions>): [Fn, Fn, (string) => void];\n\nexport function useLoading(opt: Partial<LoadingProps> | Partial<UseLoadingOptions>): [Fn, Fn, (string) => void] {\n  let props: Partial<LoadingProps>;\n  let target: HTMLElement | Ref<ElRef> = document.body;\n\n  if (Reflect.has(opt, 'target') || Reflect.has(opt, 'props')) {\n    const options = opt as Partial<UseLoadingOptions>;\n    props = options.props || {};\n    target = options.target || document.body;\n  } else {\n    props = opt as Partial<LoadingProps>;\n  }\n\n  const instance = createLoading(props, undefined, true);\n\n  const open = (): void => {\n    const t = unref(target as Ref<ElRef>);\n    if (!t) return;\n    instance.open(t);\n  };\n\n  const close = (): void => {\n    instance.close();\n  };\n\n  const setTip = (tip: string) => {\n    instance.setTip(tip);\n  };\n\n  return [open, close, setTip];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Markdown/index.ts",
    "content": "import { withInstall } from '/@/utils';\nimport markDown from './src/Markdown.vue';\nimport markDownViewer from './src/MarkdownViewer.vue';\n\nexport const MarkDown = withInstall(markDown);\nexport const MarkdownViewer = withInstall(markDownViewer);\nexport * from './src/typing';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Markdown/src/Markdown.vue",
    "content": "<template>\n  <div ref=\"wrapRef\"></div>\n</template>\n<script lang=\"ts\">\n  import type { Ref } from 'vue';\n  import { defineComponent, ref, unref, nextTick, computed, watch, onBeforeUnmount, onDeactivated } from 'vue';\n  import Vditor from 'vditor';\n  import 'vditor/dist/index.css';\n  import { useLocale } from '/@/locales/useLocale';\n  import { useModalContext } from '../../Modal';\n  import { useRootSetting } from '/@/hooks/setting/useRootSetting';\n  import { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated';\n  import { getTenantId, getToken } from '/@/utils/auth';\n  import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';\n  import { uploadFile } from '@/api/common/api';\n  import {$electron} from \"@/electron\";\n\n  type Lang = 'zh_CN' | 'en_US' | 'ja_JP' | 'ko_KR' | undefined;\n\n  export default defineComponent({\n    inheritAttrs: false,\n    props: {\n      height: { type: Number, default: 360 },\n      value: { type: String, default: '' },\n    },\n    emits: ['change', 'get', 'update:value'],\n    setup(props, { attrs, emit }) {\n      console.log(\"---Markdown---初始化---\")\n      const wrapRef = ref<ElRef>(null);\n      const vditorRef = ref(null) as Ref<Nullable<Vditor>>;\n      const initedRef = ref(false);\n\n      const modalFn = useModalContext();\n\n      const { getLocale } = useLocale();\n      const { getDarkMode } = useRootSetting();\n      const valueRef = ref(props.value || '');\n\n      watch(\n        [() => getDarkMode.value, () => initedRef.value],\n        ([val, inited]) => {\n          if (!inited) {\n            return;\n          }\n          const theme = val === 'dark' ? 'dark' : 'classic';\n          instance.getVditor()?.setTheme(theme);\n        },\n        {\n          immediate: true,\n          flush: 'post',\n        }\n      );\n\n      watch(\n        () => props.value,\n        (v) => {\n          if (v !== valueRef.value) {\n            instance.getVditor()?.setValue(v);\n          }\n          valueRef.value = v;\n        }\n      );\n\n      const getCurrentLang = computed((): 'zh_CN' | 'en_US' | 'ja_JP' | 'ko_KR' => {\n        let lang: Lang;\n        switch (unref(getLocale)) {\n          case 'en':\n            lang = 'en_US';\n            break;\n          case 'ja':\n            lang = 'ja_JP';\n            break;\n          case 'ko':\n            lang = 'ko_KR';\n            break;\n          default:\n            lang = 'zh_CN';\n        }\n        return lang;\n      });\n      // 代码逻辑说明: VUEN-1090 markdown 无法上传\n      const uploadUrl = `${window._CONFIG['domianURL']}/sys/common/upload`;\n      const token = getToken();\n      const tenantId = getTenantId() ? getTenantId() : '0';\n      function formatResult(files, responseText): string {\n        let data: any = JSON.parse(responseText);\n        // {\"success\":true,\"message\":\"markdown/aa_1653391146501.png\",\"code\":0,\"result\":null,\"timestamp\":1653391146501}'\n        let filename = files[0].name as string;\n        let result = {\n          msg: '',\n          code: 0,\n          data: {\n            errFiles: [''],\n            succMap: {},\n          },\n        };\n        if (data.success) {\n          result.data.errFiles = [];\n          result.data.succMap = {\n            [data.message]: getFileAccessHttpUrl(data.message),\n          };\n        } else {\n          result.code = 1;\n          result.msg = data.message;\n          result.data.errFiles = [filename];\n        }\n        return JSON.stringify(result);\n      }\n      function init() {\n        const wrapEl = unref(wrapRef) as HTMLElement;\n        if (!wrapEl) return;\n\n        // vditor组件本地化的路径配置【QQYUN-12053】\n        let localCdn = '/resource/vditor@3.9.4';\n        if ($electron.isElectron()) {\n          localCdn = '.' + localCdn;\n        }\n\n        const bindValue = { ...attrs, ...props };\n        const insEditor = new Vditor(wrapEl, {\n          theme: getDarkMode.value === 'dark' ? 'dark' : 'classic',\n          lang: unref(getCurrentLang),\n          // 代码逻辑说明: 【TV360X-146】Markdown组件去掉录音选项\n          toolbar: [\n            'emoji',\n            'headings',\n            'bold',\n            'italic',\n            'strike',\n            'link',\n            '|',\n            'list',\n            'ordered-list',\n            'check',\n            'outdent',\n            'indent',\n            '|',\n            'quote',\n            'line',\n            'code',\n            'inline-code',\n            'insert-before',\n            'insert-after',\n            '|',\n            'upload',\n            // 'record',\n            'table',\n            '|',\n            'undo',\n            'redo',\n            '|',\n            'fullscreen',\n            'edit-mode',\n            {\n              name: 'more',\n              toolbar: ['both', 'code-theme', 'content-theme', 'export', 'outline', 'preview', 'devtools', 'info', 'help'],\n            },\n          ],\n          mode: 'sv',\n          cdn: 'https://unpkg.com/vditor@3.10.8',\n          //cdn: localCdn,\n          fullscreen: {\n            index: 520,\n          },\n          preview: {\n            actions: [],\n          },\n          // 代码逻辑说明: VUEN-1090 markdown 无法上传\n          upload: {\n            accept: 'image/*',\n            //url: uploadUrl,\n            fieldName: 'file',\n            extraData: { biz: 'markdown' },\n            setHeaders() {\n              return {\n                'X-Access-Token': token as string,\n                'X-Tenant-Id': tenantId,\n              };\n            },\n            format(files, response) {\n              return formatResult(files, response);\n            },\n            // 遍历文件上传并展示\n            async handler(files) {\n              const uploadSuccess = (res) => {\n                // {\"success\":true,\"message\":\"markdown/aa_1653391146501.png\",\"code\":0,\"result\":null,\"timestamp\":1653391146501}'\n                if (res.success) {\n                  vditorRef.value?.insertValue(`![${res.message}](${getFileAccessHttpUrl(res.message)})`);\n                }\n              };\n              for (const file of files) {\n                let params = {\n                  file: file,\n                  filename: file.name,\n                  data: { biz: 'markdown' },\n                };\n                await uploadFile(params, uploadSuccess);\n              }\n            },\n          },\n          input: (v) => {\n            valueRef.value = v;\n            emit('update:value', v);\n            emit('change', v);\n          },\n          after: () => {\n            nextTick(() => {\n              modalFn?.redoModalHeight?.();\n              insEditor.setValue(valueRef.value);\n              vditorRef.value = insEditor;\n              initedRef.value = true;\n              emit('get', instance);\n            });\n          },\n          blur: () => {\n            //unref(vditorRef)?.setValue(props.value);\n          },\n          ...bindValue,\n          cache: {\n            enable: false,\n          },\n        });\n      }\n\n      const instance = {\n        getVditor: (): Vditor => vditorRef.value!,\n      };\n\n      function destroy() {\n        const vditorInstance = unref(vditorRef);\n        if (!vditorInstance) return;\n        try {\n          vditorInstance?.destroy?.();\n        } catch (error) {}\n        vditorRef.value = null;\n        initedRef.value = false;\n      }\n\n      onMountedOrActivated(init);\n\n      onBeforeUnmount(destroy);\n      onDeactivated(destroy);\n      return {\n        wrapRef,\n        ...instance,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  // 代码逻辑说明: 【TV360X-318】解决markdown控件禁用状态放大按钮还可以点击\n  :deep(.vditor-menu--disabled) {\n    pointer-events: none;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Markdown/src/MarkdownViewer.vue",
    "content": "<template>\n  <!-- <div v-html=\"getHtmlData\" :class=\"$props.class\" class=\"markdown-viewer markdown-body\"></div> -->\n  <div class=\"preview\" :class=\"[{ preview_dark: isDarkTheme }]\">\n    <div v-html=\"getHtmlData\" :class=\"$props.class\" class=\"markdown-viewer vditor-reset\"></div>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { computed, watch, ref } from 'vue';\n  import showdown from 'showdown';\n  import 'vditor/dist/index.css';\n  import { useRootSetting } from '/@/hooks/setting/useRootSetting';\n  import { ThemeEnum } from '/@/enums/appEnum';\n  \n  const converter = new showdown.Converter();\n  converter.setOption('tables', true);\n  converter.setOption('emoji', true);\n  const props = defineProps({\n    value: { type: String },\n    class: { type: String },\n  });\n  const getHtmlData = computed(() => converter.makeHtml(props.value || ''));\n\n  // 代码逻辑说明: 【issues/918】MarkdownViewer加上暗黑主题\n  const isDarkTheme = ref(false);\n  const { getDarkMode } = useRootSetting();\n  watch(\n    () => getDarkMode.value,\n    (value) => {\n      isDarkTheme.value = value === ThemeEnum.DARK;\n    },\n    { immediate: true }\n  );\n</script>\n\n<style lang=\"less\" scoped>\n  .markdown-viewer {\n    width: 100%;\n  }\n  \n  .preview {\n    width: 100%;\n  }\n  .preview_dark {\n    .vditor-reset {\n      color: #d1d5da;\n    }\n    .vditor-reset a,\n    .vditor-ir__link {\n      color: #4285f4;\n    }\n\n    .vditor-reset h1,\n    .vditor-reset h2 {\n      padding-bottom: 0.3em;\n      border-bottom: 1px solid #d1d5da;\n    }\n    .vditor-reset hr {\n      background-color: #d1d5da;\n    }\n    .vditor-reset blockquote {\n      padding: 0 1em;\n      color: #b9b9b9;\n      border-left: 0.25em solid #d1d5da;\n    }\n    .vditor-reset iframe {\n      border: 1px solid #141414;\n    }\n    .vditor-reset table tr {\n      background-color: #2f363d;\n    }\n    .vditor-reset table td,\n    .vditor-reset table th {\n      border: 1px solid #dfe2e5;\n    }\n    .vditor-reset table tbody tr:nth-child(2n) {\n      background-color: #24292e;\n    }\n    .vditor-reset code:not(.hljs):not(.highlight-chroma) {\n      background-color: rgba(66, 133, 244, 0.36);\n    }\n    .vditor-reset .language-abc svg,\n    .vditor-reset .language-abc path {\n      fill: currentColor;\n      color: #d1d5da;\n    }\n    .language-graphviz polygon {\n      fill: rgba(66, 133, 244, 0.36);\n    }\n    .vditor-reset kbd {\n      color: #d1d5da;\n      background-color: #2f363d;\n      border: 1px solid #141414;\n      box-shadow: inset 0 -1px 0 #141414;\n    }\n    .vditor-copy svg {\n      color: #b9b9b9;\n    }\n    .vditor-speech {\n      background-color: #1d2125;\n      border: 1px solid #141414;\n      color: #b9b9b9;\n    }\n    .vditor-speech--current,\n    .vditor-speech:hover {\n      color: #fff;\n    }\n    .vditor-linkcard a {\n      background-color: #1d2125;\n    }\n    .vditor-linkcard a:visited .vditor-linkcard__abstract {\n      color: hsla(0, 0%, 72.5%, 0.36);\n    }\n    .vditor-linkcard__title {\n      color: #d1d5da;\n    }\n    .vditor-linkcard__abstract {\n      color: #b9b9b9;\n    }\n    .vditor-linkcard__site {\n      color: #fff;\n    }\n    .vditor-linkcard__image {\n      background-color: hsla(0, 0%, 72.5%, 0.36);\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Markdown/src/typing.ts",
    "content": "import Vditor from 'vditor';\nexport interface MarkDownActionType {\n  getVditor: () => Vditor;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Menu/index.ts",
    "content": "import BasicMenu from './src/BasicMenu.vue';\n\nexport { BasicMenu };\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Menu/src/BasicMenu.vue",
    "content": "<template>\n  <Menu\n    :selectedKeys=\"selectedKeys\"\n    :defaultSelectedKeys=\"defaultSelectedKeys\"\n    :mode=\"mode\"\n    :openKeys=\"getOpenKeys\"\n    :inlineIndent=\"inlineIndent\"\n    :theme=\"theme\"\n    @openChange=\"handleOpenChange\"\n    :class=\"getMenuClass\"\n    @click=\"handleMenuClick\"\n    :subMenuOpenDelay=\"0.2\"\n    v-bind=\"getInlineCollapseOptions\"\n  >\n    <template v-for=\"item in items\" :key=\"item.path\">\n      <BasicSubMenuItem :item=\"item\" :theme=\"theme\" :isHorizontal=\"isHorizontal\" />\n    </template>\n  </Menu>\n</template>\n<script lang=\"ts\">\n  import type { MenuState } from './types';\n  import { computed, defineComponent, unref, reactive, watch, toRefs, ref } from 'vue';\n  import { Menu } from 'ant-design-vue';\n  import BasicSubMenuItem from './components/BasicSubMenuItem.vue';\n  import { MenuModeEnum, MenuTypeEnum } from '/@/enums/menuEnum';\n  import { useOpenKeys } from './useOpenKeys';\n  import { RouteLocationNormalizedLoaded, useRouter } from 'vue-router';\n  import { isFunction, isUrl } from '/@/utils/is';\n  import { basicProps } from './props';\n  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\n  import { REDIRECT_NAME } from '/@/router/constant';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { getCurrentParentPath } from '/@/router/menus';\n  import { listenerRouteChange } from '/@/logics/mitt/routeChange';\n  import { getAllParentPath } from '/@/router/helper/menuHelper';\n  import { createBasicRootMenuContext } from './useBasicMenuContext';\n  import { URL_HASH_TAB } from '/@/utils';\n  import { getMenus } from '/@/router/menus';\n\n  const MIX_EXTERNAL_WHITELIST = ['/myapps/index'];\n\n  export default defineComponent({\n    name: 'BasicMenu',\n    components: {\n      Menu,\n      BasicSubMenuItem,\n    },\n    props: basicProps,\n    emits: ['menuClick'],\n    setup(props, { emit }) {\n      const isClickGo = ref(false);\n      const currentActiveMenu = ref('');\n\n      const menuState = reactive<MenuState>({\n        defaultSelectedKeys: [],\n        openKeys: [],\n        selectedKeys: [],\n        collapsedOpenKeys: [],\n      });\n      // 代码逻辑说明: 【QQYUN-8691】顶部菜单模式online不显示菜单名显示默认的auto在线表单\n      createBasicRootMenuContext({ menuState: menuState });\n      const { prefixCls } = useDesign('basic-menu');\n      const { items, mode, accordion } = toRefs(props);\n\n      const { getCollapsed, getTopMenuAlign, getSplit } = useMenuSetting();\n\n      const { currentRoute, getRoutes } = useRouter();\n\n      const { handleOpenChange, setOpenKeys, getOpenKeys } = useOpenKeys(menuState, items, mode as any, accordion);\n\n      const getIsTopMenu = computed(() => {\n        const { type, mode } = props;\n\n        return (type === MenuTypeEnum.TOP_MENU && mode === MenuModeEnum.HORIZONTAL) || (props.isHorizontal && unref(getSplit));\n      });\n\n      const getMenuClass = computed(() => {\n        const align = props.isHorizontal && unref(getSplit) ? 'start' : unref(getTopMenuAlign);\n        return [\n          prefixCls,\n          `justify-${align}`,\n          {\n            [`${prefixCls}__second`]: !props.isHorizontal && unref(getSplit),\n            [`${prefixCls}__sidebar-hor`]: unref(getIsTopMenu),\n          },\n        ];\n      });\n\n      const getInlineCollapseOptions = computed(() => {\n        const isInline = props.mode === MenuModeEnum.INLINE;\n\n        const inlineCollapseOptions: { inlineCollapsed?: boolean } = {};\n        if (isInline) {\n          inlineCollapseOptions.inlineCollapsed = props.mixSider ? false : unref(getCollapsed);\n        }\n        return inlineCollapseOptions;\n      });\n\n      listenerRouteChange((route) => {\n        if (route.name === REDIRECT_NAME) return;\n        handleMenuChange(route);\n        currentActiveMenu.value = route.meta?.currentActiveMenu as string;\n\n        if (unref(currentActiveMenu)) {\n          menuState.selectedKeys = [unref(currentActiveMenu)];\n          setOpenKeys(unref(currentActiveMenu));\n        }\n      });\n\n      !props.mixSider &&\n        watch(\n          () => props.items,\n          () => {\n            handleMenuChange();\n          }\n        );\n\n      // 代码逻辑说明: VUEN-1144 online 配置成菜单后，打开菜单，显示名称未展示为菜单名称\n      async function handleMenuClick({ item, key }: { item: any; key: string; keyPath: string[] }) {\n        const { beforeClickFn } = props;\n        // 代码逻辑说明: 【QQYUN-8773】配置外部网址在顶部菜单模式和搜索打不开\n        if (isUrl(key)) {\n          key = key.replace(URL_HASH_TAB, '#');\n          window.open(key);\n          return;\n        }\n        // 代码逻辑说明: 【issues/7706】顶部栏导航内部路由也可以支持采用新浏览器tab打开\n        const menus = await getMenus();\n        const findItem = getMatchingPath(menus, key);\n        if (findItem?.internalOrExternal == true && !findItem?.children?.length) {\n          // 一级菜单当设置了外部打开，只有没有子菜单时才生效\n          window.open(location.origin + key);\n          return;\n        }\n        if (beforeClickFn && isFunction(beforeClickFn)) {\n          const flag = await beforeClickFn(key);\n          if (!flag) return;\n        }\n        // 代码逻辑说明: 【QQYUN-8773】顶部混合导航(顶部左侧组合菜单)一级菜单没有配置redirect默认跳子菜单的第一个\n        if (props.type === MenuTypeEnum.MIX) {\n          const menuItem = getMatchingPath(menus, key);\n          if (handleMixMenuClick(menuItem, key)) {\n            return;\n          }\n          emit('menuClick', key, item);\n        } else {\n          emit('menuClick', key, item);\n        }\n        // emit('menuClick', key, item);\n\n        isClickGo.value = true;\n        // const parentPath = await getCurrentParentPath(key);\n\n        // menuState.openKeys = [parentPath];\n        menuState.selectedKeys = [key];\n      }\n\n      async function handleMenuChange(route?: RouteLocationNormalizedLoaded) {\n        if (unref(isClickGo)) {\n          isClickGo.value = false;\n          return;\n        }\n        const path = (route || unref(currentRoute)).meta?.currentActiveMenu || (route || unref(currentRoute)).path;\n        setOpenKeys(path);\n        if (unref(currentActiveMenu)) return;\n        if (props.isHorizontal && unref(getSplit)) {\n          const parentPath = await getCurrentParentPath(path);\n          menuState.selectedKeys = [parentPath];\n        } else {\n          const parentPaths = await getAllParentPath(props.items, path);\n          menuState.selectedKeys = parentPaths;\n        }\n      }\n      /**\n       * liaozhiyang\n       * 2024-05-18\n       * 获取指定菜单下的第一个菜单(忽略隐藏路由)\n       */\n      function getSubMenu(menus) {\n        for (let i = 0, len = menus.length; i < len; i++) {\n          const item = menus[i];\n          if (item.path && !item.hideMenu && !item.children?.length) {\n            return item;\n          } else if (item.children?.length) {\n            const result = getSubMenu(item.children);\n            if (result) {\n              return result;\n            }\n          }\n        }\n        return null;\n      }\n\n      /**\n       * liaozhiyang\n       * 2024-05-18\n       * 获取匹配path的菜单\n       */\n      function getMatchingPath(menus, path) {\n        for (let i = 0, len = menus.length; i < len; i++) {\n          const item = menus[i];\n          if (item.path === path) {\n            return item;\n          } else if (item.children?.length) {\n            const result = getMatchingPath(item.children, path);\n            if (result) {\n              return result;\n            }\n          }\n        }\n        return null;\n      }\n      /**\n       * 2025-01-14\n       * liaozhiyang\n       * 获取菜单中匹配的path所在的项\n       */\n      const getMatchingMenu = (menus, path) => {\n        for (let i = 0, len = menus.length; i < len; i++) {\n          const item = menus[i];\n          if (item.path === path && !item.redirect && !item.paramPath) {\n            return item;\n          } else if (item.children?.length) {\n            const result = getMatchingMenu(item.children, path);\n            if (result) {\n              return result;\n            }\n          }\n        }\n        return '';\n      };\n      /*\n      * 2025-11-12\n      * liaozhiyang\n      * 顶部混合导航(顶部左侧组合菜单)一级菜单点击事件处理。\n      * 1.没有重定向打开子菜单的第一个\n      * 2.有重定向判断router中是否存在该路由且路由是否有对应的组件，存在则打开，不存在则打开子菜单的第一个\n      */\n      function handleMixMenuClick(menuItem, key) {\n        const hasChildren = menuItem && menuItem.children?.length;\n        // 不存在子菜单，直接返回\n        if (!hasChildren) {\n          return false;\n        }\n        // 存在redirect，则判断router中是否存在该路由且路由是否有对应的组件\n        if (menuItem.redirect) {\n          const allRoutes = getRoutes();\n          const findRedirectRoute = allRoutes.find((item) => item.path === menuItem.redirect);\n          if (findRedirectRoute && findRedirectRoute.components) {\n            return false;\n          }\n        }\n        // 判断子菜单第一个path是否存在\n        const subMenuItem = getSubMenu(menuItem.children);\n        if (!subMenuItem?.path) {\n          return false;\n        }\n        const path = subMenuItem.redirect ?? subMenuItem.path;\n        let nextKey = path;\n        if (isUrl(path)) {\n          // window.open(path);\n          // 外部打开emit出去的key不能是url，否则左侧菜单出不来\n          nextKey = key;\n        }\n        // =====================================================================\n        // TODO: 临时代码 - 需要删除！！！\n        // 这是针对敲敲云首页菜单的特殊处理，后续需要重构或删除\n        // =====================================================================\n        // 是外部打开且是白名单内的菜单，则直接打开\n        if (subMenuItem?.internalOrExternal == true && MIX_EXTERNAL_WHITELIST.includes(path)) {\n          window.open(location.origin + path);\n          return true;\n        }\n        // =====================================================================\n        emit('menuClick', nextKey, { title: subMenuItem.title });\n        return true;\n      }\n\n      return {\n        handleMenuClick,\n        getInlineCollapseOptions,\n        getMenuClass,\n        handleOpenChange,\n        getOpenKeys,\n        ...toRefs(menuState),\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @import './index.less';\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Menu/src/components/BasicMenuItem.vue",
    "content": "<template>\n  <MenuItem :key=\"item.path\" :title=\"item.title\">\n    <MenuItemContent v-bind=\"$props\" :item=\"item\" />\n  </MenuItem>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { Menu } from 'ant-design-vue';\n  import { itemProps } from '../props';\n\n  import MenuItemContent from './MenuItemContent.vue';\n  export default defineComponent({\n    name: 'BasicMenuItem',\n    components: { MenuItem: Menu.Item, MenuItemContent },\n    props: itemProps,\n    setup() {\n      return {};\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Menu/src/components/BasicSubMenuItem.vue",
    "content": "<template>\n  <BasicMenuItem v-if=\"!menuHasChildren(item) && getShowMenu\" v-bind=\"$props\" />\n  <SubMenu v-if=\"menuHasChildren(item) && getShowMenu\" :class=\"[theme]\" :key=\"`submenu-${item.path}`\" :popupClassName=\"prefixCls\">\n    <template #title>\n      <MenuItemContent v-bind=\"$props\" :item=\"item\" />\n    </template>\n\n    <template v-for=\"childrenItem in item.children || []\" :key=\"childrenItem.path\">\n      <BasicSubMenuItem v-bind=\"$props\" :item=\"childrenItem\" />\n    </template>\n  </SubMenu>\n</template>\n<script lang=\"ts\">\n  import type { Menu as MenuType } from '/@/router/types';\n  import { defineComponent, computed, watch } from 'vue';\n  import { Menu } from 'ant-design-vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { checkChildrenHidden } from '/@/utils/common/compUtils';\n  import { itemProps } from '../props';\n  import BasicMenuItem from './BasicMenuItem.vue';\n  import MenuItemContent from './MenuItemContent.vue';\n  import { useBasicRootMenuContext } from '../useBasicMenuContext';\n  import { useLocaleStore } from '/@/store/modules/locale';\n  import { getMenus } from '/@/router/menus';\n  \n  export default defineComponent({\n    name: 'BasicSubMenuItem',\n    isSubMenu: true,\n    components: {\n      BasicMenuItem,\n      SubMenu: Menu.SubMenu,\n      MenuItemContent,\n    },\n    props: itemProps,\n    setup(props) {\n      const { prefixCls } = useDesign('basic-subMenu');\n      const { menuState } = useBasicRootMenuContext();\n      const localeStore = useLocaleStore();\n      \n      const getShowMenu = computed(() => !props.item.meta?.hideMenu);\n      function menuHasChildren(menuTreeItem: MenuType): boolean {\n        return (\n          !menuTreeItem.meta?.hideChildrenInMenu &&\n          Reflect.has(menuTreeItem, 'children') &&\n          !!menuTreeItem.children &&\n          menuTreeItem.children.length > 0\n          &&checkChildrenHidden(menuTreeItem)\n        );\n      }\n      // 代码逻辑说明: 【QQYUN-8691】顶部菜单模式online不显示菜单名显示默认的auto在线表单\n      const getMatchingRouterName = (menus, path) => {\n        for (let i = 0, len = menus.length; i < len; i++) {\n          const item = menus[i];\n          if (item.path === path && !item.redirect && !item.paramPath) {\n            return item.meta?.title;\n          } else if (item.children?.length) {\n            const result = getMatchingRouterName(item.children, path);\n            if (result) {\n              return result;\n            }\n          }\n        }\n        return '';\n      };\n\n      watch(\n        () => menuState.selectedKeys,\n        async (value) => {\n          if (value.length && value.includes(props.item.path)) {\n            const menus = await getMenus();\n            const getTitle = getMatchingRouterName(menus, props.item.path);\n            localeStore.setPathTitle(props.item.path, getTitle ? getTitle : props.item.name);\n          }\n        },\n        { immediate: true }\n      );\n      return {\n        prefixCls,\n        menuHasChildren,\n        checkChildrenHidden,\n        getShowMenu,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  // 代码逻辑说明: 【QQYUN-8762】顶部模式下拉菜单颜色统一\n  @prefix-cls: ~'@{namespace}-basic-subMenu';\n  html[data-theme='light'] {\n    .@{prefix-cls}.ant-menu-dark {\n      background-color: var(--header-bg-color);\n      color: rgba(255, 255, 255, 0.9);\n      &.ant-menu-submenu {\n        > .ant-menu {\n          background-color: var(--header-bg-color);\n        }\n      }\n      .ant-menu-item-selected {\n        background-color: var(--header-active-menu-bg-color);\n      }\n    }\n    //【QQYUN-8922】顶部导航三个点菜单样式调整\n    .ant-menu-submenu-placement-bottomLeft.ant-menu-dark.ant-menu-submenu-popup {\n      background-color: var(--header-bg-color);\n      &.ant-menu-dark.ant-menu-submenu > .ant-menu {\n        background-color: var(--header-bg-color);\n        color: rgba(255, 255, 255, 0.9);\n      }\n    }\n  }\n  // 代码逻辑说明: 【QQYUN-9128】暗黑主题顶部模式下拉菜单颜色统一\n  html[data-theme='dark'] {\n    @bgcolor:#212121;\n    .@{prefix-cls}.ant-menu-dark {\n      background-color: @bgcolor;\n      &.ant-menu-submenu {\n        > .ant-menu {\n          background-color: @bgcolor;\n        }\n      }\n    }\n    //【QQYUN-8922】顶部导航三个点菜单样式调整\n    .ant-menu-submenu-placement-bottomLeft.ant-menu-dark.ant-menu-submenu-popup {\n      background-color: @bgcolor;\n      &.ant-menu-dark.ant-menu-submenu > .ant-menu {\n        background-color: @bgcolor;\n        color: rgba(255, 255, 255, 0.9);\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Menu/src/components/MenuItemContent.vue",
    "content": "<template>\n  <span :class=\"`${prefixCls}- flex items-center `\">\n    <Icon v-if=\"getIcon\" :icon=\"getIcon\" :size=\"18\" :class=\"`${prefixCls}-wrapper__icon mr-2`\" />\n    {{ getI18nName }}\n  </span>\n</template>\n<script lang=\"ts\">\n  import { computed, defineComponent } from 'vue';\n\n  import Icon from '/@/components/Icon/index';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { contentProps } from '../props';\n  const { t } = useI18n();\n\n  export default defineComponent({\n    name: 'MenuItemContent',\n    components: {\n      Icon,\n    },\n    props: contentProps,\n    setup(props) {\n      const { prefixCls } = useDesign('basic-menu-item-content');\n      const getI18nName = computed(() => t(props.item?.name));\n      const getIcon = computed(() => props.item?.icon);\n\n      return {\n        prefixCls,\n        getI18nName,\n        getIcon,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Menu/src/index.less",
    "content": "@basic-menu-prefix-cls: ~'@{namespace}-basic-menu';\n\n.app-top-menu-popup {\n  min-width: 150px;\n}\n\n.@{basic-menu-prefix-cls} {\n  width: 100%;\n\n  .ant-menu-item {\n    transition: unset;\n  }\n\n  &__sidebar-hor {\n    &.ant-menu-horizontal {\n      display: flex;\n      align-items: center;\n\n      &.ant-menu-dark {\n        background-color: transparent;\n        // update-begin--author:liaozhiyang---date:20240407---for：【QQYUN-8762】顶部菜单模式文字调整\n        color: rgba(255 ,255 ,255, 1);\n        // update-end--author:liaozhiyang---date:20240407---for：【QQYUN-8762】顶部菜单模式文字调整\n        .ant-menu-submenu:hover,\n        .ant-menu-item-open,\n        .ant-menu-submenu-open,\n        .ant-menu-item-selected,\n        .ant-menu-submenu-selected,\n        .ant-menu-item:hover,\n        .ant-menu-item-active,\n        .ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open,\n        .ant-menu-submenu-active,\n        .ant-menu-submenu-title:hover {\n          color: #fff;\n          background-color: @top-menu-active-bg-color !important;\n        }\n\n        .ant-menu-item:hover,\n        .ant-menu-item-active,\n        .ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open,\n        .ant-menu-submenu-active,\n        .ant-menu-submenu-title:hover {\n          background-color: @top-menu-active-bg-color;\n        }\n\n        .@{basic-menu-prefix-cls}-item__level1 {\n          background-color: transparent;\n\n          &.ant-menu-item-selected,\n          &.ant-menu-submenu-selected {\n            background-color: @top-menu-active-bg-color !important;\n          }\n        }\n\n        .ant-menu-item,\n        .ant-menu-submenu {\n          &.@{basic-menu-prefix-cls}-item__level1,\n          .ant-menu-submenu-title {\n            height: @header-height;\n            line-height: @header-height;\n          }\n        }\n      }\n    }\n  }\n\n  .ant-menu-submenu,\n  .ant-menu-submenu-inline {\n    transition: unset;\n  }\n\n  .ant-menu-inline.ant-menu-sub {\n    box-shadow: unset !important;\n    transition: unset;\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Menu/src/props.ts",
    "content": "import type { Menu } from '/@/router/types';\nimport type { PropType } from 'vue';\n\nimport { MenuModeEnum, MenuTypeEnum } from '/@/enums/menuEnum';\nimport { ThemeEnum } from '/@/enums/appEnum';\nimport { propTypes } from '/@/utils/propTypes';\nimport type { MenuTheme } from 'ant-design-vue';\nimport type { MenuMode } from 'ant-design-vue/lib/menu/src/interface';\nexport const basicProps = {\n  items: {\n    type: Array as PropType<Menu[]>,\n    default: () => [],\n  },\n  collapsedShowTitle: propTypes.bool,\n  // 最好是4 倍数\n  inlineIndent: propTypes.number.def(20),\n  // 菜单组件的mode属性\n  mode: {\n    type: String as PropType<MenuMode>,\n    default: MenuModeEnum.INLINE,\n  },\n\n  type: {\n    type: String as PropType<MenuTypeEnum>,\n    default: MenuTypeEnum.MIX,\n  },\n  theme: {\n    type: String as PropType<MenuTheme>,\n    default: ThemeEnum.DARK,\n  },\n  inlineCollapsed: propTypes.bool,\n  mixSider: propTypes.bool,\n\n  isHorizontal: propTypes.bool,\n  accordion: propTypes.bool.def(true),\n  beforeClickFn: {\n    type: Function as PropType<(key: string) => Promise<boolean>>,\n  },\n};\n\nexport const itemProps = {\n  item: {\n    type: Object as PropType<Menu>,\n    default: {},\n  },\n  level: propTypes.number,\n  theme: propTypes.oneOf(['dark', 'light']),\n  showTitle: propTypes.bool,\n  isHorizontal: propTypes.bool,\n};\n\nexport const contentProps = {\n  item: {\n    type: Object as PropType<Menu>,\n    default: null,\n  },\n  showTitle: propTypes.bool.def(true),\n  level: propTypes.number.def(0),\n  isHorizontal: propTypes.bool.def(true),\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Menu/src/types.ts",
    "content": "// import { ComputedRef } from 'vue';\n// import { ThemeEnum } from '/@/enums/appEnum';\n// import { MenuModeEnum } from '/@/enums/menuEnum';\nexport interface MenuState {\n  // 默认选中的列表\n  defaultSelectedKeys: string[];\n\n  // 模式\n  // mode: MenuModeEnum;\n\n  // // 主题\n  // theme: ComputedRef<ThemeEnum> | ThemeEnum;\n\n  // 缩进\n  inlineIndent?: number;\n\n  // 展开数组\n  openKeys: string[];\n\n  // 当前选中的菜单项 key 数组\n  selectedKeys: string[];\n\n  // 收缩状态下展开的数组\n  collapsedOpenKeys: string[];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Menu/src/useBasicMenuContext.ts",
    "content": "import type { InjectionKey, Ref } from 'vue';\nimport { createContext, useContext } from '/@/hooks/core/useContext';\n\nexport interface BasicRootMenuContextProps {\n  menuState: any;\n}\n\nconst key: InjectionKey<BasicRootMenuContextProps> = Symbol();\n\nexport function createBasicRootMenuContext(context: BasicRootMenuContextProps) {\n  return createContext<BasicRootMenuContextProps>(context, key, { readonly: false, native: true });\n}\n\nexport function useBasicRootMenuContext() {\n  return useContext<BasicRootMenuContextProps>(key);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Menu/src/useOpenKeys.ts",
    "content": "import { MenuModeEnum } from '/@/enums/menuEnum';\nimport type { Menu as MenuType } from '/@/router/types';\nimport type { MenuState } from './types';\n\nimport { computed, Ref, toRaw } from 'vue';\n\nimport { unref } from 'vue';\nimport { uniq } from 'lodash-es';\nimport { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\nimport { getAllParentPath } from '/@/router/helper/menuHelper';\nimport { useTimeoutFn } from '/@/hooks/core/useTimeout';\n\nexport function useOpenKeys(menuState: MenuState, menus: Ref<MenuType[]>, mode: Ref<MenuModeEnum>, accordion: Ref<boolean>) {\n  const { getCollapsed, getIsMixSidebar } = useMenuSetting();\n\n  async function setOpenKeys(path: string) {\n    if (mode.value === MenuModeEnum.HORIZONTAL) {\n      return;\n    }\n    const native = unref(getIsMixSidebar);\n    useTimeoutFn(\n      () => {\n        const menuList = toRaw(menus.value);\n        if (menuList?.length === 0) {\n          menuState.openKeys = [];\n          return;\n        }\n        if (!unref(accordion)) {\n          menuState.openKeys = uniq([...menuState.openKeys, ...getAllParentPath(menuList, path)]);\n        } else {\n          menuState.openKeys = getAllParentPath(menuList, path);\n        }\n      },\n      16,\n      !native\n    );\n  }\n\n  const getOpenKeys = computed(() => {\n    const collapse = unref(getIsMixSidebar) ? false : unref(getCollapsed);\n\n    return collapse ? menuState.collapsedOpenKeys : menuState.openKeys;\n  });\n\n  /**\n   * @description:  重置值\n   */\n  function resetKeys() {\n    menuState.selectedKeys = [];\n    menuState.openKeys = [];\n  }\n\n  function handleOpenChange(openKeys: string[]) {\n    if (unref(mode) === MenuModeEnum.HORIZONTAL || !unref(accordion) || unref(getIsMixSidebar)) {\n      menuState.openKeys = openKeys;\n    } else {\n      // const menuList = toRaw(menus.value);\n      // getAllParentPath(menuList, path);\n      const rootSubMenuKeys: string[] = [];\n      for (const { children, path } of unref(menus)) {\n        if (children && children.length > 0) {\n          rootSubMenuKeys.push(path);\n        }\n      }\n      if (!unref(getCollapsed)) {\n        const latestOpenKey = openKeys.find((key) => menuState.openKeys.indexOf(key) === -1);\n        if (rootSubMenuKeys.indexOf(latestOpenKey as string) === -1) {\n          menuState.openKeys = openKeys;\n        } else {\n          menuState.openKeys = latestOpenKey ? [latestOpenKey] : [];\n        }\n      } else {\n        menuState.collapsedOpenKeys = openKeys;\n      }\n    }\n  }\n  return { setOpenKeys, resetKeys, getOpenKeys, handleOpenChange };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Modal/index.ts",
    "content": "import { withInstall } from '/@/utils';\nimport './src/index.less';\nimport basicModal from './src/BasicModal.vue';\n\nexport const BasicModal = withInstall(basicModal);\nexport { useModalContext } from './src/hooks/useModalContext';\nexport { useModal, useModalInner } from './src/hooks/useModal';\nexport * from './src/typing';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Modal/src/BasicModal.vue",
    "content": "<template>\n  <Modal v-bind=\"getBindValue\" @cancel=\"handleCancel\">\n    <template #closeIcon v-if=\"!$slots.closeIcon\">\n      <ModalClose :canFullscreen=\"getProps.canFullscreen\" :fullScreen=\"fullScreenRef\" :commentSpan=\"commentSpan\" :enableComment=\"getProps.enableComment\" @comment=\"handleComment\" @cancel=\"handleCancel\" @fullscreen=\"handleFullScreen\" />\n    </template>\n\n    <template #title v-if=\"!isNoTitle\">\n      <ModalHeader :helpMessage=\"getProps.helpMessage\" :title=\"getMergeProps.title\" @dblclick=\"handleTitleDbClick\" />\n    </template>\n\n    <template #footer v-if=\"!$slots.footer\">\n      <ModalFooter v-bind=\"getBindValue\" @ok=\"handleOk\" @cancel=\"handleCancel\">\n        <template #[item]=\"data\" v-for=\"item in Object.keys($slots)\">\n          <slot :name=\"item\" v-bind=\"data || {}\"></slot>\n        </template>\n      </ModalFooter>\n    </template>\n\n    <a-row class=\"jeecg-modal-wrapper\">\n      <a-col :span=\"24-commentSpan\" class=\"jeecg-modal-content\">\n        <ModalWrapper\n          :useWrapper=\"getProps.useWrapper\"\n          :footerOffset=\"wrapperFooterOffset\"\n          :fullScreen=\"fullScreenRef\"\n          ref=\"modalWrapperRef\"\n          :loading=\"getProps.loading\"\n          :loading-tip=\"getProps.loadingTip\"\n          :minHeight=\"getProps.minHeight\"\n          :maxHeight=\"getProps.maxHeight\"\n          :height=\"getWrapperHeight\"\n          :visible=\"visibleRef\"\n          :modalHeaderHeight=\"getProps.modalHeaderHeight\"\n          :modalFooterHeight=\"footer !== undefined && !footer ? 0 : getProps.modalFooterHeight\"\n          v-bind=\"omit(getProps.wrapperProps, 'visible', 'height', 'modalFooterHeight')\"\n          @ext-height=\"handleExtHeight\"\n          @height-change=\"handleHeightChange\">\n          <slot></slot>\n        </ModalWrapper>\n      </a-col>\n      \n      <a-col :span=\"commentSpan\" class=\"jeecg-comment-outer\">\n        <slot name=\"comment\"></slot>\n      </a-col>\n      \n    </a-row>\n    \n    <template #[item]=\"data\" v-for=\"item in Object.keys(omit($slots, 'default'))\">\n      <slot :name=\"item\" v-bind=\"data || {}\"></slot>\n    </template>\n  </Modal>\n</template>\n<script lang=\"ts\">\n  import type { ModalProps, ModalMethods } from './typing';\n\n  import { defineComponent, computed, ref, watch, unref, watchEffect, toRef, getCurrentInstance, nextTick } from 'vue';\n  import Modal from './components/Modal';\n  import ModalWrapper from './components/ModalWrapper.vue';\n  import ModalClose from './components/ModalClose.vue';\n  import ModalFooter from './components/ModalFooter.vue';\n  import ModalHeader from './components/ModalHeader.vue';\n  import { isFunction } from '/@/utils/is';\n  import { deepMerge } from '/@/utils';\n  import { basicProps } from './props';\n  import { useFullScreen } from './hooks/useModalFullScreen';\n  import { omit } from 'lodash-es';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useAppInject } from '/@/hooks/web/useAppInject';\n\n\n  export default defineComponent({\n    name: 'BasicModal',\n    components: { Modal, ModalWrapper, ModalClose, ModalFooter, ModalHeader },\n    inheritAttrs: false,\n    props: basicProps,\n    emits: ['visible-change', 'open-change', 'height-change', 'cancel', 'ok', 'register', 'update:visible', 'update:open', 'fullScreen','comment-open'],\n    setup(props, { emit, attrs , slots}) {\n      const visibleRef = ref(false);\n      const propsRef = ref<Partial<ModalProps> | null>(null);\n      const modalWrapperRef = ref<any>(null);\n      const { prefixCls } = useDesign('basic-modal');\n      // modal   Bottom and top height\n      const extHeightRef = ref(0);\n      const modalMethods: ModalMethods = {\n        setModalProps,\n        emitVisible: undefined,\n        redoModalHeight: () => {\n          nextTick(() => {\n            if (unref(modalWrapperRef)) {\n              (unref(modalWrapperRef) as any).setModalHeight();\n            }\n          });\n        },\n      };\n\n      const instance = getCurrentInstance();\n      if (instance) {\n        emit('register', modalMethods, instance.uid);\n      }\n      const { getIsMobile } = useAppInject();\n\n      // Custom title component: get title\n      const getMergeProps = computed((): Recordable => {\n        const result = {\n          ...props,\n          ...(unref(propsRef) as any),\n        };\n        // 代码逻辑说明: 【QQYUN-8643】弹窗移动端弹窗统一全屏\n        if (getIsMobile.value) {\n          result.canFullscreen = false;\n          result.defaultFullscreen = true;\n        }\n        return result;\n      });\n        //是否未设置标题\n        const isNoTitle = computed(() => {\n            //标题为空并且不含有标题插槽\n            return !unref(getMergeProps).title && !slots.title;\n        });\n\n      const { handleFullScreen, getWrapClassName, fullScreenRef } = useFullScreen({\n        modalWrapperRef,\n        extHeightRef,\n        wrapClassName: toRef(getMergeProps.value, 'wrapClassName'),\n      });\n\n      // modal component does not need title and origin buttons\n      const getProps = computed((): Recordable => {\n        const opt = {\n          ...unref(getMergeProps),\n          visible: unref(visibleRef),\n          okButtonProps: undefined,\n          cancelButtonProps: undefined,\n          title: undefined,\n        };\n        return {\n          ...opt,\n          wrapClassName: unref(getWrapClassName),\n        };\n      });\n\n      const getBindValue = computed((): Recordable => {\n        // 代码逻辑说明: 【QQYUN-6366】升级到antd4.x\n        const attr = {\n          ...attrs,\n          ...unref(getMergeProps),\n          open: unref(visibleRef),\n          wrapClassName: unref(getWrapClassName),\n        };\n        if (unref(fullScreenRef)) {\n          return omit(attr, ['height', 'title', 'visible']);\n        }\n        return omit(attr, ['title', 'visible']);\n      });\n\n      const getWrapperHeight = computed(() => {\n        if (unref(fullScreenRef)) return undefined;\n        return unref(getProps).height;\n      });\n\n      watchEffect(() => {\n        fullScreenRef.value = !!props.defaultFullscreen;\n        // 代码逻辑说明: 【QQYUN-8643】弹窗移动端弹窗统一全屏\n        if (getIsMobile.value) {\n          fullScreenRef.value = true\n        }\n      });\n\n      watchEffect(() => {\n        visibleRef.value = !!props.visible;\n      });\n\n      watchEffect(() => {\n        visibleRef.value = !!props.open;\n      });\n\n      watch(\n        () => unref(visibleRef),\n        (v) => {\n          emit('visible-change', v);\n          emit('open-change', v);\n          emit('update:visible', v);\n          emit('update:open', v);\n          instance && modalMethods.emitVisible?.(v, instance.uid);\n          nextTick(() => {\n            if (props.scrollTop && v && unref(modalWrapperRef)) {\n              (unref(modalWrapperRef) as any).scrollTop();\n            }\n          });\n        },\n        {\n          immediate: false,\n        }\n      );\n\n      // 取消事件\n      async function handleCancel(e: Event) {\n        e?.stopPropagation();\n        // 过滤自定义关闭按钮的空白区域\n        if ((e.target as HTMLElement)?.classList?.contains(prefixCls + '-close--custom')) return;\n        if (props.closeFunc && isFunction(props.closeFunc)) {\n          const isClose: boolean = await props.closeFunc();\n          visibleRef.value = !isClose;\n          return;\n        }\n\n        visibleRef.value = false;\n        emit('cancel', e);\n      }\n\n      /**\n       * @description: 设置modal参数\n       */\n      function setModalProps(props: Partial<ModalProps>): void {\n        // Keep the last setModalProps\n        propsRef.value = deepMerge(unref(propsRef) || ({} as any), props);\n        if (Reflect.has(props, 'visible')) {\n          visibleRef.value = !!props.visible;\n        }\n        if (Reflect.has(props, 'open')) {\n          visibleRef.value = !!props.open;\n        }\n        if (Reflect.has(props, 'defaultFullscreen')) {\n          fullScreenRef.value = !!props.defaultFullscreen;\n           // 代码逻辑说明: 【QQYUN-8643】弹窗移动端弹窗统一全屏\n          if (getIsMobile.value) {\n            fullScreenRef.value = true\n          }\n        }\n      }\n\n      function handleOk(e: Event) {\n        emit('ok', e);\n      }\n\n      function handleHeightChange(height: string) {\n        emit('height-change', height);\n      }\n\n      function handleExtHeight(height: number) {\n        extHeightRef.value = height;\n      }\n\n      function handleTitleDbClick(e) {\n        if (!props.canFullscreen) return;\n        e.stopPropagation();\n        handleFullScreen(e);\n      }\n\n      // 代码逻辑说明: modal支持评论 slot\n      const commentSpan = ref(0);\n      watch(()=>props.enableComment, (flag)=>{\n        handleComment(flag)\n      }, {immediate:true});\n      function handleComment(flag){\n        if(flag=== true){\n          commentSpan.value = 6\n        }else{\n          commentSpan.value = 0\n        }\n        // 代码逻辑说明: 【TV360X-485】开启评论之后弹窗按钮居右隔一个评论的距离\n        emit('comment-open', commentSpan.value === 0, commentSpan.value);\n      }\n\n      // 代码逻辑说明: 【QQYUN-5866】放大行数自适应\n      watch(fullScreenRef,(val)=>{\n        emit('fullScreen',val);\n      });\n\n      return {\n        handleCancel,\n        getBindValue,\n        getProps,\n        handleFullScreen,\n        fullScreenRef,\n        getMergeProps,\n        handleOk,\n        visibleRef,\n        omit,\n        modalWrapperRef,\n        handleExtHeight,\n        handleHeightChange,\n        handleTitleDbClick,\n        getWrapperHeight,\n        commentSpan,\n        handleComment,\n        isNoTitle\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  /*update-begin-author:taoyan date:2022-7-27 for:modal评论区域样式*/\n  .jeecg-comment-outer {\n    border-left: 1px solid #f0f0f0;\n    .ant-tabs-nav-wrap{\n    /*  text-align: center;*/\n    }\n  }\n  .jeecg-modal-content{\n    >.scroll-container{\n      // 代码逻辑说明: 【QQYUN-7297】表单讨论弹窗放大按钮时只显示一部分---\n      padding: 6px;\n    }\n  }\n  /*update-end-author:taoyan date:2022-7-27 for:modal评论区域样式*/\n\n  // wrapper设为100%，兼容之前写过的弹窗自定义样式\n  .jeecg-modal-wrapper,\n  .jeecg-modal-content {\n    height: 100%;\n  }\n  html[data-theme='dark'] {\n    .jeecg-comment-outer {\n      border-left: 1px solid rgba(253, 253, 253, 0.12);\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Modal/src/JModal/JModal.vue",
    "content": "<template>\n  <a-modal v-bind=\"getBindValue\" @cancel=\"handleCancel\" :body-style=\"!fullScreenRef ? bodyStyle : {}\">\n    <slot></slot>\n    <template #closeIcon v-if=\"!$slots.closeIcon\">\n      <div class=\"jeecg-basic-modal-close\" v-if=\"canFullscreen\">\n        <Tooltip :title=\"t('component.modal.restore')\" placement=\"bottom\" v-if=\"fullScreenRef\">\n          <FullscreenExitOutlined role=\"full\" @click=\"handleFullScreen\" />\n        </Tooltip>\n        <Tooltip :title=\"t('component.modal.maximize')\" placement=\"bottom\" v-else>\n          <FullscreenOutlined role=\"close\" @click=\"handleFullScreen\" />\n        </Tooltip>\n        <Tooltip :title=\"t('component.modal.close')\" placement=\"bottom\">\n          <CloseOutlined @click=\"handleCancel\" />\n        </Tooltip>\n      </div>\n    </template>\n\n    <template #title v-if=\"!isNoTitle\">\n      <ModalHeader :helpMessage=\"getProps.helpMessage\" :title=\"getMergeProps.title\" @dblclick=\"handleTitleDbClick\" />\n    </template>\n\n    <template #footer v-if=\"!$slots.footer\">\n      <ModalFooter v-bind=\"getBindValue\" @ok=\"handleOk\" @cancel=\"handleCancel\">\n        <template #[item]=\"data\" v-for=\"item in Object.keys($slots)\">\n          <slot :name=\"item\" v-bind=\"data || {}\"></slot>\n        </template>\n      </ModalFooter>\n    </template>\n\n    <template #[item]=\"data\" v-for=\"item in Object.keys(omit($slots, 'default'))\">\n      <slot :name=\"item\" v-bind=\"data || {}\"></slot>\n    </template>\n  </a-modal>\n</template>\n\n<script lang=\"ts\" name=\"j-modal\">\n  import { computed, defineComponent, getCurrentInstance, ref, toRef, unref, watch, watchEffect } from 'vue';\n  import ModalFooter from '@/components/Modal/src/components/ModalFooter.vue';\n  import ModalClose from '@/components/Modal/src/components/ModalClose.vue';\n  import ModalHeader from '@/components/Modal/src/components/ModalHeader.vue';\n  import { omit } from 'lodash-es';\n  import { useAppInject } from '@/hooks/web/useAppInject';\n  import type { ModalMethods, ModalProps } from '@/components/Modal';\n  import { CloseOutlined, FullscreenExitOutlined, FullscreenOutlined } from '@ant-design/icons-vue';\n  import { Tooltip } from 'ant-design-vue';\n  import { useI18n } from '@/hooks/web/useI18n';\n  import { deepMerge } from '@/utils';\n  import { basicProps } from '@/components/Modal/src/props';\n  import Modal from '/@/components/Modal/src/components/Modal';\n  import { isFunction } from '@/utils/is';\n  export default defineComponent({\n    name: 'JModal',\n    methods: { omit },\n    components: {\n      CloseOutlined,\n      Tooltip,\n      FullscreenExitOutlined,\n      FullscreenOutlined,\n      ModalHeader,\n      ModalClose,\n      ModalFooter,\n      Modal,\n    },\n    props: {\n      //是否全屏\n      fullscreen: {\n        type: Boolean,\n        default: false,\n      },\n      ...basicProps,\n    },\n    emits: ['visible-change', 'open-change', 'height-change', 'cancel', 'ok', 'register', 'update:visible', 'update:open', 'fullScreen'],\n    setup(props, { emit, attrs, slots }) {\n      const { getIsMobile } = useAppInject();\n      const visibleRef = ref(false);\n      const propsRef = ref<Partial<ModalProps> | null>(null);\n      const fullScreenRef = ref<any>(props.fullscreen);\n      const fullScreen = ref<boolean>(false);\n      const { t } = useI18n();\n      const bodyStyle = ref<any>({\n        height: props.maxHeight ? props.maxHeight : '600px',\n        'overflow-y': 'auto',\n      });\n      const modalMethods: ModalMethods = {\n        setModalProps,\n        emitVisible: undefined,\n      };\n\n      const getMergeProps = computed((): Recordable => {\n        const result = {\n          ...props,\n          ...(unref(propsRef) as any),\n        };\n        if (getIsMobile.value) {\n          result.fullscreen = false;\n        }\n        return result;\n      });\n\n      const getBindValue = computed((): Recordable => {\n        const attr = {\n          ...attrs,\n          ...unref(getMergeProps),\n          open: unref(visibleRef),\n          wrapClassName: unref(getWrapClassName),\n        };\n        if (unref(fullScreenRef)) {\n          return omit(attr, ['height', 'visible']);\n        }\n        return omit(attr, ['visible']);\n      });\n\n      //整合warpClassName\n      const getWrapClassName = computed(() => {\n        let clsName = toRef(getMergeProps.value, 'wrapClassName').value || '';\n        // 代码逻辑说明: 【issues/7260】原生a-modal关闭按钮位置偏移\n        clsName = `${clsName} jeecg-modal-code-generate`;\n        return unref(fullScreenRef) ? `jeecg-full-screen-modal-code-generate ${clsName} ` : unref(clsName);\n      });\n\n      //获取props\n      const getProps = computed((): Recordable => {\n        const opt = {\n          ...unref(getMergeProps),\n          visible: unref(visibleRef),\n          okButtonProps: undefined,\n          cancelButtonProps: undefined,\n          title: undefined,\n        };\n        return {\n          ...opt,\n          wrapClassName: unref(getWrapClassName),\n        };\n      });\n\n      //注册model,instance.uid 避免多个model冲突\n      const instance = getCurrentInstance();\n      if (instance) {\n        emit('register', modalMethods, instance.uid);\n      }\n\n      /**\n       * 是否含有标题\n       */\n      function isNoTitle() {\n        //标题为空并且不含有标题插槽\n        return !unref(getMergeProps).title && !slots.title;\n      }\n\n      /**\n       * 放大缩小事件\n       * @param e\n       */\n      function handleFullScreen(e: Event) {\n        e?.stopPropagation();\n        e?.preventDefault();\n        fullScreenRef.value = !unref(fullScreenRef);\n      }\n\n      // 取消事件\n      async function handleCancel(e: Event) {\n        e?.stopPropagation();\n        // 过滤自定义关闭按钮的空白区域\n        if (props.closeFunc && isFunction(props.closeFunc)) {\n          const isClose: boolean = await props.closeFunc();\n          visibleRef.value = !isClose;\n          return;\n        }\n        visibleRef.value = false;\n        emit('cancel', e);\n      }\n\n      /**\n       * 确定事件\n       * @param e\n       */\n      function handleOk(e: Event) {\n        emit('ok', e);\n      }\n\n      function handleTitleDbClick(e) {\n        if (!props.fullscreen) return;\n        e.stopPropagation();\n        handleFullScreen(e);\n      }\n      /**\n       * 设置modal参数\n       */\n      function setModalProps(props: Partial<ModalProps>): void {\n        // Keep the last setModalProps\n        propsRef.value = deepMerge(unref(propsRef) || ({} as any), props);\n        if (Reflect.has(props, 'visible')) {\n          visibleRef.value = !!props.visible;\n        }\n        if (Reflect.has(props, 'open')) {\n          visibleRef.value = !!props.open;\n        }\n        if (Reflect.has(props, 'defaultFullscreen')) {\n          fullScreenRef.value = !!props.defaultFullscreen;\n          if (getIsMobile.value) {\n            fullScreenRef.value = true;\n          }\n        }\n      }\n\n      /**\n       * 监听放大缩小\n       */\n      watchEffect(() => {\n        fullScreenRef.value = props.fullscreen;\n        if (getIsMobile.value) {\n          fullScreenRef.value = true;\n        }\n      });\n\n      /**\n       * 监听model的显示隐藏\n       */\n      watchEffect(() => {\n        visibleRef.value = !!props.visible;\n      });\n\n      /**\n       * 监听model的显示隐藏\n       */\n      watchEffect(() => {\n        visibleRef.value = !!props.open;\n      });\n\n      watch(\n        () => unref(visibleRef),\n        (v) => {\n          emit('visible-change', v);\n          emit('open-change', v);\n          emit('update:visible', v);\n          emit('update:open', v);\n          instance && modalMethods.emitVisible?.(v, instance.uid);\n        },\n        {\n          immediate: false,\n        }\n      );\n\n      return {\n        isNoTitle,\n        getBindValue,\n        fullScreenRef,\n        handleFullScreen,\n        fullScreen,\n        t,\n        handleCancel,\n        handleOk,\n        getProps,\n        getMergeProps,\n        handleTitleDbClick,\n        bodyStyle,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  /*begin 放大关闭按钮样式*/\n  .jeecg-basic-modal-close {\n    display: flex;\n    height: 95%;\n    align-items: center;\n\n    > span {\n      margin-left: 10px;\n      font-size: 16px;\n    }\n\n    &--can-full {\n      > span {\n        margin-left: 12px;\n      }\n    }\n\n    &:not(&--can-full) {\n      > span:nth-child(1) {\n        &:hover {\n          font-weight: 700;\n        }\n      }\n    }\n\n    & span:nth-child(1) {\n      display: inline-block;\n      padding: 10px;\n\n      &:hover {\n        color: @primary-color;\n      }\n    }\n\n    & span:last-child {\n      padding: 10px 10px 10px 0;\n      &:hover {\n        color: @error-color;\n      }\n    }\n  }\n  /*end 放大关闭按钮样式*/\n</style>\n\n<style lang=\"less\">\n  /*begin 全屏弹窗modal样式*/\n  .jeecg-full-screen-modal-code-generate {\n    .ant-modal {\n      max-width: 100%;\n      top: 0 !important;\n      padding-bottom: 0 !important;\n      margin: 0 !important;\n      width: 100% !important;\n      overflow-y: auto;\n    }\n    .ant-modal-content {\n      display: flex;\n      flex-direction: column;\n      height: calc(100vh);\n    }\n    .ant-modal-body {\n      flex: 1;\n      overflow-y: auto;\n    }\n  }\n  /*end 全屏弹窗modal样式*/\n  // 代码逻辑说明: 【issues/7260】原生a-modal关闭按钮位置偏移\n  .jeecg-modal-code-generate {\n    .ant-modal {\n      .ant-modal-close {\n        top: 8px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Modal/src/components/Modal.tsx",
    "content": "import { Modal } from 'ant-design-vue';\nimport { defineComponent, toRefs, unref } from 'vue';\nimport { basicProps } from '../props';\nimport { useModalDragMove } from '../hooks/useModalDrag';\nimport { useAttrs } from '/@/hooks/core/useAttrs';\nimport { extendSlots } from '/@/utils/helper/tsxHelper';\nimport { omit } from 'lodash-es';\n\nexport default defineComponent({\n  name: 'Modal',\n  inheritAttrs: false,\n  props: omit(basicProps, ['visible']),\n  emits: ['cancel'],\n  setup(props, { slots, emit }) {\n    const { open, draggable, destroyOnClose } = toRefs(props);\n    const attrs = useAttrs();\n    useModalDragMove({\n      visible: open,\n      destroyOnClose,\n      draggable,\n    });\n    const onCancel = (e: Event) => {\n      emit('cancel', e);\n    };\n\n    return () => {\n      const propsData = { ...unref(attrs), ...props, onCancel } as Recordable;\n      return <Modal {...propsData}>{extendSlots(slots)}</Modal>;\n    };\n  },\n});\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Modal/src/components/ModalClose.vue",
    "content": "<template>\n  <div :class=\"getClass\">\n    <template v-if=\"fullScreenStatus\">\n      <Tooltip :title=\"t('component.modal.restore')\" placement=\"bottom\" v-if=\"fullScreen\">\n        <FullscreenExitOutlined role=\"full\" @click=\"handleFullScreen\" />\n      </Tooltip>\n      <Tooltip :title=\"t('component.modal.maximize')\" placement=\"bottom\" v-else>\n        <FullscreenOutlined role=\"close\" @click=\"handleFullScreen\" />\n      </Tooltip>\n    </template>\n\n    <!-- 是否开启评论区域 -->\n    <template v-if=\"enableComment\">\n      <Tooltip title=\"收起\" placement=\"bottom\" v-if=\"commentSpan>0\">\n        <RightSquareOutlined @click=\"handleCloseComment\" style=\"font-size: 16px\"/>\n      </Tooltip>\n      <Tooltip title=\"展开\" placement=\"bottom\" v-else>\n        <LeftSquareOutlined @click=\"handleOpenComment\" style=\"font-size: 16px\"/>\n      </Tooltip>\n    </template>\n    \n    <Tooltip :title=\"t('component.modal.close')\" placement=\"bottom\">\n      <CloseOutlined @click=\"handleCancel\" />\n    </Tooltip>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, computed } from 'vue';\n  import { FullscreenExitOutlined, FullscreenOutlined, CloseOutlined, LeftSquareOutlined, RightSquareOutlined } from '@ant-design/icons-vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { Tooltip } from 'ant-design-vue';\n  import { useI18n } from '/@/hooks/web/useI18n';\n\n  export default defineComponent({\n    name: 'ModalClose',\n    components: { Tooltip, FullscreenExitOutlined, FullscreenOutlined, CloseOutlined, LeftSquareOutlined, RightSquareOutlined },\n    props: {\n      canFullscreen: { type: Boolean, default: true },\n      fullScreen: { type: Boolean },\n      enableComment: { type: Boolean, default: false },\n      commentSpan: { type: Number, default: 0 },\n    },\n    emits: ['cancel', 'fullscreen', 'comment'],\n    setup(props, { emit }) {\n      const { prefixCls } = useDesign('basic-modal-close');\n      const { t } = useI18n();\n\n      const getClass = computed(() => {\n        return [\n          prefixCls,\n          `${prefixCls}--custom`,\n          {\n            [`${prefixCls}--can-full`]: props.canFullscreen || props.enableComment,\n          },\n        ];\n      });\n\n      function handleCancel(e: Event) {\n        emit('cancel', e);\n      }\n\n      function handleFullScreen(e: Event) {\n        e?.stopPropagation();\n        e?.preventDefault();\n        if(props.commentSpan==0 || props.enableComment == false){\n          emit('fullscreen');\n        }\n      }\n\n      /**\n       * 开启评论区域\n       * @param e\n       */\n      function handleOpenComment(e: Event){\n        e?.stopPropagation();\n        e?.preventDefault();\n        if(props.fullScreen==false){\n          emit('fullscreen');\n        }\n        emit('comment', true);\n      }\n\n      /**\n       * 关闭评论区域\n       * @param e\n       */\n      function handleCloseComment(e: Event){\n        e?.stopPropagation();\n        e?.preventDefault();\n        emit('comment', false);\n      }\n\n      /**\n       * 有评论的时候不需要设置全屏\n       */\n      const fullScreenStatus = computed(()=>{\n        if(props.enableComment===true){\n          return false\n        }else{\n          return props.canFullscreen;\n        }\n      });\n      \n      return {\n        t,\n        getClass,\n        prefixCls,\n        handleCancel,\n        handleFullScreen,\n        handleOpenComment,\n        handleCloseComment,\n        fullScreenStatus\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-basic-modal-close';\n  .@{prefix-cls} {\n    display: flex;\n    height: 95%;\n    align-items: center;\n    // 代码逻辑说明: 【issues/7260】原生a-modal关闭按钮位置偏移\n    margin-top: -2px;\n    > span {\n      margin-left: 48px;\n      font-size: 16px;\n    }\n\n    &--can-full {\n      > span {\n        margin-left: 12px;\n      }\n    }\n\n    &:not(&--can-full) {\n      > span:nth-child(1) {\n        &:hover {\n          font-weight: 700;\n        }\n      }\n    }\n\n    & span:nth-child(1) {\n      display: inline-block;\n      padding: 10px;\n\n      &:hover {\n        color: @primary-color;\n      }\n    }\n\n    & span:last-child {\n      padding: 10px 10px 10px 0;\n      &:hover {\n        color: @error-color;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Modal/src/components/ModalFooter.vue",
    "content": "<template>\n  <div>\n    <slot name=\"insertFooter\"></slot>\n    <a-button v-bind=\"cancelButtonProps\" @click=\"handleCancel\" v-if=\"showCancelBtn\">\n      {{ cancelText }}\n    </a-button>\n    <slot name=\"centerFooter\"></slot>\n    <a-button :type=\"okType\" @click=\"handleOk\" :loading=\"confirmLoading\" v-bind=\"okButtonProps\" v-if=\"showOkBtn\">\n      {{ okText }}\n    </a-button>\n    <slot name=\"appendFooter\"></slot>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n\n  import { basicProps } from '../props';\n  export default defineComponent({\n    name: 'BasicModalFooter',\n    props: basicProps,\n    emits: ['ok', 'cancel'],\n    setup(_, { emit }) {\n      function handleOk(e: Event) {\n        emit('ok', e);\n      }\n\n      function handleCancel(e: Event) {\n        emit('cancel', e);\n      }\n\n      return { handleOk, handleCancel };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Modal/src/components/ModalHeader.vue",
    "content": "<template>\n  <BasicTitle :helpMessage=\"helpMessage\">\n    {{ title }}\n  </BasicTitle>\n</template>\n<script lang=\"ts\">\n  import type { PropType } from 'vue';\n  import { defineComponent } from 'vue';\n  import { BasicTitle } from '/@/components/Basic';\n\n  export default defineComponent({\n    name: 'BasicModalHeader',\n    components: { BasicTitle },\n    emits: ['dblclick'],\n    props: {\n      helpMessage: {\n        type: [String, Array] as PropType<string | string[]>,\n      },\n      title: { type: String },\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Modal/src/components/ModalWrapper.vue",
    "content": "<template>\n  <ScrollContainer ref=\"wrapperRef\">\n    <div ref=\"spinRef\" :style=\"spinStyle\" v-loading=\"loading\" :loading-tip=\"loadingTip\">\n      <slot></slot>\n    </div>\n  </ScrollContainer>\n</template>\n<script lang=\"ts\">\n  import type { CSSProperties } from 'vue';\n  import { defineComponent, computed, ref, watchEffect, unref, watch, onMounted, nextTick, onUnmounted } from 'vue';\n  import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn';\n  import { ScrollContainer } from '/@/components/Container';\n  import { createModalContext } from '../hooks/useModalContext';\n  import { useMutationObserver } from '@vueuse/core';\n\n  const props = {\n    loading: { type: Boolean },\n    useWrapper: { type: Boolean, default: true },\n    modalHeaderHeight: { type: Number, default: 57 },\n    modalFooterHeight: { type: Number, default: 74 },\n    minHeight: { type: Number, default: null },\n    maxHeight: { type: Number, default: null },\n    height: { type: Number },\n    footerOffset: { type: Number, default: 0 },\n    visible: { type: Boolean },\n    fullScreen: { type: Boolean },\n    loadingTip: { type: String },\n  };\n\n  export default defineComponent({\n    name: 'ModalWrapper',\n    components: { ScrollContainer },\n    inheritAttrs: false,\n    props,\n    emits: ['height-change', 'ext-height'],\n    setup(props, { emit }) {\n      const wrapperRef = ref<ComponentRef>(null);\n      const spinRef = ref<ElRef>(null);\n      const realHeightRef = ref(0);\n      const minRealHeightRef = ref(0);\n\n      let realHeight = 0;\n\n      let stopElResizeFn: Fn = () => {};\n\n      useWindowSizeFn(setModalHeight.bind(null, false));\n\n      // 代码逻辑说明: 【TV360X-145】将弹窗还原全屏后，关闭再打开窗口变小了\n      let observer,\n        recordCount: any = {};\n      watch(\n        () => props.visible,\n        () => {\n          if (props.visible && !observer && !(props.maxHeight || props.height)) {\n            recordCount = {};\n            observer = useMutationObserver(\n              spinRef,\n              () => {\n                setModalHeight({\n                  source: 'muob',\n                  callBack: (height) => {\n                    const count = recordCount[height];\n                    if (count) {\n                      recordCount[height] = ++recordCount[height];\n                      if (count > 10) {\n                        observer.stop();\n                        recordCount = {};\n                        observer = null;\n                      }\n                    } else {\n                      recordCount = {};\n                      recordCount[height] = 1;\n                    }\n                  },\n                });\n              },\n              {\n                attributes: true,\n                subtree: true,\n              }\n            );\n          } else {\n            if (observer) {\n              observer.stop();\n              observer = null;\n            }\n          }\n        },\n        { immediate: true }\n      );\n\n      createModalContext({\n        redoModalHeight: setModalHeight,\n      });\n\n      const spinStyle = computed((): CSSProperties => {\n        // 代码逻辑说明: 【QQYUN-7147】Model的高度设置不生效\n        if (props.fullScreen) {\n          return {\n            height: `${unref(realHeightRef)}px`,\n          };\n        } else {\n          const defaultMiniHeight = 200;\n          if (props.height != undefined) {\n            let height: number = props.height;\n            if (props.minHeight === null) {\n              return {\n                height: `${height}px`,\n              };\n            } else {\n              return {\n                height: `${props.minHeight > height ? props.minHeight : height}px`,\n              };\n            }\n          } else {\n            return {\n              minHeight: `${props.minHeight === null ? defaultMiniHeight : props.minHeight}px`,\n              // 代码逻辑说明: 【QQYUN-7641】basicModal组件添加MaxHeight属性\n              maxHeight: `${props.maxHeight ? props.maxHeight : unref(realHeightRef)}px`,\n            };\n          }\n        }\n      });\n\n      watchEffect(() => {\n        props.useWrapper && setModalHeight();\n      });\n\n      watch(\n        () => props.fullScreen,\n        (v) => {\n          setModalHeight();\n          if (!v) {\n            realHeightRef.value = minRealHeightRef.value;\n          } else {\n            minRealHeightRef.value = realHeightRef.value;\n          }\n        }\n      );\n\n      onMounted(() => {\n        const { modalHeaderHeight, modalFooterHeight } = props;\n        emit('ext-height', modalHeaderHeight + modalFooterHeight);\n      });\n\n      onUnmounted(() => {\n        stopElResizeFn && stopElResizeFn();\n      });\n\n      async function scrollTop() {\n        nextTick(() => {\n          const wrapperRefDom = unref(wrapperRef);\n          if (!wrapperRefDom) return;\n          (wrapperRefDom as any)?.scrollTo?.(0);\n        });\n      }\n\n      async function setModalHeight(option?) {\n        console.log(\"---------性能监控--------setModalHeight----------\")\n        const options = option || {};\n        const source = options.source;\n        const callBack = options.callBack;\n        // 解决在弹窗关闭的时候监听还存在,导致再次打开弹窗没有高度\n        // 加上这个,就必须在使用的时候传递父级的visible\n        if (!props.visible) return;\n        const wrapperRefDom = unref(wrapperRef);\n        if (!wrapperRefDom) return;\n        // 代码逻辑说明: 【QQYUN-8573】BasicModal组件在非全屏的情况下最大高度获取异常，不论内容高度是否超出屏幕高度，都等于内容高度\n        const bodyDom = wrapperRefDom.$el.parentElement?.parentElement?.parentElement;\n        if (!bodyDom) return;\n        // bodyDom.style.padding = '0';\n        await nextTick();\n\n        try {\n          const modalDom = bodyDom.parentElement && bodyDom.parentElement.parentElement;\n          if (!modalDom) return;\n\n          const modalRect = getComputedStyle(modalDom as Element).top;\n          const modalTop = Number.parseInt(modalRect);\n          let maxHeight = window.innerHeight - modalTop * 2 + (props.footerOffset! || 0) - props.modalFooterHeight - props.modalHeaderHeight;\n\n          // 距离顶部过进会出现滚动条\n          if (modalTop < 40) {\n            maxHeight -= 26;\n          }\n          await nextTick();\n          const spinEl = unref(spinRef);\n\n          if (!spinEl) return;\n          await nextTick();\n          // if (!realHeight) {\n          realHeight = spinEl.scrollHeight;\n          // }\n\n          if (props.fullScreen) {\n            realHeightRef.value = window.innerHeight - props.modalFooterHeight - props.modalHeaderHeight - 28;\n          } else {\n            realHeightRef.value = props.height ? props.height : realHeight > maxHeight ? maxHeight : realHeight;\n          }\n          // 代码逻辑说明: 【QQYUN-9035】basicModal不设置maxHeight或height会一直执行setModalHeight，需即使销毁MutationObserver\n          if (source == 'muob') {\n            callBack(realHeightRef.value);\n          }\n          \n          emit('height-change', unref(realHeightRef));\n        } catch (error) {\n          console.log(error);\n        }\n      }\n\n      return { wrapperRef, spinRef, spinStyle, scrollTop, setModalHeight };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Modal/src/hooks/useModal.ts",
    "content": "import type { UseModalReturnType, ModalMethods, ModalProps, ReturnMethods, UseModalInnerReturnType } from '../typing';\nimport { ref, onUnmounted, unref, getCurrentInstance, reactive, watchEffect, nextTick, toRaw } from 'vue';\nimport { isProdMode } from '/@/utils/env';\nimport { isFunction } from '/@/utils/is';\nimport { isEqual } from 'lodash-es';\nimport { tryOnUnmounted } from '@vueuse/core';\nimport { error } from '/@/utils/log';\nimport { computed } from 'vue';\n\nconst dataTransfer = reactive<any>({});\n\nconst visibleData = reactive<{ [key: number]: boolean }>({});\n\n/**\n * @description: Applicable to independent modal and call outside\n */\nexport function useModal(): UseModalReturnType {\n  const modal = ref<Nullable<ModalMethods>>(null);\n  const loaded = ref<Nullable<boolean>>(false);\n  const uid = ref<string>('');\n\n  function register(modalMethod: ModalMethods, uuid: string) {\n    if (!getCurrentInstance()) {\n      throw new Error('useModal() can only be used inside setup() or functional components!');\n    }\n    uid.value = uuid;\n    isProdMode() &&\n      onUnmounted(() => {\n        modal.value = null;\n        loaded.value = false;\n        dataTransfer[unref(uid)] = null;\n      });\n    if (unref(loaded) && isProdMode() && modalMethod === unref(modal)) return;\n\n    modal.value = modalMethod;\n    loaded.value = true;\n    modalMethod.emitVisible = (visible: boolean, uid: number) => {\n      visibleData[uid] = visible;\n    };\n  }\n\n  const getInstance = () => {\n    const instance = unref(modal);\n    if (!instance) {\n      error('useModal instance is undefined!');\n    }\n    return instance;\n  };\n\n  const methods: ReturnMethods = {\n    setModalProps: (props: Partial<ModalProps>): void => {\n      getInstance()?.setModalProps(props);\n    },\n\n    getVisible: computed((): boolean => {\n      return visibleData[~~unref(uid)];\n    }),\n    getOpen: computed((): boolean => {\n      return visibleData[~~unref(uid)];\n    }),\n    redoModalHeight: () => {\n      getInstance()?.redoModalHeight?.();\n    },\n\n    openModal: <T = any>(visible = true, data?: T, openOnSet = true): void => {\n      // 代码逻辑说明: 【QQYUN-6366】升级到antd4.x\n      getInstance()?.setModalProps({\n        open: visible,\n      });\n\n      if (!data) return;\n      const id = unref(uid);\n      if (openOnSet) {\n        dataTransfer[id] = null;\n        dataTransfer[id] = toRaw(data);\n        return;\n      }\n      const equal = isEqual(toRaw(dataTransfer[id]), toRaw(data));\n      if (!equal) {\n        dataTransfer[id] = toRaw(data);\n      }\n    },\n\n    closeModal: () => {\n      // 代码逻辑说明: 【QQYUN-6366】升级到antd4.x\n      getInstance()?.setModalProps({ open: false });\n    },\n  };\n  return [register, methods];\n}\n\nexport const useModalInner = (callbackFn?: Fn): UseModalInnerReturnType => {\n  const modalInstanceRef = ref<Nullable<ModalMethods>>(null);\n  const currentInstance = getCurrentInstance();\n  const uidRef = ref<string>('');\n\n  const getInstance = () => {\n    const instance = unref(modalInstanceRef);\n    if (!instance) {\n      error('useModalInner instance is undefined!');\n    }\n    return instance;\n  };\n\n  const register = (modalInstance: ModalMethods, uuid: string) => {\n    isProdMode() &&\n      tryOnUnmounted(() => {\n        modalInstanceRef.value = null;\n      });\n    uidRef.value = uuid;\n    modalInstanceRef.value = modalInstance;\n    currentInstance?.emit('register', modalInstance, uuid);\n  };\n\n  watchEffect(() => {\n    const data = dataTransfer[unref(uidRef)];\n    if (!data) return;\n    if (!callbackFn || !isFunction(callbackFn)) return;\n    nextTick(() => {\n      callbackFn(data);\n    });\n  });\n\n  return [\n    register,\n    {\n      changeLoading: (loading = true) => {\n        getInstance()?.setModalProps({ loading });\n      },\n      getVisible: computed((): boolean => {\n        return visibleData[~~unref(uidRef)];\n      }),\n      getOpen: computed((): boolean => {\n        return visibleData[~~unref(uidRef)];\n      }),\n      changeOkLoading: (loading = true) => {\n        getInstance()?.setModalProps({ confirmLoading: loading });\n      },\n\n      closeModal: () => {\n        getInstance()?.setModalProps({ open: false });\n      },\n\n      setModalProps: (props: Partial<ModalProps>) => {\n        getInstance()?.setModalProps(props);\n      },\n\n      redoModalHeight: () => {\n        const callRedo = getInstance()?.redoModalHeight;\n        callRedo && callRedo();\n      },\n    },\n  ];\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Modal/src/hooks/useModalContext.ts",
    "content": "import { InjectionKey } from 'vue';\nimport { createContext, useContext } from '/@/hooks/core/useContext';\n\nexport interface ModalContextProps {\n  redoModalHeight: () => void;\n}\n\nconst key: InjectionKey<ModalContextProps> = Symbol();\n\nexport function createModalContext(context: ModalContextProps) {\n  return createContext<ModalContextProps>(context, key);\n}\n\nexport function useModalContext() {\n  return useContext<ModalContextProps>(key);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Modal/src/hooks/useModalDrag.ts",
    "content": "import { Ref, unref, watchEffect } from 'vue';\nimport { useTimeoutFn } from '/@/hooks/core/useTimeout';\n\nexport interface UseModalDragMoveContext {\n  draggable: Ref<boolean>;\n  destroyOnClose: Ref<boolean | undefined> | undefined;\n  visible: Ref<boolean>;\n}\n\nexport function useModalDragMove(context: UseModalDragMoveContext) {\n  const getStyle = (dom: any, attr: any) => {\n    return getComputedStyle(dom)[attr];\n  };\n  const drag = (wrap: any) => {\n    if (!wrap) return;\n    wrap.setAttribute('data-drag', unref(context.draggable));\n    const dialogHeaderEl = wrap.querySelector('.ant-modal-header');\n    const dragDom = wrap.querySelector('.ant-modal');\n\n    if (!dialogHeaderEl || !dragDom || !unref(context.draggable)) return;\n\n    dialogHeaderEl.style.cursor = 'move';\n\n    dialogHeaderEl.onmousedown = (e: any) => {\n      if (!e) return;\n      // 鼠标按下，计算当前元素距离可视区的距离\n      const disX = e.clientX;\n      const disY = e.clientY;\n      const screenWidth = document.body.clientWidth; // body当前宽度\n      const screenHeight = document.documentElement.clientHeight; // 可见区域高度(应为body高度，可某些环境下无法获取)\n\n      const dragDomWidth = dragDom.offsetWidth; // 对话框宽度\n      const dragDomheight = dragDom.offsetHeight; // 对话框高度\n\n      const minDragDomLeft = dragDom.offsetLeft;\n\n      const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth;\n      const minDragDomTop = dragDom.offsetTop;\n      let maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight;\n      // 代码逻辑说明: [issue/430]弹出页面出现自动吸顶，无法移动和显示头部---\n      if(maxDragDomTop<0){\n        maxDragDomTop = screenHeight - dragDom.offsetTop\n      }\n      // 获取到的值带px 正则匹配替换\n      const domLeft = getStyle(dragDom, 'left');\n      const domTop = getStyle(dragDom, 'top');\n      let styL = +domLeft;\n      let styT = +domTop;\n\n      // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px\n      if (domLeft.includes('%')) {\n        styL = +document.body.clientWidth * (+domLeft.replace(/%/g, '') / 100);\n        styT = +document.body.clientHeight * (+domTop.replace(/%/g, '') / 100);\n      } else {\n        styL = +domLeft.replace(/px/g, '');\n        styT = +domTop.replace(/px/g, '');\n      }\n\n      document.onmousemove = function (e) {\n        // 通过事件委托，计算移动的距离\n        let left = e.clientX - disX;\n        let top = e.clientY - disY;\n\n        // 边界处理\n        if (-left > minDragDomLeft) {\n          left = -minDragDomLeft;\n        } else if (left > maxDragDomLeft) {\n          left = maxDragDomLeft;\n        }\n\n        if (-top > minDragDomTop) {\n          top = -minDragDomTop;\n        } else if (top > maxDragDomTop) {\n          top = maxDragDomTop;\n        }\n\n        // 移动当前元素\n        dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`;\n      };\n\n      document.onmouseup = () => {\n        document.onmousemove = null;\n        document.onmouseup = null;\n      };\n    };\n  };\n\n  const handleDrag = () => {\n    const dragWraps = document.querySelectorAll('.ant-modal-wrap');\n    for (const wrap of Array.from(dragWraps)) {\n      if (!wrap) continue;\n      const display = getStyle(wrap, 'display');\n      const draggable = wrap.getAttribute('data-drag');\n      if (display !== 'none') {\n        // 拖拽位置\n        if (draggable === null || unref(context.destroyOnClose)) {\n          drag(wrap);\n        }\n      }\n    }\n  };\n\n  watchEffect(() => {\n    if (!unref(context.visible) || !unref(context.draggable)) {\n      return;\n    }\n    useTimeoutFn(() => {\n      handleDrag();\n    }, 30);\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Modal/src/hooks/useModalFullScreen.ts",
    "content": "import { computed, Ref, ref, unref } from 'vue';\n\nexport interface UseFullScreenContext {\n  wrapClassName: Ref<string | undefined>;\n  modalWrapperRef: Ref<ComponentRef>;\n  extHeightRef: Ref<number>;\n}\n\nexport function useFullScreen(context: UseFullScreenContext) {\n  // const formerHeightRef = ref(0);\n  const fullScreenRef = ref(false);\n\n  const getWrapClassName = computed(() => {\n    const clsName = unref(context.wrapClassName) || '';\n    return unref(fullScreenRef) ? `fullscreen-modal ${clsName} ` : unref(clsName);\n  });\n\n  function handleFullScreen(e: Event) {\n    e && e.stopPropagation();\n    fullScreenRef.value = !unref(fullScreenRef);\n\n    // const modalWrapper = unref(context.modalWrapperRef);\n\n    // if (!modalWrapper) return;\n\n    // const wrapperEl = modalWrapper.$el as HTMLElement;\n    // if (!wrapperEl) return;\n    // const modalWrapSpinEl = wrapperEl.querySelector('.ant-spin-nested-loading') as HTMLElement;\n\n    // if (!modalWrapSpinEl) return;\n\n    // if (!unref(formerHeightRef) && unref(fullScreenRef)) {\n    //   formerHeightRef.value = modalWrapSpinEl.offsetHeight;\n    // }\n\n    // if (unref(fullScreenRef)) {\n    //   modalWrapSpinEl.style.height = `${window.innerHeight - unref(context.extHeightRef)}px`;\n    // } else {\n    //   modalWrapSpinEl.style.height = `${unref(formerHeightRef)}px`;\n    // }\n  }\n  return { getWrapClassName, handleFullScreen, fullScreenRef };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Modal/src/index.less",
    "content": ".ant-modal-root .fullscreen-modal {\n  overflow: hidden;\n\n  .ant-modal {\n    top: 0 !important;\n    right: 0 !important;\n    bottom: 0 !important;\n    left: 0 !important;\n    width: 100% !important;\n    height: 100% !important;\n    max-width: 100% !important;\n    max-height: 100% !important;\n\n    &-content {\n      height: 100%;\n    }\n\n    .ant-modal-header,\n    .@{namespace}-basic-title {\n      cursor: default !important;\n    }\n    // update-begin--author:liaozhiyang---date:20241225---for：【issues/7601】ant-design-vue@4.2.6后弹窗全屏底部有空隙\n    & > div:has( > .ant-modal-content) {\n      height: 100%;\n    }\n    // update-end--author:liaozhiyang---date:20241225---for：【issues/7601】ant-design-vue@4.2.6后弹窗全屏底部有空隙\n  }\n}\n\n.ant-modal {\n  width: 520px;\n  padding-bottom: 0;\n\n  .ant-modal-body > .scrollbar {\n    padding: 14px;\n  }\n\n  .ant-modal-title {\n    font-size: 16px;\n    font-weight: bold;\n    line-height: 16px;\n\n    .base-title {\n      cursor: move !important;\n    }\n  }\n\n  .ant-modal-body {\n    padding: 0;\n\n    > .scrollbar > .scrollbar__bar.is-horizontal {\n      display: none;\n    }\n  }\n\n  .ant-modal-large {\n    top: 60px;\n\n    &--mini {\n      top: 16px;\n    }\n  }\n\n  .ant-modal-header {\n    padding: 16px;\n  }\n\n  .ant-modal-content {\n    box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);\n  }\n\n  .ant-modal-footer {\n    button + button {\n      margin-left: 10px;\n    }\n  }\n\n  .ant-modal-close {\n    font-weight: normal;\n    outline: none;\n  }\n\n  .ant-modal-close-x {\n    // update-begin--author:liaozhiyang---date:20241010---for：【issues/7260】原生a-modal关闭按钮位置偏移\n    // display: inline-block;\n    // width: 96px;\n    // height: 56px;\n    // line-height: 56px;\n    // update-end--author:liaozhiyang---date:20241010---for：【issues/7260】原生a-modal关闭按钮位置偏移\n  }\n\n  .ant-modal-confirm-body {\n    .ant-modal-confirm-content {\n      // color: #fff;\n\n      > * {\n        color: @text-color-help-dark;\n      }\n    }\n  }\n\n  .ant-modal-confirm-confirm.error .ant-modal-confirm-body > .anticon {\n    color: @error-color;\n  }\n\n  .ant-modal-confirm-btns {\n    .ant-btn:last-child {\n      margin-right: 0;\n    }\n  }\n\n  .ant-modal-confirm-info {\n    .ant-modal-confirm-body > .anticon {\n      color: @warning-color;\n    }\n  }\n\n  .ant-modal-confirm-confirm.success {\n    .ant-modal-confirm-body > .anticon {\n      color: @success-color;\n    }\n  }\n}\n\n.ant-modal-confirm .ant-modal-body {\n  padding: 24px !important;\n}\n@media screen and (max-height: 600px) {\n  .ant-modal {\n    top: 60px;\n  }\n}\n@media screen and (max-height: 540px) {\n  .ant-modal {\n    top: 30px;\n  }\n}\n@media screen and (max-height: 480px) {\n  .ant-modal {\n    top: 10px;\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Modal/src/props.ts",
    "content": "import type { PropType, CSSProperties } from 'vue';\nimport type { ModalWrapperProps } from './typing';\nimport { ButtonProps } from 'ant-design-vue/es/button/buttonTypes';\nimport { useI18n } from '/@/hooks/web/useI18n';\n\nconst { t } = useI18n();\n\nexport const modalProps = {\n  visible: { type: Boolean },\n  scrollTop: { type: Boolean, default: true },\n  height: { type: Number },\n  minHeight: { type: Number },\n  // open drag\n  draggable: { type: Boolean, default: true },\n  centered: { type: Boolean },\n  cancelText: { type: String, default: t('common.cancelText') },\n  okText: { type: String, default: t('common.okText') },\n\n  closeFunc: Function as PropType<() => Promise<boolean>>,\n\n  modalHeaderHeight: Number,\n  modalFooterHeight: Number,\n};\n\nexport const basicProps = Object.assign({}, modalProps, {\n  defaultFullscreen: { type: Boolean },\n  // Can it be full screen\n  canFullscreen: { type: Boolean, default: true },\n  // After enabling the wrapper, the bottom can be increased in height\n  wrapperFooterOffset: { type: Number, default: 0 },\n  // Warm reminder message\n  helpMessage: [String, Array] as PropType<string | string[]>,\n  // Whether to setting wrapper\n  useWrapper: { type: Boolean, default: true },\n  loading: { type: Boolean },\n  loadingTip: { type: String },\n  /**\n   * @description: Show close button\n   */\n  showCancelBtn: { type: Boolean, default: true },\n  /**\n   * @description: Show confirmation button\n   */\n  showOkBtn: { type: Boolean, default: true },\n\n  wrapperProps: Object as PropType<Partial<ModalWrapperProps>>,\n\n  afterClose: Function as PropType<() => Promise<VueNode>>,\n\n  bodyStyle: Object as PropType<CSSProperties>,\n\n  closable: { type: Boolean, default: true },\n\n  closeIcon: Object as PropType<VueNode>,\n\n  confirmLoading: { type: Boolean },\n\n  destroyOnClose: { type: Boolean },\n\n  footer: Object as PropType<VueNode>,\n\n  getContainer: Function as PropType<() => any>,\n\n  mask: { type: Boolean, default: true },\n\n  maskClosable: { type: Boolean, default: true },\n  keyboard: { type: Boolean, default: true },\n\n  maskStyle: Object as PropType<CSSProperties>,\n\n  okType: { type: String, default: 'primary' },\n\n  okButtonProps: Object as PropType<ButtonProps>,\n\n  cancelButtonProps: Object as PropType<ButtonProps>,\n\n  title: { type: String },\n\n  visible: { type: Boolean },\n\n  open: { type: Boolean },\n\n  width: [String, Number] as PropType<string | number>,\n\n  wrapClassName: { type: String },\n\n  zIndex: { type: Number },\n  maxHeight: { type: Number },\n  // 是否开启评论区域\n  enableComment: { type: Boolean, default: false },\n});\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Modal/src/typing.ts",
    "content": "import type { ButtonProps } from 'ant-design-vue/lib/button/buttonTypes';\nimport type { CSSProperties, VNodeChild, ComputedRef } from 'vue';\n/**\n * @description: 弹窗对外暴露的方法\n */\nexport interface ModalMethods {\n  setModalProps: (props: Partial<ModalProps>) => void;\n  emitVisible?: (visible: boolean, uid: number) => void;\n  redoModalHeight?: () => void;\n}\n\nexport type RegisterFn = (modalMethods: ModalMethods, uuid?: string) => void;\n\nexport interface ReturnMethods extends ModalMethods {\n  openModal: <T = any>(props?: boolean, data?: T, openOnSet?: boolean) => void;\n  closeModal: () => void;\n  getVisible?: ComputedRef<boolean>;\n  getOpen?: ComputedRef<boolean>;\n}\n\nexport type UseModalReturnType = [RegisterFn, ReturnMethods];\n\nexport interface ReturnInnerMethods extends ModalMethods {\n  closeModal: () => void;\n  changeLoading: (loading: boolean) => void;\n  changeOkLoading: (loading: boolean) => void;\n  getVisible?: ComputedRef<boolean>;\n  getOpen?: ComputedRef<boolean>;\n  redoModalHeight: () => void;\n}\n\nexport type UseModalInnerReturnType = [RegisterFn, ReturnInnerMethods];\n\nexport interface ModalProps {\n  minHeight?: number;\n  height?: number;\n  // 启用wrapper后 底部可以适当增加高度\n  wrapperFooterOffset?: number;\n  draggable?: boolean;\n  scrollTop?: boolean;\n\n  // 是否可以进行全屏\n  canFullscreen?: boolean;\n  defaultFullscreen?: boolean;\n  visible?: boolean;\n  open?: boolean;\n  // 温馨提醒信息\n  helpMessage: string | string[];\n\n  // 是否使用modalWrapper\n  useWrapper: boolean;\n\n  loading: boolean;\n  loadingTip?: string;\n\n  wrapperProps: Omit<ModalWrapperProps, 'loading'>;\n\n  showOkBtn: boolean;\n  showCancelBtn: boolean;\n  closeFunc: () => Promise<any>;\n\n  /**\n   * Specify a function that will be called when modal is closed completely.\n   * @type Function\n   */\n  afterClose?: () => any;\n\n  /**\n   * Body style for modal body element. Such as height, padding etc.\n   * @default {}\n   * @type object\n   */\n  bodyStyle?: CSSProperties;\n\n  /**\n   * Text of the Cancel button\n   * @default 'cancel'\n   * @type string\n   */\n  cancelText?: string;\n\n  /**\n   * Centered Modal\n   * @default false\n   * @type boolean\n   */\n  centered?: boolean;\n\n  /**\n   * Whether a close (x) button is visible on top right of the modal dialog or not\n   * @default true\n   * @type boolean\n   */\n  closable?: boolean;\n  /**\n   * Whether a close (x) button is visible on top right of the modal dialog or not\n   */\n  closeIcon?: VNodeChild | JSX.Element;\n\n  /**\n   * Whether to apply loading visual effect for OK button or not\n   * @default false\n   * @type boolean\n   */\n  confirmLoading?: boolean;\n\n  /**\n   * Whether to unmount child components on onClose\n   * @default false\n   * @type boolean\n   */\n  destroyOnClose?: boolean;\n\n  /**\n   * Footer content, set as :footer=\"null\" when you don't need default buttons\n   * @default OK and Cancel buttons\n   * @type any (string | slot)\n   */\n  footer?: VNodeChild | JSX.Element;\n\n  /**\n   * Return the mount node for Modal\n   * @default () => document.body\n   * @type Function\n   */\n  getContainer?: (instance: any) => HTMLElement;\n\n  /**\n   * Whether show mask or not.\n   * @default true\n   * @type boolean\n   */\n  mask?: boolean;\n\n  /**\n   * Whether to close the modal dialog when the mask (area outside the modal) is clicked\n   * @default true\n   * @type boolean\n   */\n  maskClosable?: boolean;\n\n  /**\n   * Style for modal's mask element.\n   * @default {}\n   * @type object\n   */\n  maskStyle?: CSSProperties;\n\n  /**\n   * Text of the OK button\n   * @default 'OK'\n   * @type string\n   */\n  okText?: string;\n\n  /**\n   * Button type of the OK button\n   * @default 'primary'\n   * @type string\n   */\n  okType?: 'primary' | 'danger' | 'dashed' | 'ghost' | 'default';\n\n  /**\n   * The ok button props, follow jsx rules\n   * @type object\n   */\n  okButtonProps?: ButtonProps;\n\n  /**\n   * The cancel button props, follow jsx rules\n   * @type object\n   */\n  cancelButtonProps?: ButtonProps;\n\n  /**\n   * The modal dialog's title\n   * @type any (string | slot)\n   */\n  title?: VNodeChild | JSX.Element;\n\n  /**\n   * Width of the modal dialog\n   * @default 520\n   * @type string | number\n   */\n  width?: string | number;\n\n  /**\n   * The class name of the container of the modal dialog\n   * @type string\n   */\n  wrapClassName?: string;\n\n  /**\n   * The z-index of the Modal\n   * @default 1000\n   * @type number\n   */\n  zIndex?: number;\n\n  enableComment?: boolean;\n\n  modalHeaderHeight: number;\n  modalFooterHeight: number;\n}\n\nexport interface ModalWrapperProps {\n  footerOffset?: number;\n  loading: boolean;\n  modalHeaderHeight: number;\n  modalFooterHeight: number;\n  minHeight: number;\n  height: number;\n  visible: boolean;\n  fullScreen: boolean;\n  useWrapper: boolean;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Page/index.ts",
    "content": "import { withInstall } from '/@/utils';\n\nimport pageFooter from './src/PageFooter.vue';\nimport pageWrapper from './src/PageWrapper.vue';\n\nexport const PageFooter = withInstall(pageFooter);\nexport const PageWrapper = withInstall(pageWrapper);\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Page/injectionKey.ts",
    "content": "export const PageWrapperFixedHeightKey = 'PageWrapperFixedHeight';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Page/src/PageFooter.vue",
    "content": "<template>\n  <div :class=\"prefixCls\" :style=\"{ width: getCalcContentWidth }\">\n    <div :class=\"`${prefixCls}__left`\">\n      <slot name=\"left\"></slot>\n    </div>\n    <slot></slot>\n    <div :class=\"`${prefixCls}__right`\">\n      <slot name=\"right\"></slot>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  export default defineComponent({\n    name: 'PageFooter',\n    inheritAttrs: false,\n    setup() {\n      const { prefixCls } = useDesign('page-footer');\n      const { getCalcContentWidth } = useMenuSetting();\n      return { prefixCls, getCalcContentWidth };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-page-footer';\n\n  .@{prefix-cls} {\n    position: fixed;\n    right: 0;\n    bottom: 0;\n    z-index: @page-footer-z-index;\n    display: flex;\n    width: 100%;\n    align-items: center;\n    padding: 0 24px;\n    line-height: 44px;\n    background-color: @component-background;\n    border-top: 1px solid @border-color-base;\n    box-shadow: 0 -6px 16px -8px rgba(0, 0, 0, 0.08), 0 -9px 28px 0 rgba(0, 0, 0, 0.05), 0 -12px 48px 16px rgba(0, 0, 0, 0.03);\n    transition: width 0.2s;\n\n    &__left {\n      flex: 1 1;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Page/src/PageWrapper.vue",
    "content": "<template>\n  <div :class=\"getClass\" ref=\"wrapperRef\">\n    <PageHeader\n      :ghost=\"ghost\"\n      :title=\"title\"\n      v-bind=\"omit($attrs, 'class')\"\n      ref=\"headerRef\"\n      v-if=\"content || $slots.headerContent || title || getHeaderSlots.length\"\n    >\n      <template #default>\n        <template v-if=\"content\">\n          {{ content }}\n        </template>\n        <slot name=\"headerContent\" v-else></slot>\n      </template>\n      <template #[item]=\"data\" v-for=\"item in getHeaderSlots\">\n        <slot :name=\"item\" v-bind=\"data || {}\"></slot>\n      </template>\n    </PageHeader>\n\n    <div class=\"overflow-hidden\" :class=\"getContentClass\" :style=\"getContentStyle\" ref=\"contentRef\">\n      <slot></slot>\n    </div>\n\n    <PageFooter v-if=\"getShowFooter\" ref=\"footerRef\">\n      <template #left>\n        <slot name=\"leftFooter\"></slot>\n      </template>\n      <template #right>\n        <slot name=\"rightFooter\"></slot>\n      </template>\n    </PageFooter>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { CSSProperties, PropType, provide } from 'vue';\n\n  import { defineComponent, computed, watch, ref, unref } from 'vue';\n  import PageFooter from './PageFooter.vue';\n\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { propTypes } from '/@/utils/propTypes';\n  import { omit } from 'lodash-es';\n  import { PageHeader } from 'ant-design-vue';\n  import { useContentHeight } from '/@/hooks/web/useContentHeight';\n  import { PageWrapperFixedHeightKey } from '../injectionKey';\n\n  export default defineComponent({\n    name: 'PageWrapper',\n    components: { PageFooter, PageHeader },\n    inheritAttrs: false,\n    props: {\n      title: propTypes.string,\n      dense: propTypes.bool,\n      ghost: propTypes.bool,\n      content: propTypes.string,\n      contentStyle: {\n        type: Object as PropType<CSSProperties>,\n      },\n      contentBackground: propTypes.bool,\n      contentFullHeight: propTypes.bool,\n      contentClass: propTypes.string,\n      fixedHeight: propTypes.bool,\n      upwardSpace: propTypes.oneOfType([propTypes.number, propTypes.string]).def(0),\n    },\n    setup(props, { slots, attrs }) {\n      const wrapperRef = ref(null);\n      const headerRef = ref(null);\n      const contentRef = ref(null);\n      const footerRef = ref(null);\n      const { prefixCls } = useDesign('page-wrapper');\n\n      provide(\n        PageWrapperFixedHeightKey,\n        computed(() => props.fixedHeight)\n      );\n\n      const getIsContentFullHeight = computed(() => {\n        return props.contentFullHeight;\n      });\n\n      const getUpwardSpace = computed(() => props.upwardSpace);\n      const { redoHeight, setCompensation, contentHeight } = useContentHeight(\n        getIsContentFullHeight,\n        wrapperRef,\n        [headerRef, footerRef],\n        [contentRef],\n        getUpwardSpace\n      );\n      setCompensation({ useLayoutFooter: true, elements: [footerRef] });\n\n      const getClass = computed(() => {\n        return [\n          prefixCls,\n          {\n            [`${prefixCls}--dense`]: props.dense,\n          },\n          attrs.class ?? {},\n        ];\n      });\n\n      const getShowFooter = computed(() => slots?.leftFooter || slots?.rightFooter);\n\n      const getHeaderSlots = computed(() => {\n        return Object.keys(omit(slots, 'default', 'leftFooter', 'rightFooter', 'headerContent'));\n      });\n\n      const getContentStyle = computed((): CSSProperties => {\n        const { contentFullHeight, contentStyle, fixedHeight } = props;\n        if (!contentFullHeight) {\n          return { ...contentStyle };\n        }\n\n        const height = `${unref(contentHeight)}px`;\n        return {\n          ...contentStyle,\n          minHeight: height,\n          ...(fixedHeight ? { height } : {}),\n        };\n      });\n\n      const getContentClass = computed(() => {\n        const { contentBackground, contentClass } = props;\n        return [\n          `${prefixCls}-content`,\n          contentClass,\n          {\n            [`${prefixCls}-content-bg`]: contentBackground,\n          },\n        ];\n      });\n\n      watch(\n        () => [getShowFooter.value],\n        () => {\n          redoHeight();\n        },\n        {\n          flush: 'post',\n          immediate: true,\n        }\n      );\n\n      return {\n        getContentStyle,\n        wrapperRef,\n        headerRef,\n        contentRef,\n        footerRef,\n        getClass,\n        getHeaderSlots,\n        prefixCls,\n        getShowFooter,\n        omit,\n        getContentClass,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-page-wrapper';\n\n  .@{prefix-cls} {\n    position: relative;\n\n    .@{prefix-cls}-content {\n      margin: 16px;\n    }\n\n    .ant-page-header {\n      &:empty {\n        padding: 0;\n      }\n    }\n\n    &-content-bg {\n      background-color: @component-background;\n    }\n\n    &--dense {\n      .@{prefix-cls}-content {\n        margin: 0;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Preview/index.ts",
    "content": "export { default as ImagePreview } from './src/Preview.vue';\nexport { createImgPreview } from './src/functional';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Preview/src/Functional.vue",
    "content": "<script lang=\"tsx\">\n  import { defineComponent, ref, unref, computed, reactive, watchEffect } from 'vue';\n  import { CloseOutlined, LeftOutlined, RightOutlined } from '@ant-design/icons-vue';\n  import resumeSvg from '/@/assets/svg/preview/resume.svg';\n  import rotateSvg from '/@/assets/svg/preview/p-rotate.svg';\n  import scaleSvg from '/@/assets/svg/preview/scale.svg';\n  import unScaleSvg from '/@/assets/svg/preview/unscale.svg';\n  import unRotateSvg from '/@/assets/svg/preview/unrotate.svg';\n\n  enum StatueEnum {\n    LOADING,\n    DONE,\n    FAIL,\n  }\n  interface ImgState {\n    currentUrl: string;\n    imgScale: number;\n    imgRotate: number;\n    imgTop: number;\n    imgLeft: number;\n    currentIndex: number;\n    status: StatueEnum;\n    moveX: number;\n    moveY: number;\n    show: boolean;\n  }\n  const props = {\n    show: {\n      type: Boolean as PropType<boolean>,\n      default: false,\n    },\n    imageList: {\n      type: [Array] as PropType<string[]>,\n      default: null,\n    },\n    index: {\n      type: Number as PropType<number>,\n      default: 0,\n    },\n    scaleStep: {\n      type: Number as PropType<number>,\n    },\n    defaultWidth: {\n      type: Number as PropType<number>,\n    },\n    maskClosable: {\n      type: Boolean as PropType<boolean>,\n    },\n    rememberState: {\n      type: Boolean as PropType<boolean>,\n    },\n  };\n\n  const prefixCls = 'img-preview';\n  export default defineComponent({\n    name: 'ImagePreview',\n    props,\n    emits: ['img-load', 'img-error'],\n    setup(props, { expose, emit }) {\n      interface stateInfo {\n        scale: number;\n        rotate: number;\n        top: number;\n        left: number;\n      }\n      const stateMap = new Map<string, stateInfo>();\n      const imgState = reactive<ImgState>({\n        currentUrl: '',\n        imgScale: 1,\n        imgRotate: 0,\n        imgTop: 0,\n        imgLeft: 0,\n        status: StatueEnum.LOADING,\n        currentIndex: 0,\n        moveX: 0,\n        moveY: 0,\n        show: props.show,\n      });\n\n      const wrapElRef = ref<HTMLDivElement | null>(null);\n      const imgElRef = ref<HTMLImageElement | null>(null);\n\n      // 初始化\n      function init() {\n        initMouseWheel();\n        const { index, imageList } = props;\n\n        if (!imageList || !imageList.length) {\n          throw new Error('imageList is undefined');\n        }\n        imgState.currentIndex = index;\n        handleIChangeImage(imageList[index]);\n      }\n\n      // 重置\n      function initState() {\n        imgState.imgScale = 1;\n        imgState.imgRotate = 0;\n        imgState.imgTop = 0;\n        imgState.imgLeft = 0;\n      }\n\n      // 初始化鼠标滚轮事件\n      function initMouseWheel() {\n        const wrapEl = unref(wrapElRef);\n        if (!wrapEl) {\n          return;\n        }\n        (wrapEl as any).onmousewheel = scrollFunc;\n        // 火狐浏览器没有onmousewheel事件，用DOMMouseScroll代替\n        document.body.addEventListener('DOMMouseScroll', scrollFunc);\n        // 禁止火狐浏览器下拖拽图片的默认事件\n        document.ondragstart = function () {\n          return false;\n        };\n      }\n\n      const getScaleStep = computed(() => {\n        const scaleStep = props?.scaleStep ?? 0;\n        if (scaleStep ?? (0 > 0 && scaleStep < 100)) {\n          return scaleStep / 100;\n        } else {\n          return imgState.imgScale / 10;\n        }\n      });\n\n      // 监听鼠标滚轮\n      function scrollFunc(e: any) {\n        e = e || window.event;\n        e.delta = e.wheelDelta || -e.detail;\n\n        e.preventDefault();\n        if (e.delta > 0) {\n          // 滑轮向上滚动\n          scaleFunc(getScaleStep.value);\n        }\n        if (e.delta < 0) {\n          // 滑轮向下滚动\n          scaleFunc(-getScaleStep.value);\n        }\n      }\n      // 缩放函数\n      function scaleFunc(num: number) {\n        if (imgState.imgScale <= 0.2 && num < 0) return;\n        imgState.imgScale += num;\n        // 代码逻辑说明: 【QQYUN-13162】图片预览点击缩小一下就没了\n        if (imgState.imgScale < 0.2) {\n          imgState.imgScale = 0.2;\n        }\n      }\n\n      // 旋转图片\n      function rotateFunc(deg: number) {\n        imgState.imgRotate += deg;\n      }\n\n      // 鼠标事件\n      function handleMouseUp() {\n        const imgEl = unref(imgElRef);\n        if (!imgEl) return;\n        imgEl.onmousemove = null;\n      }\n\n      // 更换图片\n      function handleIChangeImage(url: string) {\n        imgState.status = StatueEnum.LOADING;\n        const img = new Image();\n        img.src = url;\n        img.onload = (e: Event) => {\n          if (imgState.currentUrl !== url) {\n            const ele: any[] = e.composedPath();\n            if (props.rememberState) {\n              // 保存当前图片的缩放信息\n              stateMap.set(imgState.currentUrl, {\n                scale: imgState.imgScale,\n                top: imgState.imgTop,\n                left: imgState.imgLeft,\n                rotate: imgState.imgRotate,\n              });\n              // 如果之前已存储缩放信息，就应用\n              const stateInfo = stateMap.get(url);\n              if (stateInfo) {\n                imgState.imgScale = stateInfo.scale;\n                imgState.imgTop = stateInfo.top;\n                imgState.imgRotate = stateInfo.rotate;\n                imgState.imgLeft = stateInfo.left;\n              } else {\n                initState();\n                if (props.defaultWidth) {\n                  imgState.imgScale = props.defaultWidth / ele[0].naturalWidth;\n                }\n              }\n            } else {\n              if (props.defaultWidth) {\n                imgState.imgScale = props.defaultWidth / ele[0].naturalWidth;\n              }\n            }\n\n            ele &&\n              emit('img-load', {\n                index: imgState.currentIndex,\n                dom: ele[0] as HTMLImageElement,\n                url,\n              });\n          }\n          imgState.currentUrl = url;\n          imgState.status = StatueEnum.DONE;\n        };\n        img.onerror = (e: Event) => {\n          const ele: EventTarget[] = e.composedPath();\n          ele &&\n            emit('img-error', {\n              index: imgState.currentIndex,\n              dom: ele[0] as HTMLImageElement,\n              url,\n            });\n          imgState.status = StatueEnum.FAIL;\n        };\n      }\n\n      // 关闭\n      function handleClose(e: MouseEvent) {\n        e && e.stopPropagation();\n        close();\n      }\n\n      function close() {\n        imgState.show = false;\n        // 移除火狐浏览器下的鼠标滚动事件\n        document.body.removeEventListener('DOMMouseScroll', scrollFunc);\n        // 恢复火狐及Safari浏览器下的图片拖拽\n        document.ondragstart = null;\n      }\n\n      // 图片复原\n      function resume() {\n        initState();\n      }\n\n      expose({\n        resume,\n        close,\n        prev: handleChange.bind(null, 'left'),\n        next: handleChange.bind(null, 'right'),\n        setScale: (scale: number) => {\n          if (scale > 0 && scale <= 10) imgState.imgScale = scale;\n        },\n        setRotate: (rotate: number) => {\n          imgState.imgRotate = rotate;\n        },\n      });\n\n      // 上一页下一页\n      function handleChange(direction: 'left' | 'right') {\n        const { currentIndex } = imgState;\n        const { imageList } = props;\n        if (direction === 'left') {\n          imgState.currentIndex--;\n          if (currentIndex <= 0) {\n            imgState.currentIndex = imageList.length - 1;\n          }\n        }\n        if (direction === 'right') {\n          imgState.currentIndex++;\n          if (currentIndex >= imageList.length - 1) {\n            imgState.currentIndex = 0;\n          }\n        }\n        handleIChangeImage(imageList[imgState.currentIndex]);\n      }\n\n      function handleAddMoveListener(e: MouseEvent) {\n        e = e || window.event;\n        imgState.moveX = e.clientX;\n        imgState.moveY = e.clientY;\n        const imgEl = unref(imgElRef);\n        if (imgEl) {\n          imgEl.onmousemove = moveFunc;\n        }\n      }\n\n      function moveFunc(e: MouseEvent) {\n        e = e || window.event;\n        e.preventDefault();\n        const movementX = e.clientX - imgState.moveX;\n        const movementY = e.clientY - imgState.moveY;\n        imgState.imgLeft += movementX;\n        imgState.imgTop += movementY;\n        imgState.moveX = e.clientX;\n        imgState.moveY = e.clientY;\n      }\n\n      // 获取图片样式\n      const getImageStyle = computed(() => {\n        const { imgScale, imgRotate, imgTop, imgLeft } = imgState;\n        return {\n          transform: `scale(${imgScale}) rotate(${imgRotate}deg)`,\n          marginTop: `${imgTop}px`,\n          marginLeft: `${imgLeft}px`,\n          maxWidth: props.defaultWidth ? 'unset' : '100%',\n        };\n      });\n\n      const getIsMultipleImage = computed(() => {\n        const { imageList } = props;\n        return imageList.length > 1;\n      });\n\n      watchEffect(() => {\n        if (props.show) {\n          init();\n        }\n        if (props.imageList) {\n          initState();\n        }\n      });\n\n      const handleMaskClick = (e: MouseEvent) => {\n        if (props.maskClosable && e.target && (e.target as HTMLDivElement).classList.contains(`${prefixCls}-content`)) {\n          handleClose(e);\n        }\n      };\n\n      const renderClose = () => {\n        return (\n          <div class={`${prefixCls}__close`} onClick={handleClose}>\n            <CloseOutlined class={`${prefixCls}__close-icon`} />\n          </div>\n        );\n      };\n\n      const renderIndex = () => {\n        if (!unref(getIsMultipleImage)) {\n          return null;\n        }\n        const { currentIndex } = imgState;\n        const { imageList } = props;\n        return (\n          <div class={`${prefixCls}__index`}>\n            {currentIndex + 1} / {imageList.length}\n          </div>\n        );\n      };\n\n      const renderController = () => {\n        return (\n          <div class={`${prefixCls}__controller`}>\n            <div class={`${prefixCls}__controller-item`} onClick={() => scaleFunc(-getScaleStep.value)}>\n              <img src={unScaleSvg} />\n            </div>\n            <div class={`${prefixCls}__controller-item`} onClick={() => scaleFunc(getScaleStep.value)}>\n              <img src={scaleSvg} />\n            </div>\n            <div class={`${prefixCls}__controller-item`} onClick={resume}>\n              <img src={resumeSvg} />\n            </div>\n            <div class={`${prefixCls}__controller-item`} onClick={() => rotateFunc(-90)}>\n              <img src={unRotateSvg} />\n            </div>\n            <div class={`${prefixCls}__controller-item`} onClick={() => rotateFunc(90)}>\n              <img src={rotateSvg} />\n            </div>\n          </div>\n        );\n      };\n\n      const renderArrow = (direction: 'left' | 'right') => {\n        if (!unref(getIsMultipleImage)) {\n          return null;\n        }\n        return (\n          <div class={[`${prefixCls}__arrow`, direction]} onClick={() => handleChange(direction)}>\n            {direction === 'left' ? <LeftOutlined /> : <RightOutlined />}\n          </div>\n        );\n      };\n\n      return () => {\n        return (\n          imgState.show && (\n            <div class={prefixCls} ref={wrapElRef} onMouseup={handleMouseUp} onClick={handleMaskClick}>\n              <div class={`${prefixCls}-content`}>\n                {/*<Spin*/}\n                {/*  indicator={<LoadingOutlined style=\"font-size: 24px\" spin />}*/}\n                {/*  spinning={true}*/}\n                {/*  class={[*/}\n                {/*    `${prefixCls}-image`,*/}\n                {/*    {*/}\n                {/*      hidden: imgState.status !== StatueEnum.LOADING,*/}\n                {/*    },*/}\n                {/*  ]}*/}\n                {/*/>*/}\n                <img\n                  style={unref(getImageStyle)}\n                  class={[`${prefixCls}-image`, imgState.status === StatueEnum.DONE ? '' : 'hidden']}\n                  ref={imgElRef}\n                  src={imgState.currentUrl}\n                  onMousedown={handleAddMoveListener}\n                />\n                {renderClose()}\n                {renderIndex()}\n                {renderController()}\n                {renderArrow('left')}\n                {renderArrow('right')}\n              </div>\n            </div>\n          )\n        );\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  .img-preview {\n    position: fixed;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    z-index: @preview-comp-z-index;\n    background: rgba(0, 0, 0, 0.5);\n    user-select: none;\n\n    &-content {\n      display: flex;\n      width: 100%;\n      height: 100%;\n      color: @white;\n      justify-content: center;\n      align-items: center;\n    }\n\n    &-image {\n      cursor: pointer;\n      transition: transform 0.3s;\n    }\n\n    &__close {\n      position: absolute;\n      top: -40px;\n      right: -40px;\n      width: 80px;\n      height: 80px;\n      overflow: hidden;\n      color: @white;\n      cursor: pointer;\n      background-color: rgba(0, 0, 0, 0.5);\n      border-radius: 50%;\n      transition: all 0.2s;\n\n      &-icon {\n        position: absolute;\n        top: 46px;\n        left: 16px;\n        font-size: 16px;\n      }\n\n      &:hover {\n        background-color: rgba(0, 0, 0, 0.8);\n      }\n    }\n\n    &__index {\n      position: absolute;\n      bottom: 5%;\n      left: 50%;\n      padding: 0 22px;\n      font-size: 16px;\n      background: rgba(109, 109, 109, 0.6);\n      border-radius: 15px;\n      transform: translateX(-50%);\n    }\n\n    &__controller {\n      position: absolute;\n      bottom: 10%;\n      left: 50%;\n      display: flex;\n      width: 260px;\n      height: 44px;\n      padding: 0 22px;\n      margin-left: -139px;\n      background: rgba(109, 109, 109, 0.6);\n      border-radius: 22px;\n      justify-content: center;\n\n      &-item {\n        display: flex;\n        height: 100%;\n        padding: 0 9px;\n        font-size: 24px;\n        cursor: pointer;\n        transition: all 0.2s;\n\n        &:hover {\n          transform: scale(1.2);\n        }\n\n        img {\n          width: 1em;\n        }\n      }\n    }\n\n    &__arrow {\n      position: absolute;\n      top: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      width: 50px;\n      height: 50px;\n      font-size: 28px;\n      cursor: pointer;\n      background-color: rgba(0, 0, 0, 0.5);\n      border-radius: 50%;\n      transition: all 0.2s;\n\n      &:hover {\n        background-color: rgba(0, 0, 0, 0.8);\n      }\n\n      &.left {\n        left: 50px;\n      }\n\n      &.right {\n        right: 50px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Preview/src/Preview.vue",
    "content": "<template>\n  <div :class=\"prefixCls\">\n    <PreviewGroup>\n      <slot v-if=\"!imageList || $slots.default\"></slot>\n      <template v-else>\n        <template v-for=\"item in getImageList\" :key=\"item.src\">\n          <Image v-bind=\"item\">\n            <template #placeholder v-if=\"item.placeholder\">\n              <Image v-bind=\"item\" :src=\"item.placeholder\" :preview=\"false\" />\n            </template>\n          </Image>\n        </template>\n      </template>\n    </PreviewGroup>\n  </div>\n</template>\n<script lang=\"ts\">\n  import type { PropType } from 'vue';\n  import { defineComponent, computed } from 'vue';\n\n  import { Image } from 'ant-design-vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { propTypes } from '/@/utils/propTypes';\n  import { isString } from '/@/utils/is';\n\n  interface ImageProps {\n    alt?: string;\n    fallback?: string;\n    src: string;\n    width: string | number;\n    height?: string | number;\n    placeholder?: string | boolean;\n    preview?:\n      | boolean\n      | {\n          visible?: boolean;\n          onVisibleChange?: (visible: boolean, prevVisible: boolean) => void;\n          getContainer: string | HTMLElement | (() => HTMLElement);\n        };\n  }\n\n  type ImageItem = string | ImageProps;\n\n  export default defineComponent({\n    name: 'ImagePreview',\n    components: {\n      Image,\n      PreviewGroup: Image.PreviewGroup,\n    },\n    props: {\n      functional: propTypes.bool,\n      imageList: {\n        type: Array as PropType<ImageItem[]>,\n      },\n    },\n    setup(props) {\n      const { prefixCls } = useDesign('image-preview');\n\n      const getImageList = computed((): any[] => {\n        const { imageList } = props;\n        if (!imageList) {\n          return [];\n        }\n        return imageList.map((item) => {\n          if (isString(item)) {\n            return {\n              src: item,\n              placeholder: false,\n            };\n          }\n          return item;\n        });\n      });\n\n      return {\n        prefixCls,\n        getImageList,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-image-preview';\n\n  .@{prefix-cls} {\n    .ant-image {\n      margin-right: 10px;\n    }\n\n    .ant-image-preview-operations {\n      background-color: rgba(0, 0, 0, 0.4);\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Preview/src/functional.ts",
    "content": "import type { Options, Props } from './typing';\nimport ImgPreview from './Functional.vue';\nimport { isClient } from '/@/utils/is';\nimport { createVNode, render } from 'vue';\n\nlet instance: ReturnType<typeof createVNode> | null = null;\n\nexport function createImgPreview(options: Options) {\n  if (!isClient) return;\n  const propsData: Partial<Props> = {};\n  const container = document.createElement('div');\n  Object.assign(propsData, { show: true, index: 0, scaleStep: 100 }, options);\n\n  instance = createVNode(ImgPreview, propsData);\n  render(instance, container);\n  document.body.appendChild(container);\n  return instance.component?.exposed;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Preview/src/typing.ts",
    "content": "export interface Options {\n  show?: boolean;\n  imageList: string[];\n  index?: number;\n  scaleStep?: number;\n  defaultWidth?: number;\n  maskClosable?: boolean;\n  rememberState?: boolean;\n  onImgLoad?: ({ index: number, url: string, dom: HTMLImageElement }) => void;\n  onImgError?: ({ index: number, url: string, dom: HTMLImageElement }) => void;\n}\n\nexport interface Props {\n  show: boolean;\n  instance: Props;\n  imageList: string[];\n  index: number;\n  scaleStep: number;\n  defaultWidth: number;\n  maskClosable: boolean;\n  rememberState: boolean;\n}\n\nexport interface PreviewActions {\n  resume: () => void;\n  close: () => void;\n  prev: () => void;\n  next: () => void;\n  setScale: (scale: number) => void;\n  setRotate: (rotate: number) => void;\n}\n\nexport interface ImageProps {\n  alt?: string;\n  fallback?: string;\n  src: string;\n  width: string | number;\n  height?: string | number;\n  placeholder?: string | boolean;\n  preview?:\n    | boolean\n    | {\n        visible?: boolean;\n        onVisibleChange?: (visible: boolean, prevVisible: boolean) => void;\n        getContainer: string | HTMLElement | (() => HTMLElement);\n      };\n}\n\nexport type ImageItem = string | ImageProps;\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Qrcode/index.ts",
    "content": "import { withInstall } from '/@/utils';\nimport qrCode from './src/Qrcode.vue';\n\nexport const QrCode = withInstall(qrCode);\nexport * from './src/typing';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Qrcode/src/Qrcode.vue",
    "content": "<template>\n  <div>\n    <component :is=\"tag\" ref=\"wrapRef\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, watch, PropType, ref, unref, onMounted } from 'vue';\n  import { toCanvas, QRCodeRenderersOptions, LogoType } from './qrcodePlus';\n  import { toDataURL } from 'qrcode';\n  import { downloadByUrl } from '/@/utils/file/download';\n  import { QrcodeDoneEventParams } from './typing';\n\n  export default defineComponent({\n    name: 'QrCode',\n    props: {\n      value: {\n        type: [String, Array] as PropType<string | any[]>,\n        default: null,\n      },\n      // 参数\n      options: {\n        type: Object as PropType<QRCodeRenderersOptions>,\n        default: null,\n      },\n      // 宽度\n      width: {\n        type: Number as PropType<number>,\n        default: 200,\n      },\n      // 中间logo图标\n      logo: {\n        type: [String, Object] as PropType<Partial<LogoType> | string>,\n        default: '',\n      },\n      // img 不支持内嵌logo\n      tag: {\n        type: String as PropType<'canvas' | 'img'>,\n        default: 'canvas',\n        validator: (v: string) => ['canvas', 'img'].includes(v),\n      },\n    },\n    emits: { done: (data: QrcodeDoneEventParams) => !!data, error: (error: any) => !!error },\n    setup(props, { emit }) {\n      const wrapRef = ref<HTMLCanvasElement | HTMLImageElement | null>(null);\n      async function createQrcode() {\n        try {\n          const { tag, value, options = {}, width, logo } = props;\n          const renderValue = String(value);\n          const wrapEl = unref(wrapRef);\n\n          // 无值不生成\n          if (renderValue == null || renderValue === '') {\n            return;\n          }\n\n          if (!wrapEl) return;\n\n          if (tag === 'canvas') {\n            const url: string = await toCanvas({\n              canvas: wrapEl,\n              width,\n              logo: logo as any,\n              content: renderValue,\n              options: options || {},\n            });\n            emit('done', { url, ctx: (wrapEl as HTMLCanvasElement).getContext('2d') });\n            return;\n          }\n\n          if (tag === 'img') {\n            const url = await toDataURL(renderValue, {\n              errorCorrectionLevel: 'H',\n              width,\n              ...options,\n            });\n            (unref(wrapRef) as HTMLImageElement).src = url;\n            emit('done', { url });\n          }\n        } catch (error) {\n          emit('error', error);\n        }\n      }\n      /**\n       * file download\n       */\n      function download(fileName?: string) {\n        let url = '';\n        const wrapEl = unref(wrapRef);\n        if (wrapEl instanceof HTMLCanvasElement) {\n          url = wrapEl.toDataURL();\n        } else if (wrapEl instanceof HTMLImageElement) {\n          url = wrapEl.src;\n        }\n        if (!url) return;\n        downloadByUrl({\n          url,\n          fileName,\n        });\n      }\n\n      onMounted(createQrcode);\n\n      // 监听参数变化重新生成二维码\n      watch(\n        props,\n        () => {\n          createQrcode();\n        },\n        {\n          deep: true,\n        }\n      );\n\n      return { wrapRef, download };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Qrcode/src/drawCanvas.ts",
    "content": "import { toCanvas } from 'qrcode';\nimport type { QRCodeRenderersOptions } from 'qrcode';\nimport { RenderQrCodeParams, ContentType } from './typing';\nimport { cloneDeep } from 'lodash-es';\n\nexport const renderQrCode = ({ canvas, content, width = 0, options: params = {} }: RenderQrCodeParams) => {\n  const options = cloneDeep(params);\n  // 容错率，默认对内容少的二维码采用高容错率，内容多的二维码采用低容错率\n  options.errorCorrectionLevel = options.errorCorrectionLevel || getErrorCorrectionLevel(content);\n\n  return getOriginWidth(content, options).then((_width: number) => {\n    options.scale = width === 0 ? undefined : (width / _width) * 4;\n    return toCanvas(canvas, content, options);\n  });\n};\n\n// 得到原QrCode的大小，以便缩放得到正确的QrCode大小\nfunction getOriginWidth(content: ContentType, options: QRCodeRenderersOptions) {\n  const _canvas = document.createElement('canvas');\n  return toCanvas(_canvas, content, options).then(() => _canvas.width);\n}\n\n// 对于内容少的QrCode，增大容错率\nfunction getErrorCorrectionLevel(content: ContentType) {\n  if (content.length > 36) {\n    return 'M';\n  } else if (content.length > 16) {\n    return 'Q';\n  } else {\n    return 'H';\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Qrcode/src/drawLogo.ts",
    "content": "import { isString } from '/@/utils/is';\nimport { RenderQrCodeParams, LogoType } from './typing';\nexport const drawLogo = ({ canvas, logo }: RenderQrCodeParams) => {\n  if (!logo) {\n    return new Promise((resolve) => {\n      resolve((canvas as HTMLCanvasElement).toDataURL());\n    });\n  }\n  const canvasWidth = (canvas as HTMLCanvasElement).width;\n  const { logoSize = 0.15, bgColor = '#ffffff', borderSize = 0.05, crossOrigin, borderRadius = 8, logoRadius = 0 } = logo as LogoType;\n\n  const logoSrc: string = isString(logo) ? logo : logo.src;\n  const logoWidth = canvasWidth * logoSize;\n  const logoXY = (canvasWidth * (1 - logoSize)) / 2;\n  const logoBgWidth = canvasWidth * (logoSize + borderSize);\n  const logoBgXY = (canvasWidth * (1 - logoSize - borderSize)) / 2;\n\n  const ctx = canvas.getContext('2d');\n  if (!ctx) return;\n\n  // logo 底色\n  canvasRoundRect(ctx)(logoBgXY, logoBgXY, logoBgWidth, logoBgWidth, borderRadius);\n  ctx.fillStyle = bgColor;\n  ctx.fill();\n\n  // logo\n  const image = new Image();\n  if (crossOrigin || logoRadius) {\n    image.setAttribute('crossOrigin', crossOrigin || 'anonymous');\n  }\n  image.src = logoSrc;\n\n  // 使用image绘制可以避免某些跨域情况\n  const drawLogoWithImage = (image: CanvasImageSource) => {\n    ctx.drawImage(image, logoXY, logoXY, logoWidth, logoWidth);\n  };\n\n  // 使用canvas绘制以获得更多的功能\n  const drawLogoWithCanvas = (image: HTMLImageElement) => {\n    const canvasImage = document.createElement('canvas');\n    canvasImage.width = logoXY + logoWidth;\n    canvasImage.height = logoXY + logoWidth;\n    const imageCanvas = canvasImage.getContext('2d');\n    if (!imageCanvas || !ctx) return;\n    imageCanvas.drawImage(image, logoXY, logoXY, logoWidth, logoWidth);\n\n    canvasRoundRect(ctx)(logoXY, logoXY, logoWidth, logoWidth, logoRadius);\n    if (!ctx) return;\n    const fillStyle = ctx.createPattern(canvasImage, 'no-repeat');\n    if (fillStyle) {\n      ctx.fillStyle = fillStyle;\n      ctx.fill();\n    }\n  };\n\n  // 将 logo绘制到 canvas上\n  return new Promise((resolve) => {\n    image.onload = () => {\n      logoRadius ? drawLogoWithCanvas(image) : drawLogoWithImage(image);\n      resolve((canvas as HTMLCanvasElement).toDataURL());\n    };\n  });\n};\n\n// copy来的方法，用于绘制圆角\nfunction canvasRoundRect(ctx: CanvasRenderingContext2D) {\n  return (x: number, y: number, w: number, h: number, r: number) => {\n    const minSize = Math.min(w, h);\n    if (r > minSize / 2) {\n      r = minSize / 2;\n    }\n    ctx.beginPath();\n    ctx.moveTo(x + r, y);\n    ctx.arcTo(x + w, y, x + w, y + h, r);\n    ctx.arcTo(x + w, y + h, x, y + h, r);\n    ctx.arcTo(x, y + h, x, y, r);\n    ctx.arcTo(x, y, x + w, y, r);\n    ctx.closePath();\n    return ctx;\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Qrcode/src/qrcodePlus.ts",
    "content": "// 参考 qr-code-with-logo 进行ts版本修改\nimport { toCanvas } from './toCanvas';\nexport * from './typing';\nexport { toCanvas };\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Qrcode/src/toCanvas.ts",
    "content": "import { renderQrCode } from './drawCanvas';\nimport { drawLogo } from './drawLogo';\nimport { RenderQrCodeParams } from './typing';\nexport const toCanvas = (options: RenderQrCodeParams) => {\n  return renderQrCode(options)\n    .then(() => {\n      return options;\n    })\n    .then(drawLogo) as Promise<string>;\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Qrcode/src/typing.ts",
    "content": "import type { QRCodeSegment, QRCodeRenderersOptions } from 'qrcode';\n\nexport type ContentType = string | QRCodeSegment[];\n\nexport type { QRCodeRenderersOptions };\n\nexport type LogoType = {\n  src: string;\n  logoSize: number;\n  borderColor: string;\n  bgColor: string;\n  borderSize: number;\n  crossOrigin: string;\n  borderRadius: number;\n  logoRadius: number;\n};\n\nexport interface RenderQrCodeParams {\n  canvas: any;\n  content: ContentType;\n  width?: number;\n  options?: QRCodeRenderersOptions;\n  logo?: LogoType | string;\n  image?: HTMLImageElement;\n  downloadName?: string;\n  download?: boolean | Fn;\n}\n\nexport type ToCanvasFn = (options: RenderQrCodeParams) => Promise<unknown>;\n\nexport interface QrCodeActionType {\n  download: (fileName?: string) => void;\n}\n\nexport interface QrcodeDoneEventParams {\n  url: string;\n  ctx?: CanvasRenderingContext2D | null;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Scrollbar/index.ts",
    "content": "/**\n * copy from element-ui\n */\n\nimport Scrollbar from './src/Scrollbar.vue';\n\nexport { Scrollbar };\nexport type { ScrollbarType } from './src/types';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Scrollbar/src/Scrollbar.vue",
    "content": "<template>\n  <div class=\"scrollbar\">\n    <div ref=\"wrap\" :class=\"[wrapClass, 'scrollbar__wrap', native ? '' : 'scrollbar__wrap--hidden-default']\" :style=\"style\" @scroll=\"handleScroll\">\n      <component :is=\"tag\" ref=\"resize\" :class=\"['scrollbar__view', viewClass]\" :style=\"viewStyle\">\n        <slot></slot>\n      </component>\n    </div>\n    <template v-if=\"!native\">\n      <bar :move=\"moveX\" :size=\"sizeWidth\" />\n      <bar vertical :move=\"moveY\" :size=\"sizeHeight\" />\n    </template>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { addResizeListener, removeResizeListener } from '/@/utils/event';\n  import componentSetting from '/@/settings/componentSetting';\n  const { scrollbar } = componentSetting;\n  import { toObject } from './util';\n  import { defineComponent, ref, onMounted, onBeforeUnmount, nextTick, provide, computed, unref } from 'vue';\n  import Bar from './bar';\n\n  export default defineComponent({\n    name: 'Scrollbar',\n    // inheritAttrs: false,\n    components: { Bar },\n    props: {\n      native: {\n        type: Boolean,\n        default: scrollbar?.native ?? false,\n      },\n      wrapStyle: {\n        type: [String, Array],\n        default: '',\n      },\n      wrapClass: {\n        type: [String, Array],\n        default: '',\n      },\n      viewClass: {\n        type: [String, Array],\n        default: '',\n      },\n      viewStyle: {\n        type: [String, Array],\n        default: '',\n      },\n      noresize: Boolean, // 如果 container 尺寸不会发生变化，最好设置它可以优化性能\n      tag: {\n        type: String,\n        default: 'div',\n      },\n    },\n    setup(props) {\n      const sizeWidth = ref('0');\n      const sizeHeight = ref('0');\n      const moveX = ref(0);\n      const moveY = ref(0);\n      const wrap = ref();\n      const resize = ref();\n\n      provide('scroll-bar-wrap', wrap);\n\n      const style = computed(() => {\n        if (Array.isArray(props.wrapStyle)) {\n          return toObject(props.wrapStyle);\n        }\n        return props.wrapStyle;\n      });\n\n      const handleScroll = () => {\n        if (!props.native) {\n          moveY.value = (unref(wrap).scrollTop * 100) / unref(wrap).clientHeight;\n          moveX.value = (unref(wrap).scrollLeft * 100) / unref(wrap).clientWidth;\n        }\n      };\n\n      const update = () => {\n        if (!unref(wrap)) return;\n\n        const heightPercentage = (unref(wrap).clientHeight * 100) / unref(wrap).scrollHeight;\n        const widthPercentage = (unref(wrap).clientWidth * 100) / unref(wrap).scrollWidth;\n\n        sizeHeight.value = heightPercentage < 100 ? heightPercentage + '%' : '';\n        sizeWidth.value = widthPercentage < 100 ? widthPercentage + '%' : '';\n      };\n\n      onMounted(() => {\n        if (props.native) return;\n        nextTick(update);\n        if (!props.noresize) {\n          addResizeListener(unref(resize), update);\n          addResizeListener(unref(wrap), update);\n          addEventListener('resize', update);\n        }\n      });\n\n      onBeforeUnmount(() => {\n        if (props.native) return;\n        if (!props.noresize) {\n          removeResizeListener(unref(resize), update);\n          removeResizeListener(unref(wrap), update);\n          removeEventListener('resize', update);\n        }\n      });\n\n      return {\n        moveX,\n        moveY,\n        sizeWidth,\n        sizeHeight,\n        style,\n        wrap,\n        resize,\n        update,\n        handleScroll,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  .scrollbar {\n    position: relative;\n    height: 100%;\n    overflow: hidden;\n\n    &__wrap {\n      height: 100%;\n      overflow: auto;\n\n      &--hidden-default {\n        scrollbar-width: none;\n\n        &::-webkit-scrollbar {\n          display: none;\n          width: 0;\n          height: 0;\n          opacity: 0;\n        }\n      }\n    }\n\n    &__thumb {\n      position: relative;\n      display: block;\n      width: 0;\n      height: 0;\n      cursor: pointer;\n      background-color: rgba(144, 147, 153, 0.3);\n      border-radius: inherit;\n      transition: 0.3s background-color;\n\n      &:hover {\n        background-color: rgba(144, 147, 153, 0.5);\n      }\n    }\n\n    &__bar {\n      position: absolute;\n      right: 2px;\n      bottom: 2px;\n      z-index: 1;\n      border-radius: 4px;\n      opacity: 0;\n      -webkit-transition: opacity 80ms ease;\n      transition: opacity 80ms ease;\n\n      &.is-vertical {\n        top: 2px;\n        width: 6px;\n\n        & > div {\n          width: 100%;\n        }\n      }\n\n      &.is-horizontal {\n        left: 2px;\n        height: 6px;\n\n        & > div {\n          height: 100%;\n        }\n      }\n    }\n  }\n\n  .scrollbar:active > .scrollbar__bar,\n  .scrollbar:focus > .scrollbar__bar,\n  .scrollbar:hover > .scrollbar__bar {\n    opacity: 1;\n    transition: opacity 340ms ease-out;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Scrollbar/src/bar.ts",
    "content": "import { defineComponent, h, computed, ref, getCurrentInstance, onUnmounted, inject, Ref } from 'vue';\nimport { on, off } from '/@/utils/domUtils';\n\nimport { renderThumbStyle, BAR_MAP } from './util';\n\nexport default defineComponent({\n  name: 'Bar',\n\n  props: {\n    vertical: Boolean,\n    size: String,\n    move: Number,\n  },\n\n  setup(props) {\n    const instance = getCurrentInstance();\n    const thumb = ref();\n    const wrap = inject('scroll-bar-wrap', {} as Ref<Nullable<HTMLElement>>) as any;\n    const bar = computed(() => {\n      return BAR_MAP[props.vertical ? 'vertical' : 'horizontal'];\n    });\n    const barStore = ref<Recordable>({});\n    const cursorDown = ref();\n    const clickThumbHandler = (e: any) => {\n      // prevent click event of right button\n      if (e.ctrlKey || e.button === 2) {\n        return;\n      }\n      window.getSelection()?.removeAllRanges();\n      startDrag(e);\n      barStore.value[bar.value.axis] =\n        e.currentTarget[bar.value.offset] - (e[bar.value.client] - e.currentTarget.getBoundingClientRect()[bar.value.direction]);\n    };\n\n    const clickTrackHandler = (e: any) => {\n      const offset = Math.abs(e.target.getBoundingClientRect()[bar.value.direction] - e[bar.value.client]);\n      const thumbHalf = thumb.value[bar.value.offset] / 2;\n      const thumbPositionPercentage = ((offset - thumbHalf) * 100) / instance?.vnode.el?.[bar.value.offset];\n\n      wrap.value[bar.value.scroll] = (thumbPositionPercentage * wrap.value[bar.value.scrollSize]) / 100;\n    };\n    const startDrag = (e: any) => {\n      e.stopImmediatePropagation();\n      cursorDown.value = true;\n      on(document, 'mousemove', mouseMoveDocumentHandler);\n      on(document, 'mouseup', mouseUpDocumentHandler);\n      document.onselectstart = () => false;\n    };\n\n    const mouseMoveDocumentHandler = (e: any) => {\n      if (cursorDown.value === false) return;\n      const prevPage = barStore.value[bar.value.axis];\n\n      if (!prevPage) return;\n\n      const offset = (instance?.vnode.el?.getBoundingClientRect()[bar.value.direction] - e[bar.value.client]) * -1;\n      const thumbClickPosition = thumb.value[bar.value.offset] - prevPage;\n      const thumbPositionPercentage = ((offset - thumbClickPosition) * 100) / instance?.vnode.el?.[bar.value.offset];\n      wrap.value[bar.value.scroll] = (thumbPositionPercentage * wrap.value[bar.value.scrollSize]) / 100;\n    };\n\n    function mouseUpDocumentHandler() {\n      cursorDown.value = false;\n      barStore.value[bar.value.axis] = 0;\n      off(document, 'mousemove', mouseMoveDocumentHandler);\n      document.onselectstart = null;\n    }\n\n    onUnmounted(() => {\n      off(document, 'mouseup', mouseUpDocumentHandler);\n    });\n\n    return () =>\n      h(\n        'div',\n        {\n          class: ['scrollbar__bar', 'is-' + bar.value.key],\n          onMousedown: clickTrackHandler,\n        },\n        h('div', {\n          ref: thumb,\n          class: 'scrollbar__thumb',\n          onMousedown: clickThumbHandler,\n          style: renderThumbStyle({\n            size: props.size,\n            move: props.move,\n            bar: bar.value,\n          }),\n        })\n      );\n  },\n});\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Scrollbar/src/types.d.ts",
    "content": "export interface BarMapItem {\n  offset: string;\n  scroll: string;\n  scrollSize: string;\n  size: string;\n  key: string;\n  axis: string;\n  client: string;\n  direction: string;\n}\nexport interface BarMap {\n  vertical: BarMapItem;\n  horizontal: BarMapItem;\n}\n\nexport interface ScrollbarType {\n  wrap: ElRef;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Scrollbar/src/util.ts",
    "content": "import type { BarMap } from './types';\nexport const BAR_MAP: BarMap = {\n  vertical: {\n    offset: 'offsetHeight',\n    scroll: 'scrollTop',\n    scrollSize: 'scrollHeight',\n    size: 'height',\n    key: 'vertical',\n    axis: 'Y',\n    client: 'clientY',\n    direction: 'top',\n  },\n  horizontal: {\n    offset: 'offsetWidth',\n    scroll: 'scrollLeft',\n    scrollSize: 'scrollWidth',\n    size: 'width',\n    key: 'horizontal',\n    axis: 'X',\n    client: 'clientX',\n    direction: 'left',\n  },\n};\n\n// @ts-ignore\nexport function renderThumbStyle({ move, size, bar }) {\n  const style = {} as any;\n  const translate = `translate${bar.axis}(${move}%)`;\n\n  style[bar.size] = size;\n  style.transform = translate;\n  style.msTransform = translate;\n  style.webkitTransform = translate;\n\n  return style;\n}\n\nfunction extend<T, K>(to: T, _from: K): T & K {\n  return Object.assign(to, _from);\n}\n\nexport function toObject<T>(arr: Array<T>): Recordable<T> {\n  const res = {};\n  for (let i = 0; i < arr.length; i++) {\n    if (arr[i]) {\n      extend(res, arr[i]);\n    }\n  }\n  return res;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/SimpleMenu/index.ts",
    "content": "export { default as SimpleMenu } from './src/SimpleMenu.vue';\nexport { default as SimpleMenuTag } from './src/SimpleMenuTag.vue';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/SimpleMenu/src/SimpleMenu.vue",
    "content": "<template>\n  <Menu\n    v-bind=\"getBindValues\"\n    :activeName=\"activeName\"\n    :openNames=\"getOpenKeys\"\n    :class=\"`${prefixCls} ${isThemeBright ? 'bright' : ''}`\"\n    :activeSubMenuNames=\"activeSubMenuNames\"\n    @select=\"handleSelect\"\n  >\n    <template v-for=\"item in items\" :key=\"item.path\">\n      <SimpleSubMenu :isThemeBright=\"isThemeBright\" :item=\"item\" :parent=\"true\" :collapsedShowTitle=\"collapsedShowTitle\" :collapse=\"collapse\" />\n    </template>\n  </Menu>\n</template>\n<script lang=\"ts\">\n  import type { MenuState } from './types';\n  import type { Menu as MenuType } from '/@/router/types';\n  import type { RouteLocationNormalizedLoaded } from 'vue-router';\n  import { defineComponent, computed, ref, unref, reactive, toRefs, watch } from 'vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import Menu from './components/Menu.vue';\n  import SimpleSubMenu from './SimpleSubMenu.vue';\n  import { listenerRouteChange } from '/@/logics/mitt/routeChange';\n  import { propTypes } from '/@/utils/propTypes';\n  import { REDIRECT_NAME } from '/@/router/constant';\n  import { useRouter } from 'vue-router';\n  import { isFunction, isUrl } from '/@/utils/is';\n  import { openWindow } from '/@/utils';\n\n  import { useOpenKeys } from './useOpenKeys';\n  import { URL_HASH_TAB } from '/@/utils';\n  import { useAppStore } from '/@/store/modules/app';\n\n  export default defineComponent({\n    name: 'SimpleMenu',\n    components: {\n      Menu,\n      SimpleSubMenu,\n    },\n    inheritAttrs: false,\n    props: {\n      items: {\n        type: Array as PropType<MenuType[]>,\n        default: () => [],\n      },\n      collapse: propTypes.bool,\n      mixSider: propTypes.bool,\n      theme: propTypes.string,\n      accordion: propTypes.bool.def(true),\n      collapsedShowTitle: propTypes.bool,\n      beforeClickFn: {\n        type: Function as PropType<(key: string) => Promise<boolean>>,\n      },\n      isSplitMenu: propTypes.bool,\n    },\n    emits: ['menuClick'],\n    setup(props, { attrs, emit }) {\n      const currentActiveMenu = ref('');\n      const isClickGo = ref(false);\n      const appStore = useAppStore();\n      const isThemeBright = ref(false);\n\n      const menuState = reactive<MenuState>({\n        activeName: '',\n        openNames: [],\n        activeSubMenuNames: [],\n      });\n\n      const { currentRoute } = useRouter();\n      const { prefixCls } = useDesign('simple-menu');\n      const { items, accordion, mixSider, collapse } = toRefs(props);\n\n      const { setOpenKeys, getOpenKeys } = useOpenKeys(menuState, items, accordion, mixSider, collapse);\n\n      const getBindValues = computed(() => ({ ...attrs, ...props }));\n\n      watch(\n        () => props.collapse,\n        (collapse) => {\n          if (collapse) {\n            menuState.openNames = [];\n          } else {\n            setOpenKeys(currentRoute.value.path);\n          }\n        },\n        { immediate: true }\n      );\n\n      watch(\n        () => props.items,\n        () => {\n          if (!props.isSplitMenu) {\n            return;\n          }\n          setOpenKeys(currentRoute.value.path);\n        },\n        { flush: 'post' }\n      );\n      // 代码逻辑说明: 【QQYUN-8922】左侧导航栏文字颜色调整区分彩色和暗黑\n      watch(\n        () => appStore.getProjectConfig.menuSetting,\n        (menuSetting) => {\n          isThemeBright.value = !!menuSetting?.isThemeBright;\n        },\n        { immediate: true, deep: true }\n      );\n      listenerRouteChange((route) => {\n        if (route.name === REDIRECT_NAME) return;\n\n        currentActiveMenu.value = route.meta?.currentActiveMenu as string;\n        handleMenuChange(route);\n\n        if (unref(currentActiveMenu)) {\n          menuState.activeName = unref(currentActiveMenu);\n          setOpenKeys(unref(currentActiveMenu));\n        }\n      });\n\n      async function handleMenuChange(route?: RouteLocationNormalizedLoaded) {\n        if (unref(isClickGo)) {\n          isClickGo.value = false;\n          return;\n        }\n        const path = (route || unref(currentRoute)).path;\n\n        menuState.activeName = path;\n\n        setOpenKeys(path);\n      }\n\n      async function handleSelect(key: string) {\n        if (isUrl(key)) {\n          // 代码逻辑说明: 【VUEN-656】配置外部网址打不开，原因是带了#号，需要替换一下\n          let url = key.replace(URL_HASH_TAB, '#');\n          window.open(url)\n          //openWindow(url);\n          // 代码逻辑说明: 【VUEN-656】配置外部网址打不开，原因是带了#号，需要替换一下\n          return;\n        }\n        // 代码逻辑说明: 【QQYUN-6366】内部路由也可以支持采用新浏览器tab打开\n        const findItem = getMatchingMenu(props.items, key);\n        if (findItem?.internalOrExternal == true) {\n          window.open(location.origin + key);\n          return;\n        }\n\n        const { beforeClickFn } = props;\n        if (beforeClickFn && isFunction(beforeClickFn)) {\n          const flag = await beforeClickFn(key);\n          if (!flag) return;\n        }\n\n        emit('menuClick', key);\n\n        isClickGo.value = true;\n        setOpenKeys(key);\n        menuState.activeName = key;\n      }\n\n      /**\n       * 2024-02-27\n       * liaozhiyang\n       * 获取菜单中匹配的path所在的项\n       */\n      const getMatchingMenu = (menus, path) => {\n        for (let i = 0, len = menus.length; i < len; i++) {\n          const item = menus[i];\n          if (item.path === path && !item.redirect && !item.paramPath) {\n            return item;\n          } else if (item.children?.length) {\n            const result = getMatchingMenu(item.children, path);\n            if (result) {\n              return result;\n            }\n          }\n        }\n        return '';\n      }\n\n      return {\n        prefixCls,\n        getBindValues,\n        handleSelect,\n        getOpenKeys,\n        ...toRefs(menuState),\n        isThemeBright,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @import './index.less';\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/SimpleMenu/src/SimpleMenuTag.vue",
    "content": "<template>\n  <span :class=\"getTagClass\" v-if=\"getShowTag\">{{ getContent }}</span>\n</template>\n<script lang=\"ts\">\n  import type { Menu } from '/@/router/types';\n\n  import { defineComponent, computed } from 'vue';\n\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { propTypes } from '/@/utils/propTypes';\n\n  export default defineComponent({\n    name: 'SimpleMenuTag',\n    props: {\n      item: {\n        type: Object as PropType<Menu>,\n        default: () => ({}),\n      },\n      dot: propTypes.bool,\n      collapseParent: propTypes.bool,\n    },\n    setup(props) {\n      const { prefixCls } = useDesign('simple-menu');\n\n      const getShowTag = computed(() => {\n        const { item } = props;\n\n        if (!item) return false;\n\n        const { tag } = item;\n        if (!tag) return false;\n\n        const { dot, content } = tag;\n        if (!dot && !content) return false;\n        return true;\n      });\n\n      const getContent = computed(() => {\n        if (!getShowTag.value) return '';\n        const { item, collapseParent } = props;\n        const { tag } = item;\n        const { dot, content } = tag!;\n        return dot || collapseParent ? '' : content;\n      });\n\n      const getTagClass = computed(() => {\n        const { item, collapseParent } = props;\n        const { tag = {} } = item || {};\n        const { dot, type = 'error' } = tag;\n        const tagCls = `${prefixCls}-tag`;\n        return [\n          tagCls,\n\n          [`${tagCls}--${type}`],\n          {\n            [`${tagCls}--collapse`]: collapseParent,\n            [`${tagCls}--dot`]: dot || props.dot,\n          },\n        ];\n      });\n      return {\n        getTagClass,\n        getShowTag,\n        getContent,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/SimpleMenu/src/SimpleSubMenu.vue",
    "content": "<template>\n  <MenuItem :name=\"item.path\" v-if=\"!menuHasChildren(item) && getShowMenu\" v-bind=\"$props\" :class=\"getLevelClass\">\n    <Icon v-if=\"getIcon\" :icon=\"getIcon\" :size=\"16\" />\n    <div v-if=\"collapsedShowTitle && getIsCollapseParent\" class=\"mt-1 collapse-title\">\n      {{ getI18nName }}\n    </div>\n    <template #title>\n      <span :class=\"['ml-2', `${prefixCls}-sub-title`]\">\n        {{ getI18nName }}\n      </span>\n      <SimpleMenuTag :item=\"item\" :collapseParent=\"getIsCollapseParent\" />\n    </template>\n  </MenuItem>\n  <SubMenu\n    :isThemeBright=\"isThemeBright\"\n    :name=\"item.path\"\n    v-if=\"menuHasChildren(item) && getShowMenu\"\n    :class=\"[getLevelClass, theme]\"\n    :collapsedShowTitle=\"collapsedShowTitle\"\n  >\n    <template #title>\n      <Icon v-if=\"getIcon\" :icon=\"getIcon\" :size=\"16\" />\n\n      <div v-if=\"collapsedShowTitle && getIsCollapseParent\" class=\"mt-2 collapse-title\">\n        {{ getI18nName }}\n      </div>\n\n      <span v-show=\"getShowSubTitle\" :class=\"['ml-2', `${prefixCls}-sub-title`]\">\n        {{ getI18nName }}\n      </span>\n      <SimpleMenuTag :item=\"item\" :collapseParent=\"!!collapse && !!parent\" />\n    </template>\n    <template v-for=\"childrenItem in item.children || []\" :key=\"childrenItem.path\">\n      <SimpleSubMenu v-bind=\"$props\" :isThemeBright=\"isThemeBright\" :item=\"childrenItem\" :parent=\"false\" />\n    </template>\n  </SubMenu>\n</template>\n<script lang=\"ts\">\n  import type { PropType } from 'vue';\n  import type { Menu } from '/@/router/types';\n\n  import { defineComponent, computed } from 'vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import Icon from '/@/components/Icon/index';\n  import { checkChildrenHidden } from '/@/utils/common/compUtils';\n  import MenuItem from './components/MenuItem.vue';\n  import SubMenu from './components/SubMenuItem.vue';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n\n  export default defineComponent({\n    name: 'SimpleSubMenu',\n    components: {\n      SubMenu,\n      MenuItem,\n      SimpleMenuTag: createAsyncComponent(() => import('./SimpleMenuTag.vue')),\n      Icon,\n    },\n    props: {\n      item: {\n        type: Object as PropType<Menu>,\n        default: () => ({}),\n      },\n      parent: propTypes.bool,\n      collapsedShowTitle: propTypes.bool,\n      collapse: propTypes.bool,\n      theme: propTypes.oneOf(['dark', 'light']),\n      // 代码逻辑说明: 【QQYUN-8927】侧边栏导航二级菜单彩色模式文字颜色调整\n      isThemeBright: {\n        type: Boolean,\n        default: false,\n      },\n    },\n    setup(props) {\n      const { t } = useI18n();\n      const { prefixCls } = useDesign('simple-menu');\n\n      const getShowMenu = computed(() => !props.item?.meta?.hideMenu);\n      const getIcon = computed(() => props.item?.icon);\n      const getI18nName = computed(() => t(props.item?.name));\n      const getShowSubTitle = computed(() => !props.collapse || !props.parent);\n      const getIsCollapseParent = computed(() => !!props.collapse && !!props.parent);\n      const getLevelClass = computed(() => {\n        return [\n          {\n            [`${prefixCls}__parent`]: props.parent,\n            [`${prefixCls}__children`]: !props.parent,\n          },\n        ];\n      });\n\n      function menuHasChildren(menuTreeItem): boolean {\n        return (\n          !menuTreeItem.meta?.hideChildrenInMenu &&\n          Reflect.has(menuTreeItem, 'children') &&\n          !!menuTreeItem.children &&\n          menuTreeItem.children.length > 0\n          &&checkChildrenHidden(menuTreeItem)\n        );\n      }\n\n      return {\n        prefixCls,\n        menuHasChildren,\n        checkChildrenHidden,\n        getShowMenu,\n        getIcon,\n        getI18nName,\n        getShowSubTitle,\n        getLevelClass,\n        getIsCollapseParent,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/SimpleMenu/src/components/Menu.vue",
    "content": "<template>\n  <ul :class=\"getClass\">\n    <slot></slot>\n  </ul>\n</template>\n\n<script lang=\"ts\">\n  import type { PropType } from 'vue';\n  import type { SubMenuProvider } from './types';\n  import { defineComponent, ref, computed, onMounted, watchEffect, watch, nextTick, getCurrentInstance, provide } from 'vue';\n\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { propTypes } from '/@/utils/propTypes';\n  import { createSimpleRootMenuContext } from './useSimpleMenuContext';\n  import mitt from '/@/utils/mitt';\n  export default defineComponent({\n    name: 'Menu',\n    props: {\n      theme: propTypes.oneOf(['light', 'dark']).def('light'),\n      activeName: propTypes.oneOfType([propTypes.string, propTypes.number]),\n      openNames: {\n        type: Array as PropType<string[]>,\n        default: () => [],\n      },\n      accordion: propTypes.bool.def(true),\n      width: propTypes.string.def('100%'),\n      collapsedWidth: propTypes.string.def('48px'),\n      indentSize: propTypes.number.def(16),\n      collapse: propTypes.bool.def(true),\n      activeSubMenuNames: {\n        type: Array as PropType<(string | number)[]>,\n        default: () => [],\n      },\n    },\n    emits: ['select', 'open-change'],\n    setup(props, { emit }) {\n      const rootMenuEmitter = mitt();\n      const instance = getCurrentInstance();\n\n      const currentActiveName = ref<string | number>('');\n      const openedNames = ref<string[]>([]);\n\n      const { prefixCls } = useDesign('menu');\n\n      const isRemoveAllPopup = ref(false);\n\n      createSimpleRootMenuContext({\n        rootMenuEmitter: rootMenuEmitter,\n        activeName: currentActiveName,\n      });\n\n      const getClass = computed(() => {\n        const { theme } = props;\n        return [\n          prefixCls,\n          `${prefixCls}-${theme}`,\n          `${prefixCls}-vertical`,\n          {\n            [`${prefixCls}-collapse`]: props.collapse,\n          },\n        ];\n      });\n\n      watchEffect(() => {\n        openedNames.value = props.openNames;\n      });\n\n      watchEffect(() => {\n        if (props.activeName) {\n          currentActiveName.value = props.activeName;\n        }\n      });\n\n      watch(\n        () => props.openNames,\n        () => {\n          nextTick(() => {\n            updateOpened();\n          });\n        }\n      );\n\n      function updateOpened() {\n        rootMenuEmitter.emit('on-update-opened', openedNames.value);\n      }\n\n      function addSubMenu(name: string) {\n        if (openedNames.value.includes(name)) return;\n        openedNames.value.push(name);\n        updateOpened();\n      }\n\n      function removeSubMenu(name: string) {\n        openedNames.value = openedNames.value.filter((item) => item !== name);\n        updateOpened();\n      }\n\n      function removeAll() {\n        openedNames.value = [];\n        updateOpened();\n      }\n\n      function sliceIndex(index: number) {\n        if (index === -1) return;\n        openedNames.value = openedNames.value.slice(0, index + 1);\n        updateOpened();\n      }\n\n      provide<SubMenuProvider>(`subMenu:${instance?.uid}`, {\n        addSubMenu,\n        removeSubMenu,\n        getOpenNames: () => openedNames.value,\n        removeAll,\n        isRemoveAllPopup,\n        sliceIndex,\n        level: 0,\n        props: props as any,\n      });\n\n      onMounted(() => {\n        openedNames.value = !props.collapse ? [...props.openNames] : [];\n        updateOpened();\n        rootMenuEmitter.on('on-menu-item-select', (name: string) => {\n          currentActiveName.value = name;\n\n          nextTick(() => {\n            props.collapse && removeAll();\n          });\n          emit('select', name);\n        });\n\n        rootMenuEmitter.on('open-name-change', ({ name, opened }) => {\n          if (opened && !openedNames.value.includes(name)) {\n            openedNames.value.push(name);\n          } else if (!opened) {\n            const index = openedNames.value.findIndex((item) => item === name);\n            index !== -1 && openedNames.value.splice(index, 1);\n          }\n        });\n      });\n\n      return { getClass, openedNames };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @import './menu.less';\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/SimpleMenu/src/components/MenuCollapseTransition.vue",
    "content": "<template>\n  <transition mode=\"out-in\" v-on=\"on\">\n    <slot></slot>\n  </transition>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { addClass, removeClass } from '/@/utils/domUtils';\n\n  export default defineComponent({\n    name: 'MenuCollapseTransition',\n    setup() {\n      return {\n        on: {\n          beforeEnter(el) {\n            addClass(el, 'collapse-transition');\n            if (!el.dataset) el.dataset = {};\n\n            el.dataset.oldPaddingTop = el.style.paddingTop;\n            el.dataset.oldPaddingBottom = el.style.paddingBottom;\n\n            el.style.height = '0';\n            el.style.paddingTop = 0;\n            el.style.paddingBottom = 0;\n          },\n\n          enter(el) {\n            el.dataset.oldOverflow = el.style.overflow;\n            if (el.scrollHeight !== 0) {\n              el.style.height = el.scrollHeight + 'px';\n              el.style.paddingTop = el.dataset.oldPaddingTop;\n              el.style.paddingBottom = el.dataset.oldPaddingBottom;\n            } else {\n              el.style.height = '';\n              el.style.paddingTop = el.dataset.oldPaddingTop;\n              el.style.paddingBottom = el.dataset.oldPaddingBottom;\n            }\n\n            el.style.overflow = 'hidden';\n          },\n\n          afterEnter(el) {\n            removeClass(el, 'collapse-transition');\n            el.style.height = '';\n            el.style.overflow = el.dataset.oldOverflow;\n          },\n\n          beforeLeave(el) {\n            if (!el.dataset) el.dataset = {};\n            el.dataset.oldPaddingTop = el.style.paddingTop;\n            el.dataset.oldPaddingBottom = el.style.paddingBottom;\n            el.dataset.oldOverflow = el.style.overflow;\n\n            el.style.height = el.scrollHeight + 'px';\n            el.style.overflow = 'hidden';\n          },\n\n          leave(el) {\n            if (el.scrollHeight !== 0) {\n              addClass(el, 'collapse-transition');\n              el.style.height = 0;\n              el.style.paddingTop = 0;\n              el.style.paddingBottom = 0;\n            }\n          },\n\n          afterLeave(el) {\n            removeClass(el, 'collapse-transition');\n            el.style.height = '';\n            el.style.overflow = el.dataset.oldOverflow;\n            el.style.paddingTop = el.dataset.oldPaddingTop;\n            el.style.paddingBottom = el.dataset.oldPaddingBottom;\n          },\n        },\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/SimpleMenu/src/components/MenuItem.vue",
    "content": "<template>\n  <li :class=\"getClass\" @click.stop=\"handleClickItem\" :style=\"getCollapse ? {} : getItemStyle\">\n    <Tooltip placement=\"right\" v-if=\"showTooptip\">\n      <template #title>\n        <slot name=\"title\"></slot>\n      </template>\n      <div :class=\"`${prefixCls}-tooltip`\">\n        <slot></slot>\n      </div>\n    </Tooltip>\n\n    <template v-else>\n      <slot></slot>\n      <slot name=\"title\"></slot>\n    </template>\n  </li>\n</template>\n\n<script lang=\"ts\">\n  import { PropType } from 'vue';\n  import { defineComponent, ref, computed, unref, getCurrentInstance, watch } from 'vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useMenuItem } from './useMenu';\n  import { Tooltip } from 'ant-design-vue';\n  import { useSimpleRootMenuContext } from './useSimpleMenuContext';\n  import { useLocaleStore } from '/@/store/modules/locale';\n\n  export default defineComponent({\n    name: 'MenuItem',\n    components: { Tooltip },\n    props: {\n      name: {\n        type: [String, Number] as PropType<string | number>,\n        required: true,\n      },\n      disabled: propTypes.bool,\n    },\n    setup(props, { slots }) {\n      const instance = getCurrentInstance();\n      const localeStore = useLocaleStore();\n\n      const active = ref(false);\n\n      const { getItemStyle, getParentList, getParentMenu, getParentRootMenu } = useMenuItem(instance);\n\n      const { prefixCls } = useDesign('menu');\n\n      const { rootMenuEmitter, activeName } = useSimpleRootMenuContext();\n\n      const getClass = computed(() => {\n        return [\n          `${prefixCls}-item`,\n          {\n            [`${prefixCls}-item-active`]: unref(active),\n            [`${prefixCls}-item-selected`]: unref(active),\n            [`${prefixCls}-item-disabled`]: !!props.disabled,\n          },\n        ];\n      });\n\n      const getCollapse = computed(() => unref(getParentRootMenu)?.props.collapse);\n\n      const showTooptip = computed(() => {\n        return unref(getParentMenu)?.type.name === 'Menu' && unref(getCollapse) && slots.title;\n      });\n\n      function handleClickItem() {\n        const { disabled } = props;\n        if (disabled) {\n          return;\n        }\n\n        rootMenuEmitter.emit('on-menu-item-select', props.name);\n        if (unref(getCollapse)) {\n          return;\n        }\n        const { uidList } = getParentList();\n\n        rootMenuEmitter.emit('on-update-opened', {\n          opend: false,\n          parent: instance?.parent,\n          uidList: uidList,\n        });\n      }\n      watch(\n        () => activeName.value,\n        (name: string) => {\n          if (name === props.name) {\n            const { list, uidList } = getParentList();\n            active.value = true;\n            list.forEach((item) => {\n              if (item.proxy) {\n                (item.proxy as any).active = true;\n              }\n            });\n\n            //存储路径和标题的关系\n            storePathTitle(props.name);\n            rootMenuEmitter.emit('on-update-active-name:submenu', uidList);\n          } else {\n            active.value = false;\n          }\n        },\n        { immediate: true }\n      );\n\n      // 代码逻辑说明: VUEN-1144 online 配置成菜单后，打开菜单，显示名称未展示为菜单名称\n      function storePathTitle(path) {\n        console.log('storePathTitle', path);\n        let title = '';\n        if (instance!.attrs) {\n          let item: any = instance!.attrs.item;\n          if (item) {\n            title = item.title;\n          }\n        }\n        if (localeStore) {\n          localeStore.setPathTitle(path, title);\n        }\n      }\n\n      return { getClass, prefixCls, getItemStyle, getCollapse, handleClickItem, showTooptip };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/SimpleMenu/src/components/SubMenuItem.vue",
    "content": "<template>\n  <li :class=\"getClass\">\n    <template v-if=\"!getCollapse\">\n      <div :class=\"`${prefixCls}-submenu-title`\" @click.stop=\"handleClick\" :style=\"getItemStyle\">\n        <slot name=\"title\" :getIsOpened=\"getIsOpend\"></slot>\n        <Icon icon=\"eva:arrow-ios-downward-outline\" :size=\"14\" :class=\"`${prefixCls}-submenu-title-icon`\" />\n      </div>\n      <CollapseTransition>\n        <ul :class=\"prefixCls\" v-show=\"opened\">\n          <slot></slot>\n        </ul>\n      </CollapseTransition>\n    </template>\n\n    <Popover\n      placement=\"right\"\n      :overlayClassName=\"`${prefixCls}-menu-popover`\"\n      v-else\n      :open=\"getIsOpend\"\n      @openChange=\"handleVisibleChange\"\n      :overlayStyle=\"getOverlayStyle\"\n      :align=\"{ offset: [0, 0] }\"\n    >\n      <div :class=\"getSubClass\" v-bind=\"getEvents(false)\">\n        <div\n          :class=\"[\n            {\n              [`${prefixCls}-submenu-popup`]: !getParentSubMenu,\n              [`${prefixCls}-submenu-collapsed-show-tit`]: collapsedShowTitle,\n            },\n          ]\"\n        >\n          <slot name=\"title\"></slot>\n        </div>\n        <Icon v-if=\"getParentSubMenu\" icon=\"eva:arrow-ios-downward-outline\" :size=\"14\" :class=\"`${prefixCls}-submenu-title-icon`\" />\n      </div>\n      <!-- eslint-disable-next-line -->\n      <template #content v-show=\"opened\">\n        <div v-bind=\"getEvents(true)\">\n          <ul :class=\"[prefixCls, `${prefixCls}-${getTheme}`, `${prefixCls}-popup`, `${isThemeBright && 'bright'}`]\">\n            <slot></slot>\n          </ul>\n        </div>\n      </template>\n    </Popover>\n  </li>\n</template>\n\n<script lang=\"ts\">\n  import type { CSSProperties, PropType } from 'vue';\n  import type { SubMenuProvider } from './types';\n  import { defineComponent, computed, unref, getCurrentInstance, toRefs, reactive, provide, onBeforeMount, inject } from 'vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useMenuItem } from './useMenu';\n  import { useSimpleRootMenuContext } from './useSimpleMenuContext';\n  import { CollapseTransition } from '/@/components/Transition';\n  import Icon from '/@/components/Icon';\n  import { Popover } from 'ant-design-vue';\n  import { isBoolean, isObject } from '/@/utils/is';\n  import mitt from '/@/utils/mitt';\n\n  const DELAY = 200;\n  export default defineComponent({\n    name: 'SubMenu',\n    components: {\n      Icon,\n      CollapseTransition,\n      Popover,\n    },\n    props: {\n      name: {\n        type: [String, Number] as PropType<string | number>,\n        required: true,\n      },\n      disabled: propTypes.bool,\n      collapsedShowTitle: propTypes.bool,\n      // 代码逻辑说明: 【QQYUN-8927】侧边栏导航二级菜单彩色模式文字颜色调整\n      isThemeBright: {\n        type: Boolean,\n        default: false,\n      },\n    },\n    setup(props) {\n      const instance = getCurrentInstance();\n\n      const state = reactive({\n        active: false,\n        opened: false,\n      });\n\n      const data = reactive({\n        timeout: null as TimeoutHandle | null,\n        mouseInChild: false,\n        isChild: false,\n      });\n\n      const { getParentSubMenu, getItemStyle, getParentMenu, getParentList } = useMenuItem(instance);\n\n      const { prefixCls } = useDesign('menu');\n\n      const subMenuEmitter = mitt();\n\n      const { rootMenuEmitter } = useSimpleRootMenuContext();\n\n      const {\n        addSubMenu: parentAddSubmenu,\n        removeSubMenu: parentRemoveSubmenu,\n        removeAll: parentRemoveAll,\n        getOpenNames: parentGetOpenNames,\n        isRemoveAllPopup,\n        sliceIndex,\n        level,\n        props: rootProps,\n        handleMouseleave: parentHandleMouseleave,\n      } = inject<SubMenuProvider>(`subMenu:${getParentMenu.value?.uid}`)!;\n\n      const getClass = computed(() => {\n        return [\n          `${prefixCls}-submenu`,\n          {\n            [`${prefixCls}-item-active`]: state.active,\n            [`${prefixCls}-opened`]: state.opened,\n            [`${prefixCls}-submenu-disabled`]: props.disabled,\n            [`${prefixCls}-submenu-has-parent-submenu`]: unref(getParentSubMenu),\n            [`${prefixCls}-child-item-active`]: state.active,\n          },\n        ];\n      });\n\n      const getAccordion = computed(() => rootProps.accordion);\n      const getCollapse = computed(() => rootProps.collapse);\n      const getTheme = computed(() => rootProps.theme);\n\n      const getOverlayStyle = computed((): CSSProperties => {\n        // 代码逻辑说明: 【QQYUN-8774】侧边混合导航菜单宽度调整\n        return {\n          minWidth: '150px',\n        };\n      });\n\n      const getIsOpend = computed(() => {\n        const name = props.name;\n        if (unref(getCollapse)) {\n          return parentGetOpenNames().includes(name);\n        }\n        return state.opened;\n      });\n\n      const getSubClass = computed(() => {\n        const isActive = rootProps.activeSubMenuNames.includes(props.name);\n        return [\n          `${prefixCls}-submenu-title`,\n          {\n            [`${prefixCls}-submenu-active`]: isActive,\n            [`${prefixCls}-submenu-active-border`]: isActive && level === 0,\n            [`${prefixCls}-submenu-collapse`]: unref(getCollapse) && level === 0,\n          },\n        ];\n      });\n\n      function getEvents(deep: boolean) {\n        if (!unref(getCollapse)) {\n          return {};\n        }\n        return {\n          onMouseenter: handleMouseenter,\n          onMouseleave: () => handleMouseleave(deep),\n        };\n      }\n\n      function handleClick() {\n        const { disabled } = props;\n        if (disabled || unref(getCollapse)) return;\n        const opened = state.opened;\n\n        if (unref(getAccordion)) {\n          const { uidList } = getParentList();\n          rootMenuEmitter.emit('on-update-opened', {\n            opend: false,\n            parent: instance?.parent,\n            uidList: uidList,\n          });\n        } else {\n          rootMenuEmitter.emit('open-name-change', {\n            name: props.name,\n            opened: !opened,\n          });\n        }\n        state.opened = !opened;\n      }\n\n      function handleMouseenter() {\n        const disabled = props.disabled;\n        if (disabled) return;\n\n        subMenuEmitter.emit('submenu:mouse-enter-child');\n\n        const index = parentGetOpenNames().findIndex((item) => item === props.name);\n\n        sliceIndex(index);\n\n        const isRoot = level === 0 && parentGetOpenNames().length === 2;\n        if (isRoot) {\n          parentRemoveAll();\n        }\n        data.isChild = parentGetOpenNames().includes(props.name);\n        clearTimeout(data.timeout!);\n        data.timeout = setTimeout(() => {\n          parentAddSubmenu(props.name);\n        }, DELAY);\n      }\n\n      function handleMouseleave(deepDispatch = false) {\n        const parentName = getParentMenu.value?.props.name;\n        if (!parentName) {\n          isRemoveAllPopup.value = true;\n        }\n\n        if (parentGetOpenNames().slice(-1)[0] === props.name) {\n          data.isChild = false;\n        }\n\n        subMenuEmitter.emit('submenu:mouse-leave-child');\n        if (data.timeout) {\n          clearTimeout(data.timeout!);\n          data.timeout = setTimeout(() => {\n            if (isRemoveAllPopup.value) {\n              parentRemoveAll();\n            } else if (!data.mouseInChild) {\n              parentRemoveSubmenu(props.name);\n            }\n          }, DELAY);\n        }\n        if (deepDispatch) {\n          if (getParentSubMenu.value) {\n            parentHandleMouseleave?.(true);\n          }\n        }\n      }\n\n      onBeforeMount(() => {\n        subMenuEmitter.on('submenu:mouse-enter-child', () => {\n          data.mouseInChild = true;\n          isRemoveAllPopup.value = false;\n          clearTimeout(data.timeout!);\n        });\n        subMenuEmitter.on('submenu:mouse-leave-child', () => {\n          if (data.isChild) return;\n          data.mouseInChild = false;\n          clearTimeout(data.timeout!);\n        });\n\n        rootMenuEmitter.on('on-update-opened', (data: boolean | (string | number)[] | Recordable) => {\n          if (unref(getCollapse)) return;\n          if (isBoolean(data)) {\n            state.opened = data;\n            return;\n          }\n          if (isObject(data) && rootProps.accordion) {\n            const { opend, parent, uidList } = data as Recordable;\n            if (parent === instance?.parent) {\n              state.opened = opend;\n            } else if (!uidList.includes(instance?.uid)) {\n              state.opened = false;\n            }\n            return;\n          }\n\n          if (props.name && Array.isArray(data)) {\n            state.opened = (data as (string | number)[]).includes(props.name);\n          }\n        });\n\n        rootMenuEmitter.on('on-update-active-name:submenu', (data: number[]) => {\n          if (instance?.uid) {\n            state.active = data.includes(instance?.uid);\n          }\n        });\n      });\n\n      function handleVisibleChange(visible: boolean) {\n        state.opened = visible;\n      }\n\n      // provide\n      provide<SubMenuProvider>(`subMenu:${instance?.uid}`, {\n        addSubMenu: parentAddSubmenu,\n        removeSubMenu: parentRemoveSubmenu,\n        getOpenNames: parentGetOpenNames,\n        removeAll: parentRemoveAll,\n        isRemoveAllPopup,\n        sliceIndex,\n        level: level + 1,\n        handleMouseleave,\n        props: rootProps,\n      });\n\n      return {\n        getClass,\n        prefixCls,\n        getCollapse,\n        getItemStyle,\n        handleClick,\n        handleVisibleChange,\n        getParentSubMenu,\n        getOverlayStyle,\n        getTheme,\n        getIsOpend,\n        getEvents,\n        getSubClass,\n        ...toRefs(state),\n        ...toRefs(data),\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/SimpleMenu/src/components/menu.less",
    "content": "@menu-prefix-cls: ~'@{namespace}-menu';\n@menu-popup-prefix-cls: ~'@{namespace}-menu-popup';\n@submenu-popup-prefix-cls: ~'@{namespace}-menu-submenu-popup';\n\n@transition-time: 0.2s;\n@menu-dark-subsidiary-color: rgba(255, 255, 255, 0.7);\n\n.light-border {\n  &::after {\n    position: absolute;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    display: block;\n    width: 2px;\n    background-color: @primary-color;\n    content: '';\n  }\n}\n\n.@{menu-prefix-cls}-menu-popover {\n  .ant-popover-arrow {\n    display: none;\n  }\n\n  .ant-popover-inner-content {\n    padding: 0;\n  }\n\n  .@{menu-prefix-cls} {\n    &-opened > * > &-submenu-title-icon {\n      transform: translateY(-50%) rotate(90deg) !important;\n    }\n\n    &-item,\n    &-submenu-title {\n      position: relative;\n      z-index: 1;\n      padding: 10px 14px;\n      color: @menu-dark-subsidiary-color;\n      cursor: pointer;\n      transition: all @transition-time @ease-in-out;\n\n      &-icon {\n        position: absolute;\n        top: 50%;\n        right: 18px;\n        transform: translateY(-50%) rotate(-90deg);\n        transition: transform @transition-time @ease-in-out;\n      }\n    }\n\n    &-dark {\n      .@{menu-prefix-cls}-item,\n      .@{menu-prefix-cls}-submenu-title {\n        color: @menu-dark-subsidiary-color;\n        // background: @menu-dark-active-bg;\n\n        &:hover {\n          color: #fff;\n        }\n\n        &-selected {\n          color: #fff;\n          background-color: @primary-color !important;\n        }\n      }\n      // 彩色模式(绿色，橘红等)\n      &.bright {\n        .@{menu-prefix-cls}-item,\n        .@{menu-prefix-cls}-submenu-title {\n          color: #fff;\n          &:hover {\n            color: rgba(255, 255, 255, 0.8);\n          }\n        }\n      }\n    }\n\n    &-light {\n      .@{menu-prefix-cls}-item,\n      .@{menu-prefix-cls}-submenu-title {\n        color: @text-color-base;\n\n        &:hover {\n          color: @primary-color;\n        }\n\n        &-selected {\n          z-index: 2;\n          color: @primary-color;\n          background-color: fade(@primary-color, 10);\n\n          .light-border();\n        }\n      }\n    }\n  }\n}\n\n.content();\n.content() {\n  .@{menu-prefix-cls} {\n    position: relative;\n    display: block;\n    width: 100%;\n    padding: 0;\n    margin: 0;\n    font-size: @font-size-base;\n    color: @text-color-base;\n    list-style: none;\n    outline: none;\n\n    // .collapse-transition {\n    //   transition: @transition-time height ease-in-out, @transition-time padding-top ease-in-out,\n    //     @transition-time padding-bottom ease-in-out;\n    // }\n\n    &-light {\n      background-color: #fff;\n      color: rgba(0, 0, 0, 0.65);\n      .@{menu-prefix-cls} {\n        color: rgba(0, 0, 0, 0.65);\n      }\n      .@{namespace}-menu-submenu:not(.@{namespace}-menu-item-active)  .@{namespace}-menu-submenu-title {\n        .anticon {\n           color: rgba(0, 0, 0, 0.9);\n        }\n      }\n      .@{menu-prefix-cls}-submenu-active {\n        color: @primary-color !important;\n\n        &-border {\n          .light-border();\n        }\n      }\n    }\n\n    &-dark {\n      .@{menu-prefix-cls}-submenu-active {\n        color: #fff !important;\n      }\n    }\n\n    &-item {\n      position: relative;\n      z-index: 1;\n      display: flex;\n      font-size: @font-size-base;\n      list-style: none;\n      cursor: pointer;\n      outline: none;\n      align-items: center;\n\n      &:hover,\n      &:active {\n        color: inherit;\n      }\n    }\n\n    &-item > i {\n      margin-right: 6px;\n    }\n\n    &-submenu-title > i,\n    &-submenu-title span > i {\n      margin-right: 8px;\n    }\n\n    // vertical\n    &-vertical &-item,\n    &-vertical &-submenu-title {\n      position: relative;\n      z-index: 1;\n      padding: 14px 24px;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n      cursor: pointer;\n\n      &:hover {\n        color: @primary-color;\n      }\n\n      .@{menu-prefix-cls}-tooltip {\n        width: calc(100% - 0px);\n        padding: 12px 0;\n        text-align: center;\n      }\n      .@{menu-prefix-cls}-submenu-popup {\n        padding: 12px 0;\n      }\n    }\n\n    &-vertical &-submenu-collapse {\n      .@{submenu-popup-prefix-cls} {\n        display: flex;\n        justify-content: center;\n        align-items: center;\n      }\n      .@{menu-prefix-cls}-submenu-collapsed-show-tit {\n        flex-direction: column;\n      }\n    }\n\n    &-vertical&-collapse &-item,\n    &-vertical&-collapse &-submenu-title {\n      padding: 0 0;\n    }\n\n    &-vertical &-submenu-title-icon {\n      position: absolute;\n      top: 50%;\n      right: 18px;\n      transform: translateY(-50%);\n    }\n\n    &-submenu-title-icon {\n      transition: transform @transition-time @ease-in-out;\n    }\n\n    &-vertical &-opened > * > &-submenu-title-icon {\n      transform: translateY(-50%) rotate(180deg);\n    }\n\n    &-vertical &-submenu {\n      &-nested {\n        padding-left: 20px;\n      }\n      .@{menu-prefix-cls}-item {\n        padding-left: 43px;\n      }\n    }\n\n    &-light&-vertical &-item {\n      &-active:not(.@{menu-prefix-cls}-submenu) {\n        z-index: 2;\n        color: @primary-color;\n        background-color: fade(@primary-color, 10);\n\n        .light-border();\n      }\n      &-active.@{menu-prefix-cls}-submenu {\n        color: @primary-color;\n      }\n    }\n\n    &-light&-vertical&-collapse {\n      > li.@{menu-prefix-cls}-item-active,\n      .@{menu-prefix-cls}-submenu-active {\n        position: relative;\n        background-color: fade(@primary-color, 5);\n\n        &::after {\n          display: none;\n        }\n\n        &::before {\n          position: absolute;\n          top: 0;\n          left: 0;\n          width: 3px;\n          height: 100%;\n          background-color: @primary-color;\n          content: '';\n        }\n      }\n    }\n\n    &-dark&-vertical &-item,\n    &-dark&-vertical &-submenu-title {\n      color: @menu-dark-subsidiary-color;\n      &-active:not(.@{menu-prefix-cls}-submenu) {\n        color: #fff !important;\n        background-color: @primary-color !important;\n      }\n\n      &:hover {\n        color: #fff;\n      }\n    }\n    // update-begin--author:liaozhiyang---date:20240408---for：【QQYUN-8922】左侧导航栏文字颜色调整区分彩色和暗黑\n    &-dark&-vertical&.bright &-item,\n    &-dark&-vertical.bright &-submenu-title {\n      color: rgba(255, 255, 255, 1);\n      &-active:not(.@{menu-prefix-cls}-submenu) {\n        color: #fff !important;\n        background-color: @primary-color !important;\n      }\n\n      &:hover {\n        color: rgba(255, 255, 255, 0.8);\n      }\n    }\n    // update-end--author:liaozhiyang---date:20240408---for：【QQYUN-8922】左侧导航栏文字颜色调整区分彩色和暗黑\n\n    &-dark&-vertical&-collapse {\n      > li.@{menu-prefix-cls}-item-active,\n      .@{menu-prefix-cls}-submenu-active {\n        position: relative;\n        color: #fff !important;\n        background-color: @primary-color !important;\n\n        &::before {\n          position: absolute;\n          top: 0;\n          left: 0;\n          width: 3px;\n          height: 100%;\n          background-color: @primary-color;\n          content: '';\n        }\n\n        .@{menu-prefix-cls}-submenu-collapse {\n          background-color: transparent;\n        }\n      }\n    }\n\n    &-dark&-vertical &-submenu &-item {\n      &-active,\n      &-active:hover {\n        color: #fff;\n        border-right: none;\n      }\n    }\n\n    &-dark&-vertical &-child-item-active > &-submenu-title {\n      color: #fff;\n    }\n\n    &-dark&-vertical &-opened {\n      .@{menu-prefix-cls}-submenu-has-parent-submenu {\n        .@{menu-prefix-cls}-submenu-title {\n          background-color: transparent;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/SimpleMenu/src/components/types.ts",
    "content": "import { Ref } from 'vue';\n\nexport interface Props {\n  theme: string;\n  activeName?: string | number | undefined;\n  openNames: string[];\n  accordion: boolean;\n  width: string;\n  collapsedWidth: string;\n  indentSize: number;\n  collapse: boolean;\n  activeSubMenuNames: (string | number)[];\n}\n\nexport interface SubMenuProvider {\n  addSubMenu: (name: string | number, update?: boolean) => void;\n  removeSubMenu: (name: string | number, update?: boolean) => void;\n  removeAll: () => void;\n  sliceIndex: (index: number) => void;\n  isRemoveAllPopup: Ref<boolean>;\n  getOpenNames: () => (string | number)[];\n  handleMouseleave?: Fn;\n  level: number;\n  props: Props;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/SimpleMenu/src/components/useMenu.ts",
    "content": "import { computed, ComponentInternalInstance, unref } from 'vue';\nimport type { CSSProperties } from 'vue';\n\nexport function useMenuItem(instance: ComponentInternalInstance | null) {\n  const getParentMenu = computed(() => {\n    return findParentMenu(['Menu', 'SubMenu']);\n  });\n\n  const getParentRootMenu = computed(() => {\n    return findParentMenu(['Menu']);\n  });\n\n  const getParentSubMenu = computed(() => {\n    return findParentMenu(['SubMenu']);\n  });\n\n  const getItemStyle = computed((): CSSProperties => {\n    let parent = instance?.parent;\n    if (!parent) return {};\n    const indentSize = (unref(getParentRootMenu)?.props.indentSize as number) ?? 20;\n    let padding = indentSize;\n\n    if (unref(getParentRootMenu)?.props.collapse) {\n      padding = indentSize;\n    } else {\n      while (parent && parent.type.name !== 'Menu') {\n        if (parent.type.name === 'SubMenu') {\n          padding += indentSize;\n        }\n        parent = parent.parent;\n      }\n    }\n    return { paddingLeft: padding + 'px' };\n  });\n\n  function findParentMenu(name: string[]) {\n    let parent = instance?.parent;\n    if (!parent) return null;\n    while (parent && name.indexOf(parent.type.name!) === -1) {\n      parent = parent.parent;\n    }\n    return parent;\n  }\n\n  function getParentList() {\n    let parent = instance;\n    if (!parent)\n      return {\n        uidList: [],\n        list: [],\n      };\n    const ret: any[] = [];\n    while (parent && parent.type.name !== 'Menu') {\n      if (parent.type.name === 'SubMenu') {\n        ret.push(parent);\n      }\n      parent = parent.parent;\n    }\n    return {\n      uidList: ret.map((item) => item.uid),\n      list: ret,\n    };\n  }\n\n  function getParentInstance(instance: ComponentInternalInstance, name = 'SubMenu') {\n    let parent = instance.parent;\n    while (parent) {\n      if (parent.type.name !== name) {\n        return parent;\n      }\n      parent = parent.parent;\n    }\n    return parent;\n  }\n\n  return {\n    getParentMenu,\n    getParentInstance,\n    getParentRootMenu,\n    getParentList,\n    getParentSubMenu,\n    getItemStyle,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/SimpleMenu/src/components/useSimpleMenuContext.ts",
    "content": "import type { InjectionKey, Ref } from 'vue';\nimport type { Emitter } from '/@/utils/mitt';\nimport { createContext, useContext } from '/@/hooks/core/useContext';\n\nexport interface SimpleRootMenuContextProps {\n  rootMenuEmitter: Emitter;\n  activeName: Ref<string | number>;\n}\n\nconst key: InjectionKey<SimpleRootMenuContextProps> = Symbol();\n\nexport function createSimpleRootMenuContext(context: SimpleRootMenuContextProps) {\n  return createContext<SimpleRootMenuContextProps>(context, key, { readonly: false, native: true });\n}\n\nexport function useSimpleRootMenuContext() {\n  return useContext<SimpleRootMenuContextProps>(key);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/SimpleMenu/src/index.less",
    "content": "@simple-prefix-cls: ~'@{namespace}-simple-menu';\n@prefix-cls: ~'@{namespace}-menu';\n\n.@{prefix-cls} {\n  &-dark&-vertical .@{simple-prefix-cls}__parent {\n    background-color: @sider-dark-bg-color;\n    > .@{prefix-cls}-submenu-title {\n      background-color: @sider-dark-bg-color;\n    }\n  }\n\n  &-dark&-vertical .@{simple-prefix-cls}__children,\n  &-dark&-popup .@{simple-prefix-cls}__children {\n    background-color: @sider-dark-lighten-bg-color;\n    > .@{prefix-cls}-submenu-title {\n      background-color: @sider-dark-lighten-bg-color;\n    }\n  }\n\n  .collapse-title {\n    overflow: hidden;\n    font-size: 12px;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n}\n\n.@{simple-prefix-cls} {\n  &-sub-title {\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    transition: all 0.3s;\n  }\n\n  &-tag {\n    position: absolute;\n    top: calc(50% - 8px);\n    right: 30px;\n    display: inline-block;\n    padding: 2px 3px;\n    margin-right: 4px;\n    font-size: 10px;\n    line-height: 14px;\n    color: #fff;\n    border-radius: 2px;\n\n    &--collapse {\n      top: 6px !important;\n      right: 2px;\n    }\n\n    &--dot {\n      top: calc(50% - 2px);\n      width: 6px;\n      height: 6px;\n      padding: 0;\n      border-radius: 50%;\n    }\n\n    &--primary {\n      background-color: @primary-color;\n    }\n\n    &--error {\n      background-color: @error-color;\n    }\n\n    &--success {\n      background-color: @success-color;\n    }\n\n    &--warn {\n      background-color: @warning-color;\n    }\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/SimpleMenu/src/types.ts",
    "content": "export interface MenuState {\n  activeName: string;\n  openNames: string[];\n  activeSubMenuNames: string[];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/SimpleMenu/src/useOpenKeys.ts",
    "content": "import type { Menu as MenuType } from '/@/router/types';\nimport type { MenuState } from './types';\n\nimport { computed, Ref, toRaw } from 'vue';\n\nimport { unref } from 'vue';\nimport { uniq } from 'lodash-es';\nimport { getAllParentPath } from '/@/router/helper/menuHelper';\n\nimport { useTimeoutFn } from '/@/hooks/core/useTimeout';\nimport { useDebounceFn } from '@vueuse/core';\n\nexport function useOpenKeys(menuState: MenuState, menus: Ref<MenuType[]>, accordion: Ref<boolean>, mixSider: Ref<boolean>, collapse: Ref<boolean>) {\n  const debounceSetOpenKeys = useDebounceFn(setOpenKeys, 50);\n  async function setOpenKeys(path: string) {\n    const native = !mixSider.value;\n    const menuList = toRaw(menus.value);\n    useTimeoutFn(\n      () => {\n        if (menuList?.length === 0) {\n          menuState.activeSubMenuNames = [];\n          menuState.openNames = [];\n          return;\n        }\n        const keys = getAllParentPath(menuList, path);\n\n        if (!unref(accordion)) {\n          menuState.openNames = uniq([...menuState.openNames, ...keys]);\n        } else {\n          menuState.openNames = keys;\n        }\n        menuState.activeSubMenuNames = menuState.openNames;\n      },\n      30,\n      native\n    );\n  }\n\n  const getOpenKeys = computed(() => {\n    return unref(collapse) ? [] : menuState.openNames;\n  });\n\n  return { setOpenKeys: debounceSetOpenKeys, getOpenKeys };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/StrengthMeter/index.ts",
    "content": "import { withInstall } from '/@/utils';\nimport strengthMeter from './src/StrengthMeter.vue';\n\nexport const StrengthMeter = withInstall(strengthMeter);\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/StrengthMeter/src/StrengthMeter.vue",
    "content": "<template>\n  <div :class=\"prefixCls\" class=\"relative\">\n    <InputPassword v-if=\"showInput\" v-bind=\"$attrs\" allowClear :value=\"innerValueRef\" @change=\"handleChange\" :disabled=\"disabled\">\n      <template #[item]=\"data\" v-for=\"item in Object.keys($slots)\">\n        <slot :name=\"item\" v-bind=\"data || {}\"></slot>\n      </template>\n    </InputPassword>\n    <div :class=\"`${prefixCls}-bar`\">\n      <div :class=\"`${prefixCls}-bar--fill`\" :data-score=\"getPasswordStrength\"></div>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, computed, ref, watch, unref, watchEffect } from 'vue';\n  import { Input } from 'ant-design-vue';\n  import { zxcvbn } from '@zxcvbn-ts/core';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { propTypes } from '/@/utils/propTypes';\n\n  export default defineComponent({\n    name: 'StrengthMeter',\n    components: { InputPassword: Input.Password },\n    props: {\n      value: propTypes.string,\n      showInput: propTypes.bool.def(true),\n      disabled: propTypes.bool,\n    },\n    emits: ['score-change', 'change'],\n    setup(props, { emit }) {\n      const innerValueRef = ref('');\n      const { prefixCls } = useDesign('strength-meter');\n\n      const getPasswordStrength = computed(() => {\n        const { disabled } = props;\n        if (disabled) return -1;\n        const innerValue = unref(innerValueRef);\n        const score = innerValue ? zxcvbn(unref(innerValueRef)).score : -1;\n        emit('score-change', score);\n        return score;\n      });\n\n      function handleChange(e: ChangeEvent) {\n        innerValueRef.value = e.target.value;\n        emit('change', e.target.value);\n      }\n\n      watchEffect(() => {\n        innerValueRef.value = props.value || '';\n      });\n\n      // watch(\n      //   () => unref(innerValueRef),\n      //   (val) => {\n      //     emit('change', val);\n      //   }\n      // );\n      return {\n        getPasswordStrength,\n        handleChange,\n        prefixCls,\n        innerValueRef,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-strength-meter';\n\n  .@{prefix-cls} {\n    &-bar {\n      position: relative;\n      height: 6px;\n      margin: 10px auto 6px;\n      background-color: @disabled-color;\n      border-radius: 6px;\n\n      &::before,\n      &::after {\n        position: absolute;\n        z-index: 10;\n        display: block;\n        width: 20%;\n        height: inherit;\n        background-color: transparent;\n        border-color: @white;\n        border-style: solid;\n        border-width: 0 5px 0 5px;\n        content: '';\n      }\n\n      &::before {\n        left: 20%;\n      }\n\n      &::after {\n        right: 20%;\n      }\n\n      &--fill {\n        position: absolute;\n        width: 0;\n        height: inherit;\n        background-color: transparent;\n        border-radius: inherit;\n        transition: width 0.5s ease-in-out, background 0.25s;\n\n        &[data-score='0'] {\n          width: 20%;\n          background-color: darken(@error-color, 10%);\n        }\n\n        &[data-score='1'] {\n          width: 40%;\n          background-color: @error-color;\n        }\n\n        &[data-score='2'] {\n          width: 60%;\n          background-color: @warning-color;\n        }\n\n        &[data-score='3'] {\n          width: 80%;\n          background-color: fade(@success-color, 50%);\n        }\n\n        &[data-score='4'] {\n          width: 100%;\n          background-color: @success-color;\n        }\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/index.ts",
    "content": "export { default as BasicTable } from './src/BasicTable.vue';\nexport { default as TableAction } from './src/components/TableAction.vue';\nexport { default as EditTableHeaderIcon } from './src/components/EditTableHeaderIcon.vue';\nexport { default as TableImg } from './src/components/TableImg.vue';\nexport * from './src/types/table';\nexport * from './src/types/pagination';\nexport * from './src/types/tableAction';\nexport { useTable } from './src/hooks/useTable';\nexport type { FormSchema, FormProps } from '/@/components/Form/src/types/form';\nexport type { EditRecordRow } from './src/components/editable';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/BasicTable.vue",
    "content": "<template>\n  <div ref=\"wrapRef\" :class=\"getWrapperClass\">\n    <BasicForm\n      :class=\"{ 'table-search-area-hidden': !getBindValues.formConfig?.schemas?.length }\"\n      submitOnReset\n      v-bind=\"getFormProps\"\n      source=\"table-query\"\n      v-if=\"getBindValues.useSearchForm\"\n      :tableAction=\"tableAction\"\n      @register=\"registerForm\"\n      @submit=\"handleSearchInfoChange\"\n      @advanced-change=\"redoHeight\"\n    >\n      <template #[replaceFormSlotKey(item)]=\"data\" v-for=\"item in getFormSlotKeys\">\n        <slot :name=\"item\" v-bind=\"data || {}\"></slot>\n      </template>\n    </BasicForm>\n\n    <!-- antd v3 升级兼容，阻止数据的收集，防止控制台报错 -->\n    <!-- https://antdv.com/docs/vue/migration-v3-cn -->\n    <a-form-item-rest>\n      <!-- 【TV360X-377】关联记录必填影响到了table的输入框和页码样式 -->\n      <a-form-item>\n        <Table ref=\"tableElRef\" v-bind=\"getBindValues\" :rowClassName=\"getRowClassName\" v-show=\"getEmptyDataIsShowTable\" @resizeColumn=\"handleResizeColumn\" @change=\"handleTableChange\">\n          <!-- antd的原生插槽直接传递 -->\n          <template #[item]=\"data\" v-for=\"item in slotNamesGroup.native\" :key=\"item\">\n            <!-- 代码逻辑说明: 【issues/1146】BasicTable使用headerCell全选框出不来 -->\n            <template v-if=\"item === 'headerCell'\">\n              <CustomSelectHeader v-if=\"isCustomSelection(data.column)\" v-bind=\"selectHeaderProps\" />\n              <slot v-else :name=\"item\" v-bind=\"data || {}\"></slot>\n            </template>\n            <slot v-else :name=\"item\" v-bind=\"data || {}\"></slot>\n          </template>\n          <template #headerCell=\"{ column }\">\n            <!-- 代码逻辑说明: 【QQYUN-5571】自封装选择列，解决数据行选择卡顿问题 -->\n            <CustomSelectHeader v-if=\"isCustomSelection(column)\" v-bind=\"selectHeaderProps\"/>\n            <HeaderCell v-else :column=\"column\" />\n          </template>\n          <!-- 增加对antdv3.x兼容 -->\n          <template #bodyCell=\"data\">\n            <template v-if=\"data.column?.slotsBak?.customRender\">\n              <slot :name=\"data.column.slotsBak.customRender\" v-bind=\"data || {}\"></slot>\n            </template>\n            <template v-else>\n              <slot name=\"bodyCell\" v-bind=\"data || {}\"></slot>\n            </template>\n          </template>\n          <template v-if=\"showSummaryRef && !getBindValues.showSummary\" #summary=\"data\">\n            <slot name=\"summary\" v-bind=\"data || {}\">\n              <TableSummary :data=\"data || {}\" v-bind=\"getSummaryProps\" />\n            </slot>\n          </template>\n        </Table>\n      </a-form-item>\n    </a-form-item-rest>\n  </div>\n</template>\n<script lang=\"ts\">\n  import type { BasicTableProps, TableActionType, SizeType, ColumnChangeParam, BasicColumn } from './types/table';\n\n  import { defineComponent, ref, computed, unref, toRaw, inject, watchEffect, watch, onUnmounted, onMounted, nextTick } from 'vue';\n  import { Table } from 'ant-design-vue';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { PageWrapperFixedHeightKey } from '/@/components/Page/injectionKey';\n  import CustomSelectHeader from './components/CustomSelectHeader.vue'\n  import expandIcon from './components/ExpandIcon';\n  import HeaderCell from './components/HeaderCell.vue';\n  import TableSummary from './components/TableSummary';\n  import { InnerHandlers } from './types/table';\n  import { usePagination } from './hooks/usePagination';\n  import { useColumns } from './hooks/useColumns';\n  import { useDataSource } from './hooks/useDataSource';\n  import { useLoading } from './hooks/useLoading';\n  import { useRowSelection } from './hooks/useRowSelection';\n  import { useTableScroll } from './hooks/useTableScroll';\n  import { useCustomRow } from './hooks/useCustomRow';\n  import { useTableStyle } from './hooks/useTableStyle';\n  import { useTableHeader } from './hooks/useTableHeader';\n  import { useTableExpand } from './hooks/useTableExpand';\n  import { createTableContext } from './hooks/useTableContext';\n  import { useTableFooter } from './hooks/useTableFooter';\n  import { useTableForm } from './hooks/useTableForm';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useCustomSelection } from \"./hooks/useCustomSelection\";\n\n  import { omit, pick } from 'lodash-es';\n  import { basicProps } from './props';\n  import { isFunction } from '/@/utils/is';\n  import { warn } from '/@/utils/log';\n\n  export default defineComponent({\n    components: {\n      Table,\n      BasicForm,\n      HeaderCell,\n      TableSummary,\n      CustomSelectHeader,\n    },\n    props: basicProps,\n    emits: [\n      'fetch-success',\n      'fetch-error',\n      'selection-change',\n      'register',\n      'row-click',\n      'row-dbClick',\n      'row-contextmenu',\n      'row-mouseenter',\n      'row-mouseleave',\n      'edit-end',\n      'edit-cancel',\n      'edit-row-end',\n      'edit-change',\n      'expanded-rows-change',\n      'change',\n      'columns-change',\n      'table-redo',\n    ],\n    setup(props, { attrs, emit, slots, expose }) {\n      const tableElRef = ref(null);\n      const tableData = ref<Recordable[]>([]);\n\n      const wrapRef = ref(null);\n      const innerPropsRef = ref<Partial<BasicTableProps>>();\n\n      const { prefixCls } = useDesign('basic-table');\n      const [registerForm, formActions] = useForm();\n\n      const getProps = computed(() => {\n        return { ...props, ...unref(innerPropsRef) } as BasicTableProps;\n      });\n\n      const isFixedHeightPage = inject(PageWrapperFixedHeightKey, false);\n      watchEffect(() => {\n        unref(isFixedHeightPage) &&\n          props.canResize &&\n          warn(\"'canResize' of BasicTable may not work in PageWrapper with 'fixedHeight' (especially in hot updates)\");\n      });\n\n      const { getLoading, setLoading } = useLoading(getProps);\n      const { getPaginationInfo, getPagination, setPagination, setShowPagination, getShowPagination } = usePagination(getProps);\n\n\n      // const { getRowSelection, getRowSelectionRef, getSelectRows, clearSelectedRowKeys, getSelectRowKeys, deleteSelectRowByKey, setSelectedRowKeys } =\n      //   useRowSelection(getProps, tableData, emit);\n\n      // 子级列名\n      const childrenColumnName = computed(() => getProps.value.childrenColumnName || 'children');\n\n      // 自定义选择列\n      const {\n        getRowSelection,\n        getSelectRows,\n        getSelectRowKeys,\n        setSelectedRowKeys,\n        getRowSelectionRef,\n        selectHeaderProps,\n        isCustomSelection,\n        handleCustomSelectColumn,\n        clearSelectedRowKeys,\n        deleteSelectRowByKey,\n        getExpandIconColumnIndex,\n      } = useCustomSelection(\n        getProps,\n        emit,\n        wrapRef,\n        getPaginationInfo,\n        tableData,\n        childrenColumnName\n      )\n\n      const {\n        handleTableChange: onTableChange,\n        getDataSourceRef,\n        getDataSource,\n        getRawDataSource,\n        setTableData,\n        updateTableDataRecord,\n        deleteTableDataRecord,\n        insertTableDataRecord,\n        findTableDataRecord,\n        fetch,\n        getRowKey,\n        reload,\n        getAutoCreateKey,\n        updateTableData,\n      } = useDataSource(\n        getProps,\n        {\n          tableData,\n          getPaginationInfo,\n          setLoading,\n          setPagination,\n          validate: formActions.validate,\n          clearSelectedRowKeys,\n        },\n        emit\n      );\n\n      function handleTableChange(...args) {\n        onTableChange.call(undefined, ...args);\n        emit('change', ...args);\n        // 解决通过useTable注册onChange时不起作用的问题\n        const { onChange } = unref(getProps);\n        onChange && isFunction(onChange) && onChange.call(undefined, ...args);\n      }\n\n      const { getViewColumns, getColumns, getRefColumns, setCacheColumnsByField, setColumns, getColumnsRef, getCacheColumns } = useColumns(\n        getProps,\n        getPaginationInfo,\n        // 代码逻辑说明: 【QQYUN-5571】自封装选择列，解决数据行选择卡顿问题\n        handleCustomSelectColumn,\n      );\n\n      const { getScrollRef, redoHeight } = useTableScroll(getProps, tableElRef, getColumnsRef, getRowSelectionRef, getDataSourceRef, slots, getPaginationInfo);\n\n      const { customRow } = useCustomRow(getProps, {\n        setSelectedRowKeys,\n        getSelectRowKeys,\n        clearSelectedRowKeys,\n        getAutoCreateKey,\n        emit,\n      });\n\n      const { getRowClassName } = useTableStyle(getProps, prefixCls);\n\n      const { getExpandOption, expandAll, collapseAll } = useTableExpand(getProps, tableData, emit);\n\n      const handlers: InnerHandlers = {\n        onColumnsChange: (data: ColumnChangeParam[]) => {\n          emit('columns-change', data);\n          // support useTable\n          unref(getProps).onColumnsChange?.(data);\n        },\n      };\n\n      const { getHeaderProps } = useTableHeader(getProps, slots, handlers);\n      // 代码逻辑说明: 【pull/1201】添加antd的TableSummary功能兼容老的summary（表尾合计）\n      const getSummaryProps = computed(() => {\n        // 代码逻辑说明: 【issues/7956】修复showSummary: false时且有内嵌子表时合计栏错位\n        const result = pick(unref(getProps), ['summaryFunc', 'summaryData', 'hasExpandedRow', 'rowKey']);\n        result['hasExpandedRow'] = Object.keys(slots).includes('expandedRowRender');\n        return result;\n      });\n      const getIsEmptyData = computed(() => {\n        return (unref(getDataSourceRef) || []).length === 0;\n      });\n      const showSummaryRef = computed(() => {\n        const summaryProps = unref(getSummaryProps);\n        return (summaryProps.summaryFunc || summaryProps.summaryData) && !unref(getIsEmptyData);\n      });\n\n      const { getFooterProps } = useTableFooter(getProps, slots, getScrollRef, tableElRef, getDataSourceRef);\n\n      const { getFormProps, replaceFormSlotKey, getFormSlotKeys, handleSearchInfoChange } = useTableForm(getProps, slots, fetch, getLoading);\n\n      const getBindValues = computed(() => {\n        const dataSource = unref(getDataSourceRef);\n        let propsData: Recordable = {\n          // date-begin--author:liaozhiyang---date:20250716---for：【issues/8564】basicTale的TableLayout换成auto不生效\n          tableLayout: 'fixed',\n          // date-begin--author:liaozhiyang---date:20250716---for：【issues/8564】basicTale的TableLayout换成auto不生效\n          // ...(dataSource.length === 0 ? { getPopupContainer: () => document.body } : {}),\n          ...attrs,\n          customRow,\n          //树列表展开使用AntDesignVue默认的加减图标 author:scott date:20210914\n          //expandIcon: slots.expandIcon ? null : expandIcon(),\n          ...unref(getProps),\n          ...unref(getHeaderProps),\n          scroll: unref(getScrollRef),\n          loading: unref(getLoading),\n          rowSelection: unref(getRowSelectionRef),\n          rowKey: unref(getRowKey),\n          columns: toRaw(unref(getViewColumns)),\n          pagination: toRaw(unref(getPaginationInfo)),\n          dataSource,\n          footer: unref(getFooterProps),\n          ...unref(getExpandOption),\n          // 【QQYUN-5837】动态计算 expandIconColumnIndex\n          expandIconColumnIndex: getExpandIconColumnIndex.value,\n        };\n\n        //额外的展开行存在插槽时会将滚动移除掉,注释掉\n        /*if (slots.expandedRowRender) {\n          propsData = omit(propsData, 'scroll');\n        }*/\n\n        // 自定义选择列，需要去掉原生的\n        delete propsData.rowSelection\n\n        // 代码逻辑说明: 【QQYUN-6387】展开写法（去掉报错）\n        !propsData.isTreeTable && delete propsData.expandIconColumnIndex;\n        propsData.expandedRowKeys === null && delete propsData.expandedRowKeys;\n        propsData = omit(propsData, ['class', 'onChange']);\n        return propsData;\n      });\n\n      // 统一设置表格列宽度\n      const getMaxColumnWidth = computed(() => {\n        const values = unref(getBindValues);\n        return values.maxColumnWidth > 0 ? values.maxColumnWidth + 'px' : null;\n      });\n\n      const getWrapperClass = computed(() => {\n        const values = unref(getBindValues);\n        return [\n          prefixCls,\n          attrs.class,\n          {\n            [`${prefixCls}-form-container`]: values.useSearchForm,\n            [`${prefixCls}--inset`]: values.inset,\n            [`${prefixCls}-col-max-width`]: getMaxColumnWidth.value != null,\n            // 是否显示表尾合计\n            [`${prefixCls}--show-summary`]: values.showSummary,\n          },\n        ];\n      });\n\n      const getEmptyDataIsShowTable = computed(() => {\n        const { emptyDataIsShowTable, useSearchForm } = unref(getProps);\n        if (emptyDataIsShowTable || !useSearchForm) {\n          return true;\n        }\n        return !!unref(getDataSourceRef).length;\n      });\n\n      function setProps(props: Partial<BasicTableProps>) {\n        innerPropsRef.value = { ...unref(innerPropsRef), ...props };\n      }\n\n      const tableAction: TableActionType = {\n        reload,\n        getSelectRows,\n        clearSelectedRowKeys,\n        getSelectRowKeys,\n        deleteSelectRowByKey,\n        setPagination,\n        setTableData,\n        updateTableDataRecord,\n        deleteTableDataRecord,\n        insertTableDataRecord,\n        findTableDataRecord,\n        redoHeight,\n        setSelectedRowKeys,\n        setColumns,\n        setLoading,\n        getDataSource,\n        getRawDataSource,\n        setProps,\n        getRowSelection,\n        getPaginationRef: getPagination,\n        getColumns,\n        // 代码逻辑说明: 【issues/8529】setColumns后列配置没联动更新\n        getColumnsRef: () => getColumnsRef,\n        getCacheColumns,\n        emit,\n        updateTableData,\n        setShowPagination,\n        getShowPagination,\n        setCacheColumnsByField,\n        expandAll,\n        collapseAll,\n        getSize: () => {\n          return unref(getBindValues).size as SizeType;\n        },\n        // 代码逻辑说明: 【QQYUN-13558】erp风格主表在5条数据时也有滚动条\n        getBindValuesRef: () => getBindValues,\n      };\n      createTableContext({ ...tableAction, wrapRef, getBindValues });\n\n      // 获取分组之后的slot名称\n      const slotNamesGroup = computed<{\n        // AntTable原生插槽\n        native: string[];\n        // 列自定义插槽\n        custom: string[];\n      }>(() => {\n        const native: string[] = [];\n        const custom: string[] = [];\n        const columns = unref<Recordable[]>(getViewColumns) as BasicColumn[];\n        const allCustomRender = columns.map<string>((column) => column.slotsBak?.customRender);\n        for (const name of Object.keys(slots)) {\n          // 过滤特殊的插槽\n          if (['bodyCell'].includes(name)) {\n            continue;\n          }\n          if (allCustomRender.includes(name)) {\n            custom.push(name);\n          } else {\n            native.push(name);\n          }\n        }\n        return { native, custom };\n      });\n      // 代码逻辑说明: 【issues/945】BasicTable组件设置默认展开不生效\n      nextTick(() => {\n        getProps.value.defaultExpandAllRows && expandAll();\n      })\n      // 代码逻辑说明: 【issues/7588】选择后自动刷新表格\n      expose({ ...tableAction, handleSearchInfoChange });\n\n      emit('register', tableAction, formActions);\n\n\n      return {\n        tableElRef,\n        getBindValues,\n        getLoading,\n        registerForm,\n        handleSearchInfoChange,\n        getEmptyDataIsShowTable,\n        handleTableChange,\n        getRowClassName,\n        wrapRef,\n        tableAction,\n        redoHeight,\n        handleResizeColumn: (w, col) => {\n          // 代码逻辑说明: 【issues/7101】列配置resizable: true时，表尾合计的列宽没有同步改变\n          const columns = getColumns();\n          const findItem = columns.find((item) => {\n            if (item['dataIndex'] != null) {\n              return item['dataIndex'] === col['dataIndex'];\n            } else if (item['flag'] != null) {\n              return item['flag'] === col['flag'];\n            }\n            return false;\n          });\n          if (findItem) {\n            findItem.width = w;\n            setColumns(columns);\n          }\n          console.log('col',col);\n          col.width = w;\n        },\n        getFormProps: getFormProps as any,\n        replaceFormSlotKey,\n        getFormSlotKeys,\n        getWrapperClass,\n        getMaxColumnWidth,\n        columns: getViewColumns,\n\n        selectHeaderProps,\n        isCustomSelection,\n        slotNamesGroup,\n        getSummaryProps,\n        showSummaryRef,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @border-color: #cecece4d;\n\n  @prefix-cls: ~'@{namespace}-basic-table';\n\n  [data-theme='dark'] {\n    .ant-table-tbody > tr:hover.ant-table-row-selected > td,\n    .ant-table-tbody > tr.ant-table-row-selected td {\n      background-color: #262626;\n    }\n\n    .@{prefix-cls} {\n      //表格选择工具栏样式\n      .alert {\n        // background-color: #323232;\n        // border-color: #424242;\n      }\n    }\n  }\n\n  .@{prefix-cls} {\n    max-width: 100%;\n\n    &-row__striped {\n      td {\n        background-color: @app-content-background;\n      }\n    }\n    // 代码逻辑说明: 【TV360X-1232】查询区域隐藏后点击刷新不走请求了(采用css隐藏)\n    > .table-search-area-hidden {\n      display: none;\n    }\n    &-form-container {\n      padding: 10px;\n\n      .ant-form {\n        padding: 12px 10px 6px 10px;\n        margin-bottom: 8px;\n        background-color: @component-background;\n        border-radius: 2px;\n      }\n    }\n\n    .ant-tag {\n      margin-right: 0;\n    }\n\n    // 代码逻辑说明: [issues/526]RangePicker 设置预设范围按钮样式问题---\n    .ant-picker-preset {\n      .ant-tag {\n        margin-right: 8px !important;\n      }\n    }\n\n    .ant-table-wrapper {\n      padding: 6px;\n      background-color: @component-background;\n      border-radius: 2px;\n\n      .ant-table-title {\n        min-height: 40px;\n        padding: 0 0 8px 0 !important;\n      }\n\n      .ant-table.ant-table-bordered .ant-table-title {\n        border: none !important;\n      }\n    }\n\n    .ant-table {\n      width: 100%;\n      overflow-x: hidden;\n\n      &-title {\n        display: flex;\n        padding: 8px 6px;\n        border-bottom: none;\n        justify-content: space-between;\n        align-items: center;\n      }\n      //定义行颜色\n      .trcolor {\n        background-color: rgba(255, 192, 203, 0.31);\n        color: red;\n      }\n\n      //.ant-table-tbody > tr.ant-table-row-selected td {\n      //background-color: fade(@primary-color, 8%) !important;\n      //}\n    }\n\n    .ant-pagination {\n      margin: 10px 0 0 0;\n    }\n\n    .ant-table-footer {\n      padding: 0;\n\n      .ant-table-wrapper {\n        padding: 0;\n      }\n\n      table {\n        border: none !important;\n      }\n\n      .ant-table-content {\n        overflow-x: hidden !important;\n        //  overflow-y: scroll !important;\n      }\n\n      td {\n        padding: 12px 8px;\n      }\n    }\n    //表格选择工具栏样式\n    .alert {\n      height: 38px;\n      // background-color: #e6f7ff;\n      // border-color: #91d5ff;\n    }\n    &--inset {\n      .ant-table-wrapper {\n        padding: 0;\n      }\n    }\n\n    // ------ 统一设置表格列最大宽度 ------\n    &-col-max-width {\n      .ant-table-thead tr th,\n      .ant-table-tbody tr td {\n        max-width: v-bind(getMaxColumnWidth);\n      }\n    }\n    // ------ 统一设置表格列最大宽度 ------\n\n    // 代码逻辑说明: 【issues/622】修复表尾合计错位的问题\n    &--show-summary {\n      .ant-table > .ant-table-footer {\n        padding: 12px 0 0;\n      }\n      .ant-table > .ant-table-footer {\n        // 代码逻辑说明: 【issues/7413】合计行有点对不齐\n        padding-left: 0 !important;\n        padding-right: 0 !important;\n      }\n      .ant-table.ant-table-bordered > .ant-table-footer {\n        border: 0;\n      }\n    }\n    // 代码逻辑说明: 【TV360X-377】关联记录必填影响到了table的输入框和页码样式\n    > .ant-form-item {\n      margin-bottom: 0;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/componentMap.ts",
    "content": "import type { Component } from 'vue';\nimport { Input, Select, Checkbox, InputNumber, Switch, DatePicker, TimePicker } from 'ant-design-vue';\nimport type { ComponentType } from './types/componentType';\nimport { ApiSelect, ApiTreeSelect } from '/@/components/Form';\n\nconst componentMap = new Map<ComponentType, Component>();\n\ncomponentMap.set('Input', Input);\ncomponentMap.set('InputNumber', InputNumber);\ncomponentMap.set('Select', Select);\ncomponentMap.set('ApiSelect', ApiSelect);\ncomponentMap.set('ApiTreeSelect', ApiTreeSelect);\ncomponentMap.set('Switch', Switch);\ncomponentMap.set('Checkbox', Checkbox);\ncomponentMap.set('DatePicker', DatePicker);\ncomponentMap.set('TimePicker', TimePicker);\n\nexport function add(compName: ComponentType, component: Component) {\n  componentMap.set(compName, component);\n}\n\nexport function del(compName: ComponentType) {\n  componentMap.delete(compName);\n}\n\nexport { componentMap };\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/components/CustomSelectHeader.vue",
    "content": "<!-- 自定义选择列，表头实现部分 -->\n<template>\n  <template v-if=\"isRadio\">\n    <!-- radio不存在全选，所以放个空标签 -->\n    <span></span>\n  </template>\n  <template v-else>\n    <template v-if=\"hideSelectAll\">\n      <span></span>\n    </template>\n    <a-checkbox :disabled=\"disabled\" v-else :checked=\"checked\" :indeterminate=\"isHalf\" @update:checked=\"onChange\" />\n  </template>\n</template>\n<script setup lang=\"ts\">\n  import { computed } from 'vue';\n\n  const props = defineProps({\n    isRadio: {\n      type: Boolean,\n      required: true,\n    },\n    selectedLength: {\n      type: Number,\n      required: true,\n    },\n    // 当前页条目数\n    pageSize: {\n      type: Number,\n      required: true,\n    },\n    hideSelectAll: {\n      type: Boolean,\n      default: false,\n    },\n    // 代码逻辑说明: 【QQYUN-6774】解决checkbox禁用后全选仍能勾选问题\n    disabled: {\n      type: Boolean,\n      required: true,\n    },\n  });\n  const emit = defineEmits(['select-all']);\n\n  // 是否全选\n  const checked = computed(() => {\n    if (props.isRadio) {\n      return false;\n    }\n    return props.selectedLength > 0 && props.selectedLength >= props.pageSize;\n  });\n\n  // 是否半选\n  const isHalf = computed(() => {\n    if (props.isRadio) {\n      return false;\n    }\n    return props.selectedLength > 0 && props.selectedLength < props.pageSize;\n  });\n\n  function onChange(checked: boolean) {\n    emit('select-all', checked);\n  }\n</script>\n\n<style scoped lang=\"scss\"></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/components/EditTableHeaderIcon.vue",
    "content": "<template>\n  <span>\n    <slot></slot>\n    {{ title }}\n    <FormOutlined />\n  </span>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { FormOutlined } from '@ant-design/icons-vue';\n  export default defineComponent({\n    name: 'EditTableHeaderIcon',\n    components: { FormOutlined },\n    props: { title: { type: String, default: '' } },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/components/ExpandIcon.tsx",
    "content": "import { BasicArrow } from '/@/components/Basic';\n\nexport default () => {\n  return (props: Recordable) => {\n    if (!props.expandable) {\n      if (props.needIndentSpaced) {\n        return <span class=\"ant-table-row-expand-icon ant-table-row-spaced\" />;\n      } else {\n        return <span />;\n      }\n    }\n    return (\n      <BasicArrow\n        style=\"margin-right: 8px\"\n        iconStyle=\"margin-top: -2px;\"\n        onClick={(e: Event) => {\n          props.onExpand(props.record, e);\n        }}\n        expand={props.expanded}\n      />\n    );\n  };\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/components/HeaderCell.vue",
    "content": "<template>\n  <EditTableHeaderCell v-if=\"getIsEdit\">\n    {{ getTitle }}\n  </EditTableHeaderCell>\n  <span v-else>{{ getTitle }}</span>\n  <BasicHelp v-if=\"getHelpMessage\" :text=\"getHelpMessage\" :class=\"`${prefixCls}__help`\" />\n</template>\n<script lang=\"ts\">\n  import type { PropType } from 'vue';\n  import type { BasicColumn } from '../types/table';\n  import { defineComponent, computed } from 'vue';\n  import BasicHelp from '/@/components/Basic/src/BasicHelp.vue';\n  import EditTableHeaderCell from './EditTableHeaderIcon.vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  export default defineComponent({\n    name: 'TableHeaderCell',\n    components: {\n      EditTableHeaderCell,\n      BasicHelp,\n    },\n    props: {\n      column: {\n        type: Object as PropType<BasicColumn>,\n        default: () => ({}),\n      },\n    },\n    setup(props) {\n      const { prefixCls } = useDesign('basic-table-header-cell');\n\n      const getIsEdit = computed(() => !!props.column?.edit);\n      const getTitle = computed(() => {\n        // 代码逻辑说明: 【QQYUN-6366】升级到antd4.x\n        const result = props.column?.customTitle || props.column?.title;\n        if (typeof result === 'string') {\n          return result;\n        } else {\n          return '';\n        }\n      });\n      const getHelpMessage = computed(() => props.column?.helpMessage);\n\n      return { prefixCls, getIsEdit, getTitle, getHelpMessage };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-basic-table-header-cell';\n\n  .@{prefix-cls} {\n    &__help {\n      margin-left: 8px;\n      color: rgb(0 0 0 / 65%) !important;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/components/TableAction.vue",
    "content": "<template>\n  <div :class=\"[prefixCls, getAlign]\" @click=\"onCellClick\">\n    <template v-for=\"(action, index) in getActions\" :key=\"`${index}-${action.label}`\">\n      <template v-if=\"action.slot\">\n        <slot name=\"customButton\"></slot>\n      </template>\n      <template v-else>\n        <Tooltip v-if=\"action.tooltip\" v-bind=\"getTooltip(action.tooltip)\">\n          <PopConfirmButton v-bind=\"action\">\n            <Icon :icon=\"action.icon\" :class=\"{ 'mr-1': !!action.label }\" v-if=\"action.icon\" />\n            <template v-if=\"action.label\">{{ action.label }}</template>\n          </PopConfirmButton>\n        </Tooltip>\n        <PopConfirmButton v-else v-bind=\"action\">\n          <Icon :icon=\"action.icon\" :class=\"{ 'mr-1': !!action.label }\" v-if=\"action.icon\" />\n          <template v-if=\"action.label\">{{ action.label }}</template>\n        </PopConfirmButton>\n      </template>\n\n      <Divider type=\"vertical\" class=\"action-divider\" v-if=\"divider && index < getActions.length - 1\" />\n    </template>\n    <Dropdown\n      :overlayClassName=\"dropdownCls\"\n      :trigger=\"['hover']\"\n      :dropMenuList=\"getDropdownList\"\n      popconfirm\n      v-if=\"dropDownActions && getDropdownList.length > 0\"\n      :getPopupContainer=\"dropdownGetPopupContainer\"\n    >\n      <slot name=\"more\"></slot>\n      <!--  设置插槽   -->\n      <template v-slot:[item.slot] v-for=\"(item, index) in getDropdownSlotList\" :key=\"`${index}-${item.label}`\">\n        <slot :name=\"item.slot\"></slot>\n      </template>\n\n      <a-button type=\"link\" size=\"small\" v-if=\"!$slots.more\"> 更多 <Icon icon=\"mdi-light:chevron-down\"></Icon> </a-button>\n    </Dropdown>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, computed, toRaw, unref } from 'vue';\n  import { MoreOutlined } from '@ant-design/icons-vue';\n  import { Divider, Tooltip, TooltipProps } from 'ant-design-vue';\n  import Icon from '/@/components/Icon/index';\n  import { ActionItem, TableActionType } from '/@/components/Table';\n  import { PopConfirmButton } from '/@/components/Button';\n  import { Dropdown } from '/@/components/Dropdown';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useTableContext } from '../hooks/useTableContext';\n  import { usePermission } from '/@/hooks/web/usePermission';\n  import { isBoolean, isFunction, isString } from '/@/utils/is';\n  import { propTypes } from '/@/utils/propTypes';\n  import { ACTION_COLUMN_FLAG } from '../const';\n\n  export default defineComponent({\n    name: 'TableAction',\n    components: { Icon, PopConfirmButton, Divider, Dropdown, MoreOutlined, Tooltip },\n    props: {\n      actions: {\n        type: Array as PropType<ActionItem[]>,\n        default: null,\n      },\n      dropDownActions: {\n        type: Array as PropType<ActionItem[]>,\n        default: null,\n      },\n      divider: propTypes.bool.def(true),\n      outside: propTypes.bool,\n      stopButtonPropagation: propTypes.bool.def(false),\n    },\n    setup(props) {\n      const { prefixCls } = useDesign('basic-table-action');\n      const dropdownCls = `${prefixCls}-dropdown`;\n      let table: Partial<TableActionType> = {};\n\n      const tempActionsAuth = {};\n      const tempDropdownListAuth = {};\n\n      if (!props.outside) {\n        table = useTableContext();\n      }\n\n      const { hasPermission } = usePermission();\n      function isIfShow(action: ActionItem): boolean {\n        const ifShow = action.ifShow;\n\n        let isIfShow = true;\n\n        if (isBoolean(ifShow)) {\n          isIfShow = ifShow;\n        }\n        if (isFunction(ifShow)) {\n          isIfShow = ifShow(action);\n        }\n        return isIfShow;\n      }\n\n      const getActions = computed(() => {\n        return (toRaw(props.actions) || [])\n          .filter((action) => {\n            // -update-begin--author:liaozhiyang---date:20240619---for：【TV360X-528】列表配置了权限，在列表行上划过，都会执行hasPermission\n            const auth: any = action.auth;\n            let authResult;\n            if (action.auth && typeof tempActionsAuth[auth] === 'boolean') {\n              authResult = tempActionsAuth[auth];\n            } else {\n              authResult = hasPermission(action.auth);\n              action.auth && (tempActionsAuth[auth] = authResult);\n            }\n            return authResult && isIfShow(action);\n            // -update-end--author:liaozhiyang---date:20240619---for：【TV360X-528】列表配置了权限，在列表行上划过，都会执行hasPermission\n          })\n          .map((action) => {\n            const { popConfirm } = action;\n            // 代码逻辑说明: 【issues/951】table删除记录时按钮显示错位\n            if (popConfirm) {\n              const overlayClassName = popConfirm.overlayClassName;\n              popConfirm.overlayClassName = `${overlayClassName ? overlayClassName : ''} ${prefixCls}-popconfirm`;\n            }\n            return {\n              getPopupContainer: () => unref((table as any)?.wrapRef.value) ?? document.body,\n              type: 'link',\n              size: 'small',\n              ...action,\n              ...(popConfirm || {}),\n              // 代码逻辑说明: 【issues/936】表格操作栏删除当接口失败时，气泡确认框不会消失\n              onConfirm: handelConfirm(popConfirm?.confirm),\n              onCancel: popConfirm?.cancel,\n              enable: !!popConfirm,\n            };\n          });\n      });\n\n      const getDropdownList = computed((): any[] => {\n        //过滤掉隐藏的dropdown,避免出现多余的分割线\n        const list = (toRaw(props.dropDownActions) || []).filter((action) => {\n          // -update-begin--author:liaozhiyang---date:20240619---for：【TV360X-528】列表配置了权限，在列表行上划过，都会执行hasPermission\n          const auth: any = action.auth;\n          let authResult;\n          if (action.auth && typeof tempDropdownListAuth[auth] === 'boolean') {\n            authResult = tempDropdownListAuth[auth];\n          } else {\n            authResult = hasPermission(action.auth);\n            action.auth && (tempDropdownListAuth[auth] = authResult);\n          }\n          return authResult && isIfShow(action);\n          // -update-end--author:liaozhiyang---date:20240619---for：【TV360X-528】列表配置了权限，在列表行上划过，都会执行hasPermission\n        });\n        return list.map((action, index) => {\n          const { label, popConfirm } = action;\n          // 代码逻辑说明: 【issues/951】table删除记录时按钮显示错位\n          if (popConfirm) {\n            const overlayClassName = popConfirm.overlayClassName;\n            popConfirm.overlayClassName = `${overlayClassName ? overlayClassName : ''} ${prefixCls}-popconfirm`;\n            // 代码逻辑说明: 【issues/7028】表格全屏后操作列中的下拉菜单和气泡确认框不显示\n            if (!popConfirm.getPopupContainer) {\n              popConfirm.getPopupContainer = () => {\n                return (table as any)?.wrapRef?.value ?? document.body;\n              };\n            }\n          }\n          // 代码逻辑说明: 【issues/936】表格操作栏删除当接口失败时，气泡确认框不会消失\n          if (popConfirm) {\n            popConfirm.confirm = handelConfirm(popConfirm?.confirm);\n          }\n          return {\n            ...action,\n            ...popConfirm,\n            onConfirm: handelConfirm(popConfirm?.confirm),\n            onCancel: popConfirm?.cancel,\n            text: label,\n            divider: index < list.length - 1 ? props.divider : false,\n          };\n        });\n      });\n      /*\n      2023-01-08\n      liaozhiyang\n      给传进来的函数包一层promise\n      */\n      const handelConfirm = (fn) => {\n        if (typeof fn !== 'function') return fn;\n        const anyc = () => {\n          return new Promise<void>((resolve) => {\n            const result = fn();\n            if (Object.prototype.toString.call(result) === '[object Promise]') {\n              result\n                .finally(() => {\n                  resolve();\n                })\n                .catch((err) => {\n                  console.log(err);\n                });\n            } else {\n              resolve();\n            }\n          });\n        };\n        return anyc;\n      };\n      const getDropdownSlotList = computed((): any[] => {\n        return unref(getDropdownList).filter((item) => item.slot);\n      });\n      const getAlign = computed(() => {\n        const columns = (table as TableActionType)?.getColumns?.() || [];\n        const actionColumn = columns.find((item) => item.flag === ACTION_COLUMN_FLAG);\n        return actionColumn?.align ?? 'left';\n      });\n\n      function getTooltip(data: string | TooltipProps): TooltipProps {\n        return {\n          getPopupContainer: () => unref((table as any)?.wrapRef.value) ?? document.body,\n          placement: 'bottom',\n          ...(isString(data) ? { title: data } : data),\n        };\n      }\n\n      function onCellClick(e: MouseEvent) {\n        if (!props.stopButtonPropagation) return;\n        const path = e.composedPath() as HTMLElement[];\n        const isInButton = path.find((ele) => {\n          return ele.tagName?.toUpperCase() === 'BUTTON';\n        });\n        isInButton && e.stopPropagation();\n      }\n      // 代码逻辑说明: 【issues/7028】表格全屏后操作列中的下拉菜单和气泡确认框不显示\n      const dropdownGetPopupContainer = () => {\n        return (table as any)?.wrapRef?.value ?? document.body;\n      };\n      return { prefixCls, getActions, getDropdownList, getDropdownSlotList, getAlign, onCellClick, getTooltip, dropdownCls, dropdownGetPopupContainer };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-basic-table-action';\n\n  .@{prefix-cls} {\n    display: flex;\n    align-items: center;\n    /* update-begin-author:taoyan date:2022-11-18 for: 表格默认行高比官方示例多出2px*/\n    height: 22px;\n    /* update-end-author:taoyan date:2022-11-18 for: 表格默认行高比官方示例多出2px*/\n\n    .action-divider {\n      display: table;\n    }\n\n    &.left {\n      justify-content: flex-start;\n    }\n\n    &.center {\n      justify-content: center;\n    }\n\n    &.right {\n      justify-content: flex-end;\n    }\n\n    button {\n      display: flex;\n      align-items: center;\n\n      span {\n        margin-left: 0 !important;\n      }\n    }\n\n    button.ant-btn-circle {\n      span {\n        margin: auto !important;\n      }\n    }\n\n    .ant-divider,\n    .ant-divider-vertical {\n      margin: 0 2px;\n    }\n\n    .icon-more {\n      transform: rotate(90deg);\n\n      svg {\n        font-size: 1.1em;\n        font-weight: 700;\n      }\n    }\n    &-popconfirm {\n      .ant-popconfirm-buttons {\n        min-width: 120px;\n        // 代码逻辑说明: 【issues/1019】popConfirm确认框待端后端返回过程中（处理中）样式错乱\n        display: flex;\n        align-items: center;\n        justify-content: center;\n      }\n    }\n    // 代码逻辑说明: 【QQYUN-8762】调整table操作栏ant-dropdown样式\n    &-dropdown {\n      .ant-dropdown-menu .ant-dropdown-menu-item-divider {\n        margin: 2px 0;\n      }\n      .ant-dropdown-menu .ant-dropdown-menu-item {\n        padding: 3px 8px;\n        font-size: 13.6px;\n      }\n      .dropdown-event-area {\n        padding: 0 !important;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/components/TableFooter.vue",
    "content": "<template>\n  <div ref=\"tableFooter\">\n    <Table\n      v-if=\"summaryFunc || summaryData\"\n      :showHeader=\"false\"\n      :bordered=\"bordered\"\n      :pagination=\"false\"\n      :dataSource=\"getDataSource\"\n      :rowKey=\"(r) => r[rowKey]\"\n      :columns=\"getColumns\"\n      tableLayout=\"fixed\"\n      :scroll=\"scroll\"\n    />\n  </div>\n</template>\n<script lang=\"ts\">\n  import type { PropType } from 'vue';\n  import { defineComponent, unref, computed, toRaw, onMounted, onUnmounted, ref } from 'vue';\n  import { Table } from 'ant-design-vue';\n  import { cloneDeep } from 'lodash-es';\n  import { isFunction } from '/@/utils/is';\n  import type { BasicColumn } from '../types/table';\n  import { INDEX_COLUMN_FLAG } from '../const';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useTableContext } from '../hooks/useTableContext';\n\n  const SUMMARY_ROW_KEY = '_row';\n  const SUMMARY_INDEX_KEY = '_index';\n  export default defineComponent({\n    name: 'BasicTableFooter',\n    components: { Table },\n    props: {\n      bordered: {\n        type: Boolean,\n        default: false,\n      },\n      summaryFunc: {\n        type: Function as PropType<Fn>,\n      },\n      summaryData: {\n        type: Array as PropType<Recordable[]>,\n      },\n      scroll: {\n        type: Object as PropType<Recordable>,\n      },\n      rowKey: propTypes.string.def('key'),\n      // 是否有展开列\n      hasExpandedRow: propTypes.bool,\n    },\n    setup(props) {\n      const table = useTableContext();\n      const getColumnsRef = table.getColumnsRef();\n      const tableFooter = ref<any>(null);\n      const getDataSource = computed((): Recordable[] => {\n        const { summaryFunc, summaryData } = props;\n        if (summaryData?.length) {\n          summaryData.forEach((item, i) => (item[props.rowKey] = `${i}`));\n          return summaryData;\n        }\n        if (!isFunction(summaryFunc)) {\n          return [];\n        }\n        // 代码逻辑说明: 【QQYUN-8172】可编辑单元格编辑完以后不更新合计值\n        let dataSource = cloneDeep(unref(table.getDataSource()));\n        dataSource = summaryFunc(dataSource);\n        dataSource.forEach((item, i) => {\n          item[props.rowKey] = `${i}`;\n        });\n        return dataSource;\n      });\n\n      const getColumns = computed(() => {\n        const dataSource = unref(getDataSource);\n        // 代码逻辑说明: 【issues/8502】权限列不显示后，表尾行合计栏还显示导致对不齐\n        const allColumns = unref(getColumnsRef);\n        let columns: BasicColumn[] = cloneDeep(table.getColumns({ ignoreAuth: true, ignoreIfShow: true }));\n        // 代码逻辑说明: 【issues/638】表格合计，列自定义隐藏或展示时，合计栏会错位\n        columns = columns.filter((item) => !item.defaultHidden);\n        const index = columns.findIndex((item) => item.flag === INDEX_COLUMN_FLAG);\n        const hasRowSummary = dataSource.some((item) => Reflect.has(item, SUMMARY_ROW_KEY));\n        const hasIndexSummary = dataSource.some((item) => Reflect.has(item, SUMMARY_INDEX_KEY));\n\n        // 是否有序号列\n        let hasIndexCol = false;\n        // 是否有选择列\n        let hasSelection = table.getRowSelection() && hasRowSummary\n\n        if (index !== -1) {\n          if (hasIndexSummary) {\n            hasIndexCol = true;\n            columns[index].customRender = ({ record }) => record[SUMMARY_INDEX_KEY];\n            columns[index].ellipsis = false;\n          } else {\n            Reflect.deleteProperty(columns[index], 'customRender');\n          }\n        }\n\n        if (hasSelection) {\n          // 代码逻辑说明: 【issues/776】显示100条/页，复选框只能显示3个的问题(fixed也有可能设置true)\n          const isFixed = columns.some((col) => col.fixed === 'left' || col.fixed === true);\n          columns.unshift({\n            width: 50,\n            title: 'selection',\n            key: 'selectionKey',\n            align: 'center',\n            ...(isFixed ? { fixed: 'left' } : {}),\n            customRender: ({ record }) => hasIndexCol ? '' : record[SUMMARY_ROW_KEY],\n          });\n        }\n\n        if (props.hasExpandedRow) {\n          const isFixed = columns.some((col) => col.fixed === 'left');\n          columns.unshift({\n            width: 50,\n            title: 'expandedRow',\n            key: 'expandedRowKey',\n            align: 'center',\n            ...(isFixed ? { fixed: 'left' } : {}),\n            customRender: () => '',\n          });\n        }\n        return columns;\n      });\n      // 代码逻辑说明: 【issues/7773】合计没有跟着左右滚动条滚动\n      let mainTableBody, footerTable;\n      const handleSroll = () => {\n        const scrollLeft = mainTableBody.scrollLeft;\n        footerTable.scrollLeft = scrollLeft;\n      };\n      onMounted(() => {\n        setTimeout(() => {\n          mainTableBody = tableFooter.value?.parentNode?.parentNode?.querySelector('.ant-table-body');\n          footerTable = tableFooter.value?.querySelector('.ant-table-body');\n          mainTableBody?.addEventListener('scroll', handleSroll, false);\n        }, 1e3);\n      });\n      onUnmounted(() => {\n        mainTableBody?.addEventListener('scroll', handleSroll);\n      });\n      return { getColumns, getDataSource, tableFooter };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  // 代码逻辑说明: 【issues/776】显示100条/页，复选框只能显示3个的问题(隐藏合计的滚动条)\n  .ant-table-wrapper {\n    :deep(.ant-table-body) {\n      overflow-x: hidden !important;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/components/TableHeader.vue",
    "content": "<template>\n  <div style=\"width: 100%\">\n    <div v-if=\"$slots.headerTop\" style=\"margin: 5px\">\n      <slot name=\"headerTop\"></slot>\n    </div>\n    <div :class=\"`flex items-center ${prefixCls}__table-title-box`\">\n      <div :class=\"`${prefixCls}__tableTitle`\">\n        <slot name=\"tableTitle\" v-if=\"$slots.tableTitle\"></slot>\n        <!--修改标题插槽位置-->\n        <TableTitle :helpMessage=\"titleHelpMessage\" :title=\"title\" v-if=\"!$slots.tableTitle && title\" />\n      </div>\n\n      <div :class=\"`${prefixCls}__toolbar`\">\n        <slot name=\"toolbar\"></slot>\n        <Divider type=\"vertical\" v-if=\"$slots.toolbar && showTableSetting\" />\n        <TableSetting :class=\"`${prefixCls}__toolbar-desktop`\" style=\"white-space: nowrap;\" :setting=\"tableSetting\" v-if=\"showTableSetting\" @columns-change=\"handleColumnChange\" />\n        <a-popover :overlayClassName=\"`${prefixCls}__toolbar-mobile`\" trigger=\"click\" placement=\"left\" :getPopupContainer=\"(n) => n?.parentElement\">\n          <template #content>\n            <TableSetting mode=\"mobile\" :setting=\"tableSetting\" v-if=\"showTableSetting\" @columns-change=\"handleColumnChange\" />\n          </template>\n          <a-button :class=\"`${prefixCls}__toolbar-mobile`\" v-if=\"showTableSetting\" type=\"text\" preIcon=\"ant-design:menu\" shape=\"circle\" />\n        </a-popover>\n      </div>\n    </div>\n    <!--添加tableTop插槽-->\n    <div style=\"margin: -4px 0 -2px; padding-top: 5px\">\n      <slot name=\"tableTop\">\n        <a-alert type=\"info\" show-icon class=\"alert\" v-if=\"openRowSelection != null\">\n          <template #message>\n            <template v-if=\"selectRowKeys.length > 0\">\n              <span>\n                <span>已选中 {{ selectRowKeys.length }} 条记录</span>\n                <span v-if=\"isAcrossPage\">(可跨页)</span>\n              </span>\n              <a-divider type=\"vertical\" />\n              <a @click=\"setSelectedRowKeys([])\">清空</a>\n              <slot name=\"alertAfter\" />\n            </template>\n            <template v-else>\n              <span>未选中任何数据</span>\n            </template>\n          </template>\n        </a-alert>\n      </slot>\n    </div>\n    <!--添加tableTop插槽-->\n  </div>\n</template>\n<script lang=\"ts\">\n  import type { TableSetting, ColumnChangeParam } from '../types/table';\n  import type { PropType } from 'vue';\n  import { defineComponent, computed } from 'vue';\n  import { Divider } from 'ant-design-vue';\n  import TableSettingComponent from './settings/index.vue';\n  import TableTitle from './TableTitle.vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useTableContext } from '../hooks/useTableContext';\n\n  export default defineComponent({\n    name: 'BasicTableHeader',\n    components: {\n      Divider,\n      TableTitle,\n      TableSetting: TableSettingComponent,\n    },\n    props: {\n      title: {\n        type: [Function, String] as PropType<string | ((data: Recordable) => string)>,\n      },\n      tableSetting: {\n        type: Object as PropType<TableSetting>,\n      },\n      showTableSetting: {\n        type: Boolean,\n      },\n      titleHelpMessage: {\n        type: [String, Array] as PropType<string | string[]>,\n        default: '',\n      },\n    },\n    emits: ['columns-change'],\n    setup(_, { emit }) {\n      const { prefixCls } = useDesign('basic-table-header');\n\n      function handleColumnChange(data: ColumnChangeParam[]) {\n        emit('columns-change', data);\n      }\n\n      const { getSelectRowKeys, setSelectedRowKeys, getRowSelection } = useTableContext();\n      const selectRowKeys = computed(() => getSelectRowKeys());\n      const openRowSelection = computed(() => getRowSelection());\n      // 是否允许跨页选择\n      const isAcrossPage = computed(() => openRowSelection.value?.preserveSelectedRowKeys === true);\n\n      return { prefixCls, handleColumnChange, selectRowKeys, setSelectedRowKeys, openRowSelection, isAcrossPage };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-basic-table-header';\n\n  .@{prefix-cls} {\n    &__toolbar {\n      //flex: 1;\n      width: 140px;\n      display: flex;\n      align-items: center;\n      justify-content: flex-end;\n\n      > * {\n        margin-right: 8px;\n      }\n\n      &-desktop {\n        display: block;\n      }\n\n      &-mobile {\n        display: none;\n      }\n    }\n    &__tableTitle {\n      flex: 1;\n      display: flex;\n      flex-wrap: wrap;\n      align-content: flex-start;\n\n      > * {\n        margin-right: 4px;\n        margin-bottom: 4px;\n      }\n    }\n\n    @media (max-width: @screen-lg) {\n      &__table-title-box {\n        align-items: flex-end;\n      }\n\n      &__toolbar {\n        width: 30px;\n        text-align: center;\n\n        > * {\n          margin-right: 0;\n        }\n\n        .table-settings > * {\n          margin-right: 0;\n          margin-bottom: 6px;\n        }\n        &-desktop {\n          display: none;\n        }\n\n        &-mobile {\n          display: block;\n          .table-settings > * {\n            margin-right: 6px;\n            margin-bottom: 0;\n          }\n        }\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/components/TableImg.vue",
    "content": "<template>\n  <div :class=\"prefixCls\" class=\"flex items-center mx-auto\" v-if=\"imgList && imgList.length\" :style=\"getWrapStyle\">\n    <Badge :count=\"!showBadge || imgList.length == 1 ? 0 : imgList.length\" v-if=\"simpleShow\">\n      <div class=\"img-div\">\n        <PreviewGroup>\n          <template v-for=\"(img, index) in imgList\" :key=\"img\">\n            <Image\n              :width=\"size\"\n              :style=\"{\n                display: index === 0 ? '' : 'none !important',\n              }\"\n              :src=\"srcPrefix + img\"\n            />\n          </template>\n        </PreviewGroup>\n      </div>\n    </Badge>\n    <PreviewGroup v-else>\n      <template v-for=\"(img, index) in imgList\" :key=\"img\">\n        <Image :width=\"size\" :style=\"{ marginLeft: index === 0 ? 0 : margin }\" :src=\"srcPrefix + img\" />\n      </template>\n    </PreviewGroup>\n  </div>\n</template>\n<script lang=\"ts\">\n  import type { CSSProperties } from 'vue';\n  import { defineComponent, computed } from 'vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { Image, Badge } from 'ant-design-vue';\n  import { propTypes } from '/@/utils/propTypes';\n\n  export default defineComponent({\n    name: 'TableImage',\n    components: { Image, PreviewGroup: Image.PreviewGroup, Badge },\n    props: {\n      imgList: propTypes.arrayOf(propTypes.string),\n      size: propTypes.number.def(40),\n      // 是否简单显示（只显示第一张图片）\n      simpleShow: propTypes.bool,\n      // 简单模式下是否显示图片数量的badge\n      showBadge: propTypes.bool.def(true),\n      // 图片间距\n      margin: propTypes.number.def(4),\n      // src前缀，将会附加在imgList中每一项之前\n      srcPrefix: propTypes.string.def(''),\n    },\n    setup(props) {\n      const getWrapStyle = computed((): CSSProperties => {\n        const { size } = props;\n        const s = `${size}px`;\n        return { height: s, width: s };\n      });\n\n      const { prefixCls } = useDesign('basic-table-img');\n      return { prefixCls, getWrapStyle };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-basic-table-img';\n\n  .@{prefix-cls} {\n    .ant-image {\n      margin-right: 4px;\n      cursor: zoom-in;\n\n      img {\n        border-radius: 2px;\n      }\n    }\n\n    .img-div {\n      display: inline-grid;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/components/TableSummary.tsx",
    "content": "import type { PropType, VNode } from 'vue';\nimport { defineComponent, unref, computed, isVNode } from 'vue';\nimport { cloneDeep, pick } from 'lodash-es';\nimport { isFunction } from '/@/utils/is';\nimport type { BasicColumn } from '../types/table';\nimport { INDEX_COLUMN_FLAG } from '../const';\nimport { propTypes } from '/@/utils/propTypes';\nimport { useTableContext } from '../hooks/useTableContext';\nimport { TableSummary, TableSummaryRow, TableSummaryCell } from 'ant-design-vue';\n\nconst SUMMARY_ROW_KEY = '_row';\nconst SUMMARY_INDEX_KEY = '_index';\nexport default defineComponent({\n  name: 'BasicTableSummary',\n  components: { TableSummary, TableSummaryRow, TableSummaryCell },\n  props: {\n    summaryFunc: {\n      type: Function as PropType<Fn>,\n    },\n    summaryData: {\n      type: Array as PropType<Recordable[]>,\n    },\n    rowKey: propTypes.string.def('key'),\n    // 是否有展开列\n    hasExpandedRow: propTypes.bool,\n    data: {\n      type: Object as PropType<Recordable>,\n      default: () => {},\n    },\n  },\n  setup(props) {\n    const table = useTableContext();\n\n    const getDataSource = computed((): Recordable[] => {\n      const {\n        summaryFunc,\n        summaryData,\n        data: { pageData },\n      } = props;\n      if (summaryData?.length) {\n        summaryData.forEach((item, i) => (item[props.rowKey] = `${i}`));\n        return summaryData;\n      }\n      if (!isFunction(summaryFunc)) {\n        return [];\n      }\n      let dataSource = cloneDeep(unref(pageData));\n      dataSource = summaryFunc(dataSource);\n      dataSource.forEach((item, i) => {\n        item[props.rowKey] = `${i}`;\n      });\n      return dataSource;\n    });\n\n    const getColumns = computed(() => {\n      const dataSource = unref(getDataSource);\n      let columns: BasicColumn[] = cloneDeep(table.getColumns({ sort: true }));\n      columns = columns.filter((item) => !item.defaultHidden);\n      const index = columns.findIndex((item) => item.flag === INDEX_COLUMN_FLAG);\n      const hasRowSummary = dataSource.some((item) => Reflect.has(item, SUMMARY_ROW_KEY));\n      const hasIndexSummary = dataSource.some((item) => Reflect.has(item, SUMMARY_INDEX_KEY));\n\n      // 是否有序号列\n      let hasIndexCol = false;\n      // 是否有选择列\n      const hasSelection = table.getRowSelection() && hasRowSummary;\n\n      if (index !== -1) {\n        if (hasIndexSummary) {\n          hasIndexCol = true;\n          columns[index].customSummaryRender = ({ record }) => record[SUMMARY_INDEX_KEY];\n          columns[index].ellipsis = false;\n        } else {\n          Reflect.deleteProperty(columns[index], 'customSummaryRender');\n        }\n      }\n\n      if (hasSelection) {\n        const isFixed = columns.some((col) => col.fixed === 'left' || col.fixed === true);\n        columns.unshift({\n          width: 60,\n          title: 'selection',\n          key: 'selectionKey',\n          align: 'center',\n          ...(isFixed ? { fixed: 'left' } : {}),\n          customSummaryRender: ({ record }) => (hasIndexCol ? '' : record[SUMMARY_ROW_KEY]),\n        });\n      }\n\n      if (props.hasExpandedRow) {\n        const isFixed = columns.some((col) => col.fixed === 'left');\n        columns.unshift({\n          width: 50,\n          title: 'expandedRow',\n          key: 'expandedRowKey',\n          align: 'center',\n          ...(isFixed ? { fixed: 'left' } : {}),\n          customSummaryRender: () => '',\n        });\n      }\n      return columns;\n    });\n\n    function isRenderCell(data: any) {\n      return data && typeof data === 'object' && !Array.isArray(data) && !isVNode(data);\n    }\n\n    const getValues = (row: Recordable, col: BasicColumn, index: number) => {\n      const value = row[col.dataIndex as string];\n      let childNode: VNode | JSX.Element | string | number | undefined | null;\n      childNode = value;\n      if (col.customSummaryRender) {\n        const renderData = col.customSummaryRender({\n          text: value,\n          value,\n          record: row,\n          index,\n          column: cloneDeep(col),\n        });\n        if (isRenderCell(renderData)) {\n          childNode = renderData.children;\n        } else {\n          childNode = renderData;\n        }\n        if (typeof childNode === 'object' && !Array.isArray(childNode) && !isVNode(childNode)) {\n          childNode = null;\n        }\n        if (Array.isArray(childNode) && childNode.length === 1) {\n          childNode = childNode[0];\n        }\n        return childNode;\n      }\n      return childNode;\n    };\n\n    const getCellProps = (col: BasicColumn) => {\n      const cellProps = pick(col, ['colSpan', 'rowSpan', 'align']);\n      return {\n        ...cellProps,\n      };\n    };\n\n    return () => {\n      return (\n        <TableSummary fixed>\n          {(unref(getDataSource) || []).map((row) => {\n            return (\n              <TableSummaryRow key={row[props.rowKey]}>\n                {unref(getColumns).map((col, index) => {\n                  return (\n                    <TableSummaryCell {...getCellProps(col)} index={index} key={`${row[props.rowKey]}_${col.dataIndex}_${index}`}>\n                      {getValues(row, col, index)}\n                    </TableSummaryCell>\n                  );\n                })}\n              </TableSummaryRow>\n            );\n          })}\n        </TableSummary>\n      );\n    };\n  },\n});\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/components/TableTitle.vue",
    "content": "<template>\n  <BasicTitle :class=\"prefixCls\" v-if=\"getTitle\" :helpMessage=\"helpMessage\">\n    {{ getTitle }}\n  </BasicTitle>\n</template>\n<script lang=\"ts\">\n  import { computed, defineComponent, PropType } from 'vue';\n  import { BasicTitle } from '/@/components/Basic/index';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { isFunction } from '/@/utils/is';\n\n  export default defineComponent({\n    name: 'BasicTableTitle',\n    components: { BasicTitle },\n    props: {\n      title: {\n        type: [Function, String] as PropType<string | ((data: Recordable) => string)>,\n      },\n      getSelectRows: {\n        type: Function as PropType<() => Recordable[]>,\n      },\n      helpMessage: {\n        type: [String, Array] as PropType<string | string[]>,\n      },\n    },\n    setup(props) {\n      const { prefixCls } = useDesign('basic-table-title');\n\n      const getTitle = computed(() => {\n        const { title, getSelectRows = () => {} } = props;\n        let tit = title;\n\n        if (isFunction(title)) {\n          tit = title({\n            selectRows: getSelectRows(),\n          });\n        }\n        return tit;\n      });\n\n      return { getTitle, prefixCls };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-basic-table-title';\n\n  .@{prefix-cls} {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/components/editable/CellComponent.ts",
    "content": "import type { FunctionalComponent, defineComponent } from 'vue';\nimport type { ComponentType } from '../../types/componentType';\nimport { componentMap } from '/@/components/Table/src/componentMap';\n\nimport { Popover } from 'ant-design-vue';\nimport { h } from 'vue';\n\nexport interface ComponentProps {\n  component: ComponentType;\n  rule: boolean;\n  popoverVisible: boolean;\n  ruleMessage: string;\n  getPopupContainer?: Fn;\n}\n\nexport const CellComponent: FunctionalComponent = (\n  { component = 'Input', rule = true, ruleMessage, popoverVisible, getPopupContainer }: ComponentProps,\n  { attrs }\n) => {\n  const Comp = componentMap.get(component) as typeof defineComponent;\n\n  const DefaultComp = h(Comp, attrs);\n  if (!rule) {\n    return DefaultComp;\n  }\n  return h(\n    Popover,\n    {\n      overlayClassName: 'edit-cell-rule-popover',\n      open: !!popoverVisible,\n      ...(getPopupContainer ? { getPopupContainer } : {}),\n    },\n    {\n      default: () => DefaultComp,\n      content: () => ruleMessage,\n    }\n  );\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/components/editable/EditableCell.vue",
    "content": "<template>\n  <div :class=\"prefixCls\">\n    <div v-show=\"!isEdit\" :class=\"{ [`${prefixCls}__normal`]: true, 'ellipsis-cell': column.ellipsis }\" @click=\"handleEdit\">\n      <div class=\"cell-content\" :title=\"column.ellipsis ? getValues ?? '' : ''\">\n        {{ typeof getValues === 'string' && getValues.length === 0 ? '&nbsp;' : getValues ?? '&nbsp;' }}\n      </div>\n      <FormOutlined :class=\"`${prefixCls}__normal-icon`\" v-if=\"!column.editRow\" />\n    </div>\n\n    <a-spin v-if=\"isEdit\" :spinning=\"spinning\">\n      <div :class=\"`${prefixCls}__wrapper`\" v-click-outside=\"onClickOutside\">\n        <CellComponent\n          v-bind=\"getComponentProps\"\n          :component=\"getComponent\"\n          :style=\"getWrapperStyle\"\n          :popoverVisible=\"getRuleVisible\"\n          :rule=\"getRule\"\n          :ruleMessage=\"ruleMessage\"\n          :class=\"getWrapperClass\"\n          ref=\"elRef\"\n          @change=\"handleChange\"\n          @options-change=\"handleOptionsChange\"\n          @pressEnter=\"handleEnter\"\n        />\n        <div :class=\"`${prefixCls}__action`\" v-if=\"!getRowEditable\">\n          <CheckOutlined :class=\"[`${prefixCls}__icon`, 'mx-2']\" @click=\"handleSubmitClick\" />\n          <CloseOutlined :class=\"`${prefixCls}__icon `\" @click=\"handleCancel\" />\n        </div>\n      </div>\n    </a-spin>\n  </div>\n</template>\n<script lang=\"ts\">\n  import type { CSSProperties, PropType } from 'vue';\n  import { computed, defineComponent, nextTick, ref, toRaw, unref, watchEffect } from 'vue';\n  import type { BasicColumn } from '../../types/table';\n  import type { EditRecordRow } from './index';\n  import { CheckOutlined, CloseOutlined, FormOutlined } from '@ant-design/icons-vue';\n  import { CellComponent } from './CellComponent';\n\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useTableContext } from '../../hooks/useTableContext';\n\n  import clickOutside from '/@/directives/clickOutside';\n\n  import { propTypes } from '/@/utils/propTypes';\n  import { isArray, isBoolean, isFunction, isNumber, isString } from '/@/utils/is';\n  import { createPlaceholderMessage } from './helper';\n  import { omit, set } from 'lodash-es';\n  import { treeToList } from '/@/utils/helper/treeHelper';\n  import { Spin } from 'ant-design-vue';\n\n  // 这些字段是表格内部使用的，不应该传递给 beforeEditSubmit\n  const INTERNAL_RECORD_FIELDS = [\n    'editable',\n    'submitCbs',\n    'validCbs',\n    'cancelCbs',\n    'onEdit',\n    'onValid',\n    'onCancelEdit',\n    'onSubmitEdit',\n    'editValueRefs',\n  ];\n\n  export default defineComponent({\n    name: 'EditableCell',\n    components: { FormOutlined, CloseOutlined, CheckOutlined, CellComponent, ASpin: Spin },\n    directives: {\n      clickOutside,\n    },\n    props: {\n      value: {\n        type: [String, Number, Boolean, Object] as PropType<string | number | boolean | Recordable>,\n        default: '',\n      },\n      record: {\n        type: Object as PropType<EditRecordRow>,\n      },\n      column: {\n        type: Object as PropType<BasicColumn>,\n        default: () => ({}),\n      },\n      index: propTypes.number,\n    },\n    setup(props) {\n      const table = useTableContext();\n      const isEdit = ref(false);\n      const elRef = ref();\n      const ruleVisible = ref(false);\n      const ruleMessage = ref('');\n      const optionsRef = ref<LabelValueOptions>([]);\n      const currentValueRef = ref<any>(props.value);\n      const defaultValueRef = ref<any>(props.value);\n      const spinning = ref<boolean>(false);\n\n      const { prefixCls } = useDesign('editable-cell');\n\n      const getComponent = computed(() => props.column?.editComponent || 'Input');\n      const getRule = computed(() => props.column?.editRule);\n\n      const getRuleVisible = computed(() => {\n        return unref(ruleMessage) && unref(ruleVisible);\n      });\n\n      const getIsCheckComp = computed(() => {\n        const component = unref(getComponent);\n        return ['Checkbox', 'Switch'].includes(component);\n      });\n\n      const getComponentProps = computed(() => {\n        let compProps;\n        // 代码逻辑说明: 【issues/8680】editComponentProps可接受一个函数传入record\n        if (isFunction(props.column?.editComponentProps)) {\n          compProps = props.column?.editComponentProps(props.record);\n        } else {\n          compProps = props.column?.editComponentProps ?? {};\n        }\n        const component = unref(getComponent);\n        const apiSelectProps: Recordable = {};\n        if (component === 'ApiSelect') {\n          apiSelectProps.cache = true;\n        }\n\n        const isCheckValue = unref(getIsCheckComp);\n\n        const valueField = isCheckValue ? 'checked' : 'value';\n        const val = unref(currentValueRef);\n\n        const value = isCheckValue ? (isNumber(val) && isBoolean(val) ? val : !!val) : val;\n        // 代码逻辑说明: 【issues/7136】单元格上的tooltip提示，如果表格有滚动条，会不跟着单元格滚动---\n        let tooltipPosition:any = unref(table?.wrapRef.value)?.parentElement?.querySelector('.ant-table-body');\n        if(tooltipPosition){\n          tooltipPosition.style.position = 'relative';\n        }\n        return {\n          size: 'small',\n          getPopupContainer: () => tooltipPosition ?? document.body,\n          getCalendarContainer: () => unref(table?.wrapRef.value) ?? document.body,\n          placeholder: createPlaceholderMessage(unref(getComponent)),\n          ...apiSelectProps,\n          ...omit(compProps, 'onChange'),\n          [valueField]: value,\n        };\n      });\n\n      const getValues = computed(() => {\n        const { editComponentProps, editValueMap } = props.column;\n\n        const value = unref(currentValueRef);\n\n        if (editValueMap && isFunction(editValueMap)) {\n          return editValueMap(value);\n        }\n\n        const component = unref(getComponent);\n        if (!component.includes('Select')) {\n          return value;\n        }\n\n        const options: LabelValueOptions = editComponentProps?.options ?? (unref(optionsRef) || []);\n        const option = options.find((item) => `${item.value}` === `${value}`);\n        // 代码逻辑说明: 【QQYUN-13251】表格可编辑单元格apiSelect多选不翻译 ---\n        if (['tags', 'multiple'].includes(editComponentProps?.mode)) {\n          const result = options\n            .filter((item) => {\n              let v = value;\n              if (isString(value)) {\n                v = value.split(',');\n              } else if (isNumber(value)) {\n                v = [value];\n              }\n              if (v.includes(item.value)) {\n                return true;\n              }\n            })\n            .map((item) => item.label);\n          if (result.length) {\n            return result.join(',');\n          }\n          return value;\n        }\n        return option?.label ?? value;\n      });\n\n      const getWrapperStyle = computed((): CSSProperties => {\n        if (unref(getIsCheckComp) || unref(getRowEditable)) {\n          return {};\n        }\n        return {\n          width: 'calc(100% - 48px)',\n        };\n      });\n\n      const getWrapperClass = computed(() => {\n        const { align = 'center' } = props.column;\n        return `edit-cell-align-${align}`;\n      });\n\n      const getRowEditable = computed(() => {\n        const { editable } = props.record || {};\n        return !!editable;\n      });\n\n      watchEffect(() => {\n        defaultValueRef.value = props.value;\n        currentValueRef.value = props.value;\n      });\n\n      watchEffect(() => {\n        const { editable } = props.column;\n        if (isBoolean(editable) || isBoolean(unref(getRowEditable))) {\n          isEdit.value = !!editable || unref(getRowEditable);\n        }\n      });\n\n      function handleEdit() {\n        if (unref(getRowEditable) || unref(props.column?.editRow)) return;\n        ruleMessage.value = '';\n        isEdit.value = true;\n        nextTick(() => {\n          const el = unref(elRef);\n          el?.focus?.();\n        });\n      }\n\n      async function handleChange(e: any) {\n        const component = unref(getComponent);\n        if (!e) {\n          currentValueRef.value = e;\n        } else if (e?.target && Reflect.has(e.target, 'value')) {\n          currentValueRef.value = (e as ChangeEvent).target.value;\n        } else if (component === 'Checkbox') {\n          currentValueRef.value = (e as ChangeEvent).target.checked;\n        } else if (isString(e) || isBoolean(e) || isNumber(e) || isArray(e)) {\n          currentValueRef.value = e;\n        }\n        const onChange = props.column?.editComponentProps?.onChange;\n        if (onChange && isFunction(onChange)) onChange(...arguments);\n\n        table.emit?.('edit-change', {\n          column: props.column,\n          value: unref(currentValueRef),\n          record: toRaw(props.record),\n        });\n        handleSubmiRule();\n      }\n\n      async function handleSubmiRule() {\n        const { column, record } = props;\n        const { editRule } = column;\n        const currentValue = unref(currentValueRef);\n\n        if (editRule) {\n          if (isBoolean(editRule) && !currentValue && !isNumber(currentValue)) {\n            ruleVisible.value = true;\n            const component = unref(getComponent);\n            ruleMessage.value = createPlaceholderMessage(component);\n            return false;\n          }\n          if (isFunction(editRule)) {\n            const res = await editRule(currentValue, record as Recordable);\n            if (!!res) {\n              ruleMessage.value = res;\n              ruleVisible.value = true;\n              return false;\n            } else {\n              ruleMessage.value = '';\n              return true;\n            }\n          }\n        }\n        ruleMessage.value = '';\n        return true;\n      }\n\n      async function handleSubmit(needEmit = true, valid = true) {\n        if (valid) {\n          const isPass = await handleSubmiRule();\n          if (!isPass) return false;\n        }\n\n        const { column, index, record } = props;\n        if (!record) return false;\n        const { key, dataIndex } = column;\n        const value = unref(currentValueRef);\n        if (!key || !dataIndex) return;\n\n        const dataKey = (dataIndex || key) as string;\n\n        if (!record.editable) {\n          const { getBindValues } = table;\n\n          const { beforeEditSubmit } = unref(getBindValues);\n\n          if (beforeEditSubmit && isFunction(beforeEditSubmit)) {\n            spinning.value = true;\n            let result: any = true;\n            try {\n              // 过滤掉内部字段，只保留业务数据字段，确保 id 等关键字段不丢失\n              const cleanRecord = omit(record, INTERNAL_RECORD_FIELDS);\n              result = await beforeEditSubmit({\n                record: cleanRecord,\n                index,\n                key,\n                value,\n              });\n            } catch (e) {\n              result = false;\n            } finally {\n              spinning.value = false;\n            }\n            if (result === false) {\n              return;\n            }\n          }\n        }\n\n        set(record, dataKey, value);\n        //const record = await table.updateTableData(index, dataKey, value);\n        needEmit && table.emit?.('edit-end', { record, index, key, value });\n        isEdit.value = false;\n      }\n\n      async function handleEnter() {\n        if (props.column?.editRow) {\n          return;\n        }\n        handleSubmit();\n      }\n\n      function handleSubmitClick() {\n        handleSubmit();\n      }\n\n      function handleCancel() {\n        isEdit.value = false;\n        currentValueRef.value = defaultValueRef.value;\n        const { column, index, record } = props;\n        const { key, dataIndex } = column;\n        table.emit?.('edit-cancel', {\n          record,\n          index,\n          key: dataIndex || key,\n          value: unref(currentValueRef),\n        });\n      }\n\n      function onClickOutside() {\n        if (props.column?.editable || unref(getRowEditable)) {\n          return;\n        }\n        const component = unref(getComponent);\n\n        if (component.includes('Input')) {\n          handleCancel();\n        }\n      }\n\n      // only ApiSelect or TreeSelect\n      function handleOptionsChange(options: LabelValueOptions) {\n        const { replaceFields } = props.column?.editComponentProps ?? {};\n        const component = unref(getComponent);\n        if (component === 'ApiTreeSelect') {\n          const { title = 'title', value = 'value', children = 'children' } = replaceFields || {};\n          let listOptions: Recordable[] = treeToList(options, { children });\n          listOptions = listOptions.map((item) => {\n            return {\n              label: item[title],\n              value: item[value],\n            };\n          });\n          optionsRef.value = listOptions as LabelValueOptions;\n        } else {\n          optionsRef.value = options;\n        }\n      }\n\n      function initCbs(cbs: 'submitCbs' | 'validCbs' | 'cancelCbs', handle: Fn) {\n        if (props.record) {\n          /* eslint-disable  */\n          // 代码逻辑说明: 【issues/1165】解决canResize为true时第一行校验不过\n          const { dataIndex, key } = props.column;\n          const field: any = dataIndex || key;\n          if (isArray(props.record[cbs])) {\n            const findItem = props.record[cbs]?.find((item) => item[field]);\n            if (findItem) {\n              findItem[field] = handle;\n            } else {\n              props.record[cbs]?.push({ [field]: handle });\n            }\n          } else {\n            props.record[cbs] = [{ [field]: handle }];\n          }\n        }\n      }\n\n      if (props.record) {\n        initCbs('submitCbs', handleSubmit);\n        initCbs('validCbs', handleSubmiRule);\n        initCbs('cancelCbs', handleCancel);\n\n        if (props.column.dataIndex) {\n          if (!props.record.editValueRefs) props.record.editValueRefs = {};\n          props.record.editValueRefs[props.column.dataIndex] = currentValueRef;\n        }\n        /* eslint-disable  */\n        props.record.onCancelEdit = () => {\n          // 代码逻辑说明: 【issues/1165】解决canResize为true时第一行校验不过\n          isArray(props.record?.cancelCbs) &&\n            props.record?.cancelCbs.forEach((item) => {\n              const [fn] = Object.values(item);\n              fn();\n            });\n        };\n        /* eslint-disable */\n        props.record.onSubmitEdit = async () => {\n          if (isArray(props.record?.submitCbs)) {\n            if (!props.record?.onValid?.()) return;\n            const submitFns = props.record?.submitCbs || [];\n            // 代码逻辑说明: 【issues/1165】解决canResize为true时第一行校验不过\n            submitFns.forEach((item) => {\n              const [fn] = Object.values(item);\n              fn(false, false);\n            });\n            table.emit?.('edit-row-end');\n            return true;\n          }\n        };\n      }\n\n      return {\n        isEdit,\n        prefixCls,\n        handleEdit,\n        currentValueRef,\n        handleSubmit,\n        handleChange,\n        handleCancel,\n        elRef,\n        getComponent,\n        getRule,\n        onClickOutside,\n        ruleMessage,\n        getRuleVisible,\n        getComponentProps,\n        handleOptionsChange,\n        getWrapperStyle,\n        getWrapperClass,\n        getRowEditable,\n        getValues,\n        handleEnter,\n        handleSubmitClick,\n        spinning,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-editable-cell';\n\n  .edit-cell-align-left {\n    text-align: left;\n\n    input:not(.ant-calendar-picker-input, .ant-time-picker-input) {\n      text-align: left;\n    }\n  }\n\n  .edit-cell-align-center {\n    text-align: center;\n\n    input:not(.ant-calendar-picker-input, .ant-time-picker-input) {\n      text-align: center;\n    }\n  }\n\n  .edit-cell-align-right {\n    text-align: right;\n\n    input:not(.ant-calendar-picker-input, .ant-time-picker-input) {\n      text-align: right;\n    }\n  }\n\n  .edit-cell-rule-popover {\n    .ant-popover-inner-content {\n      padding: 4px 8px;\n      color: @error-color;\n      // border: 1px solid @error-color;\n      border-radius: 2px;\n    }\n  }\n  .@{prefix-cls} {\n    position: relative;\n\n    &__wrapper {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n\n      > .ant-select {\n        min-width: calc(100% - 50px);\n      }\n    }\n\n    &__icon {\n      &:hover {\n        transform: scale(1.2);\n\n        svg {\n          color: @primary-color;\n        }\n      }\n    }\n\n    .ellipsis-cell {\n      .cell-content {\n        overflow-wrap: break-word;\n        word-break: break-word;\n        overflow: hidden;\n        white-space: nowrap;\n        text-overflow: ellipsis;\n      }\n    }\n\n    &__normal {\n      &-icon {\n        position: absolute;\n        top: 4px;\n        right: 0;\n        display: none;\n        width: 20px;\n        cursor: pointer;\n      }\n    }\n\n    &:hover {\n      .@{prefix-cls}__normal-icon {\n        display: inline-block;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/components/editable/helper.ts",
    "content": "import { ComponentType } from '../../types/componentType';\nimport { useI18n } from '/@/hooks/web/useI18n';\n\nconst { t } = useI18n();\n\n/**\n * @description: 生成placeholder\n */\nexport function createPlaceholderMessage(component: ComponentType) {\n  if (component.includes('Input')) {\n    return t('common.inputText');\n  }\n  if (component.includes('Picker')) {\n    return t('common.chooseText');\n  }\n\n  if (\n    component.includes('Select') ||\n    component.includes('Checkbox') ||\n    component.includes('Radio') ||\n    component.includes('Switch') ||\n    component.includes('DatePicker') ||\n    component.includes('TimePicker')\n  ) {\n    return t('common.chooseText');\n  }\n  return '';\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/components/editable/index.ts",
    "content": "import type { BasicColumn } from '/@/components/Table/src/types/table';\n\nimport { h, Ref, toRaw } from 'vue';\n\nimport EditableCell from './EditableCell.vue';\nimport { isArray } from '/@/utils/is';\n\ninterface Params {\n  text: string;\n  record: Recordable;\n  index: number;\n}\n\nexport function renderEditCell(column: BasicColumn) {\n  return ({ text: value, record, index }: Params) => {\n    toRaw(record).onValid = async () => {\n      if (isArray(record?.validCbs)) {\n        // 代码逻辑说明: 【issues/1165】解决canResize为true时第一行校验不过\n        const validFns = (record?.validCbs || []).map((item) => {\n          const [fn] = Object.values(item);\n          // @ts-ignore\n          return fn();\n        });\n        const res = await Promise.all(validFns);\n        return res.every((item) => !!item);\n      } else {\n        return false;\n      }\n    };\n\n    toRaw(record).onEdit = async (edit: boolean, submit = false) => {\n      if (!submit) {\n        record.editable = edit;\n      }\n\n      if (!edit && submit) {\n        if (!(await record.onValid())) return false;\n        const res = await record.onSubmitEdit?.();\n        if (res) {\n          record.editable = false;\n          return true;\n        }\n        return false;\n      }\n      // cancel\n      if (!edit && !submit) {\n        record.onCancelEdit?.();\n      }\n      return true;\n    };\n\n    return h(EditableCell, {\n      value,\n      record,\n      column,\n      index,\n    });\n  };\n}\n\ninterface Cbs {\n  [key: string]: Fn;\n}\n\nexport type EditRecordRow<T = Recordable> = Partial<\n  {\n    onEdit: (editable: boolean, submit?: boolean) => Promise<boolean>;\n    onValid: () => Promise<boolean>;\n    editable: boolean;\n    onCancel: Fn;\n    onSubmit: Fn;\n    submitCbs: Cbs[];\n    cancelCbs: Cbs[];\n    validCbs: Cbs[];\n    editValueRefs: Recordable<Ref>;\n  } & T\n>;\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/components/settings/ColumnSetting.vue",
    "content": "<template>\n  <Tooltip placement=\"top\" v-bind=\"getBindProps\" >\n    <template #title>\n      <span>{{ t('component.table.settingColumn') }}</span>\n    </template>\n    <Popover\n      v-model:open=\"popoverVisible\"\n      placement=\"bottomLeft\"\n      trigger=\"click\"\n      @open-change=\"handleVisibleChange\"\n      :overlayClassName=\"`${prefixCls}__cloumn-list`\"\n      :getPopupContainer=\"getPopupContainer\"\n    >\n      <template #title>\n        <div :class=\"`${prefixCls}__popover-title`\">\n          <Checkbox :indeterminate=\"indeterminate\" v-model:checked=\"checkAll\" @change=\"onCheckAllChange\">\n            {{ t('component.table.settingColumnShow') }}\n          </Checkbox>\n\n          <Checkbox :disabled=\"isTreeTable\" v-model:checked=\"checkIndex\" @change=\"handleIndexCheckChange\">\n            {{ t('component.table.settingIndexColumnShow') }}\n          </Checkbox>\n\n          <!--                    <Checkbox-->\n          <!--                            v-model:checked=\"checkSelect\"-->\n          <!--                            @change=\"handleSelectCheckChange\"-->\n          <!--                            :disabled=\"!defaultRowSelection\"-->\n          <!--                    >-->\n          <!--                        {{ t('component.table.settingSelectColumnShow') }}-->\n          <!--                    </Checkbox>-->\n        </div>\n      </template>\n\n      <template #content>\n        <ScrollContainer>\n          <CheckboxGroup v-model:value=\"checkedList\" @change=\"onChange\" ref=\"columnListRef\">\n            <template v-for=\"item in plainOptions\" :key=\"item.value\">\n              <div :class=\"`${prefixCls}__check-item`\" v-if=\"!('ifShow' in item && !item.ifShow)\">\n                <DragOutlined class=\"table-column-drag-icon\" />\n                <Checkbox :value=\"item.value\">\n                  {{ item.label }}\n                </Checkbox>\n\n                <Tooltip placement=\"bottomLeft\" :mouseLeaveDelay=\"0.4\" :getPopupContainer=\"getPopupContainer\">\n                  <template #title>\n                    {{ t('component.table.settingFixedLeft') }}\n                  </template>\n                  <Icon\n                    icon=\"line-md:arrow-align-left\"\n                    :class=\"[\n                      `${prefixCls}__fixed-left`,\n                      {\n                        active: item.fixed === 'left',\n                        disabled: !checkedList.includes(item.value),\n                      },\n                    ]\"\n                    @click=\"handleColumnFixed(item, 'left')\"\n                  />\n                </Tooltip>\n                <Divider type=\"vertical\" />\n                <Tooltip placement=\"bottomLeft\" :mouseLeaveDelay=\"0.4\" :getPopupContainer=\"getPopupContainer\">\n                  <template #title>\n                    {{ t('component.table.settingFixedRight') }}\n                  </template>\n                  <Icon\n                    icon=\"line-md:arrow-align-left\"\n                    :class=\"[\n                      `${prefixCls}__fixed-right`,\n                      {\n                        active: item.fixed === 'right',\n                        disabled: !checkedList.includes(item.value),\n                      },\n                    ]\"\n                    @click=\"handleColumnFixed(item, 'right')\"\n                  />\n                </Tooltip>\n              </div>\n            </template>\n          </CheckboxGroup>\n        </ScrollContainer>\n        <div :class=\"`${prefixCls}__popover-footer`\">\n          <a-button size=\"small\" @click=\"reset\">\n            {{ t('common.resetText') }}\n          </a-button>\n          <a-button size=\"small\" type=\"primary\" @click=\"saveSetting\"> 保存 </a-button>\n        </div>\n      </template>\n      <SettingOutlined />\n    </Popover>\n  </Tooltip>\n</template>\n<script lang=\"ts\">\n  import type { BasicColumn, ColumnChangeParam } from '../../types/table';\n  import { defineComponent, ref, reactive, toRefs, watchEffect, nextTick, unref, computed, watch } from 'vue';\n  import { Tooltip, Popover, Checkbox, Divider } from 'ant-design-vue';\n  import type { CheckboxChangeEvent } from 'ant-design-vue/lib/checkbox/interface';\n  import { SettingOutlined, DragOutlined } from '@ant-design/icons-vue';\n  import { Icon } from '/@/components/Icon';\n  import { ScrollContainer } from '/@/components/Container';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useTableContext } from '../../hooks/useTableContext';\n  import { useColumnsCache } from '../../hooks/useColumnsCache';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  // import { useSortable } from '/@/hooks/web/useSortable';\n  import { isFunction, isNullAndUnDef } from '/@/utils/is';\n  import { getPopupContainer as getParentContainer } from '/@/utils';\n  import { cloneDeep, omit } from 'lodash-es';\n  import Sortablejs from 'sortablejs';\n  import type Sortable from 'sortablejs';\n  import { useLocaleStoreWithOut } from '/@/store/modules/locale';\n\n  interface State {\n    checkAll: boolean;\n    isInit?: boolean;\n    checkedList: string[];\n    defaultCheckList: string[];\n  }\n\n  interface Options {\n    label: string;\n    value: string;\n    fixed?: boolean | 'left' | 'right';\n  }\n\n  export default defineComponent({\n    name: 'ColumnSetting',\n    props: {\n      isMobile: Boolean,\n    },\n    components: {\n      SettingOutlined,\n      Popover,\n      Tooltip,\n      Checkbox,\n      CheckboxGroup: Checkbox.Group,\n      DragOutlined,\n      ScrollContainer,\n      Divider,\n      Icon,\n    },\n    emits: ['columns-change'],\n\n    setup(props, { emit, attrs }) {\n      const { t } = useI18n();\n      const table = useTableContext();\n      // 代码逻辑说明: 【issues/8301】树形表格序号列禁用\n      const isTreeTable = computed(() => table.getBindValues.value.isTreeTable);\n      const popoverVisible = ref(false);\n      // nextTick(() => popoverVisible.value = false);\n      const defaultRowSelection = omit(table.getRowSelection(), 'selectedRowKeys');\n      // 代码逻辑说明: 【issues/8529】setColumns后列配置没联动更新\n      const getColumnsRef = table.getColumnsRef();\n      let inited = false;\n\n      const cachePlainOptions = ref<Options[]>([]);\n      const plainOptions = ref<Options[] | any>([]);\n\n      const plainSortOptions = ref<Options[]>([]);\n\n      const columnListRef = ref<ComponentRef>(null);\n\n      const restAfterOptions = {\n        value: null,\n      };\n\n      const state = reactive<State>({\n        checkAll: true,\n        checkedList: [],\n        defaultCheckList: [],\n      });\n\n      const checkIndex = ref(false);\n      const checkSelect = ref(false);\n\n      const { prefixCls } = useDesign('basic-column-setting');\n\n      const getValues = computed(() => {\n        return unref(table?.getBindValues) || {};\n      });\n\n      const getBindProps = computed(() => {\n        let obj = {};\n        if (props.isMobile) {\n          obj['open'] = false;\n        }\n        return obj;\n      });\n\n      let sortable: Sortable;\n      const sortableOrder = ref<string[]>();\n      const localeStore = useLocaleStoreWithOut();\n      // 列表字段配置缓存\n      const { saveSetting, resetSetting, getCache } = useColumnsCache(\n        {\n          state,\n          popoverVisible,\n          plainOptions,\n          plainSortOptions,\n          sortableOrder,\n          checkIndex,\n          restAfterOptions,\n        },\n        setColumns,\n        handleColumnFixed\n      );\n\n      watchEffect(() => {\n        setTimeout(() => {\n          if (!state.isInit) {\n            init();\n          }\n        }, 0);\n      });\n\n      watchEffect(() => {\n        const values = unref(getValues);\n        checkIndex.value = !!values.showIndexColumn;\n        checkSelect.value = !!values.rowSelection;\n      });\n      // 代码逻辑说明: 【issues/6908】多语言无刷新切换时，BasicColumn和FormSchema里面的值不能正常切换\n      watch([localeStore], () => {\n        const columns = getColumns();\n        plainOptions.value = columns;\n        plainSortOptions.value = columns;\n        cachePlainOptions.value = columns;\n      });\n      // 代码逻辑说明: 【issues/8529】setColumns将原本隐藏的列展示后，列配置里却没有勾选该列\n      watch([getColumnsRef], () => {\n        init();\n      });\n      function getColumns() {\n        const ret: Options[] = [];\n        // 代码逻辑说明: 【issues/7996】表格列组件取消所有或者只勾选中间，显示非预期\n        let t = table.getColumns({ ignoreIndex: true, ignoreAction: true, ignoreAuth: true, ignoreIfShow: true });\n        if (!t.length) {\n          t = table.getCacheColumns();\n        }\n        t.forEach((item) => {\n          ret.push({\n            label: (item.title as string) || (item.customTitle as string),\n            value: (item.dataIndex || item.title) as string,\n            ...item,\n          });\n        });\n        return ret;\n      }\n\n      async function init() {\n        const columns = getColumns();\n\n        const checkList = table\n          .getColumns({ ignoreAction: true, ignoreIndex: true, ignoreAuth: true, ignoreIfShow: true })\n          .map((item) => {\n            if (item.defaultHidden) {\n              return '';\n            }\n            return item.dataIndex || item.title;\n          })\n          .filter(Boolean) as string[];\n        // 代码逻辑说明: 【issues/7996】表格列组件取消所有或者只勾选中间，显示非预期\n        const { sortedList = [] } = getCache() || {};\n        await nextTick();\n        if (!plainOptions.value.length) {\n          let tmp = columns;\n          if (sortedList?.length) {\n            tmp = columns.sort((prev, next) => {\n              return sortedList.indexOf(prev.value) - sortedList.indexOf(next.value);\n            });\n          }\n          plainOptions.value = tmp;\n          plainSortOptions.value = tmp;\n          cachePlainOptions.value = tmp;\n          state.defaultCheckList = checkList;\n        } else {\n          // const fixedColumns = columns.filter((item) =>\n          //   Reflect.has(item, 'fixed')\n          // ) as BasicColumn[];\n\n          unref(plainOptions).forEach((item: BasicColumn) => {\n            const findItem = columns.find((col: BasicColumn) => col.dataIndex === item.dataIndex);\n            if (findItem) {\n              item.fixed = findItem.fixed;\n            }\n          });\n          // 代码逻辑说明: 【issues/7996】表格列组件取消所有或者只勾选中间，显示非预期\n          if (sortedList?.length) {\n            plainOptions.value.sort((prev, next) => {\n              return sortedList.indexOf(prev.value) - sortedList.indexOf(next.value);\n            });\n          }\n        }\n        state.isInit = true;\n        state.checkedList = checkList;\n        // 代码逻辑说明: 【TV360X-105】列展示设置问题[列展示如果存在未勾选的列，保存并刷新后，列展示复选框样式会错乱]\n        state.checkAll = columns.length === checkList.length;\n      }\n\n      // checkAll change\n      function onCheckAllChange(e: CheckboxChangeEvent) {\n        const checkList = plainOptions.value.map((item) => item.value);\n        if (e.target.checked) {\n          state.checkedList = checkList;\n          setColumns(checkList);\n        } else {\n          state.checkedList = [];\n          setColumns([]);\n        }\n      }\n\n      const indeterminate = computed(() => {\n        const len = plainOptions.value.length;\n        let checkedLen = state.checkedList.length;\n        // unref(checkIndex) && checkedLen--;\n        return checkedLen > 0 && checkedLen < len;\n      });\n\n      // Trigger when check/uncheck a column\n      function onChange(checkedList: string[]) {\n        const len = plainSortOptions.value.length;\n        state.checkAll = checkedList.length === len;\n        const sortList = unref(plainSortOptions).map((item) => item.value);\n        checkedList.sort((prev, next) => {\n          return sortList.indexOf(prev) - sortList.indexOf(next);\n        });\n        setColumns(checkedList);\n      }\n\n      // reset columns\n      function reset() {\n        // 代码逻辑说明: 【TV360X-105】列展示设置问题[需要重置两次才回到初始状态]\n        setColumns(table.getCacheColumns());\n        setTimeout(() => {\n          const columns = getColumns();\n          // state.checkedList = [...state.defaultCheckList];\n          // 代码逻辑说明: 【issues/825】tabel的列设置隐藏列保存后切换路由问题[重置没勾选]\n          state.checkedList = table\n            .getColumns({ ignoreAction: true, ignoreAuth: true, ignoreIfShow: true })\n            .map((item) => {\n              return item.dataIndex || item.title;\n            })\n            .filter(Boolean) as string[];\n          state.checkAll = true;\n          plainOptions.value = unref(cachePlainOptions);\n          plainSortOptions.value = unref(cachePlainOptions);\n          restAfterOptions.value = columns;\n          if (sortableOrder.value) {\n            sortable.sort(sortableOrder.value);\n          }\n          resetSetting();\n        }, 100);\n      }\n\n      // Open the pop-up window for drag and drop initialization\n      function handleVisibleChange() {\n        if (inited) return;\n        // 代码逻辑说明: 【TV360X-254】列设置闪现及苹果浏览器弹窗过长\n        setTimeout(() => {\n          const columnListEl = unref(columnListRef);\n          if (!columnListEl) return;\n          const el = columnListEl.$el as any;\n          if (!el) return;\n          // Drag and drop sort\n          sortable = Sortablejs.create(unref(el), {\n            animation: 500,\n            delay: 400,\n            delayOnTouchOnly: true,\n            handle: '.table-column-drag-icon ',\n            onEnd: (evt) => {\n              const { oldIndex, newIndex } = evt;\n              if (isNullAndUnDef(oldIndex) || isNullAndUnDef(newIndex) || oldIndex === newIndex) {\n                return;\n              }\n              // Sort column\n              const columns = cloneDeep(plainSortOptions.value);\n\n              if (oldIndex > newIndex) {\n                columns.splice(newIndex, 0, columns[oldIndex]);\n                columns.splice(oldIndex + 1, 1);\n              } else {\n                columns.splice(newIndex + 1, 0, columns[oldIndex]);\n                columns.splice(oldIndex, 1);\n              }\n\n              plainSortOptions.value = columns;\n              // 代码逻辑说明: 【TV360X-108】刷新后勾选之前未勾选的字段拖拽之后该字段对应的表格列消失了\n              const cols = columns.map((item) => item.value);\n              const arr = cols.filter((cItem) => state.checkedList.find((lItem) => lItem === cItem));\n              setColumns(arr);\n              // 最开始的代码\n              // setColumns(columns);\n              // 代码逻辑说明: 【TV360X-105】列展示设置问题[重置之后保存的顺序还是上次的]\n              restAfterOptions.value = null;\n            },\n          });\n          // 记录原始 order 序列\n          if (!sortableOrder.value) {\n            sortableOrder.value = sortable.toArray();\n          }\n          inited = true;\n        }, 2000);\n      }\n\n      // Control whether the serial number column is displayed\n      function handleIndexCheckChange(e: CheckboxChangeEvent) {\n        table.setProps({\n          showIndexColumn: e.target.checked,\n        });\n      }\n\n      // Control whether the check box is displayed\n      function handleSelectCheckChange(e: CheckboxChangeEvent) {\n        table.setProps({\n          rowSelection: e.target.checked ? defaultRowSelection : undefined,\n        });\n      }\n\n      function handleColumnFixed(item: BasicColumn, fixed?: 'left' | 'right') {\n        if (!state.checkedList.includes(item.dataIndex as string)) return;\n\n        const columns = getColumns() as BasicColumn[];\n        const isFixed = item.fixed === fixed ? false : fixed;\n        const index = columns.findIndex((col) => col.dataIndex === item.dataIndex);\n        if (index !== -1) {\n          columns[index].fixed = isFixed;\n        }\n        item.fixed = isFixed;\n\n        if (isFixed && !item.width) {\n          item.width = 100;\n        }\n        table.setCacheColumnsByField?.(item.dataIndex as string, { fixed: isFixed });\n        setColumns(columns);\n      }\n\n      function setColumns(columns: BasicColumn[] | string[]) {\n        table.setColumns(columns);\n        const data: ColumnChangeParam[] = unref(plainSortOptions).map((col) => {\n          const visible =\n            columns.findIndex((c: BasicColumn | string) => c === col.value || (typeof c !== 'string' && c.dataIndex === col.value)) !== -1;\n          return { dataIndex: col.value, fixed: col.fixed, visible };\n        });\n\n        emit('columns-change', data);\n      }\n\n      function getPopupContainer() {\n        return isFunction(attrs.getPopupContainer) ? attrs.getPopupContainer() : getParentContainer();\n      }\n\n      return {\n        getBindProps,\n        t,\n        ...toRefs(state),\n        popoverVisible,\n        indeterminate,\n        onCheckAllChange,\n        onChange,\n        plainOptions,\n        reset,\n        saveSetting,\n        prefixCls,\n        columnListRef,\n        handleVisibleChange,\n        checkIndex,\n        checkSelect,\n        handleIndexCheckChange,\n        handleSelectCheckChange,\n        defaultRowSelection,\n        handleColumnFixed,\n        getPopupContainer,\n        isTreeTable,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-basic-column-setting';\n\n  .table-column-drag-icon {\n    margin: 0 5px;\n    cursor: move;\n  }\n\n  .@{prefix-cls} {\n    &__popover-title {\n      position: relative;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n    }\n\n    /* 卡片底部样式 */\n    &__popover-footer {\n      position: relative;\n      top: 7px;\n      text-align: right;\n      padding: 4px 0 0;\n      border-top: 1px solid #f0f0f0;\n\n      .ant-btn {\n        margin-right: 6px;\n      }\n    }\n\n    &__check-item {\n      display: flex;\n      align-items: center;\n      min-width: 100%;\n      padding: 4px 16px 8px 0;\n\n      .ant-checkbox-wrapper {\n        width: 100%;\n\n        &:hover {\n          color: @primary-color;\n        }\n      }\n    }\n\n    &__fixed-left,\n    &__fixed-right {\n      color: rgba(0, 0, 0, 0.45);\n      cursor: pointer;\n\n      &.active,\n      &:hover {\n        color: @primary-color;\n      }\n\n      &.disabled {\n        color: @disabled-color;\n        cursor: not-allowed;\n      }\n    }\n\n    &__fixed-right {\n      transform: rotate(180deg);\n    }\n\n    &__cloumn-list {\n      svg {\n        width: 1em !important;\n        height: 1em !important;\n      }\n\n      .ant-popover-inner-content {\n        // max-height: 360px;\n        padding-right: 0;\n        padding-left: 0;\n        // overflow: auto;\n      }\n\n      .ant-checkbox-group {\n        // width: 100%;\n        min-width: 260px;\n        max-width: min-content;\n        // flex-wrap: wrap;\n      }\n\n      // 代码逻辑说明: 【TV360X-254】列设置闪现及苹果浏览器弹窗过长\n      &.ant-popover,\n      .ant-popover-content,\n      .ant-popover-inner,\n      .ant-popover-inner-content,\n      .scroll-container,\n      .scrollbar__wrap {\n        max-width: min-content;\n      }\n      .scrollbar {\n        height: 220px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/components/settings/FullScreenSetting.vue",
    "content": "<template>\n  <Tooltip placement=\"top\" v-bind=\"getBindProps\">\n    <template #title>\n      <span>{{ t('component.table.settingFullScreen') }}</span>\n    </template>\n    <FullscreenOutlined @click=\"toggle\" v-if=\"!isFullscreen\" />\n    <FullscreenExitOutlined @click=\"toggle\" v-else />\n  </Tooltip>\n</template>\n<script lang=\"ts\">\n  import { computed, defineComponent } from 'vue';\n  import { Tooltip } from 'ant-design-vue';\n  import { FullscreenOutlined, FullscreenExitOutlined } from '@ant-design/icons-vue';\n  import { useFullscreen } from '@vueuse/core';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useTableContext } from '../../hooks/useTableContext';\n\n  export default defineComponent({\n    name: 'FullScreenSetting',\n    props: {\n      isMobile: Boolean,\n    },\n    components: {\n      FullscreenExitOutlined,\n      FullscreenOutlined,\n      Tooltip,\n    },\n\n    setup(props) {\n      const table = useTableContext();\n      const { t } = useI18n();\n      const { toggle, isFullscreen } = useFullscreen(table.wrapRef);\n      const getBindProps = computed(() => {\n        let obj = {};\n        if (props.isMobile) {\n          obj['visible'] = false;\n        }\n        return obj;\n      });\n      return {\n        getBindProps,\n        toggle,\n        isFullscreen,\n        t,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/components/settings/RedoSetting.vue",
    "content": "<template>\n  <Tooltip placement=\"top\" v-bind=\"getBindProps\">\n    <template #title>\n      <span>{{ t('common.redo') }}</span>\n    </template>\n    <RedoOutlined @click=\"redo\" />\n  </Tooltip>\n</template>\n<script lang=\"ts\">\n  import { computed, defineComponent } from 'vue';\n  import { Tooltip } from 'ant-design-vue';\n  import { RedoOutlined } from '@ant-design/icons-vue';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useTableContext } from '../../hooks/useTableContext';\n\n  export default defineComponent({\n    name: 'RedoSetting',\n    props: {\n      isMobile: Boolean,\n    },\n    components: {\n      RedoOutlined,\n      Tooltip,\n    },\n    setup(props) {\n      const table = useTableContext();\n      const { t } = useI18n();\n\n      const getBindProps = computed(() => {\n        let obj = {};\n        if (props.isMobile) {\n          obj['visible'] = false;\n        }\n        return obj;\n      });\n\n      function redo() {\n        table.reload();\n        table.emit!('table-redo');\n      }\n\n      return { getBindProps, redo, t };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/components/settings/SizeSetting.vue",
    "content": "<template>\n  <Tooltip placement=\"top\" v-bind=\"getBindProps\">\n    <template #title>\n      <span>{{ t('component.table.settingDens') }}</span>\n    </template>\n\n    <Dropdown placement=\"bottom\" :trigger=\"['click']\" :getPopupContainer=\"getPopupContainer\">\n      <ColumnHeightOutlined />\n      <template #overlay>\n        <Menu @click=\"handleTitleClick\" selectable v-model:selectedKeys=\"selectedKeysRef\">\n          <MenuItem key=\"large\">\n            <span>{{ t('component.table.settingDensLarge') }}</span>\n          </MenuItem>\n          <MenuItem key=\"middle\">\n            <span>{{ t('component.table.settingDensMiddle') }}</span>\n          </MenuItem>\n          <MenuItem key=\"small\">\n            <span>{{ t('component.table.settingDensSmall') }}</span>\n          </MenuItem>\n        </Menu>\n      </template>\n    </Dropdown>\n  </Tooltip>\n</template>\n<script lang=\"ts\">\n  import type { SizeType } from '../../types/table';\n  import { computed, defineComponent, ref } from 'vue';\n  import { Tooltip, Dropdown, Menu } from 'ant-design-vue';\n  import { ColumnHeightOutlined } from '@ant-design/icons-vue';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useTableContext } from '../../hooks/useTableContext';\n  import { getPopupContainer } from '/@/utils';\n  import { useRoute } from 'vue-router';\n  import { createLocalStorage } from '/@/utils/cache';\n\n  export default defineComponent({\n    name: 'SizeSetting',\n    props: {\n      isMobile: Boolean,\n    },\n    components: {\n      ColumnHeightOutlined,\n      Tooltip,\n      Dropdown,\n      Menu,\n      MenuItem: Menu.Item,\n    },\n    setup(props) {\n      const table = useTableContext();\n      const { t } = useI18n();\n      const $ls = createLocalStorage();\n      const route = useRoute();\n\n      const selectedKeysRef = ref<SizeType[]>([table.getSize()]);\n      const getBindProps = computed(() => {\n        let obj = {};\n        if (props.isMobile) {\n          obj['visible'] = false;\n        }\n        return obj;\n      });\n      function handleTitleClick({ key }: { key: SizeType }) {\n        selectedKeysRef.value = [key];\n        table.setProps({\n          size: key,\n        });\n        // 代码逻辑说明: 【TV360X-100】缓存表格密度\n        $ls.set(cacheKey.value, key);\n      }\n      const cacheKey = computed(() => {\n        const path = route.path;\n        let key = path.replace(/[\\/\\\\]/g, '_');\n        let cacheKey = table.getBindValues.value.tableSetting?.cacheKey;\n        if (cacheKey) {\n          key += ':' + cacheKey;\n        }\n        return 'tableSizeCache:' + key;\n      });\n      const local: SizeType | null = $ls.get(cacheKey.value);\n      if (local) {\n        selectedKeysRef.value = [local];\n        table.setProps({\n          size: local,\n        });\n      }\n\n      return {\n        getBindProps,\n        handleTitleClick,\n        selectedKeysRef,\n        getPopupContainer,\n        t,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/components/settings/index.vue",
    "content": "<template>\n  <div class=\"table-settings\">\n    <RedoSetting v-if=\"getSetting.redo\" :isMobile=\"isMobile\" :getPopupContainer=\"getTableContainer\" />\n    <SizeSetting v-if=\"getSetting.size\" :isMobile=\"isMobile\" :getPopupContainer=\"getTableContainer\" />\n    <ColumnSetting v-if=\"getSetting.setting\" :isMobile=\"isMobile\" @columns-change=\"handleColumnChange\" :getPopupContainer=\"getTableContainer\" />\n    <FullScreenSetting v-if=\"getSetting.fullScreen\" :isMobile=\"isMobile\" :getPopupContainer=\"getTableContainer\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import type { PropType } from 'vue';\n  import type { TableSetting, ColumnChangeParam } from '../../types/table';\n  import { defineComponent, computed, unref } from 'vue';\n  import ColumnSetting from './ColumnSetting.vue';\n  import SizeSetting from './SizeSetting.vue';\n  import RedoSetting from './RedoSetting.vue';\n  import FullScreenSetting from './FullScreenSetting.vue';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useTableContext } from '../../hooks/useTableContext';\n\n  export default defineComponent({\n    name: 'TableSetting',\n    components: {\n      ColumnSetting,\n      SizeSetting,\n      RedoSetting,\n      FullScreenSetting,\n    },\n    props: {\n      setting: {\n        type: Object as PropType<TableSetting>,\n        default: () => ({}),\n      },\n      mode: String,\n    },\n    emits: ['columns-change'],\n    setup(props, { emit }) {\n      const { t } = useI18n();\n      const table = useTableContext();\n\n      const getSetting = computed((): TableSetting => {\n        return {\n          redo: true,\n          size: true,\n          setting: true,\n          fullScreen: false,\n          ...props.setting,\n        };\n      });\n      const isMobile = computed(() => props.mode === 'mobile');\n\n      function handleColumnChange(data: ColumnChangeParam[]) {\n        emit('columns-change', data);\n      }\n\n      function getTableContainer() {\n        return table ? unref(table.wrapRef) : document.body;\n      }\n\n      return { getSetting, t, handleColumnChange, getTableContainer, isMobile };\n    },\n  });\n</script>\n<style lang=\"less\">\n  .table-settings {\n    & > * {\n      margin-right: 12px;\n    }\n\n    svg {\n      width: 1.3em;\n      height: 1.3em;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/const.ts",
    "content": "import componentSetting from '/@/settings/componentSetting';\n\nconst { table } = componentSetting;\n\nconst { pageSizeOptions, defaultPageSize, defaultSize, fetchSetting, defaultSortFn, defaultFilterFn } = table;\n\nexport const ROW_KEY = 'key';\n\n// Optional display number per page;\nexport const PAGE_SIZE_OPTIONS = pageSizeOptions;\n\n// Number of items displayed per page\nexport const PAGE_SIZE = defaultPageSize;\n\n// Common interface field settings\nexport const FETCH_SETTING = fetchSetting;\n\n// Configure general sort function\nexport const DEFAULT_SORT_FN = defaultSortFn;\n\nexport const DEFAULT_FILTER_FN = defaultFilterFn;\n\n//  Default layout of table cells\nexport const DEFAULT_ALIGN = 'center';\n// Default Size\nexport const DEFAULT_SIZE = defaultSize;\n\nexport const INDEX_COLUMN_FLAG = 'INDEX';\n\nexport const ACTION_COLUMN_FLAG = 'ACTION';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/hooks/useColumns.ts",
    "content": "import type { BasicColumn, BasicTableProps, CellFormat, GetColumnsParams } from '../types/table';\nimport type { PaginationProps } from '../types/pagination';\nimport type { ComputedRef } from 'vue';\nimport { Table } from 'ant-design-vue';\nimport { computed, Ref, ref, toRaw, unref, watch, reactive } from 'vue';\nimport { renderEditCell } from '../components/editable';\nimport { usePermission } from '/@/hooks/web/usePermission';\nimport { useI18n } from '/@/hooks/web/useI18n';\nimport { isArray, isBoolean, isFunction, isMap, isString } from '/@/utils/is';\nimport { cloneDeep, isEqual } from 'lodash-es';\nimport { formatToDate } from '/@/utils/dateUtil';\nimport { ACTION_COLUMN_FLAG, DEFAULT_ALIGN, INDEX_COLUMN_FLAG, PAGE_SIZE } from '../const';\nimport { CUS_SEL_COLUMN_KEY } from './useCustomSelection';\n\nfunction handleItem(item: BasicColumn, ellipsis: boolean) {\n  const { key, dataIndex, children } = item;\n  item.align = item.align || DEFAULT_ALIGN;\n  if (ellipsis) {\n    if (!key) {\n      item.key = dataIndex;\n    }\n    if (!isBoolean(item.ellipsis)) {\n      Object.assign(item, {\n        ellipsis,\n      });\n    }\n  }\n  if (children && children.length) {\n    handleChildren(children, !!ellipsis);\n  }\n}\n\nfunction handleChildren(children: BasicColumn[] | undefined, ellipsis: boolean) {\n  if (!children) return;\n  children.forEach((item) => {\n    const { children } = item;\n    handleItem(item, ellipsis);\n    handleChildren(children, ellipsis);\n  });\n}\n\nfunction handleIndexColumn(propsRef: ComputedRef<BasicTableProps>, getPaginationRef: ComputedRef<boolean | PaginationProps>, columns: BasicColumn[]) {\n  const { t } = useI18n();\n\n  const { showIndexColumn, indexColumnProps, isTreeTable } = unref(propsRef);\n\n  let pushIndexColumns = false;\n  if (unref(isTreeTable)) {\n    return;\n  }\n  columns.forEach(() => {\n    const indIndex = columns.findIndex((column) => column.flag === INDEX_COLUMN_FLAG);\n    if (showIndexColumn) {\n      pushIndexColumns = indIndex === -1;\n    } else if (!showIndexColumn && indIndex !== -1) {\n      columns.splice(indIndex, 1);\n    }\n  });\n  // 代码逻辑说明: 【TV360X-105】列展示设置问题[列展示复选框不应该判断序号列复选框的状态]\n  if (columns.length === 0 && showIndexColumn) {\n    const indIndex = columns.findIndex((column) => column.flag === INDEX_COLUMN_FLAG);\n    if (indIndex === -1) {\n      pushIndexColumns = true;\n    }\n  }\n  if (!pushIndexColumns) return;\n\n  const isFixedLeft = columns.some((item) => item.fixed === 'left');\n\n  columns.unshift({\n    flag: INDEX_COLUMN_FLAG,\n    // 代码逻辑说明: 【TV360X-1634】密度是宽松模式时，序号列表头换行了\n    width: propsRef.value.size === 'large' ? 65 : 50,\n    title: t('component.table.index'),\n    align: 'center',\n    customRender: ({ index }) => {\n      const getPagination = unref(getPaginationRef);\n      if (isBoolean(getPagination)) {\n        return `${index + 1}`;\n      }\n      const { current = 1, pageSize = PAGE_SIZE } = getPagination;\n      return ((current < 1 ? 1 : current) - 1) * pageSize + index + 1;\n    },\n    ...(isFixedLeft\n      ? {\n          fixed: 'left',\n        }\n      : {}),\n    ...indexColumnProps,\n  });\n}\n\nfunction handleActionColumn(propsRef: ComputedRef<BasicTableProps>, columns: BasicColumn[]) {\n  const { actionColumn, showActionColumn } = unref(propsRef);\n  if (!actionColumn || !showActionColumn) return;\n\n  const hasIndex = columns.findIndex((column) => column.flag === ACTION_COLUMN_FLAG);\n  if (hasIndex === -1) {\n    columns.push({\n      ...columns[hasIndex],\n      ...actionColumn,\n      flag: ACTION_COLUMN_FLAG,\n    });\n  }\n}\n\nexport function useColumns(\n  propsRef: ComputedRef<BasicTableProps>,\n  getPaginationRef: ComputedRef<boolean | PaginationProps>,\n  handleCustomSelectColumn: Fn\n) {\n  const columnsRef = ref(unref(propsRef).columns) as unknown as Ref<BasicColumn[]>;\n  let cacheColumns = unref(propsRef).columns;\n\n  const getColumnsRef = computed(() => {\n    const columns = cloneDeep(unref(columnsRef));\n    // 代码逻辑说明: 【issues/6908】多语言无刷新切换时，BasicColumn和FormSchema里面的值不能正常切换\n    if (isArray(columns)) {\n      columns.forEach((item) => {\n        item.title = isFunction(item.title) ? item.title() : item.title;\n      });\n    }\n    handleIndexColumn(propsRef, getPaginationRef, columns);\n    handleActionColumn(propsRef, columns);\n    // 代码逻辑说明: 【QQYUN-5571】自封装选择列，解决数据行选择卡顿问题\n    handleCustomSelectColumn(columns);\n\n    if (!columns) {\n      return [];\n    }\n    const { ellipsis } = unref(propsRef);\n\n    columns.forEach((item) => {\n      const { customRender, slots } = item;\n\n      handleItem(item, Reflect.has(item, 'ellipsis') ? !!item.ellipsis : !!ellipsis && !customRender && !slots);\n    });\n    return columns;\n  });\n\n  function isIfShow(column: BasicColumn): boolean {\n    const ifShow = column.ifShow;\n\n    let isIfShow = true;\n\n    if (isBoolean(ifShow)) {\n      isIfShow = ifShow;\n    }\n    if (isFunction(ifShow)) {\n      isIfShow = ifShow(column);\n    }\n    return isIfShow;\n  }\n  const { hasPermission } = usePermission();\n\n  const getViewColumns = computed(() => {\n    const viewColumns = sortFixedColumn(unref(getColumnsRef));\n\n    const columns = cloneDeep(viewColumns);\n    const formatEditColumn = (columns) => {\n      return columns.map((column) => {\n        // 代码逻辑说明: 【issues-179】antd3 一些警告以及报错(针对表格)\n        if(column.slots?.customRender) {\n          // slots的备份，兼容老的写法，转成新写法避免控制台警告\n          column.slotsBak = column.slots;\n          delete column.slots;\n        }\n\n        const { slots, customRender, format, edit, editRow, flag, title: metaTitle } = column;\n\n        if (!slots || !slots?.title) {\n          // column.slots = { title: `header-${dataIndex}`, ...(slots || {}) };\n          column.customTitle = column.title as string;\n          Reflect.deleteProperty(column, 'title');\n        }\n        // 代码逻辑说明: 【online报表】分组标题显示错误，都显示成了联系信息 LOWCOD-2343\n        if (column.children) {\n          column.title = metaTitle;\n        }\n\n        const isDefaultAction = [INDEX_COLUMN_FLAG, ACTION_COLUMN_FLAG].includes(flag!);\n        if (!customRender && format && !edit && !isDefaultAction) {\n          column.customRender = ({ text, record, index }) => {\n            return formatCell(text, format, record, index);\n          };\n        }\n\n        // edit table\n        if ((edit || editRow) && !isDefaultAction) {\n          column.customRender = renderEditCell(column);\n        }\n        // 代码逻辑说明: 【pull/7333】修复分组表头可编辑表格失效问题\n        if (column.children?.length) {\n          formatEditColumn(column.children.filter((item) => hasPermission(column.auth) && isIfShow(column)));\n        }\n        return reactive(column);\n      });\n    };\n    // 代码逻辑说明: 【pull/7333】修复分组表头可编辑表格失效问题\n    const result = formatEditColumn(columns.filter((item) => hasPermission(item.auth) && isIfShow(item)));\n    // 代码逻辑说明: 【QQYUN-6387】展开写法（去掉报错）\n    if (propsRef.value.expandedRowKeys && !propsRef.value.isTreeTable) {\n      let index = 0;\n      const findIndex = result.findIndex((item) => item.key === CUS_SEL_COLUMN_KEY);\n      if (findIndex != -1) {\n        index = findIndex + 1;\n      }\n      const next: any = result[index + 1];\n      let expand = Table.EXPAND_COLUMN;\n      if (next && (next['fixed'] == true || next['fixed'] == 'left')) {\n        expand = Object.assign(expand, { fixed: 'left' });\n      }\n      result.splice(index, 0, expand);\n    }\n    return result;\n  });\n\n  watch(\n    () => unref(propsRef).columns,\n    (columns) => {\n      columnsRef.value = columns;\n      cacheColumns = columns?.filter((item) => !item.flag) ?? [];\n    }\n  );\n\n  function setCacheColumnsByField(dataIndex: string | undefined, value: Partial<BasicColumn>) {\n    if (!dataIndex || !value) {\n      return;\n    }\n    cacheColumns.forEach((item) => {\n      if (item.dataIndex === dataIndex) {\n        Object.assign(item, value);\n        return;\n      }\n    });\n  }\n\n  /**\n   * set columns\n   * @param columnList key｜column\n   */\n  function setColumns(columnList: Partial<BasicColumn>[] | (string | string[])[]) {\n    const columns = cloneDeep(columnList);\n    if (!isArray(columns)) return;\n\n    if (columns.length <= 0) {\n      columnsRef.value = [];\n      return;\n    }\n\n    const firstColumn = columns[0];\n\n    const cacheKeys = cacheColumns.map((item) => item.dataIndex);\n\n    if (!isString(firstColumn) && !isArray(firstColumn)) {\n      columnsRef.value = columns as BasicColumn[];\n    } else {\n      const columnKeys = (columns as (string | string[])[]).map((m) => m.toString());\n      const newColumns: BasicColumn[] = [];\n      cacheColumns.forEach((item) => {\n        newColumns.push({\n          ...item,\n          defaultHidden: !columnKeys.includes(item.dataIndex?.toString() || (item.key as string)),\n        });\n      });\n      // Sort according to another array\n      if (!isEqual(cacheKeys, columns)) {\n        newColumns.sort((prev, next) => {\n          return columnKeys.indexOf(prev.dataIndex?.toString() as string) - columnKeys.indexOf(next.dataIndex?.toString() as string);\n        });\n      }\n      columnsRef.value = newColumns;\n    }\n  }\n\n  function getColumns(opt?: GetColumnsParams) {\n    const { ignoreIndex, ignoreAction, ignoreAuth, ignoreIfShow, sort } = opt || {};\n    let columns = toRaw(unref(getColumnsRef));\n    if (ignoreIndex) {\n      columns = columns.filter((item) => item.flag !== INDEX_COLUMN_FLAG);\n    }\n    if (ignoreAction) {\n      columns = columns.filter((item) => item.flag !== ACTION_COLUMN_FLAG);\n    }\n    // 过滤自定义选择列\n    columns = columns.filter((item) => item.key !== CUS_SEL_COLUMN_KEY);\n    // 代码逻辑说明: 【issues/8502】解决权限列在列表中不显示，列配置中还显示\n    if (ignoreAuth) {\n      columns = columns.filter((item) => {\n        if (item.auth) {\n          return hasPermission(item.auth);\n        }\n        return true;\n      });\n    }\n    if (ignoreIfShow) {\n      columns = columns.filter((item) => {\n        if (isBoolean(item.ifShow)) {\n          return item.ifShow;\n        }\n        if (isFunction(item.ifShow)) {\n          return item.ifShow(item);\n        }\n        return true;\n      });\n    }\n    if (sort) {\n      columns = sortFixedColumn(columns);\n    }\n\n    return columns;\n  }\n  function getCacheColumns() {\n    return cacheColumns;\n  }\n\n  return {\n    getColumnsRef,\n    getCacheColumns,\n    getColumns,\n    setColumns,\n    getViewColumns,\n    setCacheColumnsByField,\n  };\n}\n\nfunction sortFixedColumn(columns: BasicColumn[]) {\n  const fixedLeftColumns: BasicColumn[] = [];\n  const fixedRightColumns: BasicColumn[] = [];\n  const defColumns: BasicColumn[] = [];\n  for (const column of columns) {\n    if (column.fixed === 'left') {\n      fixedLeftColumns.push(column);\n      continue;\n    }\n    if (column.fixed === 'right') {\n      fixedRightColumns.push(column);\n      continue;\n    }\n    defColumns.push(column);\n  }\n  return [...fixedLeftColumns, ...defColumns, ...fixedRightColumns].filter((item) => !item.defaultHidden);\n}\n\n// format cell\nexport function formatCell(text: string, format: CellFormat, record: Recordable, index: number) {\n  if (!format) {\n    return text;\n  }\n\n  // custom function\n  if (isFunction(format)) {\n    return format(text, record, index);\n  }\n\n  try {\n    // date type\n    const DATE_FORMAT_PREFIX = 'date|';\n    if (isString(format) && format.startsWith(DATE_FORMAT_PREFIX)) {\n      const dateFormat = format.replace(DATE_FORMAT_PREFIX, '');\n\n      if (!dateFormat) {\n        return text;\n      }\n      return formatToDate(text, dateFormat);\n    }\n\n    // Map\n    if (isMap(format)) {\n      return format.get(text);\n    }\n  } catch (error) {\n    return text;\n  }\n}\n\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/hooks/useColumnsCache.ts",
    "content": "import { computed, nextTick, unref, watchEffect } from 'vue';\nimport { router } from '/@/router';\nimport { useRoute } from 'vue-router';\nimport { createLocalStorage } from '/@/utils/cache';\nimport { useTableContext } from './useTableContext';\nimport { useMessage } from '/@/hooks/web/useMessage';\n\n/**\n * 列表配置缓存\n */\nexport function useColumnsCache(opt, setColumns, handleColumnFixed) {\n  let isInit = false;\n  const table = useTableContext();\n  const $ls = createLocalStorage();\n  const { createMessage: $message } = useMessage();\n  const route = useRoute();\n  // 列表配置缓存key\n  const cacheKey = computed(() => {\n    // 代码逻辑说明: 【QQYUN-8367】online报表配置列展示保存，影响到其他页面的table字段的显示隐藏（开发环境热更新会有此问题，生产环境无问题）\n    const path = route.path;\n    let key = path.replace(/[\\/\\\\]/g, '_');\n    let cacheKey = table.getBindValues.value.tableSetting?.cacheKey;\n    if (cacheKey) {\n      key += ':' + cacheKey;\n    }\n    return 'columnCache:' + key;\n  });\n\n  watchEffect(() => {\n    const columns = table.getColumns();\n    if (columns.length) {\n      init();\n    }\n  });\n\n  async function init() {\n    if (isInit) {\n      return;\n    }\n    isInit = true;\n    let columnCache = $ls.get(cacheKey.value);\n    if (columnCache && columnCache.checkedList) {\n      const { checkedList, sortedList, sortableOrder, checkIndex } = columnCache;\n      await nextTick();\n      // checkbox的排序缓存\n      opt.sortableOrder.value = sortableOrder;\n      // checkbox的选中缓存\n      opt.state.checkedList = checkedList;\n      // tableColumn的排序缓存\n      opt.plainSortOptions.value.sort((prev, next) => {\n        return sortedList.indexOf(prev.value) - sortedList.indexOf(next.value);\n      });\n      // 重新排序tableColumn\n      checkedList.sort((prev, next) => sortedList.indexOf(prev) - sortedList.indexOf(next));\n      // 是否显示行号列\n      if (checkIndex) {\n        table.setProps({ showIndexColumn: true });\n      }\n      setColumns(checkedList);\n      // 设置固定列\n      setColumnFixed(columnCache);\n    }\n  }\n\n  /** 设置被固定的列 */\n  async function setColumnFixed(columnCache) {\n    const { fixedColumns } = columnCache;\n    const columns = opt.plainOptions.value;\n    for (const column of columns) {\n      let fixedCol = fixedColumns.find((fc) => fc.key === (column.key || column.dataIndex));\n      if (fixedCol) {\n        await nextTick();\n        handleColumnFixed(column, fixedCol.fixed);\n      }\n    }\n  }\n\n  // 判断列固定状态\n  const fixedReg = /^(true|left|right)$/;\n\n  /** 获取被固定的列 */\n  function getFixedColumns() {\n    let fixedColumns: any[] = [];\n    const columns = opt.plainOptions.value;\n    for (const column of columns) {\n      if (fixedReg.test((column.fixed ?? '').toString())) {\n        fixedColumns.push({\n          key: column.key || column.dataIndex,\n          fixed: column.fixed === true ? 'left' : column.fixed,\n        });\n      }\n    }\n    return fixedColumns;\n  }\n\n  /** 保存列配置 */\n  function saveSetting() {\n    const { checkedList } = opt.state;\n    // 代码逻辑说明: 【TV360X-105】列展示设置问题[重置之后保存的顺序还是上次的]\n    let sortedList = [];\n    if (opt.restAfterOptions.value) {\n      sortedList = opt.restAfterOptions.value.map((item) => item.value);\n    } else {\n      sortedList = unref(opt.plainSortOptions).map((item) => item.value);\n    }\n    $ls.set(cacheKey.value, {\n      // 保存的列\n      checkedList,\n      // 排序后的列\n      sortedList,\n      // 是否显示行号列\n      checkIndex: unref(opt.checkIndex),\n      // checkbox原始排序\n      sortableOrder: unref(opt.sortableOrder),\n      // 固定列\n      fixedColumns: getFixedColumns(),\n    });\n    $message.success('保存成功');\n    // 保存之后直接关闭\n    opt.popoverVisible.value = false;\n  }\n\n  /** 重置（删除）列配置 */\n  async function resetSetting() {\n    // 重置固定列\n    await resetFixedColumn();\n    $ls.remove(cacheKey.value);\n    $message.success('重置成功');\n  }\n\n  async function resetFixedColumn() {\n    const columns = opt.plainOptions.value;\n    for (const column of columns) {\n      column.fixed;\n      if (fixedReg.test((column.fixed ?? '').toString())) {\n        await nextTick();\n        handleColumnFixed(column, null);\n      }\n    }\n  }\n\n  return {\n    saveSetting,\n    resetSetting,\n    getCache: () => $ls.get(cacheKey.value),\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/hooks/useCustomRow.ts",
    "content": "import type { ComputedRef } from 'vue';\nimport type { BasicTableProps } from '../types/table';\nimport { unref } from 'vue';\nimport { ROW_KEY } from '../const';\nimport { isString, isFunction } from '/@/utils/is';\n\ninterface Options {\n  setSelectedRowKeys: (keys: string[]) => void;\n  getSelectRowKeys: () => string[];\n  clearSelectedRowKeys: () => void;\n  emit: EmitType;\n  getAutoCreateKey: ComputedRef<boolean | undefined>;\n}\n\nfunction getKey(record: Recordable, rowKey: string | ((record: Record<string, any>) => string) | undefined, autoCreateKey?: boolean) {\n  if (!rowKey || autoCreateKey) {\n    return record[ROW_KEY];\n  }\n  if (isString(rowKey)) {\n    return record[rowKey];\n  }\n  if (isFunction(rowKey)) {\n    return record[rowKey(record)];\n  }\n  return null;\n}\n\nexport function useCustomRow(\n  propsRef: ComputedRef<BasicTableProps>,\n  { setSelectedRowKeys, getSelectRowKeys, getAutoCreateKey, clearSelectedRowKeys, emit }: Options\n) {\n  const customRow = (record: Recordable, index: number) => {\n    return {\n      onClick: (e: Event) => {\n        e?.stopPropagation();\n        function handleClick() {\n          const { rowSelection, rowKey, clickToRowSelect } = unref(propsRef);\n          if (!rowSelection || !clickToRowSelect) return;\n          const keys = getSelectRowKeys();\n          const key = getKey(record, rowKey, unref(getAutoCreateKey));\n          if (!key) return;\n\n          const isCheckbox = rowSelection.type === 'checkbox';\n          if (isCheckbox) {\n            // 找到tr\n            const tr: HTMLElement = (e as MouseEvent).composedPath?.().find((dom: HTMLElement) => dom.tagName === 'TR') as HTMLElement;\n            if (!tr) return;\n            // 找到Checkbox，检查是否为disabled\n            const checkBox = tr.querySelector('input[type=checkbox]');\n            if (!checkBox || checkBox.hasAttribute('disabled')) return;\n            if (!keys.includes(key)) {\n              setSelectedRowKeys([...keys, key]);\n              return;\n            }\n            const keyIndex = keys.findIndex((item) => item === key);\n            keys.splice(keyIndex, 1);\n            setSelectedRowKeys(keys);\n            return;\n          }\n\n          const isRadio = rowSelection.type === 'radio';\n          if (isRadio) {\n            // 代码逻辑说明: 【QQYUN-6794】table列表增加radio禁用功能\n            const rowSelection = propsRef.value.rowSelection;\n            if (rowSelection.getCheckboxProps) {\n              const result = rowSelection.getCheckboxProps(record);\n              if (result.disabled) {\n                return;\n              }\n            }\n            if (!keys.includes(key)) {\n              if (keys.length) {\n                clearSelectedRowKeys();\n              }\n              setSelectedRowKeys([key]);\n              return;\n            } else {\n              // 点击已经选中的，直接return不在做操作\n              return;\n            }\n            clearSelectedRowKeys();\n          }\n        }\n        handleClick();\n        emit('row-click', record, index, e);\n      },\n      onDblclick: (event: Event) => {\n        emit('row-dbClick', record, index, event);\n      },\n      onContextmenu: (event: Event) => {\n        emit('row-contextmenu', record, index, event);\n      },\n      onMouseenter: (event: Event) => {\n        emit('row-mouseenter', record, index, event);\n      },\n      onMouseleave: (event: Event) => {\n        emit('row-mouseleave', record, index, event);\n      },\n    };\n  };\n\n  return {\n    customRow,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/hooks/useCustomSelection.tsx",
    "content": "import type { BasicColumn } from '/@/components/Table';\nimport type { Ref, ComputedRef } from 'vue';\nimport type { BasicTableProps, PaginationProps, TableRowSelection } from '/@/components/Table';\nimport { computed, nextTick, onUnmounted, ref, toRaw, unref, watch, watchEffect } from 'vue';\nimport { omit, isEqual } from 'lodash-es';\nimport { throttle } from 'lodash-es';\nimport { Checkbox, Radio } from 'ant-design-vue';\nimport { isFunction } from '/@/utils/is';\nimport { findNodeAll } from '/@/utils/helper/treeHelper';\nimport { ROW_KEY } from '/@/components/Table/src/const';\nimport { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated';\nimport { useMessage } from '/@/hooks/web/useMessage';\nimport { ModalFunc } from 'ant-design-vue/lib/modal/Modal';\n\n// 自定义选择列的key\nexport const CUS_SEL_COLUMN_KEY = 'j-custom-selected-column';\n\n/**\n * 自定义选择列\n */\nexport function useCustomSelection(\n  propsRef: ComputedRef<BasicTableProps>,\n  emit: EmitType,\n  wrapRef: Ref<null | HTMLDivElement>,\n  getPaginationRef: ComputedRef<boolean | PaginationProps>,\n  tableData: Ref<Recordable[]>,\n  childrenColumnName: ComputedRef<string>\n) {\n  const { createConfirm } = useMessage();\n  // 表格body元素\n  const bodyEl = ref<HTMLDivElement>();\n  // body元素高度\n  const bodyHeight = ref<number>(0);\n  // 表格tr高度\n  const rowHeight = ref<number>(0);\n  // body 滚动高度\n  const scrollTop = ref(0);\n  // 选择的key\n  const selectedKeys = ref<string[]>([]);\n  // 选择的行\n  const selectedRows = ref<Recordable[]>([]);\n  // 变更的行\n  let changeRows: Recordable[] = [];\n  let allSelected: boolean = false;\n\n  let timer;\n\n  // 扁平化数据，children数据也会放到一起\n  const flattedData = computed(() => {\n    // 代码逻辑说明: 【QQYUN-6774】解决checkbox禁用后全选仍能勾选问题\n    const data = flattenData(tableData.value, childrenColumnName.value);\n    const rowSelection = propsRef.value.rowSelection;\n    if (rowSelection?.type === 'checkbox' && rowSelection.getCheckboxProps) {\n      for (let i = 0, len = data.length; i < len; i++) {\n        const record = data[i];\n        const result = rowSelection.getCheckboxProps(record);\n        if (result.disabled) {\n          data.splice(i, 1);\n          i--;\n          len--;\n        }\n      }\n    }\n    return data;\n  });\n\n  const getRowSelectionRef = computed((): TableRowSelection | null => {\n    const { rowSelection } = unref(propsRef);\n    if (!rowSelection) {\n      return null;\n    }\n\n    return {\n      preserveSelectedRowKeys: true,\n      // selectedRowKeys: unref(selectedKeys),\n      // onChange: (selectedRowKeys: string[]) => {\n      //   setSelectedRowKeys(selectedRowKeys);\n      // },\n      ...omit(rowSelection, ['onChange', 'selectedRowKeys']),\n    };\n  });\n\n  // 是否是单选\n  const isRadio = computed(() => {\n    return getRowSelectionRef.value?.type === 'radio';\n  });\n\n  const getAutoCreateKey = computed(() => {\n    return unref(propsRef).autoCreateKey && !unref(propsRef).rowKey;\n  });\n\n  // 列key字段\n  const getRowKey = computed(() => {\n    const { rowKey } = unref(propsRef);\n    return unref(getAutoCreateKey) ? ROW_KEY : rowKey;\n  });\n  // 获取行的key字段数据\n  const getRecordKey = (record) => {\n    if (!getRowKey.value) {\n      return record[ROW_KEY];\n    } else if (isFunction(getRowKey.value)) {\n      return getRowKey.value(record);\n    } else {\n      return record[getRowKey.value];\n    }\n  };\n\n  // 分页配置\n  const getPagination = computed<PaginationProps>(() => {\n    return typeof getPaginationRef.value === 'boolean' ? {} : getPaginationRef.value;\n  });\n  // 当前页条目数量\n  const currentPageSize = computed(() => {\n    const { pageSize = 10, total = flattedData.value.length } = getPagination.value;\n    return pageSize > total ? total : pageSize;\n  });\n\n  // 选择列表头props\n  const selectHeaderProps = computed(() => {\n    return {\n      onSelectAll,\n      isRadio: isRadio.value,\n      selectedLength: flattedData.value.filter((data) => selectedKeys.value.includes(getRecordKey(data))).length,\n      // 【TV360X-53】为空时会报错，加强判断\n      pageSize: flattedData.value?.length ?? 0,\n      // 【QQYUN-6774】解决checkbox禁用后全选仍能勾选问题\n      disabled: flattedData.value.length == 0,\n      hideSelectAll: unref(propsRef)?.rowSelection?.hideSelectAll,\n    };\n  });\n\n  // 监听传入的selectedRowKeys\n  // 代码逻辑说明: 【QQYUN-8390】部门人员组件点击重置未清空（selectedRowKeys.value=[]，watch没监听到加deep）\n  watch(\n    () => unref(propsRef)?.rowSelection?.selectedRowKeys,\n    (val: string[]) => {\n      // 解决selectedRowKeys在页面调用处使用ref失效\n      const value = unref(val);\n      if (Array.isArray(value) && !sameArray(value, selectedKeys.value)) {\n        // 延迟是为了等watch selectedRows\n        setTimeout(() => {\n          setSelectedRowKeys(value);\n        }, 0);\n      }\n    },\n    {\n      immediate: true,\n      deep: true\n    }\n  );\n  // 编辑时selectedRows可能会回填\n  watch(\n    () => unref(propsRef)?.rowSelection?.selectedRows,\n    (val: string[]) => {\n      const value: any = unref(val);\n      if (Array.isArray(value) && !sameArray(value, selectedRows.value)) {\n        selectedRows.value = value;\n      }\n    },\n    {\n      immediate: true,\n      deep: true,\n    }\n  );\n  /**\n  * 2024-03-06\n  * liaozhiyang\n  * 判断是否同一个数组 (引用地址，长度，元素位置信息相同才是同一个数组。数组元素只有字符串)\n  */\n  function sameArray(a, b) {\n    if (a === b) {\n      if (a.length === b.length) {\n        return a.toString() === b.toString();\n      } else {\n        return false;\n      }\n    } else {\n      // 代码逻辑说明: 【QQYUN-9123】popupdict打开弹窗打开程序运行\n      if (isEqual(a, b)) {\n        return true;\n      }\n      return false;\n    }\n  }\n\n  // 当任意一个变化时，触发同步检测\n  watch([selectedKeys, selectedRows], () => {\n    nextTick(() => {\n      syncSelectedRows();\n    });\n  });\n\n  // 监听滚动条事件\n  const onScrollTopChange = throttle((e) => (scrollTop.value = e?.target?.scrollTop), 150);\n\n  let bodyResizeObserver: Nullable<ResizeObserver> = null;\n  // 获取首行行高\n  watchEffect(() => {\n    // 这种写法是为了监听到 size 的变化\n    propsRef.value.size && void 0;\n    if (bodyEl.value) {\n      // 监听div高度变化\n      bodyResizeObserver = new ResizeObserver((entries) => {\n        for (let entry of entries) {\n          if (entry.target === bodyEl.value && entry.contentRect) {\n            const { height } = entry.contentRect;\n            bodyHeight.value = Math.ceil(height);\n          }\n        }\n        updateRowHeight();\n      });\n      bodyResizeObserver.observe(bodyEl.value);\n    }\n    rowHeight.value = 50;\n  });\n\n  onMountedOrActivated(async () => {\n    bodyEl.value = await getTableBody(wrapRef.value!);\n    bodyEl.value.addEventListener('scroll', onScrollTopChange);\n  });\n  onUnmounted(() => {\n    if (bodyEl.value) {\n      bodyEl.value?.removeEventListener('scroll', onScrollTopChange);\n    }\n    if (bodyResizeObserver != null) {\n      bodyResizeObserver.disconnect();\n    }\n  });\n\n  // 更新首行行高\n  function updateRowHeight() {\n    const el = bodyEl.value?.querySelector('tbody.ant-table-tbody tr.ant-table-row') as HTMLDivElement;\n    if (el) {\n      // 代码逻辑说明: 【issues/7442】basicTable从默认切换到宽松紧凑时多选框显示异常\n      nextTick(() => rowHeight.value = el.offsetHeight);\n    }\n  }\n\n  // 选择全部\n  function onSelectAll(checked: boolean, flag = 'currentPage') {\n    // 代码逻辑说明: 【issues/5577】BasicTable组件全选和取消全选时不触发onSelectAll事件\n    if (unref(propsRef)?.rowSelection?.onSelectAll) {\n      allSelected = checked;\n      changeRows = getInvertRows(selectedRows.value, checked, flag);\n    }\n    // 取消全选\n    if (!checked) {\n      // 代码逻辑说明: 【issues/6958】取消没触发onSelectAll事件，跨页选中后 changeRows 为空\n      if (flag === 'allPage') {\n        selectedKeys.value = [];\n        selectedRows.value = [];\n      } else {\n        flattedData.value.forEach((item) => {\n          updateSelected(item, false);\n        });\n      }\n      emitChange('all');\n      return;\n    }\n    let modal: Nullable<ReturnType<ModalFunc>> = null;\n    // 全选\n    const checkAll = () => {\n      if (modal != null) {\n        modal.update({\n          content: '正在分批全选，请稍后……',\n          cancelButtonProps: { disabled: true },\n        });\n      }\n      let showCount = 0;\n      // 最小选中数量\n      let minSelect = 100;\n      const hidden: Recordable[] = [];\n      flattedData.value.forEach((item, index, array) => {\n        if (array.length > 120) {\n          if (showCount <= minSelect && recordIsShow(index, Math.max((minSelect - 10) / 2, 3))) {\n            showCount++;\n            updateSelected(item, checked);\n          } else {\n            hidden.push(item);\n          }\n        } else {\n          updateSelected(item, checked);\n        }\n      });\n      if (hidden.length > 0) {\n        return batchesSelectAll(hidden, checked, minSelect);\n      } else {\n        emitChange('all');\n      }\n    };\n\n    // 当数据量大于120条时，全选会导致页面卡顿，需进行慢速全选\n    if (flattedData.value.length > 120) {\n      modal = createConfirm({\n        title: '全选',\n        content: '当前数据量较大，全选可能会导致页面卡顿，确定要执行此操作吗？',\n        iconType: 'warning',\n        onOk: () => checkAll(),\n      });\n    } else {\n      checkAll();\n    }\n  }\n\n  // 分批全选\n  function batchesSelectAll(hidden: Recordable[], checked: boolean, minSelect: number) {\n    return new Promise<void>((resolve) => {\n      (function call() {\n        // 每隔半秒钟，选择100条数据\n        setTimeout(() => {\n          const list = hidden.splice(0, minSelect);\n          if (list.length > 0) {\n            list.forEach((item) => {\n              updateSelected(item, checked);\n            });\n            call();\n          } else {\n            setTimeout(() => {\n              emitChange('all');\n              // 代码逻辑说明: 【QQYUN-5687】批量选择，提示成功后，又来一个提示\n              setTimeout(() =>resolve(), 0);\n            }, 500);\n          }\n        }, 300);\n      })();\n    });\n  }\n\n  // 选中单个\n  function onSelect(record, checked) {\n    onSelectChild(record, checked);\n    updateSelected(record, checked);\n    onSelectParent(record, checked);\n    // 代码逻辑说明: 【issues/8690】BasicTable的rowSelection新增onSelect方法\n    propsRef.value.rowSelection?.onSelect?.(toRaw(record), checked, toRaw(selectedRows.value));\n    emitChange();\n  }\n\n  function updateSelected(record, checked) {\n    const recordKey = getRecordKey(record);\n    if (isRadio.value) {\n      selectedKeys.value = [recordKey];\n      selectedRows.value = [record];\n      return;\n    }\n    const index = selectedKeys.value.findIndex((key) => key === recordKey);\n    if (checked) {\n      if (index === -1) {\n        selectedKeys.value.push(recordKey);\n        selectedRows.value.push(record);\n      }\n    } else {\n      if (index !== -1) {\n        selectedKeys.value.splice(index, 1);\n        selectedRows.value.splice(index, 1);\n      }\n    }\n    // 代码逻辑说明: 【issues/7200】basicTable选中后没有选中样式\n    clearTimeout(timer);\n    timer = setTimeout(() => {\n      selectedKeys.value = [...selectedKeys.value];\n    }, 0);\n  }\n\n  // 调用用户自定义的onChange事件\n  function emitChange(mode = 'single') {\n    const { rowSelection } = unref(propsRef);\n    if (rowSelection) {\n      const { onChange } = rowSelection;\n      if (onChange && isFunction(onChange)) {\n        setTimeout(() => {\n          onChange(selectedKeys.value, selectedRows.value);\n        }, 0);\n      }\n    }\n    emit('selection-change', {\n      keys: getSelectRowKeys(),\n      rows: getSelectRows(),\n    });\n    // 代码逻辑说明: 【issues/5577】BasicTable组件全选和取消全选时不触发onSelectAll事件\n    if (mode == 'all') {\n      const rowSelection = unref(propsRef)?.rowSelection;\n      if (rowSelection?.onSelectAll) {\n        rowSelection.onSelectAll(allSelected, toRaw(getSelectRows()), toRaw(changeRows));\n      }\n    }\n  }\n  /**\n   * 层级关联时，选中下级数据\n   * @param record\n   * @param checked\n   */\n  function onSelectChild(record, checked) {\n    if (unref(propsRef)?.isTreeTable && unref(propsRef)?.rowSelection?.checkStrictly === false && !isRadio.value) {\n      if (record[childrenColumnName.value] && record[childrenColumnName.value].length > 0) {\n        record[childrenColumnName.value].forEach((children) => {\n          updateSelected(children, checked);\n          if (children[childrenColumnName.value] && children[childrenColumnName.value].length > 0) {\n            onSelectChild(children, checked);\n          }\n        });\n      }\n    }\n  }\n  /**\n   * 2024-09-24\n   * liaozhiyang\n   * 层级关联时，选中上级数据\n   * 【issues/7217】BasicTable树形表格设置checkStrictly无效\n   * */\n  function onSelectParent(record, checked) {\n    if (unref(propsRef)?.isTreeTable && unref(propsRef)?.rowSelection?.checkStrictly === false && !isRadio.value) {\n      let condition = true,\n        currentRecord = record;\n      while (condition) {\n        const parentRecord: any = findParent(tableData.value, currentRecord, childrenColumnName.value);\n        if (parentRecord) {\n          const childrenRecordKeys: any = [];\n          parentRecord[childrenColumnName.value].forEach((item) => {\n            childrenRecordKeys.push(getRecordKey(item));\n          });\n          if (checked === true) {\n            const isSubSet = childrenRecordKeys.every((item) => selectedKeys.value.includes(item));\n            isSubSet && updateSelected(parentRecord, checked);\n          } else if (checked === false) {\n            updateSelected(parentRecord, checked);\n          }\n          if (tableData.value.find((item) => getRecordKey(item) === getRecordKey(parentRecord))) {\n            // 循环终止\n            condition = false;\n          } else {\n            currentRecord = parentRecord;\n          }\n        } else {\n          // 循环终止\n          condition = false;\n        }\n      }\n    }\n    function findParent(tree, record, children = 'children') {\n      let parent = null;\n      function search(nodes) {\n        for (let node of nodes) {\n          if (node[children]?.some((child) => getRecordKey(child) === getRecordKey(record))) {\n            parent = node;\n            return true;\n          }\n          if (node[children] && search(node[children])) {\n            return true;\n          }\n        }\n        return false;\n      }\n      search(tree);\n      return parent;\n    }\n  }\n  // 用于判断是否是自定义选择列\n  function isCustomSelection(column: BasicColumn) {\n    return column.key === CUS_SEL_COLUMN_KEY;\n  }\n\n  /**\n   * 判断当前行是否可视，虚拟滚动用\n   * @param index 行下标\n   * @param threshold 前后阈值，默认可视区域前后显示3条\n   */\n  function recordIsShow(index: number, threshold = 3) {\n    // 只有数据量大于50条时，才会进行虚拟滚动\n    const isVirtual = flattedData.value.length > 50;\n    if (isVirtual) {\n      // 根据 scrollTop、bodyHeight、rowHeight 计算出当前行是否可视（阈值前后3条）\n      // flag1 = 判断当前行是否在可视区域上方3条\n      const flag1 = scrollTop.value - rowHeight.value * threshold < index * rowHeight.value;\n      // flag2 = 判断当前行是否在可视区域下方3条\n      const flag2 = index * rowHeight.value < scrollTop.value + bodyHeight.value + rowHeight.value * threshold;\n      // 全部条件满足时，才显示当前行\n      return flag1 && flag2;\n    }\n    return true;\n  }\n\n  // 自定义渲染Body\n  function bodyCustomRender(params) {\n    const { index } = params;\n    // 代码逻辑说明: 【issues/776】显示100条/页，复选框只能显示3个的问题\n    if (propsRef.value.canResize && !recordIsShow(index)) {\n      return '';\n    }\n    if (isRadio.value) {\n      return renderRadioComponent(params);\n    } else {\n      return renderCheckboxComponent(params);\n    }\n  }\n\n  /**\n   * 渲染checkbox组件\n   */\n  function renderCheckboxComponent({ record }) {\n    const recordKey = getRecordKey(record);\n    // 获取用户自定义checkboxProps\n    const checkboxProps = ((getCheckboxProps) => {\n      if (typeof getCheckboxProps === 'function') {\n        try {\n          return getCheckboxProps(record) ?? {};\n        } catch (error) {\n          console.error(error);\n        }\n      }\n      return {};\n    })(propsRef.value.rowSelection?.getCheckboxProps);\n    return (\n      <Checkbox\n        {...checkboxProps}\n        key={'j-select__' + recordKey}\n        checked={selectedKeys.value.includes(recordKey)}\n        onUpdate:checked={(checked) => onSelect(record, checked)}\n        // 代码逻辑说明: 【QQYUN-8694】BasicTable在使用clickToRowSelect=true下，selection-change 事件在触发多次\n        onClick={(e) => e.stopPropagation()}\n      />\n    );\n  }\n\n  /**\n   * 渲染radio组件\n   */\n  function renderRadioComponent({ record }) {\n    const recordKey = getRecordKey(record);\n    // 获取用户自定义radioProps\n    const checkboxProps = (() => {\n      const rowSelection = propsRef.value.rowSelection;\n      if (rowSelection?.getCheckboxProps) {\n        return rowSelection.getCheckboxProps(record);\n      }\n      return {};\n    })();\n    return (\n      <Radio\n        {...checkboxProps}\n        key={'j-select__' + recordKey}\n        checked={selectedKeys.value.includes(recordKey)}\n        onUpdate:checked={(checked) => onSelect(record, checked)}\n        // 代码逻辑说明: 【QQYUN-8694】BasicTable在使用clickToRowSelect=true下，selection-change 事件在触发多次\n        onClick={(e) => e.stopPropagation()}\n      />\n    );\n  }\n\n  // 创建选择列\n  function handleCustomSelectColumn(columns: BasicColumn[]) {\n    // 代码逻辑说明: 【issues/757】JPopup表格的选择列固定配置不生效\n    const rowSelection = propsRef.value.rowSelection;\n    if (!rowSelection) {\n      return;\n    }\n    const isFixedLeft = rowSelection.fixed || columns.some((item) => item.fixed === 'left');\n    // 代码逻辑说明: 【issues/757】JPopup表格的选择列固定配置不生效\n    columns.unshift({\n      title: '选择列',\n      flag: 'CHECKBOX',\n      key: CUS_SEL_COLUMN_KEY,\n      width: 50,\n      minWidth: 50,\n      maxWidth: 50,\n      align: 'center',\n      ...(isFixedLeft ? { fixed: 'left' } : {}),\n      customRender: bodyCustomRender,\n    });\n  }\n\n  // 清空所有选择\n  function clearSelectedRowKeys() {\n    onSelectAll(false, 'allPage');\n  }\n\n  // 通过 selectedKeys 同步 selectedRows\n  function syncSelectedRows() {\n    if (selectedKeys.value.length !== selectedRows.value.length) {\n      // 延迟是为了等watch selectedRows\n      setTimeout(() => {\n        setSelectedRowKeys(selectedKeys.value);\n      }, 0);\n    }\n  }\n\n  // 设置选择的key\n  function setSelectedRowKeys(rowKeys: string[]) {\n    const isSomeRowKeys = selectedKeys.value === rowKeys;\n    selectedKeys.value = rowKeys;\n    const allSelectedRows = findNodeAll(\n      toRaw(unref(flattedData)).concat(toRaw(unref(selectedRows))),\n      (item) => rowKeys.includes(getRecordKey(item)),\n      {\n        children: propsRef.value.childrenColumnName ?? 'children',\n      }\n    );\n    const trueSelectedRows: any[] = [];\n    rowKeys.forEach((key: string) => {\n      const found = allSelectedRows.find((item) => getRecordKey(item) === key);\n      found && trueSelectedRows.push(found);\n    });\n    // 代码逻辑说明: 【issues/828】解决卡死问题\n    if (!(isSomeRowKeys && equal(selectedRows.value, trueSelectedRows))) {\n      selectedRows.value = trueSelectedRows;\n      emitChange();\n    }\n  }\n  /**\n   *2023-11-03\n   *廖志阳\n   *检测selectedRows.value和trueSelectedRows是否相等，防止死循环\n   */\n  function equal(oldVal, newVal) {\n    let oldKeys = [],\n      newKeys = [];\n    if (oldVal.length === newVal.length) {\n      oldKeys = oldVal.map((item) => getRecordKey(item));\n      newKeys = newVal.map((item) => getRecordKey(item));\n      for (let i = 0, len = oldKeys.length; i < len; i++) {\n        const findItem = newKeys.find((item) => item === oldKeys[i]);\n        if (!findItem) {\n          return false;\n        }\n      }\n      return true;\n    }\n    return false;\n  }\n  /**\n   *2024-08-08\n   *廖志阳\n   *根据全选或者反选(或者使用clearSelectedRowKeys()方法)返回源数据中这次需要变更的数据\n   */\n  function getInvertRows(selectedRows: any, checked: boolean, flag): any {\n    if (flag == 'currentPage') {\n      const curPageRows = findNodeAll(toRaw(unref(flattedData)), () => true, {\n        children: propsRef.value.childrenColumnName ?? 'children',\n      });\n      const selectedkeys = selectedRows.map((item) => getRecordKey(item));\n      const result: any = [];\n      curPageRows.forEach((item) => {\n        const curRowkey = getRecordKey(item);\n        const index = selectedkeys.findIndex((item) => item === curRowkey);\n        if (index == -1) {\n          checked && result.push(toRaw(item));\n        } else {\n          !checked && result.push(toRaw(item));\n        }\n      });\n      return result;\n    } else {\n      return toRaw(selectedRows);\n    }\n  }\n  function getSelectRows<T = Recordable>() {\n    return unref(selectedRows) as T[];\n  }\n\n  function getSelectRowKeys() {\n    return unref(selectedKeys);\n  }\n\n  function getRowSelection() {\n    return unref(getRowSelectionRef)!;\n  }\n\n  function deleteSelectRowByKey(key: string) {\n    const index = selectedKeys.value.findIndex((item) => item === key);\n    if (index !== -1) {\n      selectedKeys.value.splice(index, 1);\n      selectedRows.value.splice(index, 1);\n    }\n  }\n\n  // 【QQYUN-5837】动态计算 expandIconColumnIndex\n  const getExpandIconColumnIndex = computed(() => {\n    const { expandIconColumnIndex } = unref(propsRef);\n    // 未设置选择列，则保持不变\n    if (getRowSelectionRef.value == null) {\n      return expandIconColumnIndex;\n    }\n    // 设置了选择列，并且未传入 index 参数，则返回 1\n    if (expandIconColumnIndex == null) {\n      return 1;\n    }\n    return expandIconColumnIndex;\n  });\n\n  return {\n    getRowSelection,\n    getRowSelectionRef,\n    getSelectRows,\n    getSelectRowKeys,\n    setSelectedRowKeys,\n    deleteSelectRowByKey,\n    selectHeaderProps,\n    isCustomSelection,\n    handleCustomSelectColumn,\n    clearSelectedRowKeys,\n    getExpandIconColumnIndex,\n  };\n}\n\nfunction getTableBody(wrap: HTMLDivElement) {\n  return new Promise<HTMLDivElement>((resolve) => {\n    (function fn() {\n      const bodyEl = wrap.querySelector('.ant-table-wrapper .ant-table-body') as HTMLDivElement;\n      if (bodyEl) {\n        resolve(bodyEl);\n      } else {\n        setTimeout(fn, 100);\n      }\n    })();\n  });\n}\n\nfunction flattenData<RecordType>(data: RecordType[] | undefined, childrenColumnName: string): RecordType[] {\n  let list: RecordType[] = [];\n  (data || []).forEach((record) => {\n    list.push(record);\n\n    if (record && typeof record === 'object' && childrenColumnName in record) {\n      list = [...list, ...flattenData<RecordType>((record as any)[childrenColumnName], childrenColumnName)];\n    }\n  });\n\n  return list;\n}\n\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/hooks/useDataSource.ts",
    "content": "import type { BasicTableProps, FetchParams, SorterResult } from '../types/table';\nimport type { PaginationProps } from '../types/pagination';\nimport { ref, unref, ComputedRef, computed, onMounted, watch, reactive, Ref, watchEffect } from 'vue';\nimport { useTimeoutFn } from '/@/hooks/core/useTimeout';\nimport { buildUUID } from '/@/utils/uuid';\nimport { isFunction, isBoolean } from '/@/utils/is';\nimport { get, cloneDeep } from 'lodash-es';\nimport { FETCH_SETTING, ROW_KEY, PAGE_SIZE } from '../const';\n\ninterface ActionType {\n  getPaginationInfo: ComputedRef<boolean | PaginationProps>;\n  setPagination: (info: Partial<PaginationProps>) => void;\n  setLoading: (loading: boolean) => void;\n  // 代码逻辑说明: 由于 getFieldsValue 返回的不是逗号分割的数据，所以改用 validate\n  validate: () => Recordable;\n  clearSelectedRowKeys: () => void;\n  tableData: Ref<Recordable[]>;\n}\n\ninterface SearchState {\n  sortInfo: Recordable;\n  filterInfo: Record<string, string[]>;\n}\nexport function useDataSource(\n  propsRef: ComputedRef<BasicTableProps>,\n  { getPaginationInfo, setPagination, setLoading, validate, clearSelectedRowKeys, tableData }: ActionType,\n  emit: EmitType\n) {\n  const searchState = reactive<SearchState>({\n    sortInfo: {},\n    filterInfo: {},\n  });\n  const dataSourceRef = ref<Recordable[]>([]);\n  const rawDataSourceRef = ref<Recordable>({});\n\n  watchEffect(() => {\n    tableData.value = unref(dataSourceRef);\n  });\n\n  watch(\n    () => unref(propsRef).dataSource,\n    () => {\n      const { dataSource, api } = unref(propsRef);\n      !api && dataSource && (dataSourceRef.value = dataSource);\n    },\n    {\n      immediate: true,\n    }\n  );\n\n  function handleTableChange(pagination: PaginationProps, filters: Partial<Recordable<string[]>>, sorter: SorterResult) {\n    const { clearSelectOnPageChange, sortFn, filterFn } = unref(propsRef);\n    if (clearSelectOnPageChange) {\n      clearSelectedRowKeys();\n    }\n    setPagination(pagination);\n\n    const params: Recordable = {};\n    if (sorter && isFunction(sortFn)) {\n      const sortInfo = sortFn(sorter);\n      searchState.sortInfo = sortInfo;\n      params.sortInfo = sortInfo;\n    }\n\n    if (filters && isFunction(filterFn)) {\n      const filterInfo = filterFn(filters);\n      searchState.filterInfo = filterInfo;\n      params.filterInfo = filterInfo;\n    }\n    fetch(params);\n  }\n\n  function setTableKey(items: any[]) {\n    if (!items || !Array.isArray(items)) return;\n    items.forEach((item) => {\n      if (!item[ROW_KEY]) {\n        item[ROW_KEY] = buildUUID();\n      }\n      if (item.children && item.children.length) {\n        setTableKey(item.children);\n      }\n    });\n  }\n\n  const getAutoCreateKey = computed(() => {\n    return unref(propsRef).autoCreateKey && !unref(propsRef).rowKey;\n  });\n\n  const getRowKey = computed(() => {\n    const { rowKey } = unref(propsRef);\n    return unref(getAutoCreateKey) ? ROW_KEY : rowKey;\n  });\n\n  const getDataSourceRef = computed(() => {\n    const dataSource = unref(dataSourceRef);\n    if (!dataSource || dataSource.length === 0) {\n      return unref(dataSourceRef);\n    }\n    if (unref(getAutoCreateKey)) {\n      const firstItem = dataSource[0];\n      const lastItem = dataSource[dataSource.length - 1];\n\n      if (firstItem && lastItem) {\n        if (!firstItem[ROW_KEY] || !lastItem[ROW_KEY]) {\n          const data = cloneDeep(unref(dataSourceRef));\n          data.forEach((item) => {\n            if (!item[ROW_KEY]) {\n              item[ROW_KEY] = buildUUID();\n            }\n            if (item.children && item.children.length) {\n              setTableKey(item.children);\n            }\n          });\n          dataSourceRef.value = data;\n        }\n      }\n    }\n    return unref(dataSourceRef);\n  });\n\n  async function updateTableData(index: number, key: string, value: any) {\n    const record = dataSourceRef.value[index];\n    if (record) {\n      dataSourceRef.value[index][key] = value;\n    }\n    return dataSourceRef.value[index];\n  }\n\n  function updateTableDataRecord(rowKey: string | number, record: Recordable): Recordable | undefined {\n    const row = findTableDataRecord(rowKey);\n\n    if (row) {\n      for (const field in row) {\n        if (Reflect.has(record, field)) row[field] = record[field];\n        // 代码逻辑说明: 【TV360X-437】树表 部分组件编辑完后，列表未刷新---\n        if (Reflect.has(record, field + '_dictText')) {\n          row[field + '_dictText'] = record[field + '_dictText'];\n        }\n      }\n      return row;\n    }\n  }\n  function deleteTableDataRecord(rowKey: string | number | string[] | number[]) {\n    if (!dataSourceRef.value || dataSourceRef.value.length == 0) return;\n    const rowKeyName = unref(getRowKey);\n    if (!rowKeyName) return;\n    const rowKeys = !Array.isArray(rowKey) ? [rowKey] : rowKey;\n    for (const key of rowKeys) {\n      let index: number | undefined = dataSourceRef.value.findIndex((row) => {\n        let targetKeyName: string;\n        if (typeof rowKeyName === 'function') {\n          targetKeyName = rowKeyName(row);\n        } else {\n          targetKeyName = rowKeyName as string;\n        }\n        return row[targetKeyName] === key;\n      });\n      if (index >= 0) {\n        dataSourceRef.value.splice(index, 1);\n      }\n      index = unref(propsRef).dataSource?.findIndex((row) => {\n        let targetKeyName: string;\n        if (typeof rowKeyName === 'function') {\n          targetKeyName = rowKeyName(row);\n        } else {\n          targetKeyName = rowKeyName as string;\n        }\n        return row[targetKeyName] === key;\n      });\n      if (typeof index !== 'undefined' && index !== -1) unref(propsRef).dataSource?.splice(index, 1);\n    }\n    setPagination({\n      total: unref(propsRef).dataSource?.length,\n    });\n  }\n\n  function insertTableDataRecord(record: Recordable, index: number): Recordable | undefined {\n    // if (!dataSourceRef.value || dataSourceRef.value.length == 0) return;\n    index = index ?? dataSourceRef.value?.length;\n    unref(dataSourceRef).splice(index, 0, record);\n    return unref(dataSourceRef);\n  }\n  function findTableDataRecord(rowKey: string | number) {\n    if (!dataSourceRef.value || dataSourceRef.value.length == 0) return;\n\n    const rowKeyName = unref(getRowKey);\n    if (!rowKeyName) return;\n\n    const { childrenColumnName = 'children' } = unref(propsRef);\n\n    const findRow = (array: any[]) => {\n      let ret;\n      array.some(function iter(r) {\n        if (typeof rowKeyName === 'function') {\n          if ((rowKeyName(r) as string) === rowKey) {\n            ret = r;\n            return true;\n          }\n        } else {\n          if (Reflect.has(r, rowKeyName) && r[rowKeyName] === rowKey) {\n            ret = r;\n            return true;\n          }\n        }\n        return r[childrenColumnName] && r[childrenColumnName].some(iter);\n      });\n      return ret;\n    };\n\n    // const row = dataSourceRef.value.find(r => {\n    //   if (typeof rowKeyName === 'function') {\n    //     return (rowKeyName(r) as string) === rowKey\n    //   } else {\n    //     return Reflect.has(r, rowKeyName) && r[rowKeyName] === rowKey\n    //   }\n    // })\n    return findRow(dataSourceRef.value);\n  }\n\n  async function fetch(opt?: FetchParams) {\n    const { api, searchInfo, defSort, fetchSetting, beforeFetch, afterFetch, useSearchForm, pagination } = unref(propsRef);\n    if (!api || !isFunction(api)) return;\n    try {\n      setLoading(true);\n      const { pageField, sizeField, listField, totalField } = Object.assign({}, FETCH_SETTING, fetchSetting);\n      let pageParams: Recordable = {};\n\n      const { current = 1, pageSize = PAGE_SIZE } = unref(getPaginationInfo) as PaginationProps;\n\n      if ((isBoolean(pagination) && !pagination) || isBoolean(getPaginationInfo)) {\n        pageParams = {};\n      } else {\n        pageParams[pageField] = (opt && opt.page) || current;\n        pageParams[sizeField] = pageSize;\n      }\n\n      const { sortInfo = {}, filterInfo } = searchState;\n\n      // 扩展默认排序多字段数组写法\n      let defSortInfo: Recordable<any> | undefined = {};\n      if (defSort && Array.isArray(defSort) && defSort.length > 0) {\n        defSortInfo['defSortString'] = JSON.stringify(defSort);\n      } else {\n        defSortInfo = defSort;\n      }\n\n      let params: Recordable = {\n        ...pageParams,\n        // 由于 getFieldsValue 返回的不是逗号分割的数据，所以改用 validate\n        ...(useSearchForm ? await validate() : {}),\n        ...searchInfo,\n        ...defSortInfo,\n        ...(opt?.searchInfo ?? {}),\n        ...sortInfo,\n        ...filterInfo,\n        ...(opt?.sortInfo ?? {}),\n        ...(opt?.filterInfo ?? {}),\n      };\n      if (beforeFetch && isFunction(beforeFetch)) {\n        params = (await beforeFetch(params)) || params;\n      }\n      // 代码逻辑说明: 【QQYUN-8316】table查询条件,请求剔除空字符串字段\n      for (let item of Object.entries(params)) {\n        const [key, val] = item;\n        if (val === '') {\n          delete params[key];\n        };\n      };\n      const res = await api(params);\n      rawDataSourceRef.value = res;\n\n      const isArrayResult = Array.isArray(res);\n\n      let resultItems: Recordable[] = isArrayResult ? res : get(res, listField);\n      const resultTotal: number = isArrayResult ? 0 : get(res, totalField);\n\n      // 假如数据变少，导致总页数变少并小于当前选中页码，通过getPaginationRef获取到的页码是不正确的，需获取正确的页码再次执行\n      if (resultTotal) {\n        const currentTotalPage = Math.ceil(Number(resultTotal) / pageSize);\n        if (current > currentTotalPage) {\n          setPagination({\n            current: currentTotalPage,\n          });\n          return await fetch(opt);\n        }\n      }\n\n      if (afterFetch && isFunction(afterFetch)) {\n        resultItems = (await afterFetch(resultItems)) || resultItems;\n      }\n      dataSourceRef.value = resultItems;\n      setPagination({\n        total: Number(resultTotal) || 0,\n      });\n      if (opt && opt.page) {\n        setPagination({\n          current: opt.page || 1,\n        });\n      }\n      emit('fetch-success', {\n        items: unref(resultItems),\n        total: Number(resultTotal),\n      });\n      return resultItems;\n    } catch (error) {\n      emit('fetch-error', error);\n      dataSourceRef.value = [];\n      setPagination({\n        total: 0,\n      });\n    } finally {\n      setLoading(false);\n    }\n  }\n\n  function setTableData<T = Recordable>(values: T[]) {\n    dataSourceRef.value = values;\n  }\n\n  function getDataSource<T = Recordable>() {\n    return getDataSourceRef.value as T[];\n  }\n\n  function getRawDataSource<T = Recordable>() {\n    return rawDataSourceRef.value as T;\n  }\n\n  async function reload(opt?: FetchParams) {\n    return await fetch(opt);\n  }\n\n  onMounted(() => {\n    useTimeoutFn(() => {\n      unref(propsRef).immediate && fetch();\n    }, 16);\n  });\n\n  return {\n    getDataSourceRef,\n    getDataSource,\n    getRawDataSource,\n    getRowKey,\n    setTableData,\n    getAutoCreateKey,\n    fetch,\n    reload,\n    updateTableData,\n    updateTableDataRecord,\n    deleteTableDataRecord,\n    insertTableDataRecord,\n    findTableDataRecord,\n    handleTableChange,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/hooks/useLoading.ts",
    "content": "import { ref, ComputedRef, unref, computed, watch } from 'vue';\nimport type { BasicTableProps } from '../types/table';\n\nexport function useLoading(props: ComputedRef<BasicTableProps>) {\n  const loadingRef = ref(unref(props).loading);\n\n  watch(\n    () => unref(props).loading,\n    (loading) => {\n      loadingRef.value = loading;\n    }\n  );\n\n  const getLoading = computed(() => unref(loadingRef));\n\n  function setLoading(loading: boolean) {\n    loadingRef.value = loading;\n  }\n\n  return { getLoading, setLoading };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/hooks/usePagination.tsx",
    "content": "import type { PaginationProps } from '../types/pagination';\nimport type { BasicTableProps } from '../types/table';\nimport { computed, unref, ref, ComputedRef, watch } from 'vue';\nimport { LeftOutlined, RightOutlined } from '@ant-design/icons-vue';\nimport { isBoolean } from '/@/utils/is';\nimport { PAGE_SIZE, PAGE_SIZE_OPTIONS } from '../const';\nimport { useI18n } from '/@/hooks/web/useI18n';\n\ninterface ItemRender {\n  page: number;\n  type: 'page' | 'prev' | 'next';\n  originalElement: any;\n}\n\nfunction itemRender({ page, type, originalElement }: ItemRender) {\n  if (type === 'prev') {\n    return page === 0 ? null : <LeftOutlined />;\n  } else if (type === 'next') {\n    return page === 1 ? null : <RightOutlined />;\n  }\n  return originalElement;\n}\n\nexport function usePagination(refProps: ComputedRef<BasicTableProps>) {\n  const { t } = useI18n();\n\n  const configRef = ref<PaginationProps>({});\n  const show = ref(true);\n\n  watch(\n    () => unref(refProps).pagination,\n    (pagination) => {\n      if (!isBoolean(pagination) && pagination) {\n        configRef.value = {\n          ...unref(configRef),\n          ...(pagination ?? {}),\n        };\n      }\n    }\n  );\n\n  const getPaginationInfo = computed((): PaginationProps | boolean => {\n    const { pagination } = unref(refProps);\n\n    if (!unref(show) || (isBoolean(pagination) && !pagination)) {\n      return false;\n    }\n\n    return {\n      current: 1,\n      pageSize: PAGE_SIZE,\n      size: 'small',\n      defaultPageSize: PAGE_SIZE,\n      showTotal: (total) => t('component.table.total', { total }),\n      showSizeChanger: true,\n      pageSizeOptions: PAGE_SIZE_OPTIONS,\n      itemRender: itemRender,\n      showQuickJumper: true,\n      ...(isBoolean(pagination) ? {} : pagination),\n      ...unref(configRef),\n    };\n  });\n\n  function setPagination(info: Partial<PaginationProps>) {\n    const paginationInfo = unref(getPaginationInfo);\n    configRef.value = {\n      ...(!isBoolean(paginationInfo) ? paginationInfo : {}),\n      ...info,\n    };\n  }\n\n  function getPagination() {\n    return unref(getPaginationInfo);\n  }\n\n  function getShowPagination() {\n    return unref(show);\n  }\n\n  async function setShowPagination(flag: boolean) {\n    show.value = flag;\n  }\n\n  return { getPagination, getPaginationInfo, setShowPagination, getShowPagination, setPagination };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/hooks/useRowSelection.ts",
    "content": "import { isFunction } from '/@/utils/is';\nimport type { BasicTableProps, TableRowSelection } from '../types/table';\nimport { computed, ComputedRef, nextTick, Ref, ref, toRaw, unref, watch } from 'vue';\nimport { ROW_KEY } from '../const';\nimport { omit } from 'lodash-es';\nimport { findNodeAll } from '/@/utils/helper/treeHelper';\n\nexport function useRowSelection(propsRef: ComputedRef<BasicTableProps>, tableData: Ref<Recordable[]>, emit: EmitType) {\n  const selectedRowKeysRef = ref<string[]>([]);\n  const selectedRowRef = ref<Recordable[]>([]);\n\n  const getRowSelectionRef = computed((): TableRowSelection | null => {\n    const { rowSelection } = unref(propsRef);\n    if (!rowSelection) {\n      return null;\n    }\n\n    return {\n      // AntDV3.0 之后使用远程加载数据进行分页时，\n      // 默认会清空上一页选择的行数据（导致无法跨页选择），\n      // 将此属性设置为 true 即可解决。\n      preserveSelectedRowKeys: true,\n      selectedRowKeys: unref(selectedRowKeysRef),\n      onChange: (selectedRowKeys: string[]) => {\n        setSelectedRowKeys(selectedRowKeys);\n      },\n      ...omit(rowSelection, ['onChange']),\n    };\n  });\n\n  watch(\n    () => unref(propsRef).rowSelection?.selectedRowKeys,\n    (v: string[]) => {\n      setSelectedRowKeys(v);\n    }\n  );\n\n  watch(\n    () => unref(selectedRowKeysRef),\n    () => {\n      nextTick(() => {\n        const { rowSelection } = unref(propsRef);\n        if (rowSelection) {\n          const { onChange } = rowSelection;\n          if (onChange && isFunction(onChange)) onChange(getSelectRowKeys(), getSelectRows());\n        }\n        //table行选择时卡顿明显 #503\n        if (unref(tableData).length > 0) {\n          emit('selection-change', {\n            keys: getSelectRowKeys(),\n            rows: getSelectRows(),\n          });\n        }\n      });\n    },\n    { deep: true }\n  );\n\n  const getAutoCreateKey = computed(() => {\n    return unref(propsRef).autoCreateKey && !unref(propsRef).rowKey;\n  });\n\n  const getRowKey = computed(() => {\n    const { rowKey } = unref(propsRef);\n    return unref(getAutoCreateKey) ? ROW_KEY : rowKey;\n  });\n\n  function setSelectedRowKeys(rowKeys: string[]) {\n    selectedRowKeysRef.value = rowKeys;\n    const allSelectedRows = findNodeAll(\n      toRaw(unref(tableData)).concat(toRaw(unref(selectedRowRef))),\n      (item) => rowKeys.includes(item[unref(getRowKey) as string]),\n      {\n        children: propsRef.value.childrenColumnName ?? 'children',\n      }\n    );\n    const trueSelectedRows: any[] = [];\n    rowKeys.forEach((key: string) => {\n      const found = allSelectedRows.find((item) => item[unref(getRowKey) as string] === key);\n      found && trueSelectedRows.push(found);\n    });\n    selectedRowRef.value = trueSelectedRows;\n  }\n\n  function setSelectedRows(rows: Recordable[]) {\n    selectedRowRef.value = rows;\n  }\n\n  function clearSelectedRowKeys() {\n    selectedRowRef.value = [];\n    selectedRowKeysRef.value = [];\n  }\n\n  function deleteSelectRowByKey(key: string) {\n    const selectedRowKeys = unref(selectedRowKeysRef);\n    const index = selectedRowKeys.findIndex((item) => item === key);\n    if (index !== -1) {\n      unref(selectedRowKeysRef).splice(index, 1);\n    }\n  }\n\n  function getSelectRowKeys() {\n    return unref(selectedRowKeysRef);\n  }\n\n  function getSelectRows<T = Recordable>() {\n    // const ret = toRaw(unref(selectedRowRef)).map((item) => toRaw(item));\n    return unref(selectedRowRef) as T[];\n  }\n\n  function getRowSelection() {\n    return unref(getRowSelectionRef)!;\n  }\n\n  return {\n    getRowSelection,\n    getRowSelectionRef,\n    getSelectRows,\n    getSelectRowKeys,\n    setSelectedRowKeys,\n    clearSelectedRowKeys,\n    deleteSelectRowByKey,\n    setSelectedRows,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/hooks/useTable.ts",
    "content": "import type { BasicTableProps, TableActionType, FetchParams, BasicColumn } from '../types/table';\nimport type { PaginationProps } from '../types/pagination';\nimport type { DynamicProps } from '/#/utils';\nimport type { FormActionType } from '/@/components/Form';\nimport type { WatchStopHandle } from 'vue';\nimport { getDynamicProps } from '/@/utils';\nimport { ref, onUnmounted, unref, watch, toRaw } from 'vue';\nimport { isProdMode } from '/@/utils/env';\nimport { error } from '/@/utils/log';\n\ntype Props = Partial<DynamicProps<BasicTableProps>>;\n\ntype UseTableMethod = TableActionType & {\n  getForm: () => FormActionType;\n};\n\nexport function useTable(tableProps?: Props): [\n  (instance: TableActionType, formInstance: UseTableMethod) => void,\n  TableActionType & {\n    getForm: () => FormActionType;\n  }\n] {\n  const tableRef = ref<Nullable<TableActionType>>(null);\n  const loadedRef = ref<Nullable<boolean>>(false);\n  const formRef = ref<Nullable<UseTableMethod>>(null);\n\n  let stopWatch: WatchStopHandle;\n\n  function register(instance: TableActionType, formInstance: UseTableMethod) {\n    isProdMode() &&\n      onUnmounted(() => {\n        tableRef.value = null;\n        loadedRef.value = null;\n      });\n\n    if (unref(loadedRef) && isProdMode() && instance === unref(tableRef)) return;\n\n    tableRef.value = instance;\n    formRef.value = formInstance;\n    tableProps && instance.setProps(getDynamicProps(tableProps));\n    loadedRef.value = true;\n\n    stopWatch?.();\n\n    stopWatch = watch(\n      () => tableProps,\n      () => {\n        tableProps && instance.setProps(getDynamicProps(tableProps));\n      },\n      {\n        immediate: true,\n        deep: true,\n      }\n    );\n  }\n\n  function getTableInstance(): TableActionType {\n    const table = unref(tableRef);\n    if (!table) {\n      error('The table instance has not been obtained yet, please make sure the table is presented when performing the table operation!');\n    }\n    return table as TableActionType;\n  }\n  \n  function getTableRef(){\n    return tableRef;\n  }\n\n  const methods: TableActionType & {\n    getForm: () => FormActionType;\n  } & {\n    getTableRef: () => any;\n  } = {\n    reload: async (opt?: FetchParams) => {\n      return await getTableInstance().reload(opt);\n    },\n    setProps: (props: Partial<BasicTableProps>) => {\n      getTableInstance().setProps(props);\n    },\n    redoHeight: () => {\n      getTableInstance().redoHeight();\n    },\n    setLoading: (loading: boolean) => {\n      getTableInstance().setLoading(loading);\n    },\n    getDataSource: () => {\n      return getTableInstance().getDataSource();\n    },\n    getRawDataSource: () => {\n      return getTableInstance().getRawDataSource();\n    },\n    getColumns: ({ ignoreIndex = false }: { ignoreIndex?: boolean } = {}) => {\n      const columns = getTableInstance().getColumns({ ignoreIndex }) || [];\n      return toRaw(columns);\n    },\n    setColumns: (columns: BasicColumn[]) => {\n      getTableInstance().setColumns(columns);\n    },\n    setTableData: (values: any[]) => {\n      return getTableInstance().setTableData(values);\n    },\n    setPagination: (info: Partial<PaginationProps>) => {\n      return getTableInstance().setPagination(info);\n    },\n    deleteSelectRowByKey: (key: string) => {\n      getTableInstance().deleteSelectRowByKey(key);\n    },\n    getSelectRowKeys: () => {\n      return toRaw(getTableInstance().getSelectRowKeys());\n    },\n    getSelectRows: () => {\n      return toRaw(getTableInstance().getSelectRows());\n    },\n    clearSelectedRowKeys: () => {\n      getTableInstance().clearSelectedRowKeys();\n    },\n    setSelectedRowKeys: (keys: string[] | number[]) => {\n      getTableInstance().setSelectedRowKeys(keys);\n    },\n    getPaginationRef: () => {\n      return getTableInstance().getPaginationRef();\n    },\n    getSize: () => {\n      return toRaw(getTableInstance().getSize());\n    },\n    updateTableData: (index: number, key: string, value: any) => {\n      return getTableInstance().updateTableData(index, key, value);\n    },\n    deleteTableDataRecord: (rowKey: string | number | string[] | number[]) => {\n      return getTableInstance().deleteTableDataRecord(rowKey);\n    },\n    insertTableDataRecord: (record: Recordable | Recordable[], index?: number) => {\n      return getTableInstance().insertTableDataRecord(record, index);\n    },\n    updateTableDataRecord: (rowKey: string | number, record: Recordable) => {\n      return getTableInstance().updateTableDataRecord(rowKey, record);\n    },\n    findTableDataRecord: (rowKey: string | number) => {\n      return getTableInstance().findTableDataRecord(rowKey);\n    },\n    getRowSelection: () => {\n      return toRaw(getTableInstance().getRowSelection());\n    },\n    getCacheColumns: () => {\n      return toRaw(getTableInstance().getCacheColumns());\n    },\n    getForm: () => {\n      return unref(formRef) as unknown as FormActionType;\n    },\n    setShowPagination: async (show: boolean) => {\n      getTableInstance().setShowPagination(show);\n    },\n    getShowPagination: () => {\n      return toRaw(getTableInstance().getShowPagination());\n    },\n    expandAll: () => {\n      getTableInstance().expandAll();\n    },\n    collapseAll: () => {\n      getTableInstance().collapseAll();\n    },\n    getTableRef: () => {\n      return getTableRef();\n    }\n  };\n\n  return [register, methods];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/hooks/useTableContext.ts",
    "content": "import type { Ref } from 'vue';\nimport type { BasicTableProps, TableActionType } from '../types/table';\nimport { provide, inject, ComputedRef } from 'vue';\n\n// 为每个表格实例创建唯一的 Symbol key，避免父子组件或同级组件间的 context 冲突\n// Vue 的 provide/inject 是按组件树传递的，使用唯一 Symbol 可以确保每个 BasicTable 实例独立\nlet tableIdCounter = 0;\n\ntype Instance = TableActionType & {\n  wrapRef: Ref<Nullable<HTMLElement>>;\n  getBindValues: ComputedRef<Recordable>;\n};\n\ntype RetInstance = Omit<Instance, 'getBindValues'> & {\n  getBindValues: ComputedRef<BasicTableProps>;\n};\n\nexport function createTableContext(instance: Instance) {\n  // 每次创建 context 时都生成新的唯一 Symbol\n  const key = Symbol(`basic-table-${++tableIdCounter}`);\n  provide(key, instance);\n  // 同时提供一个内部标记，让子组件能获取到这个 key\n  provide('__BASIC_TABLE_CONTEXT_KEY__', key);\n}\n\nexport function useTableContext(): RetInstance {\n  // 从最近的父组件获取 context key\n  const key = inject<symbol>('__BASIC_TABLE_CONTEXT_KEY__');\n  if (!key) {\n    throw new Error('useTableContext must be used after createTableContext');\n  }\n  return inject(key) as RetInstance;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/hooks/useTableExpand.ts",
    "content": "import type { ComputedRef, Ref } from 'vue';\nimport type { BasicTableProps } from '../types/table';\nimport { computed, unref, ref, toRaw, watch } from 'vue';\nimport { ROW_KEY } from '../const';\n\nexport function useTableExpand(propsRef: ComputedRef<BasicTableProps>, tableData: Ref<Recordable[]>, emit: EmitType) {\n  const expandedRowKeys = ref<string[]>([]);\n\n  const getAutoCreateKey = computed(() => {\n    return unref(propsRef).autoCreateKey && !unref(propsRef).rowKey;\n  });\n\n  const getRowKey = computed(() => {\n    const { rowKey } = unref(propsRef);\n    return unref(getAutoCreateKey) ? ROW_KEY : rowKey;\n  });\n\n  const getExpandOption = computed(() => {\n    const { isTreeTable } = unref(propsRef);\n    if (!isTreeTable) return {};\n\n    return {\n      expandedRowKeys: unref(expandedRowKeys),\n      onExpandedRowsChange: (keys: string[]) => {\n        expandedRowKeys.value = keys;\n        emit('expanded-rows-change', keys);\n      },\n    };\n  });\n\n  // 监听并同步props中的expandedRowKeys\n  watch(() => propsRef.value?.expandedRowKeys, (keys) => {\n    if (Array.isArray(keys)) {\n      expandedRowKeys.value = keys;\n    }\n  }, {immediate: true});\n\n  function expandAll() {\n    const keys = getAllKeys();\n    expandedRowKeys.value = keys;\n  }\n\n  function getAllKeys(data?: Recordable[]) {\n    const keys: string[] = [];\n    const { childrenColumnName } = unref(propsRef);\n    toRaw(data || unref(tableData)).forEach((item) => {\n      keys.push(item[unref(getRowKey) as string]);\n      const children = item[childrenColumnName || 'children'];\n      if (children?.length) {\n        keys.push(...getAllKeys(children));\n      }\n    });\n    return keys;\n  }\n\n  function collapseAll() {\n    expandedRowKeys.value = [];\n  }\n\n  return { getExpandOption, expandAll, collapseAll };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/hooks/useTableFooter.ts",
    "content": "import type { ComputedRef, Ref, Slots } from 'vue';\nimport type { BasicTableProps } from '../types/table';\nimport { unref, computed, h, nextTick, watchEffect } from 'vue';\nimport TableFooter from '../components/TableFooter.vue';\nimport { useEventListener } from '/@/hooks/event/useEventListener';\n\nexport function useTableFooter(\n  propsRef: ComputedRef<BasicTableProps>,\n  slots: Slots,\n  scrollRef: ComputedRef<{\n    x: string | number | true;\n    y: Nullable<number>;\n    scrollToFirstRowOnChange: boolean;\n  }>,\n  tableElRef: Ref<ComponentRef>,\n  getDataSourceRef: ComputedRef<Recordable>\n) {\n  const getIsEmptyData = computed(() => {\n    return (unref(getDataSourceRef) || []).length === 0;\n  });\n\n  // 是否有展开行\n  const hasExpandedRow = computed(() => Object.keys(slots).includes('expandedRowRender'))\n\n  const getFooterProps = computed((): Recordable | undefined => {\n    const { summaryFunc, showSummary, summaryData, bordered } = unref(propsRef);\n    return showSummary && !unref(getIsEmptyData) ? () => h(TableFooter, {\n      bordered,\n      summaryFunc,\n      summaryData,\n      scroll: unref(scrollRef),\n      hasExpandedRow: hasExpandedRow.value\n    }) : undefined;\n  });\n\n  watchEffect(() => {\n    handleSummary();\n  });\n\n  function handleSummary() {\n    const { showSummary, canResize } = unref(propsRef);\n    if (!showSummary || unref(getIsEmptyData)) return;\n    nextTick(() => {\n      const tableEl = unref(tableElRef);\n      if (!tableEl) return;\n      let bodyDom;\n      // 代码逻辑说明: 【issues/7422】BasicTable列表canResize属性为true时合计行不能横向滚动\n      if (canResize) {\n        setTimeout(() => {\n          bodyDom = tableEl.$el.querySelector('.ant-table-body');\n        }, 0);\n      } else {\n        bodyDom = tableEl.$el.querySelector('.ant-table-content');\n      }\n      setTimeout(() => {\n        useEventListener({\n          el: bodyDom,\n          name: 'scroll',\n          listener: () => {\n            const footerBodyDom = tableEl.$el.querySelector('.ant-table-footer .ant-table-content') as HTMLDivElement;\n            if (!footerBodyDom || !bodyDom) return;\n            footerBodyDom.scrollLeft = bodyDom.scrollLeft;\n          },\n          wait: 0,\n          options: true,\n        });\n      }, 0);\n    });\n  }\n  return { getFooterProps };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/hooks/useTableForm.ts",
    "content": "import type { ComputedRef, Slots } from 'vue';\nimport type { BasicTableProps, FetchParams } from '../types/table';\nimport { unref, computed } from 'vue';\nimport type { FormProps } from '/@/components/Form';\nimport { isFunction } from '/@/utils/is';\n\nexport function useTableForm(\n  propsRef: ComputedRef<BasicTableProps>,\n  slots: Slots,\n  fetch: (opt?: FetchParams | undefined) => Promise<void>,\n  getLoading: ComputedRef<boolean | undefined>\n) {\n  const getFormProps = computed((): Partial<FormProps> => {\n    const { formConfig } = unref(propsRef);\n    const { submitButtonOptions, autoSubmitOnEnter} = formConfig || {};\n    return {\n      showAdvancedButton: true,\n      ...formConfig,\n      submitButtonOptions: { loading: unref(getLoading), ...submitButtonOptions },\n      compact: true,\n      // 代码逻辑说明: [issues/568]设置 autoSubmitOnEnter: false 不生效 ---\n      autoSubmitOnEnter: autoSubmitOnEnter,\n    };\n  });\n\n  const getFormSlotKeys: ComputedRef<string[]> = computed(() => {\n    const keys = Object.keys(slots);\n    return keys.map((item) => (item.startsWith('form-') ? item : null)).filter((item) => !!item) as string[];\n  });\n\n  function replaceFormSlotKey(key: string) {\n    if (!key) return '';\n    return key?.replace?.(/form\\-/, '') ?? '';\n  }\n\n  function handleSearchInfoChange(info: Recordable) {\n    const { handleSearchInfoFn } = unref(propsRef);\n    if (handleSearchInfoFn && isFunction(handleSearchInfoFn)) {\n      info = handleSearchInfoFn(info) || info;\n    }\n    fetch({ searchInfo: info, page: 1 });\n  }\n\n  return {\n    getFormProps,\n    replaceFormSlotKey,\n    getFormSlotKeys,\n    handleSearchInfoChange,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/hooks/useTableHeader.ts",
    "content": "import type { ComputedRef, Slots } from 'vue';\nimport type { BasicTableProps, InnerHandlers } from '../types/table';\nimport { unref, computed, h } from 'vue';\nimport TableHeader from '../components/TableHeader.vue';\nimport { isString } from '/@/utils/is';\nimport { getSlot } from '/@/utils/helper/tsxHelper';\n\nexport function useTableHeader(propsRef: ComputedRef<BasicTableProps>, slots: Slots, handlers: InnerHandlers) {\n  const getHeaderProps = computed((): Recordable => {\n    const { title, showTableSetting, titleHelpMessage, tableSetting } = unref(propsRef);\n    const hideTitle = !slots.tableTitle && !title && !slots.toolbar && !showTableSetting;\n    if (hideTitle && !isString(title)) {\n      return {};\n    }\n\n    return {\n      title: hideTitle\n        ? null\n        : () =>\n            h(\n              TableHeader,\n              {\n                title,\n                titleHelpMessage,\n                showTableSetting,\n                tableSetting,\n                onColumnsChange: handlers.onColumnsChange,\n              } as Recordable,\n              {\n                ...(slots.toolbar\n                  ? {\n                      toolbar: () => getSlot(slots, 'toolbar'),\n                    }\n                  : {}),\n                ...(slots.tableTitle\n                  ? {\n                      tableTitle: () => getSlot(slots, 'tableTitle'),\n                    }\n                  : {}),\n                ...(slots.headerTop\n                  ? {\n                      headerTop: () => getSlot(slots, 'headerTop'),\n                    }\n                  : {}),\n                //添加tableTop插槽\n                ...(slots.tableTop\n                  ? {\n                      tableTop: () => getSlot(slots, 'tableTop'),\n                    }\n                  : {}),\n                // 添加alertAfter插槽\n                ...(slots.alertAfter ? { alertAfter: () => getSlot(slots, 'alertAfter') } : {}),\n              }\n            ),\n    };\n  });\n  return { getHeaderProps };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/hooks/useTableScroll.ts",
    "content": "import type { BasicTableProps, TableRowSelection, BasicColumn } from '../types/table';\nimport type { Ref, ComputedRef, Slots } from 'vue';\nimport { computed, unref, ref, nextTick, watch } from 'vue';\nimport { getViewportOffset } from '/@/utils/domUtils';\nimport { isBoolean } from '/@/utils/is';\nimport { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn';\nimport { useModalContext } from '/@/components/Modal';\nimport { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated';\nimport { useDebounceFn } from '@vueuse/core';\nimport componentSetting from '/@/settings/componentSetting';\n\nexport function useTableScroll(\n  propsRef: ComputedRef<BasicTableProps>,\n  tableElRef: Ref<ComponentRef>,\n  columnsRef: ComputedRef<BasicColumn[]>,\n  rowSelectionRef: ComputedRef<TableRowSelection<any> | null>,\n  getDataSourceRef: ComputedRef<Recordable[]>,\n  slots: Slots,\n  getPaginationInfo: ComputedRef<any>\n) {\n  const tableHeightRef: Ref<Nullable<number>> = ref(null);\n\n  const modalFn = useModalContext();\n\n  // Greater than animation time 280\n  const debounceRedoHeight = useDebounceFn(redoHeight, 100);\n\n  const getCanResize = computed(() => {\n    const { canResize, scroll } = unref(propsRef);\n    return canResize && !(scroll || {}).y;\n  });\n\n  watch(\n    () => [unref(getCanResize), unref(getDataSourceRef)?.length],\n    () => {\n      debounceRedoHeight();\n    },\n    {\n      flush: 'post',\n    }\n  );\n\n  function redoHeight() {\n    nextTick(() => {\n      calcTableHeight();\n    });\n  }\n\n  function setHeight(heigh: number) {\n    tableHeightRef.value = heigh;\n    //  Solve the problem of modal adaptive height calculation when the form is placed in the modal\n    modalFn?.redoModalHeight?.();\n  }\n\n  // No need to repeat queries\n  let paginationEl: HTMLElement | null;\n  let footerEl: HTMLElement | null;\n  let bodyEl: HTMLElement | null;\n\n  async function calcTableHeight() {\n    const { resizeHeightOffset, pagination, maxHeight, minHeight } = unref(propsRef);\n    const tableData = unref(getDataSourceRef);\n\n    const table = unref(tableElRef);\n    if (!table) return;\n\n    const tableEl: Element = table.$el;\n    if (!tableEl) return;\n\n    if (!bodyEl) {\n      // 代码逻辑说明: issues/355 前端-jeecgboot-vue3 3.4.4版本,BasicTable高度自适应功能失效,设置BasicTable组件maxHeight失效; 原因已找到,请看详情\n      bodyEl = tableEl.querySelector('.ant-table-tbody');\n      if (!bodyEl) return;\n    }\n\n    const hasScrollBarY = bodyEl.scrollHeight > bodyEl.clientHeight;\n    const hasScrollBarX = bodyEl.scrollWidth > bodyEl.clientWidth;\n\n    if (hasScrollBarY) {\n      tableEl.classList.contains('hide-scrollbar-y') && tableEl.classList.remove('hide-scrollbar-y');\n    } else {\n      !tableEl.classList.contains('hide-scrollbar-y') && tableEl.classList.add('hide-scrollbar-y');\n    }\n\n    if (hasScrollBarX) {\n      tableEl.classList.contains('hide-scrollbar-x') && tableEl.classList.remove('hide-scrollbar-x');\n    } else {\n      !tableEl.classList.contains('hide-scrollbar-x') && tableEl.classList.add('hide-scrollbar-x');\n    }\n\n    bodyEl!.style.height = 'unset';\n\n    if (!unref(getCanResize) || ( !tableData || tableData.length === 0)) return;\n\n    await nextTick();\n    //Add a delay to get the correct bottomIncludeBody paginationHeight footerHeight headerHeight\n\n    const headEl = tableEl.querySelector('.ant-table-thead');\n\n    if (!headEl) return;\n\n    // Table height from bottom\n    const { bottomIncludeBody } = getViewportOffset(headEl);\n    // Table height from bottom height-custom offset\n\n    const paddingHeight = 32;\n    // Pager height\n    let paginationHeight = 2;\n    // 【issues/9217】当配置了pagination: true时,BasicTable组件自适应高度异常\n    if (pagination !== false) {\n      paginationEl = tableEl.querySelector('.ant-pagination') as HTMLElement;\n      if (paginationEl) {\n        const offsetHeight = paginationEl.offsetHeight;\n        paginationHeight += offsetHeight || 0;\n      } else {\n        // TODO First fix 24\n        paginationHeight += 24;\n      }\n    } else {\n      paginationHeight = -8;\n    }\n\n    let footerHeight = 0;\n    // 代码逻辑说明: 【issues/1137】BasicTable自适应高度计算没有减去尾部高度\n    footerEl = tableEl.querySelector('.ant-table-footer');\n    if (footerEl) {\n      const offsetHeight = footerEl.offsetHeight;\n      footerHeight = offsetHeight || 0;\n    }\n\n    let headerHeight = 0;\n    if (headEl) {\n      headerHeight = (headEl as HTMLElement).offsetHeight;\n    }\n\n    let height = bottomIncludeBody - (resizeHeightOffset || 0) - paddingHeight - paginationHeight - footerHeight - headerHeight;\n    // update-begin--author:liaozhiyang---date:20240603---for【TV360X-861】列表查询区域不可往上滚动\n    // 10+6(外层边距padding:10 + 内层padding-bottom:6)\n    height -= 16;\n    // 代码逻辑说明: 【issues/8880】BasicTable组件在modal中适应高度\n    try {\n      // 当BasicTable在BasicModal容器中时,扣减容器底部高度\n      const modalFooter = tableEl.closest('.ant-modal-root')?.querySelector('.ant-modal-footer');\n      if (modalFooter) {\n        const { bottomIncludeBody: modalFooterHeight } = getViewportOffset(modalFooter);\n        height = height - modalFooterHeight;\n      }\n    } catch (e) {}\n    height = (height < minHeight! ? (minHeight as number) : height) ?? height;\n    height = (height > maxHeight! ? (maxHeight as number) : height) ?? height;\n    setHeight(height);\n\n    bodyEl!.style.height = `${height}px`;\n    // update-begin--author:liaozhiyang---date:20240609---for【issues/8374】分页始终显示在底部\n    nextTick(() => {\n      if (maxHeight === undefined) {\n        if (unref(getPaginationInfo) && unref(getDataSourceRef).length) {\n          const pageSize = unref(getPaginationInfo)?.pageSize;\n          const current = unref(getPaginationInfo)?.current;\n          const total = unref(getPaginationInfo)?.total;\n          const tableBody = tableEl.querySelector('.ant-table-body') as HTMLElement;\n          const tr = tableEl.querySelector('.ant-table-tbody')?.children ?? [];\n          const lastrEl = tr[tr.length - 1] as HTMLElement;\n          const trHeight = lastrEl.offsetHeight;\n          const dataHeight = trHeight * pageSize;\n          if (tableBody && lastrEl) {\n            // table是否隐藏（隐藏的table不能吸底）\n            const isTableBodyHide = tableBody.offsetHeight == 0 && tableBody.offsetWidth == 0;\n            if (isTableBodyHide) {\n              return;\n            }\n            if (current === 1 && pageSize > unref(getDataSourceRef).length && total <= pageSize) {\n              tableBody.style.height = `${height}px`;\n            } else {\n              tableBody.style.height = `${dataHeight < height ? dataHeight : height}px`;\n            }\n          }\n        }\n      }\n    });\n    // update-end--author:liaozhiyang---date:20240609---for【issues/8374】分页始终显示在底部\n  }\n  useWindowSizeFn(calcTableHeight, 280);\n  onMountedOrActivated(() => {\n    calcTableHeight();\n    nextTick(() => {\n      debounceRedoHeight();\n    });\n  });\n\n  const getScrollX = computed(() => {\n    let width = 0;\n    // if (unref(rowSelectionRef)) {\n    //   width += 60;\n    // }\n    // 代码逻辑说明: 【issues/5411】BasicTable 配置maxColumnWidth 未生效\n    const { maxColumnWidth } = unref(propsRef);\n    // TODO props ?? 0;\n    const NORMAL_WIDTH = maxColumnWidth ?? 150;\n    // date-begin--author:liaozhiyang---date:20250716---for：【QQYUN-13122】有数十个字段时只展示2个字段，其余字段为ifShow:false会有滚动条\n    const columns = unref(columnsRef).filter((item) => !(item.defaultHidden == true || item.ifShow == false))\n    // date-end--author:liaozhiyang---date:20250716---for：【QQYUN-13122】有数十个字段时只展示2个字段，其余字段为ifShow:false会有滚动条\n    columns.forEach((item) => {\n      width += Number.parseInt(item.width as string) || 0;\n    });\n    const unsetWidthColumns = columns.filter((item) => !Reflect.has(item, 'width'));\n\n    const len = unsetWidthColumns.length;\n    if (len !== 0) {\n      width += len * NORMAL_WIDTH;\n    }\n    // 代码逻辑说明: 【TV360X-116】内嵌风格字段较多时表格错位\n    if (slots.expandedRowRender) {\n      width += propsRef.value.expandColumnWidth;\n    }\n    const table = unref(tableElRef);\n    const tableWidth = table?.$el?.offsetWidth ?? 0;\n    return tableWidth > width ? '100%' : width;\n  });\n\n  const getScrollRef = computed(() => {\n    const tableHeight = unref(tableHeightRef);\n    const { canResize, scroll } = unref(propsRef);\n    const { table } = componentSetting;\n    return {\n      x: unref(getScrollX),\n      y: canResize ? tableHeight : null,\n      // 代码逻辑说明: 【issues/1188】BasicTable加上scrollToFirstRowOnChange类型定义\n      scrollToFirstRowOnChange: table.scrollToFirstRowOnChange,\n      ...scroll,\n    };\n  });\n\n  return { getScrollRef, redoHeight };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/hooks/useTableStyle.ts",
    "content": "import type { ComputedRef } from 'vue';\nimport type { BasicTableProps, TableCustomRecord } from '../types/table';\nimport { unref } from 'vue';\nimport { isFunction } from '/@/utils/is';\nimport { ROW_KEY } from '/@/components/Table/src/const';\n\nexport function useTableStyle(propsRef: ComputedRef<BasicTableProps>, prefixCls: string) {\n  /**\n   * 2024-09-19\n   * liaozhiyang\n   * 【issues/7200】basicTable选中后没有选中样式\n   * */\n  const isChecked = (propsRef, record) => {\n    const getAutoCreateKey = () => {\n      return unref(propsRef).autoCreateKey && !unref(propsRef).rowKey;\n    };\n    const getRowKey = () => {\n      const { rowKey } = unref(propsRef);\n      return getAutoCreateKey() ? ROW_KEY : rowKey;\n    };\n    // 获取行的key字段数据\n    const getRecordKey = (record) => {\n      const key = getRowKey();\n      if (!key) {\n        return record[ROW_KEY];\n      } else if (isFunction(key)) {\n        return key(record);\n      } else {\n        return record[key];\n      }\n    };\n    const { rowSelection } = unref(propsRef);\n    if (rowSelection?.selectedRowKeys?.length) {\n      return rowSelection.selectedRowKeys.includes(getRecordKey(record));\n    }\n    return false;\n  };\n\n  function getRowClassName(record: TableCustomRecord, index: number) {\n    const { striped, rowClassName } = unref(propsRef);\n    const classNames: string[] = [];\n    if (striped) {\n      classNames.push((index || 0) % 2 === 1 ? `${prefixCls}-row__striped` : '');\n    }\n    if (rowClassName && isFunction(rowClassName)) {\n      classNames.push(rowClassName(record, index));\n    }\n    // 代码逻辑说明: 【issues/7200】basicTable选中后没有选中样式\n    if (isChecked(propsRef, record)) {\n      classNames.push('ant-table-row-selected');\n    }\n    return classNames.filter((cls) => !!cls).join(' ');\n  }\n\n  return { getRowClassName };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/props.ts",
    "content": "import type { PropType } from 'vue';\nimport type { PaginationProps } from './types/pagination';\nimport type { BasicColumn, FetchSetting, TableSetting, SorterResult, TableCustomRecord, TableRowSelection, SizeType } from './types/table';\nimport type { FormProps } from '/@/components/Form';\nimport { DEFAULT_FILTER_FN, DEFAULT_SORT_FN, FETCH_SETTING, DEFAULT_SIZE } from './const';\nimport { propTypes } from '/@/utils/propTypes';\n\nexport const basicProps = {\n  clickToRowSelect: propTypes.bool.def(true),\n  isTreeTable: propTypes.bool.def(false),\n  tableSetting: propTypes.shape<TableSetting>({}),\n  inset: propTypes.bool,\n  sortFn: {\n    type: Function as PropType<(sortInfo: SorterResult) => any>,\n    default: DEFAULT_SORT_FN,\n  },\n  filterFn: {\n    type: Function as PropType<(data: Partial<Recordable<string[]>>) => any>,\n    default: DEFAULT_FILTER_FN,\n  },\n  showTableSetting: propTypes.bool,\n  autoCreateKey: propTypes.bool.def(true),\n  striped: propTypes.bool.def(false),\n  showSummary: propTypes.bool,\n  summaryFunc: {\n    type: [Function, Array] as PropType<(...arg: any[]) => any[]>,\n    default: null,\n  },\n  summaryData: {\n    type: Array as PropType<Recordable[]>,\n    default: null,\n  },\n  indentSize: propTypes.number.def(24),\n  canColDrag: propTypes.bool.def(true),\n  api: {\n    type: Function as PropType<(...arg: any[]) => Promise<any>>,\n    default: null,\n  },\n  beforeFetch: {\n    type: Function as PropType<Fn>,\n    default: null,\n  },\n  afterFetch: {\n    type: Function as PropType<Fn>,\n    default: null,\n  },\n  handleSearchInfoFn: {\n    type: Function as PropType<Fn>,\n    default: null,\n  },\n  fetchSetting: {\n    type: Object as PropType<FetchSetting>,\n    default: () => {\n      return FETCH_SETTING;\n    },\n  },\n  // 立即请求接口\n  immediate: propTypes.bool.def(true),\n  emptyDataIsShowTable: propTypes.bool.def(true),\n  // 额外的请求参数\n  searchInfo: {\n    type: Object as PropType<Recordable>,\n    default: null,\n  },\n  // 默认的排序参数\n  defSort: {\n    type: Object as PropType<Recordable>,\n    default: null,\n  },\n  // 使用搜索表单\n  useSearchForm: propTypes.bool,\n  // 表单配置\n  formConfig: {\n    type: Object as PropType<Partial<FormProps>>,\n    default: null,\n  },\n  columns: {\n    type: [Array] as PropType<BasicColumn[]>,\n    default: () => [],\n  },\n  showIndexColumn: propTypes.bool.def(true),\n  indexColumnProps: {\n    type: Object as PropType<BasicColumn>,\n    default: null,\n  },\n  showActionColumn: {\n    type: Boolean,\n    default: true,\n  },\n  actionColumn: {\n    type: Object as PropType<BasicColumn>,\n    default: null,\n  },\n  ellipsis: propTypes.bool.def(true),\n  canResize: propTypes.bool.def(true),\n  clearSelectOnPageChange: propTypes.bool,\n  resizeHeightOffset: propTypes.number.def(0),\n  rowSelection: {\n    type: Object as PropType<TableRowSelection | null>,\n    default: null,\n  },\n  title: {\n    type: [String, Function] as PropType<string | ((data: Recordable) => string)>,\n    default: null,\n  },\n  titleHelpMessage: {\n    type: [String, Array] as PropType<string | string[]>,\n  },\n  minHeight: propTypes.number,\n  maxHeight: propTypes.number,\n  // 代码逻辑说明: 【TV360X-116】内嵌风格字段较多时表格错位\n  expandColumnWidth: propTypes.number.def(48),\n  // 统一设置列最大宽度\n  maxColumnWidth: propTypes.number,\n  dataSource: {\n    type: Array as PropType<Recordable[]>,\n    default: null,\n  },\n  rowKey: {\n    type: [String, Function] as PropType<string | ((record: Recordable) => string)>,\n    default: '',\n  },\n  bordered: propTypes.bool,\n  pagination: {\n    type: [Object, Boolean] as PropType<PaginationProps | boolean>,\n    default: null,\n  },\n  loading: propTypes.bool,\n  rowClassName: {\n    type: Function as PropType<(record: TableCustomRecord<any>, index: number) => string>,\n  },\n  scroll: {\n    // 代码逻辑说明: 【issues/1188】BasicTable加上scrollToFirstRowOnChange类型定义\n    type: Object as PropType<{ x?: number | true; y?: number; scrollToFirstRowOnChange?: boolean }>,\n    default: null,\n  },\n  beforeEditSubmit: {\n    type: Function as PropType<(data: { record: Recordable; index: number; key: string | number; value: any }) => Promise<any>>,\n  },\n  size: {\n    type: String as PropType<SizeType>,\n    default: DEFAULT_SIZE,\n  },\n  expandedRowKeys: {\n    type: Array,\n    default: null,\n  },\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/types/column.ts",
    "content": "import { VNodeChild } from 'vue';\n\nexport interface ColumnFilterItem {\n  text?: string;\n  value?: string;\n  children?: any;\n}\n\nexport declare type SortOrder = 'ascend' | 'descend';\n\nexport interface RecordProps<T> {\n  text: any;\n  record: T;\n  index: number;\n}\n\nexport interface FilterDropdownProps {\n  prefixCls?: string;\n  setSelectedKeys?: (selectedKeys: string[]) => void;\n  selectedKeys?: string[];\n  confirm?: () => void;\n  clearFilters?: () => void;\n  filters?: ColumnFilterItem[];\n  getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;\n  visible?: boolean;\n}\n\nexport declare type CustomRenderFunction<T> = (record: RecordProps<T>) => VNodeChild | JSX.Element;\n\nexport interface ColumnProps<T> {\n  /**\n   * specify how content is aligned\n   * @default 'left'\n   * @type string\n   */\n  align?: 'left' | 'right' | 'center';\n\n  /**\n   * ellipsize cell content, not working with sorter and filters for now.\n   * tableLayout would be fixed when ellipsis is true.\n   * @default false\n   * @type boolean\n   */\n  ellipsis?: boolean;\n\n  /**\n   * Span of this column's title\n   * @type number\n   */\n  colSpan?: number;\n\n  /**\n   * Display field of the data record, could be set like a.b.c\n   * @type string\n   */\n  dataIndex?: string;\n\n  /**\n   * Default filtered values\n   * @type string[]\n   */\n  defaultFilteredValue?: string[];\n\n  /**\n   * Default order of sorted values: 'ascend' 'descend' null\n   * @type string\n   */\n  defaultSortOrder?: SortOrder;\n\n  /**\n   * Customized filter overlay\n   * @type any (slot)\n   */\n  filterDropdown?: VNodeChild | JSX.Element | ((props: FilterDropdownProps) => VNodeChild | JSX.Element);\n\n  /**\n   * Whether filterDropdown is visible\n   * @type boolean\n   */\n  filterDropdownOpen?: boolean;\n\n  /**\n   * Whether the dataSource is filtered\n   * @default false\n   * @type boolean\n   */\n  filtered?: boolean;\n\n  /**\n   * Controlled filtered value, filter icon will highlight\n   * @type string[]\n   */\n  filteredValue?: string[];\n\n  /**\n   * Customized filter icon\n   * @default false\n   * @type any\n   */\n  filterIcon?: boolean | VNodeChild | JSX.Element;\n\n  /**\n   * Whether multiple filters can be selected\n   * @default true\n   * @type boolean\n   */\n  filterMultiple?: boolean;\n\n  /**\n   * Filter menu config\n   * @type object[]\n   */\n  filters?: ColumnFilterItem[];\n\n  /**\n   * Set column to be fixed: true(same as left) 'left' 'right'\n   * @default false\n   * @type boolean | string\n   */\n  fixed?: boolean | 'left' | 'right';\n\n  /**\n   * Unique key of this column, you can ignore this prop if you've set a unique dataIndex\n   * @type string\n   */\n  key?: string;\n\n  /**\n   * Renderer of the table cell. The return value should be a VNode, or an object for colSpan/rowSpan config\n   * @type Function | ScopedSlot\n   */\n  customRender?: CustomRenderFunction<T> | VNodeChild | JSX.Element;\n\n  /**\n   * Sort function for local sort, see Array.sort's compareFunction. If you need sort buttons only, set to true\n   * @type boolean | Function\n   */\n  sorter?: boolean | Function;\n\n  /**\n   * Order of sorted values: 'ascend' 'descend' false\n   * @type boolean | string\n   */\n  sortOrder?: boolean | SortOrder;\n\n  /**\n   * supported sort way, could be 'ascend', 'descend'\n   * @default ['ascend', 'descend']\n   * @type string[]\n   */\n  sortDirections?: SortOrder[];\n\n  /**\n   * Title of this column\n   * @type any (string | slot)\n   */\n  title?: VNodeChild | JSX.Element;\n\n  /**\n   * Width of this column\n   * @type string | number\n   */\n  width?: string | number;\n\n  /**\n   * Set props on per cell\n   * @type Function\n   */\n  customCell?: (record: T, rowIndex: number) => object;\n\n  /**\n   * Set props on per header cell\n   * @type object\n   */\n  customHeaderCell?: (column: ColumnProps<T>) => object;\n  // 代码逻辑说明: 【pull/1201】添加antd的TableSummary功能兼容老的summary（表尾合计）\n  customSummaryRender?: CustomRenderFunction<T> | VNodeChild | JSX.Element;\n\n  /**\n   * Callback executed when the confirm filter button is clicked, Use as a filter event when using template or jsx\n   * @type Function\n   */\n  onFilter?: (value: any, record: T) => boolean;\n\n  /**\n   * Callback executed when filterDropdownOpen is changed, Use as a filterDropdownVisible event when using template or jsx\n   * @type Function\n   */\n  onFilterDropdownVisibleChange?: (visible: boolean) => void;\n\n  /**\n   * When using columns, you can setting this property to configure the properties that support the slot,\n   * such as slots: { filterIcon: 'XXX'}\n   * @type object\n   */\n  slots?: Recordable<string>;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/types/componentType.ts",
    "content": "export type ComponentType = 'Input' | 'InputNumber' | 'Select' | 'ApiSelect' | 'ApiTreeSelect' | 'Checkbox' | 'Switch' | 'DatePicker' | 'TimePicker';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/types/pagination.ts",
    "content": "import Pagination from 'ant-design-vue/lib/pagination';\nimport { VNodeChild } from 'vue';\n\ninterface PaginationRenderProps {\n  page: number;\n  type: 'page' | 'prev' | 'next';\n  originalElement: any;\n}\n\ntype Position = 'topLeft' | 'topCenter' | 'topRight' | 'bottomLeft' | 'bottomCenter' | 'bottomRight';\n\nexport declare class PaginationConfig extends Pagination {\n  position?: 'top' | 'bottom' | 'both';\n}\nexport interface PaginationProps {\n  /**\n   * total number of data items\n   * @default 0\n   * @type number\n   */\n  total?: number;\n\n  /**\n   * default initial page number\n   * @default 1\n   * @type number\n   */\n  defaultCurrent?: number;\n\n  /**\n   * current page number\n   * @type number\n   */\n  current?: number;\n\n  /**\n   * default number of data items per page\n   * @default 10\n   * @type number\n   */\n  defaultPageSize?: number;\n\n  /**\n   * number of data items per page\n   * @type number\n   */\n  pageSize?: number;\n\n  /**\n   * Whether to hide pager on single page\n   * @default false\n   * @type boolean\n   */\n  hideOnSinglePage?: boolean;\n\n  /**\n   * determine whether pageSize can be changed\n   * @default false\n   * @type boolean\n   */\n  showSizeChanger?: boolean;\n\n  /**\n   * specify the sizeChanger options\n   * @default ['10', '20', '30', '40']\n   * @type string[]\n   */\n  pageSizeOptions?: string[];\n\n  /**\n   * determine whether you can jump to pages directly\n   * @default false\n   * @type boolean\n   */\n  showQuickJumper?: boolean | object;\n\n  /**\n   * to display the total number and range\n   * @type Function\n   */\n  showTotal?: (total: number, range: [number, number]) => any;\n\n  /**\n   * specify the size of Pagination, can be set to small\n   * @default ''\n   * @type string\n   */\n  size?: string;\n\n  /**\n   * whether to setting simple mode\n   * @type boolean\n   */\n  simple?: boolean;\n\n  /**\n   * to customize item innerHTML\n   * @type Function\n   */\n  itemRender?: (props: PaginationRenderProps) => VNodeChild | JSX.Element;\n  /**\n   * specify the position of Pagination\n   * @type Position[]\n   */\n  position?: Position[];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/types/table.ts",
    "content": "import type { VNodeChild, ComputedRef } from 'vue';\nimport type { PaginationProps } from './pagination';\nimport type { FormProps } from '/@/components/Form';\nimport type { TableRowSelection as ITableRowSelection } from 'ant-design-vue/lib/table/interface';\nimport type { ColumnProps } from 'ant-design-vue/lib/table';\n\nimport { ComponentType } from './componentType';\nimport { VueNode } from '/@/utils/propTypes';\nimport { RoleEnum } from '/@/enums/roleEnum';\n\nexport declare type SortOrder = 'ascend' | 'descend';\n\nexport interface TableCurrentDataSource<T = Recordable> {\n  currentDataSource: T[];\n}\n\nexport interface TableRowSelection<T = any> extends ITableRowSelection {\n  /**\n   * Callback executed when selected rows change\n   * @type Function\n   */\n  onChange?: (selectedRowKeys: string[] | number[], selectedRows: T[]) => any;\n\n  /**\n   * Callback executed when select/deselect one row\n   * @type Function\n   */\n  onSelect?: (record: T, selected: boolean, selectedRows: Object[]) => any;\n\n  /**\n   * Callback executed when select/deselect all rows\n   * @type Function\n   */\n  onSelectAll?: (selected: boolean, selectedRows: T[], changeRows: T[]) => any;\n\n  /**\n   * Callback executed when row selection is inverted\n   * @type Function\n   */\n  onSelectInvert?: (selectedRows: string[] | number[]) => any;\n  //【issues/8163】关联记录新增丢失\n  selectedRows?: any[];\n}\n\nexport interface TableCustomRecord<T> {\n  record?: T;\n  index?: number;\n}\n\nexport interface ExpandedRowRenderRecord<T> extends TableCustomRecord<T> {\n  indent?: number;\n  expanded?: boolean;\n}\n\nexport interface ColumnFilterItem {\n  text?: string;\n  value?: string;\n  children?: any;\n}\n\nexport interface TableCustomRecord<T = Recordable> {\n  record?: T;\n  index?: number;\n}\n\nexport interface SorterResult {\n  column: ColumnProps;\n  order: SortOrder;\n  field: string;\n  columnKey: string;\n}\n\nexport interface FetchParams {\n  searchInfo?: Recordable;\n  page?: number;\n  sortInfo?: Recordable;\n  filterInfo?: Recordable;\n}\n\nexport interface GetColumnsParams {\n  ignoreIndex?: boolean;\n  ignoreAction?: boolean;\n  // 代码逻辑说明: 【issues/8502】解决权限列在列表中不显示，列配置中还显示\n  ignoreAuth?: boolean;\n  ignoreIfShow?: boolean | ((column: BasicColumn) => boolean);\n  sort?: boolean;\n}\n\nexport type SizeType = 'middle' | 'small' | 'large';\n\nexport interface TableActionType {\n  reload: (opt?: FetchParams) => Promise<void>;\n  getSelectRows: <T = Recordable>() => T[];\n  clearSelectedRowKeys: () => void;\n  expandAll: () => void;\n  collapseAll: () => void;\n  getSelectRowKeys: () => string[];\n  deleteSelectRowByKey: (key: string) => void;\n  setPagination: (info: Partial<PaginationProps>) => void;\n  setTableData: <T = Recordable>(values: T[]) => void;\n  updateTableDataRecord: (rowKey: string | number, record: Recordable) => Recordable | void;\n  deleteTableDataRecord: (rowKey: string | number | string[] | number[]) => void;\n  insertTableDataRecord: (record: Recordable, index?: number) => Recordable | void;\n  findTableDataRecord: (rowKey: string | number) => Recordable | void;\n  getColumns: (opt?: GetColumnsParams) => BasicColumn[];\n  setColumns: (columns: BasicColumn[] | string[]) => void;\n  getDataSource: <T = Recordable>() => T[];\n  getRawDataSource: <T = Recordable>() => T;\n  setLoading: (loading: boolean) => void;\n  setProps: (props: Partial<BasicTableProps>) => void;\n  redoHeight: () => void;\n  setSelectedRowKeys: (rowKeys: string[] | number[]) => void;\n  getPaginationRef: () => PaginationProps | boolean;\n  getSize: () => SizeType;\n  getRowSelection: () => TableRowSelection<Recordable>;\n  getCacheColumns: () => BasicColumn[];\n  emit?: EmitType;\n  updateTableData: (index: number, key: string, value: any) => Recordable;\n  setShowPagination: (show: boolean) => Promise<void>;\n  getShowPagination: () => boolean;\n  setCacheColumnsByField?: (dataIndex: string | undefined, value: BasicColumn) => void;\n  getColumnsRef: () => ComputedRef<BasicColumn[]>;\n  getBindValuesRef: () => ComputedRef<any>;\n}\n\nexport interface FetchSetting {\n  // 请求接口当前页数\n  pageField: string;\n  // 每页显示多少条\n  sizeField: string;\n  // 请求结果列表字段  支持 a.b.c\n  listField: string;\n  // 请求结果总数字段  支持 a.b.c\n  totalField: string;\n}\n\nexport interface TableSetting {\n  // 是否显示刷新按钮\n  redo?: boolean;\n  // 是否显示尺寸调整按钮\n  size?: boolean;\n  // 是否显示字段调整按钮\n  setting?: boolean;\n  // 缓存“字段调整”配置的key，用于页面上有多个表格需要区分的情况\n  cacheKey?: string;\n  // 是否显示全屏按钮\n  fullScreen?: boolean;\n}\n\nexport interface BasicTableProps<T = any> {\n  // 点击行选中\n  clickToRowSelect?: boolean;\n  isTreeTable?: boolean;\n  // 自定义排序方法\n  sortFn?: (sortInfo: SorterResult) => any;\n  // 排序方法\n  filterFn?: (data: Partial<Recordable<string[]>>) => any;\n  // 取消表格的默认padding\n  inset?: boolean;\n  // 显示表格设置\n  showTableSetting?: boolean;\n  // 表格上方操作按钮设置\n  tableSetting?: TableSetting;\n  // 斑马纹\n  striped?: boolean;\n  // 是否自动生成key\n  autoCreateKey?: boolean;\n  // 计算合计行的方法\n  summaryFunc?: (...arg: any) => Recordable[];\n  // 自定义合计表格内容\n  summaryData?: Recordable[];\n  // 是否显示合计行\n  showSummary?: boolean;\n  // 是否可拖拽列\n  canColDrag?: boolean;\n  // 接口请求对象\n  api?: (...arg: any) => Promise<any>;\n  // 请求之前处理参数\n  beforeFetch?: Fn;\n  // 自定义处理接口返回参数\n  afterFetch?: Fn;\n  // 查询条件请求之前处理\n  handleSearchInfoFn?: Fn;\n  // 请求接口配置\n  fetchSetting?: Partial<FetchSetting>;\n  // 立即请求接口\n  immediate?: boolean;\n  // 在开起搜索表单的时候，如果没有数据是否显示表格\n  emptyDataIsShowTable?: boolean;\n  // 额外的请求参数\n  searchInfo?: Recordable;\n  // 默认的排序参数\n  defSort?: Recordable | Recordable[];\n  // 使用搜索表单\n  useSearchForm?: boolean;\n  // 表单配置\n  formConfig?: Partial<FormProps>;\n  // 列配置\n  columns: BasicColumn[];\n  // 统一设置列最大宽度\n  maxColumnWidth?: number;\n  // 是否显示序号列\n  showIndexColumn?: boolean;\n  // 序号列配置\n  indexColumnProps?: BasicColumn;\n  // 是否显示操作列\n  showActionColumn?: boolean;\n  // 操作列配置\n  actionColumn?: Partial<BasicColumn>;\n  // 文本超过宽度是否显示。。。\n  ellipsis?: boolean;\n  // 是否可以自适应高度\n  canResize?: boolean;\n  // 自适应高度偏移， 计算结果-偏移量\n  resizeHeightOffset?: number;\n  // 在分页改变的时候清空选项\n  clearSelectOnPageChange?: boolean;\n  //\n  rowKey?: string | ((record: Recordable) => string);\n  // 数据\n  dataSource?: Recordable[];\n  // 标题右侧提示\n  titleHelpMessage?: string | string[];\n  // 表格最小高度\n  minHeight?: number;\n  // 表格滚动最大高度\n  maxHeight?: number;\n  // 是否显示边框\n  bordered?: boolean;\n  // 展开列宽度\n  expandColumnWidth: number;\n  // 分页配置\n  pagination?: PaginationProps | boolean;\n  // loading加载\n  loading?: boolean;\n\n  /**\n   * The column contains children to display\n   * @default 'children'\n   * @type string | string[]\n   */\n  childrenColumnName?: string;\n\n  /**\n   * Override default table elements\n   * @type object\n   */\n  components?: object;\n\n  /**\n   * Expand all rows initially\n   * @default false\n   * @type boolean\n   */\n  defaultExpandAllRows?: boolean;\n\n  /**\n   * Initial expanded row keys\n   * @type string[]\n   */\n  defaultExpandedRowKeys?: string[];\n\n  /**\n   * Current expanded row keys\n   * @type string[]\n   */\n  expandedRowKeys?: string[];\n\n  /**\n   * Expanded container render for each row\n   * @type Function\n   */\n  expandedRowRender?: (record?: ExpandedRowRenderRecord<T>) => VNodeChild | JSX.Element;\n\n  /**\n   * Customize row expand Icon.\n   * @type Function | VNodeChild\n   */\n  expandIcon?: Function | VNodeChild | JSX.Element;\n\n  /**\n   * Whether to expand row by clicking anywhere in the whole row\n   * @default false\n   * @type boolean\n   */\n  expandRowByClick?: boolean;\n\n  /**\n   * The index of `expandIcon` which column will be inserted when `expandIconAsCell` is false. default 0\n   */\n  expandIconColumnIndex?: number;\n\n  /**\n   * Table footer renderer\n   * @type Function | VNodeChild\n   */\n  footer?: Function | VNodeChild | JSX.Element;\n\n  /**\n   * Indent size in pixels of tree data\n   * @default 15\n   * @type number\n   */\n  indentSize?: number;\n\n  /**\n   * i18n text including filter, sort, empty text, etc\n   * @default { filterConfirm: 'Ok', filterReset: 'Reset', emptyText: 'No Data' }\n   * @type object\n   */\n  locale?: object;\n\n  /**\n   * Row's className\n   * @type Function\n   */\n  rowClassName?: (record: TableCustomRecord<T>, index: number) => string;\n\n  /**\n   * Row selection config\n   * @type object\n   */\n  rowSelection?: TableRowSelection;\n\n  /**\n   * Set horizontal or vertical scrolling, can also be used to specify the width and height of the scroll area.\n   * It is recommended to set a number for x, if you want to set it to true,\n   * you need to add style .ant-table td { white-space: nowrap; }.\n   * @type object\n   */\n  // 代码逻辑说明: 【issues/1188】BasicTable加上scrollToFirstRowOnChange类型定义\n  scroll?: { x?: number | true | 'max-content'; y?: number; scrollToFirstRowOnChange?: boolean };\n\n  /**\n   * Whether to show table header\n   * @default true\n   * @type boolean\n   */\n  showHeader?: boolean;\n\n  /**\n   * Size of table\n   * @default 'default'\n   * @type string\n   */\n  size?: SizeType;\n\n  /**\n   * Table title renderer\n   * @type Function | ScopedSlot\n   */\n  title?: VNodeChild | JSX.Element | string | ((data: Recordable) => string);\n\n  /**\n   * Set props on per header row\n   * @type Function\n   */\n  customHeaderRow?: (column: ColumnProps, index: number) => object;\n\n  /**\n   * Set props on per row\n   * @type Function\n   */\n  customRow?: (record: T, index: number) => object;\n\n  /**\n   * `table-layout` attribute of table element\n   * `fixed` when header/columns are fixed, or using `column.ellipsis`\n   *\n   * @see https://developer.mozilla.org/en-US/docs/Web/CSS/table-layout\n   * @version 1.5.0\n   */\n  tableLayout?: 'auto' | 'fixed' | string;\n\n  /**\n   * the render container of dropdowns in table\n   * @param triggerNode\n   * @version 1.5.0\n   */\n  getPopupContainer?: (triggerNode?: HTMLElement) => HTMLElement;\n\n  /**\n   * Data can be changed again before rendering.\n   * The default configuration of general user empty data.\n   * You can configured globally through [ConfigProvider](https://antdv.com/components/config-provider-cn/)\n   *\n   * @version 1.5.4\n   */\n  transformCellText?: Function;\n\n  /**\n   * Callback executed before editable cell submit value, not for row-editor\n   *\n   * The cell will not submit data while callback return false\n   */\n  beforeEditSubmit?: (data: { record: Recordable; index: number; key: string | number; value: any }) => Promise<any>;\n\n  /**\n   * Callback executed when pagination, filters or sorter is changed\n   * @param pagination\n   * @param filters\n   * @param sorter\n   * @param currentDataSource\n   */\n  onChange?: (pagination: any, filters: any, sorter: any, extra: any) => void;\n\n  /**\n   * Callback executed when the row expand icon is clicked\n   *\n   * @param expanded\n   * @param record\n   */\n  onExpand?: (expande: boolean, record: T) => void;\n\n  /**\n   * Callback executed when the expanded rows change\n   * @param expandedRows\n   */\n  onExpandedRowsChange?: (expandedRows: string[] | number[]) => void;\n\n  onColumnsChange?: (data: ColumnChangeParam[]) => void;\n}\n\nexport type CellFormat = string | ((text: string, record: Recordable, index: number) => string | number) | Map<string | number, any>;\n\n// @ts-ignore\nexport interface BasicColumn extends ColumnProps<Recordable> {\n  children?: BasicColumn[];\n  filters?: {\n    text: string;\n    value: string;\n    children?: unknown[] | (((props: Record<string, unknown>) => unknown[]) & (() => unknown[]) & (() => unknown[]));\n  }[];\n\n  //\n  flag?: 'INDEX' | 'DEFAULT' | 'CHECKBOX' | 'RADIO' | 'ACTION';\n  // 代码逻辑说明: 【issues/6908】多语言无刷新切换时，BasicColumn和FormSchema里面的值不能正常切换\n  title: string | Fn;\n  customTitle?: VueNode;\n\n  slots?: Recordable;\n  // slots的备份，兼容老的写法，转成新写法避免控制台警告\n  slotsBak?: Recordable;\n\n  // Whether to hide the column by default, it can be displayed in the column configuration\n  defaultHidden?: boolean;\n\n  // Help text for table column header\n  helpMessage?: string | string[];\n\n  format?: CellFormat;\n\n  // Editable\n  edit?: boolean;\n  editRow?: boolean;\n  editable?: boolean;\n  editComponent?: ComponentType;\n  // 代码逻辑说明: 【issues/8680】editComponentProps可接受一个函数传入record\n  editComponentProps?: Recordable | ((record: Recordable) => Recordable);\n  editRule?: boolean | ((text: string, record: Recordable) => Promise<string>);\n  editValueMap?: (value: any) => string;\n  onEditRow?: () => void;\n  // 权限编码控制是否显示\n  auth?: RoleEnum | RoleEnum[] | string | string[];\n  // 业务控制是否显示\n  ifShow?: boolean | ((column: BasicColumn) => boolean);\n  //compType-用于记录类型\n  compType?: string;\n  // 代码逻辑说明: 【pull/1201】添加antd的TableSummary功能兼容老的summary（表尾合计）\n  customSummaryRender?: (opt: {\n    value: any;\n    text: any;\n    record: Recordable;\n    index: number;\n    renderIndex?: number;\n    column: BasicColumn;\n  }) => any | VNodeChild | JSX.Element;\n  // 额外的属性\n  extraProps?: Recordable;\n}\n\nexport type ColumnChangeParam = {\n  dataIndex: string;\n  fixed: boolean | 'left' | 'right' | undefined;\n  visible: boolean;\n};\n\nexport interface InnerHandlers {\n  onColumnsChange: (data: ColumnChangeParam[]) => void;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Table/src/types/tableAction.ts",
    "content": "import { ButtonProps } from 'ant-design-vue/es/button/buttonTypes';\nimport { TooltipProps } from 'ant-design-vue/es/tooltip/Tooltip';\nimport { RoleEnum } from '/@/enums/roleEnum';\nexport interface ActionItem extends ButtonProps {\n  onClick?: Fn;\n  label?: string;\n  color?: 'success' | 'error' | 'warning';\n  icon?: string;\n  popConfirm?: PopConfirm;\n  disabled?: boolean;\n  divider?: boolean;\n  // 权限编码控制是否显示\n  auth?: RoleEnum | RoleEnum[] | string | string[];\n  // 业务控制是否显示\n  ifShow?: boolean | ((action: ActionItem) => boolean);\n  tooltip?: string | TooltipProps;\n  // 自定义类名\n  class?: string | Record<string, boolean> | any[];\n  // 自定义图标颜色\n  iconColor?: string;\n}\n\nexport interface PopConfirm {\n  title: string;\n  okText?: string;\n  cancelText?: string;\n  confirm: Fn;\n  cancel?: Fn;\n  icon?: string;\n  placement?: string;\n  overlayClassName?: string;\n  getPopupContainer?: Fn;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Time/index.ts",
    "content": "import { withInstall } from '/@/utils/index';\nimport time from './src/Time.vue';\n\nexport const Time = withInstall(time);\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Time/src/Time.vue",
    "content": "<template>\n  <span>{{ date }}</span>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, watch } from 'vue';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useIntervalFn } from '@vueuse/core';\n  import { formatToDateTime, formatToDate, dateUtil } from '/@/utils/dateUtil';\n  import { isNumber, isObject, isString } from '/@/utils/is';\n  import { propTypes } from '/@/utils/propTypes';\n\n  const ONE_SECONDS = 1000;\n  const ONE_MINUTES = ONE_SECONDS * 60;\n  const ONE_HOUR = ONE_MINUTES * 60;\n  const ONE_DAY = ONE_HOUR * 24;\n\n  export default defineComponent({\n    name: 'Time',\n    props: {\n      value: propTypes.oneOfType([propTypes.number, propTypes.instanceOf(Date), propTypes.string]).isRequired,\n      step: propTypes.number.def(60),\n      mode: propTypes.oneOf(['date', 'datetime', 'relative']).def('relative'),\n    },\n    setup(props) {\n      const date = ref('');\n\n      const { t } = useI18n();\n\n      useIntervalFn(setTime, props.step * ONE_SECONDS);\n\n      watch(\n        () => props.value,\n        () => {\n          setTime();\n        },\n        { immediate: true }\n      );\n\n      function getTime() {\n        const { value } = props;\n        let time = 0;\n        if (isNumber(value)) {\n          const timestamp = value.toString().length > 10 ? value : value * 1000;\n          time = new Date(timestamp).getTime();\n        } else if (isString(value)) {\n          time = new Date(value).getTime();\n        } else if (isObject(value)) {\n          time = value.getTime();\n        }\n        return time;\n      }\n\n      function setTime() {\n        const { mode, value } = props;\n        const time = getTime();\n        if (mode === 'relative') {\n          date.value = getRelativeTime(time);\n        } else {\n          if (mode === 'datetime') {\n            date.value = formatToDateTime(value);\n          } else if (mode === 'date') {\n            date.value = formatToDate(value);\n          }\n        }\n      }\n\n      function getRelativeTime(timeStamp: number) {\n        const currentTime = new Date().getTime();\n\n        // Determine whether the incoming timestamp is earlier than the current timestamp\n        const isBefore = dateUtil(timeStamp).isBefore(currentTime);\n\n        let diff = currentTime - timeStamp;\n        if (!isBefore) {\n          diff = -diff;\n        }\n\n        let resStr = '';\n        let dirStr = isBefore ? t('component.time.before') : t('component.time.after');\n\n        if (diff < ONE_SECONDS) {\n          resStr = t('component.time.just');\n          // Less than or equal to 59 seconds\n        } else if (diff < ONE_MINUTES) {\n          resStr = parseInt(diff / ONE_SECONDS) + t('component.time.seconds') + dirStr;\n          // More than 59 seconds, less than or equal to 59 minutes and 59 seconds\n        } else if (diff >= ONE_MINUTES && diff < ONE_HOUR) {\n          resStr = Math.floor(diff / ONE_MINUTES) + t('component.time.minutes') + dirStr;\n          // More than 59 minutes and 59 seconds, less than or equal to 23 hours, 59 minutes and 59 seconds\n        } else if (diff >= ONE_HOUR && diff < ONE_DAY) {\n          resStr = Math.floor(diff / ONE_HOUR) + t('component.time.hours') + dirStr;\n          // More than 23 hours, 59 minutes and 59 seconds, less than or equal to 29 days, 59 minutes and 59 seconds\n        } else if (diff >= ONE_DAY && diff < 2623860000) {\n          resStr = Math.floor(diff / ONE_DAY) + t('component.time.days') + dirStr;\n          // More than 29 days, 59 minutes, 59 seconds, less than 364 days, 23 hours, 59 minutes, 59 seconds, and the incoming timestamp is earlier than the current\n        } else if (diff >= 2623860000 && diff <= 31567860000 && isBefore) {\n          resStr = dateUtil(timeStamp).format('MM-DD-HH-mm');\n        } else {\n          resStr = dateUtil(timeStamp).format('YYYY');\n        }\n        return resStr;\n      }\n\n      return { date };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tinymce/index.ts",
    "content": "import { withInstall } from '/@/utils/index';\nimport tinymce from './src/Editor.vue';\n\nexport const Tinymce = withInstall(tinymce);\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tinymce/src/Editor.vue",
    "content": "<template>\n  <div ref=\"editorRootRef\" :class=\"prefixCls\" :style=\"{ width: containerWidth }\">\n    <Teleport v-if=\"imgUploadShow\" :to=\"targetElem\">\n      <ImgUpload\n        :fullscreen=\"fullscreen\"\n        @uploading=\"handleImageUploading\"\n        @loading=\"handleLoading\"\n        @done=\"handleDone\"\n        v-show=\"editorRef\"\n        :disabled=\"disabled\"\n      />\n    </Teleport>\n    <Editor :id=\"tinymceId\" ref=\"elRef\" :disabled=\"disabled\" :init=\"initOptions\" :style=\"{ visibility: 'hidden' }\" v-if=\"!initOptions.inline\"></Editor>\n    <slot v-else></slot>\n    <ProcessMask ref=\"processMaskRef\" :show=\"showUploadMask\"/>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import type { RawEditorOptions } from 'tinymce';\n  import tinymce from 'tinymce/tinymce';\n  import Editor from '@tinymce/tinymce-vue'\n  import 'tinymce/themes/silver';\n  import 'tinymce/icons/default/icons';\n  import 'tinymce/models/dom';\n\n  // tinymce插件可按自己的需要进行导入\n  // 更多插件参考：https://www.tiny.cloud/docs/plugins/\n  import 'tinymce/plugins/fullscreen';\n  import 'tinymce/plugins/link';\n  import 'tinymce/plugins/lists';\n  import 'tinymce/plugins/preview';\n  import 'tinymce/plugins/image';\n  import { defineComponent, computed, nextTick, ref, unref, watch, onDeactivated, onBeforeUnmount, onMounted } from 'vue';\n  import ImgUpload from './ImgUpload.vue';\n  import ProcessMask from './ProcessMask.vue';\n  import {simpleToolbar, menubar, simplePlugins} from './tinymce';\n  import { buildShortUUID } from '/@/utils/uuid';\n  import { bindHandlers } from './helper';\n  import { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { isNumber } from '/@/utils/is';\n  import { useLocale } from '/@/locales/useLocale';\n  import { useAppStore } from '/@/store/modules/app';\n  import { uploadFile } from '/@/api/common/api';\n  import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';\n  import { ThemeEnum } from '/@/enums/appEnum';\n  import { defHttp } from \"@/utils/http/axios\";\n  const tinymceProps = {\n    options: {\n      type: Object as PropType<Partial<RawEditorOptions>>,\n      default: {},\n    },\n    value: {\n      type: String,\n    },\n\n    toolbar: {\n      type: [Array as PropType<string[]>, String],\n      default: simpleToolbar,\n    },\n    plugins: {\n      type: [Array as PropType<string[]>, String],\n      default: simplePlugins,\n    },\n    menubar: {\n      type: [Object, String],\n      default: menubar,\n    },\n    modelValue: {\n      type: String,\n    },\n    height: {\n      type: [Number, String] as PropType<string | number>,\n      required: false,\n      default: 400,\n    },\n    width: {\n      type: [Number, String] as PropType<string | number>,\n      required: false,\n      default: 'auto',\n    },\n    showImageUpload: {\n      type: Boolean,\n      default: true,\n    },\n    showUploadMask: {\n      type: Boolean,\n      default: false,\n    },\n    //是否聚焦\n    autoFocus:{\n      type: Boolean,\n      default: true,\n    }\n  };\n\n  export default defineComponent({\n    name: 'Tinymce',\n    components: { ImgUpload,Editor,ProcessMask },\n    inheritAttrs: false,\n    props: tinymceProps as any,\n    emits: ['change', 'update:modelValue', 'inited', 'init-error'],\n    setup(props, { emit, attrs }) {\n      console.log(\"---Tinymce---初始化---\")\n\n      const editorRef = ref<Nullable<any>>(null);\n      const fullscreen = ref(false);\n      const tinymceId = ref<string>(buildShortUUID('tiny-vue'));\n      const elRef = ref<Nullable<HTMLElement>>(null);\n      const editorRootRef = ref<Nullable<HTMLElement>>(null);\n      const processMaskRef = ref<any>(null);\n      const imgUploadShow = ref(false);\n      const targetElem = ref<null | HTMLDivElement>(null);\n\n      const { prefixCls } = useDesign('tinymce-container');\n\n      const appStore = useAppStore();\n\n      const tinymceContent = computed(() => props.modelValue);\n\n      const containerWidth = computed(() => {\n        const width = props.width;\n        if (isNumber(width)) {\n          return `${width}px`;\n        }\n        return width;\n      });\n\n      const skinName = computed(() => {\n        return appStore.getDarkMode === 'light' ? 'jeecg' : 'oxide-dark';\n      });\n\n      const langName = computed(() => {\n        const lang = useLocale().getLocale.value;\n        return ['zh_CN', 'en'].includes(lang) ? lang : 'zh_CN';\n      });\n\n      const initOptions = computed(() => {\n        const { height, options, toolbar, plugins, menubar } = props;\n        let publicPath = import.meta.env.VITE_PUBLIC_PATH || '/';\n        // 代码逻辑说明: 【QQYUN-8571】发布路径不以/结尾资源会加载失败\n        if (!publicPath.endsWith('/')) {\n          publicPath += '/';\n        }\n        return {\n          selector: `#${unref(tinymceId)}`,\n          height,\n          toolbar,\n          menubar: false,\n          plugins,\n          // 添加以下粘贴相关配置\n          paste_data_images: true, // 允许粘贴图片\n          paste_as_text: false, // 不以纯文本粘贴\n          paste_retain_style_properties: 'all', // 保留所有样式属性\n          paste_webkit_styles: 'all', // 保留webkit样式\n          paste_merge_formats: true, // 合并格式\n          paste_block_drop: true, // 允许拖放粘贴\n          paste_preprocess: (plugin, args) => {\n            // 可以在这里对粘贴的内容进行预处理\n            //console.log('粘贴的内容:', args.content);\n          },\n          paste_postprocess: (plugin, args) => {\n            // 可以在这里对粘贴的内容进行后处理\n            //console.log('处理后的内容:', args.node);\n          },\n          // 放宽内容过滤规则\n          valid_elements: '*[*]',\n          extended_valid_elements: '*[*]',\n          valid_children: '+body[style]',\n          allow_conditional_comments: true,\n          allow_html_in_named_anchor: true,\n\n          language_url: publicPath + 'resource/tinymce/langs/' + langName.value + '.js',\n          language: langName.value,\n          branding: false,\n          default_link_target: '_blank',\n          link_title: false,\n          object_resizing: true,\n          toolbar_mode: 'sliding',\n          // 代码逻辑说明: 【TV360X-416】单表代码生成，表单打开时，会先聚焦富文本组件，并滚动到富文本组件所在的位置---\n          auto_focus: props.autoFocus,\n          // toolbar_groups: true,\n          skin: skinName.value,\n          skin_url: publicPath + 'resource/tinymce/skins/ui/' + skinName.value,\n          images_upload_handler: (blobInfo, process) =>\n            new Promise((resolve, reject) => {\n            let params = {\n              file: blobInfo.blob(),\n              filename: blobInfo.filename(),\n              data: { biz: 'jeditor', jeditor: '1' },\n            };\n            const uploadSuccess = (res) => {\n              if (res.success) {\n                if (res.message == 'local') {\n                  const img = 'data:image/jpeg;base64,' + blobInfo.base64();\n                      resolve(img);\n                } else {\n                  let img = getFileAccessHttpUrl(res.message);\n                  resolve(img);\n                }\n              } else {\n                  reject('上传失败！');\n              }\n            };\n            uploadFile(params, uploadSuccess);\n        }),\n          content_css: publicPath + 'resource/tinymce/skins/ui/' + skinName.value + '/content.min.css',\n          ...options,\n          setup: (editor: any) => {\n            editorRef.value = editor;\n            editor.on('init', (e) => initSetup(e));\n            //update-begin-author:liusq---date:2025-11-19--for: JHHB-1070 从word复制的表格不能对齐\n            // 表格对齐功能\n            initTableAlignment(editor);\n            //update-end-author:liusq---date:2025-11-19--for: JHHB-1070 从word复制的表格不能对齐\n            // 在编辑器内部处理粘贴事件，确保能正确替换选中内容\n            editor.on('paste', async (e: any) => {\n              try {\n                e.preventDefault();\n                e.stopPropagation();\n                const clipboardData = e.clipboardData as DataTransfer | undefined;\n                if (!clipboardData) return false;\n\n                // 先处理剪贴板中的图片（截图/粘贴图片）\n                const items = clipboardData.items as DataTransferItemList | undefined;\n                if (items && items.length > 0) {\n                  const imageFiles: File[] = [];\n                  for (let i = 0; i < items.length; i++) {\n                    const it = items[i];\n                    if (it && it.type && it.type.indexOf('image') !== -1) {\n                      const file = it.getAsFile();\n                      if (file) imageFiles.push(file);\n                    }\n                  }\n                  // 若存在图片，逐一上传后替换\n                  if (imageFiles.length > 0) {\n                    for (const file of imageFiles) {\n                      await new Promise<void>((resolve) => {\n                        const params = {\n                          file,\n                          filename: file.name || 'pasted-image.png',\n                          data: { biz: 'jeditor', jeditor: '1' },\n                        };\n                        const uploadSuccess = (res: any) => {\n                          try {\n                            if (res && res.success) {\n                              if (res.message === 'local') {\n                                const reader = new FileReader();\n                                reader.onload = () => {\n                                  const base64 = reader.result as string;\n                                  editor.selection.setContent(`<img src=\"${base64}\"/>`);\n                                  resolve();\n                                };\n                                reader.readAsDataURL(file);\n                              } else {\n                                const imgUrl = getFileAccessHttpUrl(res.message);\n                                editor.selection.setContent(`<img src=\"${imgUrl}\"/>`);\n                                resolve();\n                              }\n                            } else {\n                              resolve();\n                            }\n                          } catch (_) {\n                            resolve();\n                          }\n                        };\n                        uploadFile(params, uploadSuccess);\n                      });\n                    }\n                    return false;\n                  }\n                }\n\n                // 处理 HTML/纯文本\n                const pasteContent = clipboardData.getData('text/html') || clipboardData.getData('text');\n                if (!pasteContent) return false;\n                \n                if (pasteContent.includes('<img')) {\n                  const processedHtml = await preprocess(pasteContent);\n                  editor.selection.setContent(processedHtml);\n                } else {\n                  editor.selection.setContent(pasteContent);\n                }\n              } catch (_) {}\n              return false;\n            });\n          },\n        };\n      });\n\n      const disabled = computed(() => {\n        const { options } = props;\n        const getdDisabled = options && Reflect.get(options, 'readonly');\n        const editor = unref(editorRef);\n        // 代码逻辑说明: 设置disabled，图片上传没有被禁用\n        if (editor && editor?.setMode) {\n          editor.setMode(getdDisabled || attrs.disabled === true ? 'readonly' : 'design');\n        }\n        if (attrs.disabled === true) {\n          return true;\n        }\n        return getdDisabled ?? false;\n      });\n\n      watch(\n        () => attrs.disabled,\n        () => {\n          const editor = unref(editorRef);\n          if (!editor) {\n            return;\n          }\n         editor?.setMode && editor.setMode(attrs.disabled ? 'readonly' : 'design');\n        }\n      );\n\n      onMountedOrActivated(() => {\n        if (!initOptions.value.inline) {\n          tinymceId.value = buildShortUUID('tiny-vue');\n        }\n        nextTick(() => {\n          setTimeout(() => {\n            initEditor();\n          }, 30);\n        });\n      });\n\n      onBeforeUnmount(() => {\n        destory();\n      });\n\n      onDeactivated(() => {\n        destory();\n      });\n\n      function destory() {\n        if (tinymce !== null) {\n          tinymce?.remove?.(unref(initOptions).selector!);\n        }\n      }\n\n      function initEditor() {\n        const el = unref(elRef);\n        if (el && el?.style && el?.style?.visibility) {\n          el.style.visibility = '';\n        }\n        tinymce\n          .init(unref(initOptions))\n          .then((editor) => {\n            changeColor();\n            emit('inited', editor);\n          })\n          .catch((err) => {\n            emit('init-error', err);\n          });\n      }\n\n      function initSetup(e) {\n        const editor = unref(editorRef);\n        if (!editor) {\n          return;\n        }\n        const value = props.modelValue || '';\n\n        editor.setContent(value);\n        bindModelHandlers(editor);\n        bindHandlers(e, attrs, unref(editorRef));\n      }\n\n      function setValue(editor: Recordable, val: string, prevVal?: string) {\n        if (editor && typeof val === 'string' && val !== prevVal && val !== editor.getContent({ format: attrs.outputFormat })) {\n          editor.setContent(val);\n        }\n      }\n\n      function bindModelHandlers(editor: any) {\n        const modelEvents = attrs.modelEvents ? attrs.modelEvents : null;\n        const normalizedEvents = Array.isArray(modelEvents) ? modelEvents.join(' ') : modelEvents;\n\n        watch(\n          () => props.modelValue,\n          (val: string, prevVal: string) => {\n            setValue(editor, val, prevVal);\n          }\n        );\n\n        watch(\n          () => props.value,\n          (val: string, prevVal: string) => {\n            setValue(editor, val, prevVal);\n          },\n          {\n            immediate: true,\n          }\n        );\n\n        editor.on(normalizedEvents ? normalizedEvents : 'change keyup undo redo', () => {\n          const content = editor.getContent({ format: attrs.outputFormat });\n          emit('update:modelValue', content);\n          emit('change', content);\n        });\n\n        editor.on('FullscreenStateChanged', (e) => {\n          fullscreen.value = e.state;\n        });\n      }\n\n      function handleImageUploading(name: string) {\n        const editor = unref(editorRef);\n        if (!editor) {\n          return;\n        }\n        editor.execCommand('mceInsertContent', false, getUploadingImgName(name));\n        const content = editor?.getContent() ?? '';\n        setValue(editor, content);\n      }\n\n      async function handleDone(name: string, url: string) {\n        const editor = unref(editorRef);\n        if (!editor) {\n          return;\n        }\n        await handleImageUploading(name);\n        const content = editor?.getContent() ?? '';\n        const val = content?.replace(getUploadingImgName(name), `<img src=\"${url}\"/>`) ?? '';\n        setValue(editor, val);\n      }\n\n      /**\n       * 上传进度计算\n       * @param file\n       * @param fileList\n       */\n      function handleLoading(fileLength,showMask){\n        if(fileLength && fileLength > 0){\n          setTimeout(() => {\n              props?.showUploadMask && processMaskRef.value.calcProcess(fileLength)\n          },100)\n        }else{\n           props?.showUploadMask && (processMaskRef.value.showMask = showMask);\n        }\n      }\n      function getUploadingImgName(name: string) {\n        return `[uploading:${name}]`;\n      }\n      // 代码逻辑说明: 【TV360X-35】富文本，图片上传遮挡其他按钮\n      let executeCount = 0;\n      watch(\n        () => props.showImageUpload,\n        () => {\n          mountElem();\n        }\n      );\n      onMounted(() => {\n        mountElem();\n      });\n      const mountElem = () => {\n        if (executeCount > 20) return;\n        setTimeout(() => {\n          if (targetElem.value) {\n            imgUploadShow.value = props.showImageUpload;\n          } else {\n            const toxToolbar = editorRootRef.value?.querySelector('.tox-toolbar__group');\n            if (toxToolbar) {\n              const divElem = document.createElement('div');\n              divElem.setAttribute('style', `width:64px;height:39px;display:flex;align-items:center;`);\n              toxToolbar!.appendChild(divElem);\n              targetElem.value = divElem;\n              imgUploadShow.value = props.showImageUpload;\n              executeCount = 0;\n            } else {\n              mountElem();\n            }\n          }\n          executeCount++;\n        }, 100);\n      };\n      // 代码逻辑说明: 【QQYUN-8639】暗黑主题适配\n      function changeColor() {\n        setTimeout(() => {\n          const iframe = editorRootRef.value?.querySelector('iframe');\n          const body = iframe?.contentDocument?.querySelector('body');\n          if (body) {\n            if (appStore.getDarkMode == ThemeEnum.DARK) {\n              body.style.color = '#fff';\n            } else {\n              body.style.color = '#000';\n            }\n          }\n        }, 300);\n      }\n      watch(\n        () => appStore.getDarkMode,\n        () => {\n          changeColor();\n        }\n      );\n\n      /**\n       * 处理图片链接地址\n       *\n       * @param pasteContent\n       */\n      async function preprocess(pasteContent) {\n        // 正则提取所有img标签（包含src和其他属性，避免丢失样式/alt等）\n        const imgTagRegex = /<img([^>]+)src=\"([^\">]+)\"([^>]*)/g;\n\n        // 收集所有需要替换的图片信息（索引、原始src、完整标签）\n        const imgReplaceList:any = [];\n        let match;\n        while ((match = imgTagRegex.exec(pasteContent)) !== null) {\n          imgReplaceList.push({\n            // 完整的img标签（如<img class=\"xxx\" src=\"xxx\" alt=\"xxx\">）\n            fullTag: match[0],\n            // 原始图片URL\n            src: match[2],\n            // src前的属性（如class=\"xxx\" ）\n            prefix: match[1],\n            // src后的属性（如 alt=\"xxx\"）\n            suffix: match[3]\n          });\n        }\n   \n        // 替换所有图片URL为服务器地址\n        let processedContent = pasteContent;\n        // 获取当前域名（协议+域名+端口）\n        const currentOrigin = window.location.hostname;\n        console.log(\"当前域名：\"+ currentOrigin)\n        // 处理图片\n        for (const imgInfo of imgReplaceList) {\n          try {\n            if(imgInfo.src.startsWith('http')){\n              // 判断是否为当前域名下的图片\n              let isOwnServer = false;\n              try {\n                const imgHost = new URL(imgInfo.src, window.location.href).hostname;\n                isOwnServer = imgHost === currentOrigin;\n                console.log(\"图片中的域名：\" + imgHost)\n              } catch (e) {\n                // 如果URL解析失败，使用简单的hostname检查作为后备\n                isOwnServer = imgInfo.src.includes(window.location.hostname);\n                console.log(\"图片中的域名：\" + window.location.hostname)\n              }\n              if(!isOwnServer){\n                // 非当前域名的网络图片，需要上传\n                const filename = getFilenameFromUrl(imgInfo.src) || 'pasted-image.jpg';\n                let newUrl = await uploadImage(imgInfo.src, filename);\n                if(newUrl){\n                  const newImgTag = `<img${imgInfo.prefix}src=\"${newUrl}\"${imgInfo.suffix}`;\n                  processedContent = processedContent.replace(imgInfo.fullTag, newImgTag);\n                }\n              }\n              // 如果是当前域名下的图片，不做任何处理，保持原样\n            }\n          } catch (error) {}\n        }\n        return processedContent;\n      }\n      \n      \n      /**\n       * 根据路径获取文件名\n       * \n       * @param url\n       */\n      function getFilenameFromUrl(url) {\n        return url.split('/').pop().split('?')[0];\n      }\n\n      /**\n       * 上传文件并返回文件路径\n       * \n       * @param fileUrl\n       * @param filename\n       */\n      async function uploadImage(fileUrl, filename) {\n        let params = {\n          fileUrl: fileUrl,\n          filename: filename,\n        };\n        try {\n          let { message } = await defHttp.post({ url: \"/sys/common/uploadImgByHttp\", params },{ isTransformResponse: false });\n          return getFileAccessHttpUrl(message);\n        } catch (e) {\n          return \"\";\n        }\n      }\n      //update-begin-author:liusq---date:2025-11-19--for: JHHB-1070 从word复制的表格不能对齐\n      /**\n       * 处理表格居中\n       * @param editor\n       */\n      function initTableAlignment(editor) {\n        // 表格左对齐 - 带表格图标的左对齐\n        editor.ui.registry.addIcon('table-align-left', '<svg width=\"24\" height=\"24\"><rect x=\"2\" y=\"8\" width=\"16\" height=\"8\" fill=\"currentColor\"/><path d=\"M2 4h20v2H2zm0 14h12v2H2z\" fill=\"currentColor\"/></svg>');\n\n        // 表格居中对齐 - 带表格图标的居中对齐\n        editor.ui.registry.addIcon('table-align-center', '<svg width=\"24\" height=\"24\"><rect x=\"4\" y=\"8\" width=\"16\" height=\"8\" fill=\"currentColor\"/><path d=\"M2 4h20v2H2zm4 14h12v2H6z\" fill=\"currentColor\"/></svg>');\n\n        // 表格右对齐 - 带表格图标的右对齐\n        editor.ui.registry.addIcon('table-align-right', '<svg width=\"24\" height=\"24\"><rect x=\"6\" y=\"8\" width=\"16\" height=\"8\" fill=\"currentColor\"/><path d=\"M2 4h20v2H2zm8 14h12v2H10z\" fill=\"currentColor\"/></svg>');\n\n        // 添加表格专用对齐按钮\n        editor.ui.registry.addButton('tablealignleft', {\n          tooltip: '表格左对齐',\n          icon: 'table-align-left',\n          onAction: () => {\n            const table = getSelectedTable(editor);\n            if (table) alignTable(editor, table, 'JustifyLeft');\n          }\n        });\n        editor.ui.registry.addButton('tablealigncenter', {\n          tooltip: '表格居中',\n          icon: 'table-align-center',\n          onAction: () => {\n            const table = getSelectedTable(editor);\n            if (table) alignTable(editor, table, 'JustifyCenter');\n          }\n        });\n\n        editor.ui.registry.addButton('tablealignright', {\n          tooltip: '表格右对齐',\n          icon: 'table-align-right',\n          onAction: () => {\n            const table = getSelectedTable(editor);\n            if (table) alignTable(editor, table, 'JustifyRight');\n          }\n        });\n      }\n\n      // 获取当前选中的表格\n      function getSelectedTable(editor) {\n        const selectedNode = editor.selection.getNode();\n        return selectedNode.closest('table');\n      }\n\n      // 使用包装器的表格对齐函数\n      function alignTable(editor, table, command) {\n        // 检查表格是否已经被包装\n        let wrapper = table.parentNode;\n        const isWrapped = wrapper && wrapper.classList && wrapper.classList.contains('table-wrapper');\n\n        switch (command) {\n          case 'JustifyLeft':\n          case 'JustifyRight':\n            // 对于左右对齐，移除包装器（如果有）\n            if (isWrapped) {\n              editor.dom.remove(wrapper, true); // 移除包装器但保留表格\n            }\n            // 直接设置表格的浮动\n            editor.dom.setStyle(table, 'float', command === 'JustifyLeft' ? 'left' : 'right');\n            editor.dom.setStyle(table, 'margin', '0');\n            break;\n\n          case 'JustifyCenter':\n            // 对于居中对齐，使用包装器\n            if (!isWrapped) {\n              // 创建包装器\n              wrapper = editor.dom.create('div', {\n                'class': 'table-wrapper',\n                style: 'text-align: center; margin: 0 auto;'\n              });\n\n              // 包装表格\n              table.parentNode.insertBefore(wrapper, table);\n              wrapper.appendChild(table);\n            }\n\n            // 设置包装器样式\n            editor.dom.setStyles(wrapper, {\n              'text-align': 'center',\n              'margin': '0 auto',\n              'display': 'block'\n            });\n            // 移除表格的浮动和边距\n            editor.dom.setStyles(table, {\n              'float': '',\n              'margin': '0',\n              'display': 'inline-table' // 保持表格显示特性\n            });\n            break;\n\n          case 'JustifyFull':\n            // 移除包装器（如果有）\n            if (isWrapped) {\n              editor.dom.remove(wrapper, true);\n            }\n            editor.dom.setStyle(table, 'width', '100%');\n            editor.dom.setStyle(table, 'float', '');\n            break;\n        }\n\n        // 触发变更事件\n        editor.fire('change');\n        editor.undoManager.add();\n      }\n      //update-end-author:liusq---date:2025-11-19--for: JHHB-1070 从word复制的表格不能对齐 \n\n      return {\n        prefixCls,\n        containerWidth,\n        initOptions,\n        tinymceContent,\n        elRef,\n        tinymceId,\n        handleImageUploading,\n        handleDone,\n        editorRef,\n        fullscreen,\n        disabled,\n        editorRootRef,\n        imgUploadShow,\n        targetElem,\n\n        handleLoading,\n        processMaskRef,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n/* 表格包装器样式 */\n.table-wrapper {\n  text-align: center;\n  margin: 0 auto;\n  display: block;\n}\n\n/* 确保在编辑器中正确显示 */\n.tox-edit-area__iframe {\n  .table-wrapper {\n    text-align: center !important;\n    margin: 0 auto !important;\n    display: block !important;\n  }\n\n  .table-wrapper table {\n    display: inline-table !important;\n    margin: 0 !important;\n    float: none !important;\n  }\n}\n</style>\n\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-tinymce-container';\n\n  .@{prefix-cls} {\n    position: relative;\n    line-height: normal;\n\n    textarea {\n      z-index: -1;\n      visibility: hidden;\n    }\n    .tox:not(.tox-tinymce-inline) .tox-editor-header {\n      padding:0;\n    }\n    // 代码逻辑说明: 【TV360X-329】富文本禁用状态下工具栏划过边框丢失\n    .tox .tox-tbtn--disabled,\n    .tox .tox-tbtn--disabled:hover,\n    .tox .tox-tbtn:disabled,\n    .tox .tox-tbtn:disabled:hover {\n      background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23d9d9d9'/%3E%3C/svg%3E\");\n      background-position: left 0;\n    }\n  }\n\n  html[data-theme='dark'] {\n    .@{prefix-cls} {\n      .tox .tox-edit-area__iframe {background-color: #141414;}\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tinymce/src/ImgUpload.vue",
    "content": "<template>\n  <div :class=\"[prefixCls, { fullscreen }]\">\n    <Upload\n      name=\"file\"\n      multiple\n      @change=\"handleChange\"\n      :action=\"uploadUrl\"\n      :showUploadList=\"false\"\n      :data=\"getBizData()\"\n      :headers=\"getheader()\"\n      :before-upload=\"beforeUpload\"\n      accept=\".jpg,.jpeg,.gif,.png,.webp\"\n    >\n      <a-button type=\"primary\" v-bind=\"{ ...getButtonProps }\">\n        {{ t('component.upload.imgUpload') }}\n      </a-button>\n    </Upload>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, computed, ref } from 'vue';\n\n  import { Upload } from 'ant-design-vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useGlobSetting } from '/@/hooks/setting';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { getFileAccessHttpUrl, getHeaders } from '/@/utils/common/compUtils';\n\n  export default defineComponent({\n    name: 'TinymceImageUpload',\n    components: { Upload },\n    props: {\n      fullscreen: {\n        type: Boolean,\n      },\n      disabled: {\n        type: Boolean,\n        default: false,\n      },\n    },\n    emits: ['uploading', 'done', 'error', 'loading'],\n    setup(props, { emit }) {\n      // 代码逻辑说明: 富文本上传图片不支持\n      function getheader() {\n        return getHeaders();\n      }\n\n      function getBizData() {\n        return {\n          biz: 'jeditor',\n          jeditor: '1',\n        };\n      }\n      const { domainUrl } = useGlobSetting();\n      const uploadUrl = domainUrl + '/sys/common/upload';\n      //文件列表\n      let uploadFileList = ref<any[]>([]);\n      const { t } = useI18n();\n      const { prefixCls } = useDesign('tinymce-img-upload');\n\n      const getButtonProps = computed(() => {\n        const { disabled } = props;\n        return {\n          disabled,\n        };\n      });\n\n      let uploadLength = 0;\n      function handleChange({ file, fileList }) {\n        // 过滤掉已经存在的文件\n        fileList = fileList.filter((file) => {\n          const existFile = uploadFileList.value.find(({ uid }) => uid === file.uid);\n          return existFile ? false : true;\n        });\n        uploadLength == 0 && (uploadLength = fileList.length);\n        if (file.status != 'uploading') {\n          emit('loading', uploadLength, true);\n        }\n        // 处理上传好的文件\n        if (file.status != 'uploading') {\n          fileList.forEach((file) => {\n            if (file.status === 'done' && file.response.success) {\n              const name = file?.name;\n              let realUrl = getFileAccessHttpUrl(file.response.message);\n              uploadFileList.value.push(file);\n              emit('done', name, realUrl);\n            }\n          });\n        }\n      }\n      //上传之前\n      function beforeUpload() {\n        uploadLength = 0;\n        emit('loading', null, true);\n        setTimeout(() => {\n          emit('loading', null, false);\n        }, 10000);\n      }\n      return {\n        prefixCls,\n        handleChange,\n        uploadUrl,\n        getheader,\n        getBizData,\n        t,\n        getButtonProps,\n        uploadFileList,\n        beforeUpload,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-tinymce-img-upload';\n\n  .@{prefix-cls} {\n    background-color: @primary-color;\n    margin: 0 3px;\n    &.fullscreen {\n      position: fixed;\n      z-index: 10000;\n    }\n    // 代码逻辑说明: 【QQYUN-8647】online tinymce组件上传图片按遮挡了控件栏的全屏按钮\n    .ant-btn {\n      padding: 2px 4px;\n      font-size: 12px;\n      height: 24px;\n      // 代码逻辑说明: 【TV360X-235】富文本禁用状态下图片上传按钮文字看不清\n      &.is-disabled {\n        color: rgba(255, 255, 255, 0.5);\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tinymce/src/ProcessMask.vue",
    "content": "<template>\n  <div :class=\"[prefixCls]\" v-if=\"showMask && show\">\n    <div class=\"progress-bar-rear\">\n      <div class=\"progress-bar-front\" :style=\"{ width: progressBarWidth }\"></div>\n    </div>\n    <div class=\"value\">{{ percentage }}</div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { computed, ref } from 'vue';\n  import {useDesign} from \"@/hooks/web/useDesign\";\n\n  const props = defineProps({\n    backColor: {\n      type: [String],\n      default: 'white',\n    },\n    processColor: {\n      type: String,\n      default: '#018FFB',\n    },\n    show: {\n      type: Boolean,\n      default: false,\n    },\n  });\n  const { prefixCls } = useDesign('tinymce-process-mask');\n\n  //显示遮罩\n  const showMask = ref(false);\n  //进度值占比\n  const progressValue = ref<any>(0);\n  //当前数量\n  const currentNum = ref(0);\n  // 计算进度条宽度的计算属性\n  const progressBarWidth = computed(() => {\n    return progressValue.value > 0 ? `${progressValue.value}px` : '0px';\n  });\n  // 计算进度条百分比\n  const percentage = computed(() => {\n    return `${progressValue.value}%`;\n  });\n  // 进度色\n  const frontColor = computed(() => {\n    return props.processColor;\n  });\n  // 后置背景色\n  const rearColor = computed(() => {\n    return props.backColor;\n  });\n  function calcProcess(totalNum) {\n    !showMask.value && (showMask.value = true);\n    currentNum.value += 1;\n    progressValue.value = ((currentNum.value / totalNum) * 100).toFixed(2);\n    console.log('currentNum.value', currentNum.value);\n    console.log('totalNum.value', totalNum);\n    if (currentNum.value == totalNum) {\n      showMask.value = false;\n      currentNum.value = 0;\n      progressValue.value = 0;\n    }\n  }\n  defineExpose({\n    calcProcess,\n    showMask,\n  });\n</script>\n\n<style lang=\"less\">\n//noinspection LessUnresolvedVariable\n@prefix-cls: ~'@{namespace}-tinymce-process-mask';\n\n.@{prefix-cls} {\n\n  & {\n    position: absolute; /* 或者使用固定定位等其他方式 */\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background-color: rgba(0, 0, 0, 0.5); /* 半透明遮罩 */\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    overflow: hidden;\n    z-index: 99;\n  }\n\n  .progress-bar-rear {\n    width: 100px; /* 进度条宽度 */\n    height: 10px; /* 进度条高度 */\n    background-color: v-bind(rearColor); /* 进度条颜色 */\n    border-radius: 4px;\n  }\n\n  .progress-bar-front {\n    height: 10px; /* 进度条高度 */\n    background-color: v-bind(frontColor); /* 进度条颜色 */\n    border-radius: 4px;\n  }\n\n  .value {\n    color: #fff;\n    margin-left: 5px;\n    font-size: 16px;\n    font-weight: 600;\n  }\n}\n\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tinymce/src/helper.ts",
    "content": "const validEvents = [\n  'onActivate',\n  'onAddUndo',\n  'onBeforeAddUndo',\n  'onBeforeExecCommand',\n  'onBeforeGetContent',\n  'onBeforeRenderUI',\n  'onBeforeSetContent',\n  'onBeforePaste',\n  'onBlur',\n  'onChange',\n  'onClearUndos',\n  'onClick',\n  'onContextMenu',\n  'onCopy',\n  'onCut',\n  'onDblclick',\n  'onDeactivate',\n  'onDirty',\n  'onDrag',\n  'onDragDrop',\n  'onDragEnd',\n  'onDragGesture',\n  'onDragOver',\n  'onDrop',\n  'onExecCommand',\n  'onFocus',\n  'onFocusIn',\n  'onFocusOut',\n  'onGetContent',\n  'onHide',\n  'onInit',\n  'onKeyDown',\n  'onKeyPress',\n  'onKeyUp',\n  'onLoadContent',\n  'onMouseDown',\n  'onMouseEnter',\n  'onMouseLeave',\n  'onMouseMove',\n  'onMouseOut',\n  'onMouseOver',\n  'onMouseUp',\n  'onNodeChange',\n  'onObjectResizeStart',\n  'onObjectResized',\n  'onObjectSelected',\n  'onPaste',\n  'onPostProcess',\n  'onPostRender',\n  'onPreProcess',\n  'onProgressState',\n  'onRedo',\n  'onRemove',\n  'onReset',\n  'onSaveContent',\n  'onSelectionChange',\n  'onSetAttrib',\n  'onSetContent',\n  'onShow',\n  'onSubmit',\n  'onUndo',\n  'onVisualAid',\n];\n\nconst isValidKey = (key: string) => validEvents.indexOf(key) !== -1;\n\nexport const bindHandlers = (initEvent: Event, listeners: any, editor: any): void => {\n  Object.keys(listeners)\n    .filter(isValidKey)\n    .forEach((key: string) => {\n      const handler = listeners[key];\n      if (typeof handler === 'function') {\n        if (key === 'onInit') {\n          handler(initEvent, editor);\n        } else {\n          editor.on(key.substring(2), (e: any) => handler(e, editor));\n        }\n      }\n    });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tinymce/src/tinymce.ts",
    "content": "// Any plugins you want to setting has to be imported\n// Detail plugins list see https://www.tinymce.com/docs/plugins/\n// Custom builds see https://www.tinymce.com/download/custom-builds/\n// colorpicker/contextmenu/textcolor plugin is now built in to the core editor, please remove it from your editor configuration\n\nexport const plugins = [\n  'advlist anchor autolink autosave code codesample  directionality  fullscreen hr insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace tabfocus  template  textpattern visualblocks visualchars wordcount image',\n];\n\nexport const toolbar =\n  'fullscreen code preview | undo redo | bold italic underline strikethrough | fontselect fontsizeselect formatselect | alignleft aligncenter alignright alignjustify | outdent indent lineheight|subscript superscript blockquote| numlist bullist checklist | forecolor backcolor casechange permanentpen formatpainter removeformat | pagebreak | charmap emoticons   | insertfile image media pageembed  link anchor  codesample insertdatetime hr| a11ycheck ltr rtl';\n\nexport const simplePlugins = 'lists image link fullscreen paste';\n\nexport const simpleToolbar = [\n  'undo redo styles  forecolor fontsize bold italic alignleft aligncenter alignright alignjustify bullist numlist outdent indent lists image link fullscreen',\n];\n\nexport const menubar = 'file edit insert view format table';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Transition/index.ts",
    "content": "import { createSimpleTransition, createJavascriptTransition } from './src/CreateTransition';\n\nimport ExpandTransitionGenerator from './src/ExpandTransition';\n\nexport { default as CollapseTransition } from './src/CollapseTransition.vue';\n\nexport const FadeTransition = createSimpleTransition('fade-transition');\nexport const ScaleTransition = createSimpleTransition('scale-transition');\nexport const SlideYTransition = createSimpleTransition('slide-y-transition');\nexport const ScrollYTransition = createSimpleTransition('scroll-y-transition');\nexport const SlideYReverseTransition = createSimpleTransition('slide-y-reverse-transition');\nexport const ScrollYReverseTransition = createSimpleTransition('scroll-y-reverse-transition');\nexport const SlideXTransition = createSimpleTransition('slide-x-transition');\nexport const ScrollXTransition = createSimpleTransition('scroll-x-transition');\nexport const SlideXReverseTransition = createSimpleTransition('slide-x-reverse-transition');\nexport const ScrollXReverseTransition = createSimpleTransition('scroll-x-reverse-transition');\nexport const ScaleRotateTransition = createSimpleTransition('scale-rotate-transition');\n\nexport const ExpandXTransition = createJavascriptTransition('expand-x-transition', ExpandTransitionGenerator('', true));\n\nexport const ExpandTransition = createJavascriptTransition('expand-transition', ExpandTransitionGenerator(''));\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Transition/src/CollapseTransition.vue",
    "content": "<template>\n  <transition mode=\"out-in\" v-on=\"on\">\n    <slot></slot>\n  </transition>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { addClass, removeClass } from '/@/utils/domUtils';\n\n  export default defineComponent({\n    name: 'CollapseTransition',\n    setup() {\n      return {\n        on: {\n          beforeEnter(el) {\n            addClass(el, 'collapse-transition');\n            if (!el.dataset) el.dataset = {};\n\n            el.dataset.oldPaddingTop = el.style.paddingTop;\n            el.dataset.oldPaddingBottom = el.style.paddingBottom;\n\n            el.style.height = '0';\n            el.style.paddingTop = 0;\n            el.style.paddingBottom = 0;\n          },\n\n          enter(el) {\n            el.dataset.oldOverflow = el.style.overflow;\n            if (el.scrollHeight !== 0) {\n              el.style.height = el.scrollHeight + 'px';\n              el.style.paddingTop = el.dataset.oldPaddingTop;\n              el.style.paddingBottom = el.dataset.oldPaddingBottom;\n            } else {\n              el.style.height = '';\n              el.style.paddingTop = el.dataset.oldPaddingTop;\n              el.style.paddingBottom = el.dataset.oldPaddingBottom;\n            }\n\n            el.style.overflow = 'hidden';\n          },\n\n          afterEnter(el) {\n            removeClass(el, 'collapse-transition');\n            el.style.height = '';\n            el.style.overflow = el.dataset.oldOverflow;\n          },\n\n          beforeLeave(el) {\n            if (!el.dataset) el.dataset = {};\n            el.dataset.oldPaddingTop = el.style.paddingTop;\n            el.dataset.oldPaddingBottom = el.style.paddingBottom;\n            el.dataset.oldOverflow = el.style.overflow;\n\n            el.style.height = el.scrollHeight + 'px';\n            el.style.overflow = 'hidden';\n          },\n\n          leave(el) {\n            if (el.scrollHeight !== 0) {\n              addClass(el, 'collapse-transition');\n              el.style.height = 0;\n              el.style.paddingTop = 0;\n              el.style.paddingBottom = 0;\n            }\n          },\n\n          afterLeave(el) {\n            removeClass(el, 'collapse-transition');\n            el.style.height = '';\n            el.style.overflow = el.dataset.oldOverflow;\n            el.style.paddingTop = el.dataset.oldPaddingTop;\n            el.style.paddingBottom = el.dataset.oldPaddingBottom;\n          },\n        },\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Transition/src/CreateTransition.tsx",
    "content": "import type { PropType } from 'vue';\n\nimport { defineComponent, Transition, TransitionGroup } from 'vue';\nimport { getSlot } from '/@/utils/helper/tsxHelper';\n\ntype Mode = 'in-out' | 'out-in' | 'default' | undefined;\n\nexport function createSimpleTransition(name: string, origin = 'top center 0', mode?: Mode) {\n  return defineComponent({\n    name,\n    props: {\n      group: {\n        type: Boolean as PropType<boolean>,\n        default: false,\n      },\n      mode: {\n        type: String as PropType<Mode>,\n        default: mode,\n      },\n      origin: {\n        type: String as PropType<string>,\n        default: origin,\n      },\n    },\n    setup(props, { slots, attrs }) {\n      const onBeforeEnter = (el: HTMLElement) => {\n        el.style.transformOrigin = props.origin;\n      };\n\n      return () => {\n        const Tag = !props.group ? Transition : TransitionGroup;\n        return (\n          <Tag name={name} mode={props.mode} {...attrs} onBeforeEnter={onBeforeEnter}>\n            {() => getSlot(slots)}\n          </Tag>\n        );\n      };\n    },\n  });\n}\nexport function createJavascriptTransition(name: string, functions: Recordable, mode: Mode = 'in-out') {\n  return defineComponent({\n    name,\n    props: {\n      mode: {\n        type: String as PropType<Mode>,\n        default: mode,\n      },\n    },\n    setup(props, { attrs, slots }) {\n      return () => {\n        return (\n          <Transition\n            name={name}\n            mode={props.mode}\n            {...attrs}\n            onBeforeEnter={functions.beforeEnter}\n            onEnter={functions.enter}\n            onLeave={functions.leave}\n            onAfterLeave={functions.afterLeave}\n            onLeaveCancelled={functions.afterLeave}\n          >\n            {() => getSlot(slots)}\n          </Transition>\n        );\n      };\n    },\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Transition/src/ExpandTransition.ts",
    "content": "/**\n * Makes the first character of a string uppercase\n */\nexport function upperFirst(str: string): string {\n  return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\ninterface HTMLExpandElement extends HTMLElement {\n  _parent?: (Node & ParentNode & HTMLElement) | null;\n  _initialStyle: {\n    transition: string;\n    overflow: string | null;\n    height?: string | null;\n    width?: string | null;\n  };\n}\n\nexport default function (expandedParentClass = '', x = false) {\n  const sizeProperty = x ? 'width' : ('height' as 'width' | 'height');\n  const offsetProperty = `offset${upperFirst(sizeProperty)}` as 'offsetHeight' | 'offsetWidth';\n\n  return {\n    beforeEnter(el: HTMLExpandElement) {\n      el._parent = el.parentNode as (Node & ParentNode & HTMLElement) | null;\n      el._initialStyle = {\n        transition: el.style.transition,\n        overflow: el.style.overflow,\n        [sizeProperty]: el.style[sizeProperty],\n      };\n    },\n\n    enter(el: HTMLExpandElement) {\n      const initialStyle = el._initialStyle;\n\n      el.style.setProperty('transition', 'none', 'important');\n      el.style.overflow = 'hidden';\n      // const offset = `${el[offsetProperty]}px`;\n\n      // el.style[sizeProperty] = '0';\n\n      void el.offsetHeight; // force reflow\n\n      el.style.transition = initialStyle.transition;\n\n      if (expandedParentClass && el._parent) {\n        el._parent.classList.add(expandedParentClass);\n      }\n\n      requestAnimationFrame(() => {\n        // el.style[sizeProperty] = offset;\n      });\n    },\n\n    afterEnter: resetStyles,\n    enterCancelled: resetStyles,\n\n    leave(el: HTMLExpandElement) {\n      el._initialStyle = {\n        transition: '',\n        overflow: el.style.overflow,\n        [sizeProperty]: el.style[sizeProperty],\n      };\n\n      el.style.overflow = 'hidden';\n      el.style[sizeProperty] = `${el[offsetProperty]}px`;\n      /* eslint-disable-next-line */\n      void el.offsetHeight; // force reflow\n\n      requestAnimationFrame(() => (el.style[sizeProperty] = '0'));\n    },\n\n    afterLeave,\n    leaveCancelled: afterLeave,\n  };\n\n  function afterLeave(el: HTMLExpandElement) {\n    if (expandedParentClass && el._parent) {\n      el._parent.classList.remove(expandedParentClass);\n    }\n    resetStyles(el);\n  }\n\n  function resetStyles(el: HTMLExpandElement) {\n    const size = el._initialStyle[sizeProperty];\n    el.style.overflow = el._initialStyle.overflow!;\n    if (size != null) el.style[sizeProperty] = size;\n    Reflect.deleteProperty(el, '_initialStyle');\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tree/index.ts",
    "content": "import BasicTree from './src/BasicTree.vue';\nimport './style';\n\nexport { BasicTree };\nexport type { ContextMenuItem } from '/@/hooks/web/useContextMenu';\nexport * from './src/types/tree';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tree/src/BasicTree.vue",
    "content": "<script lang=\"tsx\">\n  import type { CSSProperties } from 'vue';\n  import type {\n    FieldNames,\n    TreeState,\n    TreeItem,\n    KeyType,\n    CheckKeys,\n    TreeActionType,\n  } from './types/tree';\n\n  import {\n    defineComponent,\n    reactive,\n    computed,\n    unref,\n    ref,\n    watchEffect,\n    toRaw,\n    watch,\n    onMounted,\n    nextTick,\n  } from 'vue';\n  import TreeHeader from './components/TreeHeader.vue';\n  import { Tree, Spin, Empty } from 'ant-design-vue';\n  import { TreeIcon } from './TreeIcon';\n  import { ScrollContainer } from '/@/components/Container';\n  import { omit, get, difference, cloneDeep } from 'lodash-es';\n  import { isArray, isBoolean, isEmpty, isFunction } from '/@/utils/is';\n  import { extendSlots, getSlot } from '/@/utils/helper/tsxHelper';\n  import { filter, treeToList, eachTree } from '/@/utils/helper/treeHelper';\n  import { useTree } from './hooks/useTree';\n  import { useContextMenu } from '/@/hooks/web/useContextMenu';\n  import { CreateContextOptions } from '/@/components/ContextMenu';\n  import { treeEmits, treeProps } from './types/tree';\n  import { createBEM } from '/@/utils/bem';\n\n  export default defineComponent({\n    name: 'BasicTree',\n    inheritAttrs: false,\n    props: treeProps,\n    emits: treeEmits,\n    setup(props, { attrs, slots, emit, expose }) {\n      const [bem] = createBEM('tree');\n\n      const state = reactive<TreeState>({\n        checkStrictly: props.checkStrictly,\n        expandedKeys: props.expandedKeys || [],\n        selectedKeys: props.selectedKeys || [],\n        checkedKeys: props.checkedKeys || [],\n      });\n\n      const searchState = reactive({\n        startSearch: false,\n        searchText: '',\n        searchData: [] as TreeItem[],\n      });\n\n      const treeDataRef = ref<TreeItem[]>([]);\n\n      const [createContextMenu] = useContextMenu();\n\n      const getFieldNames = computed((): Required<FieldNames> => {\n        const { fieldNames } = props;\n        return {\n          children: 'children',\n          title: 'title',\n          key: 'key',\n          ...fieldNames,\n        };\n      });\n      const treeRef = ref<any>(null);\n\n      const getBindValues = computed(() => {\n        let propsData = {\n          blockNode: true,\n          ...attrs,\n          ...props,\n          expandedKeys: state.expandedKeys,\n          selectedKeys: state.selectedKeys,\n          checkedKeys: state.checkedKeys,\n          checkStrictly: state.checkStrictly,\n          fieldNames: unref(getFieldNames),\n          'onUpdate:expandedKeys': (v: KeyType[]) => {\n            state.expandedKeys = v;\n            emit('update:expandedKeys', v);\n          },\n          'onUpdate:selectedKeys': (v: KeyType[]) => {\n            state.selectedKeys = v;\n            emit('update:selectedKeys', v);\n          },\n          onCheck: (v: CheckKeys, e) => {\n            handleCheck(v, e);\n          },\n          onRightClick: handleRightClick,\n        };\n        return omit(propsData, 'treeData', 'class');\n      });\n      /**\n       * 2024-04-26\n       * liaozhiyang\n       * 【issues/1151】层级独立时勾选了父级，然后点击层级关联子级视觉上勾选了，但是保存子级没存上(把函数独立出来复用)\n       * */\n      const handleCheck = (v: CheckKeys, e?) => {\n        let currentValue = toRaw(state.checkedKeys) as KeyType[];\n        if (isArray(currentValue) && searchState.startSearch && e) {\n          // 代码逻辑说明: [issue/429]树搜索点击事件失效---\n          const value = e.node.eventKey;\n          currentValue = difference(currentValue, getChildrenKeys(value));\n          if (e.checked) {\n            currentValue.push(value);\n          }\n          state.checkedKeys = currentValue;\n        } else {\n          state.checkedKeys = v;\n        }\n        const rawVal = toRaw(state.checkedKeys);\n        emit('update:value', rawVal);\n        emit('check', rawVal, e);\n      };\n\n      const getTreeData = computed((): TreeItem[] =>\n        searchState.startSearch ? searchState.searchData : unref(treeDataRef),\n      );\n\n      const getNotFound = computed((): boolean => {\n        return !getTreeData.value || getTreeData.value.length === 0;\n      });\n\n      const {\n        deleteNodeByKey,\n        insertNodeByKey,\n        insertNodesByKey,\n        filterByLevel,\n        updateNodeByKey,\n        getAllKeys,\n        getChildrenKeys,\n        getEnabledKeys,\n        getSelectedNode,\n      } = useTree(treeDataRef, getFieldNames);\n\n      function getIcon(params: Recordable, icon?: string) {\n        if (!icon) {\n          if (props.renderIcon && isFunction(props.renderIcon)) {\n            return props.renderIcon(params);\n          }\n        }\n        return icon;\n      }\n\n      async function handleRightClick({ event, node }: Recordable) {\n        const { rightMenuList: menuList = [], beforeRightClick } = props;\n        let contextMenuOptions: CreateContextOptions = { event, items: [] };\n\n        if (beforeRightClick && isFunction(beforeRightClick)) {\n          let result = await beforeRightClick(node, event);\n          if (Array.isArray(result)) {\n            contextMenuOptions.items = result;\n          } else {\n            Object.assign(contextMenuOptions, result);\n          }\n        } else {\n          contextMenuOptions.items = menuList;\n        }\n        if (!contextMenuOptions.items?.length) return;\n        contextMenuOptions.items = contextMenuOptions.items.filter((item) => !item.hidden);\n        createContextMenu(contextMenuOptions);\n      }\n\n      function setExpandedKeys(keys: KeyType[]) {\n        state.expandedKeys = keys;\n      }\n\n      function getExpandedKeys() {\n        return state.expandedKeys;\n      }\n      function setSelectedKeys(keys: KeyType[]) {\n        state.selectedKeys = keys;\n      }\n\n      function getSelectedKeys() {\n        return state.selectedKeys;\n      }\n\n      function setCheckedKeys(keys: CheckKeys) {\n        state.checkedKeys = keys;\n      }\n\n      function getCheckedKeys() {\n        return state.checkedKeys;\n      }\n\n      function checkAll(checkAll: boolean) {\n        state.checkedKeys = checkAll ? getEnabledKeys() : ([] as KeyType[]);\n      }\n\n      function expandAll(expandAll: boolean) {\n        state.expandedKeys = expandAll ? getAllKeys() : ([] as KeyType[]);\n      }\n\n      function onStrictlyChange(strictly: boolean) {\n        state.checkStrictly = strictly;\n      }\n\n      watch(\n        () => props.searchValue,\n        (val) => {\n          if (val !== searchState.searchText) {\n            searchState.searchText = val;\n          }\n        },\n        {\n          immediate: true,\n        },\n      );\n\n      watch(\n        () => props.treeData,\n        (val) => {\n          if (val) {\n            handleSearch(searchState.searchText);\n          }\n        },\n      );\n\n      function handleSearch(searchValue: string) {\n        if (searchValue !== searchState.searchText) searchState.searchText = searchValue;\n        emit('update:searchValue', searchValue);\n        if (!searchValue) {\n          searchState.startSearch = false;\n          return;\n        }\n        const { filterFn, checkable, expandOnSearch, checkOnSearch, selectedOnSearch } =\n          unref(props);\n        searchState.startSearch = true;\n        const { title: titleField, key: keyField } = unref(getFieldNames);\n\n        const matchedKeys: string[] = [];\n        searchState.searchData = filter(\n          unref(treeDataRef),\n          (node) => {\n            const result = filterFn\n              ? filterFn(searchValue, node, unref(getFieldNames))\n              : node[titleField]?.includes(searchValue) ?? false;\n            if (result) {\n              matchedKeys.push(node[keyField]);\n            }\n            return result;\n          },\n          unref(getFieldNames),\n        );\n\n        if (expandOnSearch) {\n          const expandKeys = treeToList(searchState.searchData).map((val) => {\n            return val[keyField];\n          });\n          if (expandKeys && expandKeys.length) {\n            setExpandedKeys(expandKeys);\n          }\n        }\n\n        if (checkOnSearch && checkable && matchedKeys.length) {\n          setCheckedKeys(matchedKeys);\n        }\n\n        if (selectedOnSearch && matchedKeys.length) {\n          setSelectedKeys(matchedKeys);\n        }\n      }\n\n      function handleClickNode(key: string, children: TreeItem[]) {\n        if (!props.clickRowToExpand || !children || children.length === 0) return;\n        if (!state.expandedKeys.includes(key)) {\n          setExpandedKeys([...state.expandedKeys, key]);\n        } else {\n          const keys = [...state.expandedKeys];\n          const index = keys.findIndex((item) => item === key);\n          if (index !== -1) {\n            keys.splice(index, 1);\n          }\n          setExpandedKeys(keys);\n        }\n      }\n\n      watchEffect(() => {\n        treeDataRef.value = props.treeData as TreeItem[];\n      });\n\n      onMounted(() => {\n        const level = parseInt(props.defaultExpandLevel);\n        if (level > 0) {\n          state.expandedKeys = filterByLevel(level);\n        } else if (props.defaultExpandAll) {\n          expandAll(true);\n        }\n      });\n\n      watchEffect(() => {\n        state.expandedKeys = props.expandedKeys;\n      });\n\n      watchEffect(() => {\n        state.selectedKeys = props.selectedKeys;\n      });\n\n      watchEffect(() => {\n        state.checkedKeys = props.checkedKeys;\n      });\n\n      watch(\n        () => props.value,\n        () => {\n          state.checkedKeys = toRaw(props.value || props.checkedKeys || []);\n        },\n        { immediate: true },\n      );\n\n      watch(\n        () => state.checkedKeys,\n        () => {\n          const v = toRaw(state.checkedKeys);\n          emit('update:value', v);\n          emit('change', v);\n        },\n      );\n      // 代码逻辑说明: 【issues/1151】层级独立时勾选了父级，然后点击层级关联子级视觉上勾选了，但是保存子级没存上\n      watch(\n        () => props.checkStrictly,\n        () => {\n          state.checkStrictly = props.checkStrictly;\n          nextTick(() => {\n            const value = treeRef.value?.checkedKeys;\n            handleCheck([...value]);\n          });\n        }\n      );\n\n      const instance: TreeActionType = {\n        setExpandedKeys,\n        getExpandedKeys,\n        setSelectedKeys,\n        getSelectedKeys,\n        setCheckedKeys,\n        getCheckedKeys,\n        insertNodeByKey,\n        insertNodesByKey,\n        deleteNodeByKey,\n        updateNodeByKey,\n        getSelectedNode,\n        checkAll,\n        expandAll,\n        filterByLevel: (level: number) => {\n          state.expandedKeys = filterByLevel(level);\n        },\n        setSearchValue: (value: string) => {\n          handleSearch(value);\n        },\n        getSearchValue: () => {\n          return searchState.searchText;\n        },\n      };\n\n      function renderAction(node: TreeItem) {\n        const { actionList } = props;\n        if (!actionList || actionList.length === 0) return;\n        return actionList.map((item, index) => {\n          let nodeShow = true;\n          if (isFunction(item.show)) {\n            nodeShow = item.show?.(node);\n          } else if (isBoolean(item.show)) {\n            nodeShow = item.show;\n          }\n\n          if (!nodeShow) return null;\n\n          return (\n            <span key={index} class={bem('action')}>\n              {item.render(node)}\n            </span>\n          );\n        });\n      }\n\n      const treeData = computed(() => {\n        const data = cloneDeep(getTreeData.value);\n        eachTree(data, (item, _parent) => {\n          const searchText = searchState.searchText;\n          const { highlight } = unref(props);\n          const {\n            title: titleField,\n            key: keyField,\n            children: childrenField,\n          } = unref(getFieldNames);\n\n          const icon = getIcon(item, item.icon);\n          const title = get(item, titleField);\n\n          const searchIdx = searchText ? title.indexOf(searchText) : -1;\n          const isHighlight =\n            searchState.startSearch && !isEmpty(searchText) && highlight && searchIdx !== -1;\n          const highlightStyle = `color: ${isBoolean(highlight) ? '#f50' : highlight}`;\n\n          const titleDom = isHighlight ? (\n            <span class={unref(getBindValues)?.blockNode ? `${bem('content')}` : ''}>\n              <span>{title.substr(0, searchIdx)}</span>\n              <span style={highlightStyle}>{searchText}</span>\n              <span>{title.substr(searchIdx + (searchText as string).length)}</span>\n            </span>\n          ) : (\n            title\n          );\n          item[titleField] = (\n            <span\n              class={`${bem('title')} pl-2`}\n              onClick={handleClickNode.bind(null, item[keyField], item[childrenField])}\n            >\n              {slots?.title ? (\n                getSlot(slots, 'title', item)\n              ) : (\n                <>\n                  {icon && <TreeIcon icon={icon} />}\n                  {titleDom}\n                  <span class={bem('actions')}>{renderAction(item)}</span>\n                </>\n              )}\n            </span>\n          );\n          return item;\n        });\n        return data;\n      });\n\n      expose(instance);\n\n      return () => {\n        const { title, helpMessage, toolbar, search, checkable } = props;\n        const showTitle = title || toolbar || search || slots.headerTitle;\n        const scrollStyle: CSSProperties = { height: 'calc(100% - 38px)' };\n        return (\n          <div class={[bem(), 'h-full',unref(getBindValues).multiple === false ? 'custom-radio':'' , attrs.class]}>\n            {showTitle && (\n              <TreeHeader\n                checkable={checkable}\n                checkAll={checkAll}\n                expandAll={expandAll}\n                title={title}\n                search={search}\n                toolbar={toolbar}\n                helpMessage={helpMessage}\n                onStrictlyChange={onStrictlyChange}\n                onSearch={handleSearch}\n                onClickSearch={($event) => emit('search', $event)}\n                searchText={searchState.searchText}\n              >\n                {extendSlots(slots)}\n              </TreeHeader>\n            )}\n            <Spin spinning={unref(props.loading)} tip=\"加载中...\">\n              <ScrollContainer style={scrollStyle} v-show={!unref(getNotFound)}>\n                <Tree ref={treeRef} {...unref(getBindValues)} showIcon={false} treeData={treeData.value} />\n              </ScrollContainer>\n              <Empty\n                v-show={unref(getNotFound)}\n                image={Empty.PRESENTED_IMAGE_SIMPLE}\n                class=\"!mt-4\"\n              />\n            </Spin>\n          </div>\n        );\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n// 代码逻辑说明: 【JHHB-192】主职务选择，多选框改成单选\n.custom-radio {\n  :deep(.ant-tree) {\n    .ant-tree-checkbox {\n      .ant-tree-checkbox-inner {\n          border-style: solid;\n          border-width: 1px;\n          border-radius: 50%;\n        &::after {\n          width: 0;\n          height: 0;\n          left: 50%;\n          border-width: 6px;\n          border-radius: 50%;\n          margin-left: -3px;\n          margin-top: 1px;\n        }\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tree/src/TreeIcon.ts",
    "content": "import type { VNode, FunctionalComponent } from 'vue';\n\nimport { h } from 'vue';\nimport { isString } from '@vue/shared';\nimport { Icon } from '/@/components/Icon';\n\nexport const TreeIcon: FunctionalComponent = ({ icon }: { icon: VNode | string }) => {\n  if (!icon) return null;\n  if (isString(icon)) {\n    return h(Icon, { icon, class: 'mr-1' });\n  }\n  return Icon;\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tree/src/components/TreeHeader.vue",
    "content": "<template>\n  <div :class=\"bem()\" class=\"flex px-2 py-1.5 items-center\">\n    <slot name=\"headerTitle\" v-if=\"slots.headerTitle\"></slot>\n    <BasicTitle :helpMessage=\"helpMessage\" v-if=\"!slots.headerTitle && title\">\n      {{ title }}\n    </BasicTitle>\n    <div\n      class=\"flex items-center flex-1 cursor-pointer justify-self-stretch justify-end\"\n      v-if=\"search || toolbar\"\n    >\n      <div :class=\"getInputSearchCls\" v-if=\"search\">\n        <InputSearch\n          :placeholder=\"t('common.searchText')\"\n          size=\"small\"\n          allowClear\n          v-model:value=\"searchValue\"\n          @search=\"$emit('clickSearch', $event)\"\n        />\n      </div>\n      <Dropdown @click.prevent v-if=\"toolbar\">\n        <Icon icon=\"ion:ellipsis-vertical\" />\n        <template #overlay>\n          <Menu @click=\"handleMenuClick\">\n            <template v-for=\"item in toolbarList\" :key=\"item.value\">\n              <MenuItem v-bind=\"{ key: item.value }\">\n                {{ item.label }}\n              </MenuItem>\n              <MenuDivider v-if=\"item.divider\" />\n            </template>\n          </Menu>\n        </template>\n      </Dropdown>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { computed, ref, watch, useSlots } from 'vue';\n  import { Dropdown, Menu, MenuItem, MenuDivider, InputSearch } from 'ant-design-vue';\n  import { Icon } from '/@/components/Icon';\n  import { BasicTitle } from '/@/components/Basic';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useDebounceFn } from '@vueuse/core';\n  import { createBEM } from '/@/utils/bem';\n  import { ToolbarEnum } from '../types/tree';\n\n  const searchValue = ref('');\n\n  const [bem] = createBEM('tree-header');\n\n  const props = defineProps({\n    helpMessage: {\n      type: [String, Array] as PropType<string | string[]>,\n      default: '',\n    },\n    title: {\n      type: String,\n      default: '',\n    },\n    toolbar: {\n      type: Boolean,\n      default: false,\n    },\n    checkable: {\n      type: Boolean,\n      default: false,\n    },\n    search: {\n      type: Boolean,\n      default: false,\n    },\n    searchText: {\n      type: String,\n      default: '',\n    },\n    checkAll: {\n      type: Function,\n      default: undefined,\n    },\n    expandAll: {\n      type: Function,\n      default: undefined,\n    },\n  } as const);\n  const emit = defineEmits(['strictly-change', 'search', 'clickSearch']);\n\n  const slots = useSlots();\n  const { t } = useI18n();\n\n  const getInputSearchCls = computed(() => {\n    const titleExists = slots.headerTitle || props.title;\n    return [\n      'mr-1',\n      'w-full',\n      {\n        ['ml-5']: titleExists,\n      },\n    ];\n  });\n\n  const toolbarList = computed(() => {\n    const { checkable } = props;\n    const defaultToolbarList = [\n      { label: t('component.tree.expandAll'), value: ToolbarEnum.EXPAND_ALL },\n      {\n        label: t('component.tree.unExpandAll'),\n        value: ToolbarEnum.UN_EXPAND_ALL,\n        divider: checkable,\n      },\n    ];\n\n    return checkable\n      ? [\n          { label: t('component.tree.selectAll'), value: ToolbarEnum.SELECT_ALL },\n          {\n            label: t('component.tree.unSelectAll'),\n            value: ToolbarEnum.UN_SELECT_ALL,\n            divider: checkable,\n          },\n          ...defaultToolbarList,\n          { label: t('component.tree.checkStrictly'), value: ToolbarEnum.CHECK_STRICTLY },\n          { label: t('component.tree.checkUnStrictly'), value: ToolbarEnum.CHECK_UN_STRICTLY },\n        ]\n      : defaultToolbarList;\n  });\n\n  function handleMenuClick(e: { key: ToolbarEnum }) {\n    const { key } = e;\n    switch (key) {\n      case ToolbarEnum.SELECT_ALL:\n        props.checkAll?.(true);\n        break;\n      case ToolbarEnum.UN_SELECT_ALL:\n        props.checkAll?.(false);\n        break;\n      case ToolbarEnum.EXPAND_ALL:\n        props.expandAll?.(true);\n        break;\n      case ToolbarEnum.UN_EXPAND_ALL:\n        props.expandAll?.(false);\n        break;\n      case ToolbarEnum.CHECK_STRICTLY:\n        emit('strictly-change', false);\n        break;\n      case ToolbarEnum.CHECK_UN_STRICTLY:\n        emit('strictly-change', true);\n        break;\n    }\n  }\n\n  function emitChange(value?: string): void {\n    emit('search', value);\n  }\n\n  const debounceEmitChange = useDebounceFn(emitChange, 200);\n\n  watch(\n    () => searchValue.value,\n    (v) => {\n      debounceEmitChange(v);\n    },\n  );\n\n  watch(\n    () => props.searchText,\n    (v) => {\n      if (v !== searchValue.value) {\n        searchValue.value = v;\n      }\n    },\n  );\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tree/src/hooks/useTree.ts",
    "content": "import type { InsertNodeParams, KeyType, FieldNames, TreeItem } from '../types/tree';\nimport type { Ref, ComputedRef } from 'vue';\nimport type { TreeDataItem } from 'ant-design-vue/es/tree/Tree';\n\nimport { cloneDeep } from 'lodash-es';\nimport { unref } from 'vue';\nimport { forEach } from '/@/utils/helper/treeHelper';\n\nexport function useTree(treeDataRef: Ref<TreeDataItem[]>, getFieldNames: ComputedRef<FieldNames>) {\n  function getAllKeys(list?: TreeDataItem[]) {\n    const keys: string[] = [];\n    const treeData = list || unref(treeDataRef);\n    const { key: keyField, children: childrenField } = unref(getFieldNames);\n    if (!childrenField || !keyField) return keys;\n\n    for (let index = 0; index < treeData.length; index++) {\n      const node = treeData[index];\n      keys.push(node[keyField]!);\n      const children = node[childrenField];\n      if (children && children.length) {\n        keys.push(...(getAllKeys(children) as string[]));\n      }\n    }\n    return keys as KeyType[];\n  }\n\n  // get keys that can be checked and selected\n  function getEnabledKeys(list?: TreeDataItem[]) {\n    const keys: string[] = [];\n    const treeData = list || unref(treeDataRef);\n    const { key: keyField, children: childrenField } = unref(getFieldNames);\n    if (!childrenField || !keyField) return keys;\n\n    for (let index = 0; index < treeData.length; index++) {\n      const node = treeData[index];\n      node.disabled !== true && node.selectable !== false && keys.push(node[keyField]!);\n      const children = node[childrenField];\n      if (children && children.length) {\n        keys.push(...(getEnabledKeys(children) as string[]));\n      }\n    }\n    return keys as KeyType[];\n  }\n\n  function getChildrenKeys(nodeKey: string | number, list?: TreeDataItem[]) {\n    const keys: KeyType[] = [];\n    const treeData = list || unref(treeDataRef);\n    const { key: keyField, children: childrenField } = unref(getFieldNames);\n    if (!childrenField || !keyField) return keys;\n    for (let index = 0; index < treeData.length; index++) {\n      const node = treeData[index];\n      const children = node[childrenField];\n      if (nodeKey === node[keyField]) {\n        keys.push(node[keyField]!);\n        if (children && children.length) {\n          keys.push(...(getAllKeys(children) as string[]));\n        }\n      } else {\n        if (children && children.length) {\n          keys.push(...getChildrenKeys(nodeKey, children));\n        }\n      }\n    }\n    return keys as KeyType[];\n  }\n\n  // Update node\n  function updateNodeByKey(key: string, node: TreeDataItem, list?: TreeDataItem[]) {\n    if (!key) return;\n    const treeData = list || unref(treeDataRef);\n    const { key: keyField, children: childrenField } = unref(getFieldNames);\n\n    if (!childrenField || !keyField) return;\n\n    for (let index = 0; index < treeData.length; index++) {\n      const element: any = treeData[index];\n      const children = element[childrenField];\n\n      if (element[keyField] === key) {\n        treeData[index] = { ...treeData[index], ...node };\n        break;\n      } else if (children && children.length) {\n        updateNodeByKey(key, node, element[childrenField]);\n      }\n    }\n  }\n\n  // Expand the specified level\n  function filterByLevel(level = 1, list?: TreeDataItem[], currentLevel = 1) {\n    if (!level) {\n      return [];\n    }\n    const res: (string | number)[] = [];\n    const data = list || unref(treeDataRef) || [];\n    for (let index = 0; index < data.length; index++) {\n      const item = data[index];\n\n      const { key: keyField, children: childrenField } = unref(getFieldNames);\n      const key = keyField ? item[keyField] : '';\n      const children = childrenField ? item[childrenField] : [];\n      res.push(key);\n      if (children && children.length && currentLevel < level) {\n        currentLevel += 1;\n        res.push(...filterByLevel(level, children, currentLevel));\n      }\n    }\n    return res as string[] | number[];\n  }\n\n  /**\n   * 添加节点\n   */\n  function insertNodeByKey({ parentKey = null, node, push = 'push' }: InsertNodeParams) {\n    const treeData: any = cloneDeep(unref(treeDataRef));\n    if (!parentKey) {\n      treeData[push](node);\n      treeDataRef.value = treeData;\n      return;\n    }\n    const { key: keyField, children: childrenField } = unref(getFieldNames);\n    if (!childrenField || !keyField) return;\n\n    forEach(treeData, (treeItem) => {\n      if (treeItem[keyField] === parentKey) {\n        treeItem[childrenField] = treeItem[childrenField] || [];\n        treeItem[childrenField][push](node);\n        return true;\n      }\n    });\n    treeDataRef.value = treeData;\n  }\n  /**\n   * 批量添加节点\n   */\n  function insertNodesByKey({ parentKey = null, list, push = 'push' }: InsertNodeParams) {\n    const treeData: any = cloneDeep(unref(treeDataRef));\n    if (!list || list.length < 1) {\n      return;\n    }\n    if (!parentKey) {\n      for (let i = 0; i < list.length; i++) {\n        treeData[push](list[i]);\n      }\n    } else {\n      const { key: keyField, children: childrenField } = unref(getFieldNames);\n      if (!childrenField || !keyField) return;\n\n      forEach(treeData, (treeItem) => {\n        if (treeItem[keyField] === parentKey) {\n          treeItem[childrenField] = treeItem[childrenField] || [];\n          for (let i = 0; i < list.length; i++) {\n            treeItem[childrenField][push](list[i]);\n          }\n          treeDataRef.value = treeData;\n          return true;\n        }\n      });\n    }\n  }\n  // Delete node\n  function deleteNodeByKey(key: string, list?: TreeDataItem[]) {\n    if (!key) return;\n    const treeData = list || unref(treeDataRef);\n    const { key: keyField, children: childrenField } = unref(getFieldNames);\n    if (!childrenField || !keyField) return;\n\n    for (let index = 0; index < treeData.length; index++) {\n      const element: any = treeData[index];\n      const children = element[childrenField];\n\n      if (element[keyField] === key) {\n        treeData.splice(index, 1);\n        break;\n      } else if (children && children.length) {\n        deleteNodeByKey(key, element[childrenField]);\n      }\n    }\n  }\n\n  // Get selected node\n  function getSelectedNode(key: KeyType, list?: TreeItem[], selectedNode?: TreeItem | null) {\n    if (!key && key !== 0) return null;\n    const treeData = list || unref(treeDataRef);\n    treeData.forEach((item) => {\n      if (selectedNode?.key || selectedNode?.key === 0) return selectedNode;\n      if (item.key === key) {\n        selectedNode = item;\n        return;\n      }\n      if (item.children && item.children.length) {\n        selectedNode = getSelectedNode(key, item.children, selectedNode);\n      }\n    });\n    return selectedNode || null;\n  }\n  return {\n    deleteNodeByKey,\n    insertNodeByKey,\n    insertNodesByKey,\n    filterByLevel,\n    updateNodeByKey,\n    getAllKeys,\n    getChildrenKeys,\n    getEnabledKeys,\n    getSelectedNode,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tree/src/types/tree.ts",
    "content": "import type { ExtractPropTypes } from 'vue';\nimport type { TreeDataItem } from 'ant-design-vue/es/tree/Tree';\n\nimport { buildProps } from '/@/utils/props';\n\nexport enum ToolbarEnum {\n  SELECT_ALL,\n  UN_SELECT_ALL,\n  EXPAND_ALL,\n  UN_EXPAND_ALL,\n  CHECK_STRICTLY,\n  CHECK_UN_STRICTLY,\n}\n\nexport const treeEmits = [\n  'update:expandedKeys',\n  'update:selectedKeys',\n  'update:value',\n  'change',\n  'check',\n  'search',\n  'update:searchValue',\n];\n\nexport interface TreeState {\n  expandedKeys: KeyType[];\n  selectedKeys: KeyType[];\n  checkedKeys: CheckKeys;\n  checkStrictly: boolean;\n}\n\nexport interface FieldNames {\n  children?: string;\n  title?: string;\n  key?: string;\n}\n\nexport type KeyType = string | number;\n\nexport type CheckKeys =\n  | KeyType[]\n  | { checked: string[] | number[]; halfChecked: string[] | number[] };\n\nexport const treeProps = buildProps({\n  value: {\n    type: [Object, Array] as PropType<KeyType[] | CheckKeys>,\n  },\n\n  renderIcon: {\n    type: Function as PropType<(params: Recordable) => string>,\n  },\n\n  helpMessage: {\n    type: [String, Array] as PropType<string | string[]>,\n    default: '',\n  },\n\n  title: {\n    type: String,\n    default: '',\n  },\n  toolbar: Boolean,\n  search: Boolean,\n  searchValue: {\n    type: String,\n    default: '',\n  },\n  checkStrictly: Boolean,\n  clickRowToExpand: {\n    type: Boolean,\n    default: false,\n  },\n  checkable: Boolean,\n  defaultExpandLevel: {\n    type: [String, Number] as PropType<string | number>,\n    default: '',\n  },\n  defaultExpandAll: Boolean,\n\n  fieldNames: {\n    type: Object as PropType<FieldNames>,\n  },\n\n  treeData: {\n    type: Array as PropType<TreeDataItem[]>,\n  },\n\n  actionList: {\n    type: Array as PropType<TreeActionItem[]>,\n    default: () => [],\n  },\n\n  expandedKeys: {\n    type: Array as PropType<KeyType[]>,\n    default: () => [],\n  },\n\n  selectedKeys: {\n    type: Array as PropType<KeyType[]>,\n    default: () => [],\n  },\n\n  checkedKeys: {\n    type: Array as PropType<CheckKeys>,\n    default: () => [],\n  },\n\n  beforeRightClick: {\n    type: Function as PropType<(...arg: any) => ContextMenuItem[] | ContextMenuOptions>,\n    default: undefined,\n  },\n\n  rightMenuList: {\n    type: Array as PropType<ContextMenuItem[]>,\n  },\n  // 自定义数据过滤判断方法(注: 不是整个过滤方法，而是内置过滤的判断方法，用于增强原本仅能通过title进行过滤的方式)\n  filterFn: {\n    type: Function as PropType<\n      (searchValue: any, node: TreeItem, fieldNames: FieldNames) => boolean\n    >,\n    default: undefined,\n  },\n  // 高亮搜索值，仅高亮具体匹配值（通过title）值为true时使用默认色值，值为#xxx时使用此值替代且高亮开启\n  highlight: {\n    type: [Boolean, String] as PropType<Boolean | String>,\n    default: false,\n  },\n  // 搜索完成时自动展开结果\n  expandOnSearch: Boolean,\n  // 搜索完成自动选中所有结果,当且仅当 checkable===true 时生效\n  checkOnSearch: Boolean,\n  // 搜索完成自动select所有结果\n  selectedOnSearch: Boolean,\n  loading: {\n    type: Boolean,\n    default: false,\n  },\n});\n\nexport type TreeProps = ExtractPropTypes<typeof treeProps>;\n\nexport interface ContextMenuItem {\n  label: string;\n  icon?: string;\n  hidden?: boolean;\n  disabled?: boolean;\n  handler?: Fn;\n  divider?: boolean;\n  children?: ContextMenuItem[];\n}\n\nexport interface ContextMenuOptions {\n  icon?: string;\n  styles?: any;\n  items?: ContextMenuItem[];\n}\n\nexport interface TreeItem extends TreeDataItem {\n  icon?: any;\n}\n\nexport interface TreeActionItem {\n  render: (record: Recordable) => any;\n  show?: boolean | ((record: Recordable) => boolean);\n}\n\nexport interface InsertNodeParams {\n  parentKey: string | null;\n  node: TreeDataItem;\n  list?: TreeDataItem[];\n  push?: 'push' | 'unshift';\n}\n\nexport interface TreeActionType {\n  checkAll: (checkAll: boolean) => void;\n  expandAll: (expandAll: boolean) => void;\n  setExpandedKeys: (keys: KeyType[]) => void;\n  getExpandedKeys: () => KeyType[];\n  setSelectedKeys: (keys: KeyType[]) => void;\n  getSelectedKeys: () => KeyType[];\n  setCheckedKeys: (keys: CheckKeys) => void;\n  getCheckedKeys: () => CheckKeys;\n  filterByLevel: (level: number) => void;\n  insertNodeByKey: (opt: InsertNodeParams) => void;\n  insertNodesByKey: (opt: InsertNodeParams) => void;\n  deleteNodeByKey: (key: string) => void;\n  updateNodeByKey: (key: string, node: Omit<TreeDataItem, 'key'>) => void;\n  setSearchValue: (value: string) => void;\n  getSearchValue: () => string;\n  getSelectedNode: (\n    key: KeyType,\n    treeList?: TreeItem[],\n    selectNode?: TreeItem | null,\n  ) => TreeItem | null;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tree/style/index.less",
    "content": "@tree-prefix-cls: ~'@{namespace}-tree';\n\n.@{tree-prefix-cls} {\n  background-color: @component-background;\n\n  .ant-tree-node-content-wrapper {\n    position: relative;\n\n    .ant-tree-title {\n      position: absolute;\n      left: 0;\n      width: 100%;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n    }\n  }\n\n  &__title {\n    position: relative;\n    display: flex;\n    align-items: center;\n    width: 100%;\n    padding-right: 10px;\n\n    &:hover {\n      .@{tree-prefix-cls}__action {\n        visibility: visible;\n      }\n    }\n  }\n\n  &__content {\n    overflow: hidden;\n  }\n\n  &__actions {\n    position: absolute;\n    //top: 2px;\n    right: 3px;\n    display: flex;\n  }\n\n  &__action {\n    margin-left: 4px;\n    visibility: hidden;\n  }\n\n  &-header {\n    border-bottom: 1px solid @border-color-base;\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tree/style/index.ts",
    "content": "import './index.less';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tree_backup/index.ts",
    "content": "import BasicTree from './src/Tree.vue';\n\nexport { BasicTree };\nexport type { ContextMenuItem } from '/@/hooks/web/useContextMenu';\nexport * from './src/typing';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tree_backup/src/Tree.vue",
    "content": "<script lang=\"tsx\">\n  import type { ReplaceFields, Keys, CheckKeys, TreeActionType, TreeItem } from './typing';\n\n  import { defineComponent, reactive, computed, unref, ref, watchEffect, toRaw, watch, CSSProperties, onMounted } from 'vue';\n  import { Tree, Empty } from 'ant-design-vue';\n  import { TreeIcon } from './TreeIcon';\n  import TreeHeader from './TreeHeader.vue';\n  import { ScrollContainer } from '/@/components/Container';\n\n  import { omit, get, difference } from 'lodash-es';\n  import { isArray, isBoolean, isFunction } from '/@/utils/is';\n  import { extendSlots, getSlot } from '/@/utils/helper/tsxHelper';\n  import { filter } from '/@/utils/helper/treeHelper';\n\n  import { useTree } from './useTree';\n  import { useContextMenu } from '/@/hooks/web/useContextMenu';\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  import { basicProps } from './props';\n  import { CreateContextOptions } from '/@/components/ContextMenu';\n\n  import { CheckEvent } from './typing';\n\n  interface State {\n    expandedKeys: Keys;\n    selectedKeys: Keys;\n    checkedKeys: CheckKeys;\n    checkStrictly: boolean;\n  }\n\n  export default defineComponent({\n    name: 'BasicTree',\n    inheritAttrs: false,\n    props: basicProps,\n    emits: ['update:expandedKeys', 'update:selectedKeys', 'update:value', 'change', 'check', 'search', 'update:searchValue'],\n    setup(props, { attrs, slots, emit, expose }) {\n      const state = reactive<State>({\n        checkStrictly: props.checkStrictly,\n        expandedKeys: props.expandedKeys || [],\n        selectedKeys: props.selectedKeys || [],\n        checkedKeys: props.checkedKeys || [],\n      });\n\n      const searchState = reactive({\n        startSearch: false,\n        searchData: [] as TreeItem[],\n      });\n\n      const treeDataRef = ref<TreeItem[]>([]);\n\n      const [createContextMenu] = useContextMenu();\n      const { prefixCls } = useDesign('basic-tree');\n\n      const getReplaceFields = computed((): Required<ReplaceFields> => {\n        const { replaceFields } = props;\n        return {\n          children: 'children',\n          title: 'title',\n          key: 'key',\n          ...replaceFields,\n        };\n      });\n\n      const getBindValues = computed(() => {\n        let propsData = {\n          blockNode: true,\n          ...attrs,\n          ...props,\n          expandedKeys: state.expandedKeys,\n          selectedKeys: state.selectedKeys,\n          checkedKeys: state.checkedKeys,\n          checkStrictly: state.checkStrictly,\n          replaceFields: unref(getReplaceFields),\n          'onUpdate:expandedKeys': (v: Keys) => {\n            state.expandedKeys = v;\n            emit('update:expandedKeys', v);\n          },\n          'onUpdate:selectedKeys': (v: Keys) => {\n            state.selectedKeys = v;\n            emit('update:selectedKeys', v);\n          },\n          onCheck: (v: CheckKeys, e: CheckEvent) => {\n            let currentValue = toRaw(state.checkedKeys) as Keys;\n            if (isArray(currentValue) && searchState.startSearch) {\n              const { key } = unref(getReplaceFields);\n              currentValue = difference(currentValue, getChildrenKeys(e.node.$attrs.node[key]));\n              if (e.checked) {\n                currentValue.push(e.node.$attrs.node[key]);\n              }\n              state.checkedKeys = currentValue;\n            } else {\n              state.checkedKeys = v;\n            }\n\n            const rawVal = toRaw(state.checkedKeys);\n            emit('update:value', rawVal);\n            emit('check', rawVal, e);\n          },\n          onRightClick: handleRightClick,\n        };\n        return omit(propsData, 'treeData', 'class');\n      });\n\n      const getTreeData = computed((): TreeItem[] => (searchState.startSearch ? searchState.searchData : unref(treeDataRef)));\n\n      const getNotFound = computed((): boolean => {\n        return !getTreeData.value || getTreeData.value.length === 0;\n      });\n\n      const { deleteNodeByKey, insertNodeByKey, insertNodesByKey, filterByLevel, updateNodeByKey, getAllKeys, getChildrenKeys, getEnabledKeys } =\n        useTree(treeDataRef, getReplaceFields);\n\n      function getIcon(params: Recordable, icon?: string) {\n        if (!icon) {\n          if (props.renderIcon && isFunction(props.renderIcon)) {\n            return props.renderIcon(params);\n          }\n        }\n        return icon;\n      }\n\n      async function handleRightClick({ event, node }: Recordable) {\n        const { rightMenuList: menuList = [], beforeRightClick } = props;\n        let contextMenuOptions: CreateContextOptions = { event, items: [] };\n\n        if (beforeRightClick && isFunction(beforeRightClick)) {\n          let result = await beforeRightClick(node, event);\n          if (Array.isArray(result)) {\n            contextMenuOptions.items = result;\n          } else {\n            Object.assign(contextMenuOptions, result);\n          }\n        } else {\n          contextMenuOptions.items = menuList;\n        }\n        if (!contextMenuOptions.items?.length) return;\n        createContextMenu(contextMenuOptions);\n      }\n\n      function setExpandedKeys(keys: Keys) {\n        state.expandedKeys = keys;\n      }\n\n      function getExpandedKeys() {\n        return state.expandedKeys;\n      }\n\n      function setSelectedKeys(keys: Keys) {\n        state.selectedKeys = keys;\n      }\n\n      function getSelectedKeys() {\n        return state.selectedKeys;\n      }\n\n      function setCheckedKeys(keys: CheckKeys) {\n        state.checkedKeys = keys;\n      }\n\n      function getCheckedKeys() {\n        return state.checkedKeys;\n      }\n\n      function checkAll(checkAll: boolean) {\n        state.checkedKeys = checkAll ? getEnabledKeys() : ([] as Keys);\n      }\n\n      function expandAll(expandAll: boolean) {\n        state.expandedKeys = expandAll ? getAllKeys() : ([] as Keys);\n      }\n\n      function onStrictlyChange(strictly: boolean) {\n        state.checkStrictly = strictly;\n      }\n\n      const searchText = ref('');\n      watchEffect(() => {\n        if (props.searchValue !== searchText.value) searchText.value = props.searchValue;\n      });\n\n      function handleSearch(searchValue: string) {\n        if (searchValue !== searchText.value) searchText.value = searchValue;\n        emit('update:searchValue', searchValue);\n        if (!searchValue) {\n          searchState.startSearch = false;\n          return;\n        }\n        const { filterFn, checkable, expandOnSearch, checkOnSearch } = unref(props);\n        searchState.startSearch = true;\n        const { title: titleField, key: keyField } = unref(getReplaceFields);\n\n        const searchKeys: string[] = [];\n        searchState.searchData = filter(\n          unref(treeDataRef),\n          (node) => {\n            const result = filterFn ? filterFn(searchValue, node, unref(getReplaceFields)) : node[titleField]?.includes(searchValue) ?? false;\n            if (result) {\n              searchKeys.push(node[keyField]);\n            }\n            return result;\n          },\n          unref(getReplaceFields)\n        );\n\n        if (expandOnSearch && searchKeys.length > 0) {\n          setExpandedKeys(searchKeys);\n        }\n\n        if (checkOnSearch && checkable && searchKeys.length > 0) {\n          setCheckedKeys(searchKeys);\n        }\n      }\n\n      function handleClickNode(key: string, children: TreeItem[]) {\n        if (!props.clickRowToExpand || !children || children.length === 0) return;\n        if (!state.expandedKeys.includes(key)) {\n          setExpandedKeys([...state.expandedKeys, key]);\n        } else {\n          const keys = [...state.expandedKeys];\n          const index = keys.findIndex((item) => item === key);\n          if (index !== -1) {\n            keys.splice(index, 1);\n          }\n          setExpandedKeys(keys);\n        }\n      }\n\n      watchEffect(() => {\n        treeDataRef.value = props.treeData as TreeItem[];\n        handleSearch(unref(searchText));\n      });\n\n      onMounted(() => {\n        const level = parseInt(props.defaultExpandLevel);\n        if (level > 0) {\n          state.expandedKeys = filterByLevel(level);\n        } else if (props.defaultExpandAll) {\n          expandAll(true);\n        }\n      });\n\n      watchEffect(() => {\n        state.expandedKeys = props.expandedKeys;\n      });\n\n      watchEffect(() => {\n        state.selectedKeys = props.selectedKeys;\n      });\n\n      watchEffect(() => {\n        state.checkedKeys = props.checkedKeys;\n      });\n\n      watch(\n        () => props.value,\n        () => {\n          state.checkedKeys = toRaw(props.value || []);\n        }\n      );\n\n      watch(\n        () => state.checkedKeys,\n        () => {\n          const v = toRaw(state.checkedKeys);\n          emit('update:value', v);\n          emit('change', v);\n        }\n      );\n\n      // watchEffect(() => {\n      //   console.log('======================');\n      //   console.log(props.value);\n      //   console.log('======================');\n      //   if (props.value) {\n      //     state.checkedKeys = props.value;\n      //   }\n      // });\n\n      watchEffect(() => {\n        state.checkStrictly = props.checkStrictly;\n      });\n\n      const instance: TreeActionType = {\n        setExpandedKeys,\n        getExpandedKeys,\n        setSelectedKeys,\n        getSelectedKeys,\n        setCheckedKeys,\n        getCheckedKeys,\n        insertNodeByKey,\n        insertNodesByKey,\n        deleteNodeByKey,\n        updateNodeByKey,\n        checkAll,\n        expandAll,\n        filterByLevel: (level: number) => {\n          state.expandedKeys = filterByLevel(level);\n        },\n        setSearchValue: (value: string) => {\n          handleSearch(value);\n        },\n        getSearchValue: () => {\n          return searchText.value;\n        },\n      };\n\n      expose(instance);\n\n      function renderAction(node: TreeItem) {\n        const { actionList } = props;\n        if (!actionList || actionList.length === 0) return;\n        return actionList.map((item, index) => {\n          let nodeShow = true;\n          if (isFunction(item.show)) {\n            nodeShow = item.show?.(node);\n          } else if (isBoolean(item.show)) {\n            nodeShow = item.show;\n          }\n\n          if (!nodeShow) return null;\n\n          return (\n            <span key={index} class={`${prefixCls}__action`}>\n              {item.render(node)}\n            </span>\n          );\n        });\n      }\n\n      function renderTreeNode({ data, level }: { data: TreeItem[] | undefined; level: number }) {\n        if (!data) {\n          return null;\n        }\n        return data.map((item) => {\n          const { title: titleField, key: keyField, children: childrenField } = unref(getReplaceFields);\n\n          const propsData = omit(item, 'title');\n          const icon = getIcon({ ...item, level }, item.icon);\n          const children = get(item, childrenField) || [];\n          return (\n            <Tree.TreeNode {...propsData} node={toRaw(item)} key={get(item, keyField)}>\n              {{\n                title: () => (\n                  <span class={`${prefixCls}-title pl-2`} onclick={handleClickNode.bind(null, item[keyField], item[childrenField])}>\n                    {slots?.title ? (\n                      getSlot(slots, 'title', item)\n                    ) : (\n                      <>\n                        {icon && <TreeIcon icon={icon} />}\n                        <span class={unref(getBindValues)?.blockNode ? `${prefixCls}__content` : ''}>{get(item, titleField)}</span>\n                        <span class={`${prefixCls}__actions`}>{renderAction({ ...item, level })}</span>\n                      </>\n                    )}\n                  </span>\n                ),\n                default: () => renderTreeNode({ data: children, level: level + 1 }),\n              }}\n            </Tree.TreeNode>\n          );\n        });\n      }\n\n      return () => {\n        const { title, helpMessage, toolbar, search, checkable } = props;\n        const showTitle = title || toolbar || search || slots.headerTitle;\n        const scrollStyle: CSSProperties = { height: 'calc(100% - 38px)' };\n        return (\n          <div class={[prefixCls, 'h-full', attrs.class]}>\n            {showTitle && (\n              <TreeHeader\n                checkable={checkable}\n                checkAll={checkAll}\n                expandAll={expandAll}\n                title={title}\n                search={search}\n                toolbar={toolbar}\n                helpMessage={helpMessage}\n                onStrictlyChange={onStrictlyChange}\n                onSearch={handleSearch}\n                onClickSearch={($event) => emit('search', $event)}\n                searchText={unref(searchText)}\n              >\n                {extendSlots(slots)}\n              </TreeHeader>\n            )}\n            <ScrollContainer style={scrollStyle} v-show={!unref(getNotFound)}>\n              <Tree {...unref(getBindValues)} showIcon={false}>\n                {{\n                  // switcherIcon: () => <DownOutlined />,\n                  default: () => renderTreeNode({ data: unref(getTreeData), level: 1 }),\n                  ...extendSlots(slots),\n                }}\n              </Tree>\n            </ScrollContainer>\n\n            <Empty v-show={unref(getNotFound)} image={Empty.PRESENTED_IMAGE_SIMPLE} class=\"!mt-4\" />\n          </div>\n        );\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-basic-tree';\n\n  .@{prefix-cls} {\n    background-color: @component-background;\n\n    .ant-tree-node-content-wrapper {\n      position: relative;\n\n      .ant-tree-title {\n        position: absolute;\n        left: 0;\n        width: 100%;\n      }\n    }\n\n    &-title {\n      position: relative;\n      display: flex;\n      align-items: center;\n      width: 100%;\n      padding-right: 10px;\n\n      &:hover {\n        .@{prefix-cls}__action {\n          visibility: visible;\n        }\n      }\n    }\n\n    &__content {\n      overflow: hidden;\n    }\n\n    &__actions {\n      position: absolute;\n      top: 2px;\n      right: 3px;\n      display: flex;\n    }\n\n    &__action {\n      margin-left: 4px;\n      visibility: hidden;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tree_backup/src/TreeHeader.vue",
    "content": "<template>\n  <div class=\"flex px-2 py-1.5 items-center basic-tree-header\">\n    <slot name=\"headerTitle\" v-if=\"$slots.headerTitle\"></slot>\n    <BasicTitle :helpMessage=\"helpMessage\" v-if=\"!$slots.headerTitle && title\">\n      {{ title }}\n    </BasicTitle>\n\n    <div class=\"flex flex-1 justify-end items-center cursor-pointer\" v-if=\"search || toolbar\">\n      <div :class=\"getInputSearchCls\" v-if=\"search\">\n        <InputSearch\n          :placeholder=\"t('common.searchText')\"\n          size=\"small\"\n          allowClear\n          v-model:value=\"searchValue\"\n          @search=\"$emit('clickSearch', $event)\"\n        />\n      </div>\n      <Dropdown @click.prevent v-if=\"toolbar\">\n        <Icon icon=\"ion:ellipsis-vertical\" />\n        <template #overlay>\n          <Menu @click=\"handleMenuClick\">\n            <template v-for=\"item in toolbarList\" :key=\"item.value\">\n              <MenuItem v-bind=\"{ key: item.value }\">\n                {{ item.label }}\n              </MenuItem>\n              <MenuDivider v-if=\"item.divider\" />\n            </template>\n          </Menu>\n        </template>\n      </Dropdown>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { PropType } from 'vue';\n  import { defineComponent, computed, ref, watch } from 'vue';\n\n  import { Dropdown, Menu, Input } from 'ant-design-vue';\n  import { Icon } from '/@/components/Icon';\n  import { BasicTitle } from '/@/components/Basic';\n\n  import { propTypes } from '/@/utils/propTypes';\n\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useDebounceFn } from '@vueuse/core';\n\n  enum ToolbarEnum {\n    SELECT_ALL,\n    UN_SELECT_ALL,\n    EXPAND_ALL,\n    UN_EXPAND_ALL,\n    CHECK_STRICTLY,\n    CHECK_UN_STRICTLY,\n  }\n\n  interface MenuInfo {\n    key: ToolbarEnum;\n  }\n\n  export default defineComponent({\n    name: 'BasicTreeHeader',\n    components: {\n      BasicTitle,\n      Icon,\n      Dropdown,\n      Menu,\n      MenuItem: Menu.Item,\n      MenuDivider: Menu.Divider,\n      InputSearch: Input.Search,\n    },\n    props: {\n      helpMessage: {\n        type: [String, Array] as PropType<string | string[]>,\n        default: '',\n      },\n      title: propTypes.string,\n      toolbar: propTypes.bool,\n      checkable: propTypes.bool,\n      search: propTypes.bool,\n      checkAll: propTypes.func,\n      expandAll: propTypes.func,\n      searchText: propTypes.string,\n    },\n    emits: ['strictly-change', 'search', 'clickSearch'],\n    setup(props, { emit, slots }) {\n      const { t } = useI18n();\n      const searchValue = ref('');\n      const getInputSearchCls = computed(() => {\n        const titleExists = slots.headerTitle || props.title;\n        return [\n          'mr-1',\n          'w-full',\n          // titleExists ? 'w-2/3' : 'w-full',\n          {\n            ['ml-5']: titleExists,\n          },\n        ];\n      });\n      const toolbarList = computed(() => {\n        const { checkable } = props;\n        const defaultToolbarList = [\n          { label: t('component.tree.expandAll'), value: ToolbarEnum.EXPAND_ALL },\n          {\n            label: t('component.tree.unExpandAll'),\n            value: ToolbarEnum.UN_EXPAND_ALL,\n            divider: checkable,\n          },\n        ];\n\n        return checkable\n          ? [\n              { label: t('component.tree.selectAll'), value: ToolbarEnum.SELECT_ALL },\n              {\n                label: t('component.tree.unSelectAll'),\n                value: ToolbarEnum.UN_SELECT_ALL,\n                divider: checkable,\n              },\n              ...defaultToolbarList,\n              { label: t('component.tree.checkStrictly'), value: ToolbarEnum.CHECK_STRICTLY },\n              { label: t('component.tree.checkUnStrictly'), value: ToolbarEnum.CHECK_UN_STRICTLY },\n            ]\n          : defaultToolbarList;\n      });\n\n      function handleMenuClick(e: MenuInfo) {\n        const { key } = e;\n        switch (key) {\n          case ToolbarEnum.SELECT_ALL:\n            props.checkAll?.(true);\n            break;\n          case ToolbarEnum.UN_SELECT_ALL:\n            props.checkAll?.(false);\n            break;\n          case ToolbarEnum.EXPAND_ALL:\n            props.expandAll?.(true);\n            break;\n          case ToolbarEnum.UN_EXPAND_ALL:\n            props.expandAll?.(false);\n            break;\n          case ToolbarEnum.CHECK_STRICTLY:\n            emit('strictly-change', false);\n            break;\n          case ToolbarEnum.CHECK_UN_STRICTLY:\n            emit('strictly-change', true);\n            break;\n        }\n      }\n\n      function emitChange(value?: string): void {\n        emit('search', value);\n      }\n\n      const debounceEmitChange = useDebounceFn(emitChange, 200);\n\n      watch(\n        () => searchValue.value,\n        (v) => {\n          debounceEmitChange(v);\n        }\n      );\n      watch(\n        () => props.searchText,\n        (v) => {\n          if (v !== searchValue.value) {\n            searchValue.value = v;\n          }\n        }\n      );\n      // function handleSearch(e: ChangeEvent): void {\n      //   debounceEmitChange(e.target.value);\n      // }\n\n      return { t, toolbarList, handleMenuClick, searchValue, getInputSearchCls };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .basic-tree-header {\n    border-bottom: 1px solid @border-color-base;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tree_backup/src/TreeIcon.ts",
    "content": "import type { VNode, FunctionalComponent } from 'vue';\n\nimport { h } from 'vue';\nimport { isString } from '/@/utils/is';\nimport { Icon } from '/@/components/Icon';\n\nexport interface ComponentProps {\n  icon: VNode | string;\n}\n\nexport const TreeIcon: FunctionalComponent = ({ icon }: ComponentProps) => {\n  if (!icon) return null;\n  if (isString(icon)) {\n    return h(Icon, { icon, class: 'mr-1' });\n  }\n  return Icon;\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tree_backup/src/props.ts",
    "content": "import type { PropType } from 'vue';\nimport type { ReplaceFields, ActionItem, Keys, CheckKeys, ContextMenuOptions, TreeItem } from './typing';\nimport type { ContextMenuItem } from '/@/hooks/web/useContextMenu';\nimport type { TreeDataItem } from 'ant-design-vue/es/tree/Tree';\nimport { propTypes } from '/@/utils/propTypes';\n\nexport const basicProps = {\n  value: {\n    type: [Object, Array] as PropType<Keys | CheckKeys>,\n  },\n  renderIcon: {\n    type: Function as PropType<(params: Recordable) => string>,\n  },\n\n  helpMessage: {\n    type: [String, Array] as PropType<string | string[]>,\n    default: '',\n  },\n\n  title: propTypes.string,\n  toolbar: propTypes.bool,\n  search: propTypes.bool,\n  searchValue: propTypes.string,\n  checkStrictly: propTypes.bool,\n  clickRowToExpand: propTypes.bool.def(true),\n  checkable: propTypes.bool.def(false),\n  defaultExpandLevel: {\n    type: [String, Number] as PropType<string | number>,\n    default: '',\n  },\n  // 高亮搜索值，仅高亮具体匹配值（通过title）值为true时使用默认色值，值为#xxx时使用此值替代且高亮开启\n  highlight: {\n    type: [Boolean, String] as PropType<Boolean | String>,\n    default: false,\n  },\n  defaultExpandAll: propTypes.bool.def(false),\n\n  replaceFields: {\n    type: Object as PropType<ReplaceFields>,\n  },\n\n  treeData: {\n    type: Array as PropType<TreeDataItem[]>,\n  },\n\n  actionList: {\n    type: Array as PropType<ActionItem[]>,\n    default: () => [],\n  },\n\n  expandedKeys: {\n    type: Array as PropType<Keys>,\n    default: () => [],\n  },\n\n  selectedKeys: {\n    type: Array as PropType<Keys>,\n    default: () => [],\n  },\n\n  checkedKeys: {\n    type: Array as PropType<CheckKeys>,\n    default: () => [],\n  },\n\n  beforeRightClick: {\n    type: Function as PropType<(...arg: any) => ContextMenuItem[] | ContextMenuOptions>,\n    default: null,\n  },\n\n  rightMenuList: {\n    type: Array as PropType<ContextMenuItem[]>,\n  },\n  // 自定义数据过滤判断方法(注: 不是整个过滤方法，而是内置过滤的判断方法，用于增强原本仅能通过title进行过滤的方式)\n  filterFn: {\n    type: Function as PropType<(searchValue: any, node: TreeItem, replaceFields: ReplaceFields) => boolean>,\n    default: null,\n  },\n  // 搜索完成时自动展开结果\n  expandOnSearch: propTypes.bool.def(false),\n  // 搜索完成自动选中所有结果,当且仅当 checkable===true 时生效\n  checkOnSearch: propTypes.bool.def(false),\n  // 搜索完成自动select所有结果\n  selectedOnSearch: propTypes.bool.def(false),\n};\n\nexport const treeNodeProps = {\n  actionList: {\n    type: Array as PropType<ActionItem[]>,\n    default: () => [],\n  },\n  replaceFields: {\n    type: Object as PropType<ReplaceFields>,\n  },\n  treeData: {\n    type: Array as PropType<TreeDataItem[]>,\n    default: () => [],\n  },\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tree_backup/src/typing.ts",
    "content": "import type { TreeDataItem, CheckEvent as CheckEventOrigin } from 'ant-design-vue/es/tree/Tree';\nimport { ContextMenuItem } from '/@/hooks/web/useContextMenu';\n\nexport interface ActionItem {\n  render: (record: Recordable) => any;\n  show?: boolean | ((record: Recordable) => boolean);\n}\n\nexport interface TreeItem extends TreeDataItem {\n  icon?: any;\n}\n\nexport interface ReplaceFields {\n  children?: string;\n  title?: string;\n  key?: string;\n}\n\nexport type Keys = (string | number)[];\nexport type CheckKeys = (string | number)[] | { checked: (string | number)[]; halfChecked: (string | number)[] };\n\nexport interface TreeActionType {\n  checkAll: (checkAll: boolean) => void;\n  expandAll: (expandAll: boolean) => void;\n  setExpandedKeys: (keys: Keys) => void;\n  getExpandedKeys: () => Keys;\n  setSelectedKeys: (keys: Keys) => void;\n  getSelectedKeys: () => Keys;\n  setCheckedKeys: (keys: CheckKeys) => void;\n  getCheckedKeys: () => CheckKeys;\n  filterByLevel: (level: number) => void;\n  insertNodeByKey: (opt: InsertNodeParams) => void;\n  insertNodesByKey: (opt: InsertNodeParams) => void;\n  deleteNodeByKey: (key: string) => void;\n  updateNodeByKey: (key: string, node: Omit<TreeDataItem, 'key'>) => void;\n  setSearchValue: (value: string) => void;\n  getSearchValue: () => string;\n}\n\nexport interface InsertNodeParams {\n  parentKey: string | null;\n  node: TreeDataItem;\n  list?: TreeDataItem[];\n  push?: 'push' | 'unshift';\n}\n\nexport interface ContextMenuOptions {\n  icon?: string;\n  styles?: any;\n  items?: ContextMenuItem[];\n}\n\nexport type CheckEvent = CheckEventOrigin;\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Tree_backup/src/useTree.ts",
    "content": "import type { InsertNodeParams, Keys, ReplaceFields } from './typing';\nimport type { Ref, ComputedRef } from 'vue';\nimport type { TreeDataItem } from 'ant-design-vue/es/tree/Tree';\n\nimport { cloneDeep } from 'lodash-es';\nimport { unref } from 'vue';\nimport { forEach } from '/@/utils/helper/treeHelper';\n\nexport function useTree(treeDataRef: Ref<TreeDataItem[]>, getReplaceFields: ComputedRef<ReplaceFields>) {\n  function getAllKeys(list?: TreeDataItem[]) {\n    const keys: string[] = [];\n    const treeData = list || unref(treeDataRef);\n    const { key: keyField, children: childrenField } = unref(getReplaceFields);\n    if (!childrenField || !keyField) return keys;\n\n    for (let index = 0; index < treeData.length; index++) {\n      const node = treeData[index];\n      keys.push(node[keyField]!);\n      const children = node[childrenField];\n      if (children && children.length) {\n        keys.push(...(getAllKeys(children) as string[]));\n      }\n    }\n    return keys as Keys;\n  }\n\n  // get keys that can be checked and selected\n  function getEnabledKeys(list?: TreeDataItem[]) {\n    const keys: string[] = [];\n    const treeData = list || unref(treeDataRef);\n    const { key: keyField, children: childrenField } = unref(getReplaceFields);\n    if (!childrenField || !keyField) return keys;\n\n    for (let index = 0; index < treeData.length; index++) {\n      const node = treeData[index];\n      node.disabled !== true && node.selectable !== false && keys.push(node[keyField]!);\n      const children = node[childrenField];\n      if (children && children.length) {\n        keys.push(...(getEnabledKeys(children) as string[]));\n      }\n    }\n    return keys as Keys;\n  }\n\n  function getChildrenKeys(nodeKey: string | number, list?: TreeDataItem[]): Keys {\n    const keys: Keys = [];\n    const treeData = list || unref(treeDataRef);\n    const { key: keyField, children: childrenField } = unref(getReplaceFields);\n    if (!childrenField || !keyField) return keys;\n    for (let index = 0; index < treeData.length; index++) {\n      const node = treeData[index];\n      const children = node[childrenField];\n      if (nodeKey === node[keyField]) {\n        keys.push(node[keyField]!);\n        if (children && children.length) {\n          keys.push(...(getAllKeys(children) as string[]));\n        }\n      } else {\n        if (children && children.length) {\n          keys.push(...getChildrenKeys(nodeKey, children));\n        }\n      }\n    }\n    return keys as Keys;\n  }\n\n  // Update node\n  function updateNodeByKey(key: string, node: TreeDataItem, list?: TreeDataItem[]) {\n    if (!key) return;\n    const treeData = list || unref(treeDataRef);\n    const { key: keyField, children: childrenField } = unref(getReplaceFields);\n\n    if (!childrenField || !keyField) return;\n\n    for (let index = 0; index < treeData.length; index++) {\n      const element: any = treeData[index];\n      const children = element[childrenField];\n\n      if (element[keyField] === key) {\n        treeData[index] = { ...treeData[index], ...node };\n        break;\n      } else if (children && children.length) {\n        updateNodeByKey(key, node, element[childrenField]);\n      }\n    }\n  }\n\n  // Expand the specified level\n  function filterByLevel(level = 1, list?: TreeDataItem[], currentLevel = 1) {\n    if (!level) {\n      return [];\n    }\n    const res: (string | number)[] = [];\n    const data = list || unref(treeDataRef) || [];\n    for (let index = 0; index < data.length; index++) {\n      const item = data[index];\n\n      const { key: keyField, children: childrenField } = unref(getReplaceFields);\n      const key = keyField ? item[keyField] : '';\n      const children = childrenField ? item[childrenField] : [];\n      res.push(key);\n      if (children && children.length && currentLevel < level) {\n        currentLevel += 1;\n        res.push(...filterByLevel(level, children, currentLevel));\n      }\n    }\n    return res as string[] | number[];\n  }\n\n  /**\n   * 添加节点\n   */\n  function insertNodeByKey({ parentKey = null, node, push = 'push' }: InsertNodeParams) {\n    const treeData: any = cloneDeep(unref(treeDataRef));\n    if (!parentKey) {\n      treeData[push](node);\n      treeDataRef.value = treeData;\n      return;\n    }\n    const { key: keyField, children: childrenField } = unref(getReplaceFields);\n    if (!childrenField || !keyField) return;\n\n    forEach(treeData, (treeItem) => {\n      if (treeItem[keyField] === parentKey) {\n        treeItem[childrenField] = treeItem[childrenField] || [];\n        treeItem[childrenField][push](node);\n        return true;\n      }\n    });\n    treeDataRef.value = treeData;\n  }\n\n  /**\n   * 批量添加节点\n   */\n  function insertNodesByKey({ parentKey = null, list, push = 'push' }: InsertNodeParams) {\n    const treeData: any = cloneDeep(unref(treeDataRef));\n    if (!list || list.length < 1) {\n      return;\n    }\n    if (!parentKey) {\n      for (let i = 0; i < list.length; i++) {\n        treeData[push](list[i]);\n      }\n    } else {\n      const { key: keyField, children: childrenField } = unref(getReplaceFields);\n      if (!childrenField || !keyField) return;\n\n      forEach(treeData, (treeItem) => {\n        if (treeItem[keyField] === parentKey) {\n          treeItem[childrenField] = treeItem[childrenField] || [];\n          for (let i = 0; i < list.length; i++) {\n            treeItem[childrenField][push](list[i]);\n          }\n          treeDataRef.value = treeData;\n          return true;\n        }\n      });\n    }\n  }\n\n  // Delete node\n  function deleteNodeByKey(key: string, list?: TreeDataItem[]) {\n    if (!key) return;\n    const treeData = list || unref(treeDataRef);\n    const { key: keyField, children: childrenField } = unref(getReplaceFields);\n    if (!childrenField || !keyField) return;\n\n    for (let index = 0; index < treeData.length; index++) {\n      const element: any = treeData[index];\n      const children = element[childrenField];\n\n      if (element[keyField] === key) {\n        treeData.splice(index, 1);\n        break;\n      } else if (children && children.length) {\n        deleteNodeByKey(key, element[childrenField]);\n      }\n    }\n  }\n\n  return {\n    deleteNodeByKey,\n    insertNodeByKey,\n    insertNodesByKey,\n    filterByLevel,\n    updateNodeByKey,\n    getAllKeys,\n    getChildrenKeys,\n    getEnabledKeys,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Upload/index.ts",
    "content": "import { withInstall } from '/@/utils';\nimport basicUpload from './src/BasicUpload.vue';\n\nexport const BasicUpload = withInstall(basicUpload);\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Upload/src/BasicUpload.vue",
    "content": "<template>\n  <div>\n    <a-button-group>\n      <a-button type=\"primary\" @click=\"openUploadModal\" preIcon=\"carbon:cloud-upload\">\n        {{ t('component.upload.upload') }}\n      </a-button>\n      <Tooltip placement=\"bottom\" v-if=\"showPreview\">\n        <template #title>\n          {{ t('component.upload.uploaded') }}\n          <template v-if=\"fileList.length\">\n            {{ fileList.length }}\n          </template>\n        </template>\n        <a-button @click=\"openPreviewModal\">\n          <Icon icon=\"bi:eye\" />\n          <template v-if=\"fileList.length && showPreviewNumber\">\n            {{ fileList.length }}\n          </template>\n        </a-button>\n      </Tooltip>\n    </a-button-group>\n\n    <UploadModal v-bind=\"bindValue\" :previewFileList=\"fileList\" @register=\"registerUploadModal\" @change=\"handleChange\" @delete=\"handleDelete\" />\n\n    <UploadPreviewModal :value=\"fileList\" @register=\"registerPreviewModal\" @list-change=\"handlePreviewChange\" @delete=\"handlePreviewDelete\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, watch, unref, computed } from 'vue';\n  import UploadModal from './UploadModal.vue';\n  import UploadPreviewModal from './UploadPreviewModal.vue';\n  import { Icon } from '/@/components/Icon';\n  import { Tooltip } from 'ant-design-vue';\n  import { useModal } from '/@/components/Modal';\n  import { uploadContainerProps } from './props';\n  import { omit } from 'lodash-es';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { isArray } from '/@/utils/is';\n\n  export default defineComponent({\n    name: 'BasicUpload',\n    components: { UploadModal, UploadPreviewModal, Icon, Tooltip },\n    props: uploadContainerProps,\n    emits: ['change', 'delete', 'preview-delete', 'update:value'],\n\n    setup(props, { emit, attrs }) {\n      const { t } = useI18n();\n      // 上传modal\n      const [registerUploadModal, { openModal: openUploadModal }] = useModal();\n\n      //   预览modal\n      const [registerPreviewModal, { openModal: openPreviewModal }] = useModal();\n\n      const fileList = ref<string[]>([]);\n\n      const showPreview = computed(() => {\n        const { emptyHidePreview } = props;\n        if (!emptyHidePreview) return true;\n        return emptyHidePreview ? fileList.value.length > 0 : true;\n      });\n\n      const bindValue = computed(() => {\n        const value = { ...attrs, ...props };\n        return omit(value, 'onChange');\n      });\n\n      watch(\n        () => props.value,\n        (value = []) => {\n          fileList.value = isArray(value) ? value : [];\n        },\n        { immediate: true }\n      );\n\n      // 上传modal保存操作\n      function handleChange(urls: string[]) {\n        fileList.value = [...unref(fileList), ...(urls || [])];\n        emit('update:value', fileList.value);\n        emit('change', fileList.value);\n      }\n\n      // 预览modal保存操作\n      function handlePreviewChange(urls: string[]) {\n        fileList.value = [...(urls || [])];\n        emit('update:value', fileList.value);\n        emit('change', fileList.value);\n      }\n\n      function handleDelete(record: Recordable) {\n        emit('delete', record);\n      }\n\n      function handlePreviewDelete(url: string) {\n        emit('preview-delete', url);\n      }\n\n      return {\n        registerUploadModal,\n        openUploadModal,\n        handleChange,\n        handlePreviewChange,\n        registerPreviewModal,\n        openPreviewModal,\n        fileList,\n        showPreview,\n        bindValue,\n        handleDelete,\n        handlePreviewDelete,\n        t,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Upload/src/FileList.vue",
    "content": "<script lang=\"tsx\">\n  import { defineComponent, CSSProperties, watch, nextTick } from 'vue';\n  import { fileListProps } from './props';\n  import { isFunction } from '/@/utils/is';\n  import { useModalContext } from '/@/components/Modal/src/hooks/useModalContext';\n\n  export default defineComponent({\n    name: 'FileList',\n    props: fileListProps,\n    setup(props) {\n      const modalFn = useModalContext();\n      watch(\n        () => props.dataSource,\n        () => {\n          nextTick(() => {\n            modalFn?.redoModalHeight?.();\n          });\n        }\n      );\n      return () => {\n        const { columns, actionColumn, dataSource } = props;\n        const columnList = [...columns, actionColumn];\n        return (\n          <table class=\"file-table\">\n            <colgroup>\n              {columnList.map((item) => {\n                const { width = 0, dataIndex } = item;\n                const style: CSSProperties = {\n                  width: `${width}px`,\n                  minWidth: `${width}px`,\n                };\n                return <col style={width ? style : {}} key={dataIndex} />;\n              })}\n            </colgroup>\n            <thead>\n              <tr class=\"file-table-tr\">\n                {columnList.map((item) => {\n                  const { title = '', align = 'center', dataIndex } = item;\n                  return (\n                    <th class={['file-table-th', align]} key={dataIndex}>\n                      {title}\n                    </th>\n                  );\n                })}\n              </tr>\n            </thead>\n            <tbody>\n              {dataSource.map((record = {}, index) => {\n                return (\n                  <tr class=\"file-table-tr\" key={`${index + record.name || ''}`}>\n                    {columnList.map((item) => {\n                      const { dataIndex = '', customRender, align = 'center' } = item;\n                      const render = customRender && isFunction(customRender);\n                      return (\n                        <td class={['file-table-td', align]} key={dataIndex}>\n                          {render ? customRender?.({ text: record[dataIndex], record }) : record[dataIndex]}\n                        </td>\n                      );\n                    })}\n                  </tr>\n                );\n              })}\n            </tbody>\n          </table>\n        );\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  .file-table {\n    width: 100%;\n    border-collapse: collapse;\n\n    .center {\n      text-align: center;\n    }\n\n    .left {\n      text-align: left;\n    }\n\n    .right {\n      text-align: right;\n    }\n\n    &-th,\n    &-td {\n      padding: 12px 8px;\n    }\n\n    thead {\n      background-color: @background-color-light;\n    }\n\n    table,\n    td,\n    th {\n      border: 1px solid @border-color-base;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Upload/src/ThumbUrl.vue",
    "content": "<template>\n  <span class=\"thumb\">\n    <Image v-if=\"fileUrl\" :src=\"fileUrl\" :width=\"104\" />\n  </span>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { propTypes } from '/@/utils/propTypes';\n  import { Image } from 'ant-design-vue';\n\n  export default defineComponent({\n    components: { Image },\n    props: {\n      fileUrl: propTypes.string.def(''),\n      fileName: propTypes.string.def(''),\n    },\n  });\n</script>\n<style lang=\"less\">\n  .thumb {\n    img {\n      position: static;\n      display: block;\n      cursor: zoom-in;\n      border-radius: 4px;\n      object-fit: cover;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Upload/src/UploadModal.vue",
    "content": "<template>\n  <BasicModal\n    width=\"800px\"\n    :title=\"t('component.upload.upload')\"\n    :okText=\"t('component.upload.save')\"\n    v-bind=\"$attrs\"\n    @register=\"register\"\n    @ok=\"handleOk\"\n    :closeFunc=\"handleCloseFunc\"\n    :maskClosable=\"false\"\n    :keyboard=\"false\"\n    wrapClassName=\"upload-modal\"\n    :okButtonProps=\"getOkButtonProps\"\n    :cancelButtonProps=\"{ disabled: isUploadingRef }\"\n  >\n    <template #centerFooter>\n      <a-button @click=\"handleStartUpload\" color=\"success\" :disabled=\"!getIsSelectFile\" :loading=\"isUploadingRef\">\n        {{ getUploadBtnText }}\n      </a-button>\n    </template>\n\n    <div class=\"upload-modal-toolbar\">\n      <Alert :message=\"getHelpText\" type=\"info\" banner class=\"upload-modal-toolbar__text\" />\n\n      <Upload :accept=\"getStringAccept\" :multiple=\"multiple\" :before-upload=\"beforeUpload\" class=\"upload-modal-toolbar__btn\">\n        <a-button type=\"primary\">\n          {{ t('component.upload.choose') }}\n        </a-button>\n      </Upload>\n    </div>\n    <FileList :dataSource=\"fileListRef\" :columns=\"columns\" :actionColumn=\"actionColumn\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, reactive, ref, toRefs, unref, computed, PropType } from 'vue';\n  import { Upload, Alert } from 'ant-design-vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  //   import { BasicTable, useTable } from '/@/components/Table';\n  // hooks\n  import { useUploadType } from './useUpload';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  //   types\n  import { FileItem, UploadResultStatus } from './typing';\n  import { basicProps } from './props';\n  import { createTableColumns, createActionColumn } from './data';\n  // utils\n  import { checkFileType, checkImgType, getBase64WithFile } from './helper';\n  import { buildUUID } from '/@/utils/uuid';\n  import { isFunction } from '/@/utils/is';\n  import { warn } from '/@/utils/log';\n  import FileList from './FileList.vue';\n  import { useI18n } from '/@/hooks/web/useI18n';\n\n  export default defineComponent({\n    components: { BasicModal, Upload, Alert, FileList },\n    props: {\n      ...basicProps,\n      previewFileList: {\n        type: Array as PropType<string[]>,\n        default: () => [],\n      },\n    },\n    emits: ['change', 'register', 'delete'],\n    setup(props, { emit }) {\n      const state = reactive<{ fileList: FileItem[] }>({\n        fileList: [],\n      });\n\n      //   是否正在上传\n      const isUploadingRef = ref(false);\n      const fileListRef = ref<FileItem[]>([]);\n      const { accept, helpText, maxNumber, maxSize } = toRefs(props);\n\n      const { t } = useI18n();\n      const [register, { closeModal }] = useModalInner();\n\n      const { getAccept, getStringAccept, getHelpText } = useUploadType({\n        acceptRef: accept,\n        helpTextRef: helpText,\n        maxNumberRef: maxNumber,\n        maxSizeRef: maxSize,\n      });\n\n      const { createMessage } = useMessage();\n\n      const getIsSelectFile = computed(() => {\n        return fileListRef.value.length > 0 && !fileListRef.value.every((item) => item.status === UploadResultStatus.SUCCESS);\n      });\n\n      const getOkButtonProps = computed(() => {\n        const someSuccess = fileListRef.value.some((item) => item.status === UploadResultStatus.SUCCESS);\n        return {\n          disabled: isUploadingRef.value || fileListRef.value.length === 0 || !someSuccess,\n        };\n      });\n\n      const getUploadBtnText = computed(() => {\n        const someError = fileListRef.value.some((item) => item.status === UploadResultStatus.ERROR);\n        return isUploadingRef.value\n          ? t('component.upload.uploading')\n          : someError\n          ? t('component.upload.reUploadFailed')\n          : t('component.upload.startUpload');\n      });\n\n      // 上传前校验\n      function beforeUpload(file: File) {\n        const { size, name } = file;\n        const { maxSize } = props;\n        const accept = unref(getAccept);\n        // 设置最大值，则判断\n        if (maxSize && file.size / 1024 / 1024 >= maxSize) {\n          createMessage.error(t('component.upload.maxSizeMultiple', [maxSize]));\n          return false;\n        }\n\n        // 设置类型,则判断\n        if (accept.length > 0 && !checkFileType(file, accept)) {\n          createMessage.error!(t('component.upload.acceptUpload', [accept.join(',')]));\n          return false;\n        }\n        const commonItem = {\n          uuid: buildUUID(),\n          file,\n          size,\n          name,\n          percent: 0,\n          type: name.split('.').pop(),\n        };\n        // 生成图片缩略图\n        if (checkImgType(file)) {\n          // beforeUpload，如果异步会调用自带上传方法\n          // file.thumbUrl = await getBase64(file);\n          getBase64WithFile(file).then(({ result: thumbUrl }) => {\n            fileListRef.value = [\n              ...unref(fileListRef),\n              {\n                thumbUrl,\n                ...commonItem,\n              },\n            ];\n          });\n        } else {\n          fileListRef.value = [...unref(fileListRef), commonItem];\n        }\n        return false;\n      }\n\n      // 删除\n      function handleRemove(record: FileItem) {\n        const index = fileListRef.value.findIndex((item) => item.uuid === record.uuid);\n        index !== -1 && fileListRef.value.splice(index, 1);\n        emit('delete', record);\n      }\n\n      // 预览\n      // function handlePreview(record: FileItem) {\n      //   const { thumbUrl = '' } = record;\n      //   createImgPreview({\n      //     imageList: [thumbUrl],\n      //   });\n      // }\n\n      async function uploadApiByItem(item: FileItem) {\n        const { api } = props;\n        if (!api || !isFunction(api)) {\n          return warn('upload api must exist and be a function');\n        }\n        try {\n          item.status = UploadResultStatus.UPLOADING;\n          const { data } = await props.api?.(\n            {\n              data: {\n                ...(props.uploadParams || {}),\n              },\n              file: item.file,\n              name: props.name,\n              filename: props.filename,\n            },\n            function onUploadProgress(progressEvent: ProgressEvent) {\n              const complete = ((progressEvent.loaded / progressEvent.total) * 100) | 0;\n              item.percent = complete;\n            }\n          );\n          item.status = UploadResultStatus.SUCCESS;\n          item.responseData = data;\n          return {\n            success: true,\n            error: null,\n          };\n        } catch (e) {\n          console.log(e);\n          item.status = UploadResultStatus.ERROR;\n          return {\n            success: false,\n            error: e,\n          };\n        }\n      }\n\n      // 点击开始上传\n      async function handleStartUpload() {\n        const { maxNumber } = props;\n        if ((fileListRef.value.length + (props.previewFileList?.length ?? 0)) > maxNumber) {\n          return createMessage.warning(t('component.upload.maxNumber', [maxNumber]));\n        }\n        try {\n          isUploadingRef.value = true;\n          // 只上传不是成功状态的\n          const uploadFileList = fileListRef.value.filter((item) => item.status !== UploadResultStatus.SUCCESS) || [];\n          const data = await Promise.all(\n            uploadFileList.map((item) => {\n              return uploadApiByItem(item);\n            })\n          );\n          isUploadingRef.value = false;\n          // 生产环境:抛出错误\n          const errorList = data.filter((item: any) => !item.success);\n          if (errorList.length > 0) throw errorList;\n        } catch (e) {\n          isUploadingRef.value = false;\n          throw e;\n        }\n      }\n\n      //   点击保存\n      function handleOk() {\n        const { maxNumber } = props;\n\n        if (fileListRef.value.length > maxNumber) {\n          return createMessage.warning(t('component.upload.maxNumber', [maxNumber]));\n        }\n        if (isUploadingRef.value) {\n          return createMessage.warning(t('component.upload.saveWarn'));\n        }\n        const fileList: string[] = [];\n\n        for (const item of fileListRef.value) {\n          const { status, responseData } = item;\n          if (status === UploadResultStatus.SUCCESS && responseData) {\n            fileList.push(responseData.url);\n          }\n        }\n        // 存在一个上传成功的即可保存\n        if (fileList.length <= 0) {\n          return createMessage.warning(t('component.upload.saveError'));\n        }\n        fileListRef.value = [];\n        closeModal();\n        emit('change', fileList);\n      }\n\n      // 点击关闭：则所有操作不保存，包括上传的\n      async function handleCloseFunc() {\n        if (!isUploadingRef.value) {\n          fileListRef.value = [];\n          return true;\n        } else {\n          createMessage.warning(t('component.upload.uploadWait'));\n          return false;\n        }\n      }\n\n      return {\n        columns: createTableColumns() as any[],\n        actionColumn: createActionColumn(handleRemove) as any,\n        register,\n        closeModal,\n        getHelpText,\n        getStringAccept,\n        getOkButtonProps,\n        beforeUpload,\n        // registerTable,\n        fileListRef,\n        state,\n        isUploadingRef,\n        handleStartUpload,\n        handleOk,\n        handleCloseFunc,\n        getIsSelectFile,\n        getUploadBtnText,\n        t,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  .upload-modal {\n    .ant-upload-list {\n      display: none;\n    }\n\n    .ant-table-wrapper .ant-spin-nested-loading {\n      padding: 0;\n    }\n\n    &-toolbar {\n      display: flex;\n      align-items: center;\n      margin-bottom: 8px;\n\n      &__btn {\n        margin-left: 8px;\n        text-align: right;\n        flex: 1;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Upload/src/UploadPreviewModal.vue",
    "content": "<template>\n  <BasicModal\n    width=\"800px\"\n    :title=\"t('component.upload.preview')\"\n    wrapClassName=\"upload-preview-modal\"\n    v-bind=\"$attrs\"\n    @register=\"register\"\n    :showOkBtn=\"false\"\n  >\n    <FileList :dataSource=\"fileListRef\" :columns=\"columns\" :actionColumn=\"actionColumn\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, watch, ref } from 'vue';\n  //   import { BasicTable, useTable } from '/@/components/Table';\n  import FileList from './FileList.vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { previewProps } from './props';\n  import { PreviewFileItem } from './typing';\n  import { downloadByUrl } from '/@/utils/file/download';\n  import { createPreviewColumns, createPreviewActionColumn } from './data';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { isArray } from '/@/utils/is';\n\n  export default defineComponent({\n    components: { BasicModal, FileList },\n    props: previewProps,\n    emits: ['list-change', 'register', 'delete'],\n    setup(props, { emit }) {\n      const [register, { closeModal }] = useModalInner();\n      const { t } = useI18n();\n\n      const fileListRef = ref<PreviewFileItem[]>([]);\n      watch(\n        () => props.value,\n        (value) => {\n          if (!isArray(value)) value = [];\n          fileListRef.value = value\n            .filter((item) => !!item)\n            .map((item) => {\n              return {\n                url: item,\n                type: item.split('.').pop() || '',\n                name: item.split('/').pop() || '',\n              };\n            });\n        },\n        { immediate: true }\n      );\n\n      // 删除\n      function handleRemove(record: PreviewFileItem) {\n        const index = fileListRef.value.findIndex((item) => item.url === record.url);\n        if (index !== -1) {\n          const removed = fileListRef.value.splice(index, 1);\n          emit('delete', removed[0].url);\n          emit(\n            'list-change',\n            fileListRef.value.map((item) => item.url)\n          );\n        }\n      }\n\n      // // 预览\n      // function handlePreview(record: PreviewFileItem) {\n      //   const { url = '' } = record;\n      //   createImgPreview({\n      //     imageList: [url],\n      //   });\n      // }\n\n      // 下载\n      function handleDownload(record: PreviewFileItem) {\n        const { url = '' } = record;\n        downloadByUrl({ url });\n      }\n\n      return {\n        t,\n        register,\n        closeModal,\n        fileListRef,\n        columns: createPreviewColumns() as any[],\n        actionColumn: createPreviewActionColumn({ handleRemove, handleDownload }) as any,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  .upload-preview-modal {\n    .ant-upload-list {\n      display: none;\n    }\n\n    .ant-table-wrapper .ant-spin-nested-loading {\n      padding: 0;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Upload/src/data.tsx",
    "content": "import type { BasicColumn, ActionItem } from '/@/components/Table';\nimport { FileItem, PreviewFileItem, UploadResultStatus } from './typing';\nimport {\n  // checkImgType,\n  isImgTypeByName,\n} from './helper';\nimport { Progress, Tag } from 'ant-design-vue';\nimport TableAction from '/@/components/Table/src/components/TableAction.vue';\nimport ThumbUrl from './ThumbUrl.vue';\nimport { useI18n } from '/@/hooks/web/useI18n';\n\nconst { t } = useI18n();\n\n// 文件上传列表\nexport function createTableColumns(): BasicColumn[] {\n  return [\n    {\n      dataIndex: 'thumbUrl',\n      title: t('component.upload.legend'),\n      width: 100,\n      customRender: ({ record }) => {\n        const { thumbUrl } = (record as FileItem) || {};\n        return thumbUrl && <ThumbUrl fileUrl={thumbUrl} />;\n      },\n    },\n    {\n      dataIndex: 'name',\n      title: t('component.upload.fileName'),\n      align: 'left',\n      customRender: ({ text, record }) => {\n        const { percent, status: uploadStatus } = (record as FileItem) || {};\n        let status: 'normal' | 'exception' | 'active' | 'success' = 'normal';\n        if (uploadStatus === UploadResultStatus.ERROR) {\n          status = 'exception';\n        } else if (uploadStatus === UploadResultStatus.UPLOADING) {\n          status = 'active';\n        } else if (uploadStatus === UploadResultStatus.SUCCESS) {\n          status = 'success';\n        }\n        return (\n          <span>\n            <p class=\"truncate mb-1\" title={text}>\n              {text}\n            </p>\n            <Progress percent={percent} size=\"small\" status={status} />\n          </span>\n        );\n      },\n    },\n    {\n      dataIndex: 'size',\n      title: t('component.upload.fileSize'),\n      width: 100,\n      customRender: ({ text = 0 }) => {\n        return text && (text / 1024).toFixed(2) + 'KB';\n      },\n    },\n    // {\n    //   dataIndex: 'type',\n    //   title: '文件类型',\n    //   width: 100,\n    // },\n    {\n      dataIndex: 'status',\n      title: t('component.upload.fileStatue'),\n      width: 100,\n      customRender: ({ text }) => {\n        if (text === UploadResultStatus.SUCCESS) {\n          return <Tag color=\"green\">{() => t('component.upload.uploadSuccess')}</Tag>;\n        } else if (text === UploadResultStatus.ERROR) {\n          return <Tag color=\"red\">{() => t('component.upload.uploadError')}</Tag>;\n        } else if (text === UploadResultStatus.UPLOADING) {\n          return <Tag color=\"blue\">{() => t('component.upload.uploading')}</Tag>;\n        }\n\n        return text;\n      },\n    },\n  ];\n}\nexport function createActionColumn(handleRemove: Function): BasicColumn {\n  return {\n    width: 120,\n    title: t('component.upload.operating'),\n    dataIndex: 'action',\n    fixed: false,\n    customRender: ({ record }) => {\n      const actions: ActionItem[] = [\n        {\n          label: t('component.upload.del'),\n          color: 'error',\n          onClick: handleRemove.bind(null, record),\n        },\n      ];\n      // if (checkImgType(record)) {\n      //   actions.unshift({\n      //     label: t('component.upload.preview'),\n      //     onClick: handlePreview.bind(null, record),\n      //   });\n      // }\n      return <TableAction actions={actions} outside={true} />;\n    },\n  };\n}\n// 文件预览列表\nexport function createPreviewColumns(): BasicColumn[] {\n  return [\n    {\n      dataIndex: 'url',\n      title: t('component.upload.legend'),\n      width: 100,\n      customRender: ({ record }) => {\n        const { url } = (record as PreviewFileItem) || {};\n        return isImgTypeByName(url) && <ThumbUrl fileUrl={url} />;\n      },\n    },\n    {\n      dataIndex: 'name',\n      title: t('component.upload.fileName'),\n      align: 'left',\n    },\n  ];\n}\n\nexport function createPreviewActionColumn({ handleRemove, handleDownload }: { handleRemove: Fn; handleDownload: Fn }): BasicColumn {\n  return {\n    width: 160,\n    title: t('component.upload.operating'),\n    dataIndex: 'action',\n    fixed: false,\n    customRender: ({ record }) => {\n      const actions: ActionItem[] = [\n        {\n          label: t('component.upload.del'),\n          color: 'error',\n          onClick: handleRemove.bind(null, record),\n        },\n        {\n          label: t('component.upload.download'),\n          onClick: handleDownload.bind(null, record),\n        },\n      ];\n\n      return <TableAction actions={actions} outside={true} />;\n    },\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Upload/src/helper.ts",
    "content": "export function checkFileType(file: File, accepts: string[]) {\n  // 代码逻辑说明: 【issues/7954】BasicUpload组件上传文件，限制上传格式校验出错\n  const mimePatterns: string[] = [];\n  const suffixList: string[] = [];\n  // 分类处理 accepts\n  for (const item of accepts) {\n    if (item.includes('/')) {\n      mimePatterns.push(item);\n    } else {\n      // 支持.png 或 png（带点后缀或者不带点后缀）\n      const suffix = item.startsWith('.') ? item.slice(1) : item;\n      suffixList.push(suffix);\n    }\n  }\n  // 后缀匹配逻辑\n  let suffixMatch = false;\n  if (suffixList.length > 0) {\n    const suffixRegex = new RegExp(`\\\\.(${suffixList.join('|')})$`, 'i');\n    suffixMatch = suffixRegex.test(file.name);\n  }\n  // MIME类型匹配逻辑\n  let mimeMatch = false;\n  if (mimePatterns.length > 0 && file.type) {\n    mimeMatch = mimePatterns.some((pattern) => {\n      // 先转义特殊字符，再处理通配符\n      const regexPattern = pattern\n        .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&') // 先转义特殊字符\n        .replace(/\\*/g, '.*'); // 再替换通配符\n      const regex = new RegExp(`^${regexPattern}$`, 'i');\n      return regex.test(file.type);\n    });\n  }\n  if (mimePatterns.length && suffixList.length) {\n    return suffixMatch || mimeMatch;\n  } else if (mimePatterns.length) {\n    return mimeMatch;\n  } else if (suffixList.length) {\n    return suffixMatch;\n  }\n}\n\nexport function checkImgType(file: File) {\n  return isImgTypeByName(file.name);\n}\n\nexport function isImgTypeByName(name: string) {\n  return /\\.(jpg|jpeg|png|gif)$/i.test(name);\n}\n\nexport function getBase64WithFile(file: File) {\n  return new Promise<{\n    result: string;\n    file: File;\n  }>((resolve, reject) => {\n    const reader = new FileReader();\n    reader.readAsDataURL(file);\n    reader.onload = () => resolve({ result: reader.result as string, file });\n    reader.onerror = (error) => reject(error);\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Upload/src/props.ts",
    "content": "import type { PropType } from 'vue';\nimport { FileBasicColumn } from './typing';\n\nexport const basicProps = {\n  helpText: {\n    type: String as PropType<string>,\n    default: '',\n  },\n  // 文件最大多少MB\n  maxSize: {\n    type: Number as PropType<number>,\n    default: 2,\n  },\n  // 最大数量的文件，Infinity不限制\n  maxNumber: {\n    type: Number as PropType<number>,\n    default: Infinity,\n  },\n  // 根据后缀，或者其他\n  accept: {\n    type: Array as PropType<string[]>,\n    default: () => [],\n  },\n  multiple: {\n    type: Boolean as PropType<boolean>,\n    default: true,\n  },\n  uploadParams: {\n    type: Object as PropType<any>,\n    default: {},\n  },\n  api: {\n    type: Function as PropType<PromiseFn>,\n    default: null,\n    required: true,\n  },\n  name: {\n    type: String as PropType<string>,\n    default: 'file',\n  },\n  filename: {\n    type: String as PropType<string>,\n    default: null,\n  },\n};\n\nexport const uploadContainerProps = {\n  value: {\n    type: Array as PropType<string[]>,\n    default: () => [],\n  },\n  ...basicProps,\n  showPreviewNumber: {\n    type: Boolean as PropType<boolean>,\n    default: true,\n  },\n  emptyHidePreview: {\n    type: Boolean as PropType<boolean>,\n    default: false,\n  },\n};\n\nexport const previewProps = {\n  value: {\n    type: Array as PropType<string[]>,\n    default: () => [],\n  },\n};\n\nexport const fileListProps = {\n  columns: {\n    type: [Array] as PropType<FileBasicColumn[]>,\n    default: null,\n  },\n  actionColumn: {\n    type: Object as PropType<FileBasicColumn>,\n    default: null,\n  },\n  dataSource: {\n    type: Array as PropType<any[]>,\n    default: null,\n  },\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Upload/src/typing.ts",
    "content": "import { UploadApiResult } from '/@/api/sys/model/uploadModel';\n\nexport enum UploadResultStatus {\n  SUCCESS = 'success',\n  ERROR = 'error',\n  UPLOADING = 'uploading',\n}\n\nexport interface FileItem {\n  thumbUrl?: string;\n  name: string;\n  size: string | number;\n  type?: string;\n  percent: number;\n  file: File;\n  status?: UploadResultStatus;\n  responseData?: UploadApiResult;\n  uuid: string;\n}\n\nexport interface PreviewFileItem {\n  url: string;\n  name: string;\n  type: string;\n}\n\nexport interface FileBasicColumn {\n  /**\n   * Renderer of the table cell. The return value should be a VNode, or an object for colSpan/rowSpan config\n   * @type Function | ScopedSlot\n   */\n  customRender?: Function;\n  /**\n   * Title of this column\n   * @type any (string | slot)\n   */\n  title: string;\n\n  /**\n   * Width of this column\n   * @type string | number\n   */\n  width?: number;\n  /**\n   * Display field of the data record, could be set like a.b.c\n   * @type string\n   */\n  dataIndex: string;\n  /**\n   * specify how content is aligned\n   * @default 'left'\n   * @type string\n   */\n  align?: 'left' | 'right' | 'center';\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Upload/src/useUpload.ts",
    "content": "import { Ref, unref, computed } from 'vue';\nimport { useI18n } from '/@/hooks/web/useI18n';\nconst { t } = useI18n();\nexport function useUploadType({\n  acceptRef,\n  helpTextRef,\n  maxNumberRef,\n  maxSizeRef,\n}: {\n  acceptRef: Ref<string[]>;\n  helpTextRef: Ref<string>;\n  maxNumberRef: Ref<number>;\n  maxSizeRef: Ref<number>;\n}) {\n  // 文件类型限制\n  const getAccept = computed(() => {\n    const accept = unref(acceptRef);\n    if (accept && accept.length > 0) {\n      return accept;\n    }\n    return [];\n  });\n  const getStringAccept = computed(() => {\n    return unref(getAccept)\n      .map((item) => {\n        if (item.indexOf('/') > 0 || item.startsWith('.')) {\n          return item;\n        } else {\n          return `.${item}`;\n        }\n      })\n      .join(',');\n  });\n\n  // 支持jpg、jpeg、png格式，不超过2M，最多可选择10张图片，。\n  const getHelpText = computed(() => {\n    const helpText = unref(helpTextRef);\n    if (helpText) {\n      return helpText;\n    }\n    const helpTexts: string[] = [];\n\n    const accept = unref(acceptRef);\n    if (accept.length > 0) {\n      helpTexts.push(t('component.upload.accept', [accept.join(',')]));\n    }\n\n    const maxSize = unref(maxSizeRef);\n    if (maxSize) {\n      helpTexts.push(t('component.upload.maxSize', [maxSize]));\n    }\n\n    const maxNumber = unref(maxNumberRef);\n    if (maxNumber && maxNumber !== Infinity) {\n      helpTexts.push(t('component.upload.maxNumber', [maxNumber]));\n    }\n    return helpTexts.join('，');\n  });\n  return { getAccept, getStringAccept, getHelpText };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Verify/index.ts",
    "content": "import { withInstall } from '/@/utils/index';\nimport basicDragVerify from './src/DragVerify.vue';\nimport rotateDragVerify from './src/ImgRotate.vue';\n\nexport const BasicDragVerify = withInstall(basicDragVerify);\nexport const RotateDragVerify = withInstall(rotateDragVerify);\nexport * from './src/typing';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Verify/src/DragVerify.vue",
    "content": "<script lang=\"tsx\">\n  import type { Ref } from 'vue';\n  import { defineComponent, ref, computed, unref, reactive, watch, watchEffect } from 'vue';\n  import { useTimeoutFn } from '/@/hooks/core/useTimeout';\n  import { useEventListener } from '/@/hooks/event/useEventListener';\n  import { basicProps } from './props';\n  import { getSlot } from '/@/utils/helper/tsxHelper';\n  import { CheckOutlined, DoubleRightOutlined } from '@ant-design/icons-vue';\n\n  export default defineComponent({\n    name: 'BaseDargVerify',\n    props: basicProps,\n    emits: ['success', 'update:value', 'change', 'start', 'move', 'end'],\n    setup(props, { emit, slots, expose }) {\n      const state = reactive({\n        isMoving: false,\n        isPassing: false,\n        moveDistance: 0,\n        toLeft: false,\n        startTime: 0,\n        endTime: 0,\n      });\n\n      const wrapElRef = ref<HTMLDivElement | null>(null);\n      const barElRef = ref<HTMLDivElement | null>(null);\n      const contentElRef = ref<HTMLDivElement | null>(null);\n      const actionElRef = ref(null) as Ref<HTMLDivElement | null>;\n\n      useEventListener({\n        el: document,\n        name: 'mouseup',\n        listener: () => {\n          if (state.isMoving) {\n            resume();\n          }\n        },\n      });\n\n      const getActionStyleRef = computed(() => {\n        const { height, actionStyle } = props;\n        const h = `${parseInt(height as string)}px`;\n        return {\n          left: 0,\n          width: h,\n          height: h,\n          ...actionStyle,\n        };\n      });\n\n      const getWrapStyleRef = computed(() => {\n        const { height, width, circle, wrapStyle } = props;\n        const h = parseInt(height as string);\n        const w = `${parseInt(width as string)}px`;\n        return {\n          width: w,\n          height: `${h}px`,\n          lineHeight: `${h}px`,\n          borderRadius: circle ? h / 2 + 'px' : 0,\n          ...wrapStyle,\n        };\n      });\n\n      const getBarStyleRef = computed(() => {\n        const { height, circle, barStyle } = props;\n        const h = parseInt(height as string);\n        return {\n          height: `${h}px`,\n          borderRadius: circle ? h / 2 + 'px 0 0 ' + h / 2 + 'px' : 0,\n          ...barStyle,\n        };\n      });\n\n      const getContentStyleRef = computed(() => {\n        const { height, width, contentStyle } = props;\n        const h = `${parseInt(height as string)}px`;\n        const w = `${parseInt(width as string)}px`;\n\n        return {\n          height: h,\n          width: w,\n          ...contentStyle,\n        };\n      });\n\n      watch(\n        () => state.isPassing,\n        (isPassing) => {\n          if (isPassing) {\n            const { startTime, endTime } = state;\n            const time = (endTime - startTime) / 1000;\n            emit('success', { isPassing, time: time.toFixed(1) });\n            emit('update:value', isPassing);\n            emit('change', isPassing);\n          }\n        }\n      );\n\n      watchEffect(() => {\n        state.isPassing = !!props.value;\n      });\n\n      function getEventPageX(e: MouseEvent | TouchEvent) {\n        return (e as MouseEvent).pageX || (e as TouchEvent).touches[0].pageX;\n      }\n\n      function handleDragStart(e: MouseEvent | TouchEvent) {\n        if (state.isPassing) {\n          return;\n        }\n        const actionEl = unref(actionElRef);\n        if (!actionEl) return;\n        emit('start', e);\n        state.moveDistance = getEventPageX(e) - parseInt(actionEl.style.left.replace('px', ''), 10);\n        state.startTime = new Date().getTime();\n        state.isMoving = true;\n      }\n\n      function getOffset(el: HTMLDivElement) {\n        const actionWidth = parseInt(el.style.width);\n        const { width } = props;\n        const widthNum = parseInt(width as string);\n        const offset = widthNum - actionWidth - 6;\n        return { offset, widthNum, actionWidth };\n      }\n\n      function handleDragMoving(e: MouseEvent | TouchEvent) {\n        const { isMoving, moveDistance } = state;\n        if (isMoving) {\n          const actionEl = unref(actionElRef);\n          const barEl = unref(barElRef);\n          if (!actionEl || !barEl) return;\n          const { offset, widthNum, actionWidth } = getOffset(actionEl);\n          const moveX = getEventPageX(e) - moveDistance;\n\n          emit('move', {\n            event: e,\n            moveDistance,\n            moveX,\n          });\n          if (moveX > 0 && moveX <= offset) {\n            actionEl.style.left = `${moveX}px`;\n            barEl.style.width = `${moveX + actionWidth / 2}px`;\n          } else if (moveX > offset) {\n            actionEl.style.left = `${widthNum - actionWidth}px`;\n            barEl.style.width = `${widthNum - actionWidth / 2}px`;\n            if (!props.isSlot) {\n              checkPass();\n            }\n          }\n        }\n      }\n\n      function handleDragOver(e: MouseEvent | TouchEvent) {\n        const { isMoving, isPassing, moveDistance } = state;\n        if (isMoving && !isPassing) {\n          emit('end', e);\n          const actionEl = unref(actionElRef);\n          const barEl = unref(barElRef);\n          if (!actionEl || !barEl) return;\n          const moveX = getEventPageX(e) - moveDistance;\n          const { offset, widthNum, actionWidth } = getOffset(actionEl);\n          if (moveX < offset) {\n            if (!props.isSlot) {\n              resume();\n            } else {\n              setTimeout(() => {\n                if (!props.value) {\n                  resume();\n                } else {\n                  const contentEl = unref(contentElRef);\n                  if (contentEl) {\n                    contentEl.style.width = `${parseInt(barEl.style.width)}px`;\n                  }\n                }\n              }, 0);\n            }\n          } else {\n            actionEl.style.left = `${widthNum - actionWidth}px`;\n            barEl.style.width = `${widthNum - actionWidth / 2}px`;\n            checkPass();\n          }\n          state.isMoving = false;\n        }\n      }\n\n      function checkPass() {\n        if (props.isSlot) {\n          resume();\n          return;\n        }\n        state.endTime = new Date().getTime();\n        state.isPassing = true;\n        state.isMoving = false;\n      }\n\n      function resume() {\n        state.isMoving = false;\n        state.isPassing = false;\n        state.moveDistance = 0;\n        state.toLeft = false;\n        state.startTime = 0;\n        state.endTime = 0;\n        const actionEl = unref(actionElRef);\n        const barEl = unref(barElRef);\n        const contentEl = unref(contentElRef);\n        if (!actionEl || !barEl || !contentEl) return;\n        state.toLeft = true;\n        useTimeoutFn(() => {\n          state.toLeft = false;\n          actionEl.style.left = '0';\n          barEl.style.width = '0';\n          //  The time is consistent with the animation time\n        }, 300);\n        contentEl.style.width = unref(getContentStyleRef).width;\n      }\n\n      expose({\n        resume,\n      });\n\n      return () => {\n        const renderBar = () => {\n          const cls = [`darg-verify-bar`];\n          if (state.toLeft) {\n            cls.push('to-left');\n          }\n          return <div class={cls} ref={barElRef} style={unref(getBarStyleRef)} />;\n        };\n\n        const renderContent = () => {\n          const cls = [`darg-verify-content`];\n          const { isPassing } = state;\n          const { text, successText } = props;\n\n          isPassing && cls.push('success');\n\n          return (\n            <div class={cls} ref={contentElRef} style={unref(getContentStyleRef)}>\n              {getSlot(slots, 'text', isPassing) || (isPassing ? successText : text)}\n            </div>\n          );\n        };\n\n        const renderAction = () => {\n          const cls = [`darg-verify-action`];\n          const { toLeft, isPassing } = state;\n          if (toLeft) {\n            cls.push('to-left');\n          }\n          return (\n            <div class={cls} onMousedown={handleDragStart} onTouchstart={handleDragStart} style={unref(getActionStyleRef)} ref={actionElRef}>\n              {getSlot(slots, 'actionIcon', isPassing) ||\n                (isPassing ? <CheckOutlined class={`darg-verify-action__icon`} /> : <DoubleRightOutlined class={`darg-verify-action__icon`} />)}\n            </div>\n          );\n        };\n\n        return (\n          <div\n            class=\"darg-verify\"\n            ref={wrapElRef}\n            style={unref(getWrapStyleRef)}\n            onMousemove={handleDragMoving}\n            onTouchmove={handleDragMoving}\n            onMouseleave={handleDragOver}\n            onMouseup={handleDragOver}\n            onTouchend={handleDragOver}\n          >\n            {renderBar()}\n            {renderContent()}\n            {renderAction()}\n          </div>\n        );\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @radius: 4px;\n\n  .darg-verify {\n    position: relative;\n    overflow: hidden;\n    text-align: center;\n    background-color: rgb(238, 238, 238);\n    border: 1px solid #ddd;\n    border-radius: @radius;\n\n    &-bar {\n      position: absolute;\n      width: 0;\n      height: 36px;\n      background-color: @success-color;\n      border-radius: @radius;\n\n      &.to-left {\n        width: 0 !important;\n        transition: width 0.3s;\n      }\n    }\n\n    &-content {\n      position: absolute;\n      top: 0;\n      font-size: 12px;\n      -webkit-text-size-adjust: none;\n      background-color: -webkit-gradient(\n        linear,\n        left top,\n        right top,\n        color-stop(0, #333),\n        color-stop(0.4, #333),\n        color-stop(0.5, #fff),\n        color-stop(0.6, #333),\n        color-stop(1, #333)\n      );\n      animation: slidetounlock 3s infinite;\n      background-clip: text;\n      user-select: none;\n\n      &.success {\n        -webkit-text-fill-color: @white;\n      }\n\n      & > * {\n        -webkit-text-fill-color: #333;\n      }\n    }\n\n    &-action {\n      position: absolute;\n      top: 0;\n      left: 0;\n      display: flex;\n      cursor: move;\n      background-color: @white;\n      border-radius: @radius;\n      justify-content: center;\n      align-items: center;\n\n      &__icon {\n        cursor: inherit;\n      }\n\n      &.to-left {\n        left: 0 !important;\n        transition: left 0.3s;\n      }\n    }\n  }\n\n  @keyframes slidetounlock {\n    0% {\n      background-position: -120px 0;\n    }\n\n    100% {\n      background-position: 120px 0;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Verify/src/ImgRotate.vue",
    "content": "<script lang=\"tsx\">\n  import type { MoveData, DragVerifyActionType } from './typing';\n  import { defineComponent, computed, unref, reactive, watch, ref } from 'vue';\n  import { useTimeoutFn } from '/@/hooks/core/useTimeout';\n  import BasicDragVerify from './DragVerify.vue';\n  import { hackCss } from '/@/utils/domUtils';\n  import { rotateProps } from './props';\n  import { useI18n } from '/@/hooks/web/useI18n';\n\n  export default defineComponent({\n    name: 'ImgRotateDragVerify',\n    inheritAttrs: false,\n    props: rotateProps,\n    emits: ['success', 'change', 'update:value'],\n    setup(props, { emit, attrs, expose }) {\n      const basicRef = ref<Nullable<DragVerifyActionType>>(null);\n      const state = reactive({\n        showTip: false,\n        isPassing: false,\n        imgStyle: {},\n        randomRotate: 0,\n        currentRotate: 0,\n        toOrigin: false,\n        startTime: 0,\n        endTime: 0,\n        draged: false,\n      });\n      const { t } = useI18n();\n\n      watch(\n        () => state.isPassing,\n        (isPassing) => {\n          if (isPassing) {\n            const { startTime, endTime } = state;\n            const time = (endTime - startTime) / 1000;\n            emit('success', { isPassing, time: time.toFixed(1) });\n            emit('change', isPassing);\n            emit('update:value', isPassing);\n          }\n        }\n      );\n\n      const getImgWrapStyleRef = computed(() => {\n        const { imgWrapStyle, imgWidth } = props;\n        return {\n          width: `${imgWidth}px`,\n          height: `${imgWidth}px`,\n          ...imgWrapStyle,\n        };\n      });\n\n      const getFactorRef = computed(() => {\n        const { minDegree, maxDegree } = props;\n        if (minDegree === maxDegree) {\n          return Math.floor(1 + Math.random() * 1) / 10 + 1;\n        }\n        return 1;\n      });\n\n      function handleStart() {\n        state.startTime = new Date().getTime();\n      }\n\n      function handleDragBarMove(data: MoveData) {\n        state.draged = true;\n        const { imgWidth, height, maxDegree } = props;\n        const { moveX } = data;\n        const currentRotate = Math.ceil((moveX / (imgWidth! - parseInt(height as string))) * maxDegree! * unref(getFactorRef));\n        state.currentRotate = currentRotate;\n        state.imgStyle = hackCss('transform', `rotateZ(${state.randomRotate - currentRotate}deg)`);\n      }\n\n      function handleImgOnLoad() {\n        const { minDegree, maxDegree } = props;\n        const ranRotate = Math.floor(minDegree! + Math.random() * (maxDegree! - minDegree!)); // 生成随机角度\n        state.randomRotate = ranRotate;\n        state.imgStyle = hackCss('transform', `rotateZ(${ranRotate}deg)`);\n      }\n\n      function handleDragEnd() {\n        const { randomRotate, currentRotate } = state;\n        const { diffDegree } = props;\n\n        if (Math.abs(randomRotate - currentRotate) >= (diffDegree || 20)) {\n          state.imgStyle = hackCss('transform', `rotateZ(${randomRotate}deg)`);\n          state.toOrigin = true;\n          useTimeoutFn(() => {\n            state.toOrigin = false;\n            state.showTip = true;\n            //  时间与动画时间保持一致\n          }, 300);\n        } else {\n          checkPass();\n        }\n        state.showTip = true;\n      }\n\n      function checkPass() {\n        state.isPassing = true;\n        state.endTime = new Date().getTime();\n      }\n\n      function resume() {\n        state.showTip = false;\n        const basicEl = unref(basicRef);\n        if (!basicEl) {\n          return;\n        }\n        state.isPassing = false;\n\n        basicEl.resume();\n        handleImgOnLoad();\n      }\n\n      expose({ resume });\n\n      // handleImgOnLoad();\n      return () => {\n        const { src } = props;\n        const { toOrigin, isPassing, startTime, endTime } = state;\n        const imgCls: string[] = [];\n        if (toOrigin) {\n          imgCls.push('to-origin');\n        }\n        const time = (endTime - startTime) / 1000;\n\n        return (\n          <div class=\"ir-dv\">\n            <div class={`ir-dv-img__wrap`} style={unref(getImgWrapStyleRef)}>\n              <img\n                src={src}\n                onLoad={handleImgOnLoad}\n                width={parseInt(props.width as string)}\n                class={imgCls}\n                style={state.imgStyle}\n                onClick={() => {\n                  resume();\n                }}\n                alt=\"verify\"\n              />\n              {state.showTip && (\n                <span class={[`ir-dv-img__tip`, state.isPassing ? 'success' : 'error']}>\n                  {state.isPassing ? t('component.verify.time', { time: time.toFixed(1) }) : t('component.verify.error')}\n                </span>\n              )}\n              {!state.showTip && !state.draged && <span class={[`ir-dv-img__tip`, 'normal']}>{t('component.verify.redoTip')}</span>}\n            </div>\n            <BasicDragVerify\n              class={`ir-dv-drag__bar`}\n              onMove={handleDragBarMove}\n              onEnd={handleDragEnd}\n              onStart={handleStart}\n              ref={basicRef}\n              {...{ ...attrs, ...props }}\n              value={isPassing}\n              isSlot={true}\n            />\n          </div>\n        );\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  .ir-dv {\n    position: relative;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n\n    &-img__wrap {\n      position: relative;\n      overflow: hidden;\n      border-radius: 50%;\n\n      img {\n        width: 100%;\n        border-radius: 50%;\n\n        &.to-origin {\n          transition: transform 0.3s;\n        }\n      }\n    }\n\n    &-img__tip {\n      position: absolute;\n      bottom: 10px;\n      left: 0;\n      z-index: 1;\n      display: block;\n      width: 100%;\n      height: 30px;\n      font-size: 12px;\n      line-height: 30px;\n      color: @white;\n      text-align: center;\n\n      &.success {\n        background-color: fade(@success-color, 60%);\n      }\n\n      &.error {\n        background-color: fade(@error-color, 60%);\n      }\n\n      &.normal {\n        background-color: rgba(0, 0, 0, 0.3);\n      }\n    }\n\n    &-drag__bar {\n      margin-top: 20px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Verify/src/props.ts",
    "content": "import type { PropType } from 'vue';\nimport { useI18n } from '/@/hooks/web/useI18n';\n\nconst { t } = useI18n();\nexport const basicProps = {\n  value: {\n    type: Boolean as PropType<boolean>,\n    default: false,\n  },\n\n  isSlot: {\n    type: Boolean as PropType<boolean>,\n    default: false,\n  },\n\n  text: {\n    type: [String] as PropType<string>,\n    default: t('component.verify.dragText'),\n  },\n  successText: {\n    type: [String] as PropType<string>,\n    default: t('component.verify.successText'),\n  },\n  height: {\n    type: [Number, String] as PropType<number | string>,\n    default: 40,\n  },\n\n  width: {\n    type: [Number, String] as PropType<number | string>,\n    default: 220,\n  },\n\n  circle: {\n    type: Boolean as PropType<boolean>,\n    default: false,\n  },\n\n  wrapStyle: {\n    type: Object as PropType<any>,\n    default: {},\n  },\n  contentStyle: {\n    type: Object as PropType<any>,\n    default: {},\n  },\n  barStyle: {\n    type: Object as PropType<any>,\n    default: {},\n  },\n  actionStyle: {\n    type: Object as PropType<any>,\n    default: {},\n  },\n};\n\nexport const rotateProps = {\n  ...basicProps,\n  src: {\n    type: String as PropType<string>,\n  },\n\n  imgWidth: {\n    type: Number as PropType<number>,\n    default: 260,\n  },\n\n  imgWrapStyle: {\n    type: Object as PropType<any>,\n    default: {},\n  },\n\n  minDegree: {\n    type: Number as PropType<number>,\n    default: 90,\n  },\n\n  maxDegree: {\n    type: Number as PropType<number>,\n    default: 270,\n  },\n\n  diffDegree: {\n    type: Number as PropType<number>,\n    default: 20,\n  },\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/Verify/src/typing.ts",
    "content": "export interface DragVerifyActionType {\n  resume: () => void;\n}\n\nexport interface PassingData {\n  isPassing: boolean;\n  time: number;\n}\n\nexport interface MoveData {\n  event: MouseEvent | TouchEvent;\n  moveDistance: number;\n  moveX: number;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/VirtualScroll/index.ts",
    "content": "import { withInstall } from '/@/utils/index';\nimport vScroll from './src/VirtualScroll.vue';\n\nexport const VScroll = withInstall(vScroll);\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/VirtualScroll/src/VirtualScroll.vue",
    "content": "<script lang=\"tsx\">\n  import { defineComponent, computed, ref, unref, reactive, onMounted, watch, nextTick, CSSProperties } from 'vue';\n  import { useEventListener } from '/@/hooks/event/useEventListener';\n  import { getSlot } from '/@/utils/helper/tsxHelper';\n\n  type NumberOrNumberString = PropType<string | number | undefined>;\n\n  const props = {\n    height: [Number, String] as NumberOrNumberString,\n    maxHeight: [Number, String] as NumberOrNumberString,\n    maxWidth: [Number, String] as NumberOrNumberString,\n    minHeight: [Number, String] as NumberOrNumberString,\n    minWidth: [Number, String] as NumberOrNumberString,\n    width: [Number, String] as NumberOrNumberString,\n    bench: {\n      type: [Number, String] as NumberOrNumberString,\n      default: 0,\n    },\n    itemHeight: {\n      type: [Number, String] as NumberOrNumberString,\n      required: true,\n    },\n    items: {\n      type: Array as PropType<any[]>,\n      default: () => [],\n    },\n  };\n\n  const prefixCls = 'virtual-scroll';\n\n  function convertToUnit(str: string | number | null | undefined, unit = 'px'): string | undefined {\n    if (str == null || str === '') {\n      return undefined;\n    } else if (isNaN(+str!)) {\n      return String(str);\n    } else {\n      return `${Number(str)}${unit}`;\n    }\n  }\n\n  export default defineComponent({\n    name: 'VirtualScroll',\n    props,\n    setup(props, { slots }) {\n      const wrapElRef = ref<HTMLDivElement | null>(null);\n      const state = reactive({\n        first: 0,\n        last: 0,\n        scrollTop: 0,\n      });\n\n      const getBenchRef = computed(() => {\n        return parseInt(props.bench as string, 10);\n      });\n\n      const getItemHeightRef = computed(() => {\n        return parseInt(props.itemHeight as string, 10);\n      });\n\n      const getFirstToRenderRef = computed(() => {\n        return Math.max(0, state.first - unref(getBenchRef));\n      });\n\n      const getLastToRenderRef = computed(() => {\n        return Math.min((props.items || []).length, state.last + unref(getBenchRef));\n      });\n\n      const getContainerStyleRef = computed((): CSSProperties => {\n        return {\n          height: convertToUnit((props.items || []).length * unref(getItemHeightRef)),\n        };\n      });\n\n      const getWrapStyleRef = computed((): CSSProperties => {\n        const styles: Recordable<string> = {};\n        const height = convertToUnit(props.height);\n        const minHeight = convertToUnit(props.minHeight);\n        const minWidth = convertToUnit(props.minWidth);\n        const maxHeight = convertToUnit(props.maxHeight);\n        const maxWidth = convertToUnit(props.maxWidth);\n        const width = convertToUnit(props.width);\n\n        if (height) styles.height = height;\n        if (minHeight) styles.minHeight = minHeight;\n        if (minWidth) styles.minWidth = minWidth;\n        if (maxHeight) styles.maxHeight = maxHeight;\n        if (maxWidth) styles.maxWidth = maxWidth;\n        if (width) styles.width = width;\n        return styles;\n      });\n\n      watch([() => props.itemHeight, () => props.height], () => {\n        onScroll();\n      });\n\n      function getLast(first: number): number {\n        const wrapEl = unref(wrapElRef);\n        if (!wrapEl) {\n          return 0;\n        }\n        const height = parseInt(props.height || 0, 10) || wrapEl.clientHeight;\n\n        return first + Math.ceil(height / unref(getItemHeightRef));\n      }\n\n      function getFirst(): number {\n        return Math.floor(state.scrollTop / unref(getItemHeightRef));\n      }\n\n      function onScroll() {\n        const wrapEl = unref(wrapElRef);\n        if (!wrapEl) {\n          return;\n        }\n        state.scrollTop = wrapEl.scrollTop;\n        state.first = getFirst();\n        state.last = getLast(state.first);\n      }\n\n      function renderChildren() {\n        const { items = [] } = props;\n        return items.slice(unref(getFirstToRenderRef), unref(getLastToRenderRef)).map(genChild);\n      }\n\n      function genChild(item: any, index: number) {\n        index += unref(getFirstToRenderRef);\n        const top = convertToUnit(index * unref(getItemHeightRef));\n        return (\n          <div class={`${prefixCls}__item`} style={{ top }} key={index}>\n            {getSlot(slots, 'default', { index, item })}\n          </div>\n        );\n      }\n\n      onMounted(() => {\n        state.last = getLast(0);\n        nextTick(() => {\n          const wrapEl = unref(wrapElRef);\n          if (!wrapEl) {\n            return;\n          }\n          useEventListener({\n            el: wrapEl,\n            name: 'scroll',\n            listener: onScroll,\n            wait: 0,\n          });\n        });\n      });\n\n      return () => (\n        <div class={prefixCls} style={unref(getWrapStyleRef)} ref={wrapElRef}>\n          <div class={`${prefixCls}__container`} style={unref(getContainerStyleRef)}>\n            {renderChildren()}\n          </div>\n        </div>\n      );\n    },\n  });\n</script>\n<style scoped lang=\"less\">\n  .virtual-scroll {\n    position: relative;\n    display: block;\n    width: 100%;\n    max-width: 100%;\n    overflow: auto;\n    flex: 1 1 auto;\n\n    &__container {\n      display: block;\n    }\n\n    &__item {\n      position: absolute;\n      right: 0;\n      left: 0;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/chart/Bar.vue",
    "content": "<template>\n  <div ref=\"chartRef\" :style=\"{ height, width }\"></div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, ref, Ref, reactive, watchEffect } from 'vue';\n  import { useECharts } from '/@/hooks/web/useECharts';\n  import { cloneDeep } from 'lodash-es';\n  export default defineComponent({\n    name: 'bar',\n    props: {\n      chartData: {\n        type: Array,\n        default: () => [],\n      },\n      option: {\n        type: Object,\n        default: () => ({}),\n      },\n      width: {\n        type: String as PropType<string>,\n        default: '100%',\n      },\n      height: {\n        type: String as PropType<string>,\n        default: 'calc(100vh - 78px)',\n      },\n      // 代码逻辑说明: 【QQYUN-8762】首页默认及echars颜色调整\n      seriesColor: {\n        type: String,\n        default: '#1890ff',\n      },\n    },\n    setup(props) {\n      const chartRef = ref<HTMLDivElement | null>(null);\n      const { setOptions, echarts } = useECharts(chartRef as Ref<HTMLDivElement>);\n      const option = reactive({\n        tooltip: {\n          trigger: 'axis',\n          axisPointer: {\n            type: 'shadow',\n            label: {\n              show: true,\n              backgroundColor: '#333',\n            },\n          },\n        },\n        xAxis: {\n          type: 'category',\n          data: [],\n        },\n        yAxis: {\n          type: 'value',\n        },\n        series: [\n          {\n            name: 'bar',\n            type: 'bar',\n            data: [],\n            color: props.seriesColor,\n          },\n        ],\n      });\n\n      watchEffect(() => {\n        props.chartData && initCharts();\n      });\n\n      function initCharts() {\n        if (props.option) {\n          Object.assign(option, cloneDeep(props.option));\n        }\n        let seriesData = props.chartData.map((item) => {\n          return item.value;\n        });\n        let xAxisData = props.chartData.map((item) => {\n          return item.name;\n        });\n        option.series[0].data = seriesData;\n        // 代码逻辑说明: 【QQYUN-8762】首页默认及echars颜色调整\n        option.series[0].color = props.seriesColor;\n        option.xAxis.data = xAxisData;\n        setOptions(option);\n      }\n      return { chartRef };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/chart/BarAndLine.vue",
    "content": "<template>\n  <div ref=\"chartRef\" :style=\"{ height, width }\"></div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, ref, Ref, reactive, watchEffect } from 'vue';\n  import { useECharts } from '/@/hooks/web/useECharts';\n  import { cloneDeep } from 'lodash-es';\n  export default defineComponent({\n    name: 'barAndLine',\n    props: {\n      chartData: {\n        type: Array,\n        default: () => [],\n      },\n      option: {\n        type: Object,\n        default: () => ({}),\n      },\n      width: {\n        type: String as PropType<string>,\n        default: '100%',\n      },\n      height: {\n        type: String as PropType<string>,\n        default: 'calc(100vh - 78px)',\n      },\n      customColor: {\n        type: Array,\n        default: () => [],\n      }\n    },\n    setup(props) {\n      const chartRef = ref<HTMLDivElement | null>(null);\n      const { setOptions, echarts } = useECharts(chartRef as Ref<HTMLDivElement>);\n      const option = reactive({\n        tooltip: {\n          trigger: 'axis',\n          axisPointer: {\n            type: 'shadow',\n            label: {\n              show: true,\n              backgroundColor: '#333',\n            },\n          },\n        },\n        xAxis: {\n          type: 'category',\n          data: [],\n        },\n        yAxis: {\n          type: 'value',\n        },\n        series: [\n          {\n            name: 'bar',\n            type: 'bar',\n            data: [],\n          },\n        ],\n      });\n\n      watchEffect(() => {\n        props.chartData && initCharts();\n      });\n\n      function initCharts() {\n        if (props.option) {\n          Object.assign(option, cloneDeep(props.option));\n        }\n        //图例类型\n        let typeArr = Array.from(new Set(props.chartData.map((item) => item.type)));\n        //轴数据\n        let xAxisData = Array.from(new Set(props.chartData.map((item) => item.name)));\n        let seriesData = [];\n        typeArr.forEach((type,index) => {\n          let obj = { name: type };\n          let chartArr = props.chartData.filter((item) => type === item.type);\n          //data数据\n          obj['data'] = chartArr.map((item) => item.value);\n          obj['type'] = chartArr[0].seriesType;\n          if(props?.customColor && props?.customColor[index]){\n            obj['color'] = props.customColor[index];\n          }\n          seriesData.push(obj);\n        });\n        option.series = seriesData;\n        option.xAxis.data = xAxisData;\n        setOptions(option);\n      }\n      return { chartRef };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/chart/BarMulti.vue",
    "content": "<template>\n  <div ref=\"chartRef\" :style=\"{ height, width }\"></div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, ref, Ref, reactive, watchEffect } from 'vue';\n  import { useECharts } from '/@/hooks/web/useECharts';\n  import { cloneDeep } from 'lodash-es';\n  export default defineComponent({\n    name: 'BarMulti',\n    props: {\n      chartData: {\n        type: Array,\n        default: () => [],\n        required: true,\n      },\n      option: {\n        type: Object,\n        default: () => ({}),\n      },\n      type: {\n        type: String as PropType<string>,\n        default: 'bar',\n      },\n      width: {\n        type: String as PropType<string>,\n        default: '100%',\n      },\n      height: {\n        type: String as PropType<string>,\n        default: 'calc(100vh - 78px)',\n      },\n      // 代码逻辑说明: 【QQYUN-8762】首页默认及echars颜色调整\n      seriesColor: {\n        type: Array,\n        default: () => [],\n      },\n    },\n    emits: ['click'],\n    setup(props, { emit }) {\n      const chartRef = ref<HTMLDivElement | null>(null);\n      const { setOptions, getInstance } = useECharts(chartRef as Ref<HTMLDivElement>);\n      const option = reactive({\n        tooltip: {\n          trigger: 'axis',\n          axisPointer: {\n            type: 'shadow',\n            label: {\n              show: true,\n              backgroundColor: '#333',\n            },\n          },\n        },\n        legend: {\n          top: 30,\n        },\n        grid: {\n          top: 60,\n        },\n        xAxis: {\n          type: 'category',\n          data: [],\n        },\n        yAxis: {\n          type: 'value',\n        },\n        series: [],\n      });\n\n      watchEffect(() => {\n        props.chartData && initCharts();\n      });\n\n      function initCharts() {\n        if (props.option) {\n          Object.assign(option, cloneDeep(props.option));\n        }\n        //图例类型\n        let typeArr = Array.from(new Set(props.chartData.map((item) => item.type)));\n        //轴数据\n        let xAxisData = Array.from(new Set(props.chartData.map((item) => item.name)));\n        let seriesData = [];\n        typeArr.forEach((type) => {\n          let obj: any = { name: type, type: props.type };\n          // 代码逻辑说明: [issues/613] LineMulti 在数据不对齐时，横坐标计算错误\n          let data = [];\n          xAxisData.forEach((x) => {\n            let dataArr = props.chartData.filter((item) => type === item.type && item.name == x);\n            if (dataArr && dataArr.length > 0) {\n              data.push(dataArr[0].value);\n            } else {\n              data.push(null);\n            }\n          });\n          //data数据\n          obj['data'] = data;\n          // 代码逻辑说明: 【QQYUN-8762】首页默认及echars颜色调整\n          if (props.seriesColor?.length) {\n            const findItem = props.seriesColor.find((item: any) => item.type === type);\n            if (findItem?.color) {\n              obj['color'] = findItem.color;\n            }\n          }\n          seriesData.push(obj);\n        });\n        option.series = seriesData;\n        option.xAxis.data = xAxisData;\n        setOptions(option);\n        getInstance()?.off('click', onClick);\n        getInstance()?.on('click', onClick);\n      }\n\n      function onClick(params) {\n        emit('click', params);\n      }\n\n      return { chartRef };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/chart/ChartCard.vue",
    "content": "<template>\n  <a-card :loading=\"loading\" :body-style=\"{ padding: '20px 24px 8px' }\" :bordered=\"false\">\n    <div class=\"chart-card-header\">\n      <div class=\"meta\">\n        <span class=\"chart-card-title\">{{ title }}</span>\n        <span class=\"chart-card-action\">\n          <slot name=\"action\"></slot>\n        </span>\n      </div>\n      <div class=\"total\"\n        ><span>{{ total }}</span></div\n      >\n    </div>\n    <div class=\"chart-card-content\">\n      <div class=\"content-fix\">\n        <slot></slot>\n      </div>\n    </div>\n    <div class=\"chart-card-footer\">\n      <div class=\"field\">\n        <slot name=\"footer\"></slot>\n      </div>\n    </div>\n  </a-card>\n</template>\n\n<script lang=\"ts\" setup>\n  defineProps({\n    title: {\n      type: String,\n      default: '',\n    },\n    total: {\n      type: [Number, String],\n      default: '',\n    },\n    loading: {\n      type: Boolean,\n      default: false,\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .chart-card-header {\n    position: relative;\n    overflow: hidden;\n    width: 100%;\n\n    .meta {\n      position: relative;\n      overflow: hidden;\n      width: 100%;\n      color: rgba(0, 0, 0, 0.45);\n      font-size: 14px;\n      line-height: 22px;\n    }\n  }\n\n  .chart-card-action {\n    cursor: pointer;\n    position: absolute;\n    top: 0;\n    right: 0;\n  }\n\n  .chart-card-footer {\n    border-top: 1px solid #e8e8e8;\n    padding-top: 9px;\n    margin-top: 8px;\n\n    > * {\n      position: relative;\n    }\n\n    .field {\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      margin: 0;\n    }\n  }\n\n  .chart-card-content {\n    margin-bottom: 12px;\n    position: relative;\n    height: 46px;\n    width: 100%;\n\n    .content-fix {\n      position: absolute;\n      left: 0;\n      bottom: 0;\n      width: 100%;\n    }\n  }\n\n  .total {\n    overflow: hidden;\n    text-overflow: ellipsis;\n    word-break: break-all;\n    white-space: nowrap;\n    margin-top: 4px;\n    margin-bottom: 0;\n    font-size: 30px;\n    line-height: 38px;\n    height: 38px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/chart/Gauge.vue",
    "content": "<template>\n  <div ref=\"chartRef\" :style=\"{ height, width }\"></div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, ref, Ref, reactive, watchEffect } from 'vue';\n  import { useECharts } from '/@/hooks/web/useECharts';\n  import { GaugeChart } from 'echarts/charts';\n  import { cloneDeep } from 'lodash-es';\n  export default defineComponent({\n    name: 'Gauge',\n    props: {\n      chartData: {\n        type: Object as PropType<Object>,\n        default: () => [],\n      },\n      option: {\n        type: Object,\n        default: () => ({}),\n      },\n      width: {\n        type: String as PropType<string>,\n        default: '100%',\n      },\n      height: {\n        type: String as PropType<string>,\n        default: 'calc(100vh - 78px)',\n      },\n      // 代码逻辑说明: 【QQYUN-8762】首页默认及echars颜色调整\n      seriesColor: {\n        type: String,\n        default: '#1890ff',\n      },\n    },\n    setup(props) {\n      const chartRef = ref<HTMLDivElement | null>(null);\n      const { setOptions, echarts } = useECharts(chartRef as Ref<HTMLDivElement>);\n      const option = reactive({\n        series: [\n          {\n            type: 'gauge',\n            progress: {\n              show: true,\n              width: 12,\n            },\n            axisLine: {\n              lineStyle: {\n                width: 12,\n              },\n            },\n            axisTick: {\n              show: false,\n            },\n            splitLine: {\n              length: 12,\n              lineStyle: {\n                width: 1,\n                color: '#999',\n              },\n            },\n            axisLabel: {\n              distance: 25,\n              color: '#999',\n              fontSize: 12,\n            },\n            anchor: {\n              show: true,\n              showAbove: true,\n              size: 20,\n              itemStyle: {\n                borderWidth: 5,\n              },\n            },\n            title: {},\n            detail: {\n              valueAnimation: true,\n              fontSize: 25,\n              formatter: '{value}%',\n              offsetCenter: [0, '80%'],\n            },\n            data: [\n              {\n                value: 70,\n                name: '本地磁盘',\n              },\n            ],\n          },\n        ],\n      });\n\n      watchEffect(() => {\n        props.chartData && initCharts();\n      });\n\n      function initCharts() {\n        echarts.use(GaugeChart);\n        if (props.option) {\n          Object.assign(option, cloneDeep(props.option));\n        }\n        option.series[0].data[0].name = props.chartData.name;\n        option.series[0].data[0].value = props.chartData.value;\n        // 代码逻辑说明: 【QQYUN-8762】首页默认及echars颜色调整\n        option.series[0].color = props.seriesColor;\n        setOptions(option);\n      }\n      return { chartRef };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/chart/HeadInfo.vue",
    "content": "<template>\n  <div class=\"head-info\" :class=\"center && 'center'\">\n    <span>{{ title }}</span>\n    <p :style=\"{ color: `${$props.iconColor}` }\">{{ content }} <a-icon :type=\"icon\" :style=\"{ fontSize: `24px`, color: `${$props.iconColor}` }\" /></p>\n    <em v-if=\"bordered\" />\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n\n  export default defineComponent({\n    name: 'HeadInfo',\n    props: {\n      title: {\n        type: String,\n        default: '',\n      },\n      content: {\n        type: String,\n        default: '',\n      },\n      bordered: {\n        type: Boolean,\n        default: false,\n      },\n      center: {\n        type: Boolean,\n        default: true,\n      },\n      icon: {\n        type: String,\n        default: false,\n      },\n      // 代码逻辑说明: 【QQYUN-8762】首页默认及echars颜色调整\n      iconColor: {\n        type: String,\n        default: '#2b99ff',\n      },\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .head-info {\n    position: relative;\n    text-align: left;\n    padding: 0 32px 0 0;\n    min-width: 125px;\n\n    &.center {\n      text-align: center;\n      padding: 0 32px;\n    }\n\n    span {\n      display: inline-block;\n      font-size: 14px;\n      line-height: 22px;\n      margin-bottom: 4px;\n    }\n\n    p {\n      font-size: 24px;\n      line-height: 32px;\n      margin: 0;\n    }\n\n    em {\n      background-color: #e8e8e8;\n      position: absolute;\n      height: 56px;\n      width: 1px;\n      top: 0;\n      right: 0;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/chart/LineMulti.vue",
    "content": "<template>\n  <div ref=\"chartRef\" :style=\"{ height, width }\"></div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, ref, Ref, reactive, watchEffect } from 'vue';\n  import { useECharts } from '/@/hooks/web/useECharts';\n  import { cloneDeep } from 'lodash-es';\n\n  export default defineComponent({\n    name: 'LineMulti',\n    props: {\n      chartData: {\n        type: Array,\n        default: () => [],\n        required: true,\n      },\n      option: {\n        type: Object,\n        default: () => ({}),\n      },\n      type: {\n        type: String as PropType<string>,\n        default: 'line',\n      },\n      width: {\n        type: String as PropType<string>,\n        default: '100%',\n      },\n      height: {\n        type: String as PropType<string>,\n        default: 'calc(100vh - 78px)',\n      },\n    },\n    emits: ['click'],\n    setup(props, { emit }) {\n      const chartRef = ref<HTMLDivElement | null>(null);\n      const { setOptions, getInstance } = useECharts(chartRef as Ref<HTMLDivElement>);\n      const option = reactive({\n        tooltip: {\n          trigger: 'axis',\n          axisPointer: {\n            type: 'shadow',\n            label: {\n              show: true,\n              backgroundColor: '#333',\n            },\n          },\n        },\n        legend: {\n          top: 30,\n        },\n        grid: {\n          top: 60,\n        },\n        xAxis: {\n          type: 'category',\n          data: [],\n        },\n        yAxis: {\n          type: 'value',\n        },\n        series: [],\n      });\n\n      watchEffect(() => {\n        props.chartData && initCharts();\n      });\n\n      function initCharts() {\n        if (props.option) {\n          Object.assign(option, cloneDeep(props.option));\n        }\n        //图例类型\n        let typeArr = Array.from(new Set(props.chartData.map((item) => item.type)));\n        //轴数据\n        let xAxisData = Array.from(new Set(props.chartData.map((item) => item.name)));\n        let seriesData = [];\n        typeArr.forEach((type) => {\n          let obj: any = { name: type, type: props.type };\n          // 代码逻辑说明: 【QQYUN-8762】首页默认及echars颜色调整\n          const findItem: any = props.chartData.find((item: any) => item.type == type);\n          if (findItem && findItem.color) {\n            obj.color = findItem.color;\n          }\n          // 代码逻辑说明: [issues/613] LineMulti 在数据不对齐时，横坐标计算错误\n          let data = [];\n          xAxisData.forEach((x) => {\n            let dataArr = props.chartData.filter((item) => type === item.type && item.name == x);\n            if (dataArr && dataArr.length > 0) {\n              data.push(dataArr[0].value);\n            } else {\n              data.push(null);\n            }\n          });\n          //data数据\n          obj['data'] = data;\n          seriesData.push(obj);\n        });\n        option.series = seriesData;\n        option.xAxis.data = xAxisData;\n        console.log('option', option);\n        setOptions(option);\n        getInstance()?.off('click', onClick);\n        getInstance()?.on('click', onClick);\n      }\n\n      function onClick(params) {\n        emit('click', params);\n      }\n\n      return { chartRef };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/chart/Pie.vue",
    "content": "<template>\n  <div ref=\"chartRef\" :style=\"{ height, width }\"></div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, ref, Ref, watchEffect, reactive, watch } from 'vue';\n  import { useECharts } from '/@/hooks/web/useECharts';\n  import { cloneDeep } from 'lodash-es';\n  export default defineComponent({\n    name: 'Pie',\n    props: {\n      chartData: {\n        type: Array,\n        default: () => [],\n      },\n      size: {\n        type: Object,\n        default: () => {},\n      },\n      option: {\n        type: Object,\n        default: () => ({}),\n      },\n      width: {\n        type: String as PropType<string>,\n        default: '100%',\n      },\n      height: {\n        type: String as PropType<string>,\n        default: 'calc(100vh - 78px)',\n      },\n    },\n    emits: ['click'],\n    setup(props, { emit }) {\n      const chartRef = ref<HTMLDivElement | null>(null);\n      const { setOptions, getInstance, resize } = useECharts(chartRef as Ref<HTMLDivElement>);\n      const option = reactive({\n        tooltip: {\n          formatter: '{b} ({c})',\n        },\n        series: [\n          {\n            type: 'pie',\n            radius: '72%',\n            center: ['50%', '55%'],\n            data: [],\n            labelLine: { show: true },\n            label: {\n              show: true,\n              formatter: '{b} \\n ({d}%)',\n              color: '#B1B9D3',\n            },\n          },\n        ],\n      });\n\n      watchEffect(() => {\n        props.chartData && initCharts();\n      });\n      /**\n       * 监听拖拽大小变化\n       */\n      watch(\n        () => props.size,\n        () => {\n          resize();\n        },\n        {\n          immediate: true,\n        }\n      );\n      function initCharts() {\n        if (props.option) {\n          Object.assign(option, cloneDeep(props.option));\n        }\n        option.series[0].data = props.chartData;\n        setOptions(option);\n        resize();\n        getInstance()?.off('click', onClick);\n        getInstance()?.on('click', onClick);\n      }\n\n      function onClick(params) {\n        emit('click', params);\n      }\n\n      return { chartRef };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/chart/README.md",
    "content": "# 报表组件文档\n\n## 柱状图\n\n##### 引用方式\n\n```js\nimport Bar from '/@/components/chart/Bar.vue';\n```\n\n##### 参数列表\n\n| 参数名    | 类型   | 必填 | 说明       |\n| --------- | ------ | ---- | ---------- |\n| chartData | array  | ✔️   | 报表数据源 |\n| width     | number |      | 报表宽度   |\n| height    | number |      | 报表高度   |\n\n##### chartData 示例\n\n```json\n[\n  {\n    \"name\": \"1月\",\n    \"value\": 320\n  },\n  {\n    \"name\": \"2月\",\n    \"value\": 457\n  },\n  {\n    \"name\": \"3月\",\n    \"value\": 182\n  }\n]\n```\n\n##### 代码示例\n\n```html\n<template>\n  <Bar :chartData=\"chartData\"></Bar>\n</template>\n\n<script lang=\"ts\" setup>\n  import Bar from '/@/components/chart/Bar.vue';\n  const chartData = [\n    {\n      name: '1月',\n      value: 320,\n    },\n    {\n      name: '2月',\n      value: 457,\n    },\n    {\n      name: '3月',\n      value: 182,\n    },\n  ];\n</script>\n\n<style></style>\n```\n\n## 多列柱状图\n\n##### 引用方式\n\n```js\nimport BarMulti from '/@/components/chart/BarMulti.vue';\n```\n\n##### 参数列表\n\n| 参数名    | 类型   | 必填 | 说明       |\n| --------- | ------ | ---- | ---------- |\n| chartData | array  | ✔️   | 报表数据源 |\n| width     | number |      | 报表宽度   |\n| height    | number |      | 报表高度   |\n\n##### chartData 示例\n\n```json\n[\n  {\n    \"name\": \"1月\",\n    \"value\": 320,\n    \"type\": \"2021\"\n  },\n  {\n    \"name\": \"2月\",\n    \"value\": 457,\n    \"type\": \"2021\"\n  },\n  {\n    \"name\": \"3月\",\n    \"value\": 182,\n    \"type\": \"2021\"\n  },\n  {\n    \"name\": \"1月\",\n    \"value\": 240,\n    \"type\": \"2022\"\n  },\n  {\n    \"name\": \"2月\",\n    \"value\": 357,\n    \"type\": \"2022\"\n  },\n  {\n    \"name\": \"3月\",\n    \"value\": 456,\n    \"type\": \"2022\"\n  }\n]\n```\n\n## 迷你柱状图\n\n同柱形图，修改配置即可\n\n## 面积图\n\n##### 引用方式\n\n```js\nimport Line from '/@/components/chart/Line.vue';\n```\n\n##### 参数列表\n\n| 参数名    | 类型   | 必填 | 说明       |\n| --------- | ------ | ---- | ---------- |\n| chartData | array  | ✔️   | 报表数据源 |\n| width     | number |      | 报表宽度   |\n| height    | number |      | 报表高度   |\n| option    | object |      | 配置项     |\n\n##### chartData 示例\n\n```json\n[\n  {\n    \"name\": \"1月\",\n    \"value\": 320\n  },\n  {\n    \"name\": \"2月\",\n    \"value\": 457\n  },\n  {\n    \"name\": \"3月\",\n    \"value\": 182\n  }\n]\n```\n\n## 多行折线图\n\n##### 引用方式\n\n```js\nimport LineMulti from '/@/components/chart/LineMulti.vue';\n```\n\n##### 参数列表\n\n| 参数名    | 类型   | 必填 | 说明       |\n| --------- | ------ | ---- | ---------- |\n| chartData | array  | ✔️   | 报表数据源 |\n| width     | number |      | 报表宽度   |\n| height    | number |      | 报表高度   |\n| option    | object |      | 配置项     |\n\n##### chartData 示例\n\n同柱形图\n\n## 饼状图\n\n##### 引用方式\n\n```js\nimport Pie from '/@/components/chart/Pie';\n```\n\n##### 参数列表\n\n| 参数名    | 类型   | 必填 | 说明       |\n| --------- | ------ | ---- | ---------- |\n| chartData | array  | ✔️   | 报表数据源 |\n| width     | number |      | 报表宽度   |\n| height    | number |      | 报表高度   |\n| option    | object |      | 配置项     |\n\n##### chartData 示例\n\n```json\n[\n  { \"name\": \"一月\", \"value\": 40 },\n  { \"name\": \"二月\", \"value\": 21 },\n  { \"name\": \"三月\", \"value\": 17 },\n  { \"name\": \"四月\", \"value\": 13 },\n  { \"name\": \"五月\", \"value\": 9 }\n]\n```\n\n## 雷达图\n\n##### 引用方式\n\n```js\nimport Radar from '/@/components/chart/Radar';\n```\n\n##### 参数列表\n\n| 参数名    | 类型   | 必填 | 说明       |\n| --------- | ------ | ---- | ---------- |\n| chartData | array  | ✔️   | 报表数据源 |\n| width     | number |      | 报表宽度   |\n| height    | number |      | 报表高度   |\n| option    | object |      | 配置项     |\n\n##### chartData 示例\n\n```json\n[\n  { \"item\": \"一月\", \"score\": 40 },\n  { \"item\": \"二月\", \"score\": 20 },\n  { \"item\": \"三月\", \"score\": 67 },\n  { \"item\": \"四月\", \"score\": 43 },\n  { \"item\": \"五月\", \"score\": 90 }\n]\n```\n\n## 仪表盘\n\n##### 引用方式\n\n```js\nimport Gauge from '/@/components/chart/Gauge';\n```\n\n##### 参数列表\n\n| 参数名    | 类型   | 必填 | 说明       |\n| --------- | ------ | ---- | ---------- |\n| chartData | array  | ✔️   | 报表数据源 |\n| width     | number |      | 报表宽度   |\n| height    | number |      | 报表高度   |\n| option    | object |      | 配置项     |\n\n## 排名列表\n\n##### 引用方式\n\n```js\nimport RankList from '@/components/chart/RankList';\n```\n\n##### 参数列表\n\n| 参数名 | 类型   | 必填 | 说明                     |\n| ------ | ------ | ---- | ------------------------ |\n| title  | string |      | 报表标题                 |\n| list   | array  |      | 排名列表数据             |\n| height | number |      | 报表高度，默认自适应高度 |\n\n##### list 示例\n\n```json\n[\n  { \"name\": \"北京朝阳 1 号店\", \"total\": 1981 },\n  { \"name\": \"北京朝阳 2 号店\", \"total\": 1359 },\n  { \"name\": \"北京朝阳 3 号店\", \"total\": 1354 },\n  { \"name\": \"北京朝阳 4 号店\", \"total\": 263 },\n  { \"name\": \"北京朝阳 5 号店\", \"total\": 446 },\n  { \"name\": \"北京朝阳 6 号店\", \"total\": 796 }\n]\n```\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/chart/Radar.vue",
    "content": "<template>\n  <div ref=\"chartRef\" :style=\"{ height, width }\"></div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, ref, Ref, reactive, watchEffect } from 'vue';\n  import { useECharts } from '/@/hooks/web/useECharts';\n  import { cloneDeep } from 'lodash-es';\n  export default defineComponent({\n    name: 'Radar',\n    props: {\n      chartData: {\n        type: Array,\n        default: () => [],\n      },\n      option: {\n        type: Object,\n        default: () => ({}),\n      },\n      width: {\n        type: String as PropType<string>,\n        default: '100%',\n      },\n      height: {\n        type: String as PropType<string>,\n        default: 'calc(100vh - 78px)',\n      },\n    },\n    setup(props) {\n      const chartRef = ref<HTMLDivElement | null>(null);\n      const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);\n      const option = reactive({\n        title: {\n          text: '',\n          // text: '基础雷达图',\n        },\n        legend: {\n          data: ['文综'],\n        },\n        radar: {\n          indicator: [{ name: '历史' }, { name: '地理' }, { name: '生物' }, { name: '化学' }, { name: '物理' }, { name: '政治' }],\n        },\n        series: [\n          {\n            type: 'radar' as 'custom',\n            data: [\n              {\n                value: [82, 70, 60, 55, 90, 66],\n                name: '文综',\n              },\n            ],\n          },\n        ],\n      });\n\n      watchEffect(() => {\n        props.chartData && initCharts();\n      });\n\n      function initCharts() {\n        if (props.option) {\n          Object.assign(option, cloneDeep(props.option));\n        }\n        //图例类型\n        let typeArr = Array.from(new Set(props.chartData.map((item) => item.type)));\n        //雷达数据\n        let indicator = Array.from(\n          new Set(\n            props.chartData.map((item) => {\n              let { name, max } = item;\n              return { name, max };\n            })\n          )\n        );\n\n        let data = [];\n        typeArr.forEach((type) => {\n          let obj = { name: type };\n          let chartArr = props.chartData.filter((item) => type === item.type);\n          obj['value'] = chartArr.map((item) => item.value);\n          //data数据\n          data.push(obj);\n        });\n        option.legend.data = typeArr;\n        // option.radar.axisName = indicator;\n        option.radar.indicator = indicator;\n        option.series[0]['data'] = data;\n        setOptions(option);\n      }\n      return { chartRef };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/chart/RankList.vue",
    "content": "<template>\n  <div class=\"rank\">\n    <h4 class=\"title\">{{ title }}</h4>\n    <ul class=\"list\" :style=\"{ height: height ? `${height}px` : 'auto', overflow: 'auto' }\">\n      <li :key=\"index\" v-for=\"(item, index) in list\">\n        <span :class=\"index < 3 ? 'active' : null\">{{ index + 1 }}</span>\n        <span>{{ item.name }}</span>\n        <span>{{ item.total }}</span>\n      </li>\n    </ul>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  export default defineComponent({\n    name: 'RankList',\n    props: {\n      title: {\n        type: String,\n        default: '',\n      },\n      list: {\n        type: Array,\n        default: null,\n      },\n      height: {\n        type: Number,\n        default: null,\n      },\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .rank {\n    padding: 0 32px 32px 72px;\n\n    .list {\n      margin: 25px 0 0;\n      padding: 0;\n      list-style: none;\n\n      li {\n        margin-top: 16px;\n\n        span {\n          font-size: 14px;\n          line-height: 22px;\n\n          &:first-child {\n            background-color: #f5f5f5;\n            color: rgba(0, 0, 0, 0.65);\n            border-radius: 20px;\n            display: inline-block;\n            font-size: 12px;\n            font-weight: 600;\n            margin-right: 24px;\n            height: 20px;\n            line-height: 20px;\n            width: 20px;\n            text-align: center;\n          }\n          &.active {\n            background-color: #314659;\n            color: #fff;\n          }\n          &:last-child {\n            float: right;\n          }\n        }\n      }\n    }\n  }\n\n  .mobile .rank {\n    padding: 0 32px 32px 32px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/chart/SingleLine.vue",
    "content": "<template>\n  <div ref=\"chartRef\" :style=\"{ height, width }\"></div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, ref, Ref, reactive, watchEffect } from 'vue';\n  import { useECharts } from '/@/hooks/web/useECharts';\n  import { cloneDeep } from 'lodash-es';\n  export default defineComponent({\n    name: 'single-line',\n    props: {\n      chartData: {\n        type: Array,\n        default: () => [],\n      },\n      option: {\n        type: Object,\n        default: () => ({}),\n      },\n      width: {\n        type: String as PropType<string>,\n        default: '100%',\n      },\n      height: {\n        type: String as PropType<string>,\n        default: 'calc(100vh - 78px)',\n      },\n      // 代码逻辑说明: 【QQYUN-8762】首页默认及echars颜色调整\n      seriesColor: {\n        type: String,\n        default: '#1890ff',\n      },\n    },\n    setup(props) {\n      const chartRef = ref<HTMLDivElement | null>(null);\n      const { setOptions, echarts } = useECharts(chartRef as Ref<HTMLDivElement>);\n      const option = reactive({\n        tooltip: {\n          trigger: 'axis',\n          axisPointer: {\n            type: 'shadow',\n            label: {\n              show: true,\n              backgroundColor: '#333',\n            },\n          },\n        },\n        xAxis: {\n          type: 'category',\n          data: [],\n        },\n        yAxis: {\n          type: 'value',\n        },\n        series: [\n          {\n            type: 'line',\n            showSymbol: false,\n            smooth: true,\n            areaStyle: {},\n            data: [],\n            color: props.seriesColor,\n          },\n        ],\n      });\n\n      watchEffect(() => {\n        props.chartData && initCharts();\n      });\n      \n      function initCharts() {\n        if (props.option) {\n          Object.assign(option, cloneDeep(props.option));\n        }\n        let seriesData = props.chartData.map((item) => {\n          return item.value;\n        });\n        let xAxisData = props.chartData.map((item) => {\n          return item.name;\n        });\n        option.series[0].data = seriesData;\n        // 代码逻辑说明: 【QQYUN-8762】首页默认及echars颜色调整\n        option.series[0].color = props.seriesColor;\n        option.xAxis.data = xAxisData;\n        setOptions(option);\n      }\n      return { chartRef };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/chart/StackBar.vue",
    "content": "<template>\n  <div ref=\"chartRef\" :style=\"{ height, width }\"></div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, ref, Ref, reactive, watchEffect, watch } from 'vue';\n  import { useECharts } from '/@/hooks/web/useECharts';\n  import { cloneDeep } from 'lodash-es';\n  export default defineComponent({\n    name: 'StackBar',\n    props: {\n      chartData: {\n        type: Array,\n        default: () => [],\n        required: true,\n      },\n      size: {\n        type: Object,\n        default: () => {},\n      },\n      option: {\n        type: Object,\n        default: () => ({}),\n      },\n      type: {\n        type: String as PropType<string>,\n        default: 'bar',\n      },\n      width: {\n        type: String as PropType<string>,\n        default: '100%',\n      },\n      height: {\n        type: String as PropType<string>,\n        default: 'calc(100vh - 78px)',\n      },\n    },\n    setup(props) {\n      const chartRef = ref<HTMLDivElement | null>(null);\n      const { setOptions, echarts, resize } = useECharts(chartRef as Ref<HTMLDivElement>);\n      const option = reactive({\n        tooltip: {\n          trigger: 'axis',\n          axisPointer: {\n            type: 'shadow',\n            label: {\n              show: true,\n              backgroundColor: '#333',\n            },\n          },\n        },\n        legend: {\n          top: 30,\n        },\n        grid: {\n          top: 60,\n        },\n        xAxis: {\n          type: 'value',\n        },\n        yAxis: {\n          type: 'category',\n          data: [],\n        },\n        series: [],\n      });\n\n      watchEffect(() => {\n        props.chartData && initCharts();\n      });\n      /**\n       * 监听拖拽大小变化\n       */\n      watch(\n        () => props.size,\n        () => {\n          console.log('props.size', props.size);\n          resize();\n        },\n        {\n          immediate: true,\n        }\n      );\n      function initCharts() {\n        if (props.option) {\n          Object.assign(option, cloneDeep(props.option));\n        }\n        //图例类型\n        let typeArr = Array.from(new Set(props.chartData.map((item) => item.type)));\n        //轴数据\n        let yAxisData = Array.from(new Set(props.chartData.map((item) => item.name)));\n        let seriesData = [];\n        typeArr.forEach((type) => {\n          let obj = { name: type, type: props.type, stack: 'total' };\n          let chartArr = props.chartData.filter((item) => type === item.type);\n          //data数据\n          obj['data'] = chartArr.map((item) => item.value);\n          seriesData.push(obj);\n        });\n        option.series = seriesData;\n        option.yAxis.data = yAxisData;\n        setOptions(option);\n      }\n\n      return { chartRef };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/chart/Trend.vue",
    "content": "<template>\n  <div class=\"chart-trend\">\n    {{ term }}\n    <span>{{ rate }}%</span>\n    <span :class=\"['trend-icon', trend]\"><Icon :icon=\"'ant-design:caret-' + trend + '-outlined'\" /></span>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, computed } from 'vue';\n\n  export default defineComponent({\n    name: 'Trend',\n    props: {\n      // 同title\n      term: {\n        type: String,\n        default: '',\n        required: true,\n      },\n      // 百分比\n      percentage: {\n        type: Number,\n        default: null,\n      },\n      type: {\n        type: Boolean,\n        default: null,\n      },\n      target: {\n        type: Number,\n        default: 0,\n      },\n      value: {\n        type: Number,\n        default: 0,\n      },\n      fixed: {\n        type: Number,\n        default: 2,\n      },\n    },\n    setup(props) {\n      const trend = computed(() => {\n        let type = props.type === null ? props.value >= props.target : props.type;\n        return type ? 'up' : 'down';\n      });\n      const rate = computed(() =>\n        (props.percentage === null ? (Math.abs(props.value - props.target) * 100) / props.target : props.percentage).toFixed(props.fixed)\n      );\n      return {\n        trend,\n        rate,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .chart-trend {\n    display: inline-block;\n    font-size: 14px;\n    line-height: 22px;\n\n    .trend-icon {\n      font-size: 12px;\n\n      &.up,\n      &.down {\n        margin-left: 4px;\n        position: relative;\n        top: 1px;\n\n        i {\n          font-size: 12px;\n          transform: scale(0.83);\n        }\n      }\n\n      &.up {\n        color: #f5222d;\n      }\n\n      &.down {\n        color: #52c41a;\n        top: -1px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/AIcon.vue",
    "content": "<template>\n  <Icon :icon=\"icon\" :size=\"size\"></Icon>\n</template>\n\n<script lang=\"ts\">\n  import { computed, defineComponent } from 'vue';\n  import { Icon } from '/@/components/Icon';\n  import { isEmpty } from '/@/utils/is';\n  import { propTypes } from '/@/utils/propTypes';\n\n  export default defineComponent({\n    name: 'AIcon',\n    components: { Icon },\n    props: {\n      icon: String,\n      type: String,\n      // 图标大小，默认 16\n      size: propTypes.any,\n      // 样式\n      theme: propTypes.any,\n    },\n    setup(props) {\n      const icon = computed(() => {\n        if (props.icon && !isEmpty(props.icon)) {\n          return props.icon;\n        }\n        let iconTheme = props.theme ? `-${props.theme}` : '';\n        return `ant-design:${props.type}${iconTheme}`;\n      });\n\n      return {\n        icon,\n      };\n    },\n  });\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/ExcelButton.vue",
    "content": "<template>\n  <a-button type=\"primary\" v-if=\"hasExportAuth() && config.export\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls()\"> 导出</a-button>\n  <a-upload name=\"file\" :showUploadList=\"false\" v-if=\"hasImportAuth() && config.import\" :customRequest=\"(file) => onImportXls(file)\">\n    <a-button type=\"primary\" preIcon=\"ant-design:import-outlined\">导入</a-button>\n  </a-upload>\n</template>\n\n<script lang=\"ts\" setup name=\"ExcelButton\">\n  import { PropType } from 'vue';\n  import { usePermission } from '/@/hooks/web/usePermission';\n  import { useMethods } from '/@/hooks/system/useMethods';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  // 定义 excel 方法所需参数\n  interface ExcelConfig {\n    // 导出配置\n    exportConfig: {\n      url: string;\n      // 导出文件名\n      name?: string | (() => string);\n      //按钮权限\n      auth?: string | string[];\n    };\n    // 导入配置\n    importConfig: {\n      url: string;\n      // 导出成功后的回调\n      success?: (fileInfo?: any) => void;\n      //按钮权限\n      auth?: string | string[];\n    };\n  }\n  /**\n   * 定义组件参数\n   */\n  const props = defineProps({\n    config: {\n      type: Object as PropType<ExcelConfig>,\n      default: null,\n    },\n  });\n  //按钮权限问题\n  const { hasPermission } = usePermission();\n  //导入导出方法\n  const { handleExportXls, handleImportXls } = useMethods();\n\n  const $message = useMessage();\n  // 导出 excel\n  function onExportXls() {\n    let { url, name } = props.config?.export ?? {};\n    if (url) {\n      let title = typeof name === 'function' ? name() : name;\n      return handleExportXls(title as string, url);\n    } else {\n      $message.createMessage.warn('没有传递 export.url 参数');\n      return Promise.reject();\n    }\n  }\n\n  // 导入 excel\n  function onImportXls(file) {\n    let { url, success } = props.config?.import ?? {};\n    if (url) {\n      return handleImportXls(file, url, success);\n    } else {\n      $message.createMessage.warn('没有传递 import.url 参数');\n      return Promise.reject();\n    }\n  }\n\n  // 导入按钮权限\n  function hasImportAuth() {\n    let auth = props.config?.import?.auth;\n    return auth && auth.length > 0 ? hasPermission(auth) : true;\n  }\n\n  // 导出按钮权限\n  function hasExportAuth() {\n    let auth = props.config?.export?.auth;\n    return auth && auth.length > 0 ? hasPermission(auth) : true;\n  }\n</script>\n\n<style scoped lang=\"less\"></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JPrompt/JPrompt.vue",
    "content": "<template>\n  <ConfigProvider :locale=\"getAntdLocale\">\n    <Modal v-bind=\"getProps\">\n      <Spin :spinning=\"loading\">\n        <div class=\"j-prompt-content-body\">\n          <div v-html=\"options.content\" style=\"margin-bottom: 8px\"></div>\n          <BasicForm @register=\"registerForm\">\n            <template #customInput=\"{ model, field }\">\n              <Input ref=\"inputRef\" v-model:value=\"model[field]\" :placeholder=\"placeholder\" @pressEnter=\"onSubmit\" @input=\"onChange\" />\n            </template>\n          </BasicForm>\n        </div>\n      </Spin>\n    </Modal>\n  </ConfigProvider>\n</template>\n\n<script lang=\"ts\">\n  import type { JPromptProps } from './typing';\n  import type { ModalProps } from '/@/components/Modal';\n  import { ref, defineComponent, computed, unref, onMounted, nextTick } from 'vue';\n  import { BasicForm, useForm } from '/@/components/Form';\n  import { Modal, Spin, Input, ConfigProvider } from 'ant-design-vue';\n  import { useLocale } from '/@/locales/useLocale';\n\n  export default defineComponent({\n    name: 'JPrompt',\n    components: {\n      Modal,\n      Spin,\n      Input,\n      BasicForm,\n      ConfigProvider,\n    },\n    emits: ['register'],\n    setup(props, { emit }) {\n      const inputRef = ref();\n      const { getAntdLocale } = useLocale();\n      const visible = ref(false);\n      // 当前是否正在加载中\n      const loading = ref(false);\n      const options = ref<JPromptProps>({});\n      const placeholder = computed(() => options.value.placeholder ?? '请输入内容');\n      // 注册表单\n      const [registerForm, { clearValidate, setFieldsValue, validate, updateSchema }] = useForm({\n        compact: true,\n        wrapperCol: { span: 24 },\n        schemas: [\n          {\n            label: '',\n            field: 'input',\n            component: 'Input',\n            slot: 'customInput',\n          },\n        ],\n        showActionButtonGroup: false,\n      });\n\n      // 弹窗最终props\n      const getProps = computed(() => {\n        let opt = options.value;\n        let modalProps: Partial<ModalProps> = {\n          width: (opt.width ?? 500) as number,\n          title: (opt.title ?? 'prompt') as string,\n          open: unref(visible),\n          confirmLoading: unref(loading),\n        };\n        let finalProps: Recordable = {\n          ...modalProps,\n          ...props,\n          ...opt,\n          onOk: onSubmit,\n          onCancel() {\n            if (typeof options.value.onCancel === 'function') {\n              options.value.onCancel();\n            }\n            close();\n          },\n        };\n        return finalProps;\n      });\n\n      onMounted(() => {\n        emit('register', {\n          openModal,\n          setLoading,\n          getVisible: visible,\n        });\n      });\n\n      /** 弹窗开启 */\n      async function openModal(opt: any) {\n        document.body.focus();\n\n        options.value = opt;\n        visible.value = true;\n        await nextTick();\n        await updateSchema({\n          field: 'input',\n          required: options.value.required,\n          rules: options.value.rules,\n          dynamicRules: options.value.dynamicRules,\n        } as any);\n        await setFieldsValue({\n          input: options.value.defaultValue ?? '',\n        });\n        await clearValidate();\n        inputRef.value?.focus();\n      }\n\n      /** 弹窗关闭 */\n      function close() {\n        visible.value = false;\n      }\n\n      function onChange() {\n        validate()\n      }\n\n      /** 提交表单 */\n      async function onSubmit() {\n        try {\n          const { onOk } = options.value;\n          // 表单验证\n          let values = await validate();\n          setLoading(true);\n          if (typeof onOk === 'function') {\n            let flag = await onOk(values.input);\n            // 只有返回 false 才阻止关闭弹窗\n            if (!(flag === false)) {\n              close();\n            }\n          } else {\n            close();\n          }\n        } finally {\n          setLoading(false);\n        }\n      }\n\n      /** 设置加载状态*/\n      function setLoading(flag) {\n        loading.value = flag;\n      }\n\n      return {\n        inputRef,\n        getProps,\n        loading,\n        options,\n        placeholder,\n        getAntdLocale,\n        onChange,\n        onSubmit,\n\n        registerForm,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\">\n.j-prompt-content-body {\n  padding: 20px;\n\n  .ant-form-item-control-input-content {\n    & > div {\n      width: 100%;\n\n      & > .j-form-item-middleware {\n        width: 100%;\n      }\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JPrompt/hooks/useJPrompt.ts",
    "content": "import type { JPromptProps } from '../typing';\nimport { render, createVNode, nextTick } from 'vue';\nimport { error } from '/@/utils/log';\nimport { getAppContext } from \"@/store\";\nimport JPrompt from '../JPrompt.vue';\n\nexport function useJPrompt() {\n\n  function createJPrompt(options: JPromptProps) {\n    let instance = null;\n    const box = document.createElement('div');\n    const vm = createVNode(JPrompt, {\n      // 注册\n      async onRegister(ins) {\n        instance = ins;\n        await nextTick();\n        ins.openModal(options);\n      },\n      // 销毁\n      afterClose() {\n        render(null, box);\n        document.body.removeChild(box);\n      },\n    });\n    vm.appContext = getAppContext()!;\n    // 挂载到 body\n    render(vm, box);\n    document.body.appendChild(box);\n\n    function getInstance(): any {\n      if (instance == null) {\n        error('useJPrompt instance is undefined!');\n      }\n      return instance;\n    }\n\n    function updateModal(options: JPromptProps) {\n      getInstance()?.updateModal(options);\n    }\n\n    function closeModal() {\n      getInstance()?.closeModal();\n    }\n\n    function setLoading(loading) {\n      getInstance()?.setLoading(loading);\n    }\n\n    return {\n      closeModal,\n      updateModal,\n      setLoading,\n    };\n  }\n\n  return {\n    createJPrompt,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JPrompt/index.ts",
    "content": "export { useJPrompt } from './hooks/useJPrompt';\nexport { default as JPrompt } from './JPrompt.vue';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JPrompt/typing.ts",
    "content": "import { ModalOptionsPartial } from '/@/hooks/web/useMessage';\nimport { RenderCallbackParams, Rule } from '/@/components/Form';\n\nexport interface JPromptProps extends ModalOptionsPartial {\n  // 输入框是否必填\n  required?: boolean;\n  // 校验\n  rules?: Rule[];\n  // 动态校验\n  dynamicRules?: (renderCallbackParams: RenderCallbackParams) => Rule[];\n  // 占位字符\n  placeholder?: string;\n  // 输入框默认值\n  defaultValue?: string;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/hooks.ts",
    "content": "export { useJVxeCompProps, useJVxeComponent } from './src/hooks/useJVxeComponent';\nexport { useResolveComponent } from './src/hooks/useData';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/index.ts",
    "content": "export { default as JVxeTable } from './src/JVxeTable';\nexport { registerJVxeTable } from './src/install';\nexport { deleteComponent } from './src/componentMap';\nexport { registerComponent, registerAsyncComponent, registerASyncComponentReal } from './src/utils/registerUtils';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/JVxeTable.ts",
    "content": "import { defineComponent, h, nextTick, ref, useSlots } from 'vue';\nimport { vxeEmits, vxeProps } from './vxe.data';\nimport { useData, useRefs, useResolveComponent as rc } from './hooks/useData';\nimport { useColumns } from './hooks/useColumns';\nimport { useColumnsCache } from './hooks/useColumnsCache';\nimport { useMethods } from './hooks/useMethods';\nimport { useDataSource } from './hooks/useDataSource';\nimport { useDragSort } from './hooks/useDragSort';\nimport { useRenderComponents } from './hooks/useRenderComponents';\nimport { useFinallyProps } from './hooks/useFinallyProps';\nimport { JVxeTableProps } from './types';\nimport './style/index.less';\n\nexport default defineComponent({\n  name: 'JVxeTable',\n  inheritAttrs: false,\n  props: vxeProps(),\n  emits: [...vxeEmits],\n  setup(props: JVxeTableProps, context) {\n    const instanceRef = ref();\n    const refs = useRefs();\n    const slots = useSlots();\n    const data = useData(props);\n    const { methods, publicMethods, created } = useMethods(props, context, data, refs, instanceRef);\n    created();\n    useColumns(props, data, methods, slots);\n    useDataSource(props, data, methods, refs);\n    useDragSort(props, methods);\n    // 代码逻辑说明: 【QQYUN-8566】JVXETable无法记住列设置\n    const { initSetting } = useColumnsCache({ cacheColumnsKey: props.cacheColumnsKey });\n    initSetting(props);\n    // 最终传入到 template 里的 props\n    const finallyProps = useFinallyProps(props, data, methods);\n    // 渲染子组件\n    const renderComponents = useRenderComponents(props, data, methods, slots);\n    return {\n      instanceRef,\n      ...refs,\n      ...publicMethods,\n      ...finallyProps,\n      ...renderComponents,\n      vxeDataSource: data.vxeDataSource,\n    };\n  },\n  render() {\n    return h(\n      'div',\n      {\n        class: this.$attrs.class,\n        style: this.$attrs.style,\n      },\n      h(\n        rc('a-spin'),\n        {\n          spinning: this.loading,\n          wrapperClassName: this.prefixCls,\n        },\n        {\n          default: () => [\n            this.renderSubPopover(),\n            this.renderToolbar(),\n            this.renderToolbarAfterSlot(),\n            h(\n              rc('vxe-grid'),\n              {\n                ...this.vxeProps,\n                data: this.vxeDataSource,\n              },\n              this.$slots\n            ),\n            this.renderPagination(),\n            this.renderDetailsModal(),\n          ],\n        }\n      )\n    );\n  },\n  created() {\n    this.instanceRef = this;\n  },\n});\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/componentMap.ts",
    "content": "import type { JVxeVueComponent } from './types';\nimport { JVxeTypes } from './types/JVxeTypes';\n\nimport JVxeSlotCell from './components/cells/JVxeSlotCell';\nimport JVxeNormalCell from './components/cells/JVxeNormalCell.vue';\nimport JVxeDragSortCell from './components/cells/JVxeDragSortCell.vue';\n\nimport JVxeInputCell from './components/cells/JVxeInputCell.vue';\nimport JVxeDateCell from './components/cells/JVxeDateCell.vue';\nimport JVxeTimeCell from './components/cells/JVxeTimeCell.vue';\nimport JVxeSelectCell from './components/cells/JVxeSelectCell.vue';\nimport JVxeRadioCell from './components/cells/JVxeRadioCell.vue';\nimport JVxeCheckboxCell from './components/cells/JVxeCheckboxCell.vue';\nimport JVxeUploadCell from './components/cells/JVxeUploadCell.vue';\n// import { TagsInputCell, TagsSpanCell } from './components/cells/JVxeTagsCell.vue'\nimport JVxeProgressCell from './components/cells/JVxeProgressCell.vue';\nimport JVxeTextareaCell from './components/cells/JVxeTextareaCell.vue';\n// import JVxeDepartSelectCell from './components/cells/JVxeDepartSelectCell.vue'\n// import JVxeUserSelectCell from './components/cells/JVxeUserSelectCell.vue'\n\nlet componentMap = new Map<JVxeTypes | string, JVxeVueComponent>();\n// 代码逻辑说明: 【issues/860】生成的一对多代码，热更新之后点击新增卡死[暂时先解决]\nconst JVxeComponents = 'JVxeComponents__';\nif (import.meta.env.DEV && componentMap.size === 0 && window[JVxeComponents] && window[JVxeComponents].size > 0) {\n  componentMap = window[JVxeComponents];\n}\n/** span 组件结尾 */\nexport const spanEnds: string = ':span';\n\n/** 定义不能用于注册的关键字 */\nexport const excludeKeywords: Array<JVxeTypes> = [\n  JVxeTypes.hidden,\n  JVxeTypes.rowNumber,\n  JVxeTypes.rowCheckbox,\n  JVxeTypes.rowRadio,\n  JVxeTypes.rowExpand,\n];\n\n/**\n * 注册组件\n *\n * @param type 组件 type\n * @param component Vue组件\n * @param spanComponent 显示组件，可空，默认为 JVxeNormalCell 组件\n */\nexport function addComponent(type: JVxeTypes, component: JVxeVueComponent, spanComponent?: JVxeVueComponent) {\n  if (excludeKeywords.includes(type)) {\n    throw new Error(`【addComponent】不能使用\"${type}\"作为组件的name，因为这是关键字。`);\n  }\n  if (componentMap.has(type)) {\n    throw new Error(`【addComponent】组件\"${type}\"已存在`);\n  }\n  componentMap.set(type, component);\n  if (spanComponent) {\n    componentMap.set(type + spanEnds, spanComponent);\n  }\n  // 代码逻辑说明: 【issues/860】生成的一对多代码，热更新之后点击新增卡死[暂时先解决]\n  import.meta.env.DEV && (window[JVxeComponents] = componentMap);\n}\n\nexport function deleteComponent(type: JVxeTypes) {\n  componentMap.delete(type);\n  componentMap.delete(type + spanEnds);\n  // 代码逻辑说明: 【issues/860】生成的一对多代码，热更新之后点击新增卡死[暂时先解决]\n  import.meta.env.DEV && (window[JVxeComponents] = componentMap);\n}\n\n/** 定义内置自定义组件 */\nexport function definedComponent() {\n  addComponent(JVxeTypes.slot, JVxeSlotCell);\n  addComponent(JVxeTypes.normal, JVxeNormalCell);\n  addComponent(JVxeTypes.rowDragSort, JVxeDragSortCell);\n\n  addComponent(JVxeTypes.input, JVxeInputCell);\n  addComponent(JVxeTypes.inputNumber, JVxeInputCell);\n  addComponent(JVxeTypes.radio, JVxeRadioCell);\n  addComponent(JVxeTypes.checkbox, JVxeCheckboxCell);\n  addComponent(JVxeTypes.select, JVxeSelectCell);\n  addComponent(JVxeTypes.selectSearch, JVxeSelectCell); // 下拉搜索\n  addComponent(JVxeTypes.selectMultiple, JVxeSelectCell); // 下拉多选\n  addComponent(JVxeTypes.date, JVxeDateCell);\n  addComponent(JVxeTypes.datetime, JVxeDateCell);\n  addComponent(JVxeTypes.time, JVxeTimeCell);\n  addComponent(JVxeTypes.upload, JVxeUploadCell);\n  addComponent(JVxeTypes.textarea, JVxeTextareaCell);\n\n  // addComponent(JVxeTypes.tags, TagsInputCell, TagsSpanCell)\n  addComponent(JVxeTypes.progress, JVxeProgressCell);\n\n  // addComponent(JVxeTypes.departSelect, JVxeDepartSelectCell)\n  // addComponent(JVxeTypes.userSelect, JVxeUserSelectCell)\n}\n\n/**\n * 清空注册的组件\n */\nexport function clearComponent() {\n  componentMap.clear();\n\n  // 代码逻辑说明: 【issues/860】生成的一对多代码，热更新之后点击新增卡死[暂时先解决]\n  import.meta.env.DEV && (window[JVxeComponents] = componentMap);\n}\n\nexport { componentMap };\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/components/JVxeDetailsModal.vue",
    "content": "<template>\n  <BasicModal @register=\"registerModel\" title=\"详细信息\" :width=\"1200\" :keyboard=\"true\" @ok=\"handleOk\" @cancel=\"close\">\n    <transition name=\"fade\">\n      <div v-if=\"getVisible\">\n        <slot name=\"mainForm\" :row=\"row\" :column=\"column\" />\n      </div>\n    </transition>\n  </BasicModal>\n</template>\n<script lang=\"ts\">\n  import { ref, defineComponent } from 'vue';\n  import { cloneDeep } from 'lodash-es';\n  import { useModal } from '/@/components/Modal/src/hooks/useModal';\n  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n\n  export default defineComponent({\n    components: {\n      BasicModal: createAsyncComponent(() => import('/@/components/Modal/src/BasicModal.vue'), {\n        loading: true,\n      }),\n    },\n    props: {\n      trigger: {\n        type: Function,\n        required: true,\n      },\n    },\n    setup(props) {\n      const row = ref(null);\n      const column = ref(null);\n\n      const [registerModel, { openModal, closeModal, getVisible }] = useModal();\n\n      function open(event) {\n        let { row: $row, column: $column } = event;\n        row.value = cloneDeep($row);\n        column.value = $column;\n        openModal();\n      }\n\n      function close() {\n        closeModal();\n      }\n\n      function handleOk() {\n        props.trigger('detailsConfirm', {\n          row: row.value,\n          column: column.value,\n          callback: (success) => {\n            success ? closeModal() : openModal();\n          },\n        });\n      }\n\n      return {\n        getVisible,\n        row,\n        column,\n        open,\n        close,\n        handleOk,\n        registerModel,\n      };\n    },\n  });\n</script>\n<style scoped lang=\"less\">\n  .fade-enter-active,\n  .fade-leave-active {\n    opacity: 1;\n    transition: opacity 0.5s;\n  }\n\n  .fade-enter,\n  .fade-leave-to {\n    opacity: 0;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/components/JVxeReloadEffect.ts",
    "content": "import { defineComponent, h, ref, watch } from 'vue';\nimport { randomString } from '/@/utils/common/compUtils';\nimport '../style/reload-effect.less';\n\n// 修改数据特效\nexport default defineComponent({\n  props: {\n    vNode: null,\n    // 是否启用特效\n    effect: Boolean,\n  },\n  emits: ['effectBegin', 'effectEnd'],\n  setup(props, { emit }) {\n    // vNode: null,\n    const innerEffect = ref(props.effect);\n    // 应付同时多个特效\n    const effectIdx = ref(0);\n    const effectList = ref<any[]>([]);\n\n    watch(\n      () => props.effect,\n      () => (innerEffect.value = props.effect)\n    );\n    watch(\n      () => props.vNode,\n      (_vNode, old) => {\n        if (props.effect && old != null) {\n          let topLayer = renderSpan(old, 'top');\n          effectList.value.push(topLayer);\n        }\n      },\n      { deep: true, immediate: true }\n    );\n\n    // 条件渲染内容 span\n    function renderVNode() {\n      if (props.vNode == null) {\n        return null;\n      }\n      let bottom = renderSpan(props.vNode, 'bottom');\n      // 启用了特效，并且有旧数据，就渲染特效顶层\n      if (innerEffect.value && effectList.value.length > 0) {\n        emit('effectBegin');\n        // 1.4s 以后关闭特效\n        window.setTimeout(() => {\n          let item = effectList.value[effectIdx.value];\n          if (item && item.elm) {\n            // 特效结束后，展示先把 display 设为 none，而不是直接删掉该元素，\n            // 目的是为了防止页面重新渲染，导致动画重置\n            item.elm.style.display = 'none';\n          }\n          // 当所有的层级动画都结束时，再删掉所有元素\n          if (++effectIdx.value === effectList.value.length) {\n            innerEffect.value = false;\n            effectIdx.value = 0;\n            effectList.value = [];\n            emit('effectEnd');\n          }\n        }, 1400);\n        return [effectList.value, bottom];\n      } else {\n        return bottom;\n      }\n    }\n\n    // 渲染内容 span\n    function renderSpan(vNode, layer) {\n      let options = {\n        key: layer + effectIdx.value + randomString(6),\n        class: ['j-vxe-reload-effect-span', `layer-${layer}`],\n        style: {},\n        // 代码逻辑说明: 【issues/1175】解决vxetable鼠标hover之后title显示不对的问题\n        title: vNode,\n\n      };\n      if (layer === 'top') {\n        // 最新渲染的在下面\n        options.style['z-index'] = 9999 - effectIdx.value;\n      }\n      return h('span', options, [vNode]);\n    }\n\n    return () =>\n      h(\n        'div',\n        {\n          class: ['j-vxe-reload-effect-box'],\n        },\n        [renderVNode()]\n      );\n  },\n});\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/components/JVxeSubPopover.vue",
    "content": "<template>\n  <a-popover :open=\"visible\" :placement=\"placement\" overlayClassName=\"j-vxe-popover-overlay\" :overlayStyle=\"overlayStyle\">\n    <template #title>\n      <div class=\"j-vxe-popover-title\">\n        <div>子表</div>\n        <div class=\"j-vxe-popover-title-close\" @click=\"close\">\n          <a-icon type=\"close\" />\n        </div>\n      </div>\n    </template>\n\n    <template #content>\n      <transition name=\"fade\">\n        <slot v-if=\"visible\" name=\"subForm\" :row=\"row\" :column=\"column\" />\n      </transition>\n    </template>\n\n    <div ref=\"divRef\" class=\"j-vxe-popover-div\"></div>\n  </a-popover>\n</template>\n<script lang=\"ts\">\n  import { ref, reactive, nextTick, defineComponent } from 'vue';\n  import domAlign from 'dom-align';\n  import { getParentNodeByTagName } from '../utils/vxeUtils';\n  import { triggerWindowResizeEvent } from '/@/utils/common/compUtils';\n  import { cloneDeep } from 'lodash-es';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { isString } from '/@/utils/is';\n\n  export default defineComponent({\n    name: 'JVxeSubPopover',\n    setup() {\n      const visible = ref(false);\n      const row = ref<any>(null);\n      const column = ref<any>(null);\n      const overlayStyle = reactive<{\n        width?: number | string;\n        maxWidth?: number | string;\n        zIndex: number;\n      }>({\n        zIndex: 100,\n      });\n      const placement = ref('bottom');\n      const divRef = ref<HTMLElement>();\n      const { createMessage } = useMessage();\n\n      function toggle(event) {\n        if (document.body.clientHeight - event.$event.clientY > 350) {\n          placement.value = 'bottom';\n        } else {\n          placement.value = 'top';\n        }\n        if (row.value == null) {\n          open(event);\n        } else {\n          row.value.id === event.row.id ? close() : reopen(event);\n        }\n      }\n\n      function open(event, level = 0) {\n        if (level > 3) {\n          createMessage.error('打开子表失败');\n          console.warn('【JVxeSubPopover】打开子表失败');\n          return;\n        }\n\n        let {\n          row: $row,\n          column: $column,\n          $table,\n          $event: { target },\n        } = event;\n        row.value = cloneDeep($row);\n        column.value = $column;\n\n        let className = target.className || '';\n        className = isString(className) ? className : className.toString();\n\n        // 获取 td 父级\n        let td = getParentNodeByTagName(target, 'td');\n        // 点击的是拖拽排序列，不做处理\n        if (td && td.querySelector('.j-vxe-drag-box')) {\n          return;\n        }\n        // 点击的是expand，不做处理\n        if (className.includes('vxe-table--expand-btn')) {\n          return;\n        }\n        // 点击的是checkbox，不做处理\n        if (className.includes('vxe-checkbox--icon') || className.includes('vxe-cell--checkbox')) {\n          return;\n        }\n        // 点击的是radio，不做处理\n        if (className.includes('vxe-radio--icon') || className.includes('vxe-cell--radio')) {\n          return;\n        }\n        let parentElem = $table.getParentElem();\n        let tr = getParentNodeByTagName(target, 'tr');\n        if (parentElem && tr) {\n          let clientWidth = parentElem.clientWidth;\n          let clientHeight = tr.clientHeight;\n          divRef.value!.style.width = clientWidth + 'px';\n          divRef.value!.style.height = clientHeight + 'px';\n          overlayStyle.width = Number.parseInt(`${clientWidth - clientWidth * 0.04}`) + 'px';\n          overlayStyle.maxWidth = overlayStyle.width;\n          //let realTable = getParentNodeByTagName(tr, 'table')\n          //let left = realTable.parentNode.scrollLeft\n          let h = event.$event.clientY;\n          if (h) {\n            h = h - 140;\n          }\n          let toolbar = divRef.value!.nextElementSibling;\n          domAlign(divRef.value, toolbar, {\n            points: ['tl', 'tl'],\n            offset: [0, h],\n            overflow: {\n              alwaysByViewport: true,\n            },\n          });\n          nextTick(() => {\n            visible.value = true;\n            nextTick(() => {\n              triggerWindowResizeEvent();\n            });\n          });\n        } else {\n          let num = ++level;\n          console.warn('【JVxeSubPopover】table or tr 获取失败，正在进行第 ' + num + '次重试', {\n            event,\n            table: parentElem,\n            tr,\n          });\n          window.setTimeout(() => open(event, num), 100);\n        }\n      }\n\n      function close() {\n        if (visible.value) {\n          row.value = null;\n          visible.value = false;\n        }\n      }\n\n      function reopen(event) {\n        open(event);\n      }\n\n      return {\n        divRef,\n        row,\n        column,\n        visible,\n        placement,\n        overlayStyle,\n        close,\n        toggle,\n      };\n    },\n  });\n</script>\n<style scoped lang=\"less\">\n  .j-vxe-popover-title {\n    .j-vxe-popover-title-close {\n      position: absolute;\n      right: 0;\n      top: 0;\n      width: 31px;\n      height: 31px;\n      text-align: center;\n      line-height: 31px;\n      color: rgba(0, 0, 0, 0.45);\n      cursor: pointer;\n      transition: color 300ms;\n\n      &:hover {\n        color: rgba(0, 0, 0, 0.8);\n      }\n    }\n  }\n\n  .j-vxe-popover-div {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 31px;\n    z-index: -1;\n  }\n</style>\n<style lang=\"less\">\n  .j-vxe-popover-overlay.ant-popover {\n    .ant-popover-title {\n      position: relative;\n    }\n  }\n\n  .fade-enter-active,\n  .fade-leave-active {\n    opacity: 1;\n    transition: opacity 0.5s;\n  }\n\n  .fade-enter,\n  .fade-leave-to {\n    opacity: 0;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/components/JVxeToolbar.vue",
    "content": "<template>\n  <div :class=\"boxClass\">\n    <vxe-toolbar ref=\"xToolbarRef\" :custom=\"custom\">\n      <!-- 工具按钮 -->\n      <template #buttons>\n        <div :class=\"`${prefixCls}-button div`\" :size=\"btnSize\">\n          <slot v-if=\"showPrefix\" name=\"toolbarPrefix\" :size=\"btnSize\" />\n          <a-button v-if=\"addBtnCfg.enabled && showAdd\" type=\"primary\" :preIcon=\"addBtnCfg.buttonIcon\" :disabled=\"disabled\" :loading=\"deleting\" @click=\"trigger('add')\">\n            <span>{{ addBtnCfg.buttonName }}</span>\n          </a-button>\n          <a-button v-if=\"showSave\" preIcon=\"ant-design:save-outlined\" :disabled=\"disabled\" @click=\"trigger('save')\">\n            <span>保存</span>\n          </a-button>\n          <template v-if=\"deleting || selectedRowIds.length > 0\">\n            <Popconfirm v-if=\"removeBtnCfg.enabled && showRemove\" :title=\"`确定要删除这 ${selectedRowIds.length} 项吗?`\" :disabled=\"deleting\" @confirm=\"onRemove\">\n              <a-button :preIcon=\"removeBtnCfg.buttonIcon\" :disabled=\"disabled\" :loading=\"deleting\">\n                <span>{{ removeBtnCfg.buttonName }}</span>\n              </a-button>\n            </Popconfirm>\n            <template v-if=\"showClearSelection\">\n              <a-button preIcon=\"ant-design:delete-outlined\" @click=\"trigger('clearSelection')\">清空选择</a-button>\n            </template>\n          </template>\n          <slot v-if=\"showSuffix\" name=\"toolbarSuffix\" :size=\"btnSize\" />\n          <a v-if=\"showCollapse\" style=\"margin-left: 4px\" @click=\"toggleCollapse\">\n            <span>{{ collapsed ? '展开' : '收起' }}</span>\n            <Icon :icon=\"collapsed ? 'ant-design:down-outlined' : 'ant-design:up-outlined'\" />\n          </a>\n        </div>\n      </template>\n    </vxe-toolbar>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { computed, inject, ref, onMounted } from 'vue';\n  // noinspection ES6UnusedImports\n  import { Popconfirm } from 'ant-design-vue';\n  import { VxeToolbarInstance } from 'vxe-table';\n  import { Icon } from '/@/components/Icon';\n  import { propTypes } from '/@/utils/propTypes';\n\n  const props = defineProps({\n    size: propTypes.string,\n    disabled: propTypes.bool.def(false),\n    custom: propTypes.bool.def(false),\n    toolbarConfig: propTypes.object,\n    disabledRows: propTypes.object,\n    hasBtnAuth: propTypes.func,\n    selectedRowIds: propTypes.array.def(() => []),\n    addBtnCfg: propTypes.object.def(() => ({\n      enabled: true,\n      buttonIcon: 'ant-design:plus-outlined',\n      buttonName: '新增',\n    })),\n    removeBtnCfg: propTypes.object.def(() => ({\n      enabled: true,\n      buttonIcon: 'ant-design:minus-outlined',\n      buttonName: '删除',\n    })),\n  });\n  const emit = defineEmits(['save', 'add', 'remove', 'clearSelection', 'register']);\n  const xToolbarRef = ref({} as VxeToolbarInstance);\n  const prefixCls = `${inject('prefixCls')}-toolbar`;\n  const boxClass = computed(() => [\n    prefixCls,\n    {\n      [`${prefixCls}-collapsed`]: collapsed.value,\n    },\n  ]);\n  // 是否收起\n  const collapsed = ref(true);\n  // 配置的按钮\n  const btns = computed(() => {\n    let { btn, btns } = props.toolbarConfig || {};\n    btns = btn || btns || ['add', 'remove', 'clearSelection'];\n    // 排除掉没有授权的按钮\n    return btns.filter((btn) => {\n      // 系统默认的批量删除编码配置为 batch_delete 此处需要兼容一下\n      if (btn === 'remove') {\n        // 代码逻辑说明: VUEN-1162 子表按钮没控制\n        return hasBtnAuth(btn) && hasBtnAuth('batch_delete');\n      }\n      return hasBtnAuth(btn);\n    });\n  });\n  const showAdd = computed(() => btns.value.includes('add'));\n  const showSave = computed(() => btns.value.includes('save'));\n  const showRemove = computed(() => btns.value.includes('remove'));\n  // 配置的插槽\n  const slots = computed(() => props.toolbarConfig?.slot || ['prefix', 'suffix']);\n  const showPrefix = computed(() => slots.value.includes('prefix'));\n  const showSuffix = computed(() => slots.value.includes('suffix'));\n  // 是否显示清除选择按钮\n  const showClearSelection = computed(() => {\n    if (btns.value.includes('clearSelection')) {\n      // 有禁用行时才显示清空选择按钮\n      // 因为禁用行会阻止选择行，导致无法取消全选\n      // return Object.keys(props.disabledRows).length > 0\n    }\n    return false;\n  });\n  // 是否显示展开收起按钮\n  const showCollapse = computed(() => btns.value.includes('collapse'));\n  // 按钮 size\n  const btnSize = computed(() => (props.size === 'tiny' ? 'small' : null));\n\n  onMounted(() => {\n    // 注册 vxe-toolbar\n    emit('register', {\n      xToolbarRef,\n    });\n  });\n\n  // 判断按钮是否已授权\n  function hasBtnAuth(key: string) {\n    return props.hasBtnAuth ? props.hasBtnAuth(key) : true;\n  }\n\n  /** 触发事件 */\n  function trigger(name) {\n    emit(name);\n  }\n\n  // 切换展开收起\n  function toggleCollapse() {\n    collapsed.value = !collapsed.value;\n  }\n\n  // 【TV360X-1975】在Online设计中，当字段多时，由于会同步删除其他表格导致删除时间变长，所以增加删除loading，防止以为点击删除按钮无效\n  const deleting = ref(false);\n\n  let deleteTimer: any = null\n\n  function onRemove() {\n    trigger('remove')\n    deleting.value = true;\n    if (deleteTimer) {\n      clearTimeout(deleteTimer)\n    }\n    deleteTimer = setTimeout(() => deleting.value = false, 300);\n  }\n\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/components/cells/JVxeCheckboxCell.vue",
    "content": "<template>\n  <div :class=\"boxClass\" :style=\"boxStyle\" title=\"\">\n    <a-checkbox :checked=\"innerValue\" v-bind=\"cellProps\" @change=\"handleChange\" />\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { computed, defineComponent } from 'vue';\n  import { JVxeComponent } from '/@/components/jeecg/JVxeTable/types';\n  import { useJVxeComponent, useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks';\n  import { isArray, isBoolean } from '/@/utils/is';\n\n  export default defineComponent({\n    name: 'JVxeCheckboxCell',\n    props: useJVxeCompProps(),\n    setup(props: JVxeComponent.Props) {\n      const { innerValue, cellProps, originColumn, scrolling, handleChangeCommon } = useJVxeComponent(props);\n      // 是否启用边框\n      const bordered = computed(() => !!props.renderOptions.bordered);\n      // box 类名\n      const boxClass = computed(() => {\n        return {\n          'j-vxe-checkbox': true,\n          'no-animation': scrolling.value,\n        };\n      });\n      // box 行内样式\n      const boxStyle = computed(() => {\n        const style = {};\n        // 如果有边框且未设置align属性，就强制居中\n        if (bordered.value && !originColumn.value.align) {\n          style['text-align'] = 'center';\n        }\n        return style;\n      });\n\n      // onChange 事件\n      function handleChange(event) {\n        handleChangeCommon(event.target.checked);\n      }\n\n      return {\n        cellProps,\n        innerValue,\n        boxClass,\n        boxStyle,\n        handleChange,\n      };\n    },\n\n    // 【组件增强】注释详见：JVxeComponent.Enhanced\n    enhanced: {\n      switches: {\n        visible: true,\n      },\n      getValue(value, ctx) {\n        let { context } = ctx!;\n        let { originColumn } = context;\n        // 处理 customValue\n        if (isArray(originColumn.value.customValue)) {\n          let customValue = getCustomValue(originColumn.value);\n          if (isBoolean(value)) {\n            return value ? customValue[0] : customValue[1];\n          } else {\n            return value;\n          }\n        } else {\n          return value;\n        }\n      },\n      setValue(value, ctx) {\n        let { context } = ctx!;\n        let { originColumn } = context;\n        // 判断是否设定了customValue（自定义值）\n        if (isArray(originColumn.value.customValue)) {\n          let customValue = getCustomValue(originColumn.value);\n          return neverNull(value).toString() === customValue[0].toString();\n        } else {\n          return !!value;\n        }\n      },\n      createValue(_defaultValue, ctx) {\n        let { context } = ctx!;\n        let {\n          column: { params: col },\n        } = context;\n        if (isArray(col.customValue)) {\n          let customValue = getCustomValue(col);\n          return col.defaultChecked ? customValue[0] : customValue[1];\n        } else {\n          return !!col.defaultChecked;\n        }\n      },\n    } as JVxeComponent.EnhancedPartial,\n  });\n\n  function neverNull(value, def?) {\n    return value == null ? neverNull(def, '') : value;\n  }\n\n  function getCustomValue(col) {\n    let customTrue = neverNull(col.customValue[0], true);\n    let customFalse = neverNull(col.customValue[1], false);\n    return [customTrue, customFalse];\n  }\n</script>\n\n<style lang=\"less\">\n  // 关闭动画，防止滚动时动态赋值出现问题\n  .j-vxe-checkbox.no-animation {\n    .ant-checkbox-inner,\n    .ant-checkbox-inner::after {\n      transition: none !important;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/components/cells/JVxeDateCell.vue",
    "content": "<template>\n  <a-date-picker\n    :value=\"innerDateValue\"\n    allowClear\n    :format=\"picker ? null : dateFormat\"\n    :showTime=\"isDatetime\"\n    :valueFormat=\"picker ? dateFormat : null\"\n    popupClassName=\"j-vxe-date-picker\"\n    style=\"min-width: 0\"\n    v-model:open=\"openPicker\"\n    v-bind=\"cellProps\"\n    :picker=\"picker\"\n    @change=\"handleChange\"\n  />\n</template>\n\n<script lang=\"ts\">\n  import { ref, computed, watch, defineComponent } from 'vue';\n  import dayjs from 'dayjs';\n  import { JVxeComponent, JVxeTypes } from '/@/components/jeecg/JVxeTable/types';\n  import { useJVxeComponent, useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks';\n  import { isEmpty } from '/@/utils/is';\n  import { getWeekMonthQuarterYear } from '/@/utils';\n\n  export default defineComponent({\n    name: 'JVxeDateCell',\n    props: useJVxeCompProps(),\n    setup(props: JVxeComponent.Props) {\n      const { innerValue, cellProps, originColumn, handleChangeCommon } = useJVxeComponent(props);\n      const innerDateValue = ref<any>(null);\n      const isDatetime = computed(() => props.type === JVxeTypes.datetime);\n      const dateFormat = computed(() => {\n        let format = originColumn.value.format;\n        return format ? format : isDatetime.value ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD';\n      });\n      const openPicker = ref(true);\n      // 代码逻辑说明: 【QQYUN-9205】一对多(jVxetable组件date)支持年，年月，年度度，年周\n      const picker = computed(() => {\n        const picker = originColumn.value.picker;\n        return picker ? picker : null;\n      });\n      watch(\n        innerValue,\n        (val) => {\n          if (val == null || isEmpty(val)) {\n            innerDateValue.value = null;\n          } else {\n            innerDateValue.value = dayjs(val, dateFormat.value);\n          }\n        },\n        { immediate: true }\n      );\n\n      function handleChange(_mom, dateStr) {\n        // 代码逻辑说明: 【QQYUN-9205】一对多(jVxetable组件date)支持年，年月，年度度，年周\n        if (picker.value) {\n          handleChangeCommon(_mom);\n        } else {\n          handleChangeCommon(dateStr);\n        }\n      }\n\n      return {\n        cellProps,\n        isDatetime,\n        dateFormat,\n        innerDateValue,\n        openPicker,\n        handleChange,\n        picker,\n      };\n    },\n    // 【组件增强】注释详见：JVxeComponent.Enhanced\n    enhanced: {\n      aopEvents: {\n      },\n      // 代码逻辑说明: 【QQYUN-9205】一对多(jVxetable组件date)支持年，年月，年度度，年周\n      translate: {\n        enabled: true,\n        handler(value, ctx) {\n          let { props, context } = ctx!;\n          let { row, originColumn } = context;\n          if (originColumn.value.picker && value) {\n            return getWeekMonthQuarterYear(value)[originColumn.value.picker];\n          }\n          return value;\n        },\n      },\n    } as JVxeComponent.EnhancedPartial,\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/components/cells/JVxeDragSortCell.vue",
    "content": "<template>\n  <div class=\"j-vxe-drag-box\">\n     <span v-if=\"!isAllowDrag\"><span class=\"not-drag-btn\"> <Icon icon=\"mi:drag\" /> </span\n      ></span>\n    <a-dropdown v-else :trigger=\"['click']\" >\n      <span\n        ><span class=\"drag-btn\"> <Icon icon=\"mi:drag\" /> </span\n      ></span>\n      <template #overlay >\n        <a-menu>\n          <a-menu-item key=\"0\" :disabled=\"disabledMoveUp\" @click=\"handleRowMoveUp\">向上移</a-menu-item>\n          <a-menu-item key=\"1\" :disabled=\"disabledMoveDown\" @click=\"handleRowMoveDown\">向下移</a-menu-item>\n          <template v-if=\"allowInsertRow\">\n            <a-menu-divider />\n            <a-menu-item key=\"3\" @click=\"handleRowInsertDown\">插入一行</a-menu-item>\n          </template>\n        </a-menu>\n      </template>\n    </a-dropdown>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { computed, defineComponent } from 'vue';\n  import { Icon } from '/@/components/Icon';\n  import { JVxeComponent } from '/@/components/jeecg/JVxeTable/types';\n  import { useJVxeComponent, useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks';\n\n  export default defineComponent({\n    name: 'JVxeDragSortCell',\n    components: { Icon },\n    props: useJVxeCompProps(),\n    setup(props: JVxeComponent.Props) {\n      const { rowIndex, originColumn, fullDataLength, trigger } = useJVxeComponent(props);\n      // 代码逻辑说明: 【QQYUN-8785】online表单列位置的id未做限制，拖动其他列到id列上面，同步数据库时报错\n      const isAllowDrag = computed(() => {\n        const notAllowDrag = originColumn.value.notAllowDrag;\n        if (notAllowDrag.length) {\n          const row = props.params.row;\n          const find = notAllowDrag.find((item: any) => {\n            const { key, value } = item;\n            return row[key] == value;\n          });\n          return !find;\n        } else {\n          return true;\n        }\n      });\n      const disabledMoveUp = computed(() => rowIndex.value === 0);\n      const disabledMoveDown = computed(() => rowIndex.value === fullDataLength.value - 1);\n\n      // 是否允许插入行\n      const allowInsertRow = computed(() => originColumn.value.insertRow);\n\n      /** 向上移 */\n      function handleRowMoveUp() {\n        if (!disabledMoveUp.value) {\n          trigger('rowResort', {\n            oldIndex: rowIndex.value,\n            newIndex: rowIndex.value - 1,\n          });\n        }\n      }\n\n      /** 向下移 */\n      function handleRowMoveDown() {\n        if (!disabledMoveDown.value) {\n          trigger('rowResort', {\n            oldIndex: rowIndex.value,\n            newIndex: rowIndex.value + 1,\n          });\n        }\n      }\n\n      /** 插入一行 */\n      function handleRowInsertDown() {\n        trigger('rowInsertDown', rowIndex.value);\n      }\n\n      return {\n        disabledMoveUp,\n        disabledMoveDown,\n        handleRowMoveUp,\n        handleRowMoveDown,\n        handleRowInsertDown,\n        isAllowDrag,\n        allowInsertRow,\n      };\n    },\n    // 【组件增强】注释详见：JVxeComponent.Enhanced\n    enhanced: {\n      // 【功能开关】\n      switches: {\n        editRender: false,\n      },\n    } as JVxeComponent.EnhancedPartial,\n  });\n</script>\n\n<style lang=\"less\">\n  .j-vxe-drag-box {\n    .app-iconify {\n      cursor: move;\n    }\n  }\n\n  .vxe-table--fixed-wrapper {\n    .j-vxe-drag-box {\n      .app-iconify {\n        cursor: pointer;\n      }\n    }\n  }\n</style>\n<style scoped>\n  .not-drag-btn {\n    opacity: 0.5;\n     .app-iconify {\n      cursor: not-allowed;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/components/cells/JVxeInputCell.vue",
    "content": "<template>\n  <a-input ref=\"input\" :value=\"innerValue\" v-bind=\"cellProps\" @blur=\"handleBlur\" @change=\"handleChange\" />\n</template>\n\n<script lang=\"ts\">\n  import { computed, defineComponent } from 'vue';\n  import { isString } from '/@/utils/is';\n  import { JVxeComponent, JVxeTypes } from '/@/components/jeecg/JVxeTable/types';\n  import { useJVxeComponent, useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks';\n\n  const NumberRegExp = /^-?\\d+\\.?\\d*$/;\n  export default defineComponent({\n    name: 'JVxeInputCell',\n    props: useJVxeCompProps(),\n    setup(props: JVxeComponent.Props) {\n      const { innerValue, cellProps, handleChangeCommon, handleBlurCommon } = useJVxeComponent(props);\n\n      // 是否是数字类型输入框\n      const isNumberType = props.type === JVxeTypes.inputNumber;\n\n      /**\n       * 计算数字类型的限制属性\n       * 包含最大值、最小值和精度配置，供输入组件和格式化逻辑使用\n       */\n      const numberProps = computed<{\n        max?: number,\n        min?: number,\n        precision?: number,\n      }>(() => {\n        const {max, min, precision} = cellProps.value as Recordable;\n        const nProps: Recordable = {};\n        // 最大值\n        if (typeof max === 'number') {\n          nProps.max = max;\n        }\n        // 最小值\n        if (typeof min === 'number') {\n          nProps.min = min;\n        }\n        // 数值精度，保留小数位数\n        if (typeof precision === 'number') {\n          nProps.precision = precision;\n        }\n        return nProps;\n      });\n\n      /** 处理change事件 */\n      function handleChange(event) {\n        let { target } = event;\n        let { value, selectionStart } = target;\n        let change = true;\n        if (isNumberType) {\n          // 判断输入的值是否匹配数字正则表达式，不匹配就还原\n          if (!NumberRegExp.test(value) && value !== '' && value !== '-') {\n            change = false;\n            value = innerValue.value;\n            target.value = value || '';\n            if (typeof selectionStart === 'number') {\n              target.selectionStart = selectionStart - 1;\n              target.selectionEnd = selectionStart - 1;\n            }\n          } else {\n            // 例如：41.1 -> 41.10, 100.1 -> 100.10 不执行handleChangeCommon 函数。\n            if (value.indexOf('.') != -1) {\n              const result = value.split('.').pop();\n              if (result && result.length >= 2 && result.substr(-1) === '0') {\n                change = false;\n                innerValue.value = value;\n              }\n            }\n          }\n        }\n        // 触发事件，存储输入的值\n        if (change) {\n          handleChangeCommon(value);\n        }\n      }\n\n      /** 处理blur失去焦点事件 */\n      function handleBlur(event) {\n        let { target } = event;\n        // 判断输入的值是否匹配数字正则表达式，不匹配就置空\n        if (isNumberType) {\n          if (!NumberRegExp.test(target.value)) {\n            target.value = '';\n          } else {\n            const parsedValue = Number.parseFloat(target.value);\n            const clampedValue = clampNumber(parsedValue);\n            target.value = applyPrecision(clampedValue);\n          }\n        }\n        handleChangeCommon(target.value, true);\n        handleBlurCommon(target.value);\n      }\n\n      /**\n       * 依据最小值和最大值限制数值\n       * @param value 需要裁剪的数值\n       */\n      function clampNumber(value: number): number {\n        let result = value;\n        const { max, min } = numberProps.value;\n        // 应用最小值限制\n        if (typeof min === 'number') {\n          result = Math.max(min, result);\n        }\n        // 应用最大值限制\n        if (typeof max === 'number') {\n          result = Math.min(max, result);\n        }\n        return result;\n      }\n\n      /**\n       * 按配置精度格式化数值\n       * @param value 待格式化的数值\n       */\n      function applyPrecision(value: number): number {\n        const { precision } = numberProps.value;\n        if (typeof precision === 'number') {\n          return Number(value.toFixed(precision));\n        }\n        return value;\n      }\n\n      return {\n        innerValue,\n        cellProps,\n        isNumberType,\n        handleChange,\n        handleBlur,\n      };\n    },\n    enhanced: {\n      installOptions: {\n        autofocus: '.ant-input',\n      },\n      getValue(value, ctx) {\n        if (ctx?.props?.type === JVxeTypes.inputNumber && isString(value)) {\n          if (NumberRegExp.test(value)) {\n            // 【issues/I5IHN7】修复无法输入小数点的bug\n            if (/\\.0*$/.test(value)) {\n              return value;\n            }\n            return Number.parseFloat(value);\n          }\n        }\n        return value;\n      },\n    } as JVxeComponent.EnhancedPartial,\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/components/cells/JVxeNormalCell.vue",
    "content": "<template>\n  <JVxeReloadEffect :vNode=\"innerLabel\" :effect=\"isEffect\" @effectEnd=\"handleEffectEnd\" />\n</template>\n\n<script lang=\"ts\">\n  import { ref, watch, defineComponent } from 'vue';\n  import JVxeReloadEffect from '../JVxeReloadEffect';\n  import { JVxeComponent } from '/@/components/jeecg/JVxeTable/types';\n  import { useJVxeComponent, useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks';\n\n  export default defineComponent({\n    name: 'JVxeNormalCell',\n    components: { JVxeReloadEffect },\n    props: useJVxeCompProps(),\n    setup(props: JVxeComponent.Props) {\n      const setup = useJVxeComponent(props);\n      const { innerValue, innerLabel, row } = setup;\n\n      const reloadEffect = props.renderOptions.reloadEffect;\n      const isEffect = ref<boolean>(false);\n\n      watch(\n        innerValue,\n        () => {\n          if (reloadEffect.enabled) {\n            if (reloadEffect.isEffect(row.value.id)) {\n              isEffect.value = true;\n            }\n          }\n        },\n        { immediate: true }\n      );\n\n      // 特效结束\n      function handleEffectEnd() {\n        isEffect.value = false;\n        reloadEffect.removeEffect(row.value.id);\n      }\n\n      return {\n        innerLabel,\n        innerValue,\n        isEffect,\n        handleEffectEnd,\n      };\n    },\n    enhanced: {\n      switches: { editRender: false },\n    } as JVxeComponent.EnhancedPartial,\n  });\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/components/cells/JVxeProgressCell.vue",
    "content": "<template>\n  <Progress :class=\"clazz\" :percent=\"innerValue\" size=\"small\" v-bind=\"cellProps\" />\n</template>\n\n<script lang=\"ts\">\n  import { computed, defineComponent } from 'vue';\n  import { Progress } from 'ant-design-vue';\n  import { JVxeComponent } from '/@/components/jeecg/JVxeTable/types';\n  import { useJVxeComponent, useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks';\n\n  export default defineComponent({\n    name: 'JVxeCheckboxCell',\n    components: { Progress },\n    props: useJVxeCompProps(),\n    setup(props: JVxeComponent.Props) {\n      const { innerValue, cellProps, scrolling } = useJVxeComponent(props);\n      const clazz = computed(() => {\n        return {\n          'j-vxe-progress': true,\n          'no-animation': scrolling.value,\n        };\n      });\n      return { innerValue, cellProps, clazz };\n    },\n    // 【组件增强】注释详见：：JVxeComponent.Enhanced\n    enhanced: {\n      switches: {\n        editRender: false,\n      },\n      setValue(value) {\n        try {\n          if (typeof value !== 'number') {\n            return Number.parseFloat(value);\n          } else {\n            return value;\n          }\n        } catch {\n          return 0;\n        }\n      },\n    } as JVxeComponent.EnhancedPartial,\n  });\n</script>\n\n<style scoped lang=\"less\">\n  // 关闭进度条的动画，防止滚动时动态赋值出现问题\n  .j-vxe-progress.no-animation {\n    :deep(.ant-progress-bg) {\n      transition: none !important;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/components/cells/JVxeRadioCell.vue",
    "content": "<template>\n  <a-radio-group :class=\"clazz\" :value=\"innerValue\" v-bind=\"cellProps\" @change=\"(e) => handleChangeCommon(e.target.value)\">\n    <a-radio v-for=\"item of originColumn.options\" :key=\"item.value\" :value=\"item.value\" @click=\"(e) => handleRadioClick(item, e)\"\n      >{{ item.text || item.label || item.title || item.value }}\n    </a-radio>\n  </a-radio-group>\n</template>\n\n<script lang=\"ts\">\n  import { computed, defineComponent } from 'vue';\n  import { JVxeComponent } from '/@/components/jeecg/JVxeTable/types';\n  import { useJVxeComponent, useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks';\n\n  export default defineComponent({\n    name: 'JVxeRadioCell',\n    props: useJVxeCompProps(),\n    setup(props: JVxeComponent.Props) {\n      const { innerValue, cellProps, originColumn, handleChangeCommon } = useJVxeComponent(props);\n      const scrolling = computed(() => !!props.renderOptions.scrolling);\n      const clazz = computed(() => {\n        return {\n          'j-vxe-radio': true,\n          'no-animation': scrolling.value,\n        };\n      });\n\n      function handleRadioClick(item) {\n        if (originColumn.value.allowClear === true) {\n          // 取消选择\n          if (item.value === innerValue.value) {\n            handleChangeCommon(null);\n          }\n        }\n      }\n\n      return {\n        clazz,\n        innerValue,\n        originColumn,\n        cellProps,\n        handleRadioClick,\n        handleChangeCommon,\n      };\n    },\n    // 【组件增强】注释详见：JVxeComponent.Enhanced\n    enhanced: {\n      switches: { visible: true },\n    } as JVxeComponent.EnhancedPartial,\n  });\n</script>\n\n<style lang=\"less\">\n  // 关闭动画，防止滚动时动态赋值出现问题\n  .j-vxe-radio.no-animation {\n    .ant-radio-inner,\n    .ant-radio-inner::after {\n      transition: none !important;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/components/cells/JVxeSelectCell.vue",
    "content": "<template>\n  <a-select :value=\"innerValue\" v-bind=\"selectProps\">\n    <template v-if=\"loading\" #notFoundContent>\n      <LoadingOutlined />\n      <span>&nbsp;加载中…</span>\n    </template>\n    <template v-for=\"option of selectOptions\" :key=\"option.value\">\n      <a-select-option :value=\"option.value\" :title=\"option.text || option.label || option.title\" :disabled=\"option.disabled\">\n        <span>{{ option.text || option.label || option.title || option.value }}</span>\n      </a-select-option>\n    </template>\n  </a-select>\n</template>\n\n<script lang=\"ts\">\n  import { ref, computed, defineComponent } from 'vue';\n  import { LoadingOutlined } from '@ant-design/icons-vue';\n  import { filterDictText } from '/@/utils/dict/JDictSelectUtil';\n  import { JVxeComponent, JVxeTypes } from '/@/components/jeecg/JVxeTable/types';\n  import { useJVxeComponent, useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks';\n  import { dispatchEvent } from '/@/components/jeecg/JVxeTable/utils';\n  import { isPromise } from '/@/utils/is';\n\n  export default defineComponent({\n    name: 'JVxeSelectCell',\n    components: { LoadingOutlined },\n    props: useJVxeCompProps(),\n    setup(props: JVxeComponent.Props) {\n      const { innerValue, cellProps, row, originColumn, scrolling, handleChangeCommon, handleBlurCommon } = useJVxeComponent(props);\n      const loading = ref(false);\n      // 异步加载的options（用于多级联动）\n      const asyncOptions = ref<any[] | null>(null);\n      // 下拉框 props\n      const selectProps = computed(() => {\n        let selProps = {\n          ...cellProps.value,\n          allowClear: true,\n          autofocus: true,\n          defaultOpen: !scrolling.value,\n          style: { width: '100%' },\n          filterOption: handleSelectFilterOption,\n          onBlur: handleBlur,\n          onChange: handleChange,\n        };\n        // 判断select是否允许输入\n        let { allowSearch, allowInput } = originColumn.value;\n        if (allowInput === true || allowSearch === true) {\n          selProps['showSearch'] = true;\n          selProps['onSearch'] = handleSearchSelect;\n        }\n        return selProps;\n      });\n      // 下拉选项\n      const selectOptions = computed(() => {\n        if (asyncOptions.value) {\n          return asyncOptions.value;\n        }\n        let { linkage } = props.renderOptions;\n        if (linkage) {\n          let { getLinkageOptionsSibling, config } = linkage;\n          let res = getLinkageOptionsSibling(row.value, originColumn.value, config, true);\n          // 当返回Promise时，说明是多级联动\n          if (res instanceof Promise) {\n            loading.value = true;\n            res\n              .then((opt) => {\n                asyncOptions.value = opt;\n                loading.value = false;\n              })\n              .catch((e) => {\n                console.error(e);\n                loading.value = false;\n              });\n          } else {\n            asyncOptions.value = null;\n            return res;\n          }\n        }\n        return originColumn.value.options;\n      });\n\n      // --------- created ---------\n\n      // 多选、搜索type\n      let multipleTypes = [JVxeTypes.selectMultiple, 'list_multi'];\n      let searchTypes = [JVxeTypes.selectSearch, 'sel_search'];\n      if (multipleTypes.includes(props.type)) {\n        // 处理多选\n        let props = originColumn.value.props || {};\n        props['mode'] = 'multiple';\n        props['maxTagCount'] = 1;\n        // 代码逻辑说明: issues/271 Online表单主子表单下拉多选无法搜索\n        originColumn.value.allowSearch = true;\n        originColumn.value.props = props;\n      } else if (searchTypes.includes(props.type)) {\n        // 处理搜索\n        originColumn.value.allowSearch = true;\n      }\n\n      /** 处理 change 事件 */\n      function handleChange(value) {\n        // 处理下级联动\n        let linkage = props.renderOptions.linkage;\n        if (linkage) {\n          linkage.handleLinkageSelectChange(row.value, originColumn.value, linkage.config, value);\n        }\n        handleChangeCommon(value);\n      }\n\n      /** 处理blur失去焦点事件 */\n      function handleBlur(value) {\n        let { allowInput, options } = originColumn.value;\n        if (allowInput === true) {\n          // 删除无用的因搜索（用户输入）而创建的项\n          if (typeof value === 'string') {\n            let indexes: number[] = [];\n            options.forEach((option, index) => {\n              if (option.value.toLocaleString() === value.toLocaleString()) {\n                delete option.searchAdd;\n              } else if (option.searchAdd === true) {\n                indexes.push(index);\n              }\n            });\n            // 翻转删除数组中的项\n            for (let index of indexes.reverse()) {\n              options.splice(index, 1);\n            }\n          }\n        }\n        handleBlurCommon(value);\n      }\n\n      /** 用于搜索下拉框中的内容 */\n      function handleSelectFilterOption(input, option) {\n      \n        let { allowSearch, allowInput } = originColumn.value;\n        if (allowSearch === true || allowInput === true) {\n          // 代码逻辑说明: 【QQYUN-5806】js增强改变下拉搜索options (防止option.title为null报错)\n          if (option.title == null) return false;\n          // 代码逻辑说明: 【issues/5305】JVxeTypes.select 无法按照预期进行搜索\n          return option.title.toLowerCase().indexOf(input.toLowerCase()) >= 0;\n        }\n        return true;\n      }\n\n      /** select 搜索时的事件，用于动态添加options */\n      function handleSearchSelect(value) {\n        let { allowSearch, allowInput, options } = originColumn.value;\n\n        if (allowSearch !== true && allowInput === true) {\n          // 是否找到了对应的项，找不到则添加这一项\n          let flag = false;\n          for (let option of options) {\n            if (option.value.toLocaleString() === value.toLocaleString()) {\n              flag = true;\n              break;\n            }\n          }\n          // !!value ：不添加空值\n          if (!flag && !!value) {\n            // searchAdd 是否是通过搜索添加的\n            options.push({ title: value, value: value, searchAdd: true });\n          }\n        }\n      }\n\n      return {\n        loading,\n        innerValue,\n        selectProps,\n        selectOptions,\n        handleChange,\n        handleBlur,\n      };\n    },\n    // 【组件增强】注释详见：JVxeComponent.Enhanced\n    enhanced: {\n      aopEvents: {\n        editActived({ $event, row, column }) {\n          dispatchEvent({\n            $event,\n            row,\n            column,\n            props: this.props,\n            instance: this,\n            className: '.ant-select .ant-select-selection-search-input',\n            isClick: false,\n            handler: (el) => el.focus(),\n          });\n        },\n      },\n      translate: {\n        enabled: true,\n        async handler(value, ctx) {\n          let { props, context } = ctx!;\n          let { row, originColumn } = context;\n          let options;\n          let linkage = props?.renderOptions.linkage;\n          // 判断是否是多级联动，如果是就通过接口异步翻译\n          if (linkage) {\n            let { getLinkageOptionsSibling, config } = linkage;\n            let linkageOptions = getLinkageOptionsSibling(row.value, originColumn.value, config, true);\n            options = isPromise(linkageOptions) ? await linkageOptions : linkageOptions;\n          } else if (isPromise(originColumn.value.optionsPromise)) {\n            options = await originColumn.value.optionsPromise;\n          } else {\n            options = originColumn.value.options;\n          }\n          return filterDictText(options, value);\n        },\n      },\n      getValue(value) {\n        if (Array.isArray(value)) {\n          return value.join(',');\n        } else {\n          return value;\n        }\n      },\n      setValue(value, ctx) {\n        let { context } = ctx!;\n        let { originColumn } = context;\n        // 判断是否是多选\n        if ((originColumn.value.props || {})['mode'] === 'multiple') {\n          originColumn.value.props['maxTagCount'] = 1;\n        }\n        if (value != null && value !== '') {\n          if (typeof value === 'string') {\n            return value === '' ? [] : value.split(',');\n          }\n          return value;\n        } else {\n          return undefined;\n        }\n      },\n    } as JVxeComponent.EnhancedPartial,\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/components/cells/JVxeSlotCell.ts",
    "content": "import { computed, defineComponent, h } from 'vue';\nimport { useJVxeComponent, useJVxeCompProps } from '/@/components/jeecg/JVxeTable/src/hooks/useJVxeComponent';\nimport { JVxeComponent } from '/@/components/jeecg/JVxeTable/src/types/JVxeComponent';\n\nexport default defineComponent({\n  name: 'JVxeSlotCell',\n  props: useJVxeCompProps(),\n  setup(props: JVxeComponent.Props) {\n    const data = useJVxeComponent(props);\n    const slotProps = computed(() => {\n      return {\n        value: data.innerValue.value,\n        row: data.row.value,\n        column: data.originColumn.value,\n        params: props.params,\n        $table: props.params.$table,\n        rowId: props.params.rowid,\n        index: props.params.rowIndex,\n        rowIndex: props.params.rowIndex,\n        columnIndex: props.params.columnIndex,\n        scrolling: props.renderOptions.scrolling,\n        reloadEffect: props.renderOptions.reloadEffect.enabled,\n        triggerChange: (v) => data.handleChangeCommon(v),\n      };\n    });\n    return () => {\n      let { slot } = props.renderOptions;\n      if (slot) {\n        return h('div', {}, slot(slotProps.value));\n      } else {\n        return h('div');\n      }\n    };\n  },\n  // 【组件增强】注释详见：JVxeComponent.Enhanced\n  enhanced: {\n    switches: {\n      editRender: false,\n    },\n  } as JVxeComponent.EnhancedPartial,\n});\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/components/cells/JVxeTextareaCell.vue",
    "content": "<template>\n  <JInputPop\n    :value=\"innerValue\"\n    :width=\"300\"\n    :height=\"210\"\n    :pop-container=\"getPopupContainer\"\n    v-bind=\"cellProps\"\n    style=\"width: 100%\"\n    @blur=\"handleBlurCommon\"\n    @change=\"handleChangeCommon\"\n  />\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import JInputPop from '/@/components/Form/src/jeecg/components/JInputPop.vue';\n  import { dispatchEvent } from '/@/components/jeecg/JVxeTable/utils';\n  import { JVxeComponent } from '/@/components/jeecg/JVxeTable/types';\n  import { useJVxeComponent, useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks';\n\n  export default defineComponent({\n    name: 'JVxeTextareaCell',\n    components: { JInputPop },\n    props: useJVxeCompProps(),\n    setup(props: JVxeComponent.Props) {\n      const { innerValue, cellProps, handleChangeCommon, handleBlurCommon } = useJVxeComponent(props);\n\n      function getPopupContainer() {\n        return document.body;\n      }\n\n      return { innerValue, cellProps, handleChangeCommon, handleBlurCommon, getPopupContainer };\n    },\n    // 【组件增强】注释详见：JVxeComponent.Enhanced\n    enhanced: {\n      installOptions: {\n        autofocus: '.ant-input',\n      },\n      aopEvents: {\n        editActived({ $event, row, column }) {\n          // 是否默认打开右侧弹窗\n          if (column.params.defaultOpen ?? false) {\n            dispatchEvent({\n              $event,\n              row,\n              column,\n              props: this.props,\n              instance: this,\n              className: '.ant-input-suffix .app-iconify',\n              isClick: true,\n            });\n          }\n        },\n      },\n    } as JVxeComponent.EnhancedPartial,\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/components/cells/JVxeTimeCell.vue",
    "content": "<template>\n  <TimePicker\n    :value=\"innerTimeValue\"\n    allowClear\n    :format=\"format\"\n    popupClassName=\"j-vxe-time-picker\"\n    style=\"min-width: 0\"\n    v-model:open=\"openPicker\"\n    v-bind=\"cellProps\"\n    @change=\"handleChange\"\n  />\n</template>\n\n<script lang=\"ts\">\n  import { ref, computed, watch, defineComponent } from 'vue';\n  import dayjs from 'dayjs';\n  import { TimePicker } from 'ant-design-vue';\n  import { JVxeComponent } from '/@/components/jeecg/JVxeTable/types';\n  import { useJVxeComponent, useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks';\n  import { isEmpty } from '/@/utils/is';\n\n  export default defineComponent({\n    name: 'JVxeTimeCell',\n    components: { TimePicker },\n    props: useJVxeCompProps(),\n    setup(props: JVxeComponent.Props) {\n      const { innerValue, cellProps, originColumn, handleChangeCommon } = useJVxeComponent(props);\n      const innerTimeValue = ref<any>(null);\n      const format = computed(() => {\n        let format = originColumn.value.format;\n        return format ? format : 'HH:mm:ss';\n      });\n      const openPicker = ref(true);\n      watch(\n        innerValue,\n        (val) => {\n          if (val == null || isEmpty(val)) {\n            innerTimeValue.value = null;\n          } else {\n            innerTimeValue.value = dayjs(val, format.value);\n          }\n        },\n        { immediate: true }\n      );\n\n      function handleChange(_mom, dateStr) {\n        handleChangeCommon(dateStr);\n      }\n\n      return {\n        cellProps,\n        format,\n        innerTimeValue,\n        openPicker,\n        handleChange,\n      };\n    },\n    // 【组件增强】注释详见：JVxeComponent.Enhanced\n    enhanced: {\n      aopEvents: {\n      },\n    } as JVxeComponent.EnhancedPartial,\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/components/cells/JVxeUploadCell.vue",
    "content": "<template>\n  <div>\n    <template v-if=\"hasFile\" v-for=\"(file, fileKey) of [innerFile || {}]\" :key=\"fileKey\">\n      <a-input :readOnly=\"true\" :value=\"file.name\">\n        <template #addonBefore style=\"width: 30px\">\n          <a-tooltip v-if=\"file.status === 'uploading'\" :title=\"`上传中(${Math.floor(file.percent)}%)`\">\n            <LoadingOutlined />\n          </a-tooltip>\n          <a-tooltip v-else-if=\"file.status === 'done'\" title=\"上传完成\">\n            <Icon icon=\"ant-design:check-circle-outlined\" style=\"color: #00db00\" />\n          </a-tooltip>\n          <a-tooltip v-else :title=\"file.message || '上传失败'\">\n            <Icon icon=\"ant-design:exclamation-circle-outlined\" style=\"color: red\" />\n          </a-tooltip>\n        </template>\n        <span v-if=\"file.status === 'uploading'\" slot=\"addonAfter\">{{ Math.floor(file.percent) }}%</span>\n        <template v-if=\"originColumn.allowDownload !== false || originColumn.allowRemove !== false\" #addonAfter>\n          <Dropdown :trigger=\"['click']\" placement=\"bottomRight\">\n            <a-tooltip title=\"操作\">\n              <Icon icon=\"ant-design:setting-outlined\" style=\"cursor: pointer\" />\n            </a-tooltip>\n            <template #overlay>\n              <a-menu>\n                <a-menu-item v-if=\"originColumn.allowDownload !== false\" @click=\"handleClickDownloadFile\">\n                  <span><Icon icon=\"ant-design:download-outlined\" />&nbsp;下载</span>\n                </a-menu-item>\n                <a-menu-item v-if=\"originColumn.allowRemove !== false\" @click=\"handleClickDeleteFile\">\n                  <span><Icon icon=\"ant-design:delete-outlined\" />&nbsp;删除</span>\n                </a-menu-item>\n              </a-menu>\n            </template>\n          </Dropdown>\n        </template>\n      </a-input>\n    </template>\n    <a-upload\n      v-if=\"!cellProps.disabledTable\"\n      v-show=\"!hasFile\"\n      name=\"file\"\n      :data=\"{ isup: 1 }\"\n      :multiple=\"false\"\n      :action=\"originColumn.action\"\n      :headers=\"uploadHeaders\"\n      :showUploadList=\"false\"\n      v-bind=\"cellProps\"\n      @change=\"handleChangeUpload\"\n    >\n      <a-button preIcon=\"ant-design:upload-outlined\">{{ originColumn.btnText || '点击上传' }}</a-button>\n    </a-upload>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { Icon } from '/@/components/Icon';\n  import { Dropdown } from 'ant-design-vue';\n  import { LoadingOutlined } from '@ant-design/icons-vue';\n  import { JVxeComponent } from '/@/components/jeecg/JVxeTable/types';\n  import { useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks';\n  import { useJVxeUploadCell, fileGetValue, fileSetValue } from '../../hooks/cells/useJVxeUploadCell';\n\n  export default defineComponent({\n    name: 'JVxeUploadCell',\n    components: { Icon, Dropdown, LoadingOutlined },\n    props: useJVxeCompProps(),\n    setup(props: JVxeComponent.Props) {\n      const setup = useJVxeUploadCell(props);\n      return { ...setup };\n    },\n    // 【组件增强】注释详见：：JVxeComponent.Enhanced\n    enhanced: {\n      switches: { visible: true },\n      getValue: (value) => fileGetValue(value),\n      setValue: (value) => fileSetValue(value),\n    } as JVxeComponent.EnhancedPartial,\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/hooks/cells/useJVxeUploadCell.ts",
    "content": "import { ref, computed, watch } from 'vue';\n\nimport {getTenantId, getToken} from '/@/utils/auth';\nimport { getFileAccessHttpUrl } from '/@/utils/common/compUtils';\nimport { JVxeComponent } from '../../types/JVxeComponent';\nimport { useJVxeComponent } from '../useJVxeComponent';\n\n/**\n * use 公共上传组件\n * @param props\n * @param options 组件选项，token：默认是否传递token，action：默认上传路径，multiple：是否允许多文件\n */\nexport function useJVxeUploadCell(props: JVxeComponent.Props, options?) {\n  const setup = useJVxeComponent(props);\n  const { innerValue, originColumn, handleChangeCommon } = setup;\n\n  const innerFile = ref<any>(null);\n\n  /** upload headers */\n  const uploadHeaders = computed(() => {\n    let headers = {};\n    if ((originColumn.value.token ?? options?.token ?? false) === true) {\n      headers['X-Access-Token'] = getToken();\n    }\n    let tenantId = getTenantId();\n    headers['X-Tenant-Id'] = tenantId ? tenantId : '0';\n    return headers;\n  });\n\n  /** 上传请求地址 */\n  const uploadAction = computed(() => {\n    if (!originColumn.value.action) {\n      return options?.action ?? '';\n    } else {\n      return originColumn.value.action;\n    }\n  });\n  const hasFile = computed(() => innerFile.value != null);\n  const responseName = computed(() => originColumn.value.responseName ?? 'message');\n\n  watch(\n    innerValue,\n    (val) => {\n      if (val) {\n        innerFile.value = val;\n      } else {\n        innerFile.value = null;\n      }\n    },\n    { immediate: true }\n  );\n\n  function handleChangeUpload(info) {\n    let { file } = info;\n    let value = {\n      name: file.name,\n      type: file.type,\n      size: file.size,\n      status: file.status,\n      percent: file.percent,\n      path: innerFile.value?.path ?? '',\n    };\n    if (file.response) {\n      value['responseName'] = file.response[responseName.value];\n    }\n    let paths: string[] = [];\n    if (options?.multiple && innerFile.value && innerFile.value.path) {\n      paths = innerFile.value.path.split(',');\n    }\n    if (file.status === 'done') {\n      if (typeof file.response.success === 'boolean') {\n        if (file.response.success) {\n          paths.push(file.response[responseName.value]);\n          value['path'] = paths.join(',');\n          handleChangeCommon(value);\n        } else {\n          value['status'] = 'error';\n          value['message'] = file.response.message || '未知错误';\n        }\n      } else {\n        // 考虑到如果设置action上传路径为非jeecg-boot后台，可能不会返回 success 属性的情况，就默认为成功\n        paths.push(file.response[responseName.value]);\n        value['path'] = paths.join(',');\n        handleChangeCommon(value);\n      }\n    } else if (file.status === 'error') {\n      value['message'] = file.response.message || '未知错误';\n    }\n    innerFile.value = value;\n  }\n\n  function handleClickDownloadFile() {\n    let { url, path } = innerFile.value || {};\n    if (!url || url.length === 0) {\n      if (path && path.length > 0) {\n        url = getFileAccessHttpUrl(path.split(',')[0]);\n      }\n    }\n    if (url) {\n      window.open(url);\n    }\n  }\n\n  function handleClickDeleteFile() {\n    handleChangeCommon(null);\n  }\n\n  return {\n    ...setup,\n    innerFile,\n    uploadAction,\n    uploadHeaders,\n    hasFile,\n    responseName,\n    handleChangeUpload,\n    handleClickDownloadFile,\n    handleClickDeleteFile,\n  };\n}\n\nexport function fileGetValue(value) {\n  if (value && value.path) {\n    return value.path;\n  }\n  return value;\n}\n\nexport function fileSetValue(value) {\n  if (value) {\n    let first = value.split(',')[0];\n    let name = first.substring(first.lastIndexOf('/') + 1);\n    return {\n      name: name,\n      path: value,\n      status: 'done',\n    };\n  }\n  return value;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/hooks/useColumns.ts",
    "content": "import type { JVxeColumn, JVxeDataProps, JVxeTableProps } from '../types';\nimport { computed, nextTick, toRaw } from 'vue';\nimport { isArray, isEmpty, isPromise } from '/@/utils/is';\nimport { cloneDeep } from 'lodash-es';\nimport { JVxeTypePrefix, JVxeTypes } from '../types/JVxeTypes';\nimport { initDictOptions } from '/@/utils/dict';\nimport { pushIfNotExist } from '/@/utils/common/compUtils';\nimport { getEnhanced } from '../utils/enhancedUtils';\nimport { isRegistered } from '../utils/registerUtils';\nimport { JVxeComponent } from '../types/JVxeComponent';\nimport { useValidateRules } from './useValidateRules';\nimport { JVxeTableMethods } from '../types';\n\n// handle 方法参数\nexport interface HandleArgs {\n  props: JVxeTableProps;\n  slots: any;\n  data: JVxeDataProps;\n  methods: JVxeTableMethods;\n  col?: JVxeColumn;\n  columns: JVxeColumn[];\n  renderOptions?: any;\n  enhanced?: JVxeComponent.Enhanced;\n}\n\nexport function useColumns(props: JVxeTableProps, data: JVxeDataProps, methods: JVxeTableMethods, slots) {\n  data.vxeColumns = computed(() => {\n    // linkageConfig变化时也需要执行\n    const linkageConfig = toRaw(props.linkageConfig);\n    if (linkageConfig) {\n      // console.log(linkageConfig);\n    }\n    let columns: JVxeColumn[] = [];\n    if (isArray(props.columns)) {\n      // handle 方法参数\n      const args: HandleArgs = { props, slots, data, methods, columns };\n      let seqColumn, selectionColumn, expandColumn, dragSortColumn;\n\n      const handleColumn = (column: JVxeColumn, container: JVxeColumn[]) => {\n        // 排除未授权的列 1 = 显示/隐藏； 2 = 禁用\n        let auth = methods.getColAuth(column.key);\n        if (auth?.type == '1' && !auth.isAuth) {\n          return;\n        } else if (auth?.type == '2' && !auth.isAuth) {\n          column.disabled = true;\n        }\n        // type 不填，默认为 normal\n        if (column.type == null || isEmpty(column.type)) {\n          column.type = JVxeTypes.normal;\n        }\n        let col: JVxeColumn = cloneDeep(column);\n        // 处理隐藏列\n        if (col.type === JVxeTypes.hidden) {\n          return handleInnerColumn(args, col, handleHiddenColumn);\n        }\n        // 处理子级列\n        // 判断是否是分组列，如果当前是父级，则无需处理 render\n        if (Array.isArray(col.children) && col.children.length > 0) {\n          const children: JVxeColumn[] = [];\n          col.children.forEach((child: JVxeColumn) => handleColumn(child, children));\n          col.children = children;\n          container.push(col);\n          return;\n        }\n        // 组件未注册，自动设置为 normal\n        if (!isRegistered(col.type)) {\n          col.type = JVxeTypes.normal;\n        }\n        args.enhanced = getEnhanced(col.type);\n        args.col = col;\n        args.renderOptions = {\n          bordered: props.bordered,\n          disabled: props.disabled,\n          scrolling: data.scrolling,\n          isDisabledRow: methods.isDisabledRow,\n          listeners: {\n            trigger: (name, event) => methods.trigger(name, event),\n            valueChange: (event) => methods.trigger('valueChange', event),\n            /** 重新排序行 */\n            rowResort: (event) => {\n              methods.doSort(event.oldIndex, event.newIndex);\n              methods.trigger('dragged', event);\n            },\n            /** 在当前行下面插入一行 */\n            rowInsertDown: (rowIndex) => methods.insertRows({}, rowIndex + 1),\n          },\n        };\n        if (col.type === JVxeTypes.rowNumber) {\n          seqColumn = col;\n          container.push(col);\n        } else if (col.type === JVxeTypes.rowRadio || col.type === JVxeTypes.rowCheckbox) {\n          selectionColumn = col;\n          container.push(col);\n        } else if (col.type === JVxeTypes.rowExpand) {\n          expandColumn = col;\n          container.push(col);\n        } else if (col.type === JVxeTypes.rowDragSort) {\n          dragSortColumn = col;\n          container.push(col);\n        } else {\n          col.params = column;\n          args.columns = container;\n          handlerCol(args);\n        }\n      }\n\n      props.columns.forEach((column: JVxeColumn) => handleColumn(column, columns));\n\n      handleInnerColumn(args, seqColumn, handleSeqColumn);\n      handleInnerColumn(args, selectionColumn, handleSelectionColumn);\n      handleInnerColumn(args, expandColumn, handleExpandColumn);\n      handleInnerColumn(args, dragSortColumn, handleDragSortColumn, true);\n      // update-begin--author:liaozhiyang---date:2024-05-30---for【TV360X-371】不可编辑组件必填缺少*号\n      customComponentAddStar(columns);\n    }\n    return columns;\n  });\n}\n\n/**\n * 2024-05-30\n * liaozhiyang\n * 不可编辑组件必填通过title人为加*号\n */\nfunction customComponentAddStar(columns) {\n  columns.forEach((column) => {\n    const { params } = column;\n    if (params) {\n      const { validateRules, type } = params;\n      if (\n        validateRules?.length &&\n        [\n          JVxeTypes.checkbox,\n          JVxeTypes.radio,\n          JVxeTypes.upload,\n          JVxeTypes.progress,\n          JVxeTypes.departSelect,\n          JVxeTypes.userSelect,\n          JVxeTypes.image,\n          JVxeTypes.file,\n        ].includes(type)\n      ) {\n        if (validateRules.find((item) => item.required)) {\n          column.title = ` * ${column.title}`;\n        }\n      }\n    }\n  });\n}\n\n/** 处理内置列 */\nfunction handleInnerColumn(args: HandleArgs, col: JVxeColumn, handler: (args: HandleArgs) => void, assign?: boolean) {\n  let renderOptions = col?.editRender || col?.cellRender;\n  return handler({\n    ...args,\n    col: col,\n    renderOptions: assign ? Object.assign({}, args.renderOptions, renderOptions) : renderOptions,\n  });\n}\n\n/**\n * 处理隐藏列\n */\nfunction handleHiddenColumn({ col, columns }: HandleArgs) {\n  col!.params = cloneDeep(col);\n  delete col!.type;\n  col!.field = col!.key;\n  col!.visible = false;\n  columns.push(col!);\n}\n\n/**\n * 处理行号列\n */\nfunction handleSeqColumn({ props, col, columns }: HandleArgs) {\n  // 判断是否开启了行号列\n  if (props.rowNumber) {\n    let column = {\n      type: 'seq',\n      title: '#',\n      width: 60,\n      // 【QQYUN-8405】\n      fixed: props.rowNumberFixed,\n      align: 'center',\n    };\n    // 代码逻辑说明: 【QQYUN-8405】vxetable支持序号是否固定（移动端需要）\n    if (props.rowNumberFixed === 'none') {\n      delete column.fixed;\n    }\n    if (col) {\n      Object.assign(col, column);\n    } else {\n      columns.unshift(column as any);\n    }\n  }\n}\n\n/**\n * 处理可选择列\n */\nfunction handleSelectionColumn({ props, data, col, columns }: HandleArgs) {\n  // 判断是否开启了可选择行\n  // -update-begin--author:liaozhiyang---date:20240617---for：【TV360X-1002】详情页面行编辑不显示checkbox\n  if (props.rowSelection && props.disabled == false) {\n    // -update-end--author:liaozhiyang---date:20240617---for：【TV360X-1002】详情页面行编辑不显示checkbox\n    let width = 45;\n    if (data.statistics.has && !props.rowExpand && !props.dragSort) {\n      width = 60;\n    }\n    let column: any = {\n      type: props.rowSelectionType,\n      width: width,\n      fixed: 'left',\n      align: 'center',\n    };\n    // 代码逻辑说明: 【issues/1162】JVxeTable列过长（出现横向滚动条）时无法拖拽排序\n    if (props.rowSelectionFixed === 'none') {\n      delete column.fixed;\n    }\n    if (col) {\n      Object.assign(col, column);\n    } else {\n      columns.unshift(column as any);\n    }\n  }\n}\n\n/**\n * 处理可展开行\n */\nfunction handleExpandColumn({ props, data, col, columns }: HandleArgs) {\n  // 是否可展开行\n  if (props.rowExpand) {\n    let width = 40;\n    if (data.statistics.has && !props.dragSort) {\n      width = 60;\n    }\n    let column = {\n      type: 'expand',\n      title: '',\n      width: width,\n      fixed: 'left',\n      align: 'center',\n      slots: { content: 'expandContent' },\n    };\n    if (col) {\n      Object.assign(col, column);\n    } else {\n      columns.unshift(column as any);\n    }\n  }\n}\n\n/** 处理可排序列 */\nfunction handleDragSortColumn({ props, data, col, columns, renderOptions }: HandleArgs) {\n  // 是否可拖动排序\n  if (props.dragSort) {\n    let width = 40;\n    if (data.statistics.has) {\n      width = 60;\n    }\n    let column: any = {\n      title: '',\n      width: width,\n      fixed: 'left',\n      align: 'center',\n      // 代码逻辑说明: 【QQYUN-8785】online表单列位置的id未做限制，拖动其他列到id列上面，同步数据库时报错\n      params: {\n        insertRow: props.insertRow,\n        notAllowDrag: props.notAllowDrag,\n        ...col?.params,\n      },\n    };\n    // 代码逻辑说明: 【issues/1162】JVxeTable列过长（出现横向滚动条）时无法拖拽排序\n    if (props.dragSortFixed === 'none') {\n      delete column.fixed;\n    }\n    let cellRender = {\n      name: JVxeTypePrefix + JVxeTypes.rowDragSort,\n      sortKey: props.sortKey,\n    };\n    if (renderOptions) {\n      column.cellRender = Object.assign(renderOptions, cellRender);\n    } else {\n      column.cellRender = cellRender;\n    }\n    if (col) {\n      Object.assign(col, column);\n    } else {\n      columns.unshift(column);\n    }\n  }\n}\n\n/** 处理自定义组件列 */\nfunction handlerCol(args: HandleArgs) {\n  const { props, col, columns, enhanced } = args;\n  if (!col) return;\n  let { type } = col;\n  col.field = col.key;\n  delete col.type;\n  let renderName = 'cellRender';\n  // 渲染选项\n  let $renderOptions: any = { name: JVxeTypePrefix + type };\n  if (enhanced?.switches.editRender) {\n    if (!(enhanced.switches.visible || props.alwaysEdit)) {\n      renderName = 'editRender';\n    }\n    // $renderOptions.type = (enhanced.switches.visible || props.alwaysEdit) ? 'visible' : 'default'\n  }\n  col[renderName] = $renderOptions;\n  // 代码逻辑说明: 【QQYUN-5806】js增强改变下拉搜索options（添加customOptions为true不读字典，走自己的options）\n  !col.params.customOptions && handleDict(args);\n  handleRules(args);\n  handleStatistics(args);\n  handleSlots(args);\n  handleLinkage(args);\n  handleReloadEffect(args);\n\n  if (col.editRender) {\n    Object.assign(col.editRender, args.renderOptions);\n  }\n  if (col.cellRender) {\n    Object.assign(col.cellRender, args.renderOptions);\n  }\n\n  columns.push(col);\n}\n\n/**\n * 处理字典\n */\nasync function handleDict({ col, methods }: HandleArgs) {\n  if (col && col.params.dictCode) {\n    /** 加载数据字典并合并到 options */\n    try {\n      // 查询字典\n      if (!isPromise(col.params.optionsPromise)) {\n        col.params.optionsPromise = new Promise(async (resolve) => {\n          // 代码逻辑说明: VUEN-1180 【代码生成】子表不支持带条件？\n          let dictCodeString = col.params.dictCode;\n          if (dictCodeString) {\n            dictCodeString = encodeURI(dictCodeString);\n          }\n          const dictOptions: any = await initDictOptions(dictCodeString);\n          let options = col.params.options ?? [];\n          dictOptions.forEach((dict) => {\n            // 过滤重复数据\n            if (options.findIndex((o) => o.value === dict.value) === -1) {\n              options.push(dict);\n            }\n          });\n          resolve(options);\n        });\n      }\n      col.params.options = await col.params.optionsPromise;\n      await nextTick();\n      await methods.getXTable().updateData();\n    } catch (e) {\n      console.group(`[JVxeTable] 查询字典 \"${col.params.dictCode}\" 时发生异常！`);\n      console.warn(e);\n      console.groupEnd();\n    }\n  }\n}\n\n/**\n * 处理校验\n */\nfunction handleRules(args: HandleArgs) {\n  if (isArray(args.col?.validateRules)) {\n    useValidateRules(args);\n  }\n}\n\n/**\n * 处理统计列\n */\nfunction handleStatistics({ col, data }: HandleArgs) {\n  // sum = 求和、average = 平均值\n  if (col && isArray(col.statistics)) {\n    data.statistics.has = true;\n    col.statistics.forEach((item) => {\n      if (!isEmpty(item)) {\n        let arr = data.statistics[(item as string).toLowerCase()];\n        if (isArray(arr)) {\n          pushIfNotExist(arr, col.key);\n        }\n      }\n    });\n  }\n}\n\n/**\n * 处理插槽\n */\nfunction handleSlots({ slots, col, renderOptions }: HandleArgs) {\n  // slot 组件特殊处理\n  if (col && col.params.type === JVxeTypes.slot) {\n    if (!isEmpty(col.slotName) && slots.hasOwnProperty(col.slotName)) {\n      renderOptions.slot = slots[col.slotName];\n    }\n  }\n}\n\n/** 处理联动列 */\nfunction handleLinkage({ data, col, renderOptions, methods }: HandleArgs) {\n  // 处理联动列，联动列只能作用于 select 组件\n  if (col && col.params.type === JVxeTypes.select && data.innerLinkageConfig != null) {\n    // 判断当前列是否是联动列\n    if (data.innerLinkageConfig.has(col.key)) {\n      renderOptions.linkage = {\n        config: data.innerLinkageConfig.get(col.key),\n        getLinkageOptionsAsync: methods.getLinkageOptionsAsync,\n        getLinkageOptionsSibling: methods.getLinkageOptionsSibling,\n        handleLinkageSelectChange: methods.handleLinkageSelectChange,\n      };\n    }\n  }\n}\n\nfunction handleReloadEffect({ props, data, renderOptions }: HandleArgs) {\n  renderOptions.reloadEffect = {\n    enabled: props.reloadEffect,\n    getMap() {\n      return data.reloadEffectRowKeysMap;\n    },\n    isEffect(rowId) {\n      return data.reloadEffectRowKeysMap[rowId] === true;\n    },\n    removeEffect(rowId) {\n      return (data.reloadEffectRowKeysMap[rowId] = false);\n    },\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/hooks/useColumnsCache.ts",
    "content": "import { computed } from 'vue';\nimport { router } from '/@/router';\nimport { createLocalStorage } from '/@/utils/cache';\nimport { useMessage } from '/@/hooks/web/useMessage';\n\nexport function useColumnsCache({ cacheColumnsKey, refs }: any) {\n  const $ls = createLocalStorage();\n  const { createMessage: $message } = useMessage();\n  const cacheKey = computed(() => {\n    const path = router.currentRoute.value.fullPath;\n    let key = path.replace(/[\\/\\\\]/g, '_');\n    if (cacheColumnsKey) {\n      key += ':' + cacheColumnsKey;\n    }\n    return 'vxe-columnCache:' + key;\n  });\n  const initSetting = (props) => {\n    const columnCache = $ls.get(cacheKey.value);\n    if (columnCache) {\n      columnCache.forEach((key) => {\n        const column = props.columns.find((item) => item.key === key);\n        if (column) {\n          column.visible = false;\n        }\n      });\n    }\n  };\n  // const initSetting = (refs) => {\n  //   let columnCache = $ls.get(cacheKey.value);\n  //   if (columnCache) {\n  //     const $grid = refs.gridRef.value!.getRefMaps().refTable.value;\n  //     console.log('refs.gridRef', $grid);\n  //     const { fullColumn } = $grid.getTableColumn();\n  //     const hideColumns = getHideColumn(fullColumn, columnCache);\n  //     if (hideColumns?.length) {\n  //       hideColumns.forEach((column) => {\n  //         $grid.hideColumn(column);\n  //       });\n  //     }\n  //   }\n  //   console.log(columnCache);\n  // };\n  function saveSetting($grid: any) {\n    console.log($grid);\n    const { fullColumn, visibleColumn } = $grid.getTableColumn();\n    const hideColumnKey = getHideColumnKey(fullColumn, visibleColumn);\n    if (hideColumnKey.length) {\n      $ls.set(cacheKey.value, hideColumnKey);\n      $message.success('保存成功');\n    }\n  }\n  const resetSetting = ($grid) => {\n    const columnCache = $ls.get(cacheKey.value);\n    if (columnCache) {\n      const { fullColumn } = $grid.getTableColumn();\n      const hideColumns = getHideColumn(fullColumn, columnCache);\n      if (hideColumns?.length) {\n        hideColumns.forEach((column) => {\n          if (columnCache.includes(column?.params?.key)) {\n            $grid.showColumn(column);\n          }\n        });\n      }\n    }\n    $ls.remove(cacheKey.value);\n    $message.success('重置成功');\n  };\n  const getHideColumn = (fullColumn, columnCache) => {\n    const result: any = [];\n    if (columnCache?.length) {\n    console.log('--fullColumn:',fullColumn);\n      columnCache.forEach((key) => {\n        const column = fullColumn.find((item) => item?.params?.key === key);\n        if (column) {\n          result.push(column);\n        }\n      });\n    }\n    return result;\n  };\n  const getHideColumnKey = (fullColumn, visibleColumn) => {\n    const reuslt: any = [];\n    if (fullColumn.length === visibleColumn.length) {\n      return reuslt;\n    } else {\n      fullColumn.forEach((item) => {\n        const fKey = item?.params?.key;\n        if (fKey) {\n          const vItem = visibleColumn.find((item) => {\n            return item?.params?.key === fKey;\n          });\n          if (!vItem) {\n            reuslt.push(fKey);\n          }\n        }\n      });\n      return reuslt;\n    }\n  };\n  return {\n    initSetting,\n    resetSetting,\n    saveSetting,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/hooks/useData.ts",
    "content": "import { ref, reactive, provide, resolveComponent } from 'vue';\nimport { useDesign } from '/@/hooks/web/useDesign';\nimport { JVxeDataProps, JVxeRefs, JVxeTableProps } from '../types';\nimport { VxeGridInstance } from 'vxe-table';\nimport { randomString } from '/@/utils/common/compUtils';\n\nexport function useData(props: JVxeTableProps): JVxeDataProps {\n  const { prefixCls } = useDesign('j-vxe-table');\n  provide('prefixCls', prefixCls);\n  return {\n    prefixCls: prefixCls,\n    caseId: `j-vxe-${randomString(8)}`,\n    vxeDataSource: ref([]),\n    scroll: reactive({ top: 0, left: 0 }),\n    scrolling: ref(false),\n    defaultVxeProps: reactive({\n      // rowId: props.rowKey,\n      rowConfig: {\n        keyField: props.rowKey,\n        // 高亮hover的行\n        isHover: true,\n      },\n\n      // --- 【issues/209】自带的tooltip会错位，所以替换成原生的title ---\n      // 溢出隐藏并显示tooltip\n      showOverflow: \"title\",\n      // 表头溢出隐藏并显示tooltip\n      showHeaderOverflow: \"title\",\n      // --- 【issues/209】自带的tooltip会错位，所以替换成原生的title ---\n\n      showFooterOverflow: true,\n      // 可编辑配置\n      editConfig: {\n        trigger: 'click',\n        mode: 'cell',\n        //activeMethod: () => !props.disabled,\n        beforeEditMethod: () => !props.disabled,\n      },\n      expandConfig: {\n        iconClose: 'vxe-icon-arrow-right',\n        iconOpen: 'vxe-icon-arrow-down',\n        ...props.expandConfig,\n      },\n      // 虚拟滚动配置，y轴大于xx条数据时启用虚拟滚动\n      scrollY: {\n        gt: 30,\n      },\n      scrollX: {\n        gt: 20,\n        // 暂时关闭左右虚拟滚动\n        enabled: false,\n      },\n      radioConfig: {\n        // 保留勾选状态\n        reserve: true,\n        highlight: true,\n      },\n      checkboxConfig: {\n        // 保留勾选状态\n        reserve: true,\n        highlight: true,\n      },\n      mouseConfig: { selected: false },\n      keyboardConfig: {\n        // 删除键功能\n        isDel: false,\n        // Esc键关闭编辑功能\n        isEsc: true,\n        // Tab 键功能\n        isTab: true,\n        // 任意键进入编辑（功能键除外）\n        isEdit: true,\n        // 方向键功能\n        isArrow: true,\n        // 回车键功能\n        isEnter: true,\n        // 如果功能被支持，用于 column.type=checkbox|radio，开启空格键切换复选框或单选框状态功能\n        isChecked: true,\n      },\n    }),\n    selectedRows: ref<any[]>([]),\n    selectedRowIds: ref<string[]>([]),\n    disabledRowIds: [],\n    statistics: reactive({\n      has: false,\n      sum: [],\n      average: [],\n    }),\n    authsMap: ref(null),\n    innerEditRules: {},\n    innerLinkageConfig: new Map<string, any>(),\n    reloadEffectRowKeysMap: reactive({}),\n  };\n}\n\nexport function useRefs(): JVxeRefs {\n  return {\n    gridRef: ref<VxeGridInstance>(),\n    subPopoverRef: ref<any>(),\n    detailsModalRef: ref<any>(),\n  };\n}\n\nexport function useResolveComponent(...t: any[]): any {\n  // @ts-ignore\n  return resolveComponent(...t);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/hooks/useDataSource.ts",
    "content": "import { nextTick, watch } from 'vue';\nimport { JVxeDataProps, JVxeRefs, JVxeTableMethods } from '../types';\nimport { cloneDeep } from 'lodash-es';\n\nexport function useDataSource(props, data: JVxeDataProps, methods: JVxeTableMethods, refs: JVxeRefs) {\n  watch(\n    () => props.dataSource,\n    async () => {\n      data.disabledRowIds = [];\n      data.vxeDataSource.value = cloneDeep(props.dataSource);\n      data.vxeDataSource.value.forEach((row, rowIndex) => {\n        // 判断是否是禁用行\n        if (methods.isDisabledRow(row, rowIndex)) {\n          data.disabledRowIds.push(row.id);\n        }\n        // 处理联动回显数据\n        methods.handleLinkageBackData(row);\n      });\n      await waitRef(refs.gridRef);\n      methods.recalcSortNumber();\n    },\n    { immediate: true }\n  );\n}\n\nfunction waitRef($ref) {\n  return new Promise<any>((resolve) => {\n    (function next() {\n      if ($ref.value) {\n        resolve($ref);\n      } else {\n        nextTick(() => next());\n      }\n    })();\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/hooks/useDragSort.ts",
    "content": "import { onMounted, onUnmounted, nextTick } from 'vue';\nimport { JVxeTableMethods, JVxeTableProps } from '/@/components/jeecg/JVxeTable/src/types';\nimport Sortable from 'sortablejs';\nimport { isEnabledVirtualYScroll } from '/@/components/jeecg/JVxeTable/utils';\n\nexport function useDragSort(props: JVxeTableProps, methods: JVxeTableMethods) {\n  if (props.dragSort) {\n    let sortable2: Sortable;\n    let initTime: any;\n\n    onMounted(() => {\n      // 加载完成之后再绑定拖动事件\n      initTime = setTimeout(createSortable, 300);\n    });\n\n    onUnmounted(() => {\n      clearTimeout(initTime);\n      if (sortable2) {\n        sortable2.destroy();\n      }\n    });\n\n    function createSortable() {\n      let xTable = methods.getXTable();\n      // let dom = xTable.$el.querySelector('.vxe-table--fixed-wrapper .vxe-table--body tbody')\n      // let dom = xTable.$el.querySelector('.body--wrapper>.vxe-table--body tbody');\n      let dom = xTable.$el.querySelector('.vxe-table--body-inner-wrapper > .vxe-table--body tbody');\n      if (!dom) {\n        console.warn('[JVxeTable] 拖拽排序初始化失败，可能是vxe-table升级导致的版本不兼容。');\n        return;\n      }\n      let startChildren = [];\n      sortable2 = Sortable.create(dom as HTMLElement, {\n        handle: '.drag-btn',\n        // 代码逻辑说明: 【QQYUN-8785】online表单列位置的id未做限制，拖动其他列到id列上面，同步数据库时报错\n        filter: '.not-allow-drag',\n        draggable: \".allow-drag\",\n        direction: 'vertical',\n        animation: 300,\n        onStart(e) {\n          let from = e.from;\n          // @ts-ignore\n          startChildren = [...from.children];\n        },\n        onEnd(e: any) {\n          // -update-begin--author:liaozhiyang---date:20240619---for：【TV360X-585】拖动字段虚拟滚动不好使\n          const isRealEnabledVirtual = isEnabledVirtualYScroll(props, xTable);\n          let newIndex;\n          let oldIndex;\n          // 滚动排序需要区分当前行编辑是否启动了虚拟滚动(底层loadData方法对是否真实开启了虚拟滚动处理不一样导致需要区分)\n          if (isRealEnabledVirtual) {\n            // e.clone的元素才是真实拖动的元素(虚拟滚动也不会变)\n            const dragNode = e.clone;\n            const dragRowInfo = xTable.getRowNode(dragNode);\n            // e.item的元素只有没虚拟滚动时才是拖动的元素(如果虚拟滚动了则会变)\n            const itemNode = e.item;\n            const itemRowInfo = xTable.getRowNode(itemNode);\n            // e.newIndex是当前可视区内元素的索引(不是数据实际的索引)、e.oldIndex 是拖动时可视区内元素的索引(不是数据实际的索引)\n            if (dragRowInfo!.rowid === itemRowInfo!.rowid) {\n              // e.clone和e.item相同说明拖拽的元素在DOM中，没被虚拟滚动给remove掉。\n              if (e.newIndex === e.oldIndex) {\n                // 此时新旧index一样就可认为没拖动\n                return;\n              }\n            } else {\n            }\n            // 此时真实DOM元素顺序已排(通过拖拽元素的前后元素确定拖拽元素在真实数据中是往前还是往后拖)\n            oldIndex = dragRowInfo!.index;\n            const len = e.from.childNodes.length;\n            let referenceIndex;\n            let referenceNode;\n            if (e.newIndex + 1 < len) {\n              // 拖拽DOM交换之后，后面还有元素（参考物是后面的元素）\n              referenceNode = e.from.childNodes[e.newIndex + 1];\n              referenceIndex = xTable.getRowNode(referenceNode)!.index;\n              if (oldIndex > referenceIndex) {\n                newIndex = referenceIndex;\n              } else {\n                newIndex = referenceIndex - 1;\n              }\n            } else {\n              // 拖拽DOM交换之后，后面没有元素了（参考物是前面的元素）\n              referenceNode = e.from.childNodes[e.newIndex - 1];\n              referenceIndex = xTable.getRowNode(referenceNode)!.index;\n              newIndex = referenceIndex;\n            }\n          } else {\n            oldIndex = e.oldIndex;\n            newIndex = e.newIndex;\n            if (oldIndex === newIndex) {\n              return;\n            }\n            const from = e.from;\n            const element = startChildren[oldIndex];\n            let target = null;\n            if (oldIndex > newIndex) {\n              // 向上移动\n              if (oldIndex + 1 < startChildren.length) {\n                target = startChildren[oldIndex + 1];\n              }\n            } else {\n              // 向下移动\n              target = startChildren[oldIndex + 1];\n            }\n            from.removeChild(element);\n            from.insertBefore(element, target);\n          }\n          // -update-end--author:liaozhiyang---date:20240620---for：【TV360X-585】拖动字段虚拟滚动不好使\n          nextTick(() => {\n            methods.doSort(oldIndex, newIndex);\n            methods.trigger('dragged', { oldIndex: oldIndex, newIndex: newIndex });\n          });\n        },\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/hooks/useFinallyProps.ts",
    "content": "import { unref, computed, ref, watch, nextTick } from 'vue';\nimport { merge, debounce } from 'lodash-es';\nimport { isArray } from '/@/utils/is';\nimport { useAttrs } from '/@/hooks/core/useAttrs';\nimport { useKeyboardEdit } from '../hooks/useKeyboardEdit';\nimport { JVxeDataProps, JVxeTableMethods, JVxeTableProps } from '../types';\n\nexport function useFinallyProps(props: JVxeTableProps, data: JVxeDataProps, methods: JVxeTableMethods) {\n  const attrs = useAttrs();\n  // vxe 键盘操作配置\n  const { keyboardEditConfig } = useKeyboardEdit(props);\n  // vxe 最终 editRules\n  const vxeEditRules = computed(() => merge({}, props.editRules, data.innerEditRules));\n  // vxe 最终 events\n  const vxeEvents = computed(() => {\n    let listeners = { ...unref(attrs) };\n    let events = {\n      onScroll: methods.handleVxeScroll,\n      onCellClick: methods.handleCellClick,\n      onEditClosed: methods.handleEditClosed,\n      onEditActived: methods.handleEditActived,\n      onRadioChange: methods.handleVxeRadioChange,\n      onCheckboxAll: methods.handleVxeCheckboxAll,\n      onCheckboxChange: methods.handleVxeCheckboxChange,\n      // 代码逻辑说明: 【QQYUN-8566】JVXETable无法记住列设置\n      onCustom: methods.handleCustom,\n    };\n    // 用户传递的事件，进行合并操作\n    Object.keys(listeners).forEach((key) => {\n      let listen = listeners[key];\n      if (events.hasOwnProperty(key)) {\n        if (isArray(listen)) {\n          listen.push(events[key]);\n        } else {\n          listen = [events[key], listen];\n        }\n      }\n      events[key] = listen;\n    });\n    return events;\n  });\n\n  // vxe 最终 props\n  const vxePropsMerge = computed(() => {\n    // 代码逻辑说明: 【QQYUN-8785】online表单列位置的id未做限制，拖动其他列到id列上面，同步数据库时报错\n    let rowClass = {};\n    if (props.dragSort) {\n      rowClass = {\n        rowClassName: (params) => {\n          let { row } = params;\n          const find = props.notAllowDrag?.find((item:any) => {\n            const {key, value} = item;\n            return row[key] == value;\n          });\n          // 业务传进的来的rowClassName\n          const popsRowClassName = props.rowClassName ?? '';\n          let outClass = '';\n          if(typeof popsRowClassName==='string'){\n            popsRowClassName && (outClass = popsRowClassName);\n          }else if(typeof popsRowClassName==='function'){\n            outClass = popsRowClassName(params)\n          }\n          return find ? `not-allow-drag ${outClass}` : `allow-drag ${outClass}`;\n        },\n      };\n    }\n    return merge(\n      {},\n      data.defaultVxeProps,\n      {\n        showFooter: data.statistics.has,\n      },\n      unref(attrs),\n      {\n        ref: 'gridRef',\n        size: props.size,\n        loading: false,\n        disabled: props.disabled,\n        // columns: unref(data.vxeColumns),\n        editRules: unref(vxeEditRules),\n        height: props.height === 'auto' ? null : props.height,\n        maxHeight: props.maxHeight,\n        // 代码逻辑说明: 【QQYUN-5133】JVxeTable 行编辑升级\n        scrollY: props.scrollY,\n        scrollX: props.scrollX,\n        border: props.bordered,\n        footerMethod: methods.handleFooterMethod,\n        // 展开行配置\n        expandConfig: {\n          toggleMethod: methods.handleExpandToggleMethod,\n        },\n        // 可编辑配置\n        editConfig: {\n          //activeMethod: methods.handleActiveMethod,\n          beforeEditMethod: methods.handleActiveMethod,\n        },\n        radioConfig: {\n          checkMethod: methods.handleCheckMethod,\n        },\n        checkboxConfig: {\n          checkMethod: methods.handleCheckMethod,\n        },\n        ...rowClass\n        // rowClassName:(params)=>{\n        //   const { row } = params;\n        //   return row.dbFieldName=='id'?\"not-allow-drag\":\"allow-drag\"\n        // }\n      },\n      unref(vxeEvents),\n      unref(keyboardEditConfig)\n    );\n  });\n\n  // 代码逻辑说明: 【issues/8593】修复列改变后内容不刷新\n  const vxeColumnsRef = ref(data.vxeColumns!.value || [])\n  const watchColumnsDebounce = debounce(async () => {\n    vxeColumnsRef.value = []\n    await nextTick()\n    vxeColumnsRef.value = data.vxeColumns!.value\n  }, 50)\n  watch(data.vxeColumns!, watchColumnsDebounce)\n\n  const vxeProps = computed(() => {\n    return {\n      ...unref(vxePropsMerge),\n      // 【issue/8695】单独抽出 columns，防止性能问题\n      columns: unref(vxeColumnsRef),\n    }\n  });\n\n  return {\n    vxeProps,\n    prefixCls: data.prefixCls,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/hooks/useJVxeComponent.ts",
    "content": "import { computed, nextTick, ref, unref, watch } from 'vue';\nimport { propTypes } from '/@/utils/propTypes';\nimport { useDesign } from '/@/hooks/web/useDesign';\nimport { getEnhanced, replaceProps } from '../utils/enhancedUtils';\nimport { vModel } from '/@/components/jeecg/JVxeTable/utils';\nimport { JVxeRenderType } from '../types/JVxeTypes';\nimport { isBoolean, isFunction, isObject, isPromise } from '/@/utils/is';\nimport { JVxeComponent } from '../types/JVxeComponent';\nimport { filterDictText } from '/@/utils/dict/JDictSelectUtil';\nimport { getAreaTextByCode } from \"@/components/Form/src/utils/Area\";\n\nexport function useJVxeCompProps() {\n  return {\n    // 组件类型\n    type: propTypes.string,\n    // 渲染类型\n    renderType: propTypes.string.def('default'),\n    // 渲染参数\n    params: propTypes.object,\n    // 渲染自定义选项\n    renderOptions: propTypes.object,\n  };\n}\n\nexport function useJVxeComponent(props: JVxeComponent.Props) {\n  const value = computed(() => {\n    // 代码逻辑说明: 【QQYUN-9125】oracle数据库日期类型字段会默认带上时分秒\n    const val = props.params.row[props.params.column.property];\n    if (props.type === 'date' && typeof val === 'string') {\n      return val.split(' ').shift();\n    } else {\n      return val;\n    }\n  });\n  const innerValue = ref(value.value);\n  const row = computed(() => props.params.row);\n  const rows = computed(() => props.params.data);\n  const column = computed(() => props.params.column);\n  // 用户配置的原始 column\n  const originColumn = computed(() => column.value.params);\n  const rowIndex = computed(() => props.params._rowIndex);\n  const columnIndex = computed(() => props.params._columnIndex);\n  // 表格数据长度\n  const fullDataLength = computed(() => props.params.$table.internalData.tableFullData.length);\n  // 是否正在滚动中\n  const scrolling = computed(() => !!props.renderOptions.scrolling);\n  // 当有formatter时，优先使用formatter\n  const innerLabel = computed(() => {\n    if(typeof column.value?.formatter === 'function'){\n      return column.value.formatter({\n        cellValue: innerValue.value,\n        row: row.value,\n        column: column.value,\n      });\n    }\n    return innerValue.value\n  });\n  const cellProps = computed(() => {\n    let renderOptions = props.renderOptions;\n    let col = originColumn.value;\n\n    let cellProps = {};\n\n    // 输入占位符\n    cellProps['placeholder'] = replaceProps(col, col.placeholder);\n\n    // 解析props\n    if (isObject(col.props)) {\n      Object.keys(col.props).forEach((key) => {\n        cellProps[key] = replaceProps(col, col.props[key]);\n      });\n    }\n\n    // 判断是否是禁用的列\n    cellProps['disabled'] = isBoolean(col['disabled']) ? col['disabled'] : cellProps['disabled'];\n    // 判断是否禁用行\n    if (renderOptions.isDisabledRow(row.value, rowIndex.value)) {\n      cellProps['disabled'] = true;\n    }\n    // 代码逻辑说明: 【TV360X-291】没勾选同步数据库禁用排序功能\n    if (col.props && col.props.isDisabledCell) {\n      if (col.props.isDisabledCell({ row: row.value, rowIndex: rowIndex.value, column: col, columnIndex: columnIndex.value })) {\n        cellProps['disabled'] = true;\n      }\n    }\n    // 判断是否禁用所有组件\n    if (renderOptions.disabled === true) {\n      cellProps['disabled'] = true;\n      // 代码逻辑说明: 【TV360X-1068】行编辑整体禁用时上传按钮不显示\n      cellProps['disabledTable'] = true;\n    }\n    // 代码逻辑说明: VUEN-1111 一对多子表 部门选择 不应该级联\n    if (col.checkStrictly === true) {\n      cellProps['checkStrictly'] = true;\n    }\n\n    // 代码逻辑说明: 用户组件 控制单选多选新的参数配置\n    if (col.isRadioSelection === true) {\n      cellProps['isRadioSelection'] = true;\n    } else if (col.isRadioSelection === false) {\n      cellProps['isRadioSelection'] = false;\n    }\n\n    return cellProps;\n  });\n\n  const listeners = computed(() => {\n    let listeners = Object.assign({}, props.renderOptions.listeners || {});\n    // 默认change事件\n    if (!listeners.change) {\n      listeners.change = async (event) => {\n        vModel(event.value, row, column);\n        await nextTick();\n        // 处理 change 事件相关逻辑（例如校验）\n        props.params.$table.updateStatus(props.params);\n      };\n    }\n    return listeners;\n  });\n  const context = {\n    innerLabel,\n    innerValue,\n    row,\n    rows,\n    rowIndex,\n    column,\n    columnIndex,\n    originColumn,\n    fullDataLength,\n    cellProps,\n    scrolling,\n    handleChangeCommon,\n    handleBlurCommon,\n  };\n  const ctx = { props, context };\n\n  // 获取组件增强\n  let enhanced = getEnhanced(props.type);\n\n  watch(\n    value,\n    (newValue) => {\n      // -update-begin--author:liaozhiyang---date:20241210---for：【issues/7497】隐藏某一列后，字典没翻译，恢复后正常\n      // TODO 先这样修复解决问题，根因后期再看看\n      enhanced = getEnhanced(props.type);\n      // -update-end--author:liaozhiyang---date:20241210---for：【issues/7497】隐藏某一列后，字典没翻译，恢复后\n      // 验证值格式\n      let getValue = enhanced.getValue(newValue, ctx);\n      if (newValue !== getValue) {\n        // 值格式不正确，重新赋值\n        newValue = getValue;\n        vModel(newValue, row, column);\n      }\n      innerValue.value = enhanced.setValue(newValue, ctx);\n      // 代码逻辑说明: 【QQYUN-9205】一对多(jVxetable组件date)支持年，年月，年度度，年周\n      if (props.type === 'date' && props.renderType === JVxeRenderType.spaner && enhanced.translate.enabled === true) {\n        if (isFunction(enhanced.translate.handler)) {\n          innerValue.value = enhanced.translate.handler(newValue, ctx);\n        }\n        return;\n      }\n\n      // 代码逻辑说明: 【issues/7203】自动生成一对多表单代码中，省市区回显问题---\n      if (props.type === 'pca' && props.renderType === JVxeRenderType.spaner) {\n        innerValue.value = getAreaTextByCode(newValue);\n        return;\n      }\n\n      // 判断是否启用翻译\n      if (props.renderType === JVxeRenderType.spaner && enhanced.translate.enabled === true) {\n        if (isFunction(enhanced.translate.handler)) {\n          let res = enhanced.translate.handler(newValue, ctx);\n          // 异步翻译，可解决字典查询慢的问题\n          if (isPromise(res)) {\n            res.then((v) => (innerValue.value = v));\n          } else {\n            innerValue.value = res;\n          }\n        }\n      }\n    },\n    { immediate: true }\n  );\n\n  /** 通用处理 change 事件 */\n  function handleChangeCommon($value, force = false) {\n    const newValue = enhanced.getValue($value, ctx);\n    const oldValue = value.value;\n    // 代码逻辑说明: 【issues-5025】JVueTable的事件 @valueChange重复触发问题\n    const execute = force ? true : newValue !== oldValue;\n    if (execute) {\n      trigger('change', { value: newValue });\n      // 触发valueChange事件\n      parentTrigger('valueChange', {\n        type: props.type,\n        value: newValue,\n        oldValue: oldValue,\n        col: originColumn.value,\n        rowIndex: rowIndex.value,\n        columnIndex: columnIndex.value,\n      });\n    }\n  }\n\n  /** 通用处理 blur 事件 */\n  function handleBlurCommon($value) {\n    // 代码逻辑说明: 【issues/636】JVxeTable加上blur事件\n    const newValue = enhanced.getValue($value, ctx);\n    const oldValue = value.value;\n    //trigger('blur', { value });\n    // 触发blur事件\n    parentTrigger('blur', {\n      type: props.type,\n      value: newValue,\n      oldValue: oldValue,\n      col: originColumn.value,\n      rowIndex: rowIndex.value,\n      columnIndex: columnIndex.value,\n    });\n  }\n\n  /**\n   * 如果事件存在的话，就触发\n   * @param name 事件名\n   * @param event 事件参数\n   * @param args 其他附带参数\n   */\n  function trigger(name, event?, args: any[] = []) {\n    let listener = listeners.value[name];\n    if (isFunction(listener)) {\n      if (isObject(event)) {\n        event = packageEvent(name, event);\n      }\n      listener(event, ...args);\n    }\n  }\n\n  function parentTrigger(name, event, args: any[] = []) {\n    args.unshift(packageEvent(name, event));\n    trigger('trigger', name, args);\n  }\n\n  function packageEvent(name, event: any = {}) {\n    event.row = row.value;\n    event.column = column.value;\n    // online增强参数兼容\n    event.column['key'] = column.value['property'];\n    // event.cellTarget = this\n    if (!event.type) {\n      event.type = name;\n    }\n    if (!event.cellType) {\n      event.cellType = props.type;\n    }\n    // 是否校验表单，默认为true\n    if (isBoolean(event.validate)) {\n      event.validate = true;\n    }\n    return event;\n  }\n\n  /**\n   * 防样式冲突类名生成器\n   * @param scope\n   */\n  function useCellDesign(scope: string) {\n    return useDesign(`vxe-cell-${scope}`);\n  }\n\n  return {\n    ...context,\n    enhanced,\n    trigger,\n    useCellDesign,\n  };\n}\n\n/**\n * 获取组件默认增强\n */\nexport function useDefaultEnhanced(): JVxeComponent.EnhancedPartial {\n  return {\n    installOptions: {\n      autofocus: '',\n    },\n    interceptor: {\n      'event.clearActived': () => true,\n      'event.clearActived.className': () => true,\n    },\n    switches: {\n      editRender: true,\n      visible: false,\n    },\n    aopEvents: {\n      editActived() {},\n      editClosed() {},\n      activeMethod: () => true,\n    },\n    translate: {\n      enabled: false,\n      handler(value, ctx) {\n        // 默认翻译方法\n        if (ctx) {\n          return filterDictText(unref(ctx.context.column).params.options, value);\n        } else {\n          return value;\n        }\n      },\n    },\n    getValue: (value) => value,\n    setValue: (value) => value,\n    createValue: (defaultValue) => defaultValue,\n  } as JVxeComponent.Enhanced;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/hooks/useKeyboardEdit.ts",
    "content": "/*\n * JVxeTable 键盘操作\n */\nimport type { VxeTablePropTypes } from 'vxe-table';\nimport type { JVxeTableProps } from '../types';\nimport { computed } from 'vue';\n\n/**\n * JVxeTable 键盘操作\n *\n * @param props\n */\nexport function useKeyboardEdit(props: JVxeTableProps) {\n  // 是否开启了键盘操作\n  const enabledKeyboard = computed(() => props.keyboardEdit ?? false);\n  // 重写 keyboardConfig\n  const keyboardConfig: VxeTablePropTypes.KeyboardConfig = {\n    editMethod({ row, column, $table }) {\n      // 重写默认的覆盖式，改为追加式\n      $table.setActiveCell(row, column);\n      return true;\n    },\n  };\n  // 键盘操作配置\n  const keyboardEditConfig = computed(() => {\n    return {\n      mouseConfig: {\n        selected: enabledKeyboard.value,\n      },\n      keyboardConfig,\n    };\n  });\n\n  return {\n    keyboardEditConfig,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/hooks/useLinkage.ts",
    "content": "import { watch } from 'vue';\nimport { isFunction, isPromise, isArray } from '/@/utils/is';\nimport { JVxeColumn, JVxeDataProps, JVxeTableProps, JVxeLinkageConfig } from '../types';\n\n/**\n * 多级联动\n */\nexport function useLinkage(props: JVxeTableProps, data: JVxeDataProps, methods) {\n  // 整理多级联动配置\n  watch(\n    () => props.linkageConfig,\n    (linkageConfig: JVxeLinkageConfig[]) => {\n      data.innerLinkageConfig.clear();\n      if (isArray(linkageConfig) && linkageConfig.length > 0) {\n        linkageConfig.forEach((config) => {\n          let keys = getLinkageKeys(config.key, []);\n          // 多个key共享一个，引用地址\n          let configItem = {\n            ...config,\n            keys,\n            optionsMap: new Map(),\n          };\n          keys.forEach((k) => data.innerLinkageConfig.set(k, configItem));\n        });\n      }\n    },\n    { immediate: true }\n  );\n\n  // 获取联动的key顺序\n  function getLinkageKeys(key: string, keys: string[]): string[] {\n    let col = props.columns?.find((col: JVxeColumn) => col.key === key) as JVxeColumn;\n    if (col) {\n      keys.push(col.key);\n      // 寻找下级\n      if (col.linkageKey) {\n        return getLinkageKeys(col.linkageKey, keys);\n      }\n    }\n    return keys;\n  }\n\n  // 处理联动回显数据\n  function handleLinkageBackData(row) {\n    if (data.innerLinkageConfig.size > 0) {\n      for (let configItem of data.innerLinkageConfig.values()) {\n        autoSetLinkageOptionsByData(row, '', configItem, 0);\n      }\n    }\n  }\n\n  /** 【多级联动】获取同级联动下拉选项 */\n  function getLinkageOptionsSibling(row, col, config, request) {\n    // 如果当前列不是顶级列\n    let key = '';\n    if (col.key !== config.key) {\n      // 就找出联动上级列\n      let idx = config.keys.findIndex((k) => col.key === k);\n      let parentKey = config.keys[idx - 1];\n      key = row[parentKey];\n      // 如果联动上级列没有选择数据，就直接返回空数组\n      if (key === '' || key == null) {\n        return [];\n      }\n    } else {\n      key = 'root';\n    }\n    let options = config.optionsMap.get(key);\n    if (!Array.isArray(options)) {\n      if (request) {\n        let parent = key === 'root' ? '' : key;\n        return getLinkageOptionsAsync(config, parent);\n      } else {\n        options = [];\n      }\n    }\n    return options;\n  }\n\n  /** 【多级联动】获取联动下拉选项（异步） */\n  function getLinkageOptionsAsync(config, parent) {\n    return new Promise((resolve) => {\n      let key = parent ? parent : 'root';\n      let options;\n      if (config.optionsMap.has(key)) {\n        options = config.optionsMap.get(key);\n        if (isPromise(options)) {\n          options.then((opt) => {\n            config.optionsMap.set(key, opt);\n            resolve(opt);\n          });\n        } else {\n          resolve(options);\n        }\n      } else if (isFunction(config.requestData)) {\n        // 调用requestData方法，通过传入parent来获取子级\n        // noinspection JSVoidFunctionReturnValueUsed,TypeScriptValidateJSTypes\n        let promise = config.requestData(parent);\n        config.optionsMap.set(key, promise);\n        promise.then((opt) => {\n          config.optionsMap.set(key, opt);\n          resolve(opt);\n        });\n      } else {\n        resolve([]);\n      }\n    });\n  }\n\n  // 【多级联动】 用于回显数据，自动填充 optionsMap\n  function autoSetLinkageOptionsByData(data, parent, config, level) {\n    if (level === 0) {\n      getLinkageOptionsAsync(config, '');\n    } else {\n      getLinkageOptionsAsync(config, parent);\n    }\n    if (config.keys.length - 1 > level) {\n      let value = data[config.keys[level]];\n      if (value) {\n        autoSetLinkageOptionsByData(data, value, config, level + 1);\n      }\n    }\n  }\n\n  // 【多级联动】联动组件change时，清空下级组件\n  function handleLinkageSelectChange(row, col, config, value) {\n    if (col.linkageKey) {\n      getLinkageOptionsAsync(config, value);\n      let idx = config.keys.findIndex((k) => k === col.key);\n      let values = {};\n      for (let i = idx; i < config.keys.length; i++) {\n        values[config.keys[i]] = '';\n      }\n      // 清空后几列的数据\n      methods.setValues([{ rowKey: row.id, values }]);\n    }\n  }\n\n  return {\n    getLinkageOptionsAsync,\n    getLinkageOptionsSibling,\n    handleLinkageSelectChange,\n    handleLinkageBackData,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/hooks/useMethods.ts",
    "content": "import { Ref, watch } from 'vue';\nimport XEUtils from 'xe-utils';\nimport { simpleDebounce } from '/@/utils/common/compUtils';\nimport { JVxeDataProps, JVxeRefs, JVxeTableProps, JVxeTypes } from '../types';\nimport { getEnhanced } from '../utils/enhancedUtils';\nimport { VxeTableInstance, VxeTablePrivateMethods } from 'vxe-table';\nimport { cloneDeep } from 'lodash-es';\nimport { isArray, isEmpty, isNull, isString } from '/@/utils/is';\nimport { useLinkage } from './useLinkage';\nimport { useWebSocket } from './useWebSocket';\nimport { getPrefix, getJVxeAuths } from '../utils/authUtils';\nimport { excludeKeywords } from '../componentMap';\nimport { useColumnsCache } from './useColumnsCache';\nimport { isEnabledVirtualYScroll } from '/@/components/jeecg/JVxeTable/utils';\n\nexport function useMethods(props: JVxeTableProps, { emit }, data: JVxeDataProps, refs: JVxeRefs, instanceRef: Ref) {\n  let xTableTemp: VxeTableInstance & VxeTablePrivateMethods;\n\n  function getXTable() {\n    if (!xTableTemp) {\n      // !. 为 typescript 的非空断言\n      xTableTemp = refs.gridRef.value!.getRefMaps().refTable.value;\n    }\n    return xTableTemp;\n  }\n\n  // noinspection JSUnusedGlobalSymbols\n  const hookMethods = {\n    getXTable,\n    addRows,\n    pushRows,\n    insertRows,\n    addOrInsert,\n    setValues,\n    getValues,\n    getTableData,\n    getNewData,\n    getNewDataWithId,\n    getIfRowById,\n    getNewRowById,\n    getDeleteData,\n    getSelectionData,\n    getSelectedData,\n    removeRows,\n    removeRowsById,\n    removeSelection,\n    resetScrollTop,\n    validateTable,\n    fullValidateTable,\n    clearSelection,\n    filterNewRows,\n    isDisabledRow,\n    recalcDisableRows,\n    rowResort,\n  };\n\n  // 多级联动\n  const linkageMethods = useLinkage(props, data, hookMethods);\n  // WebSocket 无痕刷新\n  const socketMethods = useWebSocket(props, data, hookMethods);\n\n  // 可显式供外部调用的方法\n  const publicMethods = {\n    ...hookMethods,\n    ...linkageMethods,\n    ...socketMethods,\n  };\n\n  /** 监听vxe滚动条位置 */\n  function handleVxeScroll(event) {\n    let { scroll } = data;\n\n    // 记录滚动条的位置\n    scroll.top = event.scrollTop;\n    scroll.left = event.scrollLeft;\n\n    refs.subPopoverRef.value?.close();\n    data.scrolling.value = true;\n    closeScrolling();\n  }\n\n  // 当手动勾选单选时触发的事件\n  function handleVxeRadioChange(event) {\n    let row = event.$table.getRadioRecord();\n    data.selectedRows.value = row ? [row] : [];\n    handleSelectChange('radio', data.selectedRows.value, event);\n  }\n\n  // 当手动勾选全选时触发的事件\n  function handleVxeCheckboxAll(event) {\n    data.selectedRows.value = event.$table.getCheckboxRecords();\n    handleSelectChange('checkbox-all', data.selectedRows.value, event);\n  }\n\n  // 当手动勾选并且值发生改变时触发的事件\n  function handleVxeCheckboxChange(event) {\n    data.selectedRows.value = event.$table.getCheckboxRecords();\n    handleSelectChange('checkbox', data.selectedRows.value, event);\n  }\n\n  // 行选择change事件\n  function handleSelectChange(type, selectedRows, $event) {\n    let action;\n    if (type === 'radio') {\n      action = 'selected';\n    } else if (type === 'checkbox') {\n      action = selectedRows.includes($event.row) ? 'selected' : 'unselected';\n    } else {\n      action = 'selected-all';\n    }\n\n    data.selectedRowIds.value = selectedRows.map((row) => row.id);\n    trigger('selectRowChange', {\n      type: type,\n      action: action,\n      $event: $event,\n      row: $event.row,\n      selectedRows: data.selectedRows.value,\n      selectedRowIds: data.selectedRowIds.value,\n    });\n  }\n\n  // 点击单元格时触发的事件\n  function handleCellClick(event) {\n    let { row, column, $event, $table } = event;\n\n    // 点击了可编辑的\n    if (column.editRender) {\n      refs.subPopoverRef.value?.close();\n      return;\n    }\n\n    // 显示详细信息\n    if (column.params?.showDetails) {\n      refs.detailsModalRef.value?.open(event);\n    } else if (refs.subPopoverRef.value) {\n      refs.subPopoverRef.value.toggle(event);\n    } else if (props.clickSelectRow) {\n      let className = $event.target.className || '';\n      className = isString(className) ? className : className.toString();\n      // 点击的是expand，不做处理\n      if (className.includes('vxe-table--expand-btn')) {\n        return;\n      }\n      // 点击的是checkbox，不做处理\n      if (className.includes('vxe-checkbox--icon') || className.includes('vxe-cell--checkbox')) {\n        return;\n      }\n      // 点击的是radio，不做处理\n      if (className.includes('vxe-radio--icon') || className.includes('vxe-cell--radio')) {\n        return;\n      }\n\n      // 代码逻辑说明: 【issues/9038】JVxeTable表格点击行选择BUG---\n      if(!data.disabledRowIds.includes(row.id)){\n        if (props.rowSelectionType === 'radio') {\n          $table.setRadioRow(row);\n          handleVxeRadioChange(event);\n        } else {\n          $table.toggleCheckboxRow(row);\n          handleVxeCheckboxChange(event);\n        }\n      }\n\n    }\n  }\n\n  // 单元格被激活编辑时会触发该事件\n  function handleEditActived({ column }) {\n    // 执行增强\n    getEnhanced(column.params.type).aopEvents.editActived!.apply(instanceRef.value, arguments as any);\n  }\n\n  // 单元格编辑状态下被关闭时会触发该事件\n  function handleEditClosed({ column }) {\n    // 执行增强\n    getEnhanced(column.params.type).aopEvents.editClosed!.apply(instanceRef.value, arguments as any);\n  }\n\n  // 返回值决定行是否可选中\n  function handleCheckMethod({ row }) {\n    if (props.disabled) {\n      return false;\n    }\n    return !data.disabledRowIds.includes(row.id);\n  }\n\n  // 返回值决定单元格是否可以编辑\n  function handleActiveMethod({ row, column }) {\n    let flag = (() => {\n      if (props.disabled) {\n        return false;\n      }\n      if (data.disabledRowIds.includes(row.id)) {\n        return false;\n      }\n      if (column.params?.disabled) {\n        return false;\n      }\n      // 执行增强\n      return getEnhanced(column.params.type).aopEvents.activeMethod!.apply(instanceRef.value, arguments as any) ?? true;\n    })();\n    if (!flag) {\n      // -update-begin--author:liaozhiyang---date:20240619---for：【TV360X-1404】vxetable警告\n      getXTable().clearEdit();\n      // -update-end--author:liaozhiyang---date:20240619---for：【TV360X-1404】vxetable警告\n    }\n    return flag;\n  }\n\n  /**\n   * 判断是否是禁用行\n   * @param row 行数据\n   * @param rowIndex 行号\n   * @param force 是否强制判断\n   */\n  function isDisabledRow(row, rowIndex: number | boolean = -1, force = true) {\n    if(typeof rowIndex === 'boolean'){\n      force = rowIndex;\n      rowIndex = -1;\n    }\n    if (!force) {\n      return !data.disabledRowIds.includes(row.id);\n    }\n    if (props.disabledRows == null || isEmpty(props.disabledRows)) {\n      return false;\n    }\n    let disabled: boolean = false;\n    let keys: string[] = Object.keys(props.disabledRows);\n    for (const key of keys) {\n      // 判断是否有该属性\n      if (row.hasOwnProperty(key)) {\n        let value = row[key];\n        let temp: any = props.disabledRows![key];\n        // 禁用规则可以是一个函数\n        if (typeof temp === 'function') {\n          disabled = temp(value, row, rowIndex);\n        } else if (isArray(temp)) {\n          // 禁用规则可以是一个数组\n          disabled = temp.includes(value);\n        } else {\n          // 禁用规则可以是一个具体值\n          disabled = temp === value;\n        }\n        if (disabled) {\n          break;\n        }\n      }\n    }\n    return disabled;\n  }\n\n  // 重新计算禁用行\n  function recalcDisableRows() {\n    let xTable = getXTable();\n    data.disabledRowIds = [];\n    const { tableFullData } = xTable.internalData;\n    tableFullData.forEach((row, rowIndex) => {\n      // 判断是否是禁用行\n      if (isDisabledRow(row, rowIndex)) {\n        data.disabledRowIds.push(row.id);\n      }\n    });\n    xTable.updateData();\n  }\n\n  // 监听 disabledRows，更改时重新计算禁用行\n  watch(\n    () => props.disabledRows,\n    () => recalcDisableRows()\n  );\n\n  // 返回值决定是否允许展开、收起行\n  function handleExpandToggleMethod({ expanded }) {\n    return !(expanded && props.disabled);\n  }\n\n  // 设置 data.scrolling 防抖模式\n  const closeScrolling = simpleDebounce(function () {\n    data.scrolling.value = false;\n  }, 100);\n\n  /** 表尾数据处理方法，用于显示统计信息 */\n  function handleFooterMethod({ columns, data: $data }) {\n    const { statistics } = data;\n    let footers: any[] = [];\n    if (statistics.has) {\n      if (statistics.sum.length > 0) {\n        footers.push(\n          getFooterStatisticsMap({\n            columns: columns,\n            title: '合计',\n            checks: statistics.sum,\n            method: (column) => XEUtils.sum($data, column.property),\n          })\n        );\n      }\n      if (statistics.average.length > 0) {\n        footers.push(\n          getFooterStatisticsMap({\n            columns: columns,\n            title: '平均',\n            checks: statistics.average,\n            method: (column) => XEUtils.mean($data, column.property),\n          })\n        );\n      }\n    }\n    return footers;\n  }\n\n  /** 获取底部统计Map */\n  function getFooterStatisticsMap({ columns, title, checks, method }) {\n    return columns.map((column, columnIndex) => {\n      if (columnIndex === 0) {\n        return title;\n      }\n      if (checks.includes(column.property)) {\n        return method(column, columnIndex);\n      }\n      return null;\n    });\n  }\n\n  // 创建新行，自动添加默认值\n  function createRow(record: Recordable = {}) {\n    let xTable = getXTable();\n    // 添加默认值\n    xTable.internalData.tableFullColumn.forEach((column) => {\n      let col = column.params;\n      // 不能被注册的列不获取增强\n      if (col && !excludeKeywords.includes(col.type)) {\n        if (col.key && (record[col.key] == null || record[col.key] === '')) {\n          // 设置默认值\n          let createValue = getEnhanced(col.type).createValue;\n          let defaultValue = col.defaultValue ?? '';\n          let ctx = { context: { row: record, column, $table: xTable } };\n          record[col.key] = createValue(defaultValue, ctx);\n        }\n        // 处理联动列\n        if (col.type === JVxeTypes.select && data.innerLinkageConfig.size > 0) {\n          // 判断当前列是否是联动列\n          if (data.innerLinkageConfig.has(col.key)) {\n            let configItem = data.innerLinkageConfig.get(col.key);\n            linkageMethods.getLinkageOptionsAsync(configItem, '');\n          }\n        }\n      } else if (col?.type === JVxeTypes.hidden) {\n        record[col.key] = col.defaultValue ?? '';\n      }\n    });\n    return record;\n  }\n\n  async function addOrInsert(rows: Recordable | Recordable[] = {}, index, triggerName, options?: IAddRowsOptions) {\n    let xTable = getXTable();\n    let records;\n    if (isArray(rows)) {\n      records = rows;\n    } else {\n      records = [rows];\n    }\n    // 遍历添加默认值\n    records.forEach((record) => createRow(record));\n    let setActive = options?.setActive ?? props.addSetActive ?? true;\n    let result = await pushRows(records, { index: index, setActive });\n    // 遍历插入的行\n    // online js增强时以传过来值为准，不再赋默认值\n    if (!(options?.isOnlineJS ?? false)) {\n      if (triggerName != null) {\n        for (let i = 0; i < result.rows.length; i++) {\n          let row = result.rows[i];\n          trigger(triggerName, {\n            row: row,\n            rows: result.rows,\n            insertIndex: index,\n            $table: xTable,\n            target: instanceRef.value,\n            isModalData: options?.isModalData\n          });\n        }\n      }\n    }\n    return result;\n  }\n\n  // 新增、插入一行时的可选参数\n  interface IAddRowsOptions {\n    // 是否是 onlineJS增强 触发的\n    isOnlineJS?: boolean;\n    // 是否激活编辑状态\n    setActive?: boolean;\n    //是否需要触发change事件\n    emitChange?:boolean\n    // 是否是modal弹窗添加的数据\n    isModalData?:boolean\n  }\n\n  /**\n   * 添加一行或多行\n   *\n   * @param rows\n   * @param options 参数\n   * @return\n   */\n  async function addRows(rows: Recordable | Recordable[] = {}, options?: IAddRowsOptions) {\n    // 代码逻辑说明: VUEN-1892【online子表弹框】有主从关联js时，子表弹框修改了数据，主表字段未修改\n    let result = await addOrInsert(rows, -1, 'added', options);\n    if(options && options!.emitChange==true){\n      trigger('valueChange', {column: 'all', row: result.row})\n    }\n    // 代码逻辑说明: 【TV360X-279】行编辑添加新字段滚动对应位置\n    let xTable = getXTable();\n    setTimeout(() => {\n      xTable.scrollToRow(result.row);\n    }, 0);\n    return result;\n  }\n\n  /**\n   * 添加一行或多行临时数据，不会填充默认值，传什么就添加进去什么\n   * @param rows\n   * @param options 选项\n   * @param options.setActive 是否激活最后一行的编辑模式\n   */\n  async function pushRows(rows: Recordable | Recordable[] = {}, options = { setActive: false, index: -1 }) {\n    let xTable = getXTable();\n    let { setActive, index } = options;\n    index = index === -1 ? index : xTable.internalData.tableFullData[index];\n    index = index == null ? -1 : index;\n    // 插入行\n    let result = await xTable.insertAt(rows, index);\n    if (setActive) {\n      // -update-begin--author:liaozhiyang---date:20240619---for：【TV360X-1404】vxetable警告\n      // 激活最后一行的编辑模式\n      xTable.setEditRow(result.rows[result.rows.length - 1], true);\n      // -update-end--author:liaozhiyang---date:20240619---for：【TV360X-1404】vxetable警告\n    }\n    await recalcSortNumber();\n    return result;\n  }\n\n  /**\n   * 插入一行或多行临时数据\n   *\n   * @param rows\n   * @param index 添加下标，数字，必填\n   * @param options 参数\n   * @return\n   */\n  function insertRows(rows: Recordable | Recordable[] = {}, index: number, options?: IAddRowsOptions) {\n    if (index < 0) {\n      console.warn(`【JVxeTable】insertRows：index必须传递数字，且大于-1`);\n      return;\n    }\n    return addOrInsert(rows, index, 'inserted', options);\n  }\n\n  /** 获取表格表单里的值 */\n  function getValues(callback, rowIds) {\n    let tableData = getTableData({ rowIds: rowIds });\n    // 代码逻辑说明: 【issues/7631】JVxeTable组件的getValues回调函数参数修正\n    callback(tableData, tableData);\n  }\n\n  type getTableDataOptions = {\n    rowIds?: string[];\n    // 是否保留新行的id\n    keepNewId?: boolean;\n  }\n\n  /** 获取表格数据 */\n  function getTableData(options: getTableDataOptions = {}) {\n    let { rowIds } = options;\n    let tableData;\n    // 仅查询指定id的行\n    if (isArray(rowIds) && rowIds.length > 0) {\n      tableData = [];\n      rowIds.forEach((rowId) => {\n        let { row } = getIfRowById(rowId);\n        if (row) {\n          tableData.push(row);\n        }\n      });\n    } else {\n      // 查询所有行\n      tableData = getXTable().getTableData().fullData;\n    }\n    return filterNewRows(tableData, {\n      keepNewId: options.keepNewId ?? false,\n      removeNewLine: false,\n    });\n  }\n\n  /** 仅获取新增的数据 */\n  function getNewData() {\n    let newData = getNewDataWithId();\n    newData.forEach((row) => delete row.id);\n    return newData;\n  }\n\n  /** 仅获取新增的数据,带有id */\n  function getNewDataWithId() {\n    let xTable = getXTable();\n    return cloneDeep(xTable.getInsertRecords());\n  }\n\n  /** 根据ID获取行，新增的行也能查出来 */\n  function getIfRowById(id) {\n    let xTable = getXTable();\n    let row = xTable.getRowById(id),\n      isNew = false;\n    if (!row) {\n      row = getNewRowById(id);\n      if (!row) {\n        console.warn(`JVxeTable.getIfRowById：没有找到id为\"${id}\"的行`);\n        return { row: null };\n      }\n      isNew = true;\n    }\n    return { row, isNew };\n  }\n\n  /** 通过临时ID获取新增的行 */\n  function getNewRowById(id) {\n    let records = getXTable().getInsertRecords();\n    for (let record of records) {\n      if (record.id === id) {\n        return record;\n      }\n    }\n    return null;\n  }\n\n  type filterNewRowsOptions = {\n    keepNewId?: boolean;\n    removeNewLine?: boolean;\n  } | boolean\n\n  /**\n   * 过滤添加的行\n   * @param rows 要筛选的行数据\n   * @param optOrRm 如果传 boolean 则是 removeNewLine 参数（true = 删除新增，false=只删除id），如果传对象则是配置参数\n   * @param handler function\n   */\n  function filterNewRows(rows, optOrRm:filterNewRowsOptions = true, handler?: Fn) {\n    let insertRecords = getXTable().getInsertRecords();\n    let records: Recordable[] = [];\n    optOrRm = typeof optOrRm === 'boolean' ? { removeNewLine: optOrRm } : optOrRm;\n    // true = 删除新增，false=只删除id\n    let removeNewLine = optOrRm?.removeNewLine ?? true;\n    for (let row of rows) {\n      let item = cloneDeep(row);\n      if (insertRecords.includes(row)) {\n        handler ? handler({ item, row, insertRecords }) : null;\n        if (removeNewLine) {\n          continue;\n        }\n        if (!optOrRm?.keepNewId) {\n          delete item.id;\n        }\n      }\n      records.push(item);\n    }\n    return records;\n  }\n\n  /**\n   * 重置滚动条Top位置\n   * @param top 新top位置，留空则滚动到上次记录的位置，用于解决切换tab选项卡时导致白屏以及自动将滚动条滚动到顶部的问题\n   */\n  function resetScrollTop(top?) {\n    let xTable = getXTable();\n    xTable.scrollTo(null, top == null || top === '' ? data.scroll.top : top);\n  }\n\n  /** 校验table，失败返回errMap，成功返回null */\n  async function validateTable(rows?) {\n    let xTable = getXTable();\n    const errMap = await xTable.validate(rows ?? true).catch((errMap) => errMap);\n    return errMap ? errMap : null;\n  }\n\n  /** 完整校验 */\n  async function fullValidateTable(rows?) {\n    let xTable = getXTable();\n    const errMap = await xTable.fullValidate(rows ?? true).catch((errMap) => errMap);\n    return errMap ? errMap : null;\n  }\n\n  type setValuesParam = { rowKey: string; values: Recordable };\n\n  /**\n   * 设置某行某列的值\n   *\n   * @param values\n   * @return 返回受影响的单元格数量\n   */\n  function setValues(values: setValuesParam[]): number {\n    if (!isArray(values)) {\n      console.warn(`[JVxeTable] setValues 必须传递数组`);\n      return 0;\n    }\n    let xTable = getXTable();\n    let count = 0;\n    values.forEach((item) => {\n      let { rowKey, values: record } = item;\n      let { row } = getIfRowById(rowKey);\n      if (!row) {\n        return;\n      }\n      Object.keys(record).forEach((colKey) => {\n        let column = xTable.getColumnByField(colKey);\n        if (column) {\n          let oldValue = row[colKey];\n          let newValue = record[colKey];\n          if (newValue !== oldValue) {\n            row[colKey] = newValue;\n            // 触发 valueChange 事件\n            trigger('valueChange', {\n              type: column.params.type,\n              value: newValue,\n              oldValue: oldValue,\n              col: column.params,\n              column: column,\n              isSetValues: true,\n              row: {...row}\n            });\n            count++;\n          }\n        } else {\n          console.warn(`[JVxeTable] setValues 没有找到key为\"${colKey}\"的列`);\n        }\n      });\n    });\n    if (count > 0) {\n      xTable.updateData();\n    }\n    return count;\n  }\n\n  /** 清空选择行 */\n  async function clearSelection() {\n    const xTable = getXTable();\n    let event = { $table: xTable, target: instanceRef.value };\n    if (['radio', JVxeTypes.rowRadio].includes(props.rowSelectionType ?? '')) {\n      await xTable.clearRadioRow();\n      handleVxeRadioChange(event);\n    } else {\n      await xTable.clearCheckboxRow();\n      handleVxeCheckboxChange(event);\n    }\n  }\n\n  /**\n   * 获取选中数据\n   * @param isFull 如果 isFull=true 则获取全表已选中的数据\n   */\n  function getSelectionData(isFull?: boolean) {\n    const xTable = getXTable();\n    if (['radio', JVxeTypes.rowRadio].includes(props.rowSelectionType ?? '')) {\n      let row = xTable.getRadioRecord(isFull);\n      if (isNull(row)) {\n        return [];\n      }\n      return filterNewRows([row], false);\n    } else {\n      return filterNewRows(xTable.getCheckboxRecords(isFull), false);\n    }\n  }\n\n  /** 仅获取被删除的数据（新增又被删除的数据不会被获取到） */\n  function getDeleteData() {\n    return filterNewRows(getXTable().getRemoveRecords(), false);\n  }\n\n  /** 删除一行或多行数据 */\n  async function removeRows(rows, asyncRemove = false) {\n    // 代码逻辑说明: vxe-table removeRows方法加上异步删除\n    const xTable = getXTable();\n    const removeEvent: any = { deleteRows: rows, $table: xTable };\n    if (asyncRemove) {\n      const selectedRows = Array.isArray(rows) ? rows : [rows];\n      const deleteOldRows = filterNewRows(selectedRows);\n      if (deleteOldRows.length) {\n        return new Promise((resolve) => {\n          // 确认删除，只有调用这个方法才会真删除\n          removeEvent.confirmRemove = async () => {\n            const insertRecords = xTable.getInsertRecords();\n            selectedRows.forEach((item) => {\n              // 删除新添加的数据id\n              if (insertRecords.includes(item)) {\n                delete item.id;\n              }\n            });\n            const res = await xTable.remove(rows);\n            await recalcSortNumber();\n            resolve(res);\n          };\n          trigger('removed', removeEvent);\n        });\n      } else {\n        // 全新的行立马删除，不等待。\n        const res = await xTable.remove(rows);\n        removeEvent.confirmRemove = () => {};\n        trigger('removed', removeEvent);\n        await recalcSortNumber();\n        return res;\n      }\n    } else {\n      const res = await xTable.remove(rows);\n      trigger('removed', removeEvent);\n      await recalcSortNumber();\n      return res;\n    }\n  }\n\n  /** 根据id删除一行或多行 */\n  function removeRowsById(rowId) {\n    let rowIds;\n    if (isArray(rowId)) {\n      rowIds = rowId;\n    } else {\n      rowIds = [rowId];\n    }\n    let rows = rowIds\n      .map((id) => {\n        let { row } = getIfRowById(id);\n        if (!row) {\n          return;\n        }\n        if (row) {\n          return row;\n        } else {\n          console.warn(`【JVxeTable】removeRowsById：${id}不存在`);\n          return null;\n        }\n      })\n      .filter((row) => row != null);\n    return removeRows(rows);\n  }\n\n  // 删除选中的数据\n  async function removeSelection() {\n    let xTable = getXTable();\n    let res;\n    if (['radio', JVxeTypes.rowRadio].includes(props.rowSelectionType ?? '')) {\n      res = await xTable.removeRadioRow();\n    } else {\n      res = await xTable.removeCheckboxRow();\n    }\n    await clearSelection();\n    await recalcSortNumber();\n    return res;\n  }\n\n  /** 重新计算排序字段的数值 */\n  async function recalcSortNumber(force = false) {\n    if (props.dragSort || force) {\n      let xTable = getXTable();\n      let sortKey = props.sortKey ?? 'orderNum';\n      let sortBegin = props.sortBegin ?? 0;\n      xTable.internalData.tableFullData.forEach((data) => (data[sortKey] = sortBegin++));\n      // 4.1.0\n      //await xTable.updateCache();\n      // 4.1.1\n      await xTable.cacheRowMap(true)\n      return await xTable.updateData();\n    }\n  }\n\n  /**\n   * 排序表格\n   * @param oldIndex\n   * @param newIndex\n   * @param force 强制排序\n   */\n  async function doSort(oldIndex: number, newIndex: number, force = false) {\n    if (props.dragSort || force) {\n      let xTable = getXTable();\n      let sort = (array) => {\n        // 存储old数据，并删除该项\n        let row = array.splice(oldIndex, 1)[0];\n        // 向newIndex处添加old数据\n        array.splice(newIndex, 0, row);\n      };\n      sort(xTable.internalData.tableFullData);\n      if (xTable.keepSource) {\n        sort(xTable.internalData.tableSourceData);\n      }\n      // -update-begin--author:liaozhiyang---date:20240620---for：【TV360X-585】拖动字段虚拟滚动不好使\n      if (isEnabledVirtualYScroll(props, xTable)) {\n        await xTable.loadData(xTable.internalData.tableFullData);\n      }\n      // -update-end--author:liaozhiyang---date:20240620---for：【TV360X-585】拖动字段虚拟滚动不好使\n      return await recalcSortNumber(force);\n    }\n  }\n\n  /** 行重新排序 */\n  function rowResort(oldIndex: number, newIndex: number) {\n    return doSort(oldIndex, newIndex, true);\n  }\n\n  // ---------------- begin 权限控制 ----------------\n  // 加载权限\n  function loadAuthsMap() {\n    if (!props.authPre || props.authPre.length == 0) {\n      data.authsMap.value = null;\n    } else {\n      data.authsMap.value = getJVxeAuths(props.authPre);\n    }\n  }\n\n  /**\n   * 根据 权限code 获取权限\n   * @param authCode\n   */\n  function getAuth(authCode) {\n    if (data.authsMap.value != null && props.authPre) {\n      let prefix = getPrefix(props.authPre);\n      return data.authsMap.value.get(prefix + authCode);\n    }\n    return null;\n  }\n\n  // 获取列权限\n  function getColAuth(key: string) {\n    return getAuth(key);\n  }\n\n  // 判断按钮权限\n  function hasBtnAuth(key: string) {\n    return getAuth('btn:' + key)?.isAuth ?? true;\n  }\n\n  // ---------------- end 权限控制 ----------------\n\n  /* --- 辅助方法 ---*/\n\n  function created() {\n    loadAuthsMap();\n  }\n\n  // 触发事件\n  function trigger(name, event: any = {}) {\n    event.$target = instanceRef.value;\n    event.$table = getXTable();\n    //online增强参数兼容\n    event.target = instanceRef.value;\n    emit(name, event);\n  }\n\n  /**\n   * 获取选中的行-和 getSelectionData 区别在于对于新增的行也会返回ID\n   * 用于onlinePopForm\n   * @param isFull\n   */\n  function getSelectedData(isFull?: boolean) {\n    const xTable = getXTable();\n    let rows:any[] = []\n    if (['radio', JVxeTypes.rowRadio].includes(props.rowSelectionType ?? '')) {\n      let row = xTable.getRadioRecord(isFull);\n      if (isNull(row)) {\n        return [];\n      }\n      rows = [row]\n    } else {\n      rows = xTable.getCheckboxRecords(isFull)\n    }\n    let records: Recordable[] = [];\n    for (let row of rows) {\n      let item = cloneDeep(row);\n      records.push(item);\n    }\n    return records;\n  }\n  /**\n   *  2024-03-21\n   *  liaozhiyang\n   *  VXETable列设置保存缓存字段名\n   * */\n  function handleCustom({ type, $grid }) {\n    const { saveSetting, resetSetting } = useColumnsCache({ cacheColumnsKey: props.cacheColumnsKey });\n    if (type === 'confirm') {\n      saveSetting($grid);\n    } else if (type == 'reset') {\n      resetSetting($grid);\n    }\n  }\n\n  return {\n    methods: {\n      trigger,\n      ...publicMethods,\n      closeScrolling,\n      doSort,\n      recalcSortNumber,\n      handleVxeScroll,\n      handleVxeRadioChange,\n      handleVxeCheckboxAll,\n      handleVxeCheckboxChange,\n      handleFooterMethod,\n      handleCellClick,\n      handleEditActived,\n      handleEditClosed,\n      handleCheckMethod,\n      handleActiveMethod,\n      handleExpandToggleMethod,\n      getColAuth,\n      hasBtnAuth,\n      handleCustom,\n    },\n    publicMethods,\n    created,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/hooks/usePagination.ts",
    "content": "import { computed, reactive, h } from 'vue';\nimport { JVxeTableMethods, JVxeTableProps } from '/@/components/jeecg/JVxeTable/src/types';\nimport { isEmpty } from '/@/utils/is';\nimport { Pagination } from 'ant-design-vue';\n\nexport function usePagination(props: JVxeTableProps, methods: JVxeTableMethods) {\n  const innerPagination = reactive({\n    current: 1,\n    pageSize: 10,\n    pageSizeOptions: ['10', '20', '30'],\n    showTotal: (total, range) => {\n      return range[0] + '-' + range[1] + ' 共 ' + total + ' 条';\n    },\n    showQuickJumper: true,\n    showSizeChanger: true,\n    total: 100,\n  });\n\n  const bindProps = computed(() => {\n    return {\n      ...innerPagination,\n      ...props.pagination,\n      size: props.size === 'tiny' ? 'small' : '',\n    };\n  });\n\n  const boxClass = computed(() => {\n    return {\n      'j-vxe-pagination': true,\n      'show-quick-jumper': !!bindProps.value.showQuickJumper,\n    };\n  });\n\n  function handleChange(current, pageSize) {\n    innerPagination.current = current;\n    methods.trigger('pageChange', { current, pageSize });\n  }\n\n  function handleShowSizeChange(current, pageSize) {\n    innerPagination.pageSize = pageSize;\n    // -update-begin--author:liaozhiyang---date:20251209---for:【issues/9169】切换页码时，pageChange事件加载了两次\n    // 因为 handleShowSizeChange先触发，紧接着会触发 handleChange，所以可以注释掉。\n    // methods.trigger('pageChange', { current, pageSize });\n    // -update-end--author:liaozhiyang---date:20251209---for:【issues/9169】切换页码时，pageChange事件加载了两次\n  }\n\n  /** 渲染分页器 */\n  function renderPagination() {\n    if (props.pagination && !isEmpty(props.pagination)) {\n      return h(\n        'div',\n        {\n          class: boxClass.value,\n        },\n        [\n          h(Pagination, {\n            ...bindProps.value,\n            // 代码逻辑说明: 【issues/8137】vxetable表格禁用后分页隐藏了\n            disabled: false,\n            onChange: handleChange,\n            onShowSizeChange: handleShowSizeChange,\n          }),\n        ]\n      );\n    }\n    return null;\n  }\n\n  return { renderPagination };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/hooks/useRenderComponents.ts",
    "content": "import { h } from 'vue';\nimport { JVxeDataProps, JVxeTableMethods, JVxeTableProps } from '../types';\nimport JVxeSubPopover from '../components/JVxeSubPopover.vue';\nimport JVxeDetailsModal from '../components/JVxeDetailsModal.vue';\nimport { useToolbar } from '/@/components/jeecg/JVxeTable/src/hooks/useToolbar';\nimport { usePagination } from '/@/components/jeecg/JVxeTable/src/hooks/usePagination';\n\nexport function useRenderComponents(props: JVxeTableProps, data: JVxeDataProps, methods: JVxeTableMethods, slots) {\n  // 渲染 toolbar\n  const { renderToolbar } = useToolbar(props, data, methods, slots);\n  // 渲染分页器\n  const { renderPagination } = usePagination(props, methods);\n\n  // 渲染 toolbarAfter 插槽\n  function renderToolbarAfterSlot() {\n    if (slots['toolbarAfter']) {\n      return slots['toolbarAfter']();\n    }\n    return null;\n  }\n\n  // 渲染点击时弹出的子表\n  function renderSubPopover() {\n    if (props.clickRowShowSubForm && slots.subForm) {\n      return h(\n        JVxeSubPopover,\n        {\n          ref: 'subPopoverRef',\n        },\n        {\n          subForm: slots.subForm,\n        }\n      );\n    }\n    return null;\n  }\n\n  // 渲染点击时弹出的详细信息\n  function renderDetailsModal() {\n    if (props.clickRowShowMainForm && slots.mainForm) {\n      return h(\n        JVxeDetailsModal,\n        {\n          ref: 'detailsModalRef',\n          trigger: methods.trigger,\n        },\n        {\n          mainForm: slots.mainForm,\n        }\n      );\n    }\n  }\n\n  return {\n    renderToolbar,\n    renderPagination,\n    renderSubPopover,\n    renderDetailsModal,\n    renderToolbarAfterSlot,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/hooks/useToolbar.ts",
    "content": "import { h } from 'vue';\nimport JVxeToolbar from '../components/JVxeToolbar.vue';\nimport { JVxeDataProps, JVxeTableMethods, JVxeTableProps } from '../types';\n\nexport function useToolbar(props: JVxeTableProps, data: JVxeDataProps, methods: JVxeTableMethods, $slots) {\n  /** 渲染工具栏 */\n  function renderToolbar() {\n    if (props.toolbar) {\n      return h(\n        JVxeToolbar,\n        {\n          size: props.size,\n          disabled: props.disabled,\n          toolbarConfig: props.toolbarConfig,\n          disabledRows: props.disabledRows,\n          hasBtnAuth: methods.hasBtnAuth,\n          selectedRowIds: data.selectedRowIds.value,\n          custom: props.custom,\n          addBtnCfg: props.addBtnCfg,\n          removeBtnCfg: props.removeBtnCfg,\n          // 新增事件\n          onAdd: () => {\n            // 代码逻辑说明: 【TV360X-212】online新增字段就出校验提示\n            setTimeout(() => {\n              methods.addRows();\n            }, 0);\n          },\n          // 保存事件\n          onSave: () => methods.trigger('save'),\n          onRemove() {\n            const $table = methods.getXTable();\n            // 触发删除事件\n            if (data.selectedRows.value.length > 0) {\n              const deleteOldRows = methods.filterNewRows(data.selectedRows.value);\n              const removeEvent: any = { deleteRows: data.selectedRows.value, $table };\n              const insertRecords = $table.getInsertRecords();\n              if (props.asyncRemove && deleteOldRows.length) {\n                data.selectedRows.value.forEach((item) => {\n                  // 删除新添加的数据id\n                  if (insertRecords.includes(item)) {\n                    delete item.id;\n                  }\n                });\n                // 确认删除，只有调用这个方法才会真删除\n                removeEvent.confirmRemove = () => methods.removeSelection();\n              } else {\n                if (props.asyncRemove) {\n                  // asyncRemove删除的只有新增的数据时，防止调用confirmRemove报错\n                  removeEvent.confirmRemove = () => {};\n                }\n                methods.removeSelection();\n              }\n              methods.trigger('removed', removeEvent);\n            } else {\n              methods.removeSelection();\n            }\n          },\n          // 清除选择事件\n          onClearSelection: () => methods.clearSelection(),\n          onRegister: ({ xToolbarRef }) => methods.getXTable().connect(xToolbarRef.value),\n        },\n        {\n          toolbarPrefix: $slots.toolbarPrefix,\n          toolbarSuffix: $slots.toolbarSuffix,\n        }\n      );\n    }\n    return null;\n  }\n\n  return { renderToolbar };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/hooks/useValidateRules.ts",
    "content": "import { VxeTablePropTypes } from 'vxe-table';\nimport { isArray } from '/@/utils/is';\nimport { HandleArgs } from './useColumns';\nimport { replaceProps } from '../utils/enhancedUtils';\n\nexport function useValidateRules(args: HandleArgs) {\n  const { data } = args;\n  const col = args.col!;\n  let rules: VxeTablePropTypes.EditRules[] = [];\n  if (isArray(col.validateRules)) {\n    for (let rule of col.validateRules) {\n      let replace = {\n        message: replaceProps(col, rule.message),\n      };\n      if (rule.unique || rule.pattern === 'only') {\n        // 唯一校验器\n        rule.validator = uniqueValidator(args);\n      } else if (rule.pattern) {\n        // 非空\n        if (rule.pattern === fooPatterns[0].value) {\n          rule.required = true;\n          delete rule.pattern;\n        } else {\n          // 兼容Online表单的特殊规则\n          for (let foo of fooPatterns) {\n            if (foo.value === rule.pattern) {\n              rule.pattern = foo.pattern;\n              break;\n            }\n          }\n        }\n      } else if (typeof rule.handler === 'function') {\n        // 自定义函数校验\n        rule.validator = handlerConvertToValidator;\n      }\n      rules.push(Object.assign({}, rule, replace));\n    }\n  }\n  data.innerEditRules[col.key] = rules;\n}\n\n/** 唯一校验器 */\nfunction uniqueValidator({ methods }: HandleArgs) {\n  return function (event) {\n    const { cellValue, column, rule } = event;\n    // 代码逻辑说明: 【TV360X-299】JVxetable组件中唯一校验过滤掉空字符串\n    if (cellValue == '') return Promise.resolve();\n    let tableData = methods.getTableData();\n    let findCount = 0;\n    for (let rowData of tableData) {\n      if (rowData[column.params.key] === cellValue) {\n        if (++findCount >= 2) {\n          return Promise.reject(new Error(rule.message));\n        }\n      }\n    }\n    return Promise.resolve();\n  };\n}\n\n/** 旧版handler转为新版Validator */\nfunction handlerConvertToValidator(event) {\n  const { column, rule } = event;\n  return new Promise((resolve, reject) => {\n    rule.handler(event, (flag, msg) => {\n      let message = rule.message;\n      if (typeof msg === 'string') {\n        message = replaceProps(column.params, msg);\n      }\n      if (flag == null) {\n        resolve(message);\n      } else if (!!flag) {\n        resolve(message);\n      } else {\n        reject(new Error(message));\n      }\n    });\n  });\n}\n\n// 兼容 online 的规则\nconst fooPatterns = [\n  { title: '非空', value: '*', pattern: /^.+$/ },\n  { title: '6到16位数字', value: 'n6-16', pattern: /^\\d{6,16}$/ },\n  { title: '6到16位任意字符', value: '*6-16', pattern: /^.{6,16}$/ },\n  { title: '6到18位字母', value: 's6-18', pattern: /^[a-z|A-Z]{6,18}$/ },\n  // 代码逻辑说明: VUEN-1160 对多子表，网址校验不正确\n  {\n    title: '网址',\n    value: 'url',\n    pattern: /^((ht|f)tps?):\\/\\/[\\w\\-]+(\\.[\\w\\-]+)+([\\w\\-.,@?^=%&:\\/~+#]*[\\w\\-@?^=%&\\/~+#])?$/,\n  },\n  // 代码逻辑说明: 【TV360X-466】邮箱跟一对第一校验规则一致\n  { title: '电子邮件', value: 'e', pattern: /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$/ },\n  { title: '手机号码', value: 'm', pattern: /^1[3456789]\\d{9}$/ },\n  { title: '邮政编码', value: 'p', pattern: /^\\d{6}$/ },\n  { title: '字母', value: 's', pattern: /^[A-Z|a-z]+$/ },\n  { title: '数字', value: 'n', pattern: /^-?\\d+(\\.?\\d+|\\d?)$/ },\n  { title: '整数', value: 'z', pattern: /^-?\\d+$/ },\n  {\n    title: '金额',\n    value: 'money',\n    pattern: /^(([1-9][0-9]*)|([0]\\.\\d{0,2}|[1-9][0-9]*\\.\\d{0,5}))$/,\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/hooks/useWebSocket.ts",
    "content": "import { watch, onUnmounted } from 'vue';\nimport { buildUUID } from '/@/utils/uuid';\nimport { useGlobSetting } from '/@/hooks/setting';\nimport { useUserStore } from '/@/store/modules/user';\nimport { JVxeDataProps, JVxeTableMethods, JVxeTableProps } from '../types';\nimport { isArray } from '/@/utils/is';\nimport { getToken } from '/@/utils/auth';\n\n// vxe socket\nconst vs = {\n  // 页面唯一 id，用于标识同一用户，不同页面的websocket\n  pageId: buildUUID(),\n  // webSocket 对象\n  ws: null,\n  // 一些常量\n  constants: {\n    // 消息类型\n    TYPE: 'type',\n    // 消息数据\n    DATA: 'data',\n    // 消息类型：心跳检测\n    TYPE_HB: 'heart_beat',\n    // 消息类型：更新vxe table数据\n    TYPE_UVT: 'update_vxe_table',\n  },\n  // 心跳检测\n  heartCheck: {\n    // 间隔时间，间隔多久发送一次心跳消息\n    interval: 10000,\n    // 心跳消息超时时间，心跳消息多久没有回复后重连\n    timeout: 6000,\n    timeoutTimer: -1,\n    clear() {\n      clearTimeout(this.timeoutTimer);\n      return this;\n    },\n    start() {\n      vs.sendMessage(vs.constants.TYPE_HB, '');\n      // 如果超过一定时间还没重置，说明后端主动断开了\n      this.timeoutTimer = window.setTimeout(() => {\n        vs.reconnect();\n      }, this.timeout);\n      return this;\n    },\n    // 心跳消息返回\n    back() {\n      this.clear();\n      window.setTimeout(() => this.start(), this.interval);\n    },\n  },\n\n  /** 初始化 WebSocket */\n  initialWebSocket() {\n    if (this.ws === null) {\n      const userId = useUserStore().getUserInfo?.id;\n      const domainURL = useGlobSetting().uploadUrl!;\n      const domain = domainURL.replace('https://', 'wss://').replace('http://', 'ws://');\n      const url = `${domain}/vxeSocket/${userId}/${this.pageId}`;\n      // 代码逻辑说明: v2.4.6 的 websocket 服务端，存在性能和安全问题。 #3278\n      let token = (getToken() || '') as string;\n      this.ws = new WebSocket(url, [token]);\n      this.ws.onopen = this.on.open.bind(this);\n      this.ws.onerror = this.on.error.bind(this);\n      this.ws.onmessage = this.on.message.bind(this);\n      this.ws.onclose = this.on.close.bind(this);\n    }\n  },\n\n  // 发送消息\n  sendMessage(type, message) {\n    try {\n      let ws = this.ws;\n      if (ws != null && ws.readyState === ws.OPEN) {\n        ws.send(\n          JSON.stringify({\n            type: type,\n            data: message,\n          })\n        );\n      }\n    } catch (err: any) {\n      console.warn('【JVxeWebSocket】发送消息失败：(' + err.code + ')');\n    }\n  },\n\n  /** 绑定全局VXE表格 */\n  tableMap: new Map(),\n  /** 添加绑定 */\n  addBind(map, key, value: VmArgs) {\n    let binds = map.get(key);\n    if (isArray(binds)) {\n      binds.push(value);\n    } else {\n      map.set(key, [value]);\n    }\n  },\n  /** 移除绑定 */\n  removeBind(map, key, value: VmArgs) {\n    let binds = map.get(key);\n    if (isArray(binds)) {\n      for (let i = 0; i < binds.length; i++) {\n        let bind = binds[i];\n        if (bind === value) {\n          binds.splice(i, 1);\n          break;\n        }\n      }\n      if (binds.length === 0) {\n        map.delete(key);\n      }\n    } else {\n      map.delete(key);\n    }\n  },\n  // 呼叫绑定的表单\n  callBind(map, key, callback) {\n    let binds = map.get(key);\n    if (isArray(binds)) {\n      binds.forEach(callback);\n    }\n  },\n\n  lockReconnect: false,\n  /** 尝试重连 */\n  reconnect() {\n    if (this.lockReconnect) return;\n    this.lockReconnect = true;\n    setTimeout(() => {\n      if (this.ws && this.ws.close) {\n        this.ws.close();\n      }\n      this.ws = null;\n      console.info('【JVxeWebSocket】尝试重连...');\n      this.initialWebSocket();\n      this.lockReconnect = false;\n    }, 5000);\n  },\n\n  on: {\n    open() {\n      console.info('【JVxeWebSocket】连接成功');\n      this.heartCheck.start();\n    },\n    error(e) {\n      console.warn('【JVxeWebSocket】连接发生错误:', e);\n      this.reconnect();\n    },\n    message(e) {\n      // 解析消息\n      let json;\n      try {\n        json = JSON.parse(e.data);\n      } catch (e: any) {\n        console.warn('【JVxeWebSocket】收到无法解析的消息:', e.data);\n        return;\n      }\n      let type = json[this.constants.TYPE];\n      let data = json[this.constants.DATA];\n      switch (type) {\n        // 心跳检测\n        case this.constants.TYPE_HB:\n          this.heartCheck.back();\n          break;\n        // 更新form数据\n        case this.constants.TYPE_UVT:\n          this.callBind(this.tableMap, data.socketKey, (args) => this.onVM.onUpdateTable(args, ...data.args));\n          break;\n        default:\n          console.warn('【JVxeWebSocket】收到不识别的消息类型:' + type);\n          break;\n      }\n    },\n    close(e) {\n      console.info('【JVxeWebSocket】连接被关闭:', e);\n      this.reconnect();\n    },\n  },\n\n  onVM: {\n    /** 收到更新表格的消息 */\n    onUpdateTable({ props, data, methods }: VmArgs, row, caseId) {\n      if (data.caseId !== caseId) {\n        const tableRow = methods.getIfRowById(row.id).row;\n        // 局部保更新数据\n        if (tableRow) {\n          if (props.reloadEffect) {\n            data.reloadEffectRowKeysMap[row.id] = true;\n          }\n          Object.assign(tableRow, row, { id: tableRow.id });\n          methods.getXTable().reloadRow(tableRow);\n        }\n      }\n    },\n  },\n} as {\n  ws: Nullable<WebSocket>;\n} & Recordable;\n\ntype VmArgs = {\n  props: JVxeTableProps;\n  data: JVxeDataProps;\n  methods: JVxeTableMethods;\n};\n\nexport function useWebSocket(props: JVxeTableProps, data: JVxeDataProps, methods) {\n  const args: VmArgs = { props, data, methods };\n  watch(\n    () => props.socketReload,\n    (socketReload: boolean) => {\n      if (socketReload) {\n        vs.initialWebSocket();\n        vs.addBind(vs.tableMap, props.socketKey, args);\n      } else {\n        vs.removeBind(vs.tableMap, props.socketKey, args);\n      }\n    },\n    { immediate: true }\n  );\n\n  /** 发送socket消息更新行 */\n  function socketSendUpdateRow(row) {\n    vs.sendMessage(vs.constants.TYPE_UVT, {\n      socketKey: props.socketKey,\n      args: [row, data.caseId],\n    });\n  }\n\n  onUnmounted(() => {\n    vs.removeBind(vs.tableMap, props.socketKey, args);\n  });\n\n  return {\n    socketSendUpdateRow,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/install.ts",
    "content": "import type { App } from 'vue';\n// 引入 vxe-table\nimport 'xe-utils';\nimport VxeUIAll from 'vxe-pc-ui';\nimport VXETable /*Grid*/ from 'vxe-table';\nimport VXETablePluginAntd from 'vxe-table-plugin-antd';\nimport 'vxe-pc-ui/lib/style.css';\nimport 'vxe-table/lib/style.css';\n\nimport JVxeTable from './JVxeTable';\nimport { getEventPath } from '/@/utils/common/compUtils';\nimport { registerAllComponent } from './utils/registerUtils';\nimport { getEnhanced } from './utils/enhancedUtils';\n\nexport function registerJVxeTable(app: App) {\n  // VXETable 全局配置\n  const VXETableSettings = {\n    // z-index 起始值\n    zIndex: 1000,\n    table: {},\n  };\n\n  // 添加事件拦截器 event.clearActived\n  // 比如点击了某个组件的弹出层面板之后，此时被激活单元格不应该被自动关闭，通过返回 false 可以阻止默认的行为。\n  VXETable.interceptor.add('event.clearActived', preventClosingPopUp);\n  VXETable.interceptor.add('event.clearEdit', preventClosingPopUp);\n  // 注册插件\n  VXETable.use(VXETablePluginAntd);\n  // 注册自定义组件\n  registerAllComponent();\n  // 执行注册方法\n  app.use(VxeUIAll);\n  app.use(VXETable, VXETableSettings);\n  app.component('JVxeTable', JVxeTable);\n}\n\n\n/**\n * 阻止行编辑中关闭弹窗\n * @param params\n */\nfunction preventClosingPopUp(this: any, params) {\n  // 获取组件增强\n  let col = params.column.params;\n  // 代码逻辑说明: 【issues/8178】使用原生vxe-table组件编辑模式下失去焦点报错\n  if (col === undefined) {\n    // 说明使用的是纯原生的vxe-table\n    return;\n  }\n  let { $event } = params;\n  const interceptor = getEnhanced(col.type).interceptor;\n  // 执行增强\n  let flag = interceptor['event.clearActived']?.call(this, ...arguments);\n  if (flag === false) {\n    return false;\n  }\n\n  let path = getEventPath($event);\n  for (let p of path) {\n    let className: any = p.className || '';\n    className = typeof className === 'string' ? className : className.toString();\n\n    /* --- 特殊处理以下组件，点击以下标签时不清空编辑状态 --- */\n\n    // 点击的标签是JInputPop\n    if (className.includes('j-input-pop')) {\n      return false;\n    }\n    // 点击的标签是JPopup的弹出层、部门选择、用户选择\n    if (className.includes('j-popup-modal') || className.includes('j-depart-select-modal') || className.includes('j-user-select-modal')) {\n      return false;\n    }\n    // 点击的是日期选择器\n    if (className.includes('j-vxe-date-picker')) {\n      return false;\n    }\n    // 执行增强\n    let flag = interceptor['event.clearActived.className']?.call(this, className, ...arguments);\n    if (flag === false) {\n      return false;\n    }\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/style/index.less",
    "content": "@import 'vxe.const';\n@import 'vxe.dark';\n\n.@{prefix-cls} {\n  // 编辑按钮样式\n  .vxe-cell--edit-icon {\n    border-color: #606266;\n  }\n\n  .sort--active {\n    border-color: @primary-color;\n  }\n\n  // toolbar 样式\n  &-toolbar {\n    &-collapsed {\n      [data-collapse] {\n        display: none;\n      }\n    }\n\n    &-button.div .ant-btn {\n      margin-right: 8px;\n    }\n  }\n\n  // 分页器\n  .j-vxe-pagination {\n    margin-top: 8px;\n    text-align: right;\n\n    .ant-pagination-options-size-changer.ant-select {\n      margin-right: 0;\n    }\n\n    &.show-quick-jumper {\n      .ant-pagination-options-size-changer.ant-select {\n        margin-right: 8px;\n      }\n    }\n  }\n\n  // 更改 header 底色\n  .vxe-table.border--default .vxe-table--header-wrapper,\n  .vxe-table.border--full .vxe-table--header-wrapper,\n  .vxe-table.border--outer .vxe-table--header-wrapper {\n    //background-color: #FFFFFF;\n  }\n\n  // 更改 tooltip 校验失败的颜色\n  .vxe-table--tooltip-wrapper.vxe-table--valid-error {\n    background-color: #f5222d !important;\n  }\n\n  // 更改 输入框 校验失败的颜色\n  .col--valid-error > .vxe-cell > .ant-input,\n  .col--valid-error > .vxe-cell > .ant-select .ant-input,\n  .col--valid-error > .vxe-cell > .ant-select .ant-select-selection,\n  .col--valid-error > .vxe-cell > .ant-input-number,\n  .col--valid-error > .vxe-cell > .ant-cascader-picker .ant-cascader-input,\n  .col--valid-error > .vxe-cell > .ant-calendar-picker .ant-calendar-picker-input,\n  .col--valid-error > .vxe-tree-cell > .ant-input,\n  .col--valid-error > .vxe-tree-cell > .ant-select .ant-input,\n  .col--valid-error > .vxe-tree-cell > .ant-select .ant-select-selection,\n  .col--valid-error > .vxe-tree-cell > .ant-input-number,\n  .col--valid-error > .vxe-tree-cell > .ant-cascader-picker .ant-cascader-input,\n  .col--valid-error > .vxe-tree-cell > .ant-calendar-picker .ant-calendar-picker-input {\n    border-color: #f5222d !important;\n  }\n\n  .vxe-body--row.sortable-ghost,\n  .vxe-body--row.sortable-chosen {\n    background-color: #dfecfb;\n  }\n\n  // ----------- 【VUEN-1691】默认隐藏滚动条，鼠标放上去才显示 -------------------------------------------\n  .vxe-table {\n    //.vxe-table--footer-wrapper.body--wrapper,\n    .vxe-table--body-wrapper.body--wrapper {\n      // overflow-x: hidden;\n    }\n    \n    &:hover {\n      //.vxe-table--footer-wrapper.body--wrapper,\n      .vxe-table--body-wrapper.body--wrapper {\n        // overflow-x: auto;\n      }\n    }\n  }\n  // ----------- 【VUEN-1691】默认隐藏滚动条，鼠标放上去才显示 -------------------------------------------\n\n  // 调整展开/收起图标样式\n  .vxe-table--render-default .vxe-table--expanded .vxe-table--expand-btn {\n    width: 17px;\n    height: 17px;\n  }\n  /*【美化表单】行编辑table的title字体改小一号*/\n  .vxe-header--column.col--ellipsis>.vxe-cell .vxe-cell--title{\n    font-size: 13px;\n  }\n\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/style/reload-effect.less",
    "content": ".j-vxe-reload-effect-box {\n  &,\n  .j-vxe-reload-effect-span {\n    display: inline;\n    height: 100%;\n    position: relative;\n  }\n\n  .j-vxe-reload-effect-span {\n    &.layer-top {\n      display: inline-block;\n      width: 100%;\n\n      position: absolute;\n      z-index: 2;\n      background-color: white;\n\n      transform-origin: 0 0;\n      animation: reload-effect 1.5s forwards;\n    }\n\n    &.layer-bottom {\n      z-index: 1;\n    }\n  }\n\n  // 定义动画\n  @keyframes reload-effect {\n    0% {\n      opacity: 1;\n      transform: rotateX(0);\n    }\n    10% {\n      opacity: 1;\n    }\n    90% {\n      opacity: 0;\n    }\n    100% {\n      opacity: 0;\n      transform: rotateX(180deg);\n    }\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/style/vxe.const.less",
    "content": "//noinspection LessUnresolvedVariable\n@prefix-cls: ~'@{namespace}-j-vxe-table';\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/style/vxe.dark.less",
    "content": "@import 'vxe.const';\n// update-begin--author:liaozhiyang---date:20240313---for：【QQYUN-8493】修正暗黑模式online表单Erp和编辑页面显示不正确\nhtml[data-theme='dark'] { \n  --vxe-table-body-background-color: #151515;\n  --vxe-table-footer-background-color: #151515;\n  --vxe-table-border-color: #606060;\n  --vxe-table-popup-border-color:#606060;\n  --vxe-table-row-hover-background-color:#1e1e1e;\n  --vxe-input-border-color: #606266;\n}\n// update-end--author:liaozhiyang---date:20240313---for：【QQYUN-8493】修正暗黑模式online表单Erp和编辑页面显示不正确\n[data-theme='dark'] .@{prefix-cls} {\n  @fontColor: #c9d1d9;\n  @bgColor: #151515;\n  @borderColor: #606060;\n\n  .vxe-cell--item,\n  .vxe-cell--title,\n  .vxe-cell,\n  .vxe-body--expanded-cell {\n    color: @fontColor;\n  }\n\n  .vxe-toolbar {\n    // update-begin--author:liaozhiyang---date:20240313---for：【QQYUN-8493】修正暗黑模式online表单Erp和编辑页面显示不正确\n    background-color: #1f1f1f;\n    // update-end--author:liaozhiyang---date:20240313---for：【QQYUN-8493】修正暗黑模式online表单Erp和编辑页面显示不正确\n  }\n\n  .vxe-table--render-default .vxe-table--body-wrapper,\n  .vxe-table--render-default .vxe-table--footer-wrapper {\n    background-color: @bgColor;\n  }\n\n  // 外边框\n  .vxe-table--render-default .vxe-table--border-line {\n    border-color: @borderColor;\n  }\n\n  // header 下边框\n  .vxe-table .vxe-table--header-wrapper .vxe-table--header-border-line {\n    border-bottom-color: @borderColor;\n  }\n\n  // footer 上边框\n  .vxe-table--render-default .vxe-table--footer-wrapper {\n    border-top-color: @borderColor;\n  }\n\n  // 展开行 边框\n  .vxe-table--render-default .vxe-body--expanded-column {\n    border-bottom-color: @borderColor;\n  }\n\n  // 行斑马纹\n  .vxe-table--render-default .vxe-body--row.row--stripe {\n    background-color: #1e1e1e;\n  }\n\n  // 行hover\n  .vxe-table--render-default .vxe-body--row.row--hover {\n    background-color: #262626;\n  }\n\n  // 选中行\n  .vxe-table--render-default .vxe-body--row.row--checked {\n    background-color: #44403a;\n\n    &.row--hover {\n      background-color: #59524b;\n    }\n  }\n\n  .vxe-table--render-default.border--default .vxe-table--header-wrapper,\n  .vxe-table--render-default.border--full .vxe-table--header-wrapper,\n  .vxe-table--render-default.border--outer .vxe-table--header-wrapper {\n    background-color: #1d1d1d;\n  }\n\n  .vxe-table--render-default.border--default .vxe-body--column,\n  .vxe-table--render-default.border--default .vxe-footer--column,\n  .vxe-table--render-default.border--default .vxe-header--column,\n  .vxe-table--render-default.border--inner .vxe-body--column,\n  .vxe-table--render-default.border--inner .vxe-footer--column,\n  .vxe-table--render-default.border--inner .vxe-header--column {\n    background-image: linear-gradient(#1d1d1d, #1d1d1d);\n  }\n\n  // 列宽拖动\n  .vxe-header--column .vxe-resizable.is--line:before {\n    background-color: #505050;\n  }\n\n  // checkbox\n  .vxe-custom--option .vxe-checkbox--icon:before,\n  .vxe-export--panel-column-option .vxe-checkbox--icon:before,\n  .vxe-table--filter-option .vxe-checkbox--icon:before,\n  .vxe-table--render-default .vxe-cell--checkbox .vxe-checkbox--icon:before {\n    background-color: @bgColor;\n    border-color: @borderColor;\n  }\n\n  .vxe-toolbar .vxe-custom--option-wrapper {\n    background-color: @bgColor;\n  }\n\n  .vxe-button {\n    background-color: @bgColor;\n    border-color: @borderColor;\n  }\n\n  .vxe-button.type--button:not(.is--disabled):active {\n    background-color: @bgColor;\n  }\n\n  .vxe-toolbar .vxe-custom--wrapper.is--active > .vxe-button {\n    background-color: @bgColor;\n  }\n\n  .vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--footer button {\n    color: @fontColor;\n  }\n}\n\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/types/JVxeComponent.ts",
    "content": "import { ComponentInternalInstance, ExtractPropTypes } from 'vue';\nimport { useJVxeCompProps } from '/@/components/jeecg/JVxeTable/hooks';\n\nexport namespace JVxeComponent {\n  export type Props = ExtractPropTypes<ReturnType<typeof useJVxeCompProps>>;\n\n  interface EnhancedCtx {\n    props?: JVxeComponent.Props;\n    context?: any;\n  }\n\n  /** 组件增强类型 */\n  export interface Enhanced {\n    // 注册参数（详见：https://xuliangzhan_admin.gitee.io/vxe-table/v4/table/renderer/edit）\n    installOptions: {\n      // 自动聚焦的 class 类名\n      autofocus?: string;\n    } & Recordable;\n    // 事件拦截器（用于兼容）\n    interceptor: {\n      // 已实现：event.clearActived\n      // 说明：比如点击了某个组件的弹出层面板之后，此时被激活单元格不应该被自动关闭，通过返回 false 可以阻止默认的行为。\n      'event.clearActived'?: (params, event, target, ctx?: EnhancedCtx) => boolean;\n      // 自定义：event.clearActived.className\n      // 说明：比原生的多了一个参数：className，用于判断点击的元素的样式名（递归到顶层）\n      'event.clearActived.className'?: (params, event, target, ctx?: EnhancedCtx) => boolean;\n    };\n    // 【功能开关】\n    switches: {\n      // 是否使用 editRender 模式（仅当前组件，并非全局）\n      // 如果设为true，则表头上方会出现一个可编辑的图标\n      editRender?: boolean;\n      // false = 组件触发后可视）；true = 组件一直可视\n      visible?: boolean;\n    };\n    // 【切面增强】切面事件处理，一般在某些方法执行后同步执行\n    aopEvents: {\n      // 单元格被激活编辑时会触发该事件\n      editActived?: (this: ComponentInternalInstance, ...args) => any;\n      // 单元格编辑状态下被关闭时会触发该事件\n      editClosed?: (this: ComponentInternalInstance, ...args) => any;\n      // 返回值决定单元格是否可以编辑\n      activeMethod?: (this: ComponentInternalInstance, ...args) => boolean;\n    };\n    // 【翻译增强】可以实现例如select组件保存的value，但是span模式下需要显示成text\n    translate: {\n      // 是否启用翻译\n      enabled?: boolean;\n      /**\n       * 【翻译处理方法】如果handler留空，则使用默认的翻译方法\n       *\n       * @param value 需要翻译的值\n       * @returns{*} 返回翻译后的数据\n       */\n      handler?: (value, ctx?: EnhancedCtx) => any;\n    };\n    /**\n     * 【获取值增强】组件抛出的值\n     *\n     * @param value 保存到数据库里的值\n     * @returns{*} 返回处理后的值\n     */\n    getValue: (value, ctx?: EnhancedCtx) => any;\n    /**\n     * 【设置值增强】设置给组件的值\n     *\n     * @param value 组件触发的值\n     * @returns{*} 返回处理后的值\n     */\n    setValue: (value, ctx?: EnhancedCtx) => any;\n    /**\n     * 【新增行增强】在用户点击新增时触发的事件，返回新行的默认值\n     *\n     * @param defaultValue 默认值\n     * @param row 行数据\n     * @param column 列配置，.params 是用户配置的参数\n     * @param $table vxe 实例\n     * @param renderOptions 渲染选项\n     * @param params 可以在这里获取 $table\n     *\n     * @returns 返回新值\n     */\n    createValue: (defaultValue: any, ctx?: EnhancedCtx) => any;\n  }\n\n  export type EnhancedPartial = Partial<Enhanced>;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/types/JVxeTypes.ts",
    "content": "/** 组件类型 */\nexport enum JVxeTypes {\n  // 行号列\n  rowNumber = 'row-number',\n  // 选择列\n  rowCheckbox = 'row-checkbox',\n  // 单选列\n  rowRadio = 'row-radio',\n  // 展开列\n  rowExpand = 'row-expand',\n  // 上下排序\n  rowDragSort = 'row-drag-sort',\n\n  input = 'input',\n  inputNumber = 'input-number',\n  textarea = 'textarea',\n  select = 'select',\n  date = 'date',\n  datetime = 'datetime',\n  time = 'time',\n  checkbox = 'checkbox',\n  upload = 'upload',\n  // 下拉搜索\n  selectSearch = 'select-search',\n  // 下拉多选\n  selectMultiple = 'select-multiple',\n  // 进度条\n  progress = 'progress',\n  //部门选择\n  departSelect = 'depart-select',\n  //用户选择\n  userSelect = 'user-select',\n\n  // 拖轮Tags（暂无用）\n  tags = 'tags', // TODO 待实现\n\n  slot = 'slot',\n  normal = 'normal',\n  hidden = 'hidden',\n\n  // 以下为自定义组件\n  popup = 'popup',\n  selectDictSearch = 'selectDictSearch',\n  radio = 'radio',\n  image = 'image',\n  file = 'file',\n  // 省市区\n  pca = 'pca',\n}\n\n// 为了防止和 vxe 内置的类型冲突，所以加上一个前缀\n// 前缀是自动加的，代码中直接用就行（JVxeTypes.input）\nexport const JVxeTypePrefix = 'j-';\n\n/** VxeTable 渲染类型 */\nexport enum JVxeRenderType {\n  editer = 'editer',\n  spaner = 'spaner',\n  default = 'default',\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/types/index.ts",
    "content": "import type { Component, Ref, ComputedRef, ExtractPropTypes } from 'vue';\nimport type { VxeColumnProps } from 'vxe-table/types/column';\nimport type { JVxeComponent } from './JVxeComponent';\nimport type { VxeGridInstance, VxeTablePropTypes } from 'vxe-table';\nimport { JVxeTypes } from './JVxeTypes';\nimport { vxeProps } from '../vxe.data';\nimport { useMethods } from '../hooks/useMethods';\nimport { getJVxeAuths } from '../utils/authUtils';\n\nexport type JVxeTableProps = Partial<ExtractPropTypes<ReturnType<typeof vxeProps>>>;\nexport type JVxeTableMethods = ReturnType<typeof useMethods>['methods'];\n\nexport type JVxeVueComponent = {\n  enhanced?: JVxeComponent.EnhancedPartial;\n} & Component;\n\ntype statisticsTypes = 'sum' | 'average';\n\nexport type JVxeColumn = IJVxeColumn & Recordable;\n\n/**\n * JVxe 列配置项\n */\nexport interface IJVxeColumn extends VxeColumnProps {\n  type?: any;\n  // 行唯一标识\n  key: string;\n  // 表单预期值的提示信息，可以使用${...}变量替换文本\n  placeholder?: string;\n  // 默认值\n  defaultValue?: any;\n  // 是否禁用当前列，默认false\n  disabled?: boolean;\n  // 校验规则 TODO 类型待定义\n  validateRules?: any;\n  // 联动下一级的字段key\n  linkageKey?: string;\n  // 自定义传入组件的其他属性\n  props?: Recordable;\n  allowClear?: boolean; // 允许清除\n  // 【inputNumber】是否是统计列，只有 inputNumber 才能设置统计列。统计列：sum 求和；average 平均值\n  statistics?: boolean | [statisticsTypes, statisticsTypes?];\n  // 【select】\n  dictCode?: string; // 字典 code\n  options?: { title?: string; label?: string; text?: string; value: any; disabled?: boolean }[]; // 下拉选项列表\n  allowInput?: boolean; // 允许输入\n  allowSearch?: boolean; // 允许搜索\n  // 【slot】\n  slotName?: string; // 插槽名\n  // 【checkbox】\n  customValue?: [any, any]; // 自定义值\n  defaultChecked?: boolean; // 默认选中\n  // 【upload】 upload\n  btnText?: string; // 上传按钮文字\n  token?: boolean; // 是否传递 token\n  responseName?: string; // 返回取值名称\n  action?: string; // 上传地址\n  allowRemove?: boolean; // 是否允许删除\n  allowDownload?: boolean; // 是否允许下载\n  // 【下拉字典搜索】\n  dict?: string; // 字典表配置信息：数据库表名,显示字段名,存储字段名\n  async?: boolean; // 是否同步模式\n  tipsContent?: string;\n  // 【popup】\n  popupCode?: string;\n  field?: string;\n  orgFields?: string;\n  destFields?: string;\n}\n\nexport interface JVxeRefs {\n  gridRef: Ref<VxeGridInstance | undefined>;\n  subPopoverRef: Ref<any>;\n  detailsModalRef: Ref<any>;\n}\n\nexport interface JVxeDataProps {\n  prefixCls: string;\n  // vxe 实例ID\n  caseId: string;\n  // vxe 最终 columns\n  vxeColumns?: ComputedRef;\n  // vxe 最终 dataSource\n  vxeDataSource: Ref<Recordable[]>;\n  // 记录滚动条位置\n  scroll: { top: number; left: number };\n  // 当前是否正在滚动\n  scrolling: Ref<boolean>;\n  // vxe 默认配置\n  defaultVxeProps: object;\n  // 绑定左侧选择框\n  selectedRows: Ref<any[]>;\n  // 绑定左侧选择框已选择的id\n  selectedRowIds: Ref<string[]>;\n  disabledRowIds: string[];\n  // 统计列配置\n  statistics: {\n    has: boolean;\n    sum: string[];\n    average: string[];\n  };\n  // 所有和当前表格相关的授权信息\n  authsMap: Ref<Nullable<ReturnType<typeof getJVxeAuths>>>;\n  // 内置 EditRules\n  innerEditRules: Recordable<VxeTablePropTypes.EditRules[]>;\n  // 联动下拉选项（用于隔离不同的下拉选项）\n  // 内部联动配置，map\n  innerLinkageConfig: Map<string, any>;\n  // 开启了数据刷新效果的行\n  reloadEffectRowKeysMap: Recordable;\n}\n\nexport interface JVxeLinkageConfig {\n  // 联动第一级的 key\n  key: string;\n  // 获取数据的方法\n  requestData: (parent: string) => Promise<any>;\n}\n\nexport { JVxeTypes };\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/utils/authUtils.ts",
    "content": "/* JVxeTable 行编辑 权限 */\nimport { usePermissionStoreWithOut } from '/@/store/modules/permission';\n\n/**\n * JVxe 专用，获取权限\n * @param prefix\n */\nexport function getJVxeAuths(prefix) {\n  const permissionStore = usePermissionStoreWithOut();\n  prefix = getPrefix(prefix);\n  let { authList, allAuthList } = permissionStore;\n  let authsMap = new Map<string, typeof allAuthList[0]>();\n  if (!prefix || prefix.length == 0) {\n    return authsMap;\n  }\n  // 将所有vxe用到的权限取出来\n  for (let auth of allAuthList) {\n    if (auth.status == '1' && (auth.action || '').startsWith(prefix)) {\n      authsMap.set(auth.action, { ...auth, isAuth: false });\n    }\n  }\n  // 设置是否已授权\n  for (let auth of authList) {\n    let getAuth = authsMap.get(auth.action);\n    if (getAuth != null) {\n      getAuth.isAuth = true;\n    }\n  }\n  // 代码逻辑说明: VUEN-1162 子表按钮没控制\n  let onlineButtonAuths = permissionStore.getOnlineSubTableAuth(prefix);\n  if (onlineButtonAuths && onlineButtonAuths.length > 0) {\n    for (let auth of onlineButtonAuths) {\n      authsMap.set(prefix + 'btn:' + auth, { action: auth, type: 1, status: 1, isAuth: false });\n    }\n  }\n  return authsMap;\n}\n\n/**\n * 获取前缀\n * @param prefix\n */\nexport function getPrefix(prefix: string) {\n  if (prefix && !prefix.endsWith(':')) {\n    return prefix + ':';\n  }\n  return prefix;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/utils/enhancedUtils.ts",
    "content": "import { useDefaultEnhanced } from '../hooks/useJVxeComponent';\nimport { isFunction, isObject, isString } from '/@/utils/is';\nimport { JVxeTypes } from '../types';\nimport { JVxeComponent } from '../types/JVxeComponent';\nimport { componentMap } from '../componentMap';\n\n// 已注册的组件增强\nconst enhancedMap = new Map<JVxeTypes, JVxeComponent.Enhanced>();\n\n/**\n * 获取某个组件的增强\n * @param type JVxeTypes\n */\nexport function getEnhanced(type: JVxeTypes | string): JVxeComponent.Enhanced {\n  let $type: JVxeTypes = <JVxeTypes>type;\n  if (!enhancedMap.has($type)) {\n    let defaultEnhanced = useDefaultEnhanced();\n    if (componentMap.has($type)) {\n      let enhanced = componentMap.get($type)?.enhanced ?? {};\n      if (isObject(enhanced)) {\n        Object.keys(defaultEnhanced).forEach((key) => {\n          let def = defaultEnhanced[key];\n          if (enhanced.hasOwnProperty(key)) {\n            // 方法如果存在就不覆盖\n            if (!isFunction(def) && !isString(def)) {\n              enhanced[key] = Object.assign({}, def, enhanced[key]);\n            }\n          } else {\n            enhanced[key] = def;\n          }\n        });\n        enhancedMap.set($type, <JVxeComponent.Enhanced>enhanced);\n        return <JVxeComponent.Enhanced>enhanced;\n      }\n    } else {\n      throw new Error(`[JVxeTable] ${$type} 组件尚未注册，获取增强失败`);\n    }\n    enhancedMap.set($type, <JVxeComponent.Enhanced>defaultEnhanced);\n  }\n  return <JVxeComponent.Enhanced>enhancedMap.get($type);\n}\n\n/** 辅助方法：替换${...}变量 */\nexport function replaceProps(col, value) {\n  if (value && typeof value === 'string') {\n    let text = value;\n    text = text.replace(/\\${title}/g, col.title);\n    text = text.replace(/\\${key}/g, col.key);\n    text = text.replace(/\\${defaultValue}/g, col.defaultValue);\n    return text;\n  }\n  return value;\n}\n\n\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/utils/registerUtils.ts",
    "content": "import type { Component } from 'vue';\nimport { h } from 'vue';\nimport VXETable from 'vxe-table';\nimport { definedComponent, addComponent, componentMap, spanEnds, excludeKeywords } from '../componentMap';\nimport { JVxeRenderType, JVxeTypePrefix, JVxeTypes } from '../types/JVxeTypes';\nimport { getEnhanced } from './enhancedUtils';\nimport { isFunction } from '/@/utils/is';\n\n/**\n * 判断某个组件是否已注册\n * @param type\n */\nexport function isRegistered(type: JVxeTypes | string) {\n  if (excludeKeywords.includes(<JVxeTypes>type)) {\n    return true;\n  }\n  return componentMap.has(type);\n}\n\n/**\n * 注册vxe自定义组件\n *\n * @param type\n * @param component 编辑状态显示的组件\n * @param spanComponent 非编辑状态显示的组件，可以为空\n */\nexport function registerComponent(type: JVxeTypes, component: Component, spanComponent?: Component) {\n  addComponent(type, component, spanComponent);\n  registerOneComponent(type);\n}\n\n/**\n * 异步注册vxe自定义组件\n *\n * @param type\n * @param promise\n */\nexport async function registerAsyncComponent(type: JVxeTypes, promise: Promise<any>) {\n  const result = await promise;\n  if (isFunction(result.installJVxe)) {\n    result.install((component: Component, spanComponent?: Component) => {\n      addComponent(type, component, spanComponent);\n      registerOneComponent(type);\n    });\n  } else {\n    addComponent(type, result.default);\n    registerOneComponent(type);\n  }\n}\n\n/**\n * 2024-03-08\n * liaozhiyang\n * 异步注册vxe自定义组件\n * 【QQYUN-8241】\n * @param type\n * @param promise\n */\nexport function registerASyncComponentReal(type: JVxeTypes, component) {\n  addComponent(type, component);\n  registerOneComponent(type);\n}\n\n/**\n * 安装所有vxe组件\n */\nexport function registerAllComponent() {\n  definedComponent();\n  // 遍历所有组件批量注册\n  const components = [...componentMap.keys()];\n  components.forEach((type) => {\n    if (!type.endsWith(spanEnds)) {\n      registerOneComponent(<JVxeTypes>type);\n    }\n  });\n}\n\n/**\n * 注册单个vxe组件\n *\n * @param type 组件 type\n */\nexport function registerOneComponent(type: JVxeTypes) {\n  const component = componentMap.get(type);\n  if (component) {\n    const switches = getEnhanced(type).switches;\n    if (switches.editRender && !switches.visible) {\n      createEditRender(type, component);\n    } else {\n      createCellRender(type, component);\n    }\n  } else {\n    throw new Error(`【registerOneComponent】\"${type}\"不存在于componentMap中`);\n  }\n}\n\n/** 注册可编辑组件 */\nfunction createEditRender(type: JVxeTypes, component: Component, spanComponent?: Component) {\n  // 获取当前组件的增强\n  const enhanced = getEnhanced(type);\n  if (!spanComponent) {\n    if (componentMap.has(type + spanEnds)) {\n      spanComponent = componentMap.get(type + spanEnds);\n    } else {\n      // 默认的 span 组件为 normal\n      spanComponent = componentMap.get(JVxeTypes.normal);\n    }\n  }\n  // 添加渲染\n  VXETable.renderer.add(JVxeTypePrefix + type, {\n    // 可编辑模板\n    renderEdit: createRender(type, component, JVxeRenderType.editer),\n    // 显示模板\n    renderCell: createRender(type, spanComponent, JVxeRenderType.spaner),\n    // 增强注册\n    ...enhanced.installOptions,\n  });\n}\n\n/** 注册普通组件 */\nfunction createCellRender(type: JVxeTypes, component: Component = <Component>componentMap.get(JVxeTypes.normal)) {\n  // 获取当前组件的增强\n  const enhanced = getEnhanced(type);\n  VXETable.renderer.add(JVxeTypePrefix + type, {\n    // 默认显示模板\n    renderDefault: createRender(type, component, JVxeRenderType.default),\n    // 增强注册\n    ...enhanced.installOptions,\n  });\n}\n\nfunction createRender(type, component, renderType) {\n  return function (renderOptions, params) {\n    return [\n      h(component, {\n        type: type,\n        params: params,\n        renderOptions: renderOptions,\n        renderType: renderType,\n      }),\n    ];\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/utils/vxeUtils.ts",
    "content": "/**\n *\n * 根据 tagName 获取父级节点\n *\n * @param dom 一级dom节点\n * @param tagName 标签名，不区分大小写\n */\nexport function getParentNodeByTagName(dom: HTMLElement, tagName: string = 'body'): HTMLElement | null {\n  if (tagName === 'body') {\n    return document.body;\n  }\n  if (dom.parentElement) {\n    if (dom.parentElement.tagName.toLowerCase() === tagName.trim().toLowerCase()) {\n      return dom.parentElement;\n    } else {\n      return getParentNodeByTagName(dom.parentElement, tagName);\n    }\n  } else {\n    return null;\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/src/vxe.data.ts",
    "content": "import { propTypes } from '/@/utils/propTypes';\n\nexport const vxeProps = () => ({\n  rowKey: propTypes.string.def('id'),\n  // 列信息\n  columns: {\n    type: Array,\n    required: true,\n  },\n  // 数据源\n  dataSource: {\n    type: Array,\n    required: true,\n  },\n  authPre: {\n    type: String,\n    required: false,\n    default: '',\n  },\n  // 是否显示工具栏\n  toolbar: propTypes.bool.def(false),\n  // 工具栏配置\n  toolbarConfig: propTypes.object.def(() => ({\n    // prefix 前缀；suffix 后缀；\n    slots: ['prefix', 'suffix'],\n    // add 新增按钮；remove 删除按钮；clearSelection 清空选择按钮；collapse 展开收起\n    btns: ['add', 'remove', 'clearSelection'],\n  })),\n  // 是否显示行号\n  rowNumber: propTypes.bool.def(false),\n  // 固定行号位置或者不固定 【QQYUN-8405】\n  rowNumberFixed: propTypes.oneOf(['left', 'none']).def('left'),\n  // 代码逻辑说明: 【issues/1162】JVxeTable列过长（出现横向滚动条）时无法拖拽排序\n  dragSortFixed: propTypes.oneOf(['left', 'none']).def('left'),\n  rowSelectionFixed: propTypes.oneOf(['left', 'none']).def('left'),\n  // 是否可选择行\n  rowSelection: propTypes.bool.def(false),\n  // 选择行类型\n  rowSelectionType: propTypes.oneOf(['checkbox', 'radio']).def('checkbox'),\n  // 是否可展开行\n  rowExpand: propTypes.bool.def(false),\n  // 展开行配置\n  expandConfig: propTypes.object.def(() => ({})),\n  // 是否可插入行\n  insertRow: propTypes.bool.def(true),\n  // 页面是否在加载中\n  loading: propTypes.bool.def(false),\n  // 表格高度\n  height: propTypes.oneOfType([propTypes.number, propTypes.string]).def('auto'),\n  // 最大高度\n  maxHeight: {\n    type: Number,\n    default: () => null,\n  },\n  // 要禁用的行\n  disabledRows: propTypes.object.def(() => ({})),\n  // 是否禁用全部组件\n  disabled: propTypes.bool.def(false),\n  // 是否可拖拽排序（有固定列的情况下无法拖拽排序，仅可上下排序）\n  dragSort: propTypes.bool.def(false),\n  // 排序字段保存的Key\n  sortKey: propTypes.string.def('orderNum'),\n  // 排序序号开始值，默认为 0\n  sortBegin: propTypes.number.def(0),\n  // 大小，可选值有：medium（中）、small（小）、mini（微）\n  size: propTypes.oneOf(['medium', 'small', 'mini']).def('medium'),\n  // 是否显示边框线\n  bordered: propTypes.bool.def(false),\n  // 自定义列配置 默认继承 setup.toolbar.custom\n  custom: propTypes.bool.def(false),\n  // 分页器参数，设置了即可显示分页器\n  pagination: propTypes.object.def(() => ({})),\n  // 点击行时是否显示子表单\n  clickRowShowSubForm: propTypes.bool.def(false),\n  // 点击行时是否显示主表单\n  clickRowShowMainForm: propTypes.bool.def(false),\n  // 是否点击选中行，优先级最低\n  clickSelectRow: propTypes.bool.def(false),\n  // 是否开启 reload 数据效果\n  reloadEffect: propTypes.bool.def(false),\n  // 校验规则\n  editRules: propTypes.object.def(() => ({})),\n  // 是否异步删除行，如果你要实现异步删除，那么需要把这个选项开启，\n  // 在remove事件里调用confirmRemove方法才会真正删除（除非删除的全是新增的行）\n  asyncRemove: propTypes.bool.def(false),\n  // 是否一直显示组件，如果为false则只有点击的时候才出现组件\n  // 注：该参数不能动态修改；如果行、列字段多的情况下，会根据机器性能造成不同程度的卡顿。\n  // TODO 新版vxe-table取消了 visible 参数，导致无法实现该功能\n  alwaysEdit: propTypes.bool.def(false),\n  // 联动配置，数组，详情配置见文档\n  linkageConfig: propTypes.array.def(() => []),\n  // 是否开启使用 webSocket 无痕刷新\n  socketReload: propTypes.bool.def(false),\n  // 相同的socketKey更改时会互相刷新\n  socketKey: propTypes.string.def('vxe-default'),\n  // 新增行时切换行的激活状态\n  addSetActive: propTypes.bool.def(true),\n  // 是否开启键盘编辑\n  keyboardEdit: propTypes.bool.def(false),\n  // 横向虚拟滚动配置（不支持展开行）\n  // 【QQYUN-7676】x滚动条滚动时字典变成了id\n  scrollX: propTypes.object.def(() => ({ enabled: false })),\n  // 纵向虚拟滚动配置（不支持展开行）\n  scrollY: propTypes.object.def(() => ({ enabled: true })),\n  //【QQYUN-8566】缓存列设置的key（路由页面内唯一）\n  cacheColumnsKey: propTypes.string.def(''),\n  // 代码逻辑说明: 【QQYUN-8785】online表单列位置的id未做限制，拖动其他列到id列上面，同步数据库时报错\n  rowClassName: {\n    type: [String, Function],\n    default: null,\n  },\n  // 不允许拖拽的行 [{'key':field,'value':value}]\n  notAllowDrag: propTypes.array.def(() => []),\n\n  // 新增按钮配置\n  addBtnCfg: propTypes.object,\n  // 删除按钮配置\n  removeBtnCfg: propTypes.object,\n});\n\nexport const vxeEmits = ['save', 'added', 'removed', 'inserted', 'dragged', 'selectRowChange', 'pageChange', 'valueChange', 'blur'];\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/types.ts",
    "content": "import JVxeTable from './src/JVxeTable';\n\nexport type { JVxeComponent } from './src/types/JVxeComponent';\nexport type { JVxeColumn, JVxeLinkageConfig } from './src/types';\nexport { JVxeTypes } from './src/types/JVxeTypes';\nexport type JVxeTableInstance = InstanceType<typeof JVxeTable>;\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/JVxeTable/utils.ts",
    "content": "import type { Ref, ComponentInternalInstance } from 'vue';\nimport { unref, isRef } from 'vue';\nimport { isFunction } from '/@/utils/is';\n\ntype dispatchEventOptions = {\n  // JVxeTable 的 props\n  props;\n  // 触发的 event 事件对象\n  $event;\n  // 行、列\n  row?;\n  column?;\n  // JVxeTable的vue3实例\n  instance?: ComponentInternalInstance | any;\n  // 要寻找的className\n  className: string;\n  // 重写找到dom后的处理方法\n  handler?: Fn;\n  // 是否直接执行click方法而不是模拟click事件\n  isClick?: boolean;\n};\n\n/** 模拟触发事件 */\nexport function dispatchEvent(options: dispatchEventOptions) {\n  const { props, $event, row, column, instance, className, handler, isClick } = options;\n  if ((!$event || !$event.path) && !instance) {\n    return;\n  }\n  // alwaysEdit 下不模拟触发事件，否者会导致触发两次\n  if (props && props.alwaysEdit) {\n    return;\n  }\n  let getCell = () => {\n    let paths: HTMLElement[] = [...($event?.path ?? [])];\n    // 通过 instance 获取 cell dom对象\n    if (row && column) {\n      let selector = `table.vxe-table--body tbody tr[rowid='${row.id}'] td[colid='${column.id}']`;\n      let cellDom = instance!.vnode?.el?.querySelector(selector);\n      // -update-begin--author:liaozhiyang---date:20230830---for：【QQYUN-6390】解决online新增字段警告（兼容下）\n      if (!cellDom) {\n        cellDom = instance!.$el?.querySelector(selector);\n      }\n      // -update-begin--author:liaozhiyang---date:20230830---for：【QQYUN-6390】解决online新增字段警告（兼容下）\n      if (cellDom) {\n        paths.unshift(cellDom);\n      }\n    }\n    for (const el of paths) {\n      if (el.classList?.contains('vxe-body--column')) {\n        return el;\n      }\n    }\n    return null;\n  };\n  let cell = getCell();\n  if (cell) {\n    window.setTimeout(() => {\n      let getElement = () => {\n        let classList = className.split(' ');\n        if (classList.length > 0) {\n          const getClassName = (cls: string) => {\n            if (cls.startsWith('.')) {\n              return cls.substring(1, cls.length);\n            }\n            return cls;\n          };\n          let get = (target, className, idx = 0) => {\n            let elements = target.getElementsByClassName(getClassName(className));\n            if (elements && elements.length > 0) {\n              return elements[idx];\n            }\n            return null;\n          };\n          let element: HTMLElement = get(cell, classList[0]);\n          for (let i = 1; i < classList.length; i++) {\n            if (!element) {\n              break;\n            }\n            element = get(element, classList[i]);\n          }\n          return element;\n        }\n        return null;\n      };\n      let element = getElement();\n      if (element) {\n        if (isFunction(handler)) {\n          handler(element);\n        } else {\n          // 模拟触发点击事件\n          if (isClick) {\n            element.click();\n          } else {\n            element.dispatchEvent($event);\n          }\n        }\n      }\n    }, 10);\n  } else {\n    console.warn('【JVxeTable】dispatchEvent 获取 cell 失败');\n  }\n}\n\n/** 绑定 VxeTable 数据 */\nexport function vModel(value, row, column: Ref<any> | string) {\n  // @ts-ignore\n  let property = isRef(column) ? column.value.property : column;\n  unref(row)[property] = value;\n}\n\n/**\n * liaozhiyang\n * 2024-06-20\n * 判断当前行编辑是否使用了虚拟滚动（并不是开启了就是，还得满足数据数量大于gt值）\n */\nexport function isEnabledVirtualYScroll(props, xTable): boolean {\n  let isRealEnabledVirtual = false;\n  const isEnabledVScroll = props?.scrollY?.enabled;\n  // 100是底层的默认值\n  const gtYNum = props?.scrollY?.gt || 100;\n  if (isEnabledVScroll) {\n    const tableFullData = xTable.internalData.tableFullData;\n    if (gtYNum === 0) {\n      isRealEnabledVirtual = true;\n    } else {\n      if (tableFullData.length > gtYNum) {\n        isRealEnabledVirtual = true;\n      }\n    }\n  }\n  return isRealEnabledVirtual;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/OnLine/JPopupOnlReport.vue",
    "content": "<template>\n  <div>\n    <div class=\"jeecg-basic-table-form-container\" v-if=\"showSearchFlag\">\n      <a-form ref=\"formRef\" :model=\"queryParam\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\" @keyup.enter.native=\"searchQuery\">\n        <a-row :gutter=\"24\">\n          <template v-for=\"(item, index) in queryInfo\">\n            <template v-if=\"item.hidden === '1'\">\n              <a-col :md=\"6\" :sm=\"24\" :key=\"'query' + index\" v-show=\"toggleSearchStatus\">\n                <SearchFormItem :formElRef=\"formRef\" :queryParam=\"queryParam\" :item=\"item\" :dictOptions=\"dictOptions\"></SearchFormItem>\n              </a-col>\n            </template>\n            <template v-else>\n              <a-col :md=\"6\" :sm=\"24\" :key=\"'query' + index\">\n                <SearchFormItem :formElRef=\"formRef\" :queryParam=\"queryParam\" :item=\"item\" :dictOptions=\"dictOptions\"></SearchFormItem>\n              </a-col>\n            </template>\n          </template>\n\n          <a-col :md=\"6\" :sm=\"8\">\n            <span style=\"float: left; overflow: hidden\" class=\"table-page-search-submitButtons\">\n              <a-col :lg=\"6\">\n                <a-button type=\"primary\" preIcon=\"ant-design:search-outlined\" @click=\"searchQuery\">查询</a-button>\n                <a-button type=\"primary\" preIcon=\"ant-design:reload-outlined\" @click=\"searchReset\" style=\"margin-left: 8px\">重置</a-button>\n                <a @click=\"handleToggleSearch\" style=\"margin-left: 8px\">\n                  {{ toggleSearchStatus ? '收起' : '展开' }}\n                  <Icon :icon=\"toggleSearchStatus ? 'ant-design:up-outlined' : 'ant-design:down-outlined'\" />\n                </a>\n              </a-col>\n            </span>\n          </a-col>\n        </a-row>\n      </a-form>\n    </div>\n    <BasicTable\n      ref=\"tableRef\"\n      :canResize=\"true\"\n      :bordered=\"true\"\n      :loading=\"loading\"\n      :rowKey=\"combineRowKey\"\n      :columns=\"columns\"\n      :showIndexColumn=\"false\"\n      :dataSource=\"dataSource\"\n      :pagination=\"pagination\"\n      :rowSelection=\"rowSelection\"\n      @row-click=\"clickThenCheck\"\n      @change=\"handleChangeInTable\"\n    >\n      <template #tableTitle>\n        <a-button type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n      </template>\n      <template #bodyCell=\"{ text, column }\">\n        <template v-if=\"column.fieldType === 'Image'\">\n          <span v-if=\"!text\" style=\"font-size: 12px; font-style: italic\">无图片</span>\n          <img v-else :src=\"getImgView(text)\" alt=\"图片不存在\" class=\"cellIamge\" @click=\"viewOnlineCellImage($event, text)\" />\n        </template>\n      </template>\n    </BasicTable>\n\n    <!-- 跳转Href的动态组件方式 -->\n    <a-modal v-bind=\"hrefComponent.model\" v-on=\"hrefComponent.on\">\n      <component :is=\"hrefComponent.is\" v-bind=\"hrefComponent.params\" />\n    </a-modal>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, unref, ref, watch, watchEffect, reactive, computed } from 'vue';\n  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { usePopBiz } from '/@/components/jeecg/OnLine/hooks/usePopBiz';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useRoute } from 'vue-router';\n  import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';\n  import { createImgPreview } from '/@/components/Preview/index';\n\n  export default defineComponent({\n    name: 'JPopupOnlReport',\n    components: {\n      SearchFormItem: createAsyncComponent(() => import('/@/components/jeecg/OnLine/SearchFormItem.vue'), { loading: true }),\n      BasicTable: createAsyncComponent(() => import('/@/components/Table/src/BasicTable.vue'), {\n        loading: true,\n      }),\n    },\n    props: ['multi', 'code', 'id', 'sorter', 'groupId', 'param', 'clickToRowSelect'],\n    emits: ['ok', 'register'],\n    setup(props, { emit, refs }) {\n      const { createMessage } = useMessage();\n      const labelCol = reactive({\n        xs: { span: 24 },\n        sm: { span: 6 },\n      });\n      const wrapperCol = reactive({\n        xs: { span: 24 },\n        sm: { span: 18 },\n      });\n      const formRef = ref();\n      const tableRef = ref();\n      const toggleSearchStatus = ref(false);\n      const attrs = useAttrs();\n      const tableScroll = ref({ x: true });\n      const route = useRoute();\n      console.log('route.query = ',route.query)\n      const getBindValue = Object.assign({}, {routeQuery: route.query}, unref(props), unref(attrs));\n      \n      const [\n        {\n          visibleChange,\n          loadColumnsInfo,\n          dynamicParamHandler,\n          loadData,\n          loadColumnsAndData,\n          handleChangeInTable,\n          combineRowKey,\n          clickThenCheck,\n          filterUnuseSelect,\n          handleExport,\n        },\n        {\n          hrefComponent,\n          visible,\n          rowSelection,\n          checkedKeys,\n          selectRows,\n          pagination,\n          dataSource,\n          columns,\n          loading,\n          title,\n          iSorter,\n          queryInfo,\n          queryParam,\n          dictOptions,\n        },\n      ] = usePopBiz(getBindValue, tableRef);\n\n      pagination.pageSizeOptions = ['10', '100', '300'];\n\n      const showSearchFlag = computed(() => unref(queryInfo) && unref(queryInfo).length > 0);\n      /**\n       *监听code\n       */\n      watch(\n        () => props.code,\n        () => {\n          loadColumnsAndData();\n        },\n        { immediate: true }\n      );\n      /**\n       *监听popup动态参数 支持系统变量语法\n       */\n      watch(\n        () => props.param,\n        () => {\n          if (visible) {\n            dynamicParamHandler();\n            //loadData();\n          }\n        }\n      );\n      /**\n       *监听sorter排序字段\n       */\n      watchEffect(() => {\n        if (props.sorter) {\n          let arr = props.sorter.split('=');\n          if (arr.length === 2 && ['asc', 'desc'].includes(arr[1].toLowerCase())) {\n            iSorter.value = { column: arr[0], order: arr[1].toLowerCase() };\n            // 排序字段受控\n            unref(columns).forEach((col) => {\n              if (col.dataIndex === unref(iSorter).column) {\n                col['sortOrder'] = unref(iSorter).order === 'asc' ? 'ascend' : 'descend';\n              } else {\n                col['sortOrder'] = false;\n              }\n            });\n          } else {\n            console.warn('【JPopup】sorter参数不合法');\n          }\n        }\n      });\n\n      function handleToggleSearch() {\n        toggleSearchStatus.value = !unref(toggleSearchStatus);\n      }\n\n      /**\n       * 导出excel\n       */\n      function onExportXls() {\n        handleExport!();\n      }\n\n      /**\n       * 查询\n       */\n      function searchQuery() {\n        loadData(1);\n      }\n\n      /**\n       * 重置\n       */\n      function searchReset() {\n        queryParam.value = {};\n        loadData(1);\n      }\n\n      /**\n       * 2024-07-24\n       * liaozhiyang\n       * 【TV360X-1756】报表添加图片类型\n       * 图片\n       * @param text\n       */\n      function getImgView(text) {\n        if (text && text.indexOf(',') > 0) {\n          text = text.substring(0, text.indexOf(','));\n        }\n        return getFileAccessHttpUrl(text);\n      }\n      /**\n       * 2024-07-24\n       * liaozhiyang\n       * 【TV360X-1756】报表添加图片类型\n       * 预览列表 cell 图片\n       * @param text\n       */\n      function viewOnlineCellImage(e, text) {\n        e.stopPropagation();\n        if (text) {\n          let imgList: any = [];\n          let arr = text.split(',');\n          for (let str of arr) {\n            if (str) {\n              imgList.push(getFileAccessHttpUrl(str));\n            }\n          }\n          createImgPreview({ imageList: imgList });\n        }\n      }\n\n      return {\n        attrs,\n\n        tableScroll,\n        dataSource,\n        pagination,\n        columns,\n        rowSelection,\n        checkedKeys,\n        loading,\n        title,\n        hrefComponent,\n\n        clickThenCheck,\n        loadData,\n        combineRowKey,\n        handleChangeInTable,\n        visibleChange,\n        queryInfo,\n        queryParam,\n        tableRef,\n        formRef,\n        labelCol,\n        wrapperCol,\n        dictOptions,\n        showSearchFlag,\n        toggleSearchStatus,\n        handleToggleSearch,\n        searchQuery,\n        searchReset,\n        onExportXls,\n        getImgView,\n        viewOnlineCellImage,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .jeecg-basic-table-form-container {\n    padding: 0px;\n\n    .table-page-search-submitButtons {\n      display: block;\n      margin-bottom: 0;\n      white-space: nowrap;\n    }\n  }\n\n  :deep(.jeecg-basic-table .ant-table-wrapper .ant-table-title){\n    min-height: 0;\n  }\n  :deep(.ant-select-selector){\n    min-width: 95px;\n  }\n  .cellIamge {\n    height: 25px !important;\n    margin: 0 auto;\n    max-width: 80px;\n    font-size: 12px;\n    font-style: italic;\n    cursor: pointer;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/OnLine/SearchFormItem.vue",
    "content": "<template>\n  <a-form-item v-if=\"item.view === DateTypeEnum.Date\" :labelCol=\"labelCol\" :class=\"'jeecg-online-search'\">\n    <template #label>\n      <span :title=\"item.label\" class=\"label-text\">{{ item.label }}</span>\n    </template>\n    <template v-if=\"single_mode === item.mode\">\n      <a-date-picker\n        :showTime=\"false\"\n        valueFormat=\"YYYY-MM-DD\"\n        :placeholder=\"'请选择' + item.label\"\n        v-model:value=\"queryParam[item.field]\"\n      ></a-date-picker>\n    </template>\n    <template v-else>\n      <a-date-picker\n        :showTime=\"false\"\n        valueFormat=\"YYYY-MM-DD\"\n        placeholder=\"开始日期\"\n        v-model:value=\"queryParam[item.field + '_begin']\"\n        style=\"width: calc(50% - 15px)\"\n      ></a-date-picker>\n      <span class=\"group-query-strig\">~</span>\n      <a-date-picker\n        :showTime=\"false\"\n        valueFormat=\"YYYY-MM-DD\"\n        placeholder=\"结束日期\"\n        v-model:value=\"queryParam[item.field + '_end']\"\n        style=\"width: calc(50% - 15px)\"\n      ></a-date-picker>\n    </template>\n  </a-form-item>\n\n  <a-form-item v-else-if=\"item.view === DateTypeEnum.Datetime\" :labelCol=\"labelCol\" :class=\"'jeecg-online-search'\">\n    <template #label :title=\"item.label\">\n      <span :title=\"item.label\" class=\"label-text\">{{ item.label }}</span>\n    </template>\n    <template v-if=\"single_mode === item.mode\">\n      <a-date-picker\n        :placeholder=\"'请选择' + item.label\"\n        :show-time=\"true\"\n        valueFormat=\"YYYY-MM-DD HH:mm:ss\"\n        v-model:value=\"queryParam[item.field]\"\n      ></a-date-picker>\n    </template>\n    <template v-else>\n      <a-date-picker\n        placeholder=\"选择开始时间\"\n        :show-time=\"true\"\n        valueFormat=\"YYYY-MM-DD HH:mm:ss\"\n        v-model:value=\"queryParam[item.field + '_begin']\"\n        style=\"width: calc(50% - 9px); min-width: 60px\"\n      ></a-date-picker>\n      <span class=\"group-query-strig\" style=\"width: auto; padding: 0 4px\">~</span>\n      <a-date-picker\n        placeholder=\"选择结束时间\"\n        :show-time=\"true\"\n        valueFormat=\"YYYY-MM-DD HH:mm:ss\"\n        v-model:value=\"queryParam[item.field + '_end']\"\n        style=\"width: calc(50% - 9px); min-width: 60px\"\n      ></a-date-picker>\n    </template>\n  </a-form-item>\n\n  <a-form-item v-else-if=\"item.view === DateTypeEnum.Time\" :labelCol=\"labelCol\" :class=\"'jeecg-online-search'\">\n    <template #label>\n      <span :title=\"item.label\" class=\"label-text\">{{ item.label }}</span>\n    </template>\n    <template v-if=\"single_mode === item.mode\">\n      <a-date-picker :placeholder=\"'请选择' + item.label\" mode=\"time\" valueFormat=\"HH:mm:ss\" v-model:value=\"queryParam[item.field]\"></a-date-picker>\n    </template>\n    <template v-else>\n      <a-date-picker\n        placeholder=\"请选择开始时间\"\n        mode=\"time\"\n        valueFormat=\"HH:mm:ss\"\n        v-model:value=\"queryParam[item.field + '_begin']\"\n        style=\"width: calc(50% - 15px)\"\n      ></a-date-picker>\n      <span class=\"group-query-strig\">~</span>\n      <a-date-picker\n        placeholder=\"请选择结束时间\"\n        mode=\"time\"\n        valueFormat=\"HH:mm:ss\"\n        v-model:value=\"queryParam[item.field + '_end']\"\n        style=\"width: calc(50% - 15px)\"\n      ></a-date-picker>\n    </template>\n  </a-form-item>\n\n  <a-form-item\n    v-else-if=\"item.view === CompTypeEnum.List || item.view === CompTypeEnum.Radio || item.view === CompTypeEnum.Switch\"\n    :labelCol=\"labelCol\"\n    :class=\"'jeecg-online-search'\"\n  >\n    <template #label>\n      <span :title=\"item.label\" class=\"label-text\">{{ item.label }}</span>\n    </template>\n    <JDictSelectTag v-if=\"item.config === '1'\" :placeholder=\"'请选择' + item.label\" v-model=\"queryParam[item.field]\" :dictCode=\"getDictCode(item)\">\n    </JDictSelectTag>\n    <a-select v-else :placeholder=\"'请选择' + item.label\" v-model:value=\"queryParam[item.field]\">\n      <template v-for=\"(obj, index) in dictOptions[getDictOptionKey(item)]\" :key=\"index\">\n        <a-select-option :value=\"obj.value\"> {{ obj.text }}</a-select-option>\n      </template>\n    </a-select>\n  </a-form-item>\n\n  <a-form-item v-else-if=\"item.view === CompTypeEnum.SelTree\" :labelCol=\"labelCol\" :class=\"'jeecg-online-search'\">\n    <template #label>\n      <span :title=\"item.label\" class=\"label-text\">{{ item.label }}</span>\n    </template>\n    <JTreeSelect\n      :placeholder=\"'请选择' + item.label\"\n      v-model:value=\"queryParam[item.field]\"\n      :dict=\"item.dict\"\n      :pidField=\"item.pidField\"\n      :pidValue=\"item.pidValue\"\n      :hasChildField=\"item.hasChildField\"\n      load-triggle-change\n    >\n    </JTreeSelect>\n  </a-form-item>\n\n  <a-form-item v-else-if=\"item.view === CompTypeEnum.CatTree\" :labelCol=\"labelCol\" :class=\"'jeecg-online-search'\">\n    <template #label>\n      <span :title=\"item.label\" class=\"label-text\">{{ item.label }}</span>\n    </template>\n    <JCategorySelect :pcode=\"item.pcode\" v-model:value=\"queryParam[item.field]\" :placeholder=\"'请选择' + item.label\" />\n  </a-form-item>\n\n  <a-form-item v-else-if=\"item.view === CompTypeEnum.SelSearch\" :labelCol=\"labelCol\" :class=\"'jeecg-online-search'\">\n    <template #label>\n      <span :title=\"item.label\" class=\"label-text\">{{ item.label }}</span>\n    </template>\n    <JOnlineSearchSelect v-model:value=\"queryParam[item.field]\" :placeholder=\"'请选择'+item.label\" :fieldId=\"item.fieldId\"/>\n  </a-form-item>\n\n  <a-form-item v-else-if=\"item.view === CompTypeEnum.SelUser\" :labelCol=\"labelCol\" :class=\"'jeecg-online-search'\">\n    <template #label>\n      <span :title=\"item.label\" class=\"label-text\">{{ item.label }}</span>\n    </template>\n    <JSelectUserByDept v-model:value=\"queryParam[item.field]\" :placeholder=\"'请选择' + item.label\"></JSelectUserByDept>\n  </a-form-item>\n\n  <a-form-item v-else-if=\"item.view == CompTypeEnum.SelDepart\" :labelCol=\"labelCol\" :class=\"'jeecg-online-search'\">\n    <template #label>\n      <span :title=\"item.label\" class=\"label-text\">{{ item.label }}</span>\n    </template>\n    <JSelectDept v-model:value=\"queryParam[item.field]\" :placeholder=\"'请选择' + item.label\" />\n  </a-form-item>\n\n  <a-form-item v-else-if=\"item.view === CompTypeEnum.Popup\" :labelCol=\"labelCol\" :class=\"'jeecg-online-search'\">\n    <template #label>\n      <span :title=\"item.label\" class=\"label-text\">{{ item.label }}</span>\n    </template>\n    <JPopup\n      :placeholder=\"'请选择' + item.label\"\n      v-model:value=\"queryParam[item.field]\"\n      :formElRef=\"formElRef\"\n      :code=\"item.dictTable\"\n      :field-config=\"item.dictCode\"\n      :multi=\"true\"\n    />\n  </a-form-item>\n\n  <a-form-item v-else-if=\"item.view === CompTypeEnum.Pca\" :labelCol=\"labelCol\" :class=\"'jeecg-online-search'\">\n    <template #label>\n      <span :title=\"item.label\" class=\"label-text\">{{ item.label }}</span>\n    </template>\n    <JAreaLinkage :placeholder=\"'请选择' + item.label\" v-model:value=\"queryParam[item.field]\" />\n  </a-form-item>\n  <!--TODO 缺少的组件-->\n  <a-form-item\n    v-else-if=\"item.view === CompTypeEnum.Checkbox || item.view === CompTypeEnum.ListMulti\"\n    :labelCol=\"labelCol\"\n    :label=\"item.label\"\n    :class=\"'jeecg-online-search'\"\n  >\n    <!-- <j-select-multiple\n                v-if=\"item.config==='1'\"\n                :placeholder=\" '请选择'+item.label \"\n                v-model=\"queryParam[item.field]\"\n                :dictCode=\"getDictCode(item)\">\n        </j-select-multiple>\n        <j-select-multiple\n                v-else\n                :placeholder=\" '请选择'+item.label \"\n                :options=\"dictOptions[item.dbField]\"\n                v-model=\"queryParam[item.field]\">\n        </j-select-multiple>-->\n  </a-form-item>\n\n  <a-form-item v-else :labelCol=\"labelCol\" :class=\"'jeecg-online-search'\">\n    <template #label>\n      <span :title=\"item.label\" class=\"label-text\">{{ item.label }}</span>\n    </template>\n    <template v-if=\"single_mode === item.mode && 'string'== item.view\">\n      <j-input :placeholder=\"'请输入' + item.label\" v-model:value=\"queryParam[item.field]\"></j-input>\n    </template>\n    <template v-else-if=\"single_mode === item.mode\">\n      <a-input :placeholder=\"'请输入' + item.label\" v-model:value=\"queryParam[item.field]\"></a-input>\n    </template>\n    <template v-else>\n      <a-input :placeholder=\"'请输入开始' + item.label\" v-model:value=\"queryParam[item.field + '_begin']\" style=\"width: calc(50% - 15px)\"></a-input>\n      <span class=\"group-query-strig\">~</span>\n      <a-input :placeholder=\"'请输入结束' + item.label\" v-model:value=\"queryParam[item.field + '_end']\" style=\"width: calc(50% - 15px)\"></a-input>\n    </template>\n  </a-form-item>\n</template>\n\n<script lang=\"ts\">\n  //import JOnlineSearchSelect from '@/components/online/autoform/comp/JOnlineSearchSelect'\n  import { defineComponent, ref } from 'vue';\n  import { DateTypeEnum } from '/@/enums/DateTypeEnum.ts';\n  import { CompTypeEnum } from '/@/enums/CompTypeEnum.ts';\n  import { JDictSelectTag, JTreeSelect, JCategorySelect, JSelectUserByDept, JSelectDept, JPopup, JAreaLinkage,JInput,JSearchSelect } from '/@/components/Form';\n  export default defineComponent({\n    name: 'SearchFormItem',\n    components: {\n      //JOnlineSearchSelect\n      JDictSelectTag,\n      JTreeSelect,\n      JCategorySelect,\n      JSelectUserByDept,\n      JSelectDept,\n      JPopup,\n      JAreaLinkage,\n      JInput,\n    },\n    props: {\n      formElRef: {\n        type: Object,\n        default: () => {},\n      },\n      item: {\n        type: Object,\n        default: () => {},\n        required: true,\n      },\n      dictOptions: {\n        type: Object,\n        default: () => {},\n        required: true,\n      },\n      queryParam: {\n        type: Object,\n        default: () => {},\n        required: true,\n      },\n    },\n    setup(props) {\n      const single_mode = ref('single');\n      console.log('dictOptions===>', props.dictOptions);\n      function getDictCode(item) {\n        if (item.dictTable && item.dictTable.length > 0) {\n          return item.dictTable + ',' + item.dictText + ',' + item.dictCode;\n        } else {\n          return item.dictCode;\n        }\n      }\n\n      function getSqlByDictCode(item) {\n        let { dictTable, dictCode, dictText } = item;\n        let temp = dictTable.toLowerCase();\n        let arr = temp.split('where');\n        let condition = '';\n        if (arr.length > 1) {\n          condition = ' where' + arr[1];\n        }\n        let sql = 'select ' + dictCode + \" as 'value', \" + dictText + \" as 'text' from \" + arr[0] + condition;\n        console.log('sql', sql);\n        return sql;\n      }\n\n      function getDictOptionKey(item) {\n        if (item.dbField) {\n          return item.dbField;\n        } else {\n          return item.field;\n        }\n      }\n\n      // 定义查询条件 文本label的最大宽度 比起单纯的控制字体个数更好\n      const labelTextMaxWidth = '120px';\n      const labelCol = {\n        style: {\n          'max-width': labelTextMaxWidth,\n        },\n      };\n      return {\n        labelTextMaxWidth,\n        labelCol,\n        single_mode,\n        getDictOptionKey,\n        getDictCode,\n        getSqlByDictCode,\n        DateTypeEnum,\n        CompTypeEnum,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .group-query-strig {\n    width: 30px;\n    text-align: center;\n    display: inline-block;\n  }\n\n  /* 查询条件左对齐样式设置 */\n  .jeecg-online-search :deep(.ant-form-item-label) {\n    flex: 0 0 auto !important;\n    width: auto;\n  }\n  .jeecg-online-search :deep(.ant-form-item-control) {\n    max-width: 100%;\n  }\n\n  /* label显示宽度 超出显示... */\n  .jeecg-online-search :deep(.label-text) {\n    max-width: v-bind(labelTextMaxWidth);\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    overflow-wrap: break-word;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/OnLine/hooks/usePopBiz.ts",
    "content": "import { reactive, ref, unref, defineAsyncComponent, toRaw, markRaw, isRef, watch, onUnmounted } from 'vue';\nimport { httpGroupRequest } from '/@/components/Form/src/utils/GroupRequest';\nimport { defHttp } from '/@/utils/http/axios';\nimport { filterMultiDictText } from '/@/utils/dict/JDictSelectUtil.js';\nimport { useMessage } from '/@/hooks/web/useMessage';\nimport { OnlineColumn } from '/@/components/jeecg/OnLine/types/onlineConfig';\nimport { h } from 'vue';\nimport { useRouter, useRoute } from 'vue-router';\nimport { useMethods } from '/@/hooks/system/useMethods';\nimport { importViewsFile, _eval } from '/@/utils';\nimport {getToken} from \"@/utils/auth\";\nimport {replaceUserInfoByExpression} from \"@/utils/common/compUtils\";\nimport { isString } from '/@/utils/is';\n\nexport function usePopBiz(ob, tableRef?) {\n  // 代码逻辑说明: 【issues/675】子表字段Popup弹框数据不更新\n  let props: any;\n  if (isRef(ob)) {\n    props = ob.value;\n    const stopWatch = watch(ob, (newVal) => {\n      props = newVal;\n    });\n    onUnmounted(() => stopWatch());\n  } else {\n    props = ob;\n  }\n  const { createMessage } = useMessage();\n  //弹窗可视状态\n  const visible = ref(false);\n  //表格加载\n  const loading = ref(false);\n  //cgRpConfigId\n  const cgRpConfigId = ref('');\n  //标题\n  const title = ref('列表');\n  // 排序字段，默认无排序\n  const iSorter = ref<any>('');\n  // 查询对象\n  const queryInfo = ref([]);\n  // 查询参数\n  const queryParam = ref<any>({});\n  // 动态参数\n  const dynamicParam = ref<any>({});\n  //字典配置项\n  const dictOptions = ref({});\n  //数据集\n  const dataSource = ref<Array<object>>([]);\n  //定义表格信息\n  const columns = ref<Array<object>>([]);\n  // 当前路由\n  const route = useRoute();\n  //定义请求url信息\n  const configUrl = reactive({\n    //列表页加载column和data\n    getColumnsAndData: '/online/cgreport/api/getColumnsAndData/',\n    getColumns: '/online/cgreport/api/getRpColumns/',\n    getData: '/online/cgreport/api/getData/',\n    getQueryInfo: '/online/cgreport/api/getQueryInfo/',\n    export: '/online/cgreport/api/exportManySheetXls/',\n  });\n  //已选择的值\n  const checkedKeys = ref<Array<string | number>>([]);\n  //选择的行记录\n  const selectRows = ref<Array<any>>([]);\n  // 点击单元格选中行 popup需要 但是报表预览不需要\n  let clickThenCheckFlag = true;\n  if (props.clickToRowSelect === false) {\n    clickThenCheckFlag = false;\n  }\n\n  /**\n   * 选择列配置\n   */\n  const rowSelection = {\n    fixed: true,\n    type: props.multi ? 'checkbox' : 'radio',\n    selectedRowKeys: checkedKeys,\n    selectionRows: selectRows,\n    onChange: onSelectChange,\n  };\n\n  /**\n   * 序号列配置\n   */\n  const indexColumnProps = {\n    dataIndex: 'index',\n    width: '15px',\n  };\n  /**\n   * 分页配置\n   */\n  const pagination = reactive({\n    current: 1,\n    pageSize: 10,\n    pageSizeOptions: ['10', '20', '30'],\n    // showTotal: (total, range) => {\n    //     return range[0] + '-' + range[1] + ' 共' + total + '条'\n    // },\n    showQuickJumper: true,\n    showSizeChanger: true,\n    total: 0,\n    // 合计逻辑 [待优化 3.0]\n    showTotal: (total) => onShowTotal(total),\n    realPageSize: 10,\n    realTotal: 0,\n    // 是否有合计列，默认为\"\"，在第一次获取到数据之后会设计为ture或者false\n    isTotal: <string | boolean>'',\n    onShowSizeChange: (current, pageSize) => onSizeChange(current, pageSize),\n  });\n\n  /**\n   * 表格选择事件\n   * @param selectedRowKeys\n   * @param selectRow\n   */\n  function onSelectChange(selectedRowKeys: (string | number)[]) {\n    // 代码逻辑说明: 【QQYUN-7514】popup单选显示radio\n    if (!props.multi) {\n      selectRows.value = [];\n      checkedKeys.value = [];\n      // selectedRowKeys = [selectedRowKeys[selectedRowKeys.length - 1]];\n    }\n    // 代码逻辑说明: 【QQYUN-4263】跨页选择导出问题\n    if (!selectedRowKeys || selectedRowKeys.length == 0) {\n      selectRows.value = [];\n      checkedKeys.value = [];\n    } else {\n      if (selectRows.value.length > selectedRowKeys.length) {\n        // 取消\n        selectRows.value.forEach((item, index) => {\n          const rowKey = combineRowKey(item);\n          if (!selectedRowKeys.find((key) => key === rowKey)) {\n            selectRows.value.splice(index, 1);\n          }\n        });\n      } else {\n        // 新增\n        const append: any = [];\n        const beforeRowKeys = selectRows.value.map((item) => combineRowKey(item));\n        selectedRowKeys.forEach((key) => {\n          if (!beforeRowKeys.find((item) => item === key)) {\n            // 那就是新增选中的行\n            const row = getRowByKey(key);\n            row && append.push(row);\n          }\n        });\n        selectRows.value = [...selectRows.value, ...append];\n      }\n      checkedKeys.value = [...selectedRowKeys];\n    }\n  }\n  /**\n   * 过滤没用选项\n   * @param selectedRowKeys\n   */\n  function filterUnuseSelect() {\n    selectRows.value = unref(selectRows).filter((item) => {\n      let combineKey = combineRowKey(item);\n      return unref(checkedKeys).indexOf(combineKey) >= 0;\n    });\n  }\n\n  /**\n   * 根据key获取row信息\n   * @param key\n   */\n  function getRowByKey(key) {\n    let row = unref(dataSource).filter((record) => combineRowKey(record) === key);\n    return row && row.length > 0 ? row[0] : '';\n  }\n\n  /**\n   * 加载rowKey\n   */\n  function combineRowKey(record) {\n    let res = record?.id || '';\n    if (props?.rowkey) {\n      // 代码逻辑说明: 【issues/3656】popupdict回显\n      res = record[props.rowkey];\n    } else {\n      Object.keys(record).forEach((key) => {\n        res = key == 'rowIndex' ? record[key] + res : res + record[key];\n      });\n      res = res.length > 50 ? res.substring(0, 50) : res;\n    }\n    return res;\n  }\n\n  /**\n   * 加载列信息\n   */\n  function loadColumnsInfo() {\n    const {code} = handleCodeParams(true)\n    let url = `${configUrl.getColumns}${code}`;\n    //缓存key\n    let groupIdKey = props.groupId ? `${props.groupId}${url}` : '';\n    httpGroupRequest(() => defHttp.get({ url }, { isTransformResponse: false, successMessageMode: 'none' }), groupIdKey).then((res) => {\n      if (res.success) {\n        initDictOptionData(res.result.dictOptions);\n        cgRpConfigId.value = res.result.cgRpConfigId;\n        title.value = res.result.cgRpConfigName;\n        let currColumns = res.result.columns;\n        for (let a = 0; a < currColumns.length; a++) {\n          if (currColumns[a].customRender) {\n            let dictCode = currColumns[a].customRender;\n            currColumns[a].customRender = ({ text }) => {\n              return filterMultiDictText(unref(dictOptions)[dictCode], text + '');\n            };\n          }\n          // 排序字段受控\n          if (unref(iSorter) && currColumns[a].dataIndex === unref(iSorter).column) {\n            currColumns[a].sortOrder = unref(iSorter).order === 'asc' ? 'ascend' : 'descend';\n          }\n        }\n        // 代码逻辑说明: 【issues/946】popup列宽和在线报表列宽读取配置\n        currColumns.forEach((item) => {\n          if (item.fieldWidth != null) {\n            if (isString(item.fieldWidth) && item.fieldWidth.trim().length == 0) return;\n            item.width = item.fieldWidth;\n            delete item.fieldWidth;\n          }\n        });\n        if (currColumns[0].key !== 'rowIndex') {\n          currColumns.unshift({\n            title: '序号',\n            dataIndex: 'rowIndex',\n            key: 'rowIndex',\n            width: 60,\n            align: 'center',\n            customRender: function ({ text }) {\n              // 代码逻辑说明: 【QQYUN-7584】popup有合计时序号列会出现NaN\n              if (text == undefined) {\n                return '';\n              } else {\n                return parseInt(text) + 1;\n              }\n            },\n          });\n        }\n        columns.value = [...currColumns];\n        initQueryInfo(null);\n      }\n    });\n  }\n\n  /**\n   * 加载列和数据[列表专用]\n   */\n  function loadColumnsAndData() {\n    // 第一次加载 置空isTotal 在这里调用确保 该方法只是进入页面后 加载一次 其余查询不走该方法\n    pagination.isTotal = '';\n    let url = `${configUrl.getColumnsAndData}${props.id}`;\n\n    const {query} = handleCodeParams()\n    if (query) {\n      url = url + query\n    }\n    //缓存key\n    let groupIdKey = props.groupId ? `${props.groupId}${url}` : '';\n    httpGroupRequest(() => defHttp.get({ url }, { isTransformResponse: false, successMessageMode: 'none' }), groupIdKey).then((res) => {\n      if (res.success) {\n        initDictOptionData(res.result.dictOptions);\n        cgRpConfigId.value = props.id;\n        let { columns: metaColumnList, cgreportHeadName, fieldHrefSlots, isGroupTitle } = res.result;\n        title.value = cgreportHeadName;\n        // href 跳转\n        const fieldHrefSlotKeysMap = {};\n        fieldHrefSlots.forEach((item) => (fieldHrefSlotKeysMap[item.slotName] = item));\n        let currColumns: any = handleColumnHrefAndDict(metaColumnList, fieldHrefSlotKeysMap);\n        // 代码逻辑说明: 【issues/946】popup列宽和在线报表列宽读取配置\n        currColumns.forEach((item) => {\n          if (isString(item.fieldWidth) && item.fieldWidth.trim().length == 0) return;\n          if (item.fieldWidth != null) {\n            item.width = item.fieldWidth;\n            delete item.fieldWidth;\n          }\n        });\n\n        // popup需要序号， 普通列表不需要\n        if (clickThenCheckFlag === true) {\n          currColumns.unshift({\n            title: '序号',\n            dataIndex: 'rowIndex',\n            key: 'rowIndex',\n            width: 60,\n            align: 'center',\n            customRender: function ({ text }) {\n              return parseInt(text) + 1;\n            },\n          });\n        }\n\n        // 合并表头\n        if (isGroupTitle === true) {\n          currColumns = handleGroupTitle(currColumns);\n        }\n        columns.value = [...currColumns];\n        initQueryInfo(res.result.data);\n      } else {\n        // 代码逻辑说明: VUEN-583【vue3】JeecgBootException: sql黑名单校验不通过,请联系管理员!,前台无提示\n        createMessage.warning(res.message);\n      }\n    });\n  }\n\n  // 处理动态参数和系统变量\n  function handleCodeParams(onlyCode: boolean = false) {\n    if (!props.code) {\n      return {code: '', query: ''}\n    }\n    const firstIndex = props.code.indexOf('?')\n    if (firstIndex === -1) {\n      return {code: props.code, query: ''}\n    }\n    const code = props.code.substring(0, firstIndex)\n    if (onlyCode) {\n      return {code: code, query: ''}\n    }\n    const queryOrigin = props.code.substring(firstIndex, props.code.length);\n    let query: string\n    // 替换系统变量\n    query = replaceUserInfoByExpression(queryOrigin)\n    // 获取表单值\n    if (typeof props.getFormValues === 'function') {\n      const values = props.getFormValues()\n      // 替换动态参数，如果有 ${xxx} 则替换为实际值\n      query = query.replace(/\\${([^}]+)}/g, (_$0, $1) => {\n        if (values[$1] == null) {\n          return ''\n        }\n        return values[$1]\n      });\n\n    }\n\n    return {code, query, queryOrigin}\n  }\n\n  /**\n   * 处理求和的列 合计逻辑 [待优化 3.0]\n   */\n  function handleSumColumn(metaColumnList: OnlineColumn[], dataTotal: number): void {\n    // 获取需要合计列的dataIndex\n    let sumColumnList = getNeedSumColumns(metaColumnList);\n    // 判断是否为第一次获取数据，如果是的话，则需要重新设置pageSize\n    if (pagination.isTotal == '') {\n      if (sumColumnList.length > 0) {\n        pagination.isTotal = true;\n        // 有合计字段时，每次最多查询原pageSize-1条记录，另外需要第一次时将查询的10条中删除最后一条\n        // 删除最后一条数据 如果第一次得到的数据长度等于pageSize的话，则删除最后一条\n        if (dataSource.value.length == pagination.pageSize) {\n          let remove_data = dataSource.value.pop();\n        }\n        pagination.realPageSize = pagination.pageSize - 1;\n      } else {\n        pagination.isTotal = false;\n      }\n    }\n    // 需要添加合计字段\n    if (pagination.isTotal) {\n      let totalRow = {};\n      sumColumnList.forEach((dataIndex) => {\n        let count = 0;\n        dataSource.value.forEach((row) => {\n          // 统计去除null及空数据\n          if (row[dataIndex] != null && row[dataIndex] != '') {\n            count += parseFloat(row[dataIndex]);\n          }\n        });\n        totalRow[dataIndex] = isNaN(count) ? '包含非数字内容' : count.toFixed(2);\n\n        // 长整形时合计不显示.00后缀\n        let v = metaColumnList.find((v) => v.dataIndex == dataIndex);\n        if (v && v.fieldType == 'Long') {\n          totalRow[dataIndex] = parseInt(totalRow[dataIndex]);\n        }\n      });\n      dataSource.value.push(totalRow);\n      pagination.realTotal = dataTotal;\n      pagination.total = Number(dataTotal) + Number(Math.floor(dataTotal / pagination.realPageSize));\n    }\n  }\n\n  /**\n   * 获取需要求和的列 dataIndex\n   * @param columns\n   */\n  function getNeedSumColumns(columns: OnlineColumn[]): string[] {\n    let arr: string[] = [];\n    for (let column of columns) {\n      if (column.isTotal === '1') {\n        arr.push(column.dataIndex!);\n      }\n        // 【VUEN-1569】【online报表】合计无效\n      if (column.children && column.children.length > 0) {\n        let subArray = getNeedSumColumns(column.children);\n        if (subArray.length > 0) {\n          arr.push(...subArray);\n        }\n      }\n    }\n    return arr;\n  }\n\n  /**\n   * 处理列的href和字典翻译\n   */\n  function handleColumnHrefAndDict(columns: OnlineColumn[], fieldHrefSlotKeysMap: {}): OnlineColumn[] {\n    for (let column of columns) {\n      let { customRender, hrefSlotName, fieldType } = column;\n      // online 报表中类型配置为日期（yyyy-MM-dd ），但是实际展示为日期时间格式(yyyy-MM-dd HH:mm:ss) issues/3042\n      if (fieldType == 'Date') {\n        column.customRender = ({ text }) => {\n          if (!text) {\n            return '';\n          }\n          if (text.length > 10) {\n            return text.substring(0, 10);\n          }\n          return text;\n        };\n      } else {\n        if (!hrefSlotName && column.scopedSlots && column.scopedSlots.customRender) {\n          //【Online报表】字典和href互斥 这里通过fieldHrefSlotKeysMap 先找到是href的列\n          if (fieldHrefSlotKeysMap.hasOwnProperty(column.scopedSlots.customRender)) {\n            hrefSlotName = column.scopedSlots.customRender;\n          }\n        }\n        // 如果 customRender 有值则代表使用了字典\n        // 如果 hrefSlotName 有值则代表使用了href跳转\n        // 两者可以兼容。兼容的具体思路为：先获取到字典替换的值，再添加href链接跳转\n        if (customRender || hrefSlotName) {\n          let dictCode = customRender as string;\n          let replaceFlag = '_replace_text_';\n          column.customRender = ({ text, record }) => {\n            let value = text;\n            // 如果 dictCode 有值，就进行字典转换\n            if (dictCode) {\n              if (dictCode.startsWith(replaceFlag)) {\n                let textFieldName = dictCode.replace(replaceFlag, '');\n                value = record[textFieldName];\n              } else {\n                value = filterMultiDictText(unref(dictOptions)[dictCode], text + '');\n              }\n            }\n            // 扩展参数设置列的内容长度\n            if (column.showLength) {\n              if (value && value.length > column.showLength) {\n                value = value.substr(0, column.showLength) + '...';\n              }\n            }\n            // 如果 hrefSlotName 有值，就生成一个 a 标签，包裹住字典替换后（或原生）的值\n            if (hrefSlotName) {\n              let field = fieldHrefSlotKeysMap[hrefSlotName];\n              if (field) {\n                return h(\n                  'a',\n                  {\n                    onClick: () => handleClickFieldHref(field, record),\n                  },\n                  value\n                );\n              }\n            }\n            return value;\n          };\n        }\n      }\n    }\n    return columns;\n  }\n\n  /**\n   * 处理合并表头\n   * @param columns\n   */\n  function handleGroupTitle(columns: OnlineColumn[]): OnlineColumn[] {\n    let newColumns: OnlineColumn[] = [];\n    for (let column of columns) {\n      //排序字段受控  ---- 此逻辑为新增逻辑 待\n      if (unref(iSorter) && column.dataIndex === unref(iSorter).column) {\n        column.sortOrder = unref(iSorter).order === 'asc' ? 'ascend' : 'descend';\n      }\n      //判断字段是否需要合并表头\n      if (column.groupTitle) {\n        let clIndex = newColumns.findIndex((im) => im.title === column.groupTitle);\n        if (clIndex !== -1) {\n          //表头已存在直接push children\n          newColumns[clIndex].children!.push(column);\n        } else {\n          //表头不存在组装表头信息\n          let clGroup: OnlineColumn = {},\n            child: OnlineColumn[] = [];\n          child.push(column);\n          clGroup.title = column.groupTitle;\n          clGroup.align = 'center';\n          clGroup.children = child;\n          newColumns.push(clGroup);\n        }\n      } else {\n        newColumns.push(column);\n      }\n    }\n    return newColumns;\n  }\n\n  // 获取路由器对象 href跳转用到\n  let router = useRouter();\n  /**\n   * href 点击事件\n   * @param field\n   * @param record\n   */\n  function handleClickFieldHref(field, record) {\n    let href = field.href;\n    let urlPattern = /(ht|f)tp(s?)\\:\\/\\/[0-9a-zA-Z]([-.\\w]*[0-9a-zA-Z])*(:(0-9)*)*(\\/?)([a-zA-Z0-9\\-\\.\\?\\,\\'\\/\\\\\\+&amp;%\\$#_]*)?/;\n    let compPattern = /\\.vue(\\?.*)?$/;\n    let jsPattern = /{{([^}]+)}}/g; // {{ xxx }}\n    if (typeof href === 'string') {\n      href = href.trim().replace(/\\${([^}]+)?}/g, (s1, s2) => record[s2]);\n      // 执行 {{...}} JS增强语句\n      if (jsPattern.test(href)) {\n        href = href.replace(jsPattern, function (text, s0) {\n          try {\n            // 支持 {{ ACCESS_TOKEN }} 占位符\n            if (s0.trim() === 'ACCESS_TOKEN') {\n              return getToken()\n            }\n\n            // 代码逻辑说明: 【QQYUN-6390】eval替换成new Function，解决build警告\n            return _eval(s0);\n          } catch (e) {\n            console.error(e);\n            return text;\n          }\n        });\n      }\n      if (urlPattern.test(href)) {\n        window.open(href, '_blank');\n      } else if (compPattern.test(href)) {\n        // 处理弹框\n        openHrefCompModal(href);\n      } else {\n        router.push(href);\n      }\n    }\n  }\n\n  /**\n   * 导出\n   */\n  function handleExport() {\n    const { handleExportXls } = useMethods();\n    let url = `${configUrl.export}${cgRpConfigId.value}`;\n    let params = getQueryParams(); //查询条件\n    // 【VUEN-1568】如果选中了某些行，就只导出选中的行\n    let keys = unref(checkedKeys);\n    if (keys.length > 0) {\n      keys = keys\n        .map((i) => selectRows.value.find((item) => combineRowKey(item) === i)?.id)\n        .filter((i) => i != null && i !== '');\n      // 判断是否有ID字段\n      if (keys.length === 0) {\n        createMessage.warning('由于数据中缺少ID字段，故无法使用选中导出功能');\n        return;\n      }\n      params['force_id'] = keys.join(',');\n    }\n    handleExportXls(title.value, url, params);\n  }\n\n  /**\n   * 合计逻辑 [待优化 3.0]\n   * 分页 大小改变事件\n   * @param _current\n   * @param size\n   */\n  function onSizeChange(_current, size) {\n    pagination.isTotal = '';\n    pagination.pageSize = size;\n    if (pagination.isTotal) {\n      pagination.realPageSize = size - 1;\n    } else {\n      pagination.realPageSize = size;\n    }\n    pagination.current = 1;\n  }\n\n  /**\n   *  合计逻辑 [待优化 3.0]\n   * 显示总条数\n   * @param total\n   */\n  function onShowTotal(total) {\n    // 重新根据是否有合计计算每页显示的数据\n    let start = (pagination.current - 1) * pagination.realPageSize + 1;\n    let end = start + (pagination.isTotal ? dataSource.value.length - 1 : dataSource.value.length) - 1;\n    let realTotal = pagination.isTotal ? pagination.realTotal : total;\n    return start + '-' + end + ' 共' + realTotal + '条';\n  }\n\n  /**\n   * 弹出框显示隐藏触发事件\n   */\n  async function visibleChange($event) {\n    visible.value = $event;\n    $event && loadColumnsInfo();\n  }\n\n  /**\n   * 初始化查询条件\n   * @param data 数据结果集\n   */\n  function initQueryInfo(data) {\n    let url = `${configUrl.getQueryInfo}${unref(cgRpConfigId)}`;\n    //缓存key\n    let groupIdKey = props.groupId ? `${props.groupId}${url}` : '';\n    httpGroupRequest(() => defHttp.get({ url }, { isTransformResponse: false, successMessageMode: 'none' }), groupIdKey).then((res) => {\n      // console.log(\"获取查询条件\", res);\n      if (res.success) {\n        dynamicParamHandler(res.result);\n        queryInfo.value = res.result;\n        console.log('queryInfo==>', queryInfo.value);\n        //查询条件加载后再请求数据\n        if (data) {\n          setDataSource(data);\n          //传递路由参数和动态参数，不生效，\n          loadData(1);\n        } else {\n          //没有传递data时查询数据\n          loadData(1);\n        }\n      } else {\n        createMessage.warning(res.message);\n      }\n    });\n  }\n\n  /**\n   * 加载表格数据\n   * @param arg\n   */\n  function loadData(arg?) {\n    if (arg == 1) {\n      pagination.current = 1;\n    }\n    let params = getQueryParams(); //查询条件\n    params['onlRepUrlParamStr'] = getUrlParamString();\n    console.log('params', params);\n    loading.value = true;\n    // 代码逻辑说明: 【TV360X-578】online报表SQL翻译，第二页不翻页数据\n    let url = `${configUrl.getColumnsAndData}${unref(cgRpConfigId)}`;\n    const {query} = handleCodeParams()\n    if (query) {\n      url = url + query\n    }\n    //缓存key\n    let groupIdKey = props.groupId ? `${props.groupId}${url}${JSON.stringify(params)}` : '';\n    httpGroupRequest(() => defHttp.get({ url, params }, { isTransformResponse: false, successMessageMode: 'none' }), groupIdKey).then((res) => {\n      // 代码逻辑说明: 【TV360X-578】online报表SQL翻译，第二页不翻页数据\n      res.result.dictOptions && initDictOptionData(res.result.dictOptions);\n      loading.value = false;\n      // 代码逻辑说明: 【TV360X-578】online报表SQL翻译，第二页不翻页数据\n      let data = res.result.data;\n      console.log('表格信息:', data);\n      setDataSource(data);\n    });\n  }\n\n  /**\n   * 获取地址栏的参数\n   */\n  function getUrlParamString() {\n   let query = route.query;\n   let arr:any[] = []\n   if(query && Object.keys(query).length>0){\n     Object.keys(query).map(k=>{\n       arr.push(`${k}=${query[k]}`)\n     })\n   }\n   return arr.join('&')\n  }\n\n  /**\n   * 设置dataSource\n   */\n  function setDataSource(data) {\n    if (data) {\n      pagination.total = Number(data.total);\n      let currentPage = pagination?.current ?? 1;\n      for (let a = 0; a < data.records.length; a++) {\n        if (!data.records[a].rowIndex) {\n          data.records[a].rowIndex = a + (currentPage - 1) * 10;\n        }\n      }\n      dataSource.value = data.records;\n      // 代码逻辑说明: issues/426 修复356时候引入的回归错误 JPopupOnlReportModal.vue 中未修改\n      tableRef?.value && tableRef?.value?.setPagination({\n        total: Number(data.total)\n      })\n    } else {\n      pagination.total = 0;\n      dataSource.value = [];\n    }\n    // 合计逻辑 [待优化 3.0]\n    handleSumColumn(columns.value, pagination.total);\n  }\n\n  /**\n   * 获取查询参数\n   */\n  function getQueryParams() {\n    let paramTarget = {};\n    if (unref(dynamicParam)) {\n      //处理自定义参数\n      Object.keys(unref(dynamicParam)).map((key) => {\n        paramTarget['self_' + key] = unref(dynamicParam)[key];\n      });\n    }\n    let param = Object.assign(paramTarget, unref(queryParam), unref(iSorter));\n    param.pageNo = pagination.current;\n    // 合计逻辑 [待优化 3.0]\n    //  实际查询时不使用table组件的pageSize，而使用自定义的realPageSize,realPageSize会在第一次获取到数据后变化\n    param.pageSize = pagination.realPageSize;\n    return filterObj(param);\n  }\n\n  /**\n   * 处理动态参数\n   */\n  function dynamicParamHandler(arr?) {\n    if (arr && arr.length > 0) {\n      //第一次加载查询条件前 初始化queryParam为空对象\n      let queryTemp = {};\n      for (let item of arr) {\n        if (item.mode === 'single') {\n          queryTemp[item.field] = '';\n        }\n      }\n      queryParam.value = { ...queryTemp };\n    }\n    // 合并路由参数\n    if (props.routeQuery) {\n      queryParam.value = Object.assign(queryParam.value, props.routeQuery);\n    }\n\n    let dynamicTemp = {};\n    if (props.param) {\n      Object.keys(props.param).map((key) => {\n        let str = props.param[key];\n        //【issues/8426】解决JPopup组件传参不能接收\n        if (key in queryParam.value) {\n          if (str && str.startsWith(\"'\") && str.endsWith(\"'\")) {\n            str = str.substring(1, str.length - 1);\n          }\n          //如果查询条件包含参数 设置值\n          unref(queryParam)[key] = str;\n        }\n        dynamicTemp[key] = props.param[key];\n      });\n    }\n    dynamicParam.value = { ...dynamicTemp };\n  }\n\n  /**\n   * 分页\n   * @param page\n   * @param filters\n   * @param sorter\n   */\n  function handleChangeInTable(page, filters, sorter) {\n    console.log(page, filters, sorter);\n    //分页、排序、筛选变化时触发\n    if (Object.keys(sorter).length > 0) {\n      iSorter.value = {\n        column: sorter.field,\n        order: 'ascend' === sorter.order ? 'asc' : 'desc',\n      };\n      // 排序字段受控\n      unref(columns).forEach((col) => {\n        if (col['dataIndex'] === sorter.field) {\n          col['sortOrder'] = sorter.order;\n        }\n      });\n    }\n    pagination.current = page.current;\n    pagination.pageSize = page.pageSize;\n    loadData();\n  }\n\n  /**\n   * 行点击事件\n   * @param record\n   */\n  function clickThenCheck(record) {\n    if (clickThenCheckFlag === true) {\n      // 代码逻辑说明: 【QQYUN-7514】popup单选显示radio\n      if (!props.multi) {\n        selectRows.value = [];\n        checkedKeys.value = [];\n      }\n      let rowKey = combineRowKey(record);\n      if (!unref(checkedKeys) || unref(checkedKeys).length == 0) {\n        let arr1: any[] = [],\n          arr2: any[] = [];\n        arr1.push(record);\n        arr2.push(rowKey);\n        checkedKeys.value = arr2;\n        //selectRows.value = arr1;\n      } else {\n        if (unref(checkedKeys).indexOf(rowKey) < 0) {\n          //不存在就选中\n          checkedKeys.value.push(rowKey);\n          //selectRows.value.push(record);\n        } else {\n          //已选中就取消\n          let rowKey_index = unref(checkedKeys).indexOf(rowKey);\n          checkedKeys.value.splice(rowKey_index, 1);\n          //selectRows.value.splice(rowKey_index, 1);\n        }\n      }\n      // 代码逻辑说明: 【issues/5357】点击行选中\n      tableRef.value.setSelectedRowKeys([...checkedKeys.value]);\n    }\n  }\n\n  //防止字典中有垃圾数据\n  function initDictOptionData(arr) {\n    let obj = {};\n    Object.keys(arr).map((k) => {\n      obj[k] = arr[k].filter((item) => {\n        return item != null;\n      });\n    });\n    dictOptions.value = obj;\n  }\n\n  /**\n   * 过滤对象中为空的属性\n   * @param obj\n   * @returns {*}\n   */\n  function filterObj(obj) {\n    if (!(typeof obj == 'object')) {\n      return;\n    }\n\n    for (let key in obj) {\n      if (obj.hasOwnProperty(key) && (obj[key] == null || obj[key] == undefined || obj[key] === '')) {\n        delete obj[key];\n      }\n    }\n    return obj;\n  }\n\n  // 样式\n  const dialogStyle = {\n    top: 0,\n    left: 0,\n    height: '100%',\n    margin: 0,\n    padding: 0,\n  };\n\n  // 弹窗属性配置\n  const hrefComponent = ref({\n    model: {\n      title: '',\n      okText: '关闭',\n      width: '100%',\n      open: false,\n      destroyOnClose: true,\n      style: dialogStyle,\n      // dialogStyle: dialogStyle,\n      bodyStyle: {\n        padding: '8px',\n        height: 'calc(100vh - 108px)',\n        overflow: 'auto',\n        overflowX: 'hidden',\n      },\n      // 隐藏掉取消按钮\n      cancelButtonProps: { style: { display: 'none' } },\n    },\n    on: {\n      ok: () => (hrefComponent.value.model.open = false),\n      cancel: () => (hrefComponent.value.model.open = false),\n    },\n    is: <any>null,\n    params: {},\n  });\n\n  // 超链点击事件--> 打开一个modal窗口\n  function openHrefCompModal(href) {\n    // 解析 href 参数\n    let index = href.indexOf('?');\n    let path = href;\n    if (index !== -1) {\n      path = href.substring(0, index);\n      let paramString = href.substring(index + 1, href.length);\n      let paramArray = paramString.split('&');\n      let params = {};\n      paramArray.forEach((paramObject) => {\n        let paramItem = paramObject.split('=');\n        params[paramItem[0]] = paramItem[1];\n      });\n      hrefComponent.value.params = params;\n    } else {\n      hrefComponent.value.params = {};\n    }\n    hrefComponent.value.model.open = true;\n    hrefComponent.value.model.title = '操作';\n    hrefComponent.value.is = markRaw(defineAsyncComponent(() => importViewsFile(path)));\n  }\n\n  /**\n   * emit事件 获取选中的行数据\n   */\n  function getOkSelectRows(): any[] {\n    let arr = unref(selectRows);\n    let selectedRowKeys = checkedKeys.value;\n    console.log('arr', arr);\n    if (!selectedRowKeys || selectedRowKeys.length <= 0) {\n      return [];\n    }\n    if (!arr || arr.length <= 0) {\n      return [];\n    }\n    let rows: any = [];\n    for (let key of selectedRowKeys) {\n      for (let i = 0; i < arr.length; i++) {\n        let combineKey = combineRowKey(arr[i]);\n        if (key === combineKey) {\n          rows.push(toRaw(arr[i]));\n          break;\n        }\n      }\n    }\n    return rows;\n  }\n\n  return [\n    {\n      visibleChange,\n      loadColumnsInfo,\n      loadColumnsAndData,\n      dynamicParamHandler,\n      loadData,\n      handleChangeInTable,\n      combineRowKey,\n      clickThenCheck,\n      filterUnuseSelect,\n      handleExport,\n      getOkSelectRows,\n    },\n    {\n      hrefComponent,\n      visible,\n      rowSelection,\n      checkedKeys,\n      selectRows,\n      pagination,\n      dataSource,\n      columns,\n      indexColumnProps,\n      loading,\n      title,\n      iSorter,\n      queryInfo,\n      queryParam,\n      dictOptions,\n    },\n  ];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/OnLine/types/onlineConfig.ts",
    "content": "interface ScopedSlots {\n  customRender: string;\n}\n\ninterface HrefSlots {\n  // 链接地址\n  href: string;\n  // fieldHref_字段名\n  slotName: string;\n}\n\ninterface OnlineColumn {\n  dataIndex?: string;\n  title?: string;\n  key?: string;\n  fieldType?: string;\n  width?: number | string;\n  align?: string;\n  sorter?: string | boolean;\n  isTotal?: string | number | boolean;\n  groupTitle?: string;\n  // 超链的时候 和HrefSlots中的slotName匹配\n  scopedSlots?: ScopedSlots;\n  // 一般用于字典 字典传过来的是字典编码字符串 后转函数\n  customRender?: string | Function;\n  // 这个类型不知道有什么用\n  hrefSlotName?: string;\n  showLength?: number | string;\n  children?: OnlineColumn[];\n  sortOrder?: string;\n  // 插槽对应控件类型(列表)\n  slots?: ScopedSlots;\n  //超过宽度将自动省略，暂不支持和排序筛选一起使用。\n  ellipsis?: boolean;\n  // 是否固定列\n  fixed?: boolean | 'left' | 'right';\n  //字段类型 int/string \n  dbType?:string;\n  //他表字段用\n  linkField?:string;\n  fieldExtendJson?:string\n}\n\nexport { OnlineColumn, HrefSlots };\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/UserAvatar.vue",
    "content": "<template>\n  <div class=\"user-avatar-info\">\n      <a-popover title=\"\" :overlayStyle=\"{width: '250px'}\">\n          <template #content>\n             <div style=\"display: flex;flex-direction: row;align-items: center\">\n                 <div style=\"width: 60px;text-align: center\">\n                     <a-avatar v-if=\"userAvatar\" :src=\"userAvatar\" :size=\"47\"/>\n                     <a-avatar v-else :size=\"47\">{{ getAvatarText() }}</a-avatar>\n                 </div>\n                 <div style=\"flex: 1;display: flex;flex-direction: column;margin-left: 12px\">\n                     <div style=\"color: #000;display: inline-block;font-size: 15px;font-weight: 700;margin-top: 3px;vertical-align: top;width: 170px;\">\n                         {{ userLabel }}\n                     </div>\n                     <div style=\"color: #757575;display: block;margin-top: 4px;\">\n                         {{ phone }}\n                     </div>\n                 </div>\n             </div>\n          </template>\n          <span style=\"cursor: pointer\">\n              <a-avatar v-if=\"userAvatar\" :src=\"userAvatar\" :loadError=\"loadError\"/>\n              <a-avatar v-else>{{ getAvatarText() }}</a-avatar>\n          </span>\n      </a-popover>\n      <span class=\"realname-ellipsis\">\n          {{ userLabel }}\n      </span>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { ref, watchEffect, defineComponent } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';\n  \n  export default defineComponent({\n    name: 'UserAvatar',\n    props: {\n      username: {\n        type: String,\n        default: '',\n      },\n      detail:{\n        type: Object,\n        default: ()=>{},\n      }\n    },\n    setup(props) {\n      const userAvatar = ref('');\n      const userLabel = ref('');\n      const phone = ref('');\n\n      watchEffect(async ()=>{\n        userAvatar.value = '';\n        userLabel.value = '';\n        phone.value = '';\n        let username = props.username;\n        if(username){\n          await initUserInfo(username);\n        }\n        let userInfo = props.detail;\n        if(userInfo){\n          if(userInfo.avatar){\n            userAvatar.value = getFileAccessHttpUrl(userInfo.avatar);\n          }\n          if(userInfo.realname){\n            userLabel.value = userInfo.realname;\n          }\n          if(userInfo.phone){\n            phone.value = userInfo.phone;\n          }\n        }\n      });\n\n      async function initUserInfo(val) {\n        const params = {\n          username: val,\n        };\n        const url = '/sys/user/getMultiUser';\n        const data = await defHttp.get({ url, params }, {isTransformResponse: false});\n        if(data && data.length > 0){\n          let temp = data[0].avatar;\n          if (temp) {\n            userAvatar.value = getFileAccessHttpUrl(temp)\n          }\n          userLabel.value = data[0].realname;\n          phone.value = data[0].phone;\n        }else{\n          console.log(data)\n        }\n      }\n\n      function getAvatarText() {\n        let text = userLabel.value;\n        if (!text) {\n          text = props.username;\n        }\n        if (text) {\n          if (text.length > 2) {\n            return text.substr(0, 2);\n          } else {\n            return text;\n          }\n        }\n        return '';\n      }\n      \n      function loadError() {\n        userAvatar.value = '';\n        return true;\n      }\n      \n\n      return {\n        userAvatar,\n        userLabel,\n        getAvatarText,\n        phone,\n        loadError\n      };\n    },\n  });\n</script>\n\n<style scoped lang=\"less\">\n    .user-avatar-info{\n        .ant-avatar-image{\n            cursor: pointer;\n        }\n        .realname-ellipsis {\n            overflow: hidden;\n            text-overflow: ellipsis;\n            vertical-align: top;\n            white-space: nowrap;\n            height: 32px;\n            line-height: 32px;\n            display: inline-block;\n            margin-left: 10px;\n        }\n    }\n    \n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/captcha/CaptchaModal.vue",
    "content": "<template>\n  <BasicModal @register=\"registerModal\" width=\"450px\" :minHeight=\"100\" :title=\"title\" @ok=\"handleSubmit\" destroyOnClose :canFullscreen=\"false\">\n    <BasicForm @register=\"registerForm\">\n      <template #captchaSlot=\"{ model, field }\">\n        <div style=\"width: 100%; display: flex\">\n          <a-input style=\"width: 200px\" v-model:value=\"model[field]\" placeholder=\"请输入图片验证码\" />\n          <div class=\"margin-left10\">\n            <img\n              class=\"pointer\"\n              v-if=\"randCodeData.requestCodeSuccess\"\n              style=\"margin-top: 2px; max-width: initial; height: 30px\"\n              :src=\"randCodeData.randCodeImage\"\n              @click=\"getCaptchaCode\"\n            />\n            <img v-else class=\"pointer\" style=\"margin-top: 2px; max-width: initial; height: 30px\" :src=\"codeImage\" @click=\"getCaptchaCode\" />\n          </div>\n        </div>\n      </template>\n    </BasicForm>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" name=\"CaptchaModal\">\n  import { defineComponent, reactive, ref } from 'vue';\n  import { BasicModal, useModalInner } from '@/components/Modal';\n  import { BasicForm, FormSchema, useForm } from '@/components/Form';\n  import codeImage from '@/assets/images/checkcode.png';\n  import { getCodeInfo } from '@/api/sys/user';\n  import { defHttp } from '@/utils/http/axios';\n  import {useMessage} from \"@/hooks/web/useMessage\";\n\n  export default defineComponent({\n    name: 'CaptchaModal',\n    components: { BasicModal, BasicForm },\n    emits: ['ok','register'],\n    setup(props, { emit }) {\n      const title = ref<string>('验证码');\n      const schemas: FormSchema[] = [\n        {\n          field: 'captcha',\n          component: 'Input',\n          label: '图片验证码',\n          rules: [{ required: true }],\n          slot: 'captchaSlot',\n        },\n      ];\n      //表单配置\n      const [registerForm, { resetFields, validate }] = useForm({\n        schemas: schemas,\n        showActionButtonGroup: false,\n        baseRowStyle: { \"justify-content\": 'center', \"display\": \"grid\", \"margin-top\": \"10px\" },\n        rowProps: { \"justify\": \"center\" },\n        labelCol: { span: 24 },\n        wrapperCol: { span: 24 },\n      });\n\n      //表单赋值\n      const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n        setModalProps({ confirmLoading: true });\n        //重置表单\n        await resetFields();\n        await getCaptchaCode();\n        setModalProps({ confirmLoading: false });\n      });\n\n      //存放二维码的数据\n      const randCodeData = reactive({\n        randCodeImage: '',\n        requestCodeSuccess: false,\n        checkKey: -1,\n      });\n      const { createMessage } = useMessage();\n      \n      /**\n       * 获取验证码\n       */\n      async function getCaptchaCode() {\n        await resetFields();\n        // 代码逻辑说明: [QQYUN-10775]验证码可以复用 #7674------------\n        randCodeData.checkKey = new Date().getTime() + Math.random().toString(36).slice(-4); // 1629428467008;\n        getCodeInfo(randCodeData.checkKey).then((res) => {\n          randCodeData.randCodeImage = res;\n          randCodeData.requestCodeSuccess = true;\n        });\n      }\n\n      /**\n       * 第三方配置点击事件\n       */\n      async function handleSubmit() {\n        let values = await validate();\n        defHttp.post({ url: '/sys/smsCheckCaptcha', params: { captcha: values.captcha, checkKey: randCodeData.checkKey } }, { isTransformResponse: false }).then((res)=>{\n          if(res.success){\n            emit('ok');\n            closeModal();\n          }else{\n            createMessage.warning(res.message);\n            getCaptchaCode();\n          }\n        }).catch((res) =>{\n          createMessage.warning(res.message);\n          getCaptchaCode();\n        });\n      }\n\n      /**\n       * 关闭弹窗\n       */\n      function handleCancel() {\n        closeModal();\n      }\n\n      return {\n        title,\n        registerForm,\n        registerModal,\n        handleSubmit,\n        handleCancel,\n        randCodeData,\n        codeImage,\n        getCaptchaCode,\n      };\n    },\n  });\n</script>\n\n<style scoped>\n  .margin-left10 {\n    margin-left: 10px;\n  }\n  :deep(.ant-row){\n    display: block;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/comment/CommentFiles.vue",
    "content": "<template>\n  <div>\n    <a-alert type=\"info\" class=\"jeecg-comment-files\">\n      <template #message>\n        <span class=\"j-icon\">\n          <a-upload multiple v-model:file-list=\"selectFileList\" :showUploadList=\"false\" :before-upload=\"beforeUpload\">\n            <span class=\"inner-button\"><upload-outlined />上传</span>\n          </a-upload>\n        </span>\n      </template>\n    </a-alert>\n\n    <!-- 正在上传的文件 -->\n    <div class=\"selected-file-warp\" v-if=\"selectFileList && selectFileList.length > 0\">\n      <div class=\"selected-file-list\">\n        <div class=\"item\" v-for=\"item in selectFileList\">\n          <div class=\"complex\">\n            <div class=\"content\" >\n              <!-- 图片 -->\n              <div v-if=\"isImage(item)\" class=\"content-top\" style=\"height: 100%\">\n                <div class=\"content-image\" :style=\"getImageAsBackground(item)\">\n                  <!--  <img style=\"height: 100%;\" :src=\"getImageSrc(item)\">-->\n                </div>\n              </div>\n              <!-- 文件 -->\n              <template v-else>\n                <div class=\"content-top\">\n                  <div class=\"content-icon\" :style=\"{ background: 'url(' + getBackground(item) + ')  no-repeat' }\"></div>\n                </div>\n                <div class=\"content-bottom\" :title=\"item.name\">\n                  <span>{{ item.name }}</span>\n                </div>\n              </template>\n            </div>\n            <div class=\"layer\" :class=\"{'layer-image':isImage(item)}\">\n              <div class=\"next\" @click=\"viewImage(item)\"><div class=\"text\">{{ item.name }} </div></div>\n              <div class=\"buttons\">\n                <div class=\"opt-icon\">\n                  <Tooltip title=\"删除\">\n                    <delete-outlined @click=\"handleRemove(item)\" />\n                  </Tooltip>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"item empty\"></div><div class=\"item empty\"></div><div class=\"item empty\"></div> <div class=\"item empty\"></div><div class=\"item empty\"></div><div class=\"item empty\"></div>\n      </div>\n\n      <div style=\"margin-bottom: 24px; margin-top: 18px; text-align: right\">\n        <a-button @click=\"quxiao\">取消</a-button>\n        <a-button type=\"primary\" style=\"margin-left: 10px\" @click=\"queding\" :loading=\"buttonLoading\">确定</a-button>\n      </div>\n    </div>\n\n    <!-- 历史文件 -->\n    <history-file-list :dataList=\"dataList\"></history-file-list>\n  </div>\n</template>\n\n<script>\n  import { UploadOutlined, FolderOutlined, DownloadOutlined, PaperClipOutlined, DeleteOutlined } from '@ant-design/icons-vue';\n  import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue';\n  import { uploadFileUrl } from './useComment';\n  import { propTypes } from '/@/utils/propTypes';\n  import { computed, watchEffect, unref, ref } from 'vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { fileList } from './useComment';\n  import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';\n  import { useUserStore } from '/@/store/modules/user';\n  import { saveOne, useCommentWithFile, useFileList } from './useComment';\n  import {useModal} from \"/@/components/Modal\";\n\n  import { Tooltip } from 'ant-design-vue';\n  import HistoryFileList from './HistoryFileList.vue';\n\n  export default {\n    name: 'CommentFiles',\n    components: {\n      UploadOutlined,\n      FolderOutlined,\n      JUpload,\n      DownloadOutlined,\n      PaperClipOutlined,\n      DeleteOutlined,\n      Tooltip,\n      HistoryFileList,\n    },\n    props: {\n      tableId: propTypes.string.def(''),\n      tableName: propTypes.string.def(''),\n      dataId: propTypes.string.def(''),\n      datetime:  propTypes.number.def(1)\n    },\n    setup(props) {\n      // const { createMessage } = useMessage();\n      const [registerModel, { openModal }] = useModal();\n      const { userInfo } = useUserStore();\n      const dataList = ref([]);\n      const commentId = ref('');\n\n      async function loadFileList() {\n        const params = {\n          tableName: props.tableName,\n          tableDataId: props.dataId,\n        };\n        const data = await fileList(params);\n        console.log('1111', data)\n        if (!data || !data.records || data.records.length == 0) {\n          dataList.value = [];\n        } else {\n          let array = data.records;\n          console.log(123, array);\n          dataList.value = array;\n        }\n        commentId.value = '';\n      }\n\n      watchEffect(() => {\n        // 每次切换tab都会刷新文件列表--- VUEN-1884 评论里上传的图片未在文件中显示\n        if(props.datetime){\n          if (props.tableName && props.dataId) {\n            loadFileList();\n          }\n        }\n      });\n\n      const { saveCommentAndFiles, buttonLoading } = useCommentWithFile(props);\n      const { selectFileList, beforeUpload, handleRemove, getBackground, isImage, getImageAsBackground, viewImage } = useFileList();\n\n      function quxiao() {\n        selectFileList.value = [];\n      }\n      async function queding() {\n        let obj = {\n          fromUserId: userInfo.id,\n          commentContent: '上传了附件'\n        }\n        await saveCommentAndFiles(obj, selectFileList.value)\n        selectFileList.value = [];\n        await loadFileList();\n      }\n      \n      function showFileModal() {\n        openModal(true, {})\n      }\n      \n      function onSelectFileOk(temp) {\n        // 代码逻辑说明: 【TV360X-935】从知识库选择文件判断下是否没选\n        if (temp.length === 0) return;\n        let arr = selectFileList.value;\n        // -update-begin--author:liaozhiyang---date:20240614---for：【TV360X-938】知识库文件选择支持多选\n        temp.forEach((item) => {\n          item.exist = true;\n        });\n        selectFileList.value = [...arr, ...temp];\n        // -update-end--author:liaozhiyang---date:20240614---for：【TV360X-938】知识库文件选择支持多选\n      }\n\n      return {\n        selectFileList,\n        beforeUpload,\n        handleRemove,\n        getBackground,\n        isImage,\n        dataList,\n        uploadFileUrl,\n        quxiao,\n        queding,\n        buttonLoading,\n        getImageAsBackground,\n        viewImage,\n        registerModel,\n        showFileModal,\n        onSelectFileOk,\n\n      };\n    },\n  };\n</script>\n\n<style lang=\"less\" scoped>\n  @import 'comment.less';\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/comment/CommentList.vue",
    "content": "<template>\n  <div :style=\"{ position: 'relative', height: allHeight + 'px' }\">\n    <a-list ref=\"listRef\" class=\"jeecg-comment-list\" header=\"\" item-layout=\"horizontal\" :data-source=\"dataList\" :style=\"{ height: commentHeight + 'px' }\">\n      <template #renderItem=\"{ item }\">\n        <a-list-item style=\"padding-left: 10px; flex-direction: column\" @click=\"handleClickItem\">\n          <a-comment>\n            <template #avatar>\n              <a-avatar class=\"tx\" :src=\"getAvatar(item)\" :alt=\"getAvatarText(item)\">{{ getAvatarText(item) }}</a-avatar>\n            </template>\n\n            <template #author>\n              <div class=\"comment-author\">\n                <span>{{ item.fromUserId_dictText }}</span>\n\n                <template v-if=\"item.toUserId\">\n                  <span>回复</span>\n                  <span>{{ item.toUserId_dictText }}</span>\n                  <Tooltip class=\"comment-last-content\" @openChange=\"(v)=>visibleChange(v, item)\">\n                    <template #title>\n                      <div v-html=\"getHtml(lineFeed(item.commentId_dictText))\"></div>\n                    </template>\n                    <message-outlined />\n                  </Tooltip>\n                </template>\n              </div>\n            </template>\n\n            <template #datetime>\n              <div>\n                <Tooltip :title=\"item.createTime\">\n                  <span>{{ getDateDiff(item) }}</span>\n                </Tooltip>\n              </div>\n            </template>\n\n            <template #actions>\n              <span @click=\"showReply(item)\">回复</span>\n\n              <Popconfirm title=\"确定删除吗？\" @confirm=\"deleteComment(item)\">\n                <span>删除</span>\n              </Popconfirm>\n            </template>\n\n            <template #content>\n              <div class=\"content\" v-html=\"getHtml(lineFeed(item.commentContent))\" style=\"font-size: 15px\">\n              </div>\n\n              <div v-if=\"item.fileList && item.fileList.length > 0\">\n                <!-- 历史文件 -->\n                <history-file-list :dataList=\"item.fileList\" isComment></history-file-list>\n              </div>\n            </template>\n          </a-comment>\n          <div v-if=\"item.commentStatus\" class=\"inner-comment\">\n            <my-comment inner @cancel=\"item.commentStatus = false\" @comment=\"(content, fileList) => replyComment(item, content, fileList)\" :inputFocus=\"focusStatus\"></my-comment>\n          </div>\n        </a-list-item>\n      </template>\n    </a-list>\n\n    <div class=\"comment-area\">\n      <a-comment style=\"margin: 0 10px\">\n        <template #avatar>\n          <a-avatar class=\"tx\" :src=\"getMyAvatar()\" :alt=\"getMyname()\">{{ getMyname() }}</a-avatar>\n        </template>\n        <template #content>\n          <my-comment ref=\"bottomCommentRef\" @comment=\"sendComment\" :inputFocus=\"focusStatus\"></my-comment>\n        </template>\n      </a-comment>\n    </div>\n  </div>\n</template>\n\n<script>\n  /**\n   * 评论列表\n   */\n  import { defineComponent, ref, onMounted, watch, watchEffect ,inject, nextTick } from 'vue';\n  import { propTypes } from '/@/utils/propTypes';\n  // import dayjs from 'dayjs';\n  // import relativeTime from 'dayjs/plugin/relativeTime';\n  // import customParseFormat from 'dayjs/plugin/customParseFormat';\n  // dayjs.locale('zh');\n  // dayjs.extend(relativeTime);\n  // dayjs.extend(customParseFormat);\n  \n  import { MessageOutlined } from '@ant-design/icons-vue';\n  import { Comment, Tooltip } from 'ant-design-vue';\n  import { useUserStore } from '/@/store/modules/user';\n  import MyComment from './MyComment.vue';\n  import { list, saveOne, deleteOne, useCommentWithFile, useEmojiHtml, queryById, getGloablEmojiIndex } from './useComment';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import HistoryFileList from './HistoryFileList.vue';\n  import { Popconfirm } from 'ant-design-vue';\n  import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';\n\n  export default defineComponent({\n    name: 'CommentList',\n    components: {\n      MessageOutlined,\n      AComment: Comment,\n      Tooltip,\n      MyComment,\n      Popconfirm,\n      HistoryFileList,\n    },\n    props: {\n      tableId: propTypes.string.def(''),\n      tableName: propTypes.string.def(''),\n      dataId: propTypes.string.def(''),\n      datetime:  propTypes.number.def(1),\n      // 其他需要减去的高度\n      otherHeight: propTypes.number.def(0),\n    },\n    setup(props) {\n      const { createMessage } = useMessage();\n      const dataList = ref([]);\n      const { userInfo } = useUserStore();\n      const dayjs = inject('$dayjs')\n      const listRef = ref(null);\n      /**\n       * 获取当前用户名称\n       */\n      function getMyname() {\n        if (userInfo.realname) {\n          return userInfo.realname.substr(0, 2);\n        }\n        return '';\n      }\n      \n      function getMyAvatar(){\n        return getFileAccessHttpUrl(userInfo.avatar);\n      }\n      \n      // 获取头像\n      function getAvatar(item) {\n        if (item.fromUserAvatar) {\n          return getFileAccessHttpUrl(item.fromUserAvatar)\n        }\n        return '';\n      }\n\n      // 头像没有获取 用户名前两位\n      function getAvatarText(item){\n        if (item.fromUserId_dictText) {\n          return item.fromUserId_dictText.substr(0, 2);\n        }\n        return '未知';\n      }\n\n      function getAuthor(item) {\n        if (item.toUser) {\n          return item.fromUserId_dictText + ' 回复 ' + item.fromUserId_dictText;\n        } else {\n          return item.fromUserId_dictText;\n        }\n      }\n\n      function getDateDiff(item) {\n        if (item.createTime) {\n          const temp = dayjs(item.createTime, 'YYYY-MM-DD hh:mm:ss');\n          return temp.fromNow();\n        }\n        return '';\n      }\n      const commentHeight = ref(300);\n      const allHeight = ref(300);\n      onMounted(() => {\n        let otherHeight = props.otherHeight || 0;\n        commentHeight.value = window.innerHeight - 57 - 46 - 70 - 160 - otherHeight;\n        allHeight.value = window.innerHeight - 57 - 46 - 53 -20 - otherHeight;\n      });\n\n      /**\n       * 加载数据\n       * @returns {Promise<void>}\n       */\n      async function loadData() {\n        const params = {\n          tableName: props.tableName,\n          tableDataId: props.dataId,\n          column: 'createTime',\n          order: 'desc',\n        };\n        const data = await list(params);\n        if (!data || !data.records || data.records.length == 0) {\n          dataList.value = [];\n        } else {\n          let array = data.records;\n          console.log(123, array);\n          dataList.value = array;\n          // Number.MAX_SAFE_INTEGER 火狐不兼容改成 10e4\n          nextTick(() => {\n            listRef.value && listRef.value.$el && (listRef.value.$el.scrollTop = 10e5);\n          });\n        }\n      }\n\n      const { saveCommentAndFiles } = useCommentWithFile(props);\n      // 回复\n      async function replyComment(item, content, fileList) {\n        console.log(content, item);\n        let obj = {\n          fromUserId: userInfo.id,\n          toUserId: item.fromUserId,\n          commentId: item.id,\n          commentContent: content\n        }\n        await saveCommentAndFiles(obj, fileList)\n        await loadData();\n      }\n      \n      //评论\n      async function sendComment(content, fileList) {\n        let obj = {\n          fromUserId: userInfo.id,\n          commentContent: content\n        }\n        await saveCommentAndFiles(obj, fileList)\n        await loadData();\n        focusStatus.value = false;\n        setTimeout(()=>{\n          focusStatus.value = true;\n        },100)\n      }\n\n      //删除\n      async function deleteComment(item) {\n        const params = { id: item.id };\n        await deleteOne(params);\n        await loadData();\n      }\n\n      /**\n       * 打开回复时触发\n       * @type {Ref<UnwrapRef<boolean>>}\n       */\n      const focusStatus = ref(false);\n      function showReply(item) {\n        let arr = dataList.value;\n        for (let temp of arr) {\n          temp.commentStatus = false;\n        }\n        item.commentStatus = true;\n        focusStatus.value = false;\n        focusStatus.value = true;\n      }\n\n      // 表单改变 -重新加载评论列表\n      watchEffect(() => {\n        if(props.datetime){\n          if (props.tableName && props.dataId) {\n            loadData();\n          }\n        }\n      });\n\n      //const storageEmojiIndex = inject('$globalEmojiIndex')\n      const storageEmojiIndex = getGloablEmojiIndex()\n      const { getHtml } = useEmojiHtml(storageEmojiIndex);\n      const bottomCommentRef = ref()\n      function handleClickItem(){\n        bottomCommentRef.value.changeActive()\n      }\n\n\n      /**\n       * 根据id查询评论信息\n       */\n      async function visibleChange(v, item){\n        if(v==true){\n          if(!item.commentId_dictText){\n            const data = await queryById(item.commentId);\n            if(data.success == true){\n              item.commentId_dictText = data.result.commentContent\n            }else{\n              console.error(data.message)\n              item.commentId_dictText='该评论已被删除';\n            }\n          }\n        }\n      }\n      // 代码逻辑说明: 【TV360X-932】评论加上换行\n      const lineFeed = (content) => {\n        return content.replace(/\\n/g, '<br>');\n      };\n\n      return {\n        dataList,\n        getAvatar,\n        getAvatarText,\n        getAuthor,\n        getDateDiff,\n        commentHeight,\n        allHeight,\n        replyComment,\n        sendComment,\n        getMyname,\n        getMyAvatar,\n\n        focusStatus,\n        showReply,\n        deleteComment,\n        getHtml,\n        handleClickItem,\n        bottomCommentRef,\n        visibleChange,\n        listRef,\n        lineFeed,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .jeecg-comment-list {\n    overflow: auto;\n    /* border-bottom: 1px solid #eee;*/\n    .inner-comment {\n      width: 100%;\n      padding: 0 10px;\n    }\n    .ant-comment {\n      width: 100%;\n    }\n    :deep(.ant-comment-avatar) {\n      cursor: default;\n    }\n  }\n  .comment-author {\n    span {\n      margin: 3px;\n    }\n    .comment-last-content {\n      margin-left: 5px;\n      &:hover{\n        color: @primary-color;\n      }\n    }\n  }\n  .ant-list-items{\n    .ant-list-item:last-child{\n      margin-bottom: 46px;\n    }\n  }\n  .tx{\n    margin-top: 4px;\n  }\n  // 代码逻辑说明: 【QQYUN-8639】暗黑主题适配\n  .comment-area {\n    position: absolute;\n    bottom: 0;\n    left: 0;\n    width: 100%;\n    border-top: 1px solid #eee;\n    background-color: #fff;\n  }\n  html[data-theme='dark'] {\n    .comment-area {\n      border-color: rgba(253, 253, 253, 0.12);\n      background-color: #1f1f1f;\n    }\n    .content {\n      color:rgba(255, 255, 255, 0.85);\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/comment/CommentPanel.vue",
    "content": "<template>\n  <div class=\"comment-tabs-warp\" v-if=\"showStatus\">\n    <a-tabs v-if=\"show\" @change=\"handleChange\" :animated=\"false\">\n      <a-tab-pane v-if=\"showComment\" tab=\"评论\" key=\"comment\" class=\"comment-list-tab\">\n        <comment-list :tableId=\"tableId\" :tableName=\"tableName\" :dataId=\"dataId\" :datetime=\"datetime1\" :otherHeight=\"otherHeight\"></comment-list>\n      </a-tab-pane>\n      <a-tab-pane v-if=\"showFiles\" tab=\"文件\" key=\"file\">\n        <comment-files :tableId=\"tableId\" :tableName=\"tableName\" :dataId=\"dataId\" :datetime=\"datetime2\"></comment-files>\n      </a-tab-pane>\n      <a-tab-pane v-if=\"showDataLog\" tab=\"日志\" key=\"log\">\n        <data-log-list :tableName=\"tableName\" :dataId=\"dataId\" :datetime=\"datetime3\"></data-log-list>\n      </a-tab-pane>\n    </a-tabs>\n  </div>\n  <a-empty v-else description=\"新增页面不支持评论\" />\n</template>\n\n<script>\n  /**\n   * 评论区域\n   */\n  import { propTypes } from '/@/utils/propTypes';\n  import { computed, ref, nextTick } from 'vue';\n  import CommentList from './CommentList.vue';\n  import CommentFiles from './CommentFiles.vue';\n  import DataLogList from './DataLogList.vue';\n\n  export default {\n    name: 'CommentPanel',\n    components: {\n      CommentList,\n      CommentFiles,\n      DataLogList,\n    },\n    props: {\n      tableId: propTypes.string.def(''),\n      tableName: propTypes.string.def(''),\n      dataId: propTypes.string.def(''),\n      // 显示评论\n      showComment: propTypes.bool.def(true),\n      // 显示文件\n      showFiles: propTypes.bool.def(true),\n      // 显示日志\n      showDataLog: propTypes.bool.def(true),\n      // 其他需要减去的高度\n      otherHeight: propTypes.number.def(0),\n    },\n    setup(props) {\n      const showStatus = computed(() => {\n        if (props.dataId && props.tableName) {\n          return true;\n        }\n        return false;\n      });\n\n      const datetime1 = ref(1);\n      const datetime2 = ref(1);\n      const datetime3 = ref(1);\n      const show = ref(true);\n      function handleChange(e) {\n        let temp = new Date().getTime();\n        if (e == 'comment') {\n          datetime1.value = temp;\n        } else if (e == 'file') {\n          datetime2.value = temp;\n        } else {\n          datetime3.value = temp;\n        }\n      }\n\n      // VUEN-1978【bug】online关联记录和他表字段存在问题  20 修改完数据，再次打开不切换tab的时候，修改日志没有变化\n      function reload() {\n        let temp = new Date().getTime();\n        datetime1.value = temp;\n        datetime2.value = temp;\n        datetime3.value = temp;\n        // 再次打开重置组件内的状态\n        show.value = false;\n        nextTick(() => {\n          show.value = true;\n        });\n      }\n\n      return {\n        showStatus,\n        handleChange,\n        datetime1,\n        datetime2,\n        datetime3,\n        reload,\n        show,\n      };\n    },\n  };\n</script>\n\n<style lang=\"less\" scoped>\n  .comment-tabs-warp {\n    height: 100%;\n    overflow: visible;\n    > .ant-tabs {\n      overflow: visible;\n    }\n  }\n  //antd3升级后，表单右侧讨论样式调整\n  :deep(.ant-tabs-top  .ant-tabs-nav, .ant-tabs-bottom  .ant-tabs-nav, .ant-tabs-top  div  .ant-tabs-nav, .ant-tabs-bottom  div  .ant-tabs-nav) {\n    margin: 0 16px 0;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/comment/DataLogList.vue",
    "content": "<template>\n    <div class=\"data-log-scroll\" :style=\"{'height': height+'px'}\">\n        <div class=\"data-log-content\">\n            <div class=\"logbox\">\n                \n                <div class=\"log-item\" v-for=\"(item, index) in dataList\">\n                    <span class=\"log-item-icon\">\n                        <plus-outlined v-if=\"lastIndex == index\" style=\"margin-top:3px\"/>\n                        <edit-outlined v-else/>\n                    </span>\n                    <span class=\"log-item-content\">\n                        <a @click=\"handleClickPerson\">@{{item.createName || item.createBy}}</a>\n                        {{ item.dataContent }}\n                    </span>\n                    <div class=\"log-item-date\">\n                        <Tooltip :title=\"item.createTime\">\n                            <span>{{ getDateDiff(item) }}</span>\n                        </Tooltip>\n                    </div>\n                </div>\n\n                \n            </div>\n        </div>\n    </div>\n</template>\n\n<script>\n  import { PlusOutlined, EditOutlined } from '@ant-design/icons-vue';\n  import { getModalHeight, getLogList } from './useComment'\n  import {inject, ref, watchEffect} from 'vue'\n  import { propTypes } from '/@/utils/propTypes';\n  import { Tooltip } from 'ant-design-vue';\n  // import dayjs from 'dayjs';\n  // import relativeTime from 'dayjs/plugin/relativeTime';\n  // import customParseFormat from 'dayjs/plugin/customParseFormat';\n  // dayjs.locale('zh');\n  // dayjs.extend(relativeTime);\n  // dayjs.extend(customParseFormat);\n  \n  export default {\n    name: \"DataLogList\",\n    components:{\n      PlusOutlined,\n      EditOutlined,\n      Tooltip\n    },\n    props: {\n      tableName: propTypes.string.def(''),\n      dataId: propTypes.string.def(''),\n      datetime:  propTypes.number.def(1),\n    },\n    setup(props){\n      const dayjs = inject('$dayjs')\n      const winHeight = getModalHeight();\n      const height = ref(300);\n      height.value = winHeight - 46 - 57 -53 - 30;\n\n      const dataList = ref([]);\n      const lastIndex = ref(0);\n      /**\n       * 加载数据\n       * @returns {Promise<void>}\n       */\n      async function loadData() {\n        const params = {\n          dataTable: props.tableName,\n          dataId: props.dataId,\n          type: 'comment'\n        };\n        const res = await getLogList(params);\n        if (!res || !res.result || res.result.length == 0) {\n          dataList.value = [];\n          lastIndex.value = -1;\n        } else {\n          let arr = res.result;\n          lastIndex.value = arr.length-1;\n          console.log('log-list', arr);\n          dataList.value = arr;\n        }\n      }\n      \n      watchEffect(() => {\n        if(props.datetime){\n          if (props.tableName && props.dataId) {\n            console.log(props.tableName, props.dataId)\n            loadData();\n          }\n        }\n      });\n      \n      \n\n      function getDateDiff(item) {\n        if (item.createTime) {\n          const temp = dayjs(item.createTime, 'YYYY-MM-DD hh:mm:ss');\n          return temp.fromNow();\n        }\n        return '';\n      }\n      \n      function handleClickPerson() {\n        console.log('此功能未开放')\n      }\n      \n      return {\n        height,\n        lastIndex,\n        dataList,\n        getDateDiff,\n        handleClickPerson\n      }\n    }\n  }\n</script>\n\n<style lang=\"less\" scoped>\n.data-log-scroll{\n    box-sizing: border-box;\n    height: 100%;\n    padding-bottom: 16px;\n    width: 100%;\n    overflow: hidden;\n    position: relative;\n    overflow-y: auto;\n    .data-log-content{\n /*       right: -10px;\n        bottom: 0;\n        left: 0;\n        overflow: scroll;\n        overflow-x: hidden;\n        position: absolute;\n        top: 0;*/\n        -webkit-box-sizing: border-box;\n        box-sizing: border-box;\n        .logbox{\n            box-sizing: border-box;\n            padding-left: 16px;\n            .log-item{\n                box-sizing: border-box;\n                color: #9e9e9e;\n                margin-bottom: 20px;\n                padding-left: 20px;\n                padding-right: 25px;\n                position: relative;\n                .log-item-icon{\n                    left: 0;\n                    line-height: 16px;\n                    position: absolute;\n                    top: 3px;\n                    vertical-align: middle;\n                }\n                .log-item-content{\n                    word-wrap: break-word;\n                    display: inline-block;\n                    font-size: 13px;\n                    vertical-align: middle;\n                    width: 100%;\n                    word-break: break-word;\n                    box-sizing: border-box;\n                }\n                .log-item-date{\n                    word-wrap: break-word;\n                    display: inline-block;\n                    font-size: 13px;\n                    vertical-align: middle;\n                    width: 100%;\n                    word-break: break-word;\n                    box-sizing: border-box;\n                    margin-top: 5px;\n                }\n            }\n        }\n    }\n\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/comment/HistoryFileList.vue",
    "content": "<template>\n  <div class=\"comment-file-his-list\" :class=\"isComment === true ? 'in-comment' : ''\">\n    <div class=\"selected-file-list\">\n      <div class=\"item\" v-for=\"item in dataList\">\n        <div class=\"complex\">\n          <div class=\"content\">\n            <!-- 图片 -->\n            <div v-if=\"isImage(item)\" class=\"content-top\" style=\"height: 100%\">\n              <div class=\"content-image\" :style=\"getImageAsBackground(item)\">\n                <!--<img style=\"height: 100%;\" :src=\"getImageSrc(item)\"/>-->\n              </div>\n            </div>\n            <!-- 文件 -->\n            <template v-else>\n              <div class=\"content-top\">\n                <div class=\"content-icon\" :style=\"{ background: 'url(' + getBackground(item) + ')  no-repeat' }\"></div>\n              </div>\n              <div class=\"content-bottom\" :title=\"item.name\">\n                <span>{{ item.name }}</span>\n              </div>\n            </template>\n          </div>\n          <div class=\"layer\" :class=\"{'layer-image':isImage(item)}\">\n            <div class=\"next\" @click=\"viewImage(item)\">\n              <div class=\"text\">\n                {{ item.name }}\n              </div>\n              <div class=\"text\">\n                {{ getFileSize(item) }}\n              </div>\n            </div>\n            <div class=\"buttons\">\n              <div class=\"opt-icon\">\n                <Tooltip title=\"下载\">\n                  <download-outlined @click=\"downLoad(item)\" />\n                </Tooltip>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class=\"item empty\"></div><div class=\"item empty\"></div><div class=\"item empty\"></div> <div class=\"item empty\"></div><div class=\"item empty\"></div><div class=\"item empty\"></div>\n    </div>\n  </div>\n</template>\n\n<script>\n  import { Tooltip } from 'ant-design-vue';\n  import { UploadOutlined, FolderOutlined, DownloadOutlined, PaperClipOutlined, DeleteOutlined } from '@ant-design/icons-vue';\n  import { useFileList } from './useComment';\n\n  export default {\n    name: 'HistoryFileList',\n    props: {\n      dataList: {\n        type: Array,\n        default: () => [],\n      },\n      isComment: {\n        type: Boolean,\n        default: false,\n      },\n    },\n    components: {\n      UploadOutlined,\n      FolderOutlined,\n      DownloadOutlined,\n      PaperClipOutlined,\n      DeleteOutlined,\n      Tooltip,\n    },\n    setup() {\n      const { getBackground, getFileSize, downLoad, isImage, getImageAsBackground, viewImage } = useFileList();\n      return {\n        getBackground,\n        downLoad,\n        getFileSize,\n        isImage,\n        getImageAsBackground,\n        viewImage\n      };\n    },\n  };\n</script>\n\n<style lang=\"less\" scoped>\n  @import 'comment.less';\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/comment/MyComment.vue",
    "content": "<template>\n  <div :class=\"{'comment-active': commentActive}\" class=\"comment-main\" @click=\"handleClickBlank\">\n    <textarea ref=\"commentRef\" v-model=\"myComment\" @keyup.enter=\"sendComment\" @input=\"handleCommentChange\" @blur=\"handleBlur\" class=\"comment-content\" :rows=\"3\" placeholder=\"请输入你的评论，可以@成员\"></textarea>\n    <div ref=\"commentContentRef\" class=\"comment-content comment-html-shower\" :class=\"{'no-content':noConent, 'top-div': showHtml, 'bottom-div': showHtml == false }\" v-html=\"commentHtml\" @click=\"handleClickHtmlShower\"></div>\n    <div class=\"comment-buttons\" v-if=\"commentActive\">\n      <div style=\"cursor: pointer\">\n        <Tooltip title=\"选择@用户\">\n          <user-add-outlined @click=\"openSelectUser\" />\n        </Tooltip>\n\n        <Tooltip title=\"上传附件\">\n          <PaperClipOutlined @click=\"uploadVisible = !uploadVisible\" />\n        </Tooltip>\n\n        <span title=\"表情\" style=\"display: inline-block\">\n          <SmileOutlined ref=\"emojiButton\" @click=\"handleShowEmoji\" />\n          <div style=\"position: relative\" v-show=\"\"> </div>\n        </span>\n      </div>\n      <div v-if=\"commentActive\">\n        <a-button v-if=\"inner\" @click=\"noComment\" style=\"margin-right: 10px\">取消</a-button>\n        <a-button type=\"primary\" @click=\"sendComment\" :loading=\"buttonLoading\" :disabled=\"disabledButton\">发 送</a-button>\n      </div>\n    </div>\n    <upload-chunk ref=\"uploadRef\" :visible=\"uploadVisible\" @select=\"selectFirstFile\"></upload-chunk>\n  </div>\n  <UserSelectModal  rowKey=\"username\" @register=\"registerModal\" @selected=\"setValue\" :multi=\"false\"></UserSelectModal>\n  <a-modal v-model:open=\"visibleEmoji\" :footer=\"null\" wrapClassName=\"emoji-modal\" :closable=\"false\" :width=\"460\">\n    <template #title>\n      <span></span>\n    </template>\n    <Picker\n      :pickerStyles=\"pickerStyles\" \n      :i18n=\"optionsName\" \n      :data=\"emojiIndex\"\n      emoji=\"grinning\"\n      :showPreview=\"false\" \n      :infiniteScroll=\"false\" \n      :showSearch=\"false\" \n      :showSkinTones=\"false\" \n      set=\"apple\" \n      @select=\"showEmoji\">\n    </Picker>\n  </a-modal>\n</template>\n\n<script lang=\"ts\">\n  import {ref, watch, computed, inject} from 'vue';\n  import { propTypes } from '/@/utils/propTypes';\n  import { UserAddOutlined, PaperClipOutlined, SmileOutlined } from '@ant-design/icons-vue';\n  import { Tooltip } from 'ant-design-vue';\n  import UserSelectModal from '/@/components/Form/src/jeecg/components/userSelect/UserSelectModal.vue';\n  import { useModal } from '/@/components/Modal';\n  import UploadChunk from './UploadChunk.vue';\n  import 'emoji-mart-vue-fast/css/emoji-mart.css';\n  import {getGloablEmojiIndex, useEmojiHtml} from './useComment';\n\n  const optionsName = {\n    categories: {\n      recent: '最常用的',\n      smileys: '表情选择',\n      people: '人物&身体',\n      nature: '动物&自然',\n      foods: '食物&饮料',\n      activity: '活动',\n      places: '旅行&地点',\n      objects: '物品',\n      symbols: '符号',\n      flags: '旗帜',\n    },\n  };\n  export default {\n    name: 'MyComment',\n    components: {\n      UserAddOutlined,\n      Tooltip,\n      UserSelectModal,\n      PaperClipOutlined,\n      UploadChunk,\n      SmileOutlined,\n    },\n    props: {\n      inner: propTypes.bool.def(false),\n      inputFocus: {\n        type: Boolean,\n        default: false,\n      },\n    },\n    emits: ['cancel', 'comment'],\n    setup(props, { emit }) {\n      const uploadVisible = ref(false);\n      const uploadRef = ref();\n      const commentContentRef = ref<null | HTMLDivElement>(null);\n      //注册model\n      const [registerModal, { openModal, closeModal }] = useModal();\n      const buttonLoading = ref(false);\n      const myComment = ref<string>('');\n      function sendComment(e) {\n        // 代码逻辑说明: 【TV360X-932】评论加上换行\n        const keyCode = e.keyCode || e.which;\n        if (keyCode == 13 && e.shiftKey) {\n          return;\n        }\n        let content = myComment.value;\n        if (!content && content !== '0') {\n          disabledButton.value = true;\n        } else {\n          buttonLoading.value = true;\n          let fileList = [];\n          if (uploadVisible.value == true) {\n            fileList = uploadRef.value.getUploadFileList();\n          }\n          emit('comment', content, fileList);\n          setTimeout(() => {\n            buttonLoading.value = false;\n          }, 350);\n        }\n      }\n      const disabledButton = ref(false);\n      watch(myComment, () => {\n        let content = myComment.value;\n        if (!content && content !== '0') {\n          disabledButton.value = true;\n        } else {\n          disabledButton.value = false;\n        }\n      });\n\n      function noComment() {\n        emit('cancel');\n      }\n\n      const commentRef = ref();\n      watch(\n        () => props.inputFocus,\n        (val) => {\n          if (val == true) {\n            // commentRef.value.focus()\n            myComment.value = '';\n            if (uploadVisible.value == true) {\n              uploadRef.value.clear();\n              uploadVisible.value = false;\n            }\n          }\n        },\n        { deep: true, immediate: true }\n      );\n\n      function openSelectUser() {\n        openModal(true, {\n          isUpdate: false,\n        });\n      }\n      function setValue(options) {\n        console.log('setValue', options);\n        if (options && options.length > 0) {\n          const { realname, username } = options[0];\n          if (realname && username) {\n            let str = `${realname}[${username}]`;\n            let temp = myComment.value;\n            // 代码逻辑说明: 【TV360X-929】选择@用户，应该插入到光标位置\n            if (!temp) {\n              myComment.value = '@' + str + ' ';\n            } else {\n              const index = commentRef.value?.selectionStart ?? temp.length;\n              let startStr = temp.substring(0, index);\n              const endStr = temp.substring(index);\n              if (startStr.endsWith('@')) {\n                if (startStr.length >= 2) {\n                  const i = startStr.length - 1;\n                  const s_str = startStr.substring(0, i);\n                  const e_str = startStr.substring(i);\n                  const spacing = s_str.endsWith(' ') ? '' : ' ';\n                  startStr = s_str + spacing + e_str;\n                }\n                myComment.value = startStr + str + ' ' + endStr;\n              } else {\n                const _symbol = startStr && startStr.endsWith(' ') ? '@' : ' @';\n                myComment.value = startStr + _symbol + str + ' ' + endStr;\n              }\n            }\n\n            // 代码逻辑说明: 【QQYUN-8002】选完人，鼠标应该放到后面并在前面加上空格---\n            showHtml.value = false;\n            commentRef.value.focus();\n            commentActive.value = true;\n          }\n        }\n        closeModal();        \n      }\n      // 代码逻辑说明: 【TV360X-927】@只有在输入时弹出用户弹窗，删除时不应该弹出\n      function handleCommentChange(e) {\n        if (e.data === '@') {\n          e.target.blur();\n          openSelectUser();\n        }\n      }\n      // watch(\n      //   () => myComment.value,\n      //   (val) => {\n      //     if (val && val.endsWith('@')) {\n      //       openSelectUser();\n      //     }\n      //   }\n      // );\n\n      const emojiButton = ref();\n      function onSelectEmoji(emoji) {\n        let temp = myComment.value || '';\n        temp += emoji;\n        myComment.value = temp;\n        emojiButton.value.click();\n      }\n      \n      const visibleEmoji = ref(false);\n      function showEmoji(e) {\n        let temp = myComment.value || '';\n        let str = e.colons;\n        if (str.indexOf('::') > 0) {\n          str = str.substring(0, str.indexOf(':') + 1);\n        }\n        // 代码逻辑说明: 【TV360X-931】评论表情插入光标位置\n        const index = commentRef.value?.selectionStart ?? temp.length;\n        // myComment.value = temp + str;\n        const startStr = temp.substring(0, index);\n        const endStr = temp.substring(index);\n        myComment.value = startStr + str + endStr;\n        visibleEmoji.value = false;\n        handleBlur();\n      }\n\n      const pickerStyles = {\n        width: '460px'\n        /* height: '350px',\n        top: '0px',\n        left: '-75px',\n        position: 'absolute',\n        'z-index': 9999*/\n      };\n      function handleClickBlank(e) {\n        console.log('handleClickBlank');\n        e.preventDefault();\n        e.stopPropagation();\n        visibleEmoji.value = false;\n        commentActive.value = true;\n      }\n      function handleShowEmoji(e) {\n        console.log('handleShowEmoji');\n        e.preventDefault();\n        e.stopPropagation();\n        visibleEmoji.value = !visibleEmoji.value;\n      }\n      \n      //const emojiIndex = inject('$globalEmojiIndex')\n      const emojiIndex = getGloablEmojiIndex()\n      const { getHtml } = useEmojiHtml(emojiIndex);\n\n      const commentHtml = computed(() => {\n        let temp = myComment.value;\n        if (!temp) {\n          return '请输入你的评论，可以@成员';\n        }\n        return getHtml(temp);\n      });\n\n      const showHtml = ref(false);\n      function handleClickHtmlShower(e) {\n        e.preventDefault();\n        e.stopPropagation();\n        showHtml.value = false;\n        commentRef.value.focus();\n        console.log(234);\n        commentActive.value = true;\n      }\n      function handleBlur() {\n        showHtml.value = true;\n        // 代码逻辑说明: 解决多行获取焦点和失去焦点时滚动位置不一致\n        setTimeout(() => {\n          commentContentRef.value!.scrollTop = commentRef.value.scrollTop;\n        }, 0);\n      }\n      \n      const commentActive = ref(false);\n      const noConent = computed(()=>{\n        if(myComment.value.length>0){\n          return false;\n        }\n        return true;\n      });\n      function changeActive(){\n        if(myComment.value.length==0){\n          commentActive.value = false\n          uploadVisible.value = false;\n        }\n      }\n      \n      function selectFirstFile(fileName){\n        if(myComment.value.length==0){\n          myComment.value = fileName;\n        }\n      }\n      \n      return {\n        myComment,\n        sendComment,\n        noComment,\n        disabledButton,\n        buttonLoading,\n        commentRef,\n        registerModal,\n        openSelectUser,\n        setValue,\n        handleCommentChange,\n        uploadRef,\n        uploadVisible,\n        onSelectEmoji,\n        optionsName,\n        emojiButton,\n        emojiIndex,\n        showEmoji,\n        pickerStyles,\n        visibleEmoji,\n        handleClickBlank,\n        handleShowEmoji,\n        commentHtml,\n        showHtml,\n        handleClickHtmlShower,\n        handleBlur,\n        commentActive,\n        noConent,\n        changeActive,\n        selectFirstFile,\n        commentContentRef,\n      };\n    },\n  };\n</script>\n\n<style lang=\"less\">\n  // 代码逻辑说明: 【QQYUN-8639】暗黑主题适配\n  .comment-main {\n    border: 1px solid #eee;\n    margin: 0;\n    position: relative;\n  }\n  .comment-content {\n    box-sizing: border-box;\n    margin: 0;\n    padding: 0;\n    font-variant: tabular-nums;\n    list-style: none;\n    font-feature-settings: tnum;\n    position: relative;\n    display: inline-block;\n    width: 100%;\n    padding: 4px 11px;\n    color: rgba(0, 0, 0, 0.85);\n    font-size: 15px;\n    line-height: 1.5715;\n    background-color: #fff;\n    background-image: none;\n    border: 1px solid #d9d9d9;\n    border-radius: 2px;\n    transition: all 0.3s;\n    width: 100%;\n    border: solid 0px;\n    outline: none;\n    // 代码逻辑说明: 【TV360X-933】评论框拖动之后底部评论列表被覆盖了部分\n    resize: none;\n    .emoji-item {\n      display: inline-block !important;\n      width: 0 !important;\n    }\n  }\n  .comment-buttons {\n    padding: 10px;\n    display: flex;\n    justify-content: space-between;\n    border-top: 1px solid #d9d9d9;\n    .anticon {\n      margin: 5px;\n    }\n  }\n  .comment-html-shower {\n    position: absolute;\n    top: 0;\n    left: 0;\n    // 代码逻辑说明: 解决多行获取焦点和失去焦点时滚动位置不一致\n    height: 78px;\n    overflow-y: auto;\n    &.bottom-div {\n      z-index: -99;\n    }\n    &.top-div {\n      z-index: 9;\n    }\n  }\n\n  .emoji-modal  {\n   > .ant-modal{\n      right: 25% !important;\n      margin-right: 16px !important;\n    }\n    .ant-modal-header{\n      padding: 0 !important;\n    }\n    .emoji-mart-bar{\n      display: none;\n    }\n    h3.emoji-mart-category-label{\n    /*  display: none;*/\n      border-bottom: 1px solid #eee;\n    }\n  }\n  \n  .comment-active{\n    border-color: @primary-color !important;\n    // box-shadow: 0 1px 1px 0 #90caf9, 0 1px 6px 0 #90caf9;\n  }\n  .no-content{\n    color: #a1a1a1\n  }\n  \n  /**聊天表情本地化*/\n  .emoji-type-image.emoji-set-apple {\n    background-image: url(\"./image/emoji.png\");\n  }\n  // 代码逻辑说明: 【QQYUN-8639】暗黑主题适配\n  html[data-theme='dark'] {\n    .emoji-type-image.emoji-set-apple {\n      background-image: url(\"./image/emoji_native.png\");\n    }\n    .comment-main {\n      border-color: rgba(253, 253, 253, 0.12);\n    }\n    .comment-content {\n      background-color: #141414;\n      color: rgba(255, 255, 255, 0.85);\n      border-color: rgba(253, 253, 253, 0.12);\n    }\n    .comment-buttons{\n      border-color: rgba(253, 253, 253, 0.12);\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/comment/UploadChunk.vue",
    "content": "<template>\n  <div v-if=\"visible\">\n    <a-alert type=\"info\" class=\"jeecg-comment-files\" style=\"margin: 0\">\n      <template #message>\n        <span class=\"j-icon\">\n          <a-upload multiple v-model:file-list=\"selectFileList\" :showUploadList=\"false\" :before-upload=\"beforeUpload\">\n            <span class=\"inner-button\"><upload-outlined />上传</span>\n          </a-upload>\n        </span>\n      </template>\n    </a-alert>\n\n    <!-- 正在上传的文件 -->\n    <div class=\"selected-file-warp\" v-if=\"selectFileList && selectFileList.length > 0\">\n      <div class=\"selected-file-list\">\n        <div class=\"item\" v-for=\"item in selectFileList\">\n          <div class=\"complex\">\n            <div class=\"content\">\n              <!-- 图片 -->\n              <div v-if=\"isImage(item)\" class=\"content-top\" style=\"height: 100%\">\n                <div class=\"content-image\" :style=\"{'height':'100%', 'backgroundImage': 'url('+getImageSrc(item)+')'}\">\n                  <!--  <img style=\"height: 100%;\" :src=\"getImageSrc(item)\">-->\n                </div>\n              </div>\n              <!-- 文件 -->\n              <template v-else>\n                <div class=\"content-top\">\n                  <div class=\"content-icon\" :style=\"{ background: 'url(' + getBackground(item) + ')  no-repeat' }\"></div>\n                </div>\n                <div class=\"content-bottom\" :title=\"item.name\">\n                  <span>{{ item.name }}</span>\n                </div>\n              </template>\n            </div>\n            <div class=\"layer\" :class=\"{'layer-image':isImage(item)}\">\n              <div class=\"next\" @click=\"viewImage(item)\">\n                <div class=\"text\">{{ item.name }} </div>\n              </div>\n              <div class=\"buttons\">\n                <div class=\"opt-icon\">\n                  <Tooltip title=\"删除\">\n                    <delete-outlined @click=\"handleRemove(item)\" />\n                  </Tooltip>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"item empty\"></div><div class=\"item empty\"></div><div class=\"item empty\"></div> <div class=\"item empty\"></div><div class=\"item empty\"></div><div class=\"item empty\"></div>\n      </div>\n    </div>\n  </div>\n\n</template>\n\n<script lang=\"ts\">\n  import { toRaw, watch } from 'vue';\n  import { useFileList } from './useComment';\n  import { Tooltip } from 'ant-design-vue';\n  import { UploadOutlined, FolderOutlined, DownloadOutlined, PaperClipOutlined, DeleteOutlined } from '@ant-design/icons-vue';\n  import {useModal} from \"/@/components/Modal\";\n  \n  export default {\n    name: 'UploadChunk',\n    components: {\n      Tooltip,\n      UploadOutlined,\n      FolderOutlined,\n      DownloadOutlined,\n      PaperClipOutlined,\n      DeleteOutlined,\n    },\n    props: {\n      visible: {\n        type: Boolean,\n        default: false,\n      },\n    },\n    emits:['select'],\n    setup(_p, {emit}) {\n      const { selectFileList, beforeUpload, handleRemove, getBackground, isImage, getImageSrc, viewImage } = useFileList();\n\n      const [registerModel, { openModal }] = useModal();\n      \n      function getUploadFileList() {\n        let list = toRaw(selectFileList.value);\n        console.log(list);\n        return list;\n      }\n      \n      function clear(){\n        selectFileList.value = [];\n      }\n      \n      watch(()=>selectFileList.value, (arr)=>{\n        if(arr && arr.length>0){\n          let name = arr[0].name;\n          if(name){\n            emit('select', name)\n          }\n        }\n      });\n\n      function showFileModal() {\n        openModal(true, {})\n      }\n\n      function onSelectFileOk(temp) {\n        let arr = selectFileList.value;\n        // 代码逻辑说明: 【JHHB-524】我的日程留言功能，从文件库中无法选附件\n        temp.forEach((item) => {\n          arr.push({\n            ...item,\n            exist: true\n          })\n        });\n        selectFileList.value = arr;\n      }\n\n      return {\n        selectFileList,\n        beforeUpload,\n        handleRemove,\n        getBackground,\n        getUploadFileList,\n        clear,\n        isImage, \n        getImageSrc, \n        viewImage,\n        registerModel,\n        showFileModal,\n        onSelectFileOk\n      };\n    },\n  };\n</script>\n\n<style lang=\"less\" scoped>\n  @import 'comment.less';\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/comment/comment.less",
    "content": "/*文件上传列表-begin*/\n.selected-file-warp,\n.comment-file-his-list {\n  margin: 10px 20px;\n  &.in-comment{\n    margin: 10px 6px;\n  }\n}\n.selected-file-list {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  margin-right: -6px;\n  .item {\n    box-sizing: border-box;\n    display: inline-block;\n    flex: 1 1 0%;\n    height: 118px;\n    margin: 0 6px 6px 0;\n    min-width: 140px;\n    max-width: 200px;\n    width: 150px;\n    &.empty {\n      height: 0;\n      margin-bottom: 0;\n      margin-top: 0;\n    }\n    .complex {\n      border: 1px solid #e0e0e0;\n      box-sizing: border-box;\n      height: 100%;\n      position: relative;\n      .content {\n        display: flex;\n        flex-direction: column;\n        height: 100%;\n        box-sizing: border-box;\n        .content-top {\n          align-items: center;\n          background-color: #f5f5f5;\n          display: flex;\n          flex: 1 1 0%;\n          justify-content: center;\n          .content-icon {\n            background-position: 50%;\n            background-size: contain !important;\n            height: 55px;\n            width: 40px;\n            display: inline-block;\n            overflow: hidden;\n            text-align: left;\n            text-indent: -9999px;\n          }\n          .content-image{\n            background-position: 50%;\n            background-repeat: no-repeat;\n            background-size: cover;\n            height: 100%;\n            width: 100%;\n          }\n        }\n        .content-bottom {\n          align-items: center;\n          background-color: #fff;\n          display: flex;\n          flex-basis: 30px;\n          font-size: 13px;\n          justify-content: flex-start;\n          padding: 0 10px;\n          span {\n            overflow: hidden;\n            text-overflow: ellipsis;\n            white-space: nowrap;\n          }\n        }\n      }\n      .layer {\n        opacity: 0;\n        background-color: #f5f5f5;\n        cursor: pointer;\n        display: flex;\n        flex-direction: column;\n        height: 100%;\n        left: 0;\n        position: absolute;\n        top: 0;\n        transition: opacity 0.2s;\n        width: 100%;\n        &:hover {\n          opacity: 1;\n        }\n        .next {\n          height: 75px;\n          padding: 5px;\n          .text {\n            color: rgba(51, 51, 51, 0.6) !important;\n            align-items: center;\n            display: flex;\n            flex-basis: 30px;\n            font-size: 12px;\n            justify-content: flex-start;\n            padding: 3px 7px 4px;\n            word-break: break-all;\n            display: -webkit-box;\n            line-height: 14px;\n            overflow: hidden;\n            text-overflow: ellipsis;\n          }\n        }\n        .buttons {\n          flex-basis: 32px;\n          text-align: right;\n          display: flex;\n          align-items: flex-end;\n          padding-right: 5px;\n          justify-content: flex-end;\n          .opt-icon {\n            background-color: #fff;\n            border-radius: 2px;\n            cursor: pointer;\n            height: 24px;\n            width: 32px;\n            margin: 5px;\n            text-align: center;\n            .anticon-delete:hover {\n              color: red;\n            }\n            .anticon-download:hover{\n              color: #1e88e5 !important\n            }\n          }\n        }\n      }\n      .layer-image{\n        background: #000;\n        &:hover {\n          opacity: 0.6;\n        }\n        .next{\n          .text{\n            color: #fff !important;\n          }\n        }\n        .opt-icon{\n          color: #000 !important;\n          .anticon-delete:hover {\n            color: red;\n          }\n        }\n      }\n      \n    }\n  }\n}\n\n.jeecg-comment-files {\n  margin: 0 20px;\n  padding-top: 3px;\n  padding-bottom: 3px;\n  &.ant-alert-info{\n    background-color: #f5f5f5;\n    border: 1px solid #f5f5f5;\n  }\n  .j-icon {\n    cursor: pointer;\n    display: inline-block;\n    border: 1px solid #e6f7ff;\n    padding: 2px 7px;\n    margin: 0 10px;\n    &:hover,\n    &:focus,\n    &:active {\n      border-color: #fff;\n      color: #096dd9;\n    }\n    .inner-button {\n      display: inline-block;\n      color:#9e9e9e;\n      &:hover,\n      &:focus,\n      &:active {\n        /*border-color: #fff;*/\n       /* color: #096dd9;*/\n        color: #000;\n      }\n      span{\n        margin-right: 3px;\n      }\n    }\n  }\n}\n\n.comment-file-list {\n  .detail-item {\n    display: flex;\n    flex-direction: row;\n    align-items: stretch;\n    line-height: 24px;\n    border-bottom: 1px solid #f0f0f0;\n    height: 100%;\n\n    .item-title {\n      display: flex;\n      align-items: center;\n      justify-content: flex-end;\n      flex-shrink: 0;\n      flex-grow: 0;\n      min-width: 100px;\n      width: 20%;\n      max-width: 220px;\n      background-color: #fafafa;\n      border-right: 1px solid #f0f0f0;\n      /* border-left: 1px solid #f0f0f0;*/\n      padding: 10px 0;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n      overflow: hidden;\n    }\n\n    .item-content {\n      border-right: 1px solid #f0f0f0;\n      flex-grow: 1;\n      padding-left: 10px;\n      display: flex;\n      align-items: center;\n      justify-content: flex-start;\n      .anticon {\n        &:hover {\n          color: #40a9ff;\n        }\n      }\n    }\n  }\n}\n\n// update-begin--author:liaozhiyang---date:20240327---for：【QQYUN-8639】暗黑主题适配\nhtml[data-theme='dark'] {\n  .jeecg-comment-files {\n    &.ant-alert-info {\n      background-color: #141414;\n      border: 1px solid #3a3a3a;\n    }\n    .j-icon,\n    .j-icon:hover {\n      border-color: #3a3a3a;\n      .inner-button:hover {\n        color: #bebebe;\n      }\n    }\n  }\n}\n// update-end--author:liaozhiyang---date:20240327---for：【QQYUN-8639】暗黑主题适配\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/comment/useComment.ts",
    "content": "import { useMessage } from '/@/hooks/web/useMessage';\nimport { defHttp } from '/@/utils/http/axios';\nimport { useGlobSetting } from '/@/hooks/setting';\nconst globSetting = useGlobSetting();\nconst baseUploadUrl = globSetting.uploadUrl;\nimport { ref, toRaw, unref, reactive } from 'vue';\nimport { uploadMyFile } from '/@/api/common/api';\n\nimport excel from '/@/assets/svg/fileType/excel.svg';\nimport other from '/@/assets/svg/fileType/other.svg';\nimport pdf from '/@/assets/svg/fileType/pdf.svg';\nimport txt from '/@/assets/svg/fileType/txt.svg';\nimport word from '/@/assets/svg/fileType/word.svg';\nimport image from '/@/assets/svg/fileType/image.png';\nimport { getFileAccessHttpUrl } from '/@/utils/common/compUtils';\nimport { createImgPreview } from '/@/components/Preview';\nimport data from \"emoji-mart-vue-fast/data/apple.json\";\nimport { EmojiIndex } from \"emoji-mart-vue-fast/src\";\nimport { encryptByBase64 } from '/@/utils/cipher';\n\nenum Api {\n  list = '/sys/comment/listByForm',\n  addText = '/sys/comment/addText',\n  deleteOne = '/sys/comment/deleteOne',\n  fileList = '/sys/comment/fileList',\n  logList = '/sys/dataLog/queryDataVerList',\n  queryById = '/sys/comment/queryById',\n  getFileViewDomain = '/sys/comment/getFileViewDomain',\n}\n\n// 文件预览地址的domain 在后台配置的\nlet onlinePreviewDomain = '';\n\n/**\n * 获取文件预览的domain\n */\nconst getViewFileDomain = () => defHttp.get({ url: Api.getFileViewDomain });\n\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) => defHttp.get({ url: Api.list, params });\n\nexport function getGloablEmojiIndex(){\n  if(window['myEmojiIndex']){\n    console.log(\"----走window['myEmojiIndex']缓存，不new新对象！\")\n    return window['myEmojiIndex'];\n  }\n  \n  window['myEmojiIndex'] = new EmojiIndex(data, {\n    function() {\n      return true;\n    },\n    exclude:['recent','people','nature','foods','activity','places','objects','symbols','flags']\n  });\n  return window['myEmojiIndex'];\n}\n\n/**\n * 查询单条记录\n * @param params\n */\nexport const queryById = (id) => {\n  let params = { id: id };\n  return defHttp.get({ url: Api.queryById, params },{ isTransformResponse: false });\n};\n\n/**\n * 文件列表接口\n * @param params\n */\nexport const fileList = (params) => defHttp.get({ url: Api.fileList, params });\n\n/**\n * 删除单个\n */\nexport const deleteOne = (params) => {\n  return defHttp.delete({ url: Api.deleteOne, params }, { joinParamsToUrl: true });\n};\n\n/**\n * 保存\n * @param params\n */\nexport const saveOne = (params) => {\n  let url = Api.addText;\n  return defHttp.post({ url: url, params }, { isTransformResponse: false });\n};\n\n/**\n * 数据日志列表接口\n * @param params\n */\nexport const getLogList = (params) => defHttp.get({ url: Api.logList, params }, {isTransformResponse: false});\n\n\n/**\n * 文件上传接口\n */\nexport const uploadFileUrl = `${baseUploadUrl}/sys/comment/addFile`;\n\nexport function useCommentWithFile(props) {\n  let uploadData = {\n    biz: 'comment',\n    commentId: '',\n  };\n  const { createMessage } = useMessage();\n  const buttonLoading = ref(false);\n\n  //确定按钮触发\n  async function saveCommentAndFiles(obj, fileList) {\n    buttonLoading.value = true;\n    setTimeout(() => {\n      buttonLoading.value = false;\n    }, 500);\n    await saveComment(obj);\n    await uploadFiles(fileList);\n  }\n\n  /**\n   * 保存评论\n   */\n  async function saveComment(obj) {\n    const {fromUserId, toUserId, commentId, commentContent} = obj;\n    let commentData = {\n      tableId: props.tableId,\n      tableName: props.tableName,\n      tableDataId: props.dataId,\n      fromUserId,\n      commentContent,\n      toUserId: '',\n      commentId: ''\n    };\n    if(toUserId){\n      commentData.toUserId = toUserId;\n    }\n    if(commentId){\n      commentData.commentId = commentId;\n    }\n    uploadData.commentId = '';\n    const res = await saveOne(commentData);\n    if (res.success) {\n      uploadData.commentId = res.result;\n    } else {\n      createMessage.warning(res.message);\n      return Promise.reject('保存评论失败');\n    }\n  }\n\n  async function uploadOne(file) {\n    let url = uploadFileUrl;\n    const formData = new FormData();\n    formData.append('file', file);\n    formData.append('tableName', props.tableName);\n    formData.append('tableDataId', props.dataId);\n    Object.keys(uploadData).map((k) => {\n      formData.append(k, uploadData[k]);\n    });\n    return new Promise((resolve, reject) => {\n      uploadMyFile(url, formData).then((res: any) => {\n        console.log('uploadMyFile', res);\n        if (res && res.data) {\n          if (res.data.result == 'success') {\n            resolve(1);\n          } else {\n            createMessage.warning(res.data.message);\n            reject();\n          }\n        } else {\n          reject();\n        }\n      });\n    });\n  }\n\n  /**\n   * QQYUN-4310【文件】从文件库选择文件功能未做\n   * @param file\n   */\n  async function saveSysFormFile(file){\n    let url = '/sys/comment/addFile';\n    let params = {\n      fileId: file.id,\n      commentId: uploadData.commentId\n    }\n    await defHttp.post({url, params}, { joinParamsToUrl: true, isTransformResponse: false });\n  }\n\n  async function uploadFiles(fileList) {\n    if (fileList && fileList.length > 0) {\n      for (let i = 0; i < fileList.length; i++) {\n        let file = toRaw(fileList[i]);\n        if(file.exist === true){\n          await saveSysFormFile(file);\n        }else{\n          await uploadOne(file.originFileObj);\n        }\n      }\n    }\n  }\n\n  return {\n    saveCommentAndFiles,\n    buttonLoading,\n  };\n}\n\nexport function uploadMu(fileList) {\n  const formData = new FormData();\n  // let arr = []\n  for(let file of fileList){\n    formData.append('files[]', file.originFileObj);\n  }\n  console.log(formData)\n  let url = `${baseUploadUrl}/sys/comment/addFile2`;\n  uploadMyFile(url, formData).then((res: any) => {\n    console.log('uploadMyFile', res);\n  });\n}\n\n/**\n * 显示文件列表\n */\nexport function useFileList() {\n  const imageSrcMap = reactive({});\n  const typeMap = {\n    xls: excel,\n    xlsx: excel,\n    pdf: pdf,\n    txt: txt,\n    docx: word,\n    doc: word,\n    image\n  };\n   function getBackground(item) {\n    console.log('获取文件背景图', item);\n    if (isImage(item)) {\n      return 'none'\n    } else {\n      const name = item.name;\n      if(!name){\n        return 'none';\n      }\n      const suffix = name.substring(name.lastIndexOf('.') + 1);\n      console.log('suffix', suffix)\n      let bg = typeMap[suffix];\n      if (!bg) {\n        bg = other;\n      }\n      return bg;\n    }\n  }\n  \n  function getImageTypeIcon() {\n    return typeMap['image'];\n  }\n\n  function getBase64(file, id){\n    return new Promise((resolve, reject) => {\n      //声明js的文件流\n      let reader = new FileReader();\n      if(file){\n        //通过文件流将文件转换成Base64字符串\n        reader.readAsDataURL(file);\n        //转换成功后\n        reader.onload = function () {\n          let base = reader.result;\n          console.log('base', base)\n          imageSrcMap[id] = base;\n          console.log('imageSrcMap', imageSrcMap)\n          resolve(base)\n        }\n      }else{\n        reject();\n      }\n    })\n  }\n  function handleImageSrc(file){\n    if(isImage(file)){\n      let id = file.uid;\n      getBase64(file, id);\n    }\n  }\n\n  function downLoad(file) {\n    let url = getFileAccessHttpUrl(file.url);\n    if (url) {\n      window.open(url);\n    }\n  }\n\n  function getFileSize(item) {\n    let size = item.fileSize;\n    if (!size) {\n      return '0B';\n    }\n    let temp = Math.round(size / 1024);\n    return temp + ' KB';\n  }\n\n  const selectFileList = ref<any[]>([]);\n  function beforeUpload(file) {\n    handleImageSrc(file);\n    selectFileList.value = [...selectFileList.value, file];\n    console.log('selectFileList', unref(selectFileList));\n    return false\n  }\n\n  function handleRemove(file) {\n    const index = selectFileList.value.indexOf(file);\n    const newFileList = selectFileList.value.slice();\n    newFileList.splice(index, 1);\n    selectFileList.value = newFileList;\n  }\n\n  function isImage(item){\n    const type = item.type||'';\n    if (type.indexOf('image') >= 0) {\n      return true;\n    }\n    return false;\n  }\n\n  function getImageSrc(file){\n    if(file.exist){\n      return getFileAccessHttpUrl(file.url);\n    }\n    if(isImage(file)){\n      let id = file.uid;\n      if(id){\n        if(imageSrcMap[id]){\n          return imageSrcMap[id];\n        }\n      }else if(file.url){\n        //数据库中地址\n        let url = getFileAccessHttpUrl(file.url);\n        return url;\n      }\n    }\n    return ''\n  }\n\n  /**\n   * 显示图片\n   * @param item\n   */\n  function getImageAsBackground(item){\n    let url;\n    if(item.exist){\n      url = getFileAccessHttpUrl(item.url);\n    }else{\n      url = getImageSrc(item);\n    }\n    if(url){\n      return {\n        \"backgroundImage\": \"url('\"+url+\"')\"\n      }\n    }\n    return {}\n  }\n\n  /**\n   * 预览列表 cell 图片\n   * @param text\n   */\n  async function viewImage(file) {\n    if(isImage(file)){\n      let text = getImageSrc(file)\n      if (text) {\n        let imgList = [text];\n        createImgPreview({ imageList: imgList });\n      }\n    }else{\n      if(file.url){\n        //数据库中地址\n        let url = getFileAccessHttpUrl(file.url);\n        await initViewDomain();\n        //本地测试需要将文件地址的localhost/127.0.0.1替换成IP, 或是直接修改全局domain\n        //url = url.replace('localhost', '192.168.1.100')\n        // 代码逻辑说明: 【TV360X-952】升级到kkfileview4.1.0---\n        let previewUrl = encodeURIComponent(encryptByBase64(url));\n        window.open(onlinePreviewDomain+'?url='+previewUrl);\n      }\n    }\n  }\n\n  /**\n   * 初始化domain\n   */\n  async function initViewDomain(){\n    if(!onlinePreviewDomain){\n      onlinePreviewDomain = await getViewFileDomain();\n    }\n    if(!onlinePreviewDomain.startsWith('http')){\n      onlinePreviewDomain = 'http://'+ onlinePreviewDomain;\n    }\n  }\n\n  return {\n    selectFileList,\n    getBackground,\n    getFileSize,\n    downLoad,\n    beforeUpload,\n    handleRemove,\n    isImage,\n    getImageSrc,\n    getImageAsBackground,\n    viewImage,\n    getImageTypeIcon\n  };\n}\n\n/**\n * 用于emoji渲染\n */\nexport function useEmojiHtml(globalEmojiIndex){\n  const COLONS_REGEX = new RegExp('([^:]+)?(:[a-zA-Z0-9-_+]+:(:skin-tone-[2-6]:)?)','g');\n\n  function getHtml(text) {\n    if(!text){\n      return ''\n    }\n    return text.replace(COLONS_REGEX, function (match, p1, p2) {\n      const before = p1 || ''\n      if (endsWith(before, 'alt=\"') || endsWith(before, 'data-text=\"')) {\n        return match\n      }\n      let emoji = globalEmojiIndex.findEmoji(p2)\n      if (!emoji) {\n        return match\n      }\n      return before + emoji2Html(emoji)\n    })\n    return text;\n  }\n\n  function endsWith(str, temp){\n    return str.endsWith(temp)\n  }\n\n  function emoji2Html(emoji) {\n    let style = `position: absolute;top: -3px;left: 3px;width: 18px; height: 18px;background-position: ${emoji.getPosition()}`\n    return `<span style=\"width: 24px\" class=\"emoji-mart-emoji\"><span class=\"my-emoji-icon emoji-set-apple emoji-type-image\" style=\"${style}\"> </span> </span>`\n  }\n  \n  return {\n    globalEmojiIndex,\n    getHtml\n  }\n}\n\n/**\n * 获取modal窗体高度\n */\nexport function getModalHeight(){\n  return window.innerHeight;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/thirdApp/JThirdAppButton.vue",
    "content": "<template>\n  <template v-if=\"syncToApp || syncToLocal\">\n    <JThirdAppDropdown v-if=\"enabledTypes.wechatEnterprise\" type=\"wechatEnterprise\" name=\"企微\" v-bind=\"bindAttrs\" v-on=\"bindEvents\" />\n    <JThirdAppDropdown v-if=\"enabledTypes.dingtalk\" type=\"dingtalk\" name=\"钉钉\" v-bind=\"bindAttrs\" v-on=\"bindEvents\" />\n  </template>\n  <template v-else>未设置任何同步方向</template>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ExclamationCircleOutlined } from '@ant-design/icons-vue';\n  import { ref, computed, createVNode, h, resolveComponent } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { backEndUrl, getEnabledTypes, doSyncThirdApp } from './jThirdApp.api';\n  import { Modal, Input } from 'ant-design-vue';\n  import JThirdAppDropdown from './JThirdAppDropdown.vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  const { createMessage, createWarningModal } = useMessage();\n  const props = defineProps({\n    // 同步类型，可以是 user、depart\n    bizType: {\n      type: String,\n      required: true,\n    },\n    // 是否允许同步到第三方APP\n    syncToApp: Boolean,\n    // 是否允许第三方APP同步到本地\n    syncToLocal: Boolean,\n    // 选择的行\n    selectedRowKeys: Array,\n  });\n  // 声明Emits\n  const emit = defineEmits(['sync-ok', 'sync-error', 'sync-finally']);\n\n  const enabledTypes = ref({});\n  // 绑定属性\n  const bindAttrs = computed(() => {\n    return {\n      syncToApp: props.syncToApp,\n      syncToLocal: props.syncToLocal,\n    };\n  });\n  // 绑定方法\n  const bindEvents = computed(() => {\n    return {\n      'to-app': onToApp,\n      'to-local': onToLocal,\n    };\n  });\n\n  // 同步到第三方App\n  function onToApp(e) {\n    doSync(e.type, '/toApp');\n  }\n\n  // 同步到本地\n  function onToLocal(e) {\n    doSync(e.type, '/toLocal');\n  }\n\n  // 获取启用的第三方App\n  async function loadEnabledTypes() {\n    enabledTypes.value = await getEnabledTypes();\n  }\n\n  // 开始同步第三方App\n  function doSync(type, direction) {\n    let urls = backEndUrl[type];\n    if (!(urls && urls[props.bizType])) {\n      console.warn('配置出错');\n      return;\n    }\n    let url = urls[props.bizType] + direction;\n    let selectedRowKeys = props.selectedRowKeys;\n    let content = '确定要开始同步全部数据吗？可能花费较长时间！';\n\n    if (Array.isArray(selectedRowKeys) && selectedRowKeys.length > 0) {\n      content = `确定要开始同步这 ${selectedRowKeys.length} 项吗？`;\n    } else {\n      selectedRowKeys = [];\n    }\n    return new Promise((resolve, reject) => {\n      const model = Modal.confirm({\n        icon: createVNode(ExclamationCircleOutlined),\n        title: '同步',\n        content,\n        onOk: () => {\n          model.update({\n            keyboard: false,\n            okText: '同步中…',\n            cancelButtonProps: { disabled: true },\n          });\n          let params = { ids: selectedRowKeys.join(',') };\n          return defHttp\n            .get({ url, params }, { isTransformResponse: false })\n            .then((res) => {\n              let options = {};\n              if (res.result) {\n                options = {\n                  width: 600,\n                  title: res.message,\n                  content: () => {\n                    let nodes;\n                    let successInfo = [`成功信息如下：`, renderTextarea(h, res.result.successInfo.map((v, i) => `${i + 1}. ${v}`).join('\\n'))];\n                    if (res.success) {\n                      nodes = [...successInfo, h('br'), `无失败信息！`];\n                    } else {\n                      nodes = [\n                        `失败信息如下：`,\n                        renderTextarea(h, res.result.failInfo.map((v, i) => `${i + 1}. ${v}`).join('\\n')),\n                        h('br'),\n                        ...successInfo,\n                      ];\n                    }\n                    return nodes;\n                  },\n                };\n              }\n              if (res.success) {\n                if (options != null) {\n                  Modal.success(options);\n                } else {\n                  createMessage.warning(res.message);\n                }\n                emit('sync-ok');\n              } else {\n                if (options != null) {\n                  Modal.warning(options);\n                } else {\n                  createMessage.warning(res.message);\n                }\n                emit('sync-error');\n              }\n            })\n            .catch(() => model.destroy())\n            .finally(() => {\n              resolve();\n              emit('sync-finally', {\n                type,\n                direction,\n                isToApp: direction === '/toApp',\n                isToLocal: direction === '/toLocal',\n              });\n            });\n        },\n        onCancel() {\n          resolve();\n        },\n      });\n    });\n  }\n\n  function renderTextarea(h, value) {\n    return h(\n      'div',\n      {\n        id: 'box',\n        style: {\n          minHeight: '100px',\n          border: '1px solid #d9d9d9',\n          fontSize: '14px',\n          maxHeight: '250px',\n          whiteSpace: 'pre',\n          overflow: 'auto',\n          padding: '10px',\n        },\n      },\n      value\n    );\n  }\n\n  // 获取启用的第三方App\n  loadEnabledTypes();\n</script>\n\n<style scoped>\n  #box:hover {\n    border-color: #40a9ff;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/thirdApp/JThirdAppDropdown.vue",
    "content": "<template>\n  <a-dropdown v-if=\"syncToApp && syncToLocal\">\n    <a-button type=\"primary\" preIcon=\"ant-design:sync-outlined\">同步{{ name }}</a-button>\n    <template #overlay>\n      <a-menu @click=\"handleMenuClick\">\n        <a-menu-item v-if=\"syncToApp\" key=\"to-app\">同步到{{ name }}</a-menu-item>\n        <a-menu-item v-if=\"getSyncToLocal\" key=\"to-local\">同步到本地</a-menu-item>\n      </a-menu>\n    </template>\n  </a-dropdown>\n  <a-button v-else-if=\"syncToApp\" type=\"primary\" preIcon=\"ant-design:sync-outlined\" @click=\"handleMenuClick({ key: 'to-app' })\"\n    >同步{{ name }}</a-button\n  >\n  <a-button v-else type=\"primary\" preIcon=\"ant-design:sync-outlined\" @click=\"handleMenuClick({ key: 'to-local' })\">同步{{ name }}到本地</a-button>\n</template>\n\n<script lang=\"ts\" setup>\n  /* JThirdAppButton 的子组件，不可单独使用 */\n  import { computed } from 'vue';\n\n  const props = defineProps({\n    type: String,\n    name: String,\n    syncToApp: Boolean,\n    syncToLocal: Boolean,\n  });\n  // 声明Emits\n  const emit = defineEmits(['to-app', 'to-local']);\n\n  const getSyncToLocal = computed(() => {\n    // 由于企业微信接口变更，将不再支持同步到本地\n    if (props.type === 'wechatEnterprise') {\n      return false;\n    }\n    return props.syncToLocal;\n  });\n\n  function handleMenuClick(event) {\n    emit(event.key, { type: props.type });\n  }\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/jeecg/thirdApp/jThirdApp.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { cloneObject } from '/@/utils/index';\n\nexport const backEndUrl = {\n  // 获取启用的第三方App\n  getEnabledType: '/sys/thirdApp/getEnabledType',\n  // 企业微信\n  wechatEnterprise: {\n    user: '/sys/thirdApp/sync/wechatEnterprise/user',\n    depart: '/sys/thirdApp/sync/wechatEnterprise/depart',\n  },\n  // 钉钉\n  dingtalk: {\n    user: '/sys/thirdApp/sync/dingtalk/user',\n    depart: '/sys/thirdApp/sync/dingtalk/depart',\n  },\n};\n// 启用了哪些第三方App（在此缓存）\nlet enabledTypes = null;\n\n// 获取启用的第三方App\nexport const getEnabledTypes = async () => {\n  // 获取缓存\n  if (enabledTypes != null) {\n    return cloneObject(enabledTypes);\n  } else {\n    let { success, result } = await defHttp.get({ url: backEndUrl.getEnabledType }, { isTransformResponse: false });\n    if (success) {\n      // 在此缓存\n      enabledTypes = cloneObject(result);\n      return result;\n    } else {\n      console.warn('getEnabledType查询失败：');\n    }\n  }\n  return {};\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/onlinePreview/WpsFileView.vue",
    "content": "<!--wps文件预览页面-->\n<template></template>\n\n<script lang=\"ts\" setup name=\"online-preview\">\n  import { router } from '@/router';\n  import { defHttp } from '/@/utils/http/axios';\n  import OpenSDK from './open-jssdk.es';\n  import { getToken } from '@/utils/auth';\n  import {useMessage} from \"@/hooks/web/useMessage\";\n\n  const {createWarningModal} = useMessage()\n\n  initWpsPath();\n\n  /**\n   * 初始化wps路径\n   */\n  async function initWpsPath() {\n    let query = router.currentRoute.value.query;\n    if (query && query.url) {\n      let result = await defHttp.get(\n        { url: '/eoa/wps/oaWpsFile/getOfflineViewWpsUrl/fileurl', params: { fileUrl: query.url } },\n        { isTransformResponse: false }\n      );\n      if (result && result.success) {\n        const instance = OpenSDK.config({\n          url: result.message,\n          mode: 'normal',\n          mount: document.querySelector('#app'),\n        });\n        // 设置 token\n        instance.setToken({\n          token: getToken(),\n        });\n      } else {\n        const msg = '请求预览地址失败' + (result.message ? `：${result.message}` : '，请重试！');\n        createWarningModal({\n          title: '提示',\n          content: msg,\n          onOk: () => window.close(),\n        });\n      }\n    } else {\n      createWarningModal({\n        title: '提示',\n        content: '获取预览地址失败，请重试！',\n        onOk: () => window.close(),\n      });\n    }\n  }\n</script>\n\n<style lang=\"less\">\n  #office-iframe {\n    position: fixed;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    z-index: 9999;\n    background: white;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/onlinePreview/open-jssdk.es.js",
    "content": "var e={658:function(e,t,n){function r(e){return r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},r(e)}function i(){i=function(){return e};var e={},t=Object.prototype,n=t.hasOwnProperty,o=Object.defineProperty||function(e,t,n){e[t]=n.value},a=\"function\"==typeof Symbol?Symbol:{},s=a.iterator||\"@@iterator\",c=a.asyncIterator||\"@@asyncIterator\",u=a.toStringTag||\"@@toStringTag\";function l(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{l({},\"\")}catch(e){l=function(e,t,n){return e[t]=n}}function d(e,t,n,r){var i=t&&t.prototype instanceof v?t:v,a=Object.create(i.prototype),s=new L(r||[]);return o(a,\"_invoke\",{value:_(e,n,s)}),a}function f(e,t,n){try{return{type:\"normal\",arg:e.call(t,n)}}catch(e){return{type:\"throw\",arg:e}}}e.wrap=d;var p={};function v(){}function h(){}function E(){}var T={};l(T,s,(function(){return this}));var g=Object.getPrototypeOf,m=g&&g(g(D([])));m&&m!==t&&n.call(m,s)&&(T=m);var b=E.prototype=v.prototype=Object.create(T);function w(e){[\"next\",\"throw\",\"return\"].forEach((function(t){l(e,t,(function(e){return this._invoke(t,e)}))}))}function y(e,t){function i(o,a,s,c){var u=f(e[o],e,a);if(\"throw\"!==u.type){var l=u.arg,d=l.value;return d&&\"object\"==r(d)&&n.call(d,\"__await\")?t.resolve(d.__await).then((function(e){i(\"next\",e,s,c)}),(function(e){i(\"throw\",e,s,c)})):t.resolve(d).then((function(e){l.value=e,s(l)}),(function(e){return i(\"throw\",e,s,c)}))}c(u.arg)}var a;o(this,\"_invoke\",{value:function(e,n){function r(){return new t((function(t,r){i(e,n,t,r)}))}return a=a?a.then(r,r):r()}})}function _(e,t,n){var r=\"suspendedStart\";return function(i,o){if(\"executing\"===r)throw new Error(\"Generator is already running\");if(\"completed\"===r){if(\"throw\"===i)throw o;return{value:void 0,done:!0}}for(n.method=i,n.arg=o;;){var a=n.delegate;if(a){var s=I(a,n);if(s){if(s===p)continue;return s}}if(\"next\"===n.method)n.sent=n._sent=n.arg;else if(\"throw\"===n.method){if(\"suspendedStart\"===r)throw r=\"completed\",n.arg;n.dispatchException(n.arg)}else\"return\"===n.method&&n.abrupt(\"return\",n.arg);r=\"executing\";var c=f(e,t,n);if(\"normal\"===c.type){if(r=n.done?\"completed\":\"suspendedYield\",c.arg===p)continue;return{value:c.arg,done:n.done}}\"throw\"===c.type&&(r=\"completed\",n.method=\"throw\",n.arg=c.arg)}}}function I(e,t){var n=t.method,r=e.iterator[n];if(void 0===r)return t.delegate=null,\"throw\"===n&&e.iterator.return&&(t.method=\"return\",t.arg=void 0,I(e,t),\"throw\"===t.method)||\"return\"!==n&&(t.method=\"throw\",t.arg=new TypeError(\"The iterator does not provide a '\"+n+\"' method\")),p;var i=f(r,e.iterator,t.arg);if(\"throw\"===i.type)return t.method=\"throw\",t.arg=i.arg,t.delegate=null,p;var o=i.arg;return o?o.done?(t[e.resultName]=o.value,t.next=e.nextLoc,\"return\"!==t.method&&(t.method=\"next\",t.arg=void 0),t.delegate=null,p):o:(t.method=\"throw\",t.arg=new TypeError(\"iterator result is not an object\"),t.delegate=null,p)}function N(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function S(e){var t=e.completion||{};t.type=\"normal\",delete t.arg,e.completion=t}function L(e){this.tryEntries=[{tryLoc:\"root\"}],e.forEach(N,this),this.reset(!0)}function D(e){if(e){var t=e[s];if(t)return t.call(e);if(\"function\"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,i=function t(){for(;++r<e.length;)if(n.call(e,r))return t.value=e[r],t.done=!1,t;return t.value=void 0,t.done=!0,t};return i.next=i}}return{next:A}}function A(){return{value:void 0,done:!0}}return h.prototype=E,o(b,\"constructor\",{value:E,configurable:!0}),o(E,\"constructor\",{value:h,configurable:!0}),h.displayName=l(E,u,\"GeneratorFunction\"),e.isGeneratorFunction=function(e){var t=\"function\"==typeof e&&e.constructor;return!!t&&(t===h||\"GeneratorFunction\"===(t.displayName||t.name))},e.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,E):(e.__proto__=E,l(e,u,\"GeneratorFunction\")),e.prototype=Object.create(b),e},e.awrap=function(e){return{__await:e}},w(y.prototype),l(y.prototype,c,(function(){return this})),e.AsyncIterator=y,e.async=function(t,n,r,i,o){void 0===o&&(o=Promise);var a=new y(d(t,n,r,i),o);return e.isGeneratorFunction(n)?a:a.next().then((function(e){return e.done?e.value:a.next()}))},w(b),l(b,u,\"Generator\"),l(b,s,(function(){return this})),l(b,\"toString\",(function(){return\"[object Generator]\"})),e.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},e.values=D,L.prototype={constructor:L,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method=\"next\",this.arg=void 0,this.tryEntries.forEach(S),!e)for(var t in this)\"t\"===t.charAt(0)&&n.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=void 0)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if(\"throw\"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var t=this;function r(n,r){return a.type=\"throw\",a.arg=e,t.next=n,r&&(t.method=\"next\",t.arg=void 0),!!r}for(var i=this.tryEntries.length-1;i>=0;--i){var o=this.tryEntries[i],a=o.completion;if(\"root\"===o.tryLoc)return r(\"end\");if(o.tryLoc<=this.prev){var s=n.call(o,\"catchLoc\"),c=n.call(o,\"finallyLoc\");if(s&&c){if(this.prev<o.catchLoc)return r(o.catchLoc,!0);if(this.prev<o.finallyLoc)return r(o.finallyLoc)}else if(s){if(this.prev<o.catchLoc)return r(o.catchLoc,!0)}else{if(!c)throw new Error(\"try statement without catch or finally\");if(this.prev<o.finallyLoc)return r(o.finallyLoc)}}}},abrupt:function(e,t){for(var r=this.tryEntries.length-1;r>=0;--r){var i=this.tryEntries[r];if(i.tryLoc<=this.prev&&n.call(i,\"finallyLoc\")&&this.prev<i.finallyLoc){var o=i;break}}o&&(\"break\"===e||\"continue\"===e)&&o.tryLoc<=t&&t<=o.finallyLoc&&(o=null);var a=o?o.completion:{};return a.type=e,a.arg=t,o?(this.method=\"next\",this.next=o.finallyLoc,p):this.complete(a)},complete:function(e,t){if(\"throw\"===e.type)throw e.arg;return\"break\"===e.type||\"continue\"===e.type?this.next=e.arg:\"return\"===e.type?(this.rval=this.arg=e.arg,this.method=\"return\",this.next=\"end\"):\"normal\"===e.type&&t&&(this.next=t),p},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),S(n),p}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if(\"throw\"===r.type){var i=r.arg;S(n)}return i}}throw new Error(\"illegal catch attempt\")},delegateYield:function(e,t,n){return this.delegate={iterator:D(e),resultName:t,nextLoc:n},\"next\"===this.method&&(this.arg=void 0),p}},e}function o(e,t,n,r,i,o,a){try{var s=e[o](a),c=s.value}catch(e){return void n(e)}s.done?t(c):Promise.resolve(c).then(r,i)}function a(e){return function(){var t=this,n=arguments;return new Promise((function(r,i){var a=e.apply(t,n);function s(e){o(a,r,i,s,c,\"next\",e)}function c(e){o(a,r,i,s,c,\"throw\",e)}s(void 0)}))}}function s(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,u(r.key),r)}}function c(e,t,n){return(t=u(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function u(e){var t=function(e,t){if(\"object\"!=r(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var i=n.call(e,t);if(\"object\"!=r(i))return i;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return String(e)}(e,\"string\");return\"symbol\"==r(t)?t:String(t)}n.r(t),n.d(t,{default:function(){return d}});var l=new(function(e,t,n){return t&&s(e.prototype,t),n&&s(e,n),Object.defineProperty(e,\"prototype\",{writable:!1}),e}((function e(){var t=this;!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,e),c(this,\"init\",(function(e){var n=e.url,r=e.token,i=e.refreshToken,o=e.mount;return t.instance&&t.instance.destroy(),n&&(t.fileLink=n,t.iframe=t.initIframe(t.fileLink,o),t.initPostMessage(),r&&t.initToken(r),i&&(t.refreshTokenCallback=i)),t.instance={fileLink:n,setToken:t.setToken,destroy:t.destroy,mount:t.iframe,print:t.print},t.instance})),c(this,\"destroy\",(function(){t.instance&&(t.iframe.parentElement.removeChild(t.iframe),t.iframe=void 0,t.root&&document.body.removeChild(t.root),window.removeEventListener(\"message\",t.handleMessage),t.instance=void 0)})),c(this,\"initToken\",(function(e){t.refreshToken(e)})),c(this,\"setToken\",(function(e){t.refreshToken(e)})),c(this,\"refreshToken\",(function(e){e.timeout&&t.refreshTokenCallback&&(clearTimeout(t.refreshTokenTimer),t.refreshTokenTimer=setTimeout((function(){t.refreshTokenCallback().then((function(n){t.refreshToken({token:n,timeout:e.timeout})}))}),Math.max(e.timeout-3e4,3e4))),t.token=e.token||e,document.cookie=\"x-user-token=\".concat(t.token,\";path=/;Domain=\").concat(document.domain,\";Expires=\").concat(new Date(Date.now()+e.timeout||3e5)),t.postMessage(\"token.refresh.back\",t.token)})),c(this,\"initIframe\",(function(e,n){var r=document.createElement(\"iframe\");return r.style.cssText=\"width:100%;height:100%;border: 0;display: block;\",r.setAttribute(\"allowfullscreen\",!0),r.src=e,n?n.appendChild(r):(t.root=document.createElement(\"div\"),t.root.classList.add(\"lite-preview-mount\"),t.root.style.cssText=\"height: 100%;width: 100%;\",document.body.appendChild(t.root),t.root.appendChild(r)),r})),c(this,\"handleMessage\",(function(e){if(t.fileLink.match(e.origin)){var n=e.data,r=n.eventName,i=n.data;switch(r){case\"ready\":t.postMessage(\"performance\",JSON.stringify(window.performance.timing)),t.token?t.postMessage(\"token.set\",t.token):t.postMessage(\"token.undefined\");break;case\"token.refresh\":t.refreshTokenCallback&&t.refreshTokenCallback().then((function(e){t.postMessage(\"token.refresh.back\",e)}));break;case\"print.response\":t.printResolve&&(clearTimeout(t.printTimer),delete t.printTimer,i&&t.printResolve(i),delete t.printResolve)}}})),c(this,\"initPostMessage\",(function(){window.addEventListener(\"message\",t.handleMessage),t.postMessage=function(e,n){return t.iframe.contentWindow.postMessage({eventName:e,data:n},\"*\")}})),c(this,\"print\",a(i().mark((function e(){var n,r=arguments;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=r.length>0&&void 0!==r[0]?r[0]:{},t.printTimer||t.printResolve){e.next=5;break}return e.abrupt(\"return\",new Promise((function(e,r){t.postMessage(\"print.request\",n),clearTimeout(t.printTimer),t.printTimer=setTimeout((function(){delete t.printResolve,delete t.printTimer,r(\"ERROR:导出接口超时\")}),6e5),t.printResolve=e})));case 5:console.error(\"WARN:已存在未完成的导出任务，请稍后重试\");case 6:case\"end\":return e.stop()}}),e)}))))})));window.litePreviewSDK={config:l.init};var d={config:l.init}},123:function(e,t,n){function r(e){return r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},r(e)}n.r(t),n.d(t,{config:function(){return be}});var i=function(){return(i=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)};function o(e,t,n,r){return new(n||(n=Promise))((function(i,o){function a(e){try{c(r.next(e))}catch(e){o(e)}}function s(e){try{c(r.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}c((r=r.apply(e,t||[])).next())}))}function a(e,t){var n,r,i,o,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},\"function\"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(o){return function(s){return function(o){if(n)throw new TypeError(\"Generator is already executing.\");for(;a;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return a.label++,{value:o[1],done:!1};case 5:a.label++,r=o[1],o=[0];continue;case 7:o=a.ops.pop(),a.trys.pop();continue;default:if(!(i=(i=a.trys).length>0&&i[i.length-1])&&(6===o[0]||2===o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]<i[3])){a.label=o[1];break}if(6===o[0]&&a.label<i[1]){a.label=i[1],i=o;break}if(i&&a.label<i[2]){a.label=i[2],a.ops.push(o);break}i[2]&&a.ops.pop(),a.trys.pop();continue}o=t.call(e,a)}catch(e){o=[6,e],r=0}finally{n=i=0}if(5&o[0])throw o[1];return{value:o[0]?o[1]:void 0,done:!0}}([o,s])}}}var s=function(){function e(){}return e.add=function(t){e.HANDLE_LIST.push(t),window.addEventListener(\"message\",t,!1)},e.remove=function(t){var n=e.HANDLE_LIST.indexOf(t);n>=0&&e.HANDLE_LIST.splice(n,1),window.removeEventListener(\"message\",t,!1)},e.empty=function(){for(;e.HANDLE_LIST.length;)window.removeEventListener(\"message\",e.HANDLE_LIST.shift(),!1)},e.parse=function(e){try{if(e&&\"string\"==typeof e){var t=e.indexOf('\"__objName\":')>=0,n=JSON.parse(e);return t&&(n.hasInnerObj=!0),n}return e}catch(e){console.log(\"Message.parse Error:\",e)}},e.HANDLE_LIST=[],e}();function c(e){if(!e)return!1;for(var t=e;null!==Object.getPrototypeOf(t);)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}function u(e){return\"[object Function]\"==={}.toString.call(e)}var l,d,f,p,v,h={origin:\"\"};function E(e,t){h[e]=t}function T(e){return h[e]}function g(e){var t=T(\"whiteList\")||[],n=T(\"origin\");return!!function(e,t,n){return!n.includes(t)&&e!==t&&(e.replace(/www\\./i,\"\").toLowerCase()!==t.replace(/www\\./i,\"\").toLowerCase()||(e.match(\"www.\")?void 0:(E(\"origin\",t),!1)))}(n,e.origin,t)&&(console.warn(\"postMessage 域名检查不通过\",{safeOrigin:n,eventOrigin:e.origin}),!0)}(v=l||(l={})).unknown=\"unknown\",v.spreadsheet=\"s\",v.writer=\"w\",v.presentation=\"p\",v.pdf=\"f\",function(e){e.wps=\"w\",e.et=\"s\",e.presentation=\"p\",e.pdf=\"f\"}(d||(d={})),function(e){e.nomal=\"nomal\",e.simple=\"simple\"}(f||(f={})),function(e){e[e.requestFullscreen=1]=\"requestFullscreen\",e[e.exitFullscreen=0]=\"exitFullscreen\"}(p||(p={}));var m,b,w,y=(m=0,function(){return m+=1}),_=function(e,t,n){void 0===n&&(n=!0);var r=t;if(!b){var i=function e(t){var n=t.clientHeight,r=t.clientWidth;0!==n||0!==r||w?0===n&&0===r||!w||(w.disconnect(),w=null):window.ResizeObserver&&(w=new ResizeObserver((function(n){e(t)}))).observe(t),b.style.cssText+=\"height: \"+n+\"px; width: \"+r+\"px\"}.bind(null,r);(b=document.createElement(\"iframe\")).classList.add(\"web-office-iframe\");var o={id:\"office-iframe\",src:e,scrolling:\"no\",frameborder:\"0\",allowfullscreen:\"allowfullscreen\",webkitallowfullscreen:\"true\",mozallowfullscreen:\"true\",allow:\"clipboard-read; clipboard-write\"};for(var a in r?(o.style=\"width: \"+r.clientWidth+\"px; height: \"+r.clientHeight+\"px;\",n&&window.addEventListener(\"resize\",i)):((r=document.createElement(\"div\")).classList.add(\"web-office-default-container\"),function(e){var t=document.createElement(\"style\");document.head.appendChild(t);var n=t.sheet;n.insertRule(\".web-office-default-container {position: absolute; padding: 0;  margin: 0; width: 100%; height: 100%; left: 0; top: 0;}\",n.cssRules.length)}(),document.body.appendChild(r),o.style=\"position: fixed; top: 0; right: 0; bottom: 0; left: 0; width: 100%; height: 100%;\"),H&&window.visualViewport&&window.visualViewport.addEventListener(\"resize\",I),o)b.setAttribute(a,o[a]);r.appendChild(b),b.destroy=function(){b.parentNode.removeChild(b),b=null,window.removeEventListener(\"resize\",i),w&&(w.disconnect(),w=null)}}return b};function I(){var e=window.visualViewport,t=e.width,n=e.height,r=document.body.clientHeight-b.clientHeight;N({eventName:\"visualViewportResize\",data:{width:t,height:n-r}})}var N=function(e){_().contentWindow&&_().contentWindow.postMessage(JSON.stringify(e),T(\"realOrigin\"))};function S(e,t,n){return new Promise((function(r){var i=y();s.add((function e(t){if(!g(t)){var o=s.parse(t.data);o.eventName===n&&o.msgId===i&&(r(o.data),s.remove(e))}})),N({data:e,msgId:i,eventName:t})}))}var L=function(e){return S(e,\"wps.jssdk.api\",\"wps.api.reply\")},D=function(e){return S(e,\"api.basic\",\"api.basic.reply\")},A={idMap:{}},O={};function k(e,t){return o(this,void 0,void 0,(function(){var n,r,i,o;return a(this,(function(a){switch(a.label){case 0:return\"api.callback\"===e.eventName&&e.callbackId&&O[e.callbackId]?(n=e.data.args,e.hasInnerObj?[4,W(n,t)]:[3,2]):[3,5];case 1:return i=a.sent(),[3,3];case 2:i=n,a.label=3;case 3:return r=i,[4,O[e.callbackId].apply(O,r)];case 4:o=a.sent(),N({result:o,eventName:\"api.callback.reply\",callbackId:e.callbackId}),a.label=5;case 5:return[2]}}))}))}function W(e,t){return o(this,void 0,void 0,(function(){var n,i,o,s,u,l,d,f,p,v;return a(this,(function(a){switch(a.label){case 0:if(!Array.isArray(e))return[3,5];s=[],n=0,a.label=1;case 1:return n<e.length?(o=(i=s).push,[4,W(e[n],t)]):[3,4];case 2:o.apply(i,[a.sent()]),a.label=3;case 3:return n+=1,[3,1];case 4:return[2,s];case 5:if(function(e){return\"object\"==r(e)&&e.__objId&&e.__objName}(e))return[2,t(e.__objId,e.__objName)||e];if(!c(e))return[3,10];for(l in s={},u=[],e)u.push(l);d=0,a.label=6;case 6:return d<u.length?(f=u[d],e.hasOwnProperty(f)?(p=s,v=f,[4,W(e[f],t)]):[3,8]):[3,9];case 7:p[v]=a.sent(),a.label=8;case 8:return d++,[3,6];case 9:return[2,s];case 10:return[2,e]}}))}))}function G(e){return o(this,void 0,void 0,(function(){var t,n,r,i,o,c,u,l,d,f;return a(this,(function(a){switch(a.label){case 0:return g(e)?[2]:(t=s.parse(e.data),n=t.eventName,r=t.callbackId,i=t.data,r&&(o=A.idMap[r])?(c=o.split(\":\"),u=c[0],l=c[1],\"api.callback\"===n&&A[u]&&A[u][l]?[4,(f=A[u][l]).callback.apply(f,i.args)]:[3,2]):[3,2]);case 1:d=a.sent(),N({result:d,callbackId:r,eventName:\"api.callback.reply\"}),a.label=2;case 2:return[2]}}))}))}var P=function(e){return o(void 0,void 0,void 0,(function(){function t(){return Object.keys(A.idMap).find((function(e){return A.idMap[e]===r+\":\"+n}))}var n,r,i,o,c,u,l,d,f;return a(this,(function(a){switch(a.label){case 0:return n=e.prop,r=e.parentObjId,[4,x([i=e.value])];case 1:return o=a.sent(),c=o[0],u=o[1],e.value=c[0],l=Object.keys(u)[0],d=A[r],null===i&&d&&d[n]&&((f=t())&&delete A.idMap[f],delete d[n],Object.keys(d).length||delete A[r],Object.keys(A.idMap).length||s.remove(G)),l&&(Object.keys(A.idMap).length||s.add(G),A[r]||(A[r]={}),A[r][n]={callbackId:l,callback:u[l]},(f=t())&&delete A.idMap[f],A.idMap[l]=r+\":\"+n),[2]}}))}))},M=function(e,t,n,r){return o(void 0,void 0,void 0,(function(){var c,u,l,d,f,p,v,h;return a(this,(function(E){switch(E.label){case 0:return c=y(),d=new Promise((function(e,t){u=e,l=t})),f={},t.args?[4,x(t.args)]:[3,2];case 1:p=E.sent(),v=p[0],h=p[1],t.args=v,f=h,E.label=2;case 2:return\"api.setter\"!==e?[3,4]:[4,P(t)];case 3:E.sent(),E.label=4;case 4:return\"api.caller\"===e&&Object.assign(O,f),function(e){var t=e[0],n=e[1];\"function\"==typeof(t=i({},t)).data&&(t.data=t.data()),n(),N(t)}([{eventName:e,data:t,msgId:c},function(){var t=this;return s.add((function i(d){return o(t,void 0,void 0,(function(){var t,o,p;return a(this,(function(a){switch(a.label){case 0:return g(d)?[2]:\"api.callback\"===(t=s.parse(d.data)).eventName&&t.callbackId&&f[t.callbackId]?[4,f[t.callbackId].apply(f,t.data.args)]:[3,2];case 1:o=a.sent(),N({result:o,eventName:\"api.callback.reply\",callbackId:t.callbackId}),a.label=2;case 2:return t.eventName===e+\".reply\"&&t.msgId===c&&(t.error?((p=new Error(\"\")).stack=t.error+\"\\n\"+n,r&&r(),l(p)):u(t),s.remove(i)),[2]}}))}))})),d}]),[2,d]}}))}))};function x(e){return o(this,void 0,void 0,(function(){var t,n,r,i,o,s,u,l,d,f,p;return a(this,(function(a){switch(a.label){case 0:t={},n=[],r=e.slice(0),a.label=1;case 1:return r.length?(i=void 0,[4,r.shift()]):[3,13];case 2:return(o=a.sent())&&o.done?[4,o.done()]:[3,4];case 3:a.sent(),a.label=4;case 4:if(!c(i))return[3,11];for(u in i={},s=[],o)s.push(u);l=0,a.label=5;case 5:return l<s.length?(d=s[l],f=o[d],/^[A-Z]/.test(d)?f&&f.done?[4,f.done()]:[3,7]:[3,8]):[3,10];case 6:a.sent(),a.label=7;case 7:f&&f.objId?f={objId:f.objId}:\"function\"==typeof f&&(p=y(),t[p]=f,f={callbackId:p}),a.label=8;case 8:i[d]=f,a.label=9;case 9:return l++,[3,5];case 10:return[3,12];case 11:o&&o.objId?i={objId:o.objId}:\"function\"==typeof o&&void 0===o.objId?(p=y(),t[p]=o,i={callbackId:p}):i=o,a.label=12;case 12:return n.push(i),[3,1];case 13:return[2,[n,t]]}}))}))}var C=function(e,t){void 0===t&&(t=!0);var n=i({},e),o=n.headers,a=void 0===o?{}:o,s=n.subscriptions,c=void 0===s?{}:s,u=n.mode,l=void 0===u?f.nomal:u,d=n.commonOptions,p=a.backBtn,v=void 0===p?{}:p,h=a.shareBtn,E=void 0===h?{}:h,T=a.otherMenuBtn,g=void 0===T?{}:T,m=function(e,n){e.subscribe&&\"function\"==typeof e.subscribe&&(e.callback=n,c[n]=e.subscribe,t&&delete e.subscribe)};if(m(v,\"wpsconfig_back_btn\"),m(E,\"wpsconfig_share_btn\"),m(g,\"wpsconfig_other_menu_btn\"),g.items&&Array.isArray(g.items)){var b=[];g.items.forEach((function(e,t){switch(void 0===e&&(e={}),e.type){case\"export_img\":e.type=1,e.callback=\"export_img\";break;case\"export_pdf\":e.type=1,e.callback=\"export_pdf\";break;case\"save_version\":e.type=1,e.callback=\"save_version\";break;case\"about_wps\":e.type=1,e.callback=\"about_wps\";break;case\"split_line\":e.type=2;break;case\"custom\":e.type=3,m(e,\"wpsconfig_other_menu_btn_\"+t),b.push(e)}})),b.length&&(B||Y)&&(g.items=b)}n.url=n.url||n.wpsUrl;var w=[];if((l===f.simple||d&&!1===d.isShowTopArea)&&w.push(\"simple\",\"hidecmb\"),n.debug&&w.push(\"debugger\"),n.url&&w.length&&(n.url=n.url+(n.url.indexOf(\"?\")>=0?\"&\":\"?\")+w.join(\"&\")),d&&(d.isParentFullscreen||d.isBrowserViewFullscreen)&&(document.addEventListener(\"fullscreenchange\",F),document.addEventListener(\"webkitfullscreenchange\",F),document.addEventListener(\"mozfullscreenchange\",F)),n.wordOptions&&(n.wpsOptions=n.wordOptions),n.excelOptions&&(n.etOptions=n.excelOptions),n.pptOptions&&(n.wppOptions=n.pptOptions),\"object\"==r(c.print)){var y=\"wpsconfig_print\";\"function\"==typeof c.print.subscribe&&(c[y]=c.print.subscribe,n.print={callback:y},void 0!==c.print.custom&&(n.print.custom=c.print.custom)),delete c.print}return\"function\"==typeof c.exportPdf&&(c[y=\"wpsconfig_export_pdf\"]=c.exportPdf,n.exportPdf={callback:y},delete c.exportPdf),n.commandBars&&j(n.commandBars,!1),i(i({},n),{subscriptions:c})},U=function(e){void 0===e&&(e=\"\");var t=\"\";if(!t&&e){var n=e.toLowerCase();-1!==n.indexOf(\"/office/s/\")&&(t=l.spreadsheet),-1!==n.indexOf(\"/office/w/\")&&(t=l.writer),-1!==n.indexOf(\"/office/p/\")&&(t=l.presentation),-1!==n.indexOf(\"/office/f/\")&&(t=l.pdf)}if(!t){var r=e.match(/[\\?&]type=([a-z]+)/)||[];t=d[r[1]]||\"\"}return t};function j(e,t){void 0===t&&(t=!0);var n=e.map((function(e){var t=e.attributes;if(!Array.isArray(t)){var n=[];for(var r in t)if(t.hasOwnProperty(r)){var i={name:r,value:t[r]};n.push(i)}e.attributes=n}return e}));return t&&N({data:n,eventName:\"setCommandBars\"}),n}var R=window.navigator.userAgent.toLowerCase(),B=/Android|webOS|iPhone|iPod|BlackBerry|iPad/i.test(R),H=/iPhone|iPod|iPad/i.test(R),Y=function(){try{return-1!==window._parent.location.search.indexOf(\"from=wxminiprogram\")}catch(e){return!1}}();function F(){var e={status:p.requestFullscreen},t=document,n=t.fullscreenElement||t.webkitFullscreenElement||t.mozFullScreenElement;e.status=n?p.requestFullscreen:p.exitFullscreen,N({data:e,eventName:\"fullscreenchange\"})}var X=function(){A.idMap={}};function V(){console.group(\"JSSDK 事件机制调整说明\"),console.warn(\"jssdk.on、jssdk.off 和 jssdk.Application.Sub 将在后续版本中被弃用，建议使用改进后的 ApiEvent\"),console.warn(\"具体请参考：https://wwo.wps.cn/docs/front-end/basic-usage/events/intro/\"),console.groupEnd()}var z=0,J=new Set;function K(e){return z+=1,!e&&function(e){J.forEach((function(t){return t(e)}))}(z),z}function q(){var e=new Error(\"\");return(e.stack||e.message||\"\").split(\"\\n\").slice(2).join(\"\\n\")}var $={};function Z(e,t){for(var n=$.otherProps,r=$.names,i=Object.keys(r),o=-1,a=0;a<i.length;a+=1){var s=i[a];if(r[s].name===t){o=parseInt(s,10);break}}if(o>=0){var c={objId:e},u=n[o];return u&&ne(c,u,n),c}}function Q(e,t){var n=this,r=t.Events,i=t.Enum,c=t.Props,u=c[0],d=c[1],f=c[2];Object.assign($,{appProps:u,otherProps:d,names:f});var p,v={objId:z};switch(ne(v,u,d),v.Events=r,v.Enum=i,e.Enum=v.Enum,e.Events=v.Events,e.Props=c,U(e.url)){case l.writer:e.WordApplication=e.WpsApplication=function(){return v};break;case l.spreadsheet:e.ExcelApplication=e.EtApplication=function(){return v};break;case l.presentation:e.PPTApplication=e.WppApplication=function(){return v};break;case l.pdf:e.PDFApplication=function(){return v}}e.Application=v,e.Free=function(e){return M(\"api.free\",{objId:e},\"\")},e.Stack=v.Stack=(p=function(t){e&&e.Free(t)},function(){var e=[],t=function(t){e.push(t)};return J.add(t),{End:function(){p(e),J.delete(t)}}});var h={};s.add((function(e){return o(n,void 0,void 0,(function(){var t,n,r,i,o;return a(this,(function(a){switch(a.label){case 0:return g(e)?[2]:\"api.event\"===(t=s.parse(e.data)).eventName&&t.data?(n=t.data,r=n.eventName,i=n.data,(o=h[r])?[4,o(i)]:[3,2]):[3,2];case 1:a.sent(),a.label=2;case 2:return[4,k(t,(function(e,t){return Z(e,t)}))];case 3:return a.sent(),[2]}}))}))})),v.Sub={};var E=function(e){var t=r[e];Object.defineProperty(v.Sub,t,{set:function(e){V(),h[t]=e,N({eventName:\"api.event.register\",data:{eventName:t,register:!!e,objId:z+=1}})}})};for(var T in r)E(T)}var ee=window.FinalizationRegistry&&new FinalizationRegistry((function(e){M(\"api.free\",{objId:e},\"\")})),te=[\"ExportAsFixedFormat\",\"GetOperatorsInfo\",\"ImportDataIntoFields\",\"ReplaceText\",\"ReplaceBookmark\",\"GetBookmarkText\",\"GetComments\"];function ne(e,t,n){var r=t.slice(0),o=e.objId;r.includes(\"Destroy\")||(e.Destroy=function(){return M(\"api.free\",{objId:o},\"\")}),ee&&ee.register(e,o);for(var a=function(){var t=r.shift();!t.alias&&~te.indexOf(t.prop)&&r.push(i(i({},t),{alias:t.prop+\"Async\"}));var o=t.alias||t.prop;Object.defineProperty(e,o,{get:function(){var r=this,i=1===t.cache,o=i&&this[\"__\"+t.prop+\"CacheValue\"];if(!o){var a=q(),s=K(i),c=function r(){for(var i,o=[],s=0;s<arguments.length;s++)o[s]=arguments[s];return void 0!==t.caller?ne(i={objId:K()},n[t.caller],n):i={},re(r,i,\"api.caller\",{obj:r,args:o,parentObjId:e.objId,objId:i.objId,prop:t.prop},a),i};return c.objId=-1,void 0!==t.getter&&n[t.getter].length&&(c.objId=s,ne(c,n[t.getter],n)),re(e,c,\"api.getter\",{parentObjId:e.objId,objId:c.objId,prop:t.prop},a,(function(){delete r[\"__\"+t.prop+\"CacheValue\"]})),i&&(this[\"__\"+t.prop+\"CacheValue\"]=c),c}return o},set:function(n){var r=q();return re(e,{},\"api.setter\",{value:n,parentObjId:e.objId,objId:-1,prop:t.prop},r)}})};r.length;)a()}function re(e,t,n,r,i,s){var c,u=(e.done?e.done():Promise.resolve()).then((function(){return c||(c=M(n,r,i,s)),c}));t.done=function(){return u},t.then=function(e,n){return o(this,void 0,void 0,(function(){var i,o,s;return a(this,(function(a){switch(a.label){case 0:return a.trys.push([0,5,,6]),[4,u];case 1:return(i=a.sent()).hasInnerObj?(o=e,[4,W(i.result,Z)]):[3,3];case 2:return o.apply(void 0,[a.sent()]),[3,4];case 3:r.objId>=0?(t.done=null,t.then=null,e(t)):e(i.result),a.label=4;case 4:return[3,6];case 5:return s=a.sent(),n(s),[3,6];case 6:return[2]}}))}))},t.catch=function(e){return u.catch(e)}}var ie={},oe=null,ae=\"fileOpen\",se=\"fileSaved\",ce=\"fileStatus\",ue=\"fullscreenChange\",le=\"error\",de=\"stage\",fe=\"api.getToken\",pe=\"event.toast\",ve=\"event.hyperLinkOpen\",he=\"api.getClipboardData\";function Ee(e,t,n,r,c,u,l){var d=this;void 0===n&&(n={}),s.add((function(f){return o(d,void 0,void 0,(function(){var o,d,p,v,h,E,T,m,b,w,y,_,I,S,L,D,A,O,k;return a(this,(function(a){switch(a.label){case 0:return g(f)?[2]:(o=s.parse(f.data),d=o.eventName,p=void 0===d?\"\":d,v=o.data,h=void 0===v?null:v,E=o.url,T=void 0===E?null:E,-1!==[\"wps.jssdk.api\"].indexOf(p)?[2]:\"ready\"!==p?[3,1]:(c.apiReadySended&&function(e){var t=[];Object.keys(ie).forEach((function(n){ie[n].forEach((function(r){var i=n;e.off(i,r),t.push({handle:r,eventName:i})})),delete ie[n]})),t.forEach((function(e){var t=e.eventName,n=e.handle;null==oe||oe.ApiEvent.AddApiEventListener(t,n)}))}(t),N({eventName:\"setConfig\",data:i(i({},n),{version:e.version})}),e.tokenData&&e.setToken(i(i({},e.tokenData),{hasRefreshTokenConfig:!!n.refreshToken})),e.iframeReady=!0,[3,15]));case 1:return\"error\"!==p?[3,2]:(t.emit(le,h),[3,15]);case 2:return\"open.result\"!==p?[3,3]:(void 0!==(null===(A=null==h?void 0:h.fileInfo)||void 0===A?void 0:A.officeVersion)&&(e.mainVersion=h.fileInfo.officeVersion,console.log(\"WebOfficeSDK Main Version: V\"+e.mainVersion)),t.emit(ae,h),[3,15]);case 3:return\"api.scroll\"!==p?[3,4]:(window.scrollTo(h.x,h.y),[3,15]);case 4:if(p!==fe)return[3,9];m={token:!1},a.label=5;case 5:return a.trys.push([5,7,,8]),[4,c.refreshToken()];case 6:return m=a.sent(),[3,8];case 7:return b=a.sent(),console.error(\"refreshToken: \"+(b||\"fail to get\")),[3,8];case 8:return N({eventName:fe+\".reply\",data:m}),[3,15];case 9:if(p!==he)return[3,14];w={text:\"\",html:\"\"},a.label=10;case 10:return a.trys.push([10,12,,13]),[4,c.getClipboardData()];case 11:return w=a.sent(),[3,13];case 12:return y=a.sent(),console.error(\"getClipboardData: \"+(y||\"fail to get\")),[3,13];case 13:return N({eventName:he+\".reply\",data:w}),[3,15];case 14:p===pe?c.onToast(h):p===ve?c.onHyperLinkOpen(h):\"stage\"===p?t.emit(de,h):\"event.callback\"===p?(_=h.eventName,I=h.data,S=_,_===ue&&(S=\"fullscreenchange\"),\"file.saved\"===_&&(S=ce),((null===(O=n.commonOptions)||void 0===O?void 0:O.isBrowserViewFullscreen)||(null===(k=n.commonOptions)||void 0===k?void 0:k.isParentFullscreen))&&\"fullscreenchange\"===S&&(L=I.status,D=I.isDispatchEvent,n.commonOptions.isBrowserViewFullscreen?function(e,t,n,r){0===e?t.style=\"position: static; width: \"+n.width+\"; height: \"+n.height:1===e&&(t.style=\"position: absolute; width: 100%; height: 100%\"),r&&function(e){[\"fullscreen\",\"fullscreenElement\"].forEach((function(t){Object.defineProperty(document,t,{get:function(){return!!e.status},configurable:!0})}));var t=new CustomEvent(\"fullscreenchange\");document.dispatchEvent(t)}({status:e})}(L,u,l,D):n.commonOptions.isParentFullscreen&&function(e,t,n){var r=document.querySelector(n),i=r&&1===r.nodeType?r:t;if(0===e){var o=document;(o.exitFullscreen||o.mozCancelFullScreen||o.msExitFullscreen||o.webkitCancelFullScreen||o.webkitExitFullscreen).call(document)}else if(1===e){(i.requestFullscreen||i.mozRequestFullScreen||i.msRequestFullscreen||i.webkitRequestFullscreen).call(i)}}(L,u,n.commonOptions.isParentFullscreen)),t.emit(S,I)):\"api.ready\"===p&&Q(e,h),a.label=15;case 15:return\"function\"==typeof r[p]&&r[p](e,T||h),[2]}}))}))}))}function Te(e){return new Promise((function(t){s.add((function n(r){E(\"realOrigin\",r.origin),g(r)||s.parse(r.data).eventName===e&&(t(null),s.remove(n))}))}))}function ge(e){var t,n=this;void 0===e&&(e={}),oe&&oe.destroy();try{var r=C(e),i=r.subscriptions,c=void 0===i?{}:i,l=r.mount,d=void 0===l?null:l,f=r.url,p=r.refreshToken,v=r.onToast,h=r.onHyperLinkOpen,T=r.getClipboardData;E(\"whiteList\",r.originWhiteList),E(\"origin\",(f.match(/https*:\\/\\/[^\\/]+/g)||[])[0]);var g=_(f,d),m=Te(\"open.result\"),b=Te(\"api.ready\"),w=d?{width:d.clientWidth+\"px\",height:d.clientHeight+\"px\"}:{width:\"100vw\",height:\"100vh\"};delete r.mount,f&&delete r.url,delete r.subscriptions;var y=(t=t||Object.create(null),{on:function(e,n){(t[e]||(t[e]=[])).push(n)},off:function(e,n){t[e]&&t[e].splice(t[e].indexOf(n)>>>0,1)},emit:function(e,n){(t[e]||[]).slice().map((function(e){e(n)})),(t[\"*\"]||[]).slice().map((function(t){t(e,n)}))}}),I={apiReadySended:!1,apiReadySendedOnce:!1},S=function(e,t,r){return o(n,void 0,void 0,(function(){return a(this,(function(n){switch(n.label){case 0:return function(e,t,n){if(ie[e]){var r=!!ie[e].find((function(e){return e===t}));return r&&\"off\"===n?(y.off(e,t),ie[e]=ie[e].filter((function(e){return e!==t})),!!ie[e].length||(ie[e]=void 0,!1)):(r||\"on\"!==n||(ie[e].push(t),y.on(e,t)),!0)}return\"on\"===n?(ie[e]=[],ie[e].push(t),!1):\"off\"===n||void 0}(e,t,r)?[3,2]:[4,A];case 1:n.sent(),function(e,t){var n=e.eventName,r=e.type,i=e.handle;\"on\"===t?y.on(n,i):y.off(n,i),\"base.event\"===r&&N({eventName:\"basic.event\",data:{eventName:n,action:t}}),V()}(function(e,t){var n=e,r=\"base.event\";switch(n){case se:console.warn(\"fileSaved事件监听即将弃用， 推荐使用fileStatus进行文件状态的监听\"),n=\"fileStatus\";break;case ue:n=\"fullscreenchange\";break;case\"error\":case\"fileOpen\":r=\"callback.event\"}return{eventName:n,type:r,handle:t}}(e,t),r),n.label=2;case 2:return[2]}}))}))};oe={url:f,iframe:g,version:\"1.1.20\",iframeReady:!1,tokenData:null,commandBars:null,tabs:{getTabs:function(){return o(this,void 0,void 0,(function(){return a(this,(function(e){switch(e.label){case 0:return[4,A];case 1:return e.sent(),[2,D({api:\"tab.getTabs\"})]}}))}))},switchTab:function(e){return o(this,void 0,void 0,(function(){return a(this,(function(t){switch(t.label){case 0:return[4,A];case 1:return t.sent(),[2,D({api:\"tab.switchTab\",args:{tabKey:e}})]}}))}))}},setCooperUserColor:function(e){return o(this,void 0,void 0,(function(){return a(this,(function(t){switch(t.label){case 0:return[4,A];case 1:return t.sent(),[2,D({api:\"setCooperUserColor\",args:e})]}}))}))},setToken:function(e){return o(this,void 0,void 0,(function(){return a(this,(function(t){switch(t.label){case 0:return[4,A];case 1:return t.sent(),oe.tokenData=e,N({eventName:\"setToken\",data:e}),[2]}}))}))},ready:function(){return o(this,void 0,void 0,(function(){return a(this,(function(e){switch(e.label){case 0:return I.apiReadySendedOnce?[3,2]:(I.apiReadySendedOnce=!0,[4,m]);case 1:e.sent(),I.apiReadySended=!0,N({eventName:\"api.ready\"}),e.label=2;case 2:return[4,b];case 3:return e.sent(),[2,new Promise((function(e){return setTimeout((function(){return e(null==oe?void 0:oe.Application)}),0)}))]}}))}))},destroy:function(){ie={},g.destroy(),s.empty(),oe=null,J=new Set,z=0,document.removeEventListener(\"fullscreenchange\",F),X()},save:function(){return o(this,void 0,void 0,(function(){return a(this,(function(e){switch(e.label){case 0:return[4,A];case 1:return e.sent(),[2,L({api:\"save\"})]}}))}))},setCommandBars:function(e){return o(this,void 0,void 0,(function(){return a(this,(function(t){switch(t.label){case 0:return[4,A];case 1:return t.sent(),j(e),[2]}}))}))},updateConfig:function(e){return void 0===e&&(e={}),o(this,void 0,void 0,(function(){return a(this,(function(t){switch(t.label){case 0:return[4,A];case 1:return t.sent(),e.commandBars?(console.warn(\"Deprecated: `updateConfig()` 方法即将废弃，请使用`setCommandBars()`代替`updateConfig()`更新`commandBars`配置。\"),[4,j(e.commandBars)]):[3,3];case 2:t.sent(),t.label=3;case 3:return[2]}}))}))},executeCommandBar:function(e){return o(this,void 0,void 0,(function(){return a(this,(function(t){switch(t.label){case 0:return[4,A];case 1:return t.sent(),j([{cmbId:e,attributes:[{name:\"click\",value:!0}]}]),[2]}}))}))},on:function(e,t){return o(this,void 0,void 0,(function(){return a(this,(function(n){return[2,this.ApiEvent.AddApiEventListener(e,t)]}))}))},off:function(e,t){return o(this,void 0,void 0,(function(){return a(this,(function(n){return[2,this.ApiEvent.RemoveApiEventListener(e,t)]}))}))},ApiEvent:{AddApiEventListener:function(e,t){return o(this,void 0,void 0,(function(){return a(this,(function(n){switch(n.label){case 0:return[4,S(e,t,\"on\")];case 1:return[2,n.sent()]}}))}))},RemoveApiEventListener:function(e,t){return o(this,void 0,void 0,(function(){return a(this,(function(n){switch(n.label){case 0:return[4,S(e,t,\"off\")];case 1:return[2,n.sent()]}}))}))}}},function(e,t,n,r,i,o){t&&u(t)&&(i.refreshToken=t,e.refreshToken={eventName:fe}),o&&u(o)&&(i.getClipboardData=o,e.getClipboardData={eventName:he}),n&&u(n)&&(i.onToast=n,e.onToast={eventName:pe}),r&&u(r)&&(i.onHyperLinkOpen=r,e.onHyperLinkOpen={eventName:ve})}(r,p,v,h,I,T),Ee(oe,y,r,c,I,g,w);var A=Te(\"ready\");return oe}catch(e){console.error(e)}}console.log(\"WebOfficeSDK JS-SDK V1.1.20\");var me=Object.freeze({__proto__:null,listener:Ee,config:ge});window.WPS=me;var be=ge;t.default={config:ge}},606:function(e,t,n){Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(328),i=function(){function e(){this.events={},this.eventsArr=Object.values(r.AddApiListenerType),this.events={},this.handler=this.handler.bind(this),window.addEventListener(\"message\",this.handler)}return e.prototype.handler=function(e){this.eventsArr.includes(e.data.eventName)&&this.trigger({eventName:e.data.eventName,params:e.data.data})},e.prototype.add=function(e,t){this.events[e]||(this.events[e]=[]),console.log(\"添加【\".concat(e,\"】事件成功\")),this.events[e].push(t)},e.prototype.remove=function(e,t){this.events[e]&&(this.events[e]=this.events[e].filter((function(e){return e!==t})),console.log(\"移除【\".concat(e,\"】事件成功\")))},e.prototype.trigger=function(e){var t=e.eventName,n=e.params;this.events[t]&&this.events[t].forEach((function(e){console.log(\"触发【\".concat(t,\"】事件，参数为：\"),n),e(n)}))},e}();t.default=i},620:function(e,t,n){var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function a(e){try{c(r.next(e))}catch(e){o(e)}}function s(e){try{c(r.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}c((r=r.apply(e,t||[])).next())}))},i=this&&this.__generator||function(e,t){var n,r,i,o,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},\"function\"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(o){return function(s){return function(o){if(n)throw new TypeError(\"Generator is already executing.\");for(;a;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return a.label++,{value:o[1],done:!1};case 5:a.label++,r=o[1],o=[0];continue;case 7:o=a.ops.pop(),a.trys.pop();continue;default:if(!(i=a.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]<i[3])){a.label=o[1];break}if(6===o[0]&&a.label<i[1]){a.label=i[1],i=o;break}if(i&&a.label<i[2]){a.label=i[2],a.ops.push(o);break}i[2]&&a.ops.pop(),a.trys.pop();continue}o=t.call(e,a)}catch(e){o=[6,e],r=0}finally{n=i=0}if(5&o[0])throw o[1];return{value:o[0]?o[1]:void 0,done:!0}}([o,s])}}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.CTX=void 0;var o,a,s,c=n(123),u=n(658),l=n(737),d=n(210),f=n(853),p=n(328),v=n(606),h=function(){function e(e){var t=this;if(this.executeCommandBar=function(e){return r(t,void 0,void 0,(function(){return i(this,(function(t){switch(t.label){case 0:return\"TabPrintPreview\"!==e?[3,2]:[4,this.printExecute()];case 1:t.sent(),t.label=2;case 2:return[2]}}))}))},this.litePreviewPrint={CommandBars:function(e){if(\"TabPrintPreview\"===e)return{Execute:function(){return r(t,void 0,void 0,(function(){return i(this,(function(e){switch(e.label){case 0:return[4,this.printExecute()];case 1:return[2,e.sent()]}}))}))}}}},console.log(\"OPEN_JSSDK_VERSION \".concat(\"0.1.3\")),console.log((0,l.isLitePreviewUrl)(null==e?void 0:e.url)?\"极速预览\":\"wo预览\"),(0,l.isLitePreviewUrl)(null==e?void 0:e.url))o=u.default;else try{o=WebOfficeSDK,console.log(\"使用外部的sdk\")}catch(e){o=c.default,console.log(\"使用内部的sdk\")}e?(e.mount&&e.mount instanceof Node||(e.mount=document.getElementsByTagName(\"body\")[0]),this.config=e,this.addPreviewContainer()):console.error(\"初始化sdk失败，缺失config参数\")}return e.prototype.getInstance=function(){var e=this,t=this.instance;return(0,l.isLitePreviewUrl)(this.config.url)&&(t.Application=this.litePreviewPrint,t.executeCommandBar=this.executeCommandBar,t.ready=function(){return r(e,void 0,void 0,(function(){return i(this,(function(e){return[2]}))}))}),(0,l.isWebofficeUrl)(this.config.url)&&(this.config.hasWidgetPermission=!0,t.WidgetInstance=new d.Widget(this.instance,s),Object.defineProperty(t,\"Widget\",{get:function(){return this.WidgetInstance||console.error(\"用户没有使用连接器的权限\"),this.WidgetInstance}})),t},e.prototype.addPreviewContainer=function(){var e,t=document.createElement(\"div\");t.style.position=\"relative\",t.style.width=\"100%\",t.style.height=\"100%\",null===(e=this.config.mount)||void 0===e||e.appendChild(t),this.config.mount=t,a=(0,l.parseUrl)(this.config.url),this.config.webpath=(0,l.parseWebpath)(a.pathname),this.config.url&&(0,l.isWebofficeUrl)(this.config.url)?this.renderWebOffice():this.renderOpendoc()},e.prototype.renderWebOffice=function(){return r(this,void 0,void 0,(function(){var e,t,n=this;return i(this,(function(r){return this.setDbCookie=this.setDbCookie.bind(this),e=this.config.url,this.config.refreshToken&&this.overWriteRefreshToken(e),t=new o.config(this.config),this.instance=Object.create(t),this.instance.setToken=function(r){t.setToken(r),n.setDbCookie(e,r)},[2]}))}))},e.prototype.overWriteRefreshToken=function(e){var t=this.config.refreshToken,n=this;this.config.refreshToken=function(){var r=t();return(0,f.isPromiseLike)(r)?r.then((function(t){n.setDbCookie(e,t)})):n.setDbCookie(e,r),r}},e.prototype.setDbCookie=function(e,t){var n=(0,f.getWappId)(e);n&&(0,f.setCookie)({name:\"\".concat(n,\"_wps_sid\"),value:t.token,expires:t.timeout})},e.prototype.isExpired=function(e){return Date.now()>1e3*e},e.prototype.renderOpendoc=function(){var e,t=document.createElement(\"iframe\");t.allow=\"clipboard-read;clipboard-write\",t.allowFullscreen=!0,t.src=this.config.url,t.allowFullscreen=!0,t.frameBorder=\"none\",t.style.width=\"100%\",t.style.height=\"100%\",t.id=\"third-iframe\",null===(e=this.config.mount)||void 0===e||e.appendChild(t),s=t,this.events=new v.default,this.instance={setToken:this.setToken.bind(this),print:this.openDocPrint.bind(this),download:this.openDocDownload.bind(this),ApiEvent:{AddApiEventListener:this.addApiEventListener.bind(this),RemoveApiEventListener:this.removeApiEventListener.bind(this)},ready:this.ready.bind(this),tabs:{getTabs:this.getTabs.bind(this),switchTab:this.switchTab.bind(this)},save:this.save.bind(this),destroy:this.destroy.bind(this),iframe:t}},e.prototype.setToken=function(e){console.log(\"this.config\",this.config),this.config.setToken=e,(0,f.setToken)(this.config,s)},e.prototype.openDocPrint=function(){if(s.src.split(\"/\").includes(\"micsweb\"))(0,p.openDocFunc)(p.EVENT_TYPE.PRINT,s);else{this.invoke(p.EVENT_TYPE.PRINT);var e=function(t){var n,r,i;t.data.eventName===p.EVENT_TYPE.PRINT&&(console.log(null===(i=null===(r=null===(n=t.data)||void 0===n?void 0:n.data)||void 0===r?void 0:r.result)||void 0===i?void 0:i.message),window.removeEventListener(\"message\",e))};window.addEventListener(\"message\",e)}},e.prototype.openDocDownload=function(e){e&&e.type?(console.log(\"openDocDownload: \".concat(p.EVENT_TYPE.DOWNLOAD,\"-type:\").concat(e.type)),this.invoke(p.EVENT_TYPE.DOWNLOAD,e.type)):(0,p.openDocFunc)(p.EVENT_TYPE.DOWNLOAD,s)},e.prototype.ready=function(){return r(this,void 0,void 0,(function(){return i(this,(function(e){return[2,new Promise((function(e,t){s.onload=function(){e(!0)}}))]}))}))},e.prototype.save=function(){return r(this,void 0,void 0,(function(){return i(this,(function(e){return this.invoke(p.EVENT_TYPE.SAVE),[2,new Promise((function(e,t){var n=function(t){t.data.eventName===p.EVENT_TYPE.SAVE&&(e(t.data.data),window.removeEventListener(\"message\",n))};window.addEventListener(\"message\",n)}))]}))}))},e.prototype.getTabs=function(){return console.log(\"触发getTabs方法\"),this.invoke(p.EVENT_TYPE.GET_TABS),new Promise((function(e,t){var n=function(t){t.data.eventName===p.EVENT_TYPE.GET_TABS&&(e(t.data.data),window.removeEventListener(\"message\",n))};window.addEventListener(\"message\",n)}))},e.prototype.switchTab=function(e){return r(this,void 0,void 0,(function(){var t;return i(this,(function(n){return t=e.tabKey,[2,new Promise((function(e,n){(0,p.openDocFunc)(\"action-\".concat(p.EVENT_TYPE.SWITCH_TAB),s,{tabKey:t}),e(\"已切换到\".concat(t))}))]}))}))},e.prototype.addApiEventListener=function(e,t){this.events.add(e,t)},e.prototype.removeApiEventListener=function(e,t){this.events.remove(e,t)},e.prototype.destroy=function(){var e=document.getElementById(\"third-iframe\");e.parentNode.removeChild(e),this.instance=null},e.prototype.invoke=function(e,t){(0,p.openDocFunc)(\"action-\".concat(e),s,t)},e.prototype.printExecute=function(){return r(this,void 0,void 0,(function(){var e,t;return i(this,(function(n){switch(n.label){case 0:return[4,this.instance.print()];case 1:return e=n.sent(),(t=document.createElement(\"iframe\")).setAttribute(\"style\",\"display:none\"),fetch(e).then((function(e){return e.blob()})).then((function(e){var n=URL.createObjectURL(e);t.src=n,document.body.appendChild(t),t.onload=function(){t.contentWindow.print()}})),[2]}}))}))},e}();t.CTX=h},328:function(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.openDocFunc=t.AddApiListenerType=t.EVENT_TYPE=void 0,function(e){e.PRINT=\"print\",e.DOWNLOAD=\"download\",e.GET_TABS=\"getTabs\",e.SWITCH_TAB=\"switchTab\",e.SAVE=\"save\"}(t.EVENT_TYPE||(t.EVENT_TYPE={})),function(e){e.FILE_OPEN=\"fileOpen\",e.FILE_STATUS=\"fileStatus\",e.ON_USER_LIST_INIT=\"OnUserListInit\",e.ON_USER_JOIN=\"OnUserJoin\",e.ON_USER_QUIT=\"OnUserQuit\"}(t.AddApiListenerType||(t.AddApiListenerType={}));var n=null;t.openDocFunc=function(e,t,r){n=t,function(e){console.log(\"发送事件：\",e);var t=n.contentWindow;t&&t.postMessage(e,\"*\")}({eventName:e,data:r})}},853:function(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.isPromiseLike=t.setToken=t.setCookie=t.getWappId=void 0;var n,r=null,i=null,o=!0,a=null;function s(e){var t,n;t={eventName:o?\"setToken\":\"setTokenRefresh\",data:e},(n=a.contentWindow)&&n.postMessage(t,\"*\"),o=!1,r=e,i=(new Date).getTime()}function c(e){return e instanceof Promise||\"function\"==typeof(null==e?void 0:e.then)}t.getWappId=function(e){if(!e.includes(\"/weboffice/office/d\"))return null;var t=e.match(/_w_appid=([^&]+)/);return t?t[1]:null},t.setCookie=function(e){var t=e.name,n=e.value,r=e.expires,i=new Date;i.setTime(i.getTime()+r||6e5),document.cookie=\"\".concat(t,\"=\").concat(n,\";expires=\").concat(i.toUTCString(),\";path=/\")},t.setToken=function(e,t){if(!e.setToken||!e.setToken.token)return console.error(\"请按照文档规范设置token格式\");n=e,window.addEventListener(\"message\",(function(u){\"wpsPreviewDidMount\"===u.data&&(r=null,i=null,o=!0,a=t,s(e.setToken),\"function\"==typeof e.refreshToken&&function(e){window.document.addEventListener(\"visibilitychange\",(function(){if(\"hidden\"!==document.visibilityState){var e=(new Date).getTime();if(r&&e-i>r.timeout){var t=n.refreshToken();c(t)?t.then((function(e){s(e)})):s(t)}}}));var t=function(e){s(e),e.timeout&&o(e.timeout)},o=function(e){var r,i=e-3e5;setTimeout((function(){var o=(new Date).getTime(),a=n.refreshToken();if(c(a))a.then((function(n){r=n;var a=(new Date).getTime();setTimeout((function(){t(r)}),i>0?3e5-(a-o):e-(a-o))}));else{r=a;var s=(new Date).getTime();setTimeout((function(){t(r)}),i>0?3e5-(s-o):e-(s-o))}}),i)};o(e)}(e.setToken.timeout))}))},t.isPromiseLike=c},737:function(e,t){function n(e){return new RegExp(/\\/weboffice\\/office\\//).test(e)}Object.defineProperty(t,\"__esModule\",{value:!0}),t.decryptTag=t.encryptTag=t.querystring=t.isLitePreviewUrl=t.isWebofficeUrl=t.isOpenDocUrl=t.parseWebpath=t.parseUrl=t.isJSON=void 0,t.isJSON=function(e){if(\"string\"!=typeof e)return!1;try{var t=JSON.parse(e);return!(\"object\"!=typeof t||!t)}catch(t){return console.log(\"error：\"+e+\"!!!\"+t),!1}},t.parseUrl=function(e){var t=document.createElement(\"a\");t.href=e;var n=t.hostname,r=\"80\"===t.port||\"443\"===t.port?\"\":t.port,i=n+(r?\":\".concat(r):\"\");return{href:e,protocol:t.protocol||\"\",host:i,hostname:n,port:r,search:t.search.replace(t.hash,\"\")||\"\",hash:t.hash||\"\",pathname:0===(t.pathname||\"\").indexOf(\"/\")?t.pathname||\"\":\"/\"+(t.pathname||\"\"),relative:(e.match(/tps?:\\/\\/[^\\/]+(.+)/)||[,\"\"])[1]||\"\",segments:t.pathname.replace(/^\\//,\"\").split(\"/\")||[],origin:t.protocol+\"//\"+i||\"\"}},t.parseWebpath=function(e){var t=e||window.location.pathname||\"\";return t.substring(0,t.lastIndexOf(\"/docs/viewweb/\"))||\"\"},t.isOpenDocUrl=function(e){return new RegExp(/\\/micsweb\\/viewweb\\/reader\\//).test(e)},t.isWebofficeUrl=n,t.isLitePreviewUrl=function(e){return n(e)&&e.includes(\"wpsCachePreview\")},t.querystring=function(e){var t=(e||window.location.search).replace(/^(\\S*)\\?/,\"\").split(\"&\"),n={};return t.forEach((function(e){var t=e.split(\"=\");n[t[0]]=t[1]})),n};t.encryptTag=function(e,t){if(!e)return\"\";try{var n=encodeURIComponent(e),r=encodeURIComponent(t),i=btoa(n);return btoa(r)+\"_\"+i}catch(e){return\"\"}};t.decryptTag=function(e,t){if(!e)return\"\";var n=e.split(\"_\");if(n.length<2)return\"\";try{var r=decodeURIComponent(atob(n[1]));return decodeURIComponent(atob(n[0]))!==t?\"\":r}catch(e){return\"\"}}},882:function(e,t,n){var r;Object.defineProperty(t,\"__esModule\",{value:!0}),t.DEFAULT_PLACEHOLDER_TEXT=void 0;var i=n(153);t.DEFAULT_PLACEHOLDER_TEXT=((r={})[i.BASE_WIDGET_TYPE.SINGLE_LINE_TEXT]=\"请输入文本\",r[i.BASE_WIDGET_TYPE.MULTILINE_TEXT]=\"请输入文本\",r[i.BASE_WIDGET_TYPE.HTML]=\"请输入HTML\",r[i.BASE_WIDGET_TYPE.IMAGE]=\"\",r)},210:function(e,t,n){var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},r.apply(this,arguments)},i=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function a(e){try{c(r.next(e))}catch(e){o(e)}}function s(e){try{c(r.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}c((r=r.apply(e,t||[])).next())}))},o=this&&this.__generator||function(e,t){var n,r,i,o,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},\"function\"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(o){return function(s){return function(o){if(n)throw new TypeError(\"Generator is already executing.\");for(;a;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return a.label++,{value:o[1],done:!1};case 5:a.label++,r=o[1],o=[0];continue;case 7:o=a.ops.pop(),a.trys.pop();continue;default:if(!(i=a.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]<i[3])){a.label=o[1];break}if(6===o[0]&&a.label<i[1]){a.label=i[1],i=o;break}if(i&&a.label<i[2]){a.label=i[2],a.ops.push(o);break}i[2]&&a.ops.pop(),a.trys.pop();continue}o=t.call(e,a)}catch(e){o=[6,e],r=0}finally{n=i=0}if(5&o[0])throw o[1];return{value:o[0]?o[1]:void 0,done:!0}}([o,s])}}},a=this&&this.__values||function(e){var t=\"function\"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&\"number\"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")},s=this&&this.__read||function(e,t){var n=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)a.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return a},c=this&&this.__spreadArray||function(e,t,n){if(n||2===arguments.length)for(var r,i=0,o=t.length;i<o;i++)!r&&i in t||(r||(r=Array.prototype.slice.call(t,0,i)),r[i]=t[i]);return e.concat(r||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.Widget=void 0;var u=n(737),l=n(882),d=n(153),f=n(532),p=function(){function e(e,t){this.wpsInstance=e,this.iframe=t}return e.prototype.addApiEventListener=function(e,t){var n,a=this,s=new URL(null===(n=this.wpsInstance)||void 0===n?void 0:n.url),c=null==s?void 0:s.searchParams,l=null==c?void 0:c.get(\"_w_appid\");this.wpsInstance.ApiEvent.AddApiEventListener(e,(function(n){return i(a,void 0,void 0,(function(){var i,a,s,c,d;return o(this,(function(o){switch(o.label){case 0:if(i=(0,u.decryptTag)(null==n?void 0:n.tag,l),a=JSON.parse(i),\"ContentControlBeforeDelete\"===e)try{return s=r(r({},n),{tag:null==a?void 0:a.tag,widgetId:(null==a?void 0:a.widgetId)||\"\",widgetName:(null==a?void 0:a.widgetName)||\"\"}),t(s),[2]}catch(e){t(n)}return[4,this.getWpsWidgetItem(n.id)];case 1:return c=o.sent(),(d=!!c)?[4,this.getWidgetInfo(c)]:[3,3];case 2:d=o.sent(),o.label=3;case 3:return t(d||n),[2]}}))}))}))},e.prototype.insertWidget=function(e){var t=e.baseWidgetType,n=e.widgetItem,r=e.range;return i(this,void 0,void 0,(function(){var e;return o(this,(function(i){switch(i.label){case 0:return i.trys.push([0,3,,4]),[4,this.initWidgetInfo({baseWidgetType:t,widgetItem:n,range:r})];case 1:return e=i.sent(),[4,this.getWidgetInfo(e)];case 2:return[2,i.sent()];case 3:return[2,i.sent()];case 4:return[2]}}))}))},e.prototype.getWidgetList=function(e){return i(this,void 0,void 0,(function(){var t,n,r,i;return o(this,(function(o){switch(o.label){case 0:return[4,this.wpsInstance.ready()];case 1:return o.sent(),t=[],(null==e?void 0:e.id)?[4,this.getWidgetItem(null==e?void 0:e.id,!1)]:[3,3];case 2:return i=o.sent(),(null==e?void 0:e.tag)?[2,(null==i?void 0:i.tag)===(null==e?void 0:e.tag)?[i]:[]]:[2,[i]];case 3:return[4,this.wpsInstance.Application.ActiveDocument.ContentControls.Count];case 4:n=o.sent(),r=1,o.label=5;case 5:if(!(r<=n))return[3,10];o.label=6;case 6:return o.trys.push([6,8,,9]),[4,this.getWidgetItem(r,!0)];case 7:return i=o.sent(),[d.WIDGET_TYPE.BASE_WIDGET,d.WIDGET_TYPE.BUSINESS_WIDGET].includes(null==i?void 0:i.widgetType)&&t.push(i),[3,9];case 8:return o.sent(),[3,9];case 9:return r++,[3,5];case 10:return[2,(null==e?void 0:e.tag)?null==t?void 0:t.filter((function(t){return(null==t?void 0:t.tag)===(null==e?void 0:e.tag)})):t]}}))}))},e.prototype.modifyWidgetItemProperty=function(e){var t=e.id,n=e.tag,s=e.widgetItem;return i(this,void 0,void 0,(function(){var e,i,c,u,l,f,p,v,h,E,T,g,m=this;return o(this,(function(o){switch(o.label){case 0:if(e=new Map,!t&&!n)throw new Error(\"控件ID和标识符tag至少选择一个输入！\");return s?(i=function(t,n){var r,i,o,a;try{switch(null==t?void 0:t.baseWidgetType){case d.BASE_WIDGET_TYPE.SINGLE_LINE_TEXT:case d.BASE_WIDGET_TYPE.MULTILINE_TEXT:((null==s?void 0:s.imageSource)||(null==s?void 0:s.html))&&e.set(null==t?void 0:t.id,null===(r=Object.keys(s))||void 0===r?void 0:r.filter((function(e){return![\"widgetName\",\"tag\",\"content\",\"placeholderText\"].includes(e)})));break;case d.BASE_WIDGET_TYPE.IMAGE:((null==s?void 0:s.placeholderText)||(null==s?void 0:s.content)||(null==s?void 0:s.html))&&e.set(null==t?void 0:t.id,null===(i=Object.keys(s))||void 0===i?void 0:i.filter((function(e){return![\"imageSource\",\"widgetName\",\"tag\"].includes(e)})));break;case d.BASE_WIDGET_TYPE.HTML:(s.imageSource||s.content)&&e.set(t.id,null===(o=Object.keys(s))||void 0===o?void 0:o.filter((function(e){return![\"widgetName\",\"tag\",\"placeholderText\",\"html\"].includes(e)})))}if(e.size>0)throw new Error(\"控件\".concat(null==t?void 0:t.id,\"不支持修改下列属性：\").concat(null===(a=e.get(null==t?void 0:t.id))||void 0===a?void 0:a.join(),\"，设置失败\"));n()}catch(e){n()}},t?[3,2]:[4,this.getWidgetList()]):[2];case 1:if(c=o.sent(),u=null==c?void 0:c.filter((function(e){return(null==e?void 0:e.tag)===n})),!((null==u?void 0:u.length)>0))throw new Error('未检索到和tag = \"'.concat(n,'\"匹配的控件'));l=function(e){i(e,(function(){var t=r(r({},e),s);m.setWidgetInfo(null==e?void 0:e.id,t)}))};try{for(f=a(u),p=f.next();!p.done;p=f.next())v=p.value,l(v)}catch(e){T={error:e}}finally{try{p&&!p.done&&(g=f.return)&&g.call(f)}finally{if(T)throw T.error}}return[3,5];case 2:return[4,this.getWpsWidgetItem(t)];case 3:return v=o.sent(),[4,this.getWidgetInfo(v)];case 4:if(h=o.sent(),E=r(r({},h),s),n&&(null==h?void 0:h.tag)!==n)throw new Error(\"未检索到id:\".concat(t,'和tag:\"').concat(n,'\"匹配的控件'));i(E,(function(){m.setWidgetInfo(t,E)})),o.label=5;case 5:return[2]}}))}))},e.prototype.setLocate=function(e){return i(this,void 0,void 0,(function(){return o(this,(function(t){switch(t.label){case 0:return[4,this.getWpsWidgetItem(e)];case 1:return[4,t.sent().Locate()];case 2:return t.sent(),[2]}}))}))},e.prototype.hasBasePropertyExist=function(e){var t=[];return[\"tag\",\"widgetId\",\"widgetName\"].forEach((function(n){t.push(!!e[n])})),t.some((function(e){return e}))},e.prototype.deleteWidgetItem=function(e){return i(this,void 0,void 0,(function(){var t,n;return o(this,(function(r){switch(r.label){case 0:return[4,this.getWpsWidgetItem(e)];case 1:return t=r.sent(),[4,this.getWidgetInfo(t)];case 2:return n=r.sent(),[4,t.Delete()];case 3:return r.sent(),[2,n]}}))}))},e.prototype.getWidgetItem=function(e,t){return i(this,void 0,void 0,(function(){var n,r;return o(this,(function(i){switch(i.label){case 0:return t?[4,this.getWpsWidgetItemByIndex(e)]:[3,2];case 1:return r=i.sent(),[3,4];case 2:return[4,this.getWpsWidgetItem(e)];case 3:r=i.sent(),i.label=4;case 4:return n=r,[4,this.getWidgetInfo(n)];case 5:return[2,i.sent()]}}))}))},e.prototype.getWpsWidgetItem=function(e){var t;return i(this,void 0,void 0,(function(){return o(this,(function(n){switch(n.label){case 0:return[4,this.wpsInstance.ready()];case 1:return n.sent(),[4,null===(t=this.wpsInstance.Application)||void 0===t?void 0:t.ActiveDocument.ContentControls({ID:e})];case 2:return[2,n.sent()]}}))}))},e.prototype.getWpsWidgetItemByIndex=function(e){var t;return i(this,void 0,void 0,(function(){return o(this,(function(n){switch(n.label){case 0:return[4,this.wpsInstance.ready()];case 1:return n.sent(),[2,null===(t=this.wpsInstance)||void 0===t?void 0:t.Application.ActiveDocument.ContentControls.Item(e)]}}))}))},e.prototype.typeIsWidgetType=function(e){var t=[];for(var n in d.WIDGET_TYPE_ENUM)isNaN(Number(n))||t.push(Number(n));return t.includes(e)},e.prototype.initWidgetInfo=function(e){var t,n=e.baseWidgetType,r=e.widgetItem,a=e.range;return i(this,void 0,void 0,(function(){var e,f,p,v,h=this;return o(this,(function(E){switch(E.label){case 0:if(!n)throw new Error(\"请输入要插入的基础控件类型！\");if(isNaN(d.BASE_WIDGET_CONTROL_MAP[n]))throw new Error(\"基础控件类型不存在！\");if(a&&(null==a?void 0:a.end)<=(null==a?void 0:a.start))throw new Error(\"控件插入的结束位置需要大于起始位置: \".concat(null==a?void 0:a.start,\"-\").concat(null==a?void 0:a.end));if(n===d.BASE_WIDGET_TYPE.HTML&&!/<(\\w+)[^>]*>(.*?<\\/\\1>)?/i.test(null==r?void 0:r.html))throw new Error(\"输入HTML内容不合法\");f=null!==(t=d.BASE_WIDGET_CONTROL_MAP[n])&&void 0!==t?t:0,E.label=1;case 1:return E.trys.push([1,3,,4]),[4,this.wpsInstance.Application.ActiveDocument.ContentControls.Add(f,{Start:null==a?void 0:a.start,End:null==a?void 0:a.end})];case 2:return e=E.sent(),[3,4];case 3:return[2,E.sent()];case 4:switch(p=function(t){return i(h,void 0,void 0,(function(){var a,s,c=this;return o(this,(function(f){return(s={})[d.WIDGET_SETTING_ENUM.NAME]=function(){return i(c,void 0,void 0,(function(){return o(this,(function(t){return[2,e.Title=(null==r?void 0:r.widgetName)||\"\"]}))}))},s[d.WIDGET_SETTING_ENUM.TAG]=function(){return i(c,void 0,void 0,(function(){var t,i,a,s,c,l,f;return o(this,(function(o){try{t=new URL(null===(f=this.wpsInstance)||void 0===f?void 0:f.url),i=null==t?void 0:t.searchParams,a=null==i?void 0:i.get(\"_w_appid\"),s={tag:(null==r?void 0:r.tag)||\"\",appId:a,widgetId:d.BASE_WIDGET_IDS[n],dataImportWay:{dataImportType:\"hand_write\"},baseWidgetType:n||\"\",widgetType:\"base_widget\",originType:\"base_widget\"},c=\"\".concat(JSON.stringify(s)),l=(0,u.encryptTag)(c,a),e.Tag=l}catch(e){throw new Error(e)}return[2]}))}))},s[d.WIDGET_SETTING_ENUM.PLACEHOLDER]=function(){return i(c,void 0,void 0,(function(){return o(this,(function(t){switch(t.label){case 0:return[4,e.SetPlaceholderText({Text:(null==r?void 0:r.placeholderText)||l.DEFAULT_PLACEHOLDER_TEXT[n]})];case 1:return t.sent(),[2]}}))}))},s[d.WIDGET_SETTING_ENUM.CONTENT]=function(){return i(c,void 0,void 0,(function(){return o(this,(function(t){if(!(null==r?void 0:r.content))return[2];switch(n){case d.BASE_WIDGET_TYPE.SINGLE_LINE_TEXT:case d.BASE_WIDGET_TYPE.MULTILINE_TEXT:e.Content=null==r?void 0:r.content}return[2]}))}))},s[d.WIDGET_SETTING_ENUM.ALLOW_MULTILINE]=function(){return i(c,void 0,void 0,(function(){var t;return o(this,(function(r){return t=n===d.BASE_WIDGET_TYPE.MULTILINE_TEXT,e.MultiLine=t,[2]}))}))},s[d.WIDGET_SETTING_ENUM.IMAGE_SOURCE]=function(){return i(c,void 0,void 0,(function(){var t,i,a,s,c,u,l,f,p,v,h;return o(this,(function(o){switch(o.label){case 0:if(n!==d.BASE_WIDGET_TYPE.IMAGE||!(null==r?void 0:r.imageSource))return[3,2];if(!(null===(i=null==r?void 0:r.imageSource)||void 0===i?void 0:i.imageUrl)&&!(null===(a=null==r?void 0:r.imageSource)||void 0===a?void 0:a.imageData))throw new Error(\"图片控件数据源缺失！\");return[4,e.Shape.Reset()];case 1:if(o.sent(),t=/^(https?:\\/\\/).*\\.(png|jpg|jpeg|gif|webp|svg)$/i,/^\\s*data:(?:[a-z]+\\/[a-z0-9-+.]+(?:;[a-z-]+=[a-z0-9-]+)?)?(?:;base64)?,([a-z0-9!$&',()*+;=\\-._~:@/?%\\s]*?)\\s*$/i.test(null===(s=null==r?void 0:r.imageSource)||void 0===s?void 0:s.imageData))e.Shape.Data=null===(c=null==r?void 0:r.imageSource)||void 0===c?void 0:c.imageData;else{if(!t.test(null===(u=null==r?void 0:r.imageSource)||void 0===u?void 0:u.imageUrl))throw new Error(\"图片数据源格式非法!\");e.Shape.Url=null===(l=null==r?void 0:r.imageSource)||void 0===l?void 0:l.imageUrl}(null===(f=null==r?void 0:r.imageSource)||void 0===f?void 0:f.width)&&(e.Shape.Width=null===(p=null==r?void 0:r.imageSource)||void 0===p?void 0:p.width),(null===(v=null==r?void 0:r.imageSource)||void 0===v?void 0:v.height)&&(e.Shape.Height=null===(h=null==r?void 0:r.imageSource)||void 0===h?void 0:h.height),o.label=2;case 2:return[2]}}))}))},s[d.WIDGET_SETTING_ENUM.EXTENSION_DATA]=function(){return i(c,void 0,void 0,(function(){var t;return o(this,(function(i){switch(i.label){case 0:return!0,!0==(n===d.BASE_WIDGET_TYPE.HTML)?[3,1]:[3,4];case 1:return t=null==r?void 0:r.html,t?[4,e.AddOrEditExtensionData([{key:d.EXTENSION_DATA.WIDGET_HTML_FIGMENT,value:t}])]:[3,3];case 2:i.sent(),i.label=3;case 3:case 4:return[3,5];case 5:return[2]}}))}))},s[d.WIDGET_SETTING_ENUM.HTML_PASTE]=function(){return i(c,void 0,void 0,(function(){var t,n,i,a;return o(this,(function(o){switch(o.label){case 0:return o.trys.push([0,7,,8]),[4,this.wpsInstance.ready()];case 1:return o.sent(),[4,e.LockContents];case 2:return o.sent()&&(e.LockContents=!1),[4,e.Range];case 3:return[4,(t=o.sent()).Start];case 4:return n=o.sent(),[4,t.End];case 5:return i=o.sent(),[4,this.wpsInstance.Application.ActiveDocument.Range(n,i).PasteHtml({HTML:null==r?void 0:r.html}).then((function(){e.LockContents=!0}))];case 6:return o.sent(),[3,8];case 7:throw a=o.sent(),new Error(a);case 8:return[2]}}))}))},s[d.WIDGET_SETTING_ENUM.LOCK_EDIT]=function(){return i(c,void 0,void 0,(function(){return o(this,(function(t){switch(t.label){case 0:return[4,this.wpsInstance.ready()];case 1:if(t.sent(),n===d.BASE_WIDGET_TYPE.HTML)e.SetPlaceholderText({Text:(null==r?void 0:r.placeholderText)||l.DEFAULT_PLACEHOLDER_TEXT[n]}),e.LockContents=!0;return[2]}}))}))},a=s,t.forEach((function(e){var t;null===(t=a[e])||void 0===t||t.call(a)})),[2]}))}))},v=[d.WIDGET_SETTING_ENUM.NAME,d.WIDGET_SETTING_ENUM.TAG],n){case d.BASE_WIDGET_TYPE.SINGLE_LINE_TEXT:p(c(c([],s(v),!1),[d.WIDGET_SETTING_ENUM.ALLOW_MULTILINE,d.WIDGET_SETTING_ENUM.CONTENT,d.WIDGET_SETTING_ENUM.PLACEHOLDER],!1));case d.BASE_WIDGET_TYPE.MULTILINE_TEXT:p(c(c([],s(v),!1),[d.WIDGET_SETTING_ENUM.CONTENT,d.WIDGET_SETTING_ENUM.ALLOW_MULTILINE,d.WIDGET_SETTING_ENUM.PLACEHOLDER],!1));break;case d.BASE_WIDGET_TYPE.IMAGE:p(c(c([],s(v),!1),[d.WIDGET_SETTING_ENUM.IMAGE_SOURCE],!1));break;case d.BASE_WIDGET_TYPE.HTML:p(c(c([],s(v),!1),[d.WIDGET_SETTING_ENUM.EXTENSION_DATA,d.WIDGET_SETTING_ENUM.LOCK_EDIT,d.WIDGET_SETTING_ENUM.HTML_PASTE,d.WIDGET_SETTING_ENUM.PLACEHOLDER],!1))}return[2,e]}}))}))},e.prototype.getWidgetInfo=function(e){var t,n,a,s,c,l,p;return i(this,void 0,void 0,(function(){var i,v,h,E,T,g,m,b,w,y,_,I,N,S,L,D,A,O,k,W,G,P;return o(this,(function(o){switch(o.label){case 0:return[4,e.Title];case 1:return i=o.sent()||\"\",[4,e.Tag];case 2:v=o.sent(),h=new URL(null===(t=this.wpsInstance)||void 0===t?void 0:t.url),E=null==h?void 0:h.searchParams,T=null==E?void 0:E.get(\"_w_appid\"),g=(0,u.decryptTag)(v,T),m=\"\",\"\",b=\"\",w={},y={},_=\"\";try{w=JSON.parse(g),m=(null==w?void 0:w.widgetId)||\"\",(null==w?void 0:w.widgetName)||\"\"}catch(e){}return[4,e.ID];case 3:return I=o.sent(),[4,e.Type];case 4:return N=o.sent(),[4,e.PlaceholderText];case 5:return S=o.sent(),L=null==w?void 0:w.baseWidgetType,[d.WIDGET_TYPE_ENUM.TEXT,d.WIDGET_TYPE_ENUM.RTF_CONTENT].includes(N)&&[d.BASE_WIDGET_TYPE.SINGLE_LINE_TEXT,d.BASE_WIDGET_TYPE.MULTILINE_TEXT,d.BASE_WIDGET_TYPE.HTML].includes(L)?[4,e.Content]:[3,7];case 6:b=o.sent()||\"\",o.label=7;case 7:if(N!==d.WIDGET_TYPE_ENUM.IMAGE||L!==d.BASE_WIDGET_TYPE.IMAGE)return[3,16];o.label=8;case 8:return o.trys.push([8,15,,16]),D=y,[4,null===(n=null==e?void 0:e.Shape)||void 0===n?void 0:n.Width];case 9:return D.width=o.sent(),A=y,[4,null===(a=null==e?void 0:e.Shape)||void 0===a?void 0:a.Height];case 10:return A.height=o.sent(),(null===(s=null==e?void 0:e.Shape)||void 0===s?void 0:s.Url)?(O=y,[4,null===(c=null==e?void 0:e.Shape)||void 0===c?void 0:c.Url]):[3,12];case 11:O.imageUrl=o.sent(),o.label=12;case 12:return(null===(l=null==e?void 0:e.Shape)||void 0===l?void 0:l.Data)?(k=y,[4,null===(p=null==e?void 0:e.Shape)||void 0===p?void 0:p.Data]):[3,14];case 13:k.imageData=o.sent(),o.label=14;case 14:return[3,16];case 15:return W=o.sent(),console.error(\"Error\",\"该控件没有对应的属性\",W),[3,16];case 16:return N!==d.WIDGET_TYPE_ENUM.RTF_CONTENT||L!==d.BASE_WIDGET_TYPE.HTML?[3,18]:[4,(0,f.getExtensionData)(this.wpsInstance,I,d.EXTENSION_DATA.WIDGET_HTML_FIGMENT)];case 17:(G=o.sent())&&(_=G.value),o.label=18;case 18:switch(P={widgetId:m,widgetName:i||\"\",tag:(null==w?void 0:w.tag)||\"\",id:I,widgetType:null==w?void 0:w.widgetType,baseWidgetType:null==w?void 0:w.baseWidgetType},L){case d.BASE_WIDGET_TYPE.SINGLE_LINE_TEXT:case d.BASE_WIDGET_TYPE.MULTILINE_TEXT:return[2,r(r({},P),{content:b,placeholderText:S})];case d.BASE_WIDGET_TYPE.IMAGE:return[2,r(r({},P),{imageSource:y})];case d.BASE_WIDGET_TYPE.HTML:return[2,r(r({},P),{content:b,placeholderText:S,html:_})]}return[2]}}))}))},e.prototype.setWidgetInfo=function(e,t){return i(this,void 0,void 0,(function(){var n,a,s,c,l,f=this;return o(this,(function(p){switch(p.label){case 0:return[4,this.getWpsWidgetItem(e)];case 1:return[4,(n=p.sent()).LockContents];case 2:return p.sent()&&(n.LockContents=!1),[4,null==n?void 0:n.Tag];case 3:return a=p.sent(),[4,this.getWidgetInfo(n)];case 4:return s=p.sent(),c=null==s?void 0:s.baseWidgetType,[4,null==n?void 0:n.Type];case 5:switch(p.sent(),l=function(e){return i(f,void 0,void 0,(function(){var l,f,p=this;return o(this,(function(v){return(f={})[d.WIDGET_SETTING_ENUM.NAME]=function(){return i(p,void 0,void 0,(function(){return o(this,(function(e){return t.widgetName&&(n.Title=t.widgetName),[2]}))}))},f[d.WIDGET_SETTING_ENUM.TAG]=function(){return i(p,void 0,void 0,(function(){var e,i,s,c,l,d,f;return o(this,(function(o){try{e=new URL(null===(f=this.wpsInstance)||void 0===f?void 0:f.url),i=null==e?void 0:e.searchParams,s=null==i?void 0:i.get(\"_w_appid\"),c=JSON.parse((0,u.decryptTag)(a,s)),l=JSON.stringify(r(r({},c),{tag:null==t?void 0:t.tag})),d=(0,u.encryptTag)(l,s),n.Tag=d}catch(e){console.error(\"Error\",e)}return[2]}))}))},f[d.WIDGET_SETTING_ENUM.PLACEHOLDER]=function(){return i(p,void 0,void 0,(function(){return o(this,(function(e){switch(e.label){case 0:return(null==t?void 0:t.placeholderText)?(!0,!0==(c===d.BASE_WIDGET_TYPE.HTML)?[3,1]:[3,3]):[3,5];case 1:case 3:return[4,n.SetPlaceholderText({Text:t.placeholderText})];case 2:case 4:return e.sent(),[3,5];case 5:return[2]}}))}))},f[d.WIDGET_SETTING_ENUM.CONTENT]=function(){return i(p,void 0,void 0,(function(){return o(this,(function(e){return(null==t?void 0:t.content)&&c!==d.BASE_WIDGET_TYPE.HTML&&(n.Content=t.content),[2]}))}))},f[d.WIDGET_SETTING_ENUM.ALLOW_MULTILINE]=function(){return i(p,void 0,void 0,(function(){var e;return o(this,(function(r){return e=(null==t?void 0:t.baseWidgetType)===d.BASE_WIDGET_TYPE.MULTILINE_TEXT,(null==s?void 0:s.baseWidgetType)!==d.BASE_WIDGET_TYPE.IMAGE&&(n.MultiLine=e),[2]}))}))},f[d.WIDGET_SETTING_ENUM.IMAGE_SOURCE]=function(){return i(p,void 0,void 0,(function(){var e,r,i,a,s,c,u,l,d,f,p;return o(this,(function(o){switch(o.label){case 0:if(!(null===(r=null==t?void 0:t.imageSource)||void 0===r?void 0:r.imageUrl)&&!(null===(i=null==t?void 0:t.imageSource)||void 0===i?void 0:i.imageData))throw new Error(\"图片控件数据源缺失！\");return[4,n.Shape.Reset()];case 1:if(o.sent(),e=/^(https?:\\/\\/).*\\.(png|jpg|jpeg|gif|webp|svg)$/i,/^\\s*data:(?:[a-z]+\\/[a-z0-9-+.]+(?:;[a-z-]+=[a-z0-9-]+)?)?(?:;base64)?,([a-z0-9!$&',()*+;=\\-._~:@/?%\\s]*?)\\s*$/i.test(null===(a=null==t?void 0:t.imageSource)||void 0===a?void 0:a.imageData))n.Shape.Data=null===(s=null==t?void 0:t.imageSource)||void 0===s?void 0:s.imageData;else{if(!e.test(null===(c=null==t?void 0:t.imageSource)||void 0===c?void 0:c.imageUrl))throw new Error(\"图片数据源格式非法!\");n.Shape.Url=null===(u=null==t?void 0:t.imageSource)||void 0===u?void 0:u.imageUrl}return(null===(l=null==t?void 0:t.imageSource)||void 0===l?void 0:l.width)&&(n.Shape.Width=null===(d=null==t?void 0:t.imageSource)||void 0===d?void 0:d.width),(null===(f=null==t?void 0:t.imageSource)||void 0===f?void 0:f.height)&&(n.Shape.Height=null===(p=null==t?void 0:t.imageSource)||void 0===p?void 0:p.height),[2]}}))}))},f[d.WIDGET_SETTING_ENUM.EXTENSION_DATA]=function(){return i(p,void 0,void 0,(function(){var e;return o(this,(function(r){switch(r.label){case 0:return[4,n.LockContents];case 1:return r.sent(),!0,!0==(c===d.BASE_WIDGET_TYPE.HTML)?[3,2]:[3,5];case 2:return e=null==t?void 0:t.html,e?[4,n.AddOrEditExtensionData([{key:d.EXTENSION_DATA.WIDGET_HTML_FIGMENT,value:e}])]:[3,4];case 3:r.sent(),r.label=4;case 4:case 5:return[3,6];case 6:return[2]}}))}))},f[d.WIDGET_SETTING_ENUM.HTML_PASTE]=function(){return i(p,void 0,void 0,(function(){var e,r,i,a;return o(this,(function(o){switch(o.label){case 0:return o.trys.push([0,7,,8]),(null==t?void 0:t.html)?[4,this.wpsInstance.ready()]:[3,6];case 1:return o.sent(),[4,n.Range];case 2:return[4,(e=o.sent()).Start];case 3:return r=o.sent(),[4,e.End];case 4:return i=o.sent(),[4,this.wpsInstance.Application.ActiveDocument.Range(r,i).PasteHtml({HTML:null==t?void 0:t.html}).then((function(){n.LockContents=!0}))];case 5:o.sent(),o.label=6;case 6:return[3,8];case 7:return a=o.sent(),n.LockContents=!0,console.error(a),[3,8];case 8:return[2]}}))}))},f[d.WIDGET_SETTING_ENUM.LOCK_EDIT]=function(){return i(p,void 0,void 0,(function(){return o(this,(function(e){return[2]}))}))},l=f,e.forEach((function(e){var t;null===(t=l[e])||void 0===t||t.call(l)})),[2]}))}))},c){case d.BASE_WIDGET_TYPE.SINGLE_LINE_TEXT:case d.BASE_WIDGET_TYPE.MULTILINE_TEXT:l([d.WIDGET_SETTING_ENUM.NAME,d.WIDGET_SETTING_ENUM.TAG,d.WIDGET_SETTING_ENUM.PLACEHOLDER,d.WIDGET_SETTING_ENUM.CONTENT,d.WIDGET_SETTING_ENUM.ALLOW_MULTILINE]);break;case d.BASE_WIDGET_TYPE.IMAGE:l([d.WIDGET_SETTING_ENUM.NAME,d.WIDGET_SETTING_ENUM.TAG,d.WIDGET_SETTING_ENUM.IMAGE_SOURCE]);break;case d.BASE_WIDGET_TYPE.HTML:l([d.WIDGET_SETTING_ENUM.NAME,d.WIDGET_SETTING_ENUM.TAG,d.WIDGET_SETTING_ENUM.PLACEHOLDER,d.WIDGET_SETTING_ENUM.EXTENSION_DATA,d.WIDGET_SETTING_ENUM.HTML_PASTE])}return[2]}}))}))},e}();t.Widget=p},153:function(e,t){var n,r,i,o;Object.defineProperty(t,\"__esModule\",{value:!0}),t.EXTENSION_DATA=t.BASE_WIDGET_IDS=t.BASE_WIDGET_CONTROL_MAP=t.WIDGET_SETTING_ENUM=t.CONTROL_ELEMENT_ENUM=t.BASE_WIDGET_TYPE=t.WIDGET_TYPE=t.WIDGET_TYPE_ENUM=void 0,function(e){e[e.RTF_CONTENT=0]=\"RTF_CONTENT\",e[e.TEXT=1]=\"TEXT\",e[e.IMAGE=2]=\"IMAGE\",e[e.COMBINATION=3]=\"COMBINATION\",e[e.DROP_DOWN=4]=\"DROP_DOWN\",e[e.DATE=6]=\"DATE\",e[e.CHECKBOX=8]=\"CHECKBOX\",e[e.REPEAT=9]=\"REPEAT\"}(i=t.WIDGET_TYPE_ENUM||(t.WIDGET_TYPE_ENUM={})),function(e){e.BASE_WIDGET=\"base_widget\",e.BUSINESS_WIDGET=\"business_widget\"}(t.WIDGET_TYPE||(t.WIDGET_TYPE={})),function(e){e.SINGLE_LINE_TEXT=\"single_line_text\",e.MULTILINE_TEXT=\"multiline_text\",e.IMAGE=\"image\",e.HTML=\"html\"}(o=t.BASE_WIDGET_TYPE||(t.BASE_WIDGET_TYPE={})),function(e){e.BASE_WIDGET=\"base_widget\",e.BUSINESS_WIDGET=\"business_widget\",e.BUSINESS_COMPONENTS=\"business_components\",e.GROUP=\"group\",e.REPEAT_GROUP=\"repeat_group\"}(t.CONTROL_ELEMENT_ENUM||(t.CONTROL_ELEMENT_ENUM={})),function(e){e.NAME=\"标题\",e.TAG=\"标识符\",e.PLACEHOLDER=\"占位符\",e.CONTENT=\"内容\",e.EXTENSION_DATA=\"拓展属性\",e.ALLOW_MULTILINE=\"设置是否允许换行\",e.HTML_PASTE=\"HTML内容\",e.LOCK_EDIT=\"限制编辑\",e.IMAGE_SOURCE=\"图片数据源\"}(t.WIDGET_SETTING_ENUM||(t.WIDGET_SETTING_ENUM={})),t.BASE_WIDGET_CONTROL_MAP=((n={})[o.SINGLE_LINE_TEXT]=i.TEXT,n[o.MULTILINE_TEXT]=i.TEXT,n[o.IMAGE]=i.IMAGE,n[o.HTML]=i.RTF_CONTENT,n),t.BASE_WIDGET_IDS=((r={})[o.SINGLE_LINE_TEXT]=\"baseSingleLineTextWidgetId\",r[o.MULTILINE_TEXT]=\"baseMultiLineTextWidgetId\",r[o.IMAGE]=\"baseImageWidgetId\",r[o.HTML]=\"baseHTMLWidgetId\",r),function(e){e.WIDGET_HTML_FIGMENT=\"widget_html_figment\"}(t.EXTENSION_DATA||(t.EXTENSION_DATA={}))},532:function(e,t){var n=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function a(e){try{c(r.next(e))}catch(e){o(e)}}function s(e){try{c(r.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}c((r=r.apply(e,t||[])).next())}))},r=this&&this.__generator||function(e,t){var n,r,i,o,a={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},\"function\"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(o){return function(s){return function(o){if(n)throw new TypeError(\"Generator is already executing.\");for(;a;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return a.label++,{value:o[1],done:!1};case 5:a.label++,r=o[1],o=[0];continue;case 7:o=a.ops.pop(),a.trys.pop();continue;default:if(!(i=a.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]<i[3])){a.label=o[1];break}if(6===o[0]&&a.label<i[1]){a.label=i[1],i=o;break}if(i&&a.label<i[2]){a.label=i[2],a.ops.push(o);break}i[2]&&a.ops.pop(),a.trys.pop();continue}o=t.call(e,a)}catch(e){o=[6,e],r=0}finally{n=i=0}if(5&o[0])throw o[1];return{value:o[0]?o[1]:void 0,done:!0}}([o,s])}}},i=this&&this.__read||function(e,t){var n=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)a.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return a},o=this&&this.__spreadArray||function(e,t,n){if(n||2===arguments.length)for(var r,i=0,o=t.length;i<o;i++)!r&&i in t||(r||(r=Array.prototype.slice.call(t,0,i)),r[i]=t[i]);return e.concat(r||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.pastControlFormatHTML=t.removeExtensionData=t.addOrEditExtensionData=t.getExtensionData=t.checkSpecialSymbols=void 0,t.checkSpecialSymbols=function(e){var t,n=/[&%]/g,r={tag:null==e?void 0:e.tag,widgetName:null==e?void 0:e.widgetName},i={tag:\"\",widgetName:\"\"};return null===(t=Object.keys(r))||void 0===t||t.forEach((function(e){n.test(r[e])&&(i[e]=\"\".concat(e,\"不允许输入特殊符号&、%\"))})),i},t.getExtensionData=function(e,t,i){return n(this,void 0,void 0,(function(){var n,o;return r(this,(function(r){switch(r.label){case 0:return r.trys.push([0,3,,4]),[4,e.ready()];case 1:return r.sent(),[4,e.Application.ActiveDocument.ContentControls.Item({ID:t}).ExtensionData];case 2:return n=r.sent(),i?[2,null==n?void 0:n.filter((function(e){return(null==e?void 0:e.key)===i}))[0]]:[2,n];case 3:return o=r.sent(),console.error(o),[3,4];case 4:return[2]}}))}))},t.addOrEditExtensionData=function(e,t,i){return n(this,void 0,void 0,(function(){var n;return r(this,(function(r){switch(r.label){case 0:return r.trys.push([0,3,,4]),[4,e.ready()];case 1:return r.sent(),[4,e.Application.ActiveDocument.ContentControls.Item({ID:t}).AddOrEditExtensionData([{key:i.key,value:i.value}])];case 2:return r.sent(),[3,4];case 3:return n=r.sent(),console.error(n),[3,4];case 4:return[2]}}))}))},t.removeExtensionData=function(e,t,a){return n(this,void 0,void 0,(function(){var n;return r(this,(function(r){switch(r.label){case 0:return r.trys.push([0,3,,4]),[4,e.ready()];case 1:return r.sent(),[4,e.Application.ActiveDocument.ContentControls.Item({ID:t}).RemoveExtensionData(o([],i(a),!1))];case 2:return r.sent(),[3,4];case 3:return n=r.sent(),console.error(n),[3,4];case 4:return[2]}}))}))},t.pastControlFormatHTML=function(e,t){return n(this,void 0,void 0,(function(){var n,i,o,a,s;return r(this,(function(r){switch(r.label){case 0:return r.trys.push([0,6,,7]),[4,this.app.ActiveDocument.ContentControls.Item({ID:e})];case 1:return[4,null==(n=r.sent())?void 0:n.Range];case 2:return[4,(i=r.sent()).Start];case 3:return o=r.sent(),[4,i.End];case 4:return a=r.sent(),[4,this.app.ActiveDocument.Range(o,a).PasteHtml({HTML:t})];case 5:return r.sent(),[3,7];case 6:return s=r.sent(),console.error(s),[3,7];case 7:return[2]}}))}))}}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var o=t[r]={exports:{}};return e[r].call(o.exports,o,o.exports,n),o.exports}n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})};var r={};!function(){var e=r;Object.defineProperty(e,\"X\",{value:!0});var t=n(620);e.Z={config:function(e){return new t.CTX(e).getInstance()}}}();var i=r.X,o=r.Z;export{i as __esModule,o as default};"
  },
  {
    "path": "jeecgboot-vue3/src/components/registerGlobComp.ts",
    "content": "import type { App } from 'vue';\nimport { Icon } from './Icon';\nimport AIcon from '/@/components/jeecg/AIcon.vue';\n//Tinymce富文本\n import Editor from '/@/components/Tinymce/src/Editor.vue'\n\nimport { Button, JUploadButton } from './Button';\n\n// 按需注册antd的组件\nimport {\n  // Need\n  Button as AntButton,\n  Select,\n  Alert,\n  Checkbox,\n  DatePicker,\n  TimePicker,\n  Calendar,\n  Radio,\n  Switch,\n  Card,\n  List,\n  Tabs,\n  Descriptions,\n  Tree,\n  Table,\n  Divider,\n  Modal,\n  Drawer,\n  TreeSelect,\n  Dropdown,\n  Tag,\n  Tooltip,\n  Badge,\n  Popover,\n  Upload,\n  Transfer,\n  Steps,\n  PageHeader,\n  Result,\n  Empty,\n  Avatar,\n  Menu,\n  Breadcrumb,\n  Form,\n  Input,\n  Row,\n  Col,\n  Spin,\n  Space,\n  Layout,\n  Collapse,\n  Slider,\n  InputNumber,\n  Carousel,\n  Popconfirm,\n  Skeleton,\n  Cascader,\n  Rate,\n  Progress\n} from 'ant-design-vue';\nconst compList = [AntButton.Group, Icon, AIcon, JUploadButton];\n\n\nexport function registerGlobComp(app: App) {\n  compList.forEach((comp) => {\n    app.component(comp.name || comp.displayName, comp);\n  });\n  \n  //仪表盘依赖Tinymce，需要提前加载（没办法按需加载了）\n  app.component(Editor.name, Editor);\n  // 代码逻辑说明: Tinymce异步加载\n  // app.component(\n  //   'Tinymce',\n  //   createAsyncComponent(() => import('./Tinymce/src/Editor.vue'), {\n  //     loading: true,\n  //   })\n  // );\n  app.use(Select)\n    .use(Alert)\n    .use(Button)\n    .use(Breadcrumb)\n    .use(Checkbox)\n    .use(DatePicker)\n    .use(TimePicker)\n    .use(Calendar)\n    .use(Radio)\n    .use(Switch)\n    .use(Card)\n    .use(List)\n    .use(Descriptions)\n    .use(Tree)\n    .use(TreeSelect)\n    .use(Table)\n    .use(Divider)\n    .use(Modal)\n    .use(Drawer)\n    .use(Dropdown)\n    .use(Tag)\n    .use(Tooltip)\n    .use(Badge)\n    .use(Popover)\n    .use(Upload)\n    .use(Transfer)\n    .use(Steps)\n    .use(PageHeader)\n    .use(Result)\n    .use(Empty)\n    .use(Avatar)\n    .use(Menu)\n    .use(Tabs)\n    .use(Form)\n    .use(Input)\n    .use(Row)\n    .use(Col)\n    .use(Spin)\n    .use(Space)\n    .use(Layout)\n    .use(Collapse)\n    .use(Slider)\n    .use(InputNumber)\n    .use(Carousel)\n    .use(Popconfirm)\n    .use(Skeleton)\n    .use(Cascader)\n    .use(Rate)\n    .use(Progress);\n    console.log(\"---初始化---， 全局注册Antd、仪表盘、流程设计器、online、流程等组件--------------\")\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/wordtpl/DocDesign.ts",
    "content": "import Editor from './canvas-editor.js';\nimport { reactive, ref } from 'vue';\nimport { debounce } from \"lodash-es\";\nimport { getFileAccessHttpUrl } from \"@/utils/common/compUtils\";\n\nlet instance: any = null;\n\nconst formState = reactive({\n  family: '微软雅黑',\n  size: '小四',\n  name: 'word在线编辑',\n  title: '正文',\n  highlightColor: '#ffffff00',\n  showCataLogDom: true,\n  separatorColor: '#000000',\n  separator: '0,0',\n  separatorLineWidth: 1,\n});\n\nconst isApple = typeof navigator !== 'undefined' && /Mac OS X/.test(navigator.userAgent);\n\n//搜索结果的Dom元素\nconst searchCollapseDom = ref<any>();\nconst searchInputDom = ref<any>();\nconst searchResultDom = ref<any>();\n//替换文本的Dom元素\nconst replaceInputDom = ref<any>();\n\n/**\n * 创建编辑器\n */\nexport async function createEditor(content: any) {\n  let querySelector = document.querySelector('.jeecg__editor');\n  // 初始化编辑器\n  const editorData = {\n    header: content.header ? JSON.parse(content.header) : [],\n    main: content.main ? JSON.parse(content.main) : [],\n    footer: content.footer ? JSON.parse(content.footer) : [],\n  };\n  formState.name = content.name || 'word在线编辑';\n  instance = new Editor(querySelector, editorData, {  scrollContainerSelector: \".editor-container\", pageNumber: { format: \"第{pageNo}页/共{pageCount}页\"} });\n  settingPaper(content);\n  const contextMenuList = await instance.register.getContextMenuList();\n  // 修改内部右键菜单示例\n  //另存为图片是base64位的，所以禁用掉\n  contextMenuList.forEach((menu) => {\n    // 通过菜单key找到菜单项后进行属性修改\n    if (menu.key === 'imageChange') {\n      menu.when = () => false;\n    }\n  });\n  // 全屏\n  const fullscreenDom:any = document.querySelector('.fullscreen')\n  fullscreenDom.onclick = toggleFullscreen\n  window.addEventListener('keydown', (evt) => {\n    if (evt.key === 'F11') {\n      toggleFullscreen();\n      evt.preventDefault();\n    }\n  });\n  document.addEventListener('fullscreenchange', () => {\n    fullscreenDom.classList.toggle('exist')\n  })\n  function toggleFullscreen() {\n    if (!document.fullscreenElement) {\n      document.documentElement.requestFullscreen();\n    } else {\n      document.exitFullscreen();\n    }\n  }\n  //添加监听\n  addListener();\n  //添加可见页发生改变监听\n  addPageNoListListener();\n  //添加监听当前页数发生改变监听\n  addPageSizeListener();\n  //添加当前页发生改变监听\n  addIntersectionPageNoListener();\n  //当前页面缩放比例发生改变监听\n  addPageScaleListener();\n  //页面模式发生改变监听\n  addPageModeListener();\n  //监听字数\n  addWordCountListener();\n}\n\n/**\n * 添加监听\n */\nfunction addListener() {\n  //字体\n  const fontDom: any = document.querySelector('.jeecg-menu-item-font');\n  const fontSelectDom = fontDom.querySelector('.select');\n  const fontOptionDom = fontDom.querySelector('.options');\n  //字体大小\n  const jeecgSizeDom: any = document.querySelector('.jeecg-menu-item-size');\n  const sizeOptionDom = jeecgSizeDom.querySelector('.options');\n  //下划线\n  const underlineDom: any = document.querySelector('.jeecg-menu-item-underline');\n  //加粗\n  const boldDom: any = document.querySelector('.jeecg-menu-item-bold');\n  //倾斜\n  const italicDom: any = document.querySelector('.jeecg-menu-item-italic');\n  //删除线\n  const strikeoutDom: any = document.querySelector('.jeecg-menu-item-strikeout');\n  //上标\n  const subscriptDom: any = document.querySelector('.jeecg-menu-item-subscript');\n  //下标\n  const superscriptDom: any = document.querySelector('.jeecg-menu-item-superscript');\n  //颜色\n  const colorControlDom:any = document.querySelector('#color');\n  const colorDom:any = document.querySelector('.jeecg-menu-item-color');\n  const colorSpanDom:any = colorDom.querySelector('span');\n  //左对齐\n  const leftDom:any = document.querySelector('.jeecg-menu-item-left');\n  //居中对齐\n  const centerDom:any = document.querySelector('.jeecg-menu-item-center');\n  //右对齐\n  const rightDom:any = document.querySelector('.jeecg-menu-item-right');\n  //两端对齐\n  const alignmentDom:any = document.querySelector('.jeecg-menu-item-alignment');\n  //行间距\n  const rowMarginDom:any = document.querySelector('.jeecg-menu-item-row-margin');\n  const rowOptionDom = rowMarginDom.querySelector('.options')\n  //高亮颜色\n  const highlightDom:any = document.querySelector('.jeecg-menu-item-highlight');\n  const highlightSpanDom = highlightDom.querySelector('span');\n  const highlightControlDom:any = document.querySelector('#highlight');\n  //标题\n  const titleDom:any = document.querySelector('.jeecg-menu-item-title')\n  const titleOptionDom = titleDom.querySelector('.options');\n  //列表\n  const listDom:any = document.querySelector('.jeecg-menu-item-list');\n  const listOptionDom = listDom.querySelector('.options');\n  //分割线\n  const separatorDom:any = document.querySelector('.jeecg-menu-item-separator');\n  const separatorOptionDom = separatorDom.querySelector('.options');\n  //搜索查询\n  searchCollapseDom.value = document.querySelector('.jeecg-menu-item-search-collapse');\n  searchResultDom.value = searchCollapseDom.value.querySelector('.search-result');\n  replaceInputDom.value = document.querySelector('.jeecg-menu-item-search-collapse-replace input')\n  searchInputDom.value = document.querySelector('.jeecg-menu-item-search-collapse-search input')\n  // 内部事件监听\n  instance.listener.rangeStyleChange = function (payload) {\n    let undoDom: any = document.querySelector('.jeecg-menu-item-undo');\n    // 撤销\n    if (undoDom && undoDom.classList) {\n      payload.undo ? undoDom.classList.remove('no-allow') : undoDom.classList.add('no-allow');\n    }\n    // 重做\n    let redoDom: any = document.querySelector('.jeecg-menu-item-redo');\n    if (redoDom && redoDom.classList) {\n      payload.redo ? redoDom.classList.remove('no-allow') : redoDom.classList.add('no-allow');\n    }\n    let painterDom = document.querySelector('.jeecg-menu-item-painter');\n    // 格式刷\n    if (painterDom && painterDom.classList) {\n      payload.painter ? painterDom.classList.add('active') : painterDom.classList.remove('active');\n    }\n    //字体\n    fontOptionDom.querySelectorAll('li').forEach((li) => li.classList.remove('active'));\n    const curFontDom = fontOptionDom.querySelector(`[data-family='${payload.font}']`);\n    if (curFontDom) {\n      formState.family = curFontDom.innerText;\n      fontSelectDom.style.fontFamily = payload.font;\n      curFontDom.classList.add('active');\n    }\n\n    //字体大小\n    sizeOptionDom.querySelectorAll('li').forEach((li) => li.classList.remove('active'));\n    const curSizeDom = sizeOptionDom.querySelector(`[data-size='${payload.size}']`);\n    if (curSizeDom) {\n      formState.size = curSizeDom.innerText;\n      curSizeDom.classList.add('active');\n    } else {\n      formState.size = `${payload.size}`;\n    }\n    //加粗\n    if (boldDom && boldDom.classList) {\n      payload.bold ? boldDom.classList.add('active') : boldDom.classList.remove('active');\n    }\n    //倾斜\n    if (italicDom && italicDom.classList) {\n      payload.italic ? italicDom.classList.add('active') : italicDom.classList.remove('active');\n    }\n\n    //下划线\n    if (underlineDom && underlineDom.classList) {\n      payload.underline ? underlineDom.classList.add('active') : underlineDom.classList.remove('active');\n    }\n    //删除线\n    if (strikeoutDom && strikeoutDom.classList) {\n      payload.strikeout ? strikeoutDom.classList.add('active') : strikeoutDom.classList.remove('active');\n    }\n    //上标\n    payload.type === 'superscript' ? superscriptDom.classList.add('active') : superscriptDom.classList.remove('active');\n\n    //下标\n    payload.type === 'subscript' ? subscriptDom.classList.add('active') : subscriptDom.classList.remove('active');\n\n    //字体颜色\n    if (colorDom && colorDom.classList) {\n      if (payload.color) {\n        colorDom.classList.add('active');\n        colorControlDom.value = payload.color;\n        colorSpanDom.style.backgroundColor = payload.color;\n      } else {\n        colorDom.classList.remove('active');\n        colorControlDom.value = '#000000';\n        colorSpanDom.style.backgroundColor = '#000000';\n      }\n    }\n    \n    //对齐方式\n    leftDom.classList.remove('active')\n    centerDom.classList.remove('active')\n    rightDom.classList.remove('active')\n    alignmentDom.classList.remove('active')\n    if (payload.rowFlex && payload.rowFlex === 'right') {\n      rightDom.classList.add('active')\n    } else if (payload.rowFlex && payload.rowFlex === 'center') {\n      centerDom.classList.add('active')\n    } else if (payload.rowFlex && payload.rowFlex === 'alignment') {\n      alignmentDom.classList.add('active')\n    } else {\n      leftDom.classList.add('active')\n    }\n    //行间距\n    rowOptionDom.querySelectorAll('li').forEach(li => li.classList.remove('active'))\n    const curRowMarginDom = rowOptionDom.querySelector(\n      `[data-rowmargin='${payload.rowMargin}']`\n    )\n    curRowMarginDom.classList.add('active')\n    \n    //高亮颜色\n    if (payload.highlight) {\n      highlightDom.classList.add('active')\n      formState.highlightColor = payload.highlight\n      highlightControlDom.value = payload.highlight\n      highlightSpanDom.style.backgroundColor = payload.highlight\n    } else {\n      highlightDom.classList.remove('active')\n      formState.highlightColor = '#ffffff00';\n      highlightControlDom.value = '#ffffff00';\n      highlightSpanDom.style.backgroundColor = '#ffffff00'\n    }\n    \n    // 标题\n    titleOptionDom.querySelectorAll('li') .forEach(li => li.classList.remove('active'));\n    if (payload.level) {\n      const curTitleDom = titleOptionDom.querySelector(`[data-level='${payload.level}']` );\n      formState.title = curTitleDom.innerText;\n      curTitleDom.classList.add('active');\n    } else {\n      formState.title = '正文';\n      titleOptionDom.querySelector('li:first-child').classList.add('active');\n    }\n    \n    //列表\n    listOptionDom.querySelectorAll('li') .forEach(li => li.classList.remove('active'));\n    if (payload.listType) {\n      listDom.classList.add('active')\n      const listType = payload.listType\n      const listStyle = payload.listType === 'ol' ? 'decimal' :payload.listStyle;\n      const curListDom = listOptionDom.querySelector( `[data-list-type='${listType}'][data-list-style='${listStyle}']`);\n      if (curListDom) {\n        curListDom.classList.add('active');\n      }\n    } else {\n      listDom.classList.remove('active');\n    }\n    //分割线\n    separatorOptionDom.querySelectorAll('li') .forEach(li => li.classList.remove('active'))\n    if (payload.type === 'separator') {\n      const separator = payload.dashArray.join(',') || '0,0'\n      formState.separator = separator;\n      const curSeparatorDom = separatorOptionDom.querySelector(`[data-separator='${separator}']`)\n      if (curSeparatorDom) {\n        curSeparatorDom.classList.add('active');\n      }\n      if(payload.color) {\n        formState.separatorColor = payload.color;\n      } else {\n        formState.separatorColor = \"#000000\";\n      }\n      if(payload.lineWidth) {\n        formState.separatorLineWidth = payload.lineWidth;\n      } else {\n        formState.separatorLineWidth = 1;\n      }\n    }\n  };\n}\n\n/**\n * 可见页发生改变\n */\nfunction addPageNoListListener() {\n  instance.listener.visiblePageNoListChange = function (payload) {\n    const text = payload.map(i => i + 1).join('、');\n    let querySelector:any = document.querySelector('.page-no-list');\n    querySelector.innerText = text\n  }\n}\n\n/**\n * 当前页数发生改变\n */\nfunction addPageSizeListener(){\n  instance.listener.pageSizeChange = function (payload) {\n    let querySelector:any = document.querySelector('.page-size');\n    querySelector!.innerText = `${payload}`\n  }\n}\n\n/**\n * 添加当前页发生改变\n */\nfunction addIntersectionPageNoListener(){\n  instance.listener.intersectionPageNoChange = function (payload) {\n    let querySelector:any = document.querySelector('.page-no');\n    querySelector.innerText = `${ payload + 1 }`\n  }\n}\n\n/**\n * 当前页面缩放比例发生改变\n */\nfunction addPageScaleListener(){\n  instance.listener.pageScaleChange = function (payload) {\n    let querySelector:any = document.querySelector('.page-scale-percentage');\n    querySelector.innerText = `${Math.floor(payload * 10 * 10)}%`\n  }\n}\n\n/**\n * 页面模式发生改变\n */\nfunction addPageModeListener(){\n  const pageModeDom:any = document.querySelector('.page-mode')\n  const pageModeOptionsDom = pageModeDom.querySelector('.options')\n  instance.listener.pageModeChange = function (payload) {\n    const activeMode = pageModeOptionsDom.querySelector(\n      `[data-page-mode='${payload}']`\n    )\n    pageModeOptionsDom.querySelectorAll('li').forEach(li => li.classList.remove('active'))\n    activeMode.classList.add('active')\n  }\n}\n\n/**\n * 字数\n */\nconst handleContentChange = async function () {\n  // 字数\n  const wordCount = await instance.command.getWordCount();\n  let querySelector:any = document.querySelector('.word-count');\n  querySelector.innerText = `${ wordCount || 0 }`;\n  if(formState.showCataLogDom){\n    updateCatalog();\n  }\n}\n\n/**\n * 监听字数\n */\nasync function addWordCountListener(){\n  instance.listener.contentChange = debounce(handleContentChange,200);\n}\n\n/**\n * 设置纸张\n * @param content\n */\nfunction settingPaper(content) {\n  if(content.width && content.height){\n    //设置纸张大小并回显\n    instance.command.executePaperSize(content.width,content.height);\n    const paperSizeDom:any = document.querySelector('.paper-size');\n    const paperSizeDomOptionsDom = paperSizeDom.querySelector('.options')\n    let pagers = paperSizeDomOptionsDom.querySelectorAll('li');\n    for (let index = 0; index < pagers.length; index++) {\n      let element = pagers[index];\n      element.classList.remove('active')\n      if(element.dataset.paperSize == (content.height+\"*\"+content.width)||element.dataset.paperSize == (content.width+\"*\"+content.height)) {\n        element.classList.add('active')\n      }\n    }\n    //设置纸张方向并回显\n    if(content.paperDirection){\n      let pageDirection = content.paperDirection;\n      instance.command.executePaperDirection(pageDirection);\n      const paperDirectionDom:any = document.querySelector('.paper-direction')\n      const paperDirectionDomOptionsDom = paperDirectionDom.querySelector('.options')\n      let pagerDirections = paperDirectionDomOptionsDom.querySelectorAll('li')\n      for (let index = 0; index < pagerDirections.length; index++) {\n        let element = pagerDirections[index];\n        element.classList.remove('active')\n        if(element.dataset.paperDirection ==  pageDirection){\n          element.classList.add('active')\n        }\n      }\n    }\n    //设置水印\n    let watermark = content.watermark;\n    if(watermark){\n      let watermarkObj = JSON.parse(watermark);\n      instance.command.executeAddWatermark(watermarkObj)\n    }\n    //设置边距\n    let margins = content.margins;\n    if(margins && margins != \"[]\"){\n      margins = JSON.parse(margins);\n      instance.command.executeSetPaperMargin([\n        Number(margins[0]),\n        Number(margins[1]),\n        Number(margins[2]),\n        Number(margins[3])\n      ])\n    }\n  }\n}\n\n/**\n * 更新日志\n */\nasync function updateCatalog() {\n  const catalog = await instance.command.getCatalog()\n  const catalogMainDom:any = document.querySelector('.jeecg-catalog-main')\n  catalogMainDom.innerHTML = ''\n  if (catalog) {\n    const appendCatalog = (\n      parent,\n      catalogItems\n    ) => {\n      for (let c = 0; c < catalogItems.length; c++) {\n        const catalogItem = catalogItems[c]\n        const catalogItemDom = document.createElement('div')\n        catalogItemDom.classList.add('catalog-item')\n        // 渲染\n        const catalogItemContentDom = document.createElement('div')\n        catalogItemContentDom.classList.add('jeecg-catalog-item-content')\n        const catalogItemContentSpanDom = document.createElement('span')\n        catalogItemContentSpanDom.innerText = catalogItem.name\n        catalogItemContentDom.append(catalogItemContentSpanDom)\n        // 定位\n        catalogItemContentDom.onclick = () => {\n          instance.command.executeLocationCatalog(catalogItem.id)\n        }\n        catalogItemDom.append(catalogItemContentDom)\n        if (catalogItem.subCatalog && catalogItem.subCatalog.length) {\n          appendCatalog(catalogItemDom, catalogItem.subCatalog)\n        }\n        // 追加\n        parent.append(catalogItemDom)\n      }\n    }\n    appendCatalog(catalogMainDom, catalog)\n  }\n}\n\nconst SURROGATE_PAIR_REG = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/ // unicode代理对（surrogate pair）\nconst EMOJI_REG =\n  /[#*0-9]\\uFE0F?\\u20E3|[\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23ED-\\u23EF\\u23F1\\u23F2\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB\\u25FC\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692\\u2694-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A7\\u26AA\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C8\\u26CF\\u26D1\\u26E9\\u26F0-\\u26F5\\u26F7\\u26F8\\u26FA\\u2702\\u2708\\u2709\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u27A1\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B55\\u3030\\u303D\\u3297\\u3299]\\uFE0F?|[\\u261D\\u270C\\u270D](?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?|[\\u270A\\u270B](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u2693\\u26A1\\u26AB\\u26C5\\u26CE\\u26D4\\u26EA\\u26FD\\u2705\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2795-\\u2797\\u27B0\\u27BF\\u2B50]|\\u26D3\\uFE0F?(?:\\u200D\\uD83D\\uDCA5)?|\\u26F9(?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\u2764\\uFE0F?(?:\\u200D(?:\\uD83D\\uDD25|\\uD83E\\uDE79))?|\\uD83C(?:[\\uDC04\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDE02\\uDE37\\uDF21\\uDF24-\\uDF2C\\uDF36\\uDF7D\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E\\uDF9F\\uDFCD\\uDFCE\\uDFD4-\\uDFDF\\uDFF5\\uDFF7]\\uFE0F?|[\\uDF85\\uDFC2\\uDFC7](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDFC4\\uDFCA](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDFCB\\uDFCC](?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF43\\uDF45-\\uDF4A\\uDF4C-\\uDF7C\\uDF7E-\\uDF84\\uDF86-\\uDF93\\uDFA0-\\uDFC1\\uDFC5\\uDFC6\\uDFC8\\uDFC9\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF8-\\uDFFF]|\\uDDE6\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF]|\\uDDE7\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF]|\\uDDE8\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF]|\\uDDE9\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF]|\\uDDEA\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA]|\\uDDEB\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7]|\\uDDEC\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE]|\\uDDED\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA]|\\uDDEE\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9]|\\uDDEF\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5]|\\uDDF0\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF]|\\uDDF1\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE]|\\uDDF2\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF]|\\uDDF3\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF]|\\uDDF4\\uD83C\\uDDF2|\\uDDF5\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE]|\\uDDF6\\uD83C\\uDDE6|\\uDDF7\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC]|\\uDDF8\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF]|\\uDDF9\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF]|\\uDDFA\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF]|\\uDDFB\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA]|\\uDDFC\\uD83C[\\uDDEB\\uDDF8]|\\uDDFD\\uD83C\\uDDF0|\\uDDFE\\uD83C[\\uDDEA\\uDDF9]|\\uDDFF\\uD83C[\\uDDE6\\uDDF2\\uDDFC]|\\uDF44(?:\\u200D\\uD83D\\uDFEB)?|\\uDF4B(?:\\u200D\\uD83D\\uDFE9)?|\\uDFC3(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDFF3\\uFE0F?(?:\\u200D(?:\\u26A7\\uFE0F?|\\uD83C\\uDF08))?|\\uDFF4(?:\\u200D\\u2620\\uFE0F?|\\uDB40\\uDC67\\uDB40\\uDC62\\uDB40(?:\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F)?)|\\uD83D(?:[\\uDC3F\\uDCFD\\uDD49\\uDD4A\\uDD6F\\uDD70\\uDD73\\uDD76-\\uDD79\\uDD87\\uDD8A-\\uDD8D\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA\\uDECB\\uDECD-\\uDECF\\uDEE0-\\uDEE5\\uDEE9\\uDEF0\\uDEF3]\\uFE0F?|[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDC8F\\uDC91\\uDCAA\\uDD7A\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDC6E\\uDC70\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4\\uDEB5](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD74\\uDD90](?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDC00-\\uDC07\\uDC09-\\uDC14\\uDC16-\\uDC25\\uDC27-\\uDC3A\\uDC3C-\\uDC3E\\uDC40\\uDC44\\uDC45\\uDC51-\\uDC65\\uDC6A\\uDC79-\\uDC7B\\uDC7D-\\uDC80\\uDC84\\uDC88-\\uDC8E\\uDC90\\uDC92-\\uDCA9\\uDCAB-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDDA4\\uDDFB-\\uDE2D\\uDE2F-\\uDE34\\uDE37-\\uDE41\\uDE43\\uDE44\\uDE48-\\uDE4A\\uDE80-\\uDEA2\\uDEA4-\\uDEB3\\uDEB7-\\uDEBF\\uDEC1-\\uDEC5\\uDED0-\\uDED2\\uDED5-\\uDED7\\uDEDC-\\uDEDF\\uDEEB\\uDEEC\\uDEF4-\\uDEFC\\uDFE0-\\uDFEB\\uDFF0]|\\uDC08(?:\\u200D\\u2B1B)?|\\uDC15(?:\\u200D\\uD83E\\uDDBA)?|\\uDC26(?:\\u200D(?:\\u2B1B|\\uD83D\\uDD25))?|\\uDC3B(?:\\u200D\\u2744\\uFE0F?)?|\\uDC41\\uFE0F?(?:\\u200D\\uD83D\\uDDE8\\uFE0F?)?|\\uDC68(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDC68\\uDC69]\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDC69(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?[\\uDC68\\uDC69]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?|\\uDC69\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?))|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDC6F(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\uDD75(?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\uDE2E(?:\\u200D\\uD83D\\uDCA8)?|\\uDE35(?:\\u200D\\uD83D\\uDCAB)?|\\uDE36(?:\\u200D\\uD83C\\uDF2B\\uFE0F?)?|\\uDE42(?:\\u200D[\\u2194\\u2195]\\uFE0F?)?|\\uDEB6(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?)|\\uD83E(?:[\\uDD0C\\uDD0F\\uDD18-\\uDD1F\\uDD30-\\uDD34\\uDD36\\uDD77\\uDDB5\\uDDB6\\uDDBB\\uDDD2\\uDDD3\\uDDD5\\uDEC3-\\uDEC5\\uDEF0\\uDEF2-\\uDEF8](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD\\uDDCF\\uDDD4\\uDDD6-\\uDDDD](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDDDE\\uDDDF](?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD0D\\uDD0E\\uDD10-\\uDD17\\uDD20-\\uDD25\\uDD27-\\uDD2F\\uDD3A\\uDD3F-\\uDD45\\uDD47-\\uDD76\\uDD78-\\uDDB4\\uDDB7\\uDDBA\\uDDBC-\\uDDCC\\uDDD0\\uDDE0-\\uDDFF\\uDE70-\\uDE7C\\uDE80-\\uDE88\\uDE90-\\uDEBD\\uDEBF-\\uDEC2\\uDECE-\\uDEDB\\uDEE0-\\uDEE8]|\\uDD3C(?:\\u200D[\\u2640\\u2642]\\uFE0F?|\\uD83C[\\uDFFB-\\uDFFF])?|\\uDDCE(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDDD1(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1|\\uDDD1\\u200D\\uD83E\\uDDD2(?:\\u200D\\uD83E\\uDDD2)?|\\uDDD2(?:\\u200D\\uD83E\\uDDD2)?))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?))?|\\uDEF1(?:\\uD83C(?:\\uDFFB(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFC-\\uDFFF])?|\\uDFFC(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])?|\\uDFFD(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])?|\\uDFFE(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])?|\\uDFFF(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFE])?))?)/g\n\n/**\n * 分割文本\n * @param text\n */\nfunction splitText(text){\n  const UNICODE_SYMBOL_REG = new RegExp(\n    `${EMOJI_REG.source}|${SURROGATE_PAIR_REG.source}`,\n    'g'\n  )\n  const data:any = []\n  const symbolMap:any = new Map();\n  for (const match of text.matchAll(UNICODE_SYMBOL_REG)) {\n    symbolMap.set(match.index, match[0])\n  }\n  let t = 0\n  while (t < text.length) {\n    const symbol = symbolMap.get(t)\n    if (symbol) {\n      data.push(symbol)\n      t += symbol.length\n    } else {\n      data.push(text[t])\n      t++\n    }\n  }\n  return data\n}\n\n/**\n * 方法\n */\nexport function method() {\n  /**\n   * 清除格式\n   */\n  function clearFormat() {\n    instance.command.executeFormat();\n  }\n\n  /**\n   * 撤销\n   */\n  function undo() {\n    instance.command.executeUndo();\n  }\n\n  /**\n   * 重做\n   */\n  function redo() {\n    instance.command.executeRedo();\n  }\n\n  let isFirstClick = true;\n  let painterTimeout = 0;\n\n  /**\n   * 格式刷（单击）\n   */\n  function painterClick() {\n    if (isFirstClick) {\n      isFirstClick = false;\n      painterTimeout = window.setTimeout(() => {\n        isFirstClick = true;\n        instance.command.executePainter({\n          isDblclick: false,\n        });\n      }, 200);\n    } else {\n      window.clearTimeout(painterTimeout);\n    }\n  }\n\n  /**\n   * 格式刷双击\n   */\n  function painterDblClick() {\n    isFirstClick = true;\n    window.clearTimeout(painterTimeout);\n    instance.command.executePainter({\n      isDblclick: true,\n    });\n  }\n\n  /**\n   * 字体\n   * @param family\n   * @param name\n   */\n  function font(family, name) {\n    formState.family = name;\n    instance.command.executeFont(family);\n  }\n\n  /**\n   * 字体大小\n   * @param size\n   * @param name\n   */\n  function fontSize(size, name) {\n    formState.size = name;\n    instance.command.executeSize(Number(size));\n  }\n\n  /**\n   * 字体+\n   */\n  function sizeAdd() {\n    instance.command.executeSizeAdd();\n  }\n\n  /**\n   * 字体-\n   */\n  function sizeMinus() {\n    instance.command.executeSizeMinus();\n  }\n\n  /**\n   * 加粗\n   */\n  function blob() {\n    instance.command.executeBold();\n  }\n\n  /**\n   * 倾斜\n   */\n  function itailc() {\n    instance.command.executeItalic();\n  }\n\n  /**\n   * 下划线\n   * @param value\n   */\n  function underline(value) {\n    //下划线\n    const underlineDom: any = document.querySelector('.jeecg-menu-item-underline');\n    const underlineOptionDom = underlineDom.querySelector('.options');\n    if(underlineOptionDom && underlineOptionDom.classList){\n      underlineOptionDom.classList.remove('visible');\n    }\n    if (value) {\n      instance.command.executeUnderline({\n        style: value,\n      });\n    } else {\n      instance.command.executeUnderline({\n        style: '',\n      });\n    }\n  }\n\n  /**\n   * 删除线\n   */\n  function strikeout() {\n    instance.command.executeStrikeout();\n  }\n\n  /**\n   * 上标\n   */\n  function superscript() {\n    instance.command.executeSuperscript();\n  }\n\n  /**\n   * 下标\n   */\n  function subscript() {\n    instance.command.executeSubscript();\n  }\n\n  /**\n   * 颜色\n   * @param e\n   */\n  function color(e) {\n    instance.command.executeColor(e.target.value);\n  }\n\n  /**\n   * 单元格背景色\n   * @param e\n   */\n  function cellColor(e) {\n    instance.command.executeTableTdBackgroundColor(e.target.value);\n  }\n\n  /**\n   * 连页分页\n   * @param value\n   */\n  function pageMode(value) {\n    instance.command.executePageMode(value)\n  }\n\n  /**\n   * 放大\n   */\n  function scaleAdd() {\n    instance.command.executePageScaleAdd();\n  }\n\n  /**\n   * 缩小\n   */\n  function scaleMiuns() {\n    instance.command.executePageScaleMinus();\n  }\n\n  /**\n   * 纸张大小\n   * @param value\n   */\n  function paperSize(value) {\n    const [width, height] = value.split('*').map(Number);\n    instance.command.executePaperSize(width, height);\n    // 纸张状态回显\n    const paperSizeDom:any = document.querySelector('.paper-size');\n    const paperSizeDomOptionsDom = paperSizeDom.querySelector('.options');\n    paperSizeDomOptionsDom.querySelectorAll('li').forEach(child => child.classList.remove('active'));\n    let querySelector:any = paperSizeDomOptionsDom.querySelector( `[data-paper-size='${value}']` );\n    querySelector.classList.add('active')\n  }\n\n  /**\n   * 纸张方向\n   */\n  function paperDirection(value) {\n    instance.command.executePaperDirection(value);\n    // 纸张方向状态回显\n    const paperDirectionDom:any = document.querySelector('.paper-direction');\n    const paperDirectionDomOptionsDom =  paperDirectionDom.querySelector('.options');\n    paperDirectionDomOptionsDom.querySelectorAll('li').forEach(child => child.classList.remove('active'));\n    let querySelector:any = paperDirectionDomOptionsDom.querySelector( `[data-paper-direction='${value}']`);\n    querySelector.classList.add('active');\n  }\n\n  /**\n   * 打印\n   */\n  function printTemplate() {\n    instance.command.executePrint();\n  }\n\n  /**\n   * 获取边距\n   */\n  function getPaperMargin() {\n    const [topMargin, rightMargin, bottomMargin, leftMargin] = instance.command.getPaperMargin();\n    return {\n      marginTop: topMargin,\n      marginBottom: bottomMargin,\n      marginLeft: leftMargin,\n      marginRight: rightMargin,\n    }\n  }\n\n  /**\n   * 设置边距\n   * @param values\n   */\n  function setPaperMargin(values) {\n    instance.command.executeSetPaperMargin([\n      values.marginTop,\n      values.marginRight,\n      values.marginBottom,\n      values.marginLeft\n    ])\n  }\n\n  /**\n   * 设置图片\n   * @param url\n   */\n  function setWordImage(url) {\n    let options = instance.command.getOptions();\n    let paperDirection = options.paperDirection;\n    let pageWidth = options.width;\n    let pageHeight = options.height;\n    if(paperDirection == \"horizontal\"){\n      pageWidth = options.height;\n      pageHeight = options.width;\n    }\n    const img = new Image();\n    img.src =url;\n    img.onload = () => {\n      let width = img.width || 0;\n      let height = img.height || 0;\n      width = width>pageWidth?pageWidth:width;\n      height = height>pageHeight?pageHeight:height;\n      instance.command.executeImage({\n        value: url,\n        width: width,\n        height: height\n      })\n    };\n  }\n\n  /**\n   * 文件上传赋值内容\n   */\n  async function setWordContent(content) {\n    if(content){\n      let main = JSON.parse(content.main);\n      //设置可访问的image\n      main = await setViewImage(main,'import');\n      instance.command.executeSetValue({\n        \"header\":  JSON.parse(content.header) || [],\n        \"main\": main,\n        \"footer\": JSON.parse(content.footer) || []\n      });\n      settingPaper(content);\n    }\n  }\n\n  /**\n   * 设置可访问的image\n   * @param main\n   * @param type\n   */\n  function setViewImage(main,type) {\n    for (const item of main) {\n      if(item.type === 'image'){\n        if(type === 'original'){\n          if(item['oldValue']){\n            item.value = item['oldValue'];\n          }\n        }else{\n          item['oldValue'] = item.value;\n          item.value = getFileAccessHttpUrl(item.value);\n        }\n      }\n      if(item.trList && item.trList.length>0){\n        for (const tr of item.trList) {\n          if(tr.tdList && tr.tdList.length>0){\n            let tdList = tr.tdList;\n            for (const td of tdList) {\n              let tdValue = td.value;\n              if(tdValue && tdValue.length>0){\n                for (const itemValue of tdValue) {\n                  if(itemValue.type === 'image'){\n                    if(type === 'original'){\n                      if(itemValue.oldValue){\n                        itemValue.value = itemValue['oldValue'];\n                      }\n                    }else{\n                      itemValue['oldValue'] = itemValue.value;\n                      itemValue.value = getFileAccessHttpUrl(itemValue.value);\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n    return main;\n  }\n\n  /**\n   * 左对齐\n   */\n  function leftAlign() {\n    instance.command.executeRowFlex(\"left\");\n  } \n  \n  /**\n   * 居中对齐\n   */\n  function centerAlign() {\n    instance.command.executeRowFlex(\"center\");\n  }\n\n  /**\n   * 右对齐\n   */\n  function rightAlign() {\n    instance.command.executeRowFlex(\"right\");\n  }  \n  \n  /**\n   * 两端对齐\n   */\n  function alignmentAlign() {\n    instance.command.executeRowFlex(\"alignment\");\n  }\n\n  /**\n   * 行间距\n   * @param value\n   */\n  function rowMargin(value) {\n    instance.command.executeRowMargin(Number(value));\n  }\n\n  /**\n   * 分页符\n   */\n  function pageBreak() {\n    instance.command.executePageBreak();\n  }\n\n  /**\n   * 设置高亮颜色\n   * @param value\n   */\n  function setHighlightColor(value) {\n    let highlightColor = value.highlightColor;\n    if(highlightColor) {\n      instance.command.executeHighlight(highlightColor)\n    }\n  }\n\n  /**\n   * 标题\n   * @param value\n   */\n  function title(value) {\n    instance.command.executeTitle(value || null);\n  }\n\n  /**\n   * 列表\n   * @param listType\n   * @param listStyle\n   */\n  function list(listType,listStyle) {\n    instance.command.executeList(listType, listStyle);\n  }\n\n  /**\n   * 表格\n   * @param rowIndex\n   * @param colIndex\n   * @param recoveryTable\n   */\n  function tabCell(rowIndex,colIndex,recoveryTable) {\n    instance.command.executeInsertTable(rowIndex, colIndex);\n    recoveryTable();\n  }\n\n  /**\n   * 分割线\n   * @param value\n   */\n  function separator() {\n    let payload:any = [];\n    const separatorDash = formState.separator?formState.separator?.split(',').map(Number): \"0,0\".split(',').map(Number);\n    if (separatorDash) {\n      const isSingleLine = separatorDash.every(d => d === 0)\n      if (!isSingleLine) {\n        payload = separatorDash\n      }\n    }\n    instance.command.executeSeparator(payload,formState.separatorLineWidth,formState.separatorColor);\n  }\n\n  /**\n   * 超链接\n   * @param value\n   */\n  function setHyperlink(value) {\n    instance.command.executeHyperlink({\n      type: 'hyperlink',\n      value: '',\n      url:value.url,\n      valueList: splitText(value.name).map(n => ({\n        value: n,\n        size: 16\n      }))\n    })\n  }\n\n  /**\n   * 获取超链接\n   */\n  function getHyperlink() {\n    let rangeText = instance.command.getRangeText();\n    return {\n      name: rangeText,\n      url: ''\n    }\n  }\n\n  /**\n   * 设置水印\n   * @param watermark\n   */\n  function setWatermark(watermark) {\n    const repeat = watermark.repeat === '1';\n    instance.command.executeAddWatermark({\n      data: watermark.data,\n      color: watermark.color,\n      size: watermark.size,\n      opacity: watermark.opacity,\n      repeat,\n      gap:\n        repeat && watermark.horizontalGap && watermark.verticalGap\n          ? [\n            watermark.horizontalGap,\n            watermark.verticalGap\n          ]\n          : undefined\n    });\n  }\n\n  /**\n   * 删除水印\n   */\n  function deleteWatermarkClick() {\n    instance.command.executeDeleteWatermark();\n  }\n\n  /**\n   * 查询文本输入事件\n   * @param evt\n   */\n  function searchInput(evt) {\n    let value = evt.target.value;\n    instance.command.executeSearch(value || null);\n    setSearchResult();\n  }  \n  \n  /**\n   * 查询文本键盘事件\n   * @param evt\n   */\n  function searchKeyDown(evt) {\n    if (evt.key === 'Enter') {\n      let value = evt.target.value;\n      instance.command.executeSearch(value || null);\n      setSearchResult();\n    }\n  }\n  \n  /**\n   * 上一个\n   */\n  function arrowLeft() {\n    instance.command.executeSearchNavigatePre();\n    setSearchResult();\n  }\n\n  /**\n   * 下一个\n   */\n  function arrowRight() {\n    instance.command.executeSearchNavigateNext();\n    setSearchResult();\n  }\n\n  /**\n   * 替换\n   */\n  function replaceText() {\n    console.log(\"searchResultDom.value:::\",searchResultDom.value)\n    console.log(\"replaceInputDom.value:::\",replaceInputDom.value)\n    const searchValue = searchInputDom.value.value;\n    const replaceValue = replaceInputDom.value.value;\n    if (searchValue && replaceValue && searchValue !== replaceValue) {\n      instance.command.executeReplace(replaceValue);\n    }\n  }\n\n  /**\n   * 关闭搜索\n   */\n  function closeSearch() {\n    searchCollapseDom.value.style.display = 'none';\n    replaceInputDom.value.value = '';\n    searchInputDom.value.value = '';\n    instance.command.executeSearch(null);\n    setSearchResult();\n  }\n\n  /**\n   * 设置搜索结果\n   */\n  function setSearchResult() {\n    const result = instance.command.getSearchNavigateInfo();\n    if (result) {\n      const { index, count } = result;\n      searchResultDom.value.innerText = `${index}/${count}`;\n    } else {\n      searchResultDom.value.innerText = '';\n    }\n  }\n  \n  /**\n   * 保存\n   */\n  function save() {\n    let tplSettings = instance.command.getValue();\n    let options = instance.command.getOptions();\n    let paperDirection = options.paperDirection;\n    let paperMargin = instance.command.getPaperMargin();\n    tplSettings.data.main = setViewImage(tplSettings.data.main,'original');\n    return {\n      header: JSON.stringify(tplSettings.data.header),\n      main: JSON.stringify(tplSettings.data.main),\n      footer: JSON.stringify(tplSettings.data.footer),\n      paperDirection: paperDirection,\n      watermark: JSON.stringify(tplSettings.options.watermark),\n      margins: JSON.stringify(paperMargin),\n      height: options.height,\n      width: options.width,\n    };\n  }\n\n  return {\n    formState,\n    clearFormat,\n    undo,\n    redo,\n    isApple,\n    painterClick,\n    painterDblClick,\n    font,\n    fontSize,\n    sizeAdd,\n    sizeMinus,\n    blob,\n    itailc,\n    underline,\n    strikeout,\n    superscript,\n    subscript,\n    color,\n    save,\n    pageMode,\n    scaleAdd,\n    scaleMiuns,\n    paperSize,\n    paperDirection,\n    printTemplate,\n    getPaperMargin,\n    setPaperMargin,\n    updateCatalog,\n    setWordImage,\n    setWordContent,\n    leftAlign,\n    centerAlign,\n    rightAlign,\n    alignmentAlign,\n    rowMargin,\n    pageBreak,\n    cellColor,\n    setHighlightColor,\n    title,\n    list,\n    tabCell,\n    separator,\n    setHyperlink,\n    getHyperlink,\n    setWatermark,\n    deleteWatermarkClick,\n    arrowLeft,\n    arrowRight,\n    searchInput,\n    searchKeyDown,\n    replaceText,\n    closeSearch,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/wordtpl/DocDesign.vue",
    "content": "<template>\n  <Loading :loading=\"loading\" content=\"加载中请稍后\"></Loading>\n  <div class=\"content\" style=\"height: 100vh; display: flex; flex-direction: column; overflow: hidden; background-color: #f0f2f5\">\n    <div style=\"width: 100%; flex: none\" class=\"header-box\">\n      <a-layout>\n        <a-layout-header class=\"space-between header\">\n          <div class=\"align-center header-title\">\n            <div class=\"header-name ellipsis\" style=\"cursor: pointer\" :title=\"formState.name\" @click=\"showInputClick\" v-if=\"!showInput\">\n              {{ formState.name }}\n            </div>\n            <div v-else class=\"header-name\">\n              <a-input ref=\"nameRef\" style=\"border-bottom: 1px solid #73a2e3; border-radius: 0\" :bordered=\"false\" v-model:value=\"formState.name\" @pressEnter=\"saveTemplateNameClick\" @blur=\"saveTemplateNameClick\"></a-input>\n            </div>\n          </div>\n        </a-layout-header>\n        <a-layout-content>\n          <div class=\"center\">\n            <div class=\"menu\" editor-component=\"menu\">\n              <div class=\"menu-item\">\n                <!--  保存  -->\n                <div class=\"jeecg-menu-item-save\" title=\"保存模板\" @click=\"saveTemplate\">\n                  <i />\n                </div>\n                <!--  上传  -->\n                <div class=\"jeecg-menu-item-upload\" title=\"上传\" @click=\"uploadWordFile\">\n                  <i />\n                  <input\n                    ref=\"uploadWordFileRef\"\n                    type=\"file\"\n                    accept=\".docx\"\n                    @change=\"uploadDocxChange\"\n                    style=\"display: none\"/>\n                </div>\n                <div style=\"display: none\">\n                  <input id=\"uploadDocxBtn\" type=\"file\" accept=\".docx\" />\n                </div>\n                <div class=\"jeecg-menu-item-download\" title=\"导出模板\" @click=\"downloadTemplate\">\n                  <i />\n                </div>\n                <!--  预览  -->\n                <!-- <div class=\"menu-item-preview\" title=\"预览\">\n                   <i />\n                 </div>-->\n                <div class=\"jeecg-menu-item-undo no-allow\" @click=\"undo\" :title=\"isApple ? '撤销(⌘+Z)' : '撤销(Ctrl+Z)'\">\n                  <i />\n                </div>\n                <div class=\"jeecg-menu-item-redo no-allow\" @click=\"redo\" :title=\"isApple ? '(重做⌘)' : '(CtrlY)'\">\n                  <i />\n                </div>\n                <div class=\"jeecg-menu-item-painter\" title=\"格式刷(双击可连续使用)\" @click=\"painterClick\" @dblclick=\"painterDblClick\">\n                  <i />\n                </div>\n                <div class=\"jeecg-menu-item-format\" title=\"清除格式\" @click=\"clearFormat\">\n                  <i />\n                </div>\n              </div>\n              <a-divider type=\"vertical\" style=\"border-inline-start: 1px solid #cfd2d8; height: 20px\" />\n              <div class=\"menu-item\">\n                <div class=\"jeecg-menu-item-font\" @click=\"fontFamilyClick('.jeecg-menu-item-font', '.options')\">\n                  <span class=\"select\" title=\"字体\">{{ formState.family }}</span>\n                  <div class=\"options\">\n                    <ul>\n                      <li v-for=\"item in fontStyleOption\" :data-family=\"item.value\" :style=\"{ 'font-family': item.value}\" @click=\"font(item.value, item.label)\">{{ item.label }}</li>\n                    </ul>\n                  </div>\n                </div>\n                <div title=\"字号\" class=\"jeecg-menu-item-size\" @click=\"fontFamilyClick('.jeecg-menu-item-size', '.options')\">\n                  <span class=\"select\" title=\"字体\">{{ formState.size }}</span>\n                  <div class=\"options\">\n                    <ul>\n                      <li v-for=\"item in fontSizeOption\" :data-size=\"item.value\" @click=\"fontSize(item.value, item.label)\">{{ item.label }}</li>\n                    </ul>\n                  </div>\n                </div>\n                <div class=\"jeecg-menu-item-size-add\" :title=\"`增大字号(${isApple ? '⌘' : 'Ctrl'}+[)`\" @click=\"sizeAdd\">\n                  <i />\n                </div>\n                <div class=\"jeecg-menu-item-size-minus\" :title=\"`减小字号(${isApple ? '⌘' : 'Ctrl'}+])`\" @click=\"sizeMinus\">\n                  <i />\n                </div>\n                <div class=\"jeecg-menu-item-bold\" :title=\"`加粗(${isApple ? '⌘' : 'Ctrl'}+B)`\" @click=\"blob\">\n                  <i />\n                </div>\n                <div class=\"jeecg-menu-item-italic\" :title=\"`斜体(${isApple ? '⌘' : 'Ctrl'}+I)`\" @click=\"itailc\">\n                  <i />\n                </div>\n                <div\n                  class=\"jeecg-menu-item-underline\"\n                  :title=\"`下划线(${isApple ? '⌘' : 'Ctrl'}+U)`\"\n                  @click=\"fontFamilyClick('.jeecg-menu-item-underline', '.options')\"\n                >\n                  <i @click.stop=\"underline('')\" />\n                  <span class=\"select\" />\n                  <div class=\"options\">\n                    <ul>\n                      <li v-for=\"item in underlineOptions\" :data-decoration-style=\"item.value\" @click.stop=\"underline(item.value)\">\n                        <i />\n                      </li>\n                    </ul>\n                  </div>\n                </div>\n                <div class=\"jeecg-menu-item-strikeout\" title=\"删除线(Ctrl+Shift+X)\" @click=\"strikeout\">\n                  <i />\n                </div>\n                <div class=\"jeecg-menu-item-superscript\" :title=\"`上标(${isApple ? '⌘' : 'Ctrl'}+Shift+,)`\" @click=\"superscript\">\n                  <i />\n                </div>\n                <div class=\"jeecg-menu-item-subscript\" :title=\"`下标(${isApple ? '⌘' : 'Ctrl'}+Shift+.)`\" @click=\"subscript\">\n                  <i />\n                </div>\n                <div class=\"jeecg-menu-item-color\" title=\"字体颜色\" @click=\"colorClick\">\n                  <i />\n                  <span />\n                  <input id=\"color\" ref=\"colorRef\" type=\"color\" @input=\"color\">\n                </div>\n                <div class=\"jeecg-menu-item-highlight\" title=\"高亮\" @click=\"highLightColorClick\">\n                  <i />\n                  <span />\n                  <input id=\"highlight\" type=\"color\">\n                </div>\n                <div class=\"jeecg-menu-item-cellcolor\" title=\"单元格颜色\" @click=\"cellColorClick\">\n                  <i />\n                  <!-- <span></span> -->\n                  <input ref=\"cellColorRef\" id=\"cellcolor\" type=\"color\" @input=\"cellColor\">\n                </div>\n              </div>\n              <a-divider type=\"vertical\" style=\"border-inline-start: 1px solid #cfd2d8; height: 20px\" />\n              <div class=\"menu-item\">\n                <div class=\"jeecg-menu-item-title\" @click=\"fontFamilyClick('.jeecg-menu-item-title', '.options')\">\n                  <i class=\"page-mode-i\"/>\n                  <span class=\"select\" title=\"切换标题\">{{formState.title}}</span>\n                  <div class=\"options\">\n                    <ul>\n                      <li v-for=\"(item,index) in titleOptions\" style=\"font-size: 16px\" :title=\"`Ctrl+${isApple ? 'Option' : 'Alt'}+${index}`\" :data-level=\"item.value\" :style=\"{fontSize: item.fontSize}\" @click=\"title(item.value)\">{{item.label}}</li>\n                    </ul>\n                  </div>\n                </div>\n                <div class=\"jeecg-menu-item-left\" title=\"左对齐\" @click=\"leftAlign\" :title=\"`左对齐(${isApple ? '⌘' : 'Ctrl'}+L)`\">\n                  <i />\n                </div>\n                <div class=\"jeecg-menu-item-center\" title=\"居中\" @click=\"centerAlign\" :title=\"`居中对齐(${isApple ? '⌘' : 'Ctrl'}+E)`\">\n                  <i />\n                </div>\n                <div class=\"jeecg-menu-item-right\" title=\"右对齐\" @click=\"rightAlign\" :title=\"`右对齐(${isApple ? '⌘' : 'Ctrl'}+R)`\">\n                  <i />\n                </div>\n                <div class=\"jeecg-menu-item-alignment\" title=\"两端对齐\" @click=\"alignmentAlign\" :title=\"`两端对齐(${isApple ? '⌘' : 'Ctrl'}+J)`\">\n                  <i />\n                </div>\n                <div class=\"jeecg-menu-item-row-margin\" @click=\"fontFamilyClick('.jeecg-menu-item-row-margin', '.options')\">\n                  <i title=\"行间距\" class=\"page-mode-i\" />\n                  <div class=\"options\">\n                    <ul>\n                      <li v-for=\"item in marginOptions\" :data-rowmargin=\"item.value\" @click=\"rowMargin(item.value)\">{{item.label}}</li>\n                    </ul>\n                  </div>\n                </div>\n                <div class=\"jeecg-menu-item-list\" @click=\"fontFamilyClick('.jeecg-menu-item-list', '.options')\">\n                  <i class=\"page-mode-i\" />\n                  <div class=\"options\" :title=\"`列表(${isApple ? '⌘' : 'Ctrl'}+Shift+U)`\">\n                    <ul>\n                      <li  @click=\"list(null,null)\">\n                        <span>取消列表</span>\n                      </li>\n                      <li data-list-type=\"ol\" data-list-style=\"decimal\" @click=\"list('ol','decimal')\">\n                        <span>有序列表：</span>\n                        <ol>\n                          <li>________</li>\n                        </ol>\n                      </li>\n                      <li data-list-type=\"ul\" data-list-style=\"disc\" @click=\"list('ul','disc')\">\n                        <span>实心圆点列表：</span>\n                        <ul style=\"list-style-type: disc !important;\">\n                          <li>________</li>\n                        </ul>\n                      </li>\n                      <li data-list-type=\"ul\" data-list-style=\"circle\" @click=\"list('ul','circle')\">\n                        <span>空心圆点列表：</span>\n                        <ul style=\"list-style-type: circle !important;\">\n                          <li>________</li>\n                        </ul>\n                      </li>\n                      <li data-list-type=\"ul\" data-list-style=\"square\" @click=\"list('ul','square')\">\n                        <span>空心方块列表：</span>\n                        <ul style=\"list-style-type: square !important;\">\n                          <li>________</li>\n                        </ul>\n                      </li>\n                    </ul>\n                  </div>\n                </div>\n              </div>\n              <a-divider type=\"vertical\" style=\"border-inline-start: 1px solid #cfd2d8; height: 20px\" />\n              <div class=\"menu-item\">\n                <!-- <div class=\"jeecg-menu-item-chart\">\n                   <i title=\"图表\" />\n                 </div>-->\n                <div class=\"jeecg-menu-item-table\" @click=\"tableClick\">\n                  <i title=\"表格\" class=\"page-mode-i\"/>\n                </div>\n                <div class=\"jeecg-menu-item-table-collapse page-mode-i\" style=\"display: none\">\n                  <div class=\"table-close\" @click=\"recoveryTable\">×</div>\n                  <div class=\"table-title page-mode-i\" >\n                    <span class=\"table-select page-mode-i\">插入</span>\n                    <span class=\"page-mode-i\">表格</span>\n                  </div>\n                  <div class=\"table-panel page-mode-i\" @mousemove=\"tableMousemove\" @click=\"tableCellClick\"/>\n                </div>\n                <div class=\"jeecg-menu-item-image\" @click=\"uploadImage\">\n                  <i title=\"图片\" />\n                  <input\n                    ref=\"uploadImageRef\"\n                    id=\"image\"\n                    type=\"file\"\n                    accept=\".png, .jpg, .jpeg, .svg, .gif\"\n                    @change=\"uploadImageChange\"\n                  >\n                </div>\n                <!--<div class=\"jeecg-menu-item-barcode\">\n                  <i title=\"条形码\" />\n                </div>\n                <div class=\"jeecg-menu-item-qrcode\">\n                  <i title=\"二维码\" />\n                </div>-->\n                <div class=\"jeecg-menu-item-hyperlink\" @click=\"hyperlinkClick\">\n                  <i title=\"超链接\" />\n                </div>\n                <div class=\"jeecg-menu-item-separator\" @click.stop=\"separatorClick\">\n                  <i title=\"分割线\" class=\"page-mode-i\"/>\n                  <div class=\"options page-mode-i\">\n                    <ul>\n                      <li class=\"page-mode-i\" v-for=\"item in separatorOption\" :data-separator=\"item.value\" @click.stop=\"separatorActiveClick(item.value)\">\n                        <i />\n                      </li>\n                    </ul>\n                    <div class=\"more page-mode-i\">\n                      <div class=\"page-mode-i\">颜色:<a-input @click.stop=\"\" type=\"color\" class=\"page-mode-i color\" v-model:value=\"formState.separatorColor\"/></div>\n                      <div class=\"page-mode-i\">粗细(px):<a-input-number @click.stop=\"\" type=\"tel\" class=\"page-mode-i lineWidth\"  v-model:value=\"formState.separatorLineWidth\"/></div>\n                      <div class=\"page-mode-i\" style=\"margin-top: 10px;\">\n                        <a-button size=\"small\" type=\"primary\" @click.prevent.stop=\"separatorOk\">确定</a-button>\n                        <a-button @click.prevent.stop=\"separatorCancel\" size=\"small\" style=\"margin-left: 6px\">取消</a-button>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"jeecg-menu-item-watermark\" @click=\"fontFamilyClick('.jeecg-menu-item-watermark', '.options')\">\n                  <i title=\"水印(添加、删除)\" class=\"page-mode-i\"/>\n                  <div class=\"options\">\n                    <ul>\n                      <li data-menu=\"add\" @click=\"addWatermarkClick\">添加水印</li>\n                      <li data-menu=\"delete\" @click=\"deleteWatermarkClick\">删除水印</li>\n                    </ul>\n                  </div>\n                </div>\n                <div class=\"jeecg-menu-item-page-break\" title=\"分页符\" @click=\"pageBreak\">\n                  <i />\n                </div>\n              </div>\n              <a-divider type=\"vertical\" style=\"border-inline-start: 1px solid #cfd2d8; height: 20px\" />\n              <div class=\"menu-item\">\n                <div :title=\"`搜索与替换(${isApple ? '⌘' : 'Ctrl'}+F)`\" class=\"jeecg-menu-item-search\" data-menu=\"search\" title=\"查找替换\" @click=\"searchClick\">\n                  <i class=\"page-mode-i\"/>\n                </div>\n                <div class=\"jeecg-menu-item-search-collapse\" data-menu=\"search\" style=\"display: none\">\n                  <div class=\"jeecg-menu-item-search-collapse-search\">\n                    <input type=\"text\" @input=\"searchInput\" @keydown=\"searchKeyDown\">\n                    <label class=\"search-result\" />\n                    <div class=\"arrow-left\" @click=\"arrowLeft\">\n                      <i />\n                    </div>\n                    <div class=\"arrow-right\" @click=\"arrowRight\">\n                      <i />\n                    </div>\n                    <span @click=\"closeSearch\">×</span>\n                  </div>\n                  <div class=\"jeecg-menu-item-search-collapse-replace\">\n                    <input type=\"text\">\n                    <button @click=\"replaceText\">替换</button>\n                  </div>\n                </div>\n                <div :title=\"`打印(${isApple ? '⌘' : 'Ctrl'}+P)`\" class=\"jeecg-menu-item-print\" data-menu=\"print\" title=\"打印\" @click=\"printTemplate\">\n                  <i />\n                </div>\n              </div>\n            </div>\n            <div class=\"catalog\" editor-component=\"catalog\">\n              <div class=\"jeecg-catalog-header\">\n                <span>目录</span>\n                <div class=\"jeecg-catalog-header-close\" @click=\"closeDirectory\">\n                  <i />\n                </div>\n              </div>\n              <div class=\"jeecg-catalog-main\" />\n            </div>\n            <div class=\"editor-container\">\n              <div class=\"jeecg__editor\" />\n            </div>\n          </div>\n        </a-layout-content>\n        <a-layout-footer>\n          <div class=\"footer\" editor-component=\"footer\">\n            <div>\n              <div class=\"catalog-mode\" title=\"目录\" @click=\"openDirectory\">\n                <i />\n              </div>\n              <div class=\"page-mode\" @click=\"fontFamilyClick('.page-mode', '.options')\">\n                <i title=\"页面模式(分页、连页)\" class=\"page-mode-i\"/>\n                <div class=\"options\">\n                  <ul>\n                    <li v-for=\"item in pageModeOptions\" :data-page-mode=\"item.value\" :class=\"item.value === 'paging'?'active':''\" @click=\"pageMode(item.value)\">{{item.label}}</li>\n                  </ul>\n                </div>\n              </div>\n              <span>可见页码：<span class=\"page-no-list\">1</span></span>\n              <span>页面：<span class=\"page-no\">1</span>/<span class=\"page-size\" >1</span></span>\n              <span>字数：<span class=\"word-count\">0</span></span>\n            </div>\n            <div>\n              <div class=\"page-scale-minus\" title=\"缩小(Ctrl+-)\" @click=\"scaleMiuns\">\n                <i />\n              </div>\n              <span\n                class=\"page-scale-percentage\"\n                title=\"显示比例(点击可复原Ctrl+0)\"\n              >100%</span>\n              <div class=\"page-scale-add\" title=\"放大(Ctrl+=)\" @click=\"scaleAdd\">\n                <i />\n              </div>\n              <div class=\"paper-size\" @click=\"fontFamilyClick('.paper-size', '.options')\">\n                <i title=\"纸张类型\" class=\"page-mode-i\"/>\n                <div class=\"options\" title=\"纸张大小\">\n                  <ul>\n                    <li v-for=\"item in paperSizeOption\" :data-paper-size=\"item.value\" :class=\"item.label === 'A4'?'active':''\" @click=\"paperSize(item.value)\">{{item.label}}</li>\n                  </ul>\n                </div>\n              </div>\n              <div class=\"paper-direction\" @click=\"fontFamilyClick('.paper-direction', '.options')\">\n                <i title=\"纸张方向\" class=\"page-mode-i\"/>\n                <div class=\"options\">\n                  <ul>\n                    <li v-for=\"item in paperDirectionOptions\" :data-paper-direction=\"item.value\" :class=\"item.value == 'vertical'?'active':''\" @click=\"paperDirection(item.value)\">{{item.label}}</li>\n                  </ul>\n                </div>\n              </div>\n              <div class=\"paper-margin\" title=\"页边距\" @click=\"paperMarginClick\">\n                <i />\n              </div>\n              <div class=\"fullscreen\" title=\"全屏显示\">\n                <i />\n              </div>\n            </div>\n          </div>\n        </a-layout-footer>\n      </a-layout>\n    </div>\n    <!--  页边距  -->\n    <PagerMarginDrawer @register=\"registerPagerMarginDrawer\" @ok=\"setPaperMargin\"></PagerMarginDrawer>\n    <!--  高亮颜色  -->\n    <HighlightColorModal @register=\"registerHighlightColorModal\" @ok=\"setHighlightColor\"></HighlightColorModal>\n    <!--  超链接  -->\n    <HyperlinkDrawer @register=\"registerHyperlinkDrawer\" @ok=\"setHyperlink\"></HyperlinkDrawer>\n    <!--  水印  -->\n    <WatermarkDrawer @register=\"registerWatermarkDrawer\" @ok=\"setWatermark\"></WatermarkDrawer>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { Loading } from '/@/components/Loading';\n  import { nextTick, onUnmounted, ref } from 'vue';\n  import { createEditor, method } from '@/components/wordtpl/DocDesign';\n  import PagerMarginDrawer from './components/PagerMarginDrawer.vue'\n  import HyperlinkDrawer from './components/HyperlinkDrawer.vue'\n  import WatermarkDrawer from './components/WatermarkDrawer.vue'\n  import HighlightColorModal from './components/HighlightColorModal.vue'\n  import { useDrawer } from \"@/components/Drawer\";\n  import { defHttp } from \"@/utils/http/axios\";\n  import { getFileAccessHttpUrl } from \"@/utils/common/compUtils\";\n  import { useModal } from \"@/components/Modal\";\n  \n  const props = defineProps({\n    //内容（包含图片、页眉、页脚）\n    content: { type: Object, default: {} },\n    //图片上传路径\n    uploadImageUrl: { type: String, default: '/sys/common/upload' },\n    //文件上传路径\n    uploadFileUrl: { type: String, default: '/wordtpl/template/parse/file' },\n  });\n\n  let emit = defineEmits(['download', 'save']);\n  \n  //字体样式\n  const fontStyleOption = [\n    { label: '微软雅黑', value: 'Microsoft YaHei' },\n    { label: '宋体', value: '宋体' },\n    { label: '黑体', value: '黑体' },\n    { label: '仿宋', value: '仿宋' },\n    { label: '楷体', value: '楷体' },\n    { label: '等线', value: '等线' },\n    { label: '华文琥珀', value: '华文琥珀' },\n    { label: '华文楷体', value: '华文楷体' },\n    { label: '华文隶书', value: '华文隶书' },\n    { label: '华文新魏', value: '华文新魏' },\n    { label: '华文行楷', value: '华文行楷' },\n    { label: '华文中宋', value: '华文中宋' },\n    { label: '华文彩云', value: '华文彩云' },\n    { label: 'Arial', value: 'Arial' },\n    { label: 'Segoe UI', value: 'Segoe UI' },\n    { label: 'Ink Free', value: 'Ink Free' },\n    { label: 'Fantasy', value: 'Fantasy' },\n  ];\n\n  //字体\n  const fontSizeOption = [\n    { label: '初号', value: '56' },{ label: '小初', value: '48' },{ label: '一号', value: '34' },{ label: '小一', value: '32' },\n    { label: '二号', value: '29' },{ label: '小二', value: '24' }, { label: '三号', value: '21' }, { label: '小三', value: '20' },\n    { label: '四号', value: '18' }, { label: '小四', value: '16' }, { label: '五号', value: '14' },  { label: '小五', value: '12' },\n    { label: '六号', value: '10' },{ label: '小六', value: '8' },  { label: '七号', value: '7' },  { label: '八号', value: '6' },\n    { label: '5', value: '5' }, { label: '9', value: '9' },{ label: '13', value: '13' },{ label: '15', value: '15' },\n    { label: '17', value: '17' }, { label: '19', value: '19' },{ label: '23', value: '23' },{ label: '25', value: '25' },\n    { label: '26', value: '26' }, { label: '27', value: '27' },{ label: '30', value: '30' },{ label: '31', value: '31' },\n    { label: '33', value: '33' },  { label: '35', value: '35' },{ label: '36', value: '36' },{ label: '37', value: '37' },\n    { label: '38', value: '38' }, { label: '39', value: '39' },{ label: '40', value: '40' },{ label: '41', value: '41' },\n    { label: '42', value: '42' }, { label: '43', value: '43' },{ label: '44', value: '44' },{ label: '45', value: '45' },\n    { label: '46', value: '46' }, { label: '47', value: '47' },{ label: '50', value: '50' },{ label: '51', value: '51' },\n    { label: '52', value: '52' }, { label: '52', value: '52' },{ label: '54', value: '54' },{ label: '57', value: '57' },\n    { label: '58', value: '58' }, { label: '59', value: '59' },{ label: '60', value: '60' },{ label: '60', value: '60' },\n    { label: '62', value: '62' }, { label: '63', value: '63' },{ label: '64', value: '64' },{ label: '65', value: '65' },\n    { label: '66', value: '66' },{ label: '67', value: '67' },{ label: '68', value: '68' },{ label: '69', value: '69' },\n    { label: '70', value: '70' },{ label: '71', value: '71' },{ label: '72', value: '72' }\n  ];\n\n  //下划线\n  const underlineOptions = [\n    { label: 'solid', value: 'solid' },\n    { label: 'double', value: 'double' },\n    { label: 'dashed', value: 'dashed' },\n    { label: 'dotted', value: 'dotted' },\n    { label: 'wavy', value: 'wavy' },\n  ];\n  \n  //标题\n  const titleOptions = [\n    { label: '正文', value: null, fontSize: '16px' },\n    { label: '标题1', value: 'first', fontSize: '26px' },\n    { label: '标题2', value: 'second', fontSize: '24px' },\n    { label: '标题3', value: 'third', fontSize: '22px' },\n    { label: '标题4', value: 'fourth', fontSize: '20px' },\n    { label: '标题5', value: 'fifth', fontSize: '18px' },\n    { label: '标题6', value: 'sixth', fontSize: '16px' },\n  ];\n  \n  //行间距\n  const marginOptions = [\n    { label: '1', value: '1' },\n    { label: '1.25', value: '1.25' },\n    { label: '1.5', value: '1.5' },\n    { label: '1.75', value: '1.75' },\n    { label: '2', value: '2' },\n    { label: '2.5', value: '2.5' },\n    { label: '3', value: '3' },\n  ]\n  \n  //分割线\n  const separatorOption = [\n    { label: '0,0', value: '0,0' },\n    { label: '1,1', value: '1,1' },\n    { label: '3,1', value: '3,1' },\n    { label: '4,4', value: '4,4' },\n    { label: '7,3,3,3', value: '7,3,3,3' },\n    { label: '6,2,2,2,2,2', value: '6,2,2,2,2,2' },\n  ]\n  \n  //纸张大小\n  const paperSizeOption = [\n    { label: 'A4', value: '794*1123' },\n    { label: 'A2', value: '1593*2251' },\n    { label: 'A3', value: '1125*1593' },\n    { label: 'A5', value: '565*796' },\n    { label: '5号信封', value: '412*488' },\n    { label: '6号信封', value: '450*866' },\n    { label: '7号信封', value: '609*862' },\n    { label: '9号信封', value: '862*1221' },\n    { label: '法律用纸', value: '813*1266' },\n    { label: '信纸', value: '813*1054' },\n  ]\n  \n  //页面模式\n  const pageModeOptions = [\n    { label: '分页', value: 'paging' },\n    { label: '连页', value: 'continuity' },\n  ]  \n  \n  //纸张方向\n  const paperDirectionOptions = [\n    { label: '纵向', value: 'vertical' },\n    { label: '横向', value: 'horizontal' },\n  ]\n\n  //加载状态\n  const loading = ref<boolean>(false);\n  let { formState, save, clearFormat, undo, redo, isApple, painterClick, painterDblClick, font, \n    fontSize, sizeAdd, sizeMinus, blob, itailc, underline, strikeout, superscript, subscript,\n    color, pageMode, scaleAdd, scaleMiuns, paperSize, paperDirection, printTemplate, getPaperMargin,\n    setPaperMargin, updateCatalog, setWordImage, setWordContent, leftAlign, centerAlign, rightAlign, alignmentAlign,\n    rowMargin, pageBreak, cellColor, setHighlightColor, title, list, tabCell, separator, setHyperlink, getHyperlink,\n    setWatermark, deleteWatermarkClick, arrowLeft, arrowRight, searchInput, searchKeyDown, replaceText, closeSearch } = method();\n  //颜色的ref\n  const colorRef = ref();\n  initEditor();\n  //字体option\n  const fontOptionDom = ref<any>();\n  //字体大小option\n  const sizeOptionDom = ref<any>();\n  //下划线option\n  const underlineOptionDom = ref<any>();\n  //页面模式option\n  const pageModeOptionDom = ref<any>();\n  //纸张大小option\n  const paperSizeOptionDom = ref<any>();\n  //纸张方向option\n  const paperDirectionOptionDom = ref<any>();\n  //行间距option\n  const rowMarginOptionDom = ref<any>();\n  //标题Option\n  const titleOptionDom = ref<any>();\n  //列表Option\n  const listOptionDom = ref<any>();\n  //table折叠层\n  const tableCollapseDom = ref<any>();\n  //分割线\n  const separatorOptionDom = ref<any>();\n  //水印\n  const watermarkOptionDom = ref<any>();\n  //查找替换\n  const searchCollapseDom = ref<any>();\n  //边距的Drawer\n  const [registerPagerMarginDrawer, { openDrawer: openMarginDrawer }] = useDrawer();\n  //超链接的Drawer\n  const [registerHyperlinkDrawer, { openDrawer: openHyperlinkDrawer }] = useDrawer();\n  //水印的Drawer\n  const [registerWatermarkDrawer, { openDrawer: openHyperWatermarkDrawer }] = useDrawer();\n  //上传图片的ref\n  const uploadImageRef = ref();\n  //上传文件的ref\n  const uploadWordFileRef = ref();\n  //单元格背景色ref\n  const cellColorRef = ref();\n  //单元格列的数组\n  const tableCellList = ref<any>([]);\n  //当前第几行\n  const rowIndex = ref<number>(0);\n  //当前第几列\n  const colIndex = ref<number>(0);\n  //弹窗model\n  const [registerHighlightColorModal, { openModal: openHighlightColorModal }] = useModal();\n  \n  function initEditor() {\n    setTimeout(() => {\n      const fontDom: any = document.querySelector('.jeecg-menu-item-font');\n      fontOptionDom.value = fontDom.querySelector('.options');\n      //字体大小\n      const jeecgSizeDom: any = document.querySelector('.jeecg-menu-item-size');\n      sizeOptionDom.value = jeecgSizeDom.querySelector('.options');\n      //下划线\n      const underlineDom: any = document.querySelector('.jeecg-menu-item-underline');\n      underlineOptionDom.value = underlineDom.querySelector('.options');   \n      //分页\n      const pageModeDom: any = document.querySelector('.page-mode');\n      pageModeOptionDom.value = pageModeDom.querySelector('.options');\n      //分页\n      const pageSizeDom: any = document.querySelector('.paper-size');\n      paperSizeOptionDom.value = pageSizeDom.querySelector('.options');\n      //纸张方向\n      const paperDirectionDom: any = document.querySelector('.paper-direction');\n      paperDirectionOptionDom.value = paperDirectionDom.querySelector('.options'); \n      //行间距\n      const rowMarginDom: any = document.querySelector('.jeecg-menu-item-row-margin');\n      rowMarginOptionDom.value = rowMarginDom.querySelector('.options');\n      //标题\n      const titleDom: any = document.querySelector('.jeecg-menu-item-title');\n      titleOptionDom.value = titleDom.querySelector('.options');\n      //列表\n      const listDom: any = document.querySelector('.jeecg-menu-item-list');\n      listOptionDom.value = listDom.querySelector('.options'); \n      //表格\n      tableCollapseDom.value = document.querySelector('.jeecg-menu-item-table-collapse');\n      //分割线\n      let separatorDom:any = document.querySelector('.jeecg-menu-item-separator');\n      separatorOptionDom.value = separatorDom.querySelector('.options');\n      //水印\n      let watermarkDom:any = document.querySelector('.jeecg-menu-item-watermark');\n      watermarkOptionDom.value = watermarkDom.querySelector('.options');\n      //查找替换\n      searchCollapseDom.value = document.querySelector('.jeecg-menu-item-search-collapse');\n      \n      setTableStyle()\n      createEditor(props.content);\n      // 组件挂载后添加事件监听器\n      document.addEventListener('click', handleClickOutside);\n      //监听Ctrl或Cmd键和S键事件\n      document.addEventListener('keydown', handleKeyDown);\n    }, 300);\n  }\n\n  /**\n   * 下拉框点击事件\n   */\n  function fontFamilyClick(parentClass, childrenClass) {\n    const font: any = document.querySelector(parentClass);\n    const fontOption = font.querySelector(childrenClass);\n    if (parentClass === '.jeecg-menu-item-font') {\n      hiddenVisible('font');\n    } else if (parentClass === '.jeecg-menu-item-size') {\n      hiddenVisible('size');\n    } else if (parentClass === '.jeecg-menu-item-underline') {\n      hiddenVisible('underline');\n    } else if(parentClass === '.page-mode'){\n      hiddenVisible('pageMode');\n    } else if(parentClass === '.paper-size'){\n      hiddenVisible('paperSize');\n    } else if(parentClass === '.paper-direction'){\n      hiddenVisible('paperDirection');\n    } else if(parentClass === '.jeecg-menu-item-row-margin'){\n      hiddenVisible('rowMargin');\n    }else if(parentClass === '.jeecg-menu-item-title'){\n      hiddenVisible('title');\n    }else if(parentClass === '.jeecg-menu-item-list'){\n      hiddenVisible('list');\n    }else if(parentClass === '.jeecg-menu-item-separator'){\n      hiddenVisible('separator');\n    }else if(parentClass === '.jeecg-menu-item-watermark'){\n      hiddenVisible('watermark');\n    }\n    fontOption.classList.toggle('visible');\n    setDropdownContentPosition(font, fontOption);\n  }\n\n  /**\n   * 动态设置展开面板的位置\n   * @param parentNode\n   * @param dropdownNode\n   */\n  function setDropdownContentPosition(parentNode, dropdownNode) {\n    const dropdownContent = dropdownNode;\n    const rect = parentNode.getBoundingClientRect();\n    const screenWidth = window.innerWidth;\n    dropdownContent.style.top = `${rect.bottom}px`;\n    dropdownContent.style.left = `${rect.left}px`;\n    if (rect.left + dropdownContent.offsetWidth > screenWidth) {\n      dropdownContent.style.left = `${rect.right - dropdownContent.offsetWidth}px`;\n    }\n  }\n\n  /**\n   * 监听关闭事件\n   * @param event\n   */\n  const handleClickOutside = (event) => {\n    if (!event.target.closest('.select') && !event.target.closest(\".page-mode-i\")) {\n      hiddenVisible();\n    }\n  };\n\n  /**\n   * 颜色点击事件\n   */\n  function colorClick() {\n    colorRef.value.click();\n  }\n\n  /**\n   * 导出模板\n   */\n  function downloadTemplate() {\n    emit('download', props.content);\n  }\n\n  /**\n   * 保存\n   */\n  function saveTemplate() {\n    let saveData = save();\n    const params = Object.assign(props.content, saveData);\n    emit('save', params);\n  }\n\n  /**\n   * 隐藏下拉框的显示\n   * \n   * @param value\n   */\n  function hiddenVisible(value = ''){\n      if(!value || value !== 'font'){\n        fontOptionDom.value.classList.remove('visible');\n      }\n      if(!value || value !== 'size'){\n        sizeOptionDom.value.classList.remove('visible');\n      }\n      if(!value || value !== 'underline'){\n        underlineOptionDom.value.classList.remove('visible');\n      }\n      if(!value || value !== 'pageMode'){\n        pageModeOptionDom.value.classList.remove('visible');\n      }   \n      if(!value || value !== 'paperSize'){\n        paperSizeOptionDom.value.classList.remove('visible');\n      }\n      if(!value || value !== 'paperDirection'){\n        paperDirectionOptionDom.value.classList.remove('visible');\n      }\n      if(!value || value !== 'rowMargin'){\n        rowMarginOptionDom.value.classList.remove('visible');\n      }  \n      if(!value || value !== 'title'){\n        titleOptionDom.value.classList.remove('visible');\n      } \n      if(!value || value !== 'list'){\n        listOptionDom.value.classList.remove('visible');\n      }\n      if(!value || value !== 'table'){\n        recoveryTable();\n      } \n      if(!value || value !== 'separator'){\n        separatorOptionDom.value.classList.remove('visible');\n      } \n      if(!value || value !== 'watermark'){\n        watermarkOptionDom.value.classList.remove('visible');\n      }\n  }\n\n  /**\n   * 边距点击事件\n   */\n  function paperMarginClick() {\n    let values = getPaperMargin();\n    openMarginDrawer(true,{\n      ...values\n    })\n  }\n\n  /**\n   * 打开目录\n   */\n  function openDirectory() {\n    const catalogDom:any = document.querySelector('.catalog');\n    catalogDom.style.display = 'block';\n    formState.showCataLogDom = true;\n    updateCatalog();\n  }\n  \n  /**\n   * 关闭目录\n   */\n  function closeDirectory() {\n    const catalogDom:any = document.querySelector('.catalog');\n    formState.showCataLogDom = false;\n    catalogDom.style.display = 'none';\n  }\n  \n  /**\n   * 图片上传\n   */\n  function uploadImage(){\n    uploadImageRef.value.click();\n  }\n  //图片上传成功事件\n  const uploadImageSuccess = (fileInfo) => {\n    if(fileInfo.success){\n      let fileUrl = getFileAccessHttpUrl(fileInfo.message);\n      setWordImage(fileUrl);\n    }\n  }\n  \n  /**\n   * 文件上传改变事件\n   * @param e\n   */\n  function uploadImageChange(e) {\n    let file = e.target.files[0];\n    defHttp.uploadFile({ url: props.uploadImageUrl },  { file: file, filename: file.name, data: { biz: 'word' } }, { success: uploadImageSuccess });\n  }\n\n  //文件上传成功事件\n  const uploadFileSuccess = (fileInfo) => {\n    if(fileInfo.success){\n      setWordContent(fileInfo.result);\n    }\n  }\n  \n  /**\n   * 上传文件\n   */\n  function uploadWordFile() {\n    uploadWordFileRef.value.click();\n  }\n\n  /**\n   * 上传文件change\n   * @param e\n   */\n  function uploadDocxChange(e) {\n    let file = e.target.files[0];\n    defHttp.uploadFile({ url: props.uploadFileUrl },  { file: file, filename: file.name }, { success: uploadFileSuccess });\n  }\n\n  /**\n   * 单元格背景色点击事件\n   */\n  function cellColorClick() {\n    cellColorRef.value.click();\n  }\n\n  /**\n   * 高亮颜色点击事件爱你\n   */\n  function highLightColorClick() {\n    openHighlightColorModal(true,{\n      highlightColor:formState.highlightColor\n    })\n  }\n\n  /**\n   * 设置table9*9样式\n   */\n  function setTableStyle() {\n    const tablePanel:any = document.querySelector('.table-panel');\n    // 绘制行列\n    tableCellList.value = []\n    for (let i = 0; i < 10; i++) {\n      const tr = document.createElement('tr');\n      tr.classList.add('table-row');\n      const trCellList = []\n      for (let j = 0; j < 10; j++) {\n        const td = document.createElement('td');\n        td.classList.add('table-cel');\n        tr.append(td);\n        trCellList.push(td);\n      }\n      tablePanel.append(tr);\n      tableCellList.value.push(trCellList);\n    }\n  }\n  /**\n   * 表格点击事件\n   */\n  function tableClick() {\n    hiddenVisible('table');\n    const tableDom = document.querySelector('.jeecg-menu-item-table');\n    tableCollapseDom.value.style.display = 'block';\n    setDropdownContentPosition(tableDom, tableCollapseDom.value);\n  }\n\n  /**\n   * 移除所有格选择\n   */\n  function removeAllTableCellSelect() {\n    tableCellList.value.forEach(tr => {\n      tr.forEach(td => td.classList.remove('active'))\n    })\n  }\n\n  /**\n   * 设置标题内容\n   * @param payload\n   */\n  function setTableTitle(payload) {\n    const tableTitle:any = document.querySelector('.table-select');\n    tableTitle.innerText = payload;\n  }\n\n  /**\n   * 恢复初始状态\n   */\n  function recoveryTable() {\n    // 还原选择样式、标题、选择行列\n    removeAllTableCellSelect()\n    setTableTitle('插入')\n    colIndex.value = 0\n    rowIndex.value = 0\n    // 隐藏panel\n    tableCollapseDom.value.style.display = 'none';\n  }\n\n  /**\n   * 表格鼠标移动事件\n   * @param evt\n   */\n  function tableMousemove(evt) {\n    const celSize = 16;\n    const rowMarginTop = 10;\n    const celMarginRight = 6;\n    const { offsetX, offsetY } = evt;\n    // 移除所有选择\n    removeAllTableCellSelect()\n    colIndex.value = Math.ceil(offsetX / (celSize + celMarginRight)) || 1;\n    rowIndex.value = Math.ceil(offsetY / (celSize + rowMarginTop)) || 1;\n    // 改变选择样式\n    tableCellList.value.forEach((tr, trIndex) => {\n      tr.forEach((td, tdIndex) => {\n        if (tdIndex < colIndex.value && trIndex < rowIndex.value) {\n          td.classList.add('active');\n        }\n      })\n    })\n    // 改变表格标题\n    setTableTitle(`${rowIndex.value}×${colIndex.value}`);\n  }\n\n  /**\n   * table单元格单击事件\n   */\n  function tableCellClick() {\n    tabCell(rowIndex.value,colIndex.value,recoveryTable);\n  }\n\n  /**\n   * 超链接点击事件\n   */\n  function hyperlinkClick() {\n    let hyperlink = getHyperlink();\n    openHyperlinkDrawer(true,{\n      ...hyperlink\n    })\n  }\n\n  /**\n   * 添加水印\n   */\n  function addWatermarkClick(){\n    openHyperWatermarkDrawer(true,{});\n  }\n\n  /**\n   * 查找点击事件\n   */\n  function searchClick() {\n    searchCollapseDom.value.style.display = 'block';\n    const searchDom:any =document.querySelector('.jeecg-menu-item-search');\n    const searchInputDom:any = document.querySelector('.jeecg-menu-item-search-collapse-search input')\n    const searchCollapseRect = searchCollapseDom.value.getBoundingClientRect();\n    const bodyRect = document.body.getBoundingClientRect();\n    const searchRect = searchDom.getBoundingClientRect();\n    if (searchRect.left + searchCollapseRect.width > bodyRect.width) {\n      searchCollapseDom.value.style.right = '0px';\n      searchCollapseDom.value.style.left = 'unset';\n    } else {\n      searchCollapseDom.value.style.right = 'unset';\n      searchCollapseDom.value.style.left = searchRect.left + 'px';\n    }\n    searchInputDom.focus();\n  }\n\n\n  /**\n   * 检查是否按下了Ctrl或Cmd键和S键\n   * @param event\n   */\n  function handleKeyDown(event) {\n    // 检查是否按下了Ctrl或Cmd键和S键\n    if ((event.ctrlKey || event.metaKey) && event.key === 's') {\n      event.preventDefault();\n      //保存\n      saveTemplate();\n    }\n  }\n\n  //是否显示输入框\n  const showInput = ref<boolean>(false);\n  //标题输入框\n  const nameRef = ref();\n  \n  /**\n   * 显示或隐藏输入框\n   */\n  function showInputClick() {\n    showInput.value = true;\n    nextTick(()=>{\n      nameRef.value.focus();\n      nameRef.value.select();\n    })\n  }\n\n  /**\n   * 保存模板名称事件\n   */\n  function saveTemplateNameClick() {\n    showInput.value = false;\n    let saveData = save();\n    if(formState.name != props.content.name){\n      const params = Object.assign(props.content, saveData, { name: formState.name });\n      emit('save', params);\n    }\n  }\n\n  /**\n   * 分隔符点击事件\n   */\n  function separatorClick() {\n    hiddenVisible('separator');\n    const separator: any = document.querySelector(\".jeecg-menu-item-separator\");\n    const separatorOption = separator.querySelector(\".options\");\n    separatorOption.classList.add('visible');\n    setDropdownContentPosition(separator, separatorOption);\n  }\n\n  /**\n   * 分割线确定事件\n   */\n  function separatorOk() {\n    const separators: any = document.querySelector(\".jeecg-menu-item-separator\");\n    const separatorOption = separators.querySelector(\".options\");\n    separatorOption.classList.remove('visible');\n    console.log(\"我进来了1111\")\n    separator();\n  }\n  \n  /**\n   * 分割线取消事件\n   */\n  function separatorCancel() {\n    separatorOptionDom.value.classList.remove('visible');\n    formState.separatorColor = '#000000';\n    formState.separatorLineWidth = 1;\n    formState.separator = '0,0';\n    separatorOptionDom.value.querySelectorAll('li') .forEach(li => li.classList.remove('active'));\n  }\n\n  /**\n   * 分割线下拉选中事件\n   * @param value\n   */\n  function separatorActiveClick(value) {\n    separatorOptionDom.value.querySelectorAll('li') .forEach(li => li.classList.remove('active'));\n    const curSeparatorDom:any = separatorOptionDom.value.querySelector(`[data-separator='${value}']`);\n    if (curSeparatorDom) {\n      formState.separator = value;\n      curSeparatorDom.classList.add('active');\n    }\n  }\n  \n  \n  onUnmounted(() => {\n    // 组件卸载前移除事件监听器，防止内存泄漏\n    document.removeEventListener('click', handleClickOutside);\n    // 移出键盘事件\n    document.removeEventListener('keydown', handleKeyDown);\n  });\n</script>\n\n<style scoped lang=\"scss\" src=\"./style/DocDesign.css\"></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/wordtpl/canvas-editor.js",
    "content": "(function(){\"use strict\";try{if(typeof document!=\"undefined\"){var e=document.createElement(\"style\");e.id=\"canvas-editor-style\",e.appendChild(document.createTextNode('.ce-select-control-popup{max-width:160px;min-width:69px;max-height:225px;position:absolute;z-index:1;border:1px solid #e4e7ed;border-radius:4px;background-color:#fff;box-shadow:0 2px 12px #0000001a;box-sizing:border-box;margin:5px 0;overflow-y:auto}.ce-select-control-popup ul{list-style:none;padding:3px 0;margin:0;box-sizing:border-box}.ce-select-control-popup ul li{font-size:13px;padding:0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#666;height:36px;line-height:36px;box-sizing:border-box;cursor:pointer}.ce-select-control-popup ul li:hover{background-color:#eef2fd}.ce-select-control-popup ul li.active{color:var(--COLOR-HOVER, #5175f4);font-weight:700}.ce-date-container{display:none;width:300px;overflow:hidden;left:0;right:0;position:absolute;z-index:1;color:#606266;background:#ffffff;border-radius:4px;padding:10px;user-select:none;border:1px solid #e4e7ed;box-shadow:0 2px 12px #0000001a}.ce-date-container.active{display:block}.ce-date-wrap{display:none}.ce-date-wrap.active{display:block}.ce-date-title{display:flex;justify-content:center;align-items:center;text-align:center;color:#606266;font-size:16px}.ce-date-title>span{display:inline-block}.ce-date-title>span:not(.ce-date-title__now){font-family:cursive;cursor:pointer}.ce-date-title>span:not(.ce-date-title__now):hover{color:#5175f4}.ce-date-title .ce-date-title__pre-year,.ce-date-title .ce-date-title__pre-month{width:15%}.ce-date-title .ce-date-title__now{width:40%}.ce-date-title .ce-date-title__next-year,.ce-date-title .ce-date-title__next-month{width:15%}.ce-date-week{width:100%;display:flex;justify-content:center;margin-top:15px;padding-bottom:5px;border-bottom:1px solid #e4e7ed}.ce-date-week>span{list-style:none;width:calc(100%/7);text-align:center;color:#606266;font-size:14px}.ce-date-day{width:100%;display:flex;flex-wrap:wrap;align-items:center;margin-top:5px}.ce-date-day>div{width:calc(100%/7);height:40px;text-align:center;color:#606266;font-size:14px;cursor:pointer;line-height:40px;border-radius:4px}.ce-date-day>div:hover{color:#5175f4;opacity:.8}.ce-date-day>div.active{color:#5175f4;font-weight:700}.ce-date-day>div.disable{color:#c0c4cc}.ce-date-day>div.select{color:#fff;background-color:#5175f4}.ce-time-wrap{display:none;padding:10px;height:286px}.ce-time-wrap ::-webkit-scrollbar{width:0}.ce-time-wrap.active{display:flex}.ce-time-wrap li{list-style:none}.ce-time-wrap>li{width:33.3%;height:100%;text-align:center}.ce-time-wrap>li>span{transform:translateY(-5px);display:inline-block}.ce-time-wrap>li>ol{height:calc(100% - 20px);overflow-y:auto;border:1px solid #e2e2e2;position:relative}.ce-time-wrap>li:first-child>ol{border-right:0}.ce-time-wrap>li:last-child>ol{border-left:0}.ce-time-wrap>li>ol>li{line-height:30px;cursor:pointer;transition:all .3s}.ce-time-wrap>li>ol>li:hover{background-color:#eaeaea}.ce-time-wrap>li>ol>li.active{color:#fff;background:#5175F4}.ce-date-menu{width:100%;height:28px;display:flex;justify-content:flex-end;align-items:center;padding-top:10px;position:relative;border-top:1px solid #e4e7ed}.ce-date-menu button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #dcdfe6;color:#606266;appearance:none;text-align:center;box-sizing:border-box;outline:none;transition:.1s;font-weight:500;user-select:none;padding:7px 15px;font-size:12px;border-radius:3px;margin:0 0 0 10px}.ce-date-menu button:hover{color:#5175f4;border-color:#5175f4}.ce-date-menu button.ce-date-menu__time{border:1px solid transparent;position:absolute;left:0;margin-left:0}.ce-date-menu button.ce-date-menu__time:hover{color:#5175f4}.ce-block-item{position:absolute;z-index:0;overflow:hidden;border-radius:8px;background-color:#fff;border:1px solid rgb(235 236 240)}.ce-table-tool__row{position:absolute;width:12px;border-radius:6.5px;overflow:hidden;background-color:#e2e6ed}.ce-table-tool__row .ce-table-tool__row__item{width:100%;position:relative}.ce-table-tool__row .ce-table-tool__row__item:after{content:\"\";position:absolute;bottom:0;left:2px;width:8px;height:1px;background-color:#c0c6cf}.ce-table-tool__row .ce-table-tool__row__item:last-child:after{display:none}.ce-table-tool__quick__add{width:16px;height:16px;position:absolute;border-radius:50%;background-color:#e2e6ed;cursor:pointer}.ce-table-tool__quick__add:after{content:\"+\";color:#fff;position:absolute;top:50%;left:50%;transform:translate(-50%,-55%)}.ce-table-tool__select{width:16px;height:18px;position:absolute;border-radius:3px;cursor:pointer}.ce-table-tool__select:hover{background-color:#e2e6ed}.ce-table-tool__select:after{content:\":::\";color:#aaaaab;position:absolute;top:50%;left:50%;transform:translate(-75%,-50%) rotate(-90deg)}.ce-table-tool__col{position:absolute;height:12px;border-radius:6.5px;overflow:hidden;background-color:#e2e6ed;display:flex}.ce-table-tool__col .ce-table-tool__col__item{height:100%;position:relative}.ce-table-tool__col .ce-table-tool__col__item:after{content:\"\";position:absolute;top:2px;left:-1px;width:1px;height:8px;z-index:1;background-color:#c0c6cf}.ce-table-tool__col .ce-table-tool__col__item:first-child:after{display:none}.ce-table-tool__row .ce-table-tool__row__item.active,.ce-table-tool__col .ce-table-tool__col__item.active{background-color:#c4d7fa}.ce-table-tool__col .ce-table-tool__anchor{right:-5px;width:10px;height:12px;z-index:9;position:absolute;cursor:col-resize}.ce-table-tool__row .ce-table-tool__anchor{bottom:-5px;left:0;width:12px;height:10px;z-index:9;position:absolute;cursor:row-resize}.ce-table-anchor__line{z-index:9;position:absolute;border:1px dotted #000000}.ce-table-tool__border{position:absolute;z-index:1;background:transparent;pointer-events:none}.ce-table-tool__border__row{position:absolute;cursor:row-resize;pointer-events:auto}.ce-table-tool__border__col{position:absolute;cursor:col-resize;pointer-events:auto}.ce-resizer-selection{position:absolute;border:1px solid;pointer-events:none}.ce-resizer-selection .resizer-handle{position:absolute;z-index:9;width:10px;height:10px;box-shadow:0 1px 4px #0000004d;border-radius:5px;border:2px solid #ffffff;box-sizing:border-box;pointer-events:initial}.ce-resizer-selection .handle-0{cursor:nw-resize}.ce-resizer-selection .handle-1{cursor:n-resize}.ce-resizer-selection .handle-2{cursor:ne-resize}.ce-resizer-selection .handle-3{cursor:e-resize}.ce-resizer-selection .handle-4{cursor:se-resize}.ce-resizer-selection .handle-5{cursor:s-resize}.ce-resizer-selection .handle-6{cursor:sw-resize}.ce-resizer-selection .handle-7{cursor:w-resize}.ce-resizer-size-view{display:flex;align-items:center;height:20px;white-space:nowrap;position:absolute;z-index:9;top:-30px;left:0;opacity:.9;background-color:#000;padding:0 5px;border-radius:4px}.ce-resizer-size-view span{color:#fff;font-size:12px}.ce-resizer-image{position:absolute;opacity:.5}.ce-image-previewer{position:fixed;left:0;top:0;z-index:1000;width:100%;height:100%;overflow:hidden;background:#f2f4f7;display:flex;align-items:center;justify-content:center;animation:previewerAnimation .3s}@keyframes previewerAnimation{0%{opacity:.1}to{opacity:1}}.ce-image-previewer .image-close{width:24px;height:24px;display:inline-block;position:absolute;right:50px;top:30px;z-index:99;cursor:pointer;background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIzLjk3IDdsMS40MTUgMS40MTQtNy43NzkgNy43NzggNy43NzkgNy43NzktMS40MTQgMS40MTQtNy43NzktNy43NzktNy43NzggNy43NzlMNyAyMy45N2w3Ljc3OC03Ljc3OUw3IDguNDE0IDguNDE0IDdsNy43NzggNy43NzhMMjMuOTcxIDd6IiBmaWxsPSIjM0Q0NzU3IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=) no-repeat;background-size:100% 100%;transition:all .3s;border-radius:50%}.ce-image-previewer .image-close:hover{background-color:#e2e6ed}.ce-image-previewer .ce-image-container{position:relative}.ce-image-previewer .ce-image-container img{cursor:move;position:relative}.ce-image-previewer .ce-image-menu{height:50px;position:absolute;bottom:50px;z-index:99;display:flex;align-items:center;justify-content:center}.ce-image-previewer .ce-image-menu i{width:32px;height:32px;margin:0 8px;cursor:pointer;display:inline-block;background-repeat:no-repeat;background-size:100% 100%;transition:all .3s;border-radius:50%}.ce-image-previewer .ce-image-menu i:hover{background-color:#e2e6ed}.ce-image-previewer .ce-image-menu i.zoom-in{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTE0IDE0di00aDJ2NGg0djJoLTR2NGgtMnYtNGgtNHYtMmg0em04Ljc0OSAxMC4xNjNBMTEuOTUyIDExLjk1MiAwIDAxMTUgMjdDOC4zNzMgMjcgMyAyMS42MjcgMyAxNVM4LjM3MyAzIDE1IDNzMTIgNS4zNzMgMTIgMTJjMCAyLjk1NC0xLjA2NyA1LjY1OC0yLjgzNyA3Ljc0OWw0LjkwOCA0LjkwOC0xLjQxNCAxLjQxNC00LjkwOC00LjkwOHpNMTUgMjVjNS41MjMgMCAxMC00LjQ3NyAxMC0xMFMyMC41MjMgNSAxNSA1IDUgOS40NzcgNSAxNXM0LjQ3NyAxMCAxMCAxMHoiIGZpbGw9IiMzRDQ3NTciLz48L3N2Zz4=)}.ce-image-previewer .ce-image-menu i.zoom-out{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIyLjc0OSAyNC4xNjNBMTEuOTUyIDExLjk1MiAwIDAxMTUgMjdDOC4zNzMgMjcgMyAyMS42MjcgMyAxNVM4LjM3MyAzIDE1IDNzMTIgNS4zNzMgMTIgMTJjMCAyLjk1NC0xLjA2NyA1LjY1OC0yLjgzNyA3Ljc0OWw0LjkwOCA0LjkwOC0xLjQxNCAxLjQxNC00LjkwOC00LjkwOHpNMTUgMjVjNS41MjMgMCAxMC00LjQ3NyAxMC0xMFMyMC41MjMgNSAxNSA1IDUgOS40NzcgNSAxNXM0LjQ3NyAxMCAxMCAxMHptLTUtMTFoMTB2MkgxMHYtMnoiIGZpbGw9IiMzRDQ3NTciLz48L3N2Zz4=)}.ce-image-previewer .ce-image-menu i.rotate{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iIzNENDc1NyIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJNMTYgNGM2LjYyNyAwIDEyIDUuMzczIDEyIDEyYTExLjk3IDExLjk3IDAgMDEtNCA4Ljk0NFYyM2gtLjg2QTkuOTY4IDkuOTY4IDAgMDAyNiAxNmMwLTUuNTIzLTQuNDc3LTEwLTEwLTEwUzYgMTAuNDc3IDYgMTZjMCA1LjE4NSAzLjk0NyA5LjQ0OSA5IDkuOTV2Mi4wMDlDOC44NCAyNy40NTEgNCAyMi4yOTEgNCAxNiA0IDkuMzczIDkuMzczIDQgMTYgNHoiIGZpbGwtcnVsZT0ibm9uemVybyIvPjxwYXRoIGQ9Ik0xOS44NzkgMjcuMzI4bDEuNzY3LTYuNzE3IDQuOTUgNC45NXoiLz48L2c+PC9zdmc+)}.ce-image-previewer .ce-image-menu i.original-size{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTQgNGgyNHYyNEg0VjR6bTIgMnYyMGgyMFY2SDZ6bTQgNWgydjEwaC0yVjExem01IDJoMnYyaC0ydi0yem0wIDRoMnYyaC0ydi0yem01LTZoMnYxMGgtMlYxMXoiIGZpbGw9IiMzRDQ3NTciLz48L3N2Zz4=)}.ce-image-previewer .ce-image-menu i.image-download{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTQuNSAxNXYzLjVoMTVWMTVIMjF2NUgzdi01aDEuNXptOC4yMzItMTEuMjI2djkuMTk2bDQuMDUtNC4wNSAxLjA2IDEuMDYtNS44MzQgNS44MzQtNS44MzMtNS44MzMgMS4wNi0xLjA2IDMuOTk4IDMuOTk2VjMuNzc0aDEuNXoiIGZpbGw9IiMzRDQ3NTciLz48L3N2Zz4=)}.ce-contextmenu-container{z-index:9;position:fixed;display:none;padding:4px;overflow-x:hidden;overflow-y:auto;background:#fff;box-shadow:0 2px 12px #38383833;border:1px solid #e2e6ed;border-radius:2px}.ce-contextmenu-content{display:flex;flex-direction:column}.ce-contextmenu-content .ce-contextmenu-sub-item:after{position:absolute;content:\"\";width:16px;height:16px;right:12px;background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJNMCAwaDE2djE2SDB6Ii8+PGcgZmlsbD0iIzc2N0M4NSI+PHBhdGggZD0iTTcgMTIuMjQzbC0uNzA3LS43MDcgNC4yNDMtNC4yNDMuNzA3LjcwN3oiLz48cGF0aCBkPSJNNi4yOTMgNC40NjRMNyAzLjc1NyAxMS4yNDMgOGwtLjcwNy43MDd6Ii8+PC9nPjwvZz48L3N2Zz4=)}.ce-contextmenu-content .ce-contextmenu-item{min-width:140px;padding:0 32px 0 16px;height:30px;display:flex;align-items:center;white-space:nowrap;box-sizing:border-box;cursor:pointer}.ce-contextmenu-content .ce-contextmenu-item.hover{background:rgba(25,55,88,.04)}.ce-contextmenu-content .ce-contextmenu-item span{max-width:300px;font-size:12px;color:#3d4757;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ce-contextmenu-content .ce-contextmenu-item span.ce-shortcut{color:#767c85;height:30px;flex:1;text-align:right;line-height:30px;margin-left:20px}.ce-contextmenu-content .ce-contextmenu-item i{width:16px;height:16px;vertical-align:middle;display:inline-block;background-repeat:no-repeat;background-size:100% 100%;flex-shrink:0;margin-right:8px}.ce-contextmenu-divider{background-color:#e2e6ed;margin:4px 16px;height:1px}.ce-contextmenu-print{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjM0Q0NzU3IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0xMiA0aC0xVjJINXYySDRWMmExIDEgMCAwMTEtMWg2YTEgMSAwIDAxMSAxdjJ6bTAgNXY0YTEgMSAwIDAxLTEgMUg1YTEgMSAwIDAxLTEtMVY5aDF2NGg2VjloMXoiLz48cGF0aCBkPSJNMTIgMTJ2LTFoMlY1SDJ2NmgydjFIMmExIDEgMCAwMS0xLTFWNWExIDEgMCAwMTEtMWgxMmExIDEgMCAwMTEgMXY2YTEgMSAwIDAxLTEgMWgtMnoiLz48cGF0aCBkPSJNMyA4aDEwdjFIM3ptOC0yaDJ2MWgtMnoiLz48L2c+PC9zdmc+)}.ce-contextmenu-image{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSLlm77lsYJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgMTYgMTYiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxzdHlsZT4uc3Qwe2ZpbGw6IzNkNDc1N308L3N0eWxlPjxnIGlkPSJfeDMwXzAt5YWs5YWxX3gyRl8wMuW3peWFt+agj194MkZf5o+S5YWl5Zu+54mHLTE2cHgtIj48ZyBpZD0iR3JvdXAtMTkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEgMSkiPjxwYXRoIGlkPSJDb21iaW5lZC1TaGFwZSIgY2xhc3M9InN0MCIgZD0iTTEgMGgxMmMuNiAwIDEgLjQgMSAxdjExYzAgLjYtLjQgMS0xIDFIMWMtLjYgMC0xLS40LTEtMVYxYzAtLjYuNC0xIDEtMXptMCAxdjExaDEyVjFIMXoiLz48Y2lyY2xlIGlkPSLmpK3lnIblvaIiIGNsYXNzPSJzdDAiIGN4PSIxMCIgY3k9IjQiIHI9IjEiLz48cGF0aCBpZD0iUGF0aCIgY2xhc3M9InN0MCIgZD0iTTguNSAxMS4ybC00LTQuMUwxIDEwLjdWOS4yYzEuNy0xLjYgMi43LTIuNSAzLTIuOC40LS41LjctLjQgMSAwTDguNSAxMCAxMSA3LjNjLjQtLjUuNi0uNSAxLS4xbDIgMi44djEuNWwtMi41LTMuNC0zIDMuMXoiLz48L2c+PC9nPjwvc3ZnPg==)}.ce-contextmenu-image-change{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDQpIiBmaWxsPSIjM0Q0NzU3Ij48Y2lyY2xlIGZpbGwtcnVsZT0ibm9uemVybyIgY3g9IjMiIGN5PSIxIiByPSIxIi8+PHBhdGggZD0iTTcuNDczIDguMjIzTDMuNDcgNC4xMDcgMCA3LjY2N3YtMS41QzEuNzE1IDQuNiAyLjcwNyAzLjY2NCAyLjk3NSAzLjM1OGMuNDAyLS40NTcuNjUxLS4zOSAxLjA0MiAwTDcuNDczIDcgOS45NiA0LjM0OWMuNDE0LS40NjIuNjItLjQ2MiAxLjAxMS0uMDcxTDEzIDcuMDZ2MS41bC0yLjUxLTMuNDEtMy4wMTcgMy4wNzJ6Ii8+PC9nPjxwYXRoIGQ9Ik02IDEuNUgxLjV2MTJoMTN2LTRWMTNhLjUuNSAwIDAxLS41LjVIMmEuNS41IDAgMDEtLjUtLjVWMmEuNS41IDAgMDEuNS0uNWg0em04LjUgOFY2bC0uNS41aDFsLS41LS41djMuNXpNNiAxLjVoNEw5LjUgMXYxbC41LS41SDZ6IiBzdHJva2U9IiMzRDQ3NTciLz48cGF0aCBkPSJNMTMuMDg1IDEuMzE2bC0zLjgxNCA0YTEgMSAwIDAwMS40NTggMS4zNjhsMy44MTUtNGExIDEgMCAxMC0xLjQ1OS0xLjM2OHoiIGZpbGw9IiMzRDQ3NTciIGZpbGwtcnVsZT0ibm9uemVybyIvPjwvZz48L3N2Zz4=)}.ce-contextmenu-insert-row-col{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBzdHJva2U9IiMzRDQ3NTciIGQ9Ik04LjUgNS41aDZ2NGgtNnoiLz48cGF0aCBmaWxsPSIjM0Q0NzU3IiBkPSJNNCA3djFoMlY3em0tMyAuNUw0IDV2NXpNMSAxaDEydjFIMXptMCAxMmgxMnYxSDF6Ii8+PC9nPjwvc3ZnPg==)}.ce-contextmenu-insert-top-row{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBmaWxsPSIjM0Q0NzU3IiBkPSJNOCA1SDd2M2gxem0tLjUtM0wxMCA1SDV6Ii8+PHJlY3Qgc3Ryb2tlPSIjM0Q0NzU3IiB4PSIxLjUiIHk9IjEwLjUiIHdpZHRoPSIxMiIgaGVpZ2h0PSIzIiByeD0iMSIvPjwvZz48L3N2Zz4=)}.ce-contextmenu-insert-bottom-row{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBmaWxsPSIjM0Q0NzU3IiBkPSJNNyAxMWgxVjhIN3ptLjUgM0w1IDExaDV6Ii8+PHJlY3Qgc3Ryb2tlPSIjM0Q0NzU3IiB4PSIxLjUiIHk9IjIuNSIgd2lkdGg9IjEyIiBoZWlnaHQ9IjMiIHJ4PSIxIi8+PC9nPjwvc3ZnPg==)}.ce-contextmenu-insert-left-col{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBmaWxsPSIjM0Q0NzU3IiBkPSJNMTEgN3YxaDNWN3ptLTMgLjVMMTEgNXY1eiIvPjxyZWN0IHN0cm9rZT0iIzNENDc1NyIgdHJhbnNmb3JtPSJyb3RhdGUoOTAgNCA3LjUpIiB4PSItMiIgeT0iNiIgd2lkdGg9IjEyIiBoZWlnaHQ9IjMiIHJ4PSIxIi8+PC9nPjwvc3ZnPg==)}.ce-contextmenu-insert-right-col{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBmaWxsPSIjM0Q0NzU3IiBkPSJNNSA4VjdIMnYxem0zLS41TDUgMTBWNXoiLz48cmVjdCBzdHJva2U9IiMzRDQ3NTciIHRyYW5zZm9ybT0icm90YXRlKDkwIDEyIDcuNSkiIHg9IjYiIHk9IjYiIHdpZHRoPSIxMiIgaGVpZ2h0PSIzIiByeD0iMSIvPjwvZz48L3N2Zz4=)}.ce-contextmenu-delete-row-col{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBzdHJva2U9IiM5MjlBQTgiIGQ9Ik04LjUgNi41aDZ2MmgtNnoiLz48cGF0aCBmaWxsPSIjM0Q0NzU3IiBkPSJNMiAxMmgxMXYxSDJ6TTIgMmgxMXYxSDJ6bS42MyAzTDcgOS4zNWwtLjYzNS42NUwyIDUuNjN6Ii8+PHBhdGggZmlsbD0iIzNENDc1NyIgZD0iTTIgOS4zNjNMNi4zNTUgNSA3IDUuNzA3IDIuNjk1IDEweiIvPjwvZz48L3N2Zz4=)}.ce-contextmenu-delete-row{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBzdHJva2U9IiM5MjlBQTgiIGQ9Ik04LjUgNS41aDZ2NGgtNnoiLz48cGF0aCBmaWxsPSIjM0Q0NzU3IiBkPSJNMSAxM2gxMnYxSDF6TTEgMWgxMnYxSDF6bTAgNGgxdjFIMXptMSAxaDF2MUgyem0xIDFoMXYxSDN6bTEtMWgxdjFINHptMS0xaDF2MUg1ek00IDhoMXYxSDR6TTIgOGgxdjFIMnptMyAxaDF2MUg1ek0xIDloMXYxSDF6Ii8+PC9nPjwvc3ZnPg==)}.ce-contextmenu-delete-col{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBzdHJva2U9IiM5MjlBQTgiIGQ9Ik01LjUgNy41di02aDR2NnoiLz48cGF0aCBmaWxsPSIjM0Q0NzU3IiBkPSJNMTMgMTVWM2gxdjEyek0xIDE1VjNoMXYxMnptNCAwdi0xaDF2MXptMS0xdi0xaDF2MXptMS0xdi0xaDF2MXptLTEtMXYtMWgxdjF6bS0xLTF2LTFoMXYxem0zIDF2LTFoMXYxem0wIDJ2LTFoMXYxem0xLTN2LTFoMXYxem0wIDR2LTFoMXYxeiIvPjwvZz48L3N2Zz4=)}.ce-contextmenu-delete-table{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iIzNENDc1NyIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJNMTQgMTNoLTF2LTNIMnYzSDF2LTNhMSAxIDAgMDExLTFoMTFhMSAxIDAgMDExIDF2M3oiIGZpbGwtcnVsZT0ibm9uemVybyIvPjxwYXRoIGQ9Ik01LjYyNSAyTDEwIDYuMzc1IDkuMzc1IDcgNSAyLjYyNXoiLz48cGF0aCBkPSJNNSA2LjM3NUw5LjM3NSAybC42MjUuNjI1TDUuNjI1IDd6Ii8+PC9nPjwvc3ZnPg==)}.ce-contextmenu-merge-cell{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iIzNENDc1NyIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJNNiAxdjFIMnYxMWg0djFIMmExIDEgMCAwMS0xLTFWMmExIDEgMCAwMTEtMWg0em0zIDBoNGExIDEgMCAwMTEgMXYxMWExIDEgMCAwMS0xIDFIOXYtMWg0VjJIOVYxeiIvPjxwYXRoIGZpbGwtcnVsZT0ibm9uemVybyIgZD0iTTYgMWgxdjRINnptMiAwaDF2NEg4eiIvPjxwYXRoIGQ9Ik04IDcuNUwxMCA2djN6bS0xIDBMNSA2djN6Ii8+PHBhdGggZD0iTTkgN2gzdjFIOXpNMyA3aDN2MUgzeiIvPjxwYXRoIGZpbGwtcnVsZT0ibm9uemVybyIgZD0iTTggMTBoMXY0SDh6bS0yIDBoMXY0SDZ6Ii8+PC9nPjwvc3ZnPg==)}.ce-contextmenu-merge-cancel-cell{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iIzNENDc1NyIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBkPSJNNiAxdjFIMnYxMWg0djFIMmExIDEgMCAwMS0xLTFWMmExIDEgMCAwMTEtMWg0em0zIDBoNGExIDEgMCAwMTEgMXYxMWExIDEgMCAwMS0xIDFIOXYtMWg0VjJIOVYxeiIvPjxwYXRoIGZpbGwtcnVsZT0ibm9uemVybyIgZD0iTTYgMWgxdjRINnptMiAwaDF2NEg4eiIvPjxwYXRoIGQ9Ik0zIDcuNUw1IDZ2M3ptOSAwTDEwIDZ2M3oiLz48cGF0aCBkPSJNNCA3aDN2MUg0em00IDBoM3YxSDh6Ii8+PHBhdGggZmlsbC1ydWxlPSJub256ZXJvIiBkPSJNOCAxMGgxdjRIOHptLTIgMGgxdjRINnoiLz48L2c+PC9zdmc+)}.ce-contextmenu-vertical-align{background-image:url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjE2IiB2aWV3Qm94PSIwIDAgMTYgMTYiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMiAxM2gxMnYxSDJ6bTAtM2g4djFIMnptMC0zaDEydjFIMnptMC02aDEydjFIMnptMCAzaDh2MUgyeiIgZmlsbD0iIzNkNDc1NyIgZmlsbC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.ce-contextmenu-vertical-align-top{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTggOEg3djZoMXptLS41LTNMMTAgOEg1ek0yIDNoMTF2MUgyeiIgZmlsbD0iIzNENDc1NyIgZmlsbC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.ce-contextmenu-vertical-align-middle{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOCAxMkg3djNoMXptLS41LTNsMi41IDNINXpNNyAzaDFWMEg3em0uNSAzTDUgM2g1ek0yIDdoMTF2MUgyeiIgZmlsbD0iIzNENDc1NyIgZmlsbC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.ce-contextmenu-vertical-align-bottom{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTcgOWgxVjNIN3ptLjUgM0w1IDloNXpNMiAxM2gxMXYxSDJ6IiBmaWxsPSIjM0Q0NzU3IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48L3N2Zz4=)}.ce-contextmenu-border-all{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIuNSAzYS41LjUgMCAwMS41LS41aDExYS41LjUgMCAwMS41LjV2MTFhLjUuNSAwIDAxLS41LjVIM2EuNS41IDAgMDEtLjUtLjVWM3oiIHN0cm9rZT0iIzNENDc1NyIvPjxwYXRoIGZpbGw9IiMzRDQ3NTciIGQ9Ik0zIDhoMTF2MUgzeiIvPjxwYXRoIGZpbGw9IiMzRDQ3NTciIGQ9Ik05IDN2MTFIOFYzeiIvPjwvc3ZnPg==)}.ce-contextmenu-border-empty{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMyAzaC0xVjJoMWExIDEgMCAwMTEgMXYxaC0xVjN6bS0zLTF2MUg4LjV2MmgtMVYzSDZWMmg0ek00IDJ2MUgzdjFIMlYzYTEgMSAwIDAxMS0xaDF6TTIgNmgxdjEuNWgydjFIM1YxMEgyVjZ6bTAgNmgxdjFoMXYxSDNhMSAxIDAgMDEtMS0xdi0xem00IDJ2LTFoMS41di0yaDF2MkgxMHYxSDZ6bTYgMHYtMWgxdi0xaDF2MWExIDEgMCAwMS0xIDFoLTF6bTItNGgtMVY4LjVoLTJ2LTFoMlY2aDF2NHpNOC41IDcuNXYtMWgtMXYxaC0xdjFoMXYxaDF2LTFoMXYtMWgtMXoiIGZpbGw9IiNBQUFDQjAiLz48L3N2Zz4=)}.ce-contextmenu-border-external{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIuNSAzYS41LjUgMCAwMS41LS41aDExYS41LjUgMCAwMS41LjV2MTFhLjUuNSAwIDAxLS41LjVIM2EuNS41IDAgMDEtLjUtLjVWM3oiIHN0cm9rZT0iIzNENDc1NyIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOSA1VjNIOHYyaDF6bTAgOXYtMkg4djJoMXpNNSA4SDN2MWgyVjh6bTkgMGgtMnYxaDJWOHpNOSA3djFoMXYxSDl2MUg4VjlIN1Y4aDFWN2gxeiIgZmlsbD0iI0FBQUNCMCIvPjwvc3ZnPg==)}.ce-contextmenu-border-td{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIuNSAzYS41LjUgMCAwMS41LS41aDExYS41LjUgMCAwMS41LjV2MTFhLjUuNSAwIDAxLS41LjVIM2EuNS41IDAgMDEtLjUtLjVWM3oiIHN0cm9rZT0iI0FBQUNCMCIvPjxwYXRoIHN0cm9rZT0iIzNENDc1NyIgZD0iTTguNSAyLjUgdjYgaC02Ii8+PC9zdmc+)}.ce-contextmenu-border-td-top{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIuNSAzYS41LjUgMCAwMS41LS41aDExYS41LjUgMCAwMS41LjV2MTFhLjUuNSAwIDAxLS41LjVIM2EuNS41IDAgMDEtLjUtLjVWM3oiIHN0cm9rZT0iI0FBQUNCMCIvPjxwYXRoIHN0cm9rZT0iIzNENDc1NyIgc3Ryb2tlLXdpZHRoPSIyIiBkPSJNMi41IDMgaDEyIi8+PC9zdmc+)}.ce-contextmenu-border-td-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIuNSAzYS41LjUgMCAwMS41LS41aDExYS41LjUgMCAwMS41LjV2MTFhLjUuNSAwIDAxLS41LjVIM2EuNS41IDAgMDEtLjUtLjVWM3oiIHN0cm9rZT0iI0FBQUNCMCIvPjxwYXRoIHN0cm9rZT0iIzNENDc1NyIgc3Ryb2tlLXdpZHRoPSIyIiBkPSJNMyAzIHYxMSIvPjwvc3ZnPg==)}.ce-contextmenu-border-td-bottom{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIuNSAzYS41LjUgMCAwMS41LS41aDExYS41LjUgMCAwMS41LjV2MTFhLjUuNSAwIDAxLS41LjVIM2EuNS41IDAgMDEtLjUtLjVWM3oiIHN0cm9rZT0iI0FBQUNCMCIvPjxwYXRoIHN0cm9rZT0iIzNENDc1NyIgc3Ryb2tlLXdpZHRoPSIyIiBkPSJNMi41IDE0IGgxMiIvPjwvc3ZnPg==)}.ce-contextmenu-border-td-right{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIuNSAzYS41LjUgMCAwMS41LS41aDExYS41LjUgMCAwMS41LjV2MTFhLjUuNSAwIDAxLS41LjVIM2EuNS41IDAgMDEtLjUtLjVWM3oiIHN0cm9rZT0iI0FBQUNCMCIvPjxwYXRoIHN0cm9rZT0iIzNENDc1NyIgc3Ryb2tlLXdpZHRoPSIyIiBkPSJNMTQgMyB2MTEiLz48L3N2Zz4=)}.ce-contextmenu-border-td-forward{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIuNSAzYS41LjUgMCAwMS41LS41aDExYS41LjUgMCAwMS41LjV2MTFhLjUuNSAwIDAxLS41LjVIM2EuNS41IDAgMDEtLjUtLjVWM3oiIHN0cm9rZT0iI0FBQUNCMCIgLz48cGF0aCBzdHJva2U9IiMzRDQ3NTciIGQ9Ik0xNCAzIGwtMTEgMTEiIC8+PC9zdmc+)}.ce-contextmenu-border-td-back{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIuNSAzYS41LjUgMCAwMS41LS41aDExYS41LjUgMCAwMS41LjV2MTFhLjUuNSAwIDAxLS41LjVIM2EuNS41IDAgMDEtLjUtLjVWM3oiIHN0cm9rZT0iI0FBQUNCMCIgLz48cGF0aCBzdHJva2U9IiMzRDQ3NTciIGQ9Ik0zIDMgbDExIDExIiAvPjwvc3ZnPg==)}.ce-hyperlink-popup{background:#fff;box-shadow:0 2px 12px #626b8433;border-radius:2px;color:#3d4757;padding:12px 16px;position:absolute;z-index:1;text-align:center;display:none}.ce-hyperlink-popup a{min-width:100px;max-width:300px;font-size:12px;display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer;text-decoration:none;border-bottom-width:1px;border-bottom-style:solid;color:#00f}.ce-zone-indicator>div{padding:3px 6px;color:#000;font-size:12px;background:rgb(218 231 252);position:absolute;transform-origin:0 0}.ce-zone-indicator-border__top,.ce-zone-indicator-border__bottom,.ce-zone-indicator-border__left,.ce-zone-indicator-border__right{display:block;position:absolute;z-index:0}.ce-zone-indicator-border__top{border-top:2px dashed rgb(238,238,238)}.ce-zone-indicator-border__bottom{border-top:2px dashed rgb(238,238,238);width:100%}.ce-zone-indicator-border__left{border-left:2px dashed rgb(238,238,238)}.ce-zone-indicator-border__right{border-right:2px dashed rgb(238,238,238)}.ce-zone-tip{display:none;align-items:center;height:30px;white-space:nowrap;position:fixed;opacity:.9;background-color:#000;padding:0 5px;border-radius:4px;z-index:9;transition:all .3s;outline:none;user-select:none;pointer-events:none;transform:translate(10px,10px)}.ce-zone-tip.show{display:flex}.ce-zone-tip span{color:#fff;font-size:12px}.ce-inputarea{width:100px;height:30px;min-width:0;min-height:0;margin:0;padding:0;left:0;right:0;letter-spacing:0;font-size:12px;position:absolute;z-index:-1;outline:none;resize:none;border:none;overflow:hidden;color:transparent;user-select:none;caret-color:transparent;background-color:transparent}.ce-cursor{width:1px;height:20px;left:0;right:0;position:absolute;outline:none;background-color:#000;pointer-events:none}.ce-cursor.ce-cursor--animation{animation-duration:1s;animation-iteration-count:infinite;animation-name:cursorAnimation}@keyframes cursorAnimation{0%{opacity:1}13%{opacity:0}50%{opacity:0}63%{opacity:1}to{opacity:1}}.ce-float-image{position:absolute;opacity:.5;pointer-events:none}')),document.head.appendChild(e)}}catch(i){console.error(\"vite-plugin-css-injected-by-js\",i)}})();\nvar index = \"\";\nconst version = \"0.9.94\";\nvar MaxHeightRatio;\n(function(MaxHeightRatio2) {\n  MaxHeightRatio2[\"HALF\"] = \"half\";\n  MaxHeightRatio2[\"ONE_THIRD\"] = \"one-third\";\n  MaxHeightRatio2[\"QUARTER\"] = \"quarter\";\n})(MaxHeightRatio || (MaxHeightRatio = {}));\nvar NumberType;\n(function(NumberType2) {\n  NumberType2[\"ARABIC\"] = \"arabic\";\n  NumberType2[\"CHINESE\"] = \"chinese\";\n})(NumberType || (NumberType = {}));\nvar ImageDisplay;\n(function(ImageDisplay2) {\n  ImageDisplay2[\"INLINE\"] = \"inline\";\n  ImageDisplay2[\"BLOCK\"] = \"block\";\n  ImageDisplay2[\"SURROUND\"] = \"surround\";\n  ImageDisplay2[\"FLOAT_TOP\"] = \"float-top\";\n  ImageDisplay2[\"FLOAT_BOTTOM\"] = \"float-bottom\";\n})(ImageDisplay || (ImageDisplay = {}));\nvar LocationPosition;\n(function(LocationPosition2) {\n  LocationPosition2[\"BEFORE\"] = \"before\";\n  LocationPosition2[\"AFTER\"] = \"after\";\n})(LocationPosition || (LocationPosition = {}));\nconst ZERO = \"\\u200B\";\nconst WRAP = \"\\n\";\nconst NBSP = \" \";\nconst NON_BREAKING_SPACE = \"&nbsp;\";\nconst PUNCTUATION_LIST = [\n  \"\\xB7\",\n  \"\\u3001\",\n  \":\",\n  \"\\uFF1A\",\n  \",\",\n  \"\\uFF0C\",\n  \".\",\n  \"\\u3002\",\n  \";\",\n  \"\\uFF1B\",\n  \"?\",\n  \"\\uFF1F\",\n  \"!\",\n  \"\\uFF01\"\n];\nconst maxHeightRadioMapping = {\n  [MaxHeightRatio.HALF]: 1 / 2,\n  [MaxHeightRatio.ONE_THIRD]: 1 / 3,\n  [MaxHeightRatio.QUARTER]: 1 / 4\n};\nconst LETTER_CLASS = {\n  ENGLISH: \"A-Za-z\",\n  SPANISH: \"A-Za-z\\xC1\\xC9\\xCD\\xD3\\xDA\\xE1\\xE9\\xED\\xF3\\xFA\\xD1\\xF1\\xDC\\xFC\",\n  FRENCH: \"A-Za-z\\xC0\\xC2\\xC7\\xE0\\xE2\\xE7\\xC9\\xE9\\xC8\\xE8\\xCA\\xEA\\xCB\\xEB\\xCE\\xEE\\xCF\\xEF\\xD4\\xF4\\xD9\\xF9\\xDB\\xFB\\u0178\\xFF\",\n  GERMAN: \"A-Za-z\\xC4\\xE4\\xD6\\xF6\\xDC\\xFC\\xDF\",\n  RUSSIAN: \"\\u0410-\\u042F\\u0430-\\u044F\\u0401\\u0451\",\n  PORTUGUESE: \"A-Za-z\\xC1\\xC9\\xCD\\xD3\\xDA\\xE1\\xE9\\xED\\xF3\\xFA\\xC3\\xD5\\xE3\\xF5\\xC7\\xE7\",\n  ITALIAN: \"A-Za-z\\xC0\\xE0\\xC8\\xE8\\xC9\\xE9\\xCC\\xEC\\xCD\\xED\\xCE\\xEE\\xD3\\xF3\\xD2\\xF2\\xD9\\xF9\",\n  DUTCH: \"A-Za-z\\xC0\\xE0\\xC1\\xE1\\xC2\\xE2\\xC4\\xE4\\xC8\\xE8\\xC9\\xE9\\xCA\\xEA\\xCB\\xEB\\xCC\\xEC\\xCD\\xED\\xCE\\xEE\\xCF\\xEF\\xD3\\xF3\\xD2\\xF2\\xD4\\xF4\\xD6\\xF6\\xD9\\xF9\\xDB\\xFB\\xDC\\xFC\",\n  SWEDISH: \"A-Za-z\\xC5\\xE5\\xC4\\xE4\\xD6\\xF6\",\n  GREEK: \"\\u0391\\u03B1\\u0392\\u03B2\\u0393\\u03B3\\u0394\\u03B4\\u0395\\u03B5\\u0396\\u03B6\\u0397\\u03B7\\u0398\\u03B8\\u0399\\u03B9\\u039A\\u03BA\\u039B\\u03BB\\u039C\\u03BC\\u039D\\u03BD\\u039E\\u03BE\\u039F\\u03BF\\u03A0\\u03C0\\u03A1\\u03C1\\u03A3\\u03C3\\u03C2\\u03A4\\u03C4\\u03A5\\u03C5\\u03A6\\u03C6\\u03A7\\u03C7\\u03A8\\u03C8\\u03A9\\u03C9\"\n};\nconst METRICS_BASIS_TEXT = \"\\u65E5\";\nvar RowFlex;\n(function(RowFlex2) {\n  RowFlex2[\"LEFT\"] = \"left\";\n  RowFlex2[\"CENTER\"] = \"center\";\n  RowFlex2[\"RIGHT\"] = \"right\";\n  RowFlex2[\"ALIGNMENT\"] = \"alignment\";\n  RowFlex2[\"JUSTIFY\"] = \"justify\";\n})(RowFlex || (RowFlex = {}));\nconst NUMBER_LIKE_REG = /[0-9.]/;\nconst SURROGATE_PAIR_REG = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/;\nconst EMOJI_REG = /[#*0-9]\\uFE0F?\\u20E3|[\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23ED-\\u23EF\\u23F1\\u23F2\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB\\u25FC\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692\\u2694-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A7\\u26AA\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C8\\u26CF\\u26D1\\u26E9\\u26F0-\\u26F5\\u26F7\\u26F8\\u26FA\\u2702\\u2708\\u2709\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u27A1\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B55\\u3030\\u303D\\u3297\\u3299]\\uFE0F?|[\\u261D\\u270C\\u270D](?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?|[\\u270A\\u270B](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u2693\\u26A1\\u26AB\\u26C5\\u26CE\\u26D4\\u26EA\\u26FD\\u2705\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2795-\\u2797\\u27B0\\u27BF\\u2B50]|\\u26D3\\uFE0F?(?:\\u200D\\uD83D\\uDCA5)?|\\u26F9(?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\u2764\\uFE0F?(?:\\u200D(?:\\uD83D\\uDD25|\\uD83E\\uDE79))?|\\uD83C(?:[\\uDC04\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDE02\\uDE37\\uDF21\\uDF24-\\uDF2C\\uDF36\\uDF7D\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E\\uDF9F\\uDFCD\\uDFCE\\uDFD4-\\uDFDF\\uDFF5\\uDFF7]\\uFE0F?|[\\uDF85\\uDFC2\\uDFC7](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDFC4\\uDFCA](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDFCB\\uDFCC](?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF43\\uDF45-\\uDF4A\\uDF4C-\\uDF7C\\uDF7E-\\uDF84\\uDF86-\\uDF93\\uDFA0-\\uDFC1\\uDFC5\\uDFC6\\uDFC8\\uDFC9\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF8-\\uDFFF]|\\uDDE6\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF]|\\uDDE7\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF]|\\uDDE8\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF]|\\uDDE9\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF]|\\uDDEA\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA]|\\uDDEB\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7]|\\uDDEC\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE]|\\uDDED\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA]|\\uDDEE\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9]|\\uDDEF\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5]|\\uDDF0\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF]|\\uDDF1\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE]|\\uDDF2\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF]|\\uDDF3\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF]|\\uDDF4\\uD83C\\uDDF2|\\uDDF5\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE]|\\uDDF6\\uD83C\\uDDE6|\\uDDF7\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC]|\\uDDF8\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF]|\\uDDF9\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF]|\\uDDFA\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF]|\\uDDFB\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA]|\\uDDFC\\uD83C[\\uDDEB\\uDDF8]|\\uDDFD\\uD83C\\uDDF0|\\uDDFE\\uD83C[\\uDDEA\\uDDF9]|\\uDDFF\\uD83C[\\uDDE6\\uDDF2\\uDDFC]|\\uDF44(?:\\u200D\\uD83D\\uDFEB)?|\\uDF4B(?:\\u200D\\uD83D\\uDFE9)?|\\uDFC3(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDFF3\\uFE0F?(?:\\u200D(?:\\u26A7\\uFE0F?|\\uD83C\\uDF08))?|\\uDFF4(?:\\u200D\\u2620\\uFE0F?|\\uDB40\\uDC67\\uDB40\\uDC62\\uDB40(?:\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F)?)|\\uD83D(?:[\\uDC3F\\uDCFD\\uDD49\\uDD4A\\uDD6F\\uDD70\\uDD73\\uDD76-\\uDD79\\uDD87\\uDD8A-\\uDD8D\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA\\uDECB\\uDECD-\\uDECF\\uDEE0-\\uDEE5\\uDEE9\\uDEF0\\uDEF3]\\uFE0F?|[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDC8F\\uDC91\\uDCAA\\uDD7A\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDC6E\\uDC70\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4\\uDEB5](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD74\\uDD90](?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDC00-\\uDC07\\uDC09-\\uDC14\\uDC16-\\uDC25\\uDC27-\\uDC3A\\uDC3C-\\uDC3E\\uDC40\\uDC44\\uDC45\\uDC51-\\uDC65\\uDC6A\\uDC79-\\uDC7B\\uDC7D-\\uDC80\\uDC84\\uDC88-\\uDC8E\\uDC90\\uDC92-\\uDCA9\\uDCAB-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDDA4\\uDDFB-\\uDE2D\\uDE2F-\\uDE34\\uDE37-\\uDE41\\uDE43\\uDE44\\uDE48-\\uDE4A\\uDE80-\\uDEA2\\uDEA4-\\uDEB3\\uDEB7-\\uDEBF\\uDEC1-\\uDEC5\\uDED0-\\uDED2\\uDED5-\\uDED7\\uDEDC-\\uDEDF\\uDEEB\\uDEEC\\uDEF4-\\uDEFC\\uDFE0-\\uDFEB\\uDFF0]|\\uDC08(?:\\u200D\\u2B1B)?|\\uDC15(?:\\u200D\\uD83E\\uDDBA)?|\\uDC26(?:\\u200D(?:\\u2B1B|\\uD83D\\uDD25))?|\\uDC3B(?:\\u200D\\u2744\\uFE0F?)?|\\uDC41\\uFE0F?(?:\\u200D\\uD83D\\uDDE8\\uFE0F?)?|\\uDC68(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDC68\\uDC69]\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDC69(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?[\\uDC68\\uDC69]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?|\\uDC69\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?))|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDC6F(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\uDD75(?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\uDE2E(?:\\u200D\\uD83D\\uDCA8)?|\\uDE35(?:\\u200D\\uD83D\\uDCAB)?|\\uDE36(?:\\u200D\\uD83C\\uDF2B\\uFE0F?)?|\\uDE42(?:\\u200D[\\u2194\\u2195]\\uFE0F?)?|\\uDEB6(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?)|\\uD83E(?:[\\uDD0C\\uDD0F\\uDD18-\\uDD1F\\uDD30-\\uDD34\\uDD36\\uDD77\\uDDB5\\uDDB6\\uDDBB\\uDDD2\\uDDD3\\uDDD5\\uDEC3-\\uDEC5\\uDEF0\\uDEF2-\\uDEF8](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD\\uDDCF\\uDDD4\\uDDD6-\\uDDDD](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDDDE\\uDDDF](?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD0D\\uDD0E\\uDD10-\\uDD17\\uDD20-\\uDD25\\uDD27-\\uDD2F\\uDD3A\\uDD3F-\\uDD45\\uDD47-\\uDD76\\uDD78-\\uDDB4\\uDDB7\\uDDBA\\uDDBC-\\uDDCC\\uDDD0\\uDDE0-\\uDDFF\\uDE70-\\uDE7C\\uDE80-\\uDE88\\uDE90-\\uDEBD\\uDEBF-\\uDEC2\\uDECE-\\uDEDB\\uDEE0-\\uDEE8]|\\uDD3C(?:\\u200D[\\u2640\\u2642]\\uFE0F?|\\uD83C[\\uDFFB-\\uDFFF])?|\\uDDCE(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDDD1(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1|\\uDDD1\\u200D\\uD83E\\uDDD2(?:\\u200D\\uD83E\\uDDD2)?|\\uDDD2(?:\\u200D\\uD83E\\uDDD2)?))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?))?|\\uDEF1(?:\\uD83C(?:\\uDFFB(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFC-\\uDFFF])?|\\uDFFC(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])?|\\uDFFD(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])?|\\uDFFE(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])?|\\uDFFF(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFE])?))?)/g;\nconst UNICODE_SYMBOL_REG = new RegExp(`${EMOJI_REG.source}|${SURROGATE_PAIR_REG.source}`, \"g\");\nconst PUNCTUATION_REG = /[、，。？！；：……「」“”‘’*（）【】〔〕〖〗〘〙〚〛《》———﹝﹞–—\\\\/·.,!?;:`~<>()[\\]{}'\"|]/;\nconst START_LINE_BREAK_REG = new RegExp(`^[${ZERO}\n]`);\nfunction debounce(func, delay) {\n  let timer;\n  return function(...args) {\n    if (timer) {\n      window.clearTimeout(timer);\n    }\n    timer = window.setTimeout(() => {\n      func.apply(this, args);\n    }, delay);\n  };\n}\nfunction throttle(func, delay) {\n  let lastExecTime = 0;\n  let timer;\n  return function(...args) {\n    const currentTime = Date.now();\n    if (currentTime - lastExecTime >= delay) {\n      window.clearTimeout(timer);\n      func.apply(this, args);\n      lastExecTime = currentTime;\n    } else {\n      window.clearTimeout(timer);\n      timer = window.setTimeout(() => {\n        func.apply(this, args);\n        lastExecTime = currentTime;\n      }, delay);\n    }\n  };\n}\nfunction deepCloneOmitKeys(obj, omitKeys) {\n  if (!obj || typeof obj !== \"object\") {\n    return obj;\n  }\n  let newObj = {};\n  if (Array.isArray(obj)) {\n    newObj = obj.map((item) => deepCloneOmitKeys(item, omitKeys));\n  } else {\n    Object.keys(obj).forEach((key) => {\n      if (omitKeys.includes(key))\n        return;\n      return newObj[key] = deepCloneOmitKeys(obj[key], omitKeys);\n    });\n  }\n  return newObj;\n}\nfunction deepClone(obj) {\n  if (!obj || typeof obj !== \"object\") {\n    return obj;\n  }\n  let newObj = {};\n  if (Array.isArray(obj)) {\n    newObj = obj.map((item) => deepClone(item));\n  } else {\n    Object.keys(obj).forEach((key) => {\n      return newObj[key] = deepClone(obj[key]);\n    });\n  }\n  return newObj;\n}\nfunction isBody(node) {\n  return node && node.nodeType === 1 && node.tagName.toLowerCase() === \"body\";\n}\nfunction findParent(node, filterFn, includeSelf) {\n  if (node && !isBody(node)) {\n    node = includeSelf ? node : node.parentNode;\n    while (node) {\n      if (!filterFn || filterFn(node) || isBody(node)) {\n        return filterFn && !filterFn(node) && isBody(node) ? null : node;\n      }\n      node = node.parentNode;\n    }\n  }\n  return null;\n}\nfunction getUUID() {\n  function S4() {\n    return ((1 + Math.random()) * 65536 | 0).toString(16).substring(1);\n  }\n  return S4() + S4() + \"-\" + S4() + \"-\" + S4() + \"-\" + S4() + \"-\" + S4() + S4() + S4();\n}\nfunction splitText(text) {\n  const data2 = [];\n  if (Intl.Segmenter) {\n    const segmenter = new Intl.Segmenter();\n    const segments = segmenter.segment(text);\n    for (const { segment } of segments) {\n      data2.push(segment);\n    }\n  } else {\n    const symbolMap = /* @__PURE__ */ new Map();\n    for (const match of text.matchAll(UNICODE_SYMBOL_REG)) {\n      symbolMap.set(match.index, match[0]);\n    }\n    let t = 0;\n    while (t < text.length) {\n      const symbol = symbolMap.get(t);\n      if (symbol) {\n        data2.push(symbol);\n        t += symbol.length;\n      } else {\n        data2.push(text[t]);\n        t++;\n      }\n    }\n  }\n  return data2;\n}\nfunction downloadFile(href, fileName) {\n  const a = document.createElement(\"a\");\n  a.href = href;\n  a.download = fileName;\n  a.click();\n}\nfunction threeClick$1(dom, fn) {\n  nClickEvent(3, dom, fn);\n}\nfunction nClickEvent(n, dom, fn) {\n  let count = 0;\n  let lastTime = 0;\n  const handler = function(evt) {\n    const currentTime = new Date().getTime();\n    count = currentTime - lastTime < 300 ? count + 1 : 0;\n    lastTime = new Date().getTime();\n    if (count >= n - 1) {\n      fn(evt);\n      count = 0;\n    }\n  };\n  dom.addEventListener(\"click\", handler);\n}\nfunction isObject(type) {\n  return Object.prototype.toString.call(type) === \"[object Object]\";\n}\nfunction isArray(type) {\n  return Array.isArray(type);\n}\nfunction mergeObject(source, target) {\n  if (isObject(source) && isObject(target)) {\n    const objectTarget = target;\n    for (const [key, val] of Object.entries(source)) {\n      if (!objectTarget[key]) {\n        objectTarget[key] = val;\n      } else {\n        objectTarget[key] = mergeObject(val, objectTarget[key]);\n      }\n    }\n  } else if (isArray(source) && isArray(target)) {\n    target.push(...source);\n  }\n  return target;\n}\nfunction nextTick(fn) {\n  setTimeout(() => {\n    fn();\n  }, 0);\n}\nfunction convertNumberToChinese(num) {\n  const chineseNum = [\n    \"\\u96F6\",\n    \"\\u4E00\",\n    \"\\u4E8C\",\n    \"\\u4E09\",\n    \"\\u56DB\",\n    \"\\u4E94\",\n    \"\\u516D\",\n    \"\\u4E03\",\n    \"\\u516B\",\n    \"\\u4E5D\"\n  ];\n  const chineseUnit = [\n    \"\",\n    \"\\u5341\",\n    \"\\u767E\",\n    \"\\u5343\",\n    \"\\u4E07\",\n    \"\\u5341\",\n    \"\\u767E\",\n    \"\\u5343\",\n    \"\\u4EBF\",\n    \"\\u5341\",\n    \"\\u767E\",\n    \"\\u5343\",\n    \"\\u4E07\",\n    \"\\u5341\",\n    \"\\u767E\",\n    \"\\u5343\",\n    \"\\u4EBF\"\n  ];\n  if (!num || isNaN(num))\n    return \"\\u96F6\";\n  const numStr = num.toString().split(\"\");\n  let result = \"\";\n  for (let i = 0; i < numStr.length; i++) {\n    const desIndex = numStr.length - 1 - i;\n    result = `${chineseUnit[i]}${result}`;\n    result = `${chineseNum[Number(numStr[desIndex])]}${result}`;\n  }\n  result = result.replace(/零(千|百|十)/g, \"\\u96F6\").replace(/十零/g, \"\\u5341\");\n  result = result.replace(/零+/g, \"\\u96F6\");\n  result = result.replace(/零亿/g, \"\\u4EBF\").replace(/零万/g, \"\\u4E07\");\n  result = result.replace(/亿万/g, \"\\u4EBF\");\n  result = result.replace(/零+$/, \"\");\n  result = result.replace(/^一十/g, \"\\u5341\");\n  return result;\n}\nfunction cloneProperty(properties, sourceElement, targetElement) {\n  for (let i = 0; i < properties.length; i++) {\n    const property = properties[i];\n    const value = sourceElement[property];\n    if (value !== void 0) {\n      targetElement[property] = value;\n    } else {\n      delete targetElement[property];\n    }\n  }\n}\nfunction pickObject(object, pickKeys) {\n  const newObject = {};\n  for (const key in object) {\n    if (pickKeys.includes(key)) {\n      newObject[key] = object[key];\n    }\n  }\n  return newObject;\n}\nfunction omitObject(object, omitKeys) {\n  const newObject = {};\n  for (const key in object) {\n    if (!omitKeys.includes(key)) {\n      newObject[key] = object[key];\n    }\n  }\n  return newObject;\n}\nfunction convertStringToBase64(input2) {\n  const encoder = new TextEncoder();\n  const data2 = encoder.encode(input2);\n  const charArray = Array.from(data2, (byte) => String.fromCharCode(byte));\n  const base64 = window.btoa(charArray.join(\"\"));\n  return base64;\n}\nfunction findScrollContainer(element) {\n  let parent = element.parentElement;\n  while (parent) {\n    const style = window.getComputedStyle(parent);\n    const overflowY = style.getPropertyValue(\"overflow-y\");\n    if (parent.scrollHeight > parent.clientHeight && (overflowY === \"auto\" || overflowY === \"scroll\")) {\n      return parent;\n    }\n    parent = parent.parentElement;\n  }\n  return document.documentElement;\n}\nfunction isArrayEqual(arr1, arr2) {\n  if (arr1.length !== arr2.length) {\n    return false;\n  }\n  return !arr1.some((item) => !arr2.includes(item));\n}\nfunction isObjectEqual(obj1, obj2) {\n  if (!isObject(obj1) || !isObject(obj2))\n    return false;\n  const obj1Keys = Object.keys(obj1);\n  const obj2Keys = Object.keys(obj2);\n  if (obj1Keys.length !== obj2Keys.length) {\n    return false;\n  }\n  return !obj1Keys.some((key) => obj2[key] !== obj1[key]);\n}\nfunction isRectIntersect(rect1, rect2) {\n  const rect1Left = rect1.x;\n  const rect1Right = rect1.x + rect1.width;\n  const rect1Top = rect1.y;\n  const rect1Bottom = rect1.y + rect1.height;\n  const rect2Left = rect2.x;\n  const rect2Right = rect2.x + rect2.width;\n  const rect2Top = rect2.y;\n  const rect2Bottom = rect2.y + rect2.height;\n  if (rect1Left > rect2Right || rect1Right < rect2Left || rect1Top > rect2Bottom || rect1Bottom < rect2Top) {\n    return false;\n  }\n  return true;\n}\nconst CURSOR_AGENT_OFFSET_HEIGHT = 12;\nconst defaultCursorOption = {\n  width: 1,\n  color: \"#000000\",\n  dragWidth: 2,\n  dragColor: \"#0000FF\"\n};\nconst EDITOR_COMPONENT = \"editor-component\";\nconst EDITOR_PREFIX = \"ce\";\nconst EDITOR_CLIPBOARD = `${EDITOR_PREFIX}-clipboard`;\nvar MoveDirection;\n(function(MoveDirection2) {\n  MoveDirection2[\"UP\"] = \"top\";\n  MoveDirection2[\"DOWN\"] = \"down\";\n  MoveDirection2[\"LEFT\"] = \"left\";\n  MoveDirection2[\"RIGHT\"] = \"right\";\n})(MoveDirection || (MoveDirection = {}));\nvar ElementType;\n(function(ElementType2) {\n  ElementType2[\"TEXT\"] = \"text\";\n  ElementType2[\"IMAGE\"] = \"image\";\n  ElementType2[\"TABLE\"] = \"table\";\n  ElementType2[\"HYPERLINK\"] = \"hyperlink\";\n  ElementType2[\"SUPERSCRIPT\"] = \"superscript\";\n  ElementType2[\"SUBSCRIPT\"] = \"subscript\";\n  ElementType2[\"SEPARATOR\"] = \"separator\";\n  ElementType2[\"PAGE_BREAK\"] = \"pageBreak\";\n  ElementType2[\"CONTROL\"] = \"control\";\n  ElementType2[\"CHECKBOX\"] = \"checkbox\";\n  ElementType2[\"RADIO\"] = \"radio\";\n  ElementType2[\"LATEX\"] = \"latex\";\n  ElementType2[\"TAB\"] = \"tab\";\n  ElementType2[\"DATE\"] = \"date\";\n  ElementType2[\"BLOCK\"] = \"block\";\n  ElementType2[\"TITLE\"] = \"title\";\n  ElementType2[\"LIST\"] = \"list\";\n})(ElementType || (ElementType = {}));\nconst EDITOR_ELEMENT_STYLE_ATTR = [\n  \"bold\",\n  \"color\",\n  \"highlight\",\n  \"font\",\n  \"size\",\n  \"italic\",\n  \"underline\",\n  \"strikeout\",\n  \"textDecoration\"\n];\nconst EDITOR_ROW_ATTR = [\"rowFlex\", \"rowMargin\"];\nconst EDITOR_ELEMENT_COPY_ATTR = [\n  \"type\",\n  \"font\",\n  \"size\",\n  \"bold\",\n  \"color\",\n  \"italic\",\n  \"highlight\",\n  \"underline\",\n  \"strikeout\",\n  \"rowFlex\",\n  \"url\",\n  \"hyperlinkId\",\n  \"dateId\",\n  \"dateFormat\",\n  \"groupIds\",\n  \"rowMargin\",\n  \"textDecoration\"\n];\nconst EDITOR_ELEMENT_ZIP_ATTR = [\n  \"type\",\n  \"font\",\n  \"size\",\n  \"bold\",\n  \"color\",\n  \"lineWidth\",\n  \"italic\",\n  \"highlight\",\n  \"underline\",\n  \"strikeout\",\n  \"rowFlex\",\n  \"rowMargin\",\n  \"dashArray\",\n  \"trList\",\n  \"borderType\",\n  \"width\",\n  \"height\",\n  \"url\",\n  \"colgroup\",\n  \"valueList\",\n  \"control\",\n  \"checkbox\",\n  \"radio\",\n  \"dateFormat\",\n  \"block\",\n  \"level\",\n  \"title\",\n  \"listType\",\n  \"listStyle\",\n  \"listWrap\",\n  \"groupIds\",\n  \"conceptId\",\n  \"imgDisplay\",\n  \"imgFloatPosition\",\n  \"textDecoration\",\n  \"extension\",\n  \"externalId\"\n];\nconst TABLE_TD_ZIP_ATTR = [\n  \"conceptId\",\n  \"extension\",\n  \"externalId\",\n  \"verticalAlign\",\n  \"backgroundColor\",\n  \"borderTypes\",\n  \"slashTypes\"\n];\nconst TABLE_CONTEXT_ATTR = [\n  \"tdId\",\n  \"trId\",\n  \"tableId\"\n];\nconst TITLE_CONTEXT_ATTR = [\n  \"level\",\n  \"titleId\",\n  \"title\"\n];\nconst LIST_CONTEXT_ATTR = [\n  \"listId\",\n  \"listType\",\n  \"listStyle\"\n];\nconst CONTROL_CONTEXT_ATTR = [\n  \"control\",\n  \"controlId\",\n  \"controlComponent\"\n];\nconst CONTROL_STYLE_ATTR = [\n  \"font\",\n  \"size\",\n  \"bold\",\n  \"highlight\",\n  \"italic\",\n  \"strikeout\"\n];\nconst EDITOR_ELEMENT_CONTEXT_ATTR = [\n  ...TABLE_CONTEXT_ATTR,\n  ...TITLE_CONTEXT_ATTR,\n  ...LIST_CONTEXT_ATTR\n];\nconst TEXTLIKE_ELEMENT_TYPE = [\n  ElementType.TEXT,\n  ElementType.HYPERLINK,\n  ElementType.SUBSCRIPT,\n  ElementType.SUPERSCRIPT,\n  ElementType.CONTROL,\n  ElementType.DATE\n];\nconst IMAGE_ELEMENT_TYPE = [\n  ElementType.IMAGE,\n  ElementType.LATEX\n];\nconst BLOCK_ELEMENT_TYPE = [\n  ElementType.BLOCK,\n  ElementType.PAGE_BREAK,\n  ElementType.SEPARATOR,\n  ElementType.TABLE\n];\nconst INLINE_NODE_NAME = [\"HR\", \"TABLE\", \"UL\", \"OL\"];\nconst VIRTUAL_ELEMENT_TYPE = [\n  ElementType.TITLE,\n  ElementType.LIST\n];\nclass ImageParticle {\n  constructor(draw) {\n    this.draw = draw;\n    this.options = draw.getOptions();\n    this.container = draw.getContainer();\n    this.imageCache = /* @__PURE__ */ new Map();\n    this.floatImageContainer = null;\n    this.floatImage = null;\n  }\n  createFloatImage(element) {\n    const { scale } = this.options;\n    let floatImageContainer = this.floatImageContainer;\n    let floatImage = this.floatImage;\n    if (!floatImageContainer) {\n      floatImageContainer = document.createElement(\"div\");\n      floatImageContainer.classList.add(`${EDITOR_PREFIX}-float-image`);\n      this.container.append(floatImageContainer);\n      this.floatImageContainer = floatImageContainer;\n    }\n    if (!floatImage) {\n      floatImage = document.createElement(\"img\");\n      floatImageContainer.append(floatImage);\n      this.floatImage = floatImage;\n    }\n    floatImageContainer.style.display = \"none\";\n    floatImage.style.width = `${element.width * scale}px`;\n    floatImage.style.height = `${element.height * scale}px`;\n    const height = this.draw.getHeight();\n    const pageGap = this.draw.getPageGap();\n    const preY = this.draw.getPageNo() * (height + pageGap);\n    const imgFloatPosition = element.imgFloatPosition;\n    floatImageContainer.style.left = `${imgFloatPosition.x}px`;\n    floatImageContainer.style.top = `${preY + imgFloatPosition.y}px`;\n    floatImage.src = element.value;\n  }\n  dragFloatImage(movementX, movementY) {\n    if (!this.floatImageContainer)\n      return;\n    this.floatImageContainer.style.display = \"block\";\n    const x = parseFloat(this.floatImageContainer.style.left) + movementX;\n    const y = parseFloat(this.floatImageContainer.style.top) + movementY;\n    this.floatImageContainer.style.left = `${x}px`;\n    this.floatImageContainer.style.top = `${y}px`;\n  }\n  destroyFloatImage() {\n    if (this.floatImageContainer) {\n      this.floatImageContainer.style.display = \"none\";\n    }\n  }\n  addImageObserver(promise) {\n    this.draw.getImageObserver().add(promise);\n  }\n  getFallbackImage(width, height) {\n    const tileSize = 8;\n    const x = (width - Math.ceil(width / tileSize) * tileSize) / 2;\n    const y = (height - Math.ceil(height / tileSize) * tileSize) / 2;\n    const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\">\n                  <rect width=\"${width}\" height=\"${height}\" fill=\"url(#mosaic)\" />\n                  <defs>\n                    <pattern id=\"mosaic\" x=\"${x}\" y=\"${y}\" width=\"${tileSize * 2}\" height=\"${tileSize * 2}\" patternUnits=\"userSpaceOnUse\">\n                      <rect width=\"${tileSize}\" height=\"${tileSize}\" fill=\"#cccccc\" />\n                      <rect width=\"${tileSize}\" height=\"${tileSize}\" fill=\"#cccccc\" transform=\"translate(${tileSize}, ${tileSize})\" />\n                    </pattern>\n                  </defs>\n                </svg>`;\n    const fallbackImage = new Image();\n    fallbackImage.src = `data:image/svg+xml;base64,${convertStringToBase64(svg)}`;\n    return fallbackImage;\n  }\n  render(ctx, element, x, y) {\n    const { scale } = this.options;\n    const width = element.width * scale;\n    const height = element.height * scale;\n    if (this.imageCache.has(element.id)) {\n      const img = this.imageCache.get(element.id);\n      ctx.drawImage(img, x, y, width, height);\n    } else {\n      const imageLoadPromise = new Promise((resolve, reject) => {\n        const img = new Image();\n        img.setAttribute(\"crossOrigin\", \"Anonymous\");\n        img.src = element.value;\n        img.onload = () => {\n          this.imageCache.set(element.id, img);\n          resolve(element);\n          if (element.imgDisplay === ImageDisplay.FLOAT_BOTTOM) {\n            this.draw.render({\n              isCompute: false,\n              isSetCursor: false,\n              isSubmitHistory: false\n            });\n          } else {\n            ctx.drawImage(img, x, y, width, height);\n          }\n        };\n        img.onerror = (error) => {\n          const fallbackImage = this.getFallbackImage(width, height);\n          fallbackImage.onload = () => {\n            ctx.drawImage(fallbackImage, x, y, width, height);\n            this.imageCache.set(element.id, fallbackImage);\n          };\n          reject(error);\n        };\n      });\n      this.addImageObserver(imageLoadPromise);\n    }\n  }\n}\nconst ordR = \"R\".charCodeAt(0);\nfunction HERSHEY(i) {\n  if (data[i] == null) {\n    compile(i);\n  }\n  return data[i];\n}\nfunction compile(i) {\n  const entry = raw[i];\n  if (entry == null) {\n    return;\n  }\n  const bound = entry.substring(3, 5);\n  const xmin = 1 * bound.charCodeAt(0) - ordR;\n  const xmax = 1 * bound.charCodeAt(1) - ordR;\n  const content = entry.substring(5);\n  const polylines = [[]];\n  let ymin = Infinity;\n  let ymax = -Infinity;\n  let zmin = Infinity;\n  let zmax = -Infinity;\n  let j = 0;\n  while (j < content.length) {\n    const digit = content.substring(j, j + 2);\n    if (digit == \" R\") {\n      polylines.push([]);\n    } else {\n      const x = digit.charCodeAt(0) - ordR - xmin;\n      const y = digit.charCodeAt(1) - ordR;\n      ymin = Math.min(y, ymin);\n      ymax = Math.max(y, ymax);\n      zmin = Math.min(x, zmin);\n      zmax = Math.max(x, zmax);\n      polylines[polylines.length - 1].push([x, y]);\n    }\n    j += 2;\n  }\n  data[i] = {\n    w: xmax - xmin,\n    xmin: zmin,\n    xmax: zmax,\n    ymin,\n    ymax,\n    polylines\n  };\n}\nconst data = {};\nconst raw = {\n  1: \"  9MWRMNV RRMVV RPSTS\",\n  2: \" 16MWOMOV ROMSMUNUPSQ ROQSQURUUSVOV\",\n  3: \" 11MXVNTMRMPNOPOSPURVTVVU\",\n  4: \" 12MWOMOV ROMRMTNUPUSTURVOV\",\n  5: \" 12MWOMOV ROMUM ROQSQ ROVUV\",\n  6: \"  9MVOMOV ROMUM ROQSQ\",\n  7: \" 15MXVNTMRMPNOPOSPURVTVVUVR RSRVR\",\n  8: \"  9MWOMOV RUMUV ROQUQ\",\n  9: \"  3PTRMRV\",\n  10: \"  7NUSMSTRVPVOTOS\",\n  11: \"  9MWOMOV RUMOS RQQUV\",\n  12: \"  6MVOMOV ROVUV\",\n  13: \" 12LXNMNV RNMRV RVMRV RVMVV\",\n  14: \"  9MWOMOV ROMUV RUMUV\",\n  15: \" 14MXRMPNOPOSPURVSVUUVSVPUNSMRM\",\n  16: \" 10MWOMOV ROMSMUNUQSROR\",\n  17: \" 17MXRMPNOPOSPURVSVUUVSVPUNSMRM RSTVW\",\n  18: \" 13MWOMOV ROMSMUNUQSROR RRRUV\",\n  19: \" 13MWUNSMQMONOOPPTRUSUUSVQVOU\",\n  20: \"  6MWRMRV RNMVM\",\n  21: \"  9MXOMOSPURVSVUUVSVM\",\n  22: \"  6MWNMRV RVMRV\",\n  23: \" 12LXNMPV RRMPV RRMTV RVMTV\",\n  24: \"  6MWOMUV RUMOV\",\n  25: \"  7MWNMRQRV RVMRQ\",\n  26: \"  9MWUMOV ROMUM ROVUV\",\n  27: \"  9MWRMNV RRMVV RPSTS\",\n  28: \" 16MWOMOV ROMSMUNUPSQ ROQSQURUUSVOV\",\n  29: \"  6MVOMOV ROMUM\",\n  30: \"  9MWRMNV RRMVV RNVVV\",\n  31: \" 12MWOMOV ROMUM ROQSQ ROVUV\",\n  32: \"  9MWUMOV ROMUM ROVUV\",\n  33: \"  9MWOMOV RUMUV ROQUQ\",\n  34: \" 20MXRMPNOPOSPURVSVUUVSVPUNSMRM RQQTR RTQQR\",\n  35: \"  3PTRMRV\",\n  36: \"  9MWOMOV RUMOS RQQUV\",\n  37: \"  6MWRMNV RRMVV\",\n  38: \" 12LXNMNV RNMRV RVMRV RVMVV\",\n  39: \"  9MWOMOV ROMUV RUMUV\",\n  40: \" 12MWOMUM RPQTR RTQPR ROVUV\",\n  41: \" 14MXRMPNOPOSPURVSVUUVSVPUNSMRM\",\n  42: \"  9MWOMOV RUMUV ROMUM\",\n  43: \" 10MWOMOV ROMSMUNUQSROR\",\n  44: \" 10MWOMRQOV ROMUM ROVUV\",\n  45: \"  6MWRMRV RNMVM\",\n  46: \" 15MWNONNOMPMQNRPRV RVOVNUMTMSNRP\",\n  47: \" 13LXRMRV RPONPNSPTTTVSVPTOPO\",\n  48: \"  6MWOMUV RUMOV\",\n  49: \" 12LXRMRV RNOOPOSQTSTUSUPVO\",\n  50: \" 13MXOVQVOROPPNRMSMUNVPVRTVVV\",\n  200: \" 12MWRMPNOPOSPURVTUUSUPTNRM\",\n  201: \"  4MWPORMRV\",\n  202: \"  9MWONQMSMUNUPTROVUV\",\n  203: \" 15MWONQMSMUNUPSQ RRQSQURUUSVQVOU\",\n  204: \"  7MWSMSV RSMNSVS\",\n  205: \" 14MWPMOQQPRPTQUSTURVQVOU RPMTM\",\n  206: \" 14MWTMRMPNOPOSPURVTUUSTQRPPQOS\",\n  207: \"  6MWUMQV ROMUM\",\n  208: \" 19MWQMONOPQQSQUPUNSMQM RQQOROUQVSVUUURSQ\",\n  209: \" 14MWUPTRRSPROPPNRMTNUPUSTURVPV\",\n  210: \"  6PURURVSVSURU\",\n  211: \"  7PUSVRVRUSUSWRY\",\n  212: \" 12PURPRQSQSPRP RRURVSVSURU\",\n  213: \" 13PURPRQSQSPRP RSVRVRUSUSWRY\",\n  214: \" 12PURMRR RSMSR RRURVSVSURU\",\n  215: \" 17NWPNRMSMUNUPRQRRSRSQUP RRURVSVSURU\",\n  216: \"  3PTRMRQ\",\n  217: \"  6NVPMPQ RTMTQ\",\n  218: \" 10NVQMPNPPQQSQTPTNSMQM\",\n  219: \" 16MWUNSMQMONOPQQTRUSUUSVQVOU RRLRW\",\n  220: \"  3MWVLNW\",\n  221: \"  7OVTLRNQPQSRUTW\",\n  222: \"  7NUPLRNSPSSRUPW\",\n  223: \"  3PTRLRW\",\n  224: \"  3LXNRVR\",\n  225: \"  6LXRNRV RNRVR\",\n  226: \"  6LXNPVP RNTVT\",\n  227: \"  6MWOOUU RUOOU\",\n  228: \"  9MWRORU ROPUT RUPOT\",\n  229: \"  6PURQRRSRSQRQ\",\n  230: \"  7PUSMRORQSQSPRP\",\n  231: \"  7PUSNRNRMSMSORQ\",\n  232: \"  7LXSOVRSU RNRVR\",\n  233: \" 12MXRLPW RULSW ROPVP ROSVS\",\n  234: \" 21LXVRURTSSURVOVNUNSORRQSPSNRMPMONOPQSSUUVVV\",\n  235: \" 20LXNNOQOSNV RVNUQUSVV RNNQOSOVN RNVQUSUVV\",\n  501: \"  9I[RFJ[ RRFZ[ RMTWT\",\n  502: \" 24G\\\\KFK[ RKFTFWGXHYJYLXNWOTP RKPTPWQXRYTYWXYWZT[K[\",\n  503: \" 19H]ZKYIWGUFQFOGMILKKNKSLVMXOZQ[U[WZYXZV\",\n  504: \" 16G\\\\KFK[ RKFRFUGWIXKYNYSXVWXUZR[K[\",\n  505: \" 12H[LFL[ RLFYF RLPTP RL[Y[\",\n  506: \"  9HZLFL[ RLFYF RLPTP\",\n  507: \" 23H]ZKYIWGUFQFOGMILKKNKSLVMXOZQ[U[WZYXZVZS RUSZS\",\n  508: \"  9G]KFK[ RYFY[ RKPYP\",\n  509: \"  3NVRFR[\",\n  510: \" 11JZVFVVUYTZR[P[NZMYLVLT\",\n  511: \"  9G\\\\KFK[ RYFKT RPOY[\",\n  512: \"  6HYLFL[ RL[X[\",\n  513: \" 12F^JFJ[ RJFR[ RZFR[ RZFZ[\",\n  514: \"  9G]KFK[ RKFY[ RYFY[\",\n  515: \" 22G]PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF\",\n  516: \" 14G\\\\KFK[ RKFTFWGXHYJYMXOWPTQKQ\",\n  517: \" 25G]PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF RSWY]\",\n  518: \" 17G\\\\KFK[ RKFTFWGXHYJYLXNWOTPKP RRPY[\",\n  519: \" 21H\\\\YIWGTFPFMGKIKKLMMNOOUQWRXSYUYXWZT[P[MZKX\",\n  520: \"  6JZRFR[ RKFYF\",\n  521: \" 11G]KFKULXNZQ[S[VZXXYUYF\",\n  522: \"  6I[JFR[ RZFR[\",\n  523: \" 12F^HFM[ RRFM[ RRFW[ R\\\\FW[\",\n  524: \"  6H\\\\KFY[ RYFK[\",\n  525: \"  7I[JFRPR[ RZFRP\",\n  526: \"  9H\\\\YFK[ RKFYF RK[Y[\",\n  527: \"  9I[RFJ[ RRFZ[ RMTWT\",\n  528: \" 24G\\\\KFK[ RKFTFWGXHYJYLXNWOTP RKPTPWQXRYTYWXYWZT[K[\",\n  529: \"  6HYLFL[ RLFXF\",\n  530: \"  9I[RFJ[ RRFZ[ RJ[Z[\",\n  531: \" 12H[LFL[ RLFYF RLPTP RL[Y[\",\n  532: \"  9H\\\\YFK[ RKFYF RK[Y[\",\n  533: \"  9G]KFK[ RYFY[ RKPYP\",\n  534: \" 25G]PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF ROPUP\",\n  535: \"  3NVRFR[\",\n  536: \"  9G\\\\KFK[ RYFKT RPOY[\",\n  537: \"  6I[RFJ[ RRFZ[\",\n  538: \" 12F^JFJ[ RJFR[ RZFR[ RZFZ[\",\n  539: \"  9G]KFK[ RKFY[ RYFY[\",\n  540: \"  9I[KFYF ROPUP RK[Y[\",\n  541: \" 22G]PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF\",\n  542: \"  9G]KFK[ RYFY[ RKFYF\",\n  543: \" 14G\\\\KFK[ RKFTFWGXHYJYMXOWPTQKQ\",\n  544: \" 10I[KFRPK[ RKFYF RK[Y[\",\n  545: \"  6JZRFR[ RKFYF\",\n  546: \" 19I[KKKILGMFOFPGQIRMR[ RYKYIXGWFUFTGSIRM\",\n  547: \" 21H\\\\RFR[ RPKMLLMKOKRLTMUPVTVWUXTYRYOXMWLTKPK\",\n  548: \"  6H\\\\KFY[ RK[YF\",\n  549: \" 18G]RFR[ RILJLKMLQMSNTQUSUVTWSXQYMZL[L\",\n  550: \" 17H\\\\K[O[LTKPKLLINGQFSFVGXIYLYPXTU[Y[\",\n  551: \" 20G[G[IZLWOSSLVFV[UXSUQSNQLQKRKTLVNXQZT[Y[\",\n  552: \" 41F]SHTITLSPRSQUOXMZK[J[IZIWJRKOLMNJPHRGUFXFZG[I[KZMYNWOTP RSPTPWQXRYTYWXYWZU[R[PZOX\",\n  553: \" 24H\\\\TLTMUNWNYMZKZIYGWFTFQGOIMLLNKRKVLYMZO[Q[TZVXWV\",\n  554: \" 35G^TFRGQIPMOSNVMXKZI[G[FZFXGWIWKXMZP[S[VZXXZT[O[KZHYGWFTFRHRJSMUPWRZT\\\\U\",\n  555: \" 28H\\\\VJVKWLYLZKZIYGVFRFOGNINLONPOSPPPMQLRKTKWLYMZP[S[VZXXYV\",\n  556: \" 28H\\\\RLPLNKMINGQFTFXG[G]F RXGVNTTRXPZN[L[JZIXIVJULUNV RQPZP\",\n  557: \" 29G^G[IZMVPQQNRJRGQFPFOGNINLONQOUOXNYMZKZQYVXXVZS[O[LZJXIVIT\",\n  558: \" 38F^MMKLJJJIKGMFNFPGQIQKPONULYJ[H[GZGX RMRVOXN[L]J^H^G]F\\\\FZHXLVRUWUZV[W[YZZY\\\\V\",\n  559: \" 25IZWVUTSQROQLQIRGSFUFVGWIWLVQTVSXQZO[M[KZJXJVKUMUOV\",\n  560: \" 25JYT^R[PVOPOJPGRFTFUGVJVMURR[PaOdNfLgKfKdLaN^P\\\\SZWX\",\n  561: \" 39F^MMKLJJJIKGMFNFPGQIQKPONULYJ[H[GZGX R^I^G]F\\\\FZGXIVLTNROPO RROSQSXTZU[V[XZYY[V\",\n  562: \" 29I\\\\MRORSQVOXMYKYHXFVFUGTISNRSQVPXNZL[J[IZIXJWLWNXQZT[V[YZ[X\",\n  563: \" 45@aEMCLBJBICGEFFFHGIIIKHPGTE[ RGTJLLHMGOFPFRGSISKRPQTO[ RQTTLVHWGYFZF\\\\G]I]K\\\\PZWZZ[[\\\\[^Z_YaV\",\n  564: \" 32E]JMHLGJGIHGJFKFMGNINKMPLTJ[ RLTOLQHRGTFVFXGYIYKXPVWVZW[X[ZZ[Y]V\",\n  565: \" 29H]TFQGOIMLLNKRKVLYMZO[Q[TZVXXUYSZOZKYHXGVFTFRHRKSNUQWSZU\\\\V\",\n  566: \" 31F_SHTITLSPRSQUOXMZK[J[IZIWJRKOLMNJPHRGUFZF\\\\G]H^J^M]O\\\\PZQWQUPTO\",\n  567: \" 32H^ULTNSOQPOPNNNLOIQGTFWFYGZIZMYPWSSWPYNZK[I[HZHXIWKWMXPZS[V[YZ[X\",\n  568: \" 38F_SHTITLSPRSQUOXMZK[J[IZIWJRKOLMNJPHRGUFYF[G\\\\H]J]M\\\\O[PYQVQSPTQUSUXVZX[ZZ[Y]V\",\n  569: \" 28H\\\\H[JZLXOTQQSMTJTGSFRFQGPIPKQMSOVQXSYUYWXYWZT[P[MZKXJVJT\",\n  570: \" 25H[RLPLNKMINGQFTFXG[G]F RXGVNTTRXPZN[L[JZIXIVJULUNV\",\n  571: \" 33E]JMHLGJGIHGJFKFMGNINKMOLRKVKXLZN[P[RZSYUUXMZF RXMWQVWVZW[X[ZZ[Y]V\",\n  572: \" 32F]KMILHJHIIGKFLFNGOIOKNOMRLVLYM[O[QZTWVTXPYMZIZGYFXFWGVIVKWNYP[Q\",\n  573: \" 25C_HMFLEJEIFGHFIFKGLILLK[ RUFK[ RUFS[ RaF_G\\\\JYNVTS[\",\n  574: \" 36F^NLLLKKKILGNFPFRGSISLQUQXRZT[V[XZYXYVXUVU R]I]G\\\\FZFXGVITLPUNXLZJ[H[GZGX\",\n  575: \" 38F]KMILHJHIIGKFLFNGOIOKNOMRLVLXMZN[P[RZTXVUWSYM R[FYMVWT]RbPfNgMfMdNaP^S[VY[V\",\n  576: \" 40H]ULTNSOQPOPNNNLOIQGTFWFYGZIZMYPWTTWPZN[K[JZJXKWNWPXQYR[R^QaPcNfLgKfKdLaN^Q[TYZV\",\n  583: \"  9I[JFR[ RZFR[ RJFZF\",\n  601: \" 18I\\\\XMX[ RXPVNTMQMONMPLSLUMXOZQ[T[VZXX\",\n  602: \" 18H[LFL[ RLPNNPMSMUNWPXSXUWXUZS[P[NZLX\",\n  603: \" 15I[XPVNTMQMONMPLSLUMXOZQ[T[VZXX\",\n  604: \" 18I\\\\XFX[ RXPVNTMQMONMPLSLUMXOZQ[T[VZXX\",\n  605: \" 18I[LSXSXQWOVNTMQMONMPLSLUMXOZQ[T[VZXX\",\n  606: \"  9MYWFUFSGRJR[ ROMVM\",\n  607: \" 23I\\\\XMX]W`VaTbQbOa RXPVNTMQMONMPLSLUMXOZQ[T[VZXX\",\n  608: \" 11I\\\\MFM[ RMQPNRMUMWNXQX[\",\n  609: \"  9NVQFRGSFREQF RRMR[\",\n  610: \" 12MWRFSGTFSERF RSMS^RaPbNb\",\n  611: \"  9IZMFM[ RWMMW RQSX[\",\n  612: \"  3NVRFR[\",\n  613: \" 19CaGMG[ RGQJNLMOMQNRQR[ RRQUNWMZM\\\\N]Q][\",\n  614: \" 11I\\\\MMM[ RMQPNRMUMWNXQX[\",\n  615: \" 18I\\\\QMONMPLSLUMXOZQ[T[VZXXYUYSXPVNTMQM\",\n  616: \" 18H[LMLb RLPNNPMSMUNWPXSXUWXUZS[P[NZLX\",\n  617: \" 18I\\\\XMXb RXPVNTMQMONMPLSLUMXOZQ[T[VZXX\",\n  618: \"  9KXOMO[ ROSPPRNTMWM\",\n  619: \" 18J[XPWNTMQMNNMPNRPSUTWUXWXXWZT[Q[NZMX\",\n  620: \"  9MYRFRWSZU[W[ ROMVM\",\n  621: \" 11I\\\\MMMWNZP[S[UZXW RXMX[\",\n  622: \"  6JZLMR[ RXMR[\",\n  623: \" 12G]JMN[ RRMN[ RRMV[ RZMV[\",\n  624: \"  6J[MMX[ RXMM[\",\n  625: \" 10JZLMR[ RXMR[P_NaLbKb\",\n  626: \"  9J[XMM[ RMMXM RM[X[\",\n  627: \" 24H]QMONMPLRKUKXLZN[P[RZUWWTYPZM RQMSMTNUPWXXZY[Z[\",\n  628: \" 31I\\\\UFSGQIOMNPMTLZKb RUFWFYHYKXMWNUORO RROTPVRWTWWVYUZS[Q[OZNYMV\",\n  629: \" 17I\\\\JPLNNMOMQNROSRSVR[ RZMYPXRR[P_Ob\",\n  630: \" 24I[TMQMONMPLSLVMYNZP[R[TZVXWUWRVOTMRKQIQGRFTFVGXI\",\n  631: \" 19JZWOVNTMQMONOPPRSS RSSOTMVMXNZP[S[UZWX\",\n  632: \" 23JYTFRGQHQIRJUKXK RXKTMQONRMUMWNYP[S]T_TaSbQbP`\",\n  633: \" 19H\\\\IQJOLMNMONOPNTL[ RNTPPRNTMVMXOXRWWTb\",\n  634: \" 27G\\\\HQIOKMMMNNNPMUMXNZO[Q[SZUWVUWRXMXJWGUFSFRHRJSMUPWRZT\",\n  635: \"  9LWRMPTOXOZP[R[TYUW\",\n  636: \" 19I[OMK[ RYNXMWMUNQROSNS RNSPTQUSZT[U[VZ\",\n  637: \"  9JZKFMFOGPHX[ RRML[\",\n  638: \" 21H]OMIb RNQMVMYO[Q[SZUXWT RYMWTVXVZW[Y[[Y\\\\W\",\n  639: \" 14I[LMOMNSMXL[ RYMXPWRUURXOZL[\",\n  640: \" 29JZTFRGQHQIRJUKXK RUKRLPMOOOQQSTTVT RTTPUNVMXMZO\\\\S^T_TaRbPb\",\n  641: \" 18J[RMPNNPMSMVNYOZQ[S[UZWXXUXRWOVNTMRM\",\n  642: \" 13G]PML[ RUMVSWXX[ RIPKNNM[M\",\n  643: \" 19I[MSMVNYOZQ[S[UZWXXUXRWOVNTMRMPNNPMSIb\",\n  644: \" 18I][MQMONMPLSLVMYNZP[R[TZVXWUWRVOUNSM\",\n  645: \"  8H\\\\SMP[ RJPLNOMZM\",\n  646: \" 16H\\\\IQJOLMNMONOPMVMYO[Q[TZVXXTYPYM\",\n  647: \" 21G]ONMOKQJTJWKYLZN[Q[TZWXYUZRZOXMVMTORSPXMb\",\n  648: \" 14I[KMMMOOU`WbYb RZMYOWRM]K`Jb\",\n  649: \" 20F]VFNb RGQHOJMLMMNMPLULXMZO[Q[TZVXXUZP[M\",\n  650: \" 23F]NMLNJQITIWJZK[M[OZQW RRSQWRZS[U[WZYWZTZQYNXM\",\n  651: \" 22L\\\\UUTSRRPRNSMTLVLXMZO[Q[SZTXVRUWUZV[W[YZZY\\\\V\",\n  652: \" 23M[MVOSRNSLTITGSFQGPIOMNTNZO[P[RZTXUUURVVWWYW[V\",\n  653: \" 14MXTTTSSRQROSNTMVMXNZP[S[VYXV\",\n  654: \" 24L\\\\UUTSRRPRNSMTLVLXMZO[Q[SZTXZF RVRUWUZV[W[YZZY\\\\V\",\n  655: \" 17NXOYQXRWSUSSRRQROSNUNXOZQ[S[UZVYXV\",\n  656: \" 24OWOVSQUNVLWIWGVFTGSIQQNZKaJdJfKgMfNcOZP[R[TZUYWV\",\n  657: \" 28L[UUTSRRPRNSMTLVLXMZO[Q[SZTY RVRTYPdOfMgLfLdMaP^S\\\\U[XY[V\",\n  658: \" 29M\\\\MVOSRNSLTITGSFQGPIOMNSM[ RM[NXOVQSSRURVSVUUXUZV[W[YZZY\\\\V\",\n  659: \" 16PWSMSNTNTMSM RPVRRPXPZQ[R[TZUYWV\",\n  660: \" 20PWSMSNTNTMSM RPVRRLdKfIgHfHdIaL^O\\\\Q[TYWV\",\n  661: \" 33M[MVOSRNSLTITGSFQGPIOMNSM[ RM[NXOVQSSRURVSVUTVQV RQVSWTZU[V[XZYY[V\",\n  662: \" 18OWOVQSTNULVIVGUFSGRIQMPTPZQ[R[TZUYWV\",\n  663: \" 33E^EVGSIRJSJTIXH[ RIXJVLSNRPRQSQTPXO[ RPXQVSSURWRXSXUWXWZX[Y[[Z\\\\Y^V\",\n  664: \" 23J\\\\JVLSNROSOTNXM[ RNXOVQSSRURVSVUUXUZV[W[YZZY\\\\V\",\n  665: \" 23LZRRPRNSMTLVLXMZO[Q[SZTYUWUUTSRRQSQURWTXWXYWZV\",\n  666: \" 24KZKVMSNQMUGg RMUNSPRRRTSUUUWTYSZQ[ RMZO[R[UZWYZV\",\n  667: \" 27L[UUTSRRPRNSMTLVLXMZO[Q[SZ RVRUUSZPaOdOfPgRfScS\\\\U[XY[V\",\n  668: \" 15MZMVOSPQPSSSTTTVSYSZT[U[WZXYZV\",\n  669: \" 16NYNVPSQQQSSVTXTZR[ RNZP[T[VZWYYV\",\n  670: \" 16OXOVQSSO RVFPXPZQ[S[UZVYXV RPNWN\",\n  671: \" 19L[LVNRLXLZM[O[QZSXUU RVRTXTZU[V[XZYY[V\",\n  672: \" 17L[LVNRMWMZN[O[RZTXUUUR RURVVWWYW[V\",\n  673: \" 25I^LRJTIWIYJ[L[NZPX RRRPXPZQ[S[UZWXXUXR RXRYVZW\\\\W^V\",\n  674: \" 20JZJVLSNRPRQSQZR[U[XYZV RWSVRTRSSOZN[L[KZ\",\n  675: \" 23L[LVNRLXLZM[O[QZSXUU RVRPdOfMgLfLdMaP^S\\\\U[XY[V\",\n  676: \" 23LZLVNSPRRRTTTVSXQZN[P\\\\Q^QaPdOfMgLfLdMaP^S\\\\WYZV\",\n  677: \" 22J\\\\K[NZQXSVUSWOXKXIWGUFSGRHQJPOPTQXRZT[V[XZYY\",\n  683: \" 26I[WUWRVOUNSMQMONMPLSLVMYNZP[R[TZVXWUXPXKWHVGTFRFPGNI\",\n  684: \" 16JZWNUMRMPNNPMSMVNYOZQ[T[VZ RMTUT\",\n  685: \" 23J[TFRGPJOLNOMTMXNZO[Q[SZUWVUWRXMXIWGVFTF RNPWP\",\n  686: \" 21H\\\\VFNb RQMNNLPKSKVLXNZQ[S[VZXXYUYRXPVNSMQM\",\n  687: \" 16I[XOWNTMQMNNMOLQLSMUOWSZT\\\\T^S_Q_\",\n  700: \" 18H\\\\QFNGLJKOKRLWNZQ[S[VZXWYRYOXJVGSFQF\",\n  701: \"  5H\\\\NJPISFS[\",\n  702: \" 15H\\\\LKLJMHNGPFTFVGWHXJXLWNUQK[Y[\",\n  703: \" 16H\\\\MFXFRNUNWOXPYSYUXXVZS[P[MZLYKW\",\n  704: \"  7H\\\\UFKTZT RUFU[\",\n  705: \" 18H\\\\WFMFLOMNPMSMVNXPYSYUXXVZS[P[MZLYKW\",\n  706: \" 24H\\\\XIWGTFRFOGMJLOLTMXOZR[S[VZXXYUYTXQVOSNRNOOMQLT\",\n  707: \"  6H\\\\YFO[ RKFYF\",\n  708: \" 30H\\\\PFMGLILKMMONSOVPXRYTYWXYWZT[P[MZLYKWKTLRNPQOUNWMXKXIWGTFPF\",\n  709: \" 24H\\\\XMWPURRSQSNRLPKMKLLINGQFRFUGWIXMXRWWUZR[P[MZLX\",\n  710: \"  6MWRYQZR[SZRY\",\n  711: \"  9MWSZR[QZRYSZS\\\\R^Q_\",\n  712: \" 12MWRMQNROSNRM RRYQZR[SZRY\",\n  713: \" 15MWRMQNROSNRM RSZR[QZRYSZS\\\\R^Q_\",\n  714: \"  9MWRFRT RRYQZR[SZRY\",\n  715: \" 21I[LKLJMHNGPFTFVGWHXJXLWNVORQRT RRYQZR[SZRY\",\n  716: \"  3NVRFRM\",\n  717: \"  6JZNFNM RVFVM\",\n  718: \" 14KYQFOGNINKOMQNSNUMVKVIUGSFQF\",\n  719: \" 27H\\\\PBP_ RTBT_ RYIWGTFPFMGKIKKLMMNOOUQWRXSYUYXWZT[P[MZKX\",\n  720: \"  3G][BIb\",\n  721: \" 11KYVBTDRGPKOPOTPYR]T`Vb\",\n  722: \" 11KYNBPDRGTKUPUTTYR]P`Nb\",\n  723: \"  3NVRBRb\",\n  724: \"  3E_IR[R\",\n  725: \"  6E_RIR[ RIR[R\",\n  726: \"  6E_IO[O RIU[U\",\n  727: \"  6G]KKYY RYKKY\",\n  728: \"  9JZRLRX RMOWU RWOMU\",\n  729: \"  6MWRQQRRSSRRQ\",\n  730: \"  8MWSFRGQIQKRLSKRJ\",\n  731: \"  8MWRHQGRFSGSIRKQL\",\n  732: \"  9E_UMXP[RXTUW RIR[R\",\n  733: \" 12H]SBLb RYBRb RLOZO RKUYU\",\n  734: \" 35E_\\\\O\\\\N[MZMYNXPVUTXRZP[L[JZIYHWHUISJRQNRMSKSIRGPFNGMIMKNNPQUXWZY[[[\\\\Z\\\\Y\",\n  735: \" 28G]IIJKKOKUJYI[ R[IZKYOYUZY[[ RIIKJOKUKYJ[I RI[KZOYUYYZ[[\",\n  737: \"  6KYOBO[ RUBU[\",\n  738: \"  6F^RBR[ RI[[[\",\n  739: \"  4F^[BI[[[\",\n  740: \" 18E_RIQJRKSJRI RIYHZI[JZIY R[YZZ[[\\\\Z[Y\",\n  741: \" 33F^RHNLKPJSJUKWMXOXQWRU RRHVLYPZSZUYWWXUXSWRU RRUQYP\\\\ RRUSYT\\\\ RP\\\\T\\\\\",\n  742: \" 26F^RNQKPINHMHKIJKJOKRLTNWR\\\\ RRNSKTIVHWHYIZKZOYRXTVWR\\\\\",\n  743: \" 20F^RGPJLOIR RRGTJXO[R RIRLUPZR] R[RXUTZR]\",\n  744: \" 48F^RTTWVXXXZW[U[SZQXPVPSQ RSQUOVMVKUISHQHOINKNMOOQQ RQQNPLPJQISIUJWLXNXPWRT RRTQYP\\\\ RRTSYT\\\\ RP\\\\T\\\\\",\n  745: \" 55F^RRR[Q\\\\ RRVQ\\\\ RRIQHOHNINKONRR RRISHUHVIVKUNRR RRRNOLNJNIOIQJR RRRVOXNZN[O[QZR RRRNULVJVIUISJR RRRVUXVZV[U[SZR\",\n  746: \" 55F^ISJSLTMVMXLZ RISIRJQLQMRNTNWMYLZ RRGPIOLOOQUQXPZR\\\\ RRGTIULUOSUSXTZR\\\\ R[S[RZQXQWRVTVWWYXZ R[SZSXTWVWXXZ RKVYV\",\n  750: \" 18PSSRRSQSPRPQQPRPSQSSRUQV RQQQRRRRQQQ\",\n  751: \" 16PTQPPQPSQTSTTSTQSPQP RRQQRRSSRRQ\",\n  752: \"  9NVPOTU RTOPU RNRVR\",\n  753: \" 28MWRKQMOPMR RRKSMUPWR RRMOQ RRMUQ RROPQ RROTQ RQQSQ RMRWR\",\n  754: \" 26MWMRMQNOONQMSMUNVOWQWR RPNTN ROOUO RNPVP RNQVQ RMRWR\",\n  755: \" 14LRLFLRRRLF RLIPQ RLLOR RLOMQ\",\n  756: \" 10MWRKQMOPMR RRKSMUPWR\",\n  757: \" 11MWWRWQVOUNSMQMONNOMQMR\",\n  758: \" 13G]]R]P\\\\MZJWHTGPGMHJJHMGPGR\",\n  759: \" 11MWMRMSNUOVQWSWUVVUWSWR\",\n  760: \"  7LXLPNRQSSSVRXP\",\n  761: \"  6RURUTTURTPRO\",\n  762: \"  7RVRRUPVNVLUKTK\",\n  763: \"  7NRRROPNNNLOKPK\",\n  764: \" 21MWWHVGTFQFOGNHMJMLNNOOUSVTWVWXVZU[S\\\\P\\\\N[MZ\",\n  765: \" 21G]IWHVGTGQHOINKMMMONPOTUUVWWYW[V\\\\U]S]P\\\\N[M\",\n  766: \" 31G]RRTUUVWWYW[V\\\\U]S]Q\\\\O[NYMWMUNTOPUOVMWKWIVHUGSGQHOINKMMMONPORR\",\n  767: \" 22H\\\\KFK[ RHF[FQP[Z RZV[Y\\\\[ RZVZY RWYZY RWYZZ\\\\[\",\n  768: \" 30KYUARBPCNELHKLKRLUNWQXSXVWXUYR RKPLMNKQJSJVKXMYPYVXZV]T_R`Oa\",\n  796: \"  3>f>RfR\",\n  797: \"  3D`D``D\",\n  798: \"  3RRR>Rf\",\n  799: \"  3D`DD``\",\n  800: \"  3D`DR`R\",\n  801: \"  3F^FY^K\",\n  802: \"  3KYK^YF\",\n  803: \"  3RRRDR`\",\n  804: \"  3KYKFY^\",\n  805: \"  3F^FK^Y\",\n  806: \"  3KYKRYR\",\n  807: \"  3MWMWWM\",\n  808: \"  3RRRKRY\",\n  809: \"  3MWMMWW\",\n  810: \"  8GRRGPGMHJJHMGPGR\",\n  811: \"  8GRGRGTHWJZM\\\\P]R]\",\n  812: \"  8R]R]T]W\\\\ZZ\\\\W]T]R\",\n  813: \"  8R]]R]P\\\\MZJWHTGRG\",\n  814: \"  9D`DOGQKSPTTTYS]Q`O\",\n  815: \"  9PUUDSGQKPPPTQYS]U`\",\n  816: \"  9OTODQGSKTPTTSYQ]O`\",\n  817: \"  9D`DUGSKQPPTPYQ]S`U\",\n  818: \"  5KYRJYNKVRZ\",\n  819: \"  5JZJRNKVYZR\",\n  820: \"  5KYKVKNYVYN\",\n  821: \"  5JZLXJPZTXL\",\n  822: \" 23JZJ]L]O\\\\Q[TXUVVSVOULTJSIQIPJOLNONSOVPXS[U\\\\X]Z]\",\n  823: \" 23I]]Z]X\\\\U[SXPVOSNONLOJPIQISJTLUOVSVVUXT[Q\\\\O]L]J\",\n  824: \" 23JZZGXGUHSIPLONNQNUOXPZQ[S[TZUXVUVQUNTLQIOHLGJG\",\n  825: \" 23G[GJGLHOIQLTNUQVUVXUZT[S[QZPXOUNQNNOLPISHUGXGZ\",\n  826: \" 21E[EPFRHTJUMVQVUUXSZP[NZLWLSMQNNPLSKVKYL\\\\M^\",\n  827: \" 19EYETHVKWPWSVVTXQYNYLXKVKSLPNNQMTMYN\\\\P_\",\n  828: \" 26OUQOOQOSQUSUUSUQSOQO RQPPQPSQTSTTSTQSPQP RRQQRRSSRRQ\",\n  829: \" 11RWRMSMUNVOWQWSVUUVSWRW\",\n  830: \"  9D`DRJR RORUR RZR`R\",\n  831: \"  5D`DUDO`O`U\",\n  832: \"  6JZRDJR RRDZR\",\n  833: \"  9D`DR`R RJYZY RP`T`\",\n  834: \"  9D`DR`R RDRRb R`RRb\",\n  840: \" 18KYQKNLLNKQKSLVNXQYSYVXXVYSYQXNVLSKQK\",\n  841: \"  6LXLLLXXXXLLL\",\n  842: \"  5KYRJKVYVRJ\",\n  843: \"  6LXRHLRR\\\\XRRH\",\n  844: \" 12JZRIPOJOOSMYRUWYUSZOTORI\",\n  845: \"  6KYRKRY RKRYR\",\n  846: \"  6MWMMWW RWMMW\",\n  847: \"  9MWRLRX RMOWU RWOMU\",\n  850: \" 35NVQNOONQNSOUQVSVUUVSVQUOSNQN ROQOS RPPPT RQOQU RRORU RSOSU RTPTT RUQUS\",\n  851: \" 27NVNNNVVVVNNN ROOOU RPOPU RQOQU RRORU RSOSU RTOTU RUOUU\",\n  852: \" 17MWRLMUWURL RROOT RROUT RRRQT RRRST\",\n  853: \" 17LULRUWUMLR RORTU RORTO RRRTS RRRTQ\",\n  854: \" 17MWRXWOMORX RRUUP RRUOP RRRSP RRRQP\",\n  855: \" 17OXXROMOWXR RURPO RURPU RRRPQ RRRPS\",\n  856: \" 22LXRLNWXPLPVWRL RRRRL RRRLP RRRNW RRRVW RRRXP\",\n  857: \" 11RYRKRY RRKYNRQ RSMVNSO\",\n  860: \" 13MWRLRX ROOUO RMUOWQXSXUWWU\",\n  861: \" 11LXRLRX RLQMOWOXQ RPWTW\",\n  862: \" 14KYMNWX RWNMX ROLLOKQ RULXOYQ\",\n  863: \" 18I[NII[ RVI[[ RMM[[ RWMI[ RNIVI RMMWM\",\n  864: \" 21I[RGRV RMJWP RWJMP RIVL\\\\ R[VX\\\\ RIV[V RL\\\\X\\\\\",\n  865: \" 11G[MJSV RKPSL RG\\\\[\\\\[RG\\\\\",\n  866: \" 14LXPLPPLPLTPTPXTXTTXTXPTPTLPL\",\n  867: \" 32KYYPXNVLSKQKNLLNKQKSLVNXQYSYVXXVYT RYPWNUMSMQNPOOQOSPUQVSWUWWVYT\",\n  868: \" 10KYRJKVYVRJ RRZYNKNRZ\",\n  869: \" 34G]PIPGQFSFTGTI RGZHXJVKTLPLKMJOIUIWJXKXPYTZV\\\\X]Z RGZ]Z RQZP[Q\\\\S\\\\T[SZ\",\n  870: \" 64JZRMRS RRSQ\\\\ RRSS\\\\ RQ\\\\S\\\\ RRMQJPHNG RQJNG RRMSJTHVG RSJVG RRMNKLKJM RPLLLJM RRMVKXKZM RTLXLZM RRMPNOOOR RRMPOOR RRMTNUOUR RRMTOUR\",\n  871: \" 94JZRIRK RRNRP RRSRU RRYQ\\\\ RRYS\\\\ RQ\\\\S\\\\ RRGQIPJ RRGSITJ RPJRITJ RRKPNNOMN RRKTNVOWN RNOPORNTOVO RRPPSNTLTKRKSLT RRPTSVTXTYRYSXT RNTPTRSTTVT RRUPXOYMZLZKYJWJYLZ RRUTXUYWZXZYYZWZYXZ RMZOZRYUZWZ\",\n  872: \" 40JZRYQ\\\\ RRYS\\\\ RQ\\\\S\\\\ RRYUZXZZXZUYTWTYRZOYMWLUMVJUHSGQGOHNJOMMLKMJOKRMTKTJUJXLZOZRY\",\n  873: \" 32JZRYQ\\\\ RRYS\\\\ RQ\\\\S\\\\ RRYVXVVXUXRZQZLYIXHVHTGPGNHLHKIJLJQLRLUNVNXRY\",\n  874: \" 15I[IPKR RLKNP RRGRO RXKVP R[PYR\",\n  899: \"  6QSRQQRRSSRRQ\",\n  900: \" 10PTQPPQPSQTSTTSTQSPQP\",\n  901: \" 14NVQNOONQNSOUQVSVUUVSVQUOSNQN\",\n  902: \" 18MWQMONNOMQMSNUOVQWSWUVVUWSWQVOUNSMQM\",\n  903: \" 18KYQKNLLNKQKSLVNXQYSYVXXVYSYQXNVLSKQK\",\n  904: \" 22G]PGMHJJHMGPGTHWJZM\\\\P]T]W\\\\ZZ\\\\W]T]P\\\\MZJWHTGPG\",\n  905: \" 34AcPALBJCGEEGCJBLAPATBXCZE]G_JaLbPcTcXbZa]__]aZbXcTcPbLaJ_G]EZCXBTAPA\",\n  906: \" 34<hP<K=G?DAAD?G=K<P<T=Y?]A`DcGeKgPhThYg]e`cc`e]gYhThPgKeGcD`A]?Y=T<P<\",\n  907: \" 50){O)I*E+@-;073370;-@+E*I)O)U*[+_-d0i3m7q;t@wEyIzO{U{[z_ydwitmqqmtiwdy_z[{U{OzIyEw@t;q7m3i0d-_+[*U)O)\",\n  908: \" 34>fRAPCMDJDGCEA>H@JAMAZB]D_G`M`PaRc RRATCWDZD]C_AfHdJcMcZb]`_]`W`TaRc\",\n  909: \" 33AcRAPCMDJDGCEABGAKAPBTDXG\\\\L`Rc RRATCWDZD]C_AbGcKcPbT`X]\\\\X`Rc RBHbH\",\n  997: \"  3MWMXWX\",\n  998: \"  3JZJZZZ\",\n  999: \"  3JZJ]Z]\",\n  1001: \" 18KYRKMX RRNVX RRKWX ROTTT RKXPX RTXYX\",\n  1002: \" 35JZNKNX ROKOX RLKSKVLWNVPSQ RSKULVNUPSQ ROQSQVRWTWUVWSXLX RSQURVTVUUWSX\",\n  1003: \" 24KYVLWKWOVLTKQKOLNMMPMSNVOWQXTXVWWU RQKOMNPNSOVQX\",\n  1004: \" 26JZNKNX ROKOX RLKSKVLWMXPXSWVVWSXLX RSKULVMWPWSVVUWSX\",\n  1005: \" 22JYNKNX ROKOX RSOSS RLKVKVOUK ROQSQ RLXVXVTUX\",\n  1006: \" 20JXNKNX ROKOX RSOSS RLKVKVOUK ROQSQ RLXQX\",\n  1007: \" 36K[VLWKWOVLTKQKOLNMMPMSNVOWQXTXVW RQKOMNPNSOVQX RTXUWVU RVSVX RWSWX RTSYS\",\n  1008: \" 27J[NKNX ROKOX RVKVX RWKWX RLKQK RTKYK ROQVQ RLXQX RTXYX\",\n  1009: \" 12NWRKRX RSKSX RPKUK RPXUX\",\n  1010: \" 19LXSKSURWQX RTKTUSWQXPXNWMUNTOUNV RQKVK\",\n  1011: \" 27JZNKNX ROKOX RWKOS RQQVX RRQWX RLKQK RTKYK RLXQX RTXYX\",\n  1012: \" 14KXOKOX RPKPX RMKRK RMXWXWTVX\",\n  1013: \" 30I\\\\MKMX RNNRX RNKRU RWKRX RWKWX RXKXX RKKNK RWKZK RKXOX RUXZX\",\n  1014: \" 21JZNKNX ROMVX ROKVV RVKVX RLKOK RTKXK RLXPX\",\n  1015: \" 32KZQKOLNMMPMSNVOWQXTXVWWVXSXPWMVLTKQK RQKOMNPNSOVQX RTXVVWSWPVMTK\",\n  1016: \" 25JYNKNX ROKOX RLKSKVLWNWOVQSROR RSKULVNVOUQSR RLXQX\",\n  1017: \" 47KZQKOLNMMPMSNVOWQXTXVWWVXSXPWMVLTKQK RQKOMNPNSOVQX RTXVVWSWPVMTK RPWPUQTSTTUUZV[W[XZ RTUUXVZW[\",\n  1018: \" 37JZNKNX ROKOX RLKSKVLWNWOVQSROR RSKULVNVOUQSR RLXQX RSRTSUWVXWXXW RSRUSVWWX\",\n  1019: \" 32KZVMWKWOVMULSKQKOLNMNOOPQQTRVSWT RNNOOQPTQVRWSWVVWTXRXPWOVNTNXOV\",\n  1020: \" 16KZRKRX RSKSX RNKMOMKXKXOWK RPXUX\",\n  1021: \" 20J[NKNUOWQXTXVWWUWK ROKOUPWQX RLKQK RUKYK\",\n  1022: \" 15KYMKRX RNKRU RWKRX RKKPK RTKYK\",\n  1023: \" 24I[LKOX RMKOT RRKOX RRKUX RSKUT RXKUX RJKOK RVKZK\",\n  1024: \" 21KZNKVX ROKWX RWKNX RLKQK RTKYK RLXQX RTXYX\",\n  1025: \" 20LYNKRRRX ROKSR RWKSRSX RLKQK RTKYK RPXUX\",\n  1026: \" 16LYVKNX RWKOX ROKNONKWK RNXWXWTVX\",\n  1027: \" 18KYRKMX RRNVX RRKWX ROTTT RKXPX RTXYX\",\n  1028: \" 35JZNKNX ROKOX RLKSKVLWNVPSQ RSKULVNUPSQ ROQSQVRWTWUVWSXLX RSQURVTVUUWSX\",\n  1029: \" 14KXOKOX RPKPX RMKWKWOVK RMXRX\",\n  1030: \" 15KYRKLX RRMWX RRKXX RMWVW RLXXX\",\n  1031: \" 22JYNKNX ROKOX RSOSS RLKVKVOUK ROQSQ RLXVXVTUX\",\n  1032: \" 16LYVKNX RWKOX ROKNONKWK RNXWXWTVX\",\n  1033: \" 27J[NKNX ROKOX RVKVX RWKWX RLKQK RTKYK ROQVQ RLXQX RTXYX\",\n  1034: \" 44KZQKOLNMMPMSNVOWQXTXVWWVXSXPWMVLTKQK RQKOMNPNSOVQX RTXVVWSWPVMTK RQOQT RTOTT RQQTQ RQRTR\",\n  1035: \" 12NWRKRX RSKSX RPKUK RPXUX\",\n  1036: \" 27JZNKNX ROKOX RWKOS RQQVX RRQWX RLKQK RTKYK RLXQX RTXYX\",\n  1037: \" 15KYRKMX RRNVX RRKWX RKXPX RTXYX\",\n  1038: \" 30I\\\\MKMX RNNRX RNKRU RWKRX RWKWX RXKXX RKKNK RWKZK RKXOX RUXZX\",\n  1039: \" 21JZNKNX ROMVX ROKVV RVKVX RLKOK RTKXK RLXPX\",\n  1040: \" 36JZMJLM RXJWM RPPOS RUPTS RMVLY RXVWY RMKWK RMLWL RPQTQ RPRTR RMWWW RMXWX\",\n  1041: \" 32KZQKOLNMMPMSNVOWQXTXVWWVXSXPWMVLTKQK RQKOMNPNSOVQX RTXVVWSWPVMTK\",\n  1042: \" 21J[NKNX ROKOX RVKVX RWKWX RLKYK RLXQX RTXYX\",\n  1043: \" 25JYNKNX ROKOX RLKSKVLWNWOVQSROR RSKULVNVOUQSR RLXQX\",\n  1044: \" 20K[MKRQ RNKSQMX RMKWKXOVK RNWWW RMXWXXTVX\",\n  1045: \" 16KZRKRX RSKSX RNKMOMKXKXOWK RPXUX\",\n  1046: \" 33KZMONLOKPKQLRORX RXOWLVKUKTLSOSX RMONMOLPLQMRO RXOWMVLULTMSO RPXUX\",\n  1047: \" 40KZRKRX RSKSX RQNNOMQMRNTQUTUWTXRXQWOTNQN RQNOONQNROTQU RTUVTWRWQVOTN RPKUK RPXUX\",\n  1048: \" 21KZNKVX ROKWX RWKNX RLKQK RTKYK RLXQX RTXYX\",\n  1049: \" 33J[RKRX RSKSX RLPMONOOSQU RTUVSWOXOYP RMONROTQUTUVTWRXO RPKUK RPXUX\",\n  1050: \" 35KZMVNXQXMRMONMOLQKTKVLWMXOXRTXWXXV ROUNRNOOMQK RTKVMWOWRVU RNWPW RUWWW\",\n  1051: \" 18KYTKKX RSMTX RTKUX RNTTT RIXNX RRXWX\",\n  1052: \" 34JYPKLX RQKMX RNKUKWLWNVPSQ RUKVLVNUPSQ ROQRQTRUSUUTWQXJX RRQTSTUSWQX\",\n  1053: \" 25KXVLWLXKWNVLTKRKPLOMNOMRMUNWPXRXTWUU RRKPMOONRNVPX\",\n  1054: \" 26JYPKLX RQKMX RNKTKVLWNWQVTUVTWQXJX RTKULVNVQUTTVSWQX\",\n  1055: \" 22JYPKLX RQKMX RSORS RNKXKWNWK ROQRQ RJXTXUUSX\",\n  1056: \" 20JXPKLX RQKMX RSORS RNKXKWNWK ROQRQ RJXOX\",\n  1057: \" 33KYVLWLXKWNVLTKRKPLOMNOMRMUNWPXRXTWUVVS RRKPMOONRNVPX RRXTVUS RSSXS\",\n  1058: \" 27J[PKLX RQKMX RXKTX RYKUX RNKSK RVK[K ROQVQ RJXOX RRXWX\",\n  1059: \" 12NWTKPX RUKQX RRKWK RNXSX\",\n  1060: \" 19LXUKRUQWPX RVKSURWPXOXMWLUMTNUMV RSKXK\",\n  1061: \" 27JZPKLX RQKMX RYKOR RRPTX RSPUX RNKSK RVK[K RJXOX RRXWX\",\n  1062: \" 14KXQKMX RRKNX ROKTK RKXUXVUTX\",\n  1063: \" 30I\\\\OKKX ROMPX RPKQV RYKPX RYKUX RZKVX RMKPK RYK\\\\K RIXMX RSXXX\",\n  1064: \" 21JZPKLX RPKTX RQKTU RXKTX RNKQK RVKZK RJXNX\",\n  1065: \" 32KYRKPLOMNOMRMUNWPXRXTWUVVTWQWNVLTKRK RRKPMOONRNVPX RRXTVUTVQVMTK\",\n  1066: \" 24JYPKLX RQKMX RNKUKWLXMXOWQTROR RUKWMWOVQTR RJXOX\",\n  1067: \" 46KYRKPLOMNOMRMUNWPXRXTWUVVTWQWNVLTKRK RRKPMOONRNVPX RRXTVUTVQVMTK ROWOVPUQURVRZS[T[UZ RRVSZT[\",\n  1068: \" 35JZPKLX RQKMX RNKUKWLXMXOWQTROR RUKWMWOVQTR RSRTWUXVXWW RSRTSUWVX RJXOX\",\n  1069: \" 28KZWLXLYKXNWLUKRKPLOMOOPPUSVT RONPOURVSVVUWSXPXNWMULXMWNW\",\n  1070: \" 16KZTKPX RUKQX RPKNNOKZKYNYK RNXSX\",\n  1071: \" 20J[PKMUMWOXSXUWVUYK RQKNUNWOX RNKSK RWK[K\",\n  1072: \" 15KYOKPX RPKQV RYKPX RMKRK RVK[K\",\n  1073: \" 24I[NKMX ROKNV RTKMX RTKSX RUKTV RZKSX RLKQK RXK\\\\K\",\n  1074: \" 21KZPKTX RQKUX RYKLX RNKSK RVK[K RJXOX RRXWX\",\n  1075: \" 20LYPKRQPX RQKSQ RYKSQQX RNKSK RVK[K RNXSX\",\n  1076: \" 16LYXKLX RYKMX RQKONPKYK RLXUXVUTX\",\n  1101: \" 32LZQOPPPQOQOPQOTOVQVWWXXX RTOUQUWWX RURRSPTOUOWPXSXTWUU RRSPUPWQX\",\n  1102: \" 29JYNKNX ROKOX RORPPROTOVPWRWUVWTXRXPWOU RTOUPVRVUUWTX RLKOK\",\n  1103: \" 24LXVQUQURVRVQUPSOQOOPNRNUOWQXSXUWVV RQOPPOROUPWQX\",\n  1104: \" 32L[VKVX RWKWX RVRUPSOQOOPNRNUOWQXSXUWVU RQOPPOROUPWQX RTKWK RVXYX\",\n  1105: \" 26LXOSVSVRUPSOQOOPNRNUOWQXSXUWVV RUSUQSO RQOPPOROUPWQX\",\n  1106: \" 20LWTKULUMVMVLTKRKPMPX RRKQMQX RNOSO RNXSX\",\n  1107: \" 42LYQOOQOSQUSUUSUQSOQO RQOPQPSQU RSUTSTQSO RTPUOVO RPTOUOXPYTYVZ ROWPXTXVYV[T\\\\P\\\\N[NYPX\",\n  1108: \" 28J[NKNX ROKOX RORPPROTOVPWRWX RTOUPVRVX RLKOK RLXQX RTXYX\",\n  1109: \" 18NWRKRLSLSKRK RRORX RSOSX RPOSO RPXUX\",\n  1110: \" 23NWSKSLTLTKSK RSOSZR\\\\ RTOTZR\\\\P\\\\O[OZPZP[O[ RQOTO\",\n  1111: \" 27JZNKNX ROKOX RWOOU RRSVX RSSWX RLKOK RTOYO RLXQX RTXYX\",\n  1112: \" 12NWRKRX RSKSX RPKSK RPXUX\",\n  1113: \" 44F_JOJX RKOKX RKRLPNOPORPSRSX RPOQPRRRX RSRTPVOXOZP[R[X RXOYPZRZX RHOKO RHXMX RPXUX RXX]X\",\n  1114: \" 28J[NONX ROOOX RORPPROTOVPWRWX RTOUPVRVX RLOOO RLXQX RTXYX\",\n  1115: \" 28LYQOOPNRNUOWQXTXVWWUWRVPTOQO RQOPPOROUPWQX RTXUWVUVRUPTO\",\n  1116: \" 32JYNON\\\\ ROOO\\\\ RORPPROTOVPWRWUVWTXRXPWOU RTOUPVRVUUWTX RLOOO RL\\\\Q\\\\\",\n  1117: \" 29KYUOU\\\\ RVOV\\\\ RURTPROPONPMRMUNWPXRXTWUU RPOOPNRNUOWPX RS\\\\X\\\\\",\n  1118: \" 22KXOOOX RPOPX RPRQPSOUOVPVQUQUPVP RMOPO RMXRX\",\n  1119: \" 26LYTOUPUQVQVPTOQOOPORQSTTVU ROQQRTSVTVWTXQXOWOVPVPWQX\",\n  1120: \" 14LWPKPVRXTXUWUV RQKQVRX RNOTO\",\n  1121: \" 28J[NONUOWQXSXUWVU ROOOUPWQX RVOVX RWOWX RLOOO RTOWO RVXYX\",\n  1122: \" 15KYNORX ROORV RVORX RLOQO RTOXO\",\n  1123: \" 24I[LOOX RMOOU RROOX RROUX RSOUU RXOUX RJOOO RVOZO\",\n  1124: \" 21KYNOUX ROOVX RVONX RLOQO RTOXO RLXPX RSXXX\",\n  1125: \" 23KYNORX ROORV RVORXP[N\\\\M\\\\L[LZMZM[L[ RLOQO RTOXO\",\n  1126: \" 16LXUONX RVOOX ROONQNOVO RNXVXVVUX\",\n  1127: \" 32K[QOOPNQMSMUNWPXQXSWUUWRXO RQOOQNSNUOWPX RQOSOUPWWXX RSOTPVWXXYX\",\n  1128: \" 40KXRKPMOOMUK\\\\ RQLPNNTL\\\\ RRKTKVLVNUPRQ RTKULUNTPRQ RRQTRUTUVTWRXQXOWNT RRQSRTTTVRX\",\n  1129: \" 19KYLQNOPORPSSSXR\\\\ RLQNPPPRQSS RWOVRSXQ\\\\\",\n  1130: \" 39KYSOQOOPNQMSMUNWPXRXTWUVVTVRUPRNQLQKRJTJUKVM RQOOQNSNVPX RRXTVUTUQSO RQLRKTKVM\",\n  1131: \" 27LXVPTOQOOPOQPRRS RQOPPPQRS RRSOTNUNWPXSXUW RRSPTOUOWPX\",\n  1132: \" 28LWRKQLQMSNVNVMSNPOOPNRNTOVPWRXSYS[R\\\\P\\\\O[ RSNQOPPOROTPVRX\",\n  1133: \" 26IYJRKPLONOOPOQMX RMONPNQLX ROQPPROTOVPVRS\\\\ RTOUPURR\\\\\",\n  1134: \" 35IYJSKQLPNPOQOVPX RMPNQNUOWPXQXSWTVUTVQVNULTKRKQLQNRPURWS RQXSVTTUQUNTK\",\n  1135: \" 13NWROPVPWQXSXUWVU RSOQVQWRX\",\n  1136: \" 26KYOOLX RPOMX RUOVPWPVOTORQOR RORPSRWTXVWWU RORQSSWTX\",\n  1137: \" 15LXLKNKPLWX RNKOLVX RRPMX RRPNX\",\n  1138: \" 26KZOOK\\\\ RPOL\\\\ RNUNWOXQXSWTV RVOTVTWUXWXXWYU RWOUVUWVX\",\n  1139: \" 19JYNOMX ROONUMX RVRVOWOVRTUQWNXMX RLOOO\",\n  1140: \" 36MXRKQLQMSNVN RTNQOPPPRRSUS RTNROQPQRRS RSSPTOUOWQXSYTZT[S\\\\Q\\\\ RSSQTPUPWQX\",\n  1141: \" 28KXQOOPNQMSMUNWPXRXTWUVVTVRUPSOQO RQOOQNSNVPX RRXTVUTUQSO\",\n  1142: \" 20IZPPMX RPPNX RTPSX RTPTX RKQMOXO RKQMPXP\",\n  1143: \" 29JXSOQOOPNQMSJ\\\\ RQOOQNSK\\\\ RSOUPVRVTUVTWRXPXNWMU RSOUQUTTVRX\",\n  1144: \" 28K[YOQOOPNQMSMUNWPXRXTWUVVTVRUPYP RQOOQNSNVPX RRXTVUTUQSO\",\n  1145: \" 14KZSPQX RSPRX RMQOOXO RMQOPXP\",\n  1146: \" 24JXKRLPMOOOPPPROUOWPX RNOOPORNUNWPXQXSWUUVRVOUOVP\",\n  1147: \" 35KZOPNQMSMUNWPXRXUWWUXRXPWOUOTPSRRUO\\\\ RMUNVPWRWUVWTXR RXQWPUPSR RRUQXP\\\\\",\n  1148: \" 17KXMONOPPS[T\\\\ RNOOPR[T\\\\U\\\\ RVOTRNYL\\\\\",\n  1149: \" 28I[TKQ\\\\ RUKP\\\\ RJRKPLONOOPOVPWSWUVWT RMONPNTOWPXSXUWWTXRYO\",\n  1150: \" 36JZNPPPPONPMQLSLUMWNXPXQWRUSR RLUNWPWRU RRRRWSXUXWVXTXRWPVOVPWP RRUSWUWWV\",\n  1151: \" 32KZVOTVTWUXWXXWYU RWOUVUWVX RUSUQSOQOOPNQMSMUNWPXRXTV RQOOQNSNVPX\",\n  1152: \" 32JXOKMR RPKNRNVPX RNROPQOSOUPVRVTUVTWRXPXNWMUMR RSOUQUTTVRX RMKPK\",\n  1153: \" 22KXUPUQVQUPSOQOOPNQMSMUNWPXRXTWUV RQOOQNSNVPX\",\n  1154: \" 35KZWKTVTWUXWXXWYU RXKUVUWVX RUSUQSOQOOPNQMSMUNWPXRXTV RQOOQNSNVPX RUKXK\",\n  1155: \" 23KWNURTTSURUPSOQOOPNQMSMUNWPXRXTWUV RQOOQNSNVPX\",\n  1156: \" 23MXWKXLXKVKTLSNPYO[N\\\\ RVKULTNQYP[N\\\\L\\\\L[M\\\\ RPOVO\",\n  1157: \" 34KYVOTVSYR[ RWOUVTYR[P\\\\M\\\\L[M[N\\\\ RUSUQSOQOOPNQMSMUNWPXRXTV RQOOQNSNVPX\",\n  1158: \" 29KZPKLX RQKMX ROQPPROTOVPVRUUUWVX RTOUPURTUTWUXWXXWYU RNKQK\",\n  1159: \" 26MWSKSLTLTKSK RNROPPOROSPSRRURWSX RQORPRRQUQWRXTXUWVU\",\n  1160: \" 26MWTKTLULUKTK RORPPQOSOTPTRRYQ[O\\\\M\\\\M[N\\\\ RROSPSRQYP[O\\\\\",\n  1161: \" 32KXPKLX RQKMX RVPUQVQVPUOTORQPROR RORPSQWRXTXUWVU RORQSRWSX RNKQK\",\n  1162: \" 16NVSKPVPWQXSXTWUU RTKQVQWRX RQKTK\",\n  1163: \" 46F^GRHPIOKOLPLQJX RJOKPKQIX RLQMPOOQOSPSQQX RQORPRQPX RSQTPVOXOZPZRYUYWZX RXOYPYRXUXWYX[X\\\\W]U\",\n  1164: \" 33J[KRLPMOOOPPPQNX RNOOPOQMX RPQQPSOUOWPWRVUVWWX RUOVPVRUUUWVXXXYWZU\",\n  1165: \" 28KXQOOPNQMSMUNWPXRXTWUVVTVRUPSOQO RQOOQNSNVPX RRXTVUTUQSO\",\n  1166: \" 35JYKRLPMOOOPPPQM\\\\ RNOOPOQL\\\\ RPQROTOVPWRWTVVUWSXQXOVOT RTOVQVTUVSX RJ\\\\O\\\\\",\n  1167: \" 28KYVOR\\\\ RWOS\\\\ RUSUQSOQOOPNQMSMUNWPXRXTV RQOOQNSNVPX RP\\\\U\\\\\",\n  1168: \" 22LXMRNPOOQORPRQPX RPOQPQQOX RRQSPUOVOWPWQVQWP\",\n  1169: \" 24LYVPVQWQVPTOQOOPORQSTTVU ROQQRTSVTVWTXQXOWNVOVOW\",\n  1170: \" 16NWSKPVPWQXSXTWUU RTKQVQWRX RPOUO\",\n  1171: \" 33IZJRKPLONOOPORNUNWOX RMONPNRMUMWOXQXSWTV RVOTVTWUXWXXWYU RWOUVUWVX\",\n  1172: \" 24JXKRLPMOOOPPPROUOWPX RNOOPORNUNWPXQXSWUUVRVOUOVP\",\n  1173: \" 37H\\\\IRJPKOMONPNRMUMWNX RLOMPMRLULWNXOXQWRV RTORVRWTX RUOSVSWTXUXWWYUZRZOYOZP\",\n  1174: \" 38JZMRNPPOROSPSR RQORPRRQUPWNXMXLWLVMVLW RXPWQXQXPWOVOTPSRRURWSX RQUQWRXTXVWWU\",\n  1175: \" 35IYJRKPLONOOPORNUNWOX RMONPNRMUMWOXQXSWTV RVOTVSYR[ RWOUVTYR[P\\\\M\\\\L[M[N\\\\\",\n  1176: \" 27KYWOWPVQNVMWMX RNQOOROUQ ROPRPUQVQ RNVOVRWUW ROVRXUXVV\",\n  1177: \" 39H[RKSLSMTMTLRKOKMLLNLX ROKNLMNMX RXKYLYMZMZLXKVKTMTX RVKUMUX RJOWO RJXOX RRXWX\",\n  1178: \" 29J[UKVLWLWKQKOLNNNX RQKPLONOX RVOVX RWOWX RLOWO RLXQX RTXYX\",\n  1179: \" 27J[WKQKOLNNNX RQKPLONOX RUKVLVX RWKWX RLOVO RLXQX RTXYX\",\n  1180: \" 48F_PKQLQMRMRLPKMKKLJNJX RMKLLKNKX RYKZL[L[KUKSLRNRX RUKTLSNSX RZOZX R[O[X RHO[O RHXMX RPXUX RXX]X\",\n  1181: \" 46F_PKQLQMRMRLPKMKKLJNJX RMKLLKNKX R[KUKSLRNRX RUKTLSNSX RYKZLZX R[K[X RHOZO RHXMX RPXUX RXX]X\",\n  1182: \" 12NWRORX RSOSX RPOSO RPXUX\",\n  1184: \" 21LXVPTOROPPOQNSNUOWQXSXUW RROPQOSOVQX ROSSS\",\n  1185: \" 35LYSKQLPMOONRNUOWPXRXTWUVVTWQWNVLUKSK RSKQMPOOSOVPX RRXTVUTVPVMUK ROQVQ\",\n  1186: \" 34KZTKQ\\\\ RUKP\\\\ RQONPMRMUNWQXTXWWXUXRWPTOQO RQOOPNRNUOWQX RTXVWWUWRVPTO\",\n  1187: \" 22LXUPVRVQUPSOQOOPNRNTOVRX RQOOQOTPVRXSYS[R\\\\P\\\\\",\n  1191: \" 45I[VKWLXLVKSKQLPMOOLYK[J\\\\ RSKQMPOMYL[J\\\\H\\\\H[I\\\\ RZK[L[KYKWLVNSYR[Q\\\\ RYKXLWNTYS[Q\\\\O\\\\O[P\\\\ RLOYO\",\n  1192: \" 38IZVKWLXLXKSKQLPMOOLYK[J\\\\ RSKQMPOMYL[J\\\\H\\\\H[I\\\\ RVOTVTWUXWXXWYU RWOUVUWVX RLOWO\",\n  1193: \" 38IZVKWL RXKSKQLPMOOLYK[J\\\\ RSKQMPOMYL[J\\\\H\\\\H[I\\\\ RWKTVTWUXWXXWYU RXKUVUWVX RLOVO\",\n  1194: \" 63F^SKTLTM RULSKPKNLMMLOIYH[G\\\\ RPKNMMOJYI[G\\\\E\\\\E[F\\\\ RZK[L\\\\L\\\\KWKUL RTMSOPYO[N\\\\ RWKUMTOQYP[N\\\\L\\\\L[M\\\\ RZOXVXWYX[X\\\\W]U R[OYVYWZX RIO[O\",\n  1195: \" 63F^SKTLTM RULSKPKNLMMLOIYH[G\\\\ RPKNMMOJYI[G\\\\E\\\\E[F\\\\ RZK[L R\\\\KWKUL RTMSOPYO[N\\\\ RWKUMTOQYP[N\\\\L\\\\L[M\\\\ R[KXVXWYX[X\\\\W]U R\\\\KYVYWZX RIOZO\",\n  1196: \" 20MWNROPPOROSPSRRURWSX RQORPRRQUQWRXTXUWVU\",\n  1200: \" 28LYQKOLNONTOWQXTXVWWTWOVLTKQK RQKPLOOOTPWQX RTXUWVTVOULTK\",\n  1201: \" 10LYPNSKSX RRLRX ROXVX\",\n  1202: \" 35LYOMONNNNMOLQKTKVLWNVPTQQROSNUNX RTKULVNUPTQ RNWOVPVSWVWWV RPVSXVXWVWU\",\n  1203: \" 39LYOMONNNNMOLQKTKVLWNVPTQ RTKULVNUPTQ RRQTQVRWTWUVWTXQXOWNVNUOUOV RTQURVTVUUWTX\",\n  1204: \" 13LYSMSX RTKTX RTKMTXT RQXVX\",\n  1205: \" 33LYOKNQ ROKVK ROLSLVK RNQOPQOTOVPWRWUVWTXQXOWNVNUOUOV RTOUPVRVUUWTX\",\n  1206: \" 36LYVMVNWNWMVLTKRKPLOMNPNUOWQXTXVWWUWSVQTPQPNR RRKPMOPOUPWQX RTXUWVUVSUQTP\",\n  1207: \" 22LYNKNO RVMRTPX RWKTQQX RNMPKRKUM RNMPLRLUMVM\",\n  1208: \" 51LYQKOLNNOPQQTQVPWNVLTKQK RQKPLONPPQQ RTQUPVNULTK RQQORNTNUOWQXTXVWWUWTVRTQ RQQPROTOUPWQX RTXUWVUVTURTQ\",\n  1209: \" 36LYOVOUNUNVOWQXSXUWVVWSWNVLTKQKOLNNNPORQSTSWQ RSXUVVSVNULTK RQKPLONOPPRQS\",\n  1210: \"  6NVRVQWRXSWRV\",\n  1211: \"  8NVSWRXQWRVSWSYQ[\",\n  1212: \" 12NVROQPRQSPRO RRVQWRXSWRV\",\n  1213: \" 14NVROQPRQSPRO RSWRXQWRVSWSYQ[\",\n  1214: \" 15NVRKQLRSSLRK RRLRO RRVQWRXSWRV\",\n  1215: \" 29LYNNONOONONNOLQKTKVLWNWOVQSRRSRTST RTKVMVPUQSR RRWRXSXSWRW\",\n  1216: \"  6OVRKRP RSKRP\",\n  1217: \" 12LXOKOP RPKOP RUKUP RVKUP\",\n  1218: \" 10MWQKPLPNQOSOTNTLSKQK\",\n  1219: \"  9MWRJRP ROKUO RUKOO\",\n  1220: \"  3KZXHM\\\\\",\n  1221: \" 16MWUHSJQMPPPTQWSZU\\\\ RSJRLQPQTRXSZ\",\n  1222: \" 16MWOHQJSMTPTTSWQZO\\\\ RQJRLSPSTRXQZ\",\n  1223: \" 12MWPHP\\\\ RQHQ\\\\ RPHUH RP\\\\U\\\\\",\n  1224: \" 12MWSHS\\\\ RTHT\\\\ ROHTH RO\\\\T\\\\\",\n  1225: \" 38LWSHQIPJPLRNSP RQIPL RSNRQ RPJQLSNSPRQPRRSSTSVQXPZ RRSSV RPXQ[ RSTRVPXPZQ[S\\\\\",\n  1226: \" 38MXQHSITJTLRNQP RSITL RQNRQ RTJSLQNQPRQTRRSQTQVSXTZ RRSQV RTXS[ RQTRVTXTZS[Q\\\\\",\n  1227: \"  4MWTHPRT\\\\\",\n  1228: \"  4MWPHTRP\\\\\",\n  1229: \"  3OURHR\\\\\",\n  1230: \"  6MWPHP\\\\ RTHT\\\\\",\n  1231: \"  3I[LRXR\",\n  1232: \"  6I[RLRX RLRXR\",\n  1233: \"  9JZRMRX RMRWR RMXWX\",\n  1234: \"  9JZRMRX RMMWM RMRWR\",\n  1235: \"  6JZMMWW RWMMW\",\n  1236: \"  6NVRQQRRSSRRQ\",\n  1237: \" 15I[RLQMRNSMRL RLRXR RRVQWRXSWRV\",\n  1238: \"  6I[LPXP RLTXT\",\n  1239: \"  9I[WLMX RLPXP RLTXT\",\n  1240: \"  9I[LNXN RLRXR RLVXV\",\n  1241: \"  4JZWLMRWX\",\n  1242: \"  4JZMLWRMX\",\n  1243: \" 10JZWKMOWS RMTWT RMXWX\",\n  1244: \" 10JZMKWOMS RMTWT RMXWX\",\n  1245: \" 21H[YUWUUTTSRPQOONNNLOKQKRLTNUOUQTRSTPUOWNYN\",\n  1246: \" 16JZLTLRMPOPUSWSXR RLRMQOQUTWTXRXP\",\n  1247: \"  8JZMSRPWS RMSRQWS\",\n  1248: \"  7NVSKPO RSKTLPO\",\n  1249: \"  7NVQKTO RQKPLTO\",\n  1250: \" 14LXNKOMQNSNUMVK RNKONQOSOUNVK\",\n  1251: \"  8NVSLRMQLRKSLSNQP\",\n  1252: \"  8NVSKQMQORPSORNQO\",\n  1253: \"  8NVQLRMSLRKQLQNSP\",\n  1254: \"  8NVQKSMSORPQORNSO\",\n  1256: \" 11JZWMQMONNOMQMSNUOVQWWW\",\n  1257: \" 11JZMMMSNUOVQWSWUVVUWSWM\",\n  1258: \" 11JZMMSMUNVOWQWSVUUVSWMW\",\n  1259: \" 11JZMWMQNOONQMSMUNVOWQWW\",\n  1260: \" 14JZWMQMONNOMQMSNUOVQWWW RMRUR\",\n  1261: \" 13I[TOUPXRUTTU RUPWRUT RLRWR\",\n  1262: \" 13MWRMRX ROPPORLTOUP RPORMTO\",\n  1263: \" 13I[POOPLROTPU ROPMROT RMRXR\",\n  1264: \" 13MWRLRW ROTPURXTUUT RPURWTU\",\n  1265: \" 37KYVSUPSOQOOPNQMSMUNWPXRXTWUVVTWQWNVLTKQKPLQLRK RQOOQNSNVPX RRXTVUTVQVNULTK\",\n  1266: \" 15JZLKRX RMKRV RXKRX RLKXK RNLWL\",\n  1267: \" 10G[IOLORW RKORX R[FRX\",\n  1268: \" 26I[XIXJYJYIXHVHTJSLROQUPYO[ RUITKSORUQXPZN\\\\L\\\\K[KZLZL[\",\n  1269: \" 40I[XIXJYJYIXHVHTJSLROQUPYO[ RUITKSORUQXPZN\\\\L\\\\K[KZLZL[ RQNOONQNSOUQVSVUUVSVQUOSNQN\",\n  1270: \" 26H\\\\ZRYTWUVUTTSSQPPONNMNKOJQJRKTMUNUPTQSSPTOVNWNYOZQZR\",\n  1271: \" 26JZXKLX ROKPLPNOOMOLNLLMKOKSLVLXK RUTTUTWUXWXXWXUWTUT\",\n  1272: \" 41J[YPXPXQYQYPXOWOVPUTTVSWQXOXMWLVLTMSORRPSNSLRKPKOLONPQUWWXXXYW ROXMVMTOR RONPPVWWX\",\n  1273: \" 29J[UPSOQOPQPRQTSTUS RUOUSVTXTYRYQXNVLSKRKOLMNLQLRMUOWRXSXVW\",\n  1274: \" 34KZQHQ\\\\ RTHT\\\\ RWLVLVMWMWLUKPKNLNNOPVSWT RNNOOVRWTWVVWTXQXOWNVNUOUOVNV\",\n  1275: \" 12KYRKN\\\\ RVKR\\\\ RNQWQ RMVVV\",\n  1276: \" 40LXTLSLSMTMTLSKQKPLPNQPTRUS RPNQOTQUSUUSW RQPOROTPVSXTY ROTPUSWTYT[S\\\\Q\\\\P[PZQZQ[P[\",\n  1277: \" 29LXRKQLRMSLRK RRMRQ RRQQSRVSSRQ RRVR\\\\ RPOONNOOPPOTOUNVOUPTO\",\n  1278: \" 42LXRMSLRKQLRMRQQRSURV RRQSRQURVRZQ[R\\\\S[RZ RPOONNOOPPOTOUNVOUPTO RPXOWNXOYPXTXUWVXUYTX\",\n  1279: \" 12LYVKVX RNKVK RQQVQ RNXVX\",\n  1281: \" 24H\\\\QKNLLNKQKSLVNXQYSYVXXVYSYQXNVLSKQK RRQQRRSSRRQ\",\n  1282: \" 33LYQKPLPMQN RTKULUMTN RRNPOOQORPTRUSUUTVRVQUOSNRN RRURY RSUSY ROWVW\",\n  1283: \" 23LYRKPLONOOPQRRSRUQVOVNULSKRK RRRRX RSRSX ROUVU\",\n  1284: \" 24H\\\\QKNLLNKQKSLVNXQYSYVXXVYSYQXNVLSKQK RRKRY RKRYR\",\n  1285: \" 25JYRRPQOQMRLTLUMWOXPXRWSUSTRR RWMRR RRMWMWR RRMVNWR\",\n  1286: \" 25JZLLMKOKQLRNRPQRPSNT ROKPLQNQQPS RVKUX RWKTX RNTXT\",\n  1287: \" 27JYNKNU ROKNR RNROPQOSOUPVQVTTVTXUYVYWX RSOUQUTTV RLKOK\",\n  1288: \" 27LYONRKRQ RVNSKSQ RRQPROTOUPWRXSXUWVUVTURSQ RRTRUSUSTRT\",\n  1289: \" 27JZRKRY RMKMPNRPSTSVRWPWK RLMMKNM RQMRKSM RVMWKXM ROVUV\",\n  1290: \" 27JYNKNX ROKOX RLKSKVLWNWOVQSROR RSKULVNVOUQSR RLXVXVUUX\",\n  1291: \" 20LYWKTKQLONNQNSOVQXTYWY RWKTLRNQQQSRVTXWY\",\n  1292: \" 23JZRRPQOQMRLTLUMWOXPXRWSUSTRR RSLQQ RWMRR RXQSS\",\n  1293: \" 12KYPMTW RTMPW RMPWT RWPMT\",\n  1294: \" 34J[OUMULVLXMYOYPXPVNTMRMONMOLQKTKVLWMXOXRWTUVUXVYXYYXYVXUVU RNMPLULWM\",\n  1295: \" 34J[OOMOLNLLMKOKPLPNNPMRMUNWOXQYTYVXWWXUXRWPUNULVKXKYLYNXOVO RNWPXUXWW\",\n  1401: \" 21F^KHK\\\\ RLHL\\\\ RXHX\\\\ RYHY\\\\ RHH\\\\H RH\\\\O\\\\ RU\\\\\\\\\\\\\",\n  1402: \" 20H]KHRQJ\\\\ RJHQQ RJHYHZMXH RK[X[ RJ\\\\Y\\\\ZWX\\\\\",\n  1403: \" 20KYVBTDRGPKOPOTPYR]T`Vb RTDRHQKPPPTQYR\\\\T`\",\n  1404: \" 20KYNBPDRGTKUPUTTYR]P`Nb RPDRHSKTPTTSYR\\\\P`\",\n  1405: \" 12KYOBOb RPBPb ROBVB RObVb\",\n  1406: \" 12KYTBTb RUBUb RNBUB RNbUb\",\n  1407: \" 40KYTBRCQDPFPHQJRKSMSOQQ RRCQEQGRISJTLTNSPORSTTVTXSZR[Q]Q_Ra RQSSUSWRYQZP\\\\P^Q`RaTb\",\n  1408: \" 40KYPBRCSDTFTHSJRKQMQOSQ RRCSESGRIQJPLPNQPURQTPVPXQZR[S]S_Ra RSSQUQWRYSZT\\\\T^S`RaPb\",\n  1409: \" 24KYU@RCPFOIOLPOSVTYT\\\\S_Ra RRCQEPHPKQNTUUXU[T^RaOd\",\n  1410: \" 24KYO@RCTFUIULTOQVPYP\\\\Q_Ra RRCSETHTKSNPUOXO[P^RaUd\",\n  1411: \" 13AXCRGRR` RGSRa RFSRb RX:Rb\",\n  1412: \" 32F^[CZD[E\\\\D\\\\C[BYBWCUETGSJRNPZO^N` RVDUFTJRVQZP]O_MaKbIbHaH`I_J`Ia\",\n  2001: \" 18H\\\\RFK[ RRFY[ RRIX[ RMUVU RI[O[ RU[[[\",\n  2002: \" 45G]LFL[ RMFM[ RIFUFXGYHZJZLYNXOUP RUFWGXHYJYLXNWOUP RMPUPXQYRZTZWYYXZU[I[ RUPWQXRYTYWXYWZU[\",\n  2003: \" 32G\\\\XIYLYFXIVGSFQFNGLIKKJNJSKVLXNZQ[S[VZXXYV RQFOGMILKKNKSLVMXOZQ[\",\n  2004: \" 30G]LFL[ RMFM[ RIFSFVGXIYKZNZSYVXXVZS[I[ RSFUGWIXKYNYSXVWXUZS[\",\n  2005: \" 22G\\\\LFL[ RMFM[ RSLST RIFYFYLXF RMPSP RI[Y[YUX[\",\n  2006: \" 20G[LFL[ RMFM[ RSLST RIFYFYLXF RMPSP RI[P[\",\n  2007: \" 40G^XIYLYFXIVGSFQFNGLIKKJNJSKVLXNZQ[S[VZXX RQFOGMILKKNKSLVMXOZQ[ RXSX[ RYSY[ RUS\\\\S\",\n  2008: \" 27F^KFK[ RLFL[ RXFX[ RYFY[ RHFOF RUF\\\\F RLPXP RH[O[ RU[\\\\[\",\n  2009: \" 12MXRFR[ RSFS[ ROFVF RO[V[\",\n  2010: \" 20KZUFUWTZR[P[NZMXMVNUOVNW RTFTWSZR[ RQFXF\",\n  2011: \" 27F\\\\KFK[ RLFL[ RYFLS RQOY[ RPOX[ RHFOF RUF[F RH[O[ RU[[[\",\n  2012: \" 14I[NFN[ ROFO[ RKFRF RK[Z[ZUY[\",\n  2013: \" 30F_KFK[ RLFRX RKFR[ RYFR[ RYFY[ RZFZ[ RHFLF RYF]F RH[N[ RV[][\",\n  2014: \" 21G^LFL[ RMFYY RMHY[ RYFY[ RIFMF RVF\\\\F RI[O[\",\n  2015: \" 44G]QFNGLIKKJOJRKVLXNZQ[S[VZXXYVZRZOYKXIVGSFQF RQFOGMILKKOKRLVMXOZQ[ RS[UZWXXVYRYOXKWIUGSF\",\n  2016: \" 29G]LFL[ RMFM[ RIFUFXGYHZJZMYOXPUQMQ RUFWGXHYJYMXOWPUQ RI[P[\",\n  2017: \" 64G]QFNGLIKKJOJRKVLXNZQ[S[VZXXYVZRZOYKXIVGSFQF RQFOGMILKKOKRLVMXOZQ[ RS[UZWXXVYRYOXKWIUGSF RNYNXOVQURUTVUXV_W`Y`Z^Z] RUXV\\\\W^X_Y_Z^\",\n  2018: \" 45G]LFL[ RMFM[ RIFUFXGYHZJZLYNXOUPMP RUFWGXHYJYLXNWOUP RI[P[ RRPTQURXYYZZZ[Y RTQUSWZX[Z[[Y[X\",\n  2019: \" 34H\\\\XIYFYLXIVGSFPFMGKIKKLMMNOOUQWRYT RKKMMONUPWQXRYTYXWZT[Q[NZLXKUK[LX\",\n  2020: \" 16I\\\\RFR[ RSFS[ RLFKLKFZFZLYF RO[V[\",\n  2021: \" 23F^KFKULXNZQ[S[VZXXYUYF RLFLUMXOZQ[ RHFOF RVF\\\\F\",\n  2022: \" 15H\\\\KFR[ RLFRX RYFR[ RIFOF RUF[F\",\n  2023: \" 24F^JFN[ RKFNV RRFN[ RRFV[ RSFVV RZFV[ RGFNF RWF]F\",\n  2024: \" 21H\\\\KFX[ RLFY[ RYFK[ RIFOF RUF[F RI[O[ RU[[[\",\n  2025: \" 20H]KFRQR[ RLFSQS[ RZFSQ RIFOF RVF\\\\F RO[V[\",\n  2026: \" 16H\\\\XFK[ RYFL[ RLFKLKFYF RK[Y[YUX[\",\n  2027: \" 18H\\\\RFK[ RRFY[ RRIX[ RMUVU RI[O[ RU[[[\",\n  2028: \" 45G]LFL[ RMFM[ RIFUFXGYHZJZLYNXOUP RUFWGXHYJYLXNWOUP RMPUPXQYRZTZWYYXZU[I[ RUPWQXRYTYWXYWZU[\",\n  2029: \" 14I[NFN[ ROFO[ RKFZFZLYF RK[R[\",\n  2030: \" 15H\\\\RFJ[ RRFZ[ RRIY[ RKZYZ RJ[Z[\",\n  2031: \" 22G\\\\LFL[ RMFM[ RSLST RIFYFYLXF RMPSP RI[Y[YUX[\",\n  2032: \" 16H\\\\XFK[ RYFL[ RLFKLKFYF RK[Y[YUX[\",\n  2033: \" 27F^KFK[ RLFL[ RXFX[ RYFY[ RHFOF RUF\\\\F RLPXP RH[O[ RU[\\\\[\",\n  2034: \" 56G]QFNGLIKKJOJRKVLXNZQ[S[VZXXYVZRZOYKXIVGSFQF RQFOGMILKKOKRLVMXOZQ[ RS[UZWXXVYRYOXKWIUGSF ROMOT RUMUT ROPUP ROQUQ\",\n  2035: \" 12MXRFR[ RSFS[ ROFVF RO[V[\",\n  2036: \" 27F\\\\KFK[ RLFL[ RYFLS RQOY[ RPOX[ RHFOF RUF[F RH[O[ RU[[[\",\n  2037: \" 15H\\\\RFK[ RRFY[ RRIX[ RI[O[ RU[[[\",\n  2038: \" 30F_KFK[ RLFRX RKFR[ RYFR[ RYFY[ RZFZ[ RHFLF RYF]F RH[N[ RV[][\",\n  2039: \" 21G^LFL[ RMFYY RMHY[ RYFY[ RIFMF RVF\\\\F RI[O[\",\n  2040: \" 36G]KEJJ RZEYJ RONNS RVNUS RKWJ\\\\ RZWY\\\\ RKGYG RKHYH ROPUP ROQUQ RKYYY RKZYZ\",\n  2041: \" 44G]QFNGLIKKJOJRKVLXNZQ[S[VZXXYVZRZOYKXIVGSFQF RQFOGMILKKOKRLVMXOZQ[ RS[UZWXXVYRYOXKWIUGSF\",\n  2042: \" 21F^KFK[ RLFL[ RXFX[ RYFY[ RHF\\\\F RH[O[ RU[\\\\[\",\n  2043: \" 29G]LFL[ RMFM[ RIFUFXGYHZJZMYOXPUQMQ RUFWGXHYJYMXOWPUQ RI[P[\",\n  2044: \" 20H]KFRPJ[ RJFQP RJFYFZLXF RKZXZ RJ[Y[ZUX[\",\n  2045: \" 16I\\\\RFR[ RSFS[ RLFKLKFZFZLYF RO[V[\",\n  2046: \" 33I\\\\KKKILGMFOFPGQIRMR[ RKIMGOGQI RZKZIYGXFVFUGTISMS[ RZIXGVGTI RO[V[\",\n  2047: \" 48H]RFR[ RSFS[ RPKMLLMKOKRLTMUPVUVXUYTZRZOYMXLUKPK RPKNLMMLOLRMTNUPV RUVWUXTYRYOXMWLUK ROFVF RO[V[\",\n  2048: \" 21H\\\\KFX[ RLFY[ RYFK[ RIFOF RUF[F RI[O[ RU[[[\",\n  2049: \" 41G^RFR[ RSFS[ RIMJLLMMQNSOTQU RJLKMLQMSNTQUTUWTXSYQZM[L RTUVTWSXQYM[L\\\\M ROFVF RO[V[\",\n  2050: \" 43G]JXK[O[MWKSJPJLKIMGPFTFWGYIZLZPYSWWU[Y[ZX RMWLTKPKLLINGPF RTFVGXIYLYPXTWW RKZNZ RVZYZ\",\n  2051: \" 18H\\\\UFH[ RUFV[ RTHU[ RLUUU RF[L[ RR[X[\",\n  2052: \" 41F^OFI[ RPFJ[ RLFWFZG[I[KZNYOVP RWFYGZIZKYNXOVP RMPVPXQYSYUXXVZR[F[ RVPWQXSXUWXUZR[\",\n  2053: \" 34H]ZH[H\\\\F[L[JZHYGWFTFQGOIMLLOKSKVLYMZP[S[UZWXXV RTFRGPINLMOLSLVMYNZP[\",\n  2054: \" 30F]OFI[ RPFJ[ RLFUFXGYHZKZOYSWWUYSZO[F[ RUFWGXHYKYOXSVWTYRZO[\",\n  2055: \" 22F]OFI[ RPFJ[ RTLRT RLF[FZLZF RMPSP RF[U[WVT[\",\n  2056: \" 20F\\\\OFI[ RPFJ[ RTLRT RLF[FZLZF RMPSP RF[M[\",\n  2057: \" 42H^ZH[H\\\\F[L[JZHYGWFTFQGOIMLLOKSKVLYMZP[R[UZWXYT RTFRGPINLMOLSLVMYNZP[ RR[TZVXXT RUT\\\\T\",\n  2058: \" 27E_NFH[ ROFI[ R[FU[ R\\\\FV[ RKFRF RXF_F RLPXP RE[L[ RR[Y[\",\n  2059: \" 12LYUFO[ RVFP[ RRFYF RL[S[\",\n  2060: \" 21I[XFSWRYQZO[M[KZJXJVKULVKW RWFRWQYO[ RTF[F\",\n  2061: \" 27F]OFI[ RPFJ[ R]FLS RSOW[ RROV[ RLFSF RYF_F RF[M[ RS[Y[\",\n  2062: \" 14H\\\\QFK[ RRFL[ RNFUF RH[W[YUV[\",\n  2063: \" 30E`NFH[ RNFO[ ROFPY R\\\\FO[ R\\\\FV[ R]FW[ RKFOF R\\\\F`F RE[K[ RS[Z[\",\n  2064: \" 21F_OFI[ ROFVX ROIV[ R\\\\FV[ RLFOF RYF_F RF[L[\",\n  2065: \" 42G]SFPGNILLKOJSJVKYLZN[Q[TZVXXUYRZNZKYHXGVFSF RSFQGOIMLLOKSKVLYN[ RQ[SZUXWUXRYNYKXHVF\",\n  2066: \" 27F]OFI[ RPFJ[ RLFXF[G\\\\I\\\\K[NYPUQMQ RXFZG[I[KZNXPUQ RF[M[\",\n  2067: \" 61G]SFPGNILLKOJSJVKYLZN[Q[TZVXXUYRZNZKYHXGVFSF RSFQGOIMLLOKSKVLYN[ RQ[SZUXWUXRYNYKXHVF RLYLXMVOUPURVSXS_T`V`W^W] RSXT^U_V_W^\",\n  2068: \" 42F^OFI[ RPFJ[ RLFWFZG[I[KZNYOVPMP RWFYGZIZKYNXOVP RRPTQURVZW[Y[ZYZX RURWYXZYZZY RF[M[\",\n  2069: \" 35G^ZH[H\\\\F[L[JZHYGVFRFOGMIMKNMONVRXT RMKOMVQWRXTXWWYVZS[O[LZKYJWJUI[JYKY\",\n  2070: \" 16H]UFO[ RVFP[ ROFLLNF]F\\\\L\\\\F RL[S[\",\n  2071: \" 25F_NFKQJUJXKZN[R[UZWXXU\\\\F ROFLQKUKXLZN[ RKFRF RYF_F\",\n  2072: \" 15H\\\\NFO[ ROFPY R\\\\FO[ RLFRF RXF^F\",\n  2073: \" 24E_MFK[ RNFLY RUFK[ RUFS[ RVFTY R]FS[ RJFQF RZF`F\",\n  2074: \" 21G]NFU[ ROFV[ R\\\\FH[ RLFRF RXF^F RF[L[ RR[X[\",\n  2075: \" 20H]NFRPO[ ROFSPP[ R]FSP RLFRF RYF_F RL[S[\",\n  2076: \" 16G][FH[ R\\\\FI[ ROFLLNF\\\\F RH[V[XUU[\",\n  2077: \" 46H\\\\KILKXWYYY[ RLLXX RKIKKLMXYY[ RPPLTKVKXLZK[ RKVMZ RLTLVMXMZK[ RSSXN RVIVLWNYNYLWKVI RVIWLYN\",\n  2101: \" 39I]NONPMPMONNPMTMVNWOXQXXYZZ[ RWOWXXZZ[[[ RWQVRPSMTLVLXMZP[S[UZWX RPSNTMVMXNZP[\",\n  2102: \" 33G\\\\LFL[ RMFM[ RMPONQMSMVNXPYSYUXXVZS[Q[OZMX RSMUNWPXSXUWXUZS[ RIFMF\",\n  2103: \" 28H[WPVQWRXQXPVNTMQMNNLPKSKULXNZQ[S[VZXX RQMONMPLSLUMXOZQ[\",\n  2104: \" 36H]WFW[ RXFX[ RWPUNSMQMNNLPKSKULXNZQ[S[UZWX RQMONMPLSLUMXOZQ[ RTFXF RW[[[\",\n  2105: \" 31H[LSXSXQWOVNTMQMNNLPKSKULXNZQ[S[VZXX RWSWPVN RQMONMPLSLUMXOZQ[\",\n  2106: \" 22KXUGTHUIVHVGUFSFQGPIP[ RSFRGQIQ[ RMMUM RM[T[\",\n  2107: \" 60I\\\\QMONNOMQMSNUOVQWSWUVVUWSWQVOUNSMQM RONNPNTOV RUVVTVPUN RVOWNYMYNWN RNUMVLXLYM[P\\\\U\\\\X]Y^ RLYMZP[U[X\\\\Y^Y_XaUbObLaK_K^L\\\\O[\",\n  2108: \" 28G]LFL[ RMFM[ RMPONRMTMWNXPX[ RTMVNWPW[ RIFMF RI[P[ RT[[[\",\n  2109: \" 18MXRFQGRHSGRF RRMR[ RSMS[ ROMSM RO[V[\",\n  2110: \" 25MXSFRGSHTGSF RTMT_SaQbObNaN`O_P`Oa RSMS_RaQb RPMTM\",\n  2111: \" 27G\\\\LFL[ RMFM[ RWMMW RRSX[ RQSW[ RIFMF RTMZM RI[P[ RT[Z[\",\n  2112: \" 12MXRFR[ RSFS[ ROFSF RO[V[\",\n  2113: \" 44BcGMG[ RHMH[ RHPJNMMOMRNSPS[ ROMQNRPR[ RSPUNXMZM]N^P^[ RZM\\\\N]P][ RDMHM RD[K[ RO[V[ RZ[a[\",\n  2114: \" 28G]LML[ RMMM[ RMPONRMTMWNXPX[ RTMVNWPW[ RIMMM RI[P[ RT[[[\",\n  2115: \" 36H\\\\QMNNLPKSKULXNZQ[S[VZXXYUYSXPVNSMQM RQMONMPLSLUMXOZQ[ RS[UZWXXUXSWPUNSM\",\n  2116: \" 36G\\\\LMLb RMMMb RMPONQMSMVNXPYSYUXXVZS[Q[OZMX RSMUNWPXSXUWXUZS[ RIMMM RIbPb\",\n  2117: \" 33H\\\\WMWb RXMXb RWPUNSMQMNNLPKSKULXNZQ[S[UZWX RQMONMPLSLUMXOZQ[ RTb[b\",\n  2118: \" 23IZNMN[ ROMO[ ROSPPRNTMWMXNXOWPVOWN RKMOM RK[R[\",\n  2119: \" 32J[WOXMXQWOVNTMPMNNMOMQNRPSUUWVXW RMPNQPRUTWUXVXYWZU[Q[OZNYMWM[NY\",\n  2120: \" 16KZPFPWQZS[U[WZXX RQFQWRZS[ RMMUM\",\n  2121: \" 28G]LMLXMZP[R[UZWX RMMMXNZP[ RWMW[ RXMX[ RIMMM RTMXM RW[[[\",\n  2122: \" 15I[LMR[ RMMRY RXMR[ RJMPM RTMZM\",\n  2123: \" 24F^JMN[ RKMNX RRMN[ RRMV[ RSMVX RZMV[ RGMNM RWM]M\",\n  2124: \" 21H\\\\LMW[ RMMX[ RXML[ RJMPM RTMZM RJ[P[ RT[Z[\",\n  2125: \" 22H[LMR[ RMMRY RXMR[P_NaLbKbJaK`La RJMPM RTMZM\",\n  2126: \" 16I[WML[ RXMM[ RMMLQLMXM RL[X[XWW[\",\n  2127: \" 40G^QMNNLPKRJUJXKZN[P[RZUWWTYPZM RQMONMPLRKUKXLZN[ RQMSMUNVPXXYZZ[ RSMTNUPWXXZZ[[[\",\n  2128: \" 57G\\\\TFQGOIMMLPKTJZIb RTFRGPINMMPLTKZJb RTFVFXGYHYKXMWNTOPO RVFXHXKWMVNTO RPOTPVRWTWWVYUZR[P[NZMYLV RPOSPURVTVWUYTZR[\",\n  2129: \" 28H\\\\IPKNMMOMQNROSRSVRZOb RJOLNPNRO RZMYPXRSYP^Nb RYMXPWRSY\",\n  2130: \" 44I\\\\VNTMRMONMQLTLWMYNZP[R[UZWWXTXQWOSJRHRFSEUEWFYH RRMPNNQMTMXNZ RR[TZVWWTWPVNTKSISGTFVFYH\",\n  2131: \" 32I[XPVNTMPMNNNPPRSS RPMONOPQRSS RSSNTLVLXMZP[S[UZWX RSSOTMVMXNZP[\",\n  2132: \" 31I[TFRGQHQIRJUKZKZJWKSMPOMRLULWMYP[S]T_TaSbQbPa RULQONRMUMWNYP[\",\n  2133: \" 32G]HQIOKMNMONOPNTL[ RMMNNNPMTK[ RNTPPRNTMVMXNYOYRXWUb RVMXOXRWWTb\",\n  2134: \" 44F]GQHOJMMMNNNPMUMXNZO[ RLMMNMPLULXMZO[Q[SZUXWUXRYMYIXGVFTFRHRJSMUPWRZT RSZUWVUWRXMXIWGVF\",\n  2135: \" 15LXRMPTOXOZP[S[UYVW RSMQTPXPZQ[\",\n  2136: \" 29H\\\\NMJ[ ROMK[ RXMYNZNYMWMUNQROSMS ROSQTSZT[ ROSPTRZS[U[WZYW\",\n  2137: \" 23H\\\\KFMFOGPHQJWXXZY[ RMFOHPJVXWZY[Z[ RRMJ[ RRMK[\",\n  2138: \" 28F]MMGb RNMHb RMPLVLYN[P[RZTXVU RXMUXUZV[Y[[Y\\\\W RYMVXVZW[\",\n  2139: \" 24H\\\\NML[ ROMNSMXL[ RYMXQVU RZMYPXRVUTWQYOZL[ RKMOM\",\n  2140: \" 45IZTFRGQHQIRJUKXK RUKQLOMNONQPSSTVT RUKRLPMOOOQQSST RSTOUMVLXLZN\\\\S^T_TaRbPb RSTPUNVMXMZO\\\\S^\",\n  2141: \" 32I[RMONMQLTLWMYNZP[R[UZWWXTXQWOVNTMRM RRMPNNQMTMXNZ RR[TZVWWTWPVN\",\n  2142: \" 22G]PNL[ RPNM[ RVNV[ RVNW[ RIPKNNM[M RIPKONN[N\",\n  2143: \" 31H[LVMYNZP[R[UZWWXTXQWOVNTMRMONMQLTHb RR[TZVWWTWPVN RRMPNNQMTIb\",\n  2144: \" 35H][MQMNNLQKTKWLYMZO[Q[TZVWWTWQVOUNSM RQMONMQLTLXMZ RQ[SZUWVTVPUN RUN[N\",\n  2145: \" 16H\\\\SNP[ RSNQ[ RJPLNOMZM RJPLOONZN\",\n  2146: \" 31H\\\\IQJOLMOMPNPPNVNYP[ RNMONOPMVMYNZP[Q[TZVXXUYRYOXMWNXOYR RXUYO\",\n  2147: \" 37G]ONMOKQJTJWKYLZN[Q[TZWXYUZRZOXMVMTORSPXMb RJWLYNZQZTYWWYU RZOXNVNTPRSPYNb\",\n  2148: \" 23I[KMMMONPPU_VaWb RMMNNOPT_UaWbYb RZMYOWRM]K`Jb\",\n  2149: \" 34F]UFOb RVFNb RGQHOJMMMNNNPMUMXOZRZTYWVYS RLMMNMPLULXMZO[R[TZVXXUYS[M\",\n  2150: \" 44F]JQLOONNMLNJQITIWJZK[M[OZQWRT RIWJYKZMZOYQW RQTQWRZS[U[WZYWZTZQYNXMWNYOZQ RQWRYSZUZWYYW\",\n  2151: \" 39H]XMVTUXUZV[Y[[Y\\\\W RYMWTVXVZW[ RVTVQUNSMQMNNLQKTKWLYMZO[Q[SZUWVT RQMONMQLTLXMZ\",\n  2152: \" 36H[PFLSLVMYNZ RQFMS RMSNPPNRMTMVNWOXQXTWWUZR[P[NZMWMS RVNWPWTVWTZR[ RMFQF\",\n  2153: \" 25I[WPWQXQXPWNUMRMONMQLTLWMYNZP[R[UZWW RRMPNNQMTMXNZ\",\n  2154: \" 42H]ZFVTUXUZV[Y[[Y\\\\W R[FWTVXVZW[ RVTVQUNSMQMNNLQKTKWLYMZO[Q[SZUWVT RQMONMQLTLXMZ RWF[F\",\n  2155: \" 26I[MVQUTTWRXPWNUMRMONMQLTLWMYNZP[R[UZWX RRMPNNQMTMXNZ\",\n  2156: \" 35KZZGYHZI[H[GZFXFVGUHTJSMP[O_Na RXFVHUJTNRWQ[P^O`NaLbJbIaI`J_K`Ja ROMYM\",\n  2157: \" 43H\\\\YMU[T^RaObLbJaI`I_J^K_J` RXMT[S^QaOb RVTVQUNSMQMNNLQKTKWLYMZO[Q[SZUWVT RQMONMQLTLXMZ\",\n  2158: \" 31H]PFJ[ RQFK[ RMTOPQNSMUMWNXOXQVWVZW[ RUMWOWQUWUZV[Y[[Y\\\\W RMFQF\",\n  2159: \" 26LYUFTGUHVGUF RMQNOPMSMTNTQRWRZS[ RRMSNSQQWQZR[U[WYXW\",\n  2160: \" 32LYVFUGVHWGVF RNQOOQMTMUNUQR[Q^P`OaMbKbJaJ`K_L`Ka RSMTNTQQ[P^O`Mb\",\n  2161: \" 34H\\\\PFJ[ RQFK[ RXNWOXPYOYNXMWMUNQROSMS ROSQTSZT[ ROSPTRZS[U[WZYW RMFQF\",\n  2162: \" 18MYUFQTPXPZQ[T[VYWW RVFRTQXQZR[ RRFVF\",\n  2163: \" 52AbBQCOEMHMINIPHTF[ RGMHNHPGTE[ RHTJPLNNMPMRNSOSQP[ RPMRORQO[ RRTTPVNXMZM\\\\N]O]Q[W[Z\\\\[ RZM\\\\O\\\\QZWZZ[[^[`YaW\",\n  2164: \" 37F]GQHOJMMMNNNPMTK[ RLMMNMPLTJ[ RMTOPQNSMUMWNXOXQVWVZW[ RUMWOWQUWUZV[Y[[Y\\\\W\",\n  2165: \" 32I[RMONMQLTLWMYNZP[R[UZWWXTXQWOVNTMRM RRMPNNQMTMXNZ RR[TZVWWTWPVN\",\n  2166: \" 42G\\\\HQIOKMNMONOPNTJb RMMNNNPMTIb RNTOQQNSMUMWNXOYQYTXWVZS[Q[OZNWNT RWNXPXTWWUZS[ RFbMb\",\n  2167: \" 33H\\\\XMRb RYMSb RVTVQUNSMQMNNLQKTKWLYMZO[Q[SZUWVT RQMONMQLTLXMZ RObVb\",\n  2168: \" 26IZJQKOMMPMQNQPPTN[ ROMPNPPOTM[ RPTRPTNVMXMYNYOXPWOXN\",\n  2169: \" 28J[XOXPYPYOXNUMRMONNONQORVVWW RNPOQVUWVWYVZS[P[MZLYLXMXMY\",\n  2170: \" 18KYTFPTOXOZP[S[UYVW RUFQTPXPZQ[ RNMWM\",\n  2171: \" 37F]GQHOJMMMNNNQLWLYN[ RLMMNMQKWKYLZN[P[RZTXVT RXMVTUXUZV[Y[[Y\\\\W RYMWTVXVZW[\",\n  2172: \" 26H\\\\IQJOLMOMPNPQNWNYP[ RNMONOQMWMYNZP[Q[TZVXXUYQYMXMYO\",\n  2173: \" 41C`DQEOGMJMKNKQIWIYK[ RIMJNJQHWHYIZK[M[OZQXRV RTMRVRYSZU[W[YZ[X\\\\V]R]M\\\\M]O RUMSVSYU[\",\n  2174: \" 42H\\\\KQMNOMRMSOSR RQMRORRQVPXNZL[K[JZJYKXLYKZ RQVQYR[U[WZYW RYNXOYPZOZNYMXMVNTPSRRVRYS[\",\n  2175: \" 41G\\\\HQIOKMNMONOQMWMYO[ RMMNNNQLWLYMZO[Q[SZUXWT RZMV[U^SaPbMbKaJ`J_K^L_K` RYMU[T^RaPb\",\n  2176: \" 31H\\\\YMXOVQNWLYK[ RLQMOOMRMVO RMOONRNVOXO RLYNYRZUZWY RNYR[U[WYXW\",\n  2177: \" 43G^VGUHVIWHWGUFRFOGMILLL[ RRFPGNIMLM[ R\\\\G[H\\\\I]H]G\\\\FZFXGWIW[ RZFYGXIX[ RIM[M RI[P[ RT[[[\",\n  2178: \" 33G]WGVHWIXHWGUFRFOGMILLL[ RRFPGNIMLM[ RWMW[ RXMX[ RIMXM RI[P[ RT[[[\",\n  2179: \" 35G]VGUHVIWHWGUF RXFRFOGMILLL[ RRFPGNIMLM[ RWHW[ RXFX[ RIMWM RI[P[ RT[[[\",\n  2180: \" 54BcRGQHRISHRGPFMFJGHIGLG[ RMFKGIIHLH[ R]G\\\\H]I^H]G[FXFUGSIRLR[ RXFVGTISLS[ R]M][ R^M^[ RDM^M RD[K[ RO[V[ RZ[a[\",\n  2181: \" 56BcRGQHRISHRGPFMFJGHIGLG[ RMFKGIIHLH[ R\\\\G[H\\\\I]H]G[F R^FXFUGSIRLR[ RXFVGTISLS[ R]H][ R^F^[ RDM]M RD[K[ RO[V[ RZ[a[\",\n  2182: \" 12MXRMR[ RSMS[ ROMSM RO[V[\",\n  2184: \" 25IZWNUMRMONMPLSLVMYNZQ[T[VZ RRMPNNPMSMVNYOZQ[ RMTUT\",\n  2185: \" 43I\\\\TFQGOJNLMOLTLXMZO[Q[TZVWWUXRYMYIXGVFTF RTFRGPJOLNOMTMXNZO[ RQ[SZUWVUWRXMXIWGVF RNPWP\",\n  2186: \" 42G]UFOb RVFNb RQMMNKPJSJVKXMZP[S[WZYXZUZRYPWNTMQM RQMNNLPKSKVLXNZP[ RS[VZXXYUYRXPVNTM\",\n  2187: \" 27I[TMVNXPXOWNTMQMNNMOLQLSMUOWSZ RQMONNOMQMSNUSZT\\\\T^S_Q_\",\n  2190: \" 45G]LMKNJPJRKUOYP[ RJRKTOXP[P]O`MbLbKaJ_J\\\\KXMTOQRNTMVMYNZPZTYXWZU[T[SZSXTWUXTY RVMXNYPYTXXWZ\",\n  2191: \" 69E_YGXHYIZHYGWFTFQGOINKMNLRJ[I_Ha RTFRGPIOKNNLWK[J^I`HaFbDbCaC`D_E`Da R_G^H_I`H`G_F]F[GZHYJXMU[T_Sa R]F[HZJYNWWV[U^T`SaQbObNaN`O_P`Oa RIM^M\",\n  2192: \" 52F^[GZH[I\\\\H[GXFUFRGPIOKNNMRK[J_Ia RUFSGQIPKONMWL[K^J`IaGbEbDaD`E_F`Ea RYMWTVXVZW[Z[\\\\Y]W RZMXTWXWZX[ RJMZM\",\n  2193: \" 54F^YGXHYIZHZGXF R\\\\FUFRGPIOKNNMRK[J_Ia RUFSGQIPKONMWL[K^J`IaGbEbDaD`E_F`Ea R[FWTVXVZW[Z[\\\\Y]W R\\\\FXTWXWZX[ RJMYM\",\n  2194: \" 86@cTGSHTIUHTGRFOFLGJIIKHNGRE[D_Ca ROFMGKIJKINGWF[E^D`CaAb?b>a>`?_@`?a R`G_H`IaH`G]FZFWGUITKSNRRP[O_Na RZFXGVIUKTNRWQ[P^O`NaLbJbIaI`J_K`Ja R^M\\\\T[X[Z\\\\[_[aYbW R_M]T\\\\X\\\\Z][ RDM_M\",\n  2195: \" 88@cTGSHTIUHTGRFOFLGJIIKHNGRE[D_Ca ROFMGKIJKINGWF[E^D`CaAb?b>a>`?_@`?a R^G]H^I_H_G]F RaFZFWGUITKSNRRP[O_Na RZFXGVIUKTNRWQ[P^O`NaLbJbIaI`J_K`Ja R`F\\\\T[X[Z\\\\[_[aYbW RaF]T\\\\X\\\\Z][ RDM^M\",\n  2196: \" 20LYMQNOPMSMTNTQRWRZS[ RRMSNSQQWQZR[U[WYXW\",\n  2200: \" 40H\\\\QFNGLJKOKRLWNZQ[S[VZXWYRYOXJVGSFQF RQFOGNHMJLOLRMWNYOZQ[ RS[UZVYWWXRXOWJVHUGSF\",\n  2201: \" 11H\\\\NJPISFS[ RRGR[ RN[W[\",\n  2202: \" 45H\\\\LJMKLLKKKJLHMGPFTFWGXHYJYLXNUPPRNSLUKXK[ RTFVGWHXJXLWNTPPR RKYLXNXSZVZXYYX RNXS[W[XZYXYV\",\n  2203: \" 47H\\\\LJMKLLKKKJLHMGPFTFWGXIXLWNTOQO RTFVGWIWLVNTO RTOVPXRYTYWXYWZT[P[MZLYKWKVLUMVLW RWQXTXWWYVZT[\",\n  2204: \" 13H\\\\THT[ RUFU[ RUFJUZU RQ[X[\",\n  2205: \" 39H\\\\MFKP RKPMNPMSMVNXPYSYUXXVZS[P[MZLYKWKVLUMVLW RSMUNWPXSXUWXUZS[ RMFWF RMGRGWF\",\n  2206: \" 48H\\\\WIVJWKXJXIWGUFRFOGMILKKOKULXNZQ[S[VZXXYUYTXQVOSNRNOOMQLT RRFPGNIMKLOLUMXOZQ[ RS[UZWXXUXTWQUOSN\",\n  2207: \" 31H\\\\KFKL RKJLHNFPFUIWIXHYF RLHNGPGUI RYFYIXLTQSSRVR[ RXLSQRSQVQ[\",\n  2208: \" 63H\\\\PFMGLILLMNPOTOWNXLXIWGTFPF RPFNGMIMLNNPO RTOVNWLWIVGTF RPOMPLQKSKWLYMZP[T[WZXYYWYSXQWPTO RPONPMQLSLWMYNZP[ RT[VZWYXWXSWQVPTO\",\n  2209: \" 48H\\\\XMWPURRSQSNRLPKMKLLINGQFSFVGXIYLYRXVWXUZR[O[MZLXLWMVNWMX RQSORMPLMLLMIOGQF RSFUGWIXLXRWVVXTZR[\",\n  2210: \"  6MWRYQZR[SZRY\",\n  2211: \"  8MWR[QZRYSZS\\\\R^Q_\",\n  2212: \" 12MWRMQNROSNRM RRYQZR[SZRY\",\n  2213: \" 14MWRMQNROSNRM RR[QZRYSZS\\\\R^Q_\",\n  2214: \" 15MWRFQHRTSHRF RRHRN RRYQZR[SZRY\",\n  2215: \" 32I[MJNKMLLKLJMHNGPFSFVGWHXJXLWNVORQRT RSFUGVHWJWLVNTP RRYQZR[SZRY\",\n  2216: \"  6NVRFQM RSFQM\",\n  2217: \" 12JZNFMM ROFMM RVFUM RWFUM\",\n  2218: \" 14KYQFOGNINKOMQNSNUMVKVIUGSFQF\",\n  2219: \"  9JZRFRR RMIWO RWIMO\",\n  2220: \"  3G][BIb\",\n  2221: \" 20KYVBTDRGPKOPOTPYR]T`Vb RTDRHQKPPPTQYR\\\\T`\",\n  2222: \" 20KYNBPDRGTKUPUTTYR]P`Nb RPDRHSKTPTTSYR\\\\P`\",\n  2223: \" 12KYOBOb RPBPb ROBVB RObVb\",\n  2224: \" 12KYTBTb RUBUb RNBUB RNbUb\",\n  2225: \" 40KYTBRCQDPFPHQJRKSMSOQQ RRCQEQGRISJTLTNSPORSTTVTXSZR[Q]Q_Ra RQSSUSWRYQZP\\\\P^Q`RaTb\",\n  2226: \" 40KYPBRCSDTFTHSJRKQMQOSQ RRCSESGRIQJPLPNQPURQTPVPXQZR[S]S_Ra RSSQUQWRYSZT\\\\T^S`RaPb\",\n  2227: \"  4KYUBNRUb\",\n  2228: \"  4KYOBVROb\",\n  2229: \"  3NVRBRb\",\n  2230: \"  6KYOBOb RUBUb\",\n  2231: \"  3E_IR[R\",\n  2232: \"  6E_RIR[ RIR[R\",\n  2233: \"  9F^RJR[ RJRZR RJ[Z[\",\n  2234: \"  9F^RJR[ RJJZJ RJRZR\",\n  2235: \"  6G]KKYY RYKKY\",\n  2236: \"  6MWRQQRRSSRRQ\",\n  2237: \" 15E_RIQJRKSJRI RIR[R RRYQZR[SZRY\",\n  2238: \"  6E_IO[O RIU[U\",\n  2239: \"  9E_YIK[ RIO[O RIU[U\",\n  2240: \"  9E_IM[M RIR[R RIW[W\",\n  2241: \"  4F^ZIJRZ[\",\n  2242: \"  4F^JIZRJ[\",\n  2243: \" 10F^ZFJMZT RJVZV RJ[Z[\",\n  2244: \" 10F^JFZMJT RJVZV RJ[Z[\",\n  2245: \" 21F_[WYWWVUTRPQOONMNKOJQJSKUMVOVQURTUPWNYM[M\",\n  2246: \" 24F^IUISJPLONOPPTSVTXTZS[Q RISJQLPNPPQTTVUXUZT[Q[O\",\n  2247: \"  8G]JTROZT RJTRPZT\",\n  2248: \"  7LXTFOL RTFUGOL\",\n  2249: \"  7LXPFUL RPFOGUL\",\n  2250: \" 18H\\\\KFLHNJQKSKVJXHYF RKFLINKQLSLVKXIYF\",\n  2251: \"  8MWRHQGRFSGSIRKQL\",\n  2252: \"  8MWSFRGQIQKRLSKRJ\",\n  2253: \"  8MWRHSGRFQGQIRKSL\",\n  2254: \"  8MWQFRGSISKRLQKRJ\",\n  2255: \" 10E[HMLMRY RKMR[ R[BR[\",\n  2256: \" 13F^ZJSJOKMLKNJQJSKVMXOYSZZZ\",\n  2257: \" 13F^JJJQKULWNYQZSZVYXWYUZQZJ\",\n  2258: \" 13F^JJQJUKWLYNZQZSYVWXUYQZJZ\",\n  2259: \" 13F^JZJSKOLMNKQJSJVKXMYOZSZZ\",\n  2260: \" 16F^ZJSJOKMLKNJQJSKVMXOYSZZZ RJRVR\",\n  2261: \" 11E_XP[RXT RUMZRUW RIRZR\",\n  2262: \" 11JZPLRITL RMORJWO RRJR[\",\n  2263: \" 11E_LPIRLT ROMJROW RJR[R\",\n  2264: \" 11JZPXR[TX RMURZWU RRIRZ\",\n  2265: \" 44I\\\\XRWOVNTMRMONMQLTLWMYNZP[R[UZWXXUYPYKXHWGUFRFPGOHOIPIPH RRMPNNQMTMXNZ RR[TZVXWUXPXKWHUF\",\n  2266: \" 15H\\\\JFR[ RKFRY RZFR[ RJFZF RKGYG\",\n  2267: \" 10AbDMIMRY RHNR[ Rb:R[\",\n  2268: \" 32F^[CZD[E\\\\D\\\\C[BYBWCUETGSJRNPZO^N` RVDUFTJRVQZP]O_MaKbIbHaH`I_J`Ia\",\n  2269: \" 50F^[CZD[E\\\\D\\\\C[BYBWCUETGSJRNPZO^N` RVDUFTJRVQZP]O_MaKbIbHaH`I_J`Ia RQKNLLNKQKSLVNXQYSYVXXVYSYQXNVLSKQK\",\n  2270: \" 26F_\\\\S[UYVWVUUTTQPPONNLNJOIQISJULVNVPUQTTPUOWNYN[O\\\\Q\\\\S\",\n  2271: \" 32F^[FI[ RNFPHPJOLMMKMIKIIJGLFNFPGSHVHYG[F RWTUUTWTYV[X[ZZ[X[VYTWT\",\n  2272: \" 49F_[NZO[P\\\\O\\\\N[MZMYNXPVUTXRZP[M[JZIXIUJSPORMSKSIRGPFNGMIMKNNPQUXWZZ[[[\\\\Z\\\\Y RM[KZJXJUKSMQ RMKNMVXXZZ[\",\n  2273: \" 56E`WNVLTKQKOLNMMPMSNUPVSVUUVS RQKOMNPNSOUPV RWKVSVUXVZV\\\\T]Q]O\\\\L[JYHWGTFQFNGLHJJILHOHRIUJWLYNZQ[T[WZYYZX RXKWSWUXV\",\n  2274: \" 42H\\\\PBP_ RTBT_ RXIWJXKYJYIWGTFPFMGKIKKLMMNOOUQWRYT RKKMMONUPWQXRYTYXWZT[P[MZKXKWLVMWLX\",\n  2275: \" 12H]SFLb RYFRb RLQZQ RKWYW\",\n  2276: \" 46JZUITJUKVJVIUGSFQFOGNINKOMQOVR ROMTPVRWTWVVXTZ RPNNPMRMTNVPXU[ RNVSYU[V]V_UaSbQbOaN_N^O]P^O_\",\n  2277: \" 30JZRFQHRJSHRF RRFRb RRQQTRbSTRQ RLMNNPMNLLM RLMXM RTMVNXMVLTM\",\n  2278: \" 56JZRFQHRJSHRF RRFRT RRPQRSVRXQVSRRP RRTRb RR^Q`RbS`R^ RLMNNPMNLLM RLMXM RTMVNXMVLTM RL[N\\\\P[NZL[ RL[X[ RT[V\\\\X[VZT[\",\n  2279: \" 12I\\\\XFX[ RKFXF RPPXP RK[X[\",\n  2281: \" 38E`QFNGKIILHOHRIUKXNZQ[T[WZZX\\\\U]R]O\\\\LZIWGTFQF RROQPQQRRSRTQTPSORO RRPRQSQSPRP\",\n  2282: \" 45J[PFNGOIQJ RPFOGOI RUFWGVITJ RUFVGVI RQJOKNLMNMQNSOTQUTUVTWSXQXNWLVKTJQJ RRUR[ RSUS[ RNXWX\",\n  2283: \" 27I\\\\RFOGMILLLMMPORRSSSVRXPYMYLXIVGSFRF RRSR[ RSSS[ RNWWW\",\n  2284: \" 28D`PFMGJIHLGOGSHVJYM[P\\\\T\\\\W[ZY\\\\V]S]O\\\\LZIWGTFPF RRFR\\\\ RGQ]Q\",\n  2285: \" 31G`PMMNKPJSJTKWMYPZQZTYVWWTWSVPTNQMPM R]GWG[HUN R]G]M\\\\IVO R\\\\HVN\",\n  2286: \" 28F\\\\IIJGLFOFQGRIRLQOPQNSKU ROFPGQIQMPPNS RVFT[ RWFS[ RKUYU\",\n  2287: \" 30I\\\\MFMU RNFMQ RMQNOONQMTMWNXPXRWTUV RTMVNWPWRTXTZU[W[YY RKFNF\",\n  2288: \" 44I\\\\RNOOMQLTLUMXOZR[S[VZXXYUYTXQVOSNRN RRHNJRFRN RSHWJSFSN RRSQTQURVSVTUTTSSRS RRTRUSUSTRT\",\n  2289: \" 37G^QHRFR[ RTHSFS[ RJHKFKMLPNRQSRS RMHLFLNMQ R[HZFZMYPWRTSSS RXHYFYNXQ RNWWW\",\n  2290: \" 31G]LFL[ RMFM[ RIFUFXGYHZJZMYOXPUQMQ RUFWGXHYJYMXOWPUQ RI[Y[YVX[\",\n  2291: \" 24H[YGUGQHNJLMKPKSLVNYQ[U\\\\Y\\\\ RYGVHSJQMPPPSQVSYV[Y\\\\\",\n  2292: \" 27F_OQMQKRJSIUIWJYKZM[O[QZRYSWSURSQROQ RSHPQ RZJRR R\\\\QST\",\n  2293: \" 12H\\\\OKUY RUKOY RKOYU RYOKU\",\n  2294: \" 48F^NVLUKUIVHXHYI[K\\\\L\\\\N[OYOXNVKRJOJMKJMHPGTGWHYJZMZOYRVVUXUYV[X\\\\Y\\\\[[\\\\Y\\\\X[VYUXUVV RJMKKMIPHTHWIYKZM\",\n  2295: \" 48F^NMLNKNIMHKHJIHKGLGNHOJOKNMKQJTJVKYM[P\\\\T\\\\W[YYZVZTYQVMUKUJVHXGYG[H\\\\J\\\\K[MYNXNVM RJVKXMZP[T[WZYXZV\",\n  2301: \" 40F_JMILIJJHLGNGPHQIRKSP RIJKHMHOIPJQLRPR[ R[M\\\\L\\\\J[HYGWGUHTISKRP R\\\\JZHXHVIUJTLSPS[\",\n  2302: \" 51F^IGJKKMMOPPTPWOYMZK[G RIGJJKLMNPOTOWNYLZJ[G RPONPMQLSLVMXOZQ[S[UZWXXVXSWQVPTO RPPNQMSMVNY RVYWVWSVQTP\",\n  2303: \" 30F^MJMV RNKNU RVKVU RWJWV RIGKIMJPKTKWJYI[G RIYKWMVPUTUWVYW[Y\",\n  2304: \" 48F^[ILIJJILINJPLQNQPPQNQLPJ[J RIMJOKPMQ RQMPKOJMI RIXXXZW[U[SZQXPVPTQSSSUTWIW R[TZRYQWP RSTTVUWWX\",\n  2305: \" 48F]OUMTLTJUIWIXJZL[M[OZPXPWOUJPINIKJILHOGSGWHYJZLZOYRVUUWUYV[X[YZZX RMSKPJNJKKILH RSGVHXJYLYOXRVU\",\n  2306: \" 48G_HKKHMKMV RJILLLV RMKPHRKRU ROIQLQU RRKUHWKW[ RTIVLV[ RWKZH[J\\\\M\\\\P[SZUXWUYP[ RYIZJ[M[PZSYUWWTYP[\",\n  2307: \" 41F^ISMSLRKOKMLJNHQGSGVHXJYMYOXRWS[S RITOTMRLOLMMJOHQG RSGUHWJXMXOWRUT[T RKXYX RKYYY\",\n  2308: \" 30F_GLJIMLMX RIJLMLX RMLPISLSX ROJRMRX RSLVIYLYW[Y RUJXMXXZZ]W\",\n  2309: \" 33G]ZIJY RZIWJQJ RXKUKQJ RZIYLYR RXKXNYR RQRJR RPSMSJR RQRQY RPSPVQY\",\n  2310: \" 33F^HOJKOU RJMOWRPWPZO[M[KZIXHWHUITKTMUPVRWUWXUZ RWHVIUKUMWQXTXWWYUZ\",\n  2311: \" 36F^IOLLPN RKMOORLUN RQMTOWLYN RVMXO[L RIULRPT RKSOURRUT RQSTUWRYT RVSXU[R\",\n  2312: \" 48F^JHNJPLQOQRPUNWJY RJHMIOJQLRO RRRQUOWMXJY RZHWIUJSLRO RRRSUUWWXZY RZHVJTLSOSRTUVWZY RIP[P RIQ[Q\",\n  2317: \" 12NVQQQSSSSQQQ RQQSS RSQQS\",\n  2318: \" 18JZMPQRTTVVWYW[V]U^ RMQST RMRPSTUVWWY\",\n  2319: \" 18JZWKVMTOPQMR RSPMS RUFVGWIWKVNTPQRMT\",\n  2320: \" 36H\\\\SMONLPKRKTLVNWQWUVXTYRYPXNVMSM RXNSM RVMQNLP RONKR RLVQW RNWSVXT RUVYR\",\n  2321: \" 36H\\\\SMONLPKRKTLVNWQWUVXTYRYPXNVMSM RXNSM RVMQNLP RONKR RLVQW RNWSVXT RUVYR\",\n  2322: \" 34J[SMPNNPMRMTNVPWRWUVWTXRXPWNUMSM ROPUM RNRVN RMTWO RNUXP ROVWR RPWVT\",\n  2323: \" 18JZOGO^ RUFU] RMNWL RMOWM RMWWU RMXWV\",\n  2324: \" 18JZNFNX RVLV^ RNNVL RNOVM RNWVU RNXVV\",\n  2325: \" 25JZNBNW RNNQLTLVMWOWQVSSUQVNW RNNQMTMVN RUMVOVQUSSU\",\n  2326: \" 18E_HIHL R\\\\I\\\\L RHI\\\\I RHJ\\\\J RHK\\\\K RHL\\\\L\",\n  2327: \" 18JZMNMQ RWNWQ RMNWN RMOWO RMPWP RMQWQ\",\n  2328: \" 49JZMLWX RMLONQOTOVNWMWKUKUMTO RONTO RQOWM RVKVN RULWL RWXUVSUPUNVMWMYOYOWPU RUVPU RSUMW RNVNY RMXOX\",\n  2329: \" 26JZPOOMOKMKMMNNPOSOUNWL RNKNN RMLOL RMMSO RPOUN RWLWY\",\n  2330: \" 86A^GfHfIeIdHcGcFdFfGhIiKiNhPfQdR`RUQ;Q4R/S-U,V,X-Y/Y3X6W8U;P?JCHEFHEJDNDREVGYJ[N\\\\R\\\\V[XZZW[T[PZMYKWITHPHMIKKJNJRKUMW RGdGeHeHdGd RU;Q?LCIFGIFKENERFVGXJ[ RR\\\\U[WZYWZTZPYMXKVITH\",\n  2331: \"103EfNSOUQVSVUUVSVQUOSNQNOONPMSMVNYP[S\\\\V\\\\Y[[Y\\\\W]T]P\\\\MZJXIUHRHOIMJKLIOHSHXI]KaMcPeTfYf]e`cba RKLJNIRIXJ\\\\L`NbQdUeYe]d_cba RPOTO ROPUP RNQVQ RNRVR RNSVS ROTUT RPUTU RaLaNcNcLaL RbLbN RaMcM RaVaXcXcVaV RbVbX RaWcW\",\n  2332: \" 30D`H@Hd RM@Md RW@Wd R\\\\@\\\\d RMMWK RMNWL RMOWM RMWWU RMXWV RMYWW\",\n  2367: \" 12NVQQQSSSSQQQ RQQSS RSQQS\",\n  2368: \" 18JZMPQRTTVVWYW[V]U^ RMQST RMRPSTUVWWY\",\n  2369: \" 18JZWKVMTOPQMR RSPMS RUFVGWIWKVNTPQRMT\",\n  2370: \" 32H\\\\PMMNLOKQKSLUMVPWTWWVXUYSYQXOWNTMPM RMNLPLSMUNVPW RWVXTXQWOVNTM\",\n  2371: \" 36H\\\\SMONLPKRKTLVNWQWUVXTYRYPXNVMSM RXNSM RVMQNLP RONKR RLVQW RNWSVXT RUVYR\",\n  2372: \" 34J[SMPNNPMRMTNVPWRWUVWTXRXPWNUMSM ROPUM RNRVN RMTWO RNUXP ROVWR RPWVT\",\n  2373: \" 18JZOGO^ RUFU] RMNWL RMOWM RMWWU RMXWV\",\n  2374: \" 18JZNFNX RVLV^ RNNVL RNOVM RNWVU RNXVV\",\n  2375: \" 25JZNBNW RNNQLTLVMWOWQVSSUQVNW RNNQMTMVN RUMVOVQUSSU\",\n  2376: \" 18E_HIHL R\\\\I\\\\L RHI\\\\I RHJ\\\\J RHK\\\\K RHL\\\\L\",\n  2377: \" 18JZMNMQ RWNWQ RMNWN RMOWO RMPWP RMQWQ\",\n  2378: \" 36JZQCVMRTRU RULQS RTITKPRRUUY RW\\\\UYSXQXOYN[N]O_Ra RW\\\\UZSYOYO]P_Ra RSXPZN]\",\n  2379: \" 26JZPOOMOKMKMMNNPOSOUNWL RNKNN RMLOL RMMSO RPOUN RWLSY\",\n  2380: \" 86A^GfHfIeIdHcGcFdFfGhIiKiNhPfQdR`RUQ;Q4R/S-U,V,X-Y/Y3X6W8U;P?JCHEFHEJDNDREVGYJ[N\\\\R\\\\V[XZZW[T[PZMYKWITHPHMIKKJNJRKUMW RGdGeHeHdGd RU;Q?LCIFGIFKENERFVGXJ[ RR\\\\U[WZYWZTZPYMXKVITH\",\n  2381: \" 89IjNQOOQNSNUOVQVSUUSVQVOUNTMQMNNKPISHWH[I^K`NaRaW`[_]]`ZcVfQiMk RWHZI]K_N`R`W_[^]\\\\`YcTgQi RPOTO ROPUP RNQVQ RNRVR RNSVS ROTUT RPUTU ReLeNgNgLeL RfLfN ReMgM ReVeXgXgVeV RfVfX ReWgW\",\n  2382: \" 85D`H>Hf RI>If RM>Mf RQBSBSDQDQAR?T>W>Y?[A\\\\D\\\\I[LYNWOUOSNRLQNOQNROSQVRXSVUUWUYV[X\\\\[\\\\`[cYeWfTfReQcQ`S`SbQb RRBRD RQCSC RY?ZA[D[IZLYN RRLRNPQNRPSRVRX RYVZX[[[`ZcYe RR`Rb RQaSa\",\n  2401: \" 21AcHBHb RIBIb R[B[b R\\\\B\\\\b RDB`B RDbMb RWb`b\",\n  2402: \" 23BaGBQPFb RFBPP REBPQ REB\\\\B^I[B RGa\\\\a RFb\\\\b^[[b\",\n  2403: \" 28I[X+U1R8P=OANFMNMVN^OcPgRlUsXy RU1S6Q<P@OFNNNVO^PdQhSnUs\",\n  2404: \" 28I[L+O1R8T=UAVFWNWVV^UcTgRlOsLy RO1Q6S<T@UFVNVVU^TdShQnOs\",\n  2405: \" 14I[M+MRMy RN+NRNy RM+X+ RMyXy\",\n  2406: \" 14I[V+VRVy RW+WRWy RL+W+ RLyWy\",\n  2407: \" 48I[V+S-Q/P1O4O8P<TDUGUJTMRP RS-Q0P4P8Q;UCVGVJUMRPNRRTUWVZV]UaQiPlPpQtSw RRTTWUZU]T`PhOlOpPsQuSwVy\",\n  2408: \" 48I[N+Q-S/T1U4U8T<PDOGOJPMRP RQ-S0T4T8S;OCNGNJOMRPVRRTOWNZN]OaSiTlTpStQw RRTPWOZO]P`ThUlUpTsSuQwNy\",\n  2409: \" 32I[V.S1Q4O8N=NCOIPMSXT\\\\UbUgTlSoQs RS1Q5P8O=OBPHQLTWU[VaVgUlSpQsNv\",\n  2410: \" 32I[N.Q1S4U8V=VCUITMQXP\\\\ObOgPlQoSs RQ1S5T8U=UBTHSLPWO[NaNgOlQpSsVv\",\n  2411: ' 147Z:RARRo R@RQo R?RRr RZ\"VJRr',\n  2412: \" 57Ca].\\\\.[/[0\\\\1]1^0^.],[+Y+W,U.T0S3R:QJQjPsOv R\\\\/\\\\0]0]/\\\\/ RR:Rj RU.T1S:SZRjQqPtOvMxKyIyGxFvFtGsHsItIuHvGv RGtGuHuHtGt\",\n  2501: \" 20H\\\\RFJ[ RRIK[J[ RRIY[Z[ RRFZ[ RMUWU RLVXV\",\n  2502: \" 44H\\\\LFL[ RMGMZ RLFTFWGXHYJYMXOWPTQ RMGTGWHXJXMWOTP RMPTPWQXRYTYWXYWZT[L[ RMQTQWRXTXWWYTZMZ\",\n  2503: \" 38H]ZKYIWGUFQFOGMILKKNKSLVMXOZQ[U[WZYXZV RZKYKXIWHUGQGOHMKLNLSMVOYQZUZWYXXYVZV\",\n  2504: \" 32H]LFL[ RMGMZ RLFSFVGXIYKZNZSYVXXVZS[L[ RMGSGVHWIXKYNYSXVWXVYSZMZ\",\n  2505: \" 27I\\\\MFM[ RNGNZ RMFYF RNGYGYF RNPTPTQ RNQTQ RNZYZY[ RM[Y[\",\n  2506: \" 21I[MFM[ RNGN[M[ RMFYF RNGYGYF RNPTPTQ RNQTQ\",\n  2507: \" 44H]ZKYIWGUFQFOGMILKKNKSLVMXOZQ[U[WZYXZVZRUR RZKYKXIWHUGQGOHNIMKLNLSMVNXOYQZUZWYXXYVYSUSUR\",\n  2508: \" 22G]KFK[ RKFLFL[K[ RYFXFX[Y[ RYFY[ RLPXP RLQXQ\",\n  2509: \"  8NWRFR[S[ RRFSFS[\",\n  2510: \" 20J[VFVVUYSZQZOYNVMV RVFWFWVVYUZS[Q[OZNYMV\",\n  2511: \" 22H]LFL[M[ RLFMFM[ RZFYFMR RZFMS RPOY[Z[ RQOZ[\",\n  2512: \" 14IZMFM[ RMFNFNZ RNZYZY[ RM[Y[\",\n  2513: \" 26F^JFJ[ RKKK[J[ RKKR[ RJFRX RZFRX RYKR[ RYKY[Z[ RZFZ[\",\n  2514: \" 20G]KFK[ RLIL[K[ RLIY[ RKFXX RXFXX RXFYFY[\",\n  2515: \" 40G]PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF RQGNHLKKNKSLVNYQZSZVYXVYSYNXKVHSGQG\",\n  2516: \" 27H\\\\LFL[ RMGM[L[ RLFUFWGXHYJYMXOWPUQMQ RMGUGWHXJXMWOUPMP\",\n  2517: \" 48G]PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF RQGNHLKKNKSLVNYQZSZVYXVYSYNXKVHSGQG RSXX]Y] RSXTXY]\",\n  2518: \" 34H\\\\LFL[ RMGM[L[ RLFTFWGXHYJYMXOWPTQMQ RMGTGWHXJXMWOTPMP RRQX[Y[ RSQY[\",\n  2519: \" 43H\\\\YIWGTFPFMGKIKKLMMNOOTQVRWSXUXXWYTZPZNYMXKX RYIWIVHTGPGMHLILKMMONTPVQXSYUYXWZT[P[MZKX\",\n  2520: \" 15J[RGR[ RSGS[R[ RLFYFYG RLFLGYG\",\n  2521: \" 24G]KFKULXNZQ[S[VZXXYUYF RKFLFLUMXNYQZSZVYWXXUXFYF\",\n  2522: \" 14H\\\\JFR[ RJFKFRX RZFYFRX RZFR[\",\n  2523: \" 26E_GFM[ RGFHFMX RRFMX RRIM[ RRIW[ RRFWX R]F\\\\FWX R]FW[\",\n  2524: \" 16H\\\\KFX[Y[ RKFLFY[ RYFXFK[ RYFL[K[\",\n  2525: \" 17I\\\\KFRPR[S[ RKFLFSP RZFYFRP RZFSPS[\",\n  2526: \" 20H\\\\XFK[ RYFL[ RKFYF RKFKGXG RLZYZY[ RK[Y[\",\n  2551: \" 38E\\\\XFVHTKQPOSLWIZG[E[DZDXEWFXEY RXFWJUTT[ RXFU[ RT[TYSVRTPRNQLQKRKTLWOZR[V[XZ\",\n  2552: \" 70F^UGTHSJQOOUNWLZJ[ RTHSKQSPVOXMZJ[H[GZGXHWIXHY ROLNNMOKOJNJLKJMHOGRFXFZG[I[KZMXNTORO RXFYGZIZKYMXN RTOWPXQYSYVXYWZU[S[RZRXSU RTOVPWQXSXVWYU[\",\n  2553: \" 41H]KHJJJLKNNOQOUNWMYKZIZGYFWFTGQJOMMQLULXMZP[R[UZWXXVXTWRURSSRU RWFUGRJPMNQMUMXNZP[\",\n  2554: \" 43F]UGTHSJQOOUNWLZJ[ RTHSKQSPVOXMZJ[H[GZGXHWJWLXNZP[S[UZWXYTZOZLYIWGUFPFMGKIJKJMKNMNNMOK\",\n  2555: \" 49I\\\\WIVJVLWMYMZKZIYGWFTFRGQHPJPLQNSO RTFRHQJQMSO RSOQONPLRKTKWLYMZO[R[UZWXXVXTWRURSSRU RQOOPMRLTLXMZ\",\n  2556: \" 46G\\\\WHVJTORUQWOZM[ RQLPNNOLOKMKKLINGQF[FXGWHVKTSSVRXPZM[K[IZHYHXIWJXIY RSFWGXG ROSPRRQVQXPZMXT\",\n  2557: \" 53G]JIIKIMJOLPOPROTNWKXHXGWFVFTGRIQKPNPQQSSTUTWSYQZO RWFUGSIRKQNQRST RZOYSWWUYSZO[L[JZIXIWJVKWJX RYSWVUXRZO[\",\n  2558: \" 55F^LLKKKILGOFRFOQMWLYKZI[G[FZFXGWHXGY RRFOONRLWKYI[ RJTKSMRVOXN[L]J^H^G]F\\\\FZGXJWLURTVTYV[W[YZ[X R\\\\FZHXLVRUVUYV[\",\n  2559: \" 33IYWHUKSPQUPWNZL[ RYLWNTOQOONNLNJOHQGUFYFWHVJTPRVQXOZL[J[IZIXJWKXJY\",\n  2560: \" 34IZYFWHUKSPPYN] RYMWOTPQPOONMNKOIQGUFYFWIVKSTQXPZN]M^K_J^J\\\\KZMXOWRVVU\",\n  2561: \" 59F^LLKKKIMGPFRFOQMWLYKZI[G[FZFXGWHXGY RRFOONRLWKYI[ RZGWKUMSNPO R]G\\\\H]I^H^G]F\\\\FZGWLVMTNPO RPOSPTRUYV[ RPORPSRTYV[W[YZ[X\",\n  2562: \" 40I[MILKLMMOOPRPUOWNZK[H[GZFYFWGVHTKPUOWMZK[ RVHTLRSQVPXNZK[I[HZHXIWKWMXPZR[U[WZYX\",\n  2563: \" 49D`RFNOKUIXGZE[C[BZBXCWDXCY RRFPMOQNVNZP[ RRFQJPOOVOZP[ R[FWORXP[ R[FYMXQWVWZY[Z[\\\\Z^X R[FZJYOXVXZY[\",\n  2564: \" 38G^RFQJOPMULWJZH[F[EZEXFWGXFY RRFRKSVT[ RRFSKTVT[ R`G_H`IaHaG`F^F\\\\GZJYLWQUWT[\",\n  2565: \" 34H]SFQGOIMLLNKRKVLYMZO[Q[TZVXXUYSZOZKYHXGWGUHSJQNPSPV RQGOJMNLRLVMYO[\",\n  2566: \" 53F]UGTHSJQOOUNWLZJ[ RTHSKQSPVOXMZJ[H[GZGXHWIXHY ROLNNMOKOJNJLKJMHOGRFVFYGZH[J[MZOYPVQTQRP RVFXGYHZJZMYOXPVQ\",\n  2567: \" 43H]UJULTNSOQPOPNNNLOIQGTFWFYGZIZMYPWSSWPYNZK[I[HZHXIWKWMXPZS[V[XZZX RWFXGYIYMXPVSSVOYK[\",\n  2568: \" 65F^UGTHSJQOOUNWLZJ[ RTHSKQSPVOXMZJ[H[GZGXHWIXHY ROLNNMOKOJNJLKJMHOGRFWFZG[I[KZMYNVORO RWFYGZIZKYMXNVO RROUPVRWYX[ RROTPURVYX[Y[[Z]X\",\n  2569: \" 36H\\\\NIMKMMNOPPSPVOXN[K\\\\H\\\\G[FZFXGWHVJUMSTRWPZN[ RVJUNTUSXQZN[K[IZHXHWIVJWIX\",\n  2570: \" 38I[YHXJVOTUSWQZO[ RSLRNPONOMMMKNIPGSF\\\\FZGYHXKVSUVTXRZO[M[KZJYJXKWLXKY RUFYGZG\",\n  2571: \" 39G]HJJGLFMFOHOKNNKVKYL[ RMFNHNKKSJVJYL[N[PZSWUTVR RZFVRUVUYW[X[ZZ\\\\X R[FWRVVVYW[\",\n  2572: \" 36G\\\\HJJGLFMFOHOKNOLVLYM[ RMFNHNKLRKVKYM[N[QZTWVTXPYMZIZGYFXFWGVIVLWNYP[Q]Q\",\n  2573: \" 41F]ILHLGKGIHGJFNFMHLLKUJ[ RLLLUK[ RVFTHRLOUMYK[ RVFUHTLSUR[ RTLTUS[ R`F^G\\\\IZLWUUYS[\",\n  2574: \" 52H\\\\PKOLMLLKLIMGOFQFSGTITLSPQUOXMZJ[H[GZGXHWIXHY RQFRGSISLRPPUNXLZJ[ R]G\\\\H]I^H^G]F[FYGWIULSPRURXSZT[U[WZYX\",\n  2575: \" 42G]JJLGNFOFQGQIOOORPT ROFPGPINONRPTRTUSWQYNZL R\\\\FZLWTUX R]F[LYQWUUXSZP[L[JZIXIWJVKWJX\",\n  2576: \" 44G\\\\ZHYJWOVRUTSWQYOZL[ RSLRNPONOMMMKNIPGSF]F[GZHYKXOVUTXQZL[H[GZGXHWJWLXOZQ[T[WZYX RVFZG[G\",\n  2601: \" 36H\\\\WMW[X[ RWMXMX[ RWPUNSMPMNNLPKSKULXNZP[S[UZWX RWPSNPNNOMPLSLUMXNYPZSZWX\",\n  2602: \" 36H\\\\LFL[M[ RLFMFM[ RMPONQMTMVNXPYSYUXXVZT[Q[OZMX RMPQNTNVOWPXSXUWXVYTZQZMX\",\n  2603: \" 32I[XPVNTMQMONMPLSLUMXOZQ[T[VZXX RXPWQVOTNQNOONPMSMUNXOYQZTZVYWWXX\",\n  2604: \" 36H\\\\WFW[X[ RWFXFX[ RWPUNSMPMNNLPKSKULXNZP[S[UZWX RWPSNPNNOMPLSLUMXNYPZSZWX\",\n  2605: \" 36I[MTXTXQWOVNTMQMONMPLSLUMXOZQ[T[VZXX RMSWSWQVOTNQNOONPMSMUNXOYQZTZVYWWXX\",\n  2606: \" 24LZWFUFSGRJR[S[ RWFWGUGSH RTGSJS[ ROMVMVN ROMONVN\",\n  2607: \" 48H\\\\XMWMW\\\\V_U`SaQaO`N_L_ RXMX\\\\W_UaSbPbNaL_ RWPUNSMPMNNLPKSKULXNZP[S[UZWX RWPSNPNNOMPLSLUMXNYPZSZWX\",\n  2608: \" 25H\\\\LFL[M[ RLFMFM[ RMQPNRMUMWNXQX[ RMQPORNTNVOWQW[X[\",\n  2609: \" 24NWRFQGQHRISITHTGSFRF RRGRHSHSGRG RRMR[S[ RRMSMS[\",\n  2610: \" 24NWRFQGQHRISITHTGSFRF RRGRHSHSGRG RRMRbSb RRMSMSb\",\n  2611: \" 22H[LFL[M[ RLFMFM[ RXMWMMW RXMMX RPTV[X[ RQSX[\",\n  2612: \"  8NWRFR[S[ RRFSFS[\",\n  2613: \" 42CbGMG[H[ RGMHMH[ RHQKNMMPMRNSQS[ RHQKOMNONQORQR[S[ RSQVNXM[M]N^Q^[ RSQVOXNZN\\\\O]Q][^[\",\n  2614: \" 25H\\\\LML[M[ RLMMMM[ RMQPNRMUMWNXQX[ RMQPORNTNVOWQW[X[\",\n  2615: \" 36I\\\\QMONMPLSLUMXOZQ[T[VZXXYUYSXPVNTMQM RQNOONPMSMUNXOYQZTZVYWXXUXSWPVOTNQN\",\n  2616: \" 36H\\\\LMLbMb RLMMMMb RMPONQMTMVNXPYSYUXXVZT[Q[OZMX RMPQNTNVOWPXSXUWXVYTZQZMX\",\n  2617: \" 36H\\\\WMWbXb RWMXMXb RWPUNSMPMNNLPKSKULXNZP[S[UZWX RWPSNPNNOMPLSLUMXNYPZSZWX\",\n  2618: \" 21KYOMO[P[ ROMPMP[ RPSQPSNUMXM RPSQQSOUNXNXM\",\n  2619: \" 50J[XPWNTMQMNNMPNRPSUUWV RVUWWWXVZ RWYTZQZNY ROZNXMX RXPWPVN RWOTNQNNO RONNPOR RNQPRUTWUXWXXWZT[Q[NZMX\",\n  2620: \" 16MXRFR[S[ RRFSFS[ ROMVMVN ROMONVN\",\n  2621: \" 25H\\\\LMLWMZO[R[TZWW RLMMMMWNYPZRZTYWW RWMW[X[ RWMXMX[\",\n  2622: \" 14JZLMR[ RLMMMRY RXMWMRY RXMR[\",\n  2623: \" 26F^IMN[ RIMJMNX RRMNX RRPN[ RRPV[ RRMVX R[MZMVX R[MV[\",\n  2624: \" 16I[LMW[X[ RLMMMX[ RXMWML[ RXMM[L[\",\n  2625: \" 17JZLMR[ RLMMMRY RXMWMRYNb RXMR[ObNb\",\n  2626: \" 20I[VNL[ RXMNZ RLMXM RLMLNVN RNZXZX[ RL[X[\",\n  2651: \" 33K[UUTSRRPRNSMTLVLXMZO[Q[SZTX RPRNTMVMYO[ RVRTXTZV[XZYY[V RWRUXUZV[\",\n  2652: \" 23LZLVNSPO RSFMXMZO[P[RZTXUUURVVWWXWZV RTFNXNZO[\",\n  2653: \" 22LXTSSTTTTSSRQROSNTMVMXNZP[S[VYXV RQROTNVNYP[\",\n  2654: \" 33K[UUTSRRPRNSMTLVLXMZO[Q[SZTX RPRNTMVMYO[ RZFTXTZV[XZYY[V R[FUXUZV[\",\n  2655: \" 23LXOYQXRWSUSSRRQROSNTMVMXNZP[S[VYXV RQROTNVNYP[\",\n  2656: \" 27OXRRUOWLXIXGWFUGTIKdKfLgNfOcPZQ[S[UZVYXV RTISNRRO[M`Kd\",\n  2657: \" 38K[UUTSRRPRNSMTLVLXMZO[Q[SZTX RPRNTMVMYO[ RVRPd RWRT[R`PdOfMgLfLdMaO_R]V[YY[V\",\n  2658: \" 30L[LVNSPO RSFL[ RTFM[ ROUQSSRTRVSVUUXUZV[ RTRUSUUTXTZV[XZYY[V\",\n  2659: \" 19NVSLRMSNTMSL RQROXOZQ[SZTYVV RRRPXPZQ[\",\n  2660: \" 24NVSLRMSNTMSL RQRKd RRRO[M`KdJfHgGfGdHaJ_M]Q[TYVV\",\n  2661: \" 31LZLVNSPO RSFL[ RTFM[ RURUSVSURTRRTOU ROURVSZT[ ROUQVRZT[U[XYZV\",\n  2662: \" 17NVNVPSRO RUFOXOZQ[SZTYVV RVFPXPZQ[\",\n  2663: \" 45E^EVGSIRKSKUI[ RIRJSJUH[ RKUMSORPRRSRUP[ RPRQSQUO[ RRUTSVRWRYSYUXXXZY[ RWRXSXUWXWZY[[Z\\\\Y^V\",\n  2664: \" 32I[IVKSMROSOUM[ RMRNSNUL[ ROUQSSRTRVSVUUXUZV[ RTRUSUUTXTZV[XZYY[V\",\n  2665: \" 29KYRRPRNSMTLVLXMZO[Q[SZTYUWUUTSRRQSQURWTXVXXWYV RPRNTMVMYO[\",\n  2666: \" 30L[LVNSPO RQLHg RRLIg ROUQSSRTRVSVUUXUZV[ RTRUSUUTXTZV[XZYY[V\",\n  2667: \" 35K[UUTSRRPRNSMTLVLXMZO[Q[SZ RPRNTMVMYO[ RVRPdPfQgSfTcT[V[YY[V RWRT[R`Pd\",\n  2668: \" 24LZLVNSPRRSRUP[ RPRQSQUO[ RRUTSVRWRVU RVRVUWWXWZV\",\n  2669: \" 22NZNVPSQQQSTUUWUYTZR[ RQSSUTWTYR[ RNZP[U[XYZV\",\n  2670: \" 20NVNVPSRO RUFOXOZQ[SZTYVV RVFPXPZQ[ RPNVN\",\n  2671: \" 27K[NRLXLZN[O[QZSXUU RORMXMZN[ RVRTXTZV[XZYY[V RWRUXUZV[\",\n  2672: \" 23KZNRMTLWLZN[O[RZTXUUUR RORNTMWMZN[ RURVVWWXWZV\",\n  2673: \" 36H]LRJTIWIZK[L[NZPX RMRKTJWJZK[ RRRPXPZR[S[UZWXXUXR RSRQXQZR[ RXRYVZW[W]V\",\n  2674: \" 42JZJVLSNRPRQSQUPXOZM[L[KZKYLYKZ RWSVTWTWSVRURSSRUQXQZR[U[XYZV RQSRU RSSQU RPXQZ RQXOZ\",\n  2675: \" 32K[NRLXLZN[O[QZSXUU RORMXMZN[ RVRPd RWRT[R`PdOfMgLfLdMaO_R]V[YY[V\",\n  2676: \" 38LYLVNSPRRRTSTVSXPZN[ RRRSSSVRXPZ RN[P\\\\Q^QaPdNfLgKfKdLaO^R\\\\VYYV RN[O\\\\P^PaOdNf\",\n  2700: \" 42H\\\\QFNGLJKOKRLWNZQ[S[VZXWYRYOXJVGSFQF ROGMJLOLRMWOZ RNYQZSZVY RUZWWXRXOWJUG RVHSGQGNH\",\n  2701: \" 12H\\\\NJPISFS[ RNJNKPJRHR[S[\",\n  2702: \" 34H\\\\LKLJMHNGPFTFVGWHXJXLWNUQL[ RLKMKMJNHPGTGVHWJWLVNTQK[ RLZYZY[ RK[Y[\",\n  2703: \" 48H\\\\MFXFQO RMFMGWG RWFPO RQNSNVOXQYTYUXXVZS[P[MZLYKWLW RPOSOVPXS RTOWQXTXUWXTZ RXVVYSZPZMYLW ROZLX\",\n  2704: \" 18H\\\\UIU[V[ RVFV[ RVFKVZV RUILV RLUZUZV\",\n  2705: \" 53H\\\\MFLO RNGMN RMFWFWG RNGWG RMNPMSMVNXPYSYUXXVZS[P[MZLYKWLW RLOMOONSNVOXR RTNWPXSXUWXTZ RXVVYSZPZMYLW ROZLX\",\n  2706: \" 62H\\\\VGWIXIWGTFRFOGMJLOLTMXOZR[S[VZXXYUYTXQVOSNRNOOMQ RWHTGRGOH RPGNJMOMTNXQZ RMVOYRZSZVYXV RTZWXXUXTWQTO RXSVPSOROOPMS RQONQMT\",\n  2707: \" 12H\\\\KFYFO[ RKFKGXG RXFN[O[\",\n  2708: \" 68H\\\\PFMGLILKMMNNPOTPVQWRXTXWWYTZPZMYLWLTMRNQPPTOVNWMXKXIWGTFPF RNGMIMKNMPNTOVPXRYTYWXYWZT[P[MZLYKWKTLRNPPOTNVMWKWIVG RWHTGPGMH RLXOZ RUZXX\",\n  2709: \" 62H\\\\WPURRSQSNRLPKMKLLINGQFRFUGWIXMXRWWUZR[P[MZLXMXNZ RWMVPSR RWNUQRRQRNQLN RPRMPLMLLMIPG RLKNHQGRGUHWK RSGVIWMWRVWTZ RUYRZPZMY\",\n  2710: \" 16MXRXQYQZR[S[TZTYSXRX RRYRZSZSYRY\",\n  2711: \" 24MXTZS[R[QZQYRXSXTYT\\\\S^Q_ RRYRZSZSYRY RS[T\\\\ RTZS^\",\n  2712: \" 32MXRMQNQORPSPTOTNSMRM RRNROSOSNRN RRXQYQZR[S[TZTYSXRX RRYRZSZSYRY\",\n  2713: \" 40MXRMQNQORPSPTOTNSMRM RRNROSOSNRN RTZS[R[QZQYRXSXTYT\\\\S^Q_ RRYRZSZSYRY RS[T\\\\ RTZS^\",\n  2714: \" 24MXRFRTST RRFSFST RRXQYQZR[S[TZTYSXRX RRYRZSZSYRY\",\n  2715: \" 58I\\\\LKLJMHNGQFTFWGXHYJYLXNWOUPRQ RLKMKMJNHQGTGWHXJXLWNUORP RMIPG RUGXI RXMTP RRPRTSTSP RRXQYQZR[S[TZTYSXRX RRYRZSZSYRY\",\n  2716: \" 24MXTFRGQIQLRMSMTLTKSJRJQK RRKRLSLSKRK RRGQK RQIRJ\",\n  2717: \" 24MXTHSIRIQHQGRFSFTGTJSLQM RRGRHSHSGRG RSITJ RTHSL\",\n  2718: \" 71F_\\\\MZMXNWPUVTXSYQZMZKYJWJUKSLRQOSMTKTISGQFPFNGMIMKNNPQUWXZZ[\\\\[ R\\\\M\\\\NZNXO RYNXPVVUXSZQ[M[KZJYIWIUJSLQQNRMSKSIRG RSHQGPGNH ROGNINKONQQVWXYZZ\\\\Z\\\\[\",\n  2719: \" 51I\\\\RBR_S_ RRBSBS_ RWIYIWGTFQFNGLILKMMNNVRWSXUXWWYTZQZOYNX RWIVHTGQGNHMIMKNMVQXSYUYWXYWZT[Q[NZLXNX RXXUZ\",\n  2720: \"  8G^[BIbJb R[B\\\\BJb\",\n  2721: \" 24KYUBSDQGOKNPNTOYQ]S`UbVb RUBVBTDRGPKOPOTPYR]T`Vb\",\n  2722: \" 24KYNBPDRGTKUPUTTYR]P`NbOb RNBOBQDSGUKVPVTUYS]Q`Ob\",\n  2723: \" 39JZRFQGSQRR RRFRR RRFSGQQRR RMINIVOWO RMIWO RMIMJWNWO RWIVINOMO RWIMO RWIWJMNMO\",\n  2724: \"  8F_JQ[Q[R RJQJR[R\",\n  2725: \" 16F_RIRZSZ RRISISZ RJQ[Q[R RJQJR[R\",\n  2726: \" 16F_JM[M[N RJMJN[N RJU[U[V RJUJV[V\",\n  2727: \" 11NWSFRGRM RSGRM RSFTGRM\",\n  2728: \" 22I[NFMGMM RNGMM RNFOGMM RWFVGVM RWGVM RWFXGVM\",\n  2729: \" 30KYQFOGNINKOMQNSNUMVKVIUGSFQF RQFNIOMSNVKUGQF RSFOGNKQNUMVISF\",\n  2750: \" 42H]TFQGOIMLLOKSKVLYMZO[Q[TZVXXUYRZNZKYHXGVFTF RTFRGPINLMOLSLVMYO[ RQ[SZUXWUXRYNYKXHVF\",\n  2751: \" 15H]TJO[ RVFP[ RVFSIPKNL RUIQKNL\",\n  2752: \" 42H]OJPKOLNKNJOHPGSFVFYGZIZKYMWOTQPSMUKWI[ RVFXGYIYKXMVOPS RJYKXMXRZUZWYXW RMXR[U[WZXW\",\n  2753: \" 50H]OJPKOLNKNJOHPGSFVFYGZIZKYMVOSP RVFXGYIYKXMVO RQPSPVQWRXTXWWYVZS[O[LZKYJWJVKULVKW RSPUQVRWTWWVYUZS[\",\n  2754: \" 10H]XGR[ RYFS[ RYFJUZU\",\n  2755: \" 39H]QFLP RQF[F RQGVG[F RLPMOPNSNVOWPXRXUWXUZR[O[LZKYJWJVKULVKW RSNUOVPWRWUVXTZR[\",\n  2756: \" 46H]YIXJYKZJZIYGWFTFQGOIMLLOKSKWLYMZO[R[UZWXXVXSWQVPTOQOOPMRLT RTFRGPINLMOLSLXMZ RR[TZVXWVWRVP\",\n  2757: \" 30H]NFLL R[FZIXLSRQUPWO[ RXLRRPUOWN[ RMIPFRFWI RNHPGRGWIYIZH[F\",\n  2758: \" 63H]SFPGOHNJNMOOQPTPXOYNZLZIYGVFSF RSFQGPHOJOMPOQP RTPWOXNYLYIXGVF RQPMQKSJUJXKZN[R[VZWYXWXTWRVQTP RQPNQLSKUKXLZN[ RR[UZVYWWWSVQ\",\n  2759: \" 46H]YMXOVQTRQROQNPMNMKNIPGSFVFXGYHZJZNYRXUVXTZQ[N[LZKXKWLVMWLX ROQNONKOIQGSF RXGYIYNXRWUUXSZQ[\",\n  2760: \"  6MXPYOZP[QZPY\",\n  2761: \"  8MXP[OZPYQZQ[P]N_\",\n  2762: \" 11MXSMRNSOTNSM RPYOZP[QZ\",\n  2763: \" 14MXSMRNSOTNSM RP[OZPYQZQ[P]N_\",\n  2764: \" 17MXUFTGRS RUGRS RUFVGRS RPYOZP[QZPY\",\n  2765: \" 34H]OJPKOLNKNJOHPGSFWFZG[I[KZMYNSPQQQSRTTT RWFYGZIZKYMXNVO RPYOZP[QZPY\",\n  2766: \"  8MXVFTHSJSKTLUKTJ\",\n  2767: \"  8MXUHTGUFVGVHUJSL\",\n  2768: \" 55E_\\\\N[O\\\\P]O]N\\\\M[MYNWPRXPZN[K[HZGXGVHTISKRPPROTMUKUITGRFPGOIOLPRQUSXUZW[Y[ZYZX RK[IZHXHVITJSPP ROLPQQTSWUYWZYZZY\",\n  2769: \" 41H]TBL_ RYBQ_ RZJYKZL[K[JZHYGVFRFOGMIMKNMONVRXT RMKOMVQWRXTXWWYVZS[O[LZKYJWJVKULVKW\",\n  2770: \"  3G]_BEb\",\n  2771: \" 20KZZBVESHQKOONTNXO]P`Qb RVESIQMPPOUOZP_Qb\",\n  2772: \" 20JYSBTDUGVLVPUUSYQ\\\\N_Jb RSBTEUJUOTTSWQ[N_\",\n  2773: \"  9J[TFTR ROIYO RYIOO\",\n  2774: \"  3E_IR[R\",\n  2775: \"  6E_RIR[ RIR[R\",\n  2776: \"  6E_IO[O RIU[U\",\n  2777: \"  6NWUFSM RVFSM\",\n  2778: \" 12I[PFNM RQFNM RYFWM RZFWM\",\n  2779: \" 14KZSFQGPIPKQMSNUNWMXKXIWGUFSF\",\n  2801: \" 18H\\\\RFK[ RRFY[ RRIX[ RMUVU RI[O[ RU[[[\",\n  2802: \" 31G]LFL[ RMFM[ RIFYFYLXF RMPUPXQYRZTZWYYXZU[I[ RUPWQXRYTYWXYWZU[\",\n  2803: \" 45G]LFL[ RMFM[ RIFUFXGYHZJZLYNXOUP RUFWGXHYJYLXNWOUP RMPUPXQYRZTZWYYXZU[I[ RUPWQXRYTYWXYWZU[\",\n  2804: \" 14I[NFN[ ROFO[ RKFZFZLYF RK[R[\",\n  2805: \" 31F^NFNLMTLXKZJ[ RXFX[ RYFY[ RKF\\\\F RG[\\\\[ RG[Gb RH[Gb R[[\\\\b R\\\\[\\\\b\",\n  2806: \" 22G\\\\LFL[ RMFM[ RSLST RIFYFYLXF RMPSP RI[Y[YUX[\",\n  2807: \" 71CbRFR[ RSFS[ ROFVF RGGHHGIFHFGGFHFIGJIKMLONPWPYOZM[I\\\\G]F^F_G_H^I]H^G RNPLQKSJXIZH[ RNPMQLSKXJZI[G[FZEX RWPYQZS[X\\\\Z][ RWPXQYSZX[Z\\\\[^[_Z`X RO[V[\",\n  2808: \" 45H\\\\LIKFKLLINGPFTFWGXIXLWNTOQO RTFVGWIWLVNTO RTOVPXRYTYWXYWZT[O[MZLYKWKVLUMVLW RWQXTXWWYVZT[\",\n  2809: \" 27F^KFK[ RLFL[ RXFX[ RYFY[ RHFOF RUF\\\\F RXHLY RH[O[ RU[\\\\[\",\n  2810: \" 37F^KFK[ RLFL[ RXFX[ RYFY[ RHFOF RUF\\\\F RXHLY RH[O[ RU[\\\\[ RN@N?M?M@NBPCTCVBW@\",\n  2811: \" 43F^KFK[ RLFL[ RHFOF RLPSPUOVMWIXGYFZF[G[HZIYHZG RSPUQVSWXXZY[ RSPTQUSVXWZX[Z[[Z\\\\X RH[O[\",\n  2812: \" 25E^MFMLLTKXJZI[H[GZGYHXIYHZ RXFX[ RYFY[ RJF\\\\F RU[\\\\[\",\n  2813: \" 30F_KFK[ RLFRX RKFR[ RYFR[ RYFY[ RZFZ[ RHFLF RYF]F RH[N[ RV[][\",\n  2814: \" 27F^KFK[ RLFL[ RXFX[ RYFY[ RHFOF RUF\\\\F RLPXP RH[O[ RU[\\\\[\",\n  2815: \" 44G]QFNGLIKKJOJRKVLXNZQ[S[VZXXYVZRZOYKXIVGSFQF RQFOGMILKKOKRLVMXOZQ[ RS[UZWXXVYRYOXKWIUGSF\",\n  2816: \" 21F^KFK[ RLFL[ RXFX[ RYFY[ RHF\\\\F RH[O[ RU[\\\\[\",\n  2817: \" 29G]LFL[ RMFM[ RIFUFXGYHZJZMYOXPUQMQ RUFWGXHYJYMXOWPUQ RI[P[\",\n  2818: \" 32G\\\\XIYLYFXIVGSFQFNGLIKKJNJSKVLXNZQ[S[VZXXYV RQFOGMILKKNKSLVMXOZQ[\",\n  2819: \" 16I\\\\RFR[ RSFS[ RLFKLKFZFZLYF RO[V[\",\n  2820: \" 24H]KFRV RLFSV RZFSVQYPZN[M[LZLYMXNYMZ RIFOF RVF\\\\F\",\n  2821: \" 48F_RFR[ RSFS[ ROFVF RPILJJLIOIRJULWPXUXYW[U\\\\R\\\\O[LYJUIPI RPIMJKLJOJRKUMWPX RUXXWZU[R[OZLXJUI RO[V[\",\n  2822: \" 21H\\\\KFX[ RLFY[ RYFK[ RIFOF RUF[F RI[O[ RU[[[\",\n  2823: \" 27F^KFK[ RLFL[ RXFX[ RYFY[ RHFOF RUF\\\\F RH[\\\\[ R[[\\\\b R\\\\[\\\\b\",\n  2824: \" 28F]KFKQLSOTRTUSWQ RLFLQMSOT RWFW[ RXFX[ RHFOF RTF[F RT[[[\",\n  2825: \" 30BcGFG[ RHFH[ RRFR[ RSFS[ R]F][ R^F^[ RDFKF ROFVF RZFaF RD[a[\",\n  2826: \" 36BcGFG[ RHFH[ RRFR[ RSFS[ R]F][ R^F^[ RDFKF ROFVF RZFaF RD[a[ R`[ab Ra[ab\",\n  2827: \" 31F`PFP[ RQFQ[ RIFHLHFTF RQPXP[Q\\\\R]T]W\\\\Y[ZX[M[ RXPZQ[R\\\\T\\\\W[YZZX[\",\n  2828: \" 41CaHFH[ RIFI[ REFLF RIPPPSQTRUTUWTYSZP[E[ RPPRQSRTTTWSYRZP[ R[F[[ R\\\\F\\\\[ RXF_F RX[_[\",\n  2829: \" 29H]MFM[ RNFN[ RJFQF RNPUPXQYRZTZWYYXZU[J[ RUPWQXRYTYWXYWZU[\",\n  2830: \" 39H]LIKFKLLINGQFSFVGXIYKZNZSYVXXVZS[P[MZLYKWKVLUMVLW RSFUGWIXKYNYSXVWXUZS[ RPPYP\",\n  2831: \" 59CbHFH[ RIFI[ REFLF RE[L[ RVFSGQIPKOOORPVQXSZV[X[[Z]X^V_R_O^K]I[GXFVF RVFTGRIQKPOPRQVRXTZV[ RX[ZZ\\\\X]V^R^O]K\\\\IZGXF RIPOP\",\n  2832: \" 45G]WFW[ RXFX[ R[FOFLGKHJJJLKNLOOPWP ROFMGLHKJKLLNMOOP RRPPQORLYKZJZIY RPQOSMZL[J[IYIX RT[[[\",\n  2901: \" 39I]NONPMPMONNPMTMVNWOXQXXYZZ[ RWOWXXZZ[[[ RWQVRPSMTLVLXMZP[S[UZWX RPSNTMVMXNZP[\",\n  2902: \" 48H\\\\XFWGQINKLNKQKULXNZQ[S[VZXXYUYSXPVNSMQMNNLPKS RXFWHUIQJNLLN RQMONMPLSLUMXOZQ[ RS[UZWXXUXSWPUNSM\",\n  2903: \" 37H\\\\MMM[ RNMN[ RJMUMXNYPYQXSUT RUMWNXPXQWSUT RNTUTXUYWYXXZU[J[ RUTWUXWXXWZU[\",\n  2904: \" 14HZMMM[ RNMN[ RJMXMXRWM RJ[Q[\",\n  2905: \" 22F]NMNQMWLZK[ RWMW[ RXMX[ RKM[M RI[H`H[[[[`Z[\",\n  2906: \" 31H[LSXSXQWOVNTMQMNNLPKSKULXNZQ[S[VZXX RWSWPVN RQMONMPLSLUMXOZQ[\",\n  2907: \" 59E`RMR[ RSMS[ ROMVM RJNIOHNIMJMKNMRNSPTUTWSXRZN[M\\\\M]N\\\\O[N RPTNUMVKZJ[ RPTNVLZK[I[HZGX RUTWUXVZZ[[ RUTWVYZZ[\\\\[]Z^X RO[V[\",\n  2908: \" 42I[MOLMLQMONNPMTMWNXPXQWSTT RTMVNWPWQVSTT RQTTTWUXWXXWZT[P[MZLXLWMVNWMX RTTVUWWWXVZT[\",\n  2909: \" 27G]LML[ RMMM[ RWMW[ RXMX[ RIMPM RTM[M RI[P[ RT[[[ RWNMZ\",\n  2910: \" 37G]LML[ RMMM[ RWMW[ RXMX[ RIMPM RTM[M RI[P[ RT[[[ RWNMZ ROGOFNFNGOIQJSJUIVG\",\n  2911: \" 38H\\\\MMM[ RNMN[ RJMQM RNTPTSSTRVNWMXMYNXOWN RPTSUTVVZW[ RPTRUSVUZV[X[YZZX RJ[Q[\",\n  2912: \" 22G]NMNQMWLZK[J[IZJYKZ RWMW[ RXMX[ RKM[M RT[[[\",\n  2913: \" 30G^LML[ RLMR[ RMMRY RXMR[ RXMX[ RYMY[ RIMMM RXM\\\\M RI[O[ RU[\\\\[\",\n  2914: \" 27G]LML[ RMMM[ RWMW[ RXMX[ RIMPM RTM[M RMTWT RI[P[ RT[[[\",\n  2915: \" 36H\\\\QMNNLPKSKULXNZQ[S[VZXXYUYSXPVNSMQM RQMONMPLSLUMXOZQ[ RS[UZWXXUXSWPUNSM\",\n  2916: \" 21G]LML[ RMMM[ RWMW[ RXMX[ RIM[M RI[P[ RT[[[\",\n  2917: \" 36G\\\\LMLb RMMMb RMPONQMSMVNXPYSYUXXVZS[Q[OZMX RSMUNWPXSXUWXUZS[ RIMMM RIbPb\",\n  2918: \" 28H[WPVQWRXQXPVNTMQMNNLPKSKULXNZQ[S[VZXX RQMONMPLSLUMXOZQ[\",\n  2919: \" 16I\\\\RMR[ RSMS[ RMMLRLMYMYRXM RO[V[\",\n  2920: \" 22I[LMR[ RMMRY RXMR[P_NaLbKbJaK`La RJMPM RTMZM\",\n  2921: \" 52H]RFRb RSFSb ROFSF RRPQNPMNMLNKQKWLZN[P[QZRX RNMMNLQLWMZN[ RWMXNYQYWXZW[ RSPTNUMWMYNZQZWYZW[U[TZSX RObVb\",\n  2922: \" 21H\\\\LMW[ RMMX[ RXML[ RJMPM RTMZM RJ[P[ RT[Z[\",\n  2923: \" 23G]LML[ RMMM[ RWMW[ RXMX[ RIMPM RTM[M RI[[[[`Z[\",\n  2924: \" 28G]LMLTMVPWRWUVWT RMMMTNVPW RWMW[ RXMX[ RIMPM RTM[M RT[[[\",\n  2925: \" 30CbHMH[ RIMI[ RRMR[ RSMS[ R\\\\M\\\\[ R]M][ REMLM ROMVM RYM`M RE[`[\",\n  2926: \" 32CbHMH[ RIMI[ RRMR[ RSMS[ R\\\\M\\\\[ R]M][ REMLM ROMVM RYM`M RE[`[``_[\",\n  2927: \" 27H]QMQ[ RRMR[ RLMKRKMUM RRTVTYUZWZXYZV[N[ RVTXUYWYXXZV[\",\n  2928: \" 37E_JMJ[ RKMK[ RGMNM RKTOTRUSWSXRZO[G[ ROTQURWRXQZO[ RYMY[ RZMZ[ RVM]M RV[][\",\n  2929: \" 25J[OMO[ RPMP[ RLMSM RPTTTWUXWXXWZT[L[ RTTVUWWWXVZT[\",\n  2930: \" 34I\\\\MOLMLQMONNPMSMVNXPYSYUXXVZS[P[NZLXLWMVNWMX RSMUNWPXSXUWXUZS[ RRTXT\",\n  2931: \" 51DaIMI[ RJMJ[ RFMMM RF[M[ RVMSNQPPSPUQXSZV[X[[Z]X^U^S]P[NXMVM RVMTNRPQSQURXTZV[ RX[ZZ\\\\X]U]S\\\\PZNXM RJTPT\",\n  2932: \" 40G\\\\VMV[ RWMW[ RZMOMLNKPKQLSOTVT ROMMNLPLQMSOT RTTQUPVNZM[ RTTRUQVOZN[L[KZJX RS[Z[\",\n  3001: \" 36H\\\\RFKZ RQIW[ RRIX[ RRFY[ RMUVU RI[O[ RT[[[ RKZJ[ RKZM[ RWZU[ RWYV[ RXYZ[\",\n  3002: \" 78G]LFL[ RMGMZ RNFN[ RIFUFXGYHZJZLYNXOUP RXHYJYLXN RUFWGXIXMWOUP RNPUPXQYRZTZWYYXZU[I[ RXRYTYWXY RUPWQXSXXWZU[ RJFLG RKFLH ROFNH RPFNG RLZJ[ RLYK[ RNYO[ RNZP[\",\n  3003: \" 37G\\\\XIYFYLXIVGTFQFNGLIKKJNJSKVLXNZQ[T[VZXXYV RMILKKNKSLVMX RQFOGMJLNLSMWOZQ[\",\n  3004: \" 62G]LFL[ RMGMZ RNFN[ RIFSFVGXIYKZNZSYVXXVZS[I[ RWIXKYNYSXVWX RSFUGWJXNXSWWUZS[ RJFLG RKFLH ROFNH RPFNG RLZJ[ RLYK[ RNYO[ RNZP[\",\n  3005: \" 83G\\\\LFL[ RMGMZ RNFN[ RIFYFYL RNPTP RTLTT RI[Y[YU RJFLG RKFLH ROFNH RPFNG RTFYG RVFYH RWFYI RXFYL RTLSPTT RTNRPTR RTOPPTQ RLZJ[ RLYK[ RNYO[ RNZP[ RT[YZ RV[YY RW[YX RX[YU\",\n  3006: \" 70G[LFL[ RMGMZ RNFN[ RIFYFYL RNPTP RTLTT RI[Q[ RJFLG RKFLH ROFNH RPFNG RTFYG RVFYH RWFYI RXFYL RTLSPTT RTNRPTR RTOPPTQ RLZJ[ RLYK[ RNYO[ RNZP[\",\n  3007: \" 60G^XIYFYLXIVGTFQFNGLIKKJNJSKVLXNZQ[T[VZXZY[YS RMILKKNKSLVMX RQFOGMJLNLSMWOZQ[ RXTXY RWSWYVZ RTS\\\\S RUSWT RVSWU RZSYU R[SYT\",\n  3008: \" 81F^KFK[ RLGLZ RMFM[ RWFW[ RXGXZ RYFY[ RHFPF RTF\\\\F RMPWP RH[P[ RT[\\\\[ RIFKG RJFKH RNFMH ROFMG RUFWG RVFWH RZFYH R[FYG RKZI[ RKYJ[ RMYN[ RMZO[ RWZU[ RWYV[ RYYZ[ RYZ[[\",\n  3009: \" 39LXQFQ[ RRGRZ RSFS[ RNFVF RN[V[ ROFQG RPFQH RTFSH RUFSG RQZO[ RQYP[ RSYT[ RSZU[\",\n  3010: \" 45JYSFSWRZQ[ RTGTWSZ RUFUWTZQ[O[MZLXLVMUNUOVOWNXMX RMVMWNWNVMV RPFXF RQFSG RRFSH RVFUH RWFUG\",\n  3011: \" 69F\\\\KFK[ RLGLZ RMFM[ RXGMR RPPW[ RQPX[ RQNY[ RHFPF RUF[F RH[P[ RT[[[ RIFKG RJFKH RNFMH ROFMG RWFXG RZFXG RKZI[ RKYJ[ RMYN[ RMZO[ RWYU[ RWYZ[\",\n  3012: \" 52I[NFN[ ROGOZ RPFP[ RKFSF RK[Z[ZU RLFNG RMFNH RQFPH RRFPG RNZL[ RNYM[ RPYQ[ RPZR[ RU[ZZ RW[ZY RX[ZX RY[ZU\",\n  3013: \" 63E_JFJZ RJFQ[ RKFQX RLFRX RXFQ[ RXFX[ RYGYZ RZFZ[ RGFLF RXF]F RG[M[ RU[][ RHFJG R[FZH R\\\\FZG RJZH[ RJZL[ RXZV[ RXYW[ RZY[[ RZZ\\\\[\",\n  3014: \" 39F^KFKZ RKFY[ RLFXX RMFYX RYGY[ RHFMF RVF\\\\F RH[N[ RIFKG RWFYG R[FYG RKZI[ RKZM[\",\n  3015: \" 54G]QFNGLIKKJOJRKVLXNZQ[S[VZXXYVZRZOYKXIVGSFQF RMILKKNKSLVMX RWXXVYSYNXKWI RQFOGMJLNLSMWOZQ[ RS[UZWWXSXNWJUGSF\",\n  3016: \" 59G]LFL[ RMGMZ RNFN[ RIFUFXGYHZJZMYOXPUQNQ RXHYJYMXO RUFWGXIXNWPUQ RI[Q[ RJFLG RKFLH ROFNH RPFNG RLZJ[ RLYK[ RNYO[ RNZP[\",\n  3017: \" 77G]QFNGLIKKJOJRKVLXNZQ[S[VZXXYVZRZOYKXIVGSFQF RMILKKNKSLVMX RWXXVYSYNXKWI RQFOGMJLNLSMWOZQ[ RS[UZWWXSXNWJUGSF RNXOVQURUTVUXV^W`Y`Z^Z\\\\ RV\\\\W^X_Y_ RUXW]X^Y^Z]\",\n  3018: \" 80G]LFL[ RMGMZ RNFN[ RIFUFXGYHZJZLYNXOUPNP RXHYJYLXN RUFWGXIXMWOUP RRPTQUSWYX[Z[[Y[W RWWXYYZZZ RTQURXXYYZY[X RI[Q[ RJFLG RKFLH ROFNH RPFNG RLZJ[ RLYK[ RNYO[ RNZP[\",\n  3019: \" 44H\\\\XIYFYLXIVGSFPFMGKIKLLNOPURWSXUXXWZ RLLMNOOUQWRXT RMGLILKMMONUPXRYTYWXYWZT[Q[NZLXKUK[LX\",\n  3020: \" 57H\\\\JFJL RQFQ[ RRGRZ RSFS[ RZFZL RJFZF RN[V[ RKFJL RLFJI RMFJH ROFJG RUFZG RWFZH RXFZI RYFZL RQZO[ RQYP[ RSYT[ RSZU[\",\n  3021: \" 45F^KFKULXNZQ[S[VZXXYUYG RLGLVMX RMFMVNYOZQ[ RHFPF RVF\\\\F RIFKG RJFKH RNFMH ROFMG RWFYG R[FYG\",\n  3022: \" 34H\\\\KFR[ RLFRXR[ RMFSX RYGR[ RIFPF RUF[F RJFLH RNFMH ROFMG RWFYG RZFYG\",\n  3023: \" 55F^JFN[ RKFNVN[ RLFOV RRFOVN[ RRFV[ RSFVVV[ RTFWV RZGWVV[ RGFOF RRFTF RWF]F RHFKG RIFKH RMFLH RNFLG RXFZG R\\\\FZG\",\n  3024: \" 54H\\\\KFW[ RLFX[ RMFY[ RXGLZ RIFPF RUF[F RI[O[ RT[[[ RJFMH RNFMH ROFMG RVFXG RZFXG RLZJ[ RLZN[ RWZU[ RWYV[ RWYZ[\",\n  3025: \" 48G]JFQQQ[ RKFRQRZ RLFSQS[ RYGSQ RHFOF RVF\\\\F RN[V[ RIFKG RNFLG RWFYG R[FYG RQZO[ RQYP[ RSYT[ RSZU[\",\n  3026: \" 41H\\\\YFKFKL RWFK[ RXFL[ RYFM[ RK[Y[YU RLFKL RMFKI RNFKH RPFKG RT[YZ RV[YY RW[YX RX[YU\",\n  3051: \" 38H\\\\UFIZ RSJT[ RTHUZ RUFUHVYV[ RLUTU RF[L[ RQ[X[ RIZG[ RIZK[ RTZR[ RTYS[ RVYW[\",\n  3052: \" 78F^OFI[ RPFJ[ RQFK[ RLFWFZG[I[KZNYOVP RYGZIZKYNXO RWFXGYIYKXNVP RNPVPXQYSYUXXVZR[F[ RWQXSXUWXUZ RVPWRWUVXTZR[ RMFPG RNFOH RRFPH RSFPG RJZG[ RJYH[ RKYL[ RJZM[\",\n  3053: \" 41H]ZH[H\\\\F[L[JZHYGWFTFQGOIMLLOKSKVLYMZP[S[UZWXXV RQHOJNLMOLSLWMY RTFRGPJOLNOMSMXNZP[\",\n  3054: \" 63F]OFI[ RPFJ[ RQFK[ RLFUFXGYHZKZOYSWWUYSZO[F[ RWGXHYKYOXSVWTY RUFWHXKXOWSUWRZO[ RMFPG RNFOH RRFPH RSFPG RJZG[ RJYH[ RKYL[ RJZM[\",\n  3055: \" 80F]OFI[ RPFJ[ RQFK[ RULST RLF[FZL RNPTP RF[U[WV RMFPG RNFOH RRFPH RSFPG RWFZG RXFZH RYFZI RZFZL RULSPST RTNRPSR RTOQPSQ RJZG[ RJYH[ RKYL[ RJZM[ RP[UZ RR[UY RUYWV\",\n  3056: \" 70F\\\\OFI[ RPFJ[ RQFK[ RULST RLF[FZL RNPTP RF[N[ RMFPG RNFOH RRFPH RSFPG RWFZG RXFZH RYFZI RZFZL RULSPST RTNRPSR RTOQPSQ RJZG[ RJYH[ RKYL[ RJZM[\",\n  3057: \" 65H^ZH[H\\\\F[L[JZHYGWFTFQGOIMLLOKSKVLYMZP[R[UZWXYT RQHOJNLMOLSLWMY RVXWWXT RTFRGPJOLNOMSMXNZP[ RR[TZVWWT RTT\\\\T RUTWU RVTWW RZTXV R[TXU\",\n  3058: \" 81E_NFH[ ROFI[ RPFJ[ RZFT[ R[FU[ R\\\\FV[ RKFSF RWF_F RLPXP RE[M[ RQ[Y[ RLFOG RMFNH RQFOH RRFOG RXF[G RYFZH R]F[H R^F[G RIZF[ RIYG[ RJYK[ RIZL[ RUZR[ RUYS[ RVYW[ RUZX[\",\n  3059: \" 39KYTFN[ RUFO[ RVFP[ RQFYF RK[S[ RRFUG RSFTH RWFUH RXFUG ROZL[ ROYM[ RPYQ[ ROZR[\",\n  3060: \" 47I\\\\WFRWQYO[ RXFTSSVRX RYFUSSXQZO[M[KZJXJVKULUMVMWLXKX RKVKWLWLVKV RTF\\\\F RUFXG RVFWH RZFXH R[FXG\",\n  3061: \" 72F]OFI[ RPFJ[ RQFK[ R\\\\GMR RQOU[ RROV[ RSNWZ RLFTF RYF_F RF[N[ RR[Y[ RMFPG RNFOH RRFPH RSFPG RZF\\\\G R^F\\\\G RJZG[ RJYH[ RKYL[ RJZM[ RUZS[ RUYT[ RVYX[\",\n  3062: \" 49H\\\\QFK[ RRFL[ RSFM[ RNFVF RH[W[YU ROFRG RPFQH RTFRH RUFRG RLZI[ RLYJ[ RMYN[ RLZO[ RR[WZ RT[XX RV[YU\",\n  3063: \" 68D`MFGZ RMGNYN[ RNFOY ROFPX R[FPXN[ R[FU[ R\\\\FV[ R]FW[ RJFOF R[F`F RD[J[ RR[Z[ RKFMG RLFMH R^F\\\\H R_F\\\\G RGZE[ RGZI[ RVZS[ RVYT[ RWYX[ RVZY[\",\n  3064: \" 43F_OFIZ ROFV[ RPFVX RQFWX R\\\\GWXV[ RLFQF RYF_F RF[L[ RMFPG RNFPH RZF\\\\G R^F\\\\G RIZG[ RIZK[\",\n  3065: \" 56G]SFPGNILLKOJSJVKYLZN[Q[TZVXXUYRZNZKYHXGVFSF ROIMLLOKSKWLY RUXWUXRYNYJXH RSFQGOJNLMOLSLXMZN[ RQ[SZUWVUWRXNXIWGVF\",\n  3066: \" 60F]OFI[ RPFJ[ RQFK[ RLFXF[G\\\\I\\\\K[NYPUQMQ RZG[I[KZNXP RXFYGZIZKYNWPUQ RF[N[ RMFPG RNFOH RRFPH RSFPG RJZG[ RJYH[ RKYL[ RJZM[\",\n  3067: \" 78G]SFPGNILLKOJSJVKYLZN[Q[TZVXXUYRZNZKYHXGVFSF ROIMLLOKSKWLY RUXWUXRYNYJXH RSFQGOJNLMOLSLXMZN[ RQ[SZUWVUWRXNXIWGVF RLXMVOUPURVSXT]U^V^W] RT^U_V_ RSXS_T`V`W]W\\\\\",\n  3068: \" 78F^OFI[ RPFJ[ RQFK[ RLFWFZG[I[KZNYOVPNP RYGZIZKYNXO RWFXGYIYKXNVP RRPTQURWXXYYYZX RWYXZYZ RURVZW[Y[ZXZW RF[N[ RMFPG RNFOH RRFPH RSFPG RJZG[ RJYH[ RKYL[ RJZM[\",\n  3069: \" 44G^ZH[H\\\\F[L[JZHYGVFRFOGMIMLNNPPVSWUWXVZ RNLONVRWT ROGNINKOMUPWRXTXWWYVZS[O[LZKYJWJUI[JYKY\",\n  3070: \" 54G]TFN[ RUFO[ RVFP[ RMFKL R]F\\\\L RMF]F RK[S[ RNFKL RPFLI RRFMG RYF\\\\G RZF\\\\H R[F\\\\I R\\\\F\\\\L ROZL[ ROYM[ RPYQ[ ROZR[\",\n  3071: \" 48F_NFKQJUJXKZN[R[UZWXXU\\\\G ROFLQKUKYLZ RPFMQLULYN[ RKFSF RYF_F RLFOG RMFNH RQFOH RRFOG RZF\\\\G R^F\\\\G\",\n  3072: \" 35H\\\\NFNHOYO[ ROGPX RPFQW R[GO[ RLFSF RXF^F RMFNH RQFPH RRFOG RYF[G R]F[G\",\n  3073: \" 57E_MFMHKYK[ RNGLX ROFMW RUFMWK[ RUFUHSYS[ RVGTX RWFUW R]GUWS[ RJFRF RUFWF RZF`F RKFNG RLFMH RPFNI RQFNG R[F]G R_F]G\",\n  3074: \" 54G]NFT[ ROFU[ RPFV[ R[GIZ RLFSF RXF^F RF[L[ RQ[X[ RMFOH RQFPH RRFPG RYF[G R]F[G RIZG[ RIZK[ RTZR[ RTYS[ RUYW[\",\n  3075: \" 51G]MFQPN[ RNFRPO[ ROFSPP[ R\\\\GSP RKFRF RYF_F RK[S[ RLFNG RPFOH RQFNG RZF\\\\G R^F\\\\G ROZL[ ROYM[ RPYQ[ ROZR[\",\n  3076: \" 35G]ZFH[ R[FI[ R\\\\FJ[ R\\\\FNFLL RH[V[XU ROFLL RPFMI RRFNG RR[VZ RT[WX RU[XU\",\n  3101: \" 54I]NPNOOOOQMQMONNPMTMVNWOXQXXYZZ[ RVOWQWXXZ RTMUNVPVXWZZ[[[ RVRUSPTMULWLXMZP[S[UZVX RNUMWMXNZ RUSQTOUNWNXOZP[\",\n  3102: \" 47G\\\\LFL[MZOZ RMGMY RIFNFNZ RNPONQMSMVNXPYSYUXXVZS[Q[OZNX RWPXRXVWX RSMUNVOWRWVVYUZS[ RJFLG RKFLH\",\n  3103: \" 34H[WQWPVPVRXRXPVNTMQMNNLPKSKULXNZQ[S[VZXX RMPLRLVMX RQMONNOMRMVNYOZQ[\",\n  3104: \" 52H]VFV[[[ RWGWZ RSFXFX[ RVPUNSMQMNNLPKSKULXNZQ[S[UZVX RMPLRLVMX RQMONNOMRMVNYOZQ[ RTFVG RUFVH RXYY[ RXZZ[\",\n  3105: \" 41H[MSXSXQWOVNSMQMNNLPKSKULXNZQ[S[VZXX RWRWQVO RMPLRLVMX RVSVPUNSM RQMONNOMRMVNYOZQ[\",\n  3106: \" 40KYWHWGVGVIXIXGWFTFRGQHPKP[ RRHQKQZ RTFSGRIR[ RMMVM RM[U[ RPZN[ RPYO[ RRYS[ RRZT[\",\n  3107: \" 89I\\\\XNYOZNYMXMVNUO RQMONNOMQMSNUOVQWSWUVVUWSWQVOUNSMQM ROONQNSOU RUUVSVQUO RQMPNOPOTPVQW RSWTVUTUPTNSM RNUMVLXLYM[N\\\\Q]U]X^Y_ RN[Q\\\\U\\\\X] RLYMZP[U[X\\\\Y^Y_XaUbObLaK_K^L\\\\O[ RObMaL_L^M\\\\O[\",\n  3108: \" 65G^LFL[ RMGMZ RIFNFN[ RNQOOPNRMUMWNXOYRY[ RWOXRXZ RUMVNWQW[ RI[Q[ RT[\\\\[ RJFLG RKFLH RLZJ[ RLYK[ RNYO[ RNZP[ RWZU[ RWYV[ RYYZ[ RYZ[[\",\n  3109: \" 43LXQFQHSHSFQF RRFRH RQGSG RQMQ[ RRNRZ RNMSMS[ RN[V[ ROMQN RPMQO RQZO[ RQYP[ RSYT[ RSZU[\",\n  3110: \" 41KXRFRHTHTFRF RSFSH RRGTG RRMR^QaPb RSNS]R` ROMTMT]S`RaPbMbLaL_N_NaMaM` RPMRN RQMRO\",\n  3111: \" 61G]LFL[ RMGMZ RIFNFN[ RWNNW RRSY[ RRTX[ RQTW[ RTM[M RI[Q[ RT[[[ RJFLG RKFLH RUMWN RZMWN RLZJ[ RLYK[ RNYO[ RNZP[ RWYU[ RVYZ[\",\n  3112: \" 31LXQFQ[ RRGRZ RNFSFS[ RN[V[ ROFQG RPFQH RQZO[ RQYP[ RSYT[ RSZU[\",\n  3113: \" 99AcFMF[ RGNGZ RCMHMH[ RHQIOJNLMOMQNROSRS[ RQORRRZ ROMPNQQQ[ RSQTOUNWMZM\\\\N]O^R^[ R\\\\O]R]Z RZM[N\\\\Q\\\\[ RC[K[ RN[V[ RY[a[ RDMFN REMFO RFZD[ RFYE[ RHYI[ RHZJ[ RQZO[ RQYP[ RSYT[ RSZU[ R\\\\ZZ[ R\\\\Y[[ R^Y_[ R^Z`[\",\n  3114: \" 65G^LML[ RMNMZ RIMNMN[ RNQOOPNRMUMWNXOYRY[ RWOXRXZ RUMVNWQW[ RI[Q[ RT[\\\\[ RJMLN RKMLO RLZJ[ RLYK[ RNYO[ RNZP[ RWZU[ RWYV[ RYYZ[ RYZ[[\",\n  3115: \" 46H\\\\QMNNLPKSKULXNZQ[S[VZXXYUYSXPVNSMQM RMPLRLVMX RWXXVXRWP RQMONNOMRMVNYOZQ[ RS[UZVYWVWRVOUNSM\",\n  3116: \" 60G\\\\LMLb RMNMa RIMNMNb RNPONQMSMVNXPYSYUXXVZS[Q[OZNX RWPXRXVWX RSMUNVOWRWVVYUZS[ RIbQb RJMLN RKMLO RLaJb RL`Kb RN`Ob RNaPb\",\n  3117: \" 55H\\\\VNVb RWOWa RUNWNXMXb RVPUNSMQMNNLPKSKULXNZQ[S[UZVX RMPLRLVMX RQMONNOMRMVNYOZQ[ RSb[b RVaTb RV`Ub RX`Yb RXaZb\",\n  3118: \" 43IZNMN[ RONOZ RKMPMP[ RWOWNVNVPXPXNWMUMSNQPPS RK[S[ RLMNN RMMNO RNZL[ RNYM[ RPYQ[ RPZR[\",\n  3119: \" 43J[WOXMXQWOVNTMPMNNMOMQNSPTUUWVXY RNNMQ RNRPSUTWU RXVWZ RMONQPRUSWTXVXYWZU[Q[OZNYMWM[NY\",\n  3120: \" 22KZPHPVQYRZT[V[XZYX RQHQWRY RPHRFRWSZT[ RMMVM\",\n  3121: \" 43G^LMLVMYNZP[S[UZVYWW RMNMWNY RIMNMNWOZP[ RWMW[\\\\[ RXNXZ RTMYMY[ RJMLN RKMLO RYYZ[ RYZ[[\",\n  3122: \" 31I[LMR[ RMMRY RNMSY RXNSYR[ RJMQM RTMZM RKMNO RPMNN RVMXN RYMXN\",\n  3123: \" 45F^JMN[ RKMNX RLMOX RRMOXN[ RRMV[ RSMVX RRMTMWX RZNWXV[ RGMOM RWM]M RHMKN RNMLN RXMZN R\\\\MZN\",\n  3124: \" 48H\\\\LMV[ RMMW[ RNMX[ RWNMZ RJMQM RTMZM RJ[P[ RS[Z[ RKMMN RPMNN RUMWN RYMWN RMZK[ RMZO[ RVZT[ RWZY[\",\n  3125: \" 40H[LMR[ RMMRY RNMSY RXNSYP_NaLbJbIaI_K_KaJaJ` RJMQM RTMZM RKMNO RPMNN RVMXN RYMXN\",\n  3126: \" 41I[VML[ RWMM[ RXMN[ RXMLMLQ RL[X[XW RMMLQ RNMLP ROMLO RQMLN RS[XZ RU[XY RV[XX RW[XW\",\n  3151: \" 50G]WMUTUXVZW[Y[[Y\\\\W RXMVTVZ RWMYMWTVX RUTUQTNRMPMMNKQJTJVKYLZN[P[RZSYTWUT RNNLQKTKWLY RPMNOMQLTLWMZN[\",\n  3152: \" 52I\\\\PFNMMSMWNYOZQ[S[VZXWYTYRXOWNUMSMQNPOOQNT RQFOMNQNWOZ RVYWWXTXQWO RMFRFPMNT RS[UYVWWTWQVNUM RNFQG ROFPH\",\n  3153: \" 34I[WQWPVPVRXRXPWNUMRMONMQLTLVMYNZP[R[UZWW ROONQMTMWNY RRMPOOQNTNWOZP[\",\n  3154: \" 58G]YFVQUUUXVZW[Y[[Y\\\\W RZFWQVUVZ RVF[FWTVX RUTUQTNRMPMMNKQJTJVKYLZN[P[RZSYTWUT RMOLQKTKWLY RPMNOMQLTLWMZN[ RWFZG RXFYH\",\n  3155: \" 33I[MVQUTTWRXPWNUMRMONMQLTLVMYNZP[R[UZWX ROONQMTMWNY RRMPOOQNTNWOZP[\",\n  3156: \" 45JZZHZGYGYI[I[GZFXFVGTISKRNQRO[N^M`Kb RTJSMRRP[O^ RXFVHUJTMSRQZP]O_MaKbIbHaH_J_JaIaI` RNMYM\",\n  3157: \" 57H]XMT[S^QaOb RYMU[S_ RXMZMV[T_RaObLbJaI`I^K^K`J`J_ RVTVQUNSMQMNNLQKTKVLYMZO[Q[SZTYUWVT RNOMQLTLWMY RQMOONQMTMWNZO[\",\n  3158: \" 41G]OFI[K[ RPFJ[ RLFQFK[ RMTOPQNSMUMWNXPXSVX RWNWRVVVZ RWPUUUXVZW[Y[[Y\\\\W RMFPG RNFOH\",\n  3159: \" 35KXSFSHUHUFSF RTFTH RSGUG RLQMOOMQMRNSPSSQX RRNRRQVQZ RRPPUPXQZR[T[VYWW\",\n  3160: \" 45KXUFUHWHWFUF RVFVH RUGWG RMQNOPMRMSNTPTSRZQ]P_NaLbJbIaI_K_KaJaJ` RSNSSQZP]O_ RSPRTP[O^N`Lb\",\n  3161: \" 49G]OFI[K[ RPFJ[ RLFQFK[ RYOYNXNXPZPZNYMWMUNQROS RMSOSQTRUTYUZWZ RQUSYTZ ROSPTRZS[U[WZYW RMFPG RNFOH\",\n  3162: \" 26LXTFQQPUPXQZR[T[VYWW RUFRQQUQZ RQFVFRTQX RRFUG RSFTH\",\n  3163: \" 61@cAQBODMFMGNHPHSF[ RGNGSE[ RGPFTD[F[ RHSJPLNNMPMRNSPSSQ[ RRNRSP[ RRPQTO[Q[ RSSUPWNYM[M]N^P^S\\\\X R]N]R\\\\V\\\\Z R]P[U[X\\\\Z][_[aYbW\",\n  3164: \" 42F^GQHOJMLMMNNPNSL[ RMNMSK[ RMPLTJ[L[ RNSPPRNTMVMXNYPYSWX RXNXRWVWZ RXPVUVXWZX[Z[\\\\Y]W\",\n  3165: \" 46H\\\\QMNNLQKTKVLYMZP[S[VZXWYTYRXOWNTMQM RNOMQLTLWMY RVYWWXTXQWO RQMOONQMTMWNZP[ RS[UYVWWTWQVNTM\",\n  3166: \" 66G]HQIOKMMMNNOPOSNWKb RNNNSMWJb RNPMTIb ROTPQQORNTMVMXNYOZRZTYWWZT[R[PZOWOT RXOYQYTXWWY RVMWNXQXTWWVYT[ RFbNb RJaGb RJ`Hb RK`Lb RJaMb\",\n  3167: \" 57G\\\\WMQb RXMRb RWMYMSb RUTUQTNRMPMMNKQJTJVKYLZN[P[RZSYTWUT RMOLQKTKWLY RPMNOMQLTLWMZN[ RNbVb RRaOb RR`Pb RS`Tb RRaUb\",\n  3168: \" 30I[JQKOMMOMPNQPQTO[ RPNPTN[ RPPOTM[O[ RYOYNXNXPZPZNYMWMUNSPQT\",\n  3169: \" 47J[XPXOWOWQYQYOXNUMRMONNONQOSQTTUVVWX RONNQ RORQSTTVU RWVVZ RNOOQQRTSVTWVWXVZS[P[MZLYLWNWNYMYMX\",\n  3170: \" 23KYTFQQPUPXQZR[T[VYWW RUFRQQUQZ RTFVFRTQX RNMXM\",\n  3171: \" 42F^GQHOJMLMMNNPNSLX RMNMRLVLZ RMPKUKXLZN[P[RZTXVU RXMVUVXWZX[Z[\\\\Y]W RYMWUWZ RXMZMXTWX\",\n  3172: \" 29H\\\\IQJOLMNMONPPPSNX RONORNVNZ ROPMUMXNZP[R[TZVXXUYQYMXMXNYP\",\n  3173: \" 48CaDQEOGMIMJNKPKSIX RJNJRIVIZ RJPHUHXIZK[M[OZQXRU RTMRURXSZU[W[YZ[X]U^Q^M]M]N^P RUMSUSZ RTMVMTTSX\",\n  3174: \" 51G]JQLNNMPMRNSPSR RPMQNQRPVOXMZK[I[HZHXJXJZIZIY RRORRQVQY RZOZNYNYP[P[NZMXMVNTPSRRVRZS[ RPVPXQZS[U[WZYW\",\n  3175: \" 49G]HQIOKMMMNNOPOSMX RNNNRMVMZ RNPLULXMZO[Q[SZUXWT RYMU[T^RaPb RZMV[T_ RYM[MW[U_SaPbMbKaJ`J^L^L`K`K_\",\n  3176: \" 39H\\\\YMXOVQNWLYK[ RXOOOMPLR RVORNONNO RVORMOMMOLR RLYUYWXXV RNYRZUZVY RNYR[U[WYXV\",\n  3200: \" 50H\\\\QFNGLJKOKRLWNZQ[S[VZXWYRYOXJVGSFQF RNHMJLNLSMWNY RVYWWXSXNWJVH RQFOGNIMNMSNXOZQ[ RS[UZVXWSWNVIUGSF\",\n  3201: \" 28H\\\\QHQ[ RRHRZ RSFS[ RSFPINJ RM[W[ RQZO[ RQYP[ RSYT[ RSZU[\",\n  3202: \" 62H\\\\LJLKMKMJLJ RLIMINJNKMLLLKKKJLHMGPFTFWGXHYJYLXNUPPRNSLUKXK[ RWHXJXLWN RTFVGWJWLVNTPPR RKYLXNXSYWYYX RNXSZWZXY RNXS[W[XZYXYV\",\n  3203: \" 76H\\\\LJLKMKMJLJ RLIMINJNKMLLLKKKJLHMGPFTFWGXIXLWNTO RVGWIWLVN RSFUGVIVLUNSO RQOTOVPXRYTYWXYWZT[P[MZLYKWKVLUMUNVNWMXLX RWRXTXWWY RSOUPVQWTWWVZT[ RLVLWMWMVLV\",\n  3204: \" 28H\\\\SIS[ RTHTZ RUFU[ RUFJUZU RP[X[ RSZQ[ RSYR[ RUYV[ RUZW[\",\n  3205: \" 55H\\\\MFKPMNPMSMVNXPYSYUXXVZS[P[MZLYKWKVLUMUNVNWMXLX RWPXRXVWX RSMUNVOWRWVVYUZS[ RLVLWMWMVLV RMFWF RMGUG RMHQHUGWF\",\n  3206: \" 69H\\\\VIVJWJWIVI RWHVHUIUJVKWKXJXIWGUFRFOGMILKKOKULXNZQ[S[VZXXYUYTXQVOSNQNOONPMR RNIMKLOLUMXNY RWXXVXSWQ RRFPGOHNJMNMUNXOZQ[ RS[UZVYWVWSVPUOSN\",\n  3207: \" 43H\\\\KFKL RYFYIXLTQSSRWR[ RSRRTQWQ[ RXLSQQTPWP[R[ RKJLHNFPFUIWIXHYF RMHNGPGRH RKJLINHPHUI\",\n  3208: \" 79H\\\\PFMGLILLMNPOTOWNXLXIWGTFPF RNGMIMLNN RVNWLWIVG RPFOGNINLONPO RTOUNVLVIUGTF RPOMPLQKSKWLYMZP[T[WZXYYWYSXQWPTO RMQLSLWMY RWYXWXSWQ RPONPMSMWNZP[ RT[VZWWWSVPTO\",\n  3209: \" 69H\\\\MWMXNXNWMW RWOVQURSSQSNRLPKMKLLINGQFSFVGXIYLYRXVWXUZR[O[MZLXLWMVNVOWOXNYMY RMPLNLKMI RVHWIXLXRWVVX RQSORNQMNMKNHOGQF RSFUGVIWLWSVWUYTZR[\",\n  3210: \" 16MXRXQYQZR[S[TZTYSXRX RRYRZSZSYRY\",\n  3211: \" 24MXTZS[R[QZQYRXSXTYT\\\\S^Q_ RRYRZSZSYRY RS[T\\\\ RTZS^\",\n  3212: \" 32MXRMQNQORPSPTOTNSMRM RRNROSOSNRN RRXQYQZR[S[TZTYSXRX RRYRZSZSYRY\",\n  3213: \" 40MXRMQNQORPSPTOTNSMRM RRNROSOSNRN RTZS[R[QZQYRXSXTYT\\\\S^Q_ RRYRZSZSYRY RS[T\\\\ RTZS^\",\n  3214: \" 34MXRFQGQIRQ RRFRTST RRFSFST RSFTGTISQ RRXQYQZR[S[TZTYSXRX RRYRZSZSYRY\",\n  3215: \" 52I\\\\MKMJNJNLLLLJMHNGPFTFWGXHYJYLXNWOSQ RWHXIXMWN RTFVGWIWMVOUP RRQRTSTSQRQ RRXQYQZR[S[TZTYSXRX RRYRZSZSYRY\",\n  3216: \" 24MXTFRGQIQLRMSMTLTKSJRJQK RRKRLSLSKRK RRGQK RQIRJ\",\n  3217: \" 24MXTHSIRIQHQGRFSFTGTJSLQM RRGRHSHSGRG RSITJ RTHSL\",\n  3218: \" 74E_[O[NZNZP\\\\P\\\\N[MZMYNXPVUTXRZP[L[JZIXIUJSPORMSKSIRGPFNGMIMLNOPRTWWZY[[[\\\\Y\\\\X RKZJXJUKSLR RRMSI RSKRG RNGMK RNNPQTVWYYZ RN[LZKXKULSPO RMINMQQUVXYZZ[Z\\\\Y\",\n  3219: \" 56H\\\\PBP_ RTBT_ RXKXJWJWLYLYJXHWGTFPFMGKIKLLNOPURWSXUXXWZ RLLMNOOUQWRXT RMGLILKMMONUPXRYTYWXYWZT[P[MZLYKWKUMUMWLWLV\",\n  3220: \"  8G^[BIbJb R[B\\\\BJb\",\n  3221: \" 27KYUBSDQGOKNPNTOYQ]S`Ub RQHPKOOOUPYQ\\\\ RSDRFQIPOPUQ[R^S`\",\n  3222: \" 27KYOBQDSGUKVPVTUYS]Q`Ob RSHTKUOUUTYS\\\\ RQDRFSITOTUS[R^Q`\",\n  3223: \" 39JZRFQGSQRR RRFRR RRFSGQQRR RMINIVOWO RMIWO RMIMJWNWO RWIVINOMO RWIMO RWIWJMNMO\",\n  3224: \"  8F_JQ[Q[R RJQJR[R\",\n  3225: \" 16F_RIRZSZ RRISISZ RJQ[Q[R RJQJR[R\",\n  3226: \" 16F_JM[M[N RJMJN[N RJU[U[V RJUJV[V\",\n  3227: \" 11NWSFRGRM RSGRM RSFTGRM\",\n  3228: \" 22I[NFMGMM RNGMM RNFOGMM RWFVGVM RWGVM RWFXGVM\",\n  3229: \" 30KYQFOGNINKOMQNSNUMVKVIUGSFQF RQFNIOMSNVKUGQF RSFOGNKQNUMVISF\",\n  3250: \" 58H]TFQGOIMLLOKSKVLYMZO[Q[TZVXXUYRZNZKYHXGVFTF RQHOJNLMOLSLWMY RTYVWWUXRYNYJXH RTFRGPJOLNOMSMXNZO[ RQ[SZUWVUWRXNXIWGVF\",\n  3251: \" 20H]TJO[Q[ RWFUJP[ RWFQ[ RWFTIQKOL RTJRKOL\",\n  3252: \" 52H]OKOJPJPLNLNJOHPGSFVFYGZIZKYMWOMUKWI[ RXGYIYKXMVOSQ RVFWGXIXKWMUOMU RJYKXMXRYWYXX RMXRZWZ RMXR[U[WZXXXW\",\n  3253: \" 64H]OKOJPJPLNLNJOHPGSFVFYGZIZKYMXNVOSP RXGYIYKXMWN RVFWGXIXKWMUOSP RQPSPVQWRXTXWWYUZR[O[LZKYJWJULULWKWKV RVRWTWWVY RSPUQVSVWUYTZR[\",\n  3254: \" 15H]WJR[T[ RZFXJS[ RZFT[ RZFJUZU\",\n  3255: \" 49H]QFLP RQF[F RQGYG RPHUHYG[F RLPMOPNSNVOWPXRXUWXUZQ[N[LZKYJWJULULWKWKV RVPWRWUVXTZ RSNUOVQVUUXSZQ[\",\n  3256: \" 61H]YJYIXIXKZKZIYGWFTFQGOIMLLOKSKVLYMZO[R[UZWXXVXSWQVPTOQOOPNQMS RPINLMOLSLWMY RVXWVWSVQ RTFRGPJOLNOMSMXNZO[ RR[TZUYVVVRUPTO\",\n  3257: \" 39H]NFLL R[FZIXLTQRTQWP[ RRSPWO[ RXLRRPUOWN[P[ RMIPFRFWI ROGRGWI RMIOHRHWIYIZH[F\",\n  3258: \"104H]SFPGOHNJNMOOQPTPWOYNZLZIYGWFSF RUFPG RPHOJONPO ROORP RSPWO RXNYLYIXG RYGUF RSFQHPJPNQP RTPVOWNXLXHWF RQPMQKSJUJXKZN[R[VZWYXWXTWRVQTP RRPMQ RNQLSKUKXLZ RKZP[VZ RVYWWWTVR RVQSP RQPOQMSLULXMZN[ RR[TZUYVWVSUQTP\",\n  3259: \" 61H]XNWPVQTRQROQNPMNMKNIPGSFVFXGYHZKZNYRXUVXTZQ[N[LZKXKVMVMXLXLW ROPNNNKOI RXHYJYNXRWUUX RQRPQOOOKPHQGSF RVFWGXIXNWRVUUWSZQ[\",\n  3260: \" 16MXPXOYOZP[Q[RZRYQXPX RPYPZQZQYPY\",\n  3261: \" 22MXQ[P[OZOYPXQXRYR[Q]P^N_ RPYPZQZQYPY RQ[Q\\\\P^\",\n  3262: \" 32MXSMRNROSPTPUOUNTMSM RSNSOTOTNSN RPXOYOZP[Q[RZRYQXPX RPYPZQZQYPY\",\n  3263: \" 38MXSMRNROSPTPUOUNTMSM RSNSOTOTNSN RQ[P[OZOYPXQXRYR[Q]P^N_ RPYPZQZQYPY RQ[Q\\\\P^\",\n  3264: \" 34MXVFUFTGRT RVGUGRT RVGVHRT RVFWGWHRT RPXOYOZP[Q[RZRYQXPX RPYPZQZQYPY\",\n  3265: \" 59H]OKOJPJPLNLNJOHPGSFWFZG[I[KZMYNWOSPQQQSSTTT RUFZG RYGZIZKYMXNVO RWFXGYIYKXMWNSPRQRSST RPXOYOZP[Q[RZRYQXPX RPYPZQZQYPY\",\n  3266: \" 22MXWFUGTHSJSLTMUMVLVKUJTJ RUGTITJ RTKTLULUKTK\",\n  3267: \" 22MXVIUITHTGUFVFWGWIVKULSM RUGUHVHVGUG RVIVJUL\",\n  3268: \" 72E_\\\\O\\\\N[N[P]P]N\\\\M[MYNWPRXPZN[K[HZGXGVHTISKRPPROTMUKUITGRFPGOIOLPRQURWTZV[X[YYYX RL[HZ RIZHXHVITJSLR RPPQSTYVZ RK[JZIXIVJTKSMRRO ROLPOQRSVUYWZXZYY\",\n  3269: \" 52H]TBL_ RYBQ_ RZKZJYJYL[L[JZHYGVFRFOGMIMLNNPPVSWUWXVZ RNLONVRWT ROGNINKOMUPWRXTXWWYVZS[O[LZKYJWJULULWKWKV\",\n  3270: \"  8G^_BEbFb R_B`BFb\",\n  3271: \" 32JZZBXCUERHPKNOMSMXN\\\\O_Qb RSHQKOONTN\\\\ RZBWDTGRJQLPOOSN\\\\ RNTO]P`Qb\",\n  3272: \" 32JZSBUEVHWLWQVUTYR\\\\O_LaJb RVHVPUUSYQ\\\\ RSBTDUGVP RVHUQTUSXRZP]M`Jb\",\n  3273: \" 39J[TFSGUQTR RTFTR RTFUGSQTR ROIPIXOYO ROIYO ROIOJYNYO RYIXIPOOO RYIOO RYIYJONOO\",\n  3274: \"  8F_JQ[Q[R RJQJR[R\",\n  3275: \" 16F_RIRZSZ RRISISZ RJQ[Q[R RJQJR[R\",\n  3276: \" 16F_JM[M[N RJMJN[N RJU[U[V RJUJV[V\",\n  3277: \" 11MWUFTGRM RUGRM RUFVGRM\",\n  3278: \" 22H\\\\PFOGMM RPGMM RPFQGMM RZFYGWM RZGWM RZF[GWM\",\n  3279: \" 30KZSFQGPIPKQMSNUNWMXKXIWGUFSF RSFPIQMUNXKWGSF RUFQGPKSNWMXIUF\",\n  3301: \" 62F^IHJIIJHIIGKFMFOGPHQKQOPRNTLUIV ROHPKPPOR RMFNGOJOPNSLU RLVOY RKVOZ RIVN[UV R\\\\G[H\\\\H\\\\G[FYFWGVHUJUYW[[W RWHVJVXXZ RYFXGWJWWYY\",\n  3302: \"101E_GQGRHSJSLRLOKMIJIHKF RKOIK RJSKRKPIMHKHIIGKFNFPGQHRJRRQUOW RPHQJQT RNFOGPJPUOW RRISGUFWFYGZH[J\\\\K RYHZJ RWFXGYJZK\\\\K R\\\\KRP RYM[O\\\\R\\\\U[XYZV[S[PZJWIWHX RXNYN[P RVNYO[Q\\\\S RTZRZLWKW RZYXZUZRYNWKVIVHXHZI[JZIY\",\n  3303: \" 79F^RHPFNFLGJJINIRJVLYNZQ[T[WZYY[W RLHKJJMJRKVMYPZ RNFMGLIKMKQLUMWOYRZUZXY[W RUFRHQIPKPLQNTPURUT RQKQLUPUQ RQIQJRLUNVPVRUTSURUPTOR RUFVGXHZH RUGVHWH RTGVIXIZH[G\",\n  3304: \" 79E_HLHKIIKGNFRFUGWHYJ[M\\\\Q\\\\U[XYZV[S[PZJWIWHX RKHMGRGUHWIYK[N RTZRZLWKW RHKJIMHRHUIWJYL[O\\\\R RZYXZUZRYNWKVIVHXHZI[JZIY RPHMKLMLONSNU RMNMONQNR RMKMMOQOSNUMVKVJUJT\",\n  3305: \" 95F^RHPFNFLGJJINIRJVLYNZQ[T[WZYY[W RLHKJJMJRKVMYPZ RNFMGLIKMKQLUMWOYRZUZXY[W RUFRHQIPKPLQNTPURUT RQKQLUPUQ RQIQJRLUNVPVRUTSURUPTOR RUFVGXHZH RUGVHWH RTGVIXIZH[G RUNYK RYKZL\\\\L RXLYMZM RWMXNZN\\\\L\",\n  3306: \" 94F^MNKMJKJIKGNFQFTGXI RKHMGRGUH RJKKIMHRHXIZI[H[GZFYF RSHRIQKQMROVSWVWYV\\\\U]S^ RTPWSXVXYW[ RQMSOVQXSYVYYX[V]S^O^L]K\\\\JZJWLTLRKQ RL\\\\K[KWLU RO^M]L[LWMTMRLQJQIRIS RUPYL RYLZM\\\\M RXMYNZN RWNXOZO\\\\M\",\n  3307: \" 99E_UJTHSGQFNFKGIJHNHRIUJWLYNZQ[T[WZYY[W\\\\T\\\\Q[NYL RKHJJIMIRJUKW RZW[U[QZNYM RNFLGKIJMJRKVLXNZ RWZYXZUZQYOWM RUFRHPJOLOMPOSQTSTU RPLPMTQTR RPJPKQMTOUQUSTURVQVOUNS RTOYLZJ R\\\\FZJ RYG]I R\\\\F[GYGZHZJ[I]I\\\\H\\\\F\",\n  3308: \" 92F_RFPGNIMKMMNOPQQSQU RNLNMQQQR RNINKOMQORQRSQUPVNWLWJVIUHSHQIPJQIR RRFTHVHXG RQGSH RPGQHSIUIXG RRPYK RYK[N\\\\Q\\\\T[WYYVZR[ RXLZN[Q[UZW RVMWMYOZRZVYXXYVZ RVZTZRYPYNZM\\\\N^P_R_T^ RSZQZ RR[PZNZ\",\n  3309: \" 83F_PPNPLOKNJLJJKHLGOFQFTGWJYK RLHNGRGTHUI RJJKIMHQHTIVJYK[K\\\\J\\\\H[GYG RJXKYJZIYIWJVLVNWPYR\\\\T^ RNXOYQ\\\\R] RLVMWNYP\\\\Q]S^V^X]Y\\\\ZZZWYUWRVPVO RYXYWVRVQ RX]Y[YYXWVTURUPWNYNZOZP\",\n  3310: \" 83F_PPNPLOKNJLJJKHLGOFQFTGWJYK RLHNGRGTHUI RJJKIMHQHTIVJYK[K\\\\J\\\\H[GYG RJXKYJZIYIWJVLVNWPYR\\\\T^ RNXOYQ\\\\R] RLVMWNYP\\\\Q]S^V^X]Y\\\\ZZZWYUWRVPVO RYXYWVRVQ RX]Y[YYXWVTURUPWNYNZOZP\",\n  3311: \" 81E_[KZIXGUFRFOGMILKLNMQPWPYN[ RMNMOPUPV RNHMJMMNOPSQVQXPZN[L[JZ RHVJZ RGYKW RHVHXGYIYJZJXKWIWHV RNONMOKQJTJVKXMYM RUKWM RRJTKULVN RYMPQ RUOYXZY[Y RTPXXZZ RSPWYY[\\\\X\",\n  3312: \" 73G^ZSYTVTUSUQVOXLYJYH RVQVPYLYK RWTVSVRWPYNZLZJYHXGUFPFMGLHKJKLLNNQOSOTNV RLKLLOQOR RLHLJMLOOPQPSOUMWJY RMWOWRYUZXZZY RNXOXSZTZ RJYLXMXQZT[V[YZZY[W\",\n  3313: \"128BbEQERFSHSJRJOIMGJGHIF RIOGK RHSIRIPGMFKFIGGIFKFMGOIPLPROUNWLYI[HZGZ RNIOLORNUMW RJZIYHY RKFMHNKNRMVLXKYJXIXF[ RNGPFRFTGVIWLWRVUUWSYQ[PZOZ RUIVLVRUV RRZQYPY RRFTHUKUSTWSYRXQXN[ RUHVGXFZF\\\\G]H^J_K R\\\\H]J RZF[G\\\\J]K_K R_K\\\\M[NZQZT[X][`X R\\\\N[P[T\\\\W^Z R_K]M\\\\O\\\\S]W_Y\",\n  3314: \" 96D`GQGRHSJSLRLOKMIJIHKF RKOIK RJSKRKPIMHKHIIGKFNFPGRISLSRRUQWOYL[KZIZG[ RQIRKRRQUPWOX RMZKYIY RNFPHQKQRPVNYLXJXG[ RRHSGUFWFYGZH[J\\\\K RYHZJ RWFXGYJZK\\\\K R\\\\KYMXNWQWTXXZ[]X RYNXPXTYW[Z R\\\\KZMYOYSZW\\\\Y\",\n  3315: \" 72D`PFNGLIKKKMMQMS RLLLMMOMP RLILKNONQMSLTJTISIR RPFQGWIZK[M\\\\P\\\\S[VZXXZU[R[OZIWHWGX RPGQHWJYKZL RPFPHQIWKYL[N\\\\P RSZQZKWJW RYYWZTZQYMWJVHVGXGZH[IZHY\",\n  3316: \"100E`HQHRISKSMRMOLMJJJHLF RLOJK RKSLRLPJMIKIIJGLFOFQGRHSJSU RSWS\\\\R^P_M_L^L\\\\M[N\\\\M] RQHRJR\\\\Q^ ROFPGQJQU RQWQ\\\\P^O_ RSJXF RXFZI[K\\\\O\\\\R[UYXV[ RWGZK[N[O RVHXJZM[P[SZVYX RWYUVSU RQUOVMX RWZUWSVPV RV[TXSW RQWOWMX\",\n  3317: \" 88D`PFNGLIKKKMMQMS RLLLMMOMP RLILKNONQMSLTJTISIR RPFQGWIZK[M\\\\P\\\\S[VZX RXZU[R[OZIWHWGX RPGQHWJYKZL RPFPHQIWKYL[N\\\\P RSZQZKWJW RXZTZQYMWJVHVGXGZH[IZHY RTXVVXV\\\\Z]Z RWWXW[Z RUWVWZ[\\\\[^Y\",\n  3318: \" 96D`GQGRHSJSLRLOKMIJIHKF RKOIK RJSKRKPIMHKHIIGKFNFPGQHRJRVQXOZM[K[IZ RPHQJQVPX RNFOGPJPVOYM[ RGVIZ RFYJW RGVGXFYHYIZIXJWHWGV RRISGUFWFYGZH[J\\\\K RYHZJ RWFXGYJZK\\\\K R\\\\KRP RTOXYZ[]X RUOYX[Z RVNZX[Y\\\\Y\",\n  3319: \" 83E`\\\\H[G\\\\F]G]I\\\\KZKVISHOHKIIK RYJVHSGOGLH R]I\\\\JZJVGSFOFLGJIIKHNHRIUJWLYNZQ[U[XZZY\\\\W]T]Q\\\\OZNWNUOSRQSOS RLXNYQZUZYY RIUKWMXPYUYYX[W\\\\V]T RXOWOSSRS R]Q[OYOWPUSSTQTOSNQNOOMQL\",\n  3320: \" 81F_LNJMIKIIJGMFRFUGYJ[J\\\\I RJHLGRGUHXJ RIKJILHRHUIYK[K\\\\I\\\\G[FZG[H RUIRLQNQPSTSV RRORPSRSS RRLRNTRTTSVRWPWOVOT RJYKZJ[IZIXJVLVOWSYVZYZ[Y RLWMWSZUZ RIXJWKWMXQZT[W[ZZ\\\\X\",\n  3321: \" 45G]JHKHLILWJX RKGMHMXPZ RIILFNHNWPYRY RJXKXMYO[RYVV RTHUHVIVYX[[X RUGWHWYYZ RSIVFYHXIXXYYZY\",\n  3322: \"100D`GQGRHSJSLRLOKMIJIHKF RKOIK RJSKRKPIMHKHIIGKFNFPGQHRJRRQUOW RPHQJQT RNFOGPJPUOW RRISGUFWFYG[J\\\\K RYHZJ RWFXGYJZK\\\\K RZKXKWLWNXP[R\\\\T RXO[Q RWMXN[P\\\\R\\\\V[XYZW[S[PZJWIWHX RTZRZLWKW RZYXZUZRYNWKVIVHXHZI[JZIY\",\n  3323: \"143BcEQERFSHSJRJOIMGJGHIF RIOGK RHSIRIPGMFKFIGGIFLFNGOHPJPNOQMTKV RNHOJOONR RLFMGNJNOMSKV RNGPFSFUG RWFTGSISMTPVSWUWWVY RTMTNWSWT RWFUGTITLUNWQXTXVWXUZS[O[MZKXIWGWFX RNZKWJW RQ[OZLWJVGVFXFZG[HZGY RWFZF\\\\G^J_K R\\\\H]J RZF[G\\\\J]K_K R]K[KZLZN[P^R_T R[O^Q RZM[N^P_R_W^Y]Z[[X[UZ RYZXZVY R^Y\\\\ZZZXYWX\",\n  3324: \" 86F^KHMHOIPJQMQO RQQQUPXM[KZI[ RNZLYKY ROYNYLXI[ RMGPHQIRLRUSWUYWZ RIINFPGRISLSO RSQSTTWUXWYYY RQURXTZV[[X RSLTIWFYG[F RVGXHYH RUHVHXI[F RKSMOQO RSOWOYM RMPWP RKSMQQQ RSQWQYM\",\n  3325: \" 74E_HQHRISKSMRMOLMJJJHLF RLOJK RKSLRLPJMIKIIJGLFOFQGRHSJSORRQTQUSWTW RQHRJRPQSPUSX ROFPGQJQPPTOVRYUV RSJ[F RYGYZX] RZGZXY[ R[F[VZZY\\\\W^T_P_M^K\\\\JZKYLZK[\",\n  3326: \" 74F^NIOGQFTFVGWHXJXMWOVPTQ RQQOPNN RVHWIWNVO RTFUGVIVNUPTQ RMUNSORQQTQWRYTZVZZY\\\\W^T_P_N^KZJY RXTYVYZX\\\\ RTQWSXUX[W]V^T_ RO^N]LZKY RR_P^O]MZLYIYHZH\\\\I]J]\",\n  3401: \" 46J[TMQNOONPMSMVNYO[UX RNVOYPZ RQNOPNSNUOXQZ RRNSOUPUYW[ZX RSNVPVXXZ RTMUNWOXO RWPXO RWPWXXYYY\",\n  3402: \" 50J[LHMINK RTFQGOINKNXMY RPIOKOXRZ RTFRGQHPKPXRYSZ RMYNYPZQ[TZ RPPVMWOXRXUWXVYTZ RUNVOWQ RTNVPWSWUVXTZ\",\n  3403: \" 27KXRNTPVOTMRNOPNRNWOYQ[UY RSNUO RPPOROWPYQZ RQOPQPVQXSZ\",\n  3404: \" 47J[QFNINKOLSNVPWRWUVXTZ ROJOKSMVOWP ROHOIPJUMWOXRXUWXTZQ[ RRNNPNXMY ROPOXRZ RPOPXRYSZ RMYNYPZQ[\",\n  3405: \" 27KXPUVQSMOPNRNWOYQ[UY RUQRN RPPOROWPYQZ RTRROQOPQPVQXSZ\",\n  3406: \" 49LYXFWGUGSFQFPHPMOONP RVHTHRGQG RXFWHVITIRHQHPI RPKQMRNTOVOVP RNPPP RRPVP RPPPTQ` RSOPOQNQ[ RRPRTQ`\",\n  3407: \" 53J[TMQNOONPMSMVNYO[UX RNWOYPZ RQNOPNSNUOXQZ RRNSOUPUXV[V]U_ RSNVPVZ RTMUNWOXO RWPXO RWPW\\\\V^U_S`P`N_M^M]N]N^\",\n  3408: \" 50J[LHMINK RTFQGOINKNXMY RPIOKOYPZ RTFRGQHPKPXQYRY RMYOZP[SX RPPVMWOXSXWWZV\\\\T^Q` RUNVOWR RTNVQWTWWV[T^\",\n  3409: \" 39MWRFQGQHRISHSGRF RQGSH RQHSG ROOPOQPQYS[VX RPNRORXTZ RNPQMRNTO RSPTO RSPSXTYUY\",\n  3410: \" 45MWRFQGQHRISHSGRF RQGSH RQHSG ROOPOQPQ[P^O_M` RPNROR[Q] RNPQMRNTO RSPTO RSPS[R]P_M` RS[T]U^\",\n  3411: \" 63KYNHOIPK RUFSGQIPKPMOONP RPPPXOY RRIQKQM RQOPOQMQXSZ RUFSHRKRO RRPRXSYTY ROYQZR[UX RRLVIWJWLUNSO RUJVKVLUN RROWOWP RNPPP RRPWP\",\n  3412: \" 29MWOHPIQK RWFTGRIQKQXPY RSIRKRYTZ RWFUGTHSKSXTYUY RPYRZS[VX\",\n  3413: \" 74E_GOHOIPIXHYJ[ RHNJPJXIYJZKYJX RFPIMKOKXLYJ[ RNNPOQQQXPYR[ RPNQORQRXQYRZSYRX RKPNNPMRNSPSXTYR[ RVNWOYPYY[[^X RWNZPZX\\\\Z RSPVNXMYN[O\\\\O R[P\\\\O R[P[X\\\\Y]Y\",\n  3414: \" 49I[KOLOMPMXLYN[ RLNNPNXMYNZOYNX RJPMMOOOXPYN[ RRNSOUPUYW[ZX RSNVPVXXZ ROPRNTMUNWOXO RWPXO RWPWXXYYY\",\n  3415: \" 41J[NPNXMY ROPOXRZ RQOPPPXRYSZ RMYNYPZQ[TZ RNPQOVMWOXRXUWXVYTZ RUNVOWQ RTNVPWSWUVXTZ\",\n  3416: \" 57J[OJMLMNNQNXLZ RNYO` RNMNNOQO[ RNKNLONPQPXQXSYTZ RPYO` RSZQY RTZR[PY RNYLZ RPPVMWOXRXUWXVYTZ RUNVOWQ RTNVPWSWUVXTZ\",\n  3417: \" 43J[TMQNOONPMSMVNYO[UX RNWOYPZ RQNOPNSNUOXQZ RRNSOUPUXV` RSNVPV[ RTMUNWOXO RWPXO RWPWXV`\",\n  3418: \" 32KYNOOOPPPXOY RONQPQYSZ RMPPMRORXSYTY ROYQZR[UX RTNUPWOVMRO RUNVO\",\n  3419: \" 42LWXFWGUGSFQFPHPMOONP RVHTHRGQG RXFWHVITIRHQHPI RPKRP RPPPTQ` RQOPOQNQ[ RRPRTQ` RNPPP\",\n  3420: \" 37LXSIRLQNPONP RSISOVOVP RNPQP RSPVP RQPQXPY RROQORMRXTZ RSPSXTYUY RPYRZS[VX\",\n  3421: \" 47I[KOLOMPMXLY RLNNPNXPZ RJPMMOOOXQYRZ RLYMYOZP[RZUX RVMTOUPUYW[ZX RVPWOVNUOVPVXXZ RVMXOWPWXXYYY\",\n  3422: \" 47J[OKMMMONRNXMY RNNNOOROXRZ RNLNMOOPRPXRYSZ RMYNYPZQ[TZ RPPVMWOXRXUWXVYTZ RUNVOWQ RTNVPWSWUVXTZ\",\n  3423: \" 72F_KKIMIOJRJXIYK[ RJNJOKRKXJYKZLYKX RJLJMKOLRLXMYK[ RONQORQRXQY RQNROSQSXVZ RLPONQMSNTPTXVYWZ RQYRYTZU[XZ RTPZM[O\\\\R\\\\T[XZYXZ RYNZO[Q RXNZP[S[UZXXZ\",\n  3424: \" 44KZOOPOQPQXPXNYM[M]N_P`S`V_V^U^U_ RPNRPRXUZ RNPQMSOSXUYVZ RXYT[SZQYOYM[ RUNVPXOWMSO RVNWO\",\n  3425: \" 47J[OKMMMONRNXMY RNNNOOROYQZ RNLNMOOPRPXQYRY RMYOZP[SX RPPVMWOXSXWWZV\\\\T^Q` RUNVOWR RTNVQWTWWV[T^\",\n  3426: \" 43KYNPSMUNVPVRUTQV RSNUO RRNTOUQURTTSU RSUUWVYV]U_S`Q`O_N]N[OYQXWV RRVTWUY RQVTXUZU]T_S`\",\n  3427: \" 61JZRMPNMPMRNU RNPNROT RPNOOORPT RPNROTOVNWMWKVJTJ RQNSN RRMTNVN RNUVRWUWWVYR[ RUSVUVXUY RTSUUUXTZ RTZRYOYL[ RSZQZ RR[PZNZL[\",\n  3428: \" 78J[VFUGSGQFOFNHNMMOLP RTHRHPGOG RVFUHTIRIPHOHNI RNKPP RNPNTO` ROONOONO[ RPPPTO` RLPNP RPPUMWNXPXRWTSV RUNWO RTNVOWQWRVTUU RUUWVXXX[W]U_R` RUVWW RSVTVVWWYW\\\\V^\",\n  3429: \" 62J[PIOLNNMOKP RPIPXQYO[ ROONOONOXNYOZPYOX RKPNPNXMYO[ RPPUMWNXPXRWTSV RUNWO RTNVOWQWRVTUU RUUWVXXX[W]U_R` RUVWW RSVTVVWWYW\\\\V^\",\n  3501: \" 60G]LINGPFRFSGZW[X]X RQGRHYXZZ[YYX RNGPGQHXXYZZ[[[]X RLMMLOKPKQL RPLPM RMLOLPN RG[IYKXNXPY RJYNYOZ RG[JZMZN[PY RRJLX RNSVS\",\n  3502: \"110F^HHJFMFOGQF RKGNG RHHJGLHOHQF RMKLLKNKOIOHPHRIQKQKW RLMLU RIPLP RMKMTLVKW RRIQJPLPU RQKQS RRIRRQTPU RRIXFZG[I[KYMUO RXGZIZK RVGXHYIYLWN RWNZP[R[X RYPZRZW RWNXOYQYX RJ[MYPXTXWY RLZOYTYVZ RJ[NZSZU[WYYX[X RUOUX RURYR RUUYU\",\n  3503: \" 69E]NGLHJJILHOHSIVJXMZP[S[VZXYZW[U RJKINISKWNYQZTZWY RNGLIKKJNJRKUNXQYTYWXYW[U RPJPV RQJQT RRIRSQUPV RPJRIUFWGYGZF RTGVHXH RSHUIWIYHZF RWIWX\",\n  3504: \" 72G^IFWFYGZIZX RKGWGYIYW RIFJGLHWHXIXX ROKNLMNMOKOJPJRKQMQMV RNMNT RKPNP ROKOSNUMV RI[LYOXSXVY RKZNYSYUZ RI[MZRZT[VYXXZX RRHRX RRMTNVNXM RRSTRVRXS\",\n  3505: \" 94G]IHKFMFOGQF RLGNG RIHKGMHOHQF RNKMLLNLOJOIPIRJQLQLW RMMMU RJPMP RNKNTMVLW RQMRJSHTGVFXF[G RTHVGXGZH RRJSIUHWHYI[G RQURRSPTOVOXP RTPVPWQ RRRSQUQVRXP RK[NYRXWX[Y RMZPYWYZZ RK[OZVZY[[Y RQMQX\",\n  3506: \" 91F]JHLFOFQGSF RMGPG RJHLGNHQHSF RPKOLNNNOLOKPKRLQNQNV ROMOT RLPOP RPKPSOUNV RSJSYRZQZMXKXIYG[ RTJTX RTPXP RPZOZMYJY RUIUOXO RXQUQUWTYP[N[LZJZG[ RSJUIXFZG\\\\G]F RWGYH[H RVHXIZI\\\\H]F RXIXW\",\n  3507: \" 87E^NGLHJJILHOHRIUJWLYNZQ[U[XZZX[V[SZQYPWOUO RJKINISJV RNGLIKKJNJSKVLXNZ RYXZWZSYQ RU[WZXYYWYSXQWPUO RPJPW RQJQU RRIRTQVPW RPJRIUFWGYGZF RTGVHXH RSHUIWIYHZF RYHUOU[ RUSYS RUVYV\",\n  3508: \"112F^HHJFMFOGQF RKGNG RHHJGLHOHQF RMKLLKNKOIOHPHRIQKQKW RLMLU RIPLP RMKMTLVKW RJ[MYPXSXUY RLZOYRYTZ RJ[NZQZS[UY RRIQJPLPU RQKQS RRIRRQTPU RRITGVFXFZG RWGXGYH RTGVGXIZG RUOWNYLZM[P[TZXX[ RXMYNZPZUYX RWNXNYPYUX[ RUOUY RURYR RUUYU\",\n  3509: \" 67I\\\\LHNFQFTGVF ROGSG RLHNGQHTHVF RSKRLQNQOOONPNROQQQQV RRMRT ROPRP RSKSSRUQV RYHWJVMVXUZSZOXMXKYI[ RWKWW RRZQZOYLY RYHXJXVWXUZS[P[NZKZI[\",\n  3510: \" 65H\\\\LHNFQFTGVF ROGSG RLHNGQHTHVF RSKRLQNQOOONPNROQQQQV RRMRT ROPRP RSKSSRUQV RYHWJVMVXUZ RWKWW RYHXJXVWXUZR[O[LZJXJVKULUMVLWKW RJVMV\",\n  3511: \"115F^HHJFMFOGQF RKGNG RHHJGLHOHQF RMKLLKNKOIOHPHRIQKQKW RLMLU RIPLP RMKMTLVKW RJ[MYPXSXUY RLZNYRYTZ RJ[NZQZS[UY RRIQJPLPU RQKQS RRIRRQTPU RRITGVFXFZG RWGXGYH RTGVGXIZG RUOXLYM[N RWMYN[N R[NYQWSUU RWSYTZX[Z\\\\Z RYVZZ RWSXTYZZ[[[\\\\Z RUOUY\",\n  3512: \" 85G]IHKFNFPGRF RLGOG RIHKGMHPHRF RNKMLLNLOJOIPIRJQLQLW RMMMU RJPMP RNKNTMVLW RK[NYRXWX[Y RMZPYWYZZ RK[OZVZY[[Y RSIRJQLQU RRKRS RSISRRTQU RSIUGWFYF[G RXGYGZH RUGWGYI[G RWGWX\",\n  3513: \"107D`LJKKJMJOHOGPGRHQJQJU RKLKS RHPKP RLJLRKTJU RE[GYIXKXMYNYOX RHYKYMZ RE[GZJZL[M[NZOX RLJPFTJTWUYVY RPGSJSXRYSZTYSX RPPSP RNHOHRKROOO ROQRQRXQYS[VYWX RTJXF\\\\J\\\\W]Y^Y RXG[J[X]Z RXP[P RVHWHZKZOWO RWQZQZY\\\\[^Y ROHOX RWHWX\",\n  3514: \" 84E^GIIGKFMFOGQJVUXXYY RMGOIPKVWYZ RIGKGMHOKTVVYWZY[ RVHXIZI\\\\H]F RWGYH[H RVHXFZG\\\\G]F RKOIOHPHRIQKQ RIPKP RG[IYKXNXPY RJYMYOZ RG[JZMZN[PY RKGKX RYIY[ RRLSMUNWNYM RKTMSQSST\",\n  3515: \" 79E_NFLGJIIKHNHRIUJWLYNZQ[S[VZXYZW[U\\\\R\\\\N[KZIXGVFUGRIOJ RJJIMISJV RNFLHKJJMJSKVLXNZ RZV[S[MYIXH RVZXXYVZSZMYKWHUG ROJOW RPJPU RQJQTPVOW RUGUZ RUMWNXNZM RUSWRXRZS\",\n  3516: \" 70H^KFLGMIMOKOJPJRKQMQMYJ[MZMbO` RMHNJN` RKPNP RKFMGNHOJO` ROKRIVFZJZX RVGYJYX RTHUHXKXY RRXUXXY RSYUYWZ RRZTZV[XYZX RRIR_ RRMTNVNXM RRSTRVRXS\",\n  3517: \" 99E_NFLGJIIKHNHRIUJWLYNZP[T[VZXYZW[U\\\\R\\\\N[KZIXGVFUGRIOJ RJJIMISJV RNFLHKJJMJSKVLXNZ RZV[S[MYIXH RVZXXYVZSZMYKWHUG ROJOW RPJPU RQJQTPVOW RUGUZ RUMWNXNZM RUSWRXRZS RP[QZRZT[X`Za[a RT\\\\V_XaYa RRZS[VaXbZb[a\",\n  3518: \"108F^HHJFMFOGQF RKGNG RHHJGLHOHQF RMKLLKNKOIOHPHRIQKQKW RLMLU RIPLP RMKMTLVKW RJ[MYPXRXUY RLZNYRYTZ RJ[NZQZS[UY RRIQJPLPU RQKQS RRIRRQTPU RRIUGWFYGZIZLYNXOTQRR RWGXGYIYMXN RUGWHXJXMWOTQ RTQVRWSZX[Y\\\\Y RWTYX[Z RTQVSXYZ[\\\\Y\",\n  3519: \" 94G^UITHRGOF RVHTG RWGSFOFLGKHJJKLLMONWNYOZPZRYU RKKLLOMXMZN[O[QZS RKHKJLKOLYL[M\\\\O\\\\QYUU[ RIOJPLQUQVRVSUU RJQLRTRUS RIOIPJRLSSSUTUU RI[LYPXSXVY RKZNYRYUZ RI[MZRZU[ RWGUISL RRNPQ ROSMUKVJVJUKV\",\n  3520: \" 71E]JJILHOHSIVKYMZP[S[VZXYZW[U RISJVLXNYQZTZWY RJJIMIQJTLWNXQYTYWXYW[U RHIIGKFOFUGYG[F RPGTHXH RHIIHKGNGTIWIYH[F RSIRJPKPV RQKQT RRJRSQUPV RWIWX\",\n  3521: \" 89F^HHJFLFOGQF RKGNG RHHJGMHOHQF RKJJLIOISJVKXMZP[S[VZXYZ[\\\\Y RJSKVNYQZTZ RKJJNJQKTLVNXQYUYXX RUIQJPLPV RQKQT RRJRSQUPV RUIWHYFZG\\\\HZIZW[Y\\\\Y RYIZHYGXHYIYX[Z RWHXIXX RUIUY RUNXN RURXR\",\n  3522: \" 72G^JFKGLILOJOIPIRJQLQLXJY RLHMJMX RJPMP RNYQYSZ RJFLGMHNJNXRXUY RJYMYPZR[UYXXZX RRJUIWHYFZG\\\\HZIZX RYIZHYGXHYIYW RWHXIXX RRJRX RRMTNVNXM RRSTRVRXS\",\n  3523: \" 95E`HFIGJIJOHOGPGRHQJQJXHY RJHKJKX RHPKP RLYNYPZ RHFJGKHLJLXOXQY RHYKYNZO[QYTXVYW[YY\\\\X ROHRFTHTXWXYY RRGSHSX ROHQHRIRXQY RWYXZ RWHZF\\\\H\\\\X RZG[H[X RWHYHZIZXYY ROHOX RWHWX RONRN RORRR RWNZN RWRZR\",\n  3524: \" 65G]HIJGLFNFOGWYXZZZ RMGNHVYWZ RJGLGMHUZV[X[ZZ\\\\X RWFYG[G\\\\F RWGXHZH RVHWIYI[H\\\\F RH[IYKXMXNY RJYLYMZ RH[IZKZM[ RWFSO RQRM[ RLPPP RSPXP\",\n  3525: \" 86G^JFKGLILOJOIPIRJQLQLXJY RLHMJMX RJPMP RNYQYSZ RJFLGMHNJNXRXUY RJYMYPZR[UYXX RRJUIWHYFZG\\\\HZIZ^Y`WbUaQ`L` RYIZHYGXHYIYY RWHXIXXZ[ RXaV`S` RY`V_P_L` RRJRX RRMTNVNXM RRSTRVRXS\",\n  3526: \" 57H\\\\XGWIROOSMWJ[ RVKNV RZFWJUNRRMXLZ RJHLFOGUGZF RKGOHSHWG RJHNIRIVHXG RLZNYRXVXZY RMZQYUYYZ RJ[OZUZX[ZY RMPQP RTPXP\",\n  3601: \" 53J[PRNTMVMXNZP[RYUX RMVNXOYQZ RNTNVOXQYRY RNPPPSOUNVMXOWPWXXYYY RONNOQO RTOWOVNVYWZ RMOOMPNROUPUYW[YY RMORT\",\n  3602: \" 44I[LHMJMXKY RNJMHNGNXQZ RLHOFOXQYRZ RKYMYOZP[RZUYWY ROPROTNUMVNXOYOWPWY RTNVOVX RROSOUPUY\",\n  3603: \" 35JXNONXLYMYOZP[ ROOOYQZ RPOPXRYSYQZP[ RNORNTMUNWOXO RSNTOVO RPORNTPVPXO\",\n  3604: \" 41IZRMPNMOMXKY RNONXQZ RRMOOOXQYRZ RKYMYOZP[RZUYWY RMHPFQIWOWY RPINHOGPIVOVX RMHUPUY\",\n  3605: \" 32JXNONXLYMYOZP[ ROOOYQZ RPOPXRYSYQZP[ RNORNTMWQURPU RSNVQ RPORNUR\",\n  3606: \" 41JWNHNXLYMYOZP[ ROHOYQZ RPHPXRYSYQZP[ RNHQGSFTGVHWH RRGSHUH RPHQGSIUIWH RKMNM RPMTM\",\n  3607: \" 56I[MOMXKYLYNZO[PZRYUX RNPNYPZ ROOOXQYRY RMOOORNTMUNWOYOWPW\\\\V_TaRbQaO`M` RSNVPV\\\\ RSaQ`P` RRNSOUPUZV]V_ RTaS`Q_O_M`\",\n  3608: \" 47I[LHMJMXKYLYNZO[ RNJMHNGNYPZ RLHOFOXQYO[ ROPROTNUMVNXOYOWPWYU[T] RTNVOVYU[ RROSOUPUYT]T`UbVbT`\",\n  3609: \" 35MWRFPHRITHRF RRGQHSHRG RRMQNOOQPQYS[UY RRPSORNQORPRYSZ RRMSNUOSPSXTYUY\",\n  3610: \" 39MWRFPHRITHRF RRGQHSHRG RRMQNOOQPQYS[T] RRPSORNQORPRYS[ RRMSNUOSPSYT]T`RbPbPaRb\",\n  3611: \" 50IZLHMJMXKYLYNZO[ RNJMHNGNYPZ RLHOFOXQYO[ ROPRNTMVPSROU RSNUP RRNTQ RSRTSVXWYXY RSSTTUYVZ RRSSTTYV[XY\",\n  3612: \" 22MWPHQJQXOYPYRZS[ RRJQHRGRYTZ RPHSFSXUYVYTZS[\",\n  3613: \" 67E_GOHOIPIXGYHYJZK[ RINJOJYLZ RGOIMKOKXMYK[ RKPNOPNQMSOSXUYS[ RPNRORYTZ RNOOOQPQXPYRZS[ RSPVOXNYMZN\\\\O]O[P[X\\\\Y]Y RXNZOZY[Z RVOWOYPYY[[]Y\",\n  3614: \" 45I[KOLOMPMXKYLYNZO[ RMNNONYPZ RKOMMOOOXQYO[ ROPROTNUMVNXOYOWPWXXYYY RTNVOVYWZ RROSOUPUYW[YY\",\n  3615: \" 40I[MOMXKY RNPNXQZ ROOOXQYRZ RKYMYOZP[RZUYWY RMOOORNTMUNWOYOWPWY RSNVPVX RRNSOUPUY\",\n  3616: \" 54I[LMMOMXKYMYMb RMNNONaO`N^ RNYOYQZ RLMNNOOOXQYRZ ROZP[RZUYWY ROZO^P`Mb ROPROTNUMVNXOYOWPWY RTNVOVX RROSOUPUY\",\n  3617: \" 44I[MOMXKY RNPNYPZ ROOOXQYRY RKYLYNZO[PZRYUX RMOOORNTMUNWOYOWPWb RSNVPVaU`V^ RRNSOUPU^T`Wb\",\n  3618: \" 38JXLOMONPNXLYMYOZP[ RMNOOOYQZ RLONMPOPXRYSYQZP[ RPOTMUNWOXO RSNTOVO RRNTPVPXO\",\n  3619: \" 59JZMOMSOTUTWUWY RNONS RVUVY RPNOOOSQT RSTUUUYTZ RMOPNRMTNVNWM RQNSN RPNROTOVN RWYTZR[PZNZL[ RSZQZ RTZRYOYL[ RWMVOTROWL[\",\n  3620: \" 28MWPHQJQXOYPYRZS[ RRJQHRGRYTZ RPHSFSXUYVYTZS[ RNMQM RSMVM\",\n  3621: \" 47I[KOLOMPMXKY RLNNONYPZ RKOMMOOOXQYRY RKYLYNZO[PZRYUX RUMVNXOYOWPWXXYYY RTNVOVYWZ RUMSOUPUYW[YY\",\n  3622: \" 36I[LMMOMXP[RYUXWX RMNNONXQZ RLMNNOOOWPXRY RUMVNXOYOWPWX RTNVOVW RUMSOUPUX\",\n  3623: \" 57E_HMIOIXL[NYQX RINJOJXMZ RHMJNKOKWLXNY RQMOOQPQXT[VYYX[X RPNRORXUZ RQMRNTOSPSWTXVY RYMZN\\\\O]O[P[X RXNZOZW RYMWOYPYX\",\n  3624: \" 59H[KOLONPOQSYTZV[XY RMNOOTYVZ RKOMMONPOTWUXWYXY RRSUMVNXNYM RUNVOWO RTOVPXOYM RQUN[MZKZJ[ RNZMYLY ROYMXKYJ[ RMTPT RSTVT\",\n  3625: \" 60I[KOLOMPMXKY RLNNONYPZ RKOMMOOOXQYRY RKYLYNZO[PZRYUX RUMVNXOYOWPW\\\\V_TaRbQaO`M` RTNVOV\\\\ RSaQ`P` RUMSOUPUZV]V_ RTaS`Q_O_M`\",\n  3626: \" 38I[XML[ RLONPQPTOXM RMNOOSO RLONMPNTNXM RL[PYSXVXXY RQYUYWZ RL[PZTZV[XY RNTVT\",\n  3700: \" 42H\\\\LHLXJY RMIMXPZ RNHNXPYQZ RLHNHSGUF RSGTHVIVY RTGWIWX RUFVGXHZHXIXY RJYLYNZO[QZVYXY\",\n  3701: \" 27H\\\\OHPIQKQXOY RQIPHQGRIRYTZ ROHRFSHSXUYVY ROYPYRZS[TZVY\",\n  3702: \" 48H\\\\LHNHPGQFSGVHXH RPHRG RLHNIPIRHSG RVHVP RWIWO RXHXPQPNQLSKVK[ RK[OYSXVXZY RNZQYVYYZ RK[PZUZX[ZY\",\n  3703: \" 57H\\\\LHMHOGPFRGVHXH ROHQG RLHNIPIRG RVHVO RWIWN RXHXOVOSPQQ RQPSQVRXRXY RWSWX RVRVY RKYMXOXQYRZ ROYQZ RKYMYOZP[RZVYXY\",\n  3704: \" 41H\\\\UFKPKUTU RVUZU[V[TZU RLPLT RMNMU RTGTXRY RUJVHUGUYWZ RUFWHVJVXXYYY RRYSYUZV[WZYY\",\n  3705: \" 53H\\\\LFLO RLFXF RMGVG RLHUHWGXF RVLUMSNOOLO RSNTNVOVY RUMWNWX RVLWMYNZNXOXY RKYMXOXQYRZ ROYQZ RKYMYOZP[RZVYXY\",\n  3706: \" 59H\\\\LHLXJY RMIMXPZ RNHNXPYQZ RLHNHRGTFUGWHXH RSGUH RRGTIVIXH RNPOPSOUNVM RSOTOVPVY RUNWPWX RVMWNYOZOXPXY RJYLYNZO[QZVYXY\",\n  3707: \" 38H\\\\KHMFPGUGZF RLGOHTHWG RKHOIRIVHZF RZFYHWKSOQRPUPXQ[ RRQQTQWRZ RUMSPRSRVSYQ[\",\n  3708: \" 71H\\\\LILO RMJMN RNINO RLINISHUGVF RSHTHVIVO RUGWHWN RVFWGYHZHXIXO RLONOVRXR RXOVONRLR RLRLXJY RMSMXPZ RNRNXPYQZ RVRVY RWSWX RXRXY RJYLYNZO[QZVYXY\",\n  3709: \" 60H\\\\LHLQJR RMIMROS RNHNQPRQR RLHNHSGUF RSGTHVIVY RTGWIWX RUFVGXHZHXIXY RJRKRMSNTOSQRUQVQ RKYMXOXQYRZ ROYQZ RKYMYOZP[RZVYXY\",\n  3710: \" 11LXRXPZR[TZRX RRYQZSZRY\",\n  3711: \" 14LXR^R\\\\PZRXSZS\\\\R^P_ RRYQZR[RY\",\n  3712: \" 22LXRMPORPTORM RRNQOSORN RRXPZR[TZRX RRYQZSZRY\",\n  3713: \" 25LXRMPORPTORM RRNQOSORN RR^R\\\\PZRXSZS\\\\R^P_ RRYQZR[RY\",\n  3714: \" 30LXRFQGOHQIRT RRISHRGQHRIRT RRFSGUHSIRT RRXPZR[TZRX RRYQZSZRY\",\n  3715: \" 51I[LJMHNGQFSFVGWHXJXLWNUPSQ RMJNH RVHWIWMVN RLJNKNIOGQF RSFUGVIVMUOSQ RRQRTSQQQRT RRXPZR[TZRX RRYQZSZRY\",\n  3716: \" 14LXTFRGQIQKRMTKRIRG RRJRLSKRJ\",\n  3717: \" 14LXRLRJPHRFSHSJRLPM RRGQHRIRG\",\n  3718: \" 62E_YNZO[O\\\\N RXOYP[P RXPYQZQ[P\\\\N RYNST RRUL[HVNP ROOSKOFJLPRTXVZX[Z[[Z\\\\X RLZIV RRKOG RKLPQTWVYXZ[Z RMZIU RRLNG RKKQQUWVXXY[Y\\\\X\",\n  3719: \" 60H\\\\PBP_ RTBT_ RTFVGWIWKYJXHWGTFPFMGKIKLLNOPURWSXUXXWZ RXJWH RLLMNOOUQWRXT RMYLW RMGLILKMMONUPXRYTYWXYWZT[P[MZLYKWMVMXNZP[\",\n  3720: \"  8G^[BIbJb R[B\\\\BJb\",\n  3721: \" 27KYUBSDQGOKNPNTOYQ]S`Ub RQHPKOOOUPYQ\\\\ RSDRFQIPOPUQ[R^S`\",\n  3722: \" 27KYOBQDSGUKVPVTUYS]Q`Ob RSHTKUOUUTYS\\\\ RQDRFSITOTUS[R^Q`\",\n  3723: \" 39JZRFQGSQRR RRFRR RRFSGQQRR RMINIVOWO RMIWO RMIMJWNWO RWIVINOMO RWIMO RWIWJMNMO\",\n  3724: \"  8F_JQ[Q[R RJQJR[R\",\n  3725: \" 16F_RIRZSZ RRISISZ RJQ[Q[R RJQJR[R\",\n  3726: \" 16F_JM[M[N RJMJN[N RJU[U[V RJUJV[V\",\n  3727: \" 11NWSFRGRM RSGRM RSFTGRM\",\n  3728: \" 22I[NFMGMM RNGMM RNFOGMM RWFVGVM RWGVM RWFXGVM\",\n  3729: \" 30KYQFOGNINKOMQNSNUMVKVIUGSFQF RQFNIOMSNVKUGQF RSFOGNKQNUMVISF\",\n  3801: \" 52E_NHLIJKIMHPHSIUKV RJLIOISJU RNHLJKLJOJRKVKXJZH[ RVHXHXYVY RYHYY RZGZZ RHFKGQHVHZG\\\\F RJPXP RH[KZQYVYZZ\\\\[\",\n  3802: \" 65E_LGLZ RMGMZ RPFNGNZP[ RHJJHLGPFUFXGZIZKYM RXHYIYKXM RUFWGXIXKWL RQUOTNRNPONPMSLVLYM[O\\\\Q\\\\T[WYYWZT[P[LZJYHW RZO[Q[UZW RVLYNZQZUYXWZ\",\n  3803: \" 60E_\\\\F[HZJXHVGSFQFNGLHJJILHOHRIUJWLYNZQ[S[VZXYZW[Y\\\\[ R[HZMZT[Y RZKYJ RZNYKXIVG RJKINISJV RNGLIKKJNJSKVLXNZ RYWZV RVZXXYVZS\",\n  3804: \" 46E_KGKZ RLGLZ RNFMGMZN[ RHKIIKGNFSFVGXHZJ[L\\\\O\\\\R[UZWXYVZS[N[KZIXHV RZK[N[SZV RVGXIYKZNZSYVXXVZ\",\n  3805: \" 86E_\\\\F[HZJXHVGSFQFNGLHJJILHOHRIUJWLYNZQ[S[VZXYZW[Y\\\\[ R[HZMZT[Y RZKYJ RZMXIVG RJKINISJV RNGLIKKJNJSKVLXNZ RYWZV RVZXXYVZS RJPKONOUQXQZP RPPRQURWRYQ RMORRUSWSYRZP RZMYLXLWMXNYM\",\n  3806: \" 69E_JHJZ RMGKHKY ROFMGLILYNY RHJJHLGOFSFVGXHYI\\\\F R\\\\F[HZLZO[S\\\\U RZIYK RVGXIYLZO RLPMOOOTPWPYO RQPTQVQXP RNOTRVRXQYOYLXKWKVLWMXL RH[JZNYSYYZ\\\\[\",\n  3807: \" 90E_\\\\F[HZJXHVGSFQFNGLHJJILHOHRIUJWLYNZQ[T[VZXYYXZV[Y\\\\[ R[HZMZT[Y RZKYJ RZNYKXIVG RJKINISJV RNGLIKKJNJSKVLXNZ RXXYVYR RVZWYXVXQ RKSLRMSLTKTJS RJPKNMMOMRNUPWQ RKOMNONROTP RJPLOOOUQYQZP\",\n  3808: \" 50E_JGJZH[ RKHKZ RNHLHLZ RHFJGNHSHYG\\\\F RLPMNOLRKVKYL[N\\\\Q\\\\T[UYV RZN[P[SZU RVKXLYMZOZSYVYXZZ\\\\[ RH[LZPZU[\",\n  3809: \" 23E_QIQY RRJRX RSISY RHFLHPITIXH\\\\F RH[KZOYUYYZ\\\\[\",\n  3810: \" 42E_TIVIVXUZS[ RWIWXVY RXHXY RHFLHPITIXH\\\\F RIOHQHUIXKZN[S[VZXYZW\\\\T RIUJXKY RHSJUKXLZN[\",\n  3811: \" 70E_JGJZH[ RKHKZ RNHLHLZ RHFJGNHSHYG\\\\F RLPMNOLRKUKXLYMYOXPSRQSPTPUQVRUQT RWLXMXOWP RUKWMWOVPSR RSRVRYSZUZWYX RWSYUYW RSRVSXUYXZZ[[\\\\[ RH[LZPZU[\",\n  3812: \" 45E_JGJZ RKHKY RNHLHLYNY R\\\\KZNYPXSXUYW[X RZOYRYUZW R\\\\K[MZQZT[X\\\\[ RHFJGNHSHYG\\\\F RH[JZNYSYYZ\\\\[\",\n  3813: \" 68E_QIQY RRJRX RSISY RNYLWJVIUHRHMIJKHMGPFTFWGYH[J\\\\M\\\\R[UZVXWVY RJUIRIMJJ RLWKUJRJLKIMG RZJ[M[RZU RWGYIZLZRYUXW RHFLHPITIXH\\\\F RH[KZOYUYYZ\\\\[\",\n  3814: \" 48E_JHJZH[ RLHKIKZ ROFMGLILZ RHJJHLGOFSFVGXHZJ[L\\\\O\\\\S[UYV RZK[N[RZU RVGXIYKZNZRYVYXZZ[[\\\\[ RH[LZPZU[\",\n  3815: \" 54E_QFNGLHJJILHOHRIUJWLYNZQ[S[VZXYZW[U\\\\R\\\\O[LZJXHVGSFQF RJKINISJV RNGLIKKJNJSKVLXNZ RZV[S[NZK RVZXXYVZSZNYKXIVG\",\n  3816: \" 51E_JIJZ RMHKJKY RQFOGMILKLYNY RHKJINGQFTFWGYH[J\\\\M\\\\O[RYTVURUOTMRLO RZJ[L[PZR RWGYIZLZPYSVU RH[JZNYSYYZ\\\\[\",\n  3817: \" 74E_QFNGLHJJILHOHRIUJWLYNZQ[S[VZXYZW[U\\\\R\\\\O[LZJXHVGSFQF RJKINISJV RNGLIKKJNJSKVLXNZ RZV[S[NZK RVZXXYVZSZNYKXIVG RJSKUNVTW[W\\\\X\\\\Z[[[Z\\\\Y RPWRW RKUNWQXSXTW\",\n  3818: \" 69E_JIJZH[ RKIKZ RLHLZ RHKJILHNGQFUFYG[I\\\\K\\\\N[PZQ RYHZI[K[NZP RUFWGYIZKZOYQ RXRUSRSPRPPROUOXPZR\\\\U\\\\W[XZX RXQYR[V[WZT RTOVPXRYTZX[Z\\\\[ RH[LZPZU[\",\n  3819: \" 94E_TFZG\\\\F[H[JYHWGTFPFMGJJIMIOJRLTOURUTTUSVQVP R[GZH[J RJPKRLSOTRTTS RKIJKJNKPMRPSRSTRVPWOXO RLQMQNPPNRMUMWNYPZRZUYXWZ RPMRLULXMZO[R[UZW RIWJYIZ RNPNOOMPLRKUKXL[O\\\\R\\\\T[WYYWZT[P[MZKYIWIYH[JZP[\",\n  3820: \" 66E_QHMHKIJJILHOHSIVJXKYMZP[S[VZXYZW[U\\\\R\\\\N[KYIWH RUHTITKULVKUJ RISJVLXNYQZTZWY RJJINIQJTLWNXQYTYWXYW[T\\\\R RHFKI RKHLG RIGJGKFMGQHWHZG\\\\F\",\n  3821: \" 51E_LHJJILHOHRIUJWLYNZQ[U[XZZY RKJJLIOISJV RKILJLKKMJPJSKVLXNZ RVHXHXXWZU[ RYHYXXY RZGZY\\\\[ RHFKGQHVHZG\\\\F\",\n  3822: \" 31E_HFR[ RIGJHQWRY RJGKHRWSX R\\\\FR[ RWNUS RYLUQTTTV RHFJGOHUHZG\\\\F\",\n  3823: \" 67E_LHJJILHOHRIUJWLYNZQ[S[VZXYZW[U\\\\R\\\\O[LZJXH RJLIOIRJUKW RJJKKKLJOJRKVLXNZ RYWZU[R[OZL RVZXXYVZRZOYLYKZJ RQIQ[ RRJRZ RSIS[ RHFLHPITIXH\\\\F\",\n  3824: \" 41E_HFXYYZ RIGKHZZ RLH\\\\[ R\\\\FSP RQRJZ RPSMULW RQRMTLUKWKY RHFLHPITIXH\\\\F RH[JZNYSYYZ\\\\[\",\n  3825: \" 47E_XHXZ RYHYY RZGZY RKHIJHMHPISKUMVPWSWVVXU RLUOVUV RHPIRKTNUTUVV RHFLHPITIXH\\\\F RHWJYLZP[T[XZ\\\\X\",\n  3826: \" 73E_HFIGKHNHSFVFYGZIZKYM RXGYIYKXM RVFWGXIXL RXNTOROPNPLRKTKXL RTKVLWMVNTO RYM[O\\\\R\\\\T[WYYWZT[P[MZKYIWHTHRIOJNLMNMPNPPOQNPOO RXMZO[Q[UZW RXNYOZQZUYXWZ\",\n  3901: \" 42J[PQMTMXP[TY RNTNXPZ ROROWRZ RRSMNNMONNO RONSNUMWOWXXY RUNVOVXUYVZWYVX RSNUPUXTYV[XY\",\n  3902: \" 31IZNHLFMJMXP[UYWX RNHNXPZ RNHPFOJOWRZ ROOTMWPWX RTNVPVX RRNUQUY\",\n  3903: \" 23KWNPNYP[RY ROPOYPZ RPOPXQYRY RNPTMVOTPRN RSNUO\",\n  3904: \" 32JZRMMPMXP[RZUYWY RNPNXPZ ROOOWRZ RPIPFQIWPWY RPIVPVX RPIMIPJUPUY\",\n  3905: \" 25KXNPNYP[RY ROPOYPZ RPOPXQYRY RNPTMWQPU RSNVQ RRNUR\",\n  3906: \" 32KWOIOXNYP[ RPIPXOYPZQYPX RQHQXRYP[ ROIUFWHUISG RTGVH RLMOM RQMUM\",\n  3907: \" 41J[MPMXP[UY RNPNXPZ ROOOWRZ RMPOOTMWPW]V_U`SaQaO`MaObQa RTNVPV]U_ RPaNa RRNUQU^T`Sa\",\n  3908: \" 42I[NHLFMJMXLYN[ RNHNXMYNZOYNX RNHPFOJOXPYN[ ROORNTMWPWYT]T`UbVbT` RTNVPVYU[ RRNUQUZT]\",\n  3909: \" 37MWRFPHRJTHRF RRGQHRISHRG RRMPOQPQXPYR[ RRPSORNQORPRXQYRZSYRX RRMTOSPSXTYR[\",\n  3910: \" 37MWRFPHRJTHRF RRGQHRISHRG RRMPOQPQYT] RRPSORNQORPRYS[ RRMTOSPSZT]T`RbPaPbRb\",\n  3911: \" 51IZNHLFMJMXLYN[ RNHNXMYNZOYNX RNHPFOJOXPYN[ ROPRNTMVPSROU RSNUP RRNTQ RRSSTTYV[XY RSSTUUYVZ RSRTSVXWYXY\",\n  3912: \" 21MWRHPFQJQXPYR[ RRHRXQYRZSYRX RRHTFSJSXTYR[\",\n  3913: \" 66E_GOHOIPIXHYJ[ RINJOJXIYJZKYJX RGOIMKOKXLYJ[ RKONNPMSOSXTYR[ RPNRORXQYRZSYRX RNNQPQXPYR[ RSOVNXM[O[X\\\\YZ[ RXNZOZXYYZZ[YZX RVNYPYXXYZ[\",\n  3914: \" 44I[KOLOMPMXLYN[ RMNNONXMYNZOYNX RKOMMOOOXPYN[ ROORNTMWOWXXYV[ RTNVOVXUYVZWYVX RRNUPUXTYV[\",\n  3915: \" 28JZMPMXP[UYWX RNPNXPZ ROOOWRZ RMPOOTMWPWX RTNVPVX RRNUQUY\",\n  3916: \" 47IZLMMOMXKYMYM_LbN` RNON` RLMNNOOOXQYRZ RNYOYQZ ROZP[UYWX ROZO_PbN` ROORNTMWPWX RTNVPVX RRNUQUY\",\n  3917: \" 31J[MPMXP[UY RNPNXPZ ROOOWRZ RMPOOTMWPW_XbV` RTNVPV` RRNUQU_TbV`\",\n  3918: \" 31KXMONOOPOXNYP[ RONPOPXOYPZQYPX RMOOMQOQXRYP[ RQOUMWOUPSN RTNVO\",\n  3919: \" 41JZMPMSOUURWTWX RNPNSOT ROOOSPT RUSVTVX RTSUTUY RMPSMVNTOQN RRNUN RWXQ[MYOXSZ ROYQZ\",\n  3920: \" 27MWRHPFQJQXPYR[ RRHRXQYRZSYRX RRHTFSJSXTYR[ RNMQM RSMVM\",\n  3921: \" 40I[KOLOMPMYP[UY RMNNONYPZ RKOMMOOOXRZ RVMXOWPWXXYYY RVPWOVNUOVPVYWZ RVMTOUPUYW[YY\",\n  3922: \" 36I[LMMOMXQ[SYWW RMNNONXQZ RLMNNOOOWRYSY RVMXOWPWW RVPWOVNUOVPVW RVMTOUPUX\",\n  3923: \" 59E_HMIOIXM[OYQX RINJOJXMZ RHMJNKOKWNYOY RRMPOQPQXU[WY[W RRPSORNQORPRXUZ RRMTOSPSWVYWY RZM\\\\O[P[W RZP[OZNYOZPZW RZMXOYPYX\",\n  3924: \" 39I[LONPUZV[XY RMNOOUYWZ RLONMONVXXY RXMVMVOXOXMVOSS RQUNYL[N[NYLYL[ RNTQT RSTVT\",\n  3925: \" 49I[KOLOMPMYP[UY RMNNONYPZ RKOMMOOOXRZ RVMXOWPW]V_U`SaQaO`MaObQa RVPWOVNUOVPV^U_ RPaNa RVMTOUPU^T`Sa\",\n  3926: \" 43L[RNOPOORNTMWOWSRU RTNVOVS RRNUPUSTT RRUWWW]V_U`SaQaO`MaObQa RVWV^U_ RPaNa RTVUWU^T`Sa\"\n};\nconst SYMB = {\n  \"\\\\frac\": { glyph: 0, arity: 2, flags: {} },\n  \"\\\\binom\": { glyph: 0, arity: 2, flags: {} },\n  \"\\\\sqrt\": {\n    glyph: 2267,\n    arity: 1,\n    flags: { opt: true, xfl: true, yfl: true }\n  },\n  \"^\": { glyph: 0, arity: 1, flags: {} },\n  _: { glyph: 0, arity: 1, flags: {} },\n  \"(\": { glyph: 2221, arity: 0, flags: { yfl: true } },\n  \")\": { glyph: 2222, arity: 0, flags: { yfl: true } },\n  \"[\": { glyph: 2223, arity: 0, flags: { yfl: true } },\n  \"]\": { glyph: 2224, arity: 0, flags: { yfl: true } },\n  \"\\\\langle\": { glyph: 2227, arity: 0, flags: { yfl: true } },\n  \"\\\\rangle\": { glyph: 2228, arity: 0, flags: { yfl: true } },\n  \"|\": { glyph: 2229, arity: 0, flags: { yfl: true } },\n  \"\\\\|\": { glyph: 2230, arity: 0, flags: { yfl: true } },\n  \"\\\\{\": { glyph: 2225, arity: 0, flags: { yfl: true } },\n  \"\\\\}\": { glyph: 2226, arity: 0, flags: { yfl: true } },\n  \"\\\\#\": { glyph: 2275, arity: 0, flags: {} },\n  \"\\\\$\": { glyph: 2274, arity: 0, flags: {} },\n  \"\\\\&\": { glyph: 2273, arity: 0, flags: {} },\n  \"\\\\%\": { glyph: 2271, arity: 0, flags: {} },\n  \"\\\\begin\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\end\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\left\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\right\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\middle\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\cdot\": { glyph: 2236, arity: 0, flags: {} },\n  \"\\\\pm\": { glyph: 2233, arity: 0, flags: {} },\n  \"\\\\mp\": { glyph: 2234, arity: 0, flags: {} },\n  \"\\\\times\": { glyph: 2235, arity: 0, flags: {} },\n  \"\\\\div\": { glyph: 2237, arity: 0, flags: {} },\n  \"\\\\leqq\": { glyph: 2243, arity: 0, flags: {} },\n  \"\\\\geqq\": { glyph: 2244, arity: 0, flags: {} },\n  \"\\\\leq\": { glyph: 2243, arity: 0, flags: {} },\n  \"\\\\geq\": { glyph: 2244, arity: 0, flags: {} },\n  \"\\\\propto\": { glyph: 2245, arity: 0, flags: {} },\n  \"\\\\sim\": { glyph: 2246, arity: 0, flags: {} },\n  \"\\\\equiv\": { glyph: 2240, arity: 0, flags: {} },\n  \"\\\\dagger\": { glyph: 2277, arity: 0, flags: {} },\n  \"\\\\ddagger\": { glyph: 2278, arity: 0, flags: {} },\n  \"\\\\ell\": { glyph: 662, arity: 0, flags: {} },\n  \"\\\\vec\": {\n    glyph: 2261,\n    arity: 1,\n    flags: { hat: true, xfl: true, yfl: true }\n  },\n  \"\\\\overrightarrow\": {\n    glyph: 2261,\n    arity: 1,\n    flags: { hat: true, xfl: true, yfl: true }\n  },\n  \"\\\\overleftarrow\": {\n    glyph: 2263,\n    arity: 1,\n    flags: { hat: true, xfl: true, yfl: true }\n  },\n  \"\\\\bar\": { glyph: 2231, arity: 1, flags: { hat: true, xfl: true } },\n  \"\\\\overline\": { glyph: 2231, arity: 1, flags: { hat: true, xfl: true } },\n  \"\\\\widehat\": {\n    glyph: 2247,\n    arity: 1,\n    flags: { hat: true, xfl: true, yfl: true }\n  },\n  \"\\\\hat\": { glyph: 2247, arity: 1, flags: { hat: true } },\n  \"\\\\acute\": { glyph: 2248, arity: 1, flags: { hat: true } },\n  \"\\\\grave\": { glyph: 2249, arity: 1, flags: { hat: true } },\n  \"\\\\breve\": { glyph: 2250, arity: 1, flags: { hat: true } },\n  \"\\\\tilde\": { glyph: 2246, arity: 1, flags: { hat: true } },\n  \"\\\\underline\": { glyph: 2231, arity: 1, flags: { mat: true, xfl: true } },\n  \"\\\\not\": { glyph: 2220, arity: 1, flags: {} },\n  \"\\\\neq\": { glyph: 2239, arity: 1, flags: {} },\n  \"\\\\ne\": { glyph: 2239, arity: 1, flags: {} },\n  \"\\\\exists\": { glyph: 2279, arity: 0, flags: {} },\n  \"\\\\in\": { glyph: 2260, arity: 0, flags: {} },\n  \"\\\\subset\": { glyph: 2256, arity: 0, flags: {} },\n  \"\\\\supset\": { glyph: 2258, arity: 0, flags: {} },\n  \"\\\\cup\": { glyph: 2257, arity: 0, flags: {} },\n  \"\\\\cap\": { glyph: 2259, arity: 0, flags: {} },\n  \"\\\\infty\": { glyph: 2270, arity: 0, flags: {} },\n  \"\\\\partial\": { glyph: 2265, arity: 0, flags: {} },\n  \"\\\\nabla\": { glyph: 2266, arity: 0, flags: {} },\n  \"\\\\aleph\": { glyph: 2077, arity: 0, flags: {} },\n  \"\\\\wp\": { glyph: 2190, arity: 0, flags: {} },\n  \"\\\\therefore\": { glyph: 740, arity: 0, flags: {} },\n  \"\\\\mid\": { glyph: 2229, arity: 0, flags: {} },\n  \"\\\\sum\": { glyph: 2402, arity: 0, flags: { big: true } },\n  \"\\\\prod\": { glyph: 2401, arity: 0, flags: { big: true } },\n  \"\\\\bigoplus\": { glyph: 2284, arity: 0, flags: { big: true } },\n  \"\\\\bigodot\": { glyph: 2281, arity: 0, flags: { big: true } },\n  \"\\\\int\": { glyph: 2412, arity: 0, flags: { yfl: true } },\n  \"\\\\oint\": { glyph: 2269, arity: 0, flags: { yfl: true } },\n  \"\\\\oplus\": { glyph: 1284, arity: 0, flags: {} },\n  \"\\\\odot\": { glyph: 1281, arity: 0, flags: {} },\n  \"\\\\perp\": { glyph: 738, arity: 0, flags: {} },\n  \"\\\\angle\": { glyph: 739, arity: 0, flags: {} },\n  \"\\\\triangle\": { glyph: 842, arity: 0, flags: {} },\n  \"\\\\Box\": { glyph: 841, arity: 0, flags: {} },\n  \"\\\\rightarrow\": { glyph: 2261, arity: 0, flags: {} },\n  \"\\\\to\": { glyph: 2261, arity: 0, flags: {} },\n  \"\\\\leftarrow\": { glyph: 2263, arity: 0, flags: {} },\n  \"\\\\gets\": { glyph: 2263, arity: 0, flags: {} },\n  \"\\\\circ\": { glyph: 902, arity: 0, flags: {} },\n  \"\\\\bigcirc\": { glyph: 904, arity: 0, flags: {} },\n  \"\\\\bullet\": { glyph: 828, arity: 0, flags: {} },\n  \"\\\\star\": { glyph: 856, arity: 0, flags: {} },\n  \"\\\\diamond\": { glyph: 743, arity: 0, flags: {} },\n  \"\\\\ast\": { glyph: 728, arity: 0, flags: {} },\n  \"\\\\log\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\ln\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\exp\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\mod\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\lim\": { glyph: 0, arity: 0, flags: { txt: true, big: true } },\n  \"\\\\sin\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\cos\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\tan\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\csc\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\sec\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\cot\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\sinh\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\cosh\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\tanh\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\csch\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\sech\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\coth\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\arcsin\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\arccos\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\arctan\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\arccsc\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\arcsec\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\arccot\": { glyph: 0, arity: 0, flags: { txt: true } },\n  \"\\\\text\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\mathnormal\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\mathrm\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\mathit\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\mathbf\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\mathsf\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\mathtt\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\mathfrak\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\mathcal\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\mathbb\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\mathscr\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\rm\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\it\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\bf\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\sf\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\tt\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\frak\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\cal\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\bb\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\scr\": { glyph: 0, arity: 1, flags: {} },\n  \"\\\\quad\": { glyph: 0, arity: 0, flags: {} },\n  \"\\\\,\": { glyph: 0, arity: 0, flags: {} },\n  \"\\\\.\": { glyph: 0, arity: 0, flags: {} },\n  \"\\\\;\": { glyph: 0, arity: 0, flags: {} },\n  \"\\\\!\": { glyph: 0, arity: 0, flags: {} },\n  \"\\\\alpha\": { glyph: 2127, flags: {} },\n  \"\\\\beta\": { glyph: 2128, flags: {} },\n  \"\\\\gamma\": { glyph: 2129, flags: {} },\n  \"\\\\delta\": { glyph: 2130, flags: {} },\n  \"\\\\varepsilon\": { glyph: 2131, flags: {} },\n  \"\\\\zeta\": { glyph: 2132, flags: {} },\n  \"\\\\eta\": { glyph: 2133, flags: {} },\n  \"\\\\vartheta\": { glyph: 2134, flags: {} },\n  \"\\\\iota\": { glyph: 2135, flags: {} },\n  \"\\\\kappa\": { glyph: 2136, flags: {} },\n  \"\\\\lambda\": { glyph: 2137, flags: {} },\n  \"\\\\mu\": { glyph: 2138, flags: {} },\n  \"\\\\nu\": { glyph: 2139, flags: {} },\n  \"\\\\xi\": { glyph: 2140, flags: {} },\n  \"\\\\omicron\": { glyph: 2141, flags: {} },\n  \"\\\\pi\": { glyph: 2142, flags: {} },\n  \"\\\\rho\": { glyph: 2143, flags: {} },\n  \"\\\\sigma\": { glyph: 2144, flags: {} },\n  \"\\\\tau\": { glyph: 2145, flags: {} },\n  \"\\\\upsilon\": { glyph: 2146, flags: {} },\n  \"\\\\varphi\": { glyph: 2147, flags: {} },\n  \"\\\\chi\": { glyph: 2148, flags: {} },\n  \"\\\\psi\": { glyph: 2149, flags: {} },\n  \"\\\\omega\": { glyph: 2150, flags: {} },\n  \"\\\\epsilon\": { glyph: 2184, flags: {} },\n  \"\\\\theta\": { glyph: 2185, flags: {} },\n  \"\\\\phi\": { glyph: 2186, flags: {} },\n  \"\\\\varsigma\": { glyph: 2187, flags: {} },\n  \"\\\\Alpha\": { glyph: 2027, flags: {} },\n  \"\\\\Beta\": { glyph: 2028, flags: {} },\n  \"\\\\Gamma\": { glyph: 2029, flags: {} },\n  \"\\\\Delta\": { glyph: 2030, flags: {} },\n  \"\\\\Epsilon\": { glyph: 2031, flags: {} },\n  \"\\\\Zeta\": { glyph: 2032, flags: {} },\n  \"\\\\Eta\": { glyph: 2033, flags: {} },\n  \"\\\\Theta\": { glyph: 2034, flags: {} },\n  \"\\\\Iota\": { glyph: 2035, flags: {} },\n  \"\\\\Kappa\": { glyph: 2036, flags: {} },\n  \"\\\\Lambda\": { glyph: 2037, flags: {} },\n  \"\\\\Mu\": { glyph: 2038, flags: {} },\n  \"\\\\Nu\": { glyph: 2039, flags: {} },\n  \"\\\\Xi\": { glyph: 2040, flags: {} },\n  \"\\\\Omicron\": { glyph: 2041, flags: {} },\n  \"\\\\Pi\": { glyph: 2042, flags: {} },\n  \"\\\\Rho\": { glyph: 2043, flags: {} },\n  \"\\\\Sigma\": { glyph: 2044, flags: {} },\n  \"\\\\Tau\": { glyph: 2045, flags: {} },\n  \"\\\\Upsilon\": { glyph: 2046, flags: {} },\n  \"\\\\Phi\": { glyph: 2047, flags: {} },\n  \"\\\\Chi\": { glyph: 2048, flags: {} },\n  \"\\\\Psi\": { glyph: 2049, flags: {} },\n  \"\\\\Omega\": { glyph: 2050, flags: {} }\n};\nfunction asciiMap(x, mode = \"math\") {\n  const c = x.charCodeAt(0);\n  if (65 <= c && c <= 90) {\n    const d = c - 65;\n    if (mode == \"text\" || mode == \"rm\") {\n      return d + 2001;\n    } else if (mode == \"tt\") {\n      return d + 501;\n    } else if (mode == \"bf\" || mode == \"bb\") {\n      return d + 3001;\n    } else if (mode == \"sf\") {\n      return d + 2501;\n    } else if (mode == \"frak\") {\n      return d + 3301;\n    } else if (mode == \"scr\" || mode == \"cal\") {\n      return d + 2551;\n    } else {\n      return d + 2051;\n    }\n  }\n  if (97 <= c && c <= 122) {\n    const d = c - 97;\n    if (mode == \"text\" || mode == \"rm\") {\n      return d + 2101;\n    } else if (mode == \"tt\") {\n      return d + 601;\n    } else if (mode == \"bf\" || mode == \"bb\") {\n      return d + 3101;\n    } else if (mode == \"sf\") {\n      return d + 2601;\n    } else if (mode == \"frak\") {\n      return d + 3401;\n    } else if (mode == \"scr\" || mode == \"cal\") {\n      return d + 2651;\n    } else {\n      return d + 2151;\n    }\n  }\n  if (48 <= c && c <= 57) {\n    const d = c - 48;\n    if (mode == \"it\") {\n      return d + 2750;\n    } else if (mode == \"bf\") {\n      return d + 3200;\n    } else if (mode == \"tt\") {\n      return d + 700;\n    } else {\n      return d + 2200;\n    }\n  }\n  return {\n    \".\": 2210,\n    \",\": 2211,\n    \":\": 2212,\n    \";\": 2213,\n    \"!\": 2214,\n    \"?\": 2215,\n    \"'\": 2216,\n    '\"': 2217,\n    \"*\": 2219,\n    \"/\": 2220,\n    \"-\": 2231,\n    \"+\": 2232,\n    \"=\": 2238,\n    \"<\": 2241,\n    \">\": 2242,\n    \"~\": 2246,\n    \"@\": 2273,\n    \"\\\\\": 804\n  }[x];\n}\nconst CONFIG = {\n  SUB_SUP_SCALE: 0.5,\n  SQRT_MAG_SCALE: 0.5,\n  FRAC_SCALE: 0.85,\n  LINE_SPACING: 0.5,\n  FRAC_SPACING: 0.4\n};\nfunction tokenize(str) {\n  str = str.replace(/\\n/g, \" \");\n  let i = 0;\n  const tokens = [];\n  let curr = \"\";\n  while (i < str.length) {\n    if (str[i] == \" \") {\n      if (curr.length) {\n        tokens.push(curr);\n        curr = \"\";\n      }\n    } else if (str[i] == \"\\\\\") {\n      if (curr.length == 1 && curr[0] == \"\\\\\") {\n        curr += str[i];\n        tokens.push(curr);\n        curr = \"\";\n      } else {\n        if (curr.length) {\n          tokens.push(curr);\n        }\n        curr = str[i];\n      }\n    } else if (/[A-Za-z0-9\\.]/.test(str[i])) {\n      curr += str[i];\n    } else {\n      if (curr.length && curr != \"\\\\\") {\n        tokens.push(curr);\n        curr = \"\";\n      }\n      curr += str[i];\n      tokens.push(curr);\n      curr = \"\";\n    }\n    i++;\n  }\n  if (curr.length)\n    tokens.push(curr);\n  return tokens;\n}\nfunction parseAtom(x) {\n  return {\n    type: SYMB[x] ? \"symb\" : \"char\",\n    mode: \"math\",\n    text: x,\n    chld: [],\n    bbox: null\n  };\n}\nfunction parse(tokens) {\n  let i = 0;\n  let expr = {\n    type: \"node\",\n    text: \"\",\n    mode: \"math\",\n    chld: [],\n    bbox: null\n  };\n  function takeOpt() {\n    if (tokens[i] != \"[\") {\n      return null;\n    }\n    let lvl = 0;\n    let j = i;\n    while (j < tokens.length) {\n      if (tokens[j] == \"[\") {\n        lvl++;\n      } else if (tokens[j] == \"]\") {\n        lvl--;\n        if (!lvl) {\n          break;\n        }\n      }\n      j++;\n    }\n    const ret = parse(tokens.slice(i + 1, j));\n    i = j;\n    return ret;\n  }\n  function takeN(n) {\n    let j = i;\n    let j0 = j;\n    let lvl = 0;\n    let cnt = 0;\n    const ret = [];\n    while (j < tokens.length) {\n      if (tokens[j] == \"{\") {\n        if (!lvl) {\n          j0 = j;\n        }\n        lvl++;\n      } else if (tokens[j] == \"}\") {\n        lvl--;\n        if (!lvl) {\n          ret.push(parse(tokens.slice(j0 + 1, j)));\n          cnt++;\n          if (cnt == n) {\n            break;\n          }\n        }\n      } else {\n        if (lvl == 0) {\n          ret.push(parseAtom(tokens[j]));\n          cnt++;\n          if (cnt == n) {\n            break;\n          }\n        }\n      }\n      j++;\n    }\n    i = j;\n    return ret;\n  }\n  for (i = 0; i < tokens.length; i++) {\n    const s = SYMB[tokens[i]];\n    const e = {\n      type: \"\",\n      text: tokens[i],\n      mode: \"math\",\n      chld: [],\n      bbox: null\n    };\n    if (s) {\n      if (s.arity) {\n        i++;\n        e.type = \"func\";\n        let opt = null;\n        if (s.flags.opt) {\n          opt = takeOpt();\n          if (opt)\n            i++;\n        }\n        const chld = takeN(s.arity);\n        e.chld = chld;\n        if (opt) {\n          e.chld.push(opt);\n        }\n      } else {\n        e.type = \"symb\";\n      }\n    } else {\n      if (tokens[i] == \"{\") {\n        e.type = \"node\";\n        e.text = \"\";\n        e.chld = takeN(1);\n      } else {\n        e.type = \"char\";\n      }\n    }\n    expr.chld.push(e);\n  }\n  if (expr.chld.length == 1) {\n    expr = expr.chld[0];\n  }\n  return expr;\n}\nfunction environments(exprs) {\n  let i = 0;\n  while (i < exprs.length) {\n    if (exprs[i].text == \"\\\\begin\") {\n      let j;\n      for (j = i; j < exprs.length; j++) {\n        if (exprs[j].text == \"\\\\end\") {\n          break;\n        }\n      }\n      const es = exprs.splice(i + 1, j - (i + 1));\n      environments(es);\n      exprs[i].text = exprs[i].chld[0].text;\n      exprs[i].chld = es;\n      exprs.splice(i + 1, 1);\n    }\n    i++;\n  }\n}\nfunction transform(expr, sclx, scly, x, y, notFirst) {\n  if (scly == null) {\n    scly = sclx;\n  }\n  if (!expr.bbox)\n    return;\n  if (notFirst) {\n    expr.bbox.x *= sclx;\n    expr.bbox.y *= scly;\n  }\n  expr.bbox.w *= sclx;\n  expr.bbox.h *= scly;\n  for (let i = 0; i < expr.chld.length; i++) {\n    transform(expr.chld[i], sclx, scly, 0, 0, true);\n  }\n  expr.bbox.x += x;\n  expr.bbox.y += y;\n}\nfunction computeBbox(exprs) {\n  let xmin = Infinity;\n  let xmax = -Infinity;\n  let ymin = Infinity;\n  let ymax = -Infinity;\n  for (let i = 0; i < exprs.length; i++) {\n    if (!exprs[i].bbox) {\n      continue;\n    }\n    xmin = Math.min(xmin, exprs[i].bbox.x);\n    ymin = Math.min(ymin, exprs[i].bbox.y);\n    xmax = Math.max(xmax, exprs[i].bbox.x + exprs[i].bbox.w);\n    ymax = Math.max(ymax, exprs[i].bbox.y + exprs[i].bbox.h);\n  }\n  return { x: xmin, y: ymin, w: xmax - xmin, h: ymax - ymin };\n}\nfunction group(exprs) {\n  if (!exprs.length) {\n    return null;\n  }\n  const bbox = computeBbox(exprs);\n  for (let i = 0; i < exprs.length; i++) {\n    if (!exprs[i].bbox) {\n      continue;\n    }\n    exprs[i].bbox.x -= bbox.x;\n    exprs[i].bbox.y -= bbox.y;\n  }\n  const expr = {\n    type: \"node\",\n    text: \"\",\n    mode: \"math\",\n    chld: exprs,\n    bbox\n  };\n  return expr;\n}\nfunction align(exprs, alignment = \"center\") {\n  for (let i = 0; i < exprs.length; i++) {\n    if (exprs[i].text == \"^\" || exprs[i].text == \"'\") {\n      let h = 0;\n      let j = i;\n      while (j > 0 && (exprs[j].text == \"^\" || exprs[j].text == \"_\" || exprs[j].text == \"'\")) {\n        j--;\n      }\n      h = exprs[j].bbox.y;\n      if (exprs[i].text == \"'\") {\n        exprs[i].bbox.y = h;\n      } else {\n        transform(exprs[i], CONFIG.SUB_SUP_SCALE, null, 0, 0);\n        if (SYMB[exprs[j].text] && SYMB[exprs[j].text].flags.big) {\n          exprs[i].bbox.y = h - exprs[i].bbox.h;\n        } else if (exprs[j].text == \"\\\\int\") {\n          exprs[i].bbox.y = h;\n        } else {\n          exprs[i].bbox.y = h - exprs[i].bbox.h / 2;\n        }\n      }\n    } else if (exprs[i].text == \"_\") {\n      let h = 1;\n      let j = i;\n      while (j > 0 && (exprs[j].text == \"^\" || exprs[j].text == \"_\" || exprs[j].text == \"'\")) {\n        j--;\n      }\n      h = exprs[j].bbox.y + exprs[j].bbox.h;\n      transform(exprs[i], CONFIG.SUB_SUP_SCALE, null, 0, 0);\n      if (SYMB[exprs[j].text] && SYMB[exprs[j].text].flags.big) {\n        exprs[i].bbox.y = h;\n      } else if (exprs[j].text == \"\\\\int\") {\n        exprs[i].bbox.y = h - exprs[i].bbox.h;\n      } else {\n        exprs[i].bbox.y = h - exprs[i].bbox.h / 2;\n      }\n    }\n  }\n  function searchHigh(i, l, r, dir, lvl0) {\n    let j = i;\n    let lvl = lvl0;\n    let ymin = Infinity;\n    let ymax = -Infinity;\n    while (dir > 0 ? j < exprs.length : j >= 0) {\n      if (exprs[j].text == l) {\n        lvl++;\n      } else if (exprs[j].text == r) {\n        lvl--;\n        if (lvl == 0) {\n          break;\n        }\n      } else if (exprs[j].text == \"^\" || exprs[j].text == \"_\")\n        ;\n      else if (exprs[j].bbox) {\n        ymin = Math.min(ymin, exprs[j].bbox.y);\n        ymax = Math.max(ymax, exprs[j].bbox.y + exprs[j].bbox.h);\n      }\n      j += dir;\n    }\n    return [ymin, ymax];\n  }\n  for (let i = 0; i < exprs.length; i++) {\n    if (exprs[i].text == \"\\\\left\") {\n      const [ymin, ymax] = searchHigh(i, \"\\\\left\", \"\\\\right\", 1, 0);\n      if (ymin != Infinity && ymax != -Infinity) {\n        exprs[i].bbox.y = ymin;\n        transform(exprs[i], 1, (ymax - ymin) / exprs[i].bbox.h, 0, 0);\n      }\n    } else if (exprs[i].text == \"\\\\right\") {\n      const [ymin, ymax] = searchHigh(i, \"\\\\right\", \"\\\\left\", -1, 0);\n      if (ymin != Infinity && ymax != -Infinity) {\n        exprs[i].bbox.y = ymin;\n        transform(exprs[i], 1, (ymax - ymin) / exprs[i].bbox.h, 0, 0);\n      }\n    } else if (exprs[i].text == \"\\\\middle\") {\n      const [lmin, lmax] = searchHigh(i, \"\\\\right\", \"\\\\left\", -1, 1);\n      const [rmin, rmax] = searchHigh(i, \"\\\\left\", \"\\\\right\", 1, 1);\n      const ymin = Math.min(lmin, rmin);\n      const ymax = Math.max(lmax, rmax);\n      if (ymin != Infinity && ymax != -Infinity) {\n        exprs[i].bbox.y = ymin;\n        transform(exprs[i], 1, (ymax - ymin) / exprs[i].bbox.h, 0, 0);\n      }\n    }\n  }\n  if (!exprs.some((x) => x.text == \"&\" || x.text == \"\\\\\\\\\")) {\n    return;\n  }\n  const rows = [];\n  let row = [];\n  let cell = [];\n  for (let i = 0; i < exprs.length; i++) {\n    if (exprs[i].text == \"&\") {\n      row.push(cell);\n      cell = [];\n    } else if (exprs[i].text == \"\\\\\\\\\") {\n      if (cell.length) {\n        row.push(cell);\n        cell = [];\n      }\n      rows.push(row);\n      row = [];\n    } else {\n      cell.push(exprs[i]);\n    }\n  }\n  if (cell.length) {\n    row.push(cell);\n  }\n  if (row.length) {\n    rows.push(row);\n  }\n  const colws = [];\n  const erows = [];\n  for (let i = 0; i < rows.length; i++) {\n    const erow = [];\n    for (let j = 0; j < rows[i].length; j++) {\n      const e = group(rows[i][j]);\n      if (e) {\n        colws[j] = colws[j] || 0;\n        colws[j] = Math.max(e.bbox.w + 1, colws[j]);\n      }\n      erow[j] = e;\n    }\n    erows.push(erow);\n  }\n  const ybds = [];\n  for (let i = 0; i < erows.length; i++) {\n    let ymin = Infinity;\n    let ymax = -Infinity;\n    for (let j = 0; j < erows[i].length; j++) {\n      if (!erows[i][j]) {\n        continue;\n      }\n      ymin = Math.min(ymin, erows[i][j].bbox.y);\n      ymax = Math.max(ymax, erows[i][j].bbox.y + erows[i][j].bbox.h);\n    }\n    ybds.push([ymin, ymax]);\n  }\n  for (let i = 0; i < ybds.length; i++) {\n    if (ybds[i][0] == Infinity || ybds[i][1] == Infinity) {\n      ybds[i][0] = i == 0 ? 0 : ybds[i - 1][1];\n      ybds[i][1] = ybds[i][0] + 2;\n    }\n  }\n  for (let i = 1; i < erows.length; i++) {\n    const shft = ybds[i - 1][1] - ybds[i][0] + CONFIG.LINE_SPACING;\n    for (let j = 0; j < erows[i].length; j++) {\n      if (erows[i][j]) {\n        erows[i][j].bbox.y += shft;\n      }\n    }\n    ybds[i][0] += shft;\n    ybds[i][1] += shft;\n  }\n  exprs.splice(0, exprs.length);\n  for (let i = 0; i < erows.length; i++) {\n    let dx = 0;\n    for (let j = 0; j < erows[i].length; j++) {\n      const e = erows[i][j];\n      if (!e) {\n        dx += colws[j];\n        continue;\n      }\n      e.bbox.x += dx;\n      dx += colws[j] - e.bbox.w;\n      if (alignment == \"center\") {\n        e.bbox.x += (colws[j] - e.bbox.w) / 2;\n      } else if (alignment == \"left\")\n        ;\n      else if (alignment == \"right\") {\n        e.bbox.x += colws[j] - e.bbox.w;\n      } else if (alignment == \"equation\") {\n        if (j != erows[i].length - 1) {\n          e.bbox.x += colws[j] - e.bbox.w;\n        }\n      }\n      exprs.push(e);\n    }\n  }\n}\nfunction plan(expr, mode = \"math\") {\n  var _a, _b, _c;\n  const tmd = (_a = {\n    \"\\\\text\": \"text\",\n    \"\\\\mathnormal\": \"math\",\n    \"\\\\mathrm\": \"rm\",\n    \"\\\\mathit\": \"it\",\n    \"\\\\mathbf\": \"bf\",\n    \"\\\\mathsf\": \"sf\",\n    \"\\\\mathtt\": \"tt\",\n    \"\\\\mathfrak\": \"frak\",\n    \"\\\\mathcal\": \"cal\",\n    \"\\\\mathbb\": \"bb\",\n    \"\\\\mathscr\": \"scr\",\n    \"\\\\rm\": \"rm\",\n    \"\\\\it\": \"it\",\n    \"\\\\bf\": \"bf\",\n    \"\\\\sf\": \"tt\",\n    \"\\\\tt\": \"tt\",\n    \"\\\\frak\": \"frak\",\n    \"\\\\cal\": \"cal\",\n    \"\\\\bb\": \"bb\",\n    \"\\\\scr\": \"scr\"\n  }[expr.text]) != null ? _a : mode;\n  if (!expr.chld.length) {\n    if (SYMB[expr.text]) {\n      if (SYMB[expr.text].flags.big) {\n        if (expr.text == \"\\\\lim\") {\n          expr.bbox = { x: 0, y: 0, w: 3.5, h: 2 };\n        } else {\n          expr.bbox = { x: 0, y: -0.5, w: 3, h: 3 };\n        }\n      } else if (SYMB[expr.text].flags.txt) {\n        let w = 0;\n        for (let i = 1; i < expr.text.length; i++) {\n          w += HERSHEY(asciiMap(expr.text[i], \"text\")).w;\n        }\n        w /= 16;\n        expr.bbox = { x: 0, y: 0, w, h: 2 };\n      } else if (SYMB[expr.text].glyph) {\n        let w = HERSHEY(SYMB[expr.text].glyph).w;\n        w /= 16;\n        if (expr.text == \"\\\\int\" || expr.text == \"\\\\oint\") {\n          expr.bbox = { x: 0, y: -1.5, w, h: 5 };\n        } else {\n          expr.bbox = { x: 0, y: 0, w, h: 2 };\n        }\n      } else {\n        expr.bbox = { x: 0, y: 0, w: 1, h: 2 };\n      }\n    } else {\n      let w = 0;\n      for (let i = 0; i < expr.text.length; i++) {\n        if (!HERSHEY(asciiMap(expr.text[i], tmd))) {\n          continue;\n        }\n        if (tmd == \"tt\") {\n          w += 16;\n        } else {\n          w += HERSHEY(asciiMap(expr.text[i], tmd)).w;\n        }\n      }\n      w /= 16;\n      expr.bbox = { x: 0, y: 0, w, h: 2 };\n    }\n    expr.mode = tmd;\n    return;\n  }\n  if (expr.text == \"\\\\frac\") {\n    const a = expr.chld[0];\n    const b = expr.chld[1];\n    const s = CONFIG.FRAC_SCALE;\n    plan(a);\n    plan(b);\n    a.bbox.x = 0;\n    a.bbox.y = 0;\n    b.bbox.x = 0;\n    b.bbox.y = 0;\n    const mw = Math.max(a.bbox.w, b.bbox.w) * s;\n    transform(a, s, null, (mw - a.bbox.w * s) / 2, 0);\n    transform(\n      b,\n      s,\n      null,\n      (mw - b.bbox.w * s) / 2,\n      a.bbox.h + CONFIG.FRAC_SPACING\n    );\n    expr.bbox = {\n      x: 0,\n      y: -a.bbox.h + 1 - CONFIG.FRAC_SPACING / 2,\n      w: mw,\n      h: a.bbox.h + b.bbox.h + CONFIG.FRAC_SPACING\n    };\n  } else if (expr.text == \"\\\\binom\") {\n    const a = expr.chld[0];\n    const b = expr.chld[1];\n    plan(a);\n    plan(b);\n    a.bbox.x = 0;\n    a.bbox.y = 0;\n    b.bbox.x = 0;\n    b.bbox.y = 0;\n    const mw = Math.max(a.bbox.w, b.bbox.w);\n    transform(a, 1, null, (mw - a.bbox.w) / 2 + 1, 0);\n    transform(b, 1, null, (mw - b.bbox.w) / 2 + 1, a.bbox.h);\n    expr.bbox = { x: 0, y: -a.bbox.h + 1, w: mw + 2, h: a.bbox.h + b.bbox.h };\n  } else if (expr.text == \"\\\\sqrt\") {\n    const e = expr.chld[0];\n    plan(e);\n    const f = expr.chld[1];\n    let pl = 0;\n    if (f) {\n      plan(f);\n      pl = Math.max(f.bbox.w * CONFIG.SQRT_MAG_SCALE - 0.5, 0);\n      transform(f, CONFIG.SQRT_MAG_SCALE, null, 0, 0.5);\n    }\n    transform(e, 1, null, 1 + pl, 0.5);\n    expr.bbox = {\n      x: 0,\n      y: 2 - e.bbox.h - 0.5,\n      w: e.bbox.w + 1 + pl,\n      h: e.bbox.h + 0.5\n    };\n  } else if (SYMB[expr.text] && SYMB[expr.text].flags.hat) {\n    const e = expr.chld[0];\n    plan(e);\n    const y0 = e.bbox.y - 0.5;\n    e.bbox.y = 0.5;\n    expr.bbox = { x: 0, y: y0, w: e.bbox.w, h: e.bbox.h + 0.5 };\n  } else if (SYMB[expr.text] && SYMB[expr.text].flags.mat) {\n    const e = expr.chld[0];\n    plan(e);\n    expr.bbox = { x: 0, y: 0, w: e.bbox.w, h: e.bbox.h + 0.5 };\n  } else {\n    let dx = 0;\n    let dy = 0;\n    let mh = 1;\n    for (let i = 0; i < expr.chld.length; i++) {\n      const c = expr.chld[i];\n      const spac = (_b = {\n        \"\\\\quad\": 2,\n        \"\\\\,\": 2 * 3 / 18,\n        \"\\\\:\": 2 * 4 / 18,\n        \"\\\\;\": 2 * 5 / 18,\n        \"\\\\!\": 2 * -3 / 18\n      }[c.text]) != null ? _b : null;\n      if (c.text == \"\\\\\\\\\") {\n        dy += mh;\n        dx = 0;\n        mh = 1;\n        continue;\n      } else if (c.text == \"&\") {\n        continue;\n      } else if (spac != null) {\n        dx += spac;\n        continue;\n      } else {\n        plan(c, tmd);\n        transform(c, 1, null, dx, dy);\n        if (c.text == \"^\" || c.text == \"_\" || c.text == \"'\") {\n          let j = i;\n          while (j > 0 && (expr.chld[j].text == \"^\" || expr.chld[j].text == \"_\" || expr.chld[j].text == \"'\")) {\n            j--;\n          }\n          const wasBig = SYMB[expr.chld[j].text] && SYMB[expr.chld[j].text].flags.big;\n          if (c.text == \"'\") {\n            let k = j + 1;\n            let nth = 0;\n            while (k < i) {\n              if (expr.chld[k].text == \"'\") {\n                nth++;\n              }\n              k++;\n            }\n            c.bbox.x = expr.chld[j].bbox.x + expr.chld[j].bbox.w + c.bbox.w * nth;\n            dx = Math.max(dx, c.bbox.x + c.bbox.w);\n          } else {\n            if (wasBig) {\n              const ex = expr.chld[j].bbox.x + (expr.chld[j].bbox.w - c.bbox.w * CONFIG.SUB_SUP_SCALE) / 2;\n              c.bbox.x = ex;\n              dx = Math.max(dx, expr.chld[j].bbox.x + expr.chld[j].bbox.w + (c.bbox.w * CONFIG.SUB_SUP_SCALE - expr.chld[j].bbox.w) / 2);\n            } else {\n              c.bbox.x = expr.chld[j].bbox.x + expr.chld[j].bbox.w;\n              dx = Math.max(dx, c.bbox.x + c.bbox.w * CONFIG.SUB_SUP_SCALE);\n            }\n          }\n        } else {\n          dx += c.bbox.w;\n        }\n        if (mode == \"text\") {\n          dx += 1;\n        }\n        mh = Math.max(c.bbox.y + c.bbox.h - dy, mh);\n      }\n    }\n    dy += mh;\n    const m2s = {\n      bmatrix: [\"[\", \"]\"],\n      pmatrix: [\"(\", \")\"],\n      Bmatrix: [\"\\\\{\", \"\\\\}\"],\n      cases: [\"\\\\{\"]\n    };\n    const alt = (_c = {\n      bmatrix: \"center\",\n      pmatrix: \"center\",\n      Bmatrix: \"center\",\n      cases: \"left\",\n      matrix: \"center\",\n      aligned: \"equation\"\n    }[expr.text]) != null ? _c : \"left\";\n    const hasLp = !!m2s[expr.text];\n    const hasRp = !!m2s[expr.text] && m2s[expr.text].length > 1;\n    align(expr.chld, alt);\n    const bb = computeBbox(expr.chld);\n    if (expr.text == \"\\\\text\") {\n      bb.x -= 1;\n      bb.w += 2;\n    }\n    for (let i = 0; i < expr.chld.length; i++) {\n      transform(expr.chld[i], 1, null, -bb.x + (hasLp ? 1.5 : 0), -bb.y);\n    }\n    expr.bbox = {\n      x: 0,\n      y: 0,\n      w: bb.w + 1.5 * Number(hasLp) + 1.5 * Number(hasRp),\n      h: bb.h\n    };\n    if (hasLp) {\n      expr.chld.unshift({\n        type: \"symb\",\n        text: m2s[expr.text][0],\n        mode: expr.mode,\n        chld: [],\n        bbox: { x: 0, y: 0, w: 1, h: bb.h }\n      });\n    }\n    if (hasRp) {\n      expr.chld.push({\n        type: \"symb\",\n        text: m2s[expr.text][1],\n        mode: expr.mode,\n        chld: [],\n        bbox: { x: bb.w + 2, y: 0, w: 1, h: bb.h }\n      });\n    }\n    if (hasLp || hasRp || expr.text == \"matrix\") {\n      expr.type = \"node\";\n      expr.text = \"\";\n      expr.bbox.y -= (expr.bbox.h - 2) / 2;\n    }\n  }\n}\nfunction flatten(expr) {\n  function flat(expr2, dx, dy) {\n    const ff = [];\n    if (expr2.bbox) {\n      dx += expr2.bbox.x;\n      dy += expr2.bbox.y;\n      if (expr2.text == \"\\\\frac\") {\n        const h = expr2.chld[1].bbox.y - (expr2.chld[0].bbox.y + expr2.chld[0].bbox.h);\n        const e = {\n          type: \"symb\",\n          mode: expr2.mode,\n          text: \"\\\\bar\",\n          bbox: {\n            x: dx,\n            y: dy + (expr2.chld[1].bbox.y - h / 2) - h / 2,\n            w: expr2.bbox.w,\n            h\n          },\n          chld: []\n        };\n        ff.push(e);\n      } else if (expr2.text == \"\\\\sqrt\") {\n        const h = expr2.chld[0].bbox.y;\n        const xx = Math.max(0, expr2.chld[0].bbox.x - expr2.chld[0].bbox.h / 2);\n        const e = {\n          type: \"symb\",\n          mode: expr2.mode,\n          text: \"\\\\sqrt\",\n          bbox: {\n            x: dx + xx,\n            y: dy + h / 2,\n            w: expr2.chld[0].bbox.x - xx,\n            h: expr2.bbox.h - h / 2\n          },\n          chld: []\n        };\n        ff.push(e);\n        ff.push({\n          type: \"symb\",\n          text: \"\\\\bar\",\n          mode: expr2.mode,\n          bbox: {\n            x: dx + expr2.chld[0].bbox.x,\n            y: dy,\n            w: expr2.bbox.w - expr2.chld[0].bbox.x,\n            h\n          },\n          chld: []\n        });\n      } else if (expr2.text == \"\\\\binom\") {\n        const w = Math.min(expr2.chld[0].bbox.x, expr2.chld[1].bbox.x);\n        const e = {\n          type: \"symb\",\n          mode: expr2.mode,\n          text: \"(\",\n          bbox: {\n            x: dx,\n            y: dy,\n            w,\n            h: expr2.bbox.h\n          },\n          chld: []\n        };\n        ff.push(e);\n        ff.push({\n          type: \"symb\",\n          text: \")\",\n          mode: expr2.mode,\n          bbox: {\n            x: dx + expr2.bbox.w - w,\n            y: dy,\n            w,\n            h: expr2.bbox.h\n          },\n          chld: []\n        });\n      } else if (SYMB[expr2.text] && SYMB[expr2.text].flags.hat) {\n        const h = expr2.chld[0].bbox.y;\n        const e = {\n          type: \"symb\",\n          mode: expr2.mode,\n          text: expr2.text,\n          bbox: {\n            x: dx,\n            y: dy,\n            w: expr2.bbox.w,\n            h\n          },\n          chld: []\n        };\n        ff.push(e);\n      } else if (SYMB[expr2.text] && SYMB[expr2.text].flags.mat) {\n        const h = expr2.chld[0].bbox.h;\n        const e = {\n          type: \"symb\",\n          text: expr2.text,\n          mode: expr2.mode,\n          bbox: {\n            x: dx,\n            y: dy + h,\n            w: expr2.bbox.w,\n            h: expr2.bbox.h - h\n          },\n          chld: []\n        };\n        ff.push(e);\n      } else if (expr2.type != \"node\" && expr2.text != \"^\" && expr2.text != \"_\") {\n        const e = {\n          type: expr2.type == \"func\" ? \"symb\" : expr2.type,\n          text: expr2.text,\n          mode: expr2.mode,\n          bbox: {\n            x: dx,\n            y: dy,\n            w: expr2.bbox.w,\n            h: expr2.bbox.h\n          },\n          chld: []\n        };\n        ff.push(e);\n      }\n    }\n    for (let i = 0; i < expr2.chld.length; i++) {\n      const f2 = flat(expr2.chld[i], dx, dy);\n      ff.push(...f2);\n    }\n    return ff;\n  }\n  const f = flat(expr, -expr.bbox.x, -expr.bbox.y);\n  expr.type = \"node\";\n  expr.text = \"\";\n  expr.chld = f;\n}\nfunction render(expr) {\n  const o = [];\n  for (let i = 0; i < expr.chld.length; i++) {\n    const e = expr.chld[i];\n    let s = e.bbox.h / 2;\n    let isSmallHat = false;\n    if (SYMB[e.text] && SYMB[e.text].flags.hat && !SYMB[e.text].flags.xfl && !SYMB[e.text].flags.yfl) {\n      s *= 4;\n      isSmallHat = true;\n    }\n    if (SYMB[e.text] && SYMB[e.text].glyph) {\n      const d = HERSHEY(SYMB[e.text].glyph);\n      for (let j = 0; j < d.polylines.length; j++) {\n        const l = [];\n        for (let k = 0; k < d.polylines[j].length; k++) {\n          let x = d.polylines[j][k][0];\n          let y = d.polylines[j][k][1];\n          if (SYMB[e.text].flags.xfl) {\n            x = (x - d.xmin) / Math.max(d.xmax - d.xmin, 1) * e.bbox.w;\n            x += e.bbox.x;\n          } else if (d.w / 16 * s > e.bbox.w) {\n            x = x / Math.max(d.w, 1) * e.bbox.w;\n            x += e.bbox.x;\n          } else {\n            x = x / 16 * s;\n            const p = (e.bbox.w - d.w / 16 * s) / 2;\n            x += e.bbox.x + p;\n          }\n          if (SYMB[e.text].flags.yfl) {\n            y = (y - d.ymin) / Math.max(d.ymax - d.ymin, 1) * e.bbox.h;\n            y += e.bbox.y;\n          } else {\n            y = y / 16 * s;\n            if (isSmallHat) {\n              const p = (d.ymax + d.ymin) / 2;\n              y -= p / 16 * s;\n            }\n            y += e.bbox.y + e.bbox.h / 2;\n          }\n          l.push([x, y]);\n        }\n        o.push(l);\n      }\n    } else if (SYMB[e.text] && SYMB[e.text].flags.txt || e.type == \"char\") {\n      let x0 = e.bbox.x;\n      const isVerb = !!(SYMB[e.text] && SYMB[e.text].flags.txt);\n      for (let n = Number(isVerb); n < e.text.length; n++) {\n        const d = HERSHEY(asciiMap(e.text[n], isVerb ? \"text\" : e.mode));\n        if (!d) {\n          console.warn(\"unmapped character: \" + e.text[n]);\n          continue;\n        }\n        for (let j = 0; j < d.polylines.length; j++) {\n          const l = [];\n          for (let k = 0; k < d.polylines[j].length; k++) {\n            let x = d.polylines[j][k][0];\n            let y = d.polylines[j][k][1];\n            x /= 16;\n            y /= 16;\n            x *= s;\n            y *= s;\n            if (e.mode == \"tt\") {\n              if (d.w > 16) {\n                x *= 16 / d.w;\n              } else {\n                x += (16 - d.w) / 2 / 16;\n              }\n            }\n            x += x0;\n            y += e.bbox.y + e.bbox.h / 2;\n            l.push([x, y]);\n          }\n          o.push(l);\n        }\n        if (e.mode == \"tt\") {\n          x0 += s;\n        } else {\n          x0 += d.w / 16 * s;\n        }\n      }\n    }\n  }\n  return o;\n}\nfunction nf(x) {\n  return Math.round(x * 100) / 100;\n}\nclass LaTexUtils {\n  constructor(latex) {\n    this._latex = latex;\n    this._tokens = tokenize(latex);\n    this._tree = parse(this._tokens);\n    environments(this._tree.chld);\n    plan(this._tree);\n    flatten(this._tree);\n    this._polylines = render(this._tree);\n  }\n  resolveScale(opt) {\n    var _a, _b, _c, _d;\n    if (opt == void 0) {\n      return [16, 16, 16, 16];\n    }\n    let sclx = (_a = opt.SCALE_X) != null ? _a : 16;\n    let scly = (_b = opt.SCALE_Y) != null ? _b : 16;\n    if (opt.MIN_CHAR_H != void 0) {\n      let mh = 0;\n      for (let i = 0; i < this._tree.chld.length; i++) {\n        const c = this._tree.chld[i];\n        if (c.type == \"char\" || SYMB[c.text] && (SYMB[c.text].flags.txt || !Object.keys(SYMB[c.text].flags).length)) {\n          mh = Math.min(c.bbox.h, mh);\n        }\n      }\n      const s = Math.max(1, opt.MIN_CHAR_H / mh);\n      sclx *= s;\n      scly *= s;\n    }\n    if (opt.MAX_W != void 0) {\n      const s0 = sclx;\n      sclx = Math.min(sclx, opt.MAX_W / this._tree.bbox.w);\n      scly *= sclx / s0;\n    }\n    if (opt.MAX_H != void 0) {\n      const s0 = scly;\n      scly = Math.min(scly, opt.MAX_H / this._tree.bbox.h);\n      sclx *= scly / s0;\n    }\n    const px = (_c = opt.MARGIN_X) != null ? _c : sclx;\n    const py = (_d = opt.MARGIN_Y) != null ? _d : scly;\n    return [px, py, sclx, scly];\n  }\n  polylines(opt) {\n    if (!opt)\n      opt = {};\n    const polylines = [];\n    const [px, py, sclx, scly] = this.resolveScale(opt);\n    for (let i = 0; i < this._polylines.length; i++) {\n      polylines.push([]);\n      for (let j = 0; j < this._polylines[i].length; j++) {\n        const [x, y] = this._polylines[i][j];\n        polylines[polylines.length - 1].push([px + x * sclx, py + y * scly]);\n      }\n    }\n    return polylines;\n  }\n  pathd(opt) {\n    if (!opt)\n      opt = {};\n    let d = \"\";\n    const [px, py, sclx, scly] = this.resolveScale(opt);\n    for (let i = 0; i < this._polylines.length; i++) {\n      for (let j = 0; j < this._polylines[i].length; j++) {\n        const [x, y] = this._polylines[i][j];\n        d += !j ? \"M\" : \"L\";\n        d += `${nf(px + x * sclx)} ${nf(py + y * scly)}`;\n      }\n    }\n    return d;\n  }\n  svg(opt) {\n    var _a, _b;\n    if (!opt)\n      opt = {};\n    const [px, py, sclx, scly] = this.resolveScale(opt);\n    const w = nf(this._tree.bbox.w * sclx + px * 2);\n    const h = nf(this._tree.bbox.h * scly + py * 2);\n    let o = `<svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      width=\"${w}\" height=\"${h}\"\n      fill=\"none\" stroke=\"${(_a = opt.FG_COLOR) != null ? _a : \"black\"}\" stroke-width=\"${(_b = opt.STROKE_W) != null ? _b : 1}\"\n      stroke-linecap=\"round\" stroke-linejoin=\"round\"\n    >`;\n    if (opt.BG_COLOR) {\n      o += `<rect x=\"${0}\" y=\"${0}\" width=\"${w}\" height=\"${h}\" fill=\"${opt.BG_COLOR}\" stroke=\"none\"></rect>`;\n    }\n    o += `<path d=\"`;\n    for (let i = 0; i < this._polylines.length; i++) {\n      o += \"M\";\n      for (let j = 0; j < this._polylines[i].length; j++) {\n        const [x, y] = this._polylines[i][j];\n        o += nf(px + x * sclx) + \" \" + nf(py + y * scly) + \" \";\n      }\n    }\n    o += `\"/>`;\n    o += `</svg>`;\n    return {\n      svg: `data:image/svg+xml;base64,${window.btoa(o)}`,\n      width: Math.ceil(w),\n      height: Math.ceil(h)\n    };\n  }\n  pdf(opt) {\n    var _a;\n    if (!opt)\n      opt = {};\n    const [px, py, sclx, scly] = this.resolveScale(opt);\n    const width = nf(this._tree.bbox.w * sclx + px * 2);\n    const height = nf(this._tree.bbox.h * scly + py * 2);\n    let head = `%PDF-1.1\n%%\\xA5\\xB1\\xEB\n1 0 obj\n<< /Type /Catalog\n/Pages 2 0 R\n>>endobj\n    2 0 obj\n<< /Type /Pages\n/Kids [3 0 R]\n/Count 1\n/MediaBox [0 0 ${width} ${height}]\n>>\nendobj\n    3 0 obj\n<< /Type /Page\n/Parent 2 0 R\n/Resources\n<< /Font\n<< /F1\n<< /Type /Font\n    /Subtype /Type1\n/BaseFont /Times-Roman\n>>\n>>\n>>\n/Contents [`;\n    let pdf = \"\";\n    let count = 4;\n    for (let i = 0; i < this._polylines.length; i++) {\n      pdf += `${count} 0 obj \n<< /Length 0 >>\n stream\n 1 j 1 J ${(_a = opt.STROKE_W) != null ? _a : 1} w\n`;\n      for (let j = 0; j < this._polylines[i].length; j++) {\n        const [x, y] = this._polylines[i][j];\n        pdf += `${nf(px + x * sclx)} ${nf(height - (py + y * scly))} ${j ? \"l\" : \"m\"} `;\n      }\n      pdf += \"\\nS\\nendstream\\nendobj\\n\";\n      head += `${count} 0 R `;\n      count++;\n    }\n    head += \"]\\n>>\\nendobj\\n\";\n    pdf += \"\\ntrailer\\n<< /Root 1 0 R \\n /Size 0\\n >>startxref\\n\\n%%EOF\\n\";\n    return head + pdf;\n  }\n  boxes(opt) {\n    if (!opt)\n      opt = {};\n    const [px, py, sclx, scly] = this.resolveScale(opt);\n    const bs = [];\n    for (let i = 0; i < this._tree.chld.length; i++) {\n      const { x, y, w, h } = this._tree.chld[i].bbox;\n      bs.push({ x: px + x * sclx, y: py + y * scly, w: w * sclx, h: h * scly });\n    }\n    return bs;\n  }\n  box(opt) {\n    if (!opt)\n      opt = {};\n    const [px, py, sclx, scly] = this.resolveScale(opt);\n    return {\n      x: px + this._tree.bbox.x * sclx,\n      y: py + this._tree.bbox.y * scly,\n      w: this._tree.bbox.w * sclx,\n      h: this._tree.bbox.h * scly\n    };\n  }\n}\nclass LaTexParticle extends ImageParticle {\n  static convertLaTextToSVG(laTex) {\n    return new LaTexUtils(laTex).svg({\n      SCALE_X: 10,\n      SCALE_Y: 10,\n      MARGIN_X: 0,\n      MARGIN_Y: 0\n    });\n  }\n  render(ctx, element, x, y) {\n    const { scale } = this.options;\n    const width = element.width * scale;\n    const height = element.height * scale;\n    if (this.imageCache.has(element.value)) {\n      const img = this.imageCache.get(element.value);\n      ctx.drawImage(img, x, y, width, height);\n    } else {\n      const laTexLoadPromise = new Promise((resolve, reject) => {\n        const img = new Image();\n        img.src = element.laTexSVG;\n        img.onload = () => {\n          ctx.drawImage(img, x, y, width, height);\n          this.imageCache.set(element.value, img);\n          resolve(element);\n        };\n        img.onerror = (error) => {\n          reject(error);\n        };\n      });\n      this.addImageObserver(laTexLoadPromise);\n    }\n  }\n}\nvar ListType;\n(function(ListType2) {\n  ListType2[\"UL\"] = \"ul\";\n  ListType2[\"OL\"] = \"ol\";\n})(ListType || (ListType = {}));\nvar UlStyle;\n(function(UlStyle2) {\n  UlStyle2[\"DISC\"] = \"disc\";\n  UlStyle2[\"CIRCLE\"] = \"circle\";\n  UlStyle2[\"SQUARE\"] = \"square\";\n  UlStyle2[\"CHECKBOX\"] = \"checkbox\";\n})(UlStyle || (UlStyle = {}));\nvar OlStyle;\n(function(OlStyle2) {\n  OlStyle2[\"DECIMAL\"] = \"decimal\";\n})(OlStyle || (OlStyle = {}));\nvar ListStyle;\n(function(ListStyle2) {\n  ListStyle2[\"DISC\"] = \"disc\";\n  ListStyle2[\"CIRCLE\"] = \"circle\";\n  ListStyle2[\"SQUARE\"] = \"square\";\n  ListStyle2[\"DECIMAL\"] = \"decimal\";\n  ListStyle2[\"CHECKBOX\"] = \"checkbox\";\n})(ListStyle || (ListStyle = {}));\nconst ulStyleMapping = {\n  [UlStyle.DISC]: \"\\u2022\",\n  [UlStyle.CIRCLE]: \"\\u25E6\",\n  [UlStyle.SQUARE]: \"\\u25AB\\uFE0E\",\n  [UlStyle.CHECKBOX]: \"\\u2611\\uFE0F\"\n};\nconst listTypeElementMapping = {\n  [ListType.OL]: \"ol\",\n  [ListType.UL]: \"ul\"\n};\nconst listStyleCSSMapping = {\n  [ListStyle.DISC]: \"disc\",\n  [ListStyle.CIRCLE]: \"circle\",\n  [ListStyle.SQUARE]: \"square\",\n  [ListStyle.DECIMAL]: \"decimal\",\n  [ListStyle.CHECKBOX]: \"checkbox\"\n};\nvar TitleLevel;\n(function(TitleLevel2) {\n  TitleLevel2[\"FIRST\"] = \"first\";\n  TitleLevel2[\"SECOND\"] = \"second\";\n  TitleLevel2[\"THIRD\"] = \"third\";\n  TitleLevel2[\"FOURTH\"] = \"fourth\";\n  TitleLevel2[\"FIFTH\"] = \"fifth\";\n  TitleLevel2[\"SIXTH\"] = \"sixth\";\n})(TitleLevel || (TitleLevel = {}));\nconst defaultTitleOption = {\n  defaultFirstSize: 26,\n  defaultSecondSize: 24,\n  defaultThirdSize: 22,\n  defaultFourthSize: 20,\n  defaultFifthSize: 18,\n  defaultSixthSize: 16\n};\nconst titleSizeMapping = {\n  [TitleLevel.FIRST]: \"defaultFirstSize\",\n  [TitleLevel.SECOND]: \"defaultSecondSize\",\n  [TitleLevel.THIRD]: \"defaultThirdSize\",\n  [TitleLevel.FOURTH]: \"defaultFourthSize\",\n  [TitleLevel.FIFTH]: \"defaultFifthSize\",\n  [TitleLevel.SIXTH]: \"defaultSixthSize\"\n};\nconst titleOrderNumberMapping = {\n  [TitleLevel.FIRST]: 1,\n  [TitleLevel.SECOND]: 2,\n  [TitleLevel.THIRD]: 3,\n  [TitleLevel.FOURTH]: 4,\n  [TitleLevel.FIFTH]: 5,\n  [TitleLevel.SIXTH]: 6\n};\nconst titleNodeNameMapping = {\n  H1: TitleLevel.FIRST,\n  H2: TitleLevel.SECOND,\n  H3: TitleLevel.THIRD,\n  H4: TitleLevel.FOURTH,\n  H5: TitleLevel.FIFTH,\n  H6: TitleLevel.SIXTH\n};\nvar ControlType;\n(function(ControlType2) {\n  ControlType2[\"TEXT\"] = \"text\";\n  ControlType2[\"SELECT\"] = \"select\";\n  ControlType2[\"CHECKBOX\"] = \"checkbox\";\n  ControlType2[\"RADIO\"] = \"radio\";\n  ControlType2[\"DATE\"] = \"date\";\n})(ControlType || (ControlType = {}));\nvar ControlComponent;\n(function(ControlComponent2) {\n  ControlComponent2[\"PREFIX\"] = \"prefix\";\n  ControlComponent2[\"POSTFIX\"] = \"postfix\";\n  ControlComponent2[\"PLACEHOLDER\"] = \"placeholder\";\n  ControlComponent2[\"VALUE\"] = \"value\";\n  ControlComponent2[\"CHECKBOX\"] = \"checkbox\";\n  ControlComponent2[\"RADIO\"] = \"radio\";\n})(ControlComponent || (ControlComponent = {}));\nvar ControlIndentation;\n(function(ControlIndentation2) {\n  ControlIndentation2[\"ROW_START\"] = \"rowStart\";\n  ControlIndentation2[\"VALUE_START\"] = \"valueStart\";\n})(ControlIndentation || (ControlIndentation = {}));\nvar BackgroundSize;\n(function(BackgroundSize2) {\n  BackgroundSize2[\"CONTAIN\"] = \"contain\";\n  BackgroundSize2[\"COVER\"] = \"cover\";\n})(BackgroundSize || (BackgroundSize = {}));\nvar BackgroundRepeat;\n(function(BackgroundRepeat2) {\n  BackgroundRepeat2[\"REPEAT\"] = \"repeat\";\n  BackgroundRepeat2[\"NO_REPEAT\"] = \"no-repeat\";\n  BackgroundRepeat2[\"REPEAT_X\"] = \"repeat-x\";\n  BackgroundRepeat2[\"REPEAT_Y\"] = \"repeat-y\";\n})(BackgroundRepeat || (BackgroundRepeat = {}));\nconst defaultBackground = {\n  color: \"#FFFFFF\",\n  image: \"\",\n  size: BackgroundSize.COVER,\n  repeat: BackgroundRepeat.NO_REPEAT,\n  applyPageNumbers: []\n};\nvar VerticalAlign;\n(function(VerticalAlign2) {\n  VerticalAlign2[\"TOP\"] = \"top\";\n  VerticalAlign2[\"MIDDLE\"] = \"middle\";\n  VerticalAlign2[\"BOTTOM\"] = \"bottom\";\n})(VerticalAlign || (VerticalAlign = {}));\nconst defaultCheckboxOption = {\n  width: 14,\n  height: 14,\n  gap: 5,\n  lineWidth: 1,\n  fillStyle: \"#5175f4\",\n  strokeStyle: \"#ffffff\",\n  verticalAlign: VerticalAlign.BOTTOM\n};\nconst defaultControlOption = {\n  placeholderColor: \"#9c9b9b\",\n  bracketColor: \"#000000\",\n  prefix: \"{\",\n  postfix: \"}\",\n  borderWidth: 1,\n  borderColor: \"#000000\",\n  activeBackgroundColor: \"\"\n};\nconst defaultFooterOption = {\n  bottom: 30,\n  maxHeightRadio: MaxHeightRatio.HALF,\n  disabled: false,\n  editable: true\n};\nconst defaultGroupOption = {\n  opacity: 0.1,\n  backgroundColor: \"#E99D00\",\n  activeOpacity: 0.5,\n  activeBackgroundColor: \"#E99D00\",\n  disabled: false\n};\nconst defaultHeaderOption = {\n  top: 30,\n  maxHeightRadio: MaxHeightRatio.HALF,\n  disabled: false,\n  editable: true\n};\nconst defaultLineBreak = {\n  disabled: true,\n  color: \"#CCCCCC\",\n  lineWidth: 1.5\n};\nconst defaultPageBreakOption = {\n  font: \"Microsoft YaHei\",\n  fontSize: 12,\n  lineDash: [3, 1]\n};\nconst FORMAT_PLACEHOLDER = {\n  PAGE_NO: \"{pageNo}\",\n  PAGE_COUNT: \"{pageCount}\"\n};\nconst defaultPageNumberOption = {\n  bottom: 60,\n  size: 12,\n  font: \"Microsoft YaHei\",\n  color: \"#000000\",\n  rowFlex: RowFlex.CENTER,\n  format: FORMAT_PLACEHOLDER.PAGE_NO,\n  numberType: NumberType.ARABIC,\n  disabled: false,\n  startPageNo: 1,\n  fromPageNo: 0,\n  maxPageNo: null\n};\nconst defaultPlaceholderOption = {\n  data: \"\",\n  color: \"#DCDFE6\",\n  opacity: 1,\n  size: 16,\n  font: \"Microsoft YaHei\"\n};\nconst defaultRadioOption = {\n  width: 14,\n  height: 14,\n  gap: 5,\n  lineWidth: 1,\n  fillStyle: \"#5175f4\",\n  strokeStyle: \"#000000\",\n  verticalAlign: VerticalAlign.BOTTOM\n};\nconst defaultSeparatorOption = {\n  lineWidth: 1,\n  strokeStyle: \"#000000\"\n};\nconst defaultTableOption = {\n  tdPadding: [0, 5, 5, 5],\n  defaultTrMinHeight: 42,\n  defaultColMinWidth: 40\n};\nconst defaultWatermarkOption = {\n  data: \"\",\n  color: \"#AEB5C0\",\n  opacity: 0.3,\n  size: 200,\n  font: \"Microsoft YaHei\",\n  repeat: false,\n  gap: [10, 10]\n};\nconst defaultZoneOption = {\n  tipDisabled: true\n};\nvar LineNumberType;\n(function(LineNumberType2) {\n  LineNumberType2[\"PAGE\"] = \"page\";\n  LineNumberType2[\"CONTINUITY\"] = \"continuity\";\n})(LineNumberType || (LineNumberType = {}));\nconst defaultLineNumberOption = {\n  size: 12,\n  font: \"Microsoft YaHei\",\n  color: \"#000000\",\n  disabled: true,\n  right: 20,\n  type: LineNumberType.CONTINUITY\n};\nconst defaultPageBorderOption = {\n  color: \"#000000\",\n  lineWidth: 1,\n  padding: [0, 5, 0, 5],\n  disabled: true\n};\nvar EditorComponent;\n(function(EditorComponent2) {\n  EditorComponent2[\"COMPONENT\"] = \"component\";\n  EditorComponent2[\"MENU\"] = \"menu\";\n  EditorComponent2[\"MAIN\"] = \"main\";\n  EditorComponent2[\"FOOTER\"] = \"footer\";\n  EditorComponent2[\"CONTEXTMENU\"] = \"contextmenu\";\n  EditorComponent2[\"POPUP\"] = \"popup\";\n  EditorComponent2[\"CATALOG\"] = \"catalog\";\n  EditorComponent2[\"COMMENT\"] = \"comment\";\n})(EditorComponent || (EditorComponent = {}));\nvar EditorContext;\n(function(EditorContext2) {\n  EditorContext2[\"PAGE\"] = \"page\";\n  EditorContext2[\"TABLE\"] = \"table\";\n})(EditorContext || (EditorContext = {}));\nvar EditorMode;\n(function(EditorMode2) {\n  EditorMode2[\"EDIT\"] = \"edit\";\n  EditorMode2[\"CLEAN\"] = \"clean\";\n  EditorMode2[\"READONLY\"] = \"readonly\";\n  EditorMode2[\"FORM\"] = \"form\";\n  EditorMode2[\"PRINT\"] = \"print\";\n  EditorMode2[\"DESIGN\"] = \"design\";\n})(EditorMode || (EditorMode = {}));\nvar EditorZone;\n(function(EditorZone2) {\n  EditorZone2[\"HEADER\"] = \"header\";\n  EditorZone2[\"MAIN\"] = \"main\";\n  EditorZone2[\"FOOTER\"] = \"footer\";\n})(EditorZone || (EditorZone = {}));\nvar PageMode;\n(function(PageMode2) {\n  PageMode2[\"PAGING\"] = \"paging\";\n  PageMode2[\"CONTINUITY\"] = \"continuity\";\n})(PageMode || (PageMode = {}));\nvar PaperDirection;\n(function(PaperDirection2) {\n  PaperDirection2[\"VERTICAL\"] = \"vertical\";\n  PaperDirection2[\"HORIZONTAL\"] = \"horizontal\";\n})(PaperDirection || (PaperDirection = {}));\nvar WordBreak;\n(function(WordBreak2) {\n  WordBreak2[\"BREAK_ALL\"] = \"break-all\";\n  WordBreak2[\"BREAK_WORD\"] = \"break-word\";\n})(WordBreak || (WordBreak = {}));\nvar RenderMode;\n(function(RenderMode2) {\n  RenderMode2[\"SPEED\"] = \"speed\";\n  RenderMode2[\"COMPATIBILITY\"] = \"compatibility\";\n})(RenderMode || (RenderMode = {}));\nfunction mergeOption(options = {}) {\n  const tableOptions = {\n    ...defaultTableOption,\n    ...options.table\n  };\n  const headerOptions = {\n    ...defaultHeaderOption,\n    ...options.header\n  };\n  const footerOptions = {\n    ...defaultFooterOption,\n    ...options.footer\n  };\n  const pageNumberOptions = {\n    ...defaultPageNumberOption,\n    ...options.pageNumber\n  };\n  const waterMarkOptions = {\n    ...defaultWatermarkOption,\n    ...options.watermark\n  };\n  const controlOptions = {\n    ...defaultControlOption,\n    ...options.control\n  };\n  const checkboxOptions = {\n    ...defaultCheckboxOption,\n    ...options.checkbox\n  };\n  const radioOptions = {\n    ...defaultRadioOption,\n    ...options.radio\n  };\n  const cursorOptions = {\n    ...defaultCursorOption,\n    ...options.cursor\n  };\n  const titleOptions = {\n    ...defaultTitleOption,\n    ...options.title\n  };\n  const placeholderOptions = {\n    ...defaultPlaceholderOption,\n    ...options.placeholder\n  };\n  const groupOptions = {\n    ...defaultGroupOption,\n    ...options.group\n  };\n  const pageBreakOptions = {\n    ...defaultPageBreakOption,\n    ...options.pageBreak\n  };\n  const zoneOptions = {\n    ...defaultZoneOption,\n    ...options.zone\n  };\n  const backgroundOptions = {\n    ...defaultBackground,\n    ...options.background\n  };\n  const lineBreakOptions = {\n    ...defaultLineBreak,\n    ...options.lineBreak\n  };\n  const separatorOptions = {\n    ...defaultSeparatorOption,\n    ...options.separator\n  };\n  const lineNumberOptions = {\n    ...defaultLineNumberOption,\n    ...options.lineNumber\n  };\n  const pageBorderOptions = {\n    ...defaultPageBorderOption,\n    ...options.pageBorder\n  };\n  return {\n    mode: EditorMode.EDIT,\n    defaultType: \"TEXT\",\n    defaultColor: \"#000000\",\n    defaultFont: \"Microsoft YaHei\",\n    defaultSize: 16,\n    minSize: 5,\n    maxSize: 72,\n    defaultRowMargin: 1,\n    defaultBasicRowMarginHeight: 8,\n    defaultTabWidth: 32,\n    width: 794,\n    height: 1123,\n    scale: 1,\n    pageGap: 20,\n    underlineColor: \"#000000\",\n    strikeoutColor: \"#FF0000\",\n    rangeAlpha: 0.6,\n    rangeColor: \"#AECBFA\",\n    rangeMinWidth: 5,\n    searchMatchAlpha: 0.6,\n    searchMatchColor: \"#FFFF00\",\n    searchNavigateMatchColor: \"#AAD280\",\n    highlightAlpha: 0.6,\n    resizerColor: \"#4182D9\",\n    resizerSize: 5,\n    marginIndicatorSize: 35,\n    marginIndicatorColor: \"#BABABA\",\n    margins: [100, 120, 100, 120],\n    pageMode: PageMode.PAGING,\n    renderMode: RenderMode.SPEED,\n    defaultHyperlinkColor: \"#0000FF\",\n    paperDirection: PaperDirection.VERTICAL,\n    inactiveAlpha: 0.6,\n    historyMaxRecordCount: 100,\n    wordBreak: WordBreak.BREAK_WORD,\n    printPixelRatio: 3,\n    maskMargin: [0, 0, 0, 0],\n    letterClass: [LETTER_CLASS.ENGLISH],\n    contextMenuDisableKeys: [],\n    scrollContainerSelector: \"\",\n    ...options,\n    table: tableOptions,\n    header: headerOptions,\n    footer: footerOptions,\n    pageNumber: pageNumberOptions,\n    watermark: waterMarkOptions,\n    control: controlOptions,\n    checkbox: checkboxOptions,\n    radio: radioOptions,\n    cursor: cursorOptions,\n    title: titleOptions,\n    placeholder: placeholderOptions,\n    group: groupOptions,\n    pageBreak: pageBreakOptions,\n    zone: zoneOptions,\n    background: backgroundOptions,\n    lineBreak: lineBreakOptions,\n    separator: separatorOptions,\n    lineNumber: lineNumberOptions,\n    pageBorder: pageBorderOptions\n  };\n}\nfunction unzipElementList(elementList) {\n  const result = [];\n  for (let v = 0; v < elementList.length; v++) {\n    const valueItem = elementList[v];\n    const textList = splitText(valueItem.value);\n    for (let d = 0; d < textList.length; d++) {\n      result.push({ ...valueItem, value: textList[d] });\n    }\n  }\n  return result;\n}\nfunction formatElementList(elementList, options) {\n  const { isHandleFirstElement = true, isForceCompensation = false, editorOptions } = options;\n  const startElement = elementList[0];\n  if (isForceCompensation || isHandleFirstElement && (startElement == null ? void 0 : startElement.type) !== ElementType.LIST && ((startElement == null ? void 0 : startElement.type) && startElement.type !== ElementType.TEXT || !START_LINE_BREAK_REG.test(startElement == null ? void 0 : startElement.value))) {\n    elementList.unshift({\n      value: ZERO\n    });\n  }\n  let i = 0;\n  while (i < elementList.length) {\n    let el = elementList[i];\n    if (el.type === ElementType.TITLE) {\n      elementList.splice(i, 1);\n      const valueList = el.valueList || [];\n      formatElementList(valueList, {\n        ...options,\n        isHandleFirstElement: false,\n        isForceCompensation: false\n      });\n      if (valueList.length) {\n        const titleId = getUUID();\n        const titleOptions = editorOptions.title;\n        for (let v = 0; v < valueList.length; v++) {\n          const value = valueList[v];\n          value.title = el.title;\n          if (el.level) {\n            value.titleId = titleId;\n            value.level = el.level;\n          }\n          if (isTextLikeElement(value)) {\n            if (!value.size) {\n              value.size = titleOptions[titleSizeMapping[value.level]];\n            }\n            if (value.bold === void 0) {\n              value.bold = true;\n            }\n          }\n          elementList.splice(i, 0, value);\n          i++;\n        }\n      }\n      i--;\n    } else if (el.type === ElementType.LIST) {\n      elementList.splice(i, 1);\n      const valueList = el.valueList || [];\n      formatElementList(valueList, {\n        ...options,\n        isHandleFirstElement: true,\n        isForceCompensation: false\n      });\n      if (valueList.length) {\n        const listId = getUUID();\n        for (let v = 0; v < valueList.length; v++) {\n          const value = valueList[v];\n          value.listId = listId;\n          value.listType = el.listType;\n          value.listStyle = el.listStyle;\n          elementList.splice(i, 0, value);\n          i++;\n        }\n      }\n      i--;\n    } else if (el.type === ElementType.TABLE) {\n      const tableId = getUUID();\n      el.id = tableId;\n      if (el.trList) {\n        const { defaultTrMinHeight } = editorOptions.table;\n        for (let t = 0; t < el.trList.length; t++) {\n          const tr = el.trList[t];\n          const trId = getUUID();\n          tr.id = trId;\n          if (!tr.minHeight || tr.minHeight < defaultTrMinHeight) {\n            tr.minHeight = defaultTrMinHeight;\n          }\n          if (tr.height < tr.minHeight) {\n            tr.height = tr.minHeight;\n          }\n          for (let d = 0; d < tr.tdList.length; d++) {\n            const td = tr.tdList[d];\n            const tdId = getUUID();\n            td.id = tdId;\n            formatElementList(td.value, {\n              ...options,\n              isHandleFirstElement: true,\n              isForceCompensation: true\n            });\n            for (let v = 0; v < td.value.length; v++) {\n              const value = td.value[v];\n              value.tdId = tdId;\n              value.trId = trId;\n              value.tableId = tableId;\n            }\n          }\n        }\n      }\n    } else if (el.type === ElementType.HYPERLINK) {\n      elementList.splice(i, 1);\n      const valueList = unzipElementList(el.valueList || []);\n      if (valueList.length) {\n        const hyperlinkId = getUUID();\n        for (let v = 0; v < valueList.length; v++) {\n          const value = valueList[v];\n          value.type = el.type;\n          value.url = el.url;\n          value.hyperlinkId = hyperlinkId;\n          elementList.splice(i, 0, value);\n          i++;\n        }\n      }\n      i--;\n    } else if (el.type === ElementType.DATE) {\n      elementList.splice(i, 1);\n      const valueList = unzipElementList(el.valueList || []);\n      if (valueList.length) {\n        const dateId = getUUID();\n        for (let v = 0; v < valueList.length; v++) {\n          const value = valueList[v];\n          value.type = el.type;\n          value.dateFormat = el.dateFormat;\n          value.dateId = dateId;\n          elementList.splice(i, 0, value);\n          i++;\n        }\n      }\n      i--;\n    } else if (el.type === ElementType.CONTROL) {\n      if (!el.control) {\n        i++;\n        continue;\n      }\n      const { prefix, postfix, value, placeholder, code, type, valueSets } = el.control;\n      const { editorOptions: { control: controlOption, checkbox: checkboxOption, radio: radioOption } } = options;\n      const controlId = getUUID();\n      elementList.splice(i, 1);\n      const controlContext = pickObject(el, [\n        ...EDITOR_ELEMENT_CONTEXT_ATTR,\n        ...EDITOR_ROW_ATTR\n      ]);\n      const controlDefaultStyle = pickObject(el.control, CONTROL_STYLE_ATTR);\n      const thePrePostfixArg = {\n        ...controlDefaultStyle,\n        color: editorOptions.control.bracketColor\n      };\n      const prefixStrList = splitText(prefix || controlOption.prefix);\n      for (let p = 0; p < prefixStrList.length; p++) {\n        const value2 = prefixStrList[p];\n        elementList.splice(i, 0, {\n          ...controlContext,\n          ...thePrePostfixArg,\n          controlId,\n          value: value2,\n          type: el.type,\n          control: el.control,\n          controlComponent: ControlComponent.PREFIX\n        });\n        i++;\n      }\n      if (value && value.length || type === ControlType.CHECKBOX || type === ControlType.RADIO || type === ControlType.SELECT && code && (!value || !value.length)) {\n        let valueList = value || [];\n        if (type === ControlType.CHECKBOX) {\n          const codeList = code ? code.split(\",\") : [];\n          if (Array.isArray(valueSets) && valueSets.length) {\n            const valueStyleList = valueList.reduce((pre, cur) => pre.concat(cur.value.split(\"\").map((v) => ({ ...cur, value: v }))), []);\n            let valueStyleIndex = 0;\n            for (let v = 0; v < valueSets.length; v++) {\n              const valueSet = valueSets[v];\n              elementList.splice(i, 0, {\n                ...controlContext,\n                ...controlDefaultStyle,\n                controlId,\n                value: \"\",\n                type: el.type,\n                control: el.control,\n                controlComponent: ControlComponent.CHECKBOX,\n                checkbox: {\n                  code: valueSet.code,\n                  value: codeList.includes(valueSet.code)\n                }\n              });\n              i++;\n              const valueStrList = splitText(valueSet.value);\n              for (let e = 0; e < valueStrList.length; e++) {\n                const value2 = valueStrList[e];\n                const isLastLetter = e === valueStrList.length - 1;\n                elementList.splice(i, 0, {\n                  ...controlContext,\n                  ...controlDefaultStyle,\n                  ...valueStyleList[valueStyleIndex],\n                  controlId,\n                  value: value2 === \"\\n\" ? ZERO : value2,\n                  letterSpacing: isLastLetter ? checkboxOption.gap : 0,\n                  control: el.control,\n                  controlComponent: ControlComponent.VALUE\n                });\n                valueStyleIndex++;\n                i++;\n              }\n            }\n          }\n        } else if (type === ControlType.RADIO) {\n          if (Array.isArray(valueSets) && valueSets.length) {\n            const valueStyleList = valueList.reduce((pre, cur) => pre.concat(cur.value.split(\"\").map((v) => ({ ...cur, value: v }))), []);\n            let valueStyleIndex = 0;\n            for (let v = 0; v < valueSets.length; v++) {\n              const valueSet = valueSets[v];\n              elementList.splice(i, 0, {\n                ...controlContext,\n                ...controlDefaultStyle,\n                controlId,\n                value: \"\",\n                type: el.type,\n                control: el.control,\n                controlComponent: ControlComponent.RADIO,\n                radio: {\n                  code: valueSet.code,\n                  value: code === valueSet.code\n                }\n              });\n              i++;\n              const valueStrList = splitText(valueSet.value);\n              for (let e = 0; e < valueStrList.length; e++) {\n                const value2 = valueStrList[e];\n                const isLastLetter = e === valueStrList.length - 1;\n                elementList.splice(i, 0, {\n                  ...controlContext,\n                  ...controlDefaultStyle,\n                  ...valueStyleList[valueStyleIndex],\n                  controlId,\n                  value: value2 === \"\\n\" ? ZERO : value2,\n                  letterSpacing: isLastLetter ? radioOption.gap : 0,\n                  control: el.control,\n                  controlComponent: ControlComponent.VALUE\n                });\n                valueStyleIndex++;\n                i++;\n              }\n            }\n          }\n        } else {\n          if (!value || !value.length) {\n            if (Array.isArray(valueSets) && valueSets.length) {\n              const valueSet = valueSets.find((v) => v.code === code);\n              if (valueSet) {\n                valueList = [\n                  {\n                    value: valueSet.value\n                  }\n                ];\n              }\n            }\n          }\n          formatElementList(valueList, {\n            ...options,\n            isHandleFirstElement: false,\n            isForceCompensation: false\n          });\n          for (let v = 0; v < valueList.length; v++) {\n            const element = valueList[v];\n            const value2 = element.value;\n            elementList.splice(i, 0, {\n              ...controlContext,\n              ...controlDefaultStyle,\n              ...element,\n              controlId,\n              value: value2 === \"\\n\" ? ZERO : value2,\n              type: element.type || ElementType.TEXT,\n              control: el.control,\n              controlComponent: ControlComponent.VALUE\n            });\n            i++;\n          }\n        }\n      } else if (placeholder) {\n        const thePlaceholderArgs = {\n          ...controlDefaultStyle,\n          color: editorOptions.control.placeholderColor\n        };\n        const placeholderStrList = splitText(placeholder);\n        for (let p = 0; p < placeholderStrList.length; p++) {\n          const value2 = placeholderStrList[p];\n          elementList.splice(i, 0, {\n            ...controlContext,\n            ...thePlaceholderArgs,\n            controlId,\n            value: value2 === \"\\n\" ? ZERO : value2,\n            type: el.type,\n            control: el.control,\n            controlComponent: ControlComponent.PLACEHOLDER\n          });\n          i++;\n        }\n      }\n      const postfixStrList = splitText(postfix || controlOption.postfix);\n      for (let p = 0; p < postfixStrList.length; p++) {\n        const value2 = postfixStrList[p];\n        elementList.splice(i, 0, {\n          ...controlContext,\n          ...thePrePostfixArg,\n          controlId,\n          value: value2,\n          type: el.type,\n          control: el.control,\n          controlComponent: ControlComponent.POSTFIX\n        });\n        i++;\n      }\n      i--;\n    } else if ((!el.type || TEXTLIKE_ELEMENT_TYPE.includes(el.type)) && el.value.length > 1) {\n      elementList.splice(i, 1);\n      const valueList = splitText(el.value);\n      for (let v = 0; v < valueList.length; v++) {\n        elementList.splice(i + v, 0, { ...el, value: valueList[v] });\n      }\n      el = elementList[i];\n    }\n    if (el.value === \"\\n\" || el.value == \"\\r\\n\") {\n      el.value = ZERO;\n    }\n    if (el.type === ElementType.IMAGE || el.type === ElementType.BLOCK) {\n      el.id = getUUID();\n    }\n    if (el.type === ElementType.LATEX) {\n      const { svg, width, height } = LaTexParticle.convertLaTextToSVG(el.value);\n      el.width = el.width || width;\n      el.height = el.height || height;\n      el.laTexSVG = svg;\n      el.id = getUUID();\n    }\n    i++;\n  }\n}\nfunction isSameElementExceptValue(source, target) {\n  const sourceKeys = Object.keys(source);\n  const targetKeys = Object.keys(target);\n  if (sourceKeys.length !== targetKeys.length)\n    return false;\n  for (let s = 0; s < sourceKeys.length; s++) {\n    const key = sourceKeys[s];\n    if (key === \"value\")\n      continue;\n    if (key === \"groupIds\" && Array.isArray(source[key]) && Array.isArray(target[key]) && isArrayEqual(source[key], target[key])) {\n      continue;\n    }\n    if (source[key] !== target[key]) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction pickElementAttr(payload, option = {}) {\n  const { extraPickAttrs } = option;\n  const zipAttrs = EDITOR_ELEMENT_ZIP_ATTR;\n  if (extraPickAttrs) {\n    zipAttrs.push(...extraPickAttrs);\n  }\n  const element = {\n    value: payload.value === ZERO ? `\n` : payload.value\n  };\n  zipAttrs.forEach((attr) => {\n    const value = payload[attr];\n    if (value !== void 0) {\n      element[attr] = value;\n    }\n  });\n  return element;\n}\nfunction zipElementList(payload, options = {}) {\n  const { extraPickAttrs } = options;\n  const elementList = deepClone(payload);\n  const zipElementListData = [];\n  let e = 0;\n  while (e < elementList.length) {\n    let element = elementList[e];\n    if (e === 0 && element.value === ZERO && !element.listId && (!element.type || element.type === ElementType.TEXT)) {\n      e++;\n      continue;\n    }\n    if (element.titleId && element.level) {\n      const titleId = element.titleId;\n      if (titleId) {\n        const level = element.level;\n        const titleElement = {\n          type: ElementType.TITLE,\n          title: element.title,\n          value: \"\",\n          level\n        };\n        const valueList = [];\n        while (e < elementList.length) {\n          const titleE = elementList[e];\n          if (titleId !== titleE.titleId) {\n            e--;\n            break;\n          }\n          delete titleE.level;\n          delete titleE.title;\n          valueList.push(titleE);\n          e++;\n        }\n        titleElement.valueList = zipElementList(valueList, options);\n        element = titleElement;\n      }\n    } else if (element.listId && element.listType) {\n      const listId = element.listId;\n      if (listId) {\n        const listType = element.listType;\n        const listStyle = element.listStyle;\n        const listElement = {\n          type: ElementType.LIST,\n          value: \"\",\n          listId,\n          listType,\n          listStyle\n        };\n        const valueList = [];\n        while (e < elementList.length) {\n          const listE = elementList[e];\n          if (listId !== listE.listId) {\n            e--;\n            break;\n          }\n          delete listE.listType;\n          delete listE.listStyle;\n          valueList.push(listE);\n          e++;\n        }\n        listElement.valueList = zipElementList(valueList, options);\n        element = listElement;\n      }\n    } else if (element.type === ElementType.TABLE) {\n      if (element.pagingId) {\n        let tableIndex = e + 1;\n        let combineCount = 0;\n        while (tableIndex < elementList.length) {\n          const nextElement = elementList[tableIndex];\n          if (nextElement.pagingId === element.pagingId) {\n            element.height += nextElement.height;\n            element.trList.push(...nextElement.trList);\n            tableIndex++;\n            combineCount++;\n          } else {\n            break;\n          }\n        }\n        e += combineCount;\n      }\n      if (element.trList) {\n        for (let t = 0; t < element.trList.length; t++) {\n          const tr = element.trList[t];\n          delete tr.id;\n          for (let d = 0; d < tr.tdList.length; d++) {\n            const td = tr.tdList[d];\n            const zipTd = {\n              colspan: td.colspan,\n              rowspan: td.rowspan,\n              value: zipElementList(td.value, options)\n            };\n            TABLE_TD_ZIP_ATTR.forEach((attr) => {\n              const value = td[attr];\n              if (value !== void 0) {\n                zipTd[attr] = value;\n              }\n            });\n            tr.tdList[d] = zipTd;\n          }\n        }\n      }\n    } else if (element.type === ElementType.HYPERLINK) {\n      const hyperlinkId = element.hyperlinkId;\n      if (hyperlinkId) {\n        const hyperlinkElement = {\n          type: ElementType.HYPERLINK,\n          value: \"\",\n          url: element.url\n        };\n        const valueList = [];\n        while (e < elementList.length) {\n          const hyperlinkE = elementList[e];\n          if (hyperlinkId !== hyperlinkE.hyperlinkId) {\n            e--;\n            break;\n          }\n          delete hyperlinkE.type;\n          delete hyperlinkE.url;\n          valueList.push(hyperlinkE);\n          e++;\n        }\n        hyperlinkElement.valueList = zipElementList(valueList, options);\n        element = hyperlinkElement;\n      }\n    } else if (element.type === ElementType.DATE) {\n      const dateId = element.dateId;\n      if (dateId) {\n        const dateElement = {\n          type: ElementType.DATE,\n          value: \"\",\n          dateFormat: element.dateFormat\n        };\n        const valueList = [];\n        while (e < elementList.length) {\n          const dateE = elementList[e];\n          if (dateId !== dateE.dateId) {\n            e--;\n            break;\n          }\n          delete dateE.type;\n          delete dateE.dateFormat;\n          valueList.push(dateE);\n          e++;\n        }\n        dateElement.valueList = zipElementList(valueList, options);\n        element = dateElement;\n      }\n    } else if (element.controlId) {\n      const controlId = element.controlId;\n      if (controlId) {\n        const controlDefaultStyle = pickObject(element, CONTROL_STYLE_ATTR);\n        const control = {\n          ...element.control,\n          ...controlDefaultStyle\n        };\n        const controlElement = {\n          ...pickObject(element, EDITOR_ROW_ATTR),\n          type: ElementType.CONTROL,\n          value: \"\",\n          control,\n          controlId\n        };\n        const valueList = [];\n        while (e < elementList.length) {\n          const controlE = elementList[e];\n          if (controlId !== controlE.controlId) {\n            e--;\n            break;\n          }\n          if (controlE.controlComponent === ControlComponent.VALUE) {\n            delete controlE.control;\n            delete controlE.controlId;\n            valueList.push(controlE);\n          }\n          e++;\n        }\n        controlElement.control.value = zipElementList(valueList, options);\n        element = pickElementAttr(controlElement, { extraPickAttrs });\n      }\n    }\n    const pickElement = pickElementAttr(element, { extraPickAttrs });\n    if (!element.type || element.type === ElementType.TEXT || element.type === ElementType.SUBSCRIPT || element.type === ElementType.SUPERSCRIPT) {\n      while (e < elementList.length) {\n        const nextElement = elementList[e + 1];\n        e++;\n        if (nextElement && isSameElementExceptValue(pickElement, pickElementAttr(nextElement, { extraPickAttrs }))) {\n          const nextValue = nextElement.value === ZERO ? \"\\n\" : nextElement.value;\n          pickElement.value += nextValue;\n        } else {\n          break;\n        }\n      }\n    } else {\n      e++;\n    }\n    zipElementListData.push(pickElement);\n  }\n  return zipElementListData;\n}\nfunction convertTextAlignToRowFlex(node) {\n  const textAlign = window.getComputedStyle(node).textAlign;\n  switch (textAlign) {\n    case \"left\":\n    case \"start\":\n      return RowFlex.LEFT;\n    case \"center\":\n      return RowFlex.CENTER;\n    case \"right\":\n    case \"end\":\n      return RowFlex.RIGHT;\n    case \"justify\":\n      return RowFlex.ALIGNMENT;\n    case \"justify-all\":\n      return RowFlex.JUSTIFY;\n    default:\n      return RowFlex.LEFT;\n  }\n}\nfunction convertRowFlexToTextAlign(rowFlex) {\n  return rowFlex === RowFlex.ALIGNMENT ? \"justify\" : rowFlex;\n}\nfunction convertRowFlexToJustifyContent(rowFlex) {\n  switch (rowFlex) {\n    case RowFlex.LEFT:\n      return \"flex-start\";\n    case RowFlex.CENTER:\n      return \"center\";\n    case RowFlex.RIGHT:\n      return \"flex-end\";\n    case RowFlex.ALIGNMENT:\n    case RowFlex.JUSTIFY:\n      return \"space-between\";\n    default:\n      return \"flex-start\";\n  }\n}\nfunction isTextLikeElement(element) {\n  return !element.type || TEXTLIKE_ELEMENT_TYPE.includes(element.type);\n}\nfunction getAnchorElement(elementList, anchorIndex) {\n  const anchorElement = elementList[anchorIndex];\n  if (!anchorElement)\n    return null;\n  const anchorNextElement = elementList[anchorIndex + 1];\n  return !anchorElement.listId && anchorElement.value === ZERO && anchorNextElement && anchorNextElement.value !== ZERO ? anchorNextElement : anchorElement;\n}\nfunction formatElementContext(sourceElementList, formatElementList2, anchorIndex, options) {\n  var _a, _b, _c;\n  let copyElement = getAnchorElement(sourceElementList, anchorIndex);\n  if (!copyElement)\n    return;\n  const { isBreakWhenWrap = false, editorOptions } = options || {};\n  const { mode } = editorOptions || {};\n  if (mode !== EditorMode.DESIGN && ((_a = copyElement.title) == null ? void 0 : _a.disabled)) {\n    copyElement = omitObject(copyElement, TITLE_CONTEXT_ATTR);\n  }\n  let isBreakWarped = false;\n  for (let e = 0; e < formatElementList2.length; e++) {\n    const targetElement = formatElementList2[e];\n    if (isBreakWhenWrap && !copyElement.listId && START_LINE_BREAK_REG.test(targetElement.value)) {\n      isBreakWarped = true;\n    }\n    if (isBreakWarped || !copyElement.listId && targetElement.type === ElementType.LIST) {\n      const cloneAttr2 = [...TABLE_CONTEXT_ATTR, ...EDITOR_ROW_ATTR];\n      cloneProperty(cloneAttr2, copyElement, targetElement);\n      (_b = targetElement.valueList) == null ? void 0 : _b.forEach((valueItem) => {\n        cloneProperty(cloneAttr2, copyElement, valueItem);\n      });\n      continue;\n    }\n    if ((_c = targetElement.valueList) == null ? void 0 : _c.length) {\n      formatElementContext(sourceElementList, targetElement.valueList, anchorIndex, options);\n    }\n    const cloneAttr = [...EDITOR_ELEMENT_CONTEXT_ATTR];\n    if (!getIsBlockElement(targetElement)) {\n      cloneAttr.push(...EDITOR_ROW_ATTR);\n    }\n    cloneProperty(cloneAttr, copyElement, targetElement);\n  }\n}\nfunction convertElementToDom(element, options) {\n  let tagName = \"span\";\n  if (element.type === ElementType.SUPERSCRIPT) {\n    tagName = \"sup\";\n  } else if (element.type === ElementType.SUBSCRIPT) {\n    tagName = \"sub\";\n  }\n  const dom = document.createElement(tagName);\n  dom.style.fontFamily = element.font || options.defaultFont;\n  if (element.rowFlex) {\n    dom.style.textAlign = convertRowFlexToTextAlign(element.rowFlex);\n  }\n  if (element.color) {\n    dom.style.color = element.color;\n  }\n  if (element.bold) {\n    dom.style.fontWeight = \"600\";\n  }\n  if (element.italic) {\n    dom.style.fontStyle = \"italic\";\n  }\n  dom.style.fontSize = `${element.size || options.defaultSize}px`;\n  if (element.highlight) {\n    dom.style.backgroundColor = element.highlight;\n  }\n  if (element.underline) {\n    dom.style.textDecoration = \"underline\";\n  }\n  if (element.strikeout) {\n    dom.style.textDecoration += \" line-through\";\n  }\n  dom.innerText = element.value.replace(new RegExp(`${ZERO}`, \"g\"), \"\\n\");\n  return dom;\n}\nfunction splitListElement(elementList) {\n  let curListIndex = 0;\n  const listElementListMap = /* @__PURE__ */ new Map();\n  for (let e = 0; e < elementList.length; e++) {\n    const element = elementList[e];\n    if (e === 0) {\n      if (element.checkbox)\n        continue;\n      element.value = element.value.replace(START_LINE_BREAK_REG, \"\");\n    }\n    if (element.listWrap) {\n      const listElementList = listElementListMap.get(curListIndex) || [];\n      listElementList.push(element);\n      listElementListMap.set(curListIndex, listElementList);\n    } else {\n      const valueList = element.value.split(\"\\n\");\n      for (let c = 0; c < valueList.length; c++) {\n        if (c > 0) {\n          curListIndex += 1;\n        }\n        const value = valueList[c];\n        const listElementList = listElementListMap.get(curListIndex) || [];\n        listElementList.push({\n          ...element,\n          value\n        });\n        listElementListMap.set(curListIndex, listElementList);\n      }\n    }\n  }\n  return listElementListMap;\n}\nfunction groupElementListByRowFlex(elementList) {\n  var _a;\n  const elementListGroupList = [];\n  if (!elementList.length)\n    return elementListGroupList;\n  let currentRowFlex = ((_a = elementList[0]) == null ? void 0 : _a.rowFlex) || null;\n  elementListGroupList.push({\n    rowFlex: currentRowFlex,\n    data: [elementList[0]]\n  });\n  for (let e = 1; e < elementList.length; e++) {\n    const element = elementList[e];\n    const rowFlex = element.rowFlex || null;\n    if (currentRowFlex === rowFlex && !getIsBlockElement(element) && !getIsBlockElement(elementList[e - 1])) {\n      const lastElementListGroup = elementListGroupList[elementListGroupList.length - 1];\n      lastElementListGroup.data.push(element);\n    } else {\n      elementListGroupList.push({\n        rowFlex,\n        data: [element]\n      });\n      currentRowFlex = rowFlex;\n    }\n  }\n  for (let g = 0; g < elementListGroupList.length; g++) {\n    const elementListGroup = elementListGroupList[g];\n    elementListGroup.data = zipElementList(elementListGroup.data);\n  }\n  return elementListGroupList;\n}\nfunction createDomFromElementList(elementList, options) {\n  const editorOptions = mergeOption(options);\n  function buildDom(payload) {\n    var _a, _b, _c, _d, _e, _f, _g, _h, _i;\n    const clipboardDom2 = document.createElement(\"div\");\n    for (let e = 0; e < payload.length; e++) {\n      const element = payload[e];\n      if (element.type === ElementType.TABLE) {\n        const tableDom = document.createElement(\"table\");\n        tableDom.setAttribute(\"cellSpacing\", \"0\");\n        tableDom.setAttribute(\"cellpadding\", \"0\");\n        tableDom.setAttribute(\"border\", \"0\");\n        const borderStyle = \"1px solid #000000\";\n        if (!element.borderType || element.borderType === TableBorder.ALL) {\n          tableDom.style.borderTop = borderStyle;\n          tableDom.style.borderLeft = borderStyle;\n        } else if (element.borderType === TableBorder.EXTERNAL) {\n          tableDom.style.border = borderStyle;\n        }\n        tableDom.style.width = `${element.width}px`;\n        const colgroupDom = document.createElement(\"colgroup\");\n        for (let c = 0; c < element.colgroup.length; c++) {\n          const colgroup = element.colgroup[c];\n          const colDom = document.createElement(\"col\");\n          colDom.setAttribute(\"width\", `${colgroup.width}`);\n          colgroupDom.append(colDom);\n        }\n        tableDom.append(colgroupDom);\n        const trList = element.trList;\n        for (let t = 0; t < trList.length; t++) {\n          const trDom = document.createElement(\"tr\");\n          const tr = trList[t];\n          trDom.style.height = `${tr.height}px`;\n          for (let d = 0; d < tr.tdList.length; d++) {\n            const tdDom = document.createElement(\"td\");\n            if (!element.borderType || element.borderType === TableBorder.ALL) {\n              tdDom.style.borderBottom = tdDom.style.borderRight = \"1px solid\";\n            }\n            const td = tr.tdList[d];\n            tdDom.colSpan = td.colspan;\n            tdDom.rowSpan = td.rowspan;\n            tdDom.style.verticalAlign = td.verticalAlign || \"top\";\n            if ((_a = td.borderTypes) == null ? void 0 : _a.includes(TdBorder.TOP)) {\n              tdDom.style.borderTop = borderStyle;\n            }\n            if ((_b = td.borderTypes) == null ? void 0 : _b.includes(TdBorder.RIGHT)) {\n              tdDom.style.borderRight = borderStyle;\n            }\n            if ((_c = td.borderTypes) == null ? void 0 : _c.includes(TdBorder.BOTTOM)) {\n              tdDom.style.borderBottom = borderStyle;\n            }\n            if ((_d = td.borderTypes) == null ? void 0 : _d.includes(TdBorder.LEFT)) {\n              tdDom.style.borderLeft = borderStyle;\n            }\n            const childDom = createDomFromElementList(td.value, options);\n            tdDom.innerHTML = childDom.innerHTML;\n            if (td.backgroundColor) {\n              tdDom.style.backgroundColor = td.backgroundColor;\n            }\n            trDom.append(tdDom);\n          }\n          tableDom.append(trDom);\n        }\n        clipboardDom2.append(tableDom);\n      } else if (element.type === ElementType.HYPERLINK) {\n        const a = document.createElement(\"a\");\n        a.innerText = element.valueList.map((v) => v.value).join(\"\");\n        if (element.url) {\n          a.href = element.url;\n        }\n        clipboardDom2.append(a);\n      } else if (element.type === ElementType.TITLE) {\n        const h = document.createElement(`h${titleOrderNumberMapping[element.level]}`);\n        const childDom = buildDom(element.valueList);\n        h.innerHTML = childDom.innerHTML;\n        clipboardDom2.append(h);\n      } else if (element.type === ElementType.LIST) {\n        const list = document.createElement(listTypeElementMapping[element.listType]);\n        if (element.listStyle) {\n          list.style.listStyleType = listStyleCSSMapping[element.listStyle];\n        }\n        const zipList = zipElementList(element.valueList);\n        const listElementListMap = splitListElement(zipList);\n        listElementListMap.forEach((listElementList) => {\n          const li = document.createElement(\"li\");\n          const childDom = buildDom(listElementList);\n          li.innerHTML = childDom.innerHTML;\n          list.append(li);\n        });\n        clipboardDom2.append(list);\n      } else if (element.type === ElementType.IMAGE) {\n        const img = document.createElement(\"img\");\n        if (element.value) {\n          img.src = element.value;\n          img.width = element.width;\n          img.height = element.height;\n        }\n        clipboardDom2.append(img);\n      } else if (element.type === ElementType.SEPARATOR) {\n        const hr = document.createElement(\"hr\");\n        clipboardDom2.append(hr);\n      } else if (element.type === ElementType.CHECKBOX) {\n        const checkbox = document.createElement(\"input\");\n        checkbox.type = \"checkbox\";\n        if ((_e = element.checkbox) == null ? void 0 : _e.value) {\n          checkbox.setAttribute(\"checked\", \"true\");\n        }\n        clipboardDom2.append(checkbox);\n      } else if (element.type === ElementType.RADIO) {\n        const radio = document.createElement(\"input\");\n        radio.type = \"radio\";\n        if ((_f = element.radio) == null ? void 0 : _f.value) {\n          radio.setAttribute(\"checked\", \"true\");\n        }\n        clipboardDom2.append(radio);\n      } else if (element.type === ElementType.TAB) {\n        const tab2 = document.createElement(\"span\");\n        tab2.innerHTML = `${NON_BREAKING_SPACE}${NON_BREAKING_SPACE}`;\n        clipboardDom2.append(tab2);\n      } else if (element.type === ElementType.CONTROL) {\n        const controlElement = document.createElement(\"span\");\n        const childDom = buildDom(((_g = element.control) == null ? void 0 : _g.value) || []);\n        controlElement.innerHTML = childDom.innerHTML;\n        clipboardDom2.append(controlElement);\n      } else if (!element.type || element.type === ElementType.LATEX || TEXTLIKE_ELEMENT_TYPE.includes(element.type)) {\n        let text = \"\";\n        if (element.type === ElementType.DATE) {\n          text = ((_h = element.valueList) == null ? void 0 : _h.map((v) => v.value).join(\"\")) || \"\";\n        } else {\n          text = element.value;\n        }\n        if (!text)\n          continue;\n        const dom = convertElementToDom(element, editorOptions);\n        if (((_i = payload[e - 1]) == null ? void 0 : _i.type) === ElementType.TITLE) {\n          text = text.replace(/^\\n/, \"\");\n        }\n        dom.innerText = text.replace(new RegExp(`${ZERO}`, \"g\"), \"\\n\");\n        clipboardDom2.append(dom);\n      }\n    }\n    return clipboardDom2;\n  }\n  const clipboardDom = document.createElement(\"div\");\n  const groupElementList = groupElementListByRowFlex(elementList);\n  for (let g = 0; g < groupElementList.length; g++) {\n    const elementGroupRowFlex = groupElementList[g];\n    const isDefaultRowFlex = !elementGroupRowFlex.rowFlex || elementGroupRowFlex.rowFlex === RowFlex.LEFT;\n    const rowFlexDom = document.createElement(\"div\");\n    if (!isDefaultRowFlex) {\n      const firstElement = elementGroupRowFlex.data[0];\n      if (getIsBlockElement(firstElement)) {\n        rowFlexDom.style.display = \"flex\";\n        rowFlexDom.style.justifyContent = convertRowFlexToJustifyContent(firstElement.rowFlex);\n      } else {\n        rowFlexDom.style.textAlign = convertRowFlexToTextAlign(elementGroupRowFlex.rowFlex);\n      }\n    }\n    rowFlexDom.innerHTML = buildDom(elementGroupRowFlex.data).innerHTML;\n    if (!isDefaultRowFlex) {\n      clipboardDom.append(rowFlexDom);\n    } else {\n      rowFlexDom.childNodes.forEach((child) => {\n        clipboardDom.append(child.cloneNode(true));\n      });\n    }\n  }\n  return clipboardDom;\n}\nfunction convertTextNodeToElement(textNode) {\n  if (!textNode || textNode.nodeType !== 3)\n    return null;\n  const parentNode = textNode.parentNode;\n  const anchorNode = parentNode.nodeName === \"FONT\" ? parentNode.parentNode : parentNode;\n  const rowFlex = convertTextAlignToRowFlex(anchorNode);\n  const value = textNode.textContent;\n  const style = window.getComputedStyle(anchorNode);\n  if (!value || anchorNode.nodeName === \"STYLE\")\n    return null;\n  const element = {\n    value,\n    color: style.color,\n    bold: Number(style.fontWeight) > 500,\n    italic: style.fontStyle.includes(\"italic\"),\n    size: Math.floor(parseFloat(style.fontSize))\n  };\n  if (anchorNode.nodeName === \"SUB\" || style.verticalAlign === \"sub\") {\n    element.type = ElementType.SUBSCRIPT;\n  } else if (anchorNode.nodeName === \"SUP\" || style.verticalAlign === \"super\") {\n    element.type = ElementType.SUPERSCRIPT;\n  }\n  if (rowFlex !== RowFlex.LEFT) {\n    element.rowFlex = rowFlex;\n  }\n  if (style.backgroundColor !== \"rgba(0, 0, 0, 0)\") {\n    element.highlight = style.backgroundColor;\n  }\n  if (style.textDecorationLine.includes(\"underline\")) {\n    element.underline = true;\n  }\n  if (style.textDecorationLine.includes(\"line-through\")) {\n    element.strikeout = true;\n  }\n  return element;\n}\nfunction getElementListByHTML(htmlText, options) {\n  const elementList = [];\n  function findTextNode(dom) {\n    if (dom.nodeType === 3) {\n      const element = convertTextNodeToElement(dom);\n      if (element) {\n        elementList.push(element);\n      }\n    } else if (dom.nodeType === 1) {\n      const childNodes = dom.childNodes;\n      for (let n = 0; n < childNodes.length; n++) {\n        const node = childNodes[n];\n        if (node.nodeName === \"BR\") {\n          elementList.push({\n            value: \"\\n\"\n          });\n        } else if (node.nodeName === \"A\") {\n          const aElement = node;\n          const value = aElement.innerText;\n          if (value) {\n            elementList.push({\n              type: ElementType.HYPERLINK,\n              value: \"\",\n              valueList: [\n                {\n                  value\n                }\n              ],\n              url: aElement.href\n            });\n          }\n        } else if (/H[1-6]/.test(node.nodeName)) {\n          const hElement = node;\n          const valueList = getElementListByHTML(replaceHTMLElementTag(hElement, \"div\").outerHTML, options);\n          elementList.push({\n            value: \"\",\n            type: ElementType.TITLE,\n            level: titleNodeNameMapping[node.nodeName],\n            valueList\n          });\n          if (node.nextSibling && !INLINE_NODE_NAME.includes(node.nextSibling.nodeName)) {\n            elementList.push({\n              value: \"\\n\"\n            });\n          }\n        } else if (node.nodeName === \"UL\" || node.nodeName === \"OL\") {\n          const listNode = node;\n          const listElement = {\n            value: \"\",\n            type: ElementType.LIST,\n            valueList: []\n          };\n          if (node.nodeName === \"OL\") {\n            listElement.listType = ListType.OL;\n          } else {\n            listElement.listType = ListType.UL;\n            listElement.listStyle = listNode.style.listStyleType;\n          }\n          listNode.querySelectorAll(\"li\").forEach((li) => {\n            const liValueList = getElementListByHTML(li.innerHTML, options);\n            liValueList.forEach((list) => {\n              if (list.value === \"\\n\") {\n                list.listWrap = true;\n              }\n            });\n            liValueList.unshift({\n              value: \"\\n\"\n            });\n            listElement.valueList.push(...liValueList);\n          });\n          elementList.push(listElement);\n        } else if (node.nodeName === \"HR\") {\n          elementList.push({\n            value: \"\\n\",\n            type: ElementType.SEPARATOR\n          });\n        } else if (node.nodeName === \"IMG\") {\n          const { src, width, height } = node;\n          if (src && width && height) {\n            elementList.push({\n              width,\n              height,\n              value: src,\n              type: ElementType.IMAGE\n            });\n          }\n        } else if (node.nodeName === \"TABLE\") {\n          const tableElement = node;\n          const element = {\n            type: ElementType.TABLE,\n            value: \"\\n\",\n            colgroup: [],\n            trList: []\n          };\n          tableElement.querySelectorAll(\"tr\").forEach((trElement) => {\n            const trHeightStr = window.getComputedStyle(trElement).height.replace(\"px\", \"\");\n            const tr = {\n              height: Number(trHeightStr),\n              tdList: []\n            };\n            trElement.querySelectorAll(\"th,td\").forEach((tdElement) => {\n              const tableCell = tdElement;\n              const valueList = getElementListByHTML(tableCell.innerHTML, options);\n              const td = {\n                colspan: tableCell.colSpan,\n                rowspan: tableCell.rowSpan,\n                value: valueList\n              };\n              if (tableCell.style.backgroundColor) {\n                td.backgroundColor = tableCell.style.backgroundColor;\n              }\n              tr.tdList.push(td);\n            });\n            element.trList.push(tr);\n          });\n          if (element.trList.length) {\n            const tdCount = element.trList[0].tdList.reduce((pre, cur) => pre + cur.colspan, 0);\n            const width = Math.ceil(options.innerWidth / tdCount);\n            for (let i = 0; i < tdCount; i++) {\n              element.colgroup.push({\n                width\n              });\n            }\n            elementList.push(element);\n          }\n        } else if (node.nodeName === \"INPUT\" && node.type === ControlComponent.CHECKBOX) {\n          elementList.push({\n            type: ElementType.CHECKBOX,\n            value: \"\",\n            checkbox: {\n              value: node.checked\n            }\n          });\n        } else if (node.nodeName === \"INPUT\" && node.type === ControlComponent.RADIO) {\n          elementList.push({\n            type: ElementType.RADIO,\n            value: \"\",\n            radio: {\n              value: node.checked\n            }\n          });\n        } else {\n          findTextNode(node);\n          if (node.nodeType === 1 && n !== childNodes.length - 1) {\n            const display = window.getComputedStyle(node).display;\n            if (display === \"block\") {\n              elementList.push({\n                value: \"\\n\"\n              });\n            }\n          }\n        }\n      }\n    }\n  }\n  const clipboardDom = document.createElement(\"div\");\n  clipboardDom.innerHTML = htmlText;\n  document.body.appendChild(clipboardDom);\n  const deleteNodes = [];\n  clipboardDom.childNodes.forEach((child) => {\n    var _a;\n    if (child.nodeType !== 1 && !((_a = child.textContent) == null ? void 0 : _a.trim())) {\n      deleteNodes.push(child);\n    }\n  });\n  deleteNodes.forEach((node) => node.remove());\n  findTextNode(clipboardDom);\n  clipboardDom.remove();\n  return elementList;\n}\nfunction getTextFromElementList(elementList) {\n  function buildText(payload) {\n    var _a, _b, _c, _d, _e;\n    let text = \"\";\n    for (let e = 0; e < payload.length; e++) {\n      const element = payload[e];\n      if (element.type === ElementType.TABLE) {\n        text += `\n`;\n        const trList = element.trList;\n        for (let t = 0; t < trList.length; t++) {\n          const tr = trList[t];\n          for (let d = 0; d < tr.tdList.length; d++) {\n            const td = tr.tdList[d];\n            const tdText = buildText(zipElementList(td.value));\n            const isFirst = d === 0;\n            const isLast = tr.tdList.length - 1 === d;\n            text += `${!isFirst ? `  ` : ``}${tdText}${isLast ? `\n` : ``}`;\n          }\n        }\n      } else if (element.type === ElementType.TAB) {\n        text += `\t`;\n      } else if (element.type === ElementType.HYPERLINK) {\n        text += element.valueList.map((v) => v.value).join(\"\");\n      } else if (element.type === ElementType.TITLE) {\n        text += `${buildText(zipElementList(element.valueList))}`;\n      } else if (element.type === ElementType.LIST) {\n        const zipList = zipElementList(element.valueList);\n        const listElementListMap = splitListElement(zipList);\n        let ulListStyleText = \"\";\n        if (element.listType === ListType.UL) {\n          ulListStyleText = ulStyleMapping[element.listStyle];\n        }\n        listElementListMap.forEach((listElementList, listIndex) => {\n          const isLast = listElementListMap.size - 1 === listIndex;\n          text += `\n${ulListStyleText || `${listIndex + 1}.`}${buildText(listElementList)}${isLast ? `\n` : ``}`;\n        });\n      } else if (element.type === ElementType.CHECKBOX) {\n        text += ((_a = element.checkbox) == null ? void 0 : _a.value) ? `\\u2611` : `\\u25A1`;\n      } else if (element.type === ElementType.RADIO) {\n        text += ((_b = element.radio) == null ? void 0 : _b.value) ? `\\u2609` : `\\u25CB`;\n      } else if (!element.type || element.type === ElementType.LATEX || TEXTLIKE_ELEMENT_TYPE.includes(element.type)) {\n        let textLike = \"\";\n        if (element.type === ElementType.CONTROL) {\n          textLike = ((_d = (_c = element.control.value) == null ? void 0 : _c[0]) == null ? void 0 : _d.value) || \"\";\n        } else if (element.type === ElementType.DATE) {\n          textLike = ((_e = element.valueList) == null ? void 0 : _e.map((v) => v.value).join(\"\")) || \"\";\n        } else {\n          textLike = element.value;\n        }\n        text += textLike.replace(new RegExp(`${ZERO}`, \"g\"), \"\\n\");\n      }\n    }\n    return text;\n  }\n  return buildText(zipElementList(elementList));\n}\nfunction getSlimCloneElementList(elementList) {\n  return deepCloneOmitKeys(elementList, [\n    \"metrics\",\n    \"style\"\n  ]);\n}\nfunction getIsBlockElement(element) {\n  return !!(element == null ? void 0 : element.type) && (BLOCK_ELEMENT_TYPE.includes(element.type) || element.imgDisplay === ImageDisplay.INLINE);\n}\nfunction replaceHTMLElementTag(oldDom, tagName) {\n  const newDom = document.createElement(tagName);\n  for (let i = 0; i < oldDom.attributes.length; i++) {\n    const attr = oldDom.attributes[i];\n    newDom.setAttribute(attr.name, attr.value);\n  }\n  newDom.innerHTML = oldDom.innerHTML;\n  return newDom;\n}\nfunction pickSurroundElementList(elementList) {\n  const surroundElementList = [];\n  for (let e = 0; e < elementList.length; e++) {\n    const element = elementList[e];\n    if (element.imgDisplay === ImageDisplay.SURROUND) {\n      surroundElementList.push(element);\n    }\n  }\n  return surroundElementList;\n}\nfunction deleteSurroundElementList(elementList, pageNo) {\n  var _a;\n  for (let s = elementList.length - 1; s >= 0; s--) {\n    const surroundElement = elementList[s];\n    if (((_a = surroundElement.imgFloatPosition) == null ? void 0 : _a.pageNo) === pageNo) {\n      elementList.splice(s, 1);\n    }\n  }\n}\nfunction setClipboardData(data2) {\n  localStorage.setItem(EDITOR_CLIPBOARD, JSON.stringify({\n    text: data2.text,\n    elementList: data2.elementList\n  }));\n}\nfunction getClipboardData() {\n  const clipboardText = localStorage.getItem(EDITOR_CLIPBOARD);\n  return clipboardText ? JSON.parse(clipboardText) : null;\n}\nfunction removeClipboardData() {\n  localStorage.removeItem(EDITOR_CLIPBOARD);\n}\nfunction writeClipboardItem(text, html, elementList) {\n  if (!text && !html && !elementList.length)\n    return;\n  const plainText = new Blob([text], { type: \"text/plain\" });\n  const htmlText = new Blob([html], { type: \"text/html\" });\n  if (window.ClipboardItem) {\n    const item = new ClipboardItem({\n      [plainText.type]: plainText,\n      [htmlText.type]: htmlText\n    });\n    window.navigator.clipboard.write([item]);\n  } else {\n    const fakeElement = document.createElement(\"div\");\n    fakeElement.setAttribute(\"contenteditable\", \"true\");\n    fakeElement.innerHTML = html;\n    document.body.append(fakeElement);\n    const selection = window.getSelection();\n    const range = document.createRange();\n    const br = document.createElement(\"span\");\n    br.innerText = \"\\n\";\n    fakeElement.append(br);\n    range.selectNodeContents(fakeElement);\n    selection == null ? void 0 : selection.removeAllRanges();\n    selection == null ? void 0 : selection.addRange(range);\n    document.execCommand(\"copy\");\n    fakeElement.remove();\n  }\n  setClipboardData({ text, elementList });\n}\nfunction writeElementList(elementList, options) {\n  const clipboardDom = createDomFromElementList(elementList, options);\n  document.body.append(clipboardDom);\n  const text = clipboardDom.innerText;\n  clipboardDom.remove();\n  const html = clipboardDom.innerHTML;\n  if (!text && !html && !elementList.length)\n    return;\n  writeClipboardItem(text, html, zipElementList(elementList));\n}\nfunction getIsClipboardContainFile(clipboardData) {\n  let isFile = false;\n  for (let i = 0; i < clipboardData.items.length; i++) {\n    const item = clipboardData.items[i];\n    if (item.kind === \"file\") {\n      isFile = true;\n      break;\n    }\n  }\n  return isFile;\n}\nfunction pasteElement(host, elementList) {\n  const draw = host.getDraw();\n  if (draw.isReadonly() || draw.isDisabled())\n    return;\n  const rangeManager = draw.getRange();\n  const { startIndex } = rangeManager.getRange();\n  const originalElementList = draw.getElementList();\n  if (~startIndex && !rangeManager.getIsSelectAll()) {\n    const anchorElement = originalElementList[startIndex];\n    if ((anchorElement == null ? void 0 : anchorElement.titleId) || (anchorElement == null ? void 0 : anchorElement.listId)) {\n      let start = 0;\n      while (start < elementList.length) {\n        const pasteElement2 = elementList[start];\n        if (anchorElement.titleId && /^\\n/.test(pasteElement2.value)) {\n          break;\n        }\n        if (VIRTUAL_ELEMENT_TYPE.includes(pasteElement2.type)) {\n          elementList.splice(start, 1);\n          if (pasteElement2.valueList) {\n            for (let v = 0; v < pasteElement2.valueList.length; v++) {\n              const element = pasteElement2.valueList[v];\n              if (element.value === ZERO || element.value === \"\\n\") {\n                continue;\n              }\n              elementList.splice(start, 0, element);\n              start++;\n            }\n          }\n          start--;\n        }\n        start++;\n      }\n    }\n    formatElementContext(originalElementList, elementList, startIndex, {\n      isBreakWhenWrap: true,\n      editorOptions: draw.getOptions()\n    });\n  }\n  draw.insertElementList(elementList);\n}\nfunction pasteHTML(host, htmlText) {\n  const draw = host.getDraw();\n  if (draw.isReadonly() || draw.isDisabled())\n    return;\n  const elementList = getElementListByHTML(htmlText, {\n    innerWidth: draw.getOriginalInnerWidth()\n  });\n  pasteElement(host, elementList);\n}\nfunction pasteImage(host, file) {\n  const draw = host.getDraw();\n  if (draw.isReadonly() || draw.isDisabled())\n    return;\n  const rangeManager = draw.getRange();\n  const { startIndex } = rangeManager.getRange();\n  const elementList = draw.getElementList();\n  const fileReader = new FileReader();\n  fileReader.readAsDataURL(file);\n  fileReader.onload = () => {\n    const image = new Image();\n    const value = fileReader.result;\n    image.src = value;\n    image.onload = () => {\n      const imageElement = {\n        value,\n        type: ElementType.IMAGE,\n        width: image.width,\n        height: image.height\n      };\n      if (~startIndex) {\n        formatElementContext(elementList, [imageElement], startIndex, {\n          editorOptions: draw.getOptions()\n        });\n      }\n      draw.insertElementList([imageElement]);\n    };\n  };\n}\nfunction pasteByEvent(host, evt) {\n  const draw = host.getDraw();\n  if (draw.isReadonly() || draw.isDisabled())\n    return;\n  const clipboardData = evt.clipboardData;\n  if (!clipboardData)\n    return;\n  const { paste } = draw.getOverride();\n  if (paste) {\n    const overrideResult = paste(evt);\n    if ((overrideResult == null ? void 0 : overrideResult.preventDefault) !== false)\n      return;\n  }\n  if (!getIsClipboardContainFile(clipboardData)) {\n    const clipboardText = clipboardData.getData(\"text\");\n    const editorClipboardData = getClipboardData();\n    if (clipboardText === (editorClipboardData == null ? void 0 : editorClipboardData.text)) {\n      pasteElement(host, editorClipboardData.elementList);\n      return;\n    }\n  }\n  removeClipboardData();\n  let isHTML = false;\n  for (let i = 0; i < clipboardData.items.length; i++) {\n    const item = clipboardData.items[i];\n    if (item.type === \"text/html\") {\n      isHTML = true;\n      break;\n    }\n  }\n  for (let i = 0; i < clipboardData.items.length; i++) {\n    const item = clipboardData.items[i];\n    if (item.kind === \"string\") {\n      if (item.type === \"text/plain\" && !isHTML) {\n        item.getAsString((plainText) => {\n          host.input(plainText);\n        });\n        break;\n      }\n      if (item.type === \"text/html\" && isHTML) {\n        item.getAsString((htmlText) => {\n          pasteHTML(host, htmlText);\n        });\n        break;\n      }\n    } else if (item.kind === \"file\") {\n      if (item.type.includes(\"image\")) {\n        const file = item.getAsFile();\n        if (file) {\n          pasteImage(host, file);\n        }\n      }\n    }\n  }\n}\nasync function pasteByApi(host, options) {\n  const draw = host.getDraw();\n  if (draw.isReadonly() || draw.isDisabled())\n    return;\n  const { paste } = draw.getOverride();\n  if (paste) {\n    const overrideResult = paste();\n    if ((overrideResult == null ? void 0 : overrideResult.preventDefault) !== false)\n      return;\n  }\n  const clipboardText = await navigator.clipboard.readText();\n  const editorClipboardData = getClipboardData();\n  if (clipboardText === (editorClipboardData == null ? void 0 : editorClipboardData.text)) {\n    pasteElement(host, editorClipboardData.elementList);\n    return;\n  }\n  removeClipboardData();\n  if (options == null ? void 0 : options.isPlainText) {\n    if (clipboardText) {\n      host.input(clipboardText);\n    }\n  } else {\n    const clipboardData = await navigator.clipboard.read();\n    let isHTML = false;\n    for (const item of clipboardData) {\n      if (item.types.includes(\"text/html\")) {\n        isHTML = true;\n        break;\n      }\n    }\n    for (const item of clipboardData) {\n      if (item.types.includes(\"text/plain\") && !isHTML) {\n        const textBlob = await item.getType(\"text/plain\");\n        const text = await textBlob.text();\n        if (text) {\n          host.input(text);\n        }\n      } else if (item.types.includes(\"text/html\") && isHTML) {\n        const htmlTextBlob = await item.getType(\"text/html\");\n        const htmlText = await htmlTextBlob.text();\n        if (htmlText) {\n          pasteHTML(host, htmlText);\n        }\n      } else if (item.types.some((type) => type.startsWith(\"image/\"))) {\n        const type = item.types.find((type2) => type2.startsWith(\"image/\"));\n        const imageBlob = await item.getType(type);\n        pasteImage(host, imageBlob);\n      }\n    }\n  }\n}\nclass CursorAgent {\n  constructor(draw, canvasEvent) {\n    this.draw = draw;\n    this.container = draw.getContainer();\n    this.canvasEvent = canvasEvent;\n    const agentCursorDom = document.createElement(\"textarea\");\n    agentCursorDom.autocomplete = \"off\";\n    agentCursorDom.classList.add(`${EDITOR_PREFIX}-inputarea`);\n    agentCursorDom.innerText = \"\";\n    this.container.append(agentCursorDom);\n    this.agentCursorDom = agentCursorDom;\n    agentCursorDom.onkeydown = (evt) => this._keyDown(evt);\n    agentCursorDom.oninput = debounce(this._input.bind(this), 0);\n    agentCursorDom.onpaste = (evt) => this._paste(evt);\n    agentCursorDom.addEventListener(\"compositionstart\", this._compositionstart.bind(this));\n    agentCursorDom.addEventListener(\"compositionend\", this._compositionend.bind(this));\n  }\n  getAgentCursorDom() {\n    return this.agentCursorDom;\n  }\n  _keyDown(evt) {\n    this.canvasEvent.keydown(evt);\n  }\n  _input(evt) {\n    const data2 = evt.data;\n    if (!data2)\n      return;\n    this.canvasEvent.input(data2);\n  }\n  _paste(evt) {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    const clipboardData = evt.clipboardData;\n    if (!clipboardData)\n      return;\n    pasteByEvent(this.canvasEvent, evt);\n    evt.preventDefault();\n  }\n  _compositionstart() {\n    this.canvasEvent.compositionstart();\n  }\n  _compositionend(evt) {\n    this.canvasEvent.compositionend(evt);\n  }\n}\nclass Cursor {\n  constructor(draw, canvasEvent) {\n    this.ANIMATION_CLASS = `${EDITOR_PREFIX}-cursor--animation`;\n    this.draw = draw;\n    this.container = draw.getContainer();\n    this.position = draw.getPosition();\n    this.options = draw.getOptions();\n    this.cursorDom = document.createElement(\"div\");\n    this.cursorDom.classList.add(`${EDITOR_PREFIX}-cursor`);\n    this.container.append(this.cursorDom);\n    this.cursorAgent = new CursorAgent(draw, canvasEvent);\n    this.blinkTimeout = null;\n  }\n  getCursorDom() {\n    return this.cursorDom;\n  }\n  getAgentDom() {\n    return this.cursorAgent.getAgentCursorDom();\n  }\n  getAgentIsActive() {\n    return this.getAgentDom() === document.activeElement;\n  }\n  getAgentDomValue() {\n    return this.getAgentDom().value;\n  }\n  clearAgentDomValue() {\n    this.getAgentDom().value = \"\";\n  }\n  _blinkStart() {\n    this.cursorDom.classList.add(this.ANIMATION_CLASS);\n  }\n  _blinkStop() {\n    this.cursorDom.classList.remove(this.ANIMATION_CLASS);\n  }\n  _setBlinkTimeout() {\n    this._clearBlinkTimeout();\n    this.blinkTimeout = window.setTimeout(() => {\n      this._blinkStart();\n    }, 500);\n  }\n  _clearBlinkTimeout() {\n    if (this.blinkTimeout) {\n      this._blinkStop();\n      window.clearTimeout(this.blinkTimeout);\n      this.blinkTimeout = null;\n    }\n  }\n  drawCursor(payload) {\n    let cursorPosition = this.position.getCursorPosition();\n    if (!cursorPosition)\n      return;\n    const { scale, cursor } = this.options;\n    const { color, width, isShow = true, isBlink = true, isFocus = true, hitLineStartIndex } = { ...cursor, ...payload };\n    const height = this.draw.getHeight();\n    const pageGap = this.draw.getPageGap();\n    if (hitLineStartIndex) {\n      const positionList = this.position.getPositionList();\n      cursorPosition = positionList[hitLineStartIndex];\n    }\n    const { metrics, coordinate: { leftTop, rightTop }, ascent, pageNo } = cursorPosition;\n    const zoneManager = this.draw.getZone();\n    const curPageNo = zoneManager.isMainActive() ? pageNo : this.draw.getPageNo();\n    const preY = curPageNo * (height + pageGap);\n    const defaultOffsetHeight = CURSOR_AGENT_OFFSET_HEIGHT * scale;\n    const increaseHeight = Math.min(metrics.height / 4, defaultOffsetHeight);\n    const cursorHeight = metrics.height + increaseHeight * 2;\n    const agentCursorDom = this.cursorAgent.getAgentCursorDom();\n    if (isFocus) {\n      setTimeout(() => {\n        if (document.activeElement !== agentCursorDom) {\n          agentCursorDom.focus();\n          agentCursorDom.setSelectionRange(0, 0);\n        }\n      });\n    }\n    const descent = metrics.boundingBoxDescent < 0 ? 0 : metrics.boundingBoxDescent;\n    const cursorTop = leftTop[1] + ascent + descent - (cursorHeight - increaseHeight) + preY;\n    const cursorLeft = hitLineStartIndex ? leftTop[0] : rightTop[0];\n    agentCursorDom.style.left = `${cursorLeft}px`;\n    agentCursorDom.style.top = `${cursorTop + cursorHeight - defaultOffsetHeight}px`;\n    if (!isShow) {\n      this.recoveryCursor();\n      return;\n    }\n    const isReadonly = this.draw.isReadonly();\n    this.cursorDom.style.width = `${width * scale}px`;\n    this.cursorDom.style.backgroundColor = color;\n    this.cursorDom.style.left = `${cursorLeft}px`;\n    this.cursorDom.style.top = `${cursorTop}px`;\n    this.cursorDom.style.display = isReadonly ? \"none\" : \"block\";\n    this.cursorDom.style.height = `${cursorHeight}px`;\n    if (isBlink) {\n      this._setBlinkTimeout();\n    } else {\n      this._clearBlinkTimeout();\n    }\n  }\n  recoveryCursor() {\n    this.cursorDom.style.display = \"none\";\n    this._clearBlinkTimeout();\n  }\n  moveCursorToVisible(payload) {\n    const { cursorPosition, direction } = payload;\n    if (!cursorPosition || !direction)\n      return;\n    const { pageNo, coordinate: { leftTop, leftBottom } } = cursorPosition;\n    const prePageY = pageNo * (this.draw.getHeight() + this.draw.getPageGap()) + this.container.getBoundingClientRect().top;\n    const isUp = direction === MoveDirection.UP;\n    const x = leftBottom[0];\n    const y = isUp ? leftTop[1] + prePageY : leftBottom[1] + prePageY;\n    const scrollContainer = findScrollContainer(this.container);\n    const rect = {\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0\n    };\n    if (scrollContainer === document.documentElement) {\n      rect.right = window.innerWidth;\n      rect.bottom = window.innerHeight;\n    } else {\n      const { left: left2, right: right2, top, bottom } = scrollContainer.getBoundingClientRect();\n      rect.left = left2;\n      rect.right = right2;\n      rect.top = top;\n      rect.bottom = bottom;\n    }\n    const { maskMargin } = this.options;\n    rect.top += maskMargin[0];\n    rect.bottom -= maskMargin[2];\n    if (!(x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom)) {\n      const { scrollLeft, scrollTop } = scrollContainer;\n      isUp ? scrollContainer.scroll(scrollLeft, scrollTop - (rect.top - y)) : scrollContainer.scroll(scrollLeft, scrollTop + y - rect.bottom);\n    }\n  }\n}\nvar MouseEventButton;\n(function(MouseEventButton2) {\n  MouseEventButton2[MouseEventButton2[\"LEFT\"] = 0] = \"LEFT\";\n  MouseEventButton2[MouseEventButton2[\"CENTER\"] = 1] = \"CENTER\";\n  MouseEventButton2[MouseEventButton2[\"RIGHT\"] = 2] = \"RIGHT\";\n})(MouseEventButton || (MouseEventButton = {}));\nconst isApple = typeof navigator !== \"undefined\" && /Mac OS X/.test(navigator.userAgent);\nconst isIOS = typeof navigator !== \"undefined\" && /iPad|iPhone/.test(navigator.userAgent);\nfunction isMod(evt) {\n  return isApple ? evt.metaKey : evt.ctrlKey;\n}\nvar KeyMap;\n(function(KeyMap2) {\n  KeyMap2[\"Delete\"] = \"Delete\";\n  KeyMap2[\"Backspace\"] = \"Backspace\";\n  KeyMap2[\"Enter\"] = \"Enter\";\n  KeyMap2[\"Left\"] = \"ArrowLeft\";\n  KeyMap2[\"Right\"] = \"ArrowRight\";\n  KeyMap2[\"Up\"] = \"ArrowUp\";\n  KeyMap2[\"Down\"] = \"ArrowDown\";\n  KeyMap2[\"ESC\"] = \"Escape\";\n  KeyMap2[\"TAB\"] = \"Tab\";\n  KeyMap2[\"META\"] = \"Meta\";\n  KeyMap2[\"LEFT_BRACKET\"] = \"[\";\n  KeyMap2[\"RIGHT_BRACKET\"] = \"]\";\n  KeyMap2[\"COMMA\"] = \",\";\n  KeyMap2[\"PERIOD\"] = \".\";\n  KeyMap2[\"LEFT_ANGLE_BRACKET\"] = \"<\";\n  KeyMap2[\"RIGHT_ANGLE_BRACKET\"] = \">\";\n  KeyMap2[\"EQUAL\"] = \"=\";\n  KeyMap2[\"MINUS\"] = \"-\";\n  KeyMap2[\"PLUS\"] = \"+\";\n  KeyMap2[\"A\"] = \"a\";\n  KeyMap2[\"B\"] = \"b\";\n  KeyMap2[\"C\"] = \"c\";\n  KeyMap2[\"D\"] = \"d\";\n  KeyMap2[\"E\"] = \"e\";\n  KeyMap2[\"F\"] = \"f\";\n  KeyMap2[\"G\"] = \"g\";\n  KeyMap2[\"H\"] = \"h\";\n  KeyMap2[\"I\"] = \"i\";\n  KeyMap2[\"J\"] = \"j\";\n  KeyMap2[\"K\"] = \"k\";\n  KeyMap2[\"L\"] = \"l\";\n  KeyMap2[\"M\"] = \"m\";\n  KeyMap2[\"N\"] = \"n\";\n  KeyMap2[\"O\"] = \"o\";\n  KeyMap2[\"P\"] = \"p\";\n  KeyMap2[\"Q\"] = \"q\";\n  KeyMap2[\"R\"] = \"r\";\n  KeyMap2[\"S\"] = \"s\";\n  KeyMap2[\"T\"] = \"t\";\n  KeyMap2[\"U\"] = \"u\";\n  KeyMap2[\"V\"] = \"v\";\n  KeyMap2[\"W\"] = \"w\";\n  KeyMap2[\"X\"] = \"x\";\n  KeyMap2[\"Y\"] = \"y\";\n  KeyMap2[\"Z\"] = \"z\";\n  KeyMap2[\"A_UPPERCASE\"] = \"A\";\n  KeyMap2[\"B_UPPERCASE\"] = \"B\";\n  KeyMap2[\"C_UPPERCASE\"] = \"C\";\n  KeyMap2[\"D_UPPERCASE\"] = \"D\";\n  KeyMap2[\"E_UPPERCASE\"] = \"E\";\n  KeyMap2[\"F_UPPERCASE\"] = \"F\";\n  KeyMap2[\"G_UPPERCASE\"] = \"G\";\n  KeyMap2[\"H_UPPERCASE\"] = \"H\";\n  KeyMap2[\"I_UPPERCASE\"] = \"I\";\n  KeyMap2[\"J_UPPERCASE\"] = \"J\";\n  KeyMap2[\"K_UPPERCASE\"] = \"K\";\n  KeyMap2[\"L_UPPERCASE\"] = \"L\";\n  KeyMap2[\"M_UPPERCASE\"] = \"M\";\n  KeyMap2[\"N_UPPERCASE\"] = \"N\";\n  KeyMap2[\"O_UPPERCASE\"] = \"O\";\n  KeyMap2[\"P_UPPERCASE\"] = \"P\";\n  KeyMap2[\"Q_UPPERCASE\"] = \"Q\";\n  KeyMap2[\"R_UPPERCASE\"] = \"R\";\n  KeyMap2[\"S_UPPERCASE\"] = \"S\";\n  KeyMap2[\"T_UPPERCASE\"] = \"T\";\n  KeyMap2[\"U_UPPERCASE\"] = \"U\";\n  KeyMap2[\"V_UPPERCASE\"] = \"V\";\n  KeyMap2[\"W_UPPERCASE\"] = \"W\";\n  KeyMap2[\"X_UPPERCASE\"] = \"X\";\n  KeyMap2[\"Y_UPPERCASE\"] = \"Y\";\n  KeyMap2[\"Z_UPPERCASE\"] = \"Z\";\n  KeyMap2[\"ZERO\"] = \"0\";\n  KeyMap2[\"ONE\"] = \"1\";\n  KeyMap2[\"TWO\"] = \"2\";\n  KeyMap2[\"THREE\"] = \"3\";\n  KeyMap2[\"FOUR\"] = \"4\";\n  KeyMap2[\"FIVE\"] = \"5\";\n  KeyMap2[\"SIX\"] = \"6\";\n  KeyMap2[\"SEVEN\"] = \"7\";\n  KeyMap2[\"EIGHT\"] = \"8\";\n  KeyMap2[\"NINE\"] = \"9\";\n})(KeyMap || (KeyMap = {}));\nclass CheckboxControl {\n  constructor(element, control) {\n    this.element = element;\n    this.control = control;\n  }\n  setElement(element) {\n    this.element = element;\n  }\n  getElement() {\n    return this.element;\n  }\n  getCode() {\n    var _a;\n    return ((_a = this.element.control) == null ? void 0 : _a.code) || null;\n  }\n  getValue() {\n    const elementList = this.control.getElementList();\n    const { startIndex } = this.control.getRange();\n    const startElement = elementList[startIndex];\n    const data2 = [];\n    let preIndex = startIndex;\n    while (preIndex > 0) {\n      const preElement = elementList[preIndex];\n      if (preElement.controlId !== startElement.controlId || preElement.controlComponent === ControlComponent.PREFIX) {\n        break;\n      }\n      if (preElement.controlComponent === ControlComponent.VALUE) {\n        data2.unshift(preElement);\n      }\n      preIndex--;\n    }\n    let nextIndex = startIndex + 1;\n    while (nextIndex < elementList.length) {\n      const nextElement = elementList[nextIndex];\n      if (nextElement.controlId !== startElement.controlId || nextElement.controlComponent === ControlComponent.POSTFIX) {\n        break;\n      }\n      if (nextElement.controlComponent === ControlComponent.VALUE) {\n        data2.push(nextElement);\n      }\n      nextIndex++;\n    }\n    return data2;\n  }\n  setValue() {\n    return -1;\n  }\n  setSelect(codes, context = {}, options = {}) {\n    if (!options.isIgnoreDisabledRule && this.control.getIsDisabledControl(context)) {\n      return;\n    }\n    const { control } = this.element;\n    const elementList = context.elementList || this.control.getElementList();\n    const { startIndex } = context.range || this.control.getRange();\n    const startElement = elementList[startIndex];\n    let preIndex = startIndex;\n    while (preIndex > 0) {\n      const preElement = elementList[preIndex];\n      if (preElement.controlId !== startElement.controlId || preElement.controlComponent === ControlComponent.PREFIX) {\n        break;\n      }\n      if (preElement.controlComponent === ControlComponent.CHECKBOX) {\n        const checkbox = preElement.checkbox;\n        checkbox.value = codes.includes(checkbox.code);\n      }\n      preIndex--;\n    }\n    let nextIndex = startIndex + 1;\n    while (nextIndex < elementList.length) {\n      const nextElement = elementList[nextIndex];\n      if (nextElement.controlId !== startElement.controlId || nextElement.controlComponent === ControlComponent.POSTFIX) {\n        break;\n      }\n      if (nextElement.controlComponent === ControlComponent.CHECKBOX) {\n        const checkbox = nextElement.checkbox;\n        checkbox.value = codes.includes(checkbox.code);\n      }\n      nextIndex++;\n    }\n    control.code = codes.join(\",\");\n    this.control.repaintControl({\n      curIndex: startIndex,\n      isSetCursor: false\n    });\n  }\n  keydown(evt) {\n    if (this.control.getIsDisabledControl()) {\n      return null;\n    }\n    const range = this.control.getRange();\n    this.control.shrinkBoundary();\n    const { startIndex, endIndex } = range;\n    if (evt.key === KeyMap.Backspace || evt.key === KeyMap.Delete) {\n      return this.control.removeControl(startIndex);\n    }\n    return endIndex;\n  }\n  cut() {\n    return -1;\n  }\n}\nclass RadioControl extends CheckboxControl {\n  setSelect(codes, context = {}, options = {}) {\n    if (!options.isIgnoreDisabledRule && this.control.getIsDisabledControl(context)) {\n      return;\n    }\n    const { control } = this.element;\n    const elementList = context.elementList || this.control.getElementList();\n    const { startIndex } = context.range || this.control.getRange();\n    const startElement = elementList[startIndex];\n    let preIndex = startIndex;\n    while (preIndex > 0) {\n      const preElement = elementList[preIndex];\n      if (preElement.controlId !== startElement.controlId || preElement.controlComponent === ControlComponent.PREFIX) {\n        break;\n      }\n      if (preElement.controlComponent === ControlComponent.RADIO) {\n        const radio = preElement.radio;\n        radio.value = codes.includes(radio.code);\n      }\n      preIndex--;\n    }\n    let nextIndex = startIndex + 1;\n    while (nextIndex < elementList.length) {\n      const nextElement = elementList[nextIndex];\n      if (nextElement.controlId !== startElement.controlId || nextElement.controlComponent === ControlComponent.POSTFIX) {\n        break;\n      }\n      if (nextElement.controlComponent === ControlComponent.RADIO) {\n        const radio = nextElement.radio;\n        radio.value = codes.includes(radio.code);\n      }\n      nextIndex++;\n    }\n    control.code = codes.join(\",\");\n    this.control.repaintControl({\n      curIndex: startIndex,\n      isSetCursor: false\n    });\n  }\n}\nfunction setRangeCache(host) {\n  const draw = host.getDraw();\n  const position = draw.getPosition();\n  const rangeManager = draw.getRange();\n  host.isAllowDrag = true;\n  host.cacheRange = deepClone(rangeManager.getRange());\n  host.cacheElementList = draw.getElementList();\n  host.cachePositionList = position.getPositionList();\n  host.cachePositionContext = position.getPositionContext();\n}\nfunction hitCheckbox(element, draw) {\n  const { checkbox, control } = element;\n  if (!control) {\n    draw.getCheckboxParticle().setSelect(element);\n  } else {\n    const codes = (control == null ? void 0 : control.code) ? control.code.split(\",\") : [];\n    if (checkbox == null ? void 0 : checkbox.value) {\n      const codeIndex = codes.findIndex((c) => c === checkbox.code);\n      codes.splice(codeIndex, 1);\n    } else {\n      if (checkbox == null ? void 0 : checkbox.code) {\n        codes.push(checkbox.code);\n      }\n    }\n    const activeControl = draw.getControl().getActiveControl();\n    if (activeControl instanceof CheckboxControl) {\n      activeControl.setSelect(codes);\n    }\n  }\n}\nfunction hitRadio(element, draw) {\n  const { radio, control } = element;\n  if (!control) {\n    draw.getRadioParticle().setSelect(element);\n  } else {\n    const codes = (radio == null ? void 0 : radio.code) ? [radio.code] : [];\n    const activeControl = draw.getControl().getActiveControl();\n    if (activeControl instanceof RadioControl) {\n      activeControl.setSelect(codes);\n    }\n  }\n}\nfunction mousedown(evt, host) {\n  var _a, _b;\n  if (evt.button === MouseEventButton.RIGHT)\n    return;\n  const draw = host.getDraw();\n  const isReadonly = draw.isReadonly();\n  const rangeManager = draw.getRange();\n  const position = draw.getPosition();\n  if (!host.isAllowDrag) {\n    const range = rangeManager.getRange();\n    if (!isReadonly && range.startIndex !== range.endIndex) {\n      const isPointInRange = rangeManager.getIsPointInRange(evt.offsetX, evt.offsetY);\n      if (isPointInRange) {\n        setRangeCache(host);\n        return;\n      }\n    }\n  }\n  const target = evt.target;\n  const pageIndex = target.dataset.index;\n  if (pageIndex) {\n    draw.setPageNo(Number(pageIndex));\n  }\n  host.isAllowSelection = true;\n  const oldPositionContext = deepClone(position.getPositionContext());\n  const positionResult = position.adjustPositionContext({\n    x: evt.offsetX,\n    y: evt.offsetY\n  });\n  if (!positionResult)\n    return;\n  const { index: index2, isDirectHit, isCheckbox, isRadio, isImage, isTable, tdValueIndex, hitLineStartIndex } = positionResult;\n  host.mouseDownStartPosition = {\n    ...positionResult,\n    index: isTable ? tdValueIndex : index2,\n    x: evt.offsetX,\n    y: evt.offsetY\n  };\n  const elementList = draw.getElementList();\n  const positionList = position.getPositionList();\n  const curIndex = isTable ? tdValueIndex : index2;\n  const curElement = elementList[curIndex];\n  const isDirectHitImage = !!(isDirectHit && isImage);\n  const isDirectHitCheckbox = !!(isDirectHit && isCheckbox);\n  const isDirectHitRadio = !!(isDirectHit && isRadio);\n  if (~index2) {\n    let startIndex = curIndex;\n    let endIndex = curIndex;\n    if (evt.shiftKey) {\n      const { startIndex: oldStartIndex } = rangeManager.getRange();\n      if (~oldStartIndex) {\n        const newPositionContext = position.getPositionContext();\n        if (newPositionContext.tdId === oldPositionContext.tdId) {\n          if (curIndex > oldStartIndex) {\n            startIndex = oldStartIndex;\n          } else {\n            endIndex = oldStartIndex;\n          }\n        }\n      }\n    }\n    rangeManager.setRange(startIndex, endIndex);\n    position.setCursorPosition(positionList[curIndex]);\n    if (isDirectHitCheckbox && !isReadonly) {\n      hitCheckbox(curElement, draw);\n    } else if (isDirectHitRadio && !isReadonly) {\n      hitRadio(curElement, draw);\n    } else if (curElement.controlComponent === ControlComponent.VALUE && (((_a = curElement.control) == null ? void 0 : _a.type) === ControlType.CHECKBOX || ((_b = curElement.control) == null ? void 0 : _b.type) === ControlType.RADIO)) {\n      let preIndex = curIndex;\n      while (preIndex > 0) {\n        const preElement = elementList[preIndex];\n        if (preElement.controlComponent === ControlComponent.CHECKBOX) {\n          hitCheckbox(preElement, draw);\n          break;\n        } else if (preElement.controlComponent === ControlComponent.RADIO) {\n          hitRadio(preElement, draw);\n          break;\n        }\n        preIndex--;\n      }\n    } else {\n      draw.render({\n        curIndex,\n        isCompute: false,\n        isSubmitHistory: false,\n        isSetCursor: !isDirectHitImage && !isDirectHitCheckbox && !isDirectHitRadio\n      });\n    }\n    if (hitLineStartIndex) {\n      host.getDraw().getCursor().drawCursor({\n        hitLineStartIndex\n      });\n    }\n  }\n  const previewer = draw.getPreviewer();\n  previewer.clearResizer();\n  if (isDirectHitImage) {\n    const previewerDrawOption = {\n      dragDisable: isReadonly || !curElement.controlId && draw.getMode() === EditorMode.FORM\n    };\n    if (curElement.type === ElementType.LATEX) {\n      previewerDrawOption.mime = \"svg\";\n      previewerDrawOption.srcKey = \"laTexSVG\";\n    }\n    previewer.drawResizer(curElement, positionList[curIndex], previewerDrawOption);\n    draw.getCursor().drawCursor({\n      isShow: false\n    });\n    setRangeCache(host);\n    if (curElement.imgDisplay === ImageDisplay.SURROUND || curElement.imgDisplay === ImageDisplay.FLOAT_TOP || curElement.imgDisplay === ImageDisplay.FLOAT_BOTTOM) {\n      draw.getImageParticle().createFloatImage(curElement);\n    }\n  }\n  const tableTool = draw.getTableTool();\n  tableTool.dispose();\n  if (isTable && !isReadonly && draw.getMode() !== EditorMode.FORM) {\n    tableTool.render();\n  }\n  const hyperlinkParticle = draw.getHyperlinkParticle();\n  hyperlinkParticle.clearHyperlinkPopup();\n  if (curElement.type === ElementType.HYPERLINK) {\n    if (isMod(evt)) {\n      hyperlinkParticle.openHyperlink(curElement);\n    } else {\n      hyperlinkParticle.drawHyperlinkPopup(curElement, positionList[curIndex]);\n    }\n  }\n  const dateParticle = draw.getDateParticle();\n  dateParticle.clearDatePicker();\n  if (curElement.type === ElementType.DATE && !isReadonly) {\n    dateParticle.renderDatePicker(curElement, positionList[curIndex]);\n  }\n}\nfunction createDragId(element) {\n  const dragId = getUUID();\n  Reflect.set(element, \"dragId\", dragId);\n  return dragId;\n}\nfunction getElementIndexByDragId(dragId, elementList) {\n  return elementList.findIndex((el) => el.dragId === dragId);\n}\nfunction moveImgPosition(element, evt, host) {\n  const draw = host.getDraw();\n  if (element.imgDisplay === ImageDisplay.SURROUND || element.imgDisplay === ImageDisplay.FLOAT_TOP || element.imgDisplay === ImageDisplay.FLOAT_BOTTOM) {\n    const moveX = evt.offsetX - host.mouseDownStartPosition.x;\n    const moveY = evt.offsetY - host.mouseDownStartPosition.y;\n    const imgFloatPosition = element.imgFloatPosition;\n    element.imgFloatPosition = {\n      x: imgFloatPosition.x + moveX,\n      y: imgFloatPosition.y + moveY,\n      pageNo: draw.getPageNo()\n    };\n  }\n  draw.getImageParticle().destroyFloatImage();\n}\nfunction mouseup(evt, host) {\n  var _a, _b, _c, _d;\n  if (host.isAllowDrop) {\n    const draw = host.getDraw();\n    if (draw.isReadonly() || draw.isDisabled()) {\n      host.mousedown(evt);\n      return;\n    }\n    const position = draw.getPosition();\n    const positionList = position.getPositionList();\n    const positionContext = position.getPositionContext();\n    const rangeManager = draw.getRange();\n    const cacheRange = host.cacheRange;\n    const cacheElementList = host.cacheElementList;\n    const cachePositionList = host.cachePositionList;\n    const range = rangeManager.getRange();\n    const isCacheRangeCollapsed = cacheRange.startIndex === cacheRange.endIndex;\n    const cacheStartIndex = isCacheRangeCollapsed ? cacheRange.startIndex - 1 : cacheRange.startIndex;\n    const cacheEndIndex = cacheRange.endIndex;\n    if (range.startIndex >= cacheStartIndex && range.endIndex <= cacheEndIndex && ((_a = host.cachePositionContext) == null ? void 0 : _a.tdId) === positionContext.tdId) {\n      draw.clearSideEffect();\n      let isSubmitHistory = false;\n      let isCompute = false;\n      if (isCacheRangeCollapsed) {\n        const dragElement = cacheElementList[cacheEndIndex];\n        if (dragElement.type === ElementType.IMAGE || dragElement.type === ElementType.LATEX) {\n          moveImgPosition(dragElement, evt, host);\n          if (dragElement.imgDisplay === ImageDisplay.SURROUND || dragElement.imgDisplay === ImageDisplay.FLOAT_TOP || dragElement.imgDisplay === ImageDisplay.FLOAT_BOTTOM) {\n            draw.getPreviewer().drawResizer(dragElement);\n            isSubmitHistory = true;\n          } else {\n            const cachePosition = cachePositionList[cacheEndIndex];\n            draw.getPreviewer().drawResizer(dragElement, cachePosition);\n          }\n          isCompute = dragElement.imgDisplay === ImageDisplay.SURROUND;\n        }\n      }\n      rangeManager.replaceRange({\n        ...cacheRange\n      });\n      draw.render({\n        isCompute,\n        isSubmitHistory,\n        isSetCursor: false\n      });\n      return;\n    }\n    const dragElementList = cacheElementList.slice(cacheStartIndex + 1, cacheEndIndex + 1);\n    const isContainControl = dragElementList.find((element) => element.controlId);\n    if (isContainControl) {\n      const cacheStartElement2 = cacheElementList[cacheStartIndex + 1];\n      const cacheEndElement2 = cacheElementList[cacheEndIndex];\n      const isAllowDragControl = (!cacheStartElement2.controlId || cacheStartElement2.controlComponent === ControlComponent.PREFIX) && (!cacheEndElement2.controlId || cacheEndElement2.controlComponent === ControlComponent.POSTFIX) || cacheStartElement2.controlId === cacheEndElement2.controlId && cacheStartElement2.controlComponent === ControlComponent.PREFIX && cacheEndElement2.controlComponent === ControlComponent.POSTFIX || ((_b = cacheStartElement2.control) == null ? void 0 : _b.type) === ControlType.TEXT && cacheStartElement2.controlComponent === ControlComponent.VALUE && ((_c = cacheEndElement2.control) == null ? void 0 : _c.type) === ControlType.TEXT && cacheEndElement2.controlComponent === ControlComponent.VALUE;\n      if (!isAllowDragControl) {\n        draw.render({\n          curIndex: range.startIndex,\n          isCompute: false,\n          isSubmitHistory: false\n        });\n        return;\n      }\n    }\n    const control = draw.getControl();\n    const elementList = draw.getElementList();\n    const isOmitControlAttr = !isContainControl || !!elementList[range.startIndex].controlId || !control.getIsElementListContainFullControl(dragElementList);\n    const editorOptions = draw.getOptions();\n    const replaceElementList = dragElementList.map((el) => {\n      if (!el.type || el.type === ElementType.TEXT) {\n        const newElement = {\n          value: el.value\n        };\n        const copyAttr = EDITOR_ELEMENT_STYLE_ATTR;\n        if (!isOmitControlAttr) {\n          copyAttr.push(...CONTROL_CONTEXT_ATTR);\n        }\n        copyAttr.forEach((attr) => {\n          const value = el[attr];\n          if (value !== void 0) {\n            newElement[attr] = value;\n          }\n        });\n        return newElement;\n      } else {\n        let newElement = deepClone(el);\n        if (isOmitControlAttr) {\n          newElement = omitObject(newElement, CONTROL_CONTEXT_ATTR);\n        }\n        formatElementList([newElement], {\n          isHandleFirstElement: false,\n          editorOptions\n        });\n        return newElement;\n      }\n    });\n    formatElementContext(elementList, replaceElementList, range.startIndex, {\n      editorOptions: draw.getOptions()\n    });\n    const cacheStartElement = cacheElementList[cacheStartIndex];\n    const cacheStartPosition = cachePositionList[cacheStartIndex];\n    const cacheRangeStartId = createDragId(cacheElementList[cacheStartIndex]);\n    const cacheRangeEndId = createDragId(cacheElementList[cacheEndIndex]);\n    const replaceLength = replaceElementList.length;\n    let rangeStart = range.startIndex;\n    let rangeEnd = rangeStart + replaceLength;\n    const activeControl = control.getActiveControl();\n    if (activeControl && cacheElementList[rangeStart].controlComponent !== ControlComponent.POSTFIX) {\n      rangeEnd = activeControl.setValue(replaceElementList);\n      rangeStart = rangeEnd - replaceLength;\n    } else {\n      draw.spliceElementList(elementList, rangeStart + 1, 0, ...replaceElementList);\n    }\n    if (!~rangeEnd) {\n      draw.render({\n        isSetCursor: false\n      });\n      return;\n    }\n    const rangeStartId = createDragId(elementList[rangeStart]);\n    const rangeEndId = createDragId(elementList[rangeEnd]);\n    const cacheRangeStartIndex = getElementIndexByDragId(cacheRangeStartId, cacheElementList);\n    const cacheRangeEndIndex = getElementIndexByDragId(cacheRangeEndId, cacheElementList);\n    const cacheEndElement = cacheElementList[cacheRangeEndIndex];\n    if (cacheEndElement.controlId && cacheEndElement.controlComponent !== ControlComponent.POSTFIX) {\n      rangeManager.replaceRange({\n        ...cacheRange,\n        startIndex: cacheRangeStartIndex,\n        endIndex: cacheRangeEndIndex\n      });\n      (_d = control.getActiveControl()) == null ? void 0 : _d.cut();\n    } else {\n      draw.spliceElementList(cacheElementList, cacheRangeStartIndex + 1, cacheRangeEndIndex - cacheRangeStartIndex);\n    }\n    const startElement = elementList[range.startIndex];\n    const startPosition = positionList[range.startIndex];\n    let positionContextIndex = positionContext.index;\n    if (positionContextIndex) {\n      if (startElement.tableId && !cacheStartElement.tableId) {\n        if (cacheStartPosition.index < positionContextIndex) {\n          positionContextIndex -= replaceLength;\n        }\n      } else if (!startElement.tableId && cacheStartElement.tableId) {\n        if (startPosition.index < positionContextIndex) {\n          positionContextIndex += replaceLength;\n        }\n      }\n      position.setPositionContext({\n        ...positionContext,\n        index: positionContextIndex\n      });\n    }\n    const rangeStartIndex = getElementIndexByDragId(rangeStartId, elementList);\n    const rangeEndIndex = getElementIndexByDragId(rangeEndId, elementList);\n    rangeManager.setRange(isCacheRangeCollapsed ? rangeEndIndex : rangeStartIndex, rangeEndIndex, range.tableId, range.startTdIndex, range.endTdIndex, range.startTrIndex, range.endTrIndex);\n    draw.clearSideEffect();\n    let imgElement = null;\n    if (isCacheRangeCollapsed) {\n      const elementList2 = draw.getElementList();\n      const dragElement = elementList2[rangeEndIndex];\n      if (dragElement.type === ElementType.IMAGE || dragElement.type === ElementType.LATEX) {\n        moveImgPosition(dragElement, evt, host);\n        imgElement = dragElement;\n      }\n    }\n    draw.render({\n      isSetCursor: false\n    });\n    if (imgElement) {\n      if (imgElement.imgDisplay === ImageDisplay.SURROUND || imgElement.imgDisplay === ImageDisplay.FLOAT_TOP || imgElement.imgDisplay === ImageDisplay.FLOAT_BOTTOM) {\n        draw.getPreviewer().drawResizer(imgElement);\n      } else {\n        const dragPositionList = position.getPositionList();\n        const dragPosition = dragPositionList[rangeEndIndex];\n        draw.getPreviewer().drawResizer(imgElement, dragPosition);\n      }\n    }\n  } else if (host.isAllowDrag) {\n    host.mousedown(evt);\n  }\n}\nfunction mouseleave(evt, host) {\n  const draw = host.getDraw();\n  const pageContainer = draw.getPageContainer();\n  const { x, y, width, height } = pageContainer.getBoundingClientRect();\n  if (evt.x >= x && evt.x <= x + width && evt.y >= y && evt.y <= y + height) {\n    return;\n  }\n  host.setIsAllowSelection(false);\n}\nfunction mousemove(evt, host) {\n  var _a;\n  const draw = host.getDraw();\n  if (host.isAllowDrag) {\n    const x = evt.offsetX;\n    const y = evt.offsetY;\n    const { startIndex: startIndex2, endIndex: endIndex2 } = host.cacheRange;\n    const positionList = host.cachePositionList;\n    for (let p = startIndex2 + 1; p <= endIndex2; p++) {\n      const { coordinate: { leftTop, rightBottom } } = positionList[p];\n      if (x >= leftTop[0] && x <= rightBottom[0] && y >= leftTop[1] && y <= rightBottom[1]) {\n        return;\n      }\n    }\n    const cacheStartIndex = (_a = host.cacheRange) == null ? void 0 : _a.startIndex;\n    if (cacheStartIndex) {\n      const dragElement = host.cacheElementList[cacheStartIndex];\n      if ((dragElement == null ? void 0 : dragElement.type) === ElementType.IMAGE && (dragElement.imgDisplay === ImageDisplay.SURROUND || dragElement.imgDisplay === ImageDisplay.FLOAT_TOP || dragElement.imgDisplay === ImageDisplay.FLOAT_BOTTOM)) {\n        draw.getPreviewer().clearResizer();\n        draw.getImageParticle().dragFloatImage(evt.movementX, evt.movementY);\n      }\n    }\n    host.dragover(evt);\n    host.isAllowDrop = true;\n    return;\n  }\n  if (!host.isAllowSelection || !host.mouseDownStartPosition)\n    return;\n  const target = evt.target;\n  const pageIndex = target.dataset.index;\n  if (pageIndex) {\n    draw.setPageNo(Number(pageIndex));\n  }\n  const position = draw.getPosition();\n  const positionResult = position.getPositionByXY({\n    x: evt.offsetX,\n    y: evt.offsetY\n  });\n  if (!~positionResult.index)\n    return;\n  const { index: index2, isTable, tdValueIndex, tdIndex, trIndex, tableId } = positionResult;\n  const { index: startIndex, isTable: startIsTable, tdIndex: startTdIndex, trIndex: startTrIndex, tableId: startTableId } = host.mouseDownStartPosition;\n  const endIndex = isTable ? tdValueIndex : index2;\n  const rangeManager = draw.getRange();\n  if (isTable && startIsTable && (tdIndex !== startTdIndex || trIndex !== startTrIndex)) {\n    rangeManager.setRange(endIndex, endIndex, tableId, startTdIndex, tdIndex, startTrIndex, trIndex);\n  } else {\n    let end = ~endIndex ? endIndex : 0;\n    if ((startIsTable || isTable) && startTableId !== tableId)\n      return;\n    let start = startIndex;\n    if (start > end) {\n      [start, end] = [end, start];\n    }\n    if (start === end)\n      return;\n    const elementList = draw.getElementList();\n    const startElement = elementList[start + 1];\n    const endElement = elementList[end];\n    if ((startElement == null ? void 0 : startElement.controlComponent) === ControlComponent.PLACEHOLDER && (endElement == null ? void 0 : endElement.controlComponent) === ControlComponent.PLACEHOLDER && startElement.controlId === endElement.controlId) {\n      return;\n    }\n    rangeManager.setRange(start, end);\n  }\n  draw.render({\n    isSubmitHistory: false,\n    isSetCursor: false,\n    isCompute: false\n  });\n}\nfunction backspace(evt, host) {\n  const draw = host.getDraw();\n  if (draw.isReadonly())\n    return;\n  const rangeManager = draw.getRange();\n  if (!rangeManager.getIsCanInput())\n    return;\n  const { startIndex, endIndex, isCrossRowCol } = rangeManager.getRange();\n  const control = draw.getControl();\n  let curIndex;\n  if (isCrossRowCol) {\n    const rowCol = draw.getTableParticle().getRangeRowCol();\n    if (!rowCol)\n      return;\n    let isDeleted = false;\n    for (let r = 0; r < rowCol.length; r++) {\n      const row = rowCol[r];\n      for (let c = 0; c < row.length; c++) {\n        const col = row[c];\n        if (col.value.length > 1) {\n          draw.spliceElementList(col.value, 1, col.value.length - 1);\n          isDeleted = true;\n        }\n      }\n    }\n    curIndex = isDeleted ? 0 : null;\n  } else if (control.getActiveControl() && control.getIsRangeCanCaptureEvent()) {\n    curIndex = control.keydown(evt);\n  } else {\n    const position = draw.getPosition();\n    const cursorPosition = position.getCursorPosition();\n    if (!cursorPosition)\n      return;\n    const { index: index2 } = cursorPosition;\n    const isCollapsed = rangeManager.getIsCollapsed();\n    const elementList = draw.getElementList();\n    if (isCollapsed && index2 === 0) {\n      const firstElement = elementList[index2];\n      if (firstElement.value === ZERO) {\n        if (firstElement.listId) {\n          draw.getListParticle().unsetList();\n        }\n        evt.preventDefault();\n        return;\n      }\n    }\n    const startElement = elementList[startIndex];\n    if (isCollapsed && startElement.rowFlex && startElement.value === ZERO) {\n      const rowFlexElementList = rangeManager.getRangeRowElementList();\n      if (rowFlexElementList) {\n        const preElement = elementList[startIndex - 1];\n        rowFlexElementList.forEach((element) => {\n          element.rowFlex = preElement == null ? void 0 : preElement.rowFlex;\n        });\n      }\n    }\n    if (!isCollapsed) {\n      draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex);\n    } else {\n      draw.spliceElementList(elementList, index2, 1);\n    }\n    curIndex = isCollapsed ? index2 - 1 : startIndex;\n  }\n  draw.getGlobalEvent().setCanvasEventAbility();\n  if (curIndex === null) {\n    rangeManager.setRange(startIndex, startIndex);\n    draw.render({\n      curIndex: startIndex,\n      isSubmitHistory: false\n    });\n  } else {\n    rangeManager.setRange(curIndex, curIndex);\n    draw.render({\n      curIndex\n    });\n  }\n}\nfunction del(evt, host) {\n  var _a;\n  const draw = host.getDraw();\n  if (draw.isReadonly())\n    return;\n  const rangeManager = draw.getRange();\n  if (!rangeManager.getIsCanInput())\n    return;\n  const { startIndex, endIndex, isCrossRowCol } = rangeManager.getRange();\n  const elementList = draw.getElementList();\n  const control = draw.getControl();\n  let curIndex;\n  if (isCrossRowCol) {\n    const rowCol = draw.getTableParticle().getRangeRowCol();\n    if (!rowCol)\n      return;\n    let isDeleted = false;\n    for (let r = 0; r < rowCol.length; r++) {\n      const row = rowCol[r];\n      for (let c = 0; c < row.length; c++) {\n        const col = row[c];\n        if (col.value.length > 1) {\n          draw.spliceElementList(col.value, 1, col.value.length - 1);\n          isDeleted = true;\n        }\n      }\n    }\n    curIndex = isDeleted ? 0 : null;\n  } else if (control.getActiveControl() && control.getIsRangeWithinControl()) {\n    curIndex = control.keydown(evt);\n  } else if ((_a = elementList[endIndex + 1]) == null ? void 0 : _a.controlId) {\n    curIndex = control.removeControl(endIndex + 1);\n  } else {\n    const position = draw.getPosition();\n    const cursorPosition = position.getCursorPosition();\n    if (!cursorPosition)\n      return;\n    const { index: index2 } = cursorPosition;\n    const positionContext = position.getPositionContext();\n    if (positionContext.isDirectHit && positionContext.isImage) {\n      draw.spliceElementList(elementList, index2, 1);\n      curIndex = index2 - 1;\n    } else {\n      const isCollapsed = rangeManager.getIsCollapsed();\n      if (!isCollapsed) {\n        draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex);\n      } else {\n        if (!elementList[index2 + 1])\n          return;\n        draw.spliceElementList(elementList, index2 + 1, 1);\n      }\n      curIndex = isCollapsed ? index2 : startIndex;\n    }\n  }\n  draw.getGlobalEvent().setCanvasEventAbility();\n  if (curIndex === null) {\n    rangeManager.setRange(startIndex, startIndex);\n    draw.render({\n      curIndex: startIndex,\n      isSubmitHistory: false\n    });\n  } else {\n    rangeManager.setRange(curIndex, curIndex);\n    draw.render({\n      curIndex\n    });\n  }\n}\nfunction enter(evt, host) {\n  var _a, _b;\n  const draw = host.getDraw();\n  if (draw.isReadonly())\n    return;\n  const rangeManager = draw.getRange();\n  if (!rangeManager.getIsCanInput())\n    return;\n  const { startIndex, endIndex } = rangeManager.getRange();\n  const isCollapsed = rangeManager.getIsCollapsed();\n  const elementList = draw.getElementList();\n  const startElement = elementList[startIndex];\n  const endElement = elementList[endIndex];\n  if (isCollapsed && endElement.listId && endElement.value === ZERO && ((_a = elementList[endIndex + 1]) == null ? void 0 : _a.listId) !== endElement.listId) {\n    draw.getListParticle().unsetList();\n    return;\n  }\n  const enterText = {\n    value: ZERO\n  };\n  if (evt.shiftKey && startElement.listId) {\n    enterText.listWrap = true;\n  }\n  formatElementContext(elementList, [enterText], startIndex, {\n    isBreakWhenWrap: true,\n    editorOptions: draw.getOptions()\n  });\n  if (!(endElement.titleId && endElement.titleId !== ((_b = elementList[endIndex + 1]) == null ? void 0 : _b.titleId))) {\n    const copyElement = getAnchorElement(elementList, endIndex);\n    if (copyElement) {\n      const copyAttr = [...EDITOR_ROW_ATTR];\n      if (copyElement.controlComponent !== ControlComponent.POSTFIX) {\n        copyAttr.push(...EDITOR_ELEMENT_STYLE_ATTR);\n      }\n      copyAttr.forEach((attr) => {\n        const value = copyElement[attr];\n        if (value !== void 0) {\n          enterText[attr] = value;\n        }\n      });\n    }\n  }\n  const control = draw.getControl();\n  const activeControl = control.getActiveControl();\n  let curIndex;\n  if (activeControl && control.getIsRangeWithinControl()) {\n    curIndex = control.setValue([enterText]);\n  } else {\n    const position = draw.getPosition();\n    const cursorPosition = position.getCursorPosition();\n    if (!cursorPosition)\n      return;\n    const { index: index2 } = cursorPosition;\n    if (isCollapsed) {\n      draw.spliceElementList(elementList, index2 + 1, 0, enterText);\n    } else {\n      draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex, enterText);\n    }\n    curIndex = index2 + 1;\n  }\n  if (~curIndex) {\n    rangeManager.setRange(curIndex, curIndex);\n    draw.render({ curIndex });\n  }\n  evt.preventDefault();\n}\nfunction left(evt, host) {\n  var _a, _b;\n  const draw = host.getDraw();\n  const isReadonly = draw.isReadonly();\n  if (isReadonly)\n    return;\n  const position = draw.getPosition();\n  const cursorPosition = position.getCursorPosition();\n  if (!cursorPosition)\n    return;\n  const positionContext = position.getPositionContext();\n  const { index: index2 } = cursorPosition;\n  if (index2 <= 0 && !positionContext.isTable)\n    return;\n  const rangeManager = draw.getRange();\n  const { startIndex, endIndex } = rangeManager.getRange();\n  const isCollapsed = rangeManager.getIsCollapsed();\n  const elementList = draw.getElementList();\n  const control = draw.getControl();\n  if (draw.getMode() === EditorMode.FORM && control.getActiveControl() && ((_a = elementList[index2]) == null ? void 0 : _a.controlComponent) === ControlComponent.PREFIX) {\n    control.initNextControl({\n      direction: MoveDirection.UP\n    });\n    return;\n  }\n  let moveCount = 1;\n  if (isMod(evt)) {\n    const LETTER_REG = draw.getLetterReg();\n    const moveStartIndex = evt.shiftKey && !isCollapsed && startIndex === (cursorPosition == null ? void 0 : cursorPosition.index) ? endIndex : startIndex;\n    if (LETTER_REG.test((_b = elementList[moveStartIndex]) == null ? void 0 : _b.value)) {\n      let i = moveStartIndex - 1;\n      while (i > 0) {\n        const element = elementList[i];\n        if (!LETTER_REG.test(element.value)) {\n          break;\n        }\n        moveCount++;\n        i--;\n      }\n    }\n  }\n  const curIndex = startIndex - moveCount;\n  let anchorStartIndex = curIndex;\n  let anchorEndIndex = curIndex;\n  if (evt.shiftKey && cursorPosition) {\n    if (startIndex !== endIndex) {\n      if (startIndex === cursorPosition.index) {\n        anchorStartIndex = startIndex;\n        anchorEndIndex = endIndex - moveCount;\n      } else {\n        anchorStartIndex = curIndex;\n        anchorEndIndex = endIndex;\n      }\n    } else {\n      anchorEndIndex = endIndex;\n    }\n  }\n  if (!evt.shiftKey) {\n    const element = elementList[startIndex];\n    if (element.type === ElementType.TABLE) {\n      const trList = element.trList;\n      const lastTrIndex = trList.length - 1;\n      const lastTr = trList[lastTrIndex];\n      const lastTdIndex = lastTr.tdList.length - 1;\n      const lastTd = lastTr.tdList[lastTdIndex];\n      position.setPositionContext({\n        isTable: true,\n        index: startIndex,\n        trIndex: lastTrIndex,\n        tdIndex: lastTdIndex,\n        tdId: lastTd.id,\n        trId: lastTr.id,\n        tableId: element.id\n      });\n      anchorStartIndex = lastTd.value.length - 1;\n      anchorEndIndex = anchorStartIndex;\n      draw.getTableTool().render();\n    } else if (element.tableId) {\n      if (startIndex === 0) {\n        const originalElementList = draw.getOriginalElementList();\n        const trList = originalElementList[positionContext.index].trList;\n        outer:\n          for (let r = 0; r < trList.length; r++) {\n            const tr = trList[r];\n            if (tr.id !== element.trId)\n              continue;\n            const tdList = tr.tdList;\n            for (let d = 0; d < tdList.length; d++) {\n              const td = tdList[d];\n              if (td.id !== element.tdId)\n                continue;\n              if (r === 0 && d === 0) {\n                position.setPositionContext({\n                  isTable: false\n                });\n                anchorStartIndex = positionContext.index - 1;\n                anchorEndIndex = anchorStartIndex;\n                draw.getTableTool().dispose();\n              } else {\n                let preTrIndex = r;\n                let preTdIndex = d - 1;\n                if (preTdIndex < 0) {\n                  preTrIndex = r - 1;\n                  preTdIndex = trList[preTrIndex].tdList.length - 1;\n                }\n                const preTr = trList[preTrIndex];\n                const preTd = preTr.tdList[preTdIndex];\n                position.setPositionContext({\n                  isTable: true,\n                  index: positionContext.index,\n                  trIndex: preTrIndex,\n                  tdIndex: preTdIndex,\n                  tdId: preTd.id,\n                  trId: preTr.id,\n                  tableId: element.id\n                });\n                anchorStartIndex = preTd.value.length - 1;\n                anchorEndIndex = anchorStartIndex;\n                draw.getTableTool().render();\n              }\n              break outer;\n            }\n          }\n      }\n    }\n  }\n  if (!~anchorStartIndex || !~anchorEndIndex)\n    return;\n  rangeManager.setRange(anchorStartIndex, anchorEndIndex);\n  const isAnchorCollapsed = anchorStartIndex === anchorEndIndex;\n  draw.render({\n    curIndex: isAnchorCollapsed ? anchorStartIndex : void 0,\n    isSetCursor: isAnchorCollapsed,\n    isSubmitHistory: false,\n    isCompute: false\n  });\n  evt.preventDefault();\n}\nfunction right(evt, host) {\n  var _a, _b;\n  const draw = host.getDraw();\n  const isReadonly = draw.isReadonly();\n  if (isReadonly)\n    return;\n  const position = draw.getPosition();\n  const cursorPosition = position.getCursorPosition();\n  if (!cursorPosition)\n    return;\n  const { index: index2 } = cursorPosition;\n  const positionList = position.getPositionList();\n  const positionContext = position.getPositionContext();\n  if (index2 > positionList.length - 1 && !positionContext.isTable)\n    return;\n  const rangeManager = draw.getRange();\n  const { startIndex, endIndex } = rangeManager.getRange();\n  const isCollapsed = rangeManager.getIsCollapsed();\n  let elementList = draw.getElementList();\n  const control = draw.getControl();\n  if (draw.getMode() === EditorMode.FORM && control.getActiveControl() && ((_a = elementList[index2 + 1]) == null ? void 0 : _a.controlComponent) === ControlComponent.POSTFIX) {\n    control.initNextControl({\n      direction: MoveDirection.DOWN\n    });\n    return;\n  }\n  let moveCount = 1;\n  if (isMod(evt)) {\n    const LETTER_REG = draw.getLetterReg();\n    const moveStartIndex = evt.shiftKey && !isCollapsed && startIndex === (cursorPosition == null ? void 0 : cursorPosition.index) ? endIndex : startIndex;\n    if (LETTER_REG.test((_b = elementList[moveStartIndex + 1]) == null ? void 0 : _b.value)) {\n      let i = moveStartIndex + 2;\n      while (i < elementList.length) {\n        const element = elementList[i];\n        if (!LETTER_REG.test(element.value)) {\n          break;\n        }\n        moveCount++;\n        i++;\n      }\n    }\n  }\n  const curIndex = endIndex + moveCount;\n  let anchorStartIndex = curIndex;\n  let anchorEndIndex = curIndex;\n  if (evt.shiftKey && cursorPosition) {\n    if (startIndex !== endIndex) {\n      if (startIndex === cursorPosition.index) {\n        anchorStartIndex = startIndex;\n        anchorEndIndex = curIndex;\n      } else {\n        anchorStartIndex = startIndex + moveCount;\n        anchorEndIndex = endIndex;\n      }\n    } else {\n      anchorStartIndex = startIndex;\n    }\n  }\n  if (!evt.shiftKey) {\n    const element = elementList[endIndex];\n    const nextElement = elementList[endIndex + 1];\n    if ((nextElement == null ? void 0 : nextElement.type) === ElementType.TABLE) {\n      const trList = nextElement.trList;\n      const nextTr = trList[0];\n      const nextTd = nextTr.tdList[0];\n      position.setPositionContext({\n        isTable: true,\n        index: endIndex + 1,\n        trIndex: 0,\n        tdIndex: 0,\n        tdId: nextTd.id,\n        trId: nextTr.id,\n        tableId: nextElement.id\n      });\n      anchorStartIndex = 0;\n      anchorEndIndex = 0;\n      draw.getTableTool().render();\n    } else if (element.tableId) {\n      if (!nextElement) {\n        const originalElementList = draw.getOriginalElementList();\n        const trList = originalElementList[positionContext.index].trList;\n        outer:\n          for (let r = 0; r < trList.length; r++) {\n            const tr = trList[r];\n            if (tr.id !== element.trId)\n              continue;\n            const tdList = tr.tdList;\n            for (let d = 0; d < tdList.length; d++) {\n              const td = tdList[d];\n              if (td.id !== element.tdId)\n                continue;\n              if (r === trList.length - 1 && d === tdList.length - 1) {\n                position.setPositionContext({\n                  isTable: false\n                });\n                anchorStartIndex = positionContext.index;\n                anchorEndIndex = anchorStartIndex;\n                elementList = draw.getElementList();\n                draw.getTableTool().dispose();\n              } else {\n                let nextTrIndex = r;\n                let nextTdIndex = d + 1;\n                if (nextTdIndex > tdList.length - 1) {\n                  nextTrIndex = r + 1;\n                  nextTdIndex = 0;\n                }\n                const preTr = trList[nextTrIndex];\n                const preTd = preTr.tdList[nextTdIndex];\n                position.setPositionContext({\n                  isTable: true,\n                  index: positionContext.index,\n                  trIndex: nextTrIndex,\n                  tdIndex: nextTdIndex,\n                  tdId: preTd.id,\n                  trId: preTr.id,\n                  tableId: element.id\n                });\n                anchorStartIndex = 0;\n                anchorEndIndex = anchorStartIndex;\n                draw.getTableTool().render();\n              }\n              break outer;\n            }\n          }\n      }\n    }\n  }\n  const maxElementListIndex = elementList.length - 1;\n  if (anchorStartIndex > maxElementListIndex || anchorEndIndex > maxElementListIndex) {\n    return;\n  }\n  rangeManager.setRange(anchorStartIndex, anchorEndIndex);\n  const isAnchorCollapsed = anchorStartIndex === anchorEndIndex;\n  draw.render({\n    curIndex: isAnchorCollapsed ? anchorStartIndex : void 0,\n    isSetCursor: isAnchorCollapsed,\n    isSubmitHistory: false,\n    isCompute: false\n  });\n  evt.preventDefault();\n}\nfunction tab(evt, host) {\n  const draw = host.getDraw();\n  const isReadonly = draw.isReadonly();\n  if (isReadonly)\n    return;\n  evt.preventDefault();\n  const control = draw.getControl();\n  const activeControl = control.getActiveControl();\n  if (activeControl && control.getIsRangeWithinControl()) {\n    control.initNextControl({\n      direction: evt.shiftKey ? MoveDirection.UP : MoveDirection.DOWN\n    });\n  } else {\n    const tabElement = {\n      type: ElementType.TAB,\n      value: \"\"\n    };\n    const rangeManager = draw.getRange();\n    const { startIndex } = rangeManager.getRange();\n    const elementList = draw.getElementList();\n    formatElementContext(elementList, [tabElement], startIndex, {\n      editorOptions: draw.getOptions()\n    });\n    draw.insertElementList([tabElement]);\n  }\n}\nfunction getNextPositionIndex(payload) {\n  const { positionList, index: index2, isUp, rowNo, cursorX } = payload;\n  let nextIndex = -1;\n  const probablePosition = [];\n  if (isUp) {\n    let p = index2 - 1;\n    while (p >= 0) {\n      const position = positionList[p];\n      p--;\n      if (position.rowNo === rowNo)\n        continue;\n      if (probablePosition[0] && probablePosition[0].rowNo !== position.rowNo) {\n        break;\n      }\n      probablePosition.unshift(position);\n    }\n  } else {\n    let p = index2 + 1;\n    while (p < positionList.length) {\n      const position = positionList[p];\n      p++;\n      if (position.rowNo === rowNo)\n        continue;\n      if (probablePosition[0] && probablePosition[0].rowNo !== position.rowNo) {\n        break;\n      }\n      probablePosition.push(position);\n    }\n  }\n  for (let p = 0; p < probablePosition.length; p++) {\n    const nextPosition = probablePosition[p];\n    const { coordinate: { leftTop: [nextLeftX], rightTop: [nextRightX] } } = nextPosition;\n    if (p === probablePosition.length - 1) {\n      nextIndex = nextPosition.index;\n    }\n    if (cursorX < nextLeftX || cursorX > nextRightX)\n      continue;\n    nextIndex = nextPosition.index;\n    break;\n  }\n  return nextIndex;\n}\nfunction updown(evt, host) {\n  const draw = host.getDraw();\n  const isReadonly = draw.isReadonly();\n  if (isReadonly)\n    return;\n  const position = draw.getPosition();\n  const cursorPosition = position.getCursorPosition();\n  if (!cursorPosition)\n    return;\n  const rangeManager = draw.getRange();\n  const { startIndex, endIndex } = rangeManager.getRange();\n  let positionList = position.getPositionList();\n  const isUp = evt.key === KeyMap.Up;\n  let anchorStartIndex = -1;\n  let anchorEndIndex = -1;\n  const positionContext = position.getPositionContext();\n  if (!evt.shiftKey && positionContext.isTable && (isUp && cursorPosition.rowIndex === 0 || !isUp && cursorPosition.rowIndex === draw.getRowCount() - 1)) {\n    const { index: index2, trIndex, tdIndex, tableId } = positionContext;\n    if (isUp) {\n      if (trIndex === 0) {\n        position.setPositionContext({\n          isTable: false\n        });\n        anchorStartIndex = index2 - 1;\n        anchorEndIndex = anchorStartIndex;\n        draw.getTableTool().dispose();\n      } else {\n        let preTrIndex = -1;\n        let preTdIndex = -1;\n        const originalElementList = draw.getOriginalElementList();\n        const trList = originalElementList[index2].trList;\n        const curTdColIndex = trList[trIndex].tdList[tdIndex].colIndex;\n        outer:\n          for (let r = trIndex - 1; r >= 0; r--) {\n            const tr = trList[r];\n            const tdList = tr.tdList;\n            for (let d = 0; d < tdList.length; d++) {\n              const td = tdList[d];\n              if (td.colIndex === curTdColIndex || td.colIndex + td.colspan - 1 >= curTdColIndex && td.colIndex <= curTdColIndex) {\n                preTrIndex = r;\n                preTdIndex = d;\n                break outer;\n              }\n            }\n          }\n        if (!~preTrIndex || !~preTdIndex)\n          return;\n        const preTr = trList[preTrIndex];\n        const preTd = preTr.tdList[preTdIndex];\n        position.setPositionContext({\n          isTable: true,\n          index: index2,\n          trIndex: preTrIndex,\n          tdIndex: preTdIndex,\n          tdId: preTr.id,\n          trId: preTd.id,\n          tableId\n        });\n        anchorStartIndex = preTd.value.length - 1;\n        anchorEndIndex = anchorStartIndex;\n        draw.getTableTool().render();\n      }\n    } else {\n      const originalElementList = draw.getOriginalElementList();\n      const trList = originalElementList[index2].trList;\n      if (trIndex === trList.length - 1) {\n        position.setPositionContext({\n          isTable: false\n        });\n        anchorStartIndex = index2;\n        anchorEndIndex = anchorStartIndex;\n        draw.getTableTool().dispose();\n      } else {\n        let nexTrIndex = -1;\n        let nextTdIndex = -1;\n        const curTdColIndex = trList[trIndex].tdList[tdIndex].colIndex;\n        outer:\n          for (let r = trIndex + 1; r < trList.length; r++) {\n            const tr = trList[r];\n            const tdList = tr.tdList;\n            for (let d = 0; d < tdList.length; d++) {\n              const td = tdList[d];\n              if (td.colIndex === curTdColIndex || td.colIndex + td.colspan - 1 >= curTdColIndex && td.colIndex <= curTdColIndex) {\n                nexTrIndex = r;\n                nextTdIndex = d;\n                break outer;\n              }\n            }\n          }\n        if (!~nexTrIndex || !~nextTdIndex)\n          return;\n        const nextTr = trList[nexTrIndex];\n        const nextTd = nextTr.tdList[nextTdIndex];\n        position.setPositionContext({\n          isTable: true,\n          index: index2,\n          trIndex: nexTrIndex,\n          tdIndex: nextTdIndex,\n          tdId: nextTr.id,\n          trId: nextTd.id,\n          tableId\n        });\n        anchorStartIndex = nextTd.value.length - 1;\n        anchorEndIndex = anchorStartIndex;\n        draw.getTableTool().render();\n      }\n    }\n  } else {\n    let anchorPosition = cursorPosition;\n    if (evt.shiftKey) {\n      if (startIndex === cursorPosition.index) {\n        anchorPosition = positionList[endIndex];\n      } else {\n        anchorPosition = positionList[startIndex];\n      }\n    }\n    const { index: index2, rowNo, rowIndex, coordinate: { rightTop: [curRightX] } } = anchorPosition;\n    if (isUp && rowIndex === 0 || !isUp && rowIndex === draw.getRowCount() - 1) {\n      return;\n    }\n    const nextIndex = getNextPositionIndex({\n      positionList,\n      index: index2,\n      rowNo,\n      isUp,\n      cursorX: curRightX\n    });\n    if (nextIndex < 0)\n      return;\n    anchorStartIndex = nextIndex;\n    anchorEndIndex = nextIndex;\n    if (evt.shiftKey) {\n      if (startIndex !== endIndex) {\n        if (startIndex === cursorPosition.index) {\n          anchorStartIndex = startIndex;\n        } else {\n          anchorEndIndex = endIndex;\n        }\n      } else {\n        if (isUp) {\n          anchorEndIndex = endIndex;\n        } else {\n          anchorStartIndex = startIndex;\n        }\n      }\n    }\n    const elementList = draw.getElementList();\n    const nextElement = elementList[nextIndex];\n    if (nextElement.type === ElementType.TABLE) {\n      const { scale } = draw.getOptions();\n      const margins = draw.getMargins();\n      const trList = nextElement.trList;\n      let trIndex = -1;\n      let tdIndex = -1;\n      let tdPositionIndex = -1;\n      if (isUp) {\n        outer:\n          for (let r = trList.length - 1; r >= 0; r--) {\n            const tr = trList[r];\n            const tdList = tr.tdList;\n            for (let d = 0; d < tdList.length; d++) {\n              const td = tdList[d];\n              const tdX = td.x * scale + margins[3];\n              const tdWidth = td.width * scale;\n              if (curRightX >= tdX && curRightX <= tdX + tdWidth) {\n                const tdPositionList = td.positionList;\n                const lastPosition = tdPositionList[tdPositionList.length - 1];\n                const nextPositionIndex = getNextPositionIndex({\n                  positionList: tdPositionList,\n                  index: lastPosition.index + 1,\n                  rowNo: lastPosition.rowNo - 1,\n                  isUp,\n                  cursorX: curRightX\n                }) || lastPosition.index;\n                trIndex = r;\n                tdIndex = d;\n                tdPositionIndex = nextPositionIndex;\n                break outer;\n              }\n            }\n          }\n      } else {\n        outer:\n          for (let r = 0; r < trList.length; r++) {\n            const tr = trList[r];\n            const tdList = tr.tdList;\n            for (let d = 0; d < tdList.length; d++) {\n              const td = tdList[d];\n              const tdX = td.x * scale + margins[3];\n              const tdWidth = td.width * scale;\n              if (curRightX >= tdX && curRightX <= tdX + tdWidth) {\n                const tdPositionList = td.positionList;\n                const nextPositionIndex = getNextPositionIndex({\n                  positionList: tdPositionList,\n                  index: -1,\n                  rowNo: -1,\n                  isUp,\n                  cursorX: curRightX\n                }) || 0;\n                trIndex = r;\n                tdIndex = d;\n                tdPositionIndex = nextPositionIndex;\n                break outer;\n              }\n            }\n          }\n      }\n      if (~trIndex && ~tdIndex && ~tdPositionIndex) {\n        const nextTr = trList[trIndex];\n        const nextTd = nextTr.tdList[tdIndex];\n        position.setPositionContext({\n          isTable: true,\n          index: nextIndex,\n          trIndex,\n          tdIndex,\n          tdId: nextTd.id,\n          trId: nextTr.id,\n          tableId: nextElement.id\n        });\n        anchorStartIndex = tdPositionIndex;\n        anchorEndIndex = anchorStartIndex;\n        positionList = position.getPositionList();\n        draw.getTableTool().render();\n      }\n    }\n  }\n  if (!~anchorStartIndex || !~anchorEndIndex)\n    return;\n  if (anchorStartIndex > anchorEndIndex) {\n    [anchorStartIndex, anchorEndIndex] = [anchorEndIndex, anchorStartIndex];\n  }\n  rangeManager.setRange(anchorStartIndex, anchorEndIndex);\n  const isCollapsed = anchorStartIndex === anchorEndIndex;\n  draw.render({\n    curIndex: isCollapsed ? anchorStartIndex : void 0,\n    isSetCursor: isCollapsed,\n    isSubmitHistory: false,\n    isCompute: false\n  });\n  draw.getCursor().moveCursorToVisible({\n    cursorPosition: positionList[isUp ? anchorStartIndex : anchorEndIndex],\n    direction: isUp ? MoveDirection.UP : MoveDirection.DOWN\n  });\n}\nfunction keydown(evt, host) {\n  if (host.isComposing)\n    return;\n  const draw = host.getDraw();\n  if (evt.key === KeyMap.Backspace) {\n    backspace(evt, host);\n  } else if (evt.key === KeyMap.Delete) {\n    del(evt, host);\n  } else if (evt.key === KeyMap.Enter) {\n    enter(evt, host);\n  } else if (evt.key === KeyMap.Left) {\n    left(evt, host);\n  } else if (evt.key === KeyMap.Right) {\n    right(evt, host);\n  } else if (evt.key === KeyMap.Up || evt.key === KeyMap.Down) {\n    updown(evt, host);\n  } else if (isMod(evt) && evt.key === KeyMap.Z) {\n    if (draw.isReadonly() && draw.getMode() !== EditorMode.FORM)\n      return;\n    draw.getHistoryManager().undo();\n    evt.preventDefault();\n  } else if (isMod(evt) && evt.key === KeyMap.Y) {\n    if (draw.isReadonly() && draw.getMode() !== EditorMode.FORM)\n      return;\n    draw.getHistoryManager().redo();\n    evt.preventDefault();\n  } else if (isMod(evt) && evt.key === KeyMap.C) {\n    host.copy();\n    evt.preventDefault();\n  } else if (isMod(evt) && evt.key === KeyMap.X) {\n    host.cut();\n    evt.preventDefault();\n  } else if (isMod(evt) && evt.key === KeyMap.A) {\n    host.selectAll();\n    evt.preventDefault();\n  } else if (isMod(evt) && evt.key === KeyMap.S) {\n    if (draw.isReadonly())\n      return;\n    const listener = draw.getListener();\n    if (listener.saved) {\n      listener.saved(draw.getValue());\n    }\n    const eventBus = draw.getEventBus();\n    if (eventBus.isSubscribe(\"saved\")) {\n      eventBus.emit(\"saved\", draw.getValue());\n    }\n    evt.preventDefault();\n  } else if (evt.key === KeyMap.ESC) {\n    host.clearPainterStyle();\n    const zoneManager = draw.getZone();\n    if (!zoneManager.isMainActive()) {\n      zoneManager.setZone(EditorZone.MAIN);\n    }\n    evt.preventDefault();\n  } else if (evt.key === KeyMap.TAB) {\n    tab(evt, host);\n  }\n}\nfunction input(data2, host) {\n  var _a;\n  const draw = host.getDraw();\n  if (draw.isReadonly() || draw.isDisabled())\n    return;\n  const position = draw.getPosition();\n  const cursorPosition = position.getCursorPosition();\n  if (!data2 || !cursorPosition)\n    return;\n  const isComposing = host.isComposing;\n  if (isComposing && ((_a = host.compositionInfo) == null ? void 0 : _a.value) === data2)\n    return;\n  const rangeManager = draw.getRange();\n  if (!rangeManager.getIsCanInput())\n    return;\n  removeComposingInput(host);\n  if (!isComposing) {\n    const cursor = draw.getCursor();\n    cursor.clearAgentDomValue();\n  }\n  const { TEXT, HYPERLINK, SUBSCRIPT, SUPERSCRIPT, DATE } = ElementType;\n  const text = data2.replaceAll(`\n`, ZERO);\n  const { startIndex, endIndex } = rangeManager.getRange();\n  const elementList = draw.getElementList();\n  const copyElement = getAnchorElement(elementList, endIndex);\n  if (!copyElement)\n    return;\n  const isDesignMode = draw.isDesignMode();\n  const inputData = splitText(text).map((value) => {\n    var _a2, _b;\n    const newElement = {\n      value\n    };\n    if (isDesignMode || !((_a2 = copyElement.title) == null ? void 0 : _a2.disabled) && !((_b = copyElement.control) == null ? void 0 : _b.disabled)) {\n      const nextElement = elementList[endIndex + 1];\n      if (!copyElement.type || copyElement.type === TEXT || copyElement.type === HYPERLINK && (nextElement == null ? void 0 : nextElement.type) === HYPERLINK || copyElement.type === DATE && (nextElement == null ? void 0 : nextElement.type) === DATE || copyElement.type === SUBSCRIPT && (nextElement == null ? void 0 : nextElement.type) === SUBSCRIPT || copyElement.type === SUPERSCRIPT && (nextElement == null ? void 0 : nextElement.type) === SUPERSCRIPT) {\n        EDITOR_ELEMENT_COPY_ATTR.forEach((attr) => {\n          if (attr === \"groupIds\" && !(nextElement == null ? void 0 : nextElement.groupIds))\n            return;\n          const value2 = copyElement[attr];\n          if (value2 !== void 0) {\n            newElement[attr] = value2;\n          }\n        });\n      }\n      if (isComposing) {\n        newElement.underline = true;\n      }\n    }\n    return newElement;\n  });\n  const control = draw.getControl();\n  let curIndex;\n  if (control.getActiveControl() && control.getIsRangeWithinControl()) {\n    curIndex = control.setValue(inputData);\n  } else {\n    const start = startIndex + 1;\n    if (startIndex !== endIndex) {\n      draw.spliceElementList(elementList, start, endIndex - startIndex);\n    }\n    formatElementContext(elementList, inputData, startIndex, {\n      editorOptions: draw.getOptions()\n    });\n    draw.spliceElementList(elementList, start, 0, ...inputData);\n    curIndex = startIndex + inputData.length;\n  }\n  if (~curIndex) {\n    rangeManager.setRange(curIndex, curIndex);\n    draw.render({\n      curIndex,\n      isSubmitHistory: !isComposing\n    });\n  }\n  if (isComposing) {\n    host.compositionInfo = {\n      elementList,\n      value: text,\n      startIndex: curIndex - inputData.length,\n      endIndex: curIndex\n    };\n  }\n}\nfunction removeComposingInput(host) {\n  if (!host.compositionInfo)\n    return;\n  const { elementList, startIndex, endIndex } = host.compositionInfo;\n  elementList.splice(startIndex + 1, endIndex - startIndex);\n  const rangeManager = host.getDraw().getRange();\n  rangeManager.setRange(startIndex, startIndex);\n  host.compositionInfo = null;\n}\nfunction cut(host) {\n  const draw = host.getDraw();\n  const rangeManager = draw.getRange();\n  const { startIndex, endIndex } = rangeManager.getRange();\n  if (!~startIndex && !~startIndex)\n    return;\n  if (draw.isReadonly() || !rangeManager.getIsCanInput())\n    return;\n  const elementList = draw.getElementList();\n  let start = startIndex;\n  let end = endIndex;\n  if (startIndex === endIndex) {\n    const position = draw.getPosition();\n    const positionList = position.getPositionList();\n    const startPosition = positionList[startIndex];\n    const curRowNo = startPosition.rowNo;\n    const curPageNo = startPosition.pageNo;\n    const cutElementIndexList = [];\n    for (let p = 0; p < positionList.length; p++) {\n      const position2 = positionList[p];\n      if (position2.pageNo > curPageNo)\n        break;\n      if (position2.pageNo === curPageNo && position2.rowNo === curRowNo) {\n        cutElementIndexList.push(p);\n      }\n    }\n    const firstElementIndex = cutElementIndexList[0] - 1;\n    start = firstElementIndex < 0 ? 0 : firstElementIndex;\n    end = cutElementIndexList[cutElementIndexList.length - 1];\n  }\n  const options = draw.getOptions();\n  writeElementList(elementList.slice(start + 1, end + 1), options);\n  const control = draw.getControl();\n  let curIndex;\n  if (control.getActiveControl() && control.getIsRangeWithinControl()) {\n    curIndex = control.cut();\n  } else {\n    draw.spliceElementList(elementList, start + 1, end - start);\n    curIndex = start;\n  }\n  rangeManager.setRange(curIndex, curIndex);\n  draw.render({ curIndex });\n}\nfunction copy(host) {\n  const draw = host.getDraw();\n  const { copy: copy2 } = draw.getOverride();\n  if (copy2) {\n    const overrideResult = copy2();\n    if ((overrideResult == null ? void 0 : overrideResult.preventDefault) !== false)\n      return;\n  }\n  const rangeManager = draw.getRange();\n  let copyElementList = null;\n  const range = rangeManager.getRange();\n  if (range.isCrossRowCol) {\n    const tableElement = rangeManager.getRangeTableElement();\n    if (!tableElement)\n      return;\n    const rowCol = draw.getTableParticle().getRangeRowCol();\n    if (!rowCol)\n      return;\n    const copyTableElement = {\n      type: ElementType.TABLE,\n      value: \"\",\n      colgroup: [],\n      trList: []\n    };\n    const firstRow = rowCol[0];\n    const colStartIndex = firstRow[0].colIndex;\n    const lastCol = firstRow[firstRow.length - 1];\n    const colEndIndex = lastCol.colIndex + lastCol.colspan - 1;\n    for (let c = colStartIndex; c <= colEndIndex; c++) {\n      copyTableElement.colgroup.push(tableElement.colgroup[c]);\n    }\n    for (let r = 0; r < rowCol.length; r++) {\n      const row = rowCol[r];\n      const tr = tableElement.trList[row[0].rowIndex];\n      const coptTr = {\n        tdList: [],\n        height: tr.height,\n        minHeight: tr.minHeight\n      };\n      for (let c = 0; c < row.length; c++) {\n        coptTr.tdList.push(row[c]);\n      }\n      copyTableElement.trList.push(coptTr);\n    }\n    copyElementList = zipElementList([copyTableElement]);\n  } else {\n    copyElementList = rangeManager.getIsCollapsed() ? rangeManager.getRangeRowElementList() : rangeManager.getSelectionElementList();\n  }\n  if (!(copyElementList == null ? void 0 : copyElementList.length))\n    return;\n  writeElementList(copyElementList, draw.getOptions());\n}\nfunction drop(evt, host) {\n  var _a, _b;\n  const draw = host.getDraw();\n  const { drop: drop2 } = draw.getOverride();\n  if (drop2) {\n    const overrideResult = drop2(evt);\n    if ((overrideResult == null ? void 0 : overrideResult.preventDefault) !== false)\n      return;\n  }\n  evt.preventDefault();\n  const data2 = (_a = evt.dataTransfer) == null ? void 0 : _a.getData(\"text\");\n  if (data2) {\n    host.input(data2);\n  } else {\n    const files = (_b = evt.dataTransfer) == null ? void 0 : _b.files;\n    if (!files)\n      return;\n    for (let i = 0; i < files.length; i++) {\n      const file = files[i];\n      if (file.type.startsWith(\"image\")) {\n        pasteImage(host, file);\n      }\n    }\n  }\n}\nfunction getWordRangeBySegmenter(host) {\n  var _a;\n  if (!Intl.Segmenter)\n    return null;\n  const draw = host.getDraw();\n  const cursorPosition = draw.getPosition().getCursorPosition();\n  if (!cursorPosition)\n    return null;\n  const rangeManager = draw.getRange();\n  const paragraphInfo = rangeManager.getRangeParagraphInfo();\n  if (!paragraphInfo)\n    return null;\n  const paragraphText = ((_a = paragraphInfo == null ? void 0 : paragraphInfo.elementList) == null ? void 0 : _a.map((e) => !e.type || e.type !== ElementType.CONTROL && TEXTLIKE_ELEMENT_TYPE.includes(e.type) ? e.value : ZERO).join(\"\")) || \"\";\n  if (!paragraphText)\n    return null;\n  const cursorStartIndex = cursorPosition.index;\n  const offset = paragraphInfo.startIndex;\n  const segmenter = new Intl.Segmenter(void 0, { granularity: \"word\" });\n  const segments = segmenter.segment(paragraphText);\n  let startIndex = -1;\n  let endIndex = -1;\n  for (const { segment, index: index2, isWordLike } of segments) {\n    const realSegmentStartIndex = index2 + offset;\n    if (isWordLike && cursorStartIndex >= realSegmentStartIndex && cursorStartIndex < realSegmentStartIndex + segment.length) {\n      startIndex = realSegmentStartIndex - 1;\n      endIndex = startIndex + segment.length;\n      break;\n    }\n  }\n  return ~startIndex && ~endIndex ? { startIndex, endIndex } : null;\n}\nfunction getWordRangeByCursor(host) {\n  const draw = host.getDraw();\n  const cursorPosition = draw.getPosition().getCursorPosition();\n  if (!cursorPosition)\n    return null;\n  const { value, index: index2 } = cursorPosition;\n  const LETTER_REG = draw.getLetterReg();\n  let upCount = 0;\n  let downCount = 0;\n  const isNumber = NUMBER_LIKE_REG.test(value);\n  if (isNumber || LETTER_REG.test(value)) {\n    const elementList = draw.getElementList();\n    let upStartIndex = index2 - 1;\n    while (upStartIndex > 0) {\n      const value2 = elementList[upStartIndex].value;\n      if (isNumber && NUMBER_LIKE_REG.test(value2) || !isNumber && LETTER_REG.test(value2)) {\n        upCount++;\n        upStartIndex--;\n      } else {\n        break;\n      }\n    }\n    let downStartIndex = index2 + 1;\n    while (downStartIndex < elementList.length) {\n      const value2 = elementList[downStartIndex].value;\n      if (isNumber && NUMBER_LIKE_REG.test(value2) || !isNumber && LETTER_REG.test(value2)) {\n        downCount++;\n        downStartIndex++;\n      } else {\n        break;\n      }\n    }\n  }\n  const startIndex = index2 - upCount - 1;\n  if (startIndex < 0)\n    return null;\n  return {\n    startIndex,\n    endIndex: index2 + downCount\n  };\n}\nfunction dblclick(host, evt) {\n  const draw = host.getDraw();\n  const position = draw.getPosition();\n  const positionContext = position.getPositionByXY({\n    x: evt.offsetX,\n    y: evt.offsetY\n  });\n  if (positionContext.isImage && positionContext.isDirectHit) {\n    draw.getPreviewer().render();\n    return;\n  }\n  if (draw.getIsPagingMode()) {\n    if (!~positionContext.index && positionContext.zone) {\n      draw.getZone().setZone(positionContext.zone);\n      draw.clearSideEffect();\n      position.setPositionContext({\n        isTable: false\n      });\n      return;\n    }\n  }\n  if ((positionContext.isCheckbox || positionContext.isRadio) && positionContext.isDirectHit) {\n    return;\n  }\n  const rangeManager = draw.getRange();\n  const segmenterRange = getWordRangeBySegmenter(host) || getWordRangeByCursor(host);\n  if (!segmenterRange)\n    return;\n  rangeManager.setRange(segmenterRange.startIndex, segmenterRange.endIndex);\n  draw.render({\n    isSubmitHistory: false,\n    isSetCursor: false,\n    isCompute: false\n  });\n  rangeManager.setRangeStyle();\n}\nfunction threeClick(host) {\n  var _a, _b;\n  const draw = host.getDraw();\n  const position = draw.getPosition();\n  const cursorPosition = position.getCursorPosition();\n  if (!cursorPosition)\n    return;\n  const { index: index2 } = cursorPosition;\n  const elementList = draw.getElementList();\n  let upCount = 0;\n  let downCount = 0;\n  let upStartIndex = index2 - 1;\n  while (upStartIndex > 0) {\n    const element = elementList[upStartIndex];\n    const preElement = elementList[upStartIndex - 1];\n    if (element.value === ZERO && !element.listWrap || element.listId !== (preElement == null ? void 0 : preElement.listId) || element.titleId !== (preElement == null ? void 0 : preElement.titleId)) {\n      break;\n    }\n    upCount++;\n    upStartIndex--;\n  }\n  let downStartIndex = index2 + 1;\n  while (downStartIndex < elementList.length) {\n    const element = elementList[downStartIndex];\n    const nextElement = elementList[downStartIndex + 1];\n    if (element.value === ZERO && !element.listWrap || element.listId !== (nextElement == null ? void 0 : nextElement.listId) || element.titleId !== (nextElement == null ? void 0 : nextElement.titleId)) {\n      break;\n    }\n    downCount++;\n    downStartIndex++;\n  }\n  const rangeManager = draw.getRange();\n  let newStartIndex = index2 - upCount - 1;\n  if (((_a = elementList[newStartIndex]) == null ? void 0 : _a.value) !== ZERO) {\n    newStartIndex -= 1;\n  }\n  if (newStartIndex < 0)\n    return;\n  let newEndIndex = index2 + downCount + 1;\n  if (((_b = elementList[newEndIndex]) == null ? void 0 : _b.value) === ZERO || newEndIndex > elementList.length - 1) {\n    newEndIndex -= 1;\n  }\n  rangeManager.setRange(newStartIndex, newEndIndex);\n  draw.render({\n    isSubmitHistory: false,\n    isSetCursor: false,\n    isCompute: false\n  });\n}\nvar click = {\n  dblclick,\n  threeClick\n};\nfunction compositionstart(host) {\n  host.isComposing = true;\n}\nfunction compositionend(host, evt) {\n  host.isComposing = false;\n  const draw = host.getDraw();\n  if (!evt.data) {\n    removeComposingInput(host);\n    const rangeManager = draw.getRange();\n    const { endIndex: curIndex } = rangeManager.getRange();\n    draw.render({\n      curIndex,\n      isSubmitHistory: false\n    });\n  } else {\n    setTimeout(() => {\n      if (host.compositionInfo) {\n        input(evt.data, host);\n      }\n    }, 1);\n  }\n  const cursor = draw.getCursor();\n  cursor.clearAgentDomValue();\n}\nvar composition = {\n  compositionstart,\n  compositionend\n};\nfunction dragover(evt, host) {\n  const draw = host.getDraw();\n  const isReadonly = draw.isReadonly();\n  if (isReadonly)\n    return;\n  evt.preventDefault();\n  const pageContainer = draw.getPageContainer();\n  const editorRegion = findParent(evt.target, (node) => node === pageContainer, true);\n  if (!editorRegion)\n    return;\n  const target = evt.target;\n  const pageIndex = target.dataset.index;\n  if (pageIndex) {\n    draw.setPageNo(Number(pageIndex));\n  }\n  const position = draw.getPosition();\n  const positionContext = position.adjustPositionContext({\n    x: evt.offsetX,\n    y: evt.offsetY\n  });\n  if (!positionContext)\n    return;\n  const { isTable, tdValueIndex, index: index2 } = positionContext;\n  const positionList = position.getPositionList();\n  const curIndex = isTable ? tdValueIndex : index2;\n  if (~index2) {\n    const rangeManager = draw.getRange();\n    rangeManager.setRange(curIndex, curIndex);\n    position.setCursorPosition(positionList[curIndex]);\n  }\n  const cursor = draw.getCursor();\n  const { cursor: { dragColor, dragWidth } } = draw.getOptions();\n  cursor.drawCursor({\n    width: dragWidth,\n    color: dragColor,\n    isBlink: false\n  });\n}\nvar drag = {\n  dragover\n};\nclass CanvasEvent {\n  constructor(draw) {\n    this.draw = draw;\n    this.pageContainer = draw.getPageContainer();\n    this.pageList = draw.getPageList();\n    this.range = this.draw.getRange();\n    this.position = this.draw.getPosition();\n    this.isAllowSelection = false;\n    this.isComposing = false;\n    this.compositionInfo = null;\n    this.isAllowDrag = false;\n    this.isAllowDrop = false;\n    this.cacheRange = null;\n    this.cacheElementList = null;\n    this.cachePositionList = null;\n    this.cachePositionContext = null;\n    this.mouseDownStartPosition = null;\n  }\n  getDraw() {\n    return this.draw;\n  }\n  register() {\n    this.pageContainer.addEventListener(\"click\", this.click.bind(this));\n    this.pageContainer.addEventListener(\"mousedown\", this.mousedown.bind(this));\n    this.pageContainer.addEventListener(\"mouseup\", this.mouseup.bind(this));\n    this.pageContainer.addEventListener(\"mouseleave\", this.mouseleave.bind(this));\n    this.pageContainer.addEventListener(\"mousemove\", this.mousemove.bind(this));\n    this.pageContainer.addEventListener(\"dblclick\", this.dblclick.bind(this));\n    this.pageContainer.addEventListener(\"dragover\", this.dragover.bind(this));\n    this.pageContainer.addEventListener(\"drop\", this.drop.bind(this));\n    threeClick$1(this.pageContainer, this.threeClick.bind(this));\n  }\n  setIsAllowSelection(payload) {\n    this.isAllowSelection = payload;\n    if (!payload) {\n      this.applyPainterStyle();\n    }\n  }\n  setIsAllowDrag(payload) {\n    this.isAllowDrag = payload;\n    this.isAllowDrop = payload;\n  }\n  clearPainterStyle() {\n    this.pageList.forEach((p) => {\n      p.style.cursor = \"text\";\n    });\n    this.draw.setPainterStyle(null);\n  }\n  applyPainterStyle() {\n    const painterStyle = this.draw.getPainterStyle();\n    if (!painterStyle)\n      return;\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const selection = this.range.getSelection();\n    if (!selection)\n      return;\n    const painterStyleKeys = Object.keys(painterStyle);\n    selection.forEach((s) => {\n      painterStyleKeys.forEach((pKey) => {\n        const key = pKey;\n        s[key] = painterStyle[key];\n      });\n    });\n    this.draw.render({ isSetCursor: false });\n    const painterOptions = this.draw.getPainterOptions();\n    if (!painterOptions || !painterOptions.isDblclick) {\n      this.clearPainterStyle();\n    }\n  }\n  selectAll() {\n    const position = this.position.getPositionList();\n    this.range.setRange(0, position.length - 1);\n    this.draw.render({\n      isSubmitHistory: false,\n      isSetCursor: false,\n      isCompute: false\n    });\n  }\n  mousemove(evt) {\n    mousemove(evt, this);\n  }\n  mousedown(evt) {\n    mousedown(evt, this);\n  }\n  click() {\n    if (isIOS && !this.draw.isReadonly()) {\n      this.draw.getCursor().getAgentDom().focus();\n    }\n  }\n  mouseup(evt) {\n    mouseup(evt, this);\n  }\n  mouseleave(evt) {\n    mouseleave(evt, this);\n  }\n  keydown(evt) {\n    keydown(evt, this);\n  }\n  dblclick(evt) {\n    click.dblclick(this, evt);\n  }\n  threeClick() {\n    click.threeClick(this);\n  }\n  input(data2) {\n    input(data2, this);\n  }\n  cut() {\n    cut(this);\n  }\n  copy() {\n    copy(this);\n  }\n  compositionstart() {\n    composition.compositionstart(this);\n  }\n  compositionend(evt) {\n    composition.compositionend(this, evt);\n  }\n  drop(evt) {\n    drop(evt, this);\n  }\n  dragover(evt) {\n    drag.dragover(evt, this);\n  }\n}\nclass GlobalEvent {\n  constructor(draw, canvasEvent) {\n    this.clearSideEffect = (evt) => {\n      if (!this.cursor)\n        return;\n      const target = (evt == null ? void 0 : evt.composedPath()[0]) || evt.target;\n      const pageList = this.draw.getPageList();\n      const innerEditorDom = findParent(target, (node) => pageList.includes(node), true);\n      if (innerEditorDom) {\n        this.setRangeStyle();\n        return;\n      }\n      const outerEditorDom = findParent(target, (node) => !!node && node.nodeType === 1 && !!node.getAttribute(EDITOR_COMPONENT), true);\n      if (outerEditorDom) {\n        this.setRangeStyle();\n        this.watchCursorActive();\n        return;\n      }\n      this.cursor.recoveryCursor();\n      this.range.recoveryRangeStyle();\n      this.previewer.clearResizer();\n      this.tableTool.dispose();\n      this.hyperlinkParticle.clearHyperlinkPopup();\n      this.control.destroyControl();\n      this.dateParticle.clearDatePicker();\n      this.imageParticle.destroyFloatImage();\n    };\n    this.setCanvasEventAbility = () => {\n      this.canvasEvent.setIsAllowDrag(false);\n      this.canvasEvent.setIsAllowSelection(false);\n    };\n    this.setRangeStyle = () => {\n      this.range.setRangeStyle();\n    };\n    this.setPageScale = (evt) => {\n      if (!evt.ctrlKey)\n        return;\n      evt.preventDefault();\n      const { scale } = this.options;\n      if (evt.deltaY < 0) {\n        const nextScale = scale * 10 + 1;\n        if (nextScale <= 30) {\n          this.draw.setPageScale(nextScale / 10);\n        }\n      } else {\n        const nextScale = scale * 10 - 1;\n        if (nextScale >= 5) {\n          this.draw.setPageScale(nextScale / 10);\n        }\n      }\n    };\n    this._handleVisibilityChange = () => {\n      if (document.visibilityState === \"visible\") {\n        const range = this.range.getRange();\n        const isSetCursor = !!~range.startIndex && !!~range.endIndex && range.startIndex === range.endIndex;\n        this.range.replaceRange(range);\n        this.draw.render({\n          isSetCursor,\n          isCompute: false,\n          isSubmitHistory: false,\n          curIndex: range.startIndex\n        });\n      }\n    };\n    this._handleDprChange = () => {\n      this.draw.setPageDevicePixel();\n    };\n    this.draw = draw;\n    this.options = draw.getOptions();\n    this.canvasEvent = canvasEvent;\n    this.cursor = null;\n    this.range = draw.getRange();\n    this.previewer = draw.getPreviewer();\n    this.tableTool = draw.getTableTool();\n    this.hyperlinkParticle = draw.getHyperlinkParticle();\n    this.dateParticle = draw.getDateParticle();\n    this.imageParticle = draw.getImageParticle();\n    this.control = draw.getControl();\n    this.dprMediaQueryList = window.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`);\n  }\n  register() {\n    this.cursor = this.draw.getCursor();\n    this.addEvent();\n  }\n  addEvent() {\n    window.addEventListener(\"blur\", this.clearSideEffect);\n    document.addEventListener(\"keyup\", this.setRangeStyle);\n    document.addEventListener(\"click\", this.clearSideEffect);\n    document.addEventListener(\"mouseup\", this.setCanvasEventAbility);\n    document.addEventListener(\"wheel\", this.setPageScale, { passive: false });\n    document.addEventListener(\"visibilitychange\", this._handleVisibilityChange);\n    this.dprMediaQueryList.addEventListener(\"change\", this._handleDprChange);\n  }\n  removeEvent() {\n    window.removeEventListener(\"blur\", this.clearSideEffect);\n    document.removeEventListener(\"keyup\", this.setRangeStyle);\n    document.removeEventListener(\"click\", this.clearSideEffect);\n    document.removeEventListener(\"mouseup\", this.setCanvasEventAbility);\n    document.removeEventListener(\"wheel\", this.setPageScale);\n    document.removeEventListener(\"visibilitychange\", this._handleVisibilityChange);\n    this.dprMediaQueryList.removeEventListener(\"change\", this._handleDprChange);\n  }\n  watchCursorActive() {\n    if (!this.range.getIsCollapsed())\n      return;\n    setTimeout(() => {\n      var _a, _b;\n      if (!((_a = this.cursor) == null ? void 0 : _a.getAgentIsActive())) {\n        (_b = this.cursor) == null ? void 0 : _b.drawCursor({\n          isFocus: false,\n          isBlink: false\n        });\n      }\n    });\n  }\n}\nclass HistoryManager {\n  constructor(draw) {\n    this.undoStack = [];\n    this.redoStack = [];\n    this.maxRecordCount = draw.getOptions().historyMaxRecordCount + 1;\n  }\n  undo() {\n    if (this.undoStack.length > 1) {\n      const pop = this.undoStack.pop();\n      this.redoStack.push(pop);\n      if (this.undoStack.length) {\n        this.undoStack[this.undoStack.length - 1]();\n      }\n    }\n  }\n  redo() {\n    if (this.redoStack.length) {\n      const pop = this.redoStack.pop();\n      this.undoStack.push(pop);\n      pop();\n    }\n  }\n  execute(fn) {\n    this.undoStack.push(fn);\n    if (this.redoStack.length) {\n      this.redoStack = [];\n    }\n    while (this.undoStack.length > this.maxRecordCount) {\n      this.undoStack.shift();\n    }\n  }\n  isCanUndo() {\n    return this.undoStack.length > 1;\n  }\n  isCanRedo() {\n    return !!this.redoStack.length;\n  }\n  isStackEmpty() {\n    return !this.undoStack.length && !this.redoStack.length;\n  }\n  recovery() {\n    this.undoStack = [];\n    this.redoStack = [];\n  }\n  popUndo() {\n    return this.undoStack.pop();\n  }\n}\nclass Position {\n  constructor(draw) {\n    this.positionList = [];\n    this.floatPositionList = [];\n    this.cursorPosition = null;\n    this.positionContext = {\n      isTable: false,\n      isControl: false\n    };\n    this.draw = draw;\n    this.eventBus = draw.getEventBus();\n    this.options = draw.getOptions();\n  }\n  getFloatPositionList() {\n    return this.floatPositionList;\n  }\n  getTablePositionList(sourceElementList) {\n    const { index: index2, trIndex, tdIndex } = this.positionContext;\n    return sourceElementList[index2].trList[trIndex].tdList[tdIndex].positionList || [];\n  }\n  getPositionList() {\n    return this.positionContext.isTable ? this.getTablePositionList(this.draw.getOriginalElementList()) : this.getOriginalPositionList();\n  }\n  getMainPositionList() {\n    return this.positionContext.isTable ? this.getTablePositionList(this.draw.getOriginalMainElementList()) : this.positionList;\n  }\n  getOriginalPositionList() {\n    const zoneManager = this.draw.getZone();\n    if (zoneManager.isHeaderActive()) {\n      const header = this.draw.getHeader();\n      return header.getPositionList();\n    }\n    if (zoneManager.isFooterActive()) {\n      const footer = this.draw.getFooter();\n      return footer.getPositionList();\n    }\n    return this.positionList;\n  }\n  getOriginalMainPositionList() {\n    return this.positionList;\n  }\n  getSelectionPositionList() {\n    const { startIndex, endIndex } = this.draw.getRange().getRange();\n    if (startIndex === endIndex)\n      return null;\n    const positionList = this.getPositionList();\n    return positionList.slice(startIndex + 1, endIndex + 1);\n  }\n  setPositionList(payload) {\n    this.positionList = payload;\n  }\n  setFloatPositionList(payload) {\n    this.floatPositionList = payload;\n  }\n  computePageRowPosition(payload) {\n    const { positionList, rowList, pageNo, startX, startY, startRowIndex, startIndex, innerWidth, zone: zone2 } = payload;\n    const { scale, table: { tdPadding } } = this.options;\n    let x = startX;\n    let y = startY;\n    let index2 = startIndex;\n    for (let i = 0; i < rowList.length; i++) {\n      const curRow = rowList[i];\n      if (!curRow.isSurround) {\n        const curRowWidth = curRow.width + (curRow.offsetX || 0);\n        if (curRow.rowFlex === RowFlex.CENTER) {\n          x += (innerWidth - curRowWidth) / 2;\n        } else if (curRow.rowFlex === RowFlex.RIGHT) {\n          x += innerWidth - curRowWidth;\n        }\n      }\n      x += curRow.offsetX || 0;\n      const tablePreX = x;\n      const tablePreY = y;\n      for (let j = 0; j < curRow.elementList.length; j++) {\n        const element = curRow.elementList[j];\n        const metrics = element.metrics;\n        const offsetY = element.imgDisplay !== ImageDisplay.INLINE && element.type === ElementType.IMAGE || element.type === ElementType.LATEX ? curRow.ascent - metrics.height : curRow.ascent;\n        if (element.left) {\n          x += element.left;\n        }\n        const positionItem = {\n          pageNo,\n          index: index2,\n          value: element.value,\n          rowIndex: startRowIndex + i,\n          rowNo: i,\n          metrics,\n          left: element.left || 0,\n          ascent: offsetY,\n          lineHeight: curRow.height,\n          isFirstLetter: j === 0,\n          isLastLetter: j === curRow.elementList.length - 1,\n          coordinate: {\n            leftTop: [x, y],\n            leftBottom: [x, y + curRow.height],\n            rightTop: [x + metrics.width, y],\n            rightBottom: [x + metrics.width, y + curRow.height]\n          }\n        };\n        if (element.imgDisplay === ImageDisplay.SURROUND || element.imgDisplay === ImageDisplay.FLOAT_TOP || element.imgDisplay === ImageDisplay.FLOAT_BOTTOM) {\n          const prePosition = positionList[positionList.length - 1];\n          if (prePosition) {\n            positionItem.metrics = prePosition.metrics;\n            positionItem.coordinate = prePosition.coordinate;\n          }\n          if (!element.imgFloatPosition) {\n            element.imgFloatPosition = {\n              x,\n              y,\n              pageNo\n            };\n          }\n          this.floatPositionList.push({\n            pageNo,\n            element,\n            position: positionItem,\n            isTable: payload.isTable,\n            index: payload.index,\n            tdIndex: payload.tdIndex,\n            trIndex: payload.trIndex,\n            tdValueIndex: index2,\n            zone: zone2\n          });\n        }\n        positionList.push(positionItem);\n        index2++;\n        x += metrics.width;\n        if (element.type === ElementType.TABLE) {\n          const tdPaddingWidth = tdPadding[1] + tdPadding[3];\n          const tdPaddingHeight = tdPadding[0] + tdPadding[2];\n          for (let t = 0; t < element.trList.length; t++) {\n            const tr = element.trList[t];\n            for (let d = 0; d < tr.tdList.length; d++) {\n              const td = tr.tdList[d];\n              td.positionList = [];\n              const rowList2 = td.rowList;\n              const drawRowResult = this.computePageRowPosition({\n                positionList: td.positionList,\n                rowList: rowList2,\n                pageNo,\n                startRowIndex: 0,\n                startIndex: 0,\n                startX: (td.x + tdPadding[3]) * scale + tablePreX,\n                startY: (td.y + tdPadding[0]) * scale + tablePreY,\n                innerWidth: (td.width - tdPaddingWidth) * scale,\n                isTable: true,\n                index: index2 - 1,\n                tdIndex: d,\n                trIndex: t,\n                zone: zone2\n              });\n              if (td.verticalAlign === VerticalAlign.MIDDLE || td.verticalAlign === VerticalAlign.BOTTOM) {\n                const rowsHeight = rowList2.reduce((pre, cur) => pre + cur.height, 0);\n                const blankHeight = (td.height - tdPaddingHeight) * scale - rowsHeight;\n                const offsetHeight = td.verticalAlign === VerticalAlign.MIDDLE ? blankHeight / 2 : blankHeight;\n                if (Math.floor(offsetHeight) > 0) {\n                  td.positionList.forEach((tdPosition) => {\n                    const { coordinate: { leftTop, leftBottom, rightBottom, rightTop } } = tdPosition;\n                    leftTop[1] += offsetHeight;\n                    leftBottom[1] += offsetHeight;\n                    rightBottom[1] += offsetHeight;\n                    rightTop[1] += offsetHeight;\n                  });\n                }\n              }\n              x = drawRowResult.x;\n              y = drawRowResult.y;\n            }\n          }\n          x = tablePreX;\n          y = tablePreY;\n        }\n      }\n      x = startX;\n      y += curRow.height;\n    }\n    return { x, y, index: index2 };\n  }\n  computePositionList() {\n    var _a;\n    this.positionList = [];\n    const innerWidth = this.draw.getInnerWidth();\n    const pageRowList = this.draw.getPageRowList();\n    const margins = this.draw.getMargins();\n    const startX = margins[3];\n    const header = this.draw.getHeader();\n    const extraHeight = header.getExtraHeight();\n    const startY = margins[0] + extraHeight;\n    let startRowIndex = 0;\n    for (let i = 0; i < pageRowList.length; i++) {\n      const rowList = pageRowList[i];\n      const startIndex = (_a = rowList[0]) == null ? void 0 : _a.startIndex;\n      this.computePageRowPosition({\n        positionList: this.positionList,\n        rowList,\n        pageNo: i,\n        startRowIndex,\n        startIndex,\n        startX,\n        startY,\n        innerWidth\n      });\n      startRowIndex += rowList.length;\n    }\n  }\n  computeRowPosition(payload) {\n    const { row, innerWidth } = payload;\n    const positionList = [];\n    this.computePageRowPosition({\n      positionList,\n      innerWidth,\n      rowList: [deepClone(row)],\n      pageNo: 0,\n      startX: 0,\n      startY: 0,\n      startIndex: 0,\n      startRowIndex: 0\n    });\n    return positionList;\n  }\n  setCursorPosition(position) {\n    this.cursorPosition = position;\n  }\n  getCursorPosition() {\n    return this.cursorPosition;\n  }\n  getPositionContext() {\n    return this.positionContext;\n  }\n  setPositionContext(payload) {\n    this.eventBus.emit(\"positionContextChange\", {\n      value: payload,\n      oldValue: this.positionContext\n    });\n    this.positionContext = payload;\n  }\n  getPositionByXY(payload) {\n    var _a, _b, _c, _d, _e;\n    const { x, y, isTable } = payload;\n    let { elementList, positionList } = payload;\n    if (!elementList) {\n      elementList = this.draw.getOriginalElementList();\n    }\n    if (!positionList) {\n      positionList = this.getOriginalPositionList();\n    }\n    const zoneManager = this.draw.getZone();\n    const curPageNo = (_a = payload.pageNo) != null ? _a : this.draw.getPageNo();\n    const isMainActive = zoneManager.isMainActive();\n    const positionNo = isMainActive ? curPageNo : 0;\n    if (!isTable) {\n      const floatTopPosition = this.getFloatPositionByXY({\n        ...payload,\n        imgDisplays: [ImageDisplay.FLOAT_TOP, ImageDisplay.SURROUND]\n      });\n      if (floatTopPosition)\n        return floatTopPosition;\n    }\n    for (let j = 0; j < positionList.length; j++) {\n      const { index: index2, pageNo, left: left2, isFirstLetter, coordinate: { leftTop, rightTop, leftBottom } } = positionList[j];\n      if (positionNo !== pageNo)\n        continue;\n      if (pageNo > positionNo)\n        break;\n      if (leftTop[0] - left2 <= x && rightTop[0] >= x && leftTop[1] <= y && leftBottom[1] >= y) {\n        let curPositionIndex2 = j;\n        const element = elementList[j];\n        if (element.type === ElementType.TABLE) {\n          for (let t = 0; t < element.trList.length; t++) {\n            const tr = element.trList[t];\n            for (let d = 0; d < tr.tdList.length; d++) {\n              const td = tr.tdList[d];\n              const tablePosition = this.getPositionByXY({\n                x,\n                y,\n                td,\n                pageNo: curPageNo,\n                tablePosition: positionList[j],\n                isTable: true,\n                elementList: td.value,\n                positionList: td.positionList\n              });\n              if (~tablePosition.index) {\n                const { index: tdValueIndex, hitLineStartIndex: hitLineStartIndex3 } = tablePosition;\n                const tdValueElement = td.value[tdValueIndex];\n                return {\n                  index: index2,\n                  isCheckbox: tablePosition.isCheckbox || tdValueElement.type === ElementType.CHECKBOX || tdValueElement.controlComponent === ControlComponent.CHECKBOX,\n                  isRadio: tdValueElement.type === ElementType.RADIO || tdValueElement.controlComponent === ControlComponent.RADIO,\n                  isControl: !!tdValueElement.controlId,\n                  isImage: tablePosition.isImage,\n                  isDirectHit: tablePosition.isDirectHit,\n                  isTable: true,\n                  tdIndex: d,\n                  trIndex: t,\n                  tdValueIndex,\n                  tdId: td.id,\n                  trId: tr.id,\n                  tableId: element.id,\n                  hitLineStartIndex: hitLineStartIndex3\n                };\n              }\n            }\n          }\n        }\n        if (element.type === ElementType.IMAGE || element.type === ElementType.LATEX) {\n          return {\n            index: curPositionIndex2,\n            isDirectHit: true,\n            isImage: true\n          };\n        }\n        if (element.type === ElementType.CHECKBOX || element.controlComponent === ControlComponent.CHECKBOX) {\n          return {\n            index: curPositionIndex2,\n            isDirectHit: true,\n            isCheckbox: true\n          };\n        }\n        if (element.type === ElementType.RADIO || element.controlComponent === ControlComponent.RADIO) {\n          return {\n            index: curPositionIndex2,\n            isDirectHit: true,\n            isRadio: true\n          };\n        }\n        let hitLineStartIndex2;\n        if (elementList[index2].value !== ZERO) {\n          const valueWidth = rightTop[0] - leftTop[0];\n          if (x < leftTop[0] + valueWidth / 2) {\n            curPositionIndex2 = j - 1;\n            if (isFirstLetter) {\n              hitLineStartIndex2 = j;\n            }\n          }\n        }\n        return {\n          isDirectHit: true,\n          hitLineStartIndex: hitLineStartIndex2,\n          index: curPositionIndex2,\n          isControl: !!element.controlId\n        };\n      }\n    }\n    if (!isTable) {\n      const floatBottomPosition = this.getFloatPositionByXY({\n        ...payload,\n        imgDisplays: [ImageDisplay.FLOAT_BOTTOM]\n      });\n      if (floatBottomPosition)\n        return floatBottomPosition;\n    }\n    let isLastArea = false;\n    let curPositionIndex = -1;\n    let hitLineStartIndex;\n    if (isTable) {\n      const { scale } = this.options;\n      const { td, tablePosition } = payload;\n      if (td && tablePosition) {\n        const { leftTop } = tablePosition.coordinate;\n        const tdX = td.x * scale + leftTop[0];\n        const tdY = td.y * scale + leftTop[1];\n        const tdWidth = td.width * scale;\n        const tdHeight = td.height * scale;\n        if (!(tdX < x && x < tdX + tdWidth && tdY < y && y < tdY + tdHeight)) {\n          return {\n            index: curPositionIndex\n          };\n        }\n      }\n    }\n    const lastLetterList = positionList.filter((p) => p.isLastLetter && p.pageNo === positionNo);\n    for (let j = 0; j < lastLetterList.length; j++) {\n      const { index: index2, rowNo, coordinate: { leftTop, leftBottom } } = lastLetterList[j];\n      if (y > leftTop[1] && y <= leftBottom[1]) {\n        const headIndex = positionList.findIndex((p) => p.pageNo === positionNo && p.rowNo === rowNo);\n        const headElement = elementList[headIndex];\n        const headPosition = positionList[headIndex];\n        const headStartX = headElement.listStyle === ListStyle.CHECKBOX ? this.options.margins[3] : headPosition.coordinate.leftTop[0];\n        if (x < headStartX) {\n          if (~headIndex) {\n            if (headPosition.value === ZERO) {\n              curPositionIndex = headIndex;\n            } else {\n              curPositionIndex = headIndex - 1;\n              hitLineStartIndex = headIndex;\n            }\n          } else {\n            curPositionIndex = index2;\n          }\n        } else {\n          if (headElement.listStyle === ListStyle.CHECKBOX && x < leftTop[0]) {\n            return {\n              index: headIndex,\n              isDirectHit: true,\n              isCheckbox: true\n            };\n          }\n          curPositionIndex = index2;\n        }\n        isLastArea = true;\n        break;\n      }\n    }\n    if (!isLastArea) {\n      const header = this.draw.getHeader();\n      const headerHeight = header.getHeight();\n      const headerBottomY = header.getHeaderTop() + headerHeight;\n      const footer = this.draw.getFooter();\n      const pageHeight = this.draw.getHeight();\n      const footerTopY = pageHeight - (footer.getFooterBottom() + footer.getHeight());\n      if (isMainActive) {\n        if (y < headerBottomY) {\n          return {\n            index: -1,\n            zone: EditorZone.HEADER\n          };\n        }\n        if (y > footerTopY) {\n          return {\n            index: -1,\n            zone: EditorZone.FOOTER\n          };\n        }\n      } else {\n        if (y <= footerTopY && y >= headerBottomY) {\n          return {\n            index: -1,\n            zone: EditorZone.MAIN\n          };\n        }\n      }\n      const margins = this.draw.getMargins();\n      if (y <= margins[1]) {\n        for (let p = 0; p < positionList.length; p++) {\n          const position = positionList[p];\n          if (position.pageNo !== positionNo || position.rowNo !== 0)\n            continue;\n          const { leftTop, rightTop } = position.coordinate;\n          if (x <= margins[3] || x >= leftTop[0] && x <= rightTop[0] || ((_b = positionList[p + 1]) == null ? void 0 : _b.rowNo) !== 0) {\n            return {\n              index: position.index\n            };\n          }\n        }\n      } else {\n        const lastLetter = lastLetterList[lastLetterList.length - 1];\n        if (lastLetter) {\n          const lastRowNo = lastLetter.rowNo;\n          for (let p = 0; p < positionList.length; p++) {\n            const position = positionList[p];\n            if (position.pageNo !== positionNo || position.rowNo !== lastRowNo) {\n              continue;\n            }\n            const { leftTop, rightTop } = position.coordinate;\n            if (x <= margins[3] || x >= leftTop[0] && x <= rightTop[0] || ((_c = positionList[p + 1]) == null ? void 0 : _c.rowNo) !== lastRowNo) {\n              return {\n                index: position.index\n              };\n            }\n          }\n        }\n      }\n      return {\n        index: ((_d = lastLetterList[lastLetterList.length - 1]) == null ? void 0 : _d.index) || positionList.length - 1\n      };\n    }\n    return {\n      hitLineStartIndex,\n      index: curPositionIndex,\n      isControl: !!((_e = elementList[curPositionIndex]) == null ? void 0 : _e.controlId)\n    };\n  }\n  getFloatPositionByXY(payload) {\n    var _a;\n    const { x, y } = payload;\n    const currentPageNo = (_a = payload.pageNo) != null ? _a : this.draw.getPageNo();\n    const currentZone = this.draw.getZone().getZone();\n    for (let f = 0; f < this.floatPositionList.length; f++) {\n      const { position, element, isTable, index: index2, trIndex, tdIndex, tdValueIndex, zone: floatElementZone, pageNo } = this.floatPositionList[f];\n      if (currentPageNo === pageNo && element.type === ElementType.IMAGE && element.imgDisplay && payload.imgDisplays.includes(element.imgDisplay) && (!floatElementZone || floatElementZone === currentZone)) {\n        const imgFloatPosition = element.imgFloatPosition;\n        if (x >= imgFloatPosition.x && x <= imgFloatPosition.x + element.width && y >= imgFloatPosition.y && y <= imgFloatPosition.y + element.height) {\n          if (isTable) {\n            return {\n              index: index2,\n              isDirectHit: true,\n              isImage: true,\n              isTable,\n              trIndex,\n              tdIndex,\n              tdValueIndex,\n              tdId: element.tdId,\n              trId: element.trId,\n              tableId: element.tableId\n            };\n          }\n          return {\n            index: position.index,\n            isDirectHit: true,\n            isImage: true\n          };\n        }\n      }\n    }\n  }\n  adjustPositionContext(payload) {\n    const positionResult = this.getPositionByXY(payload);\n    if (!~positionResult.index)\n      return null;\n    if (positionResult.isControl && this.draw.getMode() !== EditorMode.READONLY) {\n      const { index: index22, isTable: isTable2, trIndex: trIndex2, tdIndex: tdIndex2, tdValueIndex } = positionResult;\n      const control = this.draw.getControl();\n      const { newIndex } = control.moveCursor({\n        index: index22,\n        isTable: isTable2,\n        trIndex: trIndex2,\n        tdIndex: tdIndex2,\n        tdValueIndex\n      });\n      if (isTable2) {\n        positionResult.tdValueIndex = newIndex;\n      } else {\n        positionResult.index = newIndex;\n      }\n    }\n    const { index: index2, isCheckbox, isRadio, isControl, isImage, isDirectHit, isTable, trIndex, tdIndex, tdId, trId, tableId } = positionResult;\n    this.setPositionContext({\n      isTable: isTable || false,\n      isCheckbox: isCheckbox || false,\n      isRadio: isRadio || false,\n      isControl: isControl || false,\n      isImage: isImage || false,\n      isDirectHit: isDirectHit || false,\n      index: index2,\n      trIndex,\n      tdIndex,\n      tdId,\n      trId,\n      tableId\n    });\n    return positionResult;\n  }\n  setSurroundPosition(payload) {\n    var _a;\n    const { pageNo, row, rowElement, rowElementRect, surroundElementList, availableWidth } = payload;\n    let x = rowElementRect.x;\n    let rowIncreaseWidth = 0;\n    if (surroundElementList.length && !getIsBlockElement(rowElement) && !((_a = rowElement.control) == null ? void 0 : _a.minWidth)) {\n      for (let s = 0; s < surroundElementList.length; s++) {\n        const surroundElement = surroundElementList[s];\n        const floatPosition = surroundElement.imgFloatPosition;\n        if (floatPosition.pageNo !== pageNo)\n          continue;\n        const surroundRect = {\n          ...floatPosition,\n          width: surroundElement.width,\n          height: surroundElement.height\n        };\n        if (isRectIntersect(rowElementRect, surroundRect)) {\n          row.isSurround = true;\n          const translateX = surroundRect.width + surroundRect.x - rowElementRect.x;\n          rowElement.left = translateX;\n          row.width += translateX;\n          rowIncreaseWidth += translateX;\n          x = surroundRect.x + surroundRect.width;\n          if (row.width + rowElement.metrics.width > availableWidth) {\n            rowElement.left = 0;\n            row.width -= rowIncreaseWidth;\n            break;\n          }\n        }\n      }\n    }\n    return { x, rowIncreaseWidth };\n  }\n}\nclass RangeManager {\n  constructor(draw) {\n    this.draw = draw;\n    this.options = draw.getOptions();\n    this.listener = draw.getListener();\n    this.eventBus = draw.getEventBus();\n    this.position = draw.getPosition();\n    this.historyManager = draw.getHistoryManager();\n    this.range = {\n      startIndex: -1,\n      endIndex: -1\n    };\n  }\n  getRange() {\n    return this.range;\n  }\n  clearRange() {\n    this.setRange(-1, -1);\n  }\n  getIsCollapsed() {\n    const { startIndex, endIndex } = this.range;\n    return startIndex === endIndex;\n  }\n  getSelection() {\n    const { startIndex, endIndex } = this.range;\n    if (startIndex === endIndex)\n      return null;\n    const elementList = this.draw.getElementList();\n    return elementList.slice(startIndex + 1, endIndex + 1);\n  }\n  getSelectionElementList() {\n    if (this.range.isCrossRowCol) {\n      const rowCol = this.draw.getTableParticle().getRangeRowCol();\n      if (!rowCol)\n        return null;\n      const elementList = [];\n      for (let r = 0; r < rowCol.length; r++) {\n        const row = rowCol[r];\n        for (let c = 0; c < row.length; c++) {\n          const col = row[c];\n          elementList.push(...col.value);\n        }\n      }\n      return elementList;\n    }\n    return this.getSelection();\n  }\n  getTextLikeSelection() {\n    const selection = this.getSelection();\n    if (!selection)\n      return null;\n    return selection.filter((s) => !s.type || TEXTLIKE_ELEMENT_TYPE.includes(s.type));\n  }\n  getTextLikeSelectionElementList() {\n    const selection = this.getSelectionElementList();\n    if (!selection)\n      return null;\n    return selection.filter((s) => !s.type || TEXTLIKE_ELEMENT_TYPE.includes(s.type));\n  }\n  getRangeRow() {\n    const { startIndex, endIndex } = this.range;\n    if (!~startIndex && !~endIndex)\n      return null;\n    const positionList = this.position.getPositionList();\n    const rangeRow = /* @__PURE__ */ new Map();\n    for (let p = startIndex; p < endIndex + 1; p++) {\n      const { pageNo, rowNo } = positionList[p];\n      const rowSet = rangeRow.get(pageNo);\n      if (!rowSet) {\n        rangeRow.set(pageNo, /* @__PURE__ */ new Set([rowNo]));\n      } else {\n        if (!rowSet.has(rowNo)) {\n          rowSet.add(rowNo);\n        }\n      }\n    }\n    return rangeRow;\n  }\n  getRangeRowElementList() {\n    const { startIndex, endIndex, isCrossRowCol } = this.range;\n    if (!~startIndex && !~endIndex)\n      return null;\n    if (isCrossRowCol) {\n      return this.getSelectionElementList();\n    }\n    const rangeRow = this.getRangeRow();\n    if (!rangeRow)\n      return null;\n    const positionList = this.position.getPositionList();\n    const elementList = this.draw.getElementList();\n    const rowElementList = [];\n    for (let p = 0; p < positionList.length; p++) {\n      const position = positionList[p];\n      const rowSet = rangeRow.get(position.pageNo);\n      if (!rowSet)\n        continue;\n      if (rowSet.has(position.rowNo)) {\n        rowElementList.push(elementList[p]);\n      }\n    }\n    return rowElementList;\n  }\n  getRangeParagraph() {\n    const { startIndex, endIndex } = this.range;\n    if (!~startIndex && !~endIndex)\n      return null;\n    const positionList = this.position.getPositionList();\n    const elementList = this.draw.getElementList();\n    const rangeRow = /* @__PURE__ */ new Map();\n    let start = startIndex;\n    while (start >= 0) {\n      const { pageNo, rowNo } = positionList[start];\n      let rowArray = rangeRow.get(pageNo);\n      if (!rowArray) {\n        rowArray = [];\n        rangeRow.set(pageNo, rowArray);\n      }\n      if (!rowArray.includes(rowNo)) {\n        rowArray.unshift(rowNo);\n      }\n      const element = elementList[start];\n      const preElement = elementList[start - 1];\n      if (element.value === ZERO && !element.listWrap || element.listId !== (preElement == null ? void 0 : preElement.listId) || element.titleId !== (preElement == null ? void 0 : preElement.titleId)) {\n        break;\n      }\n      start--;\n    }\n    const isCollapsed = startIndex === endIndex;\n    if (!isCollapsed) {\n      let middle = startIndex + 1;\n      while (middle < endIndex) {\n        const { pageNo, rowNo } = positionList[middle];\n        let rowArray = rangeRow.get(pageNo);\n        if (!rowArray) {\n          rowArray = [];\n          rangeRow.set(pageNo, rowArray);\n        }\n        if (!rowArray.includes(rowNo)) {\n          rowArray.push(rowNo);\n        }\n        middle++;\n      }\n    }\n    let end = endIndex;\n    if (isCollapsed && elementList[startIndex].value === ZERO) {\n      end += 1;\n    }\n    while (end < positionList.length) {\n      const element = elementList[end];\n      const nextElement = elementList[end + 1];\n      if (element.value === ZERO && !element.listWrap || element.listId !== (nextElement == null ? void 0 : nextElement.listId) || element.titleId !== (nextElement == null ? void 0 : nextElement.titleId)) {\n        break;\n      }\n      const { pageNo, rowNo } = positionList[end];\n      let rowArray = rangeRow.get(pageNo);\n      if (!rowArray) {\n        rowArray = [];\n        rangeRow.set(pageNo, rowArray);\n      }\n      if (!rowArray.includes(rowNo)) {\n        rowArray.push(rowNo);\n      }\n      end++;\n    }\n    return rangeRow;\n  }\n  getRangeParagraphInfo() {\n    const { startIndex, endIndex } = this.range;\n    if (!~startIndex && !~endIndex)\n      return null;\n    let startPositionIndex = -1;\n    const rangeElementList = [];\n    const rangeRow = this.getRangeParagraph();\n    if (!rangeRow)\n      return null;\n    const elementList = this.draw.getElementList();\n    const positionList = this.position.getPositionList();\n    for (let p = 0; p < positionList.length; p++) {\n      const position = positionList[p];\n      const rowArray = rangeRow.get(position.pageNo);\n      if (!rowArray)\n        continue;\n      if (rowArray.includes(position.rowNo)) {\n        if (!~startPositionIndex) {\n          startPositionIndex = position.index;\n        }\n        rangeElementList.push(elementList[p]);\n      }\n    }\n    if (!rangeElementList.length)\n      return null;\n    return {\n      elementList: rangeElementList,\n      startIndex: startPositionIndex\n    };\n  }\n  getRangeParagraphElementList() {\n    var _a;\n    return ((_a = this.getRangeParagraphInfo()) == null ? void 0 : _a.elementList) || null;\n  }\n  getRangeTableElement() {\n    const positionContext = this.position.getPositionContext();\n    if (!positionContext.isTable)\n      return null;\n    const originalElementList = this.draw.getOriginalElementList();\n    return originalElementList[positionContext.index];\n  }\n  getIsSelectAll() {\n    const elementList = this.draw.getElementList();\n    const { startIndex, endIndex } = this.range;\n    return startIndex === 0 && elementList.length - 1 === endIndex && !this.position.getPositionContext().isTable;\n  }\n  getIsPointInRange(x, y) {\n    const { startIndex, endIndex } = this.range;\n    const positionList = this.position.getPositionList();\n    for (let p = startIndex + 1; p <= endIndex; p++) {\n      const position = positionList[p];\n      if (!position)\n        break;\n      const { coordinate: { leftTop, rightBottom } } = positionList[p];\n      if (x >= leftTop[0] && x <= rightBottom[0] && y >= leftTop[1] && y <= rightBottom[1]) {\n        return true;\n      }\n    }\n    return false;\n  }\n  getKeywordRangeList(payload) {\n    const searchMatchList = this.draw.getSearch().getMatchList(payload, this.draw.getOriginalElementList());\n    const searchRangeMap = /* @__PURE__ */ new Map();\n    for (const searchMatch of searchMatchList) {\n      const searchRange = searchRangeMap.get(searchMatch.groupId);\n      if (searchRange) {\n        searchRange.endIndex += 1;\n      } else {\n        const { type, groupId, tableId, index: index2, tdIndex, trIndex } = searchMatch;\n        const range = {\n          startIndex: index2 - 1,\n          endIndex: index2\n        };\n        if (type === EditorContext.TABLE) {\n          range.tableId = tableId;\n          range.startTdIndex = tdIndex;\n          range.endTdIndex = tdIndex;\n          range.startTrIndex = trIndex;\n          range.endTrIndex = trIndex;\n        }\n        searchRangeMap.set(groupId, range);\n      }\n    }\n    const rangeList = [];\n    searchRangeMap.forEach((searchRange) => {\n      rangeList.push(searchRange);\n    });\n    return rangeList;\n  }\n  getIsCanInput() {\n    const { startIndex, endIndex } = this.getRange();\n    if (!~startIndex && !~endIndex)\n      return false;\n    if (startIndex === endIndex)\n      return true;\n    const elementList = this.draw.getElementList();\n    const startElement = elementList[startIndex];\n    const endElement = elementList[endIndex];\n    return !startElement.controlId && !endElement.controlId || (!startElement.controlId || startElement.controlComponent === ControlComponent.POSTFIX) && (!endElement.controlId || endElement.controlComponent === ControlComponent.POSTFIX) || !!startElement.controlId && endElement.controlId === startElement.controlId && endElement.controlComponent !== ControlComponent.POSTFIX;\n  }\n  setRange(startIndex, endIndex, tableId, startTdIndex, endTdIndex, startTrIndex, endTrIndex) {\n    this.range.startIndex = startIndex;\n    this.range.endIndex = endIndex;\n    this.range.tableId = tableId;\n    this.range.startTdIndex = startTdIndex;\n    this.range.endTdIndex = endTdIndex;\n    this.range.startTrIndex = startTrIndex;\n    this.range.endTrIndex = endTrIndex;\n    this.range.isCrossRowCol = !!(startTdIndex || endTdIndex || startTrIndex || endTrIndex);\n    this.range.zone = this.draw.getZone().getZone();\n    const control = this.draw.getControl();\n    if (~startIndex && ~endIndex) {\n      const elementList = this.draw.getElementList();\n      const element = elementList[startIndex];\n      if (element == null ? void 0 : element.controlId) {\n        control.initControl();\n        return;\n      }\n    }\n    control.destroyControl();\n  }\n  replaceRange(range) {\n    this.setRange(range.startIndex, range.endIndex, range.tableId, range.startTdIndex, range.endTdIndex, range.startTrIndex, range.endTrIndex);\n  }\n  setRangeStyle() {\n    var _a, _b;\n    const rangeStyleChangeListener = this.listener.rangeStyleChange;\n    const isSubscribeRangeStyleChange = this.eventBus.isSubscribe(\"rangeStyleChange\");\n    if (!rangeStyleChangeListener && !isSubscribeRangeStyleChange)\n      return;\n    const { startIndex, endIndex, isCrossRowCol } = this.range;\n    if (!~startIndex && !~endIndex)\n      return;\n    let curElement;\n    if (isCrossRowCol) {\n      const originalElementList = this.draw.getOriginalElementList();\n      const positionContext = this.position.getPositionContext();\n      curElement = originalElementList[positionContext.index];\n    } else {\n      const index2 = ~endIndex ? endIndex : 0;\n      const elementList = this.draw.getElementList();\n      curElement = getAnchorElement(elementList, index2);\n    }\n    if (!curElement)\n      return;\n    const curElementList = this.getSelection() || [curElement];\n    const type = curElement.type || ElementType.TEXT;\n    const font = curElement.font || this.options.defaultFont;\n    const size = curElement.size || this.options.defaultSize;\n    const bold = !~curElementList.findIndex((el) => !el.bold);\n    const italic = !~curElementList.findIndex((el) => !el.italic);\n    const underline = !~curElementList.findIndex((el) => {\n      var _a2;\n      return !el.underline && !((_a2 = el.control) == null ? void 0 : _a2.underline);\n    });\n    const strikeout = !~curElementList.findIndex((el) => !el.strikeout);\n    const color = curElement.color || null;\n    const highlight = curElement.highlight || null;\n    const rowFlex = curElement.rowFlex || null;\n    const rowMargin = (_a = curElement.rowMargin) != null ? _a : this.options.defaultRowMargin;\n    const dashArray = curElement.dashArray || [];\n    const level = curElement.level || null;\n    const listType = curElement.listType || null;\n    const listStyle = curElement.listStyle || null;\n    const textDecoration = underline ? curElement.textDecoration || null : null;\n    const painter = !!this.draw.getPainterStyle();\n    const undo = this.historyManager.isCanUndo();\n    const redo = this.historyManager.isCanRedo();\n    const groupIds = curElement.groupIds || null;\n    const extension = (_b = curElement.extension) != null ? _b : null;\n    const rangeStyle = {\n      type,\n      undo,\n      redo,\n      painter,\n      font,\n      size,\n      bold,\n      italic,\n      underline,\n      strikeout,\n      color,\n      highlight,\n      rowFlex,\n      rowMargin,\n      dashArray,\n      level,\n      listType,\n      listStyle,\n      groupIds,\n      textDecoration,\n      extension\n    };\n    if (rangeStyleChangeListener) {\n      rangeStyleChangeListener(rangeStyle);\n    }\n    if (isSubscribeRangeStyleChange) {\n      this.eventBus.emit(\"rangeStyleChange\", rangeStyle);\n    }\n  }\n  recoveryRangeStyle() {\n    const rangeStyleChangeListener = this.listener.rangeStyleChange;\n    const isSubscribeRangeStyleChange = this.eventBus.isSubscribe(\"rangeStyleChange\");\n    if (!rangeStyleChangeListener && !isSubscribeRangeStyleChange)\n      return;\n    const font = this.options.defaultFont;\n    const size = this.options.defaultSize;\n    const rowMargin = this.options.defaultRowMargin;\n    const painter = !!this.draw.getPainterStyle();\n    const undo = this.historyManager.isCanUndo();\n    const redo = this.historyManager.isCanRedo();\n    const rangeStyle = {\n      type: null,\n      undo,\n      redo,\n      painter,\n      font,\n      size,\n      bold: false,\n      italic: false,\n      underline: false,\n      strikeout: false,\n      color: null,\n      highlight: null,\n      rowFlex: null,\n      rowMargin,\n      dashArray: [],\n      level: null,\n      listType: null,\n      listStyle: null,\n      groupIds: null,\n      textDecoration: null,\n      extension: null\n    };\n    if (rangeStyleChangeListener) {\n      rangeStyleChangeListener(rangeStyle);\n    }\n    if (isSubscribeRangeStyleChange) {\n      this.eventBus.emit(\"rangeStyleChange\", rangeStyle);\n    }\n  }\n  shrinkBoundary(context = {}) {\n    const elementList = context.elementList || this.draw.getElementList();\n    const range = context.range || this.getRange();\n    const { startIndex, endIndex } = range;\n    if (!~startIndex && !~endIndex)\n      return;\n    const startElement = elementList[startIndex];\n    const endElement = elementList[endIndex];\n    if (startIndex === endIndex) {\n      if (startElement.controlComponent === ControlComponent.PLACEHOLDER) {\n        let index2 = startIndex - 1;\n        while (index2 > 0) {\n          const preElement = elementList[index2];\n          if (preElement.controlId !== startElement.controlId || preElement.controlComponent === ControlComponent.PREFIX) {\n            range.startIndex = index2;\n            range.endIndex = index2;\n            break;\n          }\n          index2--;\n        }\n      }\n    } else {\n      if (startElement.controlComponent === ControlComponent.PLACEHOLDER || endElement.controlComponent === ControlComponent.PLACEHOLDER) {\n        let index2 = endIndex - 1;\n        while (index2 > 0) {\n          const preElement = elementList[index2];\n          if (preElement.controlId !== endElement.controlId || preElement.controlComponent === ControlComponent.PREFIX) {\n            range.startIndex = index2;\n            range.endIndex = index2;\n            return;\n          }\n          index2--;\n        }\n      }\n      if (startElement.controlComponent === ControlComponent.PREFIX) {\n        let index2 = startIndex + 1;\n        while (index2 < elementList.length) {\n          const nextElement = elementList[index2];\n          if (nextElement.controlId !== startElement.controlId || nextElement.controlComponent === ControlComponent.VALUE) {\n            range.startIndex = index2 - 1;\n            break;\n          } else if (nextElement.controlComponent === ControlComponent.PLACEHOLDER) {\n            range.startIndex = index2 - 1;\n            range.endIndex = index2 - 1;\n            return;\n          }\n          index2++;\n        }\n      }\n      if (endElement.controlComponent !== ControlComponent.VALUE) {\n        let index2 = startIndex - 1;\n        while (index2 > 0) {\n          const preElement = elementList[index2];\n          if (preElement.controlId !== startElement.controlId || preElement.controlComponent === ControlComponent.VALUE) {\n            range.startIndex = index2;\n            break;\n          } else if (preElement.controlComponent === ControlComponent.PLACEHOLDER) {\n            range.startIndex = index2;\n            range.endIndex = index2;\n            return;\n          }\n          index2--;\n        }\n      }\n    }\n  }\n  render(ctx, x, y, width, height) {\n    ctx.save();\n    ctx.globalAlpha = this.options.rangeAlpha;\n    ctx.fillStyle = this.options.rangeColor;\n    ctx.fillRect(x, y, width, height);\n    ctx.restore();\n  }\n  toString() {\n    const selection = this.getTextLikeSelection();\n    if (!selection)\n      return \"\";\n    return selection.map((s) => s.value).join(\"\").replace(new RegExp(ZERO, \"g\"), \"\");\n  }\n}\nclass Background {\n  constructor(draw) {\n    this.draw = draw;\n    this.options = draw.getOptions();\n    this.imageCache = /* @__PURE__ */ new Map();\n  }\n  _renderBackgroundColor(ctx, color, width, height) {\n    ctx.save();\n    ctx.fillStyle = color;\n    ctx.fillRect(0, 0, width, height);\n    ctx.restore();\n  }\n  _drawImage(ctx, imageElement, width, height) {\n    const { background, scale } = this.options;\n    if (background.size === BackgroundSize.CONTAIN) {\n      const imageWidth = imageElement.width * scale;\n      const imageHeight = imageElement.height * scale;\n      if (!background.repeat || background.repeat === BackgroundRepeat.NO_REPEAT) {\n        ctx.drawImage(imageElement, 0, 0, imageWidth, imageHeight);\n      } else {\n        let startX = 0;\n        let startY = 0;\n        const repeatXCount = background.repeat === BackgroundRepeat.REPEAT || background.repeat === BackgroundRepeat.REPEAT_X ? Math.ceil(width * scale / imageWidth) : 1;\n        const repeatYCount = background.repeat === BackgroundRepeat.REPEAT || background.repeat === BackgroundRepeat.REPEAT_Y ? Math.ceil(height * scale / imageHeight) : 1;\n        for (let x = 0; x < repeatXCount; x++) {\n          for (let y = 0; y < repeatYCount; y++) {\n            ctx.drawImage(imageElement, startX, startY, imageWidth, imageHeight);\n            startY += imageHeight;\n          }\n          startY = 0;\n          startX += imageWidth;\n        }\n      }\n    } else {\n      ctx.drawImage(imageElement, 0, 0, width * scale, height * scale);\n    }\n  }\n  _renderBackgroundImage(ctx, width, height) {\n    const { background } = this.options;\n    const imageElementCache = this.imageCache.get(background.image);\n    if (imageElementCache) {\n      this._drawImage(ctx, imageElementCache, width, height);\n    } else {\n      const img = new Image();\n      img.setAttribute(\"crossOrigin\", \"Anonymous\");\n      img.src = background.image;\n      img.onload = () => {\n        this.imageCache.set(background.image, img);\n        this._drawImage(ctx, img, width, height);\n        this.draw.render({\n          isCompute: false,\n          isSubmitHistory: false\n        });\n      };\n    }\n  }\n  render(ctx, pageNo) {\n    const { background: { image, color, applyPageNumbers } } = this.options;\n    if (image && (!(applyPageNumbers == null ? void 0 : applyPageNumbers.length) || applyPageNumbers.includes(pageNo))) {\n      const { width, height } = this.options;\n      this._renderBackgroundImage(ctx, width, height);\n    } else {\n      const width = this.draw.getCanvasWidth(pageNo);\n      const height = this.draw.getCanvasHeight(pageNo);\n      this._renderBackgroundColor(ctx, color, width, height);\n    }\n  }\n}\nclass AbstractRichText {\n  constructor() {\n    this.fillRect = this.clearFillInfo();\n  }\n  clearFillInfo() {\n    this.fillColor = void 0;\n    this.fillDecorationStyle = void 0;\n    this.fillRect = {\n      x: 0,\n      y: 0,\n      width: 0,\n      height: 0\n    };\n    return this.fillRect;\n  }\n  recordFillInfo(ctx, x, y, width, height, color, decorationStyle) {\n    const isFirstRecord = !this.fillRect.width;\n    if (!isFirstRecord && (this.fillColor !== color || this.fillDecorationStyle !== decorationStyle)) {\n      this.render(ctx);\n      this.clearFillInfo();\n      this.recordFillInfo(ctx, x, y, width, height, color, decorationStyle);\n      return;\n    }\n    if (isFirstRecord) {\n      this.fillRect.x = x;\n      this.fillRect.y = y;\n    }\n    if (height && this.fillRect.height < height) {\n      this.fillRect.height = height;\n    }\n    this.fillRect.width += width;\n    this.fillColor = color;\n    this.fillDecorationStyle = decorationStyle;\n  }\n}\nclass Highlight extends AbstractRichText {\n  constructor(draw) {\n    super();\n    this.options = draw.getOptions();\n  }\n  render(ctx) {\n    if (!this.fillRect.width)\n      return;\n    const { highlightAlpha } = this.options;\n    const { x, y, width, height } = this.fillRect;\n    ctx.save();\n    ctx.globalAlpha = highlightAlpha;\n    ctx.fillStyle = this.fillColor;\n    ctx.fillRect(x, y, width, height);\n    ctx.restore();\n    this.clearFillInfo();\n  }\n}\nclass Margin {\n  constructor(draw) {\n    this.draw = draw;\n    this.options = draw.getOptions();\n  }\n  render(ctx, pageNo) {\n    const { marginIndicatorColor, pageMode } = this.options;\n    const width = this.draw.getWidth();\n    const height = pageMode === PageMode.CONTINUITY ? this.draw.getCanvasHeight(pageNo) : this.draw.getHeight();\n    const margins = this.draw.getMargins();\n    const marginIndicatorSize = this.draw.getMarginIndicatorSize();\n    ctx.save();\n    ctx.translate(0.5, 0.5);\n    ctx.strokeStyle = marginIndicatorColor;\n    ctx.beginPath();\n    const leftTopPoint = [margins[3], margins[0]];\n    const rightTopPoint = [width - margins[1], margins[0]];\n    const leftBottomPoint = [margins[3], height - margins[2]];\n    const rightBottomPoint = [\n      width - margins[1],\n      height - margins[2]\n    ];\n    ctx.moveTo(leftTopPoint[0] - marginIndicatorSize, leftTopPoint[1]);\n    ctx.lineTo(...leftTopPoint);\n    ctx.lineTo(leftTopPoint[0], leftTopPoint[1] - marginIndicatorSize);\n    ctx.moveTo(rightTopPoint[0] + marginIndicatorSize, rightTopPoint[1]);\n    ctx.lineTo(...rightTopPoint);\n    ctx.lineTo(rightTopPoint[0], rightTopPoint[1] - marginIndicatorSize);\n    ctx.moveTo(leftBottomPoint[0] - marginIndicatorSize, leftBottomPoint[1]);\n    ctx.lineTo(...leftBottomPoint);\n    ctx.lineTo(leftBottomPoint[0], leftBottomPoint[1] + marginIndicatorSize);\n    ctx.moveTo(rightBottomPoint[0] + marginIndicatorSize, rightBottomPoint[1]);\n    ctx.lineTo(...rightBottomPoint);\n    ctx.lineTo(rightBottomPoint[0], rightBottomPoint[1] + marginIndicatorSize);\n    ctx.stroke();\n    ctx.restore();\n  }\n}\nclass Search {\n  constructor(draw) {\n    this.draw = draw;\n    this.options = draw.getOptions();\n    this.position = draw.getPosition();\n    this.searchNavigateIndex = null;\n    this.searchKeyword = null;\n    this.searchMatchList = [];\n  }\n  getSearchKeyword() {\n    return this.searchKeyword;\n  }\n  setSearchKeyword(payload) {\n    this.searchKeyword = payload;\n    this.searchNavigateIndex = null;\n  }\n  searchNavigatePre() {\n    if (!this.searchMatchList.length || !this.searchKeyword)\n      return null;\n    if (this.searchNavigateIndex === null) {\n      this.searchNavigateIndex = 0;\n    } else {\n      let index2 = this.searchNavigateIndex - 1;\n      let isExistPre = false;\n      const searchNavigateId = this.searchMatchList[this.searchNavigateIndex].groupId;\n      while (index2 >= 0) {\n        const match = this.searchMatchList[index2];\n        if (searchNavigateId !== match.groupId) {\n          isExistPre = true;\n          this.searchNavigateIndex = index2 - (this.searchKeyword.length - 1);\n          break;\n        }\n        index2--;\n      }\n      if (!isExistPre) {\n        const lastSearchMatch = this.searchMatchList[this.searchMatchList.length - 1];\n        if (lastSearchMatch.groupId === searchNavigateId)\n          return null;\n        this.searchNavigateIndex = this.searchMatchList.length - 1 - (this.searchKeyword.length - 1);\n      }\n    }\n    return this.searchNavigateIndex;\n  }\n  searchNavigateNext() {\n    if (!this.searchMatchList.length || !this.searchKeyword)\n      return null;\n    if (this.searchNavigateIndex === null) {\n      this.searchNavigateIndex = 0;\n    } else {\n      let index2 = this.searchNavigateIndex + 1;\n      let isExistNext = false;\n      const searchNavigateId = this.searchMatchList[this.searchNavigateIndex].groupId;\n      while (index2 < this.searchMatchList.length) {\n        const match = this.searchMatchList[index2];\n        if (searchNavigateId !== match.groupId) {\n          isExistNext = true;\n          this.searchNavigateIndex = index2;\n          break;\n        }\n        index2++;\n      }\n      if (!isExistNext) {\n        const firstSearchMatch = this.searchMatchList[0];\n        if (firstSearchMatch.groupId === searchNavigateId)\n          return null;\n        this.searchNavigateIndex = 0;\n      }\n    }\n    return this.searchNavigateIndex;\n  }\n  searchNavigateScrollIntoView(position) {\n    const { coordinate: { leftTop, leftBottom, rightTop }, pageNo } = position;\n    const height = this.draw.getHeight();\n    const pageGap = this.draw.getPageGap();\n    const preY = pageNo * (height + pageGap);\n    const anchor = document.createElement(\"div\");\n    anchor.style.position = \"absolute\";\n    const ANCHOR_OVERFLOW_SIZE = 50;\n    anchor.style.width = `${rightTop[0] - leftTop[0] + ANCHOR_OVERFLOW_SIZE}px`;\n    anchor.style.height = `${leftBottom[1] - leftTop[1] + ANCHOR_OVERFLOW_SIZE}px`;\n    anchor.style.left = `${leftTop[0]}px`;\n    anchor.style.top = `${leftTop[1] + preY}px`;\n    this.draw.getContainer().append(anchor);\n    anchor.scrollIntoView(false);\n    anchor.remove();\n  }\n  getSearchNavigateIndexList() {\n    if (this.searchNavigateIndex === null || !this.searchKeyword)\n      return [];\n    return new Array(this.searchKeyword.length).fill(this.searchNavigateIndex).map((navigate, index2) => navigate + index2);\n  }\n  getSearchMatchList() {\n    return this.searchMatchList;\n  }\n  getSearchNavigateInfo() {\n    if (!this.searchKeyword || !this.searchMatchList.length)\n      return null;\n    const index2 = this.searchNavigateIndex !== null ? this.searchNavigateIndex / this.searchKeyword.length + 1 : 0;\n    let count = 0;\n    let groupId = null;\n    for (let s = 0; s < this.searchMatchList.length; s++) {\n      const match = this.searchMatchList[s];\n      if (groupId === match.groupId)\n        continue;\n      groupId = match.groupId;\n      count += 1;\n    }\n    return {\n      index: index2,\n      count\n    };\n  }\n  getMatchList(payload, originalElementList) {\n    const keyword = payload.toLocaleLowerCase();\n    const searchMatchList = [];\n    const elementListGroup = [];\n    const originalElementListLength = originalElementList.length;\n    const tableIndexList = [];\n    for (let e = 0; e < originalElementListLength; e++) {\n      const element = originalElementList[e];\n      if (element.type === ElementType.TABLE) {\n        tableIndexList.push(e);\n      }\n    }\n    let i = 0;\n    let elementIndex = 0;\n    while (elementIndex < originalElementListLength - 1) {\n      const endIndex = tableIndexList.length ? tableIndexList[i] : originalElementListLength;\n      const pageElement = originalElementList.slice(elementIndex, endIndex);\n      if (pageElement.length) {\n        elementListGroup.push({\n          index: elementIndex,\n          type: EditorContext.PAGE,\n          elementList: pageElement\n        });\n      }\n      const tableElement = originalElementList[endIndex];\n      if (tableElement) {\n        elementListGroup.push({\n          index: endIndex,\n          type: EditorContext.TABLE,\n          elementList: [tableElement]\n        });\n      }\n      elementIndex = endIndex + 1;\n      i++;\n    }\n    function searchClosure(payload2, type, elementList, restArgs) {\n      if (!payload2)\n        return;\n      const text = elementList.map((e) => !e.type || TEXTLIKE_ELEMENT_TYPE.includes(e.type) && e.controlComponent !== ControlComponent.CHECKBOX ? e.value : ZERO).filter(Boolean).join(\"\").toLocaleLowerCase();\n      const matchStartIndexList = [];\n      let index2 = text.indexOf(payload2);\n      while (index2 !== -1) {\n        matchStartIndexList.push(index2);\n        index2 = text.indexOf(payload2, index2 + payload2.length);\n      }\n      for (let m = 0; m < matchStartIndexList.length; m++) {\n        const startIndex = matchStartIndexList[m];\n        const groupId = getUUID();\n        for (let i2 = 0; i2 < payload2.length; i2++) {\n          const index22 = startIndex + i2 + ((restArgs == null ? void 0 : restArgs.startIndex) || 0);\n          searchMatchList.push({\n            type,\n            index: index22,\n            groupId,\n            ...restArgs\n          });\n        }\n      }\n    }\n    for (let e = 0; e < elementListGroup.length; e++) {\n      const group2 = elementListGroup[e];\n      if (group2.type === EditorContext.TABLE) {\n        const tableElement = group2.elementList[0];\n        for (let t = 0; t < tableElement.trList.length; t++) {\n          const tr = tableElement.trList[t];\n          for (let d = 0; d < tr.tdList.length; d++) {\n            const td = tr.tdList[d];\n            const restArgs = {\n              tableId: tableElement.id,\n              tableIndex: group2.index,\n              trIndex: t,\n              tdIndex: d,\n              tdId: td.id\n            };\n            searchClosure(keyword, group2.type, td.value, restArgs);\n          }\n        }\n      } else {\n        searchClosure(keyword, group2.type, group2.elementList, {\n          startIndex: group2.index\n        });\n      }\n    }\n    return searchMatchList;\n  }\n  compute(payload) {\n    this.searchMatchList = this.getMatchList(payload, this.draw.getOriginalElementList());\n  }\n  render(ctx, pageIndex) {\n    var _a, _b;\n    if (!this.searchMatchList || !this.searchMatchList.length || !this.searchKeyword) {\n      return;\n    }\n    const { searchMatchAlpha, searchMatchColor, searchNavigateMatchColor } = this.options;\n    const positionList = this.position.getOriginalPositionList();\n    const elementList = this.draw.getOriginalElementList();\n    ctx.save();\n    ctx.globalAlpha = searchMatchAlpha;\n    for (let s = 0; s < this.searchMatchList.length; s++) {\n      const searchMatch = this.searchMatchList[s];\n      let position = null;\n      if (searchMatch.type === EditorContext.TABLE) {\n        const { tableIndex, trIndex, tdIndex, index: index2 } = searchMatch;\n        position = (_b = (_a = elementList[tableIndex]) == null ? void 0 : _a.trList[trIndex].tdList[tdIndex]) == null ? void 0 : _b.positionList[index2];\n      } else {\n        position = positionList[searchMatch.index];\n      }\n      if (!position)\n        continue;\n      const { coordinate: { leftTop, leftBottom, rightTop }, pageNo } = position;\n      if (pageNo !== pageIndex)\n        continue;\n      const searchMatchIndexList = this.getSearchNavigateIndexList();\n      if (searchMatchIndexList.includes(s)) {\n        ctx.fillStyle = searchNavigateMatchColor;\n        const preSearchMatch = this.searchMatchList[s - 1];\n        if (!preSearchMatch || preSearchMatch.groupId !== searchMatch.groupId) {\n          this.searchNavigateScrollIntoView(position);\n        }\n      } else {\n        ctx.fillStyle = searchMatchColor;\n      }\n      const x = leftTop[0];\n      const y = leftTop[1];\n      const width = rightTop[0] - leftTop[0];\n      const height = leftBottom[1] - leftTop[1];\n      ctx.fillRect(x, y, width, height);\n    }\n    ctx.restore();\n  }\n}\nclass Strikeout extends AbstractRichText {\n  constructor(draw) {\n    super();\n    this.options = draw.getOptions();\n  }\n  render(ctx) {\n    if (!this.fillRect.width)\n      return;\n    const { scale, strikeoutColor } = this.options;\n    const { x, y, width } = this.fillRect;\n    ctx.save();\n    ctx.lineWidth = scale;\n    ctx.strokeStyle = strikeoutColor;\n    const adjustY = y + 0.5;\n    ctx.beginPath();\n    ctx.moveTo(x, adjustY);\n    ctx.lineTo(x + width, adjustY);\n    ctx.stroke();\n    ctx.restore();\n    this.clearFillInfo();\n  }\n}\nvar TextDecorationStyle;\n(function(TextDecorationStyle2) {\n  TextDecorationStyle2[\"SOLID\"] = \"solid\";\n  TextDecorationStyle2[\"DOUBLE\"] = \"double\";\n  TextDecorationStyle2[\"DASHED\"] = \"dashed\";\n  TextDecorationStyle2[\"DOTTED\"] = \"dotted\";\n  TextDecorationStyle2[\"WAVY\"] = \"wavy\";\n})(TextDecorationStyle || (TextDecorationStyle = {}));\nvar DashType;\n(function(DashType2) {\n  DashType2[\"SOLID\"] = \"solid\";\n  DashType2[\"DASHED\"] = \"dashed\";\n  DashType2[\"DOTTED\"] = \"dotted\";\n})(DashType || (DashType = {}));\nclass Underline extends AbstractRichText {\n  constructor(draw) {\n    super();\n    this.options = draw.getOptions();\n  }\n  _drawLine(ctx, startX, startY, width, dashType) {\n    const endX = startX + width;\n    ctx.beginPath();\n    switch (dashType) {\n      case DashType.DASHED:\n        ctx.setLineDash([3, 1]);\n        break;\n      case DashType.DOTTED:\n        ctx.setLineDash([1, 1]);\n        break;\n    }\n    ctx.moveTo(startX, startY);\n    ctx.lineTo(endX, startY);\n    ctx.stroke();\n  }\n  _drawDouble(ctx, startX, startY, width) {\n    const SPACING = 3;\n    const endX = startX + width;\n    const endY = startY + SPACING * this.options.scale;\n    ctx.beginPath();\n    ctx.moveTo(startX, startY);\n    ctx.lineTo(endX, startY);\n    ctx.stroke();\n    ctx.beginPath();\n    ctx.moveTo(startX, endY);\n    ctx.lineTo(endX, endY);\n    ctx.stroke();\n  }\n  _drawWave(ctx, startX, startY, width) {\n    const { scale } = this.options;\n    const AMPLITUDE = 1.2 * scale;\n    const FREQUENCY = 1 / scale;\n    const adjustY = startY + 2 * AMPLITUDE;\n    ctx.beginPath();\n    for (let x = 0; x < width; x++) {\n      const y = AMPLITUDE * Math.sin(FREQUENCY * x);\n      ctx.lineTo(startX + x, adjustY + y);\n    }\n    ctx.stroke();\n  }\n  render(ctx) {\n    if (!this.fillRect.width)\n      return;\n    const { underlineColor, scale } = this.options;\n    const { x, y, width } = this.fillRect;\n    ctx.save();\n    ctx.strokeStyle = this.fillColor || underlineColor;\n    ctx.lineWidth = scale;\n    const adjustY = Math.floor(y + 2 * ctx.lineWidth) + 0.5;\n    switch (this.fillDecorationStyle) {\n      case TextDecorationStyle.WAVY:\n        this._drawWave(ctx, x, adjustY, width);\n        break;\n      case TextDecorationStyle.DOUBLE:\n        this._drawDouble(ctx, x, adjustY, width);\n        break;\n      case TextDecorationStyle.DASHED:\n        this._drawLine(ctx, x, adjustY, width, DashType.DASHED);\n        break;\n      case TextDecorationStyle.DOTTED:\n        this._drawLine(ctx, x, adjustY, width, DashType.DOTTED);\n        break;\n      default:\n        this._drawLine(ctx, x, adjustY, width);\n        break;\n    }\n    ctx.restore();\n    this.clearFillInfo();\n  }\n}\nclass TextParticle {\n  constructor(draw) {\n    this.draw = draw;\n    this.options = draw.getOptions();\n    this.ctx = draw.getCtx();\n    this.curX = -1;\n    this.curY = -1;\n    this.text = \"\";\n    this.curStyle = \"\";\n    this.cacheMeasureText = /* @__PURE__ */ new Map();\n  }\n  measureBasisWord(ctx, font) {\n    ctx.save();\n    ctx.font = font;\n    const textMetrics = this.measureText(ctx, {\n      value: METRICS_BASIS_TEXT\n    });\n    ctx.restore();\n    return textMetrics;\n  }\n  measureWord(ctx, elementList, curIndex) {\n    const LETTER_REG = this.draw.getLetterReg();\n    let width = 0;\n    let endElement = elementList[curIndex];\n    let i = curIndex;\n    while (i < elementList.length) {\n      const element = elementList[i];\n      if (element.type && element.type !== ElementType.TEXT || !LETTER_REG.test(element.value)) {\n        endElement = element;\n        break;\n      }\n      width += this.measureText(ctx, element).width;\n      i++;\n    }\n    return {\n      width,\n      endElement\n    };\n  }\n  measurePunctuationWidth(ctx, element) {\n    if (!element || !PUNCTUATION_LIST.includes(element.value))\n      return 0;\n    return this.measureText(ctx, element).width;\n  }\n  measureText(ctx, element) {\n    if (element.width) {\n      const textMetrics2 = ctx.measureText(element.value);\n      return {\n        width: element.width,\n        actualBoundingBoxAscent: textMetrics2.actualBoundingBoxAscent,\n        actualBoundingBoxDescent: textMetrics2.actualBoundingBoxDescent,\n        actualBoundingBoxLeft: textMetrics2.actualBoundingBoxLeft,\n        actualBoundingBoxRight: textMetrics2.actualBoundingBoxRight,\n        fontBoundingBoxAscent: textMetrics2.fontBoundingBoxAscent,\n        fontBoundingBoxDescent: textMetrics2.fontBoundingBoxDescent\n      };\n    }\n    const id = `${element.value}${ctx.font}`;\n    const cacheTextMetrics = this.cacheMeasureText.get(id);\n    if (cacheTextMetrics) {\n      return cacheTextMetrics;\n    }\n    const textMetrics = ctx.measureText(element.value);\n    this.cacheMeasureText.set(id, textMetrics);\n    return textMetrics;\n  }\n  complete() {\n    this._render();\n    this.text = \"\";\n  }\n  record(ctx, element, x, y) {\n    this.ctx = ctx;\n    if (this.options.renderMode === RenderMode.COMPATIBILITY) {\n      this._setCurXY(x, y);\n      this.text = element.value;\n      this.curStyle = element.style;\n      this.curColor = element.color;\n      this.complete();\n      return;\n    }\n    if (!this.text) {\n      this._setCurXY(x, y);\n    }\n    if (this.curStyle && element.style !== this.curStyle || element.color !== this.curColor) {\n      this.complete();\n      this._setCurXY(x, y);\n    }\n    this.text += element.value;\n    this.curStyle = element.style;\n    this.curColor = element.color;\n  }\n  _setCurXY(x, y) {\n    this.curX = x;\n    this.curY = y;\n  }\n  _render() {\n    if (!this.text || !~this.curX || !~this.curX)\n      return;\n    this.ctx.save();\n    this.ctx.font = this.curStyle;\n    this.ctx.fillStyle = this.curColor || this.options.defaultColor;\n    this.ctx.fillText(this.text, this.curX, this.curY);\n    this.ctx.restore();\n  }\n}\nclass PageNumber {\n  constructor(draw) {\n    this.draw = draw;\n    this.options = draw.getOptions();\n  }\n  render(ctx, pageNo) {\n    const { scale, pageMode, pageNumber: { size, font, color, rowFlex, numberType, format, startPageNo, fromPageNo } } = this.options;\n    if (pageNo < fromPageNo)\n      return;\n    let text = format;\n    const pageNoReg = new RegExp(FORMAT_PLACEHOLDER.PAGE_NO);\n    if (pageNoReg.test(text)) {\n      const realPageNo = pageNo + startPageNo - fromPageNo;\n      const pageNoText = numberType === NumberType.CHINESE ? convertNumberToChinese(realPageNo) : `${realPageNo}`;\n      text = text.replace(pageNoReg, pageNoText);\n    }\n    const pageCountReg = new RegExp(FORMAT_PLACEHOLDER.PAGE_COUNT);\n    if (pageCountReg.test(text)) {\n      const pageCount = this.draw.getPageCount() - fromPageNo;\n      const pageCountText = numberType === NumberType.CHINESE ? convertNumberToChinese(pageCount) : `${pageCount}`;\n      text = text.replace(pageCountReg, pageCountText);\n    }\n    const width = this.draw.getWidth();\n    const height = pageMode === PageMode.CONTINUITY ? this.draw.getCanvasHeight(pageNo) : this.draw.getHeight();\n    const pageNumberBottom = this.draw.getPageNumberBottom();\n    const y = height - pageNumberBottom;\n    ctx.save();\n    ctx.fillStyle = color;\n    ctx.font = `${size * scale}px ${font}`;\n    let x = 0;\n    const margins = this.draw.getMargins();\n    const { width: textWidth } = ctx.measureText(text);\n    if (rowFlex === RowFlex.CENTER) {\n      x = (width - textWidth) / 2;\n    } else if (rowFlex === RowFlex.RIGHT) {\n      x = width - textWidth - margins[1];\n    } else {\n      x = margins[3];\n    }\n    ctx.fillText(text, x, y);\n    ctx.restore();\n  }\n}\nclass ScrollObserver {\n  constructor(draw) {\n    this._observer = debounce(() => {\n      const { intersectionPageNo, visiblePageNoList } = this.getPageVisibleInfo();\n      this.draw.setIntersectionPageNo(intersectionPageNo);\n      this.draw.setVisiblePageNoList(visiblePageNoList);\n    }, 150);\n    this.draw = draw;\n    this.options = draw.getOptions();\n    this.scrollContainer = this.getScrollContainer();\n    setTimeout(() => {\n      if (!window.scrollY) {\n        this._observer();\n      }\n    });\n    this._addEvent();\n  }\n  getScrollContainer() {\n    return this.options.scrollContainerSelector ? document.querySelector(this.options.scrollContainerSelector) || document : document;\n  }\n  _addEvent() {\n    this.scrollContainer.addEventListener(\"scroll\", this._observer);\n  }\n  removeEvent() {\n    this.scrollContainer.removeEventListener(\"scroll\", this._observer);\n  }\n  getElementVisibleInfo(element) {\n    const rect = element.getBoundingClientRect();\n    const viewHeight = this.scrollContainer === document ? Math.max(document.documentElement.clientHeight, window.innerHeight) : this.scrollContainer.clientHeight;\n    const visibleHeight = Math.min(rect.bottom, viewHeight) - Math.max(rect.top, 0);\n    return {\n      intersectionHeight: visibleHeight > 0 ? visibleHeight : 0\n    };\n  }\n  getPageVisibleInfo() {\n    const pageList = this.draw.getPageList();\n    const visiblePageNoList = [];\n    let intersectionPageNo = 0;\n    let intersectionMaxHeight = 0;\n    for (let i = 0; i < pageList.length; i++) {\n      const curPage = pageList[i];\n      const { intersectionHeight } = this.getElementVisibleInfo(curPage);\n      if (intersectionMaxHeight && !intersectionHeight)\n        break;\n      if (intersectionHeight) {\n        visiblePageNoList.push(i);\n      }\n      if (intersectionHeight > intersectionMaxHeight) {\n        intersectionMaxHeight = intersectionHeight;\n        intersectionPageNo = i;\n      }\n    }\n    return {\n      intersectionPageNo,\n      visiblePageNoList\n    };\n  }\n}\nclass SelectionObserver {\n  constructor(draw) {\n    this.step = 5;\n    this.thresholdPoints = [70, 40, 10, 20];\n    this._mousedown = () => {\n      this.isMousedown = true;\n      this.clientWidth = this.selectionContainer instanceof Document ? document.documentElement.clientWidth : this.selectionContainer.clientWidth;\n      this.clientHeight = this.selectionContainer instanceof Document ? document.documentElement.clientHeight : this.selectionContainer.clientHeight;\n      if (!(this.selectionContainer instanceof Document)) {\n        const rect = this.selectionContainer.getBoundingClientRect();\n        this.containerRect = rect;\n      }\n    };\n    this._mouseup = () => {\n      this.isMousedown = false;\n      this._stopMove();\n    };\n    this._mousemove = (evt) => {\n      if (!this.isMousedown || this.rangeManager.getIsCollapsed())\n        return;\n      let { x, y } = evt;\n      if (this.containerRect) {\n        x = x - this.containerRect.x;\n        y = y - this.containerRect.y;\n      }\n      if (y < this.thresholdPoints[0]) {\n        this._startMove(MoveDirection.UP);\n      } else if (this.clientHeight - y <= this.thresholdPoints[1]) {\n        this._startMove(MoveDirection.DOWN);\n      } else if (x < this.thresholdPoints[2]) {\n        this._startMove(MoveDirection.LEFT);\n      } else if (this.clientWidth - x < this.thresholdPoints[3]) {\n        this._startMove(MoveDirection.RIGHT);\n      } else {\n        this._stopMove();\n      }\n    };\n    this.rangeManager = draw.getRange();\n    const { scrollContainerSelector } = draw.getOptions();\n    this.selectionContainer = scrollContainerSelector ? document.querySelector(scrollContainerSelector) || document : document;\n    this.requestAnimationFrameId = null;\n    this.isMousedown = false;\n    this.isMoving = false;\n    this.clientWidth = 0;\n    this.clientHeight = 0;\n    this.containerRect = null;\n    this._addEvent();\n  }\n  _addEvent() {\n    const container = this.selectionContainer;\n    container.addEventListener(\"mousedown\", this._mousedown);\n    container.addEventListener(\"mousemove\", this._mousemove);\n    container.addEventListener(\"mouseup\", this._mouseup);\n    document.addEventListener(\"mouseleave\", this._mouseup);\n  }\n  removeEvent() {\n    const container = this.selectionContainer;\n    container.removeEventListener(\"mousedown\", this._mousedown);\n    container.removeEventListener(\"mousemove\", this._mousemove);\n    container.removeEventListener(\"mouseup\", this._mouseup);\n    document.removeEventListener(\"mouseleave\", this._mouseup);\n  }\n  _move(direction) {\n    const container = this.selectionContainer instanceof Document ? window : this.selectionContainer;\n    const x = this.selectionContainer instanceof Document ? window.scrollX : container.scrollLeft;\n    const y = this.selectionContainer instanceof Document ? window.scrollY : container.scrollTop;\n    if (direction === MoveDirection.DOWN) {\n      container.scrollTo(x, y + this.step);\n    } else if (direction === MoveDirection.UP) {\n      container.scrollTo(x, y - this.step);\n    } else if (direction === MoveDirection.LEFT) {\n      container.scrollTo(x - this.step, y);\n    } else {\n      container.scrollTo(x + this.step, y);\n    }\n    this.requestAnimationFrameId = window.requestAnimationFrame(this._move.bind(this, direction));\n  }\n  _startMove(direction) {\n    if (this.isMoving)\n      return;\n    this.isMoving = true;\n    this._move(direction);\n  }\n  _stopMove() {\n    if (this.requestAnimationFrameId) {\n      window.cancelAnimationFrame(this.requestAnimationFrameId);\n      this.requestAnimationFrameId = null;\n      this.isMoving = false;\n    }\n  }\n}\nvar TableBorder;\n(function(TableBorder2) {\n  TableBorder2[\"ALL\"] = \"all\";\n  TableBorder2[\"EMPTY\"] = \"empty\";\n  TableBorder2[\"EXTERNAL\"] = \"external\";\n})(TableBorder || (TableBorder = {}));\nvar TdBorder;\n(function(TdBorder2) {\n  TdBorder2[\"TOP\"] = \"top\";\n  TdBorder2[\"RIGHT\"] = \"right\";\n  TdBorder2[\"BOTTOM\"] = \"bottom\";\n  TdBorder2[\"LEFT\"] = \"left\";\n})(TdBorder || (TdBorder = {}));\nvar TdSlash;\n(function(TdSlash2) {\n  TdSlash2[\"FORWARD\"] = \"forward\";\n  TdSlash2[\"BACK\"] = \"back\";\n})(TdSlash || (TdSlash = {}));\nclass TableParticle {\n  constructor(draw) {\n    this.draw = draw;\n    this.range = draw.getRange();\n    this.options = draw.getOptions();\n  }\n  getTrListGroupByCol(payload) {\n    var _a;\n    const trList = deepClone(payload);\n    for (let t = 0; t < payload.length; t++) {\n      const tr = trList[t];\n      for (let d = tr.tdList.length - 1; d >= 0; d--) {\n        const td = tr.tdList[d];\n        const { rowspan, rowIndex, colIndex } = td;\n        const curRowIndex = rowIndex + rowspan - 1;\n        if (curRowIndex !== d) {\n          const changeTd = tr.tdList.splice(d, 1)[0];\n          (_a = trList[curRowIndex]) == null ? void 0 : _a.tdList.splice(colIndex, 0, changeTd);\n        }\n      }\n    }\n    return trList;\n  }\n  getRangeRowCol() {\n    const { isTable, index: index2, trIndex, tdIndex } = this.draw.getPosition().getPositionContext();\n    if (!isTable)\n      return null;\n    const { isCrossRowCol, startTdIndex, endTdIndex, startTrIndex, endTrIndex } = this.range.getRange();\n    const originalElementList = this.draw.getOriginalElementList();\n    const element = originalElementList[index2];\n    const curTrList = element.trList;\n    if (!isCrossRowCol) {\n      return [[curTrList[trIndex].tdList[tdIndex]]];\n    }\n    let startTd = curTrList[startTrIndex].tdList[startTdIndex];\n    let endTd = curTrList[endTrIndex].tdList[endTdIndex];\n    if (startTd.x > endTd.x || startTd.y > endTd.y) {\n      [startTd, endTd] = [endTd, startTd];\n    }\n    const startColIndex = startTd.colIndex;\n    const endColIndex = endTd.colIndex + (endTd.colspan - 1);\n    const startRowIndex = startTd.rowIndex;\n    const endRowIndex = endTd.rowIndex + (endTd.rowspan - 1);\n    const rowCol = [];\n    for (let t = 0; t < curTrList.length; t++) {\n      const tr = curTrList[t];\n      const tdList = [];\n      for (let d = 0; d < tr.tdList.length; d++) {\n        const td = tr.tdList[d];\n        const tdColIndex = td.colIndex;\n        const tdRowIndex = td.rowIndex;\n        if (tdColIndex >= startColIndex && tdColIndex <= endColIndex && tdRowIndex >= startRowIndex && tdRowIndex <= endRowIndex) {\n          tdList.push(td);\n        }\n      }\n      if (tdList.length) {\n        rowCol.push(tdList);\n      }\n    }\n    return rowCol.length ? rowCol : null;\n  }\n  _drawOuterBorder(payload) {\n    const { ctx, startX, startY, width, height, isDrawFullBorder } = payload;\n    ctx.beginPath();\n    const x = Math.round(startX);\n    const y = Math.round(startY);\n    ctx.translate(0.5, 0.5);\n    if (isDrawFullBorder) {\n      ctx.rect(x, y, width, height);\n    } else {\n      ctx.moveTo(x, y + height);\n      ctx.lineTo(x, y);\n      ctx.lineTo(x + width, y);\n    }\n    ctx.stroke();\n    ctx.translate(-0.5, -0.5);\n  }\n  _drawSlash(ctx, td, startX, startY) {\n    var _a, _b;\n    const { scale } = this.options;\n    ctx.save();\n    const width = td.width * scale;\n    const height = td.height * scale;\n    const x = Math.round(td.x * scale + startX);\n    const y = Math.round(td.y * scale + startY);\n    if ((_a = td.slashTypes) == null ? void 0 : _a.includes(TdSlash.FORWARD)) {\n      ctx.moveTo(x + width, y);\n      ctx.lineTo(x, y + height);\n    }\n    if ((_b = td.slashTypes) == null ? void 0 : _b.includes(TdSlash.BACK)) {\n      ctx.moveTo(x, y);\n      ctx.lineTo(x + width, y + height);\n    }\n    ctx.stroke();\n    ctx.restore();\n  }\n  _drawBorder(ctx, element, startX, startY) {\n    var _a, _b, _c, _d, _e, _f;\n    const { colgroup, trList, borderType } = element;\n    if (!colgroup || !trList)\n      return;\n    const { scale } = this.options;\n    const tableWidth = element.width * scale;\n    const tableHeight = element.height * scale;\n    const isEmptyBorderType = borderType === TableBorder.EMPTY;\n    const isExternalBorderType = borderType === TableBorder.EXTERNAL;\n    ctx.save();\n    ctx.lineWidth = scale;\n    if (!isEmptyBorderType) {\n      this._drawOuterBorder({\n        ctx,\n        startX,\n        startY,\n        width: tableWidth,\n        height: tableHeight,\n        isDrawFullBorder: isExternalBorderType\n      });\n    }\n    for (let t = 0; t < trList.length; t++) {\n      const tr = trList[t];\n      for (let d = 0; d < tr.tdList.length; d++) {\n        const td = tr.tdList[d];\n        if ((_a = td.slashTypes) == null ? void 0 : _a.length) {\n          this._drawSlash(ctx, td, startX, startY);\n        }\n        if (!((_b = td.borderTypes) == null ? void 0 : _b.length) && (isEmptyBorderType || isExternalBorderType)) {\n          continue;\n        }\n        const width = td.width * scale;\n        const height = td.height * scale;\n        const x = Math.round(td.x * scale + startX + width);\n        const y = Math.round(td.y * scale + startY);\n        ctx.translate(0.5, 0.5);\n        ctx.beginPath();\n        if ((_c = td.borderTypes) == null ? void 0 : _c.includes(TdBorder.TOP)) {\n          ctx.moveTo(x - width, y);\n          ctx.lineTo(x, y);\n          ctx.stroke();\n        }\n        if ((_d = td.borderTypes) == null ? void 0 : _d.includes(TdBorder.RIGHT)) {\n          ctx.moveTo(x, y);\n          ctx.lineTo(x, y + height);\n          ctx.stroke();\n        }\n        if ((_e = td.borderTypes) == null ? void 0 : _e.includes(TdBorder.BOTTOM)) {\n          ctx.moveTo(x, y + height);\n          ctx.lineTo(x - width, y + height);\n          ctx.stroke();\n        }\n        if ((_f = td.borderTypes) == null ? void 0 : _f.includes(TdBorder.LEFT)) {\n          ctx.moveTo(x - width, y);\n          ctx.lineTo(x - width, y + height);\n          ctx.stroke();\n        }\n        if (!isEmptyBorderType && !isExternalBorderType) {\n          ctx.moveTo(x, y);\n          ctx.lineTo(x, y + height);\n          ctx.lineTo(x - width, y + height);\n          ctx.stroke();\n        }\n        ctx.translate(-0.5, -0.5);\n      }\n    }\n    ctx.restore();\n  }\n  _drawBackgroundColor(ctx, element, startX, startY) {\n    const { trList } = element;\n    if (!trList)\n      return;\n    const { scale } = this.options;\n    for (let t = 0; t < trList.length; t++) {\n      const tr = trList[t];\n      for (let d = 0; d < tr.tdList.length; d++) {\n        const td = tr.tdList[d];\n        if (!td.backgroundColor)\n          continue;\n        ctx.save();\n        const width = td.width * scale;\n        const height = td.height * scale;\n        const x = Math.round(td.x * scale + startX);\n        const y = Math.round(td.y * scale + startY);\n        ctx.fillStyle = td.backgroundColor;\n        ctx.fillRect(x, y, width, height);\n        ctx.restore();\n      }\n    }\n  }\n  getTableWidth(element) {\n    return element.colgroup.reduce((pre, cur) => pre + cur.width, 0);\n  }\n  getTableHeight(element) {\n    const trList = element.trList;\n    if (!(trList == null ? void 0 : trList.length))\n      return 0;\n    return this.getTdListByColIndex(trList, 0).reduce((pre, cur) => pre + cur.height, 0);\n  }\n  getRowCountByColIndex(trList, colIndex) {\n    return this.getTdListByColIndex(trList, colIndex).reduce((pre, cur) => pre + cur.rowspan, 0);\n  }\n  getTdListByColIndex(trList, colIndex) {\n    const data2 = [];\n    for (let r = 0; r < trList.length; r++) {\n      const tdList = trList[r].tdList;\n      for (let d = 0; d < tdList.length; d++) {\n        const td = tdList[d];\n        const min = td.colIndex;\n        const max = min + td.colspan - 1;\n        if (colIndex >= min && colIndex <= max) {\n          data2.push(td);\n        }\n      }\n    }\n    return data2;\n  }\n  computeRowColInfo(element) {\n    const { colgroup, trList } = element;\n    if (!colgroup || !trList)\n      return;\n    let preX = 0;\n    for (let t = 0; t < trList.length; t++) {\n      const tr = trList[t];\n      const isLastTr = trList.length - 1 === t;\n      for (let d = 0; d < tr.tdList.length; d++) {\n        const td = tr.tdList[d];\n        let colIndex = 0;\n        if (trList.length > 1 && t !== 0) {\n          const preTd = tr.tdList[d - 1];\n          const start = preTd ? preTd.colIndex + preTd.colspan : d;\n          for (let c = start; c < colgroup.length; c++) {\n            const rowCount = this.getRowCountByColIndex(trList.slice(0, t), c);\n            if (rowCount === t) {\n              colIndex = c;\n              let preColWidth = 0;\n              for (let preC = 0; preC < c; preC++) {\n                preColWidth += colgroup[preC].width;\n              }\n              preX = preColWidth;\n              break;\n            }\n          }\n        } else {\n          const preTd = tr.tdList[d - 1];\n          if (preTd) {\n            colIndex = preTd.colIndex + preTd.colspan;\n          }\n        }\n        let width = 0;\n        for (let col = 0; col < td.colspan; col++) {\n          width += colgroup[col + colIndex].width;\n        }\n        let height = 0;\n        for (let row = 0; row < td.rowspan; row++) {\n          const curTr = trList[row + t] || trList[t];\n          height += curTr.height;\n        }\n        const isLastRowTd = tr.tdList.length - 1 === d;\n        let isLastColTd = isLastTr;\n        if (!isLastColTd) {\n          if (td.rowspan > 1) {\n            const nextTrLength = trList.length - 1 - t;\n            isLastColTd = td.rowspan - 1 === nextTrLength;\n          }\n        }\n        const isLastTd = isLastTr && isLastRowTd;\n        td.isLastRowTd = isLastRowTd;\n        td.isLastColTd = isLastColTd;\n        td.isLastTd = isLastTd;\n        td.x = preX;\n        let preY = 0;\n        for (let preR = 0; preR < t; preR++) {\n          const preTdList = trList[preR].tdList;\n          for (let preD = 0; preD < preTdList.length; preD++) {\n            const td2 = preTdList[preD];\n            if (colIndex >= td2.colIndex && colIndex < td2.colIndex + td2.colspan) {\n              preY += td2.height;\n              break;\n            }\n          }\n        }\n        td.y = preY;\n        td.width = width;\n        td.height = height;\n        td.rowIndex = t;\n        td.colIndex = colIndex;\n        td.trIndex = t;\n        td.tdIndex = d;\n        preX += width;\n        if (isLastRowTd && !isLastTd) {\n          preX = 0;\n        }\n      }\n    }\n  }\n  drawRange(ctx, element, startX, startY) {\n    const { scale, rangeAlpha, rangeColor } = this.options;\n    const { type, trList } = element;\n    if (!trList || type !== ElementType.TABLE)\n      return;\n    const { isCrossRowCol, startTdIndex, endTdIndex, startTrIndex, endTrIndex } = this.range.getRange();\n    if (!isCrossRowCol)\n      return;\n    let startTd = trList[startTrIndex].tdList[startTdIndex];\n    let endTd = trList[endTrIndex].tdList[endTdIndex];\n    if (startTd.x > endTd.x || startTd.y > endTd.y) {\n      [startTd, endTd] = [endTd, startTd];\n    }\n    const startColIndex = startTd.colIndex;\n    const endColIndex = endTd.colIndex + (endTd.colspan - 1);\n    const startRowIndex = startTd.rowIndex;\n    const endRowIndex = endTd.rowIndex + (endTd.rowspan - 1);\n    ctx.save();\n    for (let t = 0; t < trList.length; t++) {\n      const tr = trList[t];\n      for (let d = 0; d < tr.tdList.length; d++) {\n        const td = tr.tdList[d];\n        const tdColIndex = td.colIndex;\n        const tdRowIndex = td.rowIndex;\n        if (tdColIndex >= startColIndex && tdColIndex <= endColIndex && tdRowIndex >= startRowIndex && tdRowIndex <= endRowIndex) {\n          const x = td.x * scale;\n          const y = td.y * scale;\n          const width = td.width * scale;\n          const height = td.height * scale;\n          ctx.globalAlpha = rangeAlpha;\n          ctx.fillStyle = rangeColor;\n          ctx.fillRect(x + startX, y + startY, width, height);\n        }\n      }\n    }\n    ctx.restore();\n  }\n  render(ctx, element, startX, startY) {\n    this._drawBackgroundColor(ctx, element, startX, startY);\n    this._drawBorder(ctx, element, startX, startY);\n  }\n}\nvar TableOrder;\n(function(TableOrder2) {\n  TableOrder2[\"ROW\"] = \"row\";\n  TableOrder2[\"COL\"] = \"col\";\n})(TableOrder || (TableOrder = {}));\nclass TableTool {\n  constructor(draw) {\n    this.MIN_TD_WIDTH = 20;\n    this.ROW_COL_OFFSET = 18;\n    this.ROW_COL_QUICK_WIDTH = 16;\n    this.ROW_COL_QUICK_OFFSET = 5;\n    this.ROW_COL_QUICK_POSITION = this.ROW_COL_OFFSET + (this.ROW_COL_OFFSET - this.ROW_COL_QUICK_WIDTH) / 2;\n    this.BORDER_VALUE = 4;\n    this.TABLE_SELECT_OFFSET = 20;\n    this.draw = draw;\n    this.canvas = draw.getPage();\n    this.options = draw.getOptions();\n    this.position = draw.getPosition();\n    this.container = draw.getContainer();\n    this.toolRowContainer = null;\n    this.toolRowAddBtn = null;\n    this.toolColAddBtn = null;\n    this.toolTableSelectBtn = null;\n    this.toolColContainer = null;\n    this.toolBorderContainer = null;\n    this.anchorLine = null;\n    this.mousedownX = 0;\n    this.mousedownY = 0;\n  }\n  dispose() {\n    var _a, _b, _c, _d, _e, _f;\n    (_a = this.toolRowContainer) == null ? void 0 : _a.remove();\n    (_b = this.toolRowAddBtn) == null ? void 0 : _b.remove();\n    (_c = this.toolColAddBtn) == null ? void 0 : _c.remove();\n    (_d = this.toolTableSelectBtn) == null ? void 0 : _d.remove();\n    (_e = this.toolColContainer) == null ? void 0 : _e.remove();\n    (_f = this.toolBorderContainer) == null ? void 0 : _f.remove();\n    this.toolRowContainer = null;\n    this.toolRowAddBtn = null;\n    this.toolColAddBtn = null;\n    this.toolTableSelectBtn = null;\n    this.toolColContainer = null;\n    this.toolBorderContainer = null;\n  }\n  render() {\n    const { isTable, index: index2, trIndex, tdIndex } = this.position.getPositionContext();\n    if (!isTable)\n      return;\n    this.dispose();\n    const { scale } = this.options;\n    const elementList = this.draw.getOriginalElementList();\n    const positionList = this.position.getOriginalPositionList();\n    const element = elementList[index2];\n    const position = positionList[index2];\n    const { colgroup, trList } = element;\n    const { coordinate: { leftTop } } = position;\n    const height = this.draw.getHeight();\n    const pageGap = this.draw.getPageGap();\n    const prePageHeight = this.draw.getPageNo() * (height + pageGap);\n    const tableX = leftTop[0];\n    const tableY = leftTop[1] + prePageHeight;\n    const td = element.trList[trIndex].tdList[tdIndex];\n    const rowIndex = td.rowIndex;\n    const colIndex = td.colIndex;\n    const tableHeight = element.height * scale;\n    const tableWidth = element.width * scale;\n    const tableSelectBtn = document.createElement(\"div\");\n    tableSelectBtn.classList.add(`${EDITOR_PREFIX}-table-tool__select`);\n    tableSelectBtn.style.height = `${tableHeight * scale}`;\n    tableSelectBtn.style.left = `${tableX}px`;\n    tableSelectBtn.style.top = `${tableY}px`;\n    tableSelectBtn.style.transform = `translate(-${this.TABLE_SELECT_OFFSET * scale}px, ${-this.TABLE_SELECT_OFFSET * scale}px)`;\n    tableSelectBtn.onclick = () => {\n      this.draw.getTableOperate().tableSelectAll();\n    };\n    this.container.append(tableSelectBtn);\n    this.toolTableSelectBtn = tableSelectBtn;\n    const rowHeightList = trList.map((tr) => tr.height);\n    const rowContainer = document.createElement(\"div\");\n    rowContainer.classList.add(`${EDITOR_PREFIX}-table-tool__row`);\n    rowContainer.style.transform = `translateX(-${this.ROW_COL_OFFSET * scale}px)`;\n    for (let r = 0; r < rowHeightList.length; r++) {\n      const rowHeight = rowHeightList[r] * scale;\n      const rowItem = document.createElement(\"div\");\n      rowItem.classList.add(`${EDITOR_PREFIX}-table-tool__row__item`);\n      if (r === rowIndex) {\n        rowItem.classList.add(\"active\");\n      }\n      const rowItemAnchor = document.createElement(\"div\");\n      rowItemAnchor.classList.add(`${EDITOR_PREFIX}-table-tool__anchor`);\n      rowItemAnchor.onmousedown = (evt) => {\n        this._mousedown({\n          evt,\n          element,\n          index: r,\n          order: TableOrder.ROW\n        });\n      };\n      rowItem.append(rowItemAnchor);\n      rowItem.style.height = `${rowHeight}px`;\n      rowContainer.append(rowItem);\n    }\n    rowContainer.style.left = `${tableX}px`;\n    rowContainer.style.top = `${tableY}px`;\n    this.container.append(rowContainer);\n    this.toolRowContainer = rowContainer;\n    const rowAddBtn = document.createElement(\"div\");\n    rowAddBtn.classList.add(`${EDITOR_PREFIX}-table-tool__quick__add`);\n    rowAddBtn.style.height = `${tableHeight * scale}`;\n    rowAddBtn.style.left = `${tableX}px`;\n    rowAddBtn.style.top = `${tableY + tableHeight}px`;\n    rowAddBtn.style.transform = `translate(-${this.ROW_COL_QUICK_POSITION * scale}px, ${this.ROW_COL_QUICK_OFFSET * scale}px)`;\n    rowAddBtn.onclick = () => {\n      this.position.setPositionContext({\n        index: index2,\n        isTable: true,\n        trIndex: trList.length - 1,\n        tdIndex: 0\n      });\n      this.draw.getTableOperate().insertTableBottomRow();\n    };\n    this.container.append(rowAddBtn);\n    this.toolRowAddBtn = rowAddBtn;\n    const colWidthList = colgroup.map((col) => col.width);\n    const colContainer = document.createElement(\"div\");\n    colContainer.classList.add(`${EDITOR_PREFIX}-table-tool__col`);\n    colContainer.style.transform = `translateY(-${this.ROW_COL_OFFSET * scale}px)`;\n    for (let c = 0; c < colWidthList.length; c++) {\n      const colWidth = colWidthList[c] * scale;\n      const colItem = document.createElement(\"div\");\n      colItem.classList.add(`${EDITOR_PREFIX}-table-tool__col__item`);\n      if (c === colIndex) {\n        colItem.classList.add(\"active\");\n      }\n      const colItemAnchor = document.createElement(\"div\");\n      colItemAnchor.classList.add(`${EDITOR_PREFIX}-table-tool__anchor`);\n      colItemAnchor.onmousedown = (evt) => {\n        this._mousedown({\n          evt,\n          element,\n          index: c,\n          order: TableOrder.COL\n        });\n      };\n      colItem.append(colItemAnchor);\n      colItem.style.width = `${colWidth}px`;\n      colContainer.append(colItem);\n    }\n    colContainer.style.left = `${tableX}px`;\n    colContainer.style.top = `${tableY}px`;\n    this.container.append(colContainer);\n    this.toolColContainer = colContainer;\n    const colAddBtn = document.createElement(\"div\");\n    colAddBtn.classList.add(`${EDITOR_PREFIX}-table-tool__quick__add`);\n    colAddBtn.style.height = `${tableHeight * scale}`;\n    colAddBtn.style.left = `${tableX + tableWidth}px`;\n    colAddBtn.style.top = `${tableY}px`;\n    colAddBtn.style.transform = `translate(${this.ROW_COL_QUICK_OFFSET * scale}px, -${this.ROW_COL_QUICK_POSITION * scale}px)`;\n    colAddBtn.onclick = () => {\n      this.position.setPositionContext({\n        index: index2,\n        isTable: true,\n        trIndex: 0,\n        tdIndex: trList[0].tdList.length - 1 || 0\n      });\n      this.draw.getTableOperate().insertTableRightCol();\n    };\n    this.container.append(colAddBtn);\n    this.toolColAddBtn = colAddBtn;\n    const borderContainer = document.createElement(\"div\");\n    borderContainer.classList.add(`${EDITOR_PREFIX}-table-tool__border`);\n    borderContainer.style.height = `${tableHeight}px`;\n    borderContainer.style.width = `${tableWidth}px`;\n    borderContainer.style.left = `${tableX}px`;\n    borderContainer.style.top = `${tableY}px`;\n    for (let r = 0; r < trList.length; r++) {\n      const tr = trList[r];\n      for (let d = 0; d < tr.tdList.length; d++) {\n        const td2 = tr.tdList[d];\n        const rowBorder = document.createElement(\"div\");\n        rowBorder.classList.add(`${EDITOR_PREFIX}-table-tool__border__row`);\n        rowBorder.style.width = `${td2.width * scale}px`;\n        rowBorder.style.height = `${this.BORDER_VALUE}px`;\n        rowBorder.style.top = `${(td2.y + td2.height) * scale - this.BORDER_VALUE / 2}px`;\n        rowBorder.style.left = `${td2.x * scale}px`;\n        rowBorder.onmousedown = (evt) => {\n          this._mousedown({\n            evt,\n            element,\n            index: td2.rowIndex + td2.rowspan - 1,\n            order: TableOrder.ROW\n          });\n        };\n        borderContainer.appendChild(rowBorder);\n        const colBorder = document.createElement(\"div\");\n        colBorder.classList.add(`${EDITOR_PREFIX}-table-tool__border__col`);\n        colBorder.style.width = `${this.BORDER_VALUE}px`;\n        colBorder.style.height = `${td2.height * scale}px`;\n        colBorder.style.top = `${td2.y * scale}px`;\n        colBorder.style.left = `${(td2.x + td2.width) * scale - this.BORDER_VALUE / 2}px`;\n        colBorder.onmousedown = (evt) => {\n          this._mousedown({\n            evt,\n            element,\n            index: td2.colIndex + td2.colspan - 1,\n            order: TableOrder.COL\n          });\n        };\n        borderContainer.appendChild(colBorder);\n      }\n    }\n    this.container.append(borderContainer);\n    this.toolBorderContainer = borderContainer;\n  }\n  _mousedown(payload) {\n    const { evt, index: index2, order, element } = payload;\n    this.canvas = this.draw.getPage();\n    const { scale } = this.options;\n    const width = this.draw.getWidth();\n    const height = this.draw.getHeight();\n    const pageGap = this.draw.getPageGap();\n    const prePageHeight = this.draw.getPageNo() * (height + pageGap);\n    this.mousedownX = evt.x;\n    this.mousedownY = evt.y;\n    const target = evt.target;\n    const canvasRect = this.canvas.getBoundingClientRect();\n    const cursor = window.getComputedStyle(target).cursor;\n    document.body.style.cursor = cursor;\n    this.canvas.style.cursor = cursor;\n    let startX = 0;\n    let startY = 0;\n    const anchorLine = document.createElement(\"div\");\n    anchorLine.classList.add(`${EDITOR_PREFIX}-table-anchor__line`);\n    if (order === TableOrder.ROW) {\n      anchorLine.classList.add(`${EDITOR_PREFIX}-table-anchor__line__row`);\n      anchorLine.style.width = `${width}px`;\n      startX = 0;\n      startY = prePageHeight + this.mousedownY - canvasRect.top;\n    } else {\n      anchorLine.classList.add(`${EDITOR_PREFIX}-table-anchor__line__col`);\n      anchorLine.style.height = `${height}px`;\n      startX = this.mousedownX - canvasRect.left;\n      startY = prePageHeight;\n    }\n    anchorLine.style.left = `${startX}px`;\n    anchorLine.style.top = `${startY}px`;\n    this.container.append(anchorLine);\n    this.anchorLine = anchorLine;\n    let dx = 0;\n    let dy = 0;\n    const mousemoveFn = (evt2) => {\n      const movePosition = this._mousemove(evt2, order, startX, startY);\n      if (movePosition) {\n        dx = movePosition.dx;\n        dy = movePosition.dy;\n      }\n    };\n    document.addEventListener(\"mousemove\", mousemoveFn);\n    document.addEventListener(\"mouseup\", () => {\n      var _a;\n      let isChangeSize = false;\n      if (order === TableOrder.ROW) {\n        const trList = element.trList;\n        const tr = trList[index2] || trList[index2 - 1];\n        const { defaultTrMinHeight } = this.options.table;\n        if (dy < 0 && tr.height + dy < defaultTrMinHeight) {\n          dy = defaultTrMinHeight - tr.height;\n        }\n        if (dy) {\n          tr.height += dy;\n          tr.minHeight = tr.height;\n          isChangeSize = true;\n        }\n      } else {\n        const { colgroup } = element;\n        if (colgroup && dx) {\n          const innerWidth = this.draw.getInnerWidth();\n          const curColWidth = colgroup[index2].width;\n          if (dx < 0 && curColWidth + dx < this.MIN_TD_WIDTH) {\n            dx = this.MIN_TD_WIDTH - curColWidth;\n          }\n          const nextColWidth = (_a = colgroup[index2 + 1]) == null ? void 0 : _a.width;\n          if (dx > 0 && nextColWidth && nextColWidth - dx < this.MIN_TD_WIDTH) {\n            dx = nextColWidth - this.MIN_TD_WIDTH;\n          }\n          const moveColWidth = curColWidth + dx;\n          if (index2 === colgroup.length - 1) {\n            let moveTableWidth = 0;\n            for (let c = 0; c < colgroup.length; c++) {\n              const group2 = colgroup[c];\n              if (c === index2 + 1) {\n                moveTableWidth -= dx;\n              }\n              if (c === index2) {\n                moveTableWidth += moveColWidth;\n              }\n              if (c !== index2) {\n                moveTableWidth += group2.width;\n              }\n            }\n            if (moveTableWidth > innerWidth) {\n              const tableWidth = element.width;\n              dx = innerWidth - tableWidth;\n            }\n          }\n          if (dx) {\n            if (colgroup.length - 1 !== index2) {\n              colgroup[index2 + 1].width -= dx / scale;\n            }\n            colgroup[index2].width += dx / scale;\n            isChangeSize = true;\n          }\n        }\n      }\n      if (isChangeSize) {\n        this.draw.render({ isSetCursor: false });\n      }\n      anchorLine.remove();\n      document.removeEventListener(\"mousemove\", mousemoveFn);\n      document.body.style.cursor = \"\";\n      this.canvas.style.cursor = \"text\";\n    }, {\n      once: true\n    });\n    evt.preventDefault();\n  }\n  _mousemove(evt, tableOrder, startX, startY) {\n    if (!this.anchorLine)\n      return null;\n    const dx = evt.x - this.mousedownX;\n    const dy = evt.y - this.mousedownY;\n    if (tableOrder === TableOrder.ROW) {\n      this.anchorLine.style.top = `${startY + dy}px`;\n    } else {\n      this.anchorLine.style.left = `${startX + dx}px`;\n    }\n    evt.preventDefault();\n    return { dx, dy };\n  }\n}\nclass HyperlinkParticle {\n  constructor(draw) {\n    this.draw = draw;\n    this.options = draw.getOptions();\n    this.container = draw.getContainer();\n    const { hyperlinkPopupContainer, hyperlinkDom } = this._createHyperlinkPopupDom();\n    this.hyperlinkDom = hyperlinkDom;\n    this.hyperlinkPopupContainer = hyperlinkPopupContainer;\n  }\n  _createHyperlinkPopupDom() {\n    const hyperlinkPopupContainer = document.createElement(\"div\");\n    hyperlinkPopupContainer.classList.add(`${EDITOR_PREFIX}-hyperlink-popup`);\n    const hyperlinkDom = document.createElement(\"a\");\n    hyperlinkDom.target = \"_blank\";\n    hyperlinkDom.rel = \"noopener\";\n    hyperlinkPopupContainer.append(hyperlinkDom);\n    this.container.append(hyperlinkPopupContainer);\n    return { hyperlinkPopupContainer, hyperlinkDom };\n  }\n  drawHyperlinkPopup(element, position) {\n    const { coordinate: { leftTop: [left2, top] }, lineHeight } = position;\n    const height = this.draw.getHeight();\n    const pageGap = this.draw.getPageGap();\n    const preY = this.draw.getPageNo() * (height + pageGap);\n    this.hyperlinkPopupContainer.style.display = \"block\";\n    this.hyperlinkPopupContainer.style.left = `${left2}px`;\n    this.hyperlinkPopupContainer.style.top = `${top + preY + lineHeight}px`;\n    const url = element.url || \"#\";\n    this.hyperlinkDom.href = url;\n    this.hyperlinkDom.title = url;\n    this.hyperlinkDom.innerText = url;\n  }\n  clearHyperlinkPopup() {\n    this.hyperlinkPopupContainer.style.display = \"none\";\n  }\n  openHyperlink(element) {\n    const newTab = window.open(element.url, \"_blank\");\n    if (newTab) {\n      newTab.opener = null;\n    }\n  }\n  render(ctx, element, x, y) {\n    ctx.save();\n    ctx.font = element.style;\n    if (!element.color) {\n      element.color = this.options.defaultHyperlinkColor;\n    }\n    ctx.fillStyle = element.color;\n    if (element.underline === void 0) {\n      element.underline = true;\n    }\n    ctx.fillText(element.value, x, y);\n    ctx.restore();\n  }\n}\nclass Header {\n  constructor(draw, data2) {\n    this.draw = draw;\n    this.position = draw.getPosition();\n    this.options = draw.getOptions();\n    this.elementList = data2 || [];\n    this.rowList = [];\n    this.positionList = [];\n  }\n  getRowList() {\n    return this.rowList;\n  }\n  setElementList(elementList) {\n    this.elementList = elementList;\n  }\n  getElementList() {\n    return this.elementList;\n  }\n  getPositionList() {\n    return this.positionList;\n  }\n  compute() {\n    this.recovery();\n    this._computeRowList();\n    this._computePositionList();\n  }\n  recovery() {\n    this.rowList = [];\n    this.positionList = [];\n  }\n  _computeRowList() {\n    const innerWidth = this.draw.getInnerWidth();\n    const margins = this.draw.getMargins();\n    const surroundElementList = pickSurroundElementList(this.elementList);\n    this.rowList = this.draw.computeRowList({\n      startX: margins[3],\n      startY: this.getHeaderTop(),\n      innerWidth,\n      elementList: this.elementList,\n      surroundElementList\n    });\n  }\n  _computePositionList() {\n    const headerTop = this.getHeaderTop();\n    const innerWidth = this.draw.getInnerWidth();\n    const margins = this.draw.getMargins();\n    const startX = margins[3];\n    const startY = headerTop;\n    this.position.computePageRowPosition({\n      positionList: this.positionList,\n      rowList: this.rowList,\n      pageNo: 0,\n      startRowIndex: 0,\n      startIndex: 0,\n      startX,\n      startY,\n      innerWidth,\n      zone: EditorZone.HEADER\n    });\n  }\n  getHeaderTop() {\n    const { header: { top, disabled }, scale } = this.options;\n    if (disabled)\n      return 0;\n    return Math.floor(top * scale);\n  }\n  getMaxHeight() {\n    const { header: { maxHeightRadio } } = this.options;\n    const height = this.draw.getHeight();\n    return Math.floor(height * maxHeightRadioMapping[maxHeightRadio]);\n  }\n  getHeight() {\n    const maxHeight = this.getMaxHeight();\n    const rowHeight = this.getRowHeight();\n    return rowHeight > maxHeight ? maxHeight : rowHeight;\n  }\n  getRowHeight() {\n    return this.rowList.reduce((pre, cur) => pre + cur.height, 0);\n  }\n  getExtraHeight() {\n    const margins = this.draw.getMargins();\n    const headerHeight = this.getHeight();\n    const headerTop = this.getHeaderTop();\n    const extraHeight = headerTop + headerHeight - margins[0];\n    return extraHeight <= 0 ? 0 : extraHeight;\n  }\n  render(ctx, pageNo) {\n    ctx.globalAlpha = 1;\n    const innerWidth = this.draw.getInnerWidth();\n    const maxHeight = this.getMaxHeight();\n    const rowList = [];\n    let curRowHeight = 0;\n    for (let r = 0; r < this.rowList.length; r++) {\n      const row = this.rowList[r];\n      if (curRowHeight + row.height > maxHeight) {\n        break;\n      }\n      rowList.push(row);\n      curRowHeight += row.height;\n    }\n    this.draw.drawRow(ctx, {\n      elementList: this.elementList,\n      positionList: this.positionList,\n      rowList,\n      pageNo,\n      startIndex: 0,\n      innerWidth,\n      zone: EditorZone.HEADER\n    });\n  }\n}\nclass SuperscriptParticle {\n  getOffsetY(element) {\n    return -element.metrics.height / 2;\n  }\n  render(ctx, element, x, y) {\n    ctx.save();\n    ctx.font = element.style;\n    if (element.color) {\n      ctx.fillStyle = element.color;\n    }\n    ctx.fillText(element.value, x, y + this.getOffsetY(element));\n    ctx.restore();\n  }\n}\nclass SubscriptParticle {\n  getOffsetY(element) {\n    return element.metrics.height / 2;\n  }\n  render(ctx, element, x, y) {\n    ctx.save();\n    ctx.font = element.style;\n    if (element.color) {\n      ctx.fillStyle = element.color;\n    }\n    ctx.fillText(element.value, x, y + this.getOffsetY(element));\n    ctx.restore();\n  }\n}\nclass SeparatorParticle {\n  constructor(draw) {\n    this.options = draw.getOptions();\n  }\n  render(ctx, element, x, y) {\n    var _a;\n    ctx.save();\n    const { scale, separator: { lineWidth, strokeStyle } } = this.options;\n    ctx.lineWidth = (element.lineWidth || lineWidth) * scale;\n    ctx.strokeStyle = element.color || strokeStyle;\n    if ((_a = element.dashArray) == null ? void 0 : _a.length) {\n      ctx.setLineDash(element.dashArray);\n    }\n    const offsetY = Math.round(y);\n    ctx.translate(0, ctx.lineWidth / 2);\n    ctx.beginPath();\n    ctx.moveTo(x, offsetY);\n    ctx.lineTo(x + element.width * scale, offsetY);\n    ctx.stroke();\n    ctx.restore();\n  }\n}\nclass PageBreakParticle {\n  constructor(draw) {\n    this.draw = draw;\n    this.options = draw.getOptions();\n    this.i18n = draw.getI18n();\n  }\n  render(ctx, element, x, y) {\n    const { pageBreak: { font, fontSize, lineDash } } = this.options;\n    const displayName = this.i18n.t(\"pageBreak.displayName\");\n    const { scale, defaultRowMargin } = this.options;\n    const size = fontSize * scale;\n    const elementWidth = element.width * scale;\n    const offsetY = this.draw.getDefaultBasicRowMarginHeight() * defaultRowMargin;\n    ctx.save();\n    ctx.font = `${size}px ${font}`;\n    const textMeasure = ctx.measureText(displayName);\n    const halfX = (elementWidth - textMeasure.width) / 2;\n    ctx.setLineDash(lineDash);\n    ctx.translate(0, 0.5 + offsetY);\n    ctx.beginPath();\n    ctx.moveTo(x, y);\n    ctx.lineTo(x + halfX, y);\n    ctx.moveTo(x + halfX + textMeasure.width, y);\n    ctx.lineTo(x + elementWidth, y);\n    ctx.stroke();\n    ctx.fillText(displayName, x + halfX, y + textMeasure.actualBoundingBoxAscent - size / 2);\n    ctx.restore();\n  }\n}\nclass Watermark {\n  constructor(draw) {\n    this.draw = draw;\n    this.options = draw.getOptions();\n  }\n  render(ctx) {\n    const { watermark: { data: data2, opacity, font, size, color, repeat, gap }, scale } = this.options;\n    const width = this.draw.getWidth();\n    const height = this.draw.getHeight();\n    ctx.save();\n    ctx.globalAlpha = opacity;\n    ctx.font = `${size * scale}px ${font}`;\n    const measureText = ctx.measureText(data2);\n    if (repeat) {\n      const dpr = this.draw.getPagePixelRatio();\n      const temporaryCanvas = document.createElement(\"canvas\");\n      const temporaryCtx = temporaryCanvas.getContext(\"2d\");\n      const textWidth = measureText.width;\n      const textHeight = measureText.actualBoundingBoxAscent + measureText.actualBoundingBoxDescent;\n      const diagonalLength = Math.sqrt(Math.pow(textWidth, 2) + Math.pow(textHeight, 2));\n      const patternWidth = diagonalLength + 2 * gap[0] * scale;\n      const patternHeight = diagonalLength + 2 * gap[1] * scale;\n      temporaryCanvas.width = patternWidth;\n      temporaryCanvas.height = patternHeight;\n      temporaryCanvas.style.width = `${patternWidth * dpr}px`;\n      temporaryCanvas.style.height = `${patternHeight * dpr}px`;\n      temporaryCtx.translate(patternWidth / 2, patternHeight / 2);\n      temporaryCtx.rotate(-45 * Math.PI / 180);\n      temporaryCtx.translate(-patternWidth / 2, -patternHeight / 2);\n      temporaryCtx.font = `${size * scale}px ${font}`;\n      temporaryCtx.fillStyle = color;\n      temporaryCtx.fillText(data2, (patternWidth - textWidth) / 2, (patternHeight - textHeight) / 2 + measureText.actualBoundingBoxAscent);\n      const pattern = ctx.createPattern(temporaryCanvas, \"repeat\");\n      if (pattern) {\n        ctx.fillStyle = pattern;\n        ctx.fillRect(0, 0, width, height);\n      }\n    } else {\n      const x = width / 2;\n      const y = height / 2;\n      ctx.fillStyle = color;\n      ctx.translate(x, y);\n      ctx.rotate(-45 * Math.PI / 180);\n      ctx.fillText(data2, -measureText.width / 2, measureText.actualBoundingBoxAscent - size / 2);\n    }\n    ctx.restore();\n  }\n}\nclass ControlSearch {\n  constructor(control) {\n    this.draw = control.getDraw();\n    this.options = this.draw.getOptions();\n    this.highlightList = [];\n    this.highlightMatchResult = [];\n  }\n  getHighlightMatchResult() {\n    return this.highlightMatchResult;\n  }\n  getHighlightList() {\n    return this.highlightList;\n  }\n  setHighlightList(payload) {\n    this.highlightList = payload;\n  }\n  computeHighlightList() {\n    const search = this.draw.getSearch();\n    const computeHighlight = (elementList, restArgs) => {\n      let i = 0;\n      while (i < elementList.length) {\n        const element = elementList[i];\n        i++;\n        if (element.type === ElementType.TABLE) {\n          const trList = element.trList;\n          for (let r = 0; r < trList.length; r++) {\n            const tr = trList[r];\n            for (let d = 0; d < tr.tdList.length; d++) {\n              const td = tr.tdList[d];\n              const restArgs2 = {\n                tableId: element.id,\n                tableIndex: i - 1,\n                trIndex: r,\n                tdIndex: d,\n                tdId: td.id\n              };\n              computeHighlight(td.value, restArgs2);\n            }\n          }\n        }\n        const currentControl = element == null ? void 0 : element.control;\n        if (!currentControl)\n          continue;\n        const highlightIndex = this.highlightList.findIndex((highlight2) => highlight2.id === element.controlId || currentControl.conceptId && currentControl.conceptId === highlight2.conceptId);\n        if (!~highlightIndex)\n          continue;\n        const startIndex = i;\n        let newEndIndex = i;\n        while (newEndIndex < elementList.length) {\n          const nextElement = elementList[newEndIndex];\n          if (nextElement.controlId !== element.controlId)\n            break;\n          newEndIndex++;\n        }\n        i = newEndIndex;\n        const controlElementList = elementList.slice(startIndex, newEndIndex).map((element2) => element2.controlComponent === ControlComponent.VALUE ? element2 : { value: ZERO });\n        const highlight = this.highlightList[highlightIndex];\n        const { ruleList } = highlight;\n        for (let r = 0; r < ruleList.length; r++) {\n          const rule = ruleList[r];\n          const searchResult = search.getMatchList(rule.keyword, controlElementList);\n          this.highlightMatchResult.push(...searchResult.map((result) => ({\n            ...result,\n            ...rule,\n            ...restArgs,\n            index: result.index + startIndex\n          })));\n        }\n      }\n    };\n    this.highlightMatchResult = [];\n    computeHighlight(this.draw.getOriginalMainElementList());\n  }\n  renderHighlightList(ctx, pageIndex) {\n    var _a, _b, _c;\n    if (!((_a = this.highlightMatchResult) == null ? void 0 : _a.length))\n      return;\n    const { searchMatchAlpha, searchMatchColor } = this.options;\n    const positionList = this.draw.getPosition().getOriginalPositionList();\n    const elementList = this.draw.getOriginalElementList();\n    ctx.save();\n    for (let s = 0; s < this.highlightMatchResult.length; s++) {\n      const searchMatch = this.highlightMatchResult[s];\n      let position = null;\n      if (searchMatch.tableId) {\n        const { tableIndex, trIndex, tdIndex, index: index2 } = searchMatch;\n        position = (_c = (_b = elementList[tableIndex]) == null ? void 0 : _b.trList[trIndex].tdList[tdIndex]) == null ? void 0 : _c.positionList[index2];\n      } else {\n        position = positionList[searchMatch.index];\n      }\n      if (!position)\n        continue;\n      const { coordinate: { leftTop, leftBottom, rightTop }, pageNo } = position;\n      if (pageNo !== pageIndex)\n        continue;\n      ctx.fillStyle = searchMatch.backgroundColor || searchMatchColor;\n      ctx.globalAlpha = searchMatch.alpha || searchMatchAlpha;\n      const x = leftTop[0];\n      const y = leftTop[1];\n      const width = rightTop[0] - leftTop[0];\n      const height = leftBottom[1] - leftTop[1];\n      ctx.fillRect(x, y, width, height);\n    }\n    ctx.restore();\n  }\n}\nclass ControlBorder {\n  constructor(draw) {\n    this.borderRect = this.clearBorderInfo();\n    this.options = draw.getOptions();\n  }\n  clearBorderInfo() {\n    this.borderRect = {\n      x: 0,\n      y: 0,\n      width: 0,\n      height: 0\n    };\n    return this.borderRect;\n  }\n  recordBorderInfo(x, y, width, height) {\n    const isFirstRecord = !this.borderRect.width;\n    if (isFirstRecord) {\n      this.borderRect.x = x;\n      this.borderRect.y = y;\n      this.borderRect.height = height;\n    }\n    this.borderRect.width += width;\n  }\n  render(ctx) {\n    if (!this.borderRect.width)\n      return;\n    const { scale, control: { borderWidth, borderColor } } = this.options;\n    const { x, y, width, height } = this.borderRect;\n    ctx.save();\n    ctx.translate(0, 1 * scale);\n    ctx.lineWidth = borderWidth * scale;\n    ctx.strokeStyle = borderColor;\n    ctx.beginPath();\n    ctx.rect(x, y, width, height);\n    ctx.stroke();\n    ctx.restore();\n    this.clearBorderInfo();\n  }\n}\nclass SelectControl {\n  constructor(element, control) {\n    this.options = control.getDraw().getOptions();\n    this.element = element;\n    this.control = control;\n    this.isPopup = false;\n    this.selectDom = null;\n  }\n  setElement(element) {\n    this.element = element;\n  }\n  getElement() {\n    return this.element;\n  }\n  getIsPopup() {\n    return this.isPopup;\n  }\n  getCode() {\n    var _a;\n    return ((_a = this.element.control) == null ? void 0 : _a.code) || null;\n  }\n  getValue(context = {}) {\n    const elementList = context.elementList || this.control.getElementList();\n    const { startIndex } = context.range || this.control.getRange();\n    const startElement = elementList[startIndex];\n    const data2 = [];\n    let preIndex = startIndex;\n    while (preIndex > 0) {\n      const preElement = elementList[preIndex];\n      if (preElement.controlId !== startElement.controlId || preElement.controlComponent === ControlComponent.PREFIX) {\n        break;\n      }\n      if (preElement.controlComponent === ControlComponent.VALUE) {\n        data2.unshift(preElement);\n      }\n      preIndex--;\n    }\n    let nextIndex = startIndex + 1;\n    while (nextIndex < elementList.length) {\n      const nextElement = elementList[nextIndex];\n      if (nextElement.controlId !== startElement.controlId || nextElement.controlComponent === ControlComponent.POSTFIX) {\n        break;\n      }\n      if (nextElement.controlComponent === ControlComponent.VALUE) {\n        data2.push(nextElement);\n      }\n      nextIndex++;\n    }\n    return data2;\n  }\n  setValue() {\n    return -1;\n  }\n  keydown(evt) {\n    if (this.control.getIsDisabledControl()) {\n      return null;\n    }\n    const elementList = this.control.getElementList();\n    const range = this.control.getRange();\n    this.control.shrinkBoundary();\n    const { startIndex, endIndex } = range;\n    const startElement = elementList[startIndex];\n    const endElement = elementList[endIndex];\n    if (evt.key === KeyMap.Backspace) {\n      if (startIndex !== endIndex) {\n        return this.clearSelect();\n      } else {\n        if (startElement.controlComponent === ControlComponent.PREFIX || endElement.controlComponent === ControlComponent.POSTFIX || startElement.controlComponent === ControlComponent.PLACEHOLDER) {\n          return this.control.removeControl(startIndex);\n        } else {\n          return this.clearSelect();\n        }\n      }\n    } else if (evt.key === KeyMap.Delete) {\n      if (startIndex !== endIndex) {\n        return this.clearSelect();\n      } else {\n        const endNextElement = elementList[endIndex + 1];\n        if (startElement.controlComponent === ControlComponent.PREFIX && endNextElement.controlComponent === ControlComponent.PLACEHOLDER || endNextElement.controlComponent === ControlComponent.POSTFIX || startElement.controlComponent === ControlComponent.PLACEHOLDER) {\n          return this.control.removeControl(startIndex);\n        } else {\n          return this.clearSelect();\n        }\n      }\n    }\n    return endIndex;\n  }\n  cut() {\n    if (this.control.getIsDisabledControl()) {\n      return -1;\n    }\n    this.control.shrinkBoundary();\n    const { startIndex, endIndex } = this.control.getRange();\n    if (startIndex === endIndex) {\n      return startIndex;\n    }\n    return this.clearSelect();\n  }\n  clearSelect(context = {}, options = {}) {\n    const { isIgnoreDisabledRule = false, isAddPlaceholder = true } = options;\n    if (!isIgnoreDisabledRule && this.control.getIsDisabledControl(context)) {\n      return -1;\n    }\n    const elementList = context.elementList || this.control.getElementList();\n    const { startIndex } = context.range || this.control.getRange();\n    const startElement = elementList[startIndex];\n    let leftIndex = -1;\n    let rightIndex = -1;\n    let preIndex = startIndex;\n    while (preIndex > 0) {\n      const preElement = elementList[preIndex];\n      if (preElement.controlId !== startElement.controlId || preElement.controlComponent === ControlComponent.PREFIX) {\n        leftIndex = preIndex;\n        break;\n      }\n      preIndex--;\n    }\n    let nextIndex = startIndex + 1;\n    while (nextIndex < elementList.length) {\n      const nextElement = elementList[nextIndex];\n      if (nextElement.controlId !== startElement.controlId || nextElement.controlComponent === ControlComponent.POSTFIX) {\n        rightIndex = nextIndex - 1;\n        break;\n      }\n      nextIndex++;\n    }\n    if (!~leftIndex || !~rightIndex)\n      return -1;\n    const draw = this.control.getDraw();\n    draw.spliceElementList(elementList, leftIndex + 1, rightIndex - leftIndex);\n    if (isAddPlaceholder) {\n      this.control.addPlaceholder(preIndex, context);\n    }\n    this.element.control.code = null;\n    return preIndex;\n  }\n  setSelect(code, context = {}, options = {}) {\n    if (!options.isIgnoreDisabledRule && this.control.getIsDisabledControl(context)) {\n      return;\n    }\n    const elementList = context.elementList || this.control.getElementList();\n    const range = context.range || this.control.getRange();\n    const control = this.element.control;\n    const oldCode = control.code;\n    if (code === oldCode) {\n      this.control.repaintControl({\n        curIndex: range.startIndex,\n        isCompute: false,\n        isSubmitHistory: false\n      });\n      this.destroy();\n      return;\n    }\n    const valueSets = control.valueSets;\n    if (!Array.isArray(valueSets) || !valueSets.length)\n      return;\n    const valueSet = valueSets.find((v) => v.code === code);\n    if (!valueSet)\n      return;\n    const valueElement = this.getValue(context)[0];\n    const styleElement = valueElement ? pickObject(valueElement, EDITOR_ELEMENT_STYLE_ATTR) : pickObject(elementList[range.startIndex], CONTROL_STYLE_ATTR);\n    const prefixIndex = this.clearSelect(context, {\n      isAddPlaceholder: false\n    });\n    if (!~prefixIndex)\n      return;\n    if (!oldCode) {\n      this.control.removePlaceholder(prefixIndex, context);\n    }\n    const propertyElement = omitObject(elementList[prefixIndex], EDITOR_ELEMENT_STYLE_ATTR);\n    const start = prefixIndex + 1;\n    const data2 = splitText(valueSet.value);\n    const draw = this.control.getDraw();\n    for (let i = 0; i < data2.length; i++) {\n      const newElement = {\n        ...styleElement,\n        ...propertyElement,\n        type: ElementType.TEXT,\n        value: data2[i],\n        controlComponent: ControlComponent.VALUE\n      };\n      formatElementContext(elementList, [newElement], prefixIndex, {\n        editorOptions: this.options\n      });\n      draw.spliceElementList(elementList, start + i, 0, newElement);\n    }\n    control.code = code;\n    if (!context.range) {\n      const newIndex = start + data2.length - 1;\n      this.control.repaintControl({\n        curIndex: newIndex\n      });\n      this.destroy();\n    }\n  }\n  _createSelectPopupDom() {\n    const control = this.element.control;\n    const valueSets = control.valueSets;\n    if (!Array.isArray(valueSets) || !valueSets.length)\n      return;\n    const position = this.control.getPosition();\n    if (!position)\n      return;\n    const selectPopupContainer = document.createElement(\"div\");\n    selectPopupContainer.classList.add(`${EDITOR_PREFIX}-select-control-popup`);\n    selectPopupContainer.setAttribute(EDITOR_COMPONENT, EditorComponent.POPUP);\n    const ul = document.createElement(\"ul\");\n    for (let v = 0; v < valueSets.length; v++) {\n      const valueSet = valueSets[v];\n      const li = document.createElement(\"li\");\n      const code = this.getCode();\n      if (code === valueSet.code) {\n        li.classList.add(\"active\");\n      }\n      li.onclick = () => {\n        this.setSelect(valueSet.code);\n      };\n      li.append(document.createTextNode(valueSet.value));\n      ul.append(li);\n    }\n    selectPopupContainer.append(ul);\n    const { coordinate: { leftTop: [left2, top] }, lineHeight } = position;\n    const preY = this.control.getPreY();\n    selectPopupContainer.style.left = `${left2}px`;\n    selectPopupContainer.style.top = `${top + preY + lineHeight}px`;\n    const container = this.control.getContainer();\n    container.append(selectPopupContainer);\n    this.selectDom = selectPopupContainer;\n  }\n  awake() {\n    var _a;\n    if (this.isPopup || this.control.getIsDisabledControl())\n      return;\n    const { startIndex } = this.control.getRange();\n    const elementList = this.control.getElementList();\n    if (((_a = elementList[startIndex + 1]) == null ? void 0 : _a.controlId) !== this.element.controlId) {\n      return;\n    }\n    this._createSelectPopupDom();\n    this.isPopup = true;\n  }\n  destroy() {\n    var _a;\n    if (!this.isPopup)\n      return;\n    (_a = this.selectDom) == null ? void 0 : _a.remove();\n    this.isPopup = false;\n  }\n}\nclass TextControl {\n  constructor(element, control) {\n    this.options = control.getDraw().getOptions();\n    this.element = element;\n    this.control = control;\n  }\n  setElement(element) {\n    this.element = element;\n  }\n  getElement() {\n    return this.element;\n  }\n  getValue(context = {}) {\n    const elementList = context.elementList || this.control.getElementList();\n    const { startIndex } = context.range || this.control.getRange();\n    const startElement = elementList[startIndex];\n    const data2 = [];\n    let preIndex = startIndex;\n    while (preIndex > 0) {\n      const preElement = elementList[preIndex];\n      if (preElement.controlId !== startElement.controlId || preElement.controlComponent === ControlComponent.PREFIX) {\n        break;\n      }\n      if (preElement.controlComponent === ControlComponent.VALUE) {\n        data2.unshift(preElement);\n      }\n      preIndex--;\n    }\n    let nextIndex = startIndex + 1;\n    while (nextIndex < elementList.length) {\n      const nextElement = elementList[nextIndex];\n      if (nextElement.controlId !== startElement.controlId || nextElement.controlComponent === ControlComponent.POSTFIX) {\n        break;\n      }\n      if (nextElement.controlComponent === ControlComponent.VALUE) {\n        data2.push(nextElement);\n      }\n      nextIndex++;\n    }\n    return data2;\n  }\n  setValue(data2, context = {}, options = {}) {\n    if (!options.isIgnoreDisabledRule && this.control.getIsDisabledControl(context)) {\n      return -1;\n    }\n    const elementList = context.elementList || this.control.getElementList();\n    const range = context.range || this.control.getRange();\n    this.control.shrinkBoundary(context);\n    const { startIndex, endIndex } = range;\n    const draw = this.control.getDraw();\n    if (startIndex !== endIndex) {\n      draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex);\n    } else {\n      this.control.removePlaceholder(startIndex, context);\n    }\n    const startElement = elementList[startIndex];\n    const anchorElement = startElement.type && !TEXTLIKE_ELEMENT_TYPE.includes(startElement.type) || startElement.controlComponent === ControlComponent.PREFIX ? pickObject(startElement, [\n      \"control\",\n      \"controlId\",\n      ...CONTROL_STYLE_ATTR\n    ]) : omitObject(startElement, [\"type\"]);\n    const start = range.startIndex + 1;\n    for (let i = 0; i < data2.length; i++) {\n      const newElement = {\n        ...anchorElement,\n        ...data2[i],\n        controlComponent: ControlComponent.VALUE\n      };\n      formatElementContext(elementList, [newElement], startIndex, {\n        editorOptions: this.options\n      });\n      draw.spliceElementList(elementList, start + i, 0, newElement);\n    }\n    return start + data2.length - 1;\n  }\n  clearValue(context = {}, options = {}) {\n    if (!options.isIgnoreDisabledRule && this.control.getIsDisabledControl(context)) {\n      return -1;\n    }\n    const elementList = context.elementList || this.control.getElementList();\n    const range = context.range || this.control.getRange();\n    const { startIndex, endIndex } = range;\n    this.control.getDraw().spliceElementList(elementList, startIndex + 1, endIndex - startIndex);\n    const value = this.getValue(context);\n    if (!value.length) {\n      this.control.addPlaceholder(startIndex, context);\n    }\n    return startIndex;\n  }\n  keydown(evt) {\n    if (this.control.getIsDisabledControl()) {\n      return null;\n    }\n    const elementList = this.control.getElementList();\n    const range = this.control.getRange();\n    this.control.shrinkBoundary();\n    const { startIndex, endIndex } = range;\n    const startElement = elementList[startIndex];\n    const endElement = elementList[endIndex];\n    const draw = this.control.getDraw();\n    if (evt.key === KeyMap.Backspace) {\n      if (startIndex !== endIndex) {\n        draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex);\n        const value = this.getValue();\n        if (!value.length) {\n          this.control.addPlaceholder(startIndex);\n        }\n        return startIndex;\n      } else {\n        if (startElement.controlComponent === ControlComponent.PREFIX || endElement.controlComponent === ControlComponent.POSTFIX || startElement.controlComponent === ControlComponent.PLACEHOLDER) {\n          return this.control.removeControl(startIndex);\n        } else {\n          draw.spliceElementList(elementList, startIndex, 1);\n          const value = this.getValue();\n          if (!value.length) {\n            this.control.addPlaceholder(startIndex - 1);\n          }\n          return startIndex - 1;\n        }\n      }\n    } else if (evt.key === KeyMap.Delete) {\n      if (startIndex !== endIndex) {\n        draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex);\n        const value = this.getValue();\n        if (!value.length) {\n          this.control.addPlaceholder(startIndex);\n        }\n        return startIndex;\n      } else {\n        const endNextElement = elementList[endIndex + 1];\n        if (startElement.controlComponent === ControlComponent.PREFIX && endNextElement.controlComponent === ControlComponent.PLACEHOLDER || endNextElement.controlComponent === ControlComponent.POSTFIX || startElement.controlComponent === ControlComponent.PLACEHOLDER) {\n          return this.control.removeControl(startIndex);\n        } else {\n          draw.spliceElementList(elementList, startIndex + 1, 1);\n          const value = this.getValue();\n          if (!value.length) {\n            this.control.addPlaceholder(startIndex);\n          }\n          return startIndex;\n        }\n      }\n    }\n    return endIndex;\n  }\n  cut() {\n    if (this.control.getIsDisabledControl()) {\n      return -1;\n    }\n    this.control.shrinkBoundary();\n    const { startIndex, endIndex } = this.control.getRange();\n    if (startIndex === endIndex) {\n      return startIndex;\n    }\n    const draw = this.control.getDraw();\n    const elementList = this.control.getElementList();\n    draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex);\n    const value = this.getValue();\n    if (!value.length) {\n      this.control.addPlaceholder(startIndex);\n    }\n    return startIndex;\n  }\n}\nclass DatePicker {\n  constructor(draw, options = {}) {\n    this.draw = draw;\n    this.options = options;\n    this.lang = this._getLang();\n    this.now = new Date();\n    this.dom = this._createDom();\n    this.renderOptions = null;\n    this.isDatePicker = true;\n    this.pickDate = null;\n    this._bindEvent();\n  }\n  _createDom() {\n    const datePickerContainer = document.createElement(\"div\");\n    datePickerContainer.classList.add(`${EDITOR_PREFIX}-date-container`);\n    datePickerContainer.setAttribute(EDITOR_COMPONENT, EditorComponent.POPUP);\n    const dateWrap = document.createElement(\"div\");\n    dateWrap.classList.add(`${EDITOR_PREFIX}-date-wrap`);\n    const datePickerTitle = document.createElement(\"div\");\n    datePickerTitle.classList.add(`${EDITOR_PREFIX}-date-title`);\n    const preYearTitle = document.createElement(\"span\");\n    preYearTitle.classList.add(`${EDITOR_PREFIX}-date-title__pre-year`);\n    preYearTitle.innerText = `<<`;\n    const preMonthTitle = document.createElement(\"span\");\n    preMonthTitle.classList.add(`${EDITOR_PREFIX}-date-title__pre-month`);\n    preMonthTitle.innerText = `<`;\n    const nowTitle = document.createElement(\"span\");\n    nowTitle.classList.add(`${EDITOR_PREFIX}-date-title__now`);\n    const nextMonthTitle = document.createElement(\"span\");\n    nextMonthTitle.classList.add(`${EDITOR_PREFIX}-date-title__next-month`);\n    nextMonthTitle.innerText = `>`;\n    const nextYearTitle = document.createElement(\"span\");\n    nextYearTitle.classList.add(`${EDITOR_PREFIX}-date-title__next-year`);\n    nextYearTitle.innerText = `>>`;\n    datePickerTitle.append(preYearTitle);\n    datePickerTitle.append(preMonthTitle);\n    datePickerTitle.append(nowTitle);\n    datePickerTitle.append(nextMonthTitle);\n    datePickerTitle.append(nextYearTitle);\n    const datePickerWeek = document.createElement(\"div\");\n    datePickerWeek.classList.add(`${EDITOR_PREFIX}-date-week`);\n    const { weeks: { sun, mon, tue, wed, thu, fri, sat } } = this.lang;\n    const weekList = [sun, mon, tue, wed, thu, fri, sat];\n    weekList.forEach((week) => {\n      const weekDom = document.createElement(\"span\");\n      weekDom.innerText = `${week}`;\n      datePickerWeek.append(weekDom);\n    });\n    const datePickerDay = document.createElement(\"div\");\n    datePickerDay.classList.add(`${EDITOR_PREFIX}-date-day`);\n    dateWrap.append(datePickerTitle);\n    dateWrap.append(datePickerWeek);\n    dateWrap.append(datePickerDay);\n    const timeWrap = document.createElement(\"ul\");\n    timeWrap.classList.add(`${EDITOR_PREFIX}-time-wrap`);\n    let hourTime;\n    let minuteTime;\n    let secondTime;\n    const timeList = [this.lang.hour, this.lang.minute, this.lang.second];\n    timeList.forEach((t, i) => {\n      const li = document.createElement(\"li\");\n      const timeText = document.createElement(\"span\");\n      timeText.innerText = t;\n      li.append(timeText);\n      const ol = document.createElement(\"ol\");\n      const isHour = i === 0;\n      const isMinute = i === 1;\n      const endIndex = isHour ? 24 : 60;\n      for (let i2 = 0; i2 < endIndex; i2++) {\n        const time = document.createElement(\"li\");\n        time.innerText = `${String(i2).padStart(2, \"0\")}`;\n        time.setAttribute(\"data-id\", `${i2}`);\n        ol.append(time);\n      }\n      if (isHour) {\n        hourTime = ol;\n      } else if (isMinute) {\n        minuteTime = ol;\n      } else {\n        secondTime = ol;\n      }\n      li.append(ol);\n      timeWrap.append(li);\n    });\n    const datePickerMenu = document.createElement(\"div\");\n    datePickerMenu.classList.add(`${EDITOR_PREFIX}-date-menu`);\n    const timeMenu = document.createElement(\"button\");\n    timeMenu.classList.add(`${EDITOR_PREFIX}-date-menu__time`);\n    timeMenu.innerText = this.lang.timeSelect;\n    const nowMenu = document.createElement(\"button\");\n    nowMenu.classList.add(`${EDITOR_PREFIX}-date-menu__now`);\n    nowMenu.innerText = this.lang.now;\n    const submitMenu = document.createElement(\"button\");\n    submitMenu.classList.add(`${EDITOR_PREFIX}-date-menu__submit`);\n    submitMenu.innerText = this.lang.confirm;\n    datePickerMenu.append(timeMenu);\n    datePickerMenu.append(nowMenu);\n    datePickerMenu.append(submitMenu);\n    datePickerContainer.append(dateWrap);\n    datePickerContainer.append(timeWrap);\n    datePickerContainer.append(datePickerMenu);\n    this.draw.getContainer().append(datePickerContainer);\n    return {\n      container: datePickerContainer,\n      dateWrap,\n      datePickerWeek,\n      timeWrap,\n      title: {\n        preYear: preYearTitle,\n        preMonth: preMonthTitle,\n        now: nowTitle,\n        nextMonth: nextMonthTitle,\n        nextYear: nextYearTitle\n      },\n      day: datePickerDay,\n      time: {\n        hour: hourTime,\n        minute: minuteTime,\n        second: secondTime\n      },\n      menu: {\n        time: timeMenu,\n        now: nowMenu,\n        submit: submitMenu\n      }\n    };\n  }\n  _bindEvent() {\n    this.dom.title.preYear.onclick = () => {\n      this._preYear();\n    };\n    this.dom.title.preMonth.onclick = () => {\n      this._preMonth();\n    };\n    this.dom.title.nextMonth.onclick = () => {\n      this._nextMonth();\n    };\n    this.dom.title.nextYear.onclick = () => {\n      this._nextYear();\n    };\n    this.dom.menu.time.onclick = () => {\n      this.isDatePicker = !this.isDatePicker;\n      this._toggleDateTimePicker();\n    };\n    this.dom.menu.now.onclick = () => {\n      this._now();\n      this._submit();\n    };\n    this.dom.menu.submit.onclick = () => {\n      this.dispose();\n      this._submit();\n    };\n    this.dom.time.hour.onclick = (evt) => {\n      if (!this.pickDate)\n        return;\n      const li = evt.target;\n      const id = li.dataset.id;\n      if (!id)\n        return;\n      this.pickDate.setHours(Number(id));\n      this._setTimePick(false);\n    };\n    this.dom.time.minute.onclick = (evt) => {\n      if (!this.pickDate)\n        return;\n      const li = evt.target;\n      const id = li.dataset.id;\n      if (!id)\n        return;\n      this.pickDate.setMinutes(Number(id));\n      this._setTimePick(false);\n    };\n    this.dom.time.second.onclick = (evt) => {\n      if (!this.pickDate)\n        return;\n      const li = evt.target;\n      const id = li.dataset.id;\n      if (!id)\n        return;\n      this.pickDate.setSeconds(Number(id));\n      this._setTimePick(false);\n    };\n  }\n  _setPosition() {\n    if (!this.renderOptions)\n      return;\n    const { position: { coordinate: { leftTop: [left2, top] }, lineHeight, pageNo } } = this.renderOptions;\n    const height = this.draw.getHeight();\n    const pageGap = this.draw.getPageGap();\n    const currentPageNo = pageNo != null ? pageNo : this.draw.getPageNo();\n    const preY = currentPageNo * (height + pageGap);\n    this.dom.container.style.left = `${left2}px`;\n    this.dom.container.style.top = `${top + preY + lineHeight}px`;\n  }\n  isInvalidDate(value) {\n    return value.toDateString() === \"Invalid Date\";\n  }\n  _setValue() {\n    var _a;\n    const value = (_a = this.renderOptions) == null ? void 0 : _a.value;\n    if (value) {\n      const setDate = new Date(value);\n      this.now = this.isInvalidDate(setDate) ? new Date() : setDate;\n    } else {\n      this.now = new Date();\n    }\n    this.pickDate = new Date(this.now);\n  }\n  _getLang() {\n    const i18n = this.draw.getI18n();\n    const t = i18n.t.bind(i18n);\n    return {\n      now: t(\"datePicker.now\"),\n      confirm: t(\"datePicker.confirm\"),\n      return: t(\"datePicker.return\"),\n      timeSelect: t(\"datePicker.timeSelect\"),\n      weeks: {\n        sun: t(\"datePicker.weeks.sun\"),\n        mon: t(\"datePicker.weeks.mon\"),\n        tue: t(\"datePicker.weeks.tue\"),\n        wed: t(\"datePicker.weeks.wed\"),\n        thu: t(\"datePicker.weeks.thu\"),\n        fri: t(\"datePicker.weeks.fri\"),\n        sat: t(\"datePicker.weeks.sat\")\n      },\n      year: t(\"datePicker.year\"),\n      month: t(\"datePicker.month\"),\n      hour: t(\"datePicker.hour\"),\n      minute: t(\"datePicker.minute\"),\n      second: t(\"datePicker.second\")\n    };\n  }\n  _setLangChange() {\n    this.dom.menu.time.innerText = this.lang.timeSelect;\n    this.dom.menu.now.innerText = this.lang.now;\n    this.dom.menu.submit.innerText = this.lang.confirm;\n    const { weeks: { sun, mon, tue, wed, thu, fri, sat } } = this.lang;\n    const weekList = [sun, mon, tue, wed, thu, fri, sat];\n    this.dom.datePickerWeek.childNodes.forEach((child, i) => {\n      const childElement = child;\n      childElement.innerText = weekList[i];\n    });\n    const hourTitle = this.dom.time.hour.previousElementSibling;\n    hourTitle.innerText = this.lang.hour;\n    const minuteTitle = this.dom.time.minute.previousElementSibling;\n    minuteTitle.innerText = this.lang.minute;\n    const secondTitle = this.dom.time.second.previousElementSibling;\n    secondTitle.innerText = this.lang.second;\n  }\n  _update() {\n    const localDate = new Date();\n    const localYear = localDate.getFullYear();\n    const localMonth = localDate.getMonth() + 1;\n    const localDay = localDate.getDate();\n    let pickYear = null;\n    let pickMonth = null;\n    let pickDay = null;\n    if (this.pickDate) {\n      pickYear = this.pickDate.getFullYear();\n      pickMonth = this.pickDate.getMonth() + 1;\n      pickDay = this.pickDate.getDate();\n    }\n    const year = this.now.getFullYear();\n    const month = this.now.getMonth() + 1;\n    this.dom.title.now.innerText = `${year}${this.lang.year} ${String(month).padStart(2, \"0\")}${this.lang.month}`;\n    const curDate = new Date(year, month, 0);\n    const curDay = curDate.getDate();\n    let curWeek = new Date(year, month - 1, 1).getDay();\n    if (curWeek === 0) {\n      curWeek = 7;\n    }\n    const preDay = new Date(year, month - 1, 0).getDate();\n    this.dom.day.innerHTML = \"\";\n    const preStartDay = preDay - curWeek + 1;\n    for (let i = preStartDay; i <= preDay; i++) {\n      const dayDom = document.createElement(\"div\");\n      dayDom.classList.add(\"disable\");\n      dayDom.innerText = `${i}`;\n      dayDom.onclick = () => {\n        const newMonth = month - 2;\n        this.now = new Date(year, newMonth, i);\n        this._setDatePick(year, newMonth, i);\n      };\n      this.dom.day.append(dayDom);\n    }\n    for (let i = 1; i <= curDay; i++) {\n      const dayDom = document.createElement(\"div\");\n      if (localYear === year && localMonth === month && localDay === i) {\n        dayDom.classList.add(\"active\");\n      }\n      if (this.pickDate && pickYear === year && pickMonth === month && pickDay === i) {\n        dayDom.classList.add(\"select\");\n      }\n      dayDom.innerText = `${i}`;\n      dayDom.onclick = (evt) => {\n        const newMonth = month - 1;\n        this.now = new Date(year, newMonth, i);\n        this._setDatePick(year, newMonth, i);\n        evt.stopPropagation();\n      };\n      this.dom.day.append(dayDom);\n    }\n    const nextEndDay = 6 * 7 - curWeek - curDay;\n    for (let i = 1; i <= nextEndDay; i++) {\n      const dayDom = document.createElement(\"div\");\n      dayDom.classList.add(\"disable\");\n      dayDom.innerText = `${i}`;\n      dayDom.onclick = () => {\n        this.now = new Date(year, month, i);\n        this._setDatePick(year, month, i);\n      };\n      this.dom.day.append(dayDom);\n    }\n  }\n  _toggleDateTimePicker() {\n    if (this.isDatePicker) {\n      this.dom.dateWrap.classList.add(\"active\");\n      this.dom.timeWrap.classList.remove(\"active\");\n      this.dom.menu.time.innerText = this.lang.timeSelect;\n    } else {\n      this.dom.dateWrap.classList.remove(\"active\");\n      this.dom.timeWrap.classList.add(\"active\");\n      this.dom.menu.time.innerText = this.lang.return;\n      this._setTimePick();\n    }\n  }\n  _setDatePick(year, month, day) {\n    var _a, _b, _c;\n    this.now = new Date(year, month, day);\n    (_a = this.pickDate) == null ? void 0 : _a.setFullYear(year);\n    (_b = this.pickDate) == null ? void 0 : _b.setMonth(month);\n    (_c = this.pickDate) == null ? void 0 : _c.setDate(day);\n    this._update();\n  }\n  _setTimePick(isIntoView = true) {\n    var _a, _b, _c;\n    const hour = ((_a = this.pickDate) == null ? void 0 : _a.getHours()) || 0;\n    const minute = ((_b = this.pickDate) == null ? void 0 : _b.getMinutes()) || 0;\n    const second = ((_c = this.pickDate) == null ? void 0 : _c.getSeconds()) || 0;\n    const { hour: hourDom, minute: minuteDom, second: secondDom } = this.dom.time;\n    const timeDomList = [hourDom, minuteDom, secondDom];\n    timeDomList.forEach((timeDom) => {\n      timeDom.querySelectorAll(\"li\").forEach((li) => li.classList.remove(\"active\"));\n    });\n    const pickList = [\n      [hourDom, hour],\n      [minuteDom, minute],\n      [secondDom, second]\n    ];\n    pickList.forEach(([dom, time]) => {\n      const pickDom = dom.querySelector(`[data-id='${time}']`);\n      pickDom.classList.add(\"active\");\n      if (isIntoView) {\n        this._scrollIntoView(dom, pickDom);\n      }\n    });\n  }\n  _scrollIntoView(container, selected) {\n    if (!selected) {\n      container.scrollTop = 0;\n      return;\n    }\n    const offsetParents = [];\n    let pointer = selected.offsetParent;\n    while (pointer && container !== pointer && container.contains(pointer)) {\n      offsetParents.push(pointer);\n      pointer = pointer.offsetParent;\n    }\n    const top = selected.offsetTop + offsetParents.reduce((prev, curr) => prev + curr.offsetTop, 0);\n    const bottom = top + selected.offsetHeight;\n    const viewRectTop = container.scrollTop;\n    const viewRectBottom = viewRectTop + container.clientHeight;\n    if (top < viewRectTop) {\n      container.scrollTop = top;\n    } else if (bottom > viewRectBottom) {\n      container.scrollTop = bottom - container.clientHeight;\n    }\n  }\n  _preMonth() {\n    this.now.setMonth(this.now.getMonth() - 1);\n    this._update();\n  }\n  _nextMonth() {\n    this.now.setMonth(this.now.getMonth() + 1);\n    this._update();\n  }\n  _preYear() {\n    this.now.setFullYear(this.now.getFullYear() - 1);\n    this._update();\n  }\n  _nextYear() {\n    this.now.setFullYear(this.now.getFullYear() + 1);\n    this._update();\n  }\n  _now() {\n    this.pickDate = new Date();\n    this.dispose();\n  }\n  _toggleVisible(isVisible) {\n    if (isVisible) {\n      this.dom.container.classList.add(\"active\");\n    } else {\n      this.dom.container.classList.remove(\"active\");\n    }\n  }\n  _submit() {\n    var _a;\n    if (this.options.onSubmit && this.pickDate) {\n      const format = (_a = this.renderOptions) == null ? void 0 : _a.dateFormat;\n      const pickDateString = this.formatDate(this.pickDate, format);\n      this.options.onSubmit(pickDateString);\n    }\n  }\n  formatDate(date, format = \"yyyy-MM-dd hh:mm:ss\") {\n    let dateString = format;\n    const dateOption = {\n      \"y+\": date.getFullYear().toString(),\n      \"M+\": (date.getMonth() + 1).toString(),\n      \"d+\": date.getDate().toString(),\n      \"h+\": date.getHours().toString(),\n      \"m+\": date.getMinutes().toString(),\n      \"s+\": date.getSeconds().toString()\n    };\n    for (const k in dateOption) {\n      const reg = new RegExp(\"(\" + k + \")\").exec(format);\n      const key = k;\n      if (reg) {\n        dateString = dateString.replace(reg[1], reg[1].length === 1 ? dateOption[key] : dateOption[key].padStart(reg[1].length, \"0\"));\n      }\n    }\n    return dateString;\n  }\n  render(option) {\n    this.renderOptions = option;\n    this.lang = this._getLang();\n    this._setLangChange();\n    this._setValue();\n    this._update();\n    this._setPosition();\n    this.isDatePicker = true;\n    this._toggleDateTimePicker();\n    this._toggleVisible(true);\n  }\n  dispose() {\n    this._toggleVisible(false);\n  }\n  destroy() {\n    this.dom.container.remove();\n  }\n}\nclass DateControl {\n  constructor(element, control) {\n    const draw = control.getDraw();\n    this.draw = draw;\n    this.options = draw.getOptions();\n    this.element = element;\n    this.control = control;\n    this.isPopup = false;\n    this.datePicker = null;\n  }\n  setElement(element) {\n    this.element = element;\n  }\n  getElement() {\n    return this.element;\n  }\n  getIsPopup() {\n    return this.isPopup;\n  }\n  getValueRange(context = {}) {\n    const elementList = context.elementList || this.control.getElementList();\n    const { startIndex } = context.range || this.control.getRange();\n    const startElement = elementList[startIndex];\n    let preIndex = startIndex;\n    while (preIndex > 0) {\n      const preElement = elementList[preIndex];\n      if (preElement.controlId !== startElement.controlId || preElement.controlComponent === ControlComponent.PREFIX) {\n        break;\n      }\n      preIndex--;\n    }\n    let nextIndex = startIndex + 1;\n    while (nextIndex < elementList.length) {\n      const nextElement = elementList[nextIndex];\n      if (nextElement.controlId !== startElement.controlId || nextElement.controlComponent === ControlComponent.POSTFIX) {\n        break;\n      }\n      nextIndex++;\n    }\n    if (preIndex === nextIndex)\n      return null;\n    return [preIndex, nextIndex - 1];\n  }\n  getValue(context = {}) {\n    const elementList = context.elementList || this.control.getElementList();\n    const range = this.getValueRange(context);\n    if (!range)\n      return [];\n    const data2 = [];\n    const [startIndex, endIndex] = range;\n    for (let i = startIndex; i <= endIndex; i++) {\n      const element = elementList[i];\n      if (element.controlComponent === ControlComponent.VALUE) {\n        data2.push(element);\n      }\n    }\n    return data2;\n  }\n  setValue(data2, context = {}, options = {}) {\n    if (!options.isIgnoreDisabledRule && this.control.getIsDisabledControl(context)) {\n      return -1;\n    }\n    const elementList = context.elementList || this.control.getElementList();\n    const range = context.range || this.control.getRange();\n    this.control.shrinkBoundary(context);\n    const { startIndex, endIndex } = range;\n    const draw = this.control.getDraw();\n    if (startIndex !== endIndex) {\n      draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex);\n    } else {\n      this.control.removePlaceholder(startIndex, context);\n    }\n    const startElement = elementList[startIndex];\n    const anchorElement = startElement.type && !TEXTLIKE_ELEMENT_TYPE.includes(startElement.type) || startElement.controlComponent === ControlComponent.PREFIX ? pickObject(startElement, [\n      \"control\",\n      \"controlId\",\n      ...CONTROL_STYLE_ATTR\n    ]) : omitObject(startElement, [\"type\"]);\n    const start = range.startIndex + 1;\n    for (let i = 0; i < data2.length; i++) {\n      const newElement = {\n        ...anchorElement,\n        ...data2[i],\n        controlComponent: ControlComponent.VALUE\n      };\n      formatElementContext(elementList, [newElement], startIndex, {\n        editorOptions: this.options\n      });\n      draw.spliceElementList(elementList, start + i, 0, newElement);\n    }\n    return start + data2.length - 1;\n  }\n  clearSelect(context = {}, options = {}) {\n    const { isIgnoreDisabledRule = false, isAddPlaceholder = true } = options;\n    if (!isIgnoreDisabledRule && this.control.getIsDisabledControl(context)) {\n      return -1;\n    }\n    const range = this.getValueRange(context);\n    if (!range)\n      return -1;\n    const [leftIndex, rightIndex] = range;\n    if (!~leftIndex || !~rightIndex)\n      return -1;\n    const elementList = context.elementList || this.control.getElementList();\n    const draw = this.control.getDraw();\n    draw.spliceElementList(elementList, leftIndex + 1, rightIndex - leftIndex);\n    if (isAddPlaceholder) {\n      this.control.addPlaceholder(leftIndex, context);\n    }\n    return leftIndex;\n  }\n  setSelect(date, context = {}, options = {}) {\n    if (!options.isIgnoreDisabledRule && this.control.getIsDisabledControl(context)) {\n      return;\n    }\n    const elementList = context.elementList || this.control.getElementList();\n    const range = context.range || this.control.getRange();\n    const valueElement = this.getValue(context)[0];\n    const styleElement = valueElement ? pickObject(valueElement, EDITOR_ELEMENT_STYLE_ATTR) : pickObject(elementList[range.startIndex], CONTROL_STYLE_ATTR);\n    const prefixIndex = this.clearSelect(context, {\n      isAddPlaceholder: false\n    });\n    if (!~prefixIndex)\n      return;\n    const propertyElement = omitObject(elementList[prefixIndex], EDITOR_ELEMENT_STYLE_ATTR);\n    const start = prefixIndex + 1;\n    const draw = this.control.getDraw();\n    for (let i = 0; i < date.length; i++) {\n      const newElement = {\n        ...styleElement,\n        ...propertyElement,\n        type: ElementType.TEXT,\n        value: date[i],\n        controlComponent: ControlComponent.VALUE\n      };\n      formatElementContext(elementList, [newElement], prefixIndex, {\n        editorOptions: this.options\n      });\n      draw.spliceElementList(elementList, start + i, 0, newElement);\n    }\n    if (!context.range) {\n      const newIndex = start + date.length - 1;\n      this.control.repaintControl({\n        curIndex: newIndex\n      });\n      this.destroy();\n    }\n  }\n  keydown(evt) {\n    if (this.control.getIsDisabledControl()) {\n      return null;\n    }\n    const elementList = this.control.getElementList();\n    const range = this.control.getRange();\n    this.control.shrinkBoundary();\n    const { startIndex, endIndex } = range;\n    const startElement = elementList[startIndex];\n    const endElement = elementList[endIndex];\n    const draw = this.control.getDraw();\n    if (evt.key === KeyMap.Backspace) {\n      if (startIndex !== endIndex) {\n        draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex);\n        const value = this.getValue();\n        if (!value.length) {\n          this.control.addPlaceholder(startIndex);\n        }\n        return startIndex;\n      } else {\n        if (startElement.controlComponent === ControlComponent.PREFIX || endElement.controlComponent === ControlComponent.POSTFIX || startElement.controlComponent === ControlComponent.PLACEHOLDER) {\n          return this.control.removeControl(startIndex);\n        } else {\n          draw.spliceElementList(elementList, startIndex, 1);\n          const value = this.getValue();\n          if (!value.length) {\n            this.control.addPlaceholder(startIndex - 1);\n          }\n          return startIndex - 1;\n        }\n      }\n    } else if (evt.key === KeyMap.Delete) {\n      if (startIndex !== endIndex) {\n        draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex);\n        const value = this.getValue();\n        if (!value.length) {\n          this.control.addPlaceholder(startIndex);\n        }\n        return startIndex;\n      } else {\n        const endNextElement = elementList[endIndex + 1];\n        if (startElement.controlComponent === ControlComponent.PREFIX && endNextElement.controlComponent === ControlComponent.PLACEHOLDER || endNextElement.controlComponent === ControlComponent.POSTFIX || startElement.controlComponent === ControlComponent.PLACEHOLDER) {\n          return this.control.removeControl(startIndex);\n        } else {\n          draw.spliceElementList(elementList, startIndex + 1, 1);\n          const value = this.getValue();\n          if (!value.length) {\n            this.control.addPlaceholder(startIndex);\n          }\n          return startIndex;\n        }\n      }\n    }\n    return endIndex;\n  }\n  cut() {\n    if (this.control.getIsDisabledControl()) {\n      return -1;\n    }\n    this.control.shrinkBoundary();\n    const { startIndex, endIndex } = this.control.getRange();\n    if (startIndex === endIndex) {\n      return startIndex;\n    }\n    const draw = this.control.getDraw();\n    const elementList = this.control.getElementList();\n    draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex);\n    const value = this.getValue();\n    if (!value.length) {\n      this.control.addPlaceholder(startIndex);\n    }\n    return startIndex;\n  }\n  awake() {\n    var _a, _b;\n    if (this.isPopup || this.control.getIsDisabledControl())\n      return;\n    const position = this.control.getPosition();\n    if (!position)\n      return;\n    const elementList = this.draw.getElementList();\n    const { startIndex } = this.control.getRange();\n    if (((_a = elementList[startIndex + 1]) == null ? void 0 : _a.controlId) !== this.element.controlId) {\n      return;\n    }\n    this.datePicker = new DatePicker(this.draw, {\n      onSubmit: this._setDate.bind(this)\n    });\n    const value = this.getValue().map((el) => el.value).join(\"\") || \"\";\n    const dateFormat = (_b = this.element.control) == null ? void 0 : _b.dateFormat;\n    this.datePicker.render({\n      value,\n      position,\n      dateFormat\n    });\n    this.isPopup = true;\n  }\n  destroy() {\n    var _a;\n    if (!this.isPopup)\n      return;\n    (_a = this.datePicker) == null ? void 0 : _a.destroy();\n    this.isPopup = false;\n  }\n  _setDate(date) {\n    if (!date) {\n      this.clearSelect();\n    } else {\n      this.setSelect(date);\n    }\n    this.destroy();\n  }\n}\nclass Control {\n  constructor(draw) {\n    this.controlBorder = new ControlBorder(draw);\n    this.draw = draw;\n    this.range = draw.getRange();\n    this.listener = draw.getListener();\n    this.eventBus = draw.getEventBus();\n    this.controlSearch = new ControlSearch(this);\n    this.options = draw.getOptions();\n    this.controlOptions = this.options.control;\n    this.activeControl = null;\n  }\n  setHighlightList(payload) {\n    this.controlSearch.setHighlightList(payload);\n  }\n  computeHighlightList() {\n    const highlightList = this.controlSearch.getHighlightList();\n    if (highlightList.length) {\n      this.controlSearch.computeHighlightList();\n    }\n  }\n  renderHighlightList(ctx, pageNo) {\n    const highlightMatchResult = this.controlSearch.getHighlightMatchResult();\n    if (highlightMatchResult.length) {\n      this.controlSearch.renderHighlightList(ctx, pageNo);\n    }\n  }\n  getDraw() {\n    return this.draw;\n  }\n  filterAssistElement(elementList) {\n    return elementList.filter((element) => {\n      var _a;\n      if (element.type === ElementType.TABLE) {\n        const trList = element.trList;\n        for (let r = 0; r < trList.length; r++) {\n          const tr = trList[r];\n          for (let d = 0; d < tr.tdList.length; d++) {\n            const td = tr.tdList[d];\n            td.value = this.filterAssistElement(td.value);\n          }\n        }\n      }\n      if (!element.controlId)\n        return true;\n      if ((_a = element.control) == null ? void 0 : _a.minWidth) {\n        if (element.controlComponent === ControlComponent.PREFIX || element.controlComponent === ControlComponent.POSTFIX) {\n          element.value = \"\";\n          return true;\n        }\n      }\n      return element.controlComponent !== ControlComponent.PREFIX && element.controlComponent !== ControlComponent.POSTFIX && element.controlComponent !== ControlComponent.PLACEHOLDER;\n    });\n  }\n  getIsRangeCanCaptureEvent() {\n    if (!this.activeControl)\n      return false;\n    const { startIndex, endIndex } = this.getRange();\n    if (!~startIndex && !~endIndex)\n      return false;\n    const elementList = this.getElementList();\n    const startElement = elementList[startIndex];\n    if (startIndex === endIndex && startElement.controlComponent === ControlComponent.POSTFIX) {\n      return true;\n    }\n    const endElement = elementList[endIndex];\n    if (startElement.controlId && startElement.controlId === endElement.controlId && endElement.controlComponent !== ControlComponent.POSTFIX) {\n      return true;\n    }\n    return false;\n  }\n  getIsRangeInPostfix() {\n    if (!this.activeControl)\n      return false;\n    const { startIndex, endIndex } = this.getRange();\n    if (startIndex !== endIndex)\n      return false;\n    const elementList = this.getElementList();\n    const element = elementList[startIndex];\n    return element.controlComponent === ControlComponent.POSTFIX;\n  }\n  getIsRangeWithinControl() {\n    const { startIndex, endIndex } = this.getRange();\n    if (!~startIndex && !~endIndex)\n      return false;\n    const elementList = this.getElementList();\n    const startElement = elementList[startIndex];\n    const endElement = elementList[endIndex];\n    if (startElement.controlId && startElement.controlId === endElement.controlId && endElement.controlComponent !== ControlComponent.POSTFIX) {\n      return true;\n    }\n    return false;\n  }\n  getIsElementListContainFullControl(elementList) {\n    if (!elementList.some((element) => element.controlId))\n      return false;\n    let prefixCount = 0;\n    let postfixCount = 0;\n    for (let e = 0; e < elementList.length; e++) {\n      const element = elementList[e];\n      if (element.controlComponent === ControlComponent.PREFIX) {\n        prefixCount++;\n      } else if (element.controlComponent === ControlComponent.POSTFIX) {\n        postfixCount++;\n      }\n    }\n    if (!prefixCount || !postfixCount)\n      return false;\n    return prefixCount === postfixCount;\n  }\n  getIsDisabledControl(context = {}) {\n    var _a, _b;\n    if (this.draw.isDesignMode() || !this.activeControl)\n      return false;\n    const { startIndex, endIndex } = context.range || this.range.getRange();\n    if (startIndex === endIndex && ~startIndex && ~endIndex) {\n      const elementList = context.elementList || this.getElementList();\n      const startElement = elementList[startIndex];\n      if (startElement.controlComponent === ControlComponent.POSTFIX) {\n        return false;\n      }\n    }\n    return !!((_b = (_a = this.activeControl.getElement()) == null ? void 0 : _a.control) == null ? void 0 : _b.disabled);\n  }\n  getContainer() {\n    return this.draw.getContainer();\n  }\n  getElementList() {\n    return this.draw.getElementList();\n  }\n  getPosition() {\n    const positionList = this.draw.getPosition().getPositionList();\n    const { endIndex } = this.range.getRange();\n    return positionList[endIndex] || null;\n  }\n  getPreY() {\n    var _a, _b;\n    const height = this.draw.getHeight();\n    const pageGap = this.draw.getPageGap();\n    const pageNo = (_b = (_a = this.getPosition()) == null ? void 0 : _a.pageNo) != null ? _b : this.draw.getPageNo();\n    return pageNo * (height + pageGap);\n  }\n  getRange() {\n    return this.range.getRange();\n  }\n  shrinkBoundary(context = {}) {\n    this.range.shrinkBoundary(context);\n  }\n  getActiveControl() {\n    return this.activeControl;\n  }\n  initControl() {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    const elementList = this.getElementList();\n    const range = this.getRange();\n    const element = elementList[range.startIndex];\n    if (this.activeControl) {\n      if (this.activeControl instanceof SelectControl || this.activeControl instanceof DateControl) {\n        if (element.controlComponent === ControlComponent.POSTFIX) {\n          this.activeControl.destroy();\n        } else {\n          this.activeControl.awake();\n        }\n      }\n      const controlElement = this.activeControl.getElement();\n      if (element.controlId === controlElement.controlId)\n        return;\n    }\n    this.destroyControl();\n    const control = element.control;\n    if (control.type === ControlType.TEXT) {\n      this.activeControl = new TextControl(element, this);\n    } else if (control.type === ControlType.SELECT) {\n      const selectControl = new SelectControl(element, this);\n      this.activeControl = selectControl;\n      selectControl.awake();\n    } else if (control.type === ControlType.CHECKBOX) {\n      this.activeControl = new CheckboxControl(element, this);\n    } else if (control.type === ControlType.RADIO) {\n      this.activeControl = new RadioControl(element, this);\n    } else if (control.type === ControlType.DATE) {\n      const dateControl = new DateControl(element, this);\n      this.activeControl = dateControl;\n      dateControl.awake();\n    }\n    nextTick(() => {\n      var _a;\n      const controlChangeListener = this.listener.controlChange;\n      const isSubscribeControlChange = this.eventBus.isSubscribe(\"controlChange\");\n      if (!controlChangeListener && !isSubscribeControlChange)\n        return;\n      let payload;\n      const value = (_a = this.activeControl) == null ? void 0 : _a.getValue();\n      if (value && value.length) {\n        payload = zipElementList(value)[0].control;\n      } else {\n        payload = pickElementAttr(deepClone(element)).control;\n      }\n      if (controlChangeListener) {\n        controlChangeListener(payload);\n      }\n      if (isSubscribeControlChange) {\n        this.eventBus.emit(\"controlChange\", payload);\n      }\n    });\n  }\n  destroyControl() {\n    if (this.activeControl) {\n      if (this.activeControl instanceof SelectControl || this.activeControl instanceof DateControl) {\n        this.activeControl.destroy();\n      }\n      this.activeControl = null;\n      nextTick(() => {\n        const controlChangeListener = this.listener.controlChange;\n        const isSubscribeControlChange = this.eventBus.isSubscribe(\"controlChange\");\n        if (!controlChangeListener && !isSubscribeControlChange)\n          return;\n        if (controlChangeListener) {\n          controlChangeListener(null);\n        }\n        if (isSubscribeControlChange) {\n          this.eventBus.emit(\"controlChange\", null);\n        }\n      });\n    }\n  }\n  repaintControl(options = {}) {\n    const { curIndex, isCompute = true, isSubmitHistory = true, isSetCursor = true } = options;\n    if (curIndex === void 0) {\n      this.range.clearRange();\n      this.draw.render({\n        isCompute,\n        isSubmitHistory,\n        isSetCursor: false\n      });\n    } else {\n      this.range.setRange(curIndex, curIndex);\n      this.draw.render({\n        curIndex,\n        isCompute,\n        isSetCursor,\n        isSubmitHistory\n      });\n    }\n  }\n  reAwakeControl() {\n    if (!this.activeControl)\n      return;\n    const elementList = this.getElementList();\n    const range = this.getRange();\n    const element = elementList[range.startIndex];\n    this.activeControl.setElement(element);\n    if ((this.activeControl instanceof DateControl || this.activeControl instanceof SelectControl) && this.activeControl.getIsPopup()) {\n      this.activeControl.destroy();\n      this.activeControl.awake();\n    }\n  }\n  moveCursor(position) {\n    const { index: index2, trIndex, tdIndex, tdValueIndex } = position;\n    let elementList = this.draw.getOriginalElementList();\n    let element;\n    const newIndex = position.isTable ? tdValueIndex : index2;\n    if (position.isTable) {\n      elementList = elementList[index2].trList[trIndex].tdList[tdIndex].value;\n      element = elementList[tdValueIndex];\n    } else {\n      element = elementList[index2];\n    }\n    if (element.controlComponent === ControlComponent.VALUE) {\n      return {\n        newIndex,\n        newElement: element\n      };\n    } else if (element.controlComponent === ControlComponent.POSTFIX) {\n      let startIndex = newIndex + 1;\n      while (startIndex < elementList.length) {\n        const nextElement = elementList[startIndex];\n        if (nextElement.controlId !== element.controlId) {\n          return {\n            newIndex: startIndex - 1,\n            newElement: elementList[startIndex - 1]\n          };\n        }\n        startIndex++;\n      }\n    } else if (element.controlComponent === ControlComponent.PREFIX) {\n      let startIndex = newIndex + 1;\n      while (startIndex < elementList.length) {\n        const nextElement = elementList[startIndex];\n        if (nextElement.controlId !== element.controlId || nextElement.controlComponent !== ControlComponent.PREFIX) {\n          return {\n            newIndex: startIndex - 1,\n            newElement: elementList[startIndex - 1]\n          };\n        }\n        startIndex++;\n      }\n    } else if (element.controlComponent === ControlComponent.PLACEHOLDER) {\n      let startIndex = newIndex - 1;\n      while (startIndex > 0) {\n        const preElement = elementList[startIndex];\n        if (preElement.controlId !== element.controlId || preElement.controlComponent === ControlComponent.PREFIX) {\n          return {\n            newIndex: startIndex,\n            newElement: elementList[startIndex]\n          };\n        }\n        startIndex--;\n      }\n    }\n    return {\n      newIndex,\n      newElement: element\n    };\n  }\n  removeControl(startIndex, context = {}) {\n    const elementList = context.elementList || this.getElementList();\n    const startElement = elementList[startIndex];\n    if (!this.draw.isDesignMode()) {\n      const { deletable = true } = startElement.control;\n      if (!deletable)\n        return null;\n    }\n    let leftIndex = -1;\n    let rightIndex = -1;\n    let preIndex = startIndex;\n    while (preIndex > 0) {\n      const preElement = elementList[preIndex];\n      if (preElement.controlId !== startElement.controlId) {\n        leftIndex = preIndex;\n        break;\n      }\n      preIndex--;\n    }\n    let nextIndex = startIndex + 1;\n    while (nextIndex < elementList.length) {\n      const nextElement = elementList[nextIndex];\n      if (nextElement.controlId !== startElement.controlId) {\n        rightIndex = nextIndex - 1;\n        break;\n      }\n      nextIndex++;\n    }\n    if (nextIndex === elementList.length) {\n      rightIndex = nextIndex - 1;\n    }\n    if (!~leftIndex && !~rightIndex)\n      return startIndex;\n    leftIndex = ~leftIndex ? leftIndex : 0;\n    this.draw.spliceElementList(elementList, leftIndex + 1, rightIndex - leftIndex);\n    return leftIndex;\n  }\n  removePlaceholder(startIndex, context = {}) {\n    const elementList = context.elementList || this.getElementList();\n    const startElement = elementList[startIndex];\n    const nextElement = elementList[startIndex + 1];\n    if (startElement.controlComponent === ControlComponent.PLACEHOLDER || nextElement.controlComponent === ControlComponent.PLACEHOLDER) {\n      let isHasSubmitHistory = false;\n      let index2 = startIndex;\n      while (index2 < elementList.length) {\n        const curElement = elementList[index2];\n        if (curElement.controlId !== startElement.controlId)\n          break;\n        if (curElement.controlComponent === ControlComponent.PLACEHOLDER) {\n          if (!isHasSubmitHistory) {\n            isHasSubmitHistory = true;\n            this.draw.getHistoryManager().popUndo();\n            this.draw.submitHistory(startIndex);\n          }\n          elementList.splice(index2, 1);\n        } else {\n          index2++;\n        }\n      }\n    }\n  }\n  addPlaceholder(startIndex, context = {}) {\n    const elementList = context.elementList || this.getElementList();\n    const startElement = elementList[startIndex];\n    const control = startElement.control;\n    if (!control.placeholder)\n      return;\n    const placeholderStrList = splitText(control.placeholder);\n    const anchorElementStyleAttr = pickObject(startElement, CONTROL_STYLE_ATTR);\n    for (let p = 0; p < placeholderStrList.length; p++) {\n      const value = placeholderStrList[p];\n      const newElement = {\n        ...anchorElementStyleAttr,\n        value,\n        controlId: startElement.controlId,\n        type: ElementType.CONTROL,\n        control: startElement.control,\n        controlComponent: ControlComponent.PLACEHOLDER,\n        color: this.controlOptions.placeholderColor\n      };\n      formatElementContext(elementList, [newElement], startIndex, {\n        editorOptions: this.options\n      });\n      this.draw.spliceElementList(elementList, startIndex + p + 1, 0, newElement);\n    }\n  }\n  setValue(data2) {\n    if (!this.activeControl) {\n      throw new Error(\"active control is null\");\n    }\n    return this.activeControl.setValue(data2);\n  }\n  keydown(evt) {\n    if (!this.activeControl) {\n      throw new Error(\"active control is null\");\n    }\n    return this.activeControl.keydown(evt);\n  }\n  cut() {\n    if (!this.activeControl) {\n      throw new Error(\"active control is null\");\n    }\n    return this.activeControl.cut();\n  }\n  getValueById(payload) {\n    const { id, conceptId } = payload;\n    const result = [];\n    if (!id && !conceptId)\n      return result;\n    const getValue = (elementList, zone2) => {\n      let i = 0;\n      while (i < elementList.length) {\n        const element = elementList[i];\n        i++;\n        if (element.type === ElementType.TABLE) {\n          const trList = element.trList;\n          for (let r = 0; r < trList.length; r++) {\n            const tr = trList[r];\n            for (let d = 0; d < tr.tdList.length; d++) {\n              const td = tr.tdList[d];\n              getValue(td.value, zone2);\n            }\n          }\n        }\n        if (!element.control || id && element.controlId !== id || conceptId && element.control.conceptId !== conceptId) {\n          continue;\n        }\n        const { type, code, valueSets } = element.control;\n        let j = i;\n        let textControlValue = \"\";\n        const textControlElementList = [];\n        while (j < elementList.length) {\n          const nextElement = elementList[j];\n          if (nextElement.controlId !== element.controlId)\n            break;\n          if ((type === ControlType.TEXT || type === ControlType.DATE) && nextElement.controlComponent === ControlComponent.VALUE) {\n            textControlValue += nextElement.value;\n            textControlElementList.push(omitObject(nextElement, CONTROL_CONTEXT_ATTR));\n          }\n          j++;\n        }\n        if (type === ControlType.TEXT || type === ControlType.DATE) {\n          result.push({\n            ...element.control,\n            zone: zone2,\n            value: textControlValue || null,\n            innerText: textControlValue || null,\n            elementList: zipElementList(textControlElementList)\n          });\n        } else if (type === ControlType.SELECT || type === ControlType.CHECKBOX || type === ControlType.RADIO) {\n          const innerText = code == null ? void 0 : code.split(\",\").map((selectCode) => {\n            var _a;\n            return (_a = valueSets == null ? void 0 : valueSets.find((valueSet) => valueSet.code === selectCode)) == null ? void 0 : _a.value;\n          }).filter(Boolean).join(\"\");\n          result.push({\n            ...element.control,\n            zone: zone2,\n            value: code || null,\n            innerText: innerText || null\n          });\n        }\n        i = j;\n      }\n    };\n    const data2 = [\n      {\n        zone: EditorZone.HEADER,\n        elementList: this.draw.getHeaderElementList()\n      },\n      {\n        zone: EditorZone.MAIN,\n        elementList: this.draw.getOriginalMainElementList()\n      },\n      {\n        zone: EditorZone.FOOTER,\n        elementList: this.draw.getFooterElementList()\n      }\n    ];\n    for (const { zone: zone2, elementList } of data2) {\n      getValue(elementList, zone2);\n    }\n    return result;\n  }\n  setValueById(payload) {\n    let isExistSet = false;\n    const { id, conceptId, value } = payload;\n    if (!id && !conceptId)\n      return;\n    const setValue = (elementList) => {\n      let i = 0;\n      while (i < elementList.length) {\n        const element = elementList[i];\n        i++;\n        if (element.type === ElementType.TABLE) {\n          const trList = element.trList;\n          for (let r = 0; r < trList.length; r++) {\n            const tr = trList[r];\n            for (let d = 0; d < tr.tdList.length; d++) {\n              const td = tr.tdList[d];\n              setValue(td.value);\n            }\n          }\n        }\n        if (!element.control || id && element.controlId !== id || conceptId && element.control.conceptId !== conceptId) {\n          continue;\n        }\n        isExistSet = true;\n        const { type } = element.control;\n        let currentEndIndex = i;\n        while (currentEndIndex < elementList.length) {\n          const nextElement = elementList[currentEndIndex];\n          if (nextElement.controlId !== element.controlId)\n            break;\n          currentEndIndex++;\n        }\n        const fakeRange = {\n          startIndex: i - 1,\n          endIndex: currentEndIndex - 2\n        };\n        const controlContext = {\n          range: fakeRange,\n          elementList\n        };\n        const controlRule = {\n          isIgnoreDisabledRule: true\n        };\n        if (type === ControlType.TEXT) {\n          const formatValue = Array.isArray(value) ? value : [{ value }];\n          formatElementList(formatValue, {\n            isHandleFirstElement: false,\n            editorOptions: this.options\n          });\n          const text = new TextControl(element, this);\n          this.activeControl = text;\n          if (value) {\n            text.setValue(formatValue, controlContext, controlRule);\n          } else {\n            text.clearValue(controlContext, controlRule);\n          }\n        } else if (type === ControlType.SELECT) {\n          if (Array.isArray(value))\n            continue;\n          const select = new SelectControl(element, this);\n          this.activeControl = select;\n          if (value) {\n            select.setSelect(value, controlContext, controlRule);\n          } else {\n            select.clearSelect(controlContext, controlRule);\n          }\n        } else if (type === ControlType.CHECKBOX) {\n          if (Array.isArray(value))\n            continue;\n          const checkbox = new CheckboxControl(element, this);\n          this.activeControl = checkbox;\n          const codes = value ? value.split(\",\") : [];\n          checkbox.setSelect(codes, controlContext, controlRule);\n        } else if (type === ControlType.RADIO) {\n          if (Array.isArray(value))\n            continue;\n          const radio = new RadioControl(element, this);\n          this.activeControl = radio;\n          const codes = value ? [value] : [];\n          radio.setSelect(codes, controlContext, controlRule);\n        } else if (type === ControlType.DATE) {\n          if (Array.isArray(value))\n            continue;\n          const date = new DateControl(element, this);\n          this.activeControl = date;\n          if (value) {\n            date.setSelect(value, controlContext, controlRule);\n          } else {\n            date.clearSelect(controlContext, controlRule);\n          }\n        }\n        this.activeControl = null;\n        let newEndIndex = i;\n        while (newEndIndex < elementList.length) {\n          const nextElement = elementList[newEndIndex];\n          if (nextElement.controlId !== element.controlId)\n            break;\n          newEndIndex++;\n        }\n        i = newEndIndex;\n      }\n    };\n    this.destroyControl();\n    const data2 = [\n      this.draw.getHeaderElementList(),\n      this.draw.getOriginalMainElementList(),\n      this.draw.getFooterElementList()\n    ];\n    for (const elementList of data2) {\n      setValue(elementList);\n    }\n    if (isExistSet) {\n      this.draw.render({\n        isSetCursor: false\n      });\n    }\n  }\n  setExtensionById(payload) {\n    const { id, conceptId, extension } = payload;\n    if (!id && !conceptId)\n      return;\n    const setExtension = (elementList) => {\n      let i = 0;\n      while (i < elementList.length) {\n        const element = elementList[i];\n        i++;\n        if (element.type === ElementType.TABLE) {\n          const trList = element.trList;\n          for (let r = 0; r < trList.length; r++) {\n            const tr = trList[r];\n            for (let d = 0; d < tr.tdList.length; d++) {\n              const td = tr.tdList[d];\n              setExtension(td.value);\n            }\n          }\n        }\n        if (!element.control || id && element.controlId !== id || conceptId && element.control.conceptId !== conceptId) {\n          continue;\n        }\n        element.control.extension = extension;\n        let newEndIndex = i;\n        while (newEndIndex < elementList.length) {\n          const nextElement = elementList[newEndIndex];\n          if (nextElement.controlId !== element.controlId)\n            break;\n          newEndIndex++;\n        }\n        i = newEndIndex;\n      }\n    };\n    const data2 = [\n      this.draw.getHeaderElementList(),\n      this.draw.getOriginalMainElementList(),\n      this.draw.getFooterElementList()\n    ];\n    for (const elementList of data2) {\n      setExtension(elementList);\n    }\n  }\n  setPropertiesById(payload) {\n    const { id, conceptId, properties } = payload;\n    if (!id && !conceptId)\n      return;\n    let isExistUpdate = false;\n    function setProperties(elementList) {\n      let i = 0;\n      while (i < elementList.length) {\n        const element = elementList[i];\n        i++;\n        if (element.type === ElementType.TABLE) {\n          const trList = element.trList;\n          for (let r = 0; r < trList.length; r++) {\n            const tr = trList[r];\n            for (let d = 0; d < tr.tdList.length; d++) {\n              const td = tr.tdList[d];\n              setProperties(td.value);\n            }\n          }\n        }\n        if (!element.control || id && element.controlId !== id || conceptId && element.control.conceptId !== conceptId) {\n          continue;\n        }\n        isExistUpdate = true;\n        element.control = {\n          ...element.control,\n          ...properties,\n          value: element.control.value\n        };\n        CONTROL_STYLE_ATTR.forEach((key) => {\n          const controlStyleProperty = properties[key];\n          if (controlStyleProperty) {\n            Reflect.set(element, key, controlStyleProperty);\n          }\n        });\n        let newEndIndex = i;\n        while (newEndIndex < elementList.length) {\n          const nextElement = elementList[newEndIndex];\n          if (nextElement.controlId !== element.controlId)\n            break;\n          newEndIndex++;\n        }\n        i = newEndIndex;\n      }\n    }\n    const pageComponentData = {\n      header: this.draw.getHeaderElementList(),\n      main: this.draw.getOriginalMainElementList(),\n      footer: this.draw.getFooterElementList()\n    };\n    for (const key in pageComponentData) {\n      const elementList = pageComponentData[key];\n      setProperties(elementList);\n    }\n    if (!isExistUpdate)\n      return;\n    for (const key in pageComponentData) {\n      const pageComponentKey = key;\n      const elementList = zipElementList(pageComponentData[pageComponentKey]);\n      pageComponentData[pageComponentKey] = elementList;\n      formatElementList(elementList, {\n        editorOptions: this.options,\n        isForceCompensation: true\n      });\n    }\n    this.draw.setEditorData(pageComponentData);\n    this.draw.render({\n      isSetCursor: false\n    });\n  }\n  getList() {\n    const controlElementList = [];\n    function getControlElementList(elementList) {\n      for (let e = 0; e < elementList.length; e++) {\n        const element = elementList[e];\n        if (element.type === ElementType.TABLE) {\n          const trList = element.trList;\n          for (let r = 0; r < trList.length; r++) {\n            const tr = trList[r];\n            for (let d = 0; d < tr.tdList.length; d++) {\n              const td = tr.tdList[d];\n              const tdElement = td.value;\n              getControlElementList(tdElement);\n            }\n          }\n        }\n        if (element.controlId) {\n          const controlElement = omitObject(element, [\n            ...TITLE_CONTEXT_ATTR,\n            ...LIST_CONTEXT_ATTR\n          ]);\n          controlElementList.push(controlElement);\n        }\n      }\n    }\n    const data2 = [\n      this.draw.getHeader().getElementList(),\n      this.draw.getOriginalMainElementList(),\n      this.draw.getFooter().getElementList()\n    ];\n    for (const elementList of data2) {\n      getControlElementList(elementList);\n    }\n    return zipElementList(controlElementList, {\n      extraPickAttrs: [\"controlId\"]\n    });\n  }\n  recordBorderInfo(x, y, width, height) {\n    this.controlBorder.recordBorderInfo(x, y, width, height);\n  }\n  drawBorder(ctx) {\n    this.controlBorder.render(ctx);\n  }\n  getPreControlContext() {\n    if (!this.activeControl)\n      return null;\n    const position = this.draw.getPosition();\n    const positionContext = position.getPositionContext();\n    if (!positionContext)\n      return null;\n    const controlElement = this.activeControl.getElement();\n    function getPreContext(elementList2, start) {\n      for (let e = start; e > 0; e--) {\n        const element = elementList2[e];\n        if (element.type === ElementType.TABLE) {\n          const trList = element.trList || [];\n          for (let r = trList.length - 1; r >= 0; r--) {\n            const tr = trList[r];\n            const tdList = tr.tdList;\n            for (let d = tdList.length - 1; d >= 0; d--) {\n              const td = tdList[d];\n              const context2 = getPreContext(td.value, td.value.length - 1);\n              if (context2) {\n                return {\n                  positionContext: {\n                    isTable: true,\n                    index: e,\n                    trIndex: r,\n                    tdIndex: d,\n                    tdId: td.id,\n                    trId: tr.id,\n                    tableId: element.id\n                  },\n                  nextIndex: context2.nextIndex\n                };\n              }\n            }\n          }\n        }\n        if (!element.controlId || element.controlId === controlElement.controlId) {\n          continue;\n        }\n        let nextIndex = e;\n        while (nextIndex > 0) {\n          const nextElement = elementList2[nextIndex];\n          if (nextElement.controlComponent === ControlComponent.VALUE || nextElement.controlComponent === ControlComponent.PREFIX) {\n            break;\n          }\n          nextIndex--;\n        }\n        return {\n          positionContext: {\n            isTable: false\n          },\n          nextIndex\n        };\n      }\n      return null;\n    }\n    const { startIndex } = this.range.getRange();\n    const elementList = this.getElementList();\n    const context = getPreContext(elementList, startIndex);\n    if (context) {\n      return {\n        positionContext: positionContext.isTable ? positionContext : context.positionContext,\n        nextIndex: context.nextIndex\n      };\n    }\n    if (controlElement.tableId) {\n      const originalElementList = this.draw.getOriginalElementList();\n      const { index: index2, trIndex, tdIndex } = positionContext;\n      const trList = originalElementList[index2].trList;\n      for (let r = trIndex; r >= 0; r--) {\n        const tr = trList[r];\n        const tdList = tr.tdList;\n        for (let d = tdList.length - 1; d >= 0; d--) {\n          if (trIndex === r && d >= tdIndex)\n            continue;\n          const td = tdList[d];\n          const context3 = getPreContext(td.value, td.value.length - 1);\n          if (context3) {\n            return {\n              positionContext: {\n                isTable: true,\n                index: positionContext.index,\n                trIndex: r,\n                tdIndex: d,\n                tdId: td.id,\n                trId: tr.id,\n                tableId: controlElement.tableId\n              },\n              nextIndex: context3.nextIndex\n            };\n          }\n        }\n      }\n      const context2 = getPreContext(originalElementList, index2 - 1);\n      if (context2) {\n        return {\n          positionContext: {\n            isTable: false\n          },\n          nextIndex: context2.nextIndex\n        };\n      }\n    }\n    return null;\n  }\n  getNextControlContext() {\n    if (!this.activeControl)\n      return null;\n    const position = this.draw.getPosition();\n    const positionContext = position.getPositionContext();\n    if (!positionContext)\n      return null;\n    const controlElement = this.activeControl.getElement();\n    function getNextContext(elementList2, start) {\n      for (let e = start; e < elementList2.length; e++) {\n        const element = elementList2[e];\n        if (element.type === ElementType.TABLE) {\n          const trList = element.trList || [];\n          for (let r = 0; r < trList.length; r++) {\n            const tr = trList[r];\n            const tdList = tr.tdList;\n            for (let d = 0; d < tdList.length; d++) {\n              const td = tdList[d];\n              const context2 = getNextContext(td.value, 0);\n              if (context2) {\n                return {\n                  positionContext: {\n                    isTable: true,\n                    index: e,\n                    trIndex: r,\n                    tdIndex: d,\n                    tdId: td.id,\n                    trId: tr.id,\n                    tableId: element.id\n                  },\n                  nextIndex: context2.nextIndex\n                };\n              }\n            }\n          }\n        }\n        if (!element.controlId || element.controlId === controlElement.controlId) {\n          continue;\n        }\n        return {\n          positionContext: {\n            isTable: false\n          },\n          nextIndex: e\n        };\n      }\n      return null;\n    }\n    const { endIndex } = this.range.getRange();\n    const elementList = this.getElementList();\n    const context = getNextContext(elementList, endIndex);\n    if (context) {\n      return {\n        positionContext: positionContext.isTable ? positionContext : context.positionContext,\n        nextIndex: context.nextIndex\n      };\n    }\n    if (controlElement.tableId) {\n      const originalElementList = this.draw.getOriginalElementList();\n      const { index: index2, trIndex, tdIndex } = positionContext;\n      const trList = originalElementList[index2].trList;\n      for (let r = trIndex; r < trList.length; r++) {\n        const tr = trList[r];\n        const tdList = tr.tdList;\n        for (let d = 0; d < tdList.length; d++) {\n          if (trIndex === r && d <= tdIndex)\n            continue;\n          const td = tdList[d];\n          const context3 = getNextContext(td.value, 0);\n          if (context3) {\n            return {\n              positionContext: {\n                isTable: true,\n                index: positionContext.index,\n                trIndex: r,\n                tdIndex: d,\n                tdId: td.id,\n                trId: tr.id,\n                tableId: controlElement.tableId\n              },\n              nextIndex: context3.nextIndex\n            };\n          }\n        }\n      }\n      const context2 = getNextContext(originalElementList, index2 + 1);\n      if (context2) {\n        return {\n          positionContext: {\n            isTable: false\n          },\n          nextIndex: context2.nextIndex\n        };\n      }\n    }\n    return null;\n  }\n  initNextControl(option = {}) {\n    const { direction = MoveDirection.DOWN } = option;\n    let context = null;\n    if (direction === MoveDirection.UP) {\n      context = this.getPreControlContext();\n    } else {\n      context = this.getNextControlContext();\n    }\n    if (!context)\n      return;\n    const { nextIndex, positionContext } = context;\n    const position = this.draw.getPosition();\n    position.setPositionContext(positionContext);\n    this.draw.getRange().replaceRange({\n      startIndex: nextIndex,\n      endIndex: nextIndex\n    });\n    this.draw.render({\n      curIndex: nextIndex,\n      isCompute: false,\n      isSetCursor: true,\n      isSubmitHistory: false\n    });\n    const positionList = position.getPositionList();\n    this.draw.getCursor().moveCursorToVisible({\n      cursorPosition: positionList[nextIndex],\n      direction\n    });\n  }\n  setMinWidthControlInfo(option) {\n    var _a, _b, _c, _d, _e;\n    const { row, rowElement, controlRealWidth, availableWidth } = option;\n    if (!((_a = rowElement.control) == null ? void 0 : _a.minWidth))\n      return;\n    const { scale } = this.options;\n    const controlMinWidth = rowElement.control.minWidth * scale;\n    let controlFirstElement = null;\n    if (((_b = rowElement.control) == null ? void 0 : _b.minWidth) && (((_c = rowElement.control) == null ? void 0 : _c.rowFlex) === RowFlex.CENTER || ((_d = rowElement.control) == null ? void 0 : _d.rowFlex) === RowFlex.RIGHT)) {\n      let controlContentWidth = rowElement.metrics.width;\n      let controlElementIndex = row.elementList.length - 1;\n      while (controlElementIndex >= 0) {\n        const controlRowElement = row.elementList[controlElementIndex];\n        controlContentWidth += controlRowElement.metrics.width;\n        if (((_e = row.elementList[controlElementIndex - 1]) == null ? void 0 : _e.controlComponent) === ControlComponent.PREFIX) {\n          controlFirstElement = controlRowElement;\n          break;\n        }\n        controlElementIndex--;\n      }\n      if (controlFirstElement) {\n        if (controlContentWidth < controlMinWidth) {\n          if (rowElement.control.rowFlex === RowFlex.CENTER) {\n            controlFirstElement.left = (controlMinWidth - controlContentWidth) / 2;\n          } else if (rowElement.control.rowFlex === RowFlex.RIGHT) {\n            controlFirstElement.left = controlMinWidth - controlContentWidth - rowElement.metrics.width;\n          }\n        }\n      }\n    }\n    const extraWidth = controlMinWidth - controlRealWidth;\n    if (extraWidth > 0) {\n      const controlFirstElementLeft = (controlFirstElement == null ? void 0 : controlFirstElement.left) || 0;\n      const rowRemainingWidth = availableWidth - row.width - rowElement.metrics.width;\n      const left2 = Math.min(rowRemainingWidth, extraWidth);\n      rowElement.left = left2 - controlFirstElementLeft;\n      row.width += left2 - controlFirstElementLeft;\n    }\n  }\n}\nclass CheckboxParticle {\n  constructor(draw) {\n    this.draw = draw;\n    this.options = draw.getOptions();\n  }\n  setSelect(element) {\n    const { checkbox } = element;\n    if (checkbox) {\n      checkbox.value = !checkbox.value;\n    } else {\n      element.checkbox = {\n        value: true\n      };\n    }\n    this.draw.render({\n      isCompute: false,\n      isSetCursor: false\n    });\n  }\n  render(payload) {\n    const { ctx, x, index: index2, row } = payload;\n    let { y } = payload;\n    const { checkbox: { gap, lineWidth, fillStyle, strokeStyle, verticalAlign }, scale } = this.options;\n    const { metrics, checkbox } = row.elementList[index2];\n    if (verticalAlign === VerticalAlign.TOP || verticalAlign === VerticalAlign.MIDDLE) {\n      let nextIndex = index2 + 1;\n      let nextElement = null;\n      while (nextIndex < row.elementList.length) {\n        nextElement = row.elementList[nextIndex];\n        if (nextElement.value !== ZERO && nextElement.value !== NBSP)\n          break;\n        nextIndex++;\n      }\n      if (nextElement) {\n        const { metrics: { boundingBoxAscent, boundingBoxDescent } } = nextElement;\n        const textHeight = boundingBoxAscent + boundingBoxDescent;\n        if (textHeight > metrics.height) {\n          if (verticalAlign === VerticalAlign.TOP) {\n            y -= boundingBoxAscent - metrics.height;\n          } else if (verticalAlign === VerticalAlign.MIDDLE) {\n            y -= (textHeight - metrics.height) / 2;\n          }\n        }\n      }\n    }\n    const left2 = Math.round(x + gap * scale);\n    const top = Math.round(y - metrics.height + lineWidth);\n    const width = metrics.width - gap * 2 * scale;\n    const height = metrics.height;\n    ctx.save();\n    ctx.beginPath();\n    ctx.translate(0.5, 0.5);\n    if (checkbox == null ? void 0 : checkbox.value) {\n      ctx.lineWidth = lineWidth;\n      ctx.strokeStyle = fillStyle;\n      ctx.rect(left2, top, width, height);\n      ctx.stroke();\n      ctx.beginPath();\n      ctx.fillStyle = fillStyle;\n      ctx.fillRect(left2, top, width, height);\n      ctx.beginPath();\n      ctx.strokeStyle = strokeStyle;\n      ctx.lineWidth = lineWidth * 2 * scale;\n      ctx.moveTo(left2 + 2 * scale, top + height / 2);\n      ctx.lineTo(left2 + width / 2, top + height - 3 * scale);\n      ctx.lineTo(left2 + width - 2 * scale, top + 3 * scale);\n      ctx.stroke();\n    } else {\n      ctx.lineWidth = lineWidth;\n      ctx.rect(left2, top, width, height);\n      ctx.stroke();\n    }\n    ctx.closePath();\n    ctx.restore();\n  }\n}\nclass RadioParticle {\n  constructor(draw) {\n    this.draw = draw;\n    this.options = draw.getOptions();\n  }\n  setSelect(element) {\n    const { radio } = element;\n    if (radio) {\n      radio.value = !radio.value;\n    } else {\n      element.radio = {\n        value: true\n      };\n    }\n    this.draw.render({\n      isCompute: false,\n      isSetCursor: false\n    });\n  }\n  render(payload) {\n    const { ctx, x, index: index2, row } = payload;\n    let { y } = payload;\n    const { radio: { gap, lineWidth, fillStyle, strokeStyle, verticalAlign }, scale } = this.options;\n    const { metrics, radio } = row.elementList[index2];\n    if (verticalAlign === VerticalAlign.TOP || verticalAlign === VerticalAlign.MIDDLE) {\n      let nextIndex = index2 + 1;\n      let nextElement = null;\n      while (nextIndex < row.elementList.length) {\n        nextElement = row.elementList[nextIndex];\n        if (nextElement.value !== ZERO && nextElement.value !== NBSP)\n          break;\n        nextIndex++;\n      }\n      if (nextElement) {\n        const { metrics: { boundingBoxAscent, boundingBoxDescent } } = nextElement;\n        const textHeight = boundingBoxAscent + boundingBoxDescent;\n        if (textHeight > metrics.height) {\n          if (verticalAlign === VerticalAlign.TOP) {\n            y -= boundingBoxAscent - metrics.height;\n          } else if (verticalAlign === VerticalAlign.MIDDLE) {\n            y -= (textHeight - metrics.height) / 2;\n          }\n        }\n      }\n    }\n    const left2 = Math.round(x + gap * scale);\n    const top = Math.round(y - metrics.height + lineWidth);\n    const width = metrics.width - gap * 2 * scale;\n    const height = metrics.height;\n    ctx.save();\n    ctx.beginPath();\n    ctx.translate(0.5, 0.5);\n    ctx.strokeStyle = (radio == null ? void 0 : radio.value) ? fillStyle : strokeStyle;\n    ctx.lineWidth = lineWidth;\n    ctx.arc(left2 + width / 2, top + height / 2, width / 2, 0, Math.PI * 2);\n    ctx.stroke();\n    if (radio == null ? void 0 : radio.value) {\n      ctx.beginPath();\n      ctx.fillStyle = fillStyle;\n      ctx.arc(left2 + width / 2, top + height / 2, width / 3, 0, Math.PI * 2);\n      ctx.fill();\n    }\n    ctx.closePath();\n    ctx.restore();\n  }\n}\nconst encodedJs$2 = \"KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NvbnN0IGE9Ilx1MjAwQiIsdT1gCmA7ZnVuY3Rpb24gZihpKXtsZXQgcz0iIixuPTA7Zm9yKDtuPGkubGVuZ3RoOyl7Y29uc3QgZT1pW25dO2lmKGUudHlwZT09PSJ0YWJsZSIpe2lmKGUudHJMaXN0KWZvcihsZXQgbD0wO2w8ZS50ckxpc3QubGVuZ3RoO2wrKyl7Y29uc3Qgbz1lLnRyTGlzdFtsXTtmb3IobGV0IHQ9MDt0PG8udGRMaXN0Lmxlbmd0aDt0Kyspe2NvbnN0IHI9by50ZExpc3RbdF07cys9ZihyLnZhbHVlKX19fWVsc2UgaWYoZS50eXBlPT09Imh5cGVybGluayIpe2NvbnN0IGw9ZS5oeXBlcmxpbmtJZCxvPVtdO2Zvcig7bjxpLmxlbmd0aDspe2NvbnN0IHQ9aVtuXTtpZihsIT09dC5oeXBlcmxpbmtJZCl7bi0tO2JyZWFrfWRlbGV0ZSB0LnR5cGUsby5wdXNoKHQpLG4rK31zKz1mKG8pfWVsc2UgaWYoZS5jb250cm9sSWQpe2NvbnN0IGw9ZS5jb250cm9sSWQsbz1bXTtmb3IoO248aS5sZW5ndGg7KXtjb25zdCB0PWlbbl07aWYobCE9PXQuY29udHJvbElkKXtuLS07YnJlYWt9dC5jb250cm9sQ29tcG9uZW50PT09InZhbHVlIiYmKGRlbGV0ZSB0LmNvbnRyb2xJZCxvLnB1c2godCkpLG4rK31zKz1mKG8pfWVsc2UoIWUudHlwZXx8ZS50eXBlPT09InRleHQiKSYmKHMrPWUudmFsdWUpO24rK31yZXR1cm4gc31mdW5jdGlvbiBoKGkpe2NvbnN0IHM9W10sbj0vWzAtOV0vLGU9L1tBLVphLXpdLyxsPS9ccy87bGV0IG89ITEsdD0hMSxyPSIiO2Z1bmN0aW9uIHAoKXtyJiYocy5wdXNoKHIpLHI9IiIpfWZvcihjb25zdCBjIG9mIGkpZS50ZXN0KGMpPyhvfHxwKCkscis9YyxvPSEwLHQ9ITEpOm4udGVzdChjKT8odHx8cCgpLHIrPWMsbz0hMSx0PSEwKToocCgpLG89ITEsdD0hMSxsLnRlc3QoYyl8fHMucHVzaChjKSk7cmV0dXJuIHAoKSxzfW9ubWVzc2FnZT1pPT57Y29uc3Qgcz1pLmRhdGEsZT1mKHMpLnJlcGxhY2UobmV3IFJlZ0V4cChgXiR7YX1gKSwiIikucmVwbGFjZShuZXcgUmVnRXhwKGEsImciKSx1KSxsPWgoZSk7cG9zdE1lc3NhZ2UobC5sZW5ndGgpfX0pKCk7Cg==\";\nconst blob$2 = typeof window !== \"undefined\" && window.Blob && new Blob([atob(encodedJs$2)], { type: \"text/javascript;charset=utf-8\" });\nfunction WorkerWrapper$2() {\n  const objURL = blob$2 && (window.URL || window.webkitURL).createObjectURL(blob$2);\n  try {\n    return objURL ? new Worker(objURL, {}) : new Worker(\"data:application/javascript;base64,\" + encodedJs$2, { type: \"module\" });\n  } finally {\n    objURL && (window.URL || window.webkitURL).revokeObjectURL(objURL);\n  }\n}\nconst encodedJs$1 = \"KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NvbnN0IHU9e2ZpcnN0OjEsc2Vjb25kOjIsdGhpcmQ6Myxmb3VydGg6NCxmaWZ0aDo1LHNpeHRoOjZ9LGg9WyJ0ZXh0IiwiaHlwZXJsaW5rIiwic3Vic2NyaXB0Iiwic3VwZXJzY3JpcHQiLCJjb250cm9sIiwiZGF0ZSJdLGQ9Ilx1MjAwQiI7ZnVuY3Rpb24gZihuKXtyZXR1cm4hbi50eXBlfHxoLmluY2x1ZGVzKG4udHlwZSl9ZnVuY3Rpb24gRShuKXtjb25zdHtlbGVtZW50TGlzdDpvLHBvc2l0aW9uTGlzdDpnfT1uLHA9W107bGV0IHM9MDtmb3IoO3M8by5sZW5ndGg7KXtjb25zdCBlPW9bc107aWYoZS50aXRsZUlkKXtjb25zdCB0PWUudGl0bGVJZCxsPWUubGV2ZWwsaT17dHlwZToidGl0bGUiLHZhbHVlOiIiLGxldmVsOmwsdGl0bGVJZDp0LHBhZ2VObzpnW3NdLnBhZ2VOb30sYT1bXTtmb3IoO3M8by5sZW5ndGg7KXtjb25zdCBjPW9bc107aWYodCE9PWMudGl0bGVJZCl7cy0tO2JyZWFrfWEucHVzaChjKSxzKyt9aS52YWx1ZT1hLmZpbHRlcihjPT5mKGMpKS5tYXAoYz0+Yy52YWx1ZSkuam9pbigiIikucmVwbGFjZShuZXcgUmVnRXhwKGQsImciKSwiIikscC5wdXNoKGkpfXMrK31pZighcC5sZW5ndGgpcmV0dXJuIG51bGw7Y29uc3Qgdj0oZSx0KT0+e2NvbnN0IGw9dC5zdWJDYXRhbG9nW3Quc3ViQ2F0YWxvZy5sZW5ndGgtMV0saT11W2w9PW51bGw/dm9pZCAwOmwubGV2ZWxdLGE9dVtlLmxldmVsXTtsJiZhPmk/dihlLGwpOnQuc3ViQ2F0YWxvZy5wdXNoKHtpZDplLnRpdGxlSWQsbmFtZTplLnZhbHVlLGxldmVsOmUubGV2ZWwscGFnZU5vOmUucGFnZU5vLHN1YkNhdGFsb2c6W119KX0scj1bXTtmb3IobGV0IGU9MDtlPHAubGVuZ3RoO2UrKyl7Y29uc3QgdD1wW2VdLGw9cltyLmxlbmd0aC0xXSxpPXVbbD09bnVsbD92b2lkIDA6bC5sZXZlbF0sYT11W3QubGV2ZWxdO2wmJmE+aT92KHQsbCk6ci5wdXNoKHtpZDp0LnRpdGxlSWQsbmFtZTp0LnZhbHVlLGxldmVsOnQubGV2ZWwscGFnZU5vOnQucGFnZU5vLHN1YkNhdGFsb2c6W119KX1yZXR1cm4gcn1vbm1lc3NhZ2U9bj0+e2NvbnN0IG89bi5kYXRhLGc9RShvKTtwb3N0TWVzc2FnZShnKX19KSgpOwo=\";\nconst blob$1 = typeof window !== \"undefined\" && window.Blob && new Blob([atob(encodedJs$1)], { type: \"text/javascript;charset=utf-8\" });\nfunction WorkerWrapper$1() {\n  const objURL = blob$1 && (window.URL || window.webkitURL).createObjectURL(blob$1);\n  try {\n    return objURL ? new Worker(objURL, {}) : new Worker(\"data:application/javascript;base64,\" + encodedJs$1, { type: \"module\" });\n  } finally {\n    objURL && (window.URL || window.webkitURL).revokeObjectURL(objURL);\n  }\n}\nconst encodedJs = \"KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHUoZSl7Y29uc3QgdD1bXTtmb3IoY29uc3QgcyBvZiBlKXtpZihzLnR5cGU9PT0idGFibGUiKXtjb25zdCBvPXMudHJMaXN0O2ZvcihsZXQgbj0wO248by5sZW5ndGg7bisrKXtjb25zdCBjPW9bbl07Zm9yKGxldCByPTA7cjxjLnRkTGlzdC5sZW5ndGg7cisrKXtjb25zdCBpPWMudGRMaXN0W3JdO3QucHVzaCguLi51KGkudmFsdWUpKX19fWlmKCEhcy5ncm91cElkcylmb3IoY29uc3QgbyBvZiBzLmdyb3VwSWRzKXQuaW5jbHVkZXMobyl8fHQucHVzaChvKX1yZXR1cm4gdH1vbm1lc3NhZ2U9ZT0+e2NvbnN0IHQ9ZS5kYXRhLHM9dSh0KTtwb3N0TWVzc2FnZShzKX19KSgpOwo=\";\nconst blob = typeof window !== \"undefined\" && window.Blob && new Blob([atob(encodedJs)], { type: \"text/javascript;charset=utf-8\" });\nfunction WorkerWrapper() {\n  const objURL = blob && (window.URL || window.webkitURL).createObjectURL(blob);\n  try {\n    return objURL ? new Worker(objURL, {}) : new Worker(\"data:application/javascript;base64,\" + encodedJs, { type: \"module\" });\n  } finally {\n    objURL && (window.URL || window.webkitURL).revokeObjectURL(objURL);\n  }\n}\nclass WorkerManager {\n  constructor(draw) {\n    this.draw = draw;\n    this.wordCountWorker = new WorkerWrapper$2();\n    this.catalogWorker = new WorkerWrapper$1();\n    this.groupWorker = new WorkerWrapper();\n  }\n  getWordCount() {\n    return new Promise((resolve, reject) => {\n      this.wordCountWorker.onmessage = (evt) => {\n        resolve(evt.data);\n      };\n      this.wordCountWorker.onerror = (evt) => {\n        reject(evt);\n      };\n      const elementList = this.draw.getOriginalMainElementList();\n      this.wordCountWorker.postMessage(elementList);\n    });\n  }\n  getCatalog() {\n    return new Promise((resolve, reject) => {\n      this.catalogWorker.onmessage = (evt) => {\n        resolve(evt.data);\n      };\n      this.catalogWorker.onerror = (evt) => {\n        reject(evt);\n      };\n      const elementList = this.draw.getOriginalMainElementList();\n      const positionList = this.draw.getPosition().getOriginalMainPositionList();\n      this.catalogWorker.postMessage({\n        elementList,\n        positionList\n      });\n    });\n  }\n  getGroupIds() {\n    return new Promise((resolve, reject) => {\n      this.groupWorker.onmessage = (evt) => {\n        resolve(evt.data);\n      };\n      this.groupWorker.onerror = (evt) => {\n        reject(evt);\n      };\n      const elementList = this.draw.getOriginalMainElementList();\n      this.groupWorker.postMessage(elementList);\n    });\n  }\n}\nclass Previewer {\n  constructor(draw) {\n    this._keydown = () => {\n      if (this.resizerSelection.style.display === \"block\") {\n        this.clearResizer();\n        document.removeEventListener(\"keydown\", this._keydown);\n      }\n    };\n    this.container = draw.getContainer();\n    this.canvas = draw.getPage();\n    this.draw = draw;\n    this.options = draw.getOptions();\n    this.curElement = null;\n    this.curElementSrc = \"\";\n    this.previewerDrawOption = {};\n    this.curPosition = null;\n    const { resizerSelection, resizerHandleList, resizerImageContainer, resizerImage, resizerSize } = this._createResizerDom();\n    this.resizerSelection = resizerSelection;\n    this.resizerHandleList = resizerHandleList;\n    this.resizerImageContainer = resizerImageContainer;\n    this.resizerImage = resizerImage;\n    this.resizerSize = resizerSize;\n    this.width = 0;\n    this.height = 0;\n    this.mousedownX = 0;\n    this.mousedownY = 0;\n    this.curHandleIndex = 0;\n    this.previewerContainer = null;\n    this.previewerImage = null;\n  }\n  _getElementPosition(element, position = null) {\n    var _a;\n    let x = 0;\n    let y = 0;\n    const height = this.draw.getHeight();\n    const pageGap = this.draw.getPageGap();\n    const pageNo = (_a = position == null ? void 0 : position.pageNo) != null ? _a : this.draw.getPageNo();\n    const preY = pageNo * (height + pageGap);\n    if (element.imgFloatPosition) {\n      x = element.imgFloatPosition.x;\n      y = element.imgFloatPosition.y + preY;\n    } else if (position) {\n      const { coordinate: { leftTop: [left2, top] }, ascent } = position;\n      x = left2;\n      y = top + preY + ascent;\n    }\n    return { x, y };\n  }\n  _createResizerDom() {\n    const { scale } = this.options;\n    const resizerSelection = document.createElement(\"div\");\n    resizerSelection.classList.add(`${EDITOR_PREFIX}-resizer-selection`);\n    resizerSelection.style.display = \"none\";\n    resizerSelection.style.borderColor = this.options.resizerColor;\n    resizerSelection.style.borderWidth = `${scale}px`;\n    const resizerHandleList = [];\n    for (let i = 0; i < 8; i++) {\n      const handleDom = document.createElement(\"div\");\n      handleDom.style.background = this.options.resizerColor;\n      handleDom.classList.add(`resizer-handle`);\n      handleDom.classList.add(`handle-${i}`);\n      handleDom.setAttribute(\"data-index\", String(i));\n      handleDom.onmousedown = this._mousedown.bind(this);\n      resizerSelection.append(handleDom);\n      resizerHandleList.push(handleDom);\n    }\n    this.container.append(resizerSelection);\n    const resizerSizeView = document.createElement(\"div\");\n    resizerSizeView.classList.add(`${EDITOR_PREFIX}-resizer-size-view`);\n    const resizerSize = document.createElement(\"span\");\n    resizerSizeView.append(resizerSize);\n    resizerSelection.append(resizerSizeView);\n    const resizerImageContainer = document.createElement(\"div\");\n    resizerImageContainer.classList.add(`${EDITOR_PREFIX}-resizer-image`);\n    resizerImageContainer.style.display = \"none\";\n    const resizerImage = document.createElement(\"img\");\n    resizerImageContainer.append(resizerImage);\n    this.container.append(resizerImageContainer);\n    return {\n      resizerSelection,\n      resizerHandleList,\n      resizerImageContainer,\n      resizerImage,\n      resizerSize\n    };\n  }\n  _mousedown(evt) {\n    this.canvas = this.draw.getPage();\n    if (!this.curElement)\n      return;\n    const { scale } = this.options;\n    this.mousedownX = evt.x;\n    this.mousedownY = evt.y;\n    const target = evt.target;\n    this.curHandleIndex = Number(target.dataset.index);\n    const cursor = window.getComputedStyle(target).cursor;\n    document.body.style.cursor = cursor;\n    this.canvas.style.cursor = cursor;\n    this.resizerImage.src = this.curElementSrc;\n    this.resizerImageContainer.style.display = \"block\";\n    const { x: resizerLeft, y: resizerTop } = this._getElementPosition(this.curElement, this.curPosition);\n    this.resizerImageContainer.style.left = `${resizerLeft}px`;\n    this.resizerImageContainer.style.top = `${resizerTop}px`;\n    this.resizerImage.style.width = `${this.curElement.width * scale}px`;\n    this.resizerImage.style.height = `${this.curElement.height * scale}px`;\n    const mousemoveFn = this._mousemove.bind(this);\n    document.addEventListener(\"mousemove\", mousemoveFn);\n    document.addEventListener(\"mouseup\", () => {\n      var _a;\n      if (this.curElement && !this.previewerDrawOption.dragDisable) {\n        this.curElement.width = this.width;\n        this.curElement.height = this.height;\n        this.draw.render({\n          isSetCursor: true,\n          curIndex: (_a = this.curPosition) == null ? void 0 : _a.index\n        });\n      }\n      this.resizerImageContainer.style.display = \"none\";\n      document.removeEventListener(\"mousemove\", mousemoveFn);\n      document.body.style.cursor = \"\";\n      this.canvas.style.cursor = \"text\";\n    }, {\n      once: true\n    });\n    evt.preventDefault();\n  }\n  _mousemove(evt) {\n    if (!this.curElement || this.previewerDrawOption.dragDisable)\n      return;\n    const { scale } = this.options;\n    let dx = 0;\n    let dy = 0;\n    switch (this.curHandleIndex) {\n      case 0:\n      {\n        const offsetX = this.mousedownX - evt.x;\n        const offsetY = this.mousedownY - evt.y;\n        dx = Math.cbrt(offsetX ** 3 + offsetY ** 3);\n        dy = this.curElement.height * dx / this.curElement.width;\n      }\n        break;\n      case 1:\n        dy = this.mousedownY - evt.y;\n        break;\n      case 2:\n      {\n        const offsetX = evt.x - this.mousedownX;\n        const offsetY = this.mousedownY - evt.y;\n        dx = Math.cbrt(offsetX ** 3 + offsetY ** 3);\n        dy = this.curElement.height * dx / this.curElement.width;\n      }\n        break;\n      case 4:\n      {\n        const offsetX = evt.x - this.mousedownX;\n        const offsetY = evt.y - this.mousedownY;\n        dx = Math.cbrt(offsetX ** 3 + offsetY ** 3);\n        dy = this.curElement.height * dx / this.curElement.width;\n      }\n        break;\n      case 3:\n        dx = evt.x - this.mousedownX;\n        break;\n      case 5:\n        dy = evt.y - this.mousedownY;\n        break;\n      case 6:\n      {\n        const offsetX = this.mousedownX - evt.x;\n        const offsetY = evt.y - this.mousedownY;\n        dx = Math.cbrt(offsetX ** 3 + offsetY ** 3);\n        dy = this.curElement.height * dx / this.curElement.width;\n      }\n        break;\n      case 7:\n        dx = this.mousedownX - evt.x;\n        break;\n    }\n    const dw = this.curElement.width + dx / scale;\n    const dh = this.curElement.height + dy / scale;\n    if (dw <= 0 || dh <= 0)\n      return;\n    this.width = dw;\n    this.height = dh;\n    const elementWidth = dw * scale;\n    const elementHeight = dh * scale;\n    this.resizerImage.style.width = `${elementWidth}px`;\n    this.resizerImage.style.height = `${elementHeight}px`;\n    this._updateResizerRect(elementWidth, elementHeight);\n    this._updateResizerSizeView(elementWidth, elementHeight);\n    evt.preventDefault();\n  }\n  _drawPreviewer() {\n    const previewerContainer = document.createElement(\"div\");\n    previewerContainer.classList.add(`${EDITOR_PREFIX}-image-previewer`);\n    const closeBtn = document.createElement(\"i\");\n    closeBtn.classList.add(\"image-close\");\n    closeBtn.onclick = () => {\n      this._clearPreviewer();\n    };\n    previewerContainer.append(closeBtn);\n    const imgContainer = document.createElement(\"div\");\n    imgContainer.classList.add(`${EDITOR_PREFIX}-image-container`);\n    const img = document.createElement(\"img\");\n    img.src = this.curElementSrc;\n    img.draggable = false;\n    imgContainer.append(img);\n    this.previewerImage = img;\n    previewerContainer.append(imgContainer);\n    let x = 0;\n    let y = 0;\n    let scaleSize = 1;\n    let rotateSize = 0;\n    const menuContainer = document.createElement(\"div\");\n    menuContainer.classList.add(`${EDITOR_PREFIX}-image-menu`);\n    const zoomIn = document.createElement(\"i\");\n    zoomIn.classList.add(\"zoom-in\");\n    zoomIn.onclick = () => {\n      scaleSize += 0.1;\n      this._setPreviewerTransform(scaleSize, rotateSize, x, y);\n    };\n    menuContainer.append(zoomIn);\n    const zoomOut = document.createElement(\"i\");\n    zoomOut.onclick = () => {\n      if (scaleSize - 0.1 <= 0.1)\n        return;\n      scaleSize -= 0.1;\n      this._setPreviewerTransform(scaleSize, rotateSize, x, y);\n    };\n    zoomOut.classList.add(\"zoom-out\");\n    menuContainer.append(zoomOut);\n    const rotate = document.createElement(\"i\");\n    rotate.classList.add(\"rotate\");\n    rotate.onclick = () => {\n      rotateSize += 1;\n      this._setPreviewerTransform(scaleSize, rotateSize, x, y);\n    };\n    menuContainer.append(rotate);\n    const originalSize = document.createElement(\"i\");\n    originalSize.classList.add(\"original-size\");\n    originalSize.onclick = () => {\n      x = 0;\n      y = 0;\n      scaleSize = 1;\n      rotateSize = 0;\n      this._setPreviewerTransform(scaleSize, rotateSize, x, y);\n    };\n    menuContainer.append(originalSize);\n    const imageDownload = document.createElement(\"i\");\n    imageDownload.classList.add(\"image-download\");\n    imageDownload.onclick = () => {\n      var _a;\n      const { mime } = this.previewerDrawOption;\n      downloadFile(img.src, `${(_a = this.curElement) == null ? void 0 : _a.id}.${mime || \"png\"}`);\n    };\n    menuContainer.append(imageDownload);\n    previewerContainer.append(menuContainer);\n    this.previewerContainer = previewerContainer;\n    document.body.append(previewerContainer);\n    let startX = 0;\n    let startY = 0;\n    let isAllowDrag = false;\n    img.onmousedown = (evt) => {\n      isAllowDrag = true;\n      startX = evt.x;\n      startY = evt.y;\n      previewerContainer.style.cursor = \"move\";\n    };\n    previewerContainer.onmousemove = (evt) => {\n      if (!isAllowDrag)\n        return;\n      x += evt.x - startX;\n      y += evt.y - startY;\n      startX = evt.x;\n      startY = evt.y;\n      this._setPreviewerTransform(scaleSize, rotateSize, x, y);\n    };\n    previewerContainer.onmouseup = () => {\n      isAllowDrag = false;\n      previewerContainer.style.cursor = \"auto\";\n    };\n    previewerContainer.onwheel = (evt) => {\n      evt.preventDefault();\n      evt.stopPropagation();\n      if (evt.deltaY < 0) {\n        scaleSize += 0.1;\n      } else {\n        if (scaleSize - 0.1 <= 0.1)\n          return;\n        scaleSize -= 0.1;\n      }\n      this._setPreviewerTransform(scaleSize, rotateSize, x, y);\n    };\n  }\n  _setPreviewerTransform(scale, rotate, x, y) {\n    if (!this.previewerImage)\n      return;\n    this.previewerImage.style.left = `${x}px`;\n    this.previewerImage.style.top = `${y}px`;\n    this.previewerImage.style.transform = `scale(${scale}) rotate(${rotate * 90}deg)`;\n  }\n  _clearPreviewer() {\n    var _a;\n    (_a = this.previewerContainer) == null ? void 0 : _a.remove();\n    this.previewerContainer = null;\n    document.body.style.overflow = \"auto\";\n  }\n  _updateResizerRect(width, height) {\n    const { resizerSize: handleSize, scale } = this.options;\n    this.resizerSelection.style.width = `${width}px`;\n    this.resizerSelection.style.height = `${height}px`;\n    for (let i = 0; i < 8; i++) {\n      const left2 = i === 0 || i === 6 || i === 7 ? -handleSize : i === 1 || i === 5 ? width / 2 : width - handleSize;\n      const top = i === 0 || i === 1 || i === 2 ? -handleSize : i === 3 || i === 7 ? height / 2 - handleSize : height - handleSize;\n      this.resizerHandleList[i].style.transform = `scale(${scale})`;\n      this.resizerHandleList[i].style.left = `${left2}px`;\n      this.resizerHandleList[i].style.top = `${top}px`;\n    }\n  }\n  _updateResizerSizeView(width, height) {\n    this.resizerSize.innerText = `${Math.round(width)} \\xD7 ${Math.round(height)}`;\n  }\n  render() {\n    this._drawPreviewer();\n    document.body.style.overflow = \"hidden\";\n  }\n  drawResizer(element, position = null, options = {}) {\n    this.previewerDrawOption = options;\n    this.curElementSrc = element[options.srcKey || \"value\"] || \"\";\n    this.updateResizer(element, position);\n    document.addEventListener(\"keydown\", this._keydown);\n  }\n  updateResizer(element, position = null) {\n    const { scale } = this.options;\n    const elementWidth = element.width * scale;\n    const elementHeight = element.height * scale;\n    this._updateResizerSizeView(elementWidth, elementHeight);\n    const { x: resizerLeft, y: resizerTop } = this._getElementPosition(element, position);\n    this.resizerSelection.style.left = `${resizerLeft}px`;\n    this.resizerSelection.style.top = `${resizerTop}px`;\n    this.resizerSelection.style.borderWidth = `${scale}px`;\n    this._updateResizerRect(elementWidth, elementHeight);\n    this.resizerSelection.style.display = \"block\";\n    this.curElement = element;\n    this.curPosition = position;\n    this.width = elementWidth;\n    this.height = elementHeight;\n  }\n  clearResizer() {\n    this.resizerSelection.style.display = \"none\";\n    document.removeEventListener(\"keydown\", this._keydown);\n  }\n}\nclass DateParticle {\n  constructor(draw) {\n    this.draw = draw;\n    this.options = draw.getOptions();\n    this.range = draw.getRange();\n    this.datePicker = new DatePicker(draw, {\n      onSubmit: this._setValue.bind(this)\n    });\n  }\n  _setValue(date) {\n    if (!date)\n      return;\n    const range = this.getDateElementRange();\n    if (!range)\n      return;\n    const [leftIndex, rightIndex] = range;\n    const elementList = this.draw.getElementList();\n    const startElement = elementList[leftIndex + 1];\n    this.draw.spliceElementList(elementList, leftIndex + 1, rightIndex - leftIndex);\n    this.range.setRange(leftIndex, leftIndex);\n    const dateElement = {\n      type: ElementType.DATE,\n      value: \"\",\n      dateFormat: startElement.dateFormat,\n      valueList: [\n        {\n          value: date\n        }\n      ]\n    };\n    formatElementContext(elementList, [dateElement], leftIndex, {\n      editorOptions: this.options\n    });\n    this.draw.insertElementList([dateElement]);\n  }\n  getDateElementRange() {\n    let leftIndex = -1;\n    let rightIndex = -1;\n    const { startIndex, endIndex } = this.range.getRange();\n    if (!~startIndex && !~endIndex)\n      return null;\n    const elementList = this.draw.getElementList();\n    const startElement = elementList[startIndex];\n    if (startElement.type !== ElementType.DATE)\n      return null;\n    let preIndex = startIndex;\n    while (preIndex >= 0) {\n      const preElement = elementList[preIndex];\n      if (preElement.dateId !== startElement.dateId) {\n        leftIndex = preIndex;\n        break;\n      }\n      preIndex--;\n    }\n    let nextIndex = startIndex + 1;\n    while (nextIndex < elementList.length) {\n      const nextElement = elementList[nextIndex];\n      if (nextElement.dateId !== startElement.dateId) {\n        rightIndex = nextIndex - 1;\n        break;\n      }\n      nextIndex++;\n    }\n    if (nextIndex === elementList.length) {\n      rightIndex = nextIndex - 1;\n    }\n    if (!~leftIndex || !~rightIndex)\n      return null;\n    return [leftIndex, rightIndex];\n  }\n  clearDatePicker() {\n    this.datePicker.dispose();\n  }\n  renderDatePicker(element, position) {\n    const elementList = this.draw.getElementList();\n    const range = this.getDateElementRange();\n    const value = range ? elementList.slice(range[0] + 1, range[1] + 1).map((el) => el.value).join(\"\") : \"\";\n    this.datePicker.render({\n      value,\n      position,\n      dateFormat: element.dateFormat\n    });\n  }\n}\nvar BlockType;\n(function(BlockType2) {\n  BlockType2[\"IFRAME\"] = \"iframe\";\n  BlockType2[\"VIDEO\"] = \"video\";\n})(BlockType || (BlockType = {}));\nconst _IFrameBlock = class {\n  constructor(element) {\n    this.element = element;\n  }\n  _defineIframeProperties(iframeWindow) {\n    Object.defineProperties(iframeWindow, {\n      parent: {\n        get: () => null\n      },\n      __POWERED_BY_CANVAS_EDITOR__: {\n        get: () => true\n      }\n    });\n  }\n  render(blockItemContainer) {\n    var _a, _b;\n    const block = this.element.block;\n    const iframe = document.createElement(\"iframe\");\n    iframe.setAttribute(\"data-id\", this.element.id);\n    iframe.sandbox.add(..._IFrameBlock.sandbox);\n    iframe.style.border = \"none\";\n    iframe.style.width = \"100%\";\n    iframe.style.height = \"100%\";\n    if ((_a = block.iframeBlock) == null ? void 0 : _a.src) {\n      iframe.src = block.iframeBlock.src;\n    } else if ((_b = block.iframeBlock) == null ? void 0 : _b.srcdoc) {\n      iframe.srcdoc = block.iframeBlock.srcdoc;\n    }\n    blockItemContainer.append(iframe);\n    this._defineIframeProperties(iframe.contentWindow);\n  }\n};\nlet IFrameBlock = _IFrameBlock;\nIFrameBlock.sandbox = [\"allow-scripts\", \"allow-same-origin\"];\nclass VideoBlock {\n  constructor(element) {\n    this.element = element;\n  }\n  render(blockItemContainer) {\n    var _a;\n    const block = this.element.block;\n    const video = document.createElement(\"video\");\n    video.style.width = \"100%\";\n    video.style.height = \"100%\";\n    video.style.objectFit = \"contain\";\n    video.src = ((_a = block.videoBlock) == null ? void 0 : _a.src) || \"\";\n    video.controls = true;\n    video.crossOrigin = \"anonymous\";\n    blockItemContainer.append(video);\n  }\n}\nclass BaseBlock {\n  constructor(blockParticle, element) {\n    this.draw = blockParticle.getDraw();\n    this.blockContainer = blockParticle.getBlockContainer();\n    this.element = element;\n    this.block = null;\n    this.blockItem = this._createBlockItem();\n    this.blockContainer.append(this.blockItem);\n  }\n  getBlockElement() {\n    return this.element;\n  }\n  _createBlockItem() {\n    const blockItem = document.createElement(\"div\");\n    blockItem.classList.add(`${EDITOR_PREFIX}-block-item`);\n    return blockItem;\n  }\n  render() {\n    const block = this.element.block;\n    if (block.type === BlockType.IFRAME) {\n      this.block = new IFrameBlock(this.element);\n      this.block.render(this.blockItem);\n    } else if (block.type === BlockType.VIDEO) {\n      this.block = new VideoBlock(this.element);\n      this.block.render(this.blockItem);\n    }\n  }\n  setClientRects(pageNo, x, y) {\n    const height = this.draw.getHeight();\n    const pageGap = this.draw.getPageGap();\n    const preY = pageNo * (height + pageGap);\n    const { metrics } = this.element;\n    this.blockItem.style.width = `${metrics.width}px`;\n    this.blockItem.style.height = `${metrics.height}px`;\n    this.blockItem.style.left = `${x}px`;\n    this.blockItem.style.top = `${preY + y}px`;\n  }\n  remove() {\n    this.blockItem.remove();\n  }\n}\nclass BlockParticle {\n  constructor(draw) {\n    this.draw = draw;\n    this.container = draw.getContainer();\n    this.blockMap = /* @__PURE__ */ new Map();\n    this.blockContainer = this._createBlockContainer();\n    this.container.append(this.blockContainer);\n  }\n  _createBlockContainer() {\n    const blockContainer = document.createElement(\"div\");\n    blockContainer.classList.add(`${EDITOR_PREFIX}-block-container`);\n    return blockContainer;\n  }\n  getDraw() {\n    return this.draw;\n  }\n  getBlockContainer() {\n    return this.blockContainer;\n  }\n  render(pageNo, element, x, y) {\n    const id = element.id;\n    const cacheBlock = this.blockMap.get(id);\n    if (cacheBlock) {\n      cacheBlock.setClientRects(pageNo, x, y);\n    } else {\n      const newBlock = new BaseBlock(this, element);\n      newBlock.render();\n      newBlock.setClientRects(pageNo, x, y);\n      this.blockMap.set(id, newBlock);\n    }\n  }\n  clear() {\n    if (!this.blockMap.size)\n      return;\n    const elementList = this.draw.getElementList();\n    const blockElementIds = [];\n    for (let e = 0; e < elementList.length; e++) {\n      const element = elementList[e];\n      if (element.type === ElementType.BLOCK) {\n        blockElementIds.push(element.id);\n      }\n    }\n    this.blockMap.forEach((block) => {\n      const id = block.getBlockElement().id;\n      if (!blockElementIds.includes(id)) {\n        block.remove();\n        this.blockMap.delete(id);\n      }\n    });\n  }\n}\nconst contextmenu$1 = {\n  global: {\n    cut: \"\\u526A\\u5207\",\n    copy: \"\\u590D\\u5236\",\n    paste: \"\\u7C98\\u8D34\",\n    selectAll: \"\\u5168\\u9009\",\n    print: \"\\u6253\\u5370\"\n  },\n  control: {\n    \"delete\": \"\\u5220\\u9664\\u63A7\\u4EF6\"\n  },\n  hyperlink: {\n    \"delete\": \"\\u5220\\u9664\\u94FE\\u63A5\",\n    cancel: \"\\u53D6\\u6D88\\u94FE\\u63A5\",\n    edit: \"\\u7F16\\u8F91\\u94FE\\u63A5\"\n  },\n  image: {\n    change: \"\\u66F4\\u6539\\u56FE\\u7247\",\n    saveAs: \"\\u53E6\\u5B58\\u4E3A\\u56FE\\u7247\",\n    textWrap: \"\\u6587\\u5B57\\u73AF\\u7ED5\",\n    textWrapType: {\n      embed: \"\\u5D4C\\u5165\\u578B\",\n      upDown: \"\\u4E0A\\u4E0B\\u578B\\u73AF\\u7ED5\",\n      surround: \"\\u56DB\\u5468\\u578B\\u73AF\\u7ED5\",\n      floatTop: \"\\u6D6E\\u4E8E\\u6587\\u5B57\\u4E0A\\u65B9\",\n      floatBottom: \"\\u886C\\u4E8E\\u6587\\u5B57\\u4E0B\\u65B9\"\n    }\n  },\n  table: {\n    insertRowCol: \"\\u63D2\\u5165\\u884C\\u5217\",\n    insertTopRow: \"\\u4E0A\\u65B9\\u63D2\\u51651\\u884C\",\n    insertBottomRow: \"\\u4E0B\\u65B9\\u63D2\\u51651\\u884C\",\n    insertLeftCol: \"\\u5DE6\\u4FA7\\u63D2\\u51651\\u5217\",\n    insertRightCol: \"\\u53F3\\u4FA7\\u63D2\\u51651\\u5217\",\n    deleteRowCol: \"\\u5220\\u9664\\u884C\\u5217\",\n    deleteRow: \"\\u5220\\u96641\\u884C\",\n    deleteCol: \"\\u5220\\u96641\\u5217\",\n    deleteTable: \"\\u5220\\u9664\\u6574\\u4E2A\\u8868\\u683C\",\n    mergeCell: \"\\u5408\\u5E76\\u5355\\u5143\\u683C\",\n    mergeCancelCell: \"\\u53D6\\u6D88\\u5408\\u5E76\",\n    verticalAlign: \"\\u5782\\u76F4\\u5BF9\\u9F50\",\n    verticalAlignTop: \"\\u9876\\u7AEF\\u5BF9\\u9F50\",\n    verticalAlignMiddle: \"\\u5782\\u76F4\\u5C45\\u4E2D\",\n    verticalAlignBottom: \"\\u5E95\\u7AEF\\u5BF9\\u9F50\",\n    border: \"\\u8868\\u683C\\u8FB9\\u6846\",\n    borderAll: \"\\u6240\\u6709\\u6846\\u7EBF\",\n    borderEmpty: \"\\u65E0\\u6846\\u7EBF\",\n    borderExternal: \"\\u5916\\u4FA7\\u6846\\u7EBF\",\n    borderTd: \"\\u5355\\u5143\\u683C\\u8FB9\\u6846\",\n    borderTdTop: \"\\u4E0A\\u8FB9\\u6846\",\n    borderTdRight: \"\\u53F3\\u8FB9\\u6846\",\n    borderTdBottom: \"\\u4E0B\\u8FB9\\u6846\",\n    borderTdLeft: \"\\u5DE6\\u8FB9\\u6846\",\n    borderTdForward: \"\\u6B63\\u659C\\u7EBF\",\n    borderTdBack: \"\\u53CD\\u659C\\u7EBF\"\n  }\n};\nconst datePicker$1 = {\n  now: \"\\u6B64\\u523B\",\n  confirm: \"\\u786E\\u5B9A\",\n  \"return\": \"\\u8FD4\\u56DE\\u65E5\\u671F\",\n  timeSelect: \"\\u65F6\\u95F4\\u9009\\u62E9\",\n  weeks: {\n    sun: \"\\u65E5\",\n    mon: \"\\u4E00\",\n    tue: \"\\u4E8C\",\n    wed: \"\\u4E09\",\n    thu: \"\\u56DB\",\n    fri: \"\\u4E94\",\n    sat: \"\\u516D\"\n  },\n  year: \"\\u5E74\",\n  month: \"\\u6708\",\n  hour: \"\\u65F6\",\n  minute: \"\\u5206\",\n  second: \"\\u79D2\"\n};\nconst frame$1 = {\n  header: \"\\u9875\\u7709\",\n  footer: \"\\u9875\\u811A\"\n};\nconst pageBreak$1 = {\n  displayName: \"\\u5206\\u9875\\u7B26\"\n};\nconst zone$1 = {\n  headerTip: \"\\u53CC\\u51FB\\u7F16\\u8F91\\u9875\\u7709\",\n  footerTip: \"\\u53CC\\u51FB\\u7F16\\u8F91\\u9875\\u811A\"\n};\nvar zhCN = {\n  contextmenu: contextmenu$1,\n  datePicker: datePicker$1,\n  frame: frame$1,\n  pageBreak: pageBreak$1,\n  zone: zone$1\n};\nconst contextmenu = {\n  global: {\n    cut: \"Cut\",\n    copy: \"Copy\",\n    paste: \"Paste\",\n    selectAll: \"Select all\",\n    print: \"Print\"\n  },\n  control: {\n    \"delete\": \"Delete control\"\n  },\n  hyperlink: {\n    \"delete\": \"Delete hyperlink\",\n    cancel: \"Cancel hyperlink\",\n    edit: \"Edit hyperlink\"\n  },\n  image: {\n    change: \"Change image\",\n    saveAs: \"Save as image\",\n    textWrap: \"Text wrap\",\n    textWrapType: {\n      embed: \"Embed\",\n      upDown: \"Up down\",\n      surround: \"Surround\",\n      floatTop: \"Float above text\",\n      floatBottom: \"Float below text\"\n    }\n  },\n  table: {\n    insertRowCol: \"Insert row col\",\n    insertTopRow: \"Insert top 1 row\",\n    insertBottomRow: \"Insert bottom 1 row\",\n    insertLeftCol: \"Insert left 1 col\",\n    insertRightCol: \"Insert right 1 col\",\n    deleteRowCol: \"Delete row col\",\n    deleteRow: \"Delete 1 row\",\n    deleteCol: \"Delete 1 col\",\n    deleteTable: \"Delete table\",\n    mergeCell: \"Merge cell\",\n    mergeCancelCell: \"Cancel merge cell\",\n    verticalAlign: \"Vertical align\",\n    verticalAlignTop: \"Top\",\n    verticalAlignMiddle: \"Middle\",\n    verticalAlignBottom: \"Bottom\",\n    border: \"Table border\",\n    borderAll: \"All\",\n    borderEmpty: \"Empty\",\n    borderExternal: \"External\",\n    borderTd: \"Table cell border\",\n    borderTdTop: \"Top\",\n    borderTdRight: \"Right\",\n    borderTdBottom: \"Bottom\",\n    borderTdLeft: \"Left\",\n    borderTdForward: \"Forward\",\n    borderTdBack: \"Back\"\n  }\n};\nconst datePicker = {\n  now: \"Now\",\n  confirm: \"Confirm\",\n  \"return\": \"Return\",\n  timeSelect: \"Time select\",\n  weeks: {\n    sun: \"Sun\",\n    mon: \"Mon\",\n    tue: \"Tue\",\n    wed: \"Wed\",\n    thu: \"Thu\",\n    fri: \"Fri\",\n    sat: \"Sat\"\n  },\n  year: \" \",\n  month: \" \",\n  hour: \"Hour\",\n  minute: \"Minute\",\n  second: \"Second\"\n};\nconst frame = {\n  header: \"Header\",\n  footer: \"Footer\"\n};\nconst pageBreak = {\n  displayName: \"Page Break\"\n};\nconst zone = {\n  headerTip: \"Double click to edit header\",\n  footerTip: \"Double click to edit footer\"\n};\nvar en = {\n  contextmenu,\n  datePicker,\n  frame,\n  pageBreak,\n  zone\n};\nclass I18n {\n  constructor() {\n    this.langMap = /* @__PURE__ */ new Map([\n      [\"zhCN\", zhCN],\n      [\"en\", en]\n    ]);\n    this.currentLocale = \"zhCN\";\n  }\n  registerLangMap(locale, lang) {\n    const sourceLang = this.langMap.get(locale);\n    this.langMap.set(locale, mergeObject(sourceLang || zhCN, lang));\n  }\n  getLocale() {\n    return this.currentLocale;\n  }\n  setLocale(locale) {\n    this.currentLocale = locale;\n  }\n  getLang() {\n    return this.langMap.get(this.currentLocale) || zhCN;\n  }\n  t(path) {\n    const keyList = path.split(\".\");\n    let value = \"\";\n    let item = this.getLang();\n    for (let k = 0; k < keyList.length; k++) {\n      const key = keyList[k];\n      const currentValue = Reflect.get(item, key);\n      if (currentValue) {\n        value = item = currentValue;\n      } else {\n        return \"\";\n      }\n    }\n    return value;\n  }\n}\nclass ImageObserver {\n  constructor() {\n    this.promiseList = [];\n  }\n  add(payload) {\n    this.promiseList.push(payload);\n  }\n  clearAll() {\n    this.promiseList = [];\n  }\n  allSettled() {\n    return Promise.allSettled(this.promiseList);\n  }\n}\nclass ZoneTip {\n  constructor(draw, zone2) {\n    this.draw = draw;\n    this.zone = zone2;\n    this.i18n = draw.getI18n();\n    this.container = draw.getContainer();\n    this.pageContainer = draw.getPageContainer();\n    const { tipContainer, tipContent } = this._drawZoneTip();\n    this.tipContainer = tipContainer;\n    this.tipContent = tipContent;\n    this.isDisableMouseMove = true;\n    this.currentMoveZone = EditorZone.MAIN;\n    const watchZones = [];\n    const { header, footer } = draw.getOptions();\n    if (!header.disabled) {\n      watchZones.push(EditorZone.HEADER);\n    }\n    if (!footer.disabled) {\n      watchZones.push(EditorZone.FOOTER);\n    }\n    if (watchZones.length) {\n      this._watchMouseMoveZoneChange(watchZones);\n    }\n  }\n  _watchMouseMoveZoneChange(watchZones) {\n    this.pageContainer.addEventListener(\"mousemove\", throttle((evt) => {\n      if (this.isDisableMouseMove || !this.draw.getIsPagingMode())\n        return;\n      if (!evt.offsetY)\n        return;\n      if (evt.target instanceof HTMLCanvasElement) {\n        const mousemoveZone = this.zone.getZoneByY(evt.offsetY);\n        if (!watchZones.includes(mousemoveZone)) {\n          this._updateZoneTip(false);\n          return;\n        }\n        this.currentMoveZone = mousemoveZone;\n        this._updateZoneTip(this.zone.getZone() === EditorZone.MAIN && (mousemoveZone === EditorZone.HEADER || mousemoveZone === EditorZone.FOOTER), evt.x, evt.y);\n      } else {\n        this._updateZoneTip(false);\n      }\n    }, 250));\n    this.pageContainer.addEventListener(\"mouseenter\", () => {\n      this.isDisableMouseMove = false;\n    });\n    this.pageContainer.addEventListener(\"mouseleave\", () => {\n      this.isDisableMouseMove = true;\n      this._updateZoneTip(false);\n    });\n  }\n  _drawZoneTip() {\n    const tipContainer = document.createElement(\"div\");\n    tipContainer.classList.add(`${EDITOR_PREFIX}-zone-tip`);\n    const tipContent = document.createElement(\"span\");\n    tipContainer.append(tipContent);\n    this.container.append(tipContainer);\n    return {\n      tipContainer,\n      tipContent\n    };\n  }\n  _updateZoneTip(visible, left2, top) {\n    if (visible) {\n      this.tipContainer.classList.add(\"show\");\n      this.tipContainer.style.left = `${left2}px`;\n      this.tipContainer.style.top = `${top}px`;\n      this.tipContent.innerText = this.i18n.t(`zone.${this.currentMoveZone === EditorZone.HEADER ? \"headerTip\" : \"footerTip\"}`);\n    } else {\n      this.tipContainer.classList.remove(\"show\");\n    }\n  }\n}\nclass Zone {\n  constructor(draw) {\n    this.INDICATOR_PADDING = 2;\n    this.INDICATOR_TITLE_TRANSLATE = [20, 5];\n    this.draw = draw;\n    this.i18n = draw.getI18n();\n    this.options = draw.getOptions();\n    this.container = draw.getContainer();\n    this.currentZone = EditorZone.MAIN;\n    this.indicatorContainer = null;\n    if (!this.options.zone.tipDisabled) {\n      new ZoneTip(draw, this);\n    }\n  }\n  isHeaderActive() {\n    return this.getZone() === EditorZone.HEADER;\n  }\n  isMainActive() {\n    return this.getZone() === EditorZone.MAIN;\n  }\n  isFooterActive() {\n    return this.getZone() === EditorZone.FOOTER;\n  }\n  getZone() {\n    return this.currentZone;\n  }\n  setZone(payload) {\n    const { header, footer } = this.options;\n    if (!header.editable && payload === EditorZone.HEADER || !footer.editable && payload === EditorZone.FOOTER) {\n      return;\n    }\n    if (this.currentZone === payload)\n      return;\n    this.currentZone = payload;\n    this.draw.getRange().clearRange();\n    this.draw.render({\n      isSubmitHistory: false,\n      isSetCursor: false,\n      isCompute: false\n    });\n    this.drawZoneIndicator();\n    nextTick(() => {\n      const listener = this.draw.getListener();\n      if (listener.zoneChange) {\n        listener.zoneChange(payload);\n      }\n      const eventBus = this.draw.getEventBus();\n      if (eventBus.isSubscribe(\"zoneChange\")) {\n        eventBus.emit(\"zoneChange\", payload);\n      }\n    });\n  }\n  getZoneByY(y) {\n    const header = this.draw.getHeader();\n    const headerBottomY = header.getHeaderTop() + header.getHeight();\n    const footer = this.draw.getFooter();\n    const pageHeight = this.draw.getHeight();\n    const footerTopY = pageHeight - (footer.getFooterBottom() + footer.getHeight());\n    if (y < headerBottomY) {\n      return EditorZone.HEADER;\n    }\n    if (y > footerTopY) {\n      return EditorZone.FOOTER;\n    }\n    return EditorZone.MAIN;\n  }\n  drawZoneIndicator() {\n    this._clearZoneIndicator();\n    if (!this.isHeaderActive() && !this.isFooterActive())\n      return;\n    const { scale } = this.options;\n    const isHeaderActive = this.isHeaderActive();\n    const [offsetX, offsetY] = this.INDICATOR_TITLE_TRANSLATE;\n    const pageList = this.draw.getPageList();\n    const margins = this.draw.getMargins();\n    const innerWidth = this.draw.getInnerWidth();\n    const pageHeight = this.draw.getHeight();\n    const pageGap = this.draw.getPageGap();\n    const preY = pageHeight + pageGap;\n    this.indicatorContainer = document.createElement(\"div\");\n    this.indicatorContainer.classList.add(`${EDITOR_PREFIX}-zone-indicator`);\n    const header = this.draw.getHeader();\n    const footer = this.draw.getFooter();\n    const indicatorHeight = isHeaderActive ? header.getHeight() : footer.getHeight();\n    const indicatorTop = isHeaderActive ? header.getHeaderTop() : pageHeight - footer.getFooterBottom() - indicatorHeight;\n    for (let p = 0; p < pageList.length; p++) {\n      const startY = preY * p + indicatorTop;\n      const indicatorLeftX = margins[3] - this.INDICATOR_PADDING;\n      const indicatorRightX = margins[3] + innerWidth + this.INDICATOR_PADDING;\n      const indicatorTopY = isHeaderActive ? startY - this.INDICATOR_PADDING : startY + indicatorHeight + this.INDICATOR_PADDING;\n      const indicatorBottomY = isHeaderActive ? startY + indicatorHeight + this.INDICATOR_PADDING : startY - this.INDICATOR_PADDING;\n      const indicatorTitle = document.createElement(\"div\");\n      indicatorTitle.innerText = this.i18n.t(`frame.${isHeaderActive ? \"header\" : \"footer\"}`);\n      indicatorTitle.style.top = `${indicatorBottomY}px`;\n      indicatorTitle.style.transform = `translate(${offsetX * scale}px, ${offsetY * scale}px) scale(${scale})`;\n      this.indicatorContainer.append(indicatorTitle);\n      const lineTop = document.createElement(\"span\");\n      lineTop.classList.add(`${EDITOR_PREFIX}-zone-indicator-border__top`);\n      lineTop.style.top = `${indicatorTopY}px`;\n      lineTop.style.width = `${innerWidth}px`;\n      lineTop.style.marginLeft = `${margins[3]}px`;\n      this.indicatorContainer.append(lineTop);\n      const lineLeft = document.createElement(\"span\");\n      lineLeft.classList.add(`${EDITOR_PREFIX}-zone-indicator-border__left`);\n      lineLeft.style.top = `${startY}px`;\n      lineLeft.style.height = `${indicatorHeight}px`;\n      lineLeft.style.left = `${indicatorLeftX}px`;\n      this.indicatorContainer.append(lineLeft);\n      const lineBottom = document.createElement(\"span\");\n      lineBottom.classList.add(`${EDITOR_PREFIX}-zone-indicator-border__bottom`);\n      lineBottom.style.top = `${indicatorBottomY}px`;\n      this.indicatorContainer.append(lineBottom);\n      const lineRight = document.createElement(\"span\");\n      lineRight.classList.add(`${EDITOR_PREFIX}-zone-indicator-border__right`);\n      lineRight.style.top = `${startY}px`;\n      lineRight.style.height = `${indicatorHeight}px`;\n      lineRight.style.left = `${indicatorRightX}px`;\n      this.indicatorContainer.append(lineRight);\n    }\n    this.container.append(this.indicatorContainer);\n  }\n  _clearZoneIndicator() {\n    var _a;\n    (_a = this.indicatorContainer) == null ? void 0 : _a.remove();\n    this.indicatorContainer = null;\n  }\n}\nclass Footer {\n  constructor(draw, data2) {\n    this.draw = draw;\n    this.position = draw.getPosition();\n    this.options = draw.getOptions();\n    this.elementList = data2 || [];\n    this.rowList = [];\n    this.positionList = [];\n  }\n  getRowList() {\n    return this.rowList;\n  }\n  setElementList(elementList) {\n    this.elementList = elementList;\n  }\n  getElementList() {\n    return this.elementList;\n  }\n  getPositionList() {\n    return this.positionList;\n  }\n  compute() {\n    this.recovery();\n    this._computeRowList();\n    this._computePositionList();\n  }\n  recovery() {\n    this.rowList = [];\n    this.positionList = [];\n  }\n  _computeRowList() {\n    const innerWidth = this.draw.getInnerWidth();\n    this.rowList = this.draw.computeRowList({\n      innerWidth,\n      elementList: this.elementList\n    });\n  }\n  _computePositionList() {\n    const footerBottom = this.getFooterBottom();\n    const innerWidth = this.draw.getInnerWidth();\n    const margins = this.draw.getMargins();\n    const startX = margins[3];\n    const pageHeight = this.draw.getHeight();\n    const footerHeight = this.getHeight();\n    const startY = pageHeight - footerBottom - footerHeight;\n    this.position.computePageRowPosition({\n      positionList: this.positionList,\n      rowList: this.rowList,\n      pageNo: 0,\n      startRowIndex: 0,\n      startIndex: 0,\n      startX,\n      startY,\n      innerWidth,\n      zone: EditorZone.FOOTER\n    });\n  }\n  getFooterBottom() {\n    const { footer: { bottom, disabled }, scale } = this.options;\n    if (disabled)\n      return 0;\n    return Math.floor(bottom * scale);\n  }\n  getMaxHeight() {\n    const { footer: { maxHeightRadio } } = this.options;\n    const height = this.draw.getHeight();\n    return Math.floor(height * maxHeightRadioMapping[maxHeightRadio]);\n  }\n  getHeight() {\n    const maxHeight = this.getMaxHeight();\n    const rowHeight = this.getRowHeight();\n    return rowHeight > maxHeight ? maxHeight : rowHeight;\n  }\n  getRowHeight() {\n    return this.rowList.reduce((pre, cur) => pre + cur.height, 0);\n  }\n  getExtraHeight() {\n    const margins = this.draw.getMargins();\n    const footerHeight = this.getHeight();\n    const footerBottom = this.getFooterBottom();\n    const extraHeight = footerBottom + footerHeight - margins[2];\n    return extraHeight <= 0 ? 0 : extraHeight;\n  }\n  render(ctx, pageNo) {\n    ctx.globalAlpha = 1;\n    const innerWidth = this.draw.getInnerWidth();\n    const maxHeight = this.getMaxHeight();\n    const rowList = [];\n    let curRowHeight = 0;\n    for (let r = 0; r < this.rowList.length; r++) {\n      const row = this.rowList[r];\n      if (curRowHeight + row.height > maxHeight) {\n        break;\n      }\n      rowList.push(row);\n      curRowHeight += row.height;\n    }\n    this.draw.drawRow(ctx, {\n      elementList: this.elementList,\n      positionList: this.positionList,\n      rowList,\n      pageNo,\n      startIndex: 0,\n      innerWidth,\n      zone: EditorZone.FOOTER\n    });\n  }\n}\nclass ListParticle {\n  constructor(draw) {\n    this.UN_COUNT_STYLE_WIDTH = 20;\n    this.MEASURE_BASE_TEXT = \"0\";\n    this.LIST_GAP = 10;\n    this.draw = draw;\n    this.range = draw.getRange();\n    this.options = draw.getOptions();\n  }\n  setList(listType, listStyle) {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    const { startIndex, endIndex } = this.range.getRange();\n    if (!~startIndex && !~endIndex)\n      return;\n    const changeElementList = this.range.getRangeParagraphElementList();\n    if (!changeElementList || !changeElementList.length)\n      return;\n    const isUnsetList = changeElementList.find((el) => el.listType === listType && el.listStyle === listStyle);\n    if (isUnsetList || !listType) {\n      this.unsetList();\n      return;\n    }\n    const listId = getUUID();\n    changeElementList.forEach((el) => {\n      el.listId = listId;\n      el.listType = listType;\n      el.listStyle = listStyle;\n    });\n    const isSetCursor = startIndex === endIndex;\n    const curIndex = isSetCursor ? endIndex : startIndex;\n    this.draw.render({ curIndex, isSetCursor });\n  }\n  unsetList() {\n    var _a;\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    const { startIndex, endIndex } = this.range.getRange();\n    if (!~startIndex && !~endIndex)\n      return;\n    const changeElementList = (_a = this.range.getRangeParagraphElementList()) == null ? void 0 : _a.filter((el) => el.listId);\n    if (!changeElementList || !changeElementList.length)\n      return;\n    const elementList = this.draw.getElementList();\n    const endElement = elementList[endIndex];\n    if (endElement.listId) {\n      let start = endIndex + 1;\n      while (start < elementList.length) {\n        const element = elementList[start];\n        if (element.value === ZERO && !element.listWrap)\n          break;\n        if (element.listId !== endElement.listId) {\n          this.draw.spliceElementList(elementList, start, 0, {\n            value: ZERO\n          });\n          break;\n        }\n        start++;\n      }\n    }\n    changeElementList.forEach((el) => {\n      delete el.listId;\n      delete el.listType;\n      delete el.listStyle;\n      delete el.listWrap;\n    });\n    const isSetCursor = startIndex === endIndex;\n    const curIndex = isSetCursor ? endIndex : startIndex;\n    this.draw.render({ curIndex, isSetCursor });\n  }\n  computeListStyle(ctx, elementList) {\n    const listStyleMap = /* @__PURE__ */ new Map();\n    let start = 0;\n    let curListId = elementList[start].listId;\n    let curElementList = [];\n    const elementLength = elementList.length;\n    while (start < elementLength) {\n      const curElement = elementList[start];\n      if (curListId && curListId === curElement.listId) {\n        curElementList.push(curElement);\n      } else {\n        if (curElement.listId && curElement.listId !== curListId) {\n          if (curElementList.length) {\n            const width = this.getListStyleWidth(ctx, curElementList);\n            listStyleMap.set(curListId, width);\n          }\n          curListId = curElement.listId;\n          curElementList = curListId ? [curElement] : [];\n        }\n      }\n      start++;\n    }\n    if (curElementList.length) {\n      const width = this.getListStyleWidth(ctx, curElementList);\n      listStyleMap.set(curListId, width);\n    }\n    return listStyleMap;\n  }\n  getListStyleWidth(ctx, listElementList) {\n    const { scale, checkbox } = this.options;\n    const startElement = listElementList[0];\n    if (startElement.listStyle && startElement.listStyle !== ListStyle.DECIMAL) {\n      if (startElement.listStyle === ListStyle.CHECKBOX) {\n        return (checkbox.width + this.LIST_GAP) * scale;\n      }\n      return this.UN_COUNT_STYLE_WIDTH * scale;\n    }\n    const count = listElementList.reduce((pre, cur) => {\n      if (cur.value === ZERO) {\n        pre += 1;\n      }\n      return pre;\n    }, 0);\n    if (!count)\n      return 0;\n    const text = `${this.MEASURE_BASE_TEXT.repeat(String(count).length)}${KeyMap.PERIOD}`;\n    const textMetrics = ctx.measureText(text);\n    return Math.ceil((textMetrics.width + this.LIST_GAP) * scale);\n  }\n  drawListStyle(ctx, row, position) {\n    var _a;\n    const { elementList, offsetX, listIndex, ascent } = row;\n    const startElement = elementList[0];\n    if (startElement.value !== ZERO || startElement.listWrap)\n      return;\n    let tabWidth = 0;\n    const { defaultTabWidth, scale, defaultFont, defaultSize } = this.options;\n    for (let i = 1; i < elementList.length; i++) {\n      const element = elementList[i];\n      if ((element == null ? void 0 : element.type) !== ElementType.TAB)\n        break;\n      tabWidth += defaultTabWidth * scale;\n    }\n    const { coordinate: { leftTop: [startX, startY] } } = position;\n    const x = startX - offsetX + tabWidth;\n    const y = startY + ascent;\n    if (startElement.listStyle === ListStyle.CHECKBOX) {\n      const { width, height, gap } = this.options.checkbox;\n      const checkboxRowElement = {\n        ...startElement,\n        checkbox: {\n          value: !!((_a = startElement.checkbox) == null ? void 0 : _a.value)\n        },\n        metrics: {\n          ...startElement.metrics,\n          width: (width + gap * 2) * scale,\n          height: height * scale\n        }\n      };\n      this.draw.getCheckboxParticle().render({\n        ctx,\n        x: x - gap * scale,\n        y,\n        index: 0,\n        row: {\n          ...row,\n          elementList: [checkboxRowElement, ...row.elementList]\n        }\n      });\n    } else {\n      let text = \"\";\n      if (startElement.listType === ListType.UL) {\n        text = ulStyleMapping[startElement.listStyle] || ulStyleMapping[UlStyle.DISC];\n      } else {\n        text = `${listIndex + 1}${KeyMap.PERIOD}`;\n      }\n      if (!text)\n        return;\n      ctx.save();\n      ctx.font = `${defaultSize * scale}px ${defaultFont}`;\n      ctx.fillText(text, x, y);\n      ctx.restore();\n    }\n  }\n}\nconst _LineBreakParticle = class {\n  constructor(draw) {\n    this.options = draw.getOptions();\n  }\n  render(ctx, element, x, y) {\n    const { scale, lineBreak: { color, lineWidth } } = this.options;\n    ctx.save();\n    ctx.beginPath();\n    const top = y - _LineBreakParticle.HEIGHT * scale / 2;\n    const left2 = x + element.metrics.width;\n    ctx.translate(left2, top);\n    ctx.scale(scale, scale);\n    ctx.strokeStyle = color;\n    ctx.lineWidth = lineWidth;\n    ctx.lineCap = \"round\";\n    ctx.lineJoin = \"round\";\n    ctx.beginPath();\n    ctx.moveTo(8, 0);\n    ctx.lineTo(12, 0);\n    ctx.lineTo(12, 6);\n    ctx.lineTo(3, 6);\n    ctx.moveTo(3, 6);\n    ctx.lineTo(6, 3);\n    ctx.moveTo(3, 6);\n    ctx.lineTo(6, 9);\n    ctx.stroke();\n    ctx.closePath();\n    ctx.restore();\n  }\n};\nlet LineBreakParticle = _LineBreakParticle;\nLineBreakParticle.WIDTH = 12;\nLineBreakParticle.HEIGHT = 9;\nLineBreakParticle.GAP = 3;\nclass Placeholder {\n  constructor(draw) {\n    this.draw = draw;\n    this.position = draw.getPosition();\n    this.options = draw.getOptions();\n    this.elementList = [];\n    this.rowList = [];\n    this.positionList = [];\n  }\n  _recovery() {\n    this.elementList = [];\n    this.rowList = [];\n    this.positionList = [];\n  }\n  _compute() {\n    this._computeRowList();\n    this._computePositionList();\n  }\n  _computeRowList() {\n    const innerWidth = this.draw.getInnerWidth();\n    this.rowList = this.draw.computeRowList({\n      innerWidth,\n      elementList: this.elementList\n    });\n  }\n  _computePositionList() {\n    const { lineBreak, scale } = this.options;\n    const headerExtraHeight = this.draw.getHeader().getExtraHeight();\n    const innerWidth = this.draw.getInnerWidth();\n    const margins = this.draw.getMargins();\n    let startX = margins[3];\n    if (!lineBreak.disabled) {\n      startX += (LineBreakParticle.WIDTH + LineBreakParticle.GAP) * scale;\n    }\n    const startY = margins[0] + headerExtraHeight;\n    this.position.computePageRowPosition({\n      positionList: this.positionList,\n      rowList: this.rowList,\n      pageNo: 0,\n      startRowIndex: 0,\n      startIndex: 0,\n      startX,\n      startY,\n      innerWidth\n    });\n  }\n  render(ctx) {\n    const { placeholder: { data: data2, font, size, color, opacity } } = this.options;\n    if (!data2)\n      return;\n    this._recovery();\n    this.elementList = [\n      {\n        value: data2,\n        font,\n        size,\n        color\n      }\n    ];\n    formatElementList(this.elementList, {\n      editorOptions: this.options,\n      isForceCompensation: true\n    });\n    this._compute();\n    const innerWidth = this.draw.getInnerWidth();\n    ctx.save();\n    ctx.globalAlpha = opacity;\n    this.draw.drawRow(ctx, {\n      elementList: this.elementList,\n      positionList: this.positionList,\n      rowList: this.rowList,\n      pageNo: 0,\n      startIndex: 0,\n      innerWidth,\n      isDrawLineBreak: false\n    });\n    ctx.restore();\n  }\n}\nclass Group {\n  constructor(draw) {\n    this.draw = draw;\n    this.options = draw.getOptions();\n    this.range = draw.getRange();\n    this.fillRectMap = /* @__PURE__ */ new Map();\n  }\n  setGroup() {\n    if (this.draw.isReadonly() || this.draw.getZone().getZone() !== EditorZone.MAIN) {\n      return null;\n    }\n    const selection = this.range.getSelection();\n    if (!selection)\n      return null;\n    const groupId = getUUID();\n    selection.forEach((el) => {\n      if (!Array.isArray(el.groupIds)) {\n        el.groupIds = [];\n      }\n      el.groupIds.push(groupId);\n    });\n    this.draw.render({\n      isSetCursor: false,\n      isCompute: false\n    });\n    return groupId;\n  }\n  getElementListByGroupId(elementList, groupId) {\n    var _a, _b;\n    const groupElementList = [];\n    for (let e = 0; e < elementList.length; e++) {\n      const element = elementList[e];\n      if (element.type === ElementType.TABLE) {\n        const trList = element.trList;\n        for (let r = 0; r < trList.length; r++) {\n          const tr = trList[r];\n          for (let d = 0; d < tr.tdList.length; d++) {\n            const td = tr.tdList[d];\n            const tdGroupElementList = this.getElementListByGroupId(td.value, groupId);\n            if (tdGroupElementList.length) {\n              groupElementList.push(...tdGroupElementList);\n              return groupElementList;\n            }\n          }\n        }\n      }\n      if ((_a = element == null ? void 0 : element.groupIds) == null ? void 0 : _a.includes(groupId)) {\n        groupElementList.push(element);\n        const nextElement = elementList[e + 1];\n        if (!((_b = nextElement == null ? void 0 : nextElement.groupIds) == null ? void 0 : _b.includes(groupId)))\n          break;\n      }\n    }\n    return groupElementList;\n  }\n  deleteGroup(groupId) {\n    if (this.draw.isReadonly())\n      return;\n    const elementList = this.draw.getOriginalMainElementList();\n    const groupElementList = this.getElementListByGroupId(elementList, groupId);\n    if (!groupElementList.length)\n      return;\n    for (let e = 0; e < groupElementList.length; e++) {\n      const element = groupElementList[e];\n      const groupIds = element.groupIds;\n      const groupIndex = groupIds.findIndex((id) => id === groupId);\n      groupIds.splice(groupIndex, 1);\n      if (!groupIds.length) {\n        delete element.groupIds;\n      }\n    }\n    this.draw.render({\n      isSetCursor: false,\n      isCompute: false\n    });\n  }\n  getContextByGroupId(elementList, groupId) {\n    var _a, _b;\n    for (let e = 0; e < elementList.length; e++) {\n      const element = elementList[e];\n      if (element.type === ElementType.TABLE) {\n        const trList = element.trList;\n        for (let r = 0; r < trList.length; r++) {\n          const tr = trList[r];\n          for (let d = 0; d < tr.tdList.length; d++) {\n            const td = tr.tdList[d];\n            const range = this.getContextByGroupId(td.value, groupId);\n            if (range) {\n              return {\n                ...range,\n                isTable: true,\n                index: e,\n                trIndex: r,\n                tdIndex: d,\n                tdId: td.id,\n                trId: tr.id,\n                tableId: element.tableId\n              };\n            }\n          }\n        }\n      }\n      const nextElement = elementList[e + 1];\n      if (((_a = element.groupIds) == null ? void 0 : _a.includes(groupId)) && !((_b = nextElement == null ? void 0 : nextElement.groupIds) == null ? void 0 : _b.includes(groupId))) {\n        return {\n          isTable: false,\n          startIndex: e,\n          endIndex: e\n        };\n      }\n    }\n    return null;\n  }\n  clearFillInfo() {\n    this.fillRectMap.clear();\n  }\n  recordFillInfo(element, x, y, width, height) {\n    const groupIds = element.groupIds;\n    if (!groupIds)\n      return;\n    for (const groupId of groupIds) {\n      const fillRect = this.fillRectMap.get(groupId);\n      if (!fillRect) {\n        this.fillRectMap.set(groupId, {\n          x,\n          y,\n          width,\n          height\n        });\n      } else {\n        fillRect.width += width;\n      }\n    }\n  }\n  render(ctx) {\n    var _a;\n    if (!this.fillRectMap.size)\n      return;\n    const range = this.range.getRange();\n    const elementList = this.draw.getElementList();\n    const anchorGroupIds = (_a = elementList[range.endIndex]) == null ? void 0 : _a.groupIds;\n    const { group: { backgroundColor, opacity, activeOpacity, activeBackgroundColor } } = this.options;\n    ctx.save();\n    this.fillRectMap.forEach((fillRect, groupId) => {\n      const { x, y, width, height } = fillRect;\n      if (anchorGroupIds == null ? void 0 : anchorGroupIds.includes(groupId)) {\n        ctx.globalAlpha = activeOpacity;\n        ctx.fillStyle = activeBackgroundColor;\n      } else {\n        ctx.globalAlpha = opacity;\n        ctx.fillStyle = backgroundColor;\n      }\n      ctx.fillRect(x, y, width, height);\n    });\n    ctx.restore();\n    this.clearFillInfo();\n  }\n}\nclass MouseObserver {\n  constructor(draw) {\n    this.draw = draw;\n    this.eventBus = this.draw.getEventBus();\n    this.pageContainer = this.draw.getPageContainer();\n    this.pageContainer.addEventListener(\"mousemove\", this._mousemove.bind(this));\n    this.pageContainer.addEventListener(\"mouseenter\", this._mouseenter.bind(this));\n    this.pageContainer.addEventListener(\"mouseleave\", this._mouseleave.bind(this));\n  }\n  _mousemove(evt) {\n    if (!this.eventBus.isSubscribe(\"mousemove\"))\n      return;\n    this.eventBus.emit(\"mousemove\", evt);\n  }\n  _mouseenter(evt) {\n    if (!this.eventBus.isSubscribe(\"mouseenter\"))\n      return;\n    this.eventBus.emit(\"mouseenter\", evt);\n  }\n  _mouseleave(evt) {\n    if (!this.eventBus.isSubscribe(\"mouseleave\"))\n      return;\n    this.eventBus.emit(\"mouseleave\", evt);\n  }\n}\nclass LineNumber {\n  constructor(draw) {\n    this.draw = draw;\n    this.options = draw.getOptions();\n  }\n  render(ctx, pageNo) {\n    const { scale, lineNumber: { color, size, font, right: right2, type } } = this.options;\n    const textParticle = this.draw.getTextParticle();\n    const margins = this.draw.getMargins();\n    const positionList = this.draw.getPosition().getOriginalMainPositionList();\n    const pageRowList = this.draw.getPageRowList();\n    const rowList = pageRowList[pageNo];\n    ctx.save();\n    ctx.fillStyle = color;\n    ctx.font = `${size * scale}px ${font}`;\n    for (let i = 0; i < rowList.length; i++) {\n      const row = rowList[i];\n      const { coordinate: { leftBottom } } = positionList[row.startIndex];\n      const seq = type === LineNumberType.PAGE ? i + 1 : row.rowIndex + 1;\n      const textMetrics = textParticle.measureText(ctx, {\n        value: `${seq}`\n      });\n      const x = margins[3] - (textMetrics.width + right2) * scale;\n      const y = leftBottom[1] - textMetrics.actualBoundingBoxAscent * scale;\n      ctx.fillText(`${seq}`, x, y);\n    }\n    ctx.restore();\n  }\n}\nclass PageBorder {\n  constructor(draw) {\n    this.draw = draw;\n    this.header = draw.getHeader();\n    this.footer = draw.getFooter();\n    this.options = draw.getOptions();\n  }\n  render(ctx) {\n    const { scale, pageBorder: { color, lineWidth, padding } } = this.options;\n    ctx.save();\n    ctx.translate(0.5, 0.5);\n    ctx.strokeStyle = color;\n    ctx.lineWidth = lineWidth * scale;\n    const margins = this.draw.getMargins();\n    const x = margins[3] - padding[3] * scale;\n    const y = margins[0] + this.header.getExtraHeight() - padding[0] * scale;\n    const width = this.draw.getInnerWidth() + (padding[1] + padding[3]) * scale;\n    const height = this.draw.getHeight() - y - this.footer.getExtraHeight() - margins[2] + padding[2] * scale;\n    ctx.rect(x, y, width, height);\n    ctx.stroke();\n    ctx.restore();\n  }\n}\nfunction positionContextChange(draw, payload) {\n  const { value, oldValue } = payload;\n  if (oldValue.isTable && !value.isTable) {\n    draw.getTableTool().dispose();\n  }\n}\nclass Actuator {\n  constructor(draw) {\n    this.draw = draw;\n    this.eventBus = draw.getEventBus();\n    this.execute();\n  }\n  execute() {\n    this.eventBus.on(\"positionContextChange\", (payload) => {\n      positionContextChange(this.draw, payload);\n    });\n  }\n}\nclass TableOperate {\n  constructor(draw) {\n    this.draw = draw;\n    this.range = draw.getRange();\n    this.position = draw.getPosition();\n    this.tableTool = draw.getTableTool();\n    this.tableParticle = draw.getTableParticle();\n    this.options = draw.getOptions();\n  }\n  insertTable(row, col) {\n    var _a;\n    const { startIndex, endIndex } = this.range.getRange();\n    if (!~startIndex && !~endIndex)\n      return;\n    const { defaultTrMinHeight } = this.options.table;\n    const elementList = this.draw.getElementList();\n    let offsetX = 0;\n    if ((_a = elementList[startIndex]) == null ? void 0 : _a.listId) {\n      const positionList = this.position.getPositionList();\n      const { rowIndex } = positionList[startIndex];\n      const rowList = this.draw.getRowList();\n      const row2 = rowList[rowIndex];\n      offsetX = (row2 == null ? void 0 : row2.offsetX) || 0;\n    }\n    const innerWidth = this.draw.getContextInnerWidth() - offsetX;\n    const colgroup = [];\n    const colWidth = innerWidth / col;\n    for (let c = 0; c < col; c++) {\n      colgroup.push({\n        width: colWidth\n      });\n    }\n    const trList = [];\n    for (let r = 0; r < row; r++) {\n      const tdList = [];\n      const tr = {\n        height: defaultTrMinHeight,\n        tdList\n      };\n      for (let c = 0; c < col; c++) {\n        tdList.push({\n          colspan: 1,\n          rowspan: 1,\n          value: []\n        });\n      }\n      trList.push(tr);\n    }\n    const element = {\n      type: ElementType.TABLE,\n      value: \"\",\n      colgroup,\n      trList\n    };\n    formatElementList([element], {\n      editorOptions: this.options\n    });\n    formatElementContext(elementList, [element], startIndex, {\n      editorOptions: this.options\n    });\n    const curIndex = startIndex + 1;\n    this.draw.spliceElementList(elementList, curIndex, startIndex === endIndex ? 0 : endIndex - startIndex, element);\n    this.range.setRange(curIndex, curIndex);\n    this.draw.render({ curIndex, isSetCursor: false });\n  }\n  insertTableTopRow() {\n    const positionContext = this.position.getPositionContext();\n    if (!positionContext.isTable)\n      return;\n    const { index: index2, trIndex, tableId } = positionContext;\n    const originalElementList = this.draw.getOriginalElementList();\n    const element = originalElementList[index2];\n    const curTrList = element.trList;\n    const curTr = curTrList[trIndex];\n    if (curTr.tdList.length < element.colgroup.length) {\n      const curTrNo = curTr.tdList[0].rowIndex;\n      for (let t = 0; t < trIndex; t++) {\n        const tr = curTrList[t];\n        for (let d = 0; d < tr.tdList.length; d++) {\n          const td = tr.tdList[d];\n          if (td.rowspan > 1 && td.rowIndex + td.rowspan >= curTrNo + 1) {\n            td.rowspan += 1;\n          }\n        }\n      }\n    }\n    const newTrId = getUUID();\n    const newTr = {\n      height: curTr.height,\n      id: newTrId,\n      tdList: []\n    };\n    for (let t = 0; t < curTr.tdList.length; t++) {\n      const curTd = curTr.tdList[t];\n      const newTdId = getUUID();\n      newTr.tdList.push({\n        id: newTdId,\n        rowspan: 1,\n        colspan: curTd.colspan,\n        value: [\n          {\n            value: ZERO,\n            size: 16,\n            tableId,\n            trId: newTrId,\n            tdId: newTdId\n          }\n        ]\n      });\n    }\n    curTrList.splice(trIndex, 0, newTr);\n    this.position.setPositionContext({\n      isTable: true,\n      index: index2,\n      trIndex,\n      tdIndex: 0,\n      tdId: newTr.tdList[0].id,\n      trId: newTr.id,\n      tableId\n    });\n    this.range.setRange(0, 0);\n    this.draw.render({ curIndex: 0 });\n    this.tableTool.render();\n  }\n  insertTableBottomRow() {\n    const positionContext = this.position.getPositionContext();\n    if (!positionContext.isTable)\n      return;\n    const { index: index2, trIndex, tableId } = positionContext;\n    const originalElementList = this.draw.getOriginalElementList();\n    const element = originalElementList[index2];\n    const curTrList = element.trList;\n    const curTr = curTrList[trIndex];\n    const anchorTr = curTrList.length - 1 === trIndex ? curTr : curTrList[trIndex + 1];\n    if (anchorTr.tdList.length < element.colgroup.length) {\n      const curTrNo = anchorTr.tdList[0].rowIndex;\n      for (let t = 0; t < trIndex + 1; t++) {\n        const tr = curTrList[t];\n        for (let d = 0; d < tr.tdList.length; d++) {\n          const td = tr.tdList[d];\n          if (td.rowspan > 1 && td.rowIndex + td.rowspan >= curTrNo + 1) {\n            td.rowspan += 1;\n          }\n        }\n      }\n    }\n    const newTrId = getUUID();\n    const newTr = {\n      height: anchorTr.height,\n      id: newTrId,\n      tdList: []\n    };\n    for (let t = 0; t < anchorTr.tdList.length; t++) {\n      const curTd = anchorTr.tdList[t];\n      const newTdId = getUUID();\n      newTr.tdList.push({\n        id: newTdId,\n        rowspan: 1,\n        colspan: curTd.colspan,\n        value: [\n          {\n            value: ZERO,\n            size: 16,\n            tableId,\n            trId: newTrId,\n            tdId: newTdId\n          }\n        ]\n      });\n    }\n    curTrList.splice(trIndex + 1, 0, newTr);\n    this.position.setPositionContext({\n      isTable: true,\n      index: index2,\n      trIndex: trIndex + 1,\n      tdIndex: 0,\n      tdId: newTr.tdList[0].id,\n      trId: newTr.id,\n      tableId: element.id\n    });\n    this.range.setRange(0, 0);\n    this.draw.render({ curIndex: 0 });\n  }\n  insertTableLeftCol() {\n    const positionContext = this.position.getPositionContext();\n    if (!positionContext.isTable)\n      return;\n    const { index: index2, tdIndex, tableId } = positionContext;\n    const originalElementList = this.draw.getOriginalElementList();\n    const element = originalElementList[index2];\n    const curTrList = element.trList;\n    const curTdIndex = tdIndex;\n    for (let t = 0; t < curTrList.length; t++) {\n      const tr = curTrList[t];\n      const tdId = getUUID();\n      tr.tdList.splice(curTdIndex, 0, {\n        id: tdId,\n        rowspan: 1,\n        colspan: 1,\n        value: [\n          {\n            value: ZERO,\n            size: 16,\n            tableId,\n            trId: tr.id,\n            tdId\n          }\n        ]\n      });\n    }\n    const colgroup = element.colgroup;\n    colgroup.splice(curTdIndex, 0, {\n      width: this.options.table.defaultColMinWidth\n    });\n    const colgroupWidth = colgroup.reduce((pre, cur) => pre + cur.width, 0);\n    const width = this.draw.getOriginalInnerWidth();\n    if (colgroupWidth > width) {\n      const adjustWidth = (colgroupWidth - width) / colgroup.length;\n      for (let g = 0; g < colgroup.length; g++) {\n        const group2 = colgroup[g];\n        group2.width -= adjustWidth;\n      }\n    }\n    this.position.setPositionContext({\n      isTable: true,\n      index: index2,\n      trIndex: 0,\n      tdIndex: curTdIndex,\n      tdId: curTrList[0].tdList[curTdIndex].id,\n      trId: curTrList[0].id,\n      tableId\n    });\n    this.range.setRange(0, 0);\n    this.draw.render({ curIndex: 0 });\n    this.tableTool.render();\n  }\n  insertTableRightCol() {\n    const positionContext = this.position.getPositionContext();\n    if (!positionContext.isTable)\n      return;\n    const { index: index2, tdIndex, tableId } = positionContext;\n    const originalElementList = this.draw.getOriginalElementList();\n    const element = originalElementList[index2];\n    const curTrList = element.trList;\n    const curTdIndex = tdIndex + 1;\n    for (let t = 0; t < curTrList.length; t++) {\n      const tr = curTrList[t];\n      const tdId = getUUID();\n      tr.tdList.splice(curTdIndex, 0, {\n        id: tdId,\n        rowspan: 1,\n        colspan: 1,\n        value: [\n          {\n            value: ZERO,\n            size: 16,\n            tableId,\n            trId: tr.id,\n            tdId\n          }\n        ]\n      });\n    }\n    const colgroup = element.colgroup;\n    colgroup.splice(curTdIndex, 0, {\n      width: this.options.table.defaultColMinWidth\n    });\n    const colgroupWidth = colgroup.reduce((pre, cur) => pre + cur.width, 0);\n    const width = this.draw.getOriginalInnerWidth();\n    if (colgroupWidth > width) {\n      const adjustWidth = (colgroupWidth - width) / colgroup.length;\n      for (let g = 0; g < colgroup.length; g++) {\n        const group2 = colgroup[g];\n        group2.width -= adjustWidth;\n      }\n    }\n    this.position.setPositionContext({\n      isTable: true,\n      index: index2,\n      trIndex: 0,\n      tdIndex: curTdIndex,\n      tdId: curTrList[0].tdList[curTdIndex].id,\n      trId: curTrList[0].id,\n      tableId: element.id\n    });\n    this.range.setRange(0, 0);\n    this.draw.render({ curIndex: 0 });\n  }\n  deleteTableRow() {\n    const positionContext = this.position.getPositionContext();\n    if (!positionContext.isTable)\n      return;\n    const { index: index2, trIndex, tdIndex } = positionContext;\n    const originalElementList = this.draw.getOriginalElementList();\n    const element = originalElementList[index2];\n    const trList = element.trList;\n    const curTr = trList[trIndex];\n    const curTdRowIndex = curTr.tdList[tdIndex].rowIndex;\n    if (trList.length <= 1) {\n      this.deleteTable();\n      return;\n    }\n    for (let r = 0; r < curTdRowIndex; r++) {\n      const tr = trList[r];\n      const tdList = tr.tdList;\n      for (let d = 0; d < tdList.length; d++) {\n        const td = tdList[d];\n        if (td.rowIndex + td.rowspan > curTdRowIndex) {\n          td.rowspan--;\n        }\n      }\n    }\n    for (let d = 0; d < curTr.tdList.length; d++) {\n      const td = curTr.tdList[d];\n      if (td.rowspan > 1) {\n        const tdId = getUUID();\n        const nextTr = trList[trIndex + 1];\n        nextTr.tdList.splice(d, 0, {\n          id: tdId,\n          rowspan: td.rowspan - 1,\n          colspan: td.colspan,\n          value: [\n            {\n              value: ZERO,\n              size: 16,\n              tableId: element.id,\n              trId: nextTr.id,\n              tdId\n            }\n          ]\n        });\n      }\n    }\n    trList.splice(trIndex, 1);\n    this.position.setPositionContext({\n      isTable: false\n    });\n    this.range.clearRange();\n    this.draw.render({\n      curIndex: positionContext.index\n    });\n    this.tableTool.dispose();\n  }\n  deleteTableCol() {\n    var _a;\n    const positionContext = this.position.getPositionContext();\n    if (!positionContext.isTable)\n      return;\n    const { index: index2, tdIndex, trIndex } = positionContext;\n    const originalElementList = this.draw.getOriginalElementList();\n    const element = originalElementList[index2];\n    const curTrList = element.trList;\n    const curTd = curTrList[trIndex].tdList[tdIndex];\n    const curColIndex = curTd.colIndex;\n    const moreTdTr = curTrList.find((tr) => tr.tdList.length > 1);\n    if (!moreTdTr) {\n      this.deleteTable();\n      return;\n    }\n    for (let t = 0; t < curTrList.length; t++) {\n      const tr = curTrList[t];\n      for (let d = 0; d < tr.tdList.length; d++) {\n        const td = tr.tdList[d];\n        if (td.colIndex <= curColIndex && td.colIndex + td.colspan > curColIndex) {\n          if (td.colspan > 1) {\n            td.colspan--;\n          } else {\n            tr.tdList.splice(d, 1);\n          }\n        }\n      }\n    }\n    (_a = element.colgroup) == null ? void 0 : _a.splice(curColIndex, 1);\n    this.position.setPositionContext({\n      isTable: false\n    });\n    this.range.setRange(0, 0);\n    this.draw.render({\n      curIndex: positionContext.index\n    });\n    this.tableTool.dispose();\n  }\n  deleteTable() {\n    const positionContext = this.position.getPositionContext();\n    if (!positionContext.isTable)\n      return;\n    const originalElementList = this.draw.getOriginalElementList();\n    originalElementList.splice(positionContext.index, 1);\n    const curIndex = positionContext.index - 1;\n    this.position.setPositionContext({\n      isTable: false,\n      index: curIndex\n    });\n    this.range.setRange(curIndex, curIndex);\n    this.draw.render({ curIndex });\n    this.tableTool.dispose();\n  }\n  mergeTableCell() {\n    const positionContext = this.position.getPositionContext();\n    if (!positionContext.isTable)\n      return;\n    const { isCrossRowCol, startTdIndex, endTdIndex, startTrIndex, endTrIndex } = this.range.getRange();\n    if (!isCrossRowCol)\n      return;\n    const { index: index2 } = positionContext;\n    const originalElementList = this.draw.getOriginalElementList();\n    const element = originalElementList[index2];\n    const curTrList = element.trList;\n    let startTd = curTrList[startTrIndex].tdList[startTdIndex];\n    let endTd = curTrList[endTrIndex].tdList[endTdIndex];\n    if (startTd.x > endTd.x || startTd.y > endTd.y) {\n      [startTd, endTd] = [endTd, startTd];\n    }\n    const startColIndex = startTd.colIndex;\n    const endColIndex = endTd.colIndex + (endTd.colspan - 1);\n    const startRowIndex = startTd.rowIndex;\n    const endRowIndex = endTd.rowIndex + (endTd.rowspan - 1);\n    const rowCol = [];\n    for (let t = 0; t < curTrList.length; t++) {\n      const tr = curTrList[t];\n      const tdList = [];\n      for (let d = 0; d < tr.tdList.length; d++) {\n        const td = tr.tdList[d];\n        const tdColIndex = td.colIndex;\n        const tdRowIndex = td.rowIndex;\n        if (tdColIndex >= startColIndex && tdColIndex <= endColIndex && tdRowIndex >= startRowIndex && tdRowIndex <= endRowIndex) {\n          tdList.push(td);\n        }\n      }\n      if (tdList.length) {\n        rowCol.push(tdList);\n      }\n    }\n    if (!rowCol.length)\n      return;\n    const lastRow = rowCol[rowCol.length - 1];\n    const leftTop = rowCol[0][0];\n    const rightBottom = lastRow[lastRow.length - 1];\n    const startX = leftTop.x;\n    const startY = leftTop.y;\n    const endX = rightBottom.x + rightBottom.width;\n    const endY = rightBottom.y + rightBottom.height;\n    for (let t = 0; t < rowCol.length; t++) {\n      const tr = rowCol[t];\n      for (let d = 0; d < tr.length; d++) {\n        const td = tr[d];\n        const tdStartX = td.x;\n        const tdStartY = td.y;\n        const tdEndX = tdStartX + td.width;\n        const tdEndY = tdStartY + td.height;\n        if (startX > tdStartX || startY > tdStartY || endX < tdEndX || endY < tdEndY) {\n          return;\n        }\n      }\n    }\n    const mergeTdIdList = [];\n    const anchorTd = rowCol[0][0];\n    for (let t = 0; t < rowCol.length; t++) {\n      const tr = rowCol[t];\n      for (let d = 0; d < tr.length; d++) {\n        const td = tr[d];\n        const isAnchorTd = t === 0 && d === 0;\n        if (!isAnchorTd) {\n          mergeTdIdList.push(td.id);\n        }\n        if (t === 0 && d !== 0) {\n          anchorTd.colspan += td.colspan;\n        }\n        if (t !== 0) {\n          if (anchorTd.colIndex === td.colIndex) {\n            anchorTd.rowspan += td.rowspan;\n          }\n        }\n      }\n    }\n    for (let t = 0; t < curTrList.length; t++) {\n      const tr = curTrList[t];\n      let d = 0;\n      while (d < tr.tdList.length) {\n        const td = tr.tdList[d];\n        if (mergeTdIdList.includes(td.id)) {\n          tr.tdList.splice(d, 1);\n          d--;\n        }\n        d++;\n      }\n    }\n    this.position.setPositionContext({\n      ...positionContext,\n      trIndex: anchorTd.trIndex,\n      tdIndex: anchorTd.tdIndex\n    });\n    const curIndex = anchorTd.value.length - 1;\n    this.range.setRange(curIndex, curIndex);\n    this.draw.render();\n    this.tableTool.render();\n  }\n  cancelMergeTableCell() {\n    const positionContext = this.position.getPositionContext();\n    if (!positionContext.isTable)\n      return;\n    const { index: index2, tdIndex, trIndex } = positionContext;\n    const originalElementList = this.draw.getOriginalElementList();\n    const element = originalElementList[index2];\n    const curTrList = element.trList;\n    const curTr = curTrList[trIndex];\n    const curTd = curTr.tdList[tdIndex];\n    if (curTd.rowspan === 1 && curTd.colspan === 1)\n      return;\n    const colspan = curTd.colspan;\n    if (curTd.colspan > 1) {\n      for (let c = 1; c < curTd.colspan; c++) {\n        const tdId = getUUID();\n        curTr.tdList.splice(tdIndex + c, 0, {\n          id: tdId,\n          rowspan: 1,\n          colspan: 1,\n          value: [\n            {\n              value: ZERO,\n              size: 16,\n              tableId: element.id,\n              trId: curTr.id,\n              tdId\n            }\n          ]\n        });\n      }\n      curTd.colspan = 1;\n    }\n    if (curTd.rowspan > 1) {\n      for (let r = 1; r < curTd.rowspan; r++) {\n        const tr = curTrList[trIndex + r];\n        for (let c = 0; c < colspan; c++) {\n          const tdId = getUUID();\n          tr.tdList.splice(curTd.colIndex, 0, {\n            id: tdId,\n            rowspan: 1,\n            colspan: 1,\n            value: [\n              {\n                value: ZERO,\n                size: 16,\n                tableId: element.id,\n                trId: tr.id,\n                tdId\n              }\n            ]\n          });\n        }\n      }\n      curTd.rowspan = 1;\n    }\n    const curIndex = curTd.value.length - 1;\n    this.range.setRange(curIndex, curIndex);\n    this.draw.render();\n    this.tableTool.render();\n  }\n  tableTdVerticalAlign(payload) {\n    const rowCol = this.tableParticle.getRangeRowCol();\n    if (!rowCol)\n      return;\n    for (let r = 0; r < rowCol.length; r++) {\n      const row = rowCol[r];\n      for (let c = 0; c < row.length; c++) {\n        const td = row[c];\n        if (!td || td.verticalAlign === payload || !td.verticalAlign && payload === VerticalAlign.TOP) {\n          continue;\n        }\n        td.verticalAlign = payload;\n      }\n    }\n    const { endIndex } = this.range.getRange();\n    this.draw.render({\n      curIndex: endIndex\n    });\n  }\n  tableBorderType(payload) {\n    const positionContext = this.position.getPositionContext();\n    if (!positionContext.isTable)\n      return;\n    const { index: index2 } = positionContext;\n    const originalElementList = this.draw.getOriginalElementList();\n    const element = originalElementList[index2];\n    if (!element.borderType && payload === TableBorder.ALL || element.borderType === payload) {\n      return;\n    }\n    element.borderType = payload;\n    const { endIndex } = this.range.getRange();\n    this.draw.render({\n      curIndex: endIndex\n    });\n  }\n  tableTdBorderType(payload) {\n    const rowCol = this.tableParticle.getRangeRowCol();\n    if (!rowCol)\n      return;\n    const tdList = rowCol.flat();\n    const isSetBorderType = tdList.some((td) => {\n      var _a;\n      return !((_a = td.borderTypes) == null ? void 0 : _a.includes(payload));\n    });\n    tdList.forEach((td) => {\n      if (!td.borderTypes) {\n        td.borderTypes = [];\n      }\n      const borderTypeIndex = td.borderTypes.findIndex((type) => type === payload);\n      if (isSetBorderType) {\n        if (!~borderTypeIndex) {\n          td.borderTypes.push(payload);\n        }\n      } else {\n        if (~borderTypeIndex) {\n          td.borderTypes.splice(borderTypeIndex, 1);\n        }\n      }\n      if (!td.borderTypes.length) {\n        delete td.borderTypes;\n      }\n    });\n    const { endIndex } = this.range.getRange();\n    this.draw.render({\n      curIndex: endIndex\n    });\n  }\n  tableTdSlashType(payload) {\n    const rowCol = this.tableParticle.getRangeRowCol();\n    if (!rowCol)\n      return;\n    const tdList = rowCol.flat();\n    const isSetTdSlashType = tdList.some((td) => {\n      var _a;\n      return !((_a = td.slashTypes) == null ? void 0 : _a.includes(payload));\n    });\n    tdList.forEach((td) => {\n      if (!td.slashTypes) {\n        td.slashTypes = [];\n      }\n      const slashTypeIndex = td.slashTypes.findIndex((type) => type === payload);\n      if (isSetTdSlashType) {\n        if (!~slashTypeIndex) {\n          td.slashTypes.push(payload);\n        }\n      } else {\n        if (~slashTypeIndex) {\n          td.slashTypes.splice(slashTypeIndex, 1);\n        }\n      }\n      if (!td.slashTypes.length) {\n        delete td.slashTypes;\n      }\n    });\n    const { endIndex } = this.range.getRange();\n    this.draw.render({\n      curIndex: endIndex\n    });\n  }\n  tableTdBackgroundColor(payload) {\n    const rowCol = this.tableParticle.getRangeRowCol();\n    if (!rowCol)\n      return;\n    for (let r = 0; r < rowCol.length; r++) {\n      const row = rowCol[r];\n      for (let c = 0; c < row.length; c++) {\n        const col = row[c];\n        col.backgroundColor = payload;\n      }\n    }\n    this.draw.render({\n      isCompute: false\n    });\n  }\n  tableSelectAll() {\n    const positionContext = this.position.getPositionContext();\n    const { index: index2, tableId, isTable } = positionContext;\n    if (!isTable || !tableId)\n      return;\n    const { startIndex, endIndex } = this.range.getRange();\n    const originalElementList = this.draw.getOriginalElementList();\n    const trList = originalElementList[index2].trList;\n    const endTrIndex = trList.length - 1;\n    const endTdIndex = trList[endTrIndex].tdList.length - 1;\n    this.range.replaceRange({\n      startIndex,\n      endIndex,\n      tableId,\n      startTdIndex: 0,\n      endTdIndex,\n      startTrIndex: 0,\n      endTrIndex\n    });\n    this.draw.render({\n      isCompute: false,\n      isSubmitHistory: false\n    });\n  }\n}\nclass Draw {\n  constructor(rootContainer, options, data2, listener, eventBus, override) {\n    this.container = this._wrapContainer(rootContainer);\n    this.pageList = [];\n    this.ctxList = [];\n    this.pageNo = 0;\n    this.pagePixelRatio = null;\n    this.mode = options.mode;\n    this.options = options;\n    this.elementList = data2.main;\n    this.listener = listener;\n    this.eventBus = eventBus;\n    this.override = override;\n    this._formatContainer();\n    this.pageContainer = this._createPageContainer();\n    this._createPage(0);\n    this.i18n = new I18n();\n    this.historyManager = new HistoryManager(this);\n    this.position = new Position(this);\n    this.zone = new Zone(this);\n    this.range = new RangeManager(this);\n    this.margin = new Margin(this);\n    this.background = new Background(this);\n    this.search = new Search(this);\n    this.group = new Group(this);\n    this.underline = new Underline(this);\n    this.strikeout = new Strikeout(this);\n    this.highlight = new Highlight(this);\n    this.previewer = new Previewer(this);\n    this.imageParticle = new ImageParticle(this);\n    this.laTexParticle = new LaTexParticle(this);\n    this.textParticle = new TextParticle(this);\n    this.tableParticle = new TableParticle(this);\n    this.tableTool = new TableTool(this);\n    this.tableOperate = new TableOperate(this);\n    this.pageNumber = new PageNumber(this);\n    this.lineNumber = new LineNumber(this);\n    this.waterMark = new Watermark(this);\n    this.placeholder = new Placeholder(this);\n    this.header = new Header(this, data2.header);\n    this.footer = new Footer(this, data2.footer);\n    this.hyperlinkParticle = new HyperlinkParticle(this);\n    this.dateParticle = new DateParticle(this);\n    this.separatorParticle = new SeparatorParticle(this);\n    this.pageBreakParticle = new PageBreakParticle(this);\n    this.superscriptParticle = new SuperscriptParticle();\n    this.subscriptParticle = new SubscriptParticle();\n    this.checkboxParticle = new CheckboxParticle(this);\n    this.radioParticle = new RadioParticle(this);\n    this.blockParticle = new BlockParticle(this);\n    this.listParticle = new ListParticle(this);\n    this.lineBreakParticle = new LineBreakParticle(this);\n    this.control = new Control(this);\n    this.pageBorder = new PageBorder(this);\n    this.scrollObserver = new ScrollObserver(this);\n    this.selectionObserver = new SelectionObserver(this);\n    this.imageObserver = new ImageObserver();\n    new MouseObserver(this);\n    this.canvasEvent = new CanvasEvent(this);\n    this.cursor = new Cursor(this, this.canvasEvent);\n    this.canvasEvent.register();\n    this.globalEvent = new GlobalEvent(this, this.canvasEvent);\n    this.globalEvent.register();\n    this.workerManager = new WorkerManager(this);\n    new Actuator(this);\n    const { letterClass } = options;\n    this.LETTER_REG = new RegExp(`[${letterClass.join(\"\")}]`);\n    this.WORD_LIKE_REG = new RegExp(`${letterClass.map((letter) => `[^${letter}][${letter}]`).join(\"|\")}`);\n    this.rowList = [];\n    this.pageRowList = [];\n    this.painterStyle = null;\n    this.painterOptions = null;\n    this.visiblePageNoList = [];\n    this.intersectionPageNo = 0;\n    this.lazyRenderIntersectionObserver = null;\n    this.printModeData = null;\n    this.render({\n      isInit: true,\n      isSetCursor: false,\n      isFirstRender: true\n    });\n  }\n  getLetterReg() {\n    return this.LETTER_REG;\n  }\n  getMode() {\n    return this.mode;\n  }\n  setMode(payload) {\n    if (this.mode === payload)\n      return;\n    if (payload === EditorMode.PRINT) {\n      this.printModeData = {\n        header: this.header.getElementList(),\n        main: this.elementList,\n        footer: this.footer.getElementList()\n      };\n      const clonePrintModeData = deepClone(this.printModeData);\n      const editorDataKeys = [\"header\", \"main\", \"footer\"];\n      editorDataKeys.forEach((key) => {\n        clonePrintModeData[key] = this.control.filterAssistElement(clonePrintModeData[key]);\n      });\n      this.setEditorData(clonePrintModeData);\n    }\n    if (this.mode === EditorMode.PRINT && this.printModeData) {\n      this.setEditorData(this.printModeData);\n      this.printModeData = null;\n    }\n    this.clearSideEffect();\n    this.range.clearRange();\n    this.mode = payload;\n    this.options.mode = payload;\n    this.render({\n      isSetCursor: false,\n      isSubmitHistory: false\n    });\n  }\n  isReadonly() {\n    switch (this.mode) {\n      case EditorMode.DESIGN:\n        return false;\n      case EditorMode.READONLY:\n      case EditorMode.PRINT:\n        return true;\n      case EditorMode.FORM:\n        return !this.control.getIsRangeWithinControl();\n      default:\n        return false;\n    }\n  }\n  isDisabled() {\n    var _a, _b, _c, _d, _e;\n    if (this.mode === EditorMode.DESIGN)\n      return false;\n    const { startIndex, endIndex } = this.range.getRange();\n    const elementList = this.getElementList();\n    if ((_a = this.getTd()) == null ? void 0 : _a.disabled)\n      return true;\n    if (startIndex === endIndex) {\n      const startElement = elementList[startIndex];\n      const nextElement = elementList[startIndex + 1];\n      return !!(((_b = startElement == null ? void 0 : startElement.title) == null ? void 0 : _b.disabled) && ((_c = nextElement == null ? void 0 : nextElement.title) == null ? void 0 : _c.disabled) || ((_d = startElement == null ? void 0 : startElement.control) == null ? void 0 : _d.disabled) && ((_e = nextElement == null ? void 0 : nextElement.control) == null ? void 0 : _e.disabled));\n    }\n    const selectionElementList = elementList.slice(startIndex + 1, endIndex + 1);\n    return selectionElementList.some((element) => {\n      var _a2, _b2;\n      return ((_a2 = element.title) == null ? void 0 : _a2.disabled) || ((_b2 = element.control) == null ? void 0 : _b2.disabled);\n    });\n  }\n  isDesignMode() {\n    return this.mode === EditorMode.DESIGN;\n  }\n  getOriginalWidth() {\n    const { paperDirection, width, height } = this.options;\n    return paperDirection === PaperDirection.VERTICAL ? width : height;\n  }\n  getOriginalHeight() {\n    const { paperDirection, width, height } = this.options;\n    return paperDirection === PaperDirection.VERTICAL ? height : width;\n  }\n  getWidth() {\n    return Math.floor(this.getOriginalWidth() * this.options.scale);\n  }\n  getHeight() {\n    return Math.floor(this.getOriginalHeight() * this.options.scale);\n  }\n  getMainHeight() {\n    const pageHeight = this.getHeight();\n    return pageHeight - this.getMainOuterHeight();\n  }\n  getMainOuterHeight() {\n    const margins = this.getMargins();\n    const headerExtraHeight = this.header.getExtraHeight();\n    const footerExtraHeight = this.footer.getExtraHeight();\n    return margins[0] + margins[2] + headerExtraHeight + footerExtraHeight;\n  }\n  getCanvasWidth(pageNo = -1) {\n    const page = this.getPage(pageNo);\n    return page.width;\n  }\n  getCanvasHeight(pageNo = -1) {\n    const page = this.getPage(pageNo);\n    return page.height;\n  }\n  getInnerWidth() {\n    const width = this.getWidth();\n    const margins = this.getMargins();\n    return width - margins[1] - margins[3];\n  }\n  getOriginalInnerWidth() {\n    const width = this.getOriginalWidth();\n    const margins = this.getOriginalMargins();\n    return width - margins[1] - margins[3];\n  }\n  getContextInnerWidth() {\n    const positionContext = this.position.getPositionContext();\n    if (positionContext.isTable) {\n      const { index: index2, trIndex, tdIndex } = positionContext;\n      const elementList = this.getOriginalElementList();\n      const td = elementList[index2].trList[trIndex].tdList[tdIndex];\n      const tdPadding = this.getTdPadding();\n      return td.width - tdPadding[1] - tdPadding[3];\n    }\n    return this.getOriginalInnerWidth();\n  }\n  getMargins() {\n    return this.getOriginalMargins().map((m) => m * this.options.scale);\n  }\n  getOriginalMargins() {\n    const { margins, paperDirection } = this.options;\n    return paperDirection === PaperDirection.VERTICAL ? margins : [margins[1], margins[2], margins[3], margins[0]];\n  }\n  getPageGap() {\n    return this.options.pageGap * this.options.scale;\n  }\n  getOriginalPageGap() {\n    return this.options.pageGap;\n  }\n  getPageNumberBottom() {\n    const { pageNumber: { bottom }, scale } = this.options;\n    return bottom * scale;\n  }\n  getMarginIndicatorSize() {\n    return this.options.marginIndicatorSize * this.options.scale;\n  }\n  getDefaultBasicRowMarginHeight() {\n    return this.options.defaultBasicRowMarginHeight * this.options.scale;\n  }\n  getTdPadding() {\n    const { table: { tdPadding }, scale } = this.options;\n    return tdPadding.map((m) => m * scale);\n  }\n  getContainer() {\n    return this.container;\n  }\n  getPageContainer() {\n    return this.pageContainer;\n  }\n  getVisiblePageNoList() {\n    return this.visiblePageNoList;\n  }\n  setVisiblePageNoList(payload) {\n    this.visiblePageNoList = payload;\n    if (this.listener.visiblePageNoListChange) {\n      this.listener.visiblePageNoListChange(this.visiblePageNoList);\n    }\n    if (this.eventBus.isSubscribe(\"visiblePageNoListChange\")) {\n      this.eventBus.emit(\"visiblePageNoListChange\", this.visiblePageNoList);\n    }\n  }\n  getIntersectionPageNo() {\n    return this.intersectionPageNo;\n  }\n  setIntersectionPageNo(payload) {\n    this.intersectionPageNo = payload;\n    if (this.listener.intersectionPageNoChange) {\n      this.listener.intersectionPageNoChange(this.intersectionPageNo);\n    }\n    if (this.eventBus.isSubscribe(\"intersectionPageNoChange\")) {\n      this.eventBus.emit(\"intersectionPageNoChange\", this.intersectionPageNo);\n    }\n  }\n  getPageNo() {\n    return this.pageNo;\n  }\n  setPageNo(payload) {\n    this.pageNo = payload;\n  }\n  getPage(pageNo = -1) {\n    return this.pageList[~pageNo ? pageNo : this.pageNo];\n  }\n  getPageList() {\n    return this.pageList;\n  }\n  getPageCount() {\n    return this.pageList.length;\n  }\n  getTableRowList(sourceElementList) {\n    const positionContext = this.position.getPositionContext();\n    const { index: index2, trIndex, tdIndex } = positionContext;\n    return sourceElementList[index2].trList[trIndex].tdList[tdIndex].rowList;\n  }\n  getOriginalRowList() {\n    const zoneManager = this.getZone();\n    if (zoneManager.isHeaderActive()) {\n      return this.header.getRowList();\n    }\n    if (zoneManager.isFooterActive()) {\n      return this.footer.getRowList();\n    }\n    return this.rowList;\n  }\n  getRowList() {\n    const positionContext = this.position.getPositionContext();\n    return positionContext.isTable ? this.getTableRowList(this.getOriginalElementList()) : this.getOriginalRowList();\n  }\n  getPageRowList() {\n    return this.pageRowList;\n  }\n  getCtx() {\n    return this.ctxList[this.pageNo];\n  }\n  getOptions() {\n    return this.options;\n  }\n  getSearch() {\n    return this.search;\n  }\n  getGroup() {\n    return this.group;\n  }\n  getHistoryManager() {\n    return this.historyManager;\n  }\n  getPosition() {\n    return this.position;\n  }\n  getZone() {\n    return this.zone;\n  }\n  getRange() {\n    return this.range;\n  }\n  getLineBreakParticle() {\n    return this.lineBreakParticle;\n  }\n  getTextParticle() {\n    return this.textParticle;\n  }\n  getHeaderElementList() {\n    return this.header.getElementList();\n  }\n  getTableElementList(sourceElementList) {\n    var _a;\n    const positionContext = this.position.getPositionContext();\n    const { index: index2, trIndex, tdIndex } = positionContext;\n    return ((_a = sourceElementList[index2].trList) == null ? void 0 : _a[trIndex].tdList[tdIndex].value) || [];\n  }\n  getElementList() {\n    const positionContext = this.position.getPositionContext();\n    const elementList = this.getOriginalElementList();\n    return positionContext.isTable ? this.getTableElementList(elementList) : elementList;\n  }\n  getMainElementList() {\n    const positionContext = this.position.getPositionContext();\n    return positionContext.isTable ? this.getTableElementList(this.elementList) : this.elementList;\n  }\n  getOriginalElementList() {\n    const zoneManager = this.getZone();\n    if (zoneManager.isHeaderActive()) {\n      return this.getHeaderElementList();\n    }\n    if (zoneManager.isFooterActive()) {\n      return this.getFooterElementList();\n    }\n    return this.elementList;\n  }\n  getOriginalMainElementList() {\n    return this.elementList;\n  }\n  getFooterElementList() {\n    return this.footer.getElementList();\n  }\n  getTd() {\n    const positionContext = this.position.getPositionContext();\n    const { index: index2, trIndex, tdIndex, isTable } = positionContext;\n    if (isTable) {\n      const elementList = this.getOriginalElementList();\n      return elementList[index2].trList[trIndex].tdList[tdIndex];\n    }\n    return null;\n  }\n  insertElementList(payload) {\n    if (!payload.length || !this.range.getIsCanInput())\n      return;\n    const { startIndex, endIndex } = this.range.getRange();\n    if (!~startIndex && !~endIndex)\n      return;\n    formatElementList(payload, {\n      isHandleFirstElement: false,\n      editorOptions: this.options\n    });\n    let curIndex = -1;\n    let activeControl = this.control.getActiveControl();\n    if (!activeControl && this.control.getIsRangeWithinControl()) {\n      this.control.initControl();\n      activeControl = this.control.getActiveControl();\n    }\n    if (activeControl && this.control.getIsRangeWithinControl()) {\n      curIndex = activeControl.setValue(payload, void 0, {\n        isIgnoreDisabledRule: true\n      });\n    } else {\n      const elementList = this.getElementList();\n      const isCollapsed = startIndex === endIndex;\n      const start = startIndex + 1;\n      if (!isCollapsed) {\n        this.spliceElementList(elementList, start, endIndex - startIndex);\n      }\n      this.spliceElementList(elementList, start, 0, ...payload);\n      curIndex = startIndex + payload.length;\n      const preElement = elementList[start - 1];\n      if (payload[0].listId && preElement && !preElement.listId && (preElement == null ? void 0 : preElement.value) === ZERO && (!preElement.type || preElement.type === ElementType.TEXT)) {\n        elementList.splice(startIndex, 1);\n        curIndex -= 1;\n      }\n    }\n    if (~curIndex) {\n      this.range.setRange(curIndex, curIndex);\n      this.render({\n        curIndex\n      });\n    }\n  }\n  appendElementList(elementList, options = {}) {\n    if (!elementList.length)\n      return;\n    formatElementList(elementList, {\n      isHandleFirstElement: false,\n      editorOptions: this.options\n    });\n    let curIndex;\n    const { isPrepend } = options;\n    if (isPrepend) {\n      this.elementList.splice(1, 0, ...elementList);\n      curIndex = elementList.length;\n    } else {\n      this.elementList.push(...elementList);\n      curIndex = this.elementList.length - 1;\n    }\n    this.range.setRange(curIndex, curIndex);\n    this.render({\n      curIndex\n    });\n  }\n  spliceElementList(elementList, start, deleteCount, ...items) {\n    var _a, _b, _c, _d;\n    const isDesignMode = this.isDesignMode();\n    if (deleteCount > 0) {\n      const endIndex = start + deleteCount;\n      const endElement = elementList[endIndex];\n      const endElementListId = endElement == null ? void 0 : endElement.listId;\n      if (endElementListId && ((_a = elementList[start - 1]) == null ? void 0 : _a.listId) !== endElementListId) {\n        let startIndex = endIndex;\n        while (startIndex < elementList.length) {\n          const curElement = elementList[startIndex];\n          if (curElement.listId !== endElementListId || curElement.value === ZERO) {\n            break;\n          }\n          delete curElement.listId;\n          delete curElement.listType;\n          delete curElement.listStyle;\n          startIndex++;\n        }\n      }\n      if (!this.control.getActiveControl()) {\n        const tdDeletable = (_b = this.getTd()) == null ? void 0 : _b.deletable;\n        let deleteIndex = endIndex - 1;\n        while (deleteIndex >= start) {\n          const deleteElement = elementList[deleteIndex];\n          if (isDesignMode || tdDeletable !== false && ((_c = deleteElement == null ? void 0 : deleteElement.control) == null ? void 0 : _c.deletable) !== false && ((_d = deleteElement == null ? void 0 : deleteElement.title) == null ? void 0 : _d.deletable) !== false) {\n            elementList.splice(deleteIndex, 1);\n          }\n          deleteIndex--;\n        }\n      } else {\n        elementList.splice(start, deleteCount);\n      }\n    }\n    for (let i = 0; i < items.length; i++) {\n      elementList.splice(start + i, 0, items[i]);\n    }\n  }\n  getCanvasEvent() {\n    return this.canvasEvent;\n  }\n  getGlobalEvent() {\n    return this.globalEvent;\n  }\n  getListener() {\n    return this.listener;\n  }\n  getEventBus() {\n    return this.eventBus;\n  }\n  getOverride() {\n    return this.override;\n  }\n  getCursor() {\n    return this.cursor;\n  }\n  getPreviewer() {\n    return this.previewer;\n  }\n  getImageParticle() {\n    return this.imageParticle;\n  }\n  getTableTool() {\n    return this.tableTool;\n  }\n  getTableOperate() {\n    return this.tableOperate;\n  }\n  getTableParticle() {\n    return this.tableParticle;\n  }\n  getHeader() {\n    return this.header;\n  }\n  getFooter() {\n    return this.footer;\n  }\n  getHyperlinkParticle() {\n    return this.hyperlinkParticle;\n  }\n  getDateParticle() {\n    return this.dateParticle;\n  }\n  getListParticle() {\n    return this.listParticle;\n  }\n  getCheckboxParticle() {\n    return this.checkboxParticle;\n  }\n  getRadioParticle() {\n    return this.radioParticle;\n  }\n  getControl() {\n    return this.control;\n  }\n  getWorkerManager() {\n    return this.workerManager;\n  }\n  getImageObserver() {\n    return this.imageObserver;\n  }\n  getI18n() {\n    return this.i18n;\n  }\n  getRowCount() {\n    return this.getRowList().length;\n  }\n  async getDataURL(payload = {}) {\n    const { pixelRatio, mode } = payload;\n    if (pixelRatio) {\n      this.setPagePixelRatio(pixelRatio);\n    }\n    const currentMode = this.mode;\n    const isSwitchMode = !!mode && currentMode !== mode;\n    if (isSwitchMode) {\n      this.setMode(mode);\n    }\n    this.render({\n      isLazy: false,\n      isCompute: false,\n      isSetCursor: false,\n      isSubmitHistory: false\n    });\n    await this.imageObserver.allSettled();\n    const dataUrlList = this.pageList.map((c) => c.toDataURL());\n    if (pixelRatio) {\n      this.setPagePixelRatio(null);\n    }\n    if (isSwitchMode) {\n      this.setMode(currentMode);\n    }\n    return dataUrlList;\n  }\n  getPainterStyle() {\n    return this.painterStyle && Object.keys(this.painterStyle).length ? this.painterStyle : null;\n  }\n  getPainterOptions() {\n    return this.painterOptions;\n  }\n  setPainterStyle(payload, options) {\n    this.painterStyle = payload;\n    this.painterOptions = options || null;\n    if (this.getPainterStyle()) {\n      this.pageList.forEach((c) => c.style.cursor = \"copy\");\n    }\n  }\n  setDefaultRange() {\n    if (!this.elementList.length)\n      return;\n    setTimeout(() => {\n      const curIndex = this.elementList.length - 1;\n      this.range.setRange(curIndex, curIndex);\n      this.range.setRangeStyle();\n    });\n  }\n  getIsPagingMode() {\n    return this.options.pageMode === PageMode.PAGING;\n  }\n  setPageMode(payload) {\n    if (!payload || this.options.pageMode === payload)\n      return;\n    this.options.pageMode = payload;\n    if (payload === PageMode.PAGING) {\n      const { height } = this.options;\n      const dpr = this.getPagePixelRatio();\n      const canvas = this.pageList[0];\n      canvas.style.height = `${height}px`;\n      canvas.height = height * dpr;\n      this._initPageContext(this.ctxList[0]);\n    } else {\n      this._disconnectLazyRender();\n      this.header.recovery();\n      this.footer.recovery();\n      this.zone.setZone(EditorZone.MAIN);\n    }\n    const { startIndex } = this.range.getRange();\n    const isCollapsed = this.range.getIsCollapsed();\n    this.render({\n      isSetCursor: true,\n      curIndex: startIndex,\n      isSubmitHistory: false\n    });\n    if (!isCollapsed) {\n      this.cursor.drawCursor({\n        isShow: false\n      });\n    }\n    setTimeout(() => {\n      if (this.listener.pageModeChange) {\n        this.listener.pageModeChange(payload);\n      }\n      if (this.eventBus.isSubscribe(\"pageModeChange\")) {\n        this.eventBus.emit(\"pageModeChange\", payload);\n      }\n    });\n  }\n  setPageScale(payload) {\n    const dpr = this.getPagePixelRatio();\n    this.options.scale = payload;\n    const width = this.getWidth();\n    const height = this.getHeight();\n    this.container.style.width = `${width}px`;\n    this.pageList.forEach((p, i) => {\n      p.width = width * dpr;\n      p.height = height * dpr;\n      p.style.width = `${width}px`;\n      p.style.height = `${height}px`;\n      p.style.marginBottom = `${this.getPageGap()}px`;\n      this._initPageContext(this.ctxList[i]);\n    });\n    const cursorPosition = this.position.getCursorPosition();\n    this.render({\n      isSubmitHistory: false,\n      isSetCursor: !!cursorPosition,\n      curIndex: cursorPosition == null ? void 0 : cursorPosition.index\n    });\n    if (this.listener.pageScaleChange) {\n      this.listener.pageScaleChange(payload);\n    }\n    if (this.eventBus.isSubscribe(\"pageScaleChange\")) {\n      this.eventBus.emit(\"pageScaleChange\", payload);\n    }\n  }\n  getPagePixelRatio() {\n    return this.pagePixelRatio || window.devicePixelRatio;\n  }\n  setPagePixelRatio(payload) {\n    if (!this.pagePixelRatio && payload === window.devicePixelRatio || payload === this.pagePixelRatio) {\n      return;\n    }\n    this.pagePixelRatio = payload;\n    this.setPageDevicePixel();\n  }\n  setPageDevicePixel() {\n    const dpr = this.getPagePixelRatio();\n    const width = this.getWidth();\n    const height = this.getHeight();\n    this.pageList.forEach((p, i) => {\n      p.width = width * dpr;\n      p.height = height * dpr;\n      this._initPageContext(this.ctxList[i]);\n    });\n    this.render({\n      isSubmitHistory: false,\n      isSetCursor: false\n    });\n  }\n  setPaperSize(width, height) {\n    this.options.width = width;\n    this.options.height = height;\n    const dpr = this.getPagePixelRatio();\n    const realWidth = this.getWidth();\n    const realHeight = this.getHeight();\n    this.container.style.width = `${realWidth}px`;\n    this.pageList.forEach((p, i) => {\n      p.width = realWidth * dpr;\n      p.height = realHeight * dpr;\n      p.style.width = `${realWidth}px`;\n      p.style.height = `${realHeight}px`;\n      this._initPageContext(this.ctxList[i]);\n    });\n    this.render({\n      isSubmitHistory: false,\n      isSetCursor: false\n    });\n  }\n  setPaperDirection(payload) {\n    const dpr = this.getPagePixelRatio();\n    this.options.paperDirection = payload;\n    const width = this.getWidth();\n    const height = this.getHeight();\n    this.container.style.width = `${width}px`;\n    this.pageList.forEach((p, i) => {\n      p.width = width * dpr;\n      p.height = height * dpr;\n      p.style.width = `${width}px`;\n      p.style.height = `${height}px`;\n      this._initPageContext(this.ctxList[i]);\n    });\n    this.render({\n      isSubmitHistory: false,\n      isSetCursor: false\n    });\n  }\n  setPaperMargin(payload) {\n    this.options.margins = payload;\n    this.render({\n      isSubmitHistory: false,\n      isSetCursor: false\n    });\n  }\n  getValue(options = {}) {\n    const { pageNo, extraPickAttrs } = options;\n    let mainElementList = this.elementList;\n    if (Number.isInteger(pageNo) && pageNo >= 0 && pageNo < this.pageRowList.length) {\n      mainElementList = this.pageRowList[pageNo].flatMap((row) => row.elementList);\n    }\n    const data2 = {\n      header: zipElementList(this.getHeaderElementList(), {\n        extraPickAttrs\n      }),\n      main: zipElementList(mainElementList, {\n        extraPickAttrs\n      }),\n      footer: zipElementList(this.getFooterElementList(), {\n        extraPickAttrs\n      })\n    };\n    return {\n      version,\n      data: data2,\n      options: deepClone(this.options)\n    };\n  }\n  setValue(payload, options) {\n    const { header, main, footer } = deepClone(payload);\n    if (!header && !main && !footer)\n      return;\n    const { isSetCursor = false } = options || {};\n    const pageComponentData = [header, main, footer];\n    pageComponentData.forEach((data2) => {\n      if (!data2)\n        return;\n      formatElementList(data2, {\n        editorOptions: this.options,\n        isForceCompensation: true\n      });\n    });\n    this.setEditorData({\n      header,\n      main,\n      footer\n    });\n    this.historyManager.recovery();\n    const curIndex = isSetCursor ? (main == null ? void 0 : main.length) ? main.length - 1 : 0 : void 0;\n    if (curIndex !== void 0) {\n      this.range.setRange(curIndex, curIndex);\n    }\n    this.render({\n      curIndex,\n      isSetCursor,\n      isFirstRender: true\n    });\n  }\n  setEditorData(payload) {\n    const { header, main, footer } = payload;\n    if (header) {\n      this.header.setElementList(header);\n    }\n    if (main) {\n      this.elementList = main;\n    }\n    if (footer) {\n      this.footer.setElementList(footer);\n    }\n  }\n  _wrapContainer(rootContainer) {\n    const container = document.createElement(\"div\");\n    rootContainer.append(container);\n    return container;\n  }\n  _formatContainer() {\n    this.container.style.position = \"relative\";\n    this.container.style.width = `${this.getWidth()}px`;\n    this.container.setAttribute(EDITOR_COMPONENT, EditorComponent.MAIN);\n  }\n  _createPageContainer() {\n    const pageContainer = document.createElement(\"div\");\n    pageContainer.classList.add(`${EDITOR_PREFIX}-page-container`);\n    this.container.append(pageContainer);\n    return pageContainer;\n  }\n  _createPage(pageNo) {\n    const width = this.getWidth();\n    const height = this.getHeight();\n    const canvas = document.createElement(\"canvas\");\n    canvas.style.width = `${width}px`;\n    canvas.style.height = `${height}px`;\n    canvas.style.display = \"block\";\n    canvas.style.backgroundColor = \"#ffffff\";\n    canvas.style.marginBottom = `${this.getPageGap()}px`;\n    canvas.setAttribute(\"data-index\", String(pageNo));\n    this.pageContainer.append(canvas);\n    const dpr = this.getPagePixelRatio();\n    canvas.width = width * dpr;\n    canvas.height = height * dpr;\n    canvas.style.cursor = \"text\";\n    const ctx = canvas.getContext(\"2d\");\n    this._initPageContext(ctx);\n    this.pageList.push(canvas);\n    this.ctxList.push(ctx);\n  }\n  _initPageContext(ctx) {\n    const dpr = this.getPagePixelRatio();\n    ctx.scale(dpr, dpr);\n    ctx.letterSpacing = \"0px\";\n    ctx.wordSpacing = \"0px\";\n    ctx.direction = \"ltr\";\n  }\n  getElementFont(el, scale = 1) {\n    const { defaultSize, defaultFont } = this.options;\n    const font = el.font || defaultFont;\n    const size = el.actualSize || el.size || defaultSize;\n    return `${el.italic ? \"italic \" : \"\"}${el.bold ? \"bold \" : \"\"}${size * scale}px ${font}`;\n  }\n  getElementSize(el) {\n    return el.actualSize || el.size || this.options.defaultSize;\n  }\n  getElementRowMargin(el) {\n    var _a;\n    const { defaultBasicRowMarginHeight, defaultRowMargin, scale } = this.options;\n    return defaultBasicRowMarginHeight * ((_a = el.rowMargin) != null ? _a : defaultRowMargin) * scale;\n  }\n  computeRowList(payload) {\n    var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;\n    const { innerWidth, elementList, isPagingMode = false, isFromTable = false, startX = 0, startY = 0, pageHeight = 0, mainOuterHeight = 0, surroundElementList = [] } = payload;\n    const { defaultSize, defaultRowMargin, scale, table: { tdPadding }, defaultTabWidth } = this.options;\n    const defaultBasicRowMarginHeight = this.getDefaultBasicRowMarginHeight();\n    const canvas = document.createElement(\"canvas\");\n    const ctx = canvas.getContext(\"2d\");\n    const listStyleMap = this.listParticle.computeListStyle(ctx, elementList);\n    const rowList = [];\n    if (elementList.length) {\n      rowList.push({\n        width: 0,\n        height: 0,\n        ascent: 0,\n        elementList: [],\n        startIndex: 0,\n        rowIndex: 0,\n        rowFlex: ((_a = elementList == null ? void 0 : elementList[0]) == null ? void 0 : _a.rowFlex) || ((_b = elementList == null ? void 0 : elementList[1]) == null ? void 0 : _b.rowFlex)\n      });\n    }\n    let x = startX;\n    let y = startY;\n    let pageNo = 0;\n    let listId;\n    let listIndex = 0;\n    let controlRealWidth = 0;\n    for (let i = 0; i < elementList.length; i++) {\n      const curRow = rowList[rowList.length - 1];\n      const element = elementList[i];\n      const rowMargin = defaultBasicRowMarginHeight * ((_c = element.rowMargin) != null ? _c : defaultRowMargin);\n      const metrics = {\n        width: 0,\n        height: 0,\n        boundingBoxAscent: 0,\n        boundingBoxDescent: 0\n      };\n      const offsetX = curRow.offsetX || element.listId && listStyleMap.get(element.listId) || 0;\n      const availableWidth = innerWidth - offsetX;\n      x += curRow.elementList.length === 1 ? offsetX : 0;\n      if (element.type === ElementType.IMAGE || element.type === ElementType.LATEX) {\n        if (element.imgDisplay === ImageDisplay.SURROUND || element.imgDisplay === ImageDisplay.FLOAT_TOP || element.imgDisplay === ImageDisplay.FLOAT_BOTTOM) {\n          metrics.width = 0;\n          metrics.height = 0;\n          metrics.boundingBoxDescent = 0;\n        } else {\n          const elementWidth = element.width * scale;\n          const elementHeight = element.height * scale;\n          if (elementWidth > availableWidth) {\n            const adaptiveHeight = elementHeight * availableWidth / elementWidth;\n            element.width = availableWidth / scale;\n            element.height = adaptiveHeight / scale;\n            metrics.width = availableWidth;\n            metrics.height = adaptiveHeight;\n            metrics.boundingBoxDescent = adaptiveHeight;\n          } else {\n            metrics.width = elementWidth;\n            metrics.height = elementHeight;\n            metrics.boundingBoxDescent = elementHeight;\n          }\n        }\n        metrics.boundingBoxAscent = 0;\n      } else if (element.type === ElementType.TABLE) {\n        const tdPaddingWidth = tdPadding[1] + tdPadding[3];\n        const tdPaddingHeight = tdPadding[0] + tdPadding[2];\n        if (element.pagingId) {\n          let tableIndex = i + 1;\n          let combineCount = 0;\n          while (tableIndex < elementList.length) {\n            const nextElement2 = elementList[tableIndex];\n            if (nextElement2.pagingId === element.pagingId) {\n              const nexTrList = nextElement2.trList.filter((tr) => !tr.pagingRepeat);\n              element.trList.push(...nexTrList);\n              element.height += nextElement2.height;\n              tableIndex++;\n              combineCount++;\n            } else {\n              break;\n            }\n          }\n          if (combineCount) {\n            elementList.splice(i + 1, combineCount);\n          }\n        }\n        element.pagingIndex = (_d = element.pagingIndex) != null ? _d : 0;\n        this.tableParticle.computeRowColInfo(element);\n        const trList = element.trList;\n        for (let t = 0; t < trList.length; t++) {\n          const tr = trList[t];\n          for (let d = 0; d < tr.tdList.length; d++) {\n            const td = tr.tdList[d];\n            const rowList2 = this.computeRowList({\n              innerWidth: (td.width - tdPaddingWidth) * scale,\n              elementList: td.value,\n              isFromTable: true,\n              isPagingMode\n            });\n            const rowHeight = rowList2.reduce((pre, cur) => pre + cur.height, 0);\n            td.rowList = rowList2;\n            const curTdHeight = rowHeight / scale + tdPaddingHeight;\n            if (td.height < curTdHeight) {\n              const extraHeight = curTdHeight - td.height;\n              const changeTr = trList[t + td.rowspan - 1];\n              changeTr.height += extraHeight;\n              changeTr.tdList.forEach((changeTd) => {\n                changeTd.height += extraHeight;\n              });\n            }\n            let curTdMinHeight = 0;\n            let curTdRealHeight = 0;\n            let i2 = 0;\n            while (i2 < td.rowspan) {\n              const curTr = trList[i2 + t] || trList[t];\n              curTdMinHeight += curTr.minHeight;\n              curTdRealHeight += curTr.height;\n              i2++;\n            }\n            td.realMinHeight = curTdMinHeight;\n            td.realHeight = curTdRealHeight;\n            td.mainHeight = curTdHeight;\n          }\n        }\n        const reduceTrList = this.tableParticle.getTrListGroupByCol(trList);\n        for (let t = 0; t < reduceTrList.length; t++) {\n          const tr = reduceTrList[t];\n          let reduceHeight = -1;\n          for (let d = 0; d < tr.tdList.length; d++) {\n            const td = tr.tdList[d];\n            const curTdRealHeight = td.realHeight;\n            const curTdHeight = td.mainHeight;\n            const curTdMinHeight = td.realMinHeight;\n            const curReduceHeight = curTdHeight < curTdMinHeight ? curTdRealHeight - curTdMinHeight : curTdRealHeight - curTdHeight;\n            if (!~reduceHeight || curReduceHeight < reduceHeight) {\n              reduceHeight = curReduceHeight;\n            }\n          }\n          if (reduceHeight > 0) {\n            const changeTr = trList[t];\n            changeTr.height -= reduceHeight;\n            changeTr.tdList.forEach((changeTd) => {\n              changeTd.height -= reduceHeight;\n            });\n          }\n        }\n        this.tableParticle.computeRowColInfo(element);\n        const tableHeight = this.tableParticle.getTableHeight(element);\n        const tableWidth = this.tableParticle.getTableWidth(element);\n        element.width = tableWidth;\n        element.height = tableHeight;\n        const elementWidth = tableWidth * scale;\n        const elementHeight = tableHeight * scale;\n        metrics.width = elementWidth;\n        metrics.height = elementHeight;\n        metrics.boundingBoxDescent = elementHeight;\n        metrics.boundingBoxAscent = -rowMargin;\n        if (isPagingMode) {\n          const height2 = this.getHeight();\n          const marginHeight = this.getMainOuterHeight();\n          let curPagePreHeight = marginHeight;\n          for (let r = 0; r < rowList.length; r++) {\n            const row = rowList[r];\n            if (row.height + curPagePreHeight > height2 || ((_e = rowList[r - 1]) == null ? void 0 : _e.isPageBreak)) {\n              curPagePreHeight = marginHeight + row.height;\n            } else {\n              curPagePreHeight += row.height;\n            }\n          }\n          const rowMarginHeight = rowMargin * 2 * scale;\n          if (curPagePreHeight + element.trList[0].height + rowMarginHeight > height2 || element.pagingIndex !== 0 && element.trList[0].pagingRepeat) {\n            curPagePreHeight = marginHeight;\n          }\n          if (curPagePreHeight + rowMarginHeight + elementHeight > height2) {\n            const trList2 = element.trList;\n            let deleteStart = 0;\n            let deleteCount = 0;\n            let preTrHeight = 0;\n            if (trList2.length > 1) {\n              for (let r = 0; r < trList2.length; r++) {\n                const tr = trList2[r];\n                const trHeight = tr.height * scale;\n                if (curPagePreHeight + rowMarginHeight + preTrHeight + trHeight > height2) {\n                  const rowColCount = tr.tdList.reduce((pre, cur) => pre + cur.colspan, 0);\n                  if (((_f = element.colgroup) == null ? void 0 : _f.length) !== rowColCount) {\n                    deleteCount = 0;\n                  }\n                  break;\n                } else {\n                  deleteStart = r + 1;\n                  deleteCount = trList2.length - deleteStart;\n                  preTrHeight += trHeight;\n                }\n              }\n            }\n            if (deleteCount) {\n              const cloneTrList = trList2.splice(deleteStart, deleteCount);\n              const cloneTrHeight = cloneTrList.reduce((pre, cur) => pre + cur.height, 0);\n              const pagingId = element.pagingId || getUUID();\n              element.pagingId = pagingId;\n              element.height -= cloneTrHeight;\n              metrics.height -= cloneTrHeight;\n              metrics.boundingBoxDescent -= cloneTrHeight;\n              const cloneElement = deepClone(element);\n              cloneElement.pagingId = pagingId;\n              cloneElement.pagingIndex = element.pagingIndex + 1;\n              const repeatTrList = trList2.filter((tr) => tr.pagingRepeat);\n              if (repeatTrList.length) {\n                const cloneRepeatTrList = deepClone(repeatTrList);\n                cloneRepeatTrList.forEach((tr) => tr.id = getUUID());\n                cloneTrList.unshift(...cloneRepeatTrList);\n              }\n              cloneElement.trList = cloneTrList;\n              cloneElement.id = getUUID();\n              this.spliceElementList(elementList, i + 1, 0, cloneElement);\n            }\n          }\n          if (element.pagingId) {\n            const positionContext = this.position.getPositionContext();\n            if (positionContext.isTable) {\n              let newPositionContextIndex = -1;\n              let newPositionContextTrIndex = -1;\n              let tableIndex = i;\n              while (tableIndex < elementList.length) {\n                const curElement = elementList[tableIndex];\n                if (curElement.pagingId !== element.pagingId)\n                  break;\n                const trIndex = curElement.trList.findIndex((r) => r.id === positionContext.trId);\n                if (~trIndex) {\n                  newPositionContextIndex = tableIndex;\n                  newPositionContextTrIndex = trIndex;\n                  break;\n                }\n                tableIndex++;\n              }\n              if (~newPositionContextIndex) {\n                positionContext.index = newPositionContextIndex;\n                positionContext.trIndex = newPositionContextTrIndex;\n                this.position.setPositionContext(positionContext);\n              }\n            }\n          }\n        }\n      } else if (element.type === ElementType.SEPARATOR) {\n        const { separator: { lineWidth } } = this.options;\n        element.width = availableWidth / scale;\n        metrics.width = availableWidth;\n        metrics.height = lineWidth * scale;\n        metrics.boundingBoxAscent = -rowMargin;\n        metrics.boundingBoxDescent = -rowMargin + metrics.height;\n      } else if (element.type === ElementType.PAGE_BREAK) {\n        element.width = availableWidth / scale;\n        metrics.width = availableWidth;\n        metrics.height = defaultSize;\n      } else if (element.type === ElementType.RADIO || element.controlComponent === ControlComponent.RADIO) {\n        const { width, height: height2, gap } = this.options.radio;\n        const elementWidth = width + gap * 2;\n        element.width = elementWidth;\n        metrics.width = elementWidth * scale;\n        metrics.height = height2 * scale;\n      } else if (element.type === ElementType.CHECKBOX || element.controlComponent === ControlComponent.CHECKBOX) {\n        const { width, height: height2, gap } = this.options.checkbox;\n        const elementWidth = width + gap * 2;\n        element.width = elementWidth;\n        metrics.width = elementWidth * scale;\n        metrics.height = height2 * scale;\n      } else if (element.type === ElementType.TAB) {\n        metrics.width = defaultTabWidth * scale;\n        metrics.height = defaultSize * scale;\n        metrics.boundingBoxDescent = 0;\n        metrics.boundingBoxAscent = metrics.height;\n      } else if (element.type === ElementType.BLOCK) {\n        if (!element.width) {\n          metrics.width = availableWidth;\n        } else {\n          const elementWidth = element.width * scale;\n          metrics.width = Math.min(elementWidth, availableWidth);\n        }\n        metrics.height = element.height * scale;\n        metrics.boundingBoxDescent = metrics.height;\n        metrics.boundingBoxAscent = 0;\n      } else {\n        const size = element.size || defaultSize;\n        if (element.type === ElementType.SUPERSCRIPT || element.type === ElementType.SUBSCRIPT) {\n          element.actualSize = Math.ceil(size * 0.6);\n        }\n        metrics.height = (element.actualSize || size) * scale;\n        ctx.font = this.getElementFont(element);\n        const fontMetrics = this.textParticle.measureText(ctx, element);\n        metrics.width = fontMetrics.width * scale;\n        if (element.letterSpacing) {\n          metrics.width += element.letterSpacing * scale;\n        }\n        metrics.boundingBoxAscent = (element.value === ZERO ? element.size || defaultSize : fontMetrics.actualBoundingBoxAscent) * scale;\n        metrics.boundingBoxDescent = fontMetrics.actualBoundingBoxDescent * scale;\n        if (element.type === ElementType.SUPERSCRIPT) {\n          metrics.boundingBoxAscent += metrics.height / 2;\n        } else if (element.type === ElementType.SUBSCRIPT) {\n          metrics.boundingBoxDescent += metrics.height / 2;\n        }\n      }\n      const ascent = element.imgDisplay !== ImageDisplay.INLINE && element.type === ElementType.IMAGE || element.type === ElementType.LATEX ? metrics.height + rowMargin : metrics.boundingBoxAscent + rowMargin;\n      const height = rowMargin + metrics.boundingBoxAscent + metrics.boundingBoxDescent + rowMargin;\n      const rowElement = Object.assign(element, {\n        metrics,\n        left: 0,\n        style: this.getElementFont(element, scale)\n      });\n      if ((_g = rowElement.control) == null ? void 0 : _g.minWidth) {\n        if (rowElement.controlComponent) {\n          controlRealWidth += metrics.width;\n        }\n        if (rowElement.controlComponent === ControlComponent.POSTFIX) {\n          this.control.setMinWidthControlInfo({\n            row: curRow,\n            rowElement,\n            availableWidth,\n            controlRealWidth\n          });\n          controlRealWidth = 0;\n        }\n      }\n      const preElement = elementList[i - 1];\n      let nextElement = elementList[i + 1];\n      let curRowWidth = curRow.width + metrics.width;\n      if (this.options.wordBreak === WordBreak.BREAK_WORD) {\n        if ((!(preElement == null ? void 0 : preElement.type) || (preElement == null ? void 0 : preElement.type) === ElementType.TEXT) && (!element.type || element.type === ElementType.TEXT)) {\n          const word = `${(preElement == null ? void 0 : preElement.value) || \"\"}${element.value}`;\n          if (this.WORD_LIKE_REG.test(word)) {\n            const { width, endElement } = this.textParticle.measureWord(ctx, elementList, i);\n            const wordWidth = width * scale;\n            if (wordWidth <= availableWidth) {\n              curRowWidth += wordWidth;\n              nextElement = endElement;\n            }\n          }\n          const punctuationWidth = this.textParticle.measurePunctuationWidth(ctx, nextElement);\n          curRowWidth += punctuationWidth * scale;\n        }\n      }\n      if (element.listId) {\n        if (element.listId !== listId) {\n          listIndex = 0;\n        } else if (element.value === ZERO && !element.listWrap) {\n          listIndex++;\n        }\n      }\n      listId = element.listId;\n      const surroundPosition = this.position.setSurroundPosition({\n        pageNo,\n        rowElement,\n        row: curRow,\n        rowElementRect: {\n          x,\n          y,\n          height,\n          width: metrics.width\n        },\n        availableWidth,\n        surroundElementList\n      });\n      x = surroundPosition.x;\n      curRowWidth += surroundPosition.rowIncreaseWidth;\n      x += metrics.width;\n      const isForceBreak = element.type === ElementType.SEPARATOR || element.type === ElementType.TABLE || (preElement == null ? void 0 : preElement.type) === ElementType.TABLE || (preElement == null ? void 0 : preElement.type) === ElementType.BLOCK || element.type === ElementType.BLOCK || (preElement == null ? void 0 : preElement.imgDisplay) === ImageDisplay.INLINE || element.imgDisplay === ImageDisplay.INLINE || (preElement == null ? void 0 : preElement.listId) !== element.listId || i !== 0 && element.value === ZERO;\n      const isWidthNotEnough = curRowWidth > availableWidth;\n      const isWrap = isForceBreak || isWidthNotEnough;\n      if (isWrap) {\n        const row = {\n          width: metrics.width,\n          height,\n          startIndex: i,\n          elementList: [rowElement],\n          ascent,\n          rowIndex: curRow.rowIndex + 1,\n          rowFlex: ((_h = elementList[i]) == null ? void 0 : _h.rowFlex) || ((_i = elementList[i + 1]) == null ? void 0 : _i.rowFlex),\n          isPageBreak: element.type === ElementType.PAGE_BREAK\n        };\n        if (rowElement.controlComponent !== ControlComponent.PREFIX && ((_j = rowElement.control) == null ? void 0 : _j.indentation) === ControlIndentation.VALUE_START) {\n          const preStartIndex = curRow.elementList.findIndex((el) => el.controlId === rowElement.controlId && el.controlComponent !== ControlComponent.PREFIX);\n          if (~preStartIndex) {\n            const preRowPositionList = this.position.computeRowPosition({\n              row: curRow,\n              innerWidth: this.getInnerWidth()\n            });\n            const valueStartPosition = preRowPositionList[preStartIndex];\n            if (valueStartPosition) {\n              row.offsetX = valueStartPosition.coordinate.leftTop[0];\n            }\n          }\n        }\n        if (element.listId) {\n          row.isList = true;\n          row.offsetX = listStyleMap.get(element.listId);\n          row.listIndex = listIndex;\n        }\n        rowList.push(row);\n      } else {\n        curRow.width += metrics.width;\n        if (i === 0 && getIsBlockElement(elementList[1])) {\n          curRow.height = defaultBasicRowMarginHeight;\n          curRow.ascent = defaultBasicRowMarginHeight;\n        } else if (curRow.height < height) {\n          curRow.height = height;\n          curRow.ascent = ascent;\n        }\n        curRow.elementList.push(rowElement);\n      }\n      if (isWrap || i === elementList.length - 1) {\n        curRow.isWidthNotEnough = isWidthNotEnough && !isForceBreak;\n        if (!curRow.isSurround && ((preElement == null ? void 0 : preElement.rowFlex) === RowFlex.JUSTIFY || (preElement == null ? void 0 : preElement.rowFlex) === RowFlex.ALIGNMENT && isWidthNotEnough)) {\n          const rowElementList = ((_k = curRow.elementList[0]) == null ? void 0 : _k.value) === ZERO ? curRow.elementList.slice(1) : curRow.elementList;\n          const gap = (availableWidth - curRow.width) / (rowElementList.length - 1);\n          for (let e = 0; e < rowElementList.length - 1; e++) {\n            const el = rowElementList[e];\n            el.metrics.width += gap;\n          }\n          curRow.width = availableWidth;\n        }\n      }\n      if (isWrap) {\n        x = startX;\n        y += curRow.height;\n        if (isPagingMode && !isFromTable && pageHeight && (y - startY + mainOuterHeight + height > pageHeight || element.type === ElementType.PAGE_BREAK)) {\n          y = startY;\n          deleteSurroundElementList(surroundElementList, pageNo);\n          pageNo += 1;\n        }\n        rowElement.left = 0;\n        const nextRow = rowList[rowList.length - 1];\n        const surroundPosition2 = this.position.setSurroundPosition({\n          pageNo,\n          rowElement,\n          row: nextRow,\n          rowElementRect: {\n            x,\n            y,\n            height,\n            width: metrics.width\n          },\n          availableWidth,\n          surroundElementList\n        });\n        x = surroundPosition2.x;\n        x += metrics.width;\n      }\n    }\n    return rowList;\n  }\n  _computePageList() {\n    var _a;\n    const pageRowList = [[]];\n    const { pageMode, pageNumber: { maxPageNo } } = this.options;\n    const height = this.getHeight();\n    const marginHeight = this.getMainOuterHeight();\n    let pageHeight = marginHeight;\n    let pageNo = 0;\n    if (pageMode === PageMode.CONTINUITY) {\n      pageRowList[0] = this.rowList;\n      pageHeight += this.rowList.reduce((pre, cur) => pre + cur.height, 0);\n      const dpr = this.getPagePixelRatio();\n      const pageDom = this.pageList[0];\n      const pageDomHeight = Number(pageDom.style.height.replace(\"px\", \"\"));\n      if (pageHeight > pageDomHeight) {\n        pageDom.style.height = `${pageHeight}px`;\n        pageDom.height = pageHeight * dpr;\n      } else {\n        const reduceHeight = pageHeight < height ? height : pageHeight;\n        pageDom.style.height = `${reduceHeight}px`;\n        pageDom.height = reduceHeight * dpr;\n      }\n      this._initPageContext(this.ctxList[0]);\n    } else {\n      for (let i = 0; i < this.rowList.length; i++) {\n        const row = this.rowList[i];\n        if (row.height + pageHeight > height || ((_a = this.rowList[i - 1]) == null ? void 0 : _a.isPageBreak)) {\n          if (Number.isInteger(maxPageNo) && pageNo >= maxPageNo) {\n            this.elementList = this.elementList.slice(0, row.startIndex);\n            break;\n          }\n          pageHeight = marginHeight + row.height;\n          pageRowList.push([row]);\n          pageNo++;\n        } else {\n          pageHeight += row.height;\n          pageRowList[pageNo].push(row);\n        }\n      }\n    }\n    return pageRowList;\n  }\n  _drawHighlight(ctx, payload) {\n    var _a;\n    const { control: { activeBackgroundColor } } = this.options;\n    const { rowList, positionList } = payload;\n    const activeControlElement = (_a = this.control.getActiveControl()) == null ? void 0 : _a.getElement();\n    for (let i = 0; i < rowList.length; i++) {\n      const curRow = rowList[i];\n      for (let j = 0; j < curRow.elementList.length; j++) {\n        const element = curRow.elementList[j];\n        const preElement = curRow.elementList[j - 1];\n        if (element.highlight || activeBackgroundColor && activeControlElement && element.controlId === activeControlElement.controlId && !this.control.getIsRangeInPostfix()) {\n          if (preElement && preElement.highlight && preElement.highlight !== element.highlight) {\n            this.highlight.render(ctx);\n          }\n          const { coordinate: { leftTop: [x, y] } } = positionList[curRow.startIndex + j];\n          const offsetX = element.left || 0;\n          this.highlight.recordFillInfo(ctx, x - offsetX, y, element.metrics.width + offsetX, curRow.height, element.highlight || activeBackgroundColor);\n        } else if (preElement == null ? void 0 : preElement.highlight) {\n          this.highlight.render(ctx);\n        }\n      }\n      this.highlight.render(ctx);\n    }\n  }\n  drawRow(ctx, payload) {\n    var _a, _b, _c, _d, _e, _f, _g;\n    this._drawHighlight(ctx, payload);\n    const { scale, table: { tdPadding }, group: group2, lineBreak } = this.options;\n    const { rowList, pageNo, elementList, positionList, startIndex, zone: zone2, isDrawLineBreak = !lineBreak.disabled } = payload;\n    const isPrintMode = this.mode === EditorMode.PRINT;\n    const { isCrossRowCol, tableId } = this.range.getRange();\n    let index2 = startIndex;\n    for (let i = 0; i < rowList.length; i++) {\n      const curRow = rowList[i];\n      const rangeRecord = {\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0\n      };\n      let tableRangeElement = null;\n      for (let j = 0; j < curRow.elementList.length; j++) {\n        const element = curRow.elementList[j];\n        const metrics = element.metrics;\n        const { ascent: offsetY, coordinate: { leftTop: [x, y] } } = positionList[curRow.startIndex + j];\n        const preElement = curRow.elementList[j - 1];\n        if (element.type === ElementType.IMAGE) {\n          this.textParticle.complete();\n          if (element.imgDisplay !== ImageDisplay.SURROUND && element.imgDisplay !== ImageDisplay.FLOAT_TOP && element.imgDisplay !== ImageDisplay.FLOAT_BOTTOM) {\n            this.imageParticle.render(ctx, element, x, y + offsetY);\n          }\n        } else if (element.type === ElementType.LATEX) {\n          this.textParticle.complete();\n          this.laTexParticle.render(ctx, element, x, y + offsetY);\n        } else if (element.type === ElementType.TABLE) {\n          if (isCrossRowCol) {\n            rangeRecord.x = x;\n            rangeRecord.y = y;\n            tableRangeElement = element;\n          }\n          this.tableParticle.render(ctx, element, x, y);\n        } else if (element.type === ElementType.HYPERLINK) {\n          this.textParticle.complete();\n          this.hyperlinkParticle.render(ctx, element, x, y + offsetY);\n        } else if (element.type === ElementType.DATE) {\n          const nextElement = curRow.elementList[j + 1];\n          if (!preElement || preElement.dateId !== element.dateId) {\n            this.textParticle.complete();\n          }\n          this.textParticle.record(ctx, element, x, y + offsetY);\n          if (!nextElement || nextElement.dateId !== element.dateId) {\n            this.textParticle.complete();\n          }\n        } else if (element.type === ElementType.SUPERSCRIPT) {\n          this.textParticle.complete();\n          this.superscriptParticle.render(ctx, element, x, y + offsetY);\n        } else if (element.type === ElementType.SUBSCRIPT) {\n          this.underline.render(ctx);\n          this.textParticle.complete();\n          this.subscriptParticle.render(ctx, element, x, y + offsetY);\n        } else if (element.type === ElementType.SEPARATOR) {\n          this.separatorParticle.render(ctx, element, x, y);\n        } else if (element.type === ElementType.PAGE_BREAK) {\n          if (this.mode !== EditorMode.CLEAN && !isPrintMode) {\n            this.pageBreakParticle.render(ctx, element, x, y);\n          }\n        } else if (element.type === ElementType.CHECKBOX || element.controlComponent === ControlComponent.CHECKBOX) {\n          this.textParticle.complete();\n          this.checkboxParticle.render({\n            ctx,\n            x,\n            y: y + offsetY,\n            index: j,\n            row: curRow\n          });\n        } else if (element.type === ElementType.RADIO || element.controlComponent === ControlComponent.RADIO) {\n          this.textParticle.complete();\n          this.radioParticle.render({\n            ctx,\n            x,\n            y: y + offsetY,\n            index: j,\n            row: curRow\n          });\n        } else if (element.type === ElementType.TAB) {\n          this.textParticle.complete();\n        } else if (element.rowFlex === RowFlex.ALIGNMENT || element.rowFlex === RowFlex.JUSTIFY) {\n          this.textParticle.record(ctx, element, x, y + offsetY);\n          this.textParticle.complete();\n        } else if (element.type === ElementType.BLOCK) {\n          this.textParticle.complete();\n          this.blockParticle.render(pageNo, element, x, y);\n        } else {\n          if (element.left) {\n            this.textParticle.complete();\n          }\n          this.textParticle.record(ctx, element, x, y + offsetY);\n          if (element.width || element.letterSpacing || PUNCTUATION_REG.test(element.value)) {\n            this.textParticle.complete();\n          }\n        }\n        if (isDrawLineBreak && !isPrintMode && this.mode !== EditorMode.CLEAN && !curRow.isWidthNotEnough && j === curRow.elementList.length - 1) {\n          this.lineBreakParticle.render(ctx, element, x, y + curRow.height / 2);\n        }\n        if ((_a = element.control) == null ? void 0 : _a.border) {\n          if (((_b = preElement == null ? void 0 : preElement.control) == null ? void 0 : _b.border) && preElement.controlId !== element.controlId) {\n            this.control.drawBorder(ctx);\n          }\n          const rowMargin = this.getElementRowMargin(element);\n          this.control.recordBorderInfo(x, y + rowMargin, element.metrics.width, curRow.height - 2 * rowMargin);\n        } else if ((_c = preElement == null ? void 0 : preElement.control) == null ? void 0 : _c.border) {\n          this.control.drawBorder(ctx);\n        }\n        if (element.underline || ((_d = element.control) == null ? void 0 : _d.underline)) {\n          if ((preElement == null ? void 0 : preElement.type) === ElementType.SUBSCRIPT && element.type !== ElementType.SUBSCRIPT) {\n            this.underline.render(ctx);\n          }\n          const rowMargin = this.getElementRowMargin(element);\n          const offsetX = element.left || 0;\n          let offsetY2 = 0;\n          if (element.type === ElementType.SUBSCRIPT) {\n            offsetY2 = this.subscriptParticle.getOffsetY(element);\n          }\n          const color = ((_e = element.control) == null ? void 0 : _e.underline) ? this.options.underlineColor : element.color;\n          this.underline.recordFillInfo(ctx, x - offsetX, y + curRow.height - rowMargin + offsetY2, metrics.width + offsetX, 0, color, (_f = element.textDecoration) == null ? void 0 : _f.style);\n        } else if ((preElement == null ? void 0 : preElement.underline) || ((_g = preElement == null ? void 0 : preElement.control) == null ? void 0 : _g.underline)) {\n          this.underline.render(ctx);\n        }\n        if (element.strikeout) {\n          if (!element.type || TEXTLIKE_ELEMENT_TYPE.includes(element.type)) {\n            if (preElement && (preElement.type === ElementType.SUBSCRIPT && element.type !== ElementType.SUBSCRIPT || preElement.type === ElementType.SUPERSCRIPT && element.type !== ElementType.SUPERSCRIPT || this.getElementSize(preElement) !== this.getElementSize(element))) {\n              this.strikeout.render(ctx);\n            }\n            const standardMetrics = this.textParticle.measureBasisWord(ctx, this.getElementFont(element));\n            let adjustY = y + offsetY + standardMetrics.actualBoundingBoxDescent * scale - metrics.height / 2;\n            if (element.type === ElementType.SUBSCRIPT) {\n              adjustY += this.subscriptParticle.getOffsetY(element);\n            } else if (element.type === ElementType.SUPERSCRIPT) {\n              adjustY += this.superscriptParticle.getOffsetY(element);\n            }\n            this.strikeout.recordFillInfo(ctx, x, adjustY, metrics.width);\n          }\n        } else if (preElement == null ? void 0 : preElement.strikeout) {\n          this.strikeout.render(ctx);\n        }\n        const { zone: currentZone, startIndex: startIndex2, endIndex } = this.range.getRange();\n        if (currentZone === zone2 && startIndex2 !== endIndex && startIndex2 <= index2 && index2 <= endIndex) {\n          const positionContext = this.position.getPositionContext();\n          if (!positionContext.isTable && !element.tdId || positionContext.tdId === element.tdId) {\n            if (startIndex2 === index2) {\n              const nextElement = elementList[startIndex2 + 1];\n              if (nextElement && nextElement.value === ZERO) {\n                rangeRecord.x = x + metrics.width;\n                rangeRecord.y = y;\n                rangeRecord.height = curRow.height;\n                rangeRecord.width += this.options.rangeMinWidth;\n              }\n            } else {\n              let rangeWidth = metrics.width;\n              if (rangeWidth === 0 && curRow.elementList.length === 1) {\n                rangeWidth = this.options.rangeMinWidth;\n              }\n              if (!rangeRecord.width) {\n                rangeRecord.x = x;\n                rangeRecord.y = y;\n                rangeRecord.height = curRow.height;\n              }\n              rangeRecord.width += rangeWidth;\n            }\n          }\n        }\n        if (!group2.disabled && element.groupIds) {\n          this.group.recordFillInfo(element, x, y, metrics.width, curRow.height);\n        }\n        index2++;\n        if (element.type === ElementType.TABLE) {\n          const tdPaddingWidth = tdPadding[1] + tdPadding[3];\n          for (let t = 0; t < element.trList.length; t++) {\n            const tr = element.trList[t];\n            for (let d = 0; d < tr.tdList.length; d++) {\n              const td = tr.tdList[d];\n              this.drawRow(ctx, {\n                elementList: td.value,\n                positionList: td.positionList,\n                rowList: td.rowList,\n                pageNo,\n                startIndex: 0,\n                innerWidth: (td.width - tdPaddingWidth) * scale,\n                zone: zone2,\n                isDrawLineBreak\n              });\n            }\n          }\n        }\n      }\n      if (curRow.isList) {\n        this.listParticle.drawListStyle(ctx, curRow, positionList[curRow.startIndex]);\n      }\n      this.textParticle.complete();\n      this.control.drawBorder(ctx);\n      this.underline.render(ctx);\n      this.strikeout.render(ctx);\n      this.group.render(ctx);\n      if (!isPrintMode) {\n        if (rangeRecord.width && rangeRecord.height) {\n          const { x, y, width, height } = rangeRecord;\n          this.range.render(ctx, x, y, width, height);\n        }\n        if (isCrossRowCol && tableRangeElement && tableRangeElement.id === tableId) {\n          const { coordinate: { leftTop: [x, y] } } = positionList[curRow.startIndex];\n          this.tableParticle.drawRange(ctx, tableRangeElement, x, y);\n        }\n      }\n    }\n  }\n  _drawFloat(ctx, payload) {\n    const { scale } = this.options;\n    const floatPositionList = this.position.getFloatPositionList();\n    const { imgDisplays, pageNo } = payload;\n    for (let e = 0; e < floatPositionList.length; e++) {\n      const floatPosition = floatPositionList[e];\n      const element = floatPosition.element;\n      if ((pageNo === floatPosition.pageNo || floatPosition.zone === EditorZone.HEADER || floatPosition.zone == EditorZone.FOOTER) && element.imgDisplay && imgDisplays.includes(element.imgDisplay) && element.type === ElementType.IMAGE) {\n        const imgFloatPosition = element.imgFloatPosition;\n        this.imageParticle.render(ctx, element, imgFloatPosition.x * scale, imgFloatPosition.y * scale);\n      }\n    }\n  }\n  _clearPage(pageNo) {\n    const ctx = this.ctxList[pageNo];\n    const pageDom = this.pageList[pageNo];\n    ctx.clearRect(0, 0, Math.max(pageDom.width, this.getWidth()), Math.max(pageDom.height, this.getHeight()));\n    this.blockParticle.clear();\n  }\n  _drawPage(payload) {\n    var _a, _b;\n    const { elementList, positionList, rowList, pageNo } = payload;\n    const { inactiveAlpha, pageMode, header, footer, pageNumber, lineNumber, pageBorder } = this.options;\n    const innerWidth = this.getInnerWidth();\n    const ctx = this.ctxList[pageNo];\n    ctx.globalAlpha = !this.zone.isMainActive() ? inactiveAlpha : 1;\n    this._clearPage(pageNo);\n    this.background.render(ctx, pageNo);\n    if (this.mode !== EditorMode.PRINT) {\n      this.margin.render(ctx, pageNo);\n    }\n    this._drawFloat(ctx, {\n      pageNo,\n      imgDisplays: [ImageDisplay.FLOAT_BOTTOM]\n    });\n    this.control.renderHighlightList(ctx, pageNo);\n    const index2 = (_a = rowList[0]) == null ? void 0 : _a.startIndex;\n    this.drawRow(ctx, {\n      elementList,\n      positionList,\n      rowList,\n      pageNo,\n      startIndex: index2,\n      innerWidth,\n      zone: EditorZone.MAIN\n    });\n    if (this.getIsPagingMode()) {\n      if (!header.disabled) {\n        this.header.render(ctx, pageNo);\n      }\n      if (!pageNumber.disabled) {\n        this.pageNumber.render(ctx, pageNo);\n      }\n      if (!footer.disabled) {\n        this.footer.render(ctx, pageNo);\n      }\n    }\n    this._drawFloat(ctx, {\n      pageNo,\n      imgDisplays: [ImageDisplay.FLOAT_TOP, ImageDisplay.SURROUND]\n    });\n    if (this.search.getSearchKeyword()) {\n      this.search.render(ctx, pageNo);\n    }\n    if (pageMode !== PageMode.CONTINUITY && this.options.watermark.data) {\n      this.waterMark.render(ctx);\n    }\n    if (this.elementList.length <= 1 && !((_b = this.elementList[0]) == null ? void 0 : _b.listId)) {\n      this.placeholder.render(ctx);\n    }\n    if (!lineNumber.disabled) {\n      this.lineNumber.render(ctx, pageNo);\n    }\n    if (!pageBorder.disabled) {\n      this.pageBorder.render(ctx);\n    }\n  }\n  _disconnectLazyRender() {\n    var _a;\n    (_a = this.lazyRenderIntersectionObserver) == null ? void 0 : _a.disconnect();\n  }\n  _lazyRender() {\n    const positionList = this.position.getOriginalMainPositionList();\n    const elementList = this.getOriginalMainElementList();\n    this._disconnectLazyRender();\n    this.lazyRenderIntersectionObserver = new IntersectionObserver((entries) => {\n      entries.forEach((entry) => {\n        if (entry.isIntersecting) {\n          const index2 = Number(entry.target.dataset.index);\n          this._drawPage({\n            elementList,\n            positionList,\n            rowList: this.pageRowList[index2],\n            pageNo: index2\n          });\n        }\n      });\n    });\n    this.pageList.forEach((el) => {\n      this.lazyRenderIntersectionObserver.observe(el);\n    });\n  }\n  _immediateRender() {\n    const positionList = this.position.getOriginalMainPositionList();\n    const elementList = this.getOriginalMainElementList();\n    for (let i = 0; i < this.pageRowList.length; i++) {\n      this._drawPage({\n        elementList,\n        positionList,\n        rowList: this.pageRowList[i],\n        pageNo: i\n      });\n    }\n  }\n  render(payload) {\n    const { header, footer } = this.options;\n    const { isSubmitHistory = true, isSetCursor = true, isCompute = true, isLazy = true, isInit = false, isSourceHistory = false, isFirstRender = false } = payload || {};\n    let { curIndex } = payload || {};\n    const innerWidth = this.getInnerWidth();\n    const isPagingMode = this.getIsPagingMode();\n    const oldPageSize = this.pageRowList.length;\n    if (isCompute) {\n      this.position.setFloatPositionList([]);\n      if (isPagingMode) {\n        if (!header.disabled) {\n          this.header.compute();\n        }\n        if (!footer.disabled) {\n          this.footer.compute();\n        }\n      }\n      const margins = this.getMargins();\n      const pageHeight = this.getHeight();\n      const extraHeight = this.header.getExtraHeight();\n      const mainOuterHeight = this.getMainOuterHeight();\n      const startX = margins[3];\n      const startY = margins[0] + extraHeight;\n      const surroundElementList = pickSurroundElementList(this.elementList);\n      this.rowList = this.computeRowList({\n        startX,\n        startY,\n        pageHeight,\n        mainOuterHeight,\n        isPagingMode,\n        innerWidth,\n        surroundElementList,\n        elementList: this.elementList\n      });\n      this.pageRowList = this._computePageList();\n      this.position.computePositionList();\n      const searchKeyword = this.search.getSearchKeyword();\n      if (searchKeyword) {\n        this.search.compute(searchKeyword);\n      }\n      this.control.computeHighlightList();\n    }\n    this.imageObserver.clearAll();\n    this.cursor.recoveryCursor();\n    for (let i = 0; i < this.pageRowList.length; i++) {\n      if (!this.pageList[i]) {\n        this._createPage(i);\n      }\n    }\n    const curPageCount = this.pageRowList.length;\n    const prePageCount = this.pageList.length;\n    if (prePageCount > curPageCount) {\n      const deleteCount = prePageCount - curPageCount;\n      this.ctxList.splice(curPageCount, deleteCount);\n      this.pageList.splice(curPageCount, deleteCount).forEach((page) => page.remove());\n    }\n    if (isLazy && isPagingMode) {\n      this._lazyRender();\n    } else {\n      this._immediateRender();\n    }\n    if (isSetCursor) {\n      curIndex = this.setCursor(curIndex);\n    }\n    if (isSubmitHistory && !isFirstRender || curIndex !== void 0 && this.historyManager.isStackEmpty()) {\n      this.submitHistory(curIndex);\n    }\n    nextTick(() => {\n      if (isCompute && this.control.getActiveControl()) {\n        this.control.reAwakeControl();\n      }\n      if (isCompute && !this.isReadonly() && this.position.getPositionContext().isTable) {\n        this.tableTool.render();\n      }\n      if (isCompute && !this.zone.isMainActive()) {\n        this.zone.drawZoneIndicator();\n      }\n      if (oldPageSize !== this.pageRowList.length) {\n        if (this.listener.pageSizeChange) {\n          this.listener.pageSizeChange(this.pageRowList.length);\n        }\n        if (this.eventBus.isSubscribe(\"pageSizeChange\")) {\n          this.eventBus.emit(\"pageSizeChange\", this.pageRowList.length);\n        }\n      }\n      if ((isSubmitHistory || isSourceHistory) && !isInit) {\n        if (this.listener.contentChange) {\n          this.listener.contentChange();\n        }\n        if (this.eventBus.isSubscribe(\"contentChange\")) {\n          this.eventBus.emit(\"contentChange\");\n        }\n      }\n    });\n  }\n  setCursor(curIndex) {\n    var _a;\n    const positionContext = this.position.getPositionContext();\n    const positionList = this.position.getPositionList();\n    if (positionContext.isTable) {\n      const { index: index2, trIndex, tdIndex } = positionContext;\n      const elementList = this.getOriginalElementList();\n      const tablePositionList = (_a = elementList[index2].trList) == null ? void 0 : _a[trIndex].tdList[tdIndex].positionList;\n      if (curIndex === void 0 && tablePositionList) {\n        curIndex = tablePositionList.length - 1;\n      }\n      const tablePosition = tablePositionList == null ? void 0 : tablePositionList[curIndex];\n      console.log(\"tablePosition:::\", tablePosition);\n      this.position.setCursorPosition(tablePosition || null);\n    } else {\n      this.position.setCursorPosition(curIndex !== void 0 ? positionList[curIndex] : null);\n    }\n    let isShowCursor = true;\n    if (curIndex !== void 0 && positionContext.isImage && positionContext.isDirectHit) {\n      const elementList = this.getElementList();\n      const element = elementList[curIndex];\n      if (IMAGE_ELEMENT_TYPE.includes(element.type)) {\n        isShowCursor = false;\n        const position = this.position.getCursorPosition();\n        this.previewer.updateResizer(element, position);\n      }\n    }\n    this.cursor.drawCursor({\n      isShow: isShowCursor\n    });\n    return curIndex;\n  }\n  submitHistory(curIndex) {\n    const positionContext = this.position.getPositionContext();\n    const oldElementList = getSlimCloneElementList(this.elementList);\n    const oldHeaderElementList = getSlimCloneElementList(this.header.getElementList());\n    const oldFooterElementList = getSlimCloneElementList(this.footer.getElementList());\n    const oldRange = deepClone(this.range.getRange());\n    const pageNo = this.pageNo;\n    const oldPositionContext = deepClone(positionContext);\n    const zone2 = this.zone.getZone();\n    this.historyManager.execute(() => {\n      this.zone.setZone(zone2);\n      this.setPageNo(pageNo);\n      this.position.setPositionContext(deepClone(oldPositionContext));\n      this.header.setElementList(deepClone(oldHeaderElementList));\n      this.footer.setElementList(deepClone(oldFooterElementList));\n      this.elementList = deepClone(oldElementList);\n      this.range.replaceRange(deepClone(oldRange));\n      this.render({\n        curIndex,\n        isSubmitHistory: false,\n        isSourceHistory: true\n      });\n    });\n  }\n  destroy() {\n    this.container.remove();\n    this.globalEvent.removeEvent();\n    this.scrollObserver.removeEvent();\n    this.selectionObserver.removeEvent();\n  }\n  clearSideEffect() {\n    this.getPreviewer().clearResizer();\n    this.getTableTool().dispose();\n    this.getHyperlinkParticle().clearHyperlinkPopup();\n    this.getDateParticle().clearDatePicker();\n  }\n}\nclass Command {\n  constructor(adapt) {\n    this.executeMode = adapt.mode.bind(adapt);\n    this.executeCut = adapt.cut.bind(adapt);\n    this.executeCopy = adapt.copy.bind(adapt);\n    this.executePaste = adapt.paste.bind(adapt);\n    this.executeSelectAll = adapt.selectAll.bind(adapt);\n    this.executeBackspace = adapt.backspace.bind(adapt);\n    this.executeSetRange = adapt.setRange.bind(adapt);\n    this.executeReplaceRange = adapt.replaceRange.bind(adapt);\n    this.executeSetPositionContext = adapt.setPositionContext.bind(adapt);\n    this.executeForceUpdate = adapt.forceUpdate.bind(adapt);\n    this.executeBlur = adapt.blur.bind(adapt);\n    this.executeUndo = adapt.undo.bind(adapt);\n    this.executeRedo = adapt.redo.bind(adapt);\n    this.executePainter = adapt.painter.bind(adapt);\n    this.executeApplyPainterStyle = adapt.applyPainterStyle.bind(adapt);\n    this.executeFormat = adapt.format.bind(adapt);\n    this.executeFont = adapt.font.bind(adapt);\n    this.executeSize = adapt.size.bind(adapt);\n    this.executeSizeAdd = adapt.sizeAdd.bind(adapt);\n    this.executeSizeMinus = adapt.sizeMinus.bind(adapt);\n    this.executeBold = adapt.bold.bind(adapt);\n    this.executeItalic = adapt.italic.bind(adapt);\n    this.executeUnderline = adapt.underline.bind(adapt);\n    this.executeStrikeout = adapt.strikeout.bind(adapt);\n    this.executeSuperscript = adapt.superscript.bind(adapt);\n    this.executeSubscript = adapt.subscript.bind(adapt);\n    this.executeColor = adapt.color.bind(adapt);\n    this.executeHighlight = adapt.highlight.bind(adapt);\n    this.executeTitle = adapt.title.bind(adapt);\n    this.executeList = adapt.list.bind(adapt);\n    this.executeRowFlex = adapt.rowFlex.bind(adapt);\n    this.executeRowMargin = adapt.rowMargin.bind(adapt);\n    this.executeInsertTable = adapt.insertTable.bind(adapt);\n    this.executeInsertTableTopRow = adapt.insertTableTopRow.bind(adapt);\n    this.executeInsertTableBottomRow = adapt.insertTableBottomRow.bind(adapt);\n    this.executeInsertTableLeftCol = adapt.insertTableLeftCol.bind(adapt);\n    this.executeInsertTableRightCol = adapt.insertTableRightCol.bind(adapt);\n    this.executeDeleteTableRow = adapt.deleteTableRow.bind(adapt);\n    this.executeDeleteTableCol = adapt.deleteTableCol.bind(adapt);\n    this.executeDeleteTable = adapt.deleteTable.bind(adapt);\n    this.executeMergeTableCell = adapt.mergeTableCell.bind(adapt);\n    this.executeCancelMergeTableCell = adapt.cancelMergeTableCell.bind(adapt);\n    this.executeTableTdVerticalAlign = adapt.tableTdVerticalAlign.bind(adapt);\n    this.executeTableBorderType = adapt.tableBorderType.bind(adapt);\n    this.executeTableTdBorderType = adapt.tableTdBorderType.bind(adapt);\n    this.executeTableTdSlashType = adapt.tableTdSlashType.bind(adapt);\n    this.executeTableTdBackgroundColor = adapt.tableTdBackgroundColor.bind(adapt);\n    this.executeTableSelectAll = adapt.tableSelectAll.bind(adapt);\n    this.executeImage = adapt.image.bind(adapt);\n    this.executeHyperlink = adapt.hyperlink.bind(adapt);\n    this.executeDeleteHyperlink = adapt.deleteHyperlink.bind(adapt);\n    this.executeCancelHyperlink = adapt.cancelHyperlink.bind(adapt);\n    this.executeEditHyperlink = adapt.editHyperlink.bind(adapt);\n    this.executeSeparator = adapt.separator.bind(adapt);\n    this.executePageBreak = adapt.pageBreak.bind(adapt);\n    this.executeAddWatermark = adapt.addWatermark.bind(adapt);\n    this.executeDeleteWatermark = adapt.deleteWatermark.bind(adapt);\n    this.executeSearch = adapt.search.bind(adapt);\n    this.executeSearchNavigatePre = adapt.searchNavigatePre.bind(adapt);\n    this.executeSearchNavigateNext = adapt.searchNavigateNext.bind(adapt);\n    this.executeReplace = adapt.replace.bind(adapt);\n    this.executePrint = adapt.print.bind(adapt);\n    this.executeReplaceImageElement = adapt.replaceImageElement.bind(adapt);\n    this.executeSaveAsImageElement = adapt.saveAsImageElement.bind(adapt);\n    this.executeChangeImageDisplay = adapt.changeImageDisplay.bind(adapt);\n    this.executePageMode = adapt.pageMode.bind(adapt);\n    this.executePageScaleRecovery = adapt.pageScaleRecovery.bind(adapt);\n    this.executePageScaleMinus = adapt.pageScaleMinus.bind(adapt);\n    this.executePageScaleAdd = adapt.pageScaleAdd.bind(adapt);\n    this.executePaperSize = adapt.paperSize.bind(adapt);\n    this.executePaperDirection = adapt.paperDirection.bind(adapt);\n    this.executeSetPaperMargin = adapt.setPaperMargin.bind(adapt);\n    this.executeInsertElementList = adapt.insertElementList.bind(adapt);\n    this.executeAppendElementList = adapt.appendElementList.bind(adapt);\n    this.executeUpdateElementById = adapt.updateElementById.bind(adapt);\n    this.executeSetValue = adapt.setValue.bind(adapt);\n    this.executeRemoveControl = adapt.removeControl.bind(adapt);\n    this.executeSetLocale = adapt.setLocale.bind(adapt);\n    this.executeLocationCatalog = adapt.locationCatalog.bind(adapt);\n    this.executeWordTool = adapt.wordTool.bind(adapt);\n    this.executeSetHTML = adapt.setHTML.bind(adapt);\n    this.executeSetGroup = adapt.setGroup.bind(adapt);\n    this.executeDeleteGroup = adapt.deleteGroup.bind(adapt);\n    this.executeLocationGroup = adapt.locationGroup.bind(adapt);\n    this.executeSetZone = adapt.setZone.bind(adapt);\n    this.executeUpdateOptions = adapt.updateOptions.bind(adapt);\n    this.executeInsertTitle = adapt.insertTitle.bind(adapt);\n    this.executeFocus = adapt.focus.bind(adapt);\n    this.getImage = adapt.getImage.bind(adapt);\n    this.getOptions = adapt.getOptions.bind(adapt);\n    this.getValue = adapt.getValue.bind(adapt);\n    this.getHTML = adapt.getHTML.bind(adapt);\n    this.getText = adapt.getText.bind(adapt);\n    this.getWordCount = adapt.getWordCount.bind(adapt);\n    this.getCursorPosition = adapt.getCursorPosition.bind(adapt);\n    this.getRange = adapt.getRange.bind(adapt);\n    this.getRangeText = adapt.getRangeText.bind(adapt);\n    this.getRangeContext = adapt.getRangeContext.bind(adapt);\n    this.getRangeRow = adapt.getRangeRow.bind(adapt);\n    this.getRangeParagraph = adapt.getRangeParagraph.bind(adapt);\n    this.getKeywordRangeList = adapt.getKeywordRangeList.bind(adapt);\n    this.getCatalog = adapt.getCatalog.bind(adapt);\n    this.getPaperMargin = adapt.getPaperMargin.bind(adapt);\n    this.getSearchNavigateInfo = adapt.getSearchNavigateInfo.bind(adapt);\n    this.getLocale = adapt.getLocale.bind(adapt);\n    this.getGroupIds = adapt.getGroupIds.bind(adapt);\n    this.getContainer = adapt.getContainer.bind(adapt);\n    this.getTitleValue = adapt.getTitleValue.bind(adapt);\n    this.getPositionContextByEvent = adapt.getPositionContextByEvent.bind(adapt);\n    this.executeSetControlValue = adapt.setControlValue.bind(adapt);\n    this.executeSetControlExtension = adapt.setControlExtension.bind(adapt);\n    this.executeSetControlProperties = adapt.setControlProperties.bind(adapt);\n    this.executeSetControlHighlight = adapt.setControlHighlight.bind(adapt);\n    this.getControlValue = adapt.getControlValue.bind(adapt);\n    this.getControlList = adapt.getControlList.bind(adapt);\n    this.executeLocationControl = adapt.locationControl.bind(adapt);\n    this.executeInsertControl = adapt.insertControl.bind(adapt);\n  }\n}\nfunction convertPxToPaperSize(width, height) {\n  if (width === 1125 && height === 1593) {\n    return {\n      size: \"a3\",\n      width: \"297mm\",\n      height: \"420mm\"\n    };\n  }\n  if (width === 794 && height === 1123) {\n    return {\n      size: \"a4\",\n      width: \"210mm\",\n      height: \"297mm\"\n    };\n  }\n  if (width === 565 && height === 796) {\n    return {\n      size: \"a5\",\n      width: \"148mm\",\n      height: \"210mm\"\n    };\n  }\n  return {\n    size: \"\",\n    width: `${width}px`,\n    height: `${height}px`\n  };\n}\nfunction printImageBase64(base64List, options) {\n  const { width, height, direction = PaperDirection.VERTICAL } = options;\n  const iframe = document.createElement(\"iframe\");\n  iframe.style.visibility = \"hidden\";\n  iframe.style.position = \"absolute\";\n  iframe.style.left = \"0\";\n  iframe.style.top = \"0\";\n  iframe.style.width = \"0\";\n  iframe.style.height = \"0\";\n  iframe.style.border = \"none\";\n  document.body.append(iframe);\n  const contentWindow = iframe.contentWindow;\n  const doc = contentWindow.document;\n  doc.open();\n  const container = document.createElement(\"div\");\n  const paperSize = convertPxToPaperSize(width, height);\n  base64List.forEach((base64) => {\n    const image = document.createElement(\"img\");\n    image.style.width = direction === PaperDirection.HORIZONTAL ? paperSize.height : paperSize.width;\n    image.style.height = direction === PaperDirection.HORIZONTAL ? paperSize.width : paperSize.height;\n    image.src = base64;\n    container.append(image);\n  });\n  const style = document.createElement(\"style\");\n  const stylesheet = `\n  * {\n    margin: 0;\n    padding: 0;\n  }\n  @page {\n    margin: 0;\n    size: ${paperSize.size} ${direction === PaperDirection.HORIZONTAL ? `landscape` : `portrait`};\n  }`;\n  style.append(document.createTextNode(stylesheet));\n  setTimeout(() => {\n    doc.write(`${style.outerHTML}${container.innerHTML}`);\n    contentWindow.print();\n    doc.close();\n    window.addEventListener(\"mouseover\", () => {\n      iframe == null ? void 0 : iframe.remove();\n    }, {\n      once: true\n    });\n  });\n}\nclass CommandAdapt {\n  constructor(draw) {\n    this.draw = draw;\n    this.range = draw.getRange();\n    this.position = draw.getPosition();\n    this.historyManager = draw.getHistoryManager();\n    this.canvasEvent = draw.getCanvasEvent();\n    this.options = draw.getOptions();\n    this.control = draw.getControl();\n    this.workerManager = draw.getWorkerManager();\n    this.searchManager = draw.getSearch();\n    this.i18n = draw.getI18n();\n    this.zone = draw.getZone();\n    this.tableOperate = draw.getTableOperate();\n  }\n  mode(payload) {\n    this.draw.setMode(payload);\n  }\n  cut() {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    this.canvasEvent.cut();\n  }\n  copy() {\n    this.canvasEvent.copy();\n  }\n  paste(payload) {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    pasteByApi(this.canvasEvent, payload);\n  }\n  selectAll() {\n    this.canvasEvent.selectAll();\n  }\n  backspace() {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const elementList = this.draw.getElementList();\n    const { startIndex, endIndex } = this.range.getRange();\n    const isCollapsed = startIndex === endIndex;\n    if (isCollapsed && elementList[startIndex].value === ZERO && startIndex === 0) {\n      return;\n    }\n    if (!isCollapsed) {\n      this.draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex);\n    } else {\n      this.draw.spliceElementList(elementList, startIndex, 1);\n    }\n    const curIndex = isCollapsed ? startIndex - 1 : startIndex;\n    this.range.setRange(curIndex, curIndex);\n    this.draw.render({ curIndex });\n  }\n  setRange(startIndex, endIndex, tableId, startTdIndex, endTdIndex, startTrIndex, endTrIndex) {\n    if (startIndex < 0 || endIndex < 0 || endIndex < startIndex)\n      return;\n    this.range.setRange(startIndex, endIndex, tableId, startTdIndex, endTdIndex, startTrIndex, endTrIndex);\n    const isCollapsed = startIndex === endIndex;\n    this.draw.render({\n      curIndex: isCollapsed ? startIndex : void 0,\n      isCompute: false,\n      isSubmitHistory: false,\n      isSetCursor: isCollapsed\n    });\n  }\n  replaceRange(range) {\n    this.setRange(range.startIndex, range.endIndex, range.tableId, range.startTdIndex, range.endTdIndex, range.startTrIndex, range.endTrIndex);\n  }\n  setPositionContext(range) {\n    const { tableId, startTrIndex, startTdIndex } = range;\n    const elementList = this.draw.getOriginalElementList();\n    if (tableId) {\n      const tableElementIndex = elementList.findIndex((el) => el.id === tableId);\n      if (!~tableElementIndex)\n        return;\n      const tableElement = elementList[tableElementIndex];\n      const tr = tableElement.trList[startTrIndex];\n      const td = tr.tdList[startTdIndex];\n      this.position.setPositionContext({\n        isTable: true,\n        index: tableElementIndex,\n        trIndex: startTrIndex,\n        tdIndex: startTdIndex,\n        tdId: td.id,\n        trId: tr.id,\n        tableId\n      });\n    } else {\n      this.position.setPositionContext({\n        isTable: false\n      });\n    }\n  }\n  forceUpdate(options) {\n    const { isSubmitHistory = false } = options || {};\n    this.range.clearRange();\n    this.draw.render({\n      isSubmitHistory,\n      isSetCursor: false\n    });\n  }\n  blur() {\n    this.range.clearRange();\n    this.draw.getCursor().recoveryCursor();\n  }\n  undo() {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    this.historyManager.undo();\n  }\n  redo() {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    this.historyManager.redo();\n  }\n  painter(options) {\n    if (!options.isDblclick && this.draw.getPainterStyle()) {\n      this.canvasEvent.clearPainterStyle();\n      return;\n    }\n    const selection = this.range.getSelection();\n    if (!selection)\n      return;\n    const painterStyle = {};\n    selection.forEach((s) => {\n      const painterStyleKeys = EDITOR_ELEMENT_STYLE_ATTR;\n      painterStyleKeys.forEach((p) => {\n        const key = p;\n        if (painterStyle[key] === void 0) {\n          painterStyle[key] = s[key];\n        }\n      });\n    });\n    this.draw.setPainterStyle(painterStyle, options);\n  }\n  applyPainterStyle() {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    this.canvasEvent.applyPainterStyle();\n  }\n  format() {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const selection = this.range.getSelectionElementList();\n    let renderOption = {};\n    let changeElementList = [];\n    if (selection == null ? void 0 : selection.length) {\n      changeElementList = selection;\n      renderOption = { isSetCursor: false };\n    } else {\n      const { endIndex } = this.range.getRange();\n      const elementList = this.draw.getElementList();\n      const enterElement = elementList[endIndex];\n      if ((enterElement == null ? void 0 : enterElement.value) === ZERO) {\n        changeElementList.push(enterElement);\n        renderOption = { curIndex: endIndex };\n      }\n    }\n    if (!changeElementList.length)\n      return;\n    changeElementList.forEach((el) => {\n      EDITOR_ELEMENT_STYLE_ATTR.forEach((attr) => {\n        delete el[attr];\n      });\n    });\n    this.draw.render(renderOption);\n  }\n  font(payload) {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const selection = this.range.getSelectionElementList();\n    if (selection == null ? void 0 : selection.length) {\n      selection.forEach((el) => {\n        el.font = payload;\n      });\n      this.draw.render({ isSetCursor: false });\n    } else {\n      const { endIndex } = this.range.getRange();\n      const elementList = this.draw.getElementList();\n      const enterElement = elementList[endIndex];\n      if ((enterElement == null ? void 0 : enterElement.value) === ZERO) {\n        enterElement.font = payload;\n        this.draw.render({ curIndex: endIndex, isCompute: false });\n      }\n    }\n  }\n  size(payload) {\n    const { minSize, maxSize, defaultSize } = this.options;\n    if (payload < minSize || payload > maxSize)\n      return;\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    let renderOption = {};\n    let changeElementList = [];\n    const selection = this.range.getTextLikeSelectionElementList();\n    if (selection == null ? void 0 : selection.length) {\n      changeElementList = selection;\n      renderOption = { isSetCursor: false };\n    } else {\n      const { endIndex } = this.range.getRange();\n      const elementList = this.draw.getElementList();\n      const enterElement = elementList[endIndex];\n      if ((enterElement == null ? void 0 : enterElement.value) === ZERO) {\n        changeElementList.push(enterElement);\n        renderOption = { curIndex: endIndex };\n      }\n    }\n    if (!changeElementList.length)\n      return;\n    let isExistUpdate = false;\n    changeElementList.forEach((el) => {\n      if (!el.size && payload === defaultSize || el.size && el.size === payload) {\n        return;\n      }\n      el.size = payload;\n      isExistUpdate = true;\n    });\n    if (isExistUpdate) {\n      this.draw.render(renderOption);\n    }\n  }\n  sizeAdd() {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const selection = this.range.getTextLikeSelectionElementList();\n    let renderOption = {};\n    let changeElementList = [];\n    if (selection == null ? void 0 : selection.length) {\n      changeElementList = selection;\n      renderOption = { isSetCursor: false };\n    } else {\n      const { endIndex } = this.range.getRange();\n      const elementList = this.draw.getElementList();\n      const enterElement = elementList[endIndex];\n      if ((enterElement == null ? void 0 : enterElement.value) === ZERO) {\n        changeElementList.push(enterElement);\n        renderOption = { curIndex: endIndex };\n      }\n    }\n    if (!changeElementList.length)\n      return;\n    const { defaultSize, maxSize } = this.options;\n    let isExistUpdate = false;\n    changeElementList.forEach((el) => {\n      if (!el.size) {\n        el.size = defaultSize;\n      }\n      if (el.size >= maxSize)\n        return;\n      if (el.size + 2 > maxSize) {\n        el.size = maxSize;\n      } else {\n        el.size += 2;\n      }\n      isExistUpdate = true;\n    });\n    if (isExistUpdate) {\n      this.draw.render(renderOption);\n    }\n  }\n  sizeMinus() {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const selection = this.range.getTextLikeSelectionElementList();\n    let renderOption = {};\n    let changeElementList = [];\n    if (selection == null ? void 0 : selection.length) {\n      changeElementList = selection;\n      renderOption = { isSetCursor: false };\n    } else {\n      const { endIndex } = this.range.getRange();\n      const elementList = this.draw.getElementList();\n      const enterElement = elementList[endIndex];\n      if ((enterElement == null ? void 0 : enterElement.value) === ZERO) {\n        changeElementList.push(enterElement);\n        renderOption = { curIndex: endIndex };\n      }\n    }\n    if (!changeElementList.length)\n      return;\n    const { defaultSize, minSize } = this.options;\n    let isExistUpdate = false;\n    changeElementList.forEach((el) => {\n      if (!el.size) {\n        el.size = defaultSize;\n      }\n      if (el.size <= minSize)\n        return;\n      if (el.size - 2 < minSize) {\n        el.size = minSize;\n      } else {\n        el.size -= 2;\n      }\n      isExistUpdate = true;\n    });\n    if (isExistUpdate) {\n      this.draw.render(renderOption);\n    }\n  }\n  bold() {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const selection = this.range.getSelectionElementList();\n    if (selection == null ? void 0 : selection.length) {\n      const noBoldIndex = selection.findIndex((s) => !s.bold);\n      selection.forEach((el) => {\n        el.bold = !!~noBoldIndex;\n      });\n      this.draw.render({ isSetCursor: false });\n    } else {\n      const { endIndex } = this.range.getRange();\n      const elementList = this.draw.getElementList();\n      const enterElement = elementList[endIndex];\n      if ((enterElement == null ? void 0 : enterElement.value) === ZERO) {\n        enterElement.bold = !enterElement.bold;\n        this.draw.render({ curIndex: endIndex, isCompute: false });\n      }\n    }\n  }\n  italic() {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const selection = this.range.getSelectionElementList();\n    if (selection == null ? void 0 : selection.length) {\n      const noItalicIndex = selection.findIndex((s) => !s.italic);\n      selection.forEach((el) => {\n        el.italic = !!~noItalicIndex;\n      });\n      this.draw.render({ isSetCursor: false });\n    } else {\n      const { endIndex } = this.range.getRange();\n      const elementList = this.draw.getElementList();\n      const enterElement = elementList[endIndex];\n      if ((enterElement == null ? void 0 : enterElement.value) === ZERO) {\n        enterElement.italic = !enterElement.italic;\n        this.draw.render({ curIndex: endIndex, isCompute: false });\n      }\n    }\n  }\n  underline(textDecoration) {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const selection = this.range.getSelectionElementList();\n    if (selection == null ? void 0 : selection.length) {\n      const isSetUnderline = selection.some((s) => !s.underline || !textDecoration && s.textDecoration || textDecoration && !s.textDecoration || textDecoration && s.textDecoration && !isObjectEqual(s.textDecoration, textDecoration));\n      selection.forEach((el) => {\n        el.underline = isSetUnderline;\n        if (isSetUnderline && textDecoration) {\n          el.textDecoration = textDecoration;\n        } else {\n          delete el.textDecoration;\n        }\n      });\n      this.draw.render({\n        isSetCursor: false,\n        isCompute: false\n      });\n    } else {\n      const { endIndex } = this.range.getRange();\n      const elementList = this.draw.getElementList();\n      const enterElement = elementList[endIndex];\n      if ((enterElement == null ? void 0 : enterElement.value) === ZERO) {\n        enterElement.underline = !enterElement.underline;\n        this.draw.render({ curIndex: endIndex, isCompute: false });\n      }\n    }\n  }\n  strikeout() {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const selection = this.range.getSelectionElementList();\n    if (selection == null ? void 0 : selection.length) {\n      const noStrikeoutIndex = selection.findIndex((s) => !s.strikeout);\n      selection.forEach((el) => {\n        el.strikeout = !!~noStrikeoutIndex;\n      });\n      this.draw.render({\n        isSetCursor: false,\n        isCompute: false\n      });\n    } else {\n      const { endIndex } = this.range.getRange();\n      const elementList = this.draw.getElementList();\n      const enterElement = elementList[endIndex];\n      if ((enterElement == null ? void 0 : enterElement.value) === ZERO) {\n        enterElement.strikeout = !enterElement.strikeout;\n        this.draw.render({ curIndex: endIndex, isCompute: false });\n      }\n    }\n  }\n  superscript() {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const selection = this.range.getSelectionElementList();\n    if (!selection)\n      return;\n    const superscriptIndex = selection.findIndex((s) => s.type === ElementType.SUPERSCRIPT);\n    selection.forEach((el) => {\n      if (~superscriptIndex) {\n        if (el.type === ElementType.SUPERSCRIPT) {\n          el.type = ElementType.TEXT;\n          delete el.actualSize;\n        }\n      } else {\n        if (!el.type || el.type === ElementType.TEXT || el.type === ElementType.SUBSCRIPT) {\n          el.type = ElementType.SUPERSCRIPT;\n        }\n      }\n    });\n    this.draw.render({ isSetCursor: false });\n  }\n  subscript() {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const selection = this.range.getSelectionElementList();\n    if (!selection)\n      return;\n    const subscriptIndex = selection.findIndex((s) => s.type === ElementType.SUBSCRIPT);\n    selection.forEach((el) => {\n      if (~subscriptIndex) {\n        if (el.type === ElementType.SUBSCRIPT) {\n          el.type = ElementType.TEXT;\n          delete el.actualSize;\n        }\n      } else {\n        if (!el.type || el.type === ElementType.TEXT || el.type === ElementType.SUPERSCRIPT) {\n          el.type = ElementType.SUBSCRIPT;\n        }\n      }\n    });\n    this.draw.render({ isSetCursor: false });\n  }\n  color(payload) {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const selection = this.range.getSelectionElementList();\n    if (selection == null ? void 0 : selection.length) {\n      selection.forEach((el) => {\n        if (payload) {\n          el.color = payload;\n        } else {\n          delete el.color;\n        }\n      });\n      this.draw.render({\n        isSetCursor: false,\n        isCompute: false\n      });\n    } else {\n      const { endIndex } = this.range.getRange();\n      const elementList = this.draw.getElementList();\n      const enterElement = elementList[endIndex];\n      if ((enterElement == null ? void 0 : enterElement.value) === ZERO) {\n        if (payload) {\n          enterElement.color = payload;\n        } else {\n          delete enterElement.color;\n        }\n        this.draw.render({ curIndex: endIndex, isCompute: false });\n      }\n    }\n  }\n  highlight(payload) {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const selection = this.range.getSelectionElementList();\n    if (selection == null ? void 0 : selection.length) {\n      selection.forEach((el) => {\n        if (payload) {\n          el.highlight = payload;\n        } else {\n          delete el.highlight;\n        }\n      });\n      this.draw.render({\n        isSetCursor: false,\n        isCompute: false\n      });\n    } else {\n      const { endIndex } = this.range.getRange();\n      const elementList = this.draw.getElementList();\n      const enterElement = elementList[endIndex];\n      if ((enterElement == null ? void 0 : enterElement.value) === ZERO) {\n        if (payload) {\n          enterElement.highlight = payload;\n        } else {\n          delete enterElement.highlight;\n        }\n        this.draw.render({ curIndex: endIndex, isCompute: false });\n      }\n    }\n  }\n  title(payload) {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const { startIndex, endIndex } = this.range.getRange();\n    if (!~startIndex && !~endIndex)\n      return;\n    const elementList = this.draw.getElementList();\n    const changeElementList = startIndex === endIndex ? this.range.getRangeParagraphElementList() : elementList.slice(startIndex + 1, endIndex + 1);\n    if (!changeElementList || !changeElementList.length)\n      return;\n    const titleId = getUUID();\n    const titleOptions = this.draw.getOptions().title;\n    changeElementList.forEach((el) => {\n      if (!el.type && el.value === ZERO)\n        return;\n      if (payload) {\n        el.level = payload;\n        el.titleId = titleId;\n        if (isTextLikeElement(el)) {\n          el.size = titleOptions[titleSizeMapping[payload]];\n          el.bold = true;\n        }\n      } else {\n        if (el.titleId) {\n          delete el.titleId;\n          delete el.title;\n          delete el.level;\n          delete el.size;\n          delete el.bold;\n        }\n      }\n    });\n    const isSetCursor = startIndex === endIndex;\n    const curIndex = isSetCursor ? endIndex : startIndex;\n    this.draw.render({ curIndex, isSetCursor });\n  }\n  list(listType, listStyle) {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    this.draw.getListParticle().setList(listType, listStyle);\n  }\n  rowFlex(payload) {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    const { startIndex, endIndex } = this.range.getRange();\n    if (!~startIndex && !~endIndex)\n      return;\n    const rowElementList = this.range.getRangeRowElementList();\n    if (!rowElementList)\n      return;\n    rowElementList.forEach((element) => {\n      element.rowFlex = payload;\n    });\n    const isSetCursor = startIndex === endIndex;\n    const curIndex = isSetCursor ? endIndex : startIndex;\n    this.draw.render({ curIndex, isSetCursor });\n  }\n  rowMargin(payload) {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    const { startIndex, endIndex } = this.range.getRange();\n    if (!~startIndex && !~endIndex)\n      return;\n    const rowElementList = this.range.getRangeRowElementList();\n    if (!rowElementList)\n      return;\n    rowElementList.forEach((element) => {\n      element.rowMargin = payload;\n    });\n    const isSetCursor = startIndex === endIndex;\n    const curIndex = isSetCursor ? endIndex : startIndex;\n    this.draw.render({ curIndex, isSetCursor });\n  }\n  insertTable(row, col) {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const activeControl = this.control.getActiveControl();\n    if (activeControl)\n      return;\n    this.tableOperate.insertTable(row, col);\n  }\n  insertTableTopRow() {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    this.tableOperate.insertTableTopRow();\n  }\n  insertTableBottomRow() {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    this.tableOperate.insertTableBottomRow();\n  }\n  insertTableLeftCol() {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    this.tableOperate.insertTableLeftCol();\n  }\n  insertTableRightCol() {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    this.tableOperate.insertTableRightCol();\n  }\n  deleteTableRow() {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    this.tableOperate.deleteTableRow();\n  }\n  deleteTableCol() {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    this.tableOperate.deleteTableCol();\n  }\n  deleteTable() {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    this.tableOperate.deleteTable();\n  }\n  mergeTableCell() {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    this.tableOperate.mergeTableCell();\n  }\n  cancelMergeTableCell() {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    this.tableOperate.cancelMergeTableCell();\n  }\n  tableTdVerticalAlign(payload) {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    this.tableOperate.tableTdVerticalAlign(payload);\n  }\n  tableBorderType(payload) {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    this.tableOperate.tableBorderType(payload);\n  }\n  tableTdBorderType(payload) {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    this.tableOperate.tableTdBorderType(payload);\n  }\n  tableTdSlashType(payload) {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    this.tableOperate.tableTdSlashType(payload);\n  }\n  tableTdBackgroundColor(payload) {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    this.tableOperate.tableTdBackgroundColor(payload);\n  }\n  tableSelectAll() {\n    this.tableOperate.tableSelectAll();\n  }\n  hyperlink(payload) {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const activeControl = this.control.getActiveControl();\n    if (activeControl)\n      return;\n    const { startIndex, endIndex } = this.range.getRange();\n    if (!~startIndex && !~endIndex)\n      return;\n    const elementList = this.draw.getElementList();\n    const { valueList, url } = payload;\n    const hyperlinkId = getUUID();\n    const newElementList = valueList == null ? void 0 : valueList.map((v) => ({\n      url,\n      hyperlinkId,\n      value: v.value,\n      type: ElementType.HYPERLINK\n    }));\n    if (!newElementList)\n      return;\n    const start = startIndex + 1;\n    formatElementContext(elementList, newElementList, startIndex, {\n      editorOptions: this.options\n    });\n    this.draw.spliceElementList(elementList, start, startIndex === endIndex ? 0 : endIndex - startIndex, ...newElementList);\n    const curIndex = start + newElementList.length - 1;\n    this.range.setRange(curIndex, curIndex);\n    this.draw.render({ curIndex });\n  }\n  getHyperlinkRange() {\n    let leftIndex = -1;\n    let rightIndex = -1;\n    const { startIndex, endIndex } = this.range.getRange();\n    if (!~startIndex && !~endIndex)\n      return null;\n    const elementList = this.draw.getElementList();\n    const startElement = elementList[startIndex];\n    if (startElement.type !== ElementType.HYPERLINK)\n      return null;\n    let preIndex = startIndex;\n    while (preIndex > 0) {\n      const preElement = elementList[preIndex];\n      if (preElement.hyperlinkId !== startElement.hyperlinkId) {\n        leftIndex = preIndex + 1;\n        break;\n      }\n      preIndex--;\n    }\n    let nextIndex = startIndex + 1;\n    while (nextIndex < elementList.length) {\n      const nextElement = elementList[nextIndex];\n      if (nextElement.hyperlinkId !== startElement.hyperlinkId) {\n        rightIndex = nextIndex - 1;\n        break;\n      }\n      nextIndex++;\n    }\n    if (nextIndex === elementList.length) {\n      rightIndex = nextIndex - 1;\n    }\n    if (!~leftIndex || !~rightIndex)\n      return null;\n    return [leftIndex, rightIndex];\n  }\n  deleteHyperlink() {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const hyperRange = this.getHyperlinkRange();\n    if (!hyperRange)\n      return;\n    const elementList = this.draw.getElementList();\n    const [leftIndex, rightIndex] = hyperRange;\n    this.draw.spliceElementList(elementList, leftIndex, rightIndex - leftIndex + 1);\n    this.draw.getHyperlinkParticle().clearHyperlinkPopup();\n    const newIndex = leftIndex - 1;\n    this.range.setRange(newIndex, newIndex);\n    this.draw.render({\n      curIndex: newIndex\n    });\n  }\n  cancelHyperlink() {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const hyperRange = this.getHyperlinkRange();\n    if (!hyperRange)\n      return;\n    const elementList = this.draw.getElementList();\n    const [leftIndex, rightIndex] = hyperRange;\n    for (let i = leftIndex; i <= rightIndex; i++) {\n      const element = elementList[i];\n      delete element.type;\n      delete element.url;\n      delete element.hyperlinkId;\n      delete element.underline;\n    }\n    this.draw.getHyperlinkParticle().clearHyperlinkPopup();\n    const { endIndex } = this.range.getRange();\n    this.draw.render({\n      curIndex: endIndex,\n      isCompute: false\n    });\n  }\n  editHyperlink(payload) {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const hyperRange = this.getHyperlinkRange();\n    if (!hyperRange)\n      return;\n    const elementList = this.draw.getElementList();\n    const [leftIndex, rightIndex] = hyperRange;\n    for (let i = leftIndex; i <= rightIndex; i++) {\n      const element = elementList[i];\n      element.url = payload;\n    }\n    this.draw.getHyperlinkParticle().clearHyperlinkPopup();\n    const { endIndex } = this.range.getRange();\n    this.draw.render({\n      curIndex: endIndex,\n      isCompute: false\n    });\n  }\n  separator(payload, lineWidth, color) {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const activeControl = this.control.getActiveControl();\n    if (activeControl)\n      return;\n    const { startIndex, endIndex } = this.range.getRange();\n    if (!~startIndex && !~endIndex)\n      return;\n    const elementList = this.draw.getElementList();\n    let curIndex = -1;\n    const endElement = elementList[endIndex + 1];\n    if (endElement && endElement.type === ElementType.SEPARATOR) {\n      if (endElement.dashArray && endElement.dashArray.join() === payload.join() && endElement.color === color && endElement.lineWidth === lineWidth) {\n        return;\n      }\n      curIndex = endIndex;\n      endElement.dashArray = payload;\n      endElement.color = color;\n      endElement.lineWidth = lineWidth;\n    } else {\n      const newElement = {\n        value: WRAP,\n        type: ElementType.SEPARATOR,\n        dashArray: payload,\n        lineWidth,\n        color\n      };\n      formatElementContext(elementList, [newElement], startIndex, {\n        editorOptions: this.options\n      });\n      if (startIndex !== 0 && elementList[startIndex].value === ZERO) {\n        this.draw.spliceElementList(elementList, startIndex, 1, newElement);\n        curIndex = startIndex - 1;\n      } else {\n        this.draw.spliceElementList(elementList, startIndex + 1, 0, newElement);\n        curIndex = startIndex;\n      }\n    }\n    this.range.setRange(curIndex, curIndex);\n    this.draw.render({ curIndex });\n  }\n  pageBreak() {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const activeControl = this.control.getActiveControl();\n    if (activeControl)\n      return;\n    this.insertElementList([\n      {\n        type: ElementType.PAGE_BREAK,\n        value: WRAP\n      }\n    ]);\n  }\n  addWatermark(payload) {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    const options = this.draw.getOptions();\n    const { color, size, opacity, font } = defaultWatermarkOption;\n    options.watermark.data = payload.data;\n    options.watermark.color = payload.color || color;\n    options.watermark.size = payload.size || size;\n    options.watermark.opacity = payload.opacity || opacity;\n    options.watermark.font = payload.font || font;\n    this.draw.render({\n      isSetCursor: false,\n      isSubmitHistory: false,\n      isCompute: false\n    });\n  }\n  deleteWatermark() {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    const options = this.draw.getOptions();\n    if (options.watermark && options.watermark.data) {\n      options.watermark = { ...defaultWatermarkOption };\n      this.draw.render({\n        isSetCursor: false,\n        isSubmitHistory: false,\n        isCompute: false\n      });\n    }\n  }\n  image(payload) {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const { startIndex, endIndex } = this.range.getRange();\n    if (!~startIndex && !~endIndex)\n      return;\n    const { value, width, height, imgDisplay } = payload;\n    this.insertElementList([\n      {\n        value,\n        width,\n        height,\n        id: getUUID(),\n        type: ElementType.IMAGE,\n        imgDisplay\n      }\n    ]);\n  }\n  search(payload) {\n    this.searchManager.setSearchKeyword(payload);\n    this.draw.render({\n      isSetCursor: false,\n      isSubmitHistory: false\n    });\n  }\n  searchNavigatePre() {\n    const index2 = this.searchManager.searchNavigatePre();\n    if (index2 === null)\n      return;\n    this.draw.render({\n      isSetCursor: false,\n      isSubmitHistory: false,\n      isCompute: false,\n      isLazy: false\n    });\n  }\n  searchNavigateNext() {\n    const index2 = this.searchManager.searchNavigateNext();\n    if (index2 === null)\n      return;\n    this.draw.render({\n      isSetCursor: false,\n      isSubmitHistory: false,\n      isCompute: false,\n      isLazy: false\n    });\n  }\n  getSearchNavigateInfo() {\n    return this.searchManager.getSearchNavigateInfo();\n  }\n  replace(payload) {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    if (!payload || new RegExp(`${ZERO}`, \"g\").test(payload))\n      return;\n    const matchList = this.draw.getSearch().getSearchMatchList();\n    if (!matchList.length)\n      return;\n    let pageDiffCount = 0;\n    let tableDiffCount = 0;\n    let curGroupId = \"\";\n    let curTdId = \"\";\n    let firstMatchIndex = -1;\n    const elementList = this.draw.getOriginalElementList();\n    for (let m = 0; m < matchList.length; m++) {\n      const match = matchList[m];\n      if (match.type === EditorContext.TABLE) {\n        const { tableIndex, trIndex, tdIndex, index: index2, tdId } = match;\n        if (curTdId && tdId !== curTdId) {\n          tableDiffCount = 0;\n        }\n        curTdId = tdId;\n        const curTableIndex = tableIndex + pageDiffCount;\n        const tableElementList = elementList[curTableIndex].trList[trIndex].tdList[tdIndex].value;\n        const curIndex = index2 + tableDiffCount;\n        const tableElement = tableElementList[curIndex];\n        if (curGroupId === match.groupId) {\n          this.draw.spliceElementList(tableElementList, curIndex, 1);\n          tableDiffCount--;\n          continue;\n        }\n        for (let p = 0; p < payload.length; p++) {\n          const value = payload[p];\n          if (p === 0) {\n            tableElement.value = value;\n          } else {\n            this.draw.spliceElementList(tableElementList, curIndex + p, 0, {\n              ...tableElement,\n              value\n            });\n            tableDiffCount++;\n          }\n        }\n      } else {\n        const curIndex = match.index + pageDiffCount;\n        const element = elementList[curIndex];\n        if (element.type === ElementType.CONTROL && element.controlComponent !== ControlComponent.VALUE) {\n          continue;\n        }\n        if (!~firstMatchIndex) {\n          firstMatchIndex = m;\n        }\n        if (curGroupId === match.groupId) {\n          this.draw.spliceElementList(elementList, curIndex, 1);\n          pageDiffCount--;\n          continue;\n        }\n        for (let p = 0; p < payload.length; p++) {\n          const value = payload[p];\n          if (p === 0) {\n            element.value = value;\n          } else {\n            this.draw.spliceElementList(elementList, curIndex + p, 0, {\n              ...element,\n              value\n            });\n            pageDiffCount++;\n          }\n        }\n      }\n      curGroupId = match.groupId;\n    }\n    if (!~firstMatchIndex)\n      return;\n    const firstMatch = matchList[firstMatchIndex];\n    const firstIndex = firstMatch.index + (payload.length - 1);\n    if (firstMatch.type === EditorContext.TABLE) {\n      const { tableIndex, trIndex, tdIndex, index: index2 } = firstMatch;\n      const element = elementList[tableIndex].trList[trIndex].tdList[tdIndex].value[index2];\n      this.position.setPositionContext({\n        isTable: true,\n        index: tableIndex,\n        trIndex,\n        tdIndex,\n        tdId: element.tdId,\n        trId: element.trId,\n        tableId: element.tableId\n      });\n    } else {\n      this.position.setPositionContext({\n        isTable: false\n      });\n    }\n    this.range.setRange(firstIndex, firstIndex);\n    this.draw.render({\n      curIndex: firstIndex\n    });\n  }\n  async print() {\n    const { scale, printPixelRatio, paperDirection, width, height } = this.options;\n    if (scale !== 1) {\n      this.draw.setPageScale(1);\n    }\n    const base64List = await this.draw.getDataURL({\n      pixelRatio: printPixelRatio,\n      mode: EditorMode.PRINT\n    });\n    printImageBase64(base64List, {\n      width,\n      height,\n      direction: paperDirection\n    });\n    if (scale !== 1) {\n      this.draw.setPageScale(scale);\n    }\n  }\n  replaceImageElement(payload) {\n    const { startIndex } = this.range.getRange();\n    const elementList = this.draw.getElementList();\n    const element = elementList[startIndex];\n    if (!element || element.type !== ElementType.IMAGE)\n      return;\n    element.id = getUUID();\n    element.value = payload;\n    this.draw.render({\n      isSetCursor: false\n    });\n  }\n  saveAsImageElement() {\n    const { startIndex } = this.range.getRange();\n    const elementList = this.draw.getElementList();\n    const element = elementList[startIndex];\n    if (!element || element.type !== ElementType.IMAGE)\n      return;\n    downloadFile(element.value, `${element.id}.png`);\n  }\n  changeImageDisplay(element, display) {\n    if (element.imgDisplay === display)\n      return;\n    element.imgDisplay = display;\n    const { startIndex, endIndex } = this.range.getRange();\n    if (display === ImageDisplay.SURROUND || display === ImageDisplay.FLOAT_TOP || display === ImageDisplay.FLOAT_BOTTOM) {\n      const positionList = this.position.getPositionList();\n      const { pageNo, coordinate: { leftTop } } = positionList[startIndex];\n      element.imgFloatPosition = {\n        pageNo,\n        x: leftTop[0],\n        y: leftTop[1]\n      };\n    } else {\n      delete element.imgFloatPosition;\n    }\n    this.draw.getPreviewer().clearResizer();\n    this.draw.render({\n      isSetCursor: true,\n      curIndex: endIndex\n    });\n  }\n  getImage(payload) {\n    return this.draw.getDataURL(payload);\n  }\n  getOptions() {\n    return this.options;\n  }\n  getValue(options) {\n    return this.draw.getValue(options);\n  }\n  getHTML() {\n    const options = this.options;\n    const headerElementList = this.draw.getHeaderElementList();\n    const mainElementList = this.draw.getOriginalMainElementList();\n    const footerElementList = this.draw.getFooterElementList();\n    return {\n      header: createDomFromElementList(headerElementList, options).innerHTML,\n      main: createDomFromElementList(mainElementList, options).innerHTML,\n      footer: createDomFromElementList(footerElementList, options).innerHTML\n    };\n  }\n  getText() {\n    const headerElementList = this.draw.getHeaderElementList();\n    const mainElementList = this.draw.getOriginalMainElementList();\n    const footerElementList = this.draw.getFooterElementList();\n    return {\n      header: getTextFromElementList(headerElementList),\n      main: getTextFromElementList(mainElementList),\n      footer: getTextFromElementList(footerElementList)\n    };\n  }\n  getWordCount() {\n    return this.workerManager.getWordCount();\n  }\n  getCursorPosition() {\n    return this.position.getCursorPosition();\n  }\n  getRange() {\n    return deepClone(this.range.getRange());\n  }\n  getRangeText() {\n    return this.range.toString();\n  }\n  getRangeContext() {\n    const range = this.range.getRange();\n    const { startIndex, endIndex } = range;\n    if (!~startIndex && !~endIndex)\n      return null;\n    const isCollapsed = startIndex === endIndex;\n    const selectionText = this.range.toString();\n    const selectionElementList = zipElementList(this.range.getSelectionElementList() || []);\n    const elementList = this.draw.getElementList();\n    const startElement = pickElementAttr(elementList[isCollapsed ? startIndex : startIndex + 1], {\n      extraPickAttrs: [\"id\"]\n    });\n    const endElement = pickElementAttr(elementList[endIndex], {\n      extraPickAttrs: [\"id\"]\n    });\n    const positionList = this.position.getPositionList();\n    const startPageNo = positionList[startIndex].pageNo;\n    const endPageNo = positionList[endIndex].pageNo;\n    const rangeRects = [];\n    const height = this.draw.getOriginalHeight();\n    const pageGap = this.draw.getOriginalPageGap();\n    const selectionPositionList = this.position.getSelectionPositionList();\n    if (selectionPositionList) {\n      let currentRowNo = null;\n      let currentX = 0;\n      let rangeRect = null;\n      for (let p = 0; p < selectionPositionList.length; p++) {\n        const { rowNo, pageNo, coordinate: { leftTop, rightTop }, lineHeight } = selectionPositionList[p];\n        if (currentRowNo === null || currentRowNo !== rowNo) {\n          if (rangeRect) {\n            rangeRects.push(rangeRect);\n          }\n          rangeRect = {\n            x: leftTop[0],\n            y: leftTop[1] + pageNo * (height + pageGap),\n            width: rightTop[0] - leftTop[0],\n            height: lineHeight\n          };\n          currentRowNo = rowNo;\n          currentX = leftTop[0];\n        } else {\n          rangeRect.width = rightTop[0] - currentX;\n        }\n        if (p === selectionPositionList.length - 1 && rangeRect) {\n          rangeRects.push(rangeRect);\n        }\n      }\n    } else {\n      const positionList2 = this.position.getPositionList();\n      const position = positionList2[endIndex];\n      const { coordinate: { rightTop }, pageNo, lineHeight } = position;\n      rangeRects.push({\n        x: rightTop[0],\n        y: rightTop[1] + pageNo * (height + pageGap),\n        width: 0,\n        height: lineHeight\n      });\n    }\n    const zone2 = this.draw.getZone().getZone();\n    const { isTable, trIndex, tdIndex, index: index2 } = this.position.getPositionContext();\n    let tableElement = null;\n    if (isTable) {\n      const originalElementList = this.draw.getOriginalElementList();\n      const originTableElement = originalElementList[index2] || null;\n      if (originTableElement) {\n        tableElement = zipElementList([originTableElement])[0];\n      }\n    }\n    let titleId = null;\n    let titleStartPageNo = null;\n    let start = startIndex - 1;\n    while (start > 0) {\n      const curElement = elementList[start];\n      const preElement = elementList[start - 1];\n      if (curElement.titleId && curElement.titleId !== (preElement == null ? void 0 : preElement.titleId)) {\n        titleId = curElement.titleId;\n        titleStartPageNo = positionList[start].pageNo;\n        break;\n      }\n      start--;\n    }\n    return deepClone({\n      isCollapsed,\n      startElement,\n      endElement,\n      startPageNo,\n      endPageNo,\n      rangeRects,\n      zone: zone2,\n      isTable,\n      trIndex: trIndex != null ? trIndex : null,\n      tdIndex: tdIndex != null ? tdIndex : null,\n      tableElement,\n      selectionText,\n      selectionElementList,\n      titleId,\n      titleStartPageNo\n    });\n  }\n  getRangeRow() {\n    const rowElementList = this.range.getRangeRowElementList();\n    return rowElementList ? zipElementList(rowElementList) : null;\n  }\n  getRangeParagraph() {\n    const paragraphElementList = this.range.getRangeParagraphElementList();\n    return paragraphElementList ? zipElementList(paragraphElementList) : null;\n  }\n  getKeywordRangeList(payload) {\n    return this.range.getKeywordRangeList(payload);\n  }\n  pageMode(payload) {\n    this.draw.setPageMode(payload);\n  }\n  pageScaleRecovery() {\n    const { scale } = this.options;\n    if (scale !== 1) {\n      this.draw.setPageScale(1);\n    }\n  }\n  pageScaleMinus() {\n    const { scale } = this.options;\n    const nextScale = scale * 10 - 1;\n    if (nextScale >= 5) {\n      this.draw.setPageScale(nextScale / 10);\n    }\n  }\n  pageScaleAdd() {\n    const { scale } = this.options;\n    const nextScale = scale * 10 + 1;\n    if (nextScale <= 30) {\n      this.draw.setPageScale(nextScale / 10);\n    }\n  }\n  paperSize(width, height) {\n    this.draw.setPaperSize(width, height);\n  }\n  paperDirection(payload) {\n    this.draw.setPaperDirection(payload);\n  }\n  getPaperMargin() {\n    return this.options.margins;\n  }\n  setPaperMargin(payload) {\n    return this.draw.setPaperMargin(payload);\n  }\n  insertElementList(payload) {\n    if (!payload.length)\n      return;\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const cloneElementList = deepClone(payload);\n    const { startIndex } = this.range.getRange();\n    const elementList = this.draw.getElementList();\n    formatElementContext(elementList, cloneElementList, startIndex, {\n      isBreakWhenWrap: true,\n      editorOptions: this.options\n    });\n    this.draw.insertElementList(cloneElementList);\n  }\n  appendElementList(elementList, options) {\n    if (!elementList.length)\n      return;\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    this.draw.appendElementList(deepClone(elementList), options);\n  }\n  updateElementById(payload) {\n    function getElementIndexById(elementList) {\n      for (let e = 0; e < elementList.length; e++) {\n        const element = elementList[e];\n        if (element.id === payload.id) {\n          return e;\n        }\n      }\n      return -1;\n    }\n    const getElementListFnList = [\n      this.draw.getOriginalMainElementList,\n      this.draw.getHeaderElementList,\n      this.draw.getFooterElementList\n    ];\n    for (const getElementList of getElementListFnList) {\n      const elementList = getElementList.call(this.draw);\n      const elementIndex = getElementIndexById(elementList);\n      if (~elementIndex) {\n        elementList[elementIndex] = {\n          ...elementList[elementIndex],\n          ...payload.properties\n        };\n        formatElementList(zipElementList([elementList[elementIndex]]), {\n          isHandleFirstElement: false,\n          editorOptions: this.options\n        });\n        this.draw.render({\n          isSetCursor: false\n        });\n        break;\n      }\n    }\n  }\n  setValue(payload, options) {\n    this.draw.setValue(payload, options);\n  }\n  removeControl() {\n    const { startIndex, endIndex } = this.range.getRange();\n    if (startIndex !== endIndex)\n      return;\n    const elementList = this.draw.getElementList();\n    const element = elementList[startIndex];\n    if (!element.controlId)\n      return;\n    const control = this.draw.getControl();\n    const newIndex = control.removeControl(startIndex);\n    if (newIndex === null)\n      return;\n    this.range.setRange(newIndex, newIndex);\n    this.draw.render({\n      curIndex: newIndex\n    });\n  }\n  setLocale(payload) {\n    this.i18n.setLocale(payload);\n  }\n  getLocale() {\n    return this.i18n.getLocale();\n  }\n  getCatalog() {\n    return this.workerManager.getCatalog();\n  }\n  locationCatalog(titleId) {\n    var _a;\n    const elementList = this.draw.getMainElementList();\n    let newIndex = -1;\n    for (let e = 0; e < elementList.length; e++) {\n      const element = elementList[e];\n      if (element.titleId === titleId && ((_a = elementList[e + 1]) == null ? void 0 : _a.titleId) !== titleId) {\n        newIndex = e;\n        break;\n      }\n    }\n    if (!~newIndex)\n      return;\n    this.range.setRange(newIndex, newIndex);\n    this.draw.render({\n      curIndex: newIndex,\n      isCompute: false,\n      isSubmitHistory: false\n    });\n  }\n  wordTool() {\n    const elementList = this.draw.getMainElementList();\n    let isApply = false;\n    for (let i = 0; i < elementList.length; i++) {\n      const element = elementList[i];\n      if (element.value === ZERO) {\n        while (i + 1 < elementList.length) {\n          const nextElement = elementList[i + 1];\n          if (nextElement.value !== ZERO && nextElement.value !== NBSP)\n            break;\n          elementList.splice(i + 1, 1);\n          isApply = true;\n        }\n      }\n    }\n    if (!isApply) {\n      const isCollapsed = this.range.getIsCollapsed();\n      this.draw.getCursor().drawCursor({\n        isShow: isCollapsed\n      });\n    } else {\n      this.draw.render({\n        isSetCursor: false\n      });\n    }\n  }\n  setHTML(payload) {\n    const { header, main, footer } = payload;\n    const innerWidth = this.draw.getOriginalInnerWidth();\n    const getElementList = (htmlText) => htmlText !== void 0 ? getElementListByHTML(htmlText, {\n      innerWidth\n    }) : void 0;\n    this.setValue({\n      header: getElementList(header),\n      main: getElementList(main),\n      footer: getElementList(footer)\n    });\n  }\n  setGroup() {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return null;\n    return this.draw.getGroup().setGroup();\n  }\n  deleteGroup(groupId) {\n    const isReadonly = this.draw.isReadonly();\n    if (isReadonly)\n      return;\n    this.draw.getGroup().deleteGroup(groupId);\n  }\n  getGroupIds() {\n    return this.draw.getWorkerManager().getGroupIds();\n  }\n  locationGroup(groupId) {\n    const elementList = this.draw.getOriginalMainElementList();\n    const context = this.draw.getGroup().getContextByGroupId(elementList, groupId);\n    if (!context)\n      return;\n    const { isTable, index: index2, trIndex, tdIndex, tdId, trId, tableId, endIndex } = context;\n    this.position.setPositionContext({\n      isTable,\n      index: index2,\n      trIndex,\n      tdIndex,\n      tdId,\n      trId,\n      tableId\n    });\n    this.range.setRange(endIndex, endIndex);\n    this.draw.render({\n      curIndex: endIndex,\n      isCompute: false,\n      isSubmitHistory: false\n    });\n  }\n  setZone(zone2) {\n    this.draw.getZone().setZone(zone2);\n  }\n  getControlValue(payload) {\n    return this.draw.getControl().getValueById(payload);\n  }\n  setControlValue(payload) {\n    this.draw.getControl().setValueById(payload);\n  }\n  setControlExtension(payload) {\n    this.draw.getControl().setExtensionById(payload);\n  }\n  setControlProperties(payload) {\n    this.draw.getControl().setPropertiesById(payload);\n  }\n  setControlHighlight(payload) {\n    this.draw.getControl().setHighlightList(payload);\n    this.draw.render({\n      isSubmitHistory: false\n    });\n  }\n  updateOptions(payload) {\n    const newOption = mergeOption(payload);\n    Object.entries(newOption).forEach(([key, value]) => {\n      Reflect.set(this.options, key, value);\n    });\n    this.forceUpdate();\n  }\n  getControlList() {\n    return this.draw.getControl().getList();\n  }\n  locationControl(controlId, options) {\n    const isLocationAfter = (options == null ? void 0 : options.position) === LocationPosition.AFTER;\n    function location(elementList, zone2) {\n      let i = 0;\n      while (i < elementList.length) {\n        const element = elementList[i];\n        i++;\n        if (element.type === ElementType.TABLE) {\n          const trList = element.trList;\n          for (let r = 0; r < trList.length; r++) {\n            const tr = trList[r];\n            for (let d = 0; d < tr.tdList.length; d++) {\n              const td = tr.tdList[d];\n              const locationContext = location(td.value, zone2);\n              if (locationContext) {\n                return {\n                  ...locationContext,\n                  positionContext: {\n                    isTable: true,\n                    index: i - 1,\n                    trIndex: r,\n                    tdIndex: d,\n                    tdId: element.tdId,\n                    trId: element.trId,\n                    tableId: element.tableId\n                  }\n                };\n              }\n            }\n          }\n        }\n        if ((element == null ? void 0 : element.controlId) !== controlId)\n          continue;\n        let curIndex = i - 1;\n        if (isLocationAfter) {\n          curIndex -= 1;\n          if (element.controlComponent !== ControlComponent.PLACEHOLDER && element.controlComponent !== ControlComponent.POSTFIX) {\n            continue;\n          }\n        }\n        return {\n          zone: zone2,\n          range: {\n            startIndex: curIndex,\n            endIndex: curIndex\n          },\n          positionContext: {\n            isTable: false\n          }\n        };\n      }\n      return null;\n    }\n    const data2 = [\n      {\n        zone: EditorZone.HEADER,\n        elementList: this.draw.getHeaderElementList()\n      },\n      {\n        zone: EditorZone.MAIN,\n        elementList: this.draw.getOriginalMainElementList()\n      },\n      {\n        zone: EditorZone.FOOTER,\n        elementList: this.draw.getFooterElementList()\n      }\n    ];\n    for (const context of data2) {\n      const locationContext = location(context.elementList, context.zone);\n      if (locationContext) {\n        this.setZone(locationContext.zone);\n        this.position.setPositionContext(locationContext.positionContext);\n        this.range.replaceRange(locationContext.range);\n        this.draw.render({\n          curIndex: locationContext.range.startIndex,\n          isCompute: false,\n          isSubmitHistory: false\n        });\n        break;\n      }\n    }\n  }\n  insertControl(payload) {\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const cloneElement = deepClone(payload);\n    const { startIndex } = this.range.getRange();\n    const elementList = this.draw.getElementList();\n    const copyElement = getAnchorElement(elementList, startIndex);\n    if (!copyElement)\n      return;\n    const cloneAttr = [\n      ...TABLE_CONTEXT_ATTR,\n      ...EDITOR_ROW_ATTR,\n      ...LIST_CONTEXT_ATTR\n    ];\n    cloneProperty(cloneAttr, copyElement, cloneElement);\n    this.draw.insertElementList([cloneElement]);\n  }\n  getContainer() {\n    return this.draw.getContainer();\n  }\n  getTitleValue(payload) {\n    const { conceptId } = payload;\n    const result = [];\n    const getValue = (elementList, zone2) => {\n      var _a;\n      let i = 0;\n      while (i < elementList.length) {\n        const element = elementList[i];\n        i++;\n        if (element.type === ElementType.TABLE) {\n          const trList = element.trList;\n          for (let r = 0; r < trList.length; r++) {\n            const tr = trList[r];\n            for (let d = 0; d < tr.tdList.length; d++) {\n              const td = tr.tdList[d];\n              getValue(td.value, zone2);\n            }\n          }\n        }\n        if (((_a = element == null ? void 0 : element.title) == null ? void 0 : _a.conceptId) !== conceptId)\n          continue;\n        const valueList = [];\n        let j = i;\n        while (j < elementList.length) {\n          const nextElement = elementList[j];\n          j++;\n          if (element.titleId === nextElement.titleId)\n            continue;\n          if (nextElement.level && titleOrderNumberMapping[nextElement.level] <= titleOrderNumberMapping[element.level]) {\n            break;\n          }\n          valueList.push(nextElement);\n        }\n        result.push({\n          ...element.title,\n          value: getTextFromElementList(valueList),\n          elementList: zipElementList(valueList),\n          zone: zone2\n        });\n        i = j;\n      }\n    };\n    const data2 = [\n      {\n        zone: EditorZone.HEADER,\n        elementList: this.draw.getHeaderElementList()\n      },\n      {\n        zone: EditorZone.MAIN,\n        elementList: this.draw.getOriginalMainElementList()\n      },\n      {\n        zone: EditorZone.FOOTER,\n        elementList: this.draw.getFooterElementList()\n      }\n    ];\n    for (const { zone: zone2, elementList } of data2) {\n      getValue(elementList, zone2);\n    }\n    return result;\n  }\n  getPositionContextByEvent(evt) {\n    var _a, _b, _c;\n    const pageIndex = (_a = evt.target) == null ? void 0 : _a.dataset.index;\n    if (!pageIndex)\n      return null;\n    const pageNo = Number(pageIndex);\n    const positionContext = this.position.getPositionByXY({\n      x: evt.offsetX,\n      y: evt.offsetY,\n      pageNo\n    });\n    const { isDirectHit, isTable, index: index2, trIndex, tdIndex, tdValueIndex, zone: zone2 } = positionContext;\n    if (!isDirectHit || zone2 && zone2 !== this.zone.getZone())\n      return null;\n    let element = null;\n    const elementList = this.draw.getOriginalElementList();\n    let position = null;\n    const positionList = this.position.getOriginalPositionList();\n    if (isTable) {\n      const td = (_b = elementList[index2].trList) == null ? void 0 : _b[trIndex].tdList[tdIndex];\n      element = (td == null ? void 0 : td.value[tdValueIndex]) || null;\n      position = ((_c = td == null ? void 0 : td.positionList) == null ? void 0 : _c[tdValueIndex]) || null;\n    } else {\n      element = elementList[index2] || null;\n      position = positionList[index2] || null;\n    }\n    let rangeRect = null;\n    if (position) {\n      const { pageNo: pageNo2, coordinate: { leftTop, rightTop }, lineHeight } = position;\n      const height = this.draw.getOriginalHeight();\n      const pageGap = this.draw.getOriginalPageGap();\n      rangeRect = {\n        x: leftTop[0],\n        y: leftTop[1] + pageNo2 * (height + pageGap),\n        width: rightTop[0] - leftTop[0],\n        height: lineHeight\n      };\n    }\n    return {\n      pageNo,\n      element,\n      rangeRect\n    };\n  }\n  insertTitle(payload) {\n    var _a;\n    const isDisabled = this.draw.isReadonly() || this.draw.isDisabled();\n    if (isDisabled)\n      return;\n    const cloneElement = deepClone(payload);\n    const { startIndex } = this.range.getRange();\n    const elementList = this.draw.getElementList();\n    const copyElement = getAnchorElement(elementList, startIndex);\n    if (!copyElement)\n      return;\n    const cloneAttr = [\n      ...TABLE_CONTEXT_ATTR,\n      ...EDITOR_ROW_ATTR,\n      ...LIST_CONTEXT_ATTR\n    ];\n    (_a = cloneElement.valueList) == null ? void 0 : _a.forEach((valueItem) => {\n      cloneProperty(cloneAttr, copyElement, valueItem);\n    });\n    this.draw.insertElementList([cloneElement]);\n  }\n  focus(payload) {\n    const { position = LocationPosition.AFTER } = payload || {};\n    const curIndex = position === LocationPosition.BEFORE ? 0 : this.draw.getOriginalMainElementList().length - 1;\n    this.range.setRange(curIndex, curIndex);\n    this.draw.render({\n      curIndex,\n      isCompute: false,\n      isSubmitHistory: false\n    });\n    const positionList = this.draw.getPosition().getPositionList();\n    this.draw.getCursor().moveCursorToVisible({\n      cursorPosition: positionList[curIndex],\n      direction: MoveDirection.DOWN\n    });\n  }\n}\nclass Listener {\n  constructor() {\n    this.rangeStyleChange = null;\n    this.visiblePageNoListChange = null;\n    this.intersectionPageNoChange = null;\n    this.pageSizeChange = null;\n    this.pageScaleChange = null;\n    this.saved = null;\n    this.contentChange = null;\n    this.controlChange = null;\n    this.pageModeChange = null;\n    this.zoneChange = null;\n  }\n}\nclass Register {\n  constructor(payload) {\n    const { contextMenu, shortcut, i18n } = payload;\n    this.contextMenuList = contextMenu.registerContextMenuList.bind(contextMenu);\n    this.getContextMenuList = contextMenu.getContextMenuList.bind(contextMenu);\n    this.shortcutList = shortcut.registerShortcutList.bind(shortcut);\n    this.langMap = i18n.registerLangMap.bind(i18n);\n  }\n}\nconst NAME_PLACEHOLDER = {\n  SELECTED_TEXT: \"%s\"\n};\nconst INTERNAL_CONTEXT_MENU_KEY = {\n  GLOBAL: {\n    CUT: \"globalCut\",\n    COPY: \"globalCopy\",\n    PASTE: \"globalPaste\",\n    SELECT_ALL: \"globalSelectAll\",\n    PRINT: \"globalPrint\"\n  },\n  CONTROL: {\n    DELETE: \"controlDelete\"\n  },\n  HYPERLINK: {\n    DELETE: \"hyperlinkDelete\",\n    CANCEL: \"hyperlinkCancel\",\n    EDIT: \"hyperlinkEdit\"\n  },\n  IMAGE: {\n    CHANGE: \"imageChange\",\n    SAVE_AS: \"imageSaveAs\",\n    TEXT_WRAP: \"imageTextWrap\",\n    TEXT_WRAP_EMBED: \"imageTextWrapEmbed\",\n    TEXT_WRAP_UP_DOWN: \"imageTextWrapUpDown\",\n    TEXT_WRAP_SURROUND: \"imageTextWrapSurround\",\n    TEXT_WRAP_FLOAT_TOP: \"imageTextWrapFloatTop\",\n    TEXT_WRAP_FLOAT_BOTTOM: \"imageTextWrapFloatBottom\"\n  },\n  TABLE: {\n    BORDER: \"border\",\n    BORDER_ALL: \"tableBorderAll\",\n    BORDER_EMPTY: \"tableBorderEmpty\",\n    BORDER_EXTERNAL: \"tableBorderExternal\",\n    BORDER_TD: \"tableBorderTd\",\n    BORDER_TD_TOP: \"tableBorderTdTop\",\n    BORDER_TD_RIGHT: \"tableBorderTdRight\",\n    BORDER_TD_BOTTOM: \"tableBorderTdBottom\",\n    BORDER_TD_LEFT: \"tableBorderTdLeft\",\n    BORDER_TD_FORWARD: \"tableBorderTdForward\",\n    BORDER_TD_BACK: \"tableBorderTdBack\",\n    VERTICAL_ALIGN: \"tableVerticalAlign\",\n    VERTICAL_ALIGN_TOP: \"tableVerticalAlignTop\",\n    VERTICAL_ALIGN_MIDDLE: \"tableVerticalAlignMiddle\",\n    VERTICAL_ALIGN_BOTTOM: \"tableVerticalAlignBottom\",\n    INSERT_ROW_COL: \"tableInsertRowCol\",\n    INSERT_TOP_ROW: \"tableInsertTopRow\",\n    INSERT_BOTTOM_ROW: \"tableInsertBottomRow\",\n    INSERT_LEFT_COL: \"tableInsertLeftCol\",\n    INSERT_RIGHT_COL: \"tableInsertRightCol\",\n    DELETE_ROW_COL: \"tableDeleteRowCol\",\n    DELETE_ROW: \"tableDeleteRow\",\n    DELETE_COL: \"tableDeleteCol\",\n    DELETE_TABLE: \"tableDeleteTable\",\n    MERGE_CELL: \"tableMergeCell\",\n    CANCEL_MERGE_CELL: \"tableCancelMergeCell\"\n  }\n};\nconst { CONTROL: { DELETE: DELETE$1 } } = INTERNAL_CONTEXT_MENU_KEY;\nconst controlMenus = [\n  {\n    key: DELETE$1,\n    i18nPath: \"contextmenu.control.delete\",\n    when: (payload) => {\n      var _a;\n      return !payload.isReadonly && !payload.editorHasSelection && !!((_a = payload.startElement) == null ? void 0 : _a.controlId) && payload.options.mode !== EditorMode.FORM;\n    },\n    callback: (command) => {\n      command.executeRemoveControl();\n    }\n  }\n];\nconst { GLOBAL: { CUT, COPY, PASTE, SELECT_ALL, PRINT } } = INTERNAL_CONTEXT_MENU_KEY;\nconst globalMenus = [\n  {\n    key: CUT,\n    i18nPath: \"contextmenu.global.cut\",\n    shortCut: `${isApple ? \"\\u2318\" : \"Ctrl\"} + X`,\n    when: (payload) => {\n      return !payload.isReadonly;\n    },\n    callback: (command) => {\n      command.executeCut();\n    }\n  },\n  {\n    key: COPY,\n    i18nPath: \"contextmenu.global.copy\",\n    shortCut: `${isApple ? \"\\u2318\" : \"Ctrl\"} + C`,\n    when: (payload) => {\n      return payload.editorHasSelection || payload.isCrossRowCol;\n    },\n    callback: (command) => {\n      command.executeCopy();\n    }\n  },\n  {\n    key: PASTE,\n    i18nPath: \"contextmenu.global.paste\",\n    shortCut: `${isApple ? \"\\u2318\" : \"Ctrl\"} + V`,\n    when: (payload) => {\n      return !payload.isReadonly && payload.editorTextFocus;\n    },\n    callback: (command) => {\n      command.executePaste();\n    }\n  },\n  {\n    key: SELECT_ALL,\n    i18nPath: \"contextmenu.global.selectAll\",\n    shortCut: `${isApple ? \"\\u2318\" : \"Ctrl\"} + A`,\n    when: (payload) => {\n      return payload.editorTextFocus;\n    },\n    callback: (command) => {\n      command.executeSelectAll();\n    }\n  },\n  {\n    isDivider: true\n  },\n  {\n    key: PRINT,\n    i18nPath: \"contextmenu.global.print\",\n    icon: \"print\",\n    when: () => true,\n    callback: (command) => {\n      command.executePrint();\n    }\n  }\n];\nconst { HYPERLINK: { DELETE, CANCEL, EDIT } } = INTERNAL_CONTEXT_MENU_KEY;\nconst hyperlinkMenus = [\n  {\n    key: DELETE,\n    i18nPath: \"contextmenu.hyperlink.delete\",\n    when: (payload) => {\n      var _a;\n      return !payload.isReadonly && ((_a = payload.startElement) == null ? void 0 : _a.type) === ElementType.HYPERLINK;\n    },\n    callback: (command) => {\n      command.executeDeleteHyperlink();\n    }\n  },\n  {\n    key: CANCEL,\n    i18nPath: \"contextmenu.hyperlink.cancel\",\n    when: (payload) => {\n      var _a;\n      return !payload.isReadonly && ((_a = payload.startElement) == null ? void 0 : _a.type) === ElementType.HYPERLINK;\n    },\n    callback: (command) => {\n      command.executeCancelHyperlink();\n    }\n  },\n  {\n    key: EDIT,\n    i18nPath: \"contextmenu.hyperlink.edit\",\n    when: (payload) => {\n      var _a;\n      return !payload.isReadonly && ((_a = payload.startElement) == null ? void 0 : _a.type) === ElementType.HYPERLINK;\n    },\n    callback: (command, context) => {\n      var _a;\n      const url = window.prompt(\"\\u7F16\\u8F91\\u94FE\\u63A5\", (_a = context.startElement) == null ? void 0 : _a.url);\n      if (url) {\n        command.executeEditHyperlink(url);\n      }\n    }\n  }\n];\nconst { IMAGE: { CHANGE, SAVE_AS, TEXT_WRAP, TEXT_WRAP_EMBED, TEXT_WRAP_UP_DOWN, TEXT_WRAP_SURROUND, TEXT_WRAP_FLOAT_TOP, TEXT_WRAP_FLOAT_BOTTOM } } = INTERNAL_CONTEXT_MENU_KEY;\nconst imageMenus = [\n  {\n    key: CHANGE,\n    i18nPath: \"contextmenu.image.change\",\n    icon: \"image-change\",\n    when: (payload) => {\n      var _a;\n      return !payload.isReadonly && !payload.editorHasSelection && ((_a = payload.startElement) == null ? void 0 : _a.type) === ElementType.IMAGE;\n    },\n    callback: (command) => {\n      const proxyInputFile = document.createElement(\"input\");\n      proxyInputFile.type = \"file\";\n      proxyInputFile.accept = \".png, .jpg, .jpeg\";\n      proxyInputFile.onchange = () => {\n        const file = proxyInputFile.files[0];\n        const fileReader = new FileReader();\n        fileReader.readAsDataURL(file);\n        fileReader.onload = () => {\n          const value = fileReader.result;\n          command.executeReplaceImageElement(value);\n        };\n      };\n      proxyInputFile.click();\n    }\n  },\n  {\n    key: SAVE_AS,\n    i18nPath: \"contextmenu.image.saveAs\",\n    icon: \"image\",\n    when: (payload) => {\n      var _a;\n      return !payload.editorHasSelection && ((_a = payload.startElement) == null ? void 0 : _a.type) === ElementType.IMAGE;\n    },\n    callback: (command) => {\n      command.executeSaveAsImageElement();\n    }\n  },\n  {\n    key: TEXT_WRAP,\n    i18nPath: \"contextmenu.image.textWrap\",\n    when: (payload) => {\n      var _a;\n      return !payload.isReadonly && !payload.editorHasSelection && ((_a = payload.startElement) == null ? void 0 : _a.type) === ElementType.IMAGE;\n    },\n    childMenus: [\n      {\n        key: TEXT_WRAP_EMBED,\n        i18nPath: \"contextmenu.image.textWrapType.embed\",\n        when: () => true,\n        callback: (command, context) => {\n          command.executeChangeImageDisplay(context.startElement, ImageDisplay.BLOCK);\n        }\n      },\n      {\n        key: TEXT_WRAP_UP_DOWN,\n        i18nPath: \"contextmenu.image.textWrapType.upDown\",\n        when: () => true,\n        callback: (command, context) => {\n          command.executeChangeImageDisplay(context.startElement, ImageDisplay.INLINE);\n        }\n      },\n      {\n        key: TEXT_WRAP_SURROUND,\n        i18nPath: \"contextmenu.image.textWrapType.surround\",\n        when: () => true,\n        callback: (command, context) => {\n          command.executeChangeImageDisplay(context.startElement, ImageDisplay.SURROUND);\n        }\n      },\n      {\n        key: TEXT_WRAP_FLOAT_TOP,\n        i18nPath: \"contextmenu.image.textWrapType.floatTop\",\n        when: () => true,\n        callback: (command, context) => {\n          command.executeChangeImageDisplay(context.startElement, ImageDisplay.FLOAT_TOP);\n        }\n      },\n      {\n        key: TEXT_WRAP_FLOAT_BOTTOM,\n        i18nPath: \"contextmenu.image.textWrapType.floatBottom\",\n        when: () => true,\n        callback: (command, context) => {\n          command.executeChangeImageDisplay(context.startElement, ImageDisplay.FLOAT_BOTTOM);\n        }\n      }\n    ]\n  }\n];\nconst { TABLE: { BORDER, BORDER_ALL, BORDER_EMPTY, BORDER_EXTERNAL, BORDER_TD, BORDER_TD_TOP, BORDER_TD_LEFT, BORDER_TD_BOTTOM, BORDER_TD_RIGHT, BORDER_TD_BACK, BORDER_TD_FORWARD, VERTICAL_ALIGN, VERTICAL_ALIGN_TOP, VERTICAL_ALIGN_MIDDLE, VERTICAL_ALIGN_BOTTOM, INSERT_ROW_COL, INSERT_TOP_ROW, INSERT_BOTTOM_ROW, INSERT_LEFT_COL, INSERT_RIGHT_COL, DELETE_ROW_COL, DELETE_ROW, DELETE_COL, DELETE_TABLE, MERGE_CELL, CANCEL_MERGE_CELL } } = INTERNAL_CONTEXT_MENU_KEY;\nconst tableMenus = [\n  {\n    isDivider: true\n  },\n  {\n    key: BORDER,\n    i18nPath: \"contextmenu.table.border\",\n    icon: \"border-all\",\n    when: (payload) => {\n      return !payload.isReadonly && payload.isInTable && payload.options.mode !== EditorMode.FORM;\n    },\n    childMenus: [\n      {\n        key: BORDER_ALL,\n        i18nPath: \"contextmenu.table.borderAll\",\n        icon: \"border-all\",\n        when: () => true,\n        callback: (command) => {\n          command.executeTableBorderType(TableBorder.ALL);\n        }\n      },\n      {\n        key: BORDER_EMPTY,\n        i18nPath: \"contextmenu.table.borderEmpty\",\n        icon: \"border-empty\",\n        when: () => true,\n        callback: (command) => {\n          command.executeTableBorderType(TableBorder.EMPTY);\n        }\n      },\n      {\n        key: BORDER_EXTERNAL,\n        i18nPath: \"contextmenu.table.borderExternal\",\n        icon: \"border-external\",\n        when: () => true,\n        callback: (command) => {\n          command.executeTableBorderType(TableBorder.EXTERNAL);\n        }\n      },\n      {\n        key: BORDER_TD,\n        i18nPath: \"contextmenu.table.borderTd\",\n        icon: \"border-td\",\n        when: () => true,\n        childMenus: [\n          {\n            key: BORDER_TD_TOP,\n            i18nPath: \"contextmenu.table.borderTdTop\",\n            icon: \"border-td-top\",\n            when: () => true,\n            callback: (command) => {\n              command.executeTableTdBorderType(TdBorder.TOP);\n            }\n          },\n          {\n            key: BORDER_TD_RIGHT,\n            i18nPath: \"contextmenu.table.borderTdRight\",\n            icon: \"border-td-right\",\n            when: () => true,\n            callback: (command) => {\n              command.executeTableTdBorderType(TdBorder.RIGHT);\n            }\n          },\n          {\n            key: BORDER_TD_BOTTOM,\n            i18nPath: \"contextmenu.table.borderTdBottom\",\n            icon: \"border-td-bottom\",\n            when: () => true,\n            callback: (command) => {\n              command.executeTableTdBorderType(TdBorder.BOTTOM);\n            }\n          },\n          {\n            key: BORDER_TD_LEFT,\n            i18nPath: \"contextmenu.table.borderTdLeft\",\n            icon: \"border-td-left\",\n            when: () => true,\n            callback: (command) => {\n              command.executeTableTdBorderType(TdBorder.LEFT);\n            }\n          },\n          {\n            key: BORDER_TD_FORWARD,\n            i18nPath: \"contextmenu.table.borderTdForward\",\n            icon: \"border-td-forward\",\n            when: () => true,\n            callback: (command) => {\n              command.executeTableTdSlashType(TdSlash.FORWARD);\n            }\n          },\n          {\n            key: BORDER_TD_BACK,\n            i18nPath: \"contextmenu.table.borderTdBack\",\n            icon: \"border-td-back\",\n            when: () => true,\n            callback: (command) => {\n              command.executeTableTdSlashType(TdSlash.BACK);\n            }\n          }\n        ]\n      }\n    ]\n  },\n  {\n    key: VERTICAL_ALIGN,\n    i18nPath: \"contextmenu.table.verticalAlign\",\n    icon: \"vertical-align\",\n    when: (payload) => {\n      return !payload.isReadonly && payload.isInTable && payload.options.mode !== EditorMode.FORM;\n    },\n    childMenus: [\n      {\n        key: VERTICAL_ALIGN_TOP,\n        i18nPath: \"contextmenu.table.verticalAlignTop\",\n        icon: \"vertical-align-top\",\n        when: () => true,\n        callback: (command) => {\n          command.executeTableTdVerticalAlign(VerticalAlign.TOP);\n        }\n      },\n      {\n        key: VERTICAL_ALIGN_MIDDLE,\n        i18nPath: \"contextmenu.table.verticalAlignMiddle\",\n        icon: \"vertical-align-middle\",\n        when: () => true,\n        callback: (command) => {\n          command.executeTableTdVerticalAlign(VerticalAlign.MIDDLE);\n        }\n      },\n      {\n        key: VERTICAL_ALIGN_BOTTOM,\n        i18nPath: \"contextmenu.table.verticalAlignBottom\",\n        icon: \"vertical-align-bottom\",\n        when: () => true,\n        callback: (command) => {\n          command.executeTableTdVerticalAlign(VerticalAlign.BOTTOM);\n        }\n      }\n    ]\n  },\n  {\n    key: INSERT_ROW_COL,\n    i18nPath: \"contextmenu.table.insertRowCol\",\n    icon: \"insert-row-col\",\n    when: (payload) => {\n      return !payload.isReadonly && payload.isInTable && payload.options.mode !== EditorMode.FORM;\n    },\n    childMenus: [\n      {\n        key: INSERT_TOP_ROW,\n        i18nPath: \"contextmenu.table.insertTopRow\",\n        icon: \"insert-top-row\",\n        when: () => true,\n        callback: (command) => {\n          command.executeInsertTableTopRow();\n        }\n      },\n      {\n        key: INSERT_BOTTOM_ROW,\n        i18nPath: \"contextmenu.table.insertBottomRow\",\n        icon: \"insert-bottom-row\",\n        when: () => true,\n        callback: (command) => {\n          command.executeInsertTableBottomRow();\n        }\n      },\n      {\n        key: INSERT_LEFT_COL,\n        i18nPath: \"contextmenu.table.insertLeftCol\",\n        icon: \"insert-left-col\",\n        when: () => true,\n        callback: (command) => {\n          command.executeInsertTableLeftCol();\n        }\n      },\n      {\n        key: INSERT_RIGHT_COL,\n        i18nPath: \"contextmenu.table.insertRightCol\",\n        icon: \"insert-right-col\",\n        when: () => true,\n        callback: (command) => {\n          command.executeInsertTableRightCol();\n        }\n      }\n    ]\n  },\n  {\n    key: DELETE_ROW_COL,\n    i18nPath: \"contextmenu.table.deleteRowCol\",\n    icon: \"delete-row-col\",\n    when: (payload) => {\n      return !payload.isReadonly && payload.isInTable && payload.options.mode !== EditorMode.FORM;\n    },\n    childMenus: [\n      {\n        key: DELETE_ROW,\n        i18nPath: \"contextmenu.table.deleteRow\",\n        icon: \"delete-row\",\n        when: () => true,\n        callback: (command) => {\n          command.executeDeleteTableRow();\n        }\n      },\n      {\n        key: DELETE_COL,\n        i18nPath: \"contextmenu.table.deleteCol\",\n        icon: \"delete-col\",\n        when: () => true,\n        callback: (command) => {\n          command.executeDeleteTableCol();\n        }\n      },\n      {\n        key: DELETE_TABLE,\n        i18nPath: \"contextmenu.table.deleteTable\",\n        icon: \"delete-table\",\n        when: () => true,\n        callback: (command) => {\n          command.executeDeleteTable();\n        }\n      }\n    ]\n  },\n  {\n    key: MERGE_CELL,\n    i18nPath: \"contextmenu.table.mergeCell\",\n    icon: \"merge-cell\",\n    when: (payload) => {\n      return !payload.isReadonly && payload.isCrossRowCol && payload.options.mode !== EditorMode.FORM;\n    },\n    callback: (command) => {\n      command.executeMergeTableCell();\n    }\n  },\n  {\n    key: CANCEL_MERGE_CELL,\n    i18nPath: \"contextmenu.table.mergeCancelCell\",\n    icon: \"merge-cancel-cell\",\n    when: (payload) => {\n      return !payload.isReadonly && payload.isInTable && payload.options.mode !== EditorMode.FORM;\n    },\n    callback: (command) => {\n      command.executeCancelMergeTableCell();\n    }\n  }\n];\nclass ContextMenu {\n  constructor(draw, command) {\n    this._proxyContextMenuEvent = (evt) => {\n      this.context = this._getContext();\n      const renderList = this._filterMenuList(this.contextMenuList);\n      const isRegisterContextMenu = renderList.some((menu) => !menu.isDivider);\n      if (isRegisterContextMenu) {\n        this.dispose();\n        this._render({\n          contextMenuList: renderList,\n          left: evt.x,\n          top: evt.y\n        });\n      }\n      evt.preventDefault();\n    };\n    this._handleSideEffect = (evt) => {\n      if (this.contextMenuContainerList.length) {\n        const target = (evt == null ? void 0 : evt.composedPath()[0]) || evt.target;\n        const contextMenuDom = findParent(target, (node) => !!node && node.nodeType === 1 && node.getAttribute(EDITOR_COMPONENT) === EditorComponent.CONTEXTMENU, true);\n        if (!contextMenuDom) {\n          this.dispose();\n        }\n      }\n    };\n    this.options = draw.getOptions();\n    this.draw = draw;\n    this.command = command;\n    this.range = draw.getRange();\n    this.position = draw.getPosition();\n    this.i18n = draw.getI18n();\n    this.container = draw.getContainer();\n    this.context = null;\n    this.contextMenuList = [\n      ...globalMenus,\n      ...tableMenus,\n      ...imageMenus,\n      ...controlMenus,\n      ...hyperlinkMenus\n    ];\n    this.contextMenuContainerList = [];\n    this.contextMenuRelationShip = /* @__PURE__ */ new Map();\n    this._addEvent();\n  }\n  getContextMenuList() {\n    return this.contextMenuList;\n  }\n  _addEvent() {\n    this.container.addEventListener(\"contextmenu\", this._proxyContextMenuEvent);\n    document.addEventListener(\"mousedown\", this._handleSideEffect);\n  }\n  removeEvent() {\n    this.container.removeEventListener(\"contextmenu\", this._proxyContextMenuEvent);\n    document.removeEventListener(\"mousedown\", this._handleSideEffect);\n  }\n  _filterMenuList(menuList) {\n    var _a;\n    const { contextMenuDisableKeys } = this.options;\n    const renderList = [];\n    for (let m = 0; m < menuList.length; m++) {\n      const menu = menuList[m];\n      if (menu.disable || menu.key && contextMenuDisableKeys.includes(menu.key)) {\n        continue;\n      }\n      if (menu.isDivider) {\n        renderList.push(menu);\n      } else {\n        if ((_a = menu.when) == null ? void 0 : _a.call(menu, this.context)) {\n          renderList.push(menu);\n        }\n      }\n    }\n    return renderList;\n  }\n  _getContext() {\n    const isReadonly = this.draw.isReadonly();\n    const { isCrossRowCol: crossRowCol, startIndex, endIndex } = this.range.getRange();\n    const editorTextFocus = !!(~startIndex || ~endIndex);\n    const editorHasSelection = editorTextFocus && startIndex !== endIndex;\n    const { isTable, trIndex, tdIndex, index: index2 } = this.position.getPositionContext();\n    let tableElement = null;\n    if (isTable) {\n      const originalElementList = this.draw.getOriginalElementList();\n      const originTableElement = originalElementList[index2] || null;\n      if (originTableElement) {\n        tableElement = zipElementList([originTableElement], {\n          extraPickAttrs: [\"id\"]\n        })[0];\n      }\n    }\n    const isCrossRowCol = isTable && !!crossRowCol;\n    const elementList = this.draw.getElementList();\n    const startElement = elementList[startIndex] || null;\n    const endElement = elementList[endIndex] || null;\n    const zone2 = this.draw.getZone().getZone();\n    return {\n      startElement,\n      endElement,\n      isReadonly,\n      editorHasSelection,\n      editorTextFocus,\n      isCrossRowCol,\n      zone: zone2,\n      isInTable: isTable,\n      trIndex: trIndex != null ? trIndex : null,\n      tdIndex: tdIndex != null ? tdIndex : null,\n      tableElement,\n      options: this.options\n    };\n  }\n  _createContextMenuContainer() {\n    const contextMenuContainer = document.createElement(\"div\");\n    contextMenuContainer.classList.add(`${EDITOR_PREFIX}-contextmenu-container`);\n    contextMenuContainer.setAttribute(EDITOR_COMPONENT, EditorComponent.CONTEXTMENU);\n    this.container.append(contextMenuContainer);\n    return contextMenuContainer;\n  }\n  _render(payload) {\n    var _a;\n    const { contextMenuList, left: left2, top, parentMenuContainer } = payload;\n    const contextMenuContainer = this._createContextMenuContainer();\n    const contextMenuContent = document.createElement(\"div\");\n    contextMenuContent.classList.add(`${EDITOR_PREFIX}-contextmenu-content`);\n    let childMenuContainer = null;\n    if (parentMenuContainer) {\n      this.contextMenuRelationShip.set(parentMenuContainer, contextMenuContainer);\n    }\n    for (let c = 0; c < contextMenuList.length; c++) {\n      const menu = contextMenuList[c];\n      if (menu.isDivider) {\n        if (c !== 0 && c !== contextMenuList.length - 1 && !((_a = contextMenuList[c - 1]) == null ? void 0 : _a.isDivider)) {\n          const divider = document.createElement(\"div\");\n          divider.classList.add(`${EDITOR_PREFIX}-contextmenu-divider`);\n          contextMenuContent.append(divider);\n        }\n      } else {\n        const menuItem = document.createElement(\"div\");\n        menuItem.classList.add(`${EDITOR_PREFIX}-contextmenu-item`);\n        if (menu.childMenus) {\n          const childMenus = this._filterMenuList(menu.childMenus);\n          const isRegisterContextMenu = childMenus.some((menu2) => !menu2.isDivider);\n          if (isRegisterContextMenu) {\n            menuItem.classList.add(`${EDITOR_PREFIX}-contextmenu-sub-item`);\n            menuItem.onmouseenter = () => {\n              this._setHoverStatus(menuItem, true);\n              this._removeSubMenu(contextMenuContainer);\n              const subMenuRect = menuItem.getBoundingClientRect();\n              const left22 = subMenuRect.left + subMenuRect.width;\n              const top2 = subMenuRect.top;\n              childMenuContainer = this._render({\n                contextMenuList: childMenus,\n                left: left22,\n                top: top2,\n                parentMenuContainer: contextMenuContainer\n              });\n            };\n            menuItem.onmouseleave = (evt) => {\n              if (!childMenuContainer || !childMenuContainer.contains(evt.relatedTarget)) {\n                this._setHoverStatus(menuItem, false);\n              }\n            };\n          }\n        } else {\n          menuItem.onmouseenter = () => {\n            this._setHoverStatus(menuItem, true);\n            this._removeSubMenu(contextMenuContainer);\n          };\n          menuItem.onmouseleave = () => {\n            this._setHoverStatus(menuItem, false);\n          };\n          menuItem.onclick = () => {\n            if (menu.callback && this.context) {\n              menu.callback(this.command, this.context);\n            }\n            this.dispose();\n          };\n        }\n        const icon = document.createElement(\"i\");\n        menuItem.append(icon);\n        if (menu.icon) {\n          icon.classList.add(`${EDITOR_PREFIX}-contextmenu-${menu.icon}`);\n        }\n        const span = document.createElement(\"span\");\n        const name = menu.i18nPath ? this._formatName(this.i18n.t(menu.i18nPath)) : this._formatName(menu.name || \"\");\n        span.append(document.createTextNode(name));\n        menuItem.append(span);\n        if (menu.shortCut) {\n          const span2 = document.createElement(\"span\");\n          span2.classList.add(`${EDITOR_PREFIX}-shortcut`);\n          span2.append(document.createTextNode(menu.shortCut));\n          menuItem.append(span2);\n        }\n        contextMenuContent.append(menuItem);\n      }\n    }\n    contextMenuContainer.append(contextMenuContent);\n    contextMenuContainer.style.display = \"block\";\n    const innerWidth = window.innerWidth;\n    const contextmenuRect = contextMenuContainer.getBoundingClientRect();\n    const contextMenuWidth = contextmenuRect.width;\n    const adjustLeft = left2 + contextMenuWidth > innerWidth ? left2 - contextMenuWidth : left2;\n    contextMenuContainer.style.left = `${adjustLeft}px`;\n    const innerHeight = window.innerHeight;\n    const contextMenuHeight = contextmenuRect.height;\n    const adjustTop = top + contextMenuHeight > innerHeight ? top - contextMenuHeight : top;\n    contextMenuContainer.style.top = `${adjustTop}px`;\n    this.contextMenuContainerList.push(contextMenuContainer);\n    return contextMenuContainer;\n  }\n  _removeSubMenu(payload) {\n    const childMenu = this.contextMenuRelationShip.get(payload);\n    if (childMenu) {\n      this._removeSubMenu(childMenu);\n      childMenu.remove();\n      this.contextMenuRelationShip.delete(payload);\n    }\n  }\n  _setHoverStatus(payload, status) {\n    var _a;\n    if (status) {\n      (_a = payload.parentNode) == null ? void 0 : _a.querySelectorAll(`${EDITOR_PREFIX}-contextmenu-item`).forEach((child) => child.classList.remove(\"hover\"));\n      payload.classList.add(\"hover\");\n    } else {\n      payload.classList.remove(\"hover\");\n    }\n  }\n  _formatName(name) {\n    const placeholderValues = Object.values(NAME_PLACEHOLDER);\n    const placeholderReg = new RegExp(`${placeholderValues.join(\"|\")}`);\n    let formatName = name;\n    if (placeholderReg.test(formatName)) {\n      const selectedReg = new RegExp(NAME_PLACEHOLDER.SELECTED_TEXT, \"g\");\n      if (selectedReg.test(formatName)) {\n        const selectedText = this.range.toString();\n        formatName = formatName.replace(selectedReg, selectedText);\n      }\n    }\n    return formatName;\n  }\n  registerContextMenuList(payload) {\n    this.contextMenuList.push(...payload);\n  }\n  dispose() {\n    this.contextMenuContainerList.forEach((child) => child.remove());\n    this.contextMenuContainerList = [];\n    this.contextMenuRelationShip.clear();\n  }\n}\nconst richtextKeys = [\n  {\n    key: KeyMap.X,\n    ctrl: true,\n    shift: true,\n    callback: (command) => {\n      command.executeStrikeout();\n    }\n  },\n  {\n    key: KeyMap.LEFT_BRACKET,\n    mod: true,\n    callback: (command) => {\n      command.executeSizeAdd();\n    }\n  },\n  {\n    key: KeyMap.RIGHT_BRACKET,\n    mod: true,\n    callback: (command) => {\n      command.executeSizeMinus();\n    }\n  },\n  {\n    key: KeyMap.B,\n    mod: true,\n    callback: (command) => {\n      command.executeBold();\n    }\n  },\n  {\n    key: KeyMap.I,\n    mod: true,\n    callback: (command) => {\n      command.executeItalic();\n    }\n  },\n  {\n    key: KeyMap.U,\n    mod: true,\n    callback: (command) => {\n      command.executeUnderline();\n    }\n  },\n  {\n    key: isApple ? KeyMap.COMMA : KeyMap.RIGHT_ANGLE_BRACKET,\n    mod: true,\n    shift: true,\n    callback: (command) => {\n      command.executeSuperscript();\n    }\n  },\n  {\n    key: isApple ? KeyMap.PERIOD : KeyMap.LEFT_ANGLE_BRACKET,\n    mod: true,\n    shift: true,\n    callback: (command) => {\n      command.executeSubscript();\n    }\n  },\n  {\n    key: KeyMap.L,\n    mod: true,\n    callback: (command) => {\n      command.executeRowFlex(RowFlex.LEFT);\n    }\n  },\n  {\n    key: KeyMap.E,\n    mod: true,\n    callback: (command) => {\n      command.executeRowFlex(RowFlex.CENTER);\n    }\n  },\n  {\n    key: KeyMap.R,\n    mod: true,\n    callback: (command) => {\n      command.executeRowFlex(RowFlex.RIGHT);\n    }\n  },\n  {\n    key: KeyMap.J,\n    mod: true,\n    callback: (command) => {\n      command.executeRowFlex(RowFlex.ALIGNMENT);\n    }\n  },\n  {\n    key: KeyMap.J,\n    mod: true,\n    shift: true,\n    callback: (command) => {\n      command.executeRowFlex(RowFlex.JUSTIFY);\n    }\n  }\n];\nconst titleKeys = [\n  {\n    key: KeyMap.ZERO,\n    alt: true,\n    ctrl: true,\n    callback: (command) => {\n      command.executeTitle(null);\n    }\n  },\n  {\n    key: KeyMap.ONE,\n    alt: true,\n    ctrl: true,\n    callback: (command) => {\n      command.executeTitle(TitleLevel.FIRST);\n    }\n  },\n  {\n    key: KeyMap.TWO,\n    alt: true,\n    ctrl: true,\n    callback: (command) => {\n      command.executeTitle(TitleLevel.SECOND);\n    }\n  },\n  {\n    key: KeyMap.THREE,\n    alt: true,\n    ctrl: true,\n    callback: (command) => {\n      command.executeTitle(TitleLevel.THIRD);\n    }\n  },\n  {\n    key: KeyMap.FOUR,\n    alt: true,\n    ctrl: true,\n    callback: (command) => {\n      command.executeTitle(TitleLevel.FOURTH);\n    }\n  },\n  {\n    key: KeyMap.FIVE,\n    alt: true,\n    ctrl: true,\n    callback: (command) => {\n      command.executeTitle(TitleLevel.FIFTH);\n    }\n  },\n  {\n    key: KeyMap.SIX,\n    alt: true,\n    ctrl: true,\n    callback: (command) => {\n      command.executeTitle(TitleLevel.SIXTH);\n    }\n  }\n];\nconst listKeys = [\n  {\n    key: KeyMap.I,\n    shift: true,\n    mod: true,\n    callback: (command) => {\n      command.executeList(ListType.UL, ListStyle.DISC);\n    }\n  },\n  {\n    key: KeyMap.U,\n    shift: true,\n    mod: true,\n    callback: (command) => {\n      command.executeList(ListType.OL);\n    }\n  }\n];\nclass Shortcut {\n  constructor(draw, command) {\n    this._globalKeydown = (evt) => {\n      if (!this.globalShortcutList.length)\n        return;\n      this._execute(evt, this.globalShortcutList);\n    };\n    this.command = command;\n    this.globalShortcutList = [];\n    this.agentShortcutList = [];\n    this._addShortcutList([...richtextKeys, ...titleKeys, ...listKeys]);\n    this._addEvent();\n    const agentDom = draw.getCursor().getAgentDom();\n    agentDom.addEventListener(\"keydown\", this._agentKeydown.bind(this));\n  }\n  _addEvent() {\n    document.addEventListener(\"keydown\", this._globalKeydown);\n  }\n  removeEvent() {\n    document.removeEventListener(\"keydown\", this._globalKeydown);\n  }\n  _addShortcutList(payload) {\n    for (let s = payload.length - 1; s >= 0; s--) {\n      const shortCut = payload[s];\n      if (shortCut.isGlobal) {\n        this.globalShortcutList.unshift(shortCut);\n      } else {\n        this.agentShortcutList.unshift(shortCut);\n      }\n    }\n  }\n  registerShortcutList(payload) {\n    this._addShortcutList(payload);\n  }\n  _agentKeydown(evt) {\n    if (!this.agentShortcutList.length)\n      return;\n    this._execute(evt, this.agentShortcutList);\n  }\n  _execute(evt, shortCutList) {\n    var _a;\n    for (let s = 0; s < shortCutList.length; s++) {\n      const shortCut = shortCutList[s];\n      if ((shortCut.mod ? isMod(evt) === !!shortCut.mod : evt.ctrlKey === !!shortCut.ctrl && evt.metaKey === !!shortCut.meta) && evt.shiftKey === !!shortCut.shift && evt.altKey === !!shortCut.alt && evt.key.toLowerCase() === shortCut.key.toLowerCase()) {\n        if (!shortCut.disable) {\n          (_a = shortCut == null ? void 0 : shortCut.callback) == null ? void 0 : _a.call(shortCut, this.command);\n          evt.preventDefault();\n        }\n        break;\n      }\n    }\n  }\n}\nclass Plugin {\n  constructor(editor) {\n    this.editor = editor;\n  }\n  use(pluginFunction, options) {\n    pluginFunction(this.editor, options);\n  }\n}\nclass EventBus {\n  constructor() {\n    this.eventHub = /* @__PURE__ */ new Map();\n  }\n  on(eventName, callback) {\n    if (!eventName || typeof callback !== \"function\")\n      return;\n    const eventSet = this.eventHub.get(eventName) || /* @__PURE__ */ new Set();\n    eventSet.add(callback);\n    this.eventHub.set(eventName, eventSet);\n  }\n  emit(eventName, payload) {\n    if (!eventName)\n      return;\n    const callBackSet = this.eventHub.get(eventName);\n    if (!callBackSet)\n      return;\n    if (callBackSet.size === 1) {\n      const callBack = [...callBackSet];\n      return callBack[0](payload);\n    }\n    callBackSet.forEach((callBack) => callBack(payload));\n  }\n  off(eventName, callback) {\n    if (!eventName || typeof callback !== \"function\")\n      return;\n    const callBackSet = this.eventHub.get(eventName);\n    if (!callBackSet)\n      return;\n    callBackSet.delete(callback);\n  }\n  isSubscribe(eventName) {\n    const eventSet = this.eventHub.get(eventName);\n    return !!eventSet && eventSet.size > 0;\n  }\n}\nclass Override {\n}\nclass Editor {\n  constructor(container, data2, options = {}) {\n    const editorOptions = mergeOption(options);\n    data2 = deepClone(data2);\n    let headerElementList = [];\n    let mainElementList = [];\n    let footerElementList = [];\n    if (Array.isArray(data2)) {\n      mainElementList = data2;\n    } else {\n      headerElementList = data2.header || [];\n      mainElementList = data2.main;\n      footerElementList = data2.footer || [];\n    }\n    const pageComponentData = [\n      headerElementList,\n      mainElementList,\n      footerElementList\n    ];\n    pageComponentData.forEach((elementList) => {\n      formatElementList(elementList, {\n        editorOptions,\n        isForceCompensation: true\n      });\n    });\n    this.listener = new Listener();\n    this.eventBus = new EventBus();\n    this.override = new Override();\n    const draw = new Draw(container, editorOptions, {\n      header: headerElementList,\n      main: mainElementList,\n      footer: footerElementList\n    }, this.listener, this.eventBus, this.override);\n    this.command = new Command(new CommandAdapt(draw));\n    const contextMenu = new ContextMenu(draw, this.command);\n    const shortcut = new Shortcut(draw, this.command);\n    this.register = new Register({\n      contextMenu,\n      shortcut,\n      i18n: draw.getI18n()\n    });\n    this.destroy = () => {\n      draw.destroy();\n      shortcut.removeEvent();\n      contextMenu.removeEvent();\n    };\n    const plugin = new Plugin(this);\n    this.use = plugin.use.bind(plugin);\n  }\n}\nexport { BackgroundRepeat, BackgroundSize, BlockType, Command, ControlIndentation, ControlType, EDITOR_COMPONENT, Editor, EditorComponent, EditorMode, EditorZone, ElementType, INTERNAL_CONTEXT_MENU_KEY, ImageDisplay, KeyMap, LETTER_CLASS, LineNumberType, ListStyle, ListType, LocationPosition, MaxHeightRatio, NumberType, PageMode, PaperDirection, RenderMode, RowFlex, TableBorder, TdBorder, TdSlash, TextDecorationStyle, TitleLevel, VerticalAlign, WordBreak, createDomFromElementList, Editor as default, getElementListByHTML, getTextFromElementList, splitText };\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/wordtpl/components/HighlightColorModal.vue",
    "content": "<!-- 高亮颜色 -->\n<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" title=\"设置高亮颜色\" @ok=\"handleSubmit\" :width=\"500\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n<script setup lang=\"ts\">\n  import { BasicModal, useModalInner } from '@/components/Modal';\n  import { BasicForm, FormSchema, useForm } from '@/components/Form';\n  const formSchema: FormSchema[] = [\n    {\n      label: '高亮颜色',\n      field: 'highlightColor',\n      component: 'Select',\n      required: true,\n      componentProps: {\n        options: [\n          { value: '#ffffff00', label: '无色' },\n          { value: '#FFFF00', label: '黄色' },\n          { value: '#00FF00', label: '绿色' },\n          { value: '#00FFFF', label: '青色' },\n          { value: '#FF00FF', label: '粉红色' },\n          { value: '#0000FF', label: '蓝色' },\n          { value: '#FF0000', label: '红色' },\n          { value: '#000080', label: '深蓝色' },\n          { value: '#008080', label: '深青色' },\n          { value: '#008000', label: '深绿色' },\n          { value: '#800080', label: '紫色' },\n          { value: '#800000', label: '深红色' },\n          { value: '#808000', label: '深黄色' },\n          { value: '#808080', label: '深灰色' },\n          { value: '#C0C0C0', label: '浅灰色' },\n          { value: '#000000', label: '黑色' },\n        ],\n        getPopupContainer: ()=> document.body\n      },\n    },\n  ];\n  // Emits声明\n  const emit = defineEmits(['register', 'ok']);\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n    schemas: formSchema,\n    showActionButtonGroup: false,\n    wrapperCol: { span: 24 },\n    labelCol: { span: 24 },\n  });\n\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false });\n    //表单赋值\n    await setFieldsValue({\n      ...data,\n    });\n  });\n\n  //表单提交事件\n  async function handleSubmit() {\n    try {\n      const values = await validate();\n      setModalProps({ confirmLoading: true });\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('ok', values);\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n\n<style scoped lang=\"less\"></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/wordtpl/components/HyperlinkDrawer.vue",
    "content": "<!--超链接-->\n<template>\n  <BasicDrawer @register=\"registerBaseDrawer\" title=\"超链接\" width=\"600\" showFooter @ok=\"handleOk\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicDrawer>\n</template>\n\n<script setup lang=\"ts\">\n  import { BasicDrawer, useDrawerInner } from '@/components/Drawer';\n  import { BasicForm, FormSchema, useForm } from '@/components/Form';\n\n  let emit = defineEmits(['register', 'ok']);\n\n  const schemas: FormSchema[] = [\n    {\n      label: '链接名称',\n      field: 'name',\n      component: 'Input',\n      rules: [{ required: true, message: '请填写链接名称' }],\n    },\n    {\n      label: '链接地址',\n      field: 'url',\n      component: 'Input',\n      componentProps: {\n        min: 0,\n      },\n      rules: [{ required: true, message: '请填写链接地址' }],\n    },\n  ];\n\n  const [registerForm, { setFieldsValue, resetFields, validate, clearValidate }] = useForm({\n    schemas,\n    showActionButtonGroup: false,\n    wrapperCol: { span: 24 },\n    labelCol: { span: 24 },\n  });\n\n  //注册Drawer\n  const [registerBaseDrawer, { closeDrawer }] = useDrawerInner((data) => {\n    resetFields();\n    setFieldsValue({\n      ...data,\n    });\n    clearValidate();\n  });\n\n  /**\n   * 确定事件\n   */\n  async function handleOk() {\n    let values = await validate();\n    emit('ok', values);\n    closeDrawer();\n  }\n</script>\n\n<style scoped lang=\"less\">\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/wordtpl/components/PagerMarginDrawer.vue",
    "content": "<!--边距页面-->\n<template>\n  <BasicDrawer @register=\"registerBaseDrawer\" title=\"设置边距\" width=\"600\" showFooter @ok=\"handleOk\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicDrawer>\n</template>\n\n<script setup lang=\"ts\">\n  import { BasicDrawer, useDrawerInner } from '@/components/Drawer';\n  import { BasicForm, FormSchema, useForm } from '@/components/Form';\n\n  let emit = defineEmits(['register','ok']);\n  \n  const schemas: FormSchema[] = [\n    {\n      label:'上边距',\n      field: 'marginTop',\n      component: 'InputNumber',\n      componentProps: {\n        min: 0,\n      },\n      rules: [{ required: true, message: '请填写上边距' }],\n    },\n    {\n      label:'下边距',\n      field: 'marginBottom',\n      component: 'InputNumber',\n      componentProps: {\n        min: 0,\n      },\n      rules: [{ required: true, message: '请填写下边距' }],\n    },\n    {\n      label:'左边距',\n      field: 'marginLeft',\n      component: 'InputNumber',\n      componentProps: {\n        min: 0,\n      },\n      rules: [{ required: true, message: '请填写左边距' }],\n    },\n    {\n      label:'右边距',\n      field: 'marginRight',\n      component: 'InputNumber',\n      componentProps: {\n        min: 0,\n      },\n      rules: [{ required: true, message: '请填写右边距' }],\n    },\n  ];\n\n  const [registerForm, { setFieldsValue, resetFields, validate }] = useForm({\n    schemas,\n    showActionButtonGroup: false,\n    wrapperCol: { span: 24 },\n    labelCol: { span: 24 },\n  });\n\n  //注册Drawer\n  const [registerBaseDrawer, { closeDrawer }] = useDrawerInner((data) => {\n    resetFields();\n    setFieldsValue({\n      ...data,\n    });\n  });\n\n  /**\n   * 确定事件\n   */\n  async function handleOk() {\n    let values = await validate();\n    emit('ok', values);\n    closeDrawer();\n  }\n</script>\n\n<style scoped lang=\"less\">\n  :deep(.ant-input-number){\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/wordtpl/components/WatermarkDrawer.vue",
    "content": "<!--水印页面-->\n<template>\n  <BasicDrawer @register=\"registerBaseDrawer\" title=\"设置水印\" width=\"600\" showFooter @ok=\"handleOk\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicDrawer>\n</template>\n\n<script setup lang=\"ts\">\n  import { BasicDrawer, useDrawerInner } from '@/components/Drawer';\n  import { BasicForm, FormSchema, useForm } from '@/components/Form';\n\n  let emit = defineEmits(['register', 'ok']);\n\n  const schemas: FormSchema[] = [\n    {\n      label: '内容',\n      field: 'data',\n      component: 'Input',\n      rules: [{ required: true, message: '请填写内容' }],\n    },\n    {\n      label: '颜色',\n      field: 'color',\n      component: 'Input',\n      componentProps: {\n        type: 'color',\n      },\n      rules: [{ required: true, message: '请选择颜色' }],\n      defaultValue: '#AEB5C0',\n    },\n    {\n      label: '字体大小',\n      field: 'size',\n      component: 'InputNumber',\n      componentProps: {\n        min: 10,\n      },\n      defaultValue: 50,\n      rules: [{ required: true, message: '请填写字体大小' }],\n    },\n    {\n      label: '透明度',\n      field: 'opacity',\n      component: 'Slider',\n      componentProps: {\n        min: 0.1,\n        max: 1,\n        step: 0.1,\n      },\n      defaultValue: 0.3,\n      rules: [{ required: true, message: '请填写透明度' }],\n    },\n    {\n      label: '重复',\n      field: 'repeat',\n      component: 'Select',\n      componentProps: {\n        options: [\n          { label: '不重复', value: '0' },\n          { label: '重复', value: '1' },\n        ],\n      },\n      defaultValue: '0',\n    },\n    {\n      label: '水平间隔',\n      field: 'horizontalGap',\n      component: 'InputNumber',\n      defaultValue: 10,\n    },\n    {\n      label: '垂直间隔',\n      field: 'verticalGap',\n      component: 'InputNumber',\n      defaultValue: 10,\n    },\n  ];\n\n  const [registerForm, { setFieldsValue, resetFields, validate }] = useForm({\n    schemas,\n    showActionButtonGroup: false,\n    wrapperCol: { span: 24 },\n    labelCol: { span: 24 },\n  });\n\n  //注册Drawer\n  const [registerBaseDrawer, { closeDrawer }] = useDrawerInner((data) => {\n    resetFields();\n    setFieldsValue({\n      ...data,\n    });\n  });\n\n  /**\n   * 确定事件\n   */\n  async function handleOk() {\n    let values = await validate();\n    emit('ok', values);\n    closeDrawer();\n  }\n</script>\n\n<style scoped lang=\"less\">\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/components/wordtpl/style/DocDesign.css",
    "content": ".content {\n  display: flex;\n}\n\n.space-between {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n}\n\n.align-center {\n  display: flex;\n  align-items: center;\n}\n\n.ellipsis {\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n.header {\n  height: 64px;\n  padding: 0;\n  background-color: #fff;\n  .header-title {\n    width: 200px;\n  }\n  .headerRight {\n    padding-right: 24px;\n    font-size: 14px;\n    color: rgba(0, 0, 0, 0.9);\n    .role-name {\n      margin-right: 8px;\n    }\n  }\n  .header-name {\n    width: 100%;\n    padding: 0 16px;\n    background-color: rgba(208, 208, 208, 0);\n    font-size: 18px;\n    line-height: 30px;\n    color: #1a1a1a;\n    font-weight: bold;\n    margin: 5px 0;\n  }\n}\n\n.center {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1;\n  -ms-flex: 1;\n  flex: 1;\n  position: relative;\n  margin: 0 10px;\n  width: 100%;\n  .left-action {\n    left: -10px;\n    border-radius: 0 3px 3px 0;\n  }\n\n  .right-action {\n    border-radius: 3px 0 0 3px;\n    right: -13px;\n  }\n\n  .action-icon {\n    cursor: pointer;\n    transition: all 0.3s;\n    position: absolute;\n    top: 50%;\n\n    transform: translateY(-50%);\n    z-index: 999;\n    background-color: #ffffff;\n    width: 10px;\n    height: 48px;\n\n    &:hover {\n      opacity: 0.7;\n    }\n  }\n}\n.menu {\n  width: 100%;\n  height: 60px;\n  margin: 0 auto;\n  top: 0;\n  z-index: 9;\n  overflow-x: auto;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background: #f2f4f7;\n  box-shadow: 0 2px 4px 0 transparent;\n  .menu-item {\n    height: 24px;\n    display: flex;\n    align-items: center;\n    position: relative;\n  }\n  .menu-item > div {\n    width: 24px;\n    cursor: pointer;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    margin: 0 2px;\n  }\n\n  .menu-item > div:hover {\n    background: rgba(25, 55, 88, 0.04);\n  }\n\n  .menu-item > div.active {\n    background: rgba(25, 55, 88, 0.08);\n  }\n\n  i {\n    width: 18px;\n    height: 18px;\n    display: inline-block;\n    background-repeat: no-repeat;\n    background-size: 100% 100%;\n  }\n}\n\n.menu-item>div>span {\n  width: 16px;\n  height: 3px;\n  display: inline-block;\n  border: 1px solid #e2e6ed;\n}\n\n.jeecg-menu-item-save i {\n  background-image: url('/@/assets/images/wordtpl/images/save.svg');\n}\n.jeecg-menu-item-upload i {\n  background-image: url('/@/assets/images/wordtpl/images/upload.svg');\n}\n.menu-item-preview i {\n  background-image: url('/@/assets/images/wordtpl/images/preview.svg');\n}\n.jeecg-menu-item-undo i {\n  background-image: url('/@/assets/images/wordtpl/images/undo.svg');\n}\n.jeecg-menu-item-redo i {\n  background-image: url('/@/assets/images/wordtpl/images/redo.svg');\n}\n.jeecg-menu-item-painter i {\n  background-image: url('/@/assets/images/wordtpl/images/painter.svg');\n}\n.jeecg-menu-item-format i {\n  background-image: url('/@/assets/images/wordtpl/images/format.svg');\n}\n.jeecg-menu-item-size-add i {\n  background-image: url('/@/assets/images/wordtpl/images/size-add.svg');\n}\n.jeecg-menu-item-size-minus i {\n  background-image: url('/@/assets/images/wordtpl/images/size-minus.svg');\n}\n.jeecg-menu-item-bold i {\n  background-image: url('/@/assets/images/wordtpl/images/bold.svg');\n}\n.jeecg-menu-item-italic i {\n  background-image: url('/@/assets/images/wordtpl/images/italic.svg');\n}\n\n.jeecg-menu-item-underline>i{\n  flex-shrink: 0;\n  background-image: url('/@/assets/images/wordtpl/images/underline.svg');\n}\n.jeecg-menu-item-underline li[data-decoration-style=\"solid\"]{\n  background-image: url(/@/assets/images/wordtpl/images/line-single.svg);\n  background-repeat: no-repeat;\n}\n.jeecg-menu-item-underline li[data-decoration-style=\"double\"]{\n  background-image: url(/@/assets/images/wordtpl/images/line-double.svg);\n  background-repeat: no-repeat;\n}\n.jeecg-menu-item-underline li[data-decoration-style=\"dashed\"]{\n  background-image: url(/@/assets/images/wordtpl/images/line-dash-small-gap.svg);\n  background-repeat: no-repeat;\n}\n.jeecg-menu-item-underline li[data-decoration-style=\"dotted\"]{\n  background-image: url(/@/assets/images/wordtpl/images/line-dot.svg);\n  background-repeat: no-repeat;\n}\n.jeecg-menu-item-underline li[data-decoration-style=\"wavy\"] {\n  background-image: url(/@/assets/images/wordtpl/images/line-wavy.svg);\n  background-repeat: no-repeat;\n}\n.jeecg-menu-item-underline li i{\n  pointer-events: none;\n  padding: 1px 5px !important;\n}\n\n.jeecg-menu-item-underline .select {\n  width: 100%;\n  height: 100%;\n}\n.jeecg-menu-item-strikeout i{\n  background-image: url('/@/assets/images/wordtpl/images/strikeout.svg');\n}\n\n.jeecg-menu-item-superscript i{\n  background-image: url('/@/assets/images/wordtpl/images/superscript.svg');\n}\n\n.jeecg-menu-item-subscript i{\n  background-image: url('/@/assets/images/wordtpl/images/subscript.svg');\n}\n\n.jeecg-menu-item-color i{\n  background-image: url('/@/assets/images/wordtpl/images/color.svg');\n}\n\n.jeecg-menu-item-highlight i{\n  background-image: url('/@/assets/images/wordtpl/images/highlight.svg');\n}\n\n.jeecg-menu-item-cellcolor i{\n  background-image: url('/@/assets/images/wordtpl/images/cellcolor.svg');\n}\n\n.jeecg-menu-item-title i{\n  background-image: url('/@/assets/images/wordtpl/images/title.svg');\n}\n\n.jeecg-menu-item-left i{\n  background-image: url('/@/assets/images/wordtpl/images/left.svg');\n}\n\n.jeecg-menu-item-center i{\n  background-image: url('/@/assets/images/wordtpl/images/center.svg');\n}\n\n.jeecg-menu-item-right i{\n  background-image: url('/@/assets/images/wordtpl/images/right.svg');\n}\n\n.jeecg-menu-item-alignment i{\n  background-image: url('/@/assets/images/wordtpl/images/alignment.svg');\n}\n\n.jeecg-menu-item-row-margin i{\n  background-image: url('/@/assets/images/wordtpl/images/row-margin.svg');\n}\n\n.jeecg-menu-item-list i{\n  background-image: url('/@/assets/images/wordtpl/images/list.svg');\n}\n\n.jeecg-menu-item-download i{\n  background-image: url('/@/assets/images/wordtpl/images/download.svg');\n}\n\n.jeecg-menu-item-chart i {\n  background-image: url('/@/assets/images/wordtpl/images/chart.svg');\n}\n\n.jeecg-menu-item-table i {\n  background-image: url('/@/assets/images/wordtpl/images/table.svg');\n}\n\n.jeecg-menu-item-image i {\n  background-image: url('/@/assets/images/wordtpl/images/image.svg');\n}\n\n.jeecg-menu-item-barcode i {\n  background-image: url('/@/assets/images/wordtpl/images/barcode.svg');\n}\n\n.jeecg-menu-item-qrcode i {\n  background-image: url('/@/assets/images/wordtpl/images/qrcode.svg');\n}\n\n.jeecg-menu-item-hyperlink i {\n  background-image: url('/@/assets/images/wordtpl/images/hyperlink.svg');\n}\n\n.jeecg-menu-item-separator>i {\n  background-image: url('/@/assets/images/wordtpl/images/separator.svg');\n}\n\n.jeecg-menu-item-watermark i {\n  background-image: url('/@/assets/images/wordtpl/images/watermark.svg');\n}\n\n.jeecg-menu-item-page-break i {\n  background-image: url('/@/assets/images/wordtpl/images/page-break.svg');\n}\n.jeecg-menu-item-search i {\n  background-image: url('/@/assets/images/wordtpl/images/search.svg');\n}\n\n.jeecg-menu-item-print i {\n  background-image: url('/@/assets/images/wordtpl/images/print.svg');\n}\n\n\n.jeecg-menu-item-color,\n.jeecg-menu-item-highlight,\n.jeecg-menu-item-cellcolor {\n  display: flex;\n  flex-direction: column;\n}\n\n.jeecg-menu-item-color #color,\n.jeecg-menu-item-highlight #highlight,\n.jeecg-menu-item-cellcolor #cellcolor {\n  width: 1px;\n  height: 1px;\n  visibility: hidden;\n  outline: none;\n  appearance: none;\n}\n\n.jeecg-menu-item-highlight span{\n  background-color: #ffff00;\n}\n\n.jeecg-menu-item-color span {\n  background-color: #000000;\n}\n.menu-item .jeecg-menu-item-underline .options {\n  width: 128px !important;\n}\n\n.menu-item .jeecg-menu-item-underline .options li{\n  padding: 1px 5px;\n}\n\nul{\n  list-style: none;\n}\n\n\n.editor-container {\n  height: calc(100vh - 164px);\n  overflow-y: auto;\n}\n\n.no-allow {\n  color: #c0c4cc;\n  cursor: not-allowed;\n  opacity: 0.4;\n  pointer-events: none;\n}\n\n.menu-item .menu-item__font {\n  width: 70px !important;\n  position: relative;\n  font-size: 14px;\n}\n\n.menu-item .select {\n  border: none;\n  font-size: 14px;\n  line-height: 24px;\n  user-select: none;\n}\n\n.menu-item .select::after {\n  position: absolute;\n  content: '';\n  top: 11px;\n  width: 0;\n  height: 0;\n  right: 2px;\n  border-color: #767c85 transparent transparent;\n  border-style: solid solid none;\n  border-width: 4px 4px 0;\n}\n\n.menu-item .options {\n  width: 110px;\n  position: fixed;\n  top: 113px;\n  padding: 10px;\n  font-size: 14px;\n  border: 1px solid #e2e6ed;\n  display: none;\n  box-sizing: border-box;\n  margin: 0;\n  color: rgba(0, 0, 0, 0.88);\n  line-height: 1.5;\n  list-style: none;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\n  z-index: 1050;\n  overflow: hidden;\n  font-variant: initial;\n  background-color: #ffffff;\n  border-radius: 8px;\n  outline: none;\n  box-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n  align-items: center;\n}\n\n.menu-item .options.visible {\n  display: block;\n  z-index: 99;\n}\n\n.menu-item .options li {\n  position: relative;\n  display: block;\n  min-height: 32px;\n  padding: 5px 12px;\n  color: rgba(0, 0, 0, 0.88);\n  font-weight: normal;\n  font-size: 14px;\n  line-height: 1.5;\n  box-sizing: border-box;\n  cursor: pointer;\n  transition: background 0.3s ease;\n  border-radius: 4px;\n}\n\n.menu-item .options li:hover {\n  background-color: #ebecef;\n}\n\n.menu-item .options li.active {\n  color: rgba(0, 0, 0, 0.88);\n  font-weight: 600;\n  background-color: #e6f4ff;\n}\n\n.menu-item .jeecg-menu-item-font {\n  width: 65px;\n  position: relative;\n}\n\n.menu-item .jeecg-menu-item-size {\n  width: 50px;\n  text-align: center;\n  position: relative;\n}\n\n.jeecg-menu-item-font .select,\n.jeecg-menu-item-size .select {\n  width: 100%;\n  height: 100%;\n}\n\n.menu-item .jeecg-menu-item-font {\n  width: 70px!important;;\n  position: relative;\n}\n\n.menu-item .jeecg-menu-item-size {\n  width: 50px !important;\n  text-align: center;\n  position: relative;\n}\n\n.jeecg-menu-item-size .options,.jeecg-menu-item-font .options{\n  height: 566px;\n  overflow-y: auto;\n}\n\n.jeecg-menu-item-redo.no-allow,\n.jeecg-menu-item-undo.no-allow,\n.menu-item > div.disable {\n  color: #c0c4cc;\n  cursor: not-allowed;\n  opacity: 0.4;\n  pointer-events: none;\n}\n\n.menu-item .options.visible {\n  display: block;\n  z-index: 99;\n}\n\n.menu-item .jeecg-menu-item-underline {\n  width: 30px !important;\n  position: relative;\n}\n\n.jeecg__editor {\n  display: grid;\n  justify-content: center;\n}\n\n.menu-item .jeecg-menu-item-title {\n  width: 60px !important;\n  position: relative;\n}\n\n.jeecg-menu-item-title .select {\n  width: calc(100% - 20px);\n  height: 100%;\n  font-size: 12px !important;\n}\n\n.jeecg-menu-item-title .options {\n  width: 114px;\n}\n\n.jeecg-menu-item-list {\n  position: relative;\n}\n\n.jeecg-menu-item-list .options {\n  width: 150px !important;\n}\n\n.jeecg-menu-item-list .options>ul>li * {\n  pointer-events: none !important;\n}\n\n.jeecg-menu-item-list .options>ul>li li {\n  margin-left: 18px !important;\n}\n.jeecg-menu-item-list .options>ul>li ol {\n  margin: 0;\n  padding: 0;\n}\n\n.menu-item .jeecg-menu-item-table-collapse {\n  width: 270px !important;\n  height: 310px;\n  background: #fff;\n  box-shadow: 0 2px 12px 0 rgb(56 56 56 / 20%);\n  border: 1px solid #e2e6ed;\n  box-sizing: border-box;\n  border-radius: 2px;\n  position: fixed;\n  z-index: 99;\n  top: 113px;\n  padding: 14px 27px;\n  cursor: auto !important;\n}\n\n.menu-item .jeecg-menu-item-table-collapse .table-close {\n  position: absolute;\n  right: 10px;\n  top: 5px;\n  cursor: pointer;\n}\n\n.menu-item .jeecg-menu-item-table-collapse .table-close:hover {\n  color: #7d7e80 !important;;\n}\n\n.menu-item .jeecg-menu-item-table-collapse:hover {\n  background: #fff !important;\n}\n\n.menu-item .jeecg-menu-item-table-collapse .table-title {\n  display: flex;\n  justify-content: flex-start;\n  padding-bottom: 5px;\n  border-bottom: 1px solid #e2e6ed;\n}\n\n.table-title span {\n  font-size: 12px;\n  color: #3d4757;\n  display: inline;\n  margin: 0;\n}\n\n:deep(.table-panel) {\n  cursor: pointer;\n}\n\n:deep(.table-panel .table-row) {\n  display: flex;\n  flex-wrap: nowrap;\n  margin-top: 10px;\n  pointer-events: none;\n}\n\n:deep(.table-panel .table-cel) {\n  width: 16px;\n  height: 16px;\n  box-sizing: border-box;\n  border: 1px solid #e2e6ed;\n  background: #fff;\n  position: relative;\n  margin-right: 6px;\n  pointer-events: none;\n}\n\n:deep(.table-panel .table-cel.active) {\n  border: 1px solid rgba(73, 145, 242, .2);\n  background: rgba(73, 145, 242, .15);\n}\n\n:deep(.table-panel .table-row .table-cel:last-child) {\n  margin-right: 0;\n}\n\n.jeecg-menu-item-image input{\n  display: none;\n}\n\n.menu-item .jeecg-menu-item-separator .options {\n  width: 128px !important;\n}\n\n.menu-item .jeecg-menu-item-separator li {\n  padding: 1px 5px;\n  min-height: 20px;\n}\n\n.jeecg-menu-item-separator li i {\n  pointer-events: none;\n}\n\n.jeecg-menu-item-separator .more input{\n  width: 100%;\n}\n.jeecg-menu-item-separator .more div span{\n  width: 30px;\n}\n.jeecg-menu-item-separator .more .menu{\n  margin-top: 20px;\n}\n.jeecg-menu-item-separator .more .menu button:last-child{\n  margin-left: 8px;\n}\n\n.jeecg-menu-item-separator li[data-separator=\"0,0\"] {\n  background: url('/@/assets/images/wordtpl/images/line-single.svg') no-repeat;\n}\n\n.jeecg-menu-item-separator li[data-separator=\"1,1\"] {\n  background: url('/@/assets/images/wordtpl/images/line-dot.svg') no-repeat;\n}\n\n.jeecg-menu-item-separator li[data-separator=\"3,1\"] {\n  background: url('/@/assets/images/wordtpl/images/line-dash-small-gap.svg') no-repeat;\n}\n\n.jeecg-menu-item-separator li[data-separator=\"4,4\"] {\n  background: url('/@/assets/images/wordtpl/images/line-dash-large-gap.svg') no-repeat;\n}\n\n.jeecg-menu-item-separator li[data-separator=\"7,3,3,3\"] {\n  background: url('/@/assets/images/wordtpl/images/line-dash-dot.svg') no-repeat;\n}\n\n.jeecg-menu-item-separator li[data-separator=\"6,2,2,2,2,2\"] {\n  background: url('/@/assets/images/wordtpl/images/line-dash-dot-dot.svg') no-repeat;\n}\n\n.jeecg-menu-item-search {\n  position: relative;\n}\n\n\n.menu-item .jeecg-menu-item-search-collapse {\n  width: 260px !important;\n  height: 72px;\n  box-sizing: border-box;\n  position: fixed;\n  z-index: 99;\n  top: 113px;\n  left: 0;\n  background: #ffffff;\n  box-shadow: 0 5px 5px #e3dfdf;\n}\n\n.menu-item .jeecg-menu-item-search-collapse:hover {\n  background: #ffffff;\n}\n\n.menu-item .jeecg-menu-item-search-collapse>div {\n  width: 250px;\n  height: 36px;\n  padding: 0 5px;\n  line-height: 36px;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  border-radius: 4px;\n}\n\n.menu-item .jeecg-menu-item-search-collapse>div input {\n  width: 205px;\n  height: 27px;\n  appearance: none;\n  background-color: #fff;\n  background-image: none;\n  border-radius: 4px;\n  border: 1px solid #ebebeb;\n  box-sizing: border-box;\n  color: #606266;\n  display: inline-block;\n  line-height: 27px;\n  outline: none;\n  padding: 0 5px;\n}\n\n.menu-item .jeecg-menu-item-search-collapse>div span {\n  height: 100%;\n  color: #dcdfe6;\n  font-size: 25px;\n  display: inline-block;\n  border: 0;\n  padding: 0 10px;\n}\n\n.menu-item .jeecg-menu-item-search-collapse button {\n  display: inline-block;\n  border: 1px solid #e2e6ed;\n  border-radius: 2px;\n  background: #fff;\n  line-height: 22px;\n  padding: 0 6px;\n  white-space: nowrap;\n  margin-left: 4px;\n  cursor: pointer;\n  font-size: 12px;\n}\n\n.menu-item .jeecg-menu-item-search-collapse-replace button:hover {\n  background: rgba(25, 55, 88, .04);\n}\n\n.menu-item .jeecg-menu-item-search-collapse-search {\n  position: relative;\n}\n\n.menu-item .jeecg-menu-item-search-collapse-search label {\n  right: 110px;\n  font-size: 12px;\n  color: #3d4757;\n  position: absolute;\n}\n\n.menu-item .jeecg-menu-item-search-collapse-search>input {\n  padding: 5px 90px 5px 5px !important;\n}\n\n.menu-item .jeecg-menu-item-search-collapse-search>div {\n  width: 28px;\n  height: 27px;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  position: absolute;\n  border-left: 1px solid #e2e6ed;\n  transition: all .5s;\n}\n\n.menu-item .jeecg-menu-item-search-collapse-search>div:hover {\n  background-color: rgba(25, 55, 88, 0.04);\n}\n\n.menu-item .jeecg-menu-item-search-collapse-search i {\n  width: 6px;\n  height: 8px;\n  transform: translateY(1px);\n}\n\n.menu-item .jeecg-menu-item-search-collapse-search .arrow-left {\n  right: 76px;\n}\n\n.menu-item .jeecg-menu-item-search-collapse-search .arrow-left i {\n  background: url(/@/assets/images/wordtpl/images/arrow-left.svg) no-repeat;\n}\n\n.menu-item .jeecg-menu-item-search-collapse-search .arrow-right {\n  right: 48px;\n}\n\n.menu-item .jeecg-menu-item-search-collapse-search .arrow-right i {\n  background: url(/@/assets/images/wordtpl/images/arrow-right.svg) no-repeat;\n}\n\n.footer {\n  width: 100%;\n  height: 30px;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  position: absolute;\n  background: #f2f4f7;\n  z-index: 9;\n  bottom: 0;\n  left: 0;\n  font-size: 12px;\n  padding: 0 4px 0 20px;\n  box-sizing: border-box;\n}\n\n.footer>div:first-child {\n  display: flex;\n  align-items: center;\n}\n\n.footer .catalog-mode {\n  padding: 1px;\n  position: relative;\n}\n\n.footer .catalog-mode i {\n  width: 16px;\n  height: 16px;\n  margin-right: 5px;\n  cursor: pointer;\n  display: block;\n  background-image: url('/@/assets/images/wordtpl/images/catalog.svg');\n}\n\n.footer .page-mode {\n  padding: 1px;\n  position: relative;\n}\n\n.footer .page-mode i {\n  width: 16px;\n  height: 16px;\n  margin-right: 5px;\n  cursor: pointer;\n  display: block;\n  background-image: url('/@/assets/images/wordtpl/images/page-mode.svg');\n}\n\n.footer .options {\n  width: 72px;\n  position: absolute;\n  bottom: 26px;\n  padding: 10px;\n  top: unset !important;\n  left: unset !important;\n  font-size: 14px;\n  border: 1px solid #e2e6ed;\n  display: none;\n  box-sizing: border-box;\n  margin: 0;\n  color: rgba(0, 0, 0, 0.88);\n  line-height: 1.5;\n  list-style: none;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\n  z-index: 1050;\n  overflow: hidden;\n  font-variant: initial;\n  background-color: #ffffff;\n  border-radius: 8px;\n  outline: none;\n  box-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n  align-items: center;\n}\n\n.footer .options.visible {\n  display: block;\n}\n\n.footer .options li {\n  position: relative;\n  display: block;\n  min-height: 32px;\n  padding: 5px 10px;\n  color: rgba(0, 0, 0, 0.88);\n  font-weight: normal;\n  font-size: 14px;\n  line-height: 1.5;\n  box-sizing: border-box;\n  cursor: pointer;\n  transition: background 0.3s ease;\n  border-radius: 4px;\n}\n\n.footer .options li:hover {\n  background-color: #ebecef;\n}\n\n.footer .options li.active {\n  color: rgba(0, 0, 0, 0.88);\n  font-weight: 600;\n  background-color: #e6f4ff;\n}\n\n.footer>div:first-child>span {\n  display: inline-block;\n  margin-right: 5px;\n  letter-spacing: 1px;\n}\n\n.footer>div:last-child {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n}\n\n.footer>div:last-child>div {\n  width: 24px;\n  height: 24px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.footer>div:last-child>div:hover {\n  background: rgba(25, 55, 88, .04);\n}\n\n.footer>div:last-child i {\n  width: 16px;\n  height: 16px;\n  display: inline-block;\n  cursor: pointer;\n}\n\n.footer .editor-option i {\n  background-image: url('/@/assets/images/wordtpl/images/option.svg');\n}\n\n.footer .page-scale-minus i {\n  background-image: url('/@/assets/images/wordtpl/images/page-scale-minus.svg');\n}\n\n.footer .page-scale-add i {\n  background-image: url('/@/assets/images/wordtpl/images/page-scale-add.svg');\n}\n\n.footer .page-scale-percentage {\n  cursor: pointer;\n  user-select: none;\n}\n\n.footer .fullscreen i {\n  background-image: url('/@/assets/images/wordtpl/images/request-fullscreen.svg');\n}\n\n.footer .fullscreen.exist i {\n  background-image: url('/@/assets/images/wordtpl/images/exit-fullscreen.svg');\n}\n\n.footer .paper-margin i {\n  background-image: url('/@/assets/images/wordtpl/images/paper-margin.svg');\n}\n\n.footer .editor-mode {\n  cursor: pointer;\n  user-select: none;\n}\n\n.footer .paper-size {\n  position: relative;\n}\n\n.footer .paper-size i {\n  background-image: url('/@/assets/images/wordtpl/images/paper-size.svg');\n}\n\n.footer .paper-size .options {\n  width: 100px !important;\n  height: 340px !important;\n  right: 0;\n  left: unset;\n}\n\n.footer .paper-direction {\n  position: relative;\n}\n\n.footer .paper-direction i {\n  background-image: url('/@/assets/images/wordtpl/images/paper-direction.svg');\n}\n\n.footer .paper-direction .options {\n  right: 0;\n  left: unset;\n  height: 84px;\n}\n.footer .page-mode .options{\n  height: 80px;\n}\n\n.catalog{\n  width: 250px;\n  position: absolute;\n  bottom: 0;\n  top: 70px;\n  padding: 0 20px 40px 20px;\n}\n\n.catalog .jeecg-catalog-header {\n  height: 48px;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  border-bottom: 1px solid #e2e6ed;\n}\n\n.catalog .jeecg-catalog-header span {\n  color: #3d4757;\n  font-size: 14px;\n  font-weight: bold;\n}\n\n.catalog .jeecg-catalog-header i {\n  width: 16px;\n  height: 16px;\n  cursor: pointer;\n  display: inline-block;\n  background: url(/@/assets/images/wordtpl/images/close.svg) no-repeat;\n  transition: all .2s;\n}\n\n.catalog .jeecg-catalog-header>div:hover {\n  background: rgba(235, 238, 241);\n}\n\n.jeecg-catalog-main {\n  height: calc(100% - 60px);\n  padding: 10px 0;\n  overflow-y: auto;\n  overflow-x: hidden;\n}\n\n.jeecg-catalog-main .catalog-item {\n  width: 100%;\n  padding-left: 10px;\n  box-sizing: border-box;\n}\n\n.jeecg-catalog-main>.catalog-item {\n  padding-left: 0;\n}\n\n:deep(.jeecg-catalog-main .catalog-item .jeecg-catalog-item-content) {\n  width: 100%;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n:deep(.jeecg-catalog-main .catalog-item .jeecg-catalog-item-content:hover >span) {\n  color: #4991f2;\n}\n\n:deep(.jeecg-catalog-main .catalog-item .jeecg-catalog-item-content span) {\n  color: #3d4757;\n  line-height: 30px;\n  font-size: 12px;\n  white-space: nowrap;\n  cursor: pointer;\n  user-select: none;\n}\n\n\n.jeecg-menu-item-row-margin .options{\n  width: 76px;\n  height: 242px;\n}\n\n.jeecg-menu-item-underline .options{\n  height: 180px;\n}\n\nol, ul {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n\nli {\n  display: list-item !important;\n  text-align: -webkit-match-parent;\n  unicode-bidi: isolate;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/ant/btn.less",
    "content": "// button reset\n.ant-btn {\n  // display: inline-flex;\n  // justify-content: center;\n  // align-items: center;\n  // &.ant-btn-success:not(.ant-btn-link),\n  // &.ant-btn-error:not(.ant-btn-link),\n  // &.ant-btn-warning:not(.ant-btn-link),\n  // &.ant-btn-primary:not(.ant-btn-link) {\n  //   box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.12), 0 2px 4px 0 rgba(0, 0, 0, 0.08) !important;\n  // }\n  // &-group {\n  //   .ant-btn:not(:first-child) {\n  //     bottom: 1px;\n  //   }\n  // }\n  &-link:hover,\n  &-link:focus,\n  &-link:active {\n    border-color: transparent !important;\n  }\n\n  &-primary {\n    // update-begin--author:liaozhiyang---date:20240223---for：【QQYUN-8327】btn样式显示不正确\n    // color: @white;\n    // background-color: @button-primary-color;\n    // update-end--author:liaozhiyang---date:20240223---for：【QQYUN-8327】btn样式显示不正确\n\n    &:hover,\n    &:focus {\n      // update-begin--author:liaozhiyang---date:20240223---for：【QQYUN-8327】btn样式显示不正确\n      // color: @white;\n      // background-color: @button-primary-hover-color;\n      // update-end--author:liaozhiyang---date:20240223---for：【QQYUN-8327】btn样式显示不正确\n    }\n    //\n    //&[disabled],\n    //&[disabled]:hover {\n    //  color: fade(@button-cancel-color, 40%) !important;\n    //  background-color: fade(@button-cancel-bg-color, 40%) !important;\n    //  border-color: fade(@button-cancel-border-color, 40%) !important;\n    //}\n  }\n\n  &-primary:not(&-background-ghost):not([disabled]) {\n    color: @white;\n  }\n\n  //&-primary:not(&-background-ghost) {\n  //  border-width: 0;\n  //}\n\n  &-default {\n    // update-begin--author:liaozhiyang---date:20240223---for：【QQYUN-8327】btn样式显示不正确\n    // color: @button-cancel-color;\n    // background-color: @button-cancel-bg-color;\n    // border-color: @button-cancel-border-color;\n\n    // &:hover,\n    // &:focus {\n    //   color: @button-cancel-hover-color;\n    //   background-color: @button-cancel-hover-bg-color;\n    //   border-color: @button-cancel-hover-border-color;\n    // }\n    // update-end--author:liaozhiyang---date:20240223---for：【QQYUN-8327】btn样式显示不正确\n    //\n    //&[disabled],\n    //&[disabled]:hover {\n    //  color: fade(@button-cancel-color, 40%) !important;\n    //  background: fade(@button-cancel-bg-color, 40%) !important;\n    //  border-color: fade(@button-cancel-border-color, 40%) !important;\n    //}\n  }\n\n  [data-theme='light'] &.ant-btn-link.is-disabled {\n    color: rgba(0, 0, 0, 0.25);\n    text-shadow: none;\n    cursor: not-allowed !important;\n    background-color: transparent !important;\n    border-color: transparent !important;\n    box-shadow: none;\n  }\n\n  [data-theme='dark'] &.ant-btn-link.is-disabled {\n    color: rgba(255, 255, 255, 0.25) !important;\n    text-shadow: none;\n    cursor: not-allowed !important;\n    background-color: transparent !important;\n    border-color: transparent !important;\n    box-shadow: none;\n  }\n\n  // color: @white;\n\n  &-success.ant-btn-link:not([disabled='disabled']) {\n    color: @button-success-color;\n\n    &:hover,\n    &:focus {\n      color: @button-success-hover-color;\n      border-color: transparent;\n    }\n\n    &:active {\n      color: @button-success-active-color;\n    }\n  }\n\n  &-success.ant-btn-link.ant-btn-loading,\n  &-warning.ant-btn-link.ant-btn-loading,\n  &-error.ant-btn-link.ant-btn-loading,\n  &-background-ghost.ant-btn-link.ant-btn-loading,\n  &.ant-btn-link.ant-btn-loading {\n    &::before {\n      background: transparent;\n    }\n  }\n\n  &-success:not(.ant-btn-link, .is-disabled) {\n    color: @white;\n    background-color: @button-success-color;\n    border-color: @button-success-color;\n    //border-width: 0;\n\n    &:hover,\n    &:focus {\n      color: @white;\n      background-color: @button-success-hover-color;\n      border-color: @button-success-hover-color;\n    }\n\n    &:active {\n      background-color: @button-success-active-color;\n      border-color: @button-success-active-color;\n    }\n\n    //&[disabled],\n    //&[disabled]:hover {\n    //  color: @white;\n    //  background-color: fade(@button-success-color, 40%);\n    //  border-color: fade(@button-success-color, 40%);\n    //}\n  }\n\n  &-warning.ant-btn-link:not([disabled='disabled']) {\n    color: @button-warn-color;\n\n    &:hover,\n    &:focus {\n      color: @button-warn-hover-color;\n      border-color: transparent;\n    }\n\n    &:active {\n      color: @button-warn-active-color;\n    }\n  }\n\n  &-warning:not(.ant-btn-link, .is-disabled) {\n    color: @white;\n    background-color: @button-warn-color;\n    border-color: @button-warn-color;\n    //border-width: 0;\n\n    &:hover,\n    &:focus {\n      color: @white;\n      background-color: @button-warn-hover-color;\n      border-color: @button-warn-hover-color;\n    }\n\n    &:active {\n      background-color: @button-warn-active-color;\n      border-color: @button-warn-active-color;\n    }\n\n    //&[disabled],\n    //&[disabled]:hover {\n    //  color: @white;\n    //  background-color: fade(@button-warn-color, 40%);\n    //  border-color: fade(@button-warn-color, 40%);\n    //}\n  }\n\n  &-error.ant-btn-link:not([disabled='disabled']) {\n    color: @button-error-color;\n\n    &:hover,\n    &:focus {\n      color: @button-error-hover-color;\n      border-color: transparent;\n    }\n\n    &:active {\n      color: @button-error-active-color;\n    }\n  }\n\n  &-error:not(.ant-btn-link, .is-disabled) {\n    color: @white;\n    background-color: @button-error-color;\n    border-color: @button-error-color;\n    //border-width: 0;\n\n    &:hover,\n    &:focus {\n      color: @white;\n      background-color: @button-error-hover-color;\n      border-color: @button-error-hover-color;\n    }\n\n    &:active {\n      background-color: @button-error-active-color;\n      border-color: @button-error-active-color;\n    }\n\n    //&[disabled],\n    //&[disabled]:hover {\n    //  color: @white;\n    //  background-color: fade(@button-error-color, 40%);\n    //  border-color: fade(@button-error-color, 40%);\n    //}\n  }\n\n  &-background-ghost {\n    border-width: 1px;\n    background-color: transparent !important;\n\n    &[disabled],\n    &[disabled]:hover {\n      color: fade(@white, 40%) !important;\n      background-color: transparent !important;\n      border-color: fade(@white, 40%) !important;\n    }\n  }\n\n  &-dashed&-background-ghost,\n  &-default&-background-ghost {\n    color: @button-ghost-color;\n    border-color: @button-ghost-color;\n\n    &:hover,\n    &:focus {\n      color: @button-ghost-hover-color;\n      border-color: @button-ghost-hover-color;\n    }\n\n    &:active {\n      color: @button-ghost-active-color;\n      border-color: @button-ghost-active-color;\n    }\n\n    &[disabled],\n    &[disabled]:hover {\n      color: fade(@white, 40%) !important;\n      border-color: fade(@white, 40%) !important;\n    }\n  }\n\n  &-background-ghost&-success:not(.ant-btn-link) {\n    color: @button-success-color;\n    background-color: transparent;\n    border-color: @button-success-color;\n    border-width: 1px;\n\n    &:hover,\n    &:focus {\n      color: @button-success-hover-color !important;\n      border-color: @button-success-hover-color;\n    }\n\n    &:active {\n      color: @button-success-active-color;\n      border-color: @button-success-active-color;\n    }\n  }\n\n  &-background-ghost&-warning:not(.ant-btn-link) {\n    color: @button-warn-color;\n    background-color: transparent;\n    border-color: @button-warn-color;\n    border-width: 1px;\n\n    &:hover,\n    &:focus {\n      color: @button-warn-hover-color !important;\n      border-color: @button-warn-hover-color;\n    }\n\n    &:active {\n      color: @button-warn-active-color;\n      border-color: @button-warn-active-color;\n    }\n  }\n\n  &-background-ghost&-error:not(.ant-btn-link) {\n    color: @button-error-color;\n    background-color: transparent;\n    border-color: @button-error-color;\n    border-width: 1px;\n\n    &:hover,\n    &:focus {\n      color: @button-error-hover-color !important;\n      border-color: @button-error-hover-color;\n    }\n\n    &:active {\n      color: @button-error-active-color;\n      border-color: @button-error-active-color;\n    }\n  }\n\n  &-ghost.ant-btn-link:not([disabled='disabled']) {\n    color: @button-ghost-color;\n\n    &:hover,\n    &:focus {\n      color: @button-ghost-hover-color;\n      border-color: transparent;\n    }\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/ant/index.less",
    "content": "@import './pagination.less';\n@import './input.less';\n// update-begin--author:liaozhiyang---date:20240130---for：【issues/5857】Button color类型颜色失效\n@import './btn.less';\n// update-end--author:liaozhiyang---date:20240130---for：【issues/5857】Button color类型颜色失效\n// @import './table.less';\n\n// TODO beta.11 fix\n.ant-col {\n  width: 100%;\n}\n\n.ant-image-preview-root {\n  img {\n    display: unset;\n  }\n}\n//update-begin---author:scott ---date:2023-08-28  for����QQYUN-6374��UnoCSS���windicss����Ӧ����ʽ����--\n/*span.anticon:not(.app-iconify) {\n  vertical-align: 0.125em !important;\n}*/\n//update-end---author:scott ---date::2023-08-28  for����QQYUN-6374��UnoCSS���windicss����Ӧ����ʽ����--\n\n.ant-back-top {\n  right: 20px;\n  bottom: 20px;\n}\n\n.collapse-container__body {\n  > .ant-descriptions {\n    margin-left: 6px;\n  }\n}\n\n.ant-image-preview-operations {\n  background-color: rgba(0, 0, 0, 0.3);\n}\n\n.ant-popover {\n  &-content {\n    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);\n  }\n}\n\n// =================================\n// ==============modal message======\n// =================================\n.modal-icon-warning {\n  color: @warning-color !important;\n}\n\n.modal-icon-success {\n  color: @success-color !important;\n}\n\n.modal-icon-error {\n  color: @error-color !important;\n}\n\n.modal-icon-info {\n  color: @primary-color !important;\n}\n\n.ant-checkbox-checked .ant-checkbox-inner::after,\n.ant-tree-checkbox-checked .ant-tree-checkbox-inner::after {\n  border-top: 0 !important;\n  border-left: 0 !important;\n}\n\n// update-begin--author:liaozhiyang---date:20231218---for：【QQYUN-6366】升级到antd4.x\n.ant-modal {\n  .ant-modal-close {\n    // update-begin--author:liaozhiyang---date:20241010---for：【issues/7260】原生a-modal关闭按钮位置偏移\n    // position: absolute;\n    // top: 0;\n    // right: 0;\n    top: 13px;\n    // update-end--author:liaozhiyang---date:20241010---for：【issues/7260】原生a-modal关闭按钮位置偏移\n    width: auto;\n    height: auto;\n  }\n  .ant-modal-content {\n    padding: 0;\n  }\n}\n\n.ant-input-affix-wrapper > input.ant-input {\n  font-size: 14px;\n}\n\n.ant-pagination-options-size-changer.ant-select {\n  display: inline-block;\n  width: auto;\n}\n\n.ant-tree-select-dropdown .ant-select-tree .ant-select-tree-list-holder-inner {\n  align-items: stretch;\n}\n\n.ant-list .ant-list-item {padding-left: 0;padding-right: 0;}\n\n\n.ant-list-item {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 12px 0;\n  color: #000000d9;\n}\n/** anticon-down跟3.x保持一致*/ \n.ant-dropdown-trigger>.anticon.anticon-down, .ant-dropdown-link>.anticon.anticon-down, .ant-dropdown-button>.anticon.anticon-down {\n  font-size: 10px;\n  vertical-align: baseline;\n}\n/** 表格排序箭头尺寸保持跟3.x一致 */ \n.ant-table-wrapper .ant-table-column-sorter-up, .ant-table-wrapper .ant-table-column-sorter-down {\n  font-size: 11px;\n}\n /** 表格头部文字颜色跟3.x版本保持一致 */\n.ant-table-wrapper .ant-table-thead >tr>th, .ant-table-wrapper .ant-table-thead >tr>td {\n  color: #000000d9;\n  font-weight: 500;\n}\nhtml[data-theme='dark'] .ant-table-wrapper .ant-table-thead >tr>th, .ant-table-wrapper .ant-table-thead >tr>td {\n  color:rgba(255,255,255,.65);\n}\n /** 下拉菜单文字和图标折叠了 */\n.ant-dropdown .ant-dropdown-menu .ant-dropdown-menu-title-content, .ant-dropdown-menu-submenu .ant-dropdown-menu .ant-dropdown-menu-title-content{\n  flex: auto;\n  white-space:nowrap;\n}\n// update-end--author:liaozhiyang---date:20231218---for：【QQYUN-6366】升级到antd4.x\n\n// update-end--author:liaozhiyang---date:20230105---for：【QQYUN-7493】多行文本内容过多时内容会覆盖掉清空按钮\n.ant-input-affix-wrapper-textarea-with-clear-btn {\n  .ant-input-clear-icon {\n    background-color: #fff;\n  }\n}\nhtml[data-theme='dark'] .ant-input-affix-wrapper-textarea-with-clear-btn {\n  .ant-input-clear-icon {\n    background-color: #141414;\n  }\n}\n// update-end--author:liaozhiyang---date:20230105---for：【QQYUN-7493】多行文本内容过多时内容会覆盖掉清空按钮\n\n// update-begin--author:liaozhiyang---date:20230108---for：【QQYUN-7855】table页码同步3.x页面效果\n.ant-table-pagination.ant-pagination {\n  .ant-pagination-item-active,\n  .ant-pagination-item-active:hover {\n    background-color: @primary-color;\n    border-color: transparent;\n    a {\n      color: #fff;\n    }\n  }\n  .ant-pagination-item:not(.ant-pagination-item-active) {\n    background-color: transparent !important;\n    border-color: transparent;\n  }\n  .ant-pagination-prev,\n  .ant-pagination-next,\n  .ant-pagination-item {\n    margin: 0 4px;\n  }\n}\n// update-end--author:liaozhiyang---date:20230108---for：【QQYUN-7855】table页码同步3.x页面效果\n\n//update-begin--author:wangshuai---date:20240429---for：修改tinymce段落下拉框的字体和样式\n.tox .tox-tbtn__select-label{\n  font-size: 14px;\n}\n\n.tox .tox-tbtn--select{\n  width: 80px !important;\n}\n\n.tox .tox-collection__item-label {\n  font-size: 14px !important;\n}\n//update-end--author:wangshuai---date:20240429---for：修改tinymce段落下拉框的字体和样式\n\n// update-begin--author:liaozhiyang---date:20240605---for：【TV360X-189】统一只读样式\nhtml[data-theme='light'] {\n  .ant-form:not(.jeecg-form-detail-effect) {\n    .ant-select.ant-select-disabled {\n      .ant-select-selection-item {\n        color: rgba(51, 51, 51, 0.25) !important;\n        // color: rgba(51, 51, 51, 0.25);\n        .ant-select-selection-item-content {\n          color: rgba(51, 51, 51, 0.25);\n        }\n      }\n    }\n    .ant-input-number.ant-input-number-disabled {\n      .ant-input-number-input {\n        color: rgba(51, 51, 51, 0.25);\n      }\n    }\n  }\n}\n\nhtml[data-theme='dark'] {\n  .ant-form:not(.jeecg-form-detail-effect) {\n    .ant-input-number.ant-input-number-disabled {\n      .ant-input-number-input {\n        color:rgba(255, 255, 255, 0.25);\n      }\n    }\n  }\n}\n// update-end--author:liaozhiyang---date:20240605---for：【TV360X-189】统一只读样式\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/ant/input.less",
    "content": "@import (reference) '../color.less';\n\n// input\n.ant-input {\n  &-number {\n    min-width: 110px;\n  }\n}\n\n.ant-input-affix-wrapper .ant-input-suffix {\n  right: 9px;\n}\n\n.ant-input-clear-icon {\n  margin-right: 5px;\n}\n\n.ant-input-affix-wrapper-textarea-with-clear-btn {\n  padding: 0 !important;\n\n  textarea.ant-input {\n    padding: 4px;\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/ant/pagination.less",
    "content": "html[data-theme='dark'] {\n  .ant-pagination {\n    &.mini {\n      .ant-pagination-prev,\n      .ant-pagination-next,\n      .ant-pagination-item {\n        background-color: rgb(255 255 255 / 4%) !important;\n\n        a {\n          color: #8b949e !important;\n        }\n      }\n\n      .ant-select-arrow {\n        color: @text-color-secondary !important;\n      }\n\n      .ant-pagination-item-active {\n        background-color: @primary-color !important;\n        border: none;\n        border-radius: none !important;\n\n        a {\n          color: @white !important;\n        }\n      }\n    }\n  }\n}\n\n.ant-pagination {\n  &.mini {\n    .ant-pagination-prev,\n    .ant-pagination-next {\n      font-size: 12px;\n      color: @text-color-base;\n      border: 1px solid;\n    }\n\n    .ant-pagination-prev:hover,\n    .ant-pagination-next:hover,\n    .ant-pagination-item:focus,\n    .ant-pagination-item:hover {\n      a {\n        color: @primary-color;\n      }\n    }\n\n    .ant-pagination-prev,\n    .ant-pagination-next,\n    .ant-pagination-item {\n      margin: 0 4px !important;\n      //update-begin---author:scott ---date:2022-09-30  for：【美化】Table分页页面默认背景色丑，去掉-----------\n      //background-color: #f4f4f5 !important;\n      //update-end---author:scott ---date::2022-09-30  for：【美化】Table分页页面默认背景色丑，去掉------------\n      border: none;\n      border-radius: none !important;\n\n      a {\n        margin-top: 1px;\n        color: #606266;\n      }\n\n      &:last-child {\n        margin-right: 0 !important;\n      }\n    }\n\n    .ant-pagination-item-active {\n      background-color: @primary-color !important;\n      border: none;\n      border-radius: none !important;\n\n      a {\n        color: @white !important;\n      }\n    }\n\n    .ant-pagination-options {\n      margin-left: 12px;\n    }\n\n    .ant-pagination-options-quick-jumper input {\n      height: 22px;\n      margin: 0 6px;\n      line-height: 22px;\n      text-align: center;\n    }\n\n    .ant-select-arrow {\n      color: @border-color-shallow-dark;\n    }\n  }\n\n  &-disabled {\n    display: none !important;\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/ant/table.less",
    "content": "@prefix-cls: ~'@{namespace}-basic-table';\n\n// fix table unnecessary scrollbar\n.@{prefix-cls} {\n  .hide-scrollbar-y {\n    .ant-spin-nested-loading {\n      .ant-spin-container {\n        .ant-table {\n          .ant-table-content {\n            .ant-table-scroll {\n              .ant-table-hide-scrollbar {\n                overflow-y: auto !important;\n              }\n\n              .ant-table-content {\n                overflow-y: auto !important;\n              }\n            }\n\n            .ant-table-fixed-right {\n              .ant-table-body-outer {\n                .ant-table-body-inner {\n                  overflow-y: auto !important;\n                }\n              }\n            }\n\n            .ant-table-fixed-left {\n              .ant-table-body-outer {\n                .ant-table-body-inner {\n                  overflow-y: auto !important;\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  .hide-scrollbar-x {\n    .ant-spin-nested-loading {\n      .ant-spin-container {\n        .ant-table {\n          .ant-table-content {\n            .ant-table-scroll {\n              .ant-table-hide-scrollbar {\n                //overflow-x: auto !important;\n              }\n\n              .ant-table-content {\n                overflow: auto !important;\n              }\n            }\n\n            .ant-table-fixed-right {\n              .ant-table-body-outer {\n                .ant-table-body-inner {\n                  overflow-x: auto !important;\n                }\n              }\n            }\n\n            .ant-table-fixed-left {\n              .ant-table-body-outer {\n                .ant-table-body-inner {\n                  overflow-x: auto !important;\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/color.less",
    "content": "html {\n  // header\n  --header-bg-color: #394664;\n  --header-bg-hover-color: #273352;\n  --header-active-menu-bg-color: #273352;\n\n  // sider\n  --sider-dark-bg-color: #273352;\n  --sider-dark-darken-bg-color: #273352;\n  --sider-dark-lighten-bg-color: #273352;\n  --sider-logo-bg-color:linear-gradient(180deg, #000000, #021d37);\n}\n\n@white: #fff;\n\n@content-bg: #f4f7f9;\n\n// :export {\n//   name: \"less\";\n//   mainColor: @mainColor;\n//   fontSize: @fontSize;\n// }\n@iconify-bg-color: #5551;\n\n// =================================\n// ==============border-color=======\n// =================================\n\n// Dark-dark\n@border-color-dark: #b6b7b9;\n\n// Dark-light\n@border-color-shallow-dark: #cececd;\n\n// Light-dark\n@border-color-light: @border-color-base;\n\n// =================================\n// ==============message==============\n// =================================\n\n// success-bg-color\n@success-background-color: #f1f9ec;\n// info-bg-color\n@info-background-color: #e8eff8;\n// warn-bg-color\n@warning-background-color: #fdf6ed;\n// danger-bg-color\n@danger-background-color: #fef0f0;\n\n// =================================\n// ==============Header=============\n// =================================\n\n@header-dark-bg-color: var(--header-bg-color);\n@header-dark-bg-hover-color: var(--header-bg-hover-color);\n@header-light-bg-hover-color: #f6f6f6;\n@header-light-desc-color: #7c8087;\n@header-light-bottom-border-color: #eee;\n// top-menu\n@top-menu-active-bg-color: var(--header-active-menu-bg-color);\n\n// =================================\n// ==============Menu============\n// =================================\n\n// let -menu\n@sider-logo-bg-color: var(--sider-logo-bg-color);\n@sider-dark-bg-color: var(--sider-dark-bg-color);\n@sider-dark-darken-bg-color: var(--sider-dark-darken-bg-color);\n@sider-dark-lighten-bg-color: var(--sider-dark-lighten-bg-color);\n\n// trigger\n@trigger-dark-hover-bg-color: rgba(255, 255, 255, 0.2);\n@trigger-dark-bg-color: rgba(255, 255, 255, 0.1);\n\n// =================================\n// ==============tree============\n// =================================\n// tree item hover background\n@tree-hover-background-color: #f5f7fa;\n// tree item hover font color\n@tree-hover-font-color: #f5f7fa;\n\n// =================================\n// ==============link============\n// =================================\n@link-hover-color: @primary-color;\n@link-active-color: darken(@primary-color, 10%);\n\n// =================================\n// ==============Text color-=============\n// =================================\n\n// Main text color\n@text-color-base: @text-color;\n\n// Label color\n@text-color-call-out: #606266;\n\n// Auxiliary information color-dark\n@text-color-help-dark: #909399;\n\n// =================================\n// ==============breadcrumb=========\n// =================================\n@breadcrumb-item-normal-color: #999;\n// =================================\n// ==============button=============\n// =================================\n\n@button-primary-color: @primary-color;\n@button-primary-hover-color: lighten(@primary-color, 5%);\n@button-primary-active-color: darken(@primary-color, 5%);\n\n@button-ghost-color: @white;\n@button-ghost-hover-color: lighten(@white, 10%);\n@button-ghost-hover-bg-color: #e1ebf6;\n@button-ghost-active-color: darken(@white, 10%);\n\n@button-success-color: @success-color;\n@button-success-hover-color: lighten(@success-color, 10%);\n@button-success-active-color: darken(@success-color, 10%);\n\n@button-warn-color: @warning-color;\n@button-warn-hover-color: lighten(@warning-color, 10%);\n@button-warn-active-color: darken(@warning-color, 10%);\n\n@button-error-color: @error-color;\n@button-error-hover-color: lighten(@error-color, 10%);\n@button-error-active-color: darken(@error-color, 10%);\n\n@button-cancel-color: @text-color-call-out;\n@button-cancel-bg-color: @white;\n@button-cancel-border-color: @border-color-shallow-dark;\n\n// Mouse over\n@button-cancel-hover-color: @primary-color;\n@button-cancel-hover-bg-color: @white;\n@button-cancel-hover-border-color: @primary-color;\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/config.less",
    "content": "@import (reference) 'color.less';\n@import (reference) 'var/index.less';\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/entry.css",
    "content": "* > .enter-x:nth-child(1) {\n  transform: translateX(50px);\n}\n* > .-enter-x:nth-child(1) {\n  transform: translateX(-50px);\n}\n\n* > .enter-x:nth-child(1),\n* > .-enter-x:nth-child(1) {\n  z-index: 9;\n  opacity: 0;\n  animation: enter-x-animation 0.4s ease-in-out 0.3s;\n  animation-fill-mode: forwards;\n  animation-delay: 0.1s;\n}\n* > .enter-x:nth-child(2) {\n  transform: translateX(50px);\n}\n* > .-enter-x:nth-child(2) {\n  transform: translateX(-50px);\n}\n\n* > .enter-x:nth-child(2),\n* > .-enter-x:nth-child(2) {\n  z-index: 8;\n  opacity: 0;\n  animation: enter-x-animation 0.4s ease-in-out 0.3s;\n  animation-fill-mode: forwards;\n  animation-delay: 0.2s;\n}\n* > .enter-x:nth-child(3) {\n  transform: translateX(50px);\n}\n* > .-enter-x:nth-child(3) {\n  transform: translateX(-50px);\n}\n\n* > .enter-x:nth-child(3),\n* > .-enter-x:nth-child(3) {\n  z-index: 7;\n  opacity: 0;\n  animation: enter-x-animation 0.4s ease-in-out 0.3s;\n  animation-fill-mode: forwards;\n  animation-delay: 0.3s;\n}\n\n* > .enter-x:nth-child(4) {\n  transform: translateX(50px);\n}\n* > .-enter-x:nth-child(4) {\n  transform: translateX(-50px);\n}\n\n* > .enter-x:nth-child(4),\n* > .-enter-x:nth-child(4) {\n  z-index: 6;\n  opacity: 0;\n  animation: enter-x-animation 0.4s ease-in-out 0.3s;\n  animation-fill-mode: forwards;\n  animation-delay: 0.4s;\n}\n\n* > .enter-x:nth-child(5) {\n  transform: translateX(50px);\n}\n* > .-enter-x:nth-child(5) {\n  transform: translateX(-50px);\n}\n\n* > .enter-x:nth-child(5),\n* > .-enter-x:nth-child(5) {\n  z-index: 5;\n  opacity: 0;\n  animation: enter-x-animation 0.4s ease-in-out 0.3s;\n  animation-fill-mode: forwards;\n  animation-delay: 0.5s;\n}\n\n* > .enter-y:nth-child(1) {\n  transform: translateX(50px);\n}\n* > .-enter-y:nth-child(1) {\n  transform: translateX(-50px);\n}\n\n* > .enter-y:nth-child(1),\n* > .-enter-y:nth-child(1) {\n  z-index: 9;\n  opacity: 0;\n  animation: enter-y-animation 0.4s ease-in-out 0.3s;\n  animation-fill-mode: forwards;\n  animation-delay: 0.1s;\n}\n* > .enter-y:nth-child(2) {\n  transform: translateX(50px);\n}\n* > .-enter-y:nth-child(2) {\n  transform: translateX(-50px);\n}\n\n* > .enter-y:nth-child(2),\n* > .-enter-y:nth-child(2) {\n  z-index: 8;\n  opacity: 0;\n  animation: enter-y-animation 0.4s ease-in-out 0.3s;\n  animation-fill-mode: forwards;\n  animation-delay: 0.2s;\n}\n* > .enter-y:nth-child(3) {\n  transform: translateX(50px);\n}\n* > .-enter-y:nth-child(3) {\n  transform: translateX(-50px);\n}\n\n* > .enter-y:nth-child(3),\n* > .-enter-y:nth-child(3) {\n  z-index: 7;\n  opacity: 0;\n  animation: enter-y-animation 0.4s ease-in-out 0.3s;\n  animation-fill-mode: forwards;\n  animation-delay: 0.3s;\n}\n\n* > .enter-y:nth-child(4) {\n  transform: translateX(50px);\n}\n* > .-enter-y:nth-child(4) {\n  transform: translateX(-50px);\n}\n\n* > .enter-y:nth-child(4),\n* > .-enter-y:nth-child(4) {\n  z-index: 6;\n  opacity: 0;\n  animation: enter-y-animation 0.4s ease-in-out 0.3s;\n  animation-fill-mode: forwards;\n  animation-delay: 0.4s;\n}\n\n* > .enter-y:nth-child(5) {\n  transform: translateX(50px);\n}\n* > .-enter-y:nth-child(5) {\n  transform: translateX(-50px);\n}\n\n* > .enter-y:nth-child(5),\n* > .-enter-y:nth-child(5) {\n  z-index: 5;\n  opacity: 0;\n  animation: enter-y-animation 0.4s ease-in-out 0.3s;\n  animation-fill-mode: forwards;\n  animation-delay: 0.5s;\n}\n\n@keyframes enter-x-animation {\n  to {\n    opacity: 1;\n    transform: translateX(0);\n  }\n}\n@keyframes enter-y-animation {\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n/*update-begin---author:wangshuai ---date:20230829  for：UnoCSS替代windicss 导致全局默认边框样丢失------------*/\n*, :before, :after {\n  box-sizing: border-box;\n  border-width: 0;\n  border-style: solid;\n  border-color: #e5e7eb;\n}\n.border-primary,.hover\\:border-primary:hover {\n  --tw-border-opacity: 1;\n  border-color: rgba(24,144,255,var(--tw-border-opacity))\n}\n/*update-end---author:wangshuai ---date:20230829  for：UnoCSS替代windicss 导致全局默认边框样丢失------------*/"
  },
  {
    "path": "jeecgboot-vue3/src/design/index.less",
    "content": "@import 'transition/index.less';\n@import 'var/index.less';\n@import 'public.less';\n@import 'ant/index.less';\n@import './theme.less';\n@import './entry.css';\n\ninput:-webkit-autofill {\n  -webkit-box-shadow: 0 0 0 1000px white inset !important;\n}\n\n:-webkit-autofill {\n  transition: background-color 5000s ease-in-out 0s !important;\n}\n\nhtml {\n  overflow: hidden;\n  -webkit-text-size-adjust: 100%;\n}\n\nhtml,\nbody {\n  width: 100%;\n  height: 100%;\n  // body添加行高保持跟3.x一致\n  line-height: 1.5715;\n  \n  &.color-weak {\n    filter: invert(80%);\n  }\n\n  &.gray-mode {\n    filter: grayscale(100%);\n    filter: progid:dximagetransform.microsoft.basicimage(grayscale=1);\n  }\n}\n\n/* 【LOWCOD-2300】【vue3】online--online表单开发，下拉框位置靠下时，点开下拉框，整屏跳 */\nbody {\n  overflow: visible;\n  overflow-x: hidden;\n}\n\na:focus,\na:active,\nbutton,\ndiv,\nsvg,\nspan {\n  outline: none !important;\n}\n\n// 保持 和 windi 一样的全局样式，减少升级带来的影响\nul {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\nimg, video {\n  max-width: 100%;\n  height: auto;\n}\n// 保持 和 windi 一样的全局样式，减少升级带来的影响\n\n// update-begin--author:liaozhiyang---date:20230925---for：【issues/5407】字段信息校验是多行提示会被遮挡\n.vxe-cell--valid-error-msg {\n  white-space: nowrap;\n}\n// update-end--author:liaozhiyang---date:20230925---for：【issues/5407】字段信息校验是多行提示会被遮挡\n\n// update-begin--author:liaozhiyang---date:20231013---for：【QQYUN-5133】升级之后提示样式跟之前一致\n.vxe-table .vxe-body--row:last-child .vxe-cell--valid-error-hint {\n  margin-top: auto;\n}\n.vxe-cell--valid-error-hint {\n  margin-top: 6px;\n}\n.vxe-cell--valid-error-msg {\n  display: inline-block;\n  border-radius: 4px !important;\n  padding: 8px 12px !important;\n  color: #fff !important;\n  background-color: #f56c6c !important;\n  \n}\n// update-end--author:liaozhiyang---date:20231013---for：【QQYUN-5133】升级之后提示样式跟之前一致\n// update-begin--author:liaozhiyang---date:20231116---for：【QQYUN-7011】online表单多了一个蓝色的边框\n// .vxe-table.vxe-table--render-default .vxe-body--column.col--selected {\n//   box-shadow: none;\n// }\n// update-end--author:liaozhiyang---date:20231116---for：【QQYUN-7011】online表单多了一个蓝色的边框\n\n// update-begin--author:liaozhiyang---date:20240424---for：【issues/1175】解决vxetable鼠标hover之后title显示不对的问题\n.vxe-cell {\n  pointer-events: none;\n  > * {\n    pointer-events: auto;\n  }\n}\n// update-end--author:liaozhiyang---date:20240424---for：【issues/1175】解决vxetable鼠标hover之后title显示不对的问题\n\n// update-begin--author:liaozhiyang---date:20240429---for：【QQYUN-9023】引导样式调整\n.introjs-tooltipReferenceLayer {\n  .introjs-tooltip-title {\n    font-size: 15px;\n  }\n  .introjs-skipbutton {\n    font-size: 20px;\n    line-height: 35px;\n    height: 35px;\n    width: 35px;\n    font-weight: 500;\n  }\n  .introjs-tooltiptext {\n    padding: 16px;\n    font-size: 14px;\n  }\n  .introjs-bullets {\n    padding-top: 0;\n    padding-bottom: 8px;\n  }\n  .introjs-bullets ul li a {\n    width: 4px;\n    height: 4px;\n  }\n  .introjs-button {\n    padding: .2rem 0.5rem;\n    font-size: 13px;\n  }\n}\n// update-end--author:liaozhiyang---date:20240429---for：【QQYUN-9023】引导样式调整\n\n// update-begin--author:liaozhiyang---date:20240605---for：【TV360X-857】online代码生成详情样式调整\n\nhtml[data-theme='light'] {\n  .jeecg-form-detail-effect {\n    *:not(.ant-select-selection-placeholder){\n      color: #606266!important;\n    }\n    .ant-row label {\n      color: #797c81 !important;\n    }\n    .ant-select-selector,\n    .ant-btn,\n    .ant-input,\n    .ant-input-affix-wrapper,\n    .ant-picker,\n    .ant-input-number {\n      // border: none !important;\n      // color: rgba(51, 51, 51, 0.25) !important;\n      color: #606266!important;\n      background-color: #f9f9fa !important;\n    }\n\n    a,\n    .anticon {\n      pointer-events: none;\n      cursor: text;\n      color: #606266!important;\n      &:hover {\n        background: transparent;\n      }\n    }\n\n    .ant-select.ant-select-disabled .ant-select-selection-item .ant-select-selection-item-content {\n      color: #606266!important;\n    }\n    .ant-select-selection-item {\n      color: #606266!important;\n    }\n\n    :where(.css-dev-only-do-not-override-dvamda).ant-picker .ant-picker-input >input-disabled, :where(.css-dev-only-do-not-override-dvamda).ant-picker .ant-picker-input >input[disabled] {\n      color: #606266!important;\n    }\n    .ant-select-selection-item {\n      border-color: #eee !important;\n      background-color: transparent !important;\n    }\n    //【QQYUN-13754】switch在禁用的方式下效果有问题：字体为黑色\n    .ant-switch-disabled .ant-switch-inner-checked,.ant-switch-inner-unchecked{\n      color: #fff !important;\n    }\n  }\n}\nhtml[data-theme='dark'] {\n  .jeecg-form-detail-effect {\n    * {\n      color: #606266;\n    }\n    .ant-upload-text-icon, a {\n      color:rgba(255, 255, 255, 0.25) ;\n    }\n    .ant-select-selector,\n    .ant-btn,\n    .ant-input,\n    .ant-input-affix-wrapper,\n    .ant-picker,\n    .ant-input-number {\n      background-color: transparent !important;\n    }\n\n    .ant-select-selection-item {\n      background-color: transparent !important;\n    }\n    // 暗黑模式下输入框等icon隐藏\n    .ant-picker-suffix,.ant-select-arrow {\n      content:\" \";\n      display: none;\n    }\n  }\n}\n.jeecg-form-detail-effect {\n  .ant-select-selector,\n  .ant-btn,\n  .ant-input,\n  .ant-input-affix-wrapper,\n  .ant-picker,\n  .ant-input-number {\n    border: none !important;\n  }\n  a,\n  .anticon {\n    pointer-events: none;\n    cursor: text;\n    &:hover {\n      background: transparent;\n    }\n  }\n  .ant-picker {\n    width: 100%;\n  }\n  textarea {\n    resize: none !important;\n  }\n  input {\n    border: none !important;\n  }\n  input, textarea {\n    user-select: auto;\n    cursor: text !important;\n  }\n  .JSelectDept,\n  .JselectUser,\n  .JSelectPosition {\n    > div {\n      > .ant-row {\n        .left {\n          width: 100%;\n        }\n        .right {\n          display: none;\n        }\n      }\n    }\n  }\n  .ant-select-selection-item-remove {\n    display: none;\n  }\n  .jeecg-j-upload-container {\n    .ant-upload {\n      display: none;\n    }\n    .ant-upload-list-item-done {\n      a {\n        pointer-events: auto !important;\n        cursor: pointer !important;\n      }\n      .ant-upload-list-item-actions {\n        display: none;\n      }\n    }\n  }\n  .ant-upload-picture-card-wrapper {\n    .ant-upload {\n      pointer-events: none;\n      cursor: not-allowed;\n      .ant-upload-text,.anticon {\n       display: none;\n      }\n    }\n    .ant-upload-list-item-done {\n      a {\n        pointer-events: auto !important;\n        cursor: pointer !important;\n      }\n      .ant-btn {\n        display: none;\n      }\n    }\n  }\n}\n// update-end--author:liaozhiyang---date:20240605---for：【TV360X-857】online代码生成详情样式调整\n\n// update-begin--author:wangshuai---date:20240611---for：【TV360X-1070】一对多内嵌，为什么多这一块，不从头对齐\n.ant-table-wrapper .ant-table.ant-table-middle .ant-table-tbody .ant-table-wrapper:only-child .ant-table{\n  margin-block: 0;\n  margin-inline: 0;\n}\n// update-end--author:wangshuai---date:20240611---for：【TV360X-1070】一对多内嵌，为什么多这一块，不从头对齐\n\n// 单行文本溢出省略号\n.ellipsis {\n  text-overflow: ellipsis;\n  overflow: hidden;\n  white-space: nowrap;\n}\n// 两行省略\n.ellipsis-2 {\n  display: -webkit-box;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  -webkit-line-clamp: 2;\n  -webkit-box-orient: vertical;\n  word-break: break-all;\n}\n// 三行省略\n.ellipsis-3 {\n  display: -webkit-box;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  -webkit-line-clamp: 3;\n  -webkit-box-orient: vertical;\n}\n\n.table-action-item {\n  &.color-red {\n    color: red !important;\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/public.less",
    "content": "#app {\n  width: 100%;\n  height: 100%;\n}\n\n// =================================\n// ==============scrollbar==========\n// =================================\n\n::-webkit-scrollbar {\n  width: 7px;\n  height: 8px;\n}\n\n// ::-webkit-scrollbar-track {\n//   background: transparent;\n// }\n\n::-webkit-scrollbar-track {\n  background-color: rgba(0, 0, 0, 0.05);\n}\n\n::-webkit-scrollbar-thumb {\n  // background: rgba(0, 0, 0, 0.6);\n  background-color: rgba(144, 147, 153, 0.3);\n  // background-color: rgba(144, 147, 153, 0.3);\n  border-radius: 2px;\n  box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.2);\n}\n\n::-webkit-scrollbar-thumb:hover {\n  background-color: @border-color-dark;\n}\n\n[data-theme='dark'] {\n  ::-webkit-scrollbar-thumb:hover {\n    background-color: #5e6063;\n  }\n}\n\n// =================================\n// ==============nprogress==========\n// =================================\n#nprogress {\n  pointer-events: none;\n\n  .bar {\n    position: fixed;\n    top: 0;\n    left: 0;\n    z-index: 99999;\n    width: 100%;\n    height: 2px;\n    background-color: @primary-color;\n    opacity: 0.75;\n  }\n}\n\n// =======================================\n// ============ [sjl] 按钮组样式 ==========\n// =======================================\n.j-table-operator {\n  // Button按钮间距\n  .ant-btn {\n    margin: 0 8px 8px 0;\n    transition: margin 0s;\n  }\n\n  & > .ant-btn:last-of-type {\n    margin: 0 0 8px 0;\n  }\n\n  .ant-btn-group,\n  &.ant-btn-group {\n    .ant-btn {\n      margin: 0;\n      transition: margin 0s;\n    }\n\n    & > .ant-btn:last-of-type {\n      margin: 0 8px 8px 0;\n    }\n  }\n}\n\n// ========================================\n// ============ [sjl] 底部按钮样式 ==========\n// ========================================\n.j-box-bottom-button {\n  height: 28px;\n\n  &-float {\n    position: absolute;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    border-top: 1px solid #e8e8e8;\n    padding: 10px 16px;\n    text-align: right;\n    background: #fff;\n    border-radius: 0 0 2px 2px;\n\n    & .ant-btn {\n      margin-left: 8px;\n    }\n  }\n\n  &.offset-20 &-float {\n    left: -20px;\n    right: -20px;\n    bottom: -20px;\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/theme.less",
    "content": ".bg-white {\n  background-color: @component-background !important;\n}\n\nhtml[data-theme='light'] {\n  // update-begin--author:liaozhiyang---date:20240407---for：【QQYUN-8774】给body加上打底的字体颜色\n  body{\n    color: rgba(0, 0, 0, 0.65);\n  }\n  // update-end--author:liaozhiyang---date:20240407---for：【QQYUN-8774】给body加上打底的字体颜色\n  .text-secondary {\n    color: rgba(0, 0, 0, 0.45);\n  }\n  /*【美化】自定义table字体颜色*/\n  .ant-table {\n    color: rgba(0, 0, 0, 0.65);\n  }\n  /*【美化】自定义table字体颜色*/\n  /*【美化】自定义form字体颜色*/\n  .ant-select-multiple .ant-select-selection-item-content {\n    color: rgba(0, 0, 0, 0.65);\n  }\n  .ant-input-affix-wrapper > input.ant-input {\n    // update-begin--author:liaozhiyang---date:20240605---for：【TV360X-189】统一只读样式\n    &:not([disabled]) {\n      color: rgba(0, 0, 0, 0.65);\n    }\n    // update-end--author:liaozhiyang---date:20240605---for：【TV360X-189】统一只读样式\n  }\n  .ant-select-single.ant-select-show-arrow .ant-select-selection-item, .ant-select-single.ant-select-show-arrow {\n    color: rgba(0, 0, 0, 0.65);\n  }\n  /*【美化】自定义form字体颜色*/\n  \n  .ant-alert-success {\n    background-color: #f6ffed;\n    border: 1px solid #b7eb8f;\n  }\n\n  .ant-alert-error {\n    background-color: #fff2f0;\n    border: 1px solid #ffccc7;\n  }\n\n  .ant-alert-warning {\n    background-color: #fffbe6;\n    border: 1px solid #ffe58f;\n  }\n  :not(:root):fullscreen::backdrop {\n    background-color: @layout-body-background !important;\n  }\n}\n\n[data-theme='dark'] {\n  // update-begin--author:liaozhiyang---date:20240407---for：【QQYUN-8774】给body加上打底的字体颜色\n  body{\n    color: rgba(255, 255, 255, 0.85);\n  }\n  // update-end--author:liaozhiyang---date:20240407---for：【QQYUN-8774】给body加上打底的字体颜色\n  // update-begin--author:liaozhiyang---date:20240407---for：【QQYUN-8641】黑色主题-流程办理\n  .ant-list .ant-list-item {\n    color: rgba(255, 255, 255, 0.85);\n  }\n  // update-end--author:liaozhiyang---date:20240407---for：【QQYUN-8641】黑色主题-流程办理\n  .text-secondary {\n    color: #8b949e;\n  }\n\n  .ant-card-grid-hoverable:hover {\n    box-shadow: 0 3px 6px -4px rgb(0 0 0 / 48%), 0 6px 16px 0 rgb(0 0 0 / 32%), 0 9px 28px 8px rgb(0 0 0 / 20%);\n  }\n\n  .ant-card-grid {\n    box-shadow: 1px 0 0 0 #434343, 0 1px 0 0 #434343, 1px 1px 0 0 #434343, 1px 0 0 0 #434343 inset, 0 1px 0 0 #434343 inset;\n  }\n\n  .ant-calendar-selected-day .ant-calendar-date {\n    color: rgba(0, 0, 0, 0.8);\n  }\n\n  .ant-select-tree li .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected {\n    color: rgba(0, 0, 0, 0.9);\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/transition/base.less",
    "content": ".transition-default() {\n  &-enter-active,\n  &-leave-active {\n    transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1) !important;\n  }\n\n  &-move {\n    transition: transform 0.4s;\n  }\n}\n\n.expand-transition {\n  .transition-default();\n}\n\n.expand-x-transition {\n  .transition-default();\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/transition/fade.less",
    "content": ".fade-enter-active,\n.fade-leave-active {\n  transition: opacity 0.2s ease-in-out;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n  opacity: 0;\n}\n\n/* fade-slide */\n.fade-slide-leave-active,\n.fade-slide-enter-active {\n  transition: all 0.3s;\n}\n\n.fade-slide-enter-from {\n  opacity: 0;\n  transform: translateX(-30px);\n}\n\n.fade-slide-leave-to {\n  opacity: 0;\n  transform: translateX(30px);\n}\n\n// ///////////////////////////////////////////////\n// Fade Bottom\n// ///////////////////////////////////////////////\n\n// Speed: 1x\n.fade-bottom-enter-active,\n.fade-bottom-leave-active {\n  transition: opacity 0.25s, transform 0.3s;\n}\n\n.fade-bottom-enter-from {\n  opacity: 0;\n  transform: translateY(-10%);\n}\n\n.fade-bottom-leave-to {\n  opacity: 0;\n  transform: translateY(10%);\n}\n\n// fade-scale\n.fade-scale-leave-active,\n.fade-scale-enter-active {\n  transition: all 0.28s;\n}\n\n.fade-scale-enter-from {\n  opacity: 0;\n  transform: scale(1.2);\n}\n\n.fade-scale-leave-to {\n  opacity: 0;\n  transform: scale(0.8);\n}\n\n// ///////////////////////////////////////////////\n// Fade Top\n// ///////////////////////////////////////////////\n\n// Speed: 1x\n.fade-top-enter-active,\n.fade-top-leave-active {\n  transition: opacity 0.2s, transform 0.25s;\n}\n\n.fade-top-enter-from {\n  opacity: 0;\n  transform: translateY(8%);\n}\n\n.fade-top-leave-to {\n  opacity: 0;\n  transform: translateY(-8%);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/transition/index.less",
    "content": "@import './base.less';\n@import './fade.less';\n@import './scale.less';\n@import './slide.less';\n@import './scroll.less';\n@import './zoom.less';\n\n.collapse-transition {\n  transition: 0.2s height ease-in-out, 0.2s padding-top ease-in-out, 0.2s padding-bottom ease-in-out;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/transition/scale.less",
    "content": ".scale-transition {\n  .transition-default();\n\n  &-enter-from,\n  &-leave,\n  &-leave-to {\n    opacity: 0;\n    transform: scale(0);\n  }\n}\n\n.scale-rotate-transition {\n  .transition-default();\n\n  &-enter-from,\n  &-leave,\n  &-leave-to {\n    opacity: 0;\n    transform: scale(0) rotate(-45deg);\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/transition/scroll.less",
    "content": ".scroll-y-transition {\n  .transition-default();\n\n  &-enter-from,\n  &-leave-to {\n    opacity: 0;\n  }\n\n  &-enter-from {\n    transform: translateY(-15px);\n  }\n\n  &-leave-to {\n    transform: translateY(15px);\n  }\n}\n\n.scroll-y-reverse-transition {\n  .transition-default();\n\n  &-enter-from,\n  &-leave-to {\n    opacity: 0;\n  }\n\n  &-enter-from {\n    transform: translateY(15px);\n  }\n\n  &-leave-to {\n    transform: translateY(-15px);\n  }\n}\n\n.scroll-x-transition {\n  .transition-default();\n\n  &-enter-from,\n  &-leave-to {\n    opacity: 0;\n  }\n\n  &-enter-from {\n    transform: translateX(-15px);\n  }\n\n  &-leave-to {\n    transform: translateX(15px);\n  }\n}\n\n.scroll-x-reverse-transition {\n  .transition-default();\n\n  &-enter-from,\n  &-leave-to {\n    opacity: 0;\n  }\n\n  &-enter-from {\n    transform: translateX(15px);\n  }\n\n  &-leave-to {\n    transform: translateX(-15px);\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/transition/slide.less",
    "content": ".slide-y-transition {\n  .transition-default();\n\n  &-enter-from,\n  &-leave-to {\n    opacity: 0;\n    transform: translateY(-15px);\n  }\n}\n\n.slide-y-reverse-transition {\n  .transition-default();\n\n  &-enter-from,\n  &-leave-to {\n    opacity: 0;\n    transform: translateY(15px);\n  }\n}\n\n.slide-x-transition {\n  .transition-default();\n\n  &-enter-from,\n  &-leave-to {\n    opacity: 0;\n    transform: translateX(-15px);\n  }\n}\n\n.slide-x-reverse-transition {\n  .transition-default();\n\n  &-enter-from,\n  &-leave-to {\n    opacity: 0;\n    transform: translateX(15px);\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/transition/zoom.less",
    "content": "// zoom-out\n.zoom-out-enter-active,\n.zoom-out-leave-active {\n  transition: opacity 0.1 ease-in-out, transform 0.15s ease-out;\n}\n\n.zoom-out-enter-from,\n.zoom-out-leave-to {\n  opacity: 0;\n  transform: scale(0);\n}\n\n// zoom-fade\n.zoom-fade-enter-active,\n.zoom-fade-leave-active {\n  transition: transform 0.2s, opacity 0.3s ease-out;\n}\n\n.zoom-fade-enter-from {\n  opacity: 0;\n  transform: scale(0.92);\n}\n\n.zoom-fade-leave-to {\n  opacity: 0;\n  transform: scale(1.06);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/var/breakpoint.less",
    "content": "// =================================\n// ==============屏幕断点============\n// =================================\n\n// Extra small screen / phone\n@screen-xs: 480px;\n@screen-xs-min: @screen-xs;\n\n// Small screen / tablet\n@screen-sm: 576px;\n@screen-sm-min: @screen-sm;\n\n// Medium screen / desktop\n@screen-md: 768px;\n@screen-md-min: @screen-md;\n\n// Large screen / wide desktop\n@screen-lg: 992px;\n@screen-lg-min: @screen-lg;\n\n// Extra large screen / full hd\n@screen-xl: 1200px;\n@screen-xl-min: @screen-xl;\n\n// Extra extra large screen / large desktop\n@screen-2xl: 1600px;\n@screen-2xl-min: @screen-2xl;\n\n@screen-xs-max: (@screen-sm-min - 1px);\n@screen-sm-max: (@screen-md-min - 1px);\n@screen-md-max: (@screen-lg-min - 1px);\n@screen-lg-max: (@screen-xl-min - 1px);\n@screen-xl-max: (@screen-2xl-min - 1px);\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/var/easing.less",
    "content": "// =================================\n// ==============动画函数-===========\n// =================================\n\n@ease-base-out: cubic-bezier(0.7, 0.3, 0.1, 1);\n@ease-base-in: cubic-bezier(0.9, 0, 0.3, 0.7);\n@ease-out: cubic-bezier(0.215, 0.61, 0.355, 1);\n@ease-in: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n@ease-in-out: cubic-bezier(0.645, 0.045, 0.355, 1);\n@ease-out-back: cubic-bezier(0.12, 0.4, 0.29, 1.46);\n@ease-in-back: cubic-bezier(0.71, -0.46, 0.88, 0.6);\n@ease-in-out-back: cubic-bezier(0.71, -0.46, 0.29, 1.46);\n@ease-out-circ: cubic-bezier(0.08, 0.82, 0.17, 1);\n@ease-in-circ: cubic-bezier(0.6, 0.04, 0.98, 0.34);\n@ease-in-out-circ: cubic-bezier(0.78, 0.14, 0.15, 0.86);\n@ease-out-quint: cubic-bezier(0.23, 1, 0.32, 1);\n@ease-in-quint: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n@ease-in-out-quint: cubic-bezier(0.86, 0, 0.07, 1);\n"
  },
  {
    "path": "jeecgboot-vue3/src/design/var/index.less",
    "content": "@import (reference) '../color.less';\n@import 'easing';\n@import 'breakpoint';\n\n@namespace: jeecg;\n\n// tabs\n// updateBy:sunjianlei---updateDate:2021-09-03---修改tab切换栏样式：更改高度\n@multiple-height: 30px;\n@multiple-card-height: 50px;\n// update-begin--author:liaozhiyang---date:20240407---for：【QQYUN-8762】标签页圆滑高度\n@multiple-smooth-height: 48px;\n// update-end--author:liaozhiyang---date:20240407---for：【QQYUN-8762】标签页圆滑高度\n\n// headers\n// update-begin--author:liaozhiyang---date:20240407---for：【QQYUN-8762】顶栏高度\n@header-height: 60px;\n// update-end--author:liaozhiyang---date:20240407---for：【QQYUN-8762】顶栏高度\n\n// logo width\n@logo-width: 32px;\n\n//\n@side-drag-z-index: 200;\n\n@page-loading-z-index: 10000;\n\n@lock-page-z-index: 3000;\n\n@layout-header-fixed-z-index: 500;\n\n@multiple-tab-fixed-z-index: 505;\n\n@layout-sider-fixed-z-index: 510;\n\n@layout-mix-sider-fixed-z-index: 550;\n\n@preview-comp-z-index: 1000;\n\n@page-footer-z-index: 99;\n\n.bem(@n; @content) {\n  @{namespace}-@{n} {\n    @content();\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/directives/clickOutside.ts",
    "content": "import { on } from '/@/utils/domUtils';\nimport { isServer } from '/@/utils/is';\nimport type { ComponentPublicInstance, DirectiveBinding, ObjectDirective } from 'vue';\n\ntype DocumentHandler = <T extends MouseEvent>(mouseup: T, mousedown: T) => void;\n\ntype FlushList = Map<\n  HTMLElement,\n  {\n    documentHandler: DocumentHandler;\n    bindingFn: (...args: unknown[]) => unknown;\n  }\n>;\n\nconst nodeList: FlushList = new Map();\n\nlet startClick: MouseEvent;\n\nif (!isServer) {\n  on(document, 'mousedown', (e: MouseEvent) => (startClick = e));\n  on(document, 'mouseup', (e: MouseEvent) => {\n    for (const { documentHandler } of nodeList.values()) {\n      documentHandler(e, startClick);\n    }\n  });\n}\n\nfunction createDocumentHandler(el: HTMLElement, binding: DirectiveBinding): DocumentHandler {\n  let excludes: HTMLElement[] = [];\n  if (Array.isArray(binding.arg)) {\n    excludes = binding.arg;\n  } else {\n    // due to current implementation on binding type is wrong the type casting is necessary here\n    excludes.push(binding.arg as unknown as HTMLElement);\n  }\n  return function (mouseup, mousedown) {\n    const popperRef = (\n      binding.instance as ComponentPublicInstance<{\n        popperRef: Nullable<HTMLElement>;\n      }>\n    ).popperRef;\n    const mouseUpTarget = mouseup.target as Node;\n    const mouseDownTarget = mousedown.target as Node;\n    const isBound = !binding || !binding.instance;\n    const isTargetExists = !mouseUpTarget || !mouseDownTarget;\n    const isContainedByEl = el.contains(mouseUpTarget) || el.contains(mouseDownTarget);\n    const isSelf = el === mouseUpTarget;\n\n    const isTargetExcluded =\n      (excludes.length && excludes.some((item) => item?.contains(mouseUpTarget))) ||\n      (excludes.length && excludes.includes(mouseDownTarget as HTMLElement));\n    const isContainedByPopper = popperRef && (popperRef.contains(mouseUpTarget) || popperRef.contains(mouseDownTarget));\n    if (isBound || isTargetExists || isContainedByEl || isSelf || isTargetExcluded || isContainedByPopper) {\n      return;\n    }\n    binding.value();\n  };\n}\n\nconst ClickOutside: ObjectDirective = {\n  beforeMount(el, binding) {\n    nodeList.set(el, {\n      documentHandler: createDocumentHandler(el, binding),\n      bindingFn: binding.value,\n    });\n  },\n  updated(el, binding) {\n    nodeList.set(el, {\n      documentHandler: createDocumentHandler(el, binding),\n      bindingFn: binding.value,\n    });\n  },\n  unmounted(el) {\n    nodeList.delete(el);\n  },\n};\n\nexport default ClickOutside;\n"
  },
  {
    "path": "jeecgboot-vue3/src/directives/index.ts",
    "content": "/**\n * Configure and register global directives\n */\nimport type { App } from 'vue';\nimport { setupPermissionDirective } from './permission';\nimport { setupLoadingDirective } from './loading';\n\nexport function setupGlobDirectives(app: App) {\n  setupPermissionDirective(app);\n  setupLoadingDirective(app);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/directives/loading.ts",
    "content": "import { createLoading } from '/@/components/Loading';\nimport type { Directive, App } from 'vue';\n\nconst loadingDirective: Directive = {\n  mounted(el, binding) {\n    const tip = el.getAttribute('loading-tip');\n    const background = el.getAttribute('loading-background');\n    const size = el.getAttribute('loading-size');\n    const fullscreen = !!binding.modifiers.fullscreen;\n    const instance = createLoading(\n      {\n        tip,\n        background,\n        size: size || 'large',\n        loading: !!binding.value,\n        absolute: !fullscreen,\n      },\n      fullscreen ? document.body : el\n    );\n    el.instance = instance;\n  },\n  updated(el, binding) {\n    const instance = el.instance;\n    if (!instance) return;\n    instance.setTip(el.getAttribute('loading-tip'));\n    if (binding.oldValue !== binding.value) {\n      if (binding.oldValue !== binding.value) {\n        instance.setLoading?.(binding.value && !instance.loading);\n      }\n    }\n  },\n  unmounted(el) {\n    el?.instance?.close();\n  },\n};\n\nexport function setupLoadingDirective(app: App) {\n  app.directive('loading', loadingDirective);\n}\n\nexport default loadingDirective;\n"
  },
  {
    "path": "jeecgboot-vue3/src/directives/permission.ts",
    "content": "/**\n * Global authority directive\n * Used for fine-grained control of component permissions\n * @Example v-auth=\"RoleEnum.TEST\"\n */\nimport type { App, Directive, DirectiveBinding } from 'vue';\n\nimport { usePermission } from '/@/hooks/web/usePermission';\n\nfunction isAuth(el: Element, binding: any) {\n  // update-begin--author:liaozhiyang---date:20240529---for【TV360X-460】basicForm支持v-auth指令(权限控制显隐)\n  const value = binding.value;\n  if (!value) return;\n  // update-end--author:liaozhiyang---date:20240529---for【TV360X-460】basicForm支持v-auth指令(权限控制显隐)\n  const { hasPermission } = usePermission();\n  if (!hasPermission(value)) {\n    el.parentNode?.removeChild(el);\n  }\n}\n\nconst mounted = (el: Element, binding: DirectiveBinding<any>) => {\n  isAuth(el, binding);\n};\n\nconst authDirective: Directive = {\n  mounted,\n};\n\nexport function setupPermissionDirective(app: App) {\n  app.directive('auth', authDirective);\n}\n\nexport default authDirective;\n"
  },
  {
    "path": "jeecgboot-vue3/src/directives/repeatClick.ts",
    "content": "/**\n * Prevent repeated clicks\n * @Example v-repeat-click=\"()=>{}\"\n */\nimport { on, once } from '/@/utils/domUtils';\nimport type { Directive, DirectiveBinding } from 'vue';\n\nconst repeatDirective: Directive = {\n  beforeMount(el: Element, binding: DirectiveBinding<any>) {\n    let interval: Nullable<IntervalHandle> = null;\n    let startTime = 0;\n    const handler = (): void => binding?.value();\n    const clear = (): void => {\n      if (Date.now() - startTime < 100) {\n        handler();\n      }\n      interval && clearInterval(interval);\n      interval = null;\n    };\n\n    on(el, 'mousedown', (e: MouseEvent): void => {\n      if ((e as any).button !== 0) return;\n      startTime = Date.now();\n      once(document as any, 'mouseup', clear);\n      interval && clearInterval(interval);\n      interval = setInterval(handler, 100);\n    });\n  },\n};\n\nexport default repeatDirective;\n"
  },
  {
    "path": "jeecgboot-vue3/src/directives/ripple/index.less",
    "content": ".ripple-container {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 0;\n  height: 0;\n  overflow: hidden;\n  pointer-events: none;\n}\n\n.ripple-effect {\n  position: relative;\n  z-index: 9999;\n  width: 1px;\n  height: 1px;\n  margin-top: 0;\n  margin-left: 0;\n  pointer-events: none;\n  border-radius: 50%;\n  transition: all 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/directives/ripple/index.ts",
    "content": "import type { Directive } from 'vue';\nimport './index.less';\nexport interface RippleOptions {\n  event: string;\n  transition: number;\n}\n\nexport interface RippleProto {\n  background?: string;\n  zIndex?: string;\n}\n\nexport type EventType = Event & MouseEvent & TouchEvent;\n\nconst options: RippleOptions = {\n  event: 'mousedown',\n  transition: 400,\n};\n\nconst RippleDirective: Directive & RippleProto = {\n  beforeMount: (el: HTMLElement, binding) => {\n    if (binding.value === false) return;\n\n    const bg = el.getAttribute('ripple-background');\n    setProps(Object.keys(binding.modifiers), options);\n\n    const background = bg || RippleDirective.background;\n    const zIndex = RippleDirective.zIndex;\n\n    el.addEventListener(options.event, (event: EventType) => {\n      rippler({\n        event,\n        el,\n        background,\n        zIndex,\n      });\n    });\n  },\n  updated(el, binding) {\n    if (!binding.value) {\n      el?.clearRipple?.();\n      return;\n    }\n    const bg = el.getAttribute('ripple-background');\n    el?.setBackground?.(bg);\n  },\n};\n\nfunction rippler({ event, el, zIndex, background }: { event: EventType; el: HTMLElement } & RippleProto) {\n  const targetBorder = parseInt(getComputedStyle(el).borderWidth.replace('px', ''));\n  const clientX = event.clientX || event.touches[0].clientX;\n  const clientY = event.clientY || event.touches[0].clientY;\n\n  const rect = el.getBoundingClientRect();\n  const { left, top } = rect;\n  const { offsetWidth: width, offsetHeight: height } = el;\n  const { transition } = options;\n  const dx = clientX - left;\n  const dy = clientY - top;\n  const maxX = Math.max(dx, width - dx);\n  const maxY = Math.max(dy, height - dy);\n  const style = window.getComputedStyle(el);\n  const radius = Math.sqrt(maxX * maxX + maxY * maxY);\n  const border = targetBorder > 0 ? targetBorder : 0;\n\n  const ripple = document.createElement('div');\n  const rippleContainer = document.createElement('div');\n\n  // Styles for ripple\n  ripple.className = 'ripple';\n\n  Object.assign(ripple.style ?? {}, {\n    marginTop: '0px',\n    marginLeft: '0px',\n    width: '1px',\n    height: '1px',\n    transition: `all ${transition}ms cubic-bezier(0.4, 0, 0.2, 1)`,\n    borderRadius: '50%',\n    pointerEvents: 'none',\n    position: 'relative',\n    zIndex: zIndex ?? '9999',\n    backgroundColor: background ?? 'rgba(0, 0, 0, 0.12)',\n  });\n\n  // Styles for rippleContainer\n  rippleContainer.className = 'ripple-container';\n  Object.assign(rippleContainer.style ?? {}, {\n    position: 'absolute',\n    left: `${0 - border}px`,\n    top: `${0 - border}px`,\n    height: '0',\n    width: '0',\n    pointerEvents: 'none',\n    overflow: 'hidden',\n  });\n\n  const storedTargetPosition = el.style.position.length > 0 ? el.style.position : getComputedStyle(el).position;\n\n  if (storedTargetPosition !== 'relative') {\n    el.style.position = 'relative';\n  }\n\n  rippleContainer.appendChild(ripple);\n  el.appendChild(rippleContainer);\n\n  Object.assign(ripple.style, {\n    marginTop: `${dy}px`,\n    marginLeft: `${dx}px`,\n  });\n\n  const { borderTopLeftRadius, borderTopRightRadius, borderBottomLeftRadius, borderBottomRightRadius } = style;\n  Object.assign(rippleContainer.style, {\n    width: `${width}px`,\n    height: `${height}px`,\n    direction: 'ltr',\n    borderTopLeftRadius,\n    borderTopRightRadius,\n    borderBottomLeftRadius,\n    borderBottomRightRadius,\n  });\n\n  setTimeout(() => {\n    const wh = `${radius * 2}px`;\n    Object.assign(ripple.style ?? {}, {\n      width: wh,\n      height: wh,\n      marginLeft: `${dx - radius}px`,\n      marginTop: `${dy - radius}px`,\n    });\n  }, 0);\n\n  function clearRipple() {\n    setTimeout(() => {\n      ripple.style.backgroundColor = 'rgba(0, 0, 0, 0)';\n    }, 250);\n\n    setTimeout(() => {\n      rippleContainer?.parentNode?.removeChild(rippleContainer);\n    }, 850);\n    el.removeEventListener('mouseup', clearRipple, false);\n    el.removeEventListener('mouseleave', clearRipple, false);\n    el.removeEventListener('dragstart', clearRipple, false);\n    setTimeout(() => {\n      let clearPosition = true;\n      for (let i = 0; i < el.childNodes.length; i++) {\n        if ((el.childNodes[i] as Recordable).className === 'ripple-container') {\n          clearPosition = false;\n        }\n      }\n\n      if (clearPosition) {\n        el.style.position = storedTargetPosition !== 'static' ? storedTargetPosition : '';\n      }\n    }, options.transition + 260);\n  }\n\n  if (event.type === 'mousedown') {\n    el.addEventListener('mouseup', clearRipple, false);\n    el.addEventListener('mouseleave', clearRipple, false);\n    el.addEventListener('dragstart', clearRipple, false);\n  } else {\n    clearRipple();\n  }\n\n  (el as Recordable).setBackground = (bgColor: string) => {\n    if (!bgColor) {\n      return;\n    }\n    ripple.style.backgroundColor = bgColor;\n  };\n}\n\nfunction setProps(modifiers: Recordable, props: Recordable) {\n  modifiers.forEach((item: Recordable) => {\n    if (isNaN(Number(item))) props.event = item;\n    else props.transition = item;\n  });\n}\n\nexport default RippleDirective;\n"
  },
  {
    "path": "jeecgboot-vue3/src/electron/index.ts",
    "content": "import type {App} from \"vue\";\nimport {router} from \"@/router\";\nimport {useGlobSetting} from \"@/hooks/setting\";\nimport { ElectronEnum } from '/@/enums/jeecgEnum'\nconst glob = useGlobSetting();\n\nconst _PRELOAD_UTILS = ElectronEnum.ELECTRON_API;\n\nexport const $electron = {\n  // 当前是否为Electron平台\n  isElectron: () => glob.isElectronPlatform,\n\n  // 通过浏览器打开链接\n  openInBrowser: bindUtils('openInBrowser') as (url: string) => void,\n\n  resolveRoutePath,\n}\n\nfunction bindUtils(n: string) {\n  const fn = window[_PRELOAD_UTILS]?.[n];\n  if (typeof fn?.bind === 'function') {\n    return fn.bind(null);\n  }\n  return () => console.warn(`Electron preload util ${n} is not a function`);\n}\n\n// 解析路由路径\nfunction resolveRoutePath(path: string) {\n  return window.location.origin + window.location.pathname + router.resolve(path).href;\n}\n\n/**\n * 配置Electron\n */\nexport function setupElectron(_: App) {\n  // 非Electron平台不执行\n  if (!$electron.isElectron()) {\n    return;\n  }\n  hookWindowOpen();\n  // 代码逻辑说明: 【JHHB-13】桌面应用消息通知\n  hookNavigate();\n}\nfunction hookNavigate() {\n  // @ts-ignore\n  window[ElectronEnum.ELECTRON_API].onNavigate((path) => {\n    router.push({ path });\n  });\n}\nfunction hookWindowOpen() {\n  // 保存原生方法引用\n  const originFunc = window.open;\n  // 重写window.open方法\n  window['open'] = function (url, windowName, windowFeatures) {\n    url = typeof url === 'string' ? url.trim() : '';\n    if (!url) {\n      throw new Error('window.open: url is required');\n    }\n    // 判断是否以http或https开头\n    if (/^https?:\\/\\//.test(url)) {\n      // 判断是否为本地地址\n      if (url.startsWith(window.location.origin) || url.startsWith(window['_CONFIG']['domianURL'])) {\n        // 直接打开\n        return originFunc(url, windowName, windowFeatures);\n      }\n      // 调用Electron进行外部浏览器打开\n      return $electron.openInBrowser(url) as any;\n    }\n    // 自定义逻辑\n    return originFunc(url, windowName, windowFeatures)\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/enums/CompTypeEnum.ts",
    "content": "/**\n * 组件类型\n */\nexport enum CompTypeEnum {\n  //单选\n  Radio = 'radio',\n  //按钮样式单选\n  RadioButton = 'radioButton',\n  //下拉框\n  Select = 'select',\n  //列表\n  List = 'list',\n  //开关\n  Switch = 'switch',\n  //下拉树\n  SelTree = 'sel_tree',\n  //分类字典树\n  CatTree = 'cat_tree',\n  //下拉搜索\n  SelSearch = 'search',\n  //用户现在框\n  SelUser = 'sel_user',\n  //复选框\n  Checkbox = 'checkbox',\n  //多选列表\n  ListMulti = 'list_multi',\n  //区域选择\n  Pca = 'pca',\n  Popup = 'popup',\n  //部门选择\n  SelDepart = 'sel_depart',\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/enums/DateTypeEnum.ts",
    "content": "/**\n * 日期类型\n */\nexport enum DateTypeEnum {\n  Date = 'date',\n  Datetime = 'datetime',\n  Time = 'time',\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/enums/appEnum.ts",
    "content": "export const SIDE_BAR_MINI_WIDTH = 48;\nexport const SIDE_BAR_SHOW_TIT_MINI_WIDTH = 80;\n\n// 标签页样式\nexport enum TabsThemeEnum {\n  // 圆滑\n  SMOOTH = 'smooth',\n  // 卡片\n  CARD = 'card',\n  // 极简\n  SIMPLE = 'simple',\n}\n\nexport enum ContentEnum {\n  // auto width\n  FULL = 'full',\n  // fixed width\n  FIXED = 'fixed',\n}\n\n// menu theme enum\nexport enum ThemeEnum {\n  DARK = 'dark',\n  LIGHT = 'light',\n}\n\nexport enum SettingButtonPositionEnum {\n  AUTO = 'auto',\n  HEADER = 'header',\n  FIXED = 'fixed',\n}\n\nexport enum SessionTimeoutProcessingEnum {\n  ROUTE_JUMP,\n  PAGE_COVERAGE,\n}\n\n/**\n * 权限模式\n */\nexport enum PermissionModeEnum {\n  // role\n  ROLE = 'ROLE',\n  // 后台\n  BACK = 'BACK',\n  // route mapping\n  ROUTE_MAPPING = 'ROUTE_MAPPING',\n}\n\n//  Route switching animation\nexport enum RouterTransitionEnum {\n  ZOOM_FADE = 'zoom-fade',\n  ZOOM_OUT = 'zoom-out',\n  FADE_SIDE = 'fade-slide',\n  FADE = 'fade',\n  FADE_BOTTOM = 'fade-bottom',\n  FADE_SCALE = 'fade-scale',\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/enums/breakpointEnum.ts",
    "content": "export enum sizeEnum {\n  XS = 'XS',\n  SM = 'SM',\n  MD = 'MD',\n  LG = 'LG',\n  XL = 'XL',\n  XXL = 'XXL',\n}\n\nexport enum screenEnum {\n  XS = 480,\n  SM = 576,\n  MD = 768,\n  LG = 992,\n  XL = 1200,\n  XXL = 1600,\n}\n\nconst screenMap = new Map<sizeEnum, number>();\n\nscreenMap.set(sizeEnum.XS, screenEnum.XS);\nscreenMap.set(sizeEnum.SM, screenEnum.SM);\nscreenMap.set(sizeEnum.MD, screenEnum.MD);\nscreenMap.set(sizeEnum.LG, screenEnum.LG);\nscreenMap.set(sizeEnum.XL, screenEnum.XL);\nscreenMap.set(sizeEnum.XXL, screenEnum.XXL);\n\nexport { screenMap };\n"
  },
  {
    "path": "jeecgboot-vue3/src/enums/cacheEnum.ts",
    "content": "// token key\nexport const TOKEN_KEY = 'TOKEN__';\n\nexport const LOCALE_KEY = 'LOCALE__';\n\n// user info key\nexport const USER_INFO_KEY = 'USER__INFO__';\n\n// role info key\nexport const ROLES_KEY = 'ROLES__KEY__';\n\n// dict info key\nexport const DB_DICT_DATA_KEY = 'UI_CACHE_DB_DICT_DATA';\n\n// project config key\nexport const PROJ_CFG_KEY = 'PROJ__CFG__KEY__';\n\n// lock info\nexport const LOCK_INFO_KEY = 'LOCK__INFO__KEY__';\n\nexport const MULTIPLE_TABS_KEY = 'MULTIPLE_TABS__KEY__';\n\nexport const APP_DARK_MODE_KEY_ = '__APP__DARK__MODE__';\n\n// base global local key\nexport const APP_LOCAL_CACHE_KEY = 'COMMON__LOCAL__KEY__';\n\n// base global session key\nexport const APP_SESSION_CACHE_KEY = 'COMMON__SESSION__KEY__';\n// 租户 key\nexport const TENANT_ID = 'TENANT_ID';\n// login info key\nexport const LOGIN_INFO_KEY = 'LOGIN__INFO__';\n\n// 聊天UID key\nexport const JEECG_CHAT_UID = 'JEECG_CHAT_UID';\n\n// 免登录租户id，与系统分开，避免重复\nexport const OAUTH2_THIRD_LOGIN_TENANT_ID = 'THIRD_LOGIN_TENANT_ID';\n\n// ai助手标识（退出需要记录一下）\nexport const AIDE_FLAG = 'AIDE_FLAG';\n\n// ai助手标识（退出需要记录一下）\nexport const JEECG_CHAT_KEY = 'JEECG-CHAT-KEY';\n\n// 【QQYUN-8925】系统主题颜色（供页面加载使用）\nexport const APP__THEME__COLOR = '__APP__THEME__COLOR__';\n\n// \nexport const ROLE_AUTH_CONFIG_KEY = 'ROLE__AUTH__CONFIG__KEY__';\n// 部门角色权限\nexport const DEPART_ROLE_AUTH_CONFIG_KEY = 'DEPART__ROLE__AUTH__CONFIG__KEY__';\n// 部门管理权限\nexport const DEPART_MANGE_AUTH_CONFIG_KEY = 'DEPART__MANGE__AUTH__CONFIG__KEY__';\n\n//产品包管理权限\nexport const PACK_AUTH_CONFIG_KEY = 'PACK__AUTH__CONFIG__KEY__';\n\nexport enum CacheTypeEnum {\n  SESSION,\n  LOCAL,\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/enums/exceptionEnum.ts",
    "content": "/**\n * @description: Exception related enumeration\n */\nexport enum ExceptionEnum {\n  // page not access\n  PAGE_NOT_ACCESS = 403,\n\n  // page not found\n  PAGE_NOT_FOUND = 404,\n\n  // error\n  ERROR = 500,\n\n  // net work error\n  NET_WORK_ERROR = 10000,\n\n  // No data on the page. In fact, it is not an exception page\n  PAGE_NOT_DATA = 10100,\n  //短信验证码次数太多失败code，用于判断是否打开弹窗\n  PHONE_SMS_FAIL_CODE = 40002,\n}\n\nexport enum ErrorTypeEnum {\n  VUE = 'vue',\n  SCRIPT = 'script',\n  RESOURCE = 'resource',\n  AJAX = 'ajax',\n  PROMISE = 'promise',\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/enums/httpEnum.ts",
    "content": "/**\n * @description: Request result set\n */\nexport enum ResultEnum {\n  SUCCESS = 0,\n  ERROR = 1,\n  TIMEOUT = 401,\n  TYPE = 'success',\n}\n\n/**\n * @description: request method\n */\nexport enum RequestEnum {\n  GET = 'GET',\n  POST = 'POST',\n  PUT = 'PUT',\n  DELETE = 'DELETE',\n}\n\n/**\n * @description:  contentTyp\n */\nexport enum ContentTypeEnum {\n  // json\n  JSON = 'application/json;charset=UTF-8',\n  // form-data qs\n  FORM_URLENCODED = 'application/x-www-form-urlencoded;charset=UTF-8',\n  // form-data  upload\n  FORM_DATA = 'multipart/form-data;charset=UTF-8',\n}\n\n/**\n * 请求header\n * @description:  contentTyp\n */\nexport enum ConfigEnum {\n  // TOKEN\n  TOKEN = 'X-Access-Token',\n  // TIMESTAMP\n  TIMESTAMP = 'X-TIMESTAMP',\n  // Sign\n  Sign = 'X-Sign',\n  // 租户id\n  TENANT_ID = 'X-Tenant-Id',\n  // 版本\n  VERSION = 'X-Version',\n  // 低代码应用ID\n  X_LOW_APP_ID = 'X-Low-App-ID',\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/enums/jeecgEnum.ts",
    "content": "/**\n * JInput组件类型\n */\nexport enum JInputTypeEnum {\n  //模糊\n  JINPUT_QUERY_LIKE = 'like',\n  //非\n  JINPUT_QUERY_NE = 'ne',\n  //大于等于\n  JINPUT_QUERY_GE = 'ge',\n  //小于等于\n  JINPUT_QUERY_LE = 'le',\n}\n\n/**\n * 面板设计器需要的常量定义\n */\nexport enum JDragConfigEnum {\n  //baseURL\n  DRAG_BASE_URL = 'drag-base-url',\n  //拖拽缓存前缀\n  DRAG_CACHE_PREFIX = 'drag-cache:',\n}\n// electron 枚举\nexport enum ElectronEnum {\n  ELECTRON_API = '_ELECTRON_PRELOAD_UTILS_',\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/enums/menuEnum.ts",
    "content": "/**\n * @description: 默认四种菜单主题\n */\nexport enum MenuTypeEnum {\n  // 左侧边菜单导航风格\n  SIDEBAR = 'sidebar',\n  // 顶部栏导航风格\n  MIX = 'mix',\n // 侧边折叠导航风格\n  MIX_SIDEBAR = 'mix-sidebar',\n  //顶部混合导航风格\n  TOP_MENU = 'top-menu',\n}\n\n// 折叠触发器位置\nexport enum TriggerEnum {\n  // 不显示\n  NONE = 'NONE',\n  // 菜单底部\n  FOOTER = 'FOOTER',\n  // 头部\n  HEADER = 'HEADER',\n}\n\nexport type Mode = 'vertical' | 'vertical-right' | 'horizontal' | 'inline';\n\n// menu mode\nexport enum MenuModeEnum {\n  VERTICAL = 'vertical',\n  HORIZONTAL = 'horizontal',\n  VERTICAL_RIGHT = 'vertical-right',\n  INLINE = 'inline',\n}\n\nexport enum MenuSplitTyeEnum {\n  NONE,\n  TOP,\n  LEFT,\n}\n\nexport enum TopMenuAlignEnum {\n  CENTER = 'center',\n  START = 'start',\n  END = 'end',\n}\n\nexport enum MixSidebarTriggerEnum {\n  HOVER = 'hover',\n  CLICK = 'click',\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/enums/pageEnum.ts",
    "content": "export enum PageEnum {\n  // basic login path\n  BASE_LOGIN = '/login',\n  // basic home path\n  BASE_HOME = '/dashboard/analysis',\n  // error page path\n  ERROR_PAGE = '/exception',\n  // error log page path\n  ERROR_LOG_PAGE = '/error-log/list',\n  // auth2登录路由路径\n  OAUTH2_LOGIN_PAGE_PATH = '/oauth2-app/login',\n  //文件路由\n  SYS_FILES_PATH = '/file/share',\n  // 邮件中的跳转地址\n  TOKEN_LOGIN = '/tokenLogin'\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/enums/roleEnum.ts",
    "content": "export enum RoleEnum {\n  // super admin\n  SUPER = 'super',\n\n  // tester\n  TEST = 'test',\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/enums/sizeEnum.ts",
    "content": "export enum SizeEnum {\n  DEFAULT = 'default',\n  SMALL = 'small',\n  LARGE = 'large',\n}\n\nexport enum SizeNumberEnum {\n  DEFAULT = 48,\n  SMALL = 16,\n  LARGE = 64,\n}\n\nexport enum ScreenSizeEnum {\n  XS = 480,\n  SM = 576,\n  MD = 768,\n  LG = 992,\n  XL = 1200,\n}\n\nexport const sizeMap: Map<SizeEnum, SizeNumberEnum> = (() => {\n  const map = new Map<SizeEnum, SizeNumberEnum>();\n  map.set(SizeEnum.DEFAULT, SizeNumberEnum.DEFAULT);\n  map.set(SizeEnum.SMALL, SizeNumberEnum.SMALL);\n  map.set(SizeEnum.LARGE, SizeNumberEnum.LARGE);\n  return map;\n})();\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/component/useFormItem.ts",
    "content": "import type { UnwrapRef, Ref, WritableComputedRef, DeepReadonly } from 'vue';\nimport { reactive, readonly, computed, getCurrentInstance, watchEffect, unref, nextTick, toRaw } from 'vue';\nimport { Form } from 'ant-design-vue';\nimport { FormItemContext } from 'ant-design-vue/es/form/FormItemContext';\n\nimport { isEqual } from 'lodash-es';\nexport function useRuleFormItem<T extends Recordable, K extends keyof T, V = UnwrapRef<T[K]>>(\n  props: T,\n  key?: K,\n  changeEvent?,\n  emitData?: Ref<any[] | undefined>\n): [WritableComputedRef<V>, (val: V) => void, DeepReadonly<V>, FormItemContext];\nexport function useRuleFormItem<T extends Recordable>(props: T, key: keyof T = 'value', changeEvent = 'change', emitData?: Ref<any[]>) {\n  const instance = getCurrentInstance();\n  const emit = instance?.emit;\n  const formItemContext = Form.useInjectFormItemContext();\n\n  const innerState = reactive({\n    value: props[key],\n  });\n\n  const defaultState = readonly(innerState);\n\n  const setState = (val: UnwrapRef<T[keyof T]>): void => {\n    innerState.value = val as T[keyof T];\n  };\n\n  watchEffect(() => {\n    innerState.value = props[key];\n  });\n\n  const state: any = computed({\n    get() {\n      //修复多选时空值显示问题（兼容值为0的情况）\n      return innerState.value == null || innerState.value === '' ? [] : innerState.value;\n    },\n    set(value) {\n      if (isEqual(value, defaultState.value)) return;\n\n      innerState.value = value as T[keyof T];\n      nextTick(() => {\n        emit?.(changeEvent, value, ...(toRaw(unref(emitData)) || []));\n        // https://antdv.com/docs/vue/migration-v3-cn\n        // antDv3升级后需要调用这个方法更新校验的值\n        nextTick(() => formItemContext.onFieldChange());\n      });\n    },\n  });\n\n  return [state, setState, defaultState, formItemContext];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/component/useFormItemSingle.ts",
    "content": "import type { UnwrapRef, Ref, WritableComputedRef, DeepReadonly } from 'vue';\nimport { reactive, readonly, computed, getCurrentInstance, watchEffect, unref, nextTick, toRaw } from 'vue';\nimport { Form } from 'ant-design-vue';\nimport { FormItemContext } from 'ant-design-vue/es/form/FormItemContext';\n\nimport { isEqual } from 'lodash-es';\nexport function useRuleFormItem<T extends Recordable, K extends keyof T, V = UnwrapRef<T[K]>>(\n  props: T,\n  key?: K,\n  changeEvent?,\n  emitData?: Ref<any[] | undefined>\n): [WritableComputedRef<V>, (val: V) => void, DeepReadonly<V>, FormItemContext];\nexport function useRuleFormItem<T extends Recordable>(props: T, key: keyof T = 'value', changeEvent = 'change', emitData?: Ref<any[]>) {\n  const instance = getCurrentInstance();\n  const emit = instance?.emit;\n  const formItemContext = Form.useInjectFormItemContext();\n\n  const innerState = reactive({\n    value: props[key],\n  });\n\n  const defaultState = readonly(innerState);\n\n  const setState = (val: UnwrapRef<T[keyof T]>): void => {\n    innerState.value = val as T[keyof T];\n  };\n\n  watchEffect(() => {\n    innerState.value = props[key];\n  });\n\n  const state: any = computed({\n    get() {\n      return innerState.value == null ? \"\" : innerState.value;\n    },\n    set(value) {\n      if (isEqual(value, defaultState.value)) return;\n\n      innerState.value = value as T[keyof T];\n      nextTick(() => {\n        emit?.(changeEvent, value, ...(toRaw(unref(emitData)) || []));\n        // https://antdv.com/docs/vue/migration-v3-cn\n        // antDv3升级后需要调用这个方法更新校验的值\n        nextTick(() => formItemContext.onFieldChange());\n      });\n    },\n  });\n\n  return [state, setState, defaultState, formItemContext];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/component/usePageContext.ts",
    "content": "import type { InjectionKey, ComputedRef, Ref } from 'vue';\nimport { createContext, useContext } from '/@/hooks/core/useContext';\n\nexport interface PageContextProps {\n  contentHeight: ComputedRef<number>;\n  pageHeight: Ref<number>;\n  setPageHeight: (height: number) => Promise<void>;\n}\n\nconst key: InjectionKey<PageContextProps> = Symbol();\n\nexport function createPageContext(context: PageContextProps) {\n  return createContext<PageContextProps>(context, key, { native: true });\n}\n\nexport function usePageContext() {\n  return useContext<PageContextProps>(key);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/core/onMountedOrActivated.ts",
    "content": "import { nextTick, onMounted, onActivated } from 'vue';\n\ntype HookArgs = {\n  type: 'mounted' | 'activated';\n}\n\nexport function onMountedOrActivated(hook: Fn<HookArgs, any>) {\n  let mounted: boolean;\n\n  onMounted(() => {\n    hook({type: 'mounted'});\n    nextTick(() => {\n      mounted = true;\n    });\n  });\n\n  onActivated(() => {\n    if (mounted) {\n      hook({type: 'activated'});\n    }\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/core/useAttrs.ts",
    "content": "import { getCurrentInstance, reactive, shallowRef, watchEffect } from 'vue';\nimport type { Ref } from 'vue';\n\ninterface Params {\n  excludeListeners?: boolean;\n  excludeKeys?: string[];\n  excludeDefaultKeys?: boolean;\n}\n\nconst DEFAULT_EXCLUDE_KEYS = ['class', 'style'];\nconst LISTENER_PREFIX = /^on[A-Z]/;\n\nexport function entries<T>(obj: Recordable<T>): [string, T][] {\n  return Object.keys(obj).map((key: string) => [key, obj[key]]);\n}\n\nexport function useAttrs(params: Params = {}): Ref<Recordable> | {} {\n  const instance = getCurrentInstance();\n  if (!instance) return {};\n\n  const { excludeListeners = false, excludeKeys = [], excludeDefaultKeys = true } = params;\n  const attrs = shallowRef({});\n  const allExcludeKeys = excludeKeys.concat(excludeDefaultKeys ? DEFAULT_EXCLUDE_KEYS : []);\n\n  // Since attrs are not reactive, make it reactive instead of doing in `onUpdated` hook for better performance\n  instance.attrs = reactive(instance.attrs);\n\n  watchEffect(() => {\n    const res = entries(instance.attrs).reduce((acm, [key, val]) => {\n      if (!allExcludeKeys.includes(key) && !(excludeListeners && LISTENER_PREFIX.test(key))) {\n        acm[key] = val;\n      }\n\n      return acm;\n    }, {} as Recordable);\n\n    attrs.value = res;\n  });\n\n  return attrs;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/core/useContext.ts",
    "content": "import {\n  InjectionKey,\n  provide,\n  inject,\n  reactive,\n  readonly as defineReadonly,\n  // defineComponent,\n  UnwrapRef,\n} from 'vue';\n\nexport interface CreateContextOptions {\n  readonly?: boolean;\n  createProvider?: boolean;\n  native?: boolean;\n}\n\ntype ShallowUnwrap<T> = {\n  [P in keyof T]: UnwrapRef<T[P]>;\n};\n\nexport function createContext<T>(context: any, key: InjectionKey<T> = Symbol(), options: CreateContextOptions = {}) {\n  const { readonly = true, createProvider = false, native = false } = options;\n\n  const state = reactive(context);\n  const provideData = readonly ? defineReadonly(state) : state;\n  !createProvider && provide(key, native ? context : provideData);\n\n  return {\n    state,\n  };\n}\n\nexport function useContext<T>(key: InjectionKey<T>, native?: boolean): T;\nexport function useContext<T>(key: InjectionKey<T>, defaultValue?: any, native?: boolean): T;\n\nexport function useContext<T>(key: InjectionKey<T> = Symbol(), defaultValue?: any): ShallowUnwrap<T> {\n  return inject(key, defaultValue || {});\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/core/useLockFn.ts",
    "content": "import { ref, unref } from 'vue';\n\nexport function useLockFn<P extends any[] = any[], V extends any = any>(fn: (...args: P) => Promise<V>) {\n  const lockRef = ref(false);\n  return async function (...args: P) {\n    if (unref(lockRef)) return;\n    lockRef.value = true;\n    try {\n      const ret = await fn(...args);\n      lockRef.value = false;\n      return ret;\n    } catch (e) {\n      lockRef.value = false;\n      throw e;\n    }\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/core/useRefs.ts",
    "content": "import type { Ref } from 'vue';\nimport { ref, onBeforeUpdate } from 'vue';\n\nexport function useRefs(): [Ref<HTMLElement[]>, (index: number) => (el: HTMLElement) => void] {\n  const refs = ref([]) as Ref<HTMLElement[]>;\n\n  onBeforeUpdate(() => {\n    refs.value = [];\n  });\n\n  const setRefs = (index: number) => (el: HTMLElement) => {\n    refs.value[index] = el;\n  };\n\n  return [refs, setRefs];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/core/useTimeout.ts",
    "content": "import { ref, watch } from 'vue';\nimport { tryOnUnmounted } from '@vueuse/core';\nimport { isFunction } from '/@/utils/is';\n\nexport function useTimeoutFn(handle: Fn<any>, wait: number, native = false) {\n  if (!isFunction(handle)) {\n    throw new Error('handle is not Function!');\n  }\n\n  const { readyRef, stop, start } = useTimeoutRef(wait);\n  if (native) {\n    handle();\n  } else {\n    watch(\n      readyRef,\n      (maturity) => {\n        maturity && handle();\n      },\n      { immediate: false }\n    );\n  }\n  return { readyRef, stop, start };\n}\n\nexport function useTimeoutRef(wait: number) {\n  const readyRef = ref(false);\n\n  let timer: TimeoutHandle;\n  function stop(): void {\n    readyRef.value = false;\n    timer && window.clearTimeout(timer);\n  }\n  function start(): void {\n    stop();\n    timer = setTimeout(() => {\n      readyRef.value = true;\n    }, wait);\n  }\n\n  start();\n\n  tryOnUnmounted(stop);\n\n  return { readyRef, stop, start };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/event/useBreakpoint.ts",
    "content": "import { ref, computed, ComputedRef, unref } from 'vue';\nimport { useEventListener } from '/@/hooks/event/useEventListener';\nimport { screenMap, sizeEnum, screenEnum } from '/@/enums/breakpointEnum';\n\nlet globalScreenRef: ComputedRef<sizeEnum | undefined>;\nlet globalWidthRef: ComputedRef<number>;\nlet globalRealWidthRef: ComputedRef<number>;\n\nexport interface CreateCallbackParams {\n  screen: ComputedRef<sizeEnum | undefined>;\n  width: ComputedRef<number>;\n  realWidth: ComputedRef<number>;\n  screenEnum: typeof screenEnum;\n  screenMap: Map<sizeEnum, number>;\n  sizeEnum: typeof sizeEnum;\n}\n\nexport function useBreakpoint() {\n  return {\n    screenRef: computed(() => unref(globalScreenRef)),\n    widthRef: globalWidthRef,\n    screenEnum,\n    realWidthRef: globalRealWidthRef,\n  };\n}\n\n// Just call it once\nexport function createBreakpointListen(fn?: (opt: CreateCallbackParams) => void) {\n  const screenRef = ref<sizeEnum>(sizeEnum.XL);\n  const realWidthRef = ref(window.innerWidth);\n\n  function getWindowWidth() {\n    const width = document.body.clientWidth;\n    const xs = screenMap.get(sizeEnum.XS)!;\n    const sm = screenMap.get(sizeEnum.SM)!;\n    const md = screenMap.get(sizeEnum.MD)!;\n    const lg = screenMap.get(sizeEnum.LG)!;\n    const xl = screenMap.get(sizeEnum.XL)!;\n    if (width < xs) {\n      screenRef.value = sizeEnum.XS;\n    } else if (width < sm) {\n      screenRef.value = sizeEnum.SM;\n    } else if (width < md) {\n      screenRef.value = sizeEnum.MD;\n    } else if (width < lg) {\n      screenRef.value = sizeEnum.LG;\n    } else if (width < xl) {\n      screenRef.value = sizeEnum.XL;\n    } else {\n      screenRef.value = sizeEnum.XXL;\n    }\n    realWidthRef.value = width;\n  }\n\n  useEventListener({\n    el: window,\n    name: 'resize',\n\n    listener: () => {\n      getWindowWidth();\n      resizeFn();\n    },\n    // wait: 100,\n  });\n\n  getWindowWidth();\n  globalScreenRef = computed(() => unref(screenRef));\n  globalWidthRef = computed((): number => screenMap.get(unref(screenRef)!)!);\n  globalRealWidthRef = computed((): number => unref(realWidthRef));\n\n  function resizeFn() {\n    fn?.({\n      screen: globalScreenRef,\n      width: globalWidthRef,\n      realWidth: globalRealWidthRef,\n      screenEnum,\n      screenMap,\n      sizeEnum,\n    });\n  }\n\n  resizeFn();\n  return {\n    screenRef: globalScreenRef,\n    screenEnum,\n    widthRef: globalWidthRef,\n    realWidthRef: globalRealWidthRef,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/event/useEventListener.ts",
    "content": "import type { Ref } from 'vue';\nimport { ref, watch, unref } from 'vue';\nimport { useThrottleFn, useDebounceFn } from '@vueuse/core';\n\nexport type RemoveEventFn = () => void;\nexport interface UseEventParams {\n  el?: Element | Ref<Element | undefined> | Window | any;\n  name: string;\n  listener: EventListener;\n  options?: boolean | AddEventListenerOptions;\n  autoRemove?: boolean;\n  isDebounce?: boolean;\n  wait?: number;\n}\nexport function useEventListener({ el = window, name, listener, options, autoRemove = true, isDebounce = true, wait = 80 }: UseEventParams): {\n  removeEvent: RemoveEventFn;\n} {\n  /* eslint-disable-next-line */\n  let remove: RemoveEventFn = () => {};\n  const isAddRef = ref(false);\n\n  if (el) {\n    const element = ref(el as Element) as Ref<Element>;\n\n    const handler = isDebounce ? useDebounceFn(listener, wait) : useThrottleFn(listener, wait);\n    const realHandler = wait ? handler : listener;\n    const removeEventListener = (e: Element) => {\n      isAddRef.value = true;\n      e.removeEventListener(name, realHandler, options);\n    };\n    const addEventListener = (e: Element) => e.addEventListener(name, realHandler, options);\n\n    const removeWatch = watch(\n      element,\n      (v, _ov, cleanUp) => {\n        if (v) {\n          !unref(isAddRef) && addEventListener(v);\n          cleanUp(() => {\n            autoRemove && removeEventListener(v);\n          });\n        }\n      },\n      { immediate: true }\n    );\n\n    remove = () => {\n      removeEventListener(element.value);\n      removeWatch();\n    };\n  }\n  return { removeEvent: remove };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/event/useIntersectionObserver.ts",
    "content": "import { Ref, watchEffect, ref } from 'vue';\n\ninterface IntersectionObserverProps {\n  target: Ref<Element | null | undefined>;\n  root?: Ref<any>;\n  onIntersect: IntersectionObserverCallback;\n  rootMargin?: string;\n  threshold?: number;\n}\n\nexport function useIntersectionObserver({ target, root, onIntersect, rootMargin = '0px', threshold = 0.1 }: IntersectionObserverProps) {\n  let cleanup = () => {};\n  const observer: Ref<Nullable<IntersectionObserver>> = ref(null);\n  const stopEffect = watchEffect(() => {\n    cleanup();\n\n    observer.value = new IntersectionObserver(onIntersect, {\n      root: root ? root.value : null,\n      rootMargin,\n      threshold,\n    });\n\n    const current = target.value;\n\n    current && observer.value.observe(current);\n\n    cleanup = () => {\n      if (observer.value) {\n        observer.value.disconnect();\n        target.value && observer.value.unobserve(target.value);\n      }\n    };\n  });\n\n  return {\n    observer,\n    stop: () => {\n      cleanup();\n      stopEffect();\n    },\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/event/useScroll.ts",
    "content": "import type { Ref } from 'vue';\n\nimport { ref, onMounted, watch, onUnmounted } from 'vue';\nimport { isWindow, isObject } from '/@/utils/is';\nimport { useThrottleFn } from '@vueuse/core';\n\nexport function useScroll(\n  refEl: Ref<Element | Window | null>,\n  options?: {\n    wait?: number;\n    leading?: boolean;\n    trailing?: boolean;\n  }\n) {\n  const refX = ref(0);\n  const refY = ref(0);\n  let handler = () => {\n    if (isWindow(refEl.value)) {\n      refX.value = refEl.value.scrollX;\n      refY.value = refEl.value.scrollY;\n    } else if (refEl.value) {\n      refX.value = (refEl.value as Element).scrollLeft;\n      refY.value = (refEl.value as Element).scrollTop;\n    }\n  };\n\n  if (isObject(options)) {\n    let wait = 0;\n    if (options.wait && options.wait > 0) {\n      wait = options.wait;\n      Reflect.deleteProperty(options, 'wait');\n    }\n\n    handler = useThrottleFn(handler, wait);\n  }\n\n  let stopWatch: () => void;\n  onMounted(() => {\n    stopWatch = watch(\n      refEl,\n      (el, prevEl, onCleanup) => {\n        if (el) {\n          el.addEventListener('scroll', handler);\n        } else if (prevEl) {\n          prevEl.removeEventListener('scroll', handler);\n        }\n        onCleanup(() => {\n          refX.value = refY.value = 0;\n          el && el.removeEventListener('scroll', handler);\n        });\n      },\n      { immediate: true }\n    );\n  });\n\n  onUnmounted(() => {\n    refEl.value && refEl.value.removeEventListener('scroll', handler);\n  });\n\n  function stop() {\n    stopWatch && stopWatch();\n  }\n\n  return { refX, refY, stop };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/event/useScrollTo.ts",
    "content": "import { isFunction, isUnDef } from '/@/utils/is';\nimport { ref, unref } from 'vue';\n\nexport interface ScrollToParams {\n  el: any;\n  to: number;\n  duration?: number;\n  callback?: () => any;\n}\n\nconst easeInOutQuad = (t: number, b: number, c: number, d: number) => {\n  t /= d / 2;\n  if (t < 1) {\n    return (c / 2) * t * t + b;\n  }\n  t--;\n  return (-c / 2) * (t * (t - 2) - 1) + b;\n};\nconst move = (el: HTMLElement, amount: number) => {\n  el.scrollTop = amount;\n};\n\nconst position = (el: HTMLElement) => {\n  return el.scrollTop;\n};\nexport function useScrollTo({ el, to, duration = 500, callback }: ScrollToParams) {\n  const isActiveRef = ref(false);\n  const start = position(el);\n  const change = to - start;\n  const increment = 20;\n  let currentTime = 0;\n  duration = isUnDef(duration) ? 500 : duration;\n\n  const animateScroll = function () {\n    if (!unref(isActiveRef)) {\n      return;\n    }\n    currentTime += increment;\n    const val = easeInOutQuad(currentTime, start, change, duration);\n    move(el, val);\n    if (currentTime < duration && unref(isActiveRef)) {\n      requestAnimationFrame(animateScroll);\n    } else {\n      if (callback && isFunction(callback)) {\n        callback();\n      }\n    }\n  };\n  const run = () => {\n    isActiveRef.value = true;\n    animateScroll();\n  };\n\n  const stop = () => {\n    isActiveRef.value = false;\n  };\n\n  return { start: run, stop };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/event/useWindowSizeFn.ts",
    "content": "import { tryOnMounted, tryOnUnmounted } from '@vueuse/core';\nimport { useDebounceFn } from '@vueuse/core';\n\ninterface WindowSizeOptions {\n  once?: boolean;\n  immediate?: boolean;\n  listenerOptions?: AddEventListenerOptions | boolean;\n}\n\nexport function useWindowSizeFn<T>(fn: Fn<T>, wait = 150, options?: WindowSizeOptions) {\n  let handler = () => {\n    fn();\n  };\n  const handleSize = useDebounceFn(handler, wait);\n  handler = handleSize;\n\n  const start = () => {\n    if (options && options.immediate) {\n      handler();\n    }\n    window.addEventListener('resize', handler);\n  };\n\n  const stop = () => {\n    window.removeEventListener('resize', handler);\n  };\n\n  tryOnMounted(() => {\n    start();\n  });\n\n  tryOnUnmounted(() => {\n    stop();\n  });\n  return [start, stop];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/jeecg/useAdaptiveWidth.ts",
    "content": "/**\n * 自适应宽度构造器\n *\n * @time 2022-4-8\n * @author sunjianlei\n */\nimport { ref } from 'vue';\nimport { useDebounceFn, tryOnUnmounted } from '@vueuse/core';\nimport { useEventListener } from '/@/hooks/event/useEventListener';\n\n// key = js运算符+数字\nconst defWidthConfig: configType = {\n  '<=565': '100%',\n  '<=1366': '800px',\n  '<=1600': '600px',\n  '<=1920': '600px',\n  '>1920': '500px',\n};\n\ntype configType = Record<string, string | number>;\n\n/**\n * 自适应宽度\n *\n * @param widthConfig 宽度配置，可参考 defWidthConfig 配置\n * @param assign 是否合并默认配置\n * @param debounce 去抖毫秒数\n */\nexport function useAdaptiveWidth(widthConfig = defWidthConfig, assign = true, debounce = 50) {\n  const widthConfigAssign = assign ? Object.assign({}, defWidthConfig, widthConfig) : widthConfig;\n  const configKeys = Object.keys(widthConfigAssign);\n\n  const adaptiveWidth = ref<string | number>();\n\n  /**\n   * 进行计算宽度\n   * @param innerWidth\n   */\n  function calcWidth(innerWidth) {\n    let width;\n    for (const key of configKeys) {\n      try {\n        // 通过js运算\n        let flag = new Function(`return ${innerWidth} ${key}`)();\n        if (flag) {\n          width = widthConfigAssign[key];\n          break;\n        }\n      } catch (e) {\n        console.error(e);\n      }\n    }\n    if (width) {\n      adaptiveWidth.value = width;\n    } else {\n      console.warn('没有找到匹配的自适应宽度');\n    }\n  }\n\n  // 初始计算\n  calcWidth(window.innerWidth);\n\n  // 监听 resize 事件\n  const { removeEvent } = useEventListener({\n    el: window,\n    name: 'resize',\n    listener: useDebounceFn(() => calcWidth(window.innerWidth), debounce),\n  });\n  // 卸载组件时取消监听事件\n  tryOnUnmounted(() => removeEvent());\n\n  return { adaptiveWidth };\n}\n\n/**\n * 抽屉自适应宽度\n */\nexport function useDrawerAdaptiveWidth() {\n  return useAdaptiveWidth(\n    {\n      '<=620': '100%',\n      '<=1600': 600,\n      '<=1920': 650,\n      '>1920': 700,\n    },\n    false\n  );\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/setting/index.ts",
    "content": "import type { GlobConfig } from '/#/config';\n\nimport { getAppEnvConfig } from '/@/utils/env';\n\nexport const useGlobSetting = (): Readonly<GlobConfig> => {\n  const {\n    VITE_GLOB_APP_TITLE,\n    VITE_GLOB_API_URL,\n    VITE_GLOB_APP_SHORT_NAME,\n    VITE_GLOB_API_URL_PREFIX,\n    VITE_GLOB_APP_CAS_BASE_URL,\n    VITE_GLOB_APP_OPEN_SSO,\n    VITE_GLOB_APP_OPEN_QIANKUN,\n    VITE_GLOB_DOMAIN_URL,\n    VITE_GLOB_ONLINE_VIEW_URL,\n    VITE_GLOB_RUN_PLATFORM,\n\n    // 【JEECG作为乾坤子应用】\n    VITE_GLOB_QIANKUN_MICRO_APP_NAME,\n    VITE_GLOB_QIANKUN_MICRO_APP_ENTRY,\n  } = getAppEnvConfig();\n\n  // if (!/[a-zA-Z\\_]*/.test(VITE_GLOB_APP_SHORT_NAME)) {\n  //   warn(\n  //     `VITE_GLOB_APP_SHORT_NAME Variables can only be characters/underscores, please modify in the environment variables and re-running.`\n  //   );\n  // }\n\n  // 短标题：替换shortName的下划线为空格\n  const shortTitle = VITE_GLOB_APP_SHORT_NAME.replace(/_/g, \" \");\n  // Take global configuration\n  const glob: Readonly<GlobConfig> = {\n    title: VITE_GLOB_APP_TITLE,\n    domainUrl: VITE_GLOB_DOMAIN_URL,\n    apiUrl: VITE_GLOB_API_URL,\n    shortName: VITE_GLOB_APP_SHORT_NAME,\n    shortTitle: shortTitle,\n    openSso: VITE_GLOB_APP_OPEN_SSO,\n    openQianKun: VITE_GLOB_APP_OPEN_QIANKUN,\n    casBaseUrl: VITE_GLOB_APP_CAS_BASE_URL,\n    urlPrefix: VITE_GLOB_API_URL_PREFIX,\n    uploadUrl: VITE_GLOB_DOMAIN_URL,\n    viewUrl: VITE_GLOB_ONLINE_VIEW_URL,\n    // true: 新任务办理页面弹窗, false:旧的任务办理页面弹窗\n    useNewTaskModal: true,\n    // 当前是否运行在 electron 平台\n    isElectronPlatform: VITE_GLOB_RUN_PLATFORM === 'electron',\n\n    // 【JEECG作为乾坤子应用】是否以乾坤子应用模式启动\n    isQiankunMicro: VITE_GLOB_QIANKUN_MICRO_APP_NAME != null && VITE_GLOB_QIANKUN_MICRO_APP_NAME !== '',\n    // 【JEECG作为乾坤子应用】乾坤子应用入口\n    qiankunMicroAppEntry: VITE_GLOB_QIANKUN_MICRO_APP_ENTRY,\n  };\n\n  // 【JEECG作为乾坤子应用】乾坤子应用下，需要定义一下\n  if (!window['_CONFIG']) {\n    window['_CONFIG'] = {}\n  }\n\n  // 代码逻辑说明: 【QQYUN-10956】配置了自定义前缀，外部连接打不开，需要兼容处理\n  let domainURL = VITE_GLOB_DOMAIN_URL;\n\n  // 如果不是以http(s)开头的，也不是以域名开头的，那么就是拼接当前域名\n  if (!/^http(s)?/.test(domainURL) && !/^(\\/\\/)?(.*\\.)?.+\\..+/.test(domainURL)) {\n    if (!domainURL.startsWith('/')) {\n      domainURL = '/' + domainURL;\n    }\n    domainURL = window.location.origin + domainURL;\n  }\n\n  // @ts-ignore\n  window._CONFIG['domianURL'] = domainURL;\n\n  return glob as Readonly<GlobConfig>;\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/setting/useHeaderSetting.ts",
    "content": "import type { HeaderSetting } from '/#/config';\n\nimport { computed, unref } from 'vue';\n\nimport { useAppStore } from '/@/store/modules/app';\n\nimport { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\nimport { useRootSetting } from '/@/hooks/setting/useRootSetting';\nimport { useFullContent } from '/@/hooks/web/useFullContent';\nimport { MenuModeEnum } from '/@/enums/menuEnum';\n\nexport function useHeaderSetting() {\n  const { getFullContent } = useFullContent();\n  const appStore = useAppStore();\n\n  const getShowFullHeaderRef = computed(() => {\n    return !unref(getFullContent) && unref(getShowMixHeaderRef) && unref(getShowHeader) && !unref(getIsTopMenu) && !unref(getIsMixSidebar);\n  });\n\n  const getUnFixedAndFull = computed(() => !unref(getFixed) && !unref(getShowFullHeaderRef));\n\n  const getShowInsetHeaderRef = computed(() => {\n    const need = !unref(getFullContent) && unref(getShowHeader);\n    return (need && !unref(getShowMixHeaderRef)) || (need && unref(getIsTopMenu)) || (need && unref(getIsMixSidebar));\n  });\n\n  const { getMenuMode, getSplit, getShowHeaderTrigger, getIsSidebarType, getIsMixSidebar, getIsTopMenu } = useMenuSetting();\n  const { getShowBreadCrumb, getShowLogo } = useRootSetting();\n\n  const getShowMixHeaderRef = computed(() => !unref(getIsSidebarType) && unref(getShowHeader));\n\n  const getShowDoc = computed(() => appStore.getHeaderSetting.showDoc);\n\n  const getHeaderTheme = computed(() => appStore.getHeaderSetting.theme);\n\n  const getShowHeader = computed(() => appStore.getHeaderSetting.show);\n\n  const getFixed = computed(() => appStore.getHeaderSetting.fixed);\n\n  const getHeaderBgColor = computed(() => appStore.getHeaderSetting.bgColor);\n\n  const getShowSearch = computed(() => appStore.getHeaderSetting.showSearch);\n\n  const getUseLockPage = computed(() => appStore.getHeaderSetting.useLockPage);\n\n  const getShowFullScreen = computed(() => appStore.getHeaderSetting.showFullScreen);\n\n  const getShowNotice = computed(() => appStore.getHeaderSetting.showNotice);\n\n  const getShowBread = computed(() => {\n    return unref(getMenuMode) !== MenuModeEnum.HORIZONTAL && unref(getShowBreadCrumb) && !unref(getSplit);\n  });\n  const getShowBreadTitle = computed(() => {\n    return unref(getMenuMode) !== MenuModeEnum.HORIZONTAL && !unref(getShowBreadCrumb) && !unref(getSplit);\n  });\n\n  const getShowHeaderLogo = computed(() => {\n    return unref(getShowLogo) && !unref(getIsSidebarType) && !unref(getIsMixSidebar);\n  });\n\n  const getShowContent = computed(() => {\n    return unref(getShowBread) || unref(getShowHeaderTrigger);\n  });\n\n  // Set header configuration\n  function setHeaderSetting(headerSetting: Partial<HeaderSetting>) {\n    appStore.setProjectConfig({ headerSetting });\n  }\n  return {\n    setHeaderSetting,\n\n    getShowDoc,\n    getShowSearch,\n    getHeaderTheme,\n    getUseLockPage,\n    getShowFullScreen,\n    getShowNotice,\n    getShowBread,\n    getShowContent,\n    getShowHeaderLogo,\n    getShowHeader,\n    getFixed,\n    getShowMixHeaderRef,\n    getShowFullHeaderRef,\n    getShowInsetHeaderRef,\n    getUnFixedAndFull,\n    getHeaderBgColor,\n    getShowBreadTitle\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/setting/useMenuSetting.ts",
    "content": "import type { MenuSetting } from '/#/config';\n\nimport { computed, unref, ref } from 'vue';\n\nimport { useAppStore } from '/@/store/modules/app';\n\nimport { SIDE_BAR_MINI_WIDTH, SIDE_BAR_SHOW_TIT_MINI_WIDTH } from '/@/enums/appEnum';\nimport { MenuModeEnum, MenuTypeEnum, TriggerEnum } from '/@/enums/menuEnum';\nimport { useFullContent } from '/@/hooks/web/useFullContent';\n\nconst mixSideHasChildren = ref(false);\n\nexport function useMenuSetting() {\n  const { getFullContent: fullContent } = useFullContent();\n  const appStore = useAppStore();\n\n  const getShowSidebar = computed(() => {\n    return unref(getSplit) || (unref(getShowMenu) && unref(getMenuMode) !== MenuModeEnum.HORIZONTAL && !unref(fullContent));\n  });\n\n  const getCollapsed = computed(() => appStore.getMenuSetting.collapsed);\n\n  const getMenuType = computed(() => appStore.getMenuSetting.type);\n\n  const getMenuMode = computed(() => appStore.getMenuSetting.mode);\n\n  const getMenuFixed = computed(() => appStore.getMenuSetting.fixed);\n\n  const getShowMenu = computed(() => appStore.getMenuSetting.show);\n\n  const getMenuHidden = computed(() => appStore.getMenuSetting.hidden);\n\n  const getMenuWidth = computed(() => appStore.getMenuSetting.menuWidth);\n\n  const getTrigger = computed(() => appStore.getMenuSetting.trigger);\n\n  const getMenuTheme = computed(() => appStore.getMenuSetting.theme);\n\n  const getSplit = computed(() => appStore.getMenuSetting.split);\n\n  const getMenuBgColor = computed(() => appStore.getMenuSetting.bgColor);\n\n  const getMixSideTrigger = computed(() => appStore.getMenuSetting.mixSideTrigger);\n\n  const getCanDrag = computed(() => appStore.getMenuSetting.canDrag);\n\n  const getAccordion = computed(() => appStore.getMenuSetting.accordion);\n\n  const getMixSideFixed = computed(() => appStore.getMenuSetting.mixSideFixed);\n\n  const getTopMenuAlign = computed(() => appStore.getMenuSetting.topMenuAlign);\n\n  const getCloseMixSidebarOnChange = computed(() => appStore.getMenuSetting.closeMixSidebarOnChange);\n\n  const getIsSidebarType = computed(() => unref(getMenuType) === MenuTypeEnum.SIDEBAR);\n\n  const getIsTopMenu = computed(() => unref(getMenuType) === MenuTypeEnum.TOP_MENU);\n\n  const getCollapsedShowTitle = computed(() => appStore.getMenuSetting.collapsedShowTitle);\n\n  const getShowTopMenu = computed(() => {\n    return unref(getMenuMode) === MenuModeEnum.HORIZONTAL || unref(getSplit);\n  });\n\n  const getShowHeaderTrigger = computed(() => {\n    if (unref(getMenuType) === MenuTypeEnum.TOP_MENU || !unref(getShowMenu) || unref(getMenuHidden)) {\n      return false;\n    }\n\n    return unref(getTrigger) === TriggerEnum.HEADER;\n  });\n\n  const getIsHorizontal = computed(() => {\n    return unref(getMenuMode) === MenuModeEnum.HORIZONTAL;\n  });\n\n  const getIsMixSidebar = computed(() => {\n    return unref(getMenuType) === MenuTypeEnum.MIX_SIDEBAR;\n  });\n\n  const getIsMixMode = computed(() => {\n    return unref(getMenuMode) === MenuModeEnum.INLINE && unref(getMenuType) === MenuTypeEnum.MIX;\n  });\n\n  const getRealWidth = computed(() => {\n    if (unref(getIsMixSidebar)) {\n      // 代码逻辑说明: 【QQYUN-8774】侧边混合导航菜单宽度调整\n      return unref(getCollapsed) && !unref(getMixSideFixed) ? unref(getMiniWidthNumber) : unref(getMenuWidth) - 60;\n    }\n    return unref(getCollapsed) ? unref(getMiniWidthNumber) : unref(getMenuWidth);\n  });\n\n  const getMiniWidthNumber = computed(() => {\n    const { collapsedShowTitle } = appStore.getMenuSetting;\n    return collapsedShowTitle ? SIDE_BAR_SHOW_TIT_MINI_WIDTH : SIDE_BAR_MINI_WIDTH;\n  });\n\n  const getCalcContentWidth = computed(() => {\n    const width =\n      unref(getIsTopMenu) || !unref(getShowMenu) || (unref(getSplit) && unref(getMenuHidden))\n        ? 0\n        : unref(getIsMixSidebar)\n        ? (unref(getCollapsed) ? SIDE_BAR_MINI_WIDTH : SIDE_BAR_SHOW_TIT_MINI_WIDTH) +\n          (unref(getMixSideFixed) && unref(mixSideHasChildren) ? unref(getRealWidth) : 0)\n        : unref(getRealWidth);\n\n    return `calc(100% - ${unref(width)}px)`;\n  });\n\n  // Set menu configuration\n  function setMenuSetting(menuSetting: Partial<MenuSetting>): void {\n    appStore.setProjectConfig({ menuSetting });\n  }\n\n  function toggleCollapsed() {\n    setMenuSetting({\n      collapsed: !unref(getCollapsed),\n    });\n  }\n  return {\n    setMenuSetting,\n\n    toggleCollapsed,\n\n    getMenuFixed,\n    getRealWidth,\n    getMenuType,\n    getMenuMode,\n    getShowMenu,\n    getCollapsed,\n    getMiniWidthNumber,\n    getCalcContentWidth,\n    getMenuWidth,\n    getTrigger,\n    getSplit,\n    getMenuTheme,\n    getCanDrag,\n    getCollapsedShowTitle,\n    getIsHorizontal,\n    getIsSidebarType,\n    getAccordion,\n    getShowTopMenu,\n    getShowHeaderTrigger,\n    getTopMenuAlign,\n    getMenuHidden,\n    getIsTopMenu,\n    getMenuBgColor,\n    getShowSidebar,\n    getIsMixMode,\n    getIsMixSidebar,\n    getCloseMixSidebarOnChange,\n    getMixSideTrigger,\n    getMixSideFixed,\n    mixSideHasChildren,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/setting/useMultipleTabSetting.ts",
    "content": "import type { MultiTabsSetting } from '/#/config';\n\nimport { computed } from 'vue';\n\nimport { useAppStore } from '/@/store/modules/app';\n\nexport function useMultipleTabSetting() {\n  const appStore = useAppStore();\n\n  const getShowMultipleTab = computed(() => appStore.getMultiTabsSetting.show);\n\n  const getShowQuick = computed(() => appStore.getMultiTabsSetting.showQuick);\n\n  const getShowRedo = computed(() => appStore.getMultiTabsSetting.showRedo);\n\n  const getShowFold = computed(() => appStore.getMultiTabsSetting.showFold);\n\n  // 获取标签页样式\n  const getTabsTheme = computed(() => appStore.getMultiTabsSetting.theme);\n\n  function setMultipleTabSetting(multiTabsSetting: Partial<MultiTabsSetting>) {\n    appStore.setProjectConfig({ multiTabsSetting });\n  }\n  return {\n    setMultipleTabSetting,\n    getShowMultipleTab,\n    getShowQuick,\n    getShowRedo,\n    getShowFold,\n    getTabsTheme,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/setting/useRootSetting.ts",
    "content": "import type { ProjectConfig } from '/#/config';\n\nimport { computed } from 'vue';\n\nimport { useAppStore } from '/@/store/modules/app';\nimport { ContentEnum, ThemeEnum } from '/@/enums/appEnum';\n\ntype RootSetting = Omit<ProjectConfig, 'locale' | 'headerSetting' | 'menuSetting' | 'multiTabsSetting'>;\n\nexport function useRootSetting() {\n  const appStore = useAppStore();\n\n  const getPageLoading = computed(() => appStore.getPageLoading);\n\n  const getOpenKeepAlive = computed(() => appStore.getProjectConfig.openKeepAlive);\n\n  const getSettingButtonPosition = computed(() => appStore.getProjectConfig.settingButtonPosition);\n\n  const getCanEmbedIFramePage = computed(() => appStore.getProjectConfig.canEmbedIFramePage);\n\n  const getPermissionMode = computed(() => appStore.getProjectConfig.permissionMode);\n\n  const getShowLogo = computed(() => appStore.getProjectConfig.showLogo);\n\n  const getContentMode = computed(() => appStore.getProjectConfig.contentMode);\n\n  const getUseOpenBackTop = computed(() => appStore.getProjectConfig.useOpenBackTop);\n\n  const getShowSettingButton = computed(() => appStore.getProjectConfig.showSettingButton);\n\n  const getUseErrorHandle = computed(() => appStore.getProjectConfig.useErrorHandle);\n\n  const getShowFooter = computed(() => appStore.getProjectConfig.showFooter);\n\n  const getShowBreadCrumb = computed(() => appStore.getProjectConfig.showBreadCrumb);\n\n  const getThemeColor = computed(() => appStore.getProjectConfig.themeColor);\n\n  const getShowBreadCrumbIcon = computed(() => appStore.getProjectConfig.showBreadCrumbIcon);\n\n  const getFullContent = computed(() => appStore.getProjectConfig.fullContent);\n\n  const getColorWeak = computed(() => appStore.getProjectConfig.colorWeak);\n\n  const getGrayMode = computed(() => appStore.getProjectConfig.grayMode);\n  // 代码逻辑说明: 【QQYUN-10952】AI助手支持通过设置来配置是否显示\n  const getAiIconShow = computed(() => appStore.getProjectConfig.aiIconShow);\n  const getLockTime = computed(() => appStore.getProjectConfig.lockTime);\n\n  const getShowDarkModeToggle = computed(() => appStore.getProjectConfig.showDarkModeToggle);\n\n  const getDarkMode = computed(() => appStore.getDarkMode);\n\n  const getLayoutContentMode = computed(() => (appStore.getProjectConfig.contentMode === ContentEnum.FULL ? ContentEnum.FULL : ContentEnum.FIXED));\n\n  function setRootSetting(setting: Partial<RootSetting>) {\n    appStore.setProjectConfig(setting);\n  }\n\n  function setDarkMode(mode: ThemeEnum) {\n    appStore.setDarkMode(mode);\n  }\n  return {\n    setRootSetting,\n\n    getSettingButtonPosition,\n    getFullContent,\n    getColorWeak,\n    getGrayMode,\n    getLayoutContentMode,\n    getPageLoading,\n    getOpenKeepAlive,\n    getCanEmbedIFramePage,\n    getPermissionMode,\n    getShowLogo,\n    getUseErrorHandle,\n    getShowBreadCrumb,\n    getShowBreadCrumbIcon,\n    getUseOpenBackTop,\n    getShowSettingButton,\n    getShowFooter,\n    getContentMode,\n    getLockTime,\n    getThemeColor,\n    getDarkMode,\n    setDarkMode,\n    getShowDarkModeToggle,\n    getAiIconShow,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/setting/useTransitionSetting.ts",
    "content": "import type { TransitionSetting } from '/#/config';\n\nimport { computed } from 'vue';\n\nimport { useAppStore } from '/@/store/modules/app';\n\nexport function useTransitionSetting() {\n  const appStore = useAppStore();\n\n  const getEnableTransition = computed(() => appStore.getTransitionSetting?.enable);\n\n  const getOpenNProgress = computed(() => appStore.getTransitionSetting?.openNProgress);\n\n  const getOpenPageLoading = computed((): boolean => {\n    return !!appStore.getTransitionSetting?.openPageLoading;\n  });\n\n  const getBasicTransition = computed(() => appStore.getTransitionSetting?.basicTransition);\n\n  function setTransitionSetting(transitionSetting: Partial<TransitionSetting>) {\n    appStore.setProjectConfig({ transitionSetting });\n  }\n  return {\n    setTransitionSetting,\n\n    getEnableTransition,\n    getOpenNProgress,\n    getOpenPageLoading,\n    getBasicTransition,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/system/useAutoAdapt.ts",
    "content": "import { ref } from 'vue';\nimport { ScreenSizeEnum } from '/@/enums/sizeEnum';\nimport { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn';\n// 定义 useAdapt 方法参数\ninterface AdaptOptions {\n  // xl>1200\n  xl?: string | number;\n  // xl>992\n  lg?: string | number;\n  // xl>768\n  md?: string | number;\n  // xl>576\n  sm?: string | number;\n  // xl>480\n  xs?: string | number;\n  //xl<480默认值\n  mindef?: string | number;\n  //默认值\n  def?: string | number;\n}\nexport function useAdapt(props?: AdaptOptions) {\n  //默认宽度\n  const width = ref<string | number>(props?.def || '600px');\n  //获取宽度\n  useWindowSizeFn(calcWidth, 100, { immediate: true });\n  //计算宽度\n  function calcWidth() {\n    let windowWidth = document.documentElement.clientWidth;\n    switch (true) {\n      case windowWidth > ScreenSizeEnum.XL:\n        width.value = props?.xl || '600px';\n        break;\n      case windowWidth > ScreenSizeEnum.LG:\n        width.value = props?.lg || '600px';\n        break;\n      case windowWidth > ScreenSizeEnum.MD:\n        width.value = props?.md || '600px';\n        break;\n      case windowWidth > ScreenSizeEnum.SM:\n        width.value = props?.sm || '500px';\n        break;\n      case windowWidth > ScreenSizeEnum.XS:\n        width.value = props?.xs || '400px';\n        break;\n      default:\n        width.value = props?.mindef || '300px';\n        break;\n    }\n  }\n  return { width, calcWidth };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/system/useJvxeMethods.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { ref, unref } from 'vue';\nimport { VALIDATE_FAILED, validateFormModelAndTables } from '/@/utils/common/vxeUtils';\n\nexport function useJvxeMethod(requestAddOrEdit, classifyIntoFormData, tableRefs, activeKey, refKeys, validateSubForm?) {\n  const formRef = ref();\n  /** 查询某个tab的数据 */\n  function requestSubTableData(url, params, tab, success) {\n    tab.loading = true;\n    defHttp\n      .get({ url, params }, { isTransformResponse: false })\n      .then((res) => {\n        let { result } = res;\n        if (res.success && result) {\n          if (Array.isArray(result)) {\n            tab.dataSource = result;\n          } else if (Array.isArray(result.records)) {\n            tab.dataSource = result.records;\n          }\n        }\n        typeof success === 'function' ? success(res) : '';\n      })\n      .finally(() => {\n        tab.loading = false;\n      });\n  }\n\n  /* --- handle 事件 --- */\n\n  /** ATab 选项卡切换事件 */\n  function handleChangeTabs(key) {\n    // 自动重置scrollTop状态，防止出现白屏\n    tableRefs[key]?.value?.resetScrollTop(0);\n  }\n\n  /** 获取所有的editableTable实例*/\n  function getAllTable() {\n    let values = Object.values(tableRefs);\n    return Promise.all(values);\n  }\n  /** 确定按钮点击事件 */\n  function handleSubmit() {\n    /** 触发表单验证 */\n    getAllTable()\n      .then((tables) => {\n        let values = formRef.value.getFieldsValue();\n        return validateFormModelAndTables(formRef.value.validate, values, tables, formRef.value.getProps, false);\n      })\n      .then((allValues) => {\n        /** 一次性验证一对一的所有子表 */\n        return validateSubForm && typeof validateSubForm === 'function' ? validateSubForm(allValues) : validateAllSubOne(allValues);\n      })\n      .then((allValues) => {\n        if (typeof classifyIntoFormData !== 'function') {\n          throw throwNotFunction('classifyIntoFormData');\n        }\n        let formData = classifyIntoFormData(allValues);\n        // 发起请求\n        return requestAddOrEdit(formData);\n      })\n      .catch((e) => {\n        if (e.error === VALIDATE_FAILED) {\n          // 如果有未通过表单验证的子表，就自动跳转到它所在的tab\n          // 代码逻辑说明: VUEN-2866【代码生成】Tab风格 一对多子表校验不通过时，点击提交表单空白了，流程附加页面也有此问题\n          if(e.paneKey){\n            activeKey.value = e.paneKey\n          }else{\n            // 代码逻辑说明: TV360X-478 一对多tab，校验未通过时，tab没有跳转\n            activeKey.value = e.subIndex == null ? (e.index == null ? unref(activeKey) : refKeys.value[e.index]) : Object.keys(tableRefs)[e.subIndex];\n          }\n          // 代码逻辑说明: 【TV360X-1064】非原生提交表单滚动校验没通过的项---\n          if (e?.errorFields) {\n            const firstField = e.errorFields[0];\n            if (firstField) {\n              formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'end' });\n            }\n          }\n          return Promise.reject(e?.errorFields);\n        } else {\n          console.error(e);\n        }\n      });\n  }\n  //校验所有子表表单\n  function validateAllSubOne(allValues) {\n    return new Promise((resolve) => {\n      resolve(allValues);\n    });\n  }\n  /* --- throw --- */\n\n  /** not a function */\n  function throwNotFunction(name) {\n    return `${name} 未定义或不是一个函数`;\n  }\n\n  /** not a array */\n  function throwNotArray(name) {\n    return `${name} 未定义或不是一个数组`;\n  }\n  return [handleChangeTabs, handleSubmit, requestSubTableData, formRef];\n}\n\n/**\n * 校验多个表单和子表table，用于原生的antd-vue的表单\n * @param activeKey 子表表单/vxe-table 所在tabs的 activeKey\n * @param refMap 子表表单/vxe-table对应的ref对象 map结构\n * 示例：\n * useValidateAntFormAndTable(activeKey, {\n *   'tableA': tableARef,\n *   'formB': formBRef\n * })\n */\nexport function useValidateAntFormAndTable(activeKey, refMap) {\n  /**\n   * 获取所有子表数据\n   */\n  async function getSubFormAndTableData() {\n    let formData = {};\n    let all = Object.keys(refMap);\n    let key = '';\n    for (let i = 0; i < all.length; i++) {\n      key = all[i];\n      let instance = refMap[key].value;\n      if (instance.isForm) {\n        let subFormData = await validateFormAndGetData(instance, key);\n        if (subFormData) {\n          formData[key + 'List'] = [subFormData];\n        }\n      } else {\n        let arr = await validateTableAndGetData(instance, key);\n        if (arr && arr.length > 0) {\n          formData[key + 'List'] = arr;\n        }\n      }\n    }\n    return formData;\n  }\n\n  /**\n   * 转换数据用 如果有数组转成逗号分割的格式\n   * @param data\n   */\n  function transformData(data) {\n    if (data) {\n      Object.keys(data).map((k) => {\n        if (data[k] instanceof Array) {\n          data[k] = data[k].join(',');\n        }\n      });\n    }\n    return data;\n  }\n\n  /**\n   * 子表table\n   * @param instance\n   * @param key\n   */\n  async function validateTableAndGetData(instance, key) {\n    const errors = await instance.validateTable();\n    if (!errors) {\n      return instance.getTableData();\n    } else {\n      activeKey.value = key;\n      // 自动重置scrollTop状态，防止出现白屏\n      instance.resetScrollTop(0);\n      return Promise.reject(1);\n    }\n  }\n\n  /**\n   * 子表表单\n   * @param instance\n   * @param key\n   */\n  async function validateFormAndGetData(instance, key) {\n    try {\n      let data = await instance.getFormData();\n      transformData(data);\n      return data;\n    } catch (e) {\n      activeKey.value = key;\n      return Promise.reject(e);\n    }\n  }\n\n  return {\n    getSubFormAndTableData,\n    transformData,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/system/useListPage.ts",
    "content": "import { reactive, ref, Ref, unref } from 'vue';\nimport { merge } from 'lodash-es';\nimport { DynamicProps } from '/#/utils';\nimport { BasicTableProps, TableActionType, useTable } from '/@/components/Table';\nimport { ColEx } from '/@/components/Form/src/types';\nimport { FormActionType } from '/@/components/Form';\nimport { useMessage } from '/@/hooks/web/useMessage';\nimport { useMethods } from '/@/hooks/system/useMethods';\nimport { useDesign } from '/@/hooks/web/useDesign';\nimport { filterObj } from '/@/utils/common/compUtils';\nimport { isFunction } from '@/utils/is';\nconst { handleExportXls, handleImportXls } = useMethods();\n\n// 定义 useListPage 方法所需参数\ninterface ListPageOptions {\n  // 样式作用域范围\n  designScope?: string;\n  // 【必填】表格参数配置\n  tableProps: TableProps;\n  // 是否分页\n  pagination?: boolean;\n  // 导出配置\n  exportConfig?: {\n    url: string | (() => string);\n    // 导出文件名\n    name?: string | (() => string);\n    //导出参数\n    params?: object | (() => object);\n  };\n  // 导入配置\n  importConfig?: {\n    // 代码逻辑说明: erp代码生成 子表 导入地址是动态的\n    url: string | (() => string);\n    // 导出成功后的回调\n    success?: (fileInfo?: any) => void;\n  };\n}\n\ninterface IDoRequestOptions {\n  // 是否显示确认对话框，默认 true\n  confirm?: boolean;\n  // 是否自动刷新表格，默认 true\n  reload?: boolean;\n  // 是否自动清空选择，默认 true\n  clearSelection?: boolean;\n}\n\n/**\n * listPage页面公共方法\n *\n * @param options\n */\nexport function useListPage(options: ListPageOptions) {\n  const $message = useMessage();\n  let $design = {} as ReturnType<typeof useDesign>;\n  if (options.designScope) {\n    $design = useDesign(options.designScope);\n  }\n\n  const tableContext = useListTable(options.tableProps);\n\n  const [, { getForm, reload, setLoading, getColumns }, { selectedRowKeys }] = tableContext;\n\n  // 导出 excel\n  async function onExportXls() {\n    // 代码逻辑说明: 导出新增自定义参数------------\n    let { url, name, params } = options?.exportConfig ?? {};\n    let realUrl = typeof url === 'function' ? url() : url;\n    if (realUrl) {\n      let title = typeof name === 'function' ? name() : name;\n      // 代码逻辑说明: erp代码生成 子表 导出报错，原因未知-\n      let paramsForm:any = {};\n      try {\n        //当useSearchFor不等于false的时候，才去触发validate\n        if (options?.tableProps?.useSearchForm !== false) {\n          paramsForm = await getForm().validate();\n          console.log('paramsForm', paramsForm);\n          // 在这里把执行beforeFetch\n          if (options?.tableProps?.beforeFetch) {\n            paramsForm = await options?.tableProps?.beforeFetch(paramsForm);\n          }\n        }\n      } catch (e) {\n        console.warn(e);\n      }\n\n      // 代码逻辑说明: [/issues/409]导出功能没有按排序结果导出,设置导出默认排序，创建时间倒序\n      if(!paramsForm?.column){\n         Object.assign(paramsForm,{column:'createTime',order:'desc'});\n      }\n\n      //如果参数不为空，则整合到一起\n      // 代码逻辑说明: erp代码生成 子表 导出动态设置mainId\n      if (params) {\n        // 代码逻辑说明: [QQYUN-11627]代码生成原生表单，数据导出，前端报错，并且范围参数没有转换 #7962\n        const realParams = isFunction(params) ? await params() : { ...(params || {}) };\n        Object.keys(realParams).map((k) => {\n          let temp = (realParams as object)[k];\n          if (temp) {\n            paramsForm[k] = unref(temp);\n          }\n        });\n      }\n      if (selectedRowKeys.value && selectedRowKeys.value.length > 0) {\n        paramsForm['selections'] = selectedRowKeys.value.join(',');\n      }\n\n      //是否显示表格设置\n      if(options?.tableProps?.showTableSetting !== false){\n        //是否显示配置字段\n        if(options?.tableProps?.tableSetting?.setting !== false){\n          await exportColumns(paramsForm)\n        }\n      }\n    \n      return handleExportXls(title as string, realUrl, filterObj(paramsForm));\n    } else {\n      $message.createMessage.warn('没有传递 exportConfig.url 参数');\n      return Promise.reject();\n    }\n  }\n\n  /**\n   * 设置导出的列\n   * \n   * @param paramsForm\n   */\n  async function exportColumns(paramsForm: any) {\n    //获取表格的列\n    let columns = getColumns();\n    if(columns && columns.length >0){\n      //需要导出的字段\n      let exportFields:any = [];\n      //是否有隐藏列\n      let hiddenColumns = false;\n      for (const column of columns) {\n        if(!column.defaultHidden){\n          let dataIndex = column?.dataIndex;\n          if(column?.dataIndex?.toString()?.indexOf('_dictText') !== -1){\n            dataIndex = column?.dataIndex?.toString().replace('_dictText','')\n          }\n          exportFields.push(dataIndex);\n        } else {\n          hiddenColumns = true;\n        }\n      }\n      if(hiddenColumns){\n        paramsForm['exportFields'] = exportFields.join(\",\");\n      }\n    }\n  }\n\n  // 导入 excel\n  function onImportXls(file) {\n    let { url, success } = options?.importConfig ?? {};\n    // 代码逻辑说明: erp代码生成 子表 导入地址是动态的\n    let realUrl = typeof url === 'function' ? url() : url;\n    if (realUrl) {\n      return handleImportXls(file, realUrl, success || reload);\n    } else {\n      $message.createMessage.warn('没有传递 importConfig.url 参数');\n      return Promise.reject();\n    }\n  }\n\n  /**\n   * 通用请求处理方法，可自动刷新表格，自动清空选择\n   * @param api 请求api\n   * @param options 是否显示确认框\n   */\n  function doRequest(api: () => Promise<any>, options?: IDoRequestOptions) {\n    return new Promise((resolve, reject) => {\n      const execute = async () => {\n        try {\n          setLoading(true);\n          const res = await api();\n          if (options?.reload ?? true) {\n            reload();\n          }\n          if (options?.clearSelection ?? true) {\n            selectedRowKeys.value = [];\n          }\n          resolve(res);\n        } catch (e) {\n          reject(e);\n        } finally {\n          setLoading(false);\n        }\n      };\n      if (options?.confirm ?? true) {\n        $message.createConfirm({\n          iconType: 'warning',\n          title: '删除',\n          content: '确定要删除吗？',\n          onOk: () => execute(),\n          onCancel: () => reject(),\n        });\n      } else {\n        execute();\n      }\n    });\n  }\n\n  /** 执行单个删除操作 */\n  function doDeleteRecord(api: () => Promise<any>) {\n    return doRequest(api, { confirm: false, clearSelection: false });\n  }\n\n  return {\n    ...$design,\n    ...$message,\n    onExportXls,\n    onImportXls,\n    doRequest,\n    doDeleteRecord,\n    tableContext,\n  };\n}\n\n// 定义表格所需参数\ntype TableProps = Partial<DynamicProps<BasicTableProps>>;\ntype UseTableMethod = TableActionType & {\n  getForm: () => FormActionType;\n};\n\n/**\n * useListTable 列表页面标准表格参数\n *\n * @param tableProps 表格参数\n */\nexport function useListTable(tableProps: TableProps): [\n  (instance: TableActionType, formInstance: UseTableMethod) => void,\n  TableActionType & {\n    getForm: () => FormActionType;\n  },\n  {\n    rowSelection: any;\n    selectedRows: Ref<Recordable[]>;\n    selectedRowKeys: Ref<any[]>;\n  }\n] {\n  // 自适应列配置\n  const adaptiveColProps: Partial<ColEx> = {\n    xs: 24, // <576px\n    sm: 12, // ≥576px\n    md: 12, // ≥768px\n    lg: 8, // ≥992px\n    xl: 8, // ≥1200px\n    xxl: 6, // ≥1600px\n  };\n  const defaultTableProps: TableProps = {\n    rowKey: 'id',\n    // 使用查询条件区域\n    useSearchForm: true,\n    // 查询条件区域配置\n    formConfig: {\n      // 紧凑模式\n      compact: true,\n      // label默认宽度\n      // labelWidth: 120,\n      // 按下回车后自动提交\n      autoSubmitOnEnter: true,\n      // 默认 row 配置\n      rowProps: { gutter: 8 },\n      // 默认 col 配置\n      baseColProps: {\n        ...adaptiveColProps,\n      },\n      labelCol: {\n        xs: 24,\n        sm: 8,\n        md: 6,\n        lg: 8,\n        xl: 6,\n        xxl: 6,\n      },\n      wrapperCol: {},\n      // 是否显示 展开/收起 按钮\n      showAdvancedButton: true,\n      // 超过指定列数默认折叠\n      autoAdvancedCol: 3,\n      // 操作按钮配置\n      actionColOptions: {\n        ...adaptiveColProps,\n        style: { textAlign: 'left' },\n      },\n    },\n    // 斑马纹\n    striped: false,\n    // 是否可以自适应高度\n    canResize: true,\n    // 表格最小高度\n    // update-begin--author:liaozhiyang---date:20240603---for【TV360X-861】列表查询区域不可往上滚动\n    minHeight: 300,\n    // update-end--author:liaozhiyang---date:20240603---for【TV360X-861】列表查询区域不可往上滚动\n    // 点击行选中\n    clickToRowSelect: false,\n    // 是否显示边框\n    bordered: true,\n    // 是否显示序号列\n    showIndexColumn: false,\n    // 显示表格设置\n    showTableSetting: true,\n    // 表格全屏设置\n    tableSetting: {\n      fullScreen: false,\n    },\n    // 是否显示操作列\n    showActionColumn: true,\n    // 操作列\n    actionColumn: {\n      width: 120,\n      title: '操作',\n      //是否锁定操作列取值 right ,left,false\n      fixed: false,\n      dataIndex: 'action',\n      slots: { customRender: 'action' },\n    },\n  };\n  // 合并用户个性化配置\n  if (tableProps) {\n    // 代码逻辑说明: 【issues/6180】前端代码配置表变查询条件显示列不生效---\n    if(tableProps.formConfig){\n      setTableProps(tableProps.formConfig);\n    }\n    // merge 方法可深度合并对象\n    merge(defaultTableProps, tableProps);\n  }\n\n  // 发送请求之前调用的方法\n  function beforeFetch(params) {\n    // 默认以 createTime 降序排序\n    return Object.assign({ column: 'createTime', order: 'desc' }, params);\n  }\n\n  // 合并方法\n  Object.assign(defaultTableProps, { beforeFetch });\n  if (typeof tableProps.beforeFetch === 'function') {\n    defaultTableProps.beforeFetch = function (params) {\n      params = beforeFetch(params);\n      // @ts-ignore\n      tableProps.beforeFetch(params);\n      return params;\n    };\n  }\n\n  // 当前选择的行\n  const selectedRowKeys = ref<any[]>([]);\n  // 选择的行记录\n  const selectedRows = ref<Recordable[]>([]);\n\n  // 表格选择列配置\n  const rowSelection: any = tableProps?.rowSelection ?? {};\n  const defaultRowSelection = reactive({\n    ...rowSelection,\n    type: rowSelection.type ?? 'checkbox',\n    // 选择列宽度，默认 50\n    columnWidth: rowSelection.columnWidth ?? 50,\n    selectedRows: selectedRows,\n    selectedRowKeys: selectedRowKeys,\n    onChange(...args) {\n      selectedRowKeys.value = args[0];\n      selectedRows.value = args[1];\n      if (typeof rowSelection.onChange === 'function') {\n        rowSelection.onChange(...args);\n      }\n    },\n  });\n  delete defaultTableProps.rowSelection;\n\n  /**\n   * 设置表格参数\n   *\n   * @param formConfig\n   */\n  function setTableProps(formConfig: any) {\n    const replaceAttributeArray: string[] = ['baseColProps','labelCol'];\n    for (let item of replaceAttributeArray) {\n      if(formConfig && formConfig[item]){\n        if(defaultTableProps.formConfig){\n          let defaultFormConfig:any = defaultTableProps.formConfig;\n          defaultFormConfig[item] = formConfig[item];\n        }\n        formConfig[item] = {};\n      }\n    }\n  }\n\n  return [\n    ...useTable(defaultTableProps),\n    {\n      selectedRows,\n      selectedRowKeys,\n      rowSelection: defaultRowSelection,\n    },\n  ];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/system/useMethods.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { useMessage } from '/@/hooks/web/useMessage';\nimport { useGlobSetting } from '/@/hooks/setting';\n\nconst { createMessage, createWarningModal } = useMessage();\nconst glob = useGlobSetting();\n\n/**\n * 导出文件xlsx的mime-type\n */\nexport const XLSX_MIME_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n/**\n * 导出文件xlsx的文件后缀\n */\nexport const XLSX_FILE_SUFFIX = '.xlsx';\n\nexport function useMethods() {\n  /**\n   * 导出xls\n   * @param name\n   * @param url\n   * @param params\n   * @param isXlsx\n   * @param timeout 超时时间（毫秒），默认 60000\n   */\n  async function exportXls(name, url, params, isXlsx = false, timeout = 60000) {\n    // 代码逻辑说明: 【JHHB-794】用户管理，跨页全选后，点击用户导出没反应---\n    if(params?.selections){\n      let split = params.selections.split(\",\");\n      if(split && split.length > 100){\n        createMessage.warning('最多可选择 100 项进行导出！');\n        return;\n      }\n    }\n    // 修改为返回原生 response，便于获取 headers\n    const response = await defHttp.get(\n      { url: url, params: params, responseType: 'blob', timeout: timeout },\n      { isTransformResponse: false, isReturnNativeResponse: true }\n    );\n    if (!response || !response.data) {\n      createMessage.warning('文件下载失败');\n      return;\n    }\n    // 判断 header 中 content-disposition 是否包含 .xlsx\n    let isXlsxByHeader = isXlsx;\n    const disposition = response.headers && response.headers['content-disposition'];\n    if (disposition && disposition.indexOf('.xlsx') !== -1) {\n      isXlsxByHeader = true;\n    }\n    const data = response.data;\n    // 代码逻辑说明: 导出excel失败提示，不进行导出---\n    let reader = new FileReader()\n    reader.readAsText(data, 'utf-8')\n    reader.onload = async () => {\n      if(reader.result){\n        if(reader.result.toString().indexOf(\"success\") !=-1){\n          // 代码逻辑说明: 【issues/7738】文件中带\"success\"导出报错 ---\n          try {\n            const { success, message } = JSON.parse(reader.result.toString());\n            if (!success) {\n              createMessage.warning('导出失败，失败原因：' + message);\n            } else {\n              exportExcel(name, isXlsxByHeader, data);\n            }\n            return;\n          } catch (error) {\n            exportExcel(name, isXlsxByHeader, data);\n          }\n        }\n      }\n      exportExcel(name, isXlsxByHeader, data);\n    }\n  }\n\n  /**\n   * 导入xls\n   * @param data 导入的数据\n   * @param url\n   * @param success 成功后的回调\n   */\n  async function importXls(data, url, success) {\n    const isReturn = (fileInfo) => {\n      try {\n        if (fileInfo.code === 201) {\n          let {\n            message,\n            result: { msg, fileUrl, fileName },\n          } = fileInfo;\n          let href = glob.uploadUrl + fileUrl;\n          createWarningModal({\n            title: message,\n            centered: false,\n            content: `<div>\n                                <span>${msg}</span><br/> \n                                <span>具体详情请<a href = ${href} download = ${fileName}> 点击下载 </a> </span> \n                              </div>`,\n          });\n          // 代码逻辑说明: [VUEN-2827]导入无权限，提示图标错误------------\n        } else if (fileInfo.code === 500 || fileInfo.code === 510) {\n          createMessage.error(fileInfo.message || `${data.file.name} 导入失败`);\n        } else {\n          createMessage.success(fileInfo.message || `${data.file.name} 文件上传成功`);\n        }\n      } catch (error) {\n        console.log('导入的数据异常', error);\n      } finally {\n        typeof success === 'function' ? success(fileInfo) : '';\n      }\n    };\n    await defHttp.uploadFile({ url }, { file: data.file }, { success: isReturn });\n  }\n\n  return {\n    handleExportXls: (name: string, url: string, params?: object, timeout?: number) => exportXls(name, url, params, false, timeout),\n    handleImportXls: (data, url, success) => importXls(data, url, success),\n    handleExportXlsx: (name: string, url: string, params?: object, timeout?: number) => exportXls(name, url, params, true, timeout),\n  };\n\n  /**\n   * 导出excel\n   * @param name\n   * @param isXlsx\n   * @param data\n   */\n  function exportExcel(name, isXlsx, data) {\n    if (!name || typeof name != 'string') {\n      name = '导出文件';\n    }\n    let blobOptions = { type: 'application/vnd.ms-excel' };\n    let fileSuffix = '.xls';\n    if (isXlsx) {\n      blobOptions['type'] = XLSX_MIME_TYPE;\n      fileSuffix = XLSX_FILE_SUFFIX;\n    }\n    if (typeof window.navigator.msSaveBlob !== 'undefined') {\n      window.navigator.msSaveBlob(new Blob([data], blobOptions), name + fileSuffix);\n    } else {\n      let url = window.URL.createObjectURL(new Blob([data], blobOptions));\n      let link = document.createElement('a');\n      link.style.display = 'none';\n      link.href = url;\n      link.setAttribute('download', name + fileSuffix);\n      document.body.appendChild(link);\n      link.click();\n      document.body.removeChild(link); //下载完成移除元素\n      window.URL.revokeObjectURL(url); //释放掉blob对象\n    }\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/system/useThirdLogin.ts",
    "content": "import { ref, unref } from 'vue';\nimport { defHttp } from '/@/utils/http/axios';\nimport { useGlobSetting } from '/@/hooks/setting';\nimport { useMessage } from '/@/hooks/web/useMessage';\nimport { useUserStore } from '/@/store/modules/user';\nimport { setThirdCaptcha, getCaptcha } from '/@/api/sys/user';\nimport { useI18n } from '/@/hooks/web/useI18n';\n\nexport function useThirdLogin() {\n  const { createMessage, notification } = useMessage();\n  const { t } = useI18n();\n  const glob = useGlobSetting();\n  const userStore = useUserStore();\n  //第三方类型\n  const thirdType = ref('');\n  //第三方登录相关信息\n  const thirdLoginInfo = ref<any>({});\n  //状态\n  const thirdLoginState = ref(false);\n  //绑定手机号弹窗\n  const bindingPhoneModal = ref(false);\n  //第三方用户UUID\n  const thirdUserUuid = ref('');\n  //提示窗\n  const thirdConfirmShow = ref(false);\n  //绑定密码弹窗\n  const thirdPasswordShow = ref(false);\n  //绑定密码\n  const thirdLoginPassword = ref('');\n  //绑定用户\n  const thirdLoginUser = ref('');\n  //加载中\n  const thirdCreateUserLoding = ref(false);\n  //绑定手机号\n  const thirdPhone = ref('');\n  //验证码\n  const thirdCaptcha = ref('');\n  //第三方登录\n  function onThirdLogin(source) {\n    let url = `${glob.uploadUrl}/sys/thirdLogin/render/${source}`;\n    const openWin = window.open(\n      url,\n      `login ${source}`,\n      'height=500, width=500, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=n o, status=no'\n    );\n    thirdType.value = source;\n    thirdLoginInfo.value = {};\n    thirdLoginState.value = false;\n    let receiveMessage = function (event) {\n      let token = event.data;\n      if (typeof token === 'string') {\n        //如果是字符串类型 说明是token信息\n        if (token === '登录失败') {\n          createMessage.warning(token);\n        } else if (token.includes('绑定手机号')) {\n          bindingPhoneModal.value = true;\n          let strings = token.split(',');\n          thirdUserUuid.value = strings[1];\n        } else {\n          doThirdLogin(token);\n        }\n      } else if (typeof token === 'object') {\n        //对象类型 说明需要提示是否绑定现有账号\n        if (token['isObj'] === true) {\n          thirdConfirmShow.value = true;\n          thirdLoginInfo.value = { ...token };\n        }\n      } else {\n        createMessage.warning('不识别的信息传递');\n      }\n      // 代码逻辑说明: 【TV360X-1827】mac系统谷歌浏览器企业微信第三方登录成功后没有弹出绑定手机弹窗\n      if (openWin?.closed) {\n        window.removeEventListener('message', receiveMessage, false);\n      }\n    };\n    // 代码逻辑说明: 【TV360X-1827】mac系统谷歌浏览器企业微信第三方登录成功后没有弹出绑定手机弹窗\n    window.removeEventListener('message', receiveMessage, false);\n    window.addEventListener('message', receiveMessage, false);\n  }\n  // 根据token执行登录\n  function doThirdLogin(token) {\n    if (unref(thirdLoginState) === false) {\n      thirdLoginState.value = true;\n      userStore.ThirdLogin({ token, thirdType: unref(thirdType) }).then((res) => {\n        console.log('res====>doThirdLogin', res);\n        if (res && res.userInfo) {\n          notification.success({\n            message: t('sys.login.loginSuccessTitle'),\n            description: `${t('sys.login.loginSuccessDesc')}: ${res.userInfo.realname}`,\n            duration: 3,\n          });\n        } else {\n          requestFailed(res);\n        }\n      });\n    }\n  }\n\n  function requestFailed(err) {\n    notification.error({\n      message: '登录失败',\n      description: ((err.response || {}).data || {}).message || err.message || '请求出现错误，请稍后再试',\n      duration: 4,\n    });\n  }\n  // 绑定已有账号 需要输入密码\n  function thirdLoginUserBind() {\n    thirdLoginPassword.value = '';\n    thirdLoginUser.value = thirdLoginInfo.value.uuid;\n    thirdConfirmShow.value = false;\n    thirdPasswordShow.value = true;\n  }\n  //创建新账号\n  function thirdLoginUserCreate() {\n    thirdCreateUserLoding.value = true;\n    // 账号名后面添加两位随机数\n    thirdLoginInfo.value.suffix = parseInt(Math.random() * 98 + 1);\n    defHttp\n      .post({ url: '/sys/third/user/create', params: { thirdLoginInfo: unref(thirdLoginInfo) } }, { isTransformResponse: false })\n      .then((res) => {\n        if (res.success) {\n          let token = res.result;\n          doThirdLogin(token);\n          thirdConfirmShow.value = false;\n        } else {\n          createMessage.warning(res.message);\n        }\n      })\n      .finally(() => {\n        thirdCreateUserLoding.value = false;\n      });\n  }\n  // 核实密码\n  function thirdLoginCheckPassword() {\n    let params = Object.assign({}, unref(thirdLoginInfo), { password: unref(thirdLoginPassword) });\n    defHttp.post({ url: '/sys/third/user/checkPassword', params }, { isTransformResponse: false }).then((res) => {\n      if (res.success) {\n        thirdLoginNoPassword();\n        doThirdLogin(res.result);\n      } else {\n        createMessage.warning(res.message);\n      }\n    });\n  }\n  // 没有密码 取消操作\n  function thirdLoginNoPassword() {\n    thirdPasswordShow.value = false;\n    thirdLoginPassword.value = '';\n    thirdLoginUser.value = '';\n  }\n\n  //倒计时执行前的函数\n  function sendCodeApi() {\n    //return setThirdCaptcha({mobile:unref(thirdPhone)});\n    return getCaptcha({ mobile: unref(thirdPhone), smsmode: '0' });\n  }\n  //绑定手机号点击确定按钮\n  function thirdHandleOk() {\n    if (!unref(thirdPhone)) {\n      cmsFailed('请输入手机号');\n    }\n    if (!unref(thirdCaptcha)) {\n      cmsFailed('请输入验证码');\n    }\n    let params = {\n      mobile: unref(thirdPhone),\n      captcha: unref(thirdCaptcha),\n      thirdUserUuid: unref(thirdUserUuid),\n    };\n    defHttp.post({ url: '/sys/thirdLogin/bindingThirdPhone', params }, { isTransformResponse: false }).then((res) => {\n      if (res.success) {\n        bindingPhoneModal.value = false;\n        doThirdLogin(res.result);\n      } else {\n        createMessage.warning(res.message);\n      }\n    });\n  }\n  function cmsFailed(err) {\n    notification.error({\n      message: '登录失败',\n      description: err,\n      duration: 4,\n    });\n    return;\n  }\n  //返回数据和方法\n  return {\n    thirdPasswordShow,\n    thirdLoginCheckPassword,\n    thirdLoginNoPassword,\n    thirdLoginPassword,\n    thirdConfirmShow,\n    thirdCreateUserLoding,\n    thirdLoginUserCreate,\n    thirdLoginUserBind,\n    bindingPhoneModal,\n    thirdHandleOk,\n    thirdPhone,\n    thirdCaptcha,\n    onThirdLogin,\n    sendCodeApi,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useAppInject.ts",
    "content": "import { useAppProviderContext } from '/@/components/Application';\nimport { computed, unref } from 'vue';\n\nexport function useAppInject() {\n  const values = useAppProviderContext();\n\n  return {\n    getIsMobile: computed(() => unref(values.isMobile)),\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useContentHeight.ts",
    "content": "import { ComputedRef, isRef, nextTick, Ref, ref, unref, watch } from 'vue';\nimport { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated';\nimport { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn';\nimport { useLayoutHeight } from '/@/layouts/default/content/useContentViewHeight';\nimport { getViewportOffset } from '/@/utils/domUtils';\nimport { isNumber, isString } from '/@/utils/is';\n\nexport interface CompensationHeight {\n  // 使用 layout Footer 高度作为判断补偿高度的条件\n  useLayoutFooter: boolean;\n  // refs HTMLElement\n  elements?: Ref[];\n}\n\ntype Upward = number | string | null | undefined;\n\n/**\n * 动态计算内容高度，根据锚点dom最下坐标到屏幕最下坐标，根据传入dom的高度、padding、margin等值进行动态计算\n * 最终获取合适的内容高度\n *\n * @param flag 用于开启计算的响应式标识\n * @param anchorRef 锚点组件 Ref<ElRef | ComponentRef>\n * @param subtractHeightRefs 待减去高度的组件列表 Ref<ElRef | ComponentRef>\n * @param substractSpaceRefs 待减去空闲空间(margins/paddings)的组件列表 Ref<ElRef | ComponentRef>\n * @param offsetHeightRef 计算偏移的响应式高度，计算高度时将直接减去此值\n * @param upwardSpace 向上递归减去空闲空间的 层级 或 直到指定class为止 数值为2代表向上递归两次|数值为ant-layout表示向上递归直到碰见.ant-layout为止\n * @returns 响应式高度\n */\nexport function useContentHeight(\n  flag: ComputedRef<Boolean>,\n  anchorRef: Ref,\n  subtractHeightRefs: Ref[],\n  substractSpaceRefs: Ref[],\n  upwardSpace: Ref<Upward> | ComputedRef<Upward> | Upward = 0,\n  offsetHeightRef: Ref<number> = ref(0)\n) {\n  const contentHeight: Ref<Nullable<number>> = ref(null);\n  const { footerHeightRef: layoutFooterHeightRef } = useLayoutHeight();\n  let compensationHeight: CompensationHeight = {\n    useLayoutFooter: true,\n  };\n\n  const setCompensation = (params: CompensationHeight) => {\n    compensationHeight = params;\n  };\n\n  function redoHeight() {\n    nextTick(() => {\n      calcContentHeight();\n    });\n  }\n\n  function calcSubtractSpace(element: Element | null | undefined, direction: 'all' | 'top' | 'bottom' = 'all'): number {\n    function numberPx(px: string) {\n      return Number(px.replace(/[^\\d]/g, ''));\n    }\n    let subtractHeight = 0;\n    const ZERO_PX = '0px';\n    if (element) {\n      const cssStyle = getComputedStyle(element);\n      const marginTop = numberPx(cssStyle?.marginTop ?? ZERO_PX);\n      const marginBottom = numberPx(cssStyle?.marginBottom ?? ZERO_PX);\n      const paddingTop = numberPx(cssStyle?.paddingTop ?? ZERO_PX);\n      const paddingBottom = numberPx(cssStyle?.paddingBottom ?? ZERO_PX);\n      if (direction === 'all') {\n        subtractHeight += marginTop;\n        subtractHeight += marginBottom;\n        subtractHeight += paddingTop;\n        subtractHeight += paddingBottom;\n      } else if (direction === 'top') {\n        subtractHeight += marginTop;\n        subtractHeight += paddingTop;\n      } else {\n        subtractHeight += marginBottom;\n        subtractHeight += paddingBottom;\n      }\n    }\n    return subtractHeight;\n  }\n\n  function getEl(element: any): Nullable<HTMLDivElement> {\n    if (element == null) {\n      return null;\n    }\n    return (element instanceof HTMLDivElement ? element : element.$el) as HTMLDivElement;\n  }\n\n  async function calcContentHeight() {\n    if (!flag.value) {\n      return;\n    }\n    // Add a delay to get the correct height\n    await nextTick();\n\n    const anchorEl = getEl(unref(anchorRef));\n    if (!anchorEl) {\n      return;\n    }\n    const { bottomIncludeBody } = getViewportOffset(anchorEl);\n\n    // substract elements height\n    let substractHeight = 0;\n    subtractHeightRefs.forEach((item) => {\n      substractHeight += getEl(unref(item))?.offsetHeight ?? 0;\n    });\n\n    // subtract margins / paddings\n    let substractSpaceHeight = calcSubtractSpace(anchorEl) ?? 0;\n    substractSpaceRefs.forEach((item) => {\n      substractSpaceHeight += calcSubtractSpace(getEl(unref(item)));\n    });\n\n    // upwardSpace\n    let upwardSpaceHeight = 0;\n    function upward(element: Element | null, upwardLvlOrClass: number | string | null | undefined) {\n      if (element && upwardLvlOrClass) {\n        const parent = element.parentElement;\n        if (parent) {\n          if (isString(upwardLvlOrClass)) {\n            if (!parent.classList.contains(upwardLvlOrClass)) {\n              upwardSpaceHeight += calcSubtractSpace(parent, 'bottom');\n              upward(parent, upwardLvlOrClass);\n            } else {\n              upwardSpaceHeight += calcSubtractSpace(parent, 'bottom');\n            }\n          } else if (isNumber(upwardLvlOrClass)) {\n            if (upwardLvlOrClass > 0) {\n              upwardSpaceHeight += calcSubtractSpace(parent, 'bottom');\n              upward(parent, --upwardLvlOrClass);\n            }\n          }\n        }\n      }\n    }\n    if (isRef(upwardSpace)) {\n      upward(anchorEl, unref(upwardSpace));\n    } else {\n      upward(anchorEl, upwardSpace);\n    }\n\n    let height =\n      bottomIncludeBody - unref(layoutFooterHeightRef) - unref(offsetHeightRef) - substractHeight - substractSpaceHeight - upwardSpaceHeight;\n\n    // compensation height\n    const calcCompensationHeight = () => {\n      compensationHeight.elements?.forEach((item) => {\n        height += getEl(unref(item))?.offsetHeight ?? 0;\n      });\n    };\n    if (compensationHeight.useLayoutFooter && unref(layoutFooterHeightRef) > 0) {\n      calcCompensationHeight();\n    } else {\n      calcCompensationHeight();\n    }\n\n    contentHeight.value = height;\n  }\n\n  onMountedOrActivated(() => {\n    nextTick(() => {\n      calcContentHeight();\n    });\n  });\n  useWindowSizeFn(\n    () => {\n      calcContentHeight();\n    },\n    50,\n    { immediate: true }\n  );\n  watch(\n    () => [layoutFooterHeightRef.value],\n    () => {\n      calcContentHeight();\n    },\n    {\n      flush: 'post',\n      immediate: true,\n    }\n  );\n\n  return { redoHeight, setCompensation, contentHeight };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useContextMenu.ts",
    "content": "import { onUnmounted, getCurrentInstance } from 'vue';\nimport { createContextMenu, destroyContextMenu } from '/@/components/ContextMenu';\nimport type { ContextMenuItem } from '/@/components/ContextMenu';\nexport type { ContextMenuItem };\nexport function useContextMenu(authRemove = true) {\n  if (getCurrentInstance() && authRemove) {\n    onUnmounted(() => {\n      destroyContextMenu();\n    });\n  }\n  return [createContextMenu, destroyContextMenu];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useCopyModal.ts",
    "content": "import { isRef, unref, watch, Ref, ComputedRef } from 'vue';\nimport Clipboard from 'clipboard';\nimport { ModalOptionsEx, useMessage } from '/@/hooks/web/useMessage';\n\n/** 带复制按钮的弹窗 */\ninterface IOptions extends ModalOptionsEx {\n  // 要复制的文本，可以是一个 ref 对象，动态更新\n  copyText: string | Ref<string> | ComputedRef<string>;\n}\n\nconst COPY_CLASS = 'copy-this-text';\nconst CLIPBOARD_TEXT = 'data-clipboard-text';\n\nexport function useCopyModal() {\n  return { createCopyModal };\n}\n\nconst { createMessage, createConfirm } = useMessage();\n\n/** 创建复制弹窗 */\nfunction createCopyModal(options: Partial<IOptions>) {\n  let modal = createConfirm({\n    ...options,\n    iconType: options.iconType ?? 'info',\n    width: options.width ?? 500,\n    title: options.title ?? '复制',\n    maskClosable: options.maskClosable ?? true,\n    okText: options.okText ?? '复制',\n    okButtonProps: {\n      ...options.okButtonProps,\n      class: COPY_CLASS,\n      [CLIPBOARD_TEXT]: unref(options.copyText),\n    } as any,\n    onOk() {\n      return new Promise((resolve: any) => {\n        const clipboard = new Clipboard('.' + COPY_CLASS);\n        clipboard.on('success', () => {\n          clipboard.destroy();\n          createMessage.success('复制成功');\n          resolve();\n        });\n        clipboard.on('error', () => {\n          createMessage.error('该浏览器不支持自动复制');\n          clipboard.destroy();\n          resolve();\n        });\n      });\n    },\n  });\n\n  // 动态更新 copyText\n  if (isRef(options.copyText)) {\n    watch(options.copyText, (copyText) => {\n      modal.update({\n        okButtonProps: {\n          ...options.okButtonProps,\n          class: COPY_CLASS,\n          [CLIPBOARD_TEXT]: copyText,\n        } as any,\n      });\n    });\n  }\n  return modal;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useCopyToClipboard.ts",
    "content": "import { ref, watch } from 'vue';\n\nimport { isDef } from '/@/utils/is';\ninterface Options {\n  target?: HTMLElement;\n}\nexport function useCopyToClipboard(initial?: string) {\n  const clipboardRef = ref(initial || '');\n  const isSuccessRef = ref(false);\n  const copiedRef = ref(false);\n\n  watch(\n    clipboardRef,\n    (str?: string) => {\n      if (isDef(str)) {\n        copiedRef.value = true;\n        isSuccessRef.value = copyTextToClipboard(str);\n      }\n    },\n    { immediate: !!initial, flush: 'sync' }\n  );\n\n  return { clipboardRef, isSuccessRef, copiedRef };\n}\n\nexport function copyTextToClipboard(input: string, { target = document.body }: Options = {}) {\n  const element = document.createElement('textarea');\n  const previouslyFocusedElement = document.activeElement;\n\n  element.value = input;\n\n  element.setAttribute('readonly', '');\n\n  (element.style as any).contain = 'strict';\n  element.style.position = 'absolute';\n  element.style.left = '-9999px';\n  element.style.fontSize = '12pt';\n\n  const selection = document.getSelection();\n  let originalRange;\n  if (selection && selection.rangeCount > 0) {\n    originalRange = selection.getRangeAt(0);\n  }\n\n  target.append(element);\n  element.select();\n\n  element.selectionStart = 0;\n  element.selectionEnd = input.length;\n\n  let isSuccess = false;\n  try {\n    isSuccess = document.execCommand('copy');\n  } catch (e) {\n    throw new Error(e);\n  }\n\n  element.remove();\n\n  if (originalRange && selection) {\n    selection.removeAllRanges();\n    selection.addRange(originalRange);\n  }\n\n  if (previouslyFocusedElement) {\n    (previouslyFocusedElement as HTMLElement).focus();\n  }\n  return isSuccess;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useDesign.ts",
    "content": "import { useAppProviderContext } from '/@/components/Application';\n// import { computed } from 'vue';\n// import { lowerFirst } from 'lodash-es';\nexport function useDesign(scope: string) {\n  const values = useAppProviderContext();\n  // const $style = cssModule ? useCssModule() : {};\n\n  // const style: Record<string, string> = {};\n  // if (cssModule) {\n  //   Object.keys($style).forEach((key) => {\n  //     // const moduleCls = $style[key];\n  //     const k = key.replace(new RegExp(`^${values.prefixCls}-?`, 'ig'), '');\n  //     style[lowerFirst(k)] = $style[key];\n  //   });\n  // }\n  return {\n    // prefixCls: computed(() => `${values.prefixCls}-${scope}`),\n    prefixCls: `${values.prefixCls}-${scope}`,\n    prefixVar: values.prefixCls,\n    // style,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useDragNotice.ts",
    "content": "import { ref, nextTick, getCurrentInstance, watch } from 'vue';\nimport { getToken } from '/@/utils/auth';\nimport md5 from 'crypto-js/md5';\nimport { connectWebSocket, onWebSocket } from '/@/hooks/web/useWebSocket';\nimport { useGlobSetting } from '/@/hooks/setting';\nimport { useModal } from '/@/components/Modal';\nimport { useUserStore } from '/@/store/modules/user';\nimport { isUrl } from '@/utils/is';\nimport { getQueryVariable, getUrlParams } from '@/utils';\nimport { useRouter } from 'vue-router';\nimport { useMessage } from '@/hooks/web/useMessage';\nconst { createMessage } = useMessage();\nexport function useDragNotice() {\n  //*********************************websocket配置begin******************************************\n  const glob = useGlobSetting();\n  const { push, currentRoute } = useRouter();\n  const userStore = useUserStore();\n  const instance: any = getCurrentInstance();\n  // 初始化 WebSocket\n  function initWebSocket() {\n    const token = getToken();\n    //将登录token生成一个短的标识\n    const wsClientId = md5(token);\n    // WebSocket与普通的请求所用协议有所不同，ws等同于http，wss等同于https\n    const url = glob.domainUrl?.replace('https://', 'wss://').replace('http://', 'ws://') + '/dragChannelSocket/' + wsClientId;\n    connectWebSocket(url);\n    onWebSocket(onWebSocketMessage);\n  }\n\n  async function onWebSocketMessage(data) {\n    console.log('仪表盘监听按钮点击事件websocket', data);\n    if (data?.CMD === 'drag') {\n      //触发动作： url：路径 modal：弹窗\n      const action = data.result.action;\n      //弹窗类型： 点击按钮打开什么弹窗，根据type打开不同的弹窗\n      const type = data.result.type;\n      //url地址，可以是路由，也可以是外部链接\n      let url = data.result.url;\n      //弹窗参数或者url参数\n      const record = data.result.records || {};\n      console.log('仪表盘监听点击事件类型type', type);\n      console.log('仪表盘监听点击事件动作action', action);\n      console.log('仪表盘监听点击事件路径url', url);\n      console.log('仪表盘监听点击事件参数', record);\n      //1.路径的话，判断外部链接还是内部路由跳转\n      if (action == 'url') {\n        //常用下載特殊处理\n        if (url == 'fileUrl') {\n          url = record[url];\n        }\n        const urlParamsObj = getUrlParams(url);\n        if (url.startsWith('http')) {\n          window.open(url, '_blank');\n        } else {\n          push({ path: urlParamsObj.url, query: { ...urlParamsObj.params, ...record } });\n        }\n      } else {\n        //2.弹窗方式打开项目组件\n        switch (type) {\n          case 'email':\n            //邮箱查看弹窗\n            handleOpenType('email', { record });\n            break;\n          default:\n            break;\n        }\n      }\n    }\n  }\n  //*********************************websocket配置end******************************************\n\n  //*********************************打开弹窗修改，动态设置弹窗begin*******************************\n  //当前表单弹窗\n  const currentModal = ref<string | null>(null);\n  //当前表单参数\n  const modalParams = ref<Recordable>({});\n  //表单注册缓存\n  const modalRegCache = ref<Recordable>({});\n  //组件绑定参数\n  const bindParams = ref<Recordable>({});\n  /**\n   * 根据类型打开不同弹窗\n   * @param type\n   * @param params\n   */\n  async function handleOpenType(type, params) {\n    currentModal.value = null;\n    modalParams.value = { ...params };\n    switch (type) {\n      case 'email':\n        //邮件查看\n        currentModal.value = 'EoaMailBoxInModal';\n        break;\n      default:\n        currentModal.value = null;\n        break;\n    }\n    //注册表单弹窗\n    initModalRegister();\n    await nextTick(() => {\n      if (modalRegCache.value[currentModal.value!]?.isRegister) {\n        console.log('已注冊，走缓存');\n        modalRegCache.value[currentModal.value!].modalMethods.openModal(true, modalParams.value);\n      }\n    });\n  }\n  /**\n   * 初始化弹窗注册\n   */\n  function initModalRegister() {\n    //如果当前选择表单为null，就不处理\n    if (!currentModal.value) {\n      return;\n    }\n    //判断缓存中是否存在，不存在就走缓存逻辑\n    if (!modalRegCache.value[currentModal.value]) {\n      const [registerModal, modalMethods] = useModal();\n      modalRegCache.value[currentModal.value] = {\n        isRegister: false,\n        register: bindRegisterModal(registerModal, modalMethods),\n        modalMethods,\n      };\n    }\n  }\n\n  /**\n   * 绑定注册弹窗\n   * @param regFn\n   * @param modalMethod\n   */\n  function bindRegisterModal(regFn, modalMethod) {\n    return async (...args) => {\n      console.log('开始注册：', currentModal.value);\n      await regFn(...args);\n      console.log('注册完成：', currentModal.value);\n      //打开弹窗\n      modalMethod.openModal(true, modalParams.value);\n      //设置缓存标识\n      modalRegCache.value[currentModal.value!].isRegister = true;\n    };\n  }\n  //*********************************打开弹窗修改，动态设置弹窗end******************************************\n  //刷新页面\n  function reloadPage() {\n    const iframes: any = document.getElementsByClassName('jeecg-iframe-page__main');\n    // 将 HTMLCollection 转换为数组\n    const iframeArray = Array.from(iframes);\n    if (currentRoute.value?.meta?.frameSrc && currentRoute.value?.meta?.frameSrc.indexOf('/drag/view?pageId=') >= 0) {\n      const targetIframe: any = iframeArray.find((iframe: any) => iframe.src == currentRoute.value?.meta?.frameSrc);\n      console.log('targetIframe', targetIframe);\n      if (targetIframe) {\n        targetIframe.contentWindow.postMessage({ reload: true }, '*');\n      }\n    }\n  }\n  return {\n    initDragWebSocket: initWebSocket,\n    handleOpenType,\n    currentModal,\n    modalParams,\n    modalRegCache,\n    bindParams,\n    reloadPage,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useECharts.ts",
    "content": "import type { EChartsOption } from 'echarts';\nimport type { Ref } from 'vue';\nimport { useTimeoutFn } from '/@/hooks/core/useTimeout';\nimport { tryOnUnmounted } from '@vueuse/core';\nimport { unref, nextTick, watch, computed, ref } from 'vue';\nimport { useDebounceFn } from '@vueuse/core';\nimport { useEventListener } from '/@/hooks/event/useEventListener';\nimport { useBreakpoint } from '/@/hooks/event/useBreakpoint';\nimport echarts from '/@/utils/lib/echarts';\nimport { useRootSetting } from '/@/hooks/setting/useRootSetting';\n\nexport function useECharts(elRef: Ref<HTMLDivElement>, theme: 'light' | 'dark' | 'default' = 'default') {\n  console.log(\"---useECharts---初始化加载---\")\n\n  const { getDarkMode: getSysDarkMode } = useRootSetting();\n\n  const getDarkMode = computed(() => {\n    return theme === 'default' ? getSysDarkMode.value : theme;\n  });\n  let chartInstance: echarts.ECharts | null = null;\n  let resizeFn: Fn = resize;\n  const cacheOptions = ref({}) as Ref<EChartsOption>;\n  let removeResizeFn: Fn = () => {};\n\n  resizeFn = useDebounceFn(resize, 200);\n\n  const getOptions = computed(() => {\n    if (getDarkMode.value !== 'dark') {\n      return cacheOptions.value as EChartsOption;\n    }\n    return {\n      backgroundColor: 'transparent',\n      ...cacheOptions.value,\n    } as EChartsOption;\n  });\n\n  function initCharts(t = theme) {\n    const el = unref(elRef);\n    if (!el || !unref(el)) {\n      return;\n    }\n\n    chartInstance = echarts.init(el, t);\n    const { removeEvent } = useEventListener({\n      el: window,\n      name: 'resize',\n      listener: resizeFn,\n    });\n    removeResizeFn = removeEvent;\n    const { widthRef, screenEnum } = useBreakpoint();\n    if (unref(widthRef) <= screenEnum.MD || el.offsetHeight === 0) {\n      useTimeoutFn(() => {\n        resizeFn();\n      }, 30);\n    }\n  }\n\n  function setOptions(options: EChartsOption, clear = true) {\n    cacheOptions.value = options;\n    if (unref(elRef)?.offsetHeight === 0) {\n      useTimeoutFn(() => {\n        setOptions(unref(getOptions));\n      }, 30);\n      return;\n    }\n    nextTick(() => {\n      useTimeoutFn(() => {\n        if (!chartInstance) {\n          initCharts(getDarkMode.value as 'default');\n\n          if (!chartInstance) return;\n        }\n        clear && chartInstance?.clear();\n\n        chartInstance?.setOption(unref(getOptions));\n      }, 30);\n    });\n  }\n\n  function resize() {\n    chartInstance?.resize();\n  }\n\n  watch(\n    () => getDarkMode.value,\n    (theme) => {\n      if (chartInstance) {\n        chartInstance.dispose();\n        initCharts(theme as 'default');\n        setOptions(cacheOptions.value);\n      }\n    }\n  );\n\n  tryOnUnmounted(() => {\n    if (!chartInstance) return;\n    removeResizeFn();\n    chartInstance.dispose();\n    chartInstance = null;\n  });\n\n  function getInstance(): echarts.ECharts | null {\n    if (!chartInstance) {\n      initCharts(getDarkMode.value as 'default');\n    }\n    return chartInstance;\n  }\n\n  return {\n    setOptions,\n    resize,\n    echarts,\n    getInstance,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useFullContent.ts",
    "content": "import { computed, unref } from 'vue';\n\nimport { useAppStore } from '/@/store/modules/app';\n\nimport { useRouter } from 'vue-router';\n\n/**\n * @description: Full screen display content\n */\nexport const useFullContent = () => {\n  const appStore = useAppStore();\n  const router = useRouter();\n  const { currentRoute } = router;\n\n  // Whether to display the content in full screen without displaying the menu\n  const getFullContent = computed(() => {\n    // Query parameters, the full screen is displayed when the address bar has a full parameter\n    const route = unref(currentRoute);\n    const query = route.query;\n    if (query && Reflect.has(query, '__full__')) {\n      return true;\n    }\n    // Return to the configuration in the configuration file\n    return appStore.getProjectConfig.fullContent;\n  });\n\n  return { getFullContent };\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useI18n.ts",
    "content": "import { i18n } from '/@/locales/setupI18n';\n\ntype I18nGlobalTranslation = {\n  (key: string): string;\n  (key: string, locale: string): string;\n  (key: string, locale: string, list: unknown[]): string;\n  (key: string, locale: string, named: Record<string, unknown>): string;\n  (key: string, list: unknown[]): string;\n  (key: string, named: Record<string, unknown>): string;\n};\n\ntype I18nTranslationRestParameters = [string, any];\n\nfunction getKey(namespace: string | undefined, key: string) {\n  if (!namespace) {\n    return key;\n  }\n  if (key.startsWith(namespace)) {\n    return key;\n  }\n  return `${namespace}.${key}`;\n}\n\nexport function useI18n(namespace?: string): {\n  t: I18nGlobalTranslation;\n} {\n  const normalFn = {\n    t: (key: string) => {\n      return getKey(namespace, key);\n    },\n  };\n\n  if (!i18n) {\n    return normalFn;\n  }\n\n  const { t, ...methods } = i18n.global;\n\n  const tFn: I18nGlobalTranslation = (key: string, ...arg: any[]) => {\n    if (!key) return '';\n    if (!key.includes('.') && !namespace) return key;\n    return t(getKey(namespace, key), ...(arg as I18nTranslationRestParameters));\n  };\n  return {\n    ...methods,\n    t: tFn,\n  };\n}\n\n// Why write this function？\n// Mainly to configure the vscode i18nn ally plugin. This function is only used for routing and menus. Please use useI18n for other places\n\n// 为什么要编写此函数？\n// 主要用于配合vscode i18nn ally插件。此功能仅用于路由和菜单。请在其他地方使用useI18n\nexport const t = (key: string) => key;\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useLockPage.ts",
    "content": "import { computed, onUnmounted, unref, watchEffect } from 'vue';\nimport { useThrottleFn } from '@vueuse/core';\n\nimport { useAppStore } from '/@/store/modules/app';\nimport { useLockStore } from '/@/store/modules/lock';\n\nimport { useUserStore } from '/@/store/modules/user';\nimport { useRootSetting } from '../setting/useRootSetting';\n\nexport function useLockPage() {\n  const { getLockTime } = useRootSetting();\n  const lockStore = useLockStore();\n  const userStore = useUserStore();\n  const appStore = useAppStore();\n\n  let timeId: TimeoutHandle;\n\n  function clear(): void {\n    window.clearTimeout(timeId);\n  }\n\n  function resetCalcLockTimeout(): void {\n    // not login\n    if (!userStore.getToken) {\n      clear();\n      return;\n    }\n    const lockTime = appStore.getProjectConfig.lockTime;\n    if (!lockTime || lockTime < 1) {\n      clear();\n      return;\n    }\n    clear();\n\n    timeId = setTimeout(() => {\n      lockPage();\n    }, lockTime * 60 * 1000);\n  }\n\n  function lockPage(): void {\n    lockStore.setLockInfo({\n      isLock: true,\n      pwd: undefined,\n    });\n  }\n\n  watchEffect((onClean) => {\n    if (userStore.getToken) {\n      resetCalcLockTimeout();\n    } else {\n      clear();\n    }\n    onClean(() => {\n      clear();\n    });\n  });\n\n  onUnmounted(() => {\n    clear();\n  });\n\n  const keyupFn = useThrottleFn(resetCalcLockTimeout, 2000);\n\n  return computed(() => {\n    if (unref(getLockTime)) {\n      return { onKeyup: keyupFn, onMousemove: keyupFn };\n    } else {\n      clear();\n      return {};\n    }\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useMessage.ts",
    "content": "import type { ModalFunc, ModalFuncProps } from 'ant-design-vue/lib/modal/Modal';\n\nimport { Modal, message as Message, notification } from 'ant-design-vue';\nimport { InfoCircleFilled, CheckCircleFilled, CloseCircleFilled } from '@ant-design/icons-vue';\n\nimport { NotificationArgsProps, ConfigProps } from 'ant-design-vue/lib/notification';\nimport { useI18n } from './useI18n';\nimport { isString } from '/@/utils/is';\nimport { h } from 'vue';\n\nexport interface NotifyApi {\n  info(config: NotificationArgsProps): void;\n  success(config: NotificationArgsProps): void;\n  error(config: NotificationArgsProps): void;\n  warn(config: NotificationArgsProps): void;\n  warning(config: NotificationArgsProps): void;\n  open(args: NotificationArgsProps): void;\n  close(key: String): void;\n  config(options: ConfigProps): void;\n  destroy(): void;\n}\n\nexport declare type NotificationPlacement = 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight';\nexport declare type IconType = 'success' | 'info' | 'error' | 'warning';\nexport interface ModalOptionsEx extends Omit<ModalFuncProps, 'iconType'> {\n  iconType: 'warning' | 'success' | 'error' | 'info';\n}\nexport type ModalOptionsPartial = Partial<ModalOptionsEx> & Pick<ModalOptionsEx, 'content'>;\n\ninterface ConfirmOptions {\n  info: ModalFunc;\n  success: ModalFunc;\n  error: ModalFunc;\n  warn: ModalFunc;\n  warning: ModalFunc;\n}\n\nfunction getIcon(iconType: string) {\n  try {\n    if (iconType === 'warning') {\n      return  h(InfoCircleFilled,{\"class\":\"modal-icon-warning\"})\n    } else if (iconType === 'success') {\n      return h(CheckCircleFilled,{\"class\": \"modal-icon-success\"});\n    } else if (iconType === 'info') {\n      return h(InfoCircleFilled,{\"class\": \"modal-icon-info\"});\n    } else {\n      return h(CloseCircleFilled,{\"class\":\"modal-icon-error\"});\n    }\n  } catch (e) {\n    console.log(e);\n  }\n}\n\nfunction renderContent({ content }: Pick<ModalOptionsEx, 'content'>) {\n  try {\n    if (isString(content)) {\n      return h('div', h('div', {'innerHTML':content as string}));\n    } else {\n      return content;\n    }\n  } catch (e) {\n    console.log(e);\n    return content;\n  }\n}\n\n/**\n * @description: Create confirmation box\n */\nfunction createConfirm(options: ModalOptionsEx): ReturnType<ModalFunc> {\n  const iconType = options.iconType || 'warning';\n  Reflect.deleteProperty(options, 'iconType');\n  const opt: ModalFuncProps = {\n    centered: true,\n    icon: getIcon(iconType),\n    ...options,\n    content: renderContent(options),\n  };\n  return Modal.confirm(opt);\n}\n\nconst getBaseOptions = () => {\n  const { t } = useI18n();\n  return {\n    okText: t('common.okText'),\n    centered: true,\n  };\n};\n\nfunction createModalOptions(options: ModalOptionsPartial, icon: string): ModalOptionsPartial {\n  // 代码逻辑说明: 可以自定义图标\n  let titleIcon:any = ''\n  if(options.icon){\n    titleIcon = options.icon;\n  }else{\n    titleIcon = getIcon(icon)\n  }\n  return {\n    ...getBaseOptions(),\n    ...options,\n    content: renderContent(options),\n    icon: titleIcon\n  };\n}\n\nfunction createSuccessModal(options: ModalOptionsPartial) {\n  return Modal.success(createModalOptions(options, 'success'));\n}\n\nfunction createErrorModal(options: ModalOptionsPartial) {\n  return Modal.error(createModalOptions(options, 'close'));\n}\n\nfunction createInfoModal(options: ModalOptionsPartial) {\n  return Modal.info(createModalOptions(options, 'info'));\n}\n\nfunction createWarningModal(options: ModalOptionsPartial) {\n  return Modal.warning(createModalOptions(options, 'warning'));\n}\n\ninterface MOE extends Omit<ModalOptionsEx, 'iconType'> {\n  iconType?: ModalOptionsEx['iconType'];\n}\n\n// 提示框，无需传入iconType，默认为warning\nfunction createConfirmSync(options: MOE) {\n  return new Promise((resolve) => {\n    createConfirm({\n      iconType: 'warning',\n      ...options,\n      onOk: () => resolve(true),\n      onCancel: () => resolve(false),\n    });\n  });\n}\n\nnotification.config({\n  placement: 'topRight',\n  duration: 3,\n});\n\n/**\n * @description: message\n */\nexport function useMessage() {\n  return {\n    createMessage: Message,\n    notification: notification as NotifyApi,\n    createConfirm: createConfirm,\n    createConfirmSync,\n    createSuccessModal,\n    createErrorModal,\n    createInfoModal,\n    createWarningModal,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useMessage.tsx_backup",
    "content": "import type { ModalFunc, ModalFuncProps } from 'ant-design-vue/lib/modal/Modal';\n\nimport { Modal, message as Message, notification } from 'ant-design-vue';\nimport { InfoCircleFilled, CheckCircleFilled, CloseCircleFilled } from '@ant-design/icons-vue';\n\nimport { NotificationArgsProps, ConfigProps } from 'ant-design-vue/lib/notification';\nimport { useI18n } from './useI18n';\nimport { isString } from '/@/utils/is';\n\nexport interface NotifyApi {\n  info(config: NotificationArgsProps): void;\n  success(config: NotificationArgsProps): void;\n  error(config: NotificationArgsProps): void;\n  warn(config: NotificationArgsProps): void;\n  warning(config: NotificationArgsProps): void;\n  open(args: NotificationArgsProps): void;\n  close(key: String): void;\n  config(options: ConfigProps): void;\n  destroy(): void;\n}\n\nexport declare type NotificationPlacement = 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight';\nexport declare type IconType = 'success' | 'info' | 'error' | 'warning';\nexport interface ModalOptionsEx extends Omit<ModalFuncProps, 'iconType'> {\n  iconType: 'warning' | 'success' | 'error' | 'info';\n}\nexport type ModalOptionsPartial = Partial<ModalOptionsEx> & Pick<ModalOptionsEx, 'content'>;\n\ninterface ConfirmOptions {\n  info: ModalFunc;\n  success: ModalFunc;\n  error: ModalFunc;\n  warn: ModalFunc;\n  warning: ModalFunc;\n}\n\nfunction getIcon(iconType: string) {\n  try {\n    if (iconType === 'warning') {\n      return <InfoCircleFilled class=\"modal-icon-warning\" />;\n    } else if (iconType === 'success') {\n      return <CheckCircleFilled class=\"modal-icon-success\" />;\n    } else if (iconType === 'info') {\n      return <InfoCircleFilled class=\"modal-icon-info\" />;\n    } else {\n      return <CloseCircleFilled class=\"modal-icon-error\" />;\n    }\n  } catch (e) {\n    console.log(e);\n  }\n}\n\nfunction renderContent({ content }: Pick<ModalOptionsEx, 'content'>) {\n  try {\n    if (isString(content)) {\n      return <div innerHTML={`<div>${content as string}</div>`}></div>;\n    } else {\n      return content;\n    }\n  } catch (e) {\n    console.log(e);\n    return content;\n  }\n}\n\n/**\n * @description: Create confirmation box\n */\nfunction createConfirm(options: ModalOptionsEx): ReturnType<ModalFunc> {\n  const iconType = options.iconType || 'warning';\n  Reflect.deleteProperty(options, 'iconType');\n  const opt: ModalFuncProps = {\n    centered: true,\n    icon: getIcon(iconType),\n    ...options,\n    content: renderContent(options),\n  };\n  return Modal.confirm(opt);\n}\n\nconst getBaseOptions = () => {\n  const { t } = useI18n();\n  return {\n    okText: t('common.okText'),\n    centered: true,\n  };\n};\n\nfunction createModalOptions(options: ModalOptionsPartial, icon: string): ModalOptionsPartial {\n  return {\n    ...getBaseOptions(),\n    ...options,\n    content: renderContent(options),\n    icon: getIcon(icon),\n  };\n}\n\nfunction createSuccessModal(options: ModalOptionsPartial) {\n  return Modal.success(createModalOptions(options, 'success'));\n}\n\nfunction createErrorModal(options: ModalOptionsPartial) {\n  return Modal.error(createModalOptions(options, 'close'));\n}\n\nfunction createInfoModal(options: ModalOptionsPartial) {\n  return Modal.info(createModalOptions(options, 'info'));\n}\n\nfunction createWarningModal(options: ModalOptionsPartial) {\n  return Modal.warning(createModalOptions(options, 'warning'));\n}\n\nnotification.config({\n  placement: 'topRight',\n  duration: 3,\n});\n\n/**\n * @description: message\n */\nexport function useMessage() {\n  return {\n    createMessage: Message,\n    notification: notification as NotifyApi,\n    createConfirm: createConfirm,\n    createSuccessModal,\n    createErrorModal,\n    createInfoModal,\n    createWarningModal,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/usePage.ts",
    "content": "import type { RouteLocationRaw, Router } from 'vue-router';\n\nimport { PageEnum } from '/@/enums/pageEnum';\nimport { isString } from '/@/utils/is';\nimport { unref } from 'vue';\n\nimport { useRouter } from 'vue-router';\nimport { REDIRECT_NAME } from '/@/router/constant';\nimport { useUserStore } from '/@/store/modules/user';\nimport { useMultipleTabStore } from '/@/store/modules/multipleTab';\n\nexport type RouteLocationRawEx = Omit<RouteLocationRaw, 'path'> & { path: PageEnum };\n\nfunction handleError(e: Error) {\n  console.error(e);\n}\n\n// page switch\nexport function useGo(_router?: Router) {\n  // 代码逻辑说明: 【issues/694】404返回首页问题\n  const userStore = useUserStore();\n  const homePath = userStore.getUserInfo.homePath || PageEnum.BASE_HOME;\n  let router;\n  if (!_router) {\n    router = useRouter();\n  }\n  const { push, replace } = _router || router;\n  function go(opt: PageEnum | RouteLocationRawEx | string = homePath, isReplace = false) {\n    if (!opt) {\n      return;\n    }\n    if (isString(opt)) {\n      isReplace ? replace(opt).catch(handleError) : push(opt).catch(handleError);\n    } else {\n      const o = opt as RouteLocationRaw;\n      isReplace ? replace(o).catch(handleError) : push(o).catch(handleError);\n    }\n  }\n  return go;\n}\n\n/**\n * @description: redo current page\n */\nexport const useRedo = (_router?: Router, otherQuery?: Recordable) => {\n  const { push, currentRoute } = _router || useRouter();\n  const { query, params = {}, name, fullPath } = unref(currentRoute.value);\n  function redo(): Promise<boolean> {\n    return new Promise((resolve) => {\n      if (name === REDIRECT_NAME) {\n        resolve(false);\n        return;\n      }\n      // 代码逻辑说明: 【QQYUN-7099】动态路由匹配右键重新加载404\n      const tabStore = useMultipleTabStore();\n      if (otherQuery && Object.keys(otherQuery).length > 0) {\n        Object.keys(otherQuery).forEach((key) => {\n          params[key] = otherQuery[key];\n        });\n      }\n      if (name && Object.keys(params).length > 0) {\n        tabStore.setRedirectPageParam({\n          redirect_type: 'name',\n          name: String(name),\n          params,\n          query,\n        });\n        params['path'] = String(name);\n      } else {\n        tabStore.setRedirectPageParam({\n          redirect_type: 'path',\n          path: fullPath,\n          query,\n        });\n        params['path'] = fullPath;\n      }\n      push({ name: REDIRECT_NAME, params, query }).then(() => resolve(true));\n    });\n  }\n  return redo;\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/usePagination.ts",
    "content": "import type { Ref } from 'vue';\nimport { ref, unref, computed } from 'vue';\n\nfunction pagination<T = any>(list: T[], pageNo: number, pageSize: number): T[] {\n  const offset = (pageNo - 1) * Number(pageSize);\n  const ret = offset + Number(pageSize) >= list.length ? list.slice(offset, list.length) : list.slice(offset, offset + Number(pageSize));\n  return ret;\n}\n\nexport function usePagination<T = any>(list: Ref<T[]>, pageSize: number) {\n  const currentPage = ref(1);\n  const pageSizeRef = ref(pageSize);\n\n  const getPaginationList = computed(() => {\n    return pagination(unref(list), unref(currentPage), unref(pageSizeRef));\n  });\n\n  const getTotal = computed(() => {\n    return unref(list).length;\n  });\n\n  function setCurrentPage(page: number) {\n    currentPage.value = page;\n  }\n\n  function setPageSize(pageSize: number) {\n    pageSizeRef.value = pageSize;\n  }\n\n  return { setCurrentPage, getTotal, setPageSize, getPaginationList };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/usePermission.ts",
    "content": "import type { RouteRecordRaw } from 'vue-router';\n\nimport { useAppStore } from '/@/store/modules/app';\nimport { usePermissionStore } from '/@/store/modules/permission';\nimport { useUserStore } from '/@/store/modules/user';\n\nimport { useTabs } from './useTabs';\n\nimport { router, resetRouter } from '/@/router';\n// import { RootRoute } from '/@/router/routes';\n\nimport projectSetting from '/@/settings/projectSetting';\nimport { PermissionModeEnum } from '/@/enums/appEnum';\nimport { RoleEnum } from '/@/enums/roleEnum';\n\nimport { intersection } from 'lodash-es';\nimport { isArray } from '/@/utils/is';\nimport { useMultipleTabStore } from '/@/store/modules/multipleTab';\n\n// User permissions related operations\nexport function usePermission() {\n  const userStore = useUserStore();\n  const appStore = useAppStore();\n  const permissionStore = usePermissionStore();\n  //动态加载流程节点表单权限\n  let formData: any = {};\n  function initBpmFormData(_bpmFormData) {\n    formData = _bpmFormData;\n  }\n  const { closeAll } = useTabs(router);\n\n  //==================================工作流权限判断-begin=========================================\n  function hasBpmPermission(code, type) {\n    // 禁用-type=2\n    // 显示-type=1\n    let codeList: string[] = [];\n    let permissionList = formData.permissionList;\n    if (permissionList && permissionList.length > 0) {\n      for (let item of permissionList) {\n        if (item.type == type) {\n          codeList.push(item.action);\n        }\n      }\n    }\n    return codeList.indexOf(code) >= 0;\n  }\n  //==================================工作流权限判断-end=========================================\n\n  /**\n   * Change permission mode\n   */\n  async function togglePermissionMode() {\n    appStore.setProjectConfig({\n      permissionMode: projectSetting.permissionMode === PermissionModeEnum.BACK ? PermissionModeEnum.ROUTE_MAPPING : PermissionModeEnum.BACK,\n    });\n    location.reload();\n  }\n\n  /**\n   * Reset and regain authority resource information\n   * @param id\n   */\n  async function resume() {\n    const tabStore = useMultipleTabStore();\n    tabStore.clearCacheTabs();\n    resetRouter();\n    const routes = await permissionStore.buildRoutesAction();\n    routes.forEach((route) => {\n      router.addRoute(route as unknown as RouteRecordRaw);\n    });\n    permissionStore.setLastBuildMenuTime();\n    closeAll();\n  }\n\n  /**\n   * 确定是否存在权限\n   */\n  function hasPermission(value?: RoleEnum | RoleEnum[] | string | string[], def = true): boolean {\n    // Visible by default\n    if (!value) {\n      return def;\n    }\n\n    const permMode = projectSetting.permissionMode;\n\n    if ([PermissionModeEnum.ROUTE_MAPPING, PermissionModeEnum.ROLE].includes(permMode)) {\n      if (!isArray(value)) {\n        return userStore.getRoleList?.includes(value as RoleEnum);\n      }\n      return (intersection(value, userStore.getRoleList) as RoleEnum[]).length > 0;\n    }\n\n    if (PermissionModeEnum.BACK === permMode) {\n      const allCodeList = permissionStore.getPermCodeList as string[];\n      if (!isArray(value) && allCodeList && allCodeList.length > 0) {\n        //=============================工作流权限判断-显示-begin==============================================\n        if (formData) {\n          let code = value as string;\n          if (hasBpmPermission(code, '1') === true) {\n            return true;\n          }\n        }\n        //=============================工作流权限判断-显示-end==============================================\n        return allCodeList.includes(value);\n      }\n      return (intersection(value, allCodeList) as string[]).length > 0;\n    }\n    return true;\n  }\n  /**\n   * 是否禁用组件\n   */\n  function isDisabledAuth(value?: RoleEnum | RoleEnum[] | string | string[], def = true): boolean {\n    //=============================工作流权限判断-禁用-begin==============================================\n    if (formData) {\n      let code = value as string;\n      if (hasBpmPermission(code, '2') === true) {\n        return true;\n      }\n      // 代码逻辑说明: VUEN-1342【流程】编码方式 节点权限配置好后，未生效\n      if (isCodingButNoConfig(code) == true) {\n        return false;\n      }\n    }\n    //=============================工作流权限判断-禁用-end==============================================\n    return !hasPermission(value);\n  }\n\n  /**\n   * Change roles\n   * @param roles\n   */\n  async function changeRole(roles: RoleEnum | RoleEnum[]): Promise<void> {\n    if (projectSetting.permissionMode !== PermissionModeEnum.ROUTE_MAPPING) {\n      throw new Error('Please switch PermissionModeEnum to ROUTE_MAPPING mode in the configuration to operate!');\n    }\n\n    if (!isArray(roles)) {\n      roles = [roles];\n    }\n    userStore.setRoleList(roles);\n    await resume();\n  }\n\n  /**\n   * refresh menu data\n   */\n  async function refreshMenu() {\n    resume();\n  }\n\n  /**\n   * 判断是不是 代码里写了逻辑但是没有配置权限这种情况\n   */\n  function isCodingButNoConfig(code) {\n    let all = permissionStore.allAuthList;\n    if (all && all instanceof Array) {\n      let temp = all.filter((item) => item.action == code);\n      if (temp && temp.length > 0) {\n        if (temp[0].status == '0') {\n          return true;\n        }\n      } else {\n        // 代码逻辑说明: 【TV360X-1604】按钮禁用权限在接口中查不到也禁用\n        return false;\n      }\n    }\n    return false;\n  }\n\n  return { changeRole, hasPermission, togglePermissionMode, refreshMenu, isDisabledAuth, initBpmFormData };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/usePrintJS.ts",
    "content": "import { nextTick } from 'vue';\nimport $printJS, { Configuration } from 'print-js';\nimport Print from 'vue-print-nb-jeecg/src/printarea';\n\n/**\n * 调用 printJS，如果type = html，就走 printNB 的方法\n */\nexport function printJS(configuration: Configuration) {\n  if (configuration?.type === 'html') {\n    printNb(configuration.printable);\n  } else {\n    return $printJS(configuration);\n  }\n}\n\n/** 调用 printNB 打印 */\nexport function printNb(domId) {\n  if (domId) {\n    localPrint(domId);\n  } else {\n    window.print();\n  }\n}\n\nlet closeBtn = true;\n\nfunction localPrint(domId) {\n  if (typeof domId === 'string' && !domId.startsWith('#')) {\n    domId = '#' + domId;\n  }\n  nextTick(() => {\n    if (closeBtn) {\n      closeBtn = false;\n      new Print({\n        el: domId,\n        endCallback() {\n          closeBtn = true;\n        },\n      });\n    }\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useScript.ts",
    "content": "import { onMounted, onUnmounted, ref } from 'vue';\n\ninterface ScriptOptions {\n  src: string;\n}\n\nexport function useScript(opts: ScriptOptions) {\n  // date-begin--author:liaozhiyang---date:20250716---for：【issues/8552】useScript的isLoading默认值应该是true\n  const isLoading = ref(true);\n  // date-end--author:liaozhiyang---date:20250716---for：【issues/8552】useScript的isLoading默认值应该是true\n  const error = ref(false);\n  const success = ref(false);\n  let script: HTMLScriptElement;\n\n  const promise = new Promise((resolve, reject) => {\n    onMounted(() => {\n      script = document.createElement('script');\n      script.type = 'text/javascript';\n      script.onload = function () {\n        isLoading.value = false;\n        success.value = true;\n        error.value = false;\n        resolve('');\n      };\n\n      script.onerror = function (err) {\n        isLoading.value = false;\n        success.value = false;\n        error.value = true;\n        reject(err);\n      };\n\n      script.src = opts.src;\n      document.head.appendChild(script);\n    });\n  });\n\n  onUnmounted(() => {\n    script && script.remove();\n  });\n\n  return {\n    isLoading,\n    error,\n    success,\n    toPromise: () => promise,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useSortable.ts",
    "content": "import { nextTick, unref } from 'vue';\nimport type { Ref } from 'vue';\nimport type { Options } from 'sortablejs';\n\nexport function useSortable(el: HTMLElement | Ref<HTMLElement>, options?: Options) {\n  function initSortable() {\n    nextTick(async () => {\n      if (!el) return;\n\n      const Sortable = (await import('sortablejs')).default;\n      Sortable.create(unref(el), {\n        animation: 500,\n        delay: 400,\n        delayOnTouchOnly: true,\n        ...options,\n      });\n    });\n  }\n\n  return { initSortable };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useSso.ts",
    "content": "// 单点登录核心类\nimport { getToken } from '/@/utils/auth';\nimport { getUrlParam } from '/@/utils';\nimport { useGlobSetting } from '/@/hooks/setting';\nimport { validateCasLogin } from '/@/api/sys/user';\nimport { useUserStore } from '/@/store/modules/user';\nconst globSetting = useGlobSetting();\nconst openSso = globSetting.openSso;\nexport function useSso() {\n  // 代码逻辑说明: 【QQYUN-7805】SSO登录强制用http #957---\n  let locationUrl = document.location.protocol +\"//\" + window.location.host + '/';\n\n  /**\n   * 单点登录\n   */\n  async function ssoLogin() {\n    if (openSso == 'true') {\n      let token = getToken();\n      let ticket = getUrlParam('ticket');\n      if (!token) {\n        if (ticket) {\n          await validateCasLogin({\n            ticket: ticket,\n            service: locationUrl,\n          }).then((res) => {\n            const userStore = useUserStore();\n            userStore.setToken(res.token);\n            return userStore.afterLoginAction(true, {});\n          });\n        } else {\n          window.location.href = globSetting.casBaseUrl + '/login?service=' + encodeURIComponent(locationUrl);\n        }\n      }\n    }\n  }\n\n  /**\n   * 退出登录\n   */\n  async function ssoLoginOut() {\n    window.location.href = globSetting.casBaseUrl + '/logout?service=' + encodeURIComponent(locationUrl);\n  }\n  return { ssoLogin, ssoLoginOut };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useTabs.ts",
    "content": "import type { RouteLocationNormalized, Router } from 'vue-router';\n\nimport { useRouter } from 'vue-router';\nimport { unref } from 'vue';\n\nimport { useMultipleTabStore } from '/@/store/modules/multipleTab';\nimport { useAppStore } from '/@/store/modules/app';\n\nenum TableActionEnum {\n  REFRESH,\n  CLOSE_ALL,\n  CLOSE_LEFT,\n  CLOSE_RIGHT,\n  CLOSE_OTHER,\n  CLOSE_CURRENT,\n  HOME_DESIGN,\n  CLOSE,\n}\n\nexport function useTabs(_router?: Router) {\n  const appStore = useAppStore();\n\n  function canIUseTabs(): boolean {\n    const { show } = appStore.getMultiTabsSetting;\n    if (!show) {\n      throw new Error('The multi-tab page is currently not open, please open it in the settings！');\n    }\n    return !!show;\n  }\n\n  const tabStore = useMultipleTabStore();\n  const router = _router || useRouter();\n\n  const { currentRoute } = router;\n\n  function getCurrentTab() {\n    const route = unref(currentRoute);\n    return tabStore.getTabList.find((item) => item.path === route.path)!;\n  }\n\n  async function updateTabTitle(title: string, tab?: RouteLocationNormalized) {\n    const canIUse = canIUseTabs;\n    if (!canIUse) {\n      return;\n    }\n    const targetTab = tab || getCurrentTab();\n    await tabStore.setTabTitle(title, targetTab);\n  }\n\n  async function updateTabPath(path: string, tab?: RouteLocationNormalized) {\n    const canIUse = canIUseTabs;\n    if (!canIUse) {\n      return;\n    }\n    const targetTab = tab || getCurrentTab();\n    await tabStore.updateTabPath(path, targetTab);\n  }\n\n  async function handleTabAction(action: TableActionEnum, tab?: RouteLocationNormalized) {\n    const canIUse = canIUseTabs;\n    if (!canIUse) {\n      return;\n    }\n    const currentTab = getCurrentTab();\n    switch (action) {\n      case TableActionEnum.REFRESH:\n        await tabStore.refreshPage(router);\n        break;\n\n      case TableActionEnum.HOME_DESIGN:\n        await tabStore.changeDesign(router);\n        break;\n\n      case TableActionEnum.CLOSE_ALL:\n        await tabStore.closeAllTab(router);\n        break;\n\n      case TableActionEnum.CLOSE_LEFT:\n        // 代码逻辑说明: 【TV360X-732】非当前页右键关闭左侧、关闭右侧、关闭其它功能正常使用\n        await tabStore.closeLeftTabs(tab || currentTab, router);\n        break;\n\n      case TableActionEnum.CLOSE_RIGHT:\n        await tabStore.closeRightTabs(tab || currentTab, router);\n        break;\n\n      case TableActionEnum.CLOSE_OTHER:\n        await tabStore.closeOtherTabs(tab || currentTab, router);\n        break;\n\n      case TableActionEnum.CLOSE_CURRENT:\n      case TableActionEnum.CLOSE:\n        await tabStore.closeTab(tab || currentTab, router);\n        break;\n    }\n  }\n\n  /**\n   * 关闭相同的路由\n   * @param path\n   */\n  function closeSameRoute(path) {\n    if(path.indexOf('?')>0){\n      path = path.split('?')[0];\n    }\n    let tab = tabStore.getTabList.find((item) => item.path.indexOf(path)>=0)!;\n    if(tab){\n      tabStore.closeTab(tab, router);\n    }\n  }\n\n  return {\n    refreshPage: () => handleTabAction(TableActionEnum.REFRESH),\n    changeDesign: () => handleTabAction(TableActionEnum.HOME_DESIGN),\n    // 代码逻辑说明: 【TV360X-732】非当前页右键关闭左侧、关闭右侧、关闭其它功能正常使用\n    closeAll: (tab) => handleTabAction(TableActionEnum.CLOSE_ALL, tab),\n    closeLeft: (tab) => handleTabAction(TableActionEnum.CLOSE_LEFT, tab),\n    closeRight: (tab) => handleTabAction(TableActionEnum.CLOSE_RIGHT, tab),\n    closeOther: (tab) => handleTabAction(TableActionEnum.CLOSE_OTHER, tab),\n    closeCurrent: () => handleTabAction(TableActionEnum.CLOSE_CURRENT),\n    close: (tab?: RouteLocationNormalized) => handleTabAction(TableActionEnum.CLOSE, tab),\n    setTitle: (title: string, tab?: RouteLocationNormalized) => updateTabTitle(title, tab),\n    updatePath: (fullPath: string, tab?: RouteLocationNormalized) => updateTabPath(fullPath, tab),\n    closeSameRoute\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useTitle.ts",
    "content": "import type {Menu} from \"@/router/types\";\nimport { ref, watch, unref } from 'vue';\nimport { useI18n } from '/@/hooks/web/useI18n';\nimport { useTitle as usePageTitle } from '@vueuse/core';\nimport { useGlobSetting } from '/@/hooks/setting';\nimport { useRouter } from 'vue-router';\nimport { useLocaleStore } from '/@/store/modules/locale';\nimport { REDIRECT_NAME } from '/@/router/constant';\nimport { getMenus } from '/@/router/menus';\n\n/**\n * Listening to page changes and dynamically changing site titles\n */\nexport function useTitle() {\n  const { title } = useGlobSetting();\n  const { t } = useI18n();\n  const { currentRoute } = useRouter();\n  const localeStore = useLocaleStore();\n\n  const pageTitle = usePageTitle();\n\n  const menus = ref<Menu[] | null>(null)\n\n  watch(\n    [() => currentRoute.value.path, () => localeStore.getLocale],\n    async () => {\n      const route = unref(currentRoute);\n\n      if (route.name === REDIRECT_NAME) {\n        return;\n      }\n      // 代码逻辑说明: 【QQYUN-6938】online菜单名字和页面title不一致\n      if (route.params && Object.keys(route.params).length) {\n        if (!menus.value) {\n          menus.value = await getMenus();\n        }\n        const getTitle = getMatchingRouterName(menus.value, route.fullPath);\n        let tTitle = '';\n        if (getTitle) {\n          tTitle = t(getTitle);\n        } else {\n          tTitle = t(route?.meta?.title as string);\n        }\n        pageTitle.value = tTitle ? ` ${tTitle} - ${title} ` : `${title}`;\n      } else {\n        const tTitle = t(route?.meta?.title as string);\n        pageTitle.value = tTitle ? ` ${tTitle} - ${title} ` : `${title}`;\n      }\n    },\n    { immediate: true }\n  );\n}\n/** \n 2023-11-09\n liaozhiyang\n 获取路由匹配模式的真实页面名字\n*/\nfunction getMatchingRouterName(menus, path) {\n  for (let i = 0, len = menus.length; i < len; i++) {\n    const item = menus[i];\n    if (item.path === path && !item.redirect && !item.paramPath) {\n      return item.meta?.title;\n    } else if (item.children?.length) {\n      const result = getMatchingRouterName(item.children, path);\n      if (result) {\n        return result;\n      }\n    }\n  }\n  return '';\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useWatermark.ts",
    "content": "import { getCurrentInstance, onBeforeUnmount, ref, Ref, shallowRef, unref } from 'vue';\nimport { useRafThrottle } from '/@/utils/domUtils';\nimport { addResizeListener, removeResizeListener } from '/@/utils/event';\nimport { isDef } from '/@/utils/is';\n\nconst domSymbol = Symbol('watermark-dom');\n\nexport function useWatermark(appendEl: Ref<HTMLElement | null> = ref(document.body) as Ref<HTMLElement>) {\n  const func = useRafThrottle(function () {\n    const el = unref(appendEl);\n    if (!el) return;\n    const { clientHeight: height, clientWidth: width } = el;\n    updateWatermark({ height, width });\n  });\n  const id = domSymbol.toString();\n  const watermarkEl = shallowRef<HTMLElement>();\n\n  const clear = () => {\n    const domId = unref(watermarkEl);\n    watermarkEl.value = undefined;\n    const el = unref(appendEl);\n    if (!el) return;\n    domId && el.removeChild(domId);\n    removeResizeListener(el, func);\n  };\n\n  function createBase64(str: string) {\n    const can = document.createElement('canvas');\n    const width = 300;\n    const height = 240;\n    Object.assign(can, { width, height });\n\n    const cans = can.getContext('2d');\n    if (cans) {\n      cans.rotate((-20 * Math.PI) / 120);\n      cans.font = '15px Vedana';\n      cans.fillStyle = 'rgba(0, 0, 0, 0.15)';\n      cans.textAlign = 'left';\n      cans.textBaseline = 'middle';\n      cans.fillText(str, width / 20, height);\n    }\n    return can.toDataURL('image/png');\n  }\n\n  function updateWatermark(\n    options: {\n      width?: number;\n      height?: number;\n      str?: string;\n    } = {}\n  ) {\n    const el = unref(watermarkEl);\n    if (!el) return;\n    if (isDef(options.width)) {\n      el.style.width = `${options.width}px`;\n    }\n    if (isDef(options.height)) {\n      el.style.height = `${options.height}px`;\n    }\n    if (isDef(options.str)) {\n      el.style.background = `url(${createBase64(options.str)}) left top repeat`;\n    }\n  }\n\n  const createWatermark = (str: string) => {\n    if (unref(watermarkEl)) {\n      updateWatermark({ str });\n      return id;\n    }\n    const div = document.createElement('div');\n    watermarkEl.value = div;\n    div.id = id;\n    div.style.pointerEvents = 'none';\n    div.style.top = '0px';\n    div.style.left = '0px';\n    div.style.position = 'absolute';\n    div.style.zIndex = '100000';\n    const el = unref(appendEl);\n    if (!el) return id;\n    const { clientHeight: height, clientWidth: width } = el;\n    updateWatermark({ str, width, height });\n    el.appendChild(div);\n    return id;\n  };\n\n  function setWatermark(str: string) {\n    createWatermark(str);\n    addResizeListener(document.documentElement, func);\n    const instance = getCurrentInstance();\n    if (instance) {\n      onBeforeUnmount(() => {\n        clear();\n      });\n    }\n  }\n\n  return { setWatermark, clear };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/hooks/web/useWebSocket.ts",
    "content": "// noinspection JSUnusedGlobalSymbols\n\nimport { unref } from 'vue';\nimport { useWebSocket, WebSocketResult } from '@vueuse/core';\nimport { getToken } from '/@/utils/auth';\n\nlet result: WebSocketResult<any>;\nconst listeners = new Map();\n\n/**\n * 开启 WebSocket 链接，全局只需执行一次\n * @param url\n */\nexport function connectWebSocket(url: string) {\n  // 代码逻辑说明: v2.4.6 的 websocket 服务端，存在性能和安全问题。 #3278\n  const token = (getToken() || '') as string;\n  result = useWebSocket(url, {\n    // 自动重连 (遇到错误最多重复连接10次)\n    autoReconnect: {\n      retries : 10,\n      delay : 5000\n    },\n    // 心跳检测\n    heartbeat: {\n      message: \"ping\",\n      interval: 55000\n    },\n    protocols: [token],\n    // 代码逻辑说明: [issues/6662] 演示系统socket总断，换一个写法\n    onConnected: function (ws) {\n      console.log('[WebSocket] 连接成功', ws);\n    },\n    onDisconnected: function (ws, event) {\n      console.log('[WebSocket] 连接断开：', ws, event);\n    },\n    onError: function (ws, event) {\n      console.log('[WebSocket] 连接发生错误: ', ws, event);\n    },\n    onMessage: function (_ws, e) {\n      console.debug('[WebSocket] -----接收消息-------', e.data);\n      try {\n        // 代码逻辑说明: 【issues/1161】前端websocket因心跳导致监听不起作用---\n        if (e.data === 'ping') {\n          return;\n        }\n        const data = JSON.parse(e.data);\n        for (const callback of listeners.keys()) {\n          try {\n            callback(data);\n          } catch (err) {\n            console.error(err);\n          }\n        }\n      } catch (err) {\n        console.error('[WebSocket] data解析失败：', err);\n      }\n    },\n  });\n  // if (result) {\n  //   result.open = onOpen;\n  //   result.close = onClose;\n\n  //   const ws = unref(result.ws);\n  //   if(ws!=null){\n  //     ws.onerror = onError;\n  //     ws.onmessage = onMessage;\n  //     ws.onopen = onOpen;\n  //     ws.onclose = onClose;\n  //     \n  //   }\n  // }\n}\n\nfunction onOpen() {\n  console.log('[WebSocket] 连接成功');\n}\n\nfunction onClose(e) {\n  console.log('[WebSocket] 连接断开：', e);\n}\n\nfunction onError(e) {\n  console.log('[WebSocket] 连接发生错误: ', e);\n}\n\nfunction onMessage(e) {\n  console.debug('[WebSocket] -----接收消息-------', e.data);\n  try {\n    // 代码逻辑说明: 【issues/1161】前端websocket因心跳导致监听不起作用---\n    if(e==='ping'){\n      return;\n    }\n    const data = JSON.parse(e.data);\n    for (const callback of listeners.keys()) {\n      try {\n        callback(data);\n      } catch (err) {\n        console.error(err);\n      }\n    }\n  } catch (err) {\n    console.error('[WebSocket] data解析失败：', err);\n  }\n}\n\n\n/**\n * 添加 WebSocket 消息监听\n * @param callback\n */\nexport function onWebSocket(callback: (data: object) => any) {\n  if (!listeners.has(callback)) {\n    if (typeof callback === 'function') {\n      listeners.set(callback, null);\n    } else {\n      console.debug('[WebSocket] 添加 WebSocket 消息监听失败：传入的参数不是一个方法');\n    }\n  }\n}\n\n/**\n * 解除 WebSocket 消息监听\n *\n * @param callback\n */\nexport function offWebSocket(callback: (data: object) => any) {\n  listeners.delete(callback);\n}\n\nexport function useMyWebSocket() {\n  return result;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/content/index.vue",
    "content": "<template>\n  <div :class=\"[prefixCls, getLayoutContentMode]\" v-loading=\"getOpenPageLoading && getPageLoading\">\n    <PageLayout />\n    <div id=\"content\" class=\"app-view-box\" v-if=\"openQianKun == 'true'\"></div>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, onMounted } from 'vue';\n  import PageLayout from '/@/layouts/page/index.vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useRootSetting } from '/@/hooks/setting/useRootSetting';\n  import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';\n  import { useContentViewHeight } from './useContentViewHeight';\n  // import registerApps from '/@/qiankun';\n  import { useGlobSetting } from '/@/hooks/setting';\n  export default defineComponent({\n    name: 'LayoutContent',\n    components: { PageLayout },\n    setup() {\n      const { prefixCls } = useDesign('layout-content');\n      const { getOpenPageLoading } = useTransitionSetting();\n      const { getLayoutContentMode, getPageLoading } = useRootSetting();\n      const globSetting = useGlobSetting();\n      const openQianKun = globSetting.openQianKun;\n      useContentViewHeight();\n      onMounted(() => {\n        // //注册openQianKun\n        // if (openQianKun == 'true') {\n        //   if (!window.qiankunStarted) {\n        //     window.qiankunStarted = true;\n        //     registerApps();\n        //   }\n        // }\n      });\n      return {\n        prefixCls,\n        openQianKun,\n        getOpenPageLoading,\n        getLayoutContentMode,\n        getPageLoading,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-layout-content';\n\n  .@{prefix-cls} {\n    position: relative;\n    flex: 1 1 auto;\n    min-height: 0;\n\n    &.fixed {\n      width: 1200px;\n      margin: 0 auto;\n    }\n\n    &-loading {\n      position: absolute;\n      top: 200px;\n      z-index: @page-loading-z-index;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/content/useContentContext.ts",
    "content": "import type { InjectionKey, ComputedRef } from 'vue';\nimport { createContext, useContext } from '/@/hooks/core/useContext';\n\nexport interface ContentContextProps {\n  contentHeight: ComputedRef<number>;\n  setPageHeight: (height: number) => Promise<void>;\n}\n\nconst key: InjectionKey<ContentContextProps> = Symbol();\n\nexport function createContentContext(context: ContentContextProps) {\n  return createContext<ContentContextProps>(context, key, { native: true });\n}\n\nexport function useContentContext() {\n  return useContext<ContentContextProps>(key);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/content/useContentViewHeight.ts",
    "content": "import { ref, computed, unref } from 'vue';\nimport { createPageContext } from '/@/hooks/component/usePageContext';\nimport { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn';\n\nconst headerHeightRef = ref(0);\nconst footerHeightRef = ref(0);\n\nexport function useLayoutHeight() {\n  function setHeaderHeight(val) {\n    headerHeightRef.value = val;\n  }\n  function setFooterHeight(val) {\n    footerHeightRef.value = val;\n  }\n  return { headerHeightRef, footerHeightRef, setHeaderHeight, setFooterHeight };\n}\n\nexport function useContentViewHeight() {\n  const contentHeight = ref(window.innerHeight);\n  const pageHeight = ref(window.innerHeight);\n  const getViewHeight = computed(() => {\n    return unref(contentHeight) - unref(headerHeightRef) - unref(footerHeightRef) || 0;\n  });\n\n  useWindowSizeFn(\n    () => {\n      contentHeight.value = window.innerHeight;\n    },\n    100,\n    { immediate: true }\n  );\n\n  async function setPageHeight(height: number) {\n    pageHeight.value = height;\n  }\n\n  createPageContext({\n    contentHeight: getViewHeight,\n    setPageHeight,\n    pageHeight,\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/feature/index.vue",
    "content": "<script lang=\"ts\">\n  import { defineComponent, computed, unref } from 'vue';\n  import { BackTop } from 'ant-design-vue';\n\n  import { useRootSetting } from '/@/hooks/setting/useRootSetting';\n  import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useUserStoreWithOut } from '/@/store/modules/user';\n\n  import { SettingButtonPositionEnum } from '/@/enums/appEnum';\n  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n\n  import SessionTimeoutLogin from '/@/views/sys/login/SessionTimeoutLogin.vue';\n  export default defineComponent({\n    name: 'LayoutFeatures',\n    components: {\n      BackTop,\n      LayoutLockPage: createAsyncComponent(() => import('/@/views/sys/lock/index.vue')),\n      SettingDrawer: createAsyncComponent(() => import('/@/layouts/default/setting/index.vue')),\n      SessionTimeoutLogin,\n    },\n    setup() {\n      const { getUseOpenBackTop, getShowSettingButton, getSettingButtonPosition, getFullContent } = useRootSetting();\n      const userStore = useUserStoreWithOut();\n      const { prefixCls } = useDesign('setting-drawer-fearure');\n      const { getShowHeader } = useHeaderSetting();\n\n      const getIsSessionTimeout = computed(() => userStore.getSessionTimeout);\n\n      const getIsFixedSettingDrawer = computed(() => {\n        if (!unref(getShowSettingButton)) {\n          return false;\n        }\n        const settingButtonPosition = unref(getSettingButtonPosition);\n\n        if (settingButtonPosition === SettingButtonPositionEnum.AUTO) {\n          return !unref(getShowHeader) || unref(getFullContent);\n        }\n        return settingButtonPosition === SettingButtonPositionEnum.FIXED;\n      });\n\n      return {\n        getTarget: () => document.body,\n        getUseOpenBackTop,\n        getIsFixedSettingDrawer,\n        prefixCls,\n        getIsSessionTimeout,\n      };\n    },\n  });\n</script>\n\n<template>\n  <LayoutLockPage />\n  <BackTop v-if=\"getUseOpenBackTop\" :target=\"getTarget\" />\n  <SettingDrawer v-if=\"getIsFixedSettingDrawer\" :class=\"prefixCls\" />\n  <SessionTimeoutLogin v-if=\"getIsSessionTimeout\" />\n</template>\n\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-setting-drawer-fearure';\n\n  .@{prefix-cls} {\n    position: absolute;\n    top: 45%;\n    right: 0;\n    z-index: 10;\n    display: flex;\n    padding: 10px;\n    color: @white;\n    cursor: pointer;\n    background-color: @primary-color;\n    border-radius: 6px 0 0 6px;\n    justify-content: center;\n    align-items: center;\n\n    svg {\n      width: 1em;\n      height: 1em;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/footer/index.vue",
    "content": "<template>\n  <Footer :class=\"prefixCls\" v-if=\"getShowLayoutFooter\" ref=\"footerRef\">\n    <div :class=\"`${prefixCls}__links`\">\n      <a @click=\"openWindow(SITE_URL)\">{{ t('layout.footer.onlinePreview') }}</a>\n\n      <GithubFilled @click=\"openWindow(GITHUB_URL)\" :class=\"`${prefixCls}__github`\" />\n\n      <a @click=\"openWindow(DOC_URL)\">{{ t('layout.footer.onlineDocument') }}</a>\n    </div>\n    <div>Copyright &copy;2021 JEECG开源社区 出品</div>\n  </Footer>\n</template>\n\n<script lang=\"ts\">\n  import { computed, defineComponent, unref, ref } from 'vue';\n  import { Layout } from 'ant-design-vue';\n\n  import { GithubFilled } from '@ant-design/icons-vue';\n\n  import { DOC_URL, GITHUB_URL, SITE_URL } from '/@/settings/siteSetting';\n  import { openWindow } from '/@/utils';\n\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useRootSetting } from '/@/hooks/setting/useRootSetting';\n  import { useRouter } from 'vue-router';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useLayoutHeight } from '../content/useContentViewHeight';\n  import { ThemeEnum } from '/@/enums/appEnum';\n\n  export default defineComponent({\n    name: 'LayoutFooter',\n    components: { Footer: Layout.Footer, GithubFilled },\n    setup() {\n      const { t } = useI18n();\n      const { getShowFooter } = useRootSetting();\n      const { currentRoute } = useRouter();\n      const { prefixCls } = useDesign('layout-footer');\n\n      const footerRef = ref<ComponentRef>(null);\n      const { setFooterHeight } = useLayoutHeight();\n      //当前主题\n      const { getDarkMode } = useRootSetting();\n      const isDark = computed(() => getDarkMode.value === ThemeEnum.DARK);\n\n      const getShowLayoutFooter = computed(() => {\n        if (unref(getShowFooter)) {\n          const footerEl = unref(footerRef)?.$el;\n          setFooterHeight(footerEl?.offsetHeight || 0);\n        } else {\n          setFooterHeight(0);\n        }\n        return unref(getShowFooter) && !unref(currentRoute).meta?.hiddenFooter;\n      });\n      //鼠标移入的颜色设置\n      const hoverColor = computed(() => {\n        return unref(isDark) ? 'rgba(255, 255, 255, 1)' : 'rgba(0, 0, 0, 0.85)';\n      });\n      return {\n        getShowLayoutFooter,\n        prefixCls,\n        t,\n        DOC_URL,\n        GITHUB_URL,\n        SITE_URL,\n        openWindow,\n        footerRef,\n        hoverColor,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-layout-footer';\n\n  @normal-color: rgba(0, 0, 0, 0.45);\n  // 代码逻辑说明: [issues/608] dark 模式下底部 footer 文字 hover 样式导致文字消失\n  @hover-color: v-bind(hoverColor);\n  .@{prefix-cls} {\n    color: @normal-color;\n    text-align: center;\n\n    &__links {\n      margin-bottom: 8px;\n\n      a {\n        color: @normal-color;\n\n        &:hover {\n          color: @hover-color;\n        }\n      }\n    }\n\n    &__github {\n      margin: 0 30px;\n\n      &:hover {\n        color: @hover-color;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/header/MultipleHeader.vue",
    "content": "<template>\n  <div :style=\"getPlaceholderDomStyle\" v-if=\"getIsShowPlaceholderDom\"></div>\n  <div :style=\"getWrapStyle\" :class=\"getClass\">\n    <LayoutHeader v-if=\"getShowHeader\" />\n    <MultipleTabs v-if=\"getShowTabs\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, unref, computed, CSSProperties } from 'vue';\n\n  import LayoutHeader from './index.vue';\n  import MultipleTabs from '../tabs/index.vue';\n\n  import { useAppStore } from \"@/store/modules/app\";\n  import { useGlobSetting } from \"/@/hooks/setting\";\n  import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';\n  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\n  import { useFullContent } from '/@/hooks/web/useFullContent';\n  import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';\n  import { useAppInject } from '/@/hooks/web/useAppInject';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useLayoutHeight } from '../content/useContentViewHeight';\n  import { TabsThemeEnum } from '/@/enums/appEnum';\n  import { MenuTypeEnum } from '/@/enums/menuEnum';\n\n  // 代码逻辑说明: 【QQYUN-8774】网站header区域加高\n  const HEADER_HEIGHT = 60;\n\n  // updateBy:sunjianlei---updateDate:2021-09-03---修改tab切换栏样式：更改高度\n  const TABS_HEIGHT = 32;\n  const TABS_HEIGHT_CARD = 50;\n  const TABS_HEIGHT_SMOOTH = 50;\n\n  export default defineComponent({\n    name: 'LayoutMultipleHeader',\n    components: { LayoutHeader, MultipleTabs },\n    setup() {\n      const { setHeaderHeight } = useLayoutHeight();\n      const { prefixCls } = useDesign('layout-multiple-header');\n\n      const appStore = useAppStore()\n      const glob = useGlobSetting()\n\n      const { getCalcContentWidth, getSplit, getMenuType } = useMenuSetting();\n      const { getIsMobile } = useAppInject();\n      const { getFixed, getShowInsetHeaderRef, getShowFullHeaderRef, getHeaderTheme } = useHeaderSetting();\n\n      const { getFullContent } = useFullContent();\n\n      const { getShowMultipleTab, getTabsTheme } = useMultipleTabSetting();\n\n      const getShowHeader = computed(() => {\n        // 控制是否显示顶部\n        if (appStore.getLayoutHideHeader) {\n          return false;\n        }\n        return unref(getShowInsetHeaderRef);\n      })\n\n      const getShowTabs = computed(() => {\n        // 控制是否显示多Tabs切换\n        if (appStore.getLayoutHideMultiTabs) {\n          return false;\n        }\n        return unref(getShowMultipleTab) && !unref(getFullContent);\n      });\n\n      const getIsShowPlaceholderDom = computed(() => {\n        return unref(getFixed) || unref(getShowFullHeaderRef);\n      });\n\n      const getWrapStyle = computed((): CSSProperties => {\n        const style: CSSProperties = {};\n        if (unref(getFixed) && !glob.isQiankunMicro) {\n          style.width = unref(getIsMobile) ? '100%' : unref(getCalcContentWidth);\n        }\n        if (unref(getShowFullHeaderRef)) {\n          style.top = `${HEADER_HEIGHT}px`;\n        }\n        return style;\n      });\n\n      const getIsFixed = computed(() => {\n        return unref(getFixed) || unref(getShowFullHeaderRef);\n      });\n\n      // updateBy:sunjianlei---updateDate:2021-09-08---根据主题的不同，动态计算tabs高度\n      const getTabsThemeHeight = computed(() => {\n        let tabsTheme = unref(getTabsTheme);\n        if (tabsTheme === TabsThemeEnum.CARD) {\n          return TABS_HEIGHT_CARD;\n        } else if (tabsTheme === TabsThemeEnum.SMOOTH) {\n          return TABS_HEIGHT_SMOOTH;\n        } else {\n          return TABS_HEIGHT;\n        }\n      });\n\n      const getPlaceholderDomStyle = computed((): CSSProperties => {\n        let height = 0;\n        // 代码逻辑说明: 【issues/7561】主题切换为顶部混合模式时，页面顶部内容显示不出来，被遮盖\n        if ((unref(getShowFullHeaderRef) || !unref(getSplit)) && unref(getShowHeader) && !unref(getFullContent) || unref(getMenuType) == MenuTypeEnum.MIX) {\n          height += HEADER_HEIGHT;\n        }\n        if (unref(getShowTabs) && !unref(getFullContent)) {\n          height += unref(getTabsThemeHeight);\n        }\n        setHeaderHeight(height);\n        return {\n          height: `${height}px`,\n        };\n      });\n\n      const getClass = computed(() => {\n        return [prefixCls, `${prefixCls}--${unref(getHeaderTheme)}`, {\n          [`${prefixCls}--fixed`]: unref(getIsFixed),\n          // 【JEECG作为乾坤子应用】\n          [`${prefixCls}--qiankun-micro`]: glob.isQiankunMicro,\n        }];\n      });\n\n      return {\n        glob,\n        getClass,\n        prefixCls,\n        getPlaceholderDomStyle,\n        getIsFixed,\n        getWrapStyle,\n        getIsShowPlaceholderDom,\n        getShowTabs,\n        getShowHeader,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-layout-multiple-header';\n\n  .@{prefix-cls} {\n    transition: width 0.2s;\n    flex: 0 0 auto;\n    // 代码逻辑说明: 【issues/8709】LayoutContent样式多出1px\n    // &--dark {\n    //   margin-left: -1px;\n    // }\n\n    &--fixed {\n      position: fixed;\n      top: 0;\n      z-index: @multiple-tab-fixed-z-index;\n      width: 100%;\n    }\n\n    // 【JEECG作为乾坤子应用】\n    &--qiankun-micro {\n      position: absolute;\n    }\n\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/header/components/Breadcrumb.vue",
    "content": "<template>\n  <div :class=\"[prefixCls, `${prefixCls}--${theme}`]\">\n    <a-breadcrumb :routes=\"routes\">\n      <template #itemRender=\"{ route, routes: routesMatched, paths }\">\n        <Icon :icon=\"getIcon(route)\" v-if=\"getShowBreadCrumbIcon && getIcon(route)\" />\n        <span v-if=\"!hasRedirect(routesMatched, route)\">\n          {{ t(route.name || route.meta.title) }}\n        </span>\n        <router-link v-else to=\"\" @click=\"handleClick(route, paths, $event)\" style=\"color: inherit\">\n          {{ t(route.name || route.meta.title) }}\n        </router-link>\n      </template>\n    </a-breadcrumb>\n  </div>\n</template>\n<script lang=\"ts\">\n  import type { RouteLocationMatched } from 'vue-router';\n  import { useRouter } from 'vue-router';\n  import type { Menu } from '/@/router/types';\n\n  import { defineComponent, ref, watchEffect } from 'vue';\n\n  import { Breadcrumb } from 'ant-design-vue';\n  import Icon from '/@/components/Icon';\n\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useRootSetting } from '/@/hooks/setting/useRootSetting';\n  import { useGo } from '/@/hooks/web/usePage';\n  import { useI18n } from '/@/hooks/web/useI18n';\n\n  import { propTypes } from '/@/utils/propTypes';\n  import { isString } from '/@/utils/is';\n  import { filter } from '/@/utils/helper/treeHelper';\n  import { getMenus } from '/@/router/menus';\n\n  import { REDIRECT_NAME } from '/@/router/constant';\n  import { getAllParentPath } from '/@/router/helper/menuHelper';\n\n  export default defineComponent({\n    name: 'LayoutBreadcrumb',\n    components: { Icon, [Breadcrumb.name]: Breadcrumb },\n    props: {\n      theme: propTypes.oneOf(['dark', 'light']),\n    },\n    setup() {\n      const routes = ref<RouteLocationMatched[]>([]);\n      const { currentRoute } = useRouter();\n      const { prefixCls } = useDesign('layout-breadcrumb');\n      const { getShowBreadCrumbIcon } = useRootSetting();\n      const go = useGo();\n\n      const { t } = useI18n();\n      watchEffect(async () => {\n        if (currentRoute.value.name === REDIRECT_NAME) return;\n        const menus = await getMenus();\n\n        const routeMatched = currentRoute.value.matched;\n        const cur = routeMatched?.[routeMatched.length - 1];\n        let path = currentRoute.value.path;\n\n        if (cur && cur?.meta?.currentActiveMenu) {\n          path = cur.meta.currentActiveMenu as string;\n        }\n\n        const parent = getAllParentPath(menus, path);\n        const filterMenus = menus.filter((item) => item.path === parent[0]);\n        const matched = getMatched(filterMenus, parent) as any;\n\n        if (!matched || matched.length === 0) return;\n\n        const breadcrumbList = filterItem(matched);\n\n        if (currentRoute.value.meta?.currentActiveMenu) {\n          breadcrumbList.push({\n            ...currentRoute.value,\n            name: currentRoute.value.meta?.title || currentRoute.value.name,\n          } as unknown as RouteLocationMatched);\n        }\n        routes.value = breadcrumbList;\n      });\n\n      function getMatched(menus: Menu[], parent: string[]) {\n        const metched: Menu[] = [];\n        menus.forEach((item) => {\n          if (parent.includes(item.path)) {\n            metched.push({\n              ...item,\n              name: item.meta?.title || item.name,\n            });\n          }\n          if (item.children?.length) {\n            metched.push(...getMatched(item.children, parent));\n          }\n        });\n        return metched;\n      }\n\n      function filterItem(list: RouteLocationMatched[]) {\n        return filter(list, (item) => {\n          const { meta, name } = item;\n          if (!meta) {\n            return !!name;\n          }\n          const { title, hideBreadcrumb } = meta;\n          if (!title || hideBreadcrumb) {\n            return false;\n          }\n          return true;\n        }).filter((item) => !item.meta?.hideBreadcrumb);\n      }\n\n      function handleClick(route: RouteLocationMatched, paths: string[], e: Event) {\n        e?.preventDefault();\n        const { children, redirect, meta } = route;\n\n        if (children?.length && !redirect) {\n          e?.stopPropagation();\n          return;\n        }\n        if (meta?.carryParam) {\n          return;\n        }\n\n        if (redirect && isString(redirect)) {\n          go(redirect);\n        } else {\n          let goPath = '';\n          if (paths.length === 1) {\n            goPath = paths[0];\n          } else {\n            const ps = paths.slice(1);\n            const lastPath = ps.pop() || '';\n            goPath = `${lastPath}`;\n          }\n          goPath = /^\\//.test(goPath) ? goPath : `/${goPath}`;\n          go(goPath);\n        }\n      }\n\n      function hasRedirect(routes: RouteLocationMatched[], route: RouteLocationMatched) {\n        return routes.indexOf(route) !== routes.length - 1;\n      }\n\n      function getIcon(route) {\n        return route.icon || route.meta?.icon;\n      }\n\n      return { routes, t, prefixCls, getIcon, getShowBreadCrumbIcon, handleClick, hasRedirect };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-layout-breadcrumb';\n\n  .@{prefix-cls} {\n    display: flex;\n    padding: 0 8px;\n    align-items: center;\n\n    .ant-breadcrumb-link {\n      .anticon {\n        margin-right: 4px;\n        margin-bottom: 2px;\n      }\n    }\n    // 代码逻辑说明: 【QQYUN-8922】面包屑样式调整\n    &--light {\n      .ant-breadcrumb-link {\n        color: rgba(0, 0, 0, 0.85);\n        a {\n          color: rgba(0, 0, 0, 0.85);\n\n          &:hover {\n            color: @primary-color;\n          }\n        }\n      }\n      .ant-breadcrumb-separator,\n      .anticon {\n        color: rgba(0, 0, 0, 0.85);\n      }\n    }\n  }\n  html[data-theme='dark'] {\n    .@{prefix-cls} {\n      &--dark {\n        .ant-breadcrumb-link {\n          color: rgba(255, 255, 255, 0.85);\n          a {\n            color: rgba(255, 255, 255, 0.85);\n            &:hover {\n              color: @white;\n            }\n          }\n        }\n        .ant-breadcrumb-separator,\n        .anticon {\n          color: rgba(255, 255, 255, 0.85);\n        }\n      }\n    }\n  }\n  html[data-theme='light'] {\n    .@{prefix-cls} {\n      &--dark {\n        .ant-breadcrumb-link {\n          color: rgba(255, 255, 255, 1);\n          a {\n            color: rgba(255, 255, 255, 1);\n            &:hover {\n              color: @white;\n            }\n          }\n        }\n        .ant-breadcrumb-separator,\n        .anticon {\n          color: rgba(255, 255, 255, 1);\n        }\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/header/components/ErrorAction.vue",
    "content": "<template>\n  <Tooltip :title=\"t('layout.header.tooltipErrorLog')\" placement=\"bottom\" :mouseEnterDelay=\"0.5\" @click=\"handleToErrorList\">\n    <Badge :count=\"getCount\" :offset=\"[0, 10]\" :overflowCount=\"99\">\n      <Icon icon=\"ion:bug-outline\" />\n    </Badge>\n  </Tooltip>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, computed } from 'vue';\n  import { Tooltip, Badge } from 'ant-design-vue';\n  import Icon from '/@/components/Icon';\n\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useErrorLogStore } from '/@/store/modules/errorLog';\n  import { PageEnum } from '/@/enums/pageEnum';\n\n  import { useRouter } from 'vue-router';\n\n  export default defineComponent({\n    name: 'ErrorAction',\n    components: { Icon, Tooltip, Badge },\n\n    setup() {\n      const { t } = useI18n();\n      const { push } = useRouter();\n      const errorLogStore = useErrorLogStore();\n\n      const getCount = computed(() => errorLogStore.getErrorLogListCount);\n\n      function handleToErrorList() {\n        push(PageEnum.ERROR_LOG_PAGE).then(() => {\n          errorLogStore.setErrorLogListCount(0);\n        });\n      }\n\n      return {\n        t,\n        getCount,\n        handleToErrorList,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/header/components/FullScreen.vue",
    "content": "<template>\n  <Tooltip :title=\"getTitle\" placement=\"bottom\" :mouseEnterDelay=\"0.5\">\n    <span @click=\"toggle\">\n      <FullscreenOutlined v-if=\"!isFullscreen\" />\n      <FullscreenExitOutlined v-else />\n    </span>\n  </Tooltip>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, computed, unref } from 'vue';\n  import { Tooltip } from 'ant-design-vue';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useFullscreen } from '@vueuse/core';\n\n  import { FullscreenExitOutlined, FullscreenOutlined } from '@ant-design/icons-vue';\n  export default defineComponent({\n    name: 'FullScreen',\n    components: { FullscreenExitOutlined, FullscreenOutlined, Tooltip },\n\n    setup() {\n      const { t } = useI18n();\n      const { toggle, isFullscreen } = useFullscreen();\n\n      const getTitle = computed(() => {\n        return unref(isFullscreen) ? t('layout.header.tooltipExitFull') : t('layout.header.tooltipEntryFull');\n      });\n\n      return {\n        getTitle,\n        isFullscreen,\n        toggle,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/header/components/LockScreen.vue",
    "content": "<template>\n  <Tooltip :title=\"t('layout.header.tooltipLock')\" placement=\"bottom\" :mouseEnterDelay=\"0.5\" @click=\"handleLock\">\n    <LockOutlined />\n  </Tooltip>\n  <LockModal ref=\"modalRef\" v-if=\"lockModalVisible\" @register=\"register\" />\n</template>\n<script lang=\"ts\">\n  import { defineComponent, computed, ref } from 'vue';\n  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n  import { Tooltip } from 'ant-design-vue';\n  import { LockOutlined } from '@ant-design/icons-vue';\n  import Icon from '/@/components/Icon';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useModal } from '/@/components/Modal';\n  import { getRefPromise } from '/@/utils/index';\n\n  export default defineComponent({\n    name: 'LockScreen',\n    inheritAttrs: false,\n    components: {\n      Icon,\n      Tooltip,\n      LockOutlined,\n      LockModal: createAsyncComponent(() => import('./lock/LockModal.vue')),\n    },\n    setup() {\n      const { t } = useI18n();\n      const [register, { openModal }] = useModal();\n      // 代码逻辑说明: 【QQYUN-6333】空路由问题—首次访问资源太大\n      const lockModalVisible = ref(false);\n      const modalRef = ref(null);\n      async function handleLock() {\n        lockModalVisible.value = true;\n        await getRefPromise(modalRef);\n        openModal(true);\n      }\n      return {\n        t,\n        register,\n        handleLock,\n        lockModalVisible,\n        modalRef,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/header/components/index.ts",
    "content": "import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\nimport FullScreen from './FullScreen.vue';\n\nexport const UserDropDown = createAsyncComponent(() => import('./user-dropdown/index.vue'), {\n  loading: true,\n});\n\nexport const LayoutBreadcrumb = createAsyncComponent(() => import('./Breadcrumb.vue'));\n\nexport const Notify = createAsyncComponent(() => import('./notify/index.vue'));\n\nexport const ErrorAction = createAsyncComponent(() => import('./ErrorAction.vue'));\n\nexport const LockScreen = createAsyncComponent(() => import('./LockScreen.vue'));\n\nexport { FullScreen };\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/header/components/lock/LockModal.vue",
    "content": "<template>\n  <BasicModal :footer=\"null\" :title=\"t('layout.header.lockScreen')\" v-bind=\"$attrs\" :class=\"prefixCls\" @register=\"register\" :canFullscreen=\"false\">\n    <div :class=\"`${prefixCls}__entry`\">\n      <div :class=\"`${prefixCls}__header`\">\n        <img :src=\"avatar\" :class=\"`${prefixCls}__header-img`\" />\n        <p :class=\"`${prefixCls}__header-name`\">\n          {{ getRealName }}\n        </p>\n      </div>\n\n      <BasicForm @register=\"registerForm\" />\n\n      <div :class=\"`${prefixCls}__footer`\">\n        <a-button type=\"primary\" block class=\"mt-2\" @click=\"handleLock\">\n          {{ t('layout.header.lockScreenBtn') }}\n        </a-button>\n      </div>\n    </div>\n  </BasicModal>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, computed } from 'vue';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { BasicModal, useModalInner } from '/@/components/Modal/index';\n  import BasicForm from '/@/components/Form/src/BasicForm.vue';\n  import { useForm } from '/@/components/Form/src/hooks/useForm';\n\n  import { useUserStore } from '/@/store/modules/user';\n  import { useLockStore } from '/@/store/modules/lock';\n  import headerImg from '/@/assets/images/header.jpg';\n  export default defineComponent({\n    name: 'LockModal',\n    components: { BasicModal, BasicForm },\n\n    setup() {\n      const { t } = useI18n();\n      const { prefixCls } = useDesign('header-lock-modal');\n      const userStore = useUserStore();\n      const lockStore = useLockStore();\n\n      const getRealName = computed(() => userStore.getUserInfo?.realname);\n      const [register, { closeModal }] = useModalInner();\n\n      const [registerForm, { validateFields, resetFields }] = useForm({\n        // 代码逻辑说明: 【QQYUN-8895】锁屏样式修改---\n        labelWidth: 74,\n        labelAlign:'left',\n        wrapperCol:{},\n        showActionButtonGroup: false,\n        schemas: [\n          {\n            field: 'password',\n            label: t('layout.header.lockScreenPassword'),\n            component: 'InputPassword',\n            componentProps: {\n              autocomplete: \"new-password\",\n            },\n          },\n        ],\n      });\n\n      async function handleLock() {\n        const values = (await validateFields()) as any;\n        const password: string | undefined = values.password;\n        closeModal();\n\n        lockStore.setLockInfo({\n          isLock: true,\n          pwd: password,\n        });\n        await resetFields();\n      }\n\n      const avatar = computed(() => {\n        const { avatar } = userStore.getUserInfo;\n        return avatar || headerImg;\n      });\n\n      return {\n        t,\n        prefixCls,\n        getRealName,\n        register,\n        registerForm,\n        handleLock,\n        avatar,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-header-lock-modal';\n\n  .@{prefix-cls} {\n    &__entry {\n      position: relative;\n      //height: 240px;\n      padding: 130px 30px 30px 30px;\n      border-radius: 10px;\n    }\n\n    &__header {\n      position: absolute;\n      top: 0;\n      left: calc(50% - 45px);\n      width: auto;\n      text-align: center;\n\n      &-img {\n        width: 70px;\n        border-radius: 50%;\n      }\n\n      &-name {\n        margin-top: 5px;\n      }\n    }\n\n    &__footer {\n      text-align: center;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/header/components/notify/ChangePasswordModal.vue",
    "content": "<template>\n  <BasicModal\n    v-bind=\"$attrs\"\n    @register=\"registerModal\"\n    :title=\"getTitle\"\n    :width=\"500\"\n    @ok=\"handleSubmit\"\n    :keyboard=\"false\"\n    :maskClosable=\"false\"\n    :closable=\"false\"\n    :bodyStyle=\"{ padding: '10px 20px 20px 20px' }\"\n    :ok-button-props=\"{ loading: confirmLoading }\"\n    :cancel-button-props=\"{ style: { display: 'none' } }\"\n    destroyOnClose\n  >\n    <div>\n      <span class=\"pwd-topbar\">您当前密码和系统密码一致，请修改密码！</span>\n      <BasicForm @register=\"registerForm\" />\n    </div>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, computed, } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { rules } from '@/utils/helper/validator';\n  import { defHttp } from '@/utils/http/axios';\n  import { useUserStore } from '@/store/modules/user';\n\n  const emit = defineEmits(['success', 'register']);\n\n  const { t } = useI18n();\n  const { createMessage } = useMessage();\n  const confirmLoading = ref(false);\n  const oldPassword = ref('');\n\n  // 判断密码是否为连续的数字或字母\n  function lxStr (password) {\n    let arr = password.split('');\n    let flag = true;\n    for (let i = 1; i < arr.length - 1; i++) {\n      let firstIndex = arr[i - 1].charCodeAt();\n      let secondIndex = arr[i].charCodeAt();\n      let thirdIndex = arr[i + 1].charCodeAt();\n      thirdIndex - secondIndex == 1;\n      secondIndex - firstIndex == 1;\n      if ((thirdIndex - secondIndex === 1) && (secondIndex - firstIndex === 1)) {\n        flag = false;\n      }\n    }\n    if (!flag) {\n      return flag\n    }\n    return flag\n  }\n  \n  // 表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n    labelWidth: 100,\n    schemas: [\n      {\n        label: t('layout.changePassword.newPassword'),\n        field: 'password',\n        component: 'StrengthMeter',\n        componentProps: {\n          placeholder: t('layout.changePassword.pleaseEnterNewPassword'),\n        },\n        rules: [\n          {\n            required: true,\n            message: t('layout.changePassword.pleaseEnterNewPassword'),\n          },\n          {\n            validator:(_, value)=>{\n              if(!value){\n                return Promise.resolve();\n              }\n              //不能使用系统密码作为新密码\n              if(value === oldPassword.value){\n                return Promise.reject('不能使用系统密码作为新密码!');\n              }\n              //密码由8位数字、大小写字母和特殊符号组成\n              let reg = /^(?=.*[a-zA-Z])(?=.*\\d)(?=.*[~!@#$%^&*()_+`\\-={}:\";'<>?,./]).{8,}$/;\n              if(!reg.test(value)){\n                return Promise.reject('密码由 8 位及以上数字、大小写字母和特殊符号组成！');\n              }\n              return Promise.resolve();\n            }\n          },\n          /* {\n             // 使用一个函数来自定义验证逻辑，客户使用这个\n             validator: (_, value) => {\n               // 如果密码为空，直接返回 resolve() 让 required 规则去处理\n               if (!value) {\n                 return Promise.resolve();\n               }\n               //不能使用系统密码作为新密码\n               if(value === oldPassword.value){\n                 return Promise.reject('不能使用系统密码作为新密码!');\n               }\n               // 1. 长度不低于8位\n               if (value.length < 8) {\n                 return Promise.reject('密码长度不能少于8位');\n               }\n               // 2. 必须包含数字、字母大小写、特殊字符\n               // 使用正则表达式进行匹配\n               const hasNumber = /[0-9]/.test(value);\n               const hasLowercase = /[a-z]/.test(value);\n               const hasUppercase = /[A-Z]/.test(value);\n               const hasSpecialChar = /[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?~`]/.test(value);\n               if (!(hasNumber && hasLowercase && hasUppercase && hasSpecialChar)) {\n                 return Promise.reject('密码必须包含数字、大小写字母和特殊字符');\n               }\n               if(!lxStr(value)){\n                 return Promise.reject('密码不能出现3位及3为以上的数字或字母');\n               }\n               //不能相同字符（如111、aaa）连续3位或3位以上\n               const reg2 = /(\\w)*(\\w)\\2{2}(\\w)*!/g\n               if (reg2.test(value)) {\n                 console.log('密码不能出现相同字符连续3位或3位以上')\n                 return false\n               }\n               // 如果所有规则都通过，返回 resolve()\n               return Promise.resolve();\n             }\n           }*/\n        ],\n      },\n      {\n        label: t('layout.changePassword.confirmNewPassword'),\n        field: 'confirmpassword',\n        component: 'InputPassword',\n        dynamicRules: ({ values }) => rules.confirmPassword(values, true),\n      },\n    ],\n    showActionButtonGroup: false,\n    actionColOptions: {\n      span: 24,\n    },\n  });\n\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    resetFields();\n    setModalProps({ confirmLoading: false });\n    oldPassword.value = decodeURIComponent(data.oldPassword)\n  });\n\n  const getTitle = computed(() => '修改密码');\n  const userStore = useUserStore();\n  const { createMessage: $message } = useMessage();\n\n  \n  \n  // 提交处理\n  async function handleSubmit() {\n    try {\n      const values = await validate();\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      let params = Object.assign({ username: userStore.getUserInfo.username, oldpassword: oldPassword.value }, values);\n      defHttp.put({ url: '/sys/user/updatePassword', params }, { isTransformResponse: false }).then((res) => {\n        if (res.success) {\n            $message.info({\n              content:'密码修改成功，请重新登录！2s后自动退出登录',\n              duration: 2\n            })\n            //3s后返回登录页面\n            setTimeout(()=>{\n              userStore.logout(true);\n            },2000)\n            //关闭弹窗\n            closeModal();\n          //关闭弹窗\n          closeModal();\n        } else {\n          $message.warning(res.message);\n        }\n      });\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n\n<style lang=\"less\" scoped>\n  :deep(.ant-form-item) {\n    margin-bottom: 20px;\n  }\n  .pwd-topbar{\n    width: 400px;\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    padding: 8px 12px;\n    background: linear-gradient(90deg, #fff7e6, #fff1b8);\n    border: 1px solid #ffd591;\n    border-left: 0;\n    border-right: 0;\n    color: #ad6800;\n    position: relative;\n    margin-bottom: 10px;\n    left: 36px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/header/components/notify/NoticeList.vue",
    "content": "<template>\n  <a-list :class=\"prefixCls\" :pagination=\"getPagination\">\n    <template v-for=\"item in getData\" :key=\"item.id\">\n      <a-list-item class=\"list-item\" @click=\"handleTitleClick(item)\" :style=\"{ cursor: isTitleClickable ? 'pointer' : '' }\">\n        <a-list-item-meta>\n          <template #title>\n            <div class=\"title\">\n              <a-typography-paragraph\n                style=\"width: 100%; margin-bottom: 0 !important\"\n                :delete=\"!!item.titleDelete\"\n                :ellipsis=\"$props.titleRows && $props.titleRows > 0 ? { rows: $props.titleRows, tooltip: !!item.title } : false\"\n                :content=\"item.title\"\n              />\n              <div class=\"extra\" v-if=\"item.extra\">\n                <a-tag class=\"tag\" :color=\"item.color\">\n                  {{ item.extra }}\n                </a-tag>\n              </div>\n            </div>\n          </template>\n\n          <template #avatar>\n            <a-avatar v-if=\"item.avatar\" class=\"avatar\" :src=\"item.avatar\" />\n            <template v-else-if=\"item.priority\">\n              <a-avatar v-if=\"item.priority === PriorityTypes.L\" class=\"avatar priority-L\" title=\"一般消息\">\n                <template #icon>\n                  <Icon icon=\"entypo:info\" />\n                </template>\n              </a-avatar>\n              <a-avatar v-if=\"item.priority === PriorityTypes.M\" class=\"avatar priority-M\" title=\"重要消息\">\n                <template #icon>\n                  <Icon icon=\"bi:exclamation-lg\" />\n                </template>\n              </a-avatar>\n              <a-avatar v-if=\"item.priority === PriorityTypes.H\" class=\"avatar priority-H\" title=\"紧急消息\">\n                <template #icon>\n                  <Icon icon=\"ant-design:warning-filled\" />\n                </template>\n              </a-avatar>\n            </template>\n            <span v-else> {{ item.avatar }}</span>\n          </template>\n\n          <template #description>\n            <div>\n              <div class=\"description\" v-if=\"item.description\">\n                <a-typography-paragraph\n                  style=\"width: 100%; margin-bottom: 0 !important\"\n                  :ellipsis=\"$props.descRows && $props.descRows > 0 ? { rows: $props.descRows, tooltip: !!item.description } : false\"\n                  :content=\"item.description\"\n                />\n              </div>\n              <div class=\"datetime\">\n                <Time :value=\"item.datetime\" :title=\"item.datetime\" />\n              </div>\n            </div>\n          </template>\n        </a-list-item-meta>\n      </a-list-item>\n    </template>\n  </a-list>\n</template>\n<script lang=\"ts\">\n  import { computed, defineComponent, PropType, ref, watch, unref } from 'vue';\n  import { PriorityTypes, ListItem } from './data';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { List, Avatar, Tag, Typography } from 'ant-design-vue';\n  import { Time } from '/@/components/Time';\n  import { isNumber } from '/@/utils/is';\n  export default defineComponent({\n    components: {\n      [Avatar.name]: Avatar,\n      [List.name]: List,\n      [List.Item.name]: List.Item,\n      AListItemMeta: List.Item.Meta,\n      ATypographyParagraph: Typography.Paragraph,\n      [Tag.name]: Tag,\n      Time,\n    },\n    props: {\n      list: {\n        type: Array as PropType<ListItem[]>,\n        default: () => [],\n      },\n      pageSize: {\n        type: [Boolean, Number] as PropType<Boolean | Number>,\n        default: 5,\n      },\n      currentPage: {\n        type: Number,\n        default: 1,\n      },\n      titleRows: {\n        type: Number,\n        default: 1,\n      },\n      descRows: {\n        type: Number,\n        default: 1,\n      },\n      onTitleClick: {\n        type: Function as PropType<(Recordable) => void>,\n      },\n    },\n    emits: ['update:currentPage'],\n    setup(props, { emit }) {\n      const { prefixCls } = useDesign('header-notify-list');\n      const current = ref(props.currentPage || 1);\n      const getData = computed(() => {\n        const { pageSize, list } = props;\n        if (pageSize === false) return [];\n        let size = isNumber(pageSize) ? pageSize : 5;\n        return list.slice(size * (unref(current) - 1), size * unref(current));\n      });\n      watch(\n        () => props.currentPage,\n        (v) => {\n          current.value = v;\n        }\n      );\n      const isTitleClickable = computed(() => !!props.onTitleClick);\n      const getPagination = computed(() => {\n        const { list, pageSize } = props;\n        if (pageSize > 0 && list && list.length > pageSize) {\n          return {\n            total: list.length,\n            pageSize,\n            //size: 'small',\n            current: unref(current),\n            onChange(page) {\n              current.value = page;\n              emit('update:currentPage', page);\n            },\n          };\n        } else {\n          return false;\n        }\n      });\n\n      function handleTitleClick(item: ListItem) {\n        props.onTitleClick && props.onTitleClick(item);\n      }\n\n      return {\n        prefixCls,\n        getPagination,\n        getData,\n        handleTitleClick,\n        isTitleClickable,\n        PriorityTypes,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-header-notify-list';\n\n  .@{prefix-cls} {\n    width: 340px;\n\n    &::-webkit-scrollbar {\n      display: none;\n    }\n\n    :deep(.ant-pagination-disabled) {\n      display: inline-block !important;\n    }\n\n    &-item {\n      padding: 6px;\n      overflow: hidden;\n      cursor: pointer;\n      transition: all 0.3s;\n\n      .title {\n        margin-bottom: 8px;\n        font-weight: normal;\n\n        .extra {\n          float: right;\n          margin-top: -1.5px;\n          margin-right: 0;\n          font-weight: normal;\n\n          .tag {\n            margin-right: 0;\n          }\n        }\n\n        .avatar {\n          margin-top: 4px;\n        }\n\n        .description {\n          font-size: 12px;\n          line-height: 18px;\n        }\n\n        .datetime {\n          margin-top: 4px;\n          font-size: 12px;\n          line-height: 18px;\n        }\n      }\n    }\n\n    .list-item {\n      .priority-L,\n      .priority-M,\n      .priority-H {\n        font-size: 12px;\n      }\n\n      .priority-L {\n        background-color: #7cd1ff;\n      }\n\n      .priority-M {\n        background-color: #ffa743;\n      }\n\n      .priority-H {\n        background-color: #f8766c;\n      }\n\n      .description {\n        font-size: 12px;\n        line-height: 18px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/header/components/notify/data.ts",
    "content": "export interface ListItem {\n  id: string;\n  avatar: string;\n  // 通知的标题内容\n  title: string;\n  // 是否在标题上显示删除线\n  titleDelete?: boolean;\n  datetime: string;\n  type: string;\n  read?: boolean;\n  description: string;\n  clickClose?: boolean;\n  extra?: string;\n  color?: string;\n  // 优先级\n  priority?: string;\n}\n\nexport enum PriorityTypes {\n  // 低优先级，一般消息\n  L = 'L',\n  // 中优先级，重要消息\n  M = 'M',\n  // 高优先级，紧急消息\n  H = 'H',\n}\n\nexport interface TabItem {\n  key: string;\n  name: string;\n  list: ListItem[];\n  unreadlist?: ListItem[];\n  count: number;\n}\n\nexport const tabListData: TabItem[] = [\n  {\n    key: '1',\n    name: '通知',\n    list: [\n      {\n        id: '000000001',\n        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',\n        title: '你收到了 14 份新周报',\n        description: '',\n        datetime: '2017-08-09',\n        type: '1',\n      },\n      {\n        id: '000000002',\n        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png',\n        title: '你推荐的 曲妮妮 已通过第三轮面试',\n        description: '',\n        datetime: '2017-08-08',\n        type: '1',\n      },\n      {\n        id: '000000003',\n        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png',\n        title: '这种模板可以区分多种通知类型',\n        description: '',\n        datetime: '2017-08-07',\n        // read: true,\n        type: '1',\n      },\n      {\n        id: '000000004',\n        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',\n        title: '左侧图标用于区分不同的类型',\n        description: '',\n        datetime: '2017-08-07',\n        type: '1',\n      },\n      {\n        id: '000000005',\n        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',\n        title: '标题可以设置自动显示省略号，本例中标题行数已设为1行，如果内容超过1行将自动截断并支持tooltip显示完整标题。',\n        description: '',\n        datetime: '2017-08-07',\n        type: '1',\n      },\n      {\n        id: '000000006',\n        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',\n        title: '左侧图标用于区分不同的类型',\n        description: '',\n        datetime: '2017-08-07',\n        type: '1',\n      },\n      {\n        id: '000000007',\n        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',\n        title: '左侧图标用于区分不同的类型',\n        description: '',\n        datetime: '2017-08-07',\n        type: '1',\n      },\n      {\n        id: '000000008',\n        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',\n        title: '左侧图标用于区分不同的类型',\n        description: '',\n        datetime: '2017-08-07',\n        type: '1',\n      },\n      {\n        id: '000000009',\n        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',\n        title: '左侧图标用于区分不同的类型',\n        description: '',\n        datetime: '2017-08-07',\n        type: '1',\n      },\n      {\n        id: '000000010',\n        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',\n        title: '左侧图标用于区分不同的类型',\n        description: '',\n        datetime: '2017-08-07',\n        type: '1',\n      },\n    ],\n    count: 0,\n  },\n  {\n    key: '2',\n    name: '系统消息',\n    list: [\n      {\n        id: '000000006',\n        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',\n        title: '曲丽丽 评论了你',\n        description: '描述信息描述信息描述信息',\n        datetime: '2017-08-07',\n        type: '2',\n        clickClose: true,\n      },\n      {\n        id: '000000007',\n        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',\n        title: '朱偏右 回复了你',\n        description: '这种模板用于提醒谁与你发生了互动',\n        datetime: '2017-08-07',\n        type: '2',\n        clickClose: true,\n      },\n      {\n        id: '000000008',\n        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',\n        title: '标题',\n        description:\n          '请将鼠标移动到此处，以便测试超长的消息在此处将如何处理。本例中设置的描述最大行数为2，超过2行的描述内容将被省略并且可以通过tooltip查看完整内容',\n        datetime: '2017-08-07',\n        type: '2',\n        clickClose: true,\n      },\n    ],\n    count: 0,\n  },\n  // {\n  //   key: '3',\n  //   name: '待办',\n  //   list: [\n  //     {\n  //       id: '000000009',\n  //       avatar: '',\n  //       title: '任务名称',\n  //       description: '任务需要在 2017-01-12 20:00 前启动',\n  //       datetime: '',\n  //       extra: '未开始',\n  //       color: '',\n  //       type: '3',\n  //     },\n  //     {\n  //       id: '000000010',\n  //       avatar: '',\n  //       title: '第三方紧急代码变更',\n  //       description: '冠霖 需在 2017-01-07 前完成代码变更任务',\n  //       datetime: '',\n  //       extra: '马上到期',\n  //       color: 'red',\n  //       type: '3',\n  //     },\n  //     {\n  //       id: '000000011',\n  //       avatar: '',\n  //       title: '信息安全考试',\n  //       description: '指派竹尔于 2017-01-09 前完成更新并发布',\n  //       datetime: '',\n  //       extra: '已耗时 8 天',\n  //       color: 'gold',\n  //       type: '3',\n  //     },\n  //     {\n  //       id: '000000012',\n  //       avatar: '',\n  //       title: 'ABCD 版本发布',\n  //       description: '指派竹尔于 2017-01-09 前完成更新并发布',\n  //       datetime: '',\n  //       extra: '进行中',\n  //       color: 'blue',\n  //       type: '3',\n  //     },\n  //   ],\n  // },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/header/components/notify/index.vue",
    "content": "<template>\n  <div :class=\"prefixCls\">\n    <Badge :count=\"messageCount\" :overflowCount=\"9\" :offset=\"[-4, 18]\" :numberStyle=\"numberStyle\" @click=\"clickBadge('')\">\n      <BellOutlined />\n    </Badge>\n\n    <DynamicNotice ref=\"dynamicNoticeRef\" v-bind=\"dynamicNoticeProps\" />\n    <DetailModal @register=\"registerDetail\" />\n\n    <sys-message-modal @register=\"registerMessageModal\" @refresh=\"reloadCount\" :messageCount=\"messageCount\"></sys-message-modal>\n    <!--  修改密码弹窗  -->\n    <ChangePasswordModal @register=\"changePwdModal\"></ChangePasswordModal>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { computed, defineComponent, ref, unref, reactive, onMounted, getCurrentInstance } from 'vue';\n  import { Popover, Tabs, Badge } from 'ant-design-vue';\n  import { BellOutlined } from '@ant-design/icons-vue';\n  // import { tabListData } from './data';\n  import { getUnreadMessageCount, editCementSend, clearAllUnReadMessage } from './notify.api';\n  import NoticeList from './NoticeList.vue';\n  import DetailModal from '/@/views/monitor/mynews/DetailModal.vue';\n  import DynamicNotice from '/@/views/monitor/mynews/DynamicNotice.vue';\n  import { useModal } from '/@/components/Modal';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useGlobSetting } from '/@/hooks/setting';\n  import { useUserStore } from '/@/store/modules/user';\n  import { connectWebSocket, onWebSocket } from '/@/hooks/web/useWebSocket';\n  import { readAllMsg } from '/@/views/monitor/mynews/mynews.api';\n  import { getToken } from '/@/utils/auth';\n  import md5 from 'crypto-js/md5';\n  import { useRouter } from 'vue-router';\n\n  import SysMessageModal from '/@/views/system/message/components/SysMessageModal.vue'\n  import ChangePasswordModal from './ChangePasswordModal.vue'\n  import { ElectronEnum } from '/@/enums/jeecgEnum';\n  import { defHttp } from \"@/utils/http/axios\";\n\n  export default defineComponent({\n    components: {\n      Popover,\n      BellOutlined,\n      Tabs,\n      TabPane: Tabs.TabPane,\n      Badge,\n      NoticeList,\n      DetailModal,\n      DynamicNotice,\n      SysMessageModal,\n      ChangePasswordModal,\n    },\n    setup() {\n      const { prefixCls } = useDesign('header-notify');\n      const instance: any = getCurrentInstance();\n      const userStore = useUserStore();\n      const glob = useGlobSetting();\n      const dynamicNoticeProps = reactive({ path: '', formData: {} });\n      const [registerDetail, detailModal] = useModal();\n      const router = useRouter();\n      // const listData = ref(tabListData);\n      // const count = computed(() => {\n      //   let count = 0;\n      //   for (let i = 0; i < listData.value.length; i++) {\n      //     count += listData.value[i].count;\n      //   }\n      //   return count;\n      // });\n      const chatRef = ref();\n\n      const [registerMessageModal, { openModal: openMessageModal }] = useModal();\n      const [registerBookModal, { openModal: openBookModal }] = useModal();\n      const [changePwdModal, { openModal: openPwdModal }] = useModal();\n      //通知消息类型\n      const noticeType = ref<string>('system');\n      //未读消息\n      const unReadNum = ref<any>({});\n      \n      function clickBadge(value){\n        // //消息列表弹窗前去除角标\n        // for (let i = 0; i < listData.value.length; i++) {\n        //   listData.value[i].count = 0;\n        // }\n        // 代码逻辑说明: 【QQYUN-12162】OA项目改造，系统重消息拆分，目前消息都在一起 需按分类进行拆分---\n        openMessageModal(true, { noticeType: value })\n      }\n\n      const popoverVisible = ref<boolean>(false);\n      onMounted(() => {\n       initWebSocket();\n      });\n\n      const messageCount = ref<number>(0)\n      function mapAnnouncement(item) {\n        return {\n          ...item,\n          title: item.titile,\n          description: item.msgAbstract,\n          datetime: item.sendTime,\n        };\n      }\n\n      // 获取系统消息\n      async function loadData() {\n        try {\n          // let { anntMsgList, sysMsgList, anntMsgTotal, sysMsgTotal } = await listCementByUser({\n          //   pageSize: 5,\n          // });\n          // listData.value[0].list = anntMsgList.map(mapAnnouncement);\n          // listData.value[1].list = sysMsgList.map(mapAnnouncement);\n          // listData.value[0].count = anntMsgTotal;\n          // listData.value[1].count = sysMsgTotal;\n          //let msgCount = anntMsgTotal+sysMsgTotal;\n          let msgCount =  await getUnreadMessageCount();\n          // 代码逻辑说明: 【QQYUN-12162】OA项目改造，系统重消息拆分，目前消息都在一起 需按分类进行拆分---\n          unReadNum.value = msgCount;\n          messageCount.value = msgCount.count?msgCount.count:0;\n          // 代码逻辑说明: 【JHHB-13】桌面应用消息通知\n          if (glob.isElectronPlatform) {\n            window[ElectronEnum.ELECTRON_API].sendNotifyFlash(messageCount.value);\n            window[ElectronEnum.ELECTRON_API].trayFlash();\n          }\n        } catch (e) {\n          console.warn('系统消息通知异常：', e);\n        }\n      }\n\n      loadData();\n\n      function onNoticeClick(record) {\n        try {\n          editCementSend(record.id);\n          loadData();\n        } catch (e) {\n          console.error(e);\n        }\n        if (record.openType === 'component') {\n          dynamicNoticeProps.path = record.openPage;\n          dynamicNoticeProps.formData = { id: record.busId };\n          instance.refs.dynamicNoticeRef?.detail(record.openPage);\n        } else {\n          detailModal.openModal(true, {\n            record,\n            isUpdate: true,\n          });\n        }\n        popoverVisible.value = false;\n      }\n\n      // 初始化 WebSocket\n      function initWebSocket() {\n        let token = getToken();\n        //将登录token生成一个短的标识\n        let wsClientId = md5(token);\n        let userId = unref(userStore.getUserInfo).id + \"_\" + wsClientId;\n        // WebSocket与普通的请求所用协议有所不同，ws等同于http，wss等同于https\n        let url = glob.domainUrl?.replace('https://', 'wss://').replace('http://', 'ws://') + '/websocket/' + userId;\n        connectWebSocket(url);\n        onWebSocket(onWebSocketMessage);\n      }\n\n      function onWebSocketMessage(data) {\n        if (data.cmd === 'topic' || data.cmd === 'user') {\n          // 代码逻辑说明: VUEN-1674【严重bug】系统通知，为什么必须刷新右上角才提示\n          if(data.noticeType){\n            noticeType.value = data.noticeType;\n          }\n          //后台保存数据太慢 前端延迟刷新消息\n          setTimeout(()=>{\n            // 代码逻辑说明: 【JHHB-13】桌面应用消息通知\n            notification(data);\n            loadData();\n          }, 1000)\n        }\n      }\n      // 桌面应用通知\n      function notification(data) {\n        if (glob.isElectronPlatform && (data.noticeType || data.cmd == 'email')) {\n          // 流程、文件、日程、系统、会议\n          // flow、file、plan、system、meeting\n          let title = '';\n          let msgTxt = '';\n          let path = '';\n          if (data.noticeType === 'flow') {\n            title = '流程';\n            path = '/task/myHandleTaskInfo';\n          } else if (data.noticeType === 'file') {\n            title = '文件';\n            path = '/file';\n          } else if (data.noticeType === 'plan') {\n            title = '日程';\n            path = '/plan/view';\n          } else if (data.noticeType === 'system') {\n            title = '系统';\n            path = '/monitor/mynews';\n          } else if (data.noticeType === 'meeting') {\n            title = '会议';\n            path = '/meeting';\n          } else if (data.cmd === 'email') {\n            title = '邮件';\n            path = '/eoa/email?type=inbox';\n          }\n          msgTxt = data.msgTxt ?? '查看详情';\n          window[ElectronEnum.ELECTRON_API].sendNotification(`有新的${title}消息`, msgTxt, path);\n        }\n      }\n      // 清空消息\n      function onEmptyNotify() {\n        popoverVisible.value = false;\n        readAllMsg({}, loadData);\n      }\n      async function reloadCount(id){\n        try {\n          await editCementSend(id);\n          await loadData();\n        } catch (e) {\n          console.error(e);\n        }\n      }\n\n      /**\n       * 获取消息未读数\n       */\n      function getSystemUnreadNum() {\n      }\n\n      function clickAddressBook() {\n        openBookModal(true,{})\n      }\n\n      /**\n       * 清除全部未读消息\n       */\n      function clearAllUnMessage() {\n        clearAllUnReadMessage().then((res) =>{\n          if(res.success){\n            loadData();\n          }\n        })\n      }\n\n      //验证是否为默认密码\n      verifyIzDefaultPwd();\n      \n      /**\n       * 验证是否为默认密码\n       */\n      function verifyIzDefaultPwd() {\n        defHttp.get({ url: \"/sys/user/verifyIzDefaultPwd\" } ,{ isTransformResponse: false }).then((res) =>{\n          if(res.success){\n            if(res.message.indexOf('yes') != -1){\n              openPwdModal(true,{\n                oldPassword: res.message.split(\"_\")[1]\n              })\n            }\n          }\n        })\n      }\n\n      return {\n        prefixCls,\n        // listData,\n        // count,\n        clickBadge,\n        registerMessageModal,\n        reloadCount,\n        onNoticeClick,\n        onEmptyNotify,\n        numberStyle: {},\n        popoverVisible,\n        registerDetail,\n        dynamicNoticeProps,\n        chatRef,\n        getSystemUnreadNum,\n        clickAddressBook,\n        registerBookModal,\n        messageCount,\n        clearAllUnMessage,\n        changePwdModal,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  //noinspection LessUnresolvedVariable\n  @prefix-cls: ~'@{namespace}-header-notify';\n\n  .@{prefix-cls} {\n  /*  padding-top: 2px;*/\n\n    &__overlay {\n      max-width: 340px;\n\n      .ant-popover-inner-content {\n        padding: 0;\n      }\n\n      .ant-tabs-nav {\n        margin-bottom: 12px;\n      }\n\n      .ant-list-item {\n        padding: 12px 24px;\n        transition: background-color 300ms;\n\n      }\n\n      .bottom-buttons {\n        text-align: center;\n        border-top: 1px solid #f0f0f0;\n        height: 42px;\n\n        .ant-btn {\n          border: 0;\n          height: 100%;\n\n          &:first-child {\n            border-right: 1px solid #f0f0f0;\n          }\n        }\n      }\n    }\n\n    .ant-tabs-content {\n      width: 300px;\n    }\n\n    .ant-badge {\n      font-size: 18px;\n\n      .ant-badge-count {\n        @badget-size: 16px;\n        width: @badget-size;\n        height: @badget-size;\n        min-width: @badget-size;\n        line-height: @badget-size;\n        padding: 0;\n\n        .ant-scroll-number-only > p.ant-scroll-number-only-unit {\n          font-size: 14px;\n          height: @badget-size;\n        }\n      }\n\n      .ant-badge-multiple-words {\n        padding: 0 0 0 2px;\n        font-size: 12px;\n      }\n\n      svg {\n        width: 0.9em;\n      }\n    }\n  }\n\n  // 兼容黑暗模式\n  [data-theme='dark'] .@{prefix-cls} {\n    &__overlay {\n      .ant-list-item {\n        &:hover {\n          background-color: #111b26;\n        }\n      }\n\n      .bottom-buttons {\n        border-top: 1px solid #303030;\n\n        .ant-btn {\n          &:first-child {\n            border-right: 1px solid #303030;\n          }\n        }\n      }\n    }\n  }\n\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/header/components/notify/index_old.vue",
    "content": "<template>\n  <div :class=\"prefixCls\">\n    <Popover v-model:open=\"popoverVisible\" title=\"\" trigger=\"click\" :overlayClassName=\"`${prefixCls}__overlay`\">\n      <Badge :count=\"count\" :overflowCount=\"9\" :offset=\"[-4, 10]\" :numberStyle=\"numberStyle\">\n        <BellOutlined />\n      </Badge>\n      <template #content>\n        <Tabs>\n          <template v-for=\"item in listData\" :key=\"item.key\">\n            <TabPane>\n              <template #tab>\n                {{ item.name }}\n                <span v-if=\"item.list.length !== 0\">({{ item.count }})</span>\n              </template>\n              <!-- 绑定title-click事件的通知列表中标题是“可点击”的-->\n              <NoticeList :list=\"item.list\" @title-click=\"onNoticeClick\" />\n            </TabPane>\n          </template>\n        </Tabs>\n        <a-row class=\"bottom-buttons\">\n          <a-col :span=\"count === 0 ? 0 : 12\">\n            <a-button @click=\"onEmptyNotify\" type=\"dashed\" block>清空消息</a-button>\n          </a-col>\n          <a-col :span=\"count === 0 ? 24 : 12\">\n            <a-button @click=\"popoverVisible = false\" type=\"dashed\" block>\n              <router-link to=\"/monitor/mynews\">查看更多</router-link>\n            </a-button>\n          </a-col>\n        </a-row>\n      </template>\n    </Popover>\n    <DynamicNotice ref=\"dynamicNoticeRef\" v-bind=\"dynamicNoticeProps\" />\n    <DetailModal @register=\"registerDetail\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { computed, defineComponent, ref, unref, reactive, onMounted, getCurrentInstance, onUnmounted } from 'vue';\n  import { Popover, Tabs, Badge } from 'ant-design-vue';\n  import { BellOutlined } from '@ant-design/icons-vue';\n  import { tabListData } from './data';\n  import { listCementByUser, editCementSend } from './notify.api';\n  import NoticeList from './NoticeList.vue';\n  import DetailModal from '/@/views/monitor/mynews/DetailModal.vue';\n  import DynamicNotice from '/@/views/monitor/mynews/DynamicNotice.vue';\n  import { useModal } from '/@/components/Modal';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useGlobSetting } from '/@/hooks/setting';\n  import { useUserStore } from '/@/store/modules/user';\n  import { connectWebSocket, onWebSocket, result } from '/@/hooks/web/useWebSocket';\n  import { readAllMsg } from '/@/views/monitor/mynews/mynews.api';\n  import { getToken } from '/@/utils/auth';\n  export default defineComponent({\n    components: {\n      Popover,\n      BellOutlined,\n      Tabs,\n      TabPane: Tabs.TabPane,\n      Badge,\n      NoticeList,\n      DetailModal,\n      DynamicNotice,\n    },\n    setup() {\n      const { prefixCls } = useDesign('header-notify');\n      const instance: any = getCurrentInstance();\n      const userStore = useUserStore();\n      const glob = useGlobSetting();\n      const dynamicNoticeProps = reactive({ path: '', formData: {} });\n      const [registerDetail, detailModal] = useModal();\n      const popoverVisible = ref<boolean>(false);\n      const listData = ref(tabListData);\n      listData.value[0].list = [];\n      listData.value[1].list = [];\n      listData.value[0].count = 0;\n      listData.value[1].count = 0;\n\n      onMounted(() => {\n        initWebSocket();\n      });\n\n      const count = computed(() => {\n        let count = 0;\n        for (let i = 0; i < listData.value.length; i++) {\n          count += listData.value[i].count;\n        }\n        return count;\n      });\n\n      function mapAnnouncement(item) {\n        return {\n          ...item,\n          title: item.titile,\n          description: item.msgAbstract,\n          datetime: item.sendTime,\n        };\n      }\n\n      // 获取系统消息\n      async function loadData() {\n        try {\n          let { anntMsgList, sysMsgList, anntMsgTotal, sysMsgTotal } = await listCementByUser({\n            pageSize: 5,\n          });\n          listData.value[0].list = anntMsgList.map(mapAnnouncement);\n          listData.value[1].list = sysMsgList.map(mapAnnouncement);\n          listData.value[0].count = anntMsgTotal;\n          listData.value[1].count = sysMsgTotal;\n        } catch (e) {\n          console.warn('系统消息通知异常：', e);\n        }\n      }\n\n      loadData();\n\n      function onNoticeClick(record) {\n        try {\n          editCementSend(record.id);\n          loadData();\n        } catch (e) {\n          console.error(e);\n        }\n        if (record.openType === 'component') {\n          dynamicNoticeProps.path = record.openPage;\n          dynamicNoticeProps.formData = { id: record.busId };\n          instance.refs.dynamicNoticeRef?.detail(record.openPage);\n        } else {\n          detailModal.openModal(true, {\n            record,\n            isUpdate: true,\n          });\n        }\n        popoverVisible.value = false;\n      }\n\n      // 初始化 WebSocket\n      function initWebSocket() {\n        let userId = unref(userStore.getUserInfo).id;\n        let token = getToken();\n        // WebSocket与普通的请求所用协议有所不同，ws等同于http，wss等同于https\n        let url = glob.domainUrl?.replace('https://', 'wss://').replace('http://', 'ws://') + '/websocket/' + userId;\n        connectWebSocket(url);\n        onWebSocket(onWebSocketMessage);\n      }\n\n      function onWebSocketMessage(data) {\n        console.log('---onWebSocketMessage---', data)\n        if (data.cmd === 'topic' || data.cmd === 'user') {\n          //后台保存数据太慢 前端延迟刷新消息\n          setTimeout(()=>{\n            loadData();\n          }, 1000)\n        }\n      }\n\n      // 清空消息\n      function onEmptyNotify() {\n        popoverVisible.value = false;\n        readAllMsg({}, loadData);\n      }\n\n      return {\n        prefixCls,\n        listData,\n        count,\n        onNoticeClick,\n        onEmptyNotify,\n        numberStyle: {},\n        popoverVisible,\n        registerDetail,\n        dynamicNoticeProps,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  //noinspection LessUnresolvedVariable\n  @prefix-cls: ~'@{namespace}-header-notify';\n\n  .@{prefix-cls} {\n    padding-top: 2px;\n\n    &__overlay {\n      max-width: 340px;\n\n      .ant-popover-inner-content {\n        padding: 0;\n      }\n\n      .ant-tabs-nav {\n        margin-bottom: 12px;\n      }\n\n      .ant-list-item {\n        padding: 12px 24px;\n        transition: background-color 300ms;\n\n        &:hover {\n          background-color: #e6f7ff;\n        }\n      }\n\n      .bottom-buttons {\n        text-align: center;\n        border-top: 1px solid #f0f0f0;\n        height: 42px;\n\n        .ant-btn {\n          border: 0;\n          height: 100%;\n\n          &:first-child {\n            border-right: 1px solid #f0f0f0;\n          }\n        }\n      }\n    }\n\n    .ant-tabs-content {\n      width: 300px;\n    }\n\n    .ant-badge {\n      font-size: 18px;\n\n      .ant-badge-count {\n        @badget-size: 16px;\n        width: @badget-size;\n        height: @badget-size;\n        min-width: @badget-size;\n        line-height: @badget-size;\n        padding: 0;\n\n        .ant-scroll-number-only > p.ant-scroll-number-only-unit {\n          font-size: 14px;\n          height: @badget-size;\n        }\n      }\n\n      .ant-badge-multiple-words {\n        padding: 0 0 0 2px;\n        font-size: 12px;\n      }\n\n      svg {\n        width: 0.9em;\n      }\n    }\n  }\n\n  // 兼容黑暗模式\n  [data-theme='dark'] .@{prefix-cls} {\n    &__overlay {\n      .ant-list-item {\n        &:hover {\n          background-color: #111b26;\n        }\n      }\n\n      .bottom-buttons {\n        border-top: 1px solid #303030;\n\n        .ant-btn {\n          &:first-child {\n            border-right: 1px solid #303030;\n          }\n        }\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/header/components/notify/notify.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\n\nenum Api {\n  listCementByUser = '/sys/annountCement/listByUser',\n  getUnreadMessageCount = '/sys/annountCement/getUnreadMessageCount',\n  editCementSend = '/sys/sysAnnouncementSend/editByAnntIdAndUserId',\n  clearAllUnReadMessage = '/sys/annountCement/clearAllUnReadMessage',\n}\n\n/**\n * 获取系统通知消息列表\n * @param params\n */\nexport const listCementByUser = (params?) => defHttp.get({ url: Api.listCementByUser, params });\n\n/**\n * 获取用户近两个月未读消息数量\n * @param params\n */\nexport const getUnreadMessageCount = (params?) => defHttp.get({ url: Api.getUnreadMessageCount, params });\n\nexport const editCementSend = (anntId, params?) => defHttp.put({ url: Api.editCementSend, params: { anntId, ...params } });\n\n/**\n * 清空全部未读消息\n */\nexport const clearAllUnReadMessage = () => defHttp.post({ url: Api.clearAllUnReadMessage },{ isTransformResponse: false });\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/header/components/user-dropdown/DepartSelect.vue",
    "content": "<template>\n  <BasicModal v-bind=\"config\" :maxHeight=\"500\" :title=\"currTitle\" v-model:visible=\"visible\" wrapClassName=\"loginSelectModal\">\n    <a-form ref=\"formRef\" v-bind=\"layout\" :colon=\"false\" class=\"loginSelectForm\">\n      <a-form-item v-if=\"isMultiTenant\" :validate-status=\"validate_status\">\n        <!--label内容-->\n        <template #label>\n          <a-tooltip placement=\"topLeft\">\n            <template #title>\n              <span>您隶属于多租户，请选择当前所属租户</span>\n            </template>\n            <a-avatar style=\"background-color: #87d068\" :size=\"30\"> 租户 </a-avatar>\n          </a-tooltip>\n        </template>\n        <!--部门下拉内容-->\n        <a-select v-model:value=\"tenantSelected\" placeholder=\"请选择登录部门\" :class=\"{ 'valid-error': validate_status == 'error' }\">\n          <template #suffixIcon>\n            <Icon icon=\"ant-design:gold-outline\" />\n          </template>\n          <template v-for=\"tenant in tenantList\" :key=\"tenant.id\">\n            <a-select-option :value=\"tenant.id\">{{ tenant.name }}</a-select-option>\n          </template>\n        </a-select>\n      </a-form-item>\n      <a-form-item v-if=\"isMultiDepart\" :validate-status=\"validate_status1\">\n        <!--label内容-->\n        <template #label>\n          <a-tooltip placement=\"topLeft\">\n            <template #title>\n              <span>您隶属于多部门，请选择当前所在部门</span>\n            </template>\n            <a-avatar style=\"background-color: rgb(104, 208, 203)\" :size=\"30\"> 部门 </a-avatar>\n          </a-tooltip>\n        </template>\n        <!--部门下拉内容-->\n        <a-select v-model:value=\"departSelected\" placeholder=\"请选择登录部门\" :class=\"{ 'valid-error': validate_status1 == 'error' }\">\n          <template #suffixIcon>\n            <Icon icon=\"ant-design:gold-outline\" />\n          </template>\n          <template v-for=\"depart in departList\" :key=\"depart.orgCode\">\n            <a-select-option :value=\"depart.orgCode\">{{ getShortDeptName(depart) }} </a-select-option>\n          </template>\n        </a-select>\n      </a-form-item>\n    </a-form>\n\n    <template #footer>\n      <a-button @click=\"close\">关闭</a-button>\n      <a-button @click=\"handleSubmit\" type=\"primary\">确认</a-button>\n    </template>\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed, watch, unref } from 'vue';\n  import { Avatar } from 'ant-design-vue';\n  import { BasicModal } from '/@/components/Modal';\n  import { getUserDeparts, selectDepart } from '/@/views/system/depart/depart.api';\n  import { getUserTenants } from '/@/views/system/tenant/tenant.api';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useUserStore } from '/@/store/modules/user';\n\n  const userStore = useUserStore();\n  const { createMessage, notification } = useMessage();\n  const props = defineProps({\n    title: { type: String, default: '部门选择' },\n    closable: { type: Boolean, default: false },\n    username: { type: String, default: '' },\n  });\n\n  const layout = {\n    labelCol: { span: 4 },\n    wrapperCol: { span: 18 },\n  };\n\n  const config = {\n    maskClosable: false,\n    closable: false,\n    canFullscreen: false,\n    width: '500px',\n    minHeight: 20,\n    maxHeight: 20,\n  };\n  const currTitle = ref('');\n\n  const isMultiTenant = ref(false);\n  const currentTenantName = ref('');\n  const tenantSelected = ref();\n  const tenantList = ref([]);\n  const validate_status = ref('');\n\n  const isMultiDepart = ref(false);\n  const currentDepartName = ref('');\n  const departSelected = ref('');\n  const departList = ref([]);\n  const validate_status1 = ref('');\n  //弹窗显隐\n  const visible = ref(false);\n  //获取部门缩写\n  const getShortDeptName = computed(()=>{\n    return (depart) => {\n      let deptName = depart.departNameAbbr || depart.departPathName || depart.departName;\n      if (deptName.length > 18) {\n        return '...' + deptName.substring(deptName.length-18, deptName.length) ;\n      }\n      return deptName;\n    };\n  })\n  /**\n   * 弹窗打开前处理\n   */\n  async function show() {\n    //加载部门\n    await loadDepartList();\n    //加载租户\n    await loadTenantList();\n    //标题配置\n    if (unref(isMultiTenant) && unref(isMultiDepart)) {\n      currTitle.value = '切换租户和部门';\n    } else if (unref(isMultiTenant)) {\n      currTitle.value =\n        unref(currentTenantName) && unref(currentTenantName).length > 0 ? `租户切换（当前租户 :${unref(currentTenantName)}）` : props.title;\n    } else if (unref(isMultiDepart)) {\n      currTitle.value =\n        unref(currentDepartName) && unref(currentDepartName).length > 0 ? `部门切换（当前部门 :${unref(currentDepartName)}）` : props.title;\n    }\n    //model显隐\n    if (unref(isMultiTenant) || unref(isMultiDepart)) {\n      visible.value = true;\n    }\n  }\n  /**\n   *加载部门信息\n   */\n  async function loadDepartList() {\n    const result = await getUserDeparts();\n    if (!result.list || result.list.length == 0) {\n      return;\n    }\n    let currentDepart = result.list.filter((item) => item.orgCode == result.orgCode);\n    //筛选出用户的部门信息（排除公司或者岗位配置）\n    const userDeparts = result.list.filter((item) => item.orgCategory == '2');\n    departList.value = userDeparts;\n    // 代码逻辑说明: JHHB-790 用户部门变更，会出现这个情况（因为之前设置的这里只切换部门，过滤了公司和岗位信息）\n    const hasCurrentDepart = userDeparts.some(item => item.orgCode == result.orgCode);\n    departSelected.value = hasCurrentDepart && currentDepart && currentDepart.length > 0 ? result.orgCode : '';\n    currentDepartName.value = currentDepart && currentDepart.length > 0 ? currentDepart[0].departName : '';\n    isMultiDepart.value = true;\n  }\n  /**\n   *加载租户信息\n   */\n  async function loadTenantList() {\n    const result = await getUserTenants();\n    if (!result.list || result.list.length == 0) {\n      return;\n    }\n    let tenantId = userStore.getTenant;\n    let currentTenant = result.list.filter((item) => item.id == tenantId);\n    currentTenantName.value = currentTenant && currentTenant.length > 0 ? currentTenant[0].name : '';\n    tenantList.value = result.list;\n    tenantSelected.value = tenantId;\n    isMultiTenant.value = true;\n  }\n\n  /**\n   * 提交数据\n   */\n  async function handleSubmit() {\n    if (unref(isMultiTenant) && unref(tenantSelected)==null) {\n      validate_status.value = 'error';\n      return false;\n    }\n    if (unref(isMultiDepart) && !unref(departSelected)) {\n      validate_status1.value = 'error';\n      return false;\n    }\n    departResolve()\n      .then(() => {\n        if (unref(isMultiTenant)) {\n          userStore.setTenant(unref(tenantSelected));\n        }\n        createMessage.success('切换成功');\n        \n        //切换租户后要刷新首页\n        window.location.reload();\n      })\n      .catch((e) => {\n        console.log('登录选择出现问题', e);\n      })\n      .finally(() => {\n        if (unref(isMultiTenant)) {\n          userStore.setTenant(unref(tenantSelected));\n        }\n        close();\n      });\n  }\n  /**\n   *切换选择部门\n   */\n  function departResolve() {\n    return new Promise(async (resolve, reject) => {\n      if (!unref(isMultiDepart)) {\n        resolve();\n      } else {\n        const result = await selectDepart({\n          username: userStore.getUserInfo.username,\n          orgCode: unref(departSelected),\n          loginTenantId: unref(tenantSelected),\n        });\n        if (result.userInfo) {\n          const userInfo = result.userInfo;\n          userStore.setUserInfo(userInfo);\n          resolve();\n        } else {\n          requestFailed(result);\n          userStore.logout();\n          reject();\n        }\n      }\n    });\n  }\n  /**\n   * 请求失败处理\n   */\n  function requestFailed(err) {\n    notification.error({\n      message: '登录失败',\n      description: ((err.response || {}).data || {}).message || err.message || '请求出现错误，请稍后再试',\n      duration: 4,\n    });\n  }\n  /**\n   * 关闭model\n   */\n  function close() {\n    departClear();\n  }\n\n  /**\n   *初始化数据\n   */\n  function departClear() {\n    currTitle.value = '';\n\n    isMultiTenant.value = false;\n    currentTenantName.value = '';\n    tenantSelected.value = '';\n    tenantList.value = [];\n    validate_status.value = '';\n\n    isMultiDepart.value = false;\n    currentDepartName.value = '';\n    departSelected.value = '';\n    departList.value = [];\n    validate_status1.value = '';\n\n    visible.value = false;\n  }\n\n  /**\n   * 监听username\n   */\n  watch(\n    () => props.username,\n    (value) => {\n      value && loadDepartList();\n    }\n  );\n\n  defineExpose({\n    show,\n  });\n</script>\n<style lang=\"less\" scoped>\n  .loginSelectForm {\n    margin-bottom: -20px;\n  }\n\n  .loginSelectModal {\n    top: 20px;\n  }\n\n  .valid-error .ant-select-selection__placeholder {\n    color: #f5222d;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/header/components/user-dropdown/DropMenuItem.vue",
    "content": "<template>\n  <MenuItem :key=\"itemKey\">\n    <span class=\"flex items-center\">\n      <Icon :icon=\"icon\" class=\"mr-1\" />\n      <span>{{ text }}</span>\n    </span>\n  </MenuItem>\n</template>\n<script lang=\"ts\">\n  import { Menu } from 'ant-design-vue';\n\n  import { computed, defineComponent, getCurrentInstance } from 'vue';\n\n  import Icon from '/@/components/Icon/index';\n  import { propTypes } from '/@/utils/propTypes';\n\n  export default defineComponent({\n    name: 'DropdownMenuItem',\n    components: { MenuItem: Menu.Item, Icon },\n    props: {\n      // 【issues/6855】\n      itemKey: propTypes.string,\n      text: propTypes.string,\n      icon: propTypes.string,\n    },\n    setup(props) {\n      const instance = getCurrentInstance();\n      // 代码逻辑说明: 【issues/6855】组件使用key作props报警告，改为itemKey\n      const itemKey = computed(() => props.itemKey || instance?.vnode?.props?.itemKey);\n      return { itemKey };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/header/components/user-dropdown/UpdatePassword.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"title\" @ok=\"handleSubmit\" width=\"500px\" :bodyStyle=\"{ padding: '20px 40px 20px 20px'}\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, unref } from 'vue';\n  import { rules } from '/@/utils/helper/validator';\n  import { defHttp } from '/@/utils/http/axios';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import BasicForm from '/@/components/Form/src/BasicForm.vue';\n  import { useForm } from '/@/components/Form/src/hooks/useForm';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useLocaleStore } from '/@/store/modules/locale';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  const localeStore = useLocaleStore();\n  const { t } = useI18n();\n  // 声明Emits\n  const emit = defineEmits(['register']);\n  const $message = useMessage();\n  const formRef = ref();\n  const username = ref('');\n  // 代码逻辑说明: 【QQYUN-7970】国际化\n  const title = ref(t('layout.changePassword.changePassword'));\n  //表单配置\n  const [registerForm, { resetFields, validate, clearValidate }] = useForm({\n    schemas: [\n      {\n        label: t('layout.changePassword.oldPassword'),\n        field: 'oldpassword',\n        component: 'InputPassword',\n        required: true,\n      },\n      {\n        label: t('layout.changePassword.newPassword'),\n        field: 'password',\n        component: 'StrengthMeter',\n        componentProps: {\n          placeholder: t('layout.changePassword.pleaseEnterNewPassword'),\n        },\n        rules: [\n          {\n            required: true,\n            message: t('layout.changePassword.pleaseEnterNewPassword'),\n          },\n          {\n            pattern: /^(?=.*[a-zA-Z])(?=.*\\d)(?=.*[~!@#$%^&*()_+`\\-={}:\";'<>?,./]).{8,}$/,\n            message: '密码由 8 位及以上数字、大小写字母和特殊符号组成！',\n          },  \n        ],\n      },\n      {\n        label: t('layout.changePassword.confirmNewPassword'),\n        field: 'confirmpassword',\n        component: 'InputPassword',\n        dynamicRules: ({ values }) => rules.confirmPassword(values, true),\n      },\n    ],\n    showActionButtonGroup: false,\n    wrapperCol: null,\n    labelWidth: localeStore.getLocale == 'zh_CN' ? 100 : 160,\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner();\n\n  //表单提交事件\n  async function handleSubmit() {\n    try {\n      const values = await validate();\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      let params = Object.assign({ username: unref(username) }, values);\n      defHttp.put({ url: '/sys/user/updatePassword', params }, { isTransformResponse: false }).then((res) => {\n        if (res.success) {\n          $message.createMessage.success(res.message);\n          //关闭弹窗\n          closeModal();\n        } else {\n          $message.createMessage.warning(res.message);\n        }\n      });\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n\n  async function show(name) {\n    if (!name) {\n      $message.createMessage.warning('当前系统无登录用户!');\n      return;\n    } else {\n      username.value = name;\n      await setModalProps({ visible: true });\n      await resetFields();\n      await clearValidate();\n    }\n  }\n\n  defineExpose({\n    title,\n    show,\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/header/components/user-dropdown/index.vue",
    "content": "<template>\n  <Dropdown placement=\"bottomLeft\" :overlayClassName=\"`${prefixCls}-dropdown-overlay`\">\n    <span :class=\"[prefixCls, `${prefixCls}--${theme}`]\" class=\"flex\">\n      <img :class=\"`${prefixCls}__header`\" :src=\"getAvatarUrl\" />\n      <span :class=\"`${prefixCls}__info hidden md:block`\">\n        <span :class=\"`${prefixCls}__name  `\" class=\"truncate\">\n          {{ getUserInfo.realname }}\n        </span>\n      </span>\n    </span>\n\n    <template #overlay>\n      <Menu @click=\"handleMenuClick\">\n        <MenuItem itemKey=\"doc\" :text=\"t('layout.header.dropdownItemDoc')\" icon=\"ion:document-text-outline\" v-if=\"getShowDoc\" />\n        <MenuDivider v-if=\"getShowDoc\" />\n        <MenuItem itemKey=\"account\" :text=\"t('layout.header.dropdownItemSwitchAccount')\" icon=\"ant-design:setting-outlined\" />\n        <MenuItem itemKey=\"password\" :text=\"t('layout.header.dropdownItemSwitchPassword')\" icon=\"ant-design:edit-outlined\" />\n        <MenuItem itemKey=\"depart\" :text=\"t('layout.header.dropdownItemSwitchDepart')\" icon=\"ant-design:cluster-outlined\" />\n        <MenuItem itemKey=\"cache\" :text=\"t('layout.header.dropdownItemRefreshCache')\" icon=\"ion:sync-outline\" />\n        <!-- <MenuItem\n            v-if=\"getUseLockPage\"\n            itemKey=\"lock\"\n            :text=\"t('layout.header.tooltipLock')\"\n            icon=\"ion:lock-closed-outline\"\n        />-->\n        <MenuItem itemKey=\"logout\" :text=\"t('layout.header.dropdownItemLoginOut')\" icon=\"ion:power-outline\" />\n      </Menu>\n    </template>\n  </Dropdown>\n  <LockAction v-if=\"lockActionVisible\" ref=\"lockActionRef\" @register=\"register\" />\n  <DepartSelect ref=\"loginSelectRef\" />\n  <UpdatePassword v-if=\"passwordVisible\" ref=\"updatePasswordRef\" />\n</template>\n<script lang=\"ts\">\n  // components\n  import { Dropdown, Menu } from 'ant-design-vue';\n\n  import { defineComponent, computed, ref, nextTick } from 'vue';\n\n  import { SITE_URL } from '/@/settings/siteSetting';\n\n  import { useUserStore } from '/@/store/modules/user';\n  import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useModal } from '/@/components/Modal';\n  import { useMessage } from '/src/hooks/web/useMessage';\n  import { useGo } from '/@/hooks/web/usePage';\n  import headerImg from '/@/assets/images/header.jpg';\n  import { propTypes } from '/@/utils/propTypes';\n  import { openWindow } from '/@/utils';\n\n  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n\n  import { refreshCache, queryAllDictItems } from '/@/views/system/dict/dict.api';\n  import { DB_DICT_DATA_KEY } from '/src/enums/cacheEnum';\n  import { removeAuthCache, setAuthCache } from '/src/utils/auth';\n  import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';\n  import { getRefPromise } from '/@/utils/index';\n  import { refreshDragCache } from \"@/api/common/api\";\n\n  type MenuEvent = 'logout' | 'doc' | 'lock' | 'cache' | 'depart' | 'defaultHomePage' | 'password' | 'account';\n  const { createMessage } = useMessage();\n  export default defineComponent({\n    name: 'UserDropdown',\n    components: {\n      Dropdown,\n      Menu,\n      MenuItem: createAsyncComponent(() => import('./DropMenuItem.vue')),\n      MenuDivider: Menu.Divider,\n      LockAction: createAsyncComponent(() => import('../lock/LockModal.vue')),\n      DepartSelect: createAsyncComponent(() => import('./DepartSelect.vue')),\n      UpdatePassword: createAsyncComponent(() => import('./UpdatePassword.vue')),\n    },\n    props: {\n      theme: propTypes.oneOf(['dark', 'light']),\n    },\n    setup() {\n      const { prefixCls } = useDesign('header-user-dropdown');\n      const { t } = useI18n();\n      const { getShowDoc, getUseLockPage } = useHeaderSetting();\n      const userStore = useUserStore();\n      const go = useGo();\n      const passwordVisible = ref(false);\n      const lockActionVisible = ref(false);\n      const lockActionRef = ref(null);\n\n      const getUserInfo = computed(() => {\n        const { realname = '', avatar, desc } = userStore.getUserInfo || {};\n        return { realname, avatar: avatar || headerImg, desc };\n      });\n\n      const getAvatarUrl = computed(() => {\n        let { avatar } = getUserInfo.value;\n        if (avatar == headerImg) {\n          return avatar;\n        } else {\n          return getFileAccessHttpUrl(avatar);\n        }\n      });\n\n      const [register, { openModal }] = useModal();\n      /**\n       * 多部门弹窗逻辑\n       */\n      const loginSelectRef = ref();\n      // 代码逻辑说明: 【QQYUN-6333】空路由问题—首次访问资源太大\n      async function handleLock() {\n        await getRefPromise(lockActionRef);\n        openModal(true);\n      }\n      //  login out\n      function handleLoginOut() {\n        userStore.confirmLoginOut();\n      }\n\n      // open doc\n      function openDoc() {\n        openWindow(SITE_URL);\n      }\n\n      // 清除缓存\n      async function clearCache() {\n        const result = await refreshCache();\n        const dragRes = await refreshDragCache();\n        console.log('dragRes', dragRes);\n        if (result.success) {\n          const res = await queryAllDictItems();\n          removeAuthCache(DB_DICT_DATA_KEY);\n          setAuthCache(DB_DICT_DATA_KEY, res.result);\n          createMessage.success(t('layout.header.refreshCacheComplete'));\n          // 代码逻辑说明: 【issues/7433】vue3 数据字典优化建议\n          userStore.setAllDictItems(res.result);\n        } else {\n          createMessage.error(t('layout.header.refreshCacheFailure'));\n        }\n      }\n      // 切换部门\n      function updateCurrentDepart() {\n        loginSelectRef.value.show();\n      }\n      // 修改密码\n      const updatePasswordRef = ref();\n      // 代码逻辑说明: 【QQYUN-6333】空路由问题—首次访问资源太大\n      async function updatePassword() {\n        passwordVisible.value = true;\n        await getRefPromise(updatePasswordRef);\n        updatePasswordRef.value.show(userStore.getUserInfo.username);\n      }\n      function handleMenuClick(e: { key: MenuEvent }) {\n        switch (e.key) {\n          case 'logout':\n            handleLoginOut();\n            break;\n          case 'doc':\n            openDoc();\n            break;\n          case 'lock':\n            handleLock();\n            break;\n          case 'cache':\n            clearCache();\n            break;\n          case 'depart':\n            updateCurrentDepart();\n            break;\n          case 'password':\n            updatePassword();\n            break;\n          case 'account':\n            // 代码逻辑说明: 进入用户设置页面------------\n            go(`/system/usersetting`);\n            break;\n        }\n      }\n\n      return {\n        prefixCls,\n        t,\n        getUserInfo,\n        getAvatarUrl,\n        handleMenuClick,\n        getShowDoc,\n        register,\n        getUseLockPage,\n        loginSelectRef,\n        updatePasswordRef,\n        passwordVisible,\n        lockActionVisible,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-header-user-dropdown';\n\n  .@{prefix-cls} {\n    height: @header-height;\n    padding: 0 0 0 10px;\n    padding-right: 10px;\n    overflow: hidden;\n    font-size: 12px;\n    cursor: pointer;\n    align-items: center;\n\n    img {\n      width: 24px;\n      height: 24px;\n      margin-right: 12px;\n    }\n\n    &__header {\n      border-radius: 50%;\n    }\n\n    &__name {\n      font-size: 14px;\n    }\n\n    &--dark {\n      &:hover {\n        background-color: @header-dark-bg-hover-color;\n      }\n    }\n\n    &--light {\n      &:hover {\n        background-color: @header-light-bg-hover-color;\n      }\n\n      .@{prefix-cls}__name {\n        color: @text-color-base;\n      }\n\n      .@{prefix-cls}__desc {\n        color: @header-light-desc-color;\n      }\n    }\n\n    &-dropdown-overlay {\n      // 代码逻辑说明: 【QQYUN-7512】顶部账号划过首次弹出时位置会变更一下\n      width: 160px;\n      .ant-dropdown-menu-item {\n        min-width: 160px;\n      }\n    }\n  }\n  // 代码逻辑说明: 【QQYUN-13013】切换到英文模式下拉菜单宽度有点窄\n  html[lang=\"en\"] {\n    .@{prefix-cls} {\n      &-dropdown-overlay {\n        width: 175px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/header/index.less",
    "content": "@header-trigger-prefix-cls: ~'@{namespace}-layout-header-trigger';\n@header-prefix-cls: ~'@{namespace}-layout-header';\n@breadcrumb-prefix-cls: ~'@{namespace}-layout-breadcrumb';\n@logo-prefix-cls: ~'@{namespace}-app-logo';\n\n.@{header-prefix-cls} {\n  display: flex;\n  height: @header-height;\n  padding: 0;\n  // update-begin--author:liaozhiyang---date:20250818---for：【issues/8709】LayoutContent样式多出1px\n  // margin-left: -1px;\n  // update-end--author:liaozhiyang---date:20250818---for：【issues/8709】LayoutContent样式多出1px\n  line-height: @header-height;\n  color: @white;\n  background-color: @white;\n  align-items: center;\n  justify-content: space-between;\n\n  &--mobile {\n    .@{breadcrumb-prefix-cls},\n    .error-action,\n    .notify-item,\n    .lock-item,\n    .fullscreen-item {\n      display: none;\n    }\n\n    .@{logo-prefix-cls} {\n      min-width: unset;\n      padding-right: 0;\n\n      &__title {\n        display: none;\n      }\n    }\n\n    .@{header-trigger-prefix-cls} {\n      padding: 0 4px 0 8px !important;\n    }\n\n    .@{header-prefix-cls}-action {\n      padding-right: 4px;\n    }\n  }\n\n  &--fixed {\n    position: fixed;\n    top: 0;\n    left: 0;\n    z-index: @layout-header-fixed-z-index;\n    width: 100%;\n  }\n\n  &-logo {\n    height: @header-height;\n    min-width: 192px;\n    padding: 0 10px;\n    font-size: 14px;\n\n    img {\n      width: @logo-width;\n      height: @logo-width;\n      margin-right: 2px;\n    }\n  }\n\n  &-left {\n    display: flex;\n    height: 100%;\n    align-items: center;\n\n    .@{header-trigger-prefix-cls} {\n      display: flex;\n      height: 100%;\n      padding: 1px 10px 0 10px;\n      cursor: pointer;\n      align-items: center;\n\n      .anticon {\n        font-size: 22px;\n      }\n\n      &.light {\n        &:hover {\n          background-color: @header-light-bg-hover-color;\n        }\n\n        svg {\n          fill: #000;\n        }\n      }\n\n      &.dark {\n        &:hover {\n          background-color: @header-dark-bg-hover-color;\n        }\n      }\n    }\n  }\n\n  &-menu {\n    height: 100%;\n    min-width: 0;\n    flex: 1;\n    align-items: center;\n  }\n\n  &-action {\n    display: flex;\n    min-width: 180px;\n    // padding-right: 12px;\n    align-items: center;\n\n    &__item {\n      display: flex !important;\n      height: @header-height;\n      padding: 0 2px;\n      font-size: 1.2em;\n      cursor: pointer;\n      align-items: center;\n\n      .ant-badge {\n        height: @header-height;\n        line-height: @header-height;\n      }\n\n      .ant-badge-dot {\n        top: 10px;\n        right: 2px;\n      }\n    }\n\n    span[role='img'] {\n      padding: 0 8px;\n    }\n  }\n\n  &--light {\n    background-color: @white !important;\n    border-bottom: 1px solid @header-light-bottom-border-color;\n    border-left: 1px solid @header-light-bottom-border-color;\n\n    .@{header-prefix-cls}-logo {\n      color: @text-color-base;\n\n      &:hover {\n        background-color: @header-light-bg-hover-color;\n      }\n    }\n\n    .@{header-prefix-cls}-action {\n      &__item {\n        color: @text-color-base;\n\n        .app-iconify {\n          padding: 0 10px;\n          font-size: 16px !important;\n        }\n\n        &:hover {\n          background-color: @header-light-bg-hover-color;\n        }\n      }\n\n      &-icon,\n      span[role='img'] {\n        color: @text-color-base;\n      }\n    }\n  }\n\n  &--dark {\n    background-color: @header-dark-bg-color !important;\n    // border-bottom: 1px solid @border-color-base;\n    // update-begin--author:liaozhiyang---date:20250818---for：【issues/8709】LayoutContent样式多出1px\n    // border-left: 1px solid @border-color-base;\n    // update-end--author:liaozhiyang---date:20250818---for：【issues/8709】LayoutContent样式多出1px\n\n    .@{header-prefix-cls}-logo {\n      &:hover {\n        background-color: @header-dark-bg-hover-color;\n      }\n    }\n\n    .@{header-prefix-cls}-action {\n      &__item {\n        .app-iconify {\n          padding: 0 10px;\n          font-size: 16px !important;\n        }\n\n        .ant-badge {\n          span {\n            color: @white;\n          }\n        }\n\n        &:hover {\n          background-color: @header-dark-bg-hover-color;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/header/index.vue",
    "content": "<template>\n  <Header :class=\"getHeaderClass\">\n    <!-- left start -->\n    <div :class=\"`${prefixCls}-left`\">\n      <!-- logo -->\n      <AppLogo v-if=\"getShowHeaderLogo || getIsMobile\" :class=\"`${prefixCls}-logo`\" :theme=\"getHeaderTheme\" :style=\"getLogoWidth\" />\n      <LayoutTrigger\n        v-if=\"(getShowContent && getShowHeaderTrigger && !getSplit && !getIsMixSidebar) || getIsMobile\"\n        :theme=\"getHeaderTheme\"\n        :sider=\"false\"\n      />\n      <LayoutBreadcrumb v-if=\"getShowContent && getShowBread\" :theme=\"getHeaderTheme\" />\n      <!-- 欢迎语 -->\n      <span v-if=\"getShowContent && getShowBreadTitle && !getIsMobile\" :class=\"[prefixCls, `${prefixCls}--${getHeaderTheme}`,'headerIntroductionClass']\"> {{t('layout.header.welcomeIn')}} {{ title }} </span>\n    </div>\n    <!-- left end -->\n\n    <!-- menu start -->\n    <div :class=\"`${prefixCls}-menu`\" v-if=\"getShowTopMenu && !getIsMobile\">\n      <LayoutMenu :isHorizontal=\"true\" :theme=\"getHeaderTheme\" :splitType=\"getSplitType\" :menuMode=\"getMenuMode\" />\n    </div>\n    <!-- menu-end -->\n\n    <!-- action  -->\n    <div :class=\"`${prefixCls}-action`\">\n      <AppSearch :class=\"`${prefixCls}-action__item `\" v-if=\"getShowSearch\" />\n\n      <ErrorAction v-if=\"getUseErrorHandle\" :class=\"`${prefixCls}-action__item error-action`\" />\n\n      <Notify v-if=\"getShowNotice\" :class=\"`${prefixCls}-action__item notify-item`\" />\n\n      <FullScreen v-if=\"getShowFullScreen\" :class=\"`${prefixCls}-action__item fullscreen-item`\" />\n\n      <LockScreen v-if=\"getUseLockPage\" />\n\n      <AppLocalePicker v-if=\"getShowLocalePicker\" :reload=\"true\" :showText=\"false\" :class=\"`${prefixCls}-action__item`\" />\n\n      <UserDropDown :theme=\"getHeaderTheme\" />\n\n      <SettingDrawer v-if=\"getShowSetting\" :class=\"`${prefixCls}-action__item`\" />\n      <!-- ai助手 -->\n      <Aide v-if=\"getAiIconShow\"></Aide>\n    </div>\n  </Header>\n  <LoginSelect ref=\"loginSelectRef\" @success=\"loginSelectOk\"></LoginSelect>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, unref, computed, ref, onMounted, toRaw } from 'vue';\n  import { useGlobSetting } from '/@/hooks/setting';\n  import { propTypes } from '/@/utils/propTypes';\n\n  import { Layout } from 'ant-design-vue';\n  import { AppLogo } from '/@/components/Application';\n  import LayoutMenu from '../menu/index.vue';\n  import LayoutTrigger from '../trigger/index.vue';\n\n  import { AppSearch } from '/@/components/Application';\n\n  import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';\n  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\n  import { useRootSetting } from '/@/hooks/setting/useRootSetting';\n\n  import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';\n  import { SettingButtonPositionEnum } from '/@/enums/appEnum';\n  import { AppLocalePicker } from '/@/components/Application';\n\n  import { UserDropDown, LayoutBreadcrumb, FullScreen, Notify, ErrorAction, LockScreen } from './components';\n  import { useAppInject } from '/@/hooks/web/useAppInject';\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n  import { useLocale } from '/@/locales/useLocale';\n\n  import LoginSelect from '/@/views/sys/login/LoginSelect.vue';\n  import { useUserStore } from '/@/store/modules/user';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import Aide from \"@/views/dashboard/ai/components/aide/index.vue\"\n  const { t } = useI18n();\n\n  export default defineComponent({\n    name: 'LayoutHeader',\n    components: {\n      Header: Layout.Header,\n      AppLogo,\n      LayoutTrigger,\n      LayoutBreadcrumb,\n      LayoutMenu,\n      UserDropDown,\n      AppLocalePicker,\n      FullScreen,\n      Notify,\n      AppSearch,\n      ErrorAction,\n      LockScreen,\n      LoginSelect,\n      SettingDrawer: createAsyncComponent(() => import('/@/layouts/default/setting/index.vue'), {\n        loading: true,\n      }),\n      Aide\n    },\n    props: {\n      fixed: propTypes.bool,\n    },\n    setup(props) {\n      const { prefixCls } = useDesign('layout-header');\n      const userStore = useUserStore();\n      const { getShowTopMenu, getShowHeaderTrigger, getSplit, getIsMixMode, getMenuWidth, getIsMixSidebar } = useMenuSetting();\n      const { getUseErrorHandle, getShowSettingButton, getSettingButtonPosition, getAiIconShow } = useRootSetting();\n      const { title } = useGlobSetting();\n\n      const {\n        getHeaderTheme,\n        getShowFullScreen,\n        getShowNotice,\n        getShowContent,\n        getShowBread,\n        getShowHeaderLogo,\n        getShowHeader,\n        getShowSearch,\n        getUseLockPage,\n        getShowBreadTitle,\n      } = useHeaderSetting();\n\n      const { getShowLocalePicker } = useLocale();\n\n      const { getIsMobile } = useAppInject();\n\n      const getHeaderClass = computed(() => {\n        const theme = unref(getHeaderTheme);\n        return [\n          prefixCls,\n          {\n            [`${prefixCls}--fixed`]: props.fixed,\n            [`${prefixCls}--mobile`]: unref(getIsMobile),\n            [`${prefixCls}--${theme}`]: theme,\n          },\n        ];\n      });\n\n      const getShowSetting = computed(() => {\n        if (!unref(getShowSettingButton)) {\n          return false;\n        }\n        const settingButtonPosition = unref(getSettingButtonPosition);\n\n        if (settingButtonPosition === SettingButtonPositionEnum.AUTO) {\n          return unref(getShowHeader);\n        }\n        return settingButtonPosition === SettingButtonPositionEnum.HEADER;\n      });\n\n      const getLogoWidth = computed(() => {\n        if (!unref(getIsMixMode) || unref(getIsMobile)) {\n          return {};\n        }\n        const width = unref(getMenuWidth) < 180 ? 180 : unref(getMenuWidth);\n        return { width: `${width}px` };\n      });\n\n      const getSplitType = computed(() => {\n        return unref(getSplit) ? MenuSplitTyeEnum.TOP : MenuSplitTyeEnum.NONE;\n      });\n\n      const getMenuMode = computed(() => {\n        return unref(getSplit) ? MenuModeEnum.HORIZONTAL : null;\n      });\n\n      /**\n       * 首页多租户部门弹窗逻辑\n       */\n      const loginSelectRef = ref();\n\n      function showLoginSelect() {\n        //判断是否是登陆进来\n        const loginInfo = toRaw(userStore.getLoginInfo) || {};\n        if (!!loginInfo.isLogin) {\n          loginSelectRef.value.show(loginInfo);\n        }\n      }\n\n      function loginSelectOk() {\n        console.log('成功。。。。。');\n      }\n\n      onMounted(() => {\n        showLoginSelect();\n      });\n\n      return {\n        prefixCls,\n        getHeaderClass,\n        getShowHeaderLogo,\n        getHeaderTheme,\n        getShowHeaderTrigger,\n        getIsMobile,\n        getShowBreadTitle,\n        getShowBread,\n        getShowContent,\n        getSplitType,\n        getSplit,\n        getMenuMode,\n        getShowTopMenu,\n        getShowLocalePicker,\n        getShowFullScreen,\n        getShowNotice,\n        getUseErrorHandle,\n        getLogoWidth,\n        getIsMixSidebar,\n        getShowSettingButton,\n        getShowSetting,\n        getShowSearch,\n        getUseLockPage,\n        loginSelectOk,\n        loginSelectRef,\n        title,\n        t,\n        getAiIconShow\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @import './index.less';\n  //顶部欢迎语展示样式\n  @prefix-cls: ~'@{namespace}-layout-header';\n\n  .ant-layout .@{prefix-cls} {\n    display: flex;\n    padding: 0 8px;\n    // 代码逻辑说明: 【QQYUN-8762】顶栏高度\n    height: @header-height;\n    align-items: center;\n\n    .headerIntroductionClass {\n      margin-right: 4px;\n      margin-bottom: 2px;\n      border-bottom: 0px;\n      border-left: 0px;\n    }\n\n    &--light {\n      .headerIntroductionClass {\n        color: #000;\n      }\n    }\n\n    &--dark {\n      .headerIntroductionClass {\n        color: rgba(255, 255, 255, 1);\n      }\n      .anticon, .truncate {\n        color: rgba(255, 255, 255, 1);\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/index.vue",
    "content": "<template>\n  <Layout :class=\"prefixCls\" v-bind=\"lockEvents\">\n    <LayoutFeatures />\n    <LayoutHeader fixed v-if=\"getShowFullHeaderRef\" />\n    <Layout :class=\"[layoutClass]\">\n      <LayoutSideBar v-if=\"getShowSidebar || getIsMobile\" />\n      <Layout :class=\"`${prefixCls}-main`\">\n        <LayoutMultipleHeader />\n        <LayoutContent />\n        <LayoutFooter />\n      </Layout>\n    </Layout>\n  </Layout>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, computed, unref, ref } from 'vue';\n  import { Layout } from 'ant-design-vue';\n  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n\n  import LayoutHeader from './header/index.vue';\n  import LayoutContent from './content/index.vue';\n  import LayoutSideBar from './sider/index.vue';\n  import LayoutMultipleHeader from './header/MultipleHeader.vue';\n\n  import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';\n  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useLockPage } from '/@/hooks/web/useLockPage';\n\n  import { useAppInject } from '/@/hooks/web/useAppInject';\n\n  export default defineComponent({\n    name: 'DefaultLayout',\n    components: {\n      LayoutFeatures: createAsyncComponent(() => import('/@/layouts/default/feature/index.vue')),\n      LayoutFooter: createAsyncComponent(() => import('/@/layouts/default/footer/index.vue')),\n      LayoutHeader,\n      LayoutContent,\n      LayoutSideBar,\n      LayoutMultipleHeader,\n      Layout,\n    },\n    setup() {\n      const { prefixCls } = useDesign('default-layout');\n      const { getIsMobile } = useAppInject();\n      const { getShowFullHeaderRef } = useHeaderSetting();\n      const { getShowSidebar, getIsMixSidebar, getShowMenu } = useMenuSetting();\n\n      // Create a lock screen monitor\n      const lockEvents = useLockPage();\n\n      const layoutClass = computed(() => {\n        let cls: string[] = ['ant-layout'];\n        if (unref(getIsMixSidebar) || unref(getShowMenu)) {\n          cls.push('ant-layout-has-sider');\n        }\n        return cls;\n      });\n\n      return {\n        getShowFullHeaderRef,\n        getShowSidebar,\n        prefixCls,\n        getIsMobile,\n        getIsMixSidebar,\n        layoutClass,\n        lockEvents,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-default-layout';\n\n  .@{prefix-cls} {\n    display: flex;\n    width: 100%;\n    min-height: 100%;\n    background-color: @content-bg;\n    flex-direction: column;\n\n    > .ant-layout {\n      min-height: 100%;\n    }\n\n    &-main {\n      width: 100%;\n      // 代码逻辑说明:【issues/8709】LayoutContent样式多出1px\n      // margin-left: 1px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/menu/index.vue",
    "content": "<script lang=\"tsx\">\n  import type { PropType, CSSProperties } from 'vue';\n\n  import { computed, defineComponent, unref, toRef } from 'vue';\n  import { BasicMenu } from '/@/components/Menu';\n  import { SimpleMenu } from '/@/components/SimpleMenu';\n  import { AppLogo } from '/@/components/Application';\n\n  import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';\n\n  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\n  import { ScrollContainer } from '/@/components/Container';\n\n  import { useGo } from '/@/hooks/web/usePage';\n  import { useGlobSetting } from \"/@/hooks/setting\";\n  import { useSplitMenu } from './useLayoutMenu';\n  import { openWindow } from '/@/utils';\n  import { propTypes } from '/@/utils/propTypes';\n  import { isUrl } from '/@/utils/is';\n  import { useRootSetting } from '/@/hooks/setting/useRootSetting';\n  import { useAppInject } from '/@/hooks/web/useAppInject';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useLocaleStore } from '/@/store/modules/locale';\n\n  export default defineComponent({\n    name: 'LayoutMenu',\n    props: {\n      theme: propTypes.oneOf(['light', 'dark']),\n\n      splitType: {\n        type: Number as PropType<MenuSplitTyeEnum>,\n        default: MenuSplitTyeEnum.NONE,\n      },\n\n      isHorizontal: propTypes.bool,\n      // menu Mode\n      menuMode: {\n        type: [String] as PropType<Nullable<MenuModeEnum>>,\n        default: '',\n      },\n    },\n    setup(props) {\n      const go = useGo();\n\n      const {\n        getMenuMode,\n        getMenuType,\n        getMenuTheme,\n        getCollapsed,\n        getCollapsedShowTitle,\n        getAccordion,\n        getIsHorizontal,\n        getIsSidebarType,\n        getSplit,\n      } = useMenuSetting();\n      const { getShowLogo } = useRootSetting();\n\n      const { prefixCls } = useDesign('layout-menu');\n\n      const glob = useGlobSetting()\n\n      const { menusRef } = useSplitMenu(toRef(props, 'splitType'));\n\n      const { getIsMobile } = useAppInject();\n\n      const getComputedMenuMode = computed(() => (unref(getIsMobile) ? MenuModeEnum.INLINE : props.menuMode || unref(getMenuMode)));\n\n      const getComputedMenuTheme = computed(() => props.theme || unref(getMenuTheme));\n\n      const getIsShowLogo = computed(() => unref(getShowLogo) && unref(getIsSidebarType));\n\n      const getUseScroll = computed(() => {\n        // 【JEECG作为乾坤子应用】在乾坤子应用下，菜单不固定\n        if (glob.isQiankunMicro) {\n          return false;\n        }\n\n        return (\n          !unref(getIsHorizontal) &&\n          (unref(getIsSidebarType) || props.splitType === MenuSplitTyeEnum.LEFT || props.splitType === MenuSplitTyeEnum.NONE)\n        );\n      });\n\n      const getWrapperStyle = computed((): CSSProperties => {\n        return {\n          // 代码逻辑说明: 【issues/7548】侧边栏导航模式时会导致下面菜单滚动显示不全\n          height: `calc(100% - ${unref(getIsShowLogo) ? '60px' : '0px'})`,\n        };\n      });\n\n      const getLogoClass = computed(() => {\n        return [\n          `${prefixCls}-logo`,\n          unref(getComputedMenuTheme),\n          {\n            [`${prefixCls}--mobile`]: unref(getIsMobile),\n          },\n        ];\n      });\n\n      const getCommonProps = computed(() => {\n        const menus = unref(menusRef);\n        return {\n          menus,\n          beforeClickFn: beforeMenuClickFn,\n          items: menus,\n          theme: unref(getComputedMenuTheme),\n          accordion: unref(getAccordion),\n          collapse: unref(getCollapsed),\n          collapsedShowTitle: unref(getCollapsedShowTitle),\n          onMenuClick: handleMenuClick,\n        };\n      });\n      /**\n       * click menu\n       * @param menu\n       */\n      // 代码逻辑说明: VUEN-1144 online 配置成菜单后，打开菜单，显示名称未展示为菜单名称\n      const localeStore = useLocaleStore();\n      function handleMenuClick(path: string, item) {\n        if (item) {\n          localeStore.setPathTitle(path, item.title || '');\n        }\n        go(path);\n      }\n\n      /**\n       * before click menu\n       * @param menu\n       */\n      async function beforeMenuClickFn(path: string) {\n        if (!isUrl(path)) {\n          return true;\n        }\n        openWindow(path);\n        return false;\n      }\n\n      function renderHeader() {\n        if (!unref(getIsShowLogo) && !unref(getIsMobile)) return null;\n\n        return <AppLogo showTitle={!unref(getCollapsed)} class={unref(getLogoClass)} theme={unref(getComputedMenuTheme)} />;\n      }\n\n      function renderMenu() {\n        const { menus, ...menuProps } = unref(getCommonProps);\n        // console.log(menus);\n        if (!menus || !menus.length) return null;\n        return !props.isHorizontal ? (\n          <SimpleMenu {...menuProps} isSplitMenu={unref(getSplit)} items={menus} />\n        ) : (\n          <BasicMenu\n            {...(menuProps as any)}\n            isHorizontal={props.isHorizontal}\n            type={unref(getMenuType)}\n            showLogo={unref(getIsShowLogo)}\n            mode={unref(getComputedMenuMode as any)}\n            items={menus}\n          />\n        );\n      }\n\n      return () => {\n        return (\n          <>\n            {renderHeader()}\n            {unref(getUseScroll) ? <ScrollContainer style={unref(getWrapperStyle)}>{() => renderMenu()}</ScrollContainer> : renderMenu()}\n          </>\n        );\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  // 代码逻辑说明: 【QQYUN-5872】菜单优化，上下滚动条去掉\n  .scroll-container :deep(.scrollbar__bar) {\n    display: none;\n  }\n</style>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-layout-menu';\n  @logo-prefix-cls: ~'@{namespace}-app-logo';\n\n  .@{prefix-cls} {\n    &-logo {\n      height: @header-height;\n      padding: 10px 4px 10px 10px;\n\n      img {\n        width: @logo-width;\n        height: @logo-width;\n      }\n    }\n\n    &--mobile {\n      .@{logo-prefix-cls} {\n        &__title {\n          opacity: 1;\n        }\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/menu/useLayoutMenu.ts",
    "content": "import type { Menu } from '/@/router/types';\nimport type { Ref } from 'vue';\nimport { watch, unref, ref, computed } from 'vue';\nimport { useRouter } from 'vue-router';\nimport { MenuSplitTyeEnum, MenuTypeEnum } from '/@/enums/menuEnum';\nimport { useThrottleFn } from '@vueuse/core';\nimport { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\nimport { getChildrenMenus, getCurrentParentPath, getMenus, getShallowMenus } from '/@/router/menus';\nimport { usePermissionStore } from '/@/store/modules/permission';\nimport { useAppInject } from '/@/hooks/web/useAppInject';\nimport { PAGE_NOT_FOUND_NAME_404 } from '/@/router/constant';\n\nexport function useSplitMenu(splitType: Ref<MenuSplitTyeEnum>) {\n  // Menu array\n  const menusRef = ref<Menu[]>([]);\n  const { currentRoute } = useRouter();\n  const { getIsMobile } = useAppInject();\n  const permissionStore = usePermissionStore();\n  const { setMenuSetting, getIsHorizontal, getSplit, getMenuType } = useMenuSetting();\n\n  const throttleHandleSplitLeftMenu = useThrottleFn(handleSplitLeftMenu, 50);\n\n  const splitNotLeft = computed(() => unref(splitType) !== MenuSplitTyeEnum.LEFT && !unref(getIsHorizontal));\n\n  const getSplitLeft = computed(() => !unref(getSplit) || unref(splitType) !== MenuSplitTyeEnum.LEFT);\n\n  const getSpiltTop = computed(() => unref(splitType) === MenuSplitTyeEnum.TOP);\n\n  const normalType = computed(() => {\n    return unref(splitType) === MenuSplitTyeEnum.NONE || !unref(getSplit);\n  });\n\n  watch(\n    [() => unref(currentRoute).path, () => unref(splitType)],\n    async ([path]: [string, MenuSplitTyeEnum]) => {\n      if (unref(splitNotLeft) || unref(getIsMobile)) return;\n      const { meta } = unref(currentRoute);\n      const currentActiveMenu = meta.currentActiveMenu as string;\n      // 顶部混合模式且顶部左侧组合菜单开始时\n      if (unref(getMenuType) === MenuTypeEnum.MIX && unref(getSplit)) { \n        // 404页面时，跳转到重定向的路径\n        if (unref(currentRoute).name === PAGE_NOT_FOUND_NAME_404 && unref(currentRoute)?.redirectedFrom?.path) {\n          const menus = await getMenus();\n          const findItem = menus.find((item:any) => item.redirect === unref(currentRoute).path);\n          if (findItem) {\n            // 说明是从一级菜单重定向过来的\n            path = findItem.path;\n          }\n        }\n      }\n      let parentPath = await getCurrentParentPath(path);\n      if (!parentPath) {\n        parentPath = await getCurrentParentPath(currentActiveMenu);\n      }\n      parentPath && throttleHandleSplitLeftMenu(parentPath);\n    },\n    {\n      immediate: true,\n    }\n  );\n\n  // Menu changes\n  watch(\n    [() => permissionStore.getLastBuildMenuTime, () => permissionStore.getBackMenuList],\n    () => {\n      genMenus();\n    },\n    {\n      immediate: true,\n    }\n  );\n\n  // split Menu changes\n  watch(\n    () => getSplit.value,\n    () => {\n      // if (unref(splitNotLeft)) return;\n      genMenus();\n    }\n  );\n\n  // Handle left menu split\n  async function handleSplitLeftMenu(parentPath: string) {\n    if (unref(getSplitLeft) || unref(getIsMobile)) return;\n\n    // spilt mode left\n    const children = await getChildrenMenus(parentPath);\n\n    if (!children || !children.length) {\n      setMenuSetting({ hidden: true });\n      menusRef.value = [];\n      return;\n    }\n\n    setMenuSetting({ hidden: false });\n    menusRef.value = children;\n  }\n\n  // get menus\n  async function genMenus() {\n    // normal mode\n    if (unref(normalType) || unref(getIsMobile)) {\n      menusRef.value = await getMenus();\n      return;\n    }\n\n    // split-top\n    if (unref(getSpiltTop)) {\n      const shallowMenus = await getShallowMenus();\n\n      menusRef.value = shallowMenus;\n      return;\n    }\n  }\n\n  return { menusRef };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/setting/SettingDrawer.tsx",
    "content": "import { defineComponent, computed, unref } from 'vue';\nimport { BasicDrawer } from '/@/components/Drawer/index';\nimport { Divider } from 'ant-design-vue';\nimport { TypePicker, ThemeColorPicker, SettingFooter, SwitchItem, SelectItem, InputNumberItem } from './components';\n\nimport { AppDarkModeToggle } from '/@/components/Application';\n\nimport { MenuTypeEnum, TriggerEnum } from '/@/enums/menuEnum';\n\nimport { useRootSetting } from '/@/hooks/setting/useRootSetting';\nimport { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\nimport { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';\nimport { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';\nimport { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';\nimport { useI18n } from '/@/hooks/web/useI18n';\n\nimport { layoutHandler } from './handler';\n\nimport {\n  HandlerEnum,\n  contentModeOptions,\n  topMenuAlignOptions,\n  getMenuTriggerOptions,\n  routerTransitionOptions,\n  menuTypeList,\n  mixSidebarTriggerOptions,\n  tabsThemeOptions,\n} from './enum';\n\nimport { HEADER_PRESET_BG_COLOR_LIST, SIDE_BAR_BG_COLOR_LIST, APP_PRESET_COLOR_LIST } from '/@/settings/designSetting';\n\nconst { t } = useI18n();\n\nexport default defineComponent({\n  name: 'SettingDrawer',\n  setup(_, { attrs }) {\n    const {\n      getContentMode,\n      getShowFooter,\n      getShowBreadCrumb,\n      getShowBreadCrumbIcon,\n      getShowLogo,\n      getFullContent,\n      getColorWeak,\n      getGrayMode,\n      getLockTime,\n      getShowDarkModeToggle,\n      getThemeColor,\n      getAiIconShow,\n    } = useRootSetting();\n\n    const { getOpenPageLoading, getBasicTransition, getEnableTransition, getOpenNProgress } = useTransitionSetting();\n\n    const {\n      getIsHorizontal,\n      getShowMenu,\n      getMenuType,\n      getTrigger,\n      getCollapsedShowTitle,\n      getMenuFixed,\n      getCollapsed,\n      getCanDrag,\n      getTopMenuAlign,\n      getAccordion,\n      getMenuWidth,\n      getMenuBgColor,\n      getIsTopMenu,\n      getSplit,\n      getIsMixSidebar,\n      getCloseMixSidebarOnChange,\n      getMixSideTrigger,\n      getMixSideFixed,\n    } = useMenuSetting();\n\n    const { getShowHeader, getFixed: getHeaderFixed, getHeaderBgColor, getShowSearch } = useHeaderSetting();\n\n    const { getShowMultipleTab, getShowQuick, getShowRedo, getShowFold, getTabsTheme } = useMultipleTabSetting();\n\n    const getShowMenuRef = computed(() => {\n      return unref(getShowMenu) && !unref(getIsHorizontal);\n    });\n\n    const isDev= import.meta.env.DEV\n\n    function renderSidebar() {\n      return (\n        <>\n          <TypePicker\n            menuTypeList={menuTypeList}\n            handler={(item: typeof menuTypeList[0]) => {\n              layoutHandler(HandlerEnum.CHANGE_LAYOUT, {\n                mode: item.mode,\n                type: item.type,\n                split: unref(getIsHorizontal) ? false : undefined,\n              });\n            }}\n            def={unref(getMenuType)}\n          />\n        </>\n      );\n    }\n\n    function renderHeaderTheme() {\n      return <ThemeColorPicker colorList={HEADER_PRESET_BG_COLOR_LIST} def={unref(getHeaderBgColor)} event={HandlerEnum.HEADER_THEME} />;\n    }\n\n    function renderSiderTheme() {\n      return <ThemeColorPicker colorList={SIDE_BAR_BG_COLOR_LIST} def={unref(getMenuBgColor)} event={HandlerEnum.MENU_THEME} />;\n    }\n\n    function renderMainTheme() {\n      return <ThemeColorPicker colorList={APP_PRESET_COLOR_LIST} def={unref(getThemeColor)} event={HandlerEnum.CHANGE_THEME_COLOR} />;\n    }\n\n    /**\n     * @description:\n     */\n    function renderFeatures() {\n      let triggerDef = unref(getTrigger);\n\n      const triggerOptions = getMenuTriggerOptions(unref(getSplit));\n      const some = triggerOptions.some((item) => item.value === triggerDef);\n      if (!some) {\n        triggerDef = TriggerEnum.FOOTER;\n      }\n\n      return (\n        <>\n          <SwitchItem\n            title={t('layout.setting.splitMenu')}\n            event={HandlerEnum.MENU_SPLIT}\n            def={unref(getSplit)}\n            disabled={!unref(getShowMenuRef) || unref(getMenuType) !== MenuTypeEnum.MIX}\n          />\n          {/*<SwitchItem*/}\n          {/*  title={t('layout.setting.mixSidebarFixed')}*/}\n          {/*  event={HandlerEnum.MENU_FIXED_MIX_SIDEBAR}*/}\n          {/*  def={unref(getMixSideFixed)}*/}\n          {/*  disabled={!unref(getIsMixSidebar)}*/}\n          {/*/>*/}\n\n          {/*<SwitchItem*/}\n          {/*  title={t('layout.setting.closeMixSidebarOnChange')}*/}\n          {/*  event={HandlerEnum.MENU_CLOSE_MIX_SIDEBAR_ON_CHANGE}*/}\n          {/*  def={unref(getCloseMixSidebarOnChange)}*/}\n          {/*  disabled={!unref(getIsMixSidebar)}*/}\n          {/*/>*/}\n          {/*<SwitchItem*/}\n          {/*  title={t('layout.setting.menuCollapse')}*/}\n          {/*  event={HandlerEnum.MENU_COLLAPSED}*/}\n          {/*  def={unref(getCollapsed)}*/}\n          {/*  disabled={!unref(getShowMenuRef)}*/}\n          {/*/>*/}\n\n          {/*<SwitchItem*/}\n          {/*  title={t('layout.setting.menuSearch')}*/}\n          {/*  event={HandlerEnum.HEADER_SEARCH}*/}\n          {/*  def={unref(getShowSearch)}*/}\n          {/*  disabled={!unref(getShowHeader)}*/}\n          {/*/>*/}\n          {/*<SwitchItem*/}\n          {/*  title={t('layout.setting.menuAccordion')}*/}\n          {/*  event={HandlerEnum.MENU_ACCORDION}*/}\n          {/*  def={unref(getAccordion)}*/}\n          {/*  disabled={!unref(getShowMenuRef)}*/}\n          {/*/>*/}\n\n          {/*<SwitchItem*/}\n          {/*  title={t('layout.setting.fixedHeader')}*/}\n          {/*  event={HandlerEnum.HEADER_FIXED}*/}\n          {/*  def={unref(getHeaderFixed)}*/}\n          {/*  disabled={!unref(getShowHeader)}*/}\n          {/*/>*/}\n          {/*<SwitchItem*/}\n          {/*  title={t('layout.setting.fixedSideBar')}*/}\n          {/*  event={HandlerEnum.MENU_FIXED}*/}\n          {/*  def={unref(getMenuFixed)}*/}\n          {/*  disabled={!unref(getShowMenuRef) || unref(getIsMixSidebar)}*/}\n          {/*/>*/}\n          {/*<SelectItem*/}\n          {/*  title={t('layout.setting.mixSidebarTrigger')}*/}\n          {/*  event={HandlerEnum.MENU_TRIGGER_MIX_SIDEBAR}*/}\n          {/*  def={unref(getMixSideTrigger)}*/}\n          {/*  options={mixSidebarTriggerOptions}*/}\n          {/*  disabled={!unref(getIsMixSidebar)}*/}\n          {/*/>*/}\n          <SelectItem title={t('layout.setting.tabsTheme')} event={HandlerEnum.TABS_THEME} def={unref(getTabsTheme)} options={tabsThemeOptions} />\n          <SelectItem\n            title={t('layout.setting.topMenuLayout')}\n            event={HandlerEnum.MENU_TOP_ALIGN}\n            def={unref(getTopMenuAlign)}\n            options={topMenuAlignOptions}\n            disabled={!unref(getShowHeader) || unref(getSplit) || (!unref(getIsTopMenu) && !unref(getSplit)) || unref(getIsMixSidebar)}\n          />\n          <SelectItem\n            title={t('layout.setting.menuCollapseButton')}\n            event={HandlerEnum.MENU_TRIGGER}\n            def={triggerDef}\n            options={triggerOptions}\n            disabled={!unref(getShowMenuRef) || unref(getIsMixSidebar)}\n          />\n          {\n            isDev && <SelectItem\n              title={t('layout.setting.contentMode')}\n              event={HandlerEnum.CONTENT_MODE}\n              def={unref(getContentMode)}\n              options={contentModeOptions}\n            />\n          }\n          {\n            isDev && <InputNumberItem\n              title={t('layout.setting.autoScreenLock')}\n              min={0}\n              event={HandlerEnum.LOCK_TIME}\n              defaultValue={unref(getLockTime)}\n              formatter={(value: string) => {\n                return parseInt(value) === 0 ? `0(${t('layout.setting.notAutoScreenLock')})` : `${value}${t('layout.setting.minute')}`;\n              }}\n            />\n          }\n          {\n            isDev && <InputNumberItem\n              title={t('layout.setting.expandedMenuWidth')}\n              max={600}\n              min={100}\n              step={10}\n              event={HandlerEnum.MENU_WIDTH}\n              disabled={!unref(getShowMenuRef)}\n              defaultValue={unref(getMenuWidth)}\n              formatter={(value: string) => `${parseInt(value)}px`}\n            />\n          }\n        </>\n      );\n    }\n\n    function renderContent() {\n      return (\n        <>\n          {\n            isDev && <SwitchItem\n              title={t('layout.setting.menuDrag')}\n              event={HandlerEnum.MENU_HAS_DRAG}\n              def={unref(getCanDrag)}\n              disabled={!unref(getShowMenuRef)}\n            />\n          }\n          {\n            isDev &&  <SwitchItem\n              title={t('layout.setting.collapseMenuDisplayName')}\n              event={HandlerEnum.MENU_COLLAPSED_SHOW_TITLE}\n              def={unref(getCollapsedShowTitle)}\n              disabled={!unref(getShowMenuRef) || !unref(getCollapsed) || unref(getIsMixSidebar)}\n            />\n          }\n          <SwitchItem title={t('layout.setting.tabs')} event={HandlerEnum.TABS_SHOW} def={unref(getShowMultipleTab)} />\n          <SwitchItem\n            title={t('layout.setting.breadcrumb')}\n            event={HandlerEnum.SHOW_BREADCRUMB}\n            def={unref(getShowBreadCrumb)}\n            disabled={!unref(getShowHeader)}\n          />\n\n          {/*<SwitchItem*/}\n          {/*  title={t('layout.setting.breadcrumbIcon')}*/}\n          {/*  event={HandlerEnum.SHOW_BREADCRUMB_ICON}*/}\n          {/*  def={unref(getShowBreadCrumbIcon)}*/}\n          {/*  disabled={!unref(getShowHeader)}*/}\n          {/*/>*/}\n\n          {/*<SwitchItem*/}\n          {/*  title={t('layout.setting.tabsRedoBtn')}*/}\n          {/*  event={HandlerEnum.TABS_SHOW_REDO}*/}\n          {/*  def={unref(getShowRedo)}*/}\n          {/*  disabled={!unref(getShowMultipleTab)}*/}\n          {/*/>*/}\n\n          {/*<SwitchItem*/}\n          {/*  title={t('layout.setting.tabsQuickBtn')}*/}\n          {/*  event={HandlerEnum.TABS_SHOW_QUICK}*/}\n          {/*  def={unref(getShowQuick)}*/}\n          {/*  disabled={!unref(getShowMultipleTab)}*/}\n          {/*/>*/}\n          {/*<SwitchItem*/}\n          {/*  title={t('layout.setting.tabsFoldBtn')}*/}\n          {/*  event={HandlerEnum.TABS_SHOW_FOLD}*/}\n          {/*  def={unref(getShowFold)}*/}\n          {/*  disabled={!unref(getShowMultipleTab)}*/}\n          {/*/>*/}\n\n          {/*<SwitchItem*/}\n          {/*  title={t('layout.setting.sidebar')}*/}\n          {/*  event={HandlerEnum.MENU_SHOW_SIDEBAR}*/}\n          {/*  def={unref(getShowMenu)}*/}\n          {/*  disabled={unref(getIsHorizontal)}*/}\n          {/*/>*/}\n\n          {/*<SwitchItem*/}\n          {/*  title={t('layout.setting.header')}*/}\n          {/*  event={HandlerEnum.HEADER_SHOW}*/}\n          {/*  def={unref(getShowHeader)}*/}\n          {/*/>*/}\n          {/*<SwitchItem*/}\n          {/*  title=\"Logo\"*/}\n          {/*  event={HandlerEnum.SHOW_LOGO}*/}\n          {/*  def={unref(getShowLogo)}*/}\n          {/*  disabled={unref(getIsMixSidebar)}*/}\n          {/*/>*/}\n          <SwitchItem title={t('layout.setting.footer')} event={HandlerEnum.SHOW_FOOTER} def={unref(getShowFooter)} />\n          {/*<SwitchItem*/}\n          {/*  title={t('layout.setting.fullContent')}*/}\n          {/*  event={HandlerEnum.FULL_CONTENT}*/}\n          {/*  def={unref(getFullContent)}*/}\n          {/*/>*/}\n\n          <SwitchItem title={t('layout.setting.grayMode')} event={HandlerEnum.GRAY_MODE} def={unref(getGrayMode)} />\n\n          <SwitchItem title={t('layout.setting.colorWeak')} event={HandlerEnum.COLOR_WEAK} def={unref(getColorWeak)} />\n\n           <SwitchItem title={t('layout.setting.aiIconSHow')} event={HandlerEnum.AI_ICON_SHOW} def={unref(getAiIconShow)} />\n        </>\n      );\n    }\n\n    function renderTransition() {\n      return (\n        <>\n          <SwitchItem title={t('layout.setting.progress')} event={HandlerEnum.OPEN_PROGRESS} def={unref(getOpenNProgress)} />\n          <SwitchItem title={t('layout.setting.switchLoading')} event={HandlerEnum.OPEN_PAGE_LOADING} def={unref(getOpenPageLoading)} />\n\n          <SwitchItem title={t('layout.setting.switchAnimation')} event={HandlerEnum.OPEN_ROUTE_TRANSITION} def={unref(getEnableTransition)} />\n\n          <SelectItem\n            title={t('layout.setting.animationType')}\n            event={HandlerEnum.ROUTER_TRANSITION}\n            def={unref(getBasicTransition)}\n            options={routerTransitionOptions}\n            disabled={!unref(getEnableTransition)}\n          />\n        </>\n      );\n    }\n\n    return () => (\n      <BasicDrawer {...attrs} title={t('layout.setting.drawerTitle')} width={330} class=\"setting-drawer\">\n        {unref(getShowDarkModeToggle) && <Divider>{() => t('layout.setting.darkMode')}</Divider>}\n        {unref(getShowDarkModeToggle) && <AppDarkModeToggle class=\"mx-auto\" />}\n        <Divider>{() => t('layout.setting.navMode')}</Divider>\n        {renderSidebar()}\n        <Divider>{() => t('layout.setting.sysTheme')}</Divider>\n        {renderMainTheme()}\n        <Divider>{() => t('layout.setting.headerTheme')}</Divider>\n        {renderHeaderTheme()}\n        <Divider>{() => t('layout.setting.sidebarTheme')}</Divider>\n        {renderSiderTheme()}\n        <Divider>{() => t('layout.setting.interfaceFunction')}</Divider>\n        {renderFeatures()}\n        {/*<Divider>{() => t('layout.setting.interfaceDisplay')}</Divider>*/}\n        {renderContent()}\n        {/*<Divider>{() => t('layout.setting.animation')}</Divider>*/}\n        {/*{renderTransition()}*/}\n        <Divider />\n        <SettingFooter />\n      </BasicDrawer>\n    );\n  },\n});\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/setting/components/InputNumberItem.vue",
    "content": "<template>\n  <div :class=\"prefixCls\">\n    <span> {{ title }}</span>\n    <InputNumber :max=\"7200\" v-bind=\"$attrs\" size=\"small\" :class=\"`${prefixCls}-input-number`\" @change=\"handleChange\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType } from 'vue';\n\n  import { InputNumber } from 'ant-design-vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { baseHandler } from '../handler';\n  import { HandlerEnum } from '../enum';\n\n  export default defineComponent({\n    name: 'InputNumberItem',\n    components: { InputNumber },\n    props: {\n      event: {\n        type: Number as PropType<HandlerEnum>,\n      },\n      title: {\n        type: String,\n      },\n    },\n    setup(props) {\n      const { prefixCls } = useDesign('setting-input-number-item');\n\n      function handleChange(e) {\n        props.event && baseHandler(props.event, e);\n      }\n      return {\n        prefixCls,\n        handleChange,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-setting-input-number-item';\n\n  .@{prefix-cls} {\n    display: flex;\n    justify-content: space-between;\n    margin: 16px 0;\n\n    &-input-number {\n      width: 126px;\n    }\n  }\n  html[data-theme='dark'] {\n    .@{prefix-cls} {\n      color: rgba(255, 255, 255, 0.8);\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/setting/components/SelectItem.vue",
    "content": "<template>\n  <div :class=\"prefixCls\">\n    <span> {{ title }}</span>\n    <Select v-bind=\"getBindValue\" :class=\"`${prefixCls}-select`\" @change=\"handleChange\" :disabled=\"disabled\" size=\"small\" :options=\"options\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, computed } from 'vue';\n\n  import { Select } from 'ant-design-vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { baseHandler } from '../handler';\n  import { HandlerEnum } from '../enum';\n\n  export default defineComponent({\n    name: 'SelectItem',\n    components: { Select },\n    props: {\n      event: {\n        type: Number as PropType<HandlerEnum>,\n      },\n      disabled: {\n        type: Boolean,\n      },\n      title: {\n        type: String,\n      },\n      def: {\n        type: [String, Number] as PropType<string | number>,\n      },\n      initValue: {\n        type: [String, Number] as PropType<string | number>,\n      },\n      options: {\n        type: Array as PropType<LabelValueOptions>,\n        default: () => [],\n      },\n    },\n    setup(props) {\n      const { prefixCls } = useDesign('setting-select-item');\n      const getBindValue = computed(() => {\n        return props.def ? { value: props.def, defaultValue: props.initValue || props.def } : {};\n      });\n\n      function handleChange(e: ChangeEvent) {\n        props.event && baseHandler(props.event, e);\n      }\n      return {\n        prefixCls,\n        handleChange,\n        getBindValue,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-setting-select-item';\n\n  .@{prefix-cls} {\n    display: flex;\n    justify-content: space-between;\n    margin: 16px 0;\n\n    &-select {\n      width: 126px;\n    }\n  }\n  html[data-theme='dark'] {\n    .@{prefix-cls} {\n      color: rgba(255, 255, 255, 0.8);\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/setting/components/SettingFooter.vue",
    "content": "<template>\n  <div :class=\"prefixCls\">\n    <a-button v-if=\"isDev\" type=\"primary\" block @click=\"handleCopy\">\n      <CopyOutlined class=\"mr-2\" />\n      {{ t('layout.setting.copyBtn') }}\n    </a-button>\n\n    <a-button color=\"warning\" block @click=\"handleResetSetting\" class=\"my-3\">\n      <RedoOutlined class=\"mr-2\" />\n      {{ t('common.resetText') }}\n    </a-button>\n\n    <a-button color=\"error\" block @click=\"handleClearAndRedo\">\n      <RedoOutlined class=\"mr-2\" />\n      {{ t('layout.setting.clearBtn') }}\n    </a-button>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, unref } from 'vue';\n\n  import { CopyOutlined, RedoOutlined } from '@ant-design/icons-vue';\n\n  import { useAppStore } from '/@/store/modules/app';\n  import { usePermissionStore } from '/@/store/modules/permission';\n  import { useMultipleTabStore } from '/@/store/modules/multipleTab';\n  import { useUserStore } from '/@/store/modules/user';\n\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard';\n\n  import { updateColorWeak } from '/@/logics/theme/updateColorWeak';\n  import { updateGrayMode } from '/@/logics/theme/updateGrayMode';\n  import defaultSetting from '/@/settings/projectSetting';\n\n  export default defineComponent({\n    name: 'SettingFooter',\n    components: { CopyOutlined, RedoOutlined },\n    setup() {\n      const permissionStore = usePermissionStore();\n      const { prefixCls } = useDesign('setting-footer');\n      const { t } = useI18n();\n      const { createSuccessModal, createMessage } = useMessage();\n      const tabStore = useMultipleTabStore();\n      const userStore = useUserStore();\n      const appStore = useAppStore();\n\n      function handleCopy() {\n        const { isSuccessRef } = useCopyToClipboard(JSON.stringify(unref(appStore.getProjectConfig), null, 2));\n        unref(isSuccessRef) &&\n          createSuccessModal({\n            title: t('layout.setting.operatingTitle'),\n            content: t('layout.setting.operatingContent'),\n          });\n      }\n      function handleResetSetting() {\n        try {\n          appStore.setProjectConfig(defaultSetting);\n          const { colorWeak, grayMode } = defaultSetting;\n          // updateTheme(themeColor);\n          updateColorWeak(colorWeak);\n          updateGrayMode(grayMode);\n          createMessage.success(t('layout.setting.resetSuccess'));\n        } catch (error) {\n          createMessage.error(error);\n        }\n      }\n\n      function handleClearAndRedo() {\n        localStorage.clear();\n        appStore.resetAllState();\n        permissionStore.resetState();\n        tabStore.resetState();\n        userStore.resetState();\n        location.reload();\n      }\n      const isDev = import.meta.env.DEV;\n      return {\n        prefixCls,\n        t,\n        handleCopy,\n        handleResetSetting,\n        handleClearAndRedo,\n        isDev,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-setting-footer';\n\n  .@{prefix-cls} {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/setting/components/SwitchItem.vue",
    "content": "<template>\n  <div :class=\"prefixCls\">\n    <span> {{ title }}</span>\n    <Switch\n      v-bind=\"getBindValue\"\n      @change=\"handleChange\"\n      :disabled=\"disabled\"\n      :checkedChildren=\"t('layout.setting.on')\"\n      :unCheckedChildren=\"t('layout.setting.off')\"\n    />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, computed } from 'vue';\n\n  import { Switch } from 'ant-design-vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { baseHandler } from '../handler';\n  import { HandlerEnum } from '../enum';\n\n  export default defineComponent({\n    name: 'SwitchItem',\n    components: { Switch },\n    props: {\n      event: {\n        type: Number as PropType<HandlerEnum>,\n      },\n      disabled: {\n        type: Boolean,\n      },\n      title: {\n        type: String,\n      },\n      def: {\n        type: Boolean,\n      },\n    },\n    setup(props) {\n      const { prefixCls } = useDesign('setting-switch-item');\n      const { t } = useI18n();\n\n      const getBindValue = computed(() => {\n        return props.def ? { checked: props.def } : {};\n      });\n      function handleChange(e: ChangeEvent) {\n        props.event && baseHandler(props.event, e);\n      }\n      return {\n        prefixCls,\n        t,\n        handleChange,\n        getBindValue,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-setting-switch-item';\n\n  .@{prefix-cls} {\n    display: flex;\n    justify-content: space-between;\n    margin: 16px 0;\n  }\n  html[data-theme='dark'] {\n    .@{prefix-cls} {\n      color: rgba(255, 255, 255, 0.8);\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/setting/components/ThemeColorPicker.vue",
    "content": "<template>\n  <div :class=\"prefixCls\">\n    <template v-for=\"color in colorList || []\" :key=\"color\">\n      <span\n        @click=\" !isDisabledColor && handleClick(color)\"\n        :class=\"[\n          `${prefixCls}__item`,\n          {\n            [`${prefixCls}__item--active`]: def === color,\n            [`${prefixCls}__item--black`]: color == '#ffffff',\n            disabledColor: isDisabledColor,\n          },\n        ]\"\n        :style=\"{ background: color }\"\n      >\n        <CheckOutlined />\n      </span>\n    </template>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, watch, ref } from 'vue';\n  import { CheckOutlined } from '@ant-design/icons-vue';\n\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  import { baseHandler } from '../handler';\n  import { HandlerEnum } from '../enum';\n  import { useRootSetting } from '/@/hooks/setting/useRootSetting';\n  import { ThemeEnum } from '/@/enums/appEnum';\n\n  export default defineComponent({\n    name: 'ThemeColorPicker',\n    components: { CheckOutlined },\n    props: {\n      colorList: {\n        type: Array as PropType<string[]>,\n        defualt: [],\n      },\n      event: {\n        type: Number as PropType<HandlerEnum>,\n      },\n      def: {\n        type: String,\n      },\n    },\n    setup(props) {\n      const { prefixCls } = useDesign('setting-theme-picker');\n      const { getDarkMode } = useRootSetting();\n      const isDisabledColor = ref(false);\n\n      function handleClick(color: string) {\n        props.event && baseHandler(props.event, color);\n      }\n      // 代码逻辑说明: 【QQYUN-8927】暗黑主题下不允许切换顶栏主题和菜单主题\n      watch(\n        () => getDarkMode.value,\n        (newValue) => {\n          isDisabledColor.value = props.event === 1 ? false : newValue === ThemeEnum.DARK;\n        },\n        { immediate: true }\n      );\n      return {\n        prefixCls,\n        handleClick,\n        isDisabledColor\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-setting-theme-picker';\n\n  .@{prefix-cls} {\n    display: flex;\n    flex-wrap: wrap;\n    margin: 16px 0;\n    justify-content: space-around;\n    // 代码逻辑说明: 【QQYUN-7677】antd4兼容改造，勾选垂直居中\n    line-height: 1.3;\n    &__item {\n      width: 20px;\n      height: 20px;\n      cursor: pointer;\n      border: 1px solid #ddd;\n      border-radius: 2px;\n      &.disabledColor {\n        cursor: not-allowed;\n        opacity: 0.5;\n      }\n      svg {\n        display: none;\n      }\n\n      &--active {\n        svg {\n          display: inline-block;\n          margin: 0 0 3px 3px;\n          font-size: 12px;\n          fill: @white !important;\n        }\n      }\n      &--black {\n        svg {\n          fill: #000 !important;\n        }\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/setting/components/TypePicker.vue",
    "content": "<template>\n  <div :class=\"prefixCls\">\n    <template v-for=\"item in menuTypeList || []\" :key=\"item.title\">\n      <Tooltip :title=\"item.title\" placement=\"bottom\">\n        <div\n          @click=\"handler(item)\"\n          :class=\"[\n            `${prefixCls}__item`,\n            `${prefixCls}__item--${item.type}`,\n            {\n              [`${prefixCls}__item--active`]: def === item.type,\n            },\n          ]\"\n        >\n          <div class=\"mix-sidebar\"></div>\n        </div>\n      </Tooltip>\n    </template>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType } from 'vue';\n\n  import { Tooltip } from 'ant-design-vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  import { menuTypeList } from '../enum';\n  export default defineComponent({\n    name: 'MenuTypePicker',\n    components: { Tooltip },\n    props: {\n      menuTypeList: {\n        type: Array as PropType<typeof menuTypeList>,\n        defualt: () => [],\n      },\n      handler: {\n        type: Function as PropType<Fn>,\n        default: () => ({}),\n      },\n      def: {\n        type: String,\n        default: '',\n      },\n    },\n    setup() {\n      const { prefixCls } = useDesign('setting-menu-type-picker');\n\n      return {\n        prefixCls,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-setting-menu-type-picker';\n\n  .@{prefix-cls} {\n    display: flex;\n\n    &__item {\n      position: relative;\n      width: 56px;\n      height: 48px;\n      margin-right: 16px;\n      overflow: hidden;\n      cursor: pointer;\n      background-color: #f0f2f5;\n      border-radius: 4px;\n      box-shadow: 0 1px 2.5px 0 rgba(0, 0, 0, 0.18);\n\n      &::before,\n      &::after {\n        position: absolute;\n        content: '';\n      }\n\n      &--sidebar,\n      &--light {\n        &::before {\n          top: 0;\n          left: 0;\n          z-index: 1;\n          width: 33%;\n          height: 100%;\n          background-color: #273352;\n          border-radius: 4px 0 0 4px;\n        }\n\n        &::after {\n          top: 0;\n          left: 0;\n          width: 100%;\n          height: 25%;\n          background-color: #fff;\n        }\n      }\n\n      &--mix {\n        &::before {\n          top: 0;\n          left: 0;\n          width: 33%;\n          height: 100%;\n          background-color: #fff;\n          border-radius: 4px 0 0 4px;\n        }\n\n        &::after {\n          top: 0;\n          left: 0;\n          z-index: 1;\n          width: 100%;\n          height: 25%;\n          background-color: #273352;\n        }\n      }\n\n      &--top-menu {\n        &::after {\n          top: 0;\n          left: 0;\n          width: 100%;\n          height: 25%;\n          background-color: #273352;\n        }\n      }\n\n      &--dark {\n        background-color: #273352;\n      }\n\n      &--mix-sidebar {\n        &::before {\n          top: 0;\n          left: 0;\n          z-index: 1;\n          width: 25%;\n          height: 100%;\n          background-color: #273352;\n          border-radius: 4px 0 0 4px;\n        }\n\n        &::after {\n          top: 0;\n          left: 0;\n          width: 100%;\n          height: 25%;\n          background-color: #fff;\n        }\n\n        .mix-sidebar {\n          position: absolute;\n          left: 25%;\n          width: 15%;\n          height: 100%;\n          background-color: #fff;\n        }\n      }\n\n      &:hover,\n      &--active {\n        padding: 12px;\n        border: 2px solid @primary-color;\n\n        &::before,\n        &::after {\n          border-radius: 0;\n        }\n      }\n    }\n\n    img {\n      width: 100%;\n      height: 100%;\n      cursor: pointer;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/setting/components/index.ts",
    "content": "import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n\nexport const TypePicker = createAsyncComponent(() => import('./TypePicker.vue'));\nexport const ThemeColorPicker = createAsyncComponent(() => import('./ThemeColorPicker.vue'));\nexport const SettingFooter = createAsyncComponent(() => import('./SettingFooter.vue'));\nexport const SwitchItem = createAsyncComponent(() => import('./SwitchItem.vue'));\nexport const SelectItem = createAsyncComponent(() => import('./SelectItem.vue'));\nexport const InputNumberItem = createAsyncComponent(() => import('./InputNumberItem.vue'));\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/setting/enum.ts",
    "content": "import { TabsThemeEnum, ContentEnum, RouterTransitionEnum } from '/@/enums/appEnum';\nimport { MenuModeEnum, MenuTypeEnum, TopMenuAlignEnum, TriggerEnum, MixSidebarTriggerEnum } from '/@/enums/menuEnum';\n\nimport { useI18n } from '/@/hooks/web/useI18n';\n\nconst { t } = useI18n();\n\nexport enum HandlerEnum {\n  CHANGE_LAYOUT,\n  CHANGE_THEME_COLOR,\n  CHANGE_THEME,\n  // menu\n  MENU_HAS_DRAG,\n  MENU_ACCORDION,\n  MENU_TRIGGER,\n  MENU_TOP_ALIGN,\n  MENU_COLLAPSED,\n  MENU_COLLAPSED_SHOW_TITLE,\n  MENU_WIDTH,\n  MENU_SHOW_SIDEBAR,\n  MENU_THEME,\n  MENU_SPLIT,\n  MENU_FIXED,\n  MENU_CLOSE_MIX_SIDEBAR_ON_CHANGE,\n  MENU_TRIGGER_MIX_SIDEBAR,\n  MENU_FIXED_MIX_SIDEBAR,\n\n  // header\n  HEADER_SHOW,\n  HEADER_THEME,\n  HEADER_FIXED,\n\n  HEADER_SEARCH,\n\n  TABS_SHOW_QUICK,\n  TABS_SHOW_REDO,\n  TABS_SHOW,\n  TABS_SHOW_FOLD,\n  TABS_THEME,\n\n  LOCK_TIME,\n  FULL_CONTENT,\n  CONTENT_MODE,\n  SHOW_BREADCRUMB,\n  SHOW_BREADCRUMB_ICON,\n  GRAY_MODE,\n  COLOR_WEAK,\n  SHOW_LOGO,\n  SHOW_FOOTER,\n\n  ROUTER_TRANSITION,\n  OPEN_PROGRESS,\n  OPEN_PAGE_LOADING,\n  OPEN_ROUTE_TRANSITION,\n  AI_ICON_SHOW,\n}\n\n// 标签页样式\nexport const tabsThemeOptions = [\n  {\n    value: TabsThemeEnum.SMOOTH,\n    label: t('layout.setting.tabsThemeSmooth'),\n  },\n  {\n    value: TabsThemeEnum.CARD,\n    label: t('layout.setting.tabsThemeCard'),\n  },\n  {\n    value: TabsThemeEnum.SIMPLE,\n    label: t('layout.setting.tabsThemeSimple'),\n  },\n];\n\nexport const contentModeOptions = [\n  {\n    value: ContentEnum.FULL,\n    label: t('layout.setting.contentModeFull'),\n  },\n  {\n    value: ContentEnum.FIXED,\n    label: t('layout.setting.contentModeFixed'),\n  },\n];\n\nexport const topMenuAlignOptions = [\n  {\n    value: TopMenuAlignEnum.CENTER,\n    label: t('layout.setting.topMenuAlignRight'),\n  },\n  {\n    value: TopMenuAlignEnum.START,\n    label: t('layout.setting.topMenuAlignLeft'),\n  },\n  {\n    value: TopMenuAlignEnum.END,\n    label: t('layout.setting.topMenuAlignCenter'),\n  },\n];\n\nexport const getMenuTriggerOptions = (hideTop: boolean) => {\n  return [\n    {\n      value: TriggerEnum.NONE,\n      label: t('layout.setting.menuTriggerNone'),\n    },\n    {\n      value: TriggerEnum.FOOTER,\n      label: t('layout.setting.menuTriggerBottom'),\n    },\n    ...(hideTop\n      ? []\n      : [\n          {\n            value: TriggerEnum.HEADER,\n            label: t('layout.setting.menuTriggerTop'),\n          },\n        ]),\n  ];\n};\n\nexport const routerTransitionOptions = [\n  RouterTransitionEnum.ZOOM_FADE,\n  RouterTransitionEnum.FADE,\n  RouterTransitionEnum.ZOOM_OUT,\n  RouterTransitionEnum.FADE_SIDE,\n  RouterTransitionEnum.FADE_BOTTOM,\n  RouterTransitionEnum.FADE_SCALE,\n].map((item) => {\n  return {\n    label: item,\n    value: item,\n  };\n});\n\nexport const menuTypeList = [\n  {\n    title: t('layout.setting.menuTypeSidebar'),\n    mode: MenuModeEnum.INLINE,\n    type: MenuTypeEnum.SIDEBAR,\n  },\n  {\n    title: t('layout.setting.menuTypeMix'),\n    mode: MenuModeEnum.INLINE,\n    type: MenuTypeEnum.MIX,\n  },\n\n  {\n    title: t('layout.setting.menuTypeTopMenu'),\n    mode: MenuModeEnum.HORIZONTAL,\n    type: MenuTypeEnum.TOP_MENU,\n  },\n  {\n    title: t('layout.setting.menuTypeMixSidebar'),\n    mode: MenuModeEnum.INLINE,\n    type: MenuTypeEnum.MIX_SIDEBAR,\n  },\n];\n\nexport const mixSidebarTriggerOptions = [\n  {\n    value: MixSidebarTriggerEnum.HOVER,\n    label: t('layout.setting.triggerHover'),\n  },\n  {\n    value: MixSidebarTriggerEnum.CLICK,\n    label: t('layout.setting.triggerClick'),\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/setting/handler.ts",
    "content": "import { HandlerEnum, tabsThemeOptions} from './enum';\nimport { updateHeaderBgColor, updateSidebarBgColor } from '/@/logics/theme/updateBackground';\nimport { updateColorWeak } from '/@/logics/theme/updateColorWeak';\nimport { updateGrayMode } from '/@/logics/theme/updateGrayMode';\n\nimport { useAppStore } from '/@/store/modules/app';\nimport { ProjectConfig } from '/#/config';\nimport { changeTheme } from '/@/logics/theme';\nimport { updateDarkTheme } from '/@/logics/theme/dark';\nimport { useRootSetting } from '/@/hooks/setting/useRootSetting';\nimport { MenuModeEnum, MenuTypeEnum } from '/@/enums/menuEnum';\nimport { getConfigByMenuType } from '../../../utils/getConfigByMenuType';\nimport { isObject } from '/@/utils/is';\nimport { ThemeEnum } from '/@/enums/appEnum';\nimport { APP__THEME__COLOR } from '/@/enums/cacheEnum';\n\n/**\n *  2024-04-07\n *  liaozhiyang\n *  切换导航栏模式都走这个方法，每个模式都会有固定的顶部和菜单颜色搭配。暗黑模式则不走固定搭配\n * */\nexport function layoutHandler(event: HandlerEnum, value: any) {\n  const isHTopMenu = isObject(value) && value.type == MenuTypeEnum.TOP_MENU && value.mode == MenuModeEnum.HORIZONTAL;\n  const isMixMenu = isObject(value) && value.type == MenuTypeEnum.MIX && value.mode == MenuModeEnum.INLINE;\n  const isMixSidebarMenu = isObject(value) && value.type == MenuTypeEnum.MIX_SIDEBAR && value.mode == MenuModeEnum.INLINE;\n  const appStore = useAppStore();\n  const darkMode = appStore.getDarkMode === ThemeEnum.DARK;\n  // 根据菜单类型动态获取主题色\n  const {themeColor: dynamicThemeColor, headerBgColor, sideBgColor } = getConfigByMenuType(value.type);\n  if (isHTopMenu) {\n    baseHandler(event, value);\n    baseHandler(HandlerEnum.HEADER_THEME, headerBgColor);\n    baseHandler(HandlerEnum.CHANGE_THEME_COLOR, dynamicThemeColor);\n    if (darkMode) {\n      updateHeaderBgColor();\n      updateSidebarBgColor();\n    }\n    baseHandler(HandlerEnum.TABS_THEME, tabsThemeOptions[1].value);\n  } else if (isMixMenu) {\n    baseHandler(event, value);\n    baseHandler(HandlerEnum.HEADER_THEME, headerBgColor);\n    baseHandler(HandlerEnum.MENU_THEME, sideBgColor);\n    if (darkMode) {\n      updateHeaderBgColor();\n      updateSidebarBgColor();\n    }\n    // 顶部混合导航模式使用动态主题色\n    baseHandler(HandlerEnum.CHANGE_THEME_COLOR, dynamicThemeColor);\n    baseHandler(HandlerEnum.TABS_THEME, tabsThemeOptions[1].value);\n  } else if (isMixSidebarMenu) {\n    baseHandler(event, value);\n    baseHandler(HandlerEnum.CHANGE_THEME_COLOR, dynamicThemeColor);\n    baseHandler(HandlerEnum.HEADER_THEME, headerBgColor);\n    baseHandler(HandlerEnum.MENU_THEME, sideBgColor);\n    if (darkMode) {\n      updateHeaderBgColor();\n      updateSidebarBgColor();\n    }\n    baseHandler(HandlerEnum.TABS_THEME, tabsThemeOptions[1].value);\n  } else {\n    baseHandler(event, value);\n    baseHandler(HandlerEnum.HEADER_THEME, headerBgColor);\n    baseHandler(HandlerEnum.MENU_THEME, sideBgColor);\n    if (darkMode) {\n      updateHeaderBgColor();\n      updateSidebarBgColor();\n    }\n    baseHandler(HandlerEnum.CHANGE_THEME_COLOR, dynamicThemeColor);\n    baseHandler(HandlerEnum.TABS_THEME, tabsThemeOptions[1].value);\n  }\n  // 代码逻辑说明: 【QQYUN-13600】默认顶部混合导航模式且启用顶部左侧导航，切换到其他模式时导航刷新后菜单样式混乱\n  if (isMixMenu) {\n    baseHandler(HandlerEnum.MENU_SPLIT, true);\n  } else {\n    baseHandler(HandlerEnum.MENU_SPLIT, false);\n  }\n}\n\nexport function baseHandler(event: HandlerEnum, value: any) {\n  const appStore = useAppStore();\n  const config = handler(event, value);\n  appStore.setProjectConfig(config);\n  if (event === HandlerEnum.CHANGE_THEME) {\n    updateHeaderBgColor();\n    updateSidebarBgColor();\n  }\n}\n\nexport function handler(event: HandlerEnum, value: any): DeepPartial<ProjectConfig> {\n  const appStore = useAppStore();\n\n  const { getThemeColor, getDarkMode } = useRootSetting();\n  switch (event) {\n    case HandlerEnum.CHANGE_LAYOUT:\n      const { mode, type, split } = value;\n      const splitOpt = split === undefined ? { split } : {};\n\n      return {\n        menuSetting: {\n          mode,\n          type,\n          collapsed: false,\n          show: true,\n          hidden: false,\n          ...splitOpt,\n        },\n      };\n\n    case HandlerEnum.CHANGE_THEME_COLOR:\n      if (getThemeColor.value === value) {\n        return {};\n      }\n      // 代码逻辑说明: 【QQYUN-8925】系统主题颜色（供页面加载使用）\n      localStorage.setItem(APP__THEME__COLOR, value);\n      changeTheme(value);\n\n      return { themeColor: value };\n\n    case HandlerEnum.CHANGE_THEME:\n      if (getDarkMode.value === value) {\n        return {};\n      }\n      updateDarkTheme(value);\n\n      return {};\n\n    case HandlerEnum.MENU_HAS_DRAG:\n      return { menuSetting: { canDrag: value } };\n\n    case HandlerEnum.MENU_ACCORDION:\n      return { menuSetting: { accordion: value } };\n\n    case HandlerEnum.MENU_TRIGGER:\n      return { menuSetting: { trigger: value } };\n\n    case HandlerEnum.MENU_TOP_ALIGN:\n      return { menuSetting: { topMenuAlign: value } };\n\n    case HandlerEnum.MENU_COLLAPSED:\n      return { menuSetting: { collapsed: value } };\n\n    case HandlerEnum.MENU_WIDTH:\n      return { menuSetting: { menuWidth: value } };\n\n    case HandlerEnum.MENU_SHOW_SIDEBAR:\n      return { menuSetting: { show: value } };\n\n    case HandlerEnum.MENU_COLLAPSED_SHOW_TITLE:\n      return { menuSetting: { collapsedShowTitle: value } };\n\n    case HandlerEnum.MENU_THEME:\n      updateSidebarBgColor(value);\n      return { menuSetting: { bgColor: value } };\n\n    case HandlerEnum.MENU_SPLIT:\n      return { menuSetting: { split: value } };\n\n    case HandlerEnum.MENU_CLOSE_MIX_SIDEBAR_ON_CHANGE:\n      return { menuSetting: { closeMixSidebarOnChange: value } };\n\n    case HandlerEnum.MENU_FIXED:\n      return { menuSetting: { fixed: value } };\n\n    case HandlerEnum.MENU_TRIGGER_MIX_SIDEBAR:\n      return { menuSetting: { mixSideTrigger: value } };\n\n    case HandlerEnum.MENU_FIXED_MIX_SIDEBAR:\n      return { menuSetting: { mixSideFixed: value } };\n\n    // ============transition==================\n    case HandlerEnum.OPEN_PAGE_LOADING:\n      appStore.setPageLoading(false);\n      return { transitionSetting: { openPageLoading: value } };\n\n    case HandlerEnum.ROUTER_TRANSITION:\n      return { transitionSetting: { basicTransition: value } };\n\n    case HandlerEnum.OPEN_ROUTE_TRANSITION:\n      return { transitionSetting: { enable: value } };\n\n    case HandlerEnum.OPEN_PROGRESS:\n      return { transitionSetting: { openNProgress: value } };\n    // ============root==================\n\n    case HandlerEnum.LOCK_TIME:\n      return { lockTime: value };\n\n    case HandlerEnum.FULL_CONTENT:\n      return { fullContent: value };\n\n    case HandlerEnum.CONTENT_MODE:\n      return { contentMode: value };\n\n    case HandlerEnum.SHOW_BREADCRUMB:\n      return { showBreadCrumb: value };\n\n    case HandlerEnum.SHOW_BREADCRUMB_ICON:\n      return { showBreadCrumbIcon: value };\n\n    case HandlerEnum.GRAY_MODE:\n      updateGrayMode(value);\n      return { grayMode: value };\n\n    case HandlerEnum.SHOW_FOOTER:\n      return { showFooter: value };\n\n    case HandlerEnum.COLOR_WEAK:\n      updateColorWeak(value);\n      return { colorWeak: value };\n    // 代码逻辑说明: 【QQYUN-10952】AI助手支持通过设置来配置是否显示\n    case HandlerEnum.AI_ICON_SHOW:\n      return { aiIconShow: value };\n    case HandlerEnum.SHOW_LOGO:\n      return { showLogo: value };\n\n    // ============tabs==================\n    case HandlerEnum.TABS_SHOW_QUICK:\n      return { multiTabsSetting: { showQuick: value } };\n\n    case HandlerEnum.TABS_SHOW:\n      return { multiTabsSetting: { show: value } };\n\n    case HandlerEnum.TABS_SHOW_REDO:\n      return { multiTabsSetting: { showRedo: value } };\n\n    case HandlerEnum.TABS_SHOW_FOLD:\n      return { multiTabsSetting: { showFold: value } };\n\n    case HandlerEnum.TABS_THEME:\n      return { multiTabsSetting: { theme: value } };\n\n    // ============header==================\n    case HandlerEnum.HEADER_THEME:\n      updateHeaderBgColor(value);\n      return { headerSetting: { bgColor: value } };\n\n    case HandlerEnum.HEADER_SEARCH:\n      return { headerSetting: { showSearch: value } };\n\n    case HandlerEnum.HEADER_FIXED:\n      return { headerSetting: { fixed: value } };\n\n    case HandlerEnum.HEADER_SHOW:\n      return { headerSetting: { show: value } };\n    default:\n      return {};\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/setting/index.vue",
    "content": "<template>\n  <div @click=\"openDrawer(true)\">\n    <Icon icon=\"ion:settings-outline\" />\n    <SettingDrawer @register=\"register\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import SettingDrawer from './SettingDrawer';\n  import Icon from '/@/components/Icon';\n\n  import { useDrawer } from '/@/components/Drawer';\n\n  export default defineComponent({\n    name: 'SettingButton',\n    components: { SettingDrawer, Icon },\n    setup() {\n      const [register, { openDrawer }] = useDrawer();\n\n      return {\n        register,\n        openDrawer,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/sider/DragBar.vue",
    "content": "<template>\n  <div :class=\"getClass\" :style=\"getDragBarStyle\"></div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, computed, unref } from 'vue';\n\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\n\n  export default defineComponent({\n    name: 'DargBar',\n    props: {\n      mobile: Boolean,\n    },\n    setup(props) {\n      const { getMiniWidthNumber, getCollapsed, getCanDrag } = useMenuSetting();\n\n      const { prefixCls } = useDesign('darg-bar');\n      const getDragBarStyle = computed(() => {\n        if (unref(getCollapsed)) {\n          return { left: `${unref(getMiniWidthNumber)}px` };\n        }\n        return {};\n      });\n\n      const getClass = computed(() => {\n        return [\n          prefixCls,\n          {\n            [`${prefixCls}--hide`]: !unref(getCanDrag) || props.mobile,\n          },\n        ];\n      });\n\n      return {\n        prefixCls,\n        getDragBarStyle,\n        getClass,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-darg-bar';\n\n  .@{prefix-cls} {\n    position: absolute;\n    top: 0;\n    right: -2px;\n    z-index: @side-drag-z-index;\n    width: 2px;\n    height: 100%;\n    cursor: col-resize;\n    border-top: none;\n    border-bottom: none;\n\n    &--hide {\n      display: none;\n    }\n\n    &:hover {\n      background-color: @primary-color;\n      box-shadow: 0 0 4px 0 rgba(28, 36, 56, 0.15);\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/sider/LayoutSider.vue",
    "content": "<template>\n  <div v-if=\"getMenuFixed && !getIsMobile\" :style=\"getHiddenDomStyle\" v-show=\"showClassSideBarRef\"></div>\n  <Sider\n    v-show=\"showClassSideBarRef\"\n    ref=\"sideRef\"\n    breakpoint=\"lg\"\n    collapsible\n    :class=\"getSiderClass\"\n    :width=\"getMenuWidth\"\n    :collapsed=\"getCollapsed\"\n    :collapsedWidth=\"getCollapsedWidth\"\n    :theme=\"getMenuTheme\"\n    @breakpoint=\"onBreakpointChange\"\n    :trigger=\"getTrigger\"\n    v-bind=\"getTriggerAttr\"\n  >\n    <template #trigger v-if=\"getShowTrigger\">\n      <LayoutTrigger />\n    </template>\n    <LayoutMenu :theme=\"getMenuTheme\" :menuMode=\"getMode\" :splitType=\"getSplitType\" />\n    <DragBar ref=\"dragBarRef\" />\n  </Sider>\n</template>\n<script lang=\"ts\">\n  import { computed, defineComponent, ref, unref, CSSProperties, h } from 'vue';\n\n  import { Layout } from 'ant-design-vue';\n  import LayoutMenu from '../menu/index.vue';\n  import LayoutTrigger from '/@/layouts/default/trigger/index.vue';\n\n  import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';\n\n  import { useAppStore } from \"@/store/modules/app\";\n  import { useGlobSetting } from \"/@/hooks/setting\";\n  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\n  import { useTrigger, useDragLine, useSiderEvent } from './useLayoutSider';\n  import { useAppInject } from '/@/hooks/web/useAppInject';\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  import DragBar from './DragBar.vue';\n\n  export default defineComponent({\n    name: 'LayoutSideBar',\n    components: { Sider: Layout.Sider, LayoutMenu, DragBar, LayoutTrigger },\n    setup() {\n      const dragBarRef = ref<ElRef>(null);\n      const sideRef = ref<ElRef>(null);\n\n      const { getCollapsed, getMenuWidth, getSplit, getMenuTheme, getRealWidth, getMenuHidden, getMenuFixed, getIsMixMode, toggleCollapsed } =\n        useMenuSetting();\n\n      const { prefixCls } = useDesign('layout-sideBar');\n\n      const glob = useGlobSetting()\n      const appStore = useAppStore()\n\n      const { getIsMobile } = useAppInject();\n\n      const { getTriggerAttr, getShowTrigger } = useTrigger(getIsMobile);\n\n      useDragLine(sideRef, dragBarRef);\n\n      const { getCollapsedWidth, onBreakpointChange } = useSiderEvent();\n\n      const getMode = computed(() => {\n        return unref(getSplit) ? MenuModeEnum.INLINE : null;\n      });\n\n      const getSplitType = computed(() => {\n        return unref(getSplit) ? MenuSplitTyeEnum.LEFT : MenuSplitTyeEnum.NONE;\n      });\n\n      const showClassSideBarRef = computed(() => {\n        // 控制是否显示侧边栏\n        if (appStore.getLayoutHideSider) {\n          return false;\n        }\n        return unref(getSplit) ? !unref(getMenuHidden) : true;\n      });\n\n      const getSiderClass = computed(() => {\n        return [\n          prefixCls,\n          {\n            [`${prefixCls}--fixed`]: unref(getMenuFixed),\n            [`${prefixCls}--mix`]: unref(getIsMixMode) && !unref(getIsMobile),\n            // 【JEECG作为乾坤子应用】\n            [`${prefixCls}--qiankun-micro`]: glob.isQiankunMicro,\n          },\n        ];\n      });\n\n      const getHiddenDomStyle = computed((): CSSProperties => {\n        const width = `${unref(getRealWidth)}px`;\n        return {\n          width: width,\n          overflow: 'hidden',\n          flex: `0 0 ${width}`,\n          maxWidth: width,\n          minWidth: width,\n          transition: 'all 0.2s',\n        };\n      });\n\n      // 在此处使用计算量可能会导致sider异常\n      // andv 更新后，如果trigger插槽可用，则此处代码可废弃\n      const getTrigger = h(LayoutTrigger);\n\n      return {\n        prefixCls,\n        sideRef,\n        dragBarRef,\n        getIsMobile,\n        getHiddenDomStyle,\n        getSiderClass,\n        getTrigger,\n        getTriggerAttr,\n        getCollapsedWidth,\n        getMenuFixed,\n        showClassSideBarRef,\n        getMenuWidth,\n        getCollapsed,\n        getMenuTheme,\n        onBreakpointChange,\n        getMode,\n        getSplitType,\n        getShowTrigger,\n        toggleCollapsed,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-layout-sideBar';\n\n  .@{prefix-cls} {\n    z-index: @layout-sider-fixed-z-index;\n\n    &--fixed {\n      position: fixed !important;\n      top: 0;\n      left: 0;\n      height: 100%;\n    }\n\n    // 【JEECG作为乾坤子应用】\n    &--qiankun-micro {\n      position: absolute !important;\n    }\n\n    &--mix {\n      top: @header-height;\n      height: calc(100% - @header-height);\n    }\n\n    &.ant-layout-sider-dark {\n      background-color: @sider-dark-bg-color;\n\n      .ant-layout-sider-trigger {\n        color: darken(@white, 25%);\n        background-color: @trigger-dark-bg-color;\n\n        &:hover {\n          color: @white;\n          background-color: @trigger-dark-hover-bg-color;\n        }\n      }\n    }\n\n    &:not(.ant-layout-sider-dark) {\n      // box-shadow: 2px 0 8px 0 rgba(29, 35, 41, 0.05);\n\n      .ant-layout-sider-trigger {\n        color: @text-color-base;\n        border-top: 1px solid @border-color-light;\n      }\n    }\n\n    .ant-layout-sider-zero-width-trigger {\n      top: 40%;\n      z-index: 10;\n    }\n\n    & .ant-layout-sider-trigger {\n      height: 36px;\n      line-height: 36px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/sider/MixSider.vue",
    "content": "<template>\n  <div :class=\"`${prefixCls}-dom`\" :style=\"getDomStyle\"></div>\n  <div\n    v-click-outside=\"handleClickOutside\"\n    :style=\"getWrapStyle\"\n    :class=\"[\n      prefixCls,\n      getMenuTheme,\n      {\n        open: openMenu,\n        mini: getCollapsed,\n        bright: isThemeBright,\n      },\n    ]\"\n    v-bind=\"getMenuEvents\"\n  >\n    <AppLogo :showTitle=\"false\" :class=\"`${prefixCls}-logo`\" />\n\n    <LayoutTrigger :class=\"`${prefixCls}-trigger`\" />\n\n    <ScrollContainer>\n      <ul :class=\"`${prefixCls}-module`\">\n        <li\n          :class=\"[\n            `${prefixCls}-module__item `,\n            {\n              [`${prefixCls}-module__item--active`]: item.path === activePath,\n            },\n          ]\"\n          v-bind=\"getItemEvents(item)\"\n          v-for=\"item in menuModules\"\n          :key=\"item.path\"\n        >\n          <SimpleMenuTag :item=\"item\" collapseParent dot />\n          <Icon :class=\"`${prefixCls}-module__icon`\" :size=\"getCollapsed ? 16 : 20\" :icon=\"item.icon || (item.meta && item.meta.icon)\" />\n          <p :class=\"`${prefixCls}-module__name`\">\n            {{ t(item.name) }}\n          </p>\n        </li>\n      </ul>\n    </ScrollContainer>\n\n    <div :class=\"`${prefixCls}-menu-list`\" ref=\"sideRef\" :style=\"getMenuStyle\">\n      <div\n        v-show=\"openMenu\"\n        :class=\"[\n          `${prefixCls}-menu-list__title`,\n          {\n            show: openMenu,\n          },\n        ]\"\n      >\n        <span class=\"text\"> {{ shortTitle }}</span>\n        <Icon :size=\"16\" :icon=\"getMixSideFixed ? 'ri:pushpin-2-fill' : 'ri:pushpin-2-line'\" class=\"pushpin\" @click=\"handleFixedMenu\" />\n      </div>\n      <ScrollContainer :class=\"`${prefixCls}-menu-list__content`\">\n        <SimpleMenu :items=\"childrenMenus\" :theme=\"getMenuTheme\" mixSider @menuClick=\"handleMenuClick\" />\n      </ScrollContainer>\n      <div v-show=\"getShowDragBar && openMenu\" :class=\"`${prefixCls}-drag-bar`\" ref=\"dragBarRef\"></div>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\">\n  import type { Menu } from '/@/router/types';\n  import type { CSSProperties } from 'vue';\n  import { computed, defineComponent, onMounted, ref, unref, watch} from 'vue';\n  import type { RouteLocationNormalized } from 'vue-router';\n  import { ScrollContainer } from '/@/components/Container';\n  import { SimpleMenu, SimpleMenuTag } from '/@/components/SimpleMenu';\n  import { Icon } from '/@/components/Icon';\n  import { AppLogo } from '/@/components/Application';\n  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\n  import { useDragLine } from './useLayoutSider';\n  import { useGlobSetting } from '/@/hooks/setting';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useGo } from '/@/hooks/web/usePage';\n  import { SIDE_BAR_MINI_WIDTH, SIDE_BAR_SHOW_TIT_MINI_WIDTH } from '/@/enums/appEnum';\n  import clickOutside from '/@/directives/clickOutside';\n  import { getChildrenMenus, getCurrentParentPath, getShallowMenus } from '/@/router/menus';\n  import { listenerRouteChange } from '/@/logics/mitt/routeChange';\n  import LayoutTrigger from '../trigger/index.vue';\n  import { useAppStore } from '/@/store/modules/app';\n\n  export default defineComponent({\n    name: 'LayoutMixSider',\n    components: {\n      ScrollContainer,\n      AppLogo,\n      SimpleMenu,\n      Icon,\n      LayoutTrigger,\n      SimpleMenuTag,\n    },\n    directives: {\n      clickOutside,\n    },\n    setup() {\n      let menuModules = ref<Menu[]>([]);\n      const activePath = ref('');\n      const childrenMenus = ref<Menu[]>([]);\n      const openMenu = ref(false);\n      const dragBarRef = ref<ElRef>(null);\n      const sideRef = ref<ElRef>(null);\n      const currentRoute = ref<Nullable<RouteLocationNormalized>>(null);\n      const appStore = useAppStore();\n      const isThemeBright = ref(false);\n\n      const { prefixCls } = useDesign('layout-mix-sider');\n      const go = useGo();\n      const { t } = useI18n();\n      const {\n        getMenuWidth,\n        getCanDrag,\n        getCloseMixSidebarOnChange,\n        getMenuTheme,\n        getMixSideTrigger,\n        getRealWidth,\n        getMixSideFixed,\n        mixSideHasChildren,\n        setMenuSetting,\n        getIsMixSidebar,\n        getCollapsed,\n      } = useMenuSetting();\n\n      const { shortTitle } = useGlobSetting();\n\n      useDragLine(sideRef, dragBarRef, true);\n\n      const getMenuStyle = computed((): CSSProperties => {\n        return {\n          width: unref(openMenu) ? `${unref(getMenuWidth) - 60}px` : 0,\n          left: `${unref(getMixSideWidth)}px`,\n        };\n      });\n\n      const getIsFixed = computed(() => {\n        /* eslint-disable-next-line */\n        mixSideHasChildren.value = unref(childrenMenus).length > 0;\n        const isFixed = unref(getMixSideFixed) && unref(mixSideHasChildren);\n        if (isFixed) {\n          /* eslint-disable-next-line */\n          openMenu.value = true;\n        }\n        return isFixed;\n      });\n\n      const getMixSideWidth = computed(() => {\n        return unref(getCollapsed) ? SIDE_BAR_MINI_WIDTH : SIDE_BAR_SHOW_TIT_MINI_WIDTH;\n      });\n\n      const getDomStyle = computed((): CSSProperties => {\n        const fixedWidth = unref(getIsFixed) ? unref(getRealWidth) : 0;\n        const width = `${unref(getMixSideWidth) + fixedWidth}px`;\n        return getWrapCommonStyle(width);\n      });\n\n      const getWrapStyle = computed((): CSSProperties => {\n        const width = `${unref(getMixSideWidth)}px`;\n        return getWrapCommonStyle(width);\n      });\n\n      const getMenuEvents = computed(() => {\n        return !unref(getMixSideFixed)\n          ? {\n              onMouseleave: () => {\n                setActive(true);\n                closeMenu();\n              },\n            }\n          : {};\n      });\n\n      const getShowDragBar = computed(() => unref(getCanDrag));\n\n      onMounted(async () => {\n        menuModules.value = await getShallowMenus();\n      });\n\n      listenerRouteChange((route) => {\n        currentRoute.value = route;\n        setActive(true);\n        if (unref(getCloseMixSidebarOnChange)) {\n          closeMenu();\n        }\n      });\n\n      function getWrapCommonStyle(width: string): CSSProperties {\n        return {\n          width,\n          maxWidth: width,\n          minWidth: width,\n          flex: `0 0 ${width}`,\n        };\n      }\n\n      // Process module menu click\n      async function handleModuleClick(path: string, hover = false) {\n        const children = await getChildrenMenus(path);\n        if (unref(activePath) === path) {\n          if (!hover) {\n            if (!unref(openMenu)) {\n              openMenu.value = true;\n            } else {\n              closeMenu();\n            }\n          } else {\n            if (!unref(openMenu)) {\n              openMenu.value = true;\n            }\n          }\n          if (!unref(openMenu)) {\n            setActive();\n          }\n        } else {\n          openMenu.value = true;\n          activePath.value = path;\n        }\n\n        if (!children || children.length === 0) {\n          if (!hover) go(path);\n          childrenMenus.value = [];\n          closeMenu();\n          return;\n        }\n        childrenMenus.value = children;\n      }\n\n      // Set the currently active menu and submenu\n      async function setActive(setChildren = false) {\n        const path = currentRoute.value?.path;\n        if (!path) return;\n        activePath.value = await getCurrentParentPath(path);\n        // hanldeModuleClick(parentPath);\n        if (unref(getIsMixSidebar)) {\n          const activeMenu = unref(menuModules).find((item) => item.path === unref(activePath));\n          const p = activeMenu?.path;\n          if (p) {\n            const children = await getChildrenMenus(p);\n            if (setChildren) {\n              childrenMenus.value = children;\n\n              if (unref(getMixSideFixed)) {\n                openMenu.value = children.length > 0;\n              }\n            }\n            if (children.length === 0) {\n              childrenMenus.value = [];\n            }\n          }\n        }\n      }\n\n      function handleMenuClick(path: string) {\n        go(path);\n      }\n\n      function handleClickOutside() {\n        setActive(true);\n        closeMenu();\n      }\n\n      function getItemEvents(item: Menu) {\n        if (unref(getMixSideTrigger) === 'hover') {\n          return {\n            onMouseenter: () => handleModuleClick(item.path, true),\n            onClick: async () => {\n              const children = await getChildrenMenus(item.path);\n              if (item.path && (!children || children.length === 0)) go(item.path);\n            },\n          };\n        }\n        return {\n          onClick: () => handleModuleClick(item.path),\n        };\n      }\n\n      function handleFixedMenu() {\n        setMenuSetting({\n          mixSideFixed: !unref(getIsFixed),\n        });\n      }\n\n      // Close menu\n      function closeMenu() {\n        if (!unref(getIsFixed)) {\n          openMenu.value = false;\n        }\n      }\n\n      // 代码逻辑说明: 【QQYUN-8927】侧边折叠导航模式区分彩色模式\n      watch(\n        () => appStore.getProjectConfig.menuSetting,\n        (menuSetting) => {\n          isThemeBright.value = !!menuSetting?.isThemeBright;\n        },\n        { immediate: true, deep: true }\n      );\n\n      return {\n        t,\n        prefixCls,\n        menuModules,\n        handleModuleClick: handleModuleClick,\n        activePath,\n        childrenMenus: childrenMenus,\n        getShowDragBar,\n        handleMenuClick,\n        getMenuStyle,\n        handleClickOutside,\n        sideRef,\n        dragBarRef,\n        shortTitle,\n        openMenu,\n        getMenuTheme,\n        getItemEvents,\n        getMenuEvents,\n        getDomStyle,\n        handleFixedMenu,\n        getMixSideFixed,\n        getWrapStyle,\n        getCollapsed,\n        isThemeBright,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-layout-mix-sider';\n  @width: 80px;\n  .@{prefix-cls} {\n    position: fixed;\n    top: 0;\n    left: 0;\n    z-index: @layout-mix-sider-fixed-z-index;\n    height: 100%;\n    overflow: hidden;\n    background-color: @sider-dark-bg-color;\n    transition: all 0.2s ease 0s;\n\n    &-dom {\n      height: 100%;\n      overflow: hidden;\n      transition: all 0.2s ease 0s;\n    }\n\n    &-logo {\n      display: flex;\n      height: @header-height;\n      padding-left: 0 !important;\n      justify-content: center;\n\n      img {\n        width: @logo-width;\n        height: @logo-width;\n      }\n    }\n\n    &.light {\n      .@{prefix-cls}-logo {\n        border-bottom: 1px solid rgb(238, 238, 238);\n      }\n\n      &.open {\n        > .scrollbar {\n          border-right: 1px solid rgb(238, 238, 238);\n        }\n      }\n\n      .@{prefix-cls}-module {\n        &__item {\n          font-weight: normal;\n          color: rgba(0, 0, 0, 0.65);\n\n          &--active {\n            color: @primary-color;\n            background-color: unset;\n          }\n        }\n      }\n      .@{prefix-cls}-menu-list {\n        &__content {\n          box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.1);\n        }\n\n        &__title {\n          .pushpin {\n            color: rgba(0, 0, 0, 0.35);\n\n            &:hover {\n              color: rgba(0, 0, 0, 0.85);\n            }\n          }\n        }\n      }\n    }\n    @border-color: @sider-dark-lighten-bg-color;\n\n    &.dark {\n      &.open {\n        .@{prefix-cls}-logo {\n          // border-bottom: 1px solid @border-color;\n        }\n\n        > .scrollbar {\n          border-right: 1px solid @border-color;\n        }\n      }\n      .@{prefix-cls}-menu-list {\n        background-color: @sider-dark-bg-color;\n\n        &__title {\n          color: @white;\n          border-bottom: none;\n          border-bottom: 1px solid @border-color;\n        }\n      }\n      // 侧边折叠导航彩色模式文字颜色\n      &.bright {\n        .@{prefix-cls}-module {\n          &__item {\n            font-weight: normal;\n            color: rgba(255, 255, 255, 1);\n            &:hover {\n              color: rgba(255, 255, 255, 0.8);\n            }\n          }\n        }\n      }\n    }\n\n    > .scrollbar {\n      height: calc(100% - @header-height - 38px);\n    }\n\n    &.mini &-module {\n      &__name {\n        display: none;\n      }\n\n      &__icon {\n        margin-bottom: 0;\n      }\n    }\n\n    &-module {\n      position: relative;\n      padding-top: 1px;\n\n      &__item {\n        position: relative;\n        padding: 12px 0;\n        color: rgba(255, 255, 255, 0.65);\n        text-align: center;\n        cursor: pointer;\n        transition: all 0.3s ease;\n\n        &:hover {\n          color: @white;\n        }\n        // &:hover,\n        &--active {\n          font-weight: 700;\n          color: @white;\n          background-color: @sider-dark-darken-bg-color;\n\n          &::before {\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 3px;\n            height: 100%;\n            background-color: @primary-color;\n            content: '';\n          }\n        }\n      }\n\n      &__icon {\n        margin-bottom: 8px;\n        font-size: 24px;\n        transition: all 0.2s;\n      }\n\n      &__name {\n        margin-bottom: 0;\n        font-size: 12px;\n        transition: all 0.2s;\n      }\n    }\n\n    &-trigger {\n      position: absolute;\n      bottom: 0;\n      left: 0;\n      width: 100%;\n      font-size: 14px;\n      color: rgba(255, 255, 255, 0.65);\n      text-align: center;\n      cursor: pointer;\n      background-color: @trigger-dark-bg-color;\n      height: 36px;\n      line-height: 36px;\n    }\n\n    &.light &-trigger {\n      color: rgba(0, 0, 0, 0.65);\n      background-color: #fff;\n      border-top: 1px solid #eee;\n    }\n\n    &-menu-list {\n      position: fixed;\n      top: 0;\n      width: 200px;\n      height: calc(100%);\n      background-color: #fff;\n      transition: all 0.2s;\n\n      &__title {\n        display: flex;\n        height: @header-height;\n        // margin-left: -6px;\n        font-size: 18px;\n        color: @primary-color;\n        border-bottom: 1px solid rgb(238, 238, 238);\n        opacity: 0;\n        transition: unset;\n        align-items: center;\n        justify-content: space-between;\n\n        text-align: center;\n        .text {flex: 1;}\n\n        &.show {\n          min-width: 130px;\n          opacity: 1;\n          transition: all 0.5s ease;\n        }\n\n        .pushpin {\n          margin-right: 6px;\n          color: rgba(255, 255, 255, 0.65);\n          cursor: pointer;\n\n          &:hover {\n            color: #fff;\n          }\n        }\n      }\n\n      .@{namespace}-simple-menu-sub-title {\n        font-size: 14px;\n      }\n\n      &__content {\n        height: calc(100% - @header-height) !important;\n\n        .scrollbar__wrap {\n          height: 100%;\n          overflow-x: hidden;\n        }\n\n        .scrollbar__bar.is-horizontal {\n          display: none;\n        }\n\n        .ant-menu {\n          height: 100%;\n        }\n\n        .ant-menu-inline,\n        .ant-menu-vertical,\n        .ant-menu-vertical-left {\n          border-right: 1px solid transparent;\n        }\n      }\n    }\n\n    &-drag-bar {\n      position: absolute;\n      top: 50px;\n      right: -1px;\n      width: 1px;\n      height: calc(100% - 50px);\n      cursor: ew-resize;\n      background-color: #f8f8f9;\n      border-top: none;\n      border-bottom: none;\n      box-shadow: 0 0 4px 0 rgba(28, 36, 56, 0.15);\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/sider/index.vue",
    "content": "<template>\n  <Drawer\n    v-if=\"getIsMobile\"\n    placement=\"left\"\n    :class=\"prefixCls\"\n    :width=\"getMenuWidth\"\n    :getContainer=\"null\"\n    :open=\"!getCollapsed\"\n    @close=\"handleClose\"\n  >\n    <Sider />\n  </Drawer>\n  <MixSider v-else-if=\"getIsMixSidebar\" />\n  <Sider v-else />\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n\n  import Sider from './LayoutSider.vue';\n  import MixSider from './MixSider.vue';\n  import { Drawer } from 'ant-design-vue';\n\n  import { useAppInject } from '/@/hooks/web/useAppInject';\n  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  export default defineComponent({\n    name: 'SiderWrapper',\n    components: { Sider, Drawer, MixSider },\n    setup() {\n      const { prefixCls } = useDesign('layout-sider-wrapper');\n      const { getIsMobile } = useAppInject();\n      const { setMenuSetting, getCollapsed, getMenuWidth, getIsMixSidebar } = useMenuSetting();\n\n      function handleClose() {\n        setMenuSetting({\n          collapsed: true,\n        });\n      }\n\n      return { prefixCls, getIsMobile, getCollapsed, handleClose, getMenuWidth, getIsMixSidebar };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-layout-sider-wrapper';\n\n  .@{prefix-cls} {\n    .ant-drawer-body {\n      height: 100vh;\n      padding: 0;\n    }\n\n    .ant-drawer-header-no-title {\n      display: none;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/sider/useLayoutSider.ts",
    "content": "import type { Ref } from 'vue';\n\nimport { computed, unref, onMounted, nextTick, ref } from 'vue';\n\nimport { TriggerEnum } from '/@/enums/menuEnum';\n\nimport { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\nimport { useDebounceFn } from '@vueuse/core';\n\n/**\n * Handle related operations of menu events\n */\nexport function useSiderEvent() {\n  const brokenRef = ref(false);\n\n  const { getMiniWidthNumber } = useMenuSetting();\n\n  const getCollapsedWidth = computed(() => {\n    return unref(brokenRef) ? 0 : unref(getMiniWidthNumber);\n  });\n\n  function onBreakpointChange(broken: boolean) {\n    brokenRef.value = broken;\n  }\n\n  return { getCollapsedWidth, onBreakpointChange };\n}\n\n/**\n * Handle related operations of menu folding\n */\nexport function useTrigger(getIsMobile: Ref<boolean>) {\n  const { getTrigger, getSplit } = useMenuSetting();\n\n  const getShowTrigger = computed(() => {\n    const trigger = unref(getTrigger);\n\n    return trigger !== TriggerEnum.NONE && !unref(getIsMobile) && (trigger === TriggerEnum.FOOTER || unref(getSplit));\n  });\n\n  const getTriggerAttr = computed(() => {\n    if (unref(getShowTrigger)) {\n      return {};\n    }\n    return {\n      trigger: null,\n    };\n  });\n\n  return { getTriggerAttr, getShowTrigger };\n}\n\n/**\n * Handle menu drag and drop related operations\n * @param siderRef\n * @param dragBarRef\n */\nexport function useDragLine(siderRef: Ref<any>, dragBarRef: Ref<any>, mix = false) {\n  const { getMiniWidthNumber, getCollapsed, setMenuSetting } = useMenuSetting();\n\n  onMounted(() => {\n    nextTick(() => {\n      const exec = useDebounceFn(changeWrapWidth, 80);\n      exec();\n    });\n  });\n\n  function getEl(elRef: Ref<ElRef | ComponentRef>): any {\n    const el = unref(elRef);\n    if (!el) return null;\n    if (Reflect.has(el, '$el')) {\n      return (unref(elRef) as ComponentRef)?.$el;\n    }\n    return unref(elRef);\n  }\n\n  function handleMouseMove(ele: HTMLElement, wrap: HTMLElement, clientX: number) {\n    document.onmousemove = function (innerE) {\n      let iT = (ele as any).left + (innerE.clientX - clientX);\n      innerE = innerE || window.event;\n      const maxT = 800;\n      const minT = unref(getMiniWidthNumber);\n      iT < 0 && (iT = 0);\n      iT > maxT && (iT = maxT);\n      iT < minT && (iT = minT);\n      ele.style.left = wrap.style.width = iT + 'px';\n      return false;\n    };\n  }\n\n  // Drag and drop in the menu area-release the mouse\n  function removeMouseup(ele: any) {\n    const wrap = getEl(siderRef);\n    document.onmouseup = function () {\n      document.onmousemove = null;\n      document.onmouseup = null;\n      wrap.style.transition = 'width 0.2s';\n      const width = parseInt(wrap.style.width);\n\n      if (!mix) {\n        const miniWidth = unref(getMiniWidthNumber);\n        if (!unref(getCollapsed)) {\n          width > miniWidth + 20 ? setMenuSetting({ menuWidth: width }) : setMenuSetting({ collapsed: true });\n        } else {\n          width > miniWidth && setMenuSetting({ collapsed: false, menuWidth: width });\n        }\n      } else {\n        setMenuSetting({ menuWidth: width });\n      }\n\n      ele.releaseCapture?.();\n    };\n  }\n\n  function changeWrapWidth() {\n    const ele = getEl(dragBarRef);\n    if (!ele) return;\n    const wrap = getEl(siderRef);\n    if (!wrap) return;\n\n    ele.onmousedown = (e: any) => {\n      wrap.style.transition = 'unset';\n      const clientX = e?.clientX;\n      ele.left = ele.offsetLeft;\n      handleMouseMove(ele, wrap, clientX);\n      removeMouseup(ele);\n      ele.setCapture?.();\n      return false;\n    };\n  }\n\n  return {};\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/tabs/components/FoldButton.vue",
    "content": "<template>\n  <span :class=\"`${prefixCls}__extra-fold`\" @click=\"handleFold\">\n    <Icon :icon=\"getIcon\" />\n  </span>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, unref, computed } from 'vue';\n  import { Icon } from '/@/components/Icon';\n\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';\n  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\n  import { triggerWindowResize } from '/@/utils/event';\n\n  export default defineComponent({\n    name: 'FoldButton',\n    components: { Icon },\n    setup() {\n      const { prefixCls } = useDesign('multiple-tabs-content');\n      const { getShowMenu, setMenuSetting } = useMenuSetting();\n      const { getShowHeader, setHeaderSetting } = useHeaderSetting();\n\n      const getIsUnFold = computed(() => !unref(getShowMenu) && !unref(getShowHeader));\n\n      const getIcon = computed(() => (unref(getIsUnFold) ? 'codicon:screen-normal' : 'codicon:screen-full'));\n\n      function handleFold() {\n        const isUnFold = unref(getIsUnFold);\n        setMenuSetting({\n          show: isUnFold,\n          hidden: !isUnFold,\n        });\n        setHeaderSetting({ show: isUnFold });\n        triggerWindowResize();\n      }\n\n      return { prefixCls, getIcon, handleFold };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/tabs/components/TabContent.vue",
    "content": "<template>\n  <Dropdown :dropMenuList=\"getDropMenuList\" :trigger=\"getTrigger\" @menuEvent=\"handleMenuEvent\" :overlayClassName=\"prefixCls\">\n    <div :class=\"`${prefixCls}__info`\" @contextmenu=\"handleContext\" v-if=\"getIsTabs\">\n      <!-- updateBy:sunjianlei---updateDate:2021-09-03---修改tab切换栏样式：增加前缀图标 -->\n      <!-- <span v-if=\"showPrefixIcon\" :class=\"`${prefixCls}__prefix-icon`\" @click=\"handleContext\">\n        <Icon :icon=\"prefixIconType\" :size=\"14\" />\n      </span> -->\n      <span class=\"ml-1\">{{ getTitle }}</span>\n    </div>\n    <span :class=\"`${prefixCls}__extra-quick`\" v-else @click=\"handleContext\">\n      <Icon icon=\"ion:chevron-down\" />\n    </span>\n  </Dropdown>\n</template>\n<script lang=\"ts\">\n  import type { PropType } from 'vue';\n  import type { RouteLocationNormalized } from 'vue-router';\n\n  import { defineComponent, computed, unref } from 'vue';\n  import { Dropdown } from '/@/components/Dropdown/index';\n  import { Icon } from '/@/components/Icon';\n\n  import { TabContentProps } from '../types';\n\n  import { TabsThemeEnum } from '/@/enums/appEnum';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useTabDropdown } from '../useTabDropdown';\n  import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';\n  import { useLocaleStore } from '/@/store/modules/locale';\n  import { PageEnum } from '/@/enums/pageEnum';\n\n  export default defineComponent({\n    name: 'TabContent',\n    components: { Dropdown, Icon },\n    props: {\n      tabItem: {\n        type: Object as PropType<RouteLocationNormalized>,\n        default: null,\n      },\n      isExtra: Boolean,\n    },\n    setup(props) {\n      const { prefixCls } = useDesign('multiple-tabs-content');\n      const { t } = useI18n();\n\n      // 代码逻辑说明: VUEN-1144 online 配置成菜单后，打开菜单，显示名称未展示为菜单名称\n      const localeStore = useLocaleStore();\n      const getTitle = computed(() => {\n        const { tabItem: { meta, fullPath } = {} } = props;\n        let title = localeStore.getPathTitle(fullPath);\n        if (title) {\n          return title;\n        }\n        return meta && t(meta.title as string);\n      });\n\n      const getIsTabs = computed(() => !props.isExtra);\n\n      // updateBy:sunjianlei---updateDate:2021-09-03---修改tab切换栏样式：前缀图标类型\n      const prefixIconType = computed(() => {\n        if (props.tabItem.meta.icon) {\n          return props.tabItem.meta.icon;\n        } else if (props.tabItem.path === PageEnum.BASE_HOME) {\n          // 当是首页时返回 home 图标 TODO 此处可能需要动态判断首页路径\n          return 'ant-design:home-outlined';\n        } else {\n          return 'ant-design:code';\n        }\n      });\n\n      const getTrigger = computed((): ('contextmenu' | 'click' | 'hover')[] => (unref(getIsTabs) ? ['contextmenu'] : ['click']));\n\n      const { getDropMenuList, handleMenuEvent, handleContextMenu } = useTabDropdown(props as TabContentProps, getIsTabs);\n\n      function handleContext(e) {\n        props.tabItem && handleContextMenu(props.tabItem)(e);\n      }\n\n      const { getTabsTheme } = useMultipleTabSetting();\n      // 是否显示图标\n      const showPrefixIcon = computed(() => unref(getTabsTheme) === TabsThemeEnum.SMOOTH);\n\n      return {\n        prefixCls,\n        getDropMenuList,\n        handleMenuEvent,\n        handleContext,\n        getTrigger,\n        getIsTabs,\n        getTitle,\n        prefixIconType,\n        showPrefixIcon,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-multiple-tabs-content';\n  .@{prefix-cls} {\n    .ant-dropdown-menu-item {\n      .ant-dropdown-menu-title-content {\n        .anticon {\n          font-size: 14px !important;\n        }\n        span:not(.anticon) {\n          margin-left: 6px;\n        }\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/tabs/components/TabRedo.vue",
    "content": "<template>\n  <span :class=\"`${prefixCls}__extra-redo`\" @click=\"handleRedo\">\n    <SvgIcon name=\"reload-01\"></SvgIcon>\n  </span>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useTabs } from '/@/hooks/web/useTabs';\n  import { SvgIcon } from '/@/components/Icon/index';\n  export default defineComponent({\n    name: 'TabRedo',\n    components: { SvgIcon },\n\n    setup() {\n      const loading = ref(false);\n\n      const { prefixCls } = useDesign('multiple-tabs-content');\n      const { refreshPage } = useTabs();\n\n      async function handleRedo() {\n        loading.value = true;\n        await refreshPage();\n        setTimeout(() => {\n          loading.value = false;\n          // Animation execution time\n        }, 1200);\n      }\n      return { prefixCls, handleRedo, loading };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/tabs/index.less",
    "content": "@prefix-cls: ~'@{namespace}-multiple-tabs';\n\nhtml[data-theme='dark'] {\n  .@{prefix-cls} {\n    .ant-tabs-tab {\n      border-bottom: 1px solid @border-color-base;\n    }\n  }\n}\n\nhtml[data-theme='light'] {\n  .@{prefix-cls} {\n    .ant-tabs-tab:not(.ant-tabs-tab-active) {\n      border: 1px solid #e6e6e6;\n    }\n  }\n}\n\n.@{prefix-cls} {\n  z-index: 10;\n  height: @multiple-height + 2;\n  line-height: @multiple-height + 2;\n  background-color: @component-background;\n  border-bottom: 1px solid @border-color-base;\n  box-shadow: 0 4px 4px rgb(0 21 41 / 8%);\n\n  .ant-tabs-small {\n    height: calc(@multiple-height + 4px);\n  }\n\n  .ant-tabs.ant-tabs-card {\n    padding-left: 0px;\n\n    .ant-tabs-nav {\n      height: calc(@multiple-height);\n      margin: 0;\n      background-color: @component-background;\n      border: 0;\n      box-shadow: none;\n\n      .ant-tabs-nav-wrap {\n        height: @multiple-height;\n        margin-top: 2px;\n      }\n\n      .ant-tabs-tab {\n        height: calc(@multiple-height - 4px);\n        padding-right: 12px;\n        line-height: calc(@multiple-height - 4px);\n        color: @text-color-base;\n        background-color: @component-background;\n        transition: none;\n\n        .ant-tabs-tab-btn {\n          color: @text-color-base;\n          transition: none;\n        }\n\n        &:hover {\n          .ant-tabs-tab-remove .anticon-close {\n            opacity: 1;\n          }\n        }\n\n        .ant-tabs-tab-remove {\n          margin: 0;\n          padding: 0;\n          position: relative;\n          top: 0;\n          left: 4px;\n\n          .anticon-close {\n            width: 8px;\n            height: 12px;\n            font-size: 12px;\n            color: inherit;\n            opacity: 0;\n            transition: none;\n\n            &:hover {\n              svg {\n                width: 0.8em;\n              }\n            }\n          }\n        }\n\n        > div {\n          display: flex;\n          justify-content: center;\n          align-items: center;\n        }\n\n        svg {\n          fill: @text-color-base;\n        }\n      }\n\n      .ant-tabs-tab:not(.ant-tabs-tab-active) {\n        &:hover {\n          color: @primary-color;\n        }\n      }\n\n      .ant-tabs-tab-active {\n        position: relative;\n        padding-left: 18px;\n        color: @white !important;\n        background: @primary-color;\n        border: 1px solid transparent;\n        transition: none;\n\n        .ant-tabs-tab-btn {\n          color: @white;\n        }\n\n        .ant-tabs-tab-remove .anticon-close {\n          opacity: 1;\n        }\n\n        svg {\n          width: 0.7em;\n          fill: @white;\n        }\n      }\n    }\n\n    .ant-tabs-nav > div:nth-child(1) {\n      padding: 0 6px;\n\n      .ant-tabs-tab {\n        margin-right: 6px !important;\n      }\n    }\n  }\n\n  .ant-tabs-tab:not(.ant-tabs-tab-active) {\n    .ant-tabs-tab-remove .anticon-close {\n      font-size: 12px;\n\n      svg {\n        width: 0.6em;\n      }\n    }\n  }\n\n  .ant-tabs-extra-content {\n    // update-begin--author:liaozhiyang---date:20241016---for：【issues/7345】标签样式切换到极简模式样式错乱\n    // margin-top: 2px;\n    // update-end--author:liaozhiyang---date:20241016---for：【issues/7345】标签样式切换到极简模式样式错乱\n    line-height: @multiple-height !important;\n  }\n\n  .ant-dropdown-trigger {\n    display: inline-flex;\n  }\n\n  &--hide-close {\n    .ant-tabs-tab-remove .anticon-close {\n      opacity: 0 !important;\n    }\n  }\n\n  &-content {\n    &__extra-quick,\n    &__extra-redo,\n    &__extra-fold {\n      display: inline-block;\n      width: 36px;\n      height: @multiple-height;\n      line-height: @multiple-height;\n      color: @text-color-secondary;\n      text-align: center;\n      cursor: pointer;\n      border-left: 1px solid @border-color-base;\n\n      &:hover {\n        color: @text-color-base;\n      }\n\n      span[role='img'] {\n        transform: rotate(90deg);\n      }\n    }\n\n    &__extra-redo {\n      span[role='img'] {\n        transform: rotate(0deg);\n      }\n    }\n\n    &__info {\n      display: inline-block;\n      width: 100%;\n      height: @multiple-height - 2;\n      padding-left: 0;\n      margin-left: -10px;\n      font-size: 12px;\n      cursor: pointer;\n      user-select: none;\n    }\n  }\n}\n\n.ant-tabs-dropdown-menu {\n  &-title-content {\n    display: flex;\n    align-items: center;\n\n    .@{prefix-cls} {\n      &-content__info {\n        width: auto;\n        margin-left: 0;\n        line-height: 28px;\n      }\n    }\n  }\n\n  &-item-remove {\n    margin-left: auto;\n  }\n}\n\n.multiple-tabs__dropdown {\n  .ant-dropdown-content {\n    width: 172px;\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/tabs/index.vue",
    "content": "<template>\n  <div :class=\"getWrapClass\">\n    <Tabs\n      type=\"editable-card\"\n      size=\"small\"\n      :animated=\"false\"\n      :hideAdd=\"true\"\n      :tabBarGutter=\"3\"\n      :activeKey=\"activeKeyRef\"\n      @change=\"handleChange\"\n      @edit=\"handleEdit\"\n    >\n      <template v-for=\"item in getTabsState\" :key=\"item.query ? item.fullPath : item.path\">\n        <TabPane :closable=\"!(item && item.meta && item.meta.affix)\">\n          <template #tab>\n            <TabContent :tabItem=\"item\" />\n          </template>\n        </TabPane>\n      </template>\n\n      <template #rightExtra v-if=\"getShowRedo || getShowQuick\">\n        <div class=\"rightExtra\">\n          <TabRedo v-if=\"getShowRedo\" />\n          <!-- <TabContent isExtra :tabItem=\"$route\" v-if=\"getShowQuick\" /> -->\n          <!-- 列表页全屏 \n          <FoldButton v-if=\"getShowFold\" />-->\n          <!-- <FullscreenOutlined /> -->\n          <router-link to=\"/ai\" class=\"ai-icon\">\n            <a-tooltip title=\"AI助手\" placement=\"left\">\n              <svg t=\"1706259688149\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2056\" width=\"17\" height=\"17\">\n                <path d=\"M826.368 325.632c0-7.168 2.048-10.24 10.24-10.24h123.904c7.168 0 10.24 2.048 10.24 10.24v621.568c0 7.168-2.048 10.24-10.24 10.24h-122.88c-8.192 0-10.24-4.096-10.24-10.24l-1.024-621.568z m-8.192-178.176c0-50.176 35.84-79.872 79.872-79.872 48.128 0 79.872 32.768 79.872 79.872 0 52.224-33.792 79.872-81.92 79.872-46.08 1.024-77.824-27.648-77.824-79.872zM462.848 584.704C441.344 497.664 389.12 307.2 368.64 215.04h-2.048c-16.384 92.16-58.368 247.808-92.16 369.664h188.416zM243.712 712.704l-62.464 236.544c-2.048 7.168-4.096 8.192-12.288 8.192H54.272c-8.192 0-10.24-2.048-8.192-12.288l224.256-783.36c4.096-13.312 7.168-26.624 8.192-65.536 0-6.144 2.048-8.192 7.168-8.192H450.56c6.144 0 8.192 2.048 10.24 8.192l250.88 849.92c2.048 7.168 0 10.24-7.168 10.24H573.44c-7.168 0-10.24-2.048-12.288-7.168l-65.536-236.544c1.024 1.024-251.904 0-251.904 0z\" fill=\"#333333\" p-id=\"19816\"></path>\n              </svg>\n            </a-tooltip>\n          </router-link>\n        </div>\n      </template>\n    </Tabs>\n  </div>\n</template>\n<script lang=\"ts\">\n  import type { RouteLocationNormalized, RouteMeta } from 'vue-router';\n\n  import { defineComponent, computed, unref, ref } from 'vue';\n\n  import { Tabs } from 'ant-design-vue';\n  import TabContent from './components/TabContent.vue';\n  import FoldButton from './components/FoldButton.vue';\n  import TabRedo from './components/TabRedo.vue';\n\n  import { useGo } from '/@/hooks/web/usePage';\n\n  import { useMultipleTabStore } from '/@/store/modules/multipleTab';\n  import { useUserStore } from '/@/store/modules/user';\n\n  import { initAffixTabs, useTabsDrag } from './useMultipleTabs';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';\n\n  import { REDIRECT_NAME } from '/@/router/constant';\n  import { listenerRouteChange } from '/@/logics/mitt/routeChange';\n\n  import { useRouter } from 'vue-router';\n  import Aide from \"/@/views/dashboard/ai/components/aide/index.vue\"\n\n  export default defineComponent({\n    name: 'MultipleTabs',\n    components: {\n      TabRedo,\n      FoldButton,\n      Tabs,\n      TabPane: Tabs.TabPane,\n      TabContent,\n      Aide,\n    },\n    setup() {\n      const affixTextList = initAffixTabs();\n      const activeKeyRef = ref('');\n\n      useTabsDrag(affixTextList);\n      const tabStore = useMultipleTabStore();\n      const userStore = useUserStore();\n      const router = useRouter();\n\n      const { prefixCls } = useDesign('multiple-tabs');\n      const go = useGo();\n      const { getShowQuick, getShowRedo, getShowFold, getTabsTheme } = useMultipleTabSetting();\n\n      const getTabsState = computed(() => {\n        return tabStore.getTabList.filter((item) => !item.meta?.hideTab);\n      });\n\n      const unClose = computed(() => unref(getTabsState).length === 1);\n\n      const getWrapClass = computed(() => {\n        return [\n          prefixCls,\n          {\n            [`${prefixCls}--hide-close`]: unref(unClose),\n          },\n          `${prefixCls}--theme-${unref(getTabsTheme)}`,\n        ];\n      });\n\n      listenerRouteChange((route) => {\n        const { name } = route;\n        if (name === REDIRECT_NAME || !route || !userStore.getToken) {\n          return;\n        }\n\n        const { path, fullPath, meta = {} } = route;\n        const { currentActiveMenu, hideTab } = meta as RouteMeta;\n        const isHide = !hideTab ? null : currentActiveMenu;\n        const p = isHide || fullPath || path;\n        if (activeKeyRef.value !== p) {\n          activeKeyRef.value = p as string;\n        }\n\n        if (isHide) {\n          const findParentRoute = router.getRoutes().find((item) => item.path === currentActiveMenu);\n\n          findParentRoute && tabStore.addTab(findParentRoute as unknown as RouteLocationNormalized);\n        } else {\n          tabStore.addTab(unref(route));\n        }\n      });\n\n      function handleChange(activeKey: any) {\n        activeKeyRef.value = activeKey;\n        go(activeKey, false);\n      }\n\n      // Close the current tab\n      function handleEdit(targetKey: string) {\n        // Added operation to hide, currently only use delete operation\n        if (unref(unClose)) {\n          return;\n        }\n\n        tabStore.closeTabByKey(targetKey, router);\n      }\n      return {\n        prefixCls,\n        unClose,\n        getWrapClass,\n        handleEdit,\n        handleChange,\n        activeKeyRef,\n        getTabsState,\n        getShowQuick,\n        getShowRedo,\n        getShowFold,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @import './index.less';\n  @import './tabs.theme.card.less';\n  @import './tabs.theme.smooth.less';\n</style>\n<style lang=\"less\" scoped>\n@prefix-cls: ~'@{namespace}-multiple-tabs';\n.@{prefix-cls} {\n  :deep(.anticon) {\n    display: inline-block;\n  }\n  // 代码逻辑说明: 【issues/7345】标签样式切换到极简模式样式错乱\n  .rightExtra {\n    display: flex;\n    :deep(svg) {\n      &:not(.icon) {\n        vertical-align: -0.3em;\n      }\n    }\n    .ai-icon {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      cursor: pointer;\n      width: 36px;\n      color: @text-color;\n      text-align: center;\n      border-left: 1px solid @border-color-base;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/tabs/tabs.theme.card.less",
    "content": "// tabs卡片样式\n@prefix-cls-theme-card: ~'@{prefix-cls}.@{prefix-cls}--theme-card';\n\nhtml[data-theme='dark'] {\n  .@{prefix-cls-theme-card} {\n    .ant-tabs-tab {\n      border-top: none !important;\n      border-left: none !important;\n      border-right: none !important;\n    }\n  }\n}\n\nhtml[data-theme='light'] {\n  .@{prefix-cls-theme-card} {\n    .ant-tabs-tab:not(.ant-tabs-tab-active) {\n      border-top: none !important;\n      border-left: none !important;\n      border-right: none !important;\n    }\n  }\n}\n\n.@{prefix-cls-theme-card} {\n  @tabHeight: calc(@multiple-card-height - 10px);\n\n  z-index: 10;\n  height: @multiple-card-height;\n  line-height: @multiple-card-height;\n  background-color: @component-background;\n  box-shadow: 0 1px 4px rgb(0 21 41 / 8%);\n\n  .ant-tabs-small {\n    height: @multiple-card-height;\n  }\n\n  .ant-tabs.ant-tabs-card {\n    .ant-tabs-nav {\n      height: @multiple-card-height;\n      margin: 0;\n      background-color: @component-background;\n      border: 0;\n      box-shadow: none;\n      padding-left: 10px;\n\n      .ant-tabs-nav-wrap {\n        height: @tabHeight;\n        margin-top: 4px;\n        padding-top: 0;\n      }\n\n      .ant-tabs-tab {\n        height: @tabHeight;\n        line-height: @tabHeight;\n        color: @text-color-base;\n        background-color: @component-background;\n        padding: 0 20px 0 30px;\n        margin: 0 10px 0 0 !important;\n\n        .ant-tabs-tab-btn {\n          color: @text-color-call-out;\n        }\n\n        &:hover {\n          //padding: 0 36px 0 30px;\n\n          .ant-tabs-tab-remove .anticon-close {\n            opacity: 1;\n\n            &:hover {\n              color: #fff;\n              background-color: #c0c4cc;\n            }\n          }\n        }\n\n        .ant-tabs-tab-remove {\n          //update-begin---author:scott ---date:2023-08-28  for：【QQYUN-6374】UnoCSS替代windicss导致应用样式问题--\n          /*   top: 5px;*/\n          //update-end---author:scott ---date::2023-08-28  for：【QQYUN-6374】UnoCSS替代windicss导致应用样式问题--\n          left: 4px;\n\n          .anticon-close {\n            position: relative;\n            width: 14px;\n            height: 14px;\n            font-size: 13px;\n            color: inherit;\n            opacity: 0;\n            transition: opacity 0.15s;\n            top: 0;\n            left: 6px;\n            vertical-align: middle;\n            line-height: 10px;\n            overflow: hidden;\n            transform-origin: 100% 50%;\n            border-radius: 100%;\n\n            &:hover {\n              svg {\n                fill: #fff;\n              }\n            }\n          }\n        }\n\n        > div {\n          display: flex;\n          justify-content: center;\n          align-items: center;\n        }\n\n        svg {\n          fill: @text-color-base;\n        }\n\n        &:first-child {\n        }\n      }\n\n      .ant-tabs-tab:not(.ant-tabs-tab-active) {\n        border: none !important;\n\n        &:hover {\n          color: @primary-color !important;\n          background-color: inherit;\n        }\n      }\n\n      .ant-tabs-tab-active {\n        position: relative;\n        color: @primary-color !important;\n        border: 1px solid transparent;\n        border-bottom: 1px solid @primary-color !important;\n        font-weight: inherit;\n\n        .ant-tabs-tab-btn {\n          color: @primary-color;\n        }\n\n        .ant-tabs-tab-remove .anticon-close {\n          opacity: 0;\n\n          svg {\n            width: 0.6em;\n          }\n        }\n\n        svg {\n          width: inherit;\n          fill: @primary-color;\n        }\n      }\n    }\n\n    .ant-tabs-nav > div:nth-child(1) {\n      padding: 0 6px;\n\n      .ant-tabs-tab {\n        margin-right: 10px !important;\n      }\n    }\n  }\n\n  .ant-tabs-tab:not(.ant-tabs-tab-active) {\n    .ant-tabs-tab-remove .anticon-close {\n      font-size: 12px;\n\n      svg {\n        width: 0.6em;\n      }\n    }\n  }\n\n  .ant-tabs-extra-content {\n    position: relative;\n    top: 0;\n    line-height: @multiple-card-height !important;\n  }\n\n  .ant-dropdown-trigger {\n    display: inline-flex;\n  }\n\n  .@{prefix-cls}--hide-close {\n    .ant-tabs-tab-remove .anticon-close {\n      opacity: 0 !important;\n    }\n  }\n\n  .@{prefix-cls}-content {\n    &__extra-quick,\n    &__extra-redo,\n    &__extra-fold {\n      display: inline-block;\n      width: 36px;\n      height: @multiple-card-height;\n      line-height: @multiple-card-height;\n      color: @text-color-secondary;\n      text-align: center;\n      cursor: pointer;\n      border-left: 1px solid @border-color-base;\n\n      &:hover {\n        color: @text-color-base;\n      }\n\n      span[role='img'] {\n        transform: rotate(90deg);\n      }\n    }\n\n    &__extra-redo {\n      span[role='img'] {\n        transform: rotate(0deg);\n      }\n    }\n\n    &__info {\n      display: inline-block;\n      width: 100%;\n      height: @tabHeight;\n      padding-left: 0;\n      font-size: 14px;\n      cursor: pointer;\n      user-select: none;\n    }\n\n    // tab 前缀图标样式\n    &__prefix-icon {\n      & .app-iconify.anticon {\n        margin-right: 4px;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/tabs/tabs.theme.smooth.less",
    "content": "// tabs圆滑样式\n@prefix-cls-theme-smooth: ~'@{prefix-cls}.@{prefix-cls}--theme-smooth';\n\nhtml[data-theme='dark'] {\n  .@{prefix-cls-theme-smooth} {\n    .ant-tabs-tab {\n      border: none !important;\n    }\n  }\n}\n\nhtml[data-theme='light'] {\n  .@{prefix-cls-theme-smooth} {\n    .ant-tabs-tab:not(.ant-tabs-tab-active) {\n      border: none !important;\n    }\n  }\n}\n\n.@{prefix-cls-theme-smooth} {\n  @tabHeight: calc(@multiple-smooth-height - 12px);\n  z-index: 10;\n  height: @multiple-smooth-height;\n  line-height: @multiple-smooth-height;\n  background-color: @component-background;\n  box-shadow: 0 1px 4px rgb(0 21 41 / 8%);\n\n  .ant-tabs-small {\n    height: @multiple-smooth-height;\n  }\n\n  .ant-tabs.ant-tabs-card {\n    .ant-tabs-nav {\n      height: @multiple-smooth-height;\n      margin: 0;\n      background-color: @component-background;\n      border: 0;\n      box-shadow: none;\n      padding-left: 10px;\n\n      .ant-tabs-nav-wrap {\n        height: @tabHeight;\n        margin-top: 12px;\n      }\n\n      .ant-tabs-tab {\n        height: @tabHeight;\n        line-height: @tabHeight;\n        color: @text-color-base;\n        background-color: @component-background;\n        transition: padding 0.3s;\n        padding: 0 20px 0 26px;\n        margin: 0 -14px 0 0 !important;\n        mask: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANoAAAAkBAMAAAAdqzmBAAAAMFBMVEVHcEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlTPQ5AAAAD3RSTlMAr3DvEM8wgCBA379gj5//tJBPAAAAnUlEQVRIx2NgAAM27fj/tAO/xBsYkIHyf9qCT8iWMf6nNQhAsk2f5rYheY7Dnua2/U+A28ZEe8v+F9Ax2v7/F4DbxkUH2wzgtvHTwbYPo7aN2jZq26hto7aN2jZq25Cy7Qvctnw62PYNbls9HWz7S8/G6//PsI6H4396gAUQy1je08W2jxDbpv6nD4gB2uWp+J9eYPsEhv/0BPS1DQBvoBLVZ3BppgAAAABJRU5ErkJggg==);\n        mask-size: 100% 100%;\n        position: relative;\n        z-index: 1;\n\n        .ant-tabs-tab-btn {\n          color: @text-color-base;\n        }\n\n        &:hover {\n          z-index: 2;\n          padding: 0 20px 0 26px;\n\n          .ant-tabs-tab-remove .anticon-close {\n            opacity: 1;\n\n            &:hover {\n              color: #fff;\n              background-color: #c0c4cc;\n            }\n          }\n        }\n\n        .ant-tabs-tab-remove {\n          top: -1px;\n          left: 8px;\n\n          .anticon-close {\n            position: relative;\n            width: 14px;\n            height: 14px;\n            font-size: 13px;\n            color: inherit;\n            opacity: 0;\n            transition: opacity 0.15s;\n            vertical-align: middle;\n            line-height: 10px;\n            overflow: hidden;\n            transform-origin: 100% 50%;\n            border-radius: 100%;\n\n            &:hover {\n              svg {\n                fill: #fff;\n              }\n            }\n          }\n        }\n        > div {\n          display: flex;\n          justify-content: center;\n          align-items: center;\n        }\n\n        svg {\n          fill: @text-color-base;\n        }\n\n        &:first-child {\n          padding: 0 30px 0 30px !important;\n        }\n        span{font-weight: 200;}\n      }\n\n      .ant-tabs-tab:not(.ant-tabs-tab-active) {\n        &:hover {\n          color: inherit;\n          background-color: #f5f5f5;\n        }\n      }\n\n      .ant-tabs-tab.ant-tabs-tab-active {\n        position: relative;\n        padding: 0 20px 0 26px;\n        color: @primary-color !important;\n        background: #f5f5f5;\n        border: 0;\n        z-index: 3;\n\n        .ant-tabs-tab-btn {\n          color: @primary-color;\n        }\n\n        .ant-tabs-tab-remove .anticon-close {\n          opacity: 1;\n\n          svg {\n            width: 0.6em;\n          }\n        }\n\n        svg {\n          width: inherit;\n          fill: @primary-color;\n        }\n      }\n    }\n\n    .ant-tabs-nav > div:nth-child(1) {\n      padding: 0 6px;\n\n      .ant-tabs-tab {\n        margin-right: -15px !important;\n      }\n    }\n  }\n\n  .ant-tabs-tab:not(.ant-tabs-tab-active) {\n    .anticon-close {\n      font-size: 12px;\n\n      svg {\n        width: 0.6em;\n      }\n    }\n  }\n\n  .ant-tabs-extra-content {\n    position: relative;\n    top: 0;\n    line-height: @multiple-smooth-height !important;\n  }\n\n  .ant-dropdown-trigger {\n    display: inline-flex;\n  }\n\n  .@{prefix-cls}--hide-close {\n    .ant-tabs-tab-remove .anticon-close {\n      opacity: 0 !important;\n    }\n  }\n\n  .@{prefix-cls}-content {\n    &__extra-quick,\n    &__extra-redo,\n    &__extra-fold {\n      display: inline-block;\n      width: 36px;\n      height: @multiple-smooth-height;\n      line-height: @multiple-smooth-height;\n      color: @text-color-secondary;\n      text-align: center;\n      cursor: pointer;\n      border-left: 1px solid @border-color-base;\n\n      &:hover {\n        color: @text-color-base;\n      }\n\n      span[role='img'] {\n        transform: rotate(90deg);\n      }\n    }\n\n    &__extra-redo {\n      span[role='img'] {\n        transform: rotate(0deg);\n      }\n    }\n\n    &__info {\n      display: inline-block;\n      width: 100%;\n      height: @tabHeight;\n      line-height: 32px;\n      padding-left: 0;\n      font-size: 14px;\n      cursor: pointer;\n      user-select: none;\n    }\n\n    // tab 前缀图标样式\n    &__prefix-icon {\n      & .app-iconify.anticon {\n        margin-right: 4px;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/tabs/types.ts",
    "content": "import type { DropMenu } from '/@/components/Dropdown/index';\nimport type { RouteLocationNormalized } from 'vue-router';\n\nexport enum TabContentEnum {\n  TAB_TYPE,\n  EXTRA_TYPE,\n}\n\nexport type { DropMenu };\n\nexport interface TabContentProps {\n  tabItem: RouteLocationNormalized;\n  type?: TabContentEnum;\n  trigger?: ('click' | 'hover' | 'contextmenu')[];\n}\n\nexport enum MenuEventEnum {\n  REFRESH_PAGE,\n  CLOSE_CURRENT,\n  CLOSE_LEFT,\n  CLOSE_RIGHT,\n  CLOSE_OTHER,\n  CLOSE_ALL,\n  SCALE,\n  HOME_DESIGN,\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/tabs/useHideHomeDesign.ts",
    "content": "import { ref } from 'vue';\nimport { getMenus } from '/@/router/menus';\n\nexport const useHideHomeDesign = (currentRoute) => {\n  let menus: any = [];\n  // 是否隐藏门户设计\n  const isHideHomeDesign = ref(true);\n  const getHideHomeDesign = (isCurItem, path) => {\n    if (/^\\/portal-view\\/[^/]+$/.test(path) && isCurItem) {\n      if (['/portal-view/system', '/portal-view/template'].includes(path)) {\n        // 主门户、模板门户 (需要检查是否存在设计列表,存在则显示门户设计,不存在则隐藏门户设计)\n        getIsHasPortalDesignList();\n      } else if (['/portal-view/default'].includes(path)) {\n        // 设计器打开的预览需隐藏设计模式\n        isHideHomeDesign.value = true;\n      } else {\n        // 个人工作台或者普通门户都可显示门户设计\n        isHideHomeDesign.value = false;\n      }\n    } else {\n      // 非门户页面隐藏门户设计\n      isHideHomeDesign.value = true;\n    }\n  };\n  const getMenusContainPath = async (ptah) => {\n    if (!menus.length) {\n      menus = await getMenus();\n    }\n    const result = getMatchingRouterName(menus, ptah);\n    return !!result;\n  };\n  const getIsHasPortalDesignList = async () => {\n    if (['/portal-view/system', '/portal-view/template'].includes(currentRoute.value.path)) {\n      // 主门户、模板门户时才需要查询菜单中是否有portalDesignList\n      getMenusContainPath('/super/eoa/portalapp/portalDesignList').then((result) => {\n        isHideHomeDesign.value = !result;\n      });\n    }\n  };\n  getIsHasPortalDesignList();\n  return {\n    getHideHomeDesign,\n    isHideHomeDesign,\n  };\n};\n\n/*\n * 20250701\n * liaozhiyang\n * 通过path匹配菜单中的项\n * */\nfunction getMatchingRouterName(menus, path) {\n  for (let i = 0, len = menus.length; i < len; i++) {\n    const item = menus[i];\n    if (item.path === path && !item.redirect && !item.paramPath) {\n      return item;\n    } else if (item.children?.length) {\n      const result = getMatchingRouterName(item.children, path);\n      if (result) {\n        return result;\n      }\n    }\n  }\n  return null;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/tabs/useMultipleTabs.ts",
    "content": "import { toRaw, ref, nextTick } from 'vue';\nimport type { RouteLocationNormalized } from 'vue-router';\nimport { useDesign } from '/@/hooks/web/useDesign';\nimport { useSortable } from '/@/hooks/web/useSortable';\nimport { useMultipleTabStore } from '/@/store/modules/multipleTab';\nimport { isNullAndUnDef } from '/@/utils/is';\nimport projectSetting from '/@/settings/projectSetting';\nimport { useRouter } from 'vue-router';\n\nexport function initAffixTabs(): string[] {\n  const affixList = ref<RouteLocationNormalized[]>([]);\n\n  const tabStore = useMultipleTabStore();\n  const router = useRouter();\n  /**\n   * @description: Filter all fixed routes\n   */\n  function filterAffixTabs(routes: RouteLocationNormalized[]) {\n    const tabs: RouteLocationNormalized[] = [];\n    routes &&\n      routes.forEach((route) => {\n        if (route.meta && route.meta.affix) {\n          tabs.push(toRaw(route));\n        }\n      });\n    return tabs;\n  }\n\n  /**\n   * @description: Set fixed tabs\n   */\n  function addAffixTabs(): void {\n    const affixTabs = filterAffixTabs(router.getRoutes() as unknown as RouteLocationNormalized[]);\n    affixList.value = affixTabs;\n    for (const tab of affixTabs) {\n      tabStore.addTab({\n        meta: tab.meta,\n        name: tab.name,\n        path: tab.path,\n      } as unknown as RouteLocationNormalized);\n    }\n  }\n\n  let isAddAffix = false;\n\n  if (!isAddAffix) {\n    addAffixTabs();\n    isAddAffix = true;\n  }\n  return affixList.value.map((item) => item.meta?.title).filter(Boolean) as string[];\n}\n\nexport function useTabsDrag(affixTextList: string[]) {\n  const tabStore = useMultipleTabStore();\n  const { multiTabsSetting } = projectSetting;\n  const { prefixCls } = useDesign('multiple-tabs');\n  nextTick(() => {\n    if (!multiTabsSetting.canDrag) return;\n    const el = document.querySelectorAll(`.${prefixCls} .ant-tabs-nav > div`)?.[0] as HTMLElement;\n    const { initSortable } = useSortable(el, {\n      filter: (e: ChangeEvent) => {\n        const text = e?.target?.innerText;\n        if (!text) return false;\n        return affixTextList.includes(text);\n      },\n      onEnd: (evt) => {\n        const { oldIndex, newIndex } = evt;\n\n        if (isNullAndUnDef(oldIndex) || isNullAndUnDef(newIndex) || oldIndex === newIndex) {\n          return;\n        }\n\n        tabStore.sortTabs(oldIndex, newIndex);\n      },\n    });\n    initSortable();\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/tabs/useTabDropdown.ts",
    "content": "import type { TabContentProps } from './types';\nimport type { DropMenu } from '/@/components/Dropdown';\nimport type { ComputedRef } from 'vue';\n\nimport { computed, unref, reactive } from 'vue';\nimport { MenuEventEnum } from './types';\nimport { useMultipleTabStore } from '/@/store/modules/multipleTab';\nimport { RouteLocationNormalized, useRouter } from 'vue-router';\nimport { useTabs } from '/@/hooks/web/useTabs';\nimport { useI18n } from '/@/hooks/web/useI18n';\nimport { useHideHomeDesign } from './useHideHomeDesign';\n\nexport function useTabDropdown(tabContentProps: TabContentProps, getIsTabs: ComputedRef<boolean>) {\n  const state = reactive({\n    current: null as Nullable<RouteLocationNormalized>,\n    currentIndex: 0,\n  });\n\n  const { t } = useI18n();\n  const tabStore = useMultipleTabStore();\n  const { currentRoute } = useRouter();\n  const { refreshPage, closeAll, close, closeLeft, closeOther, closeRight, changeDesign } = useTabs();\n\n  const getTargetTab = computed((): RouteLocationNormalized => {\n    return unref(getIsTabs) ? tabContentProps.tabItem : unref(currentRoute);\n  });\n  // 隐藏下拉菜单中的门户设计项\n  const { getHideHomeDesign, isHideHomeDesign } = useHideHomeDesign(currentRoute);\n\n  /**\n   * @description: drop-down list\n   */\n  const getDropMenuList = computed(() => {\n    if (!unref(getTargetTab)) {\n      return;\n    }\n    const { meta } = unref(getTargetTab);\n    const { path } = unref(currentRoute);\n\n    // Refresh button\n    const curItem = state.current;\n\n    const isCurItem = curItem ? curItem.path === path : false;\n    const index = state.currentIndex;\n    const refreshDisabled = !isCurItem;\n    // Close left\n    const closeLeftDisabled = () => {\n      if (index === 0) {\n        return true;\n      } else {\n        // 【TV360X-1039】当只有首页和另一个tab页时关闭左侧禁用\n        const validTabList = tabStore.getTabList.filter((item) => !item?.meta?.affix);\n        // update-begin--author:liaozhiyang---date:20251128---for：【issues/9098】tabs标签页关闭异常\n        return validTabList[0]?.path === state.current?.path;\n        // update-end--author:liaozhiyang---date:20251128---for：【issues/9098】tabs标签页关闭异常\n      }\n    };\n    // Close other\n    const closeOtherDisabled = () => {\n      if (tabStore.getTabList.length === 1) {\n        return true;\n      } else {\n        // 【TV360X-1039】当只有首页和另一个tab页时关闭其它禁用\n        const validTabList = tabStore.getTabList.filter((item) => !item?.meta?.affix);\n        return validTabList.length == 1;\n      }\n    };\n\n    // Close right\n    const closeRightDisabled = index === tabStore.getTabList.length - 1 && tabStore.getLastDragEndIndex >= 0;\n    // 隐藏下拉菜单中的门户设计项\n    getHideHomeDesign(isCurItem, path);\n    const dropMenuList: DropMenu[] = [\n      {\n        icon: 'jam:refresh-reverse',\n        event: MenuEventEnum.REFRESH_PAGE,\n        text: t('layout.multipleTab.reload'),\n        disabled: refreshDisabled,\n      },\n      {\n        icon: 'ant-design:setting-outlined',\n        event: MenuEventEnum.HOME_DESIGN,\n        text: t('layout.multipleTab.homeDesign'),\n        disabled: !/^\\/portal-view\\/[^/]+$/.test(path),\n        hide: isHideHomeDesign.value,\n        divider: true,\n      },\n      // {\n      //   icon: 'ic:twotone-close',\n      //   event: MenuEventEnum.CLOSE_CURRENT,\n      //   text: t('layout.multipleTab.close'),\n      //   disabled: !!meta?.affix || disabled,\n      //   divider: true,\n      // },\n      {\n        icon: 'mdi:arrow-left',\n        event: MenuEventEnum.CLOSE_LEFT,\n        text: t('layout.multipleTab.closeLeft'),\n        // 代码逻辑说明: 【TV360X-732】非当前页右键关闭左侧、关闭右侧、关闭其它功能正常使用\n        disabled: closeLeftDisabled(),\n        divider: false,\n      },\n      {\n        icon: 'mdi:arrow-right',\n        event: MenuEventEnum.CLOSE_RIGHT,\n        text: t('layout.multipleTab.closeRight'),\n        disabled: closeRightDisabled,\n        divider: true,\n      },\n      {\n        icon: 'material-symbols:arrows-outward',\n        event: MenuEventEnum.CLOSE_OTHER,\n        text: t('layout.multipleTab.closeOther'),\n        // 代码逻辑说明: 【TV360X-732】非当前页右键关闭左侧、关闭右侧、关闭其它功能正常使用\n        disabled: closeOtherDisabled(),\n      },\n      // {\n      //   icon: 'clarity:minus-line',\n      //   event: MenuEventEnum.CLOSE_ALL,\n      //   text: t('layout.multipleTab.closeAll'),\n      //   disabled: disabled,\n      // },\n    ];\n\n    return dropMenuList;\n  });\n\n  function handleContextMenu(tabItem: RouteLocationNormalized) {\n    return (e: Event) => {\n      if (!tabItem) {\n        return;\n      }\n      e?.preventDefault();\n      const index = tabStore.getTabList.findIndex((tab) => tab.path === tabItem.path);\n      state.current = tabItem;\n      state.currentIndex = index;\n    };\n  }\n\n  // Handle right click event\n  function handleMenuEvent(menu: DropMenu): void {\n    const { event } = menu;\n    switch (event) {\n      case MenuEventEnum.REFRESH_PAGE:\n        // refresh page\n        refreshPage();\n        break;\n      // Close current\n      case MenuEventEnum.CLOSE_CURRENT:\n        close(tabContentProps.tabItem);\n        break;\n      // Close left\n      case MenuEventEnum.CLOSE_LEFT:\n        closeLeft(state.current);\n        break;\n      // Close right\n      case MenuEventEnum.CLOSE_RIGHT:\n        closeRight(state.current);\n        break;\n      // Close other\n      case MenuEventEnum.CLOSE_OTHER:\n        closeOther(state.current);\n        break;\n      // Close all\n      case MenuEventEnum.CLOSE_ALL:\n        closeAll(state.current);\n        break;\n      // Close all\n      case MenuEventEnum.HOME_DESIGN:\n        changeDesign();\n        break;\n    }\n  }\n  return { getDropMenuList, handleMenuEvent, handleContextMenu };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/trigger/HeaderTrigger.vue",
    "content": "<template>\n  <span :class=\"[prefixCls, theme]\" @click=\"toggleCollapsed\"> <MenuUnfoldOutlined v-if=\"getCollapsed\" /> <MenuFoldOutlined v-else /> </span>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { MenuUnfoldOutlined, MenuFoldOutlined } from '@ant-design/icons-vue';\n  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { propTypes } from '/@/utils/propTypes';\n\n  export default defineComponent({\n    name: 'HeaderTrigger',\n    components: { MenuUnfoldOutlined, MenuFoldOutlined },\n    props: {\n      theme: propTypes.oneOf(['light', 'dark']),\n    },\n    setup() {\n      const { getCollapsed, toggleCollapsed } = useMenuSetting();\n      const { prefixCls } = useDesign('layout-header-trigger');\n      return { getCollapsed, toggleCollapsed, prefixCls };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/trigger/SiderTrigger.vue",
    "content": "<template>\n  <div @click.stop=\"toggleCollapsed\">\n    <DoubleRightOutlined v-if=\"getCollapsed\" />\n    <DoubleLeftOutlined v-else />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { DoubleRightOutlined, DoubleLeftOutlined } from '@ant-design/icons-vue';\n  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\n\n  export default defineComponent({\n    name: 'SiderTrigger',\n    components: { DoubleRightOutlined, DoubleLeftOutlined },\n    setup() {\n      const { getCollapsed, toggleCollapsed } = useMenuSetting();\n\n      return { getCollapsed, toggleCollapsed };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/default/trigger/index.vue",
    "content": "<template>\n  <SiderTrigger v-if=\"sider\" />\n  <HeaderTrigger v-else :theme=\"theme\" />\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n  import { propTypes } from '/@/utils/propTypes';\n  import HeaderTrigger from './HeaderTrigger.vue';\n\n  export default defineComponent({\n    name: 'LayoutTrigger',\n    components: {\n      SiderTrigger: createAsyncComponent(() => import('./SiderTrigger.vue')),\n      HeaderTrigger: HeaderTrigger,\n    },\n    props: {\n      sider: propTypes.bool.def(true),\n      theme: propTypes.oneOf(['light', 'dark']),\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/iframe/index.vue",
    "content": "<template>\n  <div v-if=\"showFrame\">\n    <template v-for=\"frame in getFramePages\" :key=\"frame.path\">\n      <FramePage v-if=\"frame.meta.frameSrc && hasRenderFrame(frame.name)\" v-show=\"showIframe(frame)\" :frameSrc=\"frame.meta.frameSrc\" />\n    </template>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, unref, computed } from 'vue';\n  import FramePage from '/@/views/sys/iframe/index.vue';\n\n  import { useFrameKeepAlive } from './useFrameKeepAlive';\n\n  export default defineComponent({\n    name: 'FrameLayout',\n    components: { FramePage },\n    setup() {\n      const { getFramePages, hasRenderFrame, showIframe } = useFrameKeepAlive();\n\n      const showFrame = computed(() => unref(getFramePages).length > 0);\n\n      return { getFramePages, hasRenderFrame, showIframe, showFrame };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/iframe/useFrameKeepAlive.ts",
    "content": "import type { AppRouteRecordRaw } from '/@/router/types';\n\nimport { computed, toRaw, unref } from 'vue';\n\nimport { useMultipleTabStore } from '/@/store/modules/multipleTab';\n\nimport { uniqBy } from 'lodash-es';\n\nimport { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';\n\nimport { useRouter } from 'vue-router';\n\nexport function useFrameKeepAlive() {\n  const router = useRouter();\n  const { currentRoute } = router;\n  const { getShowMultipleTab } = useMultipleTabSetting();\n  const tabStore = useMultipleTabStore();\n  const getFramePages = computed(() => {\n    const ret = getAllFramePages(toRaw(router.getRoutes()) as unknown as AppRouteRecordRaw[]) || [];\n    return ret;\n  });\n\n  const getOpenTabList = computed((): string[] => {\n    return tabStore.getTabList.reduce((prev: string[], next) => {\n      if (next.meta && Reflect.has(next.meta, 'frameSrc')) {\n        prev.push(next.name as string);\n      }\n      return prev;\n    }, []);\n  });\n\n  function getAllFramePages(routes: AppRouteRecordRaw[]): AppRouteRecordRaw[] {\n    let res: AppRouteRecordRaw[] = [];\n    for (const route of routes) {\n      const { meta: { frameSrc } = {}, children } = route;\n      if (frameSrc) {\n        res.push(route);\n      }\n      if (children && children.length) {\n        res.push(...getAllFramePages(children));\n      }\n    }\n    res = uniqBy(res, 'name');\n    return res;\n  }\n\n  function showIframe(item: AppRouteRecordRaw) {\n    return item.name === unref(currentRoute).name;\n  }\n\n  function hasRenderFrame(name: string) {\n    if (!unref(getShowMultipleTab)) {\n      return router.currentRoute.value.name === name;\n    }\n    return unref(getOpenTabList).includes(name);\n  }\n\n  return { hasRenderFrame, getFramePages, showIframe, getAllFramePages };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/page/index.vue",
    "content": "<template>\n  <RouterView>\n    <template #default=\"{ Component, route }\">\n      <!--      <transition-->\n      <!--        :name=\"-->\n      <!--          getTransitionName({-->\n      <!--            route,-->\n      <!--            openCache,-->\n      <!--            enableTransition: getEnableTransition,-->\n      <!--            cacheTabs: getCaches,-->\n      <!--            def: getBasicTransition,-->\n      <!--          })-->\n      <!--        \"-->\n      <!--        mode=\"out-in\"-->\n      <!--        appear-->\n      <!--      >-->\n      <template v-if=\"Component\">\n        <keep-alive v-if=\"openCache\" :include=\"getCaches\">\n          <component :is=\"Component\" :key=\"route.fullPath\" />\n        </keep-alive>\n        <component v-else :is=\"Component\" :key=\"route.fullPath\" />\n      </template>\n      <template v-else>\n        <!-- 【QQYUN-13593】空白页美化 -->\n        <div class=\"animationEffect\" :style=\"effectVars\">\n          <div class=\"effect-layer\">\n            <div class=\"blob blob-a\"></div>\n            <div class=\"blob blob-b\"></div>\n            <div class=\"blob blob-c\"></div>\n          </div>\n          <div class=\"effect-grid\"></div>\n          <div class=\"effect-tip\">\n            <p>{{pageTip}}</p>\n          </div>\n        </div>\n      </template>\n      <!--      </transition>-->\n    </template>\n  </RouterView>\n  <FrameLayout v-if=\"getCanEmbedIFramePage\" />\n</template>\n\n<script lang=\"ts\">\n  import { computed, defineComponent, unref } from 'vue';\n\n  import FrameLayout from '/@/layouts/iframe/index.vue';\n\n  import { useRootSetting } from '/@/hooks/setting/useRootSetting';\n\n  import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';\n  import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';\n  import { getTransitionName } from './transition';\n\n  import { useMultipleTabStore } from '/@/store/modules/multipleTab';\n  import { useEmpty } from './useEmpty';\n\n  export default defineComponent({\n    name: 'PageLayout',\n    components: { FrameLayout },\n    setup() {\n      const { getShowMultipleTab } = useMultipleTabSetting();\n      const tabStore = useMultipleTabStore();\n\n      const { getOpenKeepAlive, getCanEmbedIFramePage } = useRootSetting();\n\n      const { getBasicTransition, getEnableTransition } = useTransitionSetting();\n\n      const openCache = computed(() => unref(getOpenKeepAlive) && unref(getShowMultipleTab));\n\n      const getCaches = computed((): string[] => {\n        if (!unref(getOpenKeepAlive)) {\n          return [];\n        }\n        return tabStore.getCachedTabList;\n      });\n      // 代码逻辑说明: 【QQYUN-13593】空白页美化\n      const { pageTip, getPageTip, effectVars } = useEmpty();\n      return {\n        getTransitionName,\n        openCache,\n        getEnableTransition,\n        getBasicTransition,\n        getCaches,\n        getCanEmbedIFramePage,\n        pageTip,\n        getPageTip,\n        effectVars,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n/** update-begin---author:liaozy ---date:2025-08-26  for：空白页美化样式 */\n.pageTip {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  height: 100%;\n  font-size: 18px;\n  color: #999;\n  margin: 0;\n}\n\n.animationEffect {\n  position: relative;\n  height: 100%;\n  min-height: 420px;\n  overflow: hidden;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background: linear-gradient(180deg, var(--bg-1) 0%, var(--bg-2) 100%);\n}\n\n.effect-layer {\n  position: absolute;\n  top: -20%;\n  left: -20%;\n  right: -20%;\n  bottom: -20%;\n  filter: blur(30px);\n  pointer-events: none;\n  z-index: 0;\n}\n\n.blob {\n  position: absolute;\n  width: 380px;\n  height: 380px;\n  border-radius: 50%;\n  opacity: 0.45;\n}\n\n.blob-a {\n  background: radial-gradient(circle at 30% 30%, var(--blob-a-1) 0%, var(--blob-a-2) 60%, var(--blob-a-2) 100%);\n  left: 5%;\n  top: 10%;\n  animation: float-a 18s ease-in-out infinite;\n}\n\n.blob-b {\n  background: radial-gradient(circle at 30% 30%, var(--blob-b-1) 0%, var(--blob-b-2) 60%, var(--blob-b-2) 100%);\n  right: 0;\n  top: 30%;\n  animation: float-b 22s ease-in-out infinite;\n}\n\n.blob-c {\n  background: radial-gradient(circle at 30% 30%, var(--blob-c-1) 0%, var(--blob-c-2) 60%, var(--blob-c-2) 100%);\n  left: 35%;\n  bottom: -5%;\n  animation: float-c 26s ease-in-out infinite;\n}\n\n@keyframes float-a {\n  0% { transform: translate(0, 0) scale(1); }\n  25% { transform: translate(20%, -10%) scale(1.05); }\n  50% { transform: translate(35%, 5%) scale(0.95); }\n  75% { transform: translate(10%, 15%) scale(1.02); }\n  100% { transform: translate(0, 0) scale(1); }\n}\n\n@keyframes float-b {\n  0% { transform: translate(0, 0) scale(1); }\n  25% { transform: translate(-15%, 10%) scale(1.08); }\n  50% { transform: translate(-30%, -5%) scale(0.92); }\n  75% { transform: translate(-10%, -15%) scale(1.03); }\n  100% { transform: translate(0, 0) scale(1); }\n}\n\n@keyframes float-c {\n  0% { transform: translate(0, 0) scale(1); }\n  25% { transform: translate(-10%, -10%) scale(0.9); }\n  50% { transform: translate(10%, -25%) scale(1.05); }\n  75% { transform: translate(20%, 0%) scale(0.98); }\n  100% { transform: translate(0, 0) scale(1); }\n}\n\n.effect-grid {\n  position: absolute;\n  inset: 0;\n  background-image: linear-gradient(0deg, var(--grid-color) 1px, rgba(0, 0, 0, 0) 1px),\n    linear-gradient(90deg, var(--grid-color) 1px, rgba(0, 0, 0, 0) 1px);\n  background-size: 36px 36px, 36px 36px;\n  mask-image: radial-gradient(circle at 50% 50%, rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0) 70%);\n  pointer-events: none;\n  z-index: 1;\n}\n\n.effect-tip {\n  position: relative;\n  z-index: 2;\n  text-align: center;\n  pointer-events: none;\n  p {\n    margin: 0;\n    padding: 8px 14px;\n    color: var(--tip-color);\n    font-size: 20px;\n    border-radius: 8px;\n  }\n}\n/** update-end---author:liaozy ---date:2025-08-26  for：空白页美化样式 */\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/page/transition.ts",
    "content": "import type { FunctionalComponent } from 'vue';\nimport type { RouteLocation } from 'vue-router';\n\nexport interface DefaultContext {\n  Component: FunctionalComponent & { type: Recordable };\n  route: RouteLocation;\n}\n\nexport function getTransitionName({\n  route,\n  openCache,\n  cacheTabs,\n  enableTransition,\n  def,\n}: Pick<DefaultContext, 'route'> & {\n  enableTransition: boolean;\n  openCache: boolean;\n  def: string;\n  cacheTabs: string[];\n}): string | undefined {\n  if (!enableTransition) {\n    return undefined;\n  }\n\n  const isInCache = cacheTabs.includes(route.name as string);\n  const transitionName = 'fade-slide';\n  let name: string | undefined = transitionName;\n\n  if (openCache) {\n    name = isInCache && route.meta.loaded ? transitionName : undefined;\n  }\n  return name || (route.meta.transitionName as string) || def;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/layouts/page/useEmpty.ts",
    "content": "import { computed, unref, ref, watch } from 'vue';\nimport { getMenus } from '/@/router/menus';\nimport { useRoute } from 'vue-router';\nimport { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';\nimport { useMenuSetting } from '/@/hooks/setting/useMenuSetting';\nimport { useRootSetting } from '/@/hooks/setting/useRootSetting';\nimport { lighten, darken } from '/@/utils/color';\nexport const useEmpty = () => {\n  const { getThemeColor, getDarkMode } = useRootSetting();\n  const route = useRoute();\n  const { getHeaderBgColor } = useHeaderSetting();\n  const { getMenuBgColor } = useMenuSetting();\n  const pageTip = ref('');\n  const effectVars = computed(() => {\n    const primary = unref(getThemeColor) || '#1890ff';\n    const menuBg = unref(getMenuBgColor) || '#ffffff';\n    const headerBg = unref(getHeaderBgColor);\n    const isDark = unref(getDarkMode) === 'dark';\n    // 以主题色为基色，派生三组渐变色\n    const a1 = lighten(primary, 25);\n    const a2 = primary;\n    const b1 = lighten(headerBg, 45);\n    const b2 = lighten(headerBg, 10);\n    const c1 = lighten(menuBg, 35);\n    const c2 = darken(primary, 5);\n    const bg1 = isDark ? '#0f172a' : '#f7f8fa';\n    const bg2 = isDark ? '#111827' : '#f2f5f9';\n    const grid = isDark ? 'rgba(255,255,255,0.04)' : 'rgba(60,70,90,0.06)';\n    const tipColor = isDark ? '#626262' : '#b9b9b9';\n    const tipBg = isDark ? 'rgba(17,24,39,0.6)' : 'rgba(255,255,255,0.6)';\n    const tipBorder = isDark ? 'rgba(255,255,255,0.08)' : 'rgba(0,0,0,0.06)';\n    return {\n      '--blob-a-1': a1,\n      '--blob-a-2': a2,\n      '--blob-b-1': b1,\n      '--blob-b-2': b2,\n      '--blob-c-1': c1,\n      '--blob-c-2': c2,\n      '--bg-1': bg1,\n      '--bg-2': bg2,\n      '--grid-color': grid,\n      '--tip-color': tipColor,\n      '--tip-bg': tipBg,\n      '--tip-border': tipBorder,\n    } as Record<string, string>;\n  });\n\n  const getPageTip = async (route) => {\n    const menus = await getMenus();\n    const menu = getMatchingPath(menus, route.path);\n    if (menu) {\n      if (['/layouts/default/index'].includes(menu.originComponent)) {\n        pageTip.value = '点击子菜单跳转到对应外部链接！';\n      } else {\n        pageTip.value = '查看组件引用是否正确';\n      }\n    }\n  };\n  watch(\n    route,\n    () => {\n      getPageTip({ path: window.location.pathname });\n    },\n    { immediate: true }\n  );\n\n  function getMatchingPath(menus, path) {\n    for (let i = 0, len = menus.length; i < len; i++) {\n      const item = menus[i];\n      if (item.path === path) {\n        return item;\n      } else if (item.children?.length) {\n        const result = getMatchingPath(item.children, path);\n        if (result) {\n          return result;\n        }\n      }\n    }\n    return null;\n  }\n\n  return {\n    pageTip,\n    getPageTip,\n    effectVars,\n  };\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/locales/helper.ts",
    "content": "import type { LocaleType } from '/#/config';\n\nimport { set } from 'lodash-es';\n\nexport const loadLocalePool: LocaleType[] = [];\n\nexport function setHtmlPageLang(locale: LocaleType) {\n  document.querySelector('html')?.setAttribute('lang', locale);\n}\n\nexport function setLoadLocalePool(cb: (loadLocalePool: LocaleType[]) => void) {\n  cb(loadLocalePool);\n}\n\nexport function genMessage(langs: Record<string, Record<string, any>>, prefix = 'lang') {\n  const obj: Recordable = {};\n\n  Object.keys(langs).forEach((key) => {\n    const langFileModule = langs[key].default;\n    let fileName = key.replace(`./${prefix}/`, '').replace(/^\\.\\//, '');\n    const lastIndex = fileName.lastIndexOf('.');\n    fileName = fileName.substring(0, lastIndex);\n    const keyList = fileName.split('/');\n    const moduleName = keyList.shift();\n    const objKey = keyList.join('.');\n\n    if (moduleName) {\n      if (objKey) {\n        set(obj, moduleName, obj[moduleName] || {});\n        set(obj[moduleName], objKey, langFileModule);\n      } else {\n        set(obj, moduleName, langFileModule || {});\n      }\n    }\n  });\n  return obj;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/locales/lang/en/common.ts",
    "content": "export default {\n  okText: 'OK',\n  closeText: 'Close',\n  cancelText: 'Cancel',\n  loadingText: 'Loading...',\n  saveText: 'Save',\n  delText: 'Delete',\n  resetText: 'Reset',\n  searchText: 'Search',\n  queryText: 'Search',\n\n  inputText: 'Please enter',\n  chooseText: 'Please choose',\n\n  redo: 'Refresh',\n  back: 'Back',\n\n  light: 'Light',\n  dark: 'Dark',\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/locales/lang/en/component.ts",
    "content": "export default {\n  app: {\n    searchNotData: 'No search results yet',\n    toSearch: 'to search',\n    toNavigate: 'to navigate',\n  },\n  countdown: {\n    normalText: 'Get SMS code',\n    sendText: 'Reacquire in {0}s',\n  },\n  cropper: {\n    selectImage: 'Select Image',\n    uploadSuccess: 'Uploaded success!',\n    modalTitle: 'Avatar upload',\n    okText: 'Confirm and upload',\n    btn_reset: 'Reset',\n    btn_rotate_left: 'Counterclockwise rotation',\n    btn_rotate_right: 'Clockwise rotation',\n    btn_scale_x: 'Flip horizontal',\n    btn_scale_y: 'Flip vertical',\n    btn_zoom_in: 'Zoom in',\n    btn_zoom_out: 'Zoom out',\n    preview: 'Preivew',\n  },\n  drawer: {\n    loadingText: 'Loading...',\n    cancelText: 'Close',\n    okText: 'Confirm',\n  },\n  excel: {\n    exportModalTitle: 'Export data',\n    fileType: 'File type',\n    fileName: 'File name',\n  },\n  form: {\n    putAway: 'Put away',\n    unfold: 'Unfold',\n    maxTip: 'The number of characters should be less than {0}',\n    apiSelectNotFound: 'Wait for data loading to complete...',\n  },\n  icon: {\n    placeholder: 'Click the select icon',\n    search: 'Search icon',\n    copy: 'Copy icon successfully!',\n  },\n  menu: {\n    search: 'Menu search',\n  },\n  modal: {\n    cancelText: 'Close',\n    okText: 'Confirm',\n    close: 'Close',\n    maximize: 'Maximize',\n    restore: 'Restore',\n  },\n  table: {\n    settingDens: 'Density',\n    settingDensDefault: 'Default',\n    settingDensMiddle: 'Middle',\n    settingDensSmall: 'Compact',\n    settingColumn: 'Column settings',\n    settingColumnShow: 'Column display',\n    settingIndexColumnShow: 'Index Column',\n    settingSelectColumnShow: 'Selection Column',\n    settingFixedLeft: 'Fixed Left',\n    settingFixedRight: 'Fixed Right',\n    settingFullScreen: 'Full Screen',\n    index: 'Index',\n    total: 'total of {total}',\n  },\n  time: {\n    before: ' ago',\n    after: ' after',\n    just: 'just now',\n    seconds: ' seconds',\n    minutes: ' minutes',\n    hours: ' hours',\n    days: ' days',\n  },\n  tree: {\n    selectAll: 'Select All',\n    unSelectAll: 'Cancel Select',\n    expandAll: 'Expand All',\n    unExpandAll: 'Collapse all',\n\n    checkStrictly: 'Hierarchical association',\n    checkUnStrictly: 'Hierarchical independence',\n  },\n  upload: {\n    save: 'Save',\n    upload: 'Upload',\n    imgUpload: 'ImageUpload',\n    uploaded: 'Uploaded',\n\n    operating: 'Operating',\n    del: 'Delete',\n    download: 'download',\n    saveWarn: 'Please wait for the file to upload and save!',\n    saveError: 'There is no file successfully uploaded and cannot be saved!',\n\n    preview: 'Preview',\n    choose: 'Select the file',\n\n    accept: 'Support {0} format',\n    acceptUpload: 'Only upload files in {0} format',\n    maxSize: 'A single file does not exceed {0}MB ',\n    maxSizeMultiple: 'Only upload files up to {0}MB!',\n    maxNumber: 'Only upload up to {0} files',\n\n    legend: 'Legend',\n    fileName: 'File name',\n    fileSize: 'File size',\n    fileStatue: 'File status',\n\n    startUpload: 'Start upload',\n    uploadSuccess: 'Upload successfully',\n    uploadError: 'Upload failed',\n    uploading: 'Uploading',\n    uploadWait: 'Please wait for the file upload to finish',\n    reUploadFailed: 'Re-upload failed files',\n  },\n  verify: {\n    error: 'verification failed！',\n    time: 'The verification is successful and it takes {time} seconds！',\n    redoTip: 'Click the picture to refresh',\n    dragText: 'Hold down the slider and drag',\n    successText: 'Verified',\n  },\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/locales/lang/en/layout.ts",
    "content": "export default {\n  footer: { onlinePreview: 'Preview', onlineDocument: 'Document' },\n  header: {\n    // user dropdown\n    dropdownItemDoc: 'Document',\n    dropdownItemLoginOut: 'Login Out',\n    dropdownItemSwitchPassword: 'Password Change',\n    dropdownItemSwitchDepart: 'Switch Department',\n    dropdownItemRefreshCache: 'Clean cache',\n    dropdownItemSwitchAccount: 'Account Setting',\n    dropdownItemSwitchDefaultHomePage: 'Switch Home Page',\n    dropdownItemSwitchDefaultWeb: 'Web Download',\n    dropdownItemSwitchDefaultAndroid: 'Android Apk Download',\n\n    tooltipErrorLog: 'Error log',\n    tooltipLock: 'Lock screen',\n    tooltipNotify: 'Notification',\n\n    tooltipEntryFull: 'Full Screen',\n    tooltipExitFull: 'Exit Full Screen',\n\n    // lock\n    lockScreenPassword: 'Password',\n    lockScreen: 'Lock screen',\n    lockScreenBtn: 'Locking',\n\n    home: 'Home',\n    welcomeIn: 'Welcome in',\n    refreshCacheComplete: 'Refresh cache complete',\n    refreshCacheFailure: 'Refresh cache failure',\n  },\n  multipleTab: {\n    reload: 'Refresh current',\n    close: 'Close current',\n    closeLeft: 'Close Left',\n    closeRight: 'Close Right',\n    closeOther: 'Close Other',\n    closeAll: 'Close All',\n    homeDesign: 'Home Design',\n  },\n  setting: {\n    // content mode\n    contentModeFull: 'Full',\n    contentModeFixed: 'Fixed width',\n    // topMenu align\n    topMenuAlignLeft: 'Left',\n    topMenuAlignRight: 'Center',\n    topMenuAlignCenter: 'Right',\n    // menu trigger\n    menuTriggerNone: 'Not Show',\n    menuTriggerBottom: 'Bottom',\n    menuTriggerTop: 'Top',\n    // menu type\n    menuTypeSidebar: 'Left menu mode',\n    menuTypeMixSidebar: 'Left menu mixed mode',\n    menuTypeMix: 'Top Menu Mix mode',\n    menuTypeTopMenu: 'Top menu mode',\n\n    on: 'On',\n    off: 'Off',\n    minute: 'Minute',\n\n    operatingTitle: 'Successful!',\n    operatingContent: 'The copy is successful, please go to src/settings/projectSetting.ts to modify the configuration!',\n    resetSuccess: 'Successfully reset!',\n\n    copyBtn: 'Copy',\n    clearBtn: 'Clear cache and to the login page',\n\n    drawerTitle: 'Configuration',\n\n    darkMode: 'Dark mode',\n    navMode: 'Navigation mode',\n    interfaceFunction: 'Interface function',\n    interfaceDisplay: 'Interface display',\n    animation: 'Animation',\n    splitMenu: 'Split menu',\n    closeMixSidebarOnChange: 'Switch page to close menu',\n\n    sysTheme: 'System theme',\n    headerTheme: 'Header theme',\n    sidebarTheme: 'Menu theme',\n\n    menuDrag: 'Drag Sidebar',\n    menuSearch: 'Menu search',\n    menuAccordion: 'Sidebar accordion',\n    menuCollapse: 'Collapse menu',\n    collapseMenuDisplayName: 'Collapse menu display name',\n    topMenuLayout: 'Top menu layout',\n    menuCollapseButton: 'Menu collapse button',\n    contentMode: 'Content area width',\n    expandedMenuWidth: 'Expanded menu width',\n\n    breadcrumb: 'Breadcrumbs',\n    breadcrumbIcon: 'Breadcrumbs Icon',\n    tabs: 'Tabs',\n    tabDetail: 'Tab Detail',\n    tabsQuickBtn: 'Tabs quick button',\n    tabsRedoBtn: 'Tabs redo button',\n    tabsFoldBtn: 'Tabs flod button',\n    tabsTheme: 'tabs theme',\n    tabsThemeSmooth: 'Smooth',\n    tabsThemeCard: 'Card',\n    tabsThemeSimple: 'Simple',\n    sidebar: 'Sidebar',\n    header: 'Header',\n    footer: 'Footer',\n    fullContent: 'Full content',\n    grayMode: 'Gray mode',\n    colorWeak: 'Color Weak Mode',\n\n    progress: 'Progress',\n    switchLoading: 'Switch Loading',\n    switchAnimation: 'Switch animation',\n    animationType: 'Animation type',\n\n    autoScreenLock: 'Auto screen lock',\n    notAutoScreenLock: 'Not auto lock',\n\n    fixedHeader: 'Fixed header',\n    fixedSideBar: 'Fixed Sidebar',\n\n    mixSidebarTrigger: 'Mixed menu Trigger',\n    triggerHover: 'Hover',\n    triggerClick: 'Click',\n\n    mixSidebarFixed: 'Fixed expanded menu',\n  },\n  changePassword: {\n    changePassword: 'Change password',\n    oldPassword: 'Old password',\n    newPassword: 'New password',\n    confirmNewPassword: 'Confirm new password',\n    pleaseEnterNewPassword: 'Please enter new password',\n  },\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/locales/lang/en/routes/basic.ts",
    "content": "export default {\n  login: 'Login',\n  errorLogList: 'Error Log',\n  defaultHomePage: 'Default Home Page',\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/locales/lang/en/routes/dashboard.ts",
    "content": "export default {\n  dashboard: 'Dashboard',\n  about: 'About',\n  workbench: 'Workbench',\n  analysis: 'Analysis',\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/locales/lang/en/routes/demo.ts",
    "content": "export default {\n  charts: {\n    baiduMap: 'Baidu map',\n    aMap: 'A map',\n    googleMap: 'Google map',\n    charts: 'Chart',\n    map: 'Map',\n    line: 'Line',\n    pie: 'Pie',\n  },\n  comp: {\n    comp: 'Component',\n    basic: 'Basic',\n    transition: 'Animation',\n    countTo: 'Count To',\n\n    scroll: 'Scroll',\n    scrollBasic: 'Basic',\n    scrollAction: 'Scroll Function',\n    virtualScroll: 'Virtual Scroll',\n\n    tree: 'Tree',\n\n    treeBasic: 'Basic',\n    editTree: 'Searchable/toolbar',\n    actionTree: 'Function operation',\n\n    modal: 'Modal',\n    drawer: 'Drawer',\n    desc: 'Desc',\n\n    lazy: 'Lazy',\n    lazyBasic: 'Basic',\n    lazyTransition: 'Animation',\n\n    verify: 'Verify',\n    verifyDrag: 'Drag ',\n    verifyRotate: 'Picture Restore',\n\n    qrcode: 'QR code',\n    strength: 'Password strength',\n    upload: 'Upload',\n\n    loading: 'Loading',\n\n    time: 'Relative Time',\n    cropperImage: 'Cropper Image',\n    cardList: 'Card List',\n  },\n  editor: {\n    editor: 'Editor',\n    jsonEditor: 'Json editor',\n    markdown: 'Markdown editor',\n\n    tinymce: 'Rich text',\n    tinymceBasic: 'Basic',\n    tinymceForm: 'embedded form',\n  },\n  excel: {\n    excel: 'Excel',\n    customExport: 'Select export format',\n    jsonExport: 'JSON data export',\n    arrayExport: 'Array data export',\n    importExcel: 'Import',\n  },\n  feat: {\n    feat: 'Page Function',\n    icon: 'Icon',\n    tabs: 'Tabs',\n    tabDetail: 'Tab Detail',\n    sessionTimeout: 'Session Timeout',\n    print: 'Print',\n    contextMenu: 'Context Menu',\n    download: 'Download',\n    clickOutSide: 'ClickOutSide',\n    imgPreview: 'Picture Preview',\n    copy: 'Clipboard',\n    msg: 'Message prompt',\n    watermark: 'Watermark',\n    ripple: 'Ripple',\n    fullScreen: 'Full Screen',\n    errorLog: 'Error Log',\n    tab: 'Tab with parameters',\n    tab1: 'Tab with parameter 1',\n    tab2: 'Tab with parameter 2',\n    menu: 'Menu with parameters',\n    menu1: 'Menu with parameters 1',\n    menu2: 'Menu with parameters 2',\n\n    ws: 'Websocket test',\n\n    breadcrumb: 'Breadcrumbs',\n    breadcrumbFlat: 'Flat Mode',\n    breadcrumbFlatDetail: 'Flat mode details',\n\n    breadcrumbChildren: 'Level mode',\n    breadcrumbChildrenDetail: 'Level mode detail',\n  },\n  flow: {\n    name: 'Graphics editor',\n    flowChart: 'FlowChart',\n  },\n  form: {\n    form: 'Form',\n    basic: 'Basic',\n    useForm: 'useForm',\n    refForm: 'RefForm',\n    advancedForm: 'Shrinkable',\n    ruleForm: 'Form validation',\n    dynamicForm: 'Dynamic',\n    customerForm: 'Custom',\n    appendForm: 'Append',\n  },\n  iframe: {\n    frame: 'External',\n    antv: 'antVue doc (embedded)',\n    doc: 'Project doc (embedded)',\n    docExternal: 'Project doc (external)',\n  },\n  level: { level: 'MultiMenu' },\n  page: {\n    page: 'Page',\n\n    form: 'Form',\n    formBasic: 'Basic Form',\n    formStep: 'Step Form',\n    formHigh: 'Advanced Form',\n\n    desc: 'Details',\n    descBasic: 'Basic Details',\n    descHigh: 'Advanced Details',\n\n    result: 'Result',\n    resultSuccess: 'Success',\n    resultFail: 'Failed',\n\n    account: 'Personal',\n    accountCenter: 'Personal Center',\n    accountSetting: 'Personal Settings',\n\n    exception: 'Exception',\n    netWorkError: 'Network Error',\n    notData: 'No data',\n\n    list: 'List page',\n    listCard: 'Card list',\n    basic: 'Basic list',\n    listBasic: 'Basic list',\n    listSearch: 'Search list',\n  },\n  permission: {\n    permission: 'Permission',\n\n    front: 'front-end',\n    frontPage: 'Page',\n    frontBtn: 'Button',\n    frontTestA: 'Test page A',\n    frontTestB: 'Test page B',\n\n    back: 'background',\n    backPage: 'Page',\n    backBtn: 'Button',\n  },\n  setup: {\n    page: 'Intro page',\n  },\n  system: {\n    moduleName: 'System management',\n\n    account: 'Account management',\n    account_detail: 'Account detail',\n    password: 'Change password',\n\n    dept: 'Department management',\n\n    menu: 'Menu management',\n    role: 'Role management',\n  },\n  table: {\n    table: 'Table',\n\n    basic: 'Basic',\n    treeTable: 'Tree',\n    fetchTable: 'Remote loading',\n    fixedColumn: 'Fixed column',\n    customerCell: 'Custom column',\n    formTable: 'Open search',\n    useTable: 'UseTable',\n    refTable: 'RefTable',\n    multipleHeader: 'MultiLevel header',\n    mergeHeader: 'Merge cells',\n    expandTable: 'Expandable table',\n    fixedHeight: 'Fixed height',\n    footerTable: 'Footer',\n    editCellTable: 'Editable cell',\n    editRowTable: 'Editable row',\n    authColumn: 'Auth column',\n  },\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/locales/lang/en/sys.ts",
    "content": "export default {\n  api: {\n    operationFailed: 'Operation failed',\n    errorTip: 'Error Tip',\n    errorMessage: 'The operation failed, the system is abnormal!',\n    timeoutMessage: 'Login timed out, please log in again!',\n    apiTimeoutMessage: 'The interface request timed out, please refresh the page and try again!',\n    apiRequestFailed: 'The interface request failed, please try again later!',\n    networkException: 'network anomaly',\n    networkExceptionMsg: 'Please check if your network connection is normal! The network is abnormal',\n\n    errMsg401: 'The user does not have permission (token, user name, password error)!',\n    errMsg403: 'The user is authorized, but access is forbidden!',\n    errMsg404: 'Network request error, the resource was not found!',\n    errMsg405: 'Network request error, request method not allowed!',\n    errMsg408: 'Network request timed out!',\n    errMsg500: 'Server error, please contact the administrator!',\n    errMsg501: 'The network is not implemented!',\n    errMsg502: 'Network Error!',\n    errMsg503: 'The service is unavailable, the server is temporarily overloaded or maintained!',\n    errMsg504: 'Network timeout!',\n    errMsg505: 'The http version does not support the request!',\n  },\n  app: {\n    logoutTip: 'Reminder',\n    logoutMessage: 'Confirm to exit the system?',\n    menuLoading: 'Menu loading...',\n  },\n  errorLog: {\n    tableTitle: 'Error log list',\n    tableColumnType: 'Type',\n    tableColumnDate: 'Time',\n    tableColumnFile: 'File',\n    tableColumnMsg: 'Error message',\n    tableColumnStackMsg: 'Stack info',\n\n    tableActionDesc: 'Details',\n\n    modalTitle: 'Error details',\n\n    fireVueError: 'Fire vue error',\n    fireResourceError: 'Fire resource error',\n    fireAjaxError: 'Fire ajax error',\n\n    enableMessage: 'Only effective when useErrorHandle=true in `/src/settings/projectSetting.ts`.',\n  },\n  exception: {\n    backLogin: 'Back Login',\n    backHome: 'Back Home',\n    subTitle403: \"Sorry, you don't have access to this page.\",\n    subTitle404: 'Sorry, the page you visited does not exist.',\n    subTitle500: 'Sorry, the server is reporting an error.',\n    noDataTitle: 'No data on the current page.',\n    networkErrorTitle: 'Network Error',\n    networkErrorSubTitle: 'Sorry，Your network connection has been disconnected, please check your network!',\n  },\n  lock: {\n    unlock: 'Click to unlock',\n    alert: 'Lock screen password error',\n    backToLogin: 'Back to login',\n    entry: 'Enter the system',\n    placeholder: 'lock screen password',\n  },\n  login: {\n    backSignIn: 'Back sign in',\n    mobileSignInFormTitle: 'Mobile sign in',\n    qrSignInFormTitle: 'Qr code sign in',\n    signInFormTitle: 'Sign in',\n    signUpFormTitle: 'Sign up',\n    forgetFormTitle: 'Reset password',\n\n    signInTitle: 'Backstage management system',\n    signInDesc: 'Enter your personal details and get started!',\n    policy: 'I agree to the xxx Privacy Policy',\n    scanSign: `scanning the code to complete the login`,\n\n    loginButton: 'Sign in',\n    registerButton: 'Sign up',\n    rememberMe: 'Remember me',\n    forgetPassword: 'Forget Password?',\n    otherSignIn: 'Sign in with',\n\n    // notify\n    loginSuccessTitle: 'Login successful',\n    loginSuccessDesc: 'Welcome back',\n\n    // placeholder\n    accountPlaceholder: 'Please input username',\n    passwordPlaceholder: 'Please input password',\n    smsPlaceholder: 'Please input sms code',\n    mobilePlaceholder: 'Please input mobile',\n    mobileCorrectPlaceholder: 'Please input correct mobile',\n    policyPlaceholder: 'Register after checking',\n    diffPwd: 'The two passwords are inconsistent',\n\n    userName: 'Username',\n    password: 'Password',\n    loginOrgCode: 'Department',\n    inputCode: 'Verification code',\n    confirmPassword: 'Confirm Password',\n    email: 'Email',\n    smsCode: 'SMS code',\n    mobile: 'Mobile',\n\n    //重置密码页面英文\n    authentication:'authentication',\n    resetLoginPassword:'reset login password',\n    resetSuccess:'reset succeeded',\n    nextStep:'next step',\n    goToLogin:'go to login'\n  },\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/locales/lang/en.ts",
    "content": "import { genMessage } from '../helper';\nimport antdLocale from 'ant-design-vue/es/locale/en_US';\n//import momentLocale from 'moment/dist/locale/eu';\n\nconst modules = import.meta.glob('./en/**/*.ts', { eager: true });\nexport default {\n  message: {\n    ...genMessage(modules as Recordable<Recordable>, 'en'),\n    antdLocale,\n  },\n  dateLocale: null,\n  dateLocaleName: 'en',\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/locales/lang/zh-CN/common.ts",
    "content": "export default {\n  okText: '确认',\n  closeText: '关闭',\n  cancelText: '取消',\n  loadingText: '加载中...',\n  saveText: '保存',\n  delText: '删除',\n  resetText: '重置',\n  searchText: '搜索',\n  queryText: '查询',\n\n  inputText: '请输入',\n  chooseText: '请选择',\n\n  redo: '刷新',\n  back: '返回',\n\n  light: '亮色主题',\n  dark: '黑暗主题',\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/locales/lang/zh-CN/component.ts",
    "content": "export default {\n  app: {\n    searchNotData: '暂无搜索结果',\n    toSearch: '确认',\n    toNavigate: '切换',\n  },\n  countdown: {\n    normalText: '获取验证码',\n    sendText: '{0}秒后重新获取',\n  },\n  cropper: {\n    selectImage: '选择图片',\n    uploadSuccess: '上传成功',\n    modalTitle: '头像上传',\n    okText: '确认并上传',\n    btn_reset: '重置',\n    btn_rotate_left: '逆时针旋转',\n    btn_rotate_right: '顺时针旋转',\n    btn_scale_x: '水平翻转',\n    btn_scale_y: '垂直翻转',\n    btn_zoom_in: '放大',\n    btn_zoom_out: '缩小',\n    preview: '预览',\n  },\n  drawer: {\n    loadingText: '加载中...',\n    cancelText: '关闭',\n    okText: '确认',\n  },\n  excel: {\n    exportModalTitle: '导出数据',\n    fileType: '文件类型',\n    fileName: '文件名',\n  },\n  form: {\n    putAway: '收起',\n    unfold: '展开',\n\n    maxTip: '字符数应小于{0}位',\n\n    apiSelectNotFound: '请等待数据加载完成...',\n  },\n  icon: {\n    placeholder: '点击选择图标',\n    search: '搜索图标',\n    copy: '复制图标成功!',\n  },\n  menu: {\n    search: '菜单搜索',\n  },\n  modal: {\n    cancelText: '关闭',\n    okText: '确认',\n    close: '关闭',\n    maximize: '最大化',\n    restore: '还原',\n  },\n  table: {\n    settingDens: '密度',\n    // settingDensDefault: '默认',\n    settingDensLarge: '宽松',\n    settingDensMiddle: '默认',\n    settingDensSmall: '紧凑',\n    settingColumn: '列设置',\n    settingColumnShow: '列展示',\n    settingIndexColumnShow: '序号列',\n    settingSelectColumnShow: '勾选列',\n    settingFixedLeft: '固定到左侧',\n    settingFixedRight: '固定到右侧',\n    settingFullScreen: '全屏',\n\n    index: '序号',\n\n    total: '共 {total} 条数据',\n  },\n  time: {\n    before: '前',\n    after: '后',\n    just: '刚刚',\n    seconds: '秒',\n    minutes: '分钟',\n    hours: '小时',\n    days: '天',\n  },\n  tree: {\n    selectAll: '选择全部',\n    unSelectAll: '取消选择',\n    expandAll: '展开全部',\n    unExpandAll: '折叠全部',\n    checkStrictly: '层级关联',\n    checkUnStrictly: '层级独立',\n  },\n  upload: {\n    save: '保存',\n    upload: '上传',\n    imgUpload: '图片上传',\n    uploaded: '已上传',\n\n    operating: '操作',\n    del: '删除',\n    download: '下载',\n    saveWarn: '请等待文件上传后，保存!',\n    saveError: '没有上传成功的文件，无法保存!',\n\n    preview: '预览',\n    choose: '选择文件',\n\n    accept: '支持{0}格式',\n    acceptUpload: '只能上传{0}格式文件',\n    maxSize: '单个文件不超过{0}MB',\n    maxSizeMultiple: '只能上传不超过{0}MB的文件!',\n    maxNumber: '最多只能上传{0}个文件',\n\n    legend: '略缩图',\n    fileName: '文件名',\n    fileSize: '文件大小',\n    fileStatue: '状态',\n\n    startUpload: '开始上传',\n    uploadSuccess: '上传成功',\n    uploadError: '上传失败',\n    uploading: '上传中',\n    uploadWait: '请等待文件上传结束后操作',\n    reUploadFailed: '重新上传失败文件',\n  },\n  verify: {\n    error: '验证失败！',\n    time: '验证校验成功,耗时{time}秒！',\n\n    redoTip: '点击图片可刷新',\n\n    dragText: '请按住滑块拖动',\n    successText: '验证通过',\n  },\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/locales/lang/zh-CN/layout.ts",
    "content": "export default {\n  footer: { onlinePreview: 'JEECG首页', onlineDocument: '在线文档' },\n  header: {\n    // user dropdown\n    dropdownItemDoc: '官网',\n    dropdownItemLoginOut: '退出系统',\n    dropdownItemSwitchPassword: '密码修改',\n    dropdownItemSwitchDepart: '切换部门',\n    dropdownItemRefreshCache: '刷新缓存',\n    dropdownItemSwitchAccount: '账户设置',\n    dropdownItemSwitchDefaultHomePage: '切换首页',\n\n    dropdownItemSwitchDefaultWeb: '桌面应用',\n    dropdownItemSwitchDefaultAndroid: '移动App',\n\n    // tooltip\n    tooltipErrorLog: '错误日志',\n    tooltipLock: '锁定屏幕',\n    tooltipNotify: '消息通知',\n\n    tooltipEntryFull: '全屏',\n    tooltipExitFull: '退出全屏',\n\n    // lock\n    lockScreenPassword: '锁屏密码',\n    lockScreen: '锁定屏幕',\n    lockScreenBtn: '锁定',\n\n    home: '首页',\n    welcomeIn:\"欢迎进入\",\n    refreshCacheComplete: \"刷新缓存完成！\",\n    refreshCacheFailure: \"刷新缓存失败！\",\n  },\n  multipleTab: {\n    reload: '刷 新',\n    close: '关闭当前',\n    closeLeft: '关闭左侧',\n    closeRight: '关闭右侧',\n    closeOther: '关闭其它',\n    closeAll: '关闭全部',\n    homeDesign: '门户设计',\n  },\n  setting: {\n    // content mode\n    contentModeFull: '流式',\n    contentModeFixed: '定宽',\n    // topMenu align\n    topMenuAlignLeft: '居左',\n    topMenuAlignRight: '居中',\n    topMenuAlignCenter: '居右',\n    // menu trigger\n    menuTriggerNone: '不显示',\n    menuTriggerBottom: '底部',\n    menuTriggerTop: '顶部',\n    // menu type\n    menuTypeSidebar: '侧边栏导航',\n    menuTypeMixSidebar: '侧边折叠导航',\n    menuTypeMix: '顶部混合导航',\n    menuTypeTopMenu: '顶部栏导航',\n\n    on: '开',\n    off: '关',\n    minute: '分钟',\n\n    operatingTitle: '操作成功',\n    operatingContent: '复制成功,请到 src/settings/projectSetting.ts 中修改配置！',\n    resetSuccess: '重置成功！',\n\n    copyBtn: '拷贝',\n    clearBtn: '清空并返回登录',\n\n    drawerTitle: '项目配置',\n\n    darkMode: '主题',\n    navMode: '导航栏模式',\n    interfaceFunction: '界面设置',\n    interfaceDisplay: '界面显示',\n    animation: '动画',\n    splitMenu: '顶部左侧组合菜单',\n    closeMixSidebarOnChange: '切换页面关闭菜单',\n\n    sysTheme: '系统主题',\n    headerTheme: '顶栏主题',\n    sidebarTheme: '菜单主题',\n\n    menuDrag: '侧边菜单拖拽',\n    menuSearch: '菜单搜索',\n    menuAccordion: '侧边菜单手风琴模式',\n    menuCollapse: '折叠菜单',\n    collapseMenuDisplayName: '折叠菜单显示名称',\n    topMenuLayout: '顶部菜单布局',\n    menuCollapseButton: '菜单折叠按钮',\n    contentMode: '内容区域宽度',\n    expandedMenuWidth: '菜单展开宽度',\n\n    breadcrumb: '面包屑',\n    breadcrumbIcon: '面包屑图标',\n    tabs: '标签页',\n    tabDetail: '标签详情页',\n    tabsQuickBtn: '标签页快捷按钮',\n    tabsRedoBtn: '标签页刷新按钮',\n    tabsFoldBtn: '标签页折叠按钮',\n    tabsTheme: '标签页样式',\n    tabsThemeSmooth: '圆滑',\n    tabsThemeCard: '卡片',\n    tabsThemeSimple: '极简',\n    sidebar: '左侧菜单',\n    header: '顶栏',\n    footer: '页脚',\n    fullContent: '全屏内容',\n    grayMode: '灰色模式',\n    colorWeak: '色弱模式',\n    aiIconSHow: 'Ai图标显示',\n\n    progress: '顶部进度条',\n    switchLoading: '切换loading',\n    switchAnimation: '切换动画',\n    animationType: '动画类型',\n\n    autoScreenLock: '自动锁屏',\n    notAutoScreenLock: '不自动锁屏',\n\n    fixedHeader: '固定header',\n    fixedSideBar: '固定Sidebar',\n\n    mixSidebarTrigger: '混合菜单触发方式',\n    triggerHover: '悬停',\n    triggerClick: '点击',\n\n    mixSidebarFixed: '固定展开菜单',\n  },\n  changePassword: {\n    changePassword: '修改密码',\n    oldPassword: '旧密码',\n    newPassword: '新密码',\n    confirmNewPassword: '确认新密码',\n    pleaseEnterNewPassword: '请输入新密码',\n  },\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/locales/lang/zh-CN/routes/basic.ts",
    "content": "export default {\n  login: '登录',\n  errorLogList: '错误日志列表',\n  defaultHomePage: '默认首页',\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/locales/lang/zh-CN/routes/dashboard.ts",
    "content": "export default {\n  dashboard: 'Dashboard',\n  about: '关于',\n  workbench: '工作台',\n  analysis: '分析页',\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/locales/lang/zh-CN/routes/demo.ts",
    "content": "export default {\n  charts: {\n    baiduMap: '百度地图',\n    aMap: '高德地图',\n    googleMap: '谷歌地图',\n    charts: '图表',\n    map: '地图',\n    line: '折线图',\n    pie: '饼图',\n  },\n  comp: {\n    comp: '组件',\n    basic: '基础组件',\n    jeecg: 'Jeecg组件',\n    transition: '动画组件',\n    countTo: '数字动画',\n    third: '第三方组件',\n\n    scroll: '滚动组件',\n    scrollBasic: '基础滚动',\n    scrollAction: '滚动函数',\n    virtualScroll: '虚拟滚动',\n\n    tree: 'Tree',\n    treeBasic: '基础树',\n    editTree: '可搜索/工具栏',\n    actionTree: '函数操作示例',\n\n    modal: '弹窗抽屉',\n    desc: '详情组件',\n\n    lazy: '懒加载组件',\n    lazyBasic: '基础示例',\n    lazyTransition: '动画效果',\n\n    verify: '验证组件',\n    verifyDrag: '拖拽校验',\n    verifyRotate: '图片还原',\n\n    qrcode: '二维码组件',\n    strength: '密码强度组件',\n    upload: '上传组件',\n\n    loading: 'Loading',\n\n    time: '相对时间',\n    cropperImage: '图片裁剪',\n    cardList: '卡片列表',\n    oneToMore: '一对多示例',\n    vexTable: '一对多示例',\n  },\n  basic: {\n    button: '按钮组件',\n  },\n  editor: {\n    editor: '编辑器',\n    jsonEditor: 'Json编辑器',\n    markdown: 'markdown编辑器',\n\n    tinymce: '富文本',\n    tinymceBasic: '基础使用',\n    tinymceForm: '嵌入form',\n  },\n  excel: {\n    excel: 'Excel',\n    customExport: '选择导出格式',\n    jsonExport: 'JSON数据导出',\n    arrayExport: 'Array数据导出',\n    importExcel: '导入',\n  },\n  feat: {\n    feat: '功能',\n    icon: '图标',\n    sessionTimeout: '登录过期',\n    tabs: '标签页操作',\n    tabDetail: '标签详情页',\n    print: '打印',\n    contextMenu: '右键菜单',\n    download: '文件下载',\n    clickOutSide: 'ClickOutSide组件',\n    imgPreview: '图片预览',\n    copy: '剪切板',\n    msg: '消息提示',\n    watermark: '水印',\n    ripple: '水波纹',\n    fullScreen: '全屏',\n    errorLog: '错误日志',\n    tab: 'Tab带参',\n    tab1: 'Tab带参1',\n    tab2: 'Tab带参2',\n    menu: 'Menu带参',\n    menu1: 'Menu带参1',\n    menu2: 'Menu带参2',\n    ws: 'websocket测试',\n    breadcrumb: '面包屑导航',\n    breadcrumbFlat: '平级模式',\n    breadcrumbFlatDetail: '平级详情',\n    breadcrumbChildren: '层级模式',\n    breadcrumbChildrenDetail: '层级详情',\n    fullCalendar: '日历(New)',\n    codemirror: '代码高亮(New)',\n  },\n  flow: {\n    name: '图形编辑器',\n    flowChart: '流程图',\n  },\n  form: {\n    form: 'Form',\n    basic: '基础表单',\n    useForm: 'useForm',\n    refForm: 'RefForm',\n    advancedForm: '可收缩表单',\n    ruleForm: '表单验证',\n    dynamicForm: '动态表单',\n    customerForm: '自定义组件',\n    appendForm: '表单增删示例',\n  },\n  modal: {\n    basic: '弹窗扩展',\n    drawer: '抽屉扩展',\n  },\n  iframe: {\n    frame: '外部页面',\n    antv: 'antVue文档(内嵌)',\n    doc: '项目文档(内嵌)',\n    docExternal: '项目文档(外链)',\n  },\n  level: { level: '多级菜单' },\n  page: {\n    page: '页面',\n\n    form: '表单页',\n    formBasic: '基础表单',\n    formStep: '分步表单',\n    formHigh: '高级表单',\n\n    desc: '详情页',\n    descBasic: '基础详情页',\n    descHigh: '高级详情页',\n\n    result: '结果页',\n    resultSuccess: '成功页',\n    resultFail: '失败页',\n\n    account: '个人页',\n    accountCenter: '个人中心',\n    accountSetting: '个人设置',\n\n    exception: '异常页',\n    netWorkError: '网络错误',\n    notData: '无数据',\n\n    list: '列表页',\n    listCard: '卡片列表',\n    listBasic: '标准列表',\n    listSearch: '搜索列表',\n  },\n  permission: {\n    permission: '权限管理',\n\n    front: '基于前端权限',\n    frontPage: '页面权限',\n    frontBtn: '按钮权限',\n    frontTestA: '权限测试页A',\n    frontTestB: '权限测试页B',\n\n    back: '基于后台权限',\n    backPage: '页面权限',\n    backBtn: '按钮权限',\n  },\n  setup: {\n    page: '引导页',\n  },\n  system: {\n    moduleName: '系统管理',\n    account: '账号管理',\n    account_detail: '账号详情',\n    password: '修改密码',\n    dept: '部门管理',\n    menu: '菜单管理',\n    test: '测试功能',\n    role: '角色管理',\n  },\n  table: {\n    table: 'Table',\n    basic: '基础表格',\n    treeTable: '树形表格',\n    fetchTable: '远程加载示例',\n    fixedColumn: '固定列',\n    customerCell: '自定义列',\n    formTable: '开启搜索区域',\n    useTable: 'UseTable',\n    refTable: 'RefTable',\n    multipleHeader: '多级表头',\n    mergeHeader: '合并单元格',\n    nestedTable: '嵌套子表格',\n    expandTable: '可展开表格',\n    fixedHeight: '定高/头部自定义',\n    footerTable: '表尾行合计',\n    editCellTable: '可编辑单元格',\n    editRowTable: '可编辑行',\n    authColumn: '权限列',\n  },\n  jeecg: {\n    JAreaLinkage: '区域选择',\n  },\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/locales/lang/zh-CN/sys.ts",
    "content": "export default {\n  api: {\n    operationFailed: '操作失败',\n    errorTip: '错误提示',\n    errorMessage: '操作失败,系统异常!',\n    timeoutMessage: '登录超时,请重新登录!',\n    apiTimeoutMessage: '接口请求超时,请刷新页面重试!',\n    apiRequestFailed: '请求出错，请稍候重试',\n    networkException: '网络异常',\n    networkExceptionMsg: '网络异常，请检查您的网络连接是否正常!',\n\n    errMsg401: '用户没有权限（令牌、用户名、密码错误）!',\n    errMsg403: '用户得到授权，但是访问是被禁止的。!',\n    errMsg404: '网络请求错误,未找到该资源!',\n    errMsg405: '网络请求错误,请求方法未允许!',\n    errMsg408: '网络请求超时!',\n    errMsg500: '服务器错误,请联系管理员!',\n    errMsg501: '网络未实现!',\n    errMsg502: '网络错误!',\n    errMsg503: '服务不可用，服务器暂时过载或维护!',\n    errMsg504: '网络超时!',\n    errMsg505: 'http版本不支持该请求!',\n\n    registerMsg: '注册成功',\n  },\n  app: { logoutTip: '温馨提醒', logoutMessage: '是否确认退出系统?', menuLoading: '菜单加载中...' },\n  errorLog: {\n    tableTitle: '错误日志列表',\n    tableColumnType: '类型',\n    tableColumnDate: '时间',\n    tableColumnFile: '文件',\n    tableColumnMsg: '错误信息',\n    tableColumnStackMsg: 'stack信息',\n\n    tableActionDesc: '详情',\n\n    modalTitle: '错误详情',\n\n    fireVueError: '点击触发vue错误',\n    fireResourceError: '点击触发资源加载错误',\n    fireAjaxError: '点击触发ajax错误',\n\n    enableMessage: '只在`/src/settings/projectSetting.ts` 内的useErrorHandle=true时生效.',\n  },\n  exception: {\n    backLogin: '返回登录',\n    backHome: '返回首页',\n    subTitle403: '抱歉，您无权访问此页面。',\n    subTitle404: '抱歉，您访问的页面不存在。',\n    subTitle500: '抱歉，服务器报告错误。',\n    noDataTitle: '当前页无数据',\n    networkErrorTitle: '网络错误',\n    networkErrorSubTitle: '抱歉，您的网络连接已断开，请检查您的网络！',\n  },\n  lock: {\n    unlock: '点击解锁',\n    alert: '锁屏密码错误',\n    backToLogin: '返回登录',\n    entry: '进入系统',\n    placeholder: '锁屏密码',\n  },\n  login: {\n    backSignIn: '返回',\n    signInFormTitle: '登录',\n    mobileSignInFormTitle: '手机登录',\n    qrSignInFormTitle: '二维码登录',\n    signUpFormTitle: '注册',\n    forgetFormTitle: '重置密码',\n\n    signInTitle: 'Jeecg Boot',\n    signInDesc: '是中国最具影响力的 企业级低代码平台！在线开发，可视化拖拽设计，零代码实现80%的基础功能~',\n    policy: '我同意敲敲云隐私政策',\n    scanSign: `扫码后，即可完成登录`,\n    scanSuccess: `扫码成功，登录中`,\n\n    loginButton: '登录',\n    registerButton: '注册',\n    rememberMe: '记住我',\n    forgetPassword: '忘记密码?',\n    otherSignIn: '其他登录方式',\n\n    // notify\n    loginSuccessTitle: '登录成功',\n    loginSuccessDesc: '欢迎回来',\n\n    // placeholder\n    accountPlaceholder: '请输入账号',\n    passwordPlaceholder: '请输入密码',\n    inputCodePlaceholder: '请输入验证码',\n    smsPlaceholder: '请输入验证码',\n    mobilePlaceholder: '请输入手机号码',\n    mobileCorrectPlaceholder: '请输入正确的手机号码',\n    policyPlaceholder: '勾选后才能注册',\n    diffPwd: '两次输入密码不一致',\n\n    userName: '账号',\n    password: '密码',\n    loginOrgCode: '部门',\n    inputCode: '验证码',\n    confirmPassword: '确认密码',\n    email: '邮箱',\n    smsCode: '短信验证码',\n    mobile: '手机号码',\n\n    subTitleText: '{0}秒后返回登录页面',\n\n    //重置密码页面中文\n    authentication:'验证身份',\n    resetLoginPassword:'重置登录密码',\n    resetSuccess:'重置成功',\n    nextStep:'下一步',\n    goToLogin:'去登录'\n  },\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/locales/lang/zh_CN.ts",
    "content": "import { genMessage } from '../helper';\nimport antdLocale from 'ant-design-vue/es/locale/zh_CN';\n\nconst modules = import.meta.glob('./zh-CN/**/*.ts', { eager: true });\nexport default {\n  message: {\n    ...genMessage(modules as Recordable<Recordable>, 'zh-CN'),\n    antdLocale,\n  },\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/locales/setupI18n.ts",
    "content": "import type { App } from 'vue';\nimport type { I18n, I18nOptions } from 'vue-i18n';\n\nimport { createI18n } from 'vue-i18n';\nimport { setHtmlPageLang, setLoadLocalePool } from './helper';\nimport { localeSetting } from '/@/settings/localeSetting';\nimport { useLocaleStoreWithOut } from '/@/store/modules/locale';\n\nconst { fallback, availableLocales } = localeSetting;\n\nexport let i18n: ReturnType<typeof createI18n>;\n\nasync function createI18nOptions(): Promise<I18nOptions> {\n  const localeStore = useLocaleStoreWithOut();\n  const locale = localeStore.getLocale;\n  const defaultLocal = await import(`./lang/${locale}.ts`);\n  const message = defaultLocal.default?.message ?? {};\n\n  setHtmlPageLang(locale);\n  setLoadLocalePool((loadLocalePool) => {\n    loadLocalePool.push(locale);\n  });\n\n  return {\n    legacy: false,\n    locale,\n    fallbackLocale: fallback,\n    messages: {\n      [locale]: message,\n    },\n    availableLocales: availableLocales,\n    sync: true, //If you don’t want to inherit locale from global scope, you need to set sync of i18n component option to false.\n    silentTranslationWarn: true, // true - warning off\n    missingWarn: false,\n    silentFallbackWarn: true,\n  };\n}\n\n// setup i18n instance with glob\nexport async function setupI18n(app: App) {\n  const options = await createI18nOptions();\n  i18n = createI18n(options) as I18n;\n  app.use(i18n);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/locales/useLocale.ts",
    "content": "/**\n * Multi-language related operations\n */\nimport type { LocaleType } from '/#/config';\n\nimport { i18n } from './setupI18n';\nimport { useLocaleStoreWithOut } from '/@/store/modules/locale';\nimport { unref, computed } from 'vue';\nimport { loadLocalePool, setHtmlPageLang } from './helper';\n\ninterface LangModule {\n  message: Recordable;\n  dateLocale: Recordable;\n  dateLocaleName: string;\n}\n\nfunction setI18nLanguage(locale: LocaleType) {\n  const localeStore = useLocaleStoreWithOut();\n\n  if (i18n.mode === 'legacy') {\n    i18n.global.locale = locale;\n  } else {\n    (i18n.global.locale as any).value = locale;\n  }\n  localeStore.setLocaleInfo({ locale });\n  setHtmlPageLang(locale);\n}\n\nexport function useLocale() {\n  const localeStore = useLocaleStoreWithOut();\n  const getLocale = computed(() => localeStore.getLocale);\n  const getShowLocalePicker = computed(() => localeStore.getShowPicker);\n\n  const getAntdLocale = computed((): any => {\n    return i18n.global.getLocaleMessage(unref(getLocale))?.antdLocale ?? {};\n  });\n\n  // Switching the language will change the locale of useI18n\n  // And submit to configuration modification\n  async function changeLocale(locale: LocaleType) {\n    const globalI18n = i18n.global;\n    const currentLocale = unref(globalI18n.locale);\n    if (currentLocale === locale) {\n      return locale;\n    }\n\n    if (loadLocalePool.includes(locale)) {\n      setI18nLanguage(locale);\n      return locale;\n    }\n    const langModule = ((await import(`./lang/${locale}.ts`)) as any).default as LangModule;\n    if (!langModule) return;\n\n    const { message } = langModule;\n\n    globalI18n.setLocaleMessage(locale, message);\n    loadLocalePool.push(locale);\n\n    setI18nLanguage(locale);\n    return locale;\n  }\n\n  return {\n    getLocale,\n    getShowLocalePicker,\n    changeLocale,\n    getAntdLocale,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/logics/error-handle/index.ts",
    "content": "/**\n * Used to configure the global error handling function, which can monitor vue errors, script errors, static resource errors and Promise errors\n */\n\nimport type { ErrorLogInfo } from '/#/store';\n\nimport { useErrorLogStoreWithOut } from '/@/store/modules/errorLog';\n\nimport { ErrorTypeEnum } from '/@/enums/exceptionEnum';\nimport { App } from 'vue';\nimport projectSetting from '/@/settings/projectSetting';\n\n/**\n * Handling error stack information\n * @param error\n */\nfunction processStackMsg(error: Error) {\n  if (!error.stack) {\n    return '';\n  }\n  let stack = error.stack\n    .replace(/\\n/gi, '') // Remove line breaks to save the size of the transmitted content\n    .replace(/\\bat\\b/gi, '@') // At in chrome, @ in ff\n    .split('@') // Split information with @\n    .slice(0, 9) // The maximum stack length (Error.stackTraceLimit = 10), so only take the first 10\n    .map((v) => v.replace(/^\\s*|\\s*$/g, '')) // Remove extra spaces\n    .join('~') // Manually add separators for later display\n    .replace(/\\?[^:]+/gi, ''); // Remove redundant parameters of js file links (?x=1 and the like)\n  const msg = error.toString();\n  if (stack.indexOf(msg) < 0) {\n    stack = msg + '@' + stack;\n  }\n  return stack;\n}\n\n/**\n * get comp name\n * @param vm\n */\nfunction formatComponentName(vm: any) {\n  if (vm.$root === vm) {\n    return {\n      name: 'root',\n      path: 'root',\n    };\n  }\n\n  const options = vm.$options as any;\n  if (!options) {\n    return {\n      name: 'anonymous',\n      path: 'anonymous',\n    };\n  }\n  const name = options.name || options._componentTag;\n  return {\n    name: name,\n    path: options.__file,\n  };\n}\n\n/**\n * Configure Vue error handling function\n */\n\nfunction vueErrorHandler(err: Error, vm: any, info: string) {\n  const errorLogStore = useErrorLogStoreWithOut();\n  const { name, path } = formatComponentName(vm);\n  errorLogStore.addErrorLogInfo({\n    type: ErrorTypeEnum.VUE,\n    name,\n    file: path,\n    message: err.message,\n    stack: processStackMsg(err),\n    detail: info,\n    url: window.location.href,\n  });\n}\n\n/**\n * Configure script error handling function\n */\nexport function scriptErrorHandler(event: Event | string, source?: string, lineno?: number, colno?: number, error?: Error) {\n  if (event === 'Script error.' && !source) {\n    return false;\n  }\n  const errorInfo: Partial<ErrorLogInfo> = {};\n  colno = colno || (window.event && (window.event as any).errorCharacter) || 0;\n  errorInfo.message = event as string;\n  if (error?.stack) {\n    errorInfo.stack = error.stack;\n  } else {\n    errorInfo.stack = '';\n  }\n  const name = source ? source.substr(source.lastIndexOf('/') + 1) : 'script';\n  const errorLogStore = useErrorLogStoreWithOut();\n  errorLogStore.addErrorLogInfo({\n    type: ErrorTypeEnum.SCRIPT,\n    name: name,\n    file: source as string,\n    detail: 'lineno' + lineno,\n    url: window.location.href,\n    ...(errorInfo as Pick<ErrorLogInfo, 'message' | 'stack'>),\n  });\n  return true;\n}\n\n/**\n * Configure Promise error handling function\n */\nfunction registerPromiseErrorHandler() {\n  window.addEventListener(\n    'unhandledrejection',\n    function (event) {\n      const errorLogStore = useErrorLogStoreWithOut();\n      errorLogStore.addErrorLogInfo({\n        type: ErrorTypeEnum.PROMISE,\n        name: 'Promise Error!',\n        file: 'none',\n        detail: 'promise error!',\n        url: window.location.href,\n        stack: 'promise error!',\n        message: event.reason,\n      });\n    },\n    true\n  );\n}\n\n/**\n * Configure monitoring resource loading error handling function\n */\nfunction registerResourceErrorHandler() {\n  // Monitoring resource loading error(img,script,css,and jsonp)\n  window.addEventListener(\n    'error',\n    function (e: Event) {\n      const target = e.target ? e.target : (e.srcElement as any);\n      const errorLogStore = useErrorLogStoreWithOut();\n      errorLogStore.addErrorLogInfo({\n        type: ErrorTypeEnum.RESOURCE,\n        name: 'Resource Error!',\n        file: (e.target || ({} as any)).currentSrc,\n        detail: JSON.stringify({\n          tagName: target.localName,\n          html: target.outerHTML,\n          type: e.type,\n        }),\n        url: window.location.href,\n        stack: 'resource is not found',\n        message: (e.target || ({} as any)).localName + ' is load error',\n      });\n    },\n    true\n  );\n}\n\n/**\n * Configure global error handling\n * @param app\n */\nexport function setupErrorHandle(app: App) {\n  const { useErrorHandle } = projectSetting;\n  if (!useErrorHandle) {\n    return;\n  }\n  // Vue exception monitoring;\n  app.config.errorHandler = vueErrorHandler;\n\n  // script error\n  window.onerror = scriptErrorHandler;\n\n  //  promise exception\n  registerPromiseErrorHandler();\n\n  // Static resource exception\n  registerResourceErrorHandler();\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/logics/initAppConfig.ts",
    "content": "/**\n * Application configuration\n */\nimport type { ProjectConfig } from '/#/config';\n\nimport { PROJ_CFG_KEY } from '/@/enums/cacheEnum';\nimport projectSetting from '/@/settings/projectSetting';\n\nimport { updateHeaderBgColor, updateSidebarBgColor } from '/@/logics/theme/updateBackground';\nimport { updateColorWeak } from '/@/logics/theme/updateColorWeak';\nimport { updateGrayMode } from '/@/logics/theme/updateGrayMode';\nimport { updateDarkTheme } from '/@/logics/theme/dark';\nimport { changeTheme } from '/@/logics/theme';\n\nimport { useAppStore } from '/@/store/modules/app';\nimport { useLocaleStore } from '/@/store/modules/locale';\n\nimport { getCommonStoragePrefix, getStorageShortName } from '/@/utils/env';\n\nimport { primaryColor } from '../../build/config/themeConfig';\nimport { Persistent } from '/@/utils/cache/persistent';\nimport { deepMerge } from '/@/utils';\nimport { ThemeEnum } from '/@/enums/appEnum';\n\n// Initial project configuration\nexport function initAppConfigStore() {\n  const localeStore = useLocaleStore();\n  const appStore = useAppStore();\n  let projCfg: ProjectConfig = Persistent.getLocal(PROJ_CFG_KEY) as ProjectConfig;\n  projCfg = deepMerge(projectSetting, projCfg || {});\n  const darkMode = appStore.getDarkMode;\n  const {\n    colorWeak,\n    grayMode,\n    themeColor,\n\n    headerSetting: { bgColor: headerBgColor } = {},\n    menuSetting: { bgColor } = {},\n  } = projCfg;\n  try {\n    if (themeColor && themeColor !== primaryColor) {\n      changeTheme(themeColor);\n    }\n\n    grayMode && updateGrayMode(grayMode);\n    colorWeak && updateColorWeak(colorWeak);\n  } catch (error) {\n    console.log(error);\n  }\n  appStore.setProjectConfig(projCfg);\n\n  // init dark mode\n  updateDarkTheme(darkMode);\n  if (darkMode === ThemeEnum.DARK) {\n    updateHeaderBgColor();\n    updateSidebarBgColor();\n  } else {\n    headerBgColor && updateHeaderBgColor(headerBgColor);\n    bgColor && updateSidebarBgColor(bgColor);\n  }\n  // init store\n  localeStore.initLocale();\n\n  setTimeout(() => {\n    clearObsoleteStorage();\n  }, 16);\n}\n\n/**\n * As the version continues to iterate, there will be more and more cache keys stored in localStorage.\n * This method is used to delete useless keys\n */\nexport function clearObsoleteStorage() {\n  const commonPrefix = getCommonStoragePrefix();\n  const shortPrefix = getStorageShortName();\n\n  [localStorage, sessionStorage].forEach((item: Storage) => {\n    Object.keys(item).forEach((key) => {\n      if (key && key.startsWith(commonPrefix) && !key.startsWith(shortPrefix)) {\n        item.removeItem(key);\n      }\n    });\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/logics/mitt/routeChange.ts",
    "content": "/**\n * Used to monitor routing changes to change the status of menus and tabs. There is no need to monitor the route, because the route status change is affected by the page rendering time, which will be slow\n */\n\nimport mitt from '/@/utils/mitt';\nimport type { RouteLocationNormalized } from 'vue-router';\nimport { getRawRoute } from '/@/utils';\n\nconst emitter = mitt();\n\nconst key = Symbol();\n\nlet lastChangeTab: RouteLocationNormalized;\n\nexport function setRouteChange(lastChangeRoute: RouteLocationNormalized) {\n  const r = getRawRoute(lastChangeRoute);\n  emitter.emit(key, r);\n  lastChangeTab = r;\n}\n\nexport function listenerRouteChange(callback: (route: RouteLocationNormalized) => void, immediate = true) {\n  emitter.on(key, callback);\n  immediate && lastChangeTab && callback(lastChangeTab);\n}\n\nexport function removeTabChangeListener() {\n  emitter.clear();\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/logics/theme/dark.ts",
    "content": "import { darkCssIsReady, loadDarkThemeCss } from '@rys-fe/vite-plugin-theme/es/client';\nimport { addClass, hasClass, removeClass } from '/@/utils/domUtils';\n\nexport async function updateDarkTheme(mode: string | null = 'light') {\n  const htmlRoot = document.getElementById('htmlRoot');\n  if (!htmlRoot) {\n    return;\n  }\n  const hasDarkClass = hasClass(htmlRoot, 'dark');\n  if (mode === 'dark') {\n    if (import.meta.env.PROD && !darkCssIsReady) {\n      await loadDarkThemeCss();\n    }\n    htmlRoot.setAttribute('data-theme', 'dark');\n    if (!hasDarkClass) {\n      addClass(htmlRoot, 'dark');\n    }\n  } else {\n    htmlRoot.setAttribute('data-theme', 'light');\n    if (hasDarkClass) {\n      removeClass(htmlRoot, 'dark');\n    }\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/logics/theme/index.ts",
    "content": "import { getThemeColors, generateColors } from '../../../build/config/themeConfig';\nimport {\n  replaceStyleVariables,\n  loadDarkThemeCss,\n  replaceCssColors,\n  darkCssIsReady,\n  linkID,\n  styleTagId,\n  appendCssToDom,\n  getStyleDom,\n} from '@rys-fe/vite-plugin-theme/es/client';\nimport { mixLighten, mixDarken, tinycolor } from '@rys-fe/vite-plugin-theme/es/colorUtils';\nimport { useAppStore } from '/@/store/modules/app';\nimport { defHttp } from '/@/utils/http/axios';\n\nlet cssText = '';\nexport async function changeTheme(color: string) {\n  // 代码逻辑说明: 【QQYUN-6366】升级到antd4.x\n  const appStore = useAppStore();\n  appStore.setProjectConfig({ themeColor: color });\n  const colors = generateColors({\n    mixDarken,\n    mixLighten,\n    tinycolor,\n    color,\n  });\n  // 代码逻辑说明: 【QQYUN-8570】生产环境暗黑模式下主题色不生效\n  if (import.meta.env.PROD && appStore.getDarkMode === 'dark') {\n    if (!darkCssIsReady && !cssText) {\n      await loadDarkThemeCss();\n    }\n    const el: HTMLLinkElement = document.getElementById(linkID) as HTMLLinkElement;\n    if (el?.href) {\n      // cssText = await fetchCss(el.href) as string;\n      !cssText && (cssText = await defHttp.get({ url: el.href }, { isTransformResponse: false }));\n      const colorVariables = [...getThemeColors(color), ...colors];\n      const processCss = await replaceCssColors(cssText, colorVariables);\n      appendCssToDom(getStyleDom(styleTagId) as HTMLStyleElement, processCss);\n    }\n  } else {\n    await replaceStyleVariables({\n      colorVariables: [...getThemeColors(color), ...colors],\n    });\n    fixDark();\n  }\n}\n// 【LOWCOD-2262】修复黑暗模式下切换皮肤无效的问题\nasync function fixDark() {\n  // 代码逻辑说明: 【QQYUN-8570】生产环境暗黑模式下主题色不生效\n  const el = document.getElementById(styleTagId);\n  if (el) {\n    el.innerHTML = el.innerHTML.replace(/\\\\[\"']dark\\\\[\"']/g, `'dark'`);\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/logics/theme/updateBackground.ts",
    "content": "import { colorIsDark, lighten, darken } from '/@/utils/color';\nimport { useAppStore } from '/@/store/modules/app';\nimport { ThemeEnum } from '/@/enums/appEnum';\nimport { setCssVar } from './util';\nimport { SIDE_BAR_BG_COLOR_LIST, SIDER_LOGO_BG_COLOR_LIST } from '/@/settings/designSetting';\n\nconst HEADER_BG_COLOR_VAR = '--header-bg-color';\nconst HEADER_BG_HOVER_COLOR_VAR = '--header-bg-hover-color';\nconst HEADER_MENU_ACTIVE_BG_COLOR_VAR = '--header-active-menu-bg-color';\n\nconst SIDER_LOGO_BG_COLOR = '--sider-logo-bg-color';\nconst SIDER_DARK_BG_COLOR = '--sider-dark-bg-color';\nconst SIDER_DARK_DARKEN_BG_COLOR = '--sider-dark-darken-bg-color';\nconst SIDER_LIGHTEN_BG_COLOR = '--sider-dark-lighten-bg-color';\n\n/**\n * Change the background color of the top header\n * @param color\n */\nexport function updateHeaderBgColor(color?: string) {\n  const appStore = useAppStore();\n  const darkMode = appStore.getDarkMode === ThemeEnum.DARK;\n  if (!color) {\n    if (darkMode) {\n      color = '#151515';\n    } else {\n      color = appStore.getHeaderSetting.bgColor;\n    }\n  }\n  // bg color\n  setCssVar(HEADER_BG_COLOR_VAR, color);\n\n  // hover color\n  const hoverColor = lighten(color!, 6);\n  setCssVar(HEADER_BG_HOVER_COLOR_VAR, hoverColor);\n  setCssVar(HEADER_MENU_ACTIVE_BG_COLOR_VAR, hoverColor);\n\n  // Determine the depth of the color value and automatically switch the theme\n  const isDark = colorIsDark(color!);\n\n  appStore.setProjectConfig({\n    headerSetting: {\n      theme: isDark || darkMode ? ThemeEnum.DARK : ThemeEnum.LIGHT,\n    },\n  });\n}\n\n/**\n * Change the background color of the left menu\n * @param color  bg color\n */\nexport function updateSidebarBgColor(color?: string) {\n  const appStore = useAppStore();\n\n  // if (!isHexColor(color)) return;\n  const darkMode = appStore.getDarkMode === ThemeEnum.DARK;\n  if (!color) {\n    if (darkMode) {\n      color = '#212121';\n    } else {\n      color = appStore.getMenuSetting.bgColor;\n    }\n  }\n  // 代码逻辑说明: 【QQYUN-5922】logo背景色渐变\n  let findIndex = SIDE_BAR_BG_COLOR_LIST.findIndex((item) => item === color);\n  setCssVar(SIDER_LOGO_BG_COLOR, findIndex == -1 ? 'linear-gradient(180deg, #000000, #282828)' : SIDER_LOGO_BG_COLOR_LIST[findIndex]);\n  setCssVar(SIDER_DARK_BG_COLOR, color);\n  setCssVar(SIDER_DARK_DARKEN_BG_COLOR, darken(color!, 6));\n  setCssVar(SIDER_LIGHTEN_BG_COLOR, lighten(color!, 5));\n\n  // only #ffffff is light\n  // Only when the background color is #fff, the theme of the menu will be changed to light\n  // 代码逻辑说明: 【QQYUN-8922】左侧导航栏文字颜色调整区分彩色和暗黑\n  let theme;\n  let isThemeBright = false;\n  if (['#fff', '#ffffff'].includes(color!.toLowerCase()) && !darkMode) {\n    theme = ThemeEnum.LIGHT;\n  } else if (['#009688', '#e74c3c','#037bd5'].includes(color!.toLowerCase()) && !darkMode) {\n    theme = ThemeEnum.DARK;\n    isThemeBright = true;\n  } else {\n    theme = ThemeEnum.DARK;\n  }\n  appStore.setProjectConfig({\n    menuSetting: {\n      theme,\n      isThemeBright,\n    },\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/logics/theme/updateColorWeak.ts",
    "content": "import { toggleClass } from './util';\n\n/**\n * Change the status of the project's color weakness mode\n * @param colorWeak\n */\nexport function updateColorWeak(colorWeak: boolean) {\n  toggleClass(colorWeak, 'color-weak', document.documentElement);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/logics/theme/updateGrayMode.ts",
    "content": "import { toggleClass } from './util';\n\n/**\n * Change project gray mode status\n * @param gray\n */\nexport function updateGrayMode(gray: boolean) {\n  toggleClass(gray, 'gray-mode', document.documentElement);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/logics/theme/util.ts",
    "content": "const docEle = document.documentElement;\nexport function toggleClass(flag: boolean, clsName: string, target?: HTMLElement) {\n  const targetEl = target || document.body;\n  let { className } = targetEl;\n  className = className.replace(clsName, '');\n  targetEl.className = flag ? `${className} ${clsName} ` : className;\n}\n\nexport function setCssVar(prop: string, val: any, dom = docEle) {\n  dom.style.setProperty(prop, val);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/main.ts",
    "content": "import type { MainAppProps } from \"#/main\";\nimport 'uno.css';\nimport '/@/design/index.less';\nimport 'ant-design-vue/dist/reset.css';\n// 注册图标\nimport 'virtual:svg-icons-register';\n\nimport App from './App.vue';\nimport { createApp } from 'vue';\nimport { initAppConfigStore } from '/@/logics/initAppConfig';\nimport { setupErrorHandle } from '/@/logics/error-handle';\nimport { router, createRouter, setupRouter } from '/@/router';\nimport { setupRouterGuard } from '/@/router/guard';\nimport { setupStore } from '/@/store';\nimport { setupGlobDirectives } from '/@/directives';\nimport { setupI18n } from '/@/locales/setupI18n';\nimport { setupElectron } from \"@/electron\";\nimport { registerGlobComp } from '/@/components/registerGlobComp';\nimport { registerThirdComp } from '/@/settings/registerThirdComp';\nimport { registerSuper } from '/@/views/super/registerSuper';\nimport { useSso } from '/@/hooks/web/useSso';\nimport { checkIsQiankunMicro } from \"/@/qiankun/micro\";\nimport { autoUseQiankunMicro } from \"/@/qiankun/micro/qiankunMicro\";\nimport { useAppStoreWithOut } from \"@/store/modules/app\";\n\n// 注册online模块lib\nimport { registerPackages } from '/@/utils/monorepo/registerPackages';\n\n// 程序入口\nasync function main() {\n  if (checkIsQiankunMicro()) {\n    // 【JEECG作为乾坤子应用】以乾坤子应用模式启动\n    // await autoUseQiankunMicro(bootstrap)\n    await autoUseQiankunMicro(bootstrap)\n  } else {\n    // 获取参数\n    const props = getMainAppProps();\n    // 普通启动\n    await bootstrap(props)\n  }\n}\n\nmain();\n\nasync function bootstrap(props?: MainAppProps) {\n  // 创建应用实例\n  const app = createApp(App);\n  // 【QQYUN-6329】\n  window['JAppRootInstance'] = app;\n\n  // 创建路由\n  createRouter();\n\n  // 配置存储\n  setupStore(app);\n\n  // 配置参数\n  setupProps(props);\n\n  // 多语言配置,异步情况:语言文件可以从服务器端获得\n  await setupI18n(app);\n\n  // 初始化内部系统配置\n  initAppConfigStore();\n\n  // 注册外部模块路由(注册online模块lib)\n  registerPackages(app);\n\n  // 注册全局组件\n  registerGlobComp(app);\n\n  //CAS单点登录\n  await useSso().ssoLogin();\n\n  // 注册super应用路由\n  await registerSuper(app);\n  \n  // 配置路由\n  setupRouter(app);\n\n  // 路由保护\n  setupRouterGuard(router);\n\n  // 注册全局指令\n  setupGlobDirectives(app);\n\n  // 配置全局错误处理\n  setupErrorHandle(app);\n\n  // 注册第三方组件\n  await registerThirdComp(app);\n\n  // 配置electron\n  setupElectron(app)\n\n  // 当路由准备好时再执行挂载( https://next.router.vuejs.org/api/#isready)\n  await router.isReady();\n\n  // 挂载应用\n  app.mount(getMountContainer(props), true);\n\n  console.log(\" vue3 app 加载完成！\")\n\n  return app\n}\n\n// 获取应用挂载容器\nfunction getMountContainer(props?: MainAppProps) {\n  const id = '#app';\n  if (!props?.container?.querySelector) {\n    return id;\n  }\n  return props.container.querySelector(id) ?? id;\n}\n\n// 获取主应用参数\nfunction getMainAppProps(): MainAppProps {\n  // 从 queryString 中获取\n  const searchParams = new URLSearchParams(window.location.search);\n  // 隐藏侧边栏（菜单）\n  let hideSider = searchParams.get('hideSider') === 'true';\n  // 隐藏顶部\n  let hideHeader = searchParams.get('hideHeader') === 'true';\n  // 隐藏 多Tab 切换\n  let hideMultiTabs = searchParams.get('hideMultiTabs') === 'true';\n\n  return {\n    hideSider,\n    hideHeader,\n    hideMultiTabs\n  }\n}\n\n// 配置主应用参数\nfunction setupProps(props?: MainAppProps) {\n  if (!props) {\n    return\n  }\n  const appStore = useAppStoreWithOut();\n  appStore.setMainAppProps(props);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/qiankun/apps.ts",
    "content": "// /**\n//  *微应用apps\n//  * @name: 微应用名称 - 具有唯一性\n//  * @entry: 微应用入口.必选 - 通过该地址加载微应用，\n//  * @container: 微应用挂载节点 - 微应用加载完成后将挂载在该节点上\n//  * @activeRule: 微应用触发的路由规则 - 触发路由规则后将加载该微应用\n//  */\n// //子应用列表\n// const _apps: object[] = [];\n// for (const key in import.meta.env) {\n//   if (key.includes('VITE_APP_SUB_')) {\n//     const name = key.split('VITE_APP_SUB_')[1];\n//     const obj = {\n//       name,\n//       entry: import.meta.env[key],\n//       container: '#content',\n//       activeRule: name,\n//     };\n//     _apps.push(obj);\n//   }\n// }\n// export const apps = _apps;\n"
  },
  {
    "path": "jeecgboot-vue3/src/qiankun/index.ts",
    "content": "// /**\n//  * qiankun配置\n//  */\n// import { registerMicroApps, setDefaultMountApp, start, runAfterFirstMounted, addGlobalUncaughtErrorHandler } from 'qiankun';\n// import { apps } from './apps';\n// import { getProps, initGlState } from './state';\n//\n// /**\n//  * 重构apps\n//  */\n// function filterApps() {\n//   apps.forEach((item) => {\n//     //主应用需要传递给微应用的数据。\n//     item.props = getProps();\n//     //微应用触发的路由规则\n//     // @ts-ignore\n//     item.activeRule = genActiveRule('/' + item.activeRule);\n//   });\n//   return apps;\n// }\n//\n// /**\n//  * 路由监听\n//  * @param {*} routerPrefix 前缀\n//  */\n// function genActiveRule(routerPrefix) {\n//   return (location) => location.pathname.startsWith(routerPrefix);\n// }\n//\n// /**\n//  * 微应用注册\n//  */\n// function registerApps() {\n//   const _apps = filterApps();\n//   registerMicroApps(_apps, {\n//     beforeLoad: [\n//       // @ts-ignore\n//       (loadApp) => {\n//         console.log('before load', loadApp);\n//       },\n//     ],\n//     beforeMount: [\n//       // @ts-ignore\n//       (mountApp) => {\n//         console.log('before mount', mountApp);\n//       },\n//     ],\n//     afterMount: [\n//       // @ts-ignore\n//       (mountApp) => {\n//         console.log('before mount', mountApp);\n//       },\n//     ],\n//     afterUnmount: [\n//       // @ts-ignore\n//       (unloadApp) => {\n//         console.log('after unload', unloadApp);\n//       },\n//     ],\n//   });\n//   // 设置默认子应用,与 genActiveRule中的参数保持一致\n//   // setDefaultMountApp();\n//   // 第一个微应用 mount 后需要调用的方法，比如开启一些监控或者埋点脚本。\n//   runAfterFirstMounted(() => console.log('开启监控'));\n//   // 添加全局的未捕获异常处理器。\n//   addGlobalUncaughtErrorHandler((event) => console.log(event));\n//   // 定义全局状态\n//   initGlState();\n//   //启动qiankun\n//   start({});\n// }\n//\n// export default registerApps;\n"
  },
  {
    "path": "jeecgboot-vue3/src/qiankun/micro/index.ts",
    "content": "import {qiankunWindow} from 'vite-plugin-qiankun/dist/helper'\n\n/**\n * 【JEECG作为乾坤子应用】【判断当前是否是以乾坤子应用的模式运行】\n */\nexport function checkIsQiankunMicro(): boolean {\n  return !!qiankunWindow.__POWERED_BY_QIANKUN__;\n}\n\nexport function getGlobal() {\n  return (checkIsQiankunMicro() ? qiankunWindow : window) as Window\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/qiankun/micro/qiankunMicro.ts",
    "content": "/*\n* 【JEECG作为乾坤子应用】\n*/\nimport type {App} from 'vue';\nimport type {MainAppProps} from \"#/main\";\n\nimport {destroyStore} from \"@/store\";\nimport {destroyRouter} from \"@/router\";\nimport {clearComponent} from \"@/components/jeecg/JVxeTable/src/componentMap\";\n\nimport {renderWithQiankun} from 'vite-plugin-qiankun/dist/helper';\n\n/**\n * 以乾坤子应用模式运行\n * @param render\n */\nexport async function useQiankunMicroApp(render: (props?: MainAppProps) => Promise<App>) {\n  let instance: Nullable<App> = null;\n\n  // 注册乾坤子应用生命周期函数\n  renderWithQiankun({\n    async mount(props) {\n      console.debug('[qiankun-micro] mount - props :', props)\n      instance = await render({\n        container: props.container!,\n        hideSider: props.hideSider,\n        hideHeader: props.hideHeader,\n        hideMultiTabs: props.hideMultiTabs,\n      });\n    },\n    bootstrap() {\n      console.debug('[qiankun-micro] bootstrap');\n    },\n    update(props) {\n      console.debug('[qiankun-micro] update: ', props);\n    },\n    unmount(props) {\n      console.debug('[qiankun-micro] unmount: ', props);\n\n      destroyStore();\n      destroyRouter();\n\n      if (instance) {\n        clearComponent();\n        instance.unmount();\n        instance._container.innerHTML = '';\n        instance = null;\n      }\n    },\n  });\n\n  return instance!\n}\n\nexport async function autoUseQiankunMicro(fn: Fn) {\n  return useQiankunMicroApp(fn)\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/qiankun/state.ts",
    "content": "// /**\n//  *公共数据\n//  */\n// import { initGlobalState } from 'qiankun';\n// import { store } from '/@/store';\n// import { router } from '/@/router';\n// import { getToken } from '/@/utils/auth';\n// //定义传入子应用的数据\n// export function getProps() {\n//   return {\n//     data: {\n//       publicPath: '/',\n//       token: getToken(),\n//       store,\n//       router,\n//     },\n//   };\n// }\n//\n// /**\n//  * 定义全局状态，并返回通信方法,在主应用使用，微应用通过 props 获取通信方法。\n//  * @param state 主应用穿的公共数据\n//  */\n// export function initGlState(info = { userName: 'admin' }) {\n//   // 初始化state\n//   const actions = initGlobalState(info);\n//   // 设置新的值\n//   actions.setGlobalState(info);\n//   // 注册 观察者 函数 - 响应 globalState 变化，在 globalState 发生改变时触发该 观察者 函数。\n//   actions.onGlobalStateChange((newState, prev) => {\n//     // state: 变更后的状态; prev 变更前的状态\n//     console.info('newState', newState);\n//     console.info('prev', prev);\n//     for (const key in newState) {\n//       console.info('onGlobalStateChange', key);\n//     }\n//   });\n// }\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/constant.ts",
    "content": "export const REDIRECT_NAME = 'Redirect';\n\nexport const PARENT_LAYOUT_NAME = 'ParentLayout';\n\nexport const PAGE_NOT_FOUND_NAME = 'PageNotFound';\n// 代码逻辑说明: 【issues/7500】vue-router4.5.0版本路由name:PageNotFound同名导致登录进不去\nexport const PAGE_NOT_FOUND_NAME_404 = 'PageNotFound404';\n\nexport const EXCEPTION_COMPONENT = () => import('/@/views/sys/exception/Exception.vue');\n\n/**\n * @description: default layout\n */\nexport const LAYOUT = () => import('/@/layouts/default/index.vue');\n\n/**\n * @description: parent-layout\n */\nexport const getParentLayout = (_name?: string) => {\n  return () =>\n    new Promise((resolve) => {\n      resolve({\n        name: _name || PARENT_LAYOUT_NAME,\n      });\n    });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/guard/index.ts",
    "content": "import type { Router, RouteLocationNormalized } from 'vue-router';\nimport { useAppStoreWithOut } from '/@/store/modules/app';\nimport { useUserStoreWithOut } from '/@/store/modules/user';\nimport { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';\nimport { AxiosCanceler } from '/@/utils/http/axios/axiosCancel';\nimport { Modal, notification } from 'ant-design-vue';\nimport { warn } from '/@/utils/log';\nimport { unref } from 'vue';\nimport { setRouteChange } from '/@/logics/mitt/routeChange';\nimport { createPermissionGuard } from './permissionGuard';\nimport { createStateGuard } from './stateGuard';\nimport nProgress from 'nprogress';\nimport projectSetting from '/@/settings/projectSetting';\nimport { createParamMenuGuard } from './paramMenuGuard';\n\n// Don't change the order of creation\nexport function setupRouterGuard(router: Router) {\n  createPageGuard(router);\n  createPageLoadingGuard(router);\n  createHttpGuard(router);\n  createScrollGuard(router);\n  createMessageGuard(router);\n  createProgressGuard(router);\n  createPermissionGuard(router);\n  createParamMenuGuard(router); // must after createPermissionGuard (menu has been built.)\n  createStateGuard(router);\n}\n\n/**\n * Hooks for handling page state\n */\nfunction createPageGuard(router: Router) {\n  const loadedPageMap = new Map<string, boolean>();\n\n  router.beforeEach(async (to) => {\n    // The page has already been loaded, it will be faster to open it again, you don’t need to do loading and other processing\n    to.meta.loaded = !!loadedPageMap.get(to.path);\n    // Notify routing changes\n    setRouteChange(to);\n\n    return true;\n  });\n\n  router.afterEach((to) => {\n    loadedPageMap.set(to.path, true);\n  });\n}\n\n// Used to handle page loading status\nfunction createPageLoadingGuard(router: Router) {\n  const userStore = useUserStoreWithOut();\n  const appStore = useAppStoreWithOut();\n  const { getOpenPageLoading } = useTransitionSetting();\n  router.beforeEach(async (to) => {\n    if (!userStore.getToken) {\n      return true;\n    }\n    if (to.meta.loaded) {\n      return true;\n    }\n\n    if (unref(getOpenPageLoading)) {\n      appStore.setPageLoadingAction(true);\n      return true;\n    }\n\n    return true;\n  });\n  router.afterEach(async () => {\n    if (unref(getOpenPageLoading)) {\n      // TODO Looking for a better way\n      // The timer simulates the loading time to prevent flashing too fast,\n      setTimeout(() => {\n        appStore.setPageLoading(false);\n      }, 220);\n    }\n    return true;\n  });\n}\n\n/**\n * The interface used to close the current page to complete the request when the route is switched\n * @param router\n */\nfunction createHttpGuard(router: Router) {\n  const { removeAllHttpPending } = projectSetting;\n  let axiosCanceler: Nullable<AxiosCanceler>;\n  if (removeAllHttpPending) {\n    axiosCanceler = new AxiosCanceler();\n  }\n  router.beforeEach(async () => {\n    // Switching the route will delete the previous request\n    axiosCanceler?.removeAllPending();\n    return true;\n  });\n}\n\n// Routing switch back to the top\nfunction createScrollGuard(router: Router) {\n  const isHash = (href: string) => {\n    return /^#/.test(href);\n  };\n\n  const body = document.body;\n\n  router.afterEach(async (to) => {\n    // scroll top\n    isHash((to as RouteLocationNormalized & { href: string })?.href) && body.scrollTo(0, 0);\n    return true;\n  });\n}\n\n/**\n * Used to close the message instance when the route is switched\n * @param router\n */\nexport function createMessageGuard(router: Router) {\n  const { closeMessageOnSwitch } = projectSetting;\n\n  router.beforeEach(async () => {\n    try {\n      if (closeMessageOnSwitch) {\n        Modal.destroyAll();\n        notification.destroy();\n      }\n    } catch (error) {\n      warn('message guard error:' + error);\n    }\n    return true;\n  });\n}\n\nexport function createProgressGuard(router: Router) {\n  const { getOpenNProgress } = useTransitionSetting();\n  router.beforeEach(async (to) => {\n    if (to.meta.loaded) {\n      return true;\n    }\n    unref(getOpenNProgress) && nProgress.start();\n    return true;\n  });\n\n  router.afterEach(async () => {\n    unref(getOpenNProgress) && nProgress.done();\n    return true;\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/guard/paramMenuGuard.ts",
    "content": "import type { Router } from 'vue-router';\nimport { configureDynamicParamsMenu } from '../helper/menuHelper';\nimport { Menu } from '../types';\nimport { PermissionModeEnum } from '/@/enums/appEnum';\nimport { useAppStoreWithOut } from '/@/store/modules/app';\n\nimport { usePermissionStoreWithOut } from '/@/store/modules/permission';\n\nexport function createParamMenuGuard(router: Router) {\n  const permissionStore = usePermissionStoreWithOut();\n  router.beforeEach(async (to, _, next) => {\n    // filter no name route\n    if (!to.name) {\n      next();\n      return;\n    }\n\n    // menu has been built.\n    if (!permissionStore.getIsDynamicAddedRoute) {\n      next();\n      return;\n    }\n\n    let menus: Menu[] = [];\n    if (isBackMode()) {\n      menus = permissionStore.getBackMenuList;\n    } else if (isRouteMappingMode()) {\n      menus = permissionStore.getFrontMenuList;\n    }\n    menus.forEach((item) => configureDynamicParamsMenu(item, to.params));\n\n    next();\n  });\n}\n\nconst getPermissionMode = () => {\n  const appStore = useAppStoreWithOut();\n  return appStore.getProjectConfig.permissionMode;\n};\n\nconst isBackMode = () => {\n  return getPermissionMode() === PermissionModeEnum.BACK;\n};\n\nconst isRouteMappingMode = () => {\n  return getPermissionMode() === PermissionModeEnum.ROUTE_MAPPING;\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/guard/permissionGuard.ts",
    "content": "import type { Router, RouteRecordRaw } from 'vue-router';\n\nimport { usePermissionStoreWithOut } from '/@/store/modules/permission';\n\nimport { PageEnum } from '/@/enums/pageEnum';\nimport { useUserStoreWithOut } from '/@/store/modules/user';\n\nimport { PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic';\n\nimport { RootRoute } from '/@/router/routes';\n\nimport {isOAuth2AppEnv, isOAuth2DingAppEnv} from '/@/views/sys/login/useLogin';\nimport { OAUTH2_THIRD_LOGIN_TENANT_ID } from \"/@/enums/cacheEnum\";\nimport { setAuthCache } from \"/@/utils/auth\";\nimport { PAGE_NOT_FOUND_NAME_404 } from '/@/router/constant';\n\nconst LOGIN_PATH = PageEnum.BASE_LOGIN;\n//auth2登录路由\nconst OAUTH2_LOGIN_PAGE_PATH = PageEnum.OAUTH2_LOGIN_PAGE_PATH;\n\n//分享免登录路由\nconst SYS_FILES_PATH = PageEnum.SYS_FILES_PATH;\n\n// 邮件中的跳转地址,对应此路由,携带token免登录直接去办理页面\nconst TOKEN_LOGIN = PageEnum.TOKEN_LOGIN;\n\nconst ROOT_PATH = RootRoute.path;\n\n// 代码逻辑说明: [VUEN-2472]分享免登录------------\nconst whitePathList: PageEnum[] = [LOGIN_PATH, OAUTH2_LOGIN_PAGE_PATH,SYS_FILES_PATH, TOKEN_LOGIN ];\n\nexport function createPermissionGuard(router: Router) {\n  const userStore = useUserStoreWithOut();\n  const permissionStore = usePermissionStoreWithOut();\n\n  // 自定义首页跳转次数\n  let homePathJumpCount = 0;\n\n  router.beforeEach(async (to, from, next) => {\n    if (\n      // 【#6861】跳转到自定义首页的逻辑，只跳转一次即可\n      homePathJumpCount < 1 &&\n      from.path === ROOT_PATH &&\n      to.path === PageEnum.BASE_HOME &&\n      userStore.getUserInfo.homePath &&\n      userStore.getUserInfo.homePath !== PageEnum.BASE_HOME\n    ) {\n      homePathJumpCount++;\n      next(userStore.getUserInfo.homePath);\n      return;\n    }\n\n    const token = userStore.getToken;\n\n    // Whitelist can be directly entered\n    if (whitePathList.includes(to.path as PageEnum)) {\n      if (to.path === LOGIN_PATH && token) {\n        const isSessionTimeout = userStore.getSessionTimeout;\n        \n        //TODO vben默认写法，暂时不知目的，有问题暂时先注释掉\n        //await userStore.afterLoginAction();\n        \n        try {\n          if (!isSessionTimeout) {\n            next((to.query?.redirect as string) || '/');\n            return;\n          }\n        } catch {}\n        // 代码逻辑说明: [issues/I5BG1I]vue3不支持auth2登录------------\n      } else if (to.path === LOGIN_PATH && isOAuth2AppEnv() && !token) {\n        //退出登录进入此逻辑\n        //如果进入的页面是login页面并且当前是OAuth2app环境，并且token为空，就进入OAuth2登录页面\n        // 代码逻辑说明: [QQYUN-3440]新建企业微信和钉钉配置表，通过租户模式隔离------------\n        if(to.query.tenantId){\n          setAuthCache(OAUTH2_THIRD_LOGIN_TENANT_ID,to.query.tenantId)\n        }\n        next({ path: OAUTH2_LOGIN_PAGE_PATH });\n        return;\n      }\n      next();\n      return;\n    }\n\n    // token does not exist\n    if (!token) {\n      // You can access without permission. You need to set the routing meta.ignoreAuth to true\n      if (to.meta.ignoreAuth) {\n        next();\n        return;\n      }\n\n      // 代码逻辑说明: [issues/I5BG1I]vue3 Auth2未实现------------\n      let path = LOGIN_PATH;\n      if (whitePathList.includes(to.path as PageEnum)) {\n        // 在免登录白名单，如果进入的页面是login页面并且当前是OAuth2app环境，就进入OAuth2登录页面\n        if (to.path === LOGIN_PATH && isOAuth2AppEnv()) {\n          next({ path: OAUTH2_LOGIN_PAGE_PATH });\n        } else {\n          //在免登录白名单，直接进入\n          next();\n        }\n      } else {\n        //----------【首次登陆并且是企业微信或者钉钉的情况下才会调用】-----------------------------------------------\n        //只有首次登陆并且是企业微信或者钉钉的情况下才会调用\n        let href = window.location.href;\n        //判断当前是auth2页面，并且是钉钉/企业微信，并且包含tenantId参数\n        if(isOAuth2AppEnv() && href.indexOf(\"/tenantId/\")!= -1){\n          let params = to.params;\n          if(params && params.path && params.path.length>0){\n            //直接获取参数最后一位\n            setAuthCache(OAUTH2_THIRD_LOGIN_TENANT_ID,params.path[params.path.length-1])\n          }\n        }\n        //---------【首次登陆并且是企业微信或者钉钉的情况下才会调用】------------------------------------------------\n        // 如果当前是在OAuth2APP环境，就跳转到OAuth2登录页面，否则跳转到登录页面\n        path = isOAuth2AppEnv() ? OAUTH2_LOGIN_PAGE_PATH : LOGIN_PATH;\n      }\n      // redirect login page\n      const redirectData: { path: string; replace: boolean; query?: Recordable<string> } = {\n        // 代码逻辑说明: [issues/I5BG1I]vue3 Auth2未实现------------\n        path: path,\n        replace: true,\n      };\n\n      // 代码逻辑说明: 【QQYUN-4713】登录代码调整逻辑有问题，改造待观察--\n      if (to.fullPath) {\n        console.log(\"to.fullPath 1\",to.fullPath)\n        console.log(\"to.path 2\",to.path)\n        \n        let getFullPath = to.fullPath;\n        if(getFullPath=='/' || getFullPath=='/500' || getFullPath=='/400' || getFullPath=='/login?redirect=/' || getFullPath=='/login?redirect=/login?redirect=/'){\n          return;\n        }\n        \n        redirectData.query = {\n          ...redirectData.query,\n          // 代码逻辑说明: 修复登录成功后，没有正确重定向的问题\n          redirect: to.fullPath,\n\n        };\n      }\n      next(redirectData);\n      return;\n    }\n\n    //==============================【首次登录并且是企业微信或者钉钉的情况下才会调用】==================\n    //判断是免登录页面,如果页面包含/tenantId/,那么就直接前往主页\n    if(isOAuth2AppEnv() && to.path.indexOf(\"/tenantId/\") != -1){\n      // 代码逻辑说明: 【TV360X-2958】钉钉登录后打开了敲敲云，换其他账号登录后，再打开敲敲云显示的是原来账号的应用---\n      if (isOAuth2DingAppEnv()) {\n        next(OAUTH2_LOGIN_PAGE_PATH);\n      } else {\n        next(userStore.getUserInfo.homePath || PageEnum.BASE_HOME);\n      }\n      return;\n    }\n    //==============================【首次登录并且是企业微信或者钉钉的情况下才会调用】==================\n    // Jump to the 404 page after processing the login\n    if (from.path === LOGIN_PATH && to.name === PAGE_NOT_FOUND_NAME_404 && to.fullPath !== (userStore.getUserInfo.homePath || PageEnum.BASE_HOME)) {\n      next(userStore.getUserInfo.homePath || PageEnum.BASE_HOME);\n      return;\n    }\n\n    // // get userinfo while last fetch time is empty\n    // if (userStore.getLastUpdateTime === 0) {\n    //   try {\n    //     console.log(\"--LastUpdateTime---getUserInfoAction-----\")\n    //     await userStore.getUserInfoAction();\n    //   } catch (err) {\n    //     console.info(err);\n    //     next();\n    //   }\n    // }\n    // 代码逻辑说明: 【QQYUN-8572】表格行选择卡顿问题（customRender中字典引起的）\n    if (userStore.getLastUpdateTime === 0) {\n      userStore.setAllDictItemsByLocal();\n    }\n    if (permissionStore.getIsDynamicAddedRoute) {\n      next();\n      return;\n    }\n\n    // 构建后台菜单路由\n    const routes = await permissionStore.buildRoutesAction();\n    routes.forEach((route) => {\n      router.addRoute(route as unknown as RouteRecordRaw);\n    });\n\n    router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw);\n    permissionStore.setDynamicAddedRoute(true);\n    // 代码逻辑说明: 【issues/7500】vue-router4.5.0版本路由name:PageNotFound同名导致登录进不去\n    if (to.name === PAGE_NOT_FOUND_NAME_404) {\n      // 动态添加路由后，此处应当重定向到fullPath，否则会加载404页面内容\n      next({ path: to.fullPath, replace: true, query: to.query });\n    } else {\n      const redirectPath = (from.query.redirect || to.path) as string;\n      const redirect = decodeURIComponent(redirectPath);\n      const nextData = to.path === redirect ? { ...to, replace: true } : { path: redirect };\n      next(nextData);\n    }\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/guard/stateGuard.ts",
    "content": "import type { Router } from 'vue-router';\nimport { useAppStore } from '/@/store/modules/app';\nimport { useMultipleTabStore } from '/@/store/modules/multipleTab';\nimport { useUserStore } from '/@/store/modules/user';\nimport { usePermissionStore } from '/@/store/modules/permission';\nimport { PageEnum } from '/@/enums/pageEnum';\nimport { removeTabChangeListener } from '/@/logics/mitt/routeChange';\n\nexport function createStateGuard(router: Router) {\n  router.afterEach((to) => {\n    // Just enter the login page and clear the authentication information\n    if (to.path === PageEnum.BASE_LOGIN) {\n      const tabStore = useMultipleTabStore();\n      const userStore = useUserStore();\n      const appStore = useAppStore();\n      const permissionStore = usePermissionStore();\n      appStore.resetAllState();\n      permissionStore.resetState();\n      tabStore.resetState();\n      userStore.resetState();\n      removeTabChangeListener();\n    }\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/helper/menuHelper.ts",
    "content": "import { AppRouteModule } from '/@/router/types';\nimport type { MenuModule, Menu, AppRouteRecordRaw } from '/@/router/types';\nimport { findPath, treeMap } from '/@/utils/helper/treeHelper';\nimport { cloneDeep } from 'lodash-es';\nimport { isUrl } from '/@/utils/is';\nimport { RouteParams } from 'vue-router';\nimport { toRaw } from 'vue';\n\nexport function getAllParentPath<T = Recordable>(treeData: T[], path: string) {\n  // 原代码\n  // const menuList = findPath(treeData, (n) => n.path === path) as Menu[];\n  // 先匹配不包含隐藏菜单的路径\n  let menuList = findMenuPath(treeData, path, false);\n  // 如果没有匹配到，再匹配包含隐藏菜单的路径\n  if(!(menuList?.length)) {\n    menuList = findMenuPath(treeData, path, true)\n  }\n  return (menuList || []).map((item) => item.path);\n}\n\n/**\n * 查找菜单路径\n *\n * @param treeData\n * @param path\n * @param matchHide 是否匹配隐藏菜单\n */\nfunction findMenuPath<T = Recordable>(treeData: T[], path: string, matchHide: boolean) {\n  return findPath(treeData, (n) => {\n    // 隐藏菜单不参与匹配\n    if(!matchHide && n.hideMenu) {\n      return false;\n    }\n    return n.path === path\n  }) as Menu[];\n}\n\n// 路径处理\nfunction joinParentPath(menus: Menu[], parentPath = '') {\n  for (let index = 0; index < menus.length; index++) {\n    const menu = menus[index];\n    // https://next.router.vuejs.org/guide/essentials/nested-routes.html\n    // Note that nested paths that start with / will be treated as a root path.\n    // 请注意，以 / 开头的嵌套路径将被视为根路径。\n    // This allows you to leverage the component nesting without having to use a nested URL.\n    // 这允许你利用组件嵌套，而无需使用嵌套 URL。\n    if (!(menu.path.startsWith('/') || isUrl(menu.path))) {\n      // path doesn't start with /, nor is it a url, join parent path\n      // 路径不以 / 开头，也不是 url，加入父路径\n      menu.path = `${parentPath}/${menu.path}`;\n    }\n    if (menu?.children?.length) {\n      joinParentPath(menu.children, menu.meta?.hidePathForChildren ? parentPath : menu.path);\n    }\n  }\n}\n\n// Parsing the menu module\nexport function transformMenuModule(menuModule: MenuModule): Menu {\n  const { menu } = menuModule;\n\n  const menuList = [menu];\n\n  joinParentPath(menuList);\n  return menuList[0];\n}\n\n// 将路由转换成菜单\nexport function transformRouteToMenu(routeModList: AppRouteModule[], routerMapping = false) {\n  // 借助 lodash 深拷贝\n  const cloneRouteModList = cloneDeep(routeModList);\n  const routeList: AppRouteRecordRaw[] = [];\n\n  // 对路由项进行修改\n  cloneRouteModList.forEach((item) => {\n    if (routerMapping && item.meta.hideChildrenInMenu && typeof item.redirect === 'string') {\n      item.path = item.redirect;\n    }\n\n    if (item.meta?.single) {\n      const realItem = item?.children?.[0];\n      realItem && routeList.push(realItem);\n    } else {\n      routeList.push(item);\n    }\n  });\n  // 提取树指定结构\n  const list = treeMap(routeList, {\n    conversion: (node: AppRouteRecordRaw) => {\n      const { meta: { title, hideMenu = false } = {} } = node;\n\n      return {\n        ...(node.meta || {}),\n        meta: node.meta,\n        name: title,\n        hideMenu,\n        alwaysShow:node.alwaysShow||false,\n        path: node.path,\n        originComponent: node.originComponent,\n        ...(node.redirect ? { redirect: node.redirect } : {}),\n      };\n    },\n  });\n  // 路径处理\n  joinParentPath(list);\n  return cloneDeep(list);\n}\n\n/**\n * config menu with given params\n */\nconst menuParamRegex = /(?::)([\\s\\S]+?)((?=\\/)|$)/g;\n\nexport function configureDynamicParamsMenu(menu: Menu, params: RouteParams) {\n  const { path, paramPath } = toRaw(menu);\n  let realPath = paramPath ? paramPath : path;\n  const matchArr = realPath.match(menuParamRegex);\n\n  matchArr?.forEach((it) => {\n    const realIt = it.substr(1);\n    if (params[realIt]) {\n      realPath = realPath.replace(`:${realIt}`, params[realIt] as string);\n    }\n  });\n  // save original param path.\n  if (!paramPath && matchArr && matchArr.length > 0) {\n    menu.paramPath = path;\n  }\n  menu.path = realPath;\n  // children\n  menu.children?.forEach((item) => configureDynamicParamsMenu(item, params));\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/helper/routeHelper.ts",
    "content": "import type { AppRouteModule, AppRouteRecordRaw } from '/@/router/types';\nimport type { Router, RouteRecordNormalized } from 'vue-router';\n\nimport { getParentLayout, LAYOUT, EXCEPTION_COMPONENT } from '/@/router/constant';\nimport { cloneDeep, omit } from 'lodash-es';\nimport { warn } from '/@/utils/log';\nimport { createRouter, createWebHashHistory } from 'vue-router';\nimport { getTenantId, getToken } from \"/@/utils/auth\";\nimport { URL_HASH_TAB, _eval } from '/@/utils';\n//引入online lib路由\nimport { packageViews } from '/@/utils/monorepo/dynamicRouter';\nimport { loadPackageComponent } from '/@/utils/monorepo/registerPackages';\nimport {useI18n} from \"/@/hooks/web/useI18n\";\n\nexport type LayoutMapKey = 'LAYOUT';\nconst IFRAME = () => import('/@/views/sys/iframe/FrameBlank.vue');\nconst LayoutContent = () => import('/@/layouts/default/content/index.vue');\n\nconst LayoutMap = new Map<string, () => Promise<typeof import('*.vue')>>();\n\nLayoutMap.set('LAYOUT', LAYOUT);\nLayoutMap.set('IFRAME', IFRAME);\n//微前端qiankun\nLayoutMap.set('LayoutsContent', LayoutContent);\n\nlet dynamicViewsModules: Record<string, () => Promise<Recordable>>;\n\n// Dynamic introduction\nfunction asyncImportRoute(routes: AppRouteRecordRaw[] | undefined) {\n  if (!dynamicViewsModules) {\n    dynamicViewsModules = import.meta.glob('../../views/**/*.{vue,tsx}');\n    //合并online lib路由\n    dynamicViewsModules = Object.assign({}, dynamicViewsModules, packageViews);\n  }\n  if (!routes) return;\n  routes.forEach((item) => {\n\n    //【jeecg-boot/issues/I5N2PN】左侧动态菜单怎么做国际化处理  2022-10-09\n    //菜单支持国际化翻译\n    if (item?.meta?.title) {\n      const { t } = useI18n();\n      if(item.meta.title.includes('t(\\'') && t){\n        // 代码逻辑说明: 【QQYUN-6390】eval替换成new Function，解决build警告\n        item.meta.title = new Function('t', `return ${item.meta.title}`)(t);\n      }\n    }\n    // @ts-ignore 适配隐藏路由\n    if (item?.hidden) {\n      item.meta.hideMenu = true;\n      //是否隐藏面包屑\n      item.meta.hideBreadcrumb = true;\n    }\n    // @ts-ignore 添加忽略路由配置\n    if (item?.route == 0) {\n      item.meta.ignoreRoute = true;\n    }\n    // @ts-ignore 添加是否缓存路由配置\n    item.meta.ignoreKeepAlive = !item?.meta.keepAlive;\n    let token = getToken();\n    let tenantId = getTenantId();\n    // URL支持{{ window.xxx }}占位符变量\n    // 代码逻辑说明: [VUEN-1638]菜单tenantId需要动态生成------------\n    item.component = (item.component || '').replace(/{{([^}}]+)?}}/g, (s1, s2) => _eval(s2)).replace('${token}', token).replace('${tenantId}', tenantId);\n    // 适配 iframe\n    if (/^\\/?http(s)?/.test(item.component as string)) {\n      item.component = item.component.substring(1, item.component.length);\n    }\n    if (/^http(s)?/.test(item.component as string)) {\n      if (item.meta?.internalOrExternal) {\n        // @ts-ignore 外部打开\n        item.path = item.component;\n        // 代码逻辑说明: 【VUEN-656】配置外部网址打不开，原因是带了#号，需要替换一下\n        item.path = item.path.replace('#', URL_HASH_TAB);\n      } else {\n        // @ts-ignore 内部打开\n        item.meta.frameSrc = item.component;\n      }\n      delete item.component;\n    }\n    if (!item.component && item.meta?.frameSrc) {\n      item.component = 'IFRAME';\n    }\n    let { component, name } = item;\n    const { children } = item;\n    if (component) {\n      const layoutFound = LayoutMap.get(component.toUpperCase());\n      if (layoutFound) {\n        item.component = layoutFound;\n      } else {\n        if (component.indexOf('dashboard/') > -1) {\n          //当数据标sys_permission中component没有拼接index时前端需要拼接\n          if (component.indexOf('/index') < 0) {\n            component = component + '/index';\n          }\n        }\n        item.component = dynamicImport(dynamicViewsModules, component as string);\n      }\n    } else if (name) {\n      item.component = getParentLayout();\n    }\n    children && asyncImportRoute(children);\n  });\n}\n\nfunction dynamicImport(dynamicViewsModules: Record<string, () => Promise<Recordable>>, component: string) {\n  const keys = Object.keys(dynamicViewsModules);\n  const matchKeys = keys.filter((key) => {\n    const k = key.replace('../../views', '');\n    const startFlag = component.startsWith('/');\n    const endFlag = component.endsWith('.vue') || component.endsWith('.tsx');\n    const startIndex = startFlag ? 0 : 1;\n    const lastIndex = endFlag ? k.length : k.lastIndexOf('.');\n    return k.substring(startIndex, lastIndex) === component;\n  });\n  if (matchKeys?.length === 1) {\n    const matchKey = matchKeys[0];\n    return dynamicViewsModules[matchKey];\n  } else if (matchKeys?.length > 1) {\n    warn(\n      'Please do not create `.vue` and `.TSX` files with the same file name in the same hierarchical directory under the views folder. This will cause dynamic introduction failure'\n    );\n    return;\n  }\n  // online/aiflow 本地未找到，尝试从懒加载包中按需加载\n  if (component.startsWith('/super/online') || component.startsWith('/super/airag')) {\n    return () => {\n      return loadPackageComponent(component).then((factory) => (factory ? factory() : Promise.reject(`组件 ${component} 未找到`)));\n    };\n  }\n}\n\n// Turn background objects into routing objects\nexport function transformObjToRoute<T = AppRouteModule>(routeList: AppRouteModule[]): T[] {\n  routeList.forEach((route) => {\n    const component = route.component as string;\n    if (component) {\n      route.originComponent = component;\n      if (component.toUpperCase() === 'LAYOUT') {\n        route.component = LayoutMap.get(component.toUpperCase());\n      } else {\n        route.children = [cloneDeep(route)];\n        route.component = LAYOUT;\n        route.name = `${route.name}Parent`;\n        route.path = '';\n        const meta = route.meta || {};\n        meta.single = true;\n        meta.affix = false;\n        route.meta = meta;\n      }\n    } else {\n      warn('请正确配置路由：' + route?.name + '的component属性');\n    }\n    route.children && asyncImportRoute(route.children);\n  });\n  return routeList as unknown as T[];\n}\n\n/**\n *  将多级路由转换为二级\n */\nexport function flatMultiLevelRoutes(routeModules: AppRouteModule[]) {\n  const modules: AppRouteModule[] = cloneDeep(routeModules);\n  for (let index = 0; index < modules.length; index++) {\n    const routeModule = modules[index];\n    if (!isMultipleRoute(routeModule)) {\n      continue;\n    }\n    promoteRouteLevel(routeModule);\n  }\n  return modules;\n}\n\n//提升路由级别\nfunction promoteRouteLevel(routeModule: AppRouteModule) {\n  // Use vue-router to splice menus\n  let router: Router | null = createRouter({\n    routes: [routeModule as unknown as RouteRecordNormalized],\n    history: createWebHashHistory(),\n  });\n\n  const routes = router.getRoutes();\n  addToChildren(routes, routeModule.children || [], routeModule);\n  router = null;\n\n  routeModule.children = routeModule.children?.map((item) => omit(item, 'children'));\n}\n\n// Add all sub-routes to the secondary route\nfunction addToChildren(routes: RouteRecordNormalized[], children: AppRouteRecordRaw[], routeModule: AppRouteModule) {\n  for (let index = 0; index < children.length; index++) {\n    const child = children[index];\n    const route = routes.find((item) => item.name === child.name);\n    if (!route) {\n      continue;\n    }\n    routeModule.children = routeModule.children || [];\n    if (!routeModule.children.find((item) => item.name === route.name)) {\n      routeModule.children?.push(route as unknown as AppRouteModule);\n    }\n    if (child.children?.length) {\n      addToChildren(routes, child.children, routeModule);\n    }\n  }\n}\n\n// Determine whether the level exceeds 2 levels\nfunction isMultipleRoute(routeModule: AppRouteModule) {\n  if (!routeModule || !Reflect.has(routeModule, 'children') || !routeModule.children?.length) {\n    return false;\n  }\n\n  const children = routeModule.children;\n\n  let flag = false;\n  for (let index = 0; index < children.length; index++) {\n    const child = children[index];\n    if (child.children?.length) {\n      flag = true;\n      break;\n    }\n  }\n  return flag;\n}\n/**\n * 组件地址前加斜杠处理\n * @updateBy:lsq\n * @updateDate:2021-09-08\n */\nexport function addSlashToRouteComponent(routeList: AppRouteRecordRaw[]) {\n  routeList.forEach((route) => {\n    let component = route.component as string;\n    if (component) {\n      const layoutFound = LayoutMap.get(component);\n      if (!layoutFound) {\n        route.component = component.startsWith('/') ? component : `/${component}`;\n      }\n    }\n    route.children && addSlashToRouteComponent(route.children);\n  });\n  return routeList as unknown as T[];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/index.ts",
    "content": "import type { RouteRecordRaw } from 'vue-router';\nimport type { App } from 'vue';\n\nimport { $electron } from \"@/electron\";\nimport { basicRoutes } from './routes';\nimport {createRouter as createVueRouter, destroyRouter, router} from './router'\n\n// 白名单应该包含基本静态路由\nconst WHITE_NAME_LIST: string[] = [];\nconst getRouteNames = (array: any[]) =>\n  array.forEach((item) => {\n    WHITE_NAME_LIST.push(item.name);\n    getRouteNames(item.children || []);\n  });\ngetRouteNames(basicRoutes);\n\n/**\n * 创建路由实例\n */\nexport function createRouter() {\n  let router = createVueRouter({\n      routes: basicRoutes as unknown as RouteRecordRaw[],\n      strict: true,\n      scrollBehavior: () => ({left: 0, top: 0}),\n    },\n    // 如果是 Electron 环境，则使用 hash 路由\n    $electron.isElectron(),\n  )\n\n  // TODO 【QQYUN-4517】【表单设计器】记录分享路由守卫测试\n  // @ts-ignore\n  router.beforeEach(async (to, from, next) => {\n    //console.group('【QQYUN-4517】beforeEach');\n    //console.warn('from', from);\n    //console.warn('to', to);\n    //console.groupEnd();\n    next();\n  });\n}\n\n// reset router\nexport function resetRouter() {\n  router.getRoutes().forEach((route) => {\n    const { name } = route;\n    if (name && !WHITE_NAME_LIST.includes(name as string)) {\n      router.hasRoute(name) && router.removeRoute(name);\n    }\n  });\n}\n\n// config router\nexport function setupRouter(app: App<Element>) {\n  app.use(router);\n}\n\nexport {\n  router,\n  destroyRouter,\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/menus/index.ts",
    "content": "import type { Menu, MenuModule } from '/@/router/types';\nimport type { RouteRecordNormalized } from 'vue-router';\n\nimport { useAppStoreWithOut } from '/@/store/modules/app';\nimport { usePermissionStore } from '/@/store/modules/permission';\nimport { transformMenuModule, getAllParentPath } from '/@/router/helper/menuHelper';\nimport { filter } from '/@/utils/helper/treeHelper';\nimport { isUrl } from '/@/utils/is';\nimport { router } from '/@/router';\nimport { PermissionModeEnum } from '/@/enums/appEnum';\nimport { pathToRegexp } from 'path-to-regexp';\n\nconst modules = import.meta.glob('./modules/**/*.ts', { eager: true });\n\nconst menuModules: MenuModule[] = [];\n\nObject.keys(modules).forEach((key) => {\n  const mod = (modules as Recordable)[key].default || {};\n  const modList = Array.isArray(mod) ? [...mod] : [mod];\n  menuModules.push(...modList);\n});\n\n// ===========================\n// ==========Helper===========\n// ===========================\n\nconst getPermissionMode = () => {\n  const appStore = useAppStoreWithOut();\n  return appStore.getProjectConfig.permissionMode;\n};\nconst isBackMode = () => {\n  return getPermissionMode() === PermissionModeEnum.BACK;\n};\n\nconst isRouteMappingMode = () => {\n  return getPermissionMode() === PermissionModeEnum.ROUTE_MAPPING;\n};\n\nconst isRoleMode = () => {\n  return getPermissionMode() === PermissionModeEnum.ROLE;\n};\n\nconst staticMenus: Menu[] = [];\n(() => {\n  menuModules.sort((a, b) => {\n    return (a.orderNo || 0) - (b.orderNo || 0);\n  });\n\n  for (const menu of menuModules) {\n    staticMenus.push(transformMenuModule(menu));\n  }\n})();\n\nasync function getAsyncMenus() {\n  const permissionStore = usePermissionStore();\n  if (isBackMode()) {\n    return permissionStore.getBackMenuList.filter((item) => !item.meta?.hideMenu && !item.hideMenu);\n  }\n  if (isRouteMappingMode()) {\n    return permissionStore.getFrontMenuList.filter((item) => !item.hideMenu);\n  }\n  return staticMenus;\n}\n\nexport const getMenus = async (): Promise<Menu[]> => {\n  const menus = await getAsyncMenus();\n  if (isRoleMode()) {\n    const routes = router.getRoutes();\n    return filter(menus, basicFilter(routes));\n  }\n  return menus;\n};\n\nexport async function getCurrentParentPath(currentPath: string) {\n  const menus = await getAsyncMenus();\n  const allParentPath = await getAllParentPath(menus, currentPath);\n  return allParentPath?.[0];\n}\n\n// Get the level 1 menu, delete children\nexport async function getShallowMenus(): Promise<Menu[]> {\n  const menus = await getAsyncMenus();\n  const shallowMenuList = menus.map((item) => ({ ...item, children: undefined }));\n  if (isRoleMode()) {\n    const routes = router.getRoutes();\n    return shallowMenuList.filter(basicFilter(routes));\n  }\n  return shallowMenuList;\n}\n\n// Get the children of the menu\nexport async function getChildrenMenus(parentPath: string) {\n  const menus = await getMenus();\n  const parent = menus.find((item) => item.path === parentPath);\n  if (!parent || !parent.children || !!parent?.meta?.hideChildrenInMenu) {\n    return [] as Menu[];\n  }\n  if (isRoleMode()) {\n    const routes = router.getRoutes();\n    return filter(parent.children, basicFilter(routes));\n  }\n  return parent.children;\n}\n\nfunction basicFilter(routes: RouteRecordNormalized[]) {\n  return (menu: Menu) => {\n    const matchRoute = routes.find((route) => {\n      if (isUrl(menu.path)) return true;\n\n      if (route.meta?.carryParam) {\n        return pathToRegexp(route.path).test(menu.path);\n      }\n      const isSame = route.path === menu.path;\n      if (!isSame) return false;\n\n      if (route.meta?.ignoreAuth) return true;\n\n      return isSame || pathToRegexp(route.path).test(menu.path);\n    });\n\n    if (!matchRoute) return false;\n    menu.icon = (menu.icon || matchRoute.meta.icon) as string;\n    menu.meta = matchRoute.meta;\n    return true;\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/router.ts",
    "content": "/*\n * 路由实例存储文件，请勿轻易添加其他代码，防止出现 HMR 或其他问题\n */\nimport type {Router, RouterHistory} from 'vue-router';\nimport {createRouter as createVueRouter, createWebHistory, createWebHashHistory, RouterOptions} from 'vue-router';\n\nexport let router: Router = null as unknown as Router;\n\nexport function setRouter(r: Router) {\n  router = r\n}\n\nlet webHistory: Nullable<RouterHistory> = null;\n\n/**\n * 创建路由\n * @param options 参数\n * @param useHashHistory 是否使用 hash 路由，true使用，false不使用hash路由\n */\nexport function createRouter(options: Partial<RouterOptions>, useHashHistory = false) {\n  const createFn = useHashHistory ? createWebHashHistory : createWebHistory;\n  webHistory = createFn(import.meta.env.VITE_PUBLIC_PATH);\n  // app router\n  let router = createVueRouter({\n    history: webHistory,\n    routes: [],\n    ...options,\n  });\n\n  setRouter(router)\n\n  return router\n}\n\n// 销毁路由\nexport function destroyRouter() {\n  setRouter(null as unknown as Router);\n  if (webHistory) {\n    webHistory.destroy();\n  }\n  webHistory = null\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/routes/basic.ts",
    "content": "import type { AppRouteRecordRaw } from '/@/router/types';\nimport { t } from '/@/hooks/web/useI18n';\nimport { REDIRECT_NAME, LAYOUT, EXCEPTION_COMPONENT, PAGE_NOT_FOUND_NAME, PAGE_NOT_FOUND_NAME_404 } from '/@/router/constant';\n\n// 404 on a page\nexport const PAGE_NOT_FOUND_ROUTE: AppRouteRecordRaw = {\n  path: '/:path(.*)*',\n \n  name: PAGE_NOT_FOUND_NAME,\n  component: LAYOUT,\n  meta: {\n    title: 'ErrorPage',\n    hideBreadcrumb: true,\n    hideMenu: true,\n  },\n  children: [\n    {\n      path: '/:path(.*)*',\n      // 代码逻辑说明: 【issues/7500】vue-router4.5.0版本路由name:PageNotFound同名导致登录进不去\n      name: PAGE_NOT_FOUND_NAME_404,\n      component: EXCEPTION_COMPONENT,\n      meta: {\n        title: 'ErrorPage',\n        hideBreadcrumb: true,\n        hideMenu: true,\n      },\n    },\n  ],\n};\n\nexport const REDIRECT_ROUTE: AppRouteRecordRaw = {\n  path: '/redirect',\n  component: LAYOUT,\n  name: 'RedirectTo',\n  meta: {\n    title: REDIRECT_NAME,\n    hideBreadcrumb: true,\n    hideMenu: true,\n  },\n  children: [\n    {\n      path: '/redirect/:path(.*)',\n      name: REDIRECT_NAME,\n      component: () => import('/@/views/sys/redirect/index.vue'),\n      meta: {\n        title: REDIRECT_NAME,\n        hideBreadcrumb: true,\n      },\n    },\n  ],\n};\n\nexport const ERROR_LOG_ROUTE: AppRouteRecordRaw = {\n  path: '/error-log',\n  name: 'ErrorLog',\n  component: LAYOUT,\n  redirect: '/error-log/list',\n  meta: {\n    title: 'ErrorLog',\n    hideBreadcrumb: true,\n    hideChildrenInMenu: true,\n  },\n  children: [\n    {\n      path: 'list',\n      name: 'ErrorLogList',\n      component: () => import('/@/views/sys/error-log/index.vue'),\n      meta: {\n        title: t('routes.basic.errorLogList'),\n        hideBreadcrumb: true,\n        currentActiveMenu: '/error-log',\n      },\n    },\n  ],\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/routes/index.ts",
    "content": "import type { AppRouteRecordRaw, AppRouteModule } from '/@/router/types';\n\nimport { PAGE_NOT_FOUND_ROUTE, REDIRECT_ROUTE } from '/@/router/routes/basic';\n\nimport { mainOutRoutes } from './mainOut';\nimport { PageEnum } from '/@/enums/pageEnum';\nimport { t } from '/@/hooks/web/useI18n';\nimport { LAYOUT } from '/@/router/constant';\n\nconst modules = import.meta.glob('./modules/**/*.ts', { eager: true });\n\nconst routeModuleList: AppRouteModule[] = [];\n\n// 加入到路由集合中\nObject.keys(modules).forEach((key) => {\n  const mod = (modules as Recordable)[key].default || {};\n  const modList = Array.isArray(mod) ? [...mod] : [mod];\n  routeModuleList.push(...modList);\n});\n\nexport const asyncRoutes = [PAGE_NOT_FOUND_ROUTE, ...routeModuleList];\n\nexport const RootRoute: AppRouteRecordRaw = {\n  path: '/',\n  name: 'Root',\n  redirect: PageEnum.BASE_HOME,\n  meta: {\n    title: 'Root',\n  },\n};\n\nexport const LoginRoute: AppRouteRecordRaw = {\n  path: '/login',\n  name: 'Login',\n  //新版后台登录，如果想要使用旧版登录放开即可\n  // component: () => import('/@/views/sys/login/Login.vue'),\n  component: () => import('/@/views/system/loginmini/MiniLogin.vue'),\n  meta: {\n    title: t('routes.basic.login'),\n  },\n};\n\n// 代码逻辑说明: auth2登录页面路由------------\nexport const Oauth2LoginRoute: AppRouteRecordRaw = {\n  path: '/oauth2-app/login',\n  name: 'oauth2-app-login',\n  //新版钉钉免登录，如果想要使用旧版放开即可\n  // component: () => import('/@/views/sys/login/OAuth2Login.vue'),\n  component: () => import('/@/views/system/loginmini/OAuth2Login.vue'),\n  meta: {\n    title: t('routes.oauth2.login'),\n  },\n};\n\n/**\n * 【通过token直接静默登录】流程办理登录页面 中转跳转\n */\nexport const TokenLoginRoute: AppRouteRecordRaw = {\n  path: '/tokenLogin',\n  name: 'TokenLoginRoute',\n  component: () => import('/@/views/sys/login/TokenLoginPage.vue'),\n  meta: {\n    title: '带token登录页面',\n    ignoreAuth: true,\n  },\n};\n// Basic routing without permission\nexport const basicRoutes = [LoginRoute, RootRoute, ...mainOutRoutes, REDIRECT_ROUTE, PAGE_NOT_FOUND_ROUTE, TokenLoginRoute, Oauth2LoginRoute];\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/routes/mainOut.ts",
    "content": "/**\nThe routing of this file will not show the layout.\nIt is an independent new page.\nthe contents of the file still need to log in to access\n */\nimport type { AppRouteModule } from '/@/router/types';\n\n// test\n// http:ip:port/main-out\nexport const mainOutRoutes: AppRouteModule[] = [\n  {\n    path: '/main-out',\n    name: 'MainOut',\n    component: () => import('/@/views/demo/main-out/index.vue'),\n    meta: {\n      title: 'MainOut',\n      ignoreAuth: true,\n    },\n  },\n];\n\nexport const mainOutRouteNames = mainOutRoutes.map((item) => item.name);\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/routes/modules/about.ts",
    "content": "import type { AppRouteModule } from '/@/router/types';\n\nimport { LAYOUT } from '/@/router/constant';\nimport { t } from '/@/hooks/web/useI18n';\n\nconst dashboard: AppRouteModule = {\n  path: '/about',\n  name: 'About',\n  component: LAYOUT,\n  redirect: '/about/index',\n  meta: {\n    hideChildrenInMenu: true,\n    icon: 'simple-icons:about-dot-me',\n    title: t('routes.dashboard.about'),\n    orderNo: 100000,\n  },\n  children: [\n    {\n      path: 'index',\n      name: 'AboutPage',\n      component: () => import('/@/views/sys/about/index.vue'),\n      meta: {\n        title: t('routes.dashboard.about'),\n        icon: 'simple-icons:about-dot-me',\n        hideMenu: true,\n      },\n    },\n  ],\n};\n\nexport default dashboard;\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/routes/modules/dashboard.ts",
    "content": "import type { AppRouteModule } from '/@/router/types';\nimport { PageEnum } from '/@/enums/pageEnum';\nimport { LAYOUT } from '/@/router/constant';\nimport { t } from '/@/hooks/web/useI18n';\n\nconst dashboard: AppRouteModule = {\n  path: '/dashboard',\n  name: 'Dashboard',\n  component: LAYOUT,\n  redirect: PageEnum.BASE_HOME,\n  meta: {\n    orderNo: 10,\n    icon: 'ion:grid-outline',\n    title: t('routes.dashboard.dashboard'),\n  },\n  children: [\n    {\n      path: 'analysis',\n      name: 'Analysis',\n      component: () => import('/@/views/dashboard/Analysis/index.vue'),\n      meta: {\n        // affix: true,\n        title: t('routes.dashboard.analysis'),\n      },\n    },\n    {\n      path: 'workbench',\n      name: 'Workbench',\n      component: () => import('/@/views/dashboard/workbench/index.vue'),\n      meta: {\n        title: t('routes.dashboard.workbench'),\n      },\n    },\n  ],\n};\n\nexport default dashboard;\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/routes/modules/demo/charts.ts",
    "content": "import type { AppRouteModule } from '/@/router/types';\n\nimport { getParentLayout, LAYOUT } from '/@/router/constant';\nimport { t } from '/@/hooks/web/useI18n';\n\nconst charts: AppRouteModule = {\n  path: '/charts',\n  name: 'Charts',\n  component: LAYOUT,\n  redirect: '/charts/echarts/map',\n  meta: {\n    orderNo: 500,\n    icon: 'ion:bar-chart-outline',\n    title: t('routes.demo.charts.charts'),\n  },\n  children: [\n    {\n      path: 'baiduMap',\n      name: 'BaiduMap',\n      meta: {\n        title: t('routes.demo.charts.baiduMap'),\n      },\n      component: () => import('/@/views/demo/charts/map/Baidu.vue'),\n    },\n    {\n      path: 'aMap',\n      name: 'AMap',\n      meta: {\n        title: t('routes.demo.charts.aMap'),\n      },\n      component: () => import('/@/views/demo/charts/map/Gaode.vue'),\n    },\n    {\n      path: 'googleMap',\n      name: 'GoogleMap',\n      meta: {\n        title: t('routes.demo.charts.googleMap'),\n      },\n      component: () => import('/@/views/demo/charts/map/Google.vue'),\n    },\n    {\n      path: 'echarts',\n      name: 'Echarts',\n      component: getParentLayout('Echarts'),\n      meta: {\n        title: 'Echarts',\n      },\n      redirect: '/charts/echarts/map',\n      children: [\n        {\n          path: 'map',\n          name: 'Map',\n          component: () => import('/@/views/demo/charts/Map.vue'),\n          meta: {\n            title: t('routes.demo.charts.map'),\n          },\n        },\n        {\n          path: 'line',\n          name: 'Line',\n          component: () => import('/@/views/demo/charts/Line.vue'),\n          meta: {\n            title: t('routes.demo.charts.line'),\n          },\n        },\n        {\n          path: 'pie',\n          name: 'Pie',\n          component: () => import('/@/views/demo/charts/Pie.vue'),\n          meta: {\n            title: t('routes.demo.charts.pie'),\n          },\n        },\n      ],\n    },\n  ],\n};\n\nexport default charts;\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/routes/modules/demo/comp.ts",
    "content": "import type { AppRouteModule } from '/@/router/types';\n\nimport { getParentLayout, LAYOUT } from '/@/router/constant';\nimport { t } from '/@/hooks/web/useI18n';\n\nconst comp: AppRouteModule = {\n  path: '/comp',\n  name: 'Comp',\n  component: LAYOUT,\n  redirect: '/comp/basic',\n  meta: {\n    orderNo: 30,\n    icon: 'ion:layers-outline',\n    title: t('routes.demo.comp.comp'),\n  },\n\n  children: [\n    {\n      path: 'jeecg',\n      name: 'JeecgDemo',\n      redirect: '/comp/jeecg/basic',\n      component: getParentLayout('JeecgDemo'),\n      meta: {\n        title: t('routes.demo.comp.jeecg'),\n      },\n      children: [\n        {\n          path: 'basic',\n          name: 'JAreaLinkage',\n          component: () => import('/@/views/demo/jeecg/JeecgComponents.vue'),\n          meta: {\n            title: t('routes.demo.jeecg.JAreaLinkage'),\n          },\n        },\n        {\n          path: 'oneToMore',\n          name: 'oneToMoreDemo',\n          component: () => import('/@/views/demo/vextable/index.vue'),\n          meta: {\n            title: t('routes.demo.comp.oneToMore'),\n          },\n        },\n      ],\n    },\n    {\n      path: 'basic',\n      name: 'BasicDemo',\n      component: getParentLayout('BasicDemo'),\n      meta: {\n        title: t('routes.demo.comp.basic'),\n      },\n      children: [\n        {\n          path: 'button',\n          name: 'ButtonDemo',\n          component: () => import('/@/views/demo/comp/button/index.vue'),\n          meta: {\n            title: t('routes.demo.basic.button'),\n          },\n        },\n        {\n          path: 'icon',\n          name: 'IconDemo',\n          component: () => import('/@/views/demo/feat/icon/index.vue'),\n          meta: {\n            title: t('routes.demo.feat.icon'),\n          },\n        },\n        {\n          path: 'msg',\n          name: 'MsgDemo',\n          component: () => import('/@/views/demo/feat/msg/index.vue'),\n          meta: {\n            title: t('routes.demo.feat.msg'),\n          },\n        },\n        {\n          path: 'tabs',\n          name: 'TabsDemo',\n          component: () => import('/@/views/demo/feat/tabs/index.vue'),\n          meta: {\n            title: t('routes.demo.feat.tabs'),\n            hideChildrenInMenu: true,\n          },\n          children: [\n            {\n              path: 'detail/:id',\n              name: 'TabDetail',\n              component: () => import('/@/views/demo/feat/tabs/TabDetail.vue'),\n              meta: {\n                currentActiveMenu: '/comp/basic/tabs',\n                title: t('routes.demo.feat.tabDetail'),\n                hideMenu: true,\n                dynamicLevel: 3,\n                realPath: '/comp/basic/tabs/detail',\n              },\n            },\n          ],\n        },\n      ],\n    },\n\n    {\n      path: 'form',\n      name: 'FormDemo',\n      redirect: '/comp/form/basic',\n      component: getParentLayout('FormDemo'),\n      meta: {\n        // icon: 'mdi:form-select',\n        title: t('routes.demo.form.form'),\n      },\n      children: [\n        {\n          path: 'basic',\n          name: 'FormBasicDemo',\n          component: () => import('/@/views/demo/form/index.vue'),\n          meta: {\n            title: t('routes.demo.form.basic'),\n          },\n        },\n        {\n          path: 'useForm',\n          name: 'UseFormDemo',\n          component: () => import('/@/views/demo/form/UseForm.vue'),\n          meta: {\n            title: t('routes.demo.form.useForm'),\n          },\n        },\n        {\n          path: 'refForm',\n          name: 'RefFormDemo',\n          component: () => import('/@/views/demo/form/RefForm.vue'),\n          meta: {\n            title: t('routes.demo.form.refForm'),\n          },\n        },\n        {\n          path: 'advancedForm',\n          name: 'AdvancedFormDemo',\n          component: () => import('/@/views/demo/form/AdvancedForm.vue'),\n          meta: {\n            title: t('routes.demo.form.advancedForm'),\n          },\n        },\n        {\n          path: 'ruleForm',\n          name: 'RuleFormDemo',\n          component: () => import('/@/views/demo/form/RuleForm.vue'),\n          meta: {\n            title: t('routes.demo.form.ruleForm'),\n          },\n        },\n        {\n          path: 'dynamicForm',\n          name: 'DynamicFormDemo',\n          component: () => import('/@/views/demo/form/DynamicForm.vue'),\n          meta: {\n            title: t('routes.demo.form.dynamicForm'),\n          },\n        },\n        {\n          path: 'customerForm',\n          name: 'CustomerFormDemo',\n          component: () => import('/@/views/demo/form/CustomerForm.vue'),\n          meta: {\n            title: t('routes.demo.form.customerForm'),\n          },\n        },\n        {\n          path: 'appendForm',\n          name: 'appendFormDemo',\n          component: () => import('/@/views/demo/form/AppendForm.vue'),\n          meta: {\n            title: t('routes.demo.form.appendForm'),\n          },\n        },\n      ],\n    },\n    {\n      path: 'table',\n      name: 'TableDemo',\n      redirect: '/comp/table/basic',\n      component: getParentLayout('TableDemo'),\n      meta: {\n        // icon: 'carbon:table-split',\n        title: t('routes.demo.table.table'),\n      },\n\n      children: [\n        {\n          path: 'basic',\n          name: 'TableBasicDemo',\n          component: () => import('/@/views/demo/table/Basic.vue'),\n          meta: {\n            title: t('routes.demo.table.basic'),\n          },\n        },\n        {\n          path: 'treeTable',\n          name: 'TreeTableDemo',\n          component: () => import('/@/views/demo/table/TreeTable.vue'),\n          meta: {\n            title: t('routes.demo.table.treeTable'),\n          },\n        },\n        {\n          path: 'fetchTable',\n          name: 'FetchTableDemo',\n          component: () => import('/@/views/demo/table/FetchTable.vue'),\n          meta: {\n            title: t('routes.demo.table.fetchTable'),\n          },\n        },\n        {\n          path: 'fixedColumn',\n          name: 'FixedColumnDemo',\n          component: () => import('/@/views/demo/table/FixedColumn.vue'),\n          meta: {\n            title: t('routes.demo.table.fixedColumn'),\n          },\n        },\n        {\n          path: 'customerCell',\n          name: 'CustomerCellDemo',\n          component: () => import('/@/views/demo/table/CustomerCell.vue'),\n          meta: {\n            title: t('routes.demo.table.customerCell'),\n          },\n        },\n        {\n          path: 'formTable',\n          name: 'FormTableDemo',\n          component: () => import('/@/views/demo/table/FormTable.vue'),\n          meta: {\n            title: t('routes.demo.table.formTable'),\n          },\n        },\n        {\n          path: 'useTable',\n          name: 'UseTableDemo',\n          component: () => import('/@/views/demo/table/UseTable.vue'),\n          meta: {\n            title: t('routes.demo.table.useTable'),\n          },\n        },\n        {\n          path: 'refTable',\n          name: 'RefTableDemo',\n          component: () => import('/@/views/demo/table/RefTable.vue'),\n          meta: {\n            title: t('routes.demo.table.refTable'),\n          },\n        },\n        {\n          path: 'multipleHeader',\n          name: 'MultipleHeaderDemo',\n          component: () => import('/@/views/demo/table/MultipleHeader.vue'),\n          meta: {\n            title: t('routes.demo.table.multipleHeader'),\n          },\n        },\n        {\n          path: 'mergeHeader',\n          name: 'MergeHeaderDemo',\n          component: () => import('/@/views/demo/table/MergeHeader.vue'),\n          meta: {\n            title: t('routes.demo.table.mergeHeader'),\n          },\n        },\n        {\n          path: 'nestedTable',\n          name: 'nestedTableDemo',\n          component: () => import('/@/views/demo/table/NestedTable.vue'),\n          meta: {\n            title: t('routes.demo.table.nestedTable'),\n          },\n        },\n        {\n          path: 'expandTable',\n          name: 'ExpandTableDemo',\n          component: () => import('/@/views/demo/table/ExpandTable.vue'),\n          meta: {\n            title: t('routes.demo.table.expandTable'),\n          },\n        },\n        {\n          path: 'fixedHeight',\n          name: 'FixedHeightDemo',\n          component: () => import('/@/views/demo/table/FixedHeight.vue'),\n          meta: {\n            title: t('routes.demo.table.fixedHeight'),\n          },\n        },\n        {\n          path: 'footerTable',\n          name: 'FooterTableDemo',\n          component: () => import('/@/views/demo/table/FooterTable.vue'),\n          meta: {\n            title: t('routes.demo.table.footerTable'),\n          },\n        },\n        {\n          path: 'editCellTable',\n          name: 'EditCellTableDemo',\n          component: () => import('/@/views/demo/table/EditCellTable.vue'),\n          meta: {\n            title: t('routes.demo.table.editCellTable'),\n          },\n        },\n        {\n          path: 'editRowTable',\n          name: 'EditRowTableDemo',\n          component: () => import('/@/views/demo/table/EditRowTable.vue'),\n          meta: {\n            title: t('routes.demo.table.editRowTable'),\n          },\n        },\n        {\n          path: 'authColumn',\n          name: 'AuthColumnDemo',\n          component: () => import('/@/views/demo/table/AuthColumn.vue'),\n          meta: {\n            title: t('routes.demo.table.authColumn'),\n          },\n        },\n      ],\n    },\n    {\n      path: 'modal',\n      name: 'ModalDemo',\n      redirect: '/comp/modal/basic',\n      component: getParentLayout('ModalDemo'),\n      meta: {\n        title: t('routes.demo.comp.modal'),\n      },\n      children: [\n        {\n          path: 'basic',\n          name: 'ModalBasicDemo',\n          component: () => import('/@/views/demo/comp/modal/index.vue'),\n          meta: {\n            title: t('routes.demo.comp.modal.basic'),\n          },\n        },\n        {\n          path: 'drawer',\n          name: 'DrawerDemo',\n          component: () => import('/@/views/demo/comp/drawer/index.vue'),\n          meta: {\n            title: t('routes.demo.comp.modal.drawer'),\n          },\n        },\n      ],\n    },\n\n    {\n      path: 'third',\n      name: 'ThirdDemo',\n      redirect: '/comp/third/basic',\n      component: getParentLayout('ModalDemo'),\n      meta: {\n        title: t('routes.demo.comp.third'),\n      },\n      children: [\n        {\n          path: 'basic',\n          name: 'CropperDemo',\n          component: () => import('/@/views/demo/comp/cropper/index.vue'),\n          meta: {\n            title: t('routes.demo.comp.cropperImage'),\n          },\n        },\n        {\n          path: 'qrcode',\n          name: 'QrCodeDemo',\n          component: () => import('/@/views/demo/comp/qrcode/index.vue'),\n          meta: {\n            title: t('routes.demo.comp.qrcode'),\n          },\n        },\n        {\n          path: 'strength-meter',\n          name: 'StrengthMeterDemo',\n          component: () => import('/@/views/demo/comp/strength-meter/index.vue'),\n          meta: {\n            title: t('routes.demo.comp.strength'),\n          },\n        },\n        {\n          path: 'upload',\n          name: 'UploadDemo',\n          component: () => import('/@/views/demo/comp/upload/index.vue'),\n          meta: {\n            title: t('routes.demo.comp.upload'),\n          },\n        },\n        {\n          path: 'loading',\n          name: 'LoadingDemo',\n          component: () => import('/@/views/demo/comp/loading/index.vue'),\n          meta: {\n            title: t('routes.demo.comp.loading'),\n          },\n        },\n        {\n          path: 'timestamp',\n          name: 'TimeDemo',\n          component: () => import('/@/views/demo/comp/time/index.vue'),\n          meta: {\n            title: t('routes.demo.comp.time'),\n          },\n        },\n        {\n          path: 'countTo',\n          name: 'CountTo',\n          component: () => import('/@/views/demo/comp/count-to/index.vue'),\n          meta: {\n            title: t('routes.demo.comp.countTo'),\n          },\n        },\n        {\n          path: 'transition',\n          name: 'transitionDemo',\n          component: () => import('/@/views/demo/comp/transition/index.vue'),\n          meta: {\n            title: t('routes.demo.comp.transition'),\n          },\n        },\n        {\n          path: 'print',\n          name: 'Print',\n          component: () => import('/@/views/demo/feat/print/index.vue'),\n          meta: {\n            title: t('routes.demo.feat.print'),\n          },\n        },\n        {\n          path: 'img-preview',\n          name: 'ImgPreview',\n          component: () => import('/@/views/demo/feat/img-preview/index.vue'),\n          meta: {\n            title: t('routes.demo.feat.imgPreview'),\n          },\n        },\n        {\n          path: 'download',\n          name: 'DownLoadDemo',\n          component: () => import('/@/views/demo/feat/download/index.vue'),\n          meta: {\n            title: t('routes.demo.feat.download'),\n          },\n        },\n        {\n          path: 'click-out-side',\n          name: 'ClickOutSideDemo',\n          component: () => import('/@/views/demo/feat/click-out-side/index.vue'),\n          meta: {\n            title: t('routes.demo.feat.clickOutSide'),\n          },\n        },\n        {\n          path: 'copy',\n          name: 'CopyDemo',\n          component: () => import('/@/views/demo/feat/copy/index.vue'),\n          meta: {\n            title: t('routes.demo.feat.copy'),\n          },\n        },\n        {\n          path: 'ripple',\n          name: 'RippleDemo',\n          component: () => import('/@/views/demo/feat/ripple/index.vue'),\n          meta: {\n            title: t('routes.demo.feat.ripple'),\n          },\n        },\n      ],\n    },\n    {\n      path: 'tree',\n      name: 'TreeDemo',\n      redirect: '/comp/tree/basic',\n      component: getParentLayout('TreeDemo'),\n      meta: {\n        // icon: 'clarity:tree-view-line',\n        title: t('routes.demo.comp.tree'),\n      },\n      children: [\n        {\n          path: 'basic',\n          name: 'BasicTreeDemo',\n          component: () => import('/@/views/demo/tree/index.vue'),\n          meta: {\n            title: t('routes.demo.comp.treeBasic'),\n          },\n        },\n        {\n          path: 'editTree',\n          name: 'EditTreeDemo',\n          component: () => import('/@/views/demo/tree/EditTree.vue'),\n          meta: {\n            title: t('routes.demo.comp.editTree'),\n          },\n        },\n        {\n          path: 'actionTree',\n          name: 'ActionTreeDemo',\n          component: () => import('/@/views/demo/tree/ActionTree.vue'),\n          meta: {\n            title: t('routes.demo.comp.actionTree'),\n          },\n        },\n      ],\n    },\n    {\n      path: 'editor',\n      name: 'EditorDemo',\n      redirect: '/comp/editor/markdown',\n      component: getParentLayout('EditorDemo'),\n      meta: {\n        // icon: 'carbon:table-split',\n        title: t('routes.demo.editor.editor'),\n      },\n      children: [\n        {\n          path: 'json',\n          component: () => import('/@/views/demo/editor/json/index.vue'),\n          name: 'JsonEditorDemo',\n          meta: {\n            title: t('routes.demo.editor.jsonEditor'),\n          },\n        },\n        {\n          path: 'markdown',\n          component: getParentLayout('MarkdownDemo'),\n          name: 'MarkdownDemo',\n          meta: {\n            title: t('routes.demo.editor.markdown'),\n          },\n          redirect: '/comp/editor/markdown/index',\n          children: [\n            {\n              path: 'index',\n              name: 'MarkDownBasicDemo',\n              component: () => import('/@/views/demo/editor/markdown/index.vue'),\n              meta: {\n                title: t('routes.demo.editor.tinymceBasic'),\n              },\n            },\n            {\n              path: 'editor',\n              name: 'MarkDownFormDemo',\n              component: () => import('/@/views/demo/editor/markdown/Editor.vue'),\n              meta: {\n                title: t('routes.demo.editor.tinymceForm'),\n              },\n            },\n          ],\n        },\n\n        {\n          path: 'tinymce',\n          component: getParentLayout('TinymceDemo'),\n          name: 'TinymceDemo',\n          meta: {\n            title: t('routes.demo.editor.tinymce'),\n          },\n          redirect: '/comp/editor/tinymce/index',\n          children: [\n            {\n              path: 'index',\n              name: 'TinymceBasicDemo',\n              component: () => import('/@/views/demo/editor/tinymce/index.vue'),\n              meta: {\n                title: t('routes.demo.editor.tinymceBasic'),\n              },\n            },\n            {\n              path: 'editor',\n              name: 'TinymceFormDemo',\n              component: () => import('/@/views/demo/editor/tinymce/Editor.vue'),\n              meta: {\n                title: t('routes.demo.editor.tinymceForm'),\n              },\n            },\n          ],\n        },\n      ],\n    },\n    {\n      path: 'scroll',\n      name: 'ScrollDemo',\n      redirect: '/comp/scroll/basic',\n      component: getParentLayout('ScrollDemo'),\n      meta: {\n        title: t('routes.demo.comp.scroll'),\n      },\n      children: [\n        {\n          path: 'basic',\n          name: 'BasicScrollDemo',\n          component: () => import('/@/views/demo/comp/scroll/index.vue'),\n          meta: {\n            title: t('routes.demo.comp.scrollBasic'),\n          },\n        },\n        {\n          path: 'action',\n          name: 'ActionScrollDemo',\n          component: () => import('/@/views/demo/comp/scroll/Action.vue'),\n          meta: {\n            title: t('routes.demo.comp.scrollAction'),\n          },\n        },\n        {\n          path: 'virtualScroll',\n          name: 'VirtualScrollDemo',\n          component: () => import('/@/views/demo/comp/scroll/VirtualScroll.vue'),\n          meta: {\n            title: t('routes.demo.comp.virtualScroll'),\n          },\n        },\n      ],\n    },\n\n    {\n      path: 'desc',\n      name: 'DescDemo',\n      component: () => import('/@/views/demo/comp/desc/index.vue'),\n      meta: {\n        title: t('routes.demo.comp.desc'),\n      },\n    },\n\n    {\n      path: 'lazy',\n      name: 'LazyDemo',\n      component: getParentLayout('LazyDemo'),\n      redirect: '/comp/lazy/basic',\n      meta: {\n        title: t('routes.demo.comp.lazy'),\n      },\n      children: [\n        {\n          path: 'basic',\n          name: 'BasicLazyDemo',\n          component: () => import('/@/views/demo/comp/lazy/index.vue'),\n          meta: {\n            title: t('routes.demo.comp.lazyBasic'),\n          },\n        },\n        {\n          path: 'transition',\n          name: 'BasicTransitionDemo',\n          component: () => import('/@/views/demo/comp/lazy/Transition.vue'),\n          meta: {\n            title: t('routes.demo.comp.lazyTransition'),\n          },\n        },\n      ],\n    },\n    {\n      path: 'verify',\n      name: 'VerifyDemo',\n      component: getParentLayout('VerifyDemo'),\n      redirect: '/comp/verify/drag',\n      meta: {\n        title: t('routes.demo.comp.verify'),\n      },\n      children: [\n        {\n          path: 'drag',\n          name: 'VerifyDragDemo',\n          component: () => import('/@/views/demo/comp/verify/index.vue'),\n          meta: {\n            title: t('routes.demo.comp.verifyDrag'),\n          },\n        },\n        {\n          path: 'rotate',\n          name: 'VerifyRotateDemo',\n          component: () => import('/@/views/demo/comp/verify/Rotate.vue'),\n          meta: {\n            title: t('routes.demo.comp.verifyRotate'),\n          },\n        },\n      ],\n    },\n  ],\n};\n\nexport default comp;\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/routes/modules/demo/feat.ts",
    "content": "import type { AppRouteModule } from '/@/router/types';\n\nimport { getParentLayout, LAYOUT } from '/@/router/constant';\nimport { t } from '/@/hooks/web/useI18n';\n\nconst feat: AppRouteModule = {\n  path: '/feat',\n  name: 'FeatDemo',\n  component: LAYOUT,\n  redirect: '/feat/icon',\n  meta: {\n    orderNo: 19,\n    icon: 'ion:git-compare-outline',\n    title: t('routes.demo.feat.feat'),\n  },\n\n  children: [\n    {\n      path: 'ws',\n      name: 'WebSocket',\n      component: () => import('/@/views/demo/feat/ws/index.vue'),\n      meta: {\n        title: t('routes.demo.feat.ws'),\n      },\n    },\n    {\n      path: 'session-timeout',\n      name: 'SessionTimeout',\n      component: () => import('/@/views/demo/feat/session-timeout/index.vue'),\n      meta: {\n        title: t('routes.demo.feat.sessionTimeout'),\n      },\n    },\n\n    {\n      path: 'breadcrumb',\n      name: 'BreadcrumbDemo',\n      redirect: '/feat/breadcrumb/flat',\n      component: getParentLayout('BreadcrumbDemo'),\n      meta: {\n        title: t('routes.demo.feat.breadcrumb'),\n      },\n\n      children: [\n        {\n          path: 'flat',\n          name: 'BreadcrumbFlatDemo',\n          component: () => import('/@/views/demo/feat/breadcrumb/FlatList.vue'),\n          meta: {\n            title: t('routes.demo.feat.breadcrumbFlat'),\n          },\n        },\n        {\n          path: 'flatDetail',\n          name: 'BreadcrumbFlatDetailDemo',\n          component: () => import('/@/views/demo/feat/breadcrumb/FlatListDetail.vue'),\n          meta: {\n            title: t('routes.demo.feat.breadcrumbFlatDetail'),\n            hideMenu: true,\n            hideTab: true,\n            currentActiveMenu: '/feat/breadcrumb/flat',\n          },\n        },\n        {\n          path: 'children',\n          name: 'BreadcrumbChildrenDemo',\n          component: () => import('/@/views/demo/feat/breadcrumb/ChildrenList.vue'),\n          meta: {\n            title: t('routes.demo.feat.breadcrumbChildren'),\n          },\n          children: [\n            {\n              path: 'childrenDetail',\n              name: 'BreadcrumbChildrenDetailDemo',\n              component: () => import('/@/views/demo/feat/breadcrumb/ChildrenListDetail.vue'),\n              meta: {\n                currentActiveMenu: '/feat/breadcrumb/children',\n                title: t('routes.demo.feat.breadcrumbChildrenDetail'),\n                //hideTab: true,\n                // hideMenu: true,\n              },\n            },\n          ],\n        },\n      ],\n    },\n\n    {\n      path: 'context-menu',\n      name: 'ContextMenuDemo',\n      component: () => import('/@/views/demo/feat/context-menu/index.vue'),\n      meta: {\n        title: t('routes.demo.feat.contextMenu'),\n      },\n    },\n\n    {\n      path: 'copy',\n      name: 'CopyDemo',\n      component: () => import('/@/views/demo/feat/copy/index.vue'),\n      meta: {\n        title: t('routes.demo.feat.copy'),\n      },\n    },\n\n    {\n      path: 'watermark',\n      name: 'WatermarkDemo',\n      component: () => import('/@/views/demo/feat/watermark/index.vue'),\n      meta: {\n        title: t('routes.demo.feat.watermark'),\n      },\n    },\n\n    {\n      path: 'full-screen',\n      name: 'FullScreenDemo',\n      component: () => import('/@/views/demo/feat/full-screen/index.vue'),\n      meta: {\n        title: t('routes.demo.feat.fullScreen'),\n      },\n    },\n\n    {\n      path: '/error-log',\n      name: 'ErrorLog',\n      component: () => import('/@/views/sys/error-log/index.vue'),\n      meta: {\n        title: t('routes.demo.feat.errorLog'),\n      },\n    },\n    {\n      path: 'testTab/:id',\n      name: 'TestTab',\n      component: () => import('/@/views/demo/feat/tab-params/index.vue'),\n      meta: {\n        title: t('routes.demo.feat.tab'),\n        carryParam: true,\n        hidePathForChildren: true,\n      },\n      children: [\n        {\n          path: 'testTab/id1',\n          name: 'TestTab1',\n          component: () => import('/@/views/demo/feat/tab-params/index.vue'),\n          meta: {\n            title: t('routes.demo.feat.tab1'),\n            carryParam: true,\n            ignoreRoute: true,\n          },\n        },\n        {\n          path: 'testTab/id2',\n          name: 'TestTab2',\n          component: () => import('/@/views/demo/feat/tab-params/index.vue'),\n          meta: {\n            title: t('routes.demo.feat.tab2'),\n            carryParam: true,\n            ignoreRoute: true,\n          },\n        },\n      ],\n    },\n    {\n      path: 'testParam/:id',\n      name: 'TestParam',\n      component: getParentLayout('TestParam'),\n      meta: {\n        title: t('routes.demo.feat.menu'),\n        ignoreKeepAlive: true,\n      },\n      children: [\n        {\n          path: 'sub1',\n          name: 'TestParam_1',\n          component: () => import('/@/views/demo/feat/menu-params/index.vue'),\n          meta: {\n            title: t('routes.demo.feat.menu1'),\n            ignoreKeepAlive: true,\n          },\n        },\n        {\n          path: 'sub2',\n          name: 'TestParam_2',\n          component: () => import('/@/views/demo/feat/menu-params/index.vue'),\n          meta: {\n            title: t('routes.demo.feat.menu2'),\n            ignoreKeepAlive: true,\n          },\n        },\n      ],\n    },\n  ],\n};\n\nexport default feat;\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/routes/modules/demo/iframe.ts",
    "content": "import type { AppRouteModule } from '/@/router/types';\n\nimport { LAYOUT } from '/@/router/constant';\nconst IFrame = () => import('/@/views/sys/iframe/FrameBlank.vue');\nimport { t } from '/@/hooks/web/useI18n';\n\nconst iframe: AppRouteModule = {\n  path: '/frame',\n  name: 'Frame',\n  component: LAYOUT,\n  redirect: '/frame/doc',\n  meta: {\n    orderNo: 1000,\n    icon: 'ion:tv-outline',\n    title: t('routes.demo.iframe.frame'),\n  },\n\n  children: [\n    {\n      path: 'doc',\n      name: 'Doc',\n      component: IFrame,\n      meta: {\n        frameSrc: 'https://vvbin.cn/doc-next/',\n        title: t('routes.demo.iframe.doc'),\n      },\n    },\n    {\n      path: 'antv',\n      name: 'Antv',\n      component: IFrame,\n      meta: {\n        frameSrc: 'https://2x.antdv.com/docs/vue/introduce-cn/',\n        title: t('routes.demo.iframe.antv'),\n      },\n    },\n    {\n      path: 'https://vvbin.cn/doc-next/',\n      name: 'DocExternal',\n      component: IFrame,\n      meta: {\n        title: t('routes.demo.iframe.docExternal'),\n      },\n    },\n  ],\n};\n\nexport default iframe;\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/routes/modules/demo/level.ts",
    "content": "import type { AppRouteModule } from '/@/router/types';\n\nimport { getParentLayout, LAYOUT } from '/@/router/constant';\nimport { t } from '/@/hooks/web/useI18n';\n\nconst permission: AppRouteModule = {\n  path: '/level',\n  name: 'Level',\n  component: LAYOUT,\n  redirect: '/level/menu1/menu1-1/menu1-1-1',\n  meta: {\n    orderNo: 2000,\n    icon: 'ion:menu-outline',\n    title: t('routes.demo.level.level'),\n  },\n\n  children: [\n    {\n      path: 'menu1',\n      name: 'Menu1Demo',\n      component: getParentLayout('Menu1Demo'),\n      meta: {\n        title: 'Menu1',\n      },\n      redirect: '/level/menu1/menu1-1/menu1-1-1',\n      children: [\n        {\n          path: 'menu1-1',\n          name: 'Menu11Demo',\n          component: getParentLayout('Menu11Demo'),\n          meta: {\n            title: 'Menu1-1',\n          },\n          redirect: '/level/menu1/menu1-1/menu1-1-1',\n          children: [\n            {\n              path: 'menu1-1-1',\n              name: 'Menu111Demo',\n              component: () => import('/@/views/demo/level/Menu111.vue'),\n              meta: {\n                title: 'Menu111',\n              },\n            },\n          ],\n        },\n        {\n          path: 'menu1-2',\n          name: 'Menu12Demo',\n          component: () => import('/@/views/demo/level/Menu12.vue'),\n          meta: {\n            title: 'Menu1-2',\n          },\n        },\n      ],\n    },\n    {\n      path: 'menu2',\n      name: 'Menu2Demo',\n      component: () => import('/@/views/demo/level/Menu2.vue'),\n      meta: {\n        title: 'Menu2',\n        // ignoreKeepAlive: true,\n      },\n    },\n  ],\n};\n\nexport default permission;\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/routes/modules/demo/page.ts",
    "content": "import type { AppRouteModule } from '/@/router/types';\n\nimport { getParentLayout, LAYOUT } from '/@/router/constant';\nimport { ExceptionEnum } from '/@/enums/exceptionEnum';\nimport { t } from '/@/hooks/web/useI18n';\n\nconst ExceptionPage = () => import('/@/views/sys/exception/Exception.vue');\n\nconst page: AppRouteModule = {\n  path: '/page-demo',\n  name: 'PageDemo',\n  component: LAYOUT,\n  redirect: '/page-demo/form/basic',\n  meta: {\n    orderNo: 20,\n    icon: 'ion:aperture-outline',\n    title: t('routes.demo.page.page'),\n  },\n  children: [\n    // =============================form start=============================\n    {\n      path: 'form',\n      name: 'FormPage',\n      redirect: '/page-demo/form/basic',\n      component: getParentLayout('FormPage'),\n      meta: {\n        title: t('routes.demo.page.form'),\n      },\n      children: [\n        {\n          path: 'basic',\n          name: 'FormBasicPage',\n          component: () => import('/@/views/demo/page/form/basic/index.vue'),\n          meta: {\n            title: t('routes.demo.page.formBasic'),\n          },\n        },\n        {\n          path: 'step',\n          name: 'FormStepPage',\n          component: () => import('/@/views/demo/page/form/step/index.vue'),\n          meta: {\n            title: t('routes.demo.page.formStep'),\n          },\n        },\n        {\n          path: 'high',\n          name: 'FormHightPage',\n          component: () => import('/@/views/demo/page/form/high/index.vue'),\n          meta: {\n            title: t('routes.demo.page.formHigh'),\n          },\n        },\n      ],\n    },\n    // =============================form end=============================\n    // =============================desc start=============================\n    {\n      path: 'desc',\n      name: 'DescPage',\n      component: getParentLayout('DescPage'),\n      redirect: '/page-demo/desc/basic',\n      meta: {\n        title: t('routes.demo.page.desc'),\n      },\n      children: [\n        {\n          path: 'basic',\n          name: 'DescBasicPage',\n          component: () => import('/@/views/demo/page/desc/basic/index.vue'),\n          meta: {\n            title: t('routes.demo.page.descBasic'),\n          },\n        },\n        {\n          path: 'high',\n          name: 'DescHighPage',\n          component: () => import('/@/views/demo/page/desc/high/index.vue'),\n          meta: {\n            title: t('routes.demo.page.descHigh'),\n          },\n        },\n      ],\n    },\n    // =============================desc end=============================\n\n    // =============================result start=============================\n    {\n      path: 'result',\n      name: 'ResultPage',\n      redirect: '/page-demo/result/success',\n      component: getParentLayout('ResultPage'),\n\n      meta: {\n        title: t('routes.demo.page.result'),\n      },\n      children: [\n        {\n          path: 'success',\n          name: 'ResultSuccessPage',\n          component: () => import('/@/views/demo/page/result/success/index.vue'),\n          meta: {\n            title: t('routes.demo.page.resultSuccess'),\n          },\n        },\n        {\n          path: 'fail',\n          name: 'ResultFailPage',\n          component: () => import('/@/views/demo/page/result/fail/index.vue'),\n          meta: {\n            title: t('routes.demo.page.resultFail'),\n          },\n        },\n      ],\n    },\n    // =============================result end=============================\n\n    // =============================account start=============================\n    {\n      path: 'account',\n      name: 'AccountPage',\n      component: getParentLayout('AccountPage'),\n      redirect: '/page-demo/account/setting',\n      meta: {\n        title: t('routes.demo.page.account'),\n      },\n      children: [\n        {\n          path: 'center',\n          name: 'AccountCenterPage',\n          component: () => import('/@/views/demo/page/account/center/index.vue'),\n          meta: {\n            title: t('routes.demo.page.accountCenter'),\n          },\n        },\n        {\n          path: 'setting',\n          name: 'AccountSettingPage',\n          component: () => import('/@/views/demo/page/account/setting/index.vue'),\n          meta: {\n            title: t('routes.demo.page.accountSetting'),\n          },\n        },\n      ],\n    },\n    // =============================account end=============================\n    // =============================exception start=============================\n    {\n      path: 'exception',\n      name: 'ExceptionPage',\n      component: getParentLayout('ExceptionPage'),\n      redirect: '/page-demo/exception/404',\n      meta: {\n        title: t('routes.demo.page.exception'),\n      },\n      children: [\n        {\n          path: '403',\n          name: 'PageNotAccess',\n          component: ExceptionPage,\n          props: {\n            status: ExceptionEnum.PAGE_NOT_ACCESS,\n          },\n          meta: {\n            title: '403',\n          },\n        },\n        {\n          path: '404',\n          name: 'PageNotFound',\n          component: ExceptionPage,\n          props: {\n            status: ExceptionEnum.PAGE_NOT_FOUND,\n          },\n          meta: {\n            title: '404',\n          },\n        },\n        {\n          path: '500',\n          name: 'ServiceError',\n          component: ExceptionPage,\n          props: {\n            status: ExceptionEnum.ERROR,\n          },\n          meta: {\n            title: '500',\n          },\n        },\n        {\n          path: 'net-work-error',\n          name: 'NetWorkError',\n          component: ExceptionPage,\n          props: {\n            status: ExceptionEnum.NET_WORK_ERROR,\n          },\n          meta: {\n            title: t('routes.demo.page.netWorkError'),\n          },\n        },\n        {\n          path: 'not-data',\n          name: 'NotData',\n          component: ExceptionPage,\n          props: {\n            status: ExceptionEnum.PAGE_NOT_DATA,\n          },\n          meta: {\n            title: t('routes.demo.page.notData'),\n          },\n        },\n      ],\n    },\n    // =============================exception end=============================\n    // =============================list start=============================\n    {\n      path: 'list',\n      name: 'ListPage',\n      component: getParentLayout('ListPage'),\n      redirect: '/page-demo/list/card',\n      meta: {\n        title: t('routes.demo.page.list'),\n      },\n      children: [\n        {\n          path: 'basic',\n          name: 'ListBasicPage',\n          component: () => import('/@/views/demo/page/list/basic/index.vue'),\n          meta: {\n            title: t('routes.demo.page.listBasic'),\n          },\n        },\n        {\n          path: 'card',\n          name: 'ListCardPage',\n          component: () => import('/@/views/demo/page/list/card/index.vue'),\n          meta: {\n            title: t('routes.demo.page.listCard'),\n          },\n        },\n        {\n          path: 'search',\n          name: 'ListSearchPage',\n          component: () => import('/@/views/demo/page/list/search/index.vue'),\n          meta: {\n            title: t('routes.demo.page.listSearch'),\n          },\n        },\n      ],\n    },\n    // =============================list end=============================\n  ],\n};\n\nexport default page;\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/routes/modules/demo/permission.ts",
    "content": "import type { AppRouteModule } from '/@/router/types';\n\nimport { getParentLayout, LAYOUT } from '/@/router/constant';\nimport { RoleEnum } from '/@/enums/roleEnum';\nimport { t } from '/@/hooks/web/useI18n';\n\nconst permission: AppRouteModule = {\n  path: '/permission',\n  name: 'Permission',\n  component: LAYOUT,\n  redirect: '/permission/front/page',\n  meta: {\n    orderNo: 15,\n    icon: 'ion:key-outline',\n    title: t('routes.demo.permission.permission'),\n  },\n\n  children: [\n    {\n      path: 'front',\n      name: 'PermissionFrontDemo',\n      component: getParentLayout('PermissionFrontDemo'),\n      meta: {\n        title: t('routes.demo.permission.front'),\n      },\n      children: [\n        {\n          path: 'page',\n          name: 'FrontPageAuth',\n          component: () => import('/@/views/demo/permission/front/index.vue'),\n          meta: {\n            title: t('routes.demo.permission.frontPage'),\n          },\n        },\n        {\n          path: 'btn',\n          name: 'FrontBtnAuth',\n          component: () => import('/@/views/demo/permission/front/Btn.vue'),\n          meta: {\n            title: t('routes.demo.permission.frontBtn'),\n          },\n        },\n        {\n          path: 'auth-pageA',\n          name: 'FrontAuthPageA',\n          component: () => import('/@/views/demo/permission/front/AuthPageA.vue'),\n          meta: {\n            title: t('routes.demo.permission.frontTestA'),\n            roles: [RoleEnum.SUPER],\n          },\n        },\n        {\n          path: 'auth-pageB',\n          name: 'FrontAuthPageB',\n          component: () => import('/@/views/demo/permission/front/AuthPageB.vue'),\n          meta: {\n            title: t('routes.demo.permission.frontTestB'),\n            roles: [RoleEnum.TEST],\n          },\n        },\n      ],\n    },\n    {\n      path: 'back',\n      name: 'PermissionBackDemo',\n      component: getParentLayout('PermissionBackDemo'),\n      meta: {\n        title: t('routes.demo.permission.back'),\n      },\n      children: [\n        {\n          path: 'page',\n          name: 'BackAuthPage',\n          component: () => import('/@/views/demo/permission/back/index.vue'),\n          meta: {\n            title: t('routes.demo.permission.backPage'),\n          },\n        },\n        {\n          path: 'btn',\n          name: 'BackAuthBtn',\n          component: () => import('/@/views/demo/permission/back/Btn.vue'),\n          meta: {\n            title: t('routes.demo.permission.backBtn'),\n          },\n        },\n      ],\n    },\n  ],\n};\n\nexport default permission;\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/routes/modules/demo/setup.ts",
    "content": "import type { AppRouteModule } from '/@/router/types';\n\nimport { LAYOUT } from '/@/router/constant';\nimport { t } from '/@/hooks/web/useI18n';\n\nconst setup: AppRouteModule = {\n  path: '/setup',\n  name: 'SetupDemo',\n  component: LAYOUT,\n  redirect: '/setup/index',\n  meta: {\n    orderNo: 90000,\n    hideChildrenInMenu: true,\n    icon: 'whh:paintroll',\n    title: t('routes.demo.setup.page'),\n  },\n  children: [\n    {\n      path: 'index',\n      name: 'SetupDemoPage',\n      component: () => import('/@/views/demo/setup/index.vue'),\n      meta: {\n        title: t('routes.demo.setup.page'),\n        icon: 'whh:paintroll',\n        hideMenu: true,\n      },\n    },\n  ],\n};\n\nexport default setup;\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/routes/modules/demo/system.ts",
    "content": "import type { AppRouteModule } from '/@/router/types';\n\nimport { LAYOUT } from '/@/router/constant';\nimport { t } from '/@/hooks/web/useI18n';\n\nconst system: AppRouteModule = {\n  path: '/system',\n  name: 'System',\n  component: LAYOUT,\n  redirect: '/system/account',\n  meta: {\n    orderNo: 2000,\n    icon: 'ion:settings-outline',\n    title: t('routes.demo.system.moduleName'),\n  },\n  children: [\n    {\n      path: 'test',\n      name: 'TestManagement',\n      meta: {\n        title: t('routes.demo.system.test'),\n        ignoreKeepAlive: true,\n      },\n      component: () => import('/@/views/demo/system/test/index.vue'),\n    },\n    {\n      path: 'account',\n      name: 'AccountManagement',\n      meta: {\n        title: t('routes.demo.system.account'),\n        ignoreKeepAlive: false,\n      },\n      component: () => import('/@/views/demo/system/account/index.vue'),\n    },\n    {\n      path: 'account_detail/:id',\n      name: 'AccountDetail',\n      meta: {\n        hideMenu: true,\n        title: t('routes.demo.system.account_detail'),\n        ignoreKeepAlive: true,\n        showMenu: false,\n        currentActiveMenu: '/system/account',\n      },\n      component: () => import('/@/views/demo/system/account/AccountDetail.vue'),\n    },\n    {\n      path: 'role',\n      name: 'RoleManagement',\n      meta: {\n        title: t('routes.demo.system.role'),\n        ignoreKeepAlive: true,\n      },\n      component: () => import('/@/views/demo/system/role/index.vue'),\n    },\n    {\n      path: 'menu',\n      name: 'MenuManagement',\n      meta: {\n        title: t('routes.demo.system.menu'),\n        ignoreKeepAlive: true,\n      },\n      component: () => import('/@/views/demo/system/menu/index.vue'),\n    },\n    {\n      path: 'dept',\n      name: 'DeptManagement',\n      meta: {\n        title: t('routes.demo.system.dept'),\n        ignoreKeepAlive: true,\n      },\n      component: () => import('/@/views/demo/system/dept/index.vue'),\n    },\n    {\n      path: 'changePassword',\n      name: 'ChangePassword',\n      meta: {\n        title: t('routes.demo.system.password'),\n        ignoreKeepAlive: true,\n      },\n      component: () => import('/@/views/demo/system/password/index.vue'),\n    },\n  ],\n};\n\nexport default system;\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/routes/staticRouter.ts",
    "content": "import type { AppRouteRecordRaw } from '/@/router/types';\nimport { LAYOUT } from '/@/router/constant';\n\nexport const AI_ROUTE: AppRouteRecordRaw = {\n  path: '',\n  name: 'ai-parent',\n  component: LAYOUT,\n  meta: {\n    title: 'ai',\n  },\n  children: [\n    {\n      path: '/ai',\n      name: 'ai',\n      component: () => import('/@/views/dashboard/ai/index.vue'),\n      meta: {\n        title: 'AI助手',\n      },\n    },\n  ],\n};\n\nexport const staticRoutesList = [AI_ROUTE];\n"
  },
  {
    "path": "jeecgboot-vue3/src/router/types.ts",
    "content": "import type { RouteRecordRaw, RouteMeta } from 'vue-router';\nimport { RoleEnum } from '/@/enums/roleEnum';\nimport { defineComponent } from 'vue';\n\nexport type Component<T extends any = any> = ReturnType<typeof defineComponent> | (() => Promise<typeof import('*.vue')>) | (() => Promise<T>);\n\n// @ts-ignore\nexport interface AppRouteRecordRaw extends Omit<RouteRecordRaw, 'meta'> {\n  name: string;\n  meta: RouteMeta;\n  component?: Component | string;\n  originComponent?: string;\n  components?: Component;\n  children?: AppRouteRecordRaw[];\n  props?: Recordable;\n  fullPath?: string;\n  alwaysShow?: boolean;\n}\n\nexport interface MenuTag {\n  type?: 'primary' | 'error' | 'warn' | 'success';\n  content?: string;\n  dot?: boolean;\n}\n\nexport interface Menu {\n  name: string;\n\n  icon?: string;\n\n  path: string;\n\n  // path contains param, auto assignment.\n  paramPath?: string;\n\n  disabled?: boolean;\n\n  children?: Menu[];\n\n  orderNo?: number;\n\n  roles?: RoleEnum[];\n\n  meta?: Partial<RouteMeta>;\n\n  tag?: MenuTag;\n\n  hideMenu?: boolean;\n  \n  alwaysShow?: boolean;\n  \n}\n\nexport interface MenuModule {\n  orderNo?: number;\n  menu: Menu;\n}\n\n// export type AppRouteModule = RouteModule | AppRouteRecordRaw;\nexport type AppRouteModule = AppRouteRecordRaw;\n"
  },
  {
    "path": "jeecgboot-vue3/src/settings/componentSetting.ts",
    "content": "// 用于配置某些组件的常规配置，而无需修改组件\n\nimport type { SorterResult } from '../components/Table';\n\nexport default {\n  // 表格配置\n  table: {\n    // 表格接口请求通用配置，可在组件prop覆盖\n    // 支持 xxx.xxx.xxx格式\n    fetchSetting: {\n      // 传给后台的当前页字段\n      pageField: 'pageNo',\n      // 传给后台的每页显示多少条的字段\n      sizeField: 'pageSize',\n      // 接口返回表格数据的字段\n      listField: 'records',\n      // 接口返回表格总数的字段\n      totalField: 'total',\n    },\n    // 可选的分页选项\n    pageSizeOptions: ['10', '50', '80', '100'],\n    // 表格默认尺寸\n    defaultSize: 'middle',\n    //默认每页显示多少条\n    defaultPageSize: 10,\n    // 默认排序方法\n    defaultSortFn: (sortInfo: SorterResult) => {\n      // 代码逻辑说明: VUEN-2199【表单设计器】多字段排序\n      if(sortInfo instanceof Array){\n        let sortInfoArray:any[] = []\n        for(let item of sortInfo){\n          let info = getSort(item);\n          if(info){\n            sortInfoArray.push(info)\n          }\n        }\n        return {\n          sortInfoString: JSON.stringify(sortInfoArray)\n        }\n      }else{\n        let info = getSort(sortInfo)\n        return info || {}\n      }\n    },\n    // 自定义过滤方法\n    defaultFilterFn: (data: Partial<Recordable<string[]>>) => {\n      return data;\n    },\n    // 代码逻辑说明: 【issues/1188】BasicTable加上scrollToFirstRowOnChange类型定义\n    scrollToFirstRowOnChange: false,\n  },\n  // 滚动组件配置\n  scrollbar: {\n    // 是否使用原生滚动样式\n    // 开启后，菜单，弹窗，抽屉会使用原生滚动条组件\n    native: false,\n  },\n  //表单配置\n  form: {\n    labelCol: {\n      xs: { span: 24 },\n      sm: { span: 4 },\n      xl: { span: 6 },\n      xxl: { span: 4 },\n    },\n    wrapperCol: {\n      xs: { span: 24 },\n      sm: { span: 18 },\n    },\n    //表单默认冒号\n    colon: true,\n  },\n};\n\n/**\n * 获取排序信息\n * @param item\n */\nfunction getSort(item){\n  const { field, order } = item;\n  if (field && order) {\n    let sortType = 'ascend' == order ? 'asc' : 'desc';\n    return {\n      // 排序字段\n      column: field,\n      // 排序方式 asc/desc\n      order: sortType,\n    };\n  }\n  return ''\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/settings/designSetting.ts",
    "content": "import { ThemeEnum } from '../enums/appEnum';\n\nexport const prefixCls = 'jeecg';\n\nexport const darkMode = ThemeEnum.LIGHT;\n\n// app theme preset color\nexport const APP_PRESET_COLOR_LIST: string[] = [\n  '#0960bd',\n  '#1890ff',\n  '#009688',\n  '#536dfe',\n  '#ff5c93',\n  '#13c2c2',\n  '#52c41a',\n  '#ee4f12',\n  '#0096c7',\n  '#9c27b0',\n  '#ff9800',\n];\n\n// header preset color\nexport const HEADER_PRESET_BG_COLOR_LIST: string[] = [\n  '#ffffff',\n  '#151515',\n  '#009688',\n  '#5172DC',\n  '#018ffb',\n  '#13c2c2',\n  '#e74c3c',\n  '#52c41a',\n  '#394664',\n  '#faad14',\n  '#383f45',\n];\n\n// sider preset color\nexport const SIDE_BAR_BG_COLOR_LIST: string[] = [\n  '#001529',\n  // '#212121',\n  '#009688',\n  '#273352',\n  '#ffffff',\n  '#191b24',\n  // '#191a23',\n  '#037bd5',\n  '#304156',\n  '#001628',\n  '#28333E',\n  // '#344058',\n  '#e74c3c',\n  '#383f45',\n];\n\n// sider logo line preset color [logo����ɫ]\nexport const SIDER_LOGO_BG_COLOR_LIST: string[] = [\n  'linear-gradient(180deg, #000000, #021d37)',\n  // 'linear-gradient(180deg, #000000, #282828)',\n  'linear-gradient(180deg, #078d80, #029184)',\n  'linear-gradient(180deg, #1c253e, #2b385c)',\n  'linear-gradient(180deg, #ffffff, #ffffff)',\n  'linear-gradient(180deg, #000000, #242735)',\n  // 'linear-gradient(180deg, #000000, #1d1f2a)',\n  'linear-gradient(180deg, #1d77bb, #188efa)',\n  'linear-gradient(180deg, #304156, #32455d)',\n  'linear-gradient(180deg, #000000, #001f39)',\n  'linear-gradient(180deg, #000000, #2b3743)',\n  // 'linear-gradient(180deg, #344058, #374560)',\n  'linear-gradient(180deg, #e83723, #e52611)',\n  'linear-gradient(180deg, #383f45, #3b434b)',\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/settings/encryptionSetting.ts",
    "content": "import { isDevMode } from '/@/utils/env';\n\n// 缓存默认过期时间\nexport const DEFAULT_CACHE_TIME = 60 * 60 * 24 * 7;\n\n// 开启缓存加密后，加密密钥。采用aes加密\nexport const cacheCipher = {\n  key: '_11111000001111@',\n  iv: '@11111000001111_',\n};\n\n// 是否加密缓存，默认生产环境加密\nexport const enableStorageEncryption = false;\n"
  },
  {
    "path": "jeecgboot-vue3/src/settings/localeSetting.ts",
    "content": "import type { DropMenu } from '../components/Dropdown';\nimport type { LocaleSetting, LocaleType } from '/#/config';\n\nexport const LOCALE: { [key: string]: LocaleType } = {\n  ZH_CN: 'zh_CN',\n  EN_US: 'en',\n};\n\nexport const localeSetting: LocaleSetting = {\n  // 是否显示语言选择器\n  showPicker: true,\n  // 当前语言\n  locale: LOCALE.ZH_CN,\n  // 默认语言\n  fallback: LOCALE.ZH_CN,\n  // 允许的语言\n  availableLocales: [LOCALE.ZH_CN, LOCALE.EN_US],\n};\n\n// 语言列表\nexport const localeList: DropMenu[] = [\n  {\n    text: '简体中文',\n    event: LOCALE.ZH_CN,\n  },\n  {\n    text: 'English',\n    event: LOCALE.EN_US,\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/settings/projectSetting.ts",
    "content": "import type { ProjectConfig } from '/#/config';\nimport { MenuTypeEnum, MenuModeEnum, TriggerEnum, MixSidebarTriggerEnum } from '/@/enums/menuEnum';\nimport { CacheTypeEnum } from '/@/enums/cacheEnum';\nimport {\n  ContentEnum,\n  PermissionModeEnum,\n  ThemeEnum,\n  RouterTransitionEnum,\n  SettingButtonPositionEnum,\n  SessionTimeoutProcessingEnum,\n  TabsThemeEnum,\n} from '/@/enums/appEnum';\nimport { darkMode } from '/@/settings/designSetting';\nimport { getConfigByMenuType } from '../utils/getConfigByMenuType';\n// 修改此属性，实现默认的四个系统主题快速切换\nconst menuType = MenuTypeEnum.SIDEBAR;\n\n// update-begin--author:liaozhiyang---date:20251201---for【QQYUN-14176】修改一个配置就能切换默认四个主题，不需要额外修改颜色等\nconst { themeColor, headerBgColor, sideBgColor, split, mode } = getConfigByMenuType(menuType);\n// update-end--author:liaozhiyang---date:20251201---for【QQYUN-14176】修改一个配置就能切换默认四个主题，不需要额外修改颜色等\n// ! 改动后需要清空浏览器缓存\nconst setting: ProjectConfig = {\n  // 是否显示SettingButton\n  showSettingButton: true,\n\n  // 是否显示主题切换按钮\n  showDarkModeToggle: true,\n\n  // 设置按钮位置 可选项\n  // SettingButtonPositionEnum.AUTO: 自动选择\n  // SettingButtonPositionEnum.HEADER: 位于头部\n  // SettingButtonPositionEnum.FIXED: 固定在右侧\n  settingButtonPosition: SettingButtonPositionEnum.AUTO,\n\n  // 权限模式,默认前端角色权限模式\n  // ROUTE_MAPPING: 前端模式（菜单由路由生成，默认）\n  // ROLE：前端模式（菜单路由分开）\n  // BACK：后台模式\n  permissionMode: PermissionModeEnum.BACK,\n\n  // 权限缓存存放位置。默认存放于localStorage\n  permissionCacheType: CacheTypeEnum.LOCAL,\n\n  // 会话超时处理方案\n  // SessionTimeoutProcessingEnum.ROUTE_JUMP: 路由跳转到登录页\n  // SessionTimeoutProcessingEnum.PAGE_COVERAGE: 生成登录弹窗，覆盖当前页面\n  sessionTimeoutProcessing: SessionTimeoutProcessingEnum.ROUTE_JUMP,\n  // 项目主题色 - 根据导航栏模式确定主题色动态设置\n  themeColor: themeColor,\n  // 项目主题模式\n  themeMode: darkMode,\n\n  // 网站灰色模式，用于可能悼念的日期开启\n  grayMode: false,\n\n  // 色弱模式\n  colorWeak: false,\n\n  // 是否取消菜单,顶部,多标签页显示, 用于可能内嵌在别的系统内\n  fullContent: false,\n\n  // 主题内容宽度\n  contentMode: ContentEnum.FULL,\n\n  // 是否显示logo\n  showLogo: true,\n\n  // 是否显示底部信息 copyright\n  showFooter: false,\n\n  // ai图标显示\n  aiIconShow: false,\n\n  // 头部配置\n  headerSetting: {\n    // 背景色\n    bgColor: headerBgColor,\n    // 固定头部\n    fixed: true,\n    // 是否显示顶部\n    show: true,\n    // 主题\n    theme: ThemeEnum.LIGHT,\n    // 开启锁屏功能\n    useLockPage: false,\n    // 显示全屏按钮\n    showFullScreen: false,\n    // 显示官网按钮\n    showDoc: false,\n    // 显示消息中心按钮\n    showNotice: true,\n    // 显示菜单搜索按钮\n    showSearch: true,\n  },\n\n  // 菜单配置\n  menuSetting: {\n    // 背景色\n    bgColor: sideBgColor,\n    // 是否固定住左侧菜单\n    fixed: true,\n    // 菜单折叠\n    collapsed: false,\n    // 折叠菜单时候是否显示菜单名\n    collapsedShowTitle: false,\n    // 是否可拖拽\n    // Only limited to the opening of the left menu, the mouse has a drag bar on the right side of the menu\n    canDrag: false,\n    // Whether to show no dom\n    show: true,\n    // Whether to show dom\n    hidden: false,\n    // 菜单宽度\n    menuWidth: 210,\n    // 菜单模式\n    mode,\n    // 菜单类型\n    type: menuType,\n    // 菜单主题\n    theme: ThemeEnum.LIGHT,\n    // 左侧导航栏文字颜色调整区分彩色和暗黑 (不对应配置)\n    isThemeBright: false,\n    // 分割菜单\n    split,\n    // 顶部菜单布局\n    topMenuAlign: 'center',\n    // 折叠触发器的位置\n    trigger: TriggerEnum.HEADER,\n    // 手风琴模式，只展示一个菜单\n    accordion: true,\n    // 在路由切换的时候关闭左侧混合菜单展开菜单\n    closeMixSidebarOnChange: false,\n    // 左侧混合菜单模块切换触发方式 ‘click’ |'hover'\n    mixSideTrigger: MixSidebarTriggerEnum.CLICK,\n    // 是否固定左侧混合菜单\n    mixSideFixed: false,\n  },\n\n  // 多标签\n  multiTabsSetting: {\n    // 刷新后是否保留已经打开的标签页\n    cache: false,\n    // 开启\n    show: true,\n    // 是否可以拖拽\n    canDrag: true,\n    // 开启快速操作\n    showQuick: true,\n    // 是否显示刷新按钮\n    showRedo: true,\n    // 是否显示折叠按钮\n    showFold: true,\n    // 标签页样式\n    theme: TabsThemeEnum.CARD,\n  },\n\n  // 动画配置\n  transitionSetting: {\n    //  是否开启切换动画\n    // The disabled state will also disable pageLoading\n    enable: true,\n\n    // 动画名 Route basic switching animation\n    basicTransition: RouterTransitionEnum.FADE_SIDE,\n\n    // 是否打开页面切换loading\n    // Only open when enable=true\n    openPageLoading: true,\n\n    //是否打开页面切换顶部进度条\n    openNProgress: true,\n  },\n\n  // 是否开启KeepAlive缓存  开发时候最好关闭,不然每次都需要清除缓存\n  openKeepAlive: true,\n\n  // 自动锁屏时间，为0不锁屏。 单位分钟 默认1个小时\n  lockTime: 0,\n\n  // 显示面包屑\n  showBreadCrumb: false,\n\n  // 显示面包屑图标\n  showBreadCrumbIcon: true,\n\n  // 是否使用全局错误捕获\n  useErrorHandle: false,\n\n  // 是否开启回到顶部\n  useOpenBackTop: true,\n\n  // 是否可以嵌入iframe页面\n  canEmbedIFramePage: true,\n\n  // 切换界面的时候是否删除未关闭的message及notify\n  closeMessageOnSwitch: true,\n\n  // 切换界面的时候是否取消已经发送但是未响应的http请求。\n  // 如果开启,想对单独接口覆盖。可以在单独接口设置\n  removeAllHttpPending: false,\n};\n\nexport default setting;\n"
  },
  {
    "path": "jeecgboot-vue3/src/settings/registerThirdComp.ts",
    "content": "import type { App } from 'vue';\nimport { registerJVxeTable } from '/@/components/jeecg/JVxeTable';\nimport { registerJVxeCustom } from '/@/components/JVxeCustom';\n\n// 注册全局dayjs\nimport dayjs from 'dayjs';\nimport relativeTime from 'dayjs/plugin/relativeTime';\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\nimport { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n\nexport async function registerThirdComp(app: App) {\n  //---------------------------------------------------------------------\n  // 注册 JVxeTable 组件\n  registerJVxeTable(app);\n  // 注册 JVxeTable 自定义组件\n  await registerJVxeCustom();\n  //---------------------------------------------------------------------\n  // 注册全局聊天表情包\n  // 代码逻辑说明: 【QQYUN-8241】emoji-mart-vue-fast库异步加载\n  app.component(\n    'Picker',\n    createAsyncComponent(() => {\n      return new Promise((resolve, rejected) => {\n        import('emoji-mart-vue-fast/src')\n          .then((res) => {\n            const { Picker } = res;\n            resolve(Picker);\n          })\n          .catch((err) => {\n            rejected(err);\n          });\n      });\n    })\n  );\n  // update-end--author:liaozhiyang---date:20240308---for：【QQYUN-8241】emoji-mart-vue-fast库异步加载\n  //---------------------------------------------------------------------\n  // 注册全局dayjs\n  dayjs.locale('zh-cn');\n  dayjs.extend(relativeTime);\n  dayjs.extend(customParseFormat);\n  app.config.globalProperties.$dayjs = dayjs\n  app.provide('$dayjs', dayjs)\n  //---------------------------------------------------------------------\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/settings/siteSetting.ts",
    "content": "// github repo url\nexport const GITHUB_URL = 'https://github.com/jeecgboot/JeecgBoot';\n\n// vue-Jeecg-admin-next-doc\nexport const DOC_URL = 'https://help.jeecg.com';\n\n// site url\nexport const SITE_URL = 'http://www.jeecg.com';\n"
  },
  {
    "path": "jeecgboot-vue3/src/store/index.ts",
    "content": "import type { App } from 'vue';\nimport type { Pinia } from 'pinia';\nimport { createPinia } from 'pinia';\n\nlet app: Nullable<App<Element>> = null;\nlet store: Nullable<Pinia> = null;\n\nexport function setupStore($app: App<Element>) {\n  if (store == null) {\n    store = createPinia();\n  }\n  app = $app;\n  app.use(store);\n}\n\n// 销毁store\nexport function destroyStore() {\n  store = null;\n}\n\n// 获取app实例\nexport const getAppContext = () => app?._context;\n\nexport {app, store};\n"
  },
  {
    "path": "jeecgboot-vue3/src/store/modules/app.ts",
    "content": "import type { MainAppProps } from \"#/main\";\nimport type { ProjectConfig, HeaderSetting, MenuSetting, TransitionSetting, MultiTabsSetting } from '/#/config';\nimport type { BeforeMiniState } from '/#/store';\n\nimport { defineStore } from 'pinia';\nimport { store } from '/@/store';\n\nimport { ThemeEnum } from '/@/enums/appEnum';\nimport { APP_DARK_MODE_KEY_, PROJ_CFG_KEY } from '/@/enums/cacheEnum';\nimport { Persistent } from '/@/utils/cache/persistent';\nimport { darkMode } from '/@/settings/designSetting';\nimport { resetRouter } from '/@/router';\nimport { deepMerge } from '/@/utils';\nimport { getHideLayoutTypes } from '/@/utils/env';\nimport setting from '/@/settings/projectSetting';\n\ninterface AppState {\n  darkMode?: ThemeEnum;\n  // Page loading status\n  pageLoading: boolean;\n  // project config\n  projectConfig: ProjectConfig | null;\n  // When the window shrinks, remember some states, and restore these states when the window is restored\n  beforeMiniInfo: BeforeMiniState;\n  // 页面跳转临时参数存储\n  messageHrefParams: any,\n  // 应用参数\n  mainAppProps: MainAppProps,\n}\nlet timeId: TimeoutHandle;\nexport const useAppStore = defineStore({\n  id: 'app',\n  state: (): AppState => ({\n    darkMode: undefined,\n    pageLoading: false,\n    projectConfig: Persistent.getLocal(PROJ_CFG_KEY),\n    beforeMiniInfo: {},\n    messageHrefParams: {},\n    mainAppProps: {},\n  }),\n  getters: {\n    getPageLoading(): boolean {\n      return this.pageLoading;\n    },\n    getDarkMode(): 'light' | 'dark' | string {\n      // liaozhiyang---date:20250411---for：【QQYUN-11956】修复projectSetting中配置主题模式不生效\n      const getSettingTheme = () => {\n        const theme = setting.themeMode;\n        if (theme) {\n          if (theme == ThemeEnum.DARK) {\n            // 为了index.html页面loading时是暗黑\n            localStorage.setItem(APP_DARK_MODE_KEY_, theme);\n          }\n          return theme;\n        }\n        return '';\n      };\n      // liaozhiyang---date:20250411---for：【QQYUN-11956】修复projectSetting中配置主题模式不生效\n      return this.darkMode || localStorage.getItem(APP_DARK_MODE_KEY_) || getSettingTheme() || darkMode;\n    },\n\n    getBeforeMiniInfo(): BeforeMiniState {\n      return this.beforeMiniInfo;\n    },\n\n    getProjectConfig(): ProjectConfig {\n      return this.projectConfig || ({} as ProjectConfig);\n    },\n\n    getHeaderSetting(): HeaderSetting {\n      return this.getProjectConfig.headerSetting;\n    },\n    getMenuSetting(): MenuSetting {\n      return this.getProjectConfig.menuSetting;\n    },\n    getTransitionSetting(): TransitionSetting {\n      return this.getProjectConfig.transitionSetting;\n    },\n    getMultiTabsSetting(): MultiTabsSetting {\n      return this.getProjectConfig.multiTabsSetting;\n    },\n    getMessageHrefParams():any{\n      return this.messageHrefParams;\n    },\n    getMainAppProps(): MainAppProps {\n      return this.mainAppProps;\n    },\n\n    getLayoutHideSider(): boolean {\n      const hideLayoutTypes = getHideLayoutTypes();\n      if (hideLayoutTypes.includes('sider')) {\n        return true;\n      }\n      return !!this.mainAppProps.hideSider;\n    },\n    getLayoutHideHeader(): boolean {\n      const hideLayoutTypes = getHideLayoutTypes();\n      if (hideLayoutTypes.includes('header')) {\n        return true;\n      }\n      return !!this.mainAppProps.hideHeader;\n    },\n    getLayoutHideMultiTabs(): boolean {\n      const hideLayoutTypes = getHideLayoutTypes();\n      if (hideLayoutTypes.includes('multi-tabs')) {\n        return true;\n      }\n      return !!this.mainAppProps.hideMultiTabs;\n    },\n  },\n  actions: {\n    setPageLoading(loading: boolean): void {\n      this.pageLoading = loading;\n    },\n\n    setDarkMode(mode: ThemeEnum): void {\n      this.darkMode = mode;\n      localStorage.setItem(APP_DARK_MODE_KEY_, mode);\n      this.setProjectConfig({ themeMode: mode });\n    },\n\n    setBeforeMiniInfo(state: BeforeMiniState): void {\n      this.beforeMiniInfo = state;\n    },\n\n    setProjectConfig(config: DeepPartial<ProjectConfig>): void {\n      this.projectConfig = deepMerge(this.projectConfig || {}, config);\n      // 代码逻辑说明: 【QQYUN-8922】设置导航栏模式没存本地，刷新就还原了\n      Persistent.setLocal(PROJ_CFG_KEY, this.projectConfig, true);\n    },\n\n    async resetAllState() {\n      resetRouter();\n      Persistent.clearAll();\n    },\n    async setPageLoadingAction(loading: boolean): Promise<void> {\n      if (loading) {\n        clearTimeout(timeId);\n        // Prevent flicker\n        timeId = setTimeout(() => {\n          this.setPageLoading(loading);\n        }, 50);\n      } else {\n        this.setPageLoading(loading);\n        clearTimeout(timeId);\n      }\n    },\n    setMessageHrefParams(params: any): void {\n      this.messageHrefParams = params;\n    },\n\n    // 设置主应用参数\n    setMainAppProps(args: MainAppProps)  {\n      this.mainAppProps.hideHeader = args.hideHeader ?? false;\n      this.mainAppProps.hideSider = args.hideSider ?? false;\n      this.mainAppProps.hideMultiTabs = args.hideMultiTabs ?? false;\n    },\n\n  },\n});\n\n// Need to be used outside the setup\nexport function useAppStoreWithOut() {\n  return useAppStore(store);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/store/modules/defIndex.ts",
    "content": "import {store} from '/@/store';\nimport {defineStore} from 'pinia';\nimport {defHttp} from \"@/utils/http/axios\";\n\ninterface DefIndexState {\n  // 首页url\n  url: string,\n  // 首页组件\n  component: string\n}\n\nexport const useDefIndexStore = defineStore({\n  id: 'defIndex',\n  state: (): DefIndexState => ({\n    url: '',\n    component: '',\n  }),\n  getters: {},\n  actions: {\n    /**\n     * 查询默认主页配置\n     */\n    async query() {\n      const config = await defIndexApi.query();\n      this.url = config.url;\n      this.component = config.component;\n    },\n    /**\n     * 更新默认主页配置\n     * @param url 首页url\n     * @param component 首页组件\n     * @param isRoute 是否是路由\n     */\n    async update(url: string, component: string, isRoute: boolean) {\n      await defIndexApi.update(url, component, isRoute);\n      await this.query()\n    },\n\n    check(url: string) {\n      return url === this.url;\n    }\n  }\n});\n\n// Need to be used outside the setup\nexport function useDefIndexStoreWithOut() {\n  return useDefIndexStore(store);\n}\n\n/**\n * 默认首页配置API\n */\nexport const defIndexApi = {\n  /**\n   * 查询默认首页配置\n   */\n  async query() {\n    const url = '/sys/sysRoleIndex/queryDefIndex'\n    return await defHttp.get({url});\n  },\n  /**\n   * 更新默认首页配置\n   * @param url 首页url\n   * @param component 首页组件\n   * @param isRoute 是否是路由\n   */\n  async update(url: string, component: string, isRoute: boolean) {\n    let apiUrl = '/sys/sysRoleIndex/updateDefIndex'\n    apiUrl += '?url=' + url\n    // 代码逻辑说明: 设置默认首页接口传参修改,增加encodeURIComponent，防止{{ window._CONFIG['domianURL'] }}/**保存不上\n    apiUrl += '&component=' + encodeURIComponent(component)\n    apiUrl += '&isRoute=' + isRoute\n    return await defHttp.put({url: apiUrl});\n  },\n\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/store/modules/errorLog.ts",
    "content": "import type { ErrorLogInfo } from '/#/store';\n\nimport { defineStore } from 'pinia';\nimport { store } from '/@/store';\n\nimport { formatToDateTime } from '/@/utils/dateUtil';\nimport projectSetting from '/@/settings/projectSetting';\n\nimport { ErrorTypeEnum } from '/@/enums/exceptionEnum';\n\nexport interface ErrorLogState {\n  errorLogInfoList: Nullable<ErrorLogInfo[]>;\n  errorLogListCount: number;\n}\n\nexport const useErrorLogStore = defineStore({\n  id: 'app-error-log',\n  state: (): ErrorLogState => ({\n    errorLogInfoList: null,\n    errorLogListCount: 0,\n  }),\n  getters: {\n    getErrorLogInfoList(): ErrorLogInfo[] {\n      return this.errorLogInfoList || [];\n    },\n    getErrorLogListCount(): number {\n      return this.errorLogListCount;\n    },\n  },\n  actions: {\n    addErrorLogInfo(info: ErrorLogInfo) {\n      const item = {\n        ...info,\n        time: formatToDateTime(new Date()),\n      };\n      this.errorLogInfoList = [item, ...(this.errorLogInfoList || [])];\n      this.errorLogListCount += 1;\n    },\n\n    setErrorLogListCount(count: number): void {\n      this.errorLogListCount = count;\n    },\n\n    /**\n     * Triggered after ajax request error\n     * @param error\n     * @returns\n     */\n    addAjaxErrorInfo(error) {\n      const { useErrorHandle } = projectSetting;\n      if (!useErrorHandle) {\n        return;\n      }\n      const errInfo: Partial<ErrorLogInfo> = {\n        message: error.message,\n        type: ErrorTypeEnum.AJAX,\n      };\n      if (error.response) {\n        const { config: { url = '', data: params = '', method = 'get', headers = {} } = {}, data = {} } = error.response;\n        errInfo.url = url;\n        errInfo.name = 'Ajax Error!';\n        errInfo.file = '-';\n        errInfo.stack = JSON.stringify(data);\n        errInfo.detail = JSON.stringify({ params, method, headers });\n      }\n      this.addErrorLogInfo(errInfo as ErrorLogInfo);\n    },\n  },\n});\n\n// Need to be used outside the setup\nexport function useErrorLogStoreWithOut() {\n  return useErrorLogStore(store);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/store/modules/locale.ts",
    "content": "import type { LocaleSetting, LocaleType } from '/#/config';\n\nimport { defineStore } from 'pinia';\nimport { store } from '/@/store';\n\nimport { LOCALE_KEY } from '/@/enums/cacheEnum';\nimport { createLocalStorage } from '/@/utils/cache';\nimport { localeSetting } from '/@/settings/localeSetting';\n\nconst ls = createLocalStorage();\n\nconst lsLocaleSetting = (ls.get(LOCALE_KEY) || localeSetting) as LocaleSetting;\n\ninterface LocaleState {\n  localInfo: LocaleSetting;\n  pathTitleMap: object;\n  // myapps主题色（低代码应用列表首页）\n  appIndexTheme: string\n  // myapps - 跳转前路由地址\n  appMainPth: string\n}\n\nexport const useLocaleStore = defineStore({\n  id: 'app-locale',\n  state: (): LocaleState => ({\n    localInfo: lsLocaleSetting,\n    pathTitleMap: {},\n    appIndexTheme: '',\n    appMainPth: ''\n  }),\n  getters: {\n    getShowPicker(): boolean {\n      return !!this.localInfo?.showPicker;\n    },\n    getLocale(): LocaleType {\n      return this.localInfo?.locale ?? 'zh_CN';\n    },\n    // 代码逻辑说明: VUEN-1144 online 配置成菜单后，打开菜单，显示名称未展示为菜单名称\n    getPathTitle: (state) => {\n      return (path) => state.pathTitleMap[path];\n    },\n    getAppIndexTheme(): string {\n      return this.appIndexTheme;\n    },\n    getAppMainPth(): string {\n      return this.appMainPth;\n    },\n  },\n  actions: {\n    /**\n     * Set up multilingual information and cache\n     * @param info multilingual info\n     */\n    setLocaleInfo(info: Partial<LocaleSetting>) {\n      this.localInfo = { ...this.localInfo, ...info };\n      ls.set(LOCALE_KEY, this.localInfo);\n    },\n    /**\n     * Initialize multilingual information and load the existing configuration from the local cache\n     */\n    initLocale() {\n      this.setLocaleInfo({\n        ...localeSetting,\n        ...this.localInfo,\n      });\n    },\n    // 代码逻辑说明: VUEN-1144 online 配置成菜单后，打开菜单，显示名称未展示为菜单名称\n    setPathTitle(path, title) {\n      this.pathTitleMap[path] = title;\n    },\n    setAppIndexTheme(theme) {\n      this.appIndexTheme = theme;\n    },\n    setAppMainPth(path) {\n      this.appMainPth = path;\n    },\n  },\n});\n\n// Need to be used outside the setup\nexport function useLocaleStoreWithOut() {\n  return useLocaleStore(store);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/store/modules/lock.ts",
    "content": "import type { LockInfo } from '/#/store';\n\nimport { defineStore } from 'pinia';\n\nimport { LOCK_INFO_KEY } from '/@/enums/cacheEnum';\nimport { Persistent } from '/@/utils/cache/persistent';\nimport { useUserStore } from './user';\n\ninterface LockState {\n  lockInfo: Nullable<LockInfo>;\n}\n\nexport const useLockStore = defineStore({\n  id: 'app-lock',\n  state: (): LockState => ({\n    lockInfo: Persistent.getLocal(LOCK_INFO_KEY),\n  }),\n  getters: {\n    getLockInfo(): Nullable<LockInfo> {\n      return this.lockInfo;\n    },\n  },\n  actions: {\n    setLockInfo(info: LockInfo) {\n      this.lockInfo = Object.assign({}, this.lockInfo, info);\n      Persistent.setLocal(LOCK_INFO_KEY, this.lockInfo, true);\n    },\n    resetLockInfo() {\n      Persistent.removeLocal(LOCK_INFO_KEY, true);\n      this.lockInfo = null;\n    },\n    // Unlock\n    async unLock(password?: string) {\n      if (this.lockInfo?.pwd === password) {\n        this.resetLockInfo();\n        return true;\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "jeecgboot-vue3/src/store/modules/multipleTab.ts",
    "content": "import type { RouteLocationNormalized, RouteLocationRaw, Router } from 'vue-router';\n\nimport { toRaw, unref } from 'vue';\nimport { defineStore } from 'pinia';\nimport { store } from '/@/store';\nimport { PAGE_NOT_FOUND_NAME_404 } from '/@/router/constant';\n\nimport { useGo, useRedo } from '/@/hooks/web/usePage';\nimport { Persistent } from '/@/utils/cache/persistent';\n\nimport { PageEnum } from '/@/enums/pageEnum';\nimport { PAGE_NOT_FOUND_ROUTE, REDIRECT_ROUTE } from '/@/router/routes/basic';\nimport { getRawRoute } from '/@/utils';\nimport { MULTIPLE_TABS_KEY } from '/@/enums/cacheEnum';\n\nimport projectSetting from '/@/settings/projectSetting';\nimport { useUserStore } from '/@/store/modules/user';\nimport type { LocationQueryRaw, RouteParamsRaw } from 'vue-router';\nimport { getMenus } from '/@/router/menus';\n\nexport interface MultipleTabState {\n  cacheTabList: Set<string>;\n  tabList: RouteLocationNormalized[];\n  lastDragEndIndex: number;\n  redirectPageParam: null | redirectPageParamType;\n}\n\ninterface redirectPageParamType {\n  redirect_type: string;\n  name?: string;\n  path?: string;\n  query: LocationQueryRaw;\n  params?: RouteParamsRaw;\n}\n\nfunction handleGotoPage(router: Router, path?) {\n  const go = useGo(router);\n  // 代码逻辑说明: 【TV360X-732】非当前页右键关闭左侧、关闭右侧、关闭其它功能正常使用\n  go(path || unref(router.currentRoute).path, true);\n}\nconst getToTarget = (tabItem: RouteLocationNormalized) => {\n  const { params, path, query } = tabItem;\n  return {\n    params: params || {},\n    path,\n    query: query || {},\n  };\n};\n\n/**\n * 2024-06-05\n * liaozhiyang\n * 关闭的tab中是否包含当前页面\n */\nconst closeTabContainCurrentRoute = (router, pathList) => {\n  const { currentRoute } = router;\n  const getCurrentTab = () => {\n    const route = unref(currentRoute);\n    const tabStore = useMultipleTabStore();\n    return tabStore.getTabList.find((item) => item.path === route.path)!;\n  };\n  const currentTab = getCurrentTab();\n  if (currentTab) {\n    return pathList.includes(currentTab.path);\n  }\n  return false;\n};\n/**\n * 2025-05-08\n * liaozhiyang\n * 【issues/8216】online生成的菜单sql 自动带上组件名称\n * */\nfunction getMatchingRoute(menus, path) {\n  for (let i = 0, len = menus.length; i < len; i++) {\n    const item = menus[i];\n    if (item.path === path && !item.redirect && !item.paramPath) {\n      return item;\n    } else if (item.children?.length) {\n      const result = getMatchingRoute(item.children, path);\n      if (result) {\n        return result;\n      }\n    }\n  }\n  return null;\n}\n\nconst cacheTab = projectSetting.multiTabsSetting.cache;\n\nexport const useMultipleTabStore = defineStore({\n  id: 'app-multiple-tab',\n  state: (): MultipleTabState => ({\n    // Tabs that need to be cached\n    cacheTabList: new Set(),\n    // multiple tab list\n    tabList: cacheTab ? Persistent.getLocal(MULTIPLE_TABS_KEY) || [] : [],\n    // Index of the last moved tab\n    lastDragEndIndex: 0,\n    // 重定向时存储的路由参数\n    redirectPageParam: null,\n  }),\n  getters: {\n    getTabList(): RouteLocationNormalized[] {\n      return this.tabList;\n    },\n    getCachedTabList(): string[] {\n      return Array.from(this.cacheTabList);\n    },\n    getLastDragEndIndex(): number {\n      return this.lastDragEndIndex;\n    },\n  },\n  actions: {\n    /**\n     * Update the cache according to the currently opened tabs\n     */\n    async updateCacheTab() {\n      const cacheMap: Set<string> = new Set();\n      const allMenus = await getMenus();\n      for (const tab of this.tabList) {\n        const item = getRawRoute(tab);\n        // Ignore the cache\n        const needCache = !item.meta?.ignoreKeepAlive;\n        if (!needCache) {\n          continue;\n        }\n        // 代码逻辑说明: 【QQYUN-12348】online生成的菜单sql 自动带上组件名称\n        if (\n          ['OnlineAutoList', 'DefaultOnlineList', 'CgformErpList', 'OnlCgformInnerTableList', 'OnlCgformTabList', 'OnlCgReportList', 'GraphreportAutoChart', 'AutoDesformDataList'].includes(item.name as string) &&\n          allMenus?.length\n        ) {\n          const route = getMatchingRoute(allMenus, item.path);\n          if (route?.meta?.keepAlive) {\n            // 如果keepAlive为true，则添加到缓存中\n          } else {\n            continue;\n          }\n        }\n        const name = item.name as string;\n        cacheMap.add(name);\n      }\n      this.cacheTabList = cacheMap;\n    },\n\n    /**\n     * Refresh tabs\n     */\n    async refreshPage(router: Router) {\n      const { currentRoute } = router;\n      const route = unref(currentRoute);\n      const name = route.name;\n\n      const findTab = this.getCachedTabList.find((item) => item === name);\n      if (findTab) {\n        this.cacheTabList.delete(findTab);\n      }\n      const redo = useRedo(router);\n      await redo();\n    },\n    /**\n     * 修改设计模式\n     * changeDesign\n     */\n    async changeDesign(router: Router) {\n      const { currentRoute } = router;\n      const route = unref(currentRoute);\n      const name = route.name;\n\n      const findTab = this.getCachedTabList.find((item) => item === name);\n      if (findTab) {\n        this.cacheTabList.delete(findTab);\n      }\n      const redo = useRedo(router, { isDesign: true });\n      await redo();\n    },\n    clearCacheTabs(): void {\n      this.cacheTabList = new Set();\n    },\n    resetState(): void {\n      this.tabList = [];\n      this.clearCacheTabs();\n    },\n    goToPage(router: Router) {\n      const go = useGo(router);\n      const len = this.tabList.length;\n      const { path } = unref(router.currentRoute);\n\n      let toPath: PageEnum | string = PageEnum.BASE_HOME;\n\n      if (len > 0) {\n        const page = this.tabList[len - 1];\n        const p = page.fullPath || page.path;\n        if (p) {\n          toPath = p;\n        }\n      }\n      // Jump to the current page and report an error\n      path !== toPath && go(toPath as PageEnum, true);\n    },\n\n    async addTab(route: RouteLocationNormalized) {\n      const { path, name, fullPath, params, query, meta } = getRawRoute(route);\n      // 404  The page does not need to add a tab\n      if (\n        path === PageEnum.ERROR_PAGE ||\n        path === PageEnum.BASE_LOGIN ||\n        !name ||\n        [REDIRECT_ROUTE.name, PAGE_NOT_FOUND_NAME_404].includes(name as string)\n      ) {\n        return;\n      }\n\n      let updateIndex = -1;\n      // Existing pages, do not add tabs repeatedly\n      const tabHasExits = this.tabList.some((tab, index) => {\n        updateIndex = index;\n        return (tab.fullPath || tab.path) === (fullPath || path);\n      });\n\n      // If the tab already exists, perform the update operation\n      if (tabHasExits) {\n        const curTab = toRaw(this.tabList)[updateIndex];\n        if (!curTab) {\n          return;\n        }\n        curTab.params = params || curTab.params;\n        curTab.query = query || curTab.query;\n        curTab.fullPath = fullPath || curTab.fullPath;\n        this.tabList.splice(updateIndex, 1, curTab);\n      } else {\n        // 只比较path，忽略query\n        const findIndex = this.tabList.findIndex((tab) => tab.path === path);\n        const isTabExist = findIndex !== -1;\n        if (isTabExist) {\n          this.tabList.splice(findIndex, 1, route);\n          return;\n        }\n        // Add tab\n        // 获取动态路由打开数，超过 0 即代表需要控制打开数\n        const dynamicLevel = meta?.dynamicLevel ?? -1;\n        if (dynamicLevel > 0) {\n          // 如果动态路由层级大于 0 了，那么就要限制该路由的打开数限制了\n          // 首先获取到真实的路由，使用配置方式减少计算开销.\n          // const realName: string = path.match(/(\\S*)\\//)![1];\n          const realPath = meta?.realPath ?? '';\n          // 获取到已经打开的动态路由数, 判断是否大于某一个值\n          if (this.tabList.filter((e) => e.meta?.realPath ?? '' === realPath).length >= dynamicLevel) {\n            // 关闭第一个\n            const index = this.tabList.findIndex((item) => item.meta.realPath === realPath);\n            index !== -1 && this.tabList.splice(index, 1);\n          }\n        }\n        this.tabList.push(route);\n      }\n      this.updateCacheTab();\n      cacheTab && Persistent.setLocal(MULTIPLE_TABS_KEY, this.tabList);\n    },\n\n    async closeTab(tab: RouteLocationNormalized, router: Router) {\n      const close = (route: RouteLocationNormalized) => {\n        const { fullPath, meta: { affix } = {} } = route;\n        if (affix) {\n          return;\n        }\n        const index = this.tabList.findIndex((item) => item.fullPath === fullPath);\n        index !== -1 && this.tabList.splice(index, 1);\n      };\n\n      const { currentRoute, replace } = router;\n\n      const { path } = unref(currentRoute);\n      if (path !== tab.path) {\n        // Closed is not the activation tab\n        close(tab);\n        this.updateCacheTab();\n        return;\n      }\n\n      // Closed is activated atb\n      let toTarget: RouteLocationRaw = {};\n\n      const index = this.tabList.findIndex((item) => item.path === path);\n\n      // If the current is the leftmost tab\n      if (index === 0) {\n        // There is only one tab, then jump to the homepage, otherwise jump to the right tab\n        if (this.tabList.length === 1) {\n          const userStore = useUserStore();\n          toTarget = userStore.getUserInfo.homePath || PageEnum.BASE_HOME;\n        } else {\n          //  Jump to the right tab\n          const page = this.tabList[index + 1];\n          toTarget = getToTarget(page);\n        }\n      } else {\n        // Close the current tab\n        const page = this.tabList[index - 1];\n        toTarget = getToTarget(page);\n      }\n      close(currentRoute.value);\n      await replace(toTarget);\n    },\n\n    // Close according to key\n    async closeTabByKey(key: string, router: Router) {\n      const index = this.tabList.findIndex((item) => (item.fullPath || item.path) === key);\n      if (index !== -1) {\n        await this.closeTab(this.tabList[index], router);\n        const { currentRoute, replace } = router;\n        // 检查当前路由是否存在于tabList中\n        const isActivated = this.tabList.findIndex((item) => {\n          return item.fullPath === currentRoute.value.fullPath;\n        });\n        // 如果当前路由不存在于TabList中，尝试切换到其它路由\n        if (isActivated === -1) {\n          let pageIndex;\n          if (index > 0) {\n            pageIndex = index - 1;\n          } else if (index < this.tabList.length - 1) {\n            pageIndex = index + 1;\n          } else {\n            pageIndex = -1;\n          }\n          if (pageIndex >= 0) {\n            const page = this.tabList[index - 1];\n            const toTarget = getToTarget(page);\n            await replace(toTarget);\n          }\n        }\n      }\n    },\n\n    // Sort the tabs\n    async sortTabs(oldIndex: number, newIndex: number) {\n      const currentTab = this.tabList[oldIndex];\n      this.tabList.splice(oldIndex, 1);\n      this.tabList.splice(newIndex, 0, currentTab);\n      this.lastDragEndIndex = this.lastDragEndIndex + 1;\n    },\n\n    // Close the tab on the right and jump\n    async closeLeftTabs(route: RouteLocationNormalized, router: Router) {\n      const index = this.tabList.findIndex((item) => item.path === route.path);\n      let isCloseCurrentTab = false;\n      if (index > 0) {\n        const leftTabs = this.tabList.slice(0, index);\n        const pathList: string[] = [];\n        for (const item of leftTabs) {\n          const affix = item?.meta?.affix ?? false;\n          if (!affix) {\n            pathList.push(item.fullPath);\n          }\n        }\n        // 代码逻辑说明: 【TV360X-732】非当前页右键关闭左侧、关闭右侧、关闭其它功能正常使用\n        isCloseCurrentTab = closeTabContainCurrentRoute(router, pathList);\n        this.bulkCloseTabs(pathList);\n      }\n      this.updateCacheTab();\n      // 代码逻辑说明: 【TV360X-732】非当前页右键关闭左侧、关闭右侧、关闭其它功能正常使用\n      if (isCloseCurrentTab) {\n        handleGotoPage(router, route.path);\n      } else {\n        handleGotoPage(router);\n      }\n    },\n\n    // Close the tab on the left and jump\n    async closeRightTabs(route: RouteLocationNormalized, router: Router) {\n      const index = this.tabList.findIndex((item) => item.fullPath === route.fullPath);\n      let isCloseCurrentTab = false;\n      if (index >= 0 && index < this.tabList.length - 1) {\n        const rightTabs = this.tabList.slice(index + 1, this.tabList.length);\n\n        const pathList: string[] = [];\n        for (const item of rightTabs) {\n          const affix = item?.meta?.affix ?? false;\n          if (!affix) {\n            pathList.push(item.fullPath);\n          }\n        }\n        // 代码逻辑说明: 【TV360X-732】非当前页右键关闭左侧、关闭右侧、关闭其它功能正常使用\n        isCloseCurrentTab = closeTabContainCurrentRoute(router, pathList);\n        this.bulkCloseTabs(pathList);\n      }\n      this.updateCacheTab();\n      // 代码逻辑说明: 【TV360X-732】非当前页右键关闭左侧、关闭右侧、关闭其它功能正常使用\n      if (isCloseCurrentTab) {\n        handleGotoPage(router, route.path);\n      } else {\n        handleGotoPage(router);\n      }\n    },\n\n    async closeAllTab(router: Router) {\n      this.tabList = this.tabList.filter((item) => item?.meta?.affix ?? false);\n      this.clearCacheTabs();\n      this.goToPage(router);\n    },\n\n\n    /**\n     * Close other tabs\n     */\n    async closeOtherTabs(route: RouteLocationNormalized, router: Router) {\n      const closePathList = this.tabList.map((item) => item.fullPath);\n      let isCloseCurrentTab = false;\n      const pathList: string[] = [];\n\n      for (const path of closePathList) {\n        if (path !== route.fullPath) {\n          const closeItem = this.tabList.find((item) => item.path === path);\n          if (!closeItem) {\n            continue;\n          }\n          const affix = closeItem?.meta?.affix ?? false;\n          if (!affix) {\n            pathList.push(closeItem.fullPath);\n          }\n        }\n      }\n      isCloseCurrentTab = closeTabContainCurrentRoute(router, pathList);\n      this.bulkCloseTabs(pathList);\n      this.updateCacheTab();\n      // 代码逻辑说明: 【TV360X-732】非当前页右键关闭左侧、关闭右侧、关闭其它功能正常使用\n      if (isCloseCurrentTab) {\n        handleGotoPage(router, route.path);\n      } else {\n        handleGotoPage(router);\n      }\n    },\n\n    /**\n     * Close tabs in bulk\n     */\n    async bulkCloseTabs(pathList: string[]) {\n      this.tabList = this.tabList.filter((item) => !pathList.includes(item.fullPath));\n    },\n\n    /**\n     * Set tab's title\n     */\n    async setTabTitle(title: string, route: RouteLocationNormalized) {\n      const findTab = this.getTabList.find((item) => item === route);\n      if (findTab) {\n        findTab.meta.title = title;\n        await this.updateCacheTab();\n      }\n    },\n    /**\n     * replace tab's path\n     * **/\n    async updateTabPath(fullPath: string, route: RouteLocationNormalized) {\n      const findTab = this.getTabList.find((item) => item === route);\n      if (findTab) {\n        findTab.fullPath = fullPath;\n        findTab.path = fullPath;\n        await this.updateCacheTab();\n      }\n    },\n    setRedirectPageParam(data) {\n      this.redirectPageParam = data;\n    },\n    getRedirectPageParam() {\n      return this.redirectPageParam;\n    },\n  },\n});\n\n// Need to be used outside the setup\nexport function useMultipleTabWithOutStore() {\n  return useMultipleTabStore(store);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/store/modules/permission.ts",
    "content": "import type { AppRouteRecordRaw, Menu } from '/@/router/types';\n\nimport { defineStore } from 'pinia';\nimport { store } from '/@/store';\nimport { useI18n } from '/@/hooks/web/useI18n';\nimport { useUserStore } from './user';\nimport { useAppStoreWithOut } from './app';\nimport { toRaw } from 'vue';\nimport { transformObjToRoute, flatMultiLevelRoutes, addSlashToRouteComponent } from '/@/router/helper/routeHelper';\nimport { transformRouteToMenu } from '/@/router/helper/menuHelper';\n\nimport projectSetting from '/@/settings/projectSetting';\n\nimport { PermissionModeEnum } from '/@/enums/appEnum';\n\nimport { asyncRoutes } from '/@/router/routes';\nimport { ERROR_LOG_ROUTE, PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic';\nimport { staticRoutesList } from '../../router/routes/staticRouter';\n\nimport { filter } from '/@/utils/helper/treeHelper';\n\nimport { getBackMenuAndPerms } from '/@/api/sys/menu';\n\nimport { useMessage } from '/@/hooks/web/useMessage';\nimport { PageEnum } from '/@/enums/pageEnum';\n\n// 系统权限\ninterface AuthItem {\n  // 菜单权限编码，例如：“sys:schedule:list,sys:schedule:info”,多个逗号隔开\n  action: string;\n  // 权限策略1显示2禁用\n  type: string | number;\n  // 权限状态(0无效1有效)\n  status: string | number;\n  // 权限名称\n  describe?: string;\n  isAuth?: boolean;\n}\n\ninterface PermissionState {\n  // Permission code list\n  permCodeList: string[] | number[];\n  // Whether the route has been dynamically added\n  isDynamicAddedRoute: boolean;\n  // To trigger a menu update\n  lastBuildMenuTime: number;\n  // Backstage menu list\n  backMenuList: Menu[];\n  frontMenuList: Menu[];\n  // 用户所拥有的权限\n  authList: AuthItem[];\n  // 全部权限配置\n  allAuthList: AuthItem[];\n  // 系统安全模式\n  sysSafeMode: boolean;\n  // online子表按钮权限\n  onlineSubTableAuthMap: object;\n}\nexport const usePermissionStore = defineStore({\n  id: 'app-permission',\n  state: (): PermissionState => ({\n    permCodeList: [],\n    // Whether the route has been dynamically added\n    isDynamicAddedRoute: false,\n    // To trigger a menu update\n    lastBuildMenuTime: 0,\n    // Backstage menu list\n    backMenuList: [],\n    // menu List\n    frontMenuList: [],\n    authList: [],\n    allAuthList: [],\n    sysSafeMode: false,\n    onlineSubTableAuthMap: {},\n  }),\n  getters: {\n    getPermCodeList(): string[] | number[] {\n      return this.permCodeList;\n    },\n    getBackMenuList(): Menu[] {\n      return this.backMenuList;\n    },\n    getFrontMenuList(): Menu[] {\n      return this.frontMenuList;\n    },\n    getLastBuildMenuTime(): number {\n      return this.lastBuildMenuTime;\n    },\n    getIsDynamicAddedRoute(): boolean {\n      return this.isDynamicAddedRoute;\n    },\n\n    // 代码逻辑说明: VUEN-1162 子表按钮没控制\n    getOnlineSubTableAuth: (state) => {\n      return (code) => state.onlineSubTableAuthMap[code];\n    },\n  },\n  actions: {\n    setPermCodeList(codeList: string[]) {\n      this.permCodeList = codeList;\n    },\n\n    setBackMenuList(list: Menu[]) {\n      this.backMenuList = list;\n      list?.length > 0 && this.setLastBuildMenuTime();\n    },\n\n    setFrontMenuList(list: Menu[]) {\n      this.frontMenuList = list;\n    },\n\n    setLastBuildMenuTime() {\n      this.lastBuildMenuTime = new Date().getTime();\n    },\n\n    setDynamicAddedRoute(added: boolean) {\n      this.isDynamicAddedRoute = added;\n    },\n    resetState(): void {\n      this.isDynamicAddedRoute = false;\n      this.permCodeList = [];\n      this.backMenuList = [];\n      this.lastBuildMenuTime = 0;\n    },\n    async changePermissionCode() {\n      const systemPermission = await getBackMenuAndPerms();\n      const codeList = systemPermission.codeList;\n      this.setPermCodeList(codeList);\n      this.setAuthData(systemPermission);\n      \n      //菜单路由\n      const routeList = systemPermission.menu;\n      return routeList;\n    },\n    async buildRoutesAction(): Promise<AppRouteRecordRaw[]> {\n      const { t } = useI18n();\n      const userStore = useUserStore();\n      const appStore = useAppStoreWithOut();\n\n      let routes: AppRouteRecordRaw[] = [];\n      const roleList = toRaw(userStore.getRoleList) || [];\n      const { permissionMode = projectSetting.permissionMode } = appStore.getProjectConfig;\n\n      const routeFilter = (route: AppRouteRecordRaw) => {\n        const { meta } = route;\n        const { roles } = meta || {};\n        if (!roles) return true;\n        return roleList.some((role) => roles.includes(role));\n      };\n\n      const routeRemoveIgnoreFilter = (route: AppRouteRecordRaw) => {\n        const { meta } = route;\n        const { ignoreRoute } = meta || {};\n        return !ignoreRoute;\n      };\n\n      /**\n       * @description 根据设置的首页path，修正routes中的affix标记（固定首页）\n       * */\n      const patchHomeAffix = (routes: AppRouteRecordRaw[]) => {\n        if (!routes || routes.length === 0) return;\n        let homePath: string = userStore.getUserInfo.homePath || PageEnum.BASE_HOME;\n        function patcher(routes: AppRouteRecordRaw[], parentPath = '') {\n          if (parentPath) parentPath = parentPath + '/';\n          routes.forEach((route: AppRouteRecordRaw) => {\n            const { path, children, redirect } = route;\n            const currentPath = path.startsWith('/') ? path : parentPath + path;\n            if (currentPath === homePath) {\n              if (redirect) {\n                homePath = route.redirect! as string;\n              } else {\n                route.meta = Object.assign({}, route.meta, { affix: true });\n                throw new Error('end');\n              }\n            }\n            children && children.length > 0 && patcher(children, currentPath);\n          });\n        }\n        try {\n          patcher(routes);\n        } catch (e) {\n          // 已处理完毕跳出循环\n        }\n        return;\n      };\n\n      switch (permissionMode) {\n        case PermissionModeEnum.ROLE:\n          routes = filter(asyncRoutes, routeFilter);\n          routes = routes.filter(routeFilter);\n          //  将多级路由转换为二级\n          routes = flatMultiLevelRoutes(routes);\n          break;\n\n        case PermissionModeEnum.ROUTE_MAPPING:\n          routes = filter(asyncRoutes, routeFilter);\n          routes = routes.filter(routeFilter);\n          const menuList = transformRouteToMenu(routes, true);\n          routes = filter(routes, routeRemoveIgnoreFilter);\n          routes = routes.filter(routeRemoveIgnoreFilter);\n          menuList.sort((a, b) => {\n            return (a.meta?.orderNo || 0) - (b.meta?.orderNo || 0);\n          });\n\n          this.setFrontMenuList(menuList);\n          // 将多级路由转换为二级\n          routes = flatMultiLevelRoutes(routes);\n          break;\n\n        // 后台菜单构建\n        case PermissionModeEnum.BACK:\n          const { createMessage, createWarningModal } = useMessage();\n          console.log(\" --- 构建后台路由菜单 --- \")\n          // 菜单加载提示\n          // createMessage.loading({\n          //   content: t('sys.app.menuLoading'),\n          //   duration: 1,\n          // });\n\n          // 从后台获取权限码，\n          // 这个函数可能只需要执行一次，并且实际的项目可以在正确的时间被放置\n          let routeList: AppRouteRecordRaw[] = [];\n          try {\n            routeList = await this.changePermissionCode();\n            //routeList = (await getMenuList()) as AppRouteRecordRaw[];\n            // let hasIndex: boolean = false;\n            // let hasIcon: boolean = false;\n            // for (let menuItem of routeList) {\n            //   // 条件1：判断组件是否是 layouts/default/index\n            //   if (!hasIndex) {\n            //     hasIndex = menuItem.component === 'layouts/default/index';\n            //   }\n            //   // 条件2：判断图标是否带有 冒号\n            //   if (!hasIcon) {\n            //     hasIcon = !!menuItem.meta?.icon?.includes(':');\n            //   }\n            //   // 满足任何一个条件都直接跳出循环\n            //   if (hasIcon || hasIndex) {\n            //     break;\n            //   }\n            // }\n            // // 两个条件都不满足，就弹出提示框\n            // if (!hasIcon && !hasIndex) {\n            //   // 延迟1.5秒之后再出现提示，否则提示框出不来\n            //   setTimeout(\n            //     () =>\n            //       createWarningModal({\n            //         title: '检测提示',\n            //         content:\n            //           '当前菜单表是 <b>Vue2版本</b>，导致菜单加载异常!<br>点击确认，切换到Vue3版菜单！',\n            //         onOk:function () {\n            //           switchVue3Menu();\n            //           location.reload();\n            //         }\n            //       }),\n            //     100\n            //   );\n            // }\n          } catch (error) {\n            console.error(error);\n          }\n          // 组件地址前加斜杠处理  author: lsq date:2021-09-08\n          routeList = addSlashToRouteComponent(routeList);\n          // 动态引入组件\n          routeList = transformObjToRoute(routeList);\n\n          // 构建后台路由菜单\n          const backMenuList = transformRouteToMenu(routeList);\n          this.setBackMenuList(backMenuList);\n\n          // 删除meta.ignoreRoute项\n          routeList = filter(routeList, routeRemoveIgnoreFilter);\n          routeList = routeList.filter(routeRemoveIgnoreFilter);\n\n          routeList = flatMultiLevelRoutes(routeList);\n          // 代码逻辑说明: 【TV360X-522】ai助手路由写死在前端\n          routes = [PAGE_NOT_FOUND_ROUTE, ...routeList, ...staticRoutesList];\n          break;\n      }\n\n      routes.push(ERROR_LOG_ROUTE);\n      patchHomeAffix(routes);\n      return routes;\n    },\n    setAuthData(systemPermission) {\n      this.authList = systemPermission.auth;\n      this.allAuthList = systemPermission.allAuth;\n      this.sysSafeMode = systemPermission.sysSafeMode;\n    },\n    setAuthList(authList: AuthItem[]) {\n      this.authList = authList;\n    },\n    setAllAuthList(authList: AuthItem[]) {\n      this.allAuthList = authList;\n    },\n\n    // 代码逻辑说明: VUEN-1162 子表按钮没控制\n    setOnlineSubTableAuth(code, hideBtnList) {\n      this.onlineSubTableAuthMap[code] = hideBtnList;\n    },\n  },\n});\n\n// 需要在设置之外使用\nexport function usePermissionStoreWithOut() {\n  return usePermissionStore(store);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/store/modules/user.ts",
    "content": "import type { UserInfo, LoginInfo } from '/#/store';\nimport type { ErrorMessageMode } from '/#/axios';\nimport { defineStore } from 'pinia';\nimport { store } from '/@/store';\nimport { RoleEnum } from '/@/enums/roleEnum';\nimport { PageEnum } from '/@/enums/pageEnum';\nimport { ROLES_KEY, TOKEN_KEY, USER_INFO_KEY, LOGIN_INFO_KEY, DB_DICT_DATA_KEY, TENANT_ID, OAUTH2_THIRD_LOGIN_TENANT_ID } from '/@/enums/cacheEnum';\nimport { getAuthCache, setAuthCache, removeAuthCache } from '/@/utils/auth';\nimport { GetUserInfoModel, LoginParams, ThirdLoginParams } from '/@/api/sys/model/userModel';\nimport { doLogout, getUserInfo, loginApi, phoneLoginApi, thirdLogin } from '/@/api/sys/user';\nimport { useI18n } from '/@/hooks/web/useI18n';\nimport { useMessage } from '/@/hooks/web/useMessage';\nimport { router } from '/@/router';\nimport { usePermissionStore } from '/@/store/modules/permission';\nimport { RouteRecordRaw } from 'vue-router';\nimport { PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic';\nimport { isArray } from '/@/utils/is';\nimport { useGlobSetting } from '/@/hooks/setting';\nimport { JDragConfigEnum } from '/@/enums/jeecgEnum';\nimport { useSso } from '/@/hooks/web/useSso';\nimport { isOAuth2AppEnv } from \"/@/views/sys/login/useLogin\";\nimport { getUrlParam } from \"@/utils\";\ninterface dictType {\n  [key: string]: any;\n}\ninterface UserState {\n  userInfo: Nullable<UserInfo>;\n  token?: string;\n  roleList: RoleEnum[];\n  dictItems?: dictType | null;\n  sessionTimeout?: boolean;\n  lastUpdateTime: number;\n  tenantid?: string | number;\n  shareTenantId?: Nullable<string | number>;\n  loginInfo?: Nullable<LoginInfo>;\n}\n\nexport const useUserStore = defineStore({\n  id: 'app-user',\n  state: (): UserState => ({\n    // 用户信息\n    userInfo: null,\n    // token\n    token: undefined,\n    // 角色列表\n    roleList: [],\n    // 字典\n    dictItems: null,\n    // session过期时间\n    sessionTimeout: false,\n    // Last fetch time\n    lastUpdateTime: 0,\n    //租户id\n    tenantid: '',\n    // 分享租户ID\n    // 用于分享页面所属租户与当前用户登录租户不一致的情况\n    shareTenantId: null,\n    //登录返回信息\n    loginInfo: null,\n  }),\n  getters: {\n    getUserInfo(): UserInfo {\n      if(this.userInfo == null){\n        this.userInfo = getAuthCache<UserInfo>(USER_INFO_KEY)!=null ? getAuthCache<UserInfo>(USER_INFO_KEY) : null;\n      }\n      return this.userInfo || getAuthCache<UserInfo>(USER_INFO_KEY) || {};\n    },\n    getLoginInfo(): LoginInfo {\n      return this.loginInfo || getAuthCache<LoginInfo>(LOGIN_INFO_KEY) || {};\n    },\n    getToken(): string {\n      return this.token || getAuthCache<string>(TOKEN_KEY);\n    },\n    getAllDictItems(): [] {\n      return this.dictItems || getAuthCache(DB_DICT_DATA_KEY);\n    },\n    getRoleList(): RoleEnum[] {\n      return this.roleList.length > 0 ? this.roleList : getAuthCache<RoleEnum[]>(ROLES_KEY);\n    },\n    getSessionTimeout(): boolean {\n      return !!this.sessionTimeout;\n    },\n    getLastUpdateTime(): number {\n      return this.lastUpdateTime;\n    },\n    getTenant(): string | number {\n      return this.tenantid || getAuthCache<string | number>(TENANT_ID);\n    },\n    // 是否有分享租户id\n    hasShareTenantId(): boolean {\n      return this.shareTenantId != null && this.shareTenantId !== '';\n    },\n  },\n  actions: {\n    setToken(info: string | undefined) {\n      this.token = info ? info : ''; // for null or undefined value\n      setAuthCache(TOKEN_KEY, info);\n    },\n    setRoleList(roleList: RoleEnum[]) {\n      this.roleList = roleList;\n      setAuthCache(ROLES_KEY, roleList);\n    },\n    setUserInfo(info: UserInfo | null) {\n      this.userInfo = info;\n      this.lastUpdateTime = new Date().getTime();\n      setAuthCache(USER_INFO_KEY, info);\n    },\n    setLoginInfo(info: LoginInfo | null) {\n      this.loginInfo = info;\n      setAuthCache(LOGIN_INFO_KEY, info);\n    },\n    setAllDictItems(dictItems) {\n      this.dictItems = dictItems;\n      setAuthCache(DB_DICT_DATA_KEY, dictItems);\n    },\n    setAllDictItemsByLocal() {\n      // 代码逻辑说明: 【QQYUN-8572】表格行选择卡顿问题（customRender中字典引起的）\n      if (!this.dictItems) {\n        const allDictItems = getAuthCache(DB_DICT_DATA_KEY);\n        if (allDictItems) {\n          this.dictItems = allDictItems;\n        }\n      }\n    },\n    setTenant(id) {\n      this.tenantid = id;\n      setAuthCache(TENANT_ID, id);\n    },\n    setShareTenantId(id: NonNullable<typeof this.shareTenantId>) {\n      this.shareTenantId = id;\n    },\n    setSessionTimeout(flag: boolean) {\n      this.sessionTimeout = flag;\n    },\n    resetState() {\n      this.userInfo = null;\n      this.dictItems = null;\n      this.token = '';\n      this.roleList = [];\n      this.sessionTimeout = false;\n    },\n    /**\n     * 登录事件\n     */\n    async login(\n      params: LoginParams & {\n        goHome?: boolean;\n        mode?: ErrorMessageMode;\n      }\n    ): Promise<GetUserInfoModel | null> {\n      try {\n        const { goHome = true, mode, ...loginParams } = params;\n        const data = await loginApi(loginParams, mode);\n        const { token, userInfo } = data;\n        // save token\n        this.setToken(token);\n        this.setTenant(userInfo.loginTenantId);\n        return this.afterLoginAction(goHome, data);\n      } catch (error) {\n        return Promise.reject(error);\n      }\n    },\n    /**\n     * 扫码登录事件\n     */\n    async qrCodeLogin(token): Promise<GetUserInfoModel | null> {\n      try {\n        // save token\n        this.setToken(token);\n        return this.afterLoginAction(true, {});\n      } catch (error) {\n        return Promise.reject(error);\n      }\n    },\n    /**\n     * 登录完成处理\n     * @param goHome\n     */\n    async afterLoginAction(goHome?: boolean, data?: any): Promise<any | null> {\n      if (!this.getToken) return null;\n      //获取用户信息\n      const userInfo = await this.getUserInfoAction();\n      const sessionTimeout = this.sessionTimeout;\n      if (sessionTimeout) {\n        this.setSessionTimeout(false);\n      } else {\n        // // 构建后台菜单路由\n        // const permissionStore = usePermissionStore();\n        // if (!permissionStore.isDynamicAddedRoute) {\n        //   const routes = await permissionStore.buildRoutesAction();\n        //   routes.forEach((route) => {\n        //     router.addRoute(route as unknown as RouteRecordRaw);\n        //   });\n        //   router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw);\n        //   permissionStore.setDynamicAddedRoute(true);\n        // }\n        \n        await this.setLoginInfo({ ...data, isLogin: true });\n        // 代码逻辑说明: 登录成功后缓存拖拽模块的接口前缀\n        localStorage.setItem(JDragConfigEnum.DRAG_BASE_URL, useGlobSetting().domainUrl);\n\n        // 代码逻辑说明: 修复登录成功后，没有正确重定向的问题\n        let redirect = router.currentRoute.value?.query?.redirect as string;\n        // 判断是否有 redirect 重定向地址\n        // 代码逻辑说明: 【QQYUN-5195】登录之后直接刷新页面导致没有进入创建组织页面------------\n        if (redirect && goHome) {\n          // router.options.history.base可替代之前的publicPath\n          // 当前页面打开\n          window.open(`${router.options.history.base}${redirect}`, '_self');\n          return data;\n        }\n\n        // 代码逻辑说明: 【issues/1102】设置单点登录后页面，进入首页提示404，也没有绘制侧边栏 #1102---\n        let ticket = getUrlParam('ticket');\n        if(ticket){\n          goHome && (window.location.replace((userInfo && userInfo.homePath) || PageEnum.BASE_HOME));\n        }else{\n          goHome && (await router.replace((userInfo && userInfo.homePath) || PageEnum.BASE_HOME));\n        }\n      }\n      return data;\n    },\n    /**\n     * 手机号登录\n     * @param params\n     */\n    async phoneLogin(\n      params: LoginParams & {\n        goHome?: boolean;\n        mode?: ErrorMessageMode;\n      }\n    ): Promise<GetUserInfoModel | null> {\n      try {\n        const { goHome = true, mode, ...loginParams } = params;\n        const data = await phoneLoginApi(loginParams, mode);\n        // 代码逻辑说明: 【issues/7488】手机号码登录，在请求头中无法获取租户id---\n        const { token , userInfo } = data;\n        this.setTenant(userInfo!.loginTenantId);\n        // save token\n        this.setToken(token);\n        return this.afterLoginAction(goHome, data);\n      } catch (error) {\n        return Promise.reject(error);\n      }\n    },\n    /**\n     * 获取用户信息\n     */\n    async getUserInfoAction(): Promise<UserInfo | null> {\n      if (!this.getToken) {\n        return null;\n      }\n      const { userInfo, sysAllDictItems } = await getUserInfo();\n      if (userInfo) {\n        const { roles = [] } = userInfo;\n        if (isArray(roles)) {\n          const roleList = roles.map((item) => item.value) as RoleEnum[];\n          this.setRoleList(roleList);\n        } else {\n          userInfo.roles = [];\n          this.setRoleList([]);\n        }\n        this.setUserInfo(userInfo);\n      }\n      /**\n       * 添加字典信息到缓存\n       * @updateBy:lsq\n       * @updateDate:2021-09-08\n       */\n      if (sysAllDictItems) {\n        this.setAllDictItems(sysAllDictItems);\n      }\n      return userInfo;\n    },\n    /**\n     * 退出登录\n     */\n    async logout(goLogin = false) {\n      if (this.getToken) {\n        try {\n          await doLogout();\n        } catch {\n          console.log('注销Token失败');\n        }\n      }\n\n      // let username:any = this.userInfo && this.userInfo.username;\n      // if(username){\n      //   removeAuthCache(username)\n      // }\n\n      this.setToken('');\n      setAuthCache(TOKEN_KEY, null);\n      this.setSessionTimeout(false);\n      this.setUserInfo(null);\n      this.setLoginInfo(null);\n      this.setTenant(null);\n      // 代码逻辑说明: 【TV360X-23】退出登录后会提示「Token时效，请重新登录」\n      setTimeout(() => {\n        this.setAllDictItems(null);\n      }, 1e3);\n      // 代码逻辑说明: 退出登录后清除拖拽模块的接口前缀\n      localStorage.removeItem(JDragConfigEnum.DRAG_BASE_URL);\n\n      //如果开启单点登录,则跳转到单点统一登录中心\n      const openSso = useGlobSetting().openSso;\n      if (openSso == 'true') {\n        await useSso().ssoLoginOut();\n      }\n      //退出登录的时候需要用的应用id\n      if(isOAuth2AppEnv()){\n        let tenantId = getAuthCache(OAUTH2_THIRD_LOGIN_TENANT_ID);\n        removeAuthCache(OAUTH2_THIRD_LOGIN_TENANT_ID);\n        goLogin && await router.push({ name:\"Login\",query:{ tenantId:tenantId }})\n      }else{\n        // 代码逻辑说明: 修复登录成功后，没有正确重定向的问题\n        goLogin && (await router.push({\n          path: PageEnum.BASE_LOGIN,\n          query: {\n            // 传入当前的路由，登录成功后跳转到当前路由\n            redirect: router.currentRoute.value.fullPath,\n          }\n        }));\n\n      }\n    },\n    /**\n     * 登录事件\n     */\n    async ThirdLogin(\n      params: ThirdLoginParams & {\n        goHome?: boolean;\n        mode?: ErrorMessageMode;\n      }\n    ): Promise<any | null> {\n      try {\n        const { goHome = true, mode, ...ThirdLoginParams } = params;\n        const data = await thirdLogin(ThirdLoginParams, mode);\n        // 代码逻辑说明: 【issues/6652】开启租户数据隔离，接入钉钉后登录默认租户为0了---\n        const { token, userInfo } = data;\n        this.setTenant(userInfo?.loginTenantId);\n        // save token\n        this.setToken(token);\n        return this.afterLoginAction(goHome, data);\n      } catch (error) {\n        return Promise.reject(error);\n      }\n    },\n    /**\n     * 退出询问\n     */\n    confirmLoginOut() {\n      const { createConfirm } = useMessage();\n      const { t } = useI18n();\n      createConfirm({\n        iconType: 'warning',\n        title: t('sys.app.logoutTip'),\n        content: t('sys.app.logoutMessage'),\n        onOk: async () => {\n          await this.logout(true);\n        },\n      });\n    },\n  },\n});\n\n// Need to be used outside the setup\nexport function useUserStoreWithOut() {\n  return useUserStore(store);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/areaData/pcaUtils.ts",
    "content": "import {areaList} from '@vant/area-data'\nimport {freezeDeep} from \"@/utils/common/compUtils\";\n\n// 扁平化的省市区数据\nexport const pcaa = freezeDeep(usePlatPcaaData())\n\n/**\n * 获取扁平化的省市区数据\n */\nfunction usePlatPcaaData() {\n  const {city_list: city, county_list: county, province_list: province} = areaList;\n  const dataMap = new Map<string, Recordable>()\n  const flatData: Recordable = {'86': province}\n  // 省\n  Object.keys(province).forEach((code) => {\n    flatData[code] = {}\n    dataMap.set(code.slice(0, 2), flatData[code])\n  })\n  // 市区\n  Object.keys(city).forEach((code) => {\n    flatData[code] = {}\n    dataMap.set(code.slice(0, 4), flatData[code])\n    // 填充上一级\n    const getProvince = dataMap.get(code.slice(0, 2))\n    if (getProvince) {\n      getProvince[code] = city[code]\n    }\n  });\n  // 县\n  Object.keys(county).forEach((code) => {\n    // 填充上一级\n    const getCity = dataMap.get(code.slice(0, 4))\n    if (getCity) {\n      getCity[code] = county[code]\n    }\n  });\n  return flatData\n}"
  },
  {
    "path": "jeecgboot-vue3/src/utils/auth/index.ts",
    "content": "import { Persistent, BasicKeys } from '/@/utils/cache/persistent';\nimport { CacheTypeEnum } from '/@/enums/cacheEnum';\nimport projectSetting from '/@/settings/projectSetting';\nimport { TOKEN_KEY, LOGIN_INFO_KEY, TENANT_ID } from '/@/enums/cacheEnum';\n\nconst { permissionCacheType } = projectSetting;\nconst isLocal = permissionCacheType === CacheTypeEnum.LOCAL;\n\n/**\n * 获取token\n */\nexport function getToken() {\n  return getAuthCache<string>(TOKEN_KEY);\n}\n/**\n * 获取登录信息\n */\nexport function getLoginBackInfo() {\n  return getAuthCache(LOGIN_INFO_KEY);\n}\n/**\n * 获取租户id\n */\nexport function getTenantId() {\n  return getAuthCache<string>(TENANT_ID);\n}\n\nexport function getAuthCache<T>(key: BasicKeys) {\n  const fn = isLocal ? Persistent.getLocal : Persistent.getSession;\n  return fn(key) as T;\n}\n\nexport function setAuthCache(key: BasicKeys, value) {\n  const fn = isLocal ? Persistent.setLocal : Persistent.setSession;\n  return fn(key, value, true);\n}\n\n/**\n * 设置动态key\n * @param key\n * @param value\n */\nexport function setCacheByDynKey(key, value) {\n  const fn = isLocal ? Persistent.setLocal : Persistent.setSession;\n  return fn(key, value, true);\n}\n\n/**\n * 获取动态key\n * @param key\n */\nexport function getCacheByDynKey<T>(key) {\n  const fn = isLocal ? Persistent.getLocal : Persistent.getSession;\n  return fn(key) as T;\n}\n\n/**\n * 移除动态key\n * @param key\n */\nexport function removeCacheByDynKey<T>(key) {\n  const fn = isLocal ? Persistent.removeLocal : Persistent.removeSession;\n  return fn(key) as T;\n}\n/**\n * 移除缓存中的某个属性\n * @param key\n * @update:移除缓存中的某个属性\n * @updateBy:lsq\n * @updateDate:2021-09-07\n */\nexport function removeAuthCache<T>(key: BasicKeys) {\n  const fn = isLocal ? Persistent.removeLocal : Persistent.removeSession;\n  return fn(key) as T;\n}\n\nexport function clearAuthCache(immediate = true) {\n  const fn = isLocal ? Persistent.clearLocal : Persistent.clearSession;\n  return fn(immediate);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/bem.ts",
    "content": "import { prefixCls } from '/@/settings/designSetting';\n\ntype Mod = string | { [key: string]: any };\ntype Mods = Mod | Mod[];\n\nexport type BEM = ReturnType<typeof createBEM>;\n\nfunction genBem(name: string, mods?: Mods): string {\n  if (!mods) {\n    return '';\n  }\n\n  if (typeof mods === 'string') {\n    return ` ${name}--${mods}`;\n  }\n\n  if (Array.isArray(mods)) {\n    return mods.reduce<string>((ret, item) => ret + genBem(name, item), '');\n  }\n\n  return Object.keys(mods).reduce((ret, key) => ret + (mods[key] ? genBem(name, key) : ''), '');\n}\n\n/**\n * bem helper\n * b() // 'button'\n * b('text') // 'button__text'\n * b({ disabled }) // 'button button--disabled'\n * b('text', { disabled }) // 'button__text button__text--disabled'\n * b(['disabled', 'primary']) // 'button button--disabled button--primary'\n */\nexport function buildBEM(name: string) {\n  return (el?: Mods, mods?: Mods): Mods => {\n    if (el && typeof el !== 'string') {\n      mods = el;\n      el = '';\n    }\n\n    el = el ? `${name}__${el}` : name;\n\n    return `${el}${genBem(el, mods)}`;\n  };\n}\n\nexport function createBEM(name: string) {\n  return [buildBEM(`${prefixCls}-${name}`)];\n}\n\nexport function createNamespace(name: string) {\n  const prefixedName = `${prefixCls}-${name}`;\n  return [prefixedName, buildBEM(prefixedName)] as const;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/browser.js",
    "content": "//判断是否IE<11浏览器\nexport function isIE() {\n  return navigator.userAgent.indexOf('compatible') > -1 && navigator.userAgent.indexOf('MSIE') > -1;\n}\n\nexport function isIE11() {\n  return navigator.userAgent.indexOf('Trident') > -1 && navigator.userAgent.indexOf('rv:11.0') > -1;\n}\n\n//判断是否IE的Edge浏览器\nexport function isEdge() {\n  return navigator.userAgent.indexOf('Edge') > -1 && !isIE();\n}\n\nexport function getIEVersion() {\n  let userAgent = navigator.userAgent; //取得浏览器的userAgent字符串\n  let isIE = isIE();\n  let isIE11 = isIE11();\n  let isEdge = isEdge();\n\n  if (isIE) {\n    let reIE = new RegExp('MSIE (\\\\d+\\\\.\\\\d+);');\n    reIE.test(userAgent);\n    let fIEVersion = parseFloat(RegExp['$1']);\n    if (fIEVersion === 7 || fIEVersion === 8 || fIEVersion === 9 || fIEVersion === 10) {\n      return fIEVersion;\n    } else {\n      return 6; //IE版本<7\n    }\n  } else if (isEdge) {\n    return 'edge';\n  } else if (isIE11) {\n    return 11;\n  } else {\n    return -1;\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/cache/index.ts",
    "content": "import { getStorageShortName } from '/@/utils/env';\nimport { createStorage as create, CreateStorageParams } from './storageCache';\nimport { enableStorageEncryption } from '/@/settings/encryptionSetting';\nimport { DEFAULT_CACHE_TIME } from '/@/settings/encryptionSetting';\n\nexport type Options = Partial<CreateStorageParams>;\n\nconst createOptions = (storage: Storage, options: Options = {}): Options => {\n  return {\n    // No encryption in debug mode\n    hasEncrypt: enableStorageEncryption,\n    storage,\n    prefixKey: getStorageShortName(),\n    ...options,\n  };\n};\n\nexport const WebStorage = create(createOptions(sessionStorage));\n\nexport const createStorage = (storage: Storage = sessionStorage, options: Options = {}) => {\n  return create(createOptions(storage, options));\n};\n\nexport const createSessionStorage = (options: Options = {}) => {\n  return createStorage(sessionStorage, { ...options, timeout: DEFAULT_CACHE_TIME });\n};\n\nexport const createLocalStorage = (options: Options = {}) => {\n  return createStorage(localStorage, { ...options, timeout: DEFAULT_CACHE_TIME });\n};\n\nexport default WebStorage;\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/cache/memory.ts",
    "content": "import { TOKEN_KEY, ROLES_KEY, USER_INFO_KEY, DB_DICT_DATA_KEY, TENANT_ID, LOGIN_INFO_KEY, PROJ_CFG_KEY } from '/@/enums/cacheEnum';\nimport { omit } from 'lodash-es';\n\nexport interface Cache<V = any> {\n  value?: V;\n  timeoutId?: ReturnType<typeof setTimeout>;\n  time?: number;\n  alive?: number;\n}\n\nconst NOT_ALIVE = 0;\n\nexport class Memory<T = any, V = any> {\n  private cache: { [key in keyof T]?: Cache<V> } = {};\n  private alive: number;\n\n  constructor(alive = NOT_ALIVE) {\n    // Unit second\n    this.alive = alive * 1000;\n  }\n\n  get getCache() {\n    return this.cache;\n  }\n\n  setCache(cache) {\n    this.cache = cache;\n  }\n\n  // get<K extends keyof T>(key: K) {\n  //   const item = this.getItem(key);\n  //   const time = item?.time;\n  //   if (!isNullOrUnDef(time) && time < new Date().getTime()) {\n  //     this.remove(key);\n  //   }\n  //   return item?.value ?? undefined;\n  // }\n\n  get<K extends keyof T>(key: K) {\n    return this.cache[key];\n  }\n\n  set<K extends keyof T>(key: K, value: V, expires?: number) {\n    let item = this.get(key);\n\n    if (!expires || (expires as number) <= 0) {\n      expires = this.alive;\n    }\n    if (item) {\n      if (item.timeoutId) {\n        clearTimeout(item.timeoutId);\n        item.timeoutId = undefined;\n      }\n      item.value = value;\n    } else {\n      item = { value, alive: expires };\n      this.cache[key] = item;\n    }\n\n    if (!expires) {\n      return value;\n    }\n    const now = new Date().getTime();\n    item.time = now + this.alive;\n    item.timeoutId = setTimeout(\n      () => {\n        this.remove(key);\n      },\n      expires > now ? expires - now : expires\n    );\n\n    return value;\n  }\n\n  remove<K extends keyof T>(key: K) {\n    const item = this.get(key);\n    Reflect.deleteProperty(this.cache, key);\n    if (item) {\n      clearTimeout(item.timeoutId!);\n      return item.value;\n    }\n  }\n\n  resetCache(cache: { [K in keyof T]: Cache }) {\n    Object.keys(cache).forEach((key) => {\n      const k = key as any as keyof T;\n      const item = cache[k];\n      if (item && item.time) {\n        const now = new Date().getTime();\n        const expire = item.time;\n        if (expire > now) {\n          this.set(k, item.value, expire);\n        }\n      }\n    });\n  }\n\n  clear() {\n    console.log('------clear------进入clear方法');\n    Object.keys(this.cache).forEach((key) => {\n      const item = this.cache[key];\n      item.timeoutId && clearTimeout(item.timeoutId);\n    });\n    // 代码逻辑说明: 不删除登录用户的租户id，其他缓存信息都清除----\n    this.cache = {\n      ...omit(this.cache, [TOKEN_KEY, USER_INFO_KEY, ROLES_KEY, DB_DICT_DATA_KEY, TENANT_ID, LOGIN_INFO_KEY, PROJ_CFG_KEY]),\n    };\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/cache/persistent.ts",
    "content": "import type { LockInfo, UserInfo, LoginInfo } from '/#/store';\nimport type { ProjectConfig } from '/#/config';\nimport type { RouteLocationNormalized } from 'vue-router';\n\nimport { createLocalStorage, createSessionStorage } from '/@/utils/cache';\nimport { Memory } from './memory';\nimport {\n  TOKEN_KEY,\n  USER_INFO_KEY,\n  ROLES_KEY,\n  LOCK_INFO_KEY,\n  PROJ_CFG_KEY,\n  APP_LOCAL_CACHE_KEY,\n  APP_SESSION_CACHE_KEY,\n  MULTIPLE_TABS_KEY,\n  DB_DICT_DATA_KEY,\n  TENANT_ID,\n  LOGIN_INFO_KEY,\n  OAUTH2_THIRD_LOGIN_TENANT_ID,\n} from '/@/enums/cacheEnum';\nimport { DEFAULT_CACHE_TIME } from '/@/settings/encryptionSetting';\nimport { toRaw } from 'vue';\nimport { pick, omit } from 'lodash-es';\nimport { PageEnum } from '/@/enums/pageEnum';\nimport { router } from '/@/router';\n\ninterface BasicStore {\n  [TOKEN_KEY]: string | number | null | undefined;\n  [USER_INFO_KEY]: UserInfo;\n  [ROLES_KEY]: string[];\n  [LOCK_INFO_KEY]: LockInfo;\n  [PROJ_CFG_KEY]: ProjectConfig;\n  [MULTIPLE_TABS_KEY]: RouteLocationNormalized[];\n  [DB_DICT_DATA_KEY]: string;\n  [TENANT_ID]: string;\n  [LOGIN_INFO_KEY]: LoginInfo;\n  [OAUTH2_THIRD_LOGIN_TENANT_ID]: string\n}\n\ntype LocalStore = BasicStore;\n\ntype SessionStore = BasicStore;\n\nexport type BasicKeys = keyof BasicStore;\ntype LocalKeys = keyof LocalStore;\ntype SessionKeys = keyof SessionStore;\n\nconst ls = createLocalStorage();\nconst ss = createSessionStorage();\n\nconst localMemory = new Memory(DEFAULT_CACHE_TIME);\nconst sessionMemory = new Memory(DEFAULT_CACHE_TIME);\n\nfunction initPersistentMemory() {\n  const localCache = ls.get(APP_LOCAL_CACHE_KEY);\n  const sessionCache = ss.get(APP_SESSION_CACHE_KEY);\n  localCache && localMemory.resetCache(localCache);\n  sessionCache && sessionMemory.resetCache(sessionCache);\n}\n\nexport class Persistent {\n  static getLocal<T>(key: LocalKeys) {\n    // 代码逻辑说明: token过期退出重新登录，online菜单还是提示token过期----------\n    const globalCache = ls.get(APP_LOCAL_CACHE_KEY);\n    // 代码逻辑说明: 【issues/7250】自动锁屏无法解锁\n    if (globalCache && router?.currentRoute?.value.path !== PageEnum.BASE_LOGIN) {\n      localMemory.setCache(globalCache);\n    }\n    return localMemory.get(key)?.value as Nullable<T>;\n  }\n\n  static setLocal(key: LocalKeys, value: LocalStore[LocalKeys], immediate = false): void {\n    localMemory.set(key, toRaw(value));\n    immediate && ls.set(APP_LOCAL_CACHE_KEY, localMemory.getCache);\n  }\n\n  static removeLocal(key: LocalKeys, immediate = false): void {\n    localMemory.remove(key);\n    immediate && ls.set(APP_LOCAL_CACHE_KEY, localMemory.getCache);\n  }\n\n  static clearLocal(immediate = false): void {\n    localMemory.clear();\n    immediate && ls.clear();\n  }\n\n  static getSession<T>(key: SessionKeys) {\n    return sessionMemory.get(key)?.value as Nullable<T>;\n  }\n\n  static setSession(key: SessionKeys, value: SessionStore[SessionKeys], immediate = false): void {\n    sessionMemory.set(key, toRaw(value));\n    immediate && ss.set(APP_SESSION_CACHE_KEY, sessionMemory.getCache);\n  }\n\n  static removeSession(key: SessionKeys, immediate = false): void {\n    sessionMemory.remove(key);\n    immediate && ss.set(APP_SESSION_CACHE_KEY, sessionMemory.getCache);\n  }\n  static clearSession(immediate = false): void {\n    sessionMemory.clear();\n    immediate && ss.clear();\n  }\n\n  static clearAll(immediate = false) {\n    sessionMemory.clear();\n    localMemory.clear();\n    if (immediate) {\n      ls.clear();\n      ss.clear();\n    }\n  }\n}\n\nwindow.addEventListener('beforeunload', function () {\n  // TOKEN_KEY 在登录或注销时已经写入到storage了，此处为了解决同时打开多个窗口时token不同步的问题\n  // LOCK_INFO_KEY 在锁屏和解锁时写入，此处也不应修改\n  ls.set(APP_LOCAL_CACHE_KEY, {\n    ...omit(localMemory.getCache, LOCK_INFO_KEY),\n    ...pick(ls.get(APP_LOCAL_CACHE_KEY), [TOKEN_KEY, USER_INFO_KEY, LOCK_INFO_KEY]),\n  });\n  ss.set(APP_SESSION_CACHE_KEY, {\n    ...omit(sessionMemory.getCache, LOCK_INFO_KEY),\n    ...pick(ss.get(APP_SESSION_CACHE_KEY), [TOKEN_KEY, USER_INFO_KEY, LOCK_INFO_KEY]),\n  });\n});\n\nfunction storageChange(e: any) {\n  const { key, newValue, oldValue } = e;\n\n  if (!key) {\n    Persistent.clearAll();\n    return;\n  }\n\n  if (!!newValue && !!oldValue) {\n    if (APP_LOCAL_CACHE_KEY === key) {\n      Persistent.clearLocal();\n    }\n    if (APP_SESSION_CACHE_KEY === key) {\n      Persistent.clearSession();\n    }\n  }\n}\n\nwindow.addEventListener('storage', storageChange);\n\ninitPersistentMemory();\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/cache/storageCache.ts",
    "content": "import { cacheCipher } from '/@/settings/encryptionSetting';\n\nimport type { EncryptionParams } from '/@/utils/cipher';\n\nimport { AesEncryption } from '/@/utils/cipher';\n\nimport { isNullOrUnDef } from '/@/utils/is';\n\nexport interface CreateStorageParams extends EncryptionParams {\n  prefixKey: string;\n  storage: Storage;\n  hasEncrypt: boolean;\n  timeout?: Nullable<number>;\n}\nexport const createStorage = ({\n  prefixKey = '',\n  storage = sessionStorage,\n  key = cacheCipher.key,\n  iv = cacheCipher.iv,\n  timeout = null,\n  hasEncrypt = true,\n}: Partial<CreateStorageParams> = {}) => {\n  if (hasEncrypt && [key.length, iv.length].some((item) => item !== 16)) {\n    throw new Error('When hasEncrypt is true, the key or iv must be 16 bits!');\n  }\n\n  const encryption = new AesEncryption({ key, iv });\n\n  /**\n   *Cache class\n   *Construction parameters can be passed into sessionStorage, localStorage,\n   * @class Cache\n   * @example\n   */\n  const WebStorage = class WebStorage {\n    private storage: Storage;\n    private prefixKey?: string;\n    private encryption: AesEncryption;\n    private hasEncrypt: boolean;\n    /**\n     *\n     * @param {*} storage\n     */\n    constructor() {\n      this.storage = storage;\n      this.prefixKey = prefixKey;\n      this.encryption = encryption;\n      this.hasEncrypt = hasEncrypt;\n    }\n\n    private getKey(key: string) {\n      return `${this.prefixKey}${key}`.toUpperCase();\n    }\n\n    /**\n     *\n     *  Set cache\n     * @param {string} key\n     * @param {*} value\n     * @expire Expiration time in seconds\n     * @memberof Cache\n     */\n    set(key: string, value: any, expire: number | null = timeout) {\n      const stringData = JSON.stringify({\n        value,\n        time: Date.now(),\n        expire: !isNullOrUnDef(expire) ? new Date().getTime() + expire * 1000 : null,\n      });\n      const stringifyValue = this.hasEncrypt ? this.encryption.encryptByAES(stringData) : stringData;\n      this.storage.setItem(this.getKey(key), stringifyValue);\n    }\n\n    /**\n     *Read cache\n     * @param {string} key\n     * @memberof Cache\n     */\n    get(key: string, def: any = null): any {\n      const val = this.storage.getItem(this.getKey(key));\n      if (!val) return def;\n\n      try {\n        const decVal = this.hasEncrypt ? this.encryption.decryptByAES(val) : val;\n        const data = JSON.parse(decVal);\n        const { value, expire } = data;\n        if (isNullOrUnDef(expire) || expire >= new Date().getTime()) {\n          return value;\n        }\n        this.remove(key);\n      } catch (e) {\n        return def;\n      }\n    }\n\n    /**\n     * Delete cache based on key\n     * @param {string} key\n     * @memberof Cache\n     */\n    remove(key: string) {\n      this.storage.removeItem(this.getKey(key));\n    }\n\n    /**\n     * Delete all caches of this instance\n     */\n    clear(): void {\n      this.storage.clear();\n    }\n  };\n  return new WebStorage();\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/cipher.ts",
    "content": "import { encrypt, decrypt } from 'crypto-js/aes';\nimport { parse } from 'crypto-js/enc-utf8';\nimport pkcs7 from 'crypto-js/pad-pkcs7';\nimport ECB from 'crypto-js/mode-ecb';\nimport md5 from 'crypto-js/md5';\nimport UTF8 from 'crypto-js/enc-utf8';\nimport Base64 from 'crypto-js/enc-base64';\nimport CryptoJS from 'crypto-js';\n\nexport interface EncryptionParams {\n  key: string;\n  iv: string;\n}\n\nexport class AesEncryption {\n  private key;\n  private iv;\n\n  constructor(opt: Partial<EncryptionParams> = {}) {\n    const { key, iv } = opt;\n    if (key) {\n      this.key = parse(key);\n    }\n    if (iv) {\n      this.iv = parse(iv);\n    }\n  }\n\n  get getOptions() {\n    return {\n      mode: ECB,\n      padding: pkcs7,\n      iv: this.iv,\n    };\n  }\n\n  encryptByAES(cipherText: string) {\n    return encrypt(cipherText, this.key, this.getOptions).toString();\n  }\n\n  decryptByAES(cipherText: string) {\n    return decrypt(cipherText, this.key, this.getOptions).toString(UTF8);\n  }\n}\n\nexport function encryptByBase64(cipherText: string) {\n  return UTF8.parse(cipherText).toString(Base64);\n}\n\nexport function decodeByBase64(cipherText: string) {\n  return Base64.parse(cipherText).toString(UTF8);\n}\n\nexport function encryptByMd5(password: string) {\n  return md5(password).toString();\n}\n\n// ================== 密码加密相关 ==================\n// 密码加密统一使用 AES CBC 模式，前后端 key 和 iv 必须保持一致\n// AES_KEY 和 AES_IV 需与后端配置完全一致，否则加密/解密会失败\n// ================== 密码加密相关 ===========BEGIN=======\n\n// AES加密key和iv常量\nexport const AES_KEY = '1234567890adbcde';\nexport const AES_IV = '1234567890hjlkew';\n\n/**\n * AES CBC 加密，使用全局常量 AES_KEY 和 AES_IV\n * @param plainText 明文\n * @returns 加密后的密文\n */\nexport function encryptAESCBC(plainText: string): string {\n  const key = parse(AES_KEY);\n  const iv = parse(AES_IV);\n  return encrypt(plainText, key, {\n    iv: iv,\n    mode: CryptoJS.mode.CBC,\n    padding: pkcs7\n  }).toString();\n}\n// ================== 密码加密相关 =============END=====\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/color.ts",
    "content": "/**\n * 判断是否 十六进制颜色值.\n * 输入形式可为 #fff000 #f00\n *\n * @param   String  color   十六进制颜色值\n * @return  Boolean\n */\nexport function isHexColor(color: string) {\n  const reg = /^#([0-9a-fA-F]{3}|[0-9a-fA-f]{6})$/;\n  return reg.test(color);\n}\n\n/**\n * RGB 颜色值转换为 十六进制颜色值.\n * r, g, 和 b 需要在 [0, 255] 范围内\n *\n * @return  String          类似#ff00ff\n * @param r\n * @param g\n * @param b\n */\nexport function rgbToHex(r: number, g: number, b: number) {\n  // tslint:disable-next-line:no-bitwise\n  const hex = ((r << 16) | (g << 8) | b).toString(16);\n  return '#' + new Array(Math.abs(hex.length - 7)).join('0') + hex;\n}\n\n/**\n * Transform a HEX color to its RGB representation\n * @param {string} hex The color to transform\n * @returns The RGB representation of the passed color\n */\nexport function hexToRGB(hex: string) {\n  let sHex = hex.toLowerCase();\n  if (isHexColor(hex)) {\n    if (sHex.length === 4) {\n      let sColorNew = '#';\n      for (let i = 1; i < 4; i += 1) {\n        sColorNew += sHex.slice(i, i + 1).concat(sHex.slice(i, i + 1));\n      }\n      sHex = sColorNew;\n    }\n    const sColorChange: number[] = [];\n    for (let i = 1; i < 7; i += 2) {\n      sColorChange.push(parseInt('0x' + sHex.slice(i, i + 2)));\n    }\n    return 'RGB(' + sColorChange.join(',') + ')';\n  }\n  return sHex;\n}\n\nexport function colorIsDark(color: string) {\n  if (!isHexColor(color)) return;\n  const [r, g, b] = hexToRGB(color)\n    .replace(/(?:\\(|\\)|rgb|RGB)*/g, '')\n    .split(',')\n    .map((item) => Number(item));\n  return r * 0.299 + g * 0.578 + b * 0.114 < 192;\n}\n\n/**\n * Darkens a HEX color given the passed percentage\n * @param {string} color The color to process\n * @param {number} amount The amount to change the color by\n * @returns {string} The HEX representation of the processed color\n */\nexport function darken(color: string, amount: number) {\n  color = color.indexOf('#') >= 0 ? color.substring(1, color.length) : color;\n  amount = Math.trunc((255 * amount) / 100);\n  return `#${subtractLight(color.substring(0, 2), amount)}${subtractLight(color.substring(2, 4), amount)}${subtractLight(\n    color.substring(4, 6),\n    amount\n  )}`;\n}\n\n/**\n * Lightens a 6 char HEX color according to the passed percentage\n * @param {string} color The color to change\n * @param {number} amount The amount to change the color by\n * @returns {string} The processed color represented as HEX\n */\nexport function lighten(color: string, amount: number) {\n  color = color.indexOf('#') >= 0 ? color.substring(1, color.length) : color;\n  amount = Math.trunc((255 * amount) / 100);\n  return `#${addLight(color.substring(0, 2), amount)}${addLight(color.substring(2, 4), amount)}${addLight(color.substring(4, 6), amount)}`;\n}\n\n/* Suma el porcentaje indicado a un color (RR, GG o BB) hexadecimal para aclararlo */\n/**\n * Sums the passed percentage to the R, G or B of a HEX color\n * @param {string} color The color to change\n * @param {number} amount The amount to change the color by\n * @returns {string} The processed part of the color\n */\nfunction addLight(color: string, amount: number) {\n  const cc = parseInt(color, 16) + amount;\n  const c = cc > 255 ? 255 : cc;\n  return c.toString(16).length > 1 ? c.toString(16) : `0${c.toString(16)}`;\n}\n\n/**\n * Calculates luminance of an rgb color\n * @param {number} r red\n * @param {number} g green\n * @param {number} b blue\n */\nfunction luminanace(r: number, g: number, b: number) {\n  const a = [r, g, b].map((v) => {\n    v /= 255;\n    return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n  });\n  return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722;\n}\n\n/**\n * Calculates contrast between two rgb colors\n * @param {string} rgb1 rgb color 1\n * @param {string} rgb2 rgb color 2\n */\nfunction contrast(rgb1: string[], rgb2: number[]) {\n  return (luminanace(~~rgb1[0], ~~rgb1[1], ~~rgb1[2]) + 0.05) / (luminanace(rgb2[0], rgb2[1], rgb2[2]) + 0.05);\n}\n\n/**\n * Determines what the best text color is (black or white) based con the contrast with the background\n * @param hexColor - Last selected color by the user\n */\nexport function calculateBestTextColor(hexColor: string) {\n  const rgbColor = hexToRGB(hexColor.substring(1));\n  const contrastWithBlack = contrast(rgbColor.split(','), [0, 0, 0]);\n\n  return contrastWithBlack >= 12 ? '#000000' : '#FFFFFF';\n}\n\n/**\n * Subtracts the indicated percentage to the R, G or B of a HEX color\n * @param {string} color The color to change\n * @param {number} amount The amount to change the color by\n * @returns {string} The processed part of the color\n */\nfunction subtractLight(color: string, amount: number) {\n  const cc = parseInt(color, 16) - amount;\n  const c = cc < 0 ? 0 : cc;\n  return c.toString(16).length > 1 ? c.toString(16) : `0${c.toString(16)}`;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/common/compUtils.ts",
    "content": "import { useGlobSetting } from '/@/hooks/setting';\nimport { merge, random } from 'lodash-es';\nimport { isArray } from '/@/utils/is';\nimport { FormSchema } from '/@/components/Form';\nimport { h, reactive, ref } from \"vue\";\nimport { getTenantId, getToken } from \"/@/utils/auth\";\nimport { useUserStoreWithOut } from \"/@/store/modules/user\";\nimport dayjs from 'dayjs';\nimport Big from 'big.js';\n\nimport { Modal } from \"ant-design-vue\";\nimport { defHttp } from \"@/utils/http/axios\";\nimport { useI18n } from \"@/hooks/web/useI18n\";\nimport {$electron} from \"@/electron\";\nimport {router} from \"@/router\";\nimport {encryptByBase64} from \"@/utils/cipher\";\n//存放部门路径的数组\nconst departNamePath = ref<Record<string, string>>({});\n\nconst globSetting = useGlobSetting();\nconst baseApiUrl = globSetting.domainUrl;\n/**\n *  获取文件服务访问路径\n * @param fileUrl 文件路径\n * @param prefix(默认http)  文件路径前缀 http/https\n */\nexport const getFileAccessHttpUrl = (fileUrl, prefix = 'http') => {\n  let result = fileUrl;\n  try {\n    if (fileUrl && fileUrl.length > 0 && !fileUrl.startsWith(prefix)) {\n      //判断是否是数组格式\n      let isArray = fileUrl.indexOf('[') != -1;\n      if (!isArray) {\n        let prefix = `${baseApiUrl}/sys/common/static/`;\n        // 判断是否已包含前缀\n        if (!fileUrl.startsWith(prefix)) {\n          result = `${prefix}${fileUrl}`;\n        }\n      }\n    }\n  } catch (err) {}\n  return result;\n};\n/**\n *  获取桌面端wps的文件服务访问路径\n * @param fileUrl 文件路径\n */\nexport const getElectronFileUrl = (url) => {\n  let fileUrl: any = url;\n  if (url && $electron.isElectron()) {\n    fileUrl = router.resolve({path: '/onlinePreview', query: {url: encryptByBase64(getFileAccessHttpUrl(url))}}).href;\n  }\n  return fileUrl;\n};\n\n/**\n * 触发 window.resize\n */\nexport function triggerWindowResizeEvent() {\n  let event: any = document.createEvent('HTMLEvents');\n  event.initEvent('resize', true, true);\n  event.eventType = 'message';\n  window.dispatchEvent(event);\n}\n\n/**\n * 获取随机数\n *  @param length 数字位数\n */\nexport const getRandom = (length: number = 1) => {\n  return '-' + parseInt(String(Math.random() * 10000 + 1), length);\n};\n\n/**\n * 随机生成字符串\n * @param length 字符串的长度\n * @param chats 可选字符串区间（只会生成传入的字符串中的字符）\n * @return string 生成的字符串\n */\nexport function randomString(length: number, chats?: string) {\n  if (!length) length = 1;\n  if (!chats) {\n    // noinspection SpellCheckingInspection\n    chats = '0123456789qwertyuioplkjhgfdsazxcvbnm';\n  }\n  let str = '';\n  for (let i = 0; i < length; i++) {\n    let num = random(0, chats.length - 1);\n    str += chats[num];\n  }\n  return str;\n}\n\n/**\n * 将普通列表数据转化为tree结构\n * @param array tree数据\n * @param opt  配置参数\n * @param startPid 父节点\n */\nexport const listToTree = (array, opt, startPid) => {\n  const obj = {\n    primaryKey: opt.primaryKey || 'key',\n    parentKey: opt.parentKey || 'parentId',\n    titleKey: opt.titleKey || 'title',\n    startPid: opt.startPid || '',\n    currentDept: opt.currentDept || 0,\n    maxDept: opt.maxDept || 100,\n    childKey: opt.childKey || 'children',\n  };\n  if (startPid) {\n    obj.startPid = startPid;\n  }\n  return toTree(array, obj.startPid, obj.currentDept, obj);\n};\n/**\n *  递归构建tree\n * @param list\n * @param startPid\n * @param currentDept\n * @param opt\n * @returns {Array}\n */\nexport const toTree = (array, startPid, currentDept, opt) => {\n  if (opt.maxDept < currentDept) {\n    return [];\n  }\n  let child = [];\n  if (array && array.length > 0) {\n    child = array\n      .map((item) => {\n        // 筛查符合条件的数据（主键 = startPid）\n        if (typeof item[opt.parentKey] !== 'undefined' && item[opt.parentKey] === startPid) {\n          // 满足条件则递归\n          const nextChild = toTree(array, item[opt.primaryKey], currentDept + 1, opt);\n          // 节点信息保存\n          if (nextChild.length > 0) {\n            item['isLeaf'] = false;\n            item[opt.childKey] = nextChild;\n          } else {\n            item['isLeaf'] = true;\n          }\n          item['title'] = item[opt.titleKey];\n          item['label'] = item[opt.titleKey];\n          item['key'] = item[opt.primaryKey];\n          item['value'] = item[opt.primaryKey];\n          return item;\n        }\n      })\n      .filter((item) => {\n        return item !== undefined;\n      });\n  }\n  return child;\n};\n\n/**\n * 表格底部合计工具方法\n * @param tableData 表格数据\n * @param fieldKeys 要计算合计的列字段\n */\nexport function mapTableTotalSummary(tableData: Recordable[], fieldKeys: string[]) {\n  let totals: any = { _row: '合计', _index: '合计' };\n  fieldKeys.forEach((key) => {\n    totals[key] = tableData.reduce((prev, next) => {\n      // 代码逻辑说明: 【QQYUN-7891】PR 合计工具方法，转换为Nuber类型再计算\n      const value = Number(next[key]);\n      if (!Number.isNaN(value)) {\n        // 代码逻辑说明: 【issues/7830】合计小数计算精度\n        prev = Big(prev).plus(value).toString();\n      }\n      return prev;\n    }, 0);\n    // 代码逻辑说明: 【issues/7830】合计小数计算精度\n    totals[key] = +totals[key];\n  });\n  return totals;\n}\n\n/**\n * 简单实现防抖方法\n *\n * 防抖(debounce)函数在第一次触发给定的函数时，不立即执行函数，而是给出一个期限值(delay)，比如100ms。\n * 如果100ms内再次执行函数，就重新开始计时，直到计时结束后再真正执行函数。\n * 这样做的好处是如果短时间内大量触发同一事件，只会执行一次函数。\n *\n * @param fn 要防抖的函数\n * @param delay 防抖的毫秒数\n * @returns {Function}\n */\nexport function simpleDebounce(fn, delay = 100) {\n  let timer: any | null = null;\n  return function () {\n    let args = arguments;\n    if (timer) {\n      clearTimeout(timer);\n    }\n    timer = setTimeout(() => {\n      // @ts-ignore\n      fn.apply(this, args);\n    }, delay);\n  };\n}\n\n/**\n * 日期格式化\n * @param date 日期\n * @param block 格式化字符串\n */\nexport function dateFormat(date, block) {\n  if (!date) {\n    return '';\n  }\n  let format = block || 'yyyy-MM-dd';\n  date = new Date(date);\n  const map = {\n    M: date.getMonth() + 1, // 月份\n    d: date.getDate(), // 日\n    h: date.getHours(), // 小时\n    m: date.getMinutes(), // 分\n    s: date.getSeconds(), // 秒\n    q: Math.floor((date.getMonth() + 3) / 3), // 季度\n    S: date.getMilliseconds(), // 毫秒\n  };\n  format = format.replace(/([yMdhmsqS])+/g, (all, t) => {\n    let v = map[t];\n    if (v !== undefined) {\n      if (all.length > 1) {\n        v = `0${v}`;\n        v = v.substr(v.length - 2);\n      }\n      return v;\n    } else if (t === 'y') {\n      return date\n        .getFullYear()\n        .toString()\n        .substr(4 - all.length);\n    }\n    return all;\n  });\n  return format;\n}\n\n/**\n * 获取事件冒泡路径，兼容 IE11，Edge，Chrome，Firefox，Safari\n * 目前使用的地方：JVxeTable Span模式\n */\nexport function getEventPath(event) {\n  let target = event.target;\n  let path = (event.composedPath && event.composedPath()) || event.path;\n\n  if (path != null) {\n    return path.indexOf(window) < 0 ? path.concat(window) : path;\n  }\n\n  if (target === window) {\n    return [window];\n  }\n\n  let getParents = (node, memo) => {\n    const parentNode = node.parentNode;\n\n    if (!parentNode) {\n      return memo;\n    } else {\n      return getParents(parentNode, memo.concat(parentNode));\n    }\n  };\n  return [target].concat(getParents(target, []), window);\n}\n\n/**\n * 如果值不存在就 push 进数组，反之不处理\n * @param array 要操作的数据\n * @param value 要添加的值\n * @param key 可空，如果比较的是对象，可能存在地址不一样但值实际上是一样的情况，可以传此字段判断对象中唯一的字段，例如 id。不传则直接比较实际值\n * @returns {boolean} 成功 push 返回 true，不处理返回 false\n */\nexport function pushIfNotExist(array, value, key?) {\n  for (let item of array) {\n    if (key && item[key] === value[key]) {\n      return false;\n    } else if (item === value) {\n      return false;\n    }\n  }\n  array.push(value);\n  return true;\n}\n/**\n * 过滤对象中为空的属性\n * @param obj\n * @returns {*}\n */\nexport function filterObj(obj) {\n  if (!(typeof obj == 'object')) {\n    return;\n  }\n\n  for (let key in obj) {\n    if (obj.hasOwnProperty(key) && (obj[key] == null || obj[key] == undefined || obj[key] === '')) {\n      delete obj[key];\n    }\n  }\n  return obj;\n}\n\n/**\n * 下划线转驼峰\n * @param string\n */\nexport function underLine2CamelCase(string: string) {\n  return string.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * 查找树结构\n * @param treeList\n * @param fn 查找方法\n * @param childrenKey\n */\nexport function findTree(treeList: any[], fn: Fn, childrenKey = 'children') {\n  for (let i = 0; i < treeList.length; i++) {\n    let item = treeList[i];\n    if (fn(item, i, treeList)) {\n      return item;\n    }\n    let children = item[childrenKey];\n    if (isArray(children)) {\n      let findResult = findTree(children, fn, childrenKey);\n      if (findResult) {\n        return findResult;\n      }\n    }\n  }\n  return null;\n}\n\n/** 获取 mapFormSchema 方法 */\nexport function bindMapFormSchema<T>(spanMap, spanTypeDef: T) {\n  return function (s: FormSchema, spanType: T = spanTypeDef) {\n    return merge(\n      {\n        disabledLabelWidth: true,\n      } as FormSchema,\n      spanMap[spanType],\n      s\n    );\n  };\n}\n\n/**\n * 字符串是否为null或null字符串\n * @param str\n * @return {boolean}\n */\nexport function stringIsNull(str) {\n  // 两个 == 可以同时判断 null 和 undefined\n  return str == null || str === 'null' || str === 'undefined';\n}\n\n/**\n * 【组件多了可能存在性能问题】获取弹窗div，将下拉框、日期等组件挂载到modal上，解决弹窗遮盖问题\n * @param node\n */\nexport function getAutoScrollContainer(node: HTMLElement) {\n  let element: Nullable<HTMLElement> = node\n  while (element != null) {\n    if (element.classList.contains('scrollbar__view')) {\n      // 判断是否有滚动条\n      if (element.clientHeight < element.scrollHeight) {\n        // 有滚动条时，挂载到父级，解决滚动问题\n        return node.parentElement\n      } else {\n        // 无滚动条时，挂载到body上，解决下拉框遮盖问题\n        return document.body\n      }\n    } else {\n      element = element.parentElement\n    }\n  }\n  // 不在弹窗内，走默认逻辑\n  return node.parentElement\n}\n\n/**\n * 判断子菜单是否全部隐藏\n * @param menuTreeItem\n */\nexport  function checkChildrenHidden(menuTreeItem){\n  //是否是聚合路由\n  let alwaysShow=menuTreeItem.alwaysShow;\n  if(alwaysShow){\n    return false;\n  }\n  if(!menuTreeItem.children){\n    return false\n  }\n  return menuTreeItem.children?.find((item) => item.hideMenu == false) != null;\n}\n\n/**\n * 计算文件大小\n * @param fileSize\n * @param unit\n * @return 返回大小及后缀\n */\nexport function calculateFileSize(fileSize, unit?) {\n  let unitArr = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n  if (unit && unit.length > 0) {\n    unitArr = unit;\n  }\n  let size = fileSize;\n  let unitIndex = 0;\n  while (size >= 1024 && unitIndex < unitArr.length - 1) {\n    size /= 1024;\n    unitIndex++;\n  }\n  //保留两位小数，四舍五入\n  size = Math.round(size * 100) / 100;\n  return size + unitArr[unitIndex];\n}\n\n/**\n * 获取上传header\n */\nexport function getHeaders() {\n  let tenantId = getTenantId();\n  return reactive({\n    'X-Access-Token': getToken(),\n    'X-Tenant-Id': tenantId ? tenantId : '0',\n  });\n}\n\n/** 根据表达式获取相应的用户信息 */\nexport function getUserInfoByExpression(expression) {\n  if (!expression) {\n    return expression;\n  }\n  // 当前日期\n  if (expression === 'sys_date' || expression === 'sysDate') {\n    return dayjs().format('YYYY-MM-DD');\n  }\n  // 当前时间\n  if (expression === 'sys_time' || expression === 'sysTime') {\n    return dayjs().format('HH:mm:ss');\n  }\n  const userStore = useUserStoreWithOut();\n  let userInfo = userStore.getUserInfo;\n  if (userInfo) {\n    switch (expression) {\n      case 'sysUserId':\n        return userInfo.id;\n      // 当前登录用户登录账号\n      case 'sysUserCode':\n      case 'sys_user_code':\n        return userInfo.username;\n      // 当前登录用户真实名称\n      case 'sysUserName':\n        return userInfo.realname;\n      // 当前登录用户部门编号\n      case 'sysOrgCode':\n      case 'sys_org_code':\n        return userInfo.orgCode;\n    }\n  }\n  return expression;\n}\n\n/**\n * 替换表达式（#{xxx}）为用户信息\n * @param expression\n */\nexport function replaceUserInfoByExpression(expression: string | any[]) {\n  if (!expression) {\n    return expression;\n  }\n  const isString = typeof expression === 'string';\n  const isArray = Array.isArray(expression)\n  if (!isString && !isArray) {\n    return expression;\n  }\n  const reg = /#{(.*?)}/g;\n  const replace = (str) => {\n    if (typeof str !== 'string') {\n      return str;\n    }\n    let result = str.match(reg);\n    if (result && result.length > 0) {\n      result.forEach((item) => {\n        let userInfo = getUserInfoByExpression(item.substring(2, item.length - 1));\n        str = str.replace(item, userInfo);\n      });\n    }\n    return str;\n  };\n  // @ts-ignore\n  return isString ? replace(expression) : expression.map(replace);\n}\n\n/**\n * 设置租户缓存，当租户退出的时候\n * \n * @param tenantId\n */\nexport async function userExitChangeLoginTenantId(tenantId){\n  const userStore = useUserStoreWithOut();\n  //step 1 获取用户租户\n  const url = '/sys/tenant/getCurrentUserTenant'\n  let currentTenantId = null;\n  const data = await defHttp.get({ url });\n  if(data && data.list){\n    let arr = data.list;\n    if(arr.length>0){\n      //step 2.判断当前id是否存在用户租户中\n      let filterTenantId = arr.filter((item) => item.id == tenantId);\n      //存在说明不是退出的不是当前租户，还用用来的租户即可\n      if(filterTenantId && filterTenantId.length>0){\n        currentTenantId = tenantId;\n      }else{\n        //不存在默认第一个\n        currentTenantId = arr[0].id\n      }\n    }\n  }\n  let loginTenantId = getTenantId();\n  userStore.setTenant(currentTenantId);\n\n  //租户为空，说明没有租户了，需要刷新页面。或者当前租户和退出的租户一致则需要刷新浏览器\n  if(!currentTenantId || tenantId == loginTenantId){\n    window.location.reload();\n  }\n}\n\n/**\n * 我的租户模块需要开启多租户提示\n * \n * @param title 标题\n */\nexport function tenantSaasMessage(title){\n  let tenantId = getTenantId();\n  if(!tenantId){\n    Modal.confirm({\n      title:title,\n      content: '此菜单需要在多租户模式下使用，否则数据会出现混乱',\n      okText: '确认',\n      okType: 'danger',\n      // @ts-ignore\n      cancelButtonProps: { style: { display: 'none' } },\n    })\n  }\n}\n\n/**\n * 判断日期和当前时间是否为同一天\n * @param dateStr\n */\nexport function sameDay(dateStr) {\n  if (!dateStr) {\n    return false;\n  }\n  // 获取当前日期\n  let currentDate = new Date();\n  let currentDay = currentDate.getDate();\n  let currentMonth = currentDate.getMonth();\n  let currentYear = currentDate.getFullYear();\n\n  //创建另一个日期进行比较\n  let otherDate = new Date(dateStr);\n  let otherDay = otherDate.getDate();\n  let otherMonth = otherDate.getMonth();\n  let otherYear = otherDate.getFullYear();\n\n  //比较日期\n  if (currentDay === otherDay && currentMonth === otherMonth && currentYear === otherYear) {\n    return true;\n  } else {\n    return false;\n  }\n}\n\n\n/**\n * 翻译菜单名称\n * 2024-02-28\n * liaozhiyang\n * @param data\n */\nexport function translateTitle(data) {\n  if (data?.length) {\n    const { t } = useI18n();\n    data.forEach((item) => {\n      if (item.slotTitle) {\n        if (item.slotTitle.includes(\"t('\") && t) {\n          item.slotTitle = new Function('t', `return ${item.slotTitle}`)(t);\n        }\n      }\n      if (item.children?.length) {\n        translateTitle(item.children);\n      }\n    });\n  }\n  return data;\n}\n\n/**\n *\n * 深度冻结对象\n * @param obj Object or Array\n */\nexport function freezeDeep(obj: Recordable | Recordable[]) {\n  if (obj != null) {\n    if (Array.isArray(obj)) {\n      obj.forEach(item => freezeDeep(item))\n    } else if (typeof obj === 'object') {\n      Object.values(obj).forEach(value => {\n        freezeDeep(value)\n      })\n    }\n    Object.freeze(obj)\n  }\n  return obj\n}\n\n/**\n * 获取父级名称\n * \n * @param orgCode 当前部门的code\n * @param label 当前默认显示的值\n * @param depId depId\n * @return 部门名称\n */\nexport async function getDepartPathNameByOrgCode(orgCode, label, depId){\n  if (orgCode) {\n    depId = \"\";\n  }\n  let result = await defHttp.get({ url: \"/sys/sysDepart/getDepartPathNameByOrgCode\", params:{ orgCode: orgCode, depId: depId } }, { isTransformResponse: false });\n  if (result.success) {\n    return result.result;\n  }\n  return label;\n}\n\n/**\n * 获取部门路径名称\n * @param title\n * @param key 部门code或者部门id\n * @param izOrgCode 是否是机构编码\n */\nexport function getDepartPathName(title,key,izOrgCode) {\n  if (departNamePath.value[key]) {\n    return departNamePath.value[key];\n  }\n  if(izOrgCode){\n    getDepartPathNameByOrgCode(key, title, \"\").then(result => {\n      departNamePath.value[key] = result;\n    });\n  }else{\n    getDepartPathNameByOrgCode(\"\", title, key).then(result => {\n      departNamePath.value[key] = result;\n    });\n  }\n\n}\n\n/**\n * 获取多个部门路径名称\n * @param title\n * @param id\n */\nexport function getMultiDepartPathName(title,id) {\n  if(!id || id.length === 0){\n    return '';\n  }\n  let postIds:any = \"\";\n  if(id instanceof Array){\n    postIds = id;\n  } else {\n    postIds = id.split(\",\")\n  }\n  let postNames = \"\";\n  postIds.forEach((postId)=>{\n    postNames += getDepartPathName(title,postId,false) + \",\";\n  });\n  if(postNames.endsWith(\",\")){\n    postNames = postNames.substring(0,postNames.length - 1);\n  }\n  return postNames;\n}\n\n/**\n * 获取部门名称 返回h\n * @param departNamePath 部门路径\n */\nexport function getDepartName(departNamePath) {\n  if(departNamePath){\n    let names = departNamePath.split(\",\");\n    let textElements:any = [];\n    for (let i = 0; i < names.length; i++) {\n      textElements.push(h(\"p\", { style: { marginBottom: '2px'} }, names[i]));\n    }\n    // 组合完整内容字符串用于title属性\n    const fullContent = names.join('\\n');\n    return h(\"div\",{\n      style: {\n        overflow: 'hidden',\n        textOverflow: 'ellipsis',\n        display: '-webkit-box',\n        WebkitLineClamp: 3,\n        WebkitBoxOrient: 'vertical',\n        lineHeight: '1.5em',\n        maxHeight: '4.5em',\n        width: '100%',\n        whiteSpace: 'normal'\n      },\n      // 鼠标悬停显示全部内容\n      title: fullContent\n    },textElements)\n  }\n  return departNamePath;\n}\n\n/**\n * 获取文件表\n * @param fileUrl\n */\nexport function getFileIcon(fileUrl) {\n  if(!fileUrl) {\n    return 'ant-design:file-outlined';\n  }\n  const suffix = fileUrl.substring(fileUrl.lastIndexOf('.') + 1).toLowerCase();\n  if(['xls','xlsx','csv'].includes(suffix)) {\n    return 'ant-design:file-excel-filled';\n  }\n  if(['doc','docx'].includes(suffix)) {\n    return 'ant-design:file-word-filled';\n  }\n  if(['pdf'].includes(suffix)) {\n    return 'ant-design:file-pdf-filled';\n  }\n  if(['ppt','pptx'].includes(suffix)) {\n    return 'ant-design:file-ppt-filled';\n  }\n  if(['txt'].includes(suffix)) {\n    return 'ant-design:file-text-filled';\n  }\n  if(['md'].includes(suffix)) {\n    return 'ant-design:file-markdown-filled';\n  }\n  return 'ant-design:file-unknown-filled';\n}\n\n/**\n * 获取文件图标颜色\n *\n * @param fileUrl\n */\nexport function getFileIconColor(fileUrl) {\n  if(!fileUrl) {\n    return '#999';\n  }\n  const suffix = fileUrl.substring(fileUrl.lastIndexOf('.') + 1).toLowerCase();\n  if(['xls','xlsx','csv'].includes(suffix)) {\n    return '#52c41a';\n  }\n  if(['doc','docx'].includes(suffix)) {\n    return '#1890ff';\n  }\n  if(['pdf'].includes(suffix)) {\n    return '#ff4d4f';\n  }\n  if(['ppt','pptx'].includes(suffix)) {\n    return '#fa8c16';\n  }\n  if(['txt'].includes(suffix)) {\n    return '#666';\n  }\n  if(['md'].includes(suffix)) {\n    return '#000';\n  }\n  return '#999';\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/common/renderUtils.ts",
    "content": "import { h } from 'vue';\nimport { Avatar, Tag, Tooltip, Image } from 'ant-design-vue';\nimport { getFileAccessHttpUrl } from '/@/utils/common/compUtils';\nimport { Tinymce } from '/@/components/Tinymce';\nimport Icon from '/@/components/Icon';\nimport { getDictItemsByCode } from '/@/utils/dict/index';\nimport { filterMultiDictText } from '/@/utils/dict/JDictSelectUtil.js';\nimport { isEmpty } from '/@/utils/is';\nimport { useMessage } from '/@/hooks/web/useMessage';\nconst { createMessage } = useMessage();\n\nconst render = {\n  /**\n   * 渲染列表头像\n   */\n  renderAvatar: ({ record }) => {\n    if (record.avatar) {\n      let avatarList = record.avatar.split(',');\n      return h(\n        'span',\n        avatarList.map((item) => {\n          return h(Avatar, {\n            src: getFileAccessHttpUrl(item),\n            shape: 'square',\n            size: 'default',\n            style: { marginRight: '5px' },\n          });\n        })\n      );\n    } else {\n      return h(\n        Avatar,\n        { shape: 'square', size: 'default' },\n        {\n          icon: () => h(Icon, { icon: 'ant-design:file-image-outlined', size: 30 }),\n        }\n      );\n    }\n  },\n  /**\n   * 根据字典编码 渲染\n   * @param v 值\n   * @param code 字典编码\n   * @param renderTag 是否使用tag渲染\n   */\n  renderDict: (v, code, renderTag = false) => {\n    let text = '';\n    let color = '';\n    let array = getDictItemsByCode(code) || [];\n    let obj = array.filter((item) => {\n      return item.value == v;\n    });\n    if (obj.length > 0) {\n      text = obj[0].text;\n      color = obj[0].color;\n    }\n    //【jeecgboot-vue3/issues/903】render.renderDict使用tag渲染报警告问题 #903\n    return isEmpty(text) || !renderTag ? h('span', text) : h(Tag,{ color }, () => text);\n  },\n  /**\n   * 渲染图片\n   * @param text\n   */\n  renderImage: ({ text }) => {\n    if (!text) {\n      return h(Image, {\n        width: 30,\n        height: 30,\n        src: '',\n        fallback:\n          'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMIAAADDCAYAAADQvc6UAAABRWlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8LAwSDCIMogwMCcmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsis7PPOq3QdDFcvjV3jOD1boQVTPQrgSkktTgbSf4A4LbmgqISBgTEFyFYuLykAsTuAbJEioKOA7DkgdjqEvQHEToKwj4DVhAQ5A9k3gGyB5IxEoBmML4BsnSQk8XQkNtReEOBxcfXxUQg1Mjc0dyHgXNJBSWpFCYh2zi+oLMpMzyhRcASGUqqCZ16yno6CkYGRAQMDKMwhqj/fAIcloxgHQqxAjIHBEugw5sUIsSQpBobtQPdLciLEVJYzMPBHMDBsayhILEqEO4DxG0txmrERhM29nYGBddr//5/DGRjYNRkY/l7////39v///y4Dmn+LgeHANwDrkl1AuO+pmgAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAwqADAAQAAAABAAAAwwAAAAD9b/HnAAAHlklEQVR4Ae3dP3PTWBSGcbGzM6GCKqlIBRV0dHRJFarQ0eUT8LH4BnRU0NHR0UEFVdIlFRV7TzRksomPY8uykTk/zewQfKw/9znv4yvJynLv4uLiV2dBoDiBf4qP3/ARuCRABEFAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghgg0Aj8i0JO4OzsrPv69Wv+hi2qPHr0qNvf39+iI97soRIh4f3z58/u7du3SXX7Xt7Z2enevHmzfQe+oSN2apSAPj09TSrb+XKI/f379+08+A0cNRE2ANkupk+ACNPvkSPcAAEibACyXUyfABGm3yNHuAECRNgAZLuYPgEirKlHu7u7XdyytGwHAd8jjNyng4OD7vnz51dbPT8/7z58+NB9+/bt6jU/TI+AGWHEnrx48eJ/EsSmHzx40L18+fLyzxF3ZVMjEyDCiEDjMYZZS5wiPXnyZFbJaxMhQIQRGzHvWR7XCyOCXsOmiDAi1HmPMMQjDpbpEiDCiL358eNHurW/5SnWdIBbXiDCiA38/Pnzrce2YyZ4//59F3ePLNMl4PbpiL2J0L979+7yDtHDhw8vtzzvdGnEXdvUigSIsCLAWavHp/+qM0BcXMd/q25n1vF57TYBp0a3mUzilePj4+7k5KSLb6gt6ydAhPUzXnoPR0dHl79WGTNCfBnn1uvSCJdegQhLI1vvCk+fPu2ePXt2tZOYEV6/fn31dz+shwAR1sP1cqvLntbEN9MxA9xcYjsxS1jWR4AIa2Ibzx0tc44fYX/16lV6NDFLXH+YL32jwiACRBiEbf5KcXoTIsQSpzXx4N28Ja4BQoK7rgXiydbHjx/P25TaQAJEGAguWy0+2Q8PD6/Ki4R8EVl+bzBOnZY95fq9rj9zAkTI2SxdidBHqG9+skdw43borCXO/ZcJdraPWdv22uIEiLA4q7nvvCug8WTqzQveOH26fodo7g6uFe/a17W3+nFBAkRYENRdb1vkkz1CH9cPsVy/jrhr27PqMYvENYNlHAIesRiBYwRy0V+8iXP8+/fvX11Mr7L7ECueb/r48eMqm7FuI2BGWDEG8cm+7G3NEOfmdcTQw4h9/55lhm7DekRYKQPZF2ArbXTAyu4kDYB2YxUzwg0gi/41ztHnfQG26HbGel/crVrm7tNY+/1btkOEAZ2M05r4FB7r9GbAIdxaZYrHdOsgJ/wCEQY0J74TmOKnbxxT9n3FgGGWWsVdowHtjt9Nnvf7yQM2aZU/TIAIAxrw6dOnAWtZZcoEnBpNuTuObWMEiLAx1HY0ZQJEmHJ3HNvGCBBhY6jtaMoEiJB0Z29vL6ls58vxPcO8/zfrdo5qvKO+d3Fx8Wu8zf1dW4p/cPzLly/dtv9Ts/EbcvGAHhHyfBIhZ6NSiIBTo0LNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiEC/wGgKKC4YMA4TAAAAABJRU5ErkJggg==',\n      });\n    }\n    let avatarList = text.split(',');\n    return h(\n      'span',\n      avatarList.map((item) => {\n        return h(Image, {\n          src: getFileAccessHttpUrl(item),\n          width: 30,\n          height: 30,\n          style: { marginRight: '5px' },\n          previewMask: () => {\n            return h(Icon, { icon: 'ant-design:eye-outlined', size: 20 });\n          },\n        });\n      })\n    );\n  },\n  /**\n   * 渲染 Tooltip\n   * @param text\n   * @param len\n   */\n  renderTip: (text, len = 20) => {\n    if (text) {\n      let showText = text + '';\n      if (showText.length > len) {\n        showText = showText.substr(0, len) + '...';\n      }\n      return h(Tooltip, { title: text }, () => showText);\n    }\n    return text;\n  },\n  /**\n   * 渲染a标签\n   * @param text\n   */\n  renderHref: ({ text }) => {\n    if (!text) {\n      return '';\n    }\n    const len = 20;\n    if (text.length > len) {\n      text = text.substr(0, len);\n    }\n    return h('a', { href: text, target: '_blank' }, text);\n  },\n  /**\n   * 根据字典渲染\n   * @param v\n   * @param array\n   */\n  renderDictNative: (v, array, renderTag = false) => {\n    let text = '';\n    let color = '';\n    let obj = array.filter((item) => {\n      return item.value == v;\n    });\n    if (obj.length > 0) {\n      text = obj[0].label;\n      color = obj[0].color;\n    }\n    return isEmpty(text) || !renderTag ? h('span', text) : h(Tag, { color }, () => text);\n  },\n  /**\n   * 渲染富文本\n   */\n  renderTinymce: ({ model, field }) => {\n    return h(Tinymce, {\n      showImageUpload: false,\n      height: 300,\n      value: model[field],\n      onChange: (value: string) => {\n        model[field] = value;\n      },\n    });\n  },\n\n  renderSwitch: (text, arr) => {\n    return text ? filterMultiDictText(arr, text) : '';\n  },\n  renderCategoryTree: (text, code) => {\n    let array = getDictItemsByCode(code);\n    return filterMultiDictText(array, text);\n  },\n  renderTag(text, color) {\n    return isEmpty(text) ? h('span', text) : h(Tag, { color }, () => text);\n  },\n};\n\n/**\n * 文件下载\n */\nfunction downloadFile(url) {\n  if (!url) {\n    createMessage.warning('未知的文件');\n    return;\n  }\n  if (url.indexOf(',') > 0) {\n    url = url.substring(0, url.indexOf(','));\n  }\n  url = getFileAccessHttpUrl(url.split(',')[0]);\n  if (url) {\n    window.open(url);\n  }\n}\n\nexport { render, downloadFile };\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/common/vxeUtils.ts",
    "content": "import { getValueType } from '/@/utils';\n\nexport const VALIDATE_FAILED = Symbol();\n/**\n * 一次性验证主表单和所有的次表单(新版本)\n * @param form 主表单 form 对象\n * @param cases 接收一个数组，每项都是一个JEditableTable实例\n * @returns {Promise<any>}\n */\nexport async function validateFormModelAndTables(validate, formData, cases, props, autoJumpTab?) {\n  if (!(validate && typeof validate === 'function')) {\n    throw `validate 参数需要的是一个方法，而传入的却是${typeof validate}`;\n  }\n  let dataMap = {};\n  let values = await new Promise((resolve, reject) => {\n    // 验证主表表单\n    validate()\n      .then(() => {\n        // 代码逻辑说明: [VUEN-912]一对多用户组件（所有风格，单表和树没问题）保存报错------------\n        for (let data in formData) {\n          //如果该数据是数组\n          if (formData[data] instanceof Array) {\n            let valueType = getValueType(props, data);\n            //如果是字符串类型的需要变成以逗号分割的字符串\n            if (valueType === 'string') {\n              formData[data] = formData[data].join(',');\n            }\n          }\n        }\n        resolve(formData);\n      })\n      // 代码逻辑说明: 【TV360X-1064】非原生提交表单滚动校验没通过的项---\n      .catch(({ errorFields }) => {\n        reject({ error: VALIDATE_FAILED, index: 0, errorFields: errorFields });\n      });\n  });\n  Object.assign(dataMap, { formValue: values });\n  // 验证所有子表的表单\n  let subData = await validateTables(cases, autoJumpTab);\n  // 合并最终数据\n  dataMap = Object.assign(dataMap, { tablesValue: subData });\n  return dataMap;\n}\n/**\n * 验证并获取一个或多个表格的所有值\n * @param cases 接收一个数组，每项都是一个JEditableTable实例\n * @param autoJumpTab 是否自动跳转到报错的tab\n */\nexport function validateTables(cases, autoJumpTab = true) {\n  if (!(cases instanceof Array)) {\n    throw `'validateTables'函数的'cases'参数需要的是一个数组，而传入的却是${typeof cases}`;\n  }\n  return new Promise((resolve, reject) => {\n    let tablesData: any = [];\n    let index = 0;\n    if (!cases || cases.length === 0) {\n      resolve(tablesData);\n    }\n    (function next() {\n      let vm = cases[index];\n      vm.value.validateTable().then((errMap) => {\n        // 校验通过\n        if (!errMap) {\n          tablesData[index] = { tableData: vm.value.getTableData() };\n          // 判断校验是否全部完成，完成返回成功，否则继续进行下一步校验\n          if (++index === cases.length) {\n            resolve(tablesData);\n          } else next();\n        } else {\n          // 尝试获取tabKey，如果在ATab组件内即可获取\n          let paneKey;\n          let tabPane = getVmParentByName(vm.value, 'ATabPane');\n          if (tabPane) {\n            paneKey = tabPane.$.vnode.key;\n            // 自动跳转到该表格\n            if (autoJumpTab) {\n              let tabs = getVmParentByName(tabPane, 'Tabs');\n              tabs && tabs.setActiveKey && tabs.setActiveKey(paneKey);\n            }\n          }\n          // 出现未验证通过的表单，不再进行下一步校验，直接返回失败\n          // 代码逻辑说明: TV360X-478 一对多tab，校验未通过时，tab没有跳转\n          reject({ error: VALIDATE_FAILED, index, paneKey, errMap, subIndex: index });\n        }\n      });\n    })();\n  });\n}\n\nexport function getVmParentByName(vm, name) {\n  let parent = vm.$parent;\n  if (parent && parent.$options) {\n    if (parent.$options.name === name) {\n      return parent;\n    } else {\n      let res = getVmParentByName(parent, name);\n      if (res) {\n        return res;\n      }\n    }\n  }\n  return null;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/dateUtil.ts",
    "content": "/**\n * Independent time operation tool to facilitate subsequent switch to dayjs\n */\nimport dayjs from 'dayjs';\n\nconst DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';\nconst DATE_FORMAT = 'YYYY-MM-DD';\n\nexport function formatToDateTime(date: dayjs.Dayjs | undefined = undefined, format = DATE_TIME_FORMAT): string {\n  return dayjs(date).format(format);\n}\n\nexport function formatToDate(date: dayjs.Dayjs | undefined = undefined, format = DATE_FORMAT): string {\n  return dayjs(date).format(format);\n}\n\nexport const dateUtil = dayjs;\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/desform/customExpression.ts",
    "content": "/*\n *\n * 这里填写用户自定义的表达式\n * 可用在Online表单的默认值表达式中使用\n * 需要外部使用的变量或方法一定要 export，否则无法识别\n * 示例：\n *   export const name = '张三'; // const 是常量\n *   export let age = 17; // 看情况 export const 还是 let ，两者都可正常使用\n *   export function content(arg) { // export 方法，可传参数，使用时要加括号，值一定要return回去，可以返回Promise\n *     return 'content' + arg;\n *   }\n *   export const address = (arg) => content(arg) + ' | 北京市'; // export 箭头函数也可以\n *\n */\n\n/** 字段默认值官方示例：获取地址 */\nexport function demoFieldDefVal_getAddress(arg) {\n  if (!arg) {\n    arg = '朝阳区';\n  }\n  return `北京市 ${arg}`;\n}\n\n/** 自定义JS函数示例 */\nexport function sayHi(name) {\n  if (!name) {\n    name = '张三';\n  }\n  return `您好，我叫： ${name}`;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/dict/DictColors.js",
    "content": "const whiteColor = '#ffffff'\nconst blackColor = '#666666'\n\nexport const Colors = [\n  // 背景颜色，文字颜色\n  ['#2196F3', whiteColor],\n  ['#08C9C9', whiteColor],\n  ['#00C345', whiteColor],\n  ['#FAD714', whiteColor],\n  ['#FF9300', whiteColor],\n  ['#F52222', whiteColor],\n  ['#EB2F96', whiteColor],\n  ['#7500EA', whiteColor],\n  ['#2D46C4', whiteColor],\n  ['#484848', whiteColor],\n  // --------------------\n  ['#C9E6FC', blackColor],\n  ['#C3F2F2', blackColor],\n  ['#C2F1D2', blackColor],\n  ['#FEF6C6', blackColor],\n  ['#FFE5C2', blackColor],\n  ['#FDCACA', blackColor],\n  ['#FACDE6', blackColor],\n  ['#DEC2FA', blackColor],\n  ['#CCD2F1', blackColor],\n  ['#D3D3D3', blackColor],\n]\n\nexport const NONE_COLOR = ['#e9e9e9', blackColor]\n\n/**\n * 返回一个颜色迭代器，每次调用返回一个颜色，当颜色用完后，再从头开始\n * @param {number} initIndex 初始颜色索引\n * @returns {{getIndex: function, next: function}}\n */\nexport function getColorIterator(initIndex = 0) {\n  let index = initIndex;\n  if (index < 0 || index >= Colors.length) {\n    index = 0;\n  }\n  return {\n    getIndex: () => index,\n    next() {\n      const color = Colors[index];\n      index = (index + 1) % Colors.length;\n      return color;\n    },\n  }\n}\n\n/**\n * 根据颜色获取当前坐标和颜色\n */\nexport function getItemColor(color) {\n  if(!color){\n    return NONE_COLOR[1];\n  }\n  let colorIndex = Colors.findIndex((value)=>{\n    return value[0] === color;\n  })\n  if(colorIndex === -1){\n    return NONE_COLOR[1];\n  }\n  return Colors[colorIndex][1];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/dict/JDictSelectUtil.js",
    "content": "/**\n * 字典 util\n * author: scott\n * date: 20190109\n */\n\nimport { ajaxGetDictItems, getDictItemsByCode } from './index';\n\n/**\n * 获取字典数组\n * 【目前仅表单设计器页面使用该方法】\n * @param dictCode 字典Code\n * @param isTransformResponse 是否转换返回结果\n * @return List<Map>\n */\nexport async function initDictOptions(dictCode, isTransformResponse = true) {\n  if (!dictCode) {\n    return '字典Code不能为空!';\n  }\n  //优先从缓存中读取字典配置\n  if (getDictItemsByCode(dictCode)) {\n    let res = {};\n    res.result = getDictItemsByCode(dictCode);\n    res.success = true;\n    if (isTransformResponse) {\n      return res.result;\n    } else {\n      return res;\n    }\n  }\n  //获取字典数组\n  return await ajaxGetDictItems(dictCode, {}, { isTransformResponse });\n}\n\n/**\n * 字典值替换文本通用方法\n * @param dictOptions  字典数组\n * @param text  字典值\n * @return String\n */\nexport function filterDictText(dictOptions, text) {\n  // --update-begin----author:sunjianlei---date:20200323------for: 字典翻译 text 允许逗号分隔 ---\n  if (text != null && Array.isArray(dictOptions)) {\n    let result = [];\n    // 允许多个逗号分隔，允许传数组对象\n    let splitText;\n    if (Array.isArray(text)) {\n      splitText = text;\n    } else {\n      splitText = text.toString().trim().split(',');\n    }\n    for (let txt of splitText) {\n      let dictText = txt;\n      for (let dictItem of dictOptions) {\n        // 代码逻辑说明: 【TV360X-469】兼容数据null值防止报错\n        if (dictItem == null) continue;\n        if (dictItem.value == null) continue;\n        if (txt.toString() === dictItem.value.toString()) {\n          dictText = dictItem.text || dictItem.title || dictItem.label;\n          break;\n        }\n      }\n      result.push(dictText);\n    }\n    return result.join(',');\n  }\n  return text;\n  // --update-end----author:sunjianlei---date:20200323------for: 字典翻译 text 允许逗号分隔 ---\n}\n\n/**\n * 字典值替换文本通用方法(多选)\n * @param dictOptions  字典数组\n * @param text  字典值\n * @return String\n */\nexport function filterMultiDictText(dictOptions, text) {\n  //js “!text” 认为0为空，所以做提前处理\n  if (text === 0 || text === '0') {\n    if (dictOptions) {\n      for (let dictItem of dictOptions) {\n        if (text == dictItem.value) {\n          return dictItem.text;\n        }\n      }\n    }\n  }\n\n  if (!text || text == 'undefined' || text == 'null' || !dictOptions || dictOptions.length == 0) {\n    return '';\n  }\n  let re = '';\n  text = text.toString();\n  let arr = text.split(',');\n  dictOptions.forEach(function (option) {\n    if (option) {\n      for (let i = 0; i < arr.length; i++) {\n        if (arr[i] === option.value) {\n          re += option.text + ',';\n          break;\n        }\n      }\n    }\n  });\n  if (re == '') {\n    return text;\n  }\n  return re.substring(0, re.length - 1);\n}\n\n/**\n * 字典值替换文本通用方法(多选)\n * @param dictOptions  字典数组\n * @param val  字典值\n * @return {*[]} 返回字典项原对象\n */\nexport function filterMultiDictObjs(dictOptions, val) {\n  val = val?.toString?.() ?? '';\n  if (!val || !dictOptions || dictOptions.length === 0) {\n    return [];\n  }\n  const objs = [];\n  const vals = val.split(',');\n  for (const item of vals) {\n    const option = dictOptions.find((option) => option && option.value === item);\n    if (option) {\n      objs.push({\n        value: item,\n        text: option.text || option.title || option.label,\n        color: option.color,\n        hasColor: !!option.color,\n      });\n    }\n  }\n  return objs;\n}\n\n/**\n * 翻译字段值对应的文本\n * @param children\n * @returns string\n */\nexport function filterDictTextByCache(dictCode, key) {\n  if (key == null || key.length == 0) {\n    return;\n  }\n  if (!dictCode) {\n    return '字典Code不能为空!';\n  }\n  //优先从缓存中读取字典配置\n  if (getDictItemsByCode(dictCode)) {\n    let item = getDictItemsByCode(dictCode).filter((t) => t['value'] == key);\n    if (item && item.length > 0) {\n      return item[0]['text'];\n    }\n  }\n}\n\n/** 通过code获取字典数组 */\nexport async function getDictItems(dictCode, params) {\n  //优先从缓存中读取字典配置\n  if (getDictItemsByCode(dictCode)) {\n    let desformDictItems = getDictItemsByCode(dictCode).map((item) => ({\n      ...item,\n      label: item.text,\n    }));\n    return Promise.resolve(desformDictItems);\n  }\n\n  //缓存中没有，就请求后台\n  return await ajaxGetDictItems(dictCode, params)\n    .then((result) => {\n      if (result.length) {\n        let res = result.map((item) => ({ ...item, label: item.text }));\n        console.log('------- 从DB中获取到了字典-------dictCode : ', dictCode, res);\n        return Promise.resolve(res);\n      } else {\n        console.error('getDictItems error: : ', res);\n        return Promise.resolve([]);\n      }\n    })\n    .catch((res) => {\n      console.error('getDictItems error: ', res);\n      return Promise.resolve([]);\n    });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/dict/index.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { useUserStore } from '/@/store/modules/user';\nimport { getAuthCache } from '/@/utils/auth';\nimport { DB_DICT_DATA_KEY } from '/@/enums/cacheEnum';\n\n/**\n * 从缓存中获取字典配置\n * @param code\n */\nexport const getDictItemsByCode = (code) => {\n  // 代码逻辑说明: 【QQYUN-6417】生产环境字典慢的问题\n  const userStore = useUserStore();\n  const dictItems = userStore.getAllDictItems;\n  if (null != dictItems && typeof dictItems === 'object' && dictItems[code]) {\n    return dictItems[code];\n  }\n  //兼容以前的旧写法\n  if (getAuthCache(DB_DICT_DATA_KEY) && getAuthCache(DB_DICT_DATA_KEY)[code]) {\n    return getAuthCache(DB_DICT_DATA_KEY)[code];\n  }\n\n\n};\n/**\n * 从缓存中获取Pop字典配置\n * @param text\n * @param code\n */\nexport const getPopDictByCode = (text, codeStr) => {\n  const [code, dictCode, dictText] = codeStr.split(',');\n  if (!code || !dictCode || !dictText) {\n    return [];\n  }\n  return defHttp.get(\n    { url: `/online/api/cgreportGetDataPackage`, params: { code, dictText, dictCode, dataList: text } },\n    { isTransformResponse: false }\n  );\n};\n/**\n * 获取字典数组\n * @param dictCode 字典Code\n * @return List<Map>\n */\nexport const initDictOptions = (code) => {\n  //1.优先从缓存中读取字典配置\n  if (getDictItemsByCode(code)) {\n    return new Promise((resolve, reject) => {\n      resolve(getDictItemsByCode(code));\n    });\n  }\n  //2.获取字典数组\n  // 代码逻辑说明: 字典数据请求前将参数编码处理，但是不能直接编码，因为可能之前已经编码过了\n  if (code.indexOf(',') > 0 && code.indexOf(' ') > 0) {\n    // 编码后类似sys_user%20where%20username%20like%20xxx' 是不包含空格的,这里判断如果有空格和逗号说明需要编码处理\n    code = encodeURI(code);\n  }\n  return defHttp.get({ url: `/sys/dict/getDictItems/${code}` });\n};\n/**\n * 获取字典数组\n * @param code 字典Code\n * @param params 查询参数\n * @param options 查询配置\n * @return List<Map>\n */\nexport const ajaxGetDictItems = (code, params, options?) => defHttp.get({ url: `/sys/dict/getDictItems/${code}`, params }, options);\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/domUtils.ts",
    "content": "import type { FunctionArgs } from '@vueuse/core';\nimport { upperFirst } from 'lodash-es';\n\nexport interface ViewportOffsetResult {\n  left: number;\n  top: number;\n  right: number;\n  bottom: number;\n  rightIncludeBody: number;\n  bottomIncludeBody: number;\n}\n\nexport function getBoundingClientRect(element: Element): DOMRect | number {\n  if (!element || !element.getBoundingClientRect) {\n    return 0;\n  }\n  return element.getBoundingClientRect();\n}\n\nfunction trim(string: string) {\n  return (string || '').replace(/^[\\s\\uFEFF]+|[\\s\\uFEFF]+$/g, '');\n}\n\n/* istanbul ignore next */\nexport function hasClass(el: Element, cls: string) {\n  if (!el || !cls) return false;\n  if (cls.indexOf(' ') !== -1) throw new Error('className should not contain space.');\n  if (el.classList) {\n    return el.classList.contains(cls);\n  } else {\n    return (' ' + el.className + ' ').indexOf(' ' + cls + ' ') > -1;\n  }\n}\n\n/* istanbul ignore next */\nexport function addClass(el: Element, cls: string) {\n  if (!el) return;\n  let curClass = el.className;\n  const classes = (cls || '').split(' ');\n\n  for (let i = 0, j = classes.length; i < j; i++) {\n    const clsName = classes[i];\n    if (!clsName) continue;\n\n    if (el.classList) {\n      el.classList.add(clsName);\n    } else if (!hasClass(el, clsName)) {\n      curClass += ' ' + clsName;\n    }\n  }\n  if (!el.classList) {\n    el.className = curClass;\n  }\n}\n\n/* istanbul ignore next */\nexport function removeClass(el: Element, cls: string) {\n  if (!el || !cls) return;\n  const classes = cls.split(' ');\n  let curClass = ' ' + el.className + ' ';\n\n  for (let i = 0, j = classes.length; i < j; i++) {\n    const clsName = classes[i];\n    if (!clsName) continue;\n\n    if (el.classList) {\n      el.classList.remove(clsName);\n    } else if (hasClass(el, clsName)) {\n      curClass = curClass.replace(' ' + clsName + ' ', ' ');\n    }\n  }\n  if (!el.classList) {\n    el.className = trim(curClass);\n  }\n}\n/**\n * Get the left and top offset of the current element\n * left: the distance between the leftmost element and the left side of the document\n * top: the distance from the top of the element to the top of the document\n * right: the distance from the far right of the element to the right of the document\n * bottom: the distance from the bottom of the element to the bottom of the document\n * rightIncludeBody: the distance between the leftmost element and the right side of the document\n * bottomIncludeBody: the distance from the bottom of the element to the bottom of the document\n *\n * @description:\n */\nexport function getViewportOffset(element: Element): ViewportOffsetResult {\n  const doc = document.documentElement;\n\n  const docScrollLeft = doc.scrollLeft;\n  const docScrollTop = doc.scrollTop;\n  const docClientLeft = doc.clientLeft;\n  const docClientTop = doc.clientTop;\n\n  const pageXOffset = window.pageXOffset;\n  const pageYOffset = window.pageYOffset;\n\n  const box = getBoundingClientRect(element);\n\n  const { left: retLeft, top: rectTop, width: rectWidth, height: rectHeight } = box as DOMRect;\n\n  const scrollLeft = (pageXOffset || docScrollLeft) - (docClientLeft || 0);\n  const scrollTop = (pageYOffset || docScrollTop) - (docClientTop || 0);\n  const offsetLeft = retLeft + pageXOffset;\n  const offsetTop = rectTop + pageYOffset;\n\n  const left = offsetLeft - scrollLeft;\n  const top = offsetTop - scrollTop;\n\n  const clientWidth = window.document.documentElement.clientWidth;\n  const clientHeight = window.document.documentElement.clientHeight;\n  return {\n    left: left,\n    top: top,\n    right: clientWidth - rectWidth - left,\n    bottom: clientHeight - rectHeight - top,\n    rightIncludeBody: clientWidth - left,\n    bottomIncludeBody: clientHeight - top,\n  };\n}\n\nexport function hackCss(attr: string, value: string) {\n  const prefix: string[] = ['webkit', 'Moz', 'ms', 'OT'];\n\n  const styleObj: any = {};\n  prefix.forEach((item) => {\n    styleObj[`${item}${upperFirst(attr)}`] = value;\n  });\n  return {\n    ...styleObj,\n    [attr]: value,\n  };\n}\n\n/* istanbul ignore next */\nexport function on(element: Element | HTMLElement | Document | Window, event: string, handler: EventListenerOrEventListenerObject): void {\n  if (element && event && handler) {\n    element.addEventListener(event, handler, false);\n  }\n}\n\n/* istanbul ignore next */\nexport function off(element: Element | HTMLElement | Document | Window, event: string, handler: Fn): void {\n  if (element && event && handler) {\n    element.removeEventListener(event, handler, false);\n  }\n}\n\n/* istanbul ignore next */\nexport function once(el: HTMLElement, event: string, fn: EventListener): void {\n  const listener = function (this: any, ...args: unknown[]) {\n    if (fn) {\n      fn.apply(this, args);\n    }\n    off(el, event, listener);\n  };\n  on(el, event, listener);\n}\n\nexport function useRafThrottle<T extends FunctionArgs>(fn: T): T {\n  let locked = false;\n  // @ts-ignore\n  return function (...args: any[]) {\n    if (locked) return;\n    locked = true;\n    window.requestAnimationFrame(() => {\n      // @ts-ignore\n      fn.apply(this, args);\n      locked = false;\n    });\n  };\n}\n\n/**\n * 查找父级元素，直到找到符合条件的元素\n * @param element 当前元素\n * @param checkFn 判断条件\n */\nexport function queryParentElement(element: HTMLElement, checkFn: (node: HTMLElement) => boolean): HTMLElement | null {\n  let ele: HTMLElement | null = element;\n  while (ele) {\n    try {\n      if (checkFn(ele)) {\n        return ele;\n      }\n      ele = ele.parentElement;\n    } catch (e) {\n      return null;\n    }\n  }\n  return null;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/encryption/signMd5Utils.js",
    "content": "import md5 from 'md5';\n//签名密钥串(前后端要一致，正式发布请自行修改)\nconst signatureSecret = 'dd05f1c54d63749eda95f9fa6d49v442a';\n\nexport default class signMd5Utils {\n  /**\n   * json参数升序\n   * @param jsonObj 发送参数\n   */\n\n  static sortAsc(jsonObj) {\n    let arr = new Array();\n    let num = 0;\n    for (let i in jsonObj) {\n      arr[num] = i;\n      num++;\n    }\n    let sortArr = arr.sort();\n    let sortObj = {};\n    for (let i in sortArr) {\n      sortObj[sortArr[i]] = jsonObj[sortArr[i]];\n    }\n    return sortObj;\n  }\n\n  /**\n   * @param url 请求的url,应该包含请求参数(url的?后面的参数)\n   * @param requestParams 请求参数(@RequestParam(get)的JSON参数)\n   * @param requestBodyParams 请求参数(@RequestBody(post)参数)\n   * @returns {string} 获取签名\n   */\n  static getSign(url, requestParams, requestBodyParams) {\n    let urlParams = this.parseQueryString(url);\n    let jsonObj = this.mergeObject(urlParams, requestParams);\n    // 代码逻辑说明: 【QQYUN-9005】发送短信加签---\n    if(requestBodyParams){\n      jsonObj = this.mergeObject(jsonObj, requestBodyParams)\n    }\n    let requestBody = this.sortAsc(jsonObj);\n    delete requestBody._t;\n    // console.log('sign requestBody:', requestBody);\n    return md5(JSON.stringify(requestBody) + signatureSecret).toUpperCase();\n  }\n\n  /**\n   * @param url 请求的url\n   * @returns {{}} 将url中请求参数组装成json对象(url的?后面的参数)\n   */\n  static parseQueryString(url) {\n    let urlReg = /^[^\\?]+\\?([\\w\\W]+)$/,\n      paramReg = /([^&=]+)=([\\w\\W]*?)(&|$|#)/g,\n      urlArray = urlReg.exec(url),\n      result = {};\n\n    // 获取URL上最后带逗号的参数变量 sys/dict/getDictItems/sys_user,realname,username\n    //【这边条件没有encode】带条件参数例子：/sys/dict/getDictItems/sys_user,realname,id,username!='admin'%20order%20by%20create_time\n    let lastpathVariable = url.substring(url.lastIndexOf('/') + 1);\n    if (lastpathVariable.includes(',')) {\n      if (lastpathVariable.includes('?')) {\n        lastpathVariable = lastpathVariable.substring(0, lastpathVariable.indexOf('?'));\n      }\n      //解决Sign 签名校验失败 #2728\n      //decodeURI对特殊字符没有没有编码和解码的能力，需要使用decodeURIComponent\n      result['x-path-variable'] = decodeURIComponent(lastpathVariable);\n    }\n    if (urlArray && urlArray[1]) {\n      let paramString = urlArray[1],\n        paramResult;\n      while ((paramResult = paramReg.exec(paramString)) != null) {\n        //数字值转为string类型，前后端加密规则保持一致\n        if (this.myIsNaN(paramResult[2])) {\n          paramResult[2] = paramResult[2].toString();\n        }\n        result[paramResult[1]] = paramResult[2];\n      }\n    }\n    return result;\n  }\n\n  /**\n   * @returns {*} 将两个对象合并成一个\n   */\n  static mergeObject(objectOne, objectTwo) {\n    if (objectTwo && Object.keys(objectTwo).length > 0) {\n      for (let key in objectTwo) {\n        if (objectTwo.hasOwnProperty(key) === true) {\n          //数字值转为string类型，前后端加密规则保持一致\n          if (this.myIsNaN(objectTwo[key])) {\n            objectTwo[key] = objectTwo[key].toString();\n          }\n          //布尔类型转成string类型，前后端加密规则保持一致\n          if (typeof objectTwo[key] === 'boolean') {\n            objectTwo[key] = objectTwo[key].toString();\n          }\n          objectOne[key] = objectTwo[key];\n        }\n      }\n    }\n    return objectOne;\n  }\n\n  static urlEncode(param, key, encode) {\n    if (param == null) return '';\n    let paramStr = '';\n    let t = typeof param;\n    if (t == 'string' || t == 'number' || t == 'boolean') {\n      paramStr += '&' + key + '=' + (encode == null || encode ? encodeURIComponent(param) : param);\n    } else {\n      for (let i in param) {\n        let k = key == null ? i : key + (param instanceof Array ? '[' + i + ']' : '.' + i);\n        paramStr += this.urlEncode(param[i], k, encode);\n      }\n    }\n    return paramStr;\n  }\n\n  /**\n   * 接口签名用 生成header中的时间戳\n   * @returns {number}\n   */\n  static getTimestamp() {\n    return new Date().getTime();\n  }\n\n  // static getDateTimeToString() {\n  //   const date_ = new Date()\n  //   const year = date_.getFullYear()\n  //   let month = date_.getMonth() + 1\n  //   let day = date_.getDate()\n  //   if (month < 10) month = '0' + month\n  //   if (day < 10) day = '0' + day\n  //   let hours = date_.getHours()\n  //   let mins = date_.getMinutes()\n  //   let secs = date_.getSeconds()\n  //   const msecs = date_.getMilliseconds()\n  //   if (hours < 10) hours = '0' + hours\n  //   if (mins < 10) mins = '0' + mins\n  //   if (secs < 10) secs = '0' + secs\n  //   if (msecs < 10) secs = '0' + msecs\n  //   return year + '' + month + '' + day + '' + hours + '' + mins + '' + secs\n  // }\n  // true:数值型的，false：非数值型\n  static myIsNaN(value) {\n    return typeof value === 'number' && !isNaN(value);\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/env.ts",
    "content": "import type { GlobEnvConfig } from '/#/config';\n\nimport { warn } from '/@/utils/log';\nimport pkg from '../../package.json';\nimport { getConfigFileName } from '../../build/getConfigFileName';\nimport { getGlobal } from \"@/qiankun/micro\";\n\nexport function getCommonStoragePrefix() {\n  const { VITE_GLOB_APP_SHORT_NAME } = getAppEnvConfig();\n  return `${VITE_GLOB_APP_SHORT_NAME}__${getEnv()}`.toUpperCase();\n}\n\n// Generate cache key according to version\nexport function getStorageShortName() {\n  return `${getCommonStoragePrefix()}${`__${pkg.version}`}__`.toUpperCase();\n}\n\nexport function getAppEnvConfig() {\n  const ENV_NAME = getConfigFileName(import.meta.env);\n\n  const global = getGlobal();\n\n  const ENV = (import.meta.env.DEV\n    ? // Get the global configuration (the configuration will be extracted independently when packaging)\n      (import.meta.env as unknown as GlobEnvConfig)\n    : global[ENV_NAME as any]) as unknown as GlobEnvConfig;\n\n  const {\n    VITE_GLOB_APP_TITLE,\n    VITE_GLOB_API_URL,\n    VITE_USE_MOCK,\n    VITE_GLOB_APP_SHORT_NAME,\n    VITE_GLOB_API_URL_PREFIX,\n    VITE_GLOB_APP_OPEN_SSO,\n    VITE_GLOB_APP_OPEN_QIANKUN,\n    VITE_GLOB_APP_CAS_BASE_URL,\n    VITE_GLOB_DOMAIN_URL,\n    VITE_GLOB_ONLINE_VIEW_URL,\n    // 全局隐藏哪些布局，多个用逗号隔开\n    VITE_GLOB_HIDE_LAYOUT_TYPES,\n    // 当前运行在什么平台\n    VITE_GLOB_RUN_PLATFORM,\n\n    // 【JEECG作为乾坤子应用】\n    VITE_GLOB_QIANKUN_MICRO_APP_NAME,\n    VITE_GLOB_QIANKUN_MICRO_APP_ENTRY,\n    \n    //在线文档编辑版本。可选属性：wps, onlyoffice\n    VITE_GLOB_ONLINE_DOCUMENT_VERSION,\n  } = ENV;\n\n  // if (!/^[a-zA-Z\\_]*$/.test(VITE_GLOB_APP_SHORT_NAME)) {\n  //   warn(\n  //     `VITE_GLOB_APP_SHORT_NAME 变量只能是字符/下划线，请在环境变量中修改并重新运行.`\n  //   );\n  // }\n\n  return {\n    VITE_GLOB_APP_TITLE,\n    VITE_GLOB_API_URL,\n    VITE_USE_MOCK,\n    VITE_GLOB_APP_SHORT_NAME,\n    VITE_GLOB_API_URL_PREFIX,\n    VITE_GLOB_APP_OPEN_SSO,\n    VITE_GLOB_APP_OPEN_QIANKUN,\n    VITE_GLOB_APP_CAS_BASE_URL,\n    VITE_GLOB_DOMAIN_URL,\n    VITE_GLOB_ONLINE_VIEW_URL,\n    VITE_GLOB_HIDE_LAYOUT_TYPES,\n    VITE_GLOB_RUN_PLATFORM,\n\n    // 【JEECG作为乾坤子应用】\n    VITE_GLOB_QIANKUN_MICRO_APP_NAME,\n    VITE_GLOB_QIANKUN_MICRO_APP_ENTRY,\n\n    //在线文档编辑版本。可选属性：wps, onlyoffice\n    VITE_GLOB_ONLINE_DOCUMENT_VERSION\n  };\n}\n\n/**\n * @description: Development mode\n */\nexport const devMode = 'development';\n\n/**\n * @description: Production mode\n */\nexport const prodMode = 'production';\n\n/**\n * @description: Get environment variables\n * @returns:\n * @example:\n */\nexport function getEnv(): string {\n  return import.meta.env.MODE;\n}\n\n/**\n * @description: Is it a development mode\n * @returns:\n * @example:\n */\nexport function isDevMode(): boolean {\n  return import.meta.env.DEV;\n}\n\n/**\n * @description: Is it a production mode\n * @returns:\n * @example:\n */\nexport function isProdMode(): boolean {\n  return import.meta.env.PROD;\n}\n\nexport function getHideLayoutTypes(): string[] {\n  const {VITE_GLOB_HIDE_LAYOUT_TYPES} = getAppEnvConfig();\n  if (typeof VITE_GLOB_HIDE_LAYOUT_TYPES !== 'string') {\n    return [];\n  }\n  return VITE_GLOB_HIDE_LAYOUT_TYPES.split(',');\n}\n\n/**\n * 获取在线文档版本号\n */\nexport function getOnlineDocumentVersion(): string {\n  const { VITE_GLOB_ONLINE_DOCUMENT_VERSION } = getAppEnvConfig();\n  if (typeof VITE_GLOB_ONLINE_DOCUMENT_VERSION !== 'string') {\n    return 'wps';\n  }\n  return VITE_GLOB_ONLINE_DOCUMENT_VERSION;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/event/index.ts",
    "content": "import ResizeObserver from 'resize-observer-polyfill';\n\nconst isServer = typeof window === 'undefined';\n\n/* istanbul ignore next */\nfunction resizeHandler(entries: any[]) {\n  for (const entry of entries) {\n    const listeners = entry.target.__resizeListeners__ || [];\n    if (listeners.length) {\n      listeners.forEach((fn: () => any) => {\n        fn();\n      });\n    }\n  }\n}\n\n/* istanbul ignore next */\nexport function addResizeListener(element: any, fn: () => any) {\n  if (isServer) return;\n  if (!element.__resizeListeners__) {\n    element.__resizeListeners__ = [];\n    element.__ro__ = new ResizeObserver(resizeHandler);\n    element.__ro__.observe(element);\n  }\n  element.__resizeListeners__.push(fn);\n}\n\n/* istanbul ignore next */\nexport function removeResizeListener(element: any, fn: () => any) {\n  if (!element || !element.__resizeListeners__) return;\n  element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);\n  if (!element.__resizeListeners__.length) {\n    element.__ro__.disconnect();\n  }\n}\n\nexport function triggerWindowResize() {\n  const event = document.createEvent('HTMLEvents');\n  event.initEvent('resize', true, true);\n  (event as any).eventType = 'message';\n  window.dispatchEvent(event);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/factory/createAsyncComponent.tsx",
    "content": "import {\n  defineAsyncComponent,\n  // FunctionalComponent, CSSProperties\n} from 'vue';\nimport { Spin } from 'ant-design-vue';\nimport { noop } from '/@/utils/index';\n\n// const Loading: FunctionalComponent<{ size: 'small' | 'default' | 'large' }> = (props) => {\n//   const style: CSSProperties = {\n//     position: 'absolute',\n//     display: 'flex',\n//     justifyContent: 'center',\n//     alignItems: 'center',\n//   };\n//   return (\n//     <div style={style}>\n//       <Spin spinning={true} size={props.size} />\n//     </div>\n//   );\n// };\n\ninterface Options {\n  size?: 'default' | 'small' | 'large';\n  delay?: number;\n  timeout?: number;\n  loading?: boolean;\n  retry?: boolean;\n}\n\nexport function createAsyncComponent(loader: Fn, options: Options = {}) {\n  const { size = 'small', delay = 100, timeout = 30000, loading = false, retry = true } = options;\n  return defineAsyncComponent({\n    loader,\n    loadingComponent: loading ? <Spin spinning={true} size={size} /> : undefined,\n    // The error component will be displayed if a timeout is\n    // provided and exceeded. Default: Infinity.\n    // TODO\n    timeout,\n    // errorComponent\n    // Defining if component is suspensible. Default: true.\n    // suspensible: false,\n    delay,\n    /**\n     *\n     * @param {*} error Error message object\n     * @param {*} retry A function that indicating whether the async component should retry when the loader promise rejects\n     * @param {*} fail  End of failure\n     * @param {*} attempts Maximum allowed retries number\n     */\n    onError: !retry\n      ? noop\n      : (error, retry, fail, attempts) => {\n          if (error.message.match(/fetch/) && attempts <= 3) {\n            // retry on fetch errors, 3 max attempts\n            retry();\n          } else {\n            // Note that retry/fail are like resolve/reject of a promise:\n            // one of them must be called for the error handling to continue.\n            fail();\n          }\n        },\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/file/base64Conver.ts",
    "content": "/**\n * @description: base64 to blob\n */\nexport function dataURLtoBlob(base64Buf: string): Blob {\n  const arr = base64Buf.split(',');\n  const typeItem = arr[0];\n  const mime = typeItem.match(/:(.*?);/)![1];\n  const bstr = atob(arr[1]);\n  let n = bstr.length;\n  const u8arr = new Uint8Array(n);\n  while (n--) {\n    u8arr[n] = bstr.charCodeAt(n);\n  }\n  return new Blob([u8arr], { type: mime });\n}\n\n/**\n * img url to base64\n * @param url\n */\nexport function urlToBase64(url: string, mineType?: string): Promise<string> {\n  return new Promise((resolve, reject) => {\n    let canvas = document.createElement('CANVAS') as Nullable<HTMLCanvasElement>;\n    const ctx = canvas!.getContext('2d');\n\n    const img = new Image();\n    img.crossOrigin = '';\n    img.onload = function () {\n      if (!canvas || !ctx) {\n        return reject();\n      }\n      canvas.height = img.height;\n      canvas.width = img.width;\n      ctx.drawImage(img, 0, 0);\n      const dataURL = canvas.toDataURL(mineType || 'image/png');\n      canvas = null;\n      resolve(dataURL);\n    };\n    img.src = url;\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/file/download.ts",
    "content": "import { openWindow } from '..';\nimport { dataURLtoBlob, urlToBase64 } from './base64Conver';\n\n/**\n * Download online pictures\n * @param url\n * @param filename\n * @param mime\n * @param bom\n */\nexport function downloadByOnlineUrl(url: string, filename: string, mime?: string, bom?: BlobPart) {\n  urlToBase64(url).then((base64) => {\n    downloadByBase64(base64, filename, mime, bom);\n  });\n}\n\n/**\n * Download pictures based on base64\n * @param buf\n * @param filename\n * @param mime\n * @param bom\n */\nexport function downloadByBase64(buf: string, filename: string, mime?: string, bom?: BlobPart) {\n  const base64Buf = dataURLtoBlob(buf);\n  downloadByData(base64Buf, filename, mime, bom);\n}\n\n/**\n * Download according to the background interface file stream\n * @param {*} data\n * @param {*} filename\n * @param {*} mime\n * @param {*} bom\n */\nexport function downloadByData(data: BlobPart, filename: string, mime?: string, bom?: BlobPart) {\n  const blobData = typeof bom !== 'undefined' ? [bom, data] : [data];\n  const blob = new Blob(blobData, { type: mime || 'application/octet-stream' });\n  if (typeof window.navigator.msSaveBlob !== 'undefined') {\n    window.navigator.msSaveBlob(blob, filename);\n  } else {\n    const blobURL = window.URL.createObjectURL(blob);\n    const tempLink = document.createElement('a');\n    tempLink.style.display = 'none';\n    tempLink.href = blobURL;\n    tempLink.setAttribute('download', filename);\n    if (typeof tempLink.download === 'undefined') {\n      tempLink.setAttribute('target', '_blank');\n    }\n    document.body.appendChild(tempLink);\n    tempLink.click();\n    document.body.removeChild(tempLink);\n    window.URL.revokeObjectURL(blobURL);\n  }\n}\n\n/**\n * Download file according to file address\n * @param {*} sUrl\n */\nexport function downloadByUrl({ url, target = '_blank', fileName }: { url: string; target?: TargetContext; fileName?: string }): boolean {\n  const isChrome = window.navigator.userAgent.toLowerCase().indexOf('chrome') > -1;\n  const isSafari = window.navigator.userAgent.toLowerCase().indexOf('safari') > -1;\n\n  if (/(iP)/g.test(window.navigator.userAgent)) {\n    console.error('Your browser does not support download!');\n    return false;\n  }\n  if (isChrome || isSafari) {\n    const link = document.createElement('a');\n    link.href = url;\n    link.target = target;\n\n    if (link.download !== undefined) {\n      link.download = fileName || url.substring(url.lastIndexOf('/') + 1, url.length);\n    }\n\n    if (document.createEvent) {\n      const e = document.createEvent('MouseEvents');\n      e.initEvent('click', true, true);\n      link.dispatchEvent(e);\n      return true;\n    }\n  }\n  if (url.indexOf('?') === -1) {\n    url += '?download';\n  }\n\n  openWindow(url, { target });\n  return true;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/getConfigByMenuType.ts",
    "content": "import { MenuTypeEnum, MenuModeEnum } from '/@/enums/menuEnum';\nimport { APP_PRESET_COLOR_LIST, HEADER_PRESET_BG_COLOR_LIST, SIDE_BAR_BG_COLOR_LIST } from '/@/settings/designSetting';\n\n/**\n * 根据菜单类型和模式获取对应的主题色\n * @param menuType 菜单类型\n */\nexport function getConfigByMenuType(menuType: MenuTypeEnum): {\n  themeColor: string;\n  headerBgColor: string;\n  sideBgColor: string;\n  split: boolean;\n  mode: MenuModeEnum;\n} {\n  let themeColor;\n  let headerBgColor;\n  let sideBgColor;\n  let split = false;\n  let mode: MenuModeEnum = MenuModeEnum.INLINE;\n  if (menuType === MenuTypeEnum.TOP_MENU) {\n    // 顶部栏导航\n    themeColor = APP_PRESET_COLOR_LIST[1];\n    headerBgColor = HEADER_PRESET_BG_COLOR_LIST[4];\n    mode = MenuModeEnum.HORIZONTAL;\n  } else if (menuType === MenuTypeEnum.MIX) {\n    // 顶部混合菜单模式\n    themeColor = APP_PRESET_COLOR_LIST[2];\n    headerBgColor = HEADER_PRESET_BG_COLOR_LIST[2];\n    sideBgColor = SIDE_BAR_BG_COLOR_LIST[3];\n    split = true;\n  } else if (menuType === MenuTypeEnum.MIX_SIDEBAR) {\n    // 侧边折叠导航模式\n    themeColor = APP_PRESET_COLOR_LIST[1];\n    headerBgColor = HEADER_PRESET_BG_COLOR_LIST[0];\n    sideBgColor = SIDE_BAR_BG_COLOR_LIST[0];\n  } else if (menuType === MenuTypeEnum.SIDEBAR) {\n    // 侧边栏导航\n    themeColor = APP_PRESET_COLOR_LIST[1];\n    headerBgColor = HEADER_PRESET_BG_COLOR_LIST[4];\n    sideBgColor = SIDE_BAR_BG_COLOR_LIST[7];\n  }\n  return {\n    themeColor,\n    headerBgColor,\n    sideBgColor,\n    split,\n    mode,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/helper/treeHelper.ts",
    "content": "interface TreeHelperConfig {\n  id: string;\n  children: string;\n  pid: string;\n}\n\n// 默认配置\nconst DEFAULT_CONFIG: TreeHelperConfig = {\n  id: 'id',\n  children: 'children',\n  pid: 'pid',\n};\n\n// 获取配置。  Object.assign 从一个或多个源对象复制到目标对象\nconst getConfig = (config: Partial<TreeHelperConfig>) => Object.assign({}, DEFAULT_CONFIG, config);\n\n// tree from list\n// 列表中的树\nexport function listToTree<T = any>(list: any[], config: Partial<TreeHelperConfig> = {}): T[] {\n  const conf = getConfig(config) as TreeHelperConfig;\n  const nodeMap = new Map();\n  const result: T[] = [];\n  const { id, children, pid } = conf;\n\n  for (const node of list) {\n    node[children] = node[children] || [];\n    nodeMap.set(node[id], node);\n  }\n  for (const node of list) {\n    const parent = nodeMap.get(node[pid]);\n    (parent ? parent[children] : result).push(node);\n  }\n  return result;\n}\n\nexport function treeToList<T = any>(tree: any, config: Partial<TreeHelperConfig> = {}): T {\n  config = getConfig(config);\n  const { children } = config;\n  const result: any = [...tree];\n  for (let i = 0; i < result.length; i++) {\n    if (!result[i][children!]) continue;\n    result.splice(i + 1, 0, ...result[i][children!]);\n  }\n  return result;\n}\n\nexport function findNode<T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T | null {\n  config = getConfig(config);\n  const { children } = config;\n  const list = [...tree];\n  for (const node of list) {\n    if (func(node)) return node;\n    node[children!] && list.push(...node[children!]);\n  }\n  return null;\n}\n\nexport function findNodeAll<T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T[] {\n  config = getConfig(config);\n  const { children } = config;\n  const list = [...tree];\n  const result: T[] = [];\n  for (const node of list) {\n    func(node) && result.push(node);\n    node[children!] && list.push(...node[children!]);\n  }\n  return result;\n}\n\nexport function findPath<T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T | T[] | null {\n  config = getConfig(config);\n  const path: T[] = [];\n  const list = [...tree];\n  const visitedSet = new Set();\n  const { children } = config;\n  while (list.length) {\n    const node = list[0];\n    if (visitedSet.has(node)) {\n      path.pop();\n      list.shift();\n    } else {\n      visitedSet.add(node);\n      node[children!] && list.unshift(...node[children!]);\n      path.push(node);\n      if (func(node)) {\n        return path;\n      }\n    }\n  }\n  return null;\n}\n\nexport function findPathAll(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}) {\n  config = getConfig(config);\n  const path: any[] = [];\n  const list = [...tree];\n  const result: any[] = [];\n  const visitedSet = new Set(),\n    { children } = config;\n  while (list.length) {\n    const node = list[0];\n    if (visitedSet.has(node)) {\n      path.pop();\n      list.shift();\n    } else {\n      visitedSet.add(node);\n      node[children!] && list.unshift(...node[children!]);\n      path.push(node);\n      func(node) && result.push([...path]);\n    }\n  }\n  return result;\n}\n\nexport function filter<T = any>(\n  tree: T[],\n  func: (n: T) => boolean,\n  // Partial 将 T 中的所有属性设为可选\n  config: Partial<TreeHelperConfig> = {}\n): T[] {\n  // 获取配置\n  config = getConfig(config);\n  const children = config.children as string;\n\n  function listFilter(list: T[]) {\n    return list\n      .map((node: any) => ({ ...node }))\n      .filter((node) => {\n        // 递归调用 对含有children项  进行再次调用自身函数 listFilter\n        node[children] = node[children] && listFilter(node[children]);\n        // 执行传入的回调 func 进行过滤\n        return func(node) || (node[children] && node[children].length);\n      });\n  }\n\n  return listFilter(tree);\n}\n\nexport function forEach<T = any>(tree: T[], func: (n: T) => any, config: Partial<TreeHelperConfig> = {}): void {\n  config = getConfig(config);\n  const list: any[] = [...tree];\n  const { children } = config;\n  for (let i = 0; i < list.length; i++) {\n    //func 返回true就终止遍历，避免大量节点场景下无意义循环，引起浏览器卡顿\n    if (func(list[i])) {\n      return;\n    }\n    children && list[i][children] && list.splice(i + 1, 0, ...list[i][children]);\n  }\n}\n\n/**\n * @description: Extract tree specified structure\n * @description: 提取树指定结构\n */\nexport function treeMap<T = any>(treeData: T[], opt: { children?: string; conversion: Fn }): T[] {\n  return treeData.map((item) => treeMapEach(item, opt));\n}\n\n/**\n * @description: Extract tree specified structure\n * @description: 提取树指定结构\n */\nexport function treeMapEach(data: any, { children = 'children', conversion }: { children?: string; conversion: Fn }) {\n  const haveChildren = Array.isArray(data[children]) && data[children].length > 0;\n  const conversionData = conversion(data) || {};\n  if (haveChildren) {\n    return {\n      ...conversionData,\n      [children]: data[children].map((i: number) =>\n        treeMapEach(i, {\n          children,\n          conversion,\n        })\n      ),\n    };\n  } else {\n    return {\n      ...conversionData,\n    };\n  }\n}\n\n/**\n * 递归遍历树结构\n * @param treeDatas 树\n * @param callBack 回调\n * @param parentNode 父节点\n */\nexport function eachTree(treeDatas: any[], callBack: Fn, parentNode = {}) {\n  treeDatas.forEach((element) => {\n    const newNode = callBack(element, parentNode) || element;\n    if (element.children) {\n      eachTree(element.children, callBack, newNode);\n    }\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/helper/tsxHelper.tsx",
    "content": "import { Slots } from 'vue';\nimport { isFunction } from '/@/utils/is';\n\n/**\n * @description:  Get slot to prevent empty error\n */\nexport function getSlot(slots: Slots, slot = 'default', data?: any) {\n  if (!slots || !Reflect.has(slots, slot)) {\n    return null;\n  }\n  if (!isFunction(slots[slot])) {\n    console.error(`${slot} is not a function!`);\n    return null;\n  }\n  const slotFn = slots[slot];\n  if (!slotFn) return null;\n  return slotFn(data);\n}\n\n/**\n * extends slots\n * @param slots\n * @param excludeKeys\n */\nexport function extendSlots(slots: Slots, excludeKeys: string[] = []) {\n  const slotKeys = Object.keys(slots);\n  const ret: any = {};\n  slotKeys.map((key) => {\n    if (excludeKeys.includes(key)) {\n      return null;\n    }\n    ret[key] = () => getSlot(slots, key);\n  });\n  return ret;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/helper/validator.ts",
    "content": "import { dateUtil } from '/@/utils/dateUtil';\nimport { duplicateCheck } from '/@/views/system/user/user.api';\n\nexport const rules = {\n  rule(type, required) {\n    if (type === 'email') {\n      return this.email(required);\n    }\n    if (type === 'phone') {\n      return this.phone(required);\n    }\n  },\n  email(required) {\n    return [\n      {\n        required: required ? required : false,\n        validator: async (_rule, value) => {\n          if (required == true && !value) {\n            return Promise.reject('请输入邮箱!');\n          }\n          if (\n            value &&\n            !new RegExp(\n              /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/\n            ).test(value)\n          ) {\n            return Promise.reject('请输入正确邮箱格式!');\n          }\n          return Promise.resolve();\n        },\n        trigger: 'change',\n      },\n    ] as ArrayRule;\n  },\n  phone(required) {\n    return [\n      {\n        required: required,\n        validator: async (_, value) => {\n          if (required && !value) {\n            return Promise.reject('请输入手机号码!');\n          }\n          if (!/^1[3456789]\\d{9}$/.test(value)) {\n            return Promise.reject('手机号码格式有误');\n          }\n          return Promise.resolve();\n        },\n        trigger: 'change',\n      },\n    ];\n  },\n  startTime(endTime, required) {\n    return [\n      {\n        required: required ? required : false,\n        validator: (_, value) => {\n          if (required && !value) {\n            return Promise.reject('请选择开始时间');\n          }\n          if (endTime && value && dateUtil(endTime).isBefore(value)) {\n            return Promise.reject('开始时间需小于结束时间');\n          }\n          return Promise.resolve();\n        },\n        trigger: 'change',\n      },\n    ];\n  },\n  endTime(startTime, required) {\n    return [\n      {\n        required: required ? required : false,\n        validator: (_, value) => {\n          if (required && !value) {\n            return Promise.reject('请选择结束时间');\n          }\n          if (startTime && value && dateUtil(value).isBefore(startTime)) {\n            return Promise.reject('结束时间需大于开始时间');\n          }\n          return Promise.resolve();\n        },\n        trigger: 'change',\n      },\n    ];\n  },\n  confirmPassword(values, required) {\n    return [\n      {\n        required: required ? required : false,\n        validator: (_, value) => {\n          if (!value) {\n            return Promise.reject('密码不能为空');\n          }\n          if (value !== values.password) {\n            return Promise.reject('两次输入的密码不一致!');\n          }\n          return Promise.resolve();\n        },\n      },\n    ];\n  },\n  duplicateCheckRule(tableName, fieldName, model, schema, required?) {\n    return [\n      {\n        validator: (_, value) => {\n          if (!value && required) {\n            return Promise.reject(`请输入${schema.label}`);\n          }\n          return new Promise<void>((resolve, reject) => {\n            duplicateCheck({\n              tableName,\n              fieldName,\n              fieldVal: value,\n              dataId: model.id,\n            })\n              .then((res) => {\n                res.success ? resolve() : reject(res.message || '校验失败');\n              })\n              .catch((err) => {\n                reject(err.message || '验证失败');\n              });\n          });\n        },\n      },\n    ] as ArrayRule;\n  },\n};\n\n/**\n * 唯一校验函数，给原生<a-form>使用，vben的表单校验建议使用上述rules\n * @param tableName 表名\n * @param fieldName 字段名\n * @param fieldVal 字段值\n * @param dataId 数据ID\n */\nexport async function duplicateValidate(tableName, fieldName, fieldVal, dataId) {\n  try {\n    let params = {\n      tableName,\n      fieldName,\n      fieldVal,\n      dataId: dataId,\n    };\n    const res = await duplicateCheck(params);\n    if (res.success) {\n      return Promise.resolve();\n    } else {\n      return Promise.reject(res.message || '校验失败');\n    }\n  } catch (e) {\n    return Promise.reject('校验失败,可能是断网等问题导致的校验失败');\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/http/axios/Axios.ts",
    "content": "import type { AxiosRequestConfig, AxiosInstance, AxiosResponse, AxiosError } from 'axios';\nimport type { RequestOptions, Result, UploadFileParams, UploadFileCallBack } from '/#/axios';\nimport type { CreateAxiosOptions } from './axiosTransform';\nimport axios from 'axios';\nimport qs from 'qs';\nimport { AxiosCanceler } from './axiosCancel';\nimport { isFunction } from '/@/utils/is';\nimport { cloneDeep } from 'lodash-es';\nimport { ContentTypeEnum } from '/@/enums/httpEnum';\nimport { RequestEnum } from '/@/enums/httpEnum';\nimport { useGlobSetting } from '/@/hooks/setting';\nimport { useMessage } from '/@/hooks/web/useMessage';\n\nconst { createMessage } = useMessage();\nexport * from './axiosTransform';\n\n/**\n * @description:  axios module\n */\nexport class VAxios {\n  private axiosInstance: AxiosInstance;\n  private readonly options: CreateAxiosOptions;\n\n  constructor(options: CreateAxiosOptions) {\n    this.options = options;\n    this.axiosInstance = axios.create(options);\n    this.setupInterceptors();\n  }\n\n  /**\n   * @description:  Create axios instance\n   */\n  private createAxios(config: CreateAxiosOptions): void {\n    this.axiosInstance = axios.create(config);\n  }\n\n  private getTransform() {\n    const { transform } = this.options;\n    return transform;\n  }\n\n  getAxios(): AxiosInstance {\n    return this.axiosInstance;\n  }\n\n  /**\n   * @description: Reconfigure axios\n   */\n  configAxios(config: CreateAxiosOptions) {\n    if (!this.axiosInstance) {\n      return;\n    }\n    this.createAxios(config);\n  }\n\n  /**\n   * @description: Set general header\n   */\n  setHeader(headers: any): void {\n    if (!this.axiosInstance) {\n      return;\n    }\n    Object.assign(this.axiosInstance.defaults.headers, headers);\n  }\n\n  /**\n   * @description: Interceptor configuration\n   */\n  private setupInterceptors() {\n    const transform = this.getTransform();\n    if (!transform) {\n      return;\n    }\n    const { requestInterceptors, requestInterceptorsCatch, responseInterceptors, responseInterceptorsCatch } = transform;\n\n    const axiosCanceler = new AxiosCanceler();\n\n    // 请求侦听器配置处理\n    this.axiosInstance.interceptors.request.use((config: AxiosRequestConfig) => {\n      // If cancel repeat request is turned on, then cancel repeat request is prohibited\n      // @ts-ignore\n      const { ignoreCancelToken } = config.requestOptions;\n\n      const ignoreCancel = ignoreCancelToken !== undefined ? ignoreCancelToken : this.options.requestOptions?.ignoreCancelToken;\n\n      !ignoreCancel && axiosCanceler.addPending(config);\n      if (requestInterceptors && isFunction(requestInterceptors)) {\n        config = requestInterceptors(config, this.options);\n      }\n      return config;\n    }, undefined);\n\n    // 请求拦截器错误捕获\n    requestInterceptorsCatch &&\n      isFunction(requestInterceptorsCatch) &&\n      this.axiosInstance.interceptors.request.use(undefined, requestInterceptorsCatch);\n\n    // 响应结果拦截器处理\n    this.axiosInstance.interceptors.response.use((res: AxiosResponse<any>) => {\n      res && axiosCanceler.removePending(res.config);\n      if (responseInterceptors && isFunction(responseInterceptors)) {\n        res = responseInterceptors(res);\n      }\n      return res;\n    }, undefined);\n\n    // 响应结果拦截器错误捕获\n    responseInterceptorsCatch &&\n      isFunction(responseInterceptorsCatch) &&\n      this.axiosInstance.interceptors.response.use(undefined, responseInterceptorsCatch);\n  }\n\n  /**\n   * 文件上传\n   */\n  //--@updateBy-begin----author:liusq---date:20211117------for:增加上传回调参数callback------\n  uploadFile<T = any>(config: AxiosRequestConfig, params: UploadFileParams, callback?: UploadFileCallBack) {\n    //--@updateBy-end----author:liusq---date:20211117------for:增加上传回调参数callback------\n    const formData = new window.FormData();\n    const customFilename = params.name || 'file';\n\n    if (params.filename) {\n      formData.append(customFilename, params.file, params.filename);\n    } else {\n      formData.append(customFilename, params.file);\n    }\n    const glob = useGlobSetting();\n    config.baseURL = glob.uploadUrl;\n    if (params.data) {\n      Object.keys(params.data).forEach((key) => {\n        const value = params.data![key];\n        if (Array.isArray(value)) {\n          value.forEach((item) => {\n            formData.append(`${key}[]`, item);\n          });\n          return;\n        }\n\n        formData.append(key, params.data[key]);\n      });\n    }\n\n    return this.axiosInstance\n      .request<T>({\n        ...config,\n        method: 'POST',\n        data: formData,\n        headers: {\n          'Content-type': ContentTypeEnum.FORM_DATA,\n          ignoreCancelToken: true,\n        },\n      })\n      .then((res: any) => {\n        //--@updateBy-begin----author:liusq---date:20210914------for:上传判断是否包含回调方法------\n        if (callback?.success && isFunction(callback?.success)) {\n          callback?.success(res?.data);\n          //--@updateBy-end----author:liusq---date:20210914------for:上传判断是否包含回调方法------\n        } else if (callback?.isReturnResponse) {\n          //--@updateBy-begin----author:liusq---date:20211117------for:上传判断是否返回res信息------\n          return Promise.resolve(res?.data);\n          //--@updateBy-end----author:liusq---date:20211117------for:上传判断是否返回res信息------\n        } else {\n          if (res.data.success == true && res.data.code == 200) {\n            createMessage.success(res.data.message);\n          } else {\n            createMessage.error(res.data.message);\n          }\n        }\n      });\n  }\n\n  // 支持表单数据\n  supportFormData(config: AxiosRequestConfig) {\n    const headers = config.headers || this.options.headers;\n    const contentType = headers?.['Content-Type'] || headers?.['content-type'];\n\n    if (contentType !== ContentTypeEnum.FORM_URLENCODED || !Reflect.has(config, 'data') || config.method?.toUpperCase() === RequestEnum.GET) {\n      return config;\n    }\n\n    return {\n      ...config,\n      data: qs.stringify(config.data, { arrayFormat: 'brackets' }),\n    };\n  }\n\n  get<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Promise<T> {\n    return this.request({ ...config, method: 'GET' }, options);\n  }\n\n  post<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Promise<T> {\n    return this.request({ ...config, method: 'POST' }, options);\n  }\n\n  put<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Promise<T> {\n    return this.request({ ...config, method: 'PUT' }, options);\n  }\n\n  delete<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Promise<T> {\n    return this.request({ ...config, method: 'DELETE' }, options);\n  }\n\n  request<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Promise<T> {\n    let conf: CreateAxiosOptions = cloneDeep(config);\n    const transform = this.getTransform();\n\n    const { requestOptions } = this.options;\n\n    const opt: RequestOptions = Object.assign({}, requestOptions, options);\n\n    const { beforeRequestHook, requestCatchHook, transformRequestHook } = transform || {};\n    if (beforeRequestHook && isFunction(beforeRequestHook)) {\n      conf = beforeRequestHook(conf, opt);\n    }\n    conf.requestOptions = opt;\n\n    conf = this.supportFormData(conf);\n\n    return new Promise((resolve, reject) => {\n      this.axiosInstance\n        .request<any, AxiosResponse<Result>>(conf)\n        .then((res: AxiosResponse<Result>) => {\n          if (transformRequestHook && isFunction(transformRequestHook)) {\n            try {\n              const ret = transformRequestHook(res, opt);\n              //zhangyafei---添加回调方法\n              config.success && config.success(res.data);\n              //zhangyafei---添加回调方法\n              resolve(ret);\n            } catch (err) {\n              reject(err || new Error('request error!'));\n            }\n            return;\n          }\n          resolve(res as unknown as Promise<T>);\n        })\n        .catch((e: Error | AxiosError) => {\n          if (requestCatchHook && isFunction(requestCatchHook)) {\n            reject(requestCatchHook(e, opt));\n            return;\n          }\n          if (axios.isAxiosError(e)) {\n            // 在此处重写来自axios的错误消息\n          }\n          reject(e);\n        });\n    });\n  }\n\n\n  /**\n   * 【用于评论功能】自定义文件上传-请求\n   * @param url\n   * @param formData\n   */\n  uploadMyFile<T = any>(url, formData) {\n    const glob = useGlobSetting();\n    return this.axiosInstance\n      .request<T>({\n        url: url,\n        baseURL: glob.uploadUrl,\n        method: 'POST',\n        data: formData,\n        headers: {\n          'Content-type': ContentTypeEnum.FORM_DATA,\n          ignoreCancelToken: true,\n        },\n      });\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/http/axios/axiosCancel.ts",
    "content": "import type { AxiosRequestConfig, Canceler } from 'axios';\nimport axios from 'axios';\nimport { isFunction } from '/@/utils/is';\n\n// Used to store the identification and cancellation function of each request\nlet pendingMap = new Map<string, Canceler>();\n\nexport const getPendingUrl = (config: AxiosRequestConfig) => [config.method, config.url].join('&');\n\nexport class AxiosCanceler {\n  /**\n   * Add request\n   * @param {Object} config\n   */\n  addPending(config: AxiosRequestConfig) {\n    this.removePending(config);\n    const url = getPendingUrl(config);\n    config.cancelToken =\n      config.cancelToken ||\n      new axios.CancelToken((cancel) => {\n        if (!pendingMap.has(url)) {\n          // If there is no current request in pending, add it\n          pendingMap.set(url, cancel);\n        }\n      });\n  }\n\n  /**\n   * @description: Clear all pending\n   */\n  removeAllPending() {\n    pendingMap.forEach((cancel) => {\n      cancel && isFunction(cancel) && cancel();\n    });\n    pendingMap.clear();\n  }\n\n  /**\n   * Removal request\n   * @param {Object} config\n   */\n  removePending(config: AxiosRequestConfig) {\n    const url = getPendingUrl(config);\n\n    if (pendingMap.has(url)) {\n      // If there is a current request identifier in pending,\n      // the current request needs to be cancelled and removed\n      const cancel = pendingMap.get(url);\n      cancel && cancel(url);\n      pendingMap.delete(url);\n    }\n  }\n\n  /**\n   * @description: reset\n   */\n  reset(): void {\n    pendingMap = new Map<string, Canceler>();\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/http/axios/axiosTransform.ts",
    "content": "/**\n * Data processing class, can be configured according to the project\n */\nimport type { AxiosRequestConfig, AxiosResponse } from 'axios';\nimport type { RequestOptions, Result } from '/#/axios';\n\nexport interface CreateAxiosOptions extends AxiosRequestConfig {\n  authenticationScheme?: string;\n  transform?: AxiosTransform;\n  requestOptions?: RequestOptions;\n}\n\nexport abstract class AxiosTransform {\n  /**\n   * @description: Process configuration before request\n   * @description: Process configuration before request\n   */\n  beforeRequestHook?: (config: AxiosRequestConfig, options: RequestOptions) => AxiosRequestConfig;\n\n  /**\n   * @description: Request successfully processed\n   */\n  transformRequestHook?: (res: AxiosResponse<Result>, options: RequestOptions) => any;\n\n  /**\n   * @description: 请求失败处理\n   */\n  requestCatchHook?: (e: Error, options: RequestOptions) => Promise<any>;\n\n  /**\n   * @description: 请求之前的拦截器\n   */\n  requestInterceptors?: (config: AxiosRequestConfig, options: CreateAxiosOptions) => AxiosRequestConfig;\n\n  /**\n   * @description: 请求之后的拦截器\n   */\n  responseInterceptors?: (res: AxiosResponse<any>) => AxiosResponse<any>;\n\n  /**\n   * @description: 请求之前的拦截器错误处理\n   */\n  requestInterceptorsCatch?: (error: Error) => void;\n\n  /**\n   * @description: 请求之后的拦截器错误处理\n   */\n  responseInterceptorsCatch?: (error: Error) => void;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/http/axios/checkStatus.ts",
    "content": "import type { ErrorMessageMode } from '/#/axios';\nimport { useMessage } from '/@/hooks/web/useMessage';\nimport { useI18n } from '/@/hooks/web/useI18n';\n// import router from '/@/router';\n// import { PageEnum } from '/@/enums/pageEnum';\nimport { useUserStoreWithOut } from '/@/store/modules/user';\nimport projectSetting from '/@/settings/projectSetting';\nimport { SessionTimeoutProcessingEnum } from '/@/enums/appEnum';\n\nconst { createMessage, createErrorModal } = useMessage();\nconst error = createMessage.error!;\nconst stp = projectSetting.sessionTimeoutProcessing;\n\nexport function checkStatus(status: number, msg: string, errorMessageMode: ErrorMessageMode = 'message'): void {\n  const { t } = useI18n();\n  const userStore = useUserStoreWithOut();\n  let errMessage = '';\n\n  switch (status) {\n    case 400:\n      errMessage = `${msg}`;\n      break;\n    // 401: Not logged in\n    // Jump to the login page if not logged in, and carry the path of the current page\n    // Return to the current page after successful login. This step needs to be operated on the login page.\n    case 401:\n      userStore.setToken(undefined);\n      errMessage = msg || t('sys.api.errMsg401');\n      if (stp === SessionTimeoutProcessingEnum.PAGE_COVERAGE) {\n        userStore.setSessionTimeout(true);\n      } else {\n        userStore.logout(true);\n      }\n      break;\n    case 403:\n      errMessage = t('sys.api.errMsg403');\n      break;\n    // 404请求不存在\n    case 404:\n      errMessage = t('sys.api.errMsg404');\n      break;\n    case 405:\n      errMessage = t('sys.api.errMsg405');\n      break;\n    case 408:\n      errMessage = t('sys.api.errMsg408');\n      break;\n    case 500:\n      errMessage = t('sys.api.errMsg500');\n      break;\n    case 501:\n      errMessage = t('sys.api.errMsg501');\n      break;\n    case 502:\n      errMessage = t('sys.api.errMsg502');\n      break;\n    case 503:\n      errMessage = t('sys.api.errMsg503');\n      break;\n    case 504:\n      errMessage = t('sys.api.errMsg504');\n      break;\n    case 505:\n      errMessage = t('sys.api.errMsg505');\n      break;\n    default:\n  }\n\n  if (errMessage) {\n    if (errorMessageMode === 'modal') {\n      createErrorModal({ title: t('sys.api.errorTip'), content: errMessage });\n    } else if (errorMessageMode === 'message') {\n      error({ content: errMessage, key: `global_error_message_status_${status}` });\n    }\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/http/axios/helper.ts",
    "content": "import { isObject, isString } from '/@/utils/is';\nimport dayjs from \"dayjs\";\n// 代码逻辑说明: 【QQYUN-9138】系统用户保存的时间没有秒\nconst DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';\n\nexport function joinTimestamp<T extends boolean>(join: boolean, restful: T): T extends true ? string : object;\n\nexport function joinTimestamp(join: boolean, restful = false): string | object {\n  if (!join) {\n    return restful ? '' : {};\n  }\n  const now = new Date().getTime();\n  if (restful) {\n    return `?_t=${now}`;\n  }\n  return { _t: now };\n}\n\n/**\n * @description: Format request parameter time\n */\nexport function formatRequestDate(params: Recordable) {\n  if (Object.prototype.toString.call(params) !== '[object Object]') {\n    return;\n  }\n\n  for (const key in params) {\n    // 判断是否是dayjs实例\n    if (dayjs.isDayjs(params[key])) {\n      params[key] = params[key].format(DATE_TIME_FORMAT);\n    }\n    if (isString(key)) {\n      const value = params[key];\n      if (value) {\n        try {\n          params[key] = isString(value) ? value.trim() : value;\n        } catch (error) {\n          throw new Error(error);\n        }\n      }\n    }\n    if (isObject(params[key])) {\n      formatRequestDate(params[key]);\n    }\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/http/axios/index.ts",
    "content": "// axios配置  可自行根据项目进行更改，只需更改该文件即可，其他文件可以不动\n// The axios configuration can be changed according to the project, just change the file, other files can be left unchanged\n\nimport type { AxiosResponse } from 'axios';\nimport type { RequestOptions, Result } from '/#/axios';\nimport type { AxiosTransform, CreateAxiosOptions } from './axiosTransform';\nimport { VAxios } from './Axios';\nimport { checkStatus } from './checkStatus';\nimport { router } from '/@/router';\nimport { useGlobSetting } from '/@/hooks/setting';\nimport { useMessage } from '/@/hooks/web/useMessage';\nimport { RequestEnum, ResultEnum, ContentTypeEnum, ConfigEnum } from '/@/enums/httpEnum';\nimport { isString } from '/@/utils/is';\nimport { getToken, getTenantId } from '/@/utils/auth';\nimport { setObjToUrlParams, deepMerge } from '/@/utils';\nimport signMd5Utils from '/@/utils/encryption/signMd5Utils';\nimport { useErrorLogStoreWithOut } from '/@/store/modules/errorLog';\nimport { useI18n } from '/@/hooks/web/useI18n';\nimport { joinTimestamp, formatRequestDate } from './helper';\nimport { useUserStoreWithOut } from '/@/store/modules/user';\nimport { cloneDeep } from \"lodash-es\";\nconst globSetting = useGlobSetting();\nconst urlPrefix = globSetting.urlPrefix;\nconst { createMessage, createErrorModal } = useMessage();\n\n/**\n * @description: 数据处理，方便区分多种处理方式\n */\nconst transform: AxiosTransform = {\n  /**\n   * @description: 处理请求数据。如果数据不是预期格式，可直接抛出错误\n   */\n  transformRequestHook: (res: AxiosResponse<Result>, options: RequestOptions) => {\n    const { t } = useI18n();\n    const { isTransformResponse, isReturnNativeResponse } = options;\n    // 是否返回原生响应头 比如：需要获取响应头时使用该属性\n    if (isReturnNativeResponse) {\n      return res;\n    }\n    // 不进行任何处理，直接返回\n    // 用于页面代码可能需要直接获取code，data，message这些信息时开启\n    if (!isTransformResponse) {\n      return res.data;\n    }\n    // 错误的时候返回\n\n    const { data } = res;\n    if (!data) {\n      // return '[HTTP] Request has no return value';\n      throw new Error(t('sys.api.apiRequestFailed'));\n    }\n    //  这里 code，result，message为 后台统一的字段，需要在 types.ts内修改为项目自己的接口返回格式\n    const { code, result, message, success } = data;\n    // 这里逻辑可以根据项目进行修改\n    const hasSuccess = data && Reflect.has(data, 'code') && (code === ResultEnum.SUCCESS || code === 200);\n    if (hasSuccess) {\n      if (success && message && options.successMessageMode === 'success') {\n        //信息成功提示\n        createMessage.success(message);\n      }\n      return result;\n    }\n\n    // 在此处根据自己项目的实际情况对不同的code执行不同的操作\n    // 如果不希望中断当前请求，请return数据，否则直接抛出异常即可\n    let timeoutMsg = '';\n    switch (code) {\n      case ResultEnum.TIMEOUT:\n        timeoutMsg = t('sys.api.timeoutMessage');\n        const userStore = useUserStoreWithOut();\n        userStore.setToken(undefined);\n        userStore.logout(true);\n        break;\n      default:\n        if (message) {\n          timeoutMsg = message;\n        }\n    }\n\n    // errorMessageMode=‘modal’的时候会显示modal错误弹窗，而不是消息提示，用于一些比较重要的错误\n    // errorMessageMode='none' 一般是调用时明确表示不希望自动弹出错误提示\n    if (options.errorMessageMode === 'modal') {\n      createErrorModal({ title: t('sys.api.errorTip'), content: timeoutMsg });\n    } else if (options.errorMessageMode === 'message') {\n      createMessage.error(timeoutMsg);\n    }\n\n    throw new Error(timeoutMsg || t('sys.api.apiRequestFailed'));\n  },\n\n  // 请求之前处理config\n  beforeRequestHook: (config, options) => {\n    const { apiUrl, joinPrefix, joinParamsToUrl, formatDate, joinTime = true, urlPrefix } = options;\n\n    // http开头的请求url，不加前缀\n    let isStartWithHttp = false;\n    const requestUrl = config.url;\n    if(requestUrl!=null && (requestUrl.startsWith(\"http:\") || requestUrl.startsWith(\"https:\"))){\n      isStartWithHttp = true;\n    }\n    // 代码逻辑说明: 【QQYUN-9685】构建 electron 桌面应用\n    if (!isStartWithHttp && requestUrl != null) {\n      // 由于electron的url是file://开头的，所以需要判断一下\n      isStartWithHttp = requestUrl.startsWith('file://');\n    }\n    if (!isStartWithHttp && joinPrefix) {\n      config.url = `${urlPrefix}${config.url}`;\n    }\n\n    if (!isStartWithHttp && apiUrl && isString(apiUrl)) {\n      config.url = `${apiUrl}${config.url}`;\n    }\n    \n    const params = config.params || {};\n    const data = config.data || false;\n    formatDate && data && !isString(data) && formatRequestDate(data);\n    if (config.method?.toUpperCase() === RequestEnum.GET) {\n      if (!isString(params)) {\n        // 给 get 请求加上时间戳参数，避免从缓存中拿数据。\n        config.params = Object.assign(params || {}, joinTimestamp(joinTime, false));\n      } else {\n        // 兼容restful风格\n        config.url = config.url + params + `${joinTimestamp(joinTime, true)}`;\n        config.params = undefined;\n      }\n    } else {\n      if (!isString(params)) {\n        formatDate && formatRequestDate(params);\n        if (Reflect.has(config, 'data') && config.data && Object.keys(config.data).length > 0) {\n          config.data = data;\n          config.params = params;\n        } else {\n          // 非GET请求如果没有提供data，则将params视为data\n          config.data = params;\n          config.params = undefined;\n        }\n        if (joinParamsToUrl) {\n          config.url = setObjToUrlParams(config.url as string, Object.assign({}, config.params, config.data));\n        }\n      } else {\n        // 兼容restful风格\n        config.url = config.url + params;\n        config.params = undefined;\n      }\n    }\n\n    // 代码逻辑说明: 【JEECG作为乾坤子应用】作为乾坤子应用启动时，拼接请求路径\n    if (globSetting.isQiankunMicro) {\n      if (config.url && config.url.startsWith('/')) {\n        config.url = globSetting.qiankunMicroAppEntry + config.url\n      }\n    }\n\n    return config;\n  },\n\n  /**\n   * @description: 请求拦截器处理\n   */\n  requestInterceptors: (config: Recordable, options) => {\n    // 请求之前处理config\n    const token = getToken();\n    let tenantId: string | number = getTenantId();\n    \n    // 将签名和时间戳，添加在请求接口 Header\n    config.headers[ConfigEnum.TIMESTAMP] = signMd5Utils.getTimestamp();\n    config.headers[ConfigEnum.Sign] = signMd5Utils.getSign(config.url, cloneDeep(config.params), cloneDeep(config.data));\n    \n    config.headers[ConfigEnum.VERSION] = 'v3';\n    if (token && (config as Recordable)?.requestOptions?.withToken !== false) {\n      // jwt token\n      config.headers.Authorization = options.authenticationScheme ? `${options.authenticationScheme} ${token}` : token;\n      config.headers[ConfigEnum.TOKEN] = token;\n      \n      // 将签名和时间戳，添加在请求接口 Header\n      //config.headers[ConfigEnum.TIMESTAMP] = signMd5Utils.getTimestamp();\n      //config.headers[ConfigEnum.Sign] = signMd5Utils.getSign(config.url, config.params);\n      if (!tenantId) {\n        tenantId = 0;\n      }\n\n      // 代码逻辑说明: 【QQYUN-5279】修复分享的应用租户和当前登录租户不一致时，提示404的问题\n      const userStore = useUserStoreWithOut();\n      // 判断是否有临时租户id\n      if (userStore.hasShareTenantId && userStore.shareTenantId !== 0) {\n        // 临时租户id存在，使用临时租户id\n        tenantId = userStore.shareTenantId!;\n      }\n\n      config.headers[ConfigEnum.TENANT_ID] = tenantId;\n      //--update-end--author:liusq---date:20211105---for:将多租户id，添加在请求接口 Header\n\n      // ========================================================================================\n      // 代码逻辑说明: 添加低代码应用ID\n      let routeParams = router.currentRoute.value.params;\n      if (routeParams.appId) {\n        config.headers[ConfigEnum.X_LOW_APP_ID] = routeParams.appId;\n        // lowApp自定义筛选条件\n        if (routeParams.lowAppFilter) {\n          config.params = { ...config.params, ...JSON.parse(routeParams.lowAppFilter as string) };\n          delete routeParams.lowAppFilter;\n        }\n      }\n      // ========================================================================================\n\n    }\n    return config;\n  },\n\n  /**\n   * @description: 响应拦截器处理\n   */\n  responseInterceptors: (res: AxiosResponse<any>) => {\n    return res;\n  },\n\n  /**\n   * @description: 响应错误处理\n   */\n  responseInterceptorsCatch: (error: any) => {\n    const { t } = useI18n();\n    const errorLogStore = useErrorLogStoreWithOut();\n    errorLogStore.addAjaxErrorInfo(error);\n    const { response, code, message, config } = error || {};\n    const errorMessageMode = config?.requestOptions?.errorMessageMode || 'none';\n    //scott 20211022 token失效提示信息\n    //const msg: string = response?.data?.error?.message ?? '';\n    const msg: string = response?.data?.message ?? '';\n    const err: string = error?.toString?.() ?? '';\n    let errMessage = '';\n\n    try {\n      if (code === 'ECONNABORTED' && message.indexOf('timeout') !== -1) {\n        errMessage = t('sys.api.apiTimeoutMessage');\n      }\n      if (err?.includes('Network Error')) {\n        errMessage = t('sys.api.networkExceptionMsg');\n      }\n\n      if (errMessage) {\n        if (errorMessageMode === 'modal') {\n          createErrorModal({ title: t('sys.api.errorTip'), content: errMessage });\n        } else if (errorMessageMode === 'message') {\n          createMessage.error(errMessage);\n        }\n        return Promise.reject(error);\n      }\n    } catch (error) {\n      throw new Error(error);\n    }\n\n    checkStatus(error?.response?.status, msg, errorMessageMode);\n    return Promise.reject(error);\n  },\n};\n\nfunction createAxios(opt?: Partial<CreateAxiosOptions>) {\n  return new VAxios(\n    deepMerge(\n      {\n        // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#authentication_schemes\n        // authentication schemes，e.g: Bearer\n        // authenticationScheme: 'Bearer',\n        authenticationScheme: '',\n        //接口超时设置\n        timeout: 10 * 1000,\n        // 基础接口地址\n        // baseURL: globSetting.apiUrl,\n        headers: { 'Content-Type': ContentTypeEnum.JSON },\n        // 如果是form-data格式\n        // headers: { 'Content-Type': ContentTypeEnum.FORM_URLENCODED },\n        // 数据处理方式\n        transform,\n        // 配置项，下面的选项都可以在独立的接口请求中覆盖\n        requestOptions: {\n          // 默认将prefix 添加到url\n          joinPrefix: true,\n          // 是否返回原生响应头 比如：需要获取响应头时使用该属性\n          isReturnNativeResponse: false,\n          // 需要对返回数据进行处理\n          isTransformResponse: true,\n          // post请求的时候添加参数到url\n          joinParamsToUrl: false,\n          // 格式化提交参数时间\n          formatDate: true,\n          // 异常消息提示类型\n          errorMessageMode: 'message',\n          // 成功消息提示类型\n          successMessageMode: 'success',\n          // 接口地址\n          apiUrl: globSetting.apiUrl,\n          // 接口拼接地址\n          urlPrefix: urlPrefix,\n          //  是否加入时间戳\n          joinTime: true,\n          // 忽略重复请求\n          ignoreCancelToken: true,\n          // 是否携带token\n          withToken: true,\n        },\n      },\n      opt || {}\n    )\n  );\n}\nexport const defHttp = createAxios();\n\n// other api url\n// export const otherHttp = createAxios({\n//   requestOptions: {\n//     apiUrl: 'xxx',\n//   },\n// });\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/index.ts",
    "content": "import type { RouteLocationNormalized, RouteRecordNormalized } from 'vue-router';\nimport type { App, Plugin } from 'vue';\nimport type { FormSchema, FormActionType } from \"@/components/Form\";\n\nimport { unref } from 'vue';\nimport { isObject, isFunction, isString } from '/@/utils/is';\nimport Big from 'big.js';\nimport dayjs from \"dayjs\";\n// 代码逻辑说明: 【VUEN-656】配置外部网址打不开，原因是带了#号，需要替换一下\nexport const URL_HASH_TAB = `__AGWE4H__HASH__TAG__PWHRG__`;\n\nexport const noop = () => {};\n\n/**\n * @description:  Set ui mount node\n */\nexport function getPopupContainer(node?: HTMLElement): HTMLElement {\n  return (node?.parentNode as HTMLElement) ?? document.body;\n}\n\n/**\n * Add the object as a parameter to the URL\n * @param baseUrl url\n * @param obj\n * @returns {string}\n * eg:\n *  let obj = {a: '3', b: '4'}\n *  setObjToUrlParams('www.baidu.com', obj)\n *  ==>www.baidu.com?a=3&b=4\n */\nexport function setObjToUrlParams(baseUrl: string, obj: any): string {\n  let parameters = '';\n  for (const key in obj) {\n    parameters += key + '=' + encodeURIComponent(obj[key]) + '&';\n  }\n  parameters = parameters.replace(/&$/, '');\n  return /\\?$/.test(baseUrl) ? baseUrl + parameters : baseUrl.replace(/\\/?$/, '?') + parameters;\n}\n\nexport function deepMerge<T = any>(src: any = {}, target: any = {}): T {\n  let key: string;\n  for (key in target) {\n    // 代码逻辑说明: 【QQYUN-7872】online表单label较长优化\n    if (isObject(src[key]) && isObject(target[key])) {\n      src[key] = deepMerge(src[key], target[key]);\n    } else {\n      // 代码逻辑说明: 【issues/7940】componentProps写成函数形式时，updateSchema写成对象时，参数没合并\n      try {\n        if (isFunction(src[key]) && isObject(src[key]()) && isObject(target[key])) {\n          // src[key]是函数且返回对象，且target[key]是对象\n          src[key] = deepMerge(src[key](), target[key]);\n        } else if (isObject(src[key]) && isFunction(target[key]) && isObject(target[key]())) {\n          // target[key]是函数且返回对象，且src[key]是对象\n          src[key] = deepMerge(src[key], target[key]());\n        } else if (isFunction(src[key]) && isFunction(target[key]) && isObject(src[key]()) && isObject(target[key]())) {\n          // src[key]是函数且返回对象，target[key]是函数且返回对象\n          src[key] = deepMerge(src[key](), target[key]());\n        } else {\n          src[key] = target[key];\n        }\n      } catch (error) {\n        src[key] = target[key];\n      }\n    }\n  }\n  return src;\n}\n\nexport function openWindow(url: string, opt?: { target?: TargetContext | string; noopener?: boolean; noreferrer?: boolean }) {\n  const { target = '__blank', noopener = true, noreferrer = true } = opt || {};\n  const feature: string[] = [];\n\n  noopener && feature.push('noopener=yes');\n  noreferrer && feature.push('noreferrer=yes');\n\n  window.open(url, target, feature.join(','));\n}\n\n// dynamic use hook props\nexport function getDynamicProps<T, U>(props: T): Partial<U> {\n  const ret: Recordable = {};\n\n  // @ts-ignore\n  Object.keys(props).map((key) => {\n    ret[key] = unref((props as Recordable)[key]);\n  });\n\n  return ret as Partial<U>;\n}\n\n/**\n * 获取表单字段值数据类型\n * @param props\n * @param field\n * @updateBy:zyf\n */\nexport function getValueType(props, field) {\n  let formSchema = unref(unref(props)?.schemas)\n  let valueType = 'string';\n  if (formSchema) {\n    let schema = formSchema.filter((item) => item.field === field)[0];\n    // 代码逻辑说明: 【issues/8976】useListPage 查询中componentProps是函数时获取不到valueType\n    if (schema && schema.componentProps) {\n      if (isFunction(schema.componentProps)) {\n        try {\n          const result = schema.componentProps({ schema, tableAction: {}, formModel: {}, formActionType: {} });\n          valueType = result?.valueType ?? valueType;\n        } catch (err) {}\n      } else {\n        valueType = schema.componentProps.valueType ? schema.componentProps.valueType : valueType;\n      }\n    }\n  }\n  return valueType;\n}\n\n/**\n * 获取表单字段值数据类型\n * @param schema\n * @param formAction\n */\nexport function getValueTypeBySchema(schema: FormSchema, formAction: FormActionType) {\n  let valueType = 'string';\n  if (schema) {\n    const componentProps = formAction.getSchemaComponentProps(schema);\n    // 代码逻辑说明: 【issues/8738】componentProps是函数时获取不到valueType\n    if (isFunction(componentProps)) {\n      try {\n        const result = componentProps({ schema, tableAction: {}, formModel: {}, formActionType: {} });\n        valueType = result?.valueType ?? valueType;\n      } catch (err) {}\n    } else {\n      valueType = componentProps?.valueType ? componentProps?.valueType : valueType;\n    }\n  }\n  return valueType;\n}\n\n/**\n * 通过picker属性获取日期数据\n * @param data\n * @param picker\n */\nexport function getDateByPicker(data, picker) {\n  if (!data || !picker) {\n    return data;\n  }\n  /**\n   * 需要把年、年月、设置成这段时间内的第一天（[年季度]不需要处理antd回传的就是该季度的第一天，[年周]也不处理）\n   * 例如日期格式是年，传给数据库的时间必须是20240101\n   * 例如日期格式是年月（选择了202502），传给数据库的时间必须是20250201\n   */\n  if (picker === 'year') {\n    return dayjs(data).set('month', 0).set('date', 1).format('YYYY-MM-DD');\n  } else if (picker === 'month') {\n    return dayjs(data).set('date', 1).format('YYYY-MM-DD');\n  } else if (picker === 'week') {\n    return dayjs(data).startOf('week').format('YYYY-MM-DD');\n  }\n  return data;\n}\n\nexport function getRawRoute(route: RouteLocationNormalized): RouteLocationNormalized {\n  if (!route) return route;\n  const { matched, ...opt } = route;\n  return {\n    ...opt,\n    matched: (matched\n      ? matched.map((item) => ({\n          meta: item.meta,\n          name: item.name,\n          path: item.path,\n        }))\n      : undefined) as RouteRecordNormalized[],\n  };\n}\n/**\n * 深度克隆对象、数组\n * @param obj 被克隆的对象\n * @return 克隆后的对象\n */\nexport function cloneObject(obj) {\n  return JSON.parse(JSON.stringify(obj));\n}\n\nexport const withInstall = <T>(component: T, alias?: string) => {\n  //console.log(\"---初始化---\", component)\n\n  const comp = component as any;\n  comp.install = (app: App) => {\n    // @ts-ignore\n    app.component(comp.name || comp.displayName, component);\n    if (alias) {\n      app.config.globalProperties[alias] = component;\n    }\n  };\n  return component as T & Plugin;\n};\n\n/**\n * 获取url地址参数\n * @param paraName\n */\nexport function getUrlParam(paraName) {\n  let url = document.location.toString();\n  let arrObj = url.split('?');\n\n  if (arrObj.length > 1) {\n    let arrPara = arrObj[1].split('&');\n    let arr;\n\n    for (let i = 0; i < arrPara.length; i++) {\n      arr = arrPara[i].split('=');\n\n      if (arr != null && arr[0] == paraName) {\n        return arr[1];\n      }\n    }\n    return '';\n  } else {\n    return '';\n  }\n}\n\n/**\n * 休眠（setTimeout的promise版）\n * @param ms 要休眠的时间，单位：毫秒\n * @param fn callback，可空\n * @return Promise\n */\nexport function sleep(ms: number, fn?: Fn) {\n  return new Promise<void>((resolve) =>\n    setTimeout(() => {\n      fn && fn();\n      resolve();\n    }, ms)\n  );\n}\n\n/**\n * 不用正则的方式替换所有值\n * @param text 被替换的字符串\n * @param checker  替换前的内容\n * @param replacer 替换后的内容\n * @returns {String} 替换后的字符串\n */\nexport function replaceAll(text, checker, replacer) {\n  let lastText = text;\n  text = text.replace(checker, replacer);\n  if (lastText !== text) {\n    return replaceAll(text, checker, replacer);\n  }\n  return text;\n}\n\n/**\n * 获取URL上参数\n * @param url\n */\nexport function getQueryVariable(url) {\n  if (!url) return;\n\n  var t,\n    n,\n    r,\n    i = url.split('?')[1],\n    s = {};\n  (t = i.split('&')), (r = null), (n = null);\n  for (var o in t) {\n    var u = t[o].indexOf('=');\n    u !== -1 && ((r = t[o].substr(0, u)), (n = t[o].substr(u + 1)), (s[r] = n));\n  }\n  return s;\n}\n/**\n * 判断是否显示办理按钮\n * @param bpmStatus\n * @returns {*}\n */\nexport function showDealBtn(bpmStatus) {\n  if (bpmStatus != '1' && bpmStatus != '3' && bpmStatus != '4') {\n    return true;\n  }\n  return false;\n}\n/**\n * 数字转大写\n * @param value\n * @returns {*}\n */\nexport function numToUpper(value) {\n  if (value != '') {\n    let unit = new Array('仟', '佰', '拾', '', '仟', '佰', '拾', '', '角', '分');\n    const toDx = (n) => {\n      switch (n) {\n        case '0':\n          return '零';\n        case '1':\n          return '壹';\n        case '2':\n          return '贰';\n        case '3':\n          return '叁';\n        case '4':\n          return '肆';\n        case '5':\n          return '伍';\n        case '6':\n          return '陆';\n        case '7':\n          return '柒';\n        case '8':\n          return '捌';\n        case '9':\n          return '玖';\n      }\n    };\n    let lth = value.toString().length;\n    // 代码逻辑说明: 【issues/7493】numToUpper方法返回解决错误\n    value = new Big(value).times(100);\n    value += '';\n    let length = value.length;\n    if (lth <= 8) {\n      let result = '';\n      for (let i = 0; i < length; i++) {\n        if (i == 2) {\n          result = '元' + result;\n        } else if (i == 6) {\n          result = '万' + result;\n        }\n        if (value.charAt(length - i - 1) == 0) {\n          if (i != 0 && i != 1) {\n            if (result.charAt(0) != '零' && result.charAt(0) != '元' && result.charAt(0) != '万') {\n              result = '零' + result;\n            }\n          }\n          continue;\n        }\n        result = toDx(value.charAt(length - i - 1)) + unit[unit.length - i - 1] + result;\n      }\n      result += result.charAt(result.length - 1) == '元' ? '整' : '';\n      return result;\n    } else {\n      return null;\n    }\n  }\n  return null;\n}\n\n// 代码逻辑说明: 解决老的vue2动态导入文件语法 vite不支持的问题\nconst allModules = import.meta.glob('../views/**/*.vue');\nexport function importViewsFile(path): Promise<any> {\n  if (path.startsWith('/')) {\n    path = path.substring(1);\n  }\n  let page = '';\n  if (path.endsWith('.vue')) {\n    page = `../views/${path}`;\n  } else {\n    page = `../views/${path}.vue`;\n  }\n  return new Promise((resolve, reject) => {\n    let flag = true;\n    for (const path in allModules) {\n      if (path == page) {\n        flag = false;\n        allModules[path]().then((mod) => {\n          console.log(path, mod);\n          resolve(mod);\n        });\n      }\n    }\n    if (flag) {\n      reject('该文件不存在:' + page);\n    }\n  });\n}\n\n\n/**\n * 跳转至积木报表的 预览页面\n * @param url\n * @param id\n * @param token\n */\nexport function goJmReportViewPage(url, id, token) {\n  // URL支持{{ window.xxx }}占位符变量\n  url = url.replace(/{{([^}]+)?}}/g, (_s1, s2) => _eval(s2))\n  if (url.includes('?')) {\n    url += '&'\n  } else {\n    url += '?'\n  }\n  url += `id=${id}`\n  url += `&token=${token}`\n  window.open(url)\n}\n\n/**\n * 获取随机颜色\n */\nexport function getRandomColor(index?) {\n\n  const colors = [\n    'rgb(100, 181, 246)',\n    'rgb(77, 182, 172)',\n    'rgb(255, 183, 77)',\n    'rgb(229, 115, 115)',\n    'rgb(149, 117, 205)',\n    'rgb(161, 136, 127)',\n    'rgb(144, 164, 174)',\n    'rgb(77, 208, 225)',\n    'rgb(129, 199, 132)',\n    'rgb(255, 138, 101)',\n    'rgb(133, 202, 205)',\n    'rgb(167, 214, 118)',\n    'rgb(254, 225, 89)',\n    'rgb(251, 199, 142)',\n    'rgb(239, 145, 139)',\n    'rgb(169, 181, 255)',\n    'rgb(231, 218, 202)',\n    'rgb(252, 128, 58)',\n    'rgb(254, 161, 172)',\n    'rgb(194, 163, 205)',\n  ];\n  return index && index < 19 ? colors[index] : colors[Math.floor((Math.random()*(colors.length-1)))];\n}\n\nexport function getRefPromise(componentRef) {\n  return new Promise((resolve) => {\n    (function next() {\n      const ref = componentRef.value;\n      if (ref) {\n        resolve(ref);\n      } else {\n        setTimeout(() => {\n          next();\n        }, 100);\n      }\n    })();\n  });\n}\n\n/**\n * 2023-09-04\n * liaozhiyang\n * 用new Function替换eval\n */\nexport function _eval(str: string) {\n return new Function(`return ${str}`)();\n}\n\n/**\n * 2024-04-30\n * liaozhiyang\n * 通过时间或者时间戳获取对应antd的年、月、周、季度。\n */\nexport function getWeekMonthQuarterYear(date) {\n  // 获取 ISO 周数的函数\n  const getISOWeek = (date) => {\n    const jan4 = new Date(date.getFullYear(), 0, 4);\n    const oneDay = 86400000; // 一天的毫秒数\n    return Math.ceil(((date - jan4.getTime()) / oneDay + jan4.getDay() + 1) / 7);\n  };\n  // 将时间戳转换为日期对象\n  const dateObj = new Date(date);\n  // 计算周\n  const week = getISOWeek(dateObj);\n  // 计算月\n  const month = dateObj.getMonth() + 1; // 月份是从0开始的，所以要加1\n  // 计算季度\n  const quarter = Math.floor(dateObj.getMonth() / 3) + 1;\n  // 计算年\n  const year = dateObj.getFullYear();\n  return {\n    year: `${year}`,\n    month: `${year}-${month.toString().padStart(2, '0')}`,\n    week: `${year}-${week}周`,\n    quarter: `${year}-Q${quarter}`,\n  };\n}\n\n/**\n * 2024-05-17\n * liaozhiyang\n * 设置挂载的modal元素有可能会有多个，需要找到对应的。\n */\nexport const setPopContainer = (node, selector) => {\n  if (typeof selector === 'string') {\n    const targetEles = Array.from(document.querySelectorAll(selector));\n    if (targetEles.length > 1) {\n      const retrospect = (node, elems) => {\n        let ele = node.parentNode;\n        while (ele) {\n          const findParentNode = elems.find(item => item === ele);\n          if (findParentNode) {\n            ele = null;\n            return findParentNode;\n          } else {\n            ele = ele.parentNode;\n          }\n        }\n        return null;\n      };\n      const elem = retrospect(node, targetEles);\n      if (elem) {\n        return elem;\n      } else {\n        return document.querySelector(selector);\n      }\n    } else {\n      return document.querySelector(selector);\n    }\n  } else {\n    return selector;\n  }\n};\n\n/**\n * 2024-06-14\n * liaozhiyang\n * 根据控件显示条件\n * label、value通用，title、val给权限管理用的\n */\nexport function useConditionFilter() {\n\n  // 通用条件\n  const commonConditionOptions = [\n    {label: '为空', value: 'empty', val: 'EMPTY'},\n    {label: '不为空', value: 'not_empty', val: 'NOT_EMPTY'},\n  ]\n\n  // 数值、日期\n  const numberConditionOptions = [\n    { label: '等于', value: 'eq', val: '=' },\n    { label: '在...中', value: 'in', val: 'IN', title: '包含' },\n    { label: '不等于', value: 'ne', val: '!=' },\n    { label: '大于', value: 'gt', val: '>' },\n    { label: '大于等于', value: 'ge', val: '>=' },\n    { label: '小于', value: 'lt', val: '<' },\n    { label: '小于等于', value: 'le', val: '<=' },\n    ...commonConditionOptions,\n  ];\n\n  // 文本、密码、多行文本、富文本、markdown\n  const inputConditionOptions = [\n    { label: '等于', value: 'eq', val: '=' },\n    { label: '模糊', value: 'like', val: 'LIKE' },\n    { label: '以..开始', value: 'right_like', title: '右模糊', val: 'RIGHT_LIKE' },\n    { label: '以..结尾', value: 'left_like', title: '左模糊', val: 'LEFT_LIKE' },\n    { label: '在...中', value: 'in', val: 'IN', title: '包含' },\n    { label: '不等于', value: 'ne', val: '!=' },\n    ...commonConditionOptions,\n  ];\n\n  // 下拉、单选、多选、开关、用户、部门、关联记录、省市区、popup、popupDict、下拉多选、下拉搜索、分类字典、自定义树\n  const selectConditionOptions = [\n    { label: '等于', value: 'eq', val: '=' },\n    { label: '在...中', value: 'in', val: 'IN', title: '包含' },\n    { label: '不等于', value: 'ne', val: '!=' },\n    ...commonConditionOptions,\n  ];\n\n  const def = [\n    { label: '等于', value: 'eq', val: '=' },\n    { label: '模糊', value: 'like', val: 'LIKE' },\n    { label: '以..开始', value: 'right_like', title: '右模糊', val: 'RIGHT_LIKE' },\n    { label: '以..结尾', value: 'left_like', title: '左模糊', val: 'LEFT_LIKE' },\n    { label: '在...中', value: 'in', val: 'IN', title: '包含' },\n    { label: '不等于', value: 'ne', val: '!=' },\n    { label: '大于', value: 'gt', val: '>' },\n    { label: '大于等于', value: 'ge', val: '>=' },\n    { label: '小于', value: 'lt', val: '<' },\n    { label: '小于等于', value: 'le', val: '<=' },\n    ...commonConditionOptions,\n  ];\n\n  const filterCondition = (data) => {\n    if (data.view == 'text' && data.fieldType == 'number') {\n      data.view = 'number';\n    }\n    switch (data.view) {\n      case 'file':\n      case 'image':\n      case 'password':\n        return commonConditionOptions;\n      case 'text':\n      case 'textarea':\n      case 'umeditor':\n      case 'markdown':\n      case 'pca':\n      case 'popup':\n        return inputConditionOptions;\n      case 'list':\n      case 'radio':\n      case 'checkbox':\n      case 'switch':\n      case 'sel_user':\n      case 'sel_depart':\n      case 'link_table':\n      case 'popup_dict':\n      case 'list_multi':\n      case 'sel_search':\n      case 'cat_tree':\n      case 'sel_tree':\n        return selectConditionOptions;\n      case 'date':\n      // number是虚拟的\n      case 'number':\n        return numberConditionOptions;\n      default:\n        return def;\n    }\n  };\n  return { filterCondition };\n}\n// 获取url中的参数\nexport const getUrlParams = (url) => {\n  const result = {\n    url: '',\n    params: {},\n  };\n  const list = url.split('?');\n  result.url = list[0];\n  const params = list[1];\n  if (params) {\n    const list = params.split('&');\n    list.forEach((ele) => {\n      const dic = ele.split('=');\n      const label = dic[0];\n      result.params[label] = dic[1];\n    });\n  }\n  return result;\n};\n\n/* 20250325\n * liaozhiyang\n * 分割url字符成数组\n * 【issues/7990】图片参数中包含逗号会错误的识别成多张图\n * */\nexport const split = (str) => {\n  if (isString(str)) {\n    const text = str.trim();\n    if (text.startsWith('http')) {\n      const parts = str.split(',');\n      const urls: any = [];\n      let currentUrl = '';\n      for (const part of parts) {\n        if (part.startsWith('http://') || part.startsWith('https://')) {\n          // 如果遇到新的URL开头，保存当前URL并开始新的URL\n          if (currentUrl) {\n            urls.push(currentUrl);\n          }\n          currentUrl = part;\n        } else {\n          // 否则，是当前URL的一部分（如参数）\n          currentUrl += ',' + part;\n        }\n      }\n      // 添加最后一个URL\n      if (currentUrl) {\n        urls.push(currentUrl);\n      }\n      return urls;\n    } else {\n      return str.split(',');\n    }\n  }\n  return str;\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/is.ts",
    "content": "const toString = Object.prototype.toString;\n\nexport function is(val: unknown, type: string) {\n  return toString.call(val) === `[object ${type}]`;\n}\n\nexport function isDef<T = unknown>(val?: T): val is T {\n  return typeof val !== 'undefined';\n}\n\nexport function isUnDef<T = unknown>(val?: T): val is T {\n  return !isDef(val);\n}\n\nexport function isObject(val: any): val is Record<any, any> {\n  return val !== null && is(val, 'Object');\n}\n\nexport function isEmpty<T = unknown>(val: T): val is T {\n  if (isArray(val) || isString(val)) {\n    return val.length === 0;\n  }\n\n  if (val instanceof Map || val instanceof Set) {\n    return val.size === 0;\n  }\n\n  if (isObject(val)) {\n    return Object.keys(val).length === 0;\n  }\n\n  return false;\n}\n\nexport function isDate(val: unknown): val is Date {\n  return is(val, 'Date');\n}\n\nexport function isNull(val: unknown): val is null {\n  return val === null;\n}\n\nexport function isNullAndUnDef(val: unknown): val is null | undefined {\n  return isUnDef(val) && isNull(val);\n}\n\nexport function isNullOrUnDef(val: unknown): val is null | undefined {\n  return isUnDef(val) || isNull(val);\n}\n\nexport function isNumber(val: unknown): val is number {\n  return is(val, 'Number');\n}\n\nexport function isPromise<T = any>(val: any): val is Promise<T> {\n  // 代码逻辑说明: 不能既是 Promise 又是 Object --------\n  return is(val, 'Promise') && isFunction(val.then) && isFunction(val.catch);\n}\n\nexport function isString(val: unknown): val is string {\n  return is(val, 'String');\n}\n\nexport function isJsonObjectString(val: string): val is string {\n  if (!val) {\n    return false;\n  }\n  return val.startsWith('{') && val.endsWith('}');\n}\n\nexport function isFunction(val: unknown): val is Function {\n  return typeof val === 'function';\n}\n\nexport function isBoolean(val: unknown): val is boolean {\n  return is(val, 'Boolean');\n}\n\nexport function isRegExp(val: unknown): val is RegExp {\n  return is(val, 'RegExp');\n}\n\nexport function isArray(val: any): val is Array<any> {\n  return val && Array.isArray(val);\n}\n\nexport function isWindow(val: any): val is Window {\n  return typeof window !== 'undefined' && is(val, 'Window');\n}\n\nexport function isElement(val: unknown): val is Element {\n  return isObject(val) && !!val.tagName;\n}\n\nexport function isMap(val: unknown): val is Map<any, any> {\n  return is(val, 'Map');\n}\n\nexport const isServer = typeof window === 'undefined';\n\nexport const isClient = !isServer;\n\nexport function isUrl(path: string): boolean {\n  const reg =\n    /(((^https?:(?:\\/\\/)?)(?:[-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9.-]+(?::\\d+)?|(?:www.|[-;:&=\\+\\$,\\w]+@)[A-Za-z0-9.-]+)((?:\\/[\\+~%\\/.\\w-_]*)?\\??(?:[-\\+=&;%@.\\w_]*)#?(?:[\\w]*))?)$/;\n  return reg.test(path);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/lib/echarts.ts",
    "content": "import * as echarts from 'echarts/core';\n\nimport { BarChart, LineChart, PieChart, MapChart, PictorialBarChart, RadarChart } from 'echarts/charts';\n\nimport {\n  TitleComponent,\n  TooltipComponent,\n  GridComponent,\n  PolarComponent,\n  AriaComponent,\n  ParallelComponent,\n  LegendComponent,\n  RadarComponent,\n  ToolboxComponent,\n  DataZoomComponent,\n  VisualMapComponent,\n  TimelineComponent,\n  CalendarComponent,\n  GraphicComponent,\n} from 'echarts/components';\n\n// TODO 如果想换成SVG渲染，就导出SVGRenderer，\n//  并且放到 echarts.use 里，注释掉 CanvasRenderer\nimport { /*SVGRenderer*/ CanvasRenderer } from 'echarts/renderers';\n\necharts.use([\n  LegendComponent,\n  TitleComponent,\n  TooltipComponent,\n  GridComponent,\n  PolarComponent,\n  AriaComponent,\n  ParallelComponent,\n  BarChart,\n  LineChart,\n  PieChart,\n  MapChart,\n  RadarChart,\n  // TODO 因为要兼容Online图表自适应打印，所以改成 CanvasRenderer，可能会模糊\n  CanvasRenderer,\n  PictorialBarChart,\n  RadarComponent,\n  ToolboxComponent,\n  DataZoomComponent,\n  VisualMapComponent,\n  TimelineComponent,\n  CalendarComponent,\n  GraphicComponent,\n]);\n\nexport default echarts;\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/log.ts",
    "content": "const projectName = import.meta.env.VITE_GLOB_APP_TITLE;\n\nexport function warn(message: string) {\n  console.warn(`[${projectName} warn]:${message}`);\n}\n\nexport function error(message: string) {\n  throw new Error(`[${projectName} error]:${message}`);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/mitt.ts",
    "content": "/**\n * copy to https://github.com/developit/mitt\n * Expand clear method\n */\n\nexport type EventType = string | symbol;\n\n// An event handler can take an optional event argument\n// and should not return a value\nexport type Handler<T = any> = (event?: T) => void;\nexport type WildcardHandler = (type: EventType, event?: any) => void;\n\n// An array of all currently registered event handlers for a type\nexport type EventHandlerList = Array<Handler>;\nexport type WildCardEventHandlerList = Array<WildcardHandler>;\n\n// A map of event types and their corresponding event handlers.\nexport type EventHandlerMap = Map<EventType, EventHandlerList | WildCardEventHandlerList>;\n\nexport interface Emitter {\n  all: EventHandlerMap;\n\n  on<T = any>(type: EventType, handler: Handler<T>): void;\n  on(type: '*', handler: WildcardHandler): void;\n\n  off<T = any>(type: EventType, handler: Handler<T>): void;\n  off(type: '*', handler: WildcardHandler): void;\n\n  emit<T = any>(type: EventType, event?: T): void;\n  emit(type: '*', event?: any): void;\n  clear(): void;\n}\n\n/**\n * Mitt: Tiny (~200b) functional event emitter / pubsub.\n * @name mitt\n * @returns {Mitt}\n */\nexport default function mitt(all?: EventHandlerMap): Emitter {\n  all = all || new Map();\n\n  return {\n    /**\n     * A Map of event names to registered handler functions.\n     */\n    all,\n\n    /**\n     * Register an event handler for the given type.\n     * @param {string|symbol} type Type of event to listen for, or `\"*\"` for all events\n     * @param {Function} handler Function to call in response to given event\n     * @memberOf mitt\n     */\n    on<T = any>(type: EventType, handler: Handler<T>) {\n      const handlers = all?.get(type);\n      const added = handlers && handlers.push(handler);\n      if (!added) {\n        all?.set(type, [handler]);\n      }\n    },\n\n    /**\n     * Remove an event handler for the given type.\n     * @param {string|symbol} type Type of event to unregister `handler` from, or `\"*\"`\n     * @param {Function} handler Handler function to remove\n     * @memberOf mitt\n     */\n    off<T = any>(type: EventType, handler: Handler<T>) {\n      const handlers = all?.get(type);\n      if (handlers) {\n        handlers.splice(handlers.indexOf(handler) >>> 0, 1);\n      }\n    },\n\n    /**\n     * Invoke all handlers for the given type.\n     * If present, `\"*\"` handlers are invoked after type-matched handlers.\n     *\n     * Note: Manually firing \"*\" handlers is not supported.\n     *\n     * @param {string|symbol} type The event type to invoke\n     * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler\n     * @memberOf mitt\n     */\n    emit<T = any>(type: EventType, evt: T) {\n      ((all?.get(type) || []) as EventHandlerList).slice().map((handler) => {\n        handler(evt);\n      });\n      ((all?.get('*') || []) as WildCardEventHandlerList).slice().map((handler) => {\n        handler(type, evt);\n      });\n    },\n\n    /**\n     * Clear all\n     */\n    clear() {\n      this.all.clear();\n    },\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/monorepo/dynamicRouter.ts",
    "content": "export type DynamicViewsRecord = Record<string, () => Promise<Recordable>>;\n\n/** 已注册模块的动态页面 */\nexport const packageViews: DynamicViewsRecord = {};\n\n/**\n * 注册动态路由页面\n * @param getViews 获取该模块下所有页面的方法\n */\nexport function registerDynamicRouter(getViews: () => DynamicViewsRecord) {\n  if (typeof getViews === 'function') {\n    let dynamicViews = getViews();\n    Object.keys(dynamicViews).forEach((key) => {\n      // 处理动态页面的key，使其可以让路由识别\n      let newKey = key.replace('./src/views', '../../views');\n      packageViews[newKey] = dynamicViews[key];\n    });\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/monorepo/registerPackages.ts",
    "content": "import type { App } from 'vue';\nimport { warn } from '/@/utils/log';\nimport { registerDynamicRouter } from '/@/utils/monorepo/dynamicRouter';\nimport { createAsyncComponent } from \"@/utils/factory/createAsyncComponent\";\n\n// 懒加载模块配置（按需加载，访问相关路由时才加载对应包）\nconst lazyPackages = [\n  { name: '@jeecg/online', importer: () => import('@jeecg/online') },\n  { name: '@jeecg/aiflow', importer: () => import('@jeecg/aiflow') },\n];\n\nlet appInstance: App | null = null;\n\n// noinspection JSUnusedGlobalSymbols\nconst installOptions = {\n  baseImport,\n};\n\nexport function registerPackages(app: App) {\n  // 仅保存 app 实例，不立即加载模块\n  appInstance = app;\n  app.component(\n    'SuperQuery',\n    createAsyncComponent(() => import('@jeecg/online').then(mod => mod.SuperQuery))\n  );\n  app.component(\n    'JOnlineSearchSelect',\n    createAsyncComponent(() => import('@jeecg/online').then(mod => mod.JOnlineSearchSelect))\n  );\n}\n\n/** 已加载的包缓存 */\nconst loadedPackages = new Map<string, any>();\n/** 正在加载的包 Promise 缓存（防止重复加载） */\nconst loadingPromises = new Map<string, Promise<any>>();\n\n/**\n * 按需加载包并注册\n */\nasync function ensurePackageLoaded(pkgConfig: typeof lazyPackages[number]) {\n  const { name, importer } = pkgConfig;\n  if (loadedPackages.has(name)) {\n    return loadedPackages.get(name);\n  }\n  if (!loadingPromises.has(name)) {\n    const promise = importer().then((pkg) => {\n      const mod = pkg.default || pkg;\n      if (appInstance) {\n        appInstance.use(mod, installOptions);\n        registerDynamicRouter(mod.getViews);\n      }\n      loadedPackages.set(name, mod);\n      loadingPromises.delete(name);\n      return mod;\n    });\n    loadingPromises.set(name, promise);\n  }\n  return loadingPromises.get(name);\n}\n\n/**\n * 根据 component 路径关键字匹配优先加载的包\n */\nfunction getMatchedPackage(component: string): typeof lazyPackages[number] | null {\n  const lc = component.toLowerCase();\n  for (const pkgConfig of lazyPackages) {\n    // 从包名中提取关键字，如 @jeecg/online -> online, @jeecg/aiflow -> aiflow\n    const keyword = pkgConfig.name.split('/').pop()!;\n    if (lc.includes(keyword)) {\n      return pkgConfig;\n    }\n  }\n  return null;\n}\n\n/**\n * 从指定包中查找组件\n */\nasync function findComponentInPackage(pkgConfig: typeof lazyPackages[number], component: string): Promise<(() => Promise<Recordable>) | null> {\n  try {\n    const mod = await ensurePackageLoaded(pkgConfig);\n    const views = mod.getViews();\n    for (const key of Object.keys(views)) {\n      const k = key.replace('./src/views', '');\n      const startFlag = component.startsWith('/');\n      const endFlag = component.endsWith('.vue') || component.endsWith('.tsx');\n      const startIndex = startFlag ? 0 : 1;\n      const lastIndex = endFlag ? k.length : k.lastIndexOf('.');\n      if (k.substring(startIndex, lastIndex) === component) {\n        return views[key];\n      }\n    }\n  } catch (e) {\n    // 包不存在或加载失败，跳过\n  }\n  return null;\n}\n\n/**\n * 按需加载包组件：当路由匹配不到本地组件时调用\n * 根据 component 路径中的关键字优先匹配对应包，避免无意义的遍历\n */\nexport async function loadPackageComponent(component: string): Promise<(() => Promise<Recordable>) | null> {\n  // 优先根据关键字精准匹配包\n  const matched = getMatchedPackage(component);\n  if (matched) {\n    return findComponentInPackage(matched, component);\n  }\n  // 未匹配到关键字，依次尝试所有包\n  for (const pkgConfig of lazyPackages) {\n    const result = await findComponentInPackage(pkgConfig, component);\n    if (result) return result;\n  }\n  return null;\n}\n\n// 模块里可使用的import\nconst importGlobs = [import.meta.glob('../../utils/**/*.{ts,js,tsx}'), import.meta.glob('../../hooks/**/*.{ts,js,tsx}')];\n\n/**\n * 基础项目导包\n * 目前支持导入如下\n * /@/utils/**\n * /@/hooks/**\n *\n * @param path 文件路径，ts无需输入后缀名。如：/@/utils/common/compUtils\n */\nasync function baseImport(path: string) {\n  if (path) {\n    // 将 /@/ 替换成 ../../\n    path = path.replace(/^\\/@\\//, '../../');\n    for (const glob of importGlobs) {\n      for (const key of Object.keys(glob)) {\n        if (path === key || `${path}.ts` === key || `${path}.tsx` === key) {\n          return glob[key]();\n        }\n      }\n    }\n    warn(`引入失败：${path} 不存在`);\n  }\n  return null;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/propTypes.ts",
    "content": "import { CSSProperties, VNodeChild } from 'vue';\nimport { createTypes, VueTypeValidableDef, VueTypesInterface, toValidableType } from 'vue-types';\n\nexport type VueNode = VNodeChild | JSX.Element;\n\ntype PropTypes = VueTypesInterface & {\n  readonly style: VueTypeValidableDef<CSSProperties>;\n  readonly VNodeChild: VueTypeValidableDef<VueNode>;\n  // readonly trueBool: VueTypeValidableDef<boolean>;\n};\nconst newPropTypes = createTypes({\n  func: undefined,\n  bool: undefined,\n  string: undefined,\n  number: undefined,\n  object: undefined,\n  integer: undefined,\n}) as PropTypes;\n\n// 从 vue-types v5.0 开始，extend()方法已经废弃，当前已改为官方推荐的ES6+方法 https://dwightjack.github.io/vue-types/advanced/extending-vue-types.html#the-extend-method\nclass propTypes extends newPropTypes {\n  // a native-like validator that supports the `.validable` method\n  static get style() {\n    return toValidableType('style', {\n      type: [String, Object],\n    });\n  }\n\n  static get VNodeChild() {\n    return toValidableType('VNodeChild', {\n      type: undefined,\n    });\n  }\n}\nexport { propTypes };\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/props.ts",
    "content": "// copy from element-plus\n\nimport { warn } from 'vue';\nimport { isObject } from '@vue/shared';\nimport { fromPairs } from 'lodash-es';\nimport type { ExtractPropTypes, PropType } from 'vue';\nimport type { Mutable } from './types';\n\nconst wrapperKey = Symbol();\nexport type PropWrapper<T> = { [wrapperKey]: T };\n\nexport const propKey = Symbol();\n\ntype ResolveProp<T> = ExtractPropTypes<{\n  key: { type: T; required: true };\n}>['key'];\ntype ResolvePropType<T> = ResolveProp<T> extends { type: infer V } ? V : ResolveProp<T>;\ntype ResolvePropTypeWithReadonly<T> = Readonly<T> extends Readonly<Array<infer A>>\n  ? ResolvePropType<A[]>\n  : ResolvePropType<T>;\n\ntype IfUnknown<T, V> = [unknown] extends [T] ? V : T;\n\nexport type BuildPropOption<T, D extends BuildPropType<T, V, C>, R, V, C> = {\n  type?: T;\n  values?: readonly V[];\n  required?: R;\n  default?: R extends true\n    ? never\n    : D extends Record<string, unknown> | Array<any>\n    ? () => D\n    : (() => D) | D;\n  validator?: ((val: any) => val is C) | ((val: any) => boolean);\n};\n\ntype _BuildPropType<T, V, C> =\n  | (T extends PropWrapper<unknown>\n      ? T[typeof wrapperKey]\n      : [V] extends [never]\n      ? ResolvePropTypeWithReadonly<T>\n      : never)\n  | V\n  | C;\nexport type BuildPropType<T, V, C> = _BuildPropType<\n  IfUnknown<T, never>,\n  IfUnknown<V, never>,\n  IfUnknown<C, never>\n>;\n\ntype _BuildPropDefault<T, D> = [T] extends [\n  // eslint-disable-next-line @typescript-eslint/ban-types\n  Record<string, unknown> | Array<any> | Function,\n]\n  ? D\n  : D extends () => T\n  ? ReturnType<D>\n  : D;\n\nexport type BuildPropDefault<T, D, R> = R extends true\n  ? { readonly default?: undefined }\n  : {\n      readonly default: Exclude<D, undefined> extends never\n        ? undefined\n        : Exclude<_BuildPropDefault<T, D>, undefined>;\n    };\nexport type BuildPropReturn<T, D, R, V, C> = {\n  readonly type: PropType<BuildPropType<T, V, C>>;\n  readonly required: IfUnknown<R, false>;\n  readonly validator: ((val: unknown) => boolean) | undefined;\n  [propKey]: true;\n} & BuildPropDefault<BuildPropType<T, V, C>, IfUnknown<D, never>, IfUnknown<R, false>>;\n\n/**\n * @description Build prop. It can better optimize prop types\n * @description 生成 prop，能更好地优化类型\n * @example\n  // limited options\n  // the type will be PropType<'light' | 'dark'>\n  buildProp({\n    type: String,\n    values: ['light', 'dark'],\n  } as const)\n  * @example\n  // limited options and other types\n  // the type will be PropType<'small' | 'medium' | number>\n  buildProp({\n    type: [String, Number],\n    values: ['small', 'medium'],\n    validator: (val: unknown): val is number => typeof val === 'number',\n  } as const)\n  @link see more: https://github.com/element-plus/element-plus/pull/3341\n */\nexport function buildProp<\n  T = never,\n  D extends BuildPropType<T, V, C> = never,\n  R extends boolean = false,\n  V = never,\n  C = never,\n>(option: BuildPropOption<T, D, R, V, C>, key?: string): BuildPropReturn<T, D, R, V, C> {\n  // filter native prop type and nested prop, e.g `null`, `undefined` (from `buildProps`)\n  if (!isObject(option) || !!option[propKey]) return option as any;\n\n  const { values, required, default: defaultValue, type, validator } = option;\n\n  const _validator =\n    values || validator\n      ? (val: unknown) => {\n          let valid = false;\n          let allowedValues: unknown[] = [];\n\n          if (values) {\n            allowedValues = [...values, defaultValue];\n            valid ||= allowedValues.includes(val);\n          }\n          if (validator) valid ||= validator(val);\n\n          if (!valid && allowedValues.length > 0) {\n            const allowValuesText = [...new Set(allowedValues)]\n              .map((value) => JSON.stringify(value))\n              .join(', ');\n            warn(\n              `Invalid prop: validation failed${\n                key ? ` for prop \"${key}\"` : ''\n              }. Expected one of [${allowValuesText}], got value ${JSON.stringify(val)}.`,\n            );\n          }\n          return valid;\n        }\n      : undefined;\n\n  return {\n    type:\n      typeof type === 'object' && Object.getOwnPropertySymbols(type).includes(wrapperKey)\n        ? type[wrapperKey]\n        : type,\n    required: !!required,\n    default: defaultValue,\n    validator: _validator,\n    [propKey]: true,\n  } as unknown as BuildPropReturn<T, D, R, V, C>;\n}\n\ntype NativePropType = [((...args: any) => any) | { new (...args: any): any } | undefined | null];\n\nexport const buildProps = <\n  O extends {\n    [K in keyof O]: O[K] extends BuildPropReturn<any, any, any, any, any>\n      ? O[K]\n      : [O[K]] extends NativePropType\n      ? O[K]\n      : O[K] extends BuildPropOption<infer T, infer D, infer R, infer V, infer C>\n      ? D extends BuildPropType<T, V, C>\n        ? BuildPropOption<T, D, R, V, C>\n        : never\n      : never;\n  },\n>(\n  props: O,\n) =>\n  fromPairs(\n    Object.entries(props).map(([key, option]) => [key, buildProp(option as any, key)]),\n  ) as unknown as {\n    [K in keyof O]: O[K] extends { [propKey]: boolean }\n      ? O[K]\n      : [O[K]] extends NativePropType\n      ? O[K]\n      : O[K] extends BuildPropOption<\n          infer T,\n          // eslint-disable-next-line @typescript-eslint/no-unused-vars\n          infer _D,\n          infer R,\n          infer V,\n          infer C\n        >\n      ? BuildPropReturn<T, O[K]['default'], R, V, C>\n      : never;\n  };\n\nexport const definePropType = <T>(val: any) => ({ [wrapperKey]: val } as PropWrapper<T>);\n\nexport const keyOf = <T>(arr: T) => Object.keys(arr) as Array<keyof T>;\nexport const mutable = <T extends readonly any[] | Record<string, unknown>>(val: T) =>\n  val as Mutable<typeof val>;\n\nexport const componentSize = ['large', 'medium', 'small', 'mini'] as const;\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/types.ts",
    "content": "// copy from element-plus\n\nimport type { CSSProperties, Plugin } from 'vue';\n\ntype OptionalKeys<T extends Record<string, unknown>> = {\n  [K in keyof T]: T extends Record<K, T[K]> ? never : K;\n}[keyof T];\n\ntype RequiredKeys<T extends Record<string, unknown>> = Exclude<keyof T, OptionalKeys<T>>;\n\ntype MonoArgEmitter<T, Keys extends keyof T> = <K extends Keys>(evt: K, arg?: T[K]) => void;\n\ntype BiArgEmitter<T, Keys extends keyof T> = <K extends Keys>(evt: K, arg: T[K]) => void;\n\nexport type EventEmitter<T extends Record<string, unknown>> = MonoArgEmitter<T, OptionalKeys<T>> &\n  BiArgEmitter<T, RequiredKeys<T>>;\n\nexport type AnyFunction<T> = (...args: any[]) => T;\n\nexport type PartialReturnType<T extends (...args: unknown[]) => unknown> = Partial<ReturnType<T>>;\n\nexport type SFCWithInstall<T> = T & Plugin;\n\nexport type Nullable<T> = T | null;\n\nexport type RefElement = Nullable<HTMLElement>;\n\nexport type CustomizedHTMLElement<T> = HTMLElement & T;\n\nexport type Indexable<T> = {\n  [key: string]: T;\n};\n\nexport type Hash<T> = Indexable<T>;\n\nexport type TimeoutHandle = ReturnType<typeof global.setTimeout>;\n\nexport type ComponentSize = 'large' | 'medium' | 'small' | 'mini';\n\nexport type StyleValue = string | CSSProperties | Array<StyleValue>;\n\nexport type Mutable<T> = { -readonly [P in keyof T]: T[P] };\n"
  },
  {
    "path": "jeecgboot-vue3/src/utils/uuid.ts",
    "content": "const hexList: string[] = [];\nfor (let i = 0; i <= 15; i++) {\n  hexList[i] = i.toString(16);\n}\n\nexport function buildUUID(): string {\n  let uuid = '';\n  for (let i = 1; i <= 36; i++) {\n    if (i === 9 || i === 14 || i === 19 || i === 24) {\n      uuid += '-';\n    } else if (i === 15) {\n      uuid += 4;\n    } else if (i === 20) {\n      uuid += hexList[(Math.random() * 4) | 8];\n    } else {\n      uuid += hexList[(Math.random() * 16) | 0];\n    }\n  }\n  return uuid.replace(/-/g, '');\n}\n\nlet unique = 0;\nexport function buildShortUUID(prefix = ''): string {\n  const time = Date.now();\n  const random = Math.floor(Math.random() * 1000000000);\n  unique++;\n  return prefix + '_' + random + unique + String(time);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/Analysis/api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\n\nenum Api {\n  loginfo = '/sys/loginfo',\n  visitInfo = '/sys/visitInfo',\n}\n/**\n * 日志统计信息\n * @param params\n */\nexport const getLoginfo = (params) => defHttp.get({ url: Api.loginfo, params }, { isTransformResponse: false });\n/**\n * 访问量信息\n * @param params\n */\nexport const getVisitInfo = (params) => defHttp.get({ url: Api.visitInfo, params }, { isTransformResponse: false });\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/Analysis/components/BdcTabCard.vue",
    "content": "<template>\n  <a-card :loading=\"loading\" :bordered=\"false\" :body-style=\"{ padding: '0' }\">\n    <div class=\"salesCard\">\n      <a-tabs default-active-key=\"1\" size=\"large\" :tab-bar-style=\"{ marginBottom: '24px', paddingLeft: '16px' }\">\n        <template #rightExtra>\n          <div class=\"extra-wrapper\">\n            <div class=\"extra-item\">\n              <a>今日</a>\n              <a>本周</a>\n              <a>本月</a>\n              <a>本年</a>\n            </div>\n            <a-range-picker :style=\"{ width: '256px' }\" />\n          </div>\n        </template>\n        <a-tab-pane loading=\"true\" tab=\"受理监管\" key=\"1\">\n          <a-row>\n            <a-col :xl=\"16\" :lg=\"12\" :md=\"12\" :sm=\"24\" :xs=\"24\">\n              <Bar :chartData=\"barData\" :option=\"{ title: { text: '', textStyle: { fontWeight: 'lighter' } } }\" height=\"40vh\" :seriesColor=\"seriesColor\" />\n            </a-col>\n            <a-col :xl=\"8\" :lg=\"12\" :md=\"12\" :sm=\"24\" :xs=\"24\">\n              <QuickNav :loading=\"loading\" class=\"enter-y\" :bordered=\"false\" :body-style=\"{ padding: 0 }\" />\n            </a-col>\n          </a-row>\n        </a-tab-pane>\n        <a-tab-pane tab=\"交互监管\" key=\"2\">\n          <a-row>\n            <a-col :xl=\"16\" :lg=\"12\" :md=\"12\" :sm=\"24\" :xs=\"24\">\n              <BarMulti\n                :seriesColor=\"interactiveColor\"\n                :chartData=\"barMultiData\"\n                :option=\"{ title: { text: '', textStyle: { fontWeight: 'lighter' } } }\"\n                height=\"40vh\"\n              />\n            </a-col>\n            <a-col :xl=\"8\" :lg=\"12\" :md=\"12\" :sm=\"24\" :xs=\"24\">\n              <QuickNav :loading=\"loading\" class=\"enter-y\" :bordered=\"false\" :body-style=\"{ padding: 0 }\" />\n            </a-col>\n          </a-row>\n        </a-tab-pane>\n        <a-tab-pane tab=\"存储监管\" key=\"3\">\n          <a-row>\n            <a-col :xl=\"16\" :lg=\"12\" :md=\"12\" :sm=\"24\" :xs=\"24\" style=\"display: flex\">\n              <Gauge :seriesColor=\"seriesColor\" :chartData=\"{ name: 'C盘', value: 70 }\" height=\"30vh\"></Gauge>\n              <Gauge :seriesColor=\"seriesColor\" :chartData=\"{ name: 'D盘', value: 50 }\" height=\"30vh\"></Gauge>\n            </a-col>\n            <a-col :xl=\"8\" :lg=\"12\" :md=\"12\" :sm=\"24\" :xs=\"24\">\n              <QuickNav :loading=\"loading\" class=\"enter-y\" :bordered=\"false\" :body-style=\"{ padding: 0 }\" />\n            </a-col>\n          </a-row>\n        </a-tab-pane>\n      </a-tabs>\n    </div>\n  </a-card>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed } from 'vue';\n  import Bar from '/@/components/chart/Bar.vue';\n  import BarMulti from '/@/components/chart/BarMulti.vue';\n  import Gauge from '/@/components/chart/Gauge.vue';\n  import QuickNav from './QuickNav.vue';\n  import { useRootSetting } from '/@/hooks/setting/useRootSetting';\n\n  defineProps({\n    loading: {\n      type: Boolean,\n    },\n  });\n  const { getThemeColor } = useRootSetting();\n  const interactiveColor = ref();\n  const rankList = [];\n  for (let i = 0; i < 7; i++) {\n    rankList.push({\n      name: '白鹭岛 ' + (i + 1) + ' 号店',\n      total: 1234.56 - i * 100,\n    });\n  }\n\n  const barData = [];\n  for (let i = 0; i < 12; i += 1) {\n    barData.push({\n      name: `${i + 1}月`,\n      value: Math.floor(Math.random() * 1000) + 200,\n    });\n  }\n  const barMultiData = [];\n  for (let j = 0; j < 2; j++) {\n    for (let i = 0; i < 12; i += 1) {\n      barMultiData.push({\n        type: j == 0 ? 'jeecg' : 'jeebt',\n        name: `${i + 1}月`,\n        value: Math.floor(Math.random() * 1000) + 200,\n      });\n    }\n  }\n\n  const seriesColor = computed(() => {\n    interactiveColor.value = [\n      { type: 'jeecg', color: getThemeColor.value },\n      { type: 'jeebt', color: getRandomColor() },\n    ];\n    return getThemeColor.value;\n  });\n  function getRandomColor() {\n    var letters = '0123456789ABCDEF';\n    var color = '#';\n    for (var i = 0; i < 6; i++) {\n      color += letters[Math.floor(Math.random() * 16)];\n    }\n    return color;\n  }\n</script>\n\n<style lang=\"less\" scoped>\n  .extra-wrapper {\n    line-height: 55px;\n    padding-right: 24px;\n\n    .extra-item {\n      display: inline-block;\n      margin-right: 24px;\n\n      a {\n        margin-left: 24px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/Analysis/components/ChartGroupCard.vue",
    "content": "<template>\n  <div class=\"md:flex\">\n    <template v-for=\"(item, index) in dataList\" :key=\"item.title\">\n      <ChartCard\n        :loading=\"loading\"\n        :title=\"item.title\"\n        :total=\"getTotal(item.total, index)\"\n        class=\"md:w-1/4 w-full !md:mt-0 !mt-4\"\n        :class=\"[index + 1 < 4 && '!md:mr-4']\"\n      >\n        <template #action>\n          <a-tooltip title=\"指标说明\">\n            <Icon :icon=\"item.icon\" :size=\"20\" />\n          </a-tooltip>\n        </template>\n        <div v-if=\"type === 'chart'\">\n          <Trend term=\"周同比\" :percentage=\"12\" v-if=\"index === 0\" />\n          <Trend term=\"日同比\" :percentage=\"11\" v-if=\"index === 0\" :type=\"false\" />\n\n          <SingleLine v-if=\"index === 1\" :option=\"option\" :chartData=\"chartData\" :seriesColor=\"seriesColor\" height=\"50px\"></SingleLine>\n\n          <Bar v-if=\"index === 2\" :option=\"option\" :chartData=\"chartData\" :seriesColor=\"seriesColor\" height=\"50px\"></Bar>\n\n          <Progress v-if=\"index === 3\" :percent=\"78\" :show-info=\"false\"></Progress>\n        </div>\n        <div v-else>\n          <SingleLine :seriesColor=\"seriesColor\" v-if=\"index === 0\" :option=\"option\" :chartData=\"chartData\" height=\"50px\"></SingleLine>\n\n          <SingleLine :seriesColor=\"seriesColor\" v-if=\"index === 1\" :option=\"option\" :chartData=\"chartData\" height=\"50px\"></SingleLine>\n\n          <Bar :seriesColor=\"seriesColor\" v-if=\"index === 2\" :option=\"option\" :chartData=\"chartData\" height=\"50px\"></Bar>\n\n          <Progress v-if=\"index === 3\" :percent=\"78\" :show-info=\"false\"></Progress>\n\n        </div>\n        <template #footer v-if=\"type === 'chart'\">\n          <span v-if=\"index !== 3\"\n            >{{ item.footer }}<span>{{ item.value }}</span></span\n          >\n          <Trend term=\"周同比\" :percentage=\"12\" v-if=\"index === 3\" />\n          <Trend term=\"日同比\" :percentage=\"11\" v-if=\"index === 3\" :type=\"false\" />\n        </template>\n        <template #footer v-else>\n          <span\n            >{{ item.footer }}<span>{{ item.value }}</span></span\n          >\n        </template>\n      </ChartCard>\n    </template>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed } from 'vue';\n  import { Icon } from '/@/components/Icon';\n  import { Progress } from 'ant-design-vue';\n  import ChartCard from '/@/components/chart/ChartCard.vue';\n  import Trend from '/@/components/chart/Trend.vue';\n  import Bar from '/@/components/chart/Bar.vue';\n  import SingleLine from '/@/components/chart/SingleLine.vue';\n  import { chartCardList, bdcCardList } from '../data';\n  import { useRootSetting } from '/@/hooks/setting/useRootSetting';\n\n  const { getThemeColor } = useRootSetting();\n  const props = defineProps({\n    loading: {\n      type: Boolean,\n    },\n    type: {\n      type: String,\n      default: 'chart',\n    },\n  });\n  const option = ref({ xAxis: { show: false, boundaryGap: false }, yAxis: { show: false, boundaryGap: false, max: 220 } });\n\n  const chartData = ref([\n    {\n      name: '1月',\n      value: 50,\n    },\n    {\n      name: '2月',\n      value: 100,\n    },\n    {\n      name: '3月',\n      value: 150,\n    },\n    {\n      name: '4月',\n      value: 40,\n    },\n    {\n      name: '5月',\n      value: 110,\n    },\n    {\n      name: '6月',\n      value: 120,\n    },\n  ]);\n  const seriesColor = computed(() => {\n    return getThemeColor.value;\n  })\n  const dataList = computed(() => (props.type === 'dbc' ? bdcCardList : chartCardList));\n\n  function getTotal(total, index) {\n    return index === 0 ? `￥${total}` : index === 3 ? `${total}%` : total;\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/Analysis/components/GrowCard.vue",
    "content": "<template>\n  <div class=\"md:flex\">\n    <template v-for=\"(item, index) in growCardList\" :key=\"item.title\">\n      <Card\n        size=\"small\"\n        :loading=\"loading\"\n        :title=\"item.title\"\n        class=\"md:w-1/4 w-full !md:mt-0 !mt-4\"\n        :class=\"[index + 1 < 4 && '!md:mr-4']\"\n        :canExpan=\"false\"\n      >\n        <template #extra>\n          <Tag :color=\"item.color\">{{ item.action }}</Tag>\n        </template>\n\n        <div class=\"py-4 px-4 flex justify-between\">\n          <CountTo prefix=\"$\" :startVal=\"1\" :endVal=\"item.value\" class=\"text-2xl\" />\n          <Icon :icon=\"item.icon\" :size=\"40\" />\n        </div>\n\n        <div class=\"p-2 px-4 flex justify-between\">\n          <span>总{{ item.title }}</span>\n          <CountTo prefix=\"$\" :startVal=\"1\" :endVal=\"item.total\" />\n        </div>\n      </Card>\n    </template>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { CountTo } from '/@/components/CountTo/index';\n  import { Icon } from '/@/components/Icon';\n  import { Tag, Card } from 'ant-design-vue';\n  import { growCardList } from '../data';\n\n  defineProps({\n    loading: {\n      type: Boolean,\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/Analysis/components/QuickNav.vue",
    "content": "<template>\n  <Card title=\"快捷导航\" v-bind=\"$attrs\">\n    <template v-for=\"item in navItems\" :key=\"item\">\n      <CardGrid @click=\"goPage\">\n        <span class=\"flex flex-col items-center\">\n          <Icon :icon=\"item.icon\" :color=\"item.color\" size=\"20\" />\n          <span class=\"text-md mt-2\">{{ item.title }}</span>\n        </span>\n      </CardGrid>\n    </template>\n  </Card>\n</template>\n<script lang=\"ts\" setup>\n  import { Card } from 'ant-design-vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { Icon } from '/@/components/Icon';\n\n  const CardGrid = Card.Grid;\n  const $message = useMessage();\n  const navItems = [\n    {\n      title: '业务受理',\n      icon: 'ion:home-outline',\n      color: '#1fdaca',\n    },\n    {\n      title: '业务管理',\n      icon: 'ion:grid-outline',\n      color: '#bf0c2c',\n    },\n    {\n      title: '文件管理',\n      icon: 'ion:layers-outline',\n      color: '#e18525',\n    },\n    {\n      title: '信息查询',\n      icon: 'ion:settings-outline',\n      color: '#3fb27f',\n    }, \n\t\t{\n\t\t\t\ttitle: '通知公告',\n\t\t\t\ticon: 'ion:notifications',\n\t\t\t\tcolor: '#13b0ff',\n\t\t}, \n\t\t{\n\t\t\t\ttitle: '我的任务',\n\t\t\t\ticon: 'ion:person-stalker',\n\t\t\t\tcolor: '#b27315',\n\t\t}\n  ];\n\n  function goPage() {\n    $message.createMessage.success('根据业务自行处理跳转页面!');\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/Analysis/components/SaleTabCard.vue",
    "content": "<template>\n  <a-card :loading=\"loading\" :bordered=\"false\" :body-style=\"{ padding: '0' }\">\n    <div class=\"salesCard\">\n      <a-tabs default-active-key=\"1\" size=\"large\" :tab-bar-style=\"{ marginBottom: '24px', paddingLeft: '16px' }\">\n        <template #rightExtra>\n          <div class=\"extra-wrapper\">\n            <div class=\"extra-item\">\n              <a>今日</a>\n              <a>本周</a>\n              <a>本月</a>\n              <a>本年</a>\n            </div>\n            <a-range-picker :style=\"{ width: '256px' }\" />\n          </div>\n        </template>\n        <a-tab-pane loading=\"true\" tab=\"销售额\" key=\"1\">\n          <a-row>\n            <a-col :xl=\"16\" :lg=\"12\" :md=\"12\" :sm=\"24\" :xs=\"24\">\n              <Bar :chartData=\"barData\" :option=\"{ title: { text: '', textStyle: { fontWeight: 'lighter' } } }\" height=\"40vh\" :seriesColor=\"seriesColor\"  />\n            </a-col>\n            <a-col :xl=\"8\" :lg=\"12\" :md=\"12\" :sm=\"24\" :xs=\"24\">\n              <RankList title=\"门店销售排行榜\" :list=\"rankList\" />\n            </a-col>\n          </a-row>\n        </a-tab-pane>\n        <a-tab-pane tab=\"销售趋势\" key=\"2\">\n          <a-row>\n            <a-col :xl=\"16\" :lg=\"12\" :md=\"12\" :sm=\"24\" :xs=\"24\">\n              <Bar :chartData=\"barData.reverse()\" :option=\"{ title: { text: '', textStyle: { fontWeight: 'lighter' } } }\" height=\"40vh\" :seriesColor=\"seriesColor\" />\n            </a-col>\n            <a-col :xl=\"8\" :lg=\"12\" :md=\"12\" :sm=\"24\" :xs=\"24\">\n              <RankList title=\"门店销售排行榜\" :list=\"rankList\" />\n            </a-col>\n          </a-row>\n        </a-tab-pane>\n      </a-tabs>\n    </div>\n  </a-card>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed } from 'vue';\n  import Bar from '/@/components/chart/Bar.vue';\n  import RankList from '/@/components/chart/RankList.vue';\n  import { useRootSetting } from '/@/hooks/setting/useRootSetting';\n    \n\n  defineProps({\n    loading: {\n      type: Boolean,\n    },\n  });\n  const { getThemeColor } = useRootSetting();\n  const rankList = [];\n  for (let i = 0; i < 7; i++) {\n    rankList.push({\n      name: '白鹭岛 ' + (i + 1) + ' 号店',\n      total: 1234.56 - i * 100,\n    });\n  }\n\n  const barData = [];\n  for (let i = 0; i < 12; i += 1) {\n    barData.push({\n      name: `${i + 1}月`,\n      value: Math.floor(Math.random() * 1000) + 200,\n    });\n  }\n  const seriesColor = computed(() => {\n    return getThemeColor.value\n  })\n</script>\n\n<style lang=\"less\" scoped>\n  .extra-wrapper {\n    line-height: 55px;\n    padding-right: 24px;\n\n    .extra-item {\n      display: inline-block;\n      margin-right: 24px;\n\n      a {\n        margin-left: 24px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/Analysis/components/SalesProductPie.vue",
    "content": "<template>\n  <Card title=\"成交占比\" :loading=\"loading\">\n    <div ref=\"chartRef\" :style=\"{ width, height }\"></div>\n  </Card>\n</template>\n<script lang=\"ts\" setup>\n  import { Ref, ref, watch } from 'vue';\n  import { Card } from 'ant-design-vue';\n  import { useECharts } from '/@/hooks/web/useECharts';\n\n  const props = defineProps({\n    loading: Boolean,\n    width: {\n      type: String as PropType<string>,\n      default: '100%',\n    },\n    height: {\n      type: String as PropType<string>,\n      default: '300px',\n    },\n  });\n\n  const chartRef = ref<HTMLDivElement | null>(null);\n  const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);\n  watch(\n    () => props.loading,\n    () => {\n      if (props.loading) {\n        return;\n      }\n      setOptions({\n        tooltip: {\n          trigger: 'item',\n        },\n\n        series: [\n          {\n            name: '访问来源',\n            type: 'pie',\n            radius: '80%',\n            center: ['50%', '50%'],\n            color: ['#5ab1ef', '#b6a2de', '#67e0e3', '#2ec7c9'],\n            data: [\n              { value: 500, name: '电子产品' },\n              { value: 310, name: '服装' },\n              { value: 274, name: '化妆品' },\n              { value: 400, name: '家居' },\n            ].sort(function (a, b) {\n              return a.value - b.value;\n            }),\n            roseType: 'radius',\n            animationType: 'scale',\n            animationEasing: 'exponentialInOut',\n            animationDelay: function () {\n              return Math.random() * 400;\n            },\n          },\n        ],\n      });\n    },\n    { immediate: true }\n  );\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/Analysis/components/SiteAnalysis.vue",
    "content": "<template>\n  <Card :tab-list=\"tabListTitle\" v-bind=\"$attrs\" :active-tab-key=\"activeKey\" @tabChange=\"onTabChange\">\n    <p v-if=\"activeKey === 'tab1'\">\n      <VisitAnalysis />\n    </p>\n    <p v-if=\"activeKey === 'tab2'\">\n      <VisitAnalysisBar />\n    </p>\n  </Card>\n</template>\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import { Card } from 'ant-design-vue';\n  import VisitAnalysis from './VisitAnalysis.vue';\n  import VisitAnalysisBar from './VisitAnalysisBar.vue';\n\n  const activeKey = ref('tab1');\n\n  const tabListTitle = [\n    {\n      key: 'tab1',\n      tab: '流量趋势',\n    },\n    {\n      key: 'tab2',\n      tab: '访问量',\n    },\n  ];\n\n  function onTabChange(key) {\n    activeKey.value = key;\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/Analysis/components/VisitAnalysis.vue",
    "content": "<template>\n  <div ref=\"chartRef\" :style=\"{ height, width }\"></div>\n</template>\n<script lang=\"ts\" setup>\n  import { onMounted, ref, Ref, watchEffect } from 'vue';\n  import { useECharts } from '/@/hooks/web/useECharts';\n  import { basicProps } from './props';\n  import { useRootSetting } from '/@/hooks/setting/useRootSetting';\n  defineProps({\n    ...basicProps,\n  });\n  const chartRef = ref<HTMLDivElement | null>(null);\n  const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);\n\n  const { getThemeColor } = useRootSetting();\n  const init = () => {\n    setOptions({\n      tooltip: {\n        trigger: 'axis',\n        axisPointer: {\n          lineStyle: {\n            width: 1,\n            color: getThemeColor.value,\n          },\n        },\n      },\n      xAxis: {\n        type: 'category',\n        boundaryGap: false,\n        data: [\n          '6:00',\n          '7:00',\n          '8:00',\n          '9:00',\n          '10:00',\n          '11:00',\n          '12:00',\n          '13:00',\n          '14:00',\n          '15:00',\n          '16:00',\n          '17:00',\n          '18:00',\n          '19:00',\n          '20:00',\n          '21:00',\n          '22:00',\n          '23:00',\n        ],\n        splitLine: {\n          show: true,\n          lineStyle: {\n            width: 1,\n            type: 'solid',\n            color: 'rgba(226,226,226,0.5)',\n          },\n        },\n        axisTick: {\n          show: false,\n        },\n      },\n      yAxis: [\n        {\n          type: 'value',\n          max: 80000,\n          splitNumber: 4,\n          axisTick: {\n            show: false,\n          },\n          splitArea: {\n            show: true,\n            areaStyle: {\n              color: ['rgba(255,255,255,0.2)', 'rgba(226,226,226,0.2)'],\n            },\n          },\n        },\n      ],\n      grid: { left: '1%', right: '1%', top: '2  %', bottom: 0, containLabel: true },\n      series: [\n        {\n          smooth: true,\n          data: [111, 222, 4000, 18000, 33333, 55555, 66666, 33333, 14000, 36000, 66666, 44444, 22222, 11111, 4000, 2000, 500, 333, 222, 111],\n          type: 'line',\n          areaStyle: {},\n          itemStyle: {\n            color: '#5ab1ef',\n          },\n        },\n        {\n          smooth: true,\n          data: [33, 66, 88, 333, 3333, 5000, 18000, 3000, 1200, 13000, 22000, 11000, 2221, 1201, 390, 198, 60, 30, 22, 11],\n          type: 'line',\n          areaStyle: {},\n          itemStyle: {\n            color: getThemeColor.value,\n          },\n        },\n      ],\n    });\n  };\n  watchEffect(() => {\n    init();\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/Analysis/components/VisitAnalysisBar.vue",
    "content": "<template>\n  <div ref=\"chartRef\" :style=\"{ height, width }\"></div>\n</template>\n<script lang=\"ts\" setup>\n  import { onMounted, ref, Ref, watchEffect } from 'vue';\n  import { useECharts } from '/@/hooks/web/useECharts';\n  import { basicProps } from './props';\n  import { useRootSetting } from '/@/hooks/setting/useRootSetting';\n\n  defineProps({\n    ...basicProps,\n  });\n\n  const chartRef = ref<HTMLDivElement | null>(null);\n  const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);\n  const { getThemeColor } = useRootSetting();\n  const init = () => {\n    setOptions({\n      tooltip: {\n        trigger: 'axis',\n        axisPointer: {\n          lineStyle: {\n            width: 1,\n            color: getThemeColor.value,\n          },\n        },\n      },\n      grid: { left: '1%', right: '1%', top: '2  %', bottom: 0, containLabel: true },\n      xAxis: {\n        type: 'category',\n        data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n      },\n      yAxis: {\n        type: 'value',\n        max: 8000,\n        splitNumber: 4,\n      },\n      series: [\n        {\n          data: [3000, 2000, 3333, 5000, 3200, 4200, 3200, 2100, 3000, 5100, 6000, 3200, 4800],\n          type: 'bar',\n          barMaxWidth: 80,\n          color: getThemeColor.value,\n        },\n      ],\n    });\n  };\n  watchEffect(() => {\n    init();\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/Analysis/components/VisitRadar.vue",
    "content": "<template>\n  <Card title=\"转化率\" :loading=\"loading\">\n    <div ref=\"chartRef\" :style=\"{ width, height }\"></div>\n  </Card>\n</template>\n<script lang=\"ts\" setup>\n  import { Ref, ref, watch } from 'vue';\n  import { Card } from 'ant-design-vue';\n  import { useECharts } from '/@/hooks/web/useECharts';\n\n  const props = defineProps({\n    loading: Boolean,\n    width: {\n      type: String as PropType<string>,\n      default: '100%',\n    },\n    height: {\n      type: String as PropType<string>,\n      default: '300px',\n    },\n  });\n\n  const chartRef = ref<HTMLDivElement | null>(null);\n  const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);\n  watch(\n    () => props.loading,\n    () => {\n      if (props.loading) {\n        return;\n      }\n      setOptions({\n        legend: {\n          bottom: 0,\n          data: ['访问', '购买'],\n        },\n        tooltip: {},\n        radar: {\n          radius: '60%',\n          splitNumber: 8,\n          indicator: [\n            {\n              name: '电脑',\n            },\n            {\n              name: '充电器',\n            },\n            {\n              name: '耳机',\n            },\n            {\n              name: '手机',\n            },\n            {\n              name: 'Ipad',\n            },\n            {\n              name: '耳机',\n            },\n          ],\n        },\n        series: [\n          {\n            type: 'radar' as 'custom',\n            symbolSize: 0,\n            areaStyle: {\n              shadowBlur: 0,\n              shadowColor: 'rgba(0,0,0,.2)',\n              shadowOffsetX: 0,\n              shadowOffsetY: 10,\n              opacity: 1,\n            },\n            data: [\n              {\n                value: [90, 50, 86, 40, 50, 20],\n                name: '访问',\n                itemStyle: {\n                  color: '#b6a2de',\n                },\n              },\n              {\n                value: [70, 75, 70, 76, 20, 85],\n                name: '购买',\n                itemStyle: {\n                  color: '#5ab1ef',\n                },\n              },\n            ],\n          },\n        ],\n      });\n    },\n    { immediate: true }\n  );\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/Analysis/components/VisitSource.vue",
    "content": "<template>\n  <Card title=\"访问来源\" :loading=\"loading\">\n    <div ref=\"chartRef\" :style=\"{ width, height }\"></div>\n  </Card>\n</template>\n<script lang=\"ts\" setup>\n  import { Ref, ref, watch } from 'vue';\n  import { Card } from 'ant-design-vue';\n  import { useECharts } from '/@/hooks/web/useECharts';\n  const props = defineProps({\n    loading: Boolean,\n    width: {\n      type: String as PropType<string>,\n      default: '100%',\n    },\n    height: {\n      type: String as PropType<string>,\n      default: '300px',\n    },\n  });\n  const chartRef = ref<HTMLDivElement | null>(null);\n  const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);\n  watch(\n    () => props.loading,\n    () => {\n      if (props.loading) {\n        return;\n      }\n      setOptions({\n        tooltip: {\n          trigger: 'item',\n        },\n        legend: {\n          bottom: '1%',\n          left: 'center',\n        },\n        series: [\n          {\n            color: ['#5ab1ef', '#b6a2de', '#67e0e3', '#2ec7c9'],\n            name: '访问来源',\n            type: 'pie',\n            radius: ['40%', '70%'],\n            avoidLabelOverlap: false,\n            itemStyle: {\n              borderRadius: 10,\n              borderColor: '#fff',\n              borderWidth: 2,\n            },\n            label: {\n              show: false,\n              position: 'center',\n            },\n            emphasis: {\n              label: {\n                show: true,\n                fontSize: '12',\n                fontWeight: 'bold',\n              },\n            },\n            labelLine: {\n              show: false,\n            },\n            data: [\n              { value: 1048, name: '搜索引擎' },\n              { value: 735, name: '直接访问' },\n              { value: 580, name: '邮件营销' },\n              { value: 484, name: '联盟广告' },\n            ],\n            animationType: 'scale',\n            animationEasing: 'exponentialInOut',\n            animationDelay: function () {\n              return Math.random() * 100;\n            },\n          },\n        ],\n      });\n    },\n    { immediate: true }\n  );\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/Analysis/components/props.ts",
    "content": "import { PropType } from 'vue';\n\nexport interface BasicProps {\n  width: string;\n  height: string;\n}\nexport const basicProps = {\n  width: {\n    type: String as PropType<string>,\n    default: '100%',\n  },\n  height: {\n    type: String as PropType<string>,\n    default: '280px',\n  },\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/Analysis/data.ts",
    "content": "export interface GrowCardItem {\n  icon: string;\n  title: string;\n  value?: number;\n  total: number;\n  color?: string;\n  action?: string;\n  footer?: string;\n}\n\nexport const growCardList: GrowCardItem[] = [\n  {\n    title: '访问数',\n    icon: 'visit-count|svg',\n    value: 2000,\n    total: 120000,\n    color: 'green',\n    action: '月',\n  },\n  {\n    title: '成交额',\n    icon: 'total-sales|svg',\n    value: 20000,\n    total: 500000,\n    color: 'blue',\n    action: '月',\n  },\n  {\n    title: '下载数',\n    icon: 'download-count|svg',\n    value: 8000,\n    total: 120000,\n    color: 'orange',\n    action: '周',\n  },\n  {\n    title: '成交数',\n    icon: 'transaction|svg',\n    value: 5000,\n    total: 50000,\n    color: 'purple',\n    action: '年',\n  },\n];\n\nexport const chartCardList: GrowCardItem[] = [\n  {\n    title: '总销售额',\n    icon: 'visit-count|svg',\n    total: 126560,\n    value: 234.56,\n    footer: '日均销售额',\n  },\n  {\n    title: '订单量',\n    icon: 'total-sales|svg',\n    value: 1234,\n    total: 8846,\n    color: 'blue',\n    footer: '日订单量',\n  },\n  {\n    title: '支付笔数',\n    icon: 'download-count|svg',\n    value: 60,\n    total: 6560,\n    color: 'orange',\n    footer: '转化率',\n  },\n  {\n    title: '运营活动效果',\n    icon: 'transaction|svg',\n    total: 78,\n  },\n];\nexport const bdcCardList: GrowCardItem[] = [\n  {\n    title: '受理量',\n    icon: 'ant-design:info-circle-outlined',\n    total: 100,\n    value: 60,\n    footer: '今日受理量',\n  },\n  {\n    title: '办结量',\n    icon: 'ant-design:info-circle-outlined',\n    value: 54,\n    total: 87,\n    color: 'blue',\n    footer: '今日办结量',\n  },\n  {\n    title: '用户受理量',\n    icon: 'ant-design:info-circle-outlined',\n    value: 13,\n    total: 15,\n    color: 'orange',\n    footer: '用户今日受理量',\n  },\n  {\n    title: '用户办结量',\n    icon: 'ant-design:info-circle-outlined',\n    total: 9,\n    value: 7,\n    footer: '用户今日办结量',\n  },\n];\n\nexport const table = {\n  dataSource: [\n    { reBizCode: '1', type: '转移登记', acceptBy: '张三', acceptDate: '2019-01-22', curNode: '任务分派', flowRate: 60 },\n    { reBizCode: '2', type: '抵押登记', acceptBy: '李四', acceptDate: '2019-01-23', curNode: '领导审核', flowRate: 30 },\n    { reBizCode: '3', type: '转移登记', acceptBy: '王武', acceptDate: '2019-01-25', curNode: '任务处理', flowRate: 20 },\n    { reBizCode: '4', type: '转移登记', acceptBy: '赵楼', acceptDate: '2019-11-22', curNode: '部门审核', flowRate: 80 },\n    { reBizCode: '5', type: '转移登记', acceptBy: '钱就', acceptDate: '2019-12-12', curNode: '任务分派', flowRate: 90 },\n    { reBizCode: '6', type: '转移登记', acceptBy: '孙吧', acceptDate: '2019-03-06', curNode: '任务处理', flowRate: 10 },\n    { reBizCode: '7', type: '抵押登记', acceptBy: '周大', acceptDate: '2019-04-13', curNode: '任务分派', flowRate: 100 },\n    { reBizCode: '8', type: '抵押登记', acceptBy: '吴二', acceptDate: '2019-05-09', curNode: '任务上报', flowRate: 50 },\n    { reBizCode: '9', type: '抵押登记', acceptBy: '郑爽', acceptDate: '2019-07-12', curNode: '任务处理', flowRate: 63 },\n    { reBizCode: '20', type: '抵押登记', acceptBy: '林有', acceptDate: '2019-12-12', curNode: '任务打回', flowRate: 59 },\n    { reBizCode: '11', type: '转移登记', acceptBy: '码云', acceptDate: '2019-09-10', curNode: '任务签收', flowRate: 87 },\n  ],\n  columns: [\n    {\n      title: '业务号',\n      align: 'center',\n      dataIndex: 'reBizCode',\n    },\n    {\n      title: '业务类型',\n      align: 'center',\n      dataIndex: 'type',\n    },\n    {\n      title: '受理人',\n      align: 'center',\n      dataIndex: 'acceptBy',\n    },\n    {\n      title: '受理时间',\n      align: 'center',\n      dataIndex: 'acceptDate',\n    },\n    {\n      title: '当前节点',\n      align: 'center',\n      dataIndex: 'curNode',\n    },\n    {\n      title: '办理时长',\n      align: 'center',\n      dataIndex: 'flowRate',\n    },\n  ],\n  ipagination: {\n    current: 1,\n    pageSize: 5,\n    pageSizeOptions: ['10', '20', '30'],\n    showTotal: (total, range) => {\n      return range[0] + '-' + range[1] + ' 共' + total + '条';\n    },\n    showQuickJumper: true,\n    showSizeChanger: true,\n    total: 0,\n  },\n};\nexport const table1 = {\n  dataSource: [\n    { reBizCode: 'A001', type: '转移登记', acceptBy: '张四', acceptDate: '2019-01-22', curNode: '任务分派', flowRate: 12 },\n    { reBizCode: 'A002', type: '抵押登记', acceptBy: '李吧', acceptDate: '2019-01-23', curNode: '任务签收', flowRate: 3 },\n    { reBizCode: 'A003', type: '转移登记', acceptBy: '王三', acceptDate: '2019-01-25', curNode: '任务处理', flowRate: 24 },\n    { reBizCode: 'A004', type: '转移登记', acceptBy: '赵二', acceptDate: '2019-11-22', curNode: '部门审核', flowRate: 10 },\n    { reBizCode: 'A005', type: '转移登记', acceptBy: '钱大', acceptDate: '2019-12-12', curNode: '任务签收', flowRate: 8 },\n    { reBizCode: 'A006', type: '转移登记', acceptBy: '孙就', acceptDate: '2019-03-06', curNode: '任务处理', flowRate: 10 },\n    { reBizCode: 'A007', type: '抵押登记', acceptBy: '周晕', acceptDate: '2019-04-13', curNode: '部门审核', flowRate: 24 },\n    { reBizCode: 'A008', type: '抵押登记', acceptBy: '吴有', acceptDate: '2019-05-09', curNode: '部门审核', flowRate: 30 },\n    { reBizCode: 'A009', type: '抵押登记', acceptBy: '郑武', acceptDate: '2019-07-12', curNode: '任务分派', flowRate: 1 },\n    { reBizCode: 'A0010', type: '抵押登记', acceptBy: '林爽', acceptDate: '2019-12-12', curNode: '部门审核', flowRate: 16 },\n    { reBizCode: 'A0011', type: '转移登记', acceptBy: '码楼', acceptDate: '2019-09-10', curNode: '部门审核', flowRate: 7 },\n  ],\n  columns: [\n    {\n      title: '业务号',\n      align: 'center',\n      dataIndex: 'reBizCode',\n    },\n    {\n      title: '受理人',\n      align: 'center',\n      dataIndex: 'acceptBy',\n    },\n    {\n      title: '发起时间',\n      align: 'center',\n      dataIndex: 'acceptDate',\n    },\n    {\n      title: '当前节点',\n      align: 'center',\n      dataIndex: 'curNode',\n    },\n    {\n      title: '超时时间',\n      align: 'center',\n      dataIndex: 'flowRate',\n    },\n  ],\n  ipagination: {\n    current: 1,\n    pageSize: 5,\n    pageSizeOptions: ['10', '20', '30'],\n    showTotal: (total, range) => {\n      return range[0] + '-' + range[1] + ' 共' + total + '条';\n    },\n    showQuickJumper: true,\n    showSizeChanger: true,\n    total: 0,\n  },\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/Analysis/homePage/IndexBdc.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <ChartGroupCard class=\"enter-y\" :loading=\"loading\" type=\"bdc\" />\n    <BdcTabCard class=\"!my-4 enter-y\" :loading=\"loading\" />\n    <a-row>\n      <a-col :span=\"24\">\n        <a-card :loading=\"loading\" :class=\"{ 'anty-list-cust': true }\" :bordered=\"false\">\n          <a-tabs v-model:activeKey=\"indexBottomTab\" size=\"large\" :tab-bar-style=\"{ marginBottom: '24px', paddingLeft: '16px' }\">\n            <template #rightExtra>\n              <div class=\"extra-wrapper\">\n                <a-radio-group v-model:value=\"indexRegisterType\" @change=\"changeRegisterType\">\n                  <a-radio-button value=\"转移登记\">转移登记</a-radio-button>\n                  <a-radio-button value=\"抵押登记\">抵押登记</a-radio-button>\n                  <a-radio-button value=\"\">所有</a-radio-button>\n                </a-radio-group>\n              </div>\n            </template>\n\n            <a-tab-pane tab=\"业务流程限时监管\" key=\"1\">\n              <a-table\n                :dataSource=\"dataSource\"\n                size=\"default\"\n                rowKey=\"reBizCode\"\n                :columns=\"table.columns\"\n                :pagination=\"ipagination\"\n                @change=\"tableChange\"\n              >\n                <template #bodyCell=\"{ column, record }\">\n                  <template v-if=\"column.dataIndex === 'flowRate'\">\n                    <Progress\n                      :strokeColor=\"getPercentColor(record.flowRate)\"\n                      :format=\"getPercentFormat\"\n                      :percent=\"getFlowRateNumber(record.flowRate)\"\n                      style=\"width: 80px\"\n                    />\n                  </template>\n                </template>\n              </a-table>\n            </a-tab-pane>\n\n            <a-tab-pane loading=\"true\" tab=\"业务节点限时监管\" key=\"2\">\n              <a-table\n                :dataSource=\"dataSource1\"\n                size=\"default\"\n                rowKey=\"reBizCode\"\n                :columns=\"table1.columns\"\n                :pagination=\"ipagination1\"\n                @change=\"tableChange1\"\n              >\n                <template #bodyCell=\"{ column, record }\">\n                  <template v-if=\"column.dataIndex === 'flowRate'\">\n                    <span style=\"color: red\">{{ record.flowRate }}小时</span>\n                  </template>\n                </template>\n              </a-table>\n            </a-tab-pane>\n          </a-tabs>\n        </a-card>\n      </a-col>\n    </a-row>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, unref } from 'vue';\n  import { Progress } from 'ant-design-vue';\n  import ChartGroupCard from '../components/ChartGroupCard.vue';\n  import BdcTabCard from '../components/BdcTabCard.vue';\n  import LineMulti from '/@/components/chart/LineMulti.vue';\n  import HeadInfo from '/@/components/chart/HeadInfo.vue';\n  import { table, table1 } from '../data';\n\n  const loading = ref(true);\n\n  setTimeout(() => {\n    loading.value = false;\n  }, 500);\n\n  const indexBottomTab = ref('1');\n  const indexRegisterType = ref('转移登记');\n  const dataSource = ref([]);\n  const dataSource1 = ref([]);\n  const ipagination = ref(table.ipagination);\n  const ipagination1 = ref(table1.ipagination);\n\n  function changeRegisterType(e) {\n    indexRegisterType.value = e.target.value;\n    if (unref(indexBottomTab) == '1') {\n      loadDataSource();\n    } else {\n      loadDataSource1();\n    }\n  }\n\n  function tableChange(pagination) {\n    ipagination.value.current = pagination.current;\n    ipagination.value.pageSize = pagination.pageSize;\n    loadDataSource();\n  }\n\n  function tableChange1(pagination) {\n    ipagination1.value.current = pagination.current;\n    ipagination1.value.pageSize = pagination.pageSize;\n    loadDataSource1();\n  }\n\n  function getFlowRateNumber(value) {\n    return +value;\n  }\n\n  function getPercentFormat(value) {\n    if (value == 100) {\n      return '超时';\n    } else {\n      return value + '%';\n    }\n  }\n\n  function getPercentColor(value) {\n    let p = +value;\n    if (p >= 90 && p < 100) {\n      return 'rgb(244, 240, 89)';\n    } else if (p >= 100) {\n      return 'red';\n    } else {\n      return 'rgb(16, 142, 233)';\n    }\n  }\n\n  function loadDataSource() {\n    dataSource.value = table.dataSource.filter((item) => {\n      if (!unref(indexRegisterType)) {\n        return true;\n      }\n      return item.type == unref(indexRegisterType);\n    });\n  }\n\n  function loadDataSource1() {\n    dataSource1.value = table1.dataSource.filter((item) => {\n      if (!unref(indexRegisterType)) {\n        return true;\n      }\n      return item.type == unref(indexRegisterType);\n    });\n  }\n\n  loadDataSource();\n  loadDataSource1();\n</script>\n\n<style lang=\"less\" scoped>\n  .ant-table-wrapper {\n    :deep(.ant-table){\n      td,th {\n        padding: 10px;\n      }\n    }\n  }\n  .extra-wrapper {\n    line-height: 55px;\n    padding-right: 24px;\n\n    .extra-item {\n      display: inline-block;\n      margin-right: 24px;\n\n      a {\n        margin-left: 24px;\n      }\n    }\n  }\n\n  .item-group {\n    padding: 20px 0 8px 24px;\n    font-size: 0;\n\n    a {\n      color: rgba(0, 0, 0, 0.65);\n      display: inline-block;\n      font-size: 14px;\n      margin-bottom: 13px;\n      width: 25%;\n    }\n  }\n\n  .item-group {\n    .more-btn {\n      margin-bottom: 13px;\n      text-align: center;\n    }\n  }\n\n  .list-content-item {\n    color: rgba(0, 0, 0, 0.45);\n    display: inline-block;\n    vertical-align: middle;\n    font-size: 14px;\n    margin-left: 40px;\n  }\n\n  @media only screen and (min-width: 1600px) {\n    .list-content-item {\n      margin-left: 60px;\n    }\n  }\n\n  @media only screen and (max-width: 1300px) {\n    .list-content-item {\n      margin-left: 20px;\n    }\n\n    .width-hidden4 {\n      display: none;\n    }\n  }\n\n  .list-content-item {\n    span {\n      line-height: 20px;\n    }\n  }\n\n  .list-content-item {\n    p {\n      margin-top: 4px;\n      margin-bottom: 0;\n      line-height: 22px;\n    }\n  }\n\n  .anty-list-cust {\n    .ant-list-item-meta {\n      flex: 0.3 !important;\n    }\n  }\n\n  .anty-list-cust {\n    .ant-list-item-content {\n      flex: 1 !important;\n      justify-content: flex-start !important;\n      margin-left: 20px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/Analysis/homePage/IndexChart.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <ChartGroupCard class=\"enter-y\" :loading=\"loading\" type=\"chart\" />\n    <SaleTabCard class=\"!my-4 enter-y\" :loading=\"loading\" />\n    <a-row>\n      <a-col :span=\"24\">\n        <a-card :loading=\"loading\" :bordered=\"false\" title=\"最近一周访问量统计\">\n          <div class=\"infoArea\">\n            <HeadInfo title=\"今日IP\" :iconColor=\"ipColor\" :content=\"loginfo.todayIp\" icon=\"environment\"></HeadInfo>\n            <HeadInfo title=\"今日访问\" :iconColor=\"visitColor\" :content=\"loginfo.todayVisitCount\" icon=\"team\"></HeadInfo>\n            <HeadInfo title=\"总访问量\" :iconColor=\"seriesColor\" :content=\"loginfo.totalVisitCount\" icon=\"rise\"></HeadInfo>\n          </div>\n          <LineMulti :chartData=\"lineMultiData\" height=\"33vh\" type=\"line\" :option=\"{ legend: { top: 'bottom' } }\"></LineMulti>\n        </a-card>\n      </a-col>\n    </a-row>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, watch } from 'vue';\n  import ChartGroupCard from '../components/ChartGroupCard.vue';\n  import SaleTabCard from '../components/SaleTabCard.vue';\n  import LineMulti from '/@/components/chart/LineMulti.vue';\n  import HeadInfo from '/@/components/chart/HeadInfo.vue';\n  import { getLoginfo, getVisitInfo } from '../api.ts';\n  import { useRootSetting } from '/@/hooks/setting/useRootSetting';\n\n  const loading = ref(true);\n  const { getThemeColor } = useRootSetting();\n\n  setTimeout(() => {\n    loading.value = false;\n  }, 500);\n\n  const loginfo = ref({});\n  const lineMultiData = ref([]);\n\n  function initLogInfo() {\n    getLoginfo(null).then((res) => {\n      if (res.success) {\n        Object.keys(res.result).forEach((key) => {\n          res.result[key] = res.result[key] + '';\n        });\n        loginfo.value = res.result;\n      }\n    });\n    getVisitInfo(null).then((res) => {\n      if (res.success) {\n        lineMultiData.value = [];\n        res.result.forEach((item) => {\n          lineMultiData.value.push({ name: item.type, type: 'ip', value: item.ip, color: ipColor.value });\n          lineMultiData.value.push({ name: item.type, type: 'visit', value: item.visit, color: visitColor.value });\n        });\n      }\n    });\n  }\n\n  const ipColor = ref();\n  const visitColor = ref();\n  const seriesColor = ref();\n  watch(\n    () => getThemeColor.value,\n    () => {\n      seriesColor.value = getThemeColor.value;\n      visitColor.value = '#67B962';\n      ipColor.value = getThemeColor.value;\n      initLogInfo();\n    },\n    { immediate: true }\n  );\n\n  function getRandomColor() {\n    var letters = '0123456789ABCDEF';\n    var color = '#';\n    for (var i = 0; i < 6; i++) {\n      color += letters[Math.floor(Math.random() * 16)];\n    }\n    return color;\n  }\n</script>\n\n<style lang=\"less\" scoped>\n   .infoArea {\n    display: flex;\n    justify-content: space-between;\n    padding: 0 10%;\n    .head-info.center {\n      padding: 0;\n    }\n    .head-info {\n      min-width: 0;\n    }\n  }\n  .circle-cust {\n    position: relative;\n    top: 28px;\n    left: -100%;\n  }\n\n  .extra-wrapper {\n    line-height: 55px;\n    padding-right: 24px;\n\n    .extra-item {\n      display: inline-block;\n      margin-right: 24px;\n\n      a {\n        margin-left: 24px;\n      }\n    }\n  }\n\n  /* 首页访问量统计 */\n  .head-info {\n    position: relative;\n    text-align: left;\n    padding: 0 32px 0 0;\n    min-width: 125px;\n\n    &.center {\n      text-align: center;\n      padding: 0 32px;\n    }\n\n    span {\n      color: rgba(0, 0, 0, 0.45);\n      display: inline-block;\n      font-size: 0.95rem;\n      line-height: 42px;\n      margin-bottom: 4px;\n    }\n\n    p {\n      line-height: 42px;\n      margin: 0;\n\n      a {\n        font-weight: 600;\n        font-size: 1rem;\n      }\n    }\n  }\n  .ant-card {\n    ::v-deep(.ant-card-head-title) {\n      font-weight: normal;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/Analysis/homePage/IndexDef.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <GrowCard :loading=\"loading\" class=\"enter-y\" />\n    <SiteAnalysis class=\"!my-4 enter-y\" :loading=\"loading\" />\n    <div class=\"md:flex enter-y\">\n      <VisitRadar class=\"md:w-1/3 w-full\" :loading=\"loading\" />\n      <VisitSource class=\"md:w-1/3 !md:mx-4 !md:my-0 !my-4 w-full\" :loading=\"loading\" />\n      <SalesProductPie class=\"md:w-1/3 w-full\" :loading=\"loading\" />\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import GrowCard from '../components/GrowCard.vue';\n  import SiteAnalysis from '../components/SiteAnalysis.vue';\n  import VisitSource from '../components/VisitSource.vue';\n  import VisitRadar from '../components/VisitRadar.vue';\n  import SalesProductPie from '../components/SalesProductPie.vue';\n\n  const loading = ref(true);\n\n  setTimeout(() => {\n    loading.value = false;\n  }, 500);\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/Analysis/homePage/IndexTask.vue",
    "content": "<template>\n  <div class=\"index-container-ty\">\n    <a-row type=\"flex\" justify=\"start\" :gutter=\"3\">\n      <a-col :sm=\"24\" :lg=\"12\">\n        <a-card>\n          <template #title>\n            <div class=\"index-md-title\">\n              <img src=\"../../../../assets/images/daiban.png\" />\n              我的待办【{{ dataSource1.length }}】\n            </div>\n          </template>\n\n          <template v-if=\"dataSource1 && dataSource1.length > 0\" #extra>\n            <a @click=\"goPage\"\n              >更多\n              <Icon icon=\"ant-design:double-right-outlined\" />\n            </a>\n          </template>\n\n          <a-table\n            :class=\"'my-index-table tytable1'\"\n            ref=\"table1\"\n            size=\"small\"\n            rowKey=\"id\"\n            :columns=\"columns\"\n            :dataSource=\"dataSource1\"\n            :pagination=\"false\"\n          >\n            <template #ellipsisText=\"{ text }\">\n              <JEllipsis :value=\"text\" :length=\"textMaxLength\"></JEllipsis>\n            </template>\n\n            <template #dayWarnning=\"{ text, record }\">\n              <BellTwoTone style=\"font-size: 22px\" :twoToneColor=\"getTipColor(record)\" />\n            </template>\n\n            <template #action=\"{ text, record }\">\n              <a @click=\"handleData\">办理</a>\n            </template>\n          </a-table>\n        </a-card>\n      </a-col>\n\n      <a-col :sm=\"24\" :lg=\"12\">\n        <a-card>\n          <template #title>\n            <div class=\"index-md-title\">\n              <img src=\"../../../../assets/images/zaiban.png\" />\n              我的在办【{{ dataSource2.length }}】\n            </div>\n          </template>\n\n          <template v-if=\"dataSource2 && dataSource2.length > 0\" #extra>\n            <a @click=\"goPage\"\n              >更多\n              <Icon icon=\"ant-design:double-right-outlined\" />\n            </a>\n          </template>\n\n          <a-table\n            :class=\"'my-index-table tytable2'\"\n            ref=\"table1\"\n            size=\"small\"\n            rowKey=\"id\"\n            :columns=\"columns\"\n            :dataSource=\"dataSource2\"\n            :pagination=\"false\"\n          >\n            <template #ellipsisText=\"{ text }\">\n              <JEllipsis :value=\"text\" :length=\"textMaxLength\"></JEllipsis>\n            </template>\n\n            <template #dayWarnning=\"{ text, record }\">\n              <BellTwoTone style=\"font-size: 22px\" :twoToneColor=\"getTipColor(record)\" />\n            </template>\n\n            <template #action=\"{ text, record }\">\n              <a @click=\"handleData\">办理</a>\n            </template>\n          </a-table>\n        </a-card>\n      </a-col>\n\n      <a-col :span=\"24\">\n        <div style=\"height: 5px\"></div>\n      </a-col>\n\n      <a-col :sm=\"24\" :lg=\"12\">\n        <a-card>\n          <template #title>\n            <div class=\"index-md-title\">\n              <img src=\"../../../../assets/images/guaz.png\" />\n              我的挂账【{{ dataSource4.length }}】\n            </div>\n          </template>\n\n          <a-table\n            :class=\"'my-index-table tytable4'\"\n            ref=\"table1\"\n            size=\"small\"\n            rowKey=\"id\"\n            :columns=\"columns\"\n            :dataSource=\"dataSource4\"\n            :pagination=\"false\"\n          >\n            <template #ellipsisText=\"{ text }\">\n              <JEllipsis :value=\"text\" :length=\"textMaxLength\"></JEllipsis>\n            </template>\n\n            <template #dayWarnning=\"{ text, record }\">\n              <BellTwoTone style=\"font-size: 22px\" :twoToneColor=\"getTipColor(record)\" />\n            </template>\n\n            <template #action=\"{ text, record }\">\n              <a @click=\"handleData\">办理</a>\n            </template>\n          </a-table>\n        </a-card>\n      </a-col>\n\n      <a-col :sm=\"24\" :lg=\"12\">\n        <a-card>\n          <template #title>\n            <div class=\"index-md-title\">\n              <img src=\"../../../../assets/images/duban.png\" />\n              我的督办【{{ dataSource3.length }}】\n            </div>\n          </template>\n\n          <a-table\n            :class=\"'my-index-table tytable3'\"\n            ref=\"table1\"\n            size=\"small\"\n            rowKey=\"id\"\n            :columns=\"columns\"\n            :dataSource=\"dataSource3\"\n            :pagination=\"false\"\n          >\n            <template #ellipsisText=\"{ text }\">\n              <JEllipsis :value=\"text\" :length=\"textMaxLength\"></JEllipsis>\n            </template>\n\n            <template #dayWarnning=\"{ text, record }\">\n              <BellTwoTone style=\"font-size: 22px\" :twoToneColor=\"getTipColor(record)\" />\n            </template>\n\n            <template #action=\"{ text, record }\">\n              <a @click=\"handleData\">办理</a>\n            </template>\n          </a-table>\n        </a-card>\n      </a-col>\n    </a-row>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import noDataPng from '/@/assets/images/nodata.png';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import JEllipsis from '/@/components/Form/src/jeecg/components/JEllipsis.vue';\n  import { BulbTwoTone, BellTwoTone } from '@ant-design/icons-vue';\n\n  const tempSs1 = [\n    {\n      id: '001',\n      orderNo: '电[1]1267102',\n      orderTitle: '药品出问题了',\n      restDay: 1,\n    },\n    {\n      id: '002',\n      orderNo: '电[4]5967102',\n      orderTitle: '吃了xxx医院的药，病情越来越严重',\n      restDay: 0,\n    },\n    {\n      id: '003',\n      orderNo: '电[3]5988987',\n      orderTitle: '今天去超市买鸡蛋，鸡蛋都是坏的',\n      restDay: 7,\n    },\n    {\n      id: '004',\n      orderNo: '电[2]5213491',\n      orderTitle: 'xx宝实体店高价售卖xx',\n      restDay: 5,\n    },\n    {\n      id: '005',\n      orderNo: '电[1]1603491',\n      orderTitle: '以红利相诱，答应退保后扣一年费用',\n      restDay: 0,\n    },\n  ];\n\n  const tempSs2 = [\n    {\n      id: '001',\n      orderTitle: '我要投诉这个大超市',\n      orderNo: '电[1]10299456',\n      restDay: 6,\n    },\n    {\n      id: '002',\n      orderTitle: 'xxx医院乱开药方,售卖假药',\n      orderNo: '电[2]20235691',\n      restDay: 0,\n    },\n    {\n      id: '003',\n      orderTitle: '我想问问这家店是干啥的',\n      orderNo: '电[3]495867322',\n      restDay: 7,\n    },\n    {\n      id: '004',\n      orderTitle: '我要举报朝阳区奥森公园酒店',\n      orderNo: '电[2]1193849',\n      restDay: 3,\n    },\n    {\n      id: '005',\n      orderTitle: '我今天吃饭吃到一个石头子',\n      orderNo: '电[4]56782344',\n      restDay: 9,\n    },\n  ];\n\n  //4-7天\n  const tip_green = 'rgba(0, 255, 0, 1)';\n  //1-3天\n  const tip_yellow = 'rgba(255, 255, 0, 1)';\n  //超期\n  const tip_red = 'rgba(255, 0, 0, 1)';\n\n  const textMaxLength = 8;\n  const $message = useMessage();\n\n  const dataSource1 = ref([]);\n  const dataSource2 = ref([]);\n  const dataSource3 = ref([]);\n  const dataSource4 = ref([]);\n  const columns = [\n    {\n      title: '',\n      dataIndex: '',\n      key: 'rowIndex',\n      width: 50,\n      fixed: 'left',\n      align: 'center',\n      slots: { customRender: 'dayWarnning' },\n    },\n    {\n      title: '剩余天数',\n      align: 'center',\n      dataIndex: 'restDay',\n      width: 80,\n    },\n    {\n      title: '工单标题',\n      align: 'center',\n      dataIndex: 'orderTitle',\n      slots: { customRender: 'ellipsisText' },\n    },\n    {\n      title: '工单编号',\n      align: 'center',\n      dataIndex: 'orderNo',\n    },\n    {\n      title: '操作',\n      dataIndex: 'action',\n      align: 'center',\n      slots: { customRender: 'action' },\n    },\n  ];\n\n  function getTipColor(rd) {\n    let num = rd.restDay;\n    if (num <= 0) {\n      return tip_red;\n    } else if (num >= 1 && num < 4) {\n      return tip_yellow;\n    } else if (num >= 4) {\n      return tip_green;\n    }\n  }\n\n  function mock() {\n    dataSource1.value = tempSs1;\n    dataSource2.value = tempSs2;\n    dataSource3.value = tempSs1;\n    dataSource4.value = tempSs2;\n    ifNullDataSource(dataSource4, '.tytable4');\n  }\n\n  function ifNullDataSource(ds, tb) {\n    if (!ds || ds.length == 0) {\n      var tmp = document.createElement('img');\n      tmp.src = noDataPng;\n      tmp.width = 300;\n      let tbclass = `${tb} .ant-table-placeholder`;\n      document.querySelector(tbclass).innerHTML = '';\n      document.querySelector(tbclass).appendChild(tmp);\n    }\n  }\n\n  function handleData() {\n    $message.createMessage.success('办理完成');\n  }\n\n  function goPage() {\n    $message.createMessage.success('请根据具体业务跳转页面');\n  }\n\n  mock();\n</script>\n\n<style scoped lang=\"less\">\n  .my-index-table {\n    height: 270px;\n\n    table {\n      font-size: 14px !important;\n    }\n  }\n\n  .index-container-ty {\n    margin: 12px 12px 0;\n\n    :deep(.ant-card-body) {\n      padding: 10px 12px 0 12px;\n    }\n\n    :deep(.ant-card-head) {\n      line-height: 24px;\n      min-height: 24px;\n      background: #7196fb !important;\n\n      .ant-card-head-title {\n        padding-top: 6px;\n        padding-bottom: 6px;\n      }\n\n      .ant-card-extra {\n        padding: 0;\n\n        a {\n          color: #fff;\n        }\n\n        a:hover {\n          color: #152ede;\n        }\n      }\n    }\n\n    :deep(.ant-table-footer) {\n      text-align: right;\n      padding: 6px 12px 6px 6px;\n      background: #fff;\n      border-top: 2px solid #f7f1f1;\n    }\n\n    .index-md-title {\n      position: relative;\n      width: 100%;\n      color: #fff;\n      font-size: 21px;\n      font-family: cursive;\n      padding-left: 25px;\n\n      img {\n        position: absolute;\n        height: 25px;\n        left: 0;\n      }\n    }\n\n    :deep(.ant-table-thead > tr > th),\n    :deep(.ant-table-tbody > tr > td) {\n      border-bottom: 1px solid #90aeff;\n    }\n\n    :deep(\n      .ant-table-small\n      > .ant-table-content\n      > .ant-table-fixed-left\n      > .ant-table-body-outer\n      > .ant-table-body-inner\n      > table\n      > .ant-table-thead\n      > tr\n      > th),\n    :deep(\n      .ant-table-small\n      > .ant-table-content\n      > .ant-table-fixed-right\n      > .ant-table-body-outer\n      > .ant-table-body-inner\n      > table\n      > .ant-table-thead\n      > tr\n      > th) {\n      border-bottom: 1px solid #90aeff;\n    }\n\n    :deep(.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-body > table > .ant-table-thead > tr > th) {\n      border-bottom: 1px solid #90aeff;\n    }\n\n    :deep(.ant-table-small) {\n      border: 1px solid #90aeff;\n    }\n\n    :deep(.ant-table-placeholder) {\n      padding: 0;\n      height: 215px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/Analysis/index.vue",
    "content": "<template>\n  <IndexChart v-if=\"indexStyle === 0\"></IndexChart>\n  <IndexDef v-if=\"indexStyle === 1\"></IndexDef>\n  <IndexBdc v-if=\"indexStyle == 2\"></IndexBdc>\n  <IndexTask v-if=\"indexStyle == 3\"></IndexTask>\n  <div style=\"width: 100%; text-align: right; margin-top: 20px\">\n    首页主题：\n    <a-radio-group v-model:value=\"indexStyle\">\n      <a-radio :value=\"0\">默认</a-radio>\n      <a-radio :value=\"1\">销量统计</a-radio>\n      <a-radio :value=\"2\">业务统计</a-radio>\n      <a-radio :value=\"3\">我的任务</a-radio>\n    </a-radio-group>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import IndexDef from './homePage/IndexDef.vue';\n  import IndexChart from './homePage/IndexChart.vue';\n  import IndexBdc from './homePage/IndexBdc.vue';\n  import IndexTask from './homePage/IndexTask.vue';\n\n  const indexStyle = ref(0);\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/ai/components/aide/index.vue",
    "content": "<template>\n  <div v-if=\"visible\" ref=\"aideWrapRef\" class=\"aide-wrap\" @click=\"handleGo\">\n    <a-popconfirm\n      :open=\"popconfirmVisible\"\n      placement=\"topRight\"\n      title=\"确定AI助手退出吗？\"\n      ok-text=\"确定\"\n      cancel-text=\"取消\"\n      @cancel=\"handleCancel\"\n      @confirm=\"handleConfirm\"\n    >\n      <img :src=\"aiImage\" alt=\"ai助手\" />\n    </a-popconfirm>\n  </div>\n</template>\n\n<script setup>\n  import { onMounted, ref } from 'vue';\n  import { router } from '/@/router';\n  import { AIDE_FLAG } from '/@/enums/cacheEnum';\n  import { getToken } from '/@/utils/auth';\n  import { getAuthCache, setAuthCache, removeAuthCache } from '/@/utils/auth';\n  import aiImage from './images/ai.png';\n  const visible = ref(1);\n  const aideWrapRef = ref(null);\n  const popconfirmVisible = ref(false);\n\n  onMounted(() => {\n    const aideFlag = getAuthCache(AIDE_FLAG);\n    if (aideFlag && aideFlag == getToken()) {\n      visible.value = false;\n    } else {\n      visible.value = true;\n    }\n    if (visible.value) {\n      aideWrapRef.value.addEventListener('contextmenu', (e) => {\n        popconfirmVisible.value = true;\n        e.preventDefault();\n      });\n    }\n  });\n  const handleCancel = () => {\n    popconfirmVisible.value = false;\n  };\n  const handleConfirm = () => {\n    popconfirmVisible.value = false;\n    visible.value = false;\n    setAuthCache(AIDE_FLAG, getToken());\n  };\n  const handleGo = (params) => {\n    router.push({ path: '/ai' });\n  };\n</script>\n\n<style lang=\"less\" scoped>\n  .aide-wrap {\n    position: fixed;\n    top: 50%;\n    right: 5px;\n    transform: translate(0, -50%);\n    height: 33px;\n    width: 33px;\n    border-radius: 50%;\n    text-align: center;\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    align-items: center;\n    line-height: 1;\n    color: #fff;\n    cursor: pointer;\n    .text {\n      font-size: 12px;\n      transform: scale(0.88);\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/ai/index.vue",
    "content": "<template>\n  <div class=\"wrap\">\n    <div class=\"content\">\n      <AiChat></AiChat>\n    </div>\n  </div>\n</template>\n\n<script setup>\n  import AiChat from '/@/views/super/airag/aiapp/chat/AiChat.vue';\n  \n</script>\n\n<style lang=\"less\" scoped>\n  .wrap {\n    height: 100%;\n    width: 100%;\n    .content {\n      background: #fff;\n      width: 100%;\n      height: 100%;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/workbench/components/DynamicInfo.vue",
    "content": "<template>\n  <Card title=\"最新动态\" v-bind=\"$attrs\">\n    <template #extra>\n      <a-button type=\"link\" size=\"small\">更多</a-button>\n    </template>\n    <List item-layout=\"horizontal\" :data-source=\"dynamicInfoItems\">\n      <template #renderItem=\"{ item }\">\n        <ListItem>\n          <ListItemMeta>\n            <template #description>\n              {{ item.date }}\n            </template>\n            <!-- eslint-disable-next-line -->\n            <template #title> {{ item.name }} <span v-html=\"item.desc\"> </span> </template>\n            <template #avatar>\n              <Icon :icon=\"item.avatar\" :size=\"30\" />\n            </template>\n          </ListItemMeta>\n        </ListItem>\n      </template>\n    </List>\n  </Card>\n</template>\n<script lang=\"ts\" setup>\n  import { Card, List } from 'ant-design-vue';\n  import { dynamicInfoItems } from './data';\n  import { Icon } from '/@/components/Icon';\n\n  const ListItem = List.Item;\n  const ListItemMeta = List.Item.Meta;\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/workbench/components/ProjectCard.vue",
    "content": "<template>\n  <Card title=\"项目\" v-bind=\"$attrs\">\n    <template #extra>\n      <a-button type=\"link\" size=\"small\">更多</a-button>\n    </template>\n\n    <template v-for=\"item in items\" :key=\"item\">\n      <CardGrid class=\"!md:w-1/3 !w-full\">\n        <span class=\"flex\">\n          <Icon :icon=\"item.icon\" :color=\"item.color\" size=\"30\" />\n          <span class=\"text-lg ml-4\">{{ item.title }}</span>\n        </span>\n        <div class=\"flex mt-2 h-10 text-secondary\"> {{ item.desc }} </div>\n        <div class=\"flex justify-between text-secondary\">\n          <span>{{ item.group }}</span>\n          <span>{{ item.date }}</span>\n        </div>\n      </CardGrid>\n    </template>\n  </Card>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { Card } from 'ant-design-vue';\n  import { Icon } from '/@/components/Icon';\n  import { groupItems } from './data';\n\n  export default defineComponent({\n    components: { Card, CardGrid: Card.Grid, Icon },\n    setup() {\n      return { items: groupItems };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/workbench/components/QuickNav.vue",
    "content": "<template>\n  <Card title=\"快捷导航\" v-bind=\"$attrs\">\n    <template v-for=\"item in navItems\" :key=\"item\">\n      <CardGrid>\n        <span class=\"flex flex-col items-center\">\n          <Icon :icon=\"item.icon\" :color=\"item.color\" size=\"20\" />\n          <span class=\"text-md mt-2\">{{ item.title }}</span>\n        </span>\n      </CardGrid>\n    </template>\n  </Card>\n</template>\n<script lang=\"ts\" setup>\n  import { Card } from 'ant-design-vue';\n  import { navItems } from './data';\n  import { Icon } from '/@/components/Icon';\n\n  const CardGrid = Card.Grid;\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/workbench/components/SaleRadar.vue",
    "content": "<template>\n  <Card title=\"销售统计\" :loading=\"loading\">\n    <div ref=\"chartRef\" :style=\"{ width, height }\"></div>\n  </Card>\n</template>\n<script lang=\"ts\" setup>\n  import { Ref, ref, watch } from 'vue';\n  import { Card } from 'ant-design-vue';\n  import { useECharts } from '/@/hooks/web/useECharts';\n\n  const props = defineProps({\n    loading: Boolean,\n    width: {\n      type: String as PropType<string>,\n      default: '100%',\n    },\n    height: {\n      type: String as PropType<string>,\n      default: '400px',\n    },\n  });\n\n  const chartRef = ref<HTMLDivElement | null>(null);\n  const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);\n  watch(\n    () => props.loading,\n    () => {\n      if (props.loading) {\n        return;\n      }\n      setOptions({\n        legend: {\n          bottom: 0,\n          data: ['Visits', 'Sales'],\n        },\n        tooltip: {},\n        radar: {\n          radius: '60%',\n          splitNumber: 8,\n          indicator: [\n            {\n              name: '2017',\n            },\n            {\n              name: '2017',\n            },\n            {\n              name: '2018',\n            },\n            {\n              name: '2019',\n            },\n            {\n              name: '2020',\n            },\n            {\n              name: '2021',\n            },\n          ],\n        },\n        series: [\n          {\n            type: 'radar' as 'custom',\n            symbolSize: 0,\n            areaStyle: {\n              shadowBlur: 0,\n              shadowColor: 'rgba(0,0,0,.2)',\n              shadowOffsetX: 0,\n              shadowOffsetY: 10,\n              opacity: 1,\n            },\n            data: [\n              {\n                value: [90, 50, 86, 40, 50, 20],\n                name: 'Visits',\n                itemStyle: {\n                  color: '#b6a2de',\n                },\n              },\n              {\n                value: [70, 75, 70, 76, 20, 85],\n                name: 'Sales',\n                itemStyle: {\n                  color: '#67e0e3',\n                },\n              },\n            ],\n          },\n        ],\n      });\n    },\n    { immediate: true }\n  );\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/workbench/components/WorkbenchHeader.vue",
    "content": "<template>\n  <div class=\"lg:flex\">\n    <Avatar :src=\"userinfo.avatar || headerImg\" :size=\"72\" class=\"!mx-auto !block\" />\n    <div class=\"md:ml-6 flex flex-col justify-center md:mt-0 mt-2\">\n      <h1 class=\"md:text-lg text-md\">早安, {{ userinfo.realname }}, 开始您一天的工作吧！</h1>\n      <span class=\"text-secondary\"> 今日晴，20℃ - 32℃！ </span>\n    </div>\n    <div class=\"flex flex-1 justify-end md:mt-0 mt-4\">\n      <div class=\"flex flex-col justify-center text-right\">\n        <span class=\"text-secondary\"> 待办 </span>\n        <span class=\"text-2xl\">2/10</span>\n      </div>\n\n      <div class=\"flex flex-col justify-center text-right md:mx-16 mx-12\">\n        <span class=\"text-secondary\"> 项目 </span>\n        <span class=\"text-2xl\">8</span>\n      </div>\n      <div class=\"flex flex-col justify-center text-right md:mr-10 mr-4\">\n        <span class=\"text-secondary\"> 团队 </span>\n        <span class=\"text-2xl\">300</span>\n      </div>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { computed } from 'vue';\n  import { Avatar } from 'ant-design-vue';\n  import { useUserStore } from '/@/store/modules/user';\n  import headerImg from '/@/assets/images/header.jpg';\n\n  const userStore = useUserStore();\n  const userinfo = computed(() => userStore.getUserInfo);\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/workbench/components/data.ts",
    "content": "interface GroupItem {\n  title: string;\n  icon: string;\n  color: string;\n  desc: string;\n  date: string;\n  group: string;\n}\n\ninterface NavItem {\n  title: string;\n  icon: string;\n  color: string;\n}\n\ninterface DynamicInfoItem {\n  avatar: string;\n  name: string;\n  date: string;\n  desc: string;\n}\n\nexport const navItems: NavItem[] = [\n  {\n    title: '首页',\n    icon: 'ion:home-outline',\n    color: '#1fdaca',\n  },\n  {\n    title: '仪表盘',\n    icon: 'ion:grid-outline',\n    color: '#bf0c2c',\n  },\n  {\n    title: '组件',\n    icon: 'ion:layers-outline',\n    color: '#e18525',\n  },\n  {\n    title: '系统管理',\n    icon: 'ion:settings-outline',\n    color: '#3fb27f',\n  },\n  {\n    title: '权限管理',\n    icon: 'ion:key-outline',\n    color: '#4daf1bc9',\n  },\n  {\n    title: '图表',\n    icon: 'ion:bar-chart-outline',\n    color: '#00d8ff',\n  },\n];\n\nexport const dynamicInfoItems: DynamicInfoItem[] = [\n  {\n    avatar: 'dynamic-avatar-1|svg',\n    name: '威廉',\n    date: '刚刚',\n    desc: `在 <a>开源组</a> 创建了项目 <a>Vue</a>`,\n  },\n  {\n    avatar: 'dynamic-avatar-2|svg',\n    name: '艾文',\n    date: '1个小时前',\n    desc: `关注了 <a>威廉</a> `,\n  },\n  {\n    avatar: 'dynamic-avatar-3|svg',\n    name: '克里斯',\n    date: '1天前',\n    desc: `发布了 <a>个人动态</a> `,\n  },\n  {\n    avatar: 'dynamic-avatar-4|svg',\n    name: 'Jeecg',\n    date: '2天前',\n    desc: `发表文章 <a>如何编写一个Vite插件</a> `,\n  },\n  {\n    avatar: 'dynamic-avatar-5|svg',\n    name: '皮特',\n    date: '3天前',\n    desc: `回复了 <a>杰克</a> 的问题 <a>如何进行项目优化？</a>`,\n  },\n  {\n    avatar: 'dynamic-avatar-6|svg',\n    name: '杰克',\n    date: '1周前',\n    desc: `关闭了问题 <a>如何运行项目</a> `,\n  },\n  {\n    avatar: 'dynamic-avatar-1|svg',\n    name: '威廉',\n    date: '1周前',\n    desc: `发布了 <a>个人动态</a> `,\n  },\n  {\n    avatar: 'dynamic-avatar-1|svg',\n    name: '威廉',\n    date: '2021-04-01 20:00',\n    desc: `推送了代码到 <a>Github</a>`,\n  },\n];\n\nexport const groupItems: GroupItem[] = [\n  {\n    title: 'Github',\n    icon: 'carbon:logo-github',\n    color: '',\n    desc: '不要等待机会，而要创造机会。',\n    group: '开源组',\n    date: '2021-04-01',\n  },\n  {\n    title: 'Vue',\n    icon: 'ion:logo-vue',\n    color: '#3fb27f',\n    desc: '现在的你决定将来的你。',\n    group: '算法组',\n    date: '2021-04-01',\n  },\n  {\n    title: 'Html5',\n    icon: 'ion:logo-html5',\n    color: '#e18525',\n    desc: '没有什么才能比努力更重要。',\n    group: '上班摸鱼',\n    date: '2021-04-01',\n  },\n  {\n    title: 'Angular',\n    icon: 'ion:logo-angular',\n    color: '#bf0c2c',\n    desc: '热情和欲望可以突破一切难关。',\n    group: 'UI',\n    date: '2021-04-01',\n  },\n  {\n    title: 'React',\n    icon: 'bx:bxl-react',\n    color: '#00d8ff',\n    desc: '健康的身体是实目标的基石。',\n    group: '技术牛',\n    date: '2021-04-01',\n  },\n  {\n    title: 'Js',\n    icon: 'ion:logo-javascript',\n    color: '#4daf1bc9',\n    desc: '路是走出来的，而不是空想出来的。',\n    group: '架构组',\n    date: '2021-04-01',\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/dashboard/workbench/index.vue",
    "content": "<template>\n  <PageWrapper>\n    <template #headerContent> <WorkbenchHeader /> </template>\n    <div class=\"lg:flex\">\n      <div class=\"lg:w-7/10 w-full !mr-4 enter-y\">\n        <ProjectCard :loading=\"loading\" class=\"enter-y\" />\n        <DynamicInfo :loading=\"loading\" class=\"!my-4 enter-y\" />\n      </div>\n      <div class=\"lg:w-3/10 w-full enter-y\">\n        <QuickNav :loading=\"loading\" class=\"enter-y\" />\n\n        <Card class=\"!my-4 enter-y\" :loading=\"loading\">\n          <img class=\"xl:h-50 h-30 mx-auto\" src=\"../../../assets/svg/illustration.svg\" />\n        </Card>\n\n        <SaleRadar :loading=\"loading\" class=\"enter-y\" />\n      </div>\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import { Card } from 'ant-design-vue';\n  import { PageWrapper } from '/@/components/Page';\n  import WorkbenchHeader from './components/WorkbenchHeader.vue';\n  import ProjectCard from './components/ProjectCard.vue';\n  import QuickNav from './components/QuickNav.vue';\n  import DynamicInfo from './components/DynamicInfo.vue';\n  import SaleRadar from './components/SaleRadar.vue';\n\n  const loading = ref(true);\n\n  setTimeout(() => {\n    loading.value = false;\n  }, 500);\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/charts/Line.vue",
    "content": "<template>\n  <div ref=\"chartRef\" :style=\"{ height, width }\"></div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, ref, Ref, onMounted } from 'vue';\n\n  import { useECharts } from '/@/hooks/web/useECharts';\n  import { getLineData } from './data';\n\n  export default defineComponent({\n    props: {\n      width: {\n        type: String as PropType<string>,\n        default: '100%',\n      },\n      height: {\n        type: String as PropType<string>,\n        default: 'calc(100vh - 78px)',\n      },\n    },\n    setup() {\n      const chartRef = ref<HTMLDivElement | null>(null);\n      const { setOptions, echarts } = useECharts(chartRef as Ref<HTMLDivElement>);\n      const { barData, lineData, category } = getLineData;\n      onMounted(() => {\n        setOptions({\n          backgroundColor: '#0f375f',\n          tooltip: {\n            trigger: 'axis',\n            axisPointer: {\n              type: 'shadow',\n              label: {\n                show: true,\n                backgroundColor: '#333',\n              },\n            },\n          },\n          legend: {\n            data: ['line', 'bar'],\n            textStyle: {\n              color: '#ccc',\n            },\n          },\n          xAxis: {\n            data: category,\n            axisLine: {\n              lineStyle: {\n                color: '#ccc',\n              },\n            },\n          },\n          yAxis: {\n            splitLine: { show: false },\n            axisLine: {\n              lineStyle: {\n                color: '#ccc',\n              },\n            },\n          },\n          series: [\n            {\n              name: 'line',\n              type: 'line',\n              smooth: true,\n              showAllSymbol: 'auto',\n              symbol: 'emptyCircle',\n              symbolSize: 15,\n              data: lineData,\n            },\n            {\n              name: 'bar',\n              type: 'bar',\n              barWidth: 10,\n              itemStyle: {\n                borderRadius: 5,\n                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\n                  { offset: 0, color: '#14c8d4' },\n                  { offset: 1, color: '#43eec6' },\n                ]),\n              },\n              data: barData,\n            },\n            {\n              name: 'line',\n              type: 'bar',\n              barGap: '-100%',\n              barWidth: 10,\n              itemStyle: {\n                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\n                  { offset: 0, color: 'rgba(20,200,212,0.5)' },\n                  { offset: 0.2, color: 'rgba(20,200,212,0.2)' },\n                  { offset: 1, color: 'rgba(20,200,212,0)' },\n                ]),\n              },\n              z: -12,\n              data: lineData,\n            },\n            {\n              name: 'dotted',\n              type: 'pictorialBar',\n              symbol: 'rect',\n              itemStyle: {\n                color: '#0f375f',\n              },\n              symbolRepeat: true,\n              symbolSize: [12, 4],\n              symbolMargin: 1,\n              z: -10,\n              data: lineData,\n            },\n          ],\n        });\n      });\n      return { chartRef };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/charts/Map.vue",
    "content": "<template>\n  <div ref=\"chartRef\" :style=\"{ height, width }\"></div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, ref, Ref, onMounted } from 'vue';\n\n  import { useECharts } from '/@/hooks/web/useECharts';\n  import { mapData } from './data';\n  import { registerMap } from 'echarts';\n\n  export default defineComponent({\n    props: {\n      width: {\n        type: String as PropType<string>,\n        default: '100%',\n      },\n      height: {\n        type: String as PropType<string>,\n        default: 'calc(100vh - 78px)',\n      },\n    },\n    setup() {\n      const chartRef = ref<HTMLDivElement | null>(null);\n      const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);\n\n      onMounted(async () => {\n        const json = (await (await import('./china.json')).default) as any;\n        registerMap('china', json);\n        setOptions({\n          visualMap: [\n            {\n              min: 0,\n              max: 1000,\n              left: 'left',\n              top: 'bottom',\n              text: ['高', '低'],\n              calculable: false,\n              orient: 'horizontal',\n              inRange: {\n                color: ['#e0ffff', '#006edd'],\n                symbolSize: [30, 100],\n              },\n            },\n          ],\n          tooltip: {\n            trigger: 'item',\n            backgroundColor: 'rgba(0, 0, 0, .6)',\n            textStyle: {\n              color: '#fff',\n              fontSize: 12,\n            },\n          },\n          series: [\n            {\n              name: 'iphone4',\n              type: 'map',\n              map: 'china',\n              label: {\n                show: true,\n                color: 'rgb(249, 249, 249)',\n                fontSize: 10,\n              },\n              itemStyle: {\n                areaColor: '#2f82ce',\n                borderColor: '#0DAAC1',\n              },\n              data: mapData,\n            },\n          ],\n        });\n      });\n      return { chartRef };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/charts/Pie.vue",
    "content": "<template>\n  <div ref=\"chartRef\" :style=\"{ height, width }\"></div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, PropType, ref, Ref, onMounted } from 'vue';\n\n  import { useECharts } from '/@/hooks/web/useECharts';\n\n  export default defineComponent({\n    props: {\n      width: {\n        type: String as PropType<string>,\n        default: '100%',\n      },\n      height: {\n        type: String as PropType<string>,\n        default: 'calc(100vh - 78px)',\n      },\n    },\n    setup() {\n      const chartRef = ref<HTMLDivElement | null>(null);\n      const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);\n      const dataAll = [389, 259, 262, 324, 232, 176, 196, 214, 133, 370];\n      const yAxisData = ['原因1', '原因2', '原因3', '原因4', '原因5', '原因6', '原因7', '原因8', '原因9', '原因10'];\n      onMounted(() => {\n        setOptions({\n          backgroundColor: '#0f375f',\n          title: [\n            {\n              text: '各渠道投诉占比',\n              left: '2%',\n              top: '1%',\n              textStyle: {\n                color: '#fff',\n                fontSize: 14,\n              },\n            },\n            {\n              text: '投诉原因TOP10',\n              left: '40%',\n              top: '1%',\n              textStyle: {\n                color: '#fff',\n                fontSize: 14,\n              },\n            },\n            {\n              text: '各级别投诉占比',\n              left: '2%',\n              top: '50%',\n              textStyle: {\n                color: '#fff',\n                fontSize: 14,\n              },\n            },\n          ],\n          grid: [{ left: '50%', top: '7%', width: '45%', height: '90%' }],\n          tooltip: {\n            formatter: '{b} ({c})',\n          },\n          xAxis: [\n            {\n              gridIndex: 0,\n              axisTick: { show: false },\n              axisLabel: { show: false },\n              splitLine: { show: false },\n              axisLine: { show: false },\n            },\n          ],\n          yAxis: [\n            {\n              gridIndex: 0,\n              interval: 0,\n              data: yAxisData.reverse(),\n              axisTick: { show: false },\n              axisLabel: { show: true },\n              splitLine: { show: false },\n              axisLine: { show: true, lineStyle: { color: '#6173a3' } },\n            },\n          ],\n          series: [\n            {\n              name: '各渠道投诉占比',\n              type: 'pie',\n              radius: '30%',\n              center: ['22%', '25%'],\n              data: [\n                { value: 335, name: '客服电话' },\n                { value: 310, name: '奥迪官网' },\n                { value: 234, name: '媒体曝光' },\n                { value: 135, name: '质检总局' },\n                { value: 105, name: '其他' },\n              ],\n              labelLine: { show: false },\n              label: {\n                show: true,\n                formatter: '{b} \\n ({d}%)',\n                color: '#B1B9D3',\n              },\n            },\n            {\n              name: '各级别投诉占比',\n              type: 'pie',\n              radius: '30%',\n              center: ['22%', '75%'],\n              labelLine: { show: false },\n              data: [\n                { value: 335, name: 'A级' },\n                { value: 310, name: 'B级' },\n                { value: 234, name: 'C级' },\n                { value: 135, name: 'D级' },\n              ],\n              label: {\n                show: true,\n                formatter: '{b} \\n ({d}%)',\n                color: '#B1B9D3',\n              },\n            },\n            {\n              name: '投诉原因TOP10',\n              type: 'bar',\n              xAxisIndex: 0,\n              yAxisIndex: 0,\n              barWidth: '45%',\n              itemStyle: { color: '#86c9f4' },\n              label: { show: true, position: 'right', color: '#9EA7C4' },\n              data: dataAll.sort(),\n            },\n          ],\n        });\n      });\n      return { chartRef };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/charts/SaleRadar.vue",
    "content": "<template>\n  <Card title=\"销售统计\" :loading=\"loading\">\n    <div ref=\"chartRef\" :style=\"{ width, height }\"></div>\n  </Card>\n</template>\n<script lang=\"ts\">\n  import type { Ref } from 'vue';\n  import { defineComponent, ref, watch } from 'vue';\n  import { Card } from 'ant-design-vue';\n  import { useECharts } from '/@/hooks/web/useECharts';\n\n  export default defineComponent({\n    components: { Card },\n    props: {\n      loading: Boolean,\n      width: {\n        type: String as PropType<string>,\n        default: '100%',\n      },\n      height: {\n        type: String as PropType<string>,\n        default: '400px',\n      },\n    },\n    setup(props) {\n      const chartRef = ref<HTMLDivElement | null>(null);\n      const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);\n      watch(\n        () => props.loading,\n        () => {\n          if (props.loading) {\n            return;\n          }\n          setOptions({\n            legend: {\n              bottom: 0,\n              data: ['Visits', 'Sales'],\n            },\n            tooltip: {},\n            radar: {\n              radius: '60%',\n              splitNumber: 8,\n              indicator: [\n                {\n                  name: '2017',\n                },\n                {\n                  name: '2017',\n                },\n                {\n                  name: '2018',\n                },\n                {\n                  name: '2019',\n                },\n                {\n                  name: '2020',\n                },\n                {\n                  name: '2021',\n                },\n              ],\n            },\n            series: [\n              {\n                type: 'radar' as 'custom',\n                symbolSize: 0,\n                areaStyle: {\n                  shadowBlur: 0,\n                  shadowColor: 'rgba(0,0,0,.2)',\n                  shadowOffsetX: 0,\n                  shadowOffsetY: 10,\n                  opacity: 1,\n                },\n                data: [\n                  {\n                    value: [90, 50, 86, 40, 50, 20],\n                    name: 'Visits',\n                    itemStyle: {\n                      color: '#9f8ed7',\n                    },\n                  },\n                  {\n                    value: [70, 75, 70, 76, 20, 85],\n                    name: 'Sales',\n                    itemStyle: {\n                      color: '#1edec5',\n                    },\n                  },\n                ],\n              },\n            ],\n          });\n        },\n        { immediate: true }\n      );\n      return { chartRef };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/charts/china.json",
    "content": "{\n  \"type\": \"FeatureCollection\",\n  \"features\": [\n    {\n      \"type\": \"Feature\",\n      \"id\": \"710000\",\n      \"properties\": {\n        \"id\": \"710000\",\n        \"cp\": [121.509062, 24.044332],\n        \"name\": \"台湾\",\n        \"childNum\": 6\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\"@@°Ü¯Û\"],\n          [\"@@ƛĴÕƊÉɼģºðʀ\\\\ƎsÆNŌÔĚänÜƤɊĂǀĆĴĤǊŨxĚĮǂƺòƌâÔ®ĮXŦţƸZûÐƕƑGđ¨ĭMó·ęcëƝɉlÝƯֹÅŃ^Ó·śŃǋƏďíåɛGɉ¿@ăƑ¥ĘWǬÏĶŁâ\"],\n          [\"@@\\\\p|WoYG¿¥Ij@¢\"],\n          [\"@@¡@V^RqBbAnTXeRz¤L«³I\"],\n          [\"@@ÆEEkWqë @\"],\n          [\"@@fced\"],\n          [\"@@¯ɜÄèaì¯ØǓIġĽ\"],\n          [\"@@çûĖëĄhòř \"]\n        ],\n        \"encodeOffsets\": [\n          [[122886, 24033]],\n          [[123335, 22980]],\n          [[122375, 24193]],\n          [[122518, 24117]],\n          [[124427, 22618]],\n          [[124862, 26043]],\n          [[126259, 26318]],\n          [[127671, 26683]]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"130000\",\n      \"properties\": {\n        \"id\": \"130000\",\n        \"cp\": [114.502461, 38.045474],\n        \"name\": \"河北\",\n        \"childNum\": 3\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\"@@o~Z]ªrºc_ħ²G¼s`jÎŸnüsÂłNX_M`Ç½ÓnUKĜēs¤­©yrý§uģcJe\"],\n          [\"@@U`Ts¿mÂ\"],\n          [\n            \"@@oºƋÄdeVDJj£J|ÅdzÂFt~KŨ¸IÆv|¢r}èonb}`RÎÄn°ÒdÞ²^®lnÐèĄlðÓ×]ªÆ}LiĂ±Ö`^°Ç¶p®đDcŋ`ZÔ¶êqvFÆN®ĆTH®¦O¾IbÐã´BĐɢŴÆíȦpĐÞXR·nndO¤OÀĈƒ­QgµFo|gȒęSWb©osx|hYhgŃfmÖĩnºTÌSp¢dYĤ¶UĈjlǐpäìë|³kÛfw²Xjz~ÂqbTÑěŨ@|oMzv¢ZrÃVw¬ŧĖ¸f°ÐTªqs{S¯r æÝlNd®²Ğ ǆiGĘJ¼lr}~K¨ŸƐÌWöÆzR¤lêmĞLÎ@¡|q]SvKÑcwpÏÏĿćènĪWlĄkT}J¤~ÈTdpddʾĬBVtEÀ¢ôPĎƗè@~kü\\\\rÊĔÖæW_§¼F´©òDòjYÈrbĞāøŀG{ƀ|¦ðrb|ÀH`pʞkvGpuARhÞÆǶgĘTǼƹS£¨¡ù³ŘÍ]¿ÂyôEP xX¶¹ÜO¡gÚ¡IwÃé¦ÅBÏ|Ç°N«úmH¯âDùyŜŲIÄuĐ¨D¸dɂFOhđ©OiÃ`ww^ÌkÑH«ƇǤŗĺtFu{Z}Ö@U´ʚLg®¯Oı°Ãw ^VbÉsmAê]]w§RRl£ȭµu¯b{ÍDěïÿȧuT£ġěŗƃĝQ¨fVƋƅn­a@³@ďyÃ½IĹÊKŭfċŰóxV@tƯJ]eR¾fe|rHA|h~Ėƍl§ÏlTíb ØoÅbbx³^zÃĶ¶Sj®AyÂhðk`«PËµEFÛ¬Y¨Ļrõqi¼Wi°§Ð±´°^[À|ĠO@ÆxO\\\\ta\\\\tĕtû{ġȧXýĪÓjùÎRb^ÎfK[ÝděYfíÙTyuUSyŌŏů@Oi½éŅ­aVcř§ax¹XŻácWU£ôãºQ¨÷Ñws¥qEHÙ|šYQoŕÇyáĂ£MÃ°oťÊP¡mWO¡v{ôvîēÜISpÌhp¨ jdeŔQÖjX³àĈ[n`Yp@UcM`RKhEbpŞlNut®EtqnsÁgAiúoHqCXhfgu~ÏWP½¢G^}¯ÅīGCÑ^ãziMáļMTÃƘrMc|O_¯Ŏ´|morDkO\\\\mĆJfl@cĢ¬¢aĦtRıÒ¾ùƀ^juųœK­UFyƝīÛ÷ąV×qƥV¿aȉd³BqPBmaËđŻģmÅ®V¹d^KKonYg¯XhqaLdu¥Ípǅ¡KąÅkĝęěhq}HyÃ]¹ǧ£Í÷¿qáµ§g¤o^á¾ZE¤i`ĳ{nOl»WÝĔįhgF[¿¡ßkOüš_ūiǱàUtėGyl}ÓM}jpEC~¡FtoQiHkk{Ãmï\"\n          ]\n        ],\n        \"encodeOffsets\": [[[119712, 40641]], [[121616, 39981]], [[116462, 37237]]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"140000\",\n      \"properties\": {\n        \"id\": \"140000\",\n        \"cp\": [111.849248, 36.857014],\n        \"name\": \"山西\",\n        \"childNum\": 1\n      },\n      \"geometry\": {\n        \"type\": \"Polygon\",\n        \"coordinates\": [\n          \"@@ÞĩÒSra}ÁyWix±Üe´lèßÓǏokćiµVZģ¡coTSË¹ĪmnÕńehZg{gtwªpXaĚThȑp{¶Eh®RćƑP¿£Pmc¸mQÝWďȥoÅîɡųAďä³aÏJ½¥PG­ąSM­EÅruµéYÓŌ_dĒCo­Èµ]¯_²ÕjāK~©ÅØ^ÔkïçămÏk]­±cÝ¯ÑÃmQÍ~_apm~ç¡qu{JÅŧ·Ls}EyÁÆcI{¤IiCfUcƌÃp§]ě«vD@¡SÀµMÅwuYY¡DbÑc¡h×]nkoQdaMç~eDÛtT©±@¥ù@É¡ZcW|WqOJmĩl«ħşvOÓ«IqăV¥D[mI~Ó¢cehiÍ]Ɠ~ĥqX·eƷn±}v[ěďŕ]_œ`¹§ÕōIo©b­s^}Ét±ū«³p£ÿ·Wµ|¡¥ăFÏs×¥ŅxÊdÒ{ºvĴÎêÌɊ²¶ü¨|ÞƸµȲLLúÉƎ¤ϊęĔV`_bªS^|dzY|dz¥pZbÆ£¶ÒK}tĦÔņƠPYznÍvX¶Ěn ĠÔzý¦ª÷ÑĸÙUȌ¸dòÜJð´ìúNM¬XZ´¤ŊǸ_tldI{¦ƀðĠȤ¥NehXnYGR° ƬDj¬¸|CĞKqºfƐiĺ©ª~ĆOQª ¤@ìǦɌ²æBÊTŸʂōĖĴŞȀÆÿȄlŤĒötÎ½î¼ĨXh|ªM¤Ðz\"\n        ],\n        \"encodeOffsets\": [[116874, 41716]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"150000\",\n      \"properties\": {\n        \"id\": \"150000\",\n        \"cp\": [111.670801, 41.818311],\n        \"name\": \"内蒙古\",\n        \"childNum\": 2\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            \"@@¯PqFB|S³C|kñHdiÄ¥sŉÅPóÑÑE^ÅPpy_YtShQ·aHwsOnŉÃs©iqjUSiº]ïW«gW¡ARë¥_sgÁnUI«m]jvV¼euhwqAaW_µj»çjioQR¹ēÃßt@r³[ÛlćË^ÍÉáGOUÛOB±XkÅ¹£k|e]olkVÍ¼ÕqtaÏõjgÁ£§U^RLËnX°ÇBz^~wfvypV ¯ƫĉ˭ȫƗŷɿÿĿƑ˃ĝÿÃǃßËőó©ǐȍŒĖM×ÍEyxþp]ÉvïèvƀnÂĴÖ@V~Ĉv¦wĖtējyÄDXÄxGQuv_i¦aBçw˛wD©{tāmQ{EJ§KPśƘƿ¥@sCTÉ}ɃwƇy±gÑ}T[÷kÐç¦«SÒ¥¸ëBX½HáÅµÀğtSÝÂa[ƣ°¯¦Pï¡]£ġÒk®G²èQ°óMq}EóƐÇ\\\\@áügQÍu¥FTÕ¿Jû]|mvāÎYua^WoÀa·­ząÒot×¶CLƗi¯¤mƎHǊ¤îìɾŊìTdåwsRÖgĒųúÍġäÕ}Q¶¿A[¡{d×uQAMxVvMOmăl«ct[wº_ÇÊjbÂ£ĦS_éQZ_lwgOiýe`YYLq§IÁǳ£ÙË[ÕªuƏ³ÍTs·bÁĽäė[b[ŗfãcn¥îC¿÷µ[ŏÀQ­ōĉm¿Á^£mJVmL[{Ï_£F¥Ö{ŹA}×Wu©ÅaųĳƳhB{·TQqÙIķËZđ©Yc|M¡LeVUóK_QWk_ĥ¿ãZ»X\\\\ĴuUèlG®ěłTĠğDŃOrÍdÆÍz]±ŭ©Å]ÅÐ}UË¥©TċïxgckfWgi\\\\ÏĒ¥HkµEë{»ÏetcG±ahUiñiWsɁ·cCÕk]wȑ|ća}wVaĚá G°ùnM¬¯{ÈÐÆA¥ÄêJxÙ¢hP¢ÛºµwWOóFÁz^ÀŗÎú´§¢T¤ǻƺSėǵhÝÅQgvBHouʝl_o¿Ga{ïq{¥|ſĿHĂ÷aĝÇqZñiñC³ª»E`¨åXēÕqÉû[l}ç@čƘóO¿¡FUsAʽīccocÇS}£IS~ălkĩXçmĈŀÐoÐdxÒuL^T{r@¢ÍĝKén£kQyÅõËXŷƏL§~}kq»IHėǅjĝ»ÑÞoå°qTt|r©ÏS¯·eŨĕx«È[eM¿yupN~¹ÏyN£{©għWí»Í¾səšǅ_ÃĀɗ±ąĳĉʍŌŷSÉA±åǥɋ@ë£R©ąP©}ĹªƏj¹erLDĝ·{i«ƫC£µsKCGS|úþXgp{ÁX¿ć{ƱȏñZáĔyoÁhA}ŅĆfdŉ_¹Y°ėǩÑ¡H¯¶oMQqð¡Ë|Ñ`ƭŁX½·óÛxğįÅcQs«tȋǅFù^it«Č¯[hAi©á¥ÇĚ×l|¹y¯YȵƓñǙµïċĻ|Düȭ¶¡oŽäÕG\\\\ÄT¿Òõr¯LguÏYęRƩɷŌO\\\\İÐ¢æ^Ŋ ĲȶȆbÜGĝ¬¿ĚVĎgª^íu½jÿĕęjık@Ľ]ėl¥ËĭûÁėéV©±ćn©­ȇÍq¯½YÃÔŉÉNÑÅÝy¹NqáʅDǡËñ­ƁYÅy̱os§ȋµʽǘǏƬɱàưN¢ƔÊuľýľώȪƺɂļxZĈ}ÌŉŪĺœĭFЛĽ̅ȣͽÒŵìƩÇϋÿȮǡŏçƑůĕ~Ç¼ȳÐUfdIxÿ\\\\G zâɏÙOº·pqy£@qþ@Ǟ˽IBäƣzsÂZÁàĻdñ°ŕzéØűzșCìDȐĴĺf®Àľưø@ɜÖÞKĊŇƄ§͑těï͡VAġÑÑ»d³öǍÝXĉĕÖ{þĉu¸ËʅğU̎éhɹƆ̗̮ȘǊ֥ड़ࡰţાíϲäʮW¬®ҌeרūȠkɬɻ̼ãüfƠSצɩςåȈHϚÎKǳͲOðÏȆƘ¼CϚǚ࢚˼ФÔ¤ƌĞ̪Qʤ´¼mȠJˀƲÀɠmǐnǔĎȆÞǠN~ʢĜ¶ƌĆĘźʆȬ˪ĚĒ¸ĞGȖƴƀj`ĢçĶāàŃºēĢĖćYÀŎüôQÐÂŎŞǆŞêƖoˆDĤÕºÑǘÛˤ³̀gńƘĔÀ^ªƂ`ªt¾äƚêĦĀ¼ÐĔǎ¨Ȕ»͠^ˮÊȦƤøxRrŜH¤¸ÂxDÄ|ø˂˜ƮÐ¬ɚwɲFjĔ²Äw°ǆdÀÉ_ĸdîàŎjÊêTĞªŌŜWÈ|tqĢUB~´°ÎFCU¼pĀēƄN¦¾O¶łKĊOjĚj´ĜYp{¦SĚÍ\\\\T×ªV÷Ší¨ÅDK°ßtŇĔK¨ǵÂcḷ̌ĚǣȄĽFlġUĵŇȣFʉɁMğįʏƶɷØŭOǽ«ƽū¹Ʊő̝Ȩ§ȞʘĖiɜɶʦ}¨֪ࠜ̀ƇǬ¹ǨE˦ĥªÔêFxúQEr´Wrh¤Ɛ \\\\talĈDJÜ|[Pll̚¸ƎGú´P¬W¦^¦H]prRn|or¾wLVnÇIujkmon£cX^Bh`¥V¦U¤¸}xRj[^xN[~ªxQ[`ªHÆÂExx^wN¶Ê|¨ìMrdYpoRzNyÀDs~bcfÌ`L¾n|¾T°c¨È¢ar¤`[|òDŞĔöxElÖdHÀI`Ď\\\\Àì~ÆR¼tf¦^¢ķ¶eÐÚMptgjɡČÅyġLûŇV®ÄÈƀĎ°P|ªVVªj¬ĚÒêp¬E|ŬÂc|ÀtƐK f{ĘFĒƌXƲąo½Ę\\\\¥o}Ûu£ç­kX{uĩ«āíÓUŅßŢqŤ¥lyň[oi{¦LńðFȪȖĒL¿Ìf£K£ʺoqNwğc`uetOj×°KJ±qÆġmĚŗos¬qehqsuH{¸kH¡ÊRǪÇƌbȆ¢´äÜ¢NìÉʖ¦â©Ġu¦öČ^â£ĂhĖMÈÄw\\\\fŦ°W ¢¾luŸDw\\\\̀ʉÌÛMĀ[bÓEn}¶Vcês\"\n          ]\n        ],\n        \"encodeOffsets\": [[[129102, 52189]]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"210000\",\n      \"properties\": {\n        \"id\": \"210000\",\n        \"cp\": [123.429096, 41.796767],\n        \"name\": \"辽宁\",\n        \"childNum\": 16\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\"@@L@@sa\"],\n          [\"@@MnNm\"],\n          [\"@@dc\"],\n          [\"@@eÀC@b\"],\n          [\"@@fXwkbrÄ`qg\"],\n          [\"@@^jtWQ\"],\n          [\"@@~ Y]c\"],\n          [\"@@G`ĔN^_¿ZÃM\"],\n          [\"@@iX¶BY\"],\n          [\"@@YZ\"],\n          [\"@@L_{Epf\"],\n          [\"@@^WqCT\\\\\"],\n          [\"@@\\\\[§t|¤_\"],\n          [\"@@m`n_\"],\n          [\"@@Ïxǌ{q_×^Giip\"],\n          [\n            \"@@@é^BntaÊU]x ¯ÄPĲ­°hʙK³VÕ@Y~|EvĹsÇ¦­L^pÃ²ŸÒG Ël]xxÄ_fT¤Ď¤cPC¨¸TVjbgH²sdÎdHt`B²¬GJję¶[ÐhjeXdlwhðSČ¦ªVÊÏÆZÆŶ®²^ÎyÅÎcPqńĚDMħĜŁH­kçvV[ĳ¼WYÀäĦ`XlR`ôLUVfK¢{NZdĒªYĸÌÚJRr¸SA|ƴgŴĴÆbvªØX~źB|¦ÕE¤Ð`\\\\|KUnnI]¤ÀÂĊnŎR®Ő¿¶\\\\ÀøíDm¦ÎbŨabaĘ\\\\ľãÂ¸atÎSƐ´©v\\\\ÖÚÌǴ¤Â¨JKrZ_ZfjþhPkx`YRIjJcVf~sCN¤ EhæmsHy¨SðÑÌ\\\\\\\\ĐRZk°IS§fqŒßýáĞÙÉÖ[^¯ǤŲê´\\\\¦¬ĆPM¯£»uïpùzExanµyoluqe¦W^£ÊL}ñrkqWňûPUP¡ôJoo·U}£[·¨@XĸDXm­ÛÝºGUCÁª½{íĂ^cjk¶Ã[q¤LÉö³cux«zZf²BWÇ®Yß½ve±ÃCý£W{Ú^q^sÑ·¨ÍOt¹·C¥GDrí@wÕKţÃ«V·i}xËÍ÷i©ĝɝǡ]{c±OW³Ya±_ç©HĕoƫŇqr³Lys[ñ³¯OSďOMisZ±ÅFC¥Pq{Ã[Pg}\\\\¿ghćOk^ģÁFıĉĥM­oEqqZûěŉ³F¦oĵhÕP{¯~TÍlªNßYÐ{Ps{ÃVUeĎwk±ŉVÓ½ŽJãÇÇ»Jm°dhcÀffdF~ĀeĖd`sx² ®EżĀdQÂd^~ăÔH¦\\\\LKpĄVez¤NP ǹÓRÆąJSh­a[¦´ÂghwmBÐ¨źhI|VV|p] Â¼èNä¶ÜBÖ¼L`¼bØæKVpoúNZÞÒKxpw|ÊEMnzEQIZZNBčÚFÜçmĩWĪñtÞĵÇñZ«uD±|Əlĳ¥ãn·±PmÍada CLǑkùó¡³Ï«QaċÏOÃ¥ÕđQȥċƭy³ÃA\"\n          ]\n        ],\n        \"encodeOffsets\": [\n          [[123686, 41445]],\n          [[126019, 40435]],\n          [[124393, 40128]],\n          [[126117, 39963]],\n          [[125322, 40140]],\n          [[126686, 40700]],\n          [[126041, 40374]],\n          [[125584, 40168]],\n          [[125453, 40165]],\n          [[125362, 40214]],\n          [[125280, 40291]],\n          [[125774, 39997]],\n          [[125976, 40496]],\n          [[125822, 39993]],\n          [[125509, 40217]],\n          [[122731, 40949]]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"220000\",\n      \"properties\": { \"id\": \"220000\", \"cp\": [125.3245, 43.886841], \"name\": \"吉林\", \"childNum\": 1 },\n      \"geometry\": {\n        \"type\": \"Polygon\",\n        \"coordinates\": [\n          \"@@pä³PClFbbÍzwBGĭZÅi»lY­ċ²SgkÇ£^Sqd¯R©é£¯S\\\\cZ¹iűƏCuƍÓXoR}M^o£R}oªU­FuuXHlEÅÏ©¤ÛmTþ¤D²ÄufàÀ­XXÈ±AeyYw¬dvõ´KÊ£\\\\rµÄlidā]|î©¾DÂVH¹Þ®ÜWnCķ W§@\\\\¸~¤Vp¸póIO¢VOŇürXql~òÉK]¤¥Xrfkvzpm¶bwyFoúvð¼¤ N°ąO¥«³[éǡű_°Õ\\\\ÚÊĝþâőàerR¨­JYlďQ[ ÏYëÐ§TGztnß¡gFkMāGÁ¤ia ÉÈ¹`\\\\xs¬dĆkNnuNUuP@vRY¾\\\\¢GªóĄ~RãÖÎĢùđŴÕhQxtcæëSɽŉíëǉ£ƍG£nj°KƘµDsØÑpyĆ¸®¿bXp]vbÍZuĂ{n^IüÀSÖ¦EvRÎûh@â[ƏÈô~FNr¯ôçR±­HÑlĢ^¤¢OðævxsŒ]ÞÁTĠs¶¿âÆGW¾ìA¦·TÑ¬è¥ÏÐJ¨¼ÒÖ¼ƦɄxÊ~StD@Ă¼Ŵ¡jlºWvÐzƦZÐ²CH AxiukdGgetqmcÛ£Ozy¥cE}|¾cZk¿uŐã[oxGikfeäT@SUwpiÚFM©£è^Ú`@v¶eňf heP¶täOlÃUgÞzŸU`l}ÔÆUvØ_Ō¬Öi^ĉi§²ÃB~¡ĈÚEgc|DC_Ȧm²rBx¼MÔ¦ŮdĨÃâYxƘDVÇĺĿg¿cwÅ\\\\¹¥Yĭl¤OvLjM_a W`zļMž·\\\\swqÝSAqŚĳ¯°kRē°wx^ĐkǂÒ\\\\]nrĂ}²ĊŲÒøãh·M{yMzysěnĒġV·°G³¼XÀ¤¹i´o¤ŃÈ`ÌǲÄUĞd\\\\iÖmÈBĤÜɲDEh LG¾ƀÄ¾{WaYÍÈĢĘÔRîĐj}ÇccjoUb½{h§Ǿ{KƖµÎ÷GĀÖŠåưÎs­lyiē«`å§H¥Ae^§GK}iã\\\\c]v©ģZmÃ|[M}ģTɟĵÂÂ`ÀçmFK¥ÚíÁbX³ÌQÒHof{]ept·GŋĜYünĎųVY^ydõkÅZW«WUa~U·SbwGçǑiW^qFuNĝ·EwUtW·Ýďæ©PuqEzwAVXRãQ`­©GMehccďÏd©ÑW_ÏYƅ»é\\\\ɹ~ǙG³mØ©BšuT§Ĥ½¢Ã_Ã½L¡ýqT^rme\\\\PpZZbyuybQefµ]UhĿDCmûvaÙNSkCwncćfv~YÇG\"\n        ],\n        \"encodeOffsets\": [[130196, 42528]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"230000\",\n      \"properties\": {\n        \"id\": \"230000\",\n        \"cp\": [128.642464, 46.756967],\n        \"name\": \"黑龙江\",\n        \"childNum\": 2\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            \"@@UµNÿ¥īèçHÍøƕ¶Lǽ|g¨|a¾pVidd~ÈiíďÓQġėÇZÎXb½|ſÃH½KFgɱCģÛÇAnjÕc[VĝǱÃËÇ_ £ń³pj£º¿»WH´¯U¸đĢmtĜyzzNN|g¸÷äűÑ±ĉā~mq^[ǁÑďlw]¯xQĔ¯l°řĴrBÞTxr[tŽ¸ĻN_yX`biNKuP£kZĮ¦[ºxÆÀdhĹŀUÈƗCwáZħÄŭcÓ¥»NAw±qȥnD`{ChdÙFć}¢A±Äj¨]ĊÕjŋ«×`VuÓÅ~_kŷVÝyhVkÄãPsOµfgeŇµf@u_Ù ÙcªNªÙEojVxT@ãSefjlwH\\\\pŏäÀvlY½d{F~¦dyz¤PÜndsrhfHcvlwjF£G±DÏƥYyÏu¹XikĿ¦ÏqƗǀOŜ¨LI|FRĂn sª|C˜zxAè¥bfudTrFWÁ¹Am|ĔĕsķÆF´N}ćUÕ@Áĳſmuçuð^ÊýowFzØÎĕNőǏȎôªÌŒǄàĀÄ˄ĞŀƒʀĀƘŸˮȬƬĊ°Uzouxe]}AyÈW¯ÌmKQ]Īºif¸ÄX|sZt|½ÚUÎ lk^p{f¤lºlÆW A²PVÜPHÊâ]ÎĈÌÜk´\\\\@qàsĔÄQºpRij¼èi`¶bXrBgxfv»uUi^v~J¬mVp´£´VWrnP½ì¢BX¬hðX¹^TjVriªjtŊÄmtPGx¸bgRsT`ZozÆO]ÒFôÒOÆŊvÅpcGêsx´DR{AEOr°x|íb³Wm~DVjºéNNËÜ˛ɶ­GxŷCSt}]ûōSmtuÇÃĕNāg»íT«u}ç½BĵÞʣ¥ëÊ¡MÛ³ãȅ¡ƋaǩÈÉQG¢·lG|tvgrrf«ptęŘnÅĢrI²¯LiØsPf_vĠdxM prʹL¤¤eËÀđKïÙVY§]Ióáĥ]ķK¥j|pŇ\\\\kzţ¦šnņäÔVĂîĪ¬|vW®l¤èØrxm¶ă~lÄƯĄ̈́öȄEÔ¤ØQĄĄ»ƢjȦOǺ¨ìSŖÆƬyQv`cwZSÌ®ü±Ǆ]ŀç¬B¬©ńzƺŷɄeeOĨSfm ĊƀP̎ēz©ĊÄÕÊmgÇsJ¥ƔŊśæÎÑqv¿íUOµªÂnĦÁ_½ä@êí£P}Ġ[@gġ}gɊ×ûÏWXá¢užƻÌsNÍ½ƎÁ§čŐAēeL³àydl¦ĘVçŁpśǆĽĺſÊQíÜçÛġÔsĕ¬Ǹ¯YßċġHµ ¡eå`ļrĉŘóƢFìĎWøxÊkƈdƬv|I|·©NqńRŀ¤éeŊŀàŀU²ŕƀBQ£Ď}L¹Îk@©ĈuǰųǨÚ§ƈnTËÇéƟÊcfčŤ^XmHĊĕË«W·ċëx³ǔķÐċJāwİ_ĸȀ^ôWr­°oú¬ĦŨK~ȰCĐ´Ƕ£fNÎèâw¢XnŮeÂÆĶ¾¾xäLĴĘlļO¤ÒĨA¢Êɚ¨®ØCÔ ŬGƠƦYĜĘÜƬDJg_ͥœ@čŅĻA¶¯@wÎqC½Ĉ»NăëKďÍQÙƫ[«ÃígßÔÇOÝáWñuZ¯ĥŕā¡ÑķJu¤E å¯°WKÉ±_d_}}vyõu¬ï¹ÓU±½@gÏ¿rÃ½DgCdµ°MFYxw¿CG£Rƛ½Õ{]L§{qqą¿BÇƻğëܭǊË|c²}Fµ}ÙRsÓpg±QNqǫŋRwŕnéÑÉK«SeYRŋ@{¤SJ}D Ûǖ֍]gr¡µŷjqWÛham³~S«Þ]\"\n          ]\n        ],\n        \"encodeOffsets\": [[[134456, 44547]]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"320000\",\n      \"properties\": {\n        \"id\": \"320000\",\n        \"cp\": [119.767413, 33.041544],\n        \"name\": \"江苏\",\n        \"childNum\": 1\n      },\n      \"geometry\": {\n        \"type\": \"Polygon\",\n        \"coordinates\": [\n          \"@@cþÅPi`ZRu¥É\\\\]~°Y`µÓ^phÁbnÀşúòaĬºTÖŒbe¦¦{¸ZâćNp©Hr|^mjhSEb\\\\afv`sz^lkljÄtg¤D­¾X¿À|ĐiZȀåB·î}GL¢õcßjayBFµÏC^ĭcÙt¿sğH]j{s©HM¢QnDÀ©DaÜÞ·jgàiDbPufjDk`dPOîhw¡ĥ¥GP²ĐobºrYî¶aHŢ´ ]´rılw³r_{£DB_Ûdåuk|Ũ¯F Cºyr{XFye³Þċ¿ÂkĭB¿MvÛpm`rÚã@Ę¹hågËÖƿxnlč¶Åì½Ot¾dJlVJĂǀŞqvnO^JZż·Q}êÍÅmµÒ]ƍ¦Dq}¬R^èĂ´ŀĻĊIÔtĲyQŐĠMNtR®òLhĚs©»}OÓGZz¶A\\\\jĨFäOĤHYJvÞHNiÜaĎÉnFQlNM¤B´ĄNöɂtpŬdfåqm¿QûùŞÚb¤uŃJŴu»¹ĄlȖħŴw̌ŵ²ǹǠ͛hĭłƕrçü±Yxcitğ®jű¢KOķCoy`å®VTa­_Ā]ŐÝɞï²ʯÊ^]afYǸÃĆēĪȣJđ͍ôƋÄÄÍīçÛɈǥ£­ÛmY`ó£Z«§°Ó³QafusNıǅ_k}¢m[ÝóDµ¡RLčiXyÅNïă¡¸iĔÏNÌŕoēdōîåŤûHcs}~Ûwbù¹£¦ÓCtOPrE^ÒogĉIµÛÅʹK¤½phMü`oæŀ\"\n        ],\n        \"encodeOffsets\": [[121740, 32276]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"330000\",\n      \"properties\": {\n        \"id\": \"330000\",\n        \"cp\": [120.153576, 29.287459],\n        \"name\": \"浙江\",\n        \"childNum\": 45\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\"@@E^dQ]K\"],\n          [\"@@jX^j\"],\n          [\"@@sfbU\"],\n          [\"@@qP\\\\xz[ck\"],\n          [\"@@R¢FX}°[s_\"],\n          [\"@@Cb\\\\}\"],\n          [\"@@e|v\\\\la{u\"],\n          [\"@@v~u}\"],\n          [\"@@QxÂF¯}\"],\n          [\"@@¹nvÞs¯o\"],\n          [\"@@rSkUEj\"],\n          [\"@@bi­ZP\"],\n          [\"@@p[}INf\"],\n          [\"@@À¿\"],\n          [\"@@¹dnb\"],\n          [\"@@rSBnR\"],\n          [\"@@g~h}\"],\n          [\"@@FlEk\"],\n          [\"@@OdPc\"],\n          [\"@@v[u\\\\\"],\n          [\"@@FjâL~wyoo~sµL\\\\\"],\n          [\"@@¬e¹aN\"],\n          [\"@@\\\\nÔ¡q]L³ë\\\\ÿ®QÖ\"],\n          [\"@@ÊA­©[¬\"],\n          [\"@@Kxv­\"],\n          [\"@@@hlIk]\"],\n          [\"@@pW{o||j\"],\n          [\"@@Md|_mC\"],\n          [\"@@¢X£ÏylD¼XtH\"],\n          [\"@@hlÜ[LykAvyfw^E¤\"],\n          [\"@@fp¤MusR\"],\n          [\"@@®_ma~LÁ¬Z\"],\n          [\"@@iMxZ\"],\n          [\"@@ZcYd\"],\n          [\"@@Z~dOSo|A¿qZv\"],\n          [\"@@@`EN¡v\"],\n          [\"@@|TY{\"],\n          [\"@@@n@m\"],\n          [\"@@XWkCT\\\\\"],\n          [\"@@ºwZRkĕWO¢\"],\n          [\"@@X®±GrÆª\\\\ÔáXq{\"],\n          [\"@@ůTG°ĄLHm°UC\"],\n          [\n            \"@@¤aÜx~}dtüGæţŎíĔcŖpMËÐjē¢·ðĄÆMzjWKĎ¢Q¶À_ê_Bıi«pZgf¤Nrq]§ĂN®«H±yƳí¾×ŸīàLłčŴǝĂíÀBŖÕªÁŖHŗŉåqûõi¨hÜ·ñt»¹ýv_[«¸mYL¯QªmĉÅdMgÇjcº«ę¬­K­´B«Âącoċ\\\\xKd¡gěŧ«®á[~ıxu·ÅKsËÉc¢Ù\\\\ĭƛëbf¹­ģSĜkáƉÔ­ĈZB{aMµfzŉfåÂŧįƋǝÊĕġć£g³ne­ą»@­¦S®\\\\ßðChiqªĭiAuA­µ_W¥ƣO\\\\lċĢttC¨£t`PZäuXßBsĻyekOđġĵHuXBµ]×­­\\\\°®¬F¢¾pµ¼kŘó¬Wät¸|@L¨¸µrºù³Ù~§WIZW®±Ð¨ÒÉx`²pĜrOògtÁZ}þÙ]¡FKwsPlU[}¦Rvn`hq¬\\\\nQ´ĘRWb_ rtČFIÖkĦPJ¶ÖÀÖJĈĄTĚòC ²@PúØz©Pî¢£CÈÚĒ±hŖl¬â~nm¨f©iļ«mntuÖZÜÄjL®EÌFª²iÊxØ¨IÈhhst\"\n          ],\n          [\"@@o\\\\VzRZ}y\"],\n          [\"@@@°¡mÛGĕ¨§Ianá[ýƤjfæØLäGr\"]\n        ],\n        \"encodeOffsets\": [\n          [[125592, 31553]],\n          [[125785, 31436]],\n          [[125729, 31431]],\n          [[125513, 31380]],\n          [[125223, 30438]],\n          [[125115, 30114]],\n          [[124815, 29155]],\n          [[124419, 28746]],\n          [[124095, 28635]],\n          [[124005, 28609]],\n          [[125000, 30713]],\n          [[125111, 30698]],\n          [[125078, 30682]],\n          [[125150, 30684]],\n          [[124014, 28103]],\n          [[125008, 31331]],\n          [[125411, 31468]],\n          [[125329, 31479]],\n          [[125626, 30916]],\n          [[125417, 30956]],\n          [[125254, 30976]],\n          [[125199, 30997]],\n          [[125095, 31058]],\n          [[125083, 30915]],\n          [[124885, 31015]],\n          [[125218, 30798]],\n          [[124867, 30838]],\n          [[124755, 30788]],\n          [[124802, 30809]],\n          [[125267, 30657]],\n          [[125218, 30578]],\n          [[125200, 30562]],\n          [[124968, 30474]],\n          [[125167, 30396]],\n          [[124955, 29879]],\n          [[124714, 29781]],\n          [[124762, 29462]],\n          [[124325, 28754]],\n          [[123990, 28459]],\n          [[125366, 31477]],\n          [[125115, 30363]],\n          [[125369, 31139]],\n          [[122495, 31878]],\n          [[125329, 30690]],\n          [[125192, 30787]]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"340000\",\n      \"properties\": { \"id\": \"340000\", \"cp\": [117.283042, 31.26119], \"name\": \"安徽\", \"childNum\": 3 },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\"@@^iuLX^\"],\n          [\"@@e©Ehl\"],\n          [\n            \"@@°ZÆëĎµmkǀwÌÕæhºgBĝâqÙĊzÖgņtÀÁĂÆáhEz|WzqD¹°Eŧl{ævÜcA`¤C`|´qxĲkq^³³GšµbíZ¹qpa±ď OH¦Ħx¢gPícOl_iCveaOjChß¸iÝbÛªCC¿mRV§¢A|t^iĠGÀtÚsd]ĮÐDE¶zAb àiödK¡~H¸íæAǿYj{ď¿À½W®£ChÃsikkly]_teu[bFaTign{]GqªoĈMYá|·¥f¥őaSÕėNµñĞ«Im_m¿Âa]uĜp Z_§{Cäg¤°r[_YjÆOdý[I[á·¥Q_nùgL¾mvˊBÜÆ¶ĊJhpc¹O]iŠ]¥ jtsggJÇ§w×jÉ©±EFË­KiÛÃÕYvsm¬njĻª§emná}k«ŕgđ²ÙDÇ¤í¡ªOy×Où±@DñSęćăÕIÕ¿IµĥOjNÕËT¡¿tNæŇàåyķrĕq§ÄĩsWÆßF¶X®¿mwRIÞfßoG³¾©uyHį{Ɓħ¯AFnuPÍÔzVdàôº^Ðæd´oG¤{S¬ćxã}ŧ×Kǥĩ«ÕOEÐ·ÖdÖsƘÑ¨[Û^Xr¢¼§xvÄÆµ`K§ tÒ´Cvlo¸fzŨð¾NY´ı~ÉĔēßúLÃÃ_ÈÏ|]ÂÏFlg`ben¾¢pUh~ƴĖ¶_r sĄ~cƈ]|r c~`¼{À{ȒiJjz`îÀT¥Û³]u}fïQl{skloNdjäËzDvčoQďHI¦rbtHĔ~BmlRV_ħTLnñH±DL¼Lªl§Ťa¸ĚlK²\\\\RòvDcÎJbt[¤D@®hh~kt°ǾzÖ@¾ªdbYhüóZ ň¶vHrľ\\\\ÊJuxAT|dmÀO[ÃÔG·ĚąĐlŪÚpSJ¨ĸLvÞcPæķŨ®mÐálwKhïgA¢ųÆ©Þ¤OÈm°K´\"\n          ]\n        ],\n        \"encodeOffsets\": [[[121722, 32278]], [[119475, 30423]], [[119168, 35472]]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"350000\",\n      \"properties\": {\n        \"id\": \"350000\",\n        \"cp\": [118.306239, 26.075302],\n        \"name\": \"福建\",\n        \"childNum\": 18\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\"@@zht´]\"],\n          [\"@@aj^~ĆG©O\"],\n          [\"@@ed¨C}}i\"],\n          [\"@@@vPGsQ\"],\n          [\"@@sBzddW]Q\"],\n          [\"@@S¨Q{\"],\n          [\"@@NVucW\"],\n          [\"@@qptBAq\"],\n          [\"@@¸[mu\"],\n          [\"@@Q\\\\pD]_\"],\n          [\"@@jSwUadpF\"],\n          [\"@@eXª~\"],\n          [\"@@AjvFso\"],\n          [\"@@fT_Çí\\\\v|ba¦jZÆy°\"],\n          [\"@@IjJi\"],\n          [\"@@wJIx«¼AoNe{M­\"],\n          [\"@@K±¡ÓČäeZ\"],\n          [\n            \"@@k¡¹Eh~c®wBkUplÀ¡I~Māe£bN¨gZý¡a±Öcp©PhI¢QqÇGj|¥U g[Ky¬ŏv@OptÉEF\\\\@ åA¬V{XģĐBycpě¼³Ăp·¤¥ohqqÚ¡ŅLs^Ã¡§qlÀhH¨MCe»åÇGD¥zPO£čÙkJA¼ßėuĕeûÒiÁŧSW¥Qûŗ½ùěcÝ§SùĩąSWó«íęACµeRåǃRCÒÇZÍ¢ź±^dlstjD¸ZpuÔâÃH¾oLUêÃÔjjēò´ĄWƛ^Ñ¥Ħ@ÇòmOw¡õyJyD}¢ďÑÈġfZda©º²z£NjD°Ötj¶¬ZSÎ~¾c°¶ÐmxO¸¢Pl´SL|¥AȪĖMņĲg®áIJČĒü` QF¬h|ĂJ@zµ |ê³È ¸UÖŬŬÀEttĸr]ðM¤ĶĲHtÏ AĬkvsq^aÎbvdfÊòSD´Z^xPsĂrvƞŀjJd×ŘÉ ®AÎ¦ĤdxĆqAZRÀMźnĊ»İÐZ YXæJyĊ²·¶q§·K@·{sXãô«lŗ¶»o½E¡­«¢±¨Y®Ø¶^AvWĶGĒĢPlzfļtàAvWYãO_¤sD§ssČġ[kƤPX¦`¶®BBvĪjv©jx[L¥àï[F¼ÍË»ğV`«Ip}ccÅĥZEãoP´B@D¸m±z«Ƴ¿å³BRØ¶Wlâþäą`]Z£Tc ĹGµ¶Hm@_©k¾xĨôȉðX«½đCIbćqK³ÁÄš¬OAwã»aLŉËĥW[ÂGIÂNxĳ¤D¢îĎÎB§°_JGs¥E@¤ućPåcuMuw¢BI¿]zG¹guĮck\\\\_\"\n          ]\n        ],\n        \"encodeOffsets\": [\n          [[123250, 27563]],\n          [[122541, 27268]],\n          [[123020, 27189]],\n          [[122916, 27125]],\n          [[122887, 26845]],\n          [[122808, 26762]],\n          [[122568, 25912]],\n          [[122778, 26197]],\n          [[122515, 26757]],\n          [[122816, 26587]],\n          [[123388, 27005]],\n          [[122450, 26243]],\n          [[122578, 25962]],\n          [[121255, 25103]],\n          [[120987, 24903]],\n          [[122339, 25802]],\n          [[121042, 25093]],\n          [[122439, 26024]]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"360000\",\n      \"properties\": {\n        \"id\": \"360000\",\n        \"cp\": [115.592151, 27.676493],\n        \"name\": \"江西\",\n        \"childNum\": 1\n      },\n      \"geometry\": {\n        \"type\": \"Polygon\",\n        \"coordinates\": [\n          \"@@ĢĨƐgļ¼ÂMD~ņªe^\\\\^§ý©j×cZØ¨zdÒa¶lÒJìõ`oz÷@¤uŞ¸´ôęöY¼HČƶajlÞƩ¥éZ[|h}^U  ¥pĄžƦO lt¸Æ Q\\\\aÆ|CnÂOjt­ĚĤdÈF`¶@Ðë ¦ōÒ¨SêvHĢûXD®QgÄWiØPÞìºr¤ǆNĠ¢lĄtZoCƞÔºCxrpĠV®Ê{f_Y`_eq®Aot`@oDXfkp¨|s¬\\\\DÄSfè©Hn¬^DhÆyøJhØxĢĀLÊƠPżċĄwȠĚ¦G®ǒĤäTŠÆ~Ħw«|TF¡nc³Ïå¹]ĉđxe{ÎÓvOEm°BƂĨİ|Gvz½ª´HàpeJÝQxnÀW­EµàXÅĪt¨ÃĖrÄwÀFÎ|ňÓMå¼ibµ¯»åDT±m[r«_gmQu~¥V\\\\OkxtL E¢Ú^~ýêPóqoě±_Êw§ÑªåƗā¼mĉŹ¿NQYBąrwģcÍ¥B­ŗÊcØiIƝĿuqtāwO]³YCñTeÉcaubÍ]trluīBÐGsĵıN£ï^ķqss¿FūūVÕ·´Ç{éĈýÿOER_đûIċâJh­ŅıNȩĕB¦K{Tk³¡OP·wnµÏd¯}½TÍ«YiµÕsC¯iM¤­¦¯P|ÿUHvhe¥oFTuõ\\\\OSsMòđƇiaºćXĊĵà·çhƃ÷Ç{ígu^đgm[×zkKN¶Õ»lčÓ{XSÆv©_ÈëJbVkĔVÀ¤P¾ºÈMÖxlò~ªÚàGĂ¢B±ÌKyáV¼Ã~­`gsÙfIƋlę¹e|~udjuTlXµf`¿Jd[\\\\L²\"\n        ],\n        \"encodeOffsets\": [[116689, 26234]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"370000\",\n      \"properties\": {\n        \"id\": \"370000\",\n        \"cp\": [118.000923, 36.275807],\n        \"name\": \"山东\",\n        \"childNum\": 13\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\"@@Xjd]{K\"],\n          [\"@@itbFHy\"],\n          [\"@@HlGk\"],\n          [\"@@TGy\"],\n          [\"@@K¬U\"],\n          [\"@@WdXc\"],\n          [\"@@PtOs\"],\n          [\"@@LnXhc\"],\n          [\"@@ppVu]Or\"],\n          [\"@@cdzAUa\"],\n          [\"@@udRhnCI\"],\n          [\"@@oIpR\"],\n          [\n            \"@@Ľč{fzƤîKÎMĮ]ZF½Y]â£ph¶¨râøÀÎǨ¤^ºÄGz~grĚĜlĞÆLĆǆ¢Îo¦cvKbgr°WhmZp L]LºcUÆ­nżĤÌĒbAnrOA´ȊcÀbƦUØrĆUÜøĬƞEzVL®öØBkŖÝĐĖ¹ŧ̄±ÀbÎÉnb²ĦhņBĖįĦåXćì@L¯´ywƕCéÃµė ƿ¸lµ¾Z|ZWyFY¨Mf~C¿`à_RÇzwƌfQnny´INoƬèôº|sTJULîVjǎ¾ĒØDz²XPn±ŴPè¸ŔLƔÜƺ_TüÃĤBBċÈöA´faM¨{«M`¶d¡ôÖ°mȰBÔjj´PM|c^d¤u¤Û´ä«ƢfPk¶Môl]Lb}su^ke{lCMrDÇ­]NÑFsmoõľHyGă{{çrnÓEƕZGª¹Fj¢ïWuøCǷë¡ąuhÛ¡^KxC`C\\\\bÅxì²ĝÝ¿_NīCȽĿåB¥¢·IŖÕy\\\\¹kxÃ£Č×GDyÃ¤ÁçFQ¡KtŵƋ]CgÏAùSedcÚźuYfyMmhUWpSyGwMPqŀÁ¼zK¶G­Y§Ë@´śÇµƕBm@IogZ¯uTMx}CVKï{éƵP_K«pÛÙqċtkkù]gTğwoɁsMõ³ăAN£MRkmEÊčÛbMjÝGuIZGPģãħE[iµBEuDPÔ~ª¼ęt]ûG§¡QMsğNPŏįzs£Ug{đJĿļā³]ç«Qr~¥CƎÑ^n¶ÆéÎR~Ż¸YI] PumŝrƿIā[xeÇ³L¯v¯s¬ÁY~}ťuŁgƋpÝĄ_ņī¶ÏSR´ÁP~¿Cyċßdwk´SsX|t`Ä ÈðAªìÎT°¦Dda^lĎDĶÚY°`ĪŴǒàŠv\\\\ebZHŖR¬ŢƱùęOÑM­³FÛWp[\"\n          ]\n        ],\n        \"encodeOffsets\": [\n          [[123806, 39303]],\n          [[123821, 39266]],\n          [[123742, 39256]],\n          [[123702, 39203]],\n          [[123649, 39066]],\n          [[123847, 38933]],\n          [[123580, 38839]],\n          [[123894, 37288]],\n          [[123043, 36624]],\n          [[123344, 38676]],\n          [[123522, 38857]],\n          [[123628, 38858]],\n          [[118260, 36742]]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"410000\",\n      \"properties\": {\n        \"id\": \"410000\",\n        \"cp\": [113.665412, 33.757975],\n        \"name\": \"河南\",\n        \"childNum\": 1\n      },\n      \"geometry\": {\n        \"type\": \"Polygon\",\n        \"coordinates\": [\n          \"@@ýLùµP³swIÓxcŢĞð´E®ÚPtĴXØxÂ¶@«ŕŕQGYfa[şußǩđš_X³ĳÕčC]kbc¥CS¯ëÍB©÷³­Si_}mYTt³xlàcČzÀD}ÂOQ³ÐTĨ¯ƗòËŖ[hłŦv~}ÂZ«¤lPÇ£ªÝŴÅR§ØnhctâknÏ­ľŹUÓÝdKuķI§oTũÙďkęĆH¸Ó\\\\Ä¿PcnS{wBIvÉĽ[GqµuŇôYgûZca©@½Õǽys¯}lgg@­C\\\\£asIdÍuCQñ[L±ęk·ţb¨©kK»KC²òGKmĨS`UQnk}AGēsqaJ¥ĐGRĎpCuÌy ã iMcplk|tRkðev~^´¦ÜSí¿_iyjI|ȑ|¿_»d}q^{Ƈdă}tqµ`Ƴĕg}V¡om½faÇo³TTj¥tĠRyK{ùÓjuµ{t}uËRivGçJFjµÍyqÎàQÂFewixGw½Yŷpµú³XU½ġyłåkÚwZX·l¢Á¢KzOÎÎjc¼htoDHr|­J½}JZ_¯iPq{tę½ĕ¦Zpĵø«kQĹ¤]MÛfaQpě±ǽ¾]u­Fu÷nčÄ¯ADp}AjmcEÇaª³o³ÆÍSƇĈÙDIzËčľ^KLiÞñ[aA²zzÌ÷D|[íÄ³gfÕÞd®|`Ć~oĠƑô³ŊD×°¯CsøÀ«ìUMhTº¨¸ǡîSÔDruÂÇZÖEvPZW~ØÐtĄE¢¦Ðy¸bô´oŬ¬²Ês~]®tªapŎJ¨Öº_Ŕ`Ŗ^Đ\\\\Ĝu~m²Ƹ¸fWĦrƔ}Î^gjdfÔ¡J}\\\\n C¦þWxªJRÔŠu¬ĨĨmFdM{\\\\d\\\\YÊ¢ú@@¦ª²SÜsC}fNècbpRmlØ^gd¢aÒ¢CZZxvÆ¶N¿¢T@uC¬^ĊðÄn|lGlRjsp¢ED}Fio~ÔN~zkĘHVsǲßjŬŢ`Pûàl¢\\\\ÀEhİgÞē X¼Pk|m\"\n        ],\n        \"encodeOffsets\": [[118256, 37017]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"420000\",\n      \"properties\": {\n        \"id\": \"420000\",\n        \"cp\": [113.298572, 30.684355],\n        \"name\": \"湖北\",\n        \"childNum\": 3\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\"@@AB\"],\n          [\"@@lskt\"],\n          [\n            \"@@¾«}{ra®pîÃ\\\\{øCËyyB±b\\\\òÝjKL ]ĎĽÌJyÚCƈćÎT´Å´pb©ÈdFin~BCo°BĎÃømv®E^vǾ½Ĝ²RobÜeN^ĺ£R¬lĶ÷YoĖ¥Ě¾|sOr°jY`~I¾®I{GqpCgyl{£ÍÍyPLÂ¡¡¸kWxYlÙæŁĢz¾V´W¶ùŸo¾ZHxjwfxGNÁ³Xéæl¶EièIH ujÌQ~v|sv¶Ôi|ú¢FhQsğ¦SiŠBgÐE^ÁÐ{čnOÂÈUÎóĔÊēĲ}Z³½Mŧïeyp·uk³DsÑ¨L¶_ÅuÃ¨w»¡WqÜ]\\\\Ò§tƗcÕ¸ÕFÏǝĉăxŻČƟOKÉġÿ×wg÷IÅzCg]m«ªGeçÃTC«[t§{loWeC@ps_Bp­rf_``Z|ei¡oċMqow¹DƝÓDYpûsYkıǃ}s¥ç³[§cY§HK«Qy]¢wwö¸ïx¼ņ¾Xv®ÇÀµRĠÐHM±cÏdƒǍũȅȷ±DSyúĝ£ŤĀàtÖÿï[îb\\\\}pĭÉI±Ñy¿³x¯No|¹HÏÛmjúË~TuęjCöAwě¬Rđl¯ Ñb­ŇTĿ_[IčĄʿnM¦ğ\\\\É[T·k¹©oĕ@A¾wya¥Y\\\\¥Âaz¯ãÁ¡k¥ne£ÛwE©Êō¶˓uoj_U¡cF¹­[WvP©whuÕyBF`RqJUw\\\\i¡{jEPïÿ½fćQÑÀQ{°fLÔ~wXgītêÝ¾ĺHd³fJd]HJ²EoU¥HhwQsƐ»Xmg±çve]DmÍPoCc¾_hhøYrŊU¶eD°Č_N~øĹĚ·`z]Äþp¼äÌQv\\\\rCé¾TnkžŐÚÜa¼ÝƆĢ¶ÛodĔňÐ¢JqPb ¾|J¾fXƐîĨ_Z¯À}úƲN_ĒÄ^ĈaŐyp»CÇÄKñL³ġM²wrIÒŭxjb[n«øæà ^²­h¯ÚŐªÞ¸Y²ĒVø}Ā^İ´LÚm¥ÀJÞ{JVųÞŃx×sxxƈē ģMřÚðòIfĊŒ\\\\Ʈ±ŒdÊ§ĘDvČ_Àæ~Dċ´A®µ¨ØLV¦êHÒ¤\"\n          ]\n        ],\n        \"encodeOffsets\": [[[113712, 34000]], [[115612, 30507]], [[113649, 34054]]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"430000\",\n      \"properties\": { \"id\": \"430000\", \"cp\": [111.782279, 28.09409], \"name\": \"湖南\", \"childNum\": 3 },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\"@@nFTs\"],\n          [\"@@ßÅÆá½ÔXrCOËRïÿĩ­TooQyÓ[ŅBE¬ÎÓXaį§Ã¸G °ITxpúxÚĳ¥ÏĢ¾edÄ©ĸGàGhM¤Â_U}Ċ}¢pczfþg¤ÇòAVM\"],\n          [\n            \"@@©KA·³CQ±Á«³BUƑ¹AtćOwD]JiØSm¯b£ylXHËÑ±H«C^õľAÅ§¤É¥ïyuǙuA¢^{ÌC´­¦ŷJ£^[ª¿ĕ~ƇN skóā¹¿ï]ă~÷O§­@Vm¡Qđ¦¢Ĥ{ºjÔª¥nf´~Õo×ÛąMąıuZmZcÒ ĲĪ²SÊǄŶ¨ƚCÖŎªQØ¼rŭ­«}NÏürÊ¬mjr@ĘrTW ­SsdHzƓ^ÇÂyUi¯DÅYlŹu{hT}mĉ¹¥ěDÿë©ıÓ[Oº£¥ótł¹MÕƪ`PDiÛU¾ÅâìUñBÈ£ýhedy¡oċ`pfmjP~kZaZsÐd°wj§@Ĵ®w~^kÀÅKvNmX\\\\¨aŃqvíó¿F¤¡@ũÑVw}S@j}¾«pĂrªg àÀ²NJ¶¶DôK|^ª°LX¾ŴäPĪ±£EXd^¶ĲÞÜ~u¸ǔMRhsRe`ÄofIÔ\\\\Ø  ićymnú¨cj ¢»GČìƊÿÐ¨XeĈĀ¾Oð Fi ¢|[jVxrIQ_EzAN¦zLU`cªxOTu RLÄ¢dVi`p˔vŎµªÉF~Ød¢ºgİàw¸Áb[¦Zb¦z½xBĖ@ªpºlS¸Ö\\\\Ĕ[N¥ˀmĎăJ\\\\ŀ`ňSÚĖÁĐiOĜ«BxDõĚivSÌ}iùÜnÐºG{p°M´wÀÒzJ²ò¨ oTçüöoÛÿñőĞ¤ùTz²CȆȸǎŪƑÐc°dPÎğË¶[È½u¯½WM¡­ÉB·rínZÒ `¨GA¾\\\\pēXhÃRC­üWGġuTé§ŎÑ©ò³I±³}_EÃħg®ęisÁPDmÅ{b[RÅs·kPŽƥóRoOV~]{g\\\\êYƪ¦kÝbiċƵGZ»Ěõó·³vŝ£ø@pyö_ëIkÑµbcÑ§y×dYØªiþ¨[]f]Ņ©C}ÁN»hĻħƏĩ\"\n          ]\n        ],\n        \"encodeOffsets\": [[[115640, 30489]], [[112543, 27312]], [[116690, 26230]]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"440000\",\n      \"properties\": {\n        \"id\": \"440000\",\n        \"cp\": [113.280637, 23.125178],\n        \"name\": \"广东\",\n        \"childNum\": 24\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\"@@QdAua\"],\n          [\"@@lxDLo\"],\n          [\"@@sbhNLo\"],\n          [\"@@Ă ā\"],\n          [\"@@WltO[[\"],\n          [\"@@Kr]S\"],\n          [\"@@eI]y\"],\n          [\"@@I|Mym\"],\n          [\"@@Û³LS¼Y\"],\n          [\"@@nvºBëui©`¾\"],\n          [\"@@zdÛJw®\"],\n          [\"@@°¯\"],\n          [\"@@a yAª¸ËJIxØ@ĀHAmÃV¡ofuo\"],\n          [\"@@sŗÃÔėAƁZÄ ~°ČPäh\"],\n          [\"@@¶ÝÌvmĞh­ıQ\"],\n          [\"@@HdSjĒ¢D}waru«ZqadYM\"],\n          [\"@@el\\\\LqqU\"],\n          [\"@@~rMo\\\\\"],\n          [\"@@f^C\"],\n          [\"@@øPªoj÷ÍÝħXČx°Q¨ıXNv\"],\n          [\"@@gÇƳo[~tly\"],\n          [\"@@EÆC¿\"],\n          [\"@@OP\"],\n          [\n            \"@@wđógĝ[³¡VÙæÅöMÌ³¹pÁaËýý©D©ÜJŹƕģGą¤{ÙūÇO²«BƱéAÒĥ¡«BhlmtÃPµyU¯ucd·w_bŝcīímGO|KPȏŹãŝIŕŭŕ@Óoo¿ē±ß}ŭĲWÈCőâUâǙIğŉ©IĳE×Á³AówXJþ±ÌÜÓĨ£L]ĈÙƺZǾĆĖMĸĤfÎĵlŨnÈĐtFFĤêk¶^k°f¶g}®Faf`vXŲxl¦ÔÁ²¬Ð¦pqÊÌ²iXØRDÎ}Ä@ZĠsx®AR~®ETtĄZƈfŠŠHâÒÐAµ\\\\S¸^wĖkRzalŜ|E¨ÈNĀňZTpBh£\\\\ĎƀuXĖtKL¶G|»ĺEļĞ~ÜĢÛĊrOÙîvd]n¬VÊĜ°RÖpMƂªFbwEÀ©\\\\¤]ŸI®¥D³|Ë]CöAŤ¦æ´¥¸Lv¼¢ĽBaôF~®²GÌÒEYzk¤°ahlVÕI^CxĈPsBƒºV¸@¾ªR²ĨN]´_eavSivc}p}Đ¼ƌkJÚe th_¸ ºx±ò_xNË²@ă¡ßH©Ùñ}wkNÕ¹ÇO½¿£ĕ]ly_WìIÇª`uTÅxYĒÖ¼kÖµMjJÚwn\\\\hĒv]îh|ÈƄøèg¸Ķß ĉĈWb¹ƀdéĘNTtP[öSvrCZaGubo´ŖÒÇĐ~¡zCIözx¢PnÈñ @ĥÒ¦]ƞV}³ăĔñiiÄÓVépKG½ÄÓávYoC·sitiaÀyŧÎ¡ÈYDÑům}ý|m[węõĉZÅxUO}÷N¹³ĉo_qtăqwµŁYÙǝŕ¹tïÛUÃ¯mRCºĭ|µÕÊK½Rē ó]GªęAx»HO£|ām¡diď×YïYWªŉOeÚtĐ«zđ¹TāúEá²\\\\ķÍ}jYàÙÆſ¿Çdğ·ùTßÇţʄ¡XgWÀǇğ·¿ÃOj YÇ÷Qěi\"\n          ]\n        ],\n        \"encodeOffsets\": [\n          [[117381, 22988]],\n          [[116552, 22934]],\n          [[116790, 22617]],\n          [[116973, 22545]],\n          [[116444, 22536]],\n          [[116931, 22515]],\n          [[116496, 22490]],\n          [[116453, 22449]],\n          [[113301, 21439]],\n          [[118726, 21604]],\n          [[118709, 21486]],\n          [[113210, 20816]],\n          [[115482, 22082]],\n          [[113171, 21585]],\n          [[113199, 21590]],\n          [[115232, 22102]],\n          [[115739, 22373]],\n          [[115134, 22184]],\n          [[113056, 21175]],\n          [[119573, 21271]],\n          [[119957, 24020]],\n          [[115859, 22356]],\n          [[116561, 22649]],\n          [[116285, 22746]]\n        ]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"450000\",\n      \"properties\": { \"id\": \"450000\", \"cp\": [108.320004, 22.82402], \"name\": \"广西\", \"childNum\": 2 },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\"@@H TQ§A\"],\n          [\n            \"@@ĨÊªLƊDÎĹĐCǦė¸zÚGn£¾rªŀÜt¬@ÖÚSx~øOŒŶÐÂæȠ\\\\ÈÜObĖw^oÞLf¬°bI lTØBÌF£Ć¹gñĤaYt¿¤VSñK¸¤nM¼JE±½¸ñoÜCƆæĪ^ĚQÖ¦^f´QüÜÊz¯lzUĺš@ìp¶n]sxtx¶@~ÒĂJb©gk{°~c°`Ô¬rV\\\\la¼¤ôá`¯¹LCÆbxEræOv[H­[~|aB£ÖsºdAĐzNÂðsÞÆĤªbab`ho¡³F«èVlo¤ÔRzpp®SĪº¨ÖºNĳd`a¦¤F³ºDÎńĀìCĜº¦Ċ~nS|gźvZkCÆj°zVÈÁƔ]LÊFZgčP­kini«qÇczÍY®¬Ů»qR×ō©DÕ§ƙǃŵTÉĩ±ıdÑnYYĲvNĆĆØÜ Öp}e³¦m©iÓ|¹ħņ|ª¦QF¢Â¬ʖovg¿em^ucà÷gÕuíÙćĝ}FĻ¼Ĺ{µHKsLSđƃrč¤[AgoSŇYMÿ§Ç{FśbkylQxĕ]T·¶[BÑÏGáşşƇeăYSs­FQ}­BwtYğÃ@~CÍQ ×WjË±rÉ¥oÏ ±«ÓÂ¥kwWűmcih³K~µh¯e]lµélEģEďsmÇŧē`ãògK_ÛsUʝćğ¶höO¤Ǜn³c`¡y¦CezYwa[ďĵűMę§]XÎ_íÛ]éÛUćİÕBƣ±dy¹T^dûÅÑŦ·PĻþÙ`K¦¢ÍeĥR¿³£[~äu¼dltW¸oRM¢ď\\\\z}Æzdvň{ÎXF¶°Â_ÒÂÏL©ÖTmu¼ãlīkiqéfA·Êµ\\\\őDc¥ÝFyÔćcűH_hLÜêĺĐ¨c}rn`½Ì@¸¶ªVLhŒ\\\\Ţĺk~Ġið°|gtTĭĸ^xvKVGréAébUuMJVÃO¡qĂXËSģãlýà_juYÛÒBG^éÖ¶§EGÅzěƯ¤EkN[kdåucé¬dnYpAyČ{`]þ¯TbÜÈk¡ĠvàhÂƄ¢Jî¶²\"\n          ]\n        ],\n        \"encodeOffsets\": [[[111707, 21520]], [[107619, 25527]]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"460000\",\n      \"properties\": { \"id\": \"460000\", \"cp\": [109.83119, 19.031971], \"name\": \"海南\", \"childNum\": 1 },\n      \"geometry\": {\n        \"type\": \"Polygon\",\n        \"coordinates\": [\"@@¦Ŝil¢XƦƞòïè§ŞCêɕrŧůÇąĻõ·ĉ³œ̅kÇm@ċȧŧĥĽʉ­ƅſȓÒË¦ŝE}ºƑ[ÍĜȋ gÎfǐÏĤ¨êƺ\\\\Ɔ¸ĠĎvʄȀÐ¾jNðĀÒRZǆzÐŘÎ°H¨Ƣb²_Ġ \"],\n        \"encodeOffsets\": [[112750, 20508]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"510000\",\n      \"properties\": {\n        \"id\": \"510000\",\n        \"cp\": [104.065735, 30.659462],\n        \"name\": \"四川\",\n        \"childNum\": 2\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\"@@LqKr\"],\n          [\n            \"@@[ĻéV£_ţġñpG réÏ·~ąSfy×Í·ºſƽiÍıƣıĻmHH}siaX@iÇ°ÁÃ×t«­T¤JJJyJÈ`Ohß¦¡uËhIyCjmÿwZGTiSsOB²fNmsPa{M{õE^Hj}gYpaeu¯oáwHjÁ½M¡pMuåmni{fk\\\\oÎqCwEZ¼KĝAy{m÷LwO×SimRI¯rKõBS«sFe]fµ¢óY_ÆPRcue°Cbo×bd£ŌIHgtrnyPt¦foaXďxlBowz_{ÊéWiêEGhÜ¸ºuFĈIxf®Y½ĀǙ]¤EyF²ċw¸¿@g¢§RGv»áW`ÃĵJwi]t¥wO­½a[×]`Ãi­üL¦LabbTÀåc}ÍhÆh®BHî|îºÉk­¤Sy£ia©taį·Ɖ`ō¥UhOĝLk}©Fos´JmµlŁuønÑJWÎªYÀïAetTŅÓGË«bo{ıwodƟ½OġÜÂµxàNÖ¾P²§HKv¾]|BÆåoZ`¡Ø`ÀmºĠ~ÌÐ§nÇ¿¤]wğ@srğu~Io[é±¹ ¿ſđÓ@qg¹zƱřaí°KtÇ¤V»Ã[ĩǭƑ^ÇÓ@áťsZÏÅĭƋěpwDóÖáŻneQËq·GCœýS]x·ýq³OÕ¶Qzßti{řáÍÇWŝŭñzÇWpç¿JXĩè½cFÂLiVjx}\\\\NŇĖ¥GeJA¼ÄHfÈu~¸Æ«dE³ÉMA|bÒćhG¬CMõƤąAvüVéŀ_VÌ³ĐwQj´·ZeÈÁ¨X´Æ¡Qu·»ÕZ³ġqDoy`L¬gdp°şp¦ėìÅĮZ°Iähzĵf²å ĚÑKpIN|Ñz]ń·FU×é»R³MÉ»GM«kiér}Ã`¹ăÞmÈnÁîRǀ³ĜoİzŔwǶVÚ£À]ɜ»ĆlƂ²ĠþTº·àUȞÏʦ¶I«dĽĢdĬ¿»Ĕ×h\\\\c¬ä²GêëĤł¥ÀǿżÃÆMº}BÕĢyFVvwxBèĻĒ©ĈtCĢɽŠȣ¦āæ·HĽîôNÔ~^¤Ɗu^s¼{TA¼ø°¢İªDè¾Ň¶ÝJ®Z´ğ~Sn|ªWÚ©òzPOȸbð¢|øĞŒQìÛÐ@ĞǎRS¤Á§di´ezÝúØã]HqkIþËQÇ¦ÃsÇ¤[E¬ÉŪÍxXƒ·ÖƁİlƞ¹ª¹|XÊwnÆƄmÀêErĒtD®ċæcQE®³^ĭ¥©l}äQtoŖÜqÆkµªÔĻĴ¡@Ċ°B²Èw^^RsºTĀ£ŚæQPJvÄz^Đ¹Æ¯fLà´GC²dt­ĀRt¼¤ĦOðğfÔðDŨŁĞƘïPÈ®âbMüÀXZ ¸£@Å»»QÉ­]dsÖ×_Í_ÌêŮPrĔĐÕGĂeZÜîĘqBhtO ¤tE[h|YÔZśÎs´xº±Uñt|OĩĠºNbgþJy^dÂY Į]Řz¦gC³R`Āz¢Aj¸CL¤RÆ»@­Ŏk\\\\Ç´£YW}z@Z}Ã¶oû¶]´^NÒ}èNªPÍy¹`S°´ATeVamdUĐwʄvĮÕ\\\\uÆŗ¨Yp¹àZÂmWh{á}WØǍÉüwga§áCNęÎ[ĀÕĪgÖÉªXøx¬½Ů¦¦[NÎLÜUÖ´òrÙŠxR^JkĳnDX{U~ET{ļº¦PZcjF²Ė@pg¨B{u¨ŦyhoÚD®¯¢ WòàFÎ¤¨GDäz¦kŮPġqË¥À]eâÚ´ªKxīPÖ|æ[xÃ¤JÞĥsNÖ½I¬nĨY´®ÐƐmDŝuäđđEbee_v¡}ìęǊē}qÉåT¯µRs¡M@}ůaa­¯wvƉåZw\\\\Z{åû^\"\n          ]\n        ],\n        \"encodeOffsets\": [[[108815, 30935]], [[110617, 31811]]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"520000\",\n      \"properties\": {\n        \"id\": \"520000\",\n        \"cp\": [106.713478, 26.578343],\n        \"name\": \"贵州\",\n        \"childNum\": 3\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\"@@G\\\\lY£in\"],\n          [\"@@q|mc¯tÏVSÎ\"],\n          [\n            \"@@hÑ£IsNgßHHªķÃh_¹¡ĝÄ§ń¦uÙùgS¯JH|sÝÅtÁïyMDč»eÕtA¤{b\\\\}G®u\\\\åPFqwÅaDK°ºâ_£ùbµmÁÛĹM[q|hlaªāI}Ñµ@swtwm^oµDéĽŠyVky°ÉûÛR³e¥]RÕěħ[ƅåÛDpJiVÂF²I»mN·£LbÒYbWsÀbpkiTZĄă¶Hq`ĥ_J¯ae«KpÝx]aĕÛPÇȟ[ÁåŵÏő÷Pw}TÙ@Õs«ĿÛq©½m¤ÙH·yǥĘĉBµĨÕnđ]K©œáGçş§ÕßgǗĦTèƤƺ{¶ÉHÎd¾ŚÊ·OÐjXWrãLyzÉAL¾ę¢bĶėy_qMĔąro¼hĊw¶øV¤w²Ĉ]ÊKx|`ź¦ÂÈdrcÈbe¸`I¼čTF´¼Óýȃr¹ÍJ©k_șl³´_pĐ`oÒh¶pa^ÓĔ}D»^Xy`d[KvJPhèhCrĂĚÂ^Êƌ wZL­Ġ£ÁbrzOIlMMĪŐžËr×ÎeŦtw|¢mKjSǘňĂStÎŦEtqFT¾Eì¬¬ôxÌO¢ K³ŀºäYPVgŎ¦ŊmŞ¼VZwVlz¤£Tl®ctĽÚó{G­AÇge~Îd¿æaSba¥KKûj®_Ä^\\\\Ø¾bP®¦x^sxjĶI_Ä Xâ¼Hu¨Qh¡À@Ëô}±GNìĎlT¸`V~R°tbÕĊ`¸úÛtÏFDu[MfqGH·¥yAztMFe|R_GkChZeÚ°tov`xbDnÐ{E}ZèxNEÞREn[Pv@{~rĆAB§EO¿|UZ~ìUf¨J²ĂÝÆsªB`s¶fvö¦Õ~dÔq¨¸º»uù[[§´sb¤¢zþF¢ÆÀhÂW\\\\ıËIÝo±ĭŠ£þÊs}¡R]ěDg´VG¢j±®èºÃmpU[Áëº°rÜbNu¸}º¼`niºÔXĄ¤¼ÔdaµÁ_ÃftQQgR·Ǔv}Ý×ĵ]µWc¤F²OĩųãW½¯K©]{LóµCIµ±Mß¿h©āq¬o½~@i~TUxŪÒ¢@£ÀEîôruńb[§nWuMÆLl¿]x}ĳ­½\"\n          ]\n        ],\n        \"encodeOffsets\": [[[112158, 27383]], [[112105, 27474]], [[112095, 27476]]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"530000\",\n      \"properties\": {\n        \"id\": \"530000\",\n        \"cp\": [101.512251, 24.740609],\n        \"name\": \"云南\",\n        \"childNum\": 1\n      },\n      \"geometry\": {\n        \"type\": \"Polygon\",\n        \"coordinates\": [\n          \"@@[ùx½}ÑRHYīĺûsÍniEoã½Ya²ė{c¬ĝgĂsAØÅwďõzFjw}«Dx¿}Uũlê@HÅ­F¨ÇoJ´Ónũuą¡Ã¢pÒÅØ TF²xa²ËXcÊlHîAßËŁkŻƑŷÉ©hW­æßUËs¡¦}teèÆ¶StÇÇ}Fd£jĈZĆÆ¤Tč\\\\D}O÷£U§~ŃGåŃDĝ¸Tsd¶¶Bª¤u¢ŌĎo~t¾ÍŶÒtD¦ÚiôözØX²ghįh½Û±¯ÿm·zR¦Ɵ`ªŊÃh¢rOÔ´£Ym¼èêf¯ŪĽncÚbw\\\\zlvWªâ ¦gmĿBĹ£¢ƹřbĥkǫßeeZkÙIKueT»sVesbaĕ  ¶®dNĄÄpªy¼³BE®lGŭCǶwêżĔÂepÍÀQƞpC¼ŲÈ­AÎô¶RäQ^Øu¬°_Èôc´¹ò¨PÎ¢hlĎ¦´ĦÆ´sâÇŲPnÊD^¯°Upv}®BPÌªjǬxSöwlfòªvqĸ|`H­viļndĜ­Ćhňem·FyÞqóSį¯³X_ĞçêtryvL¤§z¦c¦¥jnŞklD¤øz½ĜàĂŧMÅ|áƆàÊcðÂFÜáŢ¥\\\\\\\\ºİøÒÐJĴîD¦zK²ǏÎEh~CD­hMn^ÌöÄ©ČZÀaüfɭyœpį´ěFűk]Ôě¢qlÅĆÙa¶~ÄqêljN¬¼HÊNQ´ê¼VØ¸E^ŃÒyM{JLoÒęæe±Ķygã¯JYÆĭĘëo¥Šo¯hcK«z_prC´ĢÖY¼ v¸¢RÅW³Â§fÇ¸Yi³xR´ďUË`êĿUûuĆBƣöNDH«ĈgÑaB{ÊNF´¬c·Åv}eÇÃGB»If¦HňĕM~[iwjUÁKE¾dĪçWIèÀoÈXòyŞŮÈXâÎŚj|àsRyµÖPr´þ ¸^wþTDŔHr¸RÌmfżÕâCôoxĜƌÆĮÐYtâŦÔ@]ÈǮƒ\\\\Ī¼Ä£UsÈ¯LbîƲŚºyhr@ĒÔƀÀ²º\\\\êpJ}ĠvqtĠ@^xÀ£È¨mËÏğ}n¹_¿¢×Y_æpÅA^{½Lu¨GO±Õ½ßM¶wÁĢÛPƢ¼pcĲx|apÌ¬HÐŊSfsðBZ¿©XÏÒKk÷Eû¿SrEFsÕūkóVǥŉiTL¡n{uxţÏhôŝ¬ğōNNJkyPaqÂğ¤K®YxÉƋÁ]āęDqçgOgILu\\\\_gz]W¼~CÔē]bµogpÑ_oď`´³Țkl`IªºÎȄqÔþ»E³ĎSJ»_f·adÇqÇc¥Á_Źw{L^É±ćxU£µ÷xgĉp»ĆqNē`rĘzaĵĚ¡K½ÊBzyäKXqiWPÏÉ¸½řÍcÊG|µƕƣGË÷k°_^ý|_zċBZocmø¯hhcæ\\\\lMFlư£ĜÆyHF¨µêÕ]HAàÓ^it `þßäkĤÎT~Wlÿ¨ÔPzUCNVv [jâôDôď[}z¿msSh¯{jïğl}šĹ[őgK©U·µË@¾m_~q¡f¹ÅË^»f³ø}Q¡ÖË³gÍ±^Ç\\\\ëÃA_¿bWÏ[¶ƛé£F{īZgm@|kHǭƁć¦UĔť×ë}ǝeďºȡȘÏíBÉ£āĘPªĳ¶ŉÿy©nď£G¹¡I±LÉĺÑdĉÜW¥}gÁ{aqÃ¥aıęÏZï`\"\n        ],\n        \"encodeOffsets\": [[104636, 22969]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"540000\",\n      \"properties\": { \"id\": \"540000\", \"cp\": [89.132212, 30.860361], \"name\": \"西藏\", \"childNum\": 1 },\n      \"geometry\": {\n        \"type\": \"Polygon\",\n        \"coordinates\": [\n          \"@@ÂhľxŖxÒVºÅâAĪÝȆµę¯Ňa±r_w~uSÕňqOj]ɄQ£ZUDûoY»©M[L¼qãË{VÍçWVi]ë©Ä÷àyƛhÚU°adcQ~Mx¥cc¡ÙaSyFÖk­uRýq¿ÔµQĽ³aG{¿FµëªéĜÿª@¬·K·àariĕĀ«V»ŶĴūgèLǴŇƶaftèBŚ£^âǐÝ®M¦ÁǞÿ¬LhJ¾óƾÆºcxwf]Y´¦|QLn°adĊ\\\\¨oǀÍŎ´ĩĀd`tÊQŞŕ|¨C^©Ĉ¦¦ÎJĊ{ëĎjª²rÐl`¼Ą[t|¦Stè¾PÜK¸dƄı]s¤î_v¹ÎVòŦj£Əsc¬_Ğ´|Ł¦Av¦w`ăaÝaa­¢e¤ı²©ªSªÈMĄwÉØŔì@T¤Ę\\\\õª@þo´­xA sÂtŎKzó´ÇĊµ¢r^nĊ­Æ¬×üG¢³ {âĊ]G~bÀgVjzlhǶfOfdªB]pjTOtĊn¤}®¦Č¥d¢¼»ddY¼t¢eȤJ¤}Ǿ¡°§¤AÐlc@ĝsªćļđAçwxUuzEÖġ~AN¹ÄÅȀŻ¦¿ģŁéì±Hãd«g[Ø¼ēÀcīľġ¬cJµÐʥVȝ¸ßS¹ý±ğkƁ¼ą^ɛ¤Ûÿb[}¬ōõÃ]ËNm®g@Bg}ÍF±ǐyL¥íCIĳÏ÷Ñį[¹¦[âšEÛïÁÉdƅß{âNÆāŨß¾ě÷yC£k­´ÓH@Â¹TZ¥¢į·ÌAÐ§®Zcv½Z­¹|ÅWZqgW|ieZÅYVÓqdqbc²R@c¥Rã»GeeƃīQ}J[ÒK¬Ə|oėjġĠÑN¡ð¯EBčnwôɍėª²CλŹġǝʅįĭạ̃ūȹ]ΓͧgšsgȽóϧµǛęgſ¶ҍć`ĘąŌJÞä¤rÅň¥ÖÁUětęuůÞiĊÄÀ\\\\Æs¦ÓRb|Â^řÌkÄŷ¶½÷f±iMÝ@ĥ°G¬ÃM¥n£Øąğ¯ß§aëbéüÑOčk£{\\\\eµª×MÉfm«Ƒ{Å×Gŏǩãy³©WÑăû··Qòı}¯ãIéÕÂZ¨īès¶ZÈsæĔTŘvgÌsN@îá¾ó@ÙwU±ÉTå»£TđWxq¹Zobs[×¯cĩvėŧ³BM|¹kªħ¥TzNYnÝßpęrñĠĉRS~½ěVVµõ«M££µBĉ¥áºae~³AuĐh`Ü³ç@BÛïĿa©|z²Ý¼D£àč²ŸIûI āóK¥}rÝ_Á´éMaň¨~ªSĈ½½KÙóĿeƃÆB·¬ën×W|Uº}LJrƳlŒµ`bÔ`QÐÓ@s¬ñIÍ@ûws¡åQÑßÁ`ŋĴ{ĪTÚÅTSÄ³Yo|Ç[Ç¾µMW¢ĭiÕØ¿@MhpÕ]jéò¿OƇĆƇpêĉâlØwěsǩĵ¸cbU¹ř¨WavquSMzeo_^gsÏ·¥Ó@~¯¿RiīB\\\\qTGªÇĜçPoÿfñòą¦óQīÈáPābß{ZŗĸIæÅhnszÁCËìñÏ·ąĚÝUm®ó­L·ăUÈíoù´Êj°ŁŤ_uµ^°ìÇ@tĶĒ¡ÆM³Ģ«İĨÅ®ğRāðggheÆ¢zÊ©Ô\\\\°ÝĎz~ź¤PnMĪÖB£kné§żćĆKĒ°¼L¶èâz¨u¦¥LDĘz¬ýÎmĘd¾ßFzhg²Fy¦ĝ¤ċņbÎ@yĄæm°NĮZRÖíJ²öLĸÒ¨Y®ƌÐVàtt_ÚÂyĠz]ŢhzĎ{ÂĢXc|ÐqfO¢¤ögÌHNPKŖUú´xx[xvĐCûĀìÖT¬¸^}Ìsòd´_KgžLĴÀBon|H@Êx¦BpŰŌ¿fµƌA¾zǈRx¶FkĄźRzŀ~¶[´HnªVƞuĒ­È¨ƎcƽÌm¸ÁÈM¦x͊ëÀxǆBú^´W£dkɾĬpw˂ØɦļĬIŚÊnŔa¸~J°îlɌxĤÊÈðhÌ®gT´øàCÀ^ªerrƘd¢İP|Ė ŸWªĦ^¶´ÂLaT±üWƜǀRÂŶUńĖ[QhlLüAÜ\\\\qRĄ©\"\n        ],\n        \"encodeOffsets\": [[90849, 37210]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"610000\",\n      \"properties\": {\n        \"id\": \"610000\",\n        \"cp\": [108.948024, 34.263161],\n        \"name\": \"陕西\",\n        \"childNum\": 1\n      },\n      \"geometry\": {\n        \"type\": \"Polygon\",\n        \"coordinates\": [\n          \"@@p¢ȮµûGĦ}Ħðǚ¶òƄjɂz°{ºØkÈęâ¦jªBg\\\\ċ°s¬]jú EȌǆ¬stRÆdĠİwÜ¸ôW¾ƮłÒ_{Ìû¼jº¹¢GǪÒ¯ĘZ`ºŊecņą~BÂgzpâēòYǠȰÌTÎ¨ÂW|fcă§uF@N¢XLRMº[ğȣſï|¥Jkc`sŉǷY¹W@µ÷Kãï³ÛIcñ·VȋÚÒķø©þ¥yÓğęmWµÎumZyOŅƟĥÓ~sÑL¤µaÅY¦ocyZ{y c]{Ta©`U_Ěē£ωÊƍKùK¶ȱÝƷ§{û»ÅÁȹÍéuĳ|¹cÑdìUYOuFÕÈYvÁCqÓTǢí§·S¹NgV¬ë÷Át°DØ¯C´ŉƒópģ}ċcEËFéGU¥×K§­¶³BČ}C¿åċ`wġB·¤őcƭ²ő[Å^axwQOÿEËßŚĤNĔwƇÄńwĪ­o[_KÓª³ÙnKÇěÿ]ďă_d©·©Ýŏ°Ù®g]±ßå¬÷m\\\\iaǑkěX{¢|ZKlçhLtŇîŵœè[É@ƉĄEtƇÏ³­ħZ«mJ×¾MtÝĦ£IwÄå\\\\Õ{OwĬ©LÙ³ÙgBƕŀrÌĢŭO¥lãyC§HÍ£ßEñX¡­°ÙCgpťzb`wIvA|§hoĕ@E±iYd¥OĻ¹S|}F@¾oAO²{tfÜ¢FǂÒW²°BĤh^Wx{@¬­F¸¡ķn£P|ªĴ@^ĠĈæbÔc¶lYi^MicĎ°Â[ävï¶gv@ÀĬ·lJ¸sn|¼u~a]ÆÈtŌºJpþ£KKf~¦UbyäIĺãnÔ¿^­ŵMThĠÜ¤ko¼Ŏìąǜh`[tRd²Ĳ_XPrɲlXiL§à¹H°Ȧqº®QCbAŌJ¸ĕÚ³ĺ§ `d¨YjiZvRĺ±öVKkjGȊÄePĞZmļKÀ[`ösìhïÎoĬdtKÞ{¬èÒÒBÔpĲÇĬJŊ¦±J«Y§@·pHµàåVKepWftsAÅqC·¬ko«pHÆuK@oHĆÛķhxenS³àǍrqƶRbzy¸ËÐl¼EºpĤ¼x¼½~Ğà@ÚüdK^mÌSj\"\n        ],\n        \"encodeOffsets\": [[110234, 38774]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"620000\",\n      \"properties\": {\n        \"id\": \"620000\",\n        \"cp\": [103.823557, 36.058039],\n        \"name\": \"甘肃\",\n        \"childNum\": 2\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\"@@VuUv\"],\n          [\n            \"@@ũEĠtt~nkh`Q¦ÅÄÜdwAb×ĠąJ¤DüègĺqBqj°lI¡ĨÒ¤úSHbjÎB°aZ¢KJO[|A£Dx}NĂ¬HUnrk kp¼Y kMJn[aGáÚÏ[½rc}aQxOgsPMnUsncZsKúvAtÞġ£®ĀYKdnFw¢JE°Latf`¼h¬we|Æbj}GA·~W`¢MC¤tL©Ĳ°qdfObÞĬ¹ttu`^ZúE`[@Æsîz®¡CƳƜG²R¢RmfwĸgÜą G@pzJM½mhVy¸uÈÔO±¨{LfæU¶ßGĂq\\\\ª¬²I¥IŉÈīoıÓÑAçÑ|«LÝcspīðÍgtë_õ\\\\ĉñLYnĝgRǡÁiHLlõUĹ²uQjYi§Z_c¨´ĹĖÙ·ŋIaBD­R¹ȥr¯GºßK¨jWkɱOqWĳ\\\\a­Q\\\\sg_ĆǛōëp»£lğÛgSŶN®À]ÓämĹãJaz¥V}Le¤Lýo¹IsŋÅÇ^bz³tmEÁ´a¹cčecÇNĊãÁ\\\\č¯dNj]jZµkÓdaćå]ğĳ@ ©O{¤ĸm¢E·®«|@Xwg]Aģ±¯XǁÑǳªcwQÚŝñsÕ³ÛV_ý¥\\\\ů¥©¾÷w©WÕÊĩhÿÖÁRo¸V¬âDb¨hûxÊ×ǌ~Zâg|XÁnßYoº§ZÅŘv[ĭÖʃuďxcVbnUSfB¯³_TzºÎO©çMÑ~M³]µ^püµÄY~y@X~¤Z³[Èōl@®Å¼£QK·Di¡ByÿQ_´D¥hŗy^ĭÁZ]cIzýah¹MĪğPs{ò²Vw¹t³ŜË[Ñ}X\\\\gsF£sPAgěp×ëfYHāďÖqēŭOÏëdLü\\\\it^c®RÊº¶¢H°mrY£B¹čIoľu¶uI]vģSQ{UŻÅ}QÂ|Ì°ƅ¤ĩŪU ęĄÌZÒ\\\\v²PĔ»ƢNHĂyAmƂwVm`]ÈbH`Ì¢²ILvĜH®¤Dlt_¢JJÄämèÔDëþgºƫaʎÌrêYi~ Îİ¤NpÀA¾Ĕ¼bð÷®üszMzÖĖQdȨýv§Tè|ªHÃ¾a¸|Ð ƒwKĢx¦ivr^ÿ ¸l öæfƟĴ·PJv}n\\\\h¹¶v·À|\\\\ƁĚN´ĜçèÁz]ġ¤²¨QÒŨTIlªťØ}¼˗ƦvÄùØEÂ«FïËIqōTvāÜŏíÛßÛVj³âwGăÂíNOPìyV³ŉĖýZso§HÑiYw[ß\\\\X¦¥c]ÔƩÜ·«jÐqvÁ¦m^ċ±R¦΋ƈťĚgÀ»IïĨʗƮ°ƝĻþÍAƉſ±tÍEÕÞāNUÍ¡\\\\ſčåÒʻĘm ƭÌŹöʥëQ¤µ­ÇcƕªoIýIÉ_mkl³ăƓ¦j¡YzŇi}Msßõīʋ }ÁVm_[n}eı­Uĥ¼ªI{Î§DÓƻėojqYhĹT©oūĶ£]ďxĩǑMĝq`B´ƃ˺Чç~²ņj@¥@đ´ί}ĥtPńÇ¾V¬ufÓÉCtÓ̻¹£G³]ƖƾŎĪŪĘ̖¨ʈĢƂlɘ۪üºňUðǜȢƢż̌ȦǼĤŊɲĖÂ­Kq´ï¦ºĒǲņɾªǀÞĈĂD½ĄĎÌŗĞrôñnN¼â¾ʄľԆ|Ǆ֦ज़ȗǉ̘̭ɺƅêgV̍ʆĠ·ÌĊv|ýĖÕWĊǎÞ´õ¼cÒÒBĢ͢UĜð͒s¨ňƃLĉÕÝ@ɛƯ÷¿Ľ­ĹeȏĳëCȚDŲyê×Ŗyò¯ļcÂßYtÁƤyAã˾J@ǝrý@¤rz¸oP¹ɐÚyáHĀ[JwcVeȴÏ»ÈĖ}ƒŰŐèȭǢόĀƪÈŶë;Ñ̆ȤМľĮEŔĹŊũ~ËUă{ĻƹɁύȩþĽvĽƓÉ@ēĽɲßǐƫʾǗĒpäWÐxnsÀ^ƆwW©¦cÅ¡Ji§vúF¶¨c~c¼īeXǚ\\\\đ¾JwÀďksãAfÕ¦L}waoZD½Ml«]eÒÅaÉ²áo½FõÛ]ĻÒ¡wYR£¢rvÓ®y®LFLzĈôe]gx}|KK}xklL]c¦£fRtív¦PĤoH{tK\"\n          ]\n        ],\n        \"encodeOffsets\": [[[108619, 36299]], [[108589, 36341]]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"630000\",\n      \"properties\": { \"id\": \"630000\", \"cp\": [96.778916, 35.623178], \"name\": \"青海\", \"childNum\": 2 },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\"@@InJm\"],\n          [\n            \"@@CÆ½OŃĦsΰ~Ē³¦@@Ņi±è}ШƄ˹A³r_ĞǒNĪĐw¤^ŬĵªpĺSZgrpiƼĘÔ¨C|ÍJ©Ħ»®VĲ~f\\\\m `UnÂ~ʌĬàöNt~ňjy¢ZiƔ¥Ąk´nl`JÊJþ©pdƖ®È£¶ìRʦźõƮËnʼėæÑƀĎ[¢VÎĂMÖÝÎF²sƊƀÎBļýƞ¯ʘƭðħ¼Jh¿ŦęΌƇ¥²Q]Č¥nuÂÏri¸¬ƪÛ^Ó¦d¥[Wàx\\\\ZjÒ¨GtpþYŊĕ´zUOëPîMĄÁxH´áiÜUàîÜŐĂÛSuŎrJðÌ¬EFÁú×uÃÎkrĒ{V}İ«O_ÌËĬ©ÓŧSRÑ±§Ģ£^ÂyèçěM³Ƃę{[¸¿uºµ[gt£¸OƤĿéYõ·kĀq]juw¥DĩƍõÇPéÄ½G©ã¤GuȧþRcÕĕNyyût­øï»a½ē¿BMoį£Íj}éZËqbʍƬh¹ìÿÓAçãnIÃ¡I`ks£CG­ěUy×Cy@¶ʡÊBnāzGơMē¼±O÷õJËĚăVĪũƆ£¯{ËL½ÌzżVR|ĠTbuvJvµhĻĖHAëáa­OÇðñęNwœľ·LmI±íĠĩPÉ×®ÿscB³±JKßĊ«`ađ»·QAmOVţéÿ¤¹SQt]]Çx±¯A@ĉĳ¢Óļ©l¶ÅÛrŕspãRk~¦ª]Į­´FRåd­ČsCqđéFn¿ÅƃmÉx{W©ºƝºįkÕƂƑ¸wWūÐ©ÈF£\\\\tÈ¥ÄRÈýÌJ lGr^×äùyÞ³fjc¨£ÂZ|ǓMĝÏ@ëÜőRĝ÷¡{aïȷPu°ËXÙ{©TmĠ}Y³­ÞIňµç½©C¡į÷¯B»|St»]vųs»}MÓ ÿʪƟǭA¡fs»PY¼c¡»¦cċ­¥£~msĉPSi^o©AecPeǵkgyUi¿h}aHĉ^|á´¡HØûÅ«ĉ®]m¡qĉ¶³ÈyôōLÁstB®wn±ă¥HSòė£Së@×œÊăxÇN©©T±ª£Ĳ¡fb®Þbb_Ą¥xu¥B{łĝ³«`dƐt¤ťiñÍUuºí`£^tƃĲc·ÛLO½sç¥Ts{ă\\\\_»kÏ±q©čiìĉ|ÍI¥ć¥]ª§D{ŝŖÉR_sÿc³ĪōƿÎ§p[ĉc¯bKmR¥{³Ze^wx¹dƽÅ½ôIg §Mĕ ƹĴ¿ǣÜÍ]Ý]snåA{eƭ`ǻŊĿ\\\\ĳŬűYÂÿ¬jĖqßb¸L«¸©@ěĀ©ê¶ìÀEH|´bRľÓ¶rÀQþvl®ÕETzÜdb hw¤{LRdcb¯ÙVgƜßzÃôì®^jUèXÎ|UäÌ»rK\\\\ªN¼pZCüVY¤ɃRi^rPŇTÖ}|br°qňbĚ°ªiƶGQ¾²x¦PmlŜ[Ĥ¡ΞsĦÔÏâ\\\\ªÚŒU\\\\f¢N²§x|¤§xĔsZPòʛ²SÐqF`ªVÞŜĶƨVZÌL`¢dŐIqr\\\\oäõFÎ·¤»Ŷ×h¹]ClÙ\\\\¦ďÌį¬řtTӺƙgQÇÓHţĒ´ÃbEÄlbʔC|CŮkƮ[ʼ¬ň´KŮÈΰÌĪ¶ƶlðļATUvdTGº̼ÔsÊDÔveOg\"\n          ]\n        ],\n        \"encodeOffsets\": [[[105308, 37219]], [[95370, 40081]]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"640000\",\n      \"properties\": { \"id\": \"640000\", \"cp\": [106.278179, 37.26637], \"name\": \"宁夏\", \"childNum\": 2 },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            \"@@KëÀęĞ«Oęȿȕı]ŉ¡åįÕÔ«ǴõƪĚQÐZhv K°öqÀÑS[ÃÖHƖčËnL]ûcÙß@ĝ¾}w»»oģF¹»kÌÏ·{zP§B­¢íyÅt@@á]Yv_ssģ¼ißĻL¾ġsKD£¡N_X¸}B~HaiÅf{«x»ge_bsKF¯¡IxmELcÿZ¤­ĢÝsuBLùtYdmVtNmtOPhRw~bd¾qÐ\\\\âÙH\\\\bImlNZ»loqlVmGā§~QCw¤{A\\\\PKNY¯bFkC¥sks_Ã\\\\ă«¢ħkJi¯rrAhĹûç£CUĕĊ_ÔBixÅÙĄnªÑaM~ħpOu¥sîeQ¥¤^dkKwlL~{L~hw^ófćKyE­K­zuÔ¡qQ¤xZÑ¢^ļöÜ¾Ep±âbÊÑÆ^fk¬NC¾YpxbK~¥eÖäBlt¿Đx½I[ĒǙWf»Ĭ}d§dµùEuj¨IÆ¢¥dXªƅx¿]mtÏwßRĶX¢͎vÆzƂZò®ǢÌʆCrâºMÞzÆMÒÊÓŊZÄ¾r°Î®Ȉmª²ĈUªĚîøºĮ¦ÌĘk^FłĬhĚiĀĖ¾iİbjÕ\"\n          ],\n          [\"@@mfwěwMrŢªv@G\"]\n        ],\n        \"encodeOffsets\": [[[109366, 40242]], [[108600, 36303]]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"650000\",\n      \"properties\": { \"id\": \"650000\", \"cp\": [85.617733, 40.792818], \"name\": \"新疆\", \"childNum\": 1 },\n      \"geometry\": {\n        \"type\": \"Polygon\",\n        \"coordinates\": [\n          \"@@QØĔ²X¨~ǘBºjʐßØvKƔX¨vĊOÃ·¢i@~cĝe_«E}QxgɪëÏÃ@sÅyXoŖ{ô«ŸuXêÎf`C¹ÂÿÐGĮÕĞXŪōŸMźÈƺQèĽôe|¿ƸJR¤ĘEjcUóº¯Ĩ_ŘÁMª÷Ð¥OéÈ¿ÖğǤǷÂFÒzÉx[]­Ĥĝœ¦EP}ûƥé¿İƷTėƫœŕƅƱB»Đ±ēO¦E}`cȺrĦáŖuÒª«ĲπdƺÏØZƴwʄ¤ĖGĐǂZĶèH¶}ÚZצʥĪï|ÇĦMŔ»İĝǈì¥Βba­¯¥ǕǚkĆŵĦɑĺƯxūД̵nơʃĽá½M»òmqóŘĝčË¾ăCćāƿÝɽ©ǱŅ¹đ¥³ðLrÁ®ɱĕģŉǻ̋ȥơŻǛȡVï¹Ň۩ûkɗġƁ§ʇė̕ĩũƽō^ƕUv£ƁQïƵkŏ½ΉÃŭÇ³LŇʻ«ƭ\\\\lŭD{ʓDkaFÃÄa³ŤđÔGRÈƚhSӹŚsİ«ĐË[¥ÚDkº^Øg¼ŵ¸£EÍöůŉT¡c_ËKYƧUśĵÝU_©rETÏʜ±OñtYwē¨{£¨uM³x½şL©Ùá[ÓÐĥ Νtģ¢\\\\śnkOw¥±T»ƷFɯàĩÞáB¹ÆÑUwŕĽw[mG½Èå~Æ÷QyěCFmĭZīŵVÁƿQƛûXS²b½KÏ½ĉS©ŷXĕ{ĕK·¥Ɨcqq©f¿]ßDõU³h­gËÇïģÉɋwk¯í}I·œbmÉřīJɥĻˁ×xoɹīlc¤³Xù]ǅA¿w͉ì¥wÇN·ÂËnƾƍdÇ§đ®ƝvUm©³G\\\\}µĿQyŹlăµEwǇQ½yƋBe¶ŋÀůo¥AÉw@{Gpm¿AĳŽKLh³`ñcËtW±»ÕSëüÿďDu\\\\wwwù³VLŕOMËGh£õP¡erÏd{ġWÁč|yšg^ğyÁzÙs`s|ÉåªÇ}m¢Ń¨`x¥ù^}Ì¥H«YªƅAÐ¹n~ź¯f¤áÀzgÇDIÔ´AňĀÒ¶ûEYospõD[{ù°]uJqU|Soċxţ[õÔĥkŋÞŭZËºóYËüċrw ÞkrťË¿XGÉbřaDü·Ē÷AÃª[ÄäIÂ®BÕĐÞ_¢āĠpÛÄȉĖġDKwbmÄNôfƫVÉviǳHQµâFù­Âœ³¦{YGd¢ĚÜO {Ö¦ÞÍÀP^bƾl[vt×ĈÍEË¨¡Đ~´î¸ùÎhuè`¸HÕŔVºwĠââWò@{ÙNÝ´ə²ȕn{¿¥{l÷eé^eďXj©î\\\\ªÑòÜìc\\\\üqÕ[Č¡xoÂċªbØ­ø|¶ȴZdÆÂońéG\\\\¼C°ÌÆn´nxÊOĨŪƴĸ¢¸òTxÊǪMīĞÖŲÃɎOvʦƢ~FRěò¿ġ~åŊúN¸qĘ[Ĕ¶ÂćnÒPĒÜvúĀÊbÖ{Äî¸~Ŕünp¤ÂH¾ĄYÒ©ÊfºmÔĘcDoĬMŬS¤s²ʘÚžȂVŦ èW°ªB|ĲXŔþÈJĦÆæFĚêYĂªĂ]øªŖNÞüAfɨJ¯ÎrDDĤ`mz\\\\§~D¬{vJÂ«lµĂb¤pŌŰNĄ¨ĊXW|ų ¿¾ɄĦƐMTòP÷fØĶK¢ȝ˔Sô¹òEð­`Ɩ½ǒÂň×äı§ĤƝ§C~¡hlåǺŦŞkâ~}FøàĲaĞfƠ¥Ŕd®U¸źXv¢aƆúŪtŠųƠjdƺƺÅìnrh\\\\ĺ¯äɝĦ]èpĄ¦´LƞĬ´ƤǬ˼Ēɸ¤rºǼ²¨zÌPðŀbþ¹ļD¢¹\\\\ĜÑŚ¶ZƄ³àjĨoâȴLÊȮĐ­ĚăÀêZǚŐ¤qȂ\\\\L¢ŌİfÆs|zºeªÙæ§΢{Ā´ƐÚ¬¨Ĵà²łhʺKÞºÖTiƢ¾ªì°`öøu®Ê¾ãØ\"\n        ],\n        \"encodeOffsets\": [[88824, 50096]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"110000\",\n      \"properties\": {\n        \"id\": \"110000\",\n        \"cp\": [116.405285, 39.904989],\n        \"name\": \"北京\",\n        \"childNum\": 1\n      },\n      \"geometry\": {\n        \"type\": \"Polygon\",\n        \"coordinates\": [\n          \"@@ĽOÁûtŷmiÍt_H»Ĩ±d`¹­{bwYr³S]§§o¹qGtm_SŧoaFLgQN_dV@Zom_ć\\\\ßcÂ±x¯oœRcfe£o§ËgToÛJíĔóu|wP¤XnO¢ÉŦ¯rNÄā¤zâŖÈRpŢZÚ{GrFt¦Òx§ø¹RóäV¤XdżâºWbwŚ¨Ud®bêņ¾jnŎGŃŶnzÚSeîĜZczî¾i]ÍQaúÍÔiþĩȨWĢü|Ėu[qb[swP@ÅğP¿{\\\\¥A¨ÏÑ¨j¯X\\\\¯MKpA³[Hīu}}\"\n        ],\n        \"encodeOffsets\": [[120023, 41045]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"120000\",\n      \"properties\": {\n        \"id\": \"120000\",\n        \"cp\": [117.190182, 39.125596],\n        \"name\": \"天津\",\n        \"childNum\": 1\n      },\n      \"geometry\": {\n        \"type\": \"Polygon\",\n        \"coordinates\": [\n          \"@@ŬgX§Ü«E¶FÌ¬O_ïlÁgz±AXeµÄĵ{¶]gitgIj·¥îakS¨ÐƎk}ĕ{gBqGf{¿aU^fIư³õ{YıëNĿk©ïËZŏR§òoY×Ógcĥs¡bġ«@dekąI[nlPqCnp{ō³°`{PNdƗqSÄĻNNâyj]äÒD ĬH°Æ]~¡HO¾X}ÐxgpgWrDGpù^LrzWxZ^¨´T\\\\|~@IzbĤjeĊªz£®ĔvěLmV¾Ô_ÈNW~zbĬvG²ZmDM~~\"\n        ],\n        \"encodeOffsets\": [[120237, 41215]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"310000\",\n      \"properties\": {\n        \"id\": \"310000\",\n        \"cp\": [121.472644, 31.231706],\n        \"name\": \"上海\",\n        \"childNum\": 6\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\"@@ɧư¬EpƸÁxc\"],\n          [\"@@©ª\"],\n          [\"@@MA\"],\n          [\"@@QpİE§ÉC¾\"],\n          [\"@@bŝÕÕEȣÚƥêImɇǦèÜĠÚÃƌÃ͎ó\"],\n          [\"@@ǜûȬɋŭ×^sYɍDŋŽąñCG²«ªč@h_p¯A{oloY¬j@Ĳ`gQÚhr|ǀ^MĲvtbe´R¯Ô¬¨Yô¤r]ìƬį\"]\n        ],\n        \"encodeOffsets\": [[[124702, 32062]], [[124547, 32200]], [[124808, 31991]], [[124726, 32110]], [[124903, 32376]], [[124438, 32149]]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"500000\",\n      \"properties\": {\n        \"id\": \"500000\",\n        \"cp\": [107.304962, 29.533155],\n        \"name\": \"重庆\",\n        \"childNum\": 2\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\n            \"@@vjG~nGŘŬĶȂƀƾ¹¸ØÎezĆT¸}êÐqHðqĖä¥^CÆIj²p\\\\_ æüY|[YxƊæu°xb®Űb@~¢NQt°¶Sæ Ê~rǉĔëĚ¢~uf`faĔJåĊnÖ]jƎćÊ@£¾a®£Ű{ŶĕFègLk{Y|¡ĜWƔtƬJÑxq±ĢN´òKLÈÃ¼D|s`ŋć]Ã`đMûƱ½~Y°ħ`ƏíW½eI½{aOIrÏ¡ĕŇapµÜƅġ^ÖÛbÙŽŏml½SêqDu[RãË»ÿw`»y¸_ĺę}÷`M¯ċfCVµqŉ÷Zgg`d½pDOÎCn^uf²ènh¼WtƏxRGg¦pVFI±G^Ic´ecGĹÞ½sëĬhxW}KÓe­XsbkF¦LØgTkïƵNï¶}Gyw\\\\oñ¡nmĈzj@Óc£»Wă¹Ój_m»¹·~MvÛaq»­ê\\\\ÂoVnÓØÍ²«bq¿efE Ĝ^Q~ Évýş¤²ĮpEİ}zcĺL½¿gÅ¡ýE¡ya£³t\\\\¨\\\\vú»¼§·Ñr_oÒý¥u_n»_At©ÞÅ±ā§IVeëY}{VPÀFA¨ąB}q@|Ou\\\\FmQFÝMwå}]|FmÏCawu_p¯sfÙgYDHl`{QEfNysB¦zG¸rHeN\\\\CvEsÐùÜ_·ÖĉsaQ¯}_UxÃđqNH¬Äd^ÝŰR¬ã°wećJE·vÝ·HgéFXjÉê`|ypxkAwWĐpb¥eOsmzwqChóUQl¥F^lafanòsrEvfQdÁUVfÎvÜ^eftET¬ôA\\\\¢sJnQTjPØxøK|nBzĞ»LYFDxÓvr[ehľvN¢o¾NiÂxGpâ¬zbfZo~hGi]öF||NbtOMn eA±tPTLjpYQ|SHYĀxinzDJÌg¢và¥Pg_ÇzIIII£®S¬ØsÎ¼£N\"\n          ],\n          [\"@@ifjN@s\"]\n        ],\n        \"encodeOffsets\": [[[109628, 30765]], [[111725, 31320]]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"810000\",\n      \"properties\": {\n        \"id\": \"810000\",\n        \"cp\": [114.173355, 22.320048],\n        \"name\": \"香港\",\n        \"childNum\": 5\n      },\n      \"geometry\": {\n        \"type\": \"MultiPolygon\",\n        \"coordinates\": [\n          [\"@@AlBk\"],\n          [\"@@mn\"],\n          [\"@@EpFo\"],\n          [\"@@ea¢pl¸Eõ¹hj[]ÔCÎ@lj¡uBX´AI¹[yDU]W`çwZkmcMpÅv}IoJlcafŃK°ä¬XJmÐ đhI®æÔtSHnEÒrÈc\"],\n          [\"@@rMUwAS®e\"]\n        ],\n        \"encodeOffsets\": [[[117111, 23002]], [[117072, 22876]], [[117045, 22887]], [[116975, 23082]], [[116882, 22747]]]\n      }\n    },\n    {\n      \"type\": \"Feature\",\n      \"id\": \"820000\",\n      \"properties\": { \"id\": \"820000\", \"cp\": [113.54909, 22.198951], \"name\": \"澳门\", \"childNum\": 1 },\n      \"geometry\": {\n        \"type\": \"Polygon\",\n        \"coordinates\": [\"@@kÊd°å§s\"],\n        \"encodeOffsets\": [[116279, 22639]]\n      }\n    }\n  ],\n  \"UTF8Encoding\": true\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/charts/data.ts",
    "content": "export const mapData: any = [\n  {\n    name: '北京',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '天津',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '上海',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '重庆',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '河北',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '河南',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '云南',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '辽宁',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '黑龙江',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '湖南',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '安徽',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '山东',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '新疆',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '江苏',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '浙江',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '江西',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '湖北',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '广西',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '甘肃',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '山西',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '内蒙古',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '陕西',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '吉林',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '福建',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '贵州',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '广东',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '青海',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '西藏',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '四川',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '宁夏',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '海南',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '台湾',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '香港',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n  {\n    name: '澳门',\n    value: Math.round(Math.random() * 1000),\n    tipData: [Math.round(Math.random() * 1000), Math.round(Math.random() * 1000)],\n  },\n];\n\nexport const getLineData = (() => {\n  const category: any[] = [];\n  let dottedBase = +new Date();\n  const lineData: any[] = [];\n  const barData: any[] = [];\n\n  for (let i = 0; i < 20; i++) {\n    const date = new Date((dottedBase += 1000 * 3600 * 24));\n    category.push([date.getFullYear(), date.getMonth() + 1, date.getDate()].join('-'));\n    const b = Math.random() * 200;\n    const d = Math.random() * 200;\n    barData.push(b);\n    lineData.push(d + b);\n  }\n  return { barData, category, lineData };\n})();\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/charts/map/Baidu.vue",
    "content": "<template>\n  <div ref=\"wrapRef\" :style=\"{ height, width }\"></div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, nextTick, unref, onMounted } from 'vue';\n\n  import { useScript } from '/@/hooks/web/useScript';\n\n  const BAI_DU_MAP_URL = 'https://api.map.baidu.com/getscript?v=3.0&ak=OaBvYmKX3pjF7YFUFeeBCeGdy9Zp7xB2&services=&t=20210201100830&s=1';\n  export default defineComponent({\n    name: 'BaiduMap',\n    props: {\n      width: {\n        type: String,\n        default: '100%',\n      },\n      height: {\n        type: String,\n        default: 'calc(100vh - 78px)',\n      },\n    },\n    setup() {\n      const wrapRef = ref<HTMLDivElement | null>(null);\n      const { toPromise } = useScript({ src: BAI_DU_MAP_URL });\n\n      async function initMap() {\n        await toPromise();\n        await nextTick();\n        const wrapEl = unref(wrapRef);\n        if (!wrapEl) return;\n        const BMap = (window as any).BMap;\n        const map = new BMap.Map(wrapEl);\n        const point = new BMap.Point(116.404, 39.915);\n        map.centerAndZoom(point, 15);\n        map.enableScrollWheelZoom(true);\n      }\n\n      onMounted(() => {\n        initMap();\n      });\n\n      return { wrapRef };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/charts/map/Gaode.vue",
    "content": "<template>\n  <div ref=\"wrapRef\" :style=\"{ height, width }\"></div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, nextTick, unref, onMounted } from 'vue';\n\n  import { useScript } from '/@/hooks/web/useScript';\n\n  const A_MAP_URL = 'https://webapi.amap.com/maps?v=2.0&key=06313eb9c6563b674a8fd789db0692c3';\n\n  export default defineComponent({\n    name: 'AMap',\n    props: {\n      width: {\n        type: String,\n        default: '100%',\n      },\n      height: {\n        type: String,\n        default: 'calc(100vh - 78px)',\n      },\n    },\n    setup() {\n      const wrapRef = ref<HTMLDivElement | null>(null);\n      const { toPromise } = useScript({ src: A_MAP_URL });\n\n      async function initMap() {\n        await toPromise();\n        await nextTick();\n        const wrapEl = unref(wrapRef);\n        if (!wrapEl) return;\n        const AMap = (window as any).AMap;\n        new AMap.Map(wrapEl, {\n          zoom: 11,\n          center: [116.397428, 39.90923],\n          viewMode: '3D',\n        });\n      }\n\n      onMounted(() => {\n        initMap();\n      });\n\n      return { wrapRef };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/charts/map/Google.vue",
    "content": "<template>\n  <div ref=\"wrapRef\" :style=\"{ height, width }\"></div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, nextTick, unref, onMounted } from 'vue';\n\n  import { useScript } from '/@/hooks/web/useScript';\n\n  const MAP_URL = 'https://maps.googleapis.com/maps/api/js?key=AIzaSyBQWrGwj4gAzKndcbwD5favT9K0wgty_0&signed_in=true';\n\n  export default defineComponent({\n    name: 'GoogleMap',\n    props: {\n      width: {\n        type: String,\n        default: '100%',\n      },\n      height: {\n        type: String,\n        default: 'calc(100vh - 78px)',\n      },\n    },\n    setup() {\n      const wrapRef = ref<HTMLDivElement | null>(null);\n      const { toPromise } = useScript({ src: MAP_URL });\n\n      async function initMap() {\n        await toPromise();\n        await nextTick();\n        const wrapEl = unref(wrapRef);\n        if (!wrapEl) return;\n        const google = (window as any).google;\n        const latLng = { lat: 116.404, lng: 39.915 };\n        const map = new google.maps.Map(wrapEl, {\n          zoom: 4,\n          center: latLng,\n        });\n        new google.maps.Marker({\n          position: latLng,\n          map: map,\n          title: 'Hello World!',\n        });\n      }\n\n      onMounted(() => {\n        initMap();\n      });\n\n      return { wrapRef };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/codemirror/index.vue",
    "content": "<template>\n  <div>\n    <textarea ref=\"textarea\">\n白日依山尽，黄河入海流。\n欲穷千里目，更上一层楼。\n        </textarea\n    >\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, onMounted, ref, reactive } from 'vue';\n  // 引入全局实例\n  import _CodeMirror from 'codemirror';\n\n  // 核心样式\n  import 'codemirror/lib/codemirror.css';\n  // 引入主题后还需要在 options 中指定主题才会生效\n  import 'codemirror/theme/cobalt.css';\n\n  // 需要引入具体的语法高亮库才会有对应的语法高亮效果\n  // codemirror 官方其实支持通过 /addon/mode/loadmode.js 和 /mode/meta.js 来实现动态加载对应语法高亮库\n  // 但 vue 貌似没有无法在实例初始化后再动态加载对应 JS ，所以此处才把对应的 JS 提前引入\n  import 'codemirror/mode/javascript/javascript.js';\n  import 'codemirror/mode/css/css.js';\n  import 'codemirror/mode/xml/xml.js';\n  import 'codemirror/mode/clike/clike.js';\n  import 'codemirror/mode/markdown/markdown.js';\n  import 'codemirror/mode/python/python.js';\n  import 'codemirror/mode/r/r.js';\n  import 'codemirror/mode/shell/shell.js';\n  import 'codemirror/mode/sql/sql.js';\n  import 'codemirror/mode/swift/swift.js';\n  import 'codemirror/mode/vue/vue.js';\n  // 尝试获取全局实例\n\n  export default defineComponent({\n    components: {},\n    setup() {\n      const CodeMirror = window.CodeMirror || _CodeMirror;\n\n      const textarea = ref(null);\n      const options = reactive({\n        // 缩进格式\n        tabSize: 2,\n        // 主题，对应主题库 JS 需要提前引入\n        theme: 'cobalt',\n        // 显示行号\n        lineNumbers: true,\n        line: true,\n      });\n      onMounted(() => {\n        init();\n      });\n\n      function init() {\n        CodeMirror.fromTextArea(textarea.value, options);\n      }\n\n      return {\n        textarea,\n      };\n    },\n  });\n</script>\n\n<style lang=\"css\" scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/button/index.vue",
    "content": "<template>\n  <PageWrapper\n    contentFullHeight\n    title=\"基础组件\"\n    content=\" 基础组件依赖于ant-design-vue,组件库已有的基础组件,项目中不会再次进行demo展示（二次封装组件除外）\"\n  >\n    <a-row :gutter=\"[20, 20]\">\n      <a-col :xl=\"10\" :lg=\"24\">\n        <a-card title=\"BasicButton Color\">\n          <div class=\"my-2\">\n            <h3>success</h3>\n            <div class=\"py-2\">\n              <a-button color=\"success\"> 成功 </a-button>\n              <a-button color=\"success\" class=\"ml-2\" disabled> 禁用 </a-button>\n              <a-button color=\"success\" class=\"ml-2\" loading> loading </a-button>\n              <a-button color=\"success\" type=\"link\" class=\"ml-2\"> link </a-button>\n              <a-button color=\"success\" type=\"link\" class=\"ml-2\" loading> loading link </a-button>\n              <a-button color=\"success\" type=\"link\" class=\"ml-2\" disabled> disabled link </a-button>\n            </div>\n          </div>\n\n          <div class=\"my-2\">\n            <h3>warning</h3>\n            <a-button color=\"warning\"> 警告 </a-button>\n            <a-button color=\"warning\" class=\"ml-2\" disabled> 禁用 </a-button>\n            <a-button color=\"warning\" class=\"ml-2\" loading> loading </a-button>\n            <a-button color=\"warning\" type=\"link\" class=\"ml-2\"> link </a-button>\n            <a-button color=\"warning\" type=\"link\" class=\"ml-2\" loading> loading link </a-button>\n            <a-button color=\"warning\" type=\"link\" class=\"ml-2\" disabled> disabled link </a-button>\n          </div>\n\n          <div class=\"my-2\">\n            <h3>error</h3>\n            <a-button color=\"error\"> 错误 </a-button>\n            <a-button color=\"error\" class=\"ml-2\" disabled> 禁用 </a-button>\n            <a-button color=\"error\" class=\"ml-2\" loading> loading </a-button>\n            <a-button color=\"error\" type=\"link\" class=\"ml-2\"> link </a-button>\n            <a-button color=\"error\" type=\"link\" class=\"ml-2\" loading> loading link </a-button>\n            <a-button color=\"error\" type=\"link\" class=\"ml-2\" disabled> disabled link </a-button>\n          </div>\n\n          <div class=\"my-2\">\n            <h3>ghost</h3>\n            <a-button ghost color=\"success\" class=\"ml-2\"> 幽灵成功 </a-button>\n            <a-button ghost color=\"warning\" class=\"ml-2\"> 幽灵警告 </a-button>\n            <a-button ghost color=\"error\" class=\"ml-2\"> 幽灵错误 </a-button>\n            <a-button ghost type=\"dashed\" color=\"warning\" class=\"ml-2\"> 幽灵警告dashed </a-button>\n            <a-button ghost danger class=\"ml-2\"> 幽灵危险 </a-button>\n          </div>\n        </a-card>\n      </a-col>\n      <a-col :xl=\"14\" :lg=\"24\">\n        <a-card title=\"BasicButton Types\">\n          <div class=\"my-2\">\n            <h3>primary</h3>\n            <a-button type=\"primary\" preIcon=\"mdi:page-next-outline\"> 主按钮 </a-button>\n            <a-button type=\"primary\" class=\"ml-2\" disabled> 禁用 </a-button>\n            <a-button type=\"primary\" class=\"ml-2\" danger preIcon=\"mdi:page-next-outline\"> 危险 </a-button>\n            <a-button type=\"primary\" class=\"ml-2\" loading> loading </a-button>\n            <a-button type=\"link\" class=\"ml-2\"> link </a-button>\n            <a-button type=\"link\" class=\"ml-2\" loading> loading link </a-button>\n            <a-button type=\"link\" class=\"ml-2\" disabled> disabled link </a-button>\n          </div>\n\n          <div class=\"my-2\">\n            <h3>default</h3>\n            <a-button type=\"default\"> 默认 </a-button>\n            <a-button type=\"default\" class=\"ml-2\" disabled> 禁用 </a-button>\n            <a-button type=\"default\" class=\"ml-2\" danger> 危险 </a-button>\n            <a-button type=\"default\" class=\"ml-2\" loading> loading </a-button>\n            <a-button type=\"link\" class=\"ml-2\"> link </a-button>\n            <a-button type=\"link\" class=\"ml-2\" loading> loading link </a-button>\n            <a-button type=\"link\" class=\"ml-2\" disabled> disabled link </a-button>\n          </div>\n\n          <div class=\"my-2\">\n            <h3>dashed</h3>\n            <a-button type=\"dashed\"> dashed </a-button>\n            <a-button type=\"dashed\" class=\"ml-2\" disabled> 禁用 </a-button>\n            <a-button type=\"dashed\" class=\"ml-2\" danger> 危险 </a-button>\n            <a-button type=\"dashed\" class=\"ml-2\" loading> loading </a-button>\n          </div>\n\n          <div class=\"my-2\">\n            <h3>ghost 常规幽灵按钮通常用于有色背景下</h3>\n            <div class=\"bg-gray-400 py-2\">\n              <a-button ghost type=\"primary\" class=\"ml-2\"> 幽灵主要 </a-button>\n              <a-button ghost type=\"default\" class=\"ml-2\"> 幽灵默认 </a-button>\n              <a-button ghost type=\"dashed\" class=\"ml-2\"> 幽灵dashed </a-button>\n              <a-button ghost type=\"primary\" class=\"ml-2\" disabled> 禁用 </a-button>\n              <a-button ghost type=\"primary\" class=\"ml-2\" loading> loading </a-button>\n            </div>\n            <!-- antd 按钮不能同时使用ghost和link -->\n            <!--      <a-button ghost type=\"link\" class=\"ml-2\"> link </a-button>-->\n            <!--      <a-button ghost type=\"link\" class=\"ml-2\" loading> loading link </a-button>-->\n            <!--      <a-button ghost type=\"link\" class=\"ml-2\" disabled> disabled link </a-button>-->\n          </div>\n        </a-card>\n      </a-col>\n    </a-row>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { PageWrapper } from '/@/components/Page';\n  import { Card, Row, Col } from 'ant-design-vue';\n  export default defineComponent({\n    components: { PageWrapper, ACard: Card, ARow: Row, ACol: Col },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/card-list/index.vue",
    "content": "<template>\n  <PageWrapper title=\"卡片列表示例\" content=\"基础封装\">\n    <CardList :params=\"params\" :api=\"demoListApi\" @getMethod=\"getMethod\" @delete=\"handleDel\">\n      <template #header>\n        <Button type=\"primary\" color=\"error\"> 按钮1 </Button>\n        <Button type=\"primary\" color=\"success\"> 按钮2 </Button>\n      </template>\n    </CardList>\n  </PageWrapper>\n</template>\n<script lang=\"ts\" setup>\n  import { CardList } from '/@/components/CardList';\n  import { Button } from '/@/components/Button';\n  import { PageWrapper } from '/@/components/Page';\n  import { demoListApi } from '/@/api/demo/table';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  const { notification } = useMessage();\n  // 请求api时附带参数\n  const params = {};\n\n  let reload = () => {};\n  // 获取内部fetch方法;\n  function getMethod(m: any) {\n    reload = m;\n  }\n  //删除按钮事件\n  function handleDel(id) {\n    console.log(id);\n    notification.success({ message: `成功删除${id}` });\n    reload();\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/count-to/index.vue",
    "content": "<template>\n  <PageWrapper title=\"数字动画示例\">\n    <Card>\n      <CardGrid class=\"count-to-demo-card\">\n        <CountTo prefix=\"$\" :color=\"'#409EFF'\" :startVal=\"1\" :endVal=\"200000\" :duration=\"8000\" />\n      </CardGrid>\n      <CardGrid class=\"count-to-demo-card\">\n        <CountTo suffix=\"$\" :color=\"'red'\" :startVal=\"1\" :endVal=\"300000\" :decimals=\"2\" :duration=\"6000\" />\n      </CardGrid>\n      <CardGrid class=\"count-to-demo-card\">\n        <CountTo suffix=\"$\" :color=\"'rgb(0,238,0)'\" :startVal=\"1\" :endVal=\"400000\" :duration=\"7000\" />\n      </CardGrid>\n      <CardGrid class=\"count-to-demo-card\">\n        <CountTo separator=\"-\" :color=\"'rgba(138,43,226,.6)'\" :startVal=\"10000\" :endVal=\"500000\" :duration=\"8000\" />\n      </CardGrid>\n    </Card>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { Card } from 'ant-design-vue';\n  import { CountTo } from '/@/components/CountTo/index';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: {\n      Card,\n      CardGrid: Card.Grid,\n      CountTo,\n      PageWrapper,\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .count-to-demo {\n    &-card {\n      width: 50%;\n      font-size: 30px;\n      text-align: center;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/cropper/index.vue",
    "content": "<template>\n  <PageWrapper title=\"图片裁剪示例\" content=\"需要开启测试接口服务才能进行上传测试！\">\n    <CollapseContainer title=\"头像裁剪\">\n      <CropperAvatar :uploadApi=\"uploadApi\" :value=\"avatar\" />\n    </CollapseContainer>\n\n    <CollapseContainer title=\"矩形裁剪\" class=\"my-4\">\n      <div class=\"container p-4\">\n        <div class=\"cropper-container mr-10\">\n          <CropperImage ref=\"refCropper\" :src=\"img\" @cropend=\"handleCropend\" style=\"width: 40vw\" />\n        </div>\n        <img :src=\"cropperImg\" class=\"croppered\" v-if=\"cropperImg\" alt=\"\" />\n      </div>\n      <p v-if=\"cropperImg\">裁剪后图片信息：{{ info }}</p>\n    </CollapseContainer>\n\n    <CollapseContainer title=\"圆形裁剪\">\n      <div class=\"container p-4\">\n        <div class=\"cropper-container mr-10\">\n          <CropperImage ref=\"refCropper\" :src=\"img\" @cropend=\"handleCircleCropend\" style=\"width: 40vw\" circled />\n        </div>\n        <img :src=\"circleImg\" class=\"croppered\" v-if=\"circleImg\" />\n      </div>\n      <p v-if=\"circleImg\">裁剪后图片信息：{{ circleInfo }}</p>\n    </CollapseContainer>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import { PageWrapper } from '/@/components/Page';\n  import { CollapseContainer } from '/@/components/Container';\n  import { CropperImage, CropperAvatar } from '/@/components/Cropper';\n  import { uploadApi } from '/@/api/sys/upload';\n  import img from '/@/assets/images/header.jpg';\n  import { useUserStore } from '/@/store/modules/user';\n\n  export default defineComponent({\n    components: {\n      PageWrapper,\n      CropperImage,\n      CollapseContainer,\n      CropperAvatar,\n    },\n    setup() {\n      const info = ref('');\n      const cropperImg = ref('');\n      const circleInfo = ref('');\n      const circleImg = ref('');\n      const userStore = useUserStore();\n      const avatar = ref(userStore.getUserInfo?.avatar || '');\n      function handleCropend({ imgBase64, imgInfo }) {\n        info.value = imgInfo;\n        cropperImg.value = imgBase64;\n      }\n\n      function handleCircleCropend({ imgBase64, imgInfo }) {\n        circleInfo.value = imgInfo;\n        circleImg.value = imgBase64;\n      }\n\n      return {\n        img,\n        info,\n        circleInfo,\n        cropperImg,\n        circleImg,\n        handleCropend,\n        handleCircleCropend,\n        avatar,\n        uploadApi: uploadApi as any,\n      };\n    },\n  });\n</script>\n\n<style scoped>\n  .container {\n    display: flex;\n    width: 100vw;\n    align-items: center;\n  }\n\n  .cropper-container {\n    width: 40vw;\n  }\n\n  .croppered {\n    height: 360px;\n  }\n\n  p {\n    margin: 10px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/desc/index.vue",
    "content": "<template>\n  <PageWrapper title=\"详情组件示例\">\n    <Description title=\"基础示例\" :collapseOptions=\"{ canExpand: true, helpMessage: 'help me' }\" :column=\"3\" :data=\"mockData\" :schema=\"schema\" />\n\n    <Description\n      class=\"mt-4\"\n      title=\"垂直示例\"\n      layout=\"vertical\"\n      :collapseOptions=\"{ canExpand: true, helpMessage: 'help me' }\"\n      :column=\"2\"\n      :data=\"mockData\"\n      :schema=\"schema\"\n    />\n\n    <Description @register=\"register\" class=\"mt-4\" />\n    <Description @register=\"register1\" class=\"mt-4\" />\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { Description, DescItem, useDescription } from '/@/components/Description/index';\n  import { PageWrapper } from '/@/components/Page';\n\n  const mockData: Recordable = {\n    username: 'test',\n    nickName: 'VB',\n    age: '123',\n    phone: '15695909xxx',\n    email: '190848757@qq.com',\n    addr: '厦门市思明区',\n    sex: '男',\n    certy: '3504256199xxxxxxxxx',\n    tag: 'orange',\n  };\n  const schema: DescItem[] = [\n    {\n      field: 'username',\n      label: '用户名',\n    },\n    {\n      field: 'nickName',\n      label: '昵称',\n      render: (curVal, data) => {\n        return `${data.username}-${curVal}`;\n      },\n    },\n    {\n      field: 'phone',\n      label: '联系电话',\n    },\n    {\n      field: 'email',\n      label: '邮箱',\n    },\n    {\n      field: 'addr',\n      label: '地址',\n    },\n  ];\n  export default defineComponent({\n    components: { Description, PageWrapper },\n    setup() {\n      const [register] = useDescription({\n        title: 'useDescription',\n        data: mockData,\n        schema: schema,\n      });\n\n      const [register1] = useDescription({\n        title: '无边框',\n        bordered: false,\n        data: mockData,\n        schema: schema,\n      });\n\n      return { mockData, schema, register, register1 };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/drawer/Drawer1.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"$attrs\" title=\"Drawer Title\" width=\"50%\"> Drawer Info. </BasicDrawer>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicDrawer } from '/@/components/Drawer';\n  export default defineComponent({\n    components: { BasicDrawer },\n    setup() {\n      return {};\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/drawer/Drawer2.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"$attrs\" @register=\"register\" title=\"Drawer Title\" width=\"50%\">\n    Drawer Info.\n    <a-button type=\"primary\" @click=\"closeDrawer\"> 内部关闭drawer </a-button>\n  </BasicDrawer>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';\n  export default defineComponent({\n    components: { BasicDrawer },\n    setup() {\n      const [register, { closeDrawer }] = useDrawerInner();\n      return { register, closeDrawer };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/drawer/Drawer3.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"$attrs\" title=\"Modal Title\" width=\"50%\" showFooter @ok=\"handleOk\">\n    <p class=\"h-20\" v-for=\"index in 40\" :key=\"index\"> 根据屏幕高度自适应 </p>\n    <template #insertFooter>\n      <a-button> btn</a-button>\n    </template>\n    <template #centerFooter>\n      <a-button> btn2</a-button>\n    </template>\n\n    <template #appendFooter>\n      <a-button> btn3</a-button>\n    </template>\n\n    <!-- <template #footer>\n      <a-button> customerFooter</a-button>\n    </template> -->\n  </BasicDrawer>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicDrawer } from '/@/components/Drawer';\n  export default defineComponent({\n    components: { BasicDrawer },\n    setup() {\n      return {\n        handleOk: () => {\n          console.log('=====================');\n          console.log('ok');\n          console.log('======================');\n        },\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/drawer/Drawer4.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"$attrs\" @register=\"register\" title=\"Drawer Title\" width=\"50%\">\n    <div>\n      <BasicForm @register=\"registerForm\" />\n    </div>\n  </BasicDrawer>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';\n\n  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';\n  const schemas: FormSchema[] = [\n    {\n      field: 'field1',\n      component: 'Input',\n      label: '字段1',\n      colProps: {\n        span: 12,\n      },\n      defaultValue: '111',\n    },\n    {\n      field: 'field2',\n      component: 'Input',\n      label: '字段2',\n      colProps: {\n        span: 12,\n      },\n    },\n  ];\n  export default defineComponent({\n    components: { BasicDrawer, BasicForm },\n    setup() {\n      const [registerForm, { setFieldsValue }] = useForm({\n        labelWidth: 120,\n        schemas,\n        showActionButtonGroup: false,\n        actionColOptions: {\n          span: 24,\n        },\n      });\n      const [register] = useDrawerInner((data) => {\n        // 方式1\n        setFieldsValue({\n          field2: data.data,\n          field1: data.info,\n        });\n      });\n      return { register, schemas, registerForm };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/drawer/Drawer5.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"$attrs\" :isDetail=\"true\" title=\"Drawer Title5\">\n    <p class=\"h-20\"> Content Message </p>\n    <template #titleToolbar> toolbar </template>\n  </BasicDrawer>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicDrawer } from '/@/components/Drawer';\n  export default defineComponent({\n    components: { BasicDrawer },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/drawer/index.vue",
    "content": "<template>\n  <PageWrapper title=\"抽屉组件使用示例\">\n    <Alert message=\"使用 useDrawer 进行抽屉操作\" show-icon />\n    <a-button type=\"primary\" class=\"my-4\" @click=\"openDrawerLoading\"> 打开Drawer </a-button>\n\n    <Alert message=\"内外同时控制显示隐藏\" show-icon />\n    <a-button type=\"primary\" class=\"my-4\" @click=\"openDrawer2(true)\"> 打开Drawer </a-button>\n    <Alert message=\"自适应高度/显示footer\" show-icon />\n    <a-button type=\"primary\" class=\"my-4\" @click=\"openDrawer3(true)\"> 打开Drawer </a-button>\n\n    <Alert message=\"内外数据交互\" show-icon />\n    <a-button type=\"primary\" class=\"my-4\" @click=\"send\"> 打开Drawer并传递数据 </a-button>\n    <Alert message=\"详情页模式\" show-icon />\n    <a-button type=\"primary\" class=\"my-4\" @click=\"openDrawer5(true)\"> 打开详情Drawer </a-button>\n    <Drawer1 @register=\"register1\" />\n    <Drawer2 @register=\"register2\" />\n    <Drawer3 @register=\"register3\" />\n    <Drawer4 @register=\"register4\" />\n    <Drawer5 @register=\"register5\" />\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { Alert } from 'ant-design-vue';\n  import { useDrawer } from '/@/components/Drawer';\n  import Drawer1 from './Drawer1.vue';\n  import Drawer2 from './Drawer2.vue';\n  import Drawer3 from './Drawer3.vue';\n  import Drawer4 from './Drawer4.vue';\n  import Drawer5 from './Drawer5.vue';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { Alert, PageWrapper, Drawer1, Drawer2, Drawer3, Drawer4, Drawer5 },\n    setup() {\n      const [register1, { openDrawer: openDrawer1, setDrawerProps }] = useDrawer();\n      const [register2, { openDrawer: openDrawer2 }] = useDrawer();\n      const [register3, { openDrawer: openDrawer3 }] = useDrawer();\n      const [register4, { openDrawer: openDrawer4 }] = useDrawer();\n      const [register5, { openDrawer: openDrawer5 }] = useDrawer();\n      function send() {\n        openDrawer4(true, {\n          data: 'content',\n          info: 'Info',\n        });\n      }\n      function openDrawerLoading() {\n        openDrawer1();\n        setDrawerProps({ loading: true });\n        setTimeout(() => {\n          setDrawerProps({ loading: false });\n        }, 2000);\n      }\n      return {\n        register1,\n        openDrawer1,\n        register2,\n        openDrawer2,\n        register3,\n        openDrawer3,\n        register4,\n        register5,\n        openDrawer5,\n        send,\n        openDrawerLoading,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/lazy/TargetContent.vue",
    "content": "<template>\n  <Card hoverable :style=\"{ width: '240px', background: '#fff' }\">\n    <template #cover>\n      <img alt=\"example\" src=\"https://os.alipayobjects.com/rmsportal/QBnOOoLaAfKPirc.png\" />\n    </template>\n    <CardMeta title=\"懒加载组件\" />\n  </Card>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { Card } from 'ant-design-vue';\n\n  export default defineComponent({\n    components: { CardMeta: Card.Meta, Card },\n    setup() {\n      return {};\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/lazy/Transition.vue",
    "content": "<template>\n  <PageWrapper title=\"懒加载自定义动画示例\" content=\"懒加载组件显示动画\">\n    <div class=\"lazy-base-demo-wrap\">\n      <h1>向下滚动</h1>\n\n      <div class=\"lazy-base-demo-box\">\n        <LazyContainer transitionName=\"custom\">\n          <TargetContent />\n        </LazyContainer>\n      </div>\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import TargetContent from './TargetContent.vue';\n  import { LazyContainer } from '/@/components/Container/index';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { LazyContainer, TargetContent, PageWrapper },\n  });\n</script>\n<style lang=\"less\">\n  .lazy-base-demo {\n    &-wrap {\n      display: flex;\n      width: 50%;\n      height: 2000px;\n      margin: 20px auto;\n      text-align: center;\n      background-color: @component-background;\n      justify-content: center;\n      flex-direction: column;\n      align-items: center;\n    }\n\n    &-box {\n      width: 300px;\n      height: 300px;\n    }\n\n    h1 {\n      height: 1300px;\n      margin: 20px 0;\n    }\n  }\n\n  .custom-enter {\n    opacity: 0;\n    transform: scale(0.4) translate(100%);\n  }\n\n  .custom-enter-to {\n    opacity: 1;\n  }\n\n  .custom-enter-active {\n    position: absolute;\n    top: 0;\n    width: 100%;\n    transition: all 0.5s;\n  }\n\n  .custom-leave {\n    opacity: 1;\n  }\n\n  .custom-leave-to {\n    opacity: 0;\n    transform: scale(0.4) translate(-100%);\n  }\n\n  .custom-leave-active {\n    transition: all 0.5s;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/lazy/index.vue",
    "content": "<template>\n  <PageWrapper title=\"懒加载基础示例\" content=\"向下滚动到可见区域才会加载组件\">\n    <div class=\"lazy-base-demo-wrap\">\n      <h1>向下滚动</h1>\n\n      <div class=\"lazy-base-demo-box\">\n        <LazyContainer>\n          <TargetContent />\n          <template #skeleton>\n            <Skeleton :rows=\"10\" />\n          </template>\n        </LazyContainer>\n      </div>\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { Skeleton } from 'ant-design-vue';\n  import TargetContent from './TargetContent.vue';\n  import { LazyContainer } from '/@/components/Container/index';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { LazyContainer, PageWrapper, TargetContent, Skeleton },\n  });\n</script>\n<style lang=\"less\">\n  .lazy-base-demo {\n    &-wrap {\n      display: flex;\n      width: 50%;\n      height: 2000px;\n      margin: 20px auto;\n      text-align: center;\n      background-color: @component-background;\n      justify-content: center;\n      flex-direction: column;\n      align-items: center;\n    }\n\n    &-box {\n      width: 300px;\n      height: 300px;\n    }\n\n    h1 {\n      height: 1300px;\n      margin: 20px 0;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/loading/index.vue",
    "content": "<template>\n  <PageWrapper v-loading=\"loadingRef\" loading-tip=\"加载中...\" title=\"Loading组件示例\">\n    <div ref=\"wrapEl\">\n      <a-alert message=\"组件方式\" />\n      <a-button class=\"my-4 mr-4\" type=\"primary\" @click=\"openCompFullLoading\"> 全屏 Loading </a-button>\n      <a-button class=\"my-4\" type=\"primary\" @click=\"openCompAbsolute\"> 容器内 Loading </a-button>\n      <Loading :loading=\"loading\" :absolute=\"absolute\" :theme=\"theme\" :background=\"background\" :tip=\"tip\" />\n\n      <a-alert message=\"函数方式\" />\n\n      <a-button class=\"my-4 mr-4\" type=\"primary\" @click=\"openFnFullLoading\"> 全屏 Loading </a-button>\n      <a-button class=\"my-4\" type=\"primary\" @click=\"openFnWrapLoading\"> 容器内 Loading </a-button>\n\n      <a-alert message=\"指令方式\" />\n      <a-button class=\"my-4 mr-4\" type=\"primary\" @click=\"openDirectiveLoading\"> 打开指令Loading </a-button>\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, reactive, toRefs, ref } from 'vue';\n  import { Loading, useLoading } from '/@/components/Loading';\n  import { PageWrapper } from '/@/components/Page';\n  import { Alert } from 'ant-design-vue';\n\n  export default defineComponent({\n    components: { Loading, PageWrapper, [Alert.name]: Alert },\n    setup() {\n      const wrapEl = ref<ElRef>(null);\n\n      const loadingRef = ref(false);\n      const compState = reactive({\n        absolute: false,\n        loading: false,\n        theme: 'dark',\n        background: 'rgba(111,111,111,.7)',\n        tip: '加载中...',\n      });\n      const [openFullLoading, closeFullLoading] = useLoading({\n        tip: '加载中...',\n      });\n\n      const [openWrapLoading, closeWrapLoading] = useLoading({\n        target: wrapEl,\n        props: {\n          tip: '加载中...',\n          absolute: true,\n        },\n      });\n\n      function openLoading(absolute: boolean) {\n        compState.absolute = absolute;\n        compState.loading = true;\n        setTimeout(() => {\n          compState.loading = false;\n        }, 2000);\n      }\n\n      function openCompFullLoading() {\n        openLoading(false);\n      }\n\n      function openCompAbsolute() {\n        openLoading(true);\n      }\n\n      function openFnFullLoading() {\n        openFullLoading();\n\n        setTimeout(() => {\n          closeFullLoading();\n        }, 2000);\n      }\n\n      function openFnWrapLoading() {\n        openWrapLoading();\n\n        setTimeout(() => {\n          closeWrapLoading();\n        }, 2000);\n      }\n\n      function openDirectiveLoading() {\n        loadingRef.value = true;\n        setTimeout(() => {\n          loadingRef.value = false;\n        }, 2000);\n      }\n\n      return {\n        openCompFullLoading,\n        openFnFullLoading,\n        openFnWrapLoading,\n        openCompAbsolute,\n        wrapEl,\n        loadingRef,\n        openDirectiveLoading,\n        ...toRefs(compState),\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/modal/Modal1.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" destroyOnClose @register=\"register\" title=\"Modal Title\" :helpMessage=\"['提示1', '提示2']\" @visible-change=\"handleShow\">\n    <template #insertFooter>\n      <a-button type=\"primary\" danger @click=\"setLines\" :disabled=\"loading\">点我更新内容</a-button>\n    </template>\n    <template v-if=\"loading\">\n      <div class=\"empty-tips\"> 加载中，稍等3秒…… </div>\n    </template>\n    <template v-if=\"!loading\">\n      <ul>\n        <li v-for=\"index in lines\" :key=\"index\">加载完成{{ index }}！</li>\n      </ul>\n    </template>\n  </BasicModal>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, watch } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  export default defineComponent({\n    components: { BasicModal },\n    setup() {\n      const loading = ref(true);\n      const lines = ref(10);\n      const [register, { setModalProps, redoModalHeight }] = useModalInner();\n\n      watch(\n        () => lines.value,\n        () => {\n          redoModalHeight();\n        }\n      );\n\n      function handleShow(visible: boolean) {\n        if (visible) {\n          loading.value = true;\n          setModalProps({ loading: true, confirmLoading: true });\n          setTimeout(() => {\n            lines.value = Math.round(Math.random() * 30 + 5);\n            loading.value = false;\n            setModalProps({ loading: false, confirmLoading: false });\n          }, 3000);\n        }\n      }\n\n      function setLines() {\n        lines.value = Math.round(Math.random() * 20 + 10);\n      }\n      return { register, loading, handleShow, lines, setLines };\n    },\n  });\n</script>\n<style scoped>\n  .empty-tips {\n    height: 100px;\n    line-height: 100px;\n    text-align: center;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/modal/Modal2.vue",
    "content": "<template>\n  <BasicModal @register=\"register\" title=\"Modal Title\" :helpMessage=\"['提示1', '提示2']\" :okButtonProps=\"{ disabled: true }\">\n    <a-button type=\"primary\" @click=\"closeModal\" class=\"mr-2\"> 从内部关闭弹窗 </a-button>\n    <a-button type=\"primary\" @click=\"setModalProps\"> 从内部修改title </a-button>\n  </BasicModal>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  export default defineComponent({\n    components: { BasicModal },\n    setup() {\n      const [register, { closeModal, setModalProps }] = useModalInner();\n      return {\n        register,\n        closeModal,\n        setModalProps: () => {\n          setModalProps({ title: 'Modal New Title' });\n        },\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/modal/Modal3.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" title=\"Modal Title\" :helpMessage=\"['提示1', '提示2']\" width=\"700px\">\n    <p class=\"h-20\" v-for=\"index in 20\" :key=\"index\"> 根据屏幕高度自适应 </p>\n  </BasicModal>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicModal } from '/@/components/Modal';\n  export default defineComponent({\n    components: { BasicModal },\n    setup() {\n      return {};\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/modal/Modal4.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"register\" title=\"Modal Title\" @visible-change=\"handleVisibleChange\">\n    <div class=\"pt-3px pr-3px\">\n      <BasicForm @register=\"registerForm\" :model=\"model\" />\n    </div>\n  </BasicModal>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, nextTick } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';\n\n  const schemas: FormSchema[] = [\n    {\n      field: 'field1',\n      component: 'Input',\n      label: '字段1',\n      colProps: {\n        span: 24,\n      },\n      defaultValue: '111',\n    },\n    {\n      field: 'field2',\n      component: 'Input',\n      label: '字段2',\n      colProps: {\n        span: 24,\n      },\n    },\n  ];\n  export default defineComponent({\n    components: { BasicModal, BasicForm },\n    props: {\n      userData: { type: Object },\n    },\n    setup(props) {\n      const modelRef = ref({});\n      const [\n        registerForm,\n        {\n          // setFieldsValue,\n          // setProps\n        },\n      ] = useForm({\n        labelWidth: 120,\n        schemas,\n        showActionButtonGroup: false,\n        actionColOptions: {\n          span: 24,\n        },\n      });\n\n      const [register] = useModalInner((data) => {\n        data && onDataReceive(data);\n      });\n\n      function onDataReceive(data) {\n        console.log('Data Received', data);\n        // 方式1;\n        // setFieldsValue({\n        //   field2: data.data,\n        //   field1: data.info,\n        // });\n\n        // // 方式2\n        modelRef.value = { field2: data.data, field1: data.info };\n\n        // setProps({\n        //   model:{ field2: data.data, field1: data.info }\n        // })\n      }\n\n      function handleVisibleChange(v) {\n        v && props.userData && nextTick(() => onDataReceive(props.userData));\n      }\n\n      return { register, schemas, registerForm, model: modelRef, handleVisibleChange };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/modal/index.vue",
    "content": "<template>\n  <PageWrapper title=\"modal组件使用示例\">\n    <Alert\n      message=\"使用 useModal 进行弹窗操作，默认可以拖动，可以通过 draggable\n    参数进行控制是否可以拖动/全屏，并演示了在Modal内动态加载内容并自动调整高度\"\n      show-icon\n    />\n    <a-button type=\"primary\" class=\"my-4\" @click=\"openModalLoading\"> 打开弹窗,加载动态数据并自动调整高度(默认可以拖动/全屏) </a-button>\n\n    <Alert message=\"内外同时同时显示隐藏\" show-icon />\n    <a-button type=\"primary\" class=\"my-4\" @click=\"openModal2\"> 打开弹窗</a-button>\n    <Alert message=\"自适应高度\" show-icon />\n    <a-button type=\"primary\" class=\"my-4\" @click=\"openModal3\"> 打开弹窗</a-button>\n\n    <Alert message=\"内外数据交互\" show-icon />\n    <a-button type=\"primary\" class=\"my-4\" @click=\"send\"> 打开弹窗并传递数据</a-button>\n\n    <Alert message=\"使用动态组件的方式在页面内使用多个弹窗\" show-icon />\n    <a-space>\n      <a-button type=\"primary\" class=\"my-4\" @click=\"openTargetModal(1)\"> 打开弹窗1</a-button>\n      <a-button type=\"primary\" class=\"my-4\" @click=\"openTargetModal(2)\"> 打开弹窗2</a-button>\n      <a-button type=\"primary\" class=\"my-4\" @click=\"openTargetModal(3)\"> 打开弹窗3</a-button>\n      <a-button type=\"primary\" class=\"my-4\" @click=\"openTargetModal(4)\"> 打开弹窗4</a-button>\n    </a-space>\n\n    <component :is=\"currentModal\" v-model:visible=\"modalVisible\" :userData=\"userData\" />\n\n    <Modal1 @register=\"register1\" :minHeight=\"100\" />\n    <Modal2 @register=\"register2\" />\n    <Modal3 @register=\"register3\" />\n    <Modal4 @register=\"register4\" />\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, shallowRef, ComponentOptions, ref, nextTick } from 'vue';\n  import { Alert, Space } from 'ant-design-vue';\n  import { useModal } from '/@/components/Modal';\n  import Modal1 from './Modal1.vue';\n  import Modal2 from './Modal2.vue';\n  import Modal3 from './Modal3.vue';\n  import Modal4 from './Modal4.vue';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { Alert, Modal1, Modal2, Modal3, Modal4, PageWrapper, ASpace: Space },\n    setup() {\n      const currentModal = shallowRef<Nullable<ComponentOptions>>(null);\n      const [register1, { openModal: openModal1 }] = useModal();\n      const [register2, { openModal: openModal2 }] = useModal();\n      const [register3, { openModal: openModal3 }] = useModal();\n      const [register4, { openModal: openModal4 }] = useModal();\n      const modalVisible = ref<Boolean>(false);\n      const userData = ref<any>(null);\n\n      function send() {\n        openModal4(true, {\n          data: 'content',\n          info: 'Info',\n        });\n      }\n\n      function openModalLoading() {\n        openModal1(true);\n        // setModalProps({ loading: true });\n        // setTimeout(() => {\n        //   setModalProps({ loading: false });\n        // }, 2000);\n      }\n\n      function openTargetModal(index) {\n        switch (index) {\n          case 1:\n            currentModal.value = Modal1;\n            break;\n          case 2:\n            currentModal.value = Modal2;\n            break;\n          case 3:\n            currentModal.value = Modal3;\n            break;\n          default:\n            currentModal.value = Modal4;\n            break;\n        }\n        nextTick(() => {\n          // `useModal` not working with dynamic component\n          // passing data through `userData` prop\n          userData.value = { data: Math.random(), info: 'Info222' };\n          // open the target modal\n          modalVisible.value = true;\n        });\n      }\n\n      return {\n        register1,\n        openModal1,\n        register2,\n        openModal2,\n        register3,\n        openModal3,\n        register4,\n        openModal4,\n        modalVisible,\n        userData,\n        openTargetModal,\n        send,\n        currentModal,\n        openModalLoading,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/qrcode/index.vue",
    "content": "<template>\n  <PageWrapper title=\"二维码组件使用示例\">\n    <div class=\"flex flex-wrap\">\n      <CollapseContainer title=\"基础示例\" :canExpan=\"true\" class=\"text-center mb-6 qrcode-demo-item\">\n        <QrCode :value=\"qrCodeUrl\" />\n      </CollapseContainer>\n\n      <CollapseContainer title=\"渲染成img标签示例\" class=\"text-center mb-6 qrcode-demo-item\">\n        <QrCode :value=\"qrCodeUrl\" tag=\"img\" />\n      </CollapseContainer>\n\n      <CollapseContainer title=\"配置样式示例\" class=\"text-center mb-6 qrcode-demo-item\">\n        <QrCode\n          :value=\"qrCodeUrl\"\n          :options=\"{\n            color: { dark: '#55D187' },\n          }\"\n        />\n      </CollapseContainer>\n\n      <CollapseContainer title=\"本地logo示例\" class=\"text-center mb-6 qrcode-demo-item\">\n        <QrCode :value=\"qrCodeUrl\" :logo=\"LogoImg\" />\n      </CollapseContainer>\n\n      <CollapseContainer title=\"在线logo示例\" class=\"text-center mb-6 qrcode-demo-item\">\n        <QrCode\n          :value=\"qrCodeUrl\"\n          logo=\"http://jeecg.com/images/logo.png\"\n          :options=\"{\n            color: { dark: '#55D187' },\n          }\"\n        />\n      </CollapseContainer>\n\n      <CollapseContainer title=\"logo配置示例\" class=\"text-center mb-6 qrcode-demo-item\">\n        <QrCode\n          :value=\"qrCodeUrl\"\n          :logo=\"{\n            src: 'http://jeecg.com/images/logo.png',\n            logoSize: 0.2,\n            borderSize: 0.05,\n            borderRadius: 50,\n            bgColor: 'blue',\n          }\"\n        />\n      </CollapseContainer>\n\n      <CollapseContainer title=\"下载示例\" class=\"text-center qrcode-demo-item\">\n        <QrCode :value=\"qrCodeUrl\" ref=\"qrRef\" :logo=\"LogoImg\" />\n        <a-button class=\"mb-2\" type=\"primary\" @click=\"download\"> 下载 </a-button>\n        <div class=\"msg\"> (在线logo会导致图片跨域，需要下载图片需要自行解决跨域问题) </div>\n      </CollapseContainer>\n\n      <CollapseContainer title=\"配置大小示例\" class=\"text-center qrcode-demo-item\">\n        <QrCode :value=\"qrCodeUrl\" :width=\"300\" />\n      </CollapseContainer>\n\n      <CollapseContainer title=\"扩展绘制示例\" class=\"text-center qrcode-demo-item\">\n        <QrCode :value=\"qrCodeUrl\" :width=\"200\" :options=\"{ margin: 5 }\" ref=\"qrDiyRef\" :logo=\"LogoImg\" @done=\"onQrcodeDone\" />\n        <a-button class=\"mb-2\" type=\"primary\" @click=\"downloadDiy\"> 下载 </a-button>\n        <div class=\"msg\"> 要进行扩展绘制则不能将tag设为img </div>\n      </CollapseContainer>\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, unref } from 'vue';\n  import { QrCode, QrCodeActionType } from '/@/components/Qrcode/index';\n  import LogoImg from '/@/assets/images/logo.png';\n  import { CollapseContainer } from '/@/components/Container/index';\n  import { PageWrapper } from '/@/components/Page';\n\n  const qrCodeUrl = 'https://www.vvbin.cn';\n  export default defineComponent({\n    components: { CollapseContainer, QrCode, PageWrapper },\n    setup() {\n      const qrRef = ref<Nullable<QrCodeActionType>>(null);\n      const qrDiyRef = ref<Nullable<QrCodeActionType>>(null);\n      function download() {\n        const qrEl = unref(qrRef);\n        if (!qrEl) return;\n        qrEl.download('文件名');\n      }\n      function downloadDiy() {\n        const qrEl = unref(qrDiyRef);\n        if (!qrEl) return;\n        qrEl.download('Qrcode');\n      }\n\n      function onQrcodeDone({ ctx }: any) {\n        if (ctx instanceof CanvasRenderingContext2D) {\n          // 额外绘制\n          ctx.fillStyle = 'black';\n          ctx.font = '16px \"微软雅黑\"';\n          ctx.textBaseline = 'bottom';\n          ctx.textAlign = 'center';\n          ctx.fillText('你帅你先扫', 100, 195, 200);\n        }\n      }\n      return {\n        onQrcodeDone,\n        qrCodeUrl,\n        LogoImg,\n        download,\n        downloadDiy,\n        qrRef,\n        qrDiyRef,\n      };\n    },\n  });\n</script>\n<style scoped>\n  .qrcode-demo-item {\n    width: 30%;\n    margin-right: 1%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/scroll/Action.vue",
    "content": "<template>\n  <PageWrapper title=\"滚动组件函数示例\" content=\"基于el-scrollbar\">\n    <div class=\"my-4\">\n      <a-button @click=\"scrollTo(100)\" class=\"mr-2\"> 滚动到100px位置 </a-button>\n      <a-button @click=\"scrollTo(800)\" class=\"mr-2\"> 滚动到800px位置 </a-button>\n      <a-button @click=\"scrollTo(0)\" class=\"mr-2\"> 滚动到顶部 </a-button>\n      <a-button @click=\"scrollBottom()\" class=\"mr-2\"> 滚动到底部 </a-button>\n    </div>\n    <div class=\"scroll-wrap\">\n      <ScrollContainer class=\"mt-4\" ref=\"scrollRef\">\n        <ul class=\"p-3\">\n          <template v-for=\"index in 100\" :key=\"index\">\n            <li class=\"p-2\" :style=\"{ border: '1px solid #eee' }\">\n              {{ index }}\n            </li>\n          </template>\n        </ul>\n      </ScrollContainer>\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, unref } from 'vue';\n  import { ScrollContainer, ScrollActionType } from '/@/components/Container/index';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { ScrollContainer, PageWrapper },\n    setup() {\n      const scrollRef = ref<Nullable<ScrollActionType>>(null);\n      const getScroll = () => {\n        const scroll = unref(scrollRef);\n        if (!scroll) {\n          throw new Error('scroll is Null');\n        }\n        return scroll;\n      };\n\n      function scrollTo(top: number) {\n        getScroll().scrollTo(top);\n      }\n      function scrollBottom() {\n        getScroll().scrollBottom();\n      }\n      return {\n        scrollTo,\n        scrollRef,\n        scrollBottom,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .scroll-wrap {\n    width: 50%;\n    height: 300px;\n    background-color: @component-background;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/scroll/VirtualScroll.vue",
    "content": "<template>\n  <PageWrapper class=\"virtual-scroll-demo\">\n    <Divider>基础滚动示例</Divider>\n    <div class=\"virtual-scroll-demo-wrap\">\n      <VScroll :itemHeight=\"41\" :items=\"data\" :height=\"300\" :width=\"300\">\n        <template #default=\"{ item }\">\n          <div class=\"virtual-scroll-demo__item\">\n            {{ item.title }}\n          </div>\n        </template>\n      </VScroll>\n    </div>\n\n    <Divider>即使不可见，也预先加载50条数据，防止空白</Divider>\n    <div class=\"virtual-scroll-demo-wrap\">\n      <VScroll :itemHeight=\"41\" :items=\"data\" :height=\"300\" :width=\"300\" :bench=\"50\">\n        <template #default=\"{ item }\">\n          <div class=\"virtual-scroll-demo__item\">\n            {{ item.title }}\n          </div>\n        </template>\n      </VScroll>\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { VScroll } from '/@/components/VirtualScroll/index';\n\n  import { Divider } from 'ant-design-vue';\n  import { PageWrapper } from '/@/components/Page';\n  const data: Recordable[] = (() => {\n    const arr: Recordable[] = [];\n    for (let index = 1; index < 20000; index++) {\n      arr.push({\n        title: '列表项' + index,\n      });\n    }\n    return arr;\n  })();\n  export default defineComponent({\n    components: { VScroll: VScroll, Divider, PageWrapper },\n    setup() {\n      return { data: data };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .virtual-scroll-demo {\n    &-wrap {\n      display: flex;\n      margin: 0 30%;\n      background-color: @component-background;\n      justify-content: center;\n    }\n\n    &__item {\n      height: 40px;\n      padding: 0 20px;\n      line-height: 40px;\n      border-bottom: 1px solid @border-color-base;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/scroll/index.vue",
    "content": "<template>\n  <PageWrapper title=\"滚动组件示例\" content=\"基于el-scrollbar\">\n    <div class=\"scroll-wrap\">\n      <ScrollContainer class=\"mt-4\">\n        <ul class=\"p-3\">\n          <template v-for=\"index in 100\" :key=\"index\">\n            <li class=\"p-2\" :style=\"{ border: '1px solid #eee' }\">\n              {{ index }}\n            </li>\n          </template>\n        </ul>\n      </ScrollContainer>\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { ScrollContainer } from '/@/components/Container/index';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { ScrollContainer, PageWrapper },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .scroll-wrap {\n    width: 50%;\n    height: 300px;\n    background-color: @component-background;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/strength-meter/index.vue",
    "content": "<template>\n  <PageWrapper title=\"密码强度校验组件\">\n    <div class=\"flex justify-center\">\n      <div class=\"demo-wrap p-10\">\n        <StrengthMeter placeholder=\"默认\" />\n        <StrengthMeter placeholder=\"禁用\" disabled />\n        <br />\n        <StrengthMeter placeholder=\"隐藏input\" :show-input=\"false\" value=\"!@#qwe12345\" />\n      </div>\n    </div>\n  </PageWrapper>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { StrengthMeter } from '/@/components/StrengthMeter';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: {\n      StrengthMeter,\n      PageWrapper,\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .demo-wrap {\n    width: 50%;\n    background-color: @component-background;\n    border-radius: 10px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/time/index.vue",
    "content": "<template>\n  <PageWrapper title=\"时间组件示例\">\n    <CollapseContainer title=\"基础示例\">\n      <Time :value=\"time1\" />\n      <br />\n      <Time :value=\"time2\" />\n    </CollapseContainer>\n\n    <CollapseContainer title=\"定时更新\" class=\"my-4\">\n      <Time :value=\"now\" :step=\"1\" />\n      <br />\n      <Time :value=\"now\" :step=\"5\" />\n    </CollapseContainer>\n\n    <CollapseContainer title=\"定时更新\">\n      <Time :value=\"now\" mode=\"date\" />\n      <br />\n      <Time :value=\"now\" mode=\"datetime\" />\n      <br />\n      <Time :value=\"now\" />\n    </CollapseContainer>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, reactive, toRefs } from 'vue';\n  import { PageWrapper } from '/@/components/Page';\n  import { Time } from '/@/components/Time';\n  import { CollapseContainer } from '/@/components/Container/index';\n\n  export default defineComponent({\n    components: { PageWrapper, Time, CollapseContainer },\n    setup() {\n      const now = new Date().getTime();\n      const state = reactive({\n        time1: now - 60 * 3 * 1000,\n        time2: now - 86400 * 3 * 1000,\n      });\n      return {\n        ...toRefs(state),\n        now,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/transition/index.vue",
    "content": "<template>\n  <PageWrapper title=\"动画组件示例\">\n    <div class=\"flex\">\n      <Select :options=\"options\" v-model:value=\"value\" placeholder=\"选择动画\" :style=\"{ width: '150px' }\" />\n      <a-button type=\"primary\" class=\"ml-4\" @click=\"start\"> start </a-button>\n    </div>\n    <component :is=\"`${value}Transition`\">\n      <div class=\"box\" v-show=\"show\"></div>\n    </component>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import { Select } from 'ant-design-vue';\n  import { PageWrapper } from '/@/components/Page';\n  import {\n    FadeTransition,\n    ScaleTransition,\n    SlideYTransition,\n    ScrollYTransition,\n    SlideYReverseTransition,\n    ScrollYReverseTransition,\n    SlideXTransition,\n    ScrollXTransition,\n    SlideXReverseTransition,\n    ScrollXReverseTransition,\n    ScaleRotateTransition,\n    ExpandXTransition,\n    ExpandTransition,\n  } from '/@/components/Transition';\n\n  const transitionList = [\n    'Fade',\n    'Scale',\n    'SlideY',\n    'ScrollY',\n    'SlideYReverse',\n    'ScrollYReverse',\n    'SlideX',\n    'ScrollX',\n    'SlideXReverse',\n    'ScrollXReverse',\n    'ScaleRotate',\n    'ExpandX',\n    'Expand',\n  ];\n  const options = transitionList.map((item) => ({\n    label: item,\n    value: item,\n    key: item,\n  }));\n\n  export default defineComponent({\n    components: {\n      Select,\n      PageWrapper,\n      FadeTransition,\n      ScaleTransition,\n      SlideYTransition,\n      ScrollYTransition,\n      SlideYReverseTransition,\n      ScrollYReverseTransition,\n      SlideXTransition,\n      ScrollXTransition,\n      SlideXReverseTransition,\n      ScrollXReverseTransition,\n      ScaleRotateTransition,\n      ExpandXTransition,\n      ExpandTransition,\n    },\n    setup() {\n      const value = ref('Fade');\n      const show = ref(true);\n      function start() {\n        show.value = false;\n        setTimeout(() => {\n          show.value = true;\n        }, 300);\n      }\n      return { options, value, start, show };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .box {\n    width: 150px;\n    height: 150px;\n    margin-top: 20px;\n    background-color: rgb(126, 170, 236);\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/upload/index.vue",
    "content": "<template>\n  <PageWrapper title=\"上传组件示例\">\n    <a-alert message=\"基础示例\" />\n    <BasicUpload :maxSize=\"20\" :maxNumber=\"10\" @change=\"handleChange\" :api=\"uploadApi\" class=\"my-5\" :accept=\"['image/*']\" />\n\n    <a-alert message=\"嵌入表单,加入表单校验\" />\n\n    <BasicForm @register=\"register\" class=\"my-5\" />\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicUpload } from '/@/components/Upload';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';\n  import { PageWrapper } from '/@/components/Page';\n  import { Alert } from 'ant-design-vue';\n  import { uploadApi } from '/@/api/sys/upload';\n\n  const schemas: FormSchema[] = [\n    {\n      field: 'field1',\n      component: 'Upload',\n      label: '字段1',\n      colProps: {\n        span: 8,\n      },\n      rules: [{ required: true, message: '请选择上传文件' }],\n      componentProps: {\n        api: uploadApi,\n      },\n    },\n  ];\n  export default defineComponent({\n    components: { BasicUpload, BasicForm, PageWrapper, [Alert.name]: Alert },\n    setup() {\n      const { createMessage } = useMessage();\n      const [register] = useForm({\n        labelWidth: 120,\n        schemas,\n        actionColOptions: {\n          span: 16,\n        },\n      });\n      return {\n        handleChange: (list: string[]) => {\n          createMessage.info(`已上传文件${JSON.stringify(list)}`);\n        },\n        uploadApi,\n        register,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/verify/Rotate.vue",
    "content": "<template>\n  <PageWrapper title=\"旋转校验示例\">\n    <div class=\"flex justify-center p-4 items-center bg-gray-700\">\n      <RotateDragVerify :src=\"img\" ref=\"el\" @success=\"handleSuccess\" />\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { RotateDragVerify } from '/@/components/Verify/index';\n\n  import img from '/@/assets/images/header.jpg';\n\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { RotateDragVerify, PageWrapper },\n    setup() {\n      const handleSuccess = () => {\n        console.log('success!');\n      };\n      return {\n        handleSuccess,\n        img,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .bg-gray-700 {\n    background-color: #4a5568;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/comp/verify/index.vue",
    "content": "<template>\n  <PageWrapper title=\"拖动校验示例\">\n    <div class=\"flex justify-center p-4 items-center bg-gray-700\">\n      <BasicDragVerify ref=\"el1\" @success=\"handleSuccess\" />\n      <a-button type=\"primary\" class=\"ml-2\" @click=\"handleBtnClick(el1)\"> 还原 </a-button>\n    </div>\n\n    <div class=\"flex justify-center p-4 items-center bg-gray-700\">\n      <BasicDragVerify ref=\"el2\" @success=\"handleSuccess\" circle />\n      <a-button type=\"primary\" class=\"ml-2\" @click=\"handleBtnClick(el2)\"> 还原 </a-button>\n    </div>\n\n    <div class=\"flex justify-center p-4 items-center bg-gray-700\">\n      <BasicDragVerify\n        ref=\"el3\"\n        @success=\"handleSuccess\"\n        text=\"拖动以进行校验\"\n        successText=\"校验成功\"\n        :barStyle=\"{\n          backgroundColor: '#018ffb',\n        }\"\n      />\n      <a-button type=\"primary\" class=\"ml-2\" @click=\"handleBtnClick(el3)\"> 还原 </a-button>\n    </div>\n\n    <div class=\"flex justify-center p-4 items-center bg-gray-700\">\n      <BasicDragVerify ref=\"el4\" @success=\"handleSuccess\">\n        <template #actionIcon=\"isPassing\">\n          <BugOutlined v-if=\"isPassing\" />\n          <RightOutlined v-else />\n        </template>\n      </BasicDragVerify>\n      <a-button type=\"primary\" class=\"ml-2\" @click=\"handleBtnClick(el4)\"> 还原 </a-button>\n    </div>\n\n    <div class=\"flex justify-center p-4 items-center bg-gray-700\">\n      <BasicDragVerify ref=\"el5\" @success=\"handleSuccess\">\n        <template #text=\"isPassing\">\n          <div v-if=\"isPassing\">\n            <BugOutlined />\n            成功\n          </div>\n          <div v-else>\n            拖动\n            <RightOutlined />\n          </div>\n        </template>\n      </BasicDragVerify>\n      <a-button type=\"primary\" class=\"ml-2\" @click=\"handleBtnClick(el5)\"> 还原 </a-button>\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import { BasicDragVerify, DragVerifyActionType, PassingData } from '/@/components/Verify/index';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { BugOutlined, RightOutlined } from '@ant-design/icons-vue';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { BasicDragVerify, BugOutlined, RightOutlined, PageWrapper },\n    setup() {\n      const { createMessage } = useMessage();\n      const el1 = ref<Nullable<DragVerifyActionType>>(null);\n      const el2 = ref<Nullable<DragVerifyActionType>>(null);\n      const el3 = ref<Nullable<DragVerifyActionType>>(null);\n      const el4 = ref<Nullable<DragVerifyActionType>>(null);\n      const el5 = ref<Nullable<DragVerifyActionType>>(null);\n\n      function handleSuccess(data: PassingData) {\n        const { time } = data;\n        createMessage.success(`校验成功,耗时${time}秒`);\n      }\n\n      function handleBtnClick(elRef: Nullable<DragVerifyActionType>) {\n        if (!elRef) {\n          return;\n        }\n        elRef.resume();\n      }\n      return {\n        handleSuccess,\n        el1,\n        el2,\n        el3,\n        el4,\n        el5,\n        handleBtnClick,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .bg-gray-700 {\n    background-color: #4a5568;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFiledsLayotForm.vue",
    "content": "<!-- 标题与字段布局 -->\n<template>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" @submit=\"handleSubmit\" style=\"margin: 20px auto\"/>\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      label: '姓名',\n      field: 'name',\n      component: 'Input',\n    },\n    {\n      label: '年龄',\n      field: 'password',\n      component: 'InputNumber',\n    },\n    {\n      label: '生日',\n      field: 'birthday',\n      component: 'DatePicker',\n    },\n    {\n      label: '头像',\n      field: 'avatar',\n      component: 'JImageUpload',\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   */\n  const [registerForm] = useForm({\n    //注册表单列\n    schemas: formSchemas,\n    showActionButtonGroup: false,\n    actionColOptions: { span: 12 },\n    //控制标题宽度占比\n    labelCol: {\n      xs: 2,\n      sm: 2,\n      md: 2,\n      lg: 9,\n      xl: 3,\n      xxl: 2,\n    },\n    //控制组件宽度占比\n    wrapperCol: {\n      xs: 15,\n      sm: 14,\n      md: 16,\n      lg: 17,\n      xl: 19,\n      xxl: 20,\n    },\n  });\n\n  /**\n   * 点击提交按钮的value值\n   * @param values\n   */\n  function handleSubmit(values: any) {\n    console.log('提交按钮数据::::', values);\n  }\n</script>\n\n<style scoped>\n  /** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-picker) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFixedWidthForm.vue",
    "content": "<!-- 固定label标题的宽度 -->\n<template>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" @submit=\"handleSubmit\" style=\"margin-top: 20px\" />\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      label: '姓名',\n      field: 'name',\n      component: 'Input',\n    },\n    {\n      label: '年龄',\n      field: 'password',\n      component: 'InputNumber',\n    },\n    {\n      label: '生日',\n      field: 'birthday',\n      component: 'DatePicker',\n    },\n    {\n      label: '头像',\n      field: 'avatar',\n      component: 'JImageUpload',\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   */\n  const [registerForm] = useForm({\n    //注册表单列\n    schemas: formSchemas,\n    showResetButton: false,\n    submitButtonOptions: { text: '提交', preIcon: '' },\n    actionColOptions: { span: 17 },\n    //使用labelWidth控制标题宽度\n    labelWidth: '150px',\n    //使用labelCol的样式属性来控制标题宽度\n    labelCol: { style: { width: '150px' } },\n    //标题对齐方式（left:左对齐，right：右对齐），默认右对齐\n    labelAlign: 'right',\n  });\n\n  /**\n   * 点击提交按钮的value值\n   * @param values\n   */\n  function handleSubmit(values: any) {\n    console.log('提交按钮数据::::', values);\n  }\n</script>\n\n<style scoped>\n  /** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-picker) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormAdd.vue",
    "content": "<!-- 动态增减表单 -->\n<template>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" style=\"margin-top: 20px;\" @submit=\"handleSubmit\">\n    <!--  添加input的插槽  -->\n    <template #addForm=\"{ field }\">\n      <a-button v-if=\"Number(field) === 0\" @click=\"addField\" style=\"width: 50px\">+</a-button>\n      <a-button v-if=\"Number(field) > 0\" @click=\"delField(field)\" style=\"width: 50px\">-</a-button>\n    </template>\n  </BasicForm>\n  <!--  <div style=\"margin: 20px auto; text-align: center\">\n    <a-button @click=\"addField\">添加表单项</a-button>\n  </div>-->\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n  import { CollapseContainer } from '/@/components/Container';\n  import { ref } from 'vue';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      field: 'name1',\n      label: '姓名1',\n      component: 'Input',\n      // ifShow:false,\n      colProps: {\n        span: 8,\n      },\n    },\n    {\n      field: 'age1',\n      label: '年龄1',\n      component: 'InputNumber',\n      // ifShow:false,\n      colProps: {\n        span: 8,\n      },\n    },\n    {\n      field: '0',\n      component: 'Input',\n      // ifShow:false,\n      label: ' ',\n      colProps: {\n        span: 8,\n      },\n      slot: 'addForm',\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   * appendSchemaByField:增加表单项（字段）\n   *\n   * removeSchemaByFiled:减少表单项（字段）\n   */\n  const [registerForm, { appendSchemaByField, removeSchemaByFiled }] = useForm({\n    schemas: formSchemas,\n    showResetButton: false,\n    labelWidth: '150px',\n    // showSubmitButton:false\n    submitButtonOptions: { text: '提交', preIcon: '' },\n    actionColOptions: { span: 17 },\n  });\n\n  //组件个数\n  let n = ref<number>(2);\n\n  /**\n   * 添加字段\n   * appendSchemaByField类型: ( schema: FormSchema, prefixField: string | undefined, first?: boolean | undefined ) => Promise<void>\n   * 说明: 插入到指定 filed 后面，如果没传指定 field，则插入到最后,当 first = true 时插入到第一个位置\n   */\n  async function addField() {\n    //添加表单字段，里面为schemas对应的属性，可自行配置\n    await appendSchemaByField(\n      {\n        field: `name${n.value}`,\n        component: 'Input',\n        label: '字段' + n.value,\n        colProps: {\n          span: 8,\n        },\n      },\n      ''\n    );\n    await appendSchemaByField(\n      {\n        field: `sex${n.value}`,\n        component: 'InputNumber',\n        label: '字段' + n.value,\n        colProps: {\n          span: 8,\n        },\n      },\n      ''\n    );\n\n    await appendSchemaByField(\n      {\n        field: `${n.value}`,\n        component: 'Input',\n        label: ' ',\n        colProps: {\n          span: 8,\n        },\n        slot: 'addForm',\n      },\n      ''\n    );\n    n.value++;\n  }\n\n  /**\n   * 删除字段\n   * 类型: (field: string | string[]) => Promise<void>\n   * 说明: 根据 field 删除 Schema\n   * @param field 当前字段名称\n   */\n  function delField(field) {\n    //移除指定字段\n    removeSchemaByFiled([`name${field}`, `sex${field}`, `${field}`]);\n    n.value--;\n  }\n\n  /**\n   * 点击提交按钮的value值\n   * @param values\n   */\n  function handleSubmit(values: any) {\n    console.log('提交按钮数据::::', values);\n  }\n</script>\n\n<style scoped>\n  /** 数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormBtn.vue",
    "content": "<!-- 操作按钮 -->\n<template>\n  <div style=\"margin: 20px auto; text-align: center\">\n    <!-- 通过setProps 可以设置 userForm 中的属性 -->\n    <!--  showActionButtonGroup 显示或者隐藏查询、重置按钮  -->\n    <a-button @click=\"setProps({ showActionButtonGroup: false })\" class=\"mr-2\"> 隐藏操作按钮 </a-button>\n    <a-button @click=\"setProps({ showActionButtonGroup: true })\" class=\"mr-2\"> 显示操作按钮 </a-button>\n    <!--  showActionButtonGroup 显示或者隐藏重置按钮  -->\n    <a-button @click=\"setProps({ showResetButton: false })\" class=\"mr-2\"> 隐藏重置按钮 </a-button>\n    <a-button @click=\"setProps({ showResetButton: true })\" class=\"mr-2\"> 显示重置按钮 </a-button>\n    <!--  showActionButtonGroup 显示或者隐藏查询按钮  -->\n    <a-button @click=\"setProps({ showSubmitButton: false })\" class=\"mr-2\"> 隐藏查询按钮 </a-button>\n    <a-button @click=\"setProps({ showSubmitButton: true })\" class=\"mr-2\"> 显示查询按钮 </a-button>\n  </div>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" @submit=\"handleSubmit\" style=\"margin-top: 50px; margin-left: 50px\" />\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n  import { CollapseContainer } from '/@/components/Container';\n\n  /**\n   * BasicForm绑定注册;\n   * setProps方法可以动态设置useForm中的属性\n   */\n  const [registerForm, { setProps }] = useForm({\n    //自定义查询按钮的文本和图标\n    submitButtonOptions: { text: '查询', preIcon: '' },\n    //自定义重置按钮的文本和图标\n    resetButtonOptions: { text: '重置', preIcon: '' },\n    //操作按钮的位置\n    actionColOptions: { span: 17 },\n    //提交按钮的自定义事件\n    submitFunc: customSubmitFunc,\n    //重置按钮的自定义时间\n    resetFunc: customSubmitFunc,\n    //显示操作按钮\n    showActionButtonGroup: true,\n  });\n\n  /**\n   * 查询按钮点击事件\n   */\n  async function customSubmitFunc() {\n    console.log('查询按钮点击事件，此处处理查询按钮的逻辑');\n  }\n\n  /**\n   * 重置按钮点击事件\n   */\n  async function customResetFunc() {\n    console.log('重置按钮点击事件，此处处理重置按钮的逻辑');\n  }\n\n  /**\n   * 点击提交按钮的value值\n   * @param values\n   */\n  function handleSubmit(values: any) {\n    console.log('提交按钮数据::::', values);\n  }\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormCleanRule.vue",
    "content": "<!-- 操作禁用表单 -->\n<template>\n  <div style=\"margin: 20px auto; text-align: center\">\n    <!-- all 触发或清空所有验证，visitor 只触发或者清空来访人员验证 -->\n    <a-button @click=\"triggerFormRule('all')\" class=\"mr-2\"> 触发表单验证 </a-button>\n    <a-button @click=\"cancelFormRule('all')\" class=\"mr-2\"> 清空表单验证 </a-button>\n    <a-button @click=\"triggerFormRule('visitor')\" class=\"mr-2\"> 只验证来访人员 </a-button>\n    <a-button @click=\"cancelFormRule('visitor')\" class=\"mr-2\"> 只清空来访人员验证 </a-button>\n  </div>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" style=\"margin-top: 20px;\" />\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      field: 'visitor',\n      label: '来访人员',\n      component: 'Input',\n      required: true,\n    },\n    {\n      field: 'accessed',\n      label: '来访日期',\n      component: 'DatePicker',\n      required: true,\n    },\n    {\n      field: 'phone',\n      label: '来访人手机号',\n      component: 'Input',\n      required: true,\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   * clearValidate 清除所有验证，支持取消验证其中几个字段 如 clearValidate(['visitor',...])\n   * validate 验证所有,支持验证其中几个字段，validate(['visitor',...])\n   * validateFields 只支持验证其中几个字段，如validateFields(['visitor',...])\n   */\n  const [registerForm, { clearValidate, validateFields, validate }] = useForm({\n    schemas: formSchemas,\n    labelWidth: '150px',\n    //隐藏操作按钮\n    showActionButtonGroup: false,\n    //默认聚焦第一个，只支持input\n    autoFocusFirstItem: true,\n  });\n\n  /**\n   * 触发表单验证\n   * @param type all 所有验证 visitor 只验证来访人员\n   */\n  async function triggerFormRule(type) {\n    if (type == 'all') {\n      //触发所有验证\n      await validate();\n    } else {\n      //触发来访人员验证\n      //visitor 来访人员的对应formSchemas field字段\n      await validateFields(['visitor']);\n    }\n  }\n\n  /**\n   * 触发表单验证\n   * @param type all 所有验证 visitor 只验证来访人员\n   */\n  async function cancelFormRule(type) {\n    if (type == 'all') {\n      //取消全部验证\n      await clearValidate();\n    } else {\n      //只取消来访人员的验证\n      //visitor 来访人员的对应formSchemas field字段\n      await clearValidate(['visitor']);\n    }\n  }\n</script>\n\n<style scoped>\n  /** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-picker) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormCompact.vue",
    "content": "<!-- 操作禁用表单 -->\n<template>\n  <div style=\"margin: 20px auto; text-align: center\">\n    <!-- 通过setProps 可以设置 userForm 中的属性 -->\n    <!-- 表单大小，默认为 default   -->\n    <a-button @click=\"setProps({ size: 'large' })\" class=\"mr-2\"> 更改大小为最大 </a-button>\n    <a-button @click=\"setProps({ size: 'default' })\" class=\"mr-2\"> 还原大小 </a-button>\n    <a-button @click=\"setProps({ size: 'small' })\" class=\"mr-2\"> 更改大小为最小 </a-button>\n    <!--  disabled表单禁用  -->\n    <a-button @click=\"setProps({ disabled: true })\" class=\"mr-2\"> 禁用表单 </a-button>\n    <a-button @click=\"setProps({ disabled: false })\" class=\"mr-2\"> 解除禁用 </a-button>\n    <!--  compact 是否为紧凑表单  -->\n    <a-button @click=\"setProps({ compact: true })\" class=\"mr-2\"> 紧凑表单 </a-button>\n    <a-button @click=\"setProps({ compact: false })\" class=\"mr-2\"> 还原正常间距 </a-button>\n  </div>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" style=\"margin-top: 20px;\" />\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n  import { CollapseContainer } from '/@/components/Container';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      field: 'visitor',\n      label: '来访人员',\n      component: 'Input',\n    },\n    {\n      field: 'accessed',\n      label: '来访日期',\n      component: 'DatePicker',\n    },\n    {\n      field: 'phone',\n      label: '来访人手机号',\n      component: 'Input',\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   * setProps方法可以动态设置useForm中的属性\n   */\n  const [registerForm, { setProps }] = useForm({\n    schemas: formSchemas,\n    labelWidth: '150px',\n    //隐藏操作按钮\n    showActionButtonGroup: false,\n    //默认聚焦第一个，只支持input\n    autoFocusFirstItem: true,\n  });\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormComponent.vue",
    "content": "<!-- 操作表单值 -->\n<template>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" style=\"margin-top: 20px;\" />\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n  import { schemas } from './example.data';\n\n  /**\n   * BasicForm绑定注册;\n   */\n  const [registerForm, { getFieldsValue, setFieldsValue, resetFields, validate }] = useForm({\n    schemas: schemas,\n    labelWidth: '150px',\n    //隐藏操作按钮\n    showActionButtonGroup: false,\n    //默认聚焦第一个，只支持input\n    autoFocusFirstItem: true,\n  });\n</script>\n\n<style scoped>\n  /** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-picker) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormConAttribute.vue",
    "content": "<!-- 控件属性 -->\n<template>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" style=\"margin-top: 20px\" />\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      label: '员工姓名',\n      field: 'name',\n      component: 'Input',\n      componentProps: {\n        disabled: true,\n      },\n      defaultValue: '张三',\n    },\n    {\n      label: '性别',\n      field: 'sex',\n      component: 'Select',\n      //填写组件的属性\n      componentProps: {\n        options: [\n          { label: '男', value: 1 },\n          { label: '女', value: 2 },\n          { label: '未知', value: 3 },\n        ],\n      },\n      //默认值\n      defaultValue: 3,\n    },\n    {\n      label: '年龄',\n      field: 'age',\n      component: 'Input',\n    },\n    {\n      label: '入职时间',\n      subLabel: '( 选填 )',\n      field: 'entryTime',\n      component: 'TimePicker',\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   */\n  const [registerForm] = useForm({\n    //注册表单列\n    schemas: formSchemas,\n    labelWidth: '150px',\n    showResetButton: false,\n    submitButtonOptions: { text: '提交', preIcon: '' },\n    actionColOptions: { span: 17 },\n  });\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormCustom.vue",
    "content": "<!-- 自定义组件 -->\n<template>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" style=\"margin-top: 20px\" />\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      field: 'custom',\n      label: '自定义组件',\n      //引入自定义组件\n      component: 'JInput',\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   */\n  const [registerForm] = useForm({\n    //注册表单列\n    schemas: formSchemas,\n    labelWidth: '150px',\n    showActionButtonGroup: false,\n  });\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormCustomComponent.vue",
    "content": "<!-- 操作表单值 -->\n<template>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" style=\"margin-top: 20px\" />\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n  import { schemas } from './exampleCustom.data';\n\n  /**\n   * BasicForm绑定注册;\n   */\n  const [registerForm, { getFieldsValue, setFieldsValue, resetFields, validate }] = useForm({\n    schemas: schemas,\n    labelWidth: '150px',\n    //隐藏操作按钮\n    showActionButtonGroup: false,\n  });\n</script>\n\n<style scoped>\n  /** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-picker) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormCustomSlots.vue",
    "content": "<!-- 插槽 -->\n<template>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" style=\"margin-top: 20px\" @submit=\"handleSubmit\">\n      <!--  #name对应的是formSchemas对应slot(name)插槽    -->\n      <template #name=\"{ model, field }\">\n        <JInput v-model:value=\"model[field]\" />\n      </template>\n  </BasicForm>\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n  //引入CustomDemo自定义组件\n  import JInput from \"/@/components/Form/src/jeecg/components/JInput.vue\";\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      field: 'name',\n      label: '姓名',\n      component: 'Input',\n      slot:'name'\n    },\n    {\n      field: 'phone',\n      label: '联系方式',\n      component: 'Input',\n    },\n    {\n      field: 'feedback',\n      label: '问题反馈',\n      component: 'InputTextArea',\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   */\n  const [registerForm] = useForm({\n    //注册表单列\n    schemas: formSchemas,\n    showResetButton: false,\n    labelWidth: '150px',\n    submitButtonOptions: { text: '提交', preIcon: '' },\n    actionColOptions: { span: 17 },\n  });\n\n  /**\n   * 提交信息\n   */\n  function handleSubmit(values) {\n    console.log(\"values::\",values);\n  }\n</script>\n\n<style scoped>\n  .font-color {\n    font-size: 13px;\n    color: #a1a1a1;\n    margin-bottom: 5px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormDynamicsRules.vue",
    "content": "<!-- 动态表单验证 -->\n<template>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" style=\"margin-top: 20px\" @submit=\"handleSubmit\" />\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n  import { duplicateCheck } from '/@/views/system/user/user.api';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      field: 'visitor',\n      label: '来访人员',\n      component: 'Input',\n      //自动触发检验，布尔类型\n      required: true,\n    },\n    {\n      field: 'accessed',\n      label: '来访日期',\n      component: 'DatePicker',\n      //支持获取当前值判断触发 values代表当前表单的值\n      required: ({ values }) => {\n        return !values.accessed;\n      },\n    },\n    {\n      field: 'phone',\n      label: '来访人手机号',\n      component: 'Input',\n      //动态自定义正则，values: 当前表单的所有值\n      dynamicRules: ({ values }) => {\n        //需要return\n        return [\n          {\n            //默认开启表单检验\n            required: true,\n            // value 当前手机号输入的值\n            validator: (_, value) => {\n              //需要return 一个Promise对象\n              return new Promise((resolve, reject) => {\n                if (!value) {\n                  reject('请输入手机号！');\n                }\n                //验证手机号是否正确\n                let reg = /^1[3456789]\\d{9}$/;\n                if (!reg.test(value)) {\n                  reject('请输入正确手机号！');\n                }\n                resolve();\n              });\n            },\n          },\n        ];\n      },\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   */\n  const [registerForm] = useForm({\n    //注册表单列\n    schemas: formSchemas,\n    showResetButton: false,\n    labelWidth: '150px',\n    submitButtonOptions: { text: '提交', preIcon: '' },\n    actionColOptions: { span: 17 },\n  });\n\n  /**\n   * 提交事件\n   */\n  function handleSubmit(values: any) {}\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormFieldShow.vue",
    "content": "<!-- 字段显示与隐藏 -->\n<template>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" style=\"margin-top: 20px\" />\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      field: 'id',\n      label: '编号',\n      component: 'Input',\n      //隐藏id，css 控制，不会删除 dom（支持布尔类型 true和false。支持动态值判断，详情请见ifShow）\n      show: false,\n    },\n    {\n      field: 'evaluate',\n      label: '对公司整体评价',\n      component: 'RadioGroup',\n      componentProps: {\n        options: [\n          { label: '满意', value: '0' },\n          { label: '不满意', value: '1' },\n        ],\n      },\n      defaultValue: '0',\n    },\n    {\n      field: 'describe',\n      label: '不满意原因说明',\n      component: 'InputTextArea',\n      //ifShow和show属性一致，使用其中一个即可，values代表当前表单的值，js 控制，会删除 dom\n      ifShow: ({ values }) => {\n        return values.evaluate == '1';\n      },\n    },\n    {\n      field: 'satisfiedLevel',\n      label: '满意度',\n      component: 'Slider',\n      componentProps: {\n        tipFormatter: (value) => {\n          return value + '%';\n        },\n      },\n      //动态禁用，values代表当前表单的值，返回 true或false\n      dynamicDisabled: ({ values }) => {\n        return values.evaluate == '1';\n      },\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   */\n  const [registerForm] = useForm({\n    //注册表单列\n    schemas: formSchemas,\n    showResetButton: false,\n    labelWidth: '150px',\n    submitButtonOptions: { text: '提交', preIcon: '' },\n    actionColOptions: { span: 17 },\n  });\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormFieldTip.vue",
    "content": "<!-- 字段标题提示及前缀 -->\n<template>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" style=\"margin-top: 20px\" />\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      field: 'month',\n      label: '当前月份',\n      component: 'Input',\n      suffix: '月',\n    },\n    {\n      field: 'lateNumber',\n      label: '迟到次数',\n      component: 'InputNumber',\n      //帮助信息：可以直接返回String(helpMessage:\"迟到次数\")，也可以获取表单值，动态填写\n      helpMessage: ({ values }) => {\n        return '当前迟到次数' + values.lateNumber + ', 扣款' + values.lateNumber * 50 + '元';\n      },\n      defaultValue: 0,\n    },\n    {\n      field: 'lateReason',\n      label: '迟到原因',\n      component: 'Input',\n      helpMessage: '什么原因耽误上班迟到',\n      //自定义提示属性，需要结合helpMessage一起使用\n      helpComponentProps: {\n        maxWidth: '200px',\n        color: '#66CCFF',\n      },\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   */\n  const [registerForm] = useForm({\n    //注册表单列\n    schemas: formSchemas,\n    showResetButton: false,\n    labelWidth: '150px',\n    submitButtonOptions: { text: '提交', preIcon: '' },\n    actionColOptions: { span: 17 },\n  });\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormFooter.vue",
    "content": "<!-- 自定义页脚 -->\n<template>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" style=\"margin-top: 20px\">\n    <template #formHeader>\n      <div style=\"margin: 0 auto 20px\">\n        <span>我是自定义按钮</span>\n      </div>\n    </template>\n    <template #formFooter>\n      <div style=\"margin: 0 auto\">\n        <a-button type=\"primary\" @click=\"save\" class=\"mr-2\"> 保存 </a-button>\n        <a-button type=\"primary\" @click=\"saveDraft\" class=\"mr-2\"> 保存草稿 </a-button>\n        <a-button type=\"error\" @click=\"reset\" class=\"mr-2\"> 重置 </a-button>\n      </div>\n    </template>\n  </BasicForm>\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      label: '员工姓名',\n      field: 'name',\n      component: 'Input',\n    },\n    {\n      label: '性别',\n      field: 'sex',\n      component: 'Select',\n      //填写组件的属性\n      componentProps: {\n        options: [\n          { label: '男', value: 1 },\n          { label: '女', value: 2 },\n          { label: '未知', value: 3 },\n        ],\n      },\n      //默认值\n      defaultValue: 3,\n    },\n    {\n      label: '年龄',\n      field: 'age',\n      component: 'Input',\n    },\n    {\n      label: '入职时间',\n      subLabel: '( 选填 )',\n      field: 'entryTime',\n      component: 'TimePicker',\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   */\n  const [registerForm, { validate, resetFields }] = useForm({\n    schemas: formSchemas,\n    labelWidth: '150px',\n    //隐藏操作按钮\n    showActionButtonGroup: false,\n  });\n\n  /**\n   * 保存\n   */\n  async function save() {\n    //使用useForm方法获取表单值\n    let values = await validate();\n    console.log(values);\n  }\n\n  /**\n   * 保存草稿\n   */\n  async function saveDraft() {\n    //使用useForm方法validate获取表单值\n    let values = await validate();\n    console.log(values);\n  }\n\n  /**\n   * 重置\n   */\n  async function reset() {\n    //使用useForm方法resetFields清空值\n    await resetFields();\n  }\n</script>\n\n<style scoped>\n  /** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-picker) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormLayout.vue",
    "content": "<!-- 表单布局 -->\n<template>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" style=\"margin-top: 20px\" />\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      label: '会议名称',\n      field: 'name',\n      component: 'Input',\n    },\n    {\n      label: '参会地点',\n      field: 'meetingLocation',\n      component: 'Input',\n    },\n    {\n      label: '参与人数',\n      field: 'numberOfPart',\n      component: 'InputNumber',\n    },\n    {\n      label: '会议纪要',\n      field: 'meetingMinutes',\n      component: 'JUpload',\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   */\n  const [registerForm] = useForm({\n    //表单布局属性，支持（vertical,inline），默认为inline\n    layout: 'inline',\n    //注册表单列\n    schemas: formSchemas,\n    //不显示查询和重置按钮\n    showActionButtonGroup: false,\n    //默认row行配置,当 layout 为 inline 生效\n    rowProps: { gutter: 24, justify: 'center', align: 'middle' },\n    //全局col列占比(每列显示多少位)，和schemas中的colProps属性一致\n    baseColProps: { span: 12 },\n    //row行的样式\n    baseRowStyle: { width: '100%' },\n  });\n</script>\n\n<style scoped>\n  /** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-picker) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormModal.vue",
    "content": "<!-- 弹出层表单 -->\n<template>\n  <div style=\"margin: 20px auto\">\n    <a-button type=\"primary\" @click=\"openPopup\" class=\"mr-2\"> 打开弹窗 </a-button>\n  </div>\n  <!-- 自定义弹窗组件 -->\n  <BasicModal @register=\"registerModal\" title=\"弹出层表单\">\n    <!-- 自定义表单 -->\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n  import { BasicModal } from '/@/components/Modal';\n  import { useModal } from '/@/components/Modal';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      label: '员工姓名',\n      field: 'name',\n      component: 'Input',\n    },\n    {\n      label: '性别',\n      field: 'sex',\n      component: 'Select',\n      //填写组件的属性\n      componentProps: {\n        options: [\n          { label: '男', value: 1 },\n          { label: '女', value: 2 },\n          { label: '未知', value: 3 },\n        ],\n      },\n      //默认值\n      defaultValue: 3,\n    },\n    {\n      label: '年龄',\n      field: 'age',\n      component: 'Input',\n    },\n    {\n      label: '入职时间',\n      subLabel: '( 选填 )',\n      field: 'entryTime',\n      component: 'TimePicker',\n    },\n  ];\n\n  //BasicModal绑定注册;\n  const [registerModal, { openModal }] = useModal();\n\n  /**\n   * BasicForm绑定注册;\n   */\n  const [registerForm, { validate, resetFields }] = useForm({\n    schemas: formSchemas,\n    //隐藏操作按钮\n    showActionButtonGroup: false,\n  });\n\n  /**\n   * 打开弹窗\n   */\n  async function openPopup() {\n    //详见 BasicModal模块\n    openModal(true, {});\n  }\n</script>\n\n<style scoped>\n  /** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-picker) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormRander.vue",
    "content": "<!-- 自定义渲染 -->\n<template>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" style=\"margin-top: 20px\">\n    <!--  #phone对应的是formSchemas对应slot(phone)插槽    -->\n    <template #phone=\"{ model, field }\">\n      <!-- 如果是组件需要进行双向绑定，model当前表单对象，field当前字段名称  -->\n      <a-input v-model:value=\"model[field]\" placeholder=\"请输入手机号\" />\n      <span class=\"font-color\">请输入您的手机号，方便我们联系您</span>\n    </template>\n    <template #feedback=\"{ model, field }\">\n      <JEditor v-model:value=\"model[field]\" placeholder=\"请输入问题反馈\" />\n      <span class=\"font-color\">请您图文并茂，方便我们了解问题并及时反馈</span>\n    </template>\n  </BasicForm>\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n  import JEditor from '/@/components/Form/src/jeecg/components/JEditor.vue';\n  import { h } from 'vue';\n  import { Input } from 'ant-design-vue';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      field: 'productName',\n      label: '商品名称',\n      component: 'Input',\n    },\n    {\n      field: 'price',\n      label: '价格',\n      component: 'InputNumber',\n    },\n    {\n      field: 'buyNums',\n      label: '购买个数',\n      component: 'InputNumber',\n      //model 单签表单对象，field 当前字段\n      render: ({ model, field }) => {\n        //渲染自定义组件，以Input为例\n        return h(Input, {\n          placeholder: '请输入购买个数',\n          value: model[field],\n          style: { width: '100%' },\n          type: 'number',\n          onChange: (e: ChangeEvent) => {\n            model[field] = e.target.value;\n          },\n        });\n      },\n    },\n    {\n      field: 'describe',\n      label: '描述',\n      component: 'Input',\n      componentProps: {\n        disabled: true,\n      },\n      //渲染 values当前表单所有值\n      render: ({ values }) => {\n        let productName = values.productName?values.productName:'';\n        let price = values.price ? values.price : 0;\n        let buyNums = values.buyNums ? values.buyNums : 0;\n        return '购买商品名称：' + productName + ', 总价格: ' + price * buyNums + '元';\n      },\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   */\n  const [registerForm] = useForm({\n    //注册表单列\n    schemas: formSchemas,\n    showResetButton: false,\n    labelWidth: '150px',\n    submitButtonOptions: { text: '提交', preIcon: '' },\n    actionColOptions: { span: 17 },\n  });\n</script>\n\n<style scoped>\n  /** 数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormRules.vue",
    "content": "<!-- 表单验证 -->\n<template>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" style=\"margin-top: 20px\" @submit=\"handleSubmit\" />\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      field: 'visitor',\n      label: '来访人员',\n      component: 'Input',\n      //自动触发检验，布尔类型\n      required: true,\n      //检验的时候不加上标题\n      rulesMessageJoinLabel: false,\n    },\n    {\n      field: 'accessed',\n      label: '来访日期',\n      component: 'DatePicker',\n      //支持获取当前值判断触发 values代表当前表单的值\n      required: ({ values }) => {\n        return !values.accessed;\n      },\n    },\n    {\n      field: 'phone',\n      label: '来访人手机号',\n      component: 'Input',\n      //支持正则表达式pattern 和 自定义提示信息 message\n      rules: [{ required: false, message: '请输入正确的手机号', pattern: /^1[3456789]\\d{9}$/ }],\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   */\n  const [registerForm] = useForm({\n    //注册表单列\n    schemas: formSchemas,\n    showResetButton: false,\n    labelWidth: '150px',\n    submitButtonOptions: { text: '提交', preIcon: '' },\n    actionColOptions: { span: 17 },\n  });\n\n  /**\n   * 提交事件\n   */\n  function handleSubmit(values: any) {}\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormSchemas.vue",
    "content": "<!-- 操作表单schemas配置 -->\n<template>\n  <div style=\"margin: 20px auto; text-align: center\">\n    <a-button @click=\"updateFormSchemas\" class=\"mr-2\"> 更新字段属性 </a-button>\n    <a-button @click=\"resetFormSchemas\" class=\"mr-2\"> 重置字段属性 </a-button>\n  </div>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" style=\"margin-top: 20px\" />\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      field: 'visitor',\n      label: '来访人员',\n      component: 'Input',\n      componentProps: {\n        disabled: true,\n      },\n    },\n    {\n      field: 'accessed',\n      label: '来访日期',\n      component: 'DatePicker',\n      ifShow: false,\n    },\n    {\n      field: 'phone',\n      label: '来访人手机号',\n      component: 'Input',\n      required: true,\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   * updateSchema 更新字段属性，支持schemas里面所有的配置\n   * updateSchema([{ field: 'visitor', componentProps: { disabled: false },}, ... ]);\n   * resetSchema 重置字段属性，支持schemas里面所有的配置\n   * resetSchema([{ field: 'visitor',label: '来访人员',component: 'Input',},... ]);\n   */\n  const [registerForm, { updateSchema, resetSchema }] = useForm({\n    schemas: formSchemas,\n    //隐藏操作按钮\n    showActionButtonGroup: false,\n    labelWidth: '150px',\n    //默认聚焦第一个，只支持input\n    autoFocusFirstItem: true,\n  });\n\n  /**\n   * 清除表单配置\n   */\n  async function resetFormSchemas() {\n    await resetSchema([\n      {\n        //字段必填\n        field: 'visitor',\n        label: '来访人员',\n        component: 'Input',\n      },\n    ]);\n  }\n\n  /**\n   * 更新表单配置\n   */\n  async function updateFormSchemas() {\n    //支持更新schemas里面所有的配置\n    await updateSchema([\n      {\n        //字段必填\n        field: 'visitor',\n        componentProps: {\n          disabled: false,\n        },\n      },\n      {\n        field: 'accessed',\n        ifShow: true,\n      },\n    ]);\n  }\n</script>\n\n<style scoped>\n  /** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-picker) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormSearch.vue",
    "content": "<!-- 查询区域 -->\n<template>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" @submit=\"handleSubmit\" style=\"margin-top: 20px\" />\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      field: 'name',\n      label: '姓名',\n      component: 'Input',\n    },\n    {\n      field: 'hobby',\n      label: '爱好',\n      component: 'Input',\n    },\n    {\n      field: 'birthday',\n      label: '生日',\n      component: 'DatePicker',\n    },\n    {\n      field: 'joinTime',\n      label: '入职时间',\n      component: 'RangePicker',\n      componentProps: {\n        valueType: 'Date',\n      },\n    },\n    {\n      field: 'workYears',\n      label: '工作年份',\n      component: 'JRangeNumber',\n    },\n    {\n      field: 'sex',\n      label: '性别',\n      component: 'Select',\n      componentProps: {\n        options: [\n          {\n            label: '男',\n            value: '1',\n          },\n          {\n            label: '女',\n            value: '2',\n          },\n        ],\n      },\n    },\n    {\n      field: 'marital',\n      label: '婚姻状况',\n      component: 'RadioGroup',\n      componentProps: {\n        options: [\n          {\n            label: '未婚',\n            value: '1',\n          },\n          {\n            label: '已婚',\n            value: '2',\n          },\n        ],\n      },\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   */\n  const [registerForm] = useForm({\n    //将表单内时间区域的值映射成 2个字段, 'YYYY-MM-DD'日期格式化\n    fieldMapToTime: [['joinTime', ['joinTime_begin', 'joinTime_end'], 'YYYY-MM-DD']],\n    //注册表单列\n    schemas: formSchemas,\n    //是否显示展开收起按钮，默认false\n    showAdvancedButton: true,\n    //超过指定行数折叠，默认3行\n    autoAdvancedCol: 3,\n    //折叠时默认显示行数，默认1行\n    alwaysShowLines: 2,\n\n    //将表单内数值类型区域的值映射成 2个字段\n    fieldMapToNumber: [['workYears', ['workYears_begin', 'workYears_end']]],\n    //每列占比，默认一行为24\n    baseColProps: { span: 12 },\n  });\n\n  /**\n   * 点击提交按钮的value值\n   * @param values\n   */\n  function handleSubmit(values: any) {\n    console.log('提交按钮数据::::', values);\n  }\n</script>\n\n<style scoped>\n  /** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-picker) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormSlots.vue",
    "content": "<!-- 插槽 -->\n<template>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" style=\"margin-top: 20px\">\n    <!--  #phone对应的是formSchemas对应slot(phone)插槽    -->\n    <template #phone=\"{ model, field }\">\n      <!-- 如果是组件需要进行双向绑定，model当前表单对象，field当前字段名称  -->\n      <a-input v-model:value=\"model[field]\" placeholder=\"请输入手机号\" />\n      <span class=\"font-color\">请输入您的手机号，方便我们联系您</span>\n    </template>\n    <template #feedback=\"{ model, field }\">\n      <JEditor v-model:value=\"model[field]\" placeholder=\"请输入问题反馈\" />\n      <span class=\"font-color\">请您图文并茂，方便我们了解问题并及时反馈</span>\n    </template>\n  </BasicForm>\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n  import JEditor from '/@/components/Form/src/jeecg/components/JEditor.vue';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      field: 'name',\n      label: '姓名',\n      component: 'Input',\n    },\n    {\n      field: 'phone',\n      label: '联系方式',\n      component: 'Input',\n      slot: 'phone',\n    },\n    {\n      field: 'feedback',\n      label: '问题反馈',\n      component: 'InputTextArea',\n      slot: 'feedback',\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   */\n  const [registerForm] = useForm({\n    //注册表单列\n    schemas: formSchemas,\n    showResetButton: false,\n    labelWidth: '150px',\n    submitButtonOptions: { text: '提交', preIcon: '' },\n    actionColOptions: { span: 17 },\n  });\n</script>\n\n<style scoped>\n  .font-color {\n    font-size: 13px;\n    color: #a1a1a1;\n    margin-bottom: 5px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFormValue.vue",
    "content": "<!-- 操作表单值 -->\n<template>\n  <div style=\"margin: 20px auto; text-align: center\">\n    <a-button @click=\"getFormValue\" class=\"mr-2\"> 获取表单值 </a-button>\n    <a-button @click=\"clearFormValue\" class=\"mr-2\"> 清空表单值 </a-button>\n    <a-button @click=\"updateFormValue\" class=\"mr-2\"> 更新表单值 </a-button>\n  </div>\n  <!-- 自定义表单 -->\n  <BasicForm @register=\"registerForm\" style=\"margin-top: 20px\" />\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      field: 'visitor',\n      label: '来访人员',\n      component: 'Input',\n      required: true,\n    },\n    {\n      field: 'accessed',\n      label: '来访日期',\n      component: 'DatePicker',\n      required: true,\n    },\n    {\n      field: 'phone',\n      label: '来访人手机号',\n      component: 'Input',\n      required: true,\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   * getFieldsValue 获取所有表单值\n   * validate 验证通过之后的表单值,支持验证其中几个字段，validate(['visitor',...])\n   * setFieldsValue 更新表单值，如 setFieldsValue({'visitor':'李四',...})\n   * resetFields 清除所有表单值\n   */\n  const [registerForm, { getFieldsValue, setFieldsValue, resetFields, validate }] = useForm({\n    schemas: formSchemas,\n    //隐藏操作按钮\n    showActionButtonGroup: false,\n    labelWidth: '150px',\n    //默认聚焦第一个，只支持input\n    autoFocusFirstItem: true,\n  });\n\n  /**\n   * 获取表单值\n   */\n  async function getFormValue() {\n    //获取所有值\n    let fieldsValue = await getFieldsValue();\n    console.log('fieldsValue:::', fieldsValue);\n    //表单验证通过后获取所有字段值\n    fieldsValue = await validate();\n    console.log('fieldsValue:::', fieldsValue);\n    //表单验`visitor来访人员`通过后获取的值\n    fieldsValue = await validate(['visitor']);\n    console.log('fieldsValue:::', fieldsValue);\n  }\n\n  /**\n   * 清空表单值\n   */\n  async function clearFormValue() {\n    await resetFields();\n  }\n\n  /**\n   * 更新表单值\n   */\n  async function updateFormValue() {\n    console.log('我进来了');\n    await setFieldsValue({ visitor: '李四' });\n  }\n</script>\n\n<style scoped>\n  /** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-picker) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/BasicFunctionForm.vue",
    "content": "<!-- 基本用法 -->\n<template>\n  <!-- 自定表单 -->\n  <BasicForm @register=\"registerForm\" @submit=\"handleSubmit\" style=\"margin-top: 20px\" />\n</template>\n\n<script lang=\"ts\" setup>\n  //引入依赖\n  import { useForm, BasicForm, FormSchema } from '/@/components/Form';\n\n  //自定义表单字段\n  const formSchemas: FormSchema[] = [\n    {\n      //标题名称\n      label: '用户名(后面根据labelLength定义的长度隐藏)',\n      //字段\n      field: 'username',\n      //组件\n      component: 'Input',\n      //标题宽度,支持数字和字符串\n      labelWidth: 150,\n      //标题长度，超过位数隐藏\n      labelLength: 3,\n    },\n    {\n      label: '密码',\n      field: 'password',\n      //子标题名称（在主标题后面）\n      subLabel: '(数字和字母组成)',\n      component: 'InputPassword',\n      labelWidth: '150px',\n    },\n  ];\n\n  /**\n   * BasicForm绑定注册;\n   * useForm 是整个框架的核心用于表单渲染，里边封装了很多公共方法;\n   * 支持（schemas: 渲染表单列，autoSubmitOnEnter：回车提交,submitButtonOptions：自定义按钮文本和图标等方法）；\n   * 平台通过此封装，简化了代码，支持自定义扩展;\n   */\n  const [registerForm] = useForm({\n    //注册表单列\n    schemas: formSchemas,\n    //回车提交\n    autoSubmitOnEnter: true,\n    //不显示重置按钮\n    showResetButton: false,\n    //自定义提交按钮文本和图标\n    submitButtonOptions: { text: '提交', preIcon: '' },\n    //查询列占比 24代表一行 取值范围 0-24\n    actionColOptions: { span: 17 },\n  });\n\n  /**\n   * 点击提交按钮的value值\n   * @param values\n   */\n  function handleSubmit(values: any) {\n    console.log('提交按钮数据::::', values);\n  }\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/example.data.ts",
    "content": "import { FormSchema } from '/@/components/Form';\n\nimport dayjs from 'dayjs';\n\nexport const schemas: FormSchema[] = [\n  {\n    label: '文本框',\n    field: 'name',\n    component: 'Input',\n    componentProps: {\n      prefix: '中文',\n      showCount: true,\n    },\n    defaultValue: '张三',\n  },\n  {\n    label: '密码',\n    field: 'password',\n    component: 'InputPassword',\n    componentProps: {\n      //是否显示切换按钮或者控制密码显隐\n      visibilityToggle: true,\n      prefix: '密码',\n    },\n  },\n  {\n    label: '搜索框',\n    field: 'searchBox',\n    component: 'InputSearch',\n    componentProps: {\n      onSearch: (value) => {\n        console.log(value);\n      },\n    },\n  },\n  {\n    label: '文本域',\n    field: 'textArea',\n    component: 'InputTextArea',\n    componentProps: {\n      //可以点击清除图标删除内容\n      allowClear: true,\n      //是否展示字数\n      showCount: true,\n      //自适应内容高度，可设置为 true | false 或对象：{ minRows: 2, maxRows: 6 }\n      autoSize: {\n        //最小显示行数\n        minRows: 2,\n        //最大显示行数\n        maxRows: 3,\n      },\n    },\n  },\n  {\n    label: '数值输入框',\n    field: 'number',\n    component: 'InputNumber',\n    componentProps: {\n      //带标签的 input，设置后置标签\n      addonAfter: '保留两位小数',\n      //最大值\n      max: 100,\n      //数值经度\n      precision: 2,\n      //步数\n      step: 0.1,\n    },\n  },\n\n  {\n    label: '下拉框',\n    field: 'jinputtype',\n    component: 'Select',\n    componentProps: {\n      options: [\n        { value: 'like', label: '模糊（like）' },\n        { value: 'ne', label: '不等于（ne）' },\n        { value: 'ge', label: '大于等于（ge）' },\n        { value: 'le', label: '小于等于（le)' },\n      ],\n      //下拉多选\n      mode: 'multiple',\n      //配置是否可搜索\n      showSearch: true,\n    },\n  },\n  {\n    field: 'TreeSelect',\n    label: '下拉树',\n    component: 'TreeSelect',\n    componentProps: {\n      //是否显示下拉框，默认false\n      treeCheckable: true,\n      //标题\n      title: '下拉树',\n      //下拉树\n      treeData: [\n        {\n          label: '洗衣机',\n          value: '0',\n          children: [\n            {\n              label: '滚筒洗衣机',\n              value: '0-1',\n            },\n          ],\n        },\n        {\n          label: '电视机',\n          value: '1',\n          children: [\n            {\n              label: '平板电视',\n              value: '1-1',\n              disabled: true,\n            },\n            {\n              label: 'CRT电视机',\n              value: '1-2',\n            },\n            {\n              label: '投影电视',\n              value: '1-3',\n            },\n          ],\n        },\n      ],\n    },\n  },\n  {\n    label: 'RadioButtonGroup组件',\n    field: 'status',\n    component: 'RadioButtonGroup',\n    componentProps: {\n      options: [\n        { label: '有效', value: 1 },\n        { label: '无效', value: 0 },\n      ],\n    },\n  },\n  {\n    label: '单选框',\n    field: 'radioSex',\n    component: 'RadioGroup',\n    componentProps: {\n      //options里面由一个一个的radio组成,支持disabled禁用\n      options: [\n        { label: '男', value: 1, disabled: false },\n        { label: '女', value: 0 },\n      ],\n    },\n  },\n  {\n    label: '多选框',\n    field: 'checkbox',\n    component: 'Checkbox',\n    componentProps: {\n      //是否禁用,默认false\n      disabled: false,\n    },\n  },\n  {\n    label: '多选框组',\n    field: 'checkSex',\n    component: 'CheckboxGroup',\n    componentProps: {\n      //RadioGroup 下所有 input[type=\"radio\"] 的 name 属性\n      name: '爱好',\n      //options支持disabled禁用\n      options: [\n        { label: '运动', value: 0, disabled: true },\n        { label: '听音乐', value: 1 },\n        { label: '看书', value: 2 },\n      ],\n    },\n    defaultValue: [2],\n  },\n  {\n    label: '自动完成组件',\n    field: 'AutoComplete',\n    component: 'AutoComplete',\n    componentProps: {\n      options: [{ value: 'Burns Bay Road' }, { value: 'Downing Street' }, { value: 'Wall Street' }],\n    },\n  },\n  {\n    label: '级联选择',\n    field: 'cascade',\n    component: 'Cascader',\n    componentProps: {\n      //最多显示多少个tag\n      maxTagCount: 2,\n      //浮层预设位置\n      placement: 'bottomRight',\n      //在选择框中显示搜索框,默认false\n      showSearch: true,\n      options: [\n        {\n          label: '北京',\n          value: 'BeiJin',\n          children: [\n            {\n              label: '海淀区',\n              value: 'HaiDian',\n            },\n          ],\n        },\n        {\n          label: '江苏省',\n          value: 'JiangSu',\n          children: [\n            {\n              label: '南京',\n              value: 'Nanjing',\n              children: [\n                {\n                  label: '中华门',\n                  value: 'ZhongHuaMen',\n                },\n              ],\n            },\n          ],\n        },\n      ],\n    },\n  },\n  {\n    label: '日期选择',\n    field: 'dateSelect',\n    component: 'DatePicker',\n    componentProps: {\n      //日期格式化，页面上显示的值\n      format: 'YYYY-MM-DD',\n      //返回值格式化（绑定值的格式）\n      valueFormat: 'YYYY-MM-DD',\n      //是否显示今天按钮\n      showToday: true,\n      //不可选择日期\n      disabledDate: (currentDate) => {\n        let date = dayjs(currentDate).format('YYYY-MM-DD');\n        let nowDate = dayjs(new Date()).format('YYYY-MM-DD');\n        //当天不可选择\n        if (date == nowDate) {\n          return true;\n        }\n        return false;\n      },\n    },\n  },\n  {\n    label: '月份选择',\n    field: 'monthSelect',\n    component: 'MonthPicker',\n    componentProps: {\n      //不可选择日期\n      disabledDate: (currentDate) => {\n        let date = dayjs(currentDate).format('YYYY-MM');\n        let nowDate = dayjs(new Date()).format('YYYY-MM');\n        //当天不可选择\n        if (date == nowDate) {\n          return true;\n        }\n        return false;\n      },\n    },\n  },\n  {\n    label: '周选择',\n    field: 'weekSelect',\n    component: 'WeekPicker',\n    componentProps: {\n      size: 'small',\n    },\n  },\n  {\n    label: '时间选择',\n    field: 'timeSelect',\n    component: 'TimePicker',\n    componentProps: {\n      size: 'default',\n      //日期时间或者时间模式下是否显示此刻，不支持日期时间范围和时间范围\n      showNow: true,\n    },\n  },\n  {\n    label: '日期时间范围',\n    field: 'dateTimeRangeSelect',\n    component: 'RangePicker',\n    componentProps: {\n      //是否显示时间\n      showTime: true,\n      //日期格式化\n      format: 'YYYY/MM/DD HH:mm:ss',\n      //范围文本描述用集合\n      placeholder: ['请选择开始日期时间', '请选择结束日期时间'],\n    },\n  },\n  {\n    label: '日期范围',\n    field: 'dateRangeSelect',\n    component: 'RangeDate',\n    componentProps: {\n      //日期格式化\n      format: 'YYYY/MM/DD',\n      //范围文本描述用集合\n      placeholder: ['请选择开始日期', '请选择结束日期'],\n    },\n  },\n  {\n    label: '时间范围',\n    field: 'timeRangeSelect',\n    component: 'RangeTime',\n    componentProps: {\n      //日期格式化\n      format: 'HH/mm/ss',\n      //范围文本描述用集合\n      placeholder: ['请选择开始时间', '请选择结束时间'],\n    },\n  },\n  {\n    label: '开关',\n    field: 'switch',\n    component: 'Switch',\n    componentProps: {\n      //开关大小，可选值：default small\n      size: 'default',\n      //非选中时的内容\n      unCheckedChildren: '开启',\n      //非选中时的值\n      unCheckedValue: '0',\n      //选中时的内容\n      checkedChildren: '关闭',\n      //选中时的值\n      checkedValue: '1',\n      //是否禁用\n      disabled: false,\n    },\n  },\n  {\n    label: '滑动输入条',\n    field: 'slider',\n    component: 'Slider',\n    componentProps: {\n      //最小值\n      min: -20,\n      //最大值\n      max: 100,\n      //是否为双滑块模式\n      range: true,\n      //刻度标记\n      marks: {\n        '-20': '-20°C',\n        0: '0°C',\n        26: '26°C',\n        37: '37°C',\n        100: {\n          style: {\n            color: '#f50',\n          },\n          label: '100°C',\n        },\n      },\n    },\n  },\n  {\n    label: '评分',\n    field: 'rate',\n    component: 'Rate',\n    componentProps: {\n      //是否允许半选\n      allowHalf: true,\n      //star 总数\n      count: 5,\n      //tooltip提示，有几颗星写几个\n      tooltips: ['非常差', '较差', '正常', '很好', '非很好'],\n    },\n  },\n  {\n    label: '分割线',\n    field: 'divisionLine',\n    component: 'Divider',\n    componentProps: {\n      //是否虚线\n      dashed: false,\n      //分割线标题的位置（left | right | center）\n      orientation: 'center',\n      //文字是否显示为普通正文样式\n      plain: true,\n      //水平还是垂直类型（horizontal | vertical）\n      type: 'horizontal',\n    },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/exampleCustom.data.ts",
    "content": "import { FormSchema } from '/@/components/Form';\nimport { defHttp } from '/@/utils/http/axios';\n\nexport const schemas: FormSchema[] = [\n  {\n    label: '验证码',\n    field: 'code',\n    component: 'InputCountDown',\n    componentProps: {\n      //'default': 默认, 'large': 最大, 'small': 最小\n      size:'default',\n      //倒计时\n      count: 120,\n    },\n  },\n  {\n    label: 'Api下拉选择',\n    field: 'apiSelect',\n    component: 'ApiSelect',\n    componentProps: {\n      //multiple: 多选；不填写为单选\n      mode: 'multiple',\n      //请求api,返回结果{ result: { records:[{'id':'1',name:'scott'},{'id':'2',name:'小张'}] }}\n      api: () => defHttp.get({ url: '/test/jeecgDemo/list' }),\n      //数值转成String\n      numberToString: false,\n      //标题字段\n      labelField: 'name',\n      //值字段\n      valueField: 'id',\n      //请求参数\n      params: {},\n      //返回结果字段\n      resultField: 'records',\n    },\n  },\n  {\n    label: 'Api树选择',\n    field: 'apiSelect',\n    component: 'ApiTreeSelect',\n    componentProps: {\n      /* 请求api,返回结果\n         { result: { list: [{ title:'选项0',value:'0',key:'0',\n           children: [ {\"title\": \"选项0-0\",\"value\": \"0-0\",\"key\": \"0-0\"},...]\n           }, ...]\n         }} */\n      api: () => defHttp.get({ url: '/mock/tree/getDemoOptions' }),\n      //请求参数\n      params: {},\n      //返回结果字段\n      resultField: 'list',\n    },\n  },\n  {\n    label: '校验密码强度',\n    field: 'pwd',\n    component: 'StrengthMeter',\n    componentProps: {\n      //是否显示密码文本框\n      showInput: true,\n      //是否禁用\n      disabled: false,\n    },\n  },\n  {\n    label: '省市县联动',\n    field: 'province',\n    component: 'JAreaLinkage',\n    componentProps: {\n      //是否显示区县，默认true,否则只显示省\n      showArea: true,\n      //是否是全部文本，默认false\n      showAll: true,\n    },\n  },\n  {\n    label: '岗位选择',\n    field: 'post',\n    component: 'JSelectPosition',\n    componentProps: {\n      //是否右侧显示选中列表\n      showSelected: true,\n      //最大选择数量\n      maxSelectCount: 1,\n      //岗位标题\n      modalTitle: '岗位',\n    },\n  },\n  {\n    label: '角色选择',\n    field: 'role',\n    component: 'JSelectRole',\n    componentProps: {\n      //请求参数 如params:{\"code\":\"001\"}\n      params: {},\n      //是否单选,默认false\n      isRadioSelection: true,\n      //角色标题\n      modalTitle: '角色',\n    },\n  },\n  {\n    label: '用户选择',\n    field: 'user',\n    component: 'JSelectUser',\n    componentProps: {\n      //取值字段配置,一般为主键字段\n      rowKey: 'username',\n      //显示字段配置\n      labelKey: 'realname',\n      //是否显示选择按钮\n      showButton: false,\n      //用户标题\n      modalTitle: '用户',\n    },\n  },\n  {\n    label: '图片上传',\n    field: 'uploadImage',\n    component: 'JImageUpload',\n    componentProps: {\n      //按钮显示文字\n      text:'图片上传',\n      //支持两种基本样式picture和picture-card\n      listType:'picture-card',\n      //用于控制文件上传的业务路径,默认temp\n      bizPath:'temp',\n      //是否禁用\n      disabled:false,\n      //最大上传数量\n      fileMax:1,\n    },\n  },\n  {\n    label: '字典标签',\n    field: 'dictTags',\n    component: 'JDictSelectTag',\n    componentProps: {\n      //字典code配置，比如通过性别字典编码：sex，也可以使用demo,name,id 表名,名称,值的方式\n      dictCode:'sex',\n      //支持radio(单选按钮)、radioButton(单选按钮 btn风格)、select(下拉框)\n      type:'radioButton'\n    },\n  },\n  {\n    label: '部门选择',\n    field: 'dept',\n    component: 'JSelectDept',\n    componentProps: {\n      //是否开启异步加载\n      sync: false,\n      //是否显示复选框\n      checkable: true,\n      //是否显示选择按钮\n      showButton: false,\n      //父子节点选中状态不再关联\n      checkStrictly: true,\n      //选择框标题\n      modalTitle: '部门选择',\n    },\n  },\n  {\n    label: '省市县级联动',\n    field: 'provinceArea',\n    component: 'JAreaSelect',\n    componentProps: {\n      //级别 1 只显示省 2 省市 3 省市区\n      level:3\n    },\n  },\n  {\n    label: '富文本',\n    field: 'editor',\n    component: 'JEditor',\n    componentProps: {\n      //是否禁用\n      disabled: false\n    },\n  },\n  {\n    label: 'markdown',\n    field: 'markdown',\n    component: 'JMarkdownEditor',\n    componentProps: {\n      //是否禁用\n      disabled: false\n    },\n  },\n  {\n    label: '可输入下拉框',\n    field: 'inputSelect',\n    component: 'JSelectInput',\n    componentProps: {\n      options: [\n        { label: 'Default', value: 'default' },\n        { label: 'IFrame', value: 'iframe' },\n      ],\n      //是否为搜索模式\n      showSearch: true,\n      //是否禁用\n      disabled: false\n    },\n  },\n  {\n    label: '代码编辑器组件',\n    field: 'jCode',\n    component: 'JCodeEditor',\n    componentProps: {\n      //高度，默认auto\n      height:'150px',\n      //是否禁用\n      disabled:false,\n      //是否全屏\n      fullScreen:false,\n      //全屏之后的坐标\n      zIndex: 999,\n      //代码主题，目前只支持idea,可在组件自行扩展\n      theme:'idea',\n      //代码提示\n      keywords:['console'],\n      //语言如（javascript,vue,markdown）可在组件自行扩展\n      language:'javascript'\n    },\n  },\n  {\n    label: '分类字典树',\n    field: 'dictTree',\n    component: 'JCategorySelect',\n    componentProps: {\n      //占位内容\n      placeholder:'请选择分类字典树',\n      //查询条件，如“{'name':'笔记本'}”\n      condition:\"\",\n      //是否多选\n      multiple: false,\n      //起始选择code，见配置的分类字典的类型编码\n      pcode: 'A04',\n      //父级id\n      pid:'',\n      //返回key\n      back:'id',\n    },\n  },\n  {\n    label: '下拉多选',\n    field: 'selectMultiple',\n    component: 'JSelectMultiple',\n    componentProps: {\n      //字典code配置，比如通过性别字典编码：sex，也可以使用demo,name,id 表名,名称,值的方式\n      dictCode:'company_rank',\n      //是否只读\n      readOnly:false,\n    },\n  },\n  {\n    label: 'popup',\n    field: 'popup',\n    component: 'JPopup',\n    componentProps: ({ formActionType }) => {\n      const {setFieldsValue} = formActionType;\n      return{\n        setFieldsValue:setFieldsValue,\n        //online报表编码\n        code:\"demo\",\n        //是否为多选\n        multi:false,\n        //字段配置\n        fieldConfig: [\n          { source: 'name', target: 'popup' },\n        ],\n      }\n    },\n  },\n  {\n    label: '开关自定义',\n    field: 'switch',\n    component: 'JSwitch',\n    componentProps:{\n      //取值 options\n      options:['Y','N'],\n      //文本option\n      labelOptions:['是', '否'],\n      //是否启用下拉\n      query: false,\n      //是否禁用\n      disabled: false,\n    },\n  },\n  {\n    label: '定时表达式选择',\n    field: 'timing',\n    component: 'JEasyCron',\n    componentProps:{\n      //是否隐藏参数秒和年设置，如果隐藏，那么参数秒和年将会全部忽略掉。\n      hideSecond: false,\n      //是否隐藏参数年设置，如果隐藏，那么参数年将会全部忽略掉\n      hideYear: false,\n      //是否禁用\n      disabled: false,\n      //获取预览执行时间列表的函数，格式为：remote (cron值, time时间戳, cb回调函数)\n      remote:(cron,time,cb)=>{}\n    },\n  },\n  {\n    label: '分类字典树',\n    field: 'treeDict',\n    component: 'JTreeDict',\n    componentProps:{\n      //指定当前组件需要存储的字段 可选: id(主键)和code(编码)\n      field:'id',\n      //是否为异步\n      async: true,\n      //是否禁用\n      disabled: false,\n      //指定一个节点的编码,加载该节点下的所有字典数据,若不指定，默认加载所有数据\n      parentCode:'A04'\n    },\n  },\n  {\n    label: '多行输入窗口',\n    field: 'inputPop',\n    component: 'JInputPop',\n    componentProps:{\n      //标题\n      title:'多行输入窗口',\n      //弹窗显示位置\n      position:'bottom',\n    },\n  },\n  {\n    label: '多选',\n    field: 'multipleChoice',\n    component: 'JCheckbox',\n    componentProps:{\n      //字典code配置，比如通过职位字典编码：company_rank，也可以使用demo,name,id 表名,名称,值的方式\n      dictCode:'company_rank',\n      //是否禁用\n      disabled: false,\n      //没有字典code可以使用option来定义\n      // options:[\n      //   {label:'CE0',value:'1'}\n      // ]\n    },\n  },\n  {\n    label: '下拉树选择',\n    field: 'treeCusSelect',\n    component: 'JTreeSelect',\n    componentProps: {\n      //字典code配置，比如通过性别字典编码：sex，也可以使用sys_permission,name,id 表名,名称,值的方式\n      dict: 'sys_permission,name,id',\n      //父级id字段\n      pidField: 'parent_id',\n    },\n  },\n  {\n    label: '根据部门选择用户组件',\n    field: 'userByDept',\n    component: 'JSelectUserByDept',\n    componentProps: {\n      //是否显示选择按钮\n      showButton: true,\n      //选择框标题\n      modalTitle: '部门用户选择'\n    },\n  },\n  {\n    label: '文件上传',\n    field: 'uploadFile',\n    component: 'JUpload',\n    componentProps: {\n      //是否显示选择按钮\n      text: '文件上传',\n      //最大上传数\n      maxCount: 2,\n      //是否显示下载按钮\n      download: true,\n    },\n  },\n  {\n    label: '字典表搜索',\n    field: 'dictSearchSelect',\n    component: 'JSearchSelect',\n    componentProps: {\n      //字典code配置，通过 demo,name,id 表名,名称,值的方式\n      dict: 'demo,name,id',\n      //是否异步加载\n      async: true,\n      //当async设置为true时有效，表示异步查询时，每次获取数据的数量，默认10\n      pageSize:3\n    },\n  },\n  {\n    label: '动态创建input框',\n    field: 'jAddInput',\n    component: 'JAddInput',\n    componentProps: {\n      //自定义超过多少行才会显示删除按钮，默认为1\n      min:1\n    },\n  },\n  {\n    label: '用户选择组件',\n    field: 'userCusSelect',\n    component: 'UserSelect',\n    componentProps: {\n      //是否多选\n      multi: true,\n      //从用户表中选择一列，其值作为该控件的存储值，默认id列\n      store: 'id',\n      //是否排除我自己(当前登录用户)\n      izExcludeMy: false,\n      //是否禁用\n      disabled: false,\n    },\n  },  \n  {\n    label: '选择角色组件',\n    field: 'roleSelect',\n    component: 'RoleSelect',\n    componentProps: {\n      //最大选择数量  \n      maxSelectCount: 4,\n      //是否单选\n      multi: true\n    },\n  },  \n  {\n    label: '数值范围输入框',\n    field: 'rangeNumber',\n    component: 'JRangeNumber',\n  }, \n  {\n    label: '远程Api单选框组',\n    field: 'apiRadioGroup',\n    component: 'ApiRadioGroup',\n    componentProps:{\n      //请求接口返回结果{ result:{ list: [ name: '选项0',id: '1' ] }}\n      api:()=> defHttp.get({ url: '/mock/select/getDemoOptions' }),\n      //请求参数\n      params:{},\n      //是否为按钮风格类型，默认false\n      isBtn: false,\n      //返回集合名称\n      resultField: 'list',\n      //标题字段名称\n      labelField: 'name',\n      //值字段名称\n      valueField: 'id',\n    }\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/index.ts",
    "content": "export { default as BasicFiledsLayotForm } from './BasicFiledsLayotForm.vue';\nexport { default as BasicFixedWidthForm } from './BasicFixedWidthForm.vue';\nexport { default as BasicFormAdd } from './BasicFormAdd.vue';\nexport { default as BasicFormBtn } from './BasicFormBtn.vue';\nexport { default as BasicFormCleanRule } from './BasicFormCleanRule.vue';\nexport { default as BasicFormCompact } from './BasicFormCompact.vue';\nexport { default as BasicFormComponent } from './BasicFormComponent.vue';\nexport { default as BasicFormConAttribute } from './BasicFormConAttribute.vue';\nexport { default as BasicFormCustom } from './BasicFormCustom.vue';\nexport { default as BasicFormCustomComponent } from './BasicFormCustomComponent.vue';\nexport { default as BasicFormCustomSlots } from './BasicFormCustomSlots.vue';\nexport { default as BasicFormDynamicsRules } from './BasicFormDynamicsRules.vue';\nexport { default as BasicFormFieldShow } from './BasicFormFieldShow.vue';\nexport { default as BasicFormFieldTip } from './BasicFormFieldTip.vue';\nexport { default as BasicFormFooter } from './BasicFormFooter.vue';\nexport { default as BasicFormLayout } from './BasicFormLayout.vue';\nexport { default as BasicFormModal } from './BasicFormModal.vue';\nexport { default as BasicFormRander } from './BasicFormRander.vue';\nexport { default as BasicFormRules } from './BasicFormRules.vue';\nexport { default as BasicFormSchemas } from './BasicFormSchemas.vue';\nexport { default as BasicFormSearch } from './BasicFormSearch.vue';\nexport { default as BasicFormSlots } from './BasicFormSlots.vue';\nexport { default as BasicFormValue } from './BasicFormValue.vue';\nexport { default as BasicFunctionForm } from './BasicFunctionForm.vue';"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/form/tabIndex.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <a-card :bordered=\"false\" style=\"height: 100%\">\n      <a-tabs v-model:activeKey=\"activeKey\" @change=\"tabChange\">\n        <a-tab-pane :key=\"item.key\" :tab=\"item.label\" v-for=\"item in compList\" />\n      </a-tabs>\n      <component :is=\"currentComponent\" />\n    </a-card>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, computed } from 'vue';\n  import {\n    BasicFunctionForm,\n    BasicFormConAttribute,\n    BasicFormFieldShow,\n    BasicFormFieldTip,\n    BasicFormRules,\n    BasicFormDynamicsRules,\n    BasicFormSlots,\n    BasicFormCustomSlots,\n    BasicFormRander,\n    BasicFixedWidthForm,\n    BasicFiledsLayotForm,\n    BasicFormLayout,\n    BasicFormBtn,\n    BasicFormCompact,\n    BasicFormCleanRule,\n    BasicFormValue,\n    BasicFormSchemas,\n    BasicFormAdd,\n    BasicFormFooter,\n    BasicFormModal,\n    BasicFormCustom,\n    BasicFormSearch,\n    BasicFormComponent,\n    BasicFormCustomComponent,\n  } from './index';\n  export default defineComponent({\n    name: 'document-table-demo',\n    components: {\n      BasicFunctionForm,\n      BasicFormConAttribute,\n      BasicFormFieldShow,\n      BasicFormFieldTip,\n      BasicFormRules,\n      BasicFormDynamicsRules,\n      BasicFormSlots,\n      BasicFormCustomSlots,\n      BasicFormRander,\n      BasicFixedWidthForm,\n      BasicFiledsLayotForm,\n      BasicFormLayout,\n      BasicFormBtn,\n      BasicFormCompact,\n      BasicFormCleanRule,\n      BasicFormValue,\n      BasicFormSchemas,\n      BasicFormAdd,\n      BasicFormFooter,\n      BasicFormModal,\n      BasicFormCustom,\n      BasicFormSearch,\n      BasicFormComponent,\n      BasicFormCustomComponent,\n    },\n    setup() {\n      //当前选中key\n      const activeKey = ref('BasicFunctionForm');\n      //组件集合\n      const compList = ref([\n        { key: 'BasicFunctionForm', label: '基础表单' },\n        { key: 'BasicFormConAttribute', label: '字段控件属性' },\n        { key: 'BasicFormComponent', label: 'Ant Design Vue自带控件' },\n        { key: 'BasicFormCustomComponent', label: 'JEECG封装的控件' },\n        { key: 'BasicFormFieldShow', label: '字段显示和隐藏' },\n        { key: 'BasicFormFieldTip', label: '字段标题提示' },\n        { key: 'BasicFormRules', label: '表单检验' },\n        { key: 'BasicFormDynamicsRules', label: '自定义动态检验' },\n        { key: 'BasicFormSlots', label: '字段插槽' },\n        { key: 'BasicFormCustomSlots', label: '自定义组件(插槽)' },\n        { key: 'BasicFormCustom', label: '自定义组件(component)' },\n        { key: 'BasicFormRander', label: '自定义渲染' },\n        { key: 'BasicFixedWidthForm', label: '固定label宽度' },\n        { key: 'BasicFiledsLayotForm', label: '标题与字段布局' },\n        { key: 'BasicFormLayout', label: '表单布局' },\n        { key: 'BasicFormBtn', label: '操作按钮示例' },\n        { key: 'BasicFormCompact', label: '表单紧凑' },\n        { key: 'BasicFormCleanRule', label: '表单检验配置' },\n        { key: 'BasicFormValue', label: '获取value值' },\n        { key: 'BasicFormSchemas', label: '更新schemas表单配置' },\n        { key: 'BasicFormAdd', label: '动态增减表单' },\n        { key: 'BasicFormFooter', label: '自定义页脚' },\n        { key: 'BasicFormModal', label: '弹出层表单' },\n        { key: 'BasicFormSearch', label: '查询区域' },\n      ]);\n      //当前选中组件\n      const currentComponent = computed(() => {\n        return activeKey.value;\n      });\n\n      //使用component动态切换tab\n      function tabChange(key) {\n        activeKey.value = key;\n      }\n      return {\n        activeKey,\n        currentComponent,\n        tabChange,\n        compList,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/table/AuthColumnDemo.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\">\n      <template #action=\"{ record }\">\n        <TableAction\n          :actions=\"[\n            {\n              label: '编辑',\n              onClick: handleEdit.bind(null, record),\n              auth: 'demo:btn:show', // 根据权限控制是否显示: 无权限，不显示\n            },\n            {\n              label: '删除',\n              icon: 'ic:outline-delete-outline',\n              onClick: handleDelete.bind(null, record),\n              auth: 'super', // 根据权限控制是否显示: 有权限，会显示\n            },\n          ]\"\n          :dropDownActions=\"[\n            {\n              label: '启用',\n              popConfirm: {\n                title: '是否启用？',\n                confirm: handleOpen.bind(null, record),\n              },\n              ifShow: (_action) => {\n                return record.status !== 'enable'; // 根据业务控制是否显示: 非enable状态的不显示启用按钮\n              },\n            },\n            {\n              label: '禁用',\n              popConfirm: {\n                title: '是否禁用？',\n                confirm: handleOpen.bind(null, record),\n              },\n              ifShow: () => {\n                return record.status === 'enable'; // 根据业务控制是否显示: enable状态的显示禁用按钮\n              },\n            },\n            {\n              label: '同时控制',\n              popConfirm: {\n                title: '是否动态显示？',\n                confirm: handleOpen.bind(null, record),\n              },\n              auth: 'super', // 同时根据权限和业务控制是否显示\n              ifShow: () => {\n                return true;\n              },\n            },\n          ]\"\n        />\n      </template>\n    </BasicTable>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable, useTable, BasicColumn, TableAction } from '/@/components/Table';\n\n  import { demoListApi } from '/@/api/demo/table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  const columns: BasicColumn[] = [\n    {\n      title: '编号',\n      dataIndex: 'no',\n      width: 100,\n    },\n    {\n      title: '姓名',\n      dataIndex: 'name',\n      auth: 'demo:field:show', // 根据权限控制是否显示: 无权限，不显示\n    },\n    {\n      title: '状态',\n      dataIndex: 'status',\n    },\n    {\n      title: '地址',\n      dataIndex: 'address',\n      auth: 'super', // 同时根据权限和业务控制是否显示\n      ifShow: (_column) => {\n        return true;\n      },\n    },\n    {\n      title: '开始时间',\n      dataIndex: 'beginTime',\n    },\n    {\n      title: '结束时间',\n      dataIndex: 'endTime',\n      width: 200,\n    },\n  ];\n  export default defineComponent({\n    components: { BasicTable, TableAction },\n    setup() {\n      const { tableContext } = useListPage({\n        tableProps: {\n          title: '权限列',\n          api: demoListApi,\n          columns: columns,\n          bordered: true,\n          useSearchForm: false,\n          actionColumn: {\n            width: 250,\n            title: 'Action',\n            dataIndex: 'action',\n            slots: { customRender: 'action' },\n          },\n        },\n      });\n\n      //注册table数据\n      const [registerTable] = tableContext;\n\n      function handleEdit(record: Recordable) {\n        console.log('点击了编辑', record);\n      }\n      function handleDelete(record: Recordable) {\n        console.log('点击了删除', record);\n      }\n      function handleOpen(record: Recordable) {\n        console.log('点击了启用', record);\n      }\n      return {\n        registerTable,\n        handleEdit,\n        handleDelete,\n        handleOpen,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/table/BasicTableBorder.vue",
    "content": "<template>\n  <!--引用表格-->\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\">\n      <template #bodyCell=\"{ column, text }\">\n        <template v-if=\"column.dataIndex === 'name'\">\n          <a>{{ text }}</a>\n        </template>\n      </template>\n      <template #footer>页脚</template>\n    </BasicTable>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"basic-table-demo\" setup>\n  import { ActionItem, BasicColumn, BasicTable, TableAction } from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  //定义表格列\n  const columns: BasicColumn[] = [\n    {\n      title: '姓名',\n      dataIndex: 'name',\n      key: 'name',\n      width: 300,\n    },\n    {\n      title: '年龄',\n      dataIndex: 'age',\n      key: 'age',\n      width: 300,\n    },\n    {\n      title: '住址',\n      dataIndex: 'address',\n      key: 'address',\n      ellipsis: true,\n    },\n    {\n      title: '长内容列',\n      dataIndex: 'address',\n      key: 'address 2',\n      ellipsis: true,\n    },\n    {\n      title: '长内容列',\n      dataIndex: 'address',\n      key: 'address 3',\n      ellipsis: true,\n    },\n  ];\n  // 列表页面公共参数、方法\n  const { tableContext } = useListPage({\n    designScope: 'basic-table-demo',\n    tableProps: {\n      title: '边框表格',\n      dataSource: [\n        {\n          key: '1',\n          name: '张三',\n          age: 32,\n          address: '中国北京北京市朝阳区大屯路科学院南里1号楼3单元401',\n        },\n        {\n          key: '2',\n          name: '刘思',\n          age: 32,\n          address: '中国北京北京市昌平区顺沙路尚湖世家2号楼7单元503',\n        },\n      ],\n      columns: columns,\n      showActionColumn: false,\n      useSearchForm: false,\n    },\n  });\n  //注册table数据\n  const [registerTable] = tableContext;\n  /**\n   * 操作栏\n   */\n  function getTableAction(record): ActionItem[] {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n    ];\n  }\n\n  function handleEdit(record) {\n    console.log(record);\n  }\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/table/BasicTableDemo.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <!--引用表格-->\n    <BasicTable @register=\"registerTable\">\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n    </BasicTable>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"basic-table-demo\" setup>\n  import { ActionItem, BasicColumn, BasicTable, TableAction } from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  //定义表格列\n  const columns: BasicColumn[] = [\n    {\n      title: '姓名',\n      dataIndex: 'name',\n      key: 'name',\n      resizable: false,\n    },\n    {\n      title: '年龄',\n      dataIndex: 'age',\n      key: 'age',\n    },\n    {\n      title: '住址',\n      dataIndex: 'address',\n      key: 'address',\n    },\n  ];\n  // 列表页面公共参数、方法\n  const { tableContext } = useListPage({\n    designScope: 'basic-table-demo',\n    tableProps: {\n      title: '用户列表',\n      dataSource: [\n        {\n          key: '1',\n          name: '胡歌',\n          age: 32,\n          address: '朝阳区林萃路1号',\n        },\n        {\n          key: '2',\n          name: '刘诗诗',\n          age: 32,\n          address: '昌平区白沙路1号',\n        },\n      ],\n      columns: columns,\n      size: 'large', //紧凑型表格 large\n      striped: false, //斑马纹设置 false\n      showActionColumn: true,\n      useSearchForm: false,\n    },\n  });\n  //注册table数据\n  const [registerTable, methods] = tableContext;\n  console.log('methods', methods);\n  /**\n   * 操作栏\n   */\n  function getTableAction(record): ActionItem[] {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n    ];\n  }\n\n  function handleEdit(record) {\n    console.log(record);\n  }\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/table/BasicTableDemoAjax.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <!--定义表格-->\n    <BasicTable @register=\"registerTable\">\n      <!-- 搜索区域插槽自定义查询 -->\n      <template #form-email=\"{ model, field }\">\n        <a-input placeholder=\"请输入邮箱\" v-model:value=\"model[field]\" addon-before=\"邮箱:\" addon-after=\".com\"></a-input>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n    </BasicTable>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"basic-table-demo\" setup>\n  import { ActionItem, BasicColumn, BasicTable, FormSchema, TableAction } from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { defHttp } from '/@/utils/http/axios';\n  //定义表格列\n  const columns: BasicColumn[] = [\n    {\n      title: '姓名',\n      dataIndex: 'name',\n      width: 170,\n      align: 'left',\n      resizable: true,\n      sorter: {\n        multiple: 1,\n      },\n    },\n    {\n      title: '关键词',\n      dataIndex: 'keyWord',\n      width: 130,\n      resizable: true,\n    },\n    {\n      title: '打卡时间',\n      dataIndex: 'punchTime',\n      width: 140,\n      resizable: true,\n    },\n    {\n      title: '工资',\n      dataIndex: 'salaryMoney',\n      width: 140,\n      resizable: true,\n      sorter: {\n        multiple: 2,\n      },\n    },\n    {\n      title: '奖金',\n      dataIndex: 'bonusMoney',\n      width: 140,\n      resizable: true,\n    },\n    {\n      title: '性别',\n      dataIndex: 'sex',\n      sorter: {\n        multiple: 3,\n      },\n      filters: [\n        { text: '男', value: '1' },\n        { text: '女', value: '2' },\n      ],\n      customRender: ({ record }) => {\n        return record.sex ? (record.sex == '1' ? '男' : '女') : '';\n      },\n      width: 120,\n      resizable: true,\n    },\n    {\n      title: '生日',\n      dataIndex: 'birthday',\n      width: 120,\n      resizable: true,\n    },\n    {\n      title: '邮箱',\n      dataIndex: 'email',\n      width: 120,\n      resizable: true,\n    },\n  ];\n  //表单搜索字段\n  const searchFormSchema: FormSchema[] = [\n    {\n      label: '姓名', //显示label\n      field: 'name', //查询字段\n      component: 'JInput', //渲染的组件\n      defaultValue: '苏榕润', //设置默认值\n    },\n    {\n      label: '性别',\n      field: 'sex',\n      component: 'JDictSelectTag',\n      componentProps: {\n        //渲染的组件的props\n        dictCode: 'sex',\n        placeholder: '请选择性别',\n      },\n    },\n    {\n      label: '邮箱',\n      field: 'email',\n      component: 'JInput',\n      slot: 'email',\n    },\n    {\n      label: '生日',\n      field: 'birthday',\n      component: 'DatePicker',\n    },\n  ];\n  //ajax请求api接口\n  const demoListApi = (params) => {\n    return defHttp.get({ url: '/test/jeecgDemo/list', params });\n  };\n  // 列表页面公共参数、方法\n  const { tableContext } = useListPage({\n    designScope: 'basic-table-demo-filter',\n    tableProps: {\n      title: '用户列表',\n      api: demoListApi,\n      columns: columns,\n      formConfig: {\n        schemas: searchFormSchema,\n      },\n      useSearchForm: true,\n    },\n  });\n  //BasicTable绑定注册\n  const [registerTable, { getForm }] = tableContext;\n  /**\n   * 操作栏\n   */\n  function getTableAction(record): ActionItem[] {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n    ];\n  }\n\n  function handleEdit(record) {\n    let { getFieldsValue } = getForm();\n    console.log('查询form的数据', getFieldsValue());\n    console.log(record);\n  }\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/table/CustomerCellDemo.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\">\n      <template #id=\"{ record }\"> ID: {{ record.id }} </template>\n      <template #bodyCell=\"{ column, record }\">\n        <Avatar v-if=\"column.key === 'avatar'\" :size=\"60\" :src=\"record.avatar\" />\n        <Tag v-if=\"column.key === 'no'\" color=\"green\">\n          {{ record.no }}\n        </Tag>\n      </template>\n      <template #img=\"{ text }\">\n        <TableImg :size=\"60\" :simpleShow=\"true\" :imgList=\"text\" />\n      </template>\n      <template #imgs=\"{ text }\"> <TableImg :size=\"60\" :imgList=\"text\" /> </template>\n\n      <template #category=\"{ record }\">\n        <Tag color=\"green\">\n          {{ record.no }}\n        </Tag>\n      </template>\n    </BasicTable>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable, useTable, BasicColumn, TableImg } from '/@/components/Table';\n  import { Tag, Avatar } from 'ant-design-vue';\n  import { demoListApi } from '/@/api/demo/table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  const columns: BasicColumn[] = [\n    {\n      title: 'ID',\n      dataIndex: 'id',\n      slots: { customRender: 'id' },\n    },\n    {\n      title: '头像',\n      dataIndex: 'avatar',\n      width: 100,\n    },\n    {\n      title: '分类',\n      dataIndex: 'category',\n      width: 80,\n      align: 'center',\n      defaultHidden: true,\n      slots: { customRender: 'category' },\n    },\n    {\n      title: '姓名',\n      dataIndex: 'name',\n      width: 120,\n    },\n    {\n      title: '图片列表1',\n      dataIndex: 'imgArr',\n      helpMessage: ['这是简单模式的图片列表', '只会显示一张在表格中', '但点击可预览多张图片'],\n      width: 140,\n      slots: { customRender: 'img' },\n    },\n    {\n      title: '照片列表2',\n      dataIndex: 'imgs',\n      width: 160,\n      slots: { customRender: 'imgs' },\n    },\n    {\n      title: '地址',\n      dataIndex: 'address',\n    },\n    {\n      title: '编号',\n      dataIndex: 'no',\n    },\n    {\n      title: '开始时间',\n      dataIndex: 'beginTime',\n    },\n    {\n      title: '结束时间',\n      dataIndex: 'endTime',\n    },\n  ];\n  export default defineComponent({\n    components: { BasicTable, TableImg, Tag, Avatar },\n    setup() {\n      const { tableContext } = useListPage({\n        tableProps: {\n          title: '自定义列内容',\n          titleHelpMessage: '表格中所有头像、图片均为mock生成，仅用于演示图片占位',\n          api: demoListApi,\n          columns: columns,\n          bordered: true,\n          showTableSetting: false,\n          showActionColumn: false,\n          useSearchForm: false,\n        },\n      });\n      //注册table数据\n      const [registerTable] = tableContext;\n      return {\n        registerTable,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/table/EditCellTableDemo.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\" @edit-end=\"handleEditEnd\" @edit-cancel=\"handleEditCancel\" :beforeEditSubmit=\"beforeEditSubmit\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable, useTable, BasicColumn } from '/@/components/Table';\n  import { optionsListApi } from '/@/api/demo/select';\n\n  import { demoListApi } from '/@/api/demo/table';\n  import { treeOptionsListApi } from '/@/api/demo/tree';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  const columns: BasicColumn[] = [\n    {\n      title: '输入框',\n      dataIndex: 'name',\n      edit: true,\n      editComponentProps: {\n        prefix: '$',\n      },\n      width: 200,\n    },\n    {\n      title: '默认输入状态',\n      dataIndex: 'name7',\n      edit: true,\n      editable: true,\n      width: 200,\n    },\n    {\n      title: '输入框校验',\n      dataIndex: 'name1',\n      edit: true,\n      // 默认必填校验\n      editRule: true,\n      width: 200,\n    },\n    {\n      title: '输入框函数校验',\n      dataIndex: 'name2',\n      edit: true,\n      editRule: async (text) => {\n        if (text === '2') {\n          return '不能输入该值';\n        }\n        return '';\n      },\n      width: 200,\n    },\n    {\n      title: '数字输入框',\n      dataIndex: 'id',\n      edit: true,\n      editRule: true,\n      editComponent: 'InputNumber',\n      width: 200,\n    },\n    {\n      title: '下拉框',\n      dataIndex: 'name3',\n      edit: true,\n      editComponent: 'Select',\n      editComponentProps: {\n        options: [\n          {\n            label: 'Option1',\n            value: '1',\n          },\n          {\n            label: 'Option2',\n            value: '2',\n          },\n        ],\n      },\n      width: 200,\n    },\n    {\n      title: '远程下拉',\n      dataIndex: 'name4',\n      edit: true,\n      editComponent: 'ApiSelect',\n      editComponentProps: {\n        api: optionsListApi,\n        resultField: 'list',\n        labelField: 'name',\n        valueField: 'id',\n      },\n      width: 200,\n    },\n    {\n      title: '远程下拉树',\n      dataIndex: 'name71',\n      edit: true,\n      editComponent: 'ApiTreeSelect',\n      editRule: false,\n      editComponentProps: {\n        api: treeOptionsListApi,\n        resultField: 'list',\n      },\n      width: 200,\n    },\n    {\n      title: '日期选择',\n      dataIndex: 'date',\n      edit: true,\n      editComponent: 'DatePicker',\n      editComponentProps: {\n        valueFormat: 'YYYY-MM-DD',\n        format: 'YYYY-MM-DD',\n      },\n      width: 200,\n    },\n    {\n      title: '时间选择',\n      dataIndex: 'time',\n      edit: true,\n      editComponent: 'TimePicker',\n      editComponentProps: {\n        valueFormat: 'HH:mm',\n        format: 'HH:mm',\n      },\n      width: 200,\n    },\n    {\n      title: '勾选框',\n      dataIndex: 'name5',\n      edit: true,\n      editComponent: 'Checkbox',\n      editValueMap: (value) => {\n        return value ? '是' : '否';\n      },\n      width: 200,\n    },\n    {\n      title: '开关',\n      dataIndex: 'name6',\n      edit: true,\n      editComponent: 'Switch',\n      editValueMap: (value) => {\n        return value ? '开' : '关';\n      },\n      width: 200,\n    },\n  ];\n  export default defineComponent({\n    components: { BasicTable },\n    setup() {\n      // 列表页面公共参数、方法\n      const { tableContext } = useListPage({\n        designScope: 'basic-table-demo',\n        tableProps: {\n          title: '可编辑单元格示例',\n          api: demoListApi,\n          columns: columns,\n          showIndexColumn: false,\n          bordered: true,\n          showActionColumn: false,\n          useSearchForm: false,\n        },\n      });\n      //注册table数据\n      const [registerTable] = tableContext;\n      const { createMessage } = useMessage();\n\n      function handleEditEnd({ record, index, key, value }: Recordable) {\n        console.log(record, index, key, value);\n        return false;\n      }\n\n      // 模拟将指定数据保存\n      function feakSave({ value, key, id }) {\n        createMessage.loading({\n          content: `正在模拟保存${key}`,\n          key: '_save_fake_data',\n          duration: 0,\n        });\n        return new Promise((resolve) => {\n          setTimeout(() => {\n            if (value === '') {\n              createMessage.error({\n                content: '保存失败：不能为空',\n                key: '_save_fake_data',\n                duration: 2,\n              });\n              resolve(false);\n            } else {\n              createMessage.success({\n                content: `记录${id}的${key}已保存`,\n                key: '_save_fake_data',\n                duration: 2,\n              });\n              resolve(true);\n            }\n          }, 2000);\n        });\n      }\n\n      async function beforeEditSubmit({ record, index, key, value }) {\n        console.log('单元格数据正在准备提交', { record, index, key, value });\n        return await feakSave({ id: record.id, key, value });\n      }\n\n      function handleEditCancel() {\n        console.log('cancel');\n      }\n\n      return {\n        registerTable,\n        handleEditEnd,\n        handleEditCancel,\n        beforeEditSubmit,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/table/EditRowTableDemo.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\" @edit-change=\"onEditChange\">\n      <template #action=\"{ record, column }\">\n        <TableAction :actions=\"createActions(record, column)\" />\n      </template>\n    </BasicTable>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import { BasicTable, useTable, TableAction, BasicColumn, ActionItem, EditRecordRow } from '/@/components/Table';\n  import { optionsListApi } from '/@/api/demo/select';\n\n  import { demoListApi } from '/@/api/demo/table';\n  import { treeOptionsListApi } from '/@/api/demo/tree';\n  import { cloneDeep } from 'lodash-es';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useListPage } from '/@/hooks/system/useListPage';\n\n  const columns: BasicColumn[] = [\n    {\n      title: '输入框',\n      dataIndex: 'name',\n      editRow: true,\n      editComponentProps: {\n        prefix: '$',\n      },\n      width: 150,\n    },\n    {\n      title: '默认输入状态',\n      dataIndex: 'name7',\n      editRow: true,\n      width: 150,\n    },\n    {\n      title: '输入框校验',\n      dataIndex: 'name1',\n      editRow: true,\n      align: 'left',\n      // 默认必填校验\n      editRule: true,\n      width: 150,\n    },\n    {\n      title: '输入框函数校验',\n      dataIndex: 'name2',\n      editRow: true,\n      align: 'right',\n      editRule: async (text) => {\n        if (text === '2') {\n          return '不能输入该值';\n        }\n        return '';\n      },\n    },\n    {\n      title: '数字输入框',\n      dataIndex: 'id',\n      editRow: true,\n      editRule: true,\n      editComponent: 'InputNumber',\n      width: 150,\n    },\n    {\n      title: '下拉框',\n      dataIndex: 'name3',\n      editRow: true,\n      editComponent: 'Select',\n      editComponentProps: {\n        options: [\n          {\n            label: 'Option1',\n            value: '1',\n          },\n          {\n            label: 'Option2',\n            value: '2',\n          },\n          {\n            label: 'Option3',\n            value: '3',\n          },\n        ],\n      },\n      width: 200,\n    },\n    {\n      title: '远程下拉',\n      dataIndex: 'name4',\n      editRow: true,\n      editComponent: 'ApiSelect',\n      editComponentProps: {\n        api: optionsListApi,\n        resultField: 'list',\n        labelField: 'name',\n        valueField: 'id',\n      },\n      width: 200,\n    },\n    {\n      title: '远程下拉树',\n      dataIndex: 'name8',\n      editRow: true,\n      editComponent: 'ApiTreeSelect',\n      editRule: false,\n      editComponentProps: {\n        api: treeOptionsListApi,\n        resultField: 'list',\n      },\n      width: 200,\n    },\n    {\n      title: '日期选择',\n      dataIndex: 'date',\n      editRow: true,\n      editComponent: 'DatePicker',\n      editComponentProps: {\n        valueFormat: 'YYYY-MM-DD',\n        format: 'YYYY-MM-DD',\n      },\n      width: 150,\n    },\n    {\n      title: '时间选择',\n      dataIndex: 'time',\n      editRow: true,\n      editComponent: 'TimePicker',\n      editComponentProps: {\n        valueFormat: 'HH:mm',\n        format: 'HH:mm',\n      },\n      width: 100,\n    },\n    {\n      title: '勾选框',\n      dataIndex: 'name5',\n      editRow: true,\n\n      editComponent: 'Checkbox',\n      editValueMap: (value) => {\n        return value ? '是' : '否';\n      },\n      width: 100,\n    },\n    {\n      title: '开关',\n      dataIndex: 'name6',\n      editRow: true,\n      editComponent: 'Switch',\n      editValueMap: (value) => {\n        return value ? '开' : '关';\n      },\n      width: 100,\n    },\n  ];\n  export default defineComponent({\n    components: { BasicTable, TableAction },\n    setup() {\n      const { createMessage: msg } = useMessage();\n      const currentEditKeyRef = ref('');\n\n      const { tableContext } = useListPage({\n        designScope: 'basic-table-demo',\n        tableProps: {\n          title: '可编辑行示例',\n          titleHelpMessage: ['本例中修改[数字输入框]这一列时，同一行的[远程下拉]列的当前编辑数据也会同步发生改变'],\n          api: demoListApi,\n          columns: columns,\n          showIndexColumn: false,\n          showTableSetting: true,\n          tableSetting: { fullScreen: true },\n          actionColumn: {\n            width: 160,\n            title: 'Action',\n            dataIndex: 'action',\n            slots: { customRender: 'action' },\n          },\n          useSearchForm: false,\n        },\n      });\n      //注册table数据\n      const [registerTable] = tableContext;\n\n      function handleEdit(record: EditRecordRow) {\n        currentEditKeyRef.value = record.key;\n        record.onEdit?.(true);\n      }\n\n      function handleCancel(record: EditRecordRow) {\n        currentEditKeyRef.value = '';\n        record.onEdit?.(false, false);\n      }\n\n      async function handleSave(record: EditRecordRow) {\n        // 校验\n        msg.loading({ content: '正在保存...', duration: 0, key: 'saving' });\n        const valid = await record.onValid?.();\n        if (valid) {\n          try {\n            const data = cloneDeep(record.editValueRefs);\n            console.log(data);\n            //TODO 此处将数据提交给服务器保存\n            // ...\n            // 保存之后提交编辑状态\n            const pass = await record.onEdit?.(false, true);\n            if (pass) {\n              currentEditKeyRef.value = '';\n            }\n            msg.success({ content: '数据已保存', key: 'saving' });\n          } catch (error) {\n            msg.error({ content: '保存失败', key: 'saving' });\n          }\n        } else {\n          msg.error({ content: '请填写正确的数据', key: 'saving' });\n        }\n      }\n\n      function createActions(record: EditRecordRow, column: BasicColumn): ActionItem[] {\n        if (!record.editable) {\n          return [\n            {\n              label: '编辑',\n              disabled: currentEditKeyRef.value ? currentEditKeyRef.value !== record.key : false,\n              onClick: handleEdit.bind(null, record),\n            },\n          ];\n        }\n        return [\n          {\n            label: '保存',\n            onClick: handleSave.bind(null, record, column),\n          },\n          {\n            label: '取消',\n            popConfirm: {\n              title: '是否取消编辑',\n              confirm: handleCancel.bind(null, record, column),\n            },\n          },\n        ];\n      }\n\n      function onEditChange({ column, value, record }) {\n        // 本例\n        if (column.dataIndex === 'id') {\n          record.editValueRefs.name4.value = `${value}`;\n        }\n        console.log(column, value, record);\n      }\n\n      return {\n        registerTable,\n        handleEdit,\n        createActions,\n        onEditChange,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/table/ExpandTableDemo.vue",
    "content": "<template>\n  <PageWrapper\n    title=\"可展开表格\"\n    content=\"不可与scroll共用。TableAction组件可配置stopButtonPropagation来阻止操作按钮的点击事件冒泡，以便配合Table组件的expandRowByClick\"\n  >\n    <BasicTable @register=\"registerTable\">\n      <template #expandedRowRender=\"{ record }\">\n        <span>No: {{ record.no }} </span>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction\n          stopButtonPropagation\n          :actions=\"[\n            {\n              label: '删除',\n              icon: 'ic:outline-delete-outline',\n              onClick: handleDelete.bind(null, record),\n            },\n          ]\"\n          :dropDownActions=\"[\n            {\n              label: '启用',\n              popConfirm: {\n                title: '是否启用？',\n                confirm: handleOpen.bind(null, record),\n              },\n            },\n          ]\"\n        />\n      </template>\n    </BasicTable>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable, useTable, TableAction, BasicColumn } from '/@/components/Table';\n  import { PageWrapper } from '/@/components/Page';\n  import { demoListApi } from '/@/api/demo/table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  const columns: BasicColumn[] = [\n    {\n      title: 'ID',\n      dataIndex: 'id',\n      fixed: 'left',\n      width: 200,\n    },\n    {\n      title: '姓名',\n      dataIndex: 'name',\n      width: 150,\n      filters: [\n        { text: 'Male', value: 'male' },\n        { text: 'Female', value: 'female' },\n      ],\n    },\n    {\n      title: '地址',\n      dataIndex: 'address',\n      width: 300,\n    },\n    {\n      title: '编号',\n      dataIndex: 'no',\n      width: 150,\n      sorter: true,\n      defaultHidden: true,\n    },\n    {\n      title: '开始时间',\n      width: 150,\n      sorter: true,\n      dataIndex: 'beginTime',\n    },\n    {\n      title: '结束时间',\n      width: 150,\n      sorter: true,\n      dataIndex: 'endTime',\n    },\n  ];\n  export default defineComponent({\n    components: { BasicTable, TableAction, PageWrapper },\n    setup() {\n      const { tableContext } = useListPage({\n        designScope: 'basic-table-demo',\n        tableProps: {\n          api: demoListApi,\n          title: '可展开表格演示',\n          titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],\n          columns: columns,\n          rowKey: 'id',\n          canResize: false,\n          expandRowByClick: true,\n          actionColumn: {\n            width: 160,\n            title: 'Action',\n            dataIndex: 'action',\n          },\n          useSearchForm: false,\n        },\n      });\n      //注册table数据\n      const [registerTable] = tableContext;\n\n      function handleDelete(record: Recordable) {\n        console.log('点击了删除', record);\n      }\n      function handleOpen(record: Recordable) {\n        console.log('点击了启用', record);\n      }\n\n      return {\n        registerTable,\n        handleDelete,\n        handleOpen,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/table/ExportTableDemo.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <!--引用表格-->\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <template #tableTitle>\n        <a-button type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n        <j-upload-button type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n    </BasicTable>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"basic-table-demo\" setup>\n  import { ActionItem, BasicColumn, BasicTable, TableAction } from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { defHttp } from '/@/utils/http/axios';\n  //定义表格列\n  const columns: BasicColumn[] = [\n    {\n      title: '姓名',\n      dataIndex: 'name',\n      width: 170,\n      align: 'left',\n      resizable: true,\n      sorter: {\n        multiple: 1,\n      },\n    },\n    {\n      title: '关键词',\n      dataIndex: 'keyWord',\n      width: 130,\n      resizable: true,\n    },\n    {\n      title: '打卡时间',\n      dataIndex: 'punchTime',\n      width: 140,\n      resizable: true,\n    },\n    {\n      title: '工资',\n      dataIndex: 'salaryMoney',\n      width: 140,\n      resizable: true,\n      sorter: {\n        multiple: 2,\n      },\n    },\n    {\n      title: '奖金',\n      dataIndex: 'bonusMoney',\n      width: 140,\n      resizable: true,\n    },\n    {\n      title: '性别',\n      dataIndex: 'sex',\n      sorter: {\n        multiple: 3,\n      },\n      filters: [\n        { text: '男', value: '1' },\n        { text: '女', value: '2' },\n      ],\n      customRender: ({ record }) => {\n        return record.sex ? (record.sex == '1' ? '男' : '女') : '';\n      },\n      width: 120,\n      resizable: true,\n    },\n    {\n      title: '生日',\n      dataIndex: 'birthday',\n      width: 120,\n      resizable: true,\n    },\n    {\n      title: '邮箱',\n      dataIndex: 'email',\n      width: 120,\n      resizable: true,\n    },\n  ];\n\n  //ajax请求api接口\n  const demoListApi = (params) => {\n    return defHttp.get({ url: '/test/jeecgDemo/list', params });\n  };\n  // 列表页面公共参数、方法\n  const { tableContext, onExportXls, onImportXls } = useListPage({\n    designScope: 'basic-table-demo-filter',\n    tableProps: {\n      title: '表单搜索',\n      api: demoListApi,\n      columns: columns,\n      showActionColumn: false,\n      useSearchForm: false,\n    },\n    exportConfig: {\n      name: '示例列表',\n      url: '/test/jeecgDemo/exportXls',\n    },\n    importConfig: {\n      url: '/test/jeecgDemo/importExcel',\n    },\n  });\n  //注册table数据\n  const [registerTable, { reload }, { rowSelection, selectedRows, selectedRowKeys }] = tableContext;\n  /**\n   * 操作栏\n   */\n  function getTableAction(record): ActionItem[] {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n    ];\n  }\n\n  function handleEdit(record) {\n    console.log(record);\n  }\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/table/FixedHeaderColumn.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\">\n      <template #action=\"{ record }\">\n        <TableAction\n          :actions=\"[\n            {\n              label: '删除',\n              icon: 'ic:outline-delete-outline',\n              onClick: handleDelete.bind(null, record),\n            },\n          ]\"\n          :dropDownActions=\"[\n            {\n              label: '启用',\n              popConfirm: {\n                title: '是否启用？',\n                confirm: handleOpen.bind(null, record),\n              },\n            },\n          ]\"\n        />\n      </template>\n    </BasicTable>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable, useTable, BasicColumn, TableAction } from '/@/components/Table';\n\n  import { demoListApi } from '/@/api/demo/table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  const columns: BasicColumn[] = [\n    {\n      title: 'ID',\n      dataIndex: 'id',\n      fixed: 'left',\n      width: 280,\n    },\n    {\n      title: '姓名',\n      dataIndex: 'name',\n      width: 260,\n    },\n    {\n      title: '地址',\n      dataIndex: 'address',\n    },\n    {\n      title: '编号',\n      dataIndex: 'no',\n      width: 300,\n    },\n    {\n      title: '开始时间',\n      width: 200,\n      dataIndex: 'beginTime',\n    },\n    {\n      title: '结束时间',\n      dataIndex: 'endTime',\n      width: 200,\n    },\n  ];\n  export default defineComponent({\n    components: { BasicTable, TableAction },\n    setup() {\n      const { tableContext } = useListPage({\n        tableProps: {\n          title: '固定头和列示例',\n          api: demoListApi,\n          columns: columns,\n          canResize: false,\n          scroll: { y: 200 },\n          actionColumn: {\n            width: 160,\n            title: 'Action',\n            dataIndex: 'action',\n          },\n          useSearchForm: false,\n        },\n      });\n\n      const [registerTable] = tableContext;\n      function handleDelete(record: Recordable) {\n        console.log('点击了删除', record);\n      }\n      function handleOpen(record: Recordable) {\n        console.log('点击了启用', record);\n      }\n      return {\n        registerTable,\n        handleDelete,\n        handleOpen,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/table/InnerTableDemo.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\" class=\"components-table-demo-nested\">\n      <template #bodyCell=\"{ column }\">\n        <template v-if=\"column.key === 'operation'\">\n          <a>Publish</a>\n        </template>\n      </template>\n      <template #expandedRowRender>\n        <a-table :columns=\"innerColumns\" :data-source=\"innerData\" :pagination=\"false\">\n          <template #bodyCell=\"{ column }\">\n            <template v-if=\"column.dataIndex === 'state'\">\n              <span>\n                <a-badge status=\"success\" />\n                Finished\n              </span>\n            </template>\n            <template v-if=\"column.dataIndex === 'operation'\">\n              <span class=\"table-operation\">\n                <a>Pause</a>\n                <a>Stop</a>\n                <a-dropdown>\n                  <template #overlay>\n                    <a-menu>\n                      <a-menu-item>Action 1</a-menu-item>\n                      <a-menu-item>Action 2</a-menu-item>\n                    </a-menu>\n                  </template>\n                  <a> More </a>\n                </a-dropdown>\n              </span>\n            </template>\n          </template>\n        </a-table>\n      </template>\n    </BasicTable>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable } from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n\n  const columns = [\n    { title: 'Name', dataIndex: 'name', key: 'name' },\n    { title: 'Platform', dataIndex: 'platform', key: 'platform' },\n    { title: 'Version', dataIndex: 'version', key: 'version' },\n    { title: 'Upgraded', dataIndex: 'upgradeNum', key: 'upgradeNum' },\n    { title: 'Creator', dataIndex: 'creator', key: 'creator' },\n    { title: 'Date', dataIndex: 'createdAt', key: 'createdAt' },\n    { title: 'Action', key: 'operation' },\n  ];\n\n  interface DataItem {\n    key: number;\n    name: string;\n    platform: string;\n    version: string;\n    upgradeNum: number;\n    creator: string;\n    createdAt: string;\n  }\n\n  const data: DataItem[] = [];\n  for (let i = 0; i < 3; ++i) {\n    data.push({\n      key: i,\n      name: 'Screem',\n      platform: 'iOS',\n      version: '10.3.4.5654',\n      upgradeNum: 500,\n      creator: 'Jack',\n      createdAt: '2014-12-24 23:12:00',\n    });\n  }\n\n  const innerColumns = [\n    { title: 'Date', dataIndex: 'date', key: 'date' },\n    { title: 'Name', dataIndex: 'name', key: 'name' },\n    { title: 'Status', dataIndex: 'state', key: 'state' },\n    { title: 'Upgrade Status', dataIndex: 'upgradeNum', key: 'upgradeNum' },\n    {\n      title: 'Action',\n      dataIndex: 'operation',\n      key: 'operation',\n    },\n  ];\n\n  interface innerDataItem {\n    key: number;\n    date: string;\n    name: string;\n    upgradeNum: string;\n  }\n\n  const innerData: innerDataItem[] = [];\n  for (let i = 0; i < 3; ++i) {\n    innerData.push({\n      key: i,\n      date: '2014-12-24 23:12:00',\n      name: 'This is production name',\n      upgradeNum: 'Upgraded: 56',\n    });\n  }\n\n  export default defineComponent({\n    components: { BasicTable },\n    setup() {\n      // 列表页面公共参数、方法\n      const { tableContext } = useListPage({\n        tableProps: {\n          title: '内嵌表格',\n          dataSource: data,\n          columns: columns,\n          showActionColumn: false,\n          rowKey: 'key',\n          useSearchForm: false,\n        },\n      });\n      //注册table数据\n      const [registerTable] = tableContext;\n      return {\n        data,\n        columns,\n        innerColumns,\n        innerData,\n        registerTable,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/table/MergeHeaderDemo.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicColumn, BasicTable, useTable } from '/@/components/Table';\n\n  import { demoListApi } from '/@/api/demo/table';\n  //计算合并表头\n\n  export default defineComponent({\n    components: { BasicTable },\n    setup() {\n      const [registerTable] = useTable({\n        title: '分组表头示例',\n        api: demoListApi,\n        columns: getMergeHeaderColumns(),\n        bordered: true,\n        useSearchForm: false,\n      });\n\n      function getMergeHeaderColumns(): BasicColumn[] {\n        return [\n          {\n            title: 'ID',\n            dataIndex: 'id',\n            width: 300,\n          },\n          {\n            title: '姓名',\n            dataIndex: 'name',\n            width: 300,\n          },\n          {\n            title: '地址',\n            width: 120,\n            children: [\n              {\n                title: '地址',\n                dataIndex: 'address',\n                key: 'address',\n                width: 200,\n              },\n              {\n                title: '编号',\n                dataIndex: 'no',\n                key: 'no',\n              },\n            ],\n          },\n          {\n            title: '开始时间',\n            dataIndex: 'beginTime',\n            width: 200,\n          },\n          {\n            title: '结束时间',\n            dataIndex: 'endTime',\n            width: 200,\n          },\n        ];\n      }\n      return {\n        registerTable,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/table/MergeTableDemo.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <!--引用表格-->\n    <BasicTable @register=\"registerTable\">\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n    </BasicTable>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"basic-table-demo\" setup>\n  import { ActionItem, BasicColumn, BasicTable, TableAction } from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  //定义表格列\n  const columns: BasicColumn[] = [\n    {\n      title: '名称',\n      dataIndex: 'name',\n      customCell: (record, index, column) => ({\n        colSpan: index < 4 ? 1 : 5,\n      }),\n      customRender: ({ text, record, index, column }) => {\n        return index < 4 ? text : `${record.name}/${record.age}/${record.address}/${record.phone}`;\n      },\n    },\n    {\n      title: '年龄',\n      dataIndex: 'age',\n      customCell: (record, index, column) => {\n        if (index == 4) {\n          return { colSpan: 0 };\n        }\n      },\n    },\n    {\n      title: '家庭住址',\n      dataIndex: 'address',\n      customCell: (record, index, column) => {\n        if (index == 4) {\n          return { colSpan: 0 };\n        }\n      },\n    },\n    {\n      title: '联系电话',\n      colSpan: 2,\n      dataIndex: 'tel',\n      customCell: (record, index, column) => {\n        if (index === 2) {\n          return { rowSpan: 2 };\n        }\n        if (index === 3) {\n          return { rowSpan: 0 };\n        }\n        if (index === 4) {\n          return { colSpan: 0 };\n        }\n      },\n    },\n    {\n      title: 'Phone',\n      colSpan: 0,\n      dataIndex: 'phone',\n      customCell: (record, index, column) => {\n        if (index === 4) {\n          return { colSpan: 0 };\n        }\n      },\n    },\n  ];\n  // 列表页面公共参数、方法\n  const { tableContext } = useListPage({\n    designScope: 'basic-table-demo',\n    tableProps: {\n      title: '合并行列',\n      dataSource: [\n        {\n          key: '1',\n          name: '尹嘉乐',\n          age: 32,\n          tel: '0319-5972018',\n          phone: 17600080009,\n          address: '北京市昌平区',\n        },\n        {\n          key: '2',\n          name: '龙佳钰',\n          tel: '0319-5972018',\n          phone: 17600060007,\n          age: 42,\n          address: '北京市海淀区',\n        },\n        {\n          key: '3',\n          name: '贺泽惠',\n          age: 32,\n          tel: '0319-5972018',\n          phone: 17600040005,\n          address: '北京市门头沟区',\n        },\n        {\n          key: '4',\n          name: '沈勇',\n          age: 18,\n          tel: '0319-5972018',\n          phone: 17600010003,\n          address: '北京市朝阳区',\n        },\n        {\n          key: '5',\n          name: '白佳毅',\n          age: 18,\n          tel: '0319-5972018',\n          phone: 17600010002,\n          address: '北京市丰台区',\n        },\n      ],\n      columns: columns,\n      showActionColumn: false,\n      useSearchForm: false,\n    },\n  });\n  //注册table数据\n  const [registerTable] = tableContext;\n  /**\n   * 操作栏\n   */\n  function getTableAction(record): ActionItem[] {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n    ];\n  }\n\n  function handleEdit(record) {\n    console.log(record);\n  }\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/table/MultipleTableDemo.vue",
    "content": "<template>\n  <div>\n    <a-alert\n      message=\"多表格实例测试 (Issue #8792 修复)\"\n      description=\"此示例演示父子组件同时使用 BasicTable 时，列配置、列宽调整等功能正常工作，两个表格实例互不干扰\"\n      type=\"info\"\n      show-icon\n      class=\"mb-4\"\n    />\n\n    <a-card title=\"父组件的表格\" class=\"mb-4\">\n      <BasicTable\n        @register=\"registerParentTable\"\n        :columns=\"parentColumns\"\n        :dataSource=\"parentData\"\n        :pagination=\"false\"\n        showTableSetting\n        :canResize=\"false\"\n      >\n        <template #toolbar>\n          <a-button type=\"primary\" @click=\"testParentTable\">测试父表格</a-button>\n        </template>\n      </BasicTable>\n    </a-card>\n\n    <a-card title=\"子组件的表格\">\n      <BasicTable\n        @register=\"registerChildTable\"\n        :columns=\"childColumns\"\n        :dataSource=\"childData\"\n        :pagination=\"false\"\n        showTableSetting\n        :canResize=\"false\"\n      >\n        <template #toolbar>\n          <a-button type=\"primary\" @click=\"testChildTable\">测试子表格</a-button>\n        </template>\n      </BasicTable>\n    </a-card>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import { BasicTable, useTable, BasicColumn } from '/@/components/Table';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  const { createMessage } = useMessage();\n\n  // 父表格配置\n  const parentColumns: BasicColumn[] = [\n    {\n      title: 'ID',\n      dataIndex: 'id',\n      width: 80,\n    },\n    {\n      title: '父表格-姓名',\n      dataIndex: 'name',\n      width: 150,\n    },\n    {\n      title: '父表格-年龄',\n      dataIndex: 'age',\n      width: 100,\n    },\n    {\n      title: '父表格-地址',\n      dataIndex: 'address',\n      width: 200,\n    },\n  ];\n\n  const parentData = ref([\n    { id: 1, name: '父表格-张三', age: 25, address: '北京市朝阳区' },\n    { id: 2, name: '父表格-李四', age: 30, address: '上海市浦东新区' },\n    { id: 3, name: '父表格-王五', age: 28, address: '广州市天河区' },\n  ]);\n\n  const [registerParentTable, { getColumns: getParentColumns }] = useTable({\n    columns: parentColumns,\n    dataSource: parentData.value,\n  });\n\n  // 子表格配置\n  const childColumns: BasicColumn[] = [\n    {\n      title: 'ID',\n      dataIndex: 'id',\n      width: 80,\n    },\n    {\n      title: '子表格-产品名称',\n      dataIndex: 'product',\n      width: 150,\n    },\n    {\n      title: '子表格-价格',\n      dataIndex: 'price',\n      width: 100,\n    },\n    {\n      title: '子表格-库存',\n      dataIndex: 'stock',\n      width: 100,\n    },\n    {\n      title: '子表格-分类',\n      dataIndex: 'category',\n      width: 150,\n    },\n  ];\n\n  const childData = ref([\n    { id: 1, product: '子表格-商品A', price: 99, stock: 100, category: '电子产品' },\n    { id: 2, product: '子表格-商品B', price: 199, stock: 50, category: '家居用品' },\n    { id: 3, product: '子表格-商品C', price: 299, stock: 30, category: '服装鞋包' },\n  ]);\n\n  const [registerChildTable, { getColumns: getChildColumns }] = useTable({\n    columns: childColumns,\n    dataSource: childData.value,\n  });\n\n  function testParentTable() {\n    const cols = getParentColumns();\n    createMessage.success(`父表格列数: ${cols.length}，请查看控制台`);\n    console.log('父表格列配置:', cols);\n  }\n\n  function testChildTable() {\n    const cols = getChildColumns();\n    createMessage.success(`子表格列数: ${cols.length}，请查看控制台`);\n    console.log('子表格列配置:', cols);\n  }\n</script>\n\n<style scoped>\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/table/SelectTableDemo.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <!--引用表格-->\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n    </BasicTable>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"basic-table-demo\" setup>\n  import { BasicColumn, BasicTable, TableAction } from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  //定义表格列\n  const columns: BasicColumn[] = [\n    {\n      title: '姓名',\n      dataIndex: 'name',\n      key: 'name',\n      resizable: true,\n    },\n    {\n      title: '年龄',\n      dataIndex: 'age',\n      key: 'age',\n    },\n    {\n      title: '住址',\n      dataIndex: 'address',\n      key: 'address',\n    },\n  ];\n  // 列表页面公共参数、方法\n  const { tableContext } = useListPage({\n    designScope: 'basic-table-demo',\n    tableProps: {\n      title: '可选择表格',\n      dataSource: [\n        {\n          id: '1',\n          name: '胡歌',\n          age: 32,\n          address: '朝阳区林萃路1号',\n        },\n        {\n          id: '2',\n          name: '刘诗诗',\n          age: 32,\n          address: '昌平区白沙路1号',\n        },\n      ],\n      columns: columns,\n      rowSelection: { type: 'checkbox' }, //默认是 checkbox 多选，可以设置成 radio 单选\n      useSearchForm: false,\n    },\n  });\n  //注册table数据\n  const [registerTable, { reload }, { rowSelection, selectedRows, selectedRowKeys }] = tableContext;\n  /**\n   * 操作栏\n   */\n  function getTableAction(record): ActionItem[] {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n    ];\n  }\n\n  function handleEdit(record) {\n    console.log(record);\n    console.log(selectedRows.value);\n    console.log(selectedRowKeys.value);\n  }\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/table/TreeTableDemo.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"register\">\n      <template #toolbar>\n        <a-button type=\"primary\" @click=\"expandAll\">展开全部</a-button>\n        <a-button type=\"primary\" @click=\"collapseAll\">折叠全部</a-button>\n      </template>\n    </BasicTable>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicColumn, BasicTable } from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  const columns: BasicColumn[] = [\n    {\n      title: 'ID',\n      dataIndex: 'id',\n      fixed: 'left',\n      width: 200,\n    },\n    {\n      title: '姓名',\n      dataIndex: 'name',\n      width: 150,\n      filters: [\n        { text: 'Male', value: 'male' },\n        { text: 'Female', value: 'female' },\n      ],\n    },\n    {\n      title: '地址',\n      dataIndex: 'address',\n      width: 300,\n    },\n    {\n      title: '编号',\n      dataIndex: 'no',\n      width: 150,\n      sorter: true,\n      defaultHidden: true,\n    },\n    {\n      title: '开始时间',\n      width: 150,\n      sorter: true,\n      dataIndex: 'beginTime',\n    },\n    {\n      title: '结束时间',\n      width: 150,\n      sorter: true,\n      dataIndex: 'endTime',\n    },\n  ];\n  export default defineComponent({\n    components: { BasicTable },\n    setup() {\n      const { tableContext } = useListPage({\n        tableProps: {\n          title: '树形表格',\n          isTreeTable: true,\n          rowSelection: {\n            type: 'checkbox',\n            getCheckboxProps(record: Recordable) {\n              // Demo: 第一行（id为0）的选择框禁用\n              if (record.id === '0') {\n                return { disabled: true };\n              } else {\n                return { disabled: false };\n              }\n            },\n          },\n          columns: columns,\n          dataSource: getTreeTableData(),\n          rowKey: 'id',\n          useSearchForm: false,\n        },\n      });\n      //注册table数据\n      const [register, { expandAll, collapseAll }] = tableContext;\n      function getTreeTableData() {\n        const data: any = (() => {\n          const arr: any = [];\n          for (let index = 0; index < 40; index++) {\n            arr.push({\n              id: `${index}`,\n              name: 'John Brown',\n              age: `1${index}`,\n              no: `${index + 10}`,\n              address: 'New York No. 1 Lake ParkNew York No. 1 Lake Park',\n              beginTime: new Date().toLocaleString(),\n              endTime: new Date().toLocaleString(),\n              children: [\n                {\n                  id: `l2-${index}`,\n                  name: 'John Brown',\n                  age: `1${index}`,\n                  no: `${index + 10}`,\n                  address: 'New York No. 1 Lake ParkNew York No. 1 Lake Park',\n                  beginTime: new Date().toLocaleString(),\n                  endTime: new Date().toLocaleString(),\n                },\n                {\n                  id: `l3-${index}`,\n                  name: 'John Mary',\n                  age: `1${index}`,\n                  no: `${index + 10}`,\n                  address: 'New York No. 1 Lake ParkNew York No. 1 Lake Park',\n                  beginTime: new Date().toLocaleString(),\n                  endTime: new Date().toLocaleString(),\n                },\n              ],\n            });\n          }\n          return arr;\n        })();\n\n        return data;\n      }\n      return { register, expandAll, collapseAll };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/table/index.ts",
    "content": "export { default as AuthColumnDemo } from './AuthColumnDemo.vue';\nexport { default as BasicTableBorder } from './BasicTableBorder.vue';\nexport { default as BasicTableDemo } from './BasicTableDemo.vue';\nexport { default as BasicTableDemoAjax } from './BasicTableDemoAjax.vue';\nexport { default as CustomerCellDemo } from './CustomerCellDemo.vue';\nexport { default as EditCellTableDemo } from './EditCellTableDemo.vue';\nexport { default as EditRowTableDemo } from './EditRowTableDemo.vue';\nexport { default as ExpandTableDemo } from './ExpandTableDemo.vue';\nexport { default as ExportTableDemo } from './ExportTableDemo.vue';\nexport { default as FixedHeaderColumn } from './FixedHeaderColumn.vue';\nexport { default as InnerTableDemo } from './InnerTableDemo.vue';\nexport { default as MergeHeaderDemo } from './MergeHeaderDemo.vue';\nexport { default as MergeTableDemo } from './MergeTableDemo.vue';\nexport { default as SelectTableDemo } from './SelectTableDemo.vue';\nexport { default as TreeTableDemo } from './TreeTableDemo.vue';\nexport { default as MultipleTableDemo } from './MultipleTableDemo.vue';\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/document/table/tabIndex.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <a-card :bordered=\"false\" style=\"height: 100%\">\n      <a-tabs v-model:activeKey=\"activeKey\" @change=\"tabChange\">\n        <a-tab-pane :key=\"item.key\" :tab=\"item.label\" v-for=\"item in compList\" />\n      </a-tabs>\n      <component :is=\"currentComponent\" />\n    </a-card>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, computed } from 'vue';\n  import {\n    AuthColumnDemo,\n    BasicTableBorder,\n    BasicTableDemo,\n    BasicTableDemoAjax,\n    CustomerCellDemo,\n    EditCellTableDemo,\n    EditRowTableDemo,\n    ExpandTableDemo,\n    ExportTableDemo,\n    FixedHeaderColumn,\n    InnerTableDemo,\n    MergeHeaderDemo,\n    MergeTableDemo,\n      SelectTableDemo,\n      TreeTableDemo,\n      MultipleTableDemo,\n    } from './index';\n  export default defineComponent({\n    name: 'document-table-demo',\n    components: {\n      AuthColumnDemo,\n      BasicTableBorder,\n      BasicTableDemo,\n      BasicTableDemoAjax,\n      CustomerCellDemo,\n      EditCellTableDemo,\n      EditRowTableDemo,\n      ExpandTableDemo,\n      ExportTableDemo,\n      FixedHeaderColumn,\n      InnerTableDemo,\n      MergeHeaderDemo,\n      MergeTableDemo,\n        SelectTableDemo,\n        TreeTableDemo,\n        MultipleTableDemo,\n      },\n    setup() {\n      //当前选中key\n      const activeKey = ref('BasicTableDemo');\n      //组件集合\n      const compList = ref([\n        { key: 'BasicTableDemo', label: '基础静态表格' },\n        { key: 'BasicTableDemoAjax', label: '常规AJAX表格' },\n        { key: 'BasicTableBorder', label: '边框表格' },\n        { key: 'CustomerCellDemo', label: '自定义列内容' },\n        { key: 'EditCellTableDemo', label: '可编辑单元格' },\n        { key: 'EditRowTableDemo', label: '可编辑行' },\n        { key: 'ExpandTableDemo', label: '可展开表格' },\n        { key: 'ExportTableDemo', label: '导入导出' },\n        { key: 'FixedHeaderColumn', label: '固定头和列示例' },\n        { key: 'InnerTableDemo', label: '内嵌表格' },\n        { key: 'MergeHeaderDemo', label: '分组表头示例' },\n        { key: 'MergeTableDemo', label: '合并行列' },\n        { key: 'SelectTableDemo', label: '可选择表格' },\n          { key: 'TreeTableDemo', label: '树形表格' },\n          { key: 'AuthColumnDemo', label: '权限列设置' },\n          { key: 'MultipleTableDemo', label: '多表格实例' },\n        ]);\n      //当前选中组件\n      const currentComponent = computed(() => {\n        return activeKey.value;\n      });\n\n      //使用component动态切换tab\n      function tabChange(key) {\n        activeKey.value = key;\n      }\n      return {\n        activeKey,\n        currentComponent,\n        tabChange,\n        compList,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/editor/json/index.vue",
    "content": "<template>\n  <PageWrapper title=\"代码编辑器组件示例\" contentFullHeight fixedHeight contentBackground>\n    <template #extra>\n      <a-space size=\"middle\">\n        <a-button @click=\"showData\" type=\"primary\">获取数据</a-button>\n        <RadioGroup button-style=\"solid\" v-model:value=\"modeValue\" @change=\"handleModeChange\">\n          <RadioButton value=\"application/json\"> json数据 </RadioButton>\n          <RadioButton value=\"htmlmixed\"> html代码 </RadioButton>\n          <RadioButton value=\"javascript\"> javascript代码 </RadioButton>\n        </RadioGroup>\n      </a-space>\n    </template>\n    <CodeEditor v-model:value=\"value\" :mode=\"modeValue\" />\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import { CodeEditor } from '/@/components/CodeEditor';\n  import { PageWrapper } from '/@/components/Page';\n  import { Radio, Space, Modal } from 'ant-design-vue';\n\n  const jsonData =\n    '{\"name\":\"BeJson\",\"url\":\"http://www.xxx.com\",\"page\":88,\"isNonProfit\":true,\"address\":{\"street\":\"科技园路.\",\"city\":\"江苏苏州\",\"country\":\"中国\"},\"links\":[{\"name\":\"Google\",\"url\":\"http://www.xxx.com\"},{\"name\":\"Baidu\",\"url\":\"http://www.xxx.com\"},{\"name\":\"SoSo\",\"url\":\"http://www.xxx.com\"}]}';\n\n  const jsData = `\n      (() => {\n        var htmlRoot = document.getElementById('htmlRoot');\n        var theme = window.localStorage.getItem('__APP__DARK__MODE__');\n        if (htmlRoot && theme) {\n          htmlRoot.setAttribute('data-theme', theme);\n          theme = htmlRoot = null;\n        }\n      })();\n  `;\n\n  const htmlData = `\n     <!DOCTYPE html>\n<html lang=\"en\" id=\"htmlRoot\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\" />\n    <meta name=\"renderer\" content=\"webkit\" />\n    <meta\n      name=\"viewport\"\n      content=\"width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0\"\n    />\n    <title><%= title %></title>\n    <link rel=\"icon\" href=\"/favicon.ico\" />\n  </head>\n  <body>\n    <div id=\"app\">\n    </div>\n  </body>\n</html>\n  `;\n  export default defineComponent({\n    components: {\n      CodeEditor,\n      PageWrapper,\n      RadioButton: Radio.Button,\n      RadioGroup: Radio.Group,\n      ASpace: Space,\n    },\n    setup() {\n      const modeValue = ref('application/json');\n      const value = ref(jsonData);\n\n      function handleModeChange(e: ChangeEvent) {\n        const mode = e.target.value;\n        if (mode === 'application/json') {\n          value.value = jsonData;\n          return;\n        }\n        if (mode === 'htmlmixed') {\n          value.value = htmlData;\n          return;\n        }\n        if (mode === 'javascript') {\n          value.value = jsData;\n          return;\n        }\n      }\n\n      function showData() {\n        Modal.info({ title: '编辑器当前值', content: value.value });\n      }\n\n      return { value, modeValue, handleModeChange, showData };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/editor/markdown/Editor.vue",
    "content": "<template>\n  <PageWrapper title=\"MarkDown组件嵌入Form示例\">\n    <CollapseContainer title=\"MarkDown表单\">\n      <BasicForm :labelWidth=\"100\" :schemas=\"schemas\" :actionColOptions=\"{ span: 24 }\" @submit=\"handleSubmit\" />\n    </CollapseContainer>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, h } from 'vue';\n  import { BasicForm, FormSchema } from '/@/components/Form/index';\n  import { CollapseContainer } from '/@/components/Container/index';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { MarkDown } from '/@/components/Markdown';\n  import { PageWrapper } from '/@/components/Page';\n\n  const schemas: FormSchema[] = [\n    {\n      field: 'title',\n      component: 'Input',\n      label: 'title',\n      defaultValue: '标题',\n      rules: [{ required: true }],\n    },\n    {\n      field: 'markdown',\n      component: 'Input',\n      label: 'markdown',\n      defaultValue: 'defaultValue',\n      rules: [{ required: true, trigger: 'blur' }],\n      render: ({ model, field }) => {\n        return h(MarkDown, {\n          value: model[field],\n          onChange: (value: string) => {\n            model[field] = value;\n          },\n        });\n      },\n    },\n  ];\n  export default defineComponent({\n    components: { BasicForm, CollapseContainer, PageWrapper },\n    setup() {\n      const { createMessage } = useMessage();\n\n      return {\n        schemas,\n        handleSubmit: (values: any) => {\n          createMessage.success('click search,values:' + JSON.stringify(values));\n        },\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/editor/markdown/index.vue",
    "content": "<template>\n  <PageWrapper title=\"MarkDown组件示例\">\n    <div>\n      <a-button @click=\"toggleTheme\" class=\"mb-2\" type=\"primary\"> 黑暗主题 </a-button>\n      <a-button @click=\"clearValue\" class=\"mb-2\" type=\"default\"> 清空内容 </a-button>\n      <MarkDown v-model:value=\"value\" @change=\"handleChange\" ref=\"markDownRef\" placeholder=\"这是占位文本\" />\n    </div>\n    <div class=\"mt-2\">\n      <a-card title=\"Markdown Viewer 组件演示\">\n        <MarkdownViewer :value=\"value\" />\n      </a-card>\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, unref } from 'vue';\n  import { MarkDown, MarkDownActionType, MarkdownViewer } from '/@/components/Markdown';\n  import { PageWrapper } from '/@/components/Page';\n  import { Card } from 'ant-design-vue';\n\n  export default defineComponent({\n    components: { MarkDown, PageWrapper, MarkdownViewer, ACard: Card },\n    setup() {\n      const markDownRef = ref<Nullable<MarkDownActionType>>(null);\n      const valueRef = ref(`\n# title\n\n# content\n`);\n\n      function toggleTheme() {\n        const markDown = unref(markDownRef);\n        if (!markDown) return;\n        const vditor = markDown.getVditor();\n        vditor.setTheme('dark');\n      }\n\n      function handleChange(v: string) {\n        valueRef.value = v;\n      }\n\n      function clearValue() {\n        valueRef.value = '';\n      }\n\n      return {\n        value: valueRef,\n        toggleTheme,\n        markDownRef,\n        handleChange,\n        clearValue,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/editor/tinymce/Editor.vue",
    "content": "<template>\n  <PageWrapper title=\"富文本嵌入表单示例\">\n    <CollapseContainer title=\"富文本表单\">\n      <BasicForm :labelWidth=\"100\" :schemas=\"schemas\" :actionColOptions=\"{ span: 24 }\" @submit=\"handleSubmit\" />\n    </CollapseContainer>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, h } from 'vue';\n  import { BasicForm, FormSchema } from '/@/components/Form/index';\n  import { CollapseContainer } from '/@/components/Container/index';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { Tinymce } from '/@/components/Tinymce/index';\n  import { PageWrapper } from '/@/components/Page';\n\n  const schemas: FormSchema[] = [\n    {\n      field: 'title',\n      component: 'Input',\n      label: 'title',\n      defaultValue: 'defaultValue',\n      rules: [{ required: true }],\n    },\n    {\n      field: 'tinymce',\n      component: 'Input',\n      label: 'tinymce',\n      defaultValue: 'defaultValue',\n      rules: [{ required: true }],\n      render: ({ model, field }) => {\n        return h(Tinymce, {\n          value: model[field],\n          onChange: (value: string) => {\n            model[field] = value;\n          },\n        });\n      },\n    },\n  ];\n  export default defineComponent({\n    components: { BasicForm, CollapseContainer, PageWrapper },\n    setup() {\n      const { createMessage } = useMessage();\n\n      return {\n        schemas,\n        handleSubmit: (values: any) => {\n          createMessage.success('click search,values:' + JSON.stringify(values));\n        },\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/editor/tinymce/index.vue",
    "content": "<template>\n  <PageWrapper title=\"富文本组件示例\">\n    <Tinymce v-model=\"value\" @change=\"handleChange\" width=\"100%\" />\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import { Tinymce } from '/@/components/Tinymce/index';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { Tinymce, PageWrapper },\n    setup() {\n      const value = ref('hello world!');\n      function handleChange(value: string) {\n        console.log(value);\n      }\n      return { handleChange, value };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/breadcrumb/ChildrenList.vue",
    "content": "<template>\n  <PageWrapper title=\"层级面包屑示例\" content=\"子级页面面包屑会添加到当前层级后面\">\n    <router-link to=\"/feat/breadcrumb/children/childrenDetail\"> 进入子级详情页 </router-link>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { PageWrapper },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/breadcrumb/ChildrenListDetail.vue",
    "content": "<template>\n  <PageWrapper title=\"子级详情页\">\n    <div> 子级详情页内容在此 </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { PageWrapper } from '/@/components/Page';\n  export default defineComponent({ components: { PageWrapper } });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/breadcrumb/FlatList.vue",
    "content": "<template>\n  <PageWrapper title=\"平级面包屑示例\" content=\"子级页面面包屑会覆盖当前层级\">\n    <router-link to=\"/feat/breadcrumb/flatDetail\"> 进入平级详情页 </router-link>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { PageWrapper },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/breadcrumb/FlatListDetail.vue",
    "content": "<template>\n  <div> 平级详情页 </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n\n  export default defineComponent({});\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/click-out-side/index.vue",
    "content": "<template>\n  <PageWrapper title=\"点内外部触发事件\">\n    <ClickOutSide @clickOutside=\"handleClickOutside\" class=\"flex justify-center\">\n      <div @click=\"innerClick\" class=\"demo-box\">\n        {{ text }}\n      </div>\n    </ClickOutSide>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import { ClickOutSide } from '/@/components/ClickOutSide';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { ClickOutSide, PageWrapper },\n    setup() {\n      const text = ref('Click');\n      function handleClickOutside() {\n        text.value = 'Click Out Side';\n      }\n\n      function innerClick() {\n        text.value = 'Click Inner';\n      }\n      return { innerClick, handleClickOutside, text };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .demo-box {\n    display: flex;\n    width: 100%;\n    height: 300px;\n    font-size: 24px;\n    color: #fff;\n    background-color: #408ede;\n    border-radius: 10px;\n    justify-content: center;\n    align-items: center;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/context-menu/index.vue",
    "content": "<template>\n  <PageWrapper title=\"右键菜单示例\">\n    <CollapseContainer title=\"Simple\">\n      <a-button type=\"primary\" @contextmenu=\"handleContext\"> Right Click on me </a-button>\n    </CollapseContainer>\n\n    <CollapseContainer title=\"Multiple\" class=\"mt-4\">\n      <a-button type=\"primary\" @contextmenu=\"handleMultipleContext\"> Right Click on me </a-button>\n    </CollapseContainer>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { useContextMenu } from '/@/hooks/web/useContextMenu';\n  import { CollapseContainer } from '/@/components/Container';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { CollapseContainer, PageWrapper },\n    setup() {\n      const [createContextMenu] = useContextMenu();\n      const { createMessage } = useMessage();\n      function handleContext(e: MouseEvent) {\n        createContextMenu({\n          event: e,\n          items: [\n            {\n              label: 'New',\n              icon: 'bi:plus',\n              handler: () => {\n                createMessage.success('click new');\n              },\n            },\n            {\n              label: 'Open',\n              icon: 'bx:bxs-folder-open',\n              handler: () => {\n                createMessage.success('click open');\n              },\n            },\n          ],\n        });\n      }\n\n      function handleMultipleContext(e: MouseEvent) {\n        createContextMenu({\n          event: e,\n          items: [\n            {\n              label: 'New',\n              icon: 'bi:plus',\n\n              children: [\n                {\n                  label: 'New1-1',\n                  icon: 'bi:plus',\n                  divider: true,\n                  children: [\n                    {\n                      label: 'New1-1-1',\n                      handler: () => {\n                        createMessage.success('click new');\n                      },\n                    },\n                    {\n                      label: 'New1-2-1',\n                      disabled: true,\n                    },\n                  ],\n                },\n                {\n                  label: 'New1-2',\n                  icon: 'bi:plus',\n                },\n              ],\n            },\n          ],\n        });\n      }\n\n      return { handleContext, handleMultipleContext };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/copy/index.vue",
    "content": "<template>\n  <PageWrapper title=\"文本复制示例\">\n    <CollapseContainer class=\"w-full h-32 bg-white rounded-md\" title=\"Copy Example\">\n      <div class=\"flex justify-center\">\n        <a-input placeholder=\"请输入\" v-model:value=\"value\" />\n        <a-button type=\"primary\" @click=\"handleCopy\"> Copy </a-button>\n      </div>\n    </CollapseContainer>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, unref, ref } from 'vue';\n  import { CollapseContainer } from '/@/components/Container/index';\n  import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    name: 'Copy',\n    components: { CollapseContainer, PageWrapper },\n    setup() {\n      const valueRef = ref('');\n      const { createMessage } = useMessage();\n      const { clipboardRef, copiedRef } = useCopyToClipboard();\n\n      function handleCopy() {\n        const value = unref(valueRef);\n        if (!value) {\n          createMessage.warning('请输入要拷贝的内容！');\n          return;\n        }\n        clipboardRef.value = value;\n        if (unref(copiedRef)) {\n          createMessage.warning('copy success！');\n        }\n      }\n      return { handleCopy, value: valueRef };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/download/imgBase64.ts",
    "content": "export default `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAYAAABS3GwHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wAAAAAzJ3zzAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAB3RJTUUH5AodAjIGrlVB/QAAABBjYU52AAAAygAAAMAAAAAFAAAAAASpeQ4AAC6ASURBVHja7b133G1Vdaj9jDnXWruXt7+ncDhIEVCKaCiidATsgIjRm1gTu1FjTbl++ZmYqMmNRPOZm5tc400+Y65iwUQFEUSRIkixgNI5cA6nvX33veYc3x97v2IBpZzzzvdw1sNvc/5gH/ZYY80xy5ijQEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkbG7kZCC7CaeevLu3QSyPXBKBL3RSIHKOE050EtULdqakaXvr/E+EiR9kbLRz6Wvc5HSxRagNVMIw+bnhyz/m6HbTtNvGjsAQENMNZk+FGB1EOjBfu9okLvbvj6N0Nra88kmzIegte+yDEapbRKMPp/EuZe3rcqOm37sjFKqQOKMDSFFUXxRFicVO1mqZi7/QMLS70DahS2QO9guOB92St9NGQrwEPgUBZFKHZVtr28p3ko5PucWko5MZfKmD5oACuKAM5jU6WP5S7N8+W0XLm6NYomHuZMaM3teWQG8BAkKoypknThoAM3c9ed6548lcrrJvpyTFElBUQDyCUKqUK3iMYJaTevhdufZG470LEzl0dSpyHE2qPJ1stf4vfO6eOdYTTpykc+V9BXn+02rvP+NQf25C1jTkaWvxfEADy4BJJJGB+D+aLcdGXefPCGIpf859tpvPUjsF8v5Ue5iP/9nuzVPhKyFeCXaKSGMsIb0qa+71yopsnhY44Xl5SKCpqysk6gn/+ttsHZEm6yhh2PiaI+B6y1+tI7nNz8nI/RqKXIxVWrLlsHHjHZrnHI61/S4/Uv7ZFDeJZxfK1TN7f7/NSY46RJJ4fESuQGXxV50CGz2z8CMjxxCHl8voKvxBgDWvFa3q+vJ2zo6bPmYgovWPSMpDDi4R1/mVnBIyEzgCG5rrJUEwq5vlxUUX5U0uJG6b90BP+CopcIFdUAW0ZhsAqkIloti5muSZxYJPVIrDCd6uRBHf3dExf1hOtKhn+/aompLqzph9bonkFmAMAdP/XMN6HaFSYMVNqKWibXpJw27uQAA6oS5rwkCl7QbpFOroIbSTSyg+MATtCSYg/qc+z+PZ711QrF9adWGffIXAR/8iHlbR/LVoJfR2YAQLEIb7kgIul6+br36lLqlT7PH03NYWUnKGEOvTC48PIWLdehUhq+sKEwDsQAk47ilOPkw1uc8pp5H310Ek0FZhPo5kJrd3WTGQCQ7oC/f5Njcga+9zlHtctR421eVVT2UyHI1gcGP9q3eM3jp8ok4wkJyi9cQHjAojrZ12MP6uorjTf7vmIzTPSQdV1lrB1au6ubvd4AvvLvjn4VvvWdlD/+RsynPpVbW0NOnOyZA4pecKEEU8CD5PDxiPQLOSVGf+X+wQ8/U07tfqkeVVROcnVG3nMe2lKRpoW3fzTbBj0ce70BnPYyKBeRe7SAyL9ptSPPGlF5YcmRN0DIg29LcKaAn6pi8xGSPvzds+SAMafTa1N96VifA//gIjhiUbHAfDmUdlc/e60BvOF8x++90DNzr3DZxxwX/YGamdYr1ud2csaY40hjNHYSaO8ztLo0jy+U0fFY45xg/MN/nZ6gBU9h354+c21fT7m3Rm1tpHLMnZ5SCu/6s2wVeCj22ouwnKRcMJ6w9m+cbF4b6fQDfuTWd7tzp3bIs+siSIR6DTP+vYJa0XodGauptYLob4g8ciAxMOG1tK7NuYd57v2vgrnw+3V6hy8if310sHP8qmavNYA2lnXXwuw+0L3Hs7kvk/v25XkGDogi1AWa/I1Cx+B6eXrrStjRhFiV33gWWQ6TThQ29DiyqZx6TY5vrumxfawPR18PZ/6ZosAHP5CFSSyzV26B3vrbbSIVzjsk5e++bjUp6/iagp6xIWcOq0UiyzkvIXADt44UalAuKMnQ1fmI/u7wz3HVaK3j2HWOM+uqxU9UVU/30JS99IX/GvZKfex3f0JsUk7ZIfLBs1uMOPesMe9fVVKdMhrG7SkMLr16gto8ur6quXpC7PxgS/RI8QOD0RGvh+6X6msnvDzlBT1ho1MZ8craYG6t1cleZQB/9D7HO/5bj1LJUBDkhb+1qD+tMz7iOGayL4cmTsSF2h0Mb9t8gZ6tS7eUg/gxhF0rkAIjXuVJTp9ad3pyLmXqdTs62jHCJgt/+sHsOLDMXmUAqXpmY88t9Y7cU3T6h/cW4jUNe1alL88pOyLDYAZdabmEwfalLfhCCZmsYhID/jGm3OjwQDzqtTLtOXfa8YwPTeb54LVLxEB7xVN5Vi97jQH80XsdiRdG+obygvDZf/oP+mI2TLTlnHpfjgLESxi3z3Ca17SAq5Qx0wm5+Ne4PR8JPUGtEq93+oy1Ts/YHsn0l44smcOcp+DhT/9S+dM/z1aCvcYA2nenfOPGNgbkK2+J9V3v+92xInLmSCqHVYf7nlDDwQ/jGcoj4ksVQUQfd8aZBzGKjnk1E16fs1b1JTcUTeXzIwZyyP0VKHYDPfAqYq8xABk1PP/wMhNtOO0rjmKffcdTObfsZR8TsNDJstuzk9P+aFFlJFHj9NEdfB/yeQEVxCo67fSgjY6zxDC5TwtGVZlogJ4Z4olXF3uFAbz9vC65kkH3gbKK6IiZKC7oaeN9jsoriZNAs7+CejAJ5Gui1Ty2AGZXWeJynFDdI2t7evhYX5+vjrGvedFKpFI8Hj6wZe/eBu0VBjCRxnQ3p3Lx3U3uKXqJ73Sn5nb680upVKxIuHgfgZ6IzxdF14xIVEwwzu9aY/SDrDKtqq5f1+Y1ky2OO/tvPS+51NP8O/jRxEo/+eriCW0Af/CylLe/LKWRE/JdWLNTmO27ymiLZ4515PDIY0IUuAKWR7l2inSlQq+WqI1BdoebPgVKCvumesC4cuJt/2w2HPy1lOQLcPB2+MB3995V4AltAHnnmE0MHdfjmprq+n5UGk/NC6qYE6sqkQx2IEFwHvpAuYKMVjAJu08YD2KBuiee9PrcdX1OfSs5ueZyiArI/DMDKWEV8IQ1gHed5zjurp2M9ZWSE9m/bTBi9htL7e+UHYcLoIGC3YyCM2iaJx0rEU/nyBkZpDnuDoTBKiComXZ66IYl/7zKPPs/8zo1T/lXpdKC9/+x8icf2vtWgiesASjwzSdPoqry8f1RiUytqHL8VN8cXHWCH+T5BsErSILPjZAWSuqjXeD2fCS/iYG6USbu02Mn/1V/e8f1Mv3pUdHkfyNLFZiIw+gjJE/YaFAnUOjDvj3Pq+5T8s4fOdKTV5Q8kxboBywK1ha8yalfVxFbSTDpLj74PhQ/c4sKOrbEuo0NnteM+cZxli0HtT3NimG2GEoj4XjCGcA7X+oxCqjy5Jl76FYOkK7vjU/1/emjqT0mUpJUwvj9ZRjvo3l8riI6kiMqgFmpCibLcUIVA+usHrQt5nl35GTLeTXu3bTFs5B7wm4IHpYn3BP3XYcj5n+Egnxr7QFsikkqXk4vOfOcqpPYarh4Hw/0EV8qi47XRWKLPNZ4n8fK0OWrZdX6Oqe/8yT09Fcfa+Rd/8MwbldaK+F5whmAtxGfnSqS81Dpe3qG8njfnF53cmSkA997qHgfD76V125SVDeWDDK9QkQnpwKxh7WODdOeJ31rEcOVUA7kFAjJE8oA3nxel09cGnNwdyMfeqGqVa3lvD9rxMlxFSfx8s1oCJwHNUi5hqmXMXnBmEBOF8NgImgLSx1YrMVAZeCW3dt4whjAxW9OOeqS7fzes3tUUy9v/KrDqj+4lvpXl7w/wGqYCg8wrO8jqMvhJmsSjRUkVh5/vM9jxSjSNvTvzfGdTTn53ifm8Hrkq1mM9r684SeMAYwlcMqrxpksiXxgCp2LbbHiePpUj8OKTqyXQC93GO+jOVIzIp1CXjU3LDQaQiAD2gNmI3lgZ1k+/aM1fLdxi+dtf/spFgpBNBSUJ4wB9EX5xBbh6S/YobV9YyZa7sRaKudXnNRCzf7L9X3aoFEe1taIStGuj/d5pBggAlkUadwfyXfnErl+dInuTwuG28vQyg7Bex63vc9z27s8zS7cP6dyzsvW8qYf9iZrPZ470ud4A7ELNPvL0OpcDpevwESiuYJgAqblageYtdy21crnupbtf/dGaAj6uxen1HvhBAvFHn8P8JrrPd+50NL9oOGz38grf05hBE4SJ0ePOLFGBiVOQmz+vYKz+GKNtFoTMaKDW+AAslgGq84OI90dVq7sK9/acS+NT/4p0i6jL/98DJ8PIFhg9vgVoBgr3Aqttsq17/GkjolJJ+eVHUfYYaJLiAFnBhUefCvRXrWETOQ1EkFCHHwVsApOJJ2xcvkDVr783G5//t6N0IjRhT1+FDx29uhHf+fLPO8/0PCfn0r55Lcts11GL93sTs935Zi6Ss5JOLenejAR5OtCpYQtgl0+E6w0BrQrsN3QmjdyyQMR1x7RhDNngc6gmNbeyh577PmD8/psfa5l583Q3NaVzlp0c1OOaSz4t1S7cmgJsT5AU4vl3kZdwZuS+MkJMaNFjPFhOkvCoLzKkpH+3bFcsT2Wz6jRu7ZHIg2ErTF88I/3uvuvn7FHrgBvO29wZXP/n30N1/O8++tet47GSaEnT6/1zDMSL0lQt6dCL0ffV7RbTVQKDCo8BOksyaCx35Llztmc/NNckRv+n39rs6lg1NZgbC8vkbJHmv47XtJjcylmfdvJA7Hoho7mvPFn7NMz71rX5dmRH0SDrjTC4OCbKmpHceNT4qbymiSChOjcaIYybRe6dyfmwvsK8t6W5f6RPrLZoh95PwTq/LRq2ONWgA+/wfHDO3qs73gS5ymkjqbxIyM9zq729TgT6IIJBm5PBe0WSEtlmM6Ti02Ywb9MH2jGcnMjz5dqkc41q5CL0dfNe/7mL8LJtVrY4wwA4APvKIF6/urd29R6SYoqx46l9ohaKhGgPmCii7doUqNfrJDaZYsIIIsFnMKckXa/IF9fv1a++vr/2W4eN6dy0hh8qW541168919mjzOAnnhmroNS28kb/3qMqnMH1nv66qLXg4cn+mDxPh3QXqxuskQ8kScGgvn9I4W+0N1i5aodkXz70zfRPFJzRCVRm4f3vj8b/LCHGcCH3+iInfAPNzZ45mhCdSSulVROGE85vuC14AYN7YJgBvV9fFLD1wrYooTzsMnQ7TlnZWnW8qUlw02f2ejkhBdbWg5u2hlKstXHHmUA57/CEMeGr3/3B5z16Vs03+PpZS8vqjkp5zRcfR8UOuCjAn58REw+gdQRxBqFwfX+kpH+1kiubxr51pYWM/8yZ3lz3OO4Frz07dnsv8weEwrx7vM77FsC11R55f95ph6zlUJ6kzup1OfZsZKE2vcP9/jazkmvWkbHE03ygkkDbX0E1KtI08iPdsbyqbboHX85plwwY/TWiYReGkhPq5Q9YgV49/kdDgL+7IKUH06lut83++UdP07PyLX19JqTohCunakfdHKXchUzVsPmLUbCDX4UZKdRv81yc8Py7WYsnX/cIRJbuOy2QEpaxewRK0CnkvJDZyg3kNp9qs1Uxkd65vykJ0fGDKodhAov7gnay9GfKiMTeSIhnNvTMEh3nInl+q2Jfq0iMjsXQdPBnIGPf1z4eBjRVi2rfgV4x3ldnoKQaxv+4tKcakRcUI6c6JunVZ3J+zBbbWAQ7+MjvKnRKxTV50RlOfl9pTGgTmFWZHEuks9vrpv/fP3tvr9P22OKovW9Md/xEbDqDaBr4c6FiKmuyBvP7FJsm6NKqXlNWdkYq6KPoY3QrkCAjqLEsKZKMpIn8j6g2xOkZejfb7l5ZyTfm5jT1hfHlW5sWMzOvA/LqjWAt5/teNfZPQookRNeviWmK1Kq9OXZo105MXHkQsX7yNDqfB5na6SjeeKiwQa88NW2B5/I1skx+ewBY9z6zv8uFNcZPaqqFDvw9j/NrOChWLVngA5QBCQV/nJjn/GOkdE+R1e9nDyamlIEOAlT3NADKWhcwo2MiI+tqneB6owyMMYdIp68XH/CPvJfVy3o9p/8PXLG0aI8A04IkhGxZ7BqV4BTeoZRJxScl9+/Dx7I92vjfc6uOk62qNn91TQfGjPw+mgz0X6hiKzJaRIbTKiD77DekMxbbn4gki9TYNszXyBM1EWxIFNh5NpTWJUG8LazlWuTPnPW88Fvpxq7QiXy5qR6KidUnRQ0dKILQqkmVKtIQbChAvDMMO5p1oifM3LVXMSlpL73hj9Wdrbh3h/Cpr8JpKg9hFVpALMemlFMUY38/kklYmVt1cv5ZSf7J4ORHyzepye4Xo7+WFVktIBd7ucVKM9XUiHdHssNC5F842LH5nNefI9/xgbB5mDjK4UNv5Ntf34dq84A3nOuUgFihX17cE0spuw5ciI1x5eUsg8Y74OHNMH7Gr1KXikN9RdIHnUKLTGzjUj+v5kyV+wowZkffpJctsOT7OWJLo+UVXcI/knU5cmaY7YOjW7EaT3/7Ir6V1Q805EX0kBpjqrQU8jlseMjxJUEE6q9jDCwvCWBbYbbO3DVPovMv21J5WtHbtdrTt7Ki3oxR1z5490vi4Iay32ThtkDxoE68dLd9Kv7h1HOo2RVGcBLL2hw5DU5miDtFnpzmfz+bU4ec5ycUwlW23YY1k8vT69aQSfymhQMkg7jL1ZaIBnYo6TYu2Zj/cyPpxt3/OA9ZUb/eQs/nJ6TSs/iVuCUZHTQZaSXeNpFUVgCGugelGm+agzg5rtT/uKiDjt3wpsnvP53cWa8HT1tIpVjxlJTtqh6CVPiZLmbQKGCq9ZEE1HEhdk/Dp1fsiSmO5PTb85X0/9YKvVmL1n4Fw6/+niFBF0hLYkqNhVKM4LrCOsnLKU4TztKMbqVS2Q6gIYeHavGAHqp8rT9DZft05QjOqlOOzN5kk9e1hF77KwFL4pnZWfb5S4aTsW7mP5oVSQtk2yBQY+lAPIYBa/idsb+zhunG3dc/NSttXbO5Q+/6pgCpD5aqZvx4aroBWmVTTo7aeZ+WosXpLWdSlpkKdkz2tCvGgN4xgER/3xll298qQuxY+msZOONvnfcjsjURQdLfogBJ6r4yPT9SPxAeVQqhTxjzj/YYmalDsCD31KMmo6J3c7u2Lx/YP3MGc2kc5R4ceLFDgtSrJSKVME4QTpFu3WpwmWjre636ozMO9cUuEcv1xYny+ruu7QqDOCYP0yBLt++QeUzX6xqPmHynf/SOvm2NF2/uSDByogDoNqVUjTv18R9VzSDRNtQojiLxL6bjC9tqazZOZ0UWk+13iAefABflHHgLbSqZq5bZd99Ef2pn76ECu2/YZyTKLCP3sN9sjGYzn7jM4QWAODog4SrfmK55eN36stP/H+5d7s72qDniDJlFKyqWFVW7MPwTw82tvNSiuZMZCatMmIZlBm0rNBHf+5PxSX5brs8sTOOi+0ENYhf7jy2oiz/XifNm83NehRRNKcr7rcvN+2Nr2UH/8iCABzL6q65HnQFOOiNHVDBo/zeJxfgzKfK77/wkH0uur57snP6lFIsEg0CPlf27KsPfrQQ4WtJhJE8Ts0vfGel8ACC5PpbctXGjkKuM21UR7w3g/8QAOOhVzTdual4sV21OYHKdtxxf8LsCRNED/yUDfPPZgvrsBT0LtrypBBi/kaCGsD6OMdOB1++2ks1HtOD1pFceFXnNCQ9vRBLPo4CNbMebPCd5sxOLUddzZkxwIbai6kKqPik1G4nY/Me4+vem1wQYZb1o8z38jK/NGrr/ZiSBRbxU1fROhfMbXkal3fpYshzGDluDibsryfYFmif189ze39+cGqLOsz0UyT264s5PSsXc5gIEi7TRUGkTyWa0aJNUa2iGmyyEFFnk3R7UmuYuNRcL9bHBOryvRwK3s/LbLNmG/0cNUUKgBrIWeT4BE7LY0dOo0ANkZuZ4UzdynXaCaXChyXcGcArxkIjXZI4cVrIt8d7rvU8I+5pkSzXWgiFpMTSphTVJGfGGBwLgqDOgNFuMrqwKa4vdhAdU5UwPd0H6W4KtBpjcX5hKprwVnLDtAwZFgYuAqc2cc+5FC3MoVqnJoeRo78KW5AFMYDD3t8gzg3udNPU0e+kONyTU9JzvOoGXXkX+4N4IDENrSVbtGBzKloLXD6zZyK3GNeXSlGxMxj8gWZ/FNTQ65bM5kbdpN2cjKsMyr7//Lc8engKL4qRtaDM0+UWety2CvtQBjGANRtytFse8YYFr6qxmRQvp4jKEUCY2W2AgvY1b9u+FhuNJCJUWWcGe3+TuMW43twaFdsTiK4JNvgBk+I0ktbiuE3bFRPJw5bXlwL4Y2vIadeyT0U5SGdIZQnPvnpPMPkf8plC/Gja7GJFiIp9pkfVaE9PUMcLVLU6/EqYgy+giZ3Vgu0SyQZEaiH0MxBEFC8uKrdahemdXZvvGnWBvdZCo1cw843RaLqTM1PLvRB++VuDLZFuEPT862g/Tfgm13Ab51PmeFbXxdiKavTkD3c49eM97t8M/Y6XO/5uJ6LJOlU9BdXDV1qeX2C5b2klams97mPIDdwvIWQRAG8Stzkqt5dsobMv1lcf7//2sSI6dHuWTH9xMu50iybh1zRXGeyUxDbxT/tnFk85l6eugZ6ewBYET1HvCvUov8KKDrjL3/ttJqZjDjg0L2/56Ki+8otPLoroc1Q5USFHyIOvSE9js11LkZA3dQyhWmwsGwBJrbGUjCx4xI/jJQmmm8HRd7ZTNs3FUVvzlug3eAXEIHTQyo10nnchSyfCgXYTnn+nKeXVcf8KrKABHPK6BX734tPpO+W+29r8+5832XZv+iSf6ouBg4dTbaCDr4KVPpVkh+ZthNdxNFxxW0WdSdxcPLIYR+XmCCjqwwyaYWSd7xXNzmbddvsJEx7JP6K/C9YiR8XIWWVY36JDGWE7Hc5YJW7RFdNqzwg/urjJj77blJFiXuOEybtv6ZzWbesR1krI+RbAayyp1qIyOVNCw0mjXjCxW4xHlu6MSi0jolME7OUmHvVGegsTcWFxNBrxhuiRKkcGa5kBju3iXwDR6CJe15GXkymQrgK36IoZQN5DY6djy1KXOzctsjSbHtZYTM9NnU4PAx3CHHwVSOwM1Xir5k0FQ2XF5fh5vDgTu35udD5v852qOhOvWID/Q4ljafaK9r5m3dhuwgg8qhc1TKbT/VI42yAHQpPNzDCD41jyXK6tUI8GrJABPOkNi6gqncRRz+Wo2miCmJNNJE8XISbk3l9xWrBtrSUpljw+VD6TDNyeuXQ2rjVmo2JrrURuNJheAJvi3MDt2e8WJZFB6MxjMcZY0SNzcOZfsXHqt9moH2VOAF7LjpCPuDIGUCzm6EYixVyBHJK0RU9LRU8HzQXd+4MnlnmKNtKc2YBIIdzWB0VxcbU5l5ucXZA4zauTcLFag6vIhW7ZdBbHzD69REaXm+49SkRAwY8Kes52eid8hlGjPEm/RJNnBY4W3a0K3v/NKT5t0uum9L2Suj7WyLT3cqZXjpCQtzqDg6/TWjyj1SgGnUbDuScEUon8zrjcJiq2N4hoIdzBd5B93a6Y5uJE1OrnzRSPY7JUBrWUUvSQr9E67R623fwF5u8oEvvzKVPSu/AQJGJ0t2vY2Bz9vpPEODXeV7zT01COFTRcNOOAHrGZpxxFmrclQkTVD1FvwKom9caOqNowIn6NasBIXZVUYGezZtOlkajmDfI4B4qYQQ+H+Fa6J3+BpedCXHAIn6YhFuFwwgyH3WYA+78lBf0JzvVJ05ROx+FVD/bOvwT1+y0rJshTeyAybS3HM5qzdZRJJOQlHKlJ0qVkfM7ElUZOFQ0Z7amGtFsyO1o1a/sJU7Br7iBkcEF2YIQ8rwAHdZmhgtDAESFB3KK77aW7Xg/kENCejKzdpkmpPA56AvijlIAHXx38SwvWaT02GpsIH6658MDtmc7F5cYmW2jXET8VNA7Woy6WdG46LjTrtgSYXekTHp4jDkvhHGF0QwN0X2K5kjVB3KK7zQBsUgCUl757VH/wrxegytGq8mKFZc9GoCkOT2K3aSma05wZxfCILnV2CyrgBVvopcnEPDbpl9WbZMUz4H6mGlDLfLdgtjRrptiLqMqunRqW3aITDn2hok9L2Y+7uUbfy1wQt+guN4B9Xtdg3WuXQDyu15V/+It75IDn//2UOn8aym8x2NuGmeOGM72WbINK1MdQRTVgiIGqSdzOqNpsxZXmtESuEHDro8bhennbWhyPer2c5GWwUu8OgQzoQQY965XsPBA28BFuF4CT+faKPvcuN4Buv89E1eJ7HfL5go4kU8V+t3ma9/1nK+SQFa9u8jNE8BLLEsWooAU7CRKF3Pogksb1xgO50YUFMa6uKiEdA4phvl0zLI5H+6SxKe+m7cGwmozmQc9skz5XObagHK2fZlGUM1b0oXe5p2H7nKdcUJx30mg31RpZo/gXq+phBE10UTQybarx/VqKqkCdkG5YlVSMW0qqzUJUbo4BOQL1eh1OSdoqm7mlUUsaMz3IcNx9Pzl80n2vo3Pqi9h69Tb6N1xLO/0v2pT1bgAast/j+IlHxi59yJvvTuEOIYm8bPpMXrs9al79SQi/BYH8XA/SJzZtrcaR5kwBr4YQCfcMZn+JXDepL22OKo2cGL+GUKHgAuLpKcwujVjTrJqyyO4XRhAVhHvoP+MiGudcS38sIeZCmiLAaSv0+LvsOTt9z+EbLaeeG5N6B0c36afuiNS5l6C6XCQyULyPQmwalOyS5swaDOMrLscvyCTO5nuN/ORsLyq2rXoJFnwnHtTQ7ZbMzlYtKvdjmdKVCb4TBm7RNRHy3AI87VAKxtNDgCtWSCG7zABy0WBs33i3k0++oaSvPy83gvBs9XIMoWP9FbRo2zqatIkkWHmT5fhIE/mdcbk7awud9Rg3PtiJhdn+GK/0C8bPrY2TdsUkK119e+gW3ejh7FvpPKVAXtqktFZIjF260n36sh6z/1bX0w6LYq/6LEHPUtX68D+H2m+nxGa7FqKez9lxNRIHM0U/yPONK61ufny2J3FaHbg9A6HgRXZ0i7KjWbf11EpphU1x2S1acugZDn12Hxk3lHErJMAuOwRf+N0+Lzsh4d7/aNuLv58eum3Ov9Aanm4G2gxz+PUKRlTL8TzlKAEdxz/eW/3HjgpOrFuMq0tpVF0cRdSETHQRj+tUpLk0FvX6ESXCFCRYtrkNoKcL/n6le9EwTmy3T1W7zAA+/KWuXPDVvnZ7Pv7K99KnzDf9ofmYvAgapLrbACW2XapRnqItoBqswZJ6gzG+n9SWNkXVZk7R9UK4+j7i1amRhaXRKLcwFo14S2LC7VKHvU/0ADCHgrtopXbMu8wAbt2WaqcnFCKcWt1ajmQxEUFDKdUrxHaBSrRFC3ZEhXqw1pIAHjWJ7yUjS/mo3KyikoTKuRcP3kjarthtrbotphHTITrv/LxIDCzgTsHfqitYeH6Xrb9rppTIwYYy6dS0/2Ec6ZXesyXI+B8U1PXkTE+rsWpkCnjdXbeaj0CeYZpjrbklrjSrErkxAjoFjKOrkSwsTti4VbLFcEfwgXaGn83ApcDV8aCA1oroZ9dtQFPL+vWGbV8tKt7M5ZLo63FkLkMkXS65sxIP9DNis6DFqKd5sw5DJWSFB/WitthdSiZmliTXi9UFjPdR8JZWp2zmm7VovB/LRMDZXxkoomkwlxjMlYLOpOQxe5oX6IP3VnnKVIX15yt3/uud6bFPLf+gXIovE8PWFXU7Dpr2ei3bWa1Fi2oooIHSHIcVFYzVWVvqpFGpvUGsq4UubNup2HRuOpZeQeKwtQh+Nv1vjpAvV8n/qI/3EUJhhdIhdpkBvHPdTpo9pZizTJ25UW66pdXPJfZqQS5RkSVWqqOQSF+smacYWc3bMSRgYdvBQJe4tjSXG5tvi01H8YEOvgOcwgPtklls1OyoN5KErjXn0RkHl3q4sUUvjYjxeGorFKS7y56/ms+zo9kl7Xqq5bz+8IIi5UJ8J8oXBe5ckafxihhxWopmtBDlEKYI2gNBUoncfDyy6OPaYl5EJeTBF8V3KnaxWbfeWWoasA7rsJ8ZJeKb11D6wjTF7U2uY5qSGgw7WZmw6F02OH7y18NqIn+UckhHWf/aBfGqfWvkJhH5jsC+io6wO+8EFNVYer4eowVjf1buMATeINa140rz/qjYroGuUSTMVmwQ75O6RBqLk1GlMWZLGGxIt+cw5W12lPwVz2f6ujx0v8Vz5ARq+rEVPB7t8hXwOGB8tEQUGT2gUgXDNhHzBRW5YTjud9fgh1hmfSnapgVTx1ALub1VDzZONTcxZ6JSu4CXYPV9xIOPpdWu2M3NqpHUUFvBbpK/ohoGv50ClyWYr/89LP0P1rIPZf3bFRZmlxvA1R+K2DHbJooM97aaYiVKxZjrgMuBneyOOXk54K1gu9SSFCtlfMCkewWTuLm41toRVVojEqflgI5GNY5umkhrYSpKugWTD+z2XGYz6FfLRDcD7MP1fJnncTormxe8W85AP/lEiW4vRQwqvRbdfrNpjHzLGK4Q6O36X1RPxKIWI6FoJwgY7zPo52U0KrfnkvH5OROlZZwJVvxGFPGWxU7Vtho1u64fyUhgn78AS4K5TDHX3sSObsSdch+38Sy+wKWysqrabU4AI5a4INh8HvGRJAXzfRvJV0TY+XPKePwM4n1SrcSbtRI1VKiiGuxwJ4oXo4241I7iSmOtGF8MdvBVRRRt12xvfiJK0+SR1/XcrXIhd1rs5xNyt++HIyZWqFMIkBKx235x0/+qECXgOoYksfi+64jwPYUrURrsulXYYU2bSpyjaKug4WZ/bxCjaVJb2hzXF3pi3IQSrrkeKj01bGnVbK9ZNWMq2NCFyRVmgCsM5vuC9rdQlD6GA5jkGys8+8NuTvzpNpTI9okKsR58fhWTjzdF+fhzEpnbHtTH40ABa9qUop3ko5qKTIbK8hrK44jSZjI2l0aVZqyKDZbm6EGN+FY1WmjWrHURoxCw1OJQrAjzvYT4yxaZq1AmJtIyOTbRDSLQbjWAuz9ZhYKlNF3kpxd1JRkpNAuTpSttbK9Vpf24B6uqat50dCRuaSLgQuX4DsqbSOSbUaUzY4vdSbF+3cDrE+zWN01jac9NRbVm1dT5WeuiIKhH8egMRJeNMnZ1k9/pLdJkP9bRoU0vUCPt3b4i3vGJKrkqJMVY1x8DlWl2iuGrgn4PHkd8pqJYmaEQLfmcmVIj5ZVU3C/KoqgKUbHTz0/NtG2xk6iXx1pJ+XEjCi6W+U7Fbm5XTC41VHZxfZ/HIlLbwzdT5Iot3NuBvxKIeQFCV/YNJtiKbAkbW1Jc23PLZ2dIKjhBrxK4BFgYfuXRvZyB2QiluKWVqI+VUcIm3XuJ/FxUbi3GlUZNojQJWd/HOrq9vHQWJm2S5iRvHkw6CYGmKKOYzc+n/OU3Ufux41ucw/76JhL+gW2BxBqwIgZw64di4iTCRjF3fmVG+jt7s8B3EK5HSHm0L0fwRNLUSiSUo8qggXOoRJdBnm9Ubu2I64stET+Jl5CtENVFzLZrxjdqZkNqKYd3e2pzgug7f87oNYdA67mcLRcywRgRszL9uH/k8bBiTgGHY/auHUSVCCmCWLlJjHxeRLb8nLJ+M6pgpaOl6F4tWK/COAFbCKGiYrWX1Bu5pLpUQzQOleZovKLgGyO2tTge91wUNPBuiADmBynmc0eQ2/QmapxCUQG+szuuhB4lK/ambv1QxNHP2x9A1VhRkSURvo3KdSAdHuEqIJ5BXf9qbDVviniNQ9b3MZFrx7Xmpri6ZCRyEyup018VSDpYtjZGItuqmFFWoL7PI2AW5Irt+GtHuD9NuEvexfu5gg4Xy0Ro2VZWP7f9eB4Z/mPEgMr9IBcJ8tPhV379KqBAJEsUo3nydhwjI4H0NsCLSpJ2cuOz7ajYjtSbXOB4n16rFs23K6bojIwScmXkZ76xqy1y8SJufp4ODhSewUkBfP4PxYoawKZ/GkFV8baqznmZ6dsGxl6iwnfhN5wFBpGdqsVoQUfiOY0lRgNdMimggkTaiIrtVlRurZM4HQ9ZaVGUtJuXdHZNVG2XTUGCXogwaHGAzgjyX3ny1/4W9/lRYhyGs3huOMl+iRVfIe/9xzqWFCTS6kiJpXpxm8BlwA0wSAZ9aMRhWNC8xRfsNDZcPy+GxSWiSmsxPzk3Z5J+IWSiy9Dtub1TNltbZVN1QilwsJsADYUrBK529No3sFYc8EymgtYm+GWCzKDqu1TiiF67QTrbo1wqXdV36Vd6Lj3QqY7IL+cMDOJ9oBzPaSUyGJkIOsEJTsQ34nKzF9caFTHeBqvv41Gj9Fp121uYiCMXST7w1l8VlYjonjyF/xsR3THD0dS5Wg2W77M9qN//lwmiKK/CLZt3MFkq0+sL9811HohILuv0uKWfqv+VXbTisNL2tdhpObLDm6cwGvMGBB9X2jviStOIuPWDUt9hEMG5WGYaIyZp1uwGbyQfOs1R0VZMfM0k01dVqDWmuEmexhQm8KXXQxFEV/f9rxLVeomeh4lynqPW1cjH9qe5yHzRGu7Vny8MMzj4NrUYbdGcKSFMEDK4XkEi55LRBaLqUqwQBZz98Vb6jVE736zbvjfkw0d7KgLfE+SLFdjxcmKKlDQFdq5QZuyjIdhkcVC9inrHu8+JVJNFWTdiZv/w7NzXDloT3djto84P+suKV4iNaj32JFLAay7Y9mcw+JfiSmtLVG0UTJLWh9X1g2A8TWeYWRy1xXbR1AyhAq+XtQMgcyCXAVd/FPof5jaZYY57aLOBw8NJ9zAEiw68/oKIf7nU86oXtbjyuhLHH4JCcteNd6eX3HSve6qIHhQZgcgsUYoaWopGiSQfrLKzDsKd42KnnRubW7K5Xh1nisHKmiukiXRadbvYrth1zkgtWPmLoUhAH+Rqgcs7tOZO5UYS6lqlyn1Bm988PEG3i1ffqjDuOf4Qo3LKgohs6ni4BJFLRekO6gZH230tmcdQDrnXBlQs7ajU0bjSmDZxvxwu0QWMV9ctGz+3Ni71ChIHTHCH4ewvyAOCXCjIDSkpeUakx+2E35Y9PEEN4H++1XL1xRVSL5x1SqRwE59+a/Eer3KFwE/ESEuLtqRFO46QC+Q/Ux3G9MfVxvbc+Py8SdK66q7pnfuYBALvrDzQrpiFdsmMeSQfPt6HJnAV6NUgrYhEQDTPoSwwE06630Dwm/LjDrb8eJPja5/pc/jbT5XohUsaW3OdzUWf10p8OyU7imGKUCVFBkVFkMj3kvqijapLNRUSQhSbk2EoiBHXGIv80qgteqFM2PcoAAa5xWI/Z7CbInJYrAI4eizKuoDi/XpCZwgBcOR+ESd9oMNd21VlC9TXR/e5WC/zFbuP5mwBqCH44etfiQpzy78hgBFDx0R+0SQpYtOSYlIUGXa83N08KIsgopp6kVarajutapRTQc2DprFSZZWXFxwF4kGDSXNtQnKtQLNHX8qUdZFF+rL/Cojz2FkVBgBw8x1dqsUcx312kRveN5JOTLvvgbkJiPFIuGh2BUQHQc8IXgLKAsMAN1UZiMIw+Cho/ykApJfiO5OsZ5ZtupPtIE8JJtUjZdUYQKlkKJcs37kQ6rUGUa6S9mKTYuTBdI4Qb3n5Vk4UMQpmOcQ9kKKGxe58BB4h8OGX5RcjQJEKs2zF4yhSXqHiho+PVWMAkYlodlL2u7yO32BJ+w76RvAKNnBkiw7q/SwfhoOPOcD2Fat+0FcltDAMMlR7NNUQ4ehjwh8vMzIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJWHf8/ftAmPsVSYvIAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjAtMTAtMjlUMDI6NTA6MDYrMDA6MDASZ++eAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIwLTEwLTI5VDAyOjUwOjA2KzAwOjAwYzpXIgAAAABJRU5ErkJggg==`;\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/download/index.vue",
    "content": "<template>\n  <PageWrapper title=\"文件下载示例\">\n    <a-alert message=\"根据后台接口文件流下载\" />\n    <a-button type=\"primary\" class=\"my-4\" @click=\"handleDownByData\"> 文件流下载 </a-button>\n\n    <a-alert message=\"根据文件地址下载文件\" />\n    <a-button type=\"primary\" class=\"my-4\" @click=\"handleDownloadByUrl\"> 文件地址下载 </a-button>\n\n    <a-alert message=\"base64流下载\" />\n    <a-button type=\"primary\" class=\"my-4\" @click=\"handleDownloadByBase64\"> base64流下载 </a-button>\n\n    <a-alert message=\"图片Url下载,如果有跨域问题，需要处理图片跨域\" />\n    <a-button type=\"primary\" class=\"my-4\" @click=\"handleDownloadByOnlineUrl\"> 图片Url下载 </a-button>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { downloadByUrl, downloadByData, downloadByBase64, downloadByOnlineUrl } from '/@/utils/file/download';\n  import imgBase64 from './imgBase64';\n  import { PageWrapper } from '/@/components/Page';\n  import { Alert } from 'ant-design-vue';\n\n  export default defineComponent({\n    components: { PageWrapper, [Alert.name]: Alert },\n    setup() {\n      function handleDownByData() {\n        downloadByData('text content', 'testName.txt');\n      }\n      function handleDownloadByUrl() {\n        downloadByUrl({\n          url: 'https://codeload.github.com/anncwb/vue-Jeecg-admin-doc/zip/master',\n          target: '_self',\n        });\n\n        downloadByUrl({\n          url: 'https://vebn.oss-cn-beijing.aliyuncs.com/Jeecg/logo.png',\n          target: '_self',\n        });\n      }\n\n      function handleDownloadByBase64() {\n        downloadByBase64(imgBase64, 'logo.png');\n      }\n\n      function handleDownloadByOnlineUrl() {\n        downloadByOnlineUrl(\n          'https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5944817f47b8408e9f1442ece49d68ca~tplv-k3u1fbpfcp-watermark.image',\n          'logo.png'\n        );\n      }\n      return {\n        handleDownloadByUrl,\n        handleDownByData,\n        handleDownloadByBase64,\n        handleDownloadByOnlineUrl,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/full-screen/index.vue",
    "content": "<template>\n  <PageWrapper title=\"全屏示例\">\n    <CollapseContainer class=\"w-full h-32 bg-white rounded-md\" title=\"Window Full Screen\">\n      <a-button type=\"primary\" @click=\"enter\" class=\"mr-2\"> Enter Window Full Screen </a-button>\n      <a-button color=\"success\" @click=\"toggle\" class=\"mr-2\"> Toggle Window Full Screen </a-button>\n\n      <a-button color=\"error\" @click=\"exit\" class=\"mr-2\"> Exit Window Full Screen </a-button>\n\n      Current State: {{ isFullscreen }}\n    </CollapseContainer>\n\n    <CollapseContainer class=\"w-full mt-5 bg-white rounded-md\" title=\"Dom Full Screen\">\n      <a-button type=\"primary\" @click=\"toggleDom\" class=\"mr-2\"> Enter Dom Full Screen </a-button>\n    </CollapseContainer>\n\n    <div ref=\"domRef\" class=\"flex items-center justify-center w-1/2 h-64 mx-auto mt-10 bg-white rounded-md\">\n      <a-button type=\"primary\" @click=\"toggleDom\" class=\"mr-2\"> Exit Dom Full Screen </a-button>\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import { CollapseContainer } from '/@/components/Container/index';\n  import { useFullscreen } from '@vueuse/core';\n\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { CollapseContainer, PageWrapper },\n    setup() {\n      const domRef = ref<Nullable<HTMLElement>>(null);\n      const { enter, toggle, exit, isFullscreen } = useFullscreen();\n\n      const { toggle: toggleDom } = useFullscreen(domRef);\n      return {\n        enter,\n        toggleDom,\n        toggle,\n        isFullscreen,\n        exit,\n        domRef,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/icon/index.vue",
    "content": "<template>\n  <PageWrapper title=\"Icon组件示例\">\n    <CollapseContainer title=\"Antv Icon使用 (直接按需引入相应组件即可)\">\n      <div class=\"flex justify-around\">\n        <GithubFilled :style=\"{ fontSize: '30px' }\" />\n        <QqCircleFilled :style=\"{ fontSize: '30px' }\" />\n        <WechatFilled :style=\"{ fontSize: '30px' }\" />\n        <AlipayCircleFilled :style=\"{ fontSize: '30px' }\" />\n        <IeCircleFilled :style=\"{ fontSize: '30px' }\" />\n        <TaobaoCircleFilled :style=\"{ fontSize: '30px' }\" />\n        <CodepenCircleFilled :style=\"{ fontSize: '30px' }\" />\n      </div>\n    </CollapseContainer>\n\n    <CollapseContainer title=\"IconIfy 组件使用\" class=\"my-5\">\n      <div class=\"flex justify-around flex-wrap\">\n        <Icon icon=\"ion:layers-outline\" :size=\"30\" />\n        <Icon icon=\"ion:bar-chart-outline\" :size=\"30\" />\n        <Icon icon=\"ion:tv-outline\" :size=\"30\" />\n        <Icon icon=\"ion:settings-outline\" :size=\"30\" />\n      </div>\n    </CollapseContainer>\n\n    <CollapseContainer title=\"svg 雪碧图\" class=\"my-5\">\n      <div class=\"flex justify-around flex-wrap\">\n        <SvgIcon name=\"test\" size=\"32\" />\n        <template v-for=\"item in 6\" :key=\"item\">\n          <SvgIcon :name=\"`dynamic-avatar-${item}`\" size=\"32\" />\n        </template>\n      </div>\n    </CollapseContainer>\n\n    <CollapseContainer title=\"图标选择器(Iconify)\" class=\"my-5\">\n      <div class=\"flex justify-around flex-wrap\">\n        <IconPicker />\n      </div>\n    </CollapseContainer>\n\n    <CollapseContainer title=\"图标选择器(Svg)\" class=\"my-5\">\n      <div class=\"flex justify-around flex-wrap\">\n        <IconPicker mode=\"svg\" />\n      </div>\n    </CollapseContainer>\n\n    <Alert\n      show-icon\n      message=\"推荐使用Iconify组件\"\n      description=\"Icon组件基本包含所有的图标,在下面网址内你可以查询到你想要的任何图标。并且打包只会打包所用到的图标。\"\n    />\n    <a-button type=\"link\" @click=\"toIconify\"> Iconify 图标大全 </a-button>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { CollapseContainer } from '/@/components/Container/index';\n  import { Alert } from 'ant-design-vue';\n  import {\n    QqCircleFilled,\n    GithubFilled,\n    WechatFilled,\n    AlipayCircleFilled,\n    IeCircleFilled,\n    TaobaoCircleFilled,\n    CodepenCircleFilled,\n  } from '@ant-design/icons-vue';\n\n  import { Icon, IconPicker, SvgIcon } from '/@/components/Icon/index';\n\n  import { openWindow } from '/@/utils';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: {\n      PageWrapper,\n      CollapseContainer,\n      GithubFilled,\n      QqCircleFilled,\n      WechatFilled,\n      AlipayCircleFilled,\n      IeCircleFilled,\n      TaobaoCircleFilled,\n      CodepenCircleFilled,\n      Icon,\n      Alert,\n      IconPicker,\n      SvgIcon,\n    },\n    setup() {\n      return {\n        toIconify: () => {\n          openWindow('https://iconify.design/');\n        },\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/img-preview/index.vue",
    "content": "<template>\n  <PageWrapper title=\"图片预览示例\">\n    <h1>有预览图</h1>\n    <ImagePreview :imageList=\"imgList\" />\n    <a-divider />\n    <h1>无预览图</h1>\n    <a-button @click=\"openImg\" type=\"primary\">点击预览</a-button>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { createImgPreview, ImagePreview } from '/@/components/Preview/index';\n  import { PageWrapper } from '/@/components/Page';\n  import { ImageProps } from '/@/components/Preview/src/typing';\n\n  const imgList: ImageProps[] = [\n    { src: 'https://jeecgos.oss-cn-beijing.aliyuncs.com/upload/test/login_1658829954004.png', width: 300 },\n    { src: 'https://jeecgos.oss-cn-beijing.aliyuncs.com/upload/test/home_index_1658830084684.png', width: 300 },\n    { src: 'https://jeecgos.oss-cn-beijing.aliyuncs.com/upload/test/design_1658830200539.png', width: 300 },\n    { src: 'https://static.jeecg.com/upload/test/13_1592320121058.png', width: 300 },\n    { src: 'https://static.jeecg.com/upload/test/16_1592320251436.png', width: 300 },\n  ];\n  export default defineComponent({\n    components: { PageWrapper, ImagePreview },\n    setup() {\n      function openImg() {\n        const onImgLoad = ({ index, url, dom }) => {\n          console.log(`第${index + 1}张图片已加载，URL为：${url}`, dom);\n        };\n        // 可以使用createImgPreview返回的 PreviewActions 来控制预览逻辑，实现类似幻灯片、自动旋转之类的骚操作\n        let imageList = imgList.map<string>((i) => i.src);\n        createImgPreview({ imageList: imageList, defaultWidth: 700, rememberState: true, onImgLoad });\n      }\n\n      return { imgList, openImg };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/menu-params/index.vue",
    "content": "<template>\n  <PageWrapper title=\"带参数菜单（路由）\" content=\"支持多级参数\">\n    当前参数：{{ params }}\n    <br />\n    输入参数切换路由：\n    <Input v-model:value=\"value\" placeholder=\"建议为url标准字符，输入后点击切换\" />\n    <a-button type=\"primary\" @click=\"handleClickGo\">切换路由</a-button>\n    <br />\n    切换路由后\n    <ul>\n      <li>可刷新页面测试路由参数情况是否正常。</li>\n      <li>可于左侧菜单中展开子菜单，点击测试参数是否携带正常。</li>\n    </ul>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { Input } from 'ant-design-vue';\n  import { computed, defineComponent, ref, unref } from 'vue';\n  import { useRouter } from 'vue-router';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    name: 'TestMenu',\n    components: { PageWrapper, Input },\n    setup() {\n      const { currentRoute, replace } = useRouter();\n      const value = ref<string>('');\n\n      const handleClickGo = () => {\n        const { name } = unref(currentRoute);\n        replace({ name: name!, params: { id: unref(value) } });\n      };\n      return {\n        value,\n        handleClickGo,\n        params: computed(() => {\n          return unref(currentRoute).params;\n        }),\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/msg/index.vue",
    "content": "<template>\n  <PageWrapper title=\"消息示例\">\n    <CollapseContainer class=\"w-full h-32 bg-white rounded-md\" title=\"Message\">\n      <a-button @click=\"infoMsg('Info message')\" class=\"mr-2\"> Info </a-button>\n      <a-button @click=\"successMsg('Success message')\" class=\"mr-2\" color=\"success\"> Success </a-button>\n      <a-button @click=\"warningMsg('Warning message')\" class=\"mr-2\" color=\"warning\"> Warning </a-button>\n      <a-button @click=\"errorMsg('Error message')\" class=\"mr-2\" color=\"error\"> Error </a-button>\n      <a-button @click=\"handleLoading\" class=\"mr-2\" type=\"primary\"> Loading </a-button>\n    </CollapseContainer>\n\n    <CollapseContainer class=\"w-full h-32 mt-5 bg-white rounded-md\" title=\"Comfirm\">\n      <a-button @click=\"handleConfirm('info')\" class=\"mr-2\"> Info </a-button>\n      <a-button @click=\"handleConfirm('warning')\" color=\"warning\" class=\"mr-2\"> Warning </a-button>\n      <a-button @click=\"handleConfirm('success')\" color=\"success\" class=\"mr-2\"> Success </a-button>\n      <a-button @click=\"handleConfirm('error')\" color=\"error\" class=\"mr-2\"> Error </a-button>\n    </CollapseContainer>\n\n    <CollapseContainer class=\"w-full h-32 mt-5 bg-white rounded-md\" title=\"Modal\">\n      <a-button @click=\"handleInfoModal\" class=\"mr-2\"> Info </a-button>\n      <a-button @click=\"handleSuccessModal\" color=\"success\" class=\"mr-2\"> Success </a-button>\n      <a-button @click=\"handleErrorModal\" color=\"error\" class=\"mr-2\"> Error </a-button>\n      <a-button @click=\"handleWarningModal\" color=\"warning\" class=\"mr-2\"> Warning </a-button>\n    </CollapseContainer>\n\n    <CollapseContainer class=\"w-full h-32 mt-5 bg-white rounded-md\" title=\"Notification 用法与上面一致\">\n      <a-button @click=\"handleNotify\" color=\"success\" class=\"mr-2\"> Success </a-button>\n    </CollapseContainer>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { CollapseContainer } from '/@/components/Container/index';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { CollapseContainer, PageWrapper },\n    setup() {\n      const { createMessage, createConfirm, createSuccessModal, createInfoModal, createErrorModal, createWarningModal, notification } = useMessage();\n      const { info, success, warning, error } = createMessage;\n\n      function handleLoading() {\n        createMessage.loading('Loading...');\n      }\n      function handleConfirm(type: 'warning' | 'error' | 'success' | 'info') {\n        createConfirm({\n          iconType: type,\n          title: 'Tip',\n          content: 'content message...',\n        });\n      }\n      function handleSuccessModal() {\n        createSuccessModal({ title: 'Tip', content: 'content message...' });\n      }\n      function handleErrorModal() {\n        createErrorModal({ title: 'Tip', content: 'content message...' });\n      }\n      function handleWarningModal() {\n        createWarningModal({ title: 'Tip', content: 'content message...' });\n      }\n      function handleInfoModal() {\n        createInfoModal({ title: 'Tip', content: 'content message...' });\n      }\n      function handleNotify() {\n        notification.success({\n          message: 'Tip',\n          description: 'content message...',\n        });\n      }\n      return {\n        infoMsg: info,\n        successMsg: success,\n        warningMsg: warning,\n        errorMsg: error,\n        handleLoading,\n        handleConfirm,\n        handleSuccessModal,\n        handleErrorModal,\n        handleWarningModal,\n        handleInfoModal,\n        handleNotify,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/print/index.vue",
    "content": "<template>\n  <PageWrapper title=\"打印示例\">\n    <CollapseContainer title=\"json打印表格\">\n      <a-button type=\"primary\" @click=\"jsonPrint\">打印</a-button>\n    </CollapseContainer>\n\n    <a-button type=\"primary\" class=\"mt-5\" @click=\"imagePrint\">Image Print</a-button>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { PageWrapper } from '/@/components/Page';\n  import { CollapseContainer } from '/@/components/Container/index';\n\n  import printJS from 'print-js';\n\n  export default defineComponent({\n    name: 'AppLogo',\n    components: { PageWrapper, CollapseContainer },\n    setup() {\n      function jsonPrint() {\n        printJS({\n          printable: [\n            { name: 'll', email: '123@gmail.com', phone: '123' },\n            { name: 'qq', email: '456@gmail.com', phone: '456' },\n          ],\n          properties: ['name', 'email', 'phone'],\n          type: 'json',\n        });\n      }\n\n      function imagePrint() {\n        printJS({\n          printable: ['https://anncwb.github.io/anncwb/images/preview1.png', 'https://anncwb.github.io/anncwb/images/preview2.png'],\n          type: 'image',\n          header: 'Multiple Images',\n          imageStyle: 'width:100%;',\n        });\n      }\n      return {\n        jsonPrint,\n        imagePrint,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/ripple/index.vue",
    "content": "<template>\n  <PageWrapper title=\"Ripple示例\">\n    <div class=\"demo-box\" v-ripple> content </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import RippleDirective from '/@/directives/ripple';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { PageWrapper },\n    directives: {\n      Ripple: RippleDirective,\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .demo-box {\n    display: flex;\n    width: 300px;\n    height: 300px;\n    font-size: 24px;\n    color: #fff;\n    background-color: #408ede;\n    border-radius: 10px;\n    justify-content: center;\n    align-items: center;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/session-timeout/index.vue",
    "content": "<template>\n  <PageWrapper title=\"登录过期示例\" content=\"用户登录过期示例，不再跳转登录页，直接生成页面覆盖当前页面，方便保持过期前的用户状态！\">\n    <a-card title=\"请点击下面的按钮访问测试接口\" extra=\"所访问的接口会返回Token过期响应\">\n      <a-card-grid style=\"width: 50%; text-align: center\">\n        <a-button type=\"primary\" @click=\"test1\">HttpStatus == 401</a-button>\n      </a-card-grid>\n      <a-card-grid style=\"width: 50%; text-align: center\">\n        <span></span>\n        <a-button class=\"ml-4\" type=\"primary\" @click=\"test2\">Response.code == 401</a-button>\n      </a-card-grid>\n    </a-card>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { PageWrapper } from '/@/components/Page';\n  import { useUserStore } from '/@/store/modules/user';\n\n  import { sessionTimeoutApi, tokenExpiredApi } from '/@/api/demo/account';\n  import { Card } from 'ant-design-vue';\n\n  export default defineComponent({\n    name: 'TestSessionTimeout',\n    components: { ACardGrid: Card.Grid, ACard: Card, PageWrapper },\n    setup() {\n      const userStore = useUserStore();\n      async function test1() {\n        // 示例网站生产环境用的是mock数据，不能返回Http状态码，\n        // 所以在生产环境直接改变状态来达到测试效果\n        if (import.meta.env.PROD) {\n          userStore.setToken(undefined);\n          userStore.setSessionTimeout(true);\n        } else {\n          // 这个api会返回状态码为401的响应\n          await sessionTimeoutApi();\n        }\n      }\n\n      async function test2() {\n        // 这个api会返回code为401的json数据，Http状态码为200\n        try {\n          await tokenExpiredApi();\n        } catch (err) {\n          console.log('接口访问错误：', (err as Error).message || '错误');\n        }\n      }\n\n      return { test1, test2 };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/tab-params/index.vue",
    "content": "<template>\n  <PageWrapper title=\"带参数标签页\" content=\"支持带参数多tab缓存\">\n    Current Param : {{ params }}\n    <br />\n    Keep Alive\n    <Input />\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { computed, defineComponent, unref } from 'vue';\n  import { useRouter } from 'vue-router';\n  import { PageWrapper } from '/@/components/Page';\n  import { Input } from 'ant-design-vue';\n\n  export default defineComponent({\n    name: 'TestTab',\n    components: { PageWrapper, Input },\n    setup() {\n      const { currentRoute } = useRouter();\n      return {\n        params: computed(() => {\n          return unref(currentRoute).params;\n        }),\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/tabs/TabDetail.vue",
    "content": "<template>\n  <PageWrapper title=\"Tab详情页面\">\n    <div>{{ index }} - 详情页内容在此</div>\n  </PageWrapper>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { PageWrapper } from '/@/components/Page';\n  import { useTabs } from '/@/hooks/web/useTabs';\n  import { useRoute } from 'vue-router';\n\n  export default defineComponent({\n    name: 'TabDetail',\n    components: { PageWrapper },\n    setup() {\n      const route = useRoute();\n      const index = route.params?.id ?? -1;\n      const { setTitle } = useTabs();\n\n      // 设置标识\n      setTitle(`No.${index} - 详情信息`);\n      return {\n        index,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/tabs/index.vue",
    "content": "<template>\n  <PageWrapper title=\"标签页操作示例\">\n    <CollapseContainer title=\"在下面输入框输入文本,切换后回来内容会保存\">\n      <a-alert banner message=\"该操作不会影响页面标题，仅修改Tab标题\" />\n      <div class=\"mt-2 flex flex-grow-0\">\n        <a-button class=\"mr-2\" @click=\"setTabTitle\" type=\"primary\"> 设置Tab标题 </a-button>\n        <a-input placeholder=\"请输入\" v-model:value=\"title\" class=\"mr-4 w-12\" />\n      </div>\n    </CollapseContainer>\n\n    <CollapseContainer class=\"mt-4\" title=\"标签页操作\">\n      <a-button class=\"mr-2\" @click=\"() => closeAll()\"> 关闭所有 </a-button>\n      <a-button class=\"mr-2\" @click=\"() => closeLeft()\"> 关闭左侧 </a-button>\n      <a-button class=\"mr-2\" @click=\"() => closeRight()\"> 关闭右侧 </a-button>\n      <a-button class=\"mr-2\" @click=\"() => closeOther()\"> 关闭其他 </a-button>\n      <a-button class=\"mr-2\" @click=\"closeCurrent\"> 关闭当前 </a-button>\n      <a-button class=\"mr-2\" @click=\"refreshPage\"> 刷新当前 </a-button>\n    </CollapseContainer>\n\n    <CollapseContainer class=\"mt-4\" title=\"标签页复用超出限制自动关闭(使用场景: 动态路由)\">\n      <a-button v-for=\"index in 6\" :key=\"index\" class=\"mr-2\" @click=\"toDetail(index)\"> 打开{{ index }}详情页 </a-button>\n    </CollapseContainer>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import { CollapseContainer } from '/@/components/Container';\n  import { useTabs } from '/@/hooks/web/useTabs';\n  import { PageWrapper } from '/@/components/Page';\n  import { Input, Alert } from 'ant-design-vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useGo } from '/@/hooks/web/usePage';\n\n  export default defineComponent({\n    name: 'TabsDemo',\n    components: { CollapseContainer, PageWrapper, [Input.name]: Input, [Alert.name]: Alert },\n    setup() {\n      const go = useGo();\n      const title = ref<string>('');\n      const { closeAll, closeLeft, closeRight, closeOther, closeCurrent, refreshPage, setTitle } = useTabs();\n      const { createMessage } = useMessage();\n      function setTabTitle() {\n        if (title.value) {\n          setTitle(title.value);\n        } else {\n          createMessage.error('请输入要设置的Tab标题！');\n        }\n      }\n\n      function toDetail(index: number) {\n        go(`/comp/basic/tabs/detail/${index}`);\n      }\n      return {\n        closeAll,\n        closeLeft,\n        closeRight,\n        closeOther,\n        closeCurrent,\n        toDetail,\n        refreshPage,\n        setTabTitle,\n        title,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/watermark/index.vue",
    "content": "<template>\n  <PageWrapper title=\"水印示例\">\n    <CollapseContainer class=\"w-full h-32 bg-white rounded-md\" title=\"Global WaterMark\">\n      <a-button type=\"primary\" class=\"mr-2\" @click=\"setWatermark('WaterMark Info')\"> Create </a-button>\n      <a-button color=\"error\" class=\"mr-2\" @click=\"clear\"> Clear </a-button>\n      <a-button color=\"warning\" class=\"mr-2\" @click=\"setWatermark('WaterMark Info New')\"> Reset </a-button>\n    </CollapseContainer>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import { CollapseContainer } from '/@/components/Container/index';\n  import { useWatermark } from '/@/hooks/web/useWatermark';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { CollapseContainer, PageWrapper },\n    setup() {\n      const areaRef = ref<Nullable<HTMLElement>>(null);\n      const { setWatermark, clear } = useWatermark();\n      return {\n        setWatermark,\n        clear,\n        areaRef,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/feat/ws/index.vue",
    "content": "<template>\n  <PageWrapper title=\"WebSocket 示例\">\n    <div class=\"flex\">\n      <div class=\"w-1/3 bg-white p-4\">\n        <div class=\"flex items-center\">\n          <span class=\"text-lg font-medium mr-4\"> 连接状态: </span>\n          <Tag :color=\"getTagColor\">{{ status }}</Tag>\n        </div>\n        <hr class=\"my-4\" />\n\n        <div class=\"flex\">\n          <a-input v-model:value=\"server\" disabled>\n            <template #addonBefore> 服务地址 </template>\n          </a-input>\n          <a-button :type=\"getIsOpen ? 'danger' : 'primary'\" @click=\"toggle\">\n            {{ getIsOpen ? '关闭连接' : '开启连接' }}\n          </a-button>\n        </div>\n        <p class=\"text-lg font-medium mt-4\">设置</p>\n        <hr class=\"my-4\" />\n\n        <InputTextArea placeholder=\"需要发送到服务器的内容\" :disabled=\"!getIsOpen\" v-model:value=\"sendValue\" allowClear />\n\n        <a-button type=\"primary\" block class=\"mt-4\" :disabled=\"!getIsOpen\" @click=\"handlerSend\"> 发送 </a-button>\n      </div>\n\n      <div class=\"w-2/3 bg-white ml-4 p-4\">\n        <span class=\"text-lg font-medium mr-4\"> 消息记录: </span>\n        <hr class=\"my-4\" />\n\n        <div class=\"max-h-80 overflow-auto\">\n          <ul>\n            <li v-for=\"item in getList\" class=\"mt-2\" :key=\"item.time\">\n              <div class=\"flex items-center\">\n                <span class=\"mr-2 text-primary font-medium\">收到消息:</span>\n                <span>{{ formatToDateTime(item.time) }}</span>\n              </div>\n              <div>\n                {{ item.res }}\n              </div>\n            </li>\n          </ul>\n        </div>\n      </div>\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, reactive, watchEffect, computed, toRefs } from 'vue';\n  import { Tag, Input } from 'ant-design-vue';\n  import { PageWrapper } from '/@/components/Page';\n  import { useWebSocket } from '@vueuse/core';\n  import { formatToDateTime } from '/@/utils/dateUtil';\n\n  export default defineComponent({\n    components: {\n      PageWrapper,\n      [Input.name]: Input,\n      InputTextArea: Input.TextArea,\n      Tag,\n    },\n    setup() {\n      const state = reactive({\n        server: 'ws://localhost:3300/test',\n        sendValue: '',\n        recordList: [] as { id: number; time: number; res: string }[],\n      });\n\n      const { status, data, send, close, open } = useWebSocket(state.server, {\n        autoReconnect: false,\n        heartbeat: true,\n      });\n\n      watchEffect(() => {\n        if (data.value) {\n          try {\n            const res = JSON.parse(data.value);\n            state.recordList.push(res);\n          } catch (error) {\n            state.recordList.push({\n              res: data.value,\n              id: Math.ceil(Math.random() * 1000),\n              time: new Date().getTime(),\n            });\n          }\n        }\n      });\n\n      const getIsOpen = computed(() => status.value === 'OPEN');\n      const getTagColor = computed(() => (getIsOpen.value ? 'success' : 'red'));\n\n      const getList = computed(() => {\n        return [...state.recordList].reverse();\n      });\n\n      function handlerSend() {\n        send(state.sendValue);\n        state.sendValue = '';\n      }\n\n      function toggle() {\n        if (getIsOpen.value) {\n          close();\n        } else {\n          open();\n        }\n      }\n      return {\n        status,\n        formatToDateTime,\n        ...toRefs(state),\n        handlerSend,\n        getList,\n        toggle,\n        getIsOpen,\n        getTagColor,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/form/AdvancedForm.vue",
    "content": "<template>\n  <PageWrapper title=\"可折叠表单示例\">\n    <CollapseContainer title=\"基础收缩示例\">\n      <BasicForm @register=\"register\" />\n    </CollapseContainer>\n\n    <CollapseContainer title=\"超过5列自动收起，折叠时保留2行\" class=\"mt-4\">\n      <BasicForm @register=\"register1\" />\n    </CollapseContainer>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';\n  import { CollapseContainer } from '/@/components/Container';\n  import { PageWrapper } from '/@/components/Page';\n\n  const getSchamas = (): FormSchema[] => {\n    return [\n      {\n        field: 'field1',\n        component: 'Input',\n        label: '字段1',\n        colProps: {\n          span: 8,\n        },\n        componentProps: {\n          placeholder: '自定义placeholder',\n          onChange: (e: any) => {\n            console.log(e);\n          },\n        },\n      },\n      {\n        field: 'field2',\n        component: 'Input',\n        label: '字段2',\n        colProps: {\n          span: 8,\n        },\n      },\n      {\n        field: 'field3',\n        component: 'DatePicker',\n        label: '字段3',\n        colProps: {\n          span: 8,\n        },\n      },\n      {\n        field: 'field4',\n        component: 'Select',\n        label: '字段4',\n        colProps: {\n          span: 8,\n        },\n        componentProps: {\n          options: [\n            {\n              label: '选项1',\n              value: '1',\n              key: '1',\n            },\n            {\n              label: '选项2',\n              value: '2',\n              key: '2',\n            },\n          ],\n        },\n      },\n      {\n        field: 'field5',\n        component: 'CheckboxGroup',\n        label: '字段5',\n        colProps: {\n          span: 8,\n        },\n        componentProps: {\n          options: [\n            {\n              label: '选项1',\n              value: '1',\n            },\n            {\n              label: '选项2',\n              value: '2',\n            },\n          ],\n        },\n      },\n      // {\n      //   field: 'field7',\n      //   component: 'RadioGroup',\n      //   label: '字段7',\n      //   colProps: {\n      //     span: 8,\n      //   },\n      //   componentProps: {\n      //     options: [\n      //       {\n      //         label: '选项1',\n      //         value: '1',\n      //       },\n      //       {\n      //         label: '选项2',\n      //         value: '2',\n      //       },\n      //     ],\n      //   },\n      // },\n    ];\n  };\n\n  function getAppendSchemas(): FormSchema[] {\n    return [\n      {\n        field: 'field10',\n        component: 'Input',\n        label: '字段10',\n        colProps: {\n          span: 8,\n        },\n      },\n      {\n        field: 'field11',\n        component: 'Input',\n        label: '字段11',\n        colProps: {\n          span: 8,\n        },\n      },\n      {\n        field: 'field12',\n        component: 'Input',\n        label: '字段12',\n        colProps: {\n          span: 8,\n        },\n      },\n      {\n        field: 'field13',\n        component: 'Input',\n        label: '字段13',\n        colProps: {\n          span: 8,\n        },\n      },\n    ];\n  }\n  export default defineComponent({\n    components: { BasicForm, CollapseContainer, PageWrapper },\n    setup() {\n      const [register] = useForm({\n        labelWidth: 120,\n        schemas: getSchamas(),\n        actionColOptions: {\n          span: 24,\n        },\n        compact: true,\n        showAdvancedButton: true,\n      });\n      const extraSchemas: FormSchema[] = [];\n      for (let i = 14; i < 30; i++) {\n        extraSchemas.push({\n          field: 'field' + i,\n          component: 'Input',\n          label: '字段' + i,\n          colProps: {\n            span: 8,\n          },\n        });\n      }\n      const [register1] = useForm({\n        labelWidth: 120,\n        schemas: [...getSchamas(), ...getAppendSchemas(), { field: '', component: 'Divider', label: '更多字段' }, ...extraSchemas],\n        actionColOptions: {\n          span: 8,\n        },\n        compact: true,\n        showAdvancedButton: true,\n        autoAdvancedCol: 2,\n        alwaysShowLines: 1,\n      });\n      return {\n        register,\n        register1,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/form/AppendForm.vue",
    "content": "<template>\n  <PageWrapper title=\"表单增删示例\">\n    <CollapseContainer title=\"表单增删\">\n      <BasicForm @register=\"register\" @submit=\"handleSubmit\">\n        <template #add=\"{ field }\">\n          <Button v-if=\"Number(field) === 0\" @click=\"add\">+</Button>\n          <Button v-if=\"field > 0\" @click=\"del(field)\">-</Button>\n        </template>\n      </BasicForm>\n    </CollapseContainer>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { CollapseContainer } from '/@/components/Container/index';\n  import { Input } from 'ant-design-vue';\n  import { PageWrapper } from '/@/components/Page';\n  import { Button } from '/@/components/Button';\n\n  export default defineComponent({\n    components: { BasicForm, CollapseContainer, PageWrapper, [Input.name]: Input, Button },\n    setup() {\n      const [register, { appendSchemaByField, removeSchemaByFiled, validate }] = useForm({\n        schemas: [\n          {\n            field: 'field0a',\n            component: 'Input',\n            label: '字段0',\n            colProps: {\n              span: 8,\n            },\n            required: true,\n          },\n          {\n            field: 'field0b',\n            component: 'Input',\n            label: '字段0',\n            colProps: {\n              span: 8,\n            },\n            required: true,\n          },\n          {\n            field: '0',\n            component: 'Input',\n            label: ' ',\n            colProps: {\n              span: 8,\n            },\n            slot: 'add',\n          },\n        ],\n        labelWidth: 100,\n        actionColOptions: { span: 24 },\n      });\n\n      async function handleSubmit() {\n        try {\n          const data = await validate();\n          console.log(data);\n        } catch (e) {\n          console.log(e);\n        }\n      }\n\n      const n = ref(1);\n\n      function add() {\n        appendSchemaByField(\n          {\n            field: `field${n.value}a`,\n            component: 'Input',\n            label: '字段' + n.value,\n            colProps: {\n              span: 8,\n            },\n            required: true,\n          },\n          ''\n        );\n        appendSchemaByField(\n          {\n            field: `field${n.value}b`,\n            component: 'Input',\n            label: '字段' + n.value,\n            colProps: {\n              span: 8,\n            },\n            required: true,\n          },\n          ''\n        );\n\n        appendSchemaByField(\n          {\n            field: `${n.value}`,\n            component: 'Input',\n            label: ' ',\n            colProps: {\n              span: 8,\n            },\n            slot: 'add',\n          },\n          ''\n        );\n        n.value++;\n      }\n\n      function del(field) {\n        removeSchemaByFiled([`field${field}a`, `field${field}b`, `${field}`]);\n        n.value--;\n      }\n\n      return { register, handleSubmit, add, del };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/form/CustomerForm.vue",
    "content": "<template>\n  <PageWrapper title=\"自定义组件示例\">\n    <CollapseContainer title=\"自定义表单\">\n      <BasicForm @register=\"register\" @submit=\"handleSubmit\">\n        <template #f3=\"{ model, field }\">\n          <a-input v-model:value=\"model[field]\" placeholder=\"自定义slot\" />\n        </template>\n      </BasicForm>\n    </CollapseContainer>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, h } from 'vue';\n  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';\n  import { CollapseContainer } from '/@/components/Container/index';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { Input } from 'ant-design-vue';\n  import { PageWrapper } from '/@/components/Page';\n\n  const schemas: FormSchema[] = [\n    {\n      field: 'field1',\n      component: 'Input',\n      label: 'render方式',\n      colProps: {\n        span: 8,\n      },\n      rules: [{ required: true }],\n      render: ({ model, field }) => {\n        return h(Input, {\n          placeholder: '请输入',\n          value: model[field],\n          onChange: (e: ChangeEvent) => {\n            model[field] = e.target.value;\n          },\n        });\n      },\n    },\n    {\n      field: 'field2',\n      component: 'Input',\n      label: 'render组件slot',\n      colProps: {\n        span: 8,\n      },\n      rules: [{ required: true }],\n      renderComponentContent: () => {\n        return {\n          suffix: () => 'suffix',\n        };\n      },\n    },\n    {\n      field: 'field3',\n      component: 'Input',\n      label: '自定义Slot',\n      slot: 'f3',\n      colProps: {\n        span: 8,\n      },\n      rules: [{ required: true }],\n    },\n  ];\n  export default defineComponent({\n    components: { BasicForm, CollapseContainer, PageWrapper, [Input.name]: Input },\n    setup() {\n      const { createMessage } = useMessage();\n      const [register, { setProps }] = useForm({\n        labelWidth: 120,\n        schemas,\n        actionColOptions: {\n          span: 24,\n        },\n      });\n      return {\n        register,\n        schemas,\n        handleSubmit: (values: any) => {\n          createMessage.success('click search,values:' + JSON.stringify(values));\n        },\n        setProps,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/form/DynamicForm.vue",
    "content": "<template>\n  <PageWrapper title=\"动态表单示例\">\n    <div class=\"mb-4\">\n      <a-button @click=\"changeLabel3\" class=\"mr-2\"> 更改字段3label </a-button>\n      <a-button @click=\"changeLabel34\" class=\"mr-2\"> 同时更改字段3,4label </a-button>\n      <a-button @click=\"appendField\" class=\"mr-2\"> 往字段3后面插入字段10 </a-button>\n      <a-button @click=\"deleteField\" class=\"mr-2\"> 删除字段11 </a-button>\n    </div>\n    <CollapseContainer title=\"动态表单示例,动态根据表单内其他值改变\">\n      <BasicForm @register=\"register\" />\n    </CollapseContainer>\n\n    <CollapseContainer class=\"mt-5\" title=\"componentProps动态改变\">\n      <BasicForm @register=\"register1\" />\n    </CollapseContainer>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';\n  import { CollapseContainer } from '/@/components/Container/index';\n  import { PageWrapper } from '/@/components/Page';\n  import { usePermission } from '/@/hooks/web/usePermission';\n  const { hasPermission } = usePermission();\n  const schemas: FormSchema[] = [\n    {\n      field: 'field5',\n      component: 'Switch',\n      label: '是否显示字段1(css控制)',\n      defaultValue: true,\n      colProps: {\n        span: 12,\n      },\n      labelWidth: 200,\n    },\n    {\n      field: 'field1',\n      component: 'Input',\n      label: '字段1',\n      colProps: {\n        span: 12,\n      },\n      show: ({ values }) => {\n        return hasPermission('test001');\n      },\n    },\n    {\n      field: 'field6',\n      component: 'Switch',\n      label: '是否显示字段2(dom控制)',\n      defaultValue: true,\n      colProps: {\n        span: 12,\n      },\n      labelWidth: 200,\n    },\n    {\n      field: 'field2',\n      component: 'Input',\n      label: '字段2',\n      colProps: {\n        span: 12,\n      },\n      ifShow: ({ values }) => {\n        return !!values.field6;\n      },\n    },\n    {\n      field: 'field7',\n      component: 'Switch',\n      label: '是否禁用字段3',\n      colProps: {\n        span: 12,\n      },\n      labelWidth: 200,\n    },\n    {\n      field: 'field3',\n      component: 'DatePicker',\n      label: '字段3',\n      colProps: {\n        span: 12,\n      },\n      dynamicDisabled: ({ values }) => {\n        return !!values.field7;\n      },\n    },\n    {\n      field: 'field8',\n      component: 'Switch',\n      label: '字段4是否必填',\n      colProps: {\n        span: 12,\n      },\n      labelWidth: 200,\n    },\n    {\n      field: 'field4',\n      component: 'Select',\n      label: '字段4',\n      colProps: {\n        span: 12,\n      },\n      dynamicRules: ({ values }) => {\n        return values.field8 ? [{ required: true, message: '字段必填' }] : [];\n      },\n      componentProps: {\n        options: [\n          {\n            label: '选项1',\n            value: '1',\n            key: '1',\n          },\n          {\n            label: '选项2',\n            value: '2',\n            key: '2',\n          },\n        ],\n      },\n    },\n    {\n      field: 'field11',\n      component: 'DatePicker',\n      label: '字段11',\n      colProps: {\n        span: 8,\n      },\n    },\n  ];\n\n  const schemas1: FormSchema[] = [\n    {\n      field: 'f1',\n      component: 'Input',\n      label: 'F1',\n      colProps: {\n        span: 12,\n      },\n      labelWidth: 200,\n      componentProps: ({ formModel }) => {\n        return {\n          placeholder: '同步f2的值为f1',\n          onChange: (e: ChangeEvent) => {\n            formModel.f2 = e.target.value;\n          },\n        };\n      },\n    },\n    {\n      field: 'f2',\n      component: 'Input',\n      label: 'F2',\n      colProps: {\n        span: 12,\n      },\n      labelWidth: 200,\n      componentProps: { disabled: true },\n    },\n    {\n      field: 'f3',\n      component: 'Input',\n      label: 'F3',\n      colProps: {\n        span: 12,\n      },\n      labelWidth: 200,\n      // @ts-ignore\n      componentProps: ({ formActionType }) => {\n        return {\n          placeholder: '值改变时执行查询,查看控制台',\n          onChange: async () => {\n            const { validate } = formActionType;\n            // tableAction只适用于在表格内开启表单的例子\n            // const { reload } = tableAction;\n            const res = await validate();\n            console.log(res);\n          },\n        };\n      },\n    },\n  ];\n\n  export default defineComponent({\n    components: { BasicForm, CollapseContainer, PageWrapper },\n    setup() {\n      const [register, { setProps, updateSchema, appendSchemaByField, removeSchemaByFiled }] = useForm({\n        labelWidth: 120,\n        schemas,\n        //禁用表单所有组件\n        disabled: true,\n        labelCol: {\n          xs: { span: 24 },\n          sm: { span: 6 },\n        },\n        wrapperCol: {\n          xs: { span: 24 },\n          sm: { span: 18 },\n        },\n        actionColOptions: {\n          span: 24,\n        },\n      });\n      const [register1] = useForm({\n        labelWidth: 120,\n        schemas: schemas1,\n        actionColOptions: {\n          span: 24,\n        },\n      });\n      function changeLabel3() {\n        updateSchema({\n          field: 'field3',\n          label: '字段3 New',\n        });\n      }\n      function changeLabel34() {\n        updateSchema([\n          {\n            field: 'field3',\n            label: '字段3 New++',\n          },\n          {\n            field: 'field4',\n            label: '字段4 New++',\n          },\n        ]);\n      }\n\n      function appendField() {\n        appendSchemaByField(\n          {\n            field: 'field10',\n            label: '字段10',\n            component: 'Input',\n            colProps: {\n              span: 8,\n            },\n          },\n          'field3'\n        );\n      }\n      function deleteField() {\n        removeSchemaByFiled('field11');\n      }\n      return {\n        register,\n        register1,\n        schemas,\n        setProps,\n        changeLabel3,\n        changeLabel34,\n        appendField,\n        deleteField,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/form/RefForm.vue",
    "content": "<template>\n  <PageWrapper title=\"Ref操作示例\">\n    <div class=\"mb-4\">\n      <a-button @click=\"setProps({ labelWidth: 150 })\" class=\"mr-2\"> 更改labelWidth </a-button>\n      <a-button @click=\"setProps({ labelWidth: 120 })\" class=\"mr-2\"> 还原labelWidth </a-button>\n      <a-button @click=\"setProps({ size: 'large' })\" class=\"mr-2\"> 更改Size </a-button>\n      <a-button @click=\"setProps({ size: 'default' })\" class=\"mr-2\"> 还原Size </a-button>\n      <a-button @click=\"setProps({ disabled: true })\" class=\"mr-2\"> 禁用表单 </a-button>\n      <a-button @click=\"setProps({ disabled: false })\" class=\"mr-2\"> 解除禁用 </a-button>\n      <a-button @click=\"setProps({ compact: true })\" class=\"mr-2\"> 紧凑表单 </a-button>\n      <a-button @click=\"setProps({ compact: false })\" class=\"mr-2\"> 还原正常间距 </a-button>\n      <a-button @click=\"setProps({ actionColOptions: { span: 8 } })\" class=\"mr-2\"> 操作按钮位置 </a-button>\n    </div>\n    <div class=\"mb-4\">\n      <a-button @click=\"setProps({ showActionButtonGroup: false })\" class=\"mr-2\"> 隐藏操作按钮 </a-button>\n      <a-button @click=\"setProps({ showActionButtonGroup: true })\" class=\"mr-2\"> 显示操作按钮 </a-button>\n      <a-button @click=\"setProps({ showResetButton: false })\" class=\"mr-2\"> 隐藏重置按钮 </a-button>\n      <a-button @click=\"setProps({ showResetButton: true })\" class=\"mr-2\"> 显示重置按钮 </a-button>\n      <a-button @click=\"setProps({ showSubmitButton: false })\" class=\"mr-2\"> 隐藏查询按钮 </a-button>\n      <a-button @click=\"setProps({ showSubmitButton: true })\" class=\"mr-2\"> 显示查询按钮 </a-button>\n      <a-button\n        @click=\"\n          setProps({\n            resetButtonOptions: {\n              disabled: true,\n              text: '重置New',\n            },\n          })\n        \"\n        class=\"mr-2\"\n      >\n        修改重置按钮\n      </a-button>\n      <a-button\n        @click=\"\n          setProps({\n            submitButtonOptions: {\n              disabled: true,\n              loading: true,\n            },\n          })\n        \"\n        class=\"mr-2\"\n      >\n        修改查询按钮\n      </a-button>\n    </div>\n    <CollapseContainer title=\"使用ref调用表单内部函数示例\">\n      <BasicForm :schemas=\"schemas\" ref=\"formElRef\" :labelWidth=\"100\" @submit=\"handleSubmit\" :actionColOptions=\"{ span: 24 }\" />\n    </CollapseContainer>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import { BasicForm, FormSchema, FormActionType, FormProps } from '/@/components/Form/index';\n  import { CollapseContainer } from '/@/components/Container/index';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { PageWrapper } from '/@/components/Page';\n\n  const schemas: FormSchema[] = [\n    {\n      field: 'field1',\n      component: 'Input',\n      label: '字段1',\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        placeholder: '自定义placeholder',\n        onChange: (e: any) => {\n          console.log(e);\n        },\n      },\n    },\n    {\n      field: 'field2',\n      component: 'Input',\n      label: '字段2',\n      colProps: {\n        span: 8,\n      },\n    },\n    {\n      field: 'field3',\n      component: 'DatePicker',\n      label: '字段3',\n      colProps: {\n        span: 8,\n      },\n    },\n    {\n      field: 'field4',\n      component: 'Select',\n      label: '字段4',\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        options: [\n          {\n            label: '选项1',\n            value: '1',\n            key: '1',\n          },\n          {\n            label: '选项2',\n            value: '2',\n            key: '2',\n          },\n        ],\n      },\n    },\n    {\n      field: 'field5',\n      component: 'CheckboxGroup',\n      label: '字段5',\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        options: [\n          {\n            label: '选项1',\n            value: '1',\n          },\n          {\n            label: '选项2',\n            value: '2',\n          },\n        ],\n      },\n    },\n    {\n      field: 'field7',\n      component: 'RadioGroup',\n      label: '字段7',\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        options: [\n          {\n            label: '选项1',\n            value: '1',\n          },\n          {\n            label: '选项2',\n            value: '2',\n          },\n        ],\n      },\n    },\n  ];\n\n  export default defineComponent({\n    components: { BasicForm, CollapseContainer, PageWrapper },\n    setup() {\n      const formElRef = ref<Nullable<FormActionType>>(null);\n      const { createMessage } = useMessage();\n      return {\n        formElRef,\n        schemas,\n        handleSubmit: (values: any) => {\n          createMessage.success('click search,values:' + JSON.stringify(values));\n        },\n        setProps(props: FormProps) {\n          const formEl = formElRef.value;\n          if (!formEl) return;\n          formEl.setProps(props);\n        },\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/form/RuleForm.vue",
    "content": "<template>\n  <PageWrapper title=\"表单校验示例\">\n    <div class=\"mb-4\">\n      <a-button @click=\"validateForm\" class=\"mr-2\"> 手动校验表单</a-button>\n      <a-button @click=\"resetValidate\" class=\"mr-2\"> 清空校验信息</a-button>\n      <a-button @click=\"getFormValues\" class=\"mr-2\"> 获取表单值</a-button>\n      <a-button @click=\"setFormValues\" class=\"mr-2\"> 设置表单值</a-button>\n      <a-button @click=\"resetFields\" class=\"mr-2\"> 重置</a-button>\n    </div>\n    <CollapseContainer title=\"表单校验\">\n      <BasicForm @register=\"register\" @submit=\"handleSubmit\" />\n    </CollapseContainer>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';\n  import { CollapseContainer } from '/@/components/Container';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { PageWrapper } from '/@/components/Page';\n  import { isAccountExist } from '/@/api/demo/system';\n\n  const schemas: FormSchema[] = [\n    {\n      field: 'field1',\n      component: 'Input',\n      label: '字段1',\n      colProps: {\n        span: 8,\n      },\n      required: true,\n    },\n    {\n      field: 'field2',\n      component: 'Input',\n      label: '字段2',\n      colProps: {\n        span: 8,\n      },\n      required: true,\n    },\n    {\n      field: 'id',\n      label: 'id',\n      required: true,\n      defaultValue: 0,\n      component: 'InputNumber',\n      show: false,\n    },\n    {\n      field: 'field3',\n      component: 'DatePicker',\n      label: '字段3',\n      colProps: {\n        span: 8,\n      },\n      required: true,\n    },\n    {\n      field: 'field33',\n      component: 'DatePicker',\n      label: '字段33',\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        valueFormat: 'YYYY-MM-DD',\n      },\n      rules: [{ required: true, type: 'string' }],\n    },\n    {\n      field: 'field44',\n      component: 'InputCountDown',\n      label: '验证码',\n      colProps: {\n        span: 8,\n      },\n      required: true,\n    },\n    {\n      field: 'field4',\n      component: 'Select',\n      label: '字段4',\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        mode: 'multiple',\n        options: [\n          {\n            label: '选项1',\n            value: '1',\n            key: '1',\n          },\n          {\n            label: '选项2',\n            value: '2',\n            key: '2',\n          },\n        ],\n      },\n      rules: [\n        {\n          required: true,\n          message: '请输入规则',\n          type: 'array',\n        },\n      ],\n    },\n    {\n      field: 'field441',\n      component: 'Input',\n      label: '自定义校验',\n      colProps: {\n        span: 8,\n      },\n      rules: [\n        {\n          required: true,\n          // @ts-ignore\n          validator: async (rule, value) => {\n            if (!value) {\n              /* eslint-disable-next-line */\n              return Promise.reject('值不能为空');\n            }\n            if (value === '1') {\n              /* eslint-disable-next-line */\n              return Promise.reject('值不能为1');\n            }\n            return Promise.resolve();\n          },\n          trigger: 'change',\n        },\n      ],\n    },\n    {\n      field: 'field5',\n      component: 'CheckboxGroup',\n      label: '字段5',\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        options: [\n          {\n            label: '选项1',\n            value: '1',\n          },\n          {\n            label: '选项2',\n            value: '2',\n          },\n        ],\n      },\n      rules: [{ required: true }],\n    },\n    {\n      field: 'field7',\n      component: 'RadioGroup',\n      label: '字段7',\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        options: [\n          {\n            label: '选项1',\n            value: '1',\n          },\n          {\n            label: '选项2',\n            value: '2',\n          },\n        ],\n      },\n      rules: [{ required: true, message: '覆盖默认生成的校验信息' }],\n    },\n    {\n      field: 'field8',\n      component: 'Input',\n      label: '后端异步验证',\n      colProps: {\n        span: 8,\n      },\n      helpMessage: ['本字段演示异步验证', '本地规则：必须填写', '后端规则：不能包含admin'],\n      rules: [\n        {\n          required: true,\n          message: '请输入数据',\n        },\n        {\n          validator(_, value) {\n            return new Promise((resolve, reject) => {\n              isAccountExist(value)\n                .then(() => resolve())\n                .catch((err) => {\n                  reject(err.message || '验证失败');\n                });\n            });\n          },\n        },\n      ],\n    },\n  ];\n\n  export default defineComponent({\n    components: { BasicForm, CollapseContainer, PageWrapper },\n    setup() {\n      const { createMessage } = useMessage();\n      const [register, { validateFields, clearValidate, getFieldsValue, resetFields, setFieldsValue }] = useForm({\n        labelWidth: 120,\n        schemas,\n        actionColOptions: {\n          span: 24,\n        },\n      });\n\n      async function validateForm() {\n        try {\n          const res = await validateFields();\n          console.log('passing', res);\n        } catch (error) {\n          console.log('not passing', error);\n        }\n      }\n\n      async function resetValidate() {\n        clearValidate();\n      }\n\n      function getFormValues() {\n        const values = getFieldsValue();\n        createMessage.success('values:' + JSON.stringify(values));\n      }\n\n      function setFormValues() {\n        setFieldsValue({\n          field1: 1111,\n          field5: ['1'],\n          field7: '1',\n          field33: '2020-12-12',\n          field3: '2020-12-12',\n        });\n      }\n\n      return {\n        register,\n        schemas,\n        handleSubmit: (values: any) => {\n          createMessage.success('click search,values:' + JSON.stringify(values));\n        },\n        getFormValues,\n        setFormValues,\n        validateForm,\n        resetValidate,\n        resetFields,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/form/UseForm.vue",
    "content": "<template>\n  <PageWrapper title=\"UseForm操作示例\">\n    <div class=\"mb-4\">\n      <a-button @click=\"setProps({ labelWidth: 150 })\" class=\"mr-2\"> 更改labelWidth </a-button>\n      <a-button @click=\"setProps({ labelWidth: 120 })\" class=\"mr-2\"> 还原labelWidth </a-button>\n      <a-button @click=\"setProps({ size: 'large' })\" class=\"mr-2\"> 更改Size </a-button>\n      <a-button @click=\"setProps({ size: 'default' })\" class=\"mr-2\"> 还原Size </a-button>\n      <a-button @click=\"setProps({ disabled: true })\" class=\"mr-2\"> 禁用表单 </a-button>\n      <a-button @click=\"setProps({ disabled: false })\" class=\"mr-2\"> 解除禁用 </a-button>\n      <a-button @click=\"setProps({ compact: true })\" class=\"mr-2\"> 紧凑表单 </a-button>\n      <a-button @click=\"setProps({ compact: false })\" class=\"mr-2\"> 还原正常间距 </a-button>\n      <a-button @click=\"setProps({ actionColOptions: { span: 8 } })\" class=\"mr-2\"> 操作按钮位置 </a-button>\n    </div>\n    <div class=\"mb-4\">\n      <a-button @click=\"setProps({ showActionButtonGroup: false })\" class=\"mr-2\"> 隐藏操作按钮 </a-button>\n      <a-button @click=\"setProps({ showActionButtonGroup: true })\" class=\"mr-2\"> 显示操作按钮 </a-button>\n      <a-button @click=\"setProps({ showResetButton: false })\" class=\"mr-2\"> 隐藏重置按钮 </a-button>\n      <a-button @click=\"setProps({ showResetButton: true })\" class=\"mr-2\"> 显示重置按钮 </a-button>\n      <a-button @click=\"setProps({ showSubmitButton: false })\" class=\"mr-2\"> 隐藏查询按钮 </a-button>\n      <a-button @click=\"setProps({ showSubmitButton: true })\" class=\"mr-2\"> 显示查询按钮 </a-button>\n      <a-button\n        @click=\"\n          setProps({\n            resetButtonOptions: {\n              disabled: true,\n              text: '重置New',\n            },\n          })\n        \"\n        class=\"mr-2\"\n      >\n        修改重置按钮\n      </a-button>\n      <a-button\n        @click=\"\n          setProps({\n            submitButtonOptions: {\n              disabled: true,\n              loading: true,\n            },\n          })\n        \"\n        class=\"mr-2\"\n      >\n        修改查询按钮\n      </a-button>\n    </div>\n    <CollapseContainer title=\"useForm示例\">\n      <BasicForm @register=\"register\" @submit=\"handleSubmit\" />\n    </CollapseContainer>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';\n  import { CollapseContainer } from '/@/components/Container/index';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { PageWrapper } from '/@/components/Page';\n\n  const schemas: FormSchema[] = [\n    {\n      field: 'field1',\n      component: 'Input',\n      label: '字段1',\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        placeholder: '自定义placeholder',\n        onChange: (e: any) => {\n          console.log(e);\n        },\n      },\n    },\n    {\n      field: 'field2',\n      component: 'Input',\n      label: '字段2',\n      colProps: {\n        span: 8,\n      },\n    },\n    {\n      field: 'field3',\n      component: 'DatePicker',\n      label: '字段3',\n      colProps: {\n        span: 8,\n      },\n    },\n    {\n      field: 'fieldTime',\n      component: 'RangePicker',\n      label: '时间字段',\n      defaultValue: [new Date(\"2024-03-21\"), new Date(\"2024-03-27\")],\n      componentProps: {\n        valueType: 'Date',\n      },\n      colProps: {\n        span: 8,\n      },\n    },\n    {\n      field: 'field4',\n      component: 'Select',\n      label: '字段4',\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        options: [\n          {\n            label: '选项1',\n            value: '1',\n            key: '1',\n          },\n          {\n            label: '选项2',\n            value: '2',\n            key: '2',\n          },\n        ],\n      },\n    },\n    {\n      field: 'field5',\n      component: 'CheckboxGroup',\n      label: '字段5',\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        options: [\n          {\n            label: '选项1',\n            value: '1',\n          },\n          {\n            label: '选项2',\n            value: '2',\n          },\n        ],\n      },\n    },\n    {\n      field: 'field7',\n      component: 'RadioGroup',\n      label: '字段7',\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        options: [\n          {\n            label: '选项1',\n            value: '1',\n          },\n          {\n            label: '选项2',\n            value: '2',\n          },\n        ],\n      },\n    },\n  ];\n\n  export default defineComponent({\n    components: { BasicForm, CollapseContainer, PageWrapper },\n    setup() {\n      const { createMessage } = useMessage();\n\n      const [register, { setProps }] = useForm({\n        labelWidth: 120,\n        schemas,\n        actionColOptions: {\n          span: 24,\n        },\n        fieldMapToTime: [['fieldTime', ['startTime', 'endTime'], 'YYYY-MM']],\n      });\n      return {\n        register,\n        schemas,\n        handleSubmit: (values: Recordable) => {\n          createMessage.success('click search,values:' + JSON.stringify(values));\n        },\n        setProps,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/form/index.vue",
    "content": "<template>\n  <PageWrapper title=\"表单基础示例\" contentFullHeight>\n    <CollapseContainer title=\"基础示例\">\n      <BasicForm\n        autoFocusFirstItem\n        :labelWidth=\"200\"\n        :schemas=\"schemas\"\n        :actionColOptions=\"{ span: 24 }\"\n        :labelCol=\"{ span: 8 }\"\n        @submit=\"handleSubmit\"\n        @reset=\"handleReset\"\n      >\n        <template #jAreaLinkage=\"{ model, field }\">\n          <JAreaLinkage v-model:value=\"model[field]\" :showArea=\"true\" :showAll=\"false\" />\n        </template>\n        <template #localSearch=\"{ model, field }\">\n          <ApiSelect\n            :api=\"optionsListApi\"\n            showSearch\n            v-model:value=\"model[field]\"\n            optionFilterProp=\"label\"\n            resultField=\"list\"\n            labelField=\"name\"\n            valueField=\"id\"\n          />\n        </template>\n        <template #selectA=\"{ model, field }\">\n          <a-select :options=\"optionsA\" mode=\"multiple\" v-model:value=\"model[field]\" @change=\"valueSelectA = model[field]\" allowClear />\n        </template>\n        <template #selectB=\"{ model, field }\">\n          <a-select :options=\"optionsB\" mode=\"multiple\" v-model:value=\"model[field]\" @change=\"valueSelectB = model[field]\" allowClear />\n        </template>\n        <template #remoteSearch=\"{ model, field }\">\n          <ApiSelect\n            :api=\"optionsListApi\"\n            showSearch\n            v-model:value=\"model[field]\"\n            :filterOption=\"false\"\n            resultField=\"list\"\n            labelField=\"name\"\n            valueField=\"id\"\n            @search=\"onSearch\"\n            :params=\"searchParams\"\n          />\n        </template>\n      </BasicForm>\n    </CollapseContainer>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { computed, defineComponent, unref, ref } from 'vue';\n  import { BasicForm, FormSchema, ApiSelect, JAreaLinkage } from '/@/components/Form/index';\n  import { CollapseContainer } from '/@/components/Container';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { PageWrapper } from '/@/components/Page';\n\n  import { optionsListApi } from '/@/api/demo/select';\n  import { useDebounceFn } from '@vueuse/core';\n  import { treeOptionsListApi } from '/@/api/demo/tree';\n  import { Select } from 'ant-design-vue';\n  import { cloneDeep } from 'lodash-es';\n\n  const valueSelectA = ref<string[]>([]);\n  const valueSelectB = ref<string[]>([]);\n  const options = ref<Recordable[]>([]);\n  for (let i = 1; i < 10; i++) options.value.push({ label: '选项' + i, value: `${i}` });\n\n  const optionsA = computed(() => {\n    return cloneDeep(unref(options)).map((op) => {\n      op.disabled = unref(valueSelectB).indexOf(op.value) !== -1;\n      return op;\n    });\n  });\n  const optionsB = computed(() => {\n    return cloneDeep(unref(options)).map((op) => {\n      op.disabled = unref(valueSelectA).indexOf(op.value) !== -1;\n      return op;\n    });\n  });\n  const provincesOptions = [\n    {\n      id: 'guangdong',\n      label: '广东省',\n      value: '1',\n      key: '1',\n    },\n    {\n      id: 'jiangsu',\n      label: '江苏省',\n      value: '2',\n      key: '2',\n    },\n  ];\n  const citiesOptionsData = {\n    guangdong: [\n      {\n        label: '珠海市',\n        value: '1',\n        key: '1',\n      },\n      {\n        label: '深圳市',\n        value: '2',\n        key: '2',\n      },\n      {\n        label: '广州市',\n        value: '3',\n        key: '3',\n      },\n    ],\n    jiangsu: [\n      {\n        label: '南京市',\n        value: '1',\n        key: '1',\n      },\n      {\n        label: '无锡市',\n        value: '2',\n        key: '2',\n      },\n      {\n        label: '苏州市',\n        value: '3',\n        key: '3',\n      },\n    ],\n  };\n\n  const schemas: FormSchema[] = [\n    {\n      field: 'divider-basic',\n      component: 'Divider',\n      label: '基础字段',\n    },\n    {\n      field: 'field1',\n      component: 'Input',\n      label: '字段1',\n\n      colProps: {\n        span: 8,\n      },\n      // componentProps:{},\n      // can func\n      componentProps: ({ schema, formModel }) => {\n        console.log('form:', schema);\n        console.log('formModel:', formModel);\n        return {\n          placeholder: '自定义placeholder',\n          onChange: (e: any) => {\n            console.log(e);\n          },\n        };\n      },\n      renderComponentContent: () => {\n        return {\n          prefix: () => 'pSlot',\n          suffix: () => 'sSlot',\n        };\n      },\n    },\n    {\n      field: 'field2',\n      component: 'Input',\n      label: '字段2',\n      defaultValue: '111',\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        onChange: (e: any) => {\n          console.log(e);\n        },\n      },\n      suffix: '天',\n    },\n    {\n      field: 'field3',\n      component: 'DatePicker',\n      label: '字段3',\n      colProps: {\n        span: 8,\n      },\n    },\n    {\n      field: 'field4',\n      component: 'Select',\n      label: '字段4',\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        options: [\n          {\n            label: '选项1',\n            value: '1',\n            key: '1',\n          },\n          {\n            label: '选项2',\n            value: '2',\n            key: '2',\n          },\n        ],\n      },\n    },\n    {\n      field: 'field5',\n      component: 'CheckboxGroup',\n      label: '字段5',\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        options: [\n          {\n            label: '选项1',\n            value: '1',\n          },\n          {\n            label: '选项2',\n            value: '2',\n          },\n        ],\n      },\n    },\n    {\n      field: 'field7',\n      component: 'RadioGroup',\n      label: '字段7',\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        options: [\n          {\n            label: '选项1',\n            value: '1',\n          },\n          {\n            label: '选项2',\n            value: '2',\n          },\n        ],\n      },\n    },\n    {\n      field: 'field8',\n      component: 'Checkbox',\n      label: '字段8',\n      colProps: {\n        span: 8,\n      },\n      renderComponentContent: 'Check',\n    },\n    {\n      field: 'field9',\n      component: 'Switch',\n      label: '字段9',\n      colProps: {\n        span: 8,\n      },\n    },\n    {\n      field: 'field10',\n      component: 'RadioButtonGroup',\n      label: '字段10',\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        options: [\n          {\n            label: '选项1',\n            value: '1',\n          },\n          {\n            label: '选项2',\n            value: '2',\n          },\n        ],\n      },\n    },\n    {\n      field: 'field11',\n      component: 'Cascader',\n      label: '字段11',\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        options: [\n          {\n            value: 'zhejiang',\n            label: 'Zhejiang',\n            children: [\n              {\n                value: 'hangzhou',\n                label: 'Hangzhou',\n                children: [\n                  {\n                    value: 'xihu',\n                    label: 'West Lake',\n                  },\n                ],\n              },\n            ],\n          },\n          {\n            value: 'jiangsu',\n            label: 'Jiangsu',\n            children: [\n              {\n                value: 'nanjing',\n                label: 'Nanjing',\n                children: [\n                  {\n                    value: 'zhonghuamen',\n                    label: 'Zhong Hua Men',\n                  },\n                ],\n              },\n            ],\n          },\n        ],\n      },\n    },\n    {\n      field: 'divider-api-select',\n      component: 'Divider',\n      label: '远程下拉演示',\n    },\n    {\n      field: 'field30',\n      component: 'ApiSelect',\n      label: '懒加载远程下拉',\n      required: true,\n      componentProps: {\n        // more details see /src/components/Form/src/components/ApiSelect.vue\n        api: optionsListApi,\n        params: {\n          id: 1,\n        },\n        resultField: 'list',\n        // use name as label\n        labelField: 'name',\n        // use id as value\n        valueField: 'id',\n        // not request untill to select\n        immediate: false,\n        onChange: (e) => {\n          console.log('selected:', e);\n        },\n        // atfer request callback\n        onOptionsChange: (options) => {\n          console.log('get options', options.length, options);\n        },\n      },\n      colProps: {\n        span: 8,\n      },\n      defaultValue: '0',\n    },\n    {\n      field: 'field311',\n      component: 'JAreaLinkage',\n      label: '省市区选择',\n      helpMessage: ['JAreaLinkage组件', '省市区选择'],\n      required: true,\n      slot: 'jAreaLinkage',\n      colProps: {\n        span: 8,\n      },\n      defaultValue: ['130000', '130200'],\n    },\n    {\n      field: 'field31',\n      component: 'Input',\n      label: '下拉本地搜索',\n      helpMessage: ['ApiSelect组件', '远程数据源本地搜索', '只发起一次请求获取所有选项'],\n      required: true,\n      slot: 'localSearch',\n      colProps: {\n        span: 8,\n      },\n      defaultValue: '0',\n    },\n    {\n      field: 'field32',\n      component: 'Input',\n      label: '下拉远程搜索',\n      helpMessage: ['ApiSelect组件', '将关键词发送到接口进行远程搜索'],\n      required: true,\n      slot: 'remoteSearch',\n      colProps: {\n        span: 8,\n      },\n      defaultValue: '0',\n    },\n    {\n      field: 'field33',\n      component: 'ApiTreeSelect',\n      label: '远程下拉树',\n      helpMessage: ['ApiTreeSelect组件', '使用接口提供的数据生成选项'],\n      required: true,\n      componentProps: {\n        api: treeOptionsListApi,\n        resultField: 'list',\n      },\n      colProps: {\n        span: 8,\n      },\n    },\n    {\n      field: 'field34',\n      component: 'ApiRadioGroup',\n      label: '远程Radio',\n      helpMessage: ['ApiRadioGroup组件', '使用接口提供的数据生成选项'],\n      required: true,\n      componentProps: {\n        api: optionsListApi,\n        params: {\n          count: 2,\n        },\n        resultField: 'list',\n        // use name as label\n        labelField: 'name',\n        // use id as value\n        valueField: 'id',\n      },\n      defaultValue: '1',\n      colProps: {\n        span: 8,\n      },\n    },\n    {\n      field: 'field35',\n      component: 'ApiRadioGroup',\n      label: '远程Radio',\n      helpMessage: ['ApiRadioGroup组件', '使用接口提供的数据生成选项'],\n      required: true,\n      componentProps: {\n        api: optionsListApi,\n        params: {\n          count: 2,\n        },\n        resultField: 'list',\n        // use name as label\n        labelField: 'name',\n        // use id as value\n        valueField: 'id',\n        isBtn: true,\n      },\n      colProps: {\n        span: 8,\n      },\n    },\n    {\n      field: 'divider-linked',\n      component: 'Divider',\n      label: '字段联动',\n    },\n    {\n      field: 'province',\n      component: 'Select',\n      label: '省份',\n      colProps: {\n        span: 8,\n      },\n      componentProps: ({ formModel, formActionType }) => {\n        return {\n          options: provincesOptions,\n          placeholder: '省份与城市联动',\n          onChange: (e: any) => {\n            // console.log(e)\n            let citiesOptions = e == 1 ? citiesOptionsData[provincesOptions[0].id] : citiesOptionsData[provincesOptions[1].id];\n            // console.log(citiesOptions)\n            if (e === undefined) {\n              citiesOptions = [];\n            }\n            formModel.city = undefined; //  reset city value\n            const { updateSchema } = formActionType;\n            updateSchema({\n              field: 'city',\n              componentProps: {\n                options: citiesOptions,\n              },\n            });\n          },\n        };\n      },\n    },\n    {\n      field: 'city',\n      component: 'Select',\n      label: '城市',\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        options: [], // defalut []\n        placeholder: '省份与城市联动',\n      },\n    },\n    {\n      field: 'divider-selects',\n      component: 'Divider',\n      label: '互斥多选',\n      helpMessage: ['两个Select共用数据源', '但不可选择对方已选中的项目'],\n    },\n    {\n      field: 'selectA',\n      component: 'Select',\n      label: '互斥SelectA',\n      slot: 'selectA',\n      defaultValue: [],\n      colProps: {\n        span: 8,\n      },\n    },\n    {\n      field: 'selectB',\n      component: 'Select',\n      label: '互斥SelectB',\n      slot: 'selectB',\n      defaultValue: [],\n      colProps: {\n        span: 8,\n      },\n    },\n    {\n      field: 'divider-others',\n      component: 'Divider',\n      label: '其它',\n    },\n    {\n      field: 'field20',\n      component: 'InputNumber',\n      label: '字段20',\n      required: true,\n      colProps: {\n        span: 8,\n      },\n    },\n    {\n      field: 'field21',\n      component: 'Slider',\n      label: '字段21',\n      componentProps: {\n        min: 0,\n        max: 100,\n        range: true,\n        marks: {\n          20: '20°C',\n          60: '60°C',\n        },\n      },\n      colProps: {\n        span: 8,\n      },\n    },\n    {\n      field: 'field22',\n      component: 'Rate',\n      label: '字段22',\n      defaultValue: 3,\n      colProps: {\n        span: 8,\n      },\n      componentProps: {\n        disabled: false,\n        allowHalf: true,\n      },\n    },\n  ];\n\n  export default defineComponent({\n    components: {\n      BasicForm,\n      CollapseContainer,\n      PageWrapper,\n      ApiSelect,\n      JAreaLinkage,\n      ASelect: Select,\n    },\n    setup() {\n      const check = ref(null);\n      const { createMessage } = useMessage();\n      const keyword = ref<string>('');\n      const searchParams = computed<Recordable>(() => {\n        return { keyword: unref(keyword) };\n      });\n\n      function onSearch(value: string) {\n        keyword.value = value;\n      }\n      function areaChange(value) {\n        alert(value);\n      }\n\n      return {\n        schemas,\n        optionsListApi,\n        optionsA,\n        optionsB,\n        valueSelectA,\n        valueSelectB,\n        onSearch: useDebounceFn(onSearch, 300),\n        searchParams,\n        handleReset: () => {\n          keyword.value = '';\n        },\n        handleSubmit: (values: any) => {\n          createMessage.success('click search,values:' + JSON.stringify(values));\n        },\n        check,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/AsyncTreeTable.vue",
    "content": "<template>\n  <PageWrapper>\n    <a-card :bordered=\"false\">\n      <BasicTable :loading=\"loading\" :dataSource=\"dataSource\" @register=\"registerTable\" @expand=\"onExpand\" />\n    </a-card>\n  </PageWrapper>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { PageWrapper } from '/@/components/Page';\n  import { BasicTable, useTable } from '/@/components/Table';\n\n  const url = '/mock/api/asynTreeList';\n\n  const loading = ref<boolean>(false);\n  const dataSource = ref<any[]>([]);\n  const [registerTable, { setLoading }] = useTable({\n    rowKey: 'id',\n    bordered: true,\n    canResize: false,\n    // 树表格\n    isTreeTable: true,\n    showIndexColumn: true,\n    columns: [\n      { title: '名称', dataIndex: 'name' },\n      { title: '组件', dataIndex: 'component' },\n      { title: '排序', dataIndex: 'orderNum' },\n    ],\n  });\n\n  async function loadData(params) {\n    loading.value = true;\n    let result = await defHttp.get({ url, params });\n    loading.value = false;\n    return result.map((item) => {\n      if (item.hasChildren) {\n        return { ...item, children: [] };\n      } else {\n        return item;\n      }\n    });\n  }\n\n  async function loadRootData() {\n    dataSource.value = await loadData({ id: '0' });\n  }\n\n  loadRootData();\n\n  async function onExpand(isExpand, rowData) {\n    if (isExpand && rowData.hasChildren && rowData.children.length === 0) {\n      rowData.children = await loadData({ id: rowData.id });\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/ImgDragSort.vue",
    "content": "<template>\n  <div>\n    <draggable @end=\"end\" v-model=\"dataArr\" item-key=\"id\" style=\"display: flex\">\n      <template #item=\"{ element }\">\n        <div class=\"imgDiv\">\n          <img :src=\"element.filePath\" preview=\"index\" />\n        </div>\n      </template>\n      <template #footer>\n        <a-button @click=\"sureChange\" type=\"primary\" style=\"margin-top: 100px\">确定</a-button>\n      </template>\n    </draggable>\n    <a-divider>json数据</a-divider>\n    <a-row>\n      <a-col :span=\"12\">\n        <p>拖拽前：</p>\n        <textarea rows=\"25\" style=\"width: 780px\">{{ oldDateSource }}</textarea>\n      </a-col>\n      <a-col :span=\"12\">\n        <p>拖拽后：</p>\n        <textarea rows=\"25\" style=\"width: 780px\">{{ newDateSource }}</textarea>\n      </a-col>\n    </a-row>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import draggable from 'vuedraggable';\n  import { defineComponent, ref, unref } from 'vue';\n\n  const mockData = [\n    { id: '000', sort: 0, filePath: 'https://static.jeecg.com/upload/test/1_1588149743473.jpg' },\n    { id: '111', sort: 1, filePath: 'https://static.jeecg.com/upload/test/u27356337152749454924fm27gp0_1588149731821.jpg' },\n    { id: '222', sort: 2, filePath: 'https://static.jeecg.com/upload/test/u24454681402491956848fm27gp0_1588149712663.jpg' },\n    { id: '333', sort: 3, filePath: 'https://static.jeecg.com/temp/国炬软件logo_1606575029126.png' },\n    { id: '444', sort: 4, filePath: 'https://static.jeecg.com/upload/test/u8891206113801177793fm27gp0_1588149704459.jpg' },\n  ];\n\n  //数据集\n  const dataArr = ref(mockData);\n  //原始数据\n  const oldDateSource = ref(mockData);\n  //更改后的数据\n  const newDateSource = ref([]);\n\n  /**\n   * 拖动结束事件\n   * @param evt\n   */\n  function end(evt) {\n    console.log('拖动前的位置' + evt.oldIndex);\n    console.log('拖动后的位置' + evt.newIndex);\n  }\n\n  /**\n   * 确认更改事件\n   * @param evt\n   */\n  function sureChange() {\n    for (let i = 0; i < unref(dataArr).length; i++) {\n      dataArr.value[i].sort = i;\n    }\n    newDateSource.value = unref(dataArr);\n  }\n</script>\n\n<style scoped lang=\"less\">\n  .imgDiv {\n    padding: 8px;\n    border: 1px solid #d9d9d9;\n    border-radius: 4px;\n    margin: 0 8px 8px 0;\n\n    img {\n      width: 120px;\n      height: 120px;\n      object-fit: cover;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/ImgTurnPage.vue",
    "content": "<template>\n  <div style=\"min-width: 800px\">\n    <a-row>\n      <!-- 左侧文件树 -->\n      <a-col :span=\"6\">\n        <a-tree\n          showLine\n          :treeData=\"treeData\"\n          :expandedKeys=\"[expandedKeys[0]]\"\n          :selectedKeys=\"selectedKeys\"\n          :style=\"{ height: '500px', 'border-right': '2px solid #c1c1c1', 'overflow-y': 'auto' }\"\n          @expand=\"onExpand\"\n          @select=\"onSelect\"\n        ></a-tree>\n      </a-col>\n\n      <!--右侧缩略图-->\n      <a-col :span=\"18\">\n        <a-row style=\"margin-top: 10px; padding-left: 2%\">\n          <a-col :span=\"24\" style=\"margin-bottom: 10px\">\n            <a-button @click=\"prev\" preIcon=\"ant-design:left-outlined\" type=\"primary\">上一页</a-button>\n            <a-button @click=\"next\" preIcon=\"ant-design:right-outlined\" style=\"margin-left: 8px\" type=\"primary\">下一页</a-button>\n            <span style=\"margin-left: 100px; font-weight: bolder\">{{ navName }}</span>\n          </a-col>\n          <a-col :span=\"24\">\n            <img :src=\"imgUrl\" preview />\n          </a-col>\n        </a-row>\n      </a-col>\n    </a-row>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, unref, onMounted } from 'vue';\n  //mock数据\n  const mockdata = [\n    {\n      title: '第一页',\n      key: '0-0',\n      children: [\n        {\n          title: '1页',\n          key: '0-0-0',\n          imgUrl: 'https://static.jeecg.com/upload/test/1_1588149743473.jpg',\n        },\n        {\n          title: '2页',\n          key: '0-0-1',\n          imgUrl: 'https://static.jeecg.com/upload/test/u27356337152749454924fm27gp0_1588149731821.jpg',\n        },\n      ],\n    },\n    {\n      title: '第二页',\n      key: '0-1',\n      children: [\n        {\n          title: '1页',\n          key: '0-1-0',\n          imgUrl: 'https://static.jeecg.com/upload/test/u24454681402491956848fm27gp0_1588149712663.jpg',\n        },\n        {\n          title: '2页',\n          key: '0-1-1',\n          imgUrl: 'https://static.jeecg.com/upload/test/u8891206113801177793fm27gp0_1588149704459.jpg',\n        },\n      ],\n    },\n    {\n      title: '第三页',\n      key: '0-2',\n      children: [\n        {\n          title: '1页',\n          key: '0-2-0',\n          imgUrl: 'https://static.jeecg.com/upload/test/1374962_1587621329085.jpg',\n        },\n      ],\n    },\n  ];\n  /**\n   * 左侧树形数据\n   */\n  const treeData = ref(mockdata);\n  //选中的key\n  const selectedKeys = ref([]);\n  //展开的key\n  const expandedKeys = ref([]);\n  const sort = ref(0);\n  //图片链接\n  const imgUrl = ref('');\n  //页码标题\n  const navName = ref('');\n  //图片集合\n  const imgList = ref([]);\n\n  onMounted(getImgList);\n\n  /**\n   * 加载图片集合\n   */\n  function getImgList() {\n    var count = 0;\n    for (var i = 0; i < unref(treeData).length; i++) {\n      for (var j = 0; j < unref(treeData)[i].children.length; j++) {\n        imgList.value.push({\n          key: unref(treeData)[i].children[j].key,\n          pkey: unref(treeData)[i].key,\n          sort: count++,\n          imgUrl: unref(treeData)[i].children[j].imgUrl,\n          navName: unref(treeData)[i].title + '/' + unref(treeData)[i].children[j].title,\n        });\n      }\n    }\n    setValue(imgList.value[unref(sort)]);\n  }\n  /**\n   * 节点选中事件\n   */\n  function onSelect(selectedKeys, info) {\n    for (var i = 0; i < unref(imgList).length; i++) {\n      if (unref(imgList)[i].key === selectedKeys[0]) {\n        sort.value = unref(imgList)[i].sort;\n        setValue(unref(imgList)[i]);\n        break;\n      }\n    }\n  }\n  /**\n   * 节点展开事件\n   */\n  function onExpand(expandedKey) {\n    expandedKeys.value = [];\n    if (expandedKey !== null && expandedKey !== '') {\n      expandedKeys.value[0] = expandedKey[1];\n    }\n  }\n  /**\n   * 上一页\n   */\n  function prev() {\n    if (unref(sort) === 0) {\n      sort.value = unref(imgList).length - 1;\n    } else {\n      sort.value = sort.value - 1;\n    }\n    setValue(unref(imgList)[unref(sort)]);\n  }\n  /**\n   * 下一页\n   */\n  function next() {\n    if (unref(sort) === unref(imgList).length - 1) {\n      sort.value = 0;\n    } else {\n      sort.value = unref(sort) + 1;\n    }\n    setValue(unref(imgList)[unref(sort)]);\n  }\n\n  // 设置受控节点值\n  function setValue(value) {\n    selectedKeys.value = [];\n    imgUrl.value = value.imgUrl;\n    selectedKeys.value[0] = value.key;\n    expandedKeys.value[0] = value.pkey;\n    navName.value = value.navName;\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/InnerExpandTable.vue",
    "content": "<template>\n  <a-card :bordered=\"false\">\n    <BasicTable @register=\"registerTable\" :expandedRowKeys=\"expandedRowKeys\" :rowSelection=\"rowSelection\" @expand=\"handleExpand\">\n      <template #tableTitle>\n        <a-button type=\"primary\" @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\"> 新增</a-button>\n      </template>\n      <template #expandedRowRender>\n        <BasicTable bordered size=\"middle\" rowKey=\"id\" :canResize=\"false\" :columns=\"innerColumns\" :dataSource=\"innerData\" :pagination=\"false\">\n        </BasicTable>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n    </BasicTable>\n    <JVxeTableModal @register=\"registerModal\" @success=\"reload()\"></JVxeTableModal>\n  </a-card>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import JVxeTableModal from '/@/views/demo/vextable/jvxetable/JVxeTableModal.vue';\n  //接口url\n  const url = {\n    list: '/test/order/orderList',\n    delete: '/test/order/delete',\n    deleteBatch: '/test/order/deleteBatch',\n    customerListByMainId: '/test/order/listOrderCustomerByMainId',\n  };\n  // 展开key\n  const expandedRowKeys = ref<any[]>([]);\n  // 选择key\n  const checkedKeys = ref<any[]>([]);\n  // 子表数据\n  const innerData = ref<any[]>([]);\n  // 主表表头\n  const columns = [\n    {\n      title: '订单号',\n      align: 'center',\n      dataIndex: 'orderCode',\n      width: 100,\n    },\n    {\n      title: '订单类型',\n      align: 'center',\n      dataIndex: 'ctype',\n      width: 100,\n      customRender: ({ text }) => {\n        let re = '';\n        if (text === '1') {\n          re = '国内订单';\n        } else if (text === '2') {\n          re = '国际订单';\n        }\n        return re;\n      },\n    },\n    {\n      title: '订单日期',\n      align: 'center',\n      width: 100,\n      dataIndex: 'orderDate',\n    },\n    {\n      title: '订单金额',\n      align: 'center',\n      dataIndex: 'orderMoney',\n      width: 100,\n    },\n    {\n      title: '订单备注',\n      align: 'center',\n      dataIndex: 'content',\n      width: 100,\n    },\n  ];\n  // 子表表头\n  const innerColumns = [\n    {\n      title: '客户名',\n      align: 'center',\n      width: 100,\n      dataIndex: 'name',\n      key: 'name',\n    },\n    {\n      title: '性别',\n      align: 'center',\n      dataIndex: 'sex',\n      customRender: function (text) {\n        //console.log(typeof  text )\n        //console.log(text)\n        if (text.value == '1') {\n          return '男';\n        } else if (text.value == '2') {\n          return '女';\n        } else {\n          return text;\n        }\n      },\n    },\n    {\n      title: '身份证号码',\n      align: 'center',\n      dataIndex: 'idcard',\n    },\n    {\n      title: '电话',\n      dataIndex: 'telphone',\n      align: 'center',\n    },\n  ];\n  const list = (params) => defHttp.get({ url: url.list, params });\n  const [registerModal, { openModal }] = useModal();\n  const [registerTable, { reload }] = useTable({\n    columns,\n    api: list,\n    rowKey: 'id',\n    striped: true,\n    useSearchForm: false,\n    showTableSetting: true,\n    clickToRowSelect: false,\n    bordered: true,\n    actionColumn: {\n      width: 110,\n      title: '操作',\n      dataIndex: 'action',\n      slots: { customRender: 'action' },\n      fixed: undefined,\n    },\n  });\n\n  /**\n   * 选择列配置\n   */\n  const rowSelection = {\n    type: 'checkbox',\n    columnWidth: 30,\n    selectedRowKeys: checkedKeys,\n    onChange: onSelectChange,\n  };\n\n  /**\n   * 选择事件\n   */\n  function onSelectChange(selectedRowKeys: (string | number)[]) {\n    checkedKeys.value = selectedRowKeys;\n  }\n  /**\n   * 展开事件\n   * */\n  function handleExpand(expanded, record) {\n    expandedRowKeys.value = [];\n    innerData.value = [];\n    if (expanded === true) {\n      expandedRowKeys.value.push(record.id);\n      defHttp.get({ url: url.customerListByMainId, params: { orderId: record.id } }, { isTransformResponse: false }).then((res) => {\n        if (res.success) {\n          innerData.value = res.result.records;\n        }\n      });\n    }\n  }\n  /**\n   * 新增事件\n   */\n  function handleAdd() {\n    openModal(true, {\n      isUpdate: false,\n    });\n  }\n  /**\n   * 编辑事件\n   */\n  function handleEdit(record) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n  /**\n   * 删除事件\n   */\n  function handleDelete(record) {\n    defHttp.delete({ url: url.delete, data: { id: record.id } }, { joinParamsToUrl: true }).then(() => {\n      reload();\n    });\n  }\n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n</script>\n<style scoped>\n  .ant-card-body .table-operator {\n    margin-bottom: 18px;\n  }\n\n  .ant-table-tbody .ant-table-row td {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n\n  .anty-row-operator button {\n    margin: 0 5px;\n  }\n\n  .ant-btn-danger {\n    background-color: #ffffff;\n  }\n\n  .ant-modal-cust-warp {\n    height: 100%;\n  }\n\n  .ant-modal-cust-warp .ant-modal-body {\n    height: calc(100% - 110px) !important;\n    overflow-y: auto;\n  }\n\n  .ant-modal-cust-warp .ant-modal-content {\n    height: 90% !important;\n    overflow-y: hidden;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JCodeEditDemo.vue",
    "content": "<template>\n  <BasicForm\n    :labelWidth=\"200\"\n    :schemas=\"schemas\"\n    :showResetButton=\"false\"\n    :showSubmitButton=\"false\"\n    :actionColOptions=\"{ span: 24 }\"\n    @submit=\"handleSubmit\"\n    @reset=\"handleReset\"\n    style=\"height: 800px\"\n  >\n    <template #jCodeEdit=\"{ model, field }\">\n      <JCodeEditor v-model:value=\"model[field]\" mode=\"js\" height=\"300px\" :fullScreen=\"true\" />\n    </template>\n  </BasicForm>\n</template>\n<script lang=\"ts\">\n  import { computed, defineComponent, unref, ref } from 'vue';\n  import { BasicForm, FormSchema, JCodeEditor } from '/@/components/Form';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { optionsListApi } from '/@/api/demo/select';\n  import { useDebounceFn } from '@vueuse/core';\n\n  const schemas: FormSchema[] = [\n    {\n      field: 'field1',\n      component: 'JCodeEditor',\n      label: '代码编辑器',\n      required: true,\n      slot: 'jCodeEdit',\n      colProps: {\n        span: 15,\n      },\n      defaultValue: 'Hello JeecgBoot',\n    },\n  ];\n\n  export default defineComponent({\n    components: { BasicForm, JCodeEditor },\n    setup() {\n      const check = ref(null);\n      const { createMessage } = useMessage();\n      const keyword = ref<string>('');\n      const searchParams = computed<Recordable>(() => {\n        return { keyword: unref(keyword) };\n      });\n\n      function onSearch(value: string) {\n        keyword.value = value;\n      }\n\n      return {\n        schemas,\n        optionsListApi,\n        onSearch: useDebounceFn(onSearch, 300),\n        searchParams,\n        handleReset: () => {\n          keyword.value = '';\n        },\n        handleSubmit: (values: any) => {\n          createMessage.success('click search,values:' + JSON.stringify(values));\n        },\n        check,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JEditorDemo.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <div class=\"p-4 bg-white\">\n      <a-button-group class=\"j-table-operator\">\n        <a-button type=\"primary\" @click=\"setDis(0)\">启用</a-button>\n        <a-button type=\"primary\" @click=\"setDis(1)\">禁用</a-button>\n        <a-button type=\"primary\" @click=\"getValues()\">校验表单并获取值</a-button>\n        <a-button type=\"primary\" @click=\"setValues()\">设置值</a-button>\n      </a-button-group>\n\n      <BasicForm @register=\"register\" @submit=\"handleSubmit\" />\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  export default {\n    title: '富文本 | Markdown',\n    name: 'MarkdownDemo',\n  };\n</script>\n\n<script lang=\"ts\" setup>\n  import { FormSchema, useForm, BasicForm } from '/@/components/Form';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  const { createMessage, createSuccessModal } = useMessage();\n\n  const schemas: FormSchema[] = [\n    {\n      field: 'name',\n      component: 'Input',\n      label: '姓名',\n      required: true,\n      defaultValue: 'zhangsan',\n    },\n    {\n      field: 'tinymce',\n      component: 'JEditor',\n      label: '富文本',\n      defaultValue: 'defaultValue',\n      required: true,\n    },\n    {\n      field: 'markdown',\n      component: 'JMarkdownEditor',\n      label: 'Markdown',\n      defaultValue: '# 张三',\n      required: true,\n      componentProps: {\n        height: 300,\n      },\n    },\n  ];\n\n  const [register, { setProps, validate, setFieldsValue }] = useForm({\n    labelWidth: 120,\n    schemas: schemas,\n    actionColOptions: {\n      span: 24,\n    },\n    compact: true,\n    showResetButton: false,\n    showSubmitButton: false,\n    showAdvancedButton: false,\n    disabled: false,\n  });\n\n  function handleSubmit(values) {\n    console.log(values);\n  }\n\n  function setDis(flag) {\n    setProps({ disabled: !!flag });\n  }\n\n  async function getValues() {\n    try {\n      const values = await validate();\n      console.log(values);\n      createSuccessModal({\n        title: '校验通过',\n        content: `${JSON.stringify(values)}`,\n      });\n    } catch (error) {\n      createMessage.warning('检验不通过');\n    }\n  }\n\n  function setValues() {\n    setFieldsValue({\n      name: 'LiSi',\n      markdown: '# 李四',\n      tinymce: '<p><strong><span style=\"font-size: 18pt;\">张<span style=\"color: #e03e2d;\">三</span>丰</span></strong></p>',\n    });\n  }\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JUploadDemo.vue",
    "content": "<template>\n  <a-button-group class=\"j-table-operator\">\n    <a-button type=\"primary\" @click=\"setDisabled(0)\">启用</a-button>\n    <a-button type=\"primary\" @click=\"setDisabled(1)\">禁用</a-button>\n    <a-button type=\"primary\" @click=\"showUploadModal\">文件弹窗</a-button>\n  </a-button-group>\n  <BasicForm @register=\"register\" @submit=\"handleSubmit\" />\n  <JUploadModal v-model:value=\"uploadModalValue\" @register=\"registerModel\" />\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import { FormSchema, useForm, BasicForm } from '/@/components/Form';\n  import { UploadTypeEnum } from '/@/components/Form/src/jeecg/components/JUpload';\n  import { JUploadModal } from '/@/components/Form/src/jeecg/components/JUpload';\n  import { useModal } from '/@/components/Modal';\n\n  const uploadModalValue = ref('');\n\n  const schemas: FormSchema[] = [\n    {\n      field: 'uploadFile',\n      component: 'JUpload',\n      helpMessage: '无限制上传',\n      label: '上传文件',\n    },\n    {\n      field: 'uploadFileMax',\n      component: 'JUpload',\n      helpMessage: '最多上传3个文件',\n      label: '上传文件（3）',\n      componentProps: { maxCount: 3 },\n    },\n    {\n      field: 'uploadImage',\n      component: 'JUpload',\n      label: '上传图片',\n      helpMessage: '无限制上传',\n      componentProps: {\n        fileType: UploadTypeEnum.image,\n      },\n    },\n    {\n      field: 'uploadImageMax',\n      component: 'JUpload',\n      label: '上传图片（1）',\n      helpMessage: '最多上传1张图片',\n      componentProps: {\n        fileType: UploadTypeEnum.image,\n        maxCount: 1,\n      },\n    },\n  ];\n\n  const [registerModel, { openModal }] = useModal();\n\n  const [register, { setProps, validate, setFieldsValue }] = useForm({\n    labelWidth: 120,\n    schemas: schemas,\n    actionColOptions: {\n      span: 24,\n    },\n    compact: true,\n    showResetButton: false,\n    showSubmitButton: false,\n    showAdvancedButton: false,\n    disabled: false,\n  });\n\n  function handleSubmit(values) {\n    console.log(values);\n  }\n\n  function setDisabled(flag) {\n    setProps({ disabled: !!flag });\n  }\n\n  function showUploadModal() {\n    openModal(true, {\n      maxCount: 9,\n      fileType: UploadTypeEnum.image,\n    });\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo1.vue",
    "content": "<template>\n  <a-space>\n    <a-button @click=\"onToggleLoading\">切换加载</a-button>\n    <a-button @click=\"onToggleDisabled\">切换禁用</a-button>\n  </a-space>\n  <!--这种使用场景得用height，用maxHeight底层有问题-->\n  <JVxeTable\n    ref=\"tableRef\"\n    stripe\n    toolbar\n    rowNumber\n    rowSelection\n    rowExpand\n    resizable\n    asyncRemove\n    clickSelectRow\n    :height=\"480\"\n    :checkboxConfig=\"{ range: true }\"\n    :disabledRows=\"{ input: ['text--16', 'text--18'] }\"\n    :loading=\"loading\"\n    :disabled=\"disabled\"\n    :columns=\"columns\"\n    :dataSource=\"dataSource\"\n    @removed=\"onJVxeRemove\"\n    @valueChange=\"handleValueChange\"\n    @blur=\"handleBlur\"\n    :custom=\"true\"\n  >\n    <template #toolbarSuffix>\n      <a-button @click=\"handleTableCheck\">表单验证</a-button>\n      <a-tooltip placement=\"top\" title=\"获取值，忽略表单验证\" :autoAdjustOverflow=\"true\">\n        <a-button @click=\"onGetData\">获取数据</a-button>\n      </a-tooltip>\n      <a-tooltip placement=\"top\" title=\"模拟加载1000条数据\" :autoAdjustOverflow=\"true\">\n        <a-button @click=\"handleTableSet\">设置值</a-button>\n      </a-tooltip>\n      <a-button @click=\"onGetSelData\">获取选中数据</a-button>\n      <a-button @click=\"onClearSel\">清空选中</a-button>\n      <a-button @click=\"onDelFirst\">删除第一行数据</a-button>\n      <a-button @click=\"onDelSel\">删除选中数据</a-button>\n    </template>\n\n    <template #expandContent=\"props\">\n      <div style=\"padding: 20px\">\n        <span>Hello! My name is: {{ props.row.input }}!</span>\n      </div>\n    </template>\n\n    <template #myAction=\"props\">\n      <a @click=\"onLookRow(props)\">查看</a>\n      <a-divider type=\"vertical\" />\n      <Popconfirm title=\"确定删除吗？\" @confirm=\"onDeleteRow(props)\">\n        <a>删除</a>\n      </Popconfirm>\n    </template>\n  </JVxeTable>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  // noinspection ES6UnusedImports\n  import { Popconfirm } from 'ant-design-vue';\n  import { JVxeTypes, JVxeColumn, JVxeTableInstance } from '/@/components/jeecg/JVxeTable/types';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { random } from 'lodash-es';\n  import { buildUUID } from '/@/utils/uuid';\n  import dayjs from 'dayjs';\n  import { pushIfNotExist } from '/@/utils/common/compUtils';\n\n  const { createMessage } = useMessage();\n  const tableRef = ref<JVxeTableInstance>();\n  const loading = ref(false);\n  const disabled = ref(false);\n  const columns = ref<JVxeColumn[]>([\n    {\n      title: 'ID',\n      key: 'id',\n      type: JVxeTypes.hidden,\n    },\n    {\n      title: '不可编辑',\n      key: 'noEdit',\n      type: JVxeTypes.normal,\n      width: 180,\n      defaultValue: 'noEdit-new',\n    },\n    {\n      title: '单行文本',\n      key: 'input',\n      type: JVxeTypes.input,\n      width: 180,\n      defaultValue: '',\n      placeholder: '请输入${title}',\n      validateRules: [\n        {\n          required: true, // 必填\n          message: '请输入${title}', // 显示的文本\n        },\n        {\n          pattern: /^[a-z|A-Z][a-z|A-Z\\d_-]*$/, // 正则\n          message: '必须以字母开头，可包含数字、下划线、横杠',\n        },\n        {\n          unique: true,\n          message: '${title}不能重复',\n        },\n        {\n          handler({ cellValue, row, column }, callback, target) {\n            // cellValue 当前校验的值\n            // callback(flag, message) 方法必须执行且只能执行一次\n            //          flag = 是否通过了校验，不填写或者填写 null 代表不进行任何操作\n            //          message = 提示的类型，默认使用配置的 message\n            // target 行编辑的实例对象\n            if (cellValue === 'abc') {\n              callback(false, '${title}不能是abc'); // false = 未通过校验\n            } else {\n              callback(true); // true = 通过验证\n            }\n          },\n          message: '${title}默认提示',\n        },\n      ],\n    },\n    {\n      title: '多行文本',\n      key: 'textarea',\n      type: JVxeTypes.textarea,\n      width: 200,\n    },\n    {\n      title: '数字',\n      key: 'number',\n      type: JVxeTypes.inputNumber,\n      width: 80,\n      defaultValue: 32,\n      // 【统计列】sum = 求和、average = 平均值\n      statistics: ['sum', 'average'],\n    },\n    {\n      title: '下拉框',\n      key: 'select',\n      type: JVxeTypes.select,\n      width: 180,\n      // 下拉选项\n      options: [\n        { title: 'String', value: 'string' },\n        { title: 'Integer', value: 'int' },\n        { title: 'Double', value: 'double' },\n        { title: 'Boolean', value: 'boolean' },\n      ],\n      // allowInput: true,\n      allowSearch: true,\n      placeholder: '请选择',\n    },\n    {\n      title: '下拉框_字典',\n      key: 'select_dict',\n      type: JVxeTypes.select,\n      width: 180,\n      options: [],\n      dictCode: 'sex',\n      placeholder: '请选择',\n    },\n    {\n      title: '下拉框_多选',\n      key: 'select_multiple',\n      type: JVxeTypes.selectMultiple,\n      width: 205,\n      options: [\n        { title: 'String', value: 'string' },\n        { title: 'Integer', value: 'int' },\n        { title: 'Double', value: 'double' },\n        { title: 'Boolean', value: 'boolean' },\n      ],\n      defaultValue: ['int', 'boolean'], // 多个默认项\n      // defaultValue: 'string,double,int', // 也可使用这种方式\n      placeholder: '多选',\n    },\n    {\n      title: '下拉框_搜索',\n      key: 'select_search',\n      type: JVxeTypes.selectSearch,\n      width: 180,\n      options: [\n        { title: 'String', value: 'string' },\n        { title: 'Integer', value: 'int' },\n        { title: 'Double', value: 'double' },\n        { title: 'Boolean', value: 'boolean' },\n      ],\n    },\n    {\n      title: '日期时间',\n      key: 'datetime',\n      type: JVxeTypes.datetime,\n      width: 200,\n      defaultValue: '2019-04-30 14:52:22',\n      placeholder: '请选择',\n    },\n    {\n      title: '时间',\n      key: 'time',\n      type: JVxeTypes.time,\n      width: 200,\n      defaultValue: '14:52:22',\n      placeholder: '请选择',\n    },\n    {\n      title: '复选框',\n      key: 'checkbox',\n      type: JVxeTypes.checkbox,\n      width: 100,\n      customValue: ['Y', 'N'], // true ,false\n      defaultChecked: false,\n    },\n    {\n      title: '操作',\n      key: 'action',\n      type: JVxeTypes.slot,\n      fixed: 'right',\n      minWidth: 120,\n      align: 'center',\n      slotName: 'myAction',\n    },\n  ]);\n  const dataSource = ref<any[]>([]);\n\n  /* 随机生成数据 */\n  function randomPage(current, pageSize, isLoading = false) {\n    if (isLoading) {\n      loading.value = true;\n    }\n\n    let randomDatetime = () => {\n      let time = random(1000, 9999999999999);\n      return dayjs(new Date(time)).format('YYYY-MM-DD HH:mm:ss');\n    };\n\n    let limit = (current - 1) * pageSize;\n\n    let options = ['string', 'int', 'double', 'boolean'];\n\n    let begin = Date.now();\n    let values: any[] = [];\n    for (let i = 0; i < pageSize; i++) {\n      values.push({\n        id: buildUUID(),\n        noEdit: `noEdit-${limit + i + 1}`,\n        input: `text-${limit + i + 1}`,\n        textarea: `textarea-${limit + i + 1}`,\n        number: random(0, 233),\n        select: options[random(0, 3)],\n        select_dict: random(1, 2).toString(),\n        select_multiple: (() => {\n          let length = random(1, 4);\n          let arr = [];\n          for (let j = 0; j < length; j++) {\n            pushIfNotExist(arr, options[random(0, 3)]);\n          }\n          return arr.join(',');\n        })(),\n        select_search: options[random(0, 3)],\n        datetime: randomDatetime(),\n        checkbox: ['Y', 'N'][random(0, 1)],\n      });\n    }\n\n    dataSource.value = values;\n    let end = Date.now();\n    let diff = end - begin;\n\n    if (isLoading && diff < pageSize) {\n      setTimeout(() => (loading.value = false), pageSize - diff);\n    }\n  }\n\n  randomPage(0, 20, true);\n\n  function onLookRow(props) {\n    createMessage.success('请在控制台查看输出');\n    // 参数介绍：\n    // props.value          当前单元格的值\n    // props.row            当前行的数据\n    // props.rowId          当前行ID\n    // props.rowIndex       当前行下标\n    // props.column         当前列的配置\n    // props.columnIndex    当前列下标\n    // props.$table         vxe实例，可以调用vxe内置方法\n    // props.target         JVXE实例，可以调用JVXE内置方法\n    // props.caseId         JVXE实例唯一ID\n    // props.scrolling      是否正在滚动\n    // props.triggerChange  触发change事件，用于更改slot的值\n    console.log('查看: ', { props });\n  }\n\n  // async function onDeleteRow(props) {\n  //   // 同步调用删除方法\n  //   const res = await tableRef.value?.removeRows(props.row);\n  //   if (res && res.rows.length > 0) {\n  //     createMessage.success('删除成功');\n  //   }\n  // }\n\n  async function onDeleteRow(props) {\n    // 异步调用删除方法\n    const res = await tableRef.value?.removeRows(props.row, true);\n    console.log('删除成功~', res);\n  }\n\n  function handleValueChange(event) {\n    console.log('handleValueChange.event: ', event);\n  }\n\n  // 代码逻辑说明: 【issues/636】JVxeTable加上blur事件\n  function handleBlur(event){\n    console.log(\"blur\",event);\n  }\n  /** 表单验证 */\n  function handleTableCheck() {\n    tableRef.value!.validateTable().then((errMap) => {\n      if (errMap) {\n        console.log('表单验证未通过：', { errMap });\n        createMessage.error('验证未通过，请在控制台查看详细');\n      } else {\n        createMessage.success('验证通过');\n      }\n    });\n  }\n\n  /** 获取值，忽略表单验证 */\n  function onGetData() {\n    const values = tableRef.value!.getTableData();\n    console.log('获取值:', { values });\n    createMessage.success('获取值成功，请看控制台输出');\n  }\n\n  /** 模拟加载1000条数据 */\n  function handleTableSet() {\n    randomPage(1, 1000, true);\n  }\n\n  function onDelFirst() {\n    const xTable = tableRef.value!.getXTable();\n    const record = xTable.getTableData().fullData[0];\n    tableRef.value!.removeRows(record);\n  }\n\n  function onDelSel() {\n    const xTable = tableRef.value!.getXTable();\n    xTable.removeCheckboxRow();\n  }\n\n  function onGetSelData() {\n    createMessage.info('请看控制台');\n    console.log(tableRef.value!.getSelectionData());\n  }\n\n  function onClearSel() {\n    tableRef.value!.clearSelection();\n  }\n\n  function onToggleLoading() {\n    loading.value = !loading.value;\n  }\n\n  function onToggleDisabled() {\n    disabled.value = !disabled.value;\n  }\n\n  function doDelete(deleteRows) {\n    let rowId;\n    return new Promise((resolve) => {\n      if (Array.isArray(deleteRows)) {\n        rowId = deleteRows.filter((row) => row.id);\n      } else {\n        rowId = deleteRows.id;\n      }\n      console.log('删除 rowId: ', rowId);\n      setTimeout(() => resolve(true), 1500);\n    });\n  }\n\n  /** 异步删除示例 */\n  async function onJVxeRemove(event) {\n    const hideLoading = createMessage.loading('删除中…', 0);\n    try {\n      // 1. 向后台传递 event.deleteRows 以删除\n      let flag = await doDelete(event.deleteRows);\n      if (flag) {\n        // 注：如果启用了表格的 loading 状态，则必须先停止再删除，否则会导致无法从表格上删除数据\n        // 2. 调用 event.confirmRemove 方法确认删除成功\n        // await tableRef.value!.removeSelection();\n        await event.confirmRemove()\n        createMessage.success('删除成功！');\n      } else {\n        // 3. 若删除失败，不调用 event.confirmRemove() 方法就不会删除数据\n        createMessage.warn('删除失败！');\n      }\n    } finally {\n      hideLoading();\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo2.vue",
    "content": "<template>\n  <JVxeTable\n    ref=\"tableRef\"\n    toolbar\n    row-number\n    row-selection\n    keep-source\n    :height=\"492\"\n    :loading=\"loading\"\n    :dataSource=\"dataSource\"\n    :columns=\"columns\"\n    :pagination=\"pagination\"\n    style=\"margin-top: 8px\"\n    @pageChange=\"handlePageChange\"\n  >\n    <template #toolbarSuffix>\n      <a-button @click=\"handleTableGet\">获取数据</a-button>\n    </template>\n  </JVxeTable>\n</template>\n\n<script lang=\"ts\" setup>\n  import { reactive, ref } from 'vue';\n  // noinspection ES6UnusedImports\n  import { Popconfirm } from 'ant-design-vue';\n  import { JVxeColumn, JVxeTableInstance, JVxeTypes } from '/@/components/jeecg/JVxeTable/types';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { random } from 'lodash-es';\n  import { buildUUID } from '/@/utils/uuid';\n  import { uploadUrl } from '/@/api/common/api';\n\n  const tableRef = ref<JVxeTableInstance>();\n  const { createMessage } = useMessage();\n  const loading = ref(false);\n  const columns = ref<JVxeColumn[]>([\n    {\n      title: '下拉框_字典表搜索',\n      key: 'select_dict_search',\n      type: JVxeTypes.selectDictSearch,\n      width: 200,\n      async: true, // 异步搜索，默认为 true\n      // 字典表配置信息：数据库表名,显示字段名,存储字段名\n      dict: 'sys_user,realname,username',\n      tipsContent: '请输入查询条件',\n    },\n    {\n      title: 'JPopup',\n      key: 'popup',\n      type: JVxeTypes.popup,\n      width: 180,\n      popupCode: 'demo',\n      // field: 'name,sex,age',\n      // orgFields: 'name,sex,age',\n      // destFields: 'popup,popup_sex,popup_age',\n      fieldConfig: [\n        { source: 'name', target: 'popup' },\n        { source: 'sex', target: 'popup_sex' },\n        { source: 'age', target: 'popup_age' },\n      ],\n    },\n    {\n      title: 'JP-性别',\n      key: 'popup_sex',\n      type: JVxeTypes.select,\n      dictCode: 'sex',\n      disabled: true,\n      width: 100,\n    },\n    {\n      title: 'JP-年龄',\n      key: 'popup_age',\n      type: JVxeTypes.normal,\n      width: 80,\n    },\n    {\n      title: '用户选择',\n      key: 'userSelect',\n      type: JVxeTypes.userSelect,\n      width: 240,\n    },\n    {\n      title: '部门选择',\n      key: 'departSelect',\n      type: JVxeTypes.departSelect,\n      width: 240,\n    },\n    {\n      title: '单选',\n      key: 'radio',\n      type: JVxeTypes.radio,\n      width: 130,\n      options: [\n        { text: '男', value: '1' },\n        { text: '女', value: '2' },\n      ],\n      // 允许清除选择（再点一次取消选择）\n      allowClear: false,\n    },\n    {\n      title: '上传',\n      key: 'upload',\n      type: JVxeTypes.upload,\n      width: 180,\n      btnText: '点击上传',\n      token: true,\n      responseName: 'message',\n      action: uploadUrl,\n    },\n    {\n      title: '图片上传',\n      key: 'image',\n      type: JVxeTypes.image,\n      width: 180,\n      maxCount: 6,\n    },\n    {\n      title: '文件上传',\n      key: 'file',\n      type: JVxeTypes.file,\n      width: 180,\n      maxCount: 2,\n    },\n    {\n      title: '进度条',\n      key: 'progress',\n      type: JVxeTypes.progress,\n      minWidth: 320,\n    },\n  ]);\n  const dataSource = ref<any[]>([]);\n  const pagination = reactive({\n    current: 1,\n    pageSize: 10,\n    pageSizeOptions: ['10', '20', '30', '100', '200'],\n    total: 1000,\n  });\n\n  randomPage(pagination.current, pagination.pageSize, true);\n\n  // 当分页参数变化时触发的事件\n  function handlePageChange(event) {\n    // 重新赋值\n    pagination.current = event.current;\n    pagination.pageSize = event.pageSize;\n    // 查询数据\n    randomPage(event.current, event.pageSize, true);\n  }\n\n  /** 获取值，忽略表单验证 */\n  function handleTableGet() {\n    const values = tableRef.value!.getTableData();\n    console.log('获取值:', { values });\n    createMessage.success('获取值成功，请看控制台输出');\n  }\n\n  /* 随机生成分页数据 */\n  function randomPage(current, pageSize, $loading = false) {\n    if ($loading) {\n      loading.value = true;\n    }\n    let begin = Date.now();\n    let values: any[] = [];\n    for (let i = 0; i < pageSize; i++) {\n      let radio = random(0, 2);\n      values.push({\n        id: buildUUID(),\n        select_dict_search: ['admin', '', 'jeecg'][random(0, 2)],\n        progress: random(0, 100),\n        radio: radio ? radio.toString() : null,\n      });\n    }\n    dataSource.value = values;\n    let end = Date.now();\n    let diff = end - begin;\n    if ($loading && diff < pageSize) {\n      setTimeout(() => (loading.value = false), pageSize - diff);\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo3.vue",
    "content": "<template>\n  <div>\n    <ol style=\"border: 1px solid #cccccc; width: 600px; padding: 8px\">\n      <li>1. 开启 dragSort 属性之后即可实现上下拖拽排序。</li>\n      <li>2. 使用 sortKey 属性可以自定义排序保存的 key，默认为 orderNum。</li>\n      <li>3. 使用 sortBegin 属性可以自定义排序的起始值，默认为 0。</li>\n      <li>4. sortKey 定义的字段不需要定义在 columns 中也能正常获取到值。</li>\n      <li>5. 当存在 fixed 列时，拖拽排序将会失效，仅能上下排序。</li>\n    </ol>\n\n    <p> 以下示例开启了拖拽排序，排序值保存字段为 sortNum，排序起始值为 3<br /> </p>\n\n    <JVxeTable\n      ref=\"tableRef1\"\n      toolbar\n      dragSort\n      sortKey=\"sortNum\"\n      :sortBegin=\"3\"\n      rowSelection\n      dragSortFixed=\"none\"\n      rowSelectionFixed=\"none\"\n      :maxHeight=\"580\"\n      :columns=\"table1.columns\"\n      :dataSource=\"table1.data\"\n    >\n      <template #toolbarSuffix>\n        <a-button @click=\"onGetData1\">获取数据</a-button>\n      </template>\n    </JVxeTable>\n\n    <br />\n    <p>以下 fixed 表格不支持拖拽排序，仅支持点击上下排序</p>\n\n    <JVxeTable ref=\"tableRef2\" toolbar dragSort rowSelection :maxHeight=\"580\" :columns=\"table2.columns\" :dataSource=\"table2.data\">\n      <template #toolbarSuffix>\n        <a-button @click=\"onGetData2\">获取数据</a-button>\n      </template>\n    </JVxeTable>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, reactive } from 'vue';\n  import { JVxeTypes, JVxeColumn, JVxeTableInstance } from '/@/components/jeecg/JVxeTable/types';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  const tableRef1 = ref<JVxeTableInstance>();\n  const tableRef2 = ref<JVxeTableInstance>();\n  const table1 = reactive({\n    columns: [\n      {\n        title: 'ID',\n        key: 'id',\n        width: 120,\n        type: JVxeTypes.normal,\n      },\n      {\n        title: '姓名',\n        key: 'name',\n        width: 240,\n        type: JVxeTypes.input,\n        defaultValue: 'new name',\n      },\n      {\n        title: '字段长度',\n        key: 'dbLength',\n        width: 2400,\n        type: JVxeTypes.inputNumber,\n        defaultValue: 32,\n      },\n      {\n        title: 'sortNum',\n        key: 'sortNum',\n        width: 120,\n        type: JVxeTypes.normal,\n      },\n    ] as JVxeColumn[],\n    data: [\n      { id: 'uuid-0001', name: '张三', dbLength: 123 },\n      { id: 'uuid-0002', name: '李四', dbLength: 777 },\n      { id: 'uuid-0003', name: '王五', dbLength: 666 },\n      { id: 'uuid-0004', name: '赵六', dbLength: 233 },\n    ],\n  });\n\n  const table2 = reactive({\n    columns: [\n      {\n        title: 'ID',\n        key: 'id',\n        width: 320,\n        fixed: 'left',\n        type: JVxeTypes.normal,\n      },\n      {\n        title: '姓名',\n        key: 'name',\n        width: 720,\n        type: JVxeTypes.input,\n        defaultValue: 'new name',\n      },\n      {\n        title: '字段长度',\n        key: 'dbLength',\n        width: 720,\n        type: JVxeTypes.inputNumber,\n        defaultValue: 32,\n      },\n    ] as JVxeColumn[],\n    data: [\n      { id: 'uuid-0001', name: '张三', dbLength: 123 },\n      { id: 'uuid-0002', name: '李四', dbLength: 777 },\n      { id: 'uuid-0003', name: '王五', dbLength: 666 },\n      { id: 'uuid-0004', name: '赵六', dbLength: 233 },\n    ],\n  });\n\n  const { createMessage } = useMessage();\n\n  function onGetData1() {\n    createMessage.info('请看控制台');\n    console.log(tableRef1.value!.getTableData());\n  }\n\n  function onGetData2() {\n    createMessage.info('请看控制台');\n    console.log(tableRef2.value!.getTableData());\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo4.vue",
    "content": "<template>\n  <JVxeTable\n    ref=\"vTable\"\n    toolbar\n    rowNumber\n    rowSelection\n    :maxHeight=\"580\"\n    :dataSource=\"dataSource\"\n    :columns=\"columns\"\n    :linkageConfig=\"linkageConfig\"\n  />\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { JVxeTypes, JVxeColumn, JVxeLinkageConfig } from '/@/components/jeecg/JVxeTable/types';\n\n  // 联动配置\n  const linkageConfig = ref<JVxeLinkageConfig[]>([\n    { requestData: requestMockData, key: 's1' },\n    // 可配置多个联动\n    { requestData: requestMenu, key: 'menu1' },\n  ]);\n\n  const columns = ref<JVxeColumn[]>([\n    {\n      title: '性别',\n      key: 'sex',\n      type: JVxeTypes.select,\n      dictCode: 'sex',\n      width: '180px',\n      placeholder: '请选择${title}',\n    },\n    {\n      title: '省/直辖市/自治区',\n      key: 's1',\n      type: JVxeTypes.select,\n      width: '180px',\n      placeholder: '请选择${title}',\n      // 联动字段（即下一级的字段）\n      linkageKey: 's2',\n    },\n    {\n      title: '市',\n      key: 's2',\n      type: JVxeTypes.select,\n      width: '180px',\n      placeholder: '请选择${title}',\n      // 联动字段（即下一级的字段）\n      linkageKey: 's3',\n    },\n    {\n      title: '县/区',\n      key: 's3',\n      type: JVxeTypes.select,\n      width: '180px',\n      options: [],\n      placeholder: '请选择${title}',\n    },\n    {\n      title: '一级菜单',\n      key: 'menu1',\n      type: JVxeTypes.select,\n      width: '180px',\n      placeholder: '请选择${title}',\n      // 联动字段（即下一级的字段）\n      linkageKey: 'menu2',\n    },\n    {\n      title: '二级菜单',\n      key: 'menu2',\n      type: JVxeTypes.select,\n      width: '180px',\n      placeholder: '请选择${title}',\n      // 联动字段（即下一级的字段）\n      linkageKey: 'menu3',\n    },\n    {\n      title: '三级菜单',\n      key: 'menu3',\n      type: JVxeTypes.select,\n      width: '180px',\n      placeholder: '请选择${title}',\n    },\n  ]);\n\n  const dataSource = ref([\n    { sex: '1', s1: '110000', s2: '110100', s3: '110101' },\n    { sex: '2', s1: '130000', s2: '130300', s3: '130303' },\n  ]);\n\n  // 模拟数据\n  const mockData = [\n    { text: '北京市', value: '110000', parent: '' },\n    { text: '天津市', value: '120000', parent: '' },\n    { text: '河北省', value: '130000', parent: '' },\n    { text: '上海市', value: '310000', parent: '' },\n\n    { text: '北京市', value: '110100', parent: '110000' },\n    { text: '天津市市', value: '120100', parent: '120000' },\n    { text: '石家庄市', value: '130100', parent: '130000' },\n    { text: '唐山市', value: '130200', parent: '130000' },\n    { text: '秦皇岛市', value: '130300', parent: '130000' },\n    { text: '上海市', value: '310100', parent: '310000' },\n\n    { text: '东城区', value: '110101', parent: '110100' },\n    { text: '西城区', value: '110102', parent: '110100' },\n    { text: '朝阳区', value: '110105', parent: '110100' },\n    { text: '和平区', value: '120101', parent: '120100' },\n    { text: '河东区', value: '120102', parent: '120100' },\n    { text: '河西区', value: '120103', parent: '120100' },\n    { text: '黄浦区', value: '310101', parent: '310100' },\n    { text: '徐汇区', value: '310104', parent: '310100' },\n    { text: '长宁区', value: '310105', parent: '310100' },\n    { text: '长安区', value: '130102', parent: '130100' },\n    { text: '桥西区', value: '130104', parent: '130100' },\n    { text: '新华区', value: '130105', parent: '130100' },\n    { text: '路南区', value: '130202', parent: '130200' },\n    { text: '路北区', value: '130203', parent: '130200' },\n    { text: '古冶区', value: '130204', parent: '130200' },\n    { text: '海港区', value: '130302', parent: '130300' },\n    { text: '山海关区', value: '130303', parent: '130300' },\n    { text: '北戴河区', value: '130304', parent: '130300' },\n  ];\n\n  /** 模拟从后台查询数据 */\n  function requestMockData(parent) {\n    return new Promise((resolve) => {\n      let data = mockData.filter((i) => i.parent === parent);\n      setTimeout(() => resolve(data), 500);\n    });\n  }\n\n  /** 查询后台真实数据 */\n  async function requestMenu(parent) {\n    let result;\n    // 如果parent为空，则查询第一级菜单\n    if (parent === '') {\n      result = await defHttp.get({\n        url: '/sys/permission/getSystemMenuList',\n        params: {},\n      });\n    } else {\n      result = await defHttp.get({\n        url: '/sys/permission/getSystemSubmenu',\n        params: { parentId: parent },\n      });\n    }\n    // 返回的数据里必须包含 value 和 text 字段\n    return result.map((item) => ({ value: item.id, text: item.name }));\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JVxeTableDemo/JVxeDemo5.vue",
    "content": "<template>\n  <div>\n    <b>键盘操作快捷键：</b>\n    <div style=\"border: 1px solid #cccccc; padding: 8px; width: 740px\">\n      <pre>\n             F2 | 如果存在，激活单元格为编辑状态\n            Esc | 如果存在，取消单元格编辑状态\n              ↑ | 如果存在，则移动到上面的单元格\n              ↓ | 如果存在，则移动到下面的单元格\n              ← | 如果存在，则移动到左边的单元格\n              → | 如果存在，则移动到右边的单元格\n            Tab | 如果存在，则移动到右边单元格；如果移动到最后一列，则从下一行开始移到，以此循环\n    Shift + Tab | 如果存在，则移动到左边单元格，如果移动到第一列，则从上一行开始移到，以此循环\n          Enter | 如果存在，取消单元格编辑并移动到下面的单元格\n  Shift + Enter | 如果存在，取消单元格编辑并移动到上面的单元格</pre\n      >\n    </div>\n\n    <JVxeTable ref=\"tableRef\" stripe toolbar rowNumber rowSelection keyboardEdit :columns=\"columns\" :dataSource=\"dataSource\"> </JVxeTable>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { ref, onMounted, nextTick, defineComponent } from 'vue';\n  import { Popconfirm } from 'ant-design-vue';\n  import { JVxeTypes, JVxeColumn, JVxeTableInstance } from '/@/components/jeecg/JVxeTable/types';\n\n  export default defineComponent({\n    name: 'JVxeDemo5',\n    components: { [Popconfirm.name]: Popconfirm },\n    setup() {\n      const tableRef = ref<JVxeTableInstance>();\n      const columns = ref<JVxeColumn[]>([\n        {\n          title: '单行文本',\n          key: 'input',\n          type: JVxeTypes.input,\n          width: 220,\n          defaultValue: '',\n          placeholder: '请输入${title}',\n        },\n        {\n          title: '多行文本',\n          key: 'textarea',\n          type: JVxeTypes.textarea,\n          width: 240,\n        },\n        {\n          title: '数字',\n          key: 'number',\n          type: JVxeTypes.inputNumber,\n          width: 120,\n          defaultValue: 32,\n        },\n        {\n          title: '日期时间',\n          key: 'datetime',\n          type: JVxeTypes.datetime,\n          width: 240,\n          defaultValue: '2019-04-30 14:51:22',\n          placeholder: '请选择',\n        },\n        {\n          title: '时间',\n          key: 'time',\n          type: JVxeTypes.time,\n          width: 220,\n          defaultValue: '14:52:22',\n          placeholder: '请选择',\n        },\n        {\n          title: '下拉框',\n          key: 'select',\n          type: JVxeTypes.select,\n          width: 220,\n          // 下拉选项\n          options: [\n            { title: 'String', value: 'string' },\n            { title: 'Integer', value: 'int' },\n            { title: 'Double', value: 'double' },\n            { title: 'Boolean', value: 'boolean' },\n          ],\n          // allowInput: true,\n          allowSearch: true,\n          placeholder: '请选择',\n        },\n        {\n          title: '复选框',\n          key: 'checkbox',\n          type: JVxeTypes.checkbox,\n          // width: 100,\n          customValue: ['Y', 'N'], // true ,false\n          defaultChecked: false,\n        },\n      ]);\n      const dataSource = ref([]);\n\n      function handleView(props) {\n        // 参数介绍：\n        // props.value          当前单元格的值\n        // props.row            当前行的数据\n        // props.rowId          当前行ID\n        // props.rowIndex       当前行下标\n        // props.column         当前列的配置\n        // props.columnIndex    当前列下标\n        // props.$table         vxe-table实例，可以调用vxe-table内置方法\n        // props.scrolling      是否正在滚动\n        // props.reloadEffect   是否开启了数据刷新特效\n        // props.triggerChange  触发change事件，用于更改slot的值\n        console.log('props: ', props);\n      }\n\n      function handleDelete({ row }) {\n        // 使用实例：删除当前操作的行\n        tableRef.value?.removeRows(row);\n      }\n\n      onMounted(async () => {\n        console.log(tableRef.value);\n        await nextTick();\n        // 默认添加五行数据\n        tableRef.value!.addRows([{ input: 'input_1' }, { input: 'input_2' }, { input: 'input_3' }, { input: 'input_4' }, { input: 'input_5' }], {\n          setActive: false,\n        });\n      });\n\n      return { tableRef, columns, dataSource, handleView, handleDelete };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JVxeTableDemo/func-demo/JSBCDemo.vue",
    "content": "<template>\n  <a-card title=\"即时保存示例\" :bordered=\"false\">\n    <!--\n      【即时保存大体思路】：\n      1. JVxeTable 上必须加 keep-source 属性\n      2. 监听 edit-closed事件，这个事件是在编辑完成后触发\n      3. 在这个事件里面判断数据是否更改，如果更改了就调用接口进行保存操作\n    -->\n    <JVxeTable\n      toolbar\n      :toolbarConfig=\"toolbarConfig\"\n      rowNumber\n      rowSelection\n      keepSource\n      asyncRemove\n      :height=\"340\"\n      :loading=\"loading\"\n      :columns=\"columns\"\n      :dataSource=\"dataSource\"\n      :pagination=\"pagination\"\n      @save=\"handleTableSave\"\n      @removed=\"handleTableRemove\"\n      @edit-closed=\"handleEditClosed\"\n      @pageChange=\"handlePageChange\"\n      @selectRowChange=\"handleSelectRowChange\"\n    />\n  </a-card>\n</template>\n\n<script lang=\"ts\" setup>\n  // 即时保存示例\n  import { reactive, ref } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { JVxeColumn, JVxeTypes } from '/@/components/jeecg/JVxeTable/types';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  const { createMessage } = useMessage();\n  // 工具栏的按钮配置\n  const toolbarConfig = reactive({\n    // add 新增按钮；remove 删除按钮；clearSelection 清空选择按钮\n    btn: ['add', 'save', 'remove', 'clearSelection'],\n  });\n  // 是否正在加载\n  const loading = ref(false);\n  // 分页器参数\n  const pagination = reactive({\n    // 当前页码\n    current: 1,\n    // 每页的条数\n    pageSize: 200,\n    // 可切换的条数\n    pageSizeOptions: ['10', '20', '30', '100', '200'],\n    // 数据总数（目前并不知道真实的总数，所以先填写0，在后台查出来后再赋值）\n    total: 0,\n  });\n  // 选择的行\n  const selectedRows = ref<Recordable[]>([]);\n  // 数据源，控制表格的数据\n  const dataSource = ref<Recordable[]>([]);\n  // 列配置，控制表格显示的列\n  const columns = ref<JVxeColumn[]>([\n    { key: 'num', title: '序号', width: 80, type: JVxeTypes.normal },\n    {\n      // 字段key，跟后台数据的字段名匹配\n      key: 'ship_name',\n      // 列的标题\n      title: '船名',\n      // 列的宽度\n      width: 180,\n      // 如果加上了该属性，就代表当前单元格是可编辑的，type就是表单的类型，input就是简单的输入框\n      type: JVxeTypes.input,\n    },\n    { key: 'call', title: '呼叫', width: 80, type: JVxeTypes.input },\n    { key: 'len', title: '长', width: 80, type: JVxeTypes.input },\n    { key: 'ton', title: '吨', width: 120, defaultValue: 233, type: JVxeTypes.input },\n    { key: 'payer', title: '付款方', width: 120, defaultValue: '张三', type: JVxeTypes.input },\n    { key: 'count', title: '数', width: 40, type: JVxeTypes.normal },\n    {\n      key: 'company',\n      title: '公司',\n      // 最小宽度，与宽度不同的是，这个不是固定的宽度，如果表格有多余的空间，会平均分配给设置了 minWidth 的列\n      // 如果要做占满表格的列可以这么写\n      minWidth: 180,\n      type: JVxeTypes.input,\n    },\n    { key: 'trend', title: '动向', width: 120, type: JVxeTypes.input },\n  ]);\n\n  // 查询url地址\n  enum Api {\n    getData = '/mock/vxe/getData',\n    // 模拟保存单行数据（即时保存）\n    saveRow = '/mock/vxe/immediateSaveRow',\n    // 模拟保存整个表格的数据\n    saveAll = '/mock/vxe/immediateSaveAll',\n  }\n\n  loadData();\n\n  // 加载数据\n  async function loadData() {\n    loading.value = true;\n    // 调用查询数据接口\n    await defHttp\n      .get({\n        // 请求地址\n        url: Api.getData,\n        // 封装查询条件\n        params: {\n          pageNo: pagination.current,\n          pageSize: pagination.pageSize,\n        },\n      })\n      .then((result) => {\n        // 后台查询回来的 total，数据总数量\n        pagination.total = result.total;\n        // 将查询的数据赋值给 dataSource\n        dataSource.value = result.records;\n        // 重置选择\n        selectedRows.value = [];\n      })\n      .finally(() => {\n        // 这里是无论成功或失败都会执行的方法，在这里关闭loading\n        loading.value = false;\n      });\n  }\n\n  // 【整体保存】点击保存按钮时触发的事件\n  function handleTableSave({ $table, target }) {\n    // 校验整个表格\n    $table.validate().then((errMap) => {\n      // 校验通过\n      if (!errMap) {\n        // 获取所有数据\n        let tableData = target.getTableData();\n        console.log('当前保存的数据是：', tableData);\n        // 获取新增的数据\n        let newData = target.getNewData();\n        console.log('-- 新增的数据：', newData);\n        // 获取删除的数据\n        let deleteData = target.getDeleteData();\n        console.log('-- 删除的数据：', deleteData);\n        // 【模拟保存】\n        loading.value = true;\n        defHttp\n          .post({\n            url: Api.saveAll,\n            params: tableData,\n          })\n          .then(() => {\n            createMessage.success(`保存成功！`);\n          })\n          .finally(() => {\n            loading.value = false;\n          });\n      }\n    });\n  }\n\n  // 触发单元格删除事件\n  function handleTableRemove(event) {\n    // 把 event.deleteRows 传给后台进行删除（注意：这里不会传递前端逻辑新增的数据，因为不需要请求后台删除）\n    console.log('待删除的数据: ', event.deleteRows);\n    // 也可以只传ID，因为可以根据ID删除\n    let deleteIds = event.deleteRows.map((row) => row.id);\n    console.log('待删除的数据ids: ', deleteIds);\n\n    // 模拟请求后台删除\n    loading.value = true;\n    window.setTimeout(() => {\n      loading.value = false;\n      createMessage.success('删除成功');\n      // 假设后台返回删除成功，必须要调用 confirmRemove() 方法，才会真正在表格里移除（会同时删除选中的逻辑新增的数据）\n      event.confirmRemove();\n    }, 1000);\n  }\n\n  // 单元格编辑完成之后触发的事件\n  function handleEditClosed(event) {\n    let { $table, row, column } = event;\n    let field = column.property;\n    // 判断单元格值是否被修改\n    if ($table.isUpdateByRow(row, field)) {\n      // 校验当前行\n      $table.validate(row).then((errMap) => {\n        // 校验通过\n        if (!errMap) {\n          // 【模拟保存】\n          let hideLoading = createMessage.loading(`正在保存\"${column.title}\"`, 0);\n          console.log('即时保存数据：', row);\n          defHttp\n            .put({\n              url: Api.saveRow,\n              params: row,\n            })\n            .then((res) => {\n              createMessage.success(`\"${column.title}\"保存成功！`);\n              // 局部更新单元格为已保存状态\n              $table.reloadRow(row, null, field);\n            })\n            .finally(() => {\n              hideLoading();\n            });\n        }\n      });\n    }\n  }\n\n  // 当分页参数变化时触发的事件\n  function handlePageChange(event) {\n    // 重新赋值\n    pagination.current = event.current;\n    pagination.pageSize = event.pageSize;\n    // 查询数据\n    loadData();\n  }\n\n  // 当选择的行变化时触发的事件\n  function handleSelectRowChange(event) {\n    selectedRows.value = event.selectedRows;\n  }\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JVxeTableDemo/func-demo/PopupSubTable.vue",
    "content": "<template>\n  <a-card title=\"弹出子表示例\" :bordered=\"false\">\n    <!--\n      【弹出子表大体思路】\n      1. 必须要有 clickRowShowSubForm 属性，如果该属性设为false，那么就不会弹出子表\n      2. 必须要有 subForm 插槽，用于规定弹出子表的内容\n      3. highlightCurrentRow 属性可有可无，如果有则点击一行的时候，该行会背景色会常亮\n    -->\n    <!--\n      【弹出详细信息大体思路】\n      1. 必须要有 clickRowShowMainForm 属性，如果该属性设为false，那么就不会弹出详细信息\n      2. 必须要有 mainForm 插槽，用于规定弹出的内容\n    -->\n    <JVxeTable\n      toolbar\n      rowNumber\n      rowSelection\n      highlightCurrentRow\n      clickRowShowSubForm\n      clickRowShowMainForm\n      :height=\"750\"\n      :loading=\"loading\"\n      :columns=\"columns\"\n      :dataSource=\"dataSource\"\n      @detailsConfirm=\"handleDetailsConfirm\"\n    >\n      <!-- 主表单 -->\n      <template #mainForm=\"{ row }\">\n        <template v-if=\"row\">\n          <a-form ref=\"form2\" :model=\"row\" :rules=\"rules\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\">\n            <a-row :gutter=\"8\">\n              <a-col :span=\"8\">\n                <a-form-item label=\"ID\" name=\"id\">\n                  <a-input v-model:value=\"row.id\" disabled />\n                </a-form-item>\n              </a-col>\n              <a-col :span=\"8\">\n                <a-form-item label=\"序号\" name=\"num\">\n                  <a-input v-model:value=\"row.num\" />\n                </a-form-item>\n              </a-col>\n              <a-col :span=\"8\">\n                <a-form-item label=\"船名\" name=\"ship_name\">\n                  <a-input v-model:value=\"row.ship_name\" />\n                </a-form-item>\n              </a-col>\n              <a-col :span=\"8\">\n                <a-form-item label=\"呼叫\" name=\"call\">\n                  <a-input v-model:value=\"row.call\" />\n                </a-form-item>\n              </a-col>\n              <a-col :span=\"8\">\n                <a-form-item label=\"长\" name=\"len\">\n                  <a-input v-model:value=\"row.len\" />\n                </a-form-item>\n              </a-col>\n              <a-col :span=\"8\">\n                <a-form-item label=\"吨\" name=\"ton\">\n                  <a-input v-model:value=\"row.ton\" />\n                </a-form-item>\n              </a-col>\n              <a-col :span=\"8\">\n                <a-form-item label=\"付款方\" name=\"payer\">\n                  <a-input v-model:value=\"row.payer\" />\n                </a-form-item>\n              </a-col>\n              <a-col :span=\"8\">\n                <a-form-item label=\"数\" name=\"count\">\n                  <a-input v-model:value=\"row.count\" />\n                </a-form-item>\n              </a-col>\n              <a-col :span=\"8\">\n                <a-form-item label=\"公司\" name=\"company\">\n                  <a-input v-model:value=\"row.company\" />\n                </a-form-item>\n              </a-col>\n              <a-col :span=\"8\">\n                <a-form-item label=\"动向\" name=\"trend\">\n                  <a-input v-model:value=\"row.trend\" />\n                </a-form-item>\n              </a-col>\n            </a-row>\n          </a-form>\n        </template>\n      </template>\n\n      <!-- 子表单 -->\n      <template #subForm=\"{ row }\">\n        <template v-if=\"loadSubData(row)\">\n          <JVxeTable\n            ref=\"subFormTable\"\n            height=\"auto\"\n            :max-height=\"350\"\n            :loading=\"subTable.loading\"\n            :columns=\"subTable.columns\"\n            :dataSource=\"subTable.dataSource\"\n          />\n        </template>\n      </template>\n    </JVxeTable>\n  </a-card>\n</template>\n\n<script lang=\"ts\" setup>\n  // 弹出子表示例\n  import { reactive, ref } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { JVxeColumn, JVxeTypes } from '/@/components/jeecg/JVxeTable/types';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  const { createMessage } = useMessage();\n  const loading = ref(false);\n  const dataSource = ref([]);\n  const columns = ref<JVxeColumn[]>([\n    { key: 'num', title: '序号', width: '80px' },\n    { key: 'ship_name', title: '船名', width: '180px', type: JVxeTypes.input },\n    { key: 'call', title: '呼叫', width: '80px' },\n    { key: 'len', title: '长', width: '80px' },\n    { key: 'ton', title: '吨', width: '120px' },\n    { key: 'payer', title: '付款方', width: '120px' },\n    { key: 'count', title: '数', width: '40px' },\n    {\n      key: 'company',\n      title: '公司',\n      minWidth: '180px',\n      // 是否点击显示详细信息\n      // 只有当前单元格不能编辑的时候才能生效\n      // 如果不设的话，点击就只弹出子表，不会弹出主表的详细信息\n      showDetails: true,\n    },\n    { key: 'trend', title: '动向', width: '120px' },\n  ]);\n  const selectedRows = ref([]);\n  // 子表的信息\n  const subTable = reactive({\n    currentRowId: null,\n    loading: false,\n    pagination: { current: 1, pageSize: 200, pageSizeOptions: ['100', '200'], total: 0 },\n    selectedRows: [],\n    dataSource: [],\n    columns: [\n      { key: 'dd_num', title: '调度序号', width: '120px' },\n      { key: 'tug', title: '拖轮', width: '180px', type: JVxeTypes.input },\n      { key: 'work_start_time', title: '作业开始时间', width: '180px', type: JVxeTypes.input },\n      { key: 'work_stop_time', title: '作业结束时间', width: '180px', type: JVxeTypes.input },\n      { key: 'type', title: '船舶分类', width: '120px', type: JVxeTypes.input },\n      { key: 'port_area', title: '所属港区', minWidth: '120px', type: JVxeTypes.input },\n    ] as JVxeColumn[],\n  });\n\n  // form表单 col\n  const labelCol = reactive({ span: 4 });\n  const wrapperCol = reactive({ span: 20 });\n  const rules = reactive({\n    num: [{ required: true, message: '必须输入序号' }],\n  });\n\n  // 查询url地址\n  enum Api {\n    getData = '/mock/vxe/getData',\n  }\n\n  loadData();\n\n  // 加载数据\n  function loadData() {\n    // 封装查询条件\n    // 调用查询数据接口\n    loading.value = true;\n    defHttp\n      .get({\n        url: Api.getData,\n        params: {\n          pageNo: 1,\n          pageSize: 30,\n        },\n      })\n      .then((result) => {\n        // 将查询的数据赋值给 dataSource\n        dataSource.value = result.records;\n        // 重置选择\n        selectedRows.value = [];\n      })\n      .finally(() => {\n        // 这里是无论成功或失败都会执行的方法，在这里关闭loading\n        loading.value = false;\n      });\n  }\n\n  // 查询子表数据\n  function loadSubData(row) {\n    if (row) {\n      // 这里一定要做限制，限制不能重复查询，否者会出现死循环\n      if (subTable.currentRowId === row.id) {\n        return true;\n      }\n      subTable.currentRowId = row.id;\n      subTable.loading = true;\n      defHttp\n        .get({\n          url: Api.getData,\n          params: {\n            pageNo: 1,\n            pageSize: 30,\n            parentId: row.id,\n          },\n        })\n        .then((result) => {\n          // 将查询的数据赋值给 dataSource\n          subTable.dataSource = result.records;\n        })\n        .finally(() => {\n          // 这里是无论成功或失败都会执行的方法，在这里关闭loading\n          subTable.loading = false;\n        });\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  // 详细信息里点了确认按钮\n  function handleDetailsConfirm({ row, $table, callback }) {\n    console.log('保存的数据：', row);\n    // 校验当前行\n    $table.validate(row).then((errMap) => {\n      // 校验通过\n      if (!errMap) {\n        // 校验子表，如果需要的话，可以操作下面这个对象：\n        callback(true);\n        loading.value = true;\n        setTimeout(() => {\n          loading.value = false;\n          createMessage.success('保存成功');\n        }, 1000);\n      } else {\n        callback(false);\n        createMessage.warn('校验失败');\n      }\n    });\n  }\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JVxeTableDemo/func-demo/SocketReload.vue",
    "content": "<template>\n  <a-card title=\"无痕刷新示例\" :bordered=\"false\">\n    <div style=\"margin-bottom: 8px\">\n      <span>启用数据变动特效：</span>\n      <a-switch v-model:checked=\"reloadEffect\" />\n    </div>\n\n    <!--\n      【无痕刷新大体思路】：\n      1. 该功能依赖于【即时保存】功能，请先看即时保存示例\n      2. 必须要有 socket-reload 属性，且设为 true\n      3. 必须要有 socket-key 属性，该属性为当前表格的唯一标识，\n         系统会自动更新所有 socket-key 相同的表格\n      4. 在局部保存 edit-closed 事件中，\n         保存成功后调用 socketSendUpdateRow 方法，将当前 row 传递过去即可 （见第 102 行）\n    -->\n    <JVxeTable\n      ref=\"tableRef\"\n      rowNumber\n      rowSelection\n      keepSource\n      socketReload\n      socketKey=\"demo-socket-reload\"\n      :reloadEffect=\"reloadEffect\"\n      :height=\"340\"\n      :loading=\"loading\"\n      :columns=\"columns\"\n      :dataSource=\"dataSource\"\n      @valueChange=\"onValueChange\"\n      @edit-closed=\"handleEditClosed\"\n    />\n  </a-card>\n</template>\n\n<script lang=\"ts\" setup>\n  // 无痕刷新示例\n  import { ref } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { JVxeColumn, JVxeTableInstance, JVxeTypes } from '/@/components/jeecg/JVxeTable/types';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  const { createMessage } = useMessage();\n  const tableRef = ref<JVxeTableInstance>();\n  // 是否启用日历刷新效果\n  const reloadEffect = ref(true);\n  const loading = ref(false);\n  const dataSource = ref<Recordable[]>([]);\n  const columns = ref<JVxeColumn[]>([\n    { key: 'num', title: '序号', width: 80 },\n    { key: 'enabled', title: '启用', width: 80, type: JVxeTypes.checkbox },\n    { key: 'ship_name', title: '船名', width: 180, type: JVxeTypes.input },\n    { key: 'call', title: '呼叫', width: 80, type: JVxeTypes.input },\n    { key: 'len', title: '长', width: 80, type: JVxeTypes.input },\n    { key: 'ton', title: '吨', width: 120, type: JVxeTypes.input },\n    { key: 'payer', title: '付款方', width: 120, type: JVxeTypes.input },\n    { key: 'count', title: '数', width: 40 },\n    { key: 'company', title: '公司', minWidth: 180, type: JVxeTypes.input },\n    { key: 'trend', title: '动向', width: 120, type: JVxeTypes.input },\n  ]);\n\n  // 查询url地址\n  enum Api {\n    getData = '/mock/vxe/getData',\n  }\n\n  loadData();\n\n  // 加载数据\n  function loadData() {\n    loading.value = true;\n    defHttp\n      .get({\n        url: Api.getData,\n        params: { pageNo: 1, pageSize: 200 },\n      })\n      .then((result) => {\n        dataSource.value = result.records;\n      })\n      .finally(() => {\n        loading.value = false;\n      });\n  }\n\n  /** 单元格值变化时触发的事件 */\n  function onValueChange(event) {\n    switch (event.type) {\n      // 所有不能触发 editClosed 事件的组件，都需要定义在这里，可以安装你自己的业务需求来完善此处的case\n      case JVxeTypes.radio:\n      case JVxeTypes.checkbox:\n        doSendUpdateRow(event);\n        break;\n    }\n  }\n\n  // 单元格编辑完成之后触发的事件\n  function handleEditClosed(event) {\n    doSendUpdateRow(event);\n  }\n\n  // 发送变更行请求\n  function doSendUpdateRow(event) {\n    let { $table, row, column } = event;\n    let field = column.property;\n    // 判断单元格值是否被修改\n    if ($table.isUpdateByRow(row, field)) {\n      // 校验当前行\n      $table.validate(row).then((errMap) => {\n        // 校验通过\n        if (!errMap) {\n          // 【模拟保存】（此处需要替换成真实的请求）\n          let hideLoading = createMessage.loading(`正在保存\"${column.title}\"`, 0);\n          setTimeout(() => {\n            hideLoading();\n            createMessage.success(`\"${column.title}\"保存成功！`);\n            // 局部更新单元格为已保存状态\n            $table.reloadRow(row, null, field);\n            // 发送更新消息\n            tableRef.value?.socketSendUpdateRow(row);\n          }, 555);\n        }\n      });\n    }\n  }\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JVxeTableDemo/index.vue",
    "content": "<template>\n  <PageWrapper>\n    <a-card :bordered=\"false\">\n      <template #title>\n        <span> \n          JVXETable是专门为大数据和各种ERP风格的复杂操作研发的的高性能表格组件，底层采用vxe-table组件，可以完美弥补antd默认table性能不足问题。 \n          <a href=\"https://help.jeecg.com/component/JVxeTable.html\">API文档</a>\n        </span>\n      </template>\n    \n      <a-tabs defaultActiveKey=\"1\">\n        <a-tab-pane tab=\"基础示例\" key=\"1\">\n          <JVxeDemo1 />\n        </a-tab-pane>\n        <a-tab-pane tab=\"高级示例\" key=\"2\">\n          <JVxeDemo2 />\n        </a-tab-pane>\n        <a-tab-pane tab=\"排序示例\" key=\"3\">\n          <JVxeDemo3 />\n        </a-tab-pane>\n        <a-tab-pane tab=\"联动示例\" key=\"4\">\n          <JVxeDemo4 />\n        </a-tab-pane>\n        <a-tab-pane tab=\"键盘操作\" key=\"5\">\n          <JVxeDemo5 />\n        </a-tab-pane>\n      </a-tabs>\n    </a-card>\n  </PageWrapper>\n</template>\n\n<script lang=\"ts\" setup>\n  // noinspection ES6UnusedImports\n  import { PageWrapper } from '/@/components/Page';\n  import JVxeDemo1 from './JVxeDemo1.vue';\n  import JVxeDemo2 from './JVxeDemo2.vue';\n  import JVxeDemo3 from './JVxeDemo3.vue';\n  import JVxeDemo4 from './JVxeDemo4.vue';\n  import JVxeDemo5 from './JVxeDemo5.vue';\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JVxeTableDemo/layout-demo/ErpTemplate.vue",
    "content": "<template>\n  <a-card :bordered=\"false\">\n    <JVxeTable\n      toolbar\n      :toolbarConfig=\"toolbarConfig\"\n      rowNumber\n      rowSelection\n      rowSelectionType=\"radio\"\n      clickSelectRow\n      highlightCurrentRow\n      :height=\"tableHeight\"\n      :loading=\"table1.loading\"\n      :columns=\"table1.columns\"\n      :dataSource=\"table1.dataSource\"\n      :pagination=\"table1.pagination\"\n      :expandConfig=\"expandConfig\"\n      style=\"margin-bottom: 8px\"\n      @pageChange=\"handleTable1PageChange\"\n      @selectRowChange=\"handleTable1SelectRowChange\"\n    ></JVxeTable>\n\n    <a-tabs v-show=\"subTabs.show\" :class=\"{ 'sub-tabs': true, 'un-expand': !subTabs.expand }\">\n      <a-tab-pane tab=\"子表1\" key=\"1\">\n        <JVxeTable\n          toolbar\n          row-number\n          row-selection\n          height=\"auto\"\n          :maxHeight=\"350\"\n          :loading=\"table2.loading\"\n          :columns=\"table2.columns\"\n          :dataSource=\"table2.dataSource\"\n          :pagination=\"table2.pagination\"\n          @pageChange=\"handleTable2PageChange\"\n          @selectRowChange=\"handleTable2SelectRowChange\"\n        />\n      </a-tab-pane>\n      <a-tab-pane tab=\"子表2\" key=\"2\">\n        <h1>这里是子表2</h1>\n        <h1>这里是子表2</h1>\n        <h1>这里是子表2</h1>\n        <h1>这里是子表2</h1>\n        <h1>这里是子表2</h1>\n        <h1>这里是子表2</h1>\n      </a-tab-pane>\n    </a-tabs>\n  </a-card>\n</template>\n\n<script>\n  import { h } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { JVxeTypes } from '/@/components/jeecg/JVxeTable/types';\n  import { Button, Checkbox } from 'ant-design-vue';\n  import { UpOutlined, DownOutlined } from '@ant-design/icons-vue';\n\n  export default {\n    name: 'ErpTemplate',\n    data() {\n      return {\n        toolbarConfig: {\n          // prefix 前缀；suffix 后缀\n          slot: ['prefix', 'suffix'],\n          // add 新增按钮；remove 删除按钮；clearSelection 清空选择按钮\n          btn: ['add', 'remove', 'clearSelection'],\n        },\n\n        expandConfig: {\n          // 是否只能同时展开一行\n          accordion: true,\n        },\n\n        // 子表 tabs\n        subTabs: {\n          show: false,\n          // 是否展开\n          expand: true,\n          // 是否自动展开\n          autoExpand: true,\n        },\n\n        table1: {\n          // 是否正在加载\n          loading: false,\n          // 分页器参数\n          pagination: {\n            // 当前页码\n            current: 1,\n            // 每页的条数\n            pageSize: 200,\n            // 可切换的条数\n            pageSizeOptions: ['10', '20', '30', '100', '200'],\n            // 数据总数（目前并不知道真实的总数，所以先填写0，在后台查出来后再赋值）\n            total: 0,\n            showTotal: (total, range) => {\n              // 此处为 jsx 语法\n              let text = h('span', `${range[0]}-${range[1]} 共 ${total} 条`);\n              // 判断子表是否显示，如果显示就渲染展开收起按钮\n              if (this.subTabs.show) {\n                let expand = h('span', {}, [\n                  h(\n                    Button,\n                    {\n                      type: 'link',\n                      onClick: this.handleToggleTabs,\n                    },\n                    () => [this.subTabs.expand ? h(UpOutlined) : h(DownOutlined), h('span', {}, this.subTabs.expand ? '收起' : '展开')]\n                  ),\n                  h(\n                    Checkbox,\n                    {\n                      // h 写法不支持 v-model , 所以需要手动赋值\n                      checked: this.subTabs.autoExpand,\n                      'onUpdate:checked': (checked) => (this.subTabs.autoExpand = checked),\n                    },\n                    () => '自动展开'\n                  ),\n                ]);\n                // 返回多个dom用数组\n                return [expand, text];\n              } else {\n                // 直接返回单个dom\n                return text;\n              }\n            },\n          },\n          // 选择的行\n          selectedRows: [],\n          // 数据源，控制表格的数据\n          dataSource: [],\n          // 列配置，控制表格显示的列\n          columns: [\n            { key: 'num', title: '序号', width: '80px' },\n            {\n              // 字段key，跟后台数据的字段名匹配\n              key: 'ship_name',\n              // 列的标题\n              title: '船名',\n              // 列的宽度\n              width: '180px',\n              // 如果加上了该属性，就代表当前单元格是可编辑的，type就是表单的类型，input就是简单的输入框\n              type: JVxeTypes.input,\n            },\n            { key: 'call', title: '呼叫', width: '990px', type: JVxeTypes.input },\n            { key: 'len', title: '长', width: '80px', type: JVxeTypes.inputNumber },\n            { key: 'ton', title: '吨', width: '120px', type: JVxeTypes.inputNumber },\n            { key: 'payer', title: '付款方', width: '120px', type: JVxeTypes.input },\n            { key: 'count', title: '数', width: '40px' },\n            {\n              key: 'company',\n              title: '公司',\n              // 最小宽度，与宽度不同的是，这个不是固定的宽度，如果表格有多余的空间，会平均分配给设置了 minWidth 的列\n              // 如果要做占满表格的列可以这么写\n              minWidth: '180px',\n              type: JVxeTypes.input,\n            },\n            { key: 'trend', title: '动向', width: '120px', type: JVxeTypes.input },\n          ],\n        },\n        // 子级表的配置信息 （配置和主表的完全一致，就不写冗余的注释了）\n        table2: {\n          currentRowId: null,\n          loading: false,\n          pagination: { current: 1, pageSize: 10, pageSizeOptions: ['5', '10', '20', '30'], total: 0 },\n          selectedRows: [],\n          dataSource: [],\n          columns: [\n            { key: 'dd_num', title: '调度序号', width: '120px' },\n            { key: 'tug', title: '拖轮', width: '180px', type: JVxeTypes.input },\n            { key: 'work_start_time', title: '作业开始时间', width: '180px', type: JVxeTypes.input },\n            { key: 'work_stop_time', title: '作业结束时间', width: '180px', type: JVxeTypes.input },\n            { key: 'type', title: '船舶分类', width: '120px', type: JVxeTypes.input },\n            { key: 'port_area', title: '所属港区', width: '120px', type: JVxeTypes.input },\n          ],\n        },\n        currentSubRow: null,\n        // 查询url地址\n        url: {\n          getData: '/mock/vxe/getData',\n        },\n      };\n    },\n    computed: {\n      tableHeight() {\n        let { show, expand } = this.subTabs;\n        return show ? (expand ? 350 : 482) : 482;\n      },\n    },\n    created() {\n      this.loadTable1Data();\n    },\n    methods: {\n      // 加载table1【主表】的数据\n      loadTable1Data() {\n        // 封装查询条件\n        let formData = {\n          pageNo: this.table1.pagination.current,\n          pageSize: this.table1.pagination.pageSize,\n        };\n        // 调用查询数据接口\n        this.table1.loading = true;\n        defHttp\n          .get({\n            url: this.url.getData,\n            params: formData,\n          })\n          .then((result) => {\n            // 后台查询回来的 total，数据总数量\n            this.table1.pagination.total = result.total;\n            // 将查询的数据赋值给 dataSource\n            this.table1.dataSource = result.records;\n            // 重置选择\n            this.table1.selectedRows = [];\n          })\n          .finally(() => {\n            // 这里是无论成功或失败都会执行的方法，在这里关闭loading\n            this.table1.loading = false;\n          });\n      },\n\n      // 查询子表数据\n      loadSubData(row) {\n        if (row) {\n          // 这里一定要做限制，限制不能重复查询，否者会出现死循环\n          if (this.table2.currentRowId === row.id) {\n            return true;\n          }\n          this.table2.currentRowId = row.id;\n          this.loadTable2Data();\n          return true;\n        } else {\n          return false;\n        }\n      },\n      // 查询子表数据\n      loadTable2Data() {\n        let table2 = this.table2;\n        let formData = {\n          parentId: table2.currentRowId,\n          pageNo: this.table2.pagination.current,\n          pageSize: this.table2.pagination.pageSize,\n        };\n        table2.loading = true;\n        defHttp\n          .get({\n            url: this.url.getData,\n            params: formData,\n          })\n          .then((result) => {\n            // 将查询的数据赋值给 dataSource\n            table2.selectedRows = [];\n            table2.dataSource = result.records;\n            table2.pagination.total = result.total;\n          })\n          .finally(() => {\n            // 这里是无论成功或失败都会执行的方法，在这里关闭loading\n            table2.loading = false;\n          });\n      },\n\n      // table1【主表】当选择的行变化时触发的事件\n      handleTable1SelectRowChange(event) {\n        this.table1.selectedRows = event.selectedRows;\n        this.subTabs.show = true;\n        if (this.subTabs.autoExpand) {\n          this.subTabs.expand = true;\n        }\n        this.loadSubData(event.selectedRows[0]);\n      },\n      // table2【子表】当选择的行变化时触发的事件\n      handleTable2SelectRowChange(event) {\n        this.table2.selectedRows = event.selectedRows;\n      },\n\n      handleTable1PageChange(event) {\n        // 重新赋值\n        this.table1.pagination.current = event.current;\n        this.table1.pagination.pageSize = event.pageSize;\n        // 查询数据\n        this.loadTable1Data();\n      },\n      // 当table2【子表】分页参数变化时触发的事件\n      handleTable2PageChange(event) {\n        // 重新赋值\n        this.table2.pagination.current = event.current;\n        this.table2.pagination.pageSize = event.pageSize;\n        // 查询数据\n        this.loadTable2Data();\n      },\n\n      // 展开或收起子表tabs\n      handleToggleTabs() {\n        this.subTabs.expand = !this.subTabs.expand;\n      },\n    },\n  };\n</script>\n\n<style lang=\"less\" scoped>\n  .sub-tabs {\n    &.un-expand {\n      :deep(.ant-tabs-content) {\n        height: 0 !important;\n      }\n\n      :deep(.ant-tabs-nav) {\n        border-color: transparent !important;\n      }\n\n      :deep(.ant-tabs-ink-bar) {\n        background-color: transparent !important;\n      }\n\n      :deep(.ant-tabs-tab) {\n        display: none !important;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template1.vue",
    "content": "<template>\n  <a-card :bordered=\"false\">\n    <a-row :gutter=\"8\">\n      <!-- 这里是父级节点 -->\n      <a-col :span=\"24\" style=\"margin-bottom: 4px\">\n        <JVxeTable\n          toolbar\n          rowNumber\n          rowSelection\n          clickSelectRow\n          highlightCurrentRow\n          :radioConfig=\"{ highlight: false }\"\n          :checkboxConfig=\"{ highlight: false }\"\n          :height=\"340\"\n          :loading=\"table1.loading\"\n          :columns=\"table1.columns\"\n          :dataSource=\"table1.dataSource\"\n          :pagination=\"table1.pagination\"\n          @pageChange=\"handleTable1PageChange\"\n          @selectRowChange=\"handleTable1SelectRowChange\"\n        />\n      </a-col>\n      <!-- 这里是子级节点 -->\n      <a-col :span=\"12\">\n        <JVxeTable\n          toolbar\n          rowNumber\n          rowSelection\n          clickSelectRow\n          highlightCurrentRow\n          :radioConfig=\"{ highlight: false }\"\n          :checkboxConfig=\"{ highlight: false }\"\n          :height=\"340\"\n          :loading=\"table2.loading\"\n          :columns=\"table2.columns\"\n          :dataSource=\"table2.dataSource\"\n          :pagination=\"table2.pagination\"\n          @pageChange=\"handleTable2PageChange\"\n          @selectRowChange=\"handleTable2SelectRowChange\"\n        >\n        </JVxeTable>\n      </a-col>\n      <!-- 这里是孙级节点 -->\n      <a-col :span=\"12\">\n        <JVxeTable\n          toolbar\n          rowNumber\n          rowSelection\n          :height=\"340\"\n          :loading=\"table3.loading\"\n          :columns=\"table3.columns\"\n          :dataSource=\"table3.dataSource\"\n          :pagination=\"table3.pagination\"\n          @pageChange=\"handleTable3PageChange\"\n        >\n        </JVxeTable>\n      </a-col>\n    </a-row>\n  </a-card>\n</template>\n\n<script>\n  import { defHttp } from '/@/utils/http/axios';\n  import { JVxeTypes } from '/@/components/jeecg/JVxeTable/types';\n\n  // 【多种布局模板】上面父、左下子、右下孙\n  export default {\n    name: 'Template1',\n    data() {\n      return {\n        table1: {\n          // 是否正在加载\n          loading: false,\n          // 分页器参数\n          pagination: {\n            // 当前页码\n            current: 1,\n            // 每页的条数\n            pageSize: 200,\n            // 可切换的条数\n            pageSizeOptions: ['10', '20', '30', '100', '200'],\n            // 数据总数（目前并不知道真实的总数，所以先填写0，在后台查出来后再赋值）\n            total: 0,\n          },\n          // 最后选中的行\n          lastRow: null,\n          // 选择的行\n          selectedRows: [],\n          // 数据源，控制表格的数据\n          dataSource: [],\n          // 列配置，控制表格显示的列\n          columns: [\n            { key: 'num', title: '序号', width: '80px' },\n            {\n              // 字段key，跟后台数据的字段名匹配\n              key: 'ship_name',\n              // 列的标题\n              title: '船名',\n              // 列的宽度\n              width: '180px',\n              // 如果加上了该属性，就代表当前单元格是可编辑的，type就是表单的类型，input就是简单的输入框\n              type: JVxeTypes.input,\n              formatter({ cellValue, row, column }) {\n                let foo = '';\n                if (row.company === '佧伒侾佯有限公司') {\n                  foo += '-233';\n                }\n                return cellValue + foo;\n              },\n            },\n            { key: 'call', title: '呼叫', width: '80px', type: JVxeTypes.input },\n            { key: 'len', title: '长', width: '80px', type: JVxeTypes.inputNumber },\n            { key: 'ton', title: '吨', width: '120px', type: JVxeTypes.inputNumber },\n            { key: 'payer', title: '付款方', width: '120px', type: JVxeTypes.input },\n            { key: 'count', title: '数', width: '40px' },\n            {\n              key: 'company',\n              title: '公司',\n              // 最小宽度，与宽度不同的是，这个不是固定的宽度，如果表格有多余的空间，会平均分配给设置了 minWidth 的列\n              // 如果要做占满表格的列可以这么写\n              minWidth: '180px',\n              type: JVxeTypes.input,\n            },\n            { key: 'trend', title: '动向', width: '120px', type: JVxeTypes.input },\n          ],\n        },\n        // 子级表的配置信息 （配置和主表的完全一致，就不写冗余的注释了）\n        table2: {\n          loading: false,\n          pagination: { current: 1, pageSize: 200, pageSizeOptions: ['100', '200'], total: 0 },\n          // 最后选中的行\n          lastRow: null,\n          selectedRows: [],\n          dataSource: [],\n          columns: [\n            { key: 'dd_num', title: '调度序号', width: '120px' },\n            { key: 'tug', title: '拖轮', width: '180px', type: JVxeTypes.input },\n            { key: 'work_start_time', title: '作业开始时间', width: '180px', type: JVxeTypes.input },\n            { key: 'work_stop_time', title: '作业结束时间', width: '180px', type: JVxeTypes.input },\n            { key: 'type', title: '船舶分类', width: '120px', type: JVxeTypes.input },\n            { key: 'port_area', title: '所属港区', width: '120px', type: JVxeTypes.input },\n          ],\n        },\n        // 孙级表的配置信息 （配置和主表的完全一致，就不写冗余的注释了）\n        table3: {\n          loading: false,\n          pagination: { current: 1, pageSize: 200, pageSizeOptions: ['100', '200'], total: 0 },\n          selectedRows: [],\n          dataSource: [],\n          columns: [\n            { key: 'dd_num', title: '调度序号', width: '120px' },\n            { key: 'tug', title: '拖轮', width: '120px', type: JVxeTypes.input },\n            { key: 'power', title: '马力', width: '120px', type: JVxeTypes.input },\n            { key: 'nature', title: '性质', width: '120px', type: JVxeTypes.input },\n            { key: 'departure_time', title: '发船时间', width: '180px', type: JVxeTypes.input },\n          ],\n        },\n        // 查询url地址\n        url: {\n          getData: '/mock/vxe/getData',\n        },\n      };\n    },\n    // 监听器\n    watch: {\n      // 监听table1 【主表】选择的数据发生了变化\n      ['table1.lastRow'](row) {\n        this.loadTable2Data();\n      },\n      // 监听table2 【子表】选择的数据发生了变化\n      ['table2.lastRow']() {\n        this.loadTable3Data();\n      },\n    },\n    created() {\n      this.loadTable1Data();\n    },\n    methods: {\n      // 加载table1【主表】的数据\n      loadTable1Data() {\n        // 封装查询条件\n        let formData = {\n          pageNo: this.table1.pagination.current,\n          pageSize: this.table1.pagination.pageSize,\n        };\n        // 调用查询数据接口\n        this.table1.loading = true;\n        defHttp\n          .get({\n            url: this.url.getData,\n            params: formData,\n          })\n          .then((result) => {\n            // 后台查询回来的 total，数据总数量\n            this.table1.pagination.total = result.total;\n            // 将查询的数据赋值给 dataSource\n            this.table1.dataSource = result.records;\n            // 重置选择\n            this.table1.selectedRows = [];\n          })\n          .finally(() => {\n            // 这里是无论成功或失败都会执行的方法，在这里关闭loading\n            this.table1.loading = false;\n          });\n      },\n\n      // 当table1【主表】分页参数变化时触发的事件\n      handleTable1PageChange(event) {\n        // 重新赋值\n        this.table1.pagination.current = event.current;\n        this.table1.pagination.pageSize = event.pageSize;\n        // 查询数据\n        this.loadTable1Data();\n      },\n\n      // table1【主表】当选择的行变化时触发的事件\n      handleTable1SelectRowChange(event) {\n        this.handleTableSelectRowChange(this.table1, event);\n      },\n\n      // 加载table2【子表】的数据，根据主表的id进行查询\n      loadTable2Data() {\n        // 如果主表没有选择，则不查询\n        let selectedRows = this.table1.selectedRows;\n        if (!selectedRows || selectedRows.length === 0) {\n          this.table2.pagination.total = 0;\n          this.table2.dataSource = [];\n          this.table2.selectedRows = [];\n          return;\n        } else if (this.table1.lastRow == null) {\n          this.table1.lastRow = selectedRows[selectedRows.length - 1];\n        }\n        let formData = {\n          parentId: this.table1.lastRow.id,\n          pageNo: this.table2.pagination.current,\n          pageSize: this.table2.pagination.pageSize,\n        };\n        this.table2.loading = true;\n        defHttp\n          .get({\n            url: this.url.getData,\n            params: formData,\n          })\n          .then((result) => {\n            this.table2.pagination.total = result.total;\n            this.table2.dataSource = result.records;\n            this.table2.selectedRows = [];\n          })\n          .finally(() => {\n            this.table2.loading = false;\n          });\n      },\n\n      // table2【子表】当选择的行变化时触发的事件\n      handleTable2SelectRowChange(event) {\n        this.handleTableSelectRowChange(this.table2, event);\n      },\n\n      // 当table2【子表】分页参数变化时触发的事件\n      handleTable2PageChange(event) {\n        // 重新赋值\n        this.table2.pagination.current = event.current;\n        this.table2.pagination.pageSize = event.pageSize;\n        // 查询数据\n        this.loadTable2Data();\n      },\n\n      // 加载table3【孙表】的数据，根据子表的id进行查询\n      loadTable3Data() {\n        // 如果主表没有选择，则不查询\n        let selectedRows = this.table2.selectedRows;\n        if (!selectedRows || selectedRows.length === 0) {\n          this.table3.pagination.total = 0;\n          this.table3.dataSource = [];\n          this.table3.selectedRows = [];\n          return;\n        } else if (this.table2.lastRow == null) {\n          this.table2.lastRow = selectedRows[selectedRows.length - 1];\n        }\n        let formData = {\n          parentId: this.table2.lastRow.id,\n          pageNo: this.table3.pagination.current,\n          pageSize: this.table3.pagination.pageSize,\n        };\n        this.table3.loading = true;\n        defHttp\n          .get({\n            url: this.url.getData,\n            params: formData,\n          })\n          .then((result) => {\n            this.table3.pagination.total = result.total;\n            this.table3.dataSource = result.records;\n          })\n          .finally(() => {\n            this.table3.loading = false;\n          });\n      },\n      // 当table3【孙表】分页参数变化时触发的事件\n      handleTable3PageChange(event) {\n        // 重新赋值\n        this.table3.pagination.current = event.current;\n        this.table3.pagination.pageSize = event.pageSize;\n        // 查询数据\n        this.loadTable3Data();\n      },\n\n      /** 公共方法：处理表格选中变化事件 */\n      handleTableSelectRowChange(table, event) {\n        let { row, action, selectedRows, $table } = event;\n        // 获取最后一个选中的\n        let lastSelected = selectedRows[selectedRows.length - 1];\n        if (action === 'selected') {\n          table.lastRow = row;\n        } else if (action === 'selected-all') {\n          // 取消全选\n          if (selectedRows.length === 0) {\n            table.lastRow = null;\n          } else if (!table.lastRow) {\n            table.lastRow = lastSelected;\n          }\n        } else if (action === 'unselected' && row === table.lastRow) {\n          table.lastRow = lastSelected;\n        }\n        $table.setCurrentRow(table.lastRow);\n        table.selectedRows = selectedRows;\n      },\n    },\n  };\n</script>\n\n<style lang=\"less\"></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template2.vue",
    "content": "<template>\n  <a-card :bordered=\"false\">\n    <a-row :gutter=\"8\">\n      <!-- 左侧父 -->\n      <a-col :span=\"12\">\n        <JVxeTable\n          toolbar\n          rowNumber\n          rowSelection\n          clickSelectRow\n          highlightCurrentRow\n          :radioConfig=\"{ highlight: false }\"\n          :checkboxConfig=\"{ highlight: false }\"\n          :height=\"790\"\n          :loading=\"table1.loading\"\n          :columns=\"table1.columns\"\n          :dataSource=\"table1.dataSource\"\n          :pagination=\"table1.pagination\"\n          @pageChange=\"handleTable1PageChange\"\n          @selectRowChange=\"handleTable1SelectRowChange\"\n        />\n      </a-col>\n      <a-col :span=\"12\">\n        <!-- 左侧选择的数据展示在这里 -->\n        <JVxeTable rowNumber :height=\"375\" :columns=\"table1.columns\" :dataSource=\"table1.selectedRows\" style=\"margin: 52px 0 8px\" />\n\n        <!-- 右下子 -->\n        <JVxeTable\n          toolbar\n          rowNumber\n          rowSelection\n          clickSelectRow\n          :height=\"355\"\n          :loading=\"table2.loading\"\n          :columns=\"table2.columns\"\n          :dataSource=\"table2.dataSource\"\n          :pagination=\"table2.pagination\"\n          @pageChange=\"handleTable2PageChange\"\n          @selectRowChange=\"handleTable2SelectRowChange\"\n        />\n      </a-col>\n    </a-row>\n  </a-card>\n</template>\n\n<script>\n  import { defHttp } from '/@/utils/http/axios';\n  import { JVxeTypes } from '/@/components/jeecg/JVxeTable/types';\n\n  // 【多种布局模板】 左边选择后，记录选到右侧，右侧是父、子\n  export default {\n    name: 'Template2',\n    data() {\n      return {\n        table1: {\n          // 是否正在加载\n          loading: false,\n          // 分页器参数\n          pagination: {\n            // 当前页码\n            current: 1,\n            // 每页的条数\n            pageSize: 200,\n            // 可切换的条数\n            pageSizeOptions: ['10', '20', '30', '100', '200'],\n            // 数据总数（目前并不知道真实的总数，所以先填写0，在后台查出来后再赋值）\n            total: 0,\n          },\n          // 最后选中的行\n          lastRow: null,\n          // 选择的行\n          selectedRows: [],\n          // 数据源，控制表格的数据\n          dataSource: [],\n          // 列配置，控制表格显示的列\n          columns: [\n            { key: 'num', title: '序号', width: '80px' },\n            {\n              // 字段key，跟后台数据的字段名匹配\n              key: 'ship_name',\n              // 列的标题\n              title: '船名',\n              // 列的宽度\n              width: '180px',\n              // 如果加上了该属性，就代表当前单元格是可编辑的，type就是表单的类型，input就是简单的输入框\n              type: JVxeTypes.input,\n            },\n            { key: 'call', title: '呼叫', width: '80px', type: JVxeTypes.input },\n            { key: 'len', title: '长', width: '80px', type: JVxeTypes.input },\n            { key: 'ton', title: '吨', width: '120px', type: JVxeTypes.input },\n            { key: 'payer', title: '付款方', width: '120px', type: JVxeTypes.input },\n            { key: 'count', title: '数', width: '40px' },\n            {\n              key: 'company',\n              title: '公司',\n              // 最小宽度，与宽度不同的是，这个不是固定的宽度，如果表格有多余的空间，会平均分配给设置了 minWidth 的列\n              // 如果要做占满表格的列可以这么写\n              minWidth: '180px',\n              type: JVxeTypes.input,\n            },\n            { key: 'trend', title: '动向', width: '120px', type: JVxeTypes.input },\n          ],\n        },\n        // 子级表的配置信息 （配置和主表的完全一致，就不写冗余的注释了）\n        table2: {\n          loading: false,\n          pagination: { current: 1, pageSize: 200, pageSizeOptions: ['100', '200'], total: 0 },\n          selectedRows: [],\n          dataSource: [],\n          columns: [\n            { key: 'dd_num', title: '调度序号', width: '120px' },\n            { key: 'tug', title: '拖轮', width: '180px', type: JVxeTypes.input },\n            { key: 'work_start_time', title: '作业开始时间', width: '180px', type: JVxeTypes.input },\n            { key: 'work_stop_time', title: '作业结束时间', width: '180px', type: JVxeTypes.input },\n            { key: 'type', title: '船舶分类', width: '120px', type: JVxeTypes.input },\n            { key: 'port_area', title: '所属港区', width: '120px', type: JVxeTypes.input },\n          ],\n        },\n        // 查询url地址\n        url: {\n          getData: '/mock/vxe/getData',\n        },\n      };\n    },\n    // 监听器\n    watch: {\n      // 监听table1 【主表】选择的数据发生了变化\n      ['table1.lastRow']() {\n        this.loadTable2Data();\n      },\n    },\n    created() {\n      this.loadTable1Data();\n    },\n    methods: {\n      // 加载table1【主表】的数据\n      loadTable1Data() {\n        // 封装查询条件\n        let formData = {\n          pageNo: this.table1.pagination.current,\n          pageSize: this.table1.pagination.pageSize,\n        };\n        // 调用查询数据接口\n        this.table1.loading = true;\n        defHttp\n          .get({\n            url: this.url.getData,\n            params: formData,\n          })\n          .then((result) => {\n            // 后台查询回来的 total，数据总数量\n            this.table1.pagination.total = result.total;\n            // 将查询的数据赋值给 dataSource\n            this.table1.dataSource = result.records;\n            // 重置选择\n            this.table1.selectedRows = [];\n          })\n          .finally(() => {\n            // 这里是无论成功或失败都会执行的方法，在这里关闭loading\n            this.table1.loading = false;\n          });\n      },\n\n      // 加载table2【子表】的数据，根据主表的id进行查询\n      loadTable2Data() {\n        // 如果主表没有选择，则不查询\n        let selectedRows = this.table1.selectedRows;\n        if (!selectedRows || selectedRows.length === 0) {\n          this.table2.pagination.total = 0;\n          this.table2.dataSource = [];\n          this.table2.selectedRows = [];\n          return;\n        } else if (this.table1.lastRow == null) {\n          this.table1.lastRow = selectedRows[selectedRows.length - 1];\n        }\n        let formData = {\n          parentId: this.table1.lastRow.id,\n          pageNo: this.table2.pagination.current,\n          pageSize: this.table2.pagination.pageSize,\n        };\n        this.table2.loading = true;\n        defHttp\n          .get({\n            url: this.url.getData,\n            params: formData,\n          })\n          .then((result) => {\n            this.table2.pagination.total = result.total;\n            this.table2.dataSource = result.records;\n            this.table2.selectedRows = [];\n          })\n          .finally(() => {\n            this.table2.loading = false;\n          });\n      },\n\n      // table1【主表】当选择的行变化时触发的事件\n      handleTable1SelectRowChange(event) {\n        this.handleTableSelectRowChange(this.table1, event);\n      },\n\n      // table2【子表】当选择的行变化时触发的事件\n      handleTable2SelectRowChange(event) {\n        this.table2.selectedRows = event.selectedRows;\n      },\n\n      // 当table1【主表】分页参数变化时触发的事件\n      handleTable1PageChange(event) {\n        // 重新赋值\n        this.table1.pagination.current = event.current;\n        this.table1.pagination.pageSize = event.pageSize;\n        // 查询数据\n        this.loadTable1Data();\n      },\n\n      // 当table2【子表】分页参数变化时触发的事件\n      handleTable2PageChange(event) {\n        // 重新赋值\n        this.table2.pagination.current = event.current;\n        this.table2.pagination.pageSize = event.pageSize;\n        // 查询数据\n        this.loadTable2Data();\n      },\n\n      /** 公共方法：处理表格选中变化事件 */\n      handleTableSelectRowChange(table, event) {\n        let { row, action, selectedRows, $table } = event;\n        // 获取最后一个选中的\n        let lastSelected = selectedRows[selectedRows.length - 1];\n        if (action === 'selected') {\n          table.lastRow = row;\n        } else if (action === 'selected-all') {\n          // 取消全选\n          if (selectedRows.length === 0) {\n            table.lastRow = null;\n          } else if (!table.lastRow) {\n            table.lastRow = lastSelected;\n          }\n        } else if (action === 'unselected' && row === table.lastRow) {\n          table.lastRow = lastSelected;\n        }\n        $table.setCurrentRow(table.lastRow);\n        table.selectedRows = selectedRows;\n      },\n    },\n  };\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template3.vue",
    "content": "<template>\n  <a-card :bordered=\"false\">\n    <a-row :gutter=\"8\">\n      <a-col :span=\"12\">\n        <!-- 左上父 -->\n        <JVxeTable\n          toolbar\n          rowNumber\n          rowSelection\n          clickSelectRow\n          highlightCurrentRow\n          :radioConfig=\"{ highlight: false }\"\n          :checkboxConfig=\"{ highlight: false }\"\n          :height=\"357\"\n          :loading=\"table1.loading\"\n          :columns=\"table1.columns\"\n          :dataSource=\"table1.dataSource\"\n          :pagination=\"table1.pagination\"\n          style=\"margin-bottom: 8px\"\n          @pageChange=\"handleTable1PageChange\"\n          @selectRowChange=\"handleTable1SelectRowChange\"\n        />\n\n        <!-- 左下子 -->\n        <JVxeTable\n          toolbar\n          rowNumber\n          rowSelection\n          clickSelectRow\n          :height=\"356\"\n          :loading=\"table2.loading\"\n          :columns=\"table2.columns\"\n          :dataSource=\"table2.dataSource\"\n          :pagination=\"table2.pagination\"\n          @pageChange=\"handleTable2PageChange\"\n        />\n      </a-col>\n      <!-- 左侧父选择的数据展示在这里 -->\n      <a-col :span=\"12\">\n        <JVxeTable rowNumber :height=\"812\" :columns=\"table1.columns\" :dataSource=\"table1.selectedRows\" style=\"margin-top: 52px\" />\n      </a-col>\n    </a-row>\n  </a-card>\n</template>\n\n<script>\n  import { defHttp } from '/@/utils/http/axios';\n  import { JVxeTypes } from '/@/components/jeecg/JVxeTable/types';\n\n  // 【多种布局模板】左侧上边是主表、下边是子表，右侧是选中数据\n  export default {\n    name: 'Template3',\n    components: {},\n    data() {\n      return {\n        // 主表的配置信息\n        table1: {\n          // 是否正在加载\n          loading: false,\n          // 分页器参数\n          pagination: {\n            // 当前页码\n            current: 1,\n            // 每页的条数\n            pageSize: 200,\n            // 可切换的条数\n            pageSizeOptions: ['10', '20', '30', '100', '200'],\n            // 数据总数（目前并不知道真实的总数，所以先填写0，在后台查出来后再赋值）\n            total: 0,\n          },\n          // 最后选中的行\n          lastRow: null,\n          // 选择的行\n          selectedRows: [],\n          // 数据源，控制表格的数据\n          dataSource: [],\n          // 列配置，控制表格显示的列\n          columns: [\n            { key: 'num', title: '序号', width: '80px' },\n            {\n              // 字段key，跟后台数据的字段名匹配\n              key: 'ship_name',\n              // 列的标题\n              title: '船名',\n              // 列的宽度\n              width: '180px',\n              // 如果加上了该属性，就代表当前单元格是可编辑的，type就是表单的类型，input就是简单的输入框\n              type: JVxeTypes.input,\n            },\n            { key: 'call', title: '呼叫', width: '80px', type: JVxeTypes.input },\n            { key: 'len', title: '长', width: '80px', type: JVxeTypes.input },\n            { key: 'ton', title: '吨', width: '120px', type: JVxeTypes.input },\n            { key: 'payer', title: '付款方', width: '120px', type: JVxeTypes.input },\n            { key: 'count', title: '数', width: '40px' },\n            { key: 'company', title: '公司', width: '180px', type: JVxeTypes.input },\n            { key: 'trend', title: '动向', width: '120px', type: JVxeTypes.input },\n          ],\n        },\n        // 子表的配置信息 （配置和主表的完全一致，就不写冗余的注释了）\n        table2: {\n          loading: false,\n          pagination: { current: 1, pageSize: 200, pageSizeOptions: ['100', '200'], total: 0 },\n          dataSource: [],\n          columns: [\n            { key: 'dd_num', title: '调度序号', width: '120px' },\n            { key: 'tug', title: '拖轮', width: '180px', type: JVxeTypes.input },\n            { key: 'work_start_time', title: '作业开始时间', width: '180px', type: JVxeTypes.input },\n            { key: 'work_stop_time', title: '作业结束时间', width: '180px', type: JVxeTypes.input },\n            { key: 'type', title: '船舶分类', width: '120px', type: JVxeTypes.input },\n            { key: 'port_area', title: '所属港区', width: '120px', type: JVxeTypes.input },\n          ],\n        },\n        // 查询url地址\n        url: {\n          getData: '/mock/vxe/getData',\n        },\n      };\n    },\n\n    // 监听器\n    watch: {\n      // 监听table1 【主表】选择的数据发生了变化\n      ['table1.lastRow'](row) {\n        this.loadTable2Data();\n      },\n    },\n    created() {\n      this.loadTable1Data();\n    },\n    methods: {\n      // 加载table1（主表）的数据\n      loadTable1Data() {\n        // 封装查询条件\n        let formData = {\n          pageNo: this.table1.pagination.current,\n          pageSize: this.table1.pagination.pageSize,\n        };\n        // 调用查询数据接口\n        this.table1.loading = true;\n        defHttp\n          .get({\n            url: this.url.getData,\n            params: formData,\n          })\n          .then((result) => {\n            // 后台查询回来的 total，数据总数量\n            this.table1.pagination.total = result.total;\n            // 将查询的数据赋值给 dataSource\n            this.table1.dataSource = result.records;\n          })\n          .finally(() => {\n            // 这里是无论成功或失败都会执行的方法，在这里关闭loading\n            this.table1.loading = false;\n          });\n      },\n      // 加载table2（子表）的数据，根据主表的id进行查询\n      loadTable2Data() {\n        // 如果主表没有选择，则不查询\n        let selectedRows = this.table1.selectedRows;\n        if (!selectedRows || selectedRows.length === 0) {\n          this.table2.pagination.total = 0;\n          this.table2.dataSource = [];\n          return;\n        } else if (this.table1.lastRow == null) {\n          this.table1.lastRow = selectedRows[selectedRows.length - 1];\n        }\n        let formData = {\n          parentId: this.table1.lastRow.id,\n          pageNo: this.table2.pagination.current,\n          pageSize: this.table2.pagination.pageSize,\n        };\n        this.table2.loading = true;\n        defHttp\n          .get({\n            url: this.url.getData,\n            params: formData,\n          })\n          .then((result) => {\n            this.table2.pagination.total = result.total;\n            this.table2.dataSource = result.records;\n          })\n          .finally(() => {\n            this.table2.loading = false;\n          });\n      },\n\n      // table1【主表】当分页参数变化时触发的事件\n      handleTable1PageChange(event) {\n        // 重新赋值\n        this.table1.pagination.current = event.current;\n        this.table1.pagination.pageSize = event.pageSize;\n        // 查询数据\n        this.loadTable1Data();\n        // 分页后重置选择\n        this.table1.selectedRows = [];\n        this.loadTable2Data();\n      },\n\n      // table2【子表】当分页参数变化时触发的事件\n      handleTable2PageChange(event) {\n        // 重新赋值\n        this.table1.pagination.current = event.current;\n        this.table1.pagination.pageSize = event.pageSize;\n        // 查询数据\n        this.loadTable2Data();\n      },\n\n      // table1【主表】当选择的行变化时触发的事件\n      handleTable1SelectRowChange(event) {\n        this.handleTableSelectRowChange(this.table1, event);\n      },\n\n      /** 公共方法：处理表格选中变化事件 */\n      handleTableSelectRowChange(table, event) {\n        let { row, action, selectedRows, $table } = event;\n        // 获取最后一个选中的\n        let lastSelected = selectedRows[selectedRows.length - 1];\n        if (action === 'selected') {\n          table.lastRow = row;\n        } else if (action === 'selected-all') {\n          // 取消全选\n          if (selectedRows.length === 0) {\n            table.lastRow = null;\n          } else if (!table.lastRow) {\n            table.lastRow = lastSelected;\n          }\n        } else if (action === 'unselected' && row === table.lastRow) {\n          table.lastRow = lastSelected;\n        }\n        $table.setCurrentRow(table.lastRow);\n        table.selectedRows = selectedRows;\n      },\n    },\n  };\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template4.vue",
    "content": "<template>\n  <a-card :bordered=\"false\">\n    <a-row :gutter=\"8\">\n      <a-col :span=\"12\">\n        <!-- 左上父 -->\n        <JVxeTable\n          toolbar\n          rowNumber\n          rowSelection\n          clickSelectRow\n          highlightCurrentRow\n          :radioConfig=\"{ highlight: false }\"\n          :checkboxConfig=\"{ highlight: false }\"\n          :height=\"340\"\n          :loading=\"table1.loading\"\n          :columns=\"table1.columns\"\n          :dataSource=\"table1.dataSource\"\n          :pagination=\"table1.pagination\"\n          style=\"margin-bottom: 8px\"\n          @pageChange=\"handleTable1PageChange\"\n          @selectRowChange=\"handleTable1SelectRowChange\"\n        />\n        <!-- 左下子 -->\n        <JVxeTable\n          toolbar\n          rowNumber\n          rowSelection\n          clickSelectRow\n          :height=\"350\"\n          :loading=\"table2.loading\"\n          :columns=\"table2.columns\"\n          :dataSource=\"table2.dataSource\"\n          :pagination=\"table2.pagination\"\n          @pageChange=\"handleTable2PageChange\"\n        />\n      </a-col>\n      <!-- 左侧父选择的数据展示在这里 -->\n      <a-col :span=\"12\">\n        <!-- 右上父 -->\n        <JVxeTable\n          rowNumber\n          rowSelection\n          clickSelectRow\n          highlightCurrentRow\n          :radioConfig=\"{ highlight: false }\"\n          :checkboxConfig=\"{ highlight: false }\"\n          :height=\"340\"\n          :columns=\"table1.columns\"\n          :dataSource=\"table1.selectedRows\"\n          style=\"margin: 52px 0 8px\"\n          @selectRowChange=\"handleTable3SelectRowChange\"\n        />\n        <!-- 右下子 -->\n        <JVxeTable\n          toolbar\n          rowNumber\n          rowSelection\n          clickSelectRow\n          :height=\"350\"\n          :loading=\"table4.loading\"\n          :columns=\"table4.columns\"\n          :dataSource=\"table4.dataSource\"\n          :pagination=\"table4.pagination\"\n          style=\"margin: 48px 0 0\"\n        />\n      </a-col>\n    </a-row>\n  </a-card>\n</template>\n\n<script>\n  import { defHttp } from '/@/utils/http/axios';\n  import { JVxeTypes } from '/@/components/jeecg/JVxeTable/types';\n\n  export default {\n    name: 'Template4',\n    data() {\n      return {\n        table1: {\n          // 是否正在加载\n          loading: false,\n          // 分页器参数\n          pagination: {\n            // 当前页码\n            current: 1,\n            // 每页的条数\n            pageSize: 200,\n            // 可切换的条数\n            pageSizeOptions: ['10', '20', '30', '100', '200'],\n            // 数据总数（目前并不知道真实的总数，所以先填写0，在后台查出来后再赋值）\n            total: 0,\n          },\n          // 最后选中的行\n          lastRow: null,\n          // 选择的行\n          selectedRows: [],\n          // 数据源，控制表格的数据\n          dataSource: [],\n          // 列配置，控制表格显示的列\n          columns: [\n            { key: 'num', title: '序号', width: '80px' },\n            {\n              // 字段key，跟后台数据的字段名匹配\n              key: 'ship_name',\n              // 列的标题\n              title: '船名',\n              // 列的宽度\n              width: '180px',\n              // 如果加上了该属性，就代表当前单元格是可编辑的，type就是表单的类型，input就是简单的输入框\n              type: JVxeTypes.input,\n            },\n            { key: 'call', title: '呼叫', width: '80px', type: JVxeTypes.input },\n            { key: 'len', title: '长', width: '80px', type: JVxeTypes.input },\n            { key: 'ton', title: '吨', width: '120px', type: JVxeTypes.input },\n            { key: 'payer', title: '付款方', width: '120px', type: JVxeTypes.input },\n            { key: 'count', title: '数', width: '40px' },\n            {\n              key: 'company',\n              title: '公司',\n              // 最小宽度，与宽度不同的是，这个不是固定的宽度，如果表格有多余的空间，会平均分配给设置了 minWidth 的列\n              // 如果要做占满表格的列可以这么写\n              minWidth: '180px',\n              type: JVxeTypes.input,\n            },\n            { key: 'trend', title: '动向', width: '120px', type: JVxeTypes.input },\n          ],\n        },\n        // 子级表的配置信息 （配置和主表的完全一致，就不写冗余的注释了）\n        table2: {\n          loading: false,\n          pagination: { current: 1, pageSize: 200, pageSizeOptions: ['100', '200'], total: 0 },\n          selectedRows: [],\n          dataSource: [],\n          columns: [\n            { key: 'dd_num', title: '调度序号', width: '120px' },\n            { key: 'tug', title: '拖轮', width: '180px', type: JVxeTypes.input },\n            { key: 'work_start_time', title: '作业开始时间', width: '180px', type: JVxeTypes.input },\n            { key: 'work_stop_time', title: '作业结束时间', width: '180px', type: JVxeTypes.input },\n            { key: 'type', title: '船舶分类', width: '120px', type: JVxeTypes.input },\n            { key: 'port_area', title: '所属港区', width: '120px', type: JVxeTypes.input },\n          ],\n        },\n        table3: {\n          // 最后选中的行\n          lastRow: null,\n          // 选择的行\n          selectedRows: [],\n        },\n        table4: {\n          loading: false,\n          pagination: { current: 1, pageSize: 200, pageSizeOptions: ['100', '200'], total: 0 },\n          selectedRows: [],\n          dataSource: [],\n          columns: [\n            { key: 'dd_num', title: '调度序号', width: '120px' },\n            { key: 'tug', title: '拖轮', width: '180px', type: JVxeTypes.input },\n            { key: 'work_start_time', title: '作业开始时间', width: '180px', type: JVxeTypes.input },\n            { key: 'work_stop_time', title: '作业结束时间', width: '180px', type: JVxeTypes.input },\n            { key: 'type', title: '船舶分类', width: '120px', type: JVxeTypes.input },\n            { key: 'port_area', title: '所属港区', width: '120px', type: JVxeTypes.input },\n          ],\n        },\n        // 查询url地址\n        url: {\n          getData: '/mock/vxe/getData',\n        },\n      };\n    },\n    // 监听器\n    watch: {\n      // 监听table1 左上【主表】选择的数据发生了变化\n      ['table1.lastRow']() {\n        this.loadTable2Data();\n      },\n      // 监听table3 右上【主表】选择的数据发生了变化\n      ['table3.lastRow']() {\n        this.loadTable4Data();\n      },\n    },\n    created() {\n      this.loadTable1Data();\n    },\n    methods: {\n      // 加载table1左上【主表】的数据\n      loadTable1Data() {\n        // 封装查询条件\n        let formData = {\n          pageNo: this.table1.pagination.current,\n          pageSize: this.table1.pagination.pageSize,\n        };\n        // 调用查询数据接口\n        this.table1.loading = true;\n        defHttp\n          .get({\n            url: this.url.getData,\n            params: formData,\n          })\n          .then((result) => {\n            // 后台查询回来的 total，数据总数量\n            this.table1.pagination.total = result.total;\n            // 将查询的数据赋值给 dataSource\n            this.table1.dataSource = result.records;\n            // 重置选择\n            this.table1.selectedRows = [];\n          })\n          .finally(() => {\n            // 这里是无论成功或失败都会执行的方法，在这里关闭loading\n            this.table1.loading = false;\n          });\n      },\n\n      // 当table1左上【主表】分页参数变化时触发的事件\n      handleTable1PageChange(event) {\n        // 重新赋值\n        this.table1.pagination.current = event.current;\n        this.table1.pagination.pageSize = event.pageSize;\n        // 查询数据\n        this.loadTable1Data();\n      },\n\n      // table1左上【主表】当选择的行变化时触发的事件\n      handleTable1SelectRowChange(event) {\n        this.handleTableSelectRowChange(this.table1, event);\n      },\n\n      // 加载table2左下【子表】的数据，根据主表的id进行查询\n      loadTable2Data() {\n        // 如果主表没有选择，则不查询\n        let selectedRows = this.table1.selectedRows;\n        if (!selectedRows || selectedRows.length === 0) {\n          this.table2.pagination.total = 0;\n          this.table2.dataSource = [];\n          this.table2.selectedRows = [];\n          return;\n        } else if (this.table1.lastRow == null) {\n          this.table1.lastRow = selectedRows[selectedRows.length - 1];\n        }\n        let formData = {\n          parentId: this.table1.lastRow.id,\n          pageNo: this.table2.pagination.current,\n          pageSize: this.table2.pagination.pageSize,\n        };\n        this.table2.loading = true;\n        defHttp\n          .get({\n            url: this.url.getData,\n            params: formData,\n          })\n          .then((result) => {\n            this.table2.pagination.total = result.total;\n            this.table2.dataSource = result.records;\n            this.table2.selectedRows = [];\n          })\n          .finally(() => {\n            this.table2.loading = false;\n          });\n      },\n\n      // 当table2左下【子表】分页参数变化时触发的事件\n      handleTable2PageChange(event) {\n        // 重新赋值\n        this.table2.pagination.current = event.current;\n        this.table2.pagination.pageSize = event.pageSize;\n        // 查询数据\n        this.loadTable2Data();\n      },\n\n      // table3右上【主表】当选择的行变化时触发的事件\n      handleTable3SelectRowChange(event) {\n        this.handleTableSelectRowChange(this.table3, event);\n      },\n\n      // 加载table4右下【子表】的数据，根据主表的id进行查询\n      loadTable4Data() {\n        let parentIds = [];\n        // 如果主表没有选择，则不查询\n        let selectedRows = this.table3.selectedRows;\n        if (!selectedRows || selectedRows.length === 0) {\n          this.table4.pagination.total = 0;\n          this.table4.dataSource = [];\n          this.table4.selectedRows = [];\n          return;\n        } else if (this.table3.lastRow == null) {\n          this.table3.lastRow = selectedRows[selectedRows.length - 1];\n        }\n        let formData = {\n          parentId: this.table3.lastRow.id,\n          pageNo: this.table4.pagination.current,\n          pageSize: this.table4.pagination.pageSize,\n        };\n        this.table4.loading = true;\n        defHttp\n          .get({\n            url: this.url.getData,\n            params: formData,\n          })\n          .then((result) => {\n            this.table4.pagination.total = result.total;\n            this.table4.dataSource = result.records;\n            this.table4.selectedRows = [];\n          })\n          .finally(() => {\n            this.table4.loading = false;\n          });\n      },\n\n      // 当table4右下【子表】分页参数变化时触发的事件\n      handleTable4PageChange(event) {\n        // 重新赋值\n        this.table4.pagination.current = event.current;\n        this.table4.pagination.pageSize = event.pageSize;\n        // 查询数据\n        this.loadTable4Data();\n      },\n\n      /** 公共方法：处理表格选中变化事件 */\n      handleTableSelectRowChange(table, event) {\n        let { row, action, selectedRows, $table } = event;\n        // 获取最后一个选中的\n        let lastSelected = selectedRows[selectedRows.length - 1];\n        if (action === 'selected') {\n          table.lastRow = row;\n        } else if (action === 'selected-all') {\n          // 取消全选\n          if (selectedRows.length === 0) {\n            table.lastRow = null;\n          } else if (!table.lastRow) {\n            table.lastRow = lastSelected;\n          }\n        } else if (action === 'unselected' && row === table.lastRow) {\n          table.lastRow = lastSelected;\n        }\n        $table.setCurrentRow(table.lastRow);\n        table.selectedRows = selectedRows;\n      },\n    },\n  };\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JVxeTableDemo/layout-demo/Template5.vue",
    "content": "<template>\n  <a-card :bordered=\"false\">\n    <a-row :gutter=\"8\">\n      <a-col :span=\"6\">\n        <!-- 加上 show-line 属性后，展开收起图标自动变成 +- 样式 -->\n        <a-tree\n          class=\"template-5-tree\"\n          :tree-data=\"treeData\"\n          show-icon\n          show-line\n          :expandedKeys=\"treeExpandedKeys\"\n          :selectedKeys=\"[pagination.current]\"\n          @expand=\"handleTreeExpand\"\n          @select=\"handleTreeSelect\"\n        >\n          <!-- 自定义子节点图标 -->\n          <a-icon slot=\"myIcon\" type=\"unordered-list\" style=\"color: #0c8fcf\" />\n        </a-tree>\n      </a-col>\n      <a-col :span=\"18\">\n        <JVxeTable\n          rowNumber\n          rowSelection\n          :height=\"750\"\n          :loading=\"loading\"\n          :columns=\"columns\"\n          :dataSource=\"dataSource\"\n          :pagination=\"pagination\"\n          @pageChange=\"handleTablePageChange\"\n        />\n      </a-col>\n    </a-row>\n  </a-card>\n</template>\n\n<script>\n  import { defHttp } from '/@/utils/http/axios';\n  import { JVxeTypes } from '/@/components/jeecg/JVxeTable/types';\n\n  // 【多种布局模板】左侧为树，右侧为行编辑\n  export default {\n    name: 'Template5',\n    data() {\n      return {\n        // 是否正在加载\n        loading: false,\n        // 分页器参数\n        pagination: {\n          // 当前页码\n          current: 1,\n          // 每页的条数\n          pageSize: 50,\n          // 可切换的条数\n          pageSizeOptions: ['50'],\n          // 数据总数（目前并不知道真实的总数，所以先填写0，在后台查出来后再赋值）\n          total: 0,\n        },\n        // 选择的行\n        selectedRows: [],\n        // 数据源，控制表格的数据\n        dataSource: [],\n        // 列配置，控制表格显示的列\n        columns: [\n          { key: 'num', title: '序号', width: '80px' },\n          {\n            // 字段key，跟后台数据的字段名匹配\n            key: 'ship_name',\n            // 列的标题\n            title: '船名',\n            // 列的宽度\n            width: '180px',\n            // 如果加上了该属性，就代表当前单元格是可编辑的，type就是表单的类型，input就是简单的输入框\n            type: JVxeTypes.input,\n          },\n          { key: 'call', title: '呼叫', width: '80px', type: JVxeTypes.input },\n          { key: 'len', title: '长', width: '80px', type: JVxeTypes.input },\n          { key: 'ton', title: '吨', width: '120px', type: JVxeTypes.input },\n          { key: 'payer', title: '付款方', width: '120px', type: JVxeTypes.input },\n          { key: 'count', title: '数', width: '40px' },\n          {\n            key: 'company',\n            title: '公司',\n            // 最小宽度，与宽度不同的是，这个不是固定的宽度，如果表格有多余的空间，会平均分配给设置了 minWidth 的列\n            // 如果要做占满表格的列可以这么写\n            minWidth: '180px',\n            type: JVxeTypes.input,\n          },\n          { key: 'trend', title: '动向', width: '120px', type: JVxeTypes.input },\n        ],\n        // 树的数据，这里模拟分页固定数据，实际情况应该是后台查出来的数据\n        treeData: [\n          // 第1级数据\n          {\n            title: '1-10页',\n            key: '1-10',\n            // 第2级数据\n            children: [\n              { title: '第 1 页', key: 1, slots: { icon: 'myIcon' } },\n              { title: '第 2 页', key: 2, slots: { icon: 'myIcon' } },\n              {\n                title: '第 3 页',\n                key: 3,\n                slots: { icon: 'myIcon' },\n                // 第3级数据\n                children: [\n                  { title: '第 333 页', key: 333, slots: { icon: 'myIcon' } },\n                  { title: '第 444 页', key: 444, slots: { icon: 'myIcon' } },\n                  { title: '第 555 页', key: 555, slots: { icon: 'myIcon' } },\n                  // 第4第5级以此类推，加上 children 属性即可\n                ],\n              },\n              { title: '第 4 页', key: 4, slots: { icon: 'myIcon' } },\n              { title: '第 5 页', key: 5, slots: { icon: 'myIcon' } },\n              { title: '第 6 页', key: 6, slots: { icon: 'myIcon' } },\n              { title: '第 7 页', key: 7, slots: { icon: 'myIcon' } },\n              { title: '第 8 页', key: 8, slots: { icon: 'myIcon' } },\n              { title: '第 9 页', key: 9, slots: { icon: 'myIcon' } },\n              { title: '第 10 页', key: 10, slots: { icon: 'myIcon' } },\n            ],\n            slots: { icon: 'myIcon' },\n          },\n          {\n            title: '11-20页',\n            key: '11-20',\n            children: [\n              { title: '第 11 页', key: 11, slots: { icon: 'myIcon' } },\n              { title: '第 12 页', key: 12, slots: { icon: 'myIcon' } },\n              { title: '第 13 页', key: 13, slots: { icon: 'myIcon' } },\n              { title: '第 14 页', key: 14, slots: { icon: 'myIcon' } },\n              { title: '第 15 页', key: 15, slots: { icon: 'myIcon' } },\n              { title: '第 16 页', key: 16, slots: { icon: 'myIcon' } },\n              { title: '第 17 页', key: 17, slots: { icon: 'myIcon' } },\n              { title: '第 18 页', key: 18, slots: { icon: 'myIcon' } },\n              { title: '第 19 页', key: 19, slots: { icon: 'myIcon' } },\n              { title: '第 20 页', key: 20, slots: { icon: 'myIcon' } },\n            ],\n            slots: { icon: 'myIcon' },\n          },\n        ],\n        // 树展开的列，默认 1-10\n        treeExpandedKeys: ['1-10'],\n        // 查询url地址\n        url: {\n          getData: '/mock/vxe/getData',\n        },\n      };\n    },\n    created() {\n      this.loadData();\n    },\n    methods: {\n      // 加载行编辑的数据\n      loadData() {\n        // 封装查询条件\n        let formData = {\n          pageNo: this.pagination.current,\n          pageSize: this.pagination.pageSize,\n        };\n        // 调用查询数据接口\n        this.loading = true;\n        defHttp\n          .get({\n            url: this.url.getData,\n            params: formData,\n          })\n          .then((result) => {\n            // 后台查询回来的 total，数据总数量\n            this.pagination.total = result.total;\n            // 将查询的数据赋值给 dataSource\n            this.dataSource = result.records;\n            // 重置选择\n            this.selectedRows = [];\n          })\n          .finally(() => {\n            // 这里是无论成功或失败都会执行的方法，在这里关闭loading\n            this.loading = false;\n          });\n      },\n\n      handleTablePageChange(event) {\n        // 重新赋值\n        this.pagination.current = event.current;\n        this.pagination.pageSize = event.pageSize;\n        // 查询数据\n        this.loadData();\n        // 判断树展开的key\n        if (event.current <= 10) {\n          this.treeExpandedKeys = ['1-10'];\n        } else {\n          this.treeExpandedKeys = ['11-20'];\n        }\n      },\n\n      // 树被选择触发的事件\n      handleTreeSelect(selectedKeys) {\n        let key = selectedKeys[0];\n        if (typeof key === 'string') {\n          // 控制树展开为当前选择的列\n          this.treeExpandedKeys = selectedKeys;\n        } else {\n          this.pagination.current = key;\n          this.loadData();\n        }\n      },\n\n      // 树被选择触发的事件\n      handleTreeExpand(expandedKeys) {\n        this.treeExpandedKeys = expandedKeys;\n      },\n    },\n  };\n</script>\n\n<style lang=\"less\">\n  /** 隐藏文件小图标 */\n  .template-5-tree.ant-tree {\n    li span.ant-tree-switcher.ant-tree-switcher-noop {\n      display: none;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JVxeTableDemo/layout-demo/index.vue",
    "content": "<template>\n  <a-card :bordered=\"false\">\n    <a-tabs>\n      <a-tab-pane tab=\"ERP布局模板\" key=\"erp\">\n        <erp-template />\n      </a-tab-pane>\n      <a-tab-pane tab=\"布局模板1\" key=\"1\">\n        <template1 />\n      </a-tab-pane>\n      <a-tab-pane tab=\"布局模板2\" key=\"2\">\n        <template2 />\n      </a-tab-pane>\n      <a-tab-pane tab=\"布局模板3\" key=\"3\">\n        <template3 />\n      </a-tab-pane>\n      <a-tab-pane tab=\"布局模板4\" key=\"4\">\n        <template4 />\n      </a-tab-pane>\n      <a-tab-pane tab=\"布局模板5\" key=\"5\">\n        <template5 />\n      </a-tab-pane>\n    </a-tabs>\n  </a-card>\n</template>\n\n<script lang=\"ts\" setup>\n  import Template1 from './Template1.vue';\n  import Template2 from './Template2.vue';\n  import Template3 from './Template3.vue';\n  import Template4 from './Template4.vue';\n  import Template5 from './Template5.vue';\n  import ErpTemplate from './ErpTemplate.vue';\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JeecgComponents.vue",
    "content": "<template>\n  <BasicForm\n    ref=\"formElRef\"\n    :class=\"'jee-select-demo-form'\"\n    :labelCol=\"{ span: 6 }\"\n    :wrapperCol=\"{ span: 14 }\"\n    :showResetButton=\"false\"\n    :showSubmitButton=\"false\"\n    :schemas=\"schemas\"\n    :actionColOptions=\"{ span: 24 }\"\n    @submit=\"handleSubmit\"\n    @reset=\"handleReset\"\n    style=\"height: 100%\"\n  >\n    <template #jAreaLinkage=\"{ model, field }\">\n      <JAreaLinkage v-model:value=\"model[field]\" :showArea=\"true\" :showAll=\"false\" />\n    </template>\n    <template #jAreaLinkage1=\"{ model, field }\">\n      <JAreaLinkage :disabled=\"isDisabledAuth(['demo.dbarray'])\" v-model:value=\"model[field]\" :showArea=\"true\" :showAll=\"false\" />\n    </template>\n    <template #JPopup=\"{ model, field }\">\n      <JPopup v-model:value=\"model[field]\" :formElRef=\"formElRef\" code=\"report_user\" :fieldConfig=\"[{ source: 'username', target: 'pop1' }]\" />\n    </template>\n    <template #JPopup2=\"{ model, field }\">\n      <JPopup\n        v-model:value=\"model[field]\"\n        :formElRef=\"formElRef\"\n        code=\"ces_app_rep001\"\n        :param=\"{ sex: '1' }\"\n        :fieldConfig=\"[{ source: 'name', target: 'pop2' }]\"\n      />\n    </template>\n    <template #JPopup3=\"{ model, field }\">\n      <JPopup\n        v-model:value=\"model[field]\"\n        :formElRef=\"formElRef\"\n        code=\"report_user\"\n        :param=\"{ sex: '1' }\"\n        :fieldConfig=\"[{ source: 'realname', target: 'pop3' }]\"\n      />\n    </template>\n    <template #JAreaSelect=\"{ model, field }\">\n      <JAreaSelect v-model:value=\"model[field]\" />\n    </template>\n    <template #JCheckbox=\"{ model, field }\">\n      <JCheckbox v-model:value=\"model[field]\" dictCode=\"remindMode\" />\n    </template>\n    <template #JInput=\"{ model, field }\">\n      <JInput v-model:value=\"model[field]\" :type=\"model['jinputtype']\" />\n    </template>\n    <template #dargVerify=\"{ model, field }\">\n      <BasicDragVerify v-model:value=\"model[field]\" />\n    </template>\n    <template #superQuery=\"{ model, field }\">\n      <super-query :config=\"superQueryConfig\" @search=\"(value)=>handleSuperQuery(value, model, field)\"/>\n    </template>\n    <template #superQuery1=\"{ model, field }\">\n      <super-query :config=\"superQueryConfig\" @search=\"(value)=>handleSuperQuery(value, model, field)\" :isCustomSave=\"true\" :saveSearchData=\"saveSearchData\" :save=\"handleSuperQuerySave\"/>\n    </template>\n  </BasicForm>\n</template>\n<script lang=\"ts\">\n  import { computed, defineComponent, unref, ref } from 'vue';\n  import { BasicForm, ApiSelect, JAreaLinkage, JPopup, JAreaSelect, FormActionType, JCheckbox, JInput, JEllipsis } from '/@/components/Form';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { optionsListApi } from '/@/api/demo/select';\n  import { useDebounceFn } from '@vueuse/core';\n  import { schemas } from './jeecgComponents.data';\n  import { usePermission } from '/@/hooks/web/usePermission';\n  import { BasicDragVerify } from '/@/components/Verify';\n\n  export default defineComponent({\n    components: {\n      BasicForm,\n      ApiSelect,\n      JAreaLinkage,\n      JPopup,\n      JAreaSelect,\n      JCheckbox,\n      JInput,\n      JEllipsis,\n      BasicDragVerify,\n    },\n    name: 'JeecgComponents',\n    setup() {\n      const { isDisabledAuth } = usePermission();\n      const check = ref(null);\n      const formElRef = ref<Nullable<FormActionType>>(null);\n      const { createMessage } = useMessage();\n      const keyword = ref<string>('');\n      const submitButtonOptions = ref({\n        text: '确定',\n      });\n      const searchParams = computed<Recordable>(() => {\n        return { keyword: unref(keyword) };\n      });\n\n      function onSearch(value: string) {\n        keyword.value = value;\n      }\n      \n      const superQueryConfig = {\n        name:{ title: \"名称\", view: \"text\", type: \"string\", order: 1 },\n        birthday:{ title: \"生日\", view: \"date\", type: \"string\", order: 2 },\n        age:{ title: \"年龄\", view: \"number\", type: \"number\", order: 4 },\n        sex:{ title: \"性别\", view: \"list\", type: \"string\", dictCode: \"sex\", order: 5 },\n        bpmStatus:{ title: \"流程状态\", view: \"list_multi\", type: \"string\",  dictCode: \"bpm_status\", order: 6 },\n      }\n      function handleSuperQuery(value, model, field){\n        if(value){\n          let str = decodeURI(value.superQueryParams)\n          console.log(str)\n          model[field] = str\n        }\n      }\n      const saveSearchData = ref([\n        {\n          content: '[{\"field\":\"age\",\"rule\":\"eq\",\"val\":14}]',\n          title: '豆蔻年华',\n          type: 'and',\n        },\n        {\n          content: '[{\"field\":\"name\",\"rule\":\"eq\",\"val\":\"张三\"}]',\n          title: '项目经理',\n          type: 'and',\n        },\n      ]);\n      const handleSuperQuerySave = (data) => {\n        // 高级查询保存后的信息\n        return new Promise<void>((resolve, reject) => {\n          // 模拟接口\n          setTimeout(() => {\n            if (Math.random() > 0.5) {\n              console.log('接口成功~');\n              saveSearchData.value = data;\n              resolve();\n            } else {\n              console.log('接口失败~');\n              reject();\n            }\n          }, 1e3);\n        });\n      }\n      return {\n        schemas,\n        formElRef,\n        isDisabledAuth,\n        optionsListApi,\n        submitButtonOptions,\n        onSearch: useDebounceFn(onSearch, 300),\n        searchParams,\n        superQueryConfig,\n        handleSuperQuery,\n        handleReset: () => {\n          keyword.value = '';\n        },\n        handleSubmit: (values: any) => {\n          console.log('values:', values);\n          createMessage.success('click search,values:' + JSON.stringify(values));\n        },\n        check,\n        handleSuperQuerySave,\n        saveSearchData,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  /**update-begin-author:taoyan date:20220324 for: VUEN-351【vue3】展示不全*/\n  .jee-select-demo-form .ant-col-5 {\n    flex: 0 0 159px;\n    max-width: 159px;\n  }\n  /**update-end-author:taoyan date:20220324 for: VUEN-351【vue3】展示不全*/\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/JeecgPdfView.vue",
    "content": "<template>\n  <a-card :bordered=\"false\">\n    <a-row>\n      <!-- 左侧文件树 -->\n      <a-col :span=\"4\" class=\"clName\">\n        <a-tree :treeData=\"treeData\" :defaultExpandAll=\"true\" @select=\"onSelect\" style=\"height: 500px; overflow-y: auto\"> </a-tree>\n      </a-col>\n      <!--右侧缩略图-->\n      <a-col :span=\"18\">\n        <div v-for=\"(file, key) in dataSource\" :key=\"key\">\n          <a-col :span=\"24\">\n            <a-divider orientation=\"left\">{{ file.fileName }}</a-divider>\n          </a-col>\n          <!-- 预览区域 -->\n          <a-col :span=\"24\">\n            <template v-if=\"file.filePdfPath\">\n              <div @click=\"pdfPreview(file.title)\">\n                <img style=\"width: 80px; height: 80px\" src=\"../../../assets/images/pdf4.jpg\" />\n              </div>\n            </template>\n            <template v-else> (暂无材料，点击\"选择文件\"或\"扫描上传\"上传文件) </template>\n          </a-col>\n        </div>\n      </a-col>\n    </a-row>\n    <div style=\"display: none\">\n      <iframe id=\"pdfPreviewIframe\" :src=\"url\" frameborder=\"0\" width=\"100%\" height=\"550px\" scrolling=\"auto\"></iframe>\n    </div>\n  </a-card>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, ref, unref, onMounted } from 'vue';\n  import { useGlobSetting } from '/@/hooks/setting';\n  import { getToken } from '/@/utils/auth';\n\n  const mockdata = [\n    {\n      id: '1',\n      key: '1',\n      title: '实例.pdf',\n      fileCode: 'shili',\n      fileName: '实例',\n      filePdfPath: '实例',\n    },\n  ];\n\n  export default defineComponent({\n    name: 'JeecgPdfView',\n    setup() {\n      const glob = useGlobSetting();\n      const treeData = ref([\n        {\n          title: '所有PDF电子档',\n          key: '0-0',\n          children: mockdata,\n        },\n      ]);\n      const dataSource = ref(mockdata);\n      const allData = ref(mockdata);\n      const url = ref(`${glob.domainUrl}/sys/common/pdf/pdfPreviewIframe`);\n\n      /**\n       * 打开iframe窗口\n       * @param title\n       */\n      function pdfPreview(title) {\n        let iframe = document.getElementById('pdfPreviewIframe');\n        let json = { title: title, token: getToken() };\n        iframe.contentWindow.postMessage(json, '*');\n      }\n\n      // 选择PDF文件\n      function onSelect(selectedKeys, info) {\n        dataSource.value = [];\n        if (selectedKeys[0] === undefined || selectedKeys[0] === '0-0') {\n          dataSource.value = unref(allData);\n        } else {\n          dataSource.value.push(info.node.dataRef);\n        }\n      }\n\n      return {\n        url,\n        dataSource,\n        treeData,\n        allData,\n        onSelect,\n        pdfPreview,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/Native/less/TableExpand.less",
    "content": "/** [表格主题样式一] 表格强制列不换行 */\n.j-table-force-nowrap {\n  td,\n  th {\n    white-space: nowrap;\n  }\n\n  .ant-table-selection-column {\n    padding: 12px 22px !important;\n  }\n\n  /** 列自适应，弊端会导致列宽失效 */\n\n  &.ant-table-wrapper .ant-table-content {\n    overflow-x: auto;\n  }\n}\n\n/** 查询区域通用样式*/\n.table-page-search-wrapper {\n  .ant-form-inline {\n    .ant-form-item {\n      display: flex;\n      margin-bottom: 24px;\n      margin-right: 0;\n\n      .ant-form-item-control-wrapper {\n        flex: 1 1;\n        display: inline-block;\n        vertical-align: middle;\n      }\n\n      > .ant-form-item-label {\n        line-height: 32px;\n        padding-right: 8px;\n        width: auto;\n      }\n\n      .ant-form-item-control {\n        height: 32px;\n        line-height: 32px;\n      }\n    }\n  }\n\n  .table-page-search-submitButtons {\n    display: block;\n    margin-bottom: 24px;\n    white-space: nowrap;\n  }\n}\n\n/*列表上方操作按钮区域*/\n.ant-card-body .table-operator {\n  margin-bottom: 8px;\n}\n\n/** Button按钮间距 */\n.table-operator .ant-btn {\n  margin: 0 8px 8px 0;\n}\n\n.table-operator .ant-btn-group .ant-btn {\n  margin: 0;\n}\n\n.table-operator .ant-btn-group .ant-btn:last-child {\n  margin: 0 8px 8px 0;\n}\n\n/*列表td的padding设置 可以控制列表大小*/\n.ant-table-tbody .ant-table-row td {\n  padding-top: 15px;\n  padding-bottom: 15px;\n}\n\n/*列表页面弹出modal*/\n.ant-modal-cust-warp {\n  height: 100%;\n}\n\n/*弹出modal Y轴滚动条*/\n.ant-modal-cust-warp .ant-modal-body {\n  height: calc(100% - 110px) !important;\n  overflow-y: auto;\n}\n\n/*弹出modal 先有content后有body 故滚动条控制在body上*/\n.ant-modal-cust-warp .ant-modal-content {\n  height: 90% !important;\n  overflow-y: hidden;\n}\n\n/*列表中有图片的加这个样式 参考用户管理*/\n.anty-img-wrap {\n  height: 25px;\n  position: relative;\n}\n\n.antd-more a {\n  color: #000000;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/Native/one/OneNativeList.vue",
    "content": "<template>\n  <a-card :bordered=\"false\">\n    <!-- 操作按钮区域 -->\n    <div class=\"table-operator\">\n      <a-button @click=\"handleAdd\" type=\"primary\" preIcon=\"ant-design:plus\">新增</a-button>\n      <!--      <a-button type=\"primary\" preIcon=\"ant-design:download\" @click=\"handleExportExcel('单表原生列表')\">导出</a-button>-->\n      <!--      <j-upload-button type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"handleImportExcel\">导入</j-upload-button>-->\n      <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n        <template #overlay>\n          <a-menu>\n            <a-menu-item key=\"1\" @click=\"batchDel\">\n              <Icon icon=\"ant-design:delete-outlined\"></Icon>\n              删除\n            </a-menu-item>\n          </a-menu>\n        </template>\n        <a-button\n          >批量操作\n          <Icon icon=\"mdi:chevron-down\"></Icon>\n        </a-button>\n      </a-dropdown>\n    </div>\n\n    <!-- table区域-begin -->\n    <div>\n      <div class=\"ant-alert ant-alert-info\" style=\"margin-bottom: 16px\">\n        <i class=\"anticon anticon-info-circle ant-alert-icon\"></i> 已选择 <a style=\"font-weight: 600\">{{ selectedRowKeys.length }}</a\n        >项\n        <a style=\"margin-left: 24px\" @click=\"onClearSelected\">清空</a>\n      </div>\n\n      <a-table\n        ref=\"table\"\n        size=\"middle\"\n        :scroll=\"{ x: true }\"\n        bordered\n        rowKey=\"id\"\n        class=\"j-table-force-nowrap\"\n        :columns=\"columns\"\n        :dataSource=\"dataSource\"\n        :pagination=\"ipagination\"\n        :loading=\"loading\"\n        :rowSelection=\"{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }\"\n        @change=\"handleTableChange\"\n      >\n        <template #bodyCell=\"{ column, text, record }\">\n          <template v-if=\"column.dataIndex==='tupian'\">\n            <span v-if=\"!text\" style=\"font-size: 12px; font-style: italic\">无图片</span>\n            <img v-else :src=\"getImgView(text)\" :preview=\"record.id\" alt=\"\" class=\"anty-img-wrap\" />\n          </template>\n          <template v-else-if=\"column.dataIndex==='wenjian'\">\n            <span v-if=\"!text\" style=\"font-size: 12px; font-style: italic\">无文件</span>\n            <a-button v-else :ghost=\"true\" type=\"primary\" preIcon=\"ant-design:download\" size=\"small\" @click=\"downloadFile(text)\"> 下载 </a-button>\n          </template>\n          <template v-else-if=\"column.dataIndex==='action'\">\n            <a @click=\"handleEdit(record)\">编辑</a>\n            <a-divider type=\"vertical\" />\n            <a-dropdown>\n              <a class=\"ant-dropdown-link\">更多 <Icon icon=\"mdi-light:chevron-down\"></Icon></a>\n              <template #overlay>\n                <a-menu class=\"antd-more\">\n                  <a-menu-item>\n                    <a @click=\"handleDetail(record)\">详情</a>\n                  </a-menu-item>\n                  <a-menu-item>\n                    <Popconfirm title=\"确定删除吗?\" @confirm=\"() => handleDelete(record.id)\" placement=\"left\">\n                      <a>删除</a>\n                    </Popconfirm>\n                  </a-menu-item>\n                </a-menu>\n              </template>\n            </a-dropdown>\n          </template>\n          <!-- <template v-else-if=\"column.dataIndex==='htmlSlot'\">\n            <div v-html=\"text\"></div>\n          </template>\n          <template v-else-if=\"column.dataIndex==='pcaSlot'\">\n            <div>{{ getAreaTextByCode(text) }}</div>\n          </template> -->\n        </template>\n      </a-table>\n    </div>\n    <OneNativeModal ref=\"oneProtogenesisModal\" @ok=\"handleSuccess\"></OneNativeModal>\n  </a-card>\n</template>\n\n<script lang=\"ts\" setup>\n  import '../less/TableExpand.less';\n  import { onMounted, ref, reactive } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { filterMultiDictText } from '/@/utils/dict/JDictSelectUtil.js';\n  import { getAreaTextByCode } from '/@/components/Form/src/utils/Area';\n  import OneNativeModal from './components/OneNativeModal.vue';\n  import { Modal, Popconfirm } from 'ant-design-vue';\n  import { JSelectUserByDept, JDictSelectTag, JSelectDept, JSearchSelect } from '/@/components/Form';\n  import Icon from '/@/components/Icon/index';\n  import { filterObj, getFileAccessHttpUrl } from '/@/utils/common/compUtils';\n  import { loadCategoryData } from '/@/api/common/api';\n  import { getToken } from '/@/utils/auth';\n  import { useMethods } from '/@/hooks/system/useMethods';\n  import { downloadFile } from '/@/utils/common/renderUtils';\n  import { initDictOptions } from '/@/utils/dict';\n\n  const { handleExportXls, handleImportXls } = useMethods();\n  const modalVisible = ref<boolean>(false);\n  const queryParam = ref<any>({});\n  const loading = ref<boolean>(false);\n  const dictOptions = ref<any>([]);\n  const oneProtogenesisModal = ref();\n  const tokenHeader = { 'X-Access-Token': getToken() };\n  //表头\n  const columns = ref<any>([\n    {\n      title: '文本',\n      align: 'center',\n      dataIndex: 'name',\n    },\n    {\n      title: '字典下拉',\n      align: 'center',\n      dataIndex: 'xiala',\n      customRender: ({ text }) => (text ? filterMultiDictText(dictOptions.value['xiala'], text) : ''),\n    },\n    {\n      title: '字典单选',\n      align: 'center',\n      dataIndex: 'danxuan',\n      customRender: ({ text }) => (text ? filterMultiDictText(dictOptions.value['danxuan'], text) : ''),\n    },\n    {\n      title: '字典多选',\n      align: 'center',\n      dataIndex: 'duoxuan',\n      customRender: ({ text }) => (text ? filterMultiDictText(dictOptions.value['duoxuan'], text) : ''),\n    },\n    {\n      title: '开关',\n      align: 'center',\n      dataIndex: 'kaiguan',\n      customRender: ({ text }) => (text ? filterMultiDictText(dictOptions.value['kaiguan'], text) : ''),\n    },\n    {\n      title: '日期',\n      align: 'center',\n      dataIndex: 'riqi',\n      customRender: function ({ text }) {\n        return !text ? '' : text.length > 10 ? text.substr(0, 10) : text;\n      },\n    },\n    {\n      title: '年月日时分秒',\n      align: 'center',\n      dataIndex: 'nyrsfm',\n    },\n    {\n      title: '时间',\n      align: 'center',\n      dataIndex: 'shijian',\n    },\n    {\n      title: '文件',\n      align: 'center',\n      dataIndex: 'wenjian',\n    },\n    {\n      title: '图片',\n      align: 'center',\n      dataIndex: 'tupian',\n    },\n    {\n      title: '操作',\n      dataIndex: 'action',\n      align: 'center',\n      fixed: 'right',\n      width: 147,\n    },\n  ]);\n\n  const Api = reactive<any>({\n    list: '/test/jeecgDemo/oneNative/list',\n    delete: '/test/jeecgDemo/oneNative/delete',\n    exportXls: '/test/jeecgDemo/oneNative/exportXls',\n    importExcel: 'test/jeecgDemo/oneNative/importExcel',\n  });\n\n  const dataSource = ref<any>([]);\n  const toggleSearchStatus = ref<boolean>(false);\n  const ipagination = ref<any>({\n    current: 1,\n    pageSize: 10,\n    pageSizeOptions: ['10', '20', '30'],\n    showTotal: (total, range) => {\n      return range[0] + '-' + range[1] + ' 共' + total + '条';\n    },\n    showQuickJumper: true,\n    showSizeChanger: true,\n    total: 0,\n  });\n\n  const selectedRowKeys = ref<any>([]);\n  const selectionRows = ref<any>([]);\n  const iSorter = ref<any>({ column: 'createTime', order: 'desc' });\n  const iFilters = ref<any>({});\n  const { createMessage } = useMessage();\n\n  /**\n   * 复选框选中事件\n   * @param rowKeys\n   * @param rows\n   */\n  function onSelectChange(rowKeys, rows) {\n    selectedRowKeys.value = rowKeys;\n    selectionRows.value = rows;\n  }\n\n  /**\n   * 表格改变事件\n   */\n  function handleTableChange({ pagination, filters, sorter }) {\n    ipagination.value = pagination;\n    iSorter.value = sorter;\n    iFilters.value = { ...filters };\n  }\n\n  /**\n   * 新增\n   */\n  function handleAdd() {\n    oneProtogenesisModal.value.disableSubmit = false;\n    oneProtogenesisModal.value.add();\n  }\n\n  /**\n   * 清除选中行\n   */\n  function onClearSelected() {\n    selectedRowKeys.value = [];\n    selectionRows.value = [];\n  }\n\n  /**\n   * 批量删除\n   */\n  function batchDel() {\n    Modal.confirm({\n      title: '确认删除',\n      content: '是否删除选中数据',\n      okText: '确认',\n      cancelText: '取消',\n      onOk: () => {\n        defHttp.delete({ url: Api.delete, data: { ids: selectedRowKeys.value } }, { joinParamsToUrl: true }).then(() => {\n          handleSuccess();\n        });\n      },\n    });\n  }\n\n  /**\n   * 导出excel\n   */\n  function handleExportExcel(title) {\n    let paramsForm = getQueryParams();\n    if (selectedRowKeys.value && selectedRowKeys.value.length > 0) {\n      paramsForm['selections'] = selectedRowKeys.join(',');\n    }\n    handleExportXls(title, Api.exportXls, filterObj(paramsForm));\n  }\n\n  /**\n   * 导入excel\n   */\n  function handleImportExcel(file) {\n    handleImportXls(file, Api.importExcel, '').then(() => {\n      handleSuccess();\n    });\n  }\n\n  /**\n   * 获取查询参数\n   */\n  function getQueryParams() {\n    let params = Object.assign(queryParam.value, iSorter.value, iFilters.value);\n    params.field = getQueryField();\n    params.pageNo = ipagination.value.current;\n    params.pageSize = ipagination.value.pageSize;\n    return filterObj(params);\n  }\n\n  /**\n   * 字段权限控制\n   */\n  function getQueryField() {\n    let str = 'id,';\n    columns.value.forEach(function (value) {\n      str += ',' + value.dataIndex;\n    });\n    return str;\n  }\n\n  /**\n   * 初始化数据\n   */\n  function loadData(arg?) {\n    if (arg === 1) {\n      ipagination.value.current = 1;\n    }\n    loading.value = true;\n    let params = getQueryParams();\n    defHttp\n      .get({ url: Api.list, params }, { isTransformResponse: false })\n      .then((res) => {\n        if (res.success) {\n          dataSource.value = res.result.records;\n          if (res.result && res.result.total) {\n            ipagination.value.total = res.result.total;\n          } else {\n            ipagination.value.total = 0;\n          }\n        } else {\n          createMessage.warning(res.message);\n        }\n      })\n      .finally(() => {\n        loading.value = false;\n      });\n  }\n\n  //查询\n  function searchQuery() {\n    loadData(1);\n    selectedRowKeys.value = [];\n    selectionRows.value = [];\n  }\n\n  /**\n   * 查询区域展开关闭\n   */\n  function handleToggleSearch() {\n    toggleSearchStatus.value = !toggleSearchStatus.value;\n  }\n\n  /**\n   * 重置按钮\n   */\n  function searchReset() {\n    queryParam.value = {};\n    loadData(1);\n  }\n\n  /**\n   * 获取预览图片\n   */\n  function getImgView(text) {\n    if (text && text.indexOf(',') > 0) {\n      text = text.substring(0, text.indexOf(','));\n    }\n    return getFileAccessHttpUrl(text);\n  }\n\n  /**\n   * 编辑\n   * @param record\n   */\n  function handleEdit(record) {\n    oneProtogenesisModal.value.disableSubmit = false;\n    oneProtogenesisModal.value.edit(record);\n  }\n\n  /**\n   * 详情\n   * @param record\n   */\n  function handleDetail(record) {\n    oneProtogenesisModal.value.disableSubmit = true;\n    oneProtogenesisModal.value.edit(record);\n  }\n\n  /**\n   * 删除\n   * @param id\n   */\n  function handleDelete(id) {\n    defHttp.delete({ url: Api.delete, data: { ids: id } }, { joinParamsToUrl: true }).then((res) => {\n      handleSuccess();\n    });\n  }\n\n  /**\n   * 初始化字典选项\n   */\n  async function initDictConfig() {\n    dictOptions.value['flzds'] = await loadCategoryData({ code: 'B01' });\n    dictOptions.value['xiala'] = await initDictOptions('sex');\n    dictOptions.value['danxuan'] = await initDictOptions('sex');\n    dictOptions.value['duoxuan'] = await initDictOptions('urgent_level');\n  }\n\n  /**\n   * 保存表单后回调事件\n   */\n  function handleSuccess() {\n    selectedRowKeys.value = [];\n    selectionRows.value = [];\n    loadData(1);\n  }\n  onMounted(() => {\n    dictOptions.value['kaiguan'] = [\n      { text: '是', value: '1' },\n      { text: '否', value: '2' },\n    ];\n    //初始加载页面\n    loadData();\n    //初始化字典选项\n    initDictConfig();\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/Native/one/components/OneNativeForm.vue",
    "content": "<template>\n  <a-spin :spinning=\"confirmLoading\">\n    <JFormContainer :disabled=\"disabled\">\n      <template #detail>\n        <a-form class=\"antd-modal-form\" ref=\"formRef\" :model=\"formState\" :rules=\"validatorRules\">\n          <a-row>\n            <a-col :span=\"24\">\n              <a-form-item label=\"文本\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.name\">\n                <a-input v-model:value=\"formState.name\" placeholder=\"请输入文本\"></a-input>\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"密码\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.miMa\">\n                <a-input-password v-model:value=\"formState.miMa\" placeholder=\"请输入密码\" />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"字典下拉\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.xiala\">\n                <JDictSelectTag type=\"select\" v-model:value=\"formState.xiala\" dictCode=\"sex\" placeholder=\"请选择字典下拉\" />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"字典单选\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.danxuan\">\n                <JDictSelectTag type=\"radio\" v-model:value=\"formState.danxuan\" dictCode=\"sex\" placeholder=\"请选择字典单选\" />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"字典多选\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.duoxuan\">\n                <JCheckbox v-model:value=\"formState.duoxuan\" dictCode=\"urgent_level\" placeholder=\"请选择字典多选\" />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"开关\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.kaiguan\">\n                <JSwitch v-model:value=\"formState.kaiguan\" :options=\"['1', '0']\"></JSwitch>\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"日期\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.riqi\">\n                <a-date-picker placeholder=\"请选择日期\" format=\"YYYY-MM-DD\" valueFormat=\"YYYY-MM-DD\" v-model:value=\"formState.riqi\" style=\"width: 100%\" />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"年月日时分秒\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.nyrsfm\">\n                <a-date-picker show-time v-model:value=\"formState.nyrsfm\" style=\"width: 100%\" valueFormat=\"YYYY-MM-DD HH:mm:ss\" />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"时间\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.shijian\">\n                <TimePicker placeholder=\"请选择时间\" v-model:value=\"formState.shijian\" style=\"width: 100%\" />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"文件\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.wenjian\">\n                <JUpload v-model:value=\"formState.wenjian\"></JUpload>\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"图片\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.tupian\">\n                <JImageUpload :fileMax=\"2\" v-model:value=\"formState.tupian\"></JImageUpload>\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"多行文本框\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.dhwb\">\n                <a-textarea v-model:value=\"formState.dhwb\" rows=\"4\" placeholder=\"请输入多行文本框\" />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"字典表下拉搜索框\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.xlss\">\n                <JSearchSelect v-model:value=\"formState.xlss\" dict=\"sys_user,realname,username\" />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"popup弹窗\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.popup\">\n                <JPopup\n                  v-model:value=\"formState.popup\"\n                  :fieldConfig=\"[\n                    { source: 'name', target: 'popup' },\n                    { source: 'id', target: 'popback' },\n                  ]\"\n                  code=\"report_user\"\n                  :multi=\"true\"\n                  :setFieldsValue=\"setFieldsValue\"\n                />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"popback\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.popback\">\n                <a-input v-model:value=\"formState.popback\" />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"分类字典树\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.flzds\">\n                <JCategorySelect\n                  @change=\"(value) => handleFormChange('flzds', value)\"\n                  v-model:value=\"formState.flzds\"\n                  pcode=\"B02\"\n                  placeholder=\"请选择分类字典树\"\n                />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"部门选择\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.bmxz\">\n                <JSelectDept v-model:value=\"formState.bmxz\" :multi=\"true\" type=\"array\" />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"用户选择\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.yhxz\">\n                <JSelectUserByDept v-model:value=\"formState.yhxz\" :multi=\"true\" />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"富文本\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.fwb\">\n                <JEditor v-model:value=\"formState.fwb\" />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"markdown\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.markdownString\">\n                <JMarkdownEditor v-model:value=\"formState.markdownString\"></JMarkdownEditor>\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"省市区JAreaSelect\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.shq\">\n                <JAreaSelect v-model:value=\"formState.shq\" placeholder=\"请输入省市区\" />\n              </a-form-item>\n            </a-col>\n    \n            <a-col :span=\"24\">\n              <a-form-item label=\"省市区JAreaLinkage\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.jssq\">\n                <JAreaLinkage v-model:value=\"formState.jssq\" placeholder=\"请输入省市区\" />\n              </a-form-item>\n            </a-col>\n    \n            <a-col :span=\"24\">\n              <a-form-item label=\"JInputPop\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.ldzje\">\n                <JInputPop\n                  v-model:value=\"formState.ldzje\"\n                  placeholder=\"请输入JInputPop\"\n                  @change=\"(value) => handleFormChange('ldzje', value)\"\n                ></JInputPop>\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"JSelectInput\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.ldzjs\">\n                <JSelectInput\n                  v-model:value=\"formState.ldzjs\"\n                  placeholder=\"请选择JSelectInput\"\n                  :options=\"ldzjsOptions\"\n                  @change=\"(value) => handleFormChange('ldzjs', value)\"\n                ></JSelectInput>\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"下拉多选\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.zddtjxl\">\n                <JSelectMultiple v-model:value=\"formState.zddtjxl\" placeholder=\"请选择下拉多选\" dictCode=\"sex\"></JSelectMultiple>\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"用户\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.yongHu\">\n                <JSelectUser v-model:value=\"formState.yongHu\" placeholder=\"请选择用户\"></JSelectUser>\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"职务\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.zhiWu\">\n                <JSelectPosition\n                  v-model:value=\"formState.zhiWu\"\n                  placeholder=\"请选择职务\"\n                  @change=\"(value) => handleFormChange('zhiWu', value)\"\n                ></JSelectPosition>\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"角色\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.jueSe\">\n                <JSelectRole v-model:value=\"formState.jueSe\" placeholder=\"请选择角色\" @change=\"(value) => handleFormChange('jueSe', value)\"></JSelectRole>\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"自定义树\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.zdys\">\n                <JTreeSelect\n                  ref=\"treeSelect\"\n                  placeholder=\"请选择自定义树\"\n                  v-model:value=\"formState.zdys\"\n                  dict=\"sys_category,name,id\"\n                  pidValue=\"0\"\n                  loadTriggleChange\n                >\n                </JTreeSelect>\n              </a-form-item>\n            </a-col>\n    \n            <a-col :span=\"24\">\n              <a-form-item label=\"数值\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.yuanjia\">\n                <a-input-number v-model:value=\"formState.yuanjia\" placeholder=\"请输入double类型\" style=\"width: 100%\" />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"输入2到10位的字母\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.ywzz\">\n                <a-input v-model:value=\"formState.ywzz\" placeholder=\"请输入2到10位的字母\"></a-input>\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"JTreeDict\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.zdbxl\">\n                <JTreeDict\n                  v-model:value=\"formState.zdbxl\"\n                  placeholder=\"请选择JTreeDict\"\n                  @change=\"(value) => handleFormChange('zdbxl', value)\"\n                ></JTreeDict>\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"JCodeEditor\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.zdmrz\">\n                <JCodeEditor\n                  v-model:value=\"formState.zdmrz\"\n                  placeholder=\"请输入JCodeEditor\"\n                  @change=\"(value) => handleFormChange('zdmrz', value)\"\n                ></JCodeEditor>\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"参数\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.jsonParam\">\n                <JAddInput v-model:value=\"formState.jsonParam\" placeholder=\"参数\"></JAddInput>\n              </a-form-item>\n            </a-col>\n          </a-row>\n        </a-form>\n      </template>\n    </JFormContainer>\n  </a-spin>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, reactive, nextTick, computed } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import dayjs from 'dayjs';\n  import { TimePicker, Form } from 'ant-design-vue';\n  import JCheckbox from '/@/components/Form/src/jeecg/components/JCheckbox.vue';\n  import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';\n  import JSwitch from '/@/components/Form/src/jeecg/components/JSwitch.vue';\n  import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue';\n  import JImageUpload from '/@/components/Form/src/jeecg/components/JImageUpload.vue';\n  import JSearchSelect from '/@/components/Form/src/jeecg/components/JSearchSelect.vue';\n  import JPopup from '/@/components/Form/src/jeecg/components/JPopup.vue';\n  import JCategorySelect from '/@/components/Form/src/jeecg/components/JCategorySelect.vue';\n  import JSelectUserByDept from '/@/components/Form/src/jeecg/components/JSelectUserByDept.vue';\n  import JEditor from '/@/components/Form/src/jeecg/components/JEditor.vue';\n  import JMarkdownEditor from '/@/components/Form/src/jeecg/components/JMarkdownEditor.vue';\n  import JTreeSelect from '/@/components/Form/src/jeecg/components/JTreeSelect.vue';\n  import JInputPop from '/@/components/Form/src/jeecg/components/JInputPop.vue';\n  import JSelectInput from '/@/components/Form/src/jeecg/components/JSelectInput.vue';\n  import JSelectPosition from '/@/components/Form/src/jeecg/components/JSelectPosition.vue';\n  import JSelectMultiple from '/@/components/Form/src/jeecg/components/JSelectMultiple.vue';\n  import JInput from '/@/components/Form/src/jeecg/components/JInput.vue';\n  import JSelectDept from '/@/components/Form/src/jeecg/components/JSelectDept.vue';\n  import JSelectUser from '/@/components/Form/src/jeecg/components/JSelectUser.vue';\n  import JAreaSelect from '/@/components/Form/src/jeecg/components/JAreaSelect.vue';\n  import JAreaLinkage from '/@/components/Form/src/jeecg/components/JAreaLinkage.vue';\n  import JSelectRole from '/@/components/Form/src/jeecg/components/JSelectRole.vue';\n  import JTreeDict from '/@/components/Form/src/jeecg/components/JTreeDict.vue';\n  import JCodeEditor from '/@/components/Form/src/jeecg/components/JCodeEditor.vue';\n  import JAddInput from '/@/components/Form/src/jeecg/components/JAddInput.vue';\n  import { getValueType } from '/@/utils';\n  import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';\n\n  const props = defineProps({\n    formDisabled: { type: Boolean, default: false },\n  });\n  // 表单禁用\n  const disabled = computed(()=>{\n    return props.formDisabled;\n  });\n  const emit = defineEmits(['register', 'ok']);\n  // 代码逻辑说明: 报表示例验证修改--------------\n  const formState = reactive<Record<string, any>>({\n    name: '',\n    miMa: '',\n    ywzz: '',\n    xiala: '',\n    danxuan: '',\n    duoxuan: '',\n    riqi: '',\n    shijian: '',\n    wenjian: '',\n    tupian: '',\n    dhwb: '',\n    xlss: '',\n    popup: '',\n    flzds: '',\n    yhxz: '',\n    fwb: '',\n    shq: '',\n    ldzje: '',\n    ldzjs: '',\n    zddtjxl: '',\n    yongHu: '',\n    zhiWu: '',\n    jueSe: '',\n    zdys: '',\n    jssq: '',\n    zdbxl: '',\n    zdmrz: '',\n    jsonParam: '',\n    bmxz: '',\n    yuanjia: '',\n    nyrsfm: '',\n  });\n  const { createMessage } = useMessage();\n  const formRef = ref();\n  const useForm = Form.useForm;\n  const url = reactive<any>({\n    duplicateCheck: '/sys/duplicate/check',\n    add: '/test/jeecgDemo/oneNative/add',\n    edit: '/test/jeecgDemo/oneNative/edit',\n  });\n  const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });\n  const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });\n  const confirmLoading = ref<boolean>(false);\n  //表单验证\n  const validatorRules = {\n    name: [{ required: false, message: '请输入文本!' }],\n    miMa: [{ required: false, message: '请输入密码!' }],\n    ywzz: [{ required: false }, { pattern: '^[a-z|A-Z]{2,10}$', message: '不符合校验规则!' }],\n    xiala: [{ required: false, message: '请选择下拉组件!' }],\n    danxuan: [{ required: false, message: '请选择单选组件!' }],\n    duoxuan: [{ required: false, message: '请选择多选组件!' }],\n    riqi: [{ required: false, message: '请选择日期!' }],\n    shijian: [{ required: false, message: '请选择时间!' }],\n    wenjian: [{ required: false, message: '请上传文件!' }],\n    tupian: [{ required: false, message: '请上传图片!' }],\n    dhwb: [{ required: false, message: '请填写多行文本!' }],\n    xlss: [{ required: false, message: '请选择字典下拉搜索!' }],\n    popup: [{ required: false, message: '请选择popup弹窗!' }],\n    flzds: [{ required: false, message: '请选择分类字典树!' }],\n    yhxz: [{ required: false, message: '请选择用户!' }],\n    fwb: [{ required: false, message: '请填写富文本!' }],\n    shq: [{ required: false, message: '请选择省市级!' }],\n    ldzje: [{ required: false, message: '请输入JInputPop!' }],\n    ldzjs: [{ required: false, message: '请选择下拉输入框!' }],\n    zddtjxl: [{ required: false, message: '请选择多选输入框!' }],\n    yongHu: [{ required: false, message: '请选择用户!' }],\n    zhiWu: [{ required: false, message: '请选择职务!' }],\n    jueSe: [{ required: false, message: '请选择角色!' }],\n    zdys: [{ required: false, message: '请选择自定义树!' }],\n    jssq: [{ required: false, message: '请选择三级联动!' }],\n    zdbxl: [{ required: false, message: '请选择JTreeDict!' }],\n    zdmrz: [{ required: false, message: '请输入JCodeEditor!' }],\n    jsonParam: [{ required: false, message: '请输入参数!' }],\n    bmxz: [{ required: false, message: '请选择部门!' }],\n    yuanjia: [{ required: false, message: '请输入数值!' }],\n    nyrsfm: [{ required: false, message: '请选择年月日时分秒!' }],\n  };\n  // 代码逻辑说明: 报表示例验证修改------------\n  const { resetFields, validate, validateInfos } = useForm(formState, validatorRules, { immediate: false });\n  const ldzjsOptions = ref([\n    { label: '男', value: '1' },\n    { label: '女', value: '2' },\n  ]);\n\n  /**\n   * 新增\n   */\n  function add() {\n    edit({});\n  }\n\n  /**\n   * 编辑\n   */\n  function edit(record) {\n    nextTick(() => {\n      resetFields();\n      //赋值\n      Object.assign(formState, record);\n    });\n  }\n\n  /**\n   * 提交数据\n   */\n  async function submitForm() {\n    // 触发表单验证\n    // 代码逻辑说明: 报表示例验证修改------------\n    await validate();\n    confirmLoading.value = true;\n    let httpurl = '';\n    let method = '';\n    //时间格式化\n    let model = formState;\n    if (!model.id) {\n      httpurl += url.add;\n      method = 'post';\n    } else {\n      httpurl += url.edit;\n      method = 'put';\n    }\n    //循环数据如果是数组\n    for (let data in formState) {\n      //如果该数据是数组并且是字符串类型\n      if (formState[data] instanceof Array) {\n        let valueType = getValueType(formRef.value.getProps, data);\n        //如果是字符串类型的需要变成以逗号分割的字符串\n        if (valueType === 'string') {\n          formState[data] = formState[data].join(',');\n        }\n      }\n    }\n    defHttp\n      .request(\n        {\n          url: httpurl,\n          params: model,\n          method: method,\n        },\n        { isTransformResponse: false }\n      )\n      .then((res) => {\n        if (res.success) {\n          createMessage.success(res.message);\n          emit('ok');\n        } else {\n          createMessage.warning(res.message);\n        }\n      })\n      .finally(() => {\n        confirmLoading.value = false;\n      });\n  }\n\n  /**\n   * popup成功回调事件\n   */\n  function popupHandleSuccess(values) {\n    Object.assign(formState, values);\n  }\n\n  /**\n   *  popup组件值改变事件\n   */\n  function setFieldsValue(map) {\n    Object.keys(map).map((key) => {\n      formState[key] = map[key];\n    });\n  }\n\n  /**\n   * 值改变事件触发\n   * @param key\n   * @param value\n   */\n  function handleFormChange(key, value) {\n    formState[key] = value;\n  }\n\n  defineExpose({\n    add,\n    edit,\n    submitForm,\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .antd-modal-form {\n    padding: 24px 24px 24px 24px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/Native/one/components/OneNativeModal.vue",
    "content": "<template>\n  <BasicModal\n    :title=\"title\"\n    :width=\"width\"\n    :visible=\"visible\"\n    :height=\"600\"\n    @ok=\"handleOk\"\n    :okButtonProps=\"{ class: { 'jee-hidden': disableSubmit } }\"\n    @cancel=\"handleCancel\"\n    cancelText=\"关闭\"\n  >\n    <OneNativeForm ref=\"realForm\" @ok=\"submitCallback\" :formDisabled=\"disableSubmit\"></OneNativeForm>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, nextTick } from 'vue';\n  import OneNativeForm from './OneNativeForm.vue';\n  import { BasicModal } from '/@/components/Modal';\n  \n  const title = ref<string>('');\n  const width = ref<number>(800);\n  const visible = ref<boolean>(false);\n  const disableSubmit = ref<boolean>(false);\n  const realForm = ref();\n  const emit = defineEmits(['register', 'ok']);\n\n  function add() {\n    title.value = '新增';\n    visible.value = true;\n    nextTick(() => {\n      realForm.value.add();\n    });\n  }\n\n  function edit(record) {\n    title.value = disableSubmit.value ? '详情' : '编辑';\n    visible.value = true;\n    nextTick(() => {\n      realForm.value.edit(record);\n    });\n  }\n\n  function handleOk() {\n    realForm.value.submitForm();\n  }\n\n  function submitCallback() {\n    handleCancel();\n    emit('ok');\n  }\n\n  function handleCancel() {\n    visible.value = false;\n  }\n\n  defineExpose({\n    add,\n    edit,\n    disableSubmit,\n  });\n</script>\n\n<style lang=\"less\">\n  /**隐藏样式-modal确定按钮 */\n  .jee-hidden {\n    display: none !important;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/PrintDemo.vue",
    "content": "<template>\n  <PageWrapper>\n    <a-card :bordered=\"false\" class=\"j-print-demo\">\n      <div style=\"text-align: right\">\n        <a-button type=\"primary\" ghost @click=\"onPrint\">打印</a-button>\n      </div>\n      <section ref=\"print\" id=\"printContent\">\n        <div style=\"text-align: center\">\n          <p style=\"font-size: 24px; font-weight: 800\">打印测试表单</p>\n        </div>\n        <!--签字-->\n        <a-col :md=\"24\" :sm=\"24\">\n          <div class=\"sign\" style=\"text-align: center; height: inherit\">\n            <a-col :span=\"24\">\n              <span>打印人员:</span>\n              <a-input style=\"width: 30%\" v-model:value=\"model.printer\" />\n              <span style=\"margin-left: 12.5%\">打印日期:</span>\n              <a-input style=\"width: 30%\" v-model:value=\"model.printTime\" />\n            </a-col>\n            <a-col :span=\"24\"> </a-col>\n            <a-col :span=\"24\" style=\"margin-top: 20px\">\n              <span>打印内容:</span>\n              <a-input style=\"width: 80%\" v-model:value=\"model.printContent\" />\n            </a-col>\n            <a-col :span=\"24\" style=\"margin-top: 20px\">\n              <span>打印目的1:</span>\n              <a-input style=\"width: 80%\" v-model:value=\"model.printReason\" />\n            </a-col>\n            <a-col :span=\"24\" style=\"margin-top: 20px\">\n              <span>打印目的2:</span>\n              <a-input style=\"width: 80%\" v-model:value=\"model.printReason\" />\n            </a-col>\n            <a-col :span=\"24\" style=\"margin-top: 20px\">\n              <span>打印目的3:</span>\n              <a-input style=\"width: 80%\" v-model:value=\"model.printReason\" />\n            </a-col>\n            <a-col :span=\"24\" style=\"margin-top: 20px\">\n              <span>打印目的4:</span>\n              <a-input style=\"width: 80%\" v-model:value=\"model.printReason\" />\n            </a-col>\n            <a-col :span=\"24\" style=\"margin-top: 20px\">\n              <span>打印目的5:</span>\n              <a-input style=\"width: 80%\" v-model:value=\"model.printReason\" />\n            </a-col>\n            <a-col :span=\"24\" style=\"margin-top: 20px\">\n              <span>打印目的6:</span>\n              <a-input style=\"width: 80%\" v-model:value=\"model.printReason\" />\n            </a-col>\n            <a-col :span=\"24\" style=\"margin-top: 20px\">\n              <span>打印目的7:</span>\n              <a-input style=\"width: 80%\" v-model:value=\"model.printReason\" />\n            </a-col>\n            <a-col :span=\"24\" style=\"margin-top: 20px\">\n              <span>打印目的8:</span>\n              <a-input style=\"width: 80%\" v-model:value=\"model.printReason\" />\n            </a-col>\n            <a-col :span=\"24\" style=\"margin-top: 20px\">\n              <span>打印目的9:</span>\n              <a-input style=\"width: 80%\" v-model:value=\"model.printReason\" />\n            </a-col>\n            <a-col :span=\"24\" style=\"margin-top: 20px\">\n              <span>打印目的10:</span>\n              <a-input style=\"width: 80%\" v-model:value=\"model.printReason\" />\n            </a-col>\n            <a-col :span=\"24\" style=\"margin-top: 20px\">\n              <span>打印目的11:</span>\n              <a-input style=\"width: 80%\" v-model:value=\"model.printReason\" />\n            </a-col>\n            <a-col :span=\"24\" style=\"margin-top: 20px\">\n              <span>打印目的12:</span>\n              <a-input style=\"width: 80%\" v-model:value=\"model.printReason\" />\n            </a-col>\n            <a-col :span=\"24\" style=\"margin-top: 20px\">\n              <span>打印目的13:</span>\n              <a-input style=\"width: 80%\" v-model:value=\"model.printReason\" />\n            </a-col>\n            <a-col :span=\"24\" style=\"margin-top: 20px\">\n              <span>打印目的14:</span>\n              <a-input style=\"width: 80%\" v-model:value=\"model.printReason\" />\n            </a-col>\n            <a-col style=\"margin-top: 20px\" :span=\"24\">\n              <span>打印图片:</span>\n              <br />\n              <a-upload\n                action=\"/jsonplaceholder.typicode.com/posts/\"\n                listType=\"picture-card\"\n                :fileList=\"model.fileList\"\n                @preview=\"handlePreview\"\n                @change=\"handleChange\"\n              >\n                <div v-if=\"model.fileList.length < 3\">\n                  <Icon icon=\"ant-design:plus-outlined\" />\n                  <div class=\"ant-upload-text\">Upload</div>\n                </div>\n              </a-upload>\n              <a-modal :open=\"previewVisible\" :footer=\"null\" @cancel=\"previewVisible = false\">\n                <img alt=\"example\" style=\"width: 100%\" :src=\"previewImage\" />\n              </a-modal>\n            </a-col>\n          </div>\n        </a-col>\n      </section>\n    </a-card>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { ref, reactive } from 'vue';\n  import { PageWrapper } from '/@/components/Page';\n  import Icon from '/@/components/Icon/src/Icon.vue';\n  import { printJS } from '/@/hooks/web/usePrintJS';\n\n  export default {\n    name: 'PrintDemo',\n    components: { PageWrapper, Icon },\n    props: {\n      reBizCode: {\n        type: String,\n        default: '',\n      },\n    },\n    setup() {\n      const model = reactive({\n        printer: '张三',\n        printTime: '2021-12-31 23:59:59',\n        printContent: '打印内容：这是一个打印测试！',\n        printReason: '做一个打印测试',\n        fileList: [\n          {\n            uid: '-1',\n            name: 'xxx.png',\n            status: 'done',\n            url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',\n          },\n          {\n            uid: '-2',\n            name: 'pic1.png',\n            status: 'done',\n            url: 'https://www.gizbot.com/img/2016/11/whatsapp-error-lead-image-08-1478607387.jpg',\n          },\n        ],\n      });\n      const previewImage = ref('');\n      const previewVisible = ref(false);\n\n      function onPrint() {\n        printJS({\n          printable: '#printContent',\n          type: 'html',\n        });\n      }\n\n      function handlePreview(file) {\n        previewImage.value = file.url || file.thumbUrl;\n        previewVisible.value = true;\n      }\n\n      function handleChange({ fileList }) {\n        model.fileList = fileList;\n      }\n\n      return {\n        model,\n        previewImage,\n        previewVisible,\n        onPrint,\n        handlePreview,\n        handleChange,\n      };\n    },\n  };\n</script>\n<style lang=\"less\" scoped>\n  .j-print-demo .ant-card-body {\n    margin-left: 0;\n    margin-right: 0;\n    margin-bottom: 1%;\n    border: 0 solid black;\n    min-width: 800px;\n    color: #000000 !important;\n  }\n\n  .sign .ant-input {\n    font-weight: bolder;\n    text-align: center;\n    border-left-width: 0 !important;\n    border-top-width: 0 !important;\n    border-right-width: 0 !important;\n    outline: none !important;\n    box-shadow: none !important;\n  }\n\n  /* you can make up upload button and sample style by using stylesheets */\n  .ant-upload-select-picture-card i {\n    font-size: 32px;\n    color: #999;\n  }\n\n  .ant-upload-select-picture-card .ant-upload-text {\n    margin-top: 8px;\n    color: #666;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/TableTotal.vue",
    "content": "<template>\n  <PageWrapper>\n    <BasicTable @register=\"registerTable\" :striped=\"true\" />\n  </PageWrapper>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import { PageWrapper } from '/@/components/Page';\n  import { BasicTable, useTable } from '/@/components/Table';\n  import { mapTableTotalSummary } from '/@/utils/common/compUtils';\n  const dataSource = ref<any>([]);\n  setTimeout(() => {\n    dataSource.value = [\n      { id: 0, name: '张三', point: 23, level: 3, updateTime: '2019-8-14' },\n      { id: 1, name: '小鹿', point: 33, level: 9, updateTime: '2019-8-10' },\n      { id: 2, name: '小王', point: 6, level: 1, updateTime: '2019-8-13' },\n      { id: 3, name: '李四', point: 53, level: 8, updateTime: '2019-8-12' },\n      { id: 4, name: '小红', point: 44, level: 5, updateTime: '2019-8-11' },\n      { id: 5, name: '王五', point: 97, level: 10, updateTime: '2019-8-10' },\n      { id: 6, name: '小明', point: 33, level: 2, updateTime: '2019-8-10' },\n      { id: 7, name: '小张', point: 33, level: 4, updateTime: '2019-8-10' },\n      { id: 8, name: '小六', point: 33, level: 2, updateTime: '2019-8-10' },\n      { id: 9, name: '小五', point: 33, level: 7, updateTime: '2019-8-10' },\n      { id: 10, name: '小赵', point: 33, level: 2, updateTime: '2019-8-10' },\n      { id: 11, name: '李华', point: 33, level: 8, updateTime: '2019-8-10' },\n      { id: 12, name: '小康', point: 33, level: 5, updateTime: '2019-8-10' },\n    ];\n  }, 1e3);\n  const [registerTable] = useTable({\n    rowKey: 'id',\n    bordered: true,\n    canResize: true,\n    columns: [\n      { title: '姓名', width: 500, dataIndex: 'name' },\n      { title: '贡献点', width: 500, dataIndex: 'point' },\n      { title: '等级', width: 500, dataIndex: 'level' },\n      { title: '更新时间', width: 500, dataIndex: 'updateTime' },\n    ],\n    dataSource: dataSource,\n    // 显示底部合计\n    showSummary: true,\n    striped: true,\n    // 底部合计计算方法\n    summaryFunc: onSummary,\n  });\n\n  function onSummary(tableData: Recordable[]) {\n    // 可用工具方法自动计算合计\n    const totals = mapTableTotalSummary(tableData, ['point', 'level']);\n    return [\n      totals,\n      {\n        _row: '平均',\n        _index: '平均',\n        // 计算平均值\n        point: (totals.point / tableData.length).toFixed(2),\n        level: (totals.level / tableData.length).toFixed(0),\n      },\n    ];\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/erplist/JeecgOrderCustomerList.vue",
    "content": "<template>\n  <div>\n    <!--表格-->\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\" :searchInfo=\"searchInfo\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"handleCreate\"> 新增</a-button>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button\n            >批量操作\n            <Icon icon=\"mdi:chevron-down\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n    </BasicTable>\n    <!-- 表单区域 -->\n    <JeecgOrderCustomerModal @register=\"registerModal\" @success=\"handleSuccess\"></JeecgOrderCustomerModal>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  //ts语法\n  import type { ComputedRef } from 'vue';\n  import { ref, computed, unref, watch, inject } from 'vue';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import JeecgOrderCustomerModal from './components/JeecgOrderCustomerModal.vue';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { useModal } from '/@/components/Modal';\n  import { customColumns } from './erplist.data';\n  import { customList, deleteCustomer, deleteBatchCustomer } from './erplist.api';\n  import { isEmpty } from '/@/utils/is';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  //接收主表id\n  const orderId = inject<ComputedRef<string>>(\n    'orderId',\n    computed(() => '')\n  );\n  //提示弹窗\n  const $message = useMessage();\n  //弹窗model\n  const [registerModal, { openModal }] = useModal();\n  const searchInfo = {};\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext } = useListPage({\n    tableProps: {\n      api: getCustomList,\n      tableSetting:{\n        cacheKey:'customer'\n      },\n      columns: customColumns,\n      canResize: false,\n      useSearchForm: false,\n      actionColumn: {\n        width: 180,\n      },\n      pagination: {\n        current: 1,\n        pageSize: 5,\n        pageSizeOptions: ['5', '10', '20'],\n      },\n    },\n  });\n\n  //注册table数据\n  const [registerTable, { reload, setSelectedRowKeys }, { rowSelection, selectedRowKeys }] = tableContext;\n\n  watch(orderId, () => {\n    searchInfo['orderId'] = unref(orderId);\n    reload();\n    // 主表id变化时，清空子表的选中状态\n    setSelectedRowKeys([]);\n  });\n\n  async function getCustomList(params) {\n    let { orderId } = params;\n    // 主表Id为空时，不查询子表数据，直接返回空数组\n    if (orderId == null || isEmpty(orderId)) {\n      return [];\n    }\n    return await customList(params);\n  }\n\n  /**\n   * 新增事件\n   */\n  function handleCreate() {\n    console.log('orderId=====》', orderId);\n    if (isEmpty(unref(orderId))) {\n      $message.createMessage.warning('请选择一个订单信息');\n      return;\n    }\n    openModal(true, {\n      isUpdate: false,\n      showFooter: true,\n    });\n  }\n\n  /**\n   * 编辑事件\n   */\n  async function handleEdit(record: Recordable) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n      showFooter: true,\n    });\n  }\n\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteCustomer({ id: record.id }, reload);\n  }\n\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await deleteBatchCustomer({ ids: selectedRowKeys.value }, () => {\n      selectedRowKeys.value = [];\n      reload();\n    });\n  }\n\n  /**\n   * 成功回调\n   */\n  function handleSuccess() {\n    reload();\n  }\n\n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/erplist/JeecgOrderTicketList.vue",
    "content": "<template>\n  <div>\n    <!--表格-->\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\" :searchInfo=\"searchInfo\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"handleCreate\"> 新增</a-button>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button\n            >批量操作\n            <Icon icon=\"mdi:chevron-down\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n    </BasicTable>\n    <!-- 表单区域 -->\n    <JeecgOrderTicketModal @register=\"registerModal\" @success=\"handleSuccess\"></JeecgOrderTicketModal>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  //ts语法\n  import type { ComputedRef } from 'vue';\n  import { ref, computed, unref, watch, inject } from 'vue';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import JeecgOrderTicketModal from './components/JeecgOrderTicketModal.vue';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { useModal } from '/@/components/Modal';\n  import { ticketColumns } from './erplist.data';\n  import { ticketList, deleteTicket, deleteBatchTicket } from './erplist.api';\n  import { isEmpty } from '/@/utils/is';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  //接收主表id\n  const orderId = inject<ComputedRef<string>>(\n    'orderId',\n    computed(() => '')\n  );\n  //提示弹窗\n  const $message = useMessage();\n  //弹窗model\n  const [registerModal, { openModal }] = useModal();\n  const searchInfo = {};\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext } = useListPage({\n    tableProps: {\n      api: getTicketList,\n      tableSetting:{\n        cacheKey:'ticket'\n      },\n      columns: ticketColumns,\n      canResize: false,\n      useSearchForm: false,\n      actionColumn: {\n        width: 180,\n      },\n      pagination: {\n        current: 1,\n        pageSize: 5,\n        pageSizeOptions: ['5', '10', '20'],\n      },\n    },\n  });\n\n  //注册table数据\n  const [registerTable, { reload, setSelectedRowKeys }, { rowSelection, selectedRowKeys }] = tableContext;\n\n  watch(orderId, () => {\n    searchInfo['orderId'] = unref(orderId);\n    reload();\n    // 主表id变化时，清空子表的选中状态\n    setSelectedRowKeys([]);\n  });\n\n  async function getTicketList(params) {\n    let { orderId } = params;\n    // 主表Id为空时，不查询子表数据，直接返回空数组\n    if (orderId == null || isEmpty(orderId)) {\n      return [];\n    }\n    return await ticketList(params);\n  }\n\n  /**\n   * 新增事件\n   */\n  function handleCreate() {\n    if (isEmpty(unref(orderId))) {\n      $message.createMessage.warning('请选择一个订单信息');\n      return;\n    }\n    openModal(true, {\n      isUpdate: false,\n      showFooter: true,\n    });\n  }\n\n  /**\n   * 编辑事件\n   */\n  async function handleEdit(record: Recordable) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n      showFooter: true,\n    });\n  }\n\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteTicket({ id: record.id }, reload);\n  }\n\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await deleteBatchTicket({ ids: selectedRowKeys.value }, () => {\n      selectedRowKeys.value = [];\n      reload();\n    });\n  }\n\n  /**\n   * 成功回调\n   */\n  function handleSuccess() {\n    reload();\n  }\n\n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/erplist/components/JeecgOrderCustomerModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"getTitle\" @ok=\"handleSubmit\" :width=\"700\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed, unref, inject } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { customerFormSchema } from '../erplist.data';\n  import { saveOrUpdateCustomer } from '../erplist.api';\n  //接收主表id\n  const orderId = inject('orderId') || '';\n  // 声明Emits\n  const emit = defineEmits(['success', 'register']);\n  const isUpdate = ref(true);\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n    labelWidth: 150,\n    schemas: customerFormSchema,\n    showActionButtonGroup: false,\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false });\n    isUpdate.value = !!data?.isUpdate;\n    if (unref(isUpdate)) {\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n    }\n  });\n  //设置标题\n  const getTitle = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));\n\n  //表单提交事件\n  async function handleSubmit() {\n    try {\n      const values = await validate();\n      setModalProps({ confirmLoading: true });\n      if (unref(orderId)) {\n        values.orderId = unref(orderId);\n      }\n      //提交表单\n      await saveOrUpdateCustomer(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/erplist/components/JeecgOrderModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"getTitle\" @ok=\"handleSubmit\" :width=\"700\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { formSchema } from '../erplist.data';\n  import { saveOrUpdate } from '../erplist.api';\n  // 声明Emits\n  const emit = defineEmits(['success', 'register']);\n  const isUpdate = ref(true);\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n    labelWidth: 150,\n    schemas: formSchema,\n    showActionButtonGroup: false,\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false });\n    isUpdate.value = !!data?.isUpdate;\n    if (unref(isUpdate)) {\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n    }\n  });\n  //设置标题\n  const getTitle = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));\n\n  //表单提交事件\n  async function handleSubmit() {\n    try {\n      const values = await validate();\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      await saveOrUpdate(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/erplist/components/JeecgOrderTicketModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"getTitle\" @ok=\"handleSubmit\" :width=\"500\" :minHeight=\"20\" :maxHeight=\"100\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed, unref, inject } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { ticketFormSchema } from '../erplist.data';\n  import { saveOrUpdateTicket } from '../erplist.api';\n  //接收主表id\n  const orderId = inject('orderId');\n  // 声明Emits\n  const emit = defineEmits(['success', 'register']);\n  const isUpdate = ref(true);\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n    // labelWidth: 150,\n    schemas: ticketFormSchema,\n    showActionButtonGroup: false,\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false });\n    isUpdate.value = !!data?.isUpdate;\n    if (unref(isUpdate)) {\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n    }\n  });\n  //设置标题\n  const getTitle = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));\n\n  //表单提交事件\n  async function handleSubmit() {\n    try {\n      const values = await validate();\n      setModalProps({ confirmLoading: true });\n      if (unref(orderId)) {\n        values.orderId = unref(orderId);\n      }\n      //提交表单\n      await saveOrUpdateTicket(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/erplist/erplist.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { Modal } from 'ant-design-vue';\n\nenum Api {\n  list = '/test/order/orderList',\n  save = '/test/order/add',\n  edit = '/test/order/edit',\n  deleteOne = '/test/order/delete',\n  deleteBatch = '/test/order/deleteBatch',\n  customList = '/test/order/listOrderCustomerByMainId',\n  saveCustomer = '/test/order/addCustomer',\n  editCustomer = '/test/order/editCustomer',\n  deleteCustomer = '/test/order/deleteCustomer',\n  deleteBatchCustomer = '/test/order/deleteBatchCustomer',\n  ticketList = '/test/order/listOrderTicketByMainId',\n  saveTicket = '/test/order/addTicket',\n  editTicket = '/test/order/editTicket',\n  deleteTicket = '/test/order/deleteTicket',\n  deleteBatchTicket = '/test/order/deleteBatchTicket',\n}\n\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) => defHttp.get({ url: Api.list, params });\n\n/**\n * 删除\n */\nexport const deleteOne = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.deleteOne, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 批量删除\n * @param params\n */\nexport const batchDelete = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n/**\n * 保存或者更新\n * @param params\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({ url: url, params });\n};\n\n/**\n * 列表接口\n * @param params\n */\nexport const customList = (params) => defHttp.get({ url: Api.customList, params });\n\n/**\n * 删除\n */\nexport const deleteCustomer = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.deleteCustomer, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 批量删除\n * @param params\n */\nexport const deleteBatchCustomer = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.deleteBatchCustomer, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n/**\n * 保存或者更新\n * @param params\n */\nexport const saveOrUpdateCustomer = (params, isUpdate) => {\n  let url = isUpdate ? Api.editCustomer : Api.saveCustomer;\n  return defHttp.post({ url: url, params });\n};\n/**\n * 列表接口\n * @param params\n */\nexport const ticketList = (params) => defHttp.get({ url: Api.ticketList, params });\n\n/**\n * 删除\n */\nexport const deleteTicket = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.deleteTicket, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 批量删除\n * @param params\n */\nexport const deleteBatchTicket = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.deleteBatchTicket, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n/**\n * 保存或者更新\n * @param params\n */\nexport const saveOrUpdateTicket = (params, isUpdate) => {\n  let url = isUpdate ? Api.editTicket : Api.saveTicket;\n  return defHttp.post({ url: url, params });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/erplist/erplist.data.ts",
    "content": "import { BasicColumn } from '/@/components/Table';\nimport { FormSchema } from '/@/components/Table';\nimport { render } from '/@/utils/common/renderUtils';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '订单号',\n    dataIndex: 'orderCode',\n    width: 260,\n  },\n  {\n    title: '订单类型',\n    dataIndex: 'ctype',\n    width: 160,\n    customRender: ({ text }) => {\n      return text == '1' ? '国内订单' : text == '2' ? '国际订单' : '';\n    },\n  },\n  {\n    title: '订单日期',\n    dataIndex: 'orderDate',\n    width: 300,\n  },\n  {\n    title: '订单金额',\n    width: 200,\n    dataIndex: 'orderMoney',\n  },\n  {\n    title: '订单备注',\n    width: 200,\n    dataIndex: 'content',\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    label: '订单号',\n    field: 'orderCode',\n    component: 'Input',\n    colProps: { span: 6 },\n  },\n  {\n    label: '订单类型',\n    field: 'ctype',\n    component: 'Select',\n    componentProps: {\n      options: [\n        {\n          label: '国内订单',\n          value: '1',\n          key: '1',\n        },\n        {\n          label: '国际订单',\n          value: '2',\n          key: '2',\n        },\n      ],\n    },\n    colProps: { span: 6 },\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    label: '',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '订单号',\n    field: 'orderCode',\n    component: 'Input',\n    required: true,\n  },\n  {\n    label: '订单类型',\n    field: 'ctype',\n    component: 'Select',\n    componentProps: {\n      options: [\n        {\n          label: '国内订单',\n          value: '1',\n          key: '1',\n        },\n        {\n          label: '国际订单',\n          value: '2',\n          key: '2',\n        },\n      ],\n    },\n  },\n  {\n    label: '订单日期',\n    field: 'orderDate',\n    component: 'DatePicker',\n    componentProps: {\n      valueFormat: 'YYYY-MM-DD hh:mm:ss',\n    },\n  },\n  {\n    label: '订单金额',\n    field: 'orderMoney',\n    component: 'InputNumber',\n  },\n  {\n    label: '订单备注',\n    field: 'content',\n    component: 'Input',\n  },\n];\n\nexport const customColumns: BasicColumn[] = [\n  {\n    title: '客户名',\n    dataIndex: 'name',\n    width: 260,\n  },\n  {\n    title: '性别',\n    dataIndex: 'sex',\n    width: 100,\n    customRender: ({ text }) => {\n      return render.renderDict(text, 'sex');\n    },\n  },\n  {\n    title: '身份证号',\n    dataIndex: 'idcard',\n    width: 300,\n  },\n  {\n    title: '电话',\n    width: 200,\n    dataIndex: 'telphone',\n  },\n];\n\nexport const customerFormSchema: FormSchema[] = [\n  {\n    label: '',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '客户姓名',\n    field: 'name',\n    component: 'Input',\n    required: true,\n  },\n  {\n    label: '性别',\n    field: 'sex',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'sex',\n      placeholder: '请选择性别',\n    },\n  },\n  {\n    label: '身份证号码',\n    field: 'idcard',\n    component: 'Input',\n  },\n  {\n    label: '身份证扫描件',\n    field: 'idcardPic',\n    component: 'JImageUpload',\n    componentProps: {\n      fileMax: 2,\n    },\n  },\n  {\n    label: '联系方式',\n    field: 'telphone',\n    component: 'Input',\n    rules: [{ required: false, pattern: /^1[3456789]\\d{9}$/, message: '手机号码格式有误' }],\n  },\n  {\n    label: 'orderId',\n    field: 'orderId',\n    component: 'Input',\n    show: false,\n  },\n];\n\nexport const ticketColumns: BasicColumn[] = [\n  {\n    title: '航班号',\n    dataIndex: 'ticketCode',\n  },\n  {\n    title: '航班时间',\n    dataIndex: 'tickectDate',\n  },\n  {\n    title: '创建人',\n    dataIndex: 'createBy',\n  },\n  {\n    title: '创建时间',\n    dataIndex: 'createTime',\n  },\n];\n\nexport const ticketFormSchema: FormSchema[] = [\n  {\n    label: '',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '航班号',\n    field: 'ticketCode',\n    component: 'Input',\n    required: true,\n  },\n  {\n    label: '航班时间',\n    field: 'tickectDate',\n    component: 'DatePicker',\n    componentProps: {\n      valueFormat: 'YYYY-MM-DD',\n      getPopupContainer:()=>document.body,\n    },\n  },\n  {\n    label: 'orderId',\n    field: 'orderId',\n    component: 'Input',\n    show: false,\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/erplist/index.vue",
    "content": "<template>\n  <div>\n    <!--主表表格-->\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"handleCreate\"> 新增</a-button>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button\n            >批量操作\n            <Icon icon=\"mdi:chevron-down\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n    </BasicTable>\n    <!--子表表格tab-->\n    <a-tabs defaultActiveKey=\"1\" style=\"margin: 10px\">\n      <a-tab-pane tab=\"客户信息\" key=\"1\">\n        <JeecgOrderCustomerList />\n      </a-tab-pane>\n      <a-tab-pane tab=\"机票信息\" key=\"2\" forceRender>\n        <JeecgOrderTicketList />\n      </a-tab-pane>\n    </a-tabs>\n  </div>\n  <!-- 表单区域 -->\n  <JeecgOrderModal @register=\"registerModal\" @success=\"handleSuccess\"></JeecgOrderModal>\n</template>\n\n<script lang=\"ts\" name=\"tab-list\" setup>\n  //ts语法\n  import { ref, computed, unref, watch, provide } from 'vue';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { useModal } from '/@/components/Modal';\n  import JeecgOrderModal from './components/JeecgOrderModal.vue';\n  import JeecgOrderCustomerList from './JeecgOrderCustomerList.vue';\n  import JeecgOrderTicketList from './JeecgOrderTicketList.vue';\n  import { columns, searchFormSchema } from './erplist.data';\n  import { list, deleteOne, batchDelete } from './erplist.api';\n\n  //弹窗model\n  const [registerModal, { openModal }] = useModal();\n\n  // 列表页面公共参数、方法\n  const { tableContext } = useListPage({\n    tableProps: {\n      api: list,\n      tableSetting:{\n        cacheKey:'erp_main'\n      },\n      columns: columns,\n      canResize: false,\n      rowSelection: { type: 'radio' },\n      formConfig: {\n        schemas: searchFormSchema,\n      },\n      actionColumn: {\n        width: 180,\n      },\n      pagination: {\n        current: 1,\n        pageSize: 5,\n        pageSizeOptions: ['5', '10', '20'],\n      },\n    },\n  });\n  //注册table数据\n  const [registerTable, { reload, updateTableDataRecord }, { rowSelection, selectedRowKeys }] = tableContext;\n\n  const orderId = computed(() => (unref(selectedRowKeys).length > 0 ? unref(selectedRowKeys)[0] : ''));\n  //下发 orderId,子组件接收\n  provide('orderId', orderId);\n\n  /**\n   * 新增事件\n   */\n  function handleCreate() {\n    openModal(true, {\n      isUpdate: false,\n      showFooter: true,\n    });\n  }\n\n  /**\n   * 编辑事件\n   */\n  async function handleEdit(record: Recordable) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n      showFooter: true,\n    });\n  }\n\n  /**\n   * 详情\n   */\n  async function handleDetail(record: Recordable) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n      showFooter: false,\n    });\n  }\n\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteOne({ id: record.id }, reload);\n  }\n\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDelete({ ids: selectedRowKeys.value }, () => {\n      selectedRowKeys.value = [];\n      reload();\n    });\n  }\n\n  /**\n   * 成功回调\n   */\n  function handleSuccess() {\n    reload();\n  }\n\n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/index.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <a-card :bordered=\"false\" style=\"height: 100%\">\n      <a-tabs v-model:activeKey=\"activeKey\" @change=\"tabChange\">\n        <a-tab-pane key=\"JeecgComponents\" tab=\"下拉选择组件\"></a-tab-pane>\n        <a-tab-pane key=\"JCodeEditDemo\" tab=\"代码编辑器\" force-render></a-tab-pane>\n        <a-tab-pane key=\"JEditorDemo\" tab=\"富文本&MakeDown\"></a-tab-pane>\n        <a-tab-pane key=\"ImgDragSort\" tab=\"图片拖拽\"></a-tab-pane>\n        <a-tab-pane key=\"ImgTurnPage\" tab=\"图片翻页\"></a-tab-pane>\n        <a-tab-pane key=\"JeecgPdfView\" tab=\"PDF预览\"></a-tab-pane>\n        <a-tab-pane key=\"JUploadDemo\" tab=\"文件上传\"></a-tab-pane>\n      </a-tabs>\n      <component :is=\"currentComponent\"></component>\n    </a-card>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, computed } from 'vue';\n  import JeecgComponents from './JeecgComponents.vue';\n  import JEditorDemo from './JEditorDemo.vue';\n  import JCodeEditDemo from './JCodeEditDemo.vue';\n  import ImgDragSort from './ImgDragSort.vue';\n  import ImgTurnPage from './ImgTurnPage.vue';\n  import JeecgPdfView from './JeecgPdfView.vue';\n  import JUploadDemo from './JUploadDemo.vue';\n  export default defineComponent({\n    name: 'comp-jeecg-basic',\n    setup() {\n      const activeKey = ref('JeecgComponents');\n      const currentComponent = computed(() => {\n        const componentType = {\n          JeecgComponents: JeecgComponents,\n          JEditorDemo: JEditorDemo,\n          JCodeEditDemo: JCodeEditDemo,\n          ImgDragSort: ImgDragSort,\n          ImgTurnPage: ImgTurnPage,\n          JeecgPdfView: JeecgPdfView,\n          JUploadDemo: JUploadDemo,\n        };\n        return componentType[activeKey.value];\n      });\n\n      //使用component动态切换tab\n      function tabChange(key) {\n        activeKey.value = key;\n      }\n      return {\n        activeKey,\n        currentComponent,\n        tabChange,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/jeecgComponents.data.ts",
    "content": "import { FormSchema, JCronValidator } from '/@/components/Form';\nimport { usePermission } from '/@/hooks/web/usePermission';\n\nconst { isDisabledAuth } = usePermission();\nexport const schemas: FormSchema[] = [\n  {\n    field: 'jdst',\n    component: 'JDictSelectTag',\n    label: '性别下拉',\n    helpMessage: ['component模式'],\n    componentProps: {\n      dictCode: 'sex',\n    },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'jdst',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'jdst1',\n    component: 'JDictSelectTag',\n    label: '性别选择',\n    helpMessage: ['component模式'],\n    componentProps: {\n      dictCode: 'sex',\n      type: 'radioButton',\n    },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'jdst1',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'jdst2',\n    component: 'JDictSelectTag',\n    label: '字典表下拉',\n    helpMessage: ['component模式'],\n    componentProps: {\n      dictCode: 'sys_user,realname,id',\n    },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'jdst2',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'jdst3',\n    component: 'JDictSelectTag',\n    label: '字典表下拉(带条件)',\n    helpMessage: ['component模式'],\n    componentProps: {\n      dictCode: \"sys_user,realname,id,username!='admin' order by create_time\",\n    },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'jdst3',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'jsst',\n    component: 'JSearchSelect',\n    label: '字典搜索(同步)',\n    colProps: { span: 12 },\n    componentProps: {\n      //dict: \"sys_depart,depart_name,id\",\n      dictOptions: [\n        {\n          text: '选项一',\n          value: '1',\n        },\n        {\n          text: '选项二',\n          value: '2',\n        },\n        {\n          text: '选项三',\n          value: '3',\n        },\n      ],\n    },\n  },\n  {\n    field: 'jsst',\n    component: 'JEllipsis',\n    label: '选择值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'jsst2',\n    component: 'JSearchSelect',\n    label: '字典搜索(异步)',\n    colProps: { span: 12 },\n    componentProps: {\n      dict: 'sys_depart,depart_name,id',\n      pageSize: 6,\n      async: true,\n    },\n  },\n  {\n    field: 'jsst2',\n    component: 'JEllipsis',\n    label: '选择值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'xldx',\n    component: 'JDictSelectTag',\n    label: '字典下拉多选',\n    colProps: { span: 12 },\n    componentProps: {\n      dictCode: 'sex',\n      mode: 'multiple',\n    },\n  },\n  {\n    field: 'xldx',\n    component: 'JEllipsis',\n    label: '选择值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'xldx2',\n    component: 'JSelectMultiple',\n    label: '字典下拉多选2',\n    colProps: { span: 12 },\n    componentProps: {\n      dictCode: 'sex',\n    },\n  },\n  {\n    field: 'xldx2',\n    component: 'JEllipsis',\n    label: '选择值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'dxxlk',\n    component: 'JDictSelectTag',\n    label: '字典下拉单选',\n    colProps: { span: 12 },\n    componentProps: {\n      dictCode: 'sex',\n    },\n  },\n  {\n    field: 'dxxlk',\n    component: 'JEllipsis',\n    label: '选择值',\n    colProps: { span: 12 },\n  },\n  {\n    label: '可输入下拉',\n    field: 'selectInput',\n    component: 'JSelectInput',\n    componentProps: {\n      options: [\n        { label: '选项一', value: '1' },\n        { label: '选项二', value: '2' },\n        { label: '选项三', value: '3' },\n      ],\n    },\n    colProps: { span: 12 },\n  },\n  {\n    field: 'selectInput',\n    component: 'JEllipsis',\n    label: '选择值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'depart3',\n    component: 'JSelectDept',\n    label: '选择部门—自定义值',\n    helpMessage: ['component模式'],\n    componentProps: { showButton: false, rowKey: 'orgCode', primaryKey: 'orgCode' },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'depart3',\n    component: 'JEllipsis',\n    label: '选中部门',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'depart2',\n    component: 'JSelectDept',\n    label: '选择部门',\n    helpMessage: ['component模式'],\n    componentProps: { showButton: false },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'depart2',\n    component: 'JEllipsis',\n    label: '选中部门',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'depart4',\n    component: 'JSelectDepartPost',\n    label: '选择岗位',\n    helpMessage: ['component模式'],\n    componentProps: { showButton: false },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'depart4',\n    component: 'JEllipsis',\n    label: '选择岗位',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'user2',\n    component: 'JSelectUser',\n    label: '用户选择组件',\n    helpMessage: ['component模式'],\n    componentProps: {\n      labelKey: 'realname',\n      rowKey: 'id',\n      showSelected: true,\n    },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'user2',\n    component: 'JEllipsis',\n    label: '选中用户',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'user3',\n    component: 'JSelectUserByDept',\n    label: '部门选择用户',\n    helpMessage: ['component模式'],\n    componentProps: {\n      labelKey: 'realname',\n      rowKey: 'username',\n    },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'user3',\n    component: 'JEllipsis',\n    label: '选中用户',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'userPost1',\n    component: 'JSelectUserByDeptPost',\n    label: '部门岗位选择用户',\n    helpMessage: ['component模式'],\n    componentProps: {\n      labelKey: 'realname',\n      rowKey: 'username',\n    },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'userPost1',\n    component: 'JEllipsis',\n    label: '选中用户',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'user4',\n    component: 'JSelectUserByDepartment',\n    label: '部门选择用户',\n    helpMessage: ['component模式'],\n    defaultValue: '',\n    componentProps: {\n      labelKey: 'realname',\n      rowKey: 'username',\n    },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'user4',\n    component: 'JEllipsis',\n    label: '选中用户',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'role2',\n    component: 'JSelectRole',\n    label: '角色选择组件',\n    helpMessage: ['component模式'],\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'role2',\n    component: 'JEllipsis',\n    label: '选中角色',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'position2',\n    component: 'JSelectPosition',\n    label: '职务选择组件',\n    helpMessage: ['component模式'],\n    colProps: { span: 12 },\n    componentProps: { async: true, showSelectTable: true },\n  },\n  {\n    field: 'position2',\n    component: 'JEllipsis',\n    label: '选中职务',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'checkbox1',\n    component: 'JCheckbox',\n    label: 'JCheckbox组件1',\n    helpMessage: ['component模式'],\n    defaultValue: '1,2',\n    componentProps: {\n      options: [\n        { label: '男', value: '1' },\n        { label: '女', value: '2' },\n      ],\n    },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'checkbox1',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'checkbox2',\n    component: 'Input',\n    label: 'JCheckbox组件2',\n    defaultValue: '1',\n    helpMessage: ['插槽模式'],\n    slot: 'JCheckbox',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'checkbox2',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'data1',\n    label: '日期选择',\n    component: 'DatePicker',\n    componentProps: {\n      showTime: true,\n      valueFormat: 'YYYY-MM-DD HH:mm:ss',\n    },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'data1',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'data2',\n    label: '年份范围选择',\n    component: 'RangePicker',\n    componentProps: {\n      picker: 'year',\n      valueFormat: 'YYYY',\n    },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'data2',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'hk',\n    component: 'Input',\n    label: '滑块验证码',\n    helpMessage: ['插槽模式'],\n    slot: 'dargVerify',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'hk',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'JTreeDict',\n    component: 'JTreeDict',\n    label: '树字典',\n    helpMessage: ['component模式'],\n    colProps: { span: 12 },\n  },\n  {\n    field: 'JTreeDict',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'ts',\n    component: 'JTreeSelect',\n    label: '下拉树选择',\n    helpMessage: ['component模式'],\n    componentProps: {\n      dict: 'sys_permission,name,id',\n      pidField: 'parent_id',\n      hasChildField: 'is_leaf',\n      converIsLeafVal: 0,\n    },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'ts',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'ts1',\n    component: 'JTreeSelect',\n    label: '下拉树多选',\n    helpMessage: ['component模式'],\n    componentProps: {\n      dict: 'sys_permission,name,id',\n      pidField: 'parent_id',\n      hasChildField: 'is_leaf',\n      converIsLeafVal: 0,\n      multiple: true,\n    },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'ts1',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'category',\n    component: 'JCategorySelect',\n    label: '分类字典树',\n    helpMessage: ['component模式'],\n    defaultValue: '',\n    componentProps: {\n      pcode: 'B01',\n      multiple: true,\n    },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'category',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'JEasyCron',\n    component: 'JEasyCron',\n    label: 'JEasyCron',\n    helpMessage: ['component模式'],\n    colProps: { span: 12 },\n    defaultValue: '* * * * * ? *',\n    rules: [{ validator: JCronValidator }],\n  },\n  {\n    field: 'JEasyCron',\n    component: 'JEllipsis',\n    label: '选择值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'JInput',\n    component: 'JInput',\n    label: '特殊查询组件',\n    helpMessage: ['插槽模式'],\n    slot: 'JInput',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'jinputtype',\n    component: 'Select',\n    label: '查询类型',\n    componentProps: {\n      options: [\n        { value: 'like', label: '模糊（like）' },\n        { value: 'ne', label: '不等于（ne）' },\n        { value: 'ge', label: '大于等于（ge）' },\n        { value: 'le', label: '小于等于（le)' },\n      ],\n    },\n    colProps: {\n      span: 6,\n    },\n  },\n  {\n    field: 'JInput',\n    component: 'JEllipsis',\n    label: '输入值',\n    colProps: { span: 6 },\n  },\n  {\n    field: 'field1',\n    component: 'Select',\n    label: '省市区选择',\n    helpMessage: ['插槽模式'],\n    slot: 'jAreaLinkage',\n    colProps: {\n      span: 12,\n    },\n    defaultValue: ['130000', '130200'],\n  },\n  {\n    field: 'field1',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'field0',\n    component: 'Select',\n    label: '禁用组件(方式一)',\n    helpMessage: ['插槽模式'],\n    slot: 'jAreaLinkage1',\n    colProps: {\n      span: 12,\n    },\n    defaultValue: ['130000', '130200'],\n  },\n\n  {\n    field: 'field0',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'field2',\n    component: 'JAreaLinkage',\n    label: '禁用组件(方式二)',\n    helpMessage: ['component模式'],\n    colProps: {\n      span: 12,\n    },\n    dynamicDisabled: ({ values }) => {\n      console.log(values);\n      return isDisabledAuth(['demo.dbarray']);\n    },\n    defaultValue: ['140000', '140300', '140302'],\n  },\n  {\n    field: 'field2',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'pca1',\n    component: 'JAreaSelect',\n    label: '省市区级联',\n    helpMessage: ['component模式'],\n    defaultValue: '140302',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'pca1',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'pop1',\n    component: 'Input',\n    label: 'JPopup示例',\n    helpMessage: ['插槽模式'],\n    slot: 'JPopup',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'pop1',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'pop2',\n    component: 'Input',\n    label: 'JPopup带参数示例',\n    helpMessage: ['插槽模式'],\n    slot: 'JPopup2',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'pop2',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'pop3',\n    component: 'Input',\n    label: 'JPopup带查询条件参数示例',\n    helpMessage: ['插槽模式'],\n    slot: 'JPopup3',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'pop3',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'JInputPop',\n    component: 'JInputPop',\n    label: 'JInputPop',\n    helpMessage: ['component模式'],\n    colProps: { span: 12 },\n  },\n  {\n    field: 'JInputPop',\n    component: 'JEllipsis',\n    label: '输入值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'JTreeDictAsync',\n    component: 'JTreeDict',\n    label: '异步JTreeDict',\n    helpMessage: ['component模式'],\n    colProps: { span: 12 },\n    componentProps: { async: true },\n  },\n  {\n    field: 'JTreeDictAsync',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'JSwitch',\n    component: 'JSwitch',\n    label: 'JSwitch',\n    helpMessage: ['component模式'],\n    colProps: { span: 12 },\n  },\n  {\n    field: 'JSwitch',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'JSwitchSelect',\n    component: 'JSwitch',\n    label: 'JSwitchSelect',\n    helpMessage: ['component模式'],\n    colProps: { span: 12 },\n    componentProps: { query: true },\n  },\n  {\n    field: 'JSwitchSelect',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n  \n  {\n    field: 'userSelect2',\n    component: 'UserSelect',\n    label: '高级用户选择',\n    helpMessage: ['component模式'],\n    colProps: { span: 12 },\n  },\n  {\n    field: 'userSelect2',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n  \n  {\n    field: 'superQuery',\n    component: 'Input',\n    label: '高级查询',\n    helpMessage: ['插槽模式'],\n    slot: 'superQuery',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'superQuery',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'superQuery1',\n    component: 'Input',\n    label: '高级查询',\n    helpMessage: ['插槽模式-自己保存查询条件'],\n    slot: 'superQuery1',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'superQuery1',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'pop2',\n    component: 'JPopupDict',\n    label: 'JPopupDict示例',\n    colProps: {\n      span: 12,\n    },\n    componentProps:{\n      placeholder: '请选择',\n      dictCode: 'report_user,username,id',\n      multi: true,\n    },\n  },\n  {\n    field: 'pop2',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'sex',\n    component: 'JDictSelectTag',\n    label: '性别(控制下方课程options)',\n    helpMessage: ['component模式','性别不同，下方课程展示选项不同'],\n    componentProps: {\n      dictCode: 'sex',\n      type: 'radioButton',\n      onChange: (value) => {\n        console.log(value);\n      },\n    },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'sex',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'course',\n    component: 'Select',\n    label: '课程',\n    dynamicPropskey: 'options',\n    dynamicPropsVal: ({ model }) => {\n      let options;\n      if (model.sex == 1) {\n        return [\n          { value: '0', label: 'java - 男' },\n          { value: '1', label: 'vue - 男' },\n        ];\n      } else if (model.sex == 2) {\n        return [\n          { value: '2', label: '瑜伽 - 女' },\n          { value: '3', label: '美甲 - 女' },\n        ];\n      } else {\n        return [];\n      }\n    },\n    componentProps: {\n      disabled: false,\n    },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'course',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'field100',\n    component: 'JInputSelect',\n    label: 'JInputSelect',\n    helpMessage: ['component模式'],\n    componentProps: {\n      selectPlaceholder: '可选择系统变量',\n      inputPlaceholder: '请输入',\n      selectWidth:'200px',\n      options: [\n        {\n          label: '登录用户账号',\n          value: '#{sys_user_code}',\n        },\n        {\n          label: '登录用户名称',\n          value: '#{sys_user_name}',\n        },\n        {\n          label: '当前日期',\n          value: '#{sys_date}',\n        },\n        {\n          label: '当前时间',\n          value: '#{sys_time}',\n        },\n        {\n          label: '登录用户部门',\n          value: '#{sys_org_code}',\n        },\n        {\n          label: '用户拥有部门',\n          value: '#{sys_multi_org_code}',\n        },\n        {\n          label: '登录用户租户',\n          value: '#{tenant_id}',\n        },\n      ],\n    },\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'field100',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n  {\n    field: 'JAreaLinkage',\n    component: 'JAreaLinkage',\n    label: '省市区选择',\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'JAreaLinkage',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n\n  {\n    field: 'orderAuth',\n    component: 'Input',\n    label: '指令权限',\n    helpMessage: ['有权限右侧的\"选中值\"可见，否则不可见'],\n    colProps: {\n      span: 12,\n    },\n  },\n  {\n    field: 'orderAuth',\n    auth: 'demo:order:auth',\n    component: 'JEllipsis',\n    label: '选中值',\n    colProps: { span: 12 },\n  },\n  \n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/jeecg/model/JeecgOrderModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"title\" @ok=\"handleSubmit\" width=\"700px\">\n    <BasicForm @register=\"registerForm\" />\n    <!--TODO 子表Tab数据-->\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { defHttp } from '/@/utils/http/axios';\n  // Emits声明\n  const emit = defineEmits(['register', 'success']);\n  const isUpdate = ref(true);\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n    labelWidth: 150,\n    schemas: [\n      {\n        field: 'orderCode',\n        label: '订单号',\n        component: 'Input',\n        required: true,\n      },\n      {\n        field: 'ctype',\n        label: '订单类型',\n        component: 'Select',\n        componentProps: {\n          options: [\n            { label: '国内订单', value: '1' },\n            { label: '国际订单', value: '2' },\n          ],\n        },\n      },\n      {\n        field: 'orderDate',\n        label: '订单日期',\n        component: 'DatePicker',\n        componentProps: {\n          valueFormat: 'YYYY-MM-DD hh:mm:ss',\n        },\n      },\n      {\n        field: 'orderMoney',\n        label: '订单金额',\n        component: 'InputNumber',\n      },\n      {\n        field: 'content',\n        label: '订单备注',\n        component: 'Input',\n      },\n      {\n        field: 'id',\n        label: 'id',\n        component: 'Input',\n        show: false,\n      },\n    ],\n    showActionButtonGroup: false,\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false });\n    isUpdate.value = !!data?.isUpdate;\n    if (unref(isUpdate)) {\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n    }\n  });\n  //设置标题\n  const title = computed(() => (!unref(isUpdate) ? '新增订单' : '编辑订单'));\n  //表单提交事件\n  async function handleSubmit(v) {\n    try {\n      let values = await validate();\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      let url = unref(isUpdate) ? '/test/order/edit' : '/test/order/add';\n      defHttp.post({ url: url, params: values });\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/level/Menu111.vue",
    "content": "<template>\n  <div class=\"p-5\">\n    多层级缓存-页面1-1-1\n    <br />\n    <Input />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { Input } from 'ant-design-vue';\n  export default defineComponent({ name: 'Menu111Demo', components: { Input } });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/level/Menu12.vue",
    "content": "<template>\n  <div class=\"p-5\">\n    多层级缓存-页面1-2\n    <br />\n    <Input />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { Input } from 'ant-design-vue';\n  export default defineComponent({ name: 'Menu12Demo', components: { Input } });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/level/Menu2.vue",
    "content": "<template>\n  <div class=\"p-5\">\n    多层级缓存-页面2\n    <br />\n    <Input />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { Input } from 'ant-design-vue';\n  export default defineComponent({\n    name: 'Menu2Demo',\n    components: { Input },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/main-out/index.vue",
    "content": "<template>\n  <div class=\"fixed h-full w-full flex flex-col justify-center items-center text-4xl\">\n    <div class=\"\"> 位于主框架外的页面 </div>\n    <a-button @click=\"$router.go(-1)\" class=\"mt-10\" type=\"primary\">Back</a-button>\n  </div>\n</template>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/account/center/Application.vue",
    "content": "<template>\n  <List :class=\"prefixCls\">\n    <a-row :gutter=\"16\">\n      <template v-for=\"item in list\" :key=\"item.title\">\n        <a-col :span=\"6\">\n          <ListItem>\n            <Card :hoverable=\"true\" :class=\"`${prefixCls}__card`\">\n              <div :class=\"`${prefixCls}__card-title`\">\n                <Icon class=\"icon\" v-if=\"item.icon\" :icon=\"item.icon\" :color=\"item.color\" />\n                {{ item.title }}\n              </div>\n              <div :class=\"`${prefixCls}__card-num`\">\n                活跃用户：<span>{{ item.active }}</span> 万\n              </div>\n              <div :class=\"`${prefixCls}__card-num`\">\n                新增用户：<span>{{ item.new }}</span>\n              </div>\n              <Icon :class=\"`${prefixCls}__card-download`\" v-if=\"item.download\" :icon=\"item.download\" />\n            </Card>\n          </ListItem>\n        </a-col>\n      </template>\n    </a-row>\n  </List>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { List, Card, Row, Col } from 'ant-design-vue';\n  import Icon from '/@/components/Icon/index';\n  import { applicationList } from './data';\n\n  export default defineComponent({\n    components: {\n      List,\n      ListItem: List.Item,\n      Card,\n      Icon,\n      [Row.name]: Row,\n      [Col.name]: Col,\n    },\n    setup() {\n      return {\n        prefixCls: 'account-center-application',\n        list: applicationList,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  .account-center-application {\n    &__card {\n      width: 100%;\n      margin-bottom: -12px;\n\n      .ant-card-body {\n        padding: 16px;\n      }\n\n      &-title {\n        margin-bottom: 5px;\n        font-size: 16px;\n        font-weight: 500;\n\n        .icon {\n          margin-top: -5px;\n          font-size: 22px;\n        }\n      }\n\n      &-num {\n        margin-left: 24px;\n        line-height: 36px;\n        color: @text-color-secondary;\n\n        span {\n          margin-left: 5px;\n          font-size: 18px;\n        }\n      }\n\n      &-download {\n        float: right;\n        font-size: 20px !important;\n        color: @primary-color;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/account/center/Article.vue",
    "content": "<template>\n  <List item-layout=\"vertical\" :class=\"prefixCls\">\n    <template v-for=\"item in list\" :key=\"item.title\">\n      <ListItem>\n        <ListItemMeta>\n          <template #description>\n            <div :class=\"`${prefixCls}__content`\">\n              {{ item.content }}\n            </div>\n          </template>\n          <template #title>\n            <p :class=\"`${prefixCls}__title`\">\n              {{ item.title }}\n            </p>\n            <div>\n              <template v-for=\"tag in item.description\" :key=\"tag\">\n                <Tag class=\"mb-2\">\n                  {{ tag }}\n                </Tag>\n              </template>\n            </div>\n          </template>\n        </ListItemMeta>\n        <div>\n          <template v-for=\"action in actions\" :key=\"action.text\">\n            <div :class=\"`${prefixCls}__action`\">\n              <Icon v-if=\"action.icon\" :class=\"`${prefixCls}__action-icon`\" :icon=\"action.icon\" :color=\"action.color\" />\n              {{ action.text }}\n            </div>\n          </template>\n          <span :class=\"`${prefixCls}__time`\">{{ item.time }}</span>\n        </div>\n      </ListItem>\n    </template>\n  </List>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { List, Tag } from 'ant-design-vue';\n  import Icon from '/@/components/Icon/index';\n  import { actions, articleList } from './data';\n\n  export default defineComponent({\n    components: {\n      List,\n      ListItem: List.Item,\n      ListItemMeta: List.Item.Meta,\n      Tag,\n      Icon,\n    },\n    setup() {\n      return {\n        prefixCls: 'account-center-article',\n        list: articleList,\n        actions,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .account-center-article {\n    &__title {\n      margin-bottom: 12px;\n      font-size: 18px;\n    }\n\n    &__content {\n      color: rgba(0, 0, 0, 0.65);\n    }\n\n    &__action {\n      display: inline-block;\n      padding: 0 16px;\n      color: rgba(0, 0, 0, 0.45);\n\n      &:nth-child(1),\n      &:nth-child(2) {\n        border-right: 1px solid rgba(206, 206, 206, 0.4);\n      }\n\n      &-icon {\n        margin-right: 3px;\n      }\n    }\n\n    &__time {\n      position: absolute;\n      right: 20px;\n      color: rgba(0, 0, 0, 0.45);\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/account/center/Project.vue",
    "content": "<template>\n  <List :class=\"prefixCls\">\n    <a-row :gutter=\"16\">\n      <template v-for=\"item in list\" :key=\"item.title\">\n        <a-col :span=\"6\">\n          <ListItem>\n            <Card :hoverable=\"true\" :class=\"`${prefixCls}__card`\">\n              <img :src=\"demoImg\" />\n              <div :class=\"`${prefixCls}__card-title`\">\n                {{ item.title }}\n              </div>\n              <div :class=\"`${prefixCls}__card-content`\">\n                {{ item.content }}\n              </div>\n            </Card>\n          </ListItem>\n        </a-col>\n      </template>\n    </a-row>\n  </List>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { List, Card, Row, Col } from 'ant-design-vue';\n  import demoImg from '/@/assets/images/demo.png';\n  import { projectList } from './data';\n\n  export default defineComponent({\n    components: {\n      List,\n      ListItem: List.Item,\n      Card,\n      [Row.name]: Row,\n      [Col.name]: Col,\n    },\n    setup() {\n      return {\n        prefixCls: 'account-center-project',\n        list: projectList,\n        demoImg,\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  .account-center-project {\n    &__card {\n      width: 100%;\n\n      .ant-card-body {\n        padding: 0 0 24px 0;\n      }\n\n      img {\n        width: 100%;\n        height: 130px;\n      }\n\n      &-title {\n        margin: 5px 10px;\n        font-size: 16px;\n        font-weight: 500;\n        color: rgba(0, 0, 0, 0.85);\n      }\n\n      &-content {\n        margin: 5px 10px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/account/center/data.tsx",
    "content": "export interface ListItem {\n  title: string;\n  icon: string;\n  color?: string;\n}\n\nexport interface TabItem {\n  key: string;\n  name: string;\n  component: string;\n}\n\nexport const tags: string[] = ['很有想法的', '专注设计', '川妹子', '大长腿', '海纳百川', '前端开发', 'vue3'];\n<span class=\"iconify\" data-icon=\"jam:codepen-circle\" data-inline=\"false\"></span>;\nexport const teams: ListItem[] = [\n  {\n    icon: 'ri:alipay-fill',\n    title: '科学搬砖组',\n    color: '#ff4000',\n  },\n  {\n    icon: 'emojione-monotone:letter-a',\n    title: '中二少年团',\n    color: '#7c51b8',\n  },\n  {\n    icon: 'ri:alipay-fill',\n    title: '高逼格设计',\n    color: '#00adf7',\n  },\n  {\n    icon: 'jam:codepen-circle',\n    title: '程序员日常',\n    color: '#00adf7',\n  },\n  {\n    icon: 'fa:behance-square',\n    title: '科学搬砖组',\n    color: '#7c51b8',\n  },\n  {\n    icon: 'jam:codepen-circle',\n    title: '程序员日常',\n    color: '#ff4000',\n  },\n];\n\nexport const details: ListItem[] = [\n  {\n    icon: 'ic:outline-contacts',\n    title: '交互专家',\n  },\n  {\n    icon: 'grommet-icons:cluster',\n    title: '某某某事业群',\n  },\n  {\n    icon: 'bx:bx-home-circle',\n    title: '福建省厦门市',\n  },\n];\n\nexport const achieveList: TabItem[] = [\n  {\n    key: '1',\n    name: '文章',\n    component: 'Article',\n  },\n  {\n    key: '2',\n    name: '应用',\n    component: 'Application',\n  },\n  {\n    key: '3',\n    name: '项目',\n    component: 'Project',\n  },\n];\n\nexport const actions: any[] = [\n  { icon: 'clarity:star-line', text: '156', color: '#018ffb' },\n  { icon: 'bx:bxs-like', text: '156', color: '#459ae8' },\n  { icon: 'bx:bxs-message-dots', text: '2', color: '#42d27d' },\n];\n\nexport const articleList = (() => {\n  const result: any[] = [];\n  for (let i = 0; i < 4; i++) {\n    result.push({\n      title: 'Jeecg Admin',\n      description: ['Jeecg', '设计语言', 'Typescript'],\n      content: '基于Vue Next, TypeScript, Ant Design实现的一套完整的企业级后台管理系统。',\n      time: '2020-11-14 11:20',\n    });\n  }\n  return result;\n})();\n\nexport const applicationList = (() => {\n  const result: any[] = [];\n  for (let i = 0; i < 8; i++) {\n    result.push({\n      title: 'Jeecg Admin',\n      icon: 'emojione-monotone:letter-a',\n      color: '#1890ff',\n      active: '100',\n      new: '1,799',\n      download: 'bx:bx-download',\n    });\n  }\n  return result;\n})();\n\nexport const projectList = (() => {\n  const result: any[] = [];\n  for (let i = 0; i < 8; i++) {\n    result.push({\n      title: 'Jeecg Admin',\n      content: '基于Vue Next, TypeScript, Ant Design实现的一套完整的企业级后台管理系统。',\n    });\n  }\n  return result;\n})();\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/account/center/index.vue",
    "content": "<template>\n  <div :class=\"prefixCls\">\n    <a-row :class=\"`${prefixCls}-top`\">\n      <a-col :span=\"9\" :class=\"`${prefixCls}-col`\">\n        <a-row>\n          <a-col :span=\"8\">\n            <div :class=\"`${prefixCls}-top__avatar`\">\n              <img width=\"70\" :src=\"avatar\" />\n              <span>Jeecg</span>\n              <div>海纳百川，有容乃大</div>\n            </div>\n          </a-col>\n          <a-col :span=\"16\">\n            <div :class=\"`${prefixCls}-top__detail`\">\n              <template v-for=\"detail in details\" :key=\"detail.title\">\n                <p>\n                  <Icon :icon=\"detail.icon\" />\n                  {{ detail.title }}\n                </p>\n              </template>\n            </div>\n          </a-col>\n        </a-row>\n      </a-col>\n      <a-col :span=\"7\" :class=\"`${prefixCls}-col`\">\n        <CollapseContainer title=\"标签\" :canExpan=\"false\">\n          <template v-for=\"tag in tags\" :key=\"tag\">\n            <Tag class=\"mb-2\">\n              {{ tag }}\n            </Tag>\n          </template>\n        </CollapseContainer>\n      </a-col>\n      <a-col :span=\"8\" :class=\"`${prefixCls}-col`\">\n        <CollapseContainer :class=\"`${prefixCls}-top__team`\" title=\"团队\" :canExpan=\"false\">\n          <div v-for=\"(team, index) in teams\" :key=\"index\" :class=\"`${prefixCls}-top__team-item`\">\n            <Icon :icon=\"team.icon\" :color=\"team.color\" />\n            <span>{{ team.title }}</span>\n          </div>\n        </CollapseContainer>\n      </a-col>\n    </a-row>\n    <div :class=\"`${prefixCls}-bottom`\">\n      <Tabs>\n        <template v-for=\"item in achieveList\" :key=\"item.key\">\n          <TabPane :tab=\"item.name\">\n            <component :is=\"item.component\" />\n          </TabPane>\n        </template>\n      </Tabs>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { Tag, Tabs, Row, Col } from 'ant-design-vue';\n  import { defineComponent, computed } from 'vue';\n  import { CollapseContainer } from '/@/components/Container/index';\n  import Icon from '/@/components/Icon/index';\n  import Article from './Article.vue';\n  import Application from './Application.vue';\n  import Project from './Project.vue';\n\n  import headerImg from '/@/assets/images/header.jpg';\n  import { tags, teams, details, achieveList } from './data';\n  import { useUserStore } from '/@/store/modules/user';\n\n  export default defineComponent({\n    components: {\n      CollapseContainer,\n      Icon,\n      Tag,\n      Tabs,\n      TabPane: Tabs.TabPane,\n      Article,\n      Application,\n      Project,\n      [Row.name]: Row,\n      [Col.name]: Col,\n    },\n    setup() {\n      const userStore = useUserStore();\n      const avatar = computed(() => userStore.getUserInfo.avatar || headerImg);\n      return {\n        prefixCls: 'account-center',\n        avatar,\n        tags,\n        teams,\n        details,\n        achieveList,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .account-center {\n    &-col:not(:last-child) {\n      padding: 0 10px;\n\n      &:not(:last-child) {\n        border-right: 1px dashed rgb(206, 206, 206, 0.5);\n      }\n    }\n\n    &-top {\n      padding: 10px;\n      margin: 16px 16px 12px 16px;\n      background-color: @component-background;\n      border-radius: 3px;\n\n      &__avatar {\n        text-align: center;\n\n        img {\n          margin: auto;\n          border-radius: 50%;\n        }\n\n        span {\n          display: block;\n          font-size: 20px;\n          font-weight: 500;\n        }\n\n        div {\n          margin-top: 3px;\n          font-size: 12px;\n        }\n      }\n\n      &__detail {\n        padding-left: 20px;\n        margin-top: 15px;\n      }\n\n      &__team {\n        &-item {\n          display: inline-block;\n          padding: 4px 24px;\n        }\n\n        span {\n          margin-left: 3px;\n        }\n      }\n    }\n\n    &-bottom {\n      padding: 10px;\n      margin: 0 16px 16px 16px;\n      background-color: @component-background;\n      border-radius: 3px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/account/setting/AccountBind.vue",
    "content": "<template>\n  <CollapseContainer title=\"账号绑定\" :canExpan=\"false\">\n    <List>\n      <template v-for=\"item in list\" :key=\"item.key\">\n        <ListItem>\n          <ListItemMeta>\n            <template #avatar>\n              <Icon v-if=\"item.avatar\" class=\"avatar\" :icon=\"item.avatar\" :color=\"item.color\" />\n            </template>\n            <template #title>\n              {{ item.title }}\n              <a-button type=\"link\" size=\"small\" v-if=\"item.extra\" class=\"extra\">\n                {{ item.extra }}\n              </a-button>\n            </template>\n            <template #description>\n              <div>{{ item.description }} </div>\n            </template>\n          </ListItemMeta>\n        </ListItem>\n      </template>\n    </List>\n  </CollapseContainer>\n</template>\n<script lang=\"ts\">\n  import { List } from 'ant-design-vue';\n  import { defineComponent } from 'vue';\n  import { CollapseContainer } from '/@/components/Container/index';\n  import Icon from '/@/components/Icon/index';\n\n  import { accountBindList } from './data';\n\n  export default defineComponent({\n    components: {\n      CollapseContainer,\n      List,\n      ListItem: List.Item,\n      ListItemMeta: List.Item.Meta,\n      Icon,\n    },\n    setup() {\n      return {\n        list: accountBindList,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .avatar {\n    font-size: 40px !important;\n  }\n\n  .extra {\n    float: right;\n    margin-top: 10px;\n    margin-right: 30px;\n    cursor: pointer;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/account/setting/BaseSetting.vue",
    "content": "<template>\n  <CollapseContainer title=\"基本设置\" :canExpan=\"false\">\n    <a-row :gutter=\"24\">\n      <a-col :span=\"14\">\n        <BasicForm @register=\"register\" />\n      </a-col>\n      <a-col :span=\"10\">\n        <div class=\"change-avatar\">\n          <div class=\"mb-2\"> 头像 </div>\n          <CropperAvatar\n            :uploadApi=\"uploadImg\"\n            :value=\"avatar\"\n            btnText=\"更换头像\"\n            :btnProps=\"{ preIcon: 'ant-design:cloud-upload-outlined' }\"\n            @change=\"updateAvatar\"\n            width=\"150\"\n          />\n        </div>\n      </a-col>\n    </a-row>\n    <Button type=\"primary\" @click=\"handleSubmit\"> 更新基本信息 </Button>\n  </CollapseContainer>\n</template>\n<script lang=\"ts\">\n  import { Button, Row, Col } from 'ant-design-vue';\n  import { computed, defineComponent, onMounted } from 'vue';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { CollapseContainer } from '/@/components/Container';\n  import { CropperAvatar } from '/@/components/Cropper';\n\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  import headerImg from '/@/assets/images/header.jpg';\n  import { defHttp } from '/@/utils/http/axios';\n  import { baseSetschemas } from './data';\n  import { useUserStore } from '/@/store/modules/user';\n  import { uploadImg } from '/@/api/sys/upload';\n  import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';\n\n  export default defineComponent({\n    components: {\n      BasicForm,\n      CollapseContainer,\n      Button,\n      ARow: Row,\n      ACol: Col,\n      CropperAvatar,\n    },\n    setup() {\n      const { createMessage } = useMessage();\n      const userStore = useUserStore();\n\n      const [register, { setFieldsValue, validate }] = useForm({\n        labelWidth: 120,\n        schemas: baseSetschemas,\n        showActionButtonGroup: false,\n      });\n\n      onMounted(async () => {\n        //const data = await accountInfoApi();\n        const userInfo = userStore.getUserInfo;\n        setFieldsValue(userInfo);\n      });\n\n      const avatar = computed(() => {\n        const { avatar } = userStore.getUserInfo;\n        return getFileAccessHttpUrl(avatar) || headerImg;\n      });\n\n      function updateAvatar(src: string, data: string) {\n        console.log('data====》', data);\n        const userinfo = userStore.getUserInfo;\n        userinfo.avatar = data;\n        userStore.setUserInfo(userinfo);\n        // 代码逻辑说明: [VUEN-2161]用户设置上传头像成功之后直接保存------------\n        if(data){\n          defHttp.post({ url: '/sys/user/appEdit', params:{avatar:data} });\n        }\n      }\n      /**\n       *更新基本信息\n       * */\n      async function handleSubmit() {\n        try {\n          let values = await validate();\n          values.avatar = userStore.getUserInfo.avatar\n          console.log('values', values);\n          //提交表单\n          defHttp.post({ url: '/sys/user/appEdit', params: values });\n          const userinfo = userStore.getUserInfo;\n          Object.assign(userinfo, values);\n          userStore.setUserInfo(userinfo);\n          createMessage.success('更新成功');\n        } catch (e) {\n          console.log('e', e);\n        }\n      }\n\n      return {\n        avatar,\n        register,\n        uploadImg,\n        updateAvatar,\n        handleSubmit,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .change-avatar {\n    img {\n      display: block;\n      margin-bottom: 15px;\n      border-radius: 50%;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/account/setting/MsgNotify.vue",
    "content": "<template>\n  <CollapseContainer title=\"新消息通知\" :canExpan=\"false\">\n    <List>\n      <template v-for=\"item in list\" :key=\"item.key\">\n        <ListItem>\n          <ListItemMeta>\n            <template #title>\n              {{ item.title }}\n              <Switch class=\"extra\" checked-children=\"开\" un-checked-children=\"关\" default-checked />\n            </template>\n            <template #description>\n              <div>{{ item.description }} </div>\n            </template>\n          </ListItemMeta>\n        </ListItem>\n      </template>\n    </List>\n  </CollapseContainer>\n</template>\n<script lang=\"ts\">\n  import { List, Switch } from 'ant-design-vue';\n  import { defineComponent } from 'vue';\n  import { CollapseContainer } from '/@/components/Container/index';\n\n  import { msgNotifyList } from './data';\n\n  export default defineComponent({\n    components: {\n      CollapseContainer,\n      List,\n      ListItem: List.Item,\n      ListItemMeta: List.Item.Meta,\n      Switch,\n    },\n    setup() {\n      return {\n        list: msgNotifyList,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .extra {\n    float: right;\n    margin-top: 10px;\n    margin-right: 30px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/account/setting/SecureSetting.vue",
    "content": "<template>\n  <CollapseContainer title=\"安全设置\" :canExpan=\"false\">\n    <List>\n      <template v-for=\"item in list\" :key=\"item.key\">\n        <ListItem>\n          <ListItemMeta>\n            <template #title>\n              {{ item.title }}\n              <div class=\"extra\" v-if=\"item.extra\" @click=\"extraClick(item.key)\">\n                {{ item.extra }}\n              </div>\n            </template>\n            <template #description>\n              <div>{{ item.description }} </div>\n            </template>\n          </ListItemMeta>\n        </ListItem>\n      </template>\n    </List>\n  </CollapseContainer>\n  <UpdatePassword ref=\"updatePasswordRef\" />\n</template>\n<script lang=\"ts\">\n  import { List } from 'ant-design-vue';\n  import { defineComponent, ref } from 'vue';\n  import { CollapseContainer } from '/@/components/Container/index';\n\n  import { secureSettingList } from './data';\n  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n  import { useUserStore } from '/@/store/modules/user';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  export default defineComponent({\n    components: {\n      CollapseContainer,\n      List,\n      ListItem: List.Item,\n      ListItemMeta: List.Item.Meta,\n      UpdatePassword: createAsyncComponent(() => import('/@/layouts/default/header/components/user-dropdown/UpdatePassword.vue')),\n    },\n    setup() {\n      const { createMessage } = useMessage();\n      const userStore = useUserStore();\n      const updatePasswordRef = ref();\n      function extraClick(key) {\n        if (key == '1') {\n          updatePasswordRef.value.show(userStore.getUserInfo.username);\n        } else {\n          createMessage.warning('暂不支持');\n        }\n      }\n      return {\n        updatePasswordRef,\n        extraClick,\n        list: secureSettingList,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .extra {\n    float: right;\n    margin-top: 10px;\n    margin-right: 30px;\n    font-weight: normal;\n    color: #1890ff;\n    cursor: pointer;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/account/setting/data.ts",
    "content": "import { FormSchema } from '/@/components/Form/index';\nimport { rules } from '/@/utils/helper/validator';\n\nexport interface ListItem {\n  key: string;\n  title: string;\n  description: string;\n  extra?: string;\n  avatar?: string;\n  color?: string;\n}\n\n// tab的list\nexport const settingList = [\n  {\n    key: '1',\n    name: '基本设置',\n    component: 'BaseSetting',\n  },\n  {\n    key: '2',\n    name: '安全设置',\n    component: 'SecureSetting',\n  },\n  /* {\n    key: '3',\n    name: '账号绑定',\n    component: 'AccountBind',\n  },\n  {\n    key: '4',\n    name: '新消息通知',\n    component: 'MsgNotify',\n  },*/\n];\n\n// 基础设置 form\nexport const baseSetschemas: FormSchema[] = [\n  {\n    label: '',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    field: 'realname',\n    component: 'Input',\n    label: '昵称',\n    colProps: { span: 18 },\n  },\n  {\n    field: 'sex',\n    label: '性别',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'sex',\n      placeholder: '请选择性别',\n      stringToNumber: true,\n    },\n    colProps: { span: 18 },\n  },\n  {\n    label: '生日',\n    field: 'birthday',\n    component: 'DatePicker',\n    colProps: { span: 18 },\n  },\n  {\n    field: 'email',\n    component: 'Input',\n    label: '邮箱',\n    colProps: { span: 18 },\n  },\n  {\n    field: 'phone',\n    component: 'Input',\n    label: '联系电话',\n    dynamicRules: ({ model, schema }) => {\n      return [\n        { ...rules.duplicateCheckRule('sys_user', 'phone', model, schema, false)[0] },\n        { pattern: /^1[3456789]\\d{9}$/, message: '手机号码格式有误' },\n      ];\n    },\n    colProps: { span: 18 },\n  },\n];\n\n// 安全设置 list\nexport const secureSettingList: ListItem[] = [\n  {\n    key: '1',\n    title: '账户密码',\n    description: '当前密码强度：：强',\n    extra: '修改',\n  },\n  {\n    key: '2',\n    title: '密保手机',\n    description: '已绑定手机：：138****8293',\n    extra: '修改',\n  },\n  {\n    key: '3',\n    title: '密保问题',\n    description: '未设置密保问题，密保问题可有效保护账户安全',\n    extra: '修改',\n  },\n  {\n    key: '4',\n    title: '备用邮箱',\n    description: '已绑定邮箱：：ant***sign.com',\n    extra: '修改',\n  },\n  {\n    key: '5',\n    title: 'MFA 设备',\n    description: '未绑定 MFA 设备，绑定后，可以进行二次确认',\n    extra: '修改',\n  },\n];\n\n// 账号绑定 list\nexport const accountBindList: ListItem[] = [\n  {\n    key: '1',\n    title: '绑定淘宝',\n    description: '当前未绑定淘宝账号',\n    extra: '绑定',\n    avatar: 'ri:taobao-fill',\n    color: '#ff4000',\n  },\n  {\n    key: '2',\n    title: '绑定支付宝',\n    description: '当前未绑定支付宝账号',\n    extra: '绑定',\n    avatar: 'fa-brands:alipay',\n    color: '#2eabff',\n  },\n  {\n    key: '3',\n    title: '绑定钉钉',\n    description: '当前未绑定钉钉账号',\n    extra: '绑定',\n    avatar: 'ri:dingding-fill',\n    color: '#2eabff',\n  },\n];\n\n// 新消息通知 list\nexport const msgNotifyList: ListItem[] = [\n  {\n    key: '1',\n    title: '账户密码',\n    description: '其他用户的消息将以站内信的形式通知',\n  },\n  {\n    key: '2',\n    title: '系统消息',\n    description: '系统消息将以站内信的形式通知',\n  },\n  {\n    key: '3',\n    title: '待办任务',\n    description: '待办任务将以站内信的形式通知',\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/account/setting/index.vue",
    "content": "<template>\n  <ScrollContainer>\n    <div ref=\"wrapperRef\" :class=\"prefixCls\">\n      <Tabs tab-position=\"left\" :tabBarStyle=\"tabBarStyle\">\n        <template v-for=\"item in settingList\" :key=\"item.key\">\n          <TabPane :tab=\"item.name\">\n            <component :is=\"item.component\" />\n          </TabPane>\n        </template>\n      </Tabs>\n    </div>\n  </ScrollContainer>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { Tabs } from 'ant-design-vue';\n\n  import { ScrollContainer } from '/@/components/Container/index';\n  import { settingList } from './data';\n\n  import BaseSetting from './BaseSetting.vue';\n  import SecureSetting from './SecureSetting.vue';\n  import AccountBind from './AccountBind.vue';\n  import MsgNotify from './MsgNotify.vue';\n\n  export default defineComponent({\n    components: {\n      ScrollContainer,\n      Tabs,\n      TabPane: Tabs.TabPane,\n      BaseSetting,\n      SecureSetting,\n      AccountBind,\n      MsgNotify,\n    },\n    setup() {\n      return {\n        prefixCls: 'account-setting',\n        settingList,\n        tabBarStyle: {\n          width: '220px',\n          marginBottom: '200px',\n        },\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  .account-setting {\n    margin: 12px;\n    background-color: @component-background;\n\n    .base-title {\n      padding-left: 0;\n    }\n\n    .ant-tabs-tab-active {\n      background-color: @item-active-bg;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/desc/basic/data.tsx",
    "content": "import { DescItem } from '/@/components/Description/index';\nimport { BasicColumn } from '/@/components/Table/src/types/table';\nimport { Button } from '/@/components/Button';\n\nimport { Badge } from 'ant-design-vue';\n\nexport const refundData = {\n  a1: '1000000000',\n  a2: '已取货',\n  a3: '1234123421',\n  a4: '3214321432',\n};\n\nexport const personData = {\n  b1: '付小小',\n  b2: '18100000000',\n  b3: '菜鸟仓储',\n  b4: '浙江省杭州市西湖区万塘路18号',\n  b5: '无',\n};\nexport const refundSchema: DescItem[] = [\n  {\n    field: 'a1',\n    label: '取货单号',\n  },\n  {\n    field: 'a2',\n    label: '状态',\n  },\n  {\n    field: 'a3',\n    label: '销售单号',\n  },\n  {\n    field: 'a4',\n    label: '子订单',\n  },\n];\nexport const personSchema: DescItem[] = [\n  {\n    field: 'b1',\n    label: '用户姓名',\n  },\n  {\n    field: 'b2',\n    label: '联系电话',\n  },\n  {\n    field: 'b3',\n    label: '常用快递',\n  },\n  {\n    field: 'b4',\n    label: '取货地址',\n  },\n  {\n    field: 'b5',\n    label: '备注',\n  },\n];\n\nexport const refundTableSchema: BasicColumn[] = [\n  {\n    title: '商品编号',\n    width: 150,\n    dataIndex: 't1',\n    customRender: ({ record }) => {\n      return (\n        <Button type=\"link\" size=\"small\">\n          {() => record.t1}\n        </Button>\n      );\n    },\n  },\n  {\n    title: '商品名称',\n    width: 150,\n    dataIndex: 't2',\n  },\n  {\n    title: '商品条码',\n    width: 150,\n    dataIndex: 't3',\n  },\n  {\n    title: '单价\t',\n    width: 150,\n    dataIndex: 't4',\n  },\n  {\n    title: '数量（件）\t',\n    width: 150,\n    dataIndex: 't5',\n  },\n  {\n    title: '金额',\n    width: 150,\n    dataIndex: 't6',\n  },\n];\nexport const refundTimeTableSchema: BasicColumn[] = [\n  {\n    title: '时间',\n    width: 150,\n    dataIndex: 't1',\n  },\n  {\n    title: '当前进度',\n    width: 150,\n    dataIndex: 't2',\n  },\n  {\n    title: '状态',\n    width: 150,\n    dataIndex: 't3',\n    customRender: ({ record }) => {\n      return <Badge status=\"success\" text={record.t3} />;\n    },\n  },\n  {\n    title: '操作员ID\t',\n    width: 150,\n    dataIndex: 't4',\n  },\n  {\n    title: '耗时',\n    width: 150,\n    dataIndex: 't5',\n  },\n];\n\nexport const refundTableData: any[] = [\n  {\n    t1: 1234561,\n    t2: '矿泉水 550ml',\n    t3: '12421432143214321',\n    t4: '2.00',\n    t5: 1,\n    t6: 2.0,\n  },\n  {\n    t1: 1234562,\n    t2: '矿泉水 550ml',\n    t3: '12421432143214321',\n    t4: '2.00',\n    t5: 2,\n    t6: 2.0,\n  },\n  {\n    t1: 1234562,\n    t2: '矿泉水 550ml',\n    t3: '12421432143214321',\n    t4: '2.00',\n    t5: 2,\n    t6: 2.0,\n  },\n  {\n    t1: 1234562,\n    t2: '矿泉水 550ml',\n    t3: '12421432143214321',\n    t4: '2.00',\n    t5: 2,\n    t6: 2.0,\n  },\n];\n\nexport const refundTimeTableData: any[] = [\n  {\n    t1: '2017-10-01 14:10',\n    t2: '联系客户',\n    t3: '进行中',\n    t4: '取货员 ID1234',\n    t5: '5mins',\n  },\n  {\n    t1: '2017-10-01 14:10',\n    t2: '取货员出发',\n    t3: '成功',\n    t4: '取货员 ID1234',\n    t5: '5mins',\n  },\n  {\n    t1: '2017-10-01 14:10',\n    t2: '取货员接单',\n    t3: '成功',\n    t4: '系统',\n    t5: '5mins',\n  },\n  {\n    t1: '2017-10-01 14:10',\n    t2: '申请审批通过',\n    t3: '成功',\n    t4: '用户',\n    t5: '1h',\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/desc/basic/index.vue",
    "content": "<template>\n  <PageWrapper title=\"基础详情页\" contentBackground>\n    <Description size=\"middle\" title=\"退款申请\" :bordered=\"false\" :column=\"3\" :data=\"refundData\" :schema=\"refundSchema\" />\n    <a-divider />\n    <Description size=\"middle\" title=\"用户信息\" :bordered=\"false\" :column=\"3\" :data=\"personData\" :schema=\"personSchema\" />\n    <a-divider />\n\n    <BasicTable @register=\"registerRefundTable\" />\n    <a-divider />\n    <BasicTable @register=\"registerTimeTable\" />\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { Description } from '/@/components/Description/index';\n  import { BasicTable, useTable } from '/@/components/Table';\n  import { PageWrapper } from '/@/components/Page';\n  import { Divider } from 'ant-design-vue';\n\n  import {\n    refundSchema,\n    refundData,\n    personSchema,\n    personData,\n    refundTableSchema,\n    refundTimeTableSchema,\n    refundTableData,\n    refundTimeTableData,\n  } from './data';\n  export default defineComponent({\n    components: { Description, BasicTable, PageWrapper, [Divider.name]: Divider },\n    setup() {\n      const [registerRefundTable] = useTable({\n        title: '退货商品',\n        dataSource: refundTableData,\n        columns: refundTableSchema,\n        pagination: false,\n        showIndexColumn: false,\n        scroll: { y: 300 },\n        showSummary: true,\n        summaryFunc: handleSummary,\n      });\n\n      const [registerTimeTable] = useTable({\n        title: '退货进度',\n        columns: refundTimeTableSchema,\n        pagination: false,\n        dataSource: refundTimeTableData,\n        showIndexColumn: false,\n        scroll: { y: 300 },\n      });\n\n      function handleSummary(tableData: any[]) {\n        let totalT5 = 0;\n        let totalT6 = 0;\n        tableData.forEach((item) => {\n          totalT5 += item.t5;\n          totalT6 += item.t6;\n        });\n        return [\n          {\n            t1: '总计',\n            t5: totalT5,\n            t6: totalT6,\n          },\n        ];\n      }\n      return {\n        registerRefundTable,\n        registerTimeTable,\n        refundSchema,\n        refundData,\n        personSchema,\n        personData,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .desc-wrap {\n    padding: 16px;\n    background-color: @component-background;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/desc/high/data.tsx",
    "content": "import { BasicColumn } from '/@/components/Table/src/types/table';\n\nimport { Badge } from 'ant-design-vue';\n\nexport const refundTimeTableSchema: BasicColumn[] = [\n  {\n    title: '时间',\n    width: 150,\n    dataIndex: 't1',\n  },\n  {\n    title: '当前进度',\n    width: 150,\n    dataIndex: 't2',\n  },\n  {\n    title: '状态',\n    width: 150,\n    dataIndex: 't3',\n    customRender: ({ record }) => {\n      return <Badge status=\"success\" text={record.t3} />;\n    },\n  },\n  {\n    title: '操作员ID\t',\n    width: 150,\n    dataIndex: 't4',\n  },\n  {\n    title: '耗时',\n    width: 150,\n    dataIndex: 't5',\n  },\n];\n\nexport const refundTimeTableData: any[] = [\n  {\n    t1: '2017-10-01 14:10',\n    t2: '联系客户',\n    t3: '进行中',\n    t4: '取货员 ID1234',\n    t5: '5mins',\n  },\n  {\n    t1: '2017-10-01 14:10',\n    t2: '取货员出发',\n    t3: '成功',\n    t4: '取货员 ID1234',\n    t5: '5mins',\n  },\n  {\n    t1: '2017-10-01 14:10',\n    t2: '取货员接单',\n    t3: '成功',\n    t4: '系统',\n    t5: '5mins',\n  },\n  {\n    t1: '2017-10-01 14:10',\n    t2: '申请审批通过',\n    t3: '成功',\n    t4: '用户',\n    t5: '1h',\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/desc/high/index.vue",
    "content": "<template>\n  <PageWrapper title=\"单号：234231029431\" contentBackground>\n    <template #extra>\n      <a-button> 操作一 </a-button>\n      <a-button> 操作二 </a-button>\n      <a-button type=\"primary\"> 主操作 </a-button>\n    </template>\n\n    <template #footer>\n      <a-tabs default-active-key=\"1\">\n        <a-tab-pane key=\"1\" tab=\"详情\" />\n        <a-tab-pane key=\"2\" tab=\"规则\" />\n      </a-tabs>\n    </template>\n\n    <div class=\"pt-4 m-4 desc-wrap\">\n      <a-descriptions size=\"small\" :column=\"2\">\n        <a-descriptions-item label=\"创建人\"> 曲丽丽 </a-descriptions-item>\n        <a-descriptions-item label=\"订购产品\"> XX 服务 </a-descriptions-item>\n        <a-descriptions-item label=\"创建时间\"> 2017-01-10 </a-descriptions-item>\n        <a-descriptions-item label=\"关联单据\">\n          <a>12421</a>\n        </a-descriptions-item>\n        <a-descriptions-item label=\"生效日期\"> 2017-07-07 ~ 2017-08-08 </a-descriptions-item>\n        <a-descriptions-item label=\"备注\"> 请于两个工作日内确认 </a-descriptions-item>\n      </a-descriptions>\n      <a-card title=\"流程进度\" :bordered=\"false\">\n        <a-steps :current=\"1\" progress-dot size=\"small\">\n          <a-step title=\"创建项目\">\n            <template #description> <div>Jeecg</div> <p>2016-12-12 12:32</p> </template>\n          </a-step>\n          <a-step title=\"部门初审\">\n            <template #description>\n              <p>Chad</p>\n            </template>\n          </a-step>\n          <a-step title=\"财务复核\" />\n          <a-step title=\"完成\" />\n        </a-steps>\n      </a-card>\n\n      <a-card title=\"用户信息\" :bordered=\"false\" class=\"mt-5\">\n        <a-descriptions :column=\"3\">\n          <a-descriptions-item label=\"用户姓名\"> 付小小 </a-descriptions-item>\n          <a-descriptions-item label=\"会员卡号\"> XX 32943898021309809423 </a-descriptions-item>\n          <a-descriptions-item label=\"身份证\"> 3321944288191034921 </a-descriptions-item>\n          <a-descriptions-item label=\"联系方式\"> 18100000000 </a-descriptions-item>\n          <a-descriptions-item label=\"联系地址\" :span=\"2\"> 曲丽丽 18100000000 浙江省杭州市西湖区黄姑山路工专路交叉路口 </a-descriptions-item>\n        </a-descriptions>\n\n        <a-descriptions title=\"信息组\" :column=\"3\">\n          <a-descriptions-item label=\"某某数据\"> 111 </a-descriptions-item>\n          <a-descriptions-item label=\"该数据更新时间\"> 2017-08-08 </a-descriptions-item>\n          <a-descriptions-item label=\"某某数据\"> 725 </a-descriptions-item>\n          <a-descriptions-item label=\"该数据更新时间\"> 2017-08-08 </a-descriptions-item>\n        </a-descriptions>\n\n        <h4>信息组</h4>\n        <a-card title=\"多层级信息组\">\n          <a-descriptions title=\"组名称\" :column=\"3\">\n            <a-descriptions-item label=\"负责人\"> 林东东 </a-descriptions-item>\n            <a-descriptions-item label=\"角色码\"> 1234567 </a-descriptions-item>\n            <a-descriptions-item label=\"所属部门\"> XX公司 - YY部 </a-descriptions-item>\n            <a-descriptions-item label=\"过期时间\"> 2017-08-08 </a-descriptions-item>\n            <a-descriptions-item label=\"描述\" :span=\"2\"> 这段描述很长很长很长很长很长很长很长很长很长很长很长很长很长很长... </a-descriptions-item>\n          </a-descriptions>\n          <a-divider />\n          <a-descriptions title=\"组名称\" :column=\"1\">\n            <a-descriptions-item label=\"学名\">\n              Citrullus lanatus (Thunb.) Matsum. et Nakai一年生蔓生藤本；茎、枝粗壮，具明显的棱。卷须较粗..\n            </a-descriptions-item>\n          </a-descriptions>\n          <a-divider />\n          <a-descriptions title=\"组名称\" :column=\"1\">\n            <a-descriptions-item label=\"负责人\"> 付小小 </a-descriptions-item>\n            <a-descriptions-item label=\"角色码\"> 1234568 </a-descriptions-item>\n          </a-descriptions>\n        </a-card>\n      </a-card>\n      <a-card title=\"用户近半年来电记录\" class=\"my-5\">\n        <Empty />\n      </a-card>\n      <BasicTable @register=\"registerTimeTable\" />\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable, useTable } from '/@/components/Table';\n  import { PageWrapper } from '/@/components/Page';\n  import { Divider, Card, Empty, Descriptions, Steps, Tabs } from 'ant-design-vue';\n\n  import { refundTimeTableSchema, refundTimeTableData } from './data';\n  export default defineComponent({\n    components: {\n      BasicTable,\n      PageWrapper,\n      [Divider.name]: Divider,\n      [Card.name]: Card,\n      Empty,\n      [Descriptions.name]: Descriptions,\n      [Descriptions.Item.name]: Descriptions.Item,\n      [Steps.name]: Steps,\n      [Steps.Step.name]: Steps.Step,\n      [Tabs.name]: Tabs,\n      [Tabs.TabPane.name]: Tabs.TabPane,\n    },\n    setup() {\n      const [registerTimeTable] = useTable({\n        title: '退货进度',\n        columns: refundTimeTableSchema,\n        pagination: false,\n        dataSource: refundTimeTableData,\n        showIndexColumn: false,\n        scroll: { y: 300 },\n      });\n\n      return {\n        registerTimeTable,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/form/basic/data.ts",
    "content": "import { FormSchema } from '/@/components/Form';\n\nexport const schemas: FormSchema[] = [\n  {\n    field: 'title',\n    component: 'Input',\n    label: '标题',\n    componentProps: {\n      placeholder: '给目标起个名字',\n    },\n    required: true,\n  },\n  {\n    field: 'time',\n    component: 'RangePicker',\n    label: '起止日期',\n    required: true,\n  },\n  {\n    field: 'target',\n    component: 'InputTextArea',\n    label: '目标描述',\n    componentProps: {\n      placeholder: '请输入你的阶段性工作目标',\n      rows: 4,\n    },\n    required: true,\n  },\n  {\n    field: 'metrics',\n    component: 'InputTextArea',\n    label: '衡量标准',\n    componentProps: {\n      placeholder: '请输入衡量标准',\n      rows: 4,\n    },\n    required: true,\n  },\n  {\n    field: 'client',\n    component: 'Input',\n    label: '客户',\n    helpMessage: '目标的服务对象',\n    subLabel: '( 选填 )',\n    componentProps: {\n      placeholder: '请描述你服务的客户，内部客户直接 @姓名／工号',\n    },\n  },\n  {\n    field: 'inviteer',\n    component: 'Input',\n    label: '邀评人',\n    subLabel: '( 选填 )',\n    componentProps: {\n      placeholder: '请直接 @姓名／工号，最多可邀请 5 人',\n    },\n  },\n  {\n    field: 'weights',\n    component: 'InputNumber',\n    label: '权重',\n    subLabel: '( 选填 )',\n    componentProps: {\n      formatter: (value: string) => (value ? `${value}%` : ''),\n      parser: (value: string) => value.replace('%', ''),\n      placeholder: '请输入',\n    },\n  },\n  {\n    field: 'disclosure',\n    component: 'RadioGroup',\n    label: '目标公开',\n    itemProps: {\n      extra: '客户、邀评人默认被分享',\n    },\n    componentProps: {\n      options: [\n        {\n          label: '公开',\n          value: '1',\n        },\n        {\n          label: '部分公开',\n          value: '2',\n        },\n        {\n          label: '不公开',\n          value: '3',\n        },\n      ],\n    },\n  },\n  {\n    field: 'disclosurer',\n    component: 'Select',\n    label: ' ',\n    show: ({ model }) => {\n      return model.disclosure === '2';\n    },\n    componentProps: {\n      placeholder: '公开给',\n      mode: 'multiple',\n      options: [\n        {\n          label: '同事1',\n          value: '1',\n        },\n        {\n          label: '同事2',\n          value: '2',\n        },\n        {\n          label: '同事3',\n          value: '3',\n        },\n      ],\n    },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/form/basic/index.vue",
    "content": "<template>\n  <PageWrapper title=\"基础表单\" contentBackground content=\" 表单页用于向用户收集或验证信息，基础表单常见于数据项较少的表单场景。\" contentClass=\"p-4\">\n    <BasicForm @register=\"register\" />\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { BasicForm, useForm } from '/@/components/Form';\n  import { defineComponent } from 'vue';\n  import { schemas } from './data';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    name: 'FormBasicPage',\n    components: { BasicForm, PageWrapper },\n    setup() {\n      const { createMessage } = useMessage();\n      const [register, { validate, setProps }] = useForm({\n        labelCol: {\n          span: 8,\n        },\n        wrapperCol: {\n          span: 10,\n        },\n        schemas: schemas,\n        actionColOptions: {\n          offset: 8,\n          span: 12,\n        },\n        submitButtonOptions: {\n          text: '提交',\n        },\n        submitFunc: customSubmitFunc,\n      });\n\n      async function customSubmitFunc() {\n        try {\n          await validate();\n          setProps({\n            submitButtonOptions: {\n              loading: true,\n            },\n          });\n          setTimeout(() => {\n            setProps({\n              submitButtonOptions: {\n                loading: false,\n              },\n            });\n            createMessage.success('提交成功！');\n          }, 2000);\n        } catch (error) {}\n      }\n\n      return { register };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .form-wrap {\n    padding: 24px;\n    background-color: @component-background;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/form/high/PersonTable.vue",
    "content": "<template>\n  <div>\n    <BasicTable @register=\"registerTable\" @edit-change=\"handleEditChange\">\n      <template #action=\"{ record, column }\">\n        <TableAction :actions=\"createActions(record, column)\" />\n      </template>\n    </BasicTable>\n    <a-button block class=\"mt-5\" type=\"dashed\" @click=\"handleAdd\"> 新增成员 </a-button>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable, useTable, TableAction, BasicColumn, ActionItem, EditRecordRow } from '/@/components/Table';\n\n  const columns: BasicColumn[] = [\n    {\n      title: '成员姓名',\n      dataIndex: 'name',\n      editRow: true,\n    },\n    {\n      title: '工号',\n      dataIndex: 'no',\n      editRow: true,\n    },\n    {\n      title: '所属部门',\n      dataIndex: 'dept',\n      editRow: true,\n    },\n  ];\n\n  const data: any[] = [\n    {\n      name: 'John Brown',\n      no: '00001',\n      dept: 'New York No. 1 Lake Park',\n    },\n    {\n      name: 'John Brown2',\n      no: '00002',\n      dept: 'New York No. 2 Lake Park',\n    },\n    {\n      name: 'John Brown3',\n      no: '00003',\n      dept: 'New York No. 3Lake Park',\n    },\n  ];\n  export default defineComponent({\n    components: { BasicTable, TableAction },\n    setup() {\n      const [registerTable, { getDataSource }] = useTable({\n        columns: columns,\n        showIndexColumn: false,\n        dataSource: data,\n        actionColumn: {\n          width: 160,\n          title: '操作',\n          dataIndex: 'action',\n          slots: { customRender: 'action' },\n        },\n        pagination: false,\n      });\n\n      function handleEdit(record: EditRecordRow) {\n        record.onEdit?.(true);\n      }\n\n      function handleCancel(record: EditRecordRow) {\n        record.onEdit?.(false);\n        if (record.isNew) {\n          const data = getDataSource();\n          const index = data.findIndex((item) => item.key === record.key);\n          data.splice(index, 1);\n        }\n      }\n\n      function handleSave(record: EditRecordRow) {\n        record.onEdit?.(false, true);\n      }\n\n      function handleEditChange(data: Recordable) {\n        console.log(data);\n      }\n\n      function handleAdd() {\n        const data = getDataSource();\n        const addRow: EditRecordRow = {\n          name: '',\n          no: '',\n          dept: '',\n          editable: true,\n          isNew: true,\n          key: `${Date.now()}`,\n        };\n        data.push(addRow);\n      }\n\n      function createActions(record: EditRecordRow, column: BasicColumn): ActionItem[] {\n        if (!record.editable) {\n          return [\n            {\n              label: '编辑',\n              onClick: handleEdit.bind(null, record),\n            },\n            {\n              label: '删除',\n            },\n          ];\n        }\n        return [\n          {\n            label: '保存',\n            onClick: handleSave.bind(null, record, column),\n          },\n          {\n            label: '取消',\n            popConfirm: {\n              title: '是否取消编辑',\n              confirm: handleCancel.bind(null, record, column),\n            },\n          },\n        ];\n      }\n\n      return {\n        registerTable,\n        handleEdit,\n        createActions,\n        handleAdd,\n        getDataSource,\n        handleEditChange,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/form/high/data.ts",
    "content": "import { FormSchema } from '/@/components/Form';\n\nconst basicOptions: LabelValueOptions = [\n  {\n    label: '付晓晓',\n    value: '1',\n  },\n  {\n    label: '周毛毛',\n    value: '2',\n  },\n];\n\nconst storeTypeOptions: LabelValueOptions = [\n  {\n    label: '私密',\n    value: '1',\n  },\n  {\n    label: '公开',\n    value: '2',\n  },\n];\n\nexport const schemas: FormSchema[] = [\n  {\n    field: 'f1',\n    component: 'Input',\n    label: '仓库名',\n    required: true,\n  },\n  {\n    field: 'f2',\n    component: 'Input',\n    label: '仓库域名',\n    required: true,\n    componentProps: {\n      addonBefore: 'http://',\n      addonAfter: 'com',\n    },\n    colProps: {\n      offset: 2,\n    },\n  },\n  {\n    field: 'f3',\n    component: 'Select',\n    label: '仓库管理员',\n    componentProps: {\n      options: basicOptions,\n    },\n    required: true,\n    colProps: {\n      offset: 2,\n    },\n  },\n  {\n    field: 'f4',\n    component: 'Select',\n    label: '审批人',\n    componentProps: {\n      options: basicOptions,\n    },\n    required: true,\n  },\n  {\n    field: 'f5',\n    component: 'RangePicker',\n    label: '生效日期',\n    required: true,\n    colProps: {\n      offset: 2,\n    },\n  },\n  {\n    field: 'f6',\n    component: 'Select',\n    label: '仓库类型',\n    componentProps: {\n      options: storeTypeOptions,\n    },\n    required: true,\n    colProps: {\n      offset: 2,\n    },\n  },\n];\nexport const taskSchemas: FormSchema[] = [\n  {\n    field: 't1',\n    component: 'Input',\n    label: '任务名',\n    required: true,\n  },\n  {\n    field: 't2',\n    component: 'Input',\n    label: '任务描述',\n    required: true,\n    colProps: {\n      offset: 2,\n    },\n  },\n  {\n    field: 't3',\n    component: 'Select',\n    label: '执行人',\n    componentProps: {\n      options: basicOptions,\n    },\n    required: true,\n    colProps: {\n      offset: 2,\n    },\n  },\n  {\n    field: 't4',\n    component: 'Select',\n    label: '责任人',\n    componentProps: {\n      options: basicOptions,\n    },\n    required: true,\n  },\n  {\n    field: 't5',\n    component: 'TimePicker',\n    label: '生效日期',\n    required: true,\n    componentProps: {\n      style: { width: '100%' },\n    },\n    colProps: {\n      offset: 2,\n    },\n  },\n  {\n    field: 't6',\n    component: 'Select',\n    label: '任务类型',\n    componentProps: {\n      options: storeTypeOptions,\n    },\n    required: true,\n    colProps: {\n      offset: 2,\n    },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/form/high/index.vue",
    "content": "<template>\n  <PageWrapper class=\"high-form\" title=\"高级表单\" content=\" 高级表单常见于一次性输入和提交大批量数据的场景。\">\n    <a-card title=\"仓库管理\" :bordered=\"false\">\n      <BasicForm @register=\"register\" />\n    </a-card>\n    <a-card title=\"任务管理\" :bordered=\"false\" class=\"!mt-5\">\n      <BasicForm @register=\"registerTask\" />\n    </a-card>\n    <a-card title=\"成员管理\" :bordered=\"false\">\n      <PersonTable ref=\"tableRef\" />\n    </a-card>\n\n    <template #rightFooter>\n      <a-button type=\"primary\" @click=\"submitAll\"> 提交 </a-button>\n    </template>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { BasicForm, useForm } from '/@/components/Form';\n  import { defineComponent, ref } from 'vue';\n  import PersonTable from './PersonTable.vue';\n  import { PageWrapper } from '/@/components/Page';\n  import { schemas, taskSchemas } from './data';\n  import { Card } from 'ant-design-vue';\n\n  export default defineComponent({\n    name: 'FormHightPage',\n    components: { BasicForm, PersonTable, PageWrapper, [Card.name]: Card },\n    setup() {\n      const tableRef = ref<{ getDataSource: () => any } | null>(null);\n\n      const [register, { validate }] = useForm({\n        baseColProps: {\n          span: 6,\n        },\n        labelWidth: 200,\n        layout: 'vertical',\n        schemas: schemas,\n        showActionButtonGroup: false,\n      });\n\n      const [registerTask, { validate: validateTaskForm }] = useForm({\n        baseColProps: {\n          span: 6,\n        },\n        labelWidth: 200,\n        layout: 'vertical',\n        schemas: taskSchemas,\n        showActionButtonGroup: false,\n      });\n\n      async function submitAll() {\n        try {\n          if (tableRef.value) {\n            console.log('table data:', tableRef.value.getDataSource());\n          }\n\n          const [values, taskValues] = await Promise.all([validate(), validateTaskForm()]);\n          console.log('form data:', values, taskValues);\n        } catch (error) {}\n      }\n\n      return { register, registerTask, submitAll, tableRef };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .high-form {\n    padding-bottom: 48px;\n  }\n\n  /** update-begin-author:taoyan date:2022-5-16 for:/issues/63 下拉框z-index问题 */\n  :deep(.ant-select-dropdown) {\n    z-index: 98 !important;\n  }\n  /** update-end-author:taoyan date:2022-5-16 for:/issues/63 下拉框z-index问题 */\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/form/step/Step1.vue",
    "content": "<template>\n  <div class=\"step1\">\n    <div class=\"step1-form\">\n      <BasicForm @register=\"register\">\n        <template #fac=\"{ model, field }\">\n          <a-input-group compact>\n            <a-select v-model:value=\"model['pay']\" class=\"pay-select\">\n              <a-select-option value=\"zfb\"> 支付宝 </a-select-option>\n              <a-select-option value=\"yl\"> 银联 </a-select-option>\n            </a-select>\n            <a-input class=\"pay-input\" v-model:value=\"model[field]\" />\n          </a-input-group>\n        </template>\n      </BasicForm>\n    </div>\n    <a-divider />\n    <h3>说明</h3>\n    <h4>转账到支付宝账户</h4>\n    <p>\n      如果需要，这里可以放一些关于产品的常见问题说明。如果需要，这里可以放一些关于产品的常见问题说明。如果需要，这里可以放一些关于产品的常见问题说明。\n    </p>\n\n    <h4>转账到银行卡</h4>\n    <p>\n      如果需要，这里可以放一些关于产品的常见问题说明。如果需要，这里可以放一些关于产品的常见问题说明。如果需要，这里可以放一些关于产品的常见问题说明。\n    </p>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicForm, useForm } from '/@/components/Form';\n  import { step1Schemas } from './data';\n\n  import { Select, Input, Divider } from 'ant-design-vue';\n  export default defineComponent({\n    components: {\n      BasicForm,\n      [Select.name]: Select,\n      ASelectOption: Select.Option,\n      [Input.name]: Input,\n      [Input.Group.name]: Input.Group,\n      [Divider.name]: Divider,\n    },\n    emits: ['next'],\n    setup(_, { emit }) {\n      const [register, { validate }] = useForm({\n        labelWidth: 200,\n        schemas: step1Schemas,\n        actionColOptions: {\n          span: 14,\n        },\n        showResetButton: false,\n        submitButtonOptions: {\n          text: '下一步',\n        },\n        submitFunc: customSubmitFunc,\n      });\n\n      async function customSubmitFunc() {\n        try {\n          const values = await validate();\n          emit('next', values);\n        } catch (error) {}\n      }\n\n      return { register };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .step1 {\n    &-form {\n      width: 550px;\n      margin: 0 auto;\n    }\n\n    h3 {\n      margin: 0 0 12px;\n      font-size: 16px;\n      line-height: 32px;\n      color: @text-color;\n    }\n\n    h4 {\n      margin: 0 0 4px;\n      font-size: 14px;\n      line-height: 22px;\n      color: @text-color;\n    }\n\n    p {\n      color: @text-color;\n    }\n  }\n\n  .pay-select {\n    width: 20%;\n  }\n\n  .pay-input {\n    width: 70%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/form/step/Step2.vue",
    "content": "<template>\n  <div class=\"step2\">\n    <a-alert message=\"确认转账后，资金将直接打入对方账户，无法退回。\" show-icon />\n    <a-descriptions :column=\"1\" class=\"mt-5\">\n      <a-descriptions-item label=\"付款账户\"> ant-design@alipay.com </a-descriptions-item>\n      <a-descriptions-item label=\"收款账户\"> test@example.com </a-descriptions-item>\n      <a-descriptions-item label=\"收款人姓名\"> Jeecg </a-descriptions-item>\n      <a-descriptions-item label=\"转账金额\"> 500元 </a-descriptions-item>\n    </a-descriptions>\n    <a-divider />\n    <BasicForm @register=\"register\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicForm, useForm } from '/@/components/Form';\n  import { step2Schemas } from './data';\n  import { Alert, Divider, Descriptions } from 'ant-design-vue';\n\n  export default defineComponent({\n    components: {\n      BasicForm,\n      [Alert.name]: Alert,\n      [Divider.name]: Divider,\n      [Descriptions.name]: Descriptions,\n      [Descriptions.Item.name]: Descriptions.Item,\n    },\n    emits: ['next', 'prev'],\n    setup(_, { emit }) {\n      const [register, { validate, setProps }] = useForm({\n        labelWidth: 120,\n        schemas: step2Schemas,\n        actionColOptions: {\n          span: 14,\n        },\n        resetButtonOptions: {\n          text: '上一步',\n        },\n        submitButtonOptions: {\n          text: '提交',\n        },\n        resetFunc: customResetFunc,\n        submitFunc: customSubmitFunc,\n      });\n\n      async function customResetFunc() {\n        emit('prev');\n      }\n\n      async function customSubmitFunc() {\n        try {\n          const values = await validate();\n          setProps({\n            submitButtonOptions: {\n              loading: true,\n            },\n          });\n          setTimeout(() => {\n            setProps({\n              submitButtonOptions: {\n                loading: false,\n              },\n            });\n            emit('next', values);\n          }, 1500);\n        } catch (error) {}\n      }\n\n      return { register };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .step2 {\n    width: 550px;\n    margin: 0 auto;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/form/step/Step3.vue",
    "content": "<template>\n  <div class=\"step3\">\n    <a-result status=\"success\" title=\"操作成功\" sub-title=\"预计两小时内到账\">\n      <template #extra>\n        <a-button type=\"primary\" @click=\"redo\"> 再转一笔 </a-button>\n        <a-button> 查看账单 </a-button>\n      </template>\n    </a-result>\n    <div class=\"desc-wrap\">\n      <a-descriptions :column=\"1\" class=\"mt-5\">\n        <a-descriptions-item label=\"付款账户\"> ant-design@alipay.com </a-descriptions-item>\n        <a-descriptions-item label=\"收款账户\"> test@example.com </a-descriptions-item>\n        <a-descriptions-item label=\"收款人姓名\"> Jeecg </a-descriptions-item>\n        <a-descriptions-item label=\"转账金额\"> 500元 </a-descriptions-item>\n      </a-descriptions>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { Result, Descriptions } from 'ant-design-vue';\n  export default defineComponent({\n    components: {\n      [Result.name]: Result,\n      [Descriptions.name]: Descriptions,\n      [Descriptions.Item.name]: Descriptions.Item,\n    },\n    emits: ['redo'],\n    setup(_, { emit }) {\n      return {\n        redo: () => {\n          emit('redo');\n        },\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .step3 {\n    width: 600px;\n    margin: 0 auto;\n  }\n\n  .desc-wrap {\n    padding: 24px 40px;\n    margin-top: 24px;\n    background-color: @background-color-light;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/form/step/data.tsx",
    "content": "import { FormSchema } from '/@/components/Form';\n\nexport const step1Schemas: FormSchema[] = [\n  {\n    field: 'account',\n    component: 'Select',\n    label: '付款账户',\n    required: true,\n    defaultValue: '1',\n    componentProps: {\n      options: [\n        {\n          label: 'anncwb@126.com',\n          value: '1',\n        },\n      ],\n    },\n  },\n  {\n    field: 'fac',\n    component: 'InputGroup',\n    label: '收款账户',\n    required: true,\n    defaultValue: 'test@example.com',\n    slot: 'fac',\n  },\n  {\n    field: 'pay',\n    component: 'Input',\n    label: '',\n    defaultValue: 'zfb',\n    show: false,\n  },\n  {\n    field: 'payeeName',\n    component: 'Input',\n    label: '收款人姓名',\n    defaultValue: 'Jeecg',\n    required: true,\n  },\n  {\n    field: 'money',\n    component: 'Input',\n    label: '转账金额',\n    defaultValue: '500',\n    required: true,\n    renderComponentContent: () => {\n      return {\n        prefix: () => '￥',\n      };\n    },\n  },\n];\n\nexport const step2Schemas: FormSchema[] = [\n  {\n    field: 'pwd',\n    component: 'InputPassword',\n    label: '支付密码',\n    required: true,\n    defaultValue: '123456',\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/form/step/index.vue",
    "content": "<template>\n  <PageWrapper title=\"分步表单\" contentBackground content=\" 将一个冗长或用户不熟悉的表单任务分成多个步骤，指导用户完成。\" contentClass=\"p-4\">\n    <div class=\"step-form-form\">\n      <a-steps :current=\"current\">\n        <a-step title=\"填写转账信息\" />\n        <a-step title=\"确认转账信息\" />\n        <a-step title=\"完成\" />\n      </a-steps>\n    </div>\n    <div class=\"mt-5\">\n      <Step1 @next=\"handleStep1Next\" v-show=\"current === 0\" />\n      <Step2 @prev=\"handleStepPrev\" @next=\"handleStep2Next\" v-show=\"current === 1\" v-if=\"initSetp2\" />\n      <Step3 v-show=\"current === 2\" @redo=\"handleRedo\" v-if=\"initSetp3\" />\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, reactive, toRefs } from 'vue';\n  import Step1 from './Step1.vue';\n  import Step2 from './Step2.vue';\n  import Step3 from './Step3.vue';\n  import { PageWrapper } from '/@/components/Page';\n  import { Steps } from 'ant-design-vue';\n\n  export default defineComponent({\n    name: 'FormStepPage',\n    components: {\n      Step1,\n      Step2,\n      Step3,\n      PageWrapper,\n      [Steps.name]: Steps,\n      [Steps.Step.name]: Steps.Step,\n    },\n    setup() {\n      const current = ref(0);\n\n      const state = reactive({\n        initSetp2: false,\n        initSetp3: false,\n      });\n\n      function handleStep1Next(step1Values: any) {\n        current.value++;\n        state.initSetp2 = true;\n        console.log(step1Values);\n      }\n\n      function handleStepPrev() {\n        current.value--;\n      }\n\n      function handleStep2Next(step2Values: any) {\n        current.value++;\n        state.initSetp3 = true;\n        console.log(step2Values);\n      }\n\n      function handleRedo() {\n        current.value = 0;\n        state.initSetp2 = false;\n        state.initSetp3 = false;\n      }\n\n      return {\n        current,\n        handleStep1Next,\n        handleStep2Next,\n        handleRedo,\n        handleStepPrev,\n        ...toRefs(state),\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .step-form-content {\n    padding: 24px;\n    background-color: @component-background;\n  }\n\n  .step-form-form {\n    width: 750px;\n    margin: 0 auto;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/list/basic/data.tsx",
    "content": "export const cardList = (() => {\n  const result: any[] = [];\n  for (let i = 0; i < 6; i++) {\n    result.push({\n      id: i,\n      title: 'Jeecg Admin',\n      description: '基于Vue Next, TypeScript, Ant Design Vue实现的一套完整的企业级后台管理系统',\n      datetime: '2020-11-26 17:39',\n      extra: '编辑',\n      icon: 'logos:vue',\n      color: '#1890ff',\n      author: 'Jeecg',\n      percent: 20 * (i + 1),\n    });\n  }\n  return result;\n})();\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/list/basic/index.vue",
    "content": "<template>\n  <PageWrapper :class=\"prefixCls\" title=\"标准列表\">\n    <div :class=\"`${prefixCls}__top`\">\n      <a-row :gutter=\"12\">\n        <a-col :span=\"8\" :class=\"`${prefixCls}__top-col`\">\n          <div>我的待办</div>\n          <p>8个任务</p>\n        </a-col>\n        <a-col :span=\"8\" :class=\"`${prefixCls}__top-col`\">\n          <div>本周任务平均处理时间</div>\n          <p>32分钟</p>\n        </a-col>\n        <a-col :span=\"8\" :class=\"`${prefixCls}__top-col`\">\n          <div>本周完成任务数</div>\n          <p>24个任务</p>\n        </a-col>\n      </a-row>\n    </div>\n\n    <div :class=\"`${prefixCls}__content`\">\n      <a-list :pagination=\"pagination\">\n        <template v-for=\"item in list\" :key=\"item.id\">\n          <a-list-item class=\"list\">\n            <a-list-item-meta>\n              <template #avatar>\n                <Icon class=\"icon\" v-if=\"item.icon\" :icon=\"item.icon\" :color=\"item.color\" />\n              </template>\n              <template #title>\n                <span>{{ item.title }}</span>\n                <div class=\"extra\" v-if=\"item.extra\">\n                  {{ item.extra }}\n                </div>\n              </template>\n              <template #description>\n                <div class=\"description\">\n                  {{ item.description }}\n                </div>\n                <div class=\"info\">\n                  <div><span>Owner</span>{{ item.author }}</div>\n                  <div><span>开始时间</span>{{ item.datetime }}</div>\n                </div>\n                <div class=\"progress\">\n                  <Progress :percent=\"item.percent\" status=\"active\" />\n                </div>\n              </template>\n            </a-list-item-meta>\n          </a-list-item>\n        </template>\n      </a-list>\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { Progress, Row, Col } from 'ant-design-vue';\n  import { defineComponent } from 'vue';\n  import Icon from '/@/components/Icon/index';\n  import { cardList } from './data';\n  import { PageWrapper } from '/@/components/Page';\n  import { List } from 'ant-design-vue';\n\n  export default defineComponent({\n    components: {\n      Icon,\n      Progress,\n      PageWrapper,\n      [List.name]: List,\n      [List.Item.name]: List.Item,\n      AListItemMeta: List.Item.Meta,\n      [Row.name]: Row,\n      [Col.name]: Col,\n    },\n    setup() {\n      return {\n        prefixCls: 'list-basic',\n        list: cardList,\n        pagination: {\n          show: true,\n          pageSize: 3,\n        },\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .list-basic {\n    &__top {\n      padding: 24px;\n      text-align: center;\n      background-color: @component-background;\n\n      &-col {\n        &:not(:last-child) {\n          border-right: 1px dashed @border-color-base;\n        }\n\n        div {\n          margin-bottom: 12px;\n          font-size: 14px;\n          line-height: 22px;\n          color: @text-color;\n        }\n\n        p {\n          margin: 0;\n          font-size: 24px;\n          line-height: 32px;\n          color: @text-color;\n        }\n      }\n    }\n\n    &__content {\n      padding: 24px;\n      margin-top: 12px;\n      background-color: @component-background;\n\n      .list {\n        position: relative;\n      }\n\n      .icon {\n        font-size: 40px !important;\n      }\n\n      .extra {\n        position: absolute;\n        top: 20px;\n        right: 15px;\n        font-weight: normal;\n        color: @primary-color;\n        cursor: pointer;\n      }\n\n      .description {\n        display: inline-block;\n        width: 40%;\n      }\n\n      .info {\n        display: inline-block;\n        width: 30%;\n        text-align: center;\n\n        div {\n          display: inline-block;\n          padding: 0 20px;\n\n          span {\n            display: block;\n          }\n        }\n      }\n\n      .progress {\n        display: inline-block;\n        width: 15%;\n        vertical-align: top;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/list/card/data.tsx",
    "content": "export const cardList = (() => {\n  const result: any[] = [];\n  for (let i = 0; i < 12; i++) {\n    result.push({\n      title: 'Jeecg Admin',\n      icon: 'logos:vue',\n      color: '#1890ff',\n      active: '100',\n      new: '1,799',\n      download: 'bx:bx-download',\n    });\n  }\n  return result;\n})();\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/list/card/index.vue",
    "content": "<template>\n  <PageWrapper :class=\"prefixCls\" title=\"卡片列表\">\n    <template #headerContent>\n      基于Vue Next, TypeScript, Ant Design Vue实现的一套完整的企业级后台管理系统。\n      <div :class=\"`${prefixCls}__link`\">\n        <a><Icon icon=\"bx:bx-paper-plane\" color=\"#1890ff\" /><span>开始</span></a>\n        <a><Icon icon=\"carbon:warning\" color=\"#1890ff\" /><span>简介</span></a>\n        <a><Icon icon=\"ion:document-text-outline\" color=\"#1890ff\" /><span>文档</span></a>\n      </div>\n    </template>\n\n    <div :class=\"`${prefixCls}__content`\">\n      <a-list>\n        <a-row :gutter=\"16\">\n          <template v-for=\"item in list\" :key=\"item.title\">\n            <a-col :span=\"6\">\n              <a-list-item>\n                <a-card :hoverable=\"true\" :class=\"`${prefixCls}__card`\">\n                  <div :class=\"`${prefixCls}__card-title`\">\n                    <Icon class=\"icon\" v-if=\"item.icon\" :icon=\"item.icon\" :color=\"item.color\" />\n                    {{ item.title }}\n                  </div>\n                  <div :class=\"`${prefixCls}__card-detail`\"> 基于Vue Next, TypeScript, Ant Design Vue实现的一套完整的企业级后台管理系统 </div>\n                </a-card>\n              </a-list-item>\n            </a-col>\n          </template>\n        </a-row>\n      </a-list>\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import Icon from '/@/components/Icon/index';\n  import { cardList } from './data';\n  import { PageWrapper } from '/@/components/Page';\n  import { Card, Row, Col, List } from 'ant-design-vue';\n\n  export default defineComponent({\n    components: {\n      Icon,\n      PageWrapper,\n      [Card.name]: Card,\n      [List.name]: List,\n      [List.Item.name]: List.Item,\n      [Row.name]: Row,\n      [Col.name]: Col,\n    },\n    setup() {\n      return {\n        prefixCls: 'list-card',\n        list: cardList,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .list-card {\n    &__link {\n      margin-top: 10px;\n      font-size: 14px;\n\n      a {\n        margin-right: 30px;\n      }\n\n      span {\n        margin-left: 5px;\n      }\n    }\n\n    &__card {\n      width: 100%;\n      margin-bottom: -8px;\n\n      .ant-card-body {\n        padding: 16px;\n      }\n\n      &-title {\n        margin-bottom: 5px;\n        font-size: 16px;\n        font-weight: 500;\n        color: @text-color;\n\n        .icon {\n          margin-top: -5px;\n          margin-right: 10px;\n          font-size: 38px !important;\n        }\n      }\n\n      &-detail {\n        padding-top: 10px;\n        padding-left: 30px;\n        font-size: 14px;\n        color: @text-color-secondary;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/list/search/data.tsx",
    "content": "import { FormSchema } from '/@/components/Form/index';\n\nexport const searchList = (() => {\n  const result: any[] = [];\n  for (let i = 0; i < 6; i++) {\n    result.push({\n      id: i,\n      title: 'Jeecg Admin',\n      description: ['Jeecg', '设计语言', 'Typescript'],\n      content: '基于Vue Next, TypeScript, Ant Design实现的一套完整的企业级后台管理系统。',\n      time: '2020-11-14 11:20',\n    });\n  }\n  return result;\n})();\n\nexport const actions: any[] = [\n  { icon: 'clarity:star-line', text: '156', color: '#018ffb' },\n  { icon: 'bx:bxs-like', text: '156', color: '#459ae8' },\n  { icon: 'bx:bxs-message-dots', text: '2', color: '#42d27d' },\n];\n\nexport const schemas: FormSchema[] = [\n  {\n    field: 'field1',\n    component: 'InputSearch',\n    label: '项目名',\n    colProps: {\n      span: 8,\n    },\n    componentProps: {\n      onChange: (e: any) => {\n        console.log(e);\n      },\n    },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/list/search/index.vue",
    "content": "<template>\n  <PageWrapper :class=\"prefixCls\" title=\"搜索列表\">\n    <template #headerContent>\n      <BasicForm :class=\"`${prefixCls}__header-form`\" :labelWidth=\"100\" :schemas=\"schemas\" :showActionButtonGroup=\"false\" />\n    </template>\n\n    <div :class=\"`${prefixCls}__container`\">\n      <a-list>\n        <template v-for=\"item in list\" :key=\"item.id\">\n          <a-list-item>\n            <a-list-item-meta>\n              <template #description>\n                <div :class=\"`${prefixCls}__content`\">\n                  {{ item.content }}\n                </div>\n                <div :class=\"`${prefixCls}__action`\">\n                  <template v-for=\"action in actions\" :key=\"action.icon\">\n                    <div :class=\"`${prefixCls}__action-item`\">\n                      <Icon v-if=\"action.icon\" :class=\"`${prefixCls}__action-icon`\" :icon=\"action.icon\" :color=\"action.color\" />\n                      {{ action.text }}\n                    </div>\n                  </template>\n                  <span :class=\"`${prefixCls}__time`\">{{ item.time }}</span>\n                </div>\n              </template>\n              <template #title>\n                <p :class=\"`${prefixCls}__title`\">\n                  {{ item.title }}\n                </p>\n                <div>\n                  <template v-for=\"tag in item.description\" :key=\"tag\">\n                    <Tag class=\"mb-2\">\n                      {{ tag }}\n                    </Tag>\n                  </template>\n                </div>\n              </template>\n            </a-list-item-meta>\n          </a-list-item>\n        </template>\n      </a-list>\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { Tag } from 'ant-design-vue';\n  import { defineComponent } from 'vue';\n  import Icon from '/@/components/Icon/index';\n  import { BasicForm } from '/@/components/Form/index';\n  import { actions, searchList, schemas } from './data';\n  import { PageWrapper } from '/@/components/Page';\n  import { List } from 'ant-design-vue';\n\n  export default defineComponent({\n    components: {\n      Icon,\n      Tag,\n      BasicForm,\n      PageWrapper,\n      [List.name]: List,\n      [List.Item.name]: List.Item,\n      AListItemMeta: List.Item.Meta,\n    },\n    setup() {\n      return {\n        prefixCls: 'list-search',\n        list: searchList,\n        actions,\n        schemas,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .list-search {\n    &__header {\n      &-form {\n        margin-bottom: -16px;\n      }\n    }\n\n    &__container {\n      padding: 12px;\n      background-color: @component-background;\n    }\n\n    &__title {\n      margin-bottom: 12px;\n      font-size: 18px;\n    }\n\n    &__content {\n      color: @text-color-secondary;\n    }\n\n    &__action {\n      margin-top: 10px;\n\n      &-item {\n        display: inline-block;\n        padding: 0 16px;\n        color: @text-color-secondary;\n\n        &:nth-child(1) {\n          padding-left: 0;\n        }\n\n        &:nth-child(1),\n        &:nth-child(2) {\n          border-right: 1px solid @border-color-base;\n        }\n      }\n\n      &-icon {\n        margin-right: 3px;\n      }\n    }\n\n    &__time {\n      position: absolute;\n      right: 20px;\n      color: rgba(0, 0, 0, 0.45);\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/result/fail/index.vue",
    "content": "<template>\n  <div class=\"m-5 result-error\">\n    <Result status=\"error\" title=\"提交失败\" sub-title=\"请核对并修改以下信息后，再重新提交。\">\n      <template #extra>\n        <a-button key=\"console\" type=\"primary\"> 返回修改 </a-button>\n      </template>\n    </Result>\n    <div class=\"result-error__content\">\n      <div class=\"result-error__content-title\"> 您提交的内容有如下错误： </div>\n      <div class=\"mb-4\">\n        <CloseCircleOutlined class=\"mr-2 result-error__content-icon\" />\n        您的账户已被冻结\n        <a class=\"ml-4\">立即解冻 ></a>\n      </div>\n      <div class=\"mb-4\">\n        <CloseCircleOutlined class=\"mr-2 result-error__content-icon\" />\n        您的账户还不具备申请资格\n        <a class=\"ml-4\">立即解冻 ></a>\n      </div>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { Result } from 'ant-design-vue';\n  import { CloseCircleOutlined } from '@ant-design/icons-vue';\n  export default defineComponent({\n    components: {\n      Result,\n      CloseCircleOutlined,\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .result-error {\n    padding: 48px 32px;\n    background-color: @component-background;\n\n    &__content {\n      padding: 24px 40px;\n      background-color: @background-color-light;\n\n      &-title {\n        margin-bottom: 16px;\n        font-size: 16px;\n        font-weight: 500;\n      }\n\n      &-icon {\n        color: #ff4d4f;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/page/result/success/index.vue",
    "content": "<template>\n  <div class=\"m-5 result-success\">\n    <Result\n      status=\"success\"\n      title=\"提交成功\"\n      sub-title=\"提交结果页用于反馈一系列操作任务的处理结果， 如果仅是简单操作，使用 Message 全局提示反馈即可。 本文字区域可以展示简单的补充说明，如果有类似展示 “单据”的需求，下面这个灰色区域可以呈现比较复杂的内容。\"\n    >\n      <template #extra>\n        <a-button key=\"console\" type=\"primary\"> 返回列表 </a-button>\n        <a-button key=\"buy\"> 查看项目 </a-button>\n        <a-button key=\"buy\"> 打印 </a-button>\n      </template>\n    </Result>\n    <div class=\"result-success__content\">\n      <Descriptions title=\"项目名称\">\n        <DescriptionItem label=\"项目 ID\"> 111222 </DescriptionItem>\n        <DescriptionItem label=\"负责人\"> Jeecg </DescriptionItem>\n        <DescriptionItem label=\"生效时间\"> 2016-12-12 ~ 2017-12-12 </DescriptionItem>\n      </Descriptions>\n      <Steps :current=\"1\" progress-dot size=\"small\">\n        <Step title=\"创建项目\">\n          <template #description> <div>Jeecg</div> <p>2016-12-12 12:32</p> </template>\n        </Step>\n        <Step title=\"部门初审\">\n          <template #description>\n            <p>Chad</p>\n          </template>\n        </Step>\n        <Step title=\"财务复核\" />\n        <Step title=\"完成\" />\n      </Steps>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { Result, Steps, Descriptions } from 'ant-design-vue';\n  export default defineComponent({\n    components: {\n      Result,\n      Steps,\n      Step: Steps.Step,\n      Descriptions,\n      DescriptionItem: Descriptions.Item,\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .result-success {\n    padding: 48px 32px;\n    background-color: @component-background;\n\n    &__content {\n      padding: 24px 40px;\n      background-color: @background-color-light;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/permission/CurrentPermissionMode.vue",
    "content": "<template>\n  <div class=\"mt-2\">\n    当前权限模式：\n    <a-button type=\"link\">\n      {{ permissionMode === PermissionModeEnum.BACK ? '后台权限模式' : '前端角色权限模式' }}\n    </a-button>\n    <a-button class=\"ml-4\" @click=\"togglePermissionMode\" type=\"primary\"> 切换权限模式 </a-button>\n    <Divider />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, computed } from 'vue';\n  import { useAppStore } from '/@/store/modules/app';\n  import { PermissionModeEnum } from '/@/enums/appEnum';\n  import { Divider } from 'ant-design-vue';\n  import { usePermission } from '/@/hooks/web/usePermission';\n  export default defineComponent({\n    name: 'CurrentPermissionMode',\n    components: { Divider },\n    setup() {\n      const appStore = useAppStore();\n      const permissionMode = computed(() => appStore.getProjectConfig.permissionMode);\n      const { togglePermissionMode } = usePermission();\n\n      return {\n        permissionMode,\n        PermissionModeEnum,\n        togglePermissionMode,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/permission/back/Btn.vue",
    "content": "<template>\n  <PageWrapper contentBackground title=\"按钮权限控制\" contentClass=\"p-4\">\n    <CurrentPermissionMode />\n    <p>\n      当前拥有的code列表: <a> {{ permissionStore.getPermCodeList }} </a>\n    </p>\n    <Divider />\n    <Alert class=\"mt-4\" type=\"info\" message=\"点击后请查看按钮变化(必须处于后台权限模式才可测试此页面所展示的功能)\" show-icon />\n    <Divider />\n    <a-button type=\"primary\" class=\"mr-2\" @click=\"switchToken(2)\" :disabled=\"!isBackPremissionMode\"> 点击切换按钮权限(用户id为2) </a-button>\n    <a-button type=\"primary\" @click=\"switchToken(1)\" :disabled=\"!isBackPremissionMode\"> 点击切换按钮权限(用户id为1,默认) </a-button>\n\n    <template v-if=\"isBackPremissionMode\">\n      <Divider>组件方式判断权限</Divider>\n      <Authority :value=\"'1000'\">\n        <a-button type=\"primary\" class=\"mx-4\"> 拥有code ['1000']权限可见 </a-button>\n      </Authority>\n\n      <Authority :value=\"'2000'\">\n        <a-button color=\"success\" class=\"mx-4\"> 拥有code ['2000']权限可见 </a-button>\n      </Authority>\n\n      <Authority :value=\"['1000', '2000']\">\n        <a-button color=\"error\" class=\"mx-4\"> 拥有code ['1000','2000']角色权限可见 </a-button>\n      </Authority>\n\n      <Divider>函数方式方式判断权限</Divider>\n      <a-button v-if=\"hasPermission('1000')\" type=\"primary\" class=\"mx-4\"> 拥有code ['1000']权限可见 </a-button>\n\n      <a-button v-if=\"hasPermission('2000')\" color=\"success\" class=\"mx-4\"> 拥有code ['2000']权限可见 </a-button>\n\n      <a-button v-if=\"hasPermission(['1000', '2000'])\" color=\"error\" class=\"mx-4\"> 拥有code ['1000','2000']角色权限可见 </a-button>\n\n      <Divider>指令方式方式判断权限(该方式不能动态修改权限.)</Divider>\n      <a-button v-auth=\"'1000'\" type=\"primary\" class=\"mx-4\"> 拥有code ['1000']权限可见 </a-button>\n\n      <a-button v-auth=\"'2000'\" color=\"success\" class=\"mx-4\"> 拥有code ['2000']权限可见 </a-button>\n\n      <a-button v-auth=\"['1000', '2000']\" color=\"error\" class=\"mx-4\"> 拥有code ['1000','2000']角色权限可见 </a-button>\n    </template>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, computed } from 'vue';\n  import { Alert, Divider } from 'ant-design-vue';\n  import CurrentPermissionMode from '../CurrentPermissionMode.vue';\n  import { usePermission } from '/@/hooks/web/usePermission';\n  import { Authority } from '/@/components/Authority';\n  import { usePermissionStore } from '/@/store/modules/permission';\n  import { PermissionModeEnum } from '/@/enums/appEnum';\n  import { PageWrapper } from '/@/components/Page';\n  import { useAppStore } from '/@/store/modules/app';\n  import { useUserStore } from '/@/store/modules/user';\n\n  export default defineComponent({\n    components: { Alert, PageWrapper, CurrentPermissionMode, Divider, Authority },\n    setup() {\n      const { hasPermission } = usePermission();\n      const permissionStore = usePermissionStore();\n      const appStore = useAppStore();\n      const userStore = useUserStore();\n\n      const isBackPremissionMode = computed(() => appStore.getProjectConfig.permissionMode === PermissionModeEnum.BACK);\n\n      async function switchToken(userId: number) {\n        // 本函数切换用户登录Token的部分仅用于演示，实际生产时切换身份应当重新登录\n        const token = 'fakeToken' + userId;\n        userStore.setToken(token);\n\n        // 重新获取用户信息和菜单\n        userStore.getUserInfoAction();\n        permissionStore.changePermissionCode();\n      }\n\n      return {\n        hasPermission,\n        permissionStore,\n        switchToken,\n        isBackPremissionMode,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .demo {\n    background-color: @component-background;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/permission/back/index.vue",
    "content": "<template>\n  <PageWrapper\n    title=\"后台权限示例\"\n    contentBackground\n    contentClass=\"p-4\"\n    content=\"目前mock了两组数据， id为1 和 2 具体返回的菜单可以在mock/sys/menu.ts内查看\"\n  >\n    <CurrentPermissionMode />\n\n    <Alert class=\"mt-4\" type=\"info\" message=\"点击后请查看左侧菜单变化\" show-icon />\n\n    <div class=\"mt-4\">\n      权限切换(请先切换权限模式为后台权限模式):\n      <a-button-group>\n        <a-button @click=\"switchToken(1)\" :disabled=\"!isBackPremissionMode\"> 获取用户id为1的菜单 </a-button>\n        <a-button @click=\"switchToken(2)\" :disabled=\"!isBackPremissionMode\"> 获取用户id为2的菜单 </a-button>\n      </a-button-group>\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, computed } from 'vue';\n  import CurrentPermissionMode from '../CurrentPermissionMode.vue';\n  import { RoleEnum } from '/@/enums/roleEnum';\n  import { usePermission } from '/@/hooks/web/usePermission';\n  import { useUserStore } from '/@/store/modules/user';\n  import { PageWrapper } from '/@/components/Page';\n  import { PermissionModeEnum } from '/@/enums/appEnum';\n  import { useAppStore } from '/@/store/modules/app';\n  import { Alert } from 'ant-design-vue';\n  export default defineComponent({\n    components: { Alert, CurrentPermissionMode, PageWrapper },\n    setup() {\n      const { refreshMenu } = usePermission();\n      const userStore = useUserStore();\n      const appStore = useAppStore();\n\n      const isBackPremissionMode = computed(() => appStore.getProjectConfig.permissionMode === PermissionModeEnum.BACK);\n\n      async function switchToken(userId: number) {\n        // 本函数切换用户登录Token的部分仅用于演示，实际生产时切换身份应当重新登录\n        const token = 'fakeToken' + userId;\n        userStore.setToken(token);\n\n        // 重新获取用户信息和菜单\n        userStore.getUserInfoAction();\n        refreshMenu();\n      }\n\n      return {\n        RoleEnum,\n        refreshMenu,\n        switchToken,\n        isBackPremissionMode,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .demo {\n    background-color: @component-background;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/permission/front/AuthPageA.vue",
    "content": "<template>\n  <div class=\"m-10 auth-page\"> Super 角色可见 </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  export default defineComponent({});\n</script>\n<style lang=\"less\" scoped>\n  .auth-page {\n    display: flex;\n    height: 300px;\n    font-size: 24px;\n    color: #fff;\n    background-color: #409efe;\n    border-radius: 12px;\n    justify-content: center;\n    align-items: center;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/permission/front/AuthPageB.vue",
    "content": "<template>\n  <div class=\"m-10 auth-page\"> Test 角色可见 </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  export default defineComponent({});\n</script>\n<style lang=\"less\" scoped>\n  .auth-page {\n    display: flex;\n    height: 300px;\n    font-size: 24px;\n    color: #fff;\n    background-color: #409efe;\n    border-radius: 12px;\n    justify-content: center;\n    align-items: center;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/permission/front/Btn.vue",
    "content": "<template>\n  <PageWrapper\n    title=\"前端权限按钮示例\"\n    contentBackground\n    contentClass=\"p-4\"\n    content=\"由于刷新的时候会请求用户信息接口，会根据接口重置角色信息，所以刷新后界面会恢复原样，如果不需要，可以注释 src/layout/default/index内的获取用户信息接口\"\n  >\n    <CurrentPermissionMode />\n\n    <p>\n      当前角色: <a> {{ userStore.getRoleList }} </a>\n    </p>\n    <Alert class=\"mt-4\" type=\"info\" message=\"点击后请查看按钮变化\" show-icon />\n\n    <div class=\"mt-4\">\n      权限切换(请先切换权限模式为前端角色权限模式):\n      <a-button-group>\n        <a-button @click=\"changeRole(RoleEnum.SUPER)\" :type=\"isSuper ? 'primary' : 'default'\">\n          {{ RoleEnum.SUPER }}\n        </a-button>\n        <a-button @click=\"changeRole(RoleEnum.TEST)\" :type=\"isTest ? 'primary' : 'default'\">\n          {{ RoleEnum.TEST }}\n        </a-button>\n      </a-button-group>\n    </div>\n    <Divider>组件方式判断权限(有需要可以自行全局注册)</Divider>\n    <Authority :value=\"RoleEnum.SUPER\">\n      <a-button type=\"primary\" class=\"mx-4\"> 拥有super角色权限可见 </a-button>\n    </Authority>\n\n    <Authority :value=\"RoleEnum.TEST\">\n      <a-button color=\"success\" class=\"mx-4\"> 拥有test角色权限可见 </a-button>\n    </Authority>\n\n    <Authority :value=\"[RoleEnum.TEST, RoleEnum.SUPER]\">\n      <a-button color=\"error\" class=\"mx-4\"> 拥有[test,super]角色权限可见 </a-button>\n    </Authority>\n\n    <Divider>函数方式方式判断权限(适用于函数内部过滤)</Divider>\n    <a-button v-if=\"hasPermission(RoleEnum.SUPER)\" type=\"primary\" class=\"mx-4\"> 拥有super角色权限可见 </a-button>\n\n    <a-button v-if=\"hasPermission(RoleEnum.TEST)\" color=\"success\" class=\"mx-4\"> 拥有test角色权限可见 </a-button>\n\n    <a-button v-if=\"hasPermission([RoleEnum.TEST, RoleEnum.SUPER])\" color=\"error\" class=\"mx-4\"> 拥有[test,super]角色权限可见 </a-button>\n\n    <Divider>指令方式方式判断权限(该方式不能动态修改权限.)</Divider>\n    <a-button v-auth=\"RoleEnum.SUPER\" type=\"primary\" class=\"mx-4\"> 拥有super角色权限可见 </a-button>\n\n    <a-button v-auth=\"RoleEnum.TEST\" color=\"success\" class=\"mx-4\"> 拥有test角色权限可见 </a-button>\n\n    <a-button v-auth=\"[RoleEnum.TEST, RoleEnum.SUPER]\" color=\"error\" class=\"mx-4\"> 拥有[test,super]角色权限可见 </a-button>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { computed, defineComponent } from 'vue';\n  import { Alert, Divider } from 'ant-design-vue';\n  import CurrentPermissionMode from '../CurrentPermissionMode.vue';\n  import { useUserStore } from '/@/store/modules/user';\n  import { RoleEnum } from '/@/enums/roleEnum';\n  import { usePermission } from '/@/hooks/web/usePermission';\n  import { Authority } from '/@/components/Authority';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { Alert, PageWrapper, CurrentPermissionMode, Divider, Authority },\n    setup() {\n      const { changeRole, hasPermission } = usePermission();\n      const userStore = useUserStore();\n\n      return {\n        userStore,\n        RoleEnum,\n        isSuper: computed(() => userStore.getRoleList.includes(RoleEnum.SUPER)),\n        isTest: computed(() => userStore.getRoleList.includes(RoleEnum.TEST)),\n        changeRole,\n        hasPermission,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .demo {\n    background-color: @component-background;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/permission/front/index.vue",
    "content": "<template>\n  <PageWrapper\n    title=\"前端权限示例\"\n    contentBackground\n    contentClass=\"p-4\"\n    content=\"由于刷新的时候会请求用户信息接口，会根据接口重置角色信息，所以刷新后界面会恢复原样，如果不需要，可以注释 src/layout/default/index内的获取用户信息接口\"\n  >\n    <CurrentPermissionMode />\n\n    <p>\n      当前角色: <a> {{ userStore.getRoleList }} </a>\n    </p>\n    <Alert class=\"mt-4\" type=\"info\" message=\"点击后请查看左侧菜单变化\" show-icon />\n\n    <div class=\"mt-4\">\n      权限切换(请先切换权限模式为前端角色权限模式):\n      <a-button-group>\n        <a-button @click=\"changeRole(RoleEnum.SUPER)\" :type=\"isSuper ? 'primary' : 'default'\">\n          {{ RoleEnum.SUPER }}\n        </a-button>\n        <a-button @click=\"changeRole(RoleEnum.TEST)\" :type=\"isTest ? 'primary' : 'default'\">\n          {{ RoleEnum.TEST }}\n        </a-button>\n      </a-button-group>\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { computed, defineComponent } from 'vue';\n  import { Alert } from 'ant-design-vue';\n  import CurrentPermissionMode from '../CurrentPermissionMode.vue';\n  import { useUserStore } from '/@/store/modules/user';\n  import { RoleEnum } from '/@/enums/roleEnum';\n  import { usePermission } from '/@/hooks/web/usePermission';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { Alert, CurrentPermissionMode, PageWrapper },\n    setup() {\n      const { changeRole } = usePermission();\n      const userStore = useUserStore();\n\n      return {\n        userStore,\n        RoleEnum,\n        isSuper: computed(() => userStore.getRoleList.includes(RoleEnum.SUPER)),\n        isTest: computed(() => userStore.getRoleList.includes(RoleEnum.TEST)),\n        changeRole,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .demo {\n    background-color: @component-background;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/setup/index.vue",
    "content": "<template>\n  <PageWrapper title=\"引导页\" content=\"用于给用户的指引操作\">\n    <a-button type=\"primary\" @click=\"handleStart\">开始</a-button>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { PageWrapper } from '/@/components/Page';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import intro from 'intro.js';\n  import 'intro.js/minified/introjs.min.css';\n\n  export default defineComponent({\n    components: { PageWrapper },\n    setup() {\n      const { prefixVar } = useDesign('');\n\n      function handleStart() {\n        intro()\n          .setOptions({\n            steps: [\n              {\n                title: 'Welcome',\n                intro: 'Hello World! 👋',\n              },\n              {\n                title: 'Collapse Button',\n                element: document.querySelector(`.${prefixVar}-layout-header-trigger`)!,\n                intro: 'This is the menu collapse button.',\n              },\n              {\n                title: 'User Action',\n                element: document.querySelector(`.${prefixVar}-layout-header-action`)!,\n                intro: 'This is the user function area.',\n              },\n            ],\n          })\n          .start();\n      }\n      return { handleStart };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/system/account/AccountDetail.vue",
    "content": "<template>\n  <PageWrapper\n    :title=\"`用户` + userId + `的资料`\"\n    content=\"这是用户资料详情页面。本页面仅用于演示相同路由在tab中打开多个页面并且显示不同的数据\"\n    contentBackground\n    @back=\"goBack\"\n  >\n    <template #extra>\n      <a-button type=\"primary\" danger> 禁用账号 </a-button>\n      <a-button type=\"primary\"> 修改密码 </a-button>\n    </template>\n    <template #footer>\n      <a-tabs default-active-key=\"detail\" v-model:activeKey=\"currentKey\">\n        <a-tab-pane key=\"detail\" tab=\"用户资料\" />\n        <a-tab-pane key=\"logs\" tab=\"操作日志\" />\n      </a-tabs>\n    </template>\n    <div class=\"pt-4 m-4 desc-wrap\">\n      <template v-if=\"currentKey == 'detail'\">\n        <div v-for=\"i in 10\" :key=\"i\">这是用户{{ userId }}资料Tab</div>\n      </template>\n      <template v-if=\"currentKey == 'logs'\">\n        <div v-for=\"i in 10\" :key=\"i\">这是用户{{ userId }}操作日志Tab</div>\n      </template>\n    </div>\n  </PageWrapper>\n</template>\n\n<script>\n  import { defineComponent, ref } from 'vue';\n  import { useRoute } from 'vue-router';\n  import { PageWrapper } from '/@/components/Page';\n  import { useGo } from '/@/hooks/web/usePage';\n  import { useTabs } from '/@/hooks/web/useTabs';\n  import { Tabs } from 'ant-design-vue';\n  export default defineComponent({\n    name: 'AccountDetail',\n    components: { PageWrapper, ATabs: Tabs, ATabPane: Tabs.TabPane },\n    setup() {\n      const route = useRoute();\n      const go = useGo();\n      // 此处可以得到用户ID\n      const userId = ref(route.params?.id);\n      const currentKey = ref('detail');\n      const { setTitle } = useTabs();\n      // TODO\n      // 本页代码仅作演示，实际应当通过userId从接口获得用户的相关资料\n\n      // 设置Tab的标题（不会影响页面标题）\n      setTitle('详情：用户' + userId.value);\n\n      // 页面左侧点击返回链接时的操作\n      function goBack() {\n        // 本例的效果时点击返回始终跳转到账号列表页，实际应用时可返回上一页\n        go('/system/account');\n      }\n      return { userId, currentKey, goBack };\n    },\n  });\n</script>\n\n<style></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/system/account/AccountModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"getTitle\" @ok=\"handleSubmit\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { accountFormSchema } from './account.data';\n  import { getDeptList } from '/@/api/demo/system';\n\n  export default defineComponent({\n    name: 'AccountModal',\n    components: { BasicModal, BasicForm },\n    emits: ['success', 'register'],\n    setup(_, { emit }) {\n      const isUpdate = ref(true);\n      const rowId = ref('');\n\n      const [registerForm, { setFieldsValue, updateSchema, resetFields, validate }] = useForm({\n        labelWidth: 100,\n        baseColProps: { span: 24 },\n        schemas: accountFormSchema,\n        showActionButtonGroup: false,\n        actionColOptions: {\n          span: 23,\n        },\n      });\n\n      const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n        resetFields();\n        setModalProps({ confirmLoading: false });\n        isUpdate.value = !!data?.isUpdate;\n\n        if (unref(isUpdate)) {\n          rowId.value = data.record.id;\n          setFieldsValue({\n            ...data.record,\n          });\n        }\n\n        const treeData = await getDeptList();\n        updateSchema([\n          {\n            field: 'pwd',\n            show: !unref(isUpdate),\n          },\n          {\n            field: 'dept',\n            componentProps: { treeData },\n          },\n        ]);\n      });\n\n      const getTitle = computed(() => (!unref(isUpdate) ? '新增账号' : '编辑账号'));\n\n      async function handleSubmit() {\n        try {\n          const values = await validate();\n          setModalProps({ confirmLoading: true });\n          // TODO custom api\n          console.log(values);\n          closeModal();\n          emit('success', { isUpdate: unref(isUpdate), values: { ...values, id: rowId.value } });\n        } finally {\n          setModalProps({ confirmLoading: false });\n        }\n      }\n\n      return { registerModal, registerForm, getTitle, handleSubmit };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/system/account/DeptTree.vue",
    "content": "<template>\n  <div class=\"m-4 mr-0 overflow-hidden bg-white\">\n    <BasicTree\n      title=\"部门列表\"\n      toolbar\n      search\n      :clickRowToExpand=\"false\"\n      :treeData=\"treeData\"\n      :fieldNames=\"{ key: 'id', title: 'deptName' }\"\n      @select=\"handleSelect\"\n    />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, onMounted, ref } from 'vue';\n\n  import { BasicTree, TreeItem } from '/@/components/Tree';\n  import { getDeptList } from '/@/api/demo/system';\n\n  export default defineComponent({\n    name: 'DeptTree',\n    components: { BasicTree },\n\n    emits: ['select'],\n    setup(_, { emit }) {\n      const treeData = ref<TreeItem[]>([]);\n\n      async function fetch() {\n        treeData.value = (await getDeptList()) as unknown as TreeItem[];\n      }\n\n      function handleSelect(keys) {\n        emit('select', keys[0]);\n      }\n\n      onMounted(() => {\n        fetch();\n      });\n      return { treeData, handleSelect };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/system/account/account.data.ts",
    "content": "import { getAllRoleList, isAccountExist } from '/@/api/demo/system';\nimport { BasicColumn } from '/@/components/Table';\nimport { FormSchema } from '/@/components/Table';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '用户名',\n    dataIndex: 'account',\n    width: 120,\n  },\n  {\n    title: '昵称',\n    dataIndex: 'nickname',\n    width: 120,\n  },\n  {\n    title: '邮箱',\n    dataIndex: 'email',\n    width: 120,\n  },\n  {\n    title: '创建时间',\n    dataIndex: 'createTime',\n    width: 180,\n  },\n  {\n    title: '角色',\n    dataIndex: 'role',\n    width: 200,\n  },\n  {\n    title: '备注',\n    dataIndex: 'remark',\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'account',\n    label: '用户名',\n    component: 'Input',\n    colProps: { span: 8 },\n  },\n  {\n    field: 'nickname',\n    label: '昵称',\n    component: 'Input',\n    colProps: { span: 8 },\n  },\n];\n\nexport const accountFormSchema: FormSchema[] = [\n  {\n    field: 'account',\n    label: '用户名',\n    component: 'Input',\n    helpMessage: ['本字段演示异步验证', '不能输入带有admin的用户名'],\n    rules: [\n      {\n        required: true,\n        message: '请输入用户名',\n      },\n      {\n        validator(_, value) {\n          return new Promise((resolve, reject) => {\n            isAccountExist(value)\n              .then(() => resolve())\n              .catch((err) => {\n                reject(err.message || '验证失败');\n              });\n          });\n        },\n      },\n    ],\n  },\n  {\n    field: 'pwd',\n    label: '密码',\n    component: 'InputPassword',\n    required: true,\n    ifShow: false,\n  },\n  {\n    label: '角色',\n    field: 'role',\n    component: 'ApiSelect',\n    componentProps: {\n      api: getAllRoleList,\n      labelField: 'roleName',\n      valueField: 'roleValue',\n    },\n    required: true,\n  },\n  {\n    field: 'dept',\n    label: '所属部门',\n    component: 'TreeSelect',\n    componentProps: {\n      fieldNames: {\n        label: 'deptName',\n        key: 'id',\n        value: 'id',\n      },\n      getPopupContainer: () => document.body,\n    },\n    required: true,\n  },\n  {\n    field: 'nickname',\n    label: '昵称',\n    component: 'Input',\n    required: true,\n  },\n\n  {\n    label: '邮箱',\n    field: 'email',\n    component: 'Input',\n    required: true,\n  },\n\n  {\n    label: '备注',\n    field: 'remark',\n    component: 'InputTextArea',\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/system/account/index.vue",
    "content": "<template>\n  <PageWrapper dense contentFullHeight fixedHeight contentClass=\"flex\">\n    <DeptTree class=\"w-1/4 xl:w-1/5\" @select=\"handleSelect\" />\n    <BasicTable @register=\"registerTable\" class=\"w-3/4 xl:w-4/5\" :searchInfo=\"searchInfo\">\n      <template #toolbar>\n        <a-button type=\"primary\" @click=\"handleCreate\">新增账号</a-button>\n      </template>\n      <template #bodyCell=\"{ column, record }\">\n        <template v-if=\"column.key === 'action'\">\n          <TableAction\n            :actions=\"[\n              {\n                icon: 'clarity:info-standard-line',\n                tooltip: '查看用户详情',\n                onClick: handleView.bind(null, record),\n              },\n              {\n                icon: 'clarity:note-edit-line',\n                tooltip: '编辑用户资料',\n                onClick: handleEdit.bind(null, record),\n              },\n              {\n                icon: 'ant-design:delete-outlined',\n                color: 'error',\n                tooltip: '删除此账号',\n                popConfirm: {\n                  title: '是否确认删除',\n                  placement: 'left',\n                  confirm: handleDelete.bind(null, record),\n                },\n              },\n            ]\"\n          />\n        </template>\n      </template>\n    </BasicTable>\n    <AccountModal @register=\"registerModal\" @success=\"handleSuccess\" />\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, reactive } from 'vue';\n\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { getAccountList } from '/@/api/demo/system';\n  import { PageWrapper } from '/@/components/Page';\n  import DeptTree from './DeptTree.vue';\n\n  import { useModal } from '/@/components/Modal';\n  import AccountModal from './AccountModal.vue';\n\n  import { columns, searchFormSchema } from './account.data';\n  import { useGo } from '/@/hooks/web/usePage';\n\n  export default defineComponent({\n    name: 'system-account',\n    components: { BasicTable, PageWrapper, DeptTree, AccountModal, TableAction },\n    setup() {\n      const go = useGo();\n      const [registerModal, { openModal }] = useModal();\n      const searchInfo = reactive<Recordable>({});\n      const [registerTable, { reload, updateTableDataRecord }] = useTable({\n        title: '账号列表',\n        api: getAccountList,\n        rowKey: 'id',\n        columns,\n        formConfig: {\n          labelWidth: 120,\n          schemas: searchFormSchema,\n          autoSubmitOnEnter: true,\n        },\n        useSearchForm: true,\n        showTableSetting: true,\n        bordered: true,\n        handleSearchInfoFn(info) {\n          console.log('handleSearchInfoFn', info);\n          return info;\n        },\n        actionColumn: {\n          width: 120,\n          title: '操作',\n          dataIndex: 'action',\n          // slots: { customRender: 'action' },\n        },\n      });\n\n      function handleCreate() {\n        openModal(true, {\n          isUpdate: false,\n        });\n      }\n\n      function handleEdit(record: Recordable) {\n        console.log(record);\n        openModal(true, {\n          record,\n          isUpdate: true,\n        });\n      }\n\n      function handleDelete(record: Recordable) {\n        console.log(record);\n      }\n\n      function handleSuccess({ isUpdate, values }) {\n        if (isUpdate) {\n          // 演示不刷新表格直接更新内部数据。\n          // 注意：updateTableDataRecord要求表格的rowKey属性为string并且存在于每一行的record的keys中\n          const result = updateTableDataRecord(values.id, values);\n          console.log(result);\n        } else {\n          reload();\n        }\n      }\n\n      function handleSelect(deptId = '') {\n        searchInfo.deptId = deptId;\n        reload();\n      }\n\n      function handleView(record: Recordable) {\n        go('/system/account_detail/' + record.id);\n      }\n\n      return {\n        registerTable,\n        registerModal,\n        handleCreate,\n        handleEdit,\n        handleDelete,\n        handleSuccess,\n        handleSelect,\n        handleView,\n        searchInfo,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/system/dept/DeptModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"getTitle\" @ok=\"handleSubmit\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { formSchema } from './dept.data';\n\n  import { getDeptList } from '/@/api/demo/system';\n  export default defineComponent({\n    name: 'DeptModal',\n    components: { BasicModal, BasicForm },\n    emits: ['success', 'register'],\n    setup(_, { emit }) {\n      const isUpdate = ref(true);\n\n      const [registerForm, { resetFields, setFieldsValue, updateSchema, validate }] = useForm({\n        labelWidth: 100,\n        schemas: formSchema,\n        showActionButtonGroup: false,\n      });\n\n      const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n        resetFields();\n        setModalProps({ confirmLoading: false });\n        isUpdate.value = !!data?.isUpdate;\n\n        if (unref(isUpdate)) {\n          setFieldsValue({\n            ...data.record,\n          });\n        }\n        const treeData = await getDeptList();\n        updateSchema({\n          field: 'parentDept',\n          componentProps: { treeData },\n        });\n      });\n\n      const getTitle = computed(() => (!unref(isUpdate) ? '新增部门' : '编辑部门'));\n\n      async function handleSubmit() {\n        try {\n          const values = await validate();\n          setModalProps({ confirmLoading: true });\n          // TODO custom api\n          console.log(values);\n          closeModal();\n          emit('success');\n        } finally {\n          setModalProps({ confirmLoading: false });\n        }\n      }\n\n      return { registerModal, registerForm, getTitle, handleSubmit };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/system/dept/dept.data.ts",
    "content": "import { BasicColumn } from '/@/components/Table';\nimport { FormSchema } from '/@/components/Table';\nimport { h } from 'vue';\nimport { Tag } from 'ant-design-vue';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '部门名称',\n    dataIndex: 'deptName',\n    width: 160,\n    align: 'left',\n  },\n  {\n    title: '排序',\n    dataIndex: 'orderNo',\n    width: 50,\n  },\n  {\n    title: '状态',\n    dataIndex: 'status',\n    width: 80,\n    customRender: ({ record }) => {\n      const status = record.status;\n      const enable = ~~status === 0;\n      const color = enable ? 'green' : 'red';\n      const text = enable ? '启用' : '停用';\n      return h(Tag, { color: color }, () => text);\n    },\n  },\n  {\n    title: '创建时间',\n    dataIndex: 'createTime',\n    width: 180,\n  },\n  {\n    title: '备注',\n    dataIndex: 'remark',\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'deptName',\n    label: '部门名称',\n    component: 'Input',\n    colProps: { span: 8 },\n  },\n  {\n    field: 'status',\n    label: '状态',\n    component: 'Select',\n    componentProps: {\n      options: [\n        { label: '启用', value: '0' },\n        { label: '停用', value: '1' },\n      ],\n    },\n    colProps: { span: 8 },\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    field: 'deptName',\n    label: '部门名称',\n    component: 'Input',\n    required: true,\n  },\n  {\n    field: 'parentDept',\n    label: '上级部门',\n    component: 'TreeSelect',\n\n    componentProps: {\n      replaceFields: {\n        title: 'deptName',\n        key: 'id',\n        value: 'id',\n      },\n      getPopupContainer: () => document.body,\n    },\n    required: true,\n  },\n  {\n    field: 'orderNo',\n    label: '排序',\n    component: 'InputNumber',\n    required: true,\n  },\n  {\n    field: 'status',\n    label: '状态',\n    component: 'RadioButtonGroup',\n    defaultValue: '0',\n    componentProps: {\n      options: [\n        { label: '启用', value: '0' },\n        { label: '停用', value: '1' },\n      ],\n    },\n    required: true,\n  },\n  {\n    label: '备注',\n    field: 'remark',\n    component: 'InputTextArea',\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/system/dept/index.vue",
    "content": "<template>\n  <div>\n    <BasicTable @register=\"registerTable\">\n      <template #tableTitle>\n        <a-button type=\"primary\" @click=\"handleCreate\"> 新增部门 </a-button>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction\n          :actions=\"[\n            {\n              icon: 'clarity:note-edit-line',\n              onClick: handleEdit.bind(null, record),\n            },\n            {\n              icon: 'ant-design:delete-outlined',\n              color: 'error',\n              popConfirm: {\n                title: '是否确认删除',\n                confirm: handleDelete.bind(null, record),\n              },\n            },\n          ]\"\n        />\n      </template>\n    </BasicTable>\n    <DeptModal @register=\"registerModal\" @success=\"handleSuccess\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { getDeptList } from '/@/api/demo/system';\n\n  import { useModal } from '/@/components/Modal';\n  import DeptModal from './DeptModal.vue';\n\n  import { columns, searchFormSchema } from './dept.data';\n\n  export default defineComponent({\n    name: 'system-dept',\n    components: { BasicTable, DeptModal, TableAction },\n    setup() {\n      const [registerModal, { openModal }] = useModal();\n      const [registerTable, { reload }] = useTable({\n        title: '部门列表',\n        api: getDeptList,\n        columns,\n        formConfig: {\n          labelWidth: 120,\n          schemas: searchFormSchema,\n        },\n        pagination: false,\n        striped: false,\n        useSearchForm: true,\n        showTableSetting: true,\n        bordered: true,\n        showIndexColumn: false,\n        canResize: false,\n        actionColumn: {\n          width: 80,\n          title: '操作',\n          dataIndex: 'action',\n          slots: { customRender: 'action' },\n          fixed: undefined,\n        },\n      });\n\n      function handleCreate() {\n        openModal(true, {\n          isUpdate: false,\n        });\n      }\n\n      function handleEdit(record: Recordable) {\n        openModal(true, {\n          record,\n          isUpdate: true,\n        });\n      }\n\n      function handleDelete(record: Recordable) {\n        console.log(record);\n      }\n\n      function handleSuccess() {\n        reload();\n      }\n\n      return {\n        registerTable,\n        registerModal,\n        handleCreate,\n        handleEdit,\n        handleDelete,\n        handleSuccess,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/system/menu/MenuDrawer.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"$attrs\" @register=\"registerDrawer\" showFooter :title=\"getTitle\" width=\"50%\" @ok=\"handleSubmit\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicDrawer>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, computed, unref } from 'vue';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { formSchema } from './menu.data';\n  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';\n\n  import { getMenuList } from '/@/api/demo/system';\n\n  export default defineComponent({\n    name: 'MenuDrawer',\n    components: { BasicDrawer, BasicForm },\n    emits: ['success', 'register'],\n    setup(_, { emit }) {\n      const isUpdate = ref(true);\n\n      const [registerForm, { resetFields, setFieldsValue, updateSchema, validate }] = useForm({\n        labelWidth: 100,\n        schemas: formSchema,\n        showActionButtonGroup: false,\n        baseColProps: { lg: 12, md: 24 },\n      });\n\n      const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {\n        resetFields();\n        setDrawerProps({ confirmLoading: false });\n        isUpdate.value = !!data?.isUpdate;\n\n        if (unref(isUpdate)) {\n          setFieldsValue({\n            ...data.record,\n          });\n        }\n        const treeData = await getMenuList();\n        updateSchema({\n          field: 'parentMenu',\n          componentProps: { treeData },\n        });\n      });\n\n      const getTitle = computed(() => (!unref(isUpdate) ? '新增菜单' : '编辑菜单'));\n\n      async function handleSubmit() {\n        try {\n          const values = await validate();\n          setDrawerProps({ confirmLoading: true });\n          // TODO custom api\n          console.log(values);\n          closeDrawer();\n          emit('success');\n        } finally {\n          setDrawerProps({ confirmLoading: false });\n        }\n      }\n\n      return { registerDrawer, registerForm, getTitle, handleSubmit };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/system/menu/index.vue",
    "content": "<template>\n  <div>\n    <BasicTable @register=\"registerTable\" @fetch-success=\"onFetchSuccess\">\n      <template #tableTitle>\n        <a-button type=\"primary\" @click=\"handleCreate\"> 新增菜单 </a-button>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction\n          :actions=\"[\n            {\n              icon: 'clarity:note-edit-line',\n              onClick: handleEdit.bind(null, record),\n            },\n            {\n              icon: 'ant-design:delete-outlined',\n              color: 'error',\n              popConfirm: {\n                title: '是否确认删除',\n                confirm: handleDelete.bind(null, record),\n              },\n            },\n          ]\"\n        />\n      </template>\n    </BasicTable>\n    <MenuDrawer @register=\"registerDrawer\" @success=\"handleSuccess\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, nextTick } from 'vue';\n\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { getMenuList } from '/@/api/demo/system';\n\n  import { useDrawer } from '/@/components/Drawer';\n  import MenuDrawer from './MenuDrawer.vue';\n\n  import { columns, searchFormSchema } from './menu.data';\n\n  export default defineComponent({\n    name: 'MenuManagement',\n    components: { BasicTable, MenuDrawer, TableAction },\n    setup() {\n      const [registerDrawer, { openDrawer }] = useDrawer();\n      const [registerTable, { reload, expandAll }] = useTable({\n        title: '菜单列表',\n        api: getMenuList,\n        columns,\n        formConfig: {\n          labelWidth: 120,\n          schemas: searchFormSchema,\n        },\n        isTreeTable: true,\n        pagination: false,\n        striped: false,\n        useSearchForm: true,\n        showTableSetting: true,\n        bordered: true,\n        showIndexColumn: false,\n        canResize: false,\n        actionColumn: {\n          width: 80,\n          title: '操作',\n          dataIndex: 'action',\n          slots: { customRender: 'action' },\n          fixed: undefined,\n        },\n      });\n\n      function handleCreate() {\n        openDrawer(true, {\n          isUpdate: false,\n        });\n      }\n\n      function handleEdit(record: Recordable) {\n        openDrawer(true, {\n          record,\n          isUpdate: true,\n        });\n      }\n\n      function handleDelete(record: Recordable) {\n        console.log(record);\n      }\n\n      function handleSuccess() {\n        reload();\n      }\n\n      function onFetchSuccess() {\n        // 演示默认展开所有表项\n        nextTick(expandAll);\n      }\n\n      return {\n        registerTable,\n        registerDrawer,\n        handleCreate,\n        handleEdit,\n        handleDelete,\n        handleSuccess,\n        onFetchSuccess,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/system/menu/menu.data.ts",
    "content": "import { BasicColumn } from '/@/components/Table';\nimport { FormSchema } from '/@/components/Table';\nimport { h } from 'vue';\nimport { Tag } from 'ant-design-vue';\nimport { Icon } from '/@/components/Icon';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '菜单名称',\n    dataIndex: 'menuName',\n    width: 200,\n    align: 'left',\n  },\n  {\n    title: '图标',\n    dataIndex: 'icon',\n    width: 50,\n    customRender: ({ record }) => {\n      return h(Icon, { icon: record.icon });\n    },\n  },\n  {\n    title: '权限标识',\n    dataIndex: 'permission',\n    width: 180,\n  },\n  {\n    title: '组件',\n    dataIndex: 'component',\n  },\n  {\n    title: '排序',\n    dataIndex: 'orderNo',\n    width: 50,\n  },\n  {\n    title: '状态',\n    dataIndex: 'status',\n    width: 80,\n    customRender: ({ record }) => {\n      const status = record.status;\n      const enable = ~~status === 0;\n      const color = enable ? 'green' : 'red';\n      const text = enable ? '启用' : '停用';\n      return h(Tag, { color: color }, () => text);\n    },\n  },\n  {\n    title: '创建时间',\n    dataIndex: 'createTime',\n    width: 180,\n  },\n];\n\nconst isDir = (type: string) => type === '0';\nconst isMenu = (type: string) => type === '1';\nconst isButton = (type: string) => type === '2';\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'menuName',\n    label: '菜单名称',\n    component: 'Input',\n    colProps: { span: 8 },\n  },\n  {\n    field: 'status',\n    label: '状态',\n    component: 'Select',\n    componentProps: {\n      options: [\n        { label: '启用', value: '0' },\n        { label: '停用', value: '1' },\n      ],\n    },\n    colProps: { span: 8 },\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    field: 'type',\n    label: '菜单类型',\n    component: 'RadioButtonGroup',\n    defaultValue: '0',\n    componentProps: {\n      options: [\n        { label: '目录', value: '0' },\n        { label: '菜单', value: '1' },\n        { label: '按钮', value: '2' },\n      ],\n    },\n    colProps: { lg: 24, md: 24 },\n  },\n  {\n    field: 'menuName',\n    label: '菜单名称',\n    component: 'Input',\n    required: true,\n  },\n\n  {\n    field: 'parentMenu',\n    label: '上级菜单',\n    component: 'TreeSelect',\n    componentProps: {\n      replaceFields: {\n        title: 'menuName',\n        key: 'id',\n        value: 'id',\n      },\n      getPopupContainer: () => document.body,\n    },\n  },\n\n  {\n    field: 'orderNo',\n    label: '排序',\n    component: 'InputNumber',\n    required: true,\n  },\n  {\n    field: 'icon',\n    label: '图标',\n    component: 'IconPicker',\n    required: true,\n    ifShow: ({ values }) => !isButton(values.type),\n  },\n\n  {\n    field: 'routePath',\n    label: '路由地址',\n    component: 'Input',\n    required: true,\n    ifShow: ({ values }) => !isButton(values.type),\n  },\n  {\n    field: 'component',\n    label: '组件路径',\n    component: 'Input',\n    ifShow: ({ values }) => isMenu(values.type),\n  },\n  {\n    field: 'permission',\n    label: '权限标识',\n    component: 'Input',\n    ifShow: ({ values }) => !isDir(values.type),\n  },\n  {\n    field: 'status',\n    label: '状态',\n    component: 'RadioButtonGroup',\n    defaultValue: '0',\n    componentProps: {\n      options: [\n        { label: '启用', value: '0' },\n        { label: '禁用', value: '1' },\n      ],\n    },\n  },\n  {\n    field: 'isExt',\n    label: '是否外链',\n    component: 'RadioButtonGroup',\n    defaultValue: '0',\n    componentProps: {\n      options: [\n        { label: '否', value: '0' },\n        { label: '是', value: '1' },\n      ],\n    },\n    ifShow: ({ values }) => !isButton(values.type),\n  },\n\n  {\n    field: 'keepalive',\n    label: '是否缓存',\n    component: 'RadioButtonGroup',\n    defaultValue: '0',\n    componentProps: {\n      options: [\n        { label: '否', value: '0' },\n        { label: '是', value: '1' },\n      ],\n    },\n    ifShow: ({ values }) => isMenu(values.type),\n  },\n\n  {\n    field: 'show',\n    label: '是否显示',\n    component: 'RadioButtonGroup',\n    defaultValue: '0',\n    componentProps: {\n      options: [\n        { label: '是', value: '0' },\n        { label: '否', value: '1' },\n      ],\n    },\n    ifShow: ({ values }) => !isButton(values.type),\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/system/password/index.vue",
    "content": "<template>\n  <PageWrapper title=\"修改当前用户密码\" content=\"修改成功后会自动退出当前登录！\">\n    <div class=\"py-8 bg-white flex flex-col justify-center items-center\">\n      <BasicForm @register=\"register\" />\n      <div class=\"flex justify-center\">\n        <a-button @click=\"resetFields\"> 重置 </a-button>\n        <a-button class=\"!ml-4\" type=\"primary\" @click=\"handleSubmit\"> 确认 </a-button>\n      </div>\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { PageWrapper } from '/@/components/Page';\n  import { BasicForm, useForm } from '/@/components/Form';\n\n  import { formSchema } from './pwd.data';\n  export default defineComponent({\n    name: 'ChangePassword',\n    components: { BasicForm, PageWrapper },\n    setup() {\n      const [register, { validate, resetFields }] = useForm({\n        size: 'large',\n        labelWidth: 100,\n        showActionButtonGroup: false,\n        schemas: formSchema,\n      });\n\n      async function handleSubmit() {\n        try {\n          const values = await validate();\n          const { passwordOld, passwordNew } = values;\n\n          // TODO custom api\n          console.log(passwordOld, passwordNew);\n          // const { router } = useRouter();\n          // router.push(pageEnum.BASE_LOGIN);\n        } catch (error) {}\n      }\n\n      return { register, resetFields, handleSubmit };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/system/password/pwd.data.ts",
    "content": "import { FormSchema } from '/@/components/Form';\n\nexport const formSchema: FormSchema[] = [\n  {\n    field: 'passwordOld',\n    label: '当前密码',\n    component: 'InputPassword',\n    required: true,\n  },\n  {\n    field: 'passwordNew',\n    label: '新密码',\n    component: 'StrengthMeter',\n    componentProps: {\n      placeholder: '新密码',\n    },\n    rules: [\n      {\n        required: true,\n        message: '请输入新密码',\n      },\n    ],\n  },\n  {\n    field: 'confirmPassword',\n    label: '确认密码',\n    component: 'InputPassword',\n\n    dynamicRules: ({ values }) => {\n      return [\n        {\n          required: true,\n          validator: (_, value) => {\n            if (!value) {\n              return Promise.reject('\u001d不能为空');\n            }\n            if (value !== values.passwordNew) {\n              return Promise.reject('两次输入的密码不一致!');\n            }\n            return Promise.resolve();\n          },\n        },\n      ];\n    },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/system/role/RoleDrawer.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"$attrs\" @register=\"registerDrawer\" showFooter :title=\"getTitle\" width=\"500px\" @ok=\"handleSubmit\">\n    <BasicForm @register=\"registerForm\">\n      <template #menu=\"{ model, field }\">\n        <BasicTree\n          v-model:value=\"model[field]\"\n          :treeData=\"treeData\"\n          :replaceFields=\"{ title: 'menuName', key: 'id' }\"\n          checkable\n          toolbar\n          title=\"菜单分配\"\n        />\n      </template>\n    </BasicForm>\n  </BasicDrawer>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, computed, unref } from 'vue';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { formSchema } from './role.data';\n  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';\n  import { BasicTree, TreeItem } from '/@/components/Tree';\n\n  import { getMenuList } from '/@/api/demo/system';\n\n  export default defineComponent({\n    name: 'RoleDrawer',\n    components: { BasicDrawer, BasicForm, BasicTree },\n    emits: ['success', 'register'],\n    setup(_, { emit }) {\n      const isUpdate = ref(true);\n      const treeData = ref<TreeItem[]>([]);\n\n      const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n        labelWidth: 90,\n        schemas: formSchema,\n        showActionButtonGroup: false,\n      });\n\n      const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {\n        resetFields();\n        setDrawerProps({ confirmLoading: false });\n        // 需要在setFieldsValue之前先填充treeData，否则Tree组件可能会报key not exist警告\n        if (unref(treeData).length === 0) {\n          treeData.value = (await getMenuList()) as any as TreeItem[];\n        }\n        isUpdate.value = !!data?.isUpdate;\n\n        if (unref(isUpdate)) {\n          setFieldsValue({\n            ...data.record,\n          });\n        }\n      });\n\n      const getTitle = computed(() => (!unref(isUpdate) ? '新增角色' : '编辑角色'));\n\n      async function handleSubmit() {\n        try {\n          const values = await validate();\n          setDrawerProps({ confirmLoading: true });\n          // TODO custom api\n          console.log(values);\n          closeDrawer();\n          emit('success');\n        } finally {\n          setDrawerProps({ confirmLoading: false });\n        }\n      }\n\n      return {\n        registerDrawer,\n        registerForm,\n        getTitle,\n        handleSubmit,\n        treeData,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/system/role/index.vue",
    "content": "<template>\n  <div>\n    <BasicTable @register=\"registerTable\">\n      <template #tableTitle>\n        <a-button type=\"primary\" @click=\"handleCreate\"> 新增角色 </a-button>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction\n          :actions=\"[\n            {\n              icon: 'clarity:note-edit-line',\n              onClick: handleEdit.bind(null, record),\n            },\n            {\n              icon: 'ant-design:delete-outlined',\n              color: 'error',\n              popConfirm: {\n                title: '是否确认删除',\n                confirm: handleDelete.bind(null, record),\n              },\n            },\n          ]\"\n        />\n      </template>\n    </BasicTable>\n    <RoleDrawer @register=\"registerDrawer\" @success=\"handleSuccess\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { getRoleListByPage } from '/@/api/demo/system';\n\n  import { useDrawer } from '/@/components/Drawer';\n  import RoleDrawer from './RoleDrawer.vue';\n\n  import { columns, searchFormSchema } from './role.data';\n\n  export default defineComponent({\n    name: 'system-demorole',\n    components: { BasicTable, RoleDrawer, TableAction },\n    setup() {\n      const [registerDrawer, { openDrawer }] = useDrawer();\n      const [registerTable, { reload }] = useTable({\n        title: '角色列表',\n        api: getRoleListByPage,\n        columns,\n        formConfig: {\n          labelWidth: 120,\n          schemas: searchFormSchema,\n        },\n        useSearchForm: true,\n        showTableSetting: true,\n        bordered: true,\n        showIndexColumn: false,\n        actionColumn: {\n          width: 80,\n          title: '操作',\n          dataIndex: 'action',\n          slots: { customRender: 'action' },\n          fixed: undefined,\n        },\n      });\n\n      function handleCreate() {\n        openDrawer(true, {\n          isUpdate: false,\n        });\n      }\n\n      function handleEdit(record: Recordable) {\n        openDrawer(true, {\n          record,\n          isUpdate: true,\n        });\n      }\n\n      function handleDelete(record: Recordable) {\n        console.log(record);\n      }\n\n      function handleSuccess() {\n        reload();\n      }\n\n      return {\n        registerTable,\n        registerDrawer,\n        handleCreate,\n        handleEdit,\n        handleDelete,\n        handleSuccess,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/system/role/role.data.ts",
    "content": "import { BasicColumn } from '/@/components/Table';\nimport { FormSchema } from '/@/components/Table';\nimport { h } from 'vue';\nimport { Switch } from 'ant-design-vue';\nimport { setRoleStatus } from '/@/api/demo/system';\nimport { useMessage } from '/@/hooks/web/useMessage';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '角色名称',\n    dataIndex: 'roleName',\n    width: 200,\n  },\n  {\n    title: '角色值',\n    dataIndex: 'roleValue',\n    width: 180,\n  },\n  {\n    title: '排序',\n    dataIndex: 'orderNo',\n    width: 50,\n  },\n  {\n    title: '状态',\n    dataIndex: 'status',\n    width: 120,\n    customRender: ({ record }) => {\n      if (!Reflect.has(record, 'pendingStatus')) {\n        record.pendingStatus = false;\n      }\n      return h(Switch, {\n        checked: record.status === '1',\n        checkedChildren: '已启用',\n        unCheckedChildren: '已禁用',\n        loading: record.pendingStatus,\n        onChange(checked: boolean) {\n          record.pendingStatus = true;\n          const newStatus = checked ? '1' : '0';\n          const { createMessage } = useMessage();\n          setRoleStatus(record.id, newStatus)\n            .then(() => {\n              record.status = newStatus;\n              createMessage.success(`已成功修改角色状态`);\n            })\n            .catch(() => {\n              createMessage.error('修改角色状态失败');\n            })\n            .finally(() => {\n              record.pendingStatus = false;\n            });\n        },\n      });\n    },\n  },\n  {\n    title: '创建时间',\n    dataIndex: 'createTime',\n    width: 180,\n  },\n  {\n    title: '备注',\n    dataIndex: 'remark',\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'roleNme',\n    label: '角色名称',\n    component: 'Input',\n    colProps: { span: 8 },\n  },\n  {\n    field: 'status',\n    label: '状态',\n    component: 'Select',\n    componentProps: {\n      options: [\n        { label: '启用', value: '0' },\n        { label: '停用', value: '1' },\n      ],\n    },\n    colProps: { span: 8 },\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    field: 'roleName',\n    label: '角色名称',\n    required: true,\n    component: 'Input',\n  },\n  {\n    field: 'roleValue',\n    label: '角色值',\n    required: true,\n    component: 'Input',\n  },\n  {\n    field: 'status',\n    label: '状态',\n    component: 'RadioButtonGroup',\n    defaultValue: '0',\n    componentProps: {\n      options: [\n        { label: '启用', value: '0' },\n        { label: '停用', value: '1' },\n      ],\n    },\n  },\n  {\n    label: '备注',\n    field: 'remark',\n    component: 'InputTextArea',\n  },\n  {\n    label: ' ',\n    field: 'menu',\n    slot: 'menu',\n    component: 'Input',\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/system/test/TestDrawer.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"$attrs\" @register=\"registerDrawer\" showFooter :title=\"getTitle\" width=\"500px\" @ok=\"handleSubmit\">\n    <BasicForm @register=\"registerForm\"> </BasicForm>\n  </BasicDrawer>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, computed, unref } from 'vue';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { formSchema } from './test.data';\n  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';\n\n  export default defineComponent({\n    name: 'RoleDrawer',\n    components: { BasicDrawer, BasicForm },\n    emits: ['success', 'register'],\n    setup(_, { emit }) {\n      const isUpdate = ref(true);\n\n      const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n        labelWidth: 90,\n        schemas: formSchema,\n        showActionButtonGroup: false,\n      });\n\n      const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {\n        resetFields();\n        setDrawerProps({ confirmLoading: false });\n        isUpdate.value = !!data?.isUpdate;\n        if (unref(isUpdate)) {\n          setFieldsValue({\n            ...data.record,\n          });\n        }\n      });\n\n      const getTitle = computed(() => (!unref(isUpdate) ? '新增角色' : '编辑角色'));\n\n      async function handleSubmit() {\n        try {\n          const values = await validate();\n          setDrawerProps({ confirmLoading: true });\n          // TODO custom api\n          console.log(values);\n          closeDrawer();\n          emit('success');\n        } finally {\n          setDrawerProps({ confirmLoading: false });\n        }\n      }\n\n      return {\n        registerDrawer,\n        registerForm,\n        getTitle,\n        handleSubmit,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/system/test/index.vue",
    "content": "<template>\n  <div>\n    <BasicTable @register=\"registerTable\">\n      <template #tableTitle>\n        <a-button type=\"primary\" @click=\"handleCreate\"> 新增 </a-button>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction\n          :actions=\"[\n            {\n              icon: 'clarity:note-edit-line',\n              onClick: handleEdit.bind(null, record),\n            },\n            {\n              icon: 'ant-design:delete-outlined',\n              color: 'error',\n              popConfirm: {\n                title: '是否确认删除',\n                confirm: handleDelete.bind(null, record),\n              },\n            },\n          ]\"\n        />\n      </template>\n    </BasicTable>\n    <TestDrawer @register=\"registerDrawer\" @success=\"handleSuccess\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { getTestListByPage } from '/@/api/demo/system';\n\n  import { useDrawer } from '/@/components/Drawer';\n  import TestDrawer from './TestDrawer.vue';\n\n  import { columns, searchFormSchema } from './test.data';\n\n  export default defineComponent({\n    name: 'system-test',\n    components: { BasicTable, TestDrawer, TableAction },\n    setup() {\n      const [registerDrawer, { openDrawer }] = useDrawer();\n      const [registerTable, { reload }] = useTable({\n        title: '列表数据',\n        api: getTestListByPage,\n        columns,\n        formConfig: {\n          labelWidth: 120,\n          schemas: searchFormSchema,\n        },\n        useSearchForm: true,\n        showTableSetting: true,\n        bordered: true,\n        showIndexColumn: false,\n        actionColumn: {\n          width: 80,\n          title: '操作',\n          dataIndex: 'action',\n          slots: { customRender: 'action' },\n          fixed: undefined,\n        },\n      });\n\n      function handleCreate() {\n        openDrawer(true, {\n          isUpdate: false,\n        });\n      }\n\n      function handleEdit(record: Recordable) {\n        openDrawer(true, {\n          record,\n          isUpdate: true,\n        });\n      }\n\n      function handleDelete(record: Recordable) {\n        console.log(record);\n      }\n\n      function handleSuccess() {\n        reload();\n      }\n\n      return {\n        registerTable,\n        registerDrawer,\n        handleCreate,\n        handleEdit,\n        handleDelete,\n        handleSuccess,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/system/test/test.data.ts",
    "content": "import { BasicColumn } from '/@/components/Table';\nimport { FormSchema } from '/@/components/Table';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '名称',\n    dataIndex: 'testName',\n    width: 200,\n  },\n  {\n    title: '值',\n    dataIndex: 'testValue',\n    width: 180,\n  },\n  {\n    title: '创建时间',\n    dataIndex: 'createTime',\n    width: 180,\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'testName',\n    label: '名称',\n    component: 'Input',\n    colProps: { span: 8 },\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    field: 'testName',\n    label: '名称',\n    required: true,\n    component: 'Input',\n  },\n  {\n    field: 'testValue',\n    label: '值',\n    required: true,\n    component: 'Input',\n  },\n\n  {\n    label: ' ',\n    field: 'menu',\n    slot: 'menu',\n    component: 'Input',\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/AntdTableSummary.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, h } from 'vue';\n  import { BasicTable, useTable } from '/@/components/Table';\n  import { demoListApi } from '/@/api/demo/table';\n  import { BasicColumn } from '/@/components/Table/src/types/table';\n  /** \n    相比原先的优势：\n    1、Table 列头拖动时合计行不会错位;\n    2、合计行使用TableSummary方式渲染；\n    3、支持slot自定义合计行展示；\n    4、列添加customSummaryRender自定义渲染函数\n    5、能解决在非配置api情况下，列进行过滤时，合计行统计值未更新的问题\n  */\n  export default defineComponent({\n    components: { BasicTable },\n    setup() {\n      function handleSummary(tableData: Recordable[]) {\n        const totalAge = tableData.reduce((prev, next) => {\n          prev += next.age;\n          return prev;\n        }, 0);\n        const totalScore = tableData.reduce((prev, next) => {\n          prev += next.score;\n          return prev;\n        }, 0);\n        return [\n          {\n            _row: '合计',\n            _index: '平均值',\n            age: Math.round(totalAge / tableData.length),\n            score: Math.round(totalScore / tableData.length),\n          },\n          {\n            _row: '合计',\n            _index: '总计',\n            age: totalAge,\n            score: totalScore,\n          },\n        ];\n      }\n      const getBasicColumns = () :BasicColumn[] => {\n        return [\n          {\n            title: 'ID',\n            dataIndex: 'id',\n            fixed: 'left',\n            width: 200,\n            resizable: true,\n          },\n          {\n            title: '姓名',\n            dataIndex: 'name',\n            width: 150,\n            filters: [\n              { text: 'Male', value: 'male' },\n              { text: 'Female', value: 'female' },\n            ],\n          },\n          {\n            title: '年龄',\n            dataIndex: 'age',\n            width: 100,\n            resizable: true,\n            customSummaryRender: ({ text }) => {\n              // return <span style=\"color: red;\">{text}</span>;\n              return h('span', { style: { color: 'red' } }, [text]);\n            },\n          },\n          {\n            title: '得分',\n            dataIndex: 'score',\n            width: 100,\n            resizable: true,\n          },\n          {\n            title: '地址',\n            dataIndex: 'address',\n            width: 300,\n          },\n          {\n            title: '编号',\n            dataIndex: 'no',\n            width: 150,\n            sorter: true,\n            defaultHidden: true,\n          },\n          {\n            title: '开始时间',\n            width: 150,\n            sorter: true,\n            dataIndex: 'beginTime',\n          },\n          {\n            title: '结束时间',\n            width: 150,\n            sorter: true,\n            dataIndex: 'endTime',\n          },\n        ];\n      };\n\n      const [registerTable] = useTable({\n        title: '原生总结栏（表尾合计）示例',\n        api: demoListApi,\n        rowSelection: { type: 'checkbox' },\n        columns: getBasicColumns(),\n        summaryFunc: handleSummary,\n        scroll: { x: 1000 },\n        canResize: false,\n      });\n\n      return {\n        registerTable,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/AuthColumn.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\">\n      <template #action=\"{ record }\">\n        <TableAction\n          :actions=\"[\n            {\n              label: '编辑',\n              onClick: handleEdit.bind(null, record),\n              auth: 'other', // 根据权限控制是否显示: 无权限，不显示\n            },\n            {\n              label: '删除',\n              icon: 'ic:outline-delete-outline',\n              onClick: handleDelete.bind(null, record),\n              auth: 'super', // 根据权限控制是否显示: 有权限，会显示\n            },\n          ]\"\n          :dropDownActions=\"[\n            {\n              label: '启用',\n              popConfirm: {\n                title: '是否启用？',\n                confirm: handleOpen.bind(null, record),\n              },\n              ifShow: (_action) => {\n                return record.status !== 'enable'; // 根据业务控制是否显示: 非enable状态的不显示启用按钮\n              },\n            },\n            {\n              label: '禁用',\n              popConfirm: {\n                title: '是否禁用？',\n                confirm: handleOpen.bind(null, record),\n              },\n              ifShow: () => {\n                return record.status === 'enable'; // 根据业务控制是否显示: enable状态的显示禁用按钮\n              },\n            },\n            {\n              label: '同时控制',\n              popConfirm: {\n                title: '是否动态显示？',\n                confirm: handleOpen.bind(null, record),\n              },\n              auth: 'super', // 同时根据权限和业务控制是否显示\n              ifShow: () => {\n                return true;\n              },\n            },\n          ]\"\n        />\n      </template>\n    </BasicTable>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable, useTable, BasicColumn, TableAction } from '/@/components/Table';\n\n  import { demoListApi } from '/@/api/demo/table';\n  const columns: BasicColumn[] = [\n    {\n      title: '编号',\n      dataIndex: 'no',\n      width: 100,\n    },\n    {\n      title: '姓名',\n      dataIndex: 'name',\n      auth: 'test', // 根据权限控制是否显示: 无权限，不显示\n    },\n    {\n      title: '状态',\n      dataIndex: 'status',\n    },\n    {\n      title: '地址',\n      dataIndex: 'address',\n      auth: 'super', // 同时根据权限和业务控制是否显示\n      ifShow: (_column) => {\n        return true;\n      },\n    },\n    {\n      title: '开始时间',\n      dataIndex: 'beginTime',\n    },\n    {\n      title: '结束时间',\n      dataIndex: 'endTime',\n      width: 200,\n    },\n  ];\n  export default defineComponent({\n    components: { BasicTable, TableAction },\n    setup() {\n      const [registerTable] = useTable({\n        title: 'TableAction组件及固定列示例',\n        api: demoListApi,\n        columns: columns,\n        bordered: true,\n        actionColumn: {\n          width: 250,\n          title: 'Action',\n          dataIndex: 'action',\n          slots: { customRender: 'action' },\n        },\n      });\n      function handleEdit(record: Recordable) {\n        console.log('点击了编辑', record);\n      }\n      function handleDelete(record: Recordable) {\n        console.log('点击了删除', record);\n      }\n      function handleOpen(record: Recordable) {\n        console.log('点击了启用', record);\n      }\n      return {\n        registerTable,\n        handleEdit,\n        handleDelete,\n        handleOpen,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/Basic.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable\n      title=\"基础示例\"\n      titleHelpMessage=\"温馨提醒\"\n      :columns=\"columns\"\n      :dataSource=\"data\"\n      :canResize=\"canResize\"\n      :loading=\"loading\"\n      :striped=\"striped\"\n      :bordered=\"border\"\n      showTableSetting\n      :pagination=\"pagination\"\n      @columns-change=\"handleColumnChange\"\n    >\n      <template #toolbar>\n        <a-button type=\"primary\" @click=\"toggleCanResize\">\n          {{ !canResize ? '自适应高度' : '取消自适应' }}\n        </a-button>\n        <a-button type=\"primary\" @click=\"toggleBorder\">\n          {{ !border ? '显示边框' : '隐藏边框' }}\n        </a-button>\n        <a-button type=\"primary\" @click=\"toggleLoading\"> 开启loading </a-button>\n        <a-button type=\"primary\" @click=\"toggleStriped\">\n          {{ !striped ? '显示斑马纹' : '隐藏斑马纹' }}\n        </a-button>\n      </template>\n    </BasicTable>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import { BasicTable, ColumnChangeParam } from '/@/components/Table';\n  import { getBasicColumns, getBasicData } from './tableData';\n\n  export default defineComponent({\n    components: { BasicTable },\n    setup() {\n      const canResize = ref(false);\n      const loading = ref(false);\n      const striped = ref(true);\n      const border = ref(true);\n      const pagination = ref<any>(false);\n      function toggleCanResize() {\n        canResize.value = !canResize.value;\n      }\n      function toggleStriped() {\n        striped.value = !striped.value;\n      }\n      function toggleLoading() {\n        loading.value = true;\n        setTimeout(() => {\n          loading.value = false;\n          pagination.value = { pageSize: 20 };\n        }, 3000);\n      }\n      function toggleBorder() {\n        border.value = !border.value;\n      }\n\n      function handleColumnChange(data: ColumnChangeParam[]) {\n        console.log('ColumnChanged', data);\n      }\n\n      return {\n        columns: getBasicColumns(),\n        data: getBasicData(),\n        canResize,\n        loading,\n        striped,\n        border,\n        toggleStriped,\n        toggleCanResize,\n        toggleLoading,\n        toggleBorder,\n        pagination,\n        handleColumnChange,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/CustomerCell.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\">\n      <template #id=\"{ record }\"> ID: {{ record.id }} </template>\n      <template #no=\"{ record }\">\n        <Tag color=\"green\">\n          {{ record.no }}\n        </Tag>\n      </template>\n      <template #bodyCell=\"{ column, record }\">\n        <Avatar v-if=\"column.key === 'avatar'\" :size=\"60\" :src=\"record.avatar\" />\n      </template>\n      <template #img=\"{ text }\">\n        <TableImg :size=\"60\" :simpleShow=\"true\" :imgList=\"text\" />\n      </template>\n      <template #imgs=\"{ text }\"> <TableImg :size=\"60\" :imgList=\"text\" /> </template>\n\n      <template #category=\"{ record }\">\n        <Tag color=\"green\">\n          {{ record.no }}\n        </Tag>\n      </template>\n    </BasicTable>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable, useTable, BasicColumn, TableImg } from '/@/components/Table';\n  import { Tag, Avatar } from 'ant-design-vue';\n  import { demoListApi } from '/@/api/demo/table';\n  const columns: BasicColumn[] = [\n    {\n      title: 'ID',\n      dataIndex: 'id',\n      slots: { customRender: 'id' },\n    },\n    {\n      title: '头像',\n      dataIndex: 'avatar',\n      width: 100,\n      slots: { customRender: 'avatar' },\n    },\n    {\n      title: '分类',\n      dataIndex: 'category',\n      width: 80,\n      align: 'center',\n      defaultHidden: true,\n      slots: { customRender: 'category' },\n    },\n    {\n      title: '姓名',\n      dataIndex: 'name',\n      width: 120,\n    },\n    {\n      title: '图片列表1',\n      dataIndex: 'imgArr',\n      helpMessage: ['这是简单模式的图片列表', '只会显示一张在表格中', '但点击可预览多张图片'],\n      width: 140,\n      slots: { customRender: 'img' },\n    },\n    {\n      title: '照片列表2',\n      dataIndex: 'imgs',\n      width: 160,\n      slots: { customRender: 'imgs' },\n    },\n    {\n      title: '地址',\n      dataIndex: 'address',\n    },\n    {\n      title: '编号',\n      dataIndex: 'no',\n      slots: { customRender: 'no' },\n    },\n    {\n      title: '开始时间',\n      dataIndex: 'beginTime',\n    },\n    {\n      title: '结束时间',\n      dataIndex: 'endTime',\n    },\n  ];\n  export default defineComponent({\n    components: { BasicTable, TableImg, Tag, Avatar },\n    setup() {\n      const [registerTable] = useTable({\n        title: '自定义列内容',\n        titleHelpMessage: '表格中所有头像、图片均为mock生成，仅用于演示图片占位',\n        api: demoListApi,\n        columns: columns,\n        bordered: true,\n        showTableSetting: true,\n      });\n\n      return {\n        registerTable,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/EditCellTable.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\" @edit-end=\"handleEditEnd\" @edit-cancel=\"handleEditCancel\" :beforeEditSubmit=\"beforeEditSubmit\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable, useTable, BasicColumn } from '/@/components/Table';\n  import { optionsListApi } from '/@/api/demo/select';\n\n  import { demoListApi } from '/@/api/demo/table';\n  import { treeOptionsListApi } from '/@/api/demo/tree';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { mapTableTotalSummary } from \"@/utils/common/compUtils\";\n  const columns: BasicColumn[] = [\n    {\n      title: '输入框',\n      dataIndex: 'name',\n      edit: true,\n      editComponentProps: {\n        prefix: '$',\n      },\n      width: 200,\n    },\n    {\n      title: '默认输入状态',\n      dataIndex: 'name7',\n      edit: true,\n      editable: true,\n      width: 200,\n    },\n    {\n      title: '输入框校验',\n      dataIndex: 'name1',\n      edit: true,\n      // 默认必填校验\n      editRule: true,\n      width: 200,\n    },\n    {\n      title: '输入框函数校验',\n      dataIndex: 'name2',\n      edit: true,\n      editRule: async (text) => {\n        if (text === '2') {\n          return '不能输入该值';\n        }\n        return '';\n      },\n      width: 200,\n    },\n    {\n      title: '数字输入框',\n      dataIndex: 'id',\n      edit: true,\n      editRule: true,\n      editComponent: 'InputNumber',\n      width: 200,\n    },\n    {\n      title: '下拉框',\n      dataIndex: 'name3',\n      edit: true,\n      editComponent: 'Select',\n      editComponentProps: {\n        options: [\n          {\n            label: 'Option1',\n            value: '1',\n          },\n          {\n            label: 'Option2',\n            value: '2',\n          },\n        ],\n      },\n      width: 200,\n    },\n    {\n      title: '远程下拉',\n      dataIndex: 'name4',\n      edit: true,\n      editComponent: 'ApiSelect',\n      editComponentProps: {\n        api: optionsListApi,\n        resultField: 'list',\n        labelField: 'name',\n        valueField: 'id',\n      },\n      width: 200,\n    },\n    {\n      title: '远程下拉树',\n      dataIndex: 'name71',\n      edit: true,\n      editComponent: 'ApiTreeSelect',\n      editRule: false,\n      editComponentProps: {\n        api: treeOptionsListApi,\n        resultField: 'list',\n      },\n      width: 200,\n    },\n    {\n      title: '日期选择',\n      dataIndex: 'date',\n      edit: true,\n      editComponent: 'DatePicker',\n      editComponentProps: {\n        valueFormat: 'YYYY-MM-DD',\n        format: 'YYYY-MM-DD',\n      },\n      width: 200,\n    },\n    {\n      title: '时间选择',\n      dataIndex: 'time',\n      edit: true,\n      editComponent: 'TimePicker',\n      editComponentProps: {\n        valueFormat: 'HH:mm',\n        format: 'HH:mm',\n      },\n      width: 200,\n    },\n    {\n      title: '勾选框',\n      dataIndex: 'name5',\n      edit: true,\n      editComponent: 'Checkbox',\n      editValueMap: (value) => {\n        return value ? '是' : '否';\n      },\n      width: 200,\n    },\n    {\n      title: '开关',\n      dataIndex: 'name6',\n      edit: true,\n      editComponent: 'Switch',\n      editValueMap: (value) => {\n        return value ? '开' : '关';\n      },\n      width: 200,\n    },\n  ];\n  export default defineComponent({\n    components: { BasicTable },\n    setup() {\n      const [registerTable] = useTable({\n        title: '可编辑单元格示例',\n        api: demoListApi,\n        columns: columns,\n        showIndexColumn: false,\n        bordered: true,\n        showSummary: true,\n        summaryFunc: onSummary\n      }); \n\n      const { createMessage } = useMessage();\n\n      function handleEditEnd({ record, index, key, value }: Recordable) {\n        console.log(record, index, key, value);\n        return false;\n      }\n\n      // 模拟将指定数据保存\n      function feakSave({ value, key, id }) {\n        createMessage.loading({\n          content: `正在模拟保存${key}`,\n          key: '_save_fake_data',\n          duration: 0,\n        });\n        return new Promise((resolve) => {\n          setTimeout(() => {\n            if (value === '') {\n              createMessage.error({\n                content: '保存失败：不能为空',\n                key: '_save_fake_data',\n                duration: 2,\n              });\n              resolve(false);\n            } else {\n              createMessage.success({\n                content: `记录${id}的${key}已保存`,\n                key: '_save_fake_data',\n                duration: 2,\n              });\n              resolve(true);\n            }\n          }, 2000);\n        });\n      }\n\n      async function beforeEditSubmit({ record, index, key, value }) {\n        console.log('单元格数据正在准备提交', { record, index, key, value });\n        return await feakSave({ id: record.id, key, value });\n      }\n\n      function handleEditCancel() {\n        console.log('cancel');\n      }\n\n      function onSummary(tableData: Recordable[]) {\n        // 可用工具方法自动计算合计\n        const totals = mapTableTotalSummary(tableData, ['id']);\n        return [\n          totals\n        ];\n      }\n      return {\n        registerTable,\n        handleEditEnd,\n        handleEditCancel,\n        beforeEditSubmit,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/EditRowTable.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\" @edit-change=\"onEditChange\">\n      <template #action=\"{ record, column }\">\n        <TableAction :actions=\"createActions(record, column)\" />\n      </template>\n    </BasicTable>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import { BasicTable, useTable, TableAction, BasicColumn, ActionItem, EditRecordRow } from '/@/components/Table';\n  import { optionsListApi } from '/@/api/demo/select';\n\n  import { demoListApi } from '/@/api/demo/table';\n  import { treeOptionsListApi } from '/@/api/demo/tree';\n  import { cloneDeep } from 'lodash-es';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  const columns: BasicColumn[] = [\n    {\n      title: '输入框',\n      dataIndex: 'name',\n      editRow: true,\n      editComponentProps: {\n        prefix: '$',\n      },\n      width: 150,\n    },\n    {\n      title: '默认输入状态',\n      dataIndex: 'name7',\n      editRow: true,\n      width: 150,\n    },\n    {\n      title: '输入框校验',\n      dataIndex: 'name1',\n      editRow: true,\n      align: 'left',\n      // 默认必填校验\n      editRule: true,\n      width: 150,\n    },\n    {\n      title: '输入框函数校验',\n      dataIndex: 'name2',\n      editRow: true,\n      align: 'right',\n      editRule: async (text) => {\n        if (text === '2') {\n          return '不能输入该值';\n        }\n        return '';\n      },\n    },\n    {\n      title: '数字输入框',\n      dataIndex: 'id',\n      editRow: true,\n      editRule: true,\n      editComponent: 'InputNumber',\n      width: 150,\n    },\n    {\n      title: '下拉框',\n      dataIndex: 'name3',\n      editRow: true,\n      editComponent: 'Select',\n      editComponentProps: {\n        options: [\n          {\n            label: 'Option1',\n            value: '1',\n          },\n          {\n            label: 'Option2',\n            value: '2',\n          },\n          {\n            label: 'Option3',\n            value: '3',\n          },\n        ],\n      },\n      width: 200,\n    },\n    {\n      title: '远程下拉',\n      dataIndex: 'name4',\n      editRow: true,\n      editComponent: 'ApiSelect',\n      editComponentProps: {\n        api: optionsListApi,\n        resultField: 'list',\n        labelField: 'name',\n        valueField: 'id',\n      },\n      width: 200,\n    },\n    {\n      title: '远程下拉树',\n      dataIndex: 'name8',\n      editRow: true,\n      editComponent: 'ApiTreeSelect',\n      editRule: false,\n      editComponentProps: {\n        api: treeOptionsListApi,\n        resultField: 'list',\n      },\n      width: 200,\n    },\n    {\n      title: '日期选择',\n      dataIndex: 'date',\n      editRow: true,\n      editComponent: 'DatePicker',\n      editComponentProps: {\n        valueFormat: 'YYYY-MM-DD',\n        format: 'YYYY-MM-DD',\n      },\n      width: 150,\n    },\n    {\n      title: '时间选择',\n      dataIndex: 'time',\n      editRow: true,\n      editComponent: 'TimePicker',\n      editComponentProps: {\n        valueFormat: 'HH:mm',\n        format: 'HH:mm',\n      },\n      width: 100,\n    },\n    {\n      title: '勾选框',\n      dataIndex: 'name5',\n      editRow: true,\n\n      editComponent: 'Checkbox',\n      editValueMap: (value) => {\n        return value ? '是' : '否';\n      },\n      width: 100,\n    },\n    {\n      title: '开关',\n      dataIndex: 'name6',\n      editRow: true,\n      editComponent: 'Switch',\n      editValueMap: (value) => {\n        return value ? '开' : '关';\n      },\n      width: 100,\n    },\n  ];\n  export default defineComponent({\n    components: { BasicTable, TableAction },\n    setup() {\n      const { createMessage: msg } = useMessage();\n      const currentEditKeyRef = ref('');\n      const [registerTable] = useTable({\n        title: '可编辑行示例',\n        titleHelpMessage: ['本例中修改[数字输入框]这一列时，同一行的[远程下拉]列的当前编辑数据也会同步发生改变'],\n        api: demoListApi,\n        columns: columns,\n        showIndexColumn: false,\n        showTableSetting: true,\n        tableSetting: { fullScreen: true },\n        actionColumn: {\n          width: 160,\n          title: 'Action',\n          dataIndex: 'action',\n          slots: { customRender: 'action' },\n        },\n      });\n\n      function handleEdit(record: EditRecordRow) {\n        currentEditKeyRef.value = record.key;\n        record.onEdit?.(true);\n      }\n\n      function handleCancel(record: EditRecordRow) {\n        currentEditKeyRef.value = '';\n        record.onEdit?.(false, false);\n      }\n\n      async function handleSave(record: EditRecordRow) {\n        // 校验\n        msg.loading({ content: '正在保存...', duration: 0, key: 'saving' });\n        const valid = await record.onValid?.();\n        if (valid) {\n          try {\n            const data = cloneDeep(record.editValueRefs);\n            console.log(data);\n            //TODO 此处将数据提交给服务器保存\n            // ...\n            // 保存之后提交编辑状态\n            const pass = await record.onEdit?.(false, true);\n            if (pass) {\n              currentEditKeyRef.value = '';\n            }\n            msg.success({ content: '数据已保存', key: 'saving' });\n          } catch (error) {\n            msg.error({ content: '保存失败', key: 'saving' });\n          }\n        } else {\n          msg.error({ content: '请填写正确的数据', key: 'saving' });\n        }\n      }\n\n      function createActions(record: EditRecordRow, column: BasicColumn): ActionItem[] {\n        if (!record.editable) {\n          return [\n            {\n              label: '编辑',\n              disabled: currentEditKeyRef.value ? currentEditKeyRef.value !== record.key : false,\n              onClick: handleEdit.bind(null, record),\n            },\n          ];\n        }\n        return [\n          {\n            label: '保存',\n            onClick: handleSave.bind(null, record, column),\n          },\n          {\n            label: '取消',\n            popConfirm: {\n              title: '是否取消编辑',\n              confirm: handleCancel.bind(null, record, column),\n            },\n          },\n        ];\n      }\n\n      function onEditChange({ column, value, record }) {\n        // 本例\n        if (column.dataIndex === 'id') {\n          record.editValueRefs.name4.value = `${value}`;\n        }\n        console.log(column, value, record);\n      }\n\n      return {\n        registerTable,\n        handleEdit,\n        createActions,\n        onEditChange,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/EditableCellIdTest.vue",
    "content": "<template>\n  <PageWrapper title=\"EditableCell ID字段测试 (Issue #8924)\">\n    <a-alert\n      message=\"🧪 测试目的：验证 beforeEditSubmit 是否会过滤掉 id 字段\"\n      description=\"请编辑任意单元格并点击对号，查看下方的测试结果。如果 record 中没有 id 字段，说明问题存在。\"\n      type=\"warning\"\n      show-icon\n      class=\"mb-4\"\n    />\n\n    <div class=\"p-4\">\n      <a-card title=\"🔬 测试场景1：id 字段不在 columns 中（最常见场景）\" class=\"mb-4\">\n        <a-alert\n          message=\"⚠️ 核心测试：id 在数据中，但不在 columns 中显示\"\n          description=\"这是最常见的场景：主键字段通常不需要在表格中显示，但在更新数据时必须使用。\"\n          type=\"info\"\n          show-icon\n          class=\"mb-3\"\n        />\n        \n        <a-space direction=\"vertical\" style=\"width: 100%\">\n          <a-card size=\"small\" title=\"📋 测试数据说明\" :bordered=\"false\">\n            <p><strong>数据源包含：</strong>id, name, age, email, address</p>\n            <p><strong>Columns 显示：</strong>name, age, email, address（⚠️ 没有 id 列）</p>\n            <p><strong>rowKey 配置：</strong>'id'</p>\n          </a-card>\n          \n          <BasicTable\n            @register=\"registerTable1\"\n            :beforeEditSubmit=\"handleBeforeEditSubmit1\"\n          />\n          \n          <a-card \n            size=\"small\" \n            :title=\"testResult1.title\" \n            :bordered=\"false\"\n            :headStyle=\"{ backgroundColor: testResult1.bgColor, color: 'white' }\"\n          >\n            <a-descriptions bordered :column=\"1\" size=\"small\">\n              <a-descriptions-item label=\"是否包含 id\">\n                <a-tag :color=\"testResult1.hasId ? 'success' : 'error'\">\n                  {{ testResult1.hasId ? '✅ 包含' : '❌ 不包含' }}\n                  {{ testResult1.hasId ? `(id=${testResult1.idValue})` : '' }}\n                </a-tag>\n              </a-descriptions-item>\n              <a-descriptions-item label=\"record 包含的字段\">\n                <a-tag v-for=\"field in testResult1.fields\" :key=\"field\" color=\"blue\">{{ field }}</a-tag>\n              </a-descriptions-item>\n              <a-descriptions-item label=\"完整 record 内容\">\n                <pre class=\"test-result-json\">{{ testResult1.recordJson }}</pre>\n              </a-descriptions-item>\n              <a-descriptions-item label=\"测试结论\">\n                <a-alert \n                  :message=\"testResult1.conclusion\" \n                  :type=\"testResult1.hasId ? 'success' : 'error'\" \n                  show-icon \n                />\n              </a-descriptions-item>\n            </a-descriptions>\n          </a-card>\n        </a-space>\n      </a-card>\n\n      <a-card title=\"💡 测试说明\" class=\"mb-4\">\n        <a-space direction=\"vertical\" style=\"width: 100%\">\n          <a-alert\n            message=\"如何进行测试？\"\n            description=\"1. 点击上方表格任意单元格进行编辑\n2. 修改内容后点击对号 ✓ 提交\n3. 查看测试结果，观察 record 是否包含 id 字段\"\n            type=\"info\"\n            show-icon\n          />\n          \n          <a-alert\n            message=\"预期结果\"\n            type=\"success\"\n            show-icon\n          >\n            <template #description>\n              <p><strong>如果代码正常：</strong></p>\n              <p>✅ record 应该包含 id 字段</p>\n              <p>✅ 可以使用 record.id 进行数据更新</p>\n              <p>✅ 控制台显示绿色成功消息</p>\n            </template>\n          </a-alert>\n          \n          <a-alert\n            message=\"Bug 症状（Issue #8924）\"\n            type=\"error\"\n            show-icon\n          >\n            <template #description>\n              <p><strong>如果存在 Bug：</strong></p>\n              <p>❌ record 中没有 id 字段</p>\n              <p>❌ record 只包含 columns 中定义的字段（name, age, email, address）</p>\n              <p>❌ 无法执行数据更新操作</p>\n              <p>❌ 控制台显示红色错误消息</p>\n            </template>\n          </a-alert>\n          \n          <a-card size=\"small\" title=\"🔍 原因分析\" :bordered=\"false\">\n            <p>原代码使用 <code>pick(record, keys)</code> 过滤字段：</p>\n            <pre class=\"code-block\">const keys = columns.map(c => c.dataIndex).filter(f => !!f);\n// keys = ['name', 'age', 'email', 'address']  // ⚠️ 没有 id\n\nrecord: pick(record, keys)\n// 只保留 keys 中的字段，id 被过滤掉了</pre>\n          </a-card>\n        </a-space>\n      </a-card>\n    </div>\n  </PageWrapper>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import { PageWrapper } from '/@/components/Page';\n  import { BasicTable, useTable, BasicColumn } from '/@/components/Table';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  const { createMessage } = useMessage();\n\n  // ============ 测试场景1：id字段不在columns中 ============\n  const testResult1 = ref<{\n    title: string;\n    bgColor: string;\n    hasId: boolean;\n    idValue: any;\n    fields: string[];\n    recordJson: string;\n    conclusion: string;\n  }>({\n    title: '📊 测试结果（点击对号后显示）',\n    bgColor: '#909399',\n    hasId: false,\n    idValue: null,\n    fields: [],\n    recordJson: '暂无数据，请编辑单元格并点击对号',\n    conclusion: '等待测试...',\n  });\n\n  const columns1: BasicColumn[] = [\n    // 注意：这里没有 id 列\n    {\n      title: '姓名',\n      dataIndex: 'name',\n      width: 150,\n      edit: true,\n      editComponent: 'Input',\n    },\n    {\n      title: '年龄',\n      dataIndex: 'age',\n      width: 120,\n      edit: true,\n      editComponent: 'InputNumber',\n    },\n    {\n      title: '邮箱',\n      dataIndex: 'email',\n      width: 200,\n      edit: true,\n      editComponent: 'Input',\n    },\n    {\n      title: '地址',\n      dataIndex: 'address',\n      width: 200,\n      edit: true,\n      editComponent: 'Input',\n    },\n  ];\n\n  const dataSource1 = [\n    { id: 1, name: '张三', age: 25, email: 'zhangsan@example.com', address: '北京市朝阳区' },\n    { id: 2, name: '李四', age: 30, email: 'lisi@example.com', address: '上海市浦东新区' },\n    { id: 3, name: '王五', age: 28, email: 'wangwu@example.com', address: '广州市天河区' },\n  ];\n\n  const [registerTable1] = useTable({\n    rowKey: 'id',  // 使用默认id字段作为主键,\n    columns: columns1,\n    dataSource: dataSource1,\n    pagination: false,\n    showIndexColumn: true,\n    canResize: false,\n  });\n\n  async function handleBeforeEditSubmit1({ record, index, key, value }) {\n    console.log('🧪 场景1 测试 - beforeEditSubmit 接收到的数据：', { record, index, key, value });\n    console.log('🔍 record 详细内容：', JSON.stringify(record, null, 2));\n    \n    // 分析 record\n    const hasId = 'id' in record;\n    const fields = Object.keys(record);\n    \n    // 更新测试结果\n    testResult1.value = {\n      title: hasId ? '✅ 测试通过' : '❌ 测试失败 - 发现 Bug！',\n      bgColor: hasId ? '#67C23A' : '#F56C6C',\n      hasId: hasId,\n      idValue: record.id || null,\n      fields: fields,\n      recordJson: JSON.stringify(record, null, 2),\n      conclusion: hasId \n        ? `✅ record 中包含 id 字段（值为 ${record.id}），可以正常更新数据` \n        : `❌ Bug 确认：record 中缺少 id 字段！只包含 ${fields.join(', ')}。这会导致无法执行数据更新操作。`,\n    };\n\n    if (!hasId) {\n      createMessage.error('❌ 测试失败：record 中缺少 id 字段！这就是 Issue #8924 描述的问题。');\n      console.error('❌ Bug 重现：数据源中有 id，但 beforeEditSubmit 收到的 record 中没有 id');\n      return false;\n    }\n\n    createMessage.success(`✅ 测试通过：获取到 id=${record.id}`);\n    console.log('✅ 模拟更新请求：', {\n      url: '/api/user/update',\n      params: { id: record.id, [key]: value },\n    });\n    \n    return true;\n  }\n\n</script>\n\n<style scoped>\n  .test-result-json {\n    font-size: 12px;\n    line-height: 1.5;\n    background-color: #f5f5f5;\n    padding: 8px;\n    border-radius: 4px;\n    max-height: 200px;\n    overflow: auto;\n  }\n  \n  .code-block {\n    font-size: 13px;\n    line-height: 1.6;\n    background-color: #282c34;\n    color: #abb2bf;\n    padding: 12px;\n    border-radius: 4px;\n    overflow-x: auto;\n  }\n  \n  p {\n    margin: 8px 0;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/ExpandTable.vue",
    "content": "<template>\n  <PageWrapper\n    title=\"可展开表格\"\n    content=\"不可与scroll共用。TableAction组件可配置stopButtonPropagation来阻止操作按钮的点击事件冒泡，以便配合Table组件的expandRowByClick\"\n  >\n    <BasicTable @register=\"registerTable\">\n      <template #expandedRowRender=\"{ record }\">\n        <span>No: {{ record.no }} </span>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction\n          stopButtonPropagation\n          :actions=\"[\n            {\n              label: '删除',\n              icon: 'ic:outline-delete-outline',\n              onClick: handleDelete.bind(null, record),\n            },\n          ]\"\n          :dropDownActions=\"[\n            {\n              label: '启用',\n              popConfirm: {\n                title: '是否启用？',\n                confirm: handleOpen.bind(null, record),\n              },\n            },\n          ]\"\n        />\n      </template>\n    </BasicTable>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { PageWrapper } from '/@/components/Page';\n  import { getBasicColumns } from './tableData';\n\n  import { demoListApi } from '/@/api/demo/table';\n\n  export default defineComponent({\n    components: { BasicTable, TableAction, PageWrapper },\n    setup() {\n      const [registerTable] = useTable({\n        api: demoListApi,\n        title: '可展开表格演示',\n        titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],\n        columns: getBasicColumns(),\n        rowKey: 'id',\n        canResize: false,\n        expandRowByClick: true,\n        actionColumn: {\n          width: 160,\n          title: 'Action',\n          dataIndex: 'action',\n          slots: { customRender: 'action' },\n        },\n      });\n      function handleDelete(record: Recordable) {\n        console.log('点击了删除', record);\n      }\n      function handleOpen(record: Recordable) {\n        console.log('点击了启用', record);\n      }\n\n      return {\n        registerTable,\n        handleDelete,\n        handleOpen,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/FetchTable.vue",
    "content": "<template>\n  <PageWrapper contentBackground contentClass=\"flex\" dense contentFullHeight fixedHeight>\n    <BasicTable @register=\"registerTable\">\n      <template #toolbar>\n        <a-button type=\"primary\" @click=\"handleReloadCurrent\"> 刷新当前页 </a-button>\n        <a-button type=\"primary\" @click=\"handleReload\"> 刷新并返回第一页 </a-button>\n      </template>\n    </BasicTable>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable, useTable } from '/@/components/Table';\n  import { getBasicColumns } from './tableData';\n  import { PageWrapper } from '/@/components/Page';\n\n  import { demoListApi } from '/@/api/demo/table';\n  export default defineComponent({\n    components: { BasicTable, PageWrapper },\n    setup() {\n      const [registerTable, { reload }] = useTable({\n        title: '远程加载示例',\n        api: demoListApi,\n        columns: getBasicColumns(),\n        pagination: { pageSize: 10 },\n      });\n      function handleReloadCurrent() {\n        reload();\n      }\n\n      function handleReload() {\n        reload({\n          page: 1,\n        });\n      }\n      return {\n        registerTable,\n        handleReloadCurrent,\n        handleReload,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/FixedColumn.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\">\n      <template #action=\"{ record }\">\n        <TableAction\n          :actions=\"[\n            {\n              label: '删除',\n              icon: 'ic:outline-delete-outline',\n              onClick: handleDelete.bind(null, record),\n            },\n          ]\"\n          :dropDownActions=\"[\n            {\n              label: '启用',\n              popConfirm: {\n                title: '是否启用？',\n                confirm: handleOpen.bind(null, record),\n              },\n            },\n          ]\"\n        />\n      </template>\n    </BasicTable>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable, useTable, BasicColumn, TableAction } from '/@/components/Table';\n\n  import { demoListApi } from '/@/api/demo/table';\n  const columns: BasicColumn[] = [\n    {\n      title: 'ID',\n      dataIndex: 'id',\n      fixed: 'left',\n      width: 280,\n    },\n    {\n      title: '姓名',\n      dataIndex: 'name',\n      width: 260,\n    },\n    {\n      title: '地址',\n      dataIndex: 'address',\n    },\n    {\n      title: '编号',\n      dataIndex: 'no',\n      width: 300,\n    },\n    {\n      title: '开始时间',\n      width: 200,\n      dataIndex: 'beginTime',\n    },\n    {\n      title: '结束时间',\n      dataIndex: 'endTime',\n      width: 200,\n    },\n  ];\n  export default defineComponent({\n    components: { BasicTable, TableAction },\n    setup() {\n      const [registerTable] = useTable({\n        title: 'TableAction组件及固定列示例',\n        api: demoListApi,\n        columns: columns,\n        rowSelection: { type: 'radio' },\n        bordered: true,\n        actionColumn: {\n          width: 160,\n          title: 'Action',\n          dataIndex: 'action',\n          slots: { customRender: 'action' },\n        },\n      });\n      function handleDelete(record: Recordable) {\n        console.log('点击了删除', record);\n      }\n      function handleOpen(record: Recordable) {\n        console.log('点击了启用', record);\n      }\n      return {\n        registerTable,\n        handleDelete,\n        handleOpen,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/FixedHeight.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\">\n      <template #customTitle>\n        <span>\n          姓名\n          <BasicHelp class=\"ml-2\" text=\"姓名\" />\n        </span>\n      </template>\n      <template #customAddress>\n        地址\n        <FormOutlined class=\"ml-2\" />\n      </template>\n    </BasicTable>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable, useTable } from '/@/components/Table';\n  import { getCustomHeaderColumns } from './tableData';\n  import { FormOutlined } from '@ant-design/icons-vue';\n  import { demoListApi } from '/@/api/demo/table';\n  import { BasicHelp } from '/@/components/Basic';\n\n  export default defineComponent({\n    components: { BasicTable, FormOutlined, BasicHelp },\n    setup() {\n      const [registerTable] = useTable({\n        title: '定高/头部自定义',\n        api: demoListApi,\n        columns: getCustomHeaderColumns(),\n        canResize: false,\n        scroll: { y: 100 },\n      });\n\n      return {\n        registerTable,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/FooterTable.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable, useTable } from '/@/components/Table';\n  import { BasicColumn } from '/@/components/Table/src/types/table';\n  import { demoListApi } from '/@/api/demo/table';\n\n  export default defineComponent({\n    components: { BasicTable },\n    setup() {\n      function handleSummary(tableData: Recordable[]) {\n        const totalAge = tableData.reduce((prev, next) => {\n          prev += next.age;\n          return prev;\n        }, 0);\n        const totalScore = tableData.reduce((prev, next) => {\n          prev += next.score;\n          return prev;\n        }, 0);\n        return [\n          {\n            _row: '合计',\n            _index: '平均值',\n            age: Math.round(totalAge / tableData.length),\n            score: Math.round(totalScore / tableData.length),\n          },\n          {\n            _row: '合计',\n            _index: '平均值',\n            age: totalAge,\n            score: totalScore,\n          },\n        ];\n      }\n      const getBasicColumns = (): BasicColumn[] => {\n        return [\n          {\n            title: 'ID',\n            dataIndex: 'id',\n            fixed: 'left',\n            width: 200,\n          },\n          {\n            title: '姓名',\n            dataIndex: 'name',\n            width: 150,\n            filters: [\n              { text: 'Male', value: 'male' },\n              { text: 'Female', value: 'female' },\n            ],\n          },\n          {\n            title: '年龄',\n            dataIndex: 'age',\n            width: 100,\n          },\n          {\n            title: '得分',\n            dataIndex: 'score',\n            width: 100,\n            resizable: true,\n          },\n          {\n            title: '地址',\n            dataIndex: 'address',\n            width: 300,\n          },\n          {\n            title: '编号',\n            dataIndex: 'no',\n            width: 150,\n            sorter: true,\n            defaultHidden: true,\n          },\n          {\n            title: '开始时间',\n            width: 150,\n            sorter: true,\n            dataIndex: 'beginTime',\n          },\n          {\n            title: '结束时间',\n            width: 150,\n            sorter: true,\n            dataIndex: 'endTime',\n          },\n        ];\n      };\n      const [registerTable] = useTable({\n        title: '表尾行合计示例',\n        api: demoListApi,\n        rowSelection: { type: 'checkbox' },\n        columns: getBasicColumns(),\n        // showSummary: true使用的是自定义的表尾行合计方式，如果不设置或者为false使用的antd\n        showSummary: true,\n        summaryFunc: handleSummary,\n        scroll: { x: 1000 },\n        canResize: false,\n      });\n\n      return {\n        registerTable,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/FormTable.vue",
    "content": "<template>\n  <BasicTable @register=\"registerTable\" :rowSelection=\"{ type: 'checkbox', selectedRowKeys: checkedKeys, onChange: onSelectChange }\">\n    <template #form-custom> custom-slot </template>\n    <template #headerTop>\n      <a-alert type=\"info\" show-icon>\n        <template #message>\n          <template v-if=\"checkedKeys.length > 0\">\n            <span>已选中{{ checkedKeys.length }}条记录(可跨页)</span>\n            <a-button type=\"link\" @click=\"checkedKeys = []\" size=\"small\">清空</a-button>\n          </template>\n          <template v-else>\n            <span>未选中任何项目</span>\n          </template>\n        </template>\n      </a-alert>\n    </template>\n    <template #toolbar>\n      <a-button type=\"primary\" @click=\"getFormValues\">获取表单数据</a-button>\n    </template>\n  </BasicTable>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import { BasicTable, useTable } from '/@/components/Table';\n  import { getBasicColumns, getFormConfig } from './tableData';\n  import { Alert } from 'ant-design-vue';\n\n  import { demoListApi } from '/@/api/demo/table';\n\n  export default defineComponent({\n    components: { BasicTable, AAlert: Alert },\n    setup() {\n      const checkedKeys = ref<Array<string | number>>([]);\n      const [registerTable, { getForm }] = useTable({\n        title: '开启搜索区域',\n        api: demoListApi,\n        columns: getBasicColumns(),\n        useSearchForm: true,\n        formConfig: getFormConfig(),\n        showTableSetting: true,\n        tableSetting: { fullScreen: true },\n        showIndexColumn: false,\n        rowKey: 'id',\n      });\n\n      function getFormValues() {\n        console.log(getForm().getFieldsValue());\n      }\n\n      function onSelectChange(selectedRowKeys: (string | number)[]) {\n        console.log(selectedRowKeys);\n        checkedKeys.value = selectedRowKeys;\n      }\n\n      return {\n        registerTable,\n        getFormValues,\n        checkedKeys,\n        onSelectChange,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/MergeHeader.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable, useTable } from '/@/components/Table';\n  import { getMergeHeaderColumns } from './tableData';\n\n  import { demoListApi } from '/@/api/demo/table';\n\n  export default defineComponent({\n    components: { BasicTable },\n    setup() {\n      const [registerTable] = useTable({\n        title: '多级表头示例',\n        api: demoListApi,\n        columns: getMergeHeaderColumns(),\n      });\n\n      return {\n        registerTable,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/MultipleHeader.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable, useTable } from '/@/components/Table';\n  import { getMultipleHeaderColumns } from './tableData';\n\n  import { demoListApi } from '/@/api/demo/table';\n  export default defineComponent({\n    components: { BasicTable },\n    setup() {\n      const [registerTable] = useTable({\n        title: '多级表头示例',\n        api: demoListApi,\n        columns: getMultipleHeaderColumns(),\n      });\n\n      return {\n        registerTable,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/NestedTable.vue",
    "content": "<template>\n  <a-table :columns=\"columns\" :data-source=\"data\" class=\"components-table-demo-nested\">\n    <template #bodyCell=\"{ column }\">\n      <template v-if=\"column.key === 'operation'\">\n        <a>Publish</a>\n      </template>\n    </template>\n    <template #expandedRowRender>\n      <a-table :columns=\"innerColumns\" :data-source=\"innerData\" :pagination=\"false\">\n        <template #bodyCell=\"{ column }\">\n          <template v-if=\"column.dataIndex === 'state'\">\n            <span>\n              <a-badge status=\"success\" />\n              Finished\n            </span>\n          </template>\n          <template v-if=\"column.dataIndex === 'operation'\">\n            <span class=\"table-operation\">\n              <a>Pause</a>\n              <a>Stop</a>\n              <a-dropdown>\n                <template #overlay>\n                  <a-menu>\n                    <a-menu-item>Action 1</a-menu-item>\n                    <a-menu-item>Action 2</a-menu-item>\n                  </a-menu>\n                </template>\n                <a> More </a>\n              </a-dropdown>\n            </span>\n          </template>\n        </template>\n      </a-table>\n    </template>\n  </a-table>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n\n  const columns = [\n    { title: 'Name', dataIndex: 'name', key: 'name' },\n    { title: 'Platform', dataIndex: 'platform', key: 'platform' },\n    { title: 'Version', dataIndex: 'version', key: 'version' },\n    { title: 'Upgraded', dataIndex: 'upgradeNum', key: 'upgradeNum' },\n    { title: 'Creator', dataIndex: 'creator', key: 'creator' },\n    { title: 'Date', dataIndex: 'createdAt', key: 'createdAt' },\n    { title: 'Action', key: 'operation' },\n  ];\n\n  interface DataItem {\n    key: number;\n    name: string;\n    platform: string;\n    version: string;\n    upgradeNum: number;\n    creator: string;\n    createdAt: string;\n  }\n\n  const data: DataItem[] = [];\n  for (let i = 0; i < 3; ++i) {\n    data.push({\n      key: i,\n      name: 'Screem',\n      platform: 'iOS',\n      version: '10.3.4.5654',\n      upgradeNum: 500,\n      creator: 'Jack',\n      createdAt: '2014-12-24 23:12:00',\n    });\n  }\n\n  const innerColumns = [\n    { title: 'Date', dataIndex: 'date', key: 'date' },\n    { title: 'Name', dataIndex: 'name', key: 'name' },\n    { title: 'Status', dataIndex: 'state', key: 'state' },\n    { title: 'Upgrade Status', dataIndex: 'upgradeNum', key: 'upgradeNum' },\n    {\n      title: 'Action',\n      dataIndex: 'operation',\n      key: 'operation',\n    },\n  ];\n\n  interface innerDataItem {\n    key: number;\n    date: string;\n    name: string;\n    upgradeNum: string;\n  }\n\n  const innerData: innerDataItem[] = [];\n  for (let i = 0; i < 3; ++i) {\n    innerData.push({\n      key: i,\n      date: '2014-12-24 23:12:00',\n      name: 'This is production name',\n      upgradeNum: 'Upgraded: 56',\n    });\n  }\n\n  export default defineComponent({\n    components: {},\n    setup() {\n      return {\n        data,\n        columns,\n        innerColumns,\n        innerData,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/RefTable.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <div class=\"mb-4\">\n      <a-button class=\"mr-2\" @click=\"reloadTable\"> 还原 </a-button>\n      <a-button class=\"mr-2\" @click=\"changeLoading\"> 开启loading </a-button>\n      <a-button class=\"mr-2\" @click=\"changeColumns\"> 更改Columns </a-button>\n      <a-button class=\"mr-2\" @click=\"getColumn\"> 获取Columns </a-button>\n      <a-button class=\"mr-2\" @click=\"getTableData\"> 获取表格数据 </a-button>\n      <a-button class=\"mr-2\" @click=\"getTableRawData\"> 获取接口原始数据 </a-button>\n      <a-button class=\"mr-2\" @click=\"setPaginationInfo\"> 跳转到第2页 </a-button>\n    </div>\n    <div class=\"mb-4\">\n      <a-button class=\"mr-2\" @click=\"getSelectRowList\"> 获取选中行 </a-button>\n      <a-button class=\"mr-2\" @click=\"getSelectRowKeyList\"> 获取选中行Key </a-button>\n      <a-button class=\"mr-2\" @click=\"setSelectedRowKeyList\"> 设置选中行 </a-button>\n      <a-button class=\"mr-2\" @click=\"clearSelect\"> 清空选中行 </a-button>\n      <a-button class=\"mr-2\" @click=\"getPagination\"> 获取分页信息 </a-button>\n    </div>\n    <BasicTable\n      :canResize=\"false\"\n      title=\"RefTable示例\"\n      titleHelpMessage=\"使用Ref调用表格内方法\"\n      ref=\"tableRef\"\n      :api=\"api\"\n      :columns=\"columns\"\n      rowKey=\"id\"\n      :rowSelection=\"{ type: 'checkbox' }\"\n    />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, unref } from 'vue';\n  import { BasicTable, TableActionType } from '/@/components/Table';\n  import { getBasicColumns, getBasicShortColumns } from './tableData';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { demoListApi } from '/@/api/demo/table';\n  export default defineComponent({\n    components: { BasicTable },\n    setup() {\n      const tableRef = ref<Nullable<TableActionType>>(null);\n      const { createMessage } = useMessage();\n\n      function getTableAction() {\n        const tableAction = unref(tableRef);\n        if (!tableAction) {\n          throw new Error('tableAction is null');\n        }\n        return tableAction;\n      }\n      function changeLoading() {\n        getTableAction().setLoading(true);\n        setTimeout(() => {\n          getTableAction().setLoading(false);\n        }, 1000);\n      }\n      function changeColumns() {\n        getTableAction().setColumns(getBasicShortColumns());\n      }\n      function reloadTable() {\n        getTableAction().setColumns(getBasicColumns());\n\n        getTableAction().reload({\n          page: 1,\n        });\n      }\n      function getColumn() {\n        createMessage.info('请在控制台查看！');\n        console.log(getTableAction().getColumns());\n      }\n\n      function getTableData() {\n        createMessage.info('请在控制台查看！');\n        console.log(getTableAction().getDataSource());\n      }\n      function getTableRawData() {\n        createMessage.info('请在控制台查看！');\n        console.log(getTableAction().getRawDataSource());\n      }\n\n      function getPagination() {\n        createMessage.info('请在控制台查看！');\n        console.log(getTableAction().getPaginationRef());\n      }\n\n      function setPaginationInfo() {\n        getTableAction().setPagination({\n          current: 2,\n        });\n        getTableAction().reload();\n      }\n      function getSelectRowList() {\n        createMessage.info('请在控制台查看！');\n        console.log(getTableAction().getSelectRows());\n      }\n      function getSelectRowKeyList() {\n        createMessage.info('请在控制台查看！');\n        console.log(getTableAction().getSelectRowKeys());\n      }\n      function setSelectedRowKeyList() {\n        getTableAction().setSelectedRowKeys(['0', '1', '2']);\n      }\n      function clearSelect() {\n        getTableAction().clearSelectedRowKeys();\n      }\n\n      return {\n        tableRef,\n        api: demoListApi,\n        columns: getBasicColumns(),\n        changeLoading,\n        changeColumns,\n        reloadTable,\n        getColumn,\n        getTableData,\n        getTableRawData,\n        getPagination,\n        setPaginationInfo,\n        getSelectRowList,\n        getSelectRowKeyList,\n        setSelectedRowKeyList,\n        clearSelect,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/TreeTable.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"register\">\n      <template #toolbar>\n        <a-button type=\"primary\" @click=\"expandAll\">展开全部</a-button>\n        <a-button type=\"primary\" @click=\"collapseAll\">折叠全部</a-button>\n      </template>\n    </BasicTable>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable, useTable } from '/@/components/Table';\n  import { getBasicColumns, getTreeTableData } from './tableData';\n\n  export default defineComponent({\n    components: { BasicTable },\n    setup() {\n      const [register, { expandAll, collapseAll }] = useTable({\n        title: '树形表格',\n        isTreeTable: true,\n        rowSelection: {\n          type: 'checkbox',\n          getCheckboxProps(record: Recordable) {\n            // Demo: 第一行（id为0）的选择框禁用\n            if (record.id === '0') {\n              return { disabled: true };\n            } else {\n              return { disabled: false };\n            }\n          },\n        },\n        titleHelpMessage: '树形组件不能和序列号列同时存在',\n        columns: getBasicColumns(),\n        dataSource: getTreeTableData(),\n        rowKey: 'id',\n      });\n      return { register, expandAll, collapseAll };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/UseTable.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <div class=\"mb-4\">\n      <a-button class=\"mr-2\" @click=\"reloadTable\"> 还原 </a-button>\n      <a-button class=\"mr-2\" @click=\"changeLoading\"> 开启loading </a-button>\n      <a-button class=\"mr-2\" @click=\"changeColumns\"> 更改Columns </a-button>\n      <a-button class=\"mr-2\" @click=\"getColumn\"> 获取Columns </a-button>\n      <a-button class=\"mr-2\" @click=\"getTableData\"> 获取表格数据 </a-button>\n      <a-button class=\"mr-2\" @click=\"getTableRawData\"> 获取接口原始数据 </a-button>\n      <a-button class=\"mr-2\" @click=\"setPaginationInfo\"> 跳转到第2页 </a-button>\n    </div>\n    <div class=\"mb-4\">\n      <a-button class=\"mr-2\" @click=\"getSelectRowList\"> 获取选中行 </a-button>\n      <a-button class=\"mr-2\" @click=\"getSelectRowKeyList\"> 获取选中行Key </a-button>\n      <a-button class=\"mr-2\" @click=\"setSelectedRowKeyList\"> 设置选中行 </a-button>\n      <a-button class=\"mr-2\" @click=\"clearSelect\"> 清空选中行 </a-button>\n      <a-button class=\"mr-2\" @click=\"getPagination\"> 获取分页信息 </a-button>\n    </div>\n    <BasicTable @register=\"registerTable\" />\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { BasicTable, ColumnChangeParam, useTable } from '/@/components/Table';\n  import { getBasicColumns, getBasicShortColumns } from './tableData';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { demoListApi } from '/@/api/demo/table';\n  export default defineComponent({\n    components: { BasicTable },\n    setup() {\n      const { createMessage } = useMessage();\n      function onChange() {\n        console.log('onChange', arguments);\n      }\n      const [\n        registerTable,\n        {\n          setLoading,\n          setColumns,\n          getColumns,\n          getDataSource,\n          getRawDataSource,\n          reload,\n          getPaginationRef,\n          setPagination,\n          getSelectRows,\n          getSelectRowKeys,\n          setSelectedRowKeys,\n          clearSelectedRowKeys,\n        },\n      ] = useTable({\n        canResize: true,\n        title: 'useTable示例',\n        titleHelpMessage: '使用useTable调用表格内方法',\n        api: demoListApi,\n        columns: getBasicColumns(),\n        defSort: {\n          field: 'name',\n          order: 'ascend',\n        },\n        rowKey: 'id',\n        showTableSetting: true,\n        onChange,\n        rowSelection: {\n          type: 'checkbox',\n        },\n        onColumnsChange: (data: ColumnChangeParam[]) => {\n          console.log('ColumnsChanged', data);\n        },\n      });\n\n      function changeLoading() {\n        setLoading(true);\n        setTimeout(() => {\n          setLoading(false);\n        }, 1000);\n      }\n      function changeColumns() {\n        setColumns(getBasicShortColumns());\n      }\n      function reloadTable() {\n        setColumns(getBasicColumns());\n\n        reload({\n          page: 1,\n        });\n      }\n      function getColumn() {\n        createMessage.info('请在控制台查看！');\n        console.log(getColumns());\n      }\n\n      function getTableData() {\n        createMessage.info('请在控制台查看！');\n        console.log(getDataSource());\n      }\n\n      function getTableRawData() {\n        createMessage.info('请在控制台查看！');\n        console.log(getRawDataSource());\n      }\n\n      function getPagination() {\n        createMessage.info('请在控制台查看！');\n        console.log(getPaginationRef());\n      }\n\n      function setPaginationInfo() {\n        setPagination({\n          current: 2,\n        });\n        reload();\n      }\n      function getSelectRowList() {\n        createMessage.info('请在控制台查看！');\n        console.log(getSelectRows());\n      }\n      function getSelectRowKeyList() {\n        createMessage.info('请在控制台查看！');\n        console.log(getSelectRowKeys());\n      }\n      function setSelectedRowKeyList() {\n        setSelectedRowKeys(['0', '1', '2']);\n      }\n      function clearSelect() {\n        clearSelectedRowKeys();\n      }\n\n      return {\n        registerTable,\n        changeLoading,\n        changeColumns,\n        reloadTable,\n        getColumn,\n        getTableData,\n        getTableRawData,\n        getPagination,\n        setPaginationInfo,\n        getSelectRowList,\n        getSelectRowKeyList,\n        setSelectedRowKeyList,\n        clearSelect,\n        onChange,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/table/tableData.tsx",
    "content": "import { FormProps, FormSchema } from '/@/components/Table';\nimport { BasicColumn } from '/@/components/Table/src/types/table';\n\nexport function getBasicColumns(): BasicColumn[] {\n  return [\n    {\n      title: 'ID',\n      dataIndex: 'id',\n      fixed: 'left',\n      width: 200,\n    },\n    {\n      title: '姓名',\n      dataIndex: 'name',\n      width: 150,\n      filters: [\n        { text: 'Male', value: 'male' },\n        { text: 'Female', value: 'female' },\n      ],\n    },\n    {\n      title: '地址',\n      dataIndex: 'address',\n      width: 300,\n    },\n    {\n      title: '编号',\n      dataIndex: 'no',\n      width: 150,\n      sorter: true,\n      defaultHidden: true,\n    },\n    {\n      title: '开始时间',\n      width: 150,\n      sorter: true,\n      dataIndex: 'beginTime',\n    },\n    {\n      title: '结束时间',\n      width: 150,\n      sorter: true,\n      dataIndex: 'endTime',\n    },\n  ];\n}\n\nexport function getBasicShortColumns(): BasicColumn[] {\n  return [\n    {\n      title: 'ID',\n      width: 150,\n      dataIndex: 'id',\n      sorter: true,\n      sortOrder: 'ascend',\n    },\n    {\n      title: '姓名',\n      dataIndex: 'name',\n      width: 120,\n    },\n    {\n      title: '地址',\n      dataIndex: 'address',\n    },\n    {\n      title: '编号',\n      dataIndex: 'no',\n      width: 80,\n    },\n  ];\n}\n\nexport function getMultipleHeaderColumns(): BasicColumn[] {\n  return [\n    {\n      title: 'ID',\n      dataIndex: 'id',\n      width: 200,\n    },\n    {\n      title: '姓名',\n      dataIndex: 'name',\n      width: 120,\n    },\n    {\n      title: '地址',\n      dataIndex: 'address',\n      sorter: true,\n      children: [\n        {\n          title: '编号',\n          dataIndex: 'no',\n          width: 120,\n          filters: [\n            { text: 'Male', value: 'male', children: [] },\n            { text: 'Female', value: 'female', children: [] },\n          ],\n        },\n\n        {\n          title: '开始时间',\n          dataIndex: 'beginTime',\n          width: 120,\n        },\n        {\n          title: '结束时间',\n          dataIndex: 'endTime',\n          width: 120,\n        },\n      ],\n    },\n  ];\n}\n\nexport function getCustomHeaderColumns(): BasicColumn[] {\n  return [\n    {\n      title: 'ID',\n      dataIndex: 'id',\n      width: 200,\n    },\n    {\n      // title: '姓名',\n      dataIndex: 'name',\n      width: 120,\n      slots: { title: 'customTitle' },\n    },\n    {\n      // title: '地址',\n      dataIndex: 'address',\n      width: 120,\n      slots: { title: 'customAddress' },\n      sorter: true,\n    },\n\n    {\n      title: '编号',\n      dataIndex: 'no',\n      width: 120,\n      filters: [\n        { text: 'Male', value: 'male', children: [] },\n        { text: 'Female', value: 'female', children: [] },\n      ],\n    },\n    {\n      title: '开始时间',\n      dataIndex: 'beginTime',\n      width: 120,\n    },\n    {\n      title: '结束时间',\n      dataIndex: 'endTime',\n      width: 120,\n    },\n  ];\n}\nconst renderContent = (filed) => {\n  return (record, rowIndex) => {\n    const obj: any = {\n      children: record[filed],\n      attrs: {},\n    };\n    if (rowIndex === 9) {\n      obj.attrs.colSpan = 0;\n    }\n    return obj;\n  };\n};\nexport function getMergeHeaderColumns(): BasicColumn[] {\n  return [\n    {\n      title: 'ID',\n      dataIndex: 'id',\n      width: 300,\n      customCell: renderContent('id'),\n    },\n    {\n      title: '姓名',\n      dataIndex: 'name',\n      width: 300,\n      customCell: renderContent('name'),\n    },\n    {\n      title: '地址',\n      dataIndex: 'address',\n      colSpan: 2,\n      width: 120,\n      sorter: true,\n      customCell: (record: any, rowIndex) => {\n        const obj: any = {\n          children: record['address'],\n          attrs: {},\n        };\n        if (rowIndex === 2) {\n          obj.attrs.rowSpan = 2;\n        }\n        if (rowIndex === 3) {\n          obj.attrs.colSpan = 0;\n        }\n        return obj;\n      },\n    },\n    {\n      title: '编号',\n      dataIndex: 'no',\n      colSpan: 0,\n      filters: [\n        { text: 'Male', value: 'male', children: [] },\n        { text: 'Female', value: 'female', children: [] },\n      ],\n      customCell: renderContent('no'),\n    },\n    {\n      title: '开始时间',\n      dataIndex: 'beginTime',\n      width: 200,\n      customCell: renderContent('beginTime'),\n    },\n    {\n      title: '结束时间',\n      dataIndex: 'endTime',\n      width: 200,\n      customCell: renderContent('endTime'),\n    },\n  ];\n}\nexport const getAdvanceSchema = (itemNumber = 6): FormSchema[] => {\n  const arr: any = [];\n  for (let index = 0; index < itemNumber; index++) {\n    arr.push({\n      field: `field${index}`,\n      label: `字段${index}`,\n      component: 'Input',\n      colProps: {\n        xl: 12,\n        xxl: 8,\n      },\n    });\n  }\n  return arr;\n};\nexport function getFormConfig(): Partial<FormProps> {\n  return {\n    labelWidth: 100,\n    schemas: [\n      ...getAdvanceSchema(5),\n      {\n        field: `field11`,\n        label: `Slot示例`,\n        component: 'Select',\n        slot: 'custom',\n        colProps: {\n          xl: 12,\n          xxl: 8,\n        },\n      },\n    ],\n  };\n}\nexport function getBasicData() {\n  const data: any = (() => {\n    const arr: any = [];\n    for (let index = 0; index < 40; index++) {\n      arr.push({\n        id: `${index}`,\n        name: 'John Brown',\n        age: `1${index}`,\n        no: `${index + 10}`,\n        address: 'New York No. 1 Lake ParkNew York No. 1 Lake Park',\n        beginTime: new Date().toLocaleString(),\n        endTime: new Date().toLocaleString(),\n      });\n    }\n    return arr;\n  })();\n  return data;\n}\n\nexport function getTreeTableData() {\n  const data: any = (() => {\n    const arr: any = [];\n    for (let index = 0; index < 40; index++) {\n      arr.push({\n        id: `${index}`,\n        name: 'John Brown',\n        age: `1${index}`,\n        no: `${index + 10}`,\n        address: 'New York No. 1 Lake ParkNew York No. 1 Lake Park',\n        beginTime: new Date().toLocaleString(),\n        endTime: new Date().toLocaleString(),\n        children: [\n          {\n            id: `l2-${index}`,\n            name: 'John Brown',\n            age: `1${index}`,\n            no: `${index + 10}`,\n            address: 'New York No. 1 Lake ParkNew York No. 1 Lake Park',\n            beginTime: new Date().toLocaleString(),\n            endTime: new Date().toLocaleString(),\n          },\n          {\n            id: `l3-${index}`,\n            name: 'John Mary',\n            age: `1${index}`,\n            no: `${index + 10}`,\n            address: 'New York No. 1 Lake ParkNew York No. 1 Lake Park',\n            beginTime: new Date().toLocaleString(),\n            endTime: new Date().toLocaleString(),\n          },\n        ],\n      });\n    }\n    return arr;\n  })();\n\n  return data;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/tree/ActionTree.vue",
    "content": "<template>\n  <PageWrapper title=\"Tree函数操作示例\" contentBackground contentClass=\"p-4\">\n    <div class=\"mb-4\">\n      <a-button @click=\"expandAll(true)\" class=\"mr-2\"> 展开全部 </a-button>\n      <a-button @click=\"expandAll(false)\" class=\"mr-2\"> 折叠全部 </a-button>\n      <a-button @click=\"checkAll(true)\" class=\"mr-2\"> 全选 </a-button>\n      <a-button @click=\"checkAll(false)\" class=\"mr-2\"> 全不选 </a-button>\n      <a-button @click=\"handleLevel(2)\" class=\"mr-2\"> 显示到第2级 </a-button>\n      <a-button @click=\"handleLevel(1)\" class=\"mr-2\"> 显示到第1级 </a-button>\n    </div>\n    <div class=\"mb-4\">\n      <a-button @click=\"handleSetCheckData\" class=\"mr-2\"> 设置勾选数据 </a-button>\n      <a-button @click=\"handleGetCheckData\" class=\"mr-2\"> 获取勾选数据 </a-button>\n      <a-button @click=\"handleSetSelectData\" class=\"mr-2\"> 设置选中数据 </a-button>\n      <a-button @click=\"handleGetSelectData\" class=\"mr-2\"> 获取选中数据 </a-button>\n\n      <a-button @click=\"handleSetExpandData\" class=\"mr-2\"> 设置展开数据 </a-button>\n      <a-button @click=\"handleGetExpandData\" class=\"mr-2\"> 获取展开数据 </a-button>\n    </div>\n    <div class=\"mb-4\">\n      <a-button @click=\"appendNodeByKey(null)\" class=\"mr-2\"> 添加根节点 </a-button>\n      <a-button @click=\"appendNodeByKey('2-2')\" class=\"mr-2\"> 添加在parent3内添加节点 </a-button>\n      <a-button @click=\"deleteNodeByKey('2-2')\" class=\"mr-2\"> 删除parent3节点 </a-button>\n      <a-button @click=\"updateNodeByKey('1-1')\" class=\"mr-2\"> 更新parent2节点 </a-button>\n    </div>\n    <BasicTree :treeData=\"treeData\" title=\"函数操作\" ref=\"treeRef\" :checkable=\"true\" />\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, unref } from 'vue';\n  import { BasicTree, TreeActionType } from '/@/components/Tree/index';\n  import { treeData } from './data';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { BasicTree, PageWrapper },\n    setup() {\n      const treeRef = ref<Nullable<TreeActionType>>(null);\n      const { createMessage } = useMessage();\n\n      function getTree() {\n        const tree = unref(treeRef);\n        if (!tree) {\n          throw new Error('tree is null!');\n        }\n        return tree;\n      }\n\n      function handleLevel(level: number) {\n        getTree().filterByLevel(level);\n      }\n\n      function handleSetCheckData() {\n        getTree().setCheckedKeys(['0-0']);\n      }\n\n      function handleGetCheckData() {\n        const keys = getTree().getCheckedKeys();\n        createMessage.success(JSON.stringify(keys));\n      }\n\n      function handleSetSelectData() {\n        getTree().setSelectedKeys(['0-0']);\n      }\n\n      function handleGetSelectData() {\n        const keys = getTree().getSelectedKeys();\n        createMessage.success(JSON.stringify(keys));\n      }\n\n      function handleSetExpandData() {\n        getTree().setExpandedKeys(['0-0']);\n      }\n\n      function handleGetExpandData() {\n        const keys = getTree().getExpandedKeys();\n        createMessage.success(JSON.stringify(keys));\n      }\n\n      function checkAll(checkAll: boolean) {\n        getTree().checkAll(checkAll);\n      }\n\n      function expandAll(checkAll: boolean) {\n        getTree().expandAll(checkAll);\n      }\n\n      function appendNodeByKey(parentKey: string | null = null) {\n        getTree().insertNodeByKey({\n          parentKey: parentKey,\n          node: {\n            title: '新增节点',\n            key: '2-2-2',\n          },\n          // 往后插入\n          push: 'push',\n          // 往前插入\n          // push:'unshift'\n        });\n      }\n\n      function deleteNodeByKey(key: string) {\n        getTree().deleteNodeByKey(key);\n      }\n\n      function updateNodeByKey(key: string) {\n        getTree().updateNodeByKey(key, {\n          title: 'parent2-new',\n        });\n      }\n\n      return {\n        treeData,\n        treeRef,\n        handleLevel,\n        handleSetCheckData,\n        handleGetCheckData,\n        handleSetSelectData,\n        handleGetSelectData,\n        handleSetExpandData,\n        handleGetExpandData,\n        appendNodeByKey,\n        deleteNodeByKey,\n        updateNodeByKey,\n        checkAll,\n        expandAll,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/tree/EditTree.vue",
    "content": "<template>\n  <PageWrapper title=\"Tree函数操作示例\">\n    <div class=\"flex\">\n      <BasicTree\n        class=\"w-1/3\"\n        title=\"右侧操作按钮/自定义图标\"\n        helpMessage=\"帮助信息\"\n        :treeData=\"treeData\"\n        :actionList=\"actionList\"\n        :renderIcon=\"createIcon\"\n      />\n      <BasicTree class=\"w-1/3 mx-4\" title=\"右键菜单\" :treeData=\"treeData\" :beforeRightClick=\"getRightMenuList\" />\n      <BasicTree class=\"w-1/3\" title=\"工具栏使用\" toolbar checkable search :treeData=\"treeData\" :beforeRightClick=\"getRightMenuList\" />\n    </div>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, h } from 'vue';\n  import { BasicTree, ActionItem, ContextMenuItem } from '/@/components/Tree/index';\n  import { treeData } from './data';\n  import { PlusOutlined, DeleteOutlined } from '@ant-design/icons-vue';\n  import { PageWrapper } from '/@/components/Page';\n\n  export default defineComponent({\n    components: { BasicTree, PageWrapper },\n    setup() {\n      function handlePlus(node: any) {\n        console.log(node);\n      }\n\n      function getRightMenuList(node: any): ContextMenuItem[] {\n        return [\n          {\n            label: '新增',\n            handler: () => {\n              console.log('点击了新增', node);\n            },\n            icon: 'bi:plus',\n          },\n          {\n            label: '删除',\n            handler: () => {\n              console.log('点击了删除', node);\n            },\n            icon: 'bx:bxs-folder-open',\n          },\n        ];\n      }\n      const actionList: ActionItem[] = [\n        {\n          // show:()=>boolean;\n          render: (node) => {\n            return h(PlusOutlined, {\n              class: 'ml-2',\n              onClick: () => {\n                handlePlus(node);\n              },\n            });\n          },\n        },\n        {\n          render: () => {\n            return h(DeleteOutlined);\n          },\n        },\n      ];\n\n      function createIcon({ level }) {\n        if (level === 1) {\n          return 'ion:git-compare-outline';\n        }\n        if (level === 2) {\n          return 'ion:home';\n        }\n        if (level === 3) {\n          return 'ion:airplane';\n        }\n        return '';\n      }\n      return { treeData, actionList, getRightMenuList, createIcon };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/tree/data.ts",
    "content": "import { TreeItem } from '/@/components/Tree/index';\n\nexport const treeData: TreeItem[] = [\n  {\n    title: 'parent ',\n    key: '0-0',\n    children: [\n      { title: 'leaf', key: '0-0-0' },\n      {\n        title: 'leaf',\n        key: '0-0-1',\n        children: [\n          { title: 'leaf', key: '0-0-0-0', children: [{ title: 'leaf', key: '0-0-0-0-1' }] },\n          { title: 'leaf', key: '0-0-0-1' },\n        ],\n      },\n    ],\n  },\n  {\n    title: 'parent 2',\n    key: '1-1',\n    children: [\n      { title: 'leaf', key: '1-1-0' },\n      { title: 'leaf', key: '1-1-1' },\n    ],\n  },\n  {\n    title: 'parent 3',\n    key: '2-2',\n    children: [\n      { title: 'leaf', key: '2-2-0' },\n      { title: 'leaf', key: '2-2-1' },\n    ],\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/tree/index.vue",
    "content": "<template>\n  <PageWrapper title=\"Tree基础示例\">\n    <Row :gutter=\"[16, 16]\">\n      <Col :span=\"8\">\n        <BasicTree title=\"基础示例，默认展开第一层\" :treeData=\"treeData\" defaultExpandLevel=\"1\" />\n      </Col>\n      <Col :span=\"8\">\n        <BasicTree title=\"可勾选，默认全部展开\" :treeData=\"treeData\" :checkable=\"true\" defaultExpandAll @check=\"handleCheck\" />\n      </Col>\n      <Col :span=\"8\">\n        <BasicTree title=\"指定默认展开/勾选示例\" :treeData=\"treeData\" :checkable=\"true\" :expandedKeys=\"['0-0']\" :checkedKeys=\"['0-0']\" />\n      </Col>\n      <Col :span=\"8\">\n        <BasicTree title=\"懒加载异步树\" ref=\"asyncTreeRef\" :treeData=\"tree\" :load-data=\"onLoadData\" />\n      </Col>\n      <Col :span=\"8\">\n        <Card title=\"异步数据，默认展开\">\n          <template #extra>\n            <a-button @click=\"loadTreeData\" :loading=\"treeLoading\">加载数据</a-button>\n          </template>\n          <Spin :spinning=\"treeLoading\">\n            <BasicTree ref=\"asyncExpandTreeRef\" :treeData=\"tree2\" />\n          </Spin>\n        </Card>\n      </Col>\n      <Col :span=\"8\">\n        <Card title=\"BasicTree内置加载\">\n          <template #extra>\n            <a-button @click=\"loadTreeData2\" :loading=\"treeLoading\">请求数据</a-button>\n          </template>\n          <BasicTree ref=\"loadTreeRef\" :treeData=\"tree2\" :loading=\"treeLoading\" />\n        </Card>\n      </Col>\n    </Row>\n  </PageWrapper>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, nextTick, ref, unref } from 'vue';\n  import { BasicTree, TreeActionType, TreeItem } from '/@/components/Tree/index';\n  import { treeData } from './data';\n  import { PageWrapper } from '/@/components/Page';\n  import { Card, Row, Col, Spin } from 'ant-design-vue';\n  import { cloneDeep, uniq } from 'lodash-es';\n  import { isArray } from '/@/utils/is';\n\n  export default defineComponent({\n    name: 'system-testtree',\n    components: { BasicTree, PageWrapper, Card, Row, Col, Spin },\n    setup() {\n      const asyncTreeRef = ref<Nullable<TreeActionType>>(null);\n      const asyncExpandTreeRef = ref<Nullable<TreeActionType>>(null);\n      const loadTreeRef = ref<Nullable<TreeActionType>>(null);\n      const tree2 = ref<TreeItem[]>([]);\n      const treeLoading = ref(false);\n\n      function handleCheck(checkedKeys, e) {\n        console.log('onChecked', checkedKeys, e);\n      }\n\n      function loadTreeData() {\n        treeLoading.value = true;\n        // 以下是模拟异步获取数据\n        setTimeout(() => {\n          // 设置数据源\n          tree2.value = cloneDeep(treeData);\n          treeLoading.value = false;\n          // 展开全部\n          nextTick(() => {\n            console.log(unref(asyncExpandTreeRef));\n            unref(asyncExpandTreeRef)?.expandAll(true);\n          });\n        }, 2000);\n      }\n      function loadTreeData2() {\n        treeLoading.value = true;\n        // 以下是模拟异步获取数据\n        setTimeout(() => {\n          // 设置数据源\n          tree2.value = cloneDeep(treeData);\n          treeLoading.value = false;\n        }, 2000);\n      }\n\n      const tree = ref([\n        {\n          title: 'parent ',\n          key: '0-0',\n        },\n      ]);\n\n      function onLoadData(treeNode) {\n        return new Promise((resolve: (value?: unknown) => void) => {\n          if (isArray(treeNode.children) && treeNode.children.length > 0) {\n            resolve();\n            return;\n          }\n          setTimeout(() => {\n            const asyncTreeAction: TreeActionType | null = unref(asyncTreeRef);\n            if (asyncTreeAction) {\n              const nodeChildren = [\n                { title: `Child Node ${treeNode.eventKey}-0`, key: `${treeNode.eventKey}-0` },\n                { title: `Child Node ${treeNode.eventKey}-1`, key: `${treeNode.eventKey}-1` },\n              ];\n              asyncTreeAction.updateNodeByKey(treeNode.eventKey, { children: nodeChildren });\n              asyncTreeAction.setExpandedKeys(uniq([treeNode.eventKey, ...asyncTreeAction.getExpandedKeys()]));\n            }\n\n            resolve();\n            return;\n          }, 300);\n        });\n      }\n      return {\n        treeData,\n        handleCheck,\n        tree,\n        onLoadData,\n        asyncTreeRef,\n        asyncExpandTreeRef,\n        loadTreeRef,\n        tree2,\n        loadTreeData,\n        treeLoading,\n        loadTreeData2,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/vextable/OneToOneModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"getTitle\" @ok=\"handleSubmit\" width=\"70%\">\n    <a-form ref=\"formRef\" :model=\"orderMainModel\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\" :rules=\"validatorRules\">\n      <a-row class=\"form-row\" :gutter=\"16\">\n        <a-col :lg=\"8\">\n          <a-form-item label=\"订单号\" name=\"orderCode\">\n            <a-input v-model:value=\"orderMainModel.orderCode\" placeholder=\"请输入订单号\" />\n          </a-form-item>\n        </a-col>\n        <a-col :lg=\"8\">\n          <a-form-item label=\"订单类型\">\n            <a-select placeholder=\"请选择订单类型\" v-model:value=\"orderMainModel.ctype\">\n              <a-select-option value=\"1\">国内订单</a-select-option>\n              <a-select-option value=\"2\">国际订单</a-select-option>\n            </a-select>\n          </a-form-item>\n        </a-col>\n        <a-col :lg=\"8\">\n          <a-form-item label=\"订单日期\">\n            <a-date-picker showTime valueFormat=\"YYYY-MM-DD HH:mm:ss\" v-model:value=\"orderMainModel.orderDate\" />\n          </a-form-item>\n        </a-col>\n      </a-row>\n      <a-row class=\"form-row\" :gutter=\"16\">\n        <a-col :lg=\"8\">\n          <a-form-item label=\"订单金额\">\n            <a-input v-model:value=\"orderMainModel.orderMoney\" placeholder=\"请输入订单金额\" />\n          </a-form-item>\n        </a-col>\n        <a-col :lg=\"8\">\n          <a-form-item label=\"订单备注\">\n            <a-input v-model:value=\"orderMainModel.content\" placeholder=\"请输入订单备注\" />\n          </a-form-item>\n        </a-col>\n      </a-row>\n      <a-tabs defaultActiveKey=\"1\">\n        <a-tab-pane tab=\"客户信息\" key=\"1\">\n          <a-row class=\"form-row\" :gutter=\"16\">\n            <a-col :lg=\"8\">\n              <a-form-item label=\"客户姓名\">\n                <a-input v-model:value=\"orderMainModel.jeecgOrderCustomerList.name\" placeholder=\"请输入客户姓名\" />\n              </a-form-item>\n            </a-col>\n            <a-col :lg=\"8\">\n              <a-form-item label=\"手机号\">\n                <a-input v-model:value=\"orderMainModel.jeecgOrderCustomerList.telphone\" placeholder=\"请输入手机号\" />\n              </a-form-item>\n            </a-col>\n          </a-row>\n        </a-tab-pane>\n\n        <a-tab-pane tab=\"机票信息\" key=\"2\" forceRender>\n          <a-row class=\"form-row\" :gutter=\"16\">\n            <a-col :lg=\"8\">\n              <a-form-item label=\"航班号\">\n                <a-input v-model:value=\"orderMainModel.jeecgOrderTicketList.ticketCode\" placeholder=\"请输入航班号\" />\n              </a-form-item>\n            </a-col>\n            <a-col :lg=\"8\">\n              <a-form-item label=\"起飞时间\">\n                <a-date-picker showTime valueFormat=\"YYYY-MM-DD HH:mm:ss\" v-model:value=\"orderMainModel.jeecgOrderTicketList.tickectDate\" />\n              </a-form-item>\n            </a-col>\n          </a-row>\n        </a-tab-pane>\n      </a-tabs>\n    </a-form>\n  </BasicModal>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, reactive, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { ValidateErrorEntity } from 'ant-design-vue/es/form/interface';\n  import { saveOrUpdate } from './jvxetable/jvxetable.api';\n  import { orderCustomerList, orderTicketList } from './api';\n\n  export default defineComponent({\n    name: 'OneToOneModal',\n    components: { BasicModal },\n    emits: ['success', 'register'],\n    setup(props, { emit }) {\n      const isUpdate = ref(true);\n      const rowId = ref('');\n      const formRef = ref();\n      const labelCol = reactive({\n        xs: { span: 24 },\n        sm: { span: 5 },\n      });\n      const wrapperCol = reactive({\n        xs: { span: 24 },\n        sm: { span: 16 },\n      });\n      const validatorRules = {\n        orderCode: [{ required: true, message: '订单号不能为空', trigger: 'blur' }],\n      };\n      const orderMainModel = reactive({\n        id: null,\n        orderCode: '',\n        orderMoney: '',\n        ctype: '',\n        content: '',\n        jeecgOrderCustomerList: {\n          name: '',\n          telphone: '',\n        },\n        jeecgOrderTicketList: {\n          ticketCode: '',\n          tickectDate: '',\n        },\n      });\n      const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n        setModalProps({ confirmLoading: false });\n        reset();\n        isUpdate.value = !!data?.isUpdate;\n        if (unref(isUpdate)) {\n          rowId.value = data.record.id;\n          Object.assign(orderMainModel, data.record);\n          let params = { id: orderMainModel.id };\n          const customerList = await orderCustomerList(params);\n          // 代码逻辑说明: [VUEN-1484]在一对多示例页面，编辑一行（青岛订单A0001），客户信息无法填入------------\n          orderMainModel.jeecgOrderCustomerList = customerList[0]?customerList[0]:{};\n          const ticketList = await orderTicketList(params);\n          orderMainModel.jeecgOrderTicketList = ticketList[0]?ticketList[0]:{};\n        }\n      });\n      const getTitle = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));\n\n      function reset() {\n        orderMainModel.id = null;\n        orderMainModel.orderCode = '';\n        orderMainModel.orderMoney = '';\n        orderMainModel.orderDate = null;\n        orderMainModel.ctype = '';\n        orderMainModel.content = '';\n        orderMainModel.jeecgOrderCustomerList = {};\n        orderMainModel.jeecgOrderTicketList = {};\n      }\n      async function handleSubmit() {\n        formRef.value\n          .validate()\n          .then(async () => {\n            try {\n              console.log('formData', JSON.stringify(orderMainModel));\n              setModalProps({ confirmLoading: true });\n              orderMainModel.jeecgOrderCustomerList =\n                Object.keys(orderMainModel.jeecgOrderCustomerList).length > 0 ? [orderMainModel.jeecgOrderCustomerList] : [];\n              orderMainModel.jeecgOrderTicketList =\n                Object.keys(orderMainModel.jeecgOrderTicketList).length > 0 ? [orderMainModel.jeecgOrderTicketList] : [];\n              await saveOrUpdate(orderMainModel, unref(isUpdate));\n              closeModal();\n              emit('success');\n            } finally {\n              setModalProps({ confirmLoading: false });\n            }\n          })\n          .catch((error: ValidateErrorEntity<any>) => {\n            console.log('error', error);\n          });\n      }\n\n      return { formRef, validatorRules, orderMainModel, registerModal, getTitle, labelCol, wrapperCol, handleSubmit };\n    },\n  });\n</script>\n<style scoped>\n  .ant-btn {\n    padding: 0 10px;\n    margin-left: 3px;\n  }\n\n  .ant-form-item-control {\n    line-height: 0px;\n  }\n\n  /** 主表单行间距 */\n  .ant-form .ant-form-item {\n    margin-bottom: 10px;\n  }\n\n  /** Tab页面行间距 */\n  .ant-tabs-content .ant-form-item {\n    margin-bottom: 0px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/vextable/VexTableModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"getTitle\" @ok=\"handleSubmit\" width=\"70%\">\n    <a-form ref=\"formRef\" :model=\"orderMainModel\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\" :rules=\"validatorRules\">\n      <a-row class=\"form-row\" :gutter=\"16\">\n        <a-col :lg=\"8\">\n          <a-form-item label=\"订单号\" name=\"orderCode\">\n            <a-input v-model:value=\"orderMainModel.orderCode\" placeholder=\"请输入订单号\" />\n          </a-form-item>\n        </a-col>\n        <a-col :lg=\"8\">\n          <a-form-item label=\"订单类型\">\n            <a-select placeholder=\"请选择订单类型\" v-model:value=\"orderMainModel.ctype\">\n              <a-select-option value=\"1\">国内订单</a-select-option>\n              <a-select-option value=\"2\">国际订单</a-select-option>\n            </a-select>\n          </a-form-item>\n        </a-col>\n        <a-col :lg=\"8\">\n          <a-form-item label=\"订单日期\">\n            <a-date-picker showTime valueFormat=\"YYYY-MM-DD HH:mm:ss\" v-model:value=\"orderMainModel.orderDate\" />\n          </a-form-item>\n        </a-col>\n      </a-row>\n      <a-row class=\"form-row\" :gutter=\"16\">\n        <a-col :lg=\"8\">\n          <a-form-item label=\"订单金额\">\n            <a-input v-model:value=\"orderMainModel.orderMoney\" placeholder=\"请输入订单金额\" />\n          </a-form-item>\n        </a-col>\n        <a-col :lg=\"8\">\n          <a-form-item label=\"订单备注\">\n            <a-input v-model:value=\"orderMainModel.content\" placeholder=\"请输入订单备注\" />\n          </a-form-item>\n        </a-col>\n      </a-row>\n      <a-tabs defaultActiveKey=\"1\">\n        <a-tab-pane tab=\"客户信息\" key=\"1\">\n          <vxe-toolbar>\n            <template #buttons>\n              <vxe-button icon=\"fa fa-plus\" @click=\"insertEvent()\">新增</vxe-button>\n              <vxe-button @click=\"$refs.xTable.removeCheckboxRow()\">删除选中</vxe-button>\n            </template>\n          </vxe-toolbar>\n\n          <vxe-table\n            border\n            show-overflow\n            keep-source\n            ref=\"xTable\"\n            max-height=\"400\"\n            :data=\"orderMainModel.jeecgOrderCustomerList\"\n            :edit-config=\"{ trigger: 'click', mode: 'row', icon: 'fa fa-pencil', showStatus: true }\"\n          >\n            <vxe-column type=\"checkbox\" width=\"60\" align=\"center\"></vxe-column>\n            <vxe-column type=\"seq\" width=\"60\" align=\"center\"></vxe-column>\n            <vxe-column field=\"name\" title=\"客户名\" sortable :edit-render=\"{ name: 'input', defaultValue: '' }\"></vxe-column>\n            <vxe-column field=\"sex\" title=\"性别\" :edit-render=\"{ name: '$select', options: sexList }\"></vxe-column>\n            <vxe-column field=\"idcard\" title=\"身份证\" sortable :edit-render=\"{ name: 'input', defaultValue: '' }\"></vxe-column>\n            <vxe-column field=\"telphone\" title=\"手机\" sortable :edit-render=\"{ name: 'input', defaultValue: '' }\"></vxe-column>\n          </vxe-table>\n        </a-tab-pane>\n\n        <a-tab-pane tab=\"机票信息\" key=\"2\" forceRender> </a-tab-pane>\n      </a-tabs>\n    </a-form>\n  </BasicModal>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, reactive, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { ValidateErrorEntity } from 'ant-design-vue/es/form/interface';\n  import { VxeTableInstance } from 'vxe-table';\n  export default defineComponent({\n    name: 'VexTableModal',\n    components: { BasicModal },\n    emits: ['success', 'register'],\n    setup(props, { emit }) {\n      const isUpdate = ref(true);\n      const xTable = ref({} as VxeTableInstance);\n      const rowId = ref('');\n      const formRef = ref();\n      const labelCol = reactive({\n        xs: { span: 24 },\n        sm: { span: 5 },\n      });\n      const wrapperCol = reactive({\n        xs: { span: 24 },\n        sm: { span: 16 },\n      });\n      const sexList = ref([\n        { label: '', value: '' },\n        { label: '男', value: '1' },\n        { label: '女', value: '2' },\n      ]);\n      const validatorRules = {\n        orderCode: [{ required: true, message: '订单号不能为空', trigger: 'blur' }],\n      };\n      const orderMainModel = reactive({\n        id: null,\n        orderCode: '',\n        orderMoney: '',\n        ctype: '',\n        content: '',\n        jeecgOrderCustomerList: [],\n        jeecgOrderTicketList: [],\n      });\n      const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n        orderMainModel.orderCode = '';\n        setModalProps({ confirmLoading: false });\n        isUpdate.value = !!data?.isUpdate;\n\n        if (unref(isUpdate)) {\n          rowId.value = data.record.id;\n          orderMainModel.orderCode = data.record.orderCode;\n        }\n      });\n      const tableData = ref([]);\n      const getTitle = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));\n\n      //动态添加行\n      async function insertEvent(row: any) {\n        const $table = xTable.value;\n        const record = {\n          name: '',\n          sex: '1',\n          idcard: '',\n          telphone: '',\n        };\n        const { row: newRow } = await $table.insertAt(record, row);\n        await $table.setActiveCell(newRow, 'sex');\n      }\n\n      async function handleSubmit() {\n        formRef.value\n          .validate()\n          .then(() => {\n            try {\n              const $table = xTable.value;\n              const { fullData } = $table.getTableData();\n              orderMainModel.jeecgOrderCustomerList = fullData;\n              console.log('formData', JSON.stringify(orderMainModel));\n              setModalProps({ confirmLoading: true });\n              closeModal();\n              emit('success', { isUpdate: unref(isUpdate), values: { id: rowId.value } });\n            } finally {\n              setModalProps({ confirmLoading: false });\n            }\n          })\n          .catch((error: ValidateErrorEntity<any>) => {\n            console.log('error', error);\n          });\n      }\n\n      return {\n        xTable,\n        tableData,\n        sexList,\n        formRef,\n        validatorRules,\n        orderMainModel,\n        registerModal,\n        getTitle,\n        labelCol,\n        wrapperCol,\n        insertEvent,\n        handleSubmit,\n      };\n    },\n  });\n</script>\n<style scoped>\n  .ant-btn {\n    padding: 0 10px;\n    margin-left: 3px;\n  }\n\n  .ant-form-item-control {\n    line-height: 0px;\n  }\n\n  /** 主表单行间距 */\n  .ant-form .ant-form-item {\n    margin-bottom: 10px;\n  }\n\n  /** Tab页面行间距 */\n  .ant-tabs-content .ant-form-item {\n    margin-bottom: 0px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/vextable/api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\n\nenum Api {\n  list = '/test/jeecgOrderMain/list',\n  delete = '/test/jeecgOrderMain/delete',\n  orderCustomerList = '/test/jeecgOrderMain/queryOrderCustomerListByMainId',\n  orderTicketList = '/test/jeecgOrderMain/queryOrderTicketListByMainId',\n}\n\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) => defHttp.get({ url: Api.list, params });\n/**\n * 子表单信息\n * @param params\n */\nexport const orderTicketList = (params) => defHttp.get({ url: Api.orderTicketList, params });\n/**\n * 子表单信息\n * @param params\n */\nexport const orderCustomerList = (params) => defHttp.get({ url: Api.orderCustomerList, params });\n/**\n * 删除用户\n */\nexport const deleteOne = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.delete, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/vextable/data.ts",
    "content": "import { BasicColumn, FormSchema } from '/@/components/Table';\nimport { usePermission } from '/@/hooks/web/usePermission';\nimport { JVxeColumn, JVxeTypes } from '/@/components/jeecg/JVxeTable/types';\nconst { isDisabledAuth, hasPermission, initBpmFormData} = usePermission();\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '订单号',\n    dataIndex: 'orderCode',\n    width: 260,\n  },\n  {\n    title: '订单类型',\n    dataIndex: 'ctype',\n    slots: { customRender: 'ctype' },\n  },\n  {\n    title: '订单日期',\n    dataIndex: 'orderDate',\n    width: 300,\n  },\n  {\n    title: '订单金额',\n    width: 200,\n    dataIndex: 'orderMoney',\n  },\n  {\n    title: '订单备注',\n    width: 200,\n    dataIndex: 'content',\n  },\n  {\n    title: '流程状态',\n    width: 200,\n    dataIndex: 'bpmStatus',\n    customRender: ({ text }) => {\n      if (!text || text == '1') {\n        return '待提交';\n      } else if (text == '2') {\n        return '处理中';\n      } else if (text == '2') {\n        return '已完成';\n      } else {\n        return text;\n      }\n    },\n  },\n];\n\nexport function getBpmFormSchema(formData) {\n  //注入流程节点表单权限\n  initBpmFormData(formData);\n  \n  const formSchema2: FormSchema[] = [\n    {\n      label: '订单号',\n      field: 'orderCode',\n      component: 'Input',\n      show: ({ values }) => {\n        return hasPermission('order:orderCode');\n      },\n    },\n    {\n      label: '订单类型',\n      field: 'ctype',\n      component: 'Select',\n      componentProps: {\n        options: [\n          { label: '国内订单', value: '1', key: '1' },\n          { label: '国际订单', value: '2', key: '2' },\n        ],\n      },\n    },\n    {\n      label: '订单日期',\n      field: 'orderDate',\n      component: 'DatePicker',\n      componentProps: {\n        valueFormat: 'YYYY-MM-DD HH:mm:ss',\n        style: {\n          width: '100%',\n        },\n      },\n    },\n    {\n      label: '订单金额',\n      field: 'orderMoney',\n      component: 'Input',\n    },\n    {\n      label: '订单备注',\n      field: 'content',\n      component: 'Input',\n    },\n  ];\n  return formSchema2;\n}\n\nexport function getOrderCustomerFormSchema(formData) {\n  //注入流程节点表单权限\n  initBpmFormData(formData);\n  \n  const formSchema2: FormSchema[] = [\n    {\n      label: '客户名',\n      field: 'name',\n      component: 'Input',\n      dynamicDisabled: ({ values }) => {\n        return isDisabledAuth('order:name');\n      },\n    },\n    {\n      label: '性别',\n      field: 'sex',\n      component: 'Select',\n      componentProps: {\n        options: [\n          { label: '男', value: '1', key: '1' },\n          { label: '女', value: '2', key: '2' },\n        ],\n      },\n    },\n    {\n      label: '身份证号',\n      field: 'idcard',\n      component: 'Input',\n    },\n    {\n      label: '手机号',\n      field: 'telphone',\n      component: 'Input',\n    },\n  ];\n  return formSchema2;\n}\n\nexport const jeecgOrderTicketColumns: JVxeColumn[] = [\n  {\n    title: '航班号',\n    key: 'ticketCode',\n    width: 180,\n    type: JVxeTypes.input,\n    placeholder: '请输入${title}',\n    defaultValue: '',\n  },\n  {\n    title: '航班时间',\n    key: 'tickectDate',\n    width: 180,\n    type: JVxeTypes.date,\n    placeholder: '请选择${title}',\n    defaultValue: '',\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/vextable/drawer.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"$attrs\" @register=\"registerDrawer\" showFooter :title=\"getTitle\" width=\"500px\" @ok=\"handleSubmit\"> </BasicDrawer>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, computed, unref } from 'vue';\n  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';\n\n  export default defineComponent({\n    name: 'tableDrawer',\n    components: { BasicDrawer },\n    emits: ['success', 'register'],\n    setup(_, { emit }) {\n      const isUpdate = ref(true);\n      const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {\n        setDrawerProps({ confirmLoading: false });\n        isUpdate.value = !!data?.isUpdate;\n      });\n\n      const getTitle = computed(() => (!unref(isUpdate) ? '新增角色' : '编辑角色'));\n\n      async function handleSubmit() {\n        try {\n          setDrawerProps({ confirmLoading: true });\n          closeDrawer();\n          emit('success');\n        } finally {\n          setDrawerProps({ confirmLoading: false });\n        }\n      }\n\n      return {\n        registerDrawer,\n        getTitle,\n        handleSubmit,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/vextable/form/JeecgOrderCustomerForm.vue",
    "content": "<template>\n  <BasicForm @register=\"registerForm\"></BasicForm>\n</template>\n\n<script>\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { computed, defineComponent, toRaw } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { propTypes } from '/@/utils/propTypes';\n  import { getOrderCustomerFormSchema } from '../data';\n\n  export default defineComponent({\n    name: 'JeecgOrderCustomerForm',\n    components: {\n      BasicForm,\n    },\n    props: {\n      formData: propTypes.object.def({}),\n    },\n    setup(props) {\n      const [registerForm, { setFieldsValue, setProps, getFieldsValue, updateSchema }] = useForm({\n        labelWidth: 150,\n        schemas: getOrderCustomerFormSchema(props.formData),\n        showActionButtonGroup: false,\n        baseColProps: { span: 8 },\n      });\n\n      const formDisabled = computed(() => {\n        if (props.formData.disabled === false) {\n          return false;\n        }\n        return true;\n      });\n\n      let orderCustomerFormData = {};\n      const queryByIdUrl = '/test/jeecgOrderMain/queryOrderCustomerListByMainId';\n      async function initFormData(mainId) {\n        let params = { id: mainId };\n        const data = await defHttp.get({ url: queryByIdUrl, params });\n        console.log('data', data);\n        if (data && data.length > 0) {\n          let temp = data[0];\n          orderCustomerFormData = { ...temp };\n          //设置表单的值\n          await setFieldsValue(orderCustomerFormData);\n          await setProps({ disabled: formDisabled.value });\n        }\n      }\n      async function getFormData() {\n        let subFormData = { ...orderCustomerFormData };\n        if (Object.keys(subFormData).length > 0) {\n          return subFormData;\n        }\n        return false;\n      }\n\n      return {\n        registerForm,\n        formDisabled,\n        initFormData,\n        getFormData,\n      };\n    },\n  });\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/vextable/form/JeecgOrderMainForm.vue",
    "content": "<template>\n  <div class=\"jeecg-flow-demo\">\n    <BasicForm @register=\"registerForm\"></BasicForm>\n    <a-tabs v-model:activeKey=\"activeKey\" @change=\"handleChangeTabs\">\n      <a-tab-pane tab=\"客户信息\" key=\"jeecgOrderCustomerForm\" :forceRender=\"true\">\n        <JeecgOrderCustomerForm ref=\"jeecgOrderCustomerFormRef\" :formData=\"formData\"></JeecgOrderCustomerForm>\n      </a-tab-pane>\n\n      <a-tab-pane tab=\"机票信息\" key=\"jeecgOrderTicket\" :forceRender=\"true\">\n        <JVxeTable v-if=\"ok\" ref=\"jeecgOrderTicketRef\" stripe rowSelection keepSource :maxHeight=\"300\" :loading=\"table2.loading\" :columns=\"table2.columns\" :dataSource=\"table2.dataSource\"> </JVxeTable>\n      </a-tab-pane>\n    </a-tabs>\n  </div>\n</template>\n\n<script>\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { computed, defineComponent, ref, reactive } from 'vue';\n  import { defHttp } from '/@/utils/http/axios';\n  import { propTypes } from '/@/utils/propTypes';\n  import { getBpmFormSchema, jeecgOrderTicketColumns } from '../data';\n  import JeecgOrderCustomerForm from './JeecgOrderCustomerForm.vue';\n\n  export default defineComponent({\n    name: 'JeecgOrderMainForm',\n    components: {\n      BasicForm,\n      JeecgOrderCustomerForm,\n    },\n    props: {\n      formData: propTypes.object.def({}),\n      formBpm: propTypes.bool.def(true),\n    },\n    setup(props) {\n      const [registerForm, { setFieldsValue, setProps, getFieldsValue, updateSchema }] = useForm({\n        labelWidth: 150,\n        schemas: getBpmFormSchema(props.formData),\n        showActionButtonGroup: false,\n        baseColProps: { span: 8 },\n      });\n\n      const formDisabled = computed(() => {\n        if (props.formData.disabled === false) {\n          return false;\n        }\n        return true;\n      });\n\n      const jeecgOrderCustomerFormRef = ref();\n      const jeecgOrderTicketRef = ref();\n      const ok = ref(false);\n\n      let formData = {};\n      const queryByIdUrl = '/test/jeecgOrderMain/queryById';\n      async function initFormData() {\n        console.log('props.formData', props.formData);\n        let params = { id: props.formData.dataId };\n        const data = await defHttp.get({ url: queryByIdUrl, params });\n        console.log('data', data);\n        formData = { ...data };\n        //设置表单的值\n        await setFieldsValue(formData);\n        await setProps({ disabled: formDisabled.value });\n\n        await jeecgOrderCustomerFormRef.value.initFormData(props.formData.dataId);\n        await loadOrderTicketData(props.formData.dataId);\n        ok.value = true;\n      }\n\n      async function submitForm() {\n        let data = getFieldsValue();\n        let params = Object.assign({}, formData, data);\n        console.log('表单数据', params);\n        await saveOrUpdate(params, true);\n      }\n\n      initFormData();\n\n      const activeKey = ref('jeecgOrderCustomerForm');\n      function handleChangeTabs() {}\n      // 机票信息\n      const table2 = reactive({\n        loading: false,\n        dataSource: [],\n        columns: filterSubTableColnmns(jeecgOrderTicketColumns, 'order:'),\n      });\n\n      async function loadOrderTicketData(mainId) {\n        const queryByIdUrl = '/test/jeecgOrderMain/queryOrderTicketListByMainId';\n        let params = { id: mainId };\n        table2.dataSource = [];\n        const data = await defHttp.get({ url: queryByIdUrl, params });\n        if (data && data.length > 0) {\n          table2.dataSource = [...data];\n        }\n      }\n\n      //新增权限处理方法\n      function filterSubTableColnmns(columns, pre) {\n        let authList = props.formData.permissionList;\n        //注意：如果子表配置显示反向 这里不处理其逻辑  即隐藏无法在流程表单中实现，请使用全局表单权限实现\n        let temp = columns.filter((item) => {\n          let oneAuth = authList.find((auth) => {\n            return auth.action === pre + item.key;\n          });\n          if (!oneAuth) {\n            return true;\n          }\n\n          //代码严谨处理，防止一个授权标识，配置多次\n          if (oneAuth instanceof Array) {\n            oneAuth = oneAuth[0];\n          }\n\n          //禁用逻辑\n          if (oneAuth.type == '2' && !oneAuth.isAuth) {\n            item['disabled'] = true;\n            return true;\n          }\n          //隐藏逻辑逻辑\n          if (oneAuth.type == '1' && !oneAuth.isAuth) {\n            return false;\n          }\n          return true;\n        });\n        return temp;\n      }\n\n      return {\n        registerForm,\n        formDisabled,\n        submitForm,\n        jeecgOrderCustomerFormRef,\n        activeKey,\n        handleChangeTabs,\n        table2,\n        jeecgOrderTicketRef,\n        ok,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\">\n  /*.jeecg-flow-demo{\n    .vxe-header--row{\n        .vxe-header--column .vxe-cell{\n            width: 180px !important;\n        }\n        .vxe-header--column:first-child .vxe-cell{\n            width: 40px !important;\n        }\n    }\n}*/\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/vextable/index.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <template #tableTitle>\n        <a-dropdown>\n          <template #overlay>\n            <a-menu @click=\"handleCreate\">\n              <a-menu-item :key=\"1\">一对一示例</a-menu-item>\n              <a-menu-item :key=\"2\">一对多示例</a-menu-item>\n              <a-menu-item :key=\"3\">一对多(JVexTable)</a-menu-item>\n            </a-menu>\n          </template>\n          <a-button type=\"primary\">新增 <DownOutlined /></a-button>\n        </a-dropdown>\n      </template>\n      <template #ctype=\"{ text }\">\n        {{ text === '1' ? '国内订单' : text === '2' ? '国际订单' : text }}\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getAction(record)\" :dropDownActions=\"getDropDownActions(record)\" />\n      </template>\n    </BasicTable>\n    <!--        <TableDrawer @register=\"registerDrawer\" @success=\"handleSuccess\" />-->\n    <TableModal @register=\"registerModal\" @success=\"handleSuccess\" />\n    <JVxeTableModal @register=\"registerVexTableModal\" @success=\"handleSuccess\"></JVxeTableModal>\n    <OneToOneModal @register=\"registerOneToOneModal\" @success=\"handleSuccess\"></OneToOneModal>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import TableDrawer from './drawer.vue';\n  import TableModal from './modal.vue';\n  import VexTableModal from './VexTableModal.vue';\n  import JVxeTableModal from './jvxetable/JVxeTableModal.vue';\n  import OneToOneModal from './OneToOneModal.vue';\n  import { DownOutlined } from '@ant-design/icons-vue';\n  import { useListPage } from '/@/hooks/system/useListPage';\n\n  import { useModal } from '/@/components/Modal';\n  import { columns } from './data';\n  import { list, deleteOne } from './api';\n  import { defHttp } from '/@/utils/http/axios';\n\n  const [registerModal, { openModal }] = useModal();\n  const [registerOneToOneModal, { openModal: openOneToOneModal }] = useModal();\n  const [registerVexTableModal, { openModal: openVexTableModal }] = useModal();\n\n  //定义表格行操作\n  const getAction = (record) => {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n    ];\n  };\n\n  const getDropDownActions = (record) => {\n    let arr = [\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否删除？',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n    return arr;\n  };\n\n  // 列表页面公共参数、方法\n  const { tableContext } = useListPage({\n    tableProps: {\n      api: list,\n      columns: columns,\n      useSearchForm: false,\n      actionColumn: {\n        width: 160,\n        title: '操作',\n        dataIndex: 'action',\n        slots: { customRender: 'action' },\n      },\n    },\n  });\n\n  //注册table数据\n  const [registerTable, { reload }, { rowSelection }] = tableContext;\n  //新增类型\n  // 代码逻辑说明: [VUEN-1661]一对多示例，编辑的时候，有时候是一对一，有时候是一对多，默认一对多------------\n  const addType = ref(3);\n  //添加事件\n  function handleCreate(e) {\n    addType.value = e.key;\n    let type = addType.value;\n    if (type == 1) {\n      openOneToOneModal(true, {\n        isUpdate: false,\n      });\n    }\n    if (type == 2) {\n      openModal(true, {\n        isUpdate: false,\n      });\n    }\n    if (type == 3) {\n      openVexTableModal(true, {\n        isUpdate: false,\n      });\n    }\n  }\n\n  //编辑事件\n  function handleEdit(record: Recordable) {\n    let type = addType.value;\n    if (type == 1) {\n      openOneToOneModal(true, {\n        record,\n        isUpdate: true,\n      });\n    }\n    if (type == 2) {\n      openModal(true, {\n        record,\n        isUpdate: true,\n      });\n    }\n    if (type == 3) {\n      openVexTableModal(true, {\n        record,\n        isUpdate: true,\n      });\n    }\n  }\n\n  async function handleDelete(record: Recordable) {\n    await deleteOne({ id: record.id }, reload);\n  }\n\n  function handleSuccess() {\n    reload();\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/vextable/index2.vue",
    "content": "<template>\n  <div style=\"padding: 5px\">\n    <vxe-toolbar>\n      <template #buttons>\n        <vxe-button @click=\"allAlign = 'left'\">新增</vxe-button>\n      </template>\n    </vxe-toolbar>\n\n    <vxe-table :align=\"allAlign\" :data=\"tableData1\">\n      <vxe-table-column type=\"seq\" width=\"60\"></vxe-table-column>\n      <vxe-table-column field=\"name\" title=\"Name\"></vxe-table-column>\n      <vxe-table-column field=\"sex\" title=\"Sex\"></vxe-table-column>\n      <vxe-table-column field=\"age\" title=\"Age\"></vxe-table-column>\n    </vxe-table>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import { CollapseContainer } from '/@/components/Container/index';\n\n  export default defineComponent({\n    components: { CollapseContainer },\n    setup() {\n      const allAlign = ref(null);\n      const tableData1 = ref([\n        { id: 10001, name: 'Test1', role: 'Develop', sex: 'Man', age: 28, address: 'vxe-table 从入门到放弃' },\n        { id: 10002, name: 'Test2', role: 'Test', sex: 'Women', age: 22, address: 'Guangzhou' },\n        { id: 10003, name: 'Test3', role: 'PM', sex: 'Man', age: 32, address: 'Shanghai' },\n        { id: 10004, name: 'Test4', role: 'Designer', sex: 'Women', age: 24, address: 'Shanghai' },\n      ]);\n      return {\n        allAlign,\n        tableData1,\n      };\n    },\n  });\n</script>\n\n<style lang=\"css\" scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/vextable/jvxetable/JVxeTableModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"getTitle\" @ok=\"handleSubmit\" width=\"70%\" @fullScreen=\"handleFullScreen\">\n    <a-form ref=\"formRef\" :model=\"orderMainModel\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\" :rules=\"validatorRules\">\n      <div style=\"overflow-x: hidden\">\n        <a-row class=\"form-row\" :gutter=\"16\">\n          <a-col :lg=\"8\">\n            <a-form-item label=\"订单号\" name=\"orderCode\">\n              <a-input v-model:value=\"orderMainModel.orderCode\" placeholder=\"请输入订单号\" />\n            </a-form-item>\n          </a-col>\n          <a-col :lg=\"8\">\n            <a-form-item label=\"订单类型\" name=\"ctype\">\n              <a-select placeholder=\"请选择订单类型\" v-model:value=\"orderMainModel.ctype\">\n                <a-select-option value=\"1\">国内订单</a-select-option>\n                <a-select-option value=\"2\">国际订单</a-select-option>\n              </a-select>\n            </a-form-item>\n          </a-col>\n          <a-col :lg=\"8\">\n            <a-form-item label=\"订单日期\" name=\"orderDate\">\n              <a-date-picker showTime valueFormat=\"YYYY-MM-DD HH:mm:ss\" v-model:value=\"orderMainModel.orderDate\" />\n            </a-form-item>\n          </a-col>\n        </a-row>\n        <a-row class=\"form-row\" :gutter=\"16\">\n          <a-col :lg=\"8\">\n            <a-form-item label=\"订单金额\" name=\"orderMoney\">\n              <a-input v-model:value=\"orderMainModel.orderMoney\" placeholder=\"请输入订单金额\" />\n            </a-form-item>\n          </a-col>\n          <a-col :lg=\"8\">\n            <a-form-item label=\"订单备注\" name=\"content\">\n              <a-input v-model:value=\"orderMainModel.content\" placeholder=\"请输入订单备注\" />\n            </a-form-item>\n          </a-col>\n        </a-row>\n      </div>\n      <!-- 子表单区域 -->\n      <a-tabs v-model:activeKey=\"activeKey\" @change=\"handleChangeTabs\">\n        <a-tab-pane tab=\"客户信息\" key=\"tableRef1\">\n          <JVxeTable\n            ref=\"tableRef1\"\n            stripe\n            toolbar\n            rowNumber\n            rowSelection\n            resizable\n            keepSource\n            :height=\"tableH\"\n            :checkbox-config=\"{ range: true }\"\n            :loading=\"table1.loading\"\n            :columns=\"table1.columns\"\n            :dataSource=\"table1.dataSource\"\n          ></JVxeTable>\n        </a-tab-pane>\n\n        <a-tab-pane tab=\"机票信息\" key=\"tableRef2\" forceRender>\n          <JVxeTable\n            ref=\"tableRef2\"\n            stripe\n            toolbar\n            rowNumber\n            rowSelection\n            resizable\n            keepSource\n            :height=\"tableH\"\n            :checkbox-config=\"{ range: true }\"\n            :loading=\"table2.loading\"\n            :columns=\"table2.columns\"\n            :dataSource=\"table2.dataSource\"\n          ></JVxeTable>\n        </a-tab-pane>\n      </a-tabs>\n    </a-form>\n  </BasicModal>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, reactive, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/src/components/Modal';\n  import { JVxeTable } from '/src/components/jeecg/JVxeTable';\n  import { columns, columns1 } from './jvxetable.data';\n  import { orderCustomerList, orderTicketList, saveOrUpdate } from './jvxetable.api';\n  import { useJvxeMethod } from '/@/hooks/system/useJvxeMethods.ts';\n  export default defineComponent({\n    name: 'JVexTableModal',\n    components: { BasicModal, JVxeTable },\n    emits: ['success', 'register'],\n    setup(props, { emit }) {\n      const tableH = ref(300);\n      const isUpdate = ref(true);\n      const tableRef1 = ref();\n      const tableRef2 = ref();\n      const refKeys = ref(['tableRef1', 'tableRef2']);\n      const activeKey = ref('tableRef1');\n      const tableRefs = { tableRef1, tableRef2 };\n      const labelCol = reactive({\n        xs: { span: 24 },\n        sm: { span: 5 },\n      });\n      const wrapperCol = reactive({\n        xs: { span: 24 },\n        sm: { span: 16 },\n      });\n      // 客户信息\n      const table1 = reactive({\n        loading: false,\n        dataSource: [],\n        columns,\n      });\n      // 机票信息\n      const table2 = reactive({\n        loading: false,\n        dataSource: [],\n        columns: columns1,\n      });\n      const orderMainModel = reactive({\n        id: null,\n        orderCode: '',\n        orderMoney: '',\n        ctype: '',\n        content: '',\n        jeecgOrderCustomerList: [],\n        jeecgOrderTicketList: [],\n      });\n      const [handleChangeTabs, handleSubmit, requestSubTableData, formRef] = useJvxeMethod(\n        requestAddOrEdit,\n        classifyIntoFormData,\n        tableRefs,\n        activeKey,\n        refKeys\n      );\n      const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n        setModalProps({ confirmLoading: false });\n        reset();\n        isUpdate.value = !!data?.isUpdate;\n        if (unref(isUpdate)) {\n          Object.assign(orderMainModel, data.record);\n          //加载子表数据\n          let params = { id: orderMainModel.id };\n          requestSubTableData(orderCustomerList, params, table1);\n          requestSubTableData(orderTicketList, params, table2);\n        }\n      });\n\n      const validatorRules = { orderCode: [{ required: true, message: '订单号不能为空', trigger: 'blur' }] };\n      const getTitle = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));\n\n      function classifyIntoFormData(allValues) {\n        let orderMain = Object.assign(orderMainModel, allValues.formValue);\n        return {\n          ...orderMain, // 展开\n          jeecgOrderCustomerList: allValues.tablesValue[0].tableData,\n          jeecgOrderTicketList: allValues.tablesValue[1].tableData,\n        };\n      }\n      function reset() {\n        orderMainModel.id = null;\n        orderMainModel.orderCode = '';\n        orderMainModel.orderMoney = '';\n        orderMainModel.orderDate = null;\n        orderMainModel.ctype = '';\n        orderMainModel.content = '';\n        orderMainModel.jeecgOrderCustomerList = [];\n        orderMainModel.jeecgOrderTicketList = [];\n        table1.dataSource = [];\n        table2.dataSource = [];\n      }\n      async function requestAddOrEdit(values) {\n        setModalProps({ confirmLoading: true });\n        //提交表单\n        await saveOrUpdate(values, unref(isUpdate));\n        //关闭弹窗\n        closeModal();\n        //刷新列表\n        emit('success');\n      }\n      // 代码逻辑说明: 【QQYUN-5866】放大行数自适应\n      const handleFullScreen = (val) => {\n        tableH.value=val ? document.documentElement.clientHeight - 387 :  300;\n      };\n      return {\n        formRef,\n        activeKey,\n        table1,\n        table2,\n        tableRef1,\n        tableRef2,\n        getTitle,\n        labelCol,\n        wrapperCol,\n        validatorRules,\n        orderMainModel,\n        registerModal,\n        handleChangeTabs,\n        handleSubmit,\n        handleFullScreen,\n        tableH,\n      };\n    },\n  });\n</script>\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/vextable/jvxetable/jvxetable.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nenum Api {\n  save = '/test/jeecgOrderMain/add',\n  edit = '/test/jeecgOrderMain/edit',\n  orderCustomerList = '/test/jeecgOrderMain/queryOrderCustomerListByMainId',\n  orderTicketList = '/test/jeecgOrderMain/queryOrderTicketListByMainId',\n}\nexport const orderCustomerList = Api.orderCustomerList;\nexport const orderTicketList = Api.orderTicketList;\n/**\n * 保存或者更新\n * @param params\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({ url: url, params });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/vextable/jvxetable/jvxetable.data.ts",
    "content": "import { JVxeTypes, JVxeColumn } from '/@/components/jeecg/JVxeTable/types';\n\nexport const columns: JVxeColumn[] = [\n  {\n    title: '客户名',\n    key: 'name',\n    width: 180,\n    type: JVxeTypes.input,\n    defaultValue: '',\n    placeholder: '请输入${title}',\n    validateRules: [{ required: true, message: '${title}不能为空' }],\n  },\n  {\n    title: '性别',\n    key: 'sex',\n    width: 180,\n    type: JVxeTypes.select,\n    options: [\n      // 下拉选项\n      { title: '男', value: '1' },\n      { title: '女', value: '2' },\n    ],\n    defaultValue: '',\n    placeholder: '请选择${title}',\n  },\n  {\n    title: '身份证号',\n    key: 'idcard',\n    width: 180,\n    type: JVxeTypes.input,\n    defaultValue: '',\n    placeholder: '请输入${title}',\n    validateRules: [\n      {\n        pattern: '^\\\\d{6}(18|19|20)?\\\\d{2}(0[1-9]|1[012])(0[1-9]|[12]\\\\d|3[01])\\\\d{3}(\\\\d|[xX])$',\n        message: '${title}格式不正确',\n      },\n    ],\n  },\n  {\n    title: '手机号',\n    key: 'telphone',\n    width: 180,\n    type: JVxeTypes.input,\n    defaultValue: '',\n    placeholder: '请输入${title}',\n    validateRules: [\n      {\n        pattern: '^1[3456789]\\\\d{9}$',\n        message: '${title}格式不正确',\n      },\n    ],\n  },\n];\nexport const columns1: JVxeColumn[] = [\n  {\n    title: '航班号',\n    key: 'ticketCode',\n    width: 180,\n    type: JVxeTypes.input,\n    defaultValue: '',\n    placeholder: '请输入${title}',\n    validateRules: [{ required: true, message: '${title}不能为空' }],\n  },\n  {\n    title: '航班时间',\n    key: 'tickectDate',\n    width: 180,\n    type: JVxeTypes.date,\n    placeholder: '请选择${title}',\n    defaultValue: '',\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/demo/vextable/modal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"getTitle\" @ok=\"handleSubmit\" width=\"70%\">\n    <a-form ref=\"formRef\" :model=\"orderMainModel\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\" :rules=\"validatorRules\">\n      <a-row class=\"form-row\" :gutter=\"16\">\n        <a-col :lg=\"8\">\n          <a-form-item label=\"订单号\" name=\"orderCode\">\n            <a-input v-model:value=\"orderMainModel.orderCode\" placeholder=\"请输入订单号\" />\n          </a-form-item>\n        </a-col>\n        <a-col :lg=\"8\">\n          <a-form-item label=\"订单类型\">\n            <a-select placeholder=\"请选择订单类型\" v-model:value=\"orderMainModel.ctype\">\n              <a-select-option value=\"1\">国内订单</a-select-option>\n              <a-select-option value=\"2\">国际订单</a-select-option>\n            </a-select>\n          </a-form-item>\n        </a-col>\n        <a-col :lg=\"8\">\n          <a-form-item label=\"订单日期\">\n            <a-date-picker showTime valueFormat=\"YYYY-MM-DD HH:mm:ss\" v-model:value=\"orderMainModel.orderDate\" />\n          </a-form-item>\n        </a-col>\n      </a-row>\n      <a-row class=\"form-row\" :gutter=\"16\">\n        <a-col :lg=\"8\">\n          <a-form-item label=\"订单金额\">\n            <a-input v-model:value=\"orderMainModel.orderMoney\" placeholder=\"请输入订单金额\" />\n          </a-form-item>\n        </a-col>\n        <a-col :lg=\"8\">\n          <a-form-item label=\"订单备注\">\n            <a-input v-model:value=\"orderMainModel.content\" placeholder=\"请输入订单备注\" />\n          </a-form-item>\n        </a-col>\n      </a-row>\n      <a-tabs defaultActiveKey=\"1\">\n        <a-tab-pane tab=\"客户信息\" key=\"1\">\n          <div>\n            <a-row type=\"flex\" style=\"margin-bottom: 10px\" :gutter=\"16\">\n              <a-col :span=\"5\">客户名</a-col>\n              <a-col :span=\"5\">性别</a-col>\n              <a-col :span=\"6\">身份证号码</a-col>\n              <a-col :span=\"6\">手机号</a-col>\n              <a-col :span=\"2\">操作</a-col>\n            </a-row>\n            <a-row type=\"flex\" style=\"margin-bottom: 10px\" :gutter=\"16\" v-for=\"(item, index) in orderMainModel.jeecgOrderCustomerList\" :key=\"index\">\n              <a-col :span=\"6\" style=\"display: none\">\n                <a-form-item>\n                  <a-input placeholder=\"id\" v-model:value=\"item.id\" />\n                </a-form-item>\n              </a-col>\n              <a-col :span=\"5\">\n                <a-form-item>\n                  <a-input placeholder=\"客户名\" v-model:value=\"item.name\" />\n                </a-form-item>\n              </a-col>\n              <a-col :span=\"5\">\n                <a-form-item>\n                  <a-select placeholder=\"性别\" v-model:value=\"item.sex\">\n                    <a-select-option value=\"1\">男</a-select-option>\n                    <a-select-option value=\"2\">女</a-select-option>\n                  </a-select>\n                </a-form-item>\n              </a-col>\n              <a-col :span=\"6\">\n                <a-form-item\n                  :name=\"['jeecgOrderCustomerList', index, 'idcard']\"\n                  :rules=\"[{ required: true, message: '请输入身份证号', trigger: 'blur' }]\"\n                  :key=\"index\"\n                >\n                  <a-input placeholder=\"身份证号\" v-model:value=\"item.idcard\" />\n                </a-form-item>\n              </a-col>\n              <a-col :span=\"6\">\n                <a-form-item :name=\"['jeecgOrderCustomerList', index, 'telphone']\">\n                  <a-input placeholder=\"手机号\" v-model:value=\"item.telphone\" />\n                </a-form-item>\n              </a-col>\n              <a-col :span=\"2\">\n                <a-form-item>\n                  <Icon icon=\"ant-design:minus-outlined\" @click=\"delRowCustom(index)\" style=\"fontsize: 20px\" />\n                </a-form-item>\n              </a-col>\n            </a-row>\n            <a-button type=\"dashed\" style=\"width: 98%; margin-top: 10px\" @click=\"addRowCustom\">\n              <Icon icon=\"ph:plus-bold\" />\n              添加客户信息\n            </a-button>\n          </div>\n        </a-tab-pane>\n\n        <a-tab-pane tab=\"机票信息\" key=\"2\" forceRender>\n          <a-row type=\"flex\" style=\"margin-bottom: 10px\" :gutter=\"16\">\n            <a-col :span=\"6\">航班号</a-col>\n            <a-col :span=\"6\">航班时间</a-col>\n            <a-col :span=\"6\">操作</a-col>\n          </a-row>\n          <a-row type=\"flex\" style=\"margin-bottom: 10px\" :gutter=\"16\" v-for=\"(item, index) in orderMainModel.jeecgOrderTicketList\" :key=\"index\">\n            <a-col :span=\"6\" style=\"display: none\">\n              <a-form-item>\n                <a-input placeholder=\"id\" v-model:value=\"item.id\" />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"6\">\n              <a-form-item\n                :name=\"['jeecgOrderTicketList', index, 'ticketCode']\"\n                :rules=\"{ required: true, message: '请输入航班号', trigger: 'blur' }\"\n              >\n                <a-input placeholder=\"航班号\" v-model:value=\"item.ticketCode\" />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"6\">\n              <a-form-item>\n                <a-date-picker placeholder=\"航班时间\" valueFormat=\"YYYY-MM-DD\" v-model:value=\"item.tickectDate\" />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"6\">\n              <a-form-item>\n                <Icon icon=\"ant-design:minus-outlined\" @click=\"delRowTicket(index)\" style=\"fontsize: 20px\" />\n              </a-form-item>\n            </a-col>\n          </a-row>\n          <a-button type=\"dashed\" style=\"width: 98%; margin-top: 10px\" @click=\"addRowTicket\">\n            <Icon icon=\"ph:plus-bold\" />\n            添加机票信息\n          </a-button>\n        </a-tab-pane>\n      </a-tabs>\n    </a-form>\n  </BasicModal>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, reactive, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { ValidateErrorEntity } from 'ant-design-vue/es/form/interface';\n  import { saveOrUpdate } from './jvxetable/jvxetable.api';\n  import { orderCustomerList, orderTicketList } from './api';\n\n  export default defineComponent({\n    name: 'tableModal',\n    components: { BasicModal },\n    emits: ['success', 'register'],\n    setup(props, { emit }) {\n      const isUpdate = ref(true);\n      const rowId = ref('');\n      const formRef = ref();\n      const labelCol = reactive({\n        xs: { span: 24 },\n        sm: { span: 5 },\n      });\n      const wrapperCol = reactive({\n        xs: { span: 24 },\n        sm: { span: 16 },\n      });\n      const validatorRules = {\n        orderCode: [{ required: true, message: '订单号不能为空', trigger: 'blur' }],\n      };\n      const orderMainModel = reactive({\n        id: null,\n        orderCode: '',\n        orderMoney: '',\n        ctype: '',\n        content: '',\n        jeecgOrderCustomerList: [],\n        jeecgOrderTicketList: [],\n      });\n      const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n        setModalProps({ confirmLoading: false });\n        isUpdate.value = !!data?.isUpdate;\n        reset();\n        if (unref(isUpdate)) {\n          rowId.value = data.record.id;\n          Object.assign(orderMainModel, data.record);\n          let params = { id: orderMainModel.id };\n          const customerList = await orderCustomerList(params);\n          orderMainModel.jeecgOrderCustomerList = customerList;\n          const ticketList = await orderTicketList(params);\n          orderMainModel.jeecgOrderTicketList = ticketList;\n        }\n      });\n      const getTitle = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));\n\n      //动态添加行\n      function addRowCustom() {\n        orderMainModel.jeecgOrderCustomerList.push({});\n      }\n\n      //删除行\n      function delRowCustom(index) {\n        orderMainModel['jeecgOrderCustomerList'].splice(index, 1);\n        orderMainModel.jeecgOrderCustomerList.splice(index, 1);\n      }\n      function reset() {\n        orderMainModel.id = null;\n        orderMainModel.orderCode = '';\n        orderMainModel.orderMoney = '';\n        orderMainModel.orderDate = null;\n        orderMainModel.ctype = '';\n        orderMainModel.content = '';\n        orderMainModel.jeecgOrderCustomerList = [];\n        orderMainModel.jeecgOrderTicketList = [];\n      }\n      function addRowTicket() {\n        orderMainModel.jeecgOrderTicketList.push({});\n      }\n\n      //删除机票\n      function delRowTicket(index) {\n        orderMainModel['jeecgOrderTicketList'].splice(index, 1);\n        orderMainModel.jeecgOrderTicketList.splice(index, 1);\n      }\n\n      async function handleSubmit() {\n        formRef.value\n          .validate()\n          .then(async () => {\n            try {\n              console.log('formData', JSON.stringify(orderMainModel));\n              setModalProps({ confirmLoading: true });\n              await saveOrUpdate(orderMainModel, unref(isUpdate));\n              closeModal();\n              emit('success');\n            } finally {\n              setModalProps({ confirmLoading: false });\n            }\n          })\n          .catch((error: ValidateErrorEntity<any>) => {\n            console.log('error', error);\n          });\n      }\n\n      return {\n        formRef,\n        validatorRules,\n        orderMainModel,\n        registerModal,\n        getTitle,\n        labelCol,\n        wrapperCol,\n        addRowCustom,\n        delRowCustom,\n        addRowTicket,\n        delRowTicket,\n        handleSubmit,\n      };\n    },\n  });\n</script>\n<style scoped>\n  .ant-btn {\n    padding: 0 10px;\n    margin-left: 3px;\n  }\n\n  .ant-form-item-control {\n    line-height: 0px;\n  }\n\n  /** 主表单行间距 */\n  .ant-form .ant-form-item {\n    margin-bottom: 10px;\n  }\n\n  /** Tab页面行间距 */\n  .ant-tabs-content .ant-form-item {\n    margin-bottom: 0px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/datalog/DataLogCompareModal.vue",
    "content": "<!--用户选择框-->\n<template>\n  <div>\n    <BasicModal v-bind=\"$attrs\" @register=\"register\" title=\"数据对比\" width=\"50%\" destroyOnClose :showOkBtn=\"false\">\n      <a-row :gutter=\"6\" v-if=\"dataVersionList\" style=\"margin-left: 2px\">\n        <span style=\"margin-top: 5px; margin-right: 3px; margin-left: 4px\">版本对比:</span>\n        <a-select placeholder=\"版本号\" @change=\"handleChange1\" v-model:value=\"params.dataId1\">\n          <a-select-option v-for=\"(log, logindex) in dataVersionList\" :key=\"log.value\" :value=\"log.value\">\n            {{ log.text }}\n          </a-select-option>\n        </a-select>\n\n        <a-select placeholder=\"版本号\" @change=\"handleChange2\" style=\"padding-left: 10px\" v-model:value=\"params.dataId2\">\n          <a-select-option v-for=\"(log, logindex) in dataVersionList\" :key=\"log.value\" :value=\"log.value\">\n            {{ log.text }}\n          </a-select-option>\n        </a-select>\n      </a-row>\n      <BasicTable\n        :columns=\"columns\"\n        v-bind=\"getBindValue\"\n        :rowClassName=\"setDataCss\"\n        :striped=\"false\"\n        :showIndexColumn=\"false\"\n        :pagination=\"false\"\n        :canResize=\"false\"\n        :bordered=\"true\"\n        :dataSource=\"dataSource\"\n        :searchInfo=\"searchInfo\"\n        v-if=\"isUpdate\"\n      >\n        <template #dataVersionTitle1=\"{ record }\"> <Icon icon=\"icon-park-outline:grinning-face\" /> 版本:{{ dataVersion1Num }} </template>\n        <template #dataVersionTitle2=\"{ record }\"> <Icon icon=\"icon-park-outline:grinning-face\" /> 版本:{{ dataVersion2Num }} </template>\n        <template #avatarslot=\"{ record }\">\n          <div class=\"anty-img-wrap\" v-if=\"record.dataVersion1 != record.dataVersion2\">\n            <Icon icon=\"mdi:arrow-right-bold\" style=\"color: red\"></Icon>\n          </div>\n        </template>\n      </BasicTable>\n    </BasicModal>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, unref, ref, reactive, watch } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { queryCompareList, queryDataVerList } from './datalog.api';\n  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n  import { useAttrs } from '/@/hooks/core/useAttrs';\n  import { selectProps } from '/@/components/Form/src/jeecg/props/props';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  export default defineComponent({\n    name: 'DataLogCompareModal',\n    components: {\n      //此处需要异步加载BasicTable\n      BasicModal,\n      BasicTable: createAsyncComponent(() => import('/@/components/Table/src/BasicTable.vue'), { loading: true }),\n    },\n    props: {\n      ...selectProps,\n    },\n    emits: ['register', 'btnOk'],\n    setup(props, { emit, refs }) {\n      const { createMessage } = useMessage();\n      const attrs = useAttrs();\n      const getBindValue = Object.assign({}, unref(props), unref(attrs));\n      const dataSource = ref([]);\n      const dataVersion1Num = ref('');\n      const dataVersion2Num = ref('');\n      const isUpdate = ref(true);\n      const searchInfo = {};\n      const dataId1 = ref('');\n      const dataId2 = ref('');\n      const dataId = ref('');\n      const dataTable1 = ref('');\n      const dataID3 = ref('');\n      const dataTable = ref('');\n      const confirmLoading = ref(false);\n      const dataVersionList = ref([]);\n      let params = reactive({ dataId1: '', dataId2: '' });\n      let dataLog = reactive({});\n      const [register, { setModalProps, closeModal }] = useModalInner(async (data) => {\n        isUpdate.value = !!data?.isUpdate;\n        if (unref(isUpdate)) {\n          let checkedRows = data.selectedRows;\n          dataTable.value = checkedRows[0].dataTable;\n          dataId.value = checkedRows[0].dataId;\n          dataId1.value = checkedRows[0].id;\n          dataId2.value = checkedRows[1].id;\n          params.dataId1 = dataId1.value;\n          params.dataId2 = dataId2.value;\n          await initDataVersionList();\n          await initTableData();\n        }\n      });\n\n      //定义表格列\n      const columns = [\n        {\n          title: '字段名',\n          dataIndex: 'code',\n          width: 20,\n          align: 'left',\n        },\n        {\n          dataIndex: 'dataVersion1',\n          align: 'left',\n          width: 60,\n          slots: { title: 'dataVersionTitle1' },\n        },\n        {\n          title: '',\n          dataIndex: 'imgshow',\n          align: 'center',\n          slots: { customRender: 'avatarslot' },\n          width: 5,\n        },\n        {\n          align: 'left',\n          dataIndex: 'dataVersion2',\n          width: 60,\n          filters: [],\n          filterMultiple: false,\n          slots: { title: 'dataVersionTitle2' },\n        },\n      ];\n      async function initTableData() {\n        console.info('params', params);\n        queryCompareList(unref(params)).then((res) => {\n          console.info('test', res);\n          dataVersion1Num.value = res[0].dataVersion;\n          dataVersion2Num.value = res[1].dataVersion;\n          let json1 = JSON.parse(res[0].dataContent);\n          let json2 = JSON.parse(res[1].dataContent);\n          let data = [];\n          for (var item1 in json1) {\n            for (var item2 in json2) {\n              if (item1 == item2) {\n                data.push({\n                  code: item1,\n                  imgshow: '',\n                  dataVersion1: json1[item1],\n                  dataVersion2: json2[item2],\n                });\n              }\n            }\n          }\n          dataSource.value = data;\n        });\n      }\n      function handleChange1(value) {\n        if (params.dataId2 == value) {\n          createMessage.warning('相同版本号不能比较');\n          return;\n        }\n        params.dataId1 = value;\n        initTableData();\n      }\n      function handleChange2(value) {\n        if (params.dataId1 == value) {\n          createMessage.warning('相同版本号不能比较');\n          return;\n        }\n        params.dataId2 = value;\n        initTableData();\n      }\n      function setDataCss(record) {\n        let className = 'trcolor';\n        const dataVersion1 = record.dataVersion1;\n        const dataVersion2 = record.dataVersion2;\n        if (dataVersion1 != dataVersion2) {\n          return className;\n        }\n      }\n      async function initDataVersionList() {\n        queryDataVerList({ dataTable: dataTable.value, dataId: dataId.value }).then((res) => {\n          dataVersionList.value = res.map((value, key, arr) => {\n            let item = {};\n            item['text'] = value['dataVersion'];\n            item['value'] = value['id'];\n            return item;\n          });\n        });\n      }\n\n      return {\n        //config,\n        searchInfo,\n        dataSource,\n        setDataCss,\n        isUpdate,\n        dataVersionList,\n        dataVersion1Num,\n        dataVersion2Num,\n        queryCompareList,\n        initDataVersionList,\n        register,\n        handleChange1,\n        handleChange2,\n        params,\n        getBindValue,\n        columns,\n      };\n    },\n  });\n</script>\n<style scoped>\n  .anty-img-wrap {\n    height: 25px;\n    position: relative;\n  }\n\n  .anty-img-wrap > img {\n    max-height: 100%;\n  }\n\n  .marginCss {\n    margin-top: 20px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/datalog/DataLogModal.vue",
    "content": "<template>\n  <div>\n    <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" title=\"数据对比窗口\" :minHeight=\"300\" width=\"800px\" @ok=\"handleSubmit\">\n      <a-spin :spinning=\"confirmLoading\">\n        <a-form @submit=\"handleSubmit\" :form=\"form\" class=\"form\">\n          <a-row class=\"form-row\" :gutter=\"24\">\n            <a-col :md=\"12\" :sm=\"8\">\n              <a-form-item label=\"数据库表名\" :label-col=\"{ span: 6 }\" :wrapper-col=\"{ span: 15 }\" name=\"dataTable\">\n                <a-input placeholder=\"请输入数据库表名\" v-model:value=\"dataTable\" disabled />\n              </a-form-item>\n            </a-col>\n\n            <a-col :md=\"12\" :sm=\"8\">\n              <a-form-item label=\"数据ID\" :label-col=\"{ span: 5 }\" :wrapper-col=\"{ span: 15 }\">\n                <a-input placeholder=\"请输入数据ID\" v-model:value=\"dataId\" disabled />\n              </a-form-item>\n            </a-col>\n          </a-row>\n\n          <a-row class=\"form-row\" :gutter=\"24\">\n            <a-col :md=\"12\" :sm=\"8\">\n              <a-form-item label=\"版本号1\" :label-col=\"{ span: 6 }\" :wrapper-col=\"{ span: 15 }\">\n                <a-select placeholder=\"请选择版本号\" @change=\"handleChange1\" v-model:value=\"dataVersion1\">\n                  <a-select-option v-for=\"(log, logindex) in dataVersionList\" :key=\"logindex.toString()\" :value=\"log.id\">\n                    {{ log.dataVersion }}\n                  </a-select-option>\n                </a-select>\n              </a-form-item>\n            </a-col>\n            <a-col :md=\"12\" :sm=\"8\">\n              <a-form-item label=\"版本号2\" :label-col=\"{ span: 5 }\" :wrapper-col=\"{ span: 15 }\">\n                <a-select placeholder=\"请选择版本号\" @change=\"handleChange2\" v-model:value=\"dataVersion2\">\n                  <a-select-option v-for=\"(log, logindex) in dataVersionList\" :key=\"logindex.toString()\" :value=\"log.id\">\n                    {{ log.dataVersion }}\n                  </a-select-option>\n                </a-select>\n              </a-form-item>\n            </a-col>\n          </a-row>\n        </a-form>\n      </a-spin>\n    </BasicModal>\n    <DataLogCompareModal @register=\"registerDataLogCompareModal\"></DataLogCompareModal>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { BasicModal, useModal, useModalInner } from '/@/components/Modal';\n  import { queryDataVerList } from './datalog.api';\n  import { reactive, ref, unref } from 'vue';\n  import DataLogCompareModal from './DataLogCompareModal.vue';\n  const dataId1 = ref('');\n  const dataId2 = ref('');\n  const dataId = ref('');\n  const dataTable1 = ref('');\n  const dataID3 = ref('');\n  const dataTable = ref('');\n  const confirmLoading = ref(false);\n  const isUpdate = ref(true);\n  const dataVersionList = ref([]);\n  let dataLog = reactive({});\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    isUpdate.value = !!data?.isUpdate;\n    if (unref(isUpdate)) {\n      let checkedRows = data.selectedRows;\n      dataTable.value = checkedRows[0].dataTable;\n      dataId.value = checkedRows[0].dataId;\n      dataId1.value = checkedRows[0].id;\n      dataId2.value = checkedRows[1].id;\n      initDataVersionList();\n    }\n  });\n\n  const [registerDataLogCompareModal, { openModal }] = useModal();\n\n  function handleChange1(value) {\n    dataId1.value = value;\n  }\n\n  function handleChange2(value) {\n    dataId2.value = value;\n  }\n\n  function handleSubmit() {\n    let result = { dataId1: dataId1.value, dataId2: dataId2.value };\n    openModal(true, {\n      result,\n      isUpdate: true,\n    });\n    closeModal();\n  }\n\n  function initDataVersionList() {\n    queryDataVerList({ dataTable: dataTable.value, dataId: dataId.value }).then((res) => {\n      dataVersionList.value = res.map((value, key, arr) => {\n        arr['label'] = value;\n        return arr;\n      });\n      console.info(dataVersionList.value);\n    });\n  }\n</script>\n\n<style scoped lang=\"less\">\n  .detail-iframe {\n    border: 0;\n    width: 100%;\n    height: 100%;\n    min-height: 600px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/datalog/datalog.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\n\nenum Api {\n  list = '/sys/dataLog/list',\n  queryDataVerList = '/sys/dataLog/queryDataVerList',\n  queryCompareList = '/sys/dataLog/queryCompareList',\n}\n\n/**\n * 查询数据日志列表\n * @param params\n */\nexport const getDataLogList = (params) => {\n  return defHttp.get({ url: Api.list, params });\n};\n\n/**\n * 查询数据日志列表\n * @param params\n */\nexport const queryDataVerList = (params) => {\n  return defHttp.get({ url: Api.queryDataVerList, params });\n};\n\n/**\n * 查询对比数据\n * @param params\n */\nexport const queryCompareList = (params) => {\n  return defHttp.get({ url: Api.queryCompareList, params });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/datalog/datalog.data.ts",
    "content": "import { BasicColumn, FormSchema } from '/@/components/Table';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '表名',\n    dataIndex: 'dataTable',\n    width: 150,\n    align: 'left',\n  },\n  {\n    title: '数据ID',\n    dataIndex: 'dataId',\n    width: 350,\n  },\n  {\n    title: '版本号',\n    dataIndex: 'dataVersion',\n    width: 100,\n  },\n  {\n    title: '数据内容',\n    dataIndex: 'dataContent',\n  },\n  {\n    title: '创建人',\n    dataIndex: 'createBy',\n    sorter: true,\n    width: 200,\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'dataTable',\n    label: '表名',\n    component: 'Input',\n    colProps: { span: 8 },\n  },\n  {\n    field: 'dataId',\n    label: '数据ID',\n    component: 'Input',\n    colProps: { span: 8 },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/datalog/index.vue",
    "content": "<template>\n  <div>\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <template #tableTitle>\n        <a-button preIcon=\"ant-design:plus-outlined\" type=\"primary\" @click=\"handleCompare\" style=\"margin-right: 5px\">数据比较</a-button>\n      </template>\n    </BasicTable>\n    <DataLogCompareModal @register=\"registerModal\" @success=\"reload\" />\n  </div>\n</template>\n<script lang=\"ts\" name=\"monitor-datalog\" setup>\n  import { ref } from 'vue';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import DataLogCompareModal from './DataLogCompareModal.vue';\n  const [registerModal, { openModal }] = useModal();\n  import { getDataLogList } from './datalog.api';\n  import { columns, searchFormSchema } from './datalog.data';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useModal } from '/@/components/Modal';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  const { createMessage } = useMessage();\n  const checkedRows = ref<Array<object | number>>([]);\n\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext } = useListPage({\n    designScope: 'datalog-template',\n    tableProps: {\n      title: '数据日志列表',\n      api: getDataLogList,\n      columns: columns,\n      formConfig: {\n        labelWidth: 120,\n        schemas: searchFormSchema,\n      },\n      actionColumn: false,\n    },\n  });\n\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext;\n\n  function handleCompare() {\n    let obj = selectedRows.value;\n    console.info('sfsfsf', obj);\n    if (!obj || obj.length != 2) {\n      createMessage.warning('请选择两条数据!');\n      return false;\n    }\n    if (obj[0].dataId != obj[1].dataId) {\n      createMessage.warning('请选择相同的数据库表和数据ID进行比较!');\n      return false;\n    }\n    openModal(true, {\n      selectedRows,\n      isUpdate: true,\n    });\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/datasource/DataSourceModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"title\" @ok=\"handleSubmit\" width=\"40%\">\n    <BasicForm @register=\"registerForm\">\n      <template #pwd=\"{ model, field }\">\n        <a-row :gutter=\"8\">\n          <a-col :sm=\"15\" :md=\"16\" :lg=\"17\" :xl=\"19\">\n            <a-input-password v-model:value=\"model[field]\" placeholder=\"请输入密码\" />\n          </a-col>\n          <a-col :sm=\"9\" :md=\"7\" :lg=\"7\" :xl=\"5\">\n            <a-button type=\"primary\" style=\"width: 100%\" @click=\"handleTest\">测试</a-button>\n          </a-col>\n        </a-row>\n      </template>\n    </BasicForm>\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { formSchema } from './datasource.data';\n  import { saveOrUpdateDataSource, getDataSourceById, testConnection } from './datasource.api';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  const { createMessage } = useMessage();\n  // Emits声明\n  const emit = defineEmits(['register', 'success']);\n  const isUpdate = ref(true);\n  //表单配置\n  const [registerForm, { getFieldsValue, resetFields, validateFields, setFieldsValue, validate }] = useForm({\n    // labelWidth: 150,\n    schemas: formSchema,\n    showActionButtonGroup: false,\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false });\n    isUpdate.value = !!data?.isUpdate;\n    if (unref(isUpdate)) {\n      //获取详情\n      data.record = await getDataSourceById({ id: data.record.id });\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n    }\n  });\n  //设置标题\n  const title = computed(() => (!unref(isUpdate) ? '新增数据源' : '编辑数据源'));\n\n  async function handleTest() {\n    let keys = ['dbType', 'dbDriver', 'dbUrl', 'dbName', 'dbUsername', 'dbPassword'];\n    // 获取以上字段的值，并清除校验状态\n    let fieldsValues = getFieldsValue(keys);\n    let setFields = {};\n    keys.forEach((key) => (setFields[key] = { value: fieldsValues[key], errors: null }));\n    await validateFields(keys).then((values) => {\n      let loading = createMessage.loading('连接中....', 0);\n      testConnection(values)\n        .then((data) => {\n          if (data.success) {\n            createMessage.success('连接成功');\n          }\n        })\n        .catch((error) => {})\n        .finally(() => loading());\n    });\n  }\n\n  //表单提交事件\n  async function handleSubmit(v) {\n    try {\n      let values = await validate();\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      await saveOrUpdateDataSource(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/datasource/datasource.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { Modal } from 'ant-design-vue';\n\nenum Api {\n  list = '/sys/dataSource/list',\n  save = '/sys/dataSource/add',\n  edit = '/sys/dataSource/edit',\n  get = '/sys/dataSource/queryById',\n  delete = '/sys/dataSource/delete',\n  testConnection = '/online/cgreport/api/testConnection',\n  deleteBatch = '/sys/dataSource/deleteBatch',\n  exportXlsUrl = 'sys/dataSource/exportXls',\n  importExcelUrl = 'sys/dataSource/importExcel',\n}\n/**\n * 导出api\n */\nexport const getExportUrl = Api.exportXlsUrl;\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcelUrl;\n\n/**\n * 查询数据源列表\n * @param params\n */\nexport const getDataSourceList = (params) => {\n  return defHttp.get({ url: Api.list, params });\n};\n\n/**\n * 保存或者更新数据源\n * @param params\n */\nexport const saveOrUpdateDataSource = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({ url: url, params });\n};\n\n/**\n * 查询数据源详情\n * @param params\n */\nexport const getDataSourceById = (params) => {\n  return defHttp.get({ url: Api.get, params });\n};\n\n/**\n * 删除数据源\n * @param params\n */\nexport const deleteDataSource = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.delete, data: params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n\n/**\n * 测试连接\n * @param params\n */\nexport const testConnection = (params) => {\n  return defHttp.post({ url: Api.testConnection, params });\n};\n\n/**\n * 批量删除数据源\n * @param params\n */\nexport const batchDeleteDataSource = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/datasource/datasource.data.ts",
    "content": "import { BasicColumn, FormSchema } from '/@/components/Table';\n\nconst dbDriverMap = {\n  // MySQL 数据库\n  '1': { dbDriver: 'com.mysql.jdbc.Driver' },\n  //MySQL5.7+ 数据库\n  '4': { dbDriver: 'com.mysql.cj.jdbc.Driver' },\n  // Oracle\n  '2': { dbDriver: 'oracle.jdbc.OracleDriver' },\n  // SQLServer 数据库\n  '3': { dbDriver: 'com.microsoft.sqlserver.jdbc.SQLServerDriver' },\n  // marialDB 数据库\n  '5': { dbDriver: 'org.mariadb.jdbc.Driver' },\n  // postgresql 数据库\n  '6': { dbDriver: 'org.postgresql.Driver' },\n  // 达梦 数据库\n  '7': { dbDriver: 'dm.jdbc.driver.DmDriver' },\n  // 人大金仓 数据库\n  '8': { dbDriver: 'com.kingbase8.Driver' },\n  // 神通 数据库\n  '9': { dbDriver: 'com.oscar.Driver' },\n  // SQLite 数据库\n  '10': { dbDriver: 'org.sqlite.JDBC' },\n  // DB2 数据库\n  '11': { dbDriver: 'com.ibm.db2.jcc.DB2Driver' },\n  // Hsqldb 数据库\n  '12': { dbDriver: 'org.hsqldb.jdbc.JDBCDriver' },\n  // Derby 数据库\n  '13': { dbDriver: 'org.apache.derby.jdbc.ClientDriver' },\n  // H2 数据库\n  '14': { dbDriver: 'org.h2.Driver' },\n  // 其他数据库\n  '15': { dbDriver: '' },\n};\nconst dbUrlMap = {\n  // MySQL 数据库\n  '1': { dbUrl: 'jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false' },\n  //MySQL5.7+ 数据库\n  '4': {\n    dbUrl:\n      'jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai',\n  },\n  // Oracle\n  '2': { dbUrl: 'jdbc:oracle:thin:@127.0.0.1:1521:ORCL' },\n  // SQLServer 数据库\n  '3': { dbUrl: 'jdbc:sqlserver://127.0.0.1:1433;SelectMethod=cursor;DatabaseName=jeecgboot' },\n  // Mariadb 数据库\n  '5': { dbUrl: 'jdbc:mariadb://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useSSL=false' },\n  // Postgresql 数据库\n  '6': { dbUrl: 'jdbc:postgresql://127.0.0.1:5432/jeecg-boot' },\n  // 达梦 数据库\n  '7': { dbUrl: 'jdbc:dm://127.0.0.1:5236/?jeecg-boot&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8' },\n  // 人大金仓 数据库\n  '8': { dbUrl: 'jdbc:kingbase8://127.0.0.1:54321/jeecg-boot' },\n  // 神通 数据库\n  '9': { dbUrl: 'jdbc:oscar://192.168.1.125:2003/jeecg-boot' },\n  // SQLite 数据库\n  '10': { dbUrl: 'jdbc:sqlite://opt/test.db' },\n  // DB2 数据库\n  '11': { dbUrl: 'jdbc:db2://127.0.0.1:50000/jeecg-boot' },\n  // Hsqldb 数据库\n  '12': { dbUrl: 'jdbc:hsqldb:hsql://127.0.0.1/jeecg-boot' },\n  // Derby 数据库\n  '13': { dbUrl: 'jdbc:derby://127.0.0.1:1527/jeecg-boot' },\n  // H2 数据库\n  '14': { dbUrl: 'jdbc:h2:tcp://127.0.0.1:8082/jeecg-boot' },\n  // 其他数据库\n  '15': { dbUrl: '' },\n};\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '数据源名称',\n    dataIndex: 'name',\n    width: 200,\n    align: 'left',\n  },\n  {\n    title: '数据库类型',\n    dataIndex: 'dbType_dictText',\n    width: 200,\n  },\n  {\n    title: '驱动类',\n    dataIndex: 'dbDriver',\n    width: 200,\n  },\n  {\n    title: '数据源地址',\n    dataIndex: 'dbUrl',\n  },\n  {\n    title: '用户名',\n    dataIndex: 'dbUsername',\n    width: 200,\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'name',\n    label: '数据源名称',\n    component: 'Input',\n    colProps: { span: 8 },\n  },\n  {\n    field: 'dbType',\n    label: '数据库类型',\n    component: 'JDictSelectTag',\n    colProps: { span: 8 },\n    componentProps: () => {\n      return {\n        dictCode: 'database_type',\n      };\n    },\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    field: 'id',\n    label: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    field: 'code',\n    label: '数据源编码',\n    component: 'Input',\n    required: true,\n    dynamicDisabled: ({ values }) => {\n      return !!values.id;\n    },\n  },\n  {\n    field: 'name',\n    label: '数据源名称',\n    component: 'Input',\n    required: true,\n  },\n  {\n    field: 'dbType',\n    label: '数据库类型',\n    component: 'JDictSelectTag',\n    required: true,\n    componentProps: ({ formModel }) => {\n      return {\n        dictCode: 'database_type',\n        onChange: (e: any) => {\n          formModel = Object.assign(formModel, dbDriverMap[e], dbUrlMap[e]);\n        },\n      };\n    },\n  },\n  {\n    field: 'dbDriver',\n    label: '驱动类',\n    required: true,\n    component: 'Input',\n  },\n  {\n    field: 'dbUrl',\n    label: '数据源地址',\n    required: true,\n    component: 'Input',\n  },\n  {\n    field: 'dbUsername',\n    label: '用户名',\n    required: true,\n    component: 'Input',\n  },\n  {\n    field: 'dbPassword',\n    label: '密码',\n    required: true,\n    component: 'InputPassword',\n    slot: 'pwd',\n  },\n  {\n    field: 'remark',\n    label: '备注',\n    component: 'InputTextArea',\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/datasource/index.vue",
    "content": "<template>\n  <div>\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <template #tableTitle>\n        <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"handleAdd\" style=\"margin-right: 5px\">新增</a-button>\n        <a-button type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n        <j-upload-button type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button\n            >批量操作\n            <Icon icon=\"mdi:chevron-down\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getActions(record)\" />\n      </template>\n    </BasicTable>\n    <DataSourceModal @register=\"registerModal\" @success=\"reload\" />\n  </div>\n</template>\n<script lang=\"ts\" name=\"monitor-datasource\" setup>\n  import { ref } from 'vue';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import { getDataSourceList, deleteDataSource, batchDeleteDataSource, getExportUrl, getImportUrl } from './datasource.api';\n  import { columns, searchFormSchema } from './datasource.data';\n  import DataSourceModal from './DataSourceModal.vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  const { createMessage } = useMessage();\n  const [registerModal, { openModal }] = useModal();\n\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext, onImportXls, onExportXls } = useListPage({\n    designScope: 'quartz-template',\n    tableProps: {\n      title: '任务列表',\n      api: getDataSourceList,\n      columns: columns,\n      formConfig: {\n        labelWidth: 120,\n        schemas: searchFormSchema,\n        fieldMapToTime: [['fieldTime', ['beginDate', 'endDate'], 'YYYY-MM-DD HH:mm:ss']],\n      },\n    },\n    exportConfig: {\n      name: '数据源列表',\n      url: getExportUrl,\n    },\n    importConifg: {\n      url: getImportUrl,\n    },\n  });\n\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;\n\n  /**\n   * 操作列定义\n   * @param record\n   */\n  function getActions(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n\n  /**\n   * 新增事件\n   */\n  function handleAdd() {\n    openModal(true, {\n      isUpdate: false,\n    });\n  }\n\n  /**\n   * 编辑事件\n   */\n  function handleEdit(record) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteDataSource({ id: record.id }, reload);\n  }\n\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDeleteDataSource({ ids: selectedRowKeys.value }, reload);\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/disk/DiskInfo.vue",
    "content": "<template>\n  <Skeleton v-if=\"spinning\" active />\n  <div v-else>\n    <a-row>\n      <template v-if=\"diskInfo && diskInfo.length > 0\">\n        <a-col :span=\"6\" v-for=\"(item, index) in diskInfo\" :key=\"'diskInfo' + index\">\n          <gauge :data=\"item\"></gauge>\n        </a-col>\n      </template>\n    </a-row>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { onMounted, ref } from 'vue';\n  import { Skeleton } from 'ant-design-vue';\n  import { queryDiskInfo } from './disk.api';\n  import gauge from './gauge.vue';\n\n  const diskInfo = ref([]);\n  const spinning = ref(true);\n\n  function loadRedisInfo() {\n    queryDiskInfo()\n      .then((res) => {\n        for (let i = 0; i < res.length; i++) {\n          // 当前算法算的是磁盘的已使用空间\n          res[i].restPPT = 100 - parseInt(String((res[i].rest / res[i].max) * 100));\n        }\n        diskInfo.value = res;\n      })\n      .finally(() => (spinning.value = false));\n  }\n\n  onMounted(() => {\n    loadRedisInfo();\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/disk/disk.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\n\nenum Api {\n  queryDiskInfo = '/sys/actuator/redis/queryDiskInfo',\n}\n\n/**\n * 详细信息\n */\nexport const queryDiskInfo = () => {\n  return defHttp.get({ url: Api.queryDiskInfo }, { successMessageMode: 'none' });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/disk/gauge.vue",
    "content": "<template>\n  <div>\n    <div ref=\"chartRef\" style=\"width: 100%; height: 400px\"></div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { onMounted, ref, reactive, Ref } from 'vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useECharts } from '/@/hooks/web/useECharts';\n  import { GaugeChart } from 'echarts/charts';\n\n  const props = defineProps({ data: {} });\n  const dataSource = ref([]);\n  const chartRef = ref<HTMLDivElement | null>(null);\n  const { setOptions, echarts } = useECharts(chartRef as Ref<HTMLDivElement>);\n  const loading = ref(false);\n  const { createMessage } = useMessage();\n  const option = reactive({\n    series: [\n      {\n        type: 'gauge',\n        progress: {\n          show: true,\n          width: 18,\n        },\n        axisLine: {\n          lineStyle: {\n            width: 18,\n          },\n        },\n        axisTick: {\n          show: true,\n        },\n        splitLine: {\n          length: 15,\n          lineStyle: {\n            width: 2,\n            color: '#999',\n          },\n        },\n        axisLabel: {\n          distance: 25,\n          color: '#999',\n          fontSize: 15,\n        },\n        anchor: {\n          show: true,\n          showAbove: true,\n          size: 25,\n          itemStyle: {\n            borderWidth: 10,\n          },\n        },\n        title: {},\n        detail: {\n          valueAnimation: true,\n          fontSize: 50,\n          formatter: '{value}%',\n          offsetCenter: [0, '80%'],\n        },\n        data: [\n          {\n            value: 70,\n            name: '本地磁盘',\n          },\n        ],\n      },\n    ],\n  });\n\n  function initCharts() {\n    option.series[0].data[0].name = props.data.name;\n    option.series[0].data[0].value = props.data.restPPT;\n    setOptions(option);\n  }\n\n  onMounted(() => {\n    console.info(props.data);\n    echarts.use(GaugeChart);\n    initCharts();\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/log/index.vue",
    "content": "<template>\n  <BasicTable :ellipsis=\"true\" @register=\"registerTable\" :searchInfo=\"searchInfo\" :columns=\"logColumns\" :expand-column-width=\"16\">\n    <template #tableTitle>\n      <div class=\"table-title-bar\">\n        <a-tabs defaultActiveKey=\"4\" @change=\"tabChange\" size=\"small\">\n          <a-tab-pane tab=\"异常日志\" key=\"4\"></a-tab-pane>\n          <a-tab-pane tab=\"登录日志\" key=\"1\"></a-tab-pane>\n          <a-tab-pane tab=\"操作日志\" key=\"2\"></a-tab-pane>\n        </a-tabs>\n        <span class=\"export-btn\" v-if=\"searchInfo.logType == 2\">\n          <a-tooltip>\n            <template #title>导出</template>\n            <a-button  type=\"text\" preIcon=\"ant-design:download-outlined\" shape=\"circle\" @click=\"onExportXls\" />\n          </a-tooltip>\n        </span>\n      </div>\n    </template>\n    <template #expandedRowRender=\"{ record }\">\n      <div v-if=\"searchInfo.logType == 2\">\n        <div style=\"margin-bottom: 5px\">\n          <a-badge status=\"success\" style=\"vertical-align: middle\" />\n          <span style=\"vertical-align: middle\">请求方法:{{ record.method }}</span></div\n        >\n        <div>\n          <a-badge status=\"processing\" style=\"vertical-align: middle\" />\n          <span style=\"vertical-align: middle\">请求参数:{{ record.requestParam }}</span></div\n        >\n      </div>\n      <div v-if=\"searchInfo.logType == 4\">\n        <div style=\"margin-bottom: 5px\">\n          <a-badge status=\"success\" style=\"vertical-align: middle\" />\n          <span class=\"error-box\" style=\"vertical-align: middle\">异常堆栈:{{ record.requestParam }}</span>\n        </div>\n      </div>\n    </template>\n  </BasicTable>\n</template>\n<script lang=\"ts\" name=\"monitor-log\" setup>\n  import { ref } from 'vue';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { getLogList, getExportUrl } from './log.api';\n  import {\n    columns,\n    searchFormSchema,\n    operationLogColumn,\n    operationSearchFormSchema,\n    exceptionColumns\n  } from './log.data';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  const { createMessage } = useMessage();\n  const checkedKeys = ref<Array<string | number>>([]);\n\n  const logColumns = ref<any>(exceptionColumns);\n  const searchSchema = ref<any>(searchFormSchema);\n  const searchInfo = { logType: '4' };\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext, onExportXls } = useListPage({\n    designScope: 'user-list',\n    tableProps: {\n      title: '日志列表',\n      api: getLogList,\n      expandRowByClick: true,\n      showActionColumn: false,\n      rowSelection: {\n        columnWidth: 20,\n      },\n      formConfig: {\n        schemas: searchSchema,\n        fieldMapToTime: [['fieldTime', ['createTime_begin', 'createTime_end'], 'YYYY-MM-DD']],\n      },\n    },\n    exportConfig: {\n      name:\"操作日志\",\n      url: getExportUrl,\n      params: searchInfo,\n      timeout: 300000, // 设置超时时间为5分钟(300秒)\n    },\n  });\n\n  const [registerTable, { reload }] = tableContext;\n\n  // 日志类型\n  function tabChange(key) {\n    searchInfo.logType = key;\n    // 代码逻辑说明: [VUEN-943]vue3日志管理列表翻译不对------------\n    if (key == '2') {\n      logColumns.value = operationLogColumn;\n      searchSchema.value = operationSearchFormSchema;\n    }else if(key == '4'){\n      searchSchema.value = searchFormSchema;\n      logColumns.value = exceptionColumns;\n    } else {\n      searchSchema.value = searchFormSchema;\n      logColumns.value = columns;\n    }\n    reload();\n  }\n\n  /**\n   * 选择事件\n   */\n  function onSelectChange(selectedRowKeys: (string | number)[]) {\n    checkedKeys.value = selectedRowKeys;\n  }\n</script>\n<style lang=\"less\" scoped>\n  .error-box {\n    white-space: break-spaces;\n  }\n  .table-title-bar {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    width: 100%;\n  }\n  .export-btn {\n    margin-left: auto;\n  }\n  :deep(.jeecg-basic-table-header__toolbar){\n    width:100px !important;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/log/log.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\n\nenum Api {\n  list = '/sys/log/list',\n  exportXls = '/sys/log/exportXls',\n}\n\n/**\n * 查询日志列表\n * @param params\n */\nexport const getLogList = (params) => {\n  return defHttp.get({ url: Api.list, params });\n};\n\n\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/log/log.data.ts",
    "content": "import { BasicColumn, FormSchema } from '/@/components/Table';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '日志内容',\n    dataIndex: 'logContent',\n    width: 100,\n    align: 'left',\n  },\n  {\n    title: '操作人ID',\n    dataIndex: 'userid',\n    width: 80,\n  },\n  {\n    title: '操作人',\n    dataIndex: 'username',\n    width: 80,\n  },\n  {\n    title: 'IP',\n    dataIndex: 'ip',\n    width: 80,\n  },\n  {\n    title: '耗时(毫秒)',\n    dataIndex: 'costTime',\n    width: 80,\n  },\n  {\n    title: '创建时间',\n    dataIndex: 'createTime',\n    sorter: true,\n    width: 80,\n  },\n  {\n    title: '客户端类型',\n    dataIndex: 'clientType_dictText',\n    width: 60,\n  },\n];\n\n/**\n * 操作日志需要操作类型\n */\nexport const operationLogColumn: BasicColumn[] = [\n  ...columns,\n  {\n    title: '操作类型',\n    dataIndex: 'operateType_dictText',\n    width: 40,\n  },\n];\n\nexport const exceptionColumns: BasicColumn[] = [\n  {\n    title: '异常标题',\n    dataIndex: 'logContent',\n    width: 100,\n    align: 'left',\n  },\n  {\n    title: '请求地址',\n    dataIndex: 'requestUrl',\n    width: 100,\n  },\n  {\n    title: '请求参数',\n    dataIndex: 'method',\n    width: 60,\n  },\n  {\n    title: '操作人',\n    dataIndex: 'username',\n    width: 60,\n    customRender: ({ record }) => {\n      let pname = record.username;\n      let pid = record.userid;\n      if(!pname && !pid){\n        return \"\";\n      }\n      return pname + \" (账号: \"+ pid + \" )\";\n    },\n  },\n  {\n    title: 'IP',\n    dataIndex: 'ip',\n    width: 60,\n  },\n  {\n    title: '创建时间',\n    dataIndex: 'createTime',\n    sorter: true,\n    width: 60,\n  },\n  {\n    title: '客户端类型',\n    dataIndex: 'clientType_dictText',\n    width: 60,\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'keyWord',\n    label: '搜索日志',\n    component: 'Input',\n    colProps: { span: 8 },\n  },\n  {\n    field: 'fieldTime',\n    component: 'RangePicker',\n    label: '创建时间',\n    componentProps: {\n      valueType: 'Date',\n    },\n    colProps: {\n      span: 6,\n    },\n  },\n];\n\nexport const operationSearchFormSchema: FormSchema[] = [\n  ...searchFormSchema,\n  {\n    field: 'operateType',\n    label: '操作类型',\n    component: 'JDictSelectTag',\n    colProps: { span: 4 },\n    componentProps: {\n      dictCode: 'operate_type',\n    },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/mynews/DetailModal.vue",
    "content": "<template>\n  <BasicModal\n    v-bind=\"$attrs\"\n    @register=\"registerModal\"\n    title=\"查看详情\"\n    :width=\"800\"\n    :minHeight=\"600\"\n    :showCancelBtn=\"false\"\n    :showOkBtn=\"false\"\n    :height=\"88\"\n    :destroyOnClose=\"true\"\n    @visible-change=\"handleVisibleChange\"\n  >\n   <template #title>\n     <span class=\"basic-title\">查看详情</span>\n     <div class=\"print-btn\" @click=\"onPrinter\">\n       <Icon icon=\"ant-design:printer-filled\" />\n       <span class=\"print-text\">打印</span>\n     </div>\n   </template>\n    <a-card class=\"daily-article\">\n      <a-card-meta :title=\"content.titile\">\n        <template #description>\n          <div class=\"article-desc\">\n            <span>发布人：{{ content.sender }}</span>\n            <span>发布时间：{{ content.sendTime }}</span>\n            <span v-if=\"content.visitsNum\">\n              <a-tooltip placement=\"top\" title=\"访问次数\" :autoAdjustOverflow=\"true\">\n                <eye-outlined class=\"item-icon\" /> {{ content.visitsNum }}\n              </a-tooltip>\n            </span>\n          </div>\n        </template>\n      </a-card-meta>\n      <a-divider />\n      <div v-html=\"content.msgContent\" class=\"article-content\"></div>\n      <div>\n        <a-button v-if=\"hasHref\" @click=\"jumpToHandlePage\">前往办理<ArrowRightOutlined /></a-button>\n      </div>\n    </a-card>\n    <template v-if=\"noticeFiles && noticeFiles.length > 0\">\n      <div class=\"files-title\">相关附件：</div>\n      <template v-for=\"(file, index) in noticeFiles\" :key=\"index\">\n        <div class=\"files-area\">\n          <div class=\"files-area-text\">\n            <span>\n              <paper-clip-outlined />\n              <a\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n                :title=\"file.fileName\"\n                :href=\"getFileAccessHttpUrl(file.filePath)\"\n                class=\"ant-upload-list-item-name\"\n                >{{ file.fileName }}</a\n              >\n            </span>\n          </div>\n          <div class=\"files-area-operate\">\n            <download-outlined class=\"item-icon\" @click=\"handleDownloadFile(file.filePath)\" />\n            <eye-outlined class=\"item-icon\" @click=\"handleViewFile(file.filePath)\" />\n          </div>\n        </div>\n      </template>\n      <a v-if=\"noticeFiles.length > 1\" :href=\"downLoadFiles + '?id=' + content.id + '&token=' + getToken()\" target=\"_blank\" style=\"margin: 15px 6px; color: #5ac0fa\">\n        <download-outlined class=\"item-icon\" style=\"margin-right: 5px\" /><span>批量下载所有附件</span>\n      </a>\n    </template>\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { ArrowRightOutlined, PaperClipOutlined, DownloadOutlined, EyeOutlined } from '@ant-design/icons-vue';\n  import { addVisitsNum } from '@/views/system/notice/notice.api';\n  import { useRouter } from 'vue-router';\n  import xss from 'xss';\n  import { options } from './XssWhiteList';\n  import { ref, unref } from 'vue';\n  import { getElectronFileUrl, getFileAccessHttpUrl } from '@/utils/common/compUtils';\n  import { useGlobSetting } from '@/hooks/setting';\n  import { encryptByBase64 } from '@/utils/cipher';\n  import { getToken } from '@/utils/auth';\n  import {defHttp} from \"@/utils/http/axios\";\n  import {$electron} from \"@/electron\";\n  const router = useRouter();\n  const glob = useGlobSetting();\n  const isUpdate = ref(true);\n  const content = ref<any>({});\n  const noticeFiles = ref([]);\n  /**\n   * 下载文件路径\n   */\n  const downLoadFiles = `${glob.domainUrl}/sys/annountCement/downLoadFiles`;\n  const emit = defineEmits(['close', 'register']);\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    isUpdate.value = !!data?.isUpdate;\n    noticeFiles.value = [];\n    if (unref(isUpdate)) {\n      //data.record.msgContent = '<p>2323</p><input onmouseover=alert(1)>xss test';\n      // 代码逻辑说明: VUEN-1702 【禁止问题】sql注入漏洞\n      if (data.record.msgContent) {\n        // 代码逻辑说明: 【QQYUN-7049】3.6.0版本 通知公告中发布的富文本消息，在我的消息中查看没有样式---\n        data.record.msgContent = xss(data.record.msgContent, options);\n      }\n\n      // 代码逻辑说明: [QQYUN-12521]通知公告消息增加访问量\n      if (!data.record?.busId) {\n        await addVisitsNum({ id: data.record.id });\n      }\n\n      content.value = data.record;\n      if(content.value.sender){\n        const userInfo = await defHttp.get({ url: '/sys/user/queryUserComponentData?isMultiTranslate=true', params: { username: content.value.sender } });\n        content.value.sender = userInfo && userInfo?.records && userInfo?.records.length>0\n            ?userInfo.records.find((item) => item.username === content.value.sender)?.realname : content.value.sender;\n      }\n      console.log('data---------->>>', data);\n      if (data.record?.files && data.record?.files.length > 0) {\n        noticeFiles.value = data.record.files.split(',').map((item) => {\n          return {\n            fileName: item.split('/').pop(),\n            filePath: item,\n          };\n        });\n      }\n      showHrefButton();\n    }\n  });\n\n  const hasHref = ref(false);\n  //查看消息详情可以跳转\n  function showHrefButton() {\n    if (content.value.busId) {\n      hasHref.value = true;\n    }\n  }\n  //跳转至办理页面\n  function jumpToHandlePage() {\n    let temp: any = content.value;\n    if (temp.busId) {\n      //这个busId是 任务ID\n      let jsonStr = temp.msgAbstract;\n      let query = {};\n      try {\n        if (jsonStr) {\n          let temp = JSON.parse(jsonStr);\n          if (temp) {\n            Object.keys(temp).map((k) => {\n              query[k] = temp[k];\n            });\n          }\n        }\n      } catch (e) {\n        console.log('参数解析异常', e);\n      }\n\n      console.log('query', query, jsonStr);\n      console.log('busId', temp.busId);\n\n      if (Object.keys(query).length > 0) {\n        // taskId taskDefKey procInsId\n        router.push({ path: '/task/handle/' + temp.busId, query: query });\n      } else {\n        router.push({ path: '/task/handle/' + temp.busId });\n      }\n    }\n    closeModal();\n  }\n  //打印\n  function onPrinter() {\n    // 获取要打印的内容\n    const printContent = document.querySelector('.daily-article');\n\n    if (!printContent) return;\n\n    // 创建一个iframe来处理打印\n    const printFrame = document.createElement('iframe');\n    printFrame.style.position = 'absolute';\n    printFrame.style.width = '0';\n    printFrame.style.height = '0';\n    printFrame.style.border = 'none';\n    printFrame.style.left = '-9999px';\n\n    printFrame.onload = function () {\n      const frameDoc = printFrame.contentDocument || printFrame.contentWindow?.document;\n      if (!frameDoc) return;\n\n      // 复制内容到iframe\n      const clone = printContent.cloneNode(true);\n      frameDoc.body.appendChild(clone);\n\n      // 添加打印样式\n      const style = frameDoc.createElement('style');\n      style.innerHTML = `\n        body {\n          margin: 0;\n          padding: 15px;\n          font-family: Arial, sans-serif;\n        }\n        img {\n          max-width: 100%;\n          height: auto;\n        }\n        @page {\n          size: auto;\n          margin: 15mm;\n        }\n        @media print {\n          body {\n            padding: 0;\n          }\n        }\n        .ant-card-meta-detail {\n            display: flex !important ;\n            justify-content: center !important;\n            align-items: center !important;\n            flex-direction: column !important;\n        }\n        .ant-card-meta-title {\n            font-size: 22px !important;\n            color: rgba(51, 51, 51, 0.88);\n            font-weight: 600;\n            font-size: 16px;\n            overflow: hidden;\n            white-space: nowrap;\n            text-overflow: ellipsis;\n        }\n        .ant-card .ant-card-meta-description {\n            color: rgba(51, 51, 51, 0.45);\n        }\n      `;\n      frameDoc.head.appendChild(style);\n\n      // 确保图片加载完成\n      const images = frameDoc.getElementsByTagName('img');\n      let imagesToLoad = images.length;\n\n      const printWhenReady = () => {\n        if (imagesToLoad === 0) {\n          setTimeout(() => {\n            printFrame.contentWindow?.focus();\n            printFrame.contentWindow?.print();\n            document.body.removeChild(printFrame);\n          }, 300);\n        }\n      };\n\n      if (imagesToLoad === 0) {\n        printWhenReady();\n      } else {\n        Array.from(images).forEach((img) => {\n          img.onload = () => {\n            imagesToLoad--;\n            printWhenReady();\n          };\n          // 处理可能已经缓存的图片\n          if (img.complete && img.naturalWidth !== 0) {\n            imagesToLoad--;\n            printWhenReady();\n          }\n        });\n      }\n    };\n\n    document.body.appendChild(printFrame);\n  }\n\n  /**\n   * 下载文件\n   * @param filePath\n   */\n  function handleDownloadFile(filePath) {\n    window.open(getFileAccessHttpUrl(filePath), '_blank');\n  }\n  /**\n   * 预览文件\n   * @param filePath\n   */\n  function handleViewFile(filePath) {\n    if (filePath) {\n      console.log('glob.onlineUrl', glob.viewUrl);\n      let url = encodeURIComponent(encryptByBase64(filePath));\n      let previewUrl = `${glob.viewUrl}?url=` + url;\n      //update-begin-author:liusq---date:2025-12-16--for: JHHB-1139桌面端 文件预览统一修改 \n      if($electron.isElectron()){\n        previewUrl = getElectronFileUrl(filePath);\n      }\n      //update-end-author:liusq---date:2025-12-16--for: JHHB-1139桌面端 文件预览统一修改\n      window.open(previewUrl, '_blank');\n    }\n  }\n\n  function handleVisibleChange(visible: boolean) {\n    if (!visible) {\n      emit('close');\n    }\n  }\n</script>\n\n<style scoped lang=\"less\">\n  .daily-article {\n    :deep(.ant-card-meta-detail) {\n      display: flex !important;\n      justify-content: center !important;\n      align-items: center !important;\n      flex-direction: column !important;\n    }\n    :deep(.ant-card-meta-detail .ant-card-meta-title) {\n      font-size: 22px !important;\n    }\n  }\n\n  .print-btn {\n    position: absolute;\n    right: 100px;\n    top: 20px;\n    cursor: pointer;\n    color: #a3a3a5;\n    z-index: 999;\n    .print-text {\n      margin-left: 5px;\n      font-size: 14px;\n    }\n    &:hover {\n      color: #40a9ff;\n    }\n  }\n  .detail-iframe {\n    border: 0;\n    width: 100%;\n    height: 100%;\n    min-height: 600px;\n  }\n  .files-title {\n    font-size: 16px;\n    margin: 10px;\n    font-weight: 600;\n    color: #333;\n  }\n  .files-area {\n    display: flex;\n    align-items: center;\n    justify-content: flex-start;\n    margin: 6px;\n    &:hover {\n      background-color: #f5f5f5;\n    }\n    .files-area-text {\n      display: flex;\n      .ant-upload-list-item-name {\n        margin: 0 6px;\n        color: #56befa;\n      }\n    }\n    .files-area-operate {\n      display: flex;\n      margin-left: 10px;\n      .item-icon {\n        cursor: pointer;\n        margin: 0 6px;\n        &:hover {\n          color: #56befa;\n        }\n      }\n    }\n  }\n\n  .article-desc {\n    display: flex;\n    align-items: center;\n    span:not(:first-child) {\n      margin-left: 5px;\n    }\n  }\n  /* 确保打印内容中的图片有最大宽度限制 */\n  .article-content img {\n    max-width: 100%;\n    height: auto;\n  }\n  .basic-title{\n    position: relative;\n    display: flex;\n    padding-left: 7px;\n    font-size: 16px;\n    font-weight: 500;\n    line-height: 24px;\n    color: rgba(0,0,0,0.88);\n    cursor: move;\n    -webkit-user-select: none;\n    -moz-user-select: none;\n    user-select: none;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/mynews/DynamicNotice.vue",
    "content": "<template>\n  <component :is=\"currentModal\" :formData=\"formData\" v-model:visible=\"modalVisible\"></component>\n</template>\n<script setup lang=\"ts\" name=\"dynamic-notice\">\n  import { ref, shallowRef, ComponentOptions, nextTick, defineAsyncComponent } from 'vue';\n  const props = defineProps({\n    path: { type: String, default: '' },\n    formData: { type: Object, default: {} },\n  });\n  const modalVisible = ref<Boolean>(false);\n  const currentModal = shallowRef<Nullable<ComponentOptions>>(null);\n  const formData = ref<any>(props.formData);\n\n  const componentType = {\n  };\n\n  /**\n   * 跟换组件和传值事件\n   */\n  function detail() {\n    setTimeout(() => {\n      if (props.path) {\n        nextTick(() => {\n          currentModal.value = componentType[props.path];\n          formData.value = props.formData;\n          modalVisible.value = true;\n        });\n      }\n    }, 200);\n  }\n\n  defineExpose({\n    detail,\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/mynews/XssWhiteList.ts",
    "content": "//xss攻击白名单列表\nexport const options = {\n  whiteList: {\n    h1: ['style'],\n    h2: ['style'],\n    h3: ['style'],\n    h4: ['style'],\n    h5: ['style'],\n    h6: ['style'],\n    hr: ['style'],\n    span: ['style'],\n    strong: ['style'],\n    b: ['style'],\n    i: ['style'],\n    br: [],\n    p: ['style'],\n    pre: ['style'],\n    code: ['style'],\n    a: ['style', 'target', 'href', 'title', 'rel'],\n    img: ['style', 'src', 'title','width','height'],\n    div: ['style'],\n    table: ['style', 'width', 'border', 'height'],\n    tr: ['style'],\n    td: ['style', 'width', 'colspan'],\n    th: ['style', 'width', 'colspan'],\n    tbody: ['style'],\n    ul: ['style'],\n    li: ['style'],\n    ol: ['style'],\n    dl: ['style'],\n    dt: ['style'],\n    em: ['style'],\n    cite: ['style'],\n    section: ['style'],\n    header: ['style'],\n    footer: ['style'],\n    blockquote: ['style'],\n    audio: ['autoplay', 'controls', 'loop', 'preload', 'src'],\n    video: ['autoplay', 'controls', 'loop', 'preload', 'src', 'height', 'width'],\n  },\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/mynews/index.vue",
    "content": "<template>\n  <div>\n    <BasicTable @register=\"registerTable\" :searchInfo=\"searchInfo\" :rowSelection=\"rowSelection\">\n      <template #tableTitle>\n        <a-button type=\"primary\" @click=\"handlerReadAllMsg\">全部标注已读</a-button>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button>\n            批量操作\n            <Icon icon=\"mdi:chevron-down\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getActions(record)\" />\n      </template>\n    </BasicTable>\n    <DetailModal @register=\"register\" />\n    <keep-alive>\n      <component v-if=\"currentModal\" v-bind=\"bindParams\" :key=\"currentModal\" :is=\"currentModal\" @register=\"modalRegCache[currentModal].register\" />\n    </keep-alive>\n  </div>\n</template>\n<script lang=\"ts\" name=\"monitor-mynews\" setup>\nimport {ref, onMounted, unref} from 'vue';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import DetailModal from './DetailModal.vue';\n  import { getMyNewsList, editCementSend, syncNotic, readAllMsg, getOne, deleteAnnSend, deleteBatchAnnSend } from './mynews.api';\n  import { columns, searchFormSchema } from './mynews.data';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { getToken } from '/@/utils/auth';\n  import { useModal } from '/@/components/Modal';\n  import { useGlobSetting } from '/@/hooks/setting';\n  const glob = useGlobSetting();\n  const { createMessage } = useMessage();\n  const checkedKeys = ref<Array<string | number>>([]);\n  const content = ref({});\n  const searchInfo = { logType: '1' };\n  const [register, { openModal: openDetail }] = useModal();\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { getLogList } from '/@/views/monitor/log/log.api';\n  import { useRouter } from 'vue-router';\n  import { useAppStore } from '/@/store/modules/app';\n  import { useMessageHref } from '/@/views/system/message/components/useSysMessage';\n  const appStore = useAppStore();\n  const router = useRouter();\n  const { currentRoute } = useRouter();\n  const { goPage, currentModal, modalRegCache, bindParams } = useMessageHref();\n  // 代码逻辑说明: 【QQYUN-13058】我的消息区分类型且支持根据url参数查询类型\n  const querystring = currentRoute.value.query;\n  const findItem: any = searchFormSchema.find((item: any) => item.field === 'msgCategory');\n  if (findItem) {\n    if (querystring?.msgCategory) {\n      findItem.componentProps.defaultValue = querystring.msgCategory\n    } else if (querystring.noticeType) {\n      findItem.componentProps.defaultValue = querystring.noticeType;\n    } else {\n      findItem.componentProps.defaultValue = null\n    }\n  }\n  const { prefixCls, tableContext } = useListPage({\n    designScope: 'mynews-list',\n    tableProps: {\n      title: '我的消息',\n      api: getMyNewsList,\n      columns: columns,\n      formConfig: {\n        schemas: searchFormSchema,\n        // 代码逻辑说明: 【TV360X-545】我的消息列表不能通过时间范围查询---\n        fieldMapToTime: [['sendTime', ['sendTimeBegin', 'sendTimeEnd'], 'YYYY-MM-DD']],\n      },\n      beforeFetch: (params) => {\n        // 代码逻辑说明: 【QQYUN-13058】我的消息区分类型且支持根据url参数查询类型\n        if (params.msgCategory) {\n          if (['1', '2'].includes(params.msgCategory)) {\n            params.msgCategory = params.msgCategory;\n          } else {\n            params.noticeType = params.msgCategory;\n            delete params.msgCategory;\n          }\n        } else {\n          if (querystring?.msgCategory) {\n            params.msgCategory = querystring.msgCategory;\n          } else if (querystring.noticeType) {\n            params.noticeType = querystring.noticeType;\n          }\n        }\n        return params;\n      },\n    },\n  });\n  const [registerTable, { reload }, { rowSelection, selectedRows, selectedRowKeys }] = tableContext;\n  /**\n   * 操作列定义\n   * @param record\n   */\n  function getActions(record) {\n    return [\n      {\n        label: '查看',\n        onClick: handleDetail.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record.id),\n        },\n        ifShow: record.readFlag === 1\n      }\n    ];\n  }\n\n  /**\n   * 查看\n   */\n  function handleDetail(record) {\n    let anntId = record.anntId;\n    editCementSend({ anntId: anntId }).then((res) => {\n      reload();\n      syncNotic({ anntId: anntId });\n    });\n    const openModalFun = ()=>{\n      openDetail(true, {\n        record,\n        isUpdate: true,\n      });\n    }\n    goPage(record, openModalFun);\n\n  }\n  // 日志类型\n  function callback(key) {\n    searchInfo.logType = key;\n    reload();\n  }\n\n  //全部标记已读\n  function handlerReadAllMsg() {\n    readAllMsg({}, reload);\n  }\n\n  /**\n   * 选择事件\n   */\n  function onSelectChange(selectedRowKeys: (string | number)[]) {\n    checkedKeys.value = selectedRowKeys;\n  }\n\n  // 代码逻辑说明: 消息跳转，打开详情表单\n  onMounted(()=>{\n    initHrefModal();\n  });\n  function initHrefModal(){\n    let params = appStore.getMessageHrefParams;\n    if(params){\n      let anntId = params.id;\n      if(anntId){\n        editCementSend({ anntId: anntId }).then(() => {\n          reload();\n          syncNotic({ anntId: anntId });\n        });\n      }\n      let detailId = params.detailId;\n      if(detailId){\n        getOne(detailId).then(data=>{\n          console.log('getOne', data)\n          openDetail(true, {\n            record: data,\n            isUpdate: true,\n          });\n          appStore.setMessageHrefParams('')\n        })\n      }\n    }\n  }\n\n  function handleSuccess() {\n    selectedRowKeys.value = [];\n    reload();\n  }\n  \n  /**\n   * 删除我的消息\n   * \n   * @param id\n   */\n  async function handleDelete(id) {\n    await deleteAnnSend({ id: id }, handleSuccess);\n  }\n\n  /**\n   * 批量删除我的消息\n   */\n  async function batchHandleDelete() {\n    let unRead = unref(selectedRows).filter((item) => item.readFlag == 0);\n    if (unref(unRead).length > 0) {\n      createMessage.warning('未阅读的消息禁止删除！');\n      return;\n    }\n    await deleteBatchAnnSend({ ids: selectedRowKeys.value }, handleSuccess);\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/mynews/mynews.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { Modal } from 'ant-design-vue';\n\nenum Api {\n  list = '/sys/sysAnnouncementSend/getMyAnnouncementSend',\n  editCementSend = '/sys/sysAnnouncementSend/editByAnntIdAndUserId',\n  readAllMsg = '/sys/sysAnnouncementSend/readAll',\n  syncNotic = '/sys/annountCement/syncNotic',\n  getOne = '/sys/sysAnnouncementSend/getOne',\n  delete = '/sys/sysAnnouncementSend/delete',\n  deleteBatch = '/sys/sysAnnouncementSend/deleteBatch',\n}\n\n/**\n * 查询消息列表\n * @param params\n */\nexport const getMyNewsList = (params) => {\n  return defHttp.get({ url: Api.list, params });\n};\n\n/**\n * 更新用户系统消息阅读状态\n * @param params\n */\nexport const editCementSend = (params) => {\n  return defHttp.put({ url: Api.editCementSend, params });\n};\n\n/**\n * 一键已读\n * @param params\n */\nexport const readAllMsg = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认操作',\n    content: '是否全部标注已读?',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.put({ url: Api.readAllMsg, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n\n/**\n * 同步消息\n * @param params\n */\nexport const syncNotic = (params) => {\n  return defHttp.get({ url: Api.syncNotic, params });\n};\n\n/**\n * 根据消息发送记录ID获取消息内容\n * @param sendId\n */\nexport const getOne = (sendId) => {\n  return defHttp.get({ url: Api.getOne, params:{sendId} });\n};\n\n/**\n * 删除用户通告阅读标记的数据\n * @param params\n * @param handleSuccess\n */\nexport const deleteAnnSend = (params, handleSuccess) =>{\n  return defHttp.delete({ url: Api.delete, params }, { joinParamsToUrl: true }).then(()=>{\n    handleSuccess();\n  })\n}\n\n/**\n * 批量删除用户通告阅读标记的数据\n * @param params\n * @param handleSuccess\n */\nexport const deleteBatchAnnSend = (params, handleSuccess) =>{\n  Modal.confirm({\n    iconType: 'warning',\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.deleteBatch, params }, { joinParamsToUrl: true }).then(()=>{\n        handleSuccess();\n      })\n    },\n  });\n}\n\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/mynews/mynews.data.ts",
    "content": "import { BasicColumn, FormSchema } from '/@/components/Table';\nimport { render } from '/@/utils/common/renderUtils';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '标题',\n    dataIndex: 'titile',\n    width: 100,\n    align: 'left',\n  },\n  {\n    title: '消息类型',\n    dataIndex: 'msgCategory',\n    width: 80,\n    customRender: ({ text }) => {\n      return render.renderDictNative(\n        text,\n        [\n          { label: '通知公告', value: '1', color: 'blue' },\n          { label: '系统消息', value: '2' },\n        ],\n        true\n      );\n    },\n  },\n  {\n    title: '发布人',\n    dataIndex: 'sender',\n    width: 80,\n  },\n  {\n    title: '发布时间',\n    dataIndex: 'sendTime',\n    width: 80,\n  },\n  {\n    title: '优先级',\n    dataIndex: 'priority',\n    width: 80,\n    customRender: ({ text }) => {\n      const color = text == 'L' ? 'blue' : text == 'M' ? 'yellow' : 'red';\n      return render.renderTag(render.renderDict(text, 'priority'), color);\n    },\n  },\n  {\n    title: '阅读状态',\n    dataIndex: 'readFlag',\n    width: 80,\n    customRender: ({ text }) => {\n      return render.renderDictNative(\n        text,\n        [\n          { label: '未读', value: '0', color: 'red' },\n          { label: '已读', value: '1' },\n        ],\n        true\n      );\n    },\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'titile',\n    label: '标题',\n    component: 'Input',\n    colProps: { span: 6 },\n  },\n  {\n    field: 'sender',\n    label: '发布人',\n    component: 'Input',\n    colProps: { span: 6 },\n  },\n  {\n    field: 'sendTime',\n    label: '发布时间',\n    component: 'RangeDate',\n    componentProps: {\n      valueType: 'Date',\n    },\n    colProps: { span: 6 },\n  },\n  {\n    field: 'msgCategory',\n    label: '消息类型',\n    component: 'Select',\n    componentProps: {\n      options: [\n        { label: '通知公告', value: '1' },\n        { label: '系统消息', value: '2' },\n        { label: '日程计划', value: 'plan' },\n        { label: '流程消息', value: 'flow' },\n        { label: '会议', value: 'meeting' },\n        { label: '知识库', value: 'file' },\n        { label: '协同通知', value: 'collab' },\n        { label: '督办通知', value: 'supe' },\n      ],\n    },\n    colProps: { span: 6 },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/quartz/QuartzModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"title\" @ok=\"handleSubmit\" width=\"40%\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { formSchema } from './quartz.data';\n  import { saveOrUpdateQuartz, getQuartzById } from './quartz.api';\n  import { isJsonObjectString } from '/@/utils/is';\n  // Emits声明\n  const emit = defineEmits(['register', 'success']);\n  const isUpdate = ref(true);\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n    // labelWidth: 150,\n    schemas: formSchema,\n    showActionButtonGroup: false,\n    // 代码逻辑说明: 【issues/790】弹窗内文本框不居中问题\n    labelWidth: 100,\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false });\n    isUpdate.value = !!data?.isUpdate;\n    if (unref(isUpdate)) {\n      //获取详情\n      //data.record = await getQuartzById({id: data.record.id});\n      try {\n        data.record.paramterType = isJsonObjectString(data?.record?.parameter) ? 'json' : 'string';\n      } catch (e) {\n        console.log(e);\n      }\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n    }\n  });\n  //设置标题\n  const title = computed(() => (!unref(isUpdate) ? '新增任务' : '编辑任务'));\n  //表单提交事件\n  async function handleSubmit(v) {\n    try {\n      let values = await validate();\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      await saveOrUpdateQuartz(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/quartz/index.vue",
    "content": "<template>\n  <div>\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <template #tableTitle>\n        <a-button preIcon=\"ant-design:plus-outlined\" type=\"primary\" @click=\"handleAdd\" style=\"margin-right: 5px\">新增</a-button>\n        <a-button type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n        <j-upload-button type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button\n            >批量操作\n            <Icon icon=\"mdi:chevron-down\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getActions(record)\" :dropDownActions=\"getDropDownAction(record)\" />\n      </template>\n    </BasicTable>\n    <QuartzModal @register=\"registerModal\" @success=\"reload\" />\n  </div>\n</template>\n<script lang=\"ts\" name=\"monitor-quartz\" setup>\n  import { ref } from 'vue';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { getQuartzList, deleteQuartz, batchDeleteQuartz, executeImmediately, resumeJob, pauseJob, getExportUrl, getImportUrl } from './quartz.api';\n  import { columns, searchFormSchema } from './quartz.data';\n  import QuartzModal from './QuartzModal.vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  const { createMessage } = useMessage();\n  const [registerModal, { openModal }] = useModal();\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({\n    designScope: 'quartz-template',\n    tableProps: {\n      title: '任务列表',\n      api: getQuartzList,\n      columns: columns,\n      actionColumn: {\n        width: 180,\n      },\n      formConfig: {\n        labelWidth: 120,\n        schemas: searchFormSchema,\n        fieldMapToTime: [['fieldTime', ['beginDate', 'endDate'], 'YYYY-MM-DD HH:mm:ss']],\n      },\n    },\n    exportConfig: {\n      name: '定时任务列表',\n      url: getExportUrl,\n    },\n    importConfig: {\n      url: getImportUrl,\n    },\n  });\n\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext;\n\n  /**\n   * 操作列定义\n   * @param record\n   */\n  function getActions(record) {\n    return [\n      {\n        label: '启动',\n        popConfirm: {\n          title: '是否启动选中任务?',\n          confirm: handlerResume.bind(null, record),\n        },\n        ifShow: (_action) => {\n          return record.status == -1;\n        },\n      },\n      {\n        label: '停止',\n        popConfirm: {\n          title: '是否暂停选中任务?',\n          confirm: handlerPause.bind(null, record),\n        },\n        ifShow: (_action) => {\n          return record.status == 0;\n        },\n      },\n    ];\n  }\n\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record) {\n    return [\n      {\n        label: '立即执行',\n        popConfirm: {\n          title: '是否立即执行任务?',\n          confirm: handlerExecute.bind(null, record),\n        },\n      },\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n\n  /**\n   * 新增事件\n   */\n  function handleAdd() {\n    openModal(true, {\n      isUpdate: false,\n    });\n  }\n\n  /**\n   * 编辑事件\n   */\n  function handleEdit(record) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteQuartz({ id: record.id }, reload);\n  }\n\n  /**\n   * 立即执行\n   */\n  async function handlerExecute(record) {\n    await executeImmediately({ id: record.id }, reload);\n  }\n\n  /**\n   * 暂停\n   */\n  async function handlerPause(record) {\n    await pauseJob({ id: record.id }, reload);\n  }\n\n  /**\n   * 启动\n   */\n  async function handlerResume(record) {\n    await resumeJob({ id: record.id }, reload);\n  }\n\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDeleteQuartz({ ids: selectedRowKeys.value }, () => {\n      // -update-begin--author:liaozhiyang---date:20240702---for：【TV360X-1662】菜单管理、定时任务批量删除清空选中\n      reload();\n      selectedRows.value = [];\n      selectedRowKeys.value = [];\n      // -update-end--author:liaozhiyang---date:20240702---for：【TV360X-1662】菜单管理、定时任务批量删除清空选中\n    });\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/quartz/quartz.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { Modal } from 'ant-design-vue';\n\nenum Api {\n  list = '/sys/quartzJob/list',\n  save = '/sys/quartzJob/add',\n  edit = '/sys/quartzJob/edit',\n  get = '/sys/quartzJob/queryById',\n  pause = '/sys/quartzJob/pause',\n  resume = '/sys/quartzJob/resume',\n  delete = '/sys/quartzJob/delete',\n  exportXlsUrl = '/sys/quartzJob/exportXls',\n  importExcelUrl = '/sys/quartzJob/importExcel',\n  execute = '/sys/quartzJob/execute',\n  deleteBatch = '/sys/quartzJob/deleteBatch',\n}\n\n/**\n * 导出api\n */\nexport const getExportUrl = Api.exportXlsUrl;\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcelUrl;\n/**\n * 查询任务列表\n * @param params\n */\nexport const getQuartzList = (params) => {\n  return defHttp.get({ url: Api.list, params });\n};\n\n/**\n * 保存或者更新任务\n * @param params\n */\nexport const saveOrUpdateQuartz = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({ url: url, params });\n};\n\n/**\n * 查询任务详情\n * @param params\n */\nexport const getQuartzById = (params) => {\n  return defHttp.get({ url: Api.get, params });\n};\n\n/**\n * 删除任务\n * @param params\n */\nexport const deleteQuartz = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.delete, data: params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n\n/**\n * 启动\n * @param params\n */\nexport const resumeJob = (params, handleSuccess) => {\n  return defHttp.get({ url: Api.resume, params }).then(() => {\n    handleSuccess();\n  });\n};\n\n/**\n * 暂停\n * @param params\n */\nexport const pauseJob = (params, handleSuccess) => {\n  return defHttp.get({ url: Api.pause, params }).then(() => {\n    handleSuccess();\n  });\n};\n\n/**\n * 立即执行\n * @param params\n */\nexport const executeImmediately = (params, handleSuccess) => {\n  return defHttp.get({ url: Api.execute, params }).then(() => {\n    handleSuccess();\n  });\n};\n\n/**\n * 批量删除任务\n * @param params\n */\nexport const batchDeleteQuartz = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/quartz/quartz.data.ts",
    "content": "import { BasicColumn, FormSchema } from '/@/components/Table';\nimport { render } from '/@/utils/common/renderUtils';\nimport { JCronValidator } from '/@/components/Form';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '任务类名',\n    dataIndex: 'jobClassName',\n    width: 200,\n    align: 'left',\n  },\n  {\n    title: 'Cron表达式',\n    dataIndex: 'cronExpression',\n    width: 200,\n  },\n  {\n    title: '参数',\n    dataIndex: 'parameter',\n    width: 200,\n  },\n  {\n    title: '描述',\n    dataIndex: 'description',\n    width: 200,\n  },\n  {\n    title: '状态',\n    dataIndex: 'status',\n    width: 100,\n    customRender: ({ text }) => {\n      const color = text == '0' ? 'green' : text == '-1' ? 'red' : 'gray';\n      return render.renderTag(render.renderDict(text, 'quartz_status'), color);\n    },\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'jobClassName',\n    label: '任务类名',\n    component: 'Input',\n    colProps: { span: 8 },\n  },\n  {\n    field: 'status',\n    label: '任务状态',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'quartz_status',\n      stringToNumber: true,\n    },\n    colProps: { span: 8 },\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    field: 'id',\n    label: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    field: 'jobClassName',\n    label: '任务类名',\n    component: 'Input',\n    required: true,\n  },\n  {\n    field: 'cronExpression',\n    label: 'Cron表达式',\n    component: 'JEasyCron',\n    defaultValue: '* * * * * ? *',\n    rules: [{ required: true, message: '请输入Cron表达式' }, { validator: JCronValidator }],\n  },\n  {\n    field: 'paramterType',\n    label: '参数类型',\n    component: 'Select',\n    defaultValue: 'string',\n    componentProps: {\n      options: [\n        { label: '字符串', value: 'string' },\n        { label: 'JSON对象', value: 'json' },\n      ],\n    },\n  },\n  {\n    field: 'parameter',\n    label: '参数',\n    component: 'InputTextArea',\n    ifShow: ({ values }) => {\n      return values.paramterType == 'string';\n    },\n  },\n  {\n    field: 'parameter',\n    label: '参数',\n    component: 'JAddInput',\n    helpMessage: '键值对形式填写',\n    ifShow: ({ values }) => {\n      return values.paramterType == 'json';\n    },\n  },\n  {\n    field: 'status',\n    label: '状态',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'quartz_status',\n      type: 'radioButton',\n      stringToNumber: true,\n      dropdownStyle: {\n        maxHeight: '6vh',\n      },\n    },\n  },\n  {\n    field: 'description',\n    label: '描述',\n    component: 'InputTextArea',\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/redis/index.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <a-card>\n      <!-- Redis 信息实时监控 -->\n      <a-row :gutter=\"8\">\n        <a-col :sm=\"24\" :xl=\"12\">\n          <div ref=\"chartRef\" style=\"width: 100%; height: 300px\"></div>\n        </a-col>\n        <a-col :sm=\"24\" :xl=\"12\">\n          <div ref=\"chartRef2\" style=\"width: 100%; height: 300px\"></div>\n        </a-col>\n      </a-row>\n    </a-card>\n\n    <BasicTable @register=\"registerTable\" :api=\"getInfo\"></BasicTable>\n  </div>\n</template>\n<script lang=\"ts\" name=\"monitor-redis\" setup>\n  import { onMounted, ref, reactive, Ref, onUnmounted } from 'vue';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { getInfo, getRedisInfo, getMetricsHistory } from './redis.api';\n  import dayjs from 'dayjs';\n  import { columns } from './redis.data';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useECharts } from '/@/hooks/web/useECharts';\n\n  const dataSource = ref([]);\n  const chartRef = ref<HTMLDivElement | null>(null);\n  const chartRef2 = ref<HTMLDivElement | null>(null);\n  const { setOptions, echarts } = useECharts(chartRef as Ref<HTMLDivElement>);\n  const { setOptions: setOptions2, echarts: echarts2 } = useECharts(chartRef2 as Ref<HTMLDivElement>);\n  const loading = ref(false);\n  let timer = null;\n  const { createMessage } = useMessage();\n  const key = reactive({\n    title: {\n      text: 'Redis Key 实时数量（个）',\n    },\n    xAxis: {\n      type: 'category',\n      boundaryGap: false,\n      data: [],\n    },\n    yAxis: {\n      type: 'value',\n    },\n    series: [\n      {\n        data: [],\n        type: 'line',\n        areaStyle: {\n          color: '#ff6987',\n        },\n        lineStyle: {\n          color: '#dc143c',\n          width: 10,\n          type: 'solid',\n        },\n      },\n    ],\n  });\n  const memory = reactive({\n    title: {\n      text: 'Redis 内存实时占用情况（KB）',\n    },\n    xAxis: {\n      type: 'category',\n      boundaryGap: false,\n      data: [],\n    },\n    yAxis: {\n      type: 'value',\n    },\n    series: [\n      {\n        data: [],\n        type: 'line',\n        areaStyle: {\n          color: '#74bcff',\n        },\n        lineStyle: {\n          color: '#1890ff',\n          width: 10,\n          type: 'solid',\n        },\n      },\n    ],\n  });\n\n  const [registerTable, { reload }] = useTable({\n    columns,\n    showIndexColumn: false,\n    pagination: false,\n    bordered: true,\n  });\n\n  // 获取一组数据中最大和最小的值\n  function getMaxAndMin(dataSource, field) {\n    let maxValue = null,\n      minValue = null;\n    dataSource.forEach((item) => {\n      let value = Number.parseInt(item[field]);\n      // max\n      if (maxValue == null) {\n        maxValue = value;\n      } else if (value > maxValue) {\n        maxValue = value;\n      }\n      // min\n      if (minValue == null) {\n        minValue = value;\n      } else if (value < minValue) {\n        minValue = value;\n      }\n    });\n    return [maxValue, minValue];\n  }\n\n  function loadRedisInfo() {\n    getInfo().then((res) => {\n      dataSource.value = res.result;\n    });\n  }\n\n  function initCharts() {\n    setOptions(memory);\n    setOptions2(key);\n  }\n\n  /** 开启定时器 */\n  function openTimer() {\n    loadHistoryData();\n    closeTimer();\n    timer = setInterval(() => {\n      loadData();\n    }, 15000);\n  }\n\n  /** 关闭定时器 */\n  function closeTimer() {\n    if (timer) clearInterval(timer);\n  }\n\n  /**\n   * 加载历史监控数据\n   */\n  function loadHistoryData() {\n    getMetricsHistory().then((res) => {\n      let dbSizes = res.dbSize;\n      let memories = res.memory;\n      dbSizes.forEach((dbSize) => {\n        key.xAxis.data.push(dayjs(dbSize.create_time).format('hh:mm:ss'));\n        key.series[0].data.push(dbSize.dbSize);\n      });\n      memories.forEach((memoryData) => {\n        memory.xAxis.data.push(dayjs(memoryData.create_time).format('hh:mm:ss'));\n        memory.series[0].data.push(memoryData.used_memory / 1000);\n      });\n      setOptions(memory, false);\n      setOptions2(key, false);\n    });\n  }\n\n  function loadData() {\n    getRedisInfo()\n      .then((res) => {\n        let time = dayjs().format('hh:mm:ss');\n        let [{ dbSize: currentSize }, memoryInfo] = res;\n        let currentMemory = memoryInfo.used_memory / 1000;\n        // push 数据\n        key.xAxis.data.push(time);\n        key.series[0].data.push(currentSize);\n        memory.xAxis.data.push(time);\n        memory.series[0].data.push(currentMemory);\n        // 最大长度为80\n        if (key.series[0].data.length > 80) {\n          key.xAxis.data.splice(0, 1);\n          key.series[0].data.splice(0, 1);\n          memory.xAxis.data.splice(0, 1);\n          memory.series[0].data.splice(0, 1);\n        }\n        setOptions(memory, false);\n        setOptions2(key, false);\n\n        // 计算 Key 最大最小值\n        //let keyPole = getMaxAndMin(key.dataSource, 'y');\n        //key.max = Math.floor(keyPole[0]) + 10;\n        //key.min = Math.floor(keyPole[1]) - 10;\n        //if (key.min < 0) this.key.min = 0;\n\n        // 计算 Memory 最大最小值\n        //let memoryPole = getMaxAndMin(memory.dataSource, 'y');\n        //memory.max = Math.floor(memoryPole[0]) + 100;\n        //memory.min = Math.floor(memoryPole[1]) - 100;\n        //if (memory.min < 0) memory.min = 0;\n      })\n      .catch((e) => {\n        //closeTimer()\n      });\n  }\n\n  onMounted(() => {\n    initCharts();\n    openTimer();\n  });\n  // 代码逻辑说明: 【issues-615】系统监控中的REDIS监控页面打开，再关闭后，没有关闭计时器\n  onUnmounted(() => {\n    closeTimer();\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/redis/redis.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\n\nenum Api {\n  keysSize = '/sys/actuator/redis/keysSize',\n  memoryInfo = '/sys/actuator/redis/memoryInfo',\n  info = '/sys/actuator/redis/info',\n  metricsHistory = '/sys/actuator/redis/metrics/history',\n}\n\n/**\n * key个数\n */\nexport const getKeysSize = () => {\n  return defHttp.get({ url: Api.keysSize }, { isTransformResponse: false });\n};\n\n/**\n * 内存信息\n */\nexport const getMemoryInfo = () => {\n  return defHttp.get({ url: Api.memoryInfo }, { isTransformResponse: false });\n};\n\n/**\n * 详细信息\n */\nexport const getInfo = () => {\n  return defHttp.get({ url: Api.info });\n};\n\n/**\n * 历史监控记录\n */\nexport const getMetricsHistory = () => {\n  return defHttp.get({ url: Api.metricsHistory });\n};\n\nexport const getRedisInfo = () => {\n  return Promise.all([getKeysSize(), getMemoryInfo()]);\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/redis/redis.data.ts",
    "content": "import { BasicColumn } from '/@/components/Table';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: 'Key',\n    dataIndex: 'key',\n    width: 100,\n  },\n  {\n    title: 'Description',\n    dataIndex: 'description',\n    width: 80,\n  },\n  {\n    title: 'Value',\n    dataIndex: 'value',\n    width: 80,\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/route/RouteModal.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"$attrs\" @register=\"registerDrawer\" :title=\"getTitle\" width=\"30%\" @ok=\"handleSubmit\" destroyOnClose showFooter>\n    <a-form ref=\"formRef\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\" :model=\"router\" :rules=\"validatorRules\">\n      <a-form-item label=\"路由ID\" name=\"routerId\">\n        <a-input v-model:value=\"router.routerId\" placeholder=\"路由唯一ID\" />\n      </a-form-item>\n      <a-form-item label=\"路由名称\" name=\"name\">\n        <a-input v-model:value=\"router.name\" placeholder=\"路由名称\" />\n      </a-form-item>\n      <a-form-item label=\"路由URI\" name=\"uri\">\n        <a-input v-model:value=\"router.uri\" placeholder=\"路由URL\" />\n      </a-form-item>\n      <a-form-item label=\"路由状态\" name=\"status\">\n        <a-switch default-checked :checked-value=\"1\" :un-checked-value=\"0\" v-model:checked=\"router.status\" />\n      </a-form-item>\n\n      <a-form-item name=\"predicates\" label=\"路由条件\">\n        <div v-for=\"(item, index) in router.predicates\">\n          <!--当name在noKeyRouter时不需要指定key-->\n          <template v-if=\"noKeyRouter.includes(item.name)\">\n            <a-divider\n              >{{ item.name }}\n              <DeleteOutlined size=\"22\" @click=\"removePredicate(router, index)\" />\n            </a-divider>\n            <div>\n              <template v-for=\"(tag, tagIndx) in item.args\">\n                <a-input\n                  ref=\"inputRef2\"\n                  v-if=\"tagIndx == currentTagIndex && index == currentNameIndex\"\n                  type=\"text\"\n                  size=\"small\"\n                  :style=\"{ width: '190px' }\"\n                  v-model:value=\"state.inputValue\"\n                  @change=\"handleInputChange\"\n                  @blur=\"handleInputEditConfirm(item, tag, tagIndx)\"\n                  @keyup.enter=\"handleInputEditConfirm(item, tag, tagIndx)\"\n                />\n                <a-tag\n                  v-else\n                  :key=\"tag\"\n                  style=\"margin-bottom: 2px\"\n                  :closable=\"true\"\n                  @close=\"() => removeTag(item, tag)\"\n                  @click=\"editTag(item, tag, tagIndx, index)\"\n                >\n                  {{ tag }}\n                </a-tag>\n              </template>\n              <a-input\n                ref=\"inputRef\"\n                v-if=\"state.inputVisible && index == currentNameIndex\"\n                type=\"text\"\n                size=\"small\"\n                :style=\"{ width: '100px' }\"\n                v-model:value=\"state.inputValue\"\n                @change=\"handleInputChange\"\n                @blur=\"handleInputConfirm(item)\"\n                @keyup.enter=\"handleInputConfirm(item)\"\n              />\n              <a-tag v-else style=\"background: #fff; borderstyle: dashed; margin-bottom: 2px\" @click=\"showInput(item, index)\">\n                <PlusOutlined size=\"22\" />\n                新建{{ item.name }}\n              </a-tag>\n            </div>\n          </template>\n          <!--当name不在noKeyRouter时需要指定key-->\n          <template v-if=\"!noKeyRouter.includes(item.name)\">\n            <a-divider\n              >{{ item.name }}\n              <DeleteOutlined size=\"22\" @click=\"removePredicate(router, index)\" />\n            </a-divider>\n            <div>\n              <template v-for=\"(value, key) in item.args\">\n                <a-row>\n                  <a-col :span=\"5\" style=\"margin-top: 8px\">\n                    <span v-if=\"key == 'header'\">Header名称</span>\n                    <span v-if=\"key == 'regexp'\">参数值</span>\n                    <span v-if=\"key == 'param'\">参数名</span>\n                    <span v-if=\"key == 'name'\">参数名</span>\n                  </a-col>\n                  <a-col :span=\"18\">\n                    <a-input\n                      :defaultValue=\"value\"\n                      placeholder=\"参数值\"\n                      style=\"width: 70%; margin-right: 8px; margin-top: 3px\"\n                      @change=\"(e) => valueChange(e, item.args, key)\"\n                    />\n                  </a-col>\n                </a-row>\n              </template>\n            </div>\n          </template>\n        </div>\n        <p class=\"btn\" style=\"padding-top: 10px\">\n          <a-dropdown trigger=\"click\">\n            <template #overlay>\n              <a-menu>\n                <a-menu-item :key=\"item.name\" v-for=\"item in tagArray\" @click=\"predicatesHandleMenuClick(item)\">{{ item.name }}</a-menu-item>\n              </a-menu>\n            </template>\n            <a-button type=\"dashed\" style=\"margin-left: 8px; width: 100%\">\n              添加路由条件\n              <DownOutlined :size=\"22\" />\n            </a-button>\n          </a-dropdown>\n        </p>\n      </a-form-item>\n      <a-form-item name=\"predicates\" label=\"过滤器\">\n        <div v-for=\"(item, index) in router.filters\">\n          <a-divider\n            >{{ item.name }}\n            <DeleteOutlined size=\"22\" @click=\"removeFilter(router, index)\" />\n          </a-divider>\n          <div v-for=\"(tag, index) in item.args\" :key=\"tag.key\">\n            <a-form-item-rest>\n              <a-input v-model:value=\"tag.key\" placeholder=\"参数键\" style=\"width: 45%; margin-right: 8px\" />\n              <a-input v-model:value=\"tag.value\" placeholder=\"参数值\" style=\"width: 40%; margin-right: 8px; margin-top: 3px\" />\n            </a-form-item-rest>\n            <CloseOutlined :size=\"22\" @click=\"removeFilterParams(item, index)\" />\n          </div>\n          <a-button type=\"dashed\" style=\"margin-left: 28%; width: 37%; margin-top: 5px\" size=\"small\" @click=\"addFilterParams(item)\">\n            <DownOutlined :size=\"22\" />\n            添加参数\n          </a-button>\n        </div>\n        <p class=\"btn\" style=\"padding-top: 10px\">\n          <a-dropdown trigger=\"click\">\n            <template #overlay>\n              <a-menu @click=\"filterHandleMenuClick\">\n                <a-menu-item :key=\"item.key\" :name=\"item.name\" v-for=\"item in filterArray\">{{ item.name }}</a-menu-item>\n              </a-menu>\n            </template>\n            <a-button type=\"dashed\" style=\"margin-left: 8px; width: 100%\">\n              添加过滤器\n              <DownOutlined />\n            </a-button>\n          </a-dropdown>\n        </p>\n      </a-form-item>\n    </a-form>\n  </BasicDrawer>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed, unref, useAttrs, reactive, nextTick } from 'vue';\n  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';\n  import { saveOrUpdateRoute } from './route.api';\n  import { DeleteOutlined } from '@ant-design/icons-vue';\n  import { PlusOutlined } from '@ant-design/icons-vue';\n  import { CloseOutlined } from '@ant-design/icons-vue';\n  import { DownOutlined } from '@ant-design/icons-vue';\n  // 声明Emits\n  const emit = defineEmits(['register', 'success']);\n  const labelCol = reactive({\n    xs: { span: 24 },\n    sm: { span: 5 },\n  });\n  const wrapperCol = reactive({\n    xs: { span: 24 },\n    sm: { span: 16 },\n  });\n  const attrs = useAttrs();\n  const isUpdate = ref(true);\n  const inputRef = ref();\n  const inputRef2 = ref();\n  let state = reactive({\n    inputVisible: false,\n    inputValue: '',\n  });\n  const currentNameIndex = ref(0);\n  const currentTagIndex = ref(-1);\n  const validatorRules = {\n    routerId: [{ required: true, message: 'routerId不能为空', trigger: 'blur' }],\n    name: [{ required: true, message: '路由名称不能为空', trigger: 'blur' }],\n    uri: [{ required: true, message: 'uri不能为空', trigger: 'blur' }],\n  };\n  const noKeyRouter = ['Path', 'Host', 'Method', 'After', 'Before', 'Between', 'RemoteAddr'];\n  const filterArray = [/*{ key: 0, name: '熔断器' },*/ { key: 1, name: '限流过滤器' }];\n  const tagArray = ref([\n    {\n      name: 'Path',\n      args: [],\n    },\n    {\n      name: 'Header',\n      args: {\n        header: '',\n        regexp: '',\n      },\n    },\n    {\n      name: 'Query',\n      args: {\n        param: '',\n        regexp: '',\n      },\n    },\n    {\n      name: 'Method',\n      args: [],\n    },\n    {\n      name: 'Host',\n      args: [],\n    },\n    {\n      name: 'Cookie',\n      args: {\n        name: '',\n        regexp: '',\n      },\n    },\n    {\n      name: 'After',\n      args: [],\n    },\n    {\n      name: 'Before',\n      args: [],\n    },\n    {\n      name: 'Between',\n      args: [],\n    },\n    {\n      name: 'RemoteAddr',\n      args: [],\n    },\n  ]);\n  const formRef = ref();\n  let router = reactive({});\n\n  const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {\n    isUpdate.value = !!data?.isUpdate;\n    setDrawerProps({ confirmLoading: false });\n    initRouter();\n    if (unref(isUpdate)) {\n      router = Object.assign(router, data.record);\n    }\n  });\n  /**\n   * 标题\n   */\n  const getTitle = computed(() => (!unref(isUpdate) ? '新增路由' : '编辑路由'));\n\n  //删除路由条件配置项\n  function removeTag(item, removedTag) {\n    let tags = item.args.filter((tag) => tag !== removedTag);\n    item.args = tags;\n  }\n\n  //初始化参数\n  function initRouter() {\n    router = Object.assign(router, {\n      id: '',\n      routerId: '',\n      name: '',\n      uri: '',\n      status: 1,\n      predicates: [],\n      filters: [],\n    });\n  }\n\n  //添加路由选项\n  function predicatesHandleMenuClick(e) {\n    router.predicates.push({\n      args: e.args,\n      name: e.name,\n    });\n  }\n\n  /**\n   * 值修改事件\n   * @param e\n   * @param item\n   * @param key\n   */\n  function valueChange(e, item, key) {\n    item[key] = e.target.value;\n  }\n\n  function editTag(item, tag, tagIndex, index) {\n    currentNameIndex.value = index;\n    currentTagIndex.value = tagIndex;\n    state.inputValue = tag;\n    nextTick(() => {\n      inputRef2.value[0].focus();\n    });\n  }\n\n  //显示输入框\n  function showInput(item, index) {\n    state.inputValue = '';\n    state.inputVisible = true;\n    currentNameIndex.value = index;\n    nextTick(() => {\n      inputRef.value[0].focus();\n    });\n  }\n\n  //路由选项输入框改变事件\n  function handleInputChange(e) {\n    console.info('change', e);\n    console.info('change', e.target.value);\n    //state.value = e.target.value;\n    //state.tag=true;\n  }\n\n  //删除路由条件\n  function removePredicate(item, index) {\n    item.predicates.splice(index, 1);\n  }\n\n  //删除过滤器参数\n  function removeFilterParams(item, index) {\n    item.args.splice(index, 1);\n  }\n\n  //删除过滤器\n  function removeFilter(item, index) {\n    item.filters.splice(index, 1);\n  }\n\n  //添加过滤器参数\n  function addFilterParams(item) {\n    item.args.push({\n      key: 'key' + item.args.length + 1,\n      value: '',\n    });\n  }\n\n  //过滤器添加事件\n  function filterHandleMenuClick(e) {\n    if (e.key == 0) {\n      router.filters.push({\n        args: [\n          {\n            key: 'name',\n            value: 'default',\n          },\n          {\n            key: 'fallbackUri',\n            value: 'forward:/fallback',\n          },\n        ],\n        name: 'Hystrix',\n        title: filterArray[0].name,\n      });\n    }\n    console.info('test', router);\n    if (e.key == 1) {\n      router.filters.push({\n        args: [\n          {\n            key: 'key-resolver',\n            value: '#{@ipKeyResolver}',\n          },\n          {\n            key: 'redis-rate-limiter.replenishRate',\n            value: 20,\n          },\n          {\n            key: 'redis-rate-limiter.burstCapacity',\n            value: 20,\n          },\n        ],\n        name: 'RequestRateLimiter',\n        title: filterArray[0].name,\n      });\n    }\n  }\n\n  //输入框确认\n  function handleInputConfirm(item) {\n    let tags = item.args;\n    const inputValue = state.inputValue;\n    if (inputValue && tags.indexOf(inputValue) === -1) {\n      item.args = [...tags, state.inputValue];\n    }\n    state.inputVisible = false;\n    state.inputValue = '';\n    currentTagIndex.value = -1;\n    currentNameIndex.value = -1;\n  }\n\n  //输入框确认\n  function handleInputEditConfirm(item, tag, index) {\n    const inputValue = state.inputValue;\n    if (inputValue) {\n      item.args[index] = state.inputValue;\n    }\n    currentTagIndex.value = -1;\n    currentNameIndex.value = -1;\n  }\n\n  //关闭弹窗\n  function handleCancel() {}\n\n  /**\n   * 提交\n   */\n  async function handleSubmit() {\n    await formRef.value.validate().then(() => {\n      try {\n        setDrawerProps({ confirmLoading: true });\n        //重新构造表单提交对象,切记不可修改router对象，数组修改为字符串容易造成界面混乱\n        let params = Object.assign({}, router, {\n          predicates: JSON.stringify(router.predicates),\n          filters: JSON.stringify(router.filters),\n        });\n        //提交表单\n        saveOrUpdateRoute({ router: params }).then(() => {\n          closeDrawer();\n          //刷新列表\n          emit('success');\n        });\n      } finally {\n        setDrawerProps({ confirmLoading: false });\n      }\n    });\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/route/components/RouteRecycleBinModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" title=\"路由回收站\" :showOkBtn=\"false\" width=\"1000px\" destroyOnClose>\n    <BasicTable @register=\"registerTable\">\n      <template #status=\"{ record, text }\">\n        <a-tag color=\"pink\" v-if=\"text == 0\">禁用</a-tag>\n        <a-tag color=\"#87d068\" v-if=\"text == 1\">正常</a-tag>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n    </BasicTable>\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { columns } from '../route.data';\n  import { deleteRouteList, putRecycleBin, deleteRecycleBin } from '../route.api';\n  // 声明Emits\n  const emit = defineEmits(['success', 'register']);\n  const checkedKeys = ref<Array<string | number>>([]);\n  const [registerModal] = useModalInner(() => {\n    checkedKeys.value = [];\n  });\n  //注册table数据\n  const [registerTable, { reload }] = useTable({\n    rowKey: 'id',\n    api: deleteRouteList,\n    columns: columns,\n    striped: true,\n    useSearchForm: false,\n    bordered: true,\n    showIndexColumn: false,\n    pagination: false,\n    tableSetting: { fullScreen: true },\n    canResize: false,\n    actionColumn: {\n      width: 150,\n      title: '操作',\n      dataIndex: 'action',\n      slots: { customRender: 'action' },\n      fixed: 'right',\n    },\n  });\n\n  /**\n   * 还原事件\n   */\n  async function handleRevert(record) {\n    await putRecycleBin({ ids: record.id }, reload);\n    emit('success');\n  }\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteRecycleBin({ ids: record.id }, reload);\n  }\n\n  //获取操作栏事件\n  function getTableAction(record) {\n    return [\n      {\n        label: '取回',\n        icon: 'ant-design:redo-outlined',\n        popConfirm: {\n          title: '是否确认取回',\n          confirm: handleRevert.bind(null, record),\n        },\n      },\n      {\n        label: '彻底删除',\n        icon: 'ant-design:scissor-outlined',\n        color: 'error',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/route/index.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\" :indexColumnProps=\"indexColumnProps\">\n      <template #tableTitle>\n        <a-button preIcon=\"ant-design:plus-outlined\" type=\"primary\" @click=\"handleAdd\" style=\"margin-right: 5px\">新增</a-button>\n        <a-button type=\"primary\" @click=\"openRecycleModal(true)\" preIcon=\"ant-design:hdd-outlined\"> 回收站</a-button>\n      </template>\n      <template #status=\"{ record, text }\">\n        <a-tag color=\"pink\" v-if=\"text == 0\">禁用</a-tag>\n        <a-tag color=\"#87d068\" v-if=\"text == 1\">正常</a-tag>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getActions(record)\" />\n      </template>\n    </BasicTable>\n    <RouteModal @register=\"registerDrawer\" @success=\"reload\" />\n    <!--回收站弹窗-->\n    <RouteRecycleBinModal @register=\"registerRecycleModal\" @success=\"reload\" />\n  </div>\n</template>\n<script lang=\"ts\" name=\"monitor-route\" setup>\n  import { ref } from 'vue';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import { getRouteList, deleteRoute, copyRoute } from './route.api';\n  import { columns } from './route.data';\n  import RouteModal from './RouteModal.vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useDrawer } from '/@/components/Drawer';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import RouteRecycleBinModal from './components/RouteRecycleBinModal.vue';\n  const { createMessage } = useMessage();\n  const [registerDrawer, { openDrawer }] = useDrawer();\n  const checkedKeys = ref<Array<string | number>>([]);\n\n  //回收站model\n  const [registerRecycleModal, { openModal: openRecycleModal }] = useModal();\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext } = useListPage({\n    designScope: 'router-template',\n    tableProps: {\n      title: '路由列表',\n      api: getRouteList,\n      useSearchForm: false,\n      columns: columns,\n    },\n  });\n\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;\n  /**\n   * 序号列配置\n   */\n  const indexColumnProps = {\n    dataIndex: 'index',\n    width: '15px',\n  };\n\n  /**\n   * 操作列定义\n   * @param record\n   */\n  function getActions(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '复制',\n        popConfirm: {\n          title: '是否确认复制',\n          confirm: handleCopy.bind(null, record),\n        },\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n\n  /**\n   * 选择事件\n   */\n  function onSelectChange(selectedRowKeys: (string | number)[]) {\n    checkedKeys.value = selectedRowKeys;\n  }\n\n  /**\n   * 新增事件\n   */\n  function handleAdd() {\n    openDrawer(true, {\n      isUpdate: false,\n    });\n  }\n\n  /**\n   * 编辑事件\n   */\n  function handleEdit(record) {\n    openDrawer(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n  /**\n   * 复制\n   */\n  async function handleCopy(record) {\n    await copyRoute({ id: record.id }, reload);\n    createMessage.success('复制成功');\n  }\n\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteRoute({ id: record.id }, reload);\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/route/route.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\n\nenum Api {\n  list = '/sys/gatewayRoute/list',\n  deleteList = '/sys/gatewayRoute/deleteList',\n  save = '/sys/gatewayRoute/add',\n  edit = '/sys/gatewayRoute/updateAll',\n  delete = '/sys/gatewayRoute/delete',\n\n  copyRoute = '/sys/gatewayRoute/copyRoute',\n  batchPutRecycleBin = '/sys/gatewayRoute/putRecycleBin',\n  batchDeleteRecycleBin = '/sys/gatewayRoute/deleteRecycleBin',\n}\n\n/**\n * 查询路由列表\n * @param params\n */\nexport const getRouteList = (params) => {\n  return defHttp.get({ url: Api.list, params });\n};\n/**\n * 查询逻辑删除的路由列表\n * @param params\n */\nexport const deleteRouteList = (params) => {\n  return defHttp.get({ url: Api.deleteList, params });\n};\n\n/**\n * 保存或者更新路由\n * @param params\n */\nexport const saveOrUpdateRoute = (params) => {\n  return defHttp.post({ url: Api.edit, params });\n};\n\n/**\n * 删除路由\n * @param params\n */\nexport const deleteRoute = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.delete, data: params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n\n/**\n * 回收站还原\n * @param params\n */\nexport const putRecycleBin = (params, handleSuccess) => {\n  return defHttp.put({ url: Api.batchPutRecycleBin, params }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 回收站删除\n * @param params\n */\nexport const deleteRecycleBin = (params, handleSuccess) => {\n  return defHttp.delete({ url: `${Api.batchDeleteRecycleBin}?ids=${params.ids}` }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 复制\n */\nexport const copyRoute = (params, handleSuccess) => {\n  return defHttp.get({ url: Api.copyRoute, params }).then(() => {\n    handleSuccess();\n  });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/route/route.data.ts",
    "content": "import { BasicColumn, FormSchema } from '/@/components/Table';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '路由ID',\n    dataIndex: 'routerId',\n    width: 200,\n    align: 'left',\n  },\n  {\n    title: '路由名称',\n    dataIndex: 'name',\n    width: 200,\n  },\n  {\n    title: '路由URI',\n    dataIndex: 'uri',\n    width: 200,\n  },\n  {\n    title: '状态',\n    dataIndex: 'status',\n    slots: { customRender: 'status' },\n    width: 150,\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    field: 'name',\n    label: '路由ID',\n    component: 'Input',\n    required: true,\n  },\n  {\n    field: 'name',\n    label: '路由名称',\n    component: 'InputNumber',\n    required: true,\n  },\n  {\n    field: 'uri',\n    label: '路由URI',\n    component: 'Input',\n  },\n  {\n    field: 'predicates',\n    label: '路由条件',\n    slot: 'predicates',\n    component: 'Input',\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/server/index.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <a-card :bordered=\"false\" style=\"height: 100%\">\n      <a-tabs v-model:activeKey=\"activeKey\" @change=\"tabChange\">\n        <a-tab-pane key=\"1\" tab=\"服务器信息\"></a-tab-pane>\n        <a-tab-pane key=\"2\" tab=\"JVM信息\" force-render></a-tab-pane>\n         <a-tab-pane key=\"3\" tab=\"Tomcat信息\"></a-tab-pane> \n<!--        <a-tab-pane key=\"6\" tab=\"Undertow信息\"></a-tab-pane>-->\n        <a-tab-pane key=\"4\" tab=\"磁盘监控\">\n          <DiskInfo v-if=\"activeKey == 4\" style=\"height: 100%\"></DiskInfo>\n        </a-tab-pane>\n        <a-tab-pane key=\"5\" tab=\"内存信息\" />\n      </a-tabs>\n      <BasicTable @register=\"registerTable\" :searchInfo=\"searchInfo\" :dataSource=\"dataSource\" v-show=\"activeKey != 4\">\n        <template #tableTitle>\n          <div slot=\"message\"\n            >上次更新时间：{{ lastUpdateTime }}\n            <a-divider type=\"vertical\" />\n            <a @click=\"handleUpdate\">立即更新</a></div\n          >\n        </template>\n        <template #param=\"{ record, text }\">\n          <a-tag :color=\"textInfo[record.param].color\">{{ text }}</a-tag>\n        </template>\n        <template #text=\"{ record }\">\n          {{ textInfo[record.param].text }}\n        </template>\n        <template #value=\"{ record, text }\"> {{ text }} {{ textInfo[record.param].unit }} </template>\n      </BasicTable>\n    </a-card>\n  </div>\n</template>\n<script lang=\"ts\" name=\"monitor-server\" setup>\n  import { onMounted, ref, unref } from 'vue';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import DiskInfo from '../disk/DiskInfo.vue';\n  import { getServerInfo, getTextInfo, getMoreInfo } from './server.api';\n  import { columns } from './server.data';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import dayjs from 'dayjs';\n\n  const dataSource = ref([]);\n  const activeKey = ref('1');\n  const moreInfo = ref({});\n  const lastUpdateTime = ref({});\n  let textInfo = ref({});\n  const { createMessage } = useMessage();\n  const checkedKeys = ref<Array<string | number>>([]);\n\n  const searchInfo = { logType: '1' };\n  const [registerTable, { reload }] = useTable({\n    columns,\n    showIndexColumn: false,\n    bordered: true,\n    pagination: false,\n    canResize: false,\n    tableSetting: { fullScreen: true },\n    rowKey: 'id',\n  });\n\n  //tab切换\n  function tabChange(key) {\n    if (key != 4) {\n      getInfoList(key);\n    }\n  }\n\n  //加载信息\n  function getInfoList(infoType) {\n    lastUpdateTime.value = dayjs().format('YYYY年MM月DD日 HH时mm分ss秒');\n    getServerInfo(infoType).then((res) => {\n      textInfo.value = getTextInfo(infoType);\n      moreInfo.value = getMoreInfo(infoType);\n      let info = [];\n      if (infoType === '5') {\n        for (let param in res[0].result) {\n          let data = res[0].result[param];\n          let val = convert(data, unref(textInfo)[param].valueType);\n          info.push({ id: param, param, text: 'false value', value: val });\n        }\n      } else {\n        res.forEach((value, id) => {\n          let more = unref(moreInfo)[value.name];\n          if (!(more instanceof Array)) {\n            more = [''];\n          }\n          more.forEach((item, idx) => {\n            let param = value.name + item;\n            let val = convert(value.measurements[idx].value, unref(textInfo)[param].valueType);\n            info.push({ id: param + id, param, text: 'false value', value: val });\n          });\n        });\n      }\n      dataSource.value = info;\n    });\n  }\n\n  function handleUpdate() {\n    getInfoList(activeKey.value);\n  }\n\n  //单位转换\n  function convert(value, type) {\n    if (type === 'Number') {\n      return Number(value * 100).toFixed(2);\n    } else if (type === 'Date') {\n      return dayjs(value * 1000).format('YYYY-MM-DD HH:mm:ss');\n    } else if (type === 'RAM') {\n      return Number(value / 1048576).toFixed(3);\n    }\n    return value;\n  }\n\n  onMounted(() => {\n    getInfoList(activeKey.value);\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/server/server.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\n\nenum Api {\n  cpuCount = '/actuator/metrics/system.cpu.count',\n  cpuUsage = '/actuator/metrics/system.cpu.usage',\n  processStartTime = '/actuator/metrics/process.start.time',\n  processUptime = '/actuator/metrics/process.uptime',\n  processCpuUsage = '/actuator/metrics/process.cpu.usage',\n\n  jvmMemoryMax = '/actuator/metrics/jvm.memory.max',\n  jvmMemoryCommitted = '/actuator/metrics/jvm.memory.committed',\n  jvmMemoryUsed = '/actuator/metrics/jvm.memory.used',\n  jvmBufferMemoryUsed = '/actuator/metrics/jvm.buffer.memory.used',\n  jvmBufferCount = '/actuator/metrics/jvm.buffer.count',\n  jvmThreadsDaemon = '/actuator/metrics/jvm.threads.daemon',\n  jvmThreadsLive = '/actuator/metrics/jvm.threads.live',\n  jvmThreadsPeak = '/actuator/metrics/jvm.threads.peak',\n  jvmClassesLoaded = '/actuator/metrics/jvm.classes.loaded',\n  jvmClassesUnloaded = '/actuator/metrics/jvm.classes.unloaded',\n  jvmGcMemoryAllocated = '/actuator/metrics/jvm.gc.memory.allocated',\n  jvmGcMemoryPromoted = '/actuator/metrics/jvm.gc.memory.promoted',\n  jvmGcMaxDataSize = '/actuator/metrics/jvm.gc.max.data.size',\n  jvmGcLiveDataSize = '/actuator/metrics/jvm.gc.live.data.size',\n  jvmGcPause = '/actuator/metrics/jvm.gc.pause',\n\n  tomcatSessionsCreated = '/actuator/metrics/tomcat.sessions.created',\n  tomcatSessionsExpired = '/actuator/metrics/tomcat.sessions.expired',\n  tomcatSessionsActiveCurrent = '/actuator/metrics/tomcat.sessions.active.current',\n  tomcatSessionsActiveMax = '/actuator/metrics/tomcat.sessions.active.max',\n  tomcatSessionsRejected = '/actuator/metrics/tomcat.sessions.rejected',\n\n  memoryInfo = '/sys/actuator/memory/info',\n  // undertow 监控\n  undertowSessionsCreated = '/actuator/metrics/undertow.sessions.created',\n  undertowSessionsExpired = '/actuator/metrics/undertow.sessions.expired',\n  undertowSessionsActiveCurrent = '/actuator/metrics/undertow.sessions.active.current',\n  undertowSessionsActiveMax = '/actuator/metrics/undertow.sessions.active.max',\n}\n\n/**\n * 查询cpu数量\n */\nexport const getCpuCount = () => {\n  return defHttp.get({ url: Api.cpuCount }, { isTransformResponse: false });\n};\n\n/**\n * 查询系统 CPU 使用率\n */\nexport const getCpuUsage = () => {\n  return defHttp.get({ url: Api.cpuUsage }, { isTransformResponse: false });\n};\n\n/**\n * 查询应用启动时间点\n */\nexport const getProcessStartTime = () => {\n  return defHttp.get({ url: Api.processStartTime }, { isTransformResponse: false });\n};\n\n/**\n * 查询应用已运行时间\n */\nexport const getProcessUptime = () => {\n  return defHttp.get({ url: Api.processUptime }, { isTransformResponse: false });\n};\n\n/**\n * 查询当前应用 CPU 使用率\n */\nexport const getProcessCpuUsage = () => {\n  return defHttp.get({ url: Api.processCpuUsage }, { isTransformResponse: false });\n};\n\n/**\n * 查询JVM 最大内存\n */\nexport const getJvmMemoryMax = () => {\n  return defHttp.get({ url: Api.jvmMemoryMax }, { isTransformResponse: false });\n};\n\n/**\n * JVM 可用内存\n */\nexport const getJvmMemoryCommitted = () => {\n  return defHttp.get({ url: Api.jvmMemoryCommitted }, { isTransformResponse: false });\n};\n\n/**\n * JVM 已用内存\n */\nexport const getJvmMemoryUsed = () => {\n  return defHttp.get({ url: Api.jvmMemoryUsed }, { isTransformResponse: false });\n};\n\n/**\n * JVM 缓冲区已用内存\n */\nexport const getJvmBufferMemoryUsed = () => {\n  return defHttp.get({ url: Api.jvmBufferMemoryUsed }, { isTransformResponse: false });\n};\n\n/**\n *JVM 当前缓冲区数量\n */\nexport const getJvmBufferCount = () => {\n  return defHttp.get({ url: Api.jvmBufferCount }, { isTransformResponse: false });\n};\n\n/**\n **JVM 守护线程数量\n */\nexport const getJvmThreadsDaemon = () => {\n  return defHttp.get({ url: Api.jvmThreadsDaemon }, { isTransformResponse: false });\n};\n\n/**\n *JVM 当前活跃线程数量\n */\nexport const getJvmThreadsLive = () => {\n  return defHttp.get({ url: Api.jvmThreadsLive }, { isTransformResponse: false });\n};\n\n/**\n *JVM 峰值线程数量\n */\nexport const getJvmThreadsPeak = () => {\n  return defHttp.get({ url: Api.jvmThreadsPeak }, { isTransformResponse: false });\n};\n\n/**\n *JVM 已加载 Class 数量\n */\nexport const getJvmClassesLoaded = () => {\n  return defHttp.get({ url: Api.jvmClassesLoaded }, { isTransformResponse: false });\n};\n\n/**\n *JVM 未加载 Class 数量\n */\nexport const getJvmClassesUnloaded = () => {\n  return defHttp.get({ url: Api.jvmClassesUnloaded }, { isTransformResponse: false });\n};\n\n/**\n **GC 时, 年轻代分配的内存空间\n */\nexport const getJvmGcMemoryAllocated = () => {\n  return defHttp.get({ url: Api.jvmGcMemoryAllocated }, { isTransformResponse: false });\n};\n\n/**\n *GC 时, 老年代分配的内存空间\n */\nexport const getJvmGcMemoryPromoted = () => {\n  return defHttp.get({ url: Api.jvmGcMemoryPromoted }, { isTransformResponse: false });\n};\n\n/**\n *GC 时, 老年代的最大内存空间\n */\nexport const getJvmGcMaxDataSize = () => {\n  return defHttp.get({ url: Api.jvmGcMaxDataSize }, { isTransformResponse: false });\n};\n\n/**\n *FullGC 时, 老年代的内存空间\n */\nexport const getJvmGcLiveDataSize = () => {\n  return defHttp.get({ url: Api.jvmGcLiveDataSize }, { isTransformResponse: false });\n};\n\n/**\n *系统启动以来GC 次数\n */\nexport const getJvmGcPause = () => {\n  return defHttp.get({ url: Api.jvmGcPause }, { isTransformResponse: false });\n};\n\n/**\n *tomcat 已创建 session 数\n */\nexport const getTomcatSessionsCreated = () => {\n  return defHttp.get({ url: Api.tomcatSessionsCreated }, { isTransformResponse: false });\n};\n\n/**\n *tomcat 已过期 session 数\n */\nexport const getTomcatSessionsExpired = () => {\n  return defHttp.get({ url: Api.tomcatSessionsExpired }, { isTransformResponse: false });\n};\n\n/**\n *tomcat 当前活跃 session 数\n */\nexport const getTomcatSessionsActiveCurrent = () => {\n  return defHttp.get({ url: Api.tomcatSessionsActiveCurrent }, { isTransformResponse: false });\n};\n\n/**\n *tomcat 活跃 session 数峰值\n */\nexport const getTomcatSessionsActiveMax = () => {\n  return defHttp.get({ url: Api.tomcatSessionsActiveMax }, { isTransformResponse: false });\n};\n\n/**\n *超过session 最大配置后，拒绝的 session 个数\n */\nexport const getTomcatSessionsRejected = () => {\n  return defHttp.get({ url: Api.tomcatSessionsRejected }, { isTransformResponse: false });\n};\n\n/**\n *undertow 已创建 session 数\n */\nexport const getUndertowSessionsCreated = () => {\n  return defHttp.get({ url: Api.undertowSessionsCreated }, { isTransformResponse: false });\n};\n\n/**\n *undertow 已过期 session 数\n */\nexport const getUndertowSessionsExpired = () => {\n  return defHttp.get({ url: Api.undertowSessionsExpired }, { isTransformResponse: false });\n};\n\n/**\n *undertow 当前活跃 session 数\n */\nexport const getUndertowSessionsActiveCurrent = () => {\n  return defHttp.get({ url: Api.undertowSessionsActiveCurrent }, { isTransformResponse: false });\n};\n\n/**\n *undertow 活跃 session 数峰值\n */\nexport const getUndertowSessionsActiveMax = () => {\n  return defHttp.get({ url: Api.undertowSessionsActiveMax }, { isTransformResponse: false });\n};\n\n/**\n * 内存信息\n */\nexport const getMemoryInfo = () => {\n  return defHttp.get({ url: Api.memoryInfo }, { isTransformResponse: false });\n};\n\nexport const getMoreInfo = (infoType) => {\n  if (infoType == '1') {\n    return {};\n  }\n  if (infoType == '2') {\n    return { 'jvm.gc.pause': ['.count', '.totalTime'] };\n  }\n  if (infoType == '3') {\n    return {\n      'tomcat.global.request': ['.count', '.totalTime'],\n      'tomcat.servlet.request': ['.count', '.totalTime'],\n    };\n  }\n  if (infoType == '5') {\n    return {};\n  }\n  if (infoType == '6') {\n    return {};\n  }\n};\n\nexport const getTextInfo = (infoType) => {\n  if (infoType == '1') {\n    return {\n      'system.cpu.count': { color: 'green', text: 'CPU 数量', unit: '核' },\n      'system.cpu.usage': { color: 'green', text: '系统 CPU 使用率', unit: '%', valueType: 'Number' },\n      'process.start.time': { color: 'purple', text: '应用启动时间点', unit: '', valueType: 'Date' },\n      'process.uptime': { color: 'purple', text: '应用已运行时间', unit: '秒' },\n      'process.cpu.usage': { color: 'purple', text: '当前应用 CPU 使用率', unit: '%', valueType: 'Number' },\n    };\n  }\n  if (infoType == '2') {\n    return {\n      'jvm.memory.max': { color: 'purple', text: 'JVM 最大内存', unit: 'MB', valueType: 'RAM' },\n      'jvm.memory.committed': { color: 'purple', text: 'JVM 可用内存', unit: 'MB', valueType: 'RAM' },\n      'jvm.memory.used': { color: 'purple', text: 'JVM 已用内存', unit: 'MB', valueType: 'RAM' },\n      'jvm.buffer.memory.used': { color: 'cyan', text: 'JVM 缓冲区已用内存', unit: 'MB', valueType: 'RAM' },\n      'jvm.buffer.count': { color: 'cyan', text: '当前缓冲区数量', unit: '个' },\n      'jvm.threads.daemon': { color: 'green', text: 'JVM 守护线程数量', unit: '个' },\n      'jvm.threads.live': { color: 'green', text: 'JVM 当前活跃线程数量', unit: '个' },\n      'jvm.threads.peak': { color: 'green', text: 'JVM 峰值线程数量', unit: '个' },\n      'jvm.classes.loaded': { color: 'orange', text: 'JVM 已加载 Class 数量', unit: '个' },\n      'jvm.classes.unloaded': { color: 'orange', text: 'JVM 未加载 Class 数量', unit: '个' },\n      'jvm.gc.memory.allocated': { color: 'pink', text: 'GC 时, 年轻代分配的内存空间', unit: 'MB', valueType: 'RAM' },\n      'jvm.gc.memory.promoted': { color: 'pink', text: 'GC 时, 老年代分配的内存空间', unit: 'MB', valueType: 'RAM' },\n      'jvm.gc.max.data.size': { color: 'pink', text: 'GC 时, 老年代的最大内存空间', unit: 'MB', valueType: 'RAM' },\n      'jvm.gc.live.data.size': { color: 'pink', text: 'FullGC 时, 老年代的内存空间', unit: 'MB', valueType: 'RAM' },\n      'jvm.gc.pause.count': { color: 'blue', text: '系统启动以来GC 次数', unit: '次' },\n      'jvm.gc.pause.totalTime': { color: 'blue', text: '系统启动以来GC 总耗时', unit: '秒' },\n    };\n  }\n  if (infoType == '3') {\n    return {\n      'tomcat.sessions.created': { color: 'green', text: 'tomcat 已创建 session 数', unit: '个' },\n      'tomcat.sessions.expired': { color: 'green', text: 'tomcat 已过期 session 数', unit: '个' },\n      'tomcat.sessions.active.current': { color: 'green', text: 'tomcat 当前活跃 session 数', unit: '个' },\n      'tomcat.sessions.active.max': { color: 'green', text: 'tomcat 活跃 session 数峰值', unit: '个' },\n      'tomcat.sessions.rejected': { color: 'green', text: '超过session 最大配置后，拒绝的 session 个数', unit: '个' },\n      'tomcat.global.sent': { color: 'purple', text: '发送的字节数', unit: 'bytes' },\n      'tomcat.global.request.max': { color: 'purple', text: 'request 请求最长耗时', unit: '秒' },\n      'tomcat.global.request.count': { color: 'purple', text: '全局 request 请求次数', unit: '次' },\n      'tomcat.global.request.totalTime': { color: 'purple', text: '全局 request 请求总耗时', unit: '秒' },\n      'tomcat.servlet.request.max': { color: 'cyan', text: 'servlet 请求最长耗时', unit: '秒' },\n      'tomcat.servlet.request.count': { color: 'cyan', text: 'servlet 总请求次数', unit: '次' },\n      'tomcat.servlet.request.totalTime': { color: 'cyan', text: 'servlet 请求总耗时', unit: '秒' },\n      'tomcat.threads.current': { color: 'pink', text: 'tomcat 当前线程数（包括守护线程）', unit: '个' },\n      'tomcat.threads.config.max': { color: 'pink', text: 'tomcat 配置的线程最大数', unit: '个' },\n    };\n  }\n  if (infoType == '5') {\n    return {\n      'memory.physical.total': { color: 'green', text: '总物理内存', unit: 'MB', valueType: 'RAM' },\n      'memory.physical.used': { color: 'green', text: '已使用物理内存', unit: 'MB', valueType: 'RAM' },\n      'memory.physical.free': { color: 'green', text: '可用物理内存', unit: 'MB', valueType: 'RAM' },\n      'memory.physical.usage': { color: 'green', text: '物理内存使用率', unit: '%', valueType: 'Number' },\n      'memory.runtime.total': { color: 'purple', text: 'JVM总内存', unit: 'MB', valueType: 'RAM' },\n      'memory.runtime.used': { color: 'purple', text: 'JVM已使用内存', unit: 'MB', valueType: 'RAM' },\n      'memory.runtime.max': { color: 'purple', text: 'JVM最大内存', unit: 'MB', valueType: 'RAM' },\n      'memory.runtime.free': { color: 'purple', text: 'JVM可用内存', unit: 'MB', valueType: 'RAM' },\n      'memory.runtime.usage': { color: 'purple', text: 'JVM内存使用率', unit: '%', valueType: 'Number' },\n    };\n  }\n  if (infoType == '6') {\n    // undertow 监控\n    return {\n      'undertow.sessions.created': { color: 'green', text: 'undertow 已创建 session 数', unit: '个' },\n      'undertow.sessions.expired': { color: 'green', text: 'undertow 已过期 session 数', unit: '个' },\n      'undertow.sessions.active.current': { color: 'green', text: 'undertow 当前活跃 session 数', unit: '个' },\n      'undertow.sessions.active.max': { color: 'green', text: 'undertow 活跃 session 数峰值', unit: '个' },\n      'undertow.sessions.rejected': { color: 'green', text: '超过session 最大配置后，拒绝的 session 个数', unit: '个' },\n    };\n  }\n};\n\n/**\n * 查询cpu数量\n * @param params\n */\nexport const getServerInfo = (infoType) => {\n  if (infoType == '1') {\n    return Promise.all([getCpuCount(), getCpuUsage(), getProcessStartTime(), getProcessUptime(), getProcessCpuUsage()]);\n  }\n  if (infoType == '2') {\n    return Promise.all([\n      getJvmMemoryMax(),\n      getJvmMemoryCommitted(),\n      getJvmMemoryUsed(),\n      getJvmBufferCount(),\n      getJvmBufferMemoryUsed(),\n      getJvmThreadsDaemon(),\n      getJvmThreadsLive(),\n      getJvmThreadsPeak(),\n      getJvmClassesLoaded(),\n      getJvmClassesUnloaded(),\n      getJvmGcLiveDataSize(),\n      getJvmGcMaxDataSize(),\n      getJvmGcMemoryAllocated(),\n      getJvmGcMemoryPromoted(),\n      getJvmGcPause(),\n    ]);\n  }\n  if (infoType == '3') {\n    return Promise.all([\n      getTomcatSessionsActiveCurrent(),\n      getTomcatSessionsActiveMax(),\n      getTomcatSessionsCreated(),\n      getTomcatSessionsExpired(),\n      getTomcatSessionsRejected(),\n    ]);\n  }\n  if (infoType == '5') {\n    return Promise.all([getMemoryInfo()]);\n  }\n  // undertow监控\n  if (infoType == '6') {\n    return Promise.all([\n      getUndertowSessionsActiveCurrent(),\n      getUndertowSessionsActiveMax(),\n      getUndertowSessionsCreated(),\n      getUndertowSessionsExpired(),\n    ]);\n  }\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/server/server.data.ts",
    "content": "import { BasicColumn } from '/@/components/Table';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '参数',\n    dataIndex: 'param',\n    width: 80,\n    align: 'left',\n    slots: { customRender: 'param' },\n  },\n  {\n    title: '描述',\n    dataIndex: 'text',\n    slots: { customRender: 'text' },\n    width: 80,\n  },\n  {\n    title: '当前值',\n    dataIndex: 'value',\n    slots: { customRender: 'value' },\n    width: 80,\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/trace/index.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\" :dataSource=\"dataSource\" @change=\"handlerTableChange\">\n      <template #tableTitle>\n        <div slot=\"message\">\n          共追踪到 {{ dataSource.length }} 条近期HTTP请求记录\n          <a-divider type=\"vertical\" />\n          <a @click=\"loadDate\">立即刷新</a>\n        </div>\n      </template>\n      <template #toolbar>\n        <a-radio-group class=\"http-status-choose\" size=\"small\" v-model:value=\"query\" @change=\"loadDate\">\n          <a-radio-button value=\"all\">全部</a-radio-button>\n          <a-radio-button value=\"success\">成功</a-radio-button>\n          <a-radio-button value=\"error\">错误</a-radio-button>\n        </a-radio-group>\n      </template>\n    </BasicTable>\n  </div>\n</template>\n<script lang=\"ts\" name=\"monitor-trace\" setup>\n  import { onMounted, ref, reactive } from 'vue';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { getActuatorList } from './trace.api';\n  import { columns } from './trace.data';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  const dataSource = ref([]);\n  const { createMessage } = useMessage();\n  const query = ref('all');\n  const order = ref('');\n\n  const [registerTable, { reload }] = useTable({\n    columns,\n    showIndexColumn: false,\n    bordered: true,\n    rowKey: 'id',\n  });\n\n  function loadDate() {\n    getActuatorList(query.value,order.value).then((res) => {\n      let filterData = [];\n      for (let d of res.traces) {\n        if (d.request.method !== 'OPTIONS' && d.request.uri.indexOf('httptrace') === -1) {\n          filterData.push(d);\n        }\n      }\n      dataSource.value = filterData;\n    });\n  }\n\n  const handlerTableChange = (args, arg1, sort, action) => {\n    if ('sort' == action.action && sort.field) {\n      order.value = sort.field;\n      if (sort.order) {\n        order.value += sort.order == 'ascend' ? '/asc' : '/desc';\n      } else {\n        order.value = '';\n      }\n    }\n    loadDate();\n  };\n\n  onMounted(() => {\n    loadDate();\n  });\n</script>\n<style scoped>\n  :deep(.jeecg-basic-table-header__toolbar) {\n    width: 150px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/trace/trace.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\n\nenum Api {\n  actuatorList = '/actuator/jeecghttptrace/',\n}\n\n/**\n * 追踪信息\n */\nexport const getActuatorList = (query: String, order: String) => {\n  return defHttp.get({ url: Api.actuatorList + query + '/' + order }, { isTransformResponse: false });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/monitor/trace/trace.data.ts",
    "content": "import { BasicColumn } from '/@/components/Table';\nimport dayjs from 'dayjs';\nimport _get from 'lodash.get';\nimport { h } from 'vue';\nimport { Tag } from 'ant-design-vue';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '请求时间',\n    dataIndex: 'timestamp',\n    width: 50,\n    customRender({ text }) {\n      return dayjs(text).format('YYYY-MM-DD HH:mm:ss');\n    },\n  },\n  {\n    title: '请求方法',\n    dataIndex: 'request.method',\n    width: 20,\n    customRender({ record, column }) {\n      let value = _get(record, column.dataIndex!);\n      let color = '';\n      if (value === 'GET') {\n        color = '#87d068';\n      }\n      if (value === 'POST') {\n        color = '#2db7f5';\n      }\n      if (value === 'PUT') {\n        color = '#ffba5a';\n      }\n      if (value === 'DELETE') {\n        color = '#ff5500';\n      }\n      return h(Tag, { color }, () => value);\n    },\n  },\n  {\n    title: '请求URL',\n    dataIndex: 'request.uri',\n    width: 200,\n    customRender({ record, column }) {\n      return _get(record, column.dataIndex!);\n    },\n  },\n  {\n    title: '响应状态',\n    dataIndex: 'response.status',\n    width: 50,\n    customRender({ record, column }) {\n      let value = _get(record, column.dataIndex!);\n      let color = '';\n      if (value < 200) {\n        color = 'pink';\n      } else if (value < 201) {\n        color = 'green';\n      } else if (value < 399) {\n        color = 'cyan';\n      } else if (value < 403) {\n        color = 'orange';\n      } else if (value < 501) {\n        color = 'red';\n      }\n      return h(Tag, { color }, () => value);\n    },\n  },\n  {\n    title: '请求耗时',\n    dataIndex: 'timeTaken',\n    width: 50,\n    customRender({ record, column }) {\n      let value = _get(record, column.dataIndex!);\n      let color = 'red';\n      if (value < 500) {\n        color = 'green';\n      } else if (value < 1000) {\n        color = 'cyan';\n      } else if (value < 1500) {\n        color = 'orange';\n      }\n      return h(Tag, { color }, () => `${value} ms`);\n    },\n    sorter: true,\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/openapi/OpenApi.api.ts",
    "content": "import {defHttp} from '/@/utils/http/axios';\nimport { useMessage } from \"/@/hooks/web/useMessage\";\n\nconst { createConfirm } = useMessage();\n\nenum Api {\n  list = '/openapi/list',\n  save='/openapi/add',\n  edit='/openapi/edit',\n  deleteOne = '/openapi/delete',\n  deleteBatch = '/openapi/deleteBatch',\n  genPath = '/openapi/genPath',\n  importExcel = '/openapi/importExcel',\n  exportXls = '/openapi/exportXls',\n  openApiHeaderList = '/openapi/list',\n  openApiParamList = '/openapi/list',\n  openApiJson = '/openapi/json',\n}\n\n/**\n * 子表单查询接口\n * @param params\n */\nexport const genPath = Api.genPath\n/**\n * swagger文档json\n * @param params\n */\nexport const openApiJson = Api.openApiJson\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n/**\n * 子表单查询接口\n * @param params\n */\nexport const queryOpenApiHeader = Api.openApiHeaderList\n/**\n * 子表单查询接口\n * @param params\n */\nexport const queryOpenApiParam = Api.openApiParamList\n\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) =>\n  defHttp.get({url: Api.list, params});\n\n/**\n * 删除单个\n */\nexport const deleteOne = (params,handleSuccess) => {\n  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n/**\n * 批量删除\n * @param params\n */\nexport const batchDelete = (params, handleSuccess) => {\n  createConfirm({\n    iconType: 'warning',\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n/**\n * 保存或者更新\n * @param params\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  if (isUpdate) {\n    return defHttp.put({url: Api.edit, params});\n  } else {\n    return defHttp.post({url: Api.save, params});\n  }\n}\n/**\n * 获取接口地址\n * @param params\n */\nexport const getGenPath = (params) =>\n  defHttp.get({url: Api.genPath, params},{isTransformResponse:false});\n/**\n * 子表列表接口\n * @param params\n */\nexport const openApiHeaderList = (params) =>\n  defHttp.get({url: Api.openApiHeaderList, params},{isTransformResponse:false});\n/**\n * 子表列表接口\n * @param params\n */\nexport const openApiParamList = (params) =>\n  defHttp.get({url: Api.openApiParamList, params},{isTransformResponse:false});\n/**\n * swagger文档json\n * @param params\n */\nexport const getOpenApiJson = (params) =>\n  defHttp.get({url: Api.openApiJson, params},{isTransformResponse:false});\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/openapi/OpenApi.data.ts",
    "content": "import {BasicColumn} from '/@/components/Table';\nimport {FormSchema} from '/@/components/Table';\nimport { rules} from '/@/utils/helper/validator';\nimport { render } from '/@/utils/common/renderUtils';\nimport {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types'\nimport { getWeekMonthQuarterYear } from '/@/utils';\n//列表数据\nexport const columns: BasicColumn[] = [\n   {\n    title: '接口名称',\n    align:\"center\",\n    dataIndex: 'name'\n   },\n   {\n    title: '请求方法',\n    align:\"center\",\n    dataIndex: 'requestMethod'\n   },\n   {\n    title: '接口地址',\n    align:\"center\",\n    dataIndex: 'requestUrl'\n   },\n   {\n    title: 'IP 黑名单',\n    align:\"center\",\n    dataIndex: 'blackList'\n   },\n   // {\n   //  title: '状态',\n   //  align:\"center\",\n   //  dataIndex: 'status'\n   // },\n   {\n    title: '创建人',\n    align:\"center\",\n    dataIndex: 'createBy'\n   },\n   {\n    title: '创建时间',\n    align:\"center\",\n    dataIndex: 'createTime'\n   },\n];\n//查询数据\nexport const searchFormSchema: FormSchema[] = [\n  {\n    label: \"接口名称\",\n    field: \"name\",\n    component: 'JInput',\n  },\n  {\n    label: \"创建人\",\n    field: \"createBy\",\n    component: 'JInput',\n  },\n];\n//表单数据\nexport const formSchema: FormSchema[] = [\n  {\n    label: '接口名称',\n    field: 'name',\n    component: 'Input',\n    dynamicRules: ({model,schema}) => {\n          return [\n                 { required: true, message: '请输入接口名称!'},\n          ];\n     },\n  },\n  {\n    label: '原始地址',\n    field: 'originUrl',\n    component: 'Input',\n  },\n  {\n    label: '请求方法',\n    field: 'requestMethod',\n    component: 'JSearchSelect',\n    componentProps:{\n      dictOptions: [\n        {\n          text: 'POST',\n          value: 'POST',\n        },\n        {\n          text: 'GET',\n          value: 'GET',\n        },\n        {\n          text: 'HEAD',\n          value: 'HEAD',\n        },\n        {\n          text: 'PUT',\n          value: 'PUT',\n        },\n        {\n          text: 'PATCH',\n          value: 'PATCH',\n        },\n        {\n          text: 'DELETE',\n          value: 'DELETE',\n        },{\n          text: 'OPTIONS',\n          value: 'OPTIONS',\n        },{\n          text: 'TRACE',\n          value: 'TRACE',\n        },\n      ]\n     },\n    dynamicRules: ({model,schema}) => {\n          return [\n                 { required: true, message: '请输入请求方法!'},\n          ];\n     },\n  },\n  {\n    label: '接口地址',\n    field: 'requestUrl',\n    component: 'Input',\n    dynamicDisabled:true\n  },\n  {\n    label: 'IP 黑名单',\n    field: 'blackList',\n    component: 'Input',\n  },\n  {\n    label: '请求体内容',\n    component:\"Input\",\n    field: 'body'\n  },\n  {\n    label: '删除标识',\n    field: 'delFlag',\n    component: 'Input',\n    defaultValue:0,\n    show:false\n  },\n  {\n    label: '状态',\n    field: 'status',\n    component: 'Input',\n    defaultValue:\"1\",\n    show:false\n  },\n\t// TODO 主键隐藏字段，目前写死为ID\n\t{\n\t  label: '',\n\t  field: 'id',\n\t  component: 'Input',\n\t  show: false\n\t},\n];\n//子表单数据\n//子表列表数据\nexport const openApiHeaderColumns: BasicColumn[] = [\n   // {\n   //  title: 'apiId',\n   //  align:\"center\",\n   //  dataIndex: 'apiId'\n   // },\n   {\n    title: '请求头Key',\n    align:\"center\",\n    dataIndex: 'headerKey'\n   },\n   {\n    title: '是否必填',\n    align:\"center\",\n    dataIndex: 'required_dictText'\n   },\n   {\n    title: '默认值',\n    align:\"center\",\n    dataIndex: 'defaultValue'\n   },\n   {\n    title: '备注',\n    align:\"center\",\n    dataIndex: 'note'\n   },\n];\n//子表列表数据\nexport const openApiParamColumns: BasicColumn[] = [\n   // {\n   //  title: 'apiId',\n   //  align:\"center\",\n   //  dataIndex: 'apiId'\n   // },\n   {\n    title: '参数Key',\n    align:\"center\",\n    dataIndex: 'paramKey'\n   },\n   {\n    title: '是否必填',\n    align:\"center\",\n    dataIndex: 'required_dictText'\n   },\n   {\n    title: '默认值',\n    align:\"center\",\n    dataIndex: 'defaultValue'\n   },\n   {\n    title: '备注',\n    align:\"center\",\n    dataIndex: 'note'\n   },\n];\n//子表表格配置\nexport const openApiHeaderJVxeColumns: JVxeColumn[] = [\n    // {\n    //   title: 'apiId',\n    //   key: 'apiId',\n    //   type: JVxeTypes.input,\n    //   width:\"200px\",\n    //   placeholder: '请输入${title}',\n    //   defaultValue:'',\n    // },\n    {\n      title: '请求头Key',\n      key: 'headerKey',\n      type: JVxeTypes.input,\n      width:\"200px\",\n      placeholder: '请输入${title}',\n      defaultValue:'',\n    },\n    {\n      title: '是否必填',\n      key: 'required',\n      type: JVxeTypes.checkbox,\n      options:[],\n      // dictCode:\"yn\",\n      width:\"100px\",\n      placeholder: '请输入${title}',\n      defaultValue:'',\n      customValue: ['1','0']\n    },\n    {\n      title: '默认值',\n      key: 'defaultValue',\n      type: JVxeTypes.input,\n      width:\"200px\",\n      placeholder: '请输入${title}',\n      defaultValue:'',\n    },\n    {\n      title: '备注',\n      key: 'note',\n      type: JVxeTypes.input,\n      placeholder: '请输入${title}',\n      defaultValue:'',\n    },\n  ]\nexport const openApiParamJVxeColumns: JVxeColumn[] = [\n    // {\n    //   title: 'apiId',\n    //   key: 'apiId',\n    //   type: JVxeTypes.input,\n    //   width:\"200px\",\n    //   placeholder: '请输入${title}',\n    //   defaultValue:'',\n    // },\n    {\n      title: '参数Key',\n      key: 'paramKey',\n      type: JVxeTypes.input,\n      width:\"200px\",\n      placeholder: '请输入${title}',\n      defaultValue:'',\n    },\n    {\n      title: '是否必填',\n      key: 'required',\n      type: JVxeTypes.checkbox,\n      options:[],\n      // dictCode:\"yn\",\n      width:\"100px\",\n      placeholder: '请输入${title}',\n      defaultValue:'',\n      customValue: ['1','0']\n    },\n    {\n      title: '默认值',\n      key: 'defaultValue',\n      type: JVxeTypes.input,\n      width:\"200px\",\n      placeholder: '请输入${title}',\n      defaultValue:'',\n    },\n    {\n      title: '备注',\n      key: 'note',\n      type: JVxeTypes.input,\n      placeholder: '请输入${title}',\n      defaultValue:'',\n    },\n  ]\n\n// 高级查询数据\nexport const superQuerySchema = {\n  name: {title: '接口名称',order: 0,view: 'text', type: 'string',},\n  requestMethod: {title: '请求方法',order: 1,view: 'list', type: 'string',dictCode: '',},\n  requestUrl: {title: '接口地址',order: 2,view: 'text', type: 'string',},\n  blackList: {title: 'IP 黑名单',order: 3,view: 'text', type: 'string',},\n  status: {title: '状态',order: 5,view: 'number', type: 'number',},\n  createBy: {title: '创建人',order: 6,view: 'text', type: 'string',},\n  createTime: {title: '创建时间',order: 7,view: 'datetime', type: 'string',},\n  //子表高级查询\n  openApiHeader: {\n    title: '请求头表',\n    view: 'table',\n    fields: {\n        // apiId: {title: 'apiId',order: 0,view: 'text', type: 'string',},\n        headerKey: {title: '请求头Key',order: 1,view: 'text', type: 'string',},\n        required: {title: '是否必填',order: 2,view: 'number', type: 'number',dictCode: 'yn',},\n        defaultValue: {title: '默认值',order: 3,view: 'text', type: 'string',},\n        note: {title: '备注',order: 4,view: 'text', type: 'string',},\n    }\n  },\n  openApiParam: {\n    title: '请求参数部分',\n    view: 'table',\n    fields: {\n        // apiId: {title: 'apiId',order: 0,view: 'text', type: 'string',},\n        paramKey: {title: '参数Key',order: 1,view: 'text', type: 'string',},\n        required: {title: '是否必填',order: 2,view: 'number', type: 'number',dictCode: 'yn',},\n        defaultValue: {title: '默认值',order: 3,view: 'text', type: 'string',},\n        note: {title: '备注',order: 4,view: 'text', type: 'string',},\n    }\n  },\n};\n\n/**\n* 流程表单调用这个方法获取formSchema\n* @param param\n*/\nexport function getBpmFormSchema(_formData): FormSchema[]{\n  // 默认和原始表单保持一致 如果流程中配置了权限数据，这里需要单独处理formSchema\n  return formSchema;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/openapi/OpenApiAuth.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { useMessage } from \"/@/hooks/web/useMessage\";\n\nconst { createConfirm } = useMessage();\n\nenum Api {\n  list = '/openapi/auth/list',\n  save='/openapi/auth/add',\n  edit='/openapi/auth/edit',\n  apiList= '/openapi/list',\n  genAKSK = '/openapi/auth/genAKSK',\n  permissionList='/openapi/permission/getOpenApi',\n  permissionAdd='/openapi/permission/add',\n  deleteOne = '/openapi/auth/delete',\n  deleteBatch = '/openapi/auth/deleteBatch',\n  importExcel = '/openapi/auth/importExcel',\n  exportXls = '/openapi/auth/exportXls',\n}\n\n/**\n * 获取API\n * @param params\n */\nexport const apiList = Api.apiList;\n/**\n * 权限添加\n * @param params\n */\nexport const permissionAdd = Api.permissionAdd;\n/**\n * 生成AKSK\n * @param params\n */\nexport const genAKSK = Api.genAKSK;\n\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) => defHttp.get({ url: Api.list, params });\n\n/**\n * 删除单个\n * @param params\n * @param handleSuccess\n */\nexport const deleteOne = (params,handleSuccess) => {\n  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n\n/**\n * 批量删除\n * @param params\n * @param handleSuccess\n */\nexport const batchDelete = (params, handleSuccess) => {\n  createConfirm({\n    iconType: 'warning',\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n\n/**\n * 保存或者更新\n * @param params\n * @param isUpdate\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  if (isUpdate) {\n    return defHttp.put({ url: Api.edit, params }, { isTransformResponse: false });\n  }\n  return defHttp.post({ url: Api.save, params }, { isTransformResponse: false });\n}\n\n/**\n * 全部权限列表接口\n * @param params\n */\nexport const getApiList = (params) => defHttp.get({ url: Api.apiList, params }, { isTransformResponse: false });\n\n/**\n * 获取已授权项目的接口\n * @param params\n */\nexport const getPermissionList = (params) => defHttp.get({ url: Api.permissionList, params });\n/**\n * 授权保存方法\n * @param params\n * @param isUpdate\n */\nexport const permissionAddFunction = (params) => {\n  return defHttp.post({ url: Api.permissionAdd, params }, { isTransformResponse: false });\n}\n/**\n * 授权保存方法\n * @param params\n * @param isUpdate\n */\nexport const getGenAKSK = (params) => {\n  return defHttp.get({ url: Api.genAKSK, params });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/openapi/OpenApiAuth.data.ts",
    "content": "import {BasicColumn} from '/@/components/Table';\nimport {FormSchema} from '/@/components/Table';\nimport { rules} from '/@/utils/helper/validator';\nimport { render } from '/@/utils/common/renderUtils';\nimport { getWeekMonthQuarterYear } from '/@/utils';\n//列表数据\nexport const columns: BasicColumn[] = [\n  {\n    title: '授权名称',\n    align: \"center\",\n    dataIndex: 'name'\n  },\n  {\n    title: 'AK',\n    align: \"center\",\n    dataIndex: 'ak'\n  },\n  {\n    title: 'SK',\n    align: \"center\",\n    dataIndex: 'sk'\n  },\n  {\n    title: '创建人',\n    align: \"center\",\n    dataIndex: 'createBy'\n  },\n  {\n    title: '创建时间',\n    align: \"center\",\n    dataIndex: 'createTime'\n  },\n  // {\n  //   title: '关联系统用户名',\n  //   align: \"center\",\n  //   dataIndex: 'createBy',\n  // },\n];\n\n// 高级查询数据\nexport const superQuerySchema = {\n  name: {title: '授权名称',order: 0,view: 'text', type: 'string',},\n  ak: {title: 'AK',order: 1,view: 'text', type: 'string',},\n  sk: {title: 'SK',order: 2,view: 'text', type: 'string',},\n  createBy: {title: '关联系统用户名',order: 3,view: 'text', type: 'string',},\n  createTime: {title: '创建时间',order: 4,view: 'datetime', type: 'string',},\n  // systemUserId: {title: '关联系统用户名',order: 5,view: 'text', type: 'string',},\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/openapi/OpenApiAuthList.vue",
    "content": "<template>\n  <div class=\"p-2\">\n    <!--查询区域-->\n    <div class=\"jeecg-basic-table-form-container\">\n      <a-form ref=\"formRef\" @keyup.enter.native=\"searchQuery\" :model=\"queryParam\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\">\n        <a-row :gutter=\"24\">\n          <a-col :lg=\"6\">\n            <a-form-item name=\"name\">\n              <template #label><span title=\"授权名称\">授权名称</span></template>\n              <a-input placeholder=\"请输入授权名称\" v-model:value=\"queryParam.name\" allow-clear ></a-input>\n            </a-form-item>\n          </a-col>\n          <a-col :lg=\"6\">\n            <a-form-item name=\"createBy\">\n              <template #label><span title=\"关联系统用户名\">关联系统用户名</span></template>\n              <JSearchSelect dict=\"sys_user,username,username\" v-model:value=\"queryParam.createBy\" placeholder=\"请输入关联系统用户名\"  allow-clear ></JSearchSelect>\n<!--              <a-input placeholder=\"请输入关联系统用户名\" v-model:value=\"queryParam.systemUserId\" allow-clear ></a-input>-->\n            </a-form-item>\n          </a-col>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left; overflow: hidden\" class=\"table-page-search-submitButtons\">\n              <a-col :lg=\"6\">\n                <a-button type=\"primary\" preIcon=\"ant-design:search-outlined\" @click=\"searchQuery\">查询</a-button>\n                <a-button type=\"primary\" preIcon=\"ant-design:reload-outlined\" @click=\"searchReset\" style=\"margin-left: 8px\">重置</a-button>\n                <a @click=\"toggleSearchStatus = !toggleSearchStatus\" style=\"margin-left: 8px\">\n                  {{ toggleSearchStatus ? '收起' : '展开' }}\n                  <Icon :icon=\"toggleSearchStatus ? 'ant-design:up-outlined' : 'ant-design:down-outlined'\" />\n                </a>\n              </a-col>\n            </span>\n          </a-col>\n        </a-row>\n      </a-form>\n    </div>\n    <!--引用表格-->\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-button type=\"primary\" v-auth=\"'openapi:open_api_auth:add'\"  @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\"> 新增</a-button>\n        <a-button  type=\"primary\" v-auth=\"'openapi:open_api_auth:exportXls'\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n        <j-upload-button  type=\"primary\" v-auth=\"'openapi:open_api_auth:importExcel'\"  preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button v-auth=\"'openapi:open_api_auth:deleteBatch'\">批量操作\n            <Icon icon=\"mdi:chevron-down\"></Icon>\n          </a-button>\n        </a-dropdown>\n        <!-- 高级查询 -->\n        <super-query :config=\"superQueryConfig\" @search=\"handleSuperQuery\" />\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\"/>\n      </template>\n      <template v-slot:bodyCell=\"{ column, record, index, text }\">\n      </template>\n    </BasicTable>\n\n    <!-- 表单区域 -->\n    <OpenApiAuthModal ref=\"registerModal\" @success=\"handleSuccess\"></OpenApiAuthModal>\n    <AuthModal ref=\"authModal\" @success=\"handleSuccess\"></AuthModal>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"openapi-openApiAuth\" setup>\n  import { ref, reactive } from 'vue';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { columns, superQuerySchema } from './OpenApiAuth.data';\n  import {\n    list,\n    deleteOne,\n    batchDelete,\n    getImportUrl,\n    getExportUrl,\n    getGenAKSK, saveOrUpdate\n  } from \"./OpenApiAuth.api\";\n  import OpenApiAuthModal from './components/OpenApiAuthModal.vue'\n  import AuthModal from './components/AuthModal.vue'\n  import { useUserStore } from '/@/store/modules/user';\n  import JSearchSelect from \"../../components/Form/src/jeecg/components/JSearchSelect.vue\";\n\n  const formRef = ref();\n  const queryParam = reactive<any>({});\n  const toggleSearchStatus = ref<boolean>(false);\n  const registerModal = ref();\n  const authModal = ref();\n  const userStore = useUserStore();\n  //注册table数据\n  const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({\n    tableProps: {\n      title: '授权管理',\n      api: list,\n      columns,\n      canResize:false,\n      useSearchForm: false,\n      actionColumn: {\n        width: 200,\n        fixed: 'right',\n      },\n      beforeFetch: async (params) => {\n        return Object.assign(params, queryParam);\n      },\n    },\n    exportConfig: {\n      name: \"授权管理\",\n      url: getExportUrl,\n      params: queryParam,\n    },\n\t  importConfig: {\n\t    url: getImportUrl,\n\t    success: handleSuccess\n\t  },\n  });\n  const [registerTable, { reload, updateTableDataRecord, getDataSource }, { rowSelection, selectedRowKeys }] = tableContext;\n  const labelCol = reactive({\n    xs:24,\n    sm:10,\n    xl:6,\n    xxl:10\n  });\n  const wrapperCol = reactive({\n    xs: 24,\n    sm: 20,\n  });\n\n  // 高级查询配置\n  const superQueryConfig = reactive(superQuerySchema);\n\n  /**\n   * 高级查询事件\n   */\n  function handleSuperQuery(params) {\n    Object.keys(params).map((k) => {\n      queryParam[k] = params[k];\n    });\n    searchQuery();\n  }\n\n  /**\n   * 新增事件\n   */\n  function handleAdd() {\n    registerModal.value.disableSubmit = false;\n    registerModal.value.add();\n  }\n  \n  /**\n   * 编辑事件\n   */\n  function handleAuth(record: Recordable) {\n    authModal.value.disableSubmit = false;\n    authModal.value.edit(record);\n  }\n\n  /**\n   * 编辑事件\n   */\n  function handleEdit(record: Recordable) {\n    registerModal.value.disableSubmit = false;\n    registerModal.value.authDrawerOpen = true;\n    registerModal.value.edit(record);\n  }\n\n  /**\n   * 重置事件\n   * @param record\n   */\n  async function handleReset(record: Recordable) {\n    const AKSKObj = await getGenAKSK({});\n    record.ak = AKSKObj[0];\n    record.sk = AKSKObj[1];\n    saveOrUpdate(record,true);\n    // handleSuccess;\n\n  }\n   \n  /**\n   * 详情\n   */\n  function handleDetail(record: Recordable) {\n    registerModal.value.disableSubmit = true;\n    registerModal.value.edit(record);\n  }\n   \n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteOne({ id: record.id }, handleSuccess);\n  }\n   \n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDelete({ ids: selectedRowKeys.value }, handleSuccess);\n  }\n   \n  /**\n   * 成功回调\n   */\n  function handleSuccess() {\n    (selectedRowKeys.value = []) && reload();\n  }\n   \n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '授权',\n        onClick: handleAuth.bind(null, record),\n        auth: 'openapi:open_api_auth:edit'\n      },\n      {\n        label: '重置',\n        popConfirm: {\n          title: '是否重置AK,SK',\n          confirm: handleReset.bind(null, record),\n          placement: 'topLeft',\n        },\n        auth: 'openapi:open_api_auth:edit'\n      },\n    ];\n  }\n   \n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record) {\n    return [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      }, {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft',\n        },\n        auth: 'openapi:open_api_auth:delete'\n      }\n    ]\n  }\n\n  /**\n   * 查询\n   */\n  function searchQuery() {\n    reload();\n  }\n  \n  /**\n   * 重置\n   */\n  function searchReset() {\n    formRef.value.resetFields();\n    selectedRowKeys.value = [];\n    //刷新数据\n    reload();\n  }\n  \n\n\n\n\n</script>\n\n<style lang=\"less\" scoped>\n  .jeecg-basic-table-form-container {\n    padding: 0;\n    .table-page-search-submitButtons {\n      display: block;\n      margin-bottom: 24px;\n      white-space: nowrap;\n    }\n    .query-group-cust{\n      min-width: 100px !important;\n    }\n    .query-group-split-cust{\n      width: 30px;\n      display: inline-block;\n      text-align: center\n    }\n    .ant-form-item:not(.ant-form-item-with-help){\n      margin-bottom: 16px;\n      height: 32px;\n    }\n    :deep(.ant-picker),:deep(.ant-input-number){\n      width: 100%;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/openapi/OpenApiList.vue",
    "content": "<template>\n  <div>\n    <!--引用表格-->\n   <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\"  @expand=\"handleExpand\">\n      <!-- 内嵌table区域 begin -->\n<!--           <template #expandedRowRender=\"{record}\">-->\n<!--             <a-tabs tabPosition=\"top\">-->\n<!--               <a-tab-pane tab=\"请求头表\" key=\"openApiHeader\" forceRender>-->\n<!--                  <openApiHeaderSubTable v-if=\"expandedRowKeys.includes(record.id)\" :id=\"record.id\" />-->\n<!--               </a-tab-pane>-->\n<!--               <a-tab-pane tab=\"请求参数部分\" key=\"openApiParam\" forceRender>-->\n<!--                  <openApiParamSubTable v-if=\"expandedRowKeys.includes(record.id)\" :id=\"record.id\" />-->\n<!--               </a-tab-pane>-->\n<!--             </a-tabs>-->\n<!--           </template>-->\n     <!-- 内嵌table区域 end -->\n     <!--插槽:table标题-->\n      <template #tableTitle>\n          <a-button type=\"primary\" v-auth=\"'openapi:open_api:add'\"  @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\"> 新增</a-button>\n          <a-button  type=\"primary\" v-auth=\"'openapi:open_api:exportXls'\"  preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n          <j-upload-button  type=\"primary\" v-auth=\"'openapi:open_api:importExcel'\"  preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n          <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n              <template #overlay>\n                <a-menu>\n                  <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                    <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                    删除\n                  </a-menu-item>\n                </a-menu>\n              </template>\n              <a-button  v-auth=\"'openapi:open_api:deleteBatch'\">批量操作\n                <Icon icon=\"mdi:chevron-down\"></Icon>\n              </a-button>\n        </a-dropdown>\n        <!-- 高级查询 -->\n        <super-query :config=\"superQueryConfig\" @search=\"handleSuperQuery\" />\n      </template>\n       <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\"/>\n      </template>\n      <!--字段回显插槽-->\n      <template v-slot:bodyCell=\"{ column, record, index, text }\">\n      </template>\n    </BasicTable>\n    <!-- 表单区域 -->\n    <OpenApiModal @register=\"registerModal\" @success=\"handleSuccess\"></OpenApiModal>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"openapi-openApi\" setup>\n  import {ref, reactive, computed, unref} from 'vue';\n  import {BasicTable, useTable, TableAction} from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage'\n  import {useModal} from '/@/components/Modal';\n  import OpenApiModal from './components/OpenApiModal.vue'\n  import OpenApiHeaderSubTable from './subTables/OpenApiHeaderSubTable.vue'\n  import OpenApiParamSubTable from './subTables/OpenApiParamSubTable.vue'\n  import {columns, searchFormSchema, superQuerySchema} from './OpenApi.data';\n  import {list, deleteOne, batchDelete, getImportUrl,getExportUrl} from './OpenApi.api';\n  import {downloadFile} from '/@/utils/common/renderUtils';\n  import { useUserStore } from '/@/store/modules/user';\n  const queryParam = reactive<any>({});\n   // 展开key\n  const expandedRowKeys = ref<any[]>([]);\n  //注册model\n  const [registerModal, {openModal}] = useModal();\n  const userStore = useUserStore();\n   //注册table数据\n  const { prefixCls,tableContext,onExportXls,onImportXls } = useListPage({\n      tableProps:{\n           title: '接口管理',\n           api: list,\n           columns,\n           canResize:false,\n           formConfig: {\n                //labelWidth: 120,\n                schemas: searchFormSchema,\n                autoSubmitOnEnter:true,\n                showAdvancedButton:true,\n                fieldMapToNumber: [\n                ],\n                fieldMapToTime: [\n                ],\n            },\n           actionColumn: {\n               width: 120,\n               fixed:'right'\n           },\n           beforeFetch: (params) => {\n             return Object.assign(params, queryParam);\n           },\n        },\n        exportConfig: {\n            name:\"接口管理\",\n            url: getExportUrl,\n            params: queryParam,\n        },\n        importConfig: {\n            url: getImportUrl,\n            success: handleSuccess\n        },\n    })\n\n  const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext\n\n   // 高级查询配置\n   const superQueryConfig = reactive(superQuerySchema);\n\n   /**\n   * 高级查询事件\n   */\n   function handleSuperQuery(params) {\n     Object.keys(params).map((k) => {\n       queryParam[k] = params[k];\n     });\n     reload();\n   }\n\n   /**\n     * 展开事件\n     * */\n   function handleExpand(expanded, record){\n        expandedRowKeys.value=[];\n        if (expanded === true) {\n           expandedRowKeys.value.push(record.id)\n        }\n    }\n   /**\n    * 新增事件\n    */\n  function handleAdd() {\n     openModal(true, {\n       isUpdate: false,\n       showFooter: true,\n     });\n  }\n   /**\n    * 编辑事件\n    */\n  function handleEdit(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: true,\n     });\n   }\n   /**\n    * 详情\n   */\n  function handleDetail(record: Recordable) {\n     openModal(true, {\n       record,\n       isUpdate: true,\n       showFooter: false,\n     });\n   }\n   /**\n    * 删除事件\n    */\n  async function handleDelete(record) {\n     await deleteOne({id: record.id}, handleSuccess);\n   }\n   /**\n    * 批量删除事件\n    */\n  async function batchHandleDelete() {\n     await batchDelete({ids: selectedRowKeys.value},handleSuccess);\n   }\n   /**\n    * 成功回调\n    */\n  function handleSuccess() {\n      (selectedRowKeys.value = []) && reload();\n   }\n   /**\n      * 操作栏\n      */\n  function getTableAction(record){\n       return [\n         {\n           label: '编辑',\n           onClick: handleEdit.bind(null, record),\n           auth: 'openapi:open_api:edit'\n         }\n       ]\n   }\n\n\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record){\n    return [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      }, {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft'\n        },\n        auth: 'openapi:open_api:delete'\n      }\n    ]\n  }\n\n\n</script>\n\n<style lang=\"less\" scoped>\n  :deep(.ant-picker),:deep(.ant-input-number){\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/openapi/SwaggerUI.vue",
    "content": "<template>\n  <div ref=\"swaggerUiRef\" style=\"height: 100%;\"></div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, onMounted } from 'vue';\n// 尝试直接导入 SwaggerUI 而不是使用 * as\nimport SwaggerUI from 'swagger-ui-dist/swagger-ui-bundle'; // 确保使用 ESM 版本\nimport 'swagger-ui-dist/swagger-ui.css';\n\nimport { getOpenApiJson } from './OpenApi.api';\n\nconst swaggerUiRef = ref<HTMLElement | null>(null);\nconst API_DOMAIN = import.meta.env.VITE_GLOB_DOMAIN_URL\nonMounted(async () => {\n  try {\n    const response = await getOpenApiJson();\n    const openApiJson = response;\n    if (swaggerUiRef.value) {\n      SwaggerUI({\n        domNode: swaggerUiRef.value,\n        spec: openApiJson,\n      });\n    }\n  } catch (error) {\n    console.error('Failed to fetch OpenAPI JSON:', error);\n  }\n});\n</script>\n\n<style scoped>\n/* 确保容器有高度 */\n.swagger-ui-container {\n  height: 100%;\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/openapi/components/AuthForm.vue",
    "content": "<template>\n  <a-spin :spinning=\"confirmLoading\">\n    <a-row :span=\"24\" style=\"margin-bottom: 10px\">\n      <a-col :span=\"12\" v-for=\"item in apiList\" @click=\"handleSelect(item)\">\n        <a-card :style=\"item.checked ? { border: '1px solid #3370ff' } : {}\" hoverable class=\"checkbox-card\" :body-style=\"{ width: '100%', padding: '10px' }\">\n          <div class=\"checkbox-name\" style=\"display: flex; width: 100%; justify-content: space-between\">\n            <span>接口名称: {{ item.name }}</span>\n            <a-checkbox v-model:checked=\"item.checked\" @click.stop class=\"quantum-checker\" @change=\"(e) => handleChange(e, item)\"> </a-checkbox>\n          </div>\n          <div class=\"checkbox-name\" style=\"margin-top: 4px\">\n            请求方式: <span>{{item.requestMethod}}</span>\n          </div>\n        </a-card>\n      </a-col>\n    </a-row>\n    <Pagination\n      v-if=\"apiList.length > 0\"\n      :current=\"pageNo\"\n      :page-size=\"pageSize\"\n      :page-size-options=\"pageSizeOptions\"\n      :total=\"total\"\n      :showQuickJumper=\"true\"\n      :showSizeChanger=\"true\"\n      @change=\"handlePageChange\"\n      class=\"list-footer\"\n      size=\"small\"\n    />\n  </a-spin>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, defineExpose, defineProps, nextTick, reactive, ref } from \"vue\";\nimport { useMessage } from '/@/hooks/web/useMessage';\nimport { getApiList, getPermissionList, permissionAddFunction } from '../OpenApiAuth.api';\nimport { Form, Pagination } from 'ant-design-vue';\n\nconst props = defineProps({\n    formDisabled: { type: Boolean, default: false },\n    formData: { type: Object, default: () => ({}) },\n    formBpm: { type: Boolean, default: true },\n  });\n  const useForm = Form.useForm;\n  const emit = defineEmits(['register', 'ok']);\n  const { createMessage } = useMessage();\n  const confirmLoading = ref<boolean>(false);\n  //认证ID\n  const apiAuthId = ref<string>('');\n  //表单验证\n  const validatorRules = reactive({});\n  //api列表\n  const apiList = ref<any>([]);\n  //选中的值\n  const selectedRowKeys = ref<any>([]);\n  //选中的数据\n  const selectedRows = ref<any>([]);\n  //当前页数\n  const pageNo = ref<number>(1);\n  //每页条数\n  const pageSize = ref<number>(10);\n  //总条数\n  const total = ref<number>(0);\n  //可选择的页数\n  const pageSizeOptions = ref<any>(['10', '20', '30']);\n\n  // 表单禁用\n  const disabled = computed(() => {\n    if (props.formBpm === true) {\n      if (props.formData.disabled === false) {\n        return false;\n      } else {\n        return true;\n      }\n    }\n    return props.formDisabled;\n  });\n\n  /**\n   * 加载数据\n   */\n  function reload() {\n    getApiList({ pageNo: pageNo.value, pageSize: pageSize.value, column: 'createTime', order: 'desc'}).then((res)=>{\n      if (res.success) {\n        for (const item of res.result.records) {\n          item.checked = false;\n        }\n        apiList.value = res.result.records;\n        total.value = res.result.total;\n        setChecked();\n      } else {\n        apiList.value = [];\n        total.value = 0;\n      }\n    });\n  }\n  \n  /**\n   * 新增\n   */\n  function add() {\n    edit({});\n  }\n\n  /**\n   * 编辑\n   */\n  async function edit(record) {\n    selectedRowKeys.value = [];\n    selectedRows.value = [];\n    pageNo.value = 1;\n    pageSize.value = 10;\n    apiAuthId.value = record.id;\n    await nextTick(() => {\n      // 获取当前已授权的项目\n      getPermissionList({ apiAuthId: record.id }).then((res) => {\n        if (res.length > 0) {\n          res.forEach((item) => {\n            if(item.ifCheckBox == \"1\"){\n              selectedRowKeys.value.push(item.id);\n              selectedRows.value.push(item);\n            }\n          });\n          //设置选中\n          setChecked();\n        }\n      });\n      reload();\n    });\n  }\n\n  /**\n   * 提交数据\n   */\n  async function submitForm() {\n    confirmLoading.value = true;\n    //时间格式化\n    let model = {};\n    let apiId = \"\"\n    selectedRowKeys.value.forEach((item) => {\n      apiId += item +\",\";\n    })\n    model['apiId'] = apiId;\n    model['apiAuthId'] = apiAuthId.value;\n    await permissionAddFunction(model)\n      .then((res) => {\n        if (res.success) {\n          createMessage.success(res.message);\n          emit('ok');\n          cleanData()\n        } else {\n          createMessage.warning(res.message);\n        }\n      })\n      .finally(() => {\n        confirmLoading.value = false;\n      });\n  }\n  const cleanData = () => {\n    selectedRows.value = []\n    selectedRowKeys.value = []\n  };\n\n  /**\n   * 复选框选中事件\n   * @param item\n   */\n  function handleSelect(item) {\n    let id = item.id;\n    const target = apiList.value.find((item) => item.id === id);\n    if (target) {\n      target.checked = !target.checked;\n    }\n    //存放选中的知识库的id\n    if (!selectedRowKeys.value || selectedRowKeys.value.length == 0) {\n      selectedRowKeys.value.push(id);\n      selectedRows.value.push(item);\n      return;\n    }\n    let findIndex = selectedRowKeys.value.findIndex((item) => item === id);\n    if (findIndex === -1) {\n      selectedRowKeys.value.push(id);\n      selectedRows.value.push(item);\n    } else {\n      selectedRowKeys.value.splice(findIndex, 1);\n      selectedRows.value.splice(findIndex, 1);\n    }\n  }\n\n  /**\n   * 复选框选中事件\n   *\n   * @param e\n   * @param item\n   */\n  function handleChange(e, item: any) {\n    if (e.target.checked) {\n      selectedRowKeys.value.push(item.id);\n      selectedRows.value.push(item);\n    } else {\n      let findIndex = selectedRowKeys.value.findIndex((val) => val === item.id);\n      if (findIndex != -1) {\n        selectedRowKeys.value.splice(findIndex, 1);\n        selectedRows.value.splice(findIndex, 1);\n      }\n    }\n  }\n\n  /**\n   * 分页改变事件\n   * @param page\n   * @param current\n   */\n  function handlePageChange(page, current) {\n    pageNo.value = page;\n    pageSize.value = current;\n    reload();\n  }\n\n  /**\n   * 设置选装状态\n   */\n  function setChecked() {\n    if (apiList.value && apiList.value.length > 0){\n      let value = selectedRowKeys.value.join(',');\n      apiList.value = apiList.value.map((item) => {\n        if (value.indexOf(item.id) !== -1) {\n          item.checked = true;\n        } else {\n          item.checked = false;\n        }\n        return item;\n      });\n    }\n  }\n\n  defineExpose({\n    add,\n    edit,\n    submitForm,\n    cleanData\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .antd-modal-form {\n    padding: 14px;\n  }\n  .list-footer {\n    position: absolute;\n    bottom: -22px;\n    right: 10px;\n    text-align: center;\n  }\n  .checkbox-card {\n    margin-bottom: 10px;\n    margin-right: 10px;\n  }\n  .checkbox-img {\n    width: 30px;\n    height: 30px;\n  }\n  .checkbox-name {\n    margin-left: 4px;\n    font-size: 13px;\n  }\n  .use-select {\n    color: #646a73;\n    position: absolute;\n    bottom: 0;\n    left: 20px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/openapi/components/AuthModal.vue",
    "content": "<template>\n  <!--  <j-modal :title=\"title\" :width=\"width\" :visible=\"visible\" @ok=\"handleOk\" :okButtonProps=\"{ class: { 'jee-hidden': disableSubmit } }\" @cancel=\"handleCancel\" cancelText=\"关闭\">-->\n  <div style=\"position: relative;\">\n    <a-modal\n      v-model:open=\"authDrawerOpen\"\n      class=\"custom-class\"\n      root-class-name=\"root-class-name\"\n      :root-style=\"{ color: 'blue' }\"\n      :body-style=\"{ padding: '20px' }\"\n      style=\"color: red\"\n      :title=\"title\"\n      :width=\"600\"\n      @after-open-change=\"authDrawerOpenChange\"\n      @ok=\"handleOk\"\n    >\n      <AuthForm ref=\"registerForm\" @ok=\"submitCallback\" :formDisabled=\"disableSubmit\" :formBpm=\"false\"></AuthForm>\n    </a-modal>\n  </div>\n  <!--  </j-modal>-->\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, nextTick, defineExpose } from 'vue';\n  import AuthForm from './AuthForm.vue';\n  import JModal from '/@/components/Modal/src/JModal/JModal.vue';\n\n  const title = ref<string>('');\n  const width = ref<number>(800);\n  const visible = ref<boolean>(false);\n  const disableSubmit = ref<boolean>(false);\n  const registerForm = ref();\n  const emit = defineEmits(['register', 'success']);\n\n  const authDrawerOpen = ref(false);\n  const authDrawerOpenChange = (val: any) => {\n    if(!val)\n      registerForm.value.cleanData()\n  };\n\n  /**\n   * 新增\n   */\n  function add() {\n    title.value = '新增';\n    visible.value = true;\n    nextTick(() => {\n      registerForm.value.add();\n    });\n  }\n\n  /**\n   * 授权\n   * @param record\n   */\n  function edit(record) {\n    title.value = disableSubmit.value ? '详情' : '授权';\n    visible.value = true;\n    authDrawerOpen.value = true;\n    nextTick(() => {\n      registerForm.value.edit(record);\n    });\n  }\n\n  /**\n   * 确定按钮点击事件\n   */\n  function handleOk() {\n    registerForm.value.submitForm();\n  }\n\n  /**\n   * form保存回调事件\n   */\n  function submitCallback() {\n    handleCancel();\n    emit('success');\n  }\n\n  /**\n   * 取消按钮回调事件\n   */\n  function handleCancel() {\n    visible.value = false;\n    authDrawerOpen.value = false;\n  }\n\n  defineExpose({\n    add,\n    edit,\n    disableSubmit,\n  });\n</script>\n\n<style lang=\"less\">\n  /**隐藏样式-modal确定按钮 */\n  .jee-hidden {\n    display: none !important;\n  }\n</style>\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/openapi/components/OpenApiAuthForm.vue",
    "content": "<template>\n  <a-spin :spinning=\"confirmLoading\">\n    <JFormContainer :disabled=\"disabled\">\n      <template #detail>\n        <a-form ref=\"formRef\" class=\"antd-modal-form\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" name=\"OpenApiAuthForm\">\n          <a-row>\n\t\t\t\t\t\t<a-col :span=\"24\">\n\t\t\t\t\t\t\t<a-form-item label=\"授权名称\" v-bind=\"validateInfos.name\" id=\"OpenApiAuthForm-name\" name=\"name\">\n\t\t\t\t\t\t\t\t<a-input v-model:value=\"formData.name\" placeholder=\"请输入授权名称\"  allow-clear ></a-input>\n\t\t\t\t\t\t\t</a-form-item>\n\t\t\t\t\t\t</a-col>\n\t\t\t\t\t\t<a-col :span=\"24\">\n\t\t\t\t\t\t\t<a-form-item label=\"AK\" v-bind=\"validateInfos.ak\" id=\"OpenApiAuthForm-ak\" name=\"ak\">\n\t\t\t\t\t\t\t\t<a-input v-model:value=\"formData.ak\" placeholder=\"请输入AK\" disabled allow-clear ></a-input>\n\t\t\t\t\t\t\t</a-form-item>\n\t\t\t\t\t\t</a-col>\n\t\t\t\t\t\t<a-col :span=\"24\">\n\t\t\t\t\t\t\t<a-form-item label=\"SK\" v-bind=\"validateInfos.sk\" id=\"OpenApiAuthForm-sk\" name=\"sk\">\n\t\t\t\t\t\t\t\t<a-input v-model:value=\"formData.sk\" placeholder=\"请输入SK\" disabled allow-clear ></a-input>\n\t\t\t\t\t\t\t</a-form-item>\n\t\t\t\t\t\t</a-col>\n<!--\t\t\t\t\t\t<a-col :span=\"24\">-->\n<!--\t\t\t\t\t\t\t<a-form-item label=\"关联系统用户名\" v-bind=\"validateInfos.systemUserId\" id=\"OpenApiAuthForm-systemUserId\" name=\"systemUserId\">-->\n<!--\t\t\t\t\t\t\t\t<JSearchSelect dict=\"sys_user,username,id\" v-model:value=\"formData.systemUserId\" placeholder=\"请输入关联系统用户名\"  allow-clear ></JSearchSelect>-->\n<!--\t\t\t\t\t\t\t</a-form-item>-->\n<!--\t\t\t\t\t\t</a-col>-->\n          </a-row>\n        </a-form>\n      </template>\n    </JFormContainer>\n  </a-spin>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, reactive, defineExpose, nextTick, defineProps, computed,  } from 'vue';\n  import { USER_INFO_KEY} from '/@/enums/cacheEnum';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { getValueType } from '/@/utils';\n  import { saveOrUpdate,getGenAKSK } from '../OpenApiAuth.api';\n  import { Form } from 'ant-design-vue';\n  import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';\n  import JSearchSelect from '/@/components/Form/src/jeecg/components/JSearchSelect.vue';\n  import { getAuthCache } from \"@/utils/auth\";\n  const props = defineProps({\n    formDisabled: { type: Boolean, default: false },\n    formData: { type: Object, default: () => ({})},\n    formBpm: { type: Boolean, default: true },\n    title: { type: String, default: \"\" },\n  });\n  const formRef = ref();\n  const useForm = Form.useForm;\n  const emit = defineEmits(['register', 'ok']);\n  const formData = reactive<Record<string, any>>({\n    id: '',\n    name: '',   \n    ak: '',   \n    sk: '',   \n    systemUserId: '',   \n  });\n  const { createMessage } = useMessage();\n  const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });\n  const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });\n  const confirmLoading = ref<boolean>(false);\n  //表单验证\n  const validatorRules = reactive({\n    name:[{ required: true, message: '请输入授权名称!'},],\n    systemUserId:[{ required: true, message: '请输入关联系统用户名!'},],\n  });\n  const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });\n\n  // 表单禁用\n  const disabled = computed(()=>{\n    if(props.formBpm === true){\n      if(props.formData.disabled === false){\n        return false;\n      }else{\n        return true;\n      }\n    }\n    return props.formDisabled;\n  });\n\n  \n  /**\n   * 新增\n   */\n  async function add() {\n    edit({});\n    const AKSKObj = await getGenAKSK({});\n    formData.ak = AKSKObj[0];\n    formData.sk = AKSKObj[1];\n  }\n\n  /**\n   * 编辑\n   */\n  function edit(record) {\n    const userData = getAuthCache(USER_INFO_KEY)\n    if(props.title == \"新增\"){\n      record.systemUserId = userData.id\n    }\n    nextTick(() => {\n      resetFields();\n      const tmpData = {};\n      Object.keys(formData).forEach((key) => {\n        if(record.hasOwnProperty(key)){\n          tmpData[key] = record[key]\n        }\n      })\n      //赋值\n      Object.assign(formData, tmpData);\n    });\n  }\n\n  /**\n   * 提交数据\n   */\n  async function submitForm() {\n    try {\n      // 触发表单验证\n      await validate();\n    } catch ({ errorFields }) {\n      if (errorFields) {\n        const firstField = errorFields[0];\n        if (firstField) {\n          formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });\n        }\n      }\n      return Promise.reject(errorFields);\n    }\n    confirmLoading.value = true;\n    const isUpdate = ref<boolean>(false);\n    //时间格式化\n    let model = formData;\n    if (model.id) {\n      isUpdate.value = true;\n    }\n    //循环数据\n    for (let data in model) {\n      //如果该数据是数组并且是字符串类型\n      if (model[data] instanceof Array) {\n        let valueType = getValueType(formRef.value.getProps, data);\n        //如果是字符串类型的需要变成以逗号分割的字符串\n        if (valueType === 'string') {\n          model[data] = model[data].join(',');\n        }\n      }\n    }\n    await saveOrUpdate(model, isUpdate.value)\n      .then((res) => {\n        if (res.success) {\n          createMessage.success(res.message);\n          emit('ok');\n        } else {\n          createMessage.warning(res.message);\n        }\n      })\n      .finally(() => {\n        confirmLoading.value = false;\n      });\n  }\n\n\n  defineExpose({\n    add,\n    edit,\n    submitForm,\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .antd-modal-form {\n    padding: 14px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/openapi/components/OpenApiAuthModal.vue",
    "content": "<template>\n  <j-modal :title=\"title\" :width=\"width\" :maxHeight=\"200\" :visible=\"visible\" @ok=\"handleOk\" :okButtonProps=\"{ class: { 'jee-hidden': disableSubmit } }\" @cancel=\"handleCancel\" cancelText=\"关闭\">\n    <OpenApiAuthForm ref=\"registerForm\" @ok=\"submitCallback\" :title=\"title\" :formDisabled=\"disableSubmit\" :formBpm=\"false\"></OpenApiAuthForm>\n  </j-modal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, nextTick, defineExpose } from 'vue';\n  import OpenApiAuthForm from './OpenApiAuthForm.vue'\n  import JModal from '/@/components/Modal/src/JModal/JModal.vue';\n  \n  const title = ref<string>('');\n  const width = ref<number>(800);\n  const visible = ref<boolean>(false);\n  const disableSubmit = ref<boolean>(false);\n  const registerForm = ref();\n  const emit = defineEmits(['register', 'success']);\n\n  /**\n   * 新增\n   */\n  function add() {\n    title.value = '新增';\n    visible.value = true;\n    nextTick(() => {\n      registerForm.value.add();\n    });\n  }\n  \n  /**\n   * 编辑\n   * @param record\n   */\n  function edit(record) {\n    title.value = disableSubmit.value ? '详情' : '编辑';\n    visible.value = true;\n    nextTick(() => {\n      registerForm.value.edit(record);\n    });\n  }\n  \n  /**\n   * 确定按钮点击事件\n   */\n  function handleOk() {\n    registerForm.value.submitForm();\n  }\n\n  /**\n   * form保存回调事件\n   */\n  function submitCallback() {\n    handleCancel();\n    emit('success');\n  }\n\n  /**\n   * 取消按钮回调事件\n   */\n  function handleCancel() {\n    visible.value = false;\n  }\n\n  defineExpose({\n    add,\n    edit,\n    disableSubmit,\n  });\n</script>\n\n<style lang=\"less\">\n  /**隐藏样式-modal确定按钮 */\n  .jee-hidden {\n    display: none !important;\n  }\n</style>\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/openapi/components/OpenApiModal.vue",
    "content": "<template>\n  <BasicModal :bodyStyle=\"{ padding: '20px' }\" v-bind=\"$attrs\" @register=\"registerModal\" destroyOnClose :title=\"title\" width=\"80%\" @ok=\"handleSubmit\">\n    <a-row :gutter=\"24\">\n      <a-col :span=\"10\">\n        <BasicForm @register=\"registerForm\" ref=\"formRef\" name=\"OpenApiForm\" />\n      </a-col>\n      <a-col :span=\"14\">\n        <a-row :gutter=\"24\">\n          <a-col :span=\"24\" style=\"margin-top: -0.6em\">\n            <JVxeTable\n              keep-source\n              ref=\"openApiHeader\"\n              :loading=\"openApiHeaderTable.loading\"\n              :columns=\"openApiHeaderTable.columns\"\n              :dataSource=\"openApiHeaderTable.dataSource\"\n              :height=\"240\"\n              :disabled=\"formDisabled\"\n              :rowNumber=\"true\"\n              :rowSelection=\"true\"\n              :toolbar=\"true\"\n              size=\"mini\"\n            />\n          </a-col>\n          <a-col :span=\"24\">\n            <JVxeTable\n              keep-source\n              ref=\"openApiParam\"\n              :loading=\"openApiParamTable.loading\"\n              :columns=\"openApiParamTable.columns\"\n              :dataSource=\"openApiParamTable.dataSource\"\n              :height=\"240\"\n              :disabled=\"formDisabled\"\n              :rowNumber=\"true\"\n              :rowSelection=\"true\"\n              :toolbar=\"true\"\n              size=\"mini\"\n            />\n          </a-col>\n        </a-row>\n      </a-col>\n    </a-row>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, computed, unref, reactive } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { JVxeTable } from '/@/components/jeecg/JVxeTable';\n  import { useJvxeMethod } from '/@/hooks/system/useJvxeMethods.ts';\n  import { formSchema, openApiHeaderJVxeColumns, openApiParamJVxeColumns } from '../OpenApi.data';\n  import { saveOrUpdate, queryOpenApiHeader, queryOpenApiParam, getGenPath } from '../OpenApi.api';\n  import { VALIDATE_FAILED } from '/@/utils/common/vxeUtils';\n  import { useMessage } from \"@/hooks/web/useMessage\";\n\n  // Emits声明\n  const $message = useMessage();\n  const emit = defineEmits(['register', 'success']);\n  const isUpdate = ref(true);\n  const formDisabled = ref(false);\n  const refKeys = ref(['openApiHeader', 'openApiParam']);\n  const activeKey = ref('openApiHeader');\n  const openApiHeader = ref();\n  const openApiParam = ref();\n  const tableRefs = { openApiHeader, openApiParam };\n  const openApiHeaderTable = reactive({\n    loading: false,\n    dataSource: [],\n    columns: openApiHeaderJVxeColumns,\n  });\n  const openApiParamTable = reactive({\n    loading: false,\n    dataSource: [],\n    columns: openApiParamJVxeColumns,\n  });\n  //表单配置\n  const [registerForm, { setProps, resetFields, setFieldsValue, validate }] = useForm({\n    labelWidth: 100,\n    schemas: formSchema,\n    showActionButtonGroup: false,\n    baseColProps: { span: 24 },\n    wrapperCol: { span: 24 },\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await reset();\n    setModalProps({ confirmLoading: false, showCancelBtn: data?.showFooter, showOkBtn: data?.showFooter });\n    isUpdate.value = !!data?.isUpdate;\n    formDisabled.value = !data?.showFooter;\n    if (unref(isUpdate)) {\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n      // 请求后端接口获取数据\n      //  requestSubTableData(queryOpenApiHeader, {id:data?.record?.id}, openApiHeaderTable)\n      //  requestSubTableData(queryOpenApiParam, {id:data?.record?.id}, openApiParamTable)\n      openApiHeaderTable.dataSource = !!data.record.headersJson?JSON.parse(data.record.headersJson):[];\n      openApiParamTable.dataSource = !!data.record.paramsJson?JSON.parse(data.record.paramsJson):[];\n    } else {\n      //  /openapi/genpath\n      const requestUrlObj = await getGenPath({});\n      await setFieldsValue({\n        requestUrl: requestUrlObj.result\n\n      });\n    }\n    // 隐藏底部时禁用整个表单\n    setProps({ disabled: !data?.showFooter });\n  });\n  //方法配置\n  const [handleChangeTabs, handleSubmit, requestSubTableData, formRef] = useJvxeMethod(\n    requestAddOrEdit,\n    classifyIntoFormData,\n    tableRefs,\n    activeKey,\n    refKeys\n  );\n\n  //设置标题\n  const title = computed(() => (!unref(isUpdate) ? '新增' : !unref(formDisabled) ? '编辑' : '详情'));\n\n  async function reset() {\n    await resetFields();\n    activeKey.value = 'openApiHeader';\n    openApiHeaderTable.dataSource = [];\n    openApiParamTable.dataSource = [];\n  }\n  function classifyIntoFormData(allValues) {\n    let main = Object.assign({}, allValues.formValue);\n    return {\n      ...main, // 展开\n      headersJson: allValues.tablesValue[0].tableData,\n      paramsJson: allValues.tablesValue[1].tableData,\n    };\n  }\n  //表单提交事件\n  async function requestAddOrEdit(values) {\n    let headersJson = !!values.headersJson?JSON.stringify(values.headersJson):null;\n    let paramsJson = !!values.headersJson?JSON.stringify(values.paramsJson):null;\n    try {\n      if (!!values.body){\n        try {\n          if (typeof JSON.parse(values.body)!='object'){\n            $message.createMessage.error(\"JSON格式化错误,请检查输入数据\");\n            return;\n          }\n        } catch (e) {\n          $message.createMessage.error(\"JSON格式化错误,请检查输入数据\");\n          return;\n        }\n      }\n      setModalProps({ confirmLoading: true });\n      values.headersJson = headersJson\n      values.paramsJson = paramsJson\n      //提交表单\n      await saveOrUpdate(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n\n<style lang=\"less\" scoped>\n  /** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-calendar-picker) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/openapi/subTables/OpenApiHeaderSubTable.vue",
    "content": "<template>\n  <div>\n      <!--引用表格-->\n     <BasicTable bordered size=\"middle\" :loading=\"loading\" rowKey=\"id\" :canResize=\"false\" :columns=\"openApiHeaderColumns\" :dataSource=\"dataSource\" :pagination=\"false\">\n        <!--字段回显插槽-->\n        <template v-slot:bodyCell=\"{ column, record, index, text }\">\n        </template>\n      </BasicTable>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import {ref,watchEffect} from 'vue';\n  import {BasicTable} from '/@/components/Table';\n  import {openApiHeaderColumns} from '../OpenApi.data';\n  import {openApiHeaderList} from '../OpenApi.api';\n  import { downloadFile } from '/@/utils/common/renderUtils';\n\n  const props = defineProps({\n    id: {\n       type: String,\n       default: '',\n     },\n  })\n\n  const loading = ref(false);\n  const dataSource = ref([]);\n\n  watchEffect(() => {\n      props.id && loadData(props.id);\n   });\n\n   function loadData(id) {\n         dataSource.value = []\n         loading.value = true\n          openApiHeaderList({id}).then((res) => {\n           if (res.success) {\n              dataSource.value = res.result.records\n           }\n         }).finally(() => {\n           loading.value = false\n         })\n    }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/openapi/subTables/OpenApiParamSubTable.vue",
    "content": "<template>\n  <div>\n      <!--引用表格-->\n     <BasicTable bordered size=\"middle\" :loading=\"loading\" rowKey=\"id\" :canResize=\"false\" :columns=\"openApiParamColumns\" :dataSource=\"dataSource\" :pagination=\"false\">\n        <!--字段回显插槽-->\n        <template v-slot:bodyCell=\"{ column, record, index, text }\">\n        </template>\n      </BasicTable>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import {ref,watchEffect} from 'vue';\n  import {BasicTable} from '/@/components/Table';\n  import {openApiParamColumns} from '../OpenApi.data';\n  import {openApiParamList} from '../OpenApi.api';\n  import { downloadFile } from '/@/utils/common/renderUtils';\n\n  const props = defineProps({\n    id: {\n       type: String,\n       default: '',\n     },\n  })\n\n  const loading = ref(false);\n  const dataSource = ref([]);\n\n  watchEffect(() => {\n      props.id && loadData(props.id);\n   });\n\n   function loadData(id) {\n         dataSource.value = []\n         loading.value = true\n          openApiParamList({id}).then((res) => {\n           if (res.success) {\n              dataSource.value = res.result.records\n           }\n         }).finally(() => {\n           loading.value = false\n         })\n    }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/report/chartdemo/chartdemo.data.ts",
    "content": "const colors = ['#4db6ac', '#ffb74d', '#64b5f6', '#e57373', '#9575cd', '#a1887f', '#90a4ae', '#4dd0e1', '#81c784', '#ff8a65'];\nexport const getData = (() => {\n  let dottedBase = +new Date();\n  const barDataSource: any[] = [];\n  const barMultiData: any[] = [];\n  const barLineData: any[] = [];\n  const barLineColors: any[] = [];\n\n  for (let i = 0; i < 20; i++) {\n    let obj = { name: '', value: 0 };\n    const date = new Date((dottedBase += 1000 * 3600 * 24));\n    obj.name = [date.getFullYear(), date.getMonth() + 1, date.getDate()].join('-');\n    obj.value = Math.random() * 200;\n    barDataSource.push(obj);\n  }\n\n  for (let j = 0; j < 2; j++) {\n    for (let i = 0; i < 20; i++) {\n      let obj = { name: '', value: 0, type: 2010 + j + '' };\n      const date = new Date(dottedBase + 1000 * 3600 * 24 * i);\n      obj.name = [date.getFullYear(), date.getMonth() + 1, date.getDate()].join('-');\n      obj.value = Math.random() * 200;\n      barMultiData.push(obj);\n    }\n  }\n  const pieData = [\n    { value: 335, name: '客服电话' },\n    { value: 310, name: '奥迪官网' },\n    { value: 234, name: '媒体曝光' },\n    { value: 135, name: '质检总局' },\n    { value: 105, name: '其他' },\n  ];\n  const radarData = [\n    { value: 75, name: '政治', type: '文综', max: 100 },\n    { value: 65, name: '历史', type: '文综', max: 100 },\n    { value: 55, name: '地理', type: '文综', max: 100 },\n    { value: 74, name: '化学', type: '文综', max: 100 },\n    { value: 38, name: '物理', type: '文综', max: 100 },\n    { value: 88, name: '生物', type: '文综', max: 100 },\n  ];\n  for (let j = 0; j < 2; j++) {\n    for (let i = 0; i < 15; i++) {\n      let obj = { name: '', value: 0, type: 2010 + j + '', seriesType: j >= 1 ? 'line' : 'bar' };\n      const date = new Date(dottedBase + 1000 * 3600 * 24 * i);\n      obj.name = [date.getFullYear(), date.getMonth() + 1, date.getDate()].join('-');\n      obj.value = Math.random() * 200;\n      barLineData.push(obj);\n    }\n    barLineColors.push(colors[j]);\n  }\n  return { barDataSource, barMultiData, pieData, barLineData, barLineColors,radarData };\n})();\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/report/chartdemo/index.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <a-card :bordered=\"false\" style=\"height: 100%\">\n      <a-tabs v-model:activeKey=\"activeKey\" animated @change=\"tabChange\">\n        <a-tab-pane key=\"1\" tab=\"柱状图\">\n          <a-row>\n            <a-col :span=\"24\">\n              <Bar :chartData=\"barDataSource\" height=\"50vh\" :option=\"{ title: { text: '销售额排行', left: 'center' } }\"></Bar>\n            </a-col>\n            <!-- <a-col :span=\"7\" style=\"margin-left:50px\" >\n                            配置项：\n                            <textarea rows=\"18\" style=\"width: 500px\">{{ barDataSource }}</textarea>\n                        </a-col>-->\n          </a-row>\n        </a-tab-pane>\n        <a-tab-pane key=\"2\" tab=\"多列柱状图\" force-render>\n          <BarMulti :chartData=\"barMultiData\" :option=\"multiBarOption\" height=\"50vh\"></BarMulti>\n        </a-tab-pane>\n        <a-tab-pane key=\"3\" tab=\"迷你柱状图\" style=\"display: flex; justify-content: center\">\n          <Bar :chartData=\"barDataSource\" width=\"30%\" height=\"50vh\"></Bar>\n        </a-tab-pane>\n        <a-tab-pane key=\"4\" tab=\"面积图\">\n          <SingleLine :chartData=\"barDataSource\" height=\"50vh\" :option=\"{ title: { text: '销售额排行', left: 'center' } }\"></SingleLine>\n        </a-tab-pane>\n        <a-tab-pane key=\"5\" tab=\"迷你面积图\" style=\"display: flex; justify-content: center\">\n          <SingleLine :chartData=\"barDataSource\" width=\"30%\" height=\"50vh\"></SingleLine>\n        </a-tab-pane>\n        <a-tab-pane key=\"6\" tab=\"多行折线图\">\n          <LineMulti :chartData=\"barMultiData\" height=\"50vh\" :option=\"multiBarOption\" type=\"line\"></LineMulti>\n        </a-tab-pane>\n        <a-tab-pane key=\"7\" tab=\"饼图\">\n          <pie :chartData=\"pieData\" height=\"40vh\" :option=\"{ title: { text: '基础饼状图', left: 'center' } }\" />\n        </a-tab-pane>\n        <a-tab-pane key=\"8\" tab=\"雷达图\">\n          <Radar :chartData=\"radarData\" height=\"50vh\"></Radar>\n        </a-tab-pane>\n        <a-tab-pane key=\"9\" tab=\"仪表盘\">\n          <Gauge :chartData=\"{ name: '出勤率', value: 70 }\" height=\"50vh\"></Gauge>\n        </a-tab-pane>\n        <a-tab-pane key=\"10\" tab=\"折柱图\">\n          <BarAndLine :chartData=\"barLineData\" :customColor=\"barLineColors\" height=\"50vh\"></BarAndLine>\n        </a-tab-pane>\n        <a-tab-pane key=\"11\" tab=\"排名列表\">\n          <RankList title=\"门店销售排行榜\" :list=\"rankList\" style=\"width: 600px; margin: 0 auto\"></RankList>\n        </a-tab-pane>\n        <a-tab-pane key=\"13\" tab=\"趋势\">\n          <trend title=\"Trend\" term=\"Trend：\" :percentage=\"30\" />\n        </a-tab-pane>\n        <!--暂无-->\n        <!-- <a-tab-pane key=\"14\" tab=\"进度条\">\n                    <Bar :option=\"{xAxis:{show:false},yAxis:{show:false}}\" :chartData=\"chartData\" width=\"100px\" height=\"50px\"></Bar>\n                </a-tab-pane>-->\n        <!--<a-tab-pane key=\"15\" tab=\"水波图\"></a-tab-pane>-->\n      </a-tabs>\n    </a-card>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import { getData } from './chartdemo.data.ts';\n  import Bar from '/@/components/chart/Bar.vue';\n  import BarMulti from '/@/components/chart/BarMulti.vue';\n  import SingleLine from '/@/components/chart/SingleLine.vue';\n  import LineMulti from '/@/components/chart/LineMulti.vue';\n  import Pie from '/@/components/chart/Pie.vue';\n  import Radar from '/@/components/chart/Radar.vue';\n  import Gauge from '/@/components/chart/Gauge.vue';\n  import RankList from '/@/components/chart/RankList.vue';\n  import Trend from '/@/components/chart/Trend.vue';\n  import BarAndLine from '/@/components/chart/BarAndLine.vue';\n\n  const activeKey = ref('1');\n  const { barDataSource, barMultiData, pieData, barLineData, radarData,barLineColors } = getData;\n  const multiBarOption = {\n    title: { text: '多列柱状图', left: 'center' },\n  };\n  const rankList = loadData('name', 'total', 2000, 100, '北京朝阳 ', ' 号店');\n  //tab切换\n  function tabChange(key) {\n    console.log('切换的key:', key);\n  }\n  function loadData(x, y, max, min, before = '', after = '月') {\n    let data = [];\n    for (let i = 0; i < 12; i += 1) {\n      data.push({\n        [x]: `${before}${i + 1}${after}`,\n        [y]: Math.floor(Math.random() * max) + min,\n      });\n    }\n    return data;\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/report/statisticst/index.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <a-card :bordered=\"false\" style=\"height: 100%\">\n      <a-tabs v-model:activeKey=\"activeKey\" animated @change=\"tabChange\">\n        <a-tab-pane key=\"bar\" tab=\"柱状图\">\n          <a-row>\n            <a-col :span=\"10\">\n              <a-radio-group v-model:value=\"barType\" @change=\"statisticst\">\n                <a-radio-button value=\"year\">按年统计</a-radio-button>\n                <a-radio-button value=\"month\">按月统计</a-radio-button>\n                <a-radio-button value=\"category\">按类别统计</a-radio-button>\n                <a-radio-button value=\"cabinet\">按柜号统计</a-radio-button>\n              </a-radio-group>\n            </a-col>\n          </a-row>\n          <Bar :chartData=\"dataSource\" height=\"50vh\"></Bar>\n        </a-tab-pane>\n        <a-tab-pane key=\"pie\" tab=\"饼状图\" force-render>\n          <a-row :gutter=\"24\">\n            <a-col :span=\"10\">\n              <a-radio-group v-model:value=\"pieType\" @change=\"statisticst\">\n                <a-radio-button value=\"year\">按年统计</a-radio-button>\n                <a-radio-button value=\"month\">按月统计</a-radio-button>\n                <a-radio-button value=\"category\">按类别统计</a-radio-button>\n                <a-radio-button value=\"cabinet\">按柜号统计</a-radio-button>\n              </a-radio-group>\n            </a-col>\n            <Pie :chartData=\"dataSource\" height=\"40vh\"></Pie>\n          </a-row>\n        </a-tab-pane>\n      </a-tabs>\n    </a-card>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { defHttp } from '/@/utils/http/axios';\n  import { ref, unref, reactive } from 'vue';\n  import Bar from '/@/components/chart/Bar.vue';\n  import Pie from '/@/components/chart/Pie.vue';\n\n  const activeKey = ref('bar');\n  const barType = ref('year');\n  const pieType = ref('year');\n  const dataSource = ref([]);\n  const url = reactive({\n    getYearCountInfo: '/mock/api/report/getYearCountInfo',\n    getMonthCountInfo: '/mock/api/report/getMonthCountInfo',\n    getCntrNoCountInfo: '/mock/api/report/getCntrNoCountInfo',\n    getCabinetCountInfo: '/mock/api/report/getCabinetCountInfo',\n  });\n\n  async function loadDate(url, type, params) {\n    const res = await defHttp.get({ url, params }, { isTransformResponse: false, errorMessageMode: 'none' });\n    if (res.success) {\n      dataSource.value = [];\n      switch (type) {\n        case 'year':\n          getYearCountSource(res.result);\n          break;\n        case 'month':\n          getMonthCountSource(res.result);\n          break;\n        case 'category':\n          getCategoryCountSource(res.result);\n          break;\n        case 'cabinet':\n          getCabinetCountSource(res.result);\n          break;\n        default:\n          break;\n      }\n    }\n  }\n  function getYearCountSource(data) {\n    for (let i = 0; i < data.length; i++) {\n      dataSource.value.push({\n        name: `${data[i].year}年`,\n        value: data[i].yearcount,\n      });\n    }\n  }\n  function getMonthCountSource(data) {\n    for (let i = 0; i < data.length; i++) {\n      dataSource.value.push({\n        name: `${data[i].month}`,\n        value: data[i].monthcount,\n      });\n    }\n  }\n  function getCategoryCountSource(data) {\n    for (let i = 0; i < data.length; i++) {\n      dataSource.value.push({\n        name: `${data[i].classifyname}`,\n        value: data[i].cntrnocount,\n      });\n    }\n  }\n  function getCabinetCountSource(data) {\n    for (let i = 0; i < data.length; i++) {\n      dataSource.value.push({\n        name: `${data[i].cabinetname}`,\n        value: data[i].cabinetcocunt,\n      });\n    }\n  }\n  // 选择统计类别\n  function statisticst(e) {\n    if (unref(activeKey) === 'pie') {\n      loadDate(getUrl(unref(pieType)), unref(pieType), {});\n    } else {\n      loadDate(getUrl(unref(barType)), unref(barType), {});\n    }\n  }\n\n  function getUrl(type) {\n    if (type === 'year') {\n      return url.getYearCountInfo;\n    }\n    if (type === 'month') {\n      return url.getMonthCountInfo;\n    }\n    if (type === 'category') {\n      return url.getCntrNoCountInfo;\n    }\n    if (type === 'cabinet') {\n      return url.getCabinetCountInfo;\n    }\n  }\n  //tab切换\n  function tabChange(key) {\n    console.log('切换的key:', key);\n  }\n  loadDate(url.getYearCountInfo, 'year', {});\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/AiApp.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { Modal } from 'ant-design-vue';\n\nexport enum Api {\n  //知识库管理\n  list = '/airag/app/list',\n  save = '/airag/app/edit',\n  release = '/airag/app/release',\n  delete = '/airag/app/delete',\n  queryById = '/airag/app/queryById',\n  queryBathById = '/airag/knowledge/query/batch/byId',\n  queryKnowledgeById = '/airag/knowledge/queryById',\n  queryFlowById = '/airag/flow/queryById',\n  queryFlowByIds = '/airag/flow/list',\n  promptGenerate = '/airag/app/prompt/generate',\n  generateMemoryByAppId = '/airag/app/prompt/generateMemoryByAppId',\n}\n\n/**\n * 查询应用\n * @param params\n */\nexport const appList = (params) => {\n  return defHttp.get({ url: Api.list, params }, { isTransformResponse: false });\n};\n\n/**\n * 查询知识库\n * @param params\n */\nexport const queryKnowledgeBathById = (params) => {\n  return defHttp.get({ url: Api.queryBathById, params }, { isTransformResponse: false });\n};\n\n/**\n * 查询知识库(单条)\n * @param params\n */\nexport const queryKnowledgeById = (params) => {\n  return defHttp.get({ url: Api.queryKnowledgeById, params }, { isTransformResponse: false });\n};\n\n/**\n * 根据应用id查询应用\n * @param params\n */\nexport const queryById = (params) => {\n  return defHttp.get({ url: Api.queryById, params }, { isTransformResponse: false });\n};\n\n/**\n * 新增应用\n * @param params\n */\nexport const saveApp = (params) => {\n  return defHttp.put({ url: Api.save, params });\n};\n\n// 发布应用\nexport function releaseApp(appId: string, release = false) {\n  return defHttp.post({\n    url: Api.release,\n    params: {\n      id: appId,\n      release: release,\n    }\n  }, {joinParamsToUrl: true});\n}\n\n/**\n * 删除应用\n * @param params\n * @param handleSuccess\n */\nexport const deleteApp = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除名称为'+params.name+'的应用吗？',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.delete, params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n\n\n/**\n * 根据应用id查询流程\n * @param params\n */\nexport const queryFlowById = (params) => {\n  return defHttp.get({ url: Api.queryFlowById, params }, { isTransformResponse: false });\n};\n\n/**\n * 根据应用id查询流程\n * @param params\n */\nexport const queryFlowByIds = (params) => {\n  return defHttp.get({ url: Api.queryFlowByIds, params }, { isTransformResponse: false });\n};\n\n/**\n * 应用编排\n * @param params\n */\nexport const promptGenerate = (params) => {\n  return defHttp.post(\n    {\n      url: Api.promptGenerate+'?prompt='+ params.prompt,\n      adapter: 'fetch',\n      responseType: 'stream',\n      timeout: 5 * 60 * 1000,\n    },\n    {\n      isTransformResponse: false,\n    }\n  );\n};\n\n/**\n * 应用编排\n * @param params\n */\nexport const generateMemoryByAppId = (params) => {\n  return defHttp.post(\n    {\n      url: Api.generateMemoryByAppId+'?variables='+ params.variables + '&memoryId='+ params.memoryId,\n      adapter: 'fetch',\n      responseType: 'stream',\n      timeout: 5 * 60 * 1000,\n    },\n    {\n      isTransformResponse: false,\n    }\n  );\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/AiApp.data.ts",
    "content": "import { FormSchema } from '@/components/Form';\n\n/**\n * 表单\n */\nexport const formSchema: FormSchema[] = [\n  {\n    label: 'id',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '应用名称',\n    field: 'name',\n    required: true,\n    componentProps: {\n      //是否展示字数\n      showCount: true,\n      maxlength: 64,\n    },\n    component: 'Input',\n  },\n  {\n    label: '应用描述',\n    field: 'descr',\n    component: 'InputTextArea',\n    componentProps: {\n      placeholder: '描述该应用的应用场景及用途',\n      rows: 4,\n      //是否展示字数\n      showCount: true,\n      maxlength: 256,\n    },\n  },\n  {\n    label: '应用图标',\n    field: 'icon',\n    component: 'JImageUpload',\n  },\n  {\n    label: '选择应用类型',\n    field: 'type',\n    component: 'Input',\n    show:({ values })=>{\n      return !values.id;\n    },\n    slot: 'typeSlot',\n  },\n];\n\n/**\n * 快捷指令表单\n */\nexport const quickCommandFormSchema: FormSchema[] = [\n  {\n    label: 'key',\n    field: 'key',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '按钮名称',\n    field: 'name',\n    required: true,\n    component: 'Input',\n    componentProps: {\n      showCount: true,\n      maxLength: 10,\n    },\n  },\n  {\n    label: '按钮图标',\n    field: 'icon',\n    component: 'IconPicker',\n  },\n  {\n    label: '指令内容',\n    field: 'descr',\n    required: true,\n    component: 'InputTextArea',\n    componentProps: {\n      autosize: { minRows: 4, maxRows: 4 },\n      showCount: true,\n      maxLength: 100,\n    }\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/AiAppList.vue",
    "content": "<!--知识库文档列表-->\n<template>\n  <div class=\"knowledge\">\n    <!--查询区域-->\n    <div class=\"jeecg-basic-table-form-container\">\n      <a-form\n        ref=\"formRef\"\n        @keyup.enter.native=\"searchQuery\"\n        :model=\"queryParam\"\n        :label-col=\"labelCol\"\n        :wrapper-col=\"wrapperCol\"\n        style=\"background-color: #f7f8fc\"\n      >\n        <a-row :gutter=\"24\">\n          <a-col :xl=\"7\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <a-form-item name=\"name\" label=\"应用名称\">\n              <JInput v-model:value=\"queryParam.name\" placeholder=\"请输入应用名称\" />\n            </a-form-item>\n          </a-col>\n          <a-col :xl=\"7\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <a-form-item name=\"type\" label=\"应用类型\">\n              <j-dict-select-tag v-model:value=\"queryParam.type\" dict-code=\"ai_app_type\" placeholder=\"请选择应用类型\" />\n            </a-form-item>\n          </a-col>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left; overflow: hidden\" class=\"table-page-search-submitButtons\">\n              <a-col :lg=\"6\">\n                <a-button type=\"primary\" preIcon=\"ant-design:search-outlined\" @click=\"searchQuery\">查询</a-button>\n                <a-button type=\"primary\" preIcon=\"ant-design:reload-outlined\" @click=\"searchReset\" style=\"margin-left: 8px\">重置</a-button>\n              </a-col>\n            </span>\n          </a-col>\n        </a-row>\n      </a-form>\n    </div>\n    <a-row :span=\"24\" class=\"knowledge-row\">\n      <a-col :xxl=\"4\" :xl=\"6\" :lg=\"6\" :md=\"6\" :sm=\"12\" :xs=\"24\">\n        <a-card class=\"add-knowledge-card\" @click=\"handleCreateApp\">\n          <div class=\"flex\">\n            <Icon icon=\"ant-design:plus-outlined\" class=\"add-knowledge-card-icon\" size=\"20\"></Icon>\n            <span class=\"add-knowledge-card-title\">创建应用</span>\n          </div>\n        </a-card>\n      </a-col>\n      <a-col :xxl=\"4\" :xl=\"6\" :lg=\"6\" :md=\"6\" :sm=\"12\" :xs=\"24\" v-for=\"item in knowledgeAppDataList\">\n        <a-card class=\"knowledge-card pointer\" @click=\"handleEditClick(item)\">\n          <div class=\"flex\">\n            <img class=\"header-img\" :src=\"getImage(item.icon)\" />\n            <div class=\"header-text\">\n              <span class=\"header-text-top header-name ellipsis\"> {{ item.name }} </span>\n              <span class=\"header-text-top header-create ellipsis\">\n                <a-tag v-if=\"item.status === 'release'\" color=\"green\">已发布</a-tag>\n                <a-tag v-if=\"item.status === 'disable'\">已禁用</a-tag>\n                <span>创建者：{{ item.createBy_dictText || item.createBy }}</span>\n              </span>\n            </div>\n          </div>\n          <div class=\"header-tag\">\n            <a-tag color=\"#EBF1FF\" style=\"margin-right: 0\" v-if=\"item.type === 'chatSimple'\">\n              <span style=\"color: #3370ff\">智能体</span>\n            </a-tag>\n            <a-tag color=\"#FDF6EC\" style=\"margin-right: 0\" v-if=\"item.type === 'chatFLow'\">\n              <span style=\"color: #e6a343\">高级编排</span>\n            </a-tag>\n          </div>\n          <div class=\"card-description\">\n            <span>{{ item.descr || '暂无描述' }}</span>\n          </div>\n          <div class=\"card-footer\">\n            <a-tooltip title=\"演示\">\n              <div class=\"card-footer-icon\" @click.prevent.stop=\"handleViewClick(item.id)\">\n                <Icon class=\"operation\" icon=\"ant-design:youtube-outlined\" size=\"18\" \n                      color=\"#1F2329\"></Icon>\n              </div>\n            </a-tooltip>\n            <template v-if=\"item.status !== 'release'\">\n              <a-divider type=\"vertical\" style=\"float: left\" />\n              <a-tooltip title=\"删除\">\n                <div class=\"card-footer-icon\" @click.prevent.stop=\"handleDeleteClick(item)\">\n                  <Icon icon=\"ant-design:delete-outlined\" class=\"operation\" size=\"16\" \n                        color=\"#1F2329\"></Icon>\n                </div>\n              </a-tooltip>\n            </template>\n            <a-divider type=\"vertical\" style=\"float: left\" />\n            <a-tooltip title=\"发布\">\n              <a-dropdown class=\"card-footer-icon\" placement=\"bottomRight\" :trigger=\"['click']\">\n                <div @click.prevent.stop>\n                  <Icon style=\"position: relative;top: 1px\" icon=\"ant-design:send-outlined\" \n                        size=\"14\" color=\"#1F2329\"></Icon>\n                </div>\n                <template #overlay>\n                  <a-menu>\n                    <template v-if=\"item.status === 'enable'\">\n                      <a-menu-item key=\"release\" @click.prevent.stop=\"handleSendClick(item,'release')\">\n                        <Icon icon=\"lineicons:rocket-5\" size=\"14\"></Icon>\n                        发布\n                      </a-menu-item>\n                      <a-menu-divider/>\n                    </template>\n                    <template v-else-if=\"item.status === 'release'\">\n                      <a-menu-item key=\"un-release\" @click.prevent.stop=\"handleSendClick(item,'un-release')\">\n                        <Icon icon=\"tabler:rocket-off\" size=\"14\"></Icon>\n                        取消发布\n                      </a-menu-item>\n                      <a-menu-divider/>\n                    </template>\n                    <a-menu-item key=\"web\" @click.prevent.stop=\"handleSendClick(item,'web')\">\n                      <Icon icon=\"ant-design:dribbble-outlined\" size=\"16\"></Icon>\n                      嵌入网站\n                    </a-menu-item>\n                    <a-menu-item v-if=\"isShowMenu\" key=\"menu\" @click.prevent.stop=\"handleSendClick(item,'menu')\">\n                      <Icon icon=\"ant-design:menu-outlined\" size=\"16\"></Icon> 配置菜单\n                    </a-menu-item>\n                  </a-menu>\n                </template>\n              </a-dropdown>\n            </a-tooltip>\n          </div>\n        </a-card>\n      </a-col>\n    </a-row>\n    <Pagination\n      v-if=\"knowledgeAppDataList.length > 0\"\n      :current=\"pageNo\"\n      :page-size=\"pageSize\"\n      :page-size-options=\"pageSizeOptions\"\n      :total=\"total\"\n      :showQuickJumper=\"true\"\n      :showSizeChanger=\"true\"\n      @change=\"handlePageChange\"\n      class=\"list-footer\"\n      size=\"small\"\n      :show-total=\"() => `共${total}条` \"\n    />\n    <!-- Ai新增弹窗  -->\n    <AiAppModal @register=\"registerModal\" @success=\"handleSuccess\"></AiAppModal>\n    <!-- Ai设置弹窗 -->\n    <AiAppSettingModal @register=\"registerSettingModal\" @success=\"reload\"></AiAppSettingModal>\n    <!-- 发布弹窗 -->\n    <AiAppSendModal @register=\"registerAiAppSendModal\"/>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { ref, reactive, onMounted } from 'vue';\n  import BasicModal from '@/components/Modal/src/BasicModal.vue';\n  import { useModal, useModalInner } from '@/components/Modal';\n  import { LoadingOutlined } from '@ant-design/icons-vue';\n  import { Avatar, Modal, Pagination } from 'ant-design-vue';\n  import { getFileAccessHttpUrl } from '@/utils/common/compUtils';\n  import defaultImg from './img/ailogo.png';\n  import AiAppModal from './components/AiAppModal.vue';\n  import AiAppSettingModal from './components/AiAppSettingModal.vue';\n  import AiAppSendModal from './components/AiAppSendModal.vue';\n  import Icon from '@/components/Icon';\n  import { $electron } from \"@/electron\";\n  import { appList, deleteApp, releaseApp } from './AiApp.api';\n  import { useMessage } from '@/hooks/web/useMessage';\n  import JInput from '@/components/Form/src/jeecg/components/JInput.vue';\n  import JDictSelectTag from '@/components/Form/src/jeecg/components/JDictSelectTag.vue';\n  import { useRouter } from \"vue-router\";\n\n  export default {\n    name: 'AiAppList',\n    components: {\n      JDictSelectTag,\n      JInput,\n      AiAppSendModal,\n      Icon,\n      Pagination,\n      Avatar,\n      LoadingOutlined,\n      BasicModal,\n      AiAppModal,\n      AiAppSettingModal,\n    },\n    emits: ['success', 'register'],\n    setup(props, { emit }) {\n      /**\n       * 创建应用的集合\n       */\n      const knowledgeAppDataList = ref<any>([]);\n      //当前页数\n      const pageNo = ref<number>(1);\n      //每页条数\n      const pageSize = ref<number>(10);\n      //总条数\n      const total = ref<number>(0);\n      //可选择的页数\n      const pageSizeOptions = ref<any>(['10', '20', '30']);\n      //注册modal\n      const [registerModal, { openModal }] = useModal();\n      const [registerSettingModal, { openModal: openAppModal }] = useModal();\n      const [registerAiAppSendModal, { openModal: openAiAppSendModal }] = useModal();\n      const { createMessage, createConfirmSync } = useMessage();\n      //查询参数\n      const queryParam = reactive<any>({});\n      //查询区域label宽度\n      const labelCol = reactive({\n        xs: 24,\n        sm: 4,\n        xl: 6,\n        xxl: 6,\n      });\n      //查询区域组件宽度\n      const wrapperCol = reactive({\n        xs: 24,\n        sm: 20,\n      });\n      //表单的ref\n      const formRef = ref();\n\n      reload();\n\n      /**\n       * 加载数据\n       */\n      function reload() {\n        let params = {\n          pageNo: pageNo.value,\n          pageSize: pageSize.value,\n          column: 'createTime',\n          order: 'desc',\n        };\n        Object.assign(params, queryParam);\n        appList(params).then((res) => {\n          if (res.success) {\n            knowledgeAppDataList.value = res.result.records;\n            total.value = res.result.total;\n          } else {\n            knowledgeAppDataList.value = [];\n            total.value = 0;\n          }\n        });\n      }\n\n      /**\n       * 创建应用\n       */\n      function handleCreateApp() {\n        openModal(true, {});\n      }\n\n      /**\n       * 分页改变事件\n       * @param page\n       * @param current\n       */\n      function handlePageChange(page, current) {\n        pageNo.value = page;\n        pageSize.value = current;\n        reload();\n      }\n\n      /**\n       * 成功\n       */\n      function handleSuccess(id) {\n        reload();\n        //打开编辑弹窗\n        openAppModal(true, {\n          isUpdate: false,\n          id: id,\n        });\n      }\n\n      /**\n       * 获取图片\n       * @param url\n       */\n      function getImage(url) {\n        return url ? getFileAccessHttpUrl(url) : defaultImg;\n      }\n\n      /**\n       * 编辑\n       * @param item\n       */\n      function handleEditClick(item) {\n        console.log('item:::', item);\n        openAppModal(true, {\n          isUpdate: true,\n          ...item,\n        });\n      }\n\n      /**\n       * 演示\n       */\n      function handleViewClick(id: string) {\n        let url = '/ai/app/chat/' + id;\n\n        // update-begin--author:sunjianlei---date:20250411---for：【QQYUN-9685】构建 electron 桌面应用\n        if ($electron.isElectron()) {\n          url = $electron.resolveRoutePath(url);\n          window.open(url, '_blank', 'width=1200,height=800');\n          return\n        }\n        // update-end----author:sunjianlei---date:20250411---for：【QQYUN-9685】构建 electron 桌面应用\n\n        window.open(url, '_blank');\n      }\n\n      /**\n       * 删除\n       */\n      function handleDeleteClick(item) {\n        if(knowledgeAppDataList.value.length == 1 && pageNo.value > 1) {\n          pageNo.value = pageNo.value - 1;\n        }\n        deleteApp({ id: item.id, name: item.name }, reload);\n      }\n\n      /**\n       * 发布点击事件\n       * @param item 数据\n       * @param type 类别\n       */\n      function handleSendClick(item,type) {\n        if (type === 'release' || type === 'un-release') {\n          return onRelease(item);\n        }\n\n        openAiAppSendModal(true,{\n          type: type,\n          data: item\n        })\n      }\n\n      async function onRelease(item) {\n        const toRelease = item.status === 'enable';\n        let flag = await createConfirmSync({\n          title: toRelease ? '发布应用' : '取消发布应用',\n          content: toRelease ? '确定要发布应用吗？发布后将不允许修改应用。' : '确定要取消发布应用吗？',\n          okText: '确定',\n          cancelText: '取消',\n        });\n        if (!flag) {\n          return\n        }\n        doRelease(item, item.status === 'enable');\n      }\n\n      /**\n       * 发布\n       */\n      async function doRelease(item, release: boolean) {\n        let success: boolean = await releaseApp(item.id, release);\n        if (success) {\n          // 发布成功\n          if (release) {\n            item.status = 'release'\n          } else {\n            item.status = 'enable'\n          }\n        }\n      }\n\n      /**\n       * 重置\n       */\n      function searchReset() {\n        pageNo.value = 1;\n        formRef.value.resetFields();\n        queryParam.name = '';\n        //刷新数据\n        reload();\n      }\n\n      /**\n       * 查询\n       */\n      function searchQuery(){\n        pageNo.value = 1; \n        //刷新数据\n        reload();\n      }\n\n      const router = useRouter();\n      //是否显示菜单配置选项\n      const isShowMenu = ref<boolean>(false);\n      onMounted((()=>{\n        let fullPath = router.currentRoute.value.fullPath;\n        console.log(fullPath)\n        if(fullPath === '/myapps/ai/app'){\n          isShowMenu.value = false;\n        } else {\n          isShowMenu.value = true;\n        }\n      }))\n\n      return {\n        handleCreateApp,\n        knowledgeAppDataList,\n        pageNo,\n        pageSize,\n        total,\n        pageSizeOptions,\n        handlePageChange,\n        cardBodyStyle: { textAlign: 'left', width: '100%' },\n        registerModal,\n        handleSuccess,\n        getImage,\n        handleEditClick,\n        handleViewClick,\n        handleDeleteClick,\n        registerSettingModal,\n        reload,\n        queryParam,\n        labelCol,\n        wrapperCol,\n        handleSendClick,\n        registerAiAppSendModal,\n        searchReset,\n        formRef,\n        isShowMenu,\n        searchQuery,\n      };\n    },\n  };\n</script>\n\n<style scoped lang=\"less\">\n  .knowledge {\n    height: calc(100vh - 115px);\n    background: #f7f8fc;\n    padding: 24px;\n    overflow-y: auto;\n  }\n\n  .add-knowledge-card {\n    margin-bottom: 20px;\n    background: #fcfcfd;\n    border: 1px solid #f0f0f0;\n    box-shadow: 0 2px 4px #e6e6e6;\n    transition: all 0.3s ease;\n    border-radius: 10px;\n    display: inline-flex;\n    justify-content: center;\n    align-items: center;\n    font-size: 16px;\n    cursor: pointer;\n    height: 152px;\n    width: calc(100% - 20px);\n    .add-knowledge-card-icon {\n      padding: 8px;\n      color: #1f2329;\n      background-color: #f5f6f7;\n      margin-right: 12px;\n    }\n    .add-knowledge-card-title {\n      font-size: 16px;\n      color:#1f2329;\n      font-weight: 400;\n      align-self: center;\n    }\n  }\n\n  .knowledge-card {\n    border-radius: 10px;\n    margin-right: 20px;\n    margin-bottom: 20px;\n    height: 152px;\n    background: #fcfcfd;\n    border: 1px solid #f0f0f0;\n    box-shadow: 0 2px 4px #e6e6e6;\n    transition: all 0.3s ease;\n    .header-img {\n      width: 25px;\n      height: 25px;\n      border-radius: 0.5rem;\n    }\n    .header-text {\n      margin-left: 5px;\n      position: relative;\n      font-size: 14px;\n      display: grid;\n      width: calc(100% - 100px);\n      .header-name {\n        font-weight: bold;\n        color: #354052;\n      }\n      .header-create {\n        font-size: 12px;\n        color: #646a73;\n      }\n    }\n    .header-tag {\n      position: absolute;\n      right: 4px;\n      top: 6px;\n    }\n  }\n\n  .add-knowledge-card,\n  .knowledge-card {\n    transition: box-shadow 0.3s ease;\n  }\n\n  .add-knowledge-card:hover,\n  .knowledge-card:hover {\n    box-shadow: 0 6px 12px #d0d3d8;\n  }\n\n  .knowledge-row {\n    max-height: calc(100% - 100px);\n    margin-top: 20px;\n    overflow-y: auto;\n  }\n\n  .add-knowledge-doc {\n    margin-top: 6px;\n    color: #6f6f83;\n    font-size: 13px;\n    width: 100%;\n    cursor: pointer;\n    display: flex;\n    span {\n      margin-left: 4px;\n      line-height: 28px;\n    }\n  }\n  .add-knowledge-doc:hover {\n    background: #c8ceda33;\n  }\n  .card-description {\n    display: -webkit-box;\n    -webkit-box-orient: vertical;\n    -webkit-line-clamp: 3;\n    height: 4.5em;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    line-height: 1.5;\n    margin-top: 10px;\n    text-align: left;\n    font-size: 12px;\n    color: #676f83;\n  }\n  .card-footer {\n    position: absolute;\n    bottom: 8px;\n    left: 0;\n    min-height: 30px;\n    padding: 0 16px;\n    width: 100%;\n    align-items: center;\n    display: flex;\n  }\n\n  .card-footer-icon {\n    font-size: 14px;\n    height: 24px;\n    padding: 0 7px;\n    border-radius: 4px;\n    text-align: center;\n    align-content: center;\n    float: left;\n    width: 36px;\n  }\n\n  .card-footer-icon:hover {\n    color: #000000;\n    background-color: #e9ecf2;\n    border: none;\n  }\n\n  .operation {\n    position: relative;\n    top: 2px;\n  }\n  .list-footer {\n    text-align: right;\n    margin-top: 5px;\n  }\n  :deep(.ant-card .ant-card-body) {\n    padding: 16px;\n  }\n  .ellipsis{\n    overflow: hidden;\n    text-wrap: nowrap;\n    text-overflow: ellipsis;\n  }\n  .jeecg-basic-table-form-container {\n    padding: 0;\n    :deep(.ant-form) {\n      background-color: transparent;\n    }\n    .table-page-search-submitButtons {\n      display: block;\n      margin-bottom: 24px;\n      white-space: nowrap;\n    }\n  }\n</style>\n<style lang=\"less\">\n  .airag-knowledge-doc .scroll-container {\n    padding: 0 !important;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/AiChat.vue",
    "content": "<template>\n  <div ref=\"chatContainerRef\" class=\"chat-container\" :style=\"chatContainerStyle\">\n    <template v-if=\"dataSource\">\n      <div v-if=\"isMultiSession\" class=\"leftArea\" :class=\"[expand ? 'expand' : 'shrink']\">\n        <div class=\"content\">\n          <slide :source=\"source\" v-if=\"uuid\" :dataSource=\"dataSource\" @save=\"handleSave\" :prologue=\"prologue\" :appData=\"appData\" @click=\"handleChatClick\"></slide>\n        </div>\n        <div class=\"toggle-btn\" @click=\"handleToggle\">\n          <span class=\"icon\">\n            <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n              <path\n                d=\"M5.64645 3.14645C5.45118 3.34171 5.45118 3.65829 5.64645 3.85355L9.79289 8L5.64645 12.1464C5.45118 12.3417 5.45118 12.6583 5.64645 12.8536C5.84171 13.0488 6.15829 13.0488 6.35355 12.8536L10.8536 8.35355C11.0488 8.15829 11.0488 7.84171 10.8536 7.64645L6.35355 3.14645C6.15829 2.95118 5.84171 2.95118 5.64645 3.14645Z\"\n                fill=\"currentColor\"\n              ></path>\n            </svg>\n          </span>\n        </div>\n      </div>\n      <div class=\"rightArea\" :class=\"[expand ? 'expand' : 'shrink']\">\n        <chat\n          url=\"/airag/chat/send\"\n          v-if=\"uuid && chatVisible\"\n          :uuid=\"uuid\"\n          :historyData=\"chatData\"\n          type=\"view\"\n          @save=\"handleSave\"\n          :formState=\"appData\"\n          :prologue=\"prologue\"\n          :presetQuestion=\"presetQuestion\"\n          @reload-message-title=\"reloadMessageTitle\"\n          :chatTitle=\"chatTitle\"\n          :quickCommandData=\"quickCommandData\"\n          :showAdvertising = \"showAdvertising\"\n          :hasExtraFlowInputs=\"hasExtraFlowInputs\"\n          :conversationSettings=\"getCurrentSettings\"\n          @edit-settings=\"handleEditSettings\"\n          ref=\"chatRef\"\n        ></chat>\n      </div>\n      <!-- [issues/8545]新建AI应用的时候只能选择没有自定义参数的AI流程 -->\n      <ConversationSettingsModal\n        ref=\"settingsModalRef\"\n        :flowInputs=\"flowInputs\"\n        :conversationId=\"uuid\"\n        :existingSettings=\"getCurrentSettings\"\n        @ok=\"handleSettingsOk\"\n      />\n    </template>\n    <Loading :loading=\"loading\" tip=\"加载中，请稍后\"></Loading>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\n  import slide from './slide.vue';\n  import chat from './chat.vue';\n  import ConversationSettingsModal from './components/ConversationSettingsModal.vue';\n  import { Spin, message } from 'ant-design-vue';\n  import { ref, watch, nextTick, onUnmounted, onMounted, computed } from 'vue';\n  import { useUserStore } from '/@/store/modules/user';\n  import { JEECG_CHAT_KEY } from '/@/enums/cacheEnum';\n  import { defHttp } from '/@/utils/http/axios';\n  import { useRouter } from 'vue-router';\n  import { useAppInject } from \"@/hooks/web/useAppInject\";\n  import Loading from '@/components/Loading/src/Loading.vue';\n\n  const router = useRouter();\n  const userId = useUserStore().getUserInfo?.id;\n  const localKey = JEECG_CHAT_KEY + userId;\n  let timer: any = null;\n  let unwatch01: any = null;\n  const dataSource = ref<any>({});\n  const uuid = ref<string>('');\n  const chatData = ref<any>([]);\n  const expand = ref<any>(true);\n  const chatVisible = ref(true);\n  const chatContainerRef = ref<any>(null);\n  const chatContainerStyle = ref({});\n  //左侧聊天信息\n  const chatTitle = ref<string>('');\n  //左侧聊天点击的坐标\n  const chatActiveKey = ref<number>(0);\n  //预置开场白\n  const presetQuestion = ref<string>('');\n  //加载\n  const loading = ref<any>(true);\n\n  const handleToggle = () => {\n    expand.value = !expand.value;\n  };\n  //应用id\n  const appId = ref<string>('');\n  //应用数据\n  const appData = ref<any>({});\n  //开场白\n  const prologue = ref<string>('');\n  //快捷指令\n  const quickCommandData = ref<any>([]);\n  //是否显示广告位\n  const showAdvertising = ref<boolean>(false);\n  //对话设置弹窗ref\n  const settingsModalRef = ref();\n  //工作流入参列表\n  const flowInputs = ref<any[]>([]);\n  //当前会话的设置\n  const conversationSettings = ref<Record<string, Record<string, any>>>({});\n\n  const priming = () => {\n    dataSource.value = {\n      active: '1002',\n      usingContext: true,\n      history: [{ id: '1002', title: '新建聊天', isEdit: false, disabled: true }],\n    };\n    chatTitle.value = '新建聊天';\n    chatActiveKey.value = 0;\n  };\n\n  const handleSave = () => {\n    // 删除标签或清空内容之后的保存\n    //save(dataSource.value);\n    setTimeout(() => {\n      // 删除标签或清空内容也会触发watch保存，此时不需watch保存需清除\n      //clearTimeout(timer);\n    }, 50);\n  };\n\n  /**\n   * 检查是否有额外的工作流入参\n   * for [issues/8545]新建AI应用的时候只能选择没有自定义参数的AI流程\n    */\n  const hasExtraFlowInputs = computed(() => {\n    if (!appData.value || !appData.value.metadata) {\n      return false;\n    }\n    try {\n      const metadata = typeof appData.value.metadata === 'string' \n        ? JSON.parse(appData.value.metadata) \n        : appData.value.metadata;\n      const flowInputsList = metadata.flowInputs || [];\n      \n      // 过滤掉固定参数\n      const fixedParams = ['history', 'content', 'images'];\n      const extraInputs = flowInputsList.filter((input: any) => !fixedParams.includes(input.field));\n      \n      return extraInputs.length > 0;\n    } catch (e) {\n      console.error('解析metadata失败', e);\n      return false;\n    }\n  });\n\n  // 检查是否有必填的额外参数\n  const hasRequiredFlowInputs = computed(() => {\n    if (!appData.value || !appData.value.metadata) {\n      return false;\n    }\n    try {\n      const metadata = typeof appData.value.metadata === 'string' \n        ? JSON.parse(appData.value.metadata) \n        : appData.value.metadata;\n      const flowInputsList = metadata.flowInputs || [];\n      \n      // 过滤掉固定参数，且必须是必填的\n      const fixedParams = ['history', 'content', 'images'];\n      const requiredInputs = flowInputsList.filter((input: any) => \n        !fixedParams.includes(input.field) && input.required\n      );\n      \n      return requiredInputs.length > 0;\n    } catch (e) {\n      console.error('解析metadata失败', e);\n      return false;\n    }\n  });\n\n  // 监听appData变化，更新flowInputs\n  watch(\n    () => appData.value,\n    (val) => {\n      if (!val || !val.metadata) {\n        flowInputs.value = [];\n        return;\n      }\n      try {\n        const metadata = typeof val.metadata === 'string' \n          ? JSON.parse(val.metadata) \n          : val.metadata;\n        flowInputs.value = metadata.flowInputs || [];\n      } catch (e) {\n        console.error('解析metadata失败', e);\n        flowInputs.value = [];\n      }\n    },\n    { immediate: true, deep: true }\n  );\n\n  // 获取当前会话的设置\n  const getCurrentSettings = computed(() => {\n    return conversationSettings.value[uuid.value] || {};\n  });\n\n  // 编辑对话设置\n  function handleEditSettings() {\n    if (settingsModalRef.value) {\n      settingsModalRef.value.open();\n    }\n  }\n\n  // 保存对话设置\n  function handleSettingsOk(data: Record<string, any>) {\n    // 保存到本地状态（会在发送消息时传给后端）\n    conversationSettings.value[uuid.value] = data;\n    message.success('对话设置已保存');\n    \n    nextTick(() => {\n      chatVisible.value = true;\n    });\n  }\n\n  // 监听dataSource变化执行操作\n  const execute = () => {\n    unwatch01 = watch(\n      () => dataSource.value.active,\n      (value) => {\n        if (value) {\n          if (value == '1002') {\n            uuid.value = '1002';\n            chatData.value = [];\n            chatTitle.value = \"新建聊天\";\n            chatVisible.value = false;\n            nextTick(() => {\n              chatVisible.value = true;\n              // 新会话且有必填参数，弹出设置弹窗\n              if (hasRequiredFlowInputs.value && !conversationSettings.value['1002']) {\n                if (settingsModalRef.value) {\n                  settingsModalRef.value.open();\n                }\n              }\n            });\n            return;\n          }\n          //update-begin---author:wangshuai---date:2025-03-14---for:【QQYUN-11421】聊天，删除会话后，聊天切换到新的会话，但是聊天标题没有变---\n          let values = dataSource.value.history.filter((item) => item.id === value);\n          if(values && values.length>0){\n            chatTitle.value = values[0]?.title\n          }\n          //update-end---author:wangshuai---date:2025-03-14---for:【QQYUN-11421】聊天，删除会话后，聊天切换到新的会话，但是聊天标题没有变---\n          //根据选中的id查询聊天内容\n          let params = { conversationId: value };\n          uuid.value = value;\n          defHttp.get({ url: '/airag/chat/messages', params }, { isTransformResponse: false }).then((res) => {\n            if (res.success) {\n              // 处理新的返回格式（包含messages和flowInputs）\n              if (res.result && res.result.messages) {\n                chatData.value = res.result.messages;\n                // 加载已保存的设置\n                if (res.result.flowInputs) {\n                  conversationSettings.value[value] = res.result.flowInputs;\n                }\n              } else if (Array.isArray(res.result)) {\n                // 兼容旧格式\n                chatData.value = res.result;\n              } else {\n                chatData.value = [];\n              }\n            } else {\n              chatData.value = [];\n            }\n            chatVisible.value = false;\n            // 新会话且有必填参数，弹出设置弹窗\n            if (hasRequiredFlowInputs.value && !conversationSettings.value[value]) {\n              if (settingsModalRef.value) {\n                settingsModalRef.value.open();\n              }\n            }else{\n              nextTick(() => {\n                chatVisible.value = true;\n              });\n            }\n          });\n        }else{\n          chatData.value = [];\n          chatTitle.value = \"\";\n        }\n      },\n      { immediate: true }\n    );\n  };\n\n  //是否为多会话模式\n  const isMultiSession = ref<boolean>(true);\n  //是否为手机\n  const { getIsMobile } = useAppInject();\n  //来源\n  const source = ref<string>('');\n  \n  /**\n   * 初始化聊天信息\n   * @param appId\n   */\n  function initChartData(appId = '') {\n    defHttp\n      .get(\n        {\n          url: '/airag/chat/conversations',\n          params: { appId: appId },\n        },\n        { isTransformResponse: false }\n      )\n      .then((res) => {\n        if (res.success && res.result && res.result.length > 0) {\n          dataSource.value.history = res.result;\n          dataSource.value.active = res.result[0].id;\n          chatTitle.value = res.result[0].title;\n          chatActiveKey.value = 0;\n        } else {\n          priming();\n        }\n        !unwatch01 && execute();\n      })\n      .catch(() => {\n        priming();\n      }).finally(()=>{\n        loading.value = false\n    });\n  }\n\n  onMounted(() => {\n    loading.value = true;\n    let params: any = router.currentRoute.value.params;\n    if (params.appId) {\n      appId.value = params.appId;\n      getApplicationData(params.appId);\n      initChartData(params.appId);\n    } else {\n      initChartData();\n      quickCommandData.value = [\n          { name: '请介绍一下JeecgBoot', descr: \"请介绍一下JeecgBoot\" },\n          { name: 'JEECG有哪些优势？', descr: \"JEECG有哪些优势？\" },\n          { name: 'JEECG可以做哪些事情？', descr: \"JEECG可以做哪些事情？\" },];\n    }\n    let query: any = router.currentRoute.value.query;\n    source.value = query.source;\n    if(query.source){\n      showAdvertising.value = query.source === 'chatJs';\n    }else{\n      showAdvertising.value = false;\n    }\n  });\n\n  onUnmounted(() => {\n    chatData.value = [];\n    chatTitle.value = \"\";\n    prologue.value = \"\"\n    presetQuestion.value = \"\";\n    quickCommandData.value = [];\n  })\n  \n  /**\n   * 获取应用id\n   *\n   * @param appId\n   */\n  async function getApplicationData(appId) {\n    await defHttp\n      .get(\n        {\n          url: '/airag/chat/init',\n          params: { id: appId },\n        },\n        { isTransformResponse: false }\n      )\n      .then((res) => {\n        if (res.success) {\n          appData.value = res.result;\n          if (res.result && res.result.prologue) {\n            prologue.value = res.result.prologue;\n          }  \n          if (res.result && res.result.quickCommand) {\n            quickCommandData.value = JSON.parse(res.result.quickCommand);\n          } \n          if (res.result && res.result.presetQuestion) {\n            presetQuestion.value = res.result.presetQuestion;\n          }\n          if (res.result && res.result.metadata) {\n            let metadata = JSON.parse(res.result.metadata);\n            //判斷是否为手机模式\n            if(!getIsMobile.value){\n              //是否为多会话模式\n              if((metadata.multiSession && metadata.multiSession === '1') || !metadata.multiSession) {\n                isMultiSession.value = true;\n              } else {\n                isMultiSession.value = false;\n                expand.value = false;\n              }\n            }\n          }\n          if(getIsMobile.value){\n            isMultiSession.value = false;\n            expand.value = false;\n          }\n        } else {\n          appData.value = {};\n        }\n      });\n  }\n\n  /**\n   * 左侧消息列表点击事件\n   * @param title\n   * @param index\n   */\n  function handleChatClick(title, index) {\n    chatTitle.value = title;\n    chatActiveKey.value = index;\n  }\n\n  /**\n   * 重新加载标题消息\n   * @param text\n   */\n  function reloadMessageTitle(text) {\n    let title = dataSource.value.history[chatActiveKey.value].title;\n    if(title === '新建聊天'){\n      dataSource.value.history[chatActiveKey.value].title = text;\n      dataSource.value.history[chatActiveKey.value]['disabled'] = false;\n    }\n\n  }\n  \n  /**\n   * 初始化聊天：用于icon点击\n   */\n  function initChat(value) {\n    appId.value = value;\n    getApplicationData(value);\n    initChartData(value);\n  }\n  \n  defineExpose({\n    initChat\n  })\n\n  onUnmounted(() => {\n    unwatch01 && unwatch01();\n  });\n\n  watch(\n    () => chatContainerRef.value,\n    () => {\n      if(chatContainerRef.value.offsetHeight){\n        chatContainerStyle.value = { height: `${chatContainerRef.value.offsetHeight} px` };\n      }\n    }\n  );\n</script>\n\n<style scoped lang=\"less\">\n  @width: 260px;\n  .chat-container {\n    height: 100%;\n    width: 100%;\n    position: absolute;\n    background: white;\n    display: flex;\n    overflow: hidden;\n    z-index: 800;\n    border: 1px solid #eeeeee;\n    :deep(.ant-spin) {\n      position: absolute;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n    }\n  }\n\n  .leftArea {\n    width: @width;\n    transition: 0.3s left;\n    position: absolute;\n    left: 0;\n    height: 100%;\n\n    .content {\n      width: 100%;\n      height: 100%;\n      overflow: hidden;\n    }\n\n    &.shrink {\n      left: -@width;\n\n      .toggle-btn {\n        .icon {\n          transform: rotate(0deg);\n        }\n      }\n    }\n\n    .toggle-btn {\n      transition:\n        color 0.3s cubic-bezier(0.4, 0, 0.2, 1),\n        right 0.3s cubic-bezier(0.4, 0, 0.2, 1),\n        left 0.3s cubic-bezier(0.4, 0, 0.2, 1),\n        border-color 0.3s cubic-bezier(0.4, 0, 0.2, 1),\n        background-color 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n      cursor: pointer;\n      width: 24px;\n      height: 24px;\n      position: absolute;\n      top: 50%;\n      right: 0;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-size: 18px;\n      color: rgb(51, 54, 57);\n      border: 1px solid rgb(239, 239, 245);\n      background-color: #fff;\n      box-shadow: 0 2px 4px 0px #e7e9ef;\n      transform: translateX(50%) translateY(-50%);\n      z-index: 1;\n    }\n\n    .icon {\n      transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n      transform: rotate(180deg);\n      font-size: 18px;\n      height: 18px;\n\n      svg {\n        height: 1em;\n        width: 1em;\n        vertical-align: top;\n      }\n    }\n  }\n\n  .rightArea {\n    margin-left: @width;\n    transition: 0.3s margin-left;\n\n    &.shrink {\n      margin-left: 0;\n    }\n\n    flex: 1;\n    min-width: 0;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/AiChatIcon.vue",
    "content": "<template>\n  <div class=\"footer\">\n    <div v-if=\"!showChat\" class=\"footer-icon\" @click=\"chatClick\">\n      <Icon icon=\"ant-design:comment-outlined\" size=\"22\"></Icon>\n    </div>\n    <div v-if=\"showChat\" class=\"footer-close-icon\" @click=\"chatClick\">\n      <Icon icon=\"ant-design:close-outlined\" size=\"20\"></Icon>\n    </div>\n    <div v-if=\"showChat\" class=\"ai-chat\">\n      <AiChat ref=\"aiChatRef\"></AiChat>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\n  import { onMounted, ref } from 'vue';\n  import AiChat from './AiChat.vue';\n  import { useRouter } from 'vue-router';\n\n  //aiChat的ref\n  const aiChatRef = ref();\n  //应用id\n  const appId = ref<string>('');\n\n  //是否显示聊天\n  const showChat = ref<any>(false);\n  const router = useRouter();\n  //判断是否为初始化\n  const isInit = ref<boolean>(false);\n  \n  /**\n   * chat图标点击事件\n   */\n  function chatClick() {\n    showChat.value = !showChat.value;\n    if(showChat.value && !isInit.value){\n      setTimeout(()=>{\n        isInit.value = true;\n        aiChatRef.value.initChat(appId.value);\n      },100)\n    }\n  }\n\n  onMounted(() => {\n    let params: any = router.currentRoute.value.params;\n    appId.value = params?.appId;\n    isInit.value = false;\n  });\n</script>\n\n<style scoped lang=\"less\">\n  .footer {\n    position: fixed;\n    bottom: 16px;\n    right: 16px;\n    left: unset;\n    top: unset;\n\n    .footer-icon {\n      cursor: pointer;\n      background-color: #155eef;\n      color: white;\n      border-radius: 100%;\n      padding: 20px;\n      width: 48px;\n      height: 48px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      box-shadow: #cccccc 0 4px 8px 0;\n    }\n    .footer-close-icon {\n      color: #0a3069;\n      height: 48px;\n      position: absolute;\n      right: 10px;\n      top: 20px;\n      cursor: pointer;\n      z-index: 9999;\n    }\n    .ai-chat {\n      border: 1px solid #eeeeee;\n      width: calc(100vh - 20px);\n      height: calc(100vh - 200px);\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/ThinkText.vue",
    "content": "<template>\n  <div v-if=\"text != ''\" class=\"textWrap\" :class=\"[inversion === 'user' ? 'self' : 'chatgpt']\" ref=\"textRef\">\n    <div :style=\"{ width: getIsMobile ? screenWidth : 'auto' }\">\n      <div class=\"markdown-body\" :class=\"{ 'markdown-body-generate': loading }\" :style=\"{ color: error ? '#FF4444 !important' : '' }\" v-html=\"text\" />\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\n  import { computed, onMounted, onUnmounted, onUpdated, ref } from 'vue';\n  import MarkdownIt from 'markdown-it';\n  import './style/github-markdown.less';\n  import './style/highlight.less';\n  import './style/style.less';\n  import { useAppInject } from '@/hooks/web/useAppInject';\n  import hljs from 'highlight.js';\n  import mila from 'markdown-it-link-attributes';\n  import mdKatex from '@traptitech/markdown-it-katex';\n  import { useGlobSetting } from '@/hooks/setting';\n\n  /**\n   * 屏幕宽度\n   */\n  const screenWidth = ref<string>();\n  const { getIsMobile } = useAppInject();\n\n  const props = defineProps(['dateTime', 'text', 'inversion', 'error', 'loading', 'referenceKnowledge']);\n  const textRef = ref();\n  const mdi = new MarkdownIt({\n    html: true,\n    linkify: true,\n    highlight(code, language) {\n      const validLang = !!(language && hljs.getLanguage(language));\n      if (validLang) {\n        const lang = language ?? '';\n        return highlightBlock(hljs.highlight(code, { language: lang }).value, lang);\n      }\n      return highlightBlock(hljs.highlightAuto(code).value, '');\n    },\n  });\n\n  mdi.use(mila, { attrs: { target: '_blank', rel: 'noopener' } });\n  mdi.use(mdKatex, { blockClass: 'katexmath-block rounded-md p-[10px]', errorColor: ' #cc0000' });\n\n  const text = computed(() => {\n    let value = props.text ?? '';\n    if (props.inversion != 'user') {\n      value = replaceImageWith(value);\n      value = replaceDomainUrl(value);\n      return mdi.render(value);\n    }\n    return value.replace('\\n', '<br>');\n  });\n\n  // 是否显示引用知识库\n  const showRefKnow = computed(() => {\n    const { loading, referenceKnowledge } = props;\n    if (loading) {\n      return false;\n    }\n    return Array.isArray(referenceKnowledge) && referenceKnowledge.length > 0;\n  });\n\n  //替换图片宽度\n  const replaceImageWith = (markdownContent) => {\n    // 支持图片设置width的写法 ![](/static/jimuImages/screenshot_1617252560523.png =100)\n    const regex = /!\\[([^\\]]*)\\]\\(([^)]+)=([0-9]+)\\)/g;\n    return markdownContent.replace(regex, (match, alt, src, width) => {\n      let reg = /#\\s*{\\s*domainURL\\s*}/g;\n      src = src.replace(reg, domainUrl);\n      return `<div><img src='${src}' alt='${alt}' width='${width}' /></div>`;\n    });\n  };\n  const { domainUrl } = useGlobSetting();\n  //替换domainURL\n  const replaceDomainUrl = (markdownContent) => {\n    const regex = /!\\[([^\\]]*)\\]\\(.*?#\\s*{\\s*domainURL\\s*}.*?\\)/g;\n    return markdownContent.replace(regex, (match) => {\n      let reg = /#\\s*{\\s*domainURL\\s*}/g;\n      return match.replace(reg, domainUrl);\n    });\n  };\n\n  //是否放大图片\n  const amplifyImage = ref<boolean>(false);\n  //图片地址\n  const imageUrl = ref<string>('');\n\n  function highlightBlock(str: string, lang?: string) {\n    return `<pre class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-header__lang\">${lang}</span><span class=\"code-block-header__copy\">复制代码</span></div><code class=\"hljs code-block-body ${lang}\">${str}</code></pre>`;\n  }\n  function addCopyEvents() {\n    if (textRef.value) {\n      const copyBtn = textRef.value.querySelectorAll('.code-block-header__copy');\n      copyBtn.forEach((btn) => {\n        btn.addEventListener('click', () => {\n          const code = btn.parentElement?.nextElementSibling?.textContent;\n          if (code) {\n            copyToClip(code).then(() => {\n              btn.textContent = '复制成功';\n              setTimeout(() => {\n                btn.textContent = '复制代码';\n              }, 1e3);\n            });\n          }\n        });\n      });\n    }\n  }\n\n  function removeCopyEvents() {\n    if (textRef.value) {\n      const copyBtn = textRef.value.querySelectorAll('.code-block-header__copy');\n      copyBtn.forEach((btn) => {\n        btn.removeEventListener('click', () => {});\n      });\n    }\n  }\n\n  /**\n   * 添加图片点击事件\n   */\n  function addImageClickEvent() {\n    if (textRef.value) {\n      const image = textRef.value.querySelectorAll('img');\n      image.forEach((img) => {\n        img.addEventListener('click', () => {\n          imageUrl.value = img.src;\n          amplifyImage.value = true;\n        });\n      });\n    }\n  }\n\n  /**\n   * 移出图片点击事件\n   */\n  function removeImageClickEvent() {\n    if (textRef.value) {\n      const image = textRef.value.querySelectorAll('img');\n      image.forEach((img) => {\n        img.removeEventListener('click', () => {});\n      });\n    }\n  }\n\n  /**\n   * 图片隐藏\n   */\n  function pictureHide() {\n    amplifyImage.value = false;\n    imageUrl.value = '';\n  }\n\n  /**\n   * 设置markdown body整体宽度\n   */\n  function setMarkdownBodyWidth() {\n    //平板\n    console.log('window.innerWidth::', window.innerWidth);\n    if (window.innerWidth > 600 && window.innerWidth < 1024) {\n      screenWidth.value = window.innerWidth - 120 + 'px';\n    } else if (window.innerWidth < 600) {\n      //手机\n      screenWidth.value = window.innerWidth - 60 + 'px';\n    }\n  }\n\n  onMounted(() => {\n    addCopyEvents();\n    addImageClickEvent();\n    setMarkdownBodyWidth();\n    window.addEventListener('resize', setMarkdownBodyWidth);\n  });\n\n  onUpdated(() => {\n    addCopyEvents();\n    addImageClickEvent();\n  });\n\n  onUnmounted(() => {\n    removeCopyEvents();\n    removeImageClickEvent();\n    window.removeEventListener('resize', setMarkdownBodyWidth);\n  });\n\n  function copyToClip(text: string) {\n    return new Promise((resolve, reject) => {\n      try {\n        const input: HTMLTextAreaElement = document.createElement('textarea');\n        input.setAttribute('readonly', 'readonly');\n        input.value = text;\n        document.body.appendChild(input);\n        input.select();\n        if (document.execCommand('copy')) document.execCommand('copy');\n        document.body.removeChild(input);\n        resolve(text);\n      } catch (error) {\n        reject(error);\n      }\n    });\n  }\n</script>\n<style lang=\"less\" scoped>\n  .textWrap {\n    border-radius: 0.375rem;\n    padding-top: 0.5rem;\n    padding-bottom: 0.5rem;\n    padding-left: 0.75rem;\n    padding-right: 0.75rem;\n    font-size: 0.875rem;\n    line-height: 1.25rem;\n    border-left: 1px solid #e1e5ea;\n  }\n\n  .error {\n    background: linear-gradient(135deg, #ff4444, #ff914d) !important;\n    border-radius: 0.375rem;\n    padding-top: 0.5rem;\n    padding-bottom: 0.5rem;\n    padding-left: 0.75rem;\n    padding-right: 0.75rem;\n    font-size: 0.875rem;\n    line-height: 1.25rem;\n  }\n\n  .self {\n    // background-color: #d2f9d1;\n    background-color: @primary-color;\n    color: #fff;\n    overflow-wrap: break-word;\n    line-height: 1.625;\n    min-width: 20px;\n  }\n\n  .chatgpt {\n    font-size: 0.875rem;\n    line-height: 1.25rem;\n  }\n\n  // 已停止下方的样式\n  :deep(.markdown-body) {\n    color: #333;\n    font-family:\n      -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial,\n      sans-serif;\n    line-height: 1.6;\n    padding: 14px;\n\n    // 段落样式\n    p {\n      color: #333;\n      line-height: 1.6;\n      margin-bottom: 1em;\n      margin-top: 0;\n    }\n\n    // 列表样式\n    ul,\n    ol {\n      margin-left: 1.5em;\n      margin-bottom: 1em;\n      padding-left: 0;\n\n      li {\n        color: #333;\n        line-height: 1.6;\n        margin-bottom: 0.5em;\n        padding-left: 0.5em;\n      }\n    }\n\n    // 关键词/代码高亮样式\n    code {\n      background-color: #f0f0f0;\n      color: #333;\n      padding: 2px 6px;\n      border-radius: 3px;\n      font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n      font-size: 0.9em;\n    }\n\n    // 行内代码\n    p code,\n    li code,\n    td code {\n      background-color: #f0f0f0;\n      color: #333;\n      padding: 2px 6px;\n      border-radius: 3px;\n    }\n\n    // 代码块保持原有样式\n    pre {\n      code {\n        background-color: transparent;\n        padding: 0;\n      }\n    }\n\n    // 强调文本\n    strong,\n    b {\n      color: #333;\n      font-weight: 600;\n    }\n\n    // 链接样式\n    a {\n      color: #4183c4;\n      text-decoration: none;\n\n      &:hover {\n        text-decoration: underline;\n      }\n    }\n  }\n\n  @media (max-width: 1024px) {\n    //手机和平板下的样式\n    .textWrap {\n      margin-left: -40px;\n      margin-top: 10px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/chat.vue",
    "content": "<template>\n  <div class=\"chatWrap\">\n    <div class=\"content\">\n      <div class=\"header-title\" v-if=\"type === 'view' && headerTitle\">\n        <div class=\"title-content\">\n          <span>{{headerTitle}}</span>\n          <a-button \n            v-if=\"hasExtraFlowInputs\" \n            type=\"text\" \n            class=\"edit-btn\" \n            @click=\"handleEditSettings\"\n            title=\"参数设置\"\n          >\n            <Icon icon=\"ant-design:setting-outlined\" :size=\"16\" />\n          </a-button>\n        </div>\n        <div class=\"header-actions\">\n          <div v-if=\"showAdvertising\" class=\"header-advertisint\">\n            AI客服由\n            <a style=\"color: #4183c4;margin-left: 2px;margin-right: 2px\" href=\"https://jeecg.com/aigcIndex\" target=\"_blank\">\n              JEECG AI\n            </a>\n            提供\n          </div>\n        </div>\n      </div>\n      <div class=\"main\">\n        <div id=\"scrollRef\" ref=\"scrollRef\" class=\"scrollArea\">\n          <template v-if=\"chatData.length>0\">\n            <div class=\"chatContentArea\">\n              <chatMessage\n                v-for=\"(item, index) of chatData\"\n                :key=\"index\"\n                :date-time=\"item.dateTime || item.datetime\"\n                :text=\"item.content\"\n                :inversion=\"item.inversion || item.role\"\n                :error=\"item.error\"\n                :errorMsg=\"item.errorMsg\"\n                :currentToolTag=\"currentToolTag\"\n                :loading=\"item.loading\"\n                :appData=\"appData\"\n                :presetQuestion=\"item.presetQuestion\"\n                :images = \"item.images\"\n                :files = \"item.files\"\n                :retrievalText=\"item.retrievalText\"\n                :referenceKnowledge=\"item.referenceKnowledge\"\n                :eventType=\"item.eventType\"\n                :showAvatar=\"item.showAvatar\"\n                :isLast=\"index === chatData.length -1\"\n                @send=\"handleOutQuestion\"\n              ></chatMessage>\n            </div>\n          </template>\n        </div>\n      </div>\n      <div class=\"footer\">\n        <div class=\"topArea\">\n          <presetQuestion @out-question=\"handleOutQuestion\" :quickCommandData=\"quickCommandData\"></presetQuestion>\n        </div>\n        <div class=\"bottomArea\">\n          <a-button type=\"text\" class=\"delBtn\" @click=\"handleDelSession()\">\n            <svg\n              t=\"1706504908534\"\n              class=\"icon\"\n              viewBox=\"0 0 1024 1024\"\n              version=\"1.1\"\n              xmlns=\"http://www.w3.org/2000/svg\"\n              p-id=\"1584\"\n              width=\"18\"\n              height=\"18\"\n            >\n              <path\n                d=\"M816.872727 158.254545h-181.527272V139.636364c0-39.563636-30.254545-69.818182-69.818182-69.818182h-107.054546c-39.563636 0-69.818182 30.254545-69.818182 69.818182v18.618181H207.127273c-48.872727 0-90.763636 41.890909-90.763637 93.09091s41.890909 90.763636 90.763637 90.763636h609.745454c51.2 0 90.763636-41.890909 90.763637-90.763636 0-51.2-41.890909-93.090909-90.763637-93.09091zM435.2 139.636364c0-13.963636 9.309091-23.272727 23.272727-23.272728h107.054546c13.963636 0 23.272727 9.309091 23.272727 23.272728v18.618181h-153.6V139.636364z m381.672727 155.927272H207.127273c-25.6 0-44.218182-20.945455-44.218182-44.218181 0-25.6 20.945455-44.218182 44.218182-44.218182h609.745454c25.6 0 44.218182 20.945455 44.218182 44.218182 0 23.272727-20.945455 44.218182-44.218182 44.218181zM835.490909 407.272727h-121.018182c-13.963636 0-23.272727 9.309091-23.272727 23.272728s9.309091 23.272727 23.272727 23.272727h97.745455V837.818182c0 39.563636-30.254545 69.818182-69.818182 69.818182h-37.236364V602.763636c0-13.963636-9.309091-23.272727-23.272727-23.272727s-23.272727 9.309091-23.272727 23.272727V907.636364h-118.690909V602.763636c0-13.963636-9.309091-23.272727-23.272728-23.272727s-23.272727 9.309091-23.272727 23.272727V907.636364H372.363636V602.763636c0-13.963636-9.309091-23.272727-23.272727-23.272727s-23.272727 9.309091-23.272727 23.272727V907.636364h-34.909091c-39.563636 0-69.818182-30.254545-69.818182-69.818182V453.818182H558.545455c13.963636 0 23.272727-9.309091 23.272727-23.272727s-9.309091-23.272727-23.272727-23.272728H197.818182c-13.963636 0-23.272727 9.309091-23.272727 23.272728V837.818182c0 65.163636 51.2 116.363636 116.363636 116.363636h451.490909c65.163636 0 116.363636-51.2 116.363636-116.363636V430.545455c0-13.963636-11.636364-23.272727-23.272727-23.272728z\"\n                fill=\"currentColor\"\n                p-id=\"1585\"\n              />\n            </svg>\n          </a-button>\n          <a-button v-if=\"type === 'view'\" type=\"text\" class=\"contextBtn\" :class=\"[usingContext && 'enabled']\" @click=\"handleUsingContext\">\n            <svg\n              xmlns=\"http://www.w3.org/2000/svg\"\n              xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n              aria-hidden=\"true\"\n              role=\"img\"\n              class=\"iconify iconify--ri\"\n              width=\"20\"\n              height=\"20\"\n              viewBox=\"0 0 24 24\"\n            >\n              <path\n                fill=\"currentColor\"\n                d=\"M12 2c5.523 0 10 4.477 10 10s-4.477 10-10 10a9.956 9.956 0 0 1-4.708-1.175L2 22l1.176-5.29A9.956 9.956 0 0 1 2 12C2 6.477 6.477 2 12 2m0 2a8 8 0 0 0-8 8c0 1.335.326 2.618.94 3.766l.35.654l-.656 2.946l2.948-.654l.653.349A7.955 7.955 0 0 0 12 20a8 8 0 1 0 0-16m1 3v5h4v2h-6V7z\"\n              />\n            </svg>\n          </a-button>\n          <div class=\"chat-textarea\" :class=\"textareaActive?'textarea-active':''\">\n            <!--   begin 兼容文件显示   -->\n            <div class=\"textarea-top\" v-if=\"(uploadUrlList && uploadUrlList.length>0) || (fileList && fileList.length>0)\">\n              <!-- 只拥有图片 -->\n              <template v-if=\"(!fileList || fileList.length===0)\">\n                <div v-for=\"(item,index) in uploadUrlList\" class=\"top-image\" :key=\"index\">\n                  <img :src=\"getImage(item)\" @click=\"handlePreview(item)\"/>\n                  <div class=\"upload-icon\" @click=\"deleteImage(index)\">\n                    <Icon icon=\"ant-design:close-outlined\" size=\"12px\"></Icon>\n                  </div>\n                </div>\n              </template>\n              <!-- 拥有文件 -->\n              <template v-else>\n                <div class=\"file-card-container\" style=\"display: flex; gap: 8px; flex-wrap: wrap;\">\n                  <!-- 图片渲染 -->\n                  <div v-for=\"(url, index) in uploadUrlList\" :key=\"'img-'+index\" class=\"file-card\">\n                    <div class=\"file-card-icon\">\n                      <img :src=\"getImage(url)\" class=\"file-thumb\" @click=\"handlePreview(url)\"/>\n                    </div>\n                    <div class=\"file-card-info\">\n                      <div class=\"file-name\" :title=\"fileInfoList[index]?.name || '图片'\">{{ fileInfoList[index]?.name || '图片' }}</div>\n                      <div class=\"file-size\">{{ calculateFileSize(fileInfoList[index]?.size) }}</div>\n                    </div>\n                    <div class=\"file-card-close\" @click=\"deleteImage(index)\">\n                      <Icon icon=\"ant-design:close-outlined\" size=\"12px\"/>\n                    </div>\n                  </div>\n                  <!-- 文件渲染 -->\n                  <template v-for=\"(item, index) in fileList\" :key=\"'file-'+index\">\n                    <div class=\"file-card\" v-if=\"item.status !== 'error'\">\n                      <div class=\"file-card-icon\">\n                        <Icon :icon=\"getFileIcon(item.name)\" :color=\"getFileIconColor(item.name)\" size=\"32\" />\n                      </div>\n                      <div class=\"file-card-info\">\n                        <div class=\"file-name\" :title=\"item.name\">{{ item.name }}</div>\n                        <div class=\"file-size\">{{ calculateFileSize(item.size) }}</div>\n                      </div>\n                      <div class=\"file-card-close\" @click=\"deleteFile(index)\">\n                        <Icon icon=\"ant-design:close-outlined\" size=\"12px\"/>\n                      </div>\n                    </div>\n                  </template>\n                </div>\n              </template>\n              <!--   end 兼容文件显示   -->\n            </div>\n            <div class=\"textarea-bottom\">\n              <a-textarea\n                  ref=\"inputRef\"\n                  v-model:value=\"prompt\"\n                  :autoSize=\"{ minRows: 1, maxRows: 6 }\"\n                  :placeholder=\"placeholder\"\n                  @press-enter=\"handleEnter\"\n                  @focus=\"textareaActive = true\"\n                  @blur=\"textareaActive = false\"\n                  autofocus\n                  :readonly=\"loading\"\n                  style=\"border-color: #ffffff !important;box-shadow:none\"\n                  @paste=\"paste\"\n              >\n              </a-textarea>\n              <div class=\"textarea-action-bar\">\n                <div class=\"left-actions\">\n                <a-dropdown placement=\"topLeft\" trigger=\"['click']\" overlayClassName=\"chat-upload-dropdown\">\n                  <template #overlay>\n                    <a-menu mode=\"vertical\">\n                      <a-menu-item key=\"img\">\n                        <a-upload\n                            accept=\".jpg,.jpeg,.png\"\n                            v-if=\"!loading\"\n                            name=\"file\"\n                            v-model:file-list=\"fileInfoList\"\n                            :showUploadList=\"false\"\n                            :headers=\"headers\"\n                            :beforeUpload=\"beforeUpload\"\n                            @change=\"handleChange\"\n                            :multiple=\"true\"\n                            :action=\"uploadUrl\"\n                            :max-count=\"3\"\n                        >\n                          <div style=\"display: flex; align-items: center\">\n                            <Icon icon=\"ant-design:picture-outlined\" style=\"margin-right:8px;color:#3d4353\" />\n                            上传图片\n                          </div>\n                        </a-upload>\n                      </a-menu-item>\n                      <a-menu-item key=\"file\">\n                        <a-upload\n                            accept=\".txt, .pdf, .docx, .doc, .pptx, .ppt, .xlsx, .xls, .md\"\n                            :maxCount=\"3\"\n                            v-if=\"!loading\"\n                            name=\"file\"\n                            v-model:file-list=\"fileList\"\n                            :showUploadList=\"false\"\n                            :headers=\"headers\"\n                            :beforeUpload=\"beforeUploadFile\"\n                            @change=\"handleChangeFile\"\n                            :multiple=\"true\"\n                            :action=\"uploadUrl\"\n                        >\n                          <div style=\"display: flex; align-items: center\">\n                            <Icon icon=\"ant-design:file-add-outlined\" style=\"margin-right:8px;color:#3d4353\" />\n                            上传文件\n                          </div>\n                        </a-upload>\n                      </a-menu-item>\n                    </a-menu>\n                  </template>\n                  <a-button class=\"sendBtn\" type=\"text\">\n                    <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M17.3977 3.9588C15.8361 2.39727 13.3037 2.39727 11.7422 3.9588L5.03365 10.6673C2.60612 13.0952 2.60612 17.0314 5.03365 19.4592C7.46144 21.887 11.3983 21.8875 13.8262 19.4599L20.5348 12.7514C20.8472 12.439 21.3534 12.439 21.6658 12.7514C21.9781 13.0638 21.9782 13.5701 21.6658 13.8825L14.9573 20.591C11.9046 23.6435 6.95518 23.6429 3.90255 20.5903C0.850191 17.5377 0.850191 12.5889 3.90255 9.53624L10.6111 2.82771C12.7975 0.641334 16.3424 0.641334 18.5288 2.82771C20.7149 5.01409 20.7151 8.55906 18.5288 10.7454L11.8699 17.4042C10.5369 18.7372 8.37542 18.7365 7.04241 17.4035C5.70963 16.0705 5.7095 13.9096 7.04241 12.5767L13.7012 5.91785C14.0136 5.60547 14.5199 5.60557 14.8323 5.91785C15.1447 6.23027 15.1447 6.73652 14.8323 7.04894L8.1735 13.7078C7.46543 14.4159 7.46556 15.5642 8.1735 16.2724C8.88167 16.9806 10.03 16.9806 10.7381 16.2724L17.397 9.61358C18.9584 8.05211 18.959 5.52035 17.3977 3.9588Z\" fill=\"currentColor\"></path></svg>\n                  </a-button>\n                </a-dropdown>\n                  <a-divider type=\"vertical\" v-if=\"showThink || showWebSearch || showDraw \"/>\n                  <a-tooltip v-if=\"showThink\" :title=\"enableThink ? '关闭深度思考' : '开启深度思考'\">\n                    <a-button\n                        class=\"sendBtn webSearchBtn\"\n                        type=\"text\"\n                        :class=\"{ 'enabled': enableThink }\"\n                        @click=\"toggleThink\">\n                      <svg style=\"margin-right: 6px\" :style=\"enableThink ? { color: '#06f' } : { color: '#3d4353' }\" width=\"16\" height=\"16\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M7.06428 5.93342C7.6876 5.93342 8.19304 6.43904 8.19319 7.06233C8.19319 7.68573 7.68769 8.19123 7.06428 8.19123C6.44096 8.19113 5.93537 7.68567 5.93537 7.06233C5.93552 6.43911 6.44105 5.93353 7.06428 5.93342Z\" fill=\"currentColor\"></path><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8.68147 0.963693C10.1168 0.447019 11.6266 0.374829 12.5633 1.31135C13.5 2.24805 13.4276 3.75776 12.911 5.19319C12.7126 5.74431 12.4385 6.31796 12.0965 6.89729C12.4969 7.54638 12.8141 8.19018 13.036 8.80647C13.5527 10.2419 13.625 11.7516 12.6883 12.6883C11.7516 13.625 10.2419 13.5527 8.80647 13.036C8.19019 12.8141 7.54638 12.4969 6.89729 12.0965C6.31794 12.4386 5.74432 12.7125 5.19319 12.911C3.75774 13.4276 2.24807 13.5 1.31135 12.5633C0.374829 11.6266 0.447019 10.1168 0.963693 8.68147C1.17182 8.10338 1.46318 7.50063 1.82893 6.8924C1.52179 6.35711 1.27232 5.82825 1.08869 5.31819C0.572038 3.88278 0.499683 2.37306 1.43635 1.43635C2.37304 0.499655 3.88277 0.572044 5.31819 1.08869C5.82825 1.27232 6.35712 1.5218 6.8924 1.82893C7.50063 1.46318 8.10338 1.17181 8.68147 0.963693ZM11.3572 8.01154C10.9083 8.62253 10.3901 9.22873 9.8094 9.8094C9.22874 10.3901 8.62252 10.9083 8.01154 11.3572C8.42567 11.5841 8.82867 11.7688 9.21272 11.9071C10.5455 12.3868 11.4246 12.2547 11.8397 11.8397C12.2547 11.4246 12.3869 10.5456 11.9071 9.21272C11.7688 8.82866 11.5841 8.42568 11.3572 8.01154ZM2.56526 8.02912C2.3734 8.39322 2.21492 8.74796 2.0926 9.08772C1.61288 10.4204 1.74509 11.2995 2.15998 11.7147C2.57502 12.1297 3.45412 12.2618 4.78694 11.7821C5.11053 11.6656 5.44783 11.5164 5.79377 11.3367C5.24897 10.9223 4.70919 10.4533 4.19026 9.9344C3.57575 9.31987 3.03166 8.67633 2.56526 8.02912ZM6.90705 3.2469C6.24062 3.70479 5.56457 4.26321 4.91389 4.91389C4.26322 5.56456 3.70479 6.24063 3.2469 6.90705C3.72671 7.63325 4.32774 8.37685 4.91389 8.96299C5.50003 9.54914 6.24362 10.1502 6.96983 10.6299C7.69601 10.1502 8.43961 9.54914 9.02575 8.96299C9.6119 8.37685 10.2129 7.63325 10.6927 6.90705C10.2129 6.18086 9.6119 5.43725 9.02575 4.8511C8.43961 4.26496 7.69601 3.66391 6.96983 3.18419C6.94896 3.205 6.92803 3.22593 6.90705 3.2469Z\" fill=\"currentColor\"></path></svg>\n                      深度思考\n                    </a-button>\n                  </a-tooltip>\n                  <a-tooltip v-if=\"showWebSearch\" :title=\"enableSearch ? '关闭联网搜索' : '开启联网搜索'\">\n                    <a-button\n                        class=\"sendBtn webSearchBtn\"\n                        type=\"text\"\n                        :class=\"{ 'enabled': enableSearch }\"\n                        @click=\"toggleWebSearch\">\n                      <Icon size=\"16\" icon=\"ant-design:global-outlined\" :style=\"enableSearch ? { color: '#06f' } : { color: '#3d4353' }\"></Icon>\n                      联网搜索\n                    </a-button>\n                  </a-tooltip>\n                  <a-tooltip v-if=\"showDraw\" :title=\"enableDraw ? '关闭图像生成' : '开启图像生成'\">\n                    <a-button\n                        class=\"sendBtn webSearchBtn\"\n                        type=\"text\"\n                        :class=\"{ 'enabled': enableDraw }\"\n                        @click=\"handleGenerateImage\">\n                      <svg style=\"margin-right: 6px\" :style=\"enableDraw ? { color: '#06f' } : { color: '#3d4353' }\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" class=\"\"><path d=\"M12 2.3584C14.1681 2.35841 16.1541 2.52965 17.7266 2.72754C19.9228 3.00409 21.6336 4.66074 21.9365 6.85352C22.1348 8.28975 22.2998 10.0677 22.2998 12L22.293 12.7168C22.2586 14.3712 22.1101 15.8897 21.9365 17.1465L21.9043 17.3496C21.5268 19.4411 19.8545 21.0045 17.7266 21.2725L17.1182 21.3457C15.655 21.511 13.8972 21.6416 12 21.6416L11.1963 21.6338C9.60724 21.6034 8.13686 21.4874 6.88281 21.3457L6.27441 21.2725C4.14635 21.0046 2.47428 19.4411 2.09668 17.3496L2.06445 17.1465C1.89093 15.8897 1.74239 14.3712 1.70801 12.7168L1.7002 12C1.7002 10.3092 1.82669 8.737 1.99121 7.4082L2.06445 6.85352C2.35801 4.72923 3.9719 3.10743 6.06934 2.75684L6.27441 2.72754C7.84674 2.52969 9.83219 2.35841 12 2.3584ZM11.9775 13.3496C11.4613 13.3496 10.9378 13.4818 10.2207 13.8066C9.48747 14.1388 8.61112 14.6435 7.37793 15.3555L3.76367 17.4424C4.13152 18.6436 5.16153 19.5204 6.47363 19.6855C7.99607 19.8771 9.91342 20.042 12 20.042C14.0865 20.042 16.0039 19.8771 17.5264 19.6855C18.8303 19.5214 19.8566 18.6546 20.2305 17.4648L16.5771 15.3555C15.344 14.6435 14.4676 14.1388 13.7344 13.8066C13.0173 13.4818 12.4938 13.3496 11.9775 13.3496ZM12 3.95801C9.91342 3.95802 7.99607 4.12286 6.47363 4.31445C4.98011 4.50243 3.85117 5.61215 3.64941 7.07324C3.45876 8.45412 3.2998 10.1566 3.2998 12C3.2998 13.3468 3.38385 14.6183 3.50391 15.7441L6.57715 13.9707C7.78367 13.2741 8.73894 12.7218 9.56055 12.3496C10.3981 11.9702 11.1542 11.75 11.9775 11.75C12.8008 11.75 13.557 11.9702 14.3945 12.3496C15.2161 12.7218 16.1714 13.2741 17.3779 13.9707L20.4922 15.7686C20.6134 14.6367 20.7002 13.3565 20.7002 12C20.7002 10.1566 20.5422 8.4541 20.3516 7.07324C20.1498 5.61218 19.0198 4.50249 17.5264 4.31445C16.0039 4.12287 14.0865 3.95802 12 3.95801ZM7.73438 7.0625C8.76128 7.0625 9.59375 7.89497 9.59375 8.92188C9.59375 9.94878 8.76128 10.7812 7.73438 10.7812C6.70747 10.7812 5.875 9.94878 5.875 8.92188C5.875 7.89497 6.70747 7.0625 7.73438 7.0625Z\" fill=\"currentColor\"></path></svg>\n                      <span style=\"font-size: 14px\">图像生成</span>\n                    </a-button>\n                  </a-tooltip>\n                </div>\n                <div class=\"right-actions\">\n                <a-button v-if=\"loading\" type=\"primary\" danger @click=\"handleStopChat\" class=\"stopBtn\">\n                  <svg\n                      t=\"1706148514627\"\n                      class=\"icon\"\n                      viewBox=\"0 0 1024 1024\"\n                      version=\"1.1\"\n                      xmlns=\"http://www.w3.org/2000/svg\"\n                      p-id=\"5214\"\n                      width=\"18\"\n                      height=\"18\"\n                  >\n                    <path\n                        d=\"M512 967.111111c-250.311111 0-455.111111-204.8-455.111111-455.111111s204.8-455.111111 455.111111-455.111111 455.111111 204.8 455.111111 455.111111-204.8 455.111111-455.111111 455.111111z m0-56.888889c221.866667 0 398.222222-176.355556 398.222222-398.222222s-176.355556-398.222222-398.222222-398.222222-398.222222 176.355556-398.222222 398.222222 176.355556 398.222222 398.222222 398.222222z\"\n                        fill=\"currentColor\"\n                        p-id=\"5215\"\n                    />\n                    <path d=\"M341.333333 341.333333h341.333334v341.333334H341.333333z\" fill=\"currentColor\" p-id=\"5216\"/>\n                  </svg>\n                </a-button>\n                <a-button\n                    @click=\"\n              () => {\n                handleSubmit();\n              }\n            \"\n                    :disabled=\"!prompt\"\n                    class=\"sendBtn\"\n                    type=\"text\"\n                    v-if=\"!loading\"\n                >\n                  <svg\n                      t=\"1706147858151\"\n                      class=\"icon\"\n                      viewBox=\"0 0 1024 1024\"\n                      version=\"1.1\"\n                      xmlns=\"http://www.w3.org/2000/svg\"\n                      p-id=\"4237\"\n                      width=\"18\"\n                      height=\"18\"\n                  >\n                    <path\n                        d=\"M865.28 202.5472c-17.1008-15.2576-41.0624-19.6608-62.5664-11.5712L177.7664 427.1104c-23.2448 8.8064-38.5024 29.696-39.6288 54.5792-1.1264 24.8832 11.9808 47.104 34.4064 58.0608l97.5872 47.7184c4.5056 2.2528 8.0896 6.0416 9.9328 10.6496l65.4336 161.1776c7.7824 19.1488 24.4736 32.9728 44.7488 37.0688 20.2752 4.096 41.0624-2.1504 55.6032-16.7936l36.352-36.352c6.4512-6.4512 16.5888-7.8848 24.576-3.3792l156.5696 88.8832c9.4208 5.3248 19.8656 8.0896 30.3104 8.0896 8.192 0 16.4864-1.6384 24.2688-5.0176 17.8176-7.68 30.72-22.8352 35.4304-41.6768l130.7648-527.1552c5.5296-22.016-1.7408-45.2608-18.8416-60.416z m-20.8896 50.7904L713.5232 780.4928c-1.536 6.2464-5.8368 11.3664-11.776 13.9264s-12.5952 2.1504-18.2272-1.024L526.9504 704.512c-9.4208-5.3248-19.8656-7.9872-30.208-7.9872-15.9744 0-31.744 6.144-43.52 17.92l-36.352 36.352c-3.8912 3.8912-8.9088 5.9392-14.2336 6.0416l55.6032-152.1664c0.512-1.3312 1.2288-2.56 2.2528-3.6864l240.3328-246.1696c8.2944-8.4992-2.048-21.9136-12.3904-16.0768L301.6704 559.8208c-4.096-3.584-8.704-6.656-13.6192-9.1136L190.464 502.9888c-11.264-5.5296-11.5712-16.1792-11.4688-19.3536 0.1024-3.1744 1.536-13.824 13.2096-18.2272L817.152 229.2736c10.4448-3.9936 18.0224 1.3312 20.8896 3.8912 2.8672 2.4576 9.0112 9.3184 6.3488 20.1728z\"\n                        p-id=\"4238\"\n                        fill=\"currentColor\"\n                    />\n                  </svg>\n                </a-button>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\n  import { Ref, watch } from 'vue';\n  import { computed, ref, createVNode, onUnmounted, onMounted, nextTick } from 'vue';\n  import { useScroll } from './js/useScroll';\n  import chatMessage from './chatMessage.vue';\n  import presetQuestion from './presetQuestion.vue';\n  import { DeleteOutlined, ExclamationCircleOutlined } from '@ant-design/icons-vue';\n  import { message, Modal, Tabs } from 'ant-design-vue';\n  import './style/github-markdown.less';\n  import './style/highlight.less';\n  import './style/github-markdown.less';\n  import dayjs from 'dayjs';\n  import { defHttp } from '@/utils/http/axios';\n  import { cloneDeep } from \"lodash-es\";\n  import { calculateFileSize, getFileAccessHttpUrl, getFileIcon, getHeaders, getFileIconColor } from \"@/utils/common/compUtils\";\n  import { createImgPreview } from \"@/components/Preview\";\n  import { useAppInject } from \"@/hooks/web/useAppInject\";\n  import { useGlobSetting } from \"@/hooks/setting\";\n  import { Icon } from '/@/components/Icon';\n\n  message.config({\n    prefixCls: 'ai-chat-message',\n  });\n\n  const props = defineProps(['uuid', 'prologue', 'formState', 'url', 'type','historyData','chatTitle','presetQuestion','quickCommandData','showAdvertising','hasExtraFlowInputs','conversationSettings','sessionType']);\n  const emit = defineEmits(['save','reload-message-title','edit-settings']);\n  const { scrollRef, scrollToBottom } = useScroll();\n  const prompt = ref<string>('');\n  const loading = ref<boolean>(false);\n  const inputRef = ref<Ref | null>(null);\n  const headerTitle = ref<string>(props.chatTitle);\n\n  //聊天数据\n  const chatData = ref<any>([]);\n  //应用数据\n  const appData = ref<any>({});\n  const usingContext = ref<any>(true);\n  const uuid = ref<string>(props.uuid);\n  const topicId = ref<string>('');\n  //请求id\n  const requestId = ref<string>('');\n  const { getIsMobile } = useAppInject();\n  const conversationList = computed(() => chatData.value.filter((item) => item.inversion != 'user' && !!item.conversationOptions));\n  const placeholder = computed(() => {\n    if(getIsMobile.value){\n      return '来说点什么吧...'\n    } else {\n      return '来说点什么吧...（Shift + Enter = 换行）';\n    }\n  });\n  //token\n  const headers = getHeaders();\n  //文本域点击事件\n  const textareaActive = ref<boolean>(false);\n\n  const globSetting = useGlobSetting();\n  const baseUploadUrl = globSetting.uploadUrl;\n  const uploadUrl = ref<string>(`${baseUploadUrl}/airag/chat/upload`);\n  //是否为断线重连\n  const isReConnect = ref<boolean>(false);\n  //是否存在思考过程\n  const isThinking = ref<boolean>(false);\n  //是否开启网络搜索\n  const enableSearch = ref<boolean>(false);\n  //是否显示网络搜索按钮（只有千问模型支持）\n  const showWebSearch = ref<boolean>(false);\n  //模型provider信息\n  const modelProvider = ref<string>('');\n  //是否显示深度思考( 只有deepsee-reason支持 )\n  const showThink = ref<boolean>(false);\n  //是否开启深度思考\n  const enableThink = ref<boolean>(false);\n  //模型名称\n  const modelName = ref<string>('');\n  //是否开启绘画\n  const enableDraw = ref<boolean>(false);\n  //是否显示工具栏\n  const showDraw = ref<boolean>(false);\n  //绘画模型的id\n  const drawModelId = ref<string>('');\n  //其他文件列表\n  const fileUrlList = ref<any>([]);\n  //文件列表（用于显示和管理）\n  const fileList = ref<any>([]);\n\n  // 当前正在调用的工具\n  const currentToolTag = ref<string>('');\n\n  function handleEnter(event: KeyboardEvent) {\n    if (event.key === 'Enter' && !event.shiftKey) {\n      event.preventDefault();\n      handleSubmit();\n    }\n  }\n  function handleSubmit() {\n    let userMessage = prompt.value;\n    if (!userMessage || userMessage.trim() === '') return;\n    prompt.value = '';\n    onConversation(userMessage);\n  }\n  const handleOutQuestion = (userMessage) => {\n    onConversation(userMessage);\n  };\n  async function onConversation(userMessage) {\n    if(!props.type && props.type != 'view'){\n      if(appData.value.type && appData.value.type == 'chatSimple' && !appData.value.modelId) {\n        messageTip(\"请选择AI模型\");\n        return;\n      }\n      if(appData.value.type && appData.value.type == 'chatFLow' && !appData.value.flowId) {\n        messageTip(\"请选择关联流程\");\n        return;\n      }\n      if(!appData.value.name) {\n        messageTip(\"请填写应用名称\");\n        return;\n      }\n    }\n    \n    // 检查是否需要设置额外参数\n    if (props.hasExtraFlowInputs) {\n      // 检查是否已设置\n      if (!props.conversationSettings || Object.keys(props.conversationSettings).length === 0) {\n        // 弹出设置弹窗，阻止发送\n        message.warning('请先设置对话参数');\n        emit('edit-settings');\n        return;\n      }\n    }\n    \n    if (loading.value) return;\n    loading.value = true;\n\n    addChat(uuid.value, {\n      dateTime: new Date().toLocaleString(),\n      content: userMessage,\n      images:uploadUrlList.value?uploadUrlList.value:[],\n      files: fileUrlList.value ? fileUrlList.value : [],\n      inversion: 'user',\n      error: false,\n      conversationOptions: null,\n      requestOptions: { prompt: userMessage, options: null },\n      eventType: 'message',\n    });\n    scrollToBottom();\n\n    let options: any = {};\n    const lastContext = conversationList.value[conversationList.value.length - 1]?.conversationOptions;\n    if (lastContext && usingContext.value) {\n      options = { ...lastContext };\n    }\n\n    addChat(uuid.value, {\n      dateTime: new Date().toLocaleString(),\n      content: '思考中...',\n      loading: true,\n      inversion: 'ai',\n      error: false,\n      conversationOptions: null,\n      requestOptions: { prompt: userMessage, options: { ...options } },\n      referenceKnowledge: [],\n      eventType: 'message',\n    });\n\n    scrollToBottom();\n\n    //发送消息\n    sendMessage(userMessage,options);\n  }\n\n  onUnmounted(() => {\n    updateChatSome(uuid.value, chatData.value.length - 1, { loading: false });\n  });\n\n  const addChat = (uuid, data) => {\n    chatData.value.push({ ...data });\n  };\n  const updateChat = async (uuid, index, data) => {\n    let lastChatData = chatData.value[index];\n    if(lastChatData.showAvatar){\n      data.showAvatar = lastChatData.showAvatar;\n    }\n    chatData.value.splice(index, 1, data);\n    await scrollToBottom();\n  };\n  /**\n   * 顶置开场白\n   * @param txt\n   */\n  const topChat = (txt) => {\n    let data = {\n      content: txt,\n      key: 'prologue',\n      loading: false,\n      dateTime: dayjs().format('YYYY/MM/DD HH:mm:ss'),\n      inversion: 'ai',\n      presetQuestion: props.presetQuestion ? JSON.parse(props.presetQuestion) : \"\",\n    };\n    if (chatData.value && chatData.value.length > 0) {\n      let key = chatData.value[0].key;\n      if (key === 'prologue') {\n        chatData.value[0] = { ...data };\n        return;\n      }\n    }\n    chatData.value.unshift({ ...data });\n  };\n  const updateChatSome = (uuid, index, data) => {\n    chatData.value[index] = { ...chatData.value[index], ...data };\n  };\n  const updateChatFail = (uuid, data) => {\n    const index = chatData.value.length - 1\n    const oldChat = chatData.value[index];\n    updateChat(uuid.value, chatData.value.length - 1, {\n      ...oldChat,\n      // dateTime: new Date().toLocaleString(),\n      // content: data,\n      inversion: 'ai',\n      error: true,\n      errorMsg: data,\n      loading: true,\n      conversationOptions: null,\n      requestOptions: null,\n      eventType: \"message\",\n    });\n    scrollToBottom();\n  };\n\n  /**\n   * 清空会话\n   * @param id\n   */\n  function handleDelSession (){\n    Modal.confirm({\n      title: '清空会话',\n      icon: createVNode(ExclamationCircleOutlined),\n      content: '是否清空会话?',\n      closable: true,\n      okText: '确定',\n      cancelText: '取消',\n      wrapClassName:'ai-chat-modal',\n      async onOk() {\n        try {\n          //update-begin---author:wangshuai---date:2025-12-12---for:【QQYUN-14127】【AI】AI应用门户---\n          let url = '/airag/chat/messages/clear/' + uuid.value;\n          if(props.sessionType){\n            url += \"/\" + props.sessionType;\n          }\n          defHttp.get({\n            url: url,\n          //update-end---author:wangshuai---date:2025-12-12---for:【QQYUN-14127】【AI】AI应用门户---\n          },{ isTransformResponse: false }).then((res) => {\n            if(res.success){\n              chatData.value = [];\n              topicId.value = \"\";\n              if(props.prologue){\n                topChat(props.prologue);\n              }\n            }\n          })\n        } catch {\n          return console.log('Oops errors!');\n        }\n      },\n    });\n  };\n\n  // 停止响应\n  const handleStop = () => {\n    console.log('ai 聊天：：：---停止响应');\n    if (loading.value) {\n      loading.value = false;\n    }\n    updateChatSome(uuid, chatData.value.length - 1, { loading: false });\n  };\n\n  handleStop();\n\n  const knowList = ref<Recordable[]>([])\n\n  /**\n   * 停止消息\n   */\n  function handleStopChat() {\n    //update-begin---author:wangshuai---date:2025-06-03---for:【issues/8338】AI应用聊天回复stop无效，仍会继续输出回复---\n    const currentRequestId = requestId.value\n    if(currentRequestId){\n      try{\n        //调用后端接口停止响应\n        defHttp.get({\n          url: '/airag/chat/stop/' + currentRequestId,\n        },{ isTransformResponse: false });\n      } finally {\n        handleStop();\n        localStorage.removeItem('chat_requestId_' + uuid.value);\n      }\n      //update-end---author:wangshuai---date:2025-06-03---for:【issues/8338】AI应用聊天回复stop无效，仍会继续输出回复---\n    } else {\n      localStorage.removeItem('chat_requestId_' + uuid.value);\n    }\n  }\n\n  /**\n   * 读取文本\n   * @param message\n   * @param options\n   */\n  async function sendMessage(message, options) {\n    let param = {};\n    if (!props.type && props.type != 'view') {\n      param = {\n        content: message,\n        images: uploadUrlList.value?uploadUrlList.value:[],\n        files: fileUrlList.value ? fileUrlList.value : [],\n        topicId: topicId.value,\n        app: appData.value,\n        responseMode: 'streaming',\n        // 添加对话设置参数（调试模式也需要）\n        flowInputs: props.conversationSettings || {},\n        // 添加网络搜索参数\n        enableSearch: enableSearch.value,\n        // 添加深度思考参数\n        enableThink: enableThink.value,\n        // 添加绘画参数\n        enableDraw: enableDraw.value,\n        drawModelId: enableDraw.value ? drawModelId.value : '',\n        // 添加消息类型 portal 门户\n        sessionType: props.sessionType || ''\n      };\n    }else{\n      param = {\n        content: message,\n        topicId: usingContext.value?topicId.value:'',\n        images: uploadUrlList.value?uploadUrlList.value:[],\n        files: fileUrlList.value ? fileUrlList.value : [],\n        appId: appData.value.id,\n        responseMode: 'streaming',\n        conversationId: uuid.value === \"1002\"?'':uuid.value,\n        // 添加对话设置参数\n        flowInputs: props.conversationSettings || {},\n        // 添加网络搜索参数\n        enableSearch: enableSearch.value,\n        // 添加深度思考参数\n        enableThink: enableThink.value,\n        // 添加绘画参数\n        enableDraw: enableDraw.value,\n        drawModelId: enableDraw.value ? drawModelId.value : '',\n        // 添加消息类型 portal 门户\n        sessionType: props.sessionType || ''\n      };\n\n      if(headerTitle.value == '新建聊天'){\n        headerTitle.value = message.length>10?truncateString(message,10):message\n      }\n\n      emit(\"reload-message-title\",message.length>10?truncateString(message,10):message)\n    }\n\n    uploadUrlList.value = [];\n    fileInfoList.value = [];\n    fileUrlList.value = [];\n    fileList.value = [];\n    knowList.value = [];\n    options.message = message;\n    const readableStream = await defHttp.post(\n      {\n        url: props.url,\n        params: param,\n        adapter: 'fetch',\n        responseType: 'stream',\n        timeout: 5 * 60 * 1000,\n      },\n      {\n        isTransformResponse: false,\n      }\n    ).catch((e)=>{\n      //update-begin---author:wangshuai---date:2025-04-28---for:【QQYUN-12297】【AI】聊天，超时以后提示---\n      if(e.code === 'ETIMEDOUT'){\n        updateChatFail(uuid, \"当前用户较多，排队中，请稍候再次重试！\");\n        handleStop();\n        return;\n      }else{\n        updateChatFail(uuid, \"服务器错误，请稍后重试！\");\n        handleStop();\n        return;\n      }\n      console.error(e)\n      //update-end---author:wangshuai---date:2025-04-28---for:【QQYUN-12297】【AI】聊天，超时以后提示---\n    });\n    await renderChatByResult(readableStream,options);\n  }\n  // 是否使用上下文\n  const handleUsingContext = () => {\n    usingContext.value = !usingContext.value;\n    if (usingContext.value) {\n      message.success(\"当前模式下, 发送消息会携带之前的聊天记录\");\n    } else {\n      message.warning(\"当前模式下, 发送消息不会携带之前的聊天记录\");\n    }\n  };\n\n  /**\n   * 提示\n   * @param value\n   */\n  function messageTip(value) {\n    message.warning(value);\n  }\n\n  /**\n   * 渲染文本\n   * @param item\n   * @param conversationId\n   * @param text\n   * @param options\n   */\n  async function renderText(item,conversationId,text,options) {\n    let returnText = \"\";\n    if (item.event == 'MESSAGE' || item.event == 'THINKING' || item.event == 'THINKING_END') {\n      let message = item.data?.message ?? \"\";\n      let messageText = \"\";\n      //update-begin---author:wangshuai---date:2025-04-24---for:应该先判断是否包含card---\n      if(message && message.indexOf(\"::card::\") !== -1){\n        messageText = message;\n      } else if(message && message.indexOf(\"::cardConfig::\") !== -1) {\n        messageText = message;\n      } else {\n        text = text + message;\n        messageText = text;\n        returnText = text;\n      }\n      //update-end---author:wangshuai---date:2025-04-24---for:应该先判断是否包含card---\n      // 从消息中获取 requestId\n      if (item.requestId) {\n        requestId.value = item.requestId;\n      }\n      if(item.event == 'THINKING'){\n        isThinking.value = true;\n      }\n      if(item.event == 'MESSAGE' && isThinking.value){\n        text = item.data.message;\n        returnText = item.data.message;\n        //发送用户消息\n        addChat(uuid.value, {\n          dateTime: new Date().toLocaleString(),\n          content: item.data.message,\n          images:uploadUrlList.value?uploadUrlList.value:[],\n          files: fileUrlList.value ? fileUrlList.value : [],\n          inversion: 'ai',\n          error: false,\n          conversationOptions: null,\n          requestOptions: { prompt: message, options: null },\n          eventType: 'message',\n          showAvatar: 'no'\n        });\n        isThinking.value = false;\n        return { returnText, conversationId };\n      }\n      //更新聊天信息\n      updateChat(uuid.value, chatData.value.length - 1, {\n        dateTime: new Date().toLocaleString(),\n        content: messageText,\n        inversion: 'ai',\n        error: false,\n        loading: item.event == 'THINKING_END' ? false: true,\n        conversationOptions: { conversationId: conversationId, parentMessageId: topicId.value },\n        requestOptions: { prompt: message, options: { ...options } },\n        referenceKnowledge: knowList.value,\n        eventType: item.event.toLowerCase(),\n      });\n    }\n    if(item.event == 'INIT_REQUEST_ID'){\n      if (item.requestId && props.url != \"/airag/app/debug\") {\n        requestId.value = item.requestId;\n        localStorage.setItem('chat_requestId_' + uuid.value, JSON.stringify({ requestId: item.requestId, message: options.message }));\n      }\n    }\n    if (item.event == 'MESSAGE_END') {\n      topicId.value = item.topicId;\n      conversationId = item.conversationId;\n      uuid.value = item.conversationId;\n      localStorage.removeItem('chat_requestId_' + uuid.value);\n      handleStop();\n    }\n    if (item.event == 'FLOW_FINISHED') {\n      //update-begin---author:wangshuai---date:2025-03-07---for:【QQYUN-11457】聊天调用流程，执行失败了但是没提示---\n      if(item.data && !item.data.success){\n        updateChatFail(uuid, item.data.message?item.data.message:'请求出错，请稍后重试！');\n        localStorage.removeItem('chat_requestId_' + uuid.value);\n        handleStop();\n        return \"\";\n      }\n      //update-end---author:wangshuai---date:2025-03-07---for:【QQYUN-11457】聊天调用流程，执行失败了但是没提示---\n      topicId.value = item.topicId;\n      conversationId = item.conversationId;\n      uuid.value = item.conversationId;\n      requestId.value = item.requestId;\n      localStorage.removeItem('chat_requestId_' + uuid.value);\n      handleStop();\n    }\n    if (item.event == 'ERROR') {\n      updateChatFail(uuid, item.data.message?item.data.message:'请求出错，请稍后重试！');\n      localStorage.removeItem('chat_requestId_' + uuid.value);\n      handleStop();\n      return \"\";\n    }\n\n    // 工具调用开始\n    if (item.event == 'TOOL_EXEC_BEFORE') {\n      currentToolTag.value = item.data?.message ?? '';\n    }\n\n    // 工具调用结束\n    if (item.event == 'TOOL_EXEC_DONE') {\n      currentToolTag.value = '';\n    }\n\n    //update-begin---author:wangshuai---date:2025-03-21---for:【QQYUN-11495】【AI】实时展示当前思考进度---\n    if(item.event === \"NODE_STARTED\"){\n      if(!item.data || item.data.type !== 'end'){\n        let aiText = \"\";\n        if(item.data.type === 'llm' || item.data.type === 'reply'){\n          aiText = \"正在构建响应内容\";\n        }\n        if(item.data.type === 'knowledge'){\n          aiText = \"正在对知识库进行深度检索\";\n        }\n        if(item.data.type === 'classifier'){\n          aiText = \"正在分类\";\n        }\n        if(item.data.type === 'code'){\n          aiText = \"正在实施代码运行操作\";\n        }\n        if(item.data.type === 'subflow'){\n          aiText = \"正在运行子流程\";\n        }\n        if(item.data.type === 'enhanceJava'){\n          aiText = \"正在执行java增强\";\n        }\n        if(item.data.type === 'http'){\n          aiText = \"正在发送http请求\";\n        }\n        if(!text){\n          //更新聊天信息\n          updateChat(uuid.value, chatData.value.length - 1, {\n            dateTime: new Date().toLocaleString(),\n            retrievalText: aiText,\n            text:\"\",\n            inversion: 'ai',\n            error: false,\n            loading: true,\n            conversationOptions: null,\n            requestOptions: { prompt: message, options: { ...options } },\n            referenceKnowledge: knowList.value,\n            eventType: 'message',\n          });\n        }\n      }\n    }\n    //update-end---author:wangshuai---date:2025-03-21---for:【QQYUN-11495】【AI】实时展示当前思考进度---\n    else if (item.event === 'NODE_FINISHED') {\n      if(!item.data || item.data.type !== 'end'){\n        if(item.data.type === 'knowledge'){\n          const id = item.data.id;\n          const data = item.data.outputs[id + \".documents\"]\n          knowList.value = data\n          //更新聊天信息\n          updateChatSome(uuid.value, chatData.value.length - 1, {referenceKnowledge: knowList.value})\n        }\n      }\n    }\n    if(!returnText && item.event !== 'NODE_FINISHED'){\n      returnText = text;\n    }\n    return { returnText, conversationId };\n  }\n\n  //上传文件列表集合\n  const uploadUrlList = ref<any>([]);\n  //文件集合\n  const fileInfoList = ref<any>([]);\n\n  /**\n   * 文件上传回调事件\n   * @param info\n   */\n  function handleChange(info) {\n    let { fileList, file } = info;\n    fileInfoList.value = fileList;\n    if (file.status === 'error' || (file.response && file.response.code == 500)) {\n      message.error(file.response?.message || `${file.name} 上传失败,请查看服务端日志`);\n      return;\n    }\n    if (file.status === 'done') {\n      uploadUrlList.value.push(file.response.message);\n    }\n  }\n\n  /**\n   * 获取图片地址\n   *\n   * @param url\n   */\n  function getImage(url) {\n    return getFileAccessHttpUrl(url);\n  }\n\n  /**\n   * 上传前事件\n   */\n  function beforeUpload(file) {\n    var fileType = file.type;\n    if (fileType === 'image') {\n      if (fileType.indexOf('image') < 0) {\n        message.warning('请上传图片');\n        return false;\n      }\n    }\n    if(uploadUrlList.value && uploadUrlList.value.length > 2){\n      message.warning(\"最多只能上传三张！\");\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * 删除图片\n   */\n  function deleteImage(index) {\n    uploadUrlList.value.splice(index,1);\n    fileInfoList.value.splice(index,1);\n  }\n\n  /**\n   * 图片预览\n   * @param url\n   */\n  function handlePreview(url){\n    const onImgLoad = ({ index, url, dom }) => {\n      console.log(`第${index + 1}张图片已加载，URL为：${url}`, dom);\n    };\n    let imageList = [getImage(url)];\n    createImgPreview({ imageList: imageList, defaultWidth: 700, rememberState: true, onImgLoad });\n  }\n\n  /**\n   * 截取字符串\n   * @param str\n   * @param maxLength\n   */\n  function truncateString(str, maxLength) {\n    if (str.length <= maxLength){\n      return str;\n    }\n    let chineseCount = 0;\n    let englishCount = 0;\n    let digitCount = 0;\n    let result = '';\n    for (let i = 0; i < str.length; i++) {\n      const char = str[i];\n      if (/[\\u4e00-\\u9fa5]/.test(char)) { // 判断是否为汉字\n        chineseCount++;\n      } else if (/[a-zA-Z]/.test(char)) { // 判断是否为英文字母\n        englishCount++;\n      } else if (/\\d/.test(char)) { // 判断是否为数字\n        digitCount++;\n      }\n      if (chineseCount + englishCount / 2 + digitCount / 2 > maxLength) {\n        break;\n      }\n      result += char;\n    }\n\n    return result;\n  }\n\n  /**\n   * 粘贴事件\n   * @param event\n   */\n  function paste(event) {\n    if(uploadUrlList.value && uploadUrlList.value.length > 2){\n      message.warning(\"最多只能上传三张！\");\n      return;\n    }\n    const items = (event.clipboardData || window.clipboardData).items;\n    if (!items || items.length === 0){\n      //说明浏览器不支持复制图片\n      message.error('当前浏览器不支持本地打开图片！');\n      return;\n    }\n    let image = null;\n    for (let i = 0; i < items.length; i++) {\n      if (items[i].type.indexOf('image') !== -1) {\n        image = items[i].getAsFile();\n        handleUploadImage(image);\n        break;\n      }\n    }\n  }\n\n  /**\n   * 粘贴图片\n   * @param image\n   */\n  async function handleUploadImage(image) {\n    const isReturn = (fileInfo) => {\n      try {\n        if (fileInfo.code === 0) {\n          let { message } = fileInfo;\n          uploadUrlList.value.push(message);\n          fileInfoList.value.push(image);\n        } else if (fileInfo.code === 500 || fileInfo.code === 510) {\n          message.error(fileInfo.message || `${image.name} 导入失败`);\n        }\n      } catch (error) {\n        console.log('导入的数据异常', error);\n        message.error(`${image.name} 导入失败`);\n      }\n    };\n    await defHttp.uploadFile({ url: \"/airag/chat/upload\" }, { file: image }, { success: isReturn });\n  }\n\n  /**\n   * 渲染返回来的结果\n   * @param readableStream\n   * @param options\n   */\n  async function renderChatByResult(readableStream, options) {\n    const reader = readableStream.getReader();\n    const decoder = new TextDecoder('UTF-8');\n    let conversationId = '';\n    let buffer = '';\n    let text = ''; // 按 SSE 协议分割消息\n    while (true) {\n      const { done, value } = await reader.read();\n      if (done) {\n        break;\n      }\n      //update-begin---author:wangshuai---date:2025-03-12---for:【QQYUN-11555】聊天时要流式显示消息---\n      let result = decoder.decode(value, { stream: true });\n      result = buffer + result;\n      const lines = result.split('\\n\\n');\n      for (let line of lines) {\n        if (line.startsWith('data:')) {\n          let content = line.replace('data:', '').trim();\n          if(!content){\n            continue;\n          }\n          if(!content.endsWith('}')){\n            buffer = buffer + content;\n            continue;\n          }\n          buffer = \"\";\n          try {\n            //update-begin---author:wangshuai---date:2025-03-13---for:【QQYUN-11572】发布到线上不能实时动态，内容不能加载出来，得刷新才能看到全部回答---\n            if(content.indexOf(\":::card:::\") !== -1){\n              content = content.replace(/\\s+/g, '');\n            }\n            let parse = JSON.parse(content);\n            await renderText(parse,conversationId,text,options).then((res)=>{\n              text = res.returnText;\n              conversationId = res.conversationId;\n            });\n            //update-end---author:wangshuai---date:2025-03-13---for:【QQYUN-11572】发布到线上不能实时动态，内容不能加载出来，得刷新才能看到全部回答---\n          } catch (error) {\n            console.log('Error parsing update:', error);\n          }\n          //update-end---author:wangshuai---date:2025-03-12---for:【QQYUN-11555】聊天时要流式显示消息---\n        }else{\n          if(!line){\n            continue;\n          }\n          if(!line.endsWith('}')){\n            buffer = buffer + line;\n            continue;\n          }\n          buffer = \"\";\n          //update-begin---author:wangshuai---date:2025-03-13---for:【QQYUN-11572】发布到线上不能实时动态，内容不能加载出来，得刷新才能看到全部回答---\n          try {\n            if(line.indexOf(\":::card:::\") !== -1){\n              line = line.replace(/\\s+/g, '');\n            }\n            let parse = JSON.parse(line);\n            await renderText(parse, conversationId, text, options).then((res) => {\n              text = res.returnText;\n              conversationId = res.conversationId;\n            });\n          } catch (error) {\n            console.log('Error parsing update:', error);\n          }\n          //update-end---author:wangshuai---date:2025-03-13---for:【QQYUN-11572】发布到线上不能实时动态，内容不能加载出来，得刷新才能看到全部回答---\n        }\n      }\n    }\n    //update-begin---author:wangshuai---date:2025-11-05---for: 如果是断线重连并且文本为空，需要移出前面两条会话---\n    if(!text && isReConnect && chatData.value.length >1){\n      //如果是断线重连的情况下，流结果为空时，移除占位的AI消息，避免空结果也新增聊天记录\n      const lastMsg = chatData.value[chatData.value.length - 1];\n      if (lastMsg && lastMsg.inversion === 'ai' && lastMsg.content === '请稍后') {\n        chatData.value.splice(chatData.value.length - 1, 1);\n        chatData.value.splice(chatData.value.length - 1, 1);\n      }\n    //update-end---author:wangshuai---date:2025-11-05---for: 如果是断线重连并且文本为空，需要移出前面两条会话---\n      localStorage.removeItem('chat_requestId_' + uuid.value);\n      loading.value = false;\n    }\n  }\n\n  /**\n   * ai重连\n   */\n  async function aiReConnection() {\n    //查询requestId\n    let chat = localStorage.getItem(\"chat_requestId_\" + uuid.value);\n    if(chat) {\n      let array = JSON.parse(chat);\n      let message = array.message;\n      let requestId = array.requestId;\n      const result = await defHttp.get({ url: '/airag/chat/receive/' + requestId ,\n        adapter: 'fetch',\n        responseType: 'stream',\n        timeout: 5 * 60 * 1000\n      }, { isTransformResponse: false }).catch(async (err)=>{\n        loading.value = false;\n        localStorage.removeItem('chat_requestId_' + uuid.value);\n      });\n      if(result && message){\n        loading.value = true;\n        isReConnect.value = true;\n        //发送用户消息\n        addChat(uuid.value, {\n          dateTime: new Date().toLocaleString(),\n          content: message,\n          images:uploadUrlList.value?uploadUrlList.value:[],\n          inversion: 'user',\n          error: false,\n          conversationOptions: null,\n          requestOptions: { prompt: message, options: null },\n          eventType: 'message',\n        });\n        let options: any = {};\n        const lastContext = conversationList.value[conversationList.value.length - 1]?.conversationOptions;\n        if (lastContext && usingContext.value) {\n          options = { ...lastContext };\n        }\n        //添加ai消息\n        addChat(uuid.value, {\n          dateTime: new Date().toLocaleString(),\n          content: '请稍后',\n          loading: false,\n          inversion: 'ai',\n          error: false,\n          conversationOptions: null,\n          requestOptions: { prompt: message, options: { ...options } },\n          referenceKnowledge: [],\n          eventType: 'message',\n        });\n        options.message = message;\n        scrollToBottom();\n        //流式输出\n        await renderChatByResult(result,options);\n      } else {\n        loading.value = false;\n        localStorage.removeItem('chat_requestId_' + uuid.value);\n        isReConnect.value = false;\n      }\n    } else {\n      isReConnect.value = false;\n    }\n  }\n\n  //监听开场白\n  watch(\n    () => props.prologue,\n    (val) => {\n      try {\n        if (val) {\n          topChat(val);\n        }\n      } catch (e) {}\n    }\n  );\n\n  //监听开场白预制问题\n  watch(\n    () => props.presetQuestion,\n    (val) => {\n      topChat(props.prologue);\n    }\n  );\n\n  //监听应用信息\n  watch(\n    () => props.formState,\n    (val) => {\n      try {\n        if (val) {\n          appData.value = val;\n          // 检查模型是否支持网络搜索\n          checkModelProvider();\n        }\n      } catch (e) {}\n    },\n    { deep: true, immediate: true }\n  );\n\n  // 编辑对话设置\n  function handleEditSettings() {\n    emit('edit-settings');\n  }\n\n  // 切换网络搜索\n  function toggleWebSearch() {\n    enableSearch.value = !enableSearch.value;\n    if (enableSearch.value) {\n      message.success(\"已开启联网搜索\");\n    } else {\n      message.info(\"已关闭联网搜索\");\n    }\n  }\n\n  /**\n   * 切换网络思考\n   */\n  function toggleThink() {\n    enableThink.value = !enableThink.value;\n    if (enableThink.value) {\n      message.success(\"已开启深度思考\");\n    } else {\n      message.info(\"已关闭深度思考\");\n    }\n  }\n\n  // 检查模型是否支持网络搜索（从appData.metadata.modelInfo中获取）\n  function checkModelProvider() {\n    if (appData.value && appData.value.metadata) {\n      try {\n        const metadata = typeof appData.value.metadata === 'string' \n          ? JSON.parse(appData.value.metadata) \n          : appData.value.metadata;\n\n        //是否显示绘图工具\n        showDraw.value = metadata.izDraw === '1';\n        //是否选中生成图片\n        enableDraw.value = metadata.izDraw === '1';\n        drawModelId.value = metadata.drawModelId;\n\n        if (metadata && metadata.modelInfo) {\n          modelProvider.value = metadata.modelInfo.provider || '';\n          modelName.value = metadata.modelInfo.modelName || '';\n          // 只有千问模型支持网络搜索\n          showWebSearch.value = modelProvider.value === 'QWEN';\n          showThink.value = modelName.value === 'deepseek-reasoner';\n        } else {\n          showWebSearch.value = false;\n          showThink.value = false;\n        }\n      } catch (e) {\n        console.error('解析模型信息失败', e);\n        showWebSearch.value = false;\n        showThink.value = false;\n      }\n    } else {\n      showWebSearch.value = false;\n      showThink.value = false;\n      showDraw.value = false;\n    }\n  }\n\n  /**\n   * 生成图片\n   */\n  function handleGenerateImage() {\n    enableDraw.value = !enableDraw.value;\n    if (enableDraw.value) {\n      message.success(\"已开启生成图片\");\n    } else {\n      message.info(\"已关闭生成图片\");\n    }\n  }\n\n  //================================================== begin 【QQYUN-14261】AI助手，支持多模态能力- 文档 ====================================\n  /**\n   * 通用文件上传前校验\n   * \n   * @param file\n   */\n  function beforeUploadFile(file) {\n    const fileName = file.name;\n    const fileType = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();\n    const allowFileTypes = ['txt', 'pdf', 'docx', 'doc', 'pptx', 'ppt', 'xlsx', 'xls', 'md'];\n    if (allowFileTypes.indexOf(fileType) === -1) {\n      message.warning('不支持该文件类型上传，请上传 txt, pdf, docx, doc, pptx, ppt, xlsx, xls, md 格式文件');\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * 文件上传（非图片）\n   * @param info\n   */\n  function handleChangeFile(info) {\n    let { file, fileList: newFileList } = info;\n    fileList.value = newFileList;\n    if (file.status === 'error' || (file.response && file.response.code == 500)) {\n      message.error(file.response?.message || `${file.name} 上传失败,请查看服务端日志`);\n      return;\n    }\n    fileUrlList.value = fileList.value\n        .filter(item => item.status === 'done' && item.response)\n        .map(item => item.response.message);\n  }\n\n  /**\n   * 删除文件\n   */\n  function deleteFile(index) {\n    fileList.value.splice(index, 1);\n    fileUrlList.value = fileList.value\n        .filter(item => item.status === 'done' && item.response)\n        .map(item => item.response.message);\n  }\n  \n  //================================================== end 【QQYUN-14261】AI助手，支持多模态能力- 文档 ====================================\n  \n  //监听历史信息\n  watch(\n    () => props.historyData,\n    (val) => {\n      try {\n        //update-begin---author:wangshuai---date:2025-03-06---for:【QQYUN-11384】浏览器打开应用开场白丢了---\n        if (val && val.length > 0) {\n          chatData.value = cloneDeep(val);\n          if(chatData.value[0]){\n            topicId.value = chatData.value[0].topicId\n          }\n        }else{\n          chatData.value = [];\n          headerTitle.value = props.chatTitle;\n        }\n        //update-begin---author:wangshuai---date:2025-11-18---for:【QQYUN-14049】【AI】没有开场白，就不展示预设问题了---\n        if((props.prologue || props.presetQuestion) && props.chatTitle){\n        //update-end---author:wangshuai---date:2025-11-18---for:【QQYUN-14049】【AI】没有开场白，就不展示预设问题了---\n          topChat(props.prologue)\n        }\n        //ai回复重连\n        aiReConnection();\n      } catch (e) {\n        console.log(e)\n      }\n      //update-end---author:wangshuai---date:2025-03-06---for:【QQYUN-11384】浏览器打开应用开场白丢了---\n    },\n    { deep: true, immediate: true }\n  );\n\n  onMounted(() => {\n    scrollToBottom();\n    uploadUrlList.value = [];\n    fileInfoList.value = [];\n    fileUrlList.value = [];\n    fileList.value = [];\n    // 检查模型是否支持网络搜索\n    checkModelProvider();\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .chatWrap {\n    width: 100%;\n    height: 100%;\n    padding: 20px;\n    .content {\n      height: 100%;\n      width: 100%;\n      background: #fff;\n      display: flex;\n      flex-direction: column;\n    }\n  }\n  .main {\n    flex: 1;\n    min-height: 0;\n    .scrollArea {\n      overflow-y: auto;\n      height: 100%;\n    }\n    .chatContentArea {\n      padding: 10px;\n    }\n  }\n  .emptyArea {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    color: #d4d4d4;\n  }\n  .stopArea {\n    display: flex;\n    justify-content: center;\n    padding: 10px 0;\n  }\n  .footer {\n    display: flex;\n    flex-direction: column;\n    padding: 6px 16px;\n    .topArea {\n      padding-left: 6%;\n      margin-bottom: 6px;\n    }\n    .bottomArea {\n      display: flex;\n      align-items: center;\n\n      .ant-input {\n        margin: 0 8px;\n      }\n      .ant-input,\n      .ant-btn {\n        height: 36px;\n      }\n      textarea.ant-input {\n        padding-top: 6px;\n        padding-bottom: 6px;\n      }\n      .contextBtn,\n      .delBtn {\n        padding: 0;\n        width: 40px;\n        border-radius: 50%;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n      }\n      .delBtn {\n        margin-right: 8px;\n      }\n      .contextBtn {\n        color: #a8071a;\n        &.enabled {\n          color: @primary-color;\n        }\n        font-size: 18px;\n      }\n      .sendBtn {\n        font-size: 14px;\n        width: 100%;\n        display: flex;\n        padding: 4px 6px;\n        align-items: center;\n        &.enabled {\n          color: #0a66ff !important;\n        }\n      }\n      .webSearchBtn {\n        border-radius: 8px;\n        padding: 4px 8px;\n        height: 30px;\n        background-color: transparent;\n        border: 1px solid transparent;\n        color: #3d4353;\n        transition: all .2s ease;\n        :deep(.anticon){\n          margin-right: 6px;\n          color: #3d4353;\n        }\n        &:hover{\n          border-color: #d2d7e5;\n          background-color: #f7f9fc;\n        }\n        &.enabled {\n          background-color: rgba(10,102,255,0.08);\n          border-color: #0a66ff;\n          color: #0a66ff;\n          box-shadow: none;\n          font-weight: 500;\n          :deep(.anticon) {\n            color: #0a66ff !important;\n          }\n        }\n      }\n      .stopBtn {\n        width: 32px;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        padding: 8px;\n      }\n    }\n  }\n  :deep(.chatgpt .markdown-body) {\n    background-color: #f4f6f8;\n  }\n  :deep(.ant-message) {\n    top: 50% !important;\n  }\n  .header-title{\n    color: #101828;\n    font-size: 16px;\n    font-weight: 400;\n    padding-bottom: 8px;\n    margin-left: 20px;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    height: 30px;\n    \n    .title-content{\n      display: flex;\n      align-items: center;\n      gap: 4px;\n      overflow: hidden;\n      \n      > span{\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n      }\n    }\n    \n    .header-actions{\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      flex-shrink: 0;\n    }\n    \n    .edit-btn{\n      padding: 2px 4px;\n      color: #999;\n      flex-shrink: 0;\n      height: 24px;\n      \n      &:hover{\n        color: @primary-color;\n      }\n      \n      :deep(.anticon){\n        font-size: 16px;\n      }\n    }\n    \n    .header-advertisint{\n      display:flex;\n      margin-right: 20px;\n      font-size: 12px;\n    }\n  }\n  .chat-textarea{\n    display: flex;\n    align-items: center;\n    width: 100%;\n    border-radius: 15px;\n    border-style: solid;\n    border-width: 1px;\n    flex-direction: column;\n    transition: width 0.3s;\n    border-color: #d2d7e5;\n    .textarea-top{\n      border-bottom: 1px solid #f0f0f5;\n      padding: 12px 28px;\n      width: 100%;\n      display: flex;\n      flex-wrap: wrap;\n      gap: 10px;\n      .top-image{\n        display: flex;\n        img{\n          border-radius: 8px;\n          cursor: pointer;\n          height: 60px;\n          position: relative;\n          width: 60px;\n        }\n      }\n      /*begin 文件的样式*/\n      .file-card {\n        display: flex;\n        align-items: center;\n        background: #f4f6f8;\n        border-radius: 8px;\n        padding: 8px 12px;\n        width: 200px;\n        position: relative;\n        \n        .file-card-icon {\n          width: 32px;\n          height: 32px;\n          display: flex;\n          align-items: center;\n          justify-content: center;\n          margin-right: 8px;\n          .file-thumb {\n            width: 32px;\n            height: 32px;\n            border-radius: 4px;\n            object-fit: cover;\n          }\n        }\n        \n        .file-card-info {\n          flex: 1;\n          overflow: hidden;\n          .file-name {\n            font-size: 14px;\n            color: #333;\n            overflow: hidden;\n            text-overflow: ellipsis;\n            white-space: nowrap;\n          }\n          .file-size {\n            font-size: 12px;\n            color: #999;\n          }\n        }\n        \n        .file-card-close {\n          position: absolute;\n          top: -6px;\n          right: -6px;\n          width: 16px;\n          height: 16px;\n          background: #ccc;\n          border-radius: 50%;\n          display: flex;\n          align-items: center;\n          justify-content: center;\n          cursor: pointer;\n          color: #fff;\n          font-size: 10px;\n          opacity: 0;\n          transition: opacity 0.2s;\n          \n          &:hover {\n            background: #ff4d4f;\n          }\n        }\n        \n        &:hover .file-card-close {\n          opacity: 1;\n        }\n        /*end 文件的样式*/\n      }\n    }\n    .textarea-bottom{\n      display: flex;\n      flex-direction: column;\n      flex: 1 1;\n      min-height: 48px;\n      position: relative;\n      padding: 2px 10px;\n      width: 100%;\n      /*begin 底部样式*/\n      .textarea-action-bar {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        width: 100%;\n        margin-top: 8px;\n\n        .left-actions {\n          display: flex;\n          align-items: center;\n          gap: 4px;\n        }\n        .right-actions {\n          display: flex;\n          align-items: center;\n          gap: 4px;\n        }\n        .sendBtn {\n          width: auto;\n          padding: 4px 6px;\n          height: 30px;\n        }\n      }\n      /*end 底部样式*/\n    }\n  }\n  .chat-textarea:hover{\n    border-color: #9dc1fb;\n  }\n  .textarea-active{\n    border-color: #98bdfa !important;\n  }\n  :deep(.ant-divider-vertical){\n    margin: 0 2px;\n  }\n  .upload-icon{\n    cursor: pointer;\n    position: absolute;\n    background-color: #1D1C23;\n    color: white;\n    border-radius: 50%;\n    padding: 4px;\n    display: none;\n    align-items: center;\n    justify-content: center;\n    box-shadow: 0 2px 4px #e6e6e6;\n    margin-left: 44px;\n    margin-top: -4px;\n  }\n  .top-image:hover{\n    .upload-icon{\n      display: flex;\n    }\n  }\n  \n  @media (max-width: 600px) {\n    //手机下的样式 平板不需要调整\n    .footer{\n      padding: 0;\n      .bottomArea{\n        .delBtn{\n          margin-right: 0;\n        }\n      }\n    }\n    .chatWrap{\n      padding: 10px 10px 10px 0;\n    }\n    .main .chatContentArea{\n      padding: 10px 0 0 10px;\n    }\n  }\n</style>\n<style lang=\"less\">\n .ai-chat-modal{\n   z-index: 9999 !important;\n }\n .ai-chat-message{\n   z-index: 9999 !important;\n }\n\n .chat-upload-dropdown .ant-dropdown-menu{\n   border-radius: 10px;\n   padding: 6px 4px;\n }\n .chat-upload-dropdown .ant-dropdown-menu-item:hover{\n   background-color: #f0f6ff;\n }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/chatMessage.vue",
    "content": "<template>\n  <div class=\"chat\" :class=\"[inversion === 'user' ? 'self' : 'chatgpt']\" v-if=\"getText || (props.presetQuestion && props.presetQuestion.length>0)\">\n    <div class=\"avatar\" v-if=\"showAvatar !== 'no'\">\n      <img v-if=\"inversion === 'user'\" :src=\"avatar()\" />\n      <img v-else :src=\"getAiImg()\" />\n    </div>\n    <div class=\"content\">\n      <p class=\"date\" v-if=\"showAvatar !== 'no'\">\n        <span v-if=\"inversion === 'ai'\" style=\"margin-right: 10px\">{{appData.name || 'AI助手'}}</span>\n        <span>{{ dateTime }}</span>\n      </p>\n      <div v-if=\"inversion === 'user' && images && images.length>0\" class=\"images\">\n          <div v-for=\"(item,index) in images\" :key=\"index\" class=\"image\" @click=\"handlePreview(item)\">\n            <img :src=\"getImageUrl(item)\"/>\n          </div>\n      </div>     \n      <div v-if=\"inversion === 'user' && files && files.length>0\" class=\"file-list\">\n          <div v-for=\"(item,index) in files\" :key=\"index\" class=\"file-item\" @click=\"handleFilePreview(item?.filePath || item)\">\n            <div class=\"file-icon\">\n              <Icon :icon=\"getFileIcon(item?.filePath || item)\" :color=\"getFileIconColor(item?.filePath || item)\" size=\"24\" />\n            </div>\n            <div class=\"file-name\" :title=\"item.name\">{{ getFileName(item?.filePath || item)}}</div>\n          </div>\n      </div>\n      <div v-if=\"inversion === 'ai' && retrievalText && loading\" class=\"retrieval\">\n        {{retrievalText}}\n      </div>\n      <div v-if=\"inversion === 'ai' && isCard\" class=\"card\">\n        <a-row>\n          <a-col :xl=\"6\" :lg=\"8\" :md=\"10\" :sm=\"24\" style=\"flex:1\" v-for=\"item in getCardList()\">\n            <a-card class=\"ai-card\" @click=\"aiCardHandleClick(item.linkUrl)\">\n               <div class=\"ai-card-title\">{{item.productName}}</div>\n               <div class=\"ai-card-img\">\n                 <img :src=\"item.productImage\">\n               </div>\n               <span class=\"ai-card-desc\">{{item.descr}}</span>\n            </a-card>\n          </a-col>\n        </a-row>\n      </div>\n      <div v-if=\"inversion === 'ai' && isCardConfig\" class=\"card\">\n        <a-row>\n          <a-col :xl=\"6\" :lg=\"8\" :md=\"10\" :sm=\"24\" style=\"flex:1;margin-right: 10px;\" v-for=\"item in getCardConfigList()\">\n            <CardTemplate :template-id=\"cardConfig?.templateId\" :card-data=\"item\" :card-config=\"cardConfig\" @click=\"handleJumpClick(item)\"></CardTemplate>\n          </a-col>\n        </a-row>\n      </div>\n      <div class=\"thinkArea\" style=\"margin-bottom: 10px\" v-if=\"!isCard && !isCardConfig && (eventType === 'thinking' || eventType === 'thinking_end')\">\n        <a-collapse v-model:activeKey=\"activeKey\" ghost>\n          <a-collapse-panel :key=\"uuid\" :header=\"loading?'正在思考中':'思考结束'\">\n            <ThinkText :text=\"text\" :inversion=\"inversion\" :error=\"error\" :loading=\"loading\"></ThinkText>\n          </a-collapse-panel>\n        </a-collapse>\n      </div>\n      <div class=\"msgArea\" v-else-if=\"!isCard && !isCardConfig\" :class=\"showAvatar == 'no' ? 'hidden-avatar' : ''\">\n        <chatText :text=\"text\" :inversion=\"inversion\" :error=\"error\" :errorMsg=\"errorMsg\" :currentToolTag=\"currentToolTag\" :loading=\"loading\" :referenceKnowledge=\"referenceKnowledge\" :isLast=\"isLast\"></chatText>\n      </div>\n      <div v-if=\"presetQuestion\" v-for=\"item in presetQuestion\" class=\"question\" @click=\"presetQuestionClick(item.descr)\">\n        <span>{{item.descr}}</span>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\n  import chatText from './chatText.vue';\n  import ThinkText from './ThinkText.vue';\n  import defaultAvatar from \"@/assets/images/ai/avatar.jpg\";\n  import { useUserStore } from '/@/store/modules/user';\n  import defaultImg from '../img/ailogo.png';\n  import { ref } from 'vue';\n  import { buildUUID } from '/@/utils/uuid';\n  import { getFileAccessHttpUrl, getFileIcon, getFileIconColor } from '/@/utils/common/compUtils';\n  import { createImgPreview } from \"@/components/Preview\";\n  import { computed } from \"vue\";\n  import CardTemplate from '/@/views/super/airag/aiapp/chat/components/CardTemplate.vue';\n  import { useGlobSetting } from \"@/hooks/setting\";\n  import {encryptByBase64} from \"@/utils/cipher\";\n\n  const { domainUrl, viewUrl } = useGlobSetting();\n  const props = defineProps(['dateTime', 'text', 'inversion', 'error', 'loading','errorMsg', 'currentToolTag', 'appData','presetQuestion','images','retrievalText', 'referenceKnowledge', 'eventType', 'showAvatar',\"files\", 'isLast']);\n\n  const uuid = ref<any>(buildUUID());\n  const activeKey = ref<any>(uuid.value);\n  const getText = computed(()=>{\n    let text = props.text || props.retrievalText;\n    if(text){\n      text = text.trim();\n    }\n    return text;\n  })\n\n  const isCard = computed(() => {\n    let text = props.text;\n    if (text && text.indexOf('::card::') != -1) {\n      return true;\n    }\n    return false;\n  });  \n  \n  const isCardConfig = computed(() => {\n    let text = props.text;\n    if (text && text.indexOf('::cardConfig::') != -1) {\n      return true;\n    }\n    return false;\n  });\n  //卡片配置\n  const cardConfig = ref<any>();\n\n  const { userInfo } = useUserStore();\n  const avatar = () => {\n    return getFileAccessHttpUrl(userInfo?.avatar) || defaultAvatar;\n  };\n  const emit = defineEmits(['send']);\n  const getAiImg = () => {\n    return getFileAccessHttpUrl(props.appData?.icon) || defaultImg;\n  };\n\n  /**\n   * 预设问题点击事件\n   *\n   */\n  function presetQuestionClick(descr) {\n    emit(\"send\",descr)\n  }\n\n  /**\n   * 获取图片\n   *\n   * @param item\n   */\n  function getImageUrl(item) {\n    let url = item;\n    if(item.hasOwnProperty('url')){\n      url = item.url;\n    }\n    if(item.hasOwnProperty('base64Data') && item.base64Data){\n      let mimeType = item.mimeType ? item.mimeType:'image/png';\n      return \"data:\"+ mimeType +\";base64,\"+ item.base64Data;\n    }\n    return getFileAccessHttpUrl(url);\n  }\n\n  /**\n   * 图片预览\n   * @param url\n   */\n  function handlePreview(url){\n    const onImgLoad = ({ index, url, dom }) => {\n      console.log(`第${index + 1}张图片已加载，URL为：${url}`, dom);\n    };\n    let imageList = [getImageUrl(url)];\n    createImgPreview({ imageList: imageList, defaultWidth: 700, rememberState: true, onImgLoad });\n  }\n\n  /**\n   * 获取卡片列表\n   */\n  function getCardList() {\n    let text = props.text;\n    let card = text.replace('::card::', '').replace(/\\s+/g, '');\n    try {\n      return JSON.parse(card);\n    } catch (e) {\n      console.log(e)\n      return '';\n    }\n  }\n\n  /**\n   * ai卡片点击事件\n   * @param url\n   */\n  function aiCardHandleClick(url){\n    window.open(url,'_blank');\n  }\n\n\n  /**\n   * 从config获取取卡片列表\n   */\n  function getCardConfigList() {\n    let text = props.text;\n    let card = text.replace('::cardConfig::', 'cardConfig').replace(/\\s+/g, '');\n    try {\n      let parse = JSON.parse(card);\n      cardConfig.value = JSON.parse(parse?.cardConfig);\n      return JSON.parse(parse?.content);\n    } catch (e){\n      console.log(e)\n      return '';\n    }\n  }\n\n  /**\n   * 卡片点击跳转\n   */\n  function handleJumpClick(item) {\n    if(cardConfig.value?.enableJump){\n      let src = item[cardConfig.value?.jumpUrl];\n      let reg = /#\\s*{\\s*domainURL\\s*}/g;\n      src = src.replace(reg,domainUrl);\n      window.open(src,\"_blank\")\n    }\n  }\n\n  /**\n   * 获取文件名字\n   * \n   * @param fileUrl\n   */\n  function getFileName(fileUrl){\n    if(!fileUrl) {\n      return '未命名的文件';\n    }\n    let fileName = fileUrl.substring(fileUrl.lastIndexOf('/') + 1).toLowerCase();\n    fileName = fileName.substring(0,fileName.lastIndexOf(\".\"));\n    return fileName;\n  }\n\n  /**\n   * 文件预览\n   * \n   * @param fileUrl\n   */\n  function handleFilePreview(fileUrl) {\n    let filePath = encodeURIComponent(encryptByBase64(getFileAccessHttpUrl(fileUrl)));\n    let url = `${viewUrl}?url=` + filePath;\n    window.open(url, \"_blank\")\n  }\n</script>\n\n<style lang=\"less\" scoped>\n  .chat {\n    display: flex;\n    margin-bottom: 1.5rem;\n    &.self {\n      flex-direction: row-reverse;\n      .avatar {\n        margin-right: 0;\n        margin-left: 10px;\n      }\n      .msgArea {\n        flex-direction: row-reverse;\n        margin-bottom: 6px;\n      }\n      .thinkArea{\n        margin: 0;\n        padding: 5px 0 5px 22px;\n        position: relative;\n      }\n      .date {\n        text-align: right;\n      }\n    }\n  }\n  :deep(.ant-collapse-header){\n    padding: 0 !important;\n  }\n  .hidden-avatar{\n    left: 44px;\n    position: relative;\n    top: -18px;\n  }\n  .avatar {\n    flex: none;\n    margin-right: 10px;\n    img {\n      width: 34px;\n      height: 34px;\n      border-radius: 50%;\n      overflow: hidden;\n    }\n    svg {\n      font-size: 28px;\n    }\n  }\n  .chat.chatgpt .avatar img{\n    border-radius: 4px;\n  }\n  .content {\n    width: 90%;\n    .date {\n      color: #b4bbc4;\n      font-size: 0.75rem;\n      margin-bottom: 10px;\n    }\n    .msgArea {\n      display: flex;\n    }\n  }\n\n  .question{\n    margin-top: 10px;\n    border-radius: 0.375rem;\n    padding-top: 0.5rem;\n    padding-bottom: 0.5rem;\n    padding-left: 0.75rem;\n    padding-right: 0.75rem;\n    background-color: #ffffff;\n    font-size: 0.875rem;\n    line-height: 1.25rem;\n    cursor: pointer;\n    border: 1px solid #f0f0f0;\n    box-shadow: 0 2px 4px #e6e6e6;\n  }\n\n  .images{\n    margin-bottom: 10px;\n    flex-wrap: wrap;\n    display: flex;\n    gap: 10px;\n    justify-content: end;\n    .image{\n      width: 120px;\n      height: 80px;\n      cursor: pointer;\n      img{\n        width: 100%;\n        height: 100%;\n        object-fit: cover;\n        border-radius: 4px;\n      }\n    }\n  }\n\n  /*begin文件列表的样式*/\n  .file-list {\n    margin-bottom: 10px;\n    display: flex;\n    flex-direction: column;\n    gap: 8px;\n    align-items: flex-end;\n  }\n\n  .file-item {\n    display: flex;\n    align-items: center;\n    background: #f4f6f8;\n    border-radius: 8px;\n    padding: 8px 12px;\n    cursor: pointer;\n    width: fit-content;\n    max-width: 100%;\n\n    .file-icon {\n      margin-right: 8px;\n      display: flex;\n      align-items: center;\n    }\n\n    .file-name {\n      font-size: 14px;\n      color: #333;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n      max-width: 200px;\n    }\n  }\n  /*end文件列表的样式*/\n\n  .retrieval,\n  .card {\n    background-color: #f4f6f8;\n    font-size: 0.875rem;\n    line-height: 1.25rem;\n    border-radius: 0.375rem;\n    padding-top: 0.5rem;\n    padding-bottom: 0.5rem;\n    padding-left: 0.75rem;\n    padding-right: 0.75rem;\n  }\n  .retrieval:after{\n    animation: blink 1s steps(5, start) infinite;\n    color: #000;\n    content: '_';\n    font-weight: 700;\n    margin-left: 3px;\n    vertical-align: baseline;\n  }\n  .card{\n    width: 100%;\n    background-color: unset;\n  }\n  .ai-card{\n     width: 98%;\n     height: 100%;\n     cursor: pointer;\n    .ai-card-title{\n      width: 100%;\n      line-height: 20px;\n      letter-spacing: 0;\n      white-space: pre-line;\n      overflow: hidden;\n      display: -webkit-box;\n      text-overflow: ellipsis;\n      -webkit-box-orient: vertical;\n      font-weight: 600;\n      font-size: 18px;\n      text-align: left;\n      color: #191919;\n      -webkit-line-clamp: 1;\n    }\n    .ai-card-img{\n      margin-top: 10px;\n      background-color: transparent;\n      border-radius: 8px;\n      display: flex;\n      width: 100%;\n      height: max-content;\n    }\n    .ai-card-desc{\n      margin-top: 10px;\n      width: 100%;\n      font-size: 14px;\n      font-weight: 400;\n      line-height: 20px;\n      letter-spacing: 0;\n      white-space: pre-line;\n      -webkit-box-orient: vertical;\n      overflow: hidden;\n      display: -webkit-box;\n      text-overflow: ellipsis;\n      text-align: left;\n      color: #666f;\n      -webkit-line-clamp: 3;\n    }\n  }\n  @media (max-width: 600px) {\n    .content{\n      width: 100%;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/chatText.vue",
    "content": "<template>\n  <div v-if=\"parsedText != ''\" class=\"textWrap\" :class=\"[inversion === 'user' ? 'self' : (isOnlyImage ? 'chatgpt-image' : 'chatgpt')]\" ref=\"textRef\">\n    <div v-if=\"inversion != 'user'\" :style=\"{ width: getIsMobile? screenWidth : 'auto' }\">\n      <div ref=\"markdownBodyRef\" class=\"markdown-body\" :class=\"{ 'markdown-body-generate': loading }\" v-html=\"parsedText\" />\n      <template v-if=\"showRefKnow\">\n        <a-divider orientation=\"left\">引用</a-divider>\n        <template v-for=\"(item, idx) in referenceKnowledge\" :key=\"idx\">\n          <a-tooltip :title=\"item.content?.substring(0, 800)\">\n            <a-tag style=\"min-width: 80px;background: #F7F8FA;padding-inline: 0 7px\">\n              <a-space style=\"min-height: 30px;padding-left: 4px;padding-right: 4px;background-color: #F0F1F6;color: #788194\">\n                <div>{{ 'chunk-' + item.chunk}}</div>\n              </a-space>\n              <a-space style=\"min-height: 30px;padding-left: 4px;\">\n                <img :src=\"knowledgePng\" width=\"14\" height=\"14\" style=\"position: relative; top: -2px\"/>\n                <div style=\"max-width: 240px; overflow: hidden;white-space: nowrap;text-overflow: ellipsis;\">\n                  {{ item.docName }}\n                </div>\n              </a-space>\n            </a-tag>\n          </a-tooltip>\n        </template>\n      </template>\n      <div v-if=\"error\" class=\"error-message\">\n        <p>{{ errorMsg }}</p>\n      </div>\n    </div>\n    <div v-else class=\"msg\" v-html=\"parsedText\" />\n  </div>\n  <ImageViewer v-if=\"amplifyImage\" :imageUrl=\"imageUrl\" @hide=\"pictureHide\"></ImageViewer>\n  <!-- 聊天中渲染JeecgTag -->\n  <template v-if=\"jeecgTagList.length\">\n    <template v-for=\"item of jeecgTagList\" :key=\"item.key\">\n      <teleport :to=\"item.to\">\n        <Component :is=\"item.tag.component\" :data=\"item.data\" :loading=\"loading\" />\n      </teleport>\n    </template>\n  </template>\n</template>\n\n<script setup lang=\"ts\">\n  import type { JeecgTag } from './jeecg-tags/types';\n  import { computed, nextTick, onMounted, onUnmounted, onUpdated, ref, watch } from 'vue';\n  import * as lodash from 'lodash';\n  import md5 from 'crypto-js/md5';\n  import MarkdownIt from 'markdown-it';\n  import mdKatex from '@traptitech/markdown-it-katex';\n  import mila from 'markdown-it-link-attributes';\n  import hljs from 'highlight.js';\n  import './style/github-markdown.less';\n  import './style/highlight.less';\n  import './style/style.less';\n  import ImageViewer from '@/views/super/airag/aiapp/chat/components/ImageViewer.vue';\n  import { useAppInject } from \"@/hooks/web/useAppInject\";\n  import { useGlobSetting } from \"@/hooks/setting\";\n  import { mdPluginJeecgTag, JEECG_TAG_CLASS, jeecgTagMap } from './jeecg-tags'\n  import knowledgePng from '../../aiknowledge/icon/knowledge.png'\n\n  /**\n   * 屏幕宽度\n   */\n  const screenWidth = ref<string>();\n  const { domainUrl } = useGlobSetting();\n  const { getIsMobile } = useAppInject();\n\n  const props = defineProps(['dateTime', 'text', 'inversion', 'error', 'errorMsg', 'currentToolTag', 'loading', 'referenceKnowledge', 'isLast']);\n  const textRef = ref();\n  const markdownBodyRef = ref<HTMLDivElement>();\n\n  //图片地址\n  const imageUrl = ref<string>('');\n  //是否放大图片\n  const amplifyImage = ref<boolean>(false);\n\n  const parsedText = ref<string>('');\n\n  // 解析出来的 jeecgTag 列表\n  const jeecgTagList = ref<{\n    key: string;\n    to: HTMLDivElement;\n    tag: JeecgTag;\n    data: string;\n  }[]>([]);\n\n  const mdi = new MarkdownIt({\n    html: true,\n    linkify: true,\n    highlight(code, language) {\n      const validLang = !!(language && hljs.getLanguage(language));\n      if (validLang) {\n        const lang = language ?? '';\n        return highlightBlock(hljs.highlight(code, { language: lang }).value, lang);\n      }\n      return highlightBlock(hljs.highlightAuto(code).value, '');\n    },\n  });\n\n  // 自定义 mdi 插件\n  mdi.use(mdPluginJeecgTag);\n  // 官方 mdi 插件\n  mdi.use(mila, { attrs: { target: '_blank', rel: 'noopener' } });\n  mdi.use(mdKatex, { blockClass: 'katexmath-block rounded-md p-[10px]', errorColor: ' #cc0000' });\n\n  /**\n   * 处理聊天文本并在一定时间内节流更新\n   */\n  const updateTextContent = lodash.throttle(() => {\n    let value = props.text ?? '';\n    if (props.inversion !== 'user') {\n      // 先替换图片宽度与域名占位符后再渲染 markdown\n      value = replaceImageWith(value);\n      value = replaceDomainUrl(value);\n      parsedText.value = mdi.render(value);\n      // 解析 jeecgTag 标签\n      parseJeecgTag();\n      return;\n    }\n    // 用户消息保留换行展示\n    parsedText.value = value.replace(\"\\n\", \"<br>\");\n  }, 100);\n\n  // 是否显示引用知识库\n  const showRefKnow = computed(() => {\n    const {loading, referenceKnowledge} = props\n    if (loading) {\n      return false;\n    }\n    return Array.isArray(referenceKnowledge) && referenceKnowledge.length > 0;\n  })\n\n  // 判断是否只有图片\n  const isOnlyImage = computed(() => {\n    if (showRefKnow.value){\n      return false;\n    }\n    \n    const content = props.text || '';\n    if (!content){\n      return false;\n    }\n    \n    //匹配![图片1](url1) \n    const imageRegex = /!\\[.*?\\]\\(.*?\\)/g;\n    if (!imageRegex.test(content)) {\n      return false;\n    }\n    \n    //替换之后是否存在文本\n    const remaining = content.replace(imageRegex, '').trim();\n    return remaining.length === 0;\n  });\n\n  // 监听文本变化，触发界面更新\n  watch(() => props.text, () => updateTextContent(), {immediate: true});\n\n  // 监听 当前调用的工具 变化，追加渲染内容\n  watch(() => props.currentToolTag, () => {\n    const {isLast, inversion, currentToolTag, loading} = props;\n    if (isLast && inversion != 'user' && currentToolTag && loading) {\n      parsedText.value += mdi.render(currentToolTag);\n      // 解析 jeecgTag 标签\n      parseJeecgTag();\n    }\n  }, {immediate: true});\n\n  //替换图片宽度\n  function replaceImageWith(markdownContent) {\n    //update-begin---author:wangshuai---date:2026-01-08---for: 兼容返回多张图片集图片默认宽度调整---\n    // 1. 支持图片设置width的写法 ![](/static/jimuImages/screenshot_1617252560523.png =100)\n    // 必须有空格，避免匹配到url参数中的=\n    const regex = /!\\[([^\\]]*)\\]\\(([^)]+)\\s=([0-9]+)\\)/g;\n    markdownContent = markdownContent.replace(regex, (match, alt, src, width) => {\n      let reg = /#\\s*{\\s*domainURL\\s*}/g;\n      src = src.replace(reg,domainUrl);\n      return `<div class=\"chat-image-custom\"><img src='${src}' alt='${alt}' width='${width}' /></div>`;\n    });\n\n    // 2. 处理普通图片，实现多图并列显示（如生成图片场景）\n    // 统计剩余的markdown图片数量\n    const regexStandard = /!\\[([^\\]]*)\\]\\(([^)]+)\\)/g;\n    const matches = markdownContent.match(regexStandard);\n    const count = matches ? matches.length : 0;\n    \n    if (count > 0) {\n      markdownContent = markdownContent.replace(regexStandard, (match, alt, src) => {\n        let reg = /#\\s*{\\s*domainURL\\s*}/g;\n        src = src.replace(reg, domainUrl);\n        // 如果有多张图片，使用Grid布局（一行4个）\n        if (count > 1) {\n             return `<div class=\"chat-image-grid-item\"><img src='${src}' alt='${alt}' /></div>`;\n        }\n        // 单张图片保持默认（或包裹以便控制）\n        return `<div class=\"chat-image-single\"><img src='${src}' alt='${alt}' /></div>`;\n      });\n    }\n    return markdownContent;\n    //update-end---author:wangshuai---date:2026-01-08---for: 兼容返回多张图片集图片默认宽度调整---\n  };\n\n  //替换domainURL\n  function replaceDomainUrl(markdownContent) {\n    const regex = /!\\[([^\\]]*)\\]\\(.*?#\\s*{\\s*domainURL\\s*}.*?\\)/g;\n    return markdownContent.replace(regex, (match) => {\n      let reg = /#\\s*{\\s*domainURL\\s*}/g;\n      return match.replace(reg,domainUrl);\n    })\n  }\n\n  function highlightBlock(str: string, lang?: string) {\n    return `<pre class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-header__lang\">${lang}</span><span class=\"code-block-header__copy\">复制代码</span></div><code class=\"hljs code-block-body ${lang}\">${str}</code></pre>`;\n  }\n  function addCopyEvents() {\n    if (textRef.value) {\n      const copyBtn = textRef.value.querySelectorAll('.code-block-header__copy');\n      copyBtn.forEach((btn) => {\n        btn.addEventListener('click', () => {\n          const code = btn.parentElement?.nextElementSibling?.textContent;\n          if (code) {\n            copyToClip(code).then(() => {\n              btn.textContent = '复制成功';\n              setTimeout(() => {\n                btn.textContent = '复制代码';\n              }, 1e3);\n            });\n          }\n        });\n      });\n    }\n  }\n\n  function removeCopyEvents() {\n    if (textRef.value) {\n      const copyBtn = textRef.value.querySelectorAll('.code-block-header__copy');\n      copyBtn.forEach((btn) => {\n        btn.removeEventListener('click', () => {});\n      });\n    }\n  }\n\n\n  /**\n   * 添加图片点击事件\n   */\n  function addImageClickEvent() {\n    if (textRef.value) {\n      const image = textRef.value.querySelectorAll('img');\n      image.forEach((img) => {\n        img.addEventListener('click', () => {\n          imageUrl.value = img.src;\n          amplifyImage.value = true;\n        })\n      });\n    }\n  }\n\n\n  /**\n   * 移出图片点击事件\n   */\n  function removeImageClickEvent(){\n    if (textRef.value) {\n      const image = textRef.value.querySelectorAll('img');\n      image.forEach((img) => {\n        img.removeEventListener('click', () => { })\n      });\n    }\n  }\n\n  /**\n   * 图片隐藏\n   */\n  function pictureHide(){\n    amplifyImage.value = false;\n    imageUrl.value = \"\"\n  }\n\n\n  /**\n   * 设置markdown body整体宽度\n   */\n  function setMarkdownBodyWidth() {\n    //平板\n    console.log(\"window.innerWidth::\",window.innerWidth)\n    if(window.innerWidth>600 && window.innerWidth<1024){\n      screenWidth.value = window.innerWidth - 120 + 'px';\n    }else if(window.innerWidth < 600){\n      //手机\n      screenWidth.value = window.innerWidth - 60 + 'px';\n    }\n  }\n\n  // 解析JeecgTag标签\n  async function parseJeecgTag() {\n    await nextTick();\n    if (!markdownBodyRef.value) {\n      return;\n    }\n\n    jeecgTagList.value = [];\n    const elements = markdownBodyRef.value.querySelectorAll('.' + JEECG_TAG_CLASS);\n    elements.forEach((el) => {\n      const tagName = el.nodeName.toLowerCase();\n      const tag = jeecgTagMap.get(tagName);\n      if (!tag) {\n        console.warn(`未识别的 jeecg 标签:`, tagName, el);\n        return;\n      }\n      const renderEl = el.querySelector('render') as HTMLDivElement;\n      if (!renderEl) {\n        if (props.loading) {\n          // 渲染中\n          el.innerHTML = `<div style=\"color: #888; margin-top: 12px;\">图表渲染中，请稍候...</div>`;\n          return;\n        }\n        el.innerHTML = `<div style=\"color: red;\">模型返回的图表渲染格式不正确，请优化提示词或重新尝试。</div>`;\n        return;\n      }\n\n      const dataEl = el.querySelector('data');\n      const dataStr = dataEl?.textContent || '';\n      renderJeecgTag(tag, dataStr, renderEl);\n    });\n  }\n\n  /**\n   * 提交渲染 jeecg 标签\n   */\n  function renderJeecgTag(tag: JeecgTag, data: string, renderEl: HTMLDivElement) {\n    jeecgTagList.value.push({\n      key: md5(tag.name + '_' + data).toString(),\n      to: renderEl,\n      tag: tag,\n      data: data,\n    });\n  }\n\n  onMounted(() => {\n    addCopyEvents();\n    addImageClickEvent();\n    setMarkdownBodyWidth();\n    window.addEventListener('resize', setMarkdownBodyWidth);\n  });\n\n  onUpdated(() => {\n    addCopyEvents();\n    addImageClickEvent();\n  });\n\n  onUnmounted(() => {\n    removeCopyEvents();\n    removeImageClickEvent();\n    window.removeEventListener('resize', setMarkdownBodyWidth);\n  });\n\n  function copyToClip(text: string) {\n    return new Promise((resolve, reject) => {\n      try {\n        const input: HTMLTextAreaElement = document.createElement('textarea');\n        input.setAttribute('readonly', 'readonly');\n        input.value = text;\n        document.body.appendChild(input);\n        input.select();\n        if (document.execCommand('copy')) document.execCommand('copy');\n        document.body.removeChild(input);\n        resolve(text);\n      } catch (error) {\n        reject(error);\n      }\n    });\n  }\n</script>\n<style lang=\"less\" scoped>\n  .textWrap {\n    border-radius: 0.375rem;\n    padding-top: 0.5rem;\n    padding-bottom: 0.5rem;\n    padding-left: 0.75rem;\n    padding-right: 0.75rem;\n    font-size: 0.875rem;\n    line-height: 1.25rem;\n  }\n\n  .error {\n    background: linear-gradient(135deg, #FF4444, #FF914D) !important;\n    border-radius: 0.375rem;\n    padding-top: 0.5rem;\n    padding-bottom: 0.5rem;\n    padding-left: 0.75rem;\n    padding-right: 0.75rem;\n    font-size: 0.875rem;\n    line-height: 1.25rem;\n  }\n\n  .error-message {\n    color: #FF4444 !important\n  }\n\n  .self {\n    // background-color: #d2f9d1;\n    background-color: @primary-color;\n    color: #fff;\n    overflow-wrap: break-word;\n    line-height: 1.625;\n    min-width: 20px;\n  }\n  .chatgpt {\n    background-color: #f4f6f8;\n\n    font-size: 0.875rem;\n    line-height: 1.25rem;\n  }\n  .chatgpt-image {\n    .markdown-body{\n      background-color: transparent !important;\n    }\n  }\n  @media (max-width: 1024px) {\n    //手机和平板下的样式\n    .textWrap{\n      margin-left: -40px;\n      margin-top: 10px;\n    }\n  }\n\n  // 生成图片的样式\n  :deep(.chat-image-grid-item) {\n    display: inline-block;\n    width: 24%;\n    padding: 4px;\n    box-sizing: border-box;\n    vertical-align: top;\n    img {\n      width: 100%;\n      height: auto;\n      border-radius: 4px;\n      cursor: pointer;\n      object-fit: cover;\n      aspect-ratio: 1/1;\n    }\n  }\n  :deep(.chat-image-single) {\n    img {\n      max-width: 50%;\n      border-radius: 4px;\n      cursor: pointer;\n    }\n  }\n\n  .markdown-body {\n    :deep(.jeecg-tag) {\n      display: block;\n      margin: 8px 0;\n\n      data {\n        display: none;\n      }\n\n      render {\n        display: block;\n        width: 100%;\n        height: auto;\n        min-width: 300px;\n      }\n    }\n  }\n\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/components/CardTemplate.vue",
    "content": "<!-- card 官方模板 -->\n<template>\n  <div class=\"card-select-panel\" @click=\"handleClick\">\n    <!-- 卡片内容 -->\n    <div class=\"card-item\">\n      <div class=\"card-title\">{{ getTitle }}</div>\n      <!-- 缩略图左侧变体 -->\n      <div v-if=\"getTemplateId === 'template-1'\" class=\"card-top\">\n        <div class=\"thumb\" v-if=\"!getImage\">\n          <div class=\"thumb-dot\"></div>\n          <div class=\"thumb-mountain\"></div>\n        </div>\n        <div v-else class=\"thumb-image\">\n          <img :src=\"getImage\" />\n        </div>\n        <div class=\"desc clamp\">\n          {{ getContent }}\n        </div>\n      </div>\n\n      <!-- 缩略图右侧变体 -->\n      <div v-else-if=\"getTemplateId === 'template-2'\" class=\"card-top\">\n        <div class=\"desc clamp\">\n          {{ getContent }}\n        </div>\n        <div class=\"thumb\" v-if=\"!getImage\">\n          <div class=\"thumb-dot\"></div>\n          <div class=\"thumb-mountain\"></div>\n        </div>\n        <div v-else class=\"thumb-image\">\n          <img :src=\"getImage\" />\n        </div>\n      </div>\n\n      <!-- 横幅图片变体 -->\n      <div v-else-if=\"getTemplateId === 'template-3'\">\n        <div class=\"banner\" v-if=\"!getImage\">\n          <div class=\"banner-dot\"></div>\n          <div class=\"banner-mountain\"></div>\n        </div>\n        <div v-else class=\"banner-image\">\n          <img :src=\"getImage\" />\n        </div>\n        <div class=\"desc\">\n          {{ getContent }}\n        </div>\n      </div>\n\n      <!-- 纯文本变体 -->\n      <div v-else-if=\"getTemplateId === 'template-4'\" class=\"desc\">\n        {{ getContent }}\n      </div>\n      <div v-if=\"showDeleteIcon\" class=\"delete\">\n        <Icon icon=\"ant-design:close-outlined\" @click.parent.stop=\"handleDelete\"></Icon>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\n  import { ref, defineProps, defineEmits, computed } from 'vue';\n  import {useGlobSetting} from \"@/hooks/setting\";\n  const props = defineProps({\n    templateId: { type: String, default: '' },\n    showDeleteIcon: { type: Boolean, default: false },\n    cardData: { type: Object, default: null },\n    cardConfig: { type: Object, default: null },\n  });\n  const emit = defineEmits(['register', 'click', 'delete']);\n  const { domainUrl } = useGlobSetting();\n  const content = ref<string>('内容描述是一种重要的沟通和表达，它在描述事物时发挥着至关重要的作用');\n\n  //获取模板id\n  const getTemplateId = computed(() => props.templateId);\n\n  //获取内容\n  const getContent = computed(() => {\n    if (props.cardData && props.cardConfig) {\n      return props.cardData[props.cardConfig?.content];\n    }\n    return content;\n  });\n\n  //获取文本\n  const getTitle = computed(() => {\n    if (props.cardData && props.cardConfig) {\n      return props.cardData[props.cardConfig?.title];\n    }\n    return '标题';\n  });\n\n  //获取图片\n  const getImage = computed(() => {\n    if (props.cardData && props.cardConfig) {\n      let src = props.cardData[props.cardConfig?.image];\n      let reg = /#\\s*{\\s*domainURL\\s*}/g;\n      src = src.replace(reg,domainUrl);\n      return src;\n    }\n    return '';\n  });\n\n  /**\n   * 卡片点击事件\n   */\n  function handleClick() {\n    emit('click');\n  }\n\n  /**\n   * 卡片删除事件\n   */\n  function handleDelete() {\n    emit('delete');\n  }\n</script>\n\n<style scoped lang=\"less\">\n  .card-select-panel {\n    padding: 8px 0;\n    cursor: pointer;\n  }\n  /* 标题 */\n  .card-title {\n    width: 100%;\n    font-weight: 600;\n    color: #1f2937;\n    margin-bottom: 10px;\n    line-height: 20px;\n    letter-spacing: 0;\n    white-space: pre-line;\n    overflow: hidden;\n    display: -webkit-box;\n    text-overflow: ellipsis;\n    -webkit-box-orient: vertical;\n    font-size: 18px;\n    text-align: left;\n    -webkit-line-clamp: 1;\n  }\n\n  /* 描述文本 */\n  .desc {\n    color: #667085;\n    font-size: 13px;\n    line-height: 1.6;\n  }\n\n  /* 多行省略，用于第一张卡片（示例） */\n  .clamp {\n    display: -webkit-box;\n    -webkit-line-clamp: 2;\n    -webkit-box-orient: vertical;\n    overflow: hidden;\n  }\n\n  /* 顶部缩略图行（缩略图 + 描述） */\n  .card-top {\n    display: flex;\n    gap: 12px;\n    align-items: center;\n  }\n  /* 卡片容器 */\n  .card-item {\n    display: flex;\n    flex-direction: column;\n    position: relative;\n    border-radius: 14px;\n    background: #f8fafc;\n    border: 1px solid #e9edf3;\n    padding: 14px 10px;\n    transition: all 0.2s ease;\n  }\n\n  /* 轻微内阴影与悬浮效果 */\n  .card-item::before {\n    content: '';\n    position: absolute;\n    inset: 0;\n    border-radius: inherit;\n    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7);\n    pointer-events: none;\n  }\n  .card-item:hover {\n    border-color: #dbe3ea;\n    background: #f9fbfd;\n    .delete {\n      display: block;\n    }\n  }\n  /* 描述文本 */\n  .desc {\n    color: #667085;\n    margin-top: 10px;\n    width: 100%;\n    font-size: 14px;\n    font-weight: 400;\n    line-height: 20px;\n    letter-spacing: 0;\n    white-space: pre-line;\n    -webkit-box-orient: vertical;\n    overflow: hidden;\n    display: -webkit-box;\n    text-overflow: ellipsis;\n    text-align: left;\n    -webkit-line-clamp: 3;\n  }\n  /* 缩略图占位（与示例一致：左上小图） */\n  .thumb {\n    width: 44px;\n    height: 44px;\n    border-radius: 10px;\n    background: linear-gradient(180deg, #edf2fa 0%, #e9eef7 100%);\n    position: relative;\n    flex: 0 0 44px;\n  }\n  .thumb-dot {\n    width: 8px;\n    height: 8px;\n    border-radius: 50%;\n    background: #cbd5e1;\n    position: absolute;\n    top: 9px;\n    left: 9px;\n  }\n  .thumb-mountain {\n    width: 20px;\n    height: 12px;\n    background: #dbe2ee;\n    border-radius: 3px;\n    position: absolute;\n    bottom: 9px;\n    left: 12px;\n  }\n\n  /* 横幅图片占位（第三张卡片的大图） */\n  .banner {\n    width: 100%;\n    height: 96px;\n    border-radius: 12px;\n    background: linear-gradient(180deg, #eef3fb 0%, #e7edf6 100%);\n    position: relative;\n    margin-bottom: 10px;\n  }\n  .banner-dot {\n    width: 10px;\n    height: 10px;\n    border-radius: 50%;\n    background: #cbd5e1;\n    position: absolute;\n    top: 22px;\n    left: 26px;\n  }\n  .banner-mountain {\n    width: 120px;\n    height: 20px;\n    background: #dbe2ee;\n    border-radius: 4px;\n    position: absolute;\n    bottom: 24px;\n    left: 50%;\n    transform: translateX(-50%);\n  }\n\n  /* 变体微调：确保整体间距与示例一致 */\n  .variant-text .desc {\n    margin-top: 2px;\n  }\n  .variant-thumb .desc {\n    margin-top: 2px;\n  }\n  .variant-banner .desc {\n    margin-top: 8px;\n  }\n  .delete {\n    width: 20px;\n    position: absolute;\n    top: 6px;\n    right: 6px;\n    display: none;\n    cursor: pointer;\n  }\n\n  .thumb-image {\n    background-color: transparent;\n    display: flex;\n    width: 44px;\n    height: 44px;\n    border-radius: 10px;\n    position: relative;\n    flex: 0 0 44px;\n    img {\n      width: 44px;\n      height: 44px;\n    }\n  }\n  .banner-image {\n    background-color: transparent;\n    width: 100%;\n    height: 96px;\n    border-radius: 12px;\n    position: relative;\n    margin-bottom: 10px;\n    img {\n      width: 100%;\n      height: 96px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/components/ConversationSettingsModal.vue",
    "content": "<template>\n  <a-modal\n    v-model:open=\"visible\"\n    title=\"对话设置\"\n    :width=\"600\"\n    :maskClosable=\"false\"\n    :keyboard=\"false\"\n    @ok=\"handleOk\"\n    okText=\"开始对话\"\n    :cancelButtonProps=\"{ style: { display: 'none' } }\"\n    :okButtonProps=\"{ disabled: !canSubmit }\"\n  >\n    <div class=\"settings-content\">\n      <a-form :model=\"formData\" layout=\"vertical\">\n        <a-form-item\n          v-for=\"input in flowInputs\"\n          :key=\"input.field\"\n          :label=\"input.name\"\n          :required=\"input.required\"\n        >\n          <!-- 文本类型 - 使用单行输入 -->\n          <a-input\n            v-if=\"input.type === 'string'\"\n            v-model:value=\"formData[input.field]\"\n            :placeholder=\"`请输入${input.name}`\"\n            :maxlength=\"input.maxLength\"\n            show-count\n          />\n          <!-- 数字类型 -->\n          <a-input-number\n            v-else-if=\"input.type === 'number'\"\n            v-model:value=\"formData[input.field]\"\n            :placeholder=\"`请输入${input.name}`\"\n            style=\"width: 100%\"\n            :min=\"input.min\"\n            :max=\"input.max\"\n          />\n          \n            <!-- 图片类型 - 使用类似chat.vue的上传样式，固定支持3张图片 -->\n          <div v-else-if=\"input.type === 'picture'\" class=\"image-upload-container\">\n            <div class=\"image-list-wrapper\">\n              <!-- 已上传的图片 -->\n              <div v-for=\"(img, idx) in imageFileList[input.field]\" :key=\"idx\" class=\"image-preview-item\">\n                <img :src=\"getImageUrl(img)\" @click=\"handlePreview(img)\" />\n                <div class=\"image-remove-icon\" @click=\"handleRemove(idx, input.field)\">\n                  <Icon icon=\"ant-design:close-outlined\" :size=\"12\" />\n                </div>\n              </div>\n              <!-- 上传按钮 -->\n              <a-upload\n                v-if=\"(imageFileList[input.field]?.length || 0) < 3\"\n                accept=\".jpg,.jpeg,.png\"\n                name=\"file\"\n                :showUploadList=\"false\"\n                :headers=\"headers\"\n                :beforeUpload=\"(file) => beforeUpload(file, input.field)\"\n                @change=\"(info) => handleChange(info, input.field)\"\n                :multiple=\"true\"\n                :action=\"uploadUrl\"\n                :max-count=\"3\"\n              >\n                <div class=\"upload-trigger\">\n                  <Icon icon=\"ant-design:plus-outlined\" :size=\"20\" />\n                  <div class=\"upload-text\">上传图片</div>\n                </div>\n              </a-upload>\n            </div>\n          </div>\n          <!-- 字符串数组类型（如history） -->\n          <a-select\n            v-else-if=\"input.type === 'string[]'\"\n            v-model:value=\"formData[input.field]\"\n            mode=\"tags\"\n            :placeholder=\"`请输入${input.name}`\"\n            style=\"width: 100%\"\n          />\n          <!-- 其他类型使用文本输入 -->\n          <a-input\n            v-else\n            v-model:value=\"formData[input.field]\"\n            :placeholder=\"`请输入${input.name}`\"\n          />\n        </a-form-item>\n      </a-form>\n    </div>\n  </a-modal>\n</template>\n\n<script setup lang=\"ts\">\n  import { ref, computed } from 'vue';\n  import { message } from 'ant-design-vue';\n  import { Icon } from '/@/components/Icon';\n  import { getFileAccessHttpUrl, getHeaders } from '@/utils/common/compUtils';\n  import { useGlobSetting } from '@/hooks/setting';\n\n  const props = defineProps<{\n    flowInputs: any[];\n    conversationId: string;\n    existingSettings?: Record<string, any>;\n  }>();\n\n  const emit = defineEmits<{\n    (e: 'ok', data: Record<string, any>): void;\n    (e: 'cancel'): void;\n  }>();\n\n  const visible = ref(false);\n  const formData = ref<Record<string, any>>({});\n  const imageFileList = ref<Record<string, any[]>>({});\n\n  const globSetting = useGlobSetting();\n  const baseUploadUrl = globSetting.uploadUrl;\n  const uploadUrl = `${baseUploadUrl}/airag/chat/upload`;\n  const headers = getHeaders();\n\n  // 过滤掉固定参数（history, content, images）\n  const flowInputs = computed(() => {\n    const fixedParams = ['history', 'content', 'images'];\n    return props.flowInputs?.filter((input) => !fixedParams.includes(input.field)) || [];\n  });\n\n  // 检查是否可以提交（必填项都已填写）\n  const canSubmit = computed(() => {\n    if (flowInputs.value.length === 0) return true;\n    return flowInputs.value.every((input) => {\n      if (!input.required) return true;\n      const value = formData.value[input.field];\n      if (input.type === 'picture') {\n        return imageFileList.value[input.field] && imageFileList.value[input.field].length > 0;\n      }\n      return value !== undefined && value !== null && value !== '';\n    });\n  });\n\n  // 上传前处理\n  const beforeUpload = (file: any, field: string) => {\n    const isImage = file.type?.startsWith('image/');\n    if (!isImage) {\n      message.error('只能上传图片文件！');\n      return false;\n    }\n    \n    const currentCount = imageFileList.value[field]?.length || 0;\n    \n    if (currentCount >= 3) {\n      message.warning('最多只能上传3张图片！');\n      return false;\n    }\n    \n    return true;\n  };\n\n  // 上传状态变化处理\n  const handleChange = (info: any, field: string) => {\n    const { file } = info;\n    \n    if (file.status === 'error' || (file.response && file.response.code === 500)) {\n      message.error(file.response?.message || `${file.name} 上传失败`);\n      return;\n    }\n    \n    if (file.status === 'done' && file.response) {\n      const imageUrl = file.response.message;\n      if (!imageFileList.value[field]) {\n        imageFileList.value[field] = [];\n      }\n      \n      // 检查是否已达到上限\n      if (imageFileList.value[field].length >= 3) {\n        message.warning('最多只能上传3张图片！');\n        return;\n      }\n      \n      imageFileList.value[field].push(imageUrl);\n      \n      // 图片类型始终作为数组存储，触发响应式更新\n      imageFileList.value = { ...imageFileList.value };\n      formData.value[field] = [...imageFileList.value[field]];\n      \n      console.log(`[图片上传] 当前图片数量: ${imageFileList.value[field].length}`, imageFileList.value[field]);\n    }\n  };\n\n  // 获取图片URL\n  const getImageUrl = (img: any) => {\n    if (typeof img === 'string') {\n      return getFileAccessHttpUrl(img);\n    }\n    return getFileAccessHttpUrl(img.url || img);\n  };\n\n  // 图片预览\n  const handlePreview = (img: any) => {\n    const url = typeof img === 'string' ? img : (img.url || img);\n    const imageUrl = getFileAccessHttpUrl(url);\n    // 可以使用 ant-design-vue 的 Image 预览功能\n    window.open(imageUrl, '_blank');\n  };\n\n  // 移除图片\n  const handleRemove = (index: number, field: string) => {\n    if (imageFileList.value[field]) {\n      imageFileList.value[field].splice(index, 1);\n      \n      // 触发响应式更新\n      imageFileList.value = { ...imageFileList.value };\n      \n      // 图片类型始终作为数组存储，删除后更新\n      formData.value[field] = imageFileList.value[field].length > 0 \n        ? [...imageFileList.value[field]] \n        : [];\n      \n      console.log(`[图片删除] 当前图片数量: ${imageFileList.value[field].length}`, imageFileList.value[field]);\n    }\n  };\n\n  // 打开弹窗\n  const open = () => {\n    visible.value = true;\n    // 初始化表单数据\n    formData.value = {};\n    imageFileList.value = {};\n    \n    // 如果有已存在的设置，填充表单\n    if (props.existingSettings && Object.keys(props.existingSettings).length > 0) {\n      Object.keys(props.existingSettings).forEach((key) => {\n        const input = props.flowInputs.find((i) => i.field === key);\n        if (input) {\n          if (input.type === 'picture') {\n            // 确保是数组格式\n            const urls = Array.isArray(props.existingSettings![key]) \n              ? props.existingSettings![key] \n              : (props.existingSettings![key] ? [props.existingSettings![key]] : []);\n            imageFileList.value[key] = urls.filter(url => url); // 过滤空值\n            formData.value[key] = [...imageFileList.value[key]]; // 始终作为数组\n          } else {\n            formData.value[key] = props.existingSettings![key];\n          }\n        }\n      });\n    }\n  };\n\n  // 确定\n  const handleOk = async () => {\n    if (!canSubmit.value) {\n      message.warning('请填写所有必填项');\n      return;\n    }\n    \n    // 构建最终数据\n    const result: Record<string, any> = {};\n    flowInputs.value.forEach((input) => {\n      const value = formData.value[input.field];\n      if (value !== undefined && value !== null && value !== '') {\n        result[input.field] = value;\n      }\n    });\n    \n    // 先保存，再触发事件\n    // 直接通过emit返回设置数据，不需要单独保存\n    // 设置会在发送消息时自动保存到后端\n    emit('ok', result);\n    visible.value = false;\n  };\n\n  // 暴露方法\n  defineExpose({\n    open,\n  });\n</script>\n\n<style scoped lang=\"less\">\n  .settings-content {\n    max-height: 60vh;\n    overflow-y: auto;\n    padding: 10px 5px;\n    \n    :deep(.ant-form-item) {\n      margin-bottom: 16px;\n    }\n    \n    :deep(.ant-form-item-label) {\n      padding: 0 5px;\n    }\n    \n    :deep(.ant-input),\n    :deep(.ant-input-number),\n    :deep(.ant-select) {\n      margin: 0 5px;\n      width: calc(100% - 10px) !important;\n    }\n    \n    :deep(.ant-upload) {\n      margin: 0 5px;\n    }\n  }\n  \n  .image-upload-container {\n    margin: 0 5px;\n    \n    .image-list-wrapper {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 10px;\n      align-items: center;\n    }\n    \n    .image-preview-item {\n      position: relative;\n      width: 80px;\n      height: 80px;\n      border-radius: 8px;\n      overflow: hidden;\n      border: 1px solid #d9d9d9;\n      flex-shrink: 0;\n      \n      img {\n        width: 100%;\n        height: 100%;\n        object-fit: cover;\n        cursor: pointer;\n      }\n      \n      .image-remove-icon {\n        position: absolute;\n        top: 4px;\n        right: 4px;\n        background-color: rgba(0, 0, 0, 0.6);\n        color: white;\n        border-radius: 50%;\n        width: 20px;\n        height: 20px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        cursor: pointer;\n        opacity: 0;\n        transition: opacity 0.2s;\n        \n        &:hover {\n          background-color: rgba(0, 0, 0, 0.8);\n        }\n      }\n      \n      &:hover .image-remove-icon {\n        opacity: 1;\n      }\n    }\n    \n    .upload-trigger {\n      width: 80px;\n      height: 80px;\n      border: 1px dashed #d9d9d9;\n      border-radius: 8px;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      cursor: pointer;\n      transition: all 0.3s;\n      background-color: #fafafa;\n      flex-shrink: 0;\n      \n      &:hover {\n        border-color: #1890ff;\n        color: #1890ff;\n      }\n      \n      .upload-text {\n        margin-top: 4px;\n        font-size: 12px;\n        color: rgba(0, 0, 0, 0.65);\n      }\n      \n      &:hover .upload-text {\n        color: #1890ff;\n      }\n    }\n  }\n</style>\n\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/components/ImageViewer.vue",
    "content": "<!--image放大封装-->\n<template>\n  <div class=\"amplify-image\">\n    <div class=\"img-preview-content\" @click=\"hideImageClick\" @mousewheel=\"handlePicMousewheel\">\n      <img :src=\"imageUrl\" ref=\"imageRef\" />\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\n  //图片地址\n  import {onMounted, ref, unref} from 'vue';\n  const props = defineProps(['imageUrl']);\n  const emit = defineEmits(['register', 'hide']);\n  //图片的ref\n  const imageRef = ref();\n  //缩放级别\n  const scale = ref<number>(1);\n\n  /**\n   * 隐藏图片\n   */\n  function hideImageClick() {\n    scale.value = 1;\n    emit('hide')\n  }\n\n  /**\n   * 鼠标滑轮滚动\n   * @param event\n   */\n  function handlePicMousewheel(event) {\n    event.preventDefault();\n    // 判断是放大还是缩小\n    const delta = event.deltaY > 0 ? -1 : 1;\n    const scaleStep = 0.1;\n    // 更新缩放级别\n    scale.value = scale.value + delta * scaleStep\n    imageRef.value.style.transform = `scale(${unref(scale)})`;\n  }\n</script>\n\n<style scoped lang=\"less\">\n.amplify-image{\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1000;\n  background: rgba(0, 0, 0, 0.5);\n  .img-preview-content{\n    display: flex;\n    width: 100%;\n    height: 100%;\n    color: #fff;\n    justify-content: center;\n    align-items: center;\n    touch-action: none;\n    -webkit-user-drag: none;\n    img{\n      transition: transform 0.3s;\n      background-position: center center;\n      background-repeat: no-repeat;\n      -webkit-background-size: cover;\n      -moz-background-size: cover;\n      background-size: cover;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/hooks/useChat.ts",
    "content": "import { useChatStore } from '@/store';\n\nexport function useChat() {\n  const chatStore = useChatStore();\n\n  const getChatByUuidAndIndex = (uuid: number, index: number) => {\n    return chatStore.getChatByUuidAndIndex(uuid, index);\n  };\n\n  const addChat = (uuid: number, chat: Chat.Chat) => {\n    chatStore.addChatByUuid(uuid, chat);\n  };\n\n  const updateChat = (uuid: number, index: number, chat: Chat.Chat) => {\n    chatStore.updateChatByUuid(uuid, index, chat);\n  };\n\n  const updateChatSome = (uuid: number, index: number, chat: Partial<Chat.Chat>) => {\n    chatStore.updateChatSomeByUuid(uuid, index, chat);\n  };\n\n  return {\n    addChat,\n    updateChat,\n    updateChatSome,\n    getChatByUuidAndIndex,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/hooks/useScroll.ts",
    "content": "import type { Ref } from 'vue';\nimport { nextTick, ref } from 'vue';\n\ntype ScrollElement = HTMLDivElement | null;\n\ninterface ScrollReturn {\n  scrollRef: Ref<ScrollElement>;\n  scrollToBottom: () => Promise<void>;\n  scrollToTop: () => Promise<void>;\n  scrollToBottomIfAtBottom: () => Promise<void>;\n}\n\nexport function useScroll(): ScrollReturn {\n  const scrollRef = ref<ScrollElement>(null);\n\n  const scrollToBottom = async () => {\n    await nextTick();\n    if (scrollRef.value) scrollRef.value.scrollTop = scrollRef.value.scrollHeight;\n  };\n\n  const scrollToTop = async () => {\n    await nextTick();\n    if (scrollRef.value) scrollRef.value.scrollTop = 0;\n  };\n\n  const scrollToBottomIfAtBottom = async () => {\n    await nextTick();\n    if (scrollRef.value) {\n      const threshold = 100; // Threshold, indicating the distance threshold to the bottom of the scroll bar.\n      const distanceToBottom = scrollRef.value.scrollHeight - scrollRef.value.scrollTop - scrollRef.value.clientHeight;\n      if (distanceToBottom <= threshold) scrollRef.value.scrollTop = scrollRef.value.scrollHeight;\n    }\n  };\n\n  return {\n    scrollRef,\n    scrollToBottom,\n    scrollToTop,\n    scrollToBottomIfAtBottom,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/jeecg-tags/index.ts",
    "content": "import type { JeecgTag } from './types';\nimport { shallowRef } from 'vue';\n\nimport ToolExecTag from './tool-exec';\nimport JeecgChart from \"./jeecg-chart\";\n\nexport const jeecgTagMap: Map<string, JeecgTag> = new Map();\n// 所有 jeecg 标签名称列表\nexport const tagNames: string[] = [];\n\n// 注册 工具调用 标签\nuseJeecgTag(ToolExecTag);\n// 注册 图表渲染 标签\nuseJeecgTag(JeecgChart);\n\n// jeecg 标签统一的 class 名称\nexport const JEECG_TAG_CLASS = 'jeecg-tag';\n\n/**\n * 忽略 jeecg 自定义标签的解析\n * @param md\n */\nexport function mdPluginJeecgTag(md: any) {\n  // 保存原始的 html_block  渲染规则\n  const htmlBlockOrigin =\n    md.renderer.rules.html_block ||\n    function (tokens, idx) {\n      return tokens[idx].content;\n    };\n\n  // 覆盖 html_block  渲染规则\n  md.renderer.rules.html_block = function (tokens, idx) {\n    const token = tokens[idx];\n    const content = token.content;\n\n    let isJeecgTag = false;\n    let tagName = '';\n\n    for (const name of tagNames) {\n      // 检查内容是否包含自定义标签的起始或结束标签\n      const startTag = new RegExp(`<${name}(\\\\s|>)`, 'i');\n      const endTag = new RegExp(`</${name}>`, 'i');\n      if (startTag.test(content) || endTag.test(content)) {\n        isJeecgTag = true;\n        tagName = name;\n        break;\n      }\n    }\n\n    // jeecg 自定义标签\n    if (isJeecgTag) {\n      const box = document.createElement('div');\n      box.innerHTML = content;\n      const tag = box.firstElementChild!;\n      tag.classList.add(JEECG_TAG_CLASS);\n      return tag.outerHTML;\n    }\n\n    // 其他 HTML 标签按默认方式渲染\n    return htmlBlockOrigin(tokens, idx);\n  };\n}\n\nexport function useJeecgTag(tag: JeecgTag) {\n  if (jeecgTagMap.has(tag.name)) {\n    return;\n  }\n  tag.component = shallowRef(tag.component);\n  jeecgTagMap.set(tag.name, tag);\n  tagNames.push(tag.name);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/jeecg-tags/jeecg-chart/ChartRender.vue",
    "content": "<template>\n  <div class=\"ai-chat-chart\">\n    <div v-if=\"isError\" class=\"ai-chat-chart__error\">{{ errorMessage }}</div>\n    <div v-else-if=\"!resolvedType || !hasData\" class=\"ai-chat-chart__error\">\n      <div v-if=\"loading\"\n           style=\"color: #999; padding: 12px 8px; border: 1px dashed #eee; margin: 8px 0; border-radius: 4px;\">\n        <span>图表渲染中...</span>\n      </div>\n      <span v-else>模型返回的图表渲染格式不正确，请优化提示词或重新尝试。</span>\n    </div>\n    <div v-else class=\"ai-chat-chart__body\">\n      <!-- 折线图 -->\n      <LineMulti v-if=\"resolvedType === 'line'\" v-bind=\"lineProps\"/>\n      <!-- 柱状图 -->\n      <BarMulti v-else-if=\"resolvedType === 'bar'\" v-bind=\"barProps\"/>\n      <!-- 饼图 -->\n      <Pie v-else-if=\"resolvedType === 'pie'\" v-bind=\"pieProps\"/>\n      <!-- 多列柱状图 -->\n      <BarMulti v-else-if=\"resolvedType === 'multibar'\" v-bind=\"multiBarProps\"/>\n      <!-- 多行折线图 -->\n      <LineMulti v-else-if=\"resolvedType === 'multiline'\" v-bind=\"multiLineProps\"/>\n      <!-- 折柱图 -->\n      <BarAndLine v-else-if=\"resolvedType === 'barline'\" v-bind=\"barLineProps\"/>\n      <!-- 面积图 -->\n      <SingleLine v-else-if=\"resolvedType === 'area'\" v-bind=\"areaLineProps\"/>\n      <!-- 雷达图 -->\n      <Radar v-else-if=\"resolvedType === 'radar'\" v-bind=\"radarProps\"/>\n      <!-- 仪表盘 -->\n      <Gauge v-else-if=\"resolvedType === 'gauge'\" v-bind=\"gaugeProps\"/>\n\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { ChartType } from './types';\nimport { computed, ref, watchEffect } from 'vue';\nimport LineMulti from '/@/components/chart/LineMulti.vue';\nimport BarMulti from '/@/components/chart/BarMulti.vue';\nimport Pie from '/@/components/chart/Pie.vue';\nimport Radar from '/@/components/chart/Radar.vue';\nimport Gauge from '/@/components/chart/Gauge.vue';\nimport BarAndLine from '/@/components/chart/BarAndLine.vue';\nimport SingleLine from '/@/components/chart/SingleLine.vue';\n\nconst props = defineProps({\n  /**\n   * 图表配置字符串，示例：\n   * {\"type\":\"bar\",\"data\":[{\"x\":\"数据项1\",\"y\":100},{\"x\":\"数据项2\",\"y\":80}]}\n   */\n  data: {\n    type: String,\n    required: true,\n  },\n  loading: {\n    type: Boolean,\n    default: false,\n  },\n});\n\n/**\n * 解析失败或类型错误的提示文本。\n */\nconst errorMessage = ref<string>('');\n/**\n * 是否存在阻止渲染的错误。\n */\nconst isError = ref<boolean>(false);\n\n/**\n * 将字符串解析为配置对象，失败时记录错误信息。\n */\nconst parsedConfig = computed<Recordable>(() => {\n  try {\n    errorMessage.value = '';\n    isError.value = false;\n    return JSON.parse(props.data || '{}');\n  } catch (error) {\n    errorMessage.value = '图表数据解析错误，无法渲染图表。';\n    isError.value = true;\n    return {};\n  }\n});\n\n/**\n * 支持的图表类型集合。\n */\n// 支持的类型覆盖常见图表，名称与提示词保持宽松映射\nconst supportedTypes: ChartType[] = ['bar', 'line', 'pie', 'radar', 'gauge', 'barline', 'multibar', 'multiline', 'area'];\n\n/**\n * 解析得到的图表类型，统一小写后做合法性校验。\n */\nconst resolvedType = computed<ChartType>(() => {\n  const rawType = String((parsedConfig.value as any).type || '').toLowerCase();\n  const normalizedType = (rawType || '').replace(/[-_\\s]/g, '');\n  const typeAliasMap: Record<string, ChartType> = {\n    bar: 'bar',\n    line: 'line',\n    pie: 'pie',\n    radar: 'radar',\n    gauge: 'gauge',\n    barline: 'barline',\n    barandline: 'barline',\n    linebar: 'barline',\n    multiline: 'multiline',\n    multibar: 'multibar',\n    area: 'area',\n    arealine: 'area',\n  };\n  const mapped = typeAliasMap[normalizedType] || '';\n  if (mapped && supportedTypes.includes(mapped)) {\n    return mapped as ChartType;\n  }\n  return '';\n});\n\n/**\n * 当类型不被支持时，给出错误提示。\n */\nwatchEffect(() => {\n  if (isError.value) {\n    return;\n  }\n  if (resolvedType.value === '') {\n    const typeValue = (parsedConfig.value as any).type;\n    if (typeValue) {\n      errorMessage.value = '当前仅支持 bar、line、pie、radar、gauge、barline、multibar、multiline、area 类型图表。';\n      isError.value = true;\n    }\n  } else {\n    errorMessage.value = '';\n    isError.value = false;\n  }\n});\n\n/**\n * 原始数据列表。\n */\nconst rawData = computed<unknown>(() => (parsedConfig.value as any).data);\n\n/**\n * 判断是否存在可用的数据数组。\n */\nconst hasData = computed<boolean>(() => {\n  if (resolvedType.value === 'gauge') {\n    return Boolean(rawData.value);\n  }\n  return Array.isArray(rawData.value) && rawData.value.length > 0;\n});\n\n/**\n * 将原始数据标准化为多序列图表所需的结构。\n */\nconst multiSeriesData = computed<Recordable[]>(() => {\n  if (!Array.isArray(rawData.value)) {\n    return [];\n  }\n  return rawData.value.map((item: Recordable) => buildMultiSeriesItem(item));\n});\n\n/**\n * 面积折线与多行折线共享的数据结构，透传 seriesType 控制折线类型。\n */\nconst areaSeriesData = computed<Recordable[]>(() => {\n  if (!Array.isArray(rawData.value)) {\n    return [];\n  }\n  return rawData.value.map((item: Recordable) => {\n    return {\n      ...buildMultiSeriesItem(item),\n      seriesType: item && item.seriesType ? String(item.seriesType) : 'line',\n      areaStyle: {},\n    };\n  });\n});\n\n/**\n * 将原始数据标准化为饼图所需的结构。\n */\nconst pieSeriesData = computed<Recordable[]>(() => {\n  if (!Array.isArray(rawData.value)) {\n    return [];\n  }\n  return rawData.value.map((item: Recordable) => {\n    return {\n      name: resolveName(item),\n      value: resolveNumber(item),\n    };\n  });\n});\n\n/**\n * 构建多序列图表需要的标准化数据项。\n */\nfunction buildMultiSeriesItem(item: Recordable): Recordable {\n  const seriesName = resolveSeriesName(item);\n  const name = resolveName(item);\n  const value = resolveNumber(item);\n  return {type: seriesName, name, value};\n}\n\n/**\n * 解析系列名称，优先使用 series，其次使用 type，最后回退为“数据”。\n */\nfunction resolveSeriesName(item: Recordable): string {\n  if (item && item.series !== undefined) {\n    return String(item.series);\n  }\n  if (item && item.type !== undefined) {\n    return String(item.type);\n  }\n  return '数据';\n}\n\n/**\n * 解析横轴名称，支持 x 与 name 字段。\n */\nfunction resolveName(item: Recordable): string {\n  if (item && item.x !== undefined) {\n    return String(item.x);\n  }\n  if (item && item.name !== undefined) {\n    return String(item.name);\n  }\n  return '';\n}\n\n/**\n * 解析数值字段，支持 y 与 value，非数字时回退为 0。\n */\nfunction resolveNumber(item: Recordable): number {\n  const rawValue = item ? item.y ?? item.value : null;\n  const num = Number(rawValue);\n  if (Number.isFinite(num)) {\n    return num;\n  }\n  return 0;\n}\n\n/**\n * 解析序列类型，折柱图需要区分 bar / line。\n */\nfunction resolveSeriesType(item: Recordable): string {\n  if (item && item.seriesType !== undefined) {\n    return String(item.seriesType);\n  }\n  return 'bar';\n}\n\n/**\n * 仪表盘数据，允许数组或对象输入，确保返回 name、value。\n */\nconst gaugeData = computed(() => {\n  const dataSource = rawData.value as any;\n  if (Array.isArray(dataSource) && dataSource.length > 0) {\n    const item = dataSource[0];\n    return { name: resolveName(item) || '仪表盘', value: resolveNumber(item) };\n  }\n  if (dataSource && typeof dataSource === 'object') {\n    return { name: resolveName(dataSource) || '仪表盘', value: resolveNumber(dataSource as Recordable) };\n  }\n  return { name: '仪表盘', value: 0 };\n});\n\n/**\n * 雷达图数据，支持 max 字段定义指标上限。\n */\nconst radarSeriesData = computed<Recordable[]>(() => {\n  if (!Array.isArray(rawData.value)) {\n    return [];\n  }\n  return rawData.value.map((item: Recordable) => {\n    return {\n      type: resolveSeriesName(item),\n      name: resolveName(item),\n      value: resolveNumber(item),\n      max: item && item.max !== undefined ? Number(item.max) : undefined,\n    };\n  });\n});\n\n/**\n * 折柱图数据，附带 seriesType 用于区分柱/线。\n */\nconst barLineSeriesData = computed<Recordable[]>(() => {\n  if (!Array.isArray(rawData.value)) {\n    return [];\n  }\n  return rawData.value.map((item: Recordable) => {\n    return {\n      ...buildMultiSeriesItem(item),\n      seriesType: resolveSeriesType(item),\n    };\n  });\n});\n\n/**\n * 折线图的渲染属性。\n */\nconst lineProps = computed(() => {\n  return {\n    type: 'line',\n    height: '360px',\n    width: '100%',\n    chartData: multiSeriesData.value,\n  };\n});\n\n/**\n * 柱状图的渲染属性。\n */\nconst barProps = computed(() => {\n  return {\n    height: '360px',\n    width: '100%',\n    chartData: multiSeriesData.value,\n  };\n});\n\n/**\n * 饼图的渲染属性。\n */\nconst pieProps = computed(() => {\n  return {\n    height: '360px',\n    width: '100%',\n    chartData: pieSeriesData.value,\n  };\n});\n\n/**\n * 多列柱状图配置，与 bar 相同但允许区分类型前缀。\n */\nconst multiBarProps = computed(() => {\n  return {\n    height: '360px',\n    width: '100%',\n    chartData: multiSeriesData.value,\n    option: parsedConfig.value.option || {},\n  };\n});\n\n/**\n * 多行折线图配置。\n */\nconst multiLineProps = computed(() => {\n  return {\n    type: 'line',\n    height: '360px',\n    width: '100%',\n    chartData: multiSeriesData.value,\n    option: parsedConfig.value.option || {},\n  };\n});\n\n/**\n * 面积折线图配置，开启面积样式。\n */\nconst areaLineProps = computed(() => {\n  return {\n    type: 'line',\n    height: '360px',\n    width: '100%',\n    chartData: areaSeriesData.value,\n    option: { ...(parsedConfig.value.option || {}), areaStyle: {} },\n  };\n});\n\n/**\n * 雷达图配置。\n */\nconst radarProps = computed(() => {\n  return {\n    height: '420px',\n    width: '100%',\n    chartData: radarSeriesData.value,\n    option: parsedConfig.value.option || {},\n  };\n});\n\n/**\n * 仪表盘配置。\n */\nconst gaugeProps = computed(() => {\n  return {\n    height: '360px',\n    width: '100%',\n    chartData: gaugeData.value,\n    option: parsedConfig.value.option || {},\n    seriesColor: (parsedConfig.value as any).seriesColor || undefined,\n  };\n});\n\n/**\n * 折柱图配置，支持自定义颜色。\n */\nconst barLineProps = computed(() => {\n  return {\n    height: '360px',\n    width: '100%',\n    chartData: barLineSeriesData.value,\n    customColor: (parsedConfig.value as any).colors || [],\n    option: parsedConfig.value.option || {},\n  };\n});\n</script>\n\n<style scoped lang=\"less\">\n\n.ai-chat-chart {\n  width: 100%;\n  min-width: 360px;\n  padding: 12px 0;\n}\n\n.ai-chat-chart__body {\n  width: 100%;\n}\n\n.ai-chat-chart__error {\n  color: #ff4d4f;\n  font-size: 14px;\n  line-height: 20px;\n}\n\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/jeecg-tags/jeecg-chart/index.ts",
    "content": "import { JeecgTag } from '../types';\n\nimport ChartRender from './ChartRender.vue';\n\nconst Tag: JeecgTag = {\n  name: 'jeecg-chart',\n  component: ChartRender,\n};\n\nexport default Tag;\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/jeecg-tags/jeecg-chart/types.ts",
    "content": "/**\n * 支持的图表类型\n */\nexport type ChartType = 'bar' | 'line' | 'pie' | 'radar' | 'gauge' | 'barline' | 'multibar' | 'multiline' | 'area' | '';\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/jeecg-tags/tool-exec/JeecgToolExec.vue",
    "content": "<template>\n  <div class=\"tool-exec-wrapper\">\n    <div v-if=\"!toolRecord\" class=\"tool-exec-empty\">暂无工具调用结果</div>\n    <div v-else-if=\"toolRecord.loading\" class=\"tool-exec-loading\">\n      <LoadingOutlined spin/>\n      <span style=\"margin-left: 8px;\">正在运行 {{ titleText }}</span>\n    </div>\n    <div v-else class=\"tool-exec-list\">\n      <div class=\"tool-exec-card\">\n        <div class=\"card-header\" @click=\"toggleCard()\">\n          <div class=\"header-left\">\n            <span class=\"status-icon\" :class=\"`status-${resolvedStatus}`\"></span>\n            <div class=\"title-block\">\n              <div class=\"title-text\">\n                <span class=\"status-text\">{{ statusLabel }}</span>\n                <span>{{ titleText }}</span>\n              </div>\n              <div class=\"subtitle-text\" v-if=\"toolRecord.subtitle\">\n                <span>{{ toolRecord.subtitle }}</span>\n              </div>\n            </div>\n          </div>\n          <div class=\"header-right\">\n            <!-- <span class=\"collapse-text\">{{ expanded ? '收起' : '展开' }}</span>-->\n            <span class=\"collapse-icon\" :class=\"{ opened: expanded }\">\n              <DownOutlined/>\n            </span>\n          </div>\n        </div>\n        <div v-if=\"expanded\" class=\"card-body\">\n          <div class=\"section\">\n            <div class=\"section-title\">输入</div>\n            <pre class=\"section-content\">{{ formattedInput }}</pre>\n          </div>\n          <div class=\"section\">\n            <div class=\"section-title\">输出</div>\n            <pre class=\"section-content\">{{ formattedOutput }}</pre>\n          </div>\n          <div v-if=\"toolRecord.errorMessage\" class=\"section\">\n            <div class=\"section-title\">错误信息</div>\n            <pre class=\"section-content\">{{ formattedError }}</pre>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\nimport { DownOutlined, LoadingOutlined } from '@ant-design/icons-vue';\n\n/**\n * 工具调用结果记录类型\n */\ntype ToolExecStatus = 'success' | 'running' | 'error';\n\n/**\n * 工具调用展示记录\n */\ninterface ToolExecRecord {\n  id: string;\n  name: string;\n  mcpName?: string;\n  input: string;\n  output: string;\n  loading: boolean;\n  hasError: boolean;\n\n  subtitle?: string;\n  errorMessage?: string;\n}\n\nconst props = defineProps({\n  data: {\n    type: String,\n    required: true,\n  },\n  loading: {\n    type: Boolean,\n    default: false,\n  },\n});\n\n/**\n * 解析 props.data 为单条记录\n */\nconst parsedRecord = computed<ToolExecRecord | null>(() => {\n  try {\n    const value = JSON.parse(props.data);\n    if (value && typeof value === 'object' && !Array.isArray(value)) {\n      return value as ToolExecRecord;\n    }\n    return null;\n  } catch (error) {\n    return null;\n  }\n});\n\n/**\n * 归一化后的单条记录，补齐常用字段\n */\nconst toolRecord = computed<ToolExecRecord | null>(() => {\n  const item = parsedRecord.value;\n  if (!item) {\n    return null;\n  }\n  return {\n    ...item,\n    status: status,\n    toolName: item.name,\n    input: item.input ?? (item as any).request ?? (item as any).payload ?? (item as any).args,\n    output: item.output ?? (item as any).response ?? (item as any).result,\n    errorMessage: '',\n  } as ToolExecRecord;\n});\n\n/**\n * 单卡片展开状态\n */\nconst expanded = ref<boolean>(false);\n\n/**\n * 状态文本映射\n */\nconst statusLabelMap: Record<ToolExecStatus, string> = {\n  success: '已运行',\n  running: '执行中',\n  error: '执行失败',\n};\n\n/**\n * 已解析状态\n */\nconst resolvedStatus = computed<ToolExecStatus>(() => {\n  const record = toolRecord.value;\n  if (record) {\n    if (record.loading === true) {\n      return 'running';\n    }\n    if (record.hasError === true) {\n      return 'error';\n    }\n  }\n  return 'success';\n});\n\n/**\n * 状态标签文案\n */\nconst statusLabel = computed<string>(() => {\n  const current = resolvedStatus.value;\n  return statusLabelMap[current];\n});\n\n/**\n * 卡片标题\n */\nconst titleText = computed<string>(() => {\n  if (toolRecord.value) {\n    const parts: string[] = [];\n    if (toolRecord.value.name) {\n      parts.push(toolRecord.value.name as string);\n    }\n    if (toolRecord.value.mcpName) {\n      parts.push(toolRecord.value.mcpName as string);\n    }\n    if (parts.length > 0) {\n      return parts.join(' - ');\n    }\n  }\n  return '工具调用';\n});\n\n/**\n * 输入、输出、错误信息格式化\n */\nconst formattedInput = computed<string>(() => {\n  return formatData(toolRecord.value ? toolRecord.value.input : '');\n});\n\nconst formattedOutput = computed<string>(() => {\n  return formatData(toolRecord.value ? toolRecord.value.output : '');\n});\n\nconst formattedError = computed<string>(() => {\n  return formatData(toolRecord.value ? toolRecord.value.errorMessage : '');\n});\n\n/**\n * 切换卡片展开状态\n */\nfunction toggleCard(): void {\n  const next = !expanded.value;\n  expanded.value = next;\n}\n\n/**\n * 序列化输入或输出数据，保证预格式化可读\n * @param value 输入或输出值\n */\nfunction formatData(value: unknown): string {\n  if (value === null || value === undefined) {\n    return '';\n  }\n  if (typeof value === 'string') {\n    const trimmed = value.trim();\n    if (trimmed.length === 0) {\n      return '';\n    }\n    try {\n      const parsed = JSON.parse(trimmed);\n      return JSON.stringify(parsed, null, 2);\n    } catch (error) {\n      return value;\n    }\n  }\n  try {\n    return JSON.stringify(value, null, 2);\n  } catch (error) {\n    return String(value);\n  }\n}\n\n</script>\n\n<style scoped lang=\"less\">\n.tool-exec-wrapper {\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n  font-size: 14px;\n  line-height: 1.5;\n  color: #333;\n}\n\n.tool-exec-loading,\n.tool-exec-empty {\n  padding: 12px 16px;\n  border: 1px dashed #d9d9d9;\n  border-radius: 8px;\n  background-color: #fafafa;\n}\n\n.tool-exec-list {\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n}\n\n.tool-exec-card {\n  border: 1px solid #e5e6eb;\n  border-radius: 10px;\n  background-color: #fff;\n  overflow: hidden;\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.03);\n}\n\n.card-header {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 12px 14px;\n  cursor: pointer;\n  transition: background-color 0.2s ease;\n}\n\n.card-header:hover {\n  background-color: #f7f8fa;\n}\n\n.header-left {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n}\n\n.status-icon {\n  width: 14px;\n  height: 14px;\n  border-radius: 50%;\n  border: 2px solid #c8c9cc;\n  background-color: #fff;\n}\n\n.status-success {\n  border-color: #52c41a;\n  background-color: #f6ffed;\n}\n\n.status-running {\n  border-color: #1677ff;\n  background-color: #e6f4ff;\n}\n\n.status-error {\n  border-color: #ff4d4f;\n  background-color: #fff1f0;\n}\n\n.title-block {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n}\n\n.title-text {\n  font-weight: 600;\n\n  .status-text {\n    margin-right: 6px;\n    font-weight: normal;\n  }\n}\n\n.subtitle-text {\n  font-size: 12px;\n  color: #666;\n}\n\n.header-right {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  color: #555;\n  font-size: 13px;\n}\n\n.status-text {\n  font-weight: 500;\n}\n\n.collapse-text {\n  font-size: 12px;\n}\n\n.collapse-icon {\n  display: inline-flex;\n  align-items: center;\n  transition: transform 0.2s ease;\n\n  &.opened {\n    transform: rotate(180deg);\n  }\n}\n\n.card-body {\n  padding: 0 14px 14px 14px;\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n}\n\n.section {\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n}\n\n.section-title {\n  font-weight: 600;\n  font-size: 13px;\n}\n\n.section-content {\n  margin: 0;\n  padding: 10px 12px;\n  border-radius: 8px;\n  background-color: #f8f8f8;\n  border: 1px solid #e5e6eb;\n  font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;\n  white-space: pre-wrap;\n  word-break: break-word;\n  overflow: auto;\n}\n\n.section-content:empty {\n  display: none;\n}\n\n@media (max-width: 600px) {\n  .card-header {\n    flex-direction: column;\n    align-items: flex-start;\n    gap: 8px;\n  }\n\n  .header-right {\n    width: 100%;\n    justify-content: flex-end;\n  }\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/jeecg-tags/tool-exec/index.ts",
    "content": "import { JeecgTag } from '../types';\n\nimport JeecgToolExec from './JeecgToolExec.vue';\n\nconst Tag: JeecgTag = {\n  name: 'jeecg-tool-exec',\n  component: JeecgToolExec,\n};\n\nexport default Tag;\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/jeecg-tags/types.ts",
    "content": "import { Component } from 'vue';\n\n/**\n * JeecgTag类型\n */\nexport type JeecgTag = {\n  name: string;\n  component: Component;\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/js/chat.js",
    "content": "// iframe-widget.js\n(function () {\n  let widgetInstance = null;\n  const defaultConfig = {\n    // 支持'top-left'左上, 'top-right'右上, 'bottom-left'左下, 'bottom-right'右下\n    iconPosition: 'bottom-right',\n    //图标的大小\n    iconSize: '45px',\n    //图标的颜色\n    iconColor: '#155eef',\n    //必填不允许修改\n    appId: '',\n    //聊天弹窗的宽度\n    chatWidth: '800px',\n    //聊天弹窗的高度\n    chatHeight: '700px',\n  };\n\n  /**\n   * 创建ai图标\n   * @param config\n   */\n  function createAiChat(config) {\n    // 单例模式，确保只存在一个实例\n    if (widgetInstance) {\n      return;\n    }\n\n    // 合并配置\n    const finalConfig = { ...defaultConfig, ...config };\n\n    if (!finalConfig.appId) {\n      console.error('appId为空！');\n      return;\n    }\n    let body = document.body;\n    body.style.margin = \"0\";\n    // 创建容器\n    const container = document.createElement('div');\n    container.style.cssText = `\n            position: fixed;\n            z-index: 998;\n            ${getPositionStyles(finalConfig.iconPosition)}\n            cursor: pointer;\n        `;\n    // 创建图标\n    const icon = document.createElement('div');\n    icon.style.cssText = `\n            width: ${finalConfig.iconSize};\n            height: ${finalConfig.iconSize};\n            background-color: ${finalConfig.iconColor};\n            border-radius: 50%;\n            box-shadow: #cccccc 0 4px 8px 0;\n            padding: 10px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            color: white;\n            box-sizing: border-box;\n        `;\n    icon.innerHTML =\n      '<svg xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" role=\"img\" viewBox=\"0 0 1024 1024\" class=\"iconify iconify--ant-design\"><path fill=\"currentColor\" d=\"M573 421c-23.1 0-41 17.9-41 40s17.9 40 41 40c21.1 0 39-17.9 39-40s-17.9-40-39-40m-280 0c-23.1 0-41 17.9-41 40s17.9 40 41 40c21.1 0 39-17.9 39-40s-17.9-40-39-40\"></path><path fill=\"currentColor\" d=\"M894 345c-48.1-66-115.3-110.1-189-130v.1c-17.1-19-36.4-36.5-58-52.1c-163.7-119-393.5-82.7-513 81c-96.3 133-92.2 311.9 6 439l.8 132.6c0 3.2.5 6.4 1.5 9.4c5.3 16.9 23.3 26.2 40.1 20.9L309 806c33.5 11.9 68.1 18.7 102.5 20.6l-.5.4c89.1 64.9 205.9 84.4 313 49l127.1 41.4c3.2 1 6.5 1.6 9.9 1.6c17.7 0 32-14.3 32-32V753c88.1-119.6 90.4-284.9 1-408M323 735l-12-5l-99 31l-1-104l-8-9c-84.6-103.2-90.2-251.9-11-361c96.4-132.2 281.2-161.4 413-66c132.2 96.1 161.5 280.6 66 412c-80.1 109.9-223.5 150.5-348 102m505-17l-8 10l1 104l-98-33l-12 5c-56 20.8-115.7 22.5-171 7l-.2-.1C613.7 788.2 680.7 742.2 729 676c76.4-105.3 88.8-237.6 44.4-350.4l.6.4c23 16.5 44.1 37.1 62 62c72.6 99.6 68.5 235.2-8 330\"></path><path fill=\"currentColor\" d=\"M433 421c-23.1 0-41 17.9-41 40s17.9 40 41 40c21.1 0 39-17.9 39-40s-17.9-40-39-40\"></path></svg>';\n\n    // 创建iframe容器\n    const iframeContainer = document.createElement('div');\n    let right = finalConfig.chatWidth === '100%' ? '0' : '10px';\n    let bottom = finalConfig.chatHeight === '100%' ? '0' : '10px';\n    let chatWidth = finalConfig.chatWidth;\n    let chatHeight = finalConfig.chatHeight;\n    if(isMobileDevice()){\n      chatWidth = \"100%\";\n      chatHeight = \"100%\";\n      right = '0';\n      bottom = '0';\n    }\n    iframeContainer.style.cssText = `\n            position: fixed;\n            right: ${right};\n            bottom: ${bottom};\n            width: ${chatWidth} !important;\n            height: ${chatHeight} !important;\n            background: white;\n            border-radius: 8px;\n            box-shadow: 0 0 20px #cccccc;\n            display: none;\n            z-index: 10000;\n        `;\n\n    // 创建iframe\n    const iframe = document.createElement('iframe');\n    iframe.style.cssText = `\n            width: 100%;\n            height: 100%;\n            border: none;\n            border-radius: 8px;\n        `;\n\n    iframe.id = 'ai-app-chat-document';\n    //update-begin---author:wangshuai---date:2025-04-25---for:【QQYUN-12159】【AI 广告位】让需要自建AI知识库的用户知道如何通过敲敲云搭建自己的AI知识库---\n    iframe.src = getIframeSrc(finalConfig) + '/ai/app/chat/' + finalConfig.appId + \"?source=chatJs\";\n    //update-end---author:wangshuai---date:2025-04-25---for:【QQYUN-12159】【AI 广告位】让需要自建AI知识库的用户知道如何通过敲敲云搭建自己的AI知识库---\n    let iconRight = finalConfig.chatWidth === '100%'?'0':'-6px';\n    let iconTop = finalConfig.chatWidth === '100%'?'0':'-9px';\n    if(isMobileDevice()){\n      iconRight = '2px';\n      iconTop = '2px';\n    }\n    // 创建关闭按钮\n    const closeBtn = document.createElement('div');\n    closeBtn.innerHTML =\n      '<svg xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" role=\"img\" width=\"1em\" height=\"1em\" viewBox=\"0 0 1024 1024\" class=\"iconify iconify--ant-design\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M799.855 166.312c.023.007.043.018.084.059l57.69 57.69c.041.041.052.06.059.084a.1.1 0 0 1 0 .069c-.007.023-.018.042-.059.083L569.926 512l287.703 287.703c.041.04.052.06.059.083a.12.12 0 0 1 0 .07c-.007.022-.018.042-.059.083l-57.69 57.69c-.041.041-.06.052-.084.059a.1.1 0 0 1-.069 0c-.023-.007-.042-.018-.083-.059L512 569.926L224.297 857.629c-.04.041-.06.052-.083.059a.12.12 0 0 1-.07 0c-.022-.007-.042-.018-.083-.059l-57.69-57.69c-.041-.041-.052-.06-.059-.084a.1.1 0 0 1 0-.069c.007-.023.018-.042.059-.083L454.073 512L166.371 224.297c-.041-.04-.052-.06-.059-.083a.12.12 0 0 1 0-.07c.007-.022.018-.042.059-.083l57.69-57.69c.041-.041.06-.052.084-.059a.1.1 0 0 1 .069 0c.023.007.042.018.083.059L512 454.073l287.703-287.702c.04-.041.06-.052.083-.059a.12.12 0 0 1 .07 0Z\"></path></svg>';\n    closeBtn.style.cssText = `\n            position: absolute;\n            margin-top: ${iconTop};\n            right: ${iconRight};\n            cursor: pointer;\n            background: white;\n            width: 25px;\n            height: 25px;\n            border-radius: 50%;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            box-shadow: 0 2px 5px #cccccc;\n        `;\n\n    // 组装元素\n    iframeContainer.appendChild(closeBtn);\n    iframeContainer.appendChild(iframe);\n    document.body.appendChild(iframeContainer);\n    container.appendChild(icon);\n    document.body.appendChild(container);\n\n    // 事件监听\n    icon.addEventListener('click', () => {\n      iframeContainer.style.display = 'block';\n    });\n\n    closeBtn.addEventListener('click', () => {\n      iframeContainer.style.display = 'none';\n    });\n\n    // 保存实例引用\n    widgetInstance = {\n      remove: () => {\n        container.remove();\n        iframeContainer.remove();\n      },\n    };\n  }\n\n  /**\n   * 获取位置信息\n   *\n   * @param position\n   * @returns {*|string}\n   */\n  function getPositionStyles(position) {\n    const positions = {\n      'top-left': 'top: 20px; left: 20px;',\n      'top-right': 'top: 20px; right: 20px;',\n      'bottom-left': 'bottom: 20px; left: 20px;',\n      'bottom-right': 'bottom: 20px; right: 20px;',\n    };\n    return positions[position] || positions['bottom-right'];\n  }\n\n  /**\n   * 获取src地址\n   */\n  function getIframeSrc(finalConfig) {\n    const specificScript = document.getElementById(\"e7e007dd52f67fe36365eff636bbffbd\");\n    if (specificScript) {\n      return specificScript.src.substring(0, specificScript.src.indexOf('/', specificScript.src.indexOf('://') + 3));\n    }\n  }\n\n  /**\n   * 判断是否为手机\n   * @returns {boolean}\n   */\n  function isMobileDevice() {\n    return /Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n  }\n\n  // 暴露全局方法\n  window.createAiChat = createAiChat;\n})();\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/js/useScroll.ts",
    "content": "import type { Ref } from 'vue';\nimport { nextTick, ref } from 'vue';\n\ntype ScrollElement = HTMLDivElement | null;\n\ninterface ScrollReturn {\n  scrollRef: Ref<ScrollElement>;\n  scrollToBottom: () => Promise<void>;\n  scrollToTop: () => Promise<void>;\n  scrollToBottomIfAtBottom: () => Promise<void>;\n}\n\nexport function useScroll(): ScrollReturn {\n  const scrollRef = ref<ScrollElement>(null);\n\n  const scrollToBottom = async () => {\n    await nextTick();\n    if (scrollRef.value) scrollRef.value.scrollTop = scrollRef.value.scrollHeight;\n  };\n\n  const scrollToTop = async () => {\n    await nextTick();\n    if (scrollRef.value) scrollRef.value.scrollTop = 0;\n  };\n\n  const scrollToBottomIfAtBottom = async () => {\n    await nextTick();\n    if (scrollRef.value) {\n      const threshold = 100; // Threshold, indicating the distance threshold to the bottom of the scroll bar.\n      const distanceToBottom = scrollRef.value.scrollHeight - scrollRef.value.scrollTop - scrollRef.value.clientHeight;\n      if (distanceToBottom <= threshold) scrollRef.value.scrollTop = scrollRef.value.scrollHeight;\n    }\n  };\n\n  return {\n    scrollRef,\n    scrollToBottom,\n    scrollToTop,\n    scrollToBottomIfAtBottom,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/portal/AppPortal.vue",
    "content": "<!-- 应用门户 -->\n<template>\n  <div ref=\"portalRef\" class=\"portal-container\" :style=\"portalContainerStyle\">\n    <div class=\"leftArea\" :class=\"[expand ? 'expand' : 'shrink']\">\n      <div class=\"content\">\n        <LeftPortalSession ref=\"leftPortalRef\" @app-click=\"handleAppClick\" @task-click=\"handleTaskClick\"></LeftPortalSession>\n      </div>\n      <div class=\"toggle-btn\" @click=\"handleToggle\">\n        <span class=\"icon\">\n          <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n            <path\n              d=\"M5.64645 3.14645C5.45118 3.34171 5.45118 3.65829 5.64645 3.85355L9.79289 8L5.64645 12.1464C5.45118 12.3417 5.45118 12.6583 5.64645 12.8536C5.84171 13.0488 6.15829 13.0488 6.35355 12.8536L10.8536 8.35355C11.0488 8.15829 11.0488 7.84171 10.8536 7.64645L6.35355 3.14645C6.15829 2.95118 5.84171 2.95118 5.64645 3.14645Z\"\n              fill=\"currentColor\"\n            ></path>\n          </svg>\n        </span>\n      </div>\n    </div>\n    <div class=\"rightArea\" :class=\"[expand ? 'expand' : 'shrink']\">\n      <chat\n        :key=\"uuid\"\n        url=\"/airag/chat/send\"\n        v-if=\"uuid\"\n        :uuid=\"uuid\"\n        :historyData=\"historyData\"\n        type=\"view\"\n        :formState=\"appData\"\n        :prologue=\"appData?.prologue\"\n        :presetQuestion=\"appData?.presetQuestion\"\n        @reload-message-title=\"reloadMessageTitle\"\n        :chatTitle=\"chatTitle\"\n        :conversationSettings=\"getCurrentSettings\"\n        @edit-settings=\"handleEditSettings\"\n        sessionType=\"portal\"\n        ref=\"chatRef\"\n      ></chat>\n      <div v-if=\"showWelcome\" class=\"emptyArea\">\n        <div class=\"welcome-text\">{{ welcomeText }}</div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { computed, ref, watch } from 'vue';\n  import LeftPortalSession from './LeftPortalSession.vue';\n  import chat from '/@/views/super/airag/aiapp/chat/chat.vue';\n  import { defHttp } from '@/utils/http/axios';\n  import { useUserStore } from '@/store/modules/user';\n\n  const portalContainerStyle = ref<any>(null);\n  //应用门户的ref\n  const portalRef = ref();\n  //左侧列表是否展开\n  const expand = ref<any>(true);\n  //左侧列表展开关闭事件\n  const handleToggle = () => {\n    expand.value = !expand.value;\n  };\n  //随机id\n  const uuid = ref<string>('');\n  //历史记录\n  const historyData = ref<any>();\n  //应用数据\n  const appData = ref<any>();\n  //聊天标题\n  const chatTitle = ref<any>();\n  //当前会话的设置\n  const conversationSettings = ref<Record<string, Record<string, any>>>({});\n  // 获取当前会话的设置\n  const getCurrentSettings = computed(() => {\n    return conversationSettings.value[uuid.value] || {};\n  });\n  //对话设置弹窗ref\n  const settingsModalRef = ref();\n  //左侧会话的ref\n  const leftPortalRef = ref();\n  // 欢迎语（取当前登录用户姓名或用户名）\n  const userStore = useUserStore();\n  const welcomeName = computed(() => userStore.getUserInfo?.realname || userStore.getUserInfo?.username || '');\n  const welcomeText = computed(() => (welcomeName.value ? `你好，${welcomeName.value}。准备好开始了吗？` : '你好，准备好开始了吗？'));\n  const showWelcome = ref<boolean>(false);\n\n  // 指定长度和基数\n  const getUuid = (len = 10, radix = 16) => {\n    var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');\n    var uuid: any = [],\n      i;\n    radix = radix || chars.length;\n\n    if (len) {\n      for (i = 0; i < len; i++) uuid[i] = chars[0 | (Math.random() * radix)];\n    } else {\n      var r;\n      uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';\n      uuid[14] = '4';\n      for (i = 0; i < 36; i++) {\n        if (!uuid[i]) {\n          r = 0 | (Math.random() * 16);\n          uuid[i] = chars[i == 19 ? (r & 0x3) | 0x8 : r];\n        }\n      }\n    }\n    return uuid.join('');\n  };\n\n  /**\n   * 重新加载标题\n   * @param title\n   */\n  function reloadMessageTitle(title) {\n    showWelcome.value = false;\n    leftPortalRef.value.addSession(title, uuid.value);\n  }\n\n  // 编辑对话设置\n  function handleEditSettings() {\n    if (settingsModalRef.value) {\n      settingsModalRef.value.open();\n    }\n  }\n\n  /**\n   * 应用数据点击返回事件\n   *\n   * @param value\n   */\n  function handleAppClick(value) {\n    //每次点击都是一个新的会话\n    uuid.value = getUuid(32);\n    appData.value = value;\n    chatTitle.value = appData.value.name;\n    showWelcome.value = true;\n  }\n\n  /**\n   * 回话点击事件\n   *\n   * @param id\n   */\n  function handleTaskClick(id, title) {\n    showWelcome.value = false;\n    uuid.value = id;\n    chatTitle.value = title;\n    //根据选中的id查询聊天内容\n    let params = { conversationId: id, sessionType: 'portal' };\n    //根据id获取历史记录\n    defHttp.get({ url: '/airag/chat/messages', params }, { isTransformResponse: false }).then((res) => {\n      if (res.success) {\n        // 处理新的返回格式（包含messages和flowInputs）\n        if (res.result && res.result.messages) {\n          historyData.value = res.result.messages;\n          if (res.result?.appData) {\n            appData.value = res.result.appData;\n          } else {\n            appData.value = null;\n          }\n          // 加载已保存的设置\n          if (res.result.flowInputs) {\n            conversationSettings.value[id] = res.result.flowInputs;\n          }\n        } else if (Array.isArray(res.result)) {\n          // 兼容旧格式\n          historyData.value = res.result;\n        } else {\n          historyData.value = [];\n        }\n      } else {\n        historyData.value = [];\n      }\n    });\n  }\n\n  // 当 uuid 变化时，清空右侧聊天的会话数据并初始化当前设置，确保开启全新会话\n  watch(\n    () => uuid.value,\n    (newVal) => {\n      if (!newVal) return;\n      // 清空标题与历史记录、防止沿用上一会话数据\n      historyData.value = [];\n      // 初始化当前会话设置容器\n      conversationSettings.value[newVal] = conversationSettings.value[newVal] || {};\n    }\n  );\n\n  watch(\n    () => portalRef.value,\n    () => {\n      if (portalRef.value.offsetHeight) {\n        portalRef.value = { height: `${portalRef.value.offsetHeight} px` };\n      }\n    }\n  );\n</script>\n\n<style lang=\"less\" scoped>\n  @width: 260px;\n  .portal-container {\n    height: 100%;\n    width: 100%;\n    position: absolute;\n    background: white;\n    display: flex;\n    overflow: hidden;\n    z-index: 800;\n    border: 1px solid #eeeeee;\n  }\n  .leftArea {\n    width: @width;\n    transition: 0.3s left;\n    position: absolute;\n    left: 0;\n    height: 100%;\n\n    .content {\n      width: 100%;\n      height: 100%;\n      overflow: hidden;\n    }\n\n    &.shrink {\n      left: -@width;\n\n      .toggle-btn {\n        .icon {\n          transform: rotate(0deg);\n        }\n      }\n    }\n\n    .toggle-btn {\n      transition:\n        color 0.3s cubic-bezier(0.4, 0, 0.2, 1),\n        right 0.3s cubic-bezier(0.4, 0, 0.2, 1),\n        left 0.3s cubic-bezier(0.4, 0, 0.2, 1),\n        border-color 0.3s cubic-bezier(0.4, 0, 0.2, 1),\n        background-color 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n      cursor: pointer;\n      width: 24px;\n      height: 24px;\n      position: absolute;\n      top: 50%;\n      right: 0;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-size: 18px;\n      color: rgb(51, 54, 57);\n      border: 1px solid rgb(239, 239, 245);\n      background-color: #fff;\n      box-shadow: 0 2px 4px 0px #e7e9ef;\n      transform: translateX(50%) translateY(-50%);\n      z-index: 1;\n    }\n\n    .icon {\n      transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n      transform: rotate(180deg);\n      font-size: 18px;\n      height: 18px;\n\n      svg {\n        height: 1em;\n        width: 1em;\n        vertical-align: top;\n      }\n    }\n  }\n\n  .rightArea {\n    margin-left: @width;\n    transition: 0.3s margin-left;\n\n    &.shrink {\n      margin-left: 0;\n    }\n\n    flex: 1;\n    min-width: 0;\n  }\n\n  .emptyArea {\n    position: absolute;\n    top: 45%;\n    left: 45%;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    color: #d4d4d4;\n  }\n  .emptyArea .welcome-text {\n    font-size: 32px;\n    color: #3d4353;\n    font-weight: 600;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/portal/LeftPortalSession.vue",
    "content": "<!-- 左侧应用门户会话设置 -->\n<template>\n  <div class=\"space-page\">\n    <div class=\"header\">\n      <img class=\"header-image\" :src=\"loginLogo\" />\n      <div class=\"header-name\"> JEECG </div>\n    </div>\n    <div class=\"new-session\" @click=\"handleNewSession\">\n      <div class=\"left-box\">\n        <div class=\"app-icon\">\n          <Icon icon=\"ant-design:edit-outlined\" size=\"14\"></Icon>\n        </div>\n        <div class=\"app-name\">新对话</div>\n      </div>\n    </div>\n    <div class=\"session-scroll\">\n      <div class=\"section\">\n        <template v-for=\"app in apps\">\n          <div class=\"app-item\" :class=\"activeKey === app.id ? 'active' : ''\" @click=\"handleAppClick(app)\">\n            <div class=\"app-icon\">\n              <img :src=\"getAiImg(app)\" />\n            </div>\n            <div class=\"app-name\" :title=\"app.name\">{{ app.name }}</div>\n          </div>\n        </template>\n      </div>\n\n      <div class=\"section\">\n        <div class=\"section-title\">历史对话</div>\n        <div v-if=\"tasks.length\" class=\"task-list\">\n          <div v-for=\"task in tasks\" :key=\"task.id\" class=\"task-item\" :class=\"activeKey === task.id ? 'active' : ''\" @click=\"handleTaskClick(task)\">\n            <div class=\"task-title\" :title=\"task.title\" v-if=\"!task.isEdit\">{{ task.title }}</div>\n            <a-input\n              class=\"title\"\n              ref=\"inputRef\"\n              v-if=\"task.isEdit\"\n              :defaultValue=\"task.title\"\n              placeholder=\"请输入标题\"\n              @change=\"handleInputChange\"\n              @keyup.enter=\"inputBlur(task)\"\n            />\n            <div class=\"icon-edit\">\n              <a-space>\n                <span class=\"icon edit\" @click.prevent.stop=\"handleEdit(task)\" v-if=\"!task.isEdit\">\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" role=\"img\" class=\"iconify iconify--ri\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\">\n                    <path\n                      fill=\"currentColor\"\n                      d=\"M6.414 15.89L16.556 5.748l-1.414-1.414L5 14.476v1.414zm.829 2H3v-4.243L14.435 2.212a1 1 0 0 1 1.414 0l2.829 2.829a1 1 0 0 1 0 1.414zM3 19.89h18v2H3z\"\n                    ></path>\n                  </svg>\n                </span>\n                <span class=\"icon del\">\n                  <a-popconfirm\n                    :overlayStyle=\"{ 'z-index': 9999 }\"\n                    title=\"确定删除此记录？\"\n                    placement=\"bottom\"\n                    ok-text=\"确定\"\n                    cancel-text=\"取消\"\n                    @confirm.prevent.stop=\"handleDel(task)\"\n                  >\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" role=\"img\" class=\"iconify iconify--ri\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\">\n                      <path\n                        fill=\"currentColor\"\n                        d=\"M17 6h5v2h-2v13a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V8H2V6h5V3a1 1 0 0 1 1-1h8a1 1 0 0 1 1 1zm1 2H6v12h12zm-9 3h2v6H9zm4 0h2v6h-2zM9 4v2h6V4z\"\n                      ></path>\n                    </svg>\n                  </a-popconfirm>\n                </span>\n              </a-space>\n            </div>\n          </div>\n        </div>\n        <a-empty v-else description=\"暂无历史对话\" />\n      </div>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { onMounted, ref } from 'vue';\n  import { getFileAccessHttpUrl } from '@/utils/common/compUtils';\n  import defaultImg from '@/views/super/airag/aiapp/img/ailogo.png';\n  import { defHttp } from '@/utils/http/axios';\n  import loginLogo from '/@/assets/images/logo.png';\n\n  const emit = defineEmits(['register', 'app-click', 'task-click', 'new-session-click']);\n\n  const defaultApp = ref({\n    id: '1999373661846880258',\n    name: '聊天助手',\n  });\n  //应用列表\n  const apps = ref([\n    {\n      id: '1998717610730352641',\n      name: '帮我写作',\n      icon: 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/upload/test/helpWriting_1765520898059.png',\n      prologue: '请输入\\n出发地：\\n目的地：\\n人数：',\n    },\n    {\n      id: '1996471445272088578',\n      name: '图像识别',\n      icon: 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/1dataOCR_1743065089791.png',\n      prologue: '上传一张图片，我来为你识别图片的内容',\n    },\n    {\n      id: '1902262577996546050',\n      name: '看图说话',\n      icon: 'https://jeecgdev.oss-cn-beijing.aliyuncs.com/temp/工具-图片解析_1743065064801.png',\n      prologue: '上传一张图片，我来为你讲述图片中的故事',\n    },    \n    {\n      id: '2008448202536456193',\n      name: 'Chat2BI',\n      icon: 'https://minio.jeecg.com/otatest/chatShow_1769395642452.png',\n      prologue: '你好，我是Chat2BI 图表生成智能体。',\n      flowId: '2008379264947519489',\n      type: 'chatFLow',\n      presetQuestion: '[{\"key\":1,\"descr\":\"请统计系统用户的性别分布比例，并以饼状图和列表表格展示。\",\"update\":true}]'\n    },    \n    {\n      id: '2008090512835629057',\n      name: 'AI绘画',\n      icon: 'https://minio.jeecg.com/otatest/AiWrite_1769395779558.png',\n      prologue: '你好，我是 AI绘图智能体。',\n      presetQuestion: '[{\"key\":1,\"descr\":\"请生成一张具有日本风格的动漫成年女孩。\",\"update\":true}, {\"key\":2,\"descr\":\"请生成一幅中国神话故事中，手持武器的哪吒形象。\",\"update\":true}]',\n      metadata:\"{\\\"izDraw\\\":\\\"1\\\"}\"\n    },\n  ]);\n\n  //应用数据\n  const appData = ref<any>({});\n\n  //会话\n  const tasks = ref<any>([]);\n\n  /**\n   * 点击的key\n   */\n  const activeKey = ref<string>('');\n\n  /**\n   * 获取图片\n   */\n  const getAiImg = (app) => {\n    return getFileAccessHttpUrl(app?.icon) || defaultImg;\n  };\n  let inputValue: string = '';\n  const handleInputChange = (e) => {\n    inputValue = e.target.value.trim();\n  };\n\n  // 编辑\n  const handleEdit = (item) => {\n    item.isEdit = true;\n    inputValue = item.title;\n  };\n\n  /**\n   * 应用点击事件\n   *\n   * @param app\n   */\n  function handleAppClick(app) {\n    activeKey.value = app.id;\n    appData.value = app;\n    emit('app-click', app);\n  }\n\n  /**\n   * 添加会话\n   */\n  function addSession(title, id) {\n    activeKey.value = id;\n    if (tasks.value?.length > 0) {\n      let findIndex = tasks.value.findIndex((item) => item.id === id);\n      if (findIndex >= 0) {\n        return;\n      }\n    }\n    tasks.value.unshift({ id: id, title: title });\n  }\n\n  /**\n   * 获取会话\n   */\n  async function getSessionList() {\n    const res = await defHttp.get(\n      {\n        url: '/airag/chat/getConversationsByType',\n        params: { sessionType: 'portal' },\n      },\n      { isTransformResponse: false }\n    );\n    if (res && res.success) {\n      tasks.value = res.result;\n    } else {\n      tasks.value = [];\n    }\n    return tasks.value;\n  }\n\n  /**\n   * 会话点击事件\n   *\n   * @param task\n   */\n  function handleTaskClick(task) {\n    if (task.id === activeKey.value) {\n      return;\n    }\n    activeKey.value = task.id;\n    emit('task-click', task.id, task.title);\n  }\n\n  // 失去焦点\n  function inputBlur(item) {\n    item.isEdit = false;\n    item.title = inputValue;\n    defHttp.put(\n      {\n        url: '/airag/chat/conversation/update/title',\n        params: { id: item.id, title: inputValue, sessionType: 'portal' },\n      },\n      { joinParamsToUrl: true }\n    );\n  }\n\n  /**\n   * 删除\n   * @param data\n   */\n  function handleDel(data) {\n    defHttp\n      .delete(\n        {\n          url: '/airag/chat/conversation/' + data.id + '/portal',\n        },\n        { isTransformResponse: false }\n      )\n      .then(() => {\n        getSessionList();\n      });\n  }\n\n  /**\n   * 新对话\n   */\n  function handleNewSession() {\n    activeKey.value = '';\n    emit('app-click', defaultApp.value);\n  }\n\n  onMounted(async () => {\n    activeKey.value = '';\n    const list = await getSessionList();\n    if (list && list.length > 0) {\n      const first = list[0];\n      activeKey.value = first.id;\n      emit('task-click', first.id, first.title);\n    } else {\n      emit('app-click', defaultApp.value);\n    }\n  });\n\n  defineExpose({\n    addSession,\n  });\n</script>\n\n<style scoped lang=\"less\">\n  .space-page {\n    padding: 12px 16px;\n    height: 100%;\n    background: #fbfcff; // 左侧浅色背景，区分右侧\n    border-right: 1px solid #eef2f6; // 与右侧的分隔线\n    display: flex; // 纵向布局，顶部固定，下面滚动\n    flex-direction: column;\n    box-sizing: border-box;\n  }\n\n  .space-header {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    margin-bottom: 8px;\n  }\n\n  .space-title {\n    font-size: 18px;\n    font-weight: 600;\n  }\n\n  .section {\n    margin-top: 12px;\n  }\n\n  .section-title {\n    font-size: 12px;\n    font-weight: 600;\n    margin-bottom: 8px;\n  }\n\n  .app-item {\n    padding: 8px;\n    display: flex;\n    align-items: center;\n    cursor: pointer;\n    margin-bottom: 2px;\n  }\n\n  .app-item:hover {\n    background: rgba(0, 0, 0, 0.04);\n    border-radius: 10px;\n  }\n\n  .app-icon {\n    width: 14px;\n    height: 14px;\n    border-radius: 8px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  }\n\n  .app-name {\n    margin-left: 10px;\n    font-size: 14px;\n    color: #1f2329;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n\n  .new-session {\n    margin-top: 10px;\n    align-items: center;\n    border-radius: 12px;\n    display: flex;\n    justify-content: space-between;\n    flex-shrink: 0;\n    height: 36px;\n    margin-right: 1px;\n    overflow: visible;\n    padding: 6px 10px !important;\n    position: relative;\n    transition: all 0.15s ease-in-out;\n    cursor: pointer;\n    margin-bottom: 2px;\n    border: 1px solid #e0ecff;\n    background: #f5f8ff;\n  }\n\n  .new-session:hover {\n    background: #eaf2ff;\n    border-color: #d4e5ff;\n  }\n\n  .new-session.active {\n    background: #eaf2ff;\n    border-color: #cfe0ff;\n  }\n\n  .new-session .left-box {\n    display: flex;\n    align-items: center;\n  }\n\n  .new-session .app-icon {\n    width: 20px;\n    height: 20px;\n    border-radius: 8px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    background: #eaf2ff;\n    color: #3761eb;\n  }\n\n  .new-session .app-name {\n    margin-left: 10px;\n    font-size: 14px;\n    color: #3761eb;\n    font-weight: 600;\n  }\n\n  .task-list {\n    position: relative;\n  }\n\n  .task-item {\n    align-items: center;\n    border-radius: 12px;\n    display: flex;\n    flex-shrink: 0;\n    height: 36px;\n    margin-right: 1px;\n    overflow: visible;\n    padding: 6px 10px !important;\n    position: relative;\n    transition: all 0.15s ease-in-out;\n    cursor: pointer;\n    margin-bottom: 2px;\n    justify-content: space-between;\n  }\n\n  .task-item:hover {\n    background: rgba(0, 0, 0, 0.04);\n    border-radius: 12px;\n\n    .edit,\n    .del {\n      display: block;\n    }\n  }\n\n  .task-title {\n    font-size: 14px;\n    color: #1f2329;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n\n  .active {\n    background: rgba(0, 0, 0, 0.04);\n    border-radius: 12px;\n    .edit {\n      display: block;\n    }\n  }\n\n  .edit,\n  .del {\n    display: none;\n  }\n\n  .icon-edit {\n    display: flex;\n  }\n  .session-scroll {\n    flex: 1; // 占满剩余空间\n    min-height: 0; // 允许子元素在容器内正确滚动\n    overflow-y: auto; // 仅列表区域滚动\n    margin-bottom: 20px;\n\n    // 自定义滚动条样式\n    &::-webkit-scrollbar {\n      width: 7px;\n      height: 8px;\n    }\n    &::-webkit-scrollbar-thumb {\n      background-color: #d9dfe7;\n      border-radius: 4px;\n    }\n    &::-webkit-scrollbar-track {\n      background-color: transparent;\n    }\n  }\n\n  .header {\n    margin-left: 0;\n    display: flex;\n    height: 40px;\n    padding: 0;\n    background-color: #fff;\n    .header-image {\n      width: 36px;\n      height: 36px;\n    }\n    .header-name {\n      color: rgba(0, 0, 0, 0.85);\n      font-size: 16px;\n      align-self: center;\n      margin-left: 8px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/presetQuestion.vue",
    "content": "<template>\n  <div class=\"presetQuestion-wrap\">\n<!--    <svg\n      v-if=\"btnShow\"\n      class=\"leftBtn\"\n      :class=\"leftBtnStatus\"\n      t=\"1710296339017\"\n      viewBox=\"0 0 1024 1024\"\n      version=\"1.1\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      p-id=\"5070\"\n      @click=\"onScroll('prev')\"\n    >\n      <path\n        d=\"M970.496 543.829333l30.165333-30.165333-415.829333-415.914667a42.837333 42.837333 0 0 0-60.288 0 42.538667 42.538667 0 0 0 0 60.330667l355.413333 355.498667-355.413333 355.285333a42.496 42.496 0 0 0 0 60.288c16.64 16.64 43.861333 16.469333 60.288 0.042667l383.914667-383.701334 1.749333-1.664z\"\n        fill=\"currentColor\"\n        p-id=\"5071\"\n      ></path>\n    </svg>-->\n    <div class=\"content\">\n      <ul ref=\"ulElemRef\">\n        <li v-for=\"(item, index) in data\" :key=\"index\" class=\"item\" @click=\"handleQuestion(item.descr)\">\n          <div class=\"question-descr\">\n            <Icon v-if=\"item.icon\" :icon=\"item.icon\" size=\"20\"></Icon>\n            <svg v-else width=\"14px\" height=\"14px\" viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18.9839 1.85931C19.1612 1.38023 19.8388 1.38023 20.0161 1.85931L20.5021 3.17278C20.5578 3.3234 20.6766 3.44216 20.8272 3.49789L22.1407 3.98392C22.6198 4.1612 22.6198 4.8388 22.1407 5.01608L20.8272 5.50211C20.6766 5.55784 20.5578 5.6766 20.5021 5.82722L20.0161 7.14069C19.8388 7.61977 19.1612 7.61977 18.9839 7.14069L18.4979 5.82722C18.4422 5.6766 18.3234 5.55784 18.1728 5.50211L16.8593 5.01608C16.3802 4.8388 16.3802 4.1612 16.8593 3.98392L18.1728 3.49789C18.3234 3.44216 18.4422 3.3234 18.4979 3.17278L18.9839 1.85931zM13.5482 4.07793C13.0164 2.64069 10.9836 2.64069 10.4518 4.07793L8.99368 8.01834C8.82648 8.47021 8.47021 8.82648 8.01834 8.99368L4.07793 10.4518C2.64069 10.9836 2.64069 13.0164 4.07793 13.5482L8.01834 15.0063C8.47021 15.1735 8.82648 15.5298 8.99368 15.9817L10.4518 19.9221C10.9836 21.3593 13.0164 21.3593 13.5482 19.9221L15.0063 15.9817C15.1735 15.5298 15.5298 15.1735 15.9817 15.0063L19.9221 13.5482C21.3593 13.0164 21.3593 10.9836 19.9221 10.4518L15.9817 8.99368C15.5298 8.82648 15.1735 8.47021 15.0063 8.01834L13.5482 4.07793zM5.01608 16.8593C4.8388 16.3802 4.1612 16.3802 3.98392 16.8593L3.49789 18.1728C3.44216 18.3234 3.3234 18.4422 3.17278 18.4979L1.85931 18.9839C1.38023 19.1612 1.38023 19.8388 1.85931 20.0161L3.17278 20.5021C3.3234 20.5578 3.44216 20.6766 3.49789 20.8272L3.98392 22.1407C4.1612 22.6198 4.8388 22.6198 5.01608 22.1407L5.50211 20.8272C5.55784 20.6766 5.6766 20.5578 5.82722 20.5021L7.14069 20.0161C7.61977 19.8388 7.61977 19.1612 7.14069 18.9839L5.82722 18.4979C5.6766 18.4422 5.55784 18.3234 5.50211 18.1728L5.01608 16.8593z\"></path></svg>\n            <span>{{ item.name }}</span>\n          </div>\n        </li>\n      </ul>\n    </div>\n<!--    <svg\n      v-if=\"btnShow\"\n      class=\"rightBtn\"\n      :class=\"rightBtnStatus\"\n      t=\"1710296339017\"\n      viewBox=\"0 0 1024 1024\"\n      version=\"1.1\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      p-id=\"5070\"\n      @click=\"onScroll('next')\"\n    >\n      <path\n        d=\"M970.496 543.829333l30.165333-30.165333-415.829333-415.914667a42.837333 42.837333 0 0 0-60.288 0 42.538667 42.538667 0 0 0 0 60.330667l355.413333 355.498667-355.413333 355.285333a42.496 42.496 0 0 0 0 60.288c16.64 16.64 43.861333 16.469333 60.288 0.042667l383.914667-383.701334 1.749333-1.664z\"\n        fill=\"currentColor\"\n        p-id=\"5071\"\n      ></path>\n    </svg>-->\n  </div>\n</template>\n\n<script name=\"presetQuestion\" setup lang=\"ts\">\nimport {ref, onMounted, onBeforeUnmount, watch} from 'vue';\n  const emit = defineEmits(['outQuestion']);\n  const props = defineProps({\n    quickCommandData:{ type: Object },\n  });\n  const data = ref(props.quickCommandData);\n  const leftBtnStatus = ref('');\n  const rightBtnStatus = ref('');\n  const rightBtn = ref('');\n  const ulElemRef = ref(null);\n  const btnShow = ref(false);\n  let timer = null;\n  const handleScroll = (e) => {\n    clearTimeout(timer);\n    timer = setTimeout(() => {\n      const scrollLeft = e.target.scrollLeft;\n      const offsetWidth = e.target.offsetWidth;\n      const scrollWidth = e.target.scrollWidth;\n      if (scrollWidth > offsetWidth) {\n        btnShow.value = true;\n      } else {\n        btnShow.value = false;\n      }\n      if (scrollLeft <= 0) {\n        leftBtnStatus.value = 'disabled';\n      } else if (scrollWidth - offsetWidth == scrollLeft) {\n        rightBtnStatus.value = 'disabled';\n      } else {\n        leftBtnStatus.value = '';\n        rightBtnStatus.value = '';\n      }\n    }, 100);\n  };\n  const onScroll = (flag) => {\n    const offsetWidth = ulElemRef.value.offsetWidth;\n    if (flag == 'prev') {\n      ulElemRef.value.scrollLeft = ulElemRef.value.scrollLeft - offsetWidth;\n    } else if (flag == 'next') {\n      ulElemRef.value.scrollLeft = ulElemRef.value.scrollLeft + offsetWidth;\n    }\n  };\n  const handleQuestion = (item) => {\n    emit('outQuestion', item);\n  };\n  \n  watch(()=>props.quickCommandData, (val) => {\n    data.value = props.quickCommandData;\n  })\n  \n  onMounted(() => {\n    ulElemRef.value.addEventListener('scroll', handleScroll, false);\n    handleScroll({ target: ulElemRef.value });\n  });\n  onBeforeUnmount(() => {\n    ulElemRef.value.removeEventListener('scroll', handleScroll);\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .presetQuestion-wrap {\n    display: flex;\n    align-items: center;\n    svg {\n      width: 14px;\n      height: 14px;\n      flex: none;\n      cursor: pointer;\n      color: #c6c2c2;\n      &.leftBtn {\n        transform: rotate(180deg);\n      }\n      &.disabled {\n        opacity: 0.5;\n        pointer-events: none;\n        cursor: default;\n      }\n    }\n    .content {\n      flex: 1;\n      min-width: 0;\n      overflow: hidden;\n    }\n    ul {\n      display: flex;\n      margin-bottom: 0;\n      width: 100%;\n      overflow-y: hidden;\n      overflow-x: auto;\n      /* 隐藏所有滚动条 */\n      &::-webkit-scrollbar {\n        display: none;\n        height: 0;\n        width: 0;\n      }\n    }\n    ul:hover {\n      &::-webkit-scrollbar {\n        display: block;\n        height: 10px;\n        width: 10px;\n      }\n    }\n    .item {\n      border: 1px solid #e6e6e6;\n      border-radius: 16px;\n      cursor: pointer;\n      font-size: 14px;\n      padding: 2px 10px;\n      width: max-content;\n      margin-right: 6px;\n      white-space: nowrap;\n      transition: all 300ms ease;\n      &:last-child {\n        margin-right: 0;\n      }\n      &:hover {\n        color: @primary-color;\n        border-color: @primary-color;\n      }\n    }\n    .question-descr{\n      display: flex;\n      align-items: center;\n      span{\n        margin-left: 4px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/route/register.ts",
    "content": "import type { App } from 'vue';\nimport { router } from \"/@/router\";\nimport type { RouteRecordRaw } from \"vue-router\";\nimport { LAYOUT } from \"@/router/constant\";\n\nconst ChatRoutes: RouteRecordRaw[] = [\n  {\n    path: \"/ai/app/chat/:appId\",\n    name: \"ai-chat-@appId-@modeType\",\n    component: () => import(\"/@/views/super/airag/aiapp/chat/AiChat.vue\"),\n    meta: {\n      title: 'AI聊天',\n      ignoreAuth: true,\n    },\n  },  \n  {\n    path: \"/ai/app/chatIcon/:appId\",\n    name: \"ai-chatIcon-@appId\",\n    component: () => import(\"/@/views/super/airag/aiapp/chat/AiChatIcon.vue\"),\n    meta: {\n      title: 'AI聊天',\n      ignoreAuth: true,\n    },\n  },\n  {\n    path: '/ai/chat',\n    name: 'aiChat',\n    component: LAYOUT,\n    meta: {\n      title: 'ai聊天',\n    },\n    children: [\n      {\n        path: \"/ai/chat/:appId\",\n        name: \"ai-chat-@appId\",\n        component: () => import(\"/@/views/super/airag/aiapp/chat/AiChat.vue\"),\n        meta: {\n          title:'AI助手',\n          ignoreAuth: false,\n        },\n      },\n      {\n        path: \"/ai/chat\",\n        name: \"ai-chat\",\n        component: () => import(\"/@/views/super/airag/aiapp/chat/AiChat.vue\"),\n        meta: {\n          title:'AI助手',\n          ignoreAuth: false,\n        },\n      }\n    ],\n  },\n  {\n    path: '/ai/chat/portal',\n    name: 'ai-chat-portal',\n    component: () => import('/@/views/super/airag/aiapp/chat/portal/AppPortal.vue'),\n    meta: {\n      title: 'AI聊天',\n      ignoreAuth: false,\n    },\n  },\n]\n\n/** 注册路由 */\nexport async function register(app: App) {\n  await registerMyAppRouter(app);\n  console.log('[聊天路由] 注册完成！');\n}\n\nasync function registerMyAppRouter(_: App) {\n  for(let appRoute of ChatRoutes){\n    await router.addRoute(appRoute);\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/slide.vue",
    "content": "<template>\n  <div class=\"slide-wrap\">\n    <div class=\"header\">\n      <img class=\"header-image\" :src=\"getImage()\" />\n      <div class=\"header-name\">{{ appData.name || 'AI助手' }}</div>\n    </div>\n    <div class=\"createArea\">\n      <a-button type=\"dashed\" @click=\"handleCreate\">新建聊天</a-button>\n    </div>\n    <div class=\"historyArea\">\n      <ul>\n        <li\n          v-for=\"(item, index) in dataSource.history\"\n          :key=\"item.id\"\n          class=\"list\"\n          :class=\"[item.id == dataSource.active ? 'active' : 'normal', dataSource.history.length == 1 ? 'last' : '']\"\n          @click=\"handleToggleChat(item, index)\"\n        >\n          <i class=\"icon message\">\n            <svg\n              xmlns=\"http://www.w3.org/2000/svg\"\n              xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n              aria-hidden=\"true\"\n              role=\"img\"\n              class=\"iconify iconify--ri\"\n              width=\"1em\"\n              height=\"1em\"\n              viewBox=\"0 0 24 24\"\n            >\n              <path\n                fill=\"currentColor\"\n                d=\"M2 8.994A5.99 5.99 0 0 1 8 3h8c3.313 0 6 2.695 6 5.994V21H8c-3.313 0-6-2.695-6-5.994zM20 19V8.994A4.004 4.004 0 0 0 16 5H8a3.99 3.99 0 0 0-4 3.994v6.012A4.004 4.004 0 0 0 8 19zm-6-8h2v2h-2zm-6 0h2v2H8z\"\n              ></path>\n            </svg>\n          </i>\n          <a-input\n            class=\"title\"\n            ref=\"inputRef\"\n            v-if=\"item.isEdit\"\n            :defaultValue=\"item.title\"\n            placeholder=\"请输入标题\"\n            @change=\"handleInputChange\"\n            @keyup.enter=\"inputBlur(item)\"\n          />\n          <span class=\"title\" v-else>{{ item.title }}</span>\n          <span class=\"icon edit\" @click.stop=\"handleEdit(item)\" v-if=\"!item.isEdit && !item.disabled\">\n            <svg xmlns=\"http://www.w3.org/2000/svg\" role=\"img\" class=\"iconify iconify--ri\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\">\n              <path\n                fill=\"currentColor\"\n                d=\"M6.414 15.89L16.556 5.748l-1.414-1.414L5 14.476v1.414zm.829 2H3v-4.243L14.435 2.212a1 1 0 0 1 1.414 0l2.829 2.829a1 1 0 0 1 0 1.414zM3 19.89h18v2H3z\"\n              ></path>\n            </svg>\n          </span>\n          <span class=\"icon del\">\n            <a-popconfirm\n              :overlayStyle=\"{ 'z-index': 9999 }\"\n              title=\"确定删除此记录？\"\n              placement=\"bottom\"\n              ok-text=\"确定\"\n              cancel-text=\"取消\"\n              @confirm.stop=\"handleDel(item)\"\n            >\n              <svg xmlns=\"http://www.w3.org/2000/svg\" role=\"img\" class=\"iconify iconify--ri\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\">\n                <path\n                  fill=\"currentColor\"\n                  d=\"M17 6h5v2h-2v13a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V8H2V6h5V3a1 1 0 0 1 1-1h8a1 1 0 0 1 1 1zm1 2H6v12h12zm-9 3h2v6H9zm4 0h2v6h-2zM9 4v2h6V4z\"\n                ></path>\n              </svg>\n            </a-popconfirm>\n          </span>\n        </li>\n      </ul>\n    </div>\n    <div class=\"left-footer\" v-if=\"source!='chatJs'\">\n      AI客服由\n      <a style=\"color: #4183c4;margin-left: 2px;margin-right: 2px\" href=\"https://www.qiaoqiaoyun.com/aiCustomerService\" target=\"_blank\">\n        JEECG AI\n      </a>\n      提供\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\n  import { ref, watch } from 'vue';\n  import { useRouter } from 'vue-router';\n  import { defHttp } from '@/utils/http/axios';\n  import { getFileAccessHttpUrl } from '@/utils/common/compUtils';\n  import defaultImg from '../img/ailogo.png';\n  const props = defineProps(['dataSource', 'appData','source']);\n  const emit = defineEmits(['save', 'click', 'reloadRight', 'prologue']);\n  const inputRef = ref(null);\n  const router = useRouter();\n  let inputValue = '';\n  //新建聊天\n  const handleCreate = () => {\n    const uuid = getUuid();\n    props.dataSource.history.unshift({ title: '新建聊天', id: uuid, isEdit: false, disabled: true });\n    // 新建第一个(需要高亮选中)\n    props.dataSource.active = uuid;\n    emit('click', \"新建聊天\", 0);\n  };\n  // 切换聊天\n  const handleToggleChat = (item, index) => {\n    if (item.id != props.dataSource.active) {\n      props.dataSource.active = item.id;\n      emit('click', item.title, index);\n    }\n  };\n  const handleInputChange = (e) => {\n    inputValue = e.target.value.trim();\n  };\n  // 失去焦点\n  const inputBlur = (item) => {\n    item.isEdit = false;\n    item.title = inputValue;\n    defHttp\n      .put(\n        {\n          url: '/airag/chat/conversation/update/title',\n          params: { id: item.id, title: inputValue },\n        },\n        { joinParamsToUrl: true }\n      )\n      .then((res) => {});\n  };\n  // 编辑\n  const handleEdit = (item) => {\n    console.log(item);\n    item.isEdit = true;\n    inputValue = item.title;\n  };\n  // 保存\n  const handleSave = (item) => {\n    item.isEdit = false;\n    item.title = inputValue;\n  };\n\n  /**\n   * 删除\n   * @param data\n   */\n  function handleDel(data) {\n    const findIndex = props.dataSource.history.findIndex((item) => item.id == data.id);\n    if (findIndex != -1) {\n      props.dataSource.history.splice(findIndex, 1);\n      // 删除的是当前active的，active往前移，前面没了往后移。\n      if (props.dataSource.history.length) {\n        if (props.dataSource.active == data.id) {\n          if (findIndex > 0) {\n            props.dataSource.active = props.dataSource.history[findIndex - 1].id;\n          } else {\n            props.dataSource.active = props.dataSource.history[0].id;\n          }\n        }\n        emit('click', props.dataSource.history[0].title, findIndex);\n      } else {\n        //  删没了（删除了最后一个）\n        handleCreate();\n      }\n    }\n    //update-begin---author:wangshuai---date:2025-03-12---for:【QQYUN-11560】新建聊天内容为空，无法删除---\n    if(data.disabled){\n      return;\n    }\n    //update-end---author:wangshuai---date:2025-03-12---for:【QQYUN-11560】新建聊天内容为空，无法删除---\n    defHttp.delete({\n      url: '/airag/chat/conversation/' + data.id,\n    },{ isTransformResponse: false });\n  }\n\n  /**\n   * 获取图片\n   */\n  function getImage() {\n    return props.appData.icon ? getFileAccessHttpUrl(props.appData.icon) : defaultImg;\n  }\n\n  watch(\n    () => inputRef.value,\n    (newVal: any) => {\n      if (newVal?.length) {\n        newVal[0].focus();\n      }\n    },\n    { deep: true }\n  );\n\n  // 指定长度和基数\n  const getUuid = (len = 10, radix = 16) => {\n    var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');\n    var uuid: any = [],\n      i;\n    radix = radix || chars.length;\n\n    if (len) {\n      for (i = 0; i < len; i++) uuid[i] = chars[0 | (Math.random() * radix)];\n    } else {\n      var r;\n      uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';\n      uuid[14] = '4';\n      for (i = 0; i < 36; i++) {\n        if (!uuid[i]) {\n          r = 0 | (Math.random() * 16);\n          uuid[i] = chars[i == 19 ? (r & 0x3) | 0x8 : r];\n        }\n      }\n    }\n    return uuid.join('');\n  };\n</script>\n\n<style scoped lang=\"less\">\n  .slide-wrap {\n    border-right: 1px solid #e5e7eb;\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n    .historyArea {\n      padding: 20px;\n      padding-top: 0;\n      flex: 1;\n      min-height: 0;\n      overflow: auto;\n      margin-bottom: 20px;\n      &::-webkit-scrollbar {\n        width: 8px;\n        height: 8px;\n      }\n    }\n    .historyArea ul li:hover {\n      .del {\n        display: block;\n      }\n    }\n    .createArea {\n      padding: 20px;\n      padding-bottom: 0;\n    }\n    .ant-btn {\n      width: 100%;\n      margin-bottom: 10px;\n    }\n  }\n  ul {\n    margin-bottom: 0;\n  }\n  .list {\n    width: 100%;\n    padding-top: 0.75rem;\n    padding-bottom: 0.75rem;\n    padding-left: 0.75rem;\n    padding-right: 0.75rem;\n    border-radius: 0.375rem;\n    border-width: 1px;\n    cursor: pointer;\n    margin-bottom: 10px;\n    color: #333;\n    display: flex;\n    justify-content: flex-start;\n    align-items: center;\n    &:hover,\n    &.active {\n      border-color: @primary-color;\n      color: @primary-color;\n    }\n    .edit,\n    .save,\n    .del {\n      display: none;\n    }\n    &.active {\n      .edit,\n      .save,\n      .del {\n        display: block;\n      }\n      &.last {\n        .del {\n          display: none;\n        }\n      }\n    }\n    .message {\n      margin-right: 8px;\n    }\n    .edit {\n      margin-right: 8px;\n    }\n    .title {\n      flex: 1;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n      font-size: 14px;\n      position: relative;\n      top: 2px;\n      &.ant-input {\n        margin-right: 20px;\n      }\n    }\n    svg {\n      vertical-align: middle;\n    }\n  }\n  :deep(.ant-popover) {\n    z-index: 9999 !important;\n  }\n  :deep(.ant-popconfirm) {\n    z-index: 9999 !important;\n  }\n  .header {\n    display: flex;\n    padding: 20px 4px 0 4px;\n    margin-left: 16px;\n    .header-image {\n      height: 35px;\n      width: 35px;\n      border-radius: 4px;\n      margin-right: 10px;\n    }\n    .header-name {\n      align-self: center;\n      color: #1d2939;\n      font-weight: 600;\n      font-size: 16px;\n    }\n  }\n  .left-footer{\n    display:flex;\n    margin-right: 20px;\n    font-size: 12px;\n    position: absolute;\n    bottom: 4px;\n    left: 50px;\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/style/github-markdown.less",
    "content": "html.dark {\n  .markdown-body {\n    color-scheme: dark;\n    --color-prettylights-syntax-comment: #8b949e;\n    --color-prettylights-syntax-constant: #79c0ff;\n    --color-prettylights-syntax-entity: #d2a8ff;\n    --color-prettylights-syntax-storage-modifier-import: #c9d1d9;\n    --color-prettylights-syntax-entity-tag: #7ee787;\n    --color-prettylights-syntax-keyword: #ff7b72;\n    --color-prettylights-syntax-string: #a5d6ff;\n    --color-prettylights-syntax-variable: #ffa657;\n    --color-prettylights-syntax-brackethighlighter-unmatched: #f85149;\n    --color-prettylights-syntax-invalid-illegal-text: #f0f6fc;\n    --color-prettylights-syntax-invalid-illegal-bg: #8e1519;\n    --color-prettylights-syntax-carriage-return-text: #f0f6fc;\n    --color-prettylights-syntax-carriage-return-bg: #b62324;\n    --color-prettylights-syntax-string-regexp: #7ee787;\n    --color-prettylights-syntax-markup-list: #f2cc60;\n    --color-prettylights-syntax-markup-heading: #1f6feb;\n    --color-prettylights-syntax-markup-italic: #c9d1d9;\n    --color-prettylights-syntax-markup-bold: #c9d1d9;\n    --color-prettylights-syntax-markup-deleted-text: #ffdcd7;\n    --color-prettylights-syntax-markup-deleted-bg: #67060c;\n    --color-prettylights-syntax-markup-inserted-text: #aff5b4;\n    --color-prettylights-syntax-markup-inserted-bg: #033a16;\n    --color-prettylights-syntax-markup-changed-text: #ffdfb6;\n    --color-prettylights-syntax-markup-changed-bg: #5a1e02;\n    --color-prettylights-syntax-markup-ignored-text: #c9d1d9;\n    --color-prettylights-syntax-markup-ignored-bg: #1158c7;\n    --color-prettylights-syntax-meta-diff-range: #d2a8ff;\n    --color-prettylights-syntax-brackethighlighter-angle: #8b949e;\n    --color-prettylights-syntax-sublimelinter-gutter-mark: #484f58;\n    --color-prettylights-syntax-constant-other-reference-link: #a5d6ff;\n    --color-fg-default: #c9d1d9;\n    --color-fg-muted: #8b949e;\n    --color-fg-subtle: #6e7681;\n    --color-canvas-default: #0d1117;\n    --color-canvas-subtle: #161b22;\n    --color-border-default: #30363d;\n    --color-border-muted: #21262d;\n    --color-neutral-muted: #bfc4cc;\n    --color-accent-fg: #58a6ff;\n    --color-accent-emphasis: #1f6feb;\n    --color-attention-subtle: #ece6d9;\n    --color-danger-fg: #f85149;\n  }\n}\n\nhtml {\n  .markdown-body {\n    color-scheme: light;\n    --color-prettylights-syntax-comment: #6e7781;\n    --color-prettylights-syntax-constant: #0550ae;\n    --color-prettylights-syntax-entity: #8250df;\n    --color-prettylights-syntax-storage-modifier-import: #24292f;\n    --color-prettylights-syntax-entity-tag: #116329;\n    --color-prettylights-syntax-keyword: #cf222e;\n    --color-prettylights-syntax-string: #0a3069;\n    --color-prettylights-syntax-variable: #953800;\n    --color-prettylights-syntax-brackethighlighter-unmatched: #82071e;\n    --color-prettylights-syntax-invalid-illegal-text: #f6f8fa;\n    --color-prettylights-syntax-invalid-illegal-bg: #82071e;\n    --color-prettylights-syntax-carriage-return-text: #f6f8fa;\n    --color-prettylights-syntax-carriage-return-bg: #cf222e;\n    --color-prettylights-syntax-string-regexp: #116329;\n    --color-prettylights-syntax-markup-list: #3b2300;\n    --color-prettylights-syntax-markup-heading: #0550ae;\n    --color-prettylights-syntax-markup-italic: #24292f;\n    --color-prettylights-syntax-markup-bold: #24292f;\n    --color-prettylights-syntax-markup-deleted-text: #82071e;\n    --color-prettylights-syntax-markup-deleted-bg: #ffebe9;\n    --color-prettylights-syntax-markup-inserted-text: #116329;\n    --color-prettylights-syntax-markup-inserted-bg: #dafbe1;\n    --color-prettylights-syntax-markup-changed-text: #953800;\n    --color-prettylights-syntax-markup-changed-bg: #ffd8b5;\n    --color-prettylights-syntax-markup-ignored-text: #eaeef2;\n    --color-prettylights-syntax-markup-ignored-bg: #0550ae;\n    --color-prettylights-syntax-meta-diff-range: #8250df;\n    --color-prettylights-syntax-brackethighlighter-angle: #57606a;\n    --color-prettylights-syntax-sublimelinter-gutter-mark: #8c959f;\n    --color-prettylights-syntax-constant-other-reference-link: #0a3069;\n    --color-fg-default: #24292f;\n    --color-fg-muted: #57606a;\n    --color-fg-subtle: #6e7781;\n    --color-canvas-default: #ffffff;\n    --color-canvas-subtle: #f6f8fa;\n    --color-border-default: #d0d7de;\n    --color-border-muted: hsla(210, 18%, 87%, 1);\n    --color-neutral-muted: #e7ebf2;\n    --color-accent-fg: #0969da;\n    --color-accent-emphasis: #0969da;\n    --color-attention-subtle: #fff8c5;\n    --color-danger-fg: #cf222e;\n  }\n}\n\n.markdown-body {\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%;\n  margin: 0;\n  color: var(--color-fg-default);\n  background-color: var(--color-canvas-default);\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';\n  font-size: 16px;\n  line-height: 1.5;\n  word-wrap: break-word;\n}\n\n.markdown-body .octicon {\n  display: inline-block;\n  fill: currentColor;\n  vertical-align: text-bottom;\n}\n\n.markdown-body h1:hover .anchor .octicon-link:before,\n.markdown-body h2:hover .anchor .octicon-link:before,\n.markdown-body h3:hover .anchor .octicon-link:before,\n.markdown-body h4:hover .anchor .octicon-link:before,\n.markdown-body h5:hover .anchor .octicon-link:before,\n.markdown-body h6:hover .anchor .octicon-link:before {\n  width: 16px;\n  height: 16px;\n  content: ' ';\n  display: inline-block;\n  background-color: currentColor;\n  -webkit-mask-image: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>\");\n  mask-image: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>\");\n}\n\n.markdown-body details,\n.markdown-body figcaption,\n.markdown-body figure {\n  display: block;\n}\n\n.markdown-body summary {\n  display: list-item;\n}\n\n.markdown-body [hidden] {\n  display: none !important;\n}\n\n.markdown-body a {\n  background-color: transparent;\n  color: var(--color-accent-fg);\n  text-decoration: none;\n}\n\n.markdown-body abbr[title] {\n  border-bottom: none;\n  text-decoration: underline dotted;\n}\n\n.markdown-body b,\n.markdown-body strong {\n  font-weight: var(--base-text-weight-semibold, 600);\n}\n\n.markdown-body dfn {\n  font-style: italic;\n}\n\n.markdown-body h1 {\n  margin: 0.67em 0;\n  font-weight: var(--base-text-weight-semibold, 600);\n  padding-bottom: 0.3em;\n  font-size: 2em;\n  border-bottom: 1px solid var(--color-border-muted);\n}\n\n.markdown-body mark {\n  background-color: var(--color-attention-subtle);\n  color: var(--color-fg-default);\n}\n\n.markdown-body small {\n  font-size: 90%;\n}\n\n.markdown-body sub,\n.markdown-body sup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\n.markdown-body sub {\n  bottom: -0.25em;\n}\n\n.markdown-body sup {\n  top: -0.5em;\n}\n\n.markdown-body img {\n  border-style: none;\n  max-width: 100%;\n  box-sizing: content-box;\n  background-color: var(--color-canvas-default);\n}\n\n.markdown-body code,\n.markdown-body kbd,\n.markdown-body pre,\n.markdown-body samp {\n  font-family: monospace;\n  font-size: 1em;\n}\n\n.markdown-body figure {\n  margin: 1em 40px;\n}\n\n.markdown-body hr {\n  box-sizing: content-box;\n  overflow: hidden;\n  background: transparent;\n  border-bottom: 1px solid var(--color-border-muted);\n  height: 0.25em;\n  padding: 0;\n  margin: 24px 0;\n  background-color: var(--color-border-default);\n  border: 0;\n}\n\n.markdown-body input {\n  font: inherit;\n  margin: 0;\n  overflow: visible;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\n.markdown-body [type='button'],\n.markdown-body [type='reset'],\n.markdown-body [type='submit'] {\n  -webkit-appearance: button;\n}\n\n.markdown-body [type='checkbox'],\n.markdown-body [type='radio'] {\n  box-sizing: border-box;\n  padding: 0;\n}\n\n.markdown-body [type='number']::-webkit-inner-spin-button,\n.markdown-body [type='number']::-webkit-outer-spin-button {\n  height: auto;\n}\n\n.markdown-body [type='search']::-webkit-search-cancel-button,\n.markdown-body [type='search']::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n.markdown-body ::-webkit-input-placeholder {\n  color: inherit;\n  opacity: 0.54;\n}\n\n.markdown-body ::-webkit-file-upload-button {\n  -webkit-appearance: button;\n  font: inherit;\n}\n\n.markdown-body a:hover {\n  text-decoration: underline;\n}\n\n.markdown-body ::placeholder {\n  color: var(--color-fg-subtle);\n  opacity: 1;\n}\n\n.markdown-body hr::before {\n  display: table;\n  content: '';\n}\n\n.markdown-body hr::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n\n.markdown-body table {\n  border-spacing: 0;\n  border-collapse: collapse;\n  display: block;\n  width: max-content;\n  max-width: 100%;\n  overflow: auto;\n}\n\n.markdown-body td,\n.markdown-body th {\n  padding: 0;\n}\n\n.markdown-body details summary {\n  cursor: pointer;\n}\n\n.markdown-body details:not([open]) > *:not(summary) {\n  display: none !important;\n}\n\n.markdown-body a:focus,\n.markdown-body [role='button']:focus,\n.markdown-body input[type='radio']:focus,\n.markdown-body input[type='checkbox']:focus {\n  outline: 2px solid var(--color-accent-fg);\n  outline-offset: -2px;\n  box-shadow: none;\n}\n\n.markdown-body a:focus:not(:focus-visible),\n.markdown-body [role='button']:focus:not(:focus-visible),\n.markdown-body input[type='radio']:focus:not(:focus-visible),\n.markdown-body input[type='checkbox']:focus:not(:focus-visible) {\n  outline: solid 1px transparent;\n}\n\n.markdown-body a:focus-visible,\n.markdown-body [role='button']:focus-visible,\n.markdown-body input[type='radio']:focus-visible,\n.markdown-body input[type='checkbox']:focus-visible {\n  outline: 2px solid var(--color-accent-fg);\n  outline-offset: -2px;\n  box-shadow: none;\n}\n\n.markdown-body a:not([class]):focus,\n.markdown-body a:not([class]):focus-visible,\n.markdown-body input[type='radio']:focus,\n.markdown-body input[type='radio']:focus-visible,\n.markdown-body input[type='checkbox']:focus,\n.markdown-body input[type='checkbox']:focus-visible {\n  outline-offset: 0;\n}\n\n.markdown-body kbd {\n  display: inline-block;\n  padding: 3px 5px;\n  font:\n    11px ui-monospace,\n    SFMono-Regular,\n    SF Mono,\n    Menlo,\n    Consolas,\n    Liberation Mono,\n    monospace;\n  line-height: 10px;\n  color: var(--color-fg-default);\n  vertical-align: middle;\n  background-color: var(--color-canvas-subtle);\n  border: solid 1px var(--color-neutral-muted);\n  border-bottom-color: var(--color-neutral-muted);\n  border-radius: 6px;\n  box-shadow: inset 0 -1px 0 var(--color-neutral-muted);\n}\n\n.markdown-body h1,\n.markdown-body h2,\n.markdown-body h3,\n.markdown-body h4,\n.markdown-body h5,\n.markdown-body h6 {\n  margin-top: 24px;\n  margin-bottom: 16px;\n  font-weight: var(--base-text-weight-semibold, 600);\n  line-height: 1.25;\n}\n\n.markdown-body h2 {\n  font-weight: var(--base-text-weight-semibold, 600);\n  padding-bottom: 0.3em;\n  font-size: 1.5em;\n  border-bottom: 1px solid var(--color-border-muted);\n}\n\n.markdown-body h3 {\n  font-weight: var(--base-text-weight-semibold, 600);\n  font-size: 1.25em;\n}\n\n.markdown-body h4 {\n  font-weight: var(--base-text-weight-semibold, 600);\n  font-size: 1em;\n}\n\n.markdown-body h5 {\n  font-weight: var(--base-text-weight-semibold, 600);\n  font-size: 0.875em;\n}\n\n.markdown-body h6 {\n  font-weight: var(--base-text-weight-semibold, 600);\n  font-size: 0.85em;\n  color: var(--color-fg-muted);\n}\n\n.markdown-body p {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\n\n.markdown-body blockquote {\n  margin: 0;\n  padding: 0 1em;\n  color: var(--color-fg-muted);\n  border-left: 0.25em solid var(--color-border-default);\n}\n\n.markdown-body ul,\n.markdown-body ol {\n  margin-top: 0;\n  margin-bottom: 0;\n  padding-left: 2em;\n}\n\n.markdown-body ol ol,\n.markdown-body ul ol {\n  list-style-type: lower-roman;\n}\n\n.markdown-body ul ul ol,\n.markdown-body ul ol ol,\n.markdown-body ol ul ol,\n.markdown-body ol ol ol {\n  list-style-type: lower-alpha;\n}\n\n.markdown-body dd {\n  margin-left: 0;\n}\n\n.markdown-body tt,\n.markdown-body code,\n.markdown-body samp {\n  font-family:\n    ui-monospace,\n    SFMono-Regular,\n    SF Mono,\n    Menlo,\n    Consolas,\n    Liberation Mono,\n    monospace;\n  font-size: 12px;\n}\n\n.markdown-body pre {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-family:\n    ui-monospace,\n    SFMono-Regular,\n    SF Mono,\n    Menlo,\n    Consolas,\n    Liberation Mono,\n    monospace;\n  font-size: 12px;\n  word-wrap: normal;\n}\n\n.markdown-body .octicon {\n  display: inline-block;\n  overflow: visible !important;\n  vertical-align: text-bottom;\n  fill: currentColor;\n}\n\n.markdown-body input::-webkit-outer-spin-button,\n.markdown-body input::-webkit-inner-spin-button {\n  margin: 0;\n  -webkit-appearance: none;\n  appearance: none;\n}\n\n.markdown-body::before {\n  display: table;\n  content: '';\n}\n\n.markdown-body::after {\n  display: table;\n  clear: both;\n  content: '';\n}\n\n.markdown-body > *:first-child {\n  margin-top: 0 !important;\n}\n\n.markdown-body > *:last-child {\n  margin-bottom: 0 !important;\n}\n\n.markdown-body a:not([href]) {\n  color: inherit;\n  text-decoration: none;\n}\n\n.markdown-body .absent {\n  color: var(--color-danger-fg);\n}\n\n.markdown-body .anchor {\n  float: left;\n  padding-right: 4px;\n  margin-left: -20px;\n  line-height: 1;\n}\n\n.markdown-body .anchor:focus {\n  outline: none;\n}\n\n.markdown-body p,\n.markdown-body blockquote,\n.markdown-body ul,\n.markdown-body ol,\n.markdown-body dl,\n.markdown-body table,\n.markdown-body pre,\n.markdown-body details {\n  margin-top: 0;\n  margin-bottom: 16px;\n}\n\n.markdown-body blockquote > :first-child {\n  margin-top: 0;\n}\n\n.markdown-body blockquote > :last-child {\n  margin-bottom: 0;\n}\n\n.markdown-body h1 .octicon-link,\n.markdown-body h2 .octicon-link,\n.markdown-body h3 .octicon-link,\n.markdown-body h4 .octicon-link,\n.markdown-body h5 .octicon-link,\n.markdown-body h6 .octicon-link {\n  color: var(--color-fg-default);\n  vertical-align: middle;\n  visibility: hidden;\n}\n\n.markdown-body h1:hover .anchor,\n.markdown-body h2:hover .anchor,\n.markdown-body h3:hover .anchor,\n.markdown-body h4:hover .anchor,\n.markdown-body h5:hover .anchor,\n.markdown-body h6:hover .anchor {\n  text-decoration: none;\n}\n\n.markdown-body h1:hover .anchor .octicon-link,\n.markdown-body h2:hover .anchor .octicon-link,\n.markdown-body h3:hover .anchor .octicon-link,\n.markdown-body h4:hover .anchor .octicon-link,\n.markdown-body h5:hover .anchor .octicon-link,\n.markdown-body h6:hover .anchor .octicon-link {\n  visibility: visible;\n}\n\n.markdown-body h1 tt,\n.markdown-body h1 code,\n.markdown-body h2 tt,\n.markdown-body h2 code,\n.markdown-body h3 tt,\n.markdown-body h3 code,\n.markdown-body h4 tt,\n.markdown-body h4 code,\n.markdown-body h5 tt,\n.markdown-body h5 code,\n.markdown-body h6 tt,\n.markdown-body h6 code {\n  padding: 0 0.2em;\n  font-size: inherit;\n}\n\n.markdown-body summary h1,\n.markdown-body summary h2,\n.markdown-body summary h3,\n.markdown-body summary h4,\n.markdown-body summary h5,\n.markdown-body summary h6 {\n  display: inline-block;\n}\n\n.markdown-body summary h1 .anchor,\n.markdown-body summary h2 .anchor,\n.markdown-body summary h3 .anchor,\n.markdown-body summary h4 .anchor,\n.markdown-body summary h5 .anchor,\n.markdown-body summary h6 .anchor {\n  margin-left: -40px;\n}\n\n.markdown-body summary h1,\n.markdown-body summary h2 {\n  padding-bottom: 0;\n  border-bottom: 0;\n}\n\n.markdown-body ul.no-list,\n.markdown-body ol.no-list {\n  padding: 0;\n  list-style-type: none;\n}\n\n.markdown-body ol[type='a'] {\n  list-style-type: lower-alpha;\n}\n\n.markdown-body ol[type='A'] {\n  list-style-type: upper-alpha;\n}\n\n.markdown-body ol[type='i'] {\n  list-style-type: lower-roman;\n}\n\n.markdown-body ol[type='I'] {\n  list-style-type: upper-roman;\n}\n\n.markdown-body ol[type='1'] {\n  list-style-type: decimal;\n}\n\n.markdown-body div > ol:not([type]) {\n  list-style-type: decimal;\n}\n\n.markdown-body ul ul,\n.markdown-body ul ol,\n.markdown-body ol ol,\n.markdown-body ol ul {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.markdown-body li > p {\n  margin-top: 16px;\n}\n\n.markdown-body li + li {\n  margin-top: 0.25em;\n}\n\n.markdown-body dl {\n  padding: 0;\n}\n\n.markdown-body dl dt {\n  padding: 0;\n  margin-top: 16px;\n  font-size: 1em;\n  font-style: italic;\n  font-weight: var(--base-text-weight-semibold, 600);\n}\n\n.markdown-body dl dd {\n  padding: 0 16px;\n  margin-bottom: 16px;\n}\n\n.markdown-body table th {\n  font-weight: var(--base-text-weight-semibold, 600);\n}\n\n.markdown-body table th,\n.markdown-body table td {\n  padding: 6px 13px;\n  border: 1px solid var(--color-border-default);\n}\n\n.markdown-body table tr {\n  background-color: var(--color-canvas-default);\n  border-top: 1px solid var(--color-border-muted);\n}\n\n.markdown-body table tr:nth-child(2n) {\n  background-color: var(--color-canvas-subtle);\n}\n\n.markdown-body table img {\n  background-color: transparent;\n}\n\n.markdown-body img[align='right'] {\n  padding-left: 20px;\n}\n\n.markdown-body img[align='left'] {\n  padding-right: 20px;\n}\n\n.markdown-body .emoji {\n  max-width: none;\n  vertical-align: text-top;\n  background-color: transparent;\n}\n\n.markdown-body span.frame {\n  display: block;\n  overflow: hidden;\n}\n\n.markdown-body span.frame > span {\n  display: block;\n  float: left;\n  width: auto;\n  padding: 7px;\n  margin: 13px 0 0;\n  overflow: hidden;\n  border: 1px solid var(--color-border-default);\n}\n\n.markdown-body span.frame span img {\n  display: block;\n  float: left;\n}\n\n.markdown-body span.frame span span {\n  display: block;\n  padding: 5px 0 0;\n  clear: both;\n  color: var(--color-fg-default);\n}\n\n.markdown-body span.align-center {\n  display: block;\n  overflow: hidden;\n  clear: both;\n}\n\n.markdown-body span.align-center > span {\n  display: block;\n  margin: 13px auto 0;\n  overflow: hidden;\n  text-align: center;\n}\n\n.markdown-body span.align-center span img {\n  margin: 0 auto;\n  text-align: center;\n}\n\n.markdown-body span.align-right {\n  display: block;\n  overflow: hidden;\n  clear: both;\n}\n\n.markdown-body span.align-right > span {\n  display: block;\n  margin: 13px 0 0;\n  overflow: hidden;\n  text-align: right;\n}\n\n.markdown-body span.align-right span img {\n  margin: 0;\n  text-align: right;\n}\n\n.markdown-body span.float-left {\n  display: block;\n  float: left;\n  margin-right: 13px;\n  overflow: hidden;\n}\n\n.markdown-body span.float-left span {\n  margin: 13px 0 0;\n}\n\n.markdown-body span.float-right {\n  display: block;\n  float: right;\n  margin-left: 13px;\n  overflow: hidden;\n}\n\n.markdown-body span.float-right > span {\n  display: block;\n  margin: 13px auto 0;\n  overflow: hidden;\n  text-align: right;\n}\n\n.markdown-body code,\n.markdown-body tt {\n  padding: 0.2em 0.4em;\n  margin: 0;\n  font-size: 85%;\n  white-space: break-spaces;\n  background-color: var(--color-neutral-muted);\n  border-radius: 6px;\n}\n\n.markdown-body code br,\n.markdown-body tt br {\n  display: none;\n}\n\n.markdown-body del code {\n  text-decoration: inherit;\n}\n\n.markdown-body samp {\n  font-size: 85%;\n}\n\n.markdown-body pre code {\n  font-size: 100%;\n}\n\n.markdown-body pre > code {\n  padding: 0;\n  margin: 0;\n  word-break: normal;\n  white-space: pre;\n  background: transparent;\n  border: 0;\n}\n\n.markdown-body .highlight {\n  margin-bottom: 16px;\n}\n\n.markdown-body .highlight pre {\n  margin-bottom: 0;\n  word-break: normal;\n}\n\n.markdown-body .highlight pre,\n.markdown-body pre {\n  padding: 16px;\n  overflow: auto;\n  font-size: 85%;\n  line-height: 1.45;\n  background-color: var(--color-canvas-subtle);\n  border-radius: 6px;\n}\n\n.markdown-body pre code,\n.markdown-body pre tt {\n  display: inline;\n  max-width: auto;\n  padding: 0;\n  margin: 0;\n  overflow: visible;\n  line-height: inherit;\n  word-wrap: normal;\n  background-color: transparent;\n  border: 0;\n}\n\n.markdown-body .csv-data td,\n.markdown-body .csv-data th {\n  padding: 5px;\n  overflow: hidden;\n  font-size: 12px;\n  line-height: 1;\n  text-align: left;\n  white-space: nowrap;\n}\n\n.markdown-body .csv-data .blob-num {\n  padding: 10px 8px 9px;\n  text-align: right;\n  background: var(--color-canvas-default);\n  border: 0;\n}\n\n.markdown-body .csv-data tr {\n  border-top: 0;\n}\n\n.markdown-body .csv-data th {\n  font-weight: var(--base-text-weight-semibold, 600);\n  background: var(--color-canvas-subtle);\n  border-top: 0;\n}\n\n.markdown-body [data-footnote-ref]::before {\n  content: '[';\n}\n\n.markdown-body [data-footnote-ref]::after {\n  content: ']';\n}\n\n.markdown-body .footnotes {\n  font-size: 12px;\n  color: var(--color-fg-muted);\n  border-top: 1px solid var(--color-border-default);\n}\n\n.markdown-body .footnotes ol {\n  padding-left: 16px;\n}\n\n.markdown-body .footnotes ol ul {\n  display: inline-block;\n  padding-left: 16px;\n  margin-top: 16px;\n}\n\n.markdown-body .footnotes li {\n  position: relative;\n}\n\n.markdown-body .footnotes li:target::before {\n  position: absolute;\n  top: -8px;\n  right: -8px;\n  bottom: -8px;\n  left: -24px;\n  pointer-events: none;\n  content: '';\n  border: 2px solid var(--color-accent-emphasis);\n  border-radius: 6px;\n}\n\n.markdown-body .footnotes li:target {\n  color: var(--color-fg-default);\n}\n\n.markdown-body .footnotes .data-footnote-backref g-emoji {\n  font-family: monospace;\n}\n\n.markdown-body .pl-c {\n  color: var(--color-prettylights-syntax-comment);\n}\n\n.markdown-body .pl-c1,\n.markdown-body .pl-s .pl-v {\n  color: var(--color-prettylights-syntax-constant);\n}\n\n.markdown-body .pl-e,\n.markdown-body .pl-en {\n  color: var(--color-prettylights-syntax-entity);\n}\n\n.markdown-body .pl-smi,\n.markdown-body .pl-s .pl-s1 {\n  color: var(--color-prettylights-syntax-storage-modifier-import);\n}\n\n.markdown-body .pl-ent {\n  color: var(--color-prettylights-syntax-entity-tag);\n}\n\n.markdown-body .pl-k {\n  color: var(--color-prettylights-syntax-keyword);\n}\n\n.markdown-body .pl-s,\n.markdown-body .pl-pds,\n.markdown-body .pl-s .pl-pse .pl-s1,\n.markdown-body .pl-sr,\n.markdown-body .pl-sr .pl-cce,\n.markdown-body .pl-sr .pl-sre,\n.markdown-body .pl-sr .pl-sra {\n  color: var(--color-prettylights-syntax-string);\n}\n\n.markdown-body .pl-v,\n.markdown-body .pl-smw {\n  color: var(--color-prettylights-syntax-variable);\n}\n\n.markdown-body .pl-bu {\n  color: var(--color-prettylights-syntax-brackethighlighter-unmatched);\n}\n\n.markdown-body .pl-ii {\n  color: var(--color-prettylights-syntax-invalid-illegal-text);\n  background-color: var(--color-prettylights-syntax-invalid-illegal-bg);\n}\n\n.markdown-body .pl-c2 {\n  color: var(--color-prettylights-syntax-carriage-return-text);\n  background-color: var(--color-prettylights-syntax-carriage-return-bg);\n}\n\n.markdown-body .pl-sr .pl-cce {\n  font-weight: bold;\n  color: var(--color-prettylights-syntax-string-regexp);\n}\n\n.markdown-body .pl-ml {\n  color: var(--color-prettylights-syntax-markup-list);\n}\n\n.markdown-body .pl-mh,\n.markdown-body .pl-mh .pl-en,\n.markdown-body .pl-ms {\n  font-weight: bold;\n  color: var(--color-prettylights-syntax-markup-heading);\n}\n\n.markdown-body .pl-mi {\n  font-style: italic;\n  color: var(--color-prettylights-syntax-markup-italic);\n}\n\n.markdown-body .pl-mb {\n  font-weight: bold;\n  color: var(--color-prettylights-syntax-markup-bold);\n}\n\n.markdown-body .pl-md {\n  color: var(--color-prettylights-syntax-markup-deleted-text);\n  background-color: var(--color-prettylights-syntax-markup-deleted-bg);\n}\n\n.markdown-body .pl-mi1 {\n  color: var(--color-prettylights-syntax-markup-inserted-text);\n  background-color: var(--color-prettylights-syntax-markup-inserted-bg);\n}\n\n.markdown-body .pl-mc {\n  color: var(--color-prettylights-syntax-markup-changed-text);\n  background-color: var(--color-prettylights-syntax-markup-changed-bg);\n}\n\n.markdown-body .pl-mi2 {\n  color: var(--color-prettylights-syntax-markup-ignored-text);\n  background-color: var(--color-prettylights-syntax-markup-ignored-bg);\n}\n\n.markdown-body .pl-mdr {\n  font-weight: bold;\n  color: var(--color-prettylights-syntax-meta-diff-range);\n}\n\n.markdown-body .pl-ba {\n  color: var(--color-prettylights-syntax-brackethighlighter-angle);\n}\n\n.markdown-body .pl-sg {\n  color: var(--color-prettylights-syntax-sublimelinter-gutter-mark);\n}\n\n.markdown-body .pl-corl {\n  text-decoration: underline;\n  color: var(--color-prettylights-syntax-constant-other-reference-link);\n}\n\n.markdown-body g-emoji {\n  display: inline-block;\n  min-width: 1ch;\n  font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';\n  font-size: 1em;\n  font-style: normal !important;\n  font-weight: var(--base-text-weight-normal, 400);\n  line-height: 1;\n  vertical-align: -0.075em;\n}\n\n.markdown-body g-emoji img {\n  width: 1em;\n  height: 1em;\n}\n\n.markdown-body .task-list-item {\n  list-style-type: none;\n}\n\n.markdown-body .task-list-item label {\n  font-weight: var(--base-text-weight-normal, 400);\n}\n\n.markdown-body .task-list-item.enabled label {\n  cursor: pointer;\n}\n\n.markdown-body .task-list-item + .task-list-item {\n  margin-top: 4px;\n}\n\n.markdown-body .task-list-item .handle {\n  display: none;\n}\n\n.markdown-body .task-list-item-checkbox {\n  margin: 0 0.2em 0.25em -1.4em;\n  vertical-align: middle;\n}\n\n.markdown-body .contains-task-list:dir(rtl) .task-list-item-checkbox {\n  margin: 0 -1.6em 0.25em 0.2em;\n}\n\n.markdown-body .contains-task-list {\n  position: relative;\n}\n\n.markdown-body .contains-task-list:hover .task-list-item-convert-container,\n.markdown-body .contains-task-list:focus-within .task-list-item-convert-container {\n  display: block;\n  width: auto;\n  height: 24px;\n  overflow: visible;\n  clip: auto;\n}\n\n.markdown-body ::-webkit-calendar-picker-indicator {\n  filter: invert(50%);\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/style/highlight.less",
    "content": "html.dark {\n  pre code.hljs {\n    display: block;\n    overflow-x: auto;\n    padding: 1em;\n  }\n\n  code.hljs {\n    padding: 3px 5px;\n  }\n\n  .hljs {\n    color: #abb2bf;\n    background: #282c34;\n  }\n\n  .hljs-keyword,\n  .hljs-operator,\n  .hljs-pattern-match {\n    color: #f92672;\n  }\n\n  .hljs-function,\n  .hljs-pattern-match .hljs-constructor {\n    color: #61aeee;\n  }\n\n  .hljs-function .hljs-params {\n    color: #a6e22e;\n  }\n\n  .hljs-function .hljs-params .hljs-typing {\n    color: #fd971f;\n  }\n\n  .hljs-module-access .hljs-module {\n    color: #7e57c2;\n  }\n\n  .hljs-constructor {\n    color: #e2b93d;\n  }\n\n  .hljs-constructor .hljs-string {\n    color: #9ccc65;\n  }\n\n  .hljs-comment,\n  .hljs-quote {\n    color: #b18eb1;\n    font-style: italic;\n  }\n\n  .hljs-doctag,\n  .hljs-formula {\n    color: #c678dd;\n  }\n\n  .hljs-deletion,\n  .hljs-name,\n  .hljs-section,\n  .hljs-selector-tag,\n  .hljs-subst {\n    color: #e06c75;\n  }\n\n  .hljs-literal {\n    color: #56b6c2;\n  }\n\n  .hljs-addition,\n  .hljs-attribute,\n  .hljs-meta .hljs-string,\n  .hljs-regexp,\n  .hljs-string {\n    color: #98c379;\n  }\n\n  .hljs-built_in,\n  .hljs-class .hljs-title,\n  .hljs-title.class_ {\n    color: #e6c07b;\n  }\n\n  .hljs-attr,\n  .hljs-number,\n  .hljs-selector-attr,\n  .hljs-selector-class,\n  .hljs-selector-pseudo,\n  .hljs-template-variable,\n  .hljs-type,\n  .hljs-variable {\n    color: #d19a66;\n  }\n\n  .hljs-bullet,\n  .hljs-link,\n  .hljs-meta,\n  .hljs-selector-id,\n  .hljs-symbol,\n  .hljs-title {\n    color: #61aeee;\n  }\n\n  .hljs-emphasis {\n    font-style: italic;\n  }\n\n  .hljs-strong {\n    font-weight: 700;\n  }\n\n  .hljs-link {\n    text-decoration: underline;\n  }\n}\n\nhtml {\n  pre code.hljs {\n    display: block;\n    overflow-x: auto;\n    padding: 1em;\n  }\n\n  code.hljs {\n    padding: 3px 5px;\n    &::-webkit-scrollbar {\n      height: 4px;\n    }\n  }\n\n  .hljs {\n    color: #383a42;\n    background: #fafafa;\n  }\n\n  .hljs-comment,\n  .hljs-quote {\n    color: #a0a1a7;\n    font-style: italic;\n  }\n\n  .hljs-doctag,\n  .hljs-formula,\n  .hljs-keyword {\n    color: #a626a4;\n  }\n\n  .hljs-deletion,\n  .hljs-name,\n  .hljs-section,\n  .hljs-selector-tag,\n  .hljs-subst {\n    color: #e45649;\n  }\n\n  .hljs-literal {\n    color: #0184bb;\n  }\n\n  .hljs-addition,\n  .hljs-attribute,\n  .hljs-meta .hljs-string,\n  .hljs-regexp,\n  .hljs-string {\n    color: #50a14f;\n  }\n\n  .hljs-attr,\n  .hljs-number,\n  .hljs-selector-attr,\n  .hljs-selector-class,\n  .hljs-selector-pseudo,\n  .hljs-template-variable,\n  .hljs-type,\n  .hljs-variable {\n    color: #986801;\n  }\n\n  .hljs-bullet,\n  .hljs-link,\n  .hljs-meta,\n  .hljs-selector-id,\n  .hljs-symbol,\n  .hljs-title {\n    color: #4078f2;\n  }\n\n  .hljs-built_in,\n  .hljs-class .hljs-title,\n  .hljs-title.class_ {\n    color: #c18401;\n  }\n\n  .hljs-emphasis {\n    font-style: italic;\n  }\n\n  .hljs-strong {\n    font-weight: 700;\n  }\n\n  .hljs-link {\n    text-decoration: underline;\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/chat/style/style.less",
    "content": ".markdown-body {\n  background-color: transparent;\n  font-size: 14px;\n\n  p {\n    white-space: pre-wrap;\n  }\n\n  ol {\n    list-style-type: decimal;\n  }\n\n  ul {\n    list-style-type: disc;\n  }\n\n  pre code,\n  pre tt {\n    line-height: 1.65;\n  }\n\n  .highlight pre,\n  pre {\n    background-color: #fff;\n  }\n\n  code.hljs {\n    padding: 0;\n  }\n\n  .code-block {\n    &-wrapper {\n      position: relative;\n      padding-top: 24px;\n    }\n\n    &-header {\n      position: absolute;\n      top: 5px;\n      right: 0;\n      width: 100%;\n      padding: 0 1rem;\n      display: flex;\n      justify-content: flex-end;\n      align-items: center;\n      color: #b3b3b3;\n\n      &__copy {\n        cursor: pointer;\n        margin-left: 0.5rem;\n        user-select: none;\n\n        &:hover {\n          color: #65a665;\n        }\n      }\n    }\n  }\n\n  &.markdown-body-generate > dd:last-child:after,\n  &.markdown-body-generate > dl:last-child:after,\n  &.markdown-body-generate > dt:last-child:after,\n  &.markdown-body-generate > h1:last-child:after,\n  &.markdown-body-generate > h2:last-child:after,\n  &.markdown-body-generate > h3:last-child:after,\n  &.markdown-body-generate > h4:last-child:after,\n  &.markdown-body-generate > h5:last-child:after,\n  &.markdown-body-generate > h6:last-child:after,\n  &.markdown-body-generate > li:last-child:after,\n  &.markdown-body-generate > ol:last-child li:last-child:after,\n  &.markdown-body-generate > p:last-child:after,\n  &.markdown-body-generate > pre:last-child code:after,\n  &.markdown-body-generate > td:last-child:after,\n  &.markdown-body-generate > ul:last-child li:last-child:after {\n    animation: blink 1s steps(5, start) infinite;\n    color: #000;\n    content: '_';\n    font-weight: 700;\n    margin-left: 3px;\n    vertical-align: baseline;\n  }\n\n  @keyframes blink {\n    to {\n      visibility: hidden;\n    }\n  }\n}\n\nhtml.dark {\n  .markdown-body {\n    &.markdown-body-generate > dd:last-child:after,\n    &.markdown-body-generate > dl:last-child:after,\n    &.markdown-body-generate > dt:last-child:after,\n    &.markdown-body-generate > h1:last-child:after,\n    &.markdown-body-generate > h2:last-child:after,\n    &.markdown-body-generate > h3:last-child:after,\n    &.markdown-body-generate > h4:last-child:after,\n    &.markdown-body-generate > h5:last-child:after,\n    &.markdown-body-generate > h6:last-child:after,\n    &.markdown-body-generate > li:last-child:after,\n    &.markdown-body-generate > ol:last-child li:last-child:after,\n    &.markdown-body-generate > p:last-child:after,\n    &.markdown-body-generate > pre:last-child code:after,\n    &.markdown-body-generate > td:last-child:after,\n    &.markdown-body-generate > ul:last-child li:last-child:after {\n      color: #65a665;\n    }\n  }\n\n  .message-reply {\n    .whitespace-pre-wrap {\n      white-space: pre-wrap;\n      color: var(--n-text-color);\n    }\n  }\n\n  .highlight pre,\n  pre {\n    background-color: #282c34;\n  }\n}\n\n@media screen and (max-width: 533px) {\n  .markdown-body .code-block-wrapper {\n    padding: unset;\n\n    code {\n      padding: 24px 16px 16px 16px;\n    }\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/components/AiApp.json",
    "content": "{\n  \"prompt\": \"# 角色\\n你是一个犀利的电影解说员，可以使用尖锐幽默的语言，向用户讲解电影剧情、介绍最新上映的电影，还可以用普通人都可以理解的语言讲解电影相关知识。\\n\\n## 技能\\n### 技能 1: 推荐最新上映的电影\\n1. 当用户请你推荐最新电影时，需要先了解用户喜欢哪种类型片。如果你已经知道了，请跳过这一步，在询问时可以用“请问您喜欢什么类型的电影呢亲”。\\n2. 如果你并不知道用户所说的电影，可以使用 工具搜索电影，了解电影类型。\\n3. 根据用户的电影偏好，推荐几部正在上映和即将上映的电影，在推荐开头可以说“好的亲，以下是为您推荐的电影”。\\n===回复示例===\\n   -  \\uD83C\\uDFAC 电影名: <电影名>\\n   -  \\uD83D\\uDD50 上映时间: <电影在中国大陆的上映的日期>\\n   -  \\uD83D\\uDCA1 电影简介: <100字总结这部电影的剧情摘要>\\n===示例结束===\\n\\n### 技能 2: 介绍电影\\n1. 当用户说介绍某一部电影，请使用工具 搜索电影介绍的链接，在收到需求时可以回应“好嘞亲，马上为您查找相关电影介绍”。\\n2. 如果此时获取的信息不够全面，可以继续使用 工具 打开搜索结果中的相关链接，以了解电影详情。\\n3. 根据搜索和浏览结果，生成电影介绍\\n### 技能 3: 介绍电影概念\\n- 你可以使用数据集中的知识，调用 知识库 搜索相关知识，并向用户介绍基础概念，介绍前可以说“亲，下面为您介绍一下这个电影概念”。\\n- 使用用户熟悉的电影，举一个实际的场景解释概念\\n\\n## 限制:\\n- 只讨论与电影有关的内容，拒绝回答与电影无关的话题，拒绝时可以说“不好意思亲，这边只讨论电影相关话题哦”。\\n- 所输出的内容必须按照给定的格式进行组织，不能偏离框架要求，在表述中合理运用常用语。\\n- 总结部分不能超过 100 字。\\n- 只会输出知识库中已有内容, 不在知识库中的书籍, 通过 工具去了解。\\n- 请使用 Markdown 的 ^^ 形式说明引用来源。”\",\n  \"prologue\": \"嘿，亲！我对电影那可是门儿清，能给你带来超棒的电影体验。\",\n  \"presetQuestion\": [{\"key\": 1,\"descr\": \"有啥好看的动作片推荐不？\"},{\"key\": 2,\"descr\":\"介绍下《流浪地球 3》呗。\"},{\"key\": 3,\"descr\":\"啥是电影蒙太奇呀？\"}]\n}"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/components/AiAppAddFlowModal.vue",
    "content": "<template>\n  <div class=\"p-2\">\n    <BasicModal destroyOnClose @register=\"registerModal\" :canFullscreen=\"false\" width=\"600px\" :title=\"title\" @ok=\"handleOk\" @cancel=\"handleCancel\">\n      <div class=\"flex header\">\n        <JInput\n          @pressEnter=\"loadFlowData\"\n          class=\"header-search\"\n          size=\"small\"\n          v-model:value=\"searchText\"\n          placeholder=\"请输入流程名称，回车搜索\"\n        />\n      </div>\n      <a-row :span=\"24\">\n        <a-col :span=\"12\" v-for=\"item in flowList\" @click=\"handleSelect(item)\">\n          <!-- begin 流程选择支持单选和多选 -->\n          <a-card :style=\"getCardStyle(item)\" hoverable class=\"checkbox-card\" :body-style=\"{ width: '100%' }\">\n            <div style=\"display: flex; width: 100%;align-items:center; justify-content: space-between\">\n              <div style=\"display: flex; align-items:center; flex: 1; overflow: hidden; margin-right: 10px;\">\n                <img :src=\"getImage(item.icon)\" class=\"flow-icon\"/>\n                <div style=\"display: grid;margin-left: 5px;align-items: center\">\n                  <span class=\"checkbox-name ellipsis\">{{ item.name }}</span>\n                  <div class=\"flex text-status\" v-if=\"item.metadata && item.metadata.length>0\">\n                    <span class=\"tag-input\">输入</span>\n                    <div v-for=\"(metaItem, index) in item.metadata\">\n                      <a-tag color=\"#f2f3f8\" class=\"tags-meadata\">\n                        <span v-if=\"index<3\" class=\"tag-text\">{{ metaItem.field }}</span>\n                      </a-tag>\n                    </div>\n                  </div>\n                </div>\n              </div>\n              <a-checkbox v-if=\"multiple\" v-model:checked=\"item.checked\" @click.stop @change=\"(e)=>handleChange(e,item)\"></a-checkbox>\n              <!-- end 流程选择支持单选和多选 -->\n            </div>\n            <div class=\"text-desc mt-10\">\n              {{ item.descr || '暂无描述' }}\n            </div>\n          </a-card>\n        </a-col>\n      </a-row>\n      <div v-if=\"showFooterSelection\" class=\"use-select\">\n        <template v-if=\"!multiple\">\n          已选择 <span class=\"ellipsis\" style=\"max-width: 100px\">{{flowData.name}}</span>\n        </template>\n        <template v-else>\n          已选择 {{ flowId.length }} 个流程\n        </template>\n        <span style=\"margin-left: 8px; color: #3d79fb; cursor: pointer\" @click=\"handleClearClick\">清空</span>\n      </div>\n      <Pagination\n        v-if=\"flowList.length > 0\"\n        :current=\"pageNo\"\n        :page-size=\"pageSize\"\n        :page-size-options=\"pageSizeOptions\"\n        :total=\"total\"\n        :showQuickJumper=\"true\"\n        :showSizeChanger=\"true\"\n        @change=\"handlePageChange\"\n        class=\"list-footer\"\n        size=\"small\"\n      />\n    </BasicModal>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { ref, unref, computed } from 'vue';\n  import BasicModal from '@/components/Modal/src/BasicModal.vue';\n  import { useModal, useModalInner } from '@/components/Modal';\n  import { Pagination } from 'ant-design-vue';\n  import {JInput} from \"@/components/Form\";\n  import { list } from '@/views/super/airag/aiknowledge/AiKnowledgeBase.api';\n  import knowledge from '/@/views/super/airag/aiknowledge/icon/knowledge.png';\n  import { cloneDeep } from 'lodash-es';\n  // import {pageApi} from \"@/views/super/airag/aiflow/pages/api\";\n  import { defHttp } from \"@/utils/http/axios\";\n  import { getFileAccessHttpUrl } from \"@/utils/common/compUtils\";\n  import defaultFlowImg from \"@/assets/images/ai/aiflow.png\";\n\n  export default {\n    name: 'AiAppAddFlowModal',\n    components: {\n      Pagination,\n      BasicModal,\n      JInput,\n    },\n    emits: ['success', 'register'],\n    props: {\n      multiple:{ type: Boolean, default: false },\n      // 排除的流程ID，多个逗号分隔\n      excludedIds: { type: String, default: '' },\n    },\n    setup(props, { emit }) {\n      const title = ref<string>('选择流程');\n      //应用类型\n      const flowId = ref<any>([]);\n      //流程数据\n      const flowList = ref<any>([]);\n      //选中的数据\n      const flowData = ref<any>({})\n      //当前页数\n      const pageNo = ref<number>(1);\n      //每页条数\n      const pageSize = ref<number>(10);\n      //总条数\n      const total = ref<number>(0);\n      //搜索文本\n      const searchText = ref<string>('');\n      //可选择的页数\n      const pageSizeOptions = ref<any>(['10', '20', '30']);\n      //注册modal\n      const [registerModal, { closeModal, setModalProps }] = useModalInner(async (data) => {\n        //update-begin---author:wangshuai---date:2025-12-24---for: 流程选择支持单选和多选 ---\n        if (props.multiple) {\n          flowId.value = data.flowId ? (Array.isArray(data.flowId) ? cloneDeep(data.flowId) : data.flowId.split(',')) : [];\n          flowData.value = data.flowData ? cloneDeep(data.flowData) : [];\n        } else {\n          flowId.value = data.flowId ? cloneDeep(data.flowId) : '';\n          flowData.value = data.flowData ? cloneDeep(data.flowData) : {};\n        }\n        setModalProps({ minHeight: 500, bodyStyle: { padding: '10px', height: 'calc(100% - 20px)', overflowY: 'auto' } });\n        //update-end---author:wangshuai---date:2025-12-24---for:流程选择支持单选和多选---\n        loadFlowData();\n      });\n\n      /**\n       * 保存\n       */\n      async function handleOk() {\n        emit('success',{ flowId: flowId.value, flowData: flowData.value });\n        handleCancel();\n      }\n\n      /**\n       * 取消\n       */\n      function handleCancel() {\n        closeModal();\n      }\n\n      //复选框选中事件\n      const handleSelect = (item) => {\n        //update-begin---author:wangshuai---date:2025-12-24---for: 流程选择支持单选和多选 ---\n        if(!props.multiple) {\n          if (flowId.value === item.id) {\n            flowId.value = \"\";\n            flowData.value = null;\n            return;\n          }\n          flowId.value = item.id;\n          flowData.value = item;\n        } else {\n          item.checked = !item.checked;\n          updateMultipleSelection(item);\n        }\n        //update-end---author:wangshuai---date:2025-12-24---for: 流程选择支持单选和多选 ---\n      };\n\n      /**\n       * 加载AI流程\n       */\n      function loadFlowData() {\n        let params: Recordable = {\n          pageNo: pageNo.value,\n          pageSize: pageSize.value,\n          column: 'createTime',\n          order: 'desc',\n          name: searchText.value,\n          status: 'enable,release'\n        };\n\n        // 排除的流程ID，多个逗号分隔\n        if (props.excludedIds) {\n          params.excludedIds = props.excludedIds;\n        }\n\n        getAiFlowList(params).then((res) =>{\n          if(res){\n            for (const data of res.records) {\n              data.metadata = getMetadata(data.metadata);\n              //update-begin---author:wangshuai---date:2025-12-24---for: 流程选择支持单选和多选 ---\n              if (props.multiple && Array.isArray(flowId.value) && flowId.value.includes(data.id)) {\n                data.checked = true;\n              }\n              //update-end---author:wangshuai---date:2025-12-24---for: 流程选择支持单选和多选 ---\n            }\n            flowList.value = res.records;\n            total.value = res.total;\n          } else {\n            flowList.value = [];\n            total.value = 0;\n          }\n        });\n      }\n\n      async function getAiFlowList(params?: any) {\n        return defHttp.get({url: '/airag/flow/list', params});\n      }\n      \n      /**\n       * 分页改变事件\n       * @param page\n       * @param current\n       */\n      function handlePageChange(page, current) {\n        pageNo.value = page;\n        pageSize.value = current;\n        loadFlowData();\n      }\n\n      /**\n       * 清空选中状态\n       */\n      function handleClearClick() {\n        //update-begin---author:wangshuai---date:2025-12-24---for: 流程选择支持单选和多选 ---\n        if (!props.multiple) {\n          flowId.value = \"\";\n          flowData.value = null;\n        } else {\n          flowId.value = [];\n          flowData.value = [];\n          if (flowList.value && Array.isArray(flowList.value)) {\n            flowList.value.forEach(item => item.checked = false);\n          }\n        }\n        //update-end---author:wangshuai---date:2025-12-24---for: 流程选择支持单选和多选 ---\n      }\n\n      /**\n       * 获取图标\n       */\n      function getImage(icon) {\n        return icon ? getFileAccessHttpUrl(icon) : defaultFlowImg;\n      }\n      \n      /**\n       * 获取输入输出参入\n       *\n       * @param metadata\n       */\n      function getMetadata(metadata) {\n        if (!metadata) {\n          return [];\n        }\n        let parse = JSON.parse(metadata);\n        let inputsArr = parse['inputs'];\n        return [...inputsArr];\n      }\n\n      /*===========begin 流程选择支持多选 ===========*/\n      function handleChange(e, item) {\n        updateMultipleSelection(item);\n      }\n\n      function updateMultipleSelection(item) {\n        if (item.checked) {\n          if (!flowId.value.includes(item.id)) {\n            flowId.value.push(item.id);\n            flowData.value.push(item);\n          }\n        } else {\n          const index = flowId.value.indexOf(item.id);\n          if (index > -1) {\n            flowId.value.splice(index, 1);\n            flowData.value.splice(index, 1);\n          }\n        }\n      }\n      \n      const showFooterSelection = computed(() => {\n        if (props.multiple) {\n          return flowId.value && flowId.value.length > 0;\n        }\n        return !!flowId.value;\n      });\n\n      function getCardStyle(item) {\n        if (props.multiple) {\n          return item.checked ? { border: '1px solid #3370ff' } : {};\n        }\n        return item.id === flowId.value ? { border: '1px solid #3370ff' } : {};\n      }\n      /*===========end 流程选择支持多选 ===========*/\n      \n      return {\n        registerModal,\n        title,\n        handleOk,\n        handleCancel,\n        flowList,\n        flowId,\n        handleSelect,\n        pageNo,\n        pageSize,\n        pageSizeOptions,\n        total,\n        handlePageChange,\n        knowledge,\n        searchText,\n        loadFlowData,\n        handleClearClick,\n        flowData,\n        getImage,\n        handleChange,\n        getCardStyle,\n        showFooterSelection,\n      };\n    },\n  };\n</script>\n\n<style scoped lang=\"less\">\n  .header {\n    color: #646a73;\n    width: 100%;\n    justify-content: space-between;\n    margin-bottom: 10px;\n    .header-search {\n      width: 200px;\n    }\n  }\n  .pointer {\n    cursor: pointer;\n  }\n  .type-title {\n    color: #1d2025;\n    margin-bottom: 4px;\n  }\n  .type-desc {\n    color: #8f959e;\n    font-weight: 400;\n  }\n  .list-footer {\n    position: absolute;\n    bottom: 0;\n    left: 210px;\n  }\n  .checkbox-card {\n    margin-bottom: 10px;\n    margin-right: 10px;\n  }\n  .checkbox-name {\n    font-size: 14px;\n    font-weight: bold;\n    color: #354052;\n    width: 100%;\n    overflow: hidden;\n    align-content: center;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    display: grid;\n  }\n  .use-select {\n    color: #646a73;\n    position: absolute;\n    bottom: 0;\n    left: 20px;\n    display: flex;\n  }\n  .ellipsis {\n    display: block;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .flow-icon{\n    width: 34px;\n    height: 34px;\n    border-radius: 10px;\n  }\n  :deep(.ant-card .ant-card-body){\n    padding:16px !important;\n  }\n  .header-create-by{\n    font-size: 12px;\n    color: #646a73;\n  }\n  .text-desc {\n    width: 100%;\n    font-weight: 400;\n    display: inline-block;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    text-wrap: nowrap;\n    font-size: 12px;\n    color: #676F83;\n  }\n  .mt-10{\n    margin-top: 10px;\n  }\n  .flex{\n    display: flex;\n  }\n  .text-status{\n    font-size: 12px;\n    color: #676F83;\n  }\n  .tag-text {\n    display: flow;\n    max-width: 48px;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    height: 20px;\n    font-size: 12px;\n    color: #3a3f4f;\n  }\n  .tag-input{\n    align-self: center;\n    color: #707a97;\n    font-size: 12px;\n    font-style: normal;\n    font-weight: 500;\n    line-height: 16px;\n    margin-right: 6px;\n    text-align: right;\n    white-space: nowrap;\n  }\n  .tags-meadata{\n    padding-inline: 2px;\n    border-radius: 4px;\n    display: flex;\n    font-weight: 500;\n    max-width: 100%;\n  }\n\n  :deep(.jeecg-modal-wrapper){\n    height: calc(100% - 20px);\n  }\n\n  .scroll-container {\n    height: 480px;\n    overflow-y: auto;\n    padding-bottom: 20px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/components/AiAppAddKnowledgeModal.vue",
    "content": "<template>\n  <div class=\"p-2\">\n    <BasicModal destroyOnClose @register=\"registerModal\" :canFullscreen=\"false\" width=\"600px\" :title=\"title\" @ok=\"handleOk\" @cancel=\"handleCancel\">\n      <div class=\"flex header\">\n        <a-input\n          @pressEnter=\"loadKnowledgeData\"\n          class=\"header-search\"\n          size=\"small\"\n          v-model:value=\"searchText\"\n          placeholder=\"请输入知识库名称，回车搜索\"\n        ></a-input>\n      </div>\n      <a-row :span=\"24\">\n        <a-col :span=\"12\" v-for=\"item in appKnowledgeOption\" @click=\"handleSelect(item)\">\n          <a-card :style=\"getCardStyle(item)\" hoverable class=\"checkbox-card\" :body-style=\"{ width: '100%' }\">\n            <div style=\"display: flex; width: 100%; justify-content: space-between\">\n              <div>\n                <img class=\"checkbox-img\" :src=\"knowledge\" />\n                <span class=\"checkbox-name\">{{ item.name }}</span>\n              </div>\n              <a-checkbox v-if=\"multiple\" v-model:checked=\"item.checked\" @click.stop class=\"quantum-checker\" @change=\"(e)=>handleChange(e,item)\"> </a-checkbox>\n            </div>\n          </a-card>\n        </a-col>\n      </a-row>\n      <div v-if=\"knowledgeIds && knowledgeIds.length > 0\" class=\"use-select\">\n        <template v-if=\"!multiple\">\n          已选择 <span class=\"ellipsis\" style=\"max-width: 150px\">{{knowledgeData.name}}</span>\n        </template>\n        <template v-else>\n          已选择 {{ knowledgeIds.length }} 知识库\n        </template>\n        <span style=\"margin-left: 8px; color: #3d79fb; cursor: pointer\" @click=\"handleClearClick\">清空</span>\n      </div>\n      <Pagination\n        v-if=\"appKnowledgeOption.length > 0\"\n        :current=\"pageNo\"\n        :page-size=\"pageSize\"\n        :page-size-options=\"pageSizeOptions\"\n        :total=\"total\"\n        :showQuickJumper=\"true\"\n        :showSizeChanger=\"true\"\n        @change=\"handlePageChange\"\n        class=\"list-footer\"\n        size=\"small\"\n      />\n    </BasicModal>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { ref, unref } from 'vue';\n  import BasicModal from '@/components/Modal/src/BasicModal.vue';\n  import { useModal, useModalInner } from '@/components/Modal';\n  import { Pagination } from 'ant-design-vue';\n  import { list } from '@/views/super/airag/aiknowledge/AiKnowledgeBase.api';\n  import knowledge from '/@/views/super/airag/aiknowledge/icon/knowledge.png';\n  import { cloneDeep } from 'lodash-es';\n\n  export default {\n    name: 'AiAppAddKnowledgeModal',\n    components: {\n      Pagination,\n      BasicModal,\n    },\n    emits: ['success', 'register'],\n    props: {\n      multiple:{ type: Boolean, default: true },\n      type: { type: String, default: 'knowledge' }\n    },\n    setup(props, { emit }) {\n      const title = ref<string>('添加关联知识库');\n\n      //app知识库\n      const appKnowledgeOption = ref<any>([]);\n      //应用类型\n      const knowledgeIds = ref<any>([]);\n      //应用数据\n      const knowledgeData = ref<any>([]);\n      //当前页数\n      const pageNo = ref<number>(1);\n      //每页条数\n      const pageSize = ref<number>(10);\n      //总条数\n      const total = ref<number>(0);\n      //搜索文本\n      const searchText = ref<string>('');\n      //可选择的页数\n      const pageSizeOptions = ref<any>(['10', '20', '30']);\n      //注册modal\n      const [registerModal, { closeModal, setModalProps }] = useModalInner(async (data) => {\n        //update-begin---author:wangshuai---date:2025-12-25---for:知识库选择支持单选和多选---\n        if (props.multiple) {\n          knowledgeIds.value = data.knowledgeIds ? cloneDeep(data.knowledgeIds.split(',')) : [];\n          knowledgeData.value = data.knowledgeDataList ? cloneDeep(data.knowledgeDataList) : [];\n        } else {\n          knowledgeIds.value = data.knowledgeIds ? cloneDeep(data.knowledgeIds) : '';\n          knowledgeData.value = data.knowledgeData ? cloneDeep(data.knowledgeData) : {};\n        }\n        //update-end---author:wangshuai---date:2025-12-25---for:知识库选择支持单选和多选---\n        setModalProps({ minHeight: 500, bodyStyle: { padding: '10px' } });\n        loadKnowledgeData();\n      });\n\n      /**\n       * 保存\n       */\n      async function handleOk() {\n        console.log(\"知识库确定选中的值\",knowledgeData.value);\n        //update-begin---author:wangshuai---date:2025-12-25---for:知识库选择支持单选和多选---\n        if (props.multiple) {\n          emit('success', knowledgeIds.value, knowledgeData.value);\n        } else {\n          emit('success', knowledgeIds.value, knowledgeData.value);\n        }\n        //update-end---author:wangshuai---date:2025-12-25---for:知识库选择支持单选和多选---\n        handleCancel();\n      }\n\n      /**\n       * 取消\n       */\n      function handleCancel() {\n        closeModal();\n      }\n\n      //复选框选中事件\n      function handleSelect(item){\n        //update-begin---author:wangshuai---date:2025-12-25---for:知识库选择支持单选和多选---\n        if(!props.multiple) {\n          if (knowledgeIds.value === item.id) {\n            knowledgeIds.value = \"\";\n            knowledgeData.value = null;\n            return;\n          }\n          knowledgeIds.value = item.id;\n          knowledgeData.value = item;\n        } else {\n          let id = item.id;\n          const target = appKnowledgeOption.value.find((item) => item.id === id);\n          if (target) {\n            target.checked = !target.checked;\n          }\n          //存放选中的知识库的id\n          if (!knowledgeIds.value || knowledgeIds.value.length == 0) {\n            knowledgeIds.value.push(id);\n            knowledgeData.value.push(item);\n            console.log(\"知识库勾选或取消勾选复选框的值\",knowledgeData.value);\n            return;\n          }\n          let findIndex = knowledgeIds.value.findIndex((item) => item === id);\n          if (findIndex === -1) {\n            knowledgeIds.value.push(id);\n            knowledgeData.value.push(item);\n          } else {\n            knowledgeIds.value.splice(findIndex, 1);\n            knowledgeData.value.splice(findIndex, 1);\n          }\n          console.log(\"知识库勾选或取消勾选复选框的值\",knowledgeData.value);\n        }\n        //update-end---author:wangshuai---date:2025-12-25---for:知识库选择支持单选和多选---\n      }\n\n      /**\n       * 加载知识库\n       */\n      function loadKnowledgeData() {\n        let params = {\n          pageNo: pageNo.value,\n          pageSize: pageSize.value,\n          name: searchText.value,\n          type: props.type,\n        };\n        list(params).then((res) => {\n          if (res.success) {\n            if (props.multiple && knowledgeIds.value.length > 0) {\n              for (const item of res.result.records) {\n                if (knowledgeIds.value.includes(item.id)) {\n                  item.checked = true;\n                }\n              }\n              appKnowledgeOption.value = res.result.records;\n            } else {\n              appKnowledgeOption.value = res.result.records;\n            }\n            total.value = res.result.total;\n          } else {\n            appKnowledgeOption.value = [];\n            total.value = 0;\n          }\n        });\n      }\n\n      /**\n       * 分页改变事件\n       * @param page\n       * @param current\n       */\n      function handlePageChange(page, current) {\n        pageNo.value = page;\n        pageSize.value = current;\n        loadKnowledgeData();\n      }\n\n      /**\n       * 清空选中状态\n       */\n      function handleClearClick() {\n        //update-begin---author:wangshuai---date:2025-12-25---for:知识库选择支持单选和多选---\n        if (!props.multiple) {\n          knowledgeIds.value = \"\";\n          knowledgeData.value = null;\n        } else {\n          knowledgeIds.value = [];\n          knowledgeData.value = [];\n          appKnowledgeOption.value.forEach((item) => {\n            item.checked = false;\n          });\n        }\n        //update-end---author:wangshuai---date:2025-12-25---for:知识库选择支持单选和多选---\n      }\n\n      /**\n       * 复选框选中事件\n       *\n       * @param e\n       * @param item\n       */\n      function handleChange(e, item) {\n        if (e.target.checked) {\n          knowledgeIds.value.push(item.id);\n          knowledgeData.value.push(item);\n        } else {\n          let findIndex = knowledgeIds.value.findIndex((val) => val === item.id);\n          if (findIndex != -1) {\n            knowledgeIds.value.splice(findIndex, 1);\n            knowledgeData.value.splice(findIndex, 1);\n          }\n        }\n      }\n\n      /**\n       * 获取卡片样式\n       * \n       * @param item\n       */\n      function getCardStyle(item) {\n        if (props.multiple) {\n          return item.checked ? { border: '1px solid #3370ff' } : {};\n        }\n        return item.id === knowledgeIds.value ? { border: '1px solid #3370ff' } : {};\n      }\n\n      return {\n        registerModal,\n        title,\n        handleOk,\n        handleCancel,\n        appKnowledgeOption,\n        knowledgeIds,\n        handleSelect,\n        pageNo,\n        pageSize,\n        pageSizeOptions,\n        total,\n        handlePageChange,\n        knowledge,\n        searchText,\n        loadKnowledgeData,\n        handleClearClick,\n        handleChange,\n        getCardStyle,\n        knowledgeData,\n      };\n    },\n  };\n</script>\n\n<style scoped lang=\"less\">\n  .ellipsis {\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .header {\n    color: #646a73;\n    width: 100%;\n    justify-content: space-between;\n    margin-bottom: 10px;\n    .header-search {\n      width: 200px;\n    }\n  }\n  .pointer {\n    cursor: pointer;\n  }\n  .type-title {\n    color: #1d2025;\n    margin-bottom: 4px;\n  }\n  .type-desc {\n    color: #8f959e;\n    font-weight: 400;\n  }\n  .list-footer {\n    position: absolute;\n    bottom: 0;\n    right: 10px;\n  }\n  .checkbox-card {\n    margin-bottom: 10px;\n    margin-right: 10px;\n  }\n  .checkbox-img {\n    width: 30px;\n    height: 30px;\n  }\n  .checkbox-name {\n    margin-left: 4px;\n  }\n  .use-select {\n    color: #646a73;\n    position: absolute;\n    bottom: 0;\n    left: 20px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/components/AiAppAddMcpModal.vue",
    "content": "<template>\n  <div class=\"p-2\">\n    <BasicModal destroyOnClose @register=\"registerModal\" :canFullscreen=\"false\" width=\"600px\" :title=\"title\" @ok=\"handleOk\" @cancel=\"handleCancel\">\n      <div class=\"flex header\">\n        <a-input\n          @keyup.enter=\"loadMcpData\"\n          class=\"header-search\"\n          size=\"small\"\n          v-model:value=\"searchText\"\n          placeholder=\"请输入MCP名称，回车搜索\"\n        ></a-input>\n      </div>\n      <a-row :span=\"24\">\n        <a-col :span=\"12\" v-for=\"item in mcpOption\" :key=\"item.id\" @click=\"handleSelect(item)\">\n          <a-card :body-style=\"{padding: '10px 12px'}\" hoverable :class=\"['mcp-card', { 'is-active': item.checked }]\">\n            <div class=\"mcp-card-header\">\n              <div class=\"mcp-card-left\">\n                <img class=\"mcp-card-icon\" :src=\"getIcon(item.icon)\" />\n                <div class=\"mcp-card-info\">\n                  <div class=\"mcp-card-name\" :title=\"item.name\">{{ item.name }}</div>\n                  <div class=\"mcp-card-meta\">\n                    <div class=\"pill type-pill\" :title=\"'类型: '+(item.category === 'plugin' ? '插件' : 'MCP')\">\n                      <Icon :icon=\"getCategoryIcon(item.category)\" class=\"pill-icon\" />\n                      <span class=\"pill-text\">{{ item.category === 'plugin' ? '插件' : 'MCP' }}</span>\n                    </div>\n                    <div class=\"pill tool-pill\" :title=\"getToolCount(item.metadata)+' 个工具'\">\n                      <Icon icon=\"ant-design:tool-outlined\" class=\"pill-icon\" />\n                      <span class=\"pill-text\">{{ getToolCount(item.metadata) }}</span>\n                    </div>\n                  </div>\n                </div>\n              </div>\n              <a-checkbox v-model:checked=\"item.checked\" @click.stop class=\"mcp-card-checker\" @change=\"(e)=>handleChange(e,item)\"> </a-checkbox>\n            </div>\n          </a-card>\n        </a-col>\n      </a-row>\n      <div v-if=\"pluginIds.length > 0\" class=\"use-select\">\n        已选择 {{ pluginIds.length }} 个MCP\n        <span style=\"margin-left: 8px; color: #3d79fb; cursor: pointer\" @click=\"handleClearClick\">清空</span>\n      </div>\n      <Pagination\n        v-if=\"mcpOption.length > 0\"\n        :current=\"pageNo\"\n        :page-size=\"pageSize\"\n        :page-size-options=\"pageSizeOptions\"\n        :total=\"total\"\n        :showQuickJumper=\"true\"\n        :showSizeChanger=\"true\"\n        @change=\"handlePageChange\"\n        class=\"list-footer\"\n        size=\"small\"\n      />\n    </BasicModal>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { ref } from 'vue';\n  import BasicModal from '@/components/Modal/src/BasicModal.vue';\n  import { useModalInner } from '@/components/Modal';\n  import { Pagination } from 'ant-design-vue';\n  import { list as mcpList } from '@/views/super/airag/aimcp/AiragMcp.api';\n  import { getFileAccessHttpUrl } from '@/utils/common/compUtils';\n  import defaultLogo from '@/views/super/airag/aimcp/imgs/mcpLogo.png';\n  import { Icon } from '/@/components/Icon';\n\n  export default {\n    name: 'AiAppAddMcpModal',\n    components: {\n      Pagination,\n      BasicModal,\n      Icon,\n    },\n    emits: ['success', 'register'],\n    setup(props, { emit }) {\n      const title = ref<string>('添加关联MCP');\n\n      const mcpOption = ref<any>([]);\n      const pluginIds = ref<any>([]); // 仅存放id\n      const pluginDataList = ref<any>([]); // 选中对象\n\n      const pageNo = ref<number>(1);\n      const pageSize = ref<number>(10);\n      const total = ref<number>(0);\n      const searchText = ref<string>('');\n      const pageSizeOptions = ref<any>(['10', '20', '30']);\n\n      const [registerModal, { closeModal, setModalProps }] = useModalInner(async (data) => {\n        pluginIds.value = data.pluginIds ? [...data.pluginIds] : [];\n        pluginDataList.value = data.pluginDataList ? [...data.pluginDataList] : [];\n        setModalProps({ minHeight: 500, bodyStyle: { padding: '10px' } });\n        loadMcpData();\n      });\n\n      function getIcon(icon){\n        return icon ? getFileAccessHttpUrl(icon) : defaultLogo;\n      }\n\n      async function handleOk() {\n        // 拼接插件结构，使用item的category字段\n        const plugins = pluginDataList.value.map((item:any)=>({ \n          pluginId: item.id, \n          pluginName: item.name, \n          category: item.category || 'mcp'\n        }));\n        emit('success', pluginIds.value, pluginDataList.value, plugins);\n        handleCancel();\n      }\n\n      function handleCancel() {\n        closeModal();\n      }\n\n      function handleSelect(item:any){\n        const id = item.id;\n        const target = mcpOption.value.find((it:any)=> it.id === id);\n        if(target){\n          target.checked = !target.checked;\n        }\n        if(!pluginIds.value || pluginIds.value.length===0){\n          pluginIds.value.push(id);\n          pluginDataList.value.push(item);\n          return;\n        }\n        const findIndex = pluginIds.value.findIndex((val:any)=> val === id);\n        if(findIndex === -1){\n          pluginIds.value.push(id);\n          pluginDataList.value.push(item);\n        }else{\n          pluginIds.value.splice(findIndex,1);\n          pluginDataList.value.splice(findIndex,1);\n        }\n      }\n\n      function loadMcpData(){\n        const params = { pageNo: pageNo.value, pageSize: pageSize.value, status: 'enable', synced: 1, name: searchText.value };\n        mcpList(params).then((res:any)=>{\n          if (res.records) {\n            const records = res.records || [];\n            if(pluginIds.value.length>0){\n              for(const rec of records){\n                if(pluginIds.value.includes(rec.id)){\n                  rec.checked = true;\n                }\n              }\n            }\n            mcpOption.value = records;\n            total.value = res.total;\n          }else{\n            mcpOption.value = [];\n            total.value = 0;\n          }\n        });\n      }\n\n      function handlePageChange(page:number, current:number){\n        pageNo.value = page;\n        pageSize.value = current;\n        loadMcpData();\n      }\n\n      function handleClearClick(){\n        pluginIds.value = [];\n        pluginDataList.value = [];\n        mcpOption.value.forEach((item:any)=> item.checked = false);\n      }\n\n      function handleChange(e:any, item:any){\n        if(e.target.checked){\n          pluginIds.value.push(item.id);\n          pluginDataList.value.push(item);\n        }else{\n          const findIndex = pluginIds.value.findIndex((val:any)=> val === item.id);\n          if(findIndex>-1){\n            pluginIds.value.splice(findIndex,1);\n            pluginDataList.value.splice(findIndex,1);\n          }\n        }\n      }\n\n      // 工具数量：从 metadata 中读取 tool_count\n      function getToolCount(metadata: any): number {\n        if (!metadata) return 0;\n        let metaObj: any = metadata;\n        if (typeof metadata === 'string') {\n          try {\n            metaObj = JSON.parse(metadata);\n          } catch (e) {\n            return 0;\n          }\n        }\n        const count = metaObj.tool_count || metaObj.toolCount || 0;\n        return typeof count === 'number' ? count : parseInt(count, 10) || 0;\n      }\n\n      // 类型图标映射\n      function getTypeIcon(type?: string) {\n        switch (type) {\n          case 'sse':\n            return 'ant-design:thunderbolt-outlined';\n          case 'stdio':\n            return 'ant-design:code-outlined';\n          default:\n            return 'ant-design:appstore-outlined';\n        }\n      }\n\n      // category图标映射\n      function getCategoryIcon(category?: string) {\n        if (category === 'plugin') {\n          return 'ant-design:api-outlined';\n        }\n        return 'ant-design:tool-twotone';\n      }\n\n      return {\n        registerModal,\n        title,\n        handleOk,\n        handleCancel,\n        mcpOption,\n        pluginIds,\n        pluginDataList,\n        pageNo,\n        pageSize,\n        pageSizeOptions,\n        total,\n        handlePageChange,\n        searchText,\n        loadMcpData,\n        handleClearClick,\n        handleChange,\n        handleSelect,\n        getIcon,\n        getToolCount,\n        getTypeIcon,\n        getCategoryIcon,\n      };\n    },\n  };\n</script>\n\n<style scoped lang=\"less\">\n  .header {\n    color: #646a73;\n    width: 100%;\n    justify-content: space-between;\n    margin-bottom: 10px;\n    .header-search {\n      width: 200px;\n    }\n  }\n  .mcp-card {\n    margin-bottom: 10px;\n    margin-right: 10px;\n    border: 1px solid #e5e6eb;\n    border-radius: 8px;\n    background: #fff;\n    transition: box-shadow 0.25s, border-color 0.25s;\n    cursor: pointer;\n    &.is-active {\n      border-color: #3370ff;\n      box-shadow: 0 4px 10px rgba(0,0,0,0.08);\n    }\n    &:hover {\n      box-shadow: 0 4px 10px rgba(0,0,0,0.08);\n    }\n  }\n  .mcp-card-header {\n    display: flex;\n    align-items: flex-start;\n    justify-content: space-between;\n    width: 100%;\n  }\n  .mcp-card-left {\n    display: flex;\n    align-items: flex-start;\n    min-width: 0;\n    flex: 1;\n  }\n  .mcp-card-icon {\n    width: 40px;\n    height: 40px;\n    border-radius: 8px;\n    object-fit: cover;\n    background: #f5f6f7;\n    flex-shrink: 0;\n  }\n  .mcp-card-info {\n    margin-left: 8px;\n    flex: 1;\n    min-width: 0;\n  }\n  .mcp-card-name {\n    font-size: 14px;\n    font-weight: 600;\n    color: #1d2129;\n    line-height: 20px;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    margin-bottom: 6px;\n  }\n  .mcp-card-meta {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 6px;\n  }\n  .mcp-card-checker {\n    margin-left: 12px;\n    flex-shrink: 0;\n  }\n  .pill {\n    display: inline-flex;\n    align-items: center;\n    padding: 2px 8px 2px 6px;\n    border-radius: 12px;\n    font-size: 11px;\n    line-height: 16px;\n    font-weight: 500;\n    backdrop-filter: saturate(180%) blur(4px);\n    box-shadow: 0 0 0 1px rgba(0,0,0,0.05);\n    .pill-icon { \n      margin-right: 3px; \n      font-size: 12px;\n    }\n  }\n  .type-pill { \n    background: linear-gradient(135deg,#e6f4ff,#f0f9ff); \n    color:#0958d9; \n  }\n  .tool-pill { \n    background: linear-gradient(135deg,#f5f6f7,#f0f1f2); \n    color:#555; \n  }\n  .use-select {\n    color: #646a73;\n    position: absolute;\n    bottom: 0;\n    left: 20px;\n  }\n  .list-footer {\n    position: absolute;\n    bottom: 0;\n    right: 10px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/components/AiAppGeneratedPromptModal.vue",
    "content": "<template>\n  <div class=\"p-2\">\n    <BasicModal destroyOnClose @register=\"registerModal\" :canFullscreen=\"false\" width=\"1000px\" @ok=\"handleOk\" @cancel=\"handleCancel\" okText=\"替换\" wrapClassName='ai-rag-generate-prompt-modal'>\n      <div class=\"prompt\">\n        <div class=\"prompt-left\">\n          <div class=\"prompt-left-title\">提示词生成器</div>\n          <div class=\"prompt-left-desc\">提示词生成器使用配置的模型来优化提示词，以获得更高的质量和更好的结构。请写出清晰详细的说明。</div>\n          <a-divider></a-divider>\n          <div class=\"prompt-left-try\">\n            <div class=\"prompt-left-try-title\">试一试</div>\n          </div>\n          <div class=\"instructions\">\n            <div class=\"instructions-content\" v-for=\"item in instructionsList\" @click=\"instructionsClick(item.value)\">\n              <Icon :icon=\"item.icon\" size=\"14\" color=\"#676f83\"></Icon>\n              <div class=\"instructions-name\">{{ item.name }}</div>\n            </div>\n          </div>\n          <div class=\"prompt-left-textarea\">\n            <div class=\"command\">\n              <span style=\"margin-right: 5px\">指令</span>\n              <a-tooltip title=\"提示词库\">\n                <span @click=\"openPromptApps\" style=\"color:#1890ff;cursor: pointer\">\n                  <Icon icon=\"ant-design:bulb-outlined\" color=\"#1890ff\"></Icon>词库选择\n                </span>\n              </a-tooltip>\n            </div>\n            <a-textarea v-model:value=\"prompt\" :autoSize=\"{ minRows: 8, maxRows: 8 }\"></a-textarea>\n          </div>\n          <a-button @click=\"generatedPrompt\" class=\"prompt-left-btn\" type=\"primary\" :loading=\"loading\">\n            <span style=\"align-items: center; display: flex\" v-if=\"!loading\">\n              <svg width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path\n                  d=\"M18.9839 1.85931C19.1612 1.38023 19.8388 1.38023 20.0161 1.85931L20.5021 3.17278C20.5578 3.3234 20.6766 3.44216 20.8272 3.49789L22.1407 3.98392C22.6198 4.1612 22.6198 4.8388 22.1407 5.01608L20.8272 5.50211C20.6766 5.55784 20.5578 5.6766 20.5021 5.82722L20.0161 7.14069C19.8388 7.61977 19.1612 7.61977 18.9839 7.14069L18.4979 5.82722C18.4422 5.6766 18.3234 5.55784 18.1728 5.50211L16.8593 5.01608C16.3802 4.8388 16.3802 4.1612 16.8593 3.98392L18.1728 3.49789C18.3234 3.44216 18.4422 3.3234 18.4979 3.17278L18.9839 1.85931zM13.5482 4.07793C13.0164 2.64069 10.9836 2.64069 10.4518 4.07793L8.99368 8.01834C8.82648 8.47021 8.47021 8.82648 8.01834 8.99368L4.07793 10.4518C2.64069 10.9836 2.64069 13.0164 4.07793 13.5482L8.01834 15.0063C8.47021 15.1735 8.82648 15.5298 8.99368 15.9817L10.4518 19.9221C10.9836 21.3593 13.0164 21.3593 13.5482 19.9221L15.0063 15.9817C15.1735 15.5298 15.5298 15.1735 15.9817 15.0063L19.9221 13.5482C21.3593 13.0164 21.3593 10.9836 19.9221 10.4518L15.9817 8.99368C15.5298 8.82648 15.1735 8.47021 15.0063 8.01834L13.5482 4.07793zM5.01608 16.8593C4.8388 16.3802 4.1612 16.3802 3.98392 16.8593L3.49789 18.1728C3.44216 18.3234 3.3234 18.4422 3.17278 18.4979L1.85931 18.9839C1.38023 19.1612 1.38023 19.8388 1.85931 20.0161L3.17278 20.5021C3.3234 20.5578 3.44216 20.6766 3.49789 20.8272L3.98392 22.1407C4.1612 22.6198 4.8388 22.6198 5.01608 22.1407L5.50211 20.8272C5.55784 20.6766 5.6766 20.5578 5.82722 20.5021L7.14069 20.0161C7.61977 19.8388 7.61977 19.1612 7.14069 18.9839L5.82722 18.4979C5.6766 18.4422 5.55784 18.3234 5.50211 18.1728L5.01608 16.8593z\"\n                ></path>\n              </svg>\n              <span style=\"margin-left: 4px\">生成</span>\n            </span>\n          </a-button>\n        </div>\n        <div class=\"prompt-right\">\n          <div v-if=\"!loading && !content\">\n            <svg width=\"6em\" height=\"6em\" viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n              <path\n                d=\"M18.9839 1.85931C19.1612 1.38023 19.8388 1.38023 20.0161 1.85931L20.5021 3.17278C20.5578 3.3234 20.6766 3.44216 20.8272 3.49789L22.1407 3.98392C22.6198 4.1612 22.6198 4.8388 22.1407 5.01608L20.8272 5.50211C20.6766 5.55784 20.5578 5.6766 20.5021 5.82722L20.0161 7.14069C19.8388 7.61977 19.1612 7.61977 18.9839 7.14069L18.4979 5.82722C18.4422 5.6766 18.3234 5.55784 18.1728 5.50211L16.8593 5.01608C16.3802 4.8388 16.3802 4.1612 16.8593 3.98392L18.1728 3.49789C18.3234 3.44216 18.4422 3.3234 18.4979 3.17278L18.9839 1.85931zM13.5482 4.07793C13.0164 2.64069 10.9836 2.64069 10.4518 4.07793L8.99368 8.01834C8.82648 8.47021 8.47021 8.82648 8.01834 8.99368L4.07793 10.4518C2.64069 10.9836 2.64069 13.0164 4.07793 13.5482L8.01834 15.0063C8.47021 15.1735 8.82648 15.5298 8.99368 15.9817L10.4518 19.9221C10.9836 21.3593 13.0164 21.3593 13.5482 19.9221L15.0063 15.9817C15.1735 15.5298 15.5298 15.1735 15.9817 15.0063L19.9221 13.5482C21.3593 13.0164 21.3593 10.9836 19.9221 10.4518L15.9817 8.99368C15.5298 8.82648 15.1735 8.47021 15.0063 8.01834L13.5482 4.07793zM5.01608 16.8593C4.8388 16.3802 4.1612 16.3802 3.98392 16.8593L3.49789 18.1728C3.44216 18.3234 3.3234 18.4422 3.17278 18.4979L1.85931 18.9839C1.38023 19.1612 1.38023 19.8388 1.85931 20.0161L3.17278 20.5021C3.3234 20.5578 3.44216 20.6766 3.49789 20.8272L3.98392 22.1407C4.1612 22.6198 4.8388 22.6198 5.01608 22.1407L5.50211 20.8272C5.55784 20.6766 5.6766 20.5578 5.82722 20.5021L7.14069 20.0161C7.61977 19.8388 7.61977 19.1612 7.14069 18.9839L5.82722 18.4979C5.6766 18.4422 5.55784 18.3234 5.50211 18.1728L5.01608 16.8593z\"\n              ></path>\n            </svg>\n            <div>在左侧描述您的用例，</div>\n            <div>编排预览将在此处显示。</div>\n          </div>\n          <div v-if=\"loading\">\n            <a-spin :spinning=\"loading\" tip=\"为您编排应用程序中…\"></a-spin>\n          </div>\n          <div v-if=\"content\">\n            <a-textarea v-model:value=\"content\" :autoSize=\"{ minRows: 18, maxRows: 18 }\"></a-textarea>\n          </div>\n        </div>\n      </div>\n    </BasicModal>\n  </div>\n  <!-- Ai提示词选择弹窗   -->\n  <AiAppPromptMarketModal @register=\"registerAiPromptSelectModal\" @ok=\"handleAiAppPromptOk\"></AiAppPromptMarketModal>\n</template>\n\n<script lang=\"ts\">\n  import { ref, unref } from 'vue';\n  import BasicModal from '@/components/Modal/src/BasicModal.vue';\n  import {useModal, useModalInner} from '@/components/Modal';\n  import { promptGenerate } from '@/views/super/airag/aiapp/AiApp.api';\n  import AiAppPromptMarketModal from \"@/views/super/airag/aiapp/components/AiAppPromptMarketModal.vue\";\n\n  export default {\n    name: 'AiAppGeneratedPrompt',\n    components: {\n      AiAppPromptMarketModal,\n      BasicModal,\n    },\n    emits: ['ok', 'register'],\n    setup(props, { emit }) {\n      //提示词\n      const prompt = ref<string>('');\n      //加载\n      const loading = ref<boolean>(false);\n      //显示文本\n      const content = ref<string>('');\n      //指令提示词\n      const instructionsList = ref<any>([\n        { name: 'python代码助手', value: 'python', icon: 'ant-design:code-outlined' },\n        { name: '翻译器', value: 'translator', icon: 'ant-design:translation-outlined' },\n        { name: '会议助手', value: 'meeting', icon: 'ant-design:team-outlined' },\n        { name: '润色文章', value: 'article', icon: 'ant-design:profile-outlined' },\n        { name: 'sql生成器', value: 'sql', icon: 'ant-design:console-sql-outlined' },\n        { name: '旅行规划师', value: 'travel', icon: 'ant-design:car-outlined' },\n        { name: 'linux专家', value: 'linux', icon: 'ant-design:fund-projection-screen-outlined' },\n        { name: '内容提炼器', value: 'content', icon: 'ant-design:read-outlined' },\n      ]);\n      //指令\n      const tip = ref<any>({\n        python: '你是一个python专家，可以帮助用户编写和纠错代码。',\n        translator: '一个可以将多种语言翻译为中文的翻译器。',\n        meeting: '将会议内容提炼总结，包括讨论主题、关键要点和待办事项。',\n        article: '用高超的编辑技巧改进我的文章。',\n        sql: '根据用户的描述，生成sql语句，要支持引导用户提供表结构',\n        travel: '你是一个旅行规划师，擅长帮助用户轻松规划他们的旅行',\n        linux: '你是一个linux专家，擅长解决各种linux相关的问题。',\n        content: '你是一个阅读理解大师，可以阅读用户提供的文章，并提炼主要内容输出给用户。',\n      });\n      //注册提示词modal\n      const [registerAiPromptSelectModal, { openModal: aiPromptSelectModalOpen }] = useModal();\n      //注册modal\n      const [registerModal, { closeModal, setModalProps }] = useModalInner(async (data) => {\n        content.value = '';\n        loading.value = false;\n        prompt.value = '';\n        setModalProps({ height: 500 });\n      });\n\n      /**\n       * 保存\n       */\n      async function handleOk() {\n        emit('ok', content.value);\n        handleCancel();\n      }\n\n      //update-begin---author:wangshuai---date:2025-04-01---for:【QQYUN-11796】【AI】提示词生成器，改成异步---\n      /**\n       * 生成\n       */\n      async function generatedPrompt() {\n        content.value = '';\n        loading.value = true;\n        let readableStream = await promptGenerate({ prompt: encodeURIComponent(prompt.value) }).catch(() => {\n            loading.value = false;\n        });\n        const reader = readableStream.getReader();\n        const decoder = new TextDecoder('UTF-8');\n        let buffer = '';\n        while (true) {\n          const { done, value } = await reader.read();\n          if (done) {\n            break;\n          }\n          let result = decoder.decode(value, { stream: true });\n          const lines = result.split('\\n\\n');\n          for (const line of lines) {\n            if (line.startsWith('data:')) {\n                const content = line.replace('data:', '').trim();\n                if(!content){\n                  continue;\n                }\n                if(!content.endsWith('}')){\n                  buffer = buffer + line;\n                  continue;\n                }\n                buffer = \"\";\n                renderText(content)\n              } else {\n                if(!line) {\n                  continue;\n                }\n                if(!line.endsWith('}')) {\n                  buffer = buffer + line;\n                  continue;\n                }\n                buffer = \"\";\n                renderText(line)\n              }\n            }\n          }\n      }\n\n      /**\n       * 渲染文本\n       * \n       * @param item\n       */\n      function renderText(item) {\n        try {\n          let parse = JSON.parse(item);\n          if (parse.event == 'MESSAGE') {\n            content.value += parse.data.message;\n            if(loading.value){\n              loading.value = false;\n            }\n          }\n          if (parse.event == 'MESSAGE_END') {\n            loading.value = false;\n          }\n          if (parse.event == 'ERROR') {\n            content.value = parse.data.message?parse.data.message:'生成失败，请稍后重试！'\n            loading.value = false;\n          }\n        } catch (error) {\n          console.log('Error parsing update:', error);\n        }\n      }\n      //update-end---author:wangshuai---date:2025-04-01---for:【QQYUN-11796】【AI】提示词生成器，改成异步---\n\n      /**\n       * 指令点击事件\n       */\n      function instructionsClick(value) {\n        prompt.value = tip.value[value];\n      }\n\n      /**\n       * 取消\n       */\n      function handleCancel() {\n        closeModal();\n      }\n\n      /**\n       * 打开提示词库弹窗\n       */\n      function openPromptApps() {\n        aiPromptSelectModalOpen(true,{});\n      }\n      /**\n       * 提示词回调\n       *\n       * @param value\n       */\n      function handleAiAppPromptOk(value) {\n        content.value = value;\n      }\n      return {\n        registerModal,\n        handleOk,\n        handleCancel,\n        prompt,\n        generatedPrompt,\n        instructionsList,\n        loading,\n        instructionsClick,\n        content,\n        openPromptApps,\n        registerAiPromptSelectModal,\n        handleAiAppPromptOk,\n      };\n    },\n  };\n</script>\n\n<style scoped lang=\"less\">\n  .prompt {\n    width: 100%;\n    display: flex;\n  }\n  .prompt-left {\n    width: 50%;\n    padding: 20px;\n    border-right: 1px solid #10182814;\n    .prompt-left-title {\n      background: linear-gradient(92deg, #2250f2 -29.55%, #0ebcf3 75.22%);\n      background-clip: text;\n      -webkit-text-fill-color: transparent;\n      line-height: 28px;\n      font-weight: 700;\n      font-size: 18px;\n    }\n    .prompt-left-desc {\n      color: #676f83;\n      font-weight: 400;\n      font-size: 13px;\n      margin-top: 4px;\n    }\n    .prompt-left-try {\n      display: flex;\n      align-items: center;\n      .prompt-left-try-title {\n        color: #676f83;\n        line-height: 18px;\n        text-transform: uppercase;\n        font-weight: 600;\n        font-size: 12px;\n        margin-right: 10px;\n      }\n    }\n    .prompt-left-textarea {\n      margin-top: 25px;\n      .command {\n        display: flex;\n        align-items: center;\n        color: #101828;\n        line-height: 15px;\n        font-weight: 500;\n        font-size: 12px;\n        margin-bottom: 15px;\n      }\n    }\n    .prompt-left-btn {\n      width: 80px;\n      margin-top: 10px;\n      float: right;\n    }\n  }\n  .prompt-right {\n    padding: 20px;\n    width: 50%;\n    text-align: center;\n    align-content: center;\n    svg {\n      color: #676f83;\n    }\n  }\n  .instructions {\n    display: flex;\n    flex-wrap: wrap;\n    .instructions-content {\n      padding-left: 5px;\n      padding-right: 5px;\n      border-radius: 5px;\n      align-items: center;\n      cursor: pointer;\n      height: 20px;\n      display: flex;\n      margin-top: 8px;\n      margin-left: 5px;\n    }\n    .instructions-name {\n      color: #354052;\n      font-size: 13px;\n      font-weight: 500;\n      line-height: 2px;\n      margin-left: 4px;\n    }\n  }\n  :deep(.ant-divider-horizontal) {\n    margin: 12px 0;\n  }\n</style>\n<style lang=\"less\">\n  .ai-rag-generate-prompt-modal {\n    .jeecg-modal-content > .scroll-container {\n      padding: 0;\n\n      & > .scrollbar__wrap {\n        overflow: hidden;\n        margin-bottom: 0 !important;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/components/AiAppModal.vue",
    "content": "<template>\n  <div class=\"p-2\">\n    <BasicModal destroyOnClose @register=\"registerModal\" :canFullscreen=\"false\" width=\"800px\" :title=\"title\" @ok=\"handleOk\" @cancel=\"handleCancel\">\n      <template #title>\n         <span style=\"display: flex\">\n          {{title}}\n          <a-tooltip title=\"AI应用文档\">\n            <a style=\"color: unset\" href=\"https://help.jeecg.com/aigc/guide/app\" target=\"_blank\">\n              <Icon style=\"position:relative;left:2px;top:1px\" icon=\"ant-design:question-circle-outlined\"></Icon>\n            </a>\n          </a-tooltip>\n        </span>\n      </template>\n      <BasicForm @register=\"registerForm\">\n        <template #typeSlot=\"{ model, field }\">\n          <a-radio-group v-model:value=\"model[field]\" style=\"display: flex\">\n            <a-card\n              v-for=\"item in appTypeOption\"\n              style=\"margin-right: 10px; cursor: pointer; width: 100%\"\n              @click=\"model[field] = item.value\"\n              :style=\"model[field] === item.value ? { borderColor: '#3370ff' } : {}\"\n            >\n              <a-radio :value=\"item.value\">\n                <div class=\"type-title\">{{ item.title }}</div>\n                <div class=\"type-desc\">{{ item.desc }}</div>\n              </a-radio>\n            </a-card>\n          </a-radio-group>\n        </template>\n      </BasicForm>\n    </BasicModal>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { ref, unref, computed } from 'vue';\n  import BasicModal from '@/components/Modal/src/BasicModal.vue';\n  import { useModal, useModalInner } from '@/components/Modal';\n\n  import BasicForm from '@/components/Form/src/BasicForm.vue';\n  import { useForm } from '@/components/Form';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { formSchema } from '../AiApp.data';\n  import { initDictOptions } from '@/utils/dict';\n  import { saveApp } from '@/views/super/airag/aiapp/AiApp.api';\n\n  export default {\n    name: 'AiAppModal',\n    components: {\n      BasicForm,\n      BasicModal,\n    },\n    emits: ['success', 'register'],\n    setup(props, { emit }) {\n      //保存或修改\n      const isUpdate = ref<boolean>(false);\n\n      const title = computed<string>(() => isUpdate.value ? '修改应用' : '创建应用');\n\n      //app类型\n      const appTypeOption = ref<any>([]);\n\n      //表单配置\n      const [registerForm, { validate, resetFields, setFieldsValue }] = useForm({\n        schemas: formSchema,\n        showActionButtonGroup: false,\n        layout: 'vertical',\n        wrapperCol: { span: 24 },\n      });\n\n      //注册modal\n      const [registerModal, { closeModal, setModalProps }] = useModalInner(async (data) => {\n        await resetFields();\n        //update-begin---author:wangshuai---date:2025-03-11---for: 【QQYUN-11324】8.修改弹窗head---\n        isUpdate.value = !!data?.isUpdate;\n        if (unref(isUpdate)) {\n          //表单赋值\n          await setFieldsValue({\n            ...data.record,\n          });\n        } else {\n          await setFieldsValue({\n            type: 'chatSimple',\n          })\n        }\n        //update-end---author:wangshuai---date:2025-03-11---for:【QQYUN-11324】8.修改弹窗head---\n        setModalProps({ minHeight: 500, bodyStyle: { padding: '10px' } });\n      });\n\n      /**\n       * 保存\n       */\n      async function handleOk() {\n        try {\n          let values = await validate();\n          setModalProps({ confirmLoading: true });\n          let result = await saveApp(values);\n          if (result) {\n            //关闭弹窗\n            closeModal();\n            //update-begin---author:wangshuai---date:2025-03-11---for: 【QQYUN-11324】8.修改弹窗head---\n            if(isUpdate.value){\n              //刷新列表\n              emit('success', values);\n            }else{\n              //刷新列表\n              emit('success', result);\n            }\n            //update-end---author:wangshuai---date:2025-03-11---for: 【QQYUN-11324】8.修改弹窗head---\n          }\n        } finally {\n          setModalProps({ confirmLoading: false });\n        }\n      }\n\n      //初始化AI应用类型\n      initAppTypeOption();\n\n      function initAppTypeOption() {\n        initDictOptions('ai_app_type').then((data) => {\n          if (data && data.length > 0) {\n            for (const datum of data) {\n              if (datum.value === 'chatSimple') {\n                datum['desc'] = '适合新手创建小助手';\n              } else if (datum.value === 'chatFLow') {\n                datum['desc'] = '适合高级用户自定义小助手的工作流';\n              }\n            }\n          }\n          appTypeOption.value = data;\n        });\n      }\n\n      /**\n       * 取消\n       */\n      function handleCancel() {\n        closeModal();\n      }\n\n      return {\n        registerModal,\n        registerForm,\n        title,\n        handleOk,\n        handleCancel,\n        appTypeOption,\n      };\n    },\n  };\n</script>\n\n<style scoped lang=\"less\">\n  .pointer {\n    cursor: pointer;\n  }\n  .type-title {\n    color: #1d2025;\n    margin-bottom: 4px;\n  }\n  .type-desc {\n    color: #8f959e;\n    font-weight: 400;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/components/AiAppParamsSettingModal.vue",
    "content": "<!--手动录入text-->\n<template>\n  <BasicModal title=\"参数设置\" destroyOnClose @register=\"registerModal\" :canFullscreen=\"false\" width=\"560px\" @ok=\"handleOk\" @cancel=\"handleCancel\">\n    <AiModelSeniorForm ref=\"aiModelSeniorFormRef\" :type=\"type\"></AiModelSeniorForm>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\">\nimport { ref } from 'vue';\nimport BasicModal from '@/components/Modal/src/BasicModal.vue';\nimport { useModalInner } from '@/components/Modal';\n\nimport BasicForm from '@/components/Form/src/BasicForm.vue';\nimport { MarkdownViewer } from '@/components/Markdown';\nimport AiModelSeniorForm from '/@/views/super/airag/aimodel/components/AiModelSeniorForm.vue';\n\nexport default {\n  name: 'AiAppParamsSettingModal',\n  components: {\n    MarkdownViewer,\n    BasicForm,\n    BasicModal,\n    AiModelSeniorForm,\n  },\n  emits: ['ok', 'register'],\n  setup(props, { emit }) {\n    let aiModelSeniorFormRef = ref()\n    //类型\n    const type = ref<string>('');\n    //注册modal\n    const [registerModal, { closeModal }] = useModalInner(async (data) => {\n      type.value = data.type;\n      if(data.type === 'model'){\n        if(!data.metadata.hasOwnProperty(\"temperature\") ){\n          data.metadata['temperature'] = 0.7;\n        }\n        if(!data.metadata.hasOwnProperty(\"timeout\") ){\n          data.metadata['timeout'] = 60;\n        }\n      }else{\n        if(!data.metadata.hasOwnProperty(\"topNumber\") ){\n          data.metadata['topNumber'] = 4;\n        } \n        if(!data.metadata.hasOwnProperty(\"similarity\") ){\n          data.metadata['similarity'] = 0.76;\n        }\n        if(!data.metadata.hasOwnProperty(\"timeout\") ){\n          data.metadata['timeout'] = 60;\n        }\n      }\n      setTimeout(()=>{\n        aiModelSeniorFormRef.value.setModalParams(data.metadata);\n      })\n    });\n\n    /**\n     * 弹窗点击事件\n     */\n    function handleOk() {\n      let emitChange = aiModelSeniorFormRef.value.emitChange();\n      emit('ok',emitChange);\n      handleCancel();\n    }\n\n    /**\n     * 弹窗关闭事件\n     */\n    function handleCancel() {\n      closeModal();\n    }\n    \n    return {\n      registerModal,\n      handleOk,\n      handleCancel,\n      type,\n      aiModelSeniorFormRef,\n    };\n  },\n};\n</script>\n\n<style scoped lang=\"less\">\n.pointer {\n  cursor: pointer;\n}\n.header {\n  font-size: 16px;\n  font-weight: bold;\n  margin-top: 10px;\n}\n.content {\n  margin-top: 20px;\n  max-height: 600px;\n  overflow-y: auto;\n  overflow-x: auto;\n}\n.title-tag {\n  color: #477dee;\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/components/AiAppPromptMarketModal.vue",
    "content": "<template>\n  <BasicModal\n    destroyOnClose\n    @register=\"registerModal\"\n    :canFullscreen=\"false\"\n    width=\"1000px\"\n    @ok=\"handleOk\"\n    @cancel=\"handleCancel\"\n    okText=\"使用\"\n    wrapClassName=\"ai-rag-generate-prompt-modal\"\n    :confirmLoading=\"loading\"\n  >\n    <div class=\"prompt-market-content\">\n      <!-- 搜索区域 -->\n      <div class=\"search-section\">\n        <a-input-search\n          v-model:value=\"searchText\"\n          placeholder=\"搜索提示词名称或描述\"\n          style=\"width: 300px\"\n          @search=\"handleSearch\"\n          @pressEnter=\"handleSearch\"\n        />\n      </div>\n\n      <!-- 提示词列表 -->\n      <div class=\"prompt-list-section\">\n        <a-spin :spinning=\"loading\">\n          <template v-if=\"promptList.length > 0\">\n            <a-row :gutter=\"[24, 24]\">\n              <a-col v-for=\"item in promptList\" :key=\"item.id\" :xs=\"24\" :sm=\"12\" :md=\"8\" :lg=\"8\">\n                <div class=\"prompt-card\" @click=\"handleSelectPrompt(item)\">\n                  <a-card :class=\"['prompt-item-card', { selected: selectedPrompt?.id === item.id }]\" :hoverable=\"true\" size=\"small\">\n                    <template #title>\n                      <div class=\"card-title\">\n                        <span class=\"title-text\">{{ item.name }}</span>\n                      </div>\n                    </template>\n                    <div class=\"card-content\">\n                      <p class=\"description\" :title=\"item.description || item.desc\">{{ item.description || item.desc }}</p>\n                      <div class=\"card-footer\" >\n                        <span class=\"create-time\">\n                          {{ formatTime(item.createTime) }}\n                        </span>\n                      </div>\n                    </div>\n                  </a-card>\n                </div>\n              </a-col>\n            </a-row>\n          </template>\n\n          <!-- 空状态 -->\n          <empty v-else description=\"暂无提示词数据\" class=\"empty-state\" />\n        </a-spin>\n      </div>\n\n      <!-- 分页区域 -->\n      <div class=\"pagination-section\">\n        <Pagination\n          v-model:current=\"pagination.current\"\n          v-model:pageSize=\"pagination.pageSize\"\n          :total=\"pagination.total\"\n          :show-size-changer=\"true\"\n          :page-size-options=\"['10', '20', '30', '50']\"\n          :show-quick-jumper=\"true\"\n          @change=\"handlePageChange\"\n          @showSizeChange=\"handleSizeChange\"\n        />\n      </div>\n    </div>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\">\n  import { ref, reactive } from 'vue';\n  import { Empty } from 'ant-design-vue';\n  import BasicModal from '@/components/Modal/src/BasicModal.vue';\n  import { useModalInner } from '@/components/Modal';\n  import { list } from '@/views/super/airag/aiprompts/AiragPrompts.api';\n  import { formatToDateTime } from '@/utils/dateUtil';\n  import { Pagination } from 'ant-design-vue';\n  export default {\n    name: 'AiAppPromptMarketModal',\n    components: {\n      BasicModal,\n      Pagination,\n      Empty,\n    },\n    emits: ['ok', 'register', 'select'],\n    setup(props, { emit }) {\n      // 提示词列表\n      const promptList = ref<any[]>([]);\n      // 加载状态\n      const loading = ref<boolean>(false);\n      // 搜索文本\n      const searchText = ref<string>('');\n      // 选中的提示词\n      const selectedPrompt = ref<any>(null);\n\n      // 分页配置\n      const pagination = reactive({\n        current: 1,\n        pageSize: 12,\n        total: 0,\n      });\n\n      // 注册modal\n      const [registerModal, { closeModal, setModalProps }] = useModalInner(async () => {\n        loading.value = false;\n        resetField();\n        await getPromptList();\n        setModalProps({\n          height: 600,\n          bodyStyle: { padding: '24px' },\n        });\n      });\n\n      /**\n       *\n       */\n      function resetField() {\n        promptList.value = [];\n        selectedPrompt.value = null;\n        searchText.value = '';\n        pagination.current = 1;\n      }\n\n      /**\n       * 获取提示词列表\n       */\n      async function getPromptList() {\n        loading.value = true;\n        try {\n          const params = {\n            pageNo: pagination.current,\n            pageSize: pagination.pageSize,\n            name: searchText.value ? `*${searchText.value}*` : '',\n          };\n\n          const res = await list(params);\n          console.log('获取提示词列表成功:', res);\n          if (res?.records) {\n            promptList.value = res?.records || [];\n            pagination.total = res?.total || 0;\n          } else {\n            promptList.value = [];\n            pagination.total = 0;\n          }\n        } catch (error) {\n          console.error('获取提示词列表失败:', error);\n          promptList.value = [];\n          pagination.total = 0;\n        } finally {\n          loading.value = false;\n        }\n      }\n\n      /**\n       * 处理搜索\n       */\n      function handleSearch() {\n        pagination.current = 1;\n        getPromptList();\n      }\n\n      /**\n       * 处理页码变化\n       */\n      function handlePageChange(page: number, pageSize: number) {\n        pagination.current = page;\n        pagination.pageSize = pageSize;\n        getPromptList();\n      }\n\n      /**\n       * 处理页面大小变化\n       */\n      function handleSizeChange(current: number, size: number) {\n        pagination.current = current;\n        pagination.pageSize = size;\n        getPromptList();\n      }\n\n      /**\n       * 选择提示词\n       */\n      function handleSelectPrompt(item: any) {\n        selectedPrompt.value = item;\n      }\n      /**\n       * 格式化时间\n       */\n      function formatTime(time) {\n        console.log('formatTime:', formatToDateTime(time));\n        return formatToDateTime(time);\n      }\n\n      /**\n       * 保存\n       */\n      async function handleOk() {\n        if (selectedPrompt.value) {\n          emit('ok', selectedPrompt.value.content);\n        } else {\n          emit('ok');\n        }\n        handleCancel();\n      }\n\n      /**\n       * 取消\n       */\n      function handleCancel() {\n        closeModal();\n      }\n\n      return {\n        registerModal,\n        handleOk,\n        handleCancel,\n        promptList,\n        loading,\n        searchText,\n        selectedPrompt,\n        pagination,\n        handleSearch,\n        handlePageChange,\n        handleSizeChange,\n        handleSelectPrompt,\n        formatTime,\n      };\n    },\n  };\n</script>\n\n<style scoped lang=\"less\">\n.prompt-market-content {\n  min-height: 400px;\n  padding: 16px;\n\n  .search-section {\n    margin-bottom: 24px;\n    display: flex;\n    justify-content: flex-start;\n\n    .ant-input-search {\n      max-width: 400px;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n      border-radius: 6px;\n    }\n  }\n\n  .prompt-list-section {\n    .prompt-card {\n      transition:\n          transform 0.2s ease,\n          box-shadow 0.2s ease;\n\n      &:hover {\n        transform: translateY(-4px);\n      }\n\n      .prompt-item-card {\n        border-radius: 8px;\n        overflow: hidden;\n        height: 150px; // 增加卡片高度\n        transition: all 0.3s ease;\n        border: 1px solid #e8e8e8;\n\n        .ant-card-head {\n          border-bottom: 1px solid #f0f0f0;\n          padding: 12px 16px;\n        }\n\n        .ant-card-body {\n          padding: 12px 16px;\n          height: calc(100% - 48px); // 调整内容区域高度\n          display: flex;\n          flex-direction: column;\n        }\n\n        &.selected {\n          border-color: #1890ff;\n          background-color: #e6f7ff; // 添加选中背景色\n          box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);\n\n          .card-title .title-text {\n            color: #1890ff;\n          }\n        }\n\n        .card-title {\n          display: flex;\n          align-items: center;\n\n          .title-text {\n            font-weight: 600;\n            font-size: 16px;\n            color: #333;\n            white-space: nowrap;\n            overflow: hidden;\n            text-overflow: ellipsis;\n          }\n        }\n\n        .card-content {\n          flex: 1; // 使用flex让内容区域自适应\n          display: flex;\n          flex-direction: column;\n          justify-content: space-between; // 让内容和时间信息在垂直方向上分布\n\n          .description {\n            color: #666;\n            font-size: 13px;\n            line-height: 1.5;\n            margin: 8px 0;\n            display: -webkit-box;\n            -webkit-line-clamp: 2;\n            -webkit-box-orient: vertical;\n            overflow: hidden;\n            flex: 1; // 让描述区域自适应\n          }\n\n          .card-footer {\n            margin-top: 8px; // 调整间距\n            padding-top: 8px;\n            border-top: 1px solid #f5f5f5;\n            display: flex;\n            justify-content: flex-end;\n\n            .create-time {\n              font-size: 12px;\n              color: #999;\n            }\n          }\n        }\n      }\n    }\n  }\n\n  .pagination-section {\n    margin-top: 24px;\n    padding-top: 16px;\n    border-top: 1px solid #f0f0f0;\n    display: flex;\n    justify-content: flex-end;\n  }\n\n  .empty-state {\n    margin-top: 40px;\n  }\n}\n\n// 模态框整体样式\n.ai-rag-generate-prompt-modal {\n  .ant-modal-body {\n    padding: 0 !important;\n  }\n\n  .ant-modal-header {\n    border-radius: 8px 8px 0 0;\n  }\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/components/AiAppQuickCommandModal.vue",
    "content": "<template>\n  <div class=\"p-2\">\n    <BasicModal destroyOnClose @register=\"registerModal\" :canFullscreen=\"false\" width=\"800px\" :title=\"title\" @ok=\"handleOk\" @cancel=\"handleCancel\">\n      <BasicForm @register=\"registerForm\"></BasicForm>\n    </BasicModal>\n  </div>\n</template>\n\n<script lang=\"ts\">\nimport { ref, unref } from 'vue';\nimport BasicModal from '@/components/Modal/src/BasicModal.vue';\nimport { useModalInner } from '@/components/Modal';\n\nimport BasicForm from '@/components/Form/src/BasicForm.vue';\nimport { useForm } from '@/components/Form';\nimport { quickCommandFormSchema} from '../AiApp.data';\n\nexport default {\n  name: 'AiAppQuickCommandModal',\n  components: {\n    BasicForm,\n    BasicModal,\n  },\n  emits: ['ok', 'update-ok', 'register'],\n  setup(props, { emit }) {\n    const title = ref<string>('添加指令');\n\n    //保存或修改\n    const isUpdate = ref<boolean>(false);\n\n    //表单配置\n    const [registerForm, { validate, resetFields, setFieldsValue }] = useForm({\n      schemas: quickCommandFormSchema,\n      showActionButtonGroup: false,\n      layout: 'vertical',\n      wrapperCol: { span: 24 },\n    });\n\n    //注册modal\n    const [registerModal, { closeModal, setModalProps }] = useModalInner(async (data) => {\n      await resetFields();\n      isUpdate.value = !!data?.isUpdate;\n      if (unref(isUpdate)) {\n        //表单赋值\n        await setFieldsValue({\n          ...data.record,\n        });\n      }\n      setModalProps({ minHeight: 200, bodyStyle: { padding: '10px' } });\n    });\n\n    /**\n     * 保存\n     */\n    async function handleOk() {\n      try {\n        let values = await validate();\n        setModalProps({ confirmLoading: true });\n        if(isUpdate.value){\n          emit('update-ok',values);\n        }else{\n          emit('ok', values);\n        }\n        handleCancel();\n      } finally {\n        setModalProps({ confirmLoading: false });\n      }\n    }\n\n    /**\n     * 取消\n     */\n    function handleCancel() {\n      closeModal();\n    }\n\n    return {\n      registerModal,\n      registerForm,\n      title,\n      handleOk,\n      handleCancel\n    };\n  },\n};\n</script>\n\n<style scoped lang=\"less\">\n.pointer {\n  cursor: pointer;\n}\n.type-title {\n  color: #1d2025;\n  margin-bottom: 4px;\n}\n.type-desc {\n  color: #8f959e;\n  font-weight: 400;\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/components/AiAppSendModal.vue",
    "content": "<template>\n  <div class=\"p-2\">\n    <BasicModal destroyOnClose @register=\"registerModal\" :canFullscreen=\"false\" :width=\"width\" :title=\"title\" :footer=\"null\">\n      <!--  嵌入表单    -->\n      <div v-if=\"type === 'menu'\">\n        <a-form layout=\"vertical\" :model=\"appData\">\n          <a-form-item label=\"菜单名称\">\n            <a-input v-model:value=\"appData.name\" readonly/>\n          </a-form-item>  \n          <a-form-item label=\"菜单地址\">\n            <a-input v-model:value=\"appData.menu\" readonly/>\n          </a-form-item>\n          <a-form-item style=\"text-align:right\">\n            <a-button @click.prevent=\"copyMenu\">复制菜单</a-button>\n            <a-button  type=\"primary\" style=\"margin-left: 10px\" @click=\"copySql\">复制SQL</a-button>\n          </a-form-item>\n        </a-form>\n      </div>\n      <!--   嵌入网站   -->\n      <div v-else-if=\"type === 'web'\" class=\"web\">\n    \n        <div style=\"display: flex;margin: 0 auto\">\n          <div :class=\"activeKey===1?'active':''\" class=\"web-img\" @click=\"handleImageClick(1)\">\n            <img  src=\"../img/webEmbedded.png\" />\n          </div>\n          <div style=\"margin-left: 10px\" :class=\"activeKey===2?'active':''\" class=\"web-img\" @click=\"handleImageClick(2)\">\n            <img  src=\"../img/iconWebEmbedded.png\" />\n          </div>\n        </div>    \n        <div class=\"web-title\" v-if=\"activeKey === 1\">\n          将以下 iframe 嵌入到你的网站中的目标位置\n        </div>  \n        <div class=\"web-title\" v-else>\n          将以下 script 添加到网页的body区域中\n        </div>\n        <div class=\"web-code\" v-if=\"activeKey === 1\">\n          <div class=\"web-code-title\">\n            <div class=\"web-code-desc\">\n              html\n            </div>\n            <Icon class=\"pointer\" icon=\"ant-design:copy-outlined\" @click=\"copyIframe(1)\"></Icon>\n          </div>\n          <div class=\"web-code-iframe\">\n              <pre> {{getIframeText(1)}} </pre>\n          </div>\n        </div>\n        \n        <div class=\"web-code\" v-if=\"activeKey === 2\">\n          <div class=\"web-code-title\">\n            <div class=\"web-code-desc\">\n              html\n            </div>\n            <Icon class=\"pointer\" icon=\"ant-design:copy-outlined\" @click=\"copyIframe(2)\"></Icon>\n          </div>\n          <div class=\"web-code-iframe\">\n            <pre> {{getIframeText(2)}} </pre>\n          </div>\n        </div>\n      </div>\n    </BasicModal>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { ref, unref } from 'vue';\n  import BasicModal from '@/components/Modal/src/BasicModal.vue';\n  import { useModalInner } from '@/components/Modal';\n\n  import BasicForm from '@/components/Form/src/BasicForm.vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { buildUUID } from '@/utils/uuid';\n  import { copyTextToClipboard } from '@/hooks/web/useCopyToClipboard';\n  import { isDevMode } from '/@/utils/env';\n\n  export default {\n    name: 'AiAppSendModal',\n    components: {\n      BasicForm,\n      BasicModal,\n    },\n    emits: ['success', 'register'],\n    setup(props, { emit }) {\n      //标题\n      const title = ref<string>('嵌入网站');\n      const $message = useMessage();\n      //类型\n      const type = ref<string>('web');\n      //应用信息\n      const appData = ref<any>({});\n      //弹窗宽度\n      const width = ref<string>(\"800px\");\n      //选中的key\n      const activeKey = ref<number>(1);\n      //注册modal\n      const [registerModal, { closeModal, setModalProps }] = useModalInner(async (data) => {\n        type.value = data.type;\n        appData.value = data.data;\n        appData.value.menu = \"/ai/chat/\"+ data.data.id\n        activeKey.value = 1;\n        let minHeight = 220;\n        if(data.type === 'web'){\n          title.value = '嵌入网站';\n          width.value = '640px';\n          minHeight = 500\n        }else{\n          title.value = '配置菜单';\n          width.value = '500px';\n        }\n        setModalProps({ height: minHeight, bodyStyle: { padding: '10px' } });\n      });\n\n      /**\n       * 复制菜单\n       */\n      function copyMenu() {\n        copyText(appData.value.menu);\n      }\n      \n      /**\n       * 复制sql\n       */\n      function copySql() {\n        const insertMenuSql = `INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description, status, del_flag, rule_flag, create_by, create_time, update_by, update_time, internal_or_external)\n                               VALUES ('${buildUUID()}', NULL, '${appData.value.name}', '${appData.value.menu}', '1', NULL, NULL, 0, NULL, '1', 0.00, 0, NULL, 0, 1, 0, 0, 0, NULL, '1', 0, 0, 'admin', null, NULL, NULL, 0)`;\n        copyText(insertMenuSql);\n      }\n\n      /**\n       * 获取当前文本\n       */\n      function getIframeText(value) {\n        let locationUrl = document.location.protocol +\"//\" + window.location.host;\n        //update-begin---author:wangshuai---date:2025-03-20---for:【QQYUN-11649】【AI】应用嵌入，支持一个小图标点击出聊天---\n        if(value === 1){\n          return '<iframe\\n' +\n              '   src=\"'+locationUrl+'/ai/app/chat/'+appData.value.id+'\"\\n' +\n              '   style=\"width: 100%; height: 100%;\">\\n' +\n              '</iframe>';\n        }else{\n            //update-begin---author:wangshuai---date:2025-03-28---for:【QQYUN-11649】应用嵌入，支持一个小图标点击出聊天---\n            let path = \"/src/views/super/airag/aiapp/chat/js/chat.js\"\n            if(!isDevMode()){\n              path = \"/chat/chat.js\";\n            }\n            let text ='<script src=' + locationUrl + path +' id=\"e7e007dd52f67fe36365eff636bbffbd\">'+'<'+'/script>';\n            text += '\\n <'+'script>\\n';\n            text += '    createAiChat({\\n' +\n                    '       appId:\"'+ appData.value.id +'\",\\n';\n            text += '       // 支持top-left左上, top-right右上, bottom-left左下, bottom-right右下\\n';\n            text += '       iconPosition:\"bottom-right\"\\n';\n            text += '    })\\n';\n            text += ' <'+'/script>';\n            return text;\n            //update-end---author:wangshuai---date:2025-03-28---for:【QQYUN-11649】应用嵌入，支持一个小图标点击出聊天---\n        }\n        //update-end---author:wangshuai---date:2025-03-20---for:【QQYUN-11649】【AI】应用嵌入，支持一个小图标点击出聊天---\n      }\n\n      /**\n       * 复制iframe\n       */\n      function copyIframe(value) {\n        copyText(getIframeText(value));\n      }\n\n      // 复制文本到剪贴板\n      function copyText(text: string) {\n        const success = copyTextToClipboard(text);\n        if (success) {\n          $message.createMessage.success('复制成功！');\n        } else {\n          $message.createMessage.error('复制失败！');\n        }\n        return success;\n      }\n\n      /**\n       * 图片点击事件\n       * \n       * @param value\n       */\n      function handleImageClick(value) {\n        activeKey.value = value;\n      }\n      \n      return {\n        registerModal,\n        title,\n        type,\n        appData,\n        copySql,\n        copyMenu,\n        width,\n        copyIframe,\n        getIframeText,\n        activeKey,\n        handleImageClick,\n      };\n    },\n  };\n</script>\n\n<style scoped lang=\"less\">\n  .pointer {\n    cursor: pointer;\n  }\n\n  .type-title {\n    color: #1d2025;\n    margin-bottom: 4px;\n  }\n\n  .type-desc {\n    color: #8f959e;\n    font-weight: 400;\n  }\n  \n  .web{\n   padding: 0 10px;\n  }\n  .web-title{\n    font-size: 13px;\n    font-weight: bold;\n    line-height: 16px;\n  }\n  .web-img{\n    border-width: 1.5px;\n    width: 240px;\n    margin-top: 20px;\n    border-radius: 6px;\n    img{\n      border-radius: 6px;\n      width: 240px;\n      height: 150px;\n    }\n    margin-bottom: 10px;\n  }\n  .active{\n    border-color: rgb(41 112 255);\n  }\n  .web-code{\n    border-width: 1.5px;\n    margin-top: 20px;\n    background-color: #f9fafb;\n    border-color: #10182814;\n    width: 100%;\n    border-radius: 5px;\n    .web-code-title{\n      width: 100%;\n      padding:10px;\n      background-color: #f2f4f7;\n      display: inline-flex;\n      justify-content: space-between;\n      align-items: center;\n    }\n    .web-code-desc{\n      color: #354052;\n      font-size: 13px;\n      font-weight: 500;\n      line-height: 16px;\n    }\n    .web-code-iframe{\n      padding: 15px;\n      line-height: 1.5;\n      font-size: 13px;\n      display: grid;\n      gap: 4px;\n      color: #354052;\n    }\n  }\n  .pointer{\n    cursor: pointer;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/components/AiAppSettingModal.vue",
    "content": "<template>\n  <div class=\"p-2\">\n    <BasicModal wrapClassName=\"ai-app-edit-modal\" destroyOnClose @register=\"registerModal\" :canFullscreen=\"false\" defaultFullscreen width=\"800px\" :footer=\"null\" @visible-change=\"visibleChange\">\n      <template #title>\n        <div style=\"display: flex;width: 100%;justify-content: space-between;align-items: center;\">\n          <div style=\"display: flex\">\n            <img :src=\"getImage()\" class=\"header-img\"/>\n            <div class=\"header-name\">{{formState.name}}</div>\n            <a-tooltip v-if=\"!isRelease\" title=\"编辑\">\n              <Icon icon=\"ant-design:edit-outlined\" style=\"margin-left: 4px;cursor: pointer\" color=\"#354052\" size=\"20\" @click=\"handleEdit\"></Icon>\n            </a-tooltip>\n          </div>\n          <div>\n            应用编排\n            <a-tooltip title=\"AI应用文档\">\n              <a style=\"color: unset\" href=\"https://help.jeecg.com/aigc/guide/app\" target=\"_blank\">\n                <Icon style=\"position:relative;left:2px;top:1px\" icon=\"ant-design:question-circle-outlined\"></Icon>\n              </a>\n            </a-tooltip>\n          </div>\n          <div style=\"display: flex\">\n            <a-button v-if=\"!isRelease\" @click=\"handleOk\" style=\"margin-right: 30px\" type=\"primary\">保存</a-button>\n          </div>\n        </div>\n      </template>\n      <div style=\"height: 100%; width: 100%\">\n        <a-row :span=\"24\">\n          <a-col :span=\"10\">\n            <div class=\"orchestration\">编排</div>\n          </a-col>\n          <a-col :span=\"14\">\n            <div class=\"view\">预览</div>\n          </a-col>\n        </a-row>\n        <a-row :span=\"24\">\n          <a-col :span=\"10\" class=\"setting-left\">\n            <a-form class=\"antd-modal-form\" ref=\"formRef\" :model=\"formState\" :rules=\"validatorRules\">\n              <a-row>\n                <a-col :span=\"24\" v-if=\"formState.type==='chatFLow'\" class=\"mt-10\">\n                  <div class=\"prologue-chunk\">\n                    <a-form-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.flowId\">\n                      <template #label>\n                        <div style=\"display: flex;justify-content: space-between;width: 100%;\">\n                          <span>关联流程</span>\n                          <span v-if=\"!isRelease\" @click=\"handleAddFlowClick('chatFLow')\" class=\"knowledge-txt\">\n                             <Icon icon=\"ant-design:plus-outlined\" size=\"13\" style=\"margin-right: 2px\"></Icon>添加\n                          </span>\n                        </div>\n                      </template>\n                      <a-card v-if=\"flowData\" hoverable class=\"knowledge-card\" :body-style=\"{ width: '100%' }\">\n                        <div style=\"display: flex; width: 100%; justify-content: space-between;\">\n                          <div style=\"width: 100%;display: flex;\">\n                            <img :src=\"getFlowImage(flowData.icon)\" class=\"flow-icon\"/>\n                            <div style=\"display: grid;margin-left: 5px;align-items: center;width: calc(100% - 20px)\">\n                              <span class=\"flow-name ellipsis align-items: center;\">{{ flowData.name }}</span>\n                              <div class=\"flex text-status\" v-if=\"flowData.metadata && flowData.metadata.length>0\">\n                                <span class=\"tag-input\">输入</span>\n                                <div v-for=\"(metaItem, index) in flowData.metadata\">\n                                  <a-tag color=\"#f2f3f8\" class=\"tags-meadata\">\n                                    <span v-if=\"index<5\" class=\"tag-text\">{{ metaItem.field }}</span>\n                                  </a-tag>\n                                </div>\n                              </div>\n                            </div>\n                          </div>\n                          <Icon v-if=\"!isRelease\" @click=\"handleDeleteFlow('chatFLow')\" icon=\"ant-design:close-outlined\" size=\"20\" class=\"knowledge-icon\"></Icon>\n                        </div>\n                      </a-card>\n                      <div v-else class=\"data-empty-text\">\n                        工作流支持通过可视化的方式，对大语言模型、脚本、增强等功能进行组合，从而实现复杂、稳定的业务流程编排，例如旅行规划、报告分析。\n                      </div>\n                    </a-form-item>\n                  </div>\n                </a-col>\n                <a-col :span=\"24\" v-if=\"formState.type==='chatSimple'\">\n                  <div class=\"prompt-back \">\n                    <a-form-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.prompt\" style=\"margin-bottom:0;\">\n                      <template #label>\n                        <div class=\"prompt-title-padding item-title space-between\">\n                          <span>提示词</span>\n                          <div style=\"align-items: center;display:flex;justify-content: center\" v-if=\"!isRelease\">\n                            <a-button size=\"middle\" ghost>\n                              <span style=\"align-items: center;display:flex\"  @click=\"openPromptApps\">\n                                <Icon icon=\"ant-design:database-outlined\"></Icon>提示词库\n                              </span>\n                            </a-button>\n                            <a-button  size=\"middle\" ghost>\n                              <span style=\"align-items: center;display:flex\"  @click=\"generatedPrompt\">\n                                <svg width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18.9839 1.85931C19.1612 1.38023 19.8388 1.38023 20.0161 1.85931L20.5021 3.17278C20.5578 3.3234 20.6766 3.44216 20.8272 3.49789L22.1407 3.98392C22.6198 4.1612 22.6198 4.8388 22.1407 5.01608L20.8272 5.50211C20.6766 5.55784 20.5578 5.6766 20.5021 5.82722L20.0161 7.14069C19.8388 7.61977 19.1612 7.61977 18.9839 7.14069L18.4979 5.82722C18.4422 5.6766 18.3234 5.55784 18.1728 5.50211L16.8593 5.01608C16.3802 4.8388 16.3802 4.1612 16.8593 3.98392L18.1728 3.49789C18.3234 3.44216 18.4422 3.3234 18.4979 3.17278L18.9839 1.85931zM13.5482 4.07793C13.0164 2.64069 10.9836 2.64069 10.4518 4.07793L8.99368 8.01834C8.82648 8.47021 8.47021 8.82648 8.01834 8.99368L4.07793 10.4518C2.64069 10.9836 2.64069 13.0164 4.07793 13.5482L8.01834 15.0063C8.47021 15.1735 8.82648 15.5298 8.99368 15.9817L10.4518 19.9221C10.9836 21.3593 13.0164 21.3593 13.5482 19.9221L15.0063 15.9817C15.1735 15.5298 15.5298 15.1735 15.9817 15.0063L19.9221 13.5482C21.3593 13.0164 21.3593 10.9836 19.9221 10.4518L15.9817 8.99368C15.5298 8.82648 15.1735 8.47021 15.0063 8.01834L13.5482 4.07793zM5.01608 16.8593C4.8388 16.3802 4.1612 16.3802 3.98392 16.8593L3.49789 18.1728C3.44216 18.3234 3.3234 18.4422 3.17278 18.4979L1.85931 18.9839C1.38023 19.1612 1.38023 19.8388 1.85931 20.0161L3.17278 20.5021C3.3234 20.5578 3.44216 20.6766 3.49789 20.8272L3.98392 22.1407C4.1612 22.6198 4.8388 22.6198 5.01608 22.1407L5.50211 20.8272C5.55784 20.6766 5.6766 20.5578 5.82722 20.5021L7.14069 20.0161C7.61977 19.8388 7.61977 19.1612 7.14069 18.9839L5.82722 18.4979C5.6766 18.4422 5.55784 18.3234 5.50211 18.1728L5.01608 16.8593z\"/></svg>\n                                <span style=\"margin-left: 4px\">生成</span>\n                              </span>\n                            </a-button>\n                          </div>\n                        </div>\n                      </template>\n                      <a-textarea :disabled=\"isRelease\" :rows=\"8\" v-model:value=\"formState.prompt\" placeholder=\"请输入提示词\"/>\n                    </a-form-item>\n                  </div>\n                </a-col>\n                <a-col :span=\"24\" class=\"mt-10\">\n                  <div class=\"prologue-chunk-edit\">\n                    <a-form-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.prologue\" style=\"margin-bottom:0;\">\n                      <template #label>\n                        <div class=\"prompt-title-padding item-title\">开场白</div>\n                      </template>\n                      <div class=\"prologue-chunk-edit\">\n                        <j-markdown-editor :height=\"166\" v-model:value=\"formState.prologue\" :disabled=\"isRelease\" @change=\"prologueTextAreaBlur\" :preview=\"{ mode: 'view', action: [] }\"></j-markdown-editor>\n                      </div>\n                    </a-form-item>\n                  </div>\n                </a-col>\n                <a-col :span=\"24\" class=\"mt-10\">\n                  <div class=\"prologue-chunk-edit\">\n                    <a-form-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.presetQuestion\" style=\"margin-bottom:0;\">\n                      <template #label>\n                        <div class=\"prompt-title-padding item-title space-between\">\n                          <div class=\"item-title\">预设问题</div>\n                          <a-tooltip v-if=\"!isRelease\" title=\"添加预设问题\">\n                            <Icon icon=\"ant-design:plus-outlined\" size=\"13\" style=\"margin-right: 16px;cursor: pointer\" @click=\"presetQuestionAddClick\"></Icon>\n                          </a-tooltip>\n                        </div>\n                      </template>\n                      <div style=\"padding: 0 10px\" v-if=\"presetQuestionList.length>0\">\n                        <draggable :disabled=\"disabledDrag\" item-key=\"key\" v-model=\"presetQuestionList\" @end=\"presetQuestionEnd\">\n                          <template #item=\"{ element:item }\">\n                            <div style=\"display: flex;width: 100%;margin-top: 10px\">\n                              <Icon v-if=\"!isRelease\" icon=\"ant-design:holder-outlined\" size=\"20\"></Icon>\n                              <a-input :disabled=\"isRelease\" placeholder=\"输入预设问题\" v-model:value=\"item.descr\" style=\"margin-left: 10px;\" @blur=\"onBlur(item)\" @focus=\"onFocus(item)\" @change=\"questionChange\"></a-input>\n                              <Icon v-if=\"!isRelease\" style=\"cursor: pointer;margin-left: 10px\" icon=\"ant-design:delete-outlined\" @click=\"deleteQuestionClick(item.key)\"></Icon>\n                            </div>\n                          </template>\n                        </draggable>\n                      </div>\n                      <div v-else class=\"data-empty-text\">\n                        预设问题问题是新对话的初始引导，用户可以快速发起预设对话\n                      </div>\n                    </a-form-item>\n                  </div>\n                </a-col>\n                <a-col :span=\"24\" class=\"mt-10\">\n                  <div class=\"prologue-chunk-edit\">\n                    <a-form-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.presetQuestion\" style=\"margin-bottom:0;\">\n                      <template #label>\n                        <div class=\"prompt-title-padding item-title space-between\">\n                          <div class=\"item-title\">快捷指令</div>\n                          <a-tooltip v-if=\"!isRelease\" title=\"添加快捷指令\">\n                            <Icon icon=\"ant-design:plus-outlined\" size=\"13\" style=\"margin-right: 16px;cursor: pointer\" @click=\"quickCommandAddClick\"></Icon>\n                          </a-tooltip>\n                        </div>\n                      </template>\n                      <div style=\"padding: 0 10px\" v-if=\"quickCommandList.length>0\">\n                        <draggable item-key=\"key\" v-model=\"quickCommandList\" @end=\"quickCommandEnd\">\n                          <template #item=\"{ element:item }\">\n                            <div class=\"quick-command\">\n                              <div style=\"display: flex;align-items: center\">\n                                <Icon v-if=\"item.icon\" :icon=\"item.icon\" size=\"20\"></Icon>\n                                <svg v-else width=\"14px\" height=\"14px\" viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18.9839 1.85931C19.1612 1.38023 19.8388 1.38023 20.0161 1.85931L20.5021 3.17278C20.5578 3.3234 20.6766 3.44216 20.8272 3.49789L22.1407 3.98392C22.6198 4.1612 22.6198 4.8388 22.1407 5.01608L20.8272 5.50211C20.6766 5.55784 20.5578 5.6766 20.5021 5.82722L20.0161 7.14069C19.8388 7.61977 19.1612 7.61977 18.9839 7.14069L18.4979 5.82722C18.4422 5.6766 18.3234 5.55784 18.1728 5.50211L16.8593 5.01608C16.3802 4.8388 16.3802 4.1612 16.8593 3.98392L18.1728 3.49789C18.3234 3.44216 18.4422 3.3234 18.4979 3.17278L18.9839 1.85931zM13.5482 4.07793C13.0164 2.64069 10.9836 2.64069 10.4518 4.07793L8.99368 8.01834C8.82648 8.47021 8.47021 8.82648 8.01834 8.99368L4.07793 10.4518C2.64069 10.9836 2.64069 13.0164 4.07793 13.5482L8.01834 15.0063C8.47021 15.1735 8.82648 15.5298 8.99368 15.9817L10.4518 19.9221C10.9836 21.3593 13.0164 21.3593 13.5482 19.9221L15.0063 15.9817C15.1735 15.5298 15.5298 15.1735 15.9817 15.0063L19.9221 13.5482C21.3593 13.0164 21.3593 10.9836 19.9221 10.4518L15.9817 8.99368C15.5298 8.82648 15.1735 8.47021 15.0063 8.01834L13.5482 4.07793zM5.01608 16.8593C4.8388 16.3802 4.1612 16.3802 3.98392 16.8593L3.49789 18.1728C3.44216 18.3234 3.3234 18.4422 3.17278 18.4979L1.85931 18.9839C1.38023 19.1612 1.38023 19.8388 1.85931 20.0161L3.17278 20.5021C3.3234 20.5578 3.44216 20.6766 3.49789 20.8272L3.98392 22.1407C4.1612 22.6198 4.8388 22.6198 5.01608 22.1407L5.50211 20.8272C5.55784 20.6766 5.6766 20.5578 5.82722 20.5021L7.14069 20.0161C7.61977 19.8388 7.61977 19.1612 7.14069 18.9839L5.82722 18.4979C5.6766 18.4422 5.55784 18.3234 5.50211 18.1728L5.01608 16.8593z\"/></svg>\n                                <div style=\"max-width: 400px;margin-left: 4px\" class=\"ellipsis\">{{item.name}}</div>\n                              </div>\n                              <div v-if=\"!isRelease\" style=\"align-items: center\" class=\"quick-command-icon\">\n                                <a-tooltip title=\"编辑\">\n                                  <Icon style=\"cursor: pointer;margin-left: 10px\" icon=\"ant-design:edit-outlined\" @click=\"editCommandClick(item)\"></Icon>\n                                </a-tooltip>\n                                <a-tooltip title=\"删除\">\n                                  <Icon style=\"cursor: pointer;margin-left: 10px\" icon=\"ant-design:delete-outlined\" @click=\"deleteCommandClick(item.key)\"></Icon>\n                                </a-tooltip>\n                              </div>\n                            </div>\n                          </template>\n                        </draggable>\n                      </div>\n                      <div v-else class=\"data-empty-text\">\n                        快捷指令是对话输入框上方的按钮，配置完成后，用户可以快速发起预设对话\n                      </div>\n                    </a-form-item>\n                  </div>\n                </a-col>\n                <a-col :span=\"24\" v-if=\"formState.type==='chatSimple'\" class=\"mt-10\">\n                  <div class=\"prologue-chunk\">\n                    <a-form-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.modelId\">\n                      <template #label>\n                       <div style=\"display: flex;justify-content: space-between;width: 100%;margin-right: 2px\">\n                         <div class=\"item-title\">AI模型</div>\n                         <div v-if=\"!isRelease\" @click=\"handleParamSettingClick('model')\" class=\"knowledge-txt\">\n                            <Icon icon=\"ant-design:setting-outlined\" size=\"13\" style=\"margin-right: 2px\"></Icon>参数配置\n                         </div>\n                       </div>\n                      </template>\n                      <JDictSelectTag\n                          v-model:value=\"formState.modelId\"\n                          :disabled=\"isRelease\"\n                          placeholder=\"请选择AI模型\"\n                          dict-code=\"airag_model where model_type = 'LLM' and activate_flag = 1,name,id\"\n                          style=\"width: 100%;\"\n                          @change=\"handleModelIdChange\"\n                      ></JDictSelectTag>\n                    </a-form-item>\n                  </div>\n                </a-col>\n                <a-col :span=\"24\" v-if=\"formState.type==='chatSimple'\" class=\"mt-10\">\n                  <div class=\"prologue-chunk\">\n                    <a-form-item\n                        class=\"knowledgeId\"\n                        style=\"width: 100%\"\n                        :labelCol=\"labelCol\"\n                        :wrapperCol=\"wrapperCol\"\n                        v-bind=\"validateInfos.knowledgeIds\"\n                    >\n                      <template #label>\n                        <div style=\"display: flex; justify-content: space-between; width: 100%;margin-left: 2px;\">\n                          <div class=\"item-title\">知识库</div>\n                          <div v-if=\"!isRelease\">\n                            <span @click=\"handleParamSettingClick('knowledge')\" class=\"knowledge-txt\">\n                              <Icon icon=\"ant-design:setting-outlined\" size=\"13\" style=\"margin-right: 2px\"></Icon>参数配置\n                            </span>\n                            <span @click=\"handleAddKnowledgeIdClick('knowledge')\" class=\"knowledge-txt\">\n                              <Icon icon=\"ant-design:plus-outlined\" size=\"13\" style=\"margin-right: 2px\"></Icon>添加\n                            </span>\n                          </div>\n                        </div>\n                      </template>\n                      <a-row :span=\"24\">\n                        <a-col :span=\"12\" v-for=\"item in knowledgeDataList\" v-if=\"knowledgeDataList && knowledgeDataList.length>0\">\n                          <a-card hoverable class=\"knowledge-card\" :body-style=\"{ width: '100%' }\">\n                            <div style=\"display: flex; width: 100%; justify-content: space-between\">\n                              <div>\n                                <img class=\"knowledge-img\" :src=\"knowledge\" />\n                                <span class=\"knowledge-name\" style=\"color: #e03e2d;text-decoration: line-through\" v-if=\"item.isDelete\">{{ item.name }}</span>\n                                <span class=\"knowledge-name\" v-else>{{ item.name }}</span>\n                              </div>\n                              <Icon v-if=\"!isRelease\" @click=\"handleDeleteKnowledge(item.id,'knowledge')\" icon=\"ant-design:close-outlined\" size=\"20\" class=\"knowledge-icon\"></Icon>\n                            </div>\n                          </a-card>\n                        </a-col>\n                        <div v-else class=\"data-empty-text\">\n                          添加知识库后，用户发送消息时，智能体能够引用文本知识中的内容回答用户问题。\n                        </div>\n                      </a-row>\n                    </a-form-item>\n                  </div>\n                </a-col>\n                <!-- 关联工作流多个 -->\n                <a-col :span=\"24\" v-if=\"formState.type==='chatSimple'\" class=\"mt-10\">\n                  <div class=\"prologue-chunk\">\n                    <a-form-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\">\n                      <template #label>\n                        <div style=\"display: flex;justify-content: space-between;width: 100%;\">\n                          <span>关联流程</span>\n                          <span v-if=\"!isRelease\" @click=\"handleAddFlowClick('chatSimple')\" class=\"knowledge-txt\">\n                             <Icon icon=\"ant-design:plus-outlined\" size=\"13\" style=\"margin-right: 2px\"></Icon>添加\n                          </span>\n                        </div>\n                      </template>\n                      <a-row :span=\"24\">\n                        <a-col :span=\"12\" v-for=\"flowData in flowDataList\" v-if=\"flowDataList && flowDataList.length>0\">\n                          <a-card hoverable class=\"knowledge-card\" :body-style=\"{ width: '100%' }\">\n                            <div style=\"display: flex; width: 100%; justify-content: space-between;\">\n                              <div style=\"width: 100%;display: flex;\">\n                                <img :src=\"getFlowImage(flowData.icon)\" class=\"flow-icon\"/>\n                                <div style=\"display: grid;margin-left: 5px;align-items: center;width: calc(100% - 20px)\">\n                                  <span class=\"flow-name\" style=\"color: #e03e2d;text-decoration: line-through\" v-if=\"flowData.type\">{{ flowData.name }}</span>\n                                  <span v-else class=\"flow-name ellipsis align-items: center;\">{{ flowData.name }}</span>\n                                  <div class=\"flex text-status\" v-if=\"flowData.metadata && flowData.metadata.length>0\">\n                                    <span class=\"tag-input\">输入</span>\n                                    <div v-for=\"(metaItem, index) in flowData.metadata\">\n                                      <a-tag color=\"#f2f3f8\" class=\"tags-meadata\">\n                                        <span v-if=\"index<5\" class=\"tag-text\">{{ metaItem.field }}</span>\n                                      </a-tag>\n                                    </div>\n                                  </div>\n                                </div>\n                              </div>\n                              <Icon v-if=\"!isRelease\" @click=\"handleDeleteFlow('chatSimple',flowData.id)\" icon=\"ant-design:close-outlined\" size=\"20\" class=\"knowledge-icon\"></Icon>\n                            </div>\n                          </a-card>\n                        </a-col>\n                        <div v-else class=\"data-empty-text\">\n                          工作流支持通过可视化的方式，对大语言模型、脚本、增强等功能进行组合，从而实现复杂、稳定的业务流程编排，例如旅行规划、报告分析。\n                        </div>\n                      </a-row>\n               \n                    </a-form-item>\n                  </div>\n                </a-col>\n                <!-- 插件关联区块 -->\n                <a-col :span=\"24\" v-if=\"formState.type==='chatSimple'\" class=\"mt-10\">\n                  <div class=\"prologue-chunk\">\n                    <a-form-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\">\n                      <template #label>\n                        <div style=\"display: flex; justify-content: space-between; width: 100%;margin-left: 2px;\">\n                          <div class=\"item-title\">关联MCP&插件</div>\n                          <div v-if=\"!isRelease\">\n                            <span @click=\"handleAddMcpClick\" class=\"knowledge-txt\">\n                              <Icon icon=\"ant-design:plus-outlined\" size=\"13\" style=\"margin-right: 2px\"></Icon>添加\n                            </span>\n                          </div>\n                        </div>\n                      </template>\n                      <a-row :span=\"24\">\n                        <a-col :span=\"12\" v-for=\"item in pluginDataList\" :key=\"item.id\" v-if=\"pluginDataList && pluginDataList.length>0\">\n                          <a-card hoverable class=\"knowledge-card\" :body-style=\"{ width: '100%' }\">\n                            <div style=\"display: flex; width: 100%; justify-content: space-between\">\n                              <div>\n                                <img class=\"knowledge-img\" src=\"/@/views/super/airag/aimcp/imgs/mcpLogo.png\" />\n                                <span class=\"knowledge-name\">{{ item.name }}</span>\n                              </div>\n                              <Icon v-if=\"!isRelease\" @click=\"handleDeleteMcp(item.id)\" icon=\"ant-design:close-outlined\" size=\"20\" class=\"knowledge-icon\"></Icon>\n                            </div>\n                          </a-card>\n                        </a-col>\n                        <div v-else class=\"data-empty-text\">\n                          <div style=\"margin-bottom: 8px;\">添加插件后，智能体可调用外部工具能力丰富对话。</div>\n                          <div class=\"mcp-warning-tip\">\n                            <Icon icon=\"ant-design:exclamation-circle-outlined\" style=\"margin-right: 4px;\" />\n                            <span>注意：部分大模型暂不支持工具调用功能，请确认所选模型兼容性</span>\n                          </div>\n                        </div>\n                      </a-row>\n                    </a-form-item>\n                  </div>\n                </a-col>\n                <a-col :span=\"24\" class=\"mt-10\" v-if=\"formState.type==='chatSimple'\">\n                  <a-collapse v-model:activeKey=\"memoryActiveKey\" :bordered=\"false\" style=\"background-color: transparent\">\n                    <a-collapse-panel key=\"1\">\n                      <template #header>\n                        <div style=\"font-weight: 600;color: rgba(32,41,69,0.62);font-size: 14px;justify-content: space-between;display: flex; width: 100%\">\n                          <span>记忆</span>\n                          <a-switch @click.prevent.stop=\"\" :disabled=\"isRelease\" v-model:checked=\"izOpenMemoryChecked\" checked-children=\"开\" un-checked-children=\"关\" @change=\"handleMemoryChange\"></a-switch>\n                        </div>\n                      </template>\n                      <div v-if=\"izOpenMemoryChecked\">\n                        <div class=\"prologue-chunk\">\n                          <div style=\"display: flex; justify-content: space-between; width: 100%;margin-left: 2px;\">\n                            <div class=\"item-title\">变量</div>\n                            <div v-if=\"!isRelease\">\n                              <span @click=\"handleAddVariable\" class=\"knowledge-txt\">\n                                <Icon icon=\"ant-design:plus-outlined\" size=\"13\" style=\"margin-right: 2px\"></Icon>添加\n                              </span>\n                            </div>\n                          </div>\n                          <div v-if=\"formState.variables\">\n                            <div style=\"display: flex; flex-wrap: wrap; gap: 5px; padding-top: 8px;margin-bottom: 8px\">\n                              <a-tag v-for=\"(item, index) in variablesList\"\n                                     :key=\"index\"\n                                     color=\"#2e2e3814\"\n                                     style=\"color: #6b6b75;border-radius: 4px; border: none; padding: 0 5px;\">\n                                {{ item.name }}\n                              </a-tag>\n                            </div>\n                          </div>\n                          <div v-else class=\"data-empty-text\">\n                            用于保存用户个人信息，让智能体记住用户的特征，使回复更加个性化。\n                          </div>\n                        </div>\n                        <div class=\"prologue-chunk\" style=\"margin-top: 10px;\">\n                          <div style=\"display: flex; justify-content: space-between; width: 100%;margin-left: 2px;\">\n                            <div class=\"item-title\">长期记忆</div>\n                            <div v-if=\"!isRelease\">\n                              <span @click=\"handleAddKnowledgeIdClick('memory')\" class=\"knowledge-txt\">\n                                <Icon icon=\"ant-design:plus-outlined\" size=\"13\" style=\"margin-right: 2px\"></Icon>添加\n                              </span>\n                            </div>\n                          </div>\n                          <div v-if=\"memoryData\" class=\"prologue-chunk\">\n                            <a-form-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.memoryId\">\n                              <a-card hoverable class=\"knowledge-card\" :body-style=\"{ width: '100%' }\">\n                                <div style=\"display: flex; width: 100%; justify-content: space-between\">\n                                  <div>\n                                    <img class=\"knowledge-img\" :src=\"knowledge\" />\n                                    <span class=\"knowledge-name\" style=\"color: #e03e2d;text-decoration: line-through\" v-if=\"memoryData.isDelete\">{{ memoryData.name }}</span>\n                                    <span class=\"knowledge-name\" v-else>{{ memoryData.name }}</span>\n                                  </div>\n                                  <Icon v-if=\"!isRelease\" @click=\"handleDeleteKnowledge(memoryData.id,'memgory')\" icon=\"ant-design:close-outlined\" size=\"20\" class=\"knowledge-icon\"></Icon>\n                                </div>\n                              </a-card>\n                            </a-form-item>\n                          </div>\n                          <div v-else class=\"data-empty-text\">\n                            开启后可总结聊天对话的内容，并用于更好的响应用户的消息。\n                          </div>\n                        </div>\n                        <div class=\"prologue-chunk\" style=\"margin-top: 20px;\">\n                          <div class=\"prompt-title-padding item-title space-between\">\n                            <span>记忆与变量提示词</span>\n                            <div style=\"align-items: center;display:flex;justify-content: center\" v-if=\"!isRelease\">\n                              <a-button size=\"middle\" ghost>\n                                 <span style=\"align-items: center;display:flex\" @click=\"generateVariablePrompt\">\n                                   <svg width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18.9839 1.85931C19.1612 1.38023 19.8388 1.38023 20.0161 1.85931L20.5021 3.17278C20.5578 3.3234 20.6766 3.44216 20.8272 3.49789L22.1407 3.98392C22.6198 4.1612 22.6198 4.8388 22.1407 5.01608L20.8272 5.50211C20.6766 5.55784 20.5578 5.6766 20.5021 5.82722L20.0161 7.14069C19.8388 7.61977 19.1612 7.61977 18.9839 7.14069L18.4979 5.82722C18.4422 5.6766 18.3234 5.55784 18.1728 5.50211L16.8593 5.01608C16.3802 4.8388 16.3802 4.1612 16.8593 3.98392L18.1728 3.49789C18.3234 3.44216 18.4422 3.3234 18.4979 3.17278L18.9839 1.85931zM13.5482 4.07793C13.0164 2.64069 10.9836 2.64069 10.4518 4.07793L8.99368 8.01834C8.82648 8.47021 8.47021 8.82648 8.01834 8.99368L4.07793 10.4518C2.64069 10.9836 2.64069 13.0164 4.07793 13.5482L8.01834 15.0063C8.47021 15.1735 8.82648 15.5298 8.99368 15.9817L10.4518 19.9221C10.9836 21.3593 13.0164 21.3593 13.5482 19.9221L15.0063 15.9817C15.1735 15.5298 15.5298 15.1735 15.9817 15.0063L19.9221 13.5482C21.3593 13.0164 21.3593 10.9836 19.9221 10.4518L15.9817 8.99368C15.5298 8.82648 15.1735 8.47021 15.0063 8.01834L13.5482 4.07793zM5.01608 16.8593C4.8388 16.3802 4.1612 16.3802 3.98392 16.8593L3.49789 18.1728C3.44216 18.3234 3.3234 18.4422 3.17278 18.4979L1.85931 18.9839C1.38023 19.1612 1.38023 19.8388 1.85931 20.0161L3.17278 20.5021C3.3234 20.5578 3.44216 20.6766 3.49789 20.8272L3.98392 22.1407C4.1612 22.6198 4.8388 22.6198 5.01608 22.1407L5.50211 20.8272C5.55784 20.6766 5.6766 20.5578 5.82722 20.5021L7.14069 20.0161C7.61977 19.8388 7.61977 19.1612 7.14069 18.9839L5.82722 18.4979C5.6766 18.4422 5.55784 18.3234 5.50211 18.1728L5.01608 16.8593z\"/></svg>\n                                   <span style=\"margin-left: 4px\">生成</span>\n                                 </span>\n                              </a-button>\n                            </div>\n                          </div>\n                          <a-spin :spinning=\"memoryLoading\" tip=\"为您编排应用程序中…\">\n                            <a-textarea :disabled=\"memoryLoading\" :rows=\"6\" v-model:value=\"formState.memoryPrompt\" placeholder=\"点击生成按钮生成记忆与变量提示词\"/>\n                          </a-spin>\n                        </div>\n                      </div>\n                    </a-collapse-panel>\n                  </a-collapse>\n                </a-col>\n                <a-col :span=\"24\" class=\"mt-10\">\n                  <div class=\"prologue-chunk\">\n                    <a-form-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.msgNum\">\n                      <template #label>\n                        <div style=\"margin-left: 2px\">历史聊天记录</div>\n                      </template>\n                      <a-input-number :disabled=\"isRelease\" v-model:value=\"formState.msgNum\"></a-input-number>\n                    </a-form-item>\n                  </div>\n                </a-col>\n                <a-col :span=\"24\" class=\"mt-10\">\n                  <div class=\"prologue-chunk\">\n                    <div style=\"margin-left: 2px\">个性化设置</div>\n                    <a-row>\n                      <a-form-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.multiSession\">\n                        <div style=\"display: flex;margin-top: 10px\">\n                          <div style=\"margin-left: 2px\">多会话模式：</div>\n                          <a-switch :disabled=\"isRelease\" v-model:checked=\"multiSessionChecked\" checked-children=\"开\" un-checked-children=\"关\" @change=\"handleMultiSessionChange\"></a-switch>\n                        </div>\n                      </a-form-item>\n                    </a-row>\n                    <a-row>\n                      <a-form-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\">\n                        <div style=\"display: flex;margin-top: 10px\">\n                          <div style=\"margin-left: 2px\">开启绘画能力：</div>\n                          <a-switch :disabled=\"isRelease\" v-model:checked=\"izDrawChecked\" checked-children=\"开\" un-checked-children=\"关\" @change=\"handleDrawChange\"></a-switch>\n                        </div>\n                      </a-form-item>\n                    </a-row>\n                    <a-row v-if=\"izDrawChecked\" class=\"mt-10\">\n                      <a-col :span=\"24\">\n                        <a-form-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.drawModelId\">\n                          <span style=\"margin-left: 2px; margin-bottom: 5px\">绘画模型：</span>\n                          <JDictSelectTag\n                              v-model:value=\"formState.drawModelId\"\n                              :disabled=\"isRelease\"\n                              placeholder=\"请选择会话模型\"\n                              dict-code=\"airag_model where model_type = 'IMAGE' and activate_flag = 1,name,id\"\n                              @change=\"handleDrawModelChange\"\n                          ></JDictSelectTag>\n                        </a-form-item>\n                      </a-col>\n                    </a-row>\n                  </div>\n                </a-col>\n              </a-row>\n            </a-form>\n          </a-col>\n          <a-col :span=\"14\" class=\"setting-right\">\n            <chat \n              :uuid=\"uuid\" \n              :prologue=\"prologue\" \n              :appId=\"appId\" \n              :formState=\"formState\" \n              url=\"/airag/app/debug\" \n              :presetQuestion=\"presetQuestion\" \n              :quickCommandData=\"quickCommandList\"\n              :hasExtraFlowInputs=\"hasExtraFlowInputs\"\n              :conversationSettings=\"conversationSettings\"\n              @edit-settings=\"handleEditSettings\"\n            ></chat>\n          </a-col>\n        </a-row>\n      </div>\n    </BasicModal>\n\n    <!--  Ai知识库选择弹窗   -->\n    <AiAppAddKnowledgeModal :multiple=\"knowledgeMultiple\" :type=\"knowledgeMultiple?'knowledge':'memory'\" @register=\"registerKnowledgeModal\" @success=\"handleSuccess\"></AiAppAddKnowledgeModal>\n    <!--  插件选择弹窗   -->\n    <AiAppAddMcpModal @register=\"registerMcpModal\" @success=\"handleMcpSuccess\"></AiAppAddMcpModal>\n    <!--  Ai添加流程弹窗  -->\n    <AiAppAddFlowModal @register=\"registerFlowModal\" @success=\"handleAddFlowSuccess\" :multiple=\"multiple\"></AiAppAddFlowModal>\n    <!-- Ai配置弹窗   -->\n    <AiAppParamsSettingModal @register=\"registerParamsSettingModal\" @ok=\"handleParamsSettingOk\"></AiAppParamsSettingModal>\n    <!--  Ai应用新增编辑弹窗  -->\n    <AiAppModal @register=\"registerAiAppModal\" @success=\"handelEditSuccess\"></AiAppModal>\n    <!-- Ai生成器   -->\n    <AiAppGeneratedPromptModal @register=\"registerAiAppPromptModal\" @ok=\"handleAiAppPromptOk\"></AiAppGeneratedPromptModal>\n    <!-- Ai提示词选择弹窗   -->\n    <AiAppPromptMarketModal @register=\"registerAiPromptSelectModal\" @ok=\"handleAiAppPromptOk\"></AiAppPromptMarketModal>\n    <!--  Ai快捷指令  -->\n    <AiAppQuickCommandModal @register=\"registerAiAppCommandModal\" @ok=\"handleAiAppCommandOk\" @update-ok=\"handleAiAppCommandUpdateOk\"></AiAppQuickCommandModal>\n    <!-- 对话设置弹窗 -->\n    <ConversationSettingsModal\n      ref=\"settingsModalRef\"\n      :flowInputs=\"flowInputs\"\n      conversationId=\"debug\"\n      :existingSettings=\"conversationSettings\"\n      @ok=\"handleSettingsOk\"\n    />\n    <!--  用户变量  -->\n    <AiUserVariablesModal @register=\"registerVariablesModal\" @ok=\"handleVariablesOk\"></AiUserVariablesModal>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { ref, reactive, nextTick, computed, watch } from 'vue';\n  import BasicModal from '@/components/Modal/src/BasicModal.vue';\n  import { useModal, useModalInner } from '@/components/Modal';\n  import { Form, TimePicker, Collapse, CollapsePanel } from 'ant-design-vue';\n  import { initDictOptions } from '@/utils/dict';\n  import { queryKnowledgeBathById, saveApp, queryById, queryFlowById, queryFlowByIds, queryKnowledgeById, generateMemoryByAppId } from '../AiApp.api';\n  import { defHttp } from '@/utils/http/axios';\n  import JDictSelectTag from '@/components/Form/src/jeecg/components/JDictSelectTag.vue';\n  import AiAppAddKnowledgeModal from './AiAppAddKnowledgeModal.vue';\n  import AiAppAddMcpModal from './AiAppAddMcpModal.vue';\n  import AiAppParamsSettingModal from './AiAppParamsSettingModal.vue';\n  import AiAppGeneratedPromptModal from './AiAppGeneratedPromptModal.vue';\n  import AiAppPromptMarketModal from './AiAppPromptMarketModal.vue';\n  import AiAppQuickCommandModal from './AiAppQuickCommandModal.vue';\n  import AiAppAddFlowModal from './AiAppAddFlowModal.vue';\n  import AiAppModal from './AiAppModal.vue';\n  import chat from '../chat/chat.vue';\n  import ConversationSettingsModal from '../chat/components/ConversationSettingsModal.vue';\n  import knowledge from '/@/views/super/airag/aiknowledge/icon/knowledge.png';\n  import { cloneDeep } from 'lodash-es';\n  import JImageUpload from '@/components/Form/src/jeecg/components/JImageUpload.vue';\n  import defaultImg from '../img/ailogo.png';\n  import { getFileAccessHttpUrl, randomString } from \"@/utils/common/compUtils\";\n  import JSearchSelect from \"@/components/Form/src/jeecg/components/JSearchSelect.vue\";\n  import JMarkdownEditor from \"@/components/Form/src/jeecg/components/JMarkdownEditor.vue\";\n  import AiAppJson from './AiApp.json'\n  import draggable from 'vuedraggable';\n  import { useMessage } from \"@/hooks/web/useMessage\";\n  import defaultFlowImg from \"@/assets/images/ai/aiflow.png\";\n  import AiUserVariablesModal from \"./AiUserVariablesModal.vue\";\n  \n  export default {\n    name: 'AiAppSettingModal',\n    components: {\n      draggable,\n      JMarkdownEditor,\n      JSearchSelect,\n      JImageUpload,\n      JDictSelectTag,\n      BasicModal,\n      AiAppAddKnowledgeModal,\n      AiAppAddMcpModal,\n      AiAppParamsSettingModal,\n      AiAppAddFlowModal,\n      AiAppModal,\n      chat,\n      ConversationSettingsModal,\n      AiAppGeneratedPromptModal,\n      AiAppQuickCommandModal,\n      AiAppPromptMarketModal,\n      AiUserVariablesModal,\n    },\n    emits: ['success', 'register'],\n    setup(props, { emit }) {\n      const title = ref<string>('设置');\n\n      //保存或修改\n      const isUpdate = ref<boolean>(false);\n      //uuid\n      const uuid = ref(randomString(16));\n      //app类型\n      const appTypeOption = ref<any>([]);\n      //应用类型\n      const type = ref<string>('chatSimple');\n      //form表单数据\n      const formState = reactive<any>({\n        name: '',\n        descr: '',\n        msgNum: 1,\n        prompt: '',\n        prologue: null,\n        knowledgeIds: '',\n        id: '',\n        type: '',\n        modelId: '',\n        icon: '',\n        presetQuestion:'',\n        memoryId: '',\n        variables: '',\n        izOpenMemory: 1,\n        memoryPrompt: '',\n        drawModelId: '',\n      });\n\n      //表单验证\n      const validatorRules = ref<any>({\n        name: [{ required: true, message: '请输入应用名称!' }],\n        modelId: [{ required: true, message: '请选择AI模型!' }],\n        flowId:[{ required: true, message: '请选择AI流程!' }],\n        drawModelId: [{  required: true, message: '请选择绘画模型!' }]\n      });\n      //注册form\n      const useForm = Form.useForm;\n      const { resetFields, validate, validateInfos } = useForm(formState, validatorRules, { immediate: false });\n      const labelCol = ref<any>({ span: 24 });\n      const wrapperCol = ref<any>({ span: 24 });\n      //关联知识库的id\n      const knowledgeIds = ref<any>('');\n      //知识库集合\n      const knowledgeDataList = ref<any>([]);\n      //记忆库的数据\n      const memoryData = ref<any>(null);\n      const knowledgeMultiple = ref<boolean>(true);\n      // 插件id集合（只存id）\n      const pluginIds = ref<any>([]);\n      // 插件对象集合（包含name等）\n      const pluginDataList = ref<any>([]);\n      // 插件结构（保存时写入 formState.plugins）\n      const plugins = ref<any>([]);\n      //开场白的数据\n      const prologue = ref<any>('');\n      //应用id\n      const appId = ref<any>('');\n      //参数配置\n      const metadata = ref<any>({});\n      const presetQuestion = ref<string>('');\n      //预设问题集合\n      const presetQuestionList = ref<any>([{ key:1, sort: 1, descr: '' }]);\n      //快捷指令集合\n      const quickCommandList = ref<any>([]);\n      //快捷指令\n      const quickCommand = ref<any>('');\n      const { createMessage } = useMessage();\n      //多会话模式选中状态\n      const multiSessionChecked = ref<boolean>(true);\n      //开启会话能力\n      const izDrawChecked = ref<boolean>(false);\n      // 是否已发布\n      const isRelease = ref<boolean>(false);\n      //对话设置弹窗ref\n      const settingsModalRef = ref();\n      //工作流入参列表\n      const flowInputs = ref<any[]>([]);\n      //对话设置（用于调试模式）\n      const conversationSettings = ref<Record<string, any>>({});\n      //流程数据集合\n      const flowDataList = ref<any>([]);\n      //多个流程id\n      const flowIds = ref<string>('');\n      //是否多选\n      const multiple = ref<boolean>(false);\n      //变量数据\n      const variablesList = ref<any>([]);\n      //是否开启记忆\n      const izOpenMemoryChecked = ref<any>(false);\n      //记忆折叠面板\n      const memoryActiveKey = ref<any>();\n      //记忆提示词是否加载\n      const memoryLoading = ref<any>(false);\n      \n      //注册modal\n      const [registerModal, { closeModal, setModalProps }] = useModalInner(async (data) => {\n        appId.value = data.id;\n        isUpdate.value = !!data?.isUpdate;\n        isRelease.value = data?.status === 'release';\n        clearParam();\n        if (isUpdate.value) {\n          setTimeout(() => {\n            setFormState(data);\n          }, 300);\n        } else {\n          //新增成功之后需要有id\n          queryById({ id: data.id }).then((res) => {\n            if (res.success) {\n              resetFields();\n              //赋值\n              Object.assign(formState, res.result);\n              formState.prompt = cloneDeep(AiAppJson.prompt);\n              formState.prologue = cloneDeep(AiAppJson.prologue);\n              formState.presetQuestion = JSON.stringify(cloneDeep(AiAppJson.presetQuestion));\n              formState.msgNum = 1;\n              prologue.value = cloneDeep(AiAppJson.prologue);\n              presetQuestion.value = formState.presetQuestion;\n              presetQuestionList.value = cloneDeep(AiAppJson.presetQuestion);\n              addRules(res.result.type)\n            }\n          });\n        }\n        setModalProps({ bodyStyle: { padding: '10px' } });\n      });\n\n      //注册modal\n      const [registerKnowledgeModal, { openModal }] = useModal();\n      const [registerMcpModal, { openModal: openMcpModal }] = useModal();\n      const [registerFlowModal, { openModal: registerFlowOpen }] = useModal();\n      const [registerParamsSettingModal, { openModal: paramsSettingOpen }] = useModal();\n      const [registerAiAppModal, { openModal: aiAppModalOpen }] = useModal();\n      const [registerAiAppPromptModal, { openModal: aiAppPromptModalOpen }] = useModal();\n      const [registerAiAppCommandModal, { openModal: aiAppCommandModalOpen }] = useModal();\n      const [registerAiPromptSelectModal, { openModal: aiPromptSelectModalOpen }] = useModal();\n      const [registerVariablesModal, { openModal: aiVariablesModalOpen }] = useModal();\n\n      /**\n       * 保存\n       */\n      async function handleOk() {\n        try {\n          let values = await validate();\n          setModalProps({ confirmLoading: true });\n          formState.knowledgeIds = knowledgeIds.value;\n          if(flowIds.value){\n            formState.flowId = flowIds.value;\n          }\n          await saveApp(formState);\n          emit('success')\n        } finally {\n          setModalProps({ confirmLoading: false });\n        }\n      }\n\n      //初始化AI应用类型\n      initAppTypeOption();\n\n      function initAppTypeOption() {\n        initDictOptions('ai_app_type').then((data) => {\n          if (data && data.length > 0) {\n            for (const datum of data) {\n              if (datum.value === 'chatSimple') {\n                datum['desc'] = '适合新手创建小助手';\n              } else if (datum.value === 'chatFLow') {\n                datum['desc'] = '适合高级用户自定义小助手的工作流';\n              }\n            }\n          }\n          appTypeOption.value = data;\n        });\n      }\n\n      /**\n       * 取消\n       */\n      function handleCancel() {\n        closeModal();\n      }\n\n      /**\n       * 应用类型点击事件\n       */\n      function handleTypeClick(val) {\n        type.value = val;\n      }\n\n      /**\n       * 添加关联知识库\n       * \n       * @param type\n       */\n      function handleAddKnowledgeIdClick(type) {\n        //update-begin---author:wangshuai---date:2025-12-29---for:【QQYUN-14265】【AI】支持记忆---\n        knowledgeMultiple.value = type === 'knowledge'\n        if(type === 'knowledge'){\n          openModal(true, {\n            knowledgeIds: knowledgeIds.value,\n            knowledgeDataList: knowledgeDataList.value,\n          });\n        } else {\n          openModal(true, {\n            knowledgeIds: formState.memoryId,\n            knowledgeData: memoryData.value,\n          });\n        }\n        //update-end---author:wangshuai---date:2025-12-29---for:【QQYUN-14265】【AI】支持记忆---\n      }\n\n      /**\n       * 添加关联MCP\n       */\n      function handleAddMcpClick(){\n        openMcpModal(true,{\n          pluginIds: pluginIds.value,\n          pluginDataList: pluginDataList.value\n        })\n      }\n\n      /**\n       * 选中回调事件\n       * @param knowledgeId\n       * @param knowledgeData\n       */\n      function handleSuccess(knowledgeId, knowledgeData) {\n        //update-begin---author:wangshuai---date:2025-12-29---for:【QQYUN-14265】【AI】支持记忆---\n        if(knowledgeMultiple.value){\n          knowledgeIds.value = cloneDeep(knowledgeId.join(','));\n          knowledgeDataList.value = cloneDeep(knowledgeData);\n          formState.knowledgeIds = knowledgeIds.value;\n        } else {\n          formState.memoryId = knowledgeId;\n          memoryData.value = knowledgeData;\n        }\n        //update-end---author:wangshuai---date:2025-12-29---for:【QQYUN-14265】【AI】支持记忆---\n      }\n\n      /**\n       * MCP选中成功回调\n       * @param ids\n       * @param dataList\n       * @param pluginStruct\n       */\n      function handleMcpSuccess(ids, dataList, pluginStruct){\n        pluginIds.value = cloneDeep(ids);\n        pluginDataList.value = cloneDeep(dataList);\n        plugins.value = cloneDeep(pluginStruct);\n        formState.plugins = JSON.stringify(plugins.value);\n      }\n\n      /**\n       * 删除知识库\n       */\n      function handleDeleteKnowledge(id, type) {\n        //update-begin---author:wangshuai---date:2025-12-29---for:【QQYUN-14265】【AI】支持记忆---\n        //update-begin---author:wangshuai---date:2026-01-14---for:【QQYUN-14562】【ai应用】记忆添加后，×不掉---\n        if(type === 'knowledge'){\n        //update-end---author:wangshuai---date:2026-01-14---for:【QQYUN-14562】【ai应用】记忆添加后，×不掉---\n          let array = knowledgeIds.value.split(',');\n          let findIndex = array.findIndex((item) => item === id);\n          if (findIndex != -1) {\n            array.splice(findIndex, 1);\n            knowledgeIds.value = array ? array.join(',') : '';\n            knowledgeDataList.value.splice(findIndex, 1);\n            formState.knowledgeIds = knowledgeIds.value;\n          }\n        } else {\n          formState.memoryId = \"\";\n          memoryData.value = null;\n        //update-end---author:wangshuai---date:2025-12-29---for:【QQYUN-14265】【AI】支持记忆---\n        }\n      }\n\n      /**\n       * 删除MCP\n       */\n      function handleDeleteMcp(id){\n        const findIndex = pluginIds.value.findIndex((item:any)=> item === id);\n        if(findIndex>-1){\n          pluginIds.value.splice(findIndex,1);\n          pluginDataList.value.splice(findIndex,1);\n          plugins.value = pluginDataList.value.map((it:any)=> ({ pluginId: it.id, pluginName: it.name, category: 'mcp'}));\n          formState.plugins = JSON.stringify(plugins.value);\n        }\n      }\n\n      /**\n       * 根据知识库id查询知识库内容\n       * @param ids\n       */\n      function getKnowledgeDataList(ids) {\n        queryKnowledgeBathById({ ids: ids }).then((res) => {\n          //update-begin---author:wangshuai---date:2025-04-24---for:【QQYUN-12133】【AI】应用关联的知识库呗删除后，再次进入应用看不到已删除的知识库，并且无法清理掉知识库。---\n          if (res.success && res.result) {\n            let result = res.result;\n            let idArray = ids.split(\",\");\n            let arr:any = [];\n            for (const id of idArray) {\n              let filter = result.filter((item) => item.id === id);\n              if(filter && filter.length > 0) {\n                arr.push({ id: id, name: filter[0].name});\n              } else {\n                arr.push({ name: '该知识库已被删除', id: id,isDelete: true })\n              }\n            }\n            knowledgeDataList.value = arr;\n            knowledgeIds.value = ids;\n          } else {\n            let arr:any = [];\n            for (const id of ids) {\n              arr.push({ name: '该知识库已被删除', id: id, isDelete: true })\n            }\n            knowledgeDataList.value = arr;\n            knowledgeIds.value = ids;\n          }\n          //update-end---author:wangshuai---date:2025-04-24---for:【QQYUN-12133】【AI】应用关联的知识库呗删除后，再次进入应用看不到已删除的知识库，并且无法清理掉知识库。---\n        });\n      }\n\n      /**\n       * 开场白值改变事件\n       */\n      function prologueTextAreaBlur(value) {\n        prologue.value = value;\n      }\n\n      /**\n       * 关闭弹窗触发列表刷新\n       *\n       * @param value\n       */\n      function visibleChange(value) {\n        if(!value){\n          emit('success');\n        }\n      }\n\n      /**\n       * 添加检验\n       *\n       * @param type\n       */\n      function addRules(type){\n        if(type === 'chatSimple') {\n          validatorRules.value = {\n            name: [{ required: true, message: '请输入应用名称!' }],\n            modelId: [{ required: true, message: '请选择AI模型!' }],\n          }\n        }else if(type === 'chatFLow') {\n          validatorRules.value = {\n            name: [{ required: true, message: '请输入应用名称!' }],\n            flowId:[{ required: true, message: '请选择AI流程!' }]\n          }\n        }\n      }\n\n      /**\n       * 参数配置点击事件\n       * @param value\n       */\n      function handleParamSettingClick(value) {\n        paramsSettingOpen(true,{ type: value, metadata : metadata.value })\n      }\n\n      /**\n       * 参数配置确定回调事件\n       *\n       * @param value\n       */\n      function handleParamsSettingOk(value){\n        Object.assign(metadata.value,value)\n        if(value) {\n          formState.metadata = JSON.stringify(metadata.value);\n        }\n      }\n\n      //流程id\n      const flowId = ref<string>('');\n      //流程数据\n      const flowData = ref<any>(null);\n\n      /**\n       * 根据流程id查询流程\n       */\n      function getFlowDataById(id) {\n        queryFlowById({ id: id}).then((res) =>{\n          if(res.success){\n            flowData.value = res.result;\n            flowId.value = res.result.id;\n            if(res.result.metadata){\n              let metadata = JSON.parse(res.result.metadata);\n              if(metadata.inputs){\n                flowData.value.metadata = metadata.inputs;\n              }\n            }\n          }\n        })\n      }\n\n      /**\n       * 添加流程\n       * @param type 是否多选\n       */\n      function handleAddFlowClick(type) {\n        //update-begin---author:wangshuai---date:2025-12-24---for:【QQYUN-14267】创建应用的时候，选择工作流，让应用可以像调用MCP一样去调用流程: 单选和多选做区分---\n        multiple.value = type === 'chatSimple';\n        if(type === 'chatSimple'){\n          registerFlowOpen(true,{ flowId: flowIds.value, flowData: flowDataList.value })\n        } else {\n          registerFlowOpen(true,{ flowId: flowId.value, flowData: flowData.value })\n        }\n        //update-end---author:wangshuai---date:2025-12-24---for:【QQYUN-14267】创建应用的时候，选择工作流，让应用可以像调用MCP一样去调用流程: 单选和多选做区分---\n      }\n\n      /**\n       * 添加流程确定事件\n       * @param values\n       */\n      function handleAddFlowSuccess(values) {\n        //update-begin---author:wangshuai---date:2025-12-24---for:【QQYUN-14267】创建应用的时候，选择工作流，让应用可以像调用MCP一样去调用流程: 单选和多选做区分---\n        if(multiple.value){\n          flowIds.value = values.flowId?.join(\",\");\n          flowDataList.value = values.flowData;\n        } else {\n          flowId.value = values.flowId;\n          formState.flowId = values.flowId;\n          flowData.value = values.flowData;\n        }\n        //update-end---author:wangshuai---date:2025-12-24---for:【QQYUN-14267】创建应用的时候，选择工作流，让应用可以像调用MCP一样去调用流程: 单选和多选做区分---\n      }\n\n      /**\n       * 删除流程\n       */\n      function handleDeleteFlow(type, id = '') {\n        //update-begin---author:wangshuai---date:2025-12-24---for:【QQYUN-14267】创建应用的时候，选择工作流，让应用可以像调用MCP一样去调用流程: 单选和多选做区分---\n        if(type === 'chatFLow'){\n          flowId.value = \"\";\n          formState.flowId = \"\";\n          flowData.value = null;\n        } else {\n          let array = flowIds.value.split(',');\n          let findIndex = array.findIndex((item) => item === id);\n          if (findIndex != -1) {\n            array.splice(findIndex, 1);\n            flowIds.value = array ? array.join(',') : '';\n            flowDataList.value.splice(findIndex, 1);\n          }\n        }\n        //update-end---author:wangshuai---date:2025-12-24---for:【QQYUN-14267】创建应用的时候，选择工作流，让应用可以像调用MCP一样去调用流程: 单选和多选做区分---\n      }\n\n      /**\n       * 获取图标\n       */\n      function getImage() {\n        return formState.icon ? getFileAccessHttpUrl(formState.icon): defaultImg;\n      }\n\n      /**\n       * 获取流程图标\n       */\n      function getFlowImage(icon) {\n        return icon ? getFileAccessHttpUrl(icon) : defaultFlowImg;\n      }\n\n      /**\n       * 编辑应用弹窗\n       */\n      function handleEdit() {\n        aiAppModalOpen(true,{\n          isUpdate: true,\n          record: formState\n        })\n      }\n\n      /**\n       * 应用编辑回调事件\n       *\n       * @param values\n       */\n      function handelEditSuccess(values) {\n        formState.icon = values.icon ? values.icon:'';\n        formState.name = values.name ? values.name:'';\n      }\n\n      //=========== begin预设问题 ===========================\n\n      // 编辑状态不允许拖动\n      const disabledDrag = computed(()=>{\n        let list = presetQuestionList.value;\n        if(list && list.length>0){\n          let arr = list.filter(item=>item.update==true)\n          if(arr.length>0){\n            return true\n          }\n        }\n        return false;\n      });\n\n      /**\n       * 预设问题拖拽\n       */\n      function presetQuestionEnd(){\n        presetQuestion.value = JSON.stringify(presetQuestionList.value);\n        formState.presetQuestion = presetQuestion.value;\n      }\n\n      /**\n       * 预设问题添加\n       *\n       * @param e\n       */\n      function presetQuestionAddClick(e){\n        let find = presetQuestionList.value.find((item)=> item.descr == '');\n        if(find){\n          return;\n        }\n        const length = presetQuestionList.value.length;\n        presetQuestionList.value.push({key: length + 1, sort: length + 1, descr: ''})\n      }\n\n      /**\n       * 预设问题删除\n       *\n       * @param key\n       */\n      function deleteQuestionClick(key){\n        presetQuestionList.value = presetQuestionList.value.filter((item) => item.key !== key);\n        presetQuestion.value = JSON.stringify(presetQuestionList.value);\n        formState.presetQuestion = presetQuestion.value;\n      }\n\n      /**\n       * input聚焦事件\n       * @param item\n       */\n      function onFocus(item){\n        item.update = true;\n      }\n\n      /**\n       * input 失焦事件\n       * @param item\n       */\n      function onBlur(item){\n        item.update = false;\n      }\n\n      /**\n       * 预设问题值改变事件\n       *\n       */\n      function questionChange() {\n        if(presetQuestionList.value && presetQuestionList.value.length>0){\n          presetQuestion.value = JSON.stringify(presetQuestionList.value);\n          formState.presetQuestion = presetQuestion.value;\n        }else{\n          presetQuestion.value = \"\";\n          formState.presetQuestion = \"\";\n        }\n      }\n\n      //=========== end预设问题 ===========================\n\n      /**\n       * 根据多个流程id查询流程\n       */\n      function getFlowDataByIds(ids) {\n        queryFlowByIds({ id: ids, pageNo:1, pageSize: 100 }).then((res) =>{\n          if(res.success && res.result){\n            let records = res.result.records || [];\n            let idArray = ids.split(\",\");\n            let arr:any = [];\n            let idsList:any = [];\n\n            for (const id of idArray) {\n              let item = records.find(r => r.id === id);\n              if (item) {\n                if(item.metadata){\n                  try {\n                    let metadata = JSON.parse(item.metadata);\n                    if(metadata.inputs){\n                      item.metadata = metadata.inputs;\n                    }\n                  } catch (e) {\n                    console.error(\"metadata parse error\", e);\n                  }\n                }\n                arr.push(item);\n              } else {\n                arr.push({ name: '该流程已被删除', id: id, type: 'delete' });\n              }\n              idsList.push(id);\n            }\n            flowDataList.value = arr;\n            flowIds.value = idsList.join(\",\");\n          } else {\n            let arr:any = [];\n            let idArray = ids.split(\",\");\n            for (const id of idArray) {\n              arr.push({ name: '该流程已被删除', id: id, type: 'delete'})\n            }\n            flowDataList.value = arr;\n            flowIds.value = ids;\n          }\n        })\n      }\n\n      /**\n       * 清除参数\n       */\n      function clearParam() {\n        knowledgeIds.value = '';\n        knowledgeDataList.value = [];\n        memoryData.value = null;\n        pluginIds.value = [];\n        pluginDataList.value = [];\n        plugins.value = [];\n        prologue.value = '';\n        flowId.value = '';\n        flowData.value = null;\n        flowDataList.value = [];\n        flowIds.value = '';\n        presetQuestion.value = '';\n        presetQuestionList.value = [{ key:1, sort: 1, descr: '' }];\n        quickCommandList.value = [];\n        quickCommand.value = '';\n        multiSessionChecked.value = true;\n        variablesList.value = [];\n        izOpenMemoryChecked.value = false;\n        memoryLoading.value = false;\n        memoryActiveKey.value = [];\n      }\n\n      /**\n       * 设置form属性\n       * @param data\n       */\n      function setFormState(data: any) {\n        resetFields();\n        addRules(data.type)\n        if (data.prologue) {\n          prologue.value = data.prologue ? data.prologue : '';\n        }\n        data.msgNum = data.msgNum ? data.msgNum : 1;\n        if(data.metadata){\n          metadata.value = JSON.parse(data.metadata);\n          if(metadata.value?.multiSession){\n            multiSessionChecked.value = metadata.value.multiSession === '1';\n          }else{\n            multiSessionChecked.value = true;\n          }\n          if(metadata.value?.izDraw){\n            izDrawChecked.value = metadata.value.izDraw === '1';\n          }else{\n            izDrawChecked.value = false;\n          }\n          if(metadata.value?.drawModelId){\n            formState.drawModelId = metadata.value.drawModelId;\n          }\n        }\n        if(data.presetQuestion){\n          presetQuestion.value = data.presetQuestion;\n          presetQuestionList.value = JSON.parse(data.presetQuestion);\n        }\n        if(data.quickCommand){\n          //update-begin---author:wangshuai---date:2025-04-08---for:【QQYUN-11939】ai应用 快捷指令 修改保存以后，再次打开还是原来的---\n          let parse = JSON.parse(data.quickCommand);\n          for (let i = 0; i < parse.length; i++) {\n            parse[i].key = (i+1).toString();\n          }\n          quickCommandList.value = parse;\n          //update-end---author:wangshuai---date:2025-04-08---for:【QQYUN-11939】ai应用 快捷指令 修改保存以后，再次打开还是原来的---\n        }\n        if(data.plugins){\n          try {\n            const parsePlugins = JSON.parse(data.plugins);\n            pluginIds.value = parsePlugins.map((p:any)=> p.pluginId);\n            pluginDataList.value = parsePlugins.map((p:any)=> ({ id: p.pluginId, name: p.pluginName }));\n            plugins.value = parsePlugins;\n          } catch (e) {\n            pluginIds.value = [];\n            pluginDataList.value = [];\n            plugins.value = [];\n          }\n        }\n        //赋值\n        Object.assign(formState, data);\n        //根据知识库id查询知识库内容\n        if (data.type === 'chatSimple' && data.knowledgeIds) {\n          getKnowledgeDataList(data.knowledgeIds);\n        }\n        //根据知识库id查询流程信息\n        if (data.type === 'chatFLow' && data.flowId) {\n          getFlowDataById(data.flowId);\n        }\n        //根据流程的id查询流程信息\n        if (data.type === 'chatSimple' && data.flowId) {\n          getFlowDataByIds(data.flowId);\n        }\n        // 如果已有modelId，查询模型信息并更新到metadata中\n        if (data.type === 'chatSimple' && data.modelId) {\n          handleModelIdChange(data.modelId);\n        }\n        // 存在记忆库的id,查询记忆库并显示\n        if(data.type === 'chatSimple' && data.memoryId){\n          getMemoryDataById(data.memoryId);\n        }\n        //变量\n        if(formState.variables){\n          variablesList.value = JSON.parse(formState.variables);\n        }\n        //是否开启记忆\n        if(formState.izOpenMemory){\n          console.log(\"formState.izOpenMemory:::\",formState.izOpenMemory)\n          izOpenMemoryChecked.value = formState.izOpenMemory === 1;\n        } else {\n          izOpenMemoryChecked.value = false;\n        }\n        if(izOpenMemoryChecked.value){\n          memoryActiveKey.value = [1];\n        }\n      }\n\n      //============= begin 提示词 ================================\n      /**\n       * 生成提示词\n       */\n      function generatedPrompt() {\n        aiAppPromptModalOpen(true,{})\n      }\n\n      /**\n       * 提示词回调\n       *\n       * @param value\n       */\n      function handleAiAppPromptOk(value) {\n        formState.prompt = value;\n      }\n      //============= end 提示词 ================================\n\n      //=============== begin 快捷指令 ============================\n      function quickCommandEnd() {\n        quickCommand.value = JSON.stringify(quickCommandList.value);\n        formState.quickCommand = quickCommand.value;\n      }\n\n      /**\n       * 快捷指令新增点击事件\n       */\n      function quickCommandAddClick(){\n        if(quickCommandList.value && quickCommandList.value.length > 4){\n          createMessage.warning(\"最多只能添加5个！\");\n          return;\n        }\n        aiAppCommandModalOpen(true,{})\n      }\n\n      /**\n       * 快捷指令编辑点击事件\n       * @param item\n       */\n      function editCommandClick(item){\n        aiAppCommandModalOpen(true,{\n          isUpdate: true,\n          record: item\n        })\n      }\n\n      /**\n       * 快捷指令添加回调事件\n       * @param value\n       */\n      function handleAiAppCommandOk(value){\n        //update-begin---author:wangshuai---date:2025-04-08---for:【QQYUN-11939】ai应用 快捷指令 修改保存以后，再次打开还是原来的---\n        value.key = (quickCommandList.value.length + 1).toString();\n        //update-end---author:wangshuai---date:2025-04-08---for:【QQYUN-11939】ai应用 快捷指令 修改保存以后，再次打开还是原来的---\n        quickCommandList.value.unshift({...value });\n        quickCommand.value = JSON.stringify(quickCommandList.value);\n        formState.quickCommand = quickCommand.value;\n      }\n\n      /**\n       * 快捷指令更新回调事件\n       * @param value\n       */\n      function handleAiAppCommandUpdateOk(value) {\n        let findIndex = quickCommandList.value.findIndex(item => item.key === value.key);\n        if(findIndex>-1){\n          quickCommandList.value[findIndex] = value;\n          quickCommand.value = JSON.stringify(quickCommandList.value);\n          formState.quickCommand = quickCommand.value;\n        }\n      }\n\n      /**\n       * 删除快捷指令\n       * @param value\n       */\n      function deleteCommandClick(value) {\n        let findIndex = quickCommandList.value.findIndex(item => item.key === value);\n        if(findIndex>-1){\n          quickCommandList.value.splice(findIndex, 1);\n          quickCommand.value = JSON.stringify(quickCommandList.value);\n          formState.quickCommand = quickCommand.value;\n        }\n      }\n      //=============== end 快捷指令 ============================\n\n      /**\n       * 复选框相中时的回调\n       */\n      function handleMultiSessionChange(checked){\n        if(checked){\n          metadata.value.multiSession = \"1\";\n        }else{\n          metadata.value.multiSession = \"0\";\n        }\n        formState.metadata = JSON.stringify(metadata.value);\n      }\n\n      // 检查是否有额外的工作流入参\n      const hasExtraFlowInputs = computed(() => {\n        if (!flowData.value || !flowData.value.metadata) {\n          return false;\n        }\n        try {\n          const flowInputsList = flowData.value.metadata || [];\n          \n          // 过滤掉固定参数\n          const fixedParams = ['history', 'content', 'images'];\n          const extraInputs = flowInputsList.filter((input: any) => !fixedParams.includes(input.field));\n          \n          return extraInputs.length > 0;\n        } catch (e) {\n          console.error('解析flowData.metadata失败', e);\n          return false;\n        }\n      });\n\n      // 监听flowData变化，更新flowInputs\n      watch(\n        () => flowData.value,\n        (val) => {\n          if (!val || !val.metadata) {\n            flowInputs.value = [];\n            return;\n          }\n          try {\n            const flowInputsList = val.metadata || [];\n            flowInputs.value = flowInputsList;\n          } catch (e) {\n            console.error('解析flowData.metadata失败', e);\n            flowInputs.value = [];\n          }\n        },\n        { immediate: true, deep: true }\n      );\n\n      /**\n       * 打开对话设置弹窗\n       */\n      function handleEditSettings() {\n        if (settingsModalRef.value) {\n          settingsModalRef.value.open();\n        }\n      }\n\n      /**\n       * 对话设置确定回调\n       */\n      function handleSettingsOk(settings: Record<string, any>) {\n        conversationSettings.value = settings;\n        console.log('调试模式对话设置已更新:', settings);\n      }\n\n      /**\n       * 模型ID变化处理\n       * 查询模型信息并更新到metadata中，供chat组件使用\n       */\n      async function handleModelIdChange(modelId: string) {\n        if (!modelId) {\n          // 如果清空模型，清除模型信息\n          if (metadata.value.modelInfo) {\n            delete metadata.value.modelInfo;\n            formState.metadata = JSON.stringify(metadata.value);\n          }\n          return;\n        }\n        try {\n          const res = await defHttp.get({\n            url: '/airag/airagModel/queryById',\n            params: { id: modelId }\n          }, { isTransformResponse: false });\n          if (res.success && res.result) {\n            const model = res.result;\n            // 将模型信息添加到metadata中\n            if (!metadata.value) {\n              metadata.value = {};\n            }\n            metadata.value.modelInfo = {\n              provider: model.provider || '',\n              modelType: model.modelType || '',\n              modelName: model.modelName || ''\n            };\n            formState.metadata = JSON.stringify(metadata.value);\n          }\n        } catch (e) {\n          console.error('获取模型信息失败', e);\n        }\n      }\n      \n      function openPromptApps() {\n        aiPromptSelectModalOpen(true,{});\n      }\n      /**\n       * 获取记忆库的数据\n       */\n      function getMemoryDataById(id) {\n        queryKnowledgeById({id: id}).then((res) =>{\n          if(res.success && res.result){\n            memoryData.value = res.result;\n          } else {\n            memoryData.value = { name: '该知识库已被删除', id: id, isDelete: true };\n          }\n        })\n      }\n      //================================================ begin 变量和记忆提示词功能 =========================================================\n      /**\n       * 添加变量\n       */\n      function handleAddVariable() {\n        aiVariablesModalOpen(true,{\n          variables: formState.variables\n        })\n      }\n\n      /**\n       * 变量返回事件\n       * \n       * @param values\n       */\n      function handleVariablesOk(values) {\n        if(values){\n          variablesList.value = values;\n          formState.variables = JSON.stringify(values);\n        }else{\n          formState.variables = \"\";\n          variablesList.value = [];\n        }\n      }\n\n      /**\n       * 是否开启会话模式返回值\n       * @param checked\n       */\n      function handleMemoryChange(checked) {\n        if(checked){\n          formState.izOpenMemory = 1;\n        } else {\n          formState.izOpenMemory = 0;\n        }\n      }\n\n      /**\n       * 记忆和变量提示词\n       */\n      async function generateVariablePrompt() {\n        formState.memoryPrompt = '';\n        memoryLoading.value = true;\n        let readableStream = await generateMemoryByAppId({ variables: formState.variables, memoryId: formState.memoryId }).catch(() => {\n          memoryLoading.value = false;\n        });\n        const reader = readableStream.getReader();\n        const decoder = new TextDecoder('UTF-8');\n        let buffer = '';\n        while (true) {\n          const { done, value } = await reader.read();\n          if (done) {\n            break;\n          }\n          let result = decoder.decode(value, { stream: true });\n          const lines = result.split('\\n\\n');\n          for (const line of lines) {\n            if (line.startsWith('data:')) {\n              const content = line.replace('data:', '').trim();\n              if(!content){\n                continue;\n              }\n              if(!content.endsWith('}')){\n                buffer = buffer + line;\n                continue;\n              }\n              buffer = \"\";\n              renderText(content)\n            } else {\n              if(!line) {\n                continue;\n              }\n              if(!line.endsWith('}')) {\n                buffer = buffer + line;\n                continue;\n              }\n              buffer = \"\";\n              renderText(line)\n            }\n          }\n        }\n      }\n\n      /**\n       * 渲染文本\n       *\n       * @param item\n       */\n      function renderText(item) {\n        try {\n          let parse = JSON.parse(item);\n          if (parse.event == 'MESSAGE') {\n            formState.memoryPrompt += parse.data.message;\n            if(memoryLoading.value){\n              memoryLoading.value = false;\n            }\n          }\n          if (parse.event == 'MESSAGE_END') {\n            memoryLoading.value = false;\n          }\n          if (parse.event == 'ERROR') {\n            formState.memoryPrompt = parse.data.message ? parse.data.message: '生成失败，请稍后重试！'\n            memoryLoading.value = false;\n          }\n        } catch (error) {\n          console.log('Error parsing update:', error);\n        }\n      }\n      //================================================ end 变量和记忆提示词功能 =========================================================\n\n      //================================================ begin 开启绘画 =========================================================\n      /**\n       * 开启会话能力回调\n       */\n      function handleDrawChange(checked){\n        if(checked){\n          metadata.value.izDraw = \"1\";\n        }else{\n          metadata.value.izDraw = \"0\";\n        }\n        formState.metadata = JSON.stringify(metadata.value);\n      }\n\n      /**\n       * 会话模型改变回调\n       */\n      function handleDrawModelChange(val){\n        metadata.value.drawModelId = val;\n        formState.metadata = JSON.stringify(metadata.value);\n      }\n      //================================================ end 开启绘画 ========================================================\n\n      return {\n        registerModal,\n        title,\n        isRelease,\n        handleOk,\n        handleCancel,\n        appTypeOption,\n        type,\n        handleTypeClick,\n        formState,\n        validatorRules,\n        labelCol,\n        wrapperCol,\n        validateInfos,\n        handleAddKnowledgeIdClick,\n        handleAddMcpClick,\n        registerKnowledgeModal,\n        registerMcpModal,\n        knowledgeDataList,\n        pluginDataList,\n        plugins,\n        knowledge,\n        handleSuccess,\n        handleMcpSuccess,\n        handleDeleteKnowledge,\n        handleDeleteMcp,\n        uuid,\n        prologueTextAreaBlur,\n        prologue,\n        appId,\n        visibleChange,\n        handleParamSettingClick,\n        registerParamsSettingModal,\n        handleParamsSettingOk,\n        registerFlowModal,\n        handleAddFlowSuccess,\n        handleAddFlowClick,\n        flowData,\n        handleDeleteFlow,\n        getImage,\n        handleEdit,\n        registerAiAppModal,\n        handelEditSuccess,\n        presetQuestionEnd,\n        presetQuestionList,\n        presetQuestionAddClick,\n        deleteQuestionClick,\n        onBlur,\n        onFocus,\n        disabledDrag,\n        questionChange,\n        presetQuestion,\n        generatedPrompt,\n        registerAiAppPromptModal,\n        handleAiAppPromptOk,\n        quickCommandList,\n        quickCommandEnd,\n        registerAiAppCommandModal,\n        quickCommandAddClick,\n        handleAiAppCommandOk,\n        editCommandClick,\n        handleAiAppCommandUpdateOk,\n        deleteCommandClick,\n        quickCommand,\n        getFlowImage,\n        metadata,\n        multiSessionChecked,\n        handleMultiSessionChange,\n        pluginIds,\n        settingsModalRef,\n        flowInputs,\n        conversationSettings,\n        hasExtraFlowInputs,\n        handleEditSettings,\n        handleSettingsOk,\n        handleModelIdChange,\n        flowDataList,\n        multiple,\n        memoryData,\n        knowledgeMultiple,\n        registerAiPromptSelectModal,\n        openPromptApps,\n        handleAddVariable,\n        handleVariablesOk,\n        registerVariablesModal,\n        variablesList,\n        generateVariablePrompt,\n        izOpenMemoryChecked,\n        memoryLoading,\n        handleMemoryChange,\n        memoryActiveKey,\n        izDrawChecked,\n        handleDrawChange,\n        handleDrawModelChange,\n      };\n    },\n  };\n</script>\n\n<style scoped lang=\"less\">\n  .pointer {\n    cursor: pointer;\n  }\n\n  .orchestration,.view{\n    color: #0a3069;\n    font-weight: bold;\n    text-align: center;\n    font-size: 18px;\n    width: 100%;\n    padding-bottom: 10px;\n  }\n  .type-title {\n    color: #1d2025;\n    margin-bottom: 4px;\n  }\n\n  .type-desc {\n    color: #8f959e;\n    font-weight: 400;\n  }\n\n  .setting-left {\n    padding: 20px;\n    overflow-y: auto;\n    height: (100vh - 15px);\n  }\n\n  .setting-right {\n    overflow-y: auto;\n    height: (100vh - 15px);\n    border-left: 1px solid #dee0e3;\n  }\n\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-form-item .ant-form-item-label > label) {\n    width: 100%;\n  }\n\n  .knowledge-img {\n    width: 30px;\n    height: 30px;\n  }\n\n  .flow-name{\n    font-size: 14px;\n    font-weight: bold;\n    color: #354052;\n    width: calc(100% - 20px);\n    overflow: hidden;\n    align-content: center;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    display: grid;\n  }\n  .knowledge-name {\n    margin-left: 4px;\n  }\n\n  .knowledge-card {\n    margin-bottom: 10px;\n    margin-right: 10px;\n  }\n\n  .knowledge-icon {\n    display: none !important;\n    position: relative;\n    top: 6px;\n  }\n\n  .knowledge-card:hover {\n    .knowledge-icon {\n      display: block !important;\n    }\n  }\n  .header-img{\n    width: 35px;\n    height: 35px;\n    border-radius: 10px;\n  }\n  .flex{\n    display: flex;\n  }\n  .header-name{\n    color:#354052;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    white-space: nowrap;\n    max-width: 300px;\n    margin-left: 10px;\n    align-content: center;\n  }\n  .prompt-back{\n    background-color: #eef4ff;\n    border-radius: 12px;\n    padding: 2px;\n    border: 1px solid #77B2F8;\n    box-sizing: border-box;\n    margin-left: 5px;\n    textarea{\n      min-height: 250px;\n      max-height: 400px;\n      border: none !important;\n    }\n  }\n  .prompt-title-padding{\n    margin-left: 14px;\n    height: 50px;\n    align-content: center;\n  }\n  .prologue-chunk{\n    background-color: #f2f4f7;\n    border-radius: 12px;\n    padding: 2px 10px 2px 10px;\n    box-sizing: border-box;\n  }\n\n  .prologue-chunk-edit{\n    background-color: #f2f4f7;\n    border-radius: 12px;\n    padding: 2px 0 2px 0;\n    box-sizing: border-box;\n  }\n  .mt-10{\n    margin-top: 10px;\n  }\n  :deep(.ant-form-item-label){\n    padding: 0 !important;\n  }\n\n  :deep(.ant-form-item-required){\n    margin-left: 4px !important;\n  }\n  .knowledge-txt{\n    color: #354052;\n    cursor: pointer;\n    margin-right: 10px;\n    font-size: 12px\n  }\n  .item-title{\n    color: #111928;\n    font-weight: 400;\n  }\n  :deep(.ant-form-item){\n    margin-bottom: 5px;\n  }\n  :deep(.vditor){\n    border: none;\n  }\n  :deep(.vditor-sv){\n    font-size: 14px;\n  }\n  :deep(.vditor-sv:focus){\n    background-color: #ffffff;\n  }\n  .space-between{\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    width: 100%;\n    button{\n      padding: 0 6px;\n      height: 25px;\n      color: #155AEF !important;\n      margin-right: 10px;\n      border: none;\n    }\n  }\n  .ellipsis{\n    text-overflow: ellipsis;\n    overflow: hidden;\n    white-space: nowrap;\n  }\n  .quick-command{\n    display: flex;\n    width: 100%;\n    margin-top: 10px;\n    justify-content: space-between;\n    background-color: #ffffff;\n    padding: 4px 8px 4px;\n    align-items: center;\n    align-content: center;\n    align-self: center;\n    border-radius: 8px;\n    height: 40px;\n    .quick-command-icon{\n      display: none;\n    }\n  }\n  .quick-command:hover{\n    background-color: #EFF0F8;\n    .quick-command-icon{\n      display: flex;\n    }\n  }\n  .data-empty-text{\n    color: #757c8f;\n    margin-left: 10px;\n  }\n  .mcp-warning-tip {\n    display: flex;\n    align-items: center;\n    color: #fa8c16;\n    font-size: 12px;\n    line-height: 18px;\n    font-weight: 500;\n  }\n  .flow-icon{\n    width: 34px;\n    height: 34px;\n    border-radius: 10px;\n  }\n  :deep(.ant-card .ant-card-body) {\n    padding: 16px;\n  }\n  .text-status{\n    font-size: 12px;\n    color: #676F83;\n  }\n  .tag-text {\n    display: flow;\n    max-width: 100px;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    height: 20px;\n    font-size: 12px;\n    color: #3a3f4f;\n  }\n  .tag-input{\n    align-self: center;\n    color: #737c97;\n    font-size: 12px;\n    font-style: normal;\n    font-weight: 500;\n    line-height: 16px;\n    margin-right: 6px;\n    text-align: right;\n    white-space: nowrap;\n  }\n  .tags-meadata{\n    padding-inline: 2px;\n    border-radius: 4px;\n    display: flex;\n    font-weight: 500;\n    max-width: 100%;\n  }\n  .text-desc {\n    width: 100%;\n    font-weight: 400;\n    display: inline-block;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    text-wrap: nowrap;\n    font-size: 12px;\n    color: #676F83;\n  }\n</style>\n<style lang=\"less\">\n  .ai-app-edit-modal{\n    .ant-modal .ant-modal-header{\n      padding: 13px 32px !important;\n    }\n    .jeecg-basic-modal-close > span{\n      margin-left: 0;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiapp/components/AiUserVariablesModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" title=\"用户变量\" :width=\"1000\" @ok=\"handleSubmit\" destroyOnClose>\n    <div class=\"p-4\">\n      <div class=\"mb-4 text-gray-500\"> 用于存储每个用户使用项目过程中，需要持久化存储和读取的数据，如用户的语言偏好、个性化设置等。 </div>\n\n      <JVxeTable\n        ref=\"tableRef\"\n        toolbar\n        dragSort\n        :maxHeight=\"500\"\n        :columns=\"columns\"\n        :dataSource=\"dataSource\"\n        :toolbarConfig=\"{ btns: ['remove', 'clearSelection'] }\"\n      >\n        <template #toolbarSuffix>\n          <a-button type=\"primary\" @click=\"handleAdd\">\n            <Icon icon=\"ant-design:plus-outlined\" />\n            新增\n          </a-button>\n        </template>\n\n        <template #action=\"props\">\n          <div class=\"action-group\">\n            <a-switch v-model:checked=\"props.row.enable\" checked-children=\"开\" un-checked-children=\"关\" size=\"small\" class=\"ml-2\" />\n\n            <a-popconfirm title=\"确定删除吗？\" @confirm=\"handleDelete(props)\">\n              <Icon icon=\"ant-design:delete-outlined\" class=\"cursor-pointer hover:text-red-500 ml-2\" size=\"18\" color=\"red\" />\n            </a-popconfirm>\n          </div>\n        </template>\n      </JVxeTable>\n    </div>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, ref, reactive } from 'vue';\n  import { BasicModal, useModalInner } from '/src/components/Modal';\n  import { Icon } from '/src/components/Icon';\n  import { Button, Checkbox, Switch, Popconfirm } from 'ant-design-vue';\n  import { JVxeTypes, JVxeColumn, JVxeTableInstance } from '/src/components/jeecg/JVxeTable/types';\n  import { JVxeTable } from '/src/components/jeecg/JVxeTable';\n  import { useMessage } from '/src/hooks/web/useMessage';\n\n  export default defineComponent({\n    name: 'AiUserVariablesModal',\n    components: {\n      BasicModal,\n      Icon,\n      JVxeTable,\n      AButton: Button,\n      ACheckbox: Checkbox,\n      ASwitch: Switch,\n      APopconfirm: Popconfirm,\n    },\n    emits: ['register', 'ok'],\n    setup(props, { emit }) {\n      const { createMessage } = useMessage();\n      const tableRef = ref<JVxeTableInstance>();\n\n      // 定义列配置\n      const columns = ref<JVxeColumn[]>([\n        {\n          title: '名称',\n          key: 'name',\n          type: JVxeTypes.input,\n          width: 200,\n          placeholder: '请输入变量名',\n          validateRules: [\n            { required: true, message: '名称不能为空' },\n            { pattern: /^[a-zA-Z][a-zA-Z0-9_]*$/, message: '仅支持字母、数字和下划线，且以字母开头' },\n          ],\n        },\n        {\n          title: '描述',\n          key: 'description',\n          type: JVxeTypes.input,\n          width: 300,\n          placeholder: '字段描述',\n        },\n        {\n          title: '默认值',\n          key: 'defaultValue',\n          type: JVxeTypes.input,\n          width: 200,\n          placeholder: '默认值',\n        },\n        {\n          title: '操作',\n          key: 'action',\n          type: JVxeTypes.slot,\n          slotName: 'action',\n          width: 220,\n          align: 'center',\n        },\n      ]);\n\n      const dataSource = ref<any[]>([]);\n\n      const [registerModal, { setModalProps, closeModal }] = useModalInner((data) => {\n        // 如果传入了已有数据，进行初始化\n        if (data && data.variables) {\n          dataSource.value = JSON.parse(data.variables);\n        } else {\n          dataSource.value = [];\n        }\n      });\n\n      // 新增行\n      const handleAdd = () => {\n        if (dataSource.value.length > 9) {\n          createMessage.warn('最多支持10个变量！');\n          return;\n        }\n        tableRef.value?.addRows({\n          name: '',\n          description: '',\n          defaultValue: '',\n          enable: true,\n        });\n      };\n\n      // 删除行\n      const handleDelete = (props) => {\n        tableRef.value?.removeRows(props.row);\n      };\n\n      const handleSubmit = async () => {\n        // 校验表格\n        const errMap = await tableRef.value?.validateTable();\n        if (errMap) {\n          createMessage.error('请检查表单填写是否正确');\n          return;\n        }\n\n        // 获取全量数据\n        const tableData = tableRef.value?.getTableData();\n        console.log('保存用户变量:', tableData);\n\n        closeModal();\n        emit('ok', tableData);\n      };\n\n      return {\n        registerModal,\n        tableRef,\n        columns,\n        dataSource,\n        handleAdd,\n        handleDelete,\n        handleSubmit,\n      };\n    },\n  });\n</script>\n\n<style scoped>\n  .p-4 {\n    padding: 1rem;\n  }\n\n  .mb-4 {\n    margin-bottom: 1rem;\n  }\n\n  .text-gray-500 {\n    color: #6b7280;\n  }\n\n  .ml-2 {\n    margin-left: 0.5rem;\n  }\n\n  .cursor-pointer {\n    cursor: pointer;\n  }\n\n  .hover\\:text-red-500:hover {\n    color: #ef4444;\n  }\n\n  .action-group {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiknowledge/AiKnowledgeBase.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { Modal } from 'ant-design-vue';\n\nenum Api {\n  //知识库管理\n  list = '/airag/knowledge/list',\n  save = '/airag/knowledge/add',\n  delete = '/airag/knowledge/delete',\n  queryById = '/airag/knowledge/queryById',\n  edit = '/airag/knowledge/edit',\n  rebuild = '/airag/knowledge/rebuild',\n  //知识库文档\n  knowledgeDocList = '/airag/knowledge/doc/list',\n  knowledgeEditDoc = '/airag/knowledge/doc/edit',\n  knowledgeDeleteBatchDoc = '/airag/knowledge/doc/deleteBatch',\n  knowledgeDeleteAllDoc = '/airag/knowledge/doc/deleteAll',\n  knowledgeRebuildDoc = '/airag/knowledge/doc/rebuild',\n  knowledgeEmbeddingHitTest = '/airag/knowledge/embedding/hitTest',\n}\n\n/**\n * 查询知识库\n * @param params\n */\nexport const list = (params) => {\n  return defHttp.get({ url: Api.list, params }, { isTransformResponse: false });\n};\n\n/**\n * 根据id查询知识库\n * @param params\n */\nexport const queryById = (params) => {\n  return defHttp.get({ url: Api.queryById, params }, { isTransformResponse: false });\n};\n\n/**\n * 新增知识库\n * @param params\n */\nexport const saveKnowledge = (params) => {\n  return defHttp.post({ url: Api.save, params });\n};\n\n/**\n * 编辑知识库\n *\n * @param params\n */\nexport const editKnowledge = (params) => {\n  return defHttp.put({ url: Api.edit, params });\n};\n\n/**\n * 删除知识库\n */\nexport const deleteModel = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除名称为'+params.name+'的知识库吗？',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.delete, params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n\n/**\n * 查询知识库详情\n * @param params\n */\nexport const knowledgeDocList = (params) => {\n  return defHttp.get({ url: Api.knowledgeDocList, params }, { isTransformResponse: false });\n};\n\n/**\n * 知识库向量化\n *\n * @param params\n */\nexport const rebuild = (params) => {\n  return defHttp.put({ url: Api.rebuild, params,timeout: 2 * 60 * 1000 }, { joinParamsToUrl: true, isTransformResponse: false });\n};\n\n/**\n * 新增知识库\n * @param params\n */\nexport const knowledgeSaveDoc = (params) => {\n  return defHttp.post({ url: Api.knowledgeEditDoc, params });\n};\n\n/**\n * 文档向量化\n * @param params\n */\nexport const knowledgeRebuildDoc = (params, handleSuccess) => {\n  return defHttp.put({ url: Api.knowledgeRebuildDoc, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n\n/**\n * 批量删除文档\n *\n * @param params\n * @param handleSuccess\n */\nexport const knowledgeDeleteBatchDoc = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.knowledgeDeleteBatchDoc, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n\n/**\n * 批量删除文档\n *\n * @param params\n * @param handleSuccess\n */\nexport const knowledgeDeleteAllDoc = (knowId: string, handleSuccess) => {\n  return defHttp.delete({ url: Api.knowledgeDeleteAllDoc, params: {knowId} }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n\n/**\n * 命中测试\n * @param params\n */\nexport const knowledgeEmbeddingHitTest = (params) => {\n  let url = Api.knowledgeEmbeddingHitTest + '/' + params.knowId;\n  return defHttp.get({ url: url, params }, { isTransformResponse: false });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiknowledge/AiKnowledgeBase.api.util.tsx",
    "content": "import {knowledgeDeleteAllDoc} from \"./AiKnowledgeBase.api\";\nimport {useMessage} from \"@/hooks/web/useMessage\";\n\nconst {createConfirmSync} = useMessage();\n\n// 清空文档\nexport async function doDeleteAllDoc(knowledgeId: string, reload: () => void) {\n  const flag = await createConfirmSync({\n    title: '清空文档',\n    content: () => (\n      <p>\n        <span>确定要清空所有文档吗？</span>\n        <br/>\n        <span style=\"color: #ee0000;\">\n          此操作会删除所有已录入的文档，并且不能恢复，请谨慎操作\n        </span>\n      </p>\n    ),\n  });\n  if (!flag) {\n    return;\n  }\n  knowledgeDeleteAllDoc(knowledgeId, reload)\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiknowledge/AiKnowledgeBase.data.ts",
    "content": "import { FormSchema } from '@/components/Form';\nimport { BasicColumn } from '@/components/Table';\n\n/**\n * 表单\n */\nexport const formSchema: FormSchema[] = [\n  {\n    label: 'id',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '知识库名称',\n    field: 'name',\n    required: true,\n    componentProps: {\n      placeholder: '请输入知识库名称',\n      //是否展示字数\n      showCount: true,\n      maxlength: 64,\n    },\n    component: 'Input',\n  },\n  {\n    label: '知识库描述',\n    field: 'descr',\n    component: 'InputTextArea',\n    componentProps: {\n      placeholder: '描述知识库的内容，详尽的描述将帮助AI能深入理解该知识库的内容，能更准确的检索到内容，提高该知识库的命中率。',\n      //是否展示字数\n      showCount: true,\n      maxlength: 256,\n    },\n  },\n  {\n    label: '向量模型',\n    field: 'embedId',\n    required: true,\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: \"airag_model where model_type = 'EMBED' and activate_flag = 1,name,id\",\n    },\n  },\n  {\n    label: '状态',\n    field: 'status',\n    required: true,\n    component: 'JDictSelectTag',\n    componentProps: {\n      options: [\n        { label: '启用', value: 'enable' },\n        { label: '禁用', value: 'disable' },\n      ],\n      type: 'radioButton',\n    },\n    defaultValue: 'enable',\n  },\n  {\n    label: '类型',\n    field: 'type',\n    required: true,\n    component: 'JDictSelectTag',\n    componentProps: {\n      options: [\n        { label: '知识库', value: 'knowledge' },\n        { label: '记忆库', value: 'memory' },\n      ],\n      type: 'radioButton',\n    },\n    defaultValue: 'knowledge',\n  },  \n];\n\n//文档文本表单\nexport const docTextSchema: FormSchema[] = [\n  {\n    label: 'id',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '知识库id',\n    field: 'knowledgeId',\n    show: false,\n    component: 'Input',\n  },\n  {\n    label: '标题',\n    field: 'title',\n    required: true,\n    component: 'Input',\n  },\n  {\n    label: '类型',\n    field: 'type',\n    required: true,\n    component: 'Input',\n    show: false\n  },\n  {\n    label: '内容',\n    field: 'content',\n    rules: [{ required: true, message: '请输入内容' }],\n    component: 'JMarkdownEditor',\n    componentProps: {\n      placeholder: \"请输入内容\",\n      preview:{ mode: 'view', action: [] }\n    },\n    ifShow:({ values})=>{\n      if(values.type === 'text'){\n        return true;\n      }\n      return false;\n    }\n  },\n  {\n    label: '文件',\n    field: 'filePath',\n    rules: [{ required: true, message: '请上传文件' }],\n    component: 'JUpload',\n    helpMessage:'支持txt、markdown、pdf、docx、xlsx、pptx',\n    componentProps:{\n      fileType: 'file',\n      maxCount: 1,\n      multiple: false,\n      text: '上传文档'\n    },\n    ifShow:({ values })=>{\n      if(values.type === 'file'){\n        return true;\n      }\n      return false;\n    }\n  },\n];\n\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiknowledge/AiKnowledgeBaseList.vue",
    "content": "<!--知识库添加页面-->\n<template>\n  <div class=\"knowledge\">\n    <!--查询区域-->\n    <div class=\"jeecg-basic-table-form-container\">\n      <a-form\n        ref=\"formRef\"\n        @keyup.enter.native=\"searchQuery\"\n        :model=\"queryParam\"\n        :label-col=\"labelCol\"\n        :wrapper-col=\"wrapperCol\"\n        style=\"background-color: #f7f8fc\"\n      >\n        <a-row :gutter=\"24\">\n          <a-col :xl=\"7\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <a-form-item name=\"name\" label=\"知识库名称\">\n              <JInput v-model:value=\"queryParam.name\" placeholder=\"请输入知识库名称\" />\n            </a-form-item>\n          </a-col>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left; overflow: hidden\" class=\"table-page-search-submitButtons\">\n              <a-col :lg=\"6\">\n                <a-button type=\"primary\" preIcon=\"ant-design:search-outlined\" @click=\"searchQuery\">查询</a-button>\n                <a-button type=\"primary\" preIcon=\"ant-design:reload-outlined\" @click=\"searchReset\" style=\"margin-left: 8px\">重置</a-button>\n              </a-col>\n            </span>\n          </a-col>\n        </a-row>\n      </a-form>\n    </div>\n\n    <a-row :span=\"24\" class=\"knowledge-row\">\n      <a-col :xxl=\"4\" :xl=\"6\" :lg=\"6\" :md=\"6\" :sm=\"12\" :xs=\"24\">\n        <a-card class=\"add-knowledge-card\" @click=\"handleAddKnowled\">\n          <div class=\"flex\">\n            <Icon icon=\"ant-design:plus-outlined\" class=\"add-knowledge-card-icon\" size=\"20\"></Icon>\n            <span class=\"add-knowledge-card-title\">创建知识库</span>\n          </div>\n        </a-card>\n      </a-col>\n      <a-col v-if=\"knowledgeList && knowledgeList.length>0\" :xxl=\"4\" :xl=\"6\" :lg=\"6\" :md=\"6\" :sm=\"12\" :xs=\"24\" v-for=\"item in knowledgeList\">\n        <a-card class=\"knowledge-card pointer\" @click=\"handleDocClick(item.id, item.type)\">\n          <div class=\"knowledge-header\">\n            <div class=\"flex\">\n              <img class=\"header-img\" src=\"./icon/knowledge.png\" />\n              <div class=\"header-text\">\n                <span class=\"header-text-top header-name ellipsis\" :title=\"item.name\"> {{ item.name }} </span>\n                <span class=\"header-text-top\"> 创建者：{{ item.createBy_dictText || item.createBy }} </span>\n              </div>\n            </div>\n          </div>\n          <div class=\"mt-10 text-desc\">\n            <span>{{ item.descr || '暂无描述' }}</span>\n          </div>\n          <div class=\"knowledge-footer flex\" style=\"justify-content: space-between\">\n            <div style=\"width: calc(100% - 60px)\" class=\"ellipsis\">\n              <Icon class=\"knowledge-footer-icon\" icon=\"ant-design:deployment-unit-outlined\" size=\"14\"></Icon>\n              <span :title=\"item.embedId_dictText\">{{ item.embedId_dictText }}</span>\n            </div>\n            <div>\n              <a-tag v-if=\"item.type == 'memory'\" color=\"orange\" class=\"tag-style\">记忆库</a-tag>\n              <a-tag v-else color=\"blue\" class=\"tag-style\">知识库</a-tag>\n            </div>\n          </div>\n          <div class=\"knowledge-btn\">\n            <a-dropdown placement=\"bottomRight\" :trigger=\"['click']\" :getPopupContainer=\"(node) => node.parentNode\">\n              <div class=\"ant-dropdown-link pointer model-icon\" @click.prevent.stop>\n                <Icon icon=\"ant-design:ellipsis-outlined\" size=\"16\"></Icon>\n              </div>\n              <template #overlay>\n                <a-menu>\n                  <a-menu-item key=\"vectorization\" @click.prevent.stop=\"handleVectorization(item.id)\">\n                    <Icon icon=\"ant-design:retweet-outlined\" size=\"16\"></Icon>\n                    向量化\n                  </a-menu-item>\n                  <a-menu-item key=\"text\" @click.prevent.stop=\"handleEditClick(item)\">\n                    <Icon class=\"pointer\" icon=\"ant-design:edit-outlined\" size=\"16\"></Icon>\n                    编辑\n                  </a-menu-item>\n                  <a-menu-item key=\"file\" @click.prevent.stop=\"handleDelete(item)\">\n                    <Icon class=\"pointer\" icon=\"ant-design:delete-outlined\" size=\"16\"></Icon>\n                    删除\n                  </a-menu-item>\n                  <a-menu-item key=\"clear\" @click.prevent.stop=\"onDeleteAllDoc(item)\">\n                    <Icon icon=\"ant-design:delete-outlined\" size=\"16\"></Icon>\n                    清空文档\n                  </a-menu-item>\n                </a-menu>\n              </template>\n            </a-dropdown>\n          </div>\n        </a-card>\n      </a-col>\n    </a-row>\n    <Pagination\n      v-if=\"knowledgeList.length > 0\"\n      :current=\"pageNo\"\n      :page-size=\"pageSize\"\n      :page-size-options=\"pageSizeOptions\"\n      :total=\"total\"\n      :showQuickJumper=\"true\"\n      :showSizeChanger=\"true\"\n      @change=\"handlePageChange\"\n      class=\"list-footer\"\n      size=\"small\"\n      :show-total=\"() => `共${total}条` \"\n    />\n    <!--添加知识库弹窗-->\n    <KnowledgeBaseModal @register=\"registerModal\" @success=\"reload\"></KnowledgeBaseModal>\n    <!-- 知识库文档弹窗 -->\n    <AiragKnowledgeDocListModal @register=\"docListRegister\"></AiragKnowledgeDocListModal>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { reactive, ref } from 'vue';\n  import { useModal } from '/@/components/Modal';\n  import { deleteModel, list, rebuild } from './AiKnowledgeBase.api';\n  import { doDeleteAllDoc } from \"./AiKnowledgeBase.api.util\";\n  import { Pagination } from 'ant-design-vue';\n  import JInput from '@/components/Form/src/jeecg/components/JInput.vue';\n  import KnowledgeBaseModal from './components/AiKnowledgeBaseModal.vue';\n  import JSelectUser from '@/components/Form/src/jeecg/components/JSelectUser.vue';\n  import JDictSelectTag from '@/components/Form/src/jeecg/components/JDictSelectTag.vue';\n  import AiragKnowledgeDocListModal from './components/AiragKnowledgeDocListModal.vue';\n  import Icon from '@/components/Icon';\n  import { useMessage } from \"@/hooks/web/useMessage\";\n\n  export default {\n    name: 'KnowledgeBaseList',\n    components: {\n      Icon,\n      AiragKnowledgeDocListModal,\n      KnowledgeBaseModal,\n      JDictSelectTag,\n      JSelectUser,\n      JInput,\n      Pagination,\n    },\n    setup() {\n      //模型列表\n      const knowledgeList = ref([]);\n\n      //注册modal\n      const [registerModal, { openModal }] = useModal();\n      const [docListRegister, { openModal: openDocModal }] = useModal();\n\n      //当前页数\n      const pageNo = ref<number>(1);\n      //每页条数\n      const pageSize = ref<number>(10);\n      //总条数\n      const total = ref<number>(0);\n      //可选择的页数\n      const pageSizeOptions = ref<any>(['10', '20', '30']);\n      //查询参数\n      const queryParam = reactive<any>({});\n      //查询区域label宽度\n      const labelCol = reactive({\n        xs: 24,\n        sm: 4,\n        xl: 6,\n        xxl: 6,\n      });\n      //查询区域组件宽度\n      const wrapperCol = reactive({\n        xs: 24,\n        sm: 20,\n      });\n      //查询区域表单的ref\n      const formRef = ref();\n      const { createMessage } = useMessage();\n\n      //页面初始化执行列表查询\n      reload();\n\n      /**\n       * 新增\n       */\n      async function handleAddKnowled() {\n        openModal(true, {});\n      }\n\n      /**\n       * 编辑\n       *\n       * @param item\n       */\n      function handleEditClick(item) {\n        console.log(item);\n        openModal(true, {\n          id: item.id,\n          isUpdate: true,\n        });\n      }\n\n      /**\n       * 重新加载数据\n       */\n      function reload() {\n        let params = {\n          pageNo: pageNo.value,\n          pageSize: pageSize.value,\n          column: 'createTime',\n          order: 'desc'\n        };\n        Object.assign(params, queryParam);\n      \n        list(params).then((res) => {\n          if (res.success) {\n            knowledgeList.value = res.result.records;\n            total.value = res.result.total;\n          } else {\n            knowledgeList.value = [];\n            total.value = 0;\n          }\n        });\n      }\n\n      /**\n       * 分页改变事件\n       * @param page\n       * @param current\n       */\n      function handlePageChange(page, current) {\n        pageNo.value = page;\n        pageSize.value = current;\n        reload();\n      }\n\n      /**\n       * 删除模型\n       * @param item\n       */\n      async function handleDelete(item) {\n        if(knowledgeList.value.length == 1 && pageNo.value > 1) {\n          pageNo.value = pageNo.value - 1;\n        }\n        await deleteModel({ id: item.id, name: item.name }, reload);\n      }\n\n      /**\n       * 清空文档\n       * @param item\n       */\n      async function onDeleteAllDoc(item) {\n        pageNo.value = 1;\n        return doDeleteAllDoc(item.id, reload);\n      }\n\n      /**\n       * 查询\n       */\n      function searchQuery() {\n        pageNo.value = 1;\n        reload();\n      }\n\n      /**\n       * 重置\n       */\n      function searchReset() {\n        formRef.value.resetFields();\n        queryParam.createBy = '';\n        pageNo.value = 1;\n        //刷新数据\n        reload();\n      }\n\n      /**\n       * 参数配置点击事件\n       *\n       * @param id\n       * @param type\n       */\n      function handleDocClick(id, type) {\n        openDocModal(true, { id, type });\n      }\n\n      /**\n       * 知识库向量化\n       * @param id\n       */\n      async function handleVectorization(id) {\n        rebuild({ knowIds: id }).then((res) =>{\n          if(res.success){\n            createMessage.success(\"操作成功，开始异步重建知识库，请稍后查看！\");\n            reload();\n          }else{\n            createMessage.warning(\"向量化失败！\");\n          }\n        }).catch(err=>{\n          createMessage.warning(\"向量化失败！\");\n        });\n      }\n\n      return {\n        handleAddKnowled,\n        handleEditClick,\n        registerModal,\n        knowledgeList,\n        reload,\n        pageNo,\n        pageSize,\n        pageSizeOptions,\n        total,\n        handlePageChange,\n        handleDelete,\n        onDeleteAllDoc,\n        searchQuery,\n        searchReset,\n        queryParam,\n        labelCol,\n        wrapperCol,\n        formRef,\n        handleDocClick,\n        docListRegister,\n        handleVectorization,\n      };\n    },\n  };\n</script>\n\n<style scoped lang=\"less\">\n  .knowledge {\n    height: calc(100vh - 115px);\n    background: #f7f8fc;\n    padding: 24px;\n    overflow-y: auto;\n\n    .knowledge-row {\n      max-height: calc(100% - 100px);\n      margin-top: 20px;\n      overflow-y: auto;\n      .knowledge-header {\n        position: relative;\n        font-size: 14px;\n        height: 40px;\n        .header-img {\n          width: 34px;\n          height: 34px;\n          margin-right: 6px;\n        }\n        .header-text {\n          width: calc(100% - 80px);\n          overflow: hidden;\n          position: relative;\n          display: grid;\n          .header-name {\n            font-size: 14px !important;\n            font-weight: bold;\n            color: #354052 !important;\n          }\n          .header-text-top {\n            height: 22px;\n            font-size: 12px;\n          }\n        }\n      }\n    }\n  }\n\n  .text-desc {\n    width: 100%;\n    font-weight: 400;\n    display: inline-block;\n    text-overflow: ellipsis;\n    display: -webkit-box;\n    -webkit-box-orient: vertical;\n    -webkit-line-clamp: 2;\n    height: 40px;\n    overflow: hidden;\n    font-size: 12px;\n    color: #676f83;\n  }\n  \n  .knowledge-footer{\n    font-size: 12px;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    margin-top: 16px;\n    .knowledge-footer-icon{\n      position: relative;\n      top: 2px\n    }\n    span{\n      margin-left: 2px;\n    }\n  }\n\n  .flex {\n    display: flex;\n    align-items: center;\n  }\n\n  :deep(.ant-card .ant-card-body) {\n    padding: 16px;\n  }\n\n  .mt-10 {\n    margin-top: 10px;\n  }\n\n  .ml-4 {\n    margin-left: 4px;\n  }\n\n  .knowledge-btn {\n    position: absolute;\n    right: 4px;\n    top: 6px;\n    height: auto;\n    display: none;\n  }\n  .add-knowledge-card {\n    margin-bottom: 20px;\n    background: #fcfcfd;\n    border: 1px solid #f0f0f0;\n    box-shadow: 0 2px 4px #e6e6e6;\n    transition: all 0.3s ease;\n    border-radius: 10px;\n    display: inline-flex;\n    justify-content: center;\n    align-items: center;\n    font-size: 16px;\n    cursor: pointer;\n    height: 152px;\n    width: calc(100% - 20px);\n    .add-knowledge-card-icon {\n      padding: 8px;\n      color: #1f2329;\n      background-color: #f5f6f7;\n      margin-right: 12px;\n    }\n    .add-knowledge-card-title {\n      font-size: 16px;\n      color:#1f2329;\n      font-weight: 400;\n      align-self: center;\n    }\n  }\n\n  .add-knowledge-card:hover {\n    box-shadow: 0 6px 12px #d0d3d8;\n  }\n\n  .knowledge-card {\n    margin-right: 20px;\n    margin-bottom: 20px;\n    height: 152px;\n    border-radius: 10px;\n    background: #fcfcfd;\n    border: 1px solid #f0f0f0;\n    box-shadow: 0 2px 4px #e6e6e6;\n    transition: all 0.3s ease;\n  }\n  .knowledge-card:hover {\n    box-shadow: 0 6px 12px #d0d3d8;\n    .knowledge-btn {\n      display: block;\n    }\n  }\n  .pointer {\n    cursor: pointer;\n  }\n  .list-footer {\n    text-align: right;\n    margin-top: 5px;\n  }\n  .jeecg-basic-table-form-container {\n    padding: 0;\n    :deep(.ant-form) {\n      background-color: transparent;\n    }\n    .table-page-search-submitButtons {\n      display: block;\n      margin-bottom: 24px;\n      white-space: nowrap;\n    }\n  }\n  \n  .model-icon{\n    background-color: unset;\n    border: none;\n    margin-right: 2px;\n  }\n  .model-icon:hover{\n    color: #000000;\n    background-color: #e9ecf2;\n    border: none;\n  }\n  .ant-dropdown-link{\n    font-size: 14px;\n    height: 24px;\n    padding: 0 7px;\n    border-radius: 4px;\n    align-content: center;\n    text-align: center;\n  }\n  \n  .ellipsis{\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .tag-style{\n    margin-right: 5px;\n    height: 20px;\n    line-height: 18px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiknowledge/components/AiKnowledgeBaseModal.vue",
    "content": "<template>\n  <div class=\"p-2\">\n    <BasicModal destroyOnClose @register=\"registerModal\" :canFullscreen=\"false\" width=\"600px\" :title=\"title\" @ok=\"handleOk\" @cancel=\"handleCancel\">\n      <template #title>\n         <span style=\"display: flex\">\n          {{title}}\n          <a-tooltip title=\"AI知识库文档\">\n            <a style=\"color: unset\" href=\"https://help.jeecg.com/aigc/guide/knowledge\" target=\"_blank\">\n              <Icon style=\"position:relative;left:2px;top:1px\" icon=\"ant-design:question-circle-outlined\"></Icon>\n            </a>\n          </a-tooltip>\n        </span>\n      </template>\n      <BasicForm @register=\"registerForm\"></BasicForm>\n    </BasicModal>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { ref, unref } from 'vue';\n  import BasicModal from '@/components/Modal/src/BasicModal.vue';\n  import { useModal, useModalInner } from '@/components/Modal';\n\n  import BasicForm from '@/components/Form/src/BasicForm.vue';\n  import { useForm } from '@/components/Form';\n  import { formSchema } from '../AiKnowledgeBase.data';\n  import { saveKnowledge, editKnowledge, queryById } from '../AiKnowledgeBase.api';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  export default {\n    name: 'KnowledgeBaseModal',\n    components: {\n      BasicForm,\n      BasicModal,\n    },\n    emits: ['success', 'register'],\n    setup(props, { emit }) {\n      const title = ref<string>('创建知识库');\n\n      //保存或修改\n      const isUpdate = ref<boolean>(false);\n\n      //表单配置\n      const [registerForm, { resetFields, setFieldsValue, validate, clearValidate, updateSchema }] = useForm({\n        schemas: formSchema,\n        showActionButtonGroup: false,\n        layout: 'vertical',\n        wrapperCol: { span: 24 },\n      });\n\n      //注册modal\n      const [registerModal, { closeModal, setModalProps }] = useModalInner(async (data) => {\n        //重置表单\n        await resetFields();\n        setModalProps({ confirmLoading: false });\n        isUpdate.value = !!data?.isUpdate;\n        title.value = isUpdate.value ? '编辑知识库' : '创建知识库';\n        if (unref(isUpdate)) {\n          let values = await queryById({ id: data.id });\n          //表单赋值\n          await setFieldsValue({\n            ...values.result,\n          });\n        }\n        setModalProps({ minHeight: 500, bodyStyle: { padding: '10px' } });\n      });\n\n      /**\n       * 保存\n       */\n      async function handleOk() {\n        try {\n          setModalProps({ confirmLoading: true });\n          let values = await validate();\n          if (!unref(isUpdate)) {\n            await saveKnowledge(values);\n          } else {\n            await editKnowledge(values);\n          }\n          //关闭弹窗\n          closeModal();\n          //刷新列表\n          emit('success');\n        } finally {\n          setModalProps({ confirmLoading: false });\n        }\n      }\n\n      /**\n       * 取消\n       */\n      function handleCancel() {\n        closeModal();\n      }\n\n      return {\n        registerModal,\n        registerForm,\n        title,\n        handleOk,\n        handleCancel,\n      };\n    },\n  };\n</script>\n\n<style scoped lang=\"less\">\n  .pointer {\n    cursor: pointer;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiknowledge/components/AiTextDescModal.vue",
    "content": "<!--手动录入text-->\n<template>\n  <BasicModal title=\"段落详情\" destroyOnClose @register=\"registerModal\" :canFullscreen=\"false\" width=\"600px\" :footer=\"null\">\n    <div class=\"p-2\">\n      <div class=\"header\">\n        <a-tag color=\"#a9c8ff\">\n          <span>{{hitTextDescData.source}}</span>\n        </a-tag>\n      </div>\n      <div class=\"content\">\n        <MarkdownViewer :value=\"hitTextDescData.content\" />\n      </div>\n    </div>\n\n  </BasicModal>\n</template>\n\n<script lang=\"ts\">\n  import { ref } from 'vue';\n  import BasicModal from '@/components/Modal/src/BasicModal.vue';\n  import { useModalInner } from '@/components/Modal';\n\n  import BasicForm from '@/components/Form/src/BasicForm.vue';\n  import { MarkdownViewer } from '@/components/Markdown';\n  import { useGlobSetting } from \"@/hooks/setting\";\n\n  export default {\n    name: 'AiTextDescModal',\n    components: {\n      MarkdownViewer,\n      BasicForm,\n      BasicModal,\n    },\n    emits: ['success', 'register'],\n    setup(props, { emit }) {\n      let hitTextDescData = ref<any>({})\n      \n      //注册modal\n      const [registerModal, { closeModal, setModalProps }] = useModalInner(async (data) => {\n        hitTextDescData.value.source = 'score' + ' ' + data.score.toFixed(2);\n        //替换图片宽度\n        data.content = replaceImageWith(data.content);\n        //替换图片domainUrl\n        data.content = replaceDomainUrl(data.content);\n        hitTextDescData.value.content = data.content;\n        setModalProps({ header: '300px' })\n      });\n      const { domainUrl } = useGlobSetting();\n      const replaceImageWith = markdownContent => {\n        // 支持图片设置width的写法 ![](/static/jimuImages/screenshot_1617252560523.png =100)\n        const regex = /!\\[([^\\]]*)\\]\\(([^)]+)=([0-9]+)\\)/g;\n        return markdownContent.replace(regex, (match, alt, src, width) => {\n          let reg = /#\\s*{\\s*domainURL\\s*}/g;\n          src = src.replace(reg,domainUrl);\n          return `<img src='${src}' alt='${alt}' width='${width}' />`;\n        });\n      };\n      \n      //替换domainURL\n      const replaceDomainUrl = markdownContent => {\n            const regex = /!\\[([^\\]]*)\\]\\(.*?#\\s*{\\s*domainURL\\s*}.*?\\)/g;\n            return markdownContent.replace(regex, (match) => {\n              let reg = /#\\s*{\\s*domainURL\\s*}/g;\n              return match.replace(reg,domainUrl);\n            })\n      }\n      return {\n        registerModal,\n        hitTextDescData\n      };\n    },\n  };\n</script>\n\n<style scoped lang=\"less\">\n  .pointer {\n    cursor: pointer;\n  }\n  .header {\n    font-size: 16px;\n    font-weight: bold;\n    margin-top: 10px;\n  }\n  .content {\n    margin-top: 20px;\n    max-height: 600px;\n    overflow-y: auto;\n    overflow-x: auto;\n  }\n  .title-tag {\n    color: #477dee;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiknowledge/components/AiragKnowledgeDocListModal.vue",
    "content": "<!--知识库文档列表-->\n<template>\n  <div class=\"p-2\">\n    <BasicModal\n      wrapClassName=\"airag-knowledge-doc\"\n      destroyOnClose\n      @register=\"registerModal\"\n      :canFullscreen=\"false\"\n      defaultFullscreen\n      :title=\"title\"\n      :footer=\"null\"\n    >\n      <a-layout style=\"height: 100%\">\n        <a-layout-sider :style=\"siderStyle\">\n          <a-menu v-model:selectedKeys=\"selectedKeys\" mode=\"vertical\" style=\"border: none\" :items=\"menuItems\" @click=\"handleMenuClick\" />\n        </a-layout-sider>\n        <a-layout-content :style=\"contentStyle\">\n          <div v-if=\"selectedKey === 'document'\">\n            <div class=\"search-header\" style=\"text-align: left;\">\n              <a-space align=\"center\" wrap>\n                <a-input\n                    class=\"search-input\"\n                    v-model:value=\"searchText\"\n                    placeholder=\"请输入文档名称，回车搜索\"\n                    @pressEnter=\"searchTextEnter\"\n                />\n                <template v-if=\"selectedRows.length > 0\">\n                  <div>\n                    <span>已进入多选模式，当前选中</span>\n                    <a style=\"margin: 0 4px;\"> {{ selectedRows.length }} </a>\n                    <span>条文档</span>\n                  </div>\n                  <div>\n                    <a @click=\"onClearSelected\">清空选择</a>\n                    <a-divider type=\"vertical\"/>\n                    <a @click=\"onDeleteBatch\">批量删除</a>\n                  </div>\n                </template>\n              </a-space>\n            </div>\n            <a-row :span=\"24\" class=\"knowledge-row\">\n              <a-col :xxl=\"4\" :xl=\"6\" :lg=\"6\" :md=\"6\" :sm=\"12\" :xs=\"24\" v-if=\"!type || type==='knowledge'\">\n                <a-card class=\"add-knowledge-card\" :bodyStyle=\"cardBodyStyle\">\n                  <span style=\"line-height: 18px;font-weight: 500;color:#676f83;font-size: 12px\">\n                    创建文档\n                    <a-tooltip title=\"知识库文档\">\n                      <a style=\"color: unset\" href=\"https://help.jeecg.com/aigc/guide/knowledge#4-%E7%9F%A5%E8%AF%86%E5%BA%93%E6%96%87%E6%A1%A3\" target=\"_blank\">\n                        <Icon style=\"position:relative;top:1px\" icon=\"ant-design:question-circle-outlined\" size=\"14\"></Icon>\n                      </a>\n                    </a-tooltip>\n                  </span>\n                  <div class=\"add-knowledge-doc\" @click=\"handleCreateText\">\n                    <Icon icon=\"ant-design:form-outlined\" size=\"13\"></Icon><span>手动录入</span>\n                  </div>\n                  <div class=\"add-knowledge-doc\" @click=\"handleCreateUpload\">\n                    <Icon icon=\"ant-design:cloud-upload-outlined\" size=\"13\"></Icon><span>文件上传</span>\n                  </div>\n                  <div class=\"add-knowledge-doc\">\n                    <a-upload\n                        accept=\".zip\"\n                        name=\"file\"\n                        :data=\"{ knowId: knowledgeId }\"\n                        :showUploadList=\"false\"\n                        :headers=\"headers\"\n                        :beforeUpload=\"beforeUpload\"\n                        :action=\"uploadUrl\"\n                        @change=\"handleUploadChange\"\n                        style=\"width: 100%;\"\n                    >\n                        <div style=\"display: flex;width: 100%\">\n                          <Icon style=\"margin-left: 0;color:#676f83\" icon=\"ant-design:project-outlined\" size=\"13\"></Icon>\n                          <span style=\"color:#676f83;font-size: 12px\">文档库上传</span>\n                        </div>\n                    </a-upload>\n                  </div>\n                  <a-dropdown placement=\"bottomRight\" :trigger=\"['click']\">\n                    <div class=\"ant-dropdown-link pointer operation\" @click.prevent.stop>\n                      <Icon icon=\"ant-design:ellipsis-outlined\" size=\"16\"></Icon>\n                    </div>\n                    <template #overlay>\n                      <a-menu>\n                        <a-menu-item key=\"delete\" @click=\"onDeleteAll\">\n                          <Icon icon=\"ant-design:delete-outlined\" size=\"16\"></Icon>\n                          清空文档\n                        </a-menu-item>\n                      </a-menu>\n                    </template>\n                  </a-dropdown>\n                </a-card>\n              </a-col>\n              <a-col :xxl=\"4\" :xl=\"6\" :lg=\"6\" :md=\"6\" :sm=\"12\" :xs=\"24\" v-for=\"item in knowledgeDocDataList\">\n                <a-card :class=\"['knowledge-card','pointer', {\n                  checked: item.__checked,\n                }]\" @click=\"handleEdit(item)\">\n                  <div class=\"knowledge-checkbox\">\n                    <a-checkbox v-model:checked=\"item.__checked\" @click.stop=\"\"/>\n                  </div>\n                  <div class=\"knowledge-header\">\n                    <div class=\"header-text flex\">\n                      <Icon v-if=\"item.type==='text'\" icon=\"ant-design:file-text-outlined\" size=\"32\" color=\"#00a7d0\"></Icon>\n                      <Icon v-if=\"item.type==='file' && getFileSuffix(item.metadata) === 'pdf'\" icon=\"ant-design:file-pdf-outlined\" size=\"32\" color=\"rgb(211, 47, 47)\"></Icon>\n                      <Icon v-if=\"item.type==='file' && getFileSuffix(item.metadata) === 'docx'\" icon=\"ant-design:file-word-outlined\" size=\"32\" color=\"rgb(68, 138, 255)\"></Icon>\n                      <Icon v-if=\"item.type==='file' && getFileSuffix(item.metadata) === 'pptx'\" icon=\"ant-design:file-ppt-outlined\" size=\"32\" color=\"rgb(245, 124, 0)\"></Icon>\n                      <Icon v-if=\"item.type==='file' && getFileSuffix(item.metadata) === 'xlsx'\" icon=\"ant-design:file-excel-outlined\" size=\"32\" color=\"rgb(98, 187, 55)\"></Icon>\n                      <Icon v-if=\"item.type==='file' && getFileSuffix(item.metadata) === 'txt'\" icon=\"ant-design:file-text-outlined\" size=\"32\" color=\"#00a7d0\"></Icon>\n                      <Icon v-if=\"item.type==='file' && getFileSuffix(item.metadata) === 'md'\" icon=\"ant-design:file-markdown-outlined\" size=\"32\" color=\"#292929\"></Icon>\n                      <Icon v-if=\"item.type==='file' && getFileSuffix(item.metadata) === ''\" icon=\"ant-design:file-unknown-outlined\" size=\"32\" color=\"#f5f5dc\"></Icon>\n                      <span class=\"ellipsis header-title\">{{ item.title }}</span>\n                    </div>\n                  </div>\n                  <div class=\"card-description\">\n                    <span>{{ item.content }}</span>\n                  </div>\n                  <div class=\"flex\" style=\"justify-content: space-between\">\n                    <div class=\"card-text\">\n                      状态：\n                      <div v-if=\"item.status==='complete'\" class=\"card-text-status\">\n                        <Icon icon=\"ant-design:check-circle-outlined\" size=\"16\" color=\"#56D1A7\"></Icon>\n                        <span class=\"ml-2\">已完成</span>\n                      </div>\n                      <div v-else-if=\"item.status==='building'\" class=\"card-text-status\">\n                        <a-spin v-if=\"item.loading\" :spinning=\"item.loading\" :indicator=\"indicator\"></a-spin>\n                        <span class=\"ml-2\">构建中</span>\n                      </div>\n                      <div v-else-if=\"item.status==='draft'\" class=\"card-text-status\">\n                        <img src=\"../icon/draft.png\" style=\"width: 16px;height: 16px\" />\n                        <span class=\"ml-2\">草稿</span>\n                      </div>\n                      <a-tooltip v-else-if=\"item.status==='failed'\" :title=\"getDocFailedReason(item)\">\n                        <div class=\"card-text-status\">\n                          <Icon icon=\"ant-design:close-circle-outlined\" size=\"16\" color=\"#FF4D4F\"></Icon>\n                          <span class=\"ml-2\">失败</span>\n                        </div>\n                      </a-tooltip>\n                    </div>\n                    <a-dropdown placement=\"bottomRight\" :trigger=\"['click']\">\n                      <div class=\"ant-dropdown-link pointer operation\" @click.prevent.stop>\n                        <Icon icon=\"ant-design:ellipsis-outlined\" size=\"16\"></Icon>\n                      </div>\n                      <template #overlay>\n                        <a-menu>\n                          <a-menu-item key=\"vectorization\" @click=\"handleVectorization(item.id)\">\n                            <Icon icon=\"ant-design:retweet-outlined\" size=\"16\"></Icon>\n                            向量化\n                          </a-menu-item>\n                          <a-menu-item key=\"edit\" @click=\"handleEdit(item)\">\n                            <Icon icon=\"ant-design:edit-outlined\" size=\"16\"></Icon>\n                            编辑\n                          </a-menu-item>\n                          <a-menu-item key=\"delete\" @click=\"handleDelete(item.id)\">\n                            <Icon icon=\"ant-design:delete-outlined\" size=\"16\"></Icon>\n                            删除\n                          </a-menu-item>\n                        </a-menu>\n                      </template>\n                    </a-dropdown>\n                  </div>\n                </a-card>\n              </a-col>\n            </a-row>\n            <Pagination\n              v-if=\"knowledgeDocDataList.length > 0\"\n              :current=\"pageNo\"\n              :page-size=\"pageSize\"\n              :page-size-options=\"pageSizeOptions\"\n              :total=\"total\"\n              :showQuickJumper=\"true\"\n              :showSizeChanger=\"true\"\n              @change=\"handlePageChange\"\n              class=\"list-footer\"\n              size=\"small\"\n              :show-total=\"() => `共${total}条` \"\n            />\n          </div>\n\n          <div v-if=\"selectedKey === 'hitTest'\" style=\"padding: 16px\">\n            <a-spin :spinning=\"spinning\">\n              <div class=\"hit-test\">\n                <h4>命中测试</h4>\n                <span>针对用户提问调试段落匹配情况，保障回答效果。</span>\n              </div>\n              <div class=\"content\">\n                <div class=\"content-title\">\n                  <Avatar v-if=\"hitShowSearchText\" :size=\"35\" :src=\"avatar\" />\n                  <span>{{ hitShowSearchText }}</span>\n                </div>\n                <div class=\"content-card\">\n                  <a-row :span=\"24\" class=\"knowledge-row\" v-if=\"hitTextList.length>0\">\n                    <a-col :xxl=\"6\" :xl=\"6\" :lg=\"6\" :md=\"6\" :sm=\"12\" :xs=\"24\" v-for=\"item in hitTextList\">\n                      <a-card class=\"hit-card pointer\" style=\"border-color: #ffffff\" @click=\"hitTextDescClick(item)\">\n                        <div class=\"card-title\">\n                          <div style=\"display: flex;\">\n                            <Icon icon=\"ant-design:appstore-outlined\" size=\"14\"></Icon>\n                            <span style=\"margin-left: 4px\">Chunk-{{item.chunk}}</span>\n                            <span style=\"margin-left: 10px\">{{ item.content.length }} 字符</span>\n                          </div>\n                          <a-tag class=\"card-title-tag\" color=\"#a9c8ff\">\n                            <span>{{ getTagTxt(item.score) }}</span>\n                          </a-tag>\n                        </div>\n                        <div class=\"card-description\">\n                          {{ item.content }}\n                        </div>\n                        <div class=\"card-footer\">\n                          {{item.docName}}\n                        </div>\n                      </a-card>\n                    </a-col>\n                  </a-row>\n                  <div v-else-if=\"notHit\">\n                    <a-empty :image-style=\"{ margin: '0 auto', height: '160px', verticalAlign: 'middle', borderStyle: 'none' }\">\n                      <template #description>\n                        <div style=\"margin-top: 26px; font-size: 20px; color: #000; text-align: center !important\">\n                          没有命中的分段\n                        </div>\n                      </template>\n                    </a-empty>\n                  </div>\n                </div>\n              </div>\n              <div class=\"param\">\n                <span style=\"font-weight: bold; font-size: 16px\">参数配置</span>\n                <ul>\n                  <li>\n                    <span>条数：</span>\n                    <a-input-number :min=\"1\" v-model:value=\"topNumber\"></a-input-number>\n                  </li>\n                  <li>\n                    <span>Score阈值：</span>\n                    <a-input-number :min=\"0\" :step=\"0.01\" :max=\"1\" v-model:value=\"similarity\"></a-input-number>\n                  </li>\n                </ul>\n              </div>\n              <div class=\"hit-test-footer\">\n                <a-input v-model:value=\"hitText\" size=\"large\" placeholder=\"请输入\" style=\"width: 100%\" @pressEnter=\"hitTestClick\">\n                  <template #suffix>\n                    <Icon icon=\"ant-design:send-outlined\" style=\"transform: rotate(-33deg); cursor: pointer\" size=\"22\" @click=\"hitTestClick\"></Icon>\n                  </template>\n                </a-input>\n              </div>\n            </a-spin>\n          </div>\n        </a-layout-content>\n      </a-layout>\n      <Loading tip=\"上传中，请稍后\" :loading=\"uploadLoading\"></Loading>\n    </BasicModal>\n\n    <!--  手工录入文本  -->\n    <AiragKnowledgeDocTextModal @register=\"docTextRegister\" @success=\"handleSuccess\"></AiragKnowledgeDocTextModal>\n    <!--  文本明细  -->\n    <AiTextDescModal @register=\"docTextDescRegister\"></AiTextDescModal>\n  </div>\n</template>\n\n<script lang=\"tsx\">\n  import { onBeforeMount, computed, ref, unref, h } from 'vue';\n  import BasicModal from '@/components/Modal/src/BasicModal.vue';\n  import { useModal, useModalInner } from '@/components/Modal';\n  import { knowledgeDocList, knowledgeDeleteBatchDoc, knowledgeDeleteAllDoc, knowledgeRebuildDoc, knowledgeEmbeddingHitTest } from '../AiKnowledgeBase.api';\n  import { doDeleteAllDoc } from '../AiKnowledgeBase.api.util';\n  import { ActionItem, BasicTable, TableAction } from '@/components/Table';\n  import { useListPage } from '@/hooks/system/useListPage';\n  import AiragKnowledgeDocTextModal from './AiragKnowledgeDocTextModal.vue';\n  import AiTextDescModal from './AiTextDescModal.vue';\n  import { useMessage } from '@/hooks/web/useMessage';\n  import { LoadingOutlined } from '@ant-design/icons-vue';\n  import {Avatar, message, Modal, Pagination} from 'ant-design-vue';\n  import { useUserStore } from '@/store/modules/user';\n  import { getFileAccessHttpUrl, getHeaders } from '@/utils/common/compUtils';\n  import defaultImg from '/@/assets/images/header.jpg';\n  import Icon from \"@/components/Icon\";\n  import { useGlobSetting } from '/@/hooks/setting';\n  import Loading from '@/components/Loading/src/Loading.vue';\n\n  export default {\n    name: 'AiragKnowledgeDocListModal',\n    components: {\n      Icon,\n      Pagination,\n      Avatar,\n      LoadingOutlined,\n      TableAction,\n      BasicTable,\n      BasicModal,\n      AiragKnowledgeDocTextModal,\n      AiTextDescModal,\n      Loading,\n    },\n    emits: ['success', 'register'],\n    setup(props, { emit }) {\n      //标题\n      const title = ref<string>('知识库详情');\n\n      //保存或修改\n      const knowledgeId = ref<string>('');\n\n      //菜单初始化选中的值\n      const selectedKeys = ref(['document']);\n      //菜单点击选中的key，用于显示和隐藏table\n      const selectedKey = ref<string>('document');\n      //定向搜索的文本\n      const hitText = ref<string>('');\n      //定向显示的文本\n      const hitShowSearchText = ref<string>('');\n      //加载效果\n      const spinning = ref<boolean>(false);\n      //最小分数 0-1\n      const similarity = ref<number>(0.65);\n      //条数\n      const topNumber = ref<number>(5);\n      //定向返回结果集\n      const hitTextList = ref<any>([]);\n      //用户头像\n      const avatar = ref<any>('');\n      const userStore = useUserStore();\n      //文档列表\n      const knowledgeDocDataList = ref<any>([]);\n      //当前页数\n      const pageNo = ref<number>(1);\n      //每页条数\n      const pageSize = ref<number>(10);\n      //总条数\n      const total = ref<number>(0);\n      //可选择的页数\n      const pageSizeOptions = ref<any>(['10', '20', '30']);\n      //查询参数\n      const searchText = ref<string>('');\n      //是否没有命中\n      const notHit = ref<boolean>(false);\n      //定时任务刷新列表\n      const timer = ref<any>(null);\n      //token\n      const headers = getHeaders();\n      const globSetting = useGlobSetting();\n      //上传路径\n      const uploadUrl = ref<string>(globSetting.domainUrl+\"/airag/knowledge/doc/import/zip\");\n      //上传加载\n      const uploadLoading = ref<boolean>(false);\n\n      //菜单项\n      const menuItems = ref<any>([\n        {\n          key: 'document',\n          icon: '',\n          label: '文档',\n          title: '文档',\n        },\n        {\n          key: 'hitTest',\n          icon: '',\n          label: '命中测试',\n          title: '命中测试',\n        },\n      ]);\n\n      // 当前选中的行\n      const selectedRows = computed(() => knowledgeDocDataList.value.filter(item => item.__checked))\n\n      //注册modal\n      const [docTextRegister, { openModal: docTextOpenModal }] = useModal();\n      const [docTextDescRegister, { openModal: docTextDescOpenModal }] = useModal();\n      const type = ref<string>('');\n      //注册modal\n      const [registerModal, { closeModal, setModalProps }] = useModalInner(async (data) => {\n        knowledgeId.value = data.id;\n        selectedKeys.value = ['document'];\n        selectedKey.value = 'document';\n        spinning.value = false;\n        notHit.value = false;\n        type.value = data.type;\n        await reload();\n        setModalProps({ confirmLoading: false });\n      });\n\n      const contentStyle = {\n        textAlign: 'center',\n        height: '100%',\n        width: '80%',\n        background: '#ffffff',\n      };\n\n      const siderStyle = {\n        textAlign: 'center',\n        width: '20%',\n        background: '#ffffff',\n        borderRight: '1px solid #cecece',\n      };\n\n      /**\n       * 加载指示符\n       */\n      const indicator =  h(LoadingOutlined, {\n        style: {\n          fontSize: '16px',\n          marginRight: '2px'\n        },\n        spin: true,\n      });\n\n      const { createMessage, createConfirmSync } = useMessage();\n\n      /**\n       * 手工录入文本\n       */\n      function handleCreateText() {\n        docTextOpenModal(true, { knowledgeId: knowledgeId.value, type: \"text\" });\n      }\n\n      /**\n       * 文件上传\n       */\n      function handleCreateUpload() {\n        console.log(\"11111111111\")\n        docTextOpenModal(true, { knowledgeId: knowledgeId.value, type: \"file\" });\n      }\n\n      /**\n       * web网络地址\n       */\n      function handleCreateWeb() {\n        createMessage.warning('功能正在完善中....');\n      }\n\n      /**\n       * 编辑\n       */\n      function handleEdit(record) {\n        // 判断如果有选中的行，则说明是批量操作模式\n        if (selectedRows.value.length > 0) {\n          record.__checked = !record.__checked;\n          return\n        }\n\n\n        if (record.type === 'text' || record.type === 'file') {\n          docTextOpenModal(true, {\n            record,\n            isUpdate: true,\n          });\n        }\n      }\n\n      /**\n       * 删除\n       * @param id\n       */\n      function handleDelete(id) {\n        Modal.confirm({\n          title: '提示',\n          content: '确认要删除该文档吗?',\n          okText: '确认',\n          cancelText: '取消',\n          onOk: () => {\n            if(knowledgeDocDataList.value.length == 1 && pageNo.value > 1) {\n              pageNo.value = pageNo.value - 1;\n            }\n            knowledgeDeleteBatchDoc({ ids: id }, reload);\n          }\n        })\n      }\n\n      function getDocFailedReason(doc) {\n        let metadata = doc?.metadata;\n        if (!metadata) {\n          return '构建失败，原因未知';\n        }\n        try {\n          metadata = JSON.parse(metadata);\n          return metadata?.failedReason || '构建失败，原因未知';\n        } catch (e) {\n          console.log('getDocFailedReason', e);\n          return '构建失败，原因未知';\n        }\n      }\n\n      /**\n       * 向量化\n       *\n       * @param id\n       */\n      async function handleVectorization(id) {\n        await knowledgeRebuildDoc({ docIds: id }, handleSuccess);\n      }\n\n      /**\n       * 文档新增和编辑成功回调\n       */\n      function handleSuccess() {\n        clearInterval(timer.value);\n        timer.value = null;\n        reload();\n        triggeringTimer();\n      }\n\n      /**\n       * 触发定时任务\n       */\n      function triggeringTimer() {\n        timer.value = setInterval(() => {\n          reload();\n        },5000)\n      }\n\n      /**\n       * 菜单点击事件\n       * @param value\n       */\n      function handleMenuClick(value) {\n        if (value.key === 'document') {\n          setTimeout(() => {\n            pageNo.value = 1;\n            pageSize.value = 10;\n            searchText.value = \"\";\n\n            reload();\n          });\n        } else {\n          hitTextList.value = [];\n          hitShowSearchText.value = '';\n          hitText.value = '';\n          avatar.value = '';\n          similarity.value = 0.65;\n          topNumber.value = 5;\n        }\n        selectedKey.value = value.key;\n      }\n\n      /**\n       * 命中测试\n       */\n      function hitTestClick() {\n        if (hitText.value) {\n          spinning.value = true;\n          knowledgeEmbeddingHitTest({\n            queryText: hitText.value,\n            knowId: knowledgeId.value,\n            topNumber: topNumber.value,\n            similarity: similarity.value,\n          }).then((res) => {\n            if (res.success) {\n              if (res.result) {\n                hitTextList.value = res.result;\n              } else {\n                hitTextList.value = [];\n              }\n            }\n            hitShowSearchText.value = hitText.value;\n            avatar.value = userStore.getUserInfo.avatar ? getFileAccessHttpUrl(userStore.getUserInfo.avatar) : defaultImg;\n            hitText.value = '';\n            notHit.value = hitTextList.value.length == 0;\n            spinning.value = false;\n          }).catch(()=>{\n            spinning.value = false;\n          });\n        }\n      }\n\n      /**\n       * 获取文本\n       * @param value\n       */\n      function getTagTxt(value) {\n        return 'score' + ' ' + value.toFixed(2);\n      }\n\n      /**\n       * 命中测试卡点击事件\n       * @param values\n       */\n      function hitTextDescClick(values) {\n        docTextDescOpenModal(true, { ...values });\n      }\n\n      /**\n       * 加载表格\n       */\n      async function reload() {\n        let params = {\n          pageNo: pageNo.value,\n          pageSize: pageSize.value,\n          knowledgeId: knowledgeId.value,\n          title: '*' + searchText.value + '*',\n          column: 'createTime',\n          order: 'desc'\n        };\n        await knowledgeDocList(params).then((res) => {\n          if (res.success) {\n            //update-begin---author:wangshuai---date:2025-03-21---for:【QQYUN-11636】向量化功能改成异步---\n            if(res.result.records){\n              let clearTimer = true;\n              for (const item of res.result.records) {\n                if(item.status && item.status === 'building' ){\n                  clearTimer = false;\n                  item.loading = true;\n                }else{\n                  item.loading = false;\n                }\n              }\n              if(clearTimer){\n                clearInterval(timer.value);\n              }\n            }\n            //update-end---author:wangshuai---date:2025-03-21---for:【QQYUN-11636】向量化功能改成异步---\n            knowledgeDocDataList.value = res.result.records.map((item)=>{\n              item.__checked = false;\n              return item;\n            });\n            total.value = res.result.total;\n          } else {\n            knowledgeDocDataList.value = [];\n            total.value = 0;\n          }\n        });\n      }\n\n      /**\n       * 分页改变事件\n       * @param page\n       * @param current\n       */\n      function handlePageChange(page, current) {\n        pageNo.value = page;\n        pageSize.value = current;\n        reload();\n      }\n\n      /**\n       * 获取文件后缀\n       */\n      function getFileSuffix(metadata) {\n        if(metadata){\n          let filePath = JSON.parse(metadata).filePath;\n          const index = filePath.lastIndexOf('.');\n          return index > 0 ? filePath.substring(index + 1).toLowerCase() : '';\n        }\n        return '';\n      }\n\n      /**\n       * 上传前事件\n       */\n      function beforeUpload(file) {\n        let fileType = file.type;\n        if (fileType !== 'application/zip' && fileType !== 'application/x-zip-compressed') {\n            createMessage.warning('请上传zip文件');\n            return false;\n        }\n        uploadLoading.value = true;\n        return true;\n      }\n\n      /**\n       * 文件上传回调事件\n       * @param info\n       */\n      function handleUploadChange(info) {\n        let { file } = info;\n        if (file.status === 'error' || (file.response && file.response.code == 500)) {\n          createMessage.error(file.response?.message ||`${file.name} 上传失败,请查看服务端日志`);\n          uploadLoading.value = false;\n          return;\n        }\n        if (file.status === 'done') {\n\n          if(!file.response.success){\n            createMessage.warning(file.response.message);\n            uploadLoading.value = false;\n            return;\n          }\n          uploadLoading.value = false;\n          createMessage.success(file.response.message);\n          handleSuccess();\n        }\n      }\n\n      function onClearSelected() {\n        knowledgeDocDataList.value.forEach(item => {\n          item.__checked = false;\n        });\n      }\n\n      // 清空文档\n      async function onDeleteAll() {\n        pageNo.value = 1;\n        doDeleteAllDoc(knowledgeId.value, reload);\n      }\n\n      // 批量删除\n      async function onDeleteBatch() {\n        const flag = await createConfirmSync({ title: '批量删除', content: `确定要删除这 ${selectedRows.value.length} 条数据吗？` });\n        if (!flag) {\n          return;\n        }\n        const ids = selectedRows.value.map(item => item.id)\n        let number = knowledgeDocDataList.value.length - ids.length;\n        if(number == 0 && pageNo.value > 1) {\n          pageNo.value = pageNo.value - 1;\n        }\n        knowledgeDeleteBatchDoc({ ids }, reload);\n      }\n\n      /**\n       * 回车搜索\n       */\n      function searchTextEnter(){\n        pageNo.value = 1;\n        reload();\n      }\n\n      onBeforeMount(()=>{\n        clearInterval(timer.value);\n        timer.value = null;\n      })\n\n      return {\n        registerModal,\n        title,\n        docTextRegister,\n        handleCreateText,\n        beforeUpload,\n        handleCreateUpload,\n        handleSuccess,\n        contentStyle,\n        siderStyle,\n        selectedKeys,\n        menuItems,\n        handleMenuClick,\n        selectedKey,\n        hitTestClick,\n        hitText,\n        spinning,\n        similarity,\n        topNumber,\n        hitShowSearchText,\n        avatar,\n        hitTextList,\n        getTagTxt,\n        docTextDescRegister,\n        hitTextDescClick,\n        knowledgeDocDataList,\n        handleEdit,\n        handleDelete,\n        getDocFailedReason,\n        handleVectorization,\n        pageNo,\n        pageSize,\n        pageSizeOptions,\n        total,\n        handlePageChange,\n        searchText,\n        reload,\n        cardBodyStyle:{ textAlign: 'left', width: '100%' },\n        getFileSuffix,\n        notHit,\n        indicator,\n        headers,\n        uploadUrl,\n        handleUploadChange,\n        knowledgeId,\n        uploadLoading,\n        selectedRows,\n        onClearSelected,\n        onDeleteAll,\n        onDeleteBatch,\n        searchTextEnter,\n        type,\n      };\n    },\n  };\n</script>\n\n<style scoped lang=\"less\">\n  .pointer {\n    cursor: pointer;\n  }\n\n  .hit-test {\n    box-sizing: border-box;\n    flex-wrap: wrap;\n    text-align: left;\n    display: flex;\n    margin-bottom: 10px;\n\n    h4 {\n      font-weight: bold;\n      font-size: 16px;\n      align-self: center;\n      margin-bottom: 0;\n      color: #1f2329;\n    }\n\n    span {\n      margin-left: 10px;\n      color: #8f959e;\n      font-weight: 400;\n      align-self: center;\n      margin-top: 2px;\n    }\n  }\n\n  .hit-test-footer {\n    margin-top: 10px;\n    display: flex;\n  }\n  .param {\n    text-align: left;\n    margin-top: 10px;\n    ul {\n      margin-top: 10px;\n      display: flex;\n      li {\n        align-items: center;\n        margin-right: 10px;\n        display: flex;\n      }\n    }\n    border-bottom: 1px solid #cec6c6;\n  }\n  .content {\n    height: calc(100vh - 300px);\n    padding: 8px;\n    border-radius: 10px;\n    background-color: #f9fbfd;\n    overflow-y: auto;\n    .content-title {\n      font-size: 16px;\n      font-weight: 600;\n      text-align: left;\n      margin-left: 10px;\n      display: flex;\n      span {\n        margin-left: 4px;\n        font-size: 20px;\n        align-self: center;\n      }\n    }\n    .content-card {\n      margin-top: 20px;\n      margin-left: 10px;\n      .hit-card {\n        height: 160px;\n        margin-bottom: 10px;\n        margin-right: 10px;\n        border-radius: 10px;\n        background: #fcfcfd;\n        border: 1px solid #f0f0f0;\n        box-shadow: 0 2px 4px #e6e6e6;\n        transition: all 0.3s ease;\n        .card-title {\n          justify-content: space-between;\n          color: #887a8b;\n          font-size: 14px;\n          display: flex;\n        }\n      }\n    }\n  }\n  .hit-card:hover {\n    box-shadow: 0 6px 12px #d0d3d8 !important;\n  }\n  .pointer {\n    cursor: pointer;\n  }\n\n  .card-description {\n    display: -webkit-box;\n    -webkit-box-orient: vertical;\n    -webkit-line-clamp: 4;\n    height: 6em;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    line-height: 1.5;\n    margin-top: 16px;\n    text-align: left;\n    font-size: 12px;\n    color: #676F83;\n  }\n\n  .card-title-tag {\n    color: #477dee;\n  }\n\n  .knowledge-row {\n    padding: 16px;\n    overflow-y: auto;\n  }\n\n  .add-knowledge-card {\n    border-radius: 10px;\n    margin-bottom: 20px;\n    display: inline-flex;\n    font-size: 16px;\n    height: 166px;\n    width: calc(100% - 20px);\n    background: #fcfcfd;\n    border: 1px solid #f0f0f0;\n    box-shadow: 0 2px 4px #e6e6e6;\n    transition: all 0.3s ease;\n    .add-knowledge-card-icon {\n      padding: 8px;\n      margin-right: 12px;\n    }\n  }\n\n  .knowledge-card {\n    border-radius: 10px;\n    margin-right: 20px;\n    margin-bottom: 20px;\n    height: 166px;\n    background: #fcfcfd;\n    border: 1px solid #f0f0f0;\n    box-shadow: 0 2px 4px #e6e6e6;\n    transition: all 0.3s ease;\n\n    .knowledge-checkbox {\n      position: absolute;\n      top: 8px;\n      right: 8px;\n      z-index: 1;\n      align-items: center;\n      justify-content: center;\n      display: none;\n    }\n\n    &:hover, &.checked {\n      .knowledge-checkbox {\n        display: flex;\n      }\n    }\n\n    &.checked {\n      border: 1px solid @primary-color;\n    }\n\n    .knowledge-header {\n      position: relative;\n      font-size: 14px;\n      height: 20px;\n      text-align: left;\n      .header-img {\n        width: 40px;\n        height: 40px;\n        margin-right: 12px;\n      }\n      .header-title{\n        font-weight: bold;\n        color: #354052;\n        margin-left: 4px;\n        align-self: center;\n      }\n\n      .header-text {\n        overflow: hidden;\n        position: relative;\n        display: flex;\n        font-size: 16px;\n      }\n    }\n  }\n\n  .add-knowledge-card,.knowledge-card{\n    transition: box-shadow 0.3s ease;\n  }\n\n  .add-knowledge-card:hover,.knowledge-card:hover{\n    box-shadow: 0 6px 12px #d0d3d8;\n  }\n\n  .ellipsis {\n    text-overflow: ellipsis;\n    overflow: hidden;\n    text-wrap: nowrap;\n    width: calc(100% - 30px);\n  }\n\n  :deep(.ant-card .ant-card-body) {\n    padding: 16px;\n  }\n\n  .card-text{\n    font-size: 12px;\n    display: flex;\n    margin-top: 10px;\n    align-items: center;\n  }\n\n  .search-header {\n    margin-top: 10px;\n    margin-left: 26px;\n\n    .search-input {\n      width: 240px;\n      display: block;\n    }\n  }\n\n  .operation{\n    border: none;\n    margin-top: 10px;\n    align-items: end;\n    display: none !important;\n    bottom: 8px;\n    right: 4px;\n    position: absolute;\n  }\n\n  .add-knowledge-card:hover, .knowledge-card:hover{\n    .operation{\n      display: block !important;\n    }\n  }\n\n  .add-knowledge-doc{\n    margin-top: 6px;\n    color:#6F6F83;\n    font-size: 13px;\n    width: 100%;\n    cursor: pointer;\n    display: flex;\n    span{\n      margin-left: 4px;\n      line-height: 28px;\n    }\n  }\n  .add-knowledge-doc:hover{\n    background: #c8ceda33;\n  }\n  .operation{\n    background-color: unset;\n    border: none;\n    margin-right: 2px;\n  }\n  .operation:hover{\n    color: #000000;\n    background-color: #e9ecf2;\n    border: none;\n  }\n  .ant-dropdown-link{\n    font-size: 14px;\n    height: 24px;\n    padding: 0 7px;\n    border-radius: 4px;\n    align-content: center;\n    text-align: center;\n  }\n  .card-footer{\n    margin-top: 4px;\n    font-weight: 400;\n    color: #1f2329;\n    text-align: left;\n    font-size: 12px;\n  }\n  .card-text-status{\n    display: flex;\n    align-items: center;\n  }\n  .ml-2{\n    margin-left: 2px;\n  }\n  .add-knowledge-doc {\n    :deep(.ant-upload) {\n      width: 100%;\n    }\n  }\n</style>\n<style lang=\"less\">\n  .airag-knowledge-doc .scroll-container {\n    padding: 0 !important;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiknowledge/components/AiragKnowledgeDocTextModal.vue",
    "content": "<!--手动录入text-->\n<template>\n  <div class=\"p-2\">\n    <BasicModal destroyOnClose @register=\"registerModal\" width=\"600px\" :title=\"title\" @ok=\"handleOk\" @cancel=\"handleCancel\">\n      <BasicForm @register=\"registerForm\"></BasicForm>\n    </BasicModal>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { ref, unref } from 'vue';\n  import BasicModal from '@/components/Modal/src/BasicModal.vue';\n  import { useModal, useModalInner } from '@/components/Modal';\n\n  import BasicForm from '@/components/Form/src/BasicForm.vue';\n  import { useForm } from '@/components/Form';\n  import { docTextSchema } from '../AiKnowledgeBase.data';\n  import { knowledgeSaveDoc, queryById } from '../AiKnowledgeBase.api';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  export default {\n    name: 'AiragKnowledgeDocModal',\n    components: {\n      BasicForm,\n      BasicModal,\n    },\n    emits: ['success', 'register'],\n    setup(props, { emit }) {\n      const title = ref<string>('创建知识库');\n\n      //保存或修改\n      const isUpdate = ref<boolean>(false);\n      //知识库id\n      const knowledgeId = ref<string>();\n      //表单配置\n      const [registerForm, { resetFields, setFieldsValue, validate, clearValidate, updateSchema }] = useForm({\n        schemas: docTextSchema,\n        showActionButtonGroup: false,\n        layout: 'vertical',\n        wrapperCol: { span: 24 },\n      });\n\n      //注册modal\n      const [registerModal, { closeModal, setModalProps }] = useModalInner(async (data) => {\n        //重置表单\n        await resetFields();\n        setModalProps({ confirmLoading: false });\n        isUpdate.value = !!data?.isUpdate;\n        title.value = isUpdate.value ? '编辑文档' : '创建文档';\n        if (unref(isUpdate)) {\n          if(data.record.type === 'file' && data.record.metadata){\n            data.record.filePath = JSON.parse(data.record.metadata).filePath;\n          }\n          //表单赋值\n          await setFieldsValue({\n            ...data.record,\n          });\n        } else {\n          knowledgeId.value = data.knowledgeId;\n          await setFieldsValue({ type: data.type })\n        }\n        setModalProps({ bodyStyle: { padding: '10px' } });\n      });\n\n      /**\n       * 保存\n       */\n      async function handleOk() {\n        try {\n          setModalProps({ confirmLoading: true });\n          let values = await validate();\n          if (!unref(isUpdate)) {\n            values.knowledgeId = knowledgeId.value;\n          }\n          if(values.filePath){\n            values.metadata = JSON.stringify({ filePath: values.filePath });\n            delete values.filePath;\n          }\n          await knowledgeSaveDoc(values);\n          //关闭弹窗\n          closeModal();\n          //刷新列表\n          emit('success');\n        } finally {\n          setModalProps({ confirmLoading: false });\n        }\n      }\n\n      /**\n       * 取消\n       */\n      function handleCancel() {\n        closeModal();\n      }\n\n      return {\n        registerModal,\n        registerForm,\n        title,\n        handleOk,\n        handleCancel,\n      };\n    },\n  };\n</script>\n\n<style scoped lang=\"less\">\n  .pointer {\n    cursor: pointer;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aimcp/AiragMcp.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\n// import { useMessage } from \"/@/hooks/web/useMessage\"; // 需要确认弹窗再启用\n\nenum Api {\n  list = '/airag/airagMcp/list',\n  save='/airag/airagMcp/save',\n  deleteOne = '/airag/airagMcp/delete',\n  importExcel = '/airag/airagMcp/importExcel',\n  exportXls = '/airag/airagMcp/exportXls',\n  sync = '/airag/airagMcp/sync',\n  toggleStatus = '/airag/airagMcp/status',\n  saveAndSync = '/airag/airagMcp/saveAndSync',\n  queryById = '/airag/airagMcp/queryById',\n  saveTools = '/airag/airagMcp/saveTools',\n}\n\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) => defHttp.get({ url: Api.list, params });\n\n/**\n * 删除单个\n * @param params\n * @param handleSuccess\n */\nexport const deleteOne = (params,handleSuccess) => {\n  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n\n\n/**\n * 保存或者更新\n * @param params\n * @param isUpdate\n */\nexport const saveOrUpdate = (params) => {\n  return defHttp.post({url: Api.save, data: params}, { isTransformResponse: false });\n}\n\n/**\n * 保存并同步\n * @param params\n * @param isUpdate\n */\nexport const saveAndSync = (params) => {\n  return defHttp.post({url: Api.saveAndSync, data: params}, { isTransformResponse: false });\n}\n\n/**\n * 同步接口\n * @param id\n */\nexport const syncMcp = (id) => defHttp.post({ url: Api.sync+\"/\"+id });\n\n/**\n * 修改状态\n * @param id\n */\nexport const toggleStatus = (id,status) => defHttp.post({ url: Api.toggleStatus+\"/\"+id + \"/\"+ status });\n\n/**\n * 详情查询\n * @param id\n */\nexport const queryById = (id) => defHttp.get({ url: Api.queryById ,params: { id:id }}, { isTransformResponse: false });\n\n/**\n * 保存插件工具（仅更新tools字段）\n * @param id 插件ID\n * @param tools 工具列表JSON字符串\n */\nexport const saveTools = (id, tools) => defHttp.post({ url: Api.saveTools, data: { id, tools } }, { isTransformResponse: false });\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aimcp/AiragMcp.data.ts",
    "content": "import {BasicColumn} from '/@/components/Table';\nimport {FormSchema} from '/@/components/Table';\nimport { rules} from '/@/utils/helper/validator';\nimport { render } from '/@/utils/common/renderUtils';\nimport { getWeekMonthQuarterYear } from '/@/utils';\n//列表数据\nexport const columns: BasicColumn[] = [\n  {\n    title: '图标',\n    align: \"center\",\n    dataIndex: 'icon'\n  },\n  {\n    title: '名称',\n    align: \"center\",\n    dataIndex: 'name'\n  },\n  {\n    title: '描述',\n    align: \"center\",\n    dataIndex: 'descr'\n  },\n  {\n    title: 'mcp类型（sse：sse类型；stdio：标准类型）',\n    align: \"center\",\n    dataIndex: 'type'\n  },\n  {\n    title: '服务端点（SSE类型为URL，stdio类型为命令）',\n    align: \"center\",\n    dataIndex: 'endpoint'\n  },\n  {\n    title: '请求头（sse类型）、环境变量（stdio类型）',\n    align: \"center\",\n    dataIndex: 'headers'\n  },\n  {\n    title: '工具列表',\n    align: \"center\",\n    dataIndex: 'tools'\n  },\n  {\n    title: '状态（enable=启用、disable=禁用）',\n    align: \"center\",\n    dataIndex: 'status'\n  },\n  {\n    title: '是否同步',\n    align: \"center\",\n    dataIndex: 'synced'\n  },\n  {\n    title: '元数据',\n    align: \"center\",\n    dataIndex: 'metadata'\n  },\n  {\n    title: '租户id',\n    align: \"center\",\n    dataIndex: 'tenantId'\n  },\n];\n\n// 高级查询数据\nexport const superQuerySchema = {\n  icon: {title: '应用图标',order: 0,view: 'text', type: 'string',},\n  name: {title: '名称',order: 1,view: 'text', type: 'string',},\n  descr: {title: '描述',order: 2,view: 'text', type: 'string',},\n  type: {title: 'mcp类型（sse：sse类型；stdio：标准类型）',order: 3,view: 'text', type: 'string',},\n  endpoint: {title: '服务端点（SSE类型为URL，stdio类型为命令）',order: 4,view: 'textarea', type: 'string',},\n  headers: {title: '请求头（sse类型）、环境变量（stdio类型）',order: 5,view: 'textarea', type: 'string',},\n  tools: {title: '工具列表',order: 6,view: 'textarea', type: 'string',},\n  status: {title: '状态（enable=启用、disable=禁用）',order: 7,view: 'text', type: 'string',},\n  synced: {title: '是否同步',order: 8,view: 'number', type: 'number',},\n  metadata: {title: '元数据',order: 9,view: 'textarea', type: 'string',},\n  tenantId: {title: '租户id',order: 10,view: 'text', type: 'string',},\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aimcp/AiragMcpList.vue",
    "content": "<template>\n  <div class=\"mcp\">\n    <!-- 查询区域 -->\n    <div class=\"jeecg-basic-table-form-container\">\n      <a-form\n        ref=\"formRef\"\n        @keyup.enter=\"searchQuery\"\n        :model=\"queryParam\"\n        :label-col=\"labelCol\"\n        :wrapper-col=\"wrapperCol\"\n        style=\"background-color: #f7f8fc !important;\"\n      >\n        <a-row :gutter=\"24\">\n          <a-col :lg=\"6\">\n            <a-form-item name=\"name\" label=\"名称\">\n              <JInput v-model:value=\"queryParam.name\" />\n            </a-form-item>\n          </a-col>\n          <a-col :lg=\"6\">\n            <a-form-item name=\"category\" label=\"类型\">\n              <a-select v-model:value=\"queryParam.category\" placeholder=\"全部\" allowClear>\n                <a-select-option value=\"plugin\">插件</a-select-option>\n                <a-select-option value=\"mcp\">MCP</a-select-option>\n              </a-select>\n            </a-form-item>\n          </a-col>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left; overflow: hidden\" class=\"table-page-search-submitButtons\">\n              <a-col :lg=\"6\">\n                <a-button type=\"primary\" preIcon=\"ant-design:search-outlined\" @click=\"searchQuery\">查询</a-button>\n                <a-button type=\"primary\" preIcon=\"ant-design:reload-outlined\" @click=\"searchReset\" style=\"margin-left: 8px\">重置</a-button>\n              </a-col>\n            </span>\n          </a-col>\n        </a-row>\n      </a-form>\n    </div>\n    <!-- 卡片区域 -->\n    <a-row :span=\"24\" class=\"mcp-row\">\n      <a-col :xxl=\"4\" :xl=\"6\" :lg=\"6\" :md=\"6\" :sm=\"12\" :xs=\"24\">\n        <a-card class=\"add-mcp-card\" @click=\"handleAdd\" >\n          <div class=\"flex\">\n            <Icon icon=\"ant-design:plus-outlined\" class=\"add-mcp-card-icon\" size=\"20\" />\n            <span class=\"add-mcp-card-title\">新增MCP</span>\n          </div>\n        </a-card>\n      </a-col>\n      <a-col v-for=\"item in mcpList\" :xxl=\"4\" :xl=\"6\" :lg=\"6\" :md=\"6\" :sm=\"12\" :xs=\"24\" :key=\"item.id\" v-if=\"mcpList && mcpList.length > 0\">\n        <a-card class=\"mcp-card\" @click=\"handleDetailClick(item)\">\n          <div class=\"mcp-header\">\n            <div class=\"flex\">\n              <img :src=\"getIcon(item.icon)\" class=\"header-img\" />\n              <div class=\"header-text\" :title=\"item.name\">{{ item.name }}</div>\n            </div>\n          </div>\n          <div class=\"mt-6\">\n            <ul>\n              <li class=\"flex mr-14\">\n                <span class=\"described\" :title=\"item.descr\">{{ item.descr || '-' }}</span>\n              </li>\n            </ul>\n          </div>\n          <div class=\"mcp-btn\">\n            <a-button class=\"mcp-icon\" size=\"small\" @click.prevent.stop=\"handleEditClick(item)\" v-auth=\"'llm:airag_mcp:edit'\">\n              <Icon icon=\"ant-design:edit-outlined\" />\n            </a-button>\n            <a-dropdown placement=\"bottomRight\" :trigger=\"['click']\" :getPopupContainer=\"(node) => node.parentNode\">\n              <div class=\"ant-dropdown-link pointer mcp-icon\" @click.prevent.stop>\n                <Icon icon=\"ant-design:ellipsis-outlined\" />\n              </div>\n              <template #overlay>\n                <a-menu>\n                  <!-- MCP类型：显示同步按钮 -->\n                  <a-menu-item\n                    v-if=\"item.category === 'mcp'\"\n                    key=\"sync\"\n                    @click.prevent.stop=\"handleSync(item)\"\n                    v-auth=\"'llm:airag_mcp:sync'\"\n                  >\n                    <Icon icon=\"ant-design:cloud-sync-outlined\" size=\"16\" /> 同步\n                  </a-menu-item>\n                  <!-- 插件类型：显示工具管理按钮 -->\n                  <a-menu-item\n                    v-if=\"item.category === 'plugin'\"\n                    key=\"toolManage\"\n                    @click.prevent.stop=\"handleToolManage(item)\"\n                    v-auth=\"'llm:airag_mcp:edit'\"\n                  >\n                    <Icon icon=\"ant-design:tool-outlined\" size=\"16\" /> 工具管理\n                  </a-menu-item>\n                  <!-- 编辑：始终显示，不受禁用启用影响 -->\n                  <a-menu-item\n                    key=\"edit\"\n                    @click.prevent.stop=\"handleEditClick(item)\"\n                    v-auth=\"'llm:airag_mcp:edit'\"\n                  >\n                    <Icon icon=\"ant-design:edit-outlined\" size=\"16\" /> 编辑\n                  </a-menu-item>\n                  <a-menu-item\n                    v-if=\"item.synced\"\n                    key=\"toggle\"\n                    @click.prevent.stop=\"handleToggleStatus(item)\"\n                    v-auth=\"'llm:airag_mcp:edit'\"\n                  >\n                    <Icon :icon=\"item.status === 'enable' ? 'ant-design:stop-outlined' : 'ant-design:check-circle-outlined'\" size=\"16\" />\n                    {{ item.status === 'enable' ? '禁用' : '启用' }}\n                  </a-menu-item>\n                  <a-menu-item\n                    v-if=\"item.status === 'disable' || !item.synced\"\n                    key=\"delete\"\n                    @click.prevent.stop=\"handleDeleteClick(item)\"\n                    v-auth=\"'llm:airag_mcp:delete'\"\n                  >\n                    <Icon icon=\"ant-design:delete-outlined\" size=\"16\" /> 删除\n                  </a-menu-item>\n                </a-menu>\n              </template>\n            </a-dropdown>\n          </div>\n          <div class=\"card-footer\" v-if=\"true\">\n            <div class=\"pill type-pill\" :title=\"'类型: '+(item.category === 'plugin' ? '插件' : 'MCP')\">\n              <Icon :icon=\"getCategoryIcon(item.category)\" class=\"pill-icon\" />\n              <span class=\"pill-text\">{{ item.category === 'plugin' ? '插件' : 'MCP' }}</span>\n            </div>\n            <div class=\"pill status-pill\" :class=\"item.synced ? (item.status==='enable'?'status-enable-pill':'status-disable-pill'):'status-unsynced-pill'\" :title=\"item.synced ? (item.status==='enable'?'已启用':'未启用'):'未同步'\">\n              <Icon :icon=\"getStatusIcon(item)\" class=\"pill-icon\" />\n              <span class=\"pill-text\">{{ item.synced ? (item.status==='enable'?'启用':'禁用') : '未同步' }}</span>\n            </div>\n            <div class=\"pill tool-pill\" :title=\"getToolCount(item.metadata)+' 个工具'\">\n              <Icon icon=\"ant-design:tool-outlined\" class=\"pill-icon\" />\n              <span class=\"pill-text\">{{ getToolCount(item.metadata) }} 个工具</span>\n            </div>\n          </div>\n        </a-card>\n      </a-col>\n    </a-row>\n    <Pagination\n      v-if=\"mcpList.length > 0\"\n      :current=\"pageNo\"\n      :page-size=\"pageSize\"\n      :page-size-options=\"pageSizeOptions\"\n      :total=\"total\"\n      :showQuickJumper=\"true\"\n      :showSizeChanger=\"true\"\n      @change=\"handlePageChange\"\n      class=\"list-footer\"\n      size=\"small\"\n      :show-total=\"() => `共${total}条` \"\n    />\n  </div>\n  <!-- 弹窗区域 -->\n  <AiragMcpAddModal @register=\"registerModal\" @success=\"reload\" />\n  <AiragMcpDetailModal @register=\"registerDetailModal\" @edit=\"handleDetailEdit\" @success=\"reload\" />\n</template>\n<script lang=\"ts\" name=\"llm-airagMcp\" setup>\nimport { reactive, ref } from 'vue';\nimport { Pagination } from 'ant-design-vue';\nimport AiragMcpAddModal from './components/AiragMcpAddModal.vue';\nimport AiragMcpDetailModal from './components/AiragMcpDetailModal.vue';\nimport { list, deleteOne, syncMcp, toggleStatus} from './AiragMcp.api';\nimport { useModal } from '/@/components/Modal';\nimport JInput from '@/components/Form/src/jeecg/components/JInput.vue';\nimport defaultLogo from './imgs/mcpLogo.png'\n\n// 列表数据\nconst mcpList = ref<any[]>([]);\n// 分页\nconst pageNo = ref<number>(1);\nconst pageSize = ref<number>(10);\nconst total = ref<number>(0);\nconst pageSizeOptions = ref<any>(['10', '20', '30']);\n\n// 查询参数\nconst queryParam = reactive<any>({});\nconst formRef = ref();\n\n// 查询区域label宽度\nconst labelCol = reactive({\n  xs: 24,\n  sm: 4,\n  xl: 6,\n  xxl: 6,\n});\nconst wrapperCol = reactive({\n  xs: 24,\n  sm: 20,\n});\n\n// 弹窗（新增/编辑）\nconst [registerModal, { openModal }] = useModal();\n// 详情弹窗\nconst [registerDetailModal, { openModal: openDetailModal }] = useModal();\n\n// 初始化\nreload();\n\nfunction reload() {\n  const params: any = {\n    pageNo: pageNo.value,\n    pageSize: pageSize.value,\n    column: 'createTime',\n    order: 'desc',\n    ...queryParam,\n  };\n  list(params).then((res) => {\n    if (res.records) {\n      mcpList.value = res.records;\n      total.value = res.total;\n    } else {\n      mcpList.value = [];\n      total.value = 0;\n    }\n  });\n}\n\nfunction handlePageChange(page, current) {\n  pageNo.value = page;\n  pageSize.value = current;\n  reload();\n}\n\nfunction handleAdd() {\n  openModal(true, {});\n}\n\nfunction handleEditClick(item) {\n  // 参考模型列表，仅传 id；如需后端查询可在弹窗内部扩展\n  openModal(true, { id: item.id, ...item });\n}\n\nfunction handleDetailClick(item){\n  // 仅传 id，详情弹窗内部调用 queryById 获取最新数据\n  openDetailModal(true, { id: item.id });\n}\n\nfunction handleDetailEdit(record){\n  // 从详情弹窗内部触发编辑\n  openModal(true, { id: record.id, ...record });\n}\n\nasync function handleDeleteClick(item) {\n  if (mcpList.value.length === 1 && pageNo.value > 1) {\n    pageNo.value = pageNo.value - 1;\n  }\n  await deleteOne({ id: item.id }, reload);\n}\n\nasync function handleSync(item) {\n  await syncMcp(item.id).finally(() => reload());\n}\n\nasync function handleToggleStatus(item) {\n  const newStatus = item.status === 'enable' ? 'disable' : 'enable';\n  await toggleStatus(item.id , newStatus).finally(() => reload());\n}\n\nfunction searchQuery() {\n  pageNo.value = 1;\n  reload();\n}\n\nfunction searchReset() {\n  formRef.value?.resetFields();\n  Object.keys(queryParam).forEach((k) => (queryParam[k] = ''));\n  searchQuery();\n}\n\n// 图标处理（如果 icon 是完整URL则使用，否则可以扩展映射）\nfunction getIcon(icon?: string) {\n  if (!icon) return defaultLogo;\n  return icon.startsWith('http') ? icon : icon; // 可扩展为本地静态资源路径\n}\n\n// 工具数量：从 metadata 中读取 tool_count，可处理对象或 JSON 字符串\nfunction getToolCount(metadata: any): number {\n  if (!metadata) return 0;\n  let metaObj: any = metadata;\n  if (typeof metadata === 'string') {\n    try {\n      metaObj = JSON.parse(metadata);\n    } catch (e) {\n      return 0;\n    }\n  }\n  const count = metaObj.tool_count || metaObj.toolCount || 0;\n  return typeof count === 'number' ? count : parseInt(count, 10) || 0;\n}\n\n// 类型图标映射\nfunction getTypeIcon(type?: string) {\n  switch (type) {\n    case 'sse':\n      return 'ant-design:thunderbolt-outlined';\n    case 'stdio':\n      return 'ant-design:code-outlined';\n    default:\n      return 'ant-design:appstore-outlined';\n  }\n}\n\n// category图标映射\nfunction getCategoryIcon(category?: string) {\n  if (category === 'plugin') {\n    return 'ant-design:api-outlined';\n  }\n  return 'ant-design:tool-twotone';\n}\n\n// 工具管理 - 打开详情页面\nfunction handleToolManage(item: any) {\n  openDetailModal(true, { id: item.id });\n}\n\n// 状态/同步图标\nfunction getStatusIcon(item: any) {\n  if (!item.synced) return 'ant-design:cloud-sync-outlined';\n  return item.status === 'enable' ? 'ant-design:check-circle-outlined' : 'ant-design:stop-outlined';\n}\n\n// <script setup> 下自动暴露到模板, 无需 export\n</script>\n\n<style lang=\"less\" scoped>\n  .mcp {\n    height: calc(100vh - 115px);\n    background: #f7f8fc;\n    padding: 24px;\n    overflow-y: auto;\n    .mcp-row {\n      /* 允许阴影完整显示 */\n      margin-top: 20px;\n      padding-bottom: 12px;\n      overflow: visible;\n        display: flex;\n        flex-wrap: wrap;\n        align-content: flex-start;\n        gap: 20px;\n        :deep(.ant-col) { flex: 0 0 270px; max-width: 270px; }\n        .mcp-card, .add-mcp-card { width: 270px; }\n      .mcp-header {\n        position: relative;\n        font-size: 14px;\n        .header-img {\n          width: 32px;\n          height: 32px;\n          margin-right: 12px;\n        }\n        .header-text {\n          font-size: 16px;\n          font-weight: bold;\n          color: #354052;\n          width: calc(100% - 80px);\n          overflow: hidden;\n          align-content: center;\n          text-overflow: ellipsis;\n          white-space: nowrap;\n        }\n      }\n    }\n  }\n\n  .label {\n    font-weight: 400;\n    font-size: 12px;\n    align-self: center;\n    color: #8a8f98;\n    overflow-wrap: break-word;\n  }\n  .no-activate {\n    font-size: 10px;\n    color: #ff4d4f;\n    border: 1px solid #ff4d4f;\n    border-radius: 10px;\n    padding: 0 6px;\n    height: 14px;\n    line-height: 12px;\n    margin-left: 6px;\n    align-self: center;\n  }\n  .described {\n    font-weight: 400;\n    margin-left: 0;\n    display: -webkit-box;\n    -webkit-line-clamp: 3;\n    -webkit-box-orient: vertical;\n  /* Fallback for supporting browsers */\n  line-clamp: 3;\n    overflow: hidden;\n    font-size: 12px;\n    max-width: 100%;\n    line-height: 18px;\n    color: #848b99;\n  }\n  .status-enable {\n    color: #52c41a;\n  }\n  .status-disable {\n    color: #ff4d4f;\n  }\n  .status-unsynced {\n    color: #fa8c16;\n  }\n  .flex {\n    display: flex;\n  }\n  :deep(.ant-card .ant-card-body) {\n    padding: 16px;\n  }\n  .mr-14 {\n    margin-right: 14px;\n  }\n  .mt-6 {\n    margin-top: 6px;\n  }\n  .ml-4 {\n    margin-left: 4px;\n  }\n  .mcp-btn {\n    position: absolute;\n    right: 4px;\n    top: 6px;\n    height: auto;\n    display: none;\n  }\n  .mcp-card {\n    background: #fcfcfd;\n    border: 1px solid #f0f0f0;\n    box-shadow: 0 2px 4px #e6e6e6;\n    transition: all 0.3s ease;\n    border-radius: 10px;\n    height: 152px;\n    cursor: pointer;\n    position: relative;\n  }\n  .mcp-card:hover {\n    box-shadow: 0 6px 12px #d0d3d8;\n    .mcp-btn {\n      display: flex;\n    }\n  }\n  .tool-count {\n    position: absolute;\n    left: 16px;\n    bottom: 12px;\n    font-size: 12px;\n    color: #4e5969;\n    display: flex;\n    align-items: center;\n    background: rgba(245,246,247,0.9);\n    padding: 2px 8px;\n    border-radius: 12px;\n    line-height: 18px;\n  }\n  .card-footer {\n    position: absolute;\n    left: 16px;\n    bottom: 12px;\n    display: flex;\n    flex-wrap: nowrap;\n    gap: 8px;\n  }\n  .pill {\n    display: inline-flex;\n    align-items: center;\n    padding: 2px 10px 2px 8px;\n    border-radius: 14px;\n    font-size: 12px;\n    line-height: 18px;\n    font-weight: 500;\n    backdrop-filter: saturate(180%) blur(4px);\n    box-shadow: 0 0 0 1px rgba(0,0,0,0.05);\n    .pill-icon { margin-right: 4px; }\n  }\n  .type-pill { background: linear-gradient(135deg,#e6f4ff,#f0f9ff); color:#0958d9; }\n  .status-enable-pill { background: linear-gradient(135deg,#e8f9e9,#f0fff0); color:#2f952f; }\n  .status-disable-pill { background: linear-gradient(135deg,#fff1f0,#ffecec); color:#c43826; }\n  .status-unsynced-pill { background: linear-gradient(135deg,#fff7e6,#fff3d9); color:#d46b08; }\n  .tool-pill { background: linear-gradient(135deg,#f5f6f7,#f0f1f2); color:#555; }\n  .pointer {\n    cursor: pointer;\n  }\n  .list-footer {\n    text-align: right;\n    margin-top: 5px;\n  }\n  .jeecg-basic-table-form-container {\n    padding: 0;\n    :deep(.ant-form) {\n      background-color: transparent;\n    }\n    .table-page-search-submitButtons {\n      display: block;\n      margin-bottom: 24px;\n      white-space: nowrap;\n    }\n  }\n  .add-mcp-card {\n    background: #fcfcfd;\n    border: 1px solid #f0f0f0;\n    box-shadow: 0 2px 4px #e6e6e6;\n    transition: all 0.3s ease;\n    border-radius: 10px;\n    display: inline-flex;\n    justify-content: center;\n    align-items: center;\n    font-size: 16px;\n    cursor: pointer;\n    height: 152px;\n    width: 270px;\n    .add-mcp-card-icon {\n      padding: 8px;\n      color: #1f2329;\n      background-color: #f5f6f7;\n      margin-right: 12px;\n    }\n    .add-mcp-card-title {\n      font-size: 16px;\n      color: #1f2329;\n      font-weight: 400;\n      align-self: center;\n    }\n  }\n  .add-mcp-card:hover {\n    box-shadow: 0 6px 12px #d0d3d8;\n  }\n  .mcp-icon {\n    background-color: unset;\n    border: none;\n    margin-right: 2px;\n  }\n  .mcp-icon:hover {\n    color: #000000;\n    background-color: #e9ecf2;\n    border: none;\n  }\n  .ant-dropdown-link {\n    font-size: 14px;\n    height: 24px;\n    padding: 0 7px;\n    border-radius: 4px;\n    align-content: center;\n    text-align: center;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aimcp/components/AiragMcpAddModal.vue",
    "content": "<template>\n  <BasicModal\n    destroyOnClose\n    @register=\"registerModal\"\n    :canFullscreen=\"false\"\n    width=\"640px\"\n    :title=\"isEdit ? '编辑MCP' : '新增MCP'\"\n    wrapClassName=\"airag-mcp-modal\"\n  >\n    <div class=\"modal\">\n      <div class=\"mcp-content\">\n        <BasicForm @register=\"registerForm\">\n          <!-- category类型选择：单选 -->\n          <template #category=\"{ model, field }\">\n            <a-radio-group v-model:value=\"model[field]\" @change=\"onCategoryChange\" :disabled=\"isEdit\">\n              <a-radio value=\"mcp\">MCP</a-radio>\n              <a-radio value=\"plugin\">插件</a-radio>\n            </a-radio-group>\n          </template>\n          <!-- MCP类型选择 -->\n          <template #type=\"{ model, field }\">\n            <a-select v-model:value=\"model[field]\" @change=\"onTypeChange\" :disabled=\"isEdit\">\n              <a-select-option value=\"sse\">SSE</a-select-option>\n              <a-select-option value=\"stdio\">STDIO</a-select-option>\n              <a-select-option value=\"http\">HTTP</a-select-option>\n            </a-select>\n          </template>\n          <!-- endpoint 根据类型切换 placeholder -->\n          <template #endpoint=\"{ model, field }\">\n            <a-input\n              v-model:value=\"model[field]\"\n              :placeholder=\"endpointPlaceholder\"\n              autocomplete=\"new-password\"\n            />\n          </template>\n          <!-- headers 根据类型切换标签名称与 placeholder -->\n          <template #headers>\n            <!-- 解决浏览抛warning 70+ -->\n            <a-form-item-rest>\n              <div class=\"headers-table-wrapper\">\n                <a-button type=\"primary\" size=\"small\" @click=\"addHeaderRow\" style=\"margin-bottom: 8px;\">\n                  添加\n                </a-button>\n                <div class=\"headers-table-container\">\n                  <a-table\n                    :dataSource=\"headersData\"\n                    :columns=\"headersColumns\"\n                    :pagination=\"false\"\n                    size=\"small\"\n                    bordered\n                  >\n                    <template #bodyCell=\"{ column, record, index }\">\n                      <template v-if=\"column.key === 'key'\">\n                        <a-input v-model:value=\"record.key\" placeholder=\"请输入键\" size=\"small\" />\n                      </template>\n                      <template v-if=\"column.key === 'value'\">\n                        <a-input v-model:value=\"record.value\" placeholder=\"请输入值\" size=\"small\" />\n                      </template>\n                      <template v-if=\"column.key === 'action'\">\n                        <a-button type=\"link\" danger size=\"small\" @click=\"deleteHeaderRow(index)\">删除</a-button>\n                      </template>\n                    </template>\n                  </a-table>\n                </div>\n              </div>\n            </a-form-item-rest>\n          </template>\n          <!-- 授权方式配置（仅插件类型） -->\n          <template #authType=\"{ model, field }\">\n            <a-select v-model:value=\"model[field]\" @change=\"onAuthTypeChange\">\n              <a-select-option value=\"none\">不需要授权</a-select-option>\n              <a-select-option value=\"token\">Token / API Key</a-select-option>\n            </a-select>\n          </template>\n          <!-- Token参数名（仅插件类型且选择Token授权时） -->\n          <template #tokenParamName=\"{ model, field }\">\n            <a-input v-model:value=\"model[field]\" placeholder=\"请输入Token参数名\" />\n          </template>\n          <!-- Token参数值（仅插件类型且选择Token授权时） -->\n          <template #tokenParamValue=\"{ model, field }\">\n            <a-input  autocomplete=\"new-password\" v-model:value=\"model[field]\" type=\"password\" placeholder=\"请输入Token值\" />\n          </template>\n        </BasicForm>\n      </div>\n    </div>\n    <template #footer>\n      <a-button @click=\"close\">关闭</a-button>\n      <a-button type=\"primary\" @click=\"handleSubmit\" :loading=\"submitLoading\">保存</a-button>\n      <a-button v-if=\"categoryValue === 'mcp'\" type=\"primary\" @click=\"handleSubmitAndSync\" :loading=\"submitLoading\">保存并同步</a-button>\n    </template>\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\nimport { ref, computed, nextTick } from 'vue';\nimport { useModalInner } from '/@/components/Modal';\nimport BasicModal from '/@/components/Modal/src/BasicModal.vue';\nimport BasicForm from '/@/components/Form/src/BasicForm.vue';\nimport { useForm } from '/@/components/Form';\nimport { saveOrUpdate, saveAndSync } from '../AiragMcp.api';\nimport { useMessage } from '/@/hooks/web/useMessage';\n\nconst emit = defineEmits(['success', 'register']);\nconst { createMessage } = useMessage();\nconst isEdit = ref(false);\nconst submitLoading = ref(false);\nconst recordId = ref<string | undefined>(undefined);\n\n// category类型（plugin/mcp）\nconst categoryValue = ref('mcp');\n// MCP类型（sse/stdio）\nconst typeValue = ref('sse');\n// 授权方式\nconst authType = ref('none'); // none: 不需要授权, token: Token / API Key\n// Token配置\nconst tokenParamName = ref('X-Access-Token');\nconst tokenParamValue = ref('');\n\nconst endpointPlaceholder = computed(() => {\n  if (categoryValue.value === 'plugin') {\n    return '请输入BaseURL，例如：https://api.example.com（可选，不填使用当前系统地址）';\n  }\n  return typeValue.value === 'sse' || typeValue.value === 'http' ? '请输入服务端点URL，例如：https://example.com/stream' : '请输入启动命令，例如：./start-mcp-service';\n});\n\n// 表格数据\nconst headersData = ref<Array<{ key: string; value: string }>>([]);\n\n// 表格列配置\nconst headersColumns = [\n  { title: '键', dataIndex: 'key', key: 'key', width: '40%' },\n  { title: '值', dataIndex: 'value', key: 'value', width: '45%' },\n  { title: '操作', key: 'action', width: '15%' },\n];\n\n// 添加行\nfunction addHeaderRow() {\n  headersData.value.push({ key: '', value: '' });\n}\n\n// 删除行\nfunction deleteHeaderRow(index: number) {\n  // 如果只剩一行\n  if (headersData.value.length <= 1) {\n    const lastRow = headersData.value[0];\n    // 判断最后一行是否为空\n    if (!lastRow.key && !lastRow.value) {\n      // 如果键和值都是空的，不处理\n      return;\n    } else {\n      // 如果不是空的，清空这一行的键和值\n      lastRow.key = '';\n      lastRow.value = '';\n      createMessage.success('已清空数据');\n      return;\n    }\n  }\n  headersData.value.splice(index, 1);\n}\n\n// 将表格数据转换为JSON字符串格式\nfunction headersDataToString(): string {\n  const filtered = headersData.value.filter(item => item.key && item.value);\n  if (filtered.length === 0) {\n    return '';\n  }\n  const obj = filtered.reduce((acc, item) => {\n    acc[item.key] = item.value;\n    return acc;\n  }, {} as Record<string, string>);\n  return JSON.stringify(obj);\n}\n\n// 将JSON字符串格式转换为表格数据\nfunction stringToHeadersData(str: string | undefined) {\n  if (!str) {\n    // 默认添加一行空数据\n    headersData.value = [{ key: '', value: '' }];\n    return;\n  }\n  try {\n    const obj = JSON.parse(str);\n    const entries = Object.entries(obj);\n    if (entries.length === 0) {\n      // 如果解析后没有数据，默认添加一行空数据\n      headersData.value = [{ key: '', value: '' }];\n    } else {\n      headersData.value = entries.map(([key, value]) => ({\n        key,\n        value: String(value)\n      }));\n    }\n  } catch (e) {\n    // JSON解析失败，默认添加一行空数据\n    console.error('解析headers JSON失败:', e);\n    headersData.value = [{ key: '', value: '' }];\n  }\n}\n\nfunction onAuthTypeChange(val: string) {\n  authType.value = val;\n  updateSchema([\n    { field: 'tokenParamName', required: val === 'token', show: val === 'token' },\n    { field: 'tokenParamValue', required: false, show: val === 'token' },\n  ]);\n}\n\nfunction onCategoryChange(val) {\n  categoryValue.value = val.target.value;\n  if (categoryValue.value === 'plugin') {\n    // 插件类型：显示BaseURL、请求头、授权方式，隐藏MCP类型选择\n    updateSchema([\n      { field: 'category', label: '类型' },\n      { field: 'endpoint', label: 'BaseURL', required: false },\n      { field: 'type', show: false },\n      { field: 'headers', label: '请求头', show: true },\n      { field: 'authType', label: '授权方式', required: true, show: true },\n      { field: 'tokenParamName', label: 'Token参数名', required: authType.value === 'token', show: authType.value === 'token' },\n      { field: 'tokenParamValue', label: 'Token参数值', required: false , show: authType.value === 'token' },\n    ]);\n    // 设置插件类型的默认值\n    setFieldsValue({\n      type: 'api',\n      authType: authType.value || 'none',\n      tokenParamName: tokenParamName.value || 'X-Access-Token',\n    });\n  } else {\n    // MCP类型：显示原有字段\n    updateSchema([\n      { field: 'category', label: '类型' },\n      { field: 'endpoint', label: typeValue.value === 'stdio' ? '命令' : 'URL', required: true },\n      { field: 'type', label: 'MCP类型', show: true },\n      { field: 'headers', label: '请求头', show:() =>typeValue.value !=='stdio'},\n      { field: 'authType', show: false },\n      { field: 'tokenParamName', show: false },\n      { field: 'tokenParamValue', show: false },\n    ]);\n    // 设置MCP类型的默认值\n    setFieldsValue({\n      type: typeValue.value || 'sse',\n      authType: undefined,\n      tokenParamName: undefined,\n      tokenParamValue: undefined,\n    });\n  }\n}\n\n\n// 表单配置\nconst [registerForm, { resetFields, validate, setFieldsValue, updateSchema }] = useForm({\n  showActionButtonGroup: false,\n  layout: 'vertical',\n  baseColProps: { span: 24 },\n  schemas: [\n    { field: 'name', component: 'Input', label: '名称', required: true, componentProps: { placeholder: '请输入名称' } },\n    { field: 'icon', label: '图标', component: 'JImageUpload' },\n    { field: 'category', component: 'RadioGroup', label: '类型', required: true, slot: 'category', defaultValue: 'mcp' },\n    { field: 'type', component: 'Select', label: 'MCP类型', required: true, slot: 'type', defaultValue: 'sse' },\n    { field: 'endpoint', component: 'Input', label: 'URL', required: true, slot: 'endpoint' },\n    { field: 'headers', component: 'InputTextArea', label: '请求头', slot: 'headers', show: false },\n    { field: 'authType', component: 'Select', label: '授权方式', required: true, slot: 'authType', defaultValue: 'none', show: false },\n    { field: 'tokenParamName', component: 'Input', label: 'Token参数名', required: false, slot: 'tokenParamName', defaultValue: 'X-Access-Token', show: false },\n    { field: 'tokenParamValue', component: 'Input', label: 'Token参数值', required: false, slot: 'tokenParamValue', show: false },\n    { field: 'descr', component: 'InputTextArea', label: '描述', componentProps: { rows: 3, placeholder: '请输入描述' } },\n  ]\n});\n\nconst [registerModal, { closeModal }] = useModalInner(async (data) => {\n  await resetFields();\n  submitLoading.value = false;\n  recordId.value = data?.id;\n  if (data && Object.keys(data).length > 0) {\n    // 区分新增/编辑\n    if (data.id) {\n      isEdit.value = true;\n    } else {\n      isEdit.value = false;\n    }\n    // 获取category，默认为mcp\n    const category = data.category || 'mcp';\n    categoryValue.value = category;\n    const t = data.type || 'sse';\n    typeValue.value = t;\n    \n    // 解析授权配置（从headers或metadata中解析）\n    let parsedAuthType = 'none';\n    let parsedTokenParamName = 'X-Access-Token';\n    let parsedTokenParamValue = '';\n    \n    if (category === 'plugin') {\n      // 尝试从metadata中解析授权配置\n      if (data.metadata) {\n        try {\n          const metadata = typeof data.metadata === 'string' ? JSON.parse(data.metadata) : data.metadata;\n          parsedAuthType = metadata.authType || 'none';\n          parsedTokenParamName = metadata.tokenParamName || 'X-Access-Token';\n          parsedTokenParamValue = metadata.tokenParamValue || '';\n        } catch (e) {\n          // 解析失败，使用默认值\n        }\n      }\n      \n      // 从headers中提取token（如果存在）\n      let headersObj: any = {};\n      if (data.headers) {\n        try {\n          headersObj = typeof data.headers === 'string' ? JSON.parse(data.headers) : data.headers;\n          // 如果metadata中有token配置，尝试从headers中提取对应的值\n          if (parsedAuthType === 'token' && parsedTokenParamName && headersObj[parsedTokenParamName]) {\n            parsedTokenParamValue = headersObj[parsedTokenParamName];\n            // 从headers中移除token，避免在表格中显示\n            delete headersObj[parsedTokenParamName];\n          }\n        } catch (e) {\n          // 解析失败\n        }\n      }\n      \n      authType.value = parsedAuthType;\n      tokenParamName.value = parsedTokenParamName;\n      tokenParamValue.value = parsedTokenParamValue;\n      \n      updateSchema([\n        { field: 'category', label: '类型', componentProps: { disabled: true } },\n        { field: 'endpoint', label: 'BaseURL', required: false },\n        { field: 'type', show: false },\n        { field: 'headers', label: '请求头', show: true },\n        { field: 'authType', label: '授权方式', required: true, show: true },\n        { field: 'tokenParamName', label: 'Token参数名', required: parsedAuthType === 'token', show: parsedAuthType === 'token' },\n        { field: 'tokenParamValue', label: 'Token参数值', required: false, show: parsedAuthType === 'token' },\n      ]);\n      // 将处理后的headers（已移除token）转换为表格数据\n      stringToHeadersData(Object.keys(headersObj).length > 0 ? JSON.stringify(headersObj) : '');\n      \n      // 需要在下一个tick设置值，确保updateSchema完成\n      nextTick(() => {\n        setFieldsValue({\n          icon: data.icon,\n          name: data.name,\n          descr: data.descr,\n          category: category,\n          type: t,\n          endpoint: data.endpoint,\n          authType: parsedAuthType,\n          tokenParamName: parsedTokenParamName,\n          tokenParamValue: parsedTokenParamValue,\n        });\n      });\n    } else {\n      updateSchema([\n        { field: 'category', label: '类型', componentProps: { disabled: true } },\n        { field: 'endpoint', label: t === 'stdio' ? '命令' : 'URL', required: true },\n        { field: 'type', label: 'MCP类型', show: true },\n        { field: 'headers', label: '请求头', show:() => t !== 'stdio' },\n        { field: 'authType', show: false },\n        { field: 'tokenParamName', show: false },\n        { field: 'tokenParamValue', show: false },\n      ]);\n      // 将 headers 字符串转换为表格数据\n      stringToHeadersData(data.headers);\n      \n      // 需要在下一个tick设置值，确保updateSchema完成\n      nextTick(() => {\n        setFieldsValue({\n          icon: data.icon,\n          name: data.name,\n          descr: data.descr,\n          category: category,\n          type: t,\n          endpoint: data.endpoint,\n        });\n      });\n    }\n  } else {\n    isEdit.value = false;\n    categoryValue.value = 'mcp';\n    typeValue.value = 'sse';\n    authType.value = 'none';\n    tokenParamName.value = 'X-Access-Token';\n    tokenParamValue.value = '';\n    // 默认添加一行空数据\n    headersData.value = [{ key: '', value: '' }];\n    updateSchema([\n      { field: 'category', label: '类型' },\n      { field: 'endpoint', label: 'URL' },\n      { field: 'headers', label: '请求头', show: true },\n      { field: 'authType', show: false },\n      { field: 'tokenParamName', show: false },\n      { field: 'tokenParamValue', show: false },\n    ]);\n    // 设置默认选中值\n    setFieldsValue({ category: 'mcp', type: 'sse', authType: 'none', tokenParamName: 'X-Access-Token', tokenParamValue: '' });\n  }\n});\n\n/**\n * 类型改变事件\n * @param val\n */\nfunction onTypeChange(val: string){\n  typeValue.value = val;\n  updateSchema([\n    { field: 'endpoint', label: val === 'stdio' ? '命令' : 'URL' },\n    { field: 'headers', label: '请求头', show:() => val !== 'stdio' },\n  ]);\n}\n\nasync function handleSubmit(){\n  try {\n    submitLoading.value = true;\n    const values = await validate();\n    if(recordId.value){\n      values.id = recordId.value;\n    }\n    \n    if (values.category === 'plugin') {\n      // 插件类型：验证授权配置\n      if (values.authType === 'token') {\n        if (!values.tokenParamName) {\n          createMessage.error('Token授权方式需要填写Token参数名和参数值');\n          return;\n        }\n      }\n      \n      // 插件类型：处理headers和授权配置\n      // 合并headers和token配置\n      let headersObj = {};\n      const headersStr = headersDataToString();\n      if (headersStr) {\n        try {\n          headersObj = JSON.parse(headersStr);\n        } catch (e) {\n          headersObj = {};\n        }\n      }\n      \n      // 如果选择了Token授权，添加token到headers\n      if (values.authType === 'token' && values.tokenParamName && values.tokenParamValue) {\n        headersObj[values.tokenParamName] = values.tokenParamValue;\n      }\n      \n      values.headers = Object.keys(headersObj).length > 0 ? JSON.stringify(headersObj) : '';\n      \n      // 将授权配置保存到metadata\n      const metadata: any = {};\n      if (values.metadata) {\n        try {\n          Object.assign(metadata, typeof values.metadata === 'string' ? JSON.parse(values.metadata) : values.metadata);\n        } catch (e) {\n          // 解析失败，使用空对象\n        }\n      }\n      metadata.authType = values.authType || 'none';\n      if (values.authType === 'token') {\n        metadata.tokenParamName = values.tokenParamName || 'X-Access-Token';\n        metadata.tokenParamValue = values.tokenParamValue || '';\n      }\n      values.metadata = JSON.stringify(metadata);\n      \n      values.type = 'api';\n    } else {\n      // MCP类型：将表格数据转换为字符串\n      values.headers = headersDataToString();\n      // 清除授权相关字段\n      delete values.authType;\n      delete values.tokenParamName;\n      delete values.tokenParamValue;\n    }\n    \n    const res = await saveOrUpdate(values);\n    if(res.success){\n      createMessage.success(res.message || '保存成功');\n      emit('success');\n      closeModal();\n    }else{\n      createMessage.error(res.message || '保存失败');\n    }\n  }finally{\n    submitLoading.value = false;\n  }\n}\n\nasync function handleSubmitAndSync(){\n  try {\n    submitLoading.value = true;\n    const values = await validate();\n    if(recordId.value){\n      values.id = recordId.value;\n    }\n    // 将表格数据转换为字符串\n    values.headers = headersDataToString();\n    const res = await saveAndSync(values);\n    if(res.success){\n      createMessage.success(res.message || '保存并同步成功');\n      emit('success');\n      closeModal();\n    }else{\n      createMessage.error(res.message || '保存并同步失败');\n    }\n  }finally{\n    submitLoading.value = false;\n  }\n}\n\nfunction close(){\n  closeModal();\n}\n</script>\n<style scoped lang=\"less\">\n.modal {\n  padding: 5px 16px 8px 16px;\n  .header {\n    padding: 0 0 12px 0;\n    display: flex;\n    justify-content: space-between;\n    .header-title {\n      font-size: 16px;\n      font-weight: bold;\n    }\n  }\n  .mcp-content {\n    :deep(.ant-form-item) { margin-bottom: 8px; }\n    :deep(.ant-input),\n    :deep(.ant-input-number),\n    :deep(.ant-select),\n    :deep(.ant-select-selector),\n    :deep(.ant-textarea),\n    :deep(textarea.ant-input) { width: 100% !important; }\n    :deep(.ant-select-selector){ padding: 0 8px; }\n    \n    .headers-table-wrapper {\n      .headers-table-container {\n        max-height: 200px;\n        overflow-y: auto;\n        border: 1px solid #d9d9d9;\n        border-radius: 2px;\n        \n        :deep(.ant-table) {\n          .ant-table-thead > tr > th {\n            background: #fafafa;\n            padding: 8px;\n          }\n          .ant-table-tbody > tr > td {\n            padding: 4px 8px;\n          }\n        }\n      }\n    }\n  }\n}\n</style>\n<style lang=\"less\">\n.airag-mcp-modal {\n  .jeecg-basic-modal-close > span { margin-left: 0 !important; }\n  .ant-modal {\n    max-height: 85vh;\n    .ant-modal-body {\n      max-height: calc(85vh - 110px);\n      overflow-y: auto;\n    }\n  }\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aimcp/components/AiragMcpDetailModal.vue",
    "content": "<template>\n  <BasicModal\n    destroyOnClose\n    @register=\"registerModal\"\n    :canFullscreen=\"false\"\n    width=\"720px\"\n    wrapClassName=\"airag-mcp-detail-modal\"\n  >\n    <template #title>\n      <div class=\"detail-modal-title\">\n        <span>详情</span>\n        <a-button \n          class=\"detail-edit-btn\" \n          type=\"text\" \n          @click=\"emitEdit\"\n          :title=\"'编辑'\"\n        >\n          <Icon icon=\"ant-design:edit-outlined\" :size=\"18\" />\n        </a-button>\n      </div>\n    </template>\n  <div class=\"detail-modal\" v-loading=\"loading\">\n      <div class=\"detail-header\">\n        <img :src=\"displayIcon\" class=\"detail-icon\" />\n        <div class=\"detail-titles\">\n          <div class=\"detail-name\" :title=\"record?.name\">{{ record?.name || '-' }}</div>\n          <div class=\"detail-type-status\">\n            <a-tag color=\"blue\">{{ record?.category === 'plugin' ? '插件' : (record?.type || '未知类型') }}</a-tag>\n            <a-tag v-if=\"record?.synced\" :color=\"record?.status === 'enable' ? 'green' : 'red'\">\n              {{ record?.status === 'enable' ? '已启用' : '未启用' }}\n            </a-tag>\n            <a-tag v-else color=\"orange\">未同步</a-tag>\n          </div>\n        </div>\n      </div>\n      <div class=\"detail-descr\" :title=\"record?.descr\">{{ record?.descr || '暂无描述' }}</div>\n      <div class=\"tools-wrapper\">\n        <div class=\"tools-header\">\n          <div class=\"tools-title\">工具列表</div>\n          <a-button v-if=\"record?.category === 'plugin'\" type=\"primary\" size=\"small\" @click=\"handleAddTool\">添加工具</a-button>\n        </div>\n        <div class=\"tools-grid\" v-if=\"(pluginTools && pluginTools.length) || (tools && tools.length)\">\n          <!-- 插件类型工具 -->\n          <template v-if=\"record?.category === 'plugin'\">\n            <div\n              v-for=\"tool in pluginTools\"\n              :key=\"tool.name\"\n              class=\"tool-item\"\n              @click=\"handleEditTool(tool)\"\n            >\n              <div class=\"tool-header-item\" @click.stop>\n                <div class=\"tool-name\" :title=\"tool.name\">{{ tool.name }}</div>\n                <div class=\"tool-actions\">\n                  <a-switch \n                    v-model:checked=\"tool.enabled\" \n                    size=\"small\" \n                    @change=\"handleToolEnabledChange(tool)\"\n                    @click.stop\n                  />\n                  <a-button \n                    type=\"text\" \n                    size=\"small\" \n                    @click.stop=\"handleEditTool(tool)\"\n                    :title=\"'编辑工具'\"\n                  >\n                    <Icon icon=\"ant-design:edit-outlined\" :size=\"16\" />\n                  </a-button>\n                  <a-button \n                    type=\"text\" \n                    danger\n                    size=\"small\" \n                    @click.stop=\"handleDeleteTool(tool)\"\n                    :title=\"'删除工具'\"\n                  >\n                    <Icon icon=\"ant-design:delete-outlined\" :size=\"16\" />\n                  </a-button>\n                </div>\n              </div>\n              <div class=\"tool-descr\" :title=\"tool.description\">{{ tool.description || '无描述' }}</div>\n              <div v-if=\"tool.method || tool.path\" class=\"tool-meta\">\n                <a-tag v-if=\"tool.method\" size=\"small\" :color=\"getMethodColor(tool.method)\">{{ tool.method }}</a-tag>\n                <span v-if=\"tool.path\" class=\"tool-path\">{{ tool.path }}</span>\n              </div>\n            </div>\n          </template>\n          <!-- MCP类型工具 -->\n          <template v-else>\n            <div\n              v-for=\"tool in tools\"\n              :key=\"tool.name\"\n              class=\"tool-item\"\n            >\n              <div class=\"tool-header-item\" @click.stop>\n                <div class=\"tool-name\" :title=\"tool.name\">{{ tool.name }}</div>\n              </div>\n              <div class=\"tool-descr\" :title=\"tool.descr\">{{ tool.descr || '无描述' }}</div>\n            </div>\n          </template>\n        </div>\n        <a-empty v-else description=\"暂无工具\" />\n      </div>\n    </div>\n    <template #footer>\n      <a-button @click=\"closeModal()\">关闭</a-button>\n    </template>\n  </BasicModal>\n  <!-- 工具编辑弹窗 -->\n  <PluginToolEditModal @register=\"registerToolEditModal\" @success=\"handleToolEditSuccess\" />\n</template>\n<script lang=\"ts\" setup>\nimport { ref, computed } from 'vue';\nimport { useModalInner, useModal } from '/@/components/Modal';\nimport BasicModal from '/@/components/Modal/src/BasicModal.vue';\nimport { useMessage } from '/@/hooks/web/useMessage';\nimport { Modal } from 'ant-design-vue';\nimport { queryById } from '../AiragMcp.api';\nimport defaultLogo from '../imgs/mcpLogo.png';\nimport PluginToolEditModal from './PluginToolEditModal.vue';\n\nconst { createMessage } = useMessage();\n\ninterface McpToolItem {\n  name: string;\n  descr?: string;\n  enabled?: boolean;\n}\n\ninterface PluginToolItem {\n  name: string;\n  description?: string;\n  path?: string;\n  method?: string;\n  parameters?: any[];\n  responses?: any[];\n  enabled?: boolean;\n}\n\ninterface McpRecord {\n  id?: string;\n  name?: string;\n  descr?: string;\n  icon?: string;\n  type?: string;\n  category?: string;\n  status?: string;\n  synced?: boolean;\n  tools?: McpToolItem[] | string;\n  endpoint?: string;\n  headers?: string;\n  metadata?: string | any;\n}\n\nconst emit = defineEmits(['register','edit', 'success']);\nconst record = ref<McpRecord | null>(null);\nconst tools = ref<McpToolItem[]>([]);\nconst pluginTools = ref<PluginToolItem[]>([]);\nconst loading = ref<boolean>(false);\n\n// 工具编辑弹窗\nconst [registerToolEditModal, { openModal: openToolEditModal }] = useModal();\n\nconst displayIcon = computed(() => {\n  const icon = record.value?.icon;\n  if (!icon) return defaultLogo;\n  return icon.startsWith('http') ? icon : icon;\n});\n\nconst [registerModal, { closeModal }] = useModalInner(async (data: McpRecord) => {\n  if(!data?.id){\n    record.value = { ...data };\n    // 根据category初始化工具列表\n    if (data.category === 'plugin') {\n      try {\n        const toolsData = typeof data.tools === 'string' ? JSON.parse(data.tools) : data.tools;\n        pluginTools.value = Array.isArray(toolsData) ? toolsData : [];\n      } catch (e) {\n        pluginTools.value = [];\n      }\n      tools.value = [];\n    } else {\n      tools.value = Array.isArray(data.tools) ? data.tools : [];\n      pluginTools.value = [];\n    }\n    return;\n  }\n  loading.value = true;\n  try {\n    const res = await queryById(data.id);\n    // 后端返回结构直接使用 res.result 或 res depending on transform; 假设统一为 res.result\n    const detail = res.result || res; // 兼容不同返回包装\n    record.value = {\n      id: detail.id,\n      name: detail.name,\n      descr: detail.descr,\n      icon: detail.icon,\n      type: detail.type,\n      category: detail.category,\n      status: detail.status,\n      synced: !!detail.synced,\n      endpoint: detail.endpoint,\n      headers: detail.headers,\n      metadata: detail.metadata,\n    };\n    \n    // 根据category解析工具\n    if (detail.category === 'plugin') {\n      // 插件类型：解析tools字段为插件工具列表\n      let parsedPluginTools: PluginToolItem[] = [];\n      const rawTools = detail.tools;\n      if (rawTools) {\n        try {\n          if (typeof rawTools === 'string') {\n            parsedPluginTools = JSON.parse(rawTools);\n          } else if (Array.isArray(rawTools)) {\n            parsedPluginTools = rawTools;\n          }\n        } catch (e) {\n          parsedPluginTools = [];\n        }\n      }\n      // 确保每个工具都有enabled字段，默认为true\n      pluginTools.value = parsedPluginTools.map((t: any) => ({\n        ...t,\n        enabled: t.enabled !== undefined ? t.enabled : true\n      }));\n      tools.value = [];\n    } else {\n      // MCP类型：解析tools字段为MCP工具列表\n      let parsedTools: McpToolItem[] = [];\n      const rawTools = detail.tools;\n      if (rawTools) {\n        try {\n          if (typeof rawTools === 'string') {\n            const arr = JSON.parse(rawTools);\n            parsedTools = arr.map((t: any) => ({ \n              name: t.name, \n              descr: t.description,\n              enabled: t.enabled !== undefined ? t.enabled : true\n            }));\n          } else if (Array.isArray(rawTools)) {\n            parsedTools = rawTools.map((t: any) => ({ \n              name: t.name, \n              descr: t.description,\n              enabled: t.enabled !== undefined ? t.enabled : true\n            }));\n          }\n        } catch (e) {\n          parsedTools = [];\n        }\n      }\n      tools.value = parsedTools;\n      pluginTools.value = [];\n    }\n  } finally {\n    loading.value = false;\n  }\n});\n\n\nfunction handleAddTool() {\n  openToolEditModal(true, {\n    pluginId: record.value?.id,\n    plugin: record.value,\n    tool: null, // 新增\n  });\n}\n\nfunction handleEditTool(tool: PluginToolItem) {\n  openToolEditModal(true, {\n    pluginId: record.value?.id,\n    plugin: record.value,\n    tool: tool,\n  });\n}\n\nfunction getMethodColor(method: string): string {\n  const colorMap: Record<string, string> = {\n    'GET': 'blue',\n    'POST': 'green',\n    'PUT': 'orange',\n    'DELETE': 'red',\n    'PATCH': 'purple',\n  };\n  return colorMap[method] || 'default';\n}\n\nasync function handleToolEnabledChange(tool: PluginToolItem) {\n  // 更新工具启用状态\n  if (!record.value?.id) return;\n  \n  try {\n    const res = await queryById(record.value.id);\n    const detail = res.result || res;\n    let tools: any[] = [];\n    if (detail.tools) {\n      try {\n        tools = typeof detail.tools === 'string' ? JSON.parse(detail.tools) : detail.tools;\n      } catch (e) {\n        tools = [];\n      }\n    }\n    const index = tools.findIndex((t: any) => t.name === tool.name);\n    if (index >= 0) {\n      tools[index].enabled = tool.enabled;\n      const { saveTools } = await import('../AiragMcp.api');\n      await saveTools(record.value.id, JSON.stringify(tools));\n    }\n  } catch (e) {\n    console.error('更新工具启用状态失败:', e);\n    // 恢复状态\n    tool.enabled = !tool.enabled;\n  }\n}\n\nfunction handleDeleteTool(tool: PluginToolItem) {\n  // 删除工具前进行二次确认\n  Modal.confirm({\n    title: '确认删除',\n    content: `确定要删除工具\"${tool.name}\"吗？此操作不可恢复。`,\n    okText: '确定',\n    okType: 'danger',\n    cancelText: '取消',\n    onOk: async () => {\n      if (!record.value?.id) {\n        createMessage.error('插件ID不存在');\n        return;\n      }\n      \n      try {\n        // 获取最新的工具列表\n        const res = await queryById(record.value.id);\n        const detail = res.result || res;\n        let tools: any[] = [];\n        if (detail.tools) {\n          try {\n            tools = typeof detail.tools === 'string' ? JSON.parse(detail.tools) : detail.tools;\n          } catch (e) {\n            tools = [];\n          }\n        }\n        \n        // 从工具列表中移除该工具\n        const filteredTools = tools.filter((t: any) => t.name !== tool.name);\n        \n        if (filteredTools.length === tools.length) {\n          createMessage.warning('未找到要删除的工具');\n          return;\n        }\n        \n        // 保存更新后的工具列表\n        const { saveTools } = await import('../AiragMcp.api');\n        const saveRes = await saveTools(record.value.id, JSON.stringify(filteredTools));\n        \n        if (saveRes.success) {\n          createMessage.success('删除成功');\n          // 更新前端显示\n          pluginTools.value = pluginTools.value.filter((t: any) => t.name !== tool.name);\n          // 触发成功事件，通知父组件刷新\n          emit('success');\n        } else {\n          createMessage.error(saveRes.message || '删除失败');\n        }\n      } catch (e) {\n        console.error('删除工具失败:', e);\n        createMessage.error('删除工具失败');\n      }\n    },\n  });\n}\n\nfunction emitEdit() {\n  // 触发编辑事件，传递record给父组件\n  if (record.value) {\n    emit('edit', record.value);\n    closeModal();\n  }\n}\n\nfunction handleToolEditSuccess() {\n  // 重新加载详情数据\n  if (record.value?.id) {\n    loading.value = true;\n    queryById(record.value.id).then((res: any) => {\n      const detail = res.result || res;\n      \n      // 更新record信息\n      record.value = {\n        id: detail.id,\n        name: detail.name,\n        descr: detail.descr,\n        icon: detail.icon,\n        type: detail.type,\n        category: detail.category,\n        status: detail.status,\n        synced: !!detail.synced,\n        endpoint: detail.endpoint,\n        headers: detail.headers,\n        metadata: detail.metadata,\n      };\n      \n      // 根据category解析工具\n      if (detail.category === 'plugin') {\n        // 插件类型：解析tools字段为插件工具列表\n        let parsedPluginTools: PluginToolItem[] = [];\n        const rawTools = detail.tools;\n        if (rawTools) {\n          try {\n            if (typeof rawTools === 'string') {\n              parsedPluginTools = JSON.parse(rawTools);\n            } else if (Array.isArray(rawTools)) {\n              parsedPluginTools = rawTools;\n            }\n          } catch (e) {\n            parsedPluginTools = [];\n          }\n        }\n        pluginTools.value = parsedPluginTools.map((t: any) => ({\n          ...t,\n          enabled: t.enabled !== undefined ? t.enabled : true\n        }));\n        tools.value = [];\n      } else {\n        // MCP类型：解析tools字段为MCP工具列表\n        let parsedTools: McpToolItem[] = [];\n        const rawTools = detail.tools;\n        if (rawTools) {\n          try {\n            if (typeof rawTools === 'string') {\n              const arr = JSON.parse(rawTools);\n              parsedTools = arr.map((t: any) => ({ name: t.name, descr: t.description }));\n            } else if (Array.isArray(rawTools)) {\n              parsedTools = rawTools.map((t: any) => ({ name: t.name, descr: t.description }));\n            }\n          } catch (e) {\n            parsedTools = [];\n          }\n        }\n        tools.value = parsedTools;\n        pluginTools.value = [];\n      }\n      loading.value = false;\n      // 触发success事件，通知列表页刷新\n      emit('success');\n    }).catch(() => {\n      loading.value = false;\n    });\n  }\n}\n</script>\n<style scoped lang=\"less\">\n.detail-modal {\n  padding: 12px 16px 8px 16px;\n  max-height: 520px;\n  overflow-y: auto;\n  .detail-header {\n    display: flex;\n    align-items: center;\n    .detail-icon {\n      width: 56px;\n      height: 56px;\n      border-radius: 8px;\n      margin-right: 16px;\n      background: #f5f6f7;\n      object-fit: cover;\n    }\n    .detail-titles {\n      flex: 1;\n      min-width: 0;\n      .detail-name {\n        font-size: 20px;\n        font-weight: 600;\n        color: #1f2329;\n        line-height: 28px;\n        max-width: 480px;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n      }\n      .detail-type-status { margin-top: 4px; }\n    }\n  }\n  .detail-descr {\n    margin-top: 12px;\n    font-size: 13px;\n    line-height: 20px;\n    color: #4e5969;\n    background: #f5f6f7;\n    padding: 8px 12px;\n    border-radius: 6px;\n    max-height: 80px;\n    overflow-y: auto;\n  }\n  .tools-wrapper {\n    margin-top: 16px;\n    .tools-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 12px;\n    }\n    .tools-title {\n      font-size: 16px;\n      font-weight: 600;\n    }\n    .tools-grid {\n      display: grid;\n      grid-template-columns: repeat(2, 1fr);\n      gap: 12px;\n      max-height: 280px;\n      overflow-y: auto;\n      padding-right: 4px;\n    }\n    .tool-item {\n      border: 1px solid #e5e6eb;\n      border-radius: 8px;\n      background: #fff;\n      padding: 10px 12px;\n      min-height: 88px;\n      display: flex;\n      flex-direction: column;\n      transition: box-shadow 0.25s;\n      cursor: default;\n      &:hover { box-shadow: 0 4px 10px rgba(0,0,0,0.08); }\n      &.tool-item-plugin {\n        cursor: pointer;\n      }\n      .tool-header-item {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        margin-bottom: 6px;\n        .tool-actions {\n          display: flex;\n          align-items: center;\n          gap: 8px;\n          \n          .ant-btn-text {\n            padding: 0;\n            height: 24px;\n            width: 24px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            \n            &:hover {\n              background-color: rgba(255, 77, 79, 0.1);\n            }\n          }\n        }\n      }\n      .tool-name {\n        font-size: 14px;\n        font-weight: 600;\n        color: #1d2129;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        flex: 1;\n      }\n      .tool-descr {\n        font-size: 12px;\n        color: #4e5969;\n        line-height: 18px;\n        flex: 1;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        margin-bottom: 8px;\n      }\n      .tool-meta {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        margin-top: auto;\n        .tool-path {\n          font-size: 12px;\n          color: #86909c;\n          overflow: hidden;\n          text-overflow: ellipsis;\n          white-space: nowrap;\n        }\n      }\n    }\n  }\n}\n\n.detail-modal-title {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  width: 100%;\n  padding-right: 40px;\n  \n  .detail-edit-btn {\n    padding: 4px 8px;\n    &:hover {\n      color: #1890ff;\n      background-color: rgba(24, 144, 255, 0.1);\n    }\n  }\n}\n</style>\n<style lang=\"less\">\n.airag-mcp-detail-modal { \n  .jeecg-basic-modal-close > span { margin-left: 0 !important; }\n  \n  :deep(.ant-modal-header) {\n    padding: 16px 24px;\n  }\n  \n  :deep(.ant-modal-title) {\n    width: 100%;\n  }\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aimcp/components/PluginToolEditModal.vue",
    "content": "<template>\n  <BasicModal\n    destroyOnClose\n    @register=\"registerModal\"\n    :canFullscreen=\"false\"\n    width=\"1400px\"\n    :title=\"isEdit ? '编辑工具' : '新增工具'\"\n    wrapClassName=\"plugin-tool-edit-modal\"\n  >\n    <div class=\"modal\">\n      <div class=\"tool-edit-content\">\n        <!-- 基本信息 -->\n        <div class=\"section\">\n          <h3 class=\"section-title\">基本信息</h3>\n          <a-form :model=\"toolForm\" layout=\"vertical\">\n            <a-row :gutter=\"24\">\n              <a-col :span=\"12\">\n                <a-form-item label=\"工具名称\" required>\n                  <a-input v-model:value=\"toolForm.name\" placeholder=\"请输入工具名称\" />\n                </a-form-item>\n              </a-col>\n              <a-col :span=\"12\">\n                <a-form-item label=\"请求方式\" required>\n                  <a-select v-model:value=\"toolForm.method\" placeholder=\"请选择请求方式\">\n                    <a-select-option value=\"GET\">GET</a-select-option>\n                    <a-select-option value=\"POST\">POST</a-select-option>\n                    <a-select-option value=\"PUT\">PUT</a-select-option>\n                    <a-select-option value=\"DELETE\">DELETE</a-select-option>\n                    <a-select-option value=\"PATCH\">PATCH</a-select-option>\n                  </a-select>\n                </a-form-item>\n              </a-col>\n            </a-row>\n            <a-row :gutter=\"24\">\n              <a-col :span=\"24\">\n                <a-form-item label=\"访问路径\" required>\n                  <a-input v-model:value=\"toolForm.path\" placeholder=\"请输入访问路径，如：/api/user/{userId}\" @blur=\"normalizePath\" />\n                </a-form-item>\n              </a-col>\n            </a-row>\n            <a-row :gutter=\"24\">\n              <a-col :span=\"24\">\n                <a-form-item label=\"描述\" required>\n                  <a-textarea v-model:value=\"toolForm.description\" :rows=\"3\" placeholder=\"请输入工具描述\" />\n                </a-form-item>\n              </a-col>\n            </a-row>\n          </a-form>\n        </div>\n\n        <!-- 请求参数 -->\n        <div class=\"section\">\n          <div class=\"section-header\">\n            <h3 class=\"section-title\">请求参数</h3>\n            <a-button type=\"primary\" size=\"small\" @click=\"handleAddRequestParam\">添加参数</a-button>\n          </div>\n          <a-table\n            :dataSource=\"requestParams\"\n            :columns=\"requestParamsColumns\"\n            :pagination=\"false\"\n            bordered\n            size=\"small\"\n            rowKey=\"tempId\"\n          >\n            <template #bodyCell=\"{ column, record, index }\">\n              <template v-if=\"column.key === 'name'\">\n                <a-input\n                  v-model:value=\"record.name\"\n                  placeholder=\"参数名称（字母数字下划线）\"\n                  @blur=\"validateParamName(record)\"\n                />\n              </template>\n              <template v-else-if=\"column.key === 'description'\">\n                <a-input v-model:value=\"record.description\" placeholder=\"参数描述\" />\n              </template>\n              <template v-else-if=\"column.key === 'type'\">\n                <a-select v-model:value=\"record.type\" style=\"width: 100%\">\n                  <a-select-option value=\"String\">String</a-select-option>\n                  <a-select-option value=\"Number\">Number</a-select-option>\n                  <a-select-option value=\"Integer\">Integer</a-select-option>\n                  <a-select-option value=\"Boolean\">Boolean</a-select-option>\n                </a-select>\n              </template>\n              <template v-else-if=\"column.key === 'location'\">\n                <a-select v-model:value=\"record.location\" style=\"width: 100%\" @change=\"onLocationChange(record)\">\n                  <a-select-option value=\"Body\">Raw(json)</a-select-option>\n                  <a-select-option value=\"Form-Data\">Form-Data</a-select-option>\n                  <a-select-option value=\"Query\">Query</a-select-option>\n                  <a-select-option value=\"Header\">Header</a-select-option>\n                  <a-select-option value=\"Path\">Path</a-select-option>\n                </a-select>\n              </template>\n              <template v-else-if=\"column.key === 'required'\">\n                <a-checkbox v-model:checked=\"record.required\" />\n              </template>\n              <template v-else-if=\"column.key === 'defaultValue'\">\n                <a-input v-model:value=\"record.defaultValue\" placeholder=\"默认值\" />\n              </template>\n              <template v-else-if=\"column.key === 'action'\">\n                <a-button type=\"link\" danger size=\"small\" @click=\"handleDeleteRequestParam(index)\">删除</a-button>\n              </template>\n            </template>\n          </a-table>\n        </div>\n\n        <!-- 输出参数 -->\n        <div class=\"section\">\n          <div class=\"section-header\">\n            <h3 class=\"section-title\">输出参数</h3>\n            <a-button type=\"primary\" size=\"small\" @click=\"handleAddResponseParam\">添加参数</a-button>\n          </div>\n          <a-table\n            :dataSource=\"responseParams\"\n            :columns=\"responseParamsColumns\"\n            :pagination=\"false\"\n            bordered\n            size=\"small\"\n            rowKey=\"tempId\"\n          >\n            <template #bodyCell=\"{ column, record, index }\">\n              <template v-if=\"column.key === 'name'\">\n                <a-input\n                  v-model:value=\"record.name\"\n                  placeholder=\"参数名称（支持点号和数组语法，如data.name、data[].name）\"\n                  @blur=\"validateResponseParamName(record)\"\n                />\n              </template>\n              <template v-else-if=\"column.key === 'description'\">\n                <a-input v-model:value=\"record.description\" placeholder=\"参数描述\" />\n              </template>\n              <template v-else-if=\"column.key === 'type'\">\n                <a-select v-model:value=\"record.type\" style=\"width: 100%\" @change=\"onResponseTypeChange(record)\">\n                  <a-select-option value=\"String\">String</a-select-option>\n                  <a-select-option value=\"Number\">Number</a-select-option>\n                  <a-select-option value=\"Integer\">Integer</a-select-option>\n                  <a-select-option value=\"Boolean\">Boolean</a-select-option>\n                  <a-select-option value=\"Object\">Object</a-select-option>\n                  <a-select-option value=\"Array\">Array</a-select-option>\n                </a-select>\n              </template>\n              <template v-else-if=\"column.key === 'action'\">\n                <a-button type=\"link\" danger size=\"small\" @click=\"handleDeleteResponseParam(index)\">删除</a-button>\n              </template>\n            </template>\n          </a-table>\n        </div>\n      </div>\n    </div>\n    <template #footer>\n      <a-button @click=\"close\">关闭</a-button>\n      <a-button type=\"primary\" @click=\"handleSave\" :loading=\"submitLoading\">保存</a-button>\n    </template>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, reactive } from 'vue';\nimport { useModalInner } from '/@/components/Modal';\nimport BasicModal from '/@/components/Modal/src/BasicModal.vue';\nimport { useMessage } from '/@/hooks/web/useMessage';\nimport { queryById, saveTools } from '../AiragMcp.api';\n\nconst emit = defineEmits(['success', 'register']);\nconst { createMessage } = useMessage();\nconst submitLoading = ref(false);\nconst pluginId = ref<string | undefined>(undefined);\nconst isEdit = ref(false);\nconst toolIndex = ref<number>(-1); // 编辑时工具在数组中的索引\n\n// 工具表单\nconst toolForm = reactive({\n  name: '',\n  description: '',\n  path: '',\n  method: 'GET',\n});\n\n// 请求参数列表\nconst requestParams = ref<any[]>([]);\n// 输出参数列表\nconst responseParams = ref<any[]>([]);\n\n// 请求参数表格列\nconst requestParamsColumns = [\n  { title: '参数名称', key: 'name', width: 150 },\n  { title: '参数描述', key: 'description', width: 200 },\n  { title: '参数类型', key: 'type', width: 120 },\n  { title: '传入方式', key: 'location', width: 150 },\n  { title: '是否必须', key: 'required', width: 100 },\n  { title: '默认值', key: 'defaultValue', width: 150 },\n  { title: '操作', key: 'action', width: 100 },\n];\n\n// 输出参数表格列\nconst responseParamsColumns = [\n  { title: '参数名称', key: 'name', width: 200 },\n  { title: '参数描述', key: 'description', width: 200 },\n  { title: '参数类型', key: 'type', width: 150 },\n  { title: '操作', key: 'action', width: 100 },\n];\n\nlet tempIdCounter = 0;\n\nconst [registerModal, { closeModal }] = useModalInner(async (data) => {\n  pluginId.value = data?.pluginId;\n  isEdit.value = !!data?.tool;\n  \n  // 重置表单\n  toolForm.name = '';\n  toolForm.description = '';\n  toolForm.path = '';\n  toolForm.method = 'GET';\n  requestParams.value = [];\n  responseParams.value = [];\n  toolIndex.value = -1;\n  \n  if (data?.tool) {\n    // 编辑模式：填充数据\n    toolForm.name = data.tool.name || '';\n    toolForm.description = data.tool.description || '';\n    toolForm.path = data.tool.path || '';\n    toolForm.method = data.tool.method || 'GET';\n    \n    requestParams.value = (data.tool.parameters || []).map((p: any) => ({\n      ...p,\n      tempId: `req_${tempIdCounter++}`,\n      required: p.required !== undefined ? p.required : false,\n    }));\n    \n    responseParams.value = (data.tool.responses || []).map((r: any) => ({\n      ...r,\n      tempId: `resp_${tempIdCounter++}`,\n    }));\n    \n    // 查找工具在列表中的索引\n    if (pluginId.value) {\n      const res = await queryById(pluginId.value);\n      const detail = res.result || res;\n      if (detail.tools) {\n        try {\n          const tools = typeof detail.tools === 'string' ? JSON.parse(detail.tools) : detail.tools;\n          toolIndex.value = tools.findIndex((t: any) => t.name === data.tool.name);\n        } catch (e) {\n          toolIndex.value = -1;\n        }\n      }\n    }\n  }\n});\n\nfunction validateParamName(record: any) {\n  // 验证参数名称：只允许字母数字下划线\n  if (record.name && !/^[a-zA-Z0-9_]+$/.test(record.name)) {\n    createMessage.warning('参数名称只能包含字母、数字和下划线');\n    record.name = record.name.replace(/[^a-zA-Z0-9_]/g, '');\n  }\n}\n\nfunction validateResponseParamName(record: any) {\n  // 验证输出参数名称：支持字母、数字、下划线、点、中括号\n  // 只有Object和Array类型可以使用点号和中括号\n  if (!record.name) return;\n  \n  const type = record.type;\n  const name = record.name;\n  \n  if (type === 'Object' || type === 'Array') {\n    // Object和Array类型：支持字母、数字、下划线、点、中括号\n    // 例如：data.name, data[String], data[].name\n    if (!/^[a-zA-Z0-9_.\\[\\]]+$/.test(name)) {\n      createMessage.warning('参数名称只能包含字母、数字、下划线、点和中括号');\n      record.name = name.replace(/[^a-zA-Z0-9_.\\[\\]]/g, '');\n    }\n  } else {\n    // 其他类型：只允许字母数字下划线\n    if (!/^[a-zA-Z0-9_]+$/.test(name)) {\n      createMessage.warning('非Object/Array类型参数名称只能包含字母、数字和下划线');\n      record.name = name.replace(/[^a-zA-Z0-9_]/g, '');\n    }\n  }\n}\n\nfunction onResponseTypeChange(record: any) {\n  // 当类型改变时，如果类型不是Object或Array，清除点号和中括号\n  if (record.type !== 'Object' && record.type !== 'Array') {\n    if (record.name && /[.\\[\\]]/.test(record.name)) {\n      createMessage.warning('非Object/Array类型不支持使用点号和中括号');\n      record.name = record.name.replace(/[.\\[\\]]/g, '');\n    }\n  }\n}\n\nfunction onLocationChange(record: any) {\n  // Body和Form-Data可以同时存在，不再警告\n  // 同时存在时，后端默认使用Body\n}\n\nfunction handleAddRequestParam() {\n  requestParams.value.push({\n    tempId: `req_${tempIdCounter++}`,\n    name: '',\n    description: '',\n    type: 'String',\n    location: 'Body',\n    required: false,\n    defaultValue: '',\n  });\n}\n\nfunction handleDeleteRequestParam(index: number) {\n  requestParams.value.splice(index, 1);\n}\n\nfunction handleAddResponseParam() {\n  responseParams.value.push({\n    tempId: `resp_${tempIdCounter++}`,\n    name: '',\n    description: '',\n    type: 'String',\n  });\n}\n\nfunction handleDeleteResponseParam(index: number) {\n  responseParams.value.splice(index, 1);\n}\n\nasync function handleSave() {\n  try {\n    submitLoading.value = true;\n    \n    // 验证基本字段\n    if (!toolForm.name || !toolForm.description || !toolForm.path || !toolForm.method) {\n      createMessage.warning('请填写完整的工具基本信息');\n      return;\n    }\n\n    // 校验 name 正则 ^[a-zA-Z0-9_-]+$\n    if (!/^[a-zA-Z0-9_-]+$/.test(toolForm.name)) {\n      createMessage.warning('工具名称只能包含字母、数字、下划线和中划线');\n      return;\n    }\n\n    // Body和Form-Data可以同时存在，后端会默认使用Body\n    \n    if (!pluginId.value) {\n      createMessage.error('插件ID不存在');\n      return;\n    }\n    \n    // 加载插件数据\n    const res = await queryById(pluginId.value);\n    const detail = res.result || res;\n    \n    // 解析现有工具列表\n    let tools: any[] = [];\n    if (detail.tools) {\n      try {\n        const parsedTools = typeof detail.tools === 'string' ? JSON.parse(detail.tools) : detail.tools;\n        // 确保是数组\n        if (Array.isArray(parsedTools)) {\n          tools = [...parsedTools]; // 复制数组，避免引用问题\n        } else {\n          tools = [];\n        }\n      } catch (e) {\n        console.error('解析工具列表失败:', e);\n        tools = [];\n      }\n    }\n    \n    // 确保tools是数组\n    if (!Array.isArray(tools)) {\n      tools = [];\n    }\n    \n    // 构建当前工具数据（移除tempId）\n    const parameters = requestParams.value.map(p => {\n      const { tempId: _tempId, ...param } = p;\n      return param;\n    });\n    const responses = responseParams.value.map(r => {\n      const { tempId: _tempId, ...resp } = r;\n      return resp;\n    });\n    \n    const toolData = {\n      name: toolForm.name,\n      description: toolForm.description,\n      path: toolForm.path,\n      method: toolForm.method,\n      enabled: true, // 默认启用\n      parameters,\n      responses,\n    };\n    \n    // 根据编辑状态处理工具\n    if (isEdit.value && toolIndex.value >= 0 && toolIndex.value < tools.length) {\n      // 编辑模式：更新现有工具\n      tools[toolIndex.value] = toolData;\n    } else {\n      // 新增模式：添加新工具\n      // 检查工具名称是否已存在\n      const nameExists = tools.some((t: any) => t.name === toolForm.name);\n      if (nameExists) {\n        createMessage.error('工具名称已存在，请使用不同的名称');\n        return;\n      }\n      tools.push(toolData);\n    }\n    \n    // 构建工具列表JSON字符串\n    const toolsJson = JSON.stringify(tools);\n    \n    // 调用保存工具接口\n    const saveRes = await saveTools(pluginId.value, toolsJson);\n    if (saveRes.success) {\n      createMessage.success('保存成功');\n      emit('success');\n      closeModal();\n    } else {\n      createMessage.error(saveRes.message || '保存失败');\n    }\n  } finally {\n    submitLoading.value = false;\n  }\n}\n\nfunction close() {\n  closeModal();\n}\n\n// 规范化路径：确保以/开头\nfunction normalizePath() {\n  if (toolForm.path && !toolForm.path.startsWith('/')) {\n    toolForm.path = '/' + toolForm.path;\n  }\n}\n</script>\n\n<style scoped lang=\"less\">\n.modal {\n  padding: 16px;\n  .tool-edit-content {\n    .section {\n      margin-bottom: 24px;\n      .section-header {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        margin-bottom: 12px;\n      }\n      .section-title {\n        margin: 0;\n        font-size: 16px;\n        font-weight: bold;\n      }\n      :deep(.ant-table) {\n        .ant-table-thead > tr > th {\n          background: #fafafa;\n          padding: 8px;\n        }\n        .ant-table-tbody > tr > td {\n          padding: 8px;\n        }\n      }\n    }\n  }\n}\n</style>\n\n<style lang=\"less\">\n.plugin-tool-edit-modal {\n  .jeecg-basic-modal-close > span { margin-left: 0 !important; }\n  .ant-modal {\n    max-height: 90vh;\n    .ant-modal-body {\n      max-height: calc(90vh - 110px);\n      overflow-y: auto;\n    }\n  }\n}\n</style>\n\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aimodel/AiModelList.vue",
    "content": "<template>\n  <div class=\"model\">\n    <!--查询区域-->\n    <div class=\"jeecg-basic-table-form-container\">\n      <a-form ref=\"formRef\" @keyup.enter.native=\"searchQuery\" :model=\"queryParam\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\" style=\"background-color: #f7f8fc !important;\">\n        <a-row :gutter=\"24\">\n          <a-col :lg=\"6\">\n            <a-form-item name=\"name\" label=\"模板名称\">\n              <JInput v-model:value=\"queryParam.name\" />\n            </a-form-item>\n          </a-col>\n          <a-col :lg=\"6\">\n            <a-form-item name=\"modelType\" label=\"模板类型\">\n              <JDictSelectTag v-model:value=\"queryParam.modelType\" dict-code=\"model_type\" />\n            </a-form-item>\n          </a-col>\n          <a-col :xl=\"6\" :lg=\"7\" :md=\"8\" :sm=\"24\">\n            <span style=\"float: left; overflow: hidden\" class=\"table-page-search-submitButtons\">\n              <a-col :lg=\"6\">\n                <a-button type=\"primary\" preIcon=\"ant-design:search-outlined\" @click=\"searchQuery\">查询</a-button>\n                <a-button type=\"primary\" preIcon=\"ant-design:reload-outlined\" @click=\"searchReset\" style=\"margin-left: 8px\">重置</a-button>\n              </a-col>\n            </span>\n          </a-col>\n        </a-row>\n      </a-form>\n    </div>\n    <a-row :span=\"24\" class=\"model-row\">\n      <a-col :xxl=\"4\" :xl=\"6\" :lg=\"6\" :md=\"6\" :sm=\"12\" :xs=\"24\">\n        <a-card class=\"add-knowledge-card\" @click=\"handleAdd\">\n          <div class=\"flex\">\n            <Icon icon=\"ant-design:plus-outlined\" class=\"add-knowledge-card-icon\" size=\"20\"></Icon>\n            <span class=\"add-knowledge-card-title\">添加模型</span>\n          </div>\n        </a-card>\n      </a-col>\n      <a-col :xxl=\"4\" :xl=\"6\" :lg=\"6\" :md=\"6\" :sm=\"12\" :xs=\"24\" v-for=\"item in modalList\" v-if=\"modalList && modalList.length>0\">\n        <a-card class=\"model-card\" @click=\"handleEditClick(item)\">\n          <div class=\"model-header\">\n            <div class=\"flex\">\n              <img :src=\"getImage(item.provider)\" class=\"header-img\" />\n              <div class=\"header-text\">{{ item.name }}</div>\n            </div>\n          </div>\n          <div class=\"mt-6\">\n            <ul>\n              <li class=\"flex mr-14\" style=\"align-items: center;\">\n                <span class=\"label\" style=\"flex-shrink: 0;\">模型类型</span>\n                <span class=\"described\" style=\"flex: 1; min-width: 0;\">{{ item.modelType_dictText }}</span>\n                <a-tooltip v-if=\"!item.activateFlag\" title=\"未激活模型暂无法被系统其他功能调用，激活后可正常使用。\">\n                  <span class=\"no-activate\">未激活</span>\n                </a-tooltip>\n              </li>\n              <li class=\"flex mr-14 mt-6\" style=\"align-items: center;\">\n                <span class=\"label\" style=\"flex-shrink: 0;\">基础模型</span>\n                <span class=\"described\" style=\"flex: 1; min-width: 0;\">{{ item.modelName }}</span>\n              </li>\n              <li class=\"flex mr-14 mt-6\" style=\"align-items: center;\">\n                <span class=\"label\" style=\"flex-shrink: 0;\">创建者</span>\n                <span class=\"described\" style=\"flex: 1; min-width: 0;\">{{ item.createBy_dictText || item.createBy }}</span>\n              </li>\n            </ul>\n          </div>\n          <div class=\"model-btn\">\n            <a-button class=\"model-icon\" size=\"small\" @click.prevent.stop=\"handleEditClick(item)\">\n              <Icon icon=\"ant-design:edit-outlined\"></Icon>\n            </a-button>\n            <a-dropdown placement=\"bottomRight\" :trigger=\"['click']\" :getPopupContainer=\"(node) => node.parentNode\">\n              <div class=\"ant-dropdown-link pointer model-icon\" @click.prevent.stop>\n                <Icon icon=\"ant-design:ellipsis-outlined\"></Icon>\n              </div>\n              <template #overlay>\n                <a-menu>\n                  <!--<a-menu-item key=\"param\" @click=\"handleParamClick(item.id)\">\n                    <Icon icon=\"ant-design:setting-outlined\" size=\"16\"></Icon>\n                    <span class=\"ml-4\">模型参数配置</span>\n                  </a-menu-item>-->\n                  <a-menu-item key=\"delete\" @click.prevent.stop=\"handleDeleteClick(item)\">\n                    <Icon icon=\"ant-design:delete-outlined\" size=\"16\"></Icon> 删除\n                  </a-menu-item>\n                </a-menu>\n              </template>\n            </a-dropdown>\n          </div>\n        </a-card>\n      </a-col>\n    </a-row>\n    <Pagination\n      v-if=\"modalList.length > 0\"\n      :current=\"pageNo\"\n      :page-size=\"pageSize\"\n      :page-size-options=\"pageSizeOptions\"\n      :total=\"total\"\n      :showQuickJumper=\"true\"\n      :showSizeChanger=\"true\"\n      @change=\"handlePageChange\"\n      class=\"list-footer\"\n      size=\"small\"\n      :show-total=\"() => `共${total}条` \"\n    />\n  </div>\n\n  <!--添加模型弹窗-->\n  <AiModelModal @register=\"registerModal\" @success=\"reload\"></AiModelModal>\n</template>\n\n<script lang=\"ts\">\n  import { reactive, ref } from 'vue';\n  import AiModelModal from './components/AiModelModal.vue';\n  import { useModal } from '@/components/Modal';\n  import { deleteModel, list } from './model.api';\n  import { imageList } from './model.data';\n  import { Pagination } from 'ant-design-vue';\n  import JInput from '@/components/Form/src/jeecg/components/JInput.vue';\n  import JSelectUser from '@/components/Form/src/jeecg/components/JSelectUser.vue';\n  import JDictSelectTag from '@/components/Form/src/jeecg/components/JDictSelectTag.vue';\n\n  export default {\n    name: 'ModelList',\n    components: {\n      JDictSelectTag,\n      JSelectUser,\n      JInput,\n      AiModelModal,\n      Pagination,\n    },\n    setup() {\n      //模型列表\n      const modalList = ref([]);\n\n      const [registerModal, { openModal }] = useModal();\n\n      //当前页数\n      const pageNo = ref<number>(1);\n      //每页条数\n      const pageSize = ref<number>(10);\n      //总条数\n      const total = ref<number>(0);\n      //可选择的页数\n      const pageSizeOptions = ref<any>(['10', '20', '30']);\n      //查询参数\n      const queryParam = reactive<any>({});\n      //查询区域label宽度\n      const labelCol = reactive({\n        xs: 24,\n        sm: 4,\n        xl: 6,\n        xxl: 6,\n      });\n      //查询区域组件宽度\n      const wrapperCol = reactive({\n        xs: 24,\n        sm: 20,\n      });\n      //查询区域表单的ref\n      const formRef = ref();\n\n      //页面初始化执行列表查询\n      reload();\n\n      /**\n       * 新增\n       */\n      async function handleAdd() {\n        openModal(true, {});\n      }\n\n      /**\n       * 编辑\n       *\n       * @param item\n       */\n      function handleEditClick(item) {\n        openModal(true, {\n          id: item.id,\n        });\n      }\n\n      /**\n       * 重新加载数据\n       */\n      function reload() {\n        let params = {\n          pageNo: pageNo.value,\n          pageSize: pageSize.value,\n          column: 'createTime',\n          order: 'desc'\n        };\n        Object.assign(params, queryParam);\n        list(params).then((res) => {\n          if (res.success) {\n            modalList.value = res.result.records;\n            total.value = res.result.total;\n          } else {\n            modalList.value = [];\n            total.value = 0;\n          }\n        });\n      }\n\n      /**\n       * 分页改变事件\n       * @param page\n       * @param current\n       */\n      function handlePageChange(page, current) {\n        pageNo.value = page;\n        pageSize.value = current;\n        reload();\n      }\n\n      /**\n       * 获取图片\n       * @param name\n       */\n      const getImage = (name) => {\n        return imageList.value[name];\n      };\n\n      /**\n       * 删除模型\n       * @param item\n       */\n      async function handleDeleteClick(item) {\n        if(modalList.value.length == 1 && pageNo.value > 1) {\n          pageNo.value = pageNo.value - 1;\n        }\n        await deleteModel({ id: item.id, name: item.name }, reload);\n      }\n\n      /**\n       * 查询\n       */\n      function searchQuery() {\n        pageNo.value = 1;\n        reload();\n      }\n\n      /**\n       * 重置\n       */\n      function searchReset() {\n        formRef.value.resetFields();\n        queryParam.createBy = '';\n        //刷新数据\n        reload();\n      }\n\n      /**\n       * 参数配置点击事件\n       *\n       * @param id\n       */\n      function handleParamClick(id) {}\n\n      return {\n        handleAdd,\n        handleEditClick,\n        registerModal,\n        modalList,\n        reload,\n        pageNo,\n        pageSize,\n        pageSizeOptions,\n        total,\n        handlePageChange,\n        getImage,\n        handleDeleteClick,\n        searchQuery,\n        searchReset,\n        queryParam,\n        labelCol,\n        wrapperCol,\n        formRef,\n        handleParamClick,\n      };\n    },\n  };\n</script>\n\n<style scoped lang=\"less\">\n  .model {\n    height: calc(100vh - 115px);\n    background: #f7f8fc;\n    padding: 24px;\n    overflow-y: auto;\n    .model-row {\n      max-height: calc(100% - 100px);\n      margin-top: 20px;\n      overflow-y: auto;\n      .model-header {\n        position: relative;\n        font-size: 14px;\n        .header-img {\n          width: 32px;\n          height: 32px;\n          margin-right: 12px;\n        }\n        .header-text {\n          font-size: 16px;\n          font-weight: bold;\n          color: #354052;\n          width: calc(100% - 80px);\n          overflow: hidden;\n          align-content: center;\n          text-overflow: ellipsis;\n          white-space: nowrap;\n        }\n      }\n    }\n  }\n\n  .label {\n    font-weight: 400;\n    font-size: 12px;\n    align-self: center;\n    color: #8a8f98;\n    overflow-wrap: break-word;\n  }\n  .no-activate{\n    font-size: 10px;\n    color: #ff4d4f;\n    border: 1px solid #ff4d4f;\n    border-radius: 10px;\n    padding: 0 6px;\n    height: 14px;\n    line-height: 12px;\n    margin-left: 6px;\n    align-self: center;\n  }\n  .described {\n    font-weight: 400;\n    margin-left: 14px;\n    display: inline-block;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    overflow: hidden;\n    font-size: 12px;\n    flex: 1;\n  }\n\n  .flex {\n    display: flex;\n  }\n\n  :deep(.ant-card .ant-card-body) {\n    padding: 16px;\n  }\n\n  .mr-14 {\n    margin-right: 14px;\n  }\n  .mt-6 {\n    margin-top: 6px;\n  }\n\n  .ml-4 {\n    margin-left: 4px;\n  }\n\n  .model-btn {\n    position: absolute;\n    right: 4px;\n    top: 6px;\n    height: auto;\n    display: none;\n  }\n  .model-card {\n    margin-right: 20px;\n    margin-bottom: 20px;\n    background: #fcfcfd;\n    border: 1px solid #f0f0f0;\n    box-shadow: 0 2px 4px #e6e6e6;\n    transition: all 0.3s ease;\n    border-radius: 10px;\n    height: 152px;\n    cursor: pointer;\n  }\n  .model-card:hover {\n    box-shadow: 0 6px 12px #d0d3d8;\n    .model-btn {\n      display: flex;\n    }\n  }\n  .pointer {\n    cursor: pointer;\n  }\n  .list-footer {\n    text-align: right;\n    margin-top: 5px;\n  }\n  .jeecg-basic-table-form-container {\n    padding: 0;\n    :deep(.ant-form) {\n      background-color: transparent;\n    }\n    .table-page-search-submitButtons {\n      display: block;\n      margin-bottom: 24px;\n      white-space: nowrap;\n    }\n  }\n\n  .add-knowledge-card {\n    margin-bottom: 20px;\n    background: #fcfcfd;\n    border: 1px solid #f0f0f0;\n    box-shadow: 0 2px 4px #e6e6e6;\n    transition: all 0.3s ease;\n    border-radius: 10px;\n    display: inline-flex;\n    justify-content: center;\n    align-items: center;\n    font-size: 16px;\n    cursor: pointer;\n    height: 152px;\n    width: calc(100% - 20px);\n    .add-knowledge-card-icon {\n      padding: 8px;\n      color: #1f2329;\n      background-color: #f5f6f7;\n      margin-right: 12px;\n    }\n    .add-knowledge-card-title {\n      font-size: 16px;\n      color:#1f2329;\n      font-weight: 400;\n      align-self: center;\n    }\n  }\n\n  .add-knowledge-card:hover {\n    box-shadow: 0 6px 12px #d0d3d8;\n  }\n  .model-icon{\n    background-color: unset;\n    border: none;\n    margin-right: 2px;\n  }\n  .model-icon:hover{\n    color: #000000;\n    background-color: #e9ecf2;\n    border: none;\n  }\n  .ant-dropdown-link{\n    font-size: 14px;\n    height: 24px;\n    padding: 0 7px;\n    border-radius: 4px;\n    align-content: center;\n    text-align: center;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aimodel/components/AiModelModal.vue",
    "content": "<template>\n  <BasicModal destroyOnClose @register=\"registerModal\" :canFullscreen=\"false\" width=\"600px\" wrapClassName=\"ai-model-modal\">\n    <div class=\"modal\">\n      <div class=\"header\">\n        <span class=\"header-title\">\n          <span v-if=\"dataIndex ==='list' || dataIndex ==='add'\" :class=\"dataIndex === 'list' ? '' : 'add-header-title pointer'\" @click=\"goToList\">\n            选择供应商\n            <a-tooltip title=\"供应商文档\" v-if=\"dataIndex ==='list'\">\n              <a style=\"color: #333333\" href=\"https://help.jeecg.com/aigc/guide/model/#2-%E4%BE%9B%E5%BA%94%E5%95%86%E9%80%89%E6%8B%A9\" target=\"_blank\">\n                <Icon style=\"position:relative;left: -2px;top:1px\" icon=\"ant-design:question-circle-outlined\"></Icon>\n              </a>\n            </a-tooltip>\n          </span>\n          <span v-if=\"dataIndex === 'add'\" class=\"add-header-title\"> > </span>\n          <span v-if=\"dataIndex === 'add'\" style=\"color: #1f2329\">添加 {{ providerName }}</span>\n        </span>\n\n        <a-select v-if=\"dataIndex === 'list'\" :bordered=\"false\" class=\"header-select\" size=\"small\" v-model:value=\"modelType\" @change=\"handleChange\">\n          <a-select-option v-for=\"item in modelTypeOption\" :value=\"item.value\">{{ item.text }}</a-select-option>\n        </a-select>\n      </div>\n      <div class=\"model-content\" v-if=\"dataIndex === 'list'\">\n        <a-row :span=\"24\">\n          <a-col :xxl=\"12\" :xl=\"12\" :lg=\"12\" :md=\"12\" :sm=\"12\" :xs=\"24\" v-for=\"item in modelTypeList\">\n            <a-card class=\"model-card\" @click=\"handleClick(item)\">\n              <div class=\"model-header\">\n                <div class=\"flex\">\n                  <img :src=\"getImage(item.value)\" class=\"header-img\" />\n                  <div class=\"header-text\">{{ item.title }}</div>\n                </div>\n              </div>\n            </a-card>\n          </a-col>\n        </a-row>\n      </div>\n      <a-tabs v-model:activeKey=\"activeKey\" v-if=\"dataIndex === 'add' || dataIndex === 'edit'\">\n        <a-tab-pane :key=\"1\">\n          <template #tab>\n            <span style=\"display: flex\">\n            基础信息\n            <a-tooltip title=\"基础信息文档\">\n              <a @click.stop style=\"color: unset\" href=\"https://help.jeecg.com/aigc/guide/model/#31-%E5%A1%AB%E5%86%99%E5%9F%BA%E7%A1%80%E4%BF%A1%E6%81%AF\" target=\"_blank\">\n                <Icon style=\"position:relative;left:2px;top:1px\" icon=\"ant-design:question-circle-outlined\"></Icon>\n              </a>\n            </a-tooltip>\n          </span>\n          </template>\n          <div class=\"model-content\">\n            <BasicForm @register=\"registerForm\">\n              <template #modelType=\"{ model, field }\">\n                <a-select v-model:value=\"model[field]\" @change=\"handleModelTypeChange\" :disabled=\"modelTypeDisabled\">\n                  <a-select-option v-for=\"item in modelTypeAddOption\" :value=\"item\">\n                    <span v-if=\"item === 'LLM'\">语言模型</span>\n                    <span v-else-if=\"item === 'EMBED'\">向量模型</span>\n                    <span v-else-if=\"item === 'IMAGE'\">图像模型</span>\n                  </a-select-option>\n                </a-select>\n              </template>\n\n              <template #modelName=\"{ model, field }\">\n                <AutoComplete v-model:value=\"model[field]\" :options=\"modelNameAddOption\" :filter-option=\"filterOption\">\n                  <template #option=\"{ value, label, descr, type }\">\n                    <a-tooltip placement=\"right\" color=\"#ffffff\" :overlayInnerStyle=\"{ color:'#646a73' }\">\n                      <template #title>\n                        <div v-html=\"getTitle(descr)\"></div>\n                      </template>\n                      <div style=\"display: flex;justify-content: space-between;\">\n                        <span>{{label}}</span>\n                        <div>\n                          <a-tag v-if=\"type && type.split(',').includes('text')\" color=\"#E8D7C3\">文本</a-tag>\n                          <a-tag v-if=\"type && type.split(',').includes('imageGen')\" color=\"#FFEBD3\">图像生成</a-tag>\n                          <a-tag v-if=\"type && type.split(',').includes('image')\" color=\"#C3D9DC\">图像分析</a-tag>\n                          <a-tag v-if=\"type && type.split(',').includes('vector')\" color=\"#D4E0D8\">向量</a-tag>\n                          <a-tag v-if=\"type && type.split(',').includes('embeddings')\" color=\"#FFEBD3\">文本嵌入</a-tag>\n                        </div>\n                      </div>\n                    </a-tooltip>\n                  </template>\n                </AutoComplete>\n              </template>\n            </BasicForm>\n            <a-alert v-if=\"!modelActivate\" message=\"模型未激活，请通过下方「保存并激活」按钮激活当前模型\" type=\"warning\" show-icon />\n          </div>\n        </a-tab-pane>\n        <a-tab-pane :key=\"2\"  v-if=\"modelParamsShow\">\n          <template #tab>\n            <span style=\"display: flex\">\n            高级配置\n            <a-tooltip title=\"高级配置文档\">\n              <a @click.stop style=\"color: unset\" href=\"https://help.jeecg.com/aigc/guide/model/#32-%E9%85%8D%E7%BD%AE%E9%AB%98%E7%BA%A7%E5%8F%82%E6%95%B0\" target=\"_blank\">\n                <Icon style=\"position:relative;left:2px;top:1px\" icon=\"ant-design:question-circle-outlined\"></Icon>\n              </a>\n            </a-tooltip>\n          </span>\n          </template>\n          <AiModelSeniorForm ref=\"modelParamsRef\" :modelParams=\"modelParams\"></AiModelSeniorForm>\n        </a-tab-pane>\n      </a-tabs>\n\n    </div>\n    <template v-if=\"dataIndex === 'add' || dataIndex === 'edit'\" #footer>\n      <a-button @click=\"cancel\">关闭</a-button>\n      <a-button @click=\"test\" v-if=\"modelActivate\" :loading=\"testLoading\" type=\"default\">测试连接</a-button>\n      <a-button @click=\"save\" type=\"primary\" ghost=\"true\">保存</a-button>\n      <a-button @click=\"test(false)\" v-if=\"!modelActivate\" :loading=\"testLoading\" type=\"primary\" >保存并激活</a-button>\n    </template>\n    <template v-else #footer> </template>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\">\n  import { ref, reactive } from 'vue';\n  import BasicModal from '@/components/Modal/src/BasicModal.vue';\n  import { useModal, useModalInner } from '@/components/Modal';\n  import { initDictOptions } from '@/utils/dict';\n  import model from './model.json';\n  import { AutoComplete } from 'ant-design-vue';\n\n  import BasicForm from '@/components/Form/src/BasicForm.vue';\n  import { useForm } from '@/components/Form';\n  import { formSchema, imageList } from '../model.data';\n  import { editModel, queryById, saveModel, testConn } from '../model.api';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  const {createMessage: $message, createConfirm} = useMessage();\n  import AiModelSeniorForm from './AiModelSeniorForm.vue';\n  import { cloneDeep } from \"lodash-es\";\n  export default {\n    name: 'AddModelModal',\n    components: {\n      BasicForm,\n      BasicModal,\n      AiModelSeniorForm,\n      AutoComplete,\n    },\n    emits: ['success', 'register'],\n    setup(props, { emit }) {\n      //ai类型数据\n      const modelTypeData = ref<any>([]);\n      //模型类型下拉框\n      const modelTypeOption = ref<any>([]);\n      //模型类型禁用状态\n      const modelTypeDisabled = ref<boolean>(false);\n      //模型类型\n      const modelType = ref<string>('all');\n      //模型供应商\n      const modelTypeList = ref<any>([]);\n      //list:供应商选择页面，add 添加编辑\n      const dataIndex = ref<string>('list');\n      //供应商名称\n      const providerName = ref<string>('');\n      //添加模型类型的option\n      const modelTypeAddOption = ref<any>([]);\n      //添加模型名称的option\n      const modelNameAddOption = ref<any>([]);\n      //模型数据\n      const modelData = ref<any>({});\n      //tab切换对应的key\n      const activeKey = ref<number>(1);\n      //模型参数\n      const modelParams = ref<any>({});\n      //是否显示模型参数\n      const modelParamsShow = ref<boolean>(false);\n      //模型参数ref\n      const modelParamsRef = ref();\n      //测试按钮loading状态\n      const testLoading = ref<boolean>(false);\n      //模型是否已激活\n      const modelActivate = ref<boolean>(false);\n\n      const getImage = (name) => {\n        return imageList.value[name];\n      };\n      //自动填充文本搜索事件\n      const filterOption = (input: string, option: any)=>{\n        return option.value.toUpperCase().indexOf(input.toUpperCase()) >= 0;\n      }\n\n      //表单配置\n      const [registerForm, { resetFields, setFieldsValue, validate, clearValidate }] = useForm({\n        schemas: formSchema,\n        showActionButtonGroup: false,\n        layout: 'vertical',\n        wrapperCol: { span: 24 },\n      });\n\n      //注册modal\n      const [registerModal, { closeModal, setModalProps }] = useModalInner(async (data) => {\n        activeKey.value = 1;\n        modelParamsShow.value = false;\n        if(dataIndex.value !== 'list') {\n          //重置表单\n          await resetFields();\n        }\n        setModalProps({ minHeight: 500 });\n        if (data.id) {\n          dataIndex.value = 'edit';\n          let values = await queryById({ id: data.id });\n          if (values) {\n            if(values.result.credential){\n              let credential = JSON.parse(values.result.credential);\n              if(credential.secretKey){\n                values.result.secretKey = credential.secretKey;\n              }\n              if(credential.apiKey){\n                values.result.apiKey = credential.apiKey;\n              }\n            }\n            let provider = values.result.provider;\n            let data = model.data.filter((item) => {\n              return item.value.includes(provider);\n            });\n            if (data && data.length > 0) {\n              modelTypeAddOption.value = data[0].type;\n              modelNameAddOption.value = data[0][values.result.modelType];\n            }\n            if(values.result.modelType && values.result.modelType === 'LLM'){\n              modelParamsShow.value = true;\n            }\n            if (values.result.activateFlag) {\n              modelActivate.value = true;\n            }else{\n              modelActivate.value = false;\n            }\n            if(values.result.modelParams){\n              modelParams.value = JSON.parse(values.result.modelParams)\n            }\n            modelTypeDisabled.value = true;\n            //表单赋值\n            await setFieldsValue({\n              ...values.result,\n            });\n            //初始化模型提供者\n            initModelProvider();\n          }\n        } else {\n          modelTypeDisabled.value = false;\n          //初始化模型提供者\n          initModelProvider();\n          dataIndex.value = 'list';\n          modelNameAddOption.value = [];\n          modelActivate.value = false;\n        }\n      });\n\n      //初始化模型类型\n      initModelTypeOption();\n      \n      /**\n       * 初始化 模型类型字典\n       */\n      function initModelTypeOption() {\n        initDictOptions('model_type').then((data) => {\n          modelTypeOption.value = cloneDeep(data);\n          //update-begin---author:wangshuai---date:2025-03-04---for: 解决页面tab刷新一次就多一个全部类型的选项---\n          if(data[0].value != 'all'){\n            modelTypeOption.value.unshift({\n              text: '全部类型',\n              value: 'all',\n            });\n          }\n          //update-end---author:wangshuai---date:2025-03-04---for: 解决页面tab刷新一次就多一个全部类型的选项---\n        });\n      }\n\n      /**\n       * 下拉框值选中事件\n       * @param value\n       */\n      function handleChange(value) {\n        if ('all' == value) {\n          modelTypeList.value = model.data;\n          return;\n        }\n        let data = model.data.filter((item) => {\n          return item.type.includes(value);\n        });\n        modelTypeList.value = data;\n      }\n\n      /**\n       * 初始化模型提供者\n       */\n      function initModelProvider() {\n        modelTypeList.value = model.data;\n      }\n\n      /**\n       * 供应商点击事件\n       *\n       * @param item\n       */\n      function handleClick(item) {\n        dataIndex.value = 'add';\n        modelData.value = item;\n        providerName.value = item.title;\n        modelTypeAddOption.value = item.type;\n        setTimeout(()=>{\n          setFieldsValue({ 'provider': item.value, 'baseUrl': item.baseUrl })\n        },100)\n      }\n\n      /**\n       * 保存\n       */\n      async function save() {\n        try {\n          setModalProps({ confirmLoading: true });\n          let values = await validate();\n          let credential = {\n            apiKey: values.apiKey,\n            secretKey: values.secretKey\n          }\n          if(modelParamsRef.value){\n            let modelParams = modelParamsRef.value.emitChange();\n            if(modelParams){\n              values.modelParams = JSON.stringify(modelParams);\n            }\n          }\n          if(modelActivate.value){\n            values.activateFlag = 1\n          }else{\n            values.activateFlag = 0;\n          }\n          values.credential = JSON.stringify(credential);\n          //新增\n          if (!values.id) {\n            values.provider = modelData.value.value;\n            await saveModel(values);\n            closeModal();\n            emit('success');\n          } else {\n            await editModel(values);\n            closeModal();\n            emit('success');\n          }\n        }catch(e){\n          if(e.hasOwnProperty('errorFields')){\n            activeKey.value = 1;\n          }\n        } finally {\n          setModalProps({ confirmLoading: false });\n        }\n      }\n\n      /**\n       * 取消\n       */\n      function cancel() {\n        dataIndex.value = 'list';\n        closeModal();\n        emit('success');\n      }\n\n      /**\n       * 测试连接\n       */\n      async function test(onlyTest = false) {\n        try {\n          testLoading.value = true;\n          let values = await validate();\n          let credential = {\n            apiKey: values.apiKey,\n            secretKey: values.secretKey,\n          };\n          if (modelParamsRef.value) {\n            let modelParams = modelParamsRef.value.emitChange();\n            if (modelParams) {\n              values.modelParams = JSON.stringify(modelParams);\n            }\n          }\n          values.credential = JSON.stringify(credential);\n          if (!values.provider) {\n            values.provider = modelData.value.value;\n          }\n          //测试\n          await testConn(values).then(async (result) => {\n            if(onlyTest){\n              $message.success('测试连接成功');\n              return true;\n            }\n            modelActivate.value = true;\n            await save();\n          });\n        } catch (e) {\n          if (e.hasOwnProperty('errorFields')) {\n            activeKey.value = 1;\n          }\n        } finally {\n          testLoading.value = false;\n        }\n      }\n\n      /**\n       * 模型类型选择事件\n       * @param value\n       */\n      async function handleModelTypeChange(value) {\n        await setFieldsValue({ modelName: '' });\n        await clearValidate('modelName');\n        await setFieldsValue({\n          modelName: modelData.value[value+'DefaultValue']\n        })\n        modelNameAddOption.value = modelData.value[value];\n        if(value === 'LLM'){\n          modelParamsShow.value = true;\n        }else{\n          modelParamsShow.value = false;\n        }\n        if(value === \"IMAGE\" && modelData.value.baseImageUrl){\n          setFieldsValue({ 'baseUrl': modelData.value.baseImageUrl })\n        } else if(modelData.value.baseUrl) {\n          setFieldsValue({ 'baseUrl': modelData.value.baseUrl })\n        }\n      }\n\n      /**\n       * 选择供应商\n       */\n      function goToList() {\n        if (dataIndex.value === 'add') {\n          dataIndex.value = 'list';\n        }\n      }\n\n      /**\n       * 获取标题\n       * @param title\n       */\n      function getTitle(title) {\n        if(!title){\n          return \"暂无描述内容\";\n        }\n        return title.replaceAll(\"\\n\",\"<br>\")\n      }\n      \n      return {\n        registerModal,\n        modelTypeData,\n        modelTypeOption,\n        modelType,\n        handleChange,\n        modelTypeList,\n        getImage,\n        handleClick,\n        dataIndex,\n        providerName,\n        save,\n        cancel,\n        registerForm,\n        handleModelTypeChange,\n        modelTypeAddOption,\n        modelNameAddOption,\n        goToList,\n        modelTypeDisabled,\n        activeKey,\n        modelParams,\n        modelParamsShow,\n        modelActivate,\n        modelParamsRef,\n        filterOption,\n        getTitle,\n        test,\n        testLoading,\n      };\n    },\n  };\n</script>\n\n<style scoped lang=\"less\">\n  .modal {\n    padding: 12px 20px 20px 20px;\n    .header {\n      padding: 0 24px 24px 0;\n      display: flex;\n      justify-content: space-between;\n      .header-title {\n        font-size: 16px;\n        font-weight: bold;\n      }\n      .header-select {\n        margin-right: 10px;\n      }\n      .add-header-title {\n        color: #646a73;\n      }\n    }\n    .model-content {\n      .model-header {\n        position: relative;\n        font-size: 14px;\n        .header-img {\n          width: 32px;\n          height: 32px;\n          margin-right: 12px;\n        }\n        .header-text {\n          width: calc(100% - 80px);\n          overflow: hidden;\n          align-content: center;\n        }\n      }\n    }\n    .model-card {\n      margin-right: 10px;\n      margin-bottom: 10px;\n      cursor: pointer;\n    }\n  }\n  :deep(.ant-card .ant-card-body) {\n    padding: 12px;\n  }\n\n  .pointer {\n    cursor: pointer;\n  }\n  \n  :deep(.jeecg-basic-modal-close){\n    span{\n      margin-left: 0 !important;\n    }\n  }\n</style>\n<style lang=\"less\">\n.ai-model-modal{\n  .jeecg-basic-modal-close > span{\n    margin-left: 0 !important;\n  }\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aimodel/components/AiModelSeniorForm.vue",
    "content": "<template>\n  <div class=\"model-params-popover\">\n    <div class=\"params\" v-if=\"type === 'model'\">\n      <span style=\"font-size:14px\">参数</span>\n      <a-select value=\"加载预设\" style=\"width: 96px\" size=\"small\" @change=\"onLoadPreset\">\n        <a-select-option v-for=\"(preset, idx) of presets\" :value=\"idx\" :key=\"idx\">\n          <a-space>\n            <Icon :icon=\"preset.icon\" />\n            <span>{{ preset.name }}</span>\n          </a-space>\n        </a-select-option>\n      </a-select>\n    </div>\n    <!-- 模型温度 -->\n    <div class=\"setting-item\" v-if=\"type === 'model'\">\n      <div class=\"label\">\n        <span>模型温度</span>\n        <a-tooltip :title=\"tips.temperature\">\n          <Icon icon=\"ant-design:question-circle\" />\n        </a-tooltip>\n      </div>\n      <a-space>\n        <a-switch v-model:checked=\"temperatureEnable\" size=\"small\"/>\n        <a-slider v-bind=\"temperatureProps\" v-model:value=\"model.temperature\" :disabled=\"model['temperature'] === null\"/>\n        <a-input-number v-bind=\"temperatureProps\" v-model:value=\"model.temperature\" :disabled=\"model['temperature'] === null\"/>\n      </a-space>\n    </div>\n    <!-- 词汇属性 -->\n    <div class=\"setting-item\" v-if=\"type === 'model'\">\n      <div class=\"label\">\n        <span>词汇属性</span>\n        <a-tooltip :title=\"tips.topP\">\n          <Icon icon=\"ant-design:question-circle\" />\n        </a-tooltip>\n      </div>\n      <a-space>\n        <a-switch v-model:checked=\"topPEnable\" size=\"small\"/>\n        <a-slider v-bind=\"topPProps\" v-model:value=\"model.topP\" :disabled=\"model['topP'] === null\"/>\n        <a-input-number v-bind=\"topPProps\" v-model:value=\"model.topP\" :disabled=\"model['topP'] === null\"/>\n      </a-space>\n    </div>\n    <!-- 话题属性 -->\n    <div class=\"setting-item\" v-if=\"type === 'model'\">\n      <div class=\"label\">\n        <span>话题属性</span>\n        <a-tooltip :title=\"tips.presencePenalty\">\n          <Icon icon=\"ant-design:question-circle\" />\n        </a-tooltip>\n      </div>\n      <a-space>\n        <a-switch v-model:checked=\"presencePenaltyEnable\" size=\"small\" />\n        <a-slider v-bind=\"presencePenaltyProps\" v-model:value=\"model.presencePenalty\" :disabled=\"model['presencePenalty'] === null\"/>\n        <a-input-number v-bind=\"presencePenaltyProps\" v-model:value=\"model.presencePenalty\" :disabled=\"model['presencePenalty'] === null\"/>\n      </a-space>\n    </div>\n    <!-- 重复属性 -->\n    <div class=\"setting-item\" v-if=\"type === 'model'\">\n      <div class=\"label\">\n        <span>重复属性</span>\n        <a-tooltip :title=\"tips.frequencyPenalty\">\n          <Icon icon=\"ant-design:question-circle\" />\n        </a-tooltip>\n      </div>\n      <a-space>\n        <a-switch v-model:checked=\"frequencyPenaltyEnable\" size=\"small\" />\n        <a-slider v-bind=\"frequencyPenaltyProps\" v-model:value=\"model.frequencyPenalty\" :disabled=\"model['frequencyPenalty'] === null\"/>\n        <a-input-number v-bind=\"frequencyPenaltyProps\" v-model:value=\"model.frequencyPenalty\" :disabled=\"model['frequencyPenalty'] === null\"/>\n      </a-space>\n    </div>\n    <!-- 最大回复 -->\n    <div class=\"setting-item\" v-if=\"type === 'model'\">\n      <div class=\"label\">\n        <span>最大回复</span>\n        <a-tooltip :title=\"tips.maxTokens\">\n          <Icon icon=\"ant-design:question-circle\" />\n        </a-tooltip>\n      </div>\n      <a-space>\n        <a-switch v-model:checked=\"maxTokensEnable\" size=\"small\" />\n        <a-slider v-bind=\"maxTokensProps\" v-model:value=\"model.maxTokens\" :disabled=\"model['maxTokens'] === null\"/>\n        <a-input-number v-bind=\"maxTokensProps\" v-model:value=\"model.maxTokens\" :disabled=\"model['maxTokens'] === null\"/>\n      </a-space>\n    </div>\n    <!-- timeout 超时 -->\n    <div class=\"setting-item\" v-if=\"type === 'model'\">\n      <div class=\"label\">\n        <span>超时时间</span>\n        <a-tooltip :title=\"tips.timeout\">\n          <Icon icon=\"ant-design:question-circle\" />\n        </a-tooltip>\n      </div>\n      <a-space>\n        <a-switch v-model:checked=\"timeoutEnable\" size=\"small\" />\n        <a-slider v-bind=\"timeoutProps\" v-model:value=\"model.timeout\" :disabled=\"model['timeout'] === null\"/>\n        <a-input-number v-bind=\"timeoutProps\" v-model:value=\"model.timeout\" :disabled=\"model['timeout'] === null\"/>\n      </a-space>\n    </div>\n    <!-- top k -->\n    <div class=\"setting-item\" v-if=\"type === 'knowledge'\">\n      <div class=\"label\">\n        <span>Top K</span>\n        <a-tooltip :title=\"tips.topNumber\">\n          <Icon icon=\"ant-design:question-circle\" />\n        </a-tooltip>\n      </div>\n      <a-space>\n        <a-switch v-model:checked=\"topNumberEnable\" size=\"small\" />\n        <a-slider v-bind=\"topNumberProps\" v-model:value=\"model.topNumber\" :disabled=\"model['topNumber'] === null\"/>\n        <a-input-number v-bind=\"topNumberProps\" v-model:value=\"model.topNumber\" :disabled=\"model['topNumber'] === null\"/>\n      </a-space>\n    </div>\n    <!-- Score 阈值 -->\n    <div class=\"setting-item\" v-if=\"type === 'knowledge'\">\n      <div class=\"label\">\n        <span>Score 阈值</span>\n        <a-tooltip :title=\"tips.similarity\">\n          <Icon icon=\"ant-design:question-circle\" />\n        </a-tooltip>\n      </div>\n      <a-space>\n        <a-switch v-model:checked=\"similarityEnable\" size=\"small\" />\n        <a-slider v-bind=\"similarityProps\" v-model:value=\"model.similarity\" :disabled=\"model['similarity'] === null\"/>\n        <a-input-number v-bind=\"similarityProps\" v-model:value=\"model.similarity\" :disabled=\"model['similarity'] === null\"/>\n      </a-space>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { ref, computed } from 'vue';\n  import { cloneDeep, omit } from 'lodash-es';\n\n  export default {\n    name: 'AiModelSeniorForm',\n    components: {},\n    props: {\n      modelParams: {\n        type: Object,\n        default: {}\n      },\n      type: {\n        type: String,\n        default: 'model'\n      }\n    },\n    emits: ['success', 'register', 'updateModel'],\n    setup(props, { emit }) {\n      // 预设参数\n      const presets = [\n        {\n          name: '创意',\n          icon: 'fxemoji:star',\n          params: {\n            temperature: 0.8,\n            topP: 0.9,\n            presencePenalty: 0.1,\n            frequencyPenalty: 0.1,\n            maxTokens: null,\n            timeout: 60,\n          },\n        },\n        {\n          name: '平衡',\n          icon: 'noto:balance-scale',\n          params: {\n            temperature: 0.5,\n            topP: 0.8,\n            presencePenalty: 0.2,\n            frequencyPenalty: 0.3,\n            maxTokens: null,\n            timeout: 60,\n          },\n        },\n        {\n          name: '精确',\n          icon: 'twemoji:direct-hit',\n          params: {\n            temperature: 0.2,\n            topP: 0.7,\n            presencePenalty: 0.5,\n            frequencyPenalty: 0.5,\n            maxTokens: null,\n            timeout: 60,\n          },\n        },\n      ];\n\n      // 参数介绍\n      const tips = {\n        temperature: '值越大，回复内容越赋有多样性创造性、随机性；设为0根据事实回答，希望得到精准答案应该降低该参数；日常聊天建议0.5-0.8。',\n        topP: '值越小，Ai生成的内容越单调也越容易理解；值越大，Ai回复的词汇围越大，越多样化。',\n        presencePenalty: '值越大，越能够让Ai更好地控制新话题的引入，建议微调或不变。',\n        frequencyPenalty: '值越大，越能够让Ai更好地避免重复之前说过的话，建议微调或不变。',\n        maxTokens:\n          '设置Ai最大回复内容大小，会影响返回结果的长度。普通聊天建议500-800；短文生成建议800-2000；代码生成建议2000-3600；长文生成建议4000左右（或选择长回复模型)',\n        topNumber: '用于筛选与用户问题相似度最高的文本片段。系统同时会根据选用模型上下文窗口大小动态调整分段数量。',\n        similarity: '用于设置文本片段筛选的相似度阅值。',\n        timeout: '等待AI响应的最长时间，单位为秒。'\n      };\n\n      // 参数：温度\n      const temperatureProps = ref<any>({\n        min: 0.1,\n        max: 1,\n        step: 0.1,\n      });\n\n      // 参数：词汇属性\n      const topPProps = ref<any>({\n        min: 0.1,\n        max: 1,\n        step: 0.1,\n      });\n      // 参数：话题属性\n      const presencePenaltyProps = ref<any>({\n        min: -2,\n        max: 2,\n        step: 0.1,\n      });\n      // 参数：重复属性\n      const frequencyPenaltyProps = ref<any>({\n        min: -2,\n        max: 2,\n        step: 0.1,\n      });\n      // 参数：最大回复\n      const maxTokensProps = ref<any>({\n        min: 1,\n        max: 16000,\n        step: 1,\n      });    \n      \n      // 参数：topk\n      const topNumberProps = ref<any>({\n        min: 1,\n        max: 10,\n        step: 1,\n      });     \n      \n      // 参数：Score 阈值\n      const similarityProps = ref<any>({\n        min: 0.1,\n        max: 1,\n        step: 0.1,\n      });\n      \n      //参数：超时时间\n      const timeoutProps = ref<any>({\n        min: 1,\n        step: 1,\n        max: 3600,\n      })\n      \n      \n      //参数对象\n      const model = ref<any>(props.modelParams || {})\n      \n      //模型温度是否勾选\n      const temperatureEnable = computed({\n        get:()=> model.value.temperature != null,\n        set:(value) => model.value.temperature = !value? null: 0.7\n      });    \n      \n      //词汇属性是否勾选\n      const topPEnable = computed({\n        get:()=> model.value.topP != null,\n        set:(value) => model.value.topP = !value? null: 0\n      });\n      \n      //词汇属性是否勾选\n      const presencePenaltyEnable = computed({\n        get:()=> model.value.presencePenalty != null,\n        set:(value) => model.value.presencePenalty = !value? null: 0\n      });  \n      \n      //重复属性是否勾选\n      const frequencyPenaltyEnable = computed({\n        get:()=> model.value.frequencyPenalty != null,\n        set:(value) => model.value.frequencyPenalty = !value? null: 0\n      });   \n      \n      //最大回复\n      const maxTokensEnable = computed({\n        get:()=> model.value.maxTokens != null,\n        set:(value) => model.value.maxTokens = !value? null: 520\n      });\n        \n      //top k\n      const topNumberEnable = computed({\n        get:()=> model.value.topNumber != null,\n        set:(value) => model.value.topNumber = !value? null: 4\n      });   \n      \n      //Score 阈值\n      const similarityEnable = computed({\n        get:()=> model.value.similarity != null,\n        set:(value) => model.value.similarity = !value? null: 0.74\n      });    \n      \n      //timeout超时时间\n      const timeoutEnable = computed({\n        get:()=> model.value.timeout != null,\n        set:(value) => model.value.timeout = !value? null: 60\n      });\n      \n      // 加载预设\n      function onLoadPreset(idx: number) {\n        const preset = presets[idx];\n        if (!preset) {\n          return;\n        }\n        model.value = preset.params;\n      }\n\n      /**\n       * 更新参数\n       *\n       * @param model\n       */\n      function emitChange() {\n        return model.value;\n      }\n\n      /**\n       * 设置modal值\n       * @param values\n       */\n      function setModalParams(values){\n        model.value = values\n      }\n      \n      return {\n        presets,\n        onLoadPreset,\n        tips,\n        temperatureProps,\n        topPProps,\n        presencePenaltyProps,\n        model,\n        frequencyPenaltyProps,\n        temperatureEnable,\n        maxTokensProps,\n        emitChange,\n        topPEnable,\n        presencePenaltyEnable,\n        frequencyPenaltyEnable,\n        maxTokensEnable,\n        topNumberEnable,\n        topNumberProps,\n        similarityEnable,\n        similarityProps,\n        setModalParams,\n        timeoutEnable,\n        timeoutProps,\n      };\n    },\n  };\n</script>\n\n<style lang=\"less\" scoped>\n  .model-params-popover {\n    font-size: 14px;\n    width: 100%;\n     .params{\n       display: flex;\n       justify-content: space-between;\n     } \n    .setting-item{\n      margin-top: 10px;\n    }\n    .setting-item .label {\n      > span {\n        vertical-align: middle;\n\n        &.app-iconify {\n          cursor: help;\n          color: #888888;\n        }\n      }\n    }\n\n    .ant-space {\n      .ant-slider {\n        width: 380px;\n      }\n\n      .ant-input-number {\n        width: 110px;\n        min-width: 80px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aimodel/components/model.json",
    "content": "{\n  \"data\": [\n    {\n      \"title\": \"Anthropic\",\n      \"value\": \"ANTHROPIC\",\n      \"LLM\": [\n        {\"label\": \"claude-sonnet-4-20250514\", \"value\": \"claude-sonnet-4-20250514\",\"descr\": \"【Claude 4系列】Claude Sonnet 4具有卓越推理能力的高性能模型。\\n\\n支持文本和图像输入，文本输出，拥有200k上下文窗口（1M上下文测试版可用）。\",\"type\": \"text,image\"},\n        {\"label\": \"claude-opus-4-20250514\", \"value\": \"claude-opus-4-20250514\",\"descr\": \"【Claude 4系列】Claude Opus 4是最强大、最有能力的模型。\\n\\n支持文本和图像输入，文本输出，拥有200k上下文窗口，卓越的推理能力。\",\"type\": \"text,image\"},\n        {\"label\": \"claude-3-7-sonnet-20250219\", \"value\": \"claude-3-7-sonnet-20250219\",\"descr\": \"【Claude 3.7系列】Claude Sonnet 3.7中型模型，具备卓越的推理能力和效率。\\n\\n适合企业工作负载和大规模AI部署。\",\"type\": \"text,image\"},\n        {\"label\": \"claude-3-5-sonnet-20241022\", \"value\": \"claude-3-5-sonnet-20241022\",\"descr\": \"Claude 3.5 Sonnet是Anthropic最强大的AI模型。\\n\\n在编程、多步骤工作流、图表解释等复杂任务中表现出色。支持200k上下文长度，支持8k最大输出。\",\"type\": \"text,image\"},\n        {\"label\": \"claude-3-5-haiku-20241022\", \"value\": \"claude-3-5-haiku-20241022\",\"descr\": \"【快速模型】Claude 3.5 Haiku是Anthropic最快的AI模型。\\n\\n响应速度快，成本较低，适合高频交互场景。支持200k上下文长度，支持8k最大输出。\",\"type\": \"text,image\"},\n        {\"label\": \"claude-3-opus-20240229\", \"value\": \"claude-3-opus-20240229\",\"descr\": \"Claude 3 Opus是Claude 3系列中性能最强的模型。\\n\\n在高度复杂的任务上表现出色，如编写高质量代码、数学推理等。支持200k上下文长度，支持4k最大输出。\",\"type\": \"text,image\"},\n        {\"label\": \"claude-3-sonnet-20240229\", \"value\": \"claude-3-sonnet-20240229\",\"descr\": \"Claude 3 Sonnet在智能和速度之间取得了良好平衡。\\n\\n适合企业工作负载和大规模AI部署。支持200k上下文长度，支持4k最大输出。\",\"type\": \"text,image\"},\n        {\"label\": \"claude-3-haiku-20240307\", \"value\": \"claude-3-haiku-20240307\",\"descr\": \"Claude 3 Haiku是Claude 3系列中最快的模型。\\n\\n提供接近即时的响应，适合无缝AI体验。支持200k上下文长度，支持4k最大输出。\",\"type\": \"text,image\"}\n      ],\n      \"type\": [\"LLM\"],\n      \"baseUrl\": \"https://api.anthropic.com/v1\",\n      \"LLMDefaultValue\": \"claude-3-5-sonnet-20241022\"\n    },\n    {\n      \"title\": \"DeepSeek\",\n      \"value\": \"DEEPSEEK\",\n      \"LLM\": [\n        {\"label\": \"deepseek-reasoner\", \"value\": \"deepseek-reasoner\",\"descr\": \"【官方模型】深度求索 新推出的推理模型R1满血版\\n火便全球。\\n支持64k上下文，其中支持8k最大回复。\",\"type\": \"text\"},\n        {\"label\":\"deepseek-chat\", \"value\": \"deepseek-chat\",\"descr\": \"最强开源 MoE 模型 DeepSeek-V3，全球首个在代码、数学能力上与GPT-4-Turbo争锋的模型，在代码、数学的多个榜单上位居全球第二；\",\"type\": \"text\"}\n      ],\n      \"type\": [\"LLM\"],\n      \"baseUrl\": \"https://api.deepseek.com/v1\",\n      \"LLMDefaultValue\": \"deepseek-chat\"\n    },\n    {\n      \"title\": \"Ollama\",\n      \"value\": \"OLLAMA\",\n      \"LLM\": [\n        {\"label\": \"llama2\", \"value\": \"llama2\"},\n        {\"label\": \"llama2:13b\", \"value\": \"llama2:13b\"},\n        {\"label\": \"llama2:70b\", \"value\": \"llama2:70b\"},\n        {\"label\": \"llama2-chinese:13b\", \"value\": \"llama2-chinese:13b\"},\n        {\"label\": \"llama3:8b\", \"value\": \"llama3:8b\"},\n        {\"label\": \"llama3:70b\", \"value\": \"llama3:70b\"},\n        {\"label\": \"qwen:0.5b\", \"value\": \"qwen:0.5b\"},\n        {\"label\": \"qwen:1.8b\", \"value\": \"qwen:1.8b\"},\n        {\"label\": \"qwen:4b\", \"value\": \"qwen:4b\"},\n        {\"label\": \"qwen:7b\", \"value\": \"qwen:7b\"},\n        {\"label\": \"qwen:14b\", \"value\": \"qwen:14b\"},\n        {\"label\": \"qwen:32b\", \"value\": \"qwen:32b\"},\n        {\"label\": \"qwen:72b\", \"value\": \"qwen:72b\"},\n        {\"label\": \"qwen:110b\", \"value\": \"qwen:110b\"},\n        {\"label\": \"qwen2:72b-instruct\", \"value\": \"qwen2:72b-instruct\"},\n        {\"label\": \"qwen2:57b-a14b-instruct\", \"value\": \"qwen2:57b-a14b-instruct\"},\n        {\"label\": \"qwen2:7b-instruct\", \"value\": \"qwen2:7b-instruct\"},\n        {\"label\": \"qwen2.5:72b-instruct\", \"value\": \"qwen2.5:72b-instruct\"},\n        {\"label\": \"qwen2.5:32b-instruct\", \"value\": \"qwen2.5:32b-instruct\"},\n        {\"label\": \"qwen2.5:14b-instruct\", \"value\": \"qwen2.5:14b-instruct\"},\n        {\"label\": \"qwen2.5:7b-instruct\", \"value\": \"qwen2.5:7b-instruct\"},\n        {\"label\": \"qwen2.5:1.5b-instruct\", \"value\": \"qwen2.5:1.5b-instruct\"},\n        {\"label\": \"qwen2.5:0.5b-instruct\", \"value\": \"qwen2.5:0.5b-instruct\"},\n        {\"label\": \"qwen2.5:3b-instruct\", \"value\": \"qwen2.5:3b-instruct\"},\n        {\"label\": \"phi3\", \"value\": \"phi3\"}\n      ],\n      \"EMBED\": [\n        {\"label\": \"nomic-embed-text\", \"value\": \"nomic-embed-text\"}\n      ],\n      \"type\": [\"LLM\", \"EMBED\"],\n      \"baseUrl\": \"http://localhost:11434\",\n      \"LLMDefaultValue\": \"llama2\",\n      \"EMBEDDefaultValue\": \"nomic-embed-text\"\n    },\n    {\n      \"title\": \"OpenAI\",\n      \"value\": \"OPENAI\",\n      \"LLM\": [\n        {\"label\": \"gpt-3.5-turbo\", \"value\": \"gpt-3.5-turbo\",\"descr\": \"纯官方高速GPT3.5系列，目前指向gpt-35-turbo-0125模型，最大回复小于4k。\\n综合能力强，过去使用最广泛的文本模型。\", \"type\": \"text\"\n        },\n        {\"label\": \"gpt-4\", \"value\": \"gpt-4\",\"descr\": \"纯官方GPT4系列。知识库截止于2021年，价格适中，具有中等参数，比gpt-4turbo系列略强。\",\"type\": \"text\"},\n        {\"label\": \"gpt-4o\", \"value\": \"gpt-4o\",\"descr\": \"GPT-4o，是openai的新旗舰型号，支持文本和图片分析。\\n\\n是迈向更自然的人机交互的一步——它接受文本和图像的任意组合作为输入，并生成文本和图像输出的任意组合。\",\"type\": \"text,image\"},\n        {\"label\": \"gpt-4o-mini\", \"value\": \"gpt-4o-mini\",\"descr\": \"GPT-4o mini是目前性价比最高的小参数模型，性能介于GPT3.5~GPT4o之间。\\n\\n成本相比GPT-3.5 Turbo便宜60%以上，支持50种不同语言，用于替代GPT-3.5版本的模型。\\n\\n4o-mini的图像分析价格和4o差不多，如果有图像分析需求还是4o更好一些。\\n\\n当前指向 gpt-4o-mini-2024-07-18\",\"type\": \"text,image\"},\n        {\"label\": \"gpt-4-turbo\", \"value\": \"gpt-4-turbo\",\"descr\": \"纯官方GPT4系列，支持文本和图片分析，最大回复4k，openai于2024-4-9新增的模型，知识库更新于2023年12月。提高了写作、数学、逻辑推理和编码能力。当前指向gpt-4-turbo-2024-04-09\",\"type\": \"text,image\"},\n        {\"label\": \"gpt-4-turbo-preview\", \"value\": \"gpt-4-turbo-preview\",\"descr\": \"纯官方GPT4系列，最大回复4k，知识库更新于2023年4月。当前指向gpt-4-0125-preview\",\"type\": \"text\"},\n        {\"label\": \"gpt-3.5-turbo-0125\", \"value\": \"gpt-3.5-turbo-0125\",\"descr\": \"openai于2024年1月25号更新的gpt-3.5模型，最大回复4k。\\n\\n综合能力强，过去使用最广泛的文本模型。\",\"type\": \"text\"},\n        {\"label\": \"gpt-3.5-turbo-1106\", \"value\": \"gpt-3.5-turbo-1106\",\"descr\": \"openai于2023年11月6号更新的gpt-3.5模型，最大回复4k。属于即将被淘汰的模型。\\n\\n建议使用gpt-3.5-turbo或gpt-4o-mini\",\"type\": \"text\"},\n        {\"label\": \"gpt-3.5-turbo-0613\", \"value\": \"gpt-3.5-turbo-0613\",\"descr\": \"通过微调后可以更准确地按照用户的指示进行操作，生成更简洁和针对性的输出。它不仅可以用于文本生成，还可以通过函数调用功能与其他系统和API进行集成，实现更复杂的任务自动化\",\"type\": \"text\"},\n        {\"label\": \"gpt-4o-2024-05-13\", \"value\": \"gpt-4o-2024-05-13\",\"descr\": \"GPT-4o，是openai的新旗舰型号，支持文本和图片分析。\\n\\n是迈向更自然的人机交互的一步——它接受文本和图像的任意组合作为输入，并生成文本和图像输出的任意组合。\\n\\n该模型为初代的4o模型\",\"type\": \"text,image\"},\n        {\"label\": \"gpt-4-turbo-2024-04-09\", \"value\": \"gpt-4-turbo-2024-04-09\",\"descr\": \"纯官方GPT4系列，支持文本和图片分析，最大回复4k，openai于2024-4-9新增的模型，提高了写作、数学、逻辑推理和编码能力。知识库更新于2023年12月。\",\"type\": \"text,image\"},\n        {\"label\": \"gpt-4-0125-preview\", \"value\": \"gpt-4-0125-preview\",\"descr\": \"纯官方GPT4系列，最大回复4k，知识库更新于2023年4月。当前与gpt-4-turbo-preview属于同一模型\",\"type\": \"text\"},\n        {\"label\": \"gpt-4-1106-preview\", \"value\": \"gpt-4-1106-preview\",\"descr\": \"纯官方GPT4系列，最大回复4k，知识库更新于2023年4月。正在逐渐被新的模型gpt-4-turbo和gpt-4-turbo-preview取代。\",\"type\": \"text\"}\n      ],\n      \"EMBED\": [\n        {\"label\": \"text-embedding-ada-002\", \"value\": \"text-embedding-ada-002\",\"descr\": \"用于生成文本嵌入的模型。文本嵌入是将文本转换为数值形式（通常是向量），以便可以用于机器学习模型。\",\"type\": \"vector,embeddings\"},\n        {\"label\": \"text-embedding-3-small\", \"value\": \"text-embedding-3-small\",\"descr\": \"用于生成文本的嵌入表示，网络结构较小，计算资源需求较低。虽然可能不如\\\"large\\\"版本那样精准，但它更适合于资源受限的环境或需要更快速处理的任务。\",\"type\": \"vector,embeddings\"},\n        {\"label\": \"text-embedding-3-large\", \"value\": \"text-embedding-3-large\",\"descr\": \"用于生成文本的嵌入表示，即将文本转换为高维空间中的点，这些点的距离可以表示文本之间的相似度。有较大的网络结构，能够捕捉更丰富的语言特征，适用于需要高质量文本相似度或分类任务的场景。\",\"type\": \"vector,embeddings\"}\n      ],\n      \"IMAGE\": [\n        {\"label\": \"gpt-image-1.5\", \"value\": \"gpt-image-1.5\",\"descr\": \"openAI强大的图片生成模型，支持图像生成与编辑功能，生图图片支持中文文字。相比上一版本，拥有更好的指令跟踪和对提示词的遵循。\",\"type\": \"imageGen\"},\n        {\"label\": \"gpt-image-1\", \"value\": \"gpt-image-1\",\"descr\": \"是一个图片生成模型，支持图像生成与编辑功能，生图图片支持中文文字。\",\"type\": \"imageGen\"},\n        {\"label\": \"dall-e-2\", \"value\": \"dall-e-2\",\"descr\": \"是OpenAI推出的文本生成图像系统\",\"type\": \"imageGen\"},\n        {\"label\": \"dall-e-3\", \"value\": \"dall-e-3\",\"descr\": \"是OpenAI开发的第三代文本到图像生成模型,提升了图像细节处理和艺术风格迁移能力\",\"type\": \"imageGen\"}\n      ],\n      \"type\": [\"LLM\", \"EMBED\",\"IMAGE\"],\n      \"baseUrl\": \"https://api.openai.com/v1/\",\n      \"LLMDefaultValue\": \"gpt-4o-mini\",\n      \"EMBEDDefaultValue\": \"text-embedding-ada-002\",\n      \"IMAGEDefaultValue\": \"gpt-image-1.5\"\n    },\n    {\n      \"title\": \"通义千问\",\n      \"value\": \"QWEN\",\n      \"LLM\": [\n        {\"label\": \"qwen-turbo\", \"value\": \"qwen-turbo\",\"descr\": \"通义千问超大规模语言模型，支持中文、英文等不同语言输入。适合文本创作、文本处理、编程辅助、翻译服务、对话模拟。\",\"type\": \"text\"},\n        {\"label\": \"qwen-plus\", \"value\": \"qwen-plus\",\"descr\": \"通义千问超大规模语言模型，支持中文、英文等不同语言输入。适合文本创作、文本处理、编程辅助、翻译服务、对话模拟。\",\"type\": \"text\"},\n        {\"label\": \"qwen-max\", \"value\": \"qwen-max\",\"descr\": \"暂无描述内容！\",\"type\": \"text\"}\n      ],\n      \"EMBED\": [\n        {\"label\": \"text-embedding-v2\", \"value\": \"text-embedding-v2\",\"descr\": \"是一种将文本数据转换为向量的技术，通过深度学习模型将文本的语义信息嵌入到高维向量空间中。这些向量不仅能表达文本内容，还能捕捉文本之间的相似性和关系，从而让计算机高效地进行文本检索、分类、聚类等任务。\",\"type\": \"vector\"}\n      ],\n      \"IMAGE\": [\n        { \"label\": \"wan2.2-t2i-plus\", \"value\": \"wan2.2-t2i-plus\",\"descr\": \"全新升级的通义万相2.2文生图，更快的生成速度。在生成图像创意性、稳定性、写实质感方面全面升级，指令遵循更强，原生支持多种风格。支持最大200万像素生成，支持智能提示词改写等。\",\"type\": \"imageGen\"},\n        { \"label\": \"wan2.2-t2i-flash\", \"value\": \"wan2.2-t2i-flash\",\"descr\": \"全新升级的通义万相2.2文生图，更快的生成速度。在生成图像创意性、稳定性、写实质感方面全面升级，指令遵循更强，原生支持多种风格。支持最大200万像素生成，支持智能提示词改写等。\",\"type\": \"imageGen\"},\n        { \"label\": \"wan2.5-i2i-preview\", \"value\": \"wan2.5-i2i-preview\",\"descr\": \"是万相2.5系列中的图像编辑模型，专注于通用图像编辑任务，支持单图编辑和多图融合功能\",\"type\": \"imageGen\"},\n        { \"label\": \"wanx2.1-imageedit\", \"value\": \"wanx2.1-imageedit\",\"descr\": \"是阿里云百炼平台提供的通用图像编辑模型，适用于多种图像处理任务，如风格迁移、内容编辑、尺寸优化等\",\"type\": \"imageGen\"},\n        { \"label\": \"wanx-v1\", \"value\": \"wanx-v1\",\"descr\": \"是通义万相系列中的文本生成图像模型，支持中英文双语输入和多种图像风格生成\",\"type\": \"imageGen\"}\n      ],\n      \"type\": [\"LLM\", \"EMBED\",\"IMAGE\"],\n      \"baseUrl\": \"https://dashscope.aliyuncs.com/api/v1/services/\",\n      \"baseImageUrl\": \"https://dashscope.aliyuncs.com/api/v1/\",\n      \"LLMDefaultValue\": \"qwen-plus\",\n      \"EMBEDDefaultValue\": \"text-embedding-v2\",\n      \"IMAGEDefaultValue\": \"wan2.2-t2i-plus\"\n    },\n    {\n      \"title\": \"千帆大模型\",\n      \"value\": \"QIANFAN\",\n      \"LLM\": [\n        {\"label\": \"ERNIE-Bot\", \"value\": \"ERNIE-Bot\",\"descr\": \"是百度推出的一款知识增强大语言模型，主要用于与人对话互动、回答问题、协助创作，帮助人们高效便捷地获取信息、知识和灵感\",\"type\": \"text\"},\n        {\"label\": \"ERNIE-Bot 4.0\", \"value\": \"ERNIE-Bot 4.0\",\"descr\": \"百度自行研发的文心产业级知识增强大语言模型4.0版本\\n\\n实现了基础模型的全面升级，在理解、生成、逻辑和记忆能力上相对ERNIE 3.5都有着显著提升，支持5K输入+2K输出。\",\"type\": \"text\"},\n        {\"label\": \"ERNIE-Bot-8K\", \"value\": \"ERNIE-Bot-8K\",\"descr\": \"主要用于数据分析场景，特别是在企业数据分析中表现出色。ERNIE-Bot-8K是百度文心大模型的一个版本，具有模型效果优、生成能力强、应用门槛低等独特优势。\",\"type\": \"text\"},\n        {\"label\": \"ERNIE-Bot-turbo\", \"value\": \"ERNIE-Bot-turbo\",\"descr\": \"是一个大语言模型，主要用于对话问答、内容创作生成等任务。它是百度自行研发的大语言模型，覆盖了海量中文数据，具有更强的对话问答和内容创作生成能力\",\"type\": \"text\"},\n        {\"label\": \"ERNIE-Speed-128K\", \"value\": \"ERNIE-Speed-128K\",\"descr\": \"是一款基于Transformer结构的轻量级语言模型，旨在满足实时数据处理的需求。它具有高效、低延迟和高准确性的特点，广泛应用于自然语言处理、信息检索和文本分类等领域\",\"type\": \"text\"},\n        {\"label\": \"EB-turbo-AppBuilder\", \"value\": \"EB-turbo-AppBuilder\",\"descr\": \"主要用于企业级应用场景，如智能客服、内容创作和知识问答等任务。它是基于文心高性能大语言模型ERNIE-Bot-turbo构建的，针对企业特定需求进行了深度的场景效果优化和输出格式定制，因此在满足企业特定需求方面具有更高的灵活性和实用性\",\"type\": \"text\"},\n        {\"label\": \"Yi-34B-Chat\", \"value\": \"Yi-34B-Chat\",\"descr\": \"Yi-34B-Chat是一款基于Transformer架构的生成式预训练语言模型，它拥有340亿个参数，使其在处理自然语言任务时表现出了强大的能力。\",\"type\": \"text\"},\n        {\"label\": \"BLOOMZ-7B\", \"value\": \"BLOOMZ-7B\",\"descr\": \"是一个用于生成文本序列的自回归模型，它可以进行多语言处理，支持46种语言和13种编程语言。BLOOMZ-7B是BLOOM模型的一个调优版本，具有更出色的泛化和零样本学习能力，适用于多种任务和场景\",\"type\": \"text\"},\n        {\"label\": \"Qianfan-BLOOMZ-7B-compressed\", \"value\": \"Qianfan-BLOOMZ-7B-compressed\",\"descr\": \"是千帆团队在BLOOMZ-7B基础上的压缩版本，融合量化、稀疏化等技术，显存占用降低30%以上。\",\"type\": \"text\"},\n        {\"label\": \"Mixtral-8x7B-Instruct\", \"value\": \"Mixtral-8x7B-Instruct\",\"descr\": \"由Mistral AI发布的首个高质量稀疏专家混合模型 (MOE)，模型由8个70亿参数专家模型组成，在多个基准测试中表现优于Llama-2-70B及GPT3.5，能够处理32K上下文，在代码生成任务中表现尤为优异。\",\"type\": \"text\"},\n        {\"label\": \"Llama-2-7b-chat\", \"value\": \"Llama-2-7b-chat\",\"descr\": \"由Meta AI研发并开源，在编码、推理及知识应用等场景表现优秀，Llama-2-7b-chat是高性能原生开源版本，适用于对话场景。\",\"type\": \"text\"},\n        {\"label\": \"Llama-2-13b-chat\", \"value\": \"Llama-2-13b-chat\",\"descr\": \"由Meta AI研发并开源，在编码、推理及知识应用等场景表现优秀，Llama-2-13b-chat是性能与效果均衡的原生开源版本，适用于对话场景。\",\"type\": \"text\"},\n        {\"label\": \"Llama-2-70b-chat\", \"value\": \"Llama-2-70b-chat\",\"descr\": \"由Meta AI研发并开源，在编码、推理及知识应用等场景表现优秀，Llama-2-70b-chat是高精度效果的原生开源版本。\",\"type\": \"text\"},\n        {\"label\": \"Qianfan-Chinese-Llama-2-7B\", \"value\": \"Qianfan-Chinese-Llama-2-7B\",\"descr\": \"是千帆团队在Llama-2-7b基础上的中文增强版本，在CMMLU、C-EVAL等中文数据集上表现优异。\",\"type\": \"text\"},\n        {\"label\": \"ChatGLM2-6B-32K\", \"value\": \"ChatGLM2-6B-32K\",\"descr\": \"是在ChatGLM2-6B的基础上进一步强化了对于长文本的理解能力，能够更好的处理最多32K长度的上下文。\",\"type\": \"text\"},\n        {\"label\": \"AquilaChat-7B\", \"value\": \"AquilaChat-7B\",\"descr\": \"是由智源研究院研发，基于Aquila-7B训练的对话模型，支持流畅的文本对话及多种语言类生成任务，通过定义可扩展的特殊指令规范，实现 AquilaChat对其它模型和工具的调用，且易于扩展。\",\"type\": \"text\"}\n      ],\n      \"EMBED\": [\n        {\"label\": \"Embedding-V1\", \"value\": \"Embedding-V1\",\"descr\": \"主要用于将离散对象（如文本、图像等）映射为连续的数值向量，以便于计算机处理和机器学习模型的训练和使用\",\"type\": \"vector,embeddings\"},\n        {\"label\": \"tao-8k\", \"value\": \"tao-8k\",\"descr\": \"是由Huggingface开发者amu研发并开源的长文本向量表示模型,支持8k上下文长度,模型效果在C-MTEB上居前列,是当前最优的中文长文本embeddings模型之一\",\"type\": \"vector\"},\n        {\"label\": \"bge-large-zh\", \"value\": \"bge-large-zh\",\"descr\": \"是由智源研究院研发的中文版文本表示模型，可将任意文本映射为低维稠密向量，以用于检索、分类、聚类或语义匹配等任务，并可支持为大模型调用外部知识。\",\"type\": \"vector\"},\n        {\"label\": \"bge-large-en\", \"value\": \"bge-large-en\",\"descr\": \"是由智源研究院研发的英文版文本表示模型，可将任意文本映射为低维稠密向量，以用于检索、分类、聚类或语义匹配等任务，并可支持为大模型调用外部知识。\",\"type\": \"vector\"}\n      ],\n      \"type\": [\"LLM\", \"EMBED\"],\n      \"baseUrl\": \"https://aip.baidubce.com\",\n      \"LLMDefaultValue\": \"Yi-34B-Chat\",\n      \"EMBEDDefaultValue\": \"Embedding-V1\"\n    },\n    {\n      \"title\": \"智谱AI\",\n      \"value\": \"ZHIPU\",\n      \"LLM\": [\n        {\"label\": \"glm-4\", \"value\": \"glm-4\",\"descr\": \"是一个多模态大语言模型，主要用于处理复杂的指令和任务，支持长文本处理、多模态理解和文生图等功能\",\"type\": \"text,image\"},\n        {\"label\": \"glm-4v\", \"value\": \"glm-4v\",\"descr\": \"智谱：多模态模型\\n\\n更懂中文的视觉理解、文生图等多模态模型能力。准确理解各任务场景语言描述及指令，更精确的完成多模态理解类任务，或生成高质量的图片、视频等多模态内容。\",\"type\": \"text,image\"},\n        {\"label\": \"glm-4-flash\", \"value\": \"glm-4-flash\",\"descr\": \"该模型官方免费，主要用于处理多种自然语言处理任务，包括智能对话助手、辅助论文翻译、ppt及会议内容生产、网页智能搜索、数据生成和抽取、网页解析、智能规划和决策、辅助科研等场景\",\"type\": \"text\"},\n        {\"label\": \"glm-3-turbo\", \"value\": \"glm-3-turbo\",\"descr\": \"是一种基于transformer结构的语言模型，由智谱AI推出。其主要特点包括使用三层transformer结构、采用Turbo机制以实时生成文本、处理长文本输入并具有强大的语言理解能力\",\"type\": \"text\"}\n      ],\n      \"EMBED\": [\n        {\"label\": \"Embedding-3\", \"value\": \"Embedding-3\",\"descr\": \"主要用于文本搜索、聚类、推荐等任务。它通过将文本映射到低维向量空间，使得文本之间的语义关系可以通过向量之间的距离或相似度来衡量，从而支持各种基于向量的应用。\",\"type\": \"vector\"},\n        {\"label\": \"Embedding-2\", \"value\": \"Embedding-2\",\"descr\": \"用于将高维离散数据映射到低维连续数值向量中，以便机器学习模型能够更好地处理和理解这些数据\",\"type\": \"vector\"}\n      ],\n      \"IMAGE\": [\n        {\"label\": \"CogView-4\", \"value\": \"CogView-4\",\"descr\": \"智谱首个支持生成汉字的开源文生图模型，在语义理解、图像生成质量、中英文字生成能力等方面全面提升，支持任意长度的中英双语输入，能够生成在给定范围内的任意分辨率图像。\",\"type\": \"imageGen\"},\n        {\"label\": \"Cogview-3-Flash\", \"value\": \"Cogview-3-Flash\",\"descr\": \"是智谱推出的免费图像生成模型，能够根据用户指令生成符合要求且美学评分更高的图像。CogView-3-Flash 主要应用于艺术创作、设计参考、游戏开发、虚拟现实等领域，帮助用户快速实现从文本到图像的转换需求。\",\"type\": \"imageGen\"}\n      ],\n      \"type\": [\"LLM\", \"EMBED\", \"IMAGE\"],\n      \"baseUrl\": \"https://open.bigmodel.cn\",\n      \"LLMDefaultValue\": \"glm-4-flash\",\n      \"EMBEDDefaultValue\": \"Embedding-2\",\n      \"IMAGEDefaultValue\": \"CogView-4\"\n    }\n  ]\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aimodel/model.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { Modal } from 'ant-design-vue';\n\nenum Api {\n  list = '/airag/airagModel/list',\n  save = '/airag/airagModel/add',\n  testConn = '/airag/airagModel/test',\n  delete = '/airag/airagModel/delete',\n  queryById = '/airag/airagModel/queryById',\n  edit = '/airag/airagModel/edit',\n}\n\n/**\n * 查询AI模型\n * @param params\n */\nexport const list = (params) => {\n  return defHttp.get({ url: Api.list, params }, { isTransformResponse: false });\n};\n\n/**\n * 根据id查询AI模型\n * @param params\n */\nexport const queryById = (params) => {\n  return defHttp.get({ url: Api.queryById, params }, { isTransformResponse: false });\n};\n\n/**\n * 新增AI模型\n *\n * @param params\n */\nexport const saveModel = (params) => {\n  return defHttp.post({ url: Api.save, params });\n};\n\n/**\n * 编辑AI模型\n *\n * @param params\n */\nexport const editModel = (params) => {\n  return defHttp.put({ url: Api.edit, params });\n};\n\n/**\n * 测试链接\n *\n * @param params\n */\nexport const testConn = (params) => {\n  return defHttp.post({ url: Api.testConn, params, timeout: 2*60*1000 });\n};\n\n/**\n * 删除数据权限\n */\nexport const deleteModel = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除名称为' + params.name + '的模型吗？',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.delete, params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aimodel/model.data.ts",
    "content": "import { FormSchema } from '@/components/Form';\n\nimport anthropic from './icon/anthropic.png';\nimport deepspeek from './icon/deepspeek.png';\nimport ollama from './icon/ollama.png';\nimport OpenAi from './icon/OpenAi.png';\nimport qianfan from './icon/qianfan.png';\nimport qianwen from './icon/qianwen.png';\nimport zhipuai from './icon/zhipuai.png';\nimport { ref } from 'vue';\n\n/**\n * 表单\n */\nexport const formSchema: FormSchema[] = [\n  {\n    label: 'id',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '模型名称',\n    field: 'name',\n    required: true,\n    component: 'Input',\n  },\n  {\n    label: '模型类型',\n    field: 'modelType',\n    slot: 'modelType',\n    required: true,\n    component: 'Select',\n  },\n  {\n    label: '基础模型',\n    field: 'modelName',\n    required: true,\n    slot: 'modelName',\n    component: 'Select',\n  },\n  {\n    label: 'API域名',\n    field: 'baseUrl',\n    required: true,\n    component: 'Input'\n  },\n  {\n    label: 'API Key',\n    field: 'apiKey',\n    required: true,\n    component: 'InputPassword',\n    componentProps: {\n      autocomplete: 'new-password',\n    },\n    ifShow: ({ values }) => {\n      if(values.provider===\"OLLAMA\"){\n        return false;\n      }\n      return true;\n    },\n  },\n  {\n    label: 'Secret Key',\n    field: 'secretKey',\n    required: true,\n    component: 'InputPassword',\n    ifShow: ({ values }) => {\n      if(values.provider==='DEEPSEEK' || values.provider===\"OLLAMA\" || values.provider===\"OPENAI\"\n        || values.provider===\"ZHIPU\" || values.provider===\"QWEN\" || values.provider===\"ANTHROPIC\"){\n        return false;\n      }\n      return true;\n    },\n  },\n  {\n    label: '供应者',\n    field: 'provider',\n    component: 'Input',\n    show: false,\n  },\n];\n\n/**\n * 图片路径映射\n *\n * @param name\n */\nexport const imageList = ref<any>({\n  ANTHROPIC: anthropic,\n  DEEPSEEK: deepspeek,\n  OLLAMA: ollama,\n  OPENAI: OpenAi,\n  QIANFAN: qianfan,\n  QWEN: qianwen,\n  ZHIPU: zhipuai,\n});\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiposter/AiPoster.data.ts",
    "content": "import { FormSchema } from '@/components/Form';\n\nexport const formSchema: FormSchema[] = [\n  {\n    field: 'drawModelId',\n    label: '模型',\n    component: 'JDictSelectTag',\n    required: true,\n    helpMessage: [\n      '1、需要选择在模型中已有的图像模型',\n      '2、智普语言模型不支持尺寸设置',\n      \"3、openAi旧版模型如(dall-e-2)需要选择尺寸，新版模型直接输入'竖版: 9:16即可'\",\n      '4、当前只有千问万象模型(wanx2.1-imageedit,wan2.5-i2i-preview)支持图生图',\n      '5、wan2.5-i2i-preview支持多张图片',\n      '6、当前文生图openAi效果最佳',\n    ],\n    componentProps: {\n      dictCode: \"airag_model where model_type = 'IMAGE' and activate_flag = 1,name,id\",\n    },\n  },\n  {\n    field: 'content',\n    label: '提示词',\n    component: 'InputTextArea',\n    required: true,\n    componentProps: {\n      rows: 10,\n      placeholder: '请输入提示词，例如：一只可爱的猫咪，赛博朋克风格',\n    },\n  },\n  {\n    field: 'imageUrl',\n    label: '参考图',\n    component: 'JImageUpload',\n    componentProps: {\n      fileMax: 2,\n    },\n  },\n  {\n    field: 'imageSize',\n    label: '图片尺寸',\n    component: 'Select',\n    defaultValue: '1024*1024',\n    componentProps: {\n      options: [\n        { label: '1:1 (1024x1024)', value: '1024*1024' },\n        { label: '16:9 (1280x720)', value: '1280*720' },\n        { label: '9:16 (720x1280)', value: '720*1280' },\n        { label: '4:3 (1024x768)', value: '1024*768' },\n        { label: '3:4 (768x1024)', value: '768*1024' },\n      ],\n    },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiposter/AiPoster.vue",
    "content": "<template>\n  <div class=\"ai-poster-page\">\n    <div class=\"page-header\">\n      <span class=\"title\">AI 海报生成</span>\n      <span class=\"subtitle\">输入提示词，快速生成精美海报</span>\n    </div>\n\n    <div class=\"content-wrapper\">\n      <!-- 左侧模板选择 -->\n      <div class=\"template-panel\">\n        <div class=\"panel-title\">模板选择</div>\n        <div class=\"template-list\">\n          <div\n            v-for=\"item in templates\"\n            :key=\"item.id\"\n            class=\"template-item\"\n            :class=\"{ active: activeTemplateId === item.id }\"\n            @click=\"handleSelectTemplate(item)\"\n          >\n            <div class=\"template-cover\">\n              <img :src=\"item.url\" style=\"width: 100%\" />\n            </div>\n            <div class=\"template-name\">{{ item.name }}</div>\n          </div>\n        </div>\n      </div>\n      <!-- 中间参数配置 -->\n      <div class=\"config-panel\">\n        <div class=\"panel-title\">参数配置</div>\n        <div class=\"form-container\">\n          <BasicForm @register=\"registerForm\" />\n        </div>\n        <div class=\"action-container\">\n          <a-button type=\"primary\" size=\"large\" block @click=\"handleGenerate\" :loading=\"loading\">\n            <Icon icon=\"ant-design:thunderbolt-outlined\" />\n            立即生成\n          </a-button>\n        </div>\n      </div>\n\n      <!-- 右侧图片生成结果 -->\n      <div class=\"preview-panel\">\n        <div class=\"panel-title\">生成结果</div>\n        <div class=\"preview-content\">\n          <div v-if=\"!generatedImage && !loading\" class=\"empty-state\">\n            <Icon icon=\"ant-design:picture-outlined\" size=\"64\" color=\"#ccc\" />\n            <p>在左侧配置参数并点击生成</p>\n          </div>\n\n          <div v-if=\"loading\" class=\"loading-state\">\n            <a-spin size=\"large\" tip=\"正在绘制海报，请稍候...\" />\n          </div>\n\n          <div v-if=\"generatedImage\" class=\"result-image-wrapper group\">\n            <img :src=\"generatedImage\" class=\"result-image\" alt=\"Generated Poster\" />\n            <div class=\"image-actions\">\n              <a-button type=\"primary\" ghost @click=\"handlePreview\">\n                <Icon icon=\"ant-design:eye-outlined\" />\n                预览\n              </a-button>\n              <a-button type=\"primary\" ghost @click=\"handleDownload\">\n                <Icon icon=\"ant-design:download-outlined\" />\n                下载\n              </a-button>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <ImageViewer v-if=\"previewVisible\" :imageUrl=\"generatedImage\" @hide=\"previewVisible = false\" />\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import { BasicForm, useForm } from '@/components/Form';\n  import { formSchema } from './AiPoster.data';\n  import ImageViewer from '../aiapp/chat/components/ImageViewer.vue';\n  import { useMessage } from '@/hooks/web/useMessage';\n  import { Icon } from '@/components/Icon';\n  import { defHttp } from '@/utils/http/axios';\n  import { useGlobSetting } from '@/hooks/setting';\n\n  const { createMessage } = useMessage();\n  const loading = ref(false);\n  const generatedImage = ref('');\n  const previewVisible = ref(false);\n\n  const activeTemplateId = ref<number | null>(null);\n\n  const templates = [\n    {\n      id: 1,\n      name: '淡雅政务风',\n      prompt:\n        '淡雅政务风横版海报，主色调浅蓝 + 米白 + 淡灰，扁平化矢量风格，叠加细腻宣纸纹理；画面核心元素：简约政务办公楼轮廓（线条简洁）、金色钢笔、展开的公文册、淡蓝色祥云纹样、橄榄枝装饰；背景是米白渐变 + 浅蓝竖条肌理，点缀细金色边框；文字设计：居中用黑体写‘政务为民・高效规范’，下方配‘用心服务・务实笃行’浅蓝小字；整体氛围淡雅庄重、专业简洁，层次分明，光影柔和，高清细节，竖版 9:16 构图',\n      size: '720*1280',\n      url: 'https://minio.jeecg.com/otatest/simple_1767767784521.png',\n    },\n    {\n      id: 2,\n      name: '节日海报',\n      prompt:\n        '国潮中国风春节竖版海报，主色调红金 + 暖橙渐变，国潮插画风格，矢量扁平 + 柔和渐变质感，叠加细腻宣纸纹理；画面层次：前景是红色剪纸风梅花、金色福字贴纸、饱满水饺、红色灯笼串，中景是红墙金瓦的传统民居屋檐、飘带式祥云，远景是淡金色烟花绽放 + 暖红色光晕背景；点缀金色铜钱纹、折纸兔子、如意纹样；画面中央偏上用金色书法字体写‘新春大吉’，下方配\\'万事如意\\'四字楷书；整体氛围喜庆祥和、团圆温馨，层次分明主次清晰，光影柔和不刺眼，高清细节，竖版 9:16 构图',\n      url: 'https://minio.jeecg.com/otatest/image89444392111_1767844276342.png',\n      size: '720*1280',\n    },\n    {\n      id: 3,\n      name: '科技宣传',\n      prompt:\n        '未来科技感宣传海报，主色调蓝紫渐变 + 银白金属色，冷光霓虹光效，赛博朋克线条质感；画面核心元素：全息投影的地球数据模型、流动的蓝色数据流、发光的电路板纹理、悬浮的芯片与机械齿轮、未来感建筑轮廓；点缀粒子光效、透明全息界面、霓虹光带；文字设计：居中用未来感无衬线字体写‘科技赋能・智启新程’，下方配‘创新驱动・引领未来’小字，字体带轻微发光描边；整体氛围简洁高级、充满未来感，层次分明，光影锐利，高清细节，横版 16:9 构图',\n      size: '720*1280',\n      url: 'https://minio.jeecg.com/otatest/technology_1767765484936.png',\n    },\n    {\n      id: 4,\n      name: '优雅复古',\n      prompt:\n        '民国风优雅复古竖版海报，主色调米黄 + 豆沙红 + 墨黑，低饱和度胶片质感，叠加老报纸纹理与轻微颗粒感；画面核心元素：穿月白旗袍的女性侧影（盘发配珍珠发簪）、油纸伞、复古留声机、雕花木质窗棂、缠绕珍珠的藤蔓花纹；背景是模糊的老上海石库门建筑轮廓，点缀淡粉色玉兰花、复古字体排版的诗句（‘岁月静好，温婉如初’）；文字设计：上方用民国手写体写‘雅致时光’，下方配衬线字体‘复刻民国风雅’，字体带轻微做旧效果；整体氛围温婉知性、静谧典雅，光影柔和（侧光勾勒人物轮廓），层次分明，高清细节，竖版 9:16 构图',\n      size: '720*1280',\n      url: 'https://minio.jeecg.com/otatest/retro_1767765748402.png',\n    },\n    {\n      id: 5,\n      name: '赛博朋克',\n      prompt:\n        '国潮赛博朋克横版海报，主色调中国红 + 深空黑 + 鎏金霓虹，传统纹样与科技元素碰撞，叠加红金渐变光效 + 竹简纹理；画面核心元素：龙形霓虹光带（龙身缠绕电路板）、红墙金瓦的赛博风古建筑（屋檐挂霓虹灯笼）、穿汉服改良款的赛博人物（配发光发簪 / 机械袖）、全息投影的汉字霓虹灯牌（‘江湖’‘未来’）；点缀祥云数据流、金属质感的传统回纹、悬浮的鎏金元宝状机械装置；文字设计：上方用金色书法字体写‘赛博江湖’，下方配‘TECH & TRADITION’英文，字体带红金霓虹发光效果；整体氛围大气炫酷、传统与未来交融，光影强烈且富有冲击力，层次分明，高清细节，横版 16:9 构图',\n      size: '720*1280',\n      url: 'https://minio.jeecg.com/otatest/cyberpunk_1767766076979.png',\n    },\n  ];\n  const { domainUrl } = useGlobSetting();\n  const [registerForm, { validate, setFieldsValue }] = useForm({\n    schemas: formSchema,\n    labelWidth: 100,\n    actionColOptions: { span: 24 },\n    showActionButtonGroup: false,\n  });\n\n  /**\n   * 选中模板事件\n   * @param template\n   */\n  function handleSelectTemplate(template: any) {\n    activeTemplateId.value = template.id;\n    setFieldsValue({\n      content: template.prompt,\n      imageUrl: template.url,\n      imageSize: template.size,\n    });\n    createMessage.success(`已应用模板：${template.name}`);\n  }\n\n  async function handleGenerate() {\n    try {\n      const values = await validate();\n      console.log('Generating with values:', values);\n      loading.value = true;\n      generatedImage.value = '';\n\n      setTimeout(() => {\n        defHttp\n          .post({ url: '/airag/chat/genAiPoster', params: values, timeout: 5 * 60 * 1000 }, { isTransformResponse: false })\n          .then((res) => {\n            if (res.success) {\n              let reg = /#\\s*{\\s*domainURL\\s*}/g;\n              res.result = res.result.replace(reg, domainUrl + '/sys/common/static');\n              generatedImage.value = res.result;\n              createMessage.success('海报生成成功！');\n            } else {\n              createMessage.warning('海报生成失败！');\n            }\n          })\n          .finally(() => {\n            loading.value = false;\n          });\n      }, 2000);\n    } catch (error) {\n      console.error('Validation failed:', error);\n    }\n  }\n\n  function handlePreview() {\n    previewVisible.value = true;\n  }\n\n  /**\n   * 图片导出\n   */\n  function handleDownload() {\n    if (!generatedImage.value) {\n      return;\n    }\n    const a = document.createElement('a');\n    a.href = generatedImage.value;\n    a.download = `ai-poster-${Date.now()}.jpg`;\n    a.target = '_blank';\n    a.click();\n  }\n</script>\n\n<style lang=\"less\" scoped>\n  .ai-poster-page {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    padding: 16px;\n    background-color: #f0f2f5;\n    display: flex;\n    flex-direction: column;\n    box-sizing: border-box;\n    overflow: hidden;\n\n    .page-header {\n      margin-bottom: 16px;\n      background: #fff;\n      padding: 16px 24px;\n      border-radius: 8px;\n\n      .title {\n        font-size: 20px;\n        font-weight: 600;\n        color: #1f2329;\n        margin-right: 12px;\n      }\n\n      .subtitle {\n        color: #8f959e;\n        font-size: 14px;\n      }\n    }\n\n    .content-wrapper {\n      flex: 1;\n      display: flex;\n      gap: 16px;\n      overflow: hidden;\n    }\n\n    .template-panel {\n      width: 200px;\n      min-width: 180px;\n      background: #fff;\n      border-radius: 8px;\n      display: flex;\n      flex-direction: column;\n      padding: 12px;\n      overflow-y: auto;\n\n      .template-list {\n        display: flex;\n        flex-direction: column;\n        gap: 10px;\n      }\n\n      .template-item {\n        border: 1px solid #f0f0f0;\n        border-radius: 6px;\n        padding: 8px;\n        cursor: pointer;\n        transition: all 0.3s;\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        gap: 6px;\n\n        &:hover {\n          border-color: #1890ff;\n          box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);\n        }\n\n        &.active {\n          border-color: #1890ff;\n          background-color: #e6f7ff;\n        }\n\n        .template-cover {\n          width: 100%;\n          aspect-ratio: 9 / 16;\n          height: auto;\n          background-color: #f5f5f5;\n          border-radius: 4px;\n          display: flex;\n          align-items: center;\n          justify-content: center;\n          color: #8c8c8c;\n          overflow: hidden;\n\n          img {\n            width: 100%;\n            height: 100%;\n            object-fit: cover;\n            border-radius: 4px;\n            display: block;\n          }\n        }\n\n        .template-name {\n          font-size: 14px;\n          color: #1f2329;\n          text-align: center;\n          max-width: 100%;\n          white-space: nowrap;\n          overflow: hidden;\n          text-overflow: ellipsis;\n        }\n      }\n    }\n\n    .config-panel {\n      width: 550px;\n      min-width: 350px;\n      background: #fff;\n      border-radius: 8px;\n      display: flex;\n      flex-direction: column;\n      padding: 20px;\n      overflow: hidden;\n\n      .form-container {\n        flex: 1;\n        overflow-y: auto;\n      }\n\n      .action-container {\n        margin-top: 20px;\n        padding-top: 20px;\n        border-top: 1px solid #f0f0f0;\n      }\n    }\n\n    .preview-panel {\n      flex: 1;\n      background: #fff;\n      border-radius: 8px;\n      display: flex;\n      flex-direction: column;\n      padding: 20px;\n      overflow: hidden;\n\n      .preview-content {\n        flex: 1;\n        background: #f7f8fc;\n        border-radius: 8px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        overflow: hidden;\n        position: relative;\n      }\n    }\n\n    .panel-title {\n      font-size: 16px;\n      font-weight: 600;\n      color: #1f2329;\n      margin-bottom: 20px;\n      padding-left: 8px;\n      border-left: 4px solid #1890ff;\n      line-height: 1;\n    }\n\n    .empty-state {\n      text-align: center;\n      color: #8f959e;\n\n      p {\n        margin-top: 16px;\n      }\n    }\n\n    .loading-state {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n    }\n\n    .result-image-wrapper {\n      position: relative;\n      width: 100%;\n      height: 100%;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n\n      .result-image {\n        width: 100%;\n        height: 100%;\n        border-radius: 8px;\n        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n        object-fit: contain;\n      }\n\n      .image-actions {\n        position: absolute;\n        inset: 0;\n        background: rgba(0, 0, 0, 0.4);\n        display: none;\n        align-items: center;\n        justify-content: center;\n        gap: 16px;\n        border-radius: 8px;\n        backdrop-filter: blur(2px);\n      }\n\n      &:hover .image-actions {\n        display: flex;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiprompts/AiragExtData.api.ts",
    "content": "import {defHttp} from '/@/utils/http/axios';\nimport { useMessage } from \"/@/hooks/web/useMessage\";\n\nconst { createConfirm } = useMessage();\n\nenum Api {\n  list = '/airag/extData/list',\n  queryById = '/airag/extData/queryById',\n  save='/airag/extData/add',\n  edit='/airag/extData/edit',\n  deleteOne = '/airag/extData/delete',\n  deleteBatch = '/airag/extData/deleteBatch',\n  importExcel = '/airag/extData/importExcel',\n  exportXls = '/airag/extData/exportXls',\n  debugEvaluator = '/airag/extData/evaluator/debug',\n\n  queryTrackById = '/airag/extData/queryTrackById',\n  getTrackList = '/airag/extData/getTrackList',\n}\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) =>\n  defHttp.get({url: Api.list, params});\n/**\n * 调用轨迹接口\n * @param params\n */\nexport const getTrackList = (params) =>\n  defHttp.get({url: Api.getTrackList, params});\n/**\n * 根据数据集id查询数据\n * @param params\n */\nexport const queryById = (params) =>\n  defHttp.get({url: Api.queryById, params},{isTransformResponse: false});\n/**\n * 根据数据集id查询数据\n * @param params\n */\nexport const queryTrackById = (params) =>\n  defHttp.get({url: Api.queryTrackById, params},{isTransformResponse: false});\n\n/**\n * 删除单个\n */\nexport const deleteOne = (params,handleSuccess) => {\n  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n/**\n * 批量删除\n * @param params\n */\nexport const batchDelete = (params, handleSuccess) => {\n  createConfirm({\n    iconType: 'warning',\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n/**\n * 保存或者更新\n * @param params\n */\nexport const saveOrUpdate = (params, isUpdate,showSuccessMsg=true) => {\n  const url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({url: url, params},{successMessageMode:showSuccessMsg?'success':'none'});\n}\n/**\n * 調試\n * @param params\n */\nexport const debugEvaluator = (params) => {\n  return defHttp.post({url: Api.debugEvaluator, params},{ isTransformResponse: false });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiprompts/AiragExtData.data.ts",
    "content": "import { BasicColumn } from '/@/components/Table';\nimport { FormSchema } from '/@/components/Table';\n//列表数据\nexport const columns: BasicColumn[] = [\n  {\n    title: '名称',\n    align: 'center',\n    dataIndex: 'name',\n  },\n  {\n    title: '描述信息',\n    align: 'center',\n    dataIndex: 'descr',\n  },\n];\n//查询数据\nexport const searchFormSchema: FormSchema[] = [\n  {\n    label: '名称',\n    field: 'name',\n    component: 'Input',\n    colProps: {\n      span: 6,\n    },\n  },\n];\n//表单数据\nexport const formSchema: FormSchema[] = [\n  {\n    label: '业务类型标识',\n    field: 'bizType',\n    component: 'Input',\n    defaultValue: 'evaluator',\n    show: false,\n  },\n  {\n    label: '名称',\n    field: 'name',\n    component: 'Input',\n  },\n  {\n    label: '描述信息',\n    field: 'descr',\n    component: 'InputTextArea',\n  },\n  {\n    label: '',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n];\n\n/**\n * 流程表单调用这个方法获取formSchema\n * @param param\n */\nexport function getBpmFormSchema(_formData): FormSchema[] {\n  // 默认和原始表单保持一致 如果流程中配置了权限数据，这里需要单独处理formSchema\n  return formSchema;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiprompts/AiragExtDataExperiment.vue",
    "content": "<template>\n  <a-card class=\"ai-prompts-info\">\n    <AiragExtDataList ref=\"processRef\" v-if=\"activeKey==='evaluator'\"></AiragExtDataList>\n  </a-card>\n</template>\n\n<script lang=\"ts\" setup>\n/**\n * 评估器 evaluator\n * 评测集 evaluationSet\n * 实验 experiment\n */\nimport { ref, onMounted } from 'vue';\nimport AiragExtDataList from './AiragExtDataList.vue'\n\n/**\n * 评估器 evaluator\n * 评测集 evaluationSet\n * 实验 experiment\n */\nconst activeKey = ref('evaluator');\n/**\n * 切换tab\n */\nfunction handleChangePanel(key) {\n  activeKey.value = key;\n}\n\nonMounted(()=>{\n  activeKey.value = 'evaluator';\n});\n</script>\n\n<style scoped lang=\"less\">\n.ai-prompts-info {\n  margin: 10px;\n  :deep(.ant-card-body) {\n    padding: 12px 8px;\n  }\n  :deep(.ant-tabs-tabpane) {\n    padding-left: 12px !important;\n  }\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiprompts/AiragExtDataList.vue",
    "content": "<template>\n  <div>\n    <!--引用表格-->\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-button type=\"primary\" @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\"> 新增</a-button>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\" />\n      </template>\n    </BasicTable>\n    <!-- 表单区域 -->\n    <AiragExtDataModal @register=\"registerModal\" @success=\"handleSuccess\"></AiragExtDataModal>\n    <!-- 评测集 -->\n    <AiragDataSetModal @register=\"registerDataSetModal\" @success=\"handleSuccess\"></AiragDataSetModal>\n    <!-- 评估器配置 -->\n    <AiEvaluatorSettingModal @register=\"registerEvaluatorModal\" @success=\"handleSuccess\"></AiEvaluatorSettingModal>\n    <!-- 调试配置 -->\n    <AiEvaluatorDebugModal @register=\"registerDebugModal\" @success=\"handleSuccess\"></AiEvaluatorDebugModal>\n    <!-- 调用记录 -->\n    <AiragInvokeRecordsDrawer @register=\"registerRecordsModal\" @success=\"handleSuccess\"></AiragInvokeRecordsDrawer>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"prompts-airagExtData\" setup>\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import { useDrawer } from '/@/components/Drawer';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import AiragExtDataModal from './components/AiragExtDataModal.vue';\n  import AiragDataSetModal from './components/AiragDataSetModal.vue';\n  import AiEvaluatorSettingModal from './components/AiEvaluatorSettingModal.vue';\n  import AiEvaluatorDebugModal from './components/AiEvaluatorDebugModal.vue';\n  import AiragInvokeRecordsDrawer from './components/AiragInvokeRecordsDrawer.vue';\n  import { columns, searchFormSchema } from './AiragExtData.data';\n  import { list, deleteOne } from './AiragExtData.api';\n  //注册model\n  const [registerModal, { openModal }] = useModal();\n  //注册评测集model\n  const [registerDataSetModal, { openModal:openDataSetModal }] = useModal();\n  //注册评估器model\n  const [registerEvaluatorModal, { openModal:openEvaluatorModal }] = useModal();\n  //注册评估器model\n  const [registerDebugModal, { openModal:openDebugModal }] = useModal();\n  //注册调用记录model\n  const [registerRecordsModal, { openDrawer:openRecordsDrawer }] = useDrawer();\n  const { tableContext } = useListPage({\n    tableProps: {\n      title: 'airag_ext_data',\n      api: list,\n      columns,\n      canResize: true,\n      formConfig: {\n        schemas: searchFormSchema,\n        autoSubmitOnEnter: true,\n        showAdvancedButton: true,\n        fieldMapToNumber: [],\n        fieldMapToTime: [],\n      },\n      actionColumn: {\n        width: 120,\n        fixed: 'right',\n      },\n    },\n  });\n\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;\n\n  /**\n   * 新增事件\n   */\n  function handleAdd() {\n    openModal(true, {\n      isUpdate: false,\n      showFooter: true,\n    });\n  }\n  /**\n   * 编辑事件\n   */\n  function handleEdit(record: Recordable) {\n    openEvaluatorModal(true, {\n      record,\n      isUpdate: true,\n      showFooter: true,\n    });\n  }\n  /**\n   * 详情\n   */\n  function handleDateSet(record: Recordable) {\n    openDataSetModal(true, {\n      record,\n    });\n  }\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteOne({ id: record.id }, handleSuccess);\n  }\n  /**\n   * 调试事件\n   */\n  async function handleDebug(record) {\n    openDebugModal(true, {\n      record,\n    });\n  }\n  /**\n   * 调试事件\n   */\n  async function handleRecords(record) {\n    openRecordsDrawer(true, {\n      record,\n    });\n  }\n  /**\n   * 成功回调\n   */\n  function handleSuccess() {\n    (selectedRowKeys.value = []) && reload();\n  }\n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '配置',\n        onClick: handleEdit.bind(null, record),\n      }\n    ];\n  }\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record) {\n    return [\n      {\n        label: '评测集',\n        onClick: handleDateSet.bind(null, record),\n      },\n      {\n        label: '调试',\n        onClick: handleDebug.bind(null, record),\n      },\n      {\n        label: '调用记录',\n        onClick: handleRecords.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft',\n        },\n      },\n    ];\n  }\n</script>\n\n<style lang=\"less\" scoped>\n  :deep(.ant-picker),\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiprompts/AiragPrompts.api.ts",
    "content": "import {defHttp} from '/@/utils/http/axios';\nimport { useMessage } from \"/@/hooks/web/useMessage\";\n\nconst { createConfirm } = useMessage();\n\nenum Api {\n  list = '/airag/prompts/list',\n  save='/airag/prompts/add',\n  edit='/airag/prompts/edit',\n  deleteOne = '/airag/prompts/delete',\n  deleteBatch = '/airag/prompts/deleteBatch',\n  importExcel = '/airag/prompts/importExcel',\n  exportXls = '/airag/prompts/exportXls',\n\n  promptExperiment = '/airag/prompts/experiment',\n}\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) =>\n  defHttp.get({url: Api.list, params});\n\n/**\n * 删除单个\n */\nexport const deleteOne = (params,handleSuccess) => {\n  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n/**\n * 批量删除\n * @param params\n */\nexport const batchDelete = (params, handleSuccess) => {\n  createConfirm({\n    iconType: 'warning',\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n/**\n * 保存或者更新\n * @param params\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({url: url, params});\n}\n/**\n * 实验\n * @param params\n */\nexport const promptExperiment = (params) => {\n  return defHttp.post({url: Api.promptExperiment, params},{ isTransformResponse: false });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiprompts/AiragPrompts.data.ts",
    "content": "import { BasicColumn } from '/@/components/Table';\nimport { FormSchema } from '/@/components/Table';\nimport {duplicateCheckDelay} from \"@/views/system/user/user.api\";\nexport const DESFORM_NAME_MAX_LENGTH = 40;\nimport {pinyin} from \"pinyin-pro\";\n//列表数据\nexport const columns: BasicColumn[] = [\n  {\n    title: '名称',\n    align: 'center',\n    dataIndex: 'name',\n  },\n  {\n    title: '功能描述',\n    align: 'center',\n    dataIndex: 'description',\n  },\n  // {\n  //   title: '状态',\n  //   align: 'center',\n  //   dataIndex: 'status',\n  // },\n  {\n    title: '最近提交人',\n    align: 'center',\n    dataIndex: 'updateBy',\n  },\n  {\n    title: '最近提交时间',\n    align: 'center',\n    dataIndex: 'updateTime',\n  },\n  {\n    title: '创建人',\n    align: 'center',\n    dataIndex: 'createBy',\n  },\n  {\n    title: '创建时间',\n    align: 'center',\n    dataIndex: 'createTime',\n  }\n];\n//查询数据\nexport const searchFormSchema: FormSchema[] = [\n    {\n      label: '名称',\n      field: 'name',\n      component: 'Input',\n    },\n];\n// 名称最大长度\nexport const NAME_MAX_LENGTH = 40;\n// 编码最大长度\nexport const CODE_MAX_LENGTH = 50;\n//表单数据\nexport const formSchema: FormSchema[] = [\n  {\n    label: '名称',\n    field: 'name',\n    component: 'Input',\n    componentProps: ({ formModel }) => {\n      return {\n        placeholder: '例如：SQL转换',\n        maxlength: DESFORM_NAME_MAX_LENGTH,\n        showCount: true,\n        onChange: (e: ChangeEvent) => {\n          if(formModel.id){\n            return\n          }\n          let code = pinyin(e.target.value, {\n            toneType: 'none',\n            type: 'array',\n            nonZh: 'consecutive',\n          }).join('_');\n          code = code.replace(/[^a-zA-Z0-9_\\-]/g, '');\n          formModel.promptKey = code;\n        },\n      };\n    },\n    dynamicRules() {\n      return [\n        {required: true, message: '请输入提示词名称'},\n        {\n          max: NAME_MAX_LENGTH,\n          message: `名称长度不能超过${NAME_MAX_LENGTH}个字符`,\n        },\n      ];\n    }\n  },\n  {\n    label: '提示词编码',\n    field: 'promptKey',\n    component: 'Input',\n    dynamicRules({ model }) {\n      return [\n        { required: true, message: '提示词编码' },\n        {\n          async validator(_, value) {\n            if (value?.length > CODE_MAX_LENGTH) {\n              throw `编码长度不能超过${CODE_MAX_LENGTH}个字符`;\n            }\n            const pattern = /^[a-z|A-Z][a-z|A-Z\\d_-]*$/;\n            if (!pattern.test(value)) {\n              throw '编码必须以字母开头，可包含数字、下划线、横杠';\n            } else if (/[A-Z]/.test(value)) {\n              throw '不支持大写字母';\n            } else {\n              const res = await duplicateCheckDelay({\n                tableName: 'airag_prompts',\n                fieldName: 'prompt_key',\n                fieldVal: value,\n                dataId: model.id,\n              }) as any;\n              if (!res.success) {\n                throw '表单编码已存在！';\n              }\n            }\n          },\n        },\n      ];\n    }\n  },\n  {\n    label: '提示词功能描述',\n    field: 'description',\n    component: 'InputTextArea',\n  },\n  {\n    label: '',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n];\n\n/**\n * 流程表单调用这个方法获取formSchema\n * @param param\n */\nexport function getBpmFormSchema(_formData): FormSchema[] {\n  // 默认和原始表单保持一致 如果流程中配置了权限数据，这里需要单独处理formSchema\n  return formSchema;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiprompts/AiragPromptsList.vue",
    "content": "<template>\n  <div>\n    <!--引用表格-->\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-button type=\"primary\" @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\">新增</a-button>\n\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button v-auth=\"'prompts:airag_prompts:deleteBatch'\"\n            >批量操作\n            <Icon icon=\"mdi:chevron-down\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\" />\n      </template>\n    </BasicTable>\n    <!-- 表单区域 -->\n    <AiragPromptsModal @register=\"registerModal\" @success=\"handleSuccess\"></AiragPromptsModal>\n    <!-- 表单区域 -->\n    <AiPromptSettingModal @register=\"registerSettingModal\" @success=\"handleSuccess\"></AiPromptSettingModal>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"prompts-airagPrompts\" setup>\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import AiragPromptsModal from './components/AiragPromptsModal.vue';\n  import AiPromptSettingModal from './components/AiPromptSettingModal.vue';\n  import { columns, searchFormSchema } from './AiragPrompts.data';\n  import { list, deleteOne, batchDelete, getImportUrl, getExportUrl } from './AiragPrompts.api';\n  //注册model\n  const [registerModal, { openModal }] = useModal();\n  //注册model\n  const [registerSettingModal, { openModal: openSettingModal }] = useModal();\n  //注册table数据\n  const { tableContext } = useListPage({\n    tableProps: {\n      title: 'airag_prompts',\n      api: list,\n      columns,\n      canResize: true,\n      formConfig: {\n        //labelWidth: 120,\n        schemas: searchFormSchema,\n        autoSubmitOnEnter: true,\n        showAdvancedButton: true,\n        fieldMapToNumber: [],\n        fieldMapToTime: [],\n      },\n      actionColumn: {\n        width: 120,\n        fixed: 'right',\n      },\n    },\n    exportConfig: {\n      name: 'airag_prompts',\n      url: getExportUrl,\n    },\n    importConfig: {\n      url: getImportUrl,\n      success: handleSuccess,\n    },\n  });\n\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;\n\n  /**\n   * 新增事件\n   */\n  function handleAdd() {\n    openModal(true, {\n      isUpdate: false,\n      showFooter: true,\n    });\n  }\n  /**\n   * 编辑事件\n   */\n  function handleEdit(record: Recordable) {\n    openSettingModal(true, {\n      record,\n      isUpdate: true,\n      showFooter: true,\n    });\n  }\n  /**\n   * 详情\n   */\n  function handleDetail(record: Recordable) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n      showFooter: false,\n    });\n  }\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteOne({ id: record.id }, handleSuccess);\n  }\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDelete({ ids: selectedRowKeys.value }, handleSuccess);\n  }\n  /**\n   * 成功回调\n   */\n  function handleSuccess() {\n    (selectedRowKeys.value = []) && reload();\n  }\n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '配置',\n        onClick: handleEdit.bind(null, record),\n      },\n    ];\n  }\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record) {\n    return [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft',\n        },\n      },\n    ];\n  }\n</script>\n\n<style lang=\"less\" scoped>\n  :deep(.ant-picker),\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiprompts/components/AiEvaluatorDebugModal.vue",
    "content": "<template>\n  <BasicModal\n    v-bind=\"$attrs\"\n    @register=\"registerModal\"\n    :canFullscreen=\"true\"\n    defaultFullscreen\n    destroyOnClose\n    title=\"评测调试\"\n    :showOkBtn=\"false\"\n    :showCancelBtn=\"false\"\n    wrapClassName=\"evaluator-debug-modal\"\n  >\n    <!-- 步骤条 -->\n    <a-steps :current=\"currentStep\" class=\"steps-container\">\n      <a-step title=\"选择提示词\">\n        <template #icon>\n          <Icon icon=\"ant-design:file-search-outlined\" />\n        </template>\n      </a-step>\n      <a-step title=\"调试配置\">\n        <template #icon>\n          <Icon icon=\"ant-design:setting-outlined\" />\n        </template>\n      </a-step>\n    </a-steps>\n\n    <!-- 第一步：选择提示词和字段映射 -->\n    <div v-show=\"currentStep === 0\" class=\"step-content step-one\">\n      <div class=\"form-section\">\n        <div class=\"form-item\">\n          <label class=\"form-label\">选择提示词：</label>\n          <a-select v-model:value=\"selectedPromptKey\" placeholder=\"请选择提示词\" class=\"prompt-select\" @change=\"onPromptChange\">\n            <a-select-option v-for=\"prompt in promptOptions\" :key=\"prompt.key\" :value=\"prompt.key\">\n              <span class=\"prompt-option\">\n                <Icon icon=\"ant-design:file-text-outlined\" />\n                {{ prompt.name }}\n              </span>\n            </a-select-option>\n          </a-select>\n        </div>\n\n        <div class=\"mapping-section\" v-if=\"selectedPromptKey\">\n          <div class=\"section-header\">\n            <h3>\n              <Icon icon=\"ant-design:link-outlined\" />\n              字段映射关系\n            </h3>\n          </div>\n          <div class=\"mapping-list\">\n            <div class=\"mapping-item\">\n              <div class=\"field-label\">\n                <Icon icon=\"ant-design:tag-outlined\" />\n                用户输入[user_query]\n              </div>\n              <div class=\"equal-sign\">=</div>\n              <a-select allow-clear v-model:value=\"fieldMappings['user_query']\" placeholder=\"请选择数据集字段\" class=\"field-select\">\n                <a-select-option v-for=\"column in datasetColumns\" :key=\"column.key\" :value=\"column.key\">\n                  <span class=\"column-option\">\n                    <span style=\"color:blue\">评测集</span>\n                    <span> [{{ column.title }}]</span>\n                    <span style=\"margin-left: 5px\">\n                      <a-tooltip :title=\"column.description\"><Icon icon=\"ant-design:info-circle-outlined\" size=\"14\" /></a-tooltip>\n                    </span>\n                  </span>\n                </a-select-option>\n              </a-select>\n            </div>\n            <div class=\"mapping-item\" v-for=\"(item, index) in promptParams\" :key=\"index\">\n              <div class=\"field-label\">\n                <Icon icon=\"ant-design:tag-outlined\" />\n                变量[{{ item.name }}]\n              </div>\n              <div class=\"equal-sign\">=</div>\n              <a-select allow-clear v-model:value=\"fieldMappings[item.name]\" placeholder=\"请选择数据集字段\" class=\"field-select\">\n                <a-select-option v-for=\"column in datasetColumns\" :key=\"column.key\" :value=\"column.key\">\n                  <span class=\"column-option\">\n                    <span style=\"color:blue\">评测集</span>\n                    <span> [{{ column.title }}]</span>\n                    <span style=\"margin-left: 5px\">\n                      <a-tooltip :title=\"column.description\"><Icon icon=\"ant-design:info-circle-outlined\" size=\"14\" /></a-tooltip>\n                    </span>\n                  </span>\n                </a-select-option>\n              </a-select>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"form-footer\">\n        <a-button @click=\"closeModal\" class=\"footer-btn cancel-btn\">\n          <Icon icon=\"ant-design:close-circle-outlined\" />\n          取消\n        </a-button>\n        <a-button type=\"primary\" @click=\"nextStep\" :disabled=\"!selectedPromptKey || !fieldMappings['user_query']\" class=\"footer-btn next-btn\">\n          <Icon icon=\"ant-design:right-circle-outlined\" />\n          下一步\n        </a-button>\n      </div>\n    </div>\n\n    <!-- 第二步：调试配置和结果显示 -->\n    <div v-show=\"currentStep === 1\" class=\"step-content step-two\">\n      <div class=\"form-section\">\n        <div class=\"mapping-section\">\n          <div class=\"section-header\">\n            <h3>\n              <Icon icon=\"ant-design:link-outlined\" />\n              字段映射\n            </h3>\n          </div>\n          <div class=\"mapping-list\">\n            <div class=\"mapping-item\" v-for=\"(item, index) in evaluatorFields\" :key=\"index\">\n              <div class=\"field-label\">\n                <Icon icon=\"ant-design:tag-outlined\" />\n                评估器 [{{ item.field }}]\n              </div>\n              <div class=\"equal-sign\">=</div>\n              <a-select allow-clear v-model:value=\"fieldMappings[item.field]\" placeholder=\"请选择数据集字段\" class=\"field-select\">\n                <a-select-option v-for=\"column in evaluatorColumns\" :key=\"column.name\" :value=\"column.name\">\n                  <span class=\"column-option\">\n<!--                    <a-divider style=\"margin:4px 0;\" v-if=\"column.label\" />-->\n                    <span :style=\"{color:column.label ? 'green' : 'blue'}\"> [{{ column.label || '评测集' }}] </span>\n                    <span>{{ column.name }}</span>\n                    <span style=\"margin-left: 5px\">\n                      <a-tooltip :title=\"column.description\">\n                        <Icon icon=\"ant-design:info-circle-outlined\" size=\"14\"/>\n                      </a-tooltip>\n                    </span>\n                  </span>\n                </a-select-option>\n              </a-select>\n            </div>\n          </div>\n        </div>\n\n        <div class=\"debug-result\" v-if=\"debugResult.length > 0 || confirmLoading\">\n          <div class=\"section-header\">\n            <h3>\n              <Icon icon=\"ant-design:bar-chart-outlined\" />\n              调试结果\n            </h3>\n          </div>\n          <div class=\"debug-result-container\">\n            <!-- 条件渲染，当有调试结果时显示表格 -->\n            <div class=\"result-table-container\" v-if=\"debugResult.length > 0\">\n              <!-- 添加外部容器和标题 -->\n              <div class=\"table-header\">\n                <div class=\"table-title\" v-if=\"!confirmLoading\">调试结果</div>\n                <div class=\"table-title\"  v-if=\"confirmLoading\"><span>实验初始化中，请稍后点击<a href=\"javascript:void(0)\" @click=\"handleReload\">刷新</a></span></div>\n                <div class=\"table-subtitle\">实际输出与参考输出对比</div>\n              </div>\n\n              <!-- 表格区域 -->\n              <a-table\n                :columns=\"resultColumns\"\n                :dataSource=\"debugResult\"\n                :pagination=\"false\"\n                :scroll=\"{ x: 'max-content' }\"\n                class=\"result-table\"\n                :rowClassName=\"setRowClassName\"\n              >\n                <!-- 自定义单元格渲染 -->\n                <template #bodyCell=\"{ column, record, text }\">\n                  <!-- 状态列特殊样式 -->\n                  <template v-if=\"column.dataIndex === 'status'\">\n                    <span :class=\"['status-badge', getStatusClass(record)]\">\n                      {{ text }}\n                    </span>\n                  </template>\n                </template>\n              </a-table>\n            </div>\n\n            <!-- 无数据时显示加载或提示 -->\n            <div v-else class=\"no-data-container\">\n              <div class=\"loading-text\" v-if=\"confirmLoading\">\n                <loading-outlined style=\"font-size: 24px; margin-right: 8px\" @click=\"handleReload\" />\n                <span>实验初始化中，请稍后点击<a href=\"javascript:void(0)\" @click=\"handleReload\">刷新</a></span>\n              </div>\n              <div class=\"empty-text\" v-else> 暂无调试结果 </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"form-footer\">\n        <a-button @click=\"prevStep\" class=\"footer-btn prev-btn\">\n          <Icon icon=\"ant-design:left-circle-outlined\" />\n          上一步\n        </a-button>\n        <a-button v-if=\"debugResult.length == 0\"  :disabled=\"canConfirmDebug\" :loading=\"confirmLoading\" type=\"primary\" @click=\"confirmDebug\" class=\"footer-btn confirm-btn\">\n          <Icon v-if=\"!confirmLoading\" icon=\"ant-design:play-circle-outlined\" />\n          {{ confirmLoading ? '正在调试...' : '确认调试配置' }}\n        </a-button>\n        <a-button v-if=\"debugResult.length > 0\" @click=\"closeModal\" class=\"footer-btn close-btn\">\n          <Icon icon=\"ant-design:check-circle-outlined\" />\n          完成\n        </a-button>\n      </div>\n    </div>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, reactive,computed  } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import Icon from '/@/components/Icon/src/Icon.vue';\n  import { list, promptExperiment } from '../AiragPrompts.api';\n  import { useMessage } from '@/hooks/web/useMessage';\n  import { queryTrackById } from '@/views/super/airag/aiprompts/AiragExtData.api';\n  import { LoadingOutlined } from '@ant-design/icons-vue';\n  // Emits声明\n  const emit = defineEmits(['register', 'success']);\n  // 确认调试配置加载状态\n  const confirmLoading = ref(false);\n  // 提示信息\n  const { createMessage } = useMessage();\n  //核心数据\n  const record = ref<any>({});\n  // 步骤控制\n  const currentStep = ref(0);\n  // 选择调试的提示词\n  const selectedPromptKey = ref<string>('');\n  const selectedPrompt = ref<any>({});\n  // 评估器字段配置\n  const evaluatorFields = ref<any>([]);\n  // 评估器下拉列配置\n  const evaluatorColumns = ref<any>([]);\n  //字段映射\n  const fieldMappings = reactive<Record<string, string>>({});\n  //页码配置\n  const page = ref({\n    pageNo: 1,\n    pageSize: 10,\n  });\n  // 提示词选项数据\n  const promptOptions = ref<any[]>([]);\n  // 数据集列\n  const datasetColumns = ref<any[]>([]);\n  // 提示词参数\n  const promptParams = ref<any[]>([]);\n  // 调试结果\n  const debugResult = ref<any[]>([]);\n  // 结果表格列\n  const resultColumns = ref<any[]>([\n    { title: '问题', dataIndex: 'userQuery', key: 'userQuery',fixed: 'left' },\n    { title: '提示词输出答案', dataIndex: 'promptAnswer', key: 'promptAnswer',fixed: 'left' },\n    { title: '评分', dataIndex: 'answerScore', key: 'answerScore',fixed: 'left' },\n  ]);\n\n  // 确认调试配置\n  const canConfirmDebug = computed(() => {\n    let canConfirm = true;\n    evaluatorFields.value.forEach((field) => {\n      if(!fieldMappings[field.name]){\n        canConfirm = false;\n      }\n    });\n    return canConfirm;\n  });\n  // 表单赋值\n  const [registerModal, { closeModal }] = useModalInner(async (data) => {\n    //调试数据\n    record.value = data.record;\n    //重置数据\n    resetForm();\n    //查询提示词\n    await getPromptList();\n    //查询测评列配置\n    getDatasetColumns();\n    //查询评估器字段配置\n    getEvaluatorFields();\n    console.log('evaluatorColumns.value', evaluatorColumns.value);\n  });\n\n  /**\n   * 获取数据集列字段\n   */\n  function getDatasetColumns() {\n    let datasetValue = record.value?.datasetValue;\n    if (datasetValue) {\n      let columns = JSON.parse(datasetValue).columns;\n      columns.forEach((item) => {\n        if(item.name !== 'action') {\n          datasetColumns.value.push({ ...item, key: item.name, title: item.name });\n          evaluatorColumns.value.push({ ...item });\n          if(!resultColumns.value.some(a=> a.dataIndex === item.name)){\n            resultColumns.value.push({ title: item.name, dataIndex: item.name, key: item.name });\n          }\n        }\n      });\n    } else {\n      createMessage.warning('未配置评测集信息！');\n    }\n  }\n  /**\n   * 获取数据集列字段\n   */\n  function getEvaluatorFields() {\n    let dataValue = record.value?.dataValue;\n    if (dataValue) {\n      evaluatorFields.value = dataValue.match(/{{\\s*([^}\\s]+)\\s*}}/g).map((match) => ({ field: match.replace(/{{\\s*|\\s*}}/g, '') }));\n    } else {\n      createMessage.warning('未配置评测集信息！');\n    }\n    //列配置\n    evaluatorColumns.value.push({ name: 'actual_output', label: '评测对象', description: '实际输出', dateType: 'String' });\n  }\n\n  /**\n   * 获取提示词\n   */\n  async function getPromptList() {\n    const res = await list({ ...page });\n    if (res?.records) {\n      res?.records.forEach((item) => {\n        promptOptions.value.push({ name: item.name, key: item.promptKey, value: item.promptKey, ...item });\n      });\n    }\n  }\n  // 重置表单\n  function resetForm() {\n    currentStep.value = 0;\n    selectedPromptKey.value = '';\n    promptOptions.value = [];\n    datasetColumns.value = [];\n    promptParams.value = [];\n    evaluatorColumns.value = [];\n    Object.keys(fieldMappings).forEach((key) => {\n      delete fieldMappings[key];\n    });\n    debugResult.value = [];\n  }\n\n  // 提示词改变事件\n  function onPromptChange(value: string) {\n    //选中的提示词信息\n    selectedPrompt.value = promptOptions.value.find((item) => item.value == value);\n    // 清空之前的映射\n    Object.keys(fieldMappings).forEach((key) => {\n      delete fieldMappings[key];\n    });\n    let modelParam = selectedPrompt.value?.modelParam;\n    if(modelParam){\n      modelParam = typeof modelParam === 'string' ? JSON.parse(modelParam) : modelParam;\n      if(modelParam?.promptVariables && modelParam?.promptVariables.length > 0){\n        modelParam.promptVariables.forEach((item) => {\n          promptParams.value.push({ name: item.name, label: item.name, description: item.description, dateType: 'String' });\n        });\n      }\n    }\n  }\n\n  // 下一步\n  function nextStep() {\n    if (selectedPromptKey.value) {\n      currentStep.value = 1;\n    }\n  }\n\n  // 上一步\n  function prevStep() {\n    confirmLoading.value = false;\n    debugResult.value = [];\n    currentStep.value = 0;\n  }\n\n  // 确认调试配置\n  async function confirmDebug() {\n    // 模拟调试过程\n    let params = {\n      mappings: fieldMappings,\n      promptKey: selectedPromptKey.value,\n      extDataId: record.value.id,\n    };\n    console.log('开始调试...', params);\n    confirmLoading.value = true;\n    let res = await promptExperiment(params);\n    console.log('结束调试res...', res);\n    emit('success');\n  }\n\n  // 刷新评测集\n  async function handleReload() {\n    debugResult.value = []\n    let res = await queryTrackById({ id: record.value.id });\n    console.log('刷新评测集res...', res);\n    if (!res.success) {\n      createMessage.error(res.message);\n      return;\n    } else {\n      if (res.result && res.result.length > 0) {\n        console.log('刷新评测集res.result...', res.result);\n        confirmLoading.value = false;\n        // 1. 先找出最大version值\n        const maxVersion = Math.max(...res.result.map(item => item.version));\n\n        // 2. 过滤出所有具有最大version的项\n        const maxVersionItems = res.result.filter(item => item.version === maxVersion);\n       \n        console.log('刷新评测集maxVersionItems...', maxVersionItems);\n        if (maxVersionItems.length > 0) {\n          maxVersionItems.forEach((item) => {\n            debugResult.value.push(JSON.parse(item.dataValue));\n          });\n        }\n      }else{\n        createMessage.warning('数据处理中，请稍后刷新！');\n      }\n    }\n  }\n\n  // 状态样式类\n  const getStatusClass = (record) => {\n    if (record.status === '成功') return 'status-success';\n    if (record.status === '失败') return 'status-failed';\n    if (record.status === '警告') return 'status-warning';\n    return '';\n  };\n\n  // 行样式\n  const setRowClassName = (record, index) => {\n    return index % 2 === 0 ? 'even-row' : 'odd-row';\n  };\n</script>\n\n<style lang=\"less\" scoped>\n  @primary-color: #1890ff;\n  @success-color: #52c41a;\n  @warning-color: #faad14;\n  @error-color: #ff4d4f;\n  @border-color: #e8e8e8;\n  @background-color: #f5f7fa;\n  @text-color: #262626;\n  @text-secondary: #8c8c8c;\n\n  .steps-container {\n    margin: 15px 0;\n    padding: 30px;\n    border-radius: 8px;\n    background: linear-gradient(90deg, #f0f8ff, #e6f7ff);\n    overflow: auto;\n    max-height: calc(100vh - 200px);\n    :deep(.ant-steps-item-icon) {\n      background: white;\n      border-color: @primary-color;\n      width: 35px;\n      .ant-steps-icon {\n        color: @primary-color;\n      }\n    }\n\n    :deep(.ant-steps-item-finish) {\n      .ant-steps-item-icon {\n        background: @primary-color;\n        width: 35px;\n        .ant-steps-icon {\n          color: white;\n        }\n      }\n\n      .ant-steps-item-title {\n        color: @primary-color;\n      }\n    }\n\n    :deep(.ant-steps-item-title) {\n      font-weight: 500;\n    }\n  }\n\n  .step-content {\n    padding: 20px;\n    border-radius: 8px;\n    background-color: white;\n    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.09);\n\n    &.step-one {\n      .prompt-select {\n        width: 100%;\n        font-size: 14px;\n      }\n    }\n\n    &.step-two {\n      .mapping-summary {\n        display: grid;\n        grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\n        gap: 16px;\n        margin-top: 16px;\n      }\n\n      .summary-item {\n        display: flex;\n        padding: 12px 16px;\n        background-color: @background-color;\n        border-radius: 6px;\n        border: 1px solid @border-color;\n\n        .field-key {\n          font-weight: 500;\n          color: @text-color;\n          margin-right: 12px;\n          min-width: 80px;\n\n          &::after {\n            content: ':';\n          }\n        }\n\n        .field-value {\n          color: @text-secondary;\n          flex: 1;\n          overflow: hidden;\n          text-overflow: ellipsis;\n          white-space: nowrap;\n        }\n      }\n    }\n  }\n\n  .section-header {\n    h3 {\n      margin: 0 0 20px 0;\n      font-size: 18px;\n      font-weight: 600;\n      color: @text-color;\n      display: flex;\n      align-items: center;\n      gap: 8px;\n\n      svg {\n        color: @primary-color;\n      }\n    }\n  }\n\n  .form-section {\n    margin-bottom: 24px;\n  }\n\n  .form-item {\n    margin-bottom: 24px;\n\n    .form-label {\n      display: block;\n      margin-bottom: 10px;\n      font-weight: 500;\n      font-size: 15px;\n      color: @text-color;\n    }\n\n    .prompt-option {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n  }\n\n  .mapping-section {\n    margin-top: 30px;\n    padding: 20px;\n    background-color: @background-color;\n    border-radius: 8px;\n    border: 1px solid @border-color;\n\n    .mapping-list {\n      .mapping-item {\n        display: flex;\n        align-items: center;\n        margin-bottom: 16px;\n        padding: 16px;\n        background: white;\n        border-radius: 6px;\n        border: 1px solid @border-color;\n        transition: all 0.3s;\n\n        &:hover {\n          box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n          border-color: @primary-color;\n        }\n\n        .field-label {\n          display: flex;\n          align-items: center;\n          gap: 8px;\n          font-weight: 500;\n          color: @text-color;\n          min-width: 140px;\n          padding-right: 16px;\n        }\n\n        .equal-sign {\n          font-weight: bold;\n          color: @text-secondary;\n          margin: 0 12px;\n        }\n\n        .field-select {\n          flex: 1;\n\n          .column-option {\n            display: flex;\n            align-items: center;\n            gap: 8px;\n          }\n        }\n      }\n    }\n  }\n\n  .debug-result {\n    margin-top: 36px;\n    padding: 20px;\n    background-color: @background-color;\n    border-radius: 8px;\n    border: 1px solid @border-color;\n\n    .result-table-container {\n      margin-top: 16px;\n      border-radius: 6px;\n      overflow: hidden;\n      border: 1px solid @border-color;\n\n      :deep(.result-table) {\n        .ant-table-thead > tr > th {\n          background-color: #fafafa;\n          font-weight: 600;\n          color: @text-color;\n        }\n\n        .ant-table-tbody > tr:hover {\n          background-color: #f0f8ff;\n        }\n      }\n    }\n  }\n\n  .form-footer {\n    display: flex;\n    justify-content: flex-end;\n    gap: 16px;\n    padding-top: 24px;\n    margin-top: 24px;\n    border-top: 1px solid @border-color;\n\n    .footer-btn {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      padding: 8px 20px;\n      font-size: 14px;\n      border-radius: 6px;\n      transition: all 0.3s;\n\n      &.cancel-btn {\n        &:hover {\n          color: @error-color;\n          border-color: @error-color;\n        }\n      }\n\n      &.next-btn,\n      &.confirm-btn {\n        &:hover {\n          transform: translateY(-2px);\n          box-shadow: 0 4px 8px rgba(24, 144, 255, 0.2);\n        }\n      }\n\n      &.prev-btn {\n        &:hover {\n          transform: translateY(-2px);\n          box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n        }\n      }\n\n      &.close-btn {\n        &:hover {\n          transform: translateY(-2px);\n          box-shadow: 0 4px 8px rgba(82, 196, 26, 0.2);\n        }\n      }\n    }\n  }\n\n  // 响应式设计\n  @media (max-width: 768px) {\n    .step-content {\n      padding: 16px;\n    }\n\n    .mapping-section {\n      padding: 16px;\n\n      .mapping-list {\n        .mapping-item {\n          flex-direction: column;\n          align-items: flex-start;\n\n          .field-label {\n            margin-bottom: 10px;\n            padding-right: 0;\n          }\n\n          .equal-sign {\n            display: none;\n          }\n\n          .field-select {\n            width: 100%;\n            margin-top: 8px;\n          }\n        }\n      }\n    }\n\n    .step-two .mapping-summary {\n      grid-template-columns: 1fr;\n    }\n\n    .form-footer {\n      flex-direction: column;\n\n      .footer-btn {\n        width: 100%;\n        justify-content: center;\n      }\n    }\n  }\n\n  .debug-result-container {\n    margin: 16px 0;\n  }\n\n  .table-header {\n    padding: 12px 16px;\n    background: #fafafa;\n    border: 1px solid #e8e8e8;\n    border-bottom: none;\n    border-radius: 4px 4px 0 0;\n  }\n\n  .table-title {\n    font-size: 16px;\n    font-weight: 600;\n    color: #1890ff;\n  }\n\n  .table-subtitle {\n    font-size: 12px;\n    color: #999;\n    margin-top: 4px;\n  }\n\n  .result-table {\n    border: 1px solid #e8e8e8;\n  }\n\n  :deep(.ant-table-thead > tr > th) {\n    background-color: #f5f5f5;\n    font-weight: 600;\n    color: #333;\n    border-bottom: 2px solid #1890ff;\n  }\n\n  :deep(.ant-table-tbody > tr.even-row) {\n    background-color: #fafafa;\n  }\n\n  :deep(.ant-table-tbody > tr.odd-row) {\n    background-color: #fff;\n  }\n\n  :deep(.ant-table-tbody > tr:hover) {\n    background-color: #e6f7ff !important;\n  }\n\n  .status-badge {\n    display: inline-block;\n    padding: 2px 8px;\n    border-radius: 10px;\n    font-size: 12px;\n    font-weight: 500;\n  }\n\n  .status-success {\n    background-color: #f6ffed;\n    color: #52c41a;\n    border: 1px solid #b7eb8f;\n  }\n\n  .status-failed {\n    background-color: #fff2f0;\n    color: #ff4d4f;\n    border: 1px solid #ffccc7;\n  }\n\n  .status-warning {\n    background-color: #fffbe6;\n    color: #faad14;\n    border: 1px solid #ffe58f;\n  }\n\n  .latency-text {\n    font-weight: 500;\n  }\n\n  .latency-low {\n    color: #52c41a;\n  }\n\n  .latency-medium {\n    color: #faad14;\n  }\n\n  .latency-high {\n    color: #ff4d4f;\n  }\n\n  .input-cell,\n  .output-cell {\n    padding: 4px 0;\n  }\n\n  .cell-label {\n    font-size: 11px;\n    color: #999;\n    margin-bottom: 2px;\n  }\n\n  .cell-value {\n    font-size: 13px;\n    color: #333;\n    word-break: break-word;\n  }\n\n  .output-cell.reference .cell-value {\n    color: #1890ff;\n  }\n\n  .output-cell.actual .cell-value {\n    color: #52c41a;\n  }\n\n  .table-footer {\n    display: flex;\n    justify-content: flex-start;\n    gap: 24px;\n    padding: 12px 16px;\n    background: #fafafa;\n    border: 1px solid #e8e8e8;\n    border-top: none;\n    border-radius: 0 0 4px 4px;\n  }\n\n  .footer-item {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n  }\n\n  .footer-label {\n    font-size: 12px;\n    color: #666;\n  }\n\n  .footer-value {\n    font-size: 14px;\n    font-weight: 500;\n    color: #1890ff;\n  }\n\n  .no-data-container {\n    padding: 40px;\n    text-align: center;\n    border: 1px dashed #d9d9d9;\n    border-radius: 4px;\n    background-color: #fafafa;\n  }\n\n  .loading-text {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    gap: 8px;\n    color: #666;\n  }\n\n  .empty-text {\n    color: #999;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiprompts/components/AiEvaluatorSettingModal.vue",
    "content": "<template>\n  <div class=\"p-2\">\n    <BasicModal\n      wrapClassName=\"ai-prompt-edit-modal\"\n      destroyOnClose\n      @register=\"registerModal\"\n      :canFullscreen=\"false\"\n      defaultFullscreen\n      width=\"800px\"\n      :footer=\"null\"\n      @visible-change=\"visibleChange\"\n      @cancel=\"handleCancel\"\n    >\n      <template #title>\n        <div style=\"display: flex; width: 100%; justify-content: space-between; align-items: center\">\n          <div style=\"display: flex\">\n            <img :src=\"getImage()\" class=\"header-img\" />\n            <div class=\"header-name\">{{ formState.name }}</div>\n            <a-tooltip title=\"提示词评估器\">\n              <Icon icon=\"ant-design:edit-outlined\" style=\"margin-left: 4px; cursor: pointer\" color=\"#354052\" size=\"20\" @click=\"handleEdit\"></Icon>\n            </a-tooltip>\n          </div>\n<!--          <div>-->\n<!--            应用编排-->\n<!--            <a-tooltip title=\"AI应用文档\">-->\n<!--              <a style=\"color: unset\" href=\"https://help.jeecg.com/aigc/guide/app\" target=\"_blank\">-->\n<!--                <Icon style=\"position: relative; left: 2px; top: 1px\" icon=\"ant-design:question-circle-outlined\"></Icon>-->\n<!--              </a>-->\n<!--            </a-tooltip>-->\n<!--          </div>-->\n          <div style=\"display: flex\">\n            <a-button @click=\"handleOk\" style=\"margin-right: 30px\" type=\"primary\">保存</a-button>\n          </div>\n        </div>\n      </template>\n      <div style=\"height: 100%; width: 100%\">\n        <a-row :span=\"24\">\n          <a-col :span=\"showTest?12:24\">\n            <div class=\"orchestration\">提示词评估器</div>\n          </a-col>\n          <a-col :span=\"12\" v-if=\"showTest\">\n            <div class=\"view\">构造测试数据</div>\n          </a-col>\n        </a-row>\n        <a-row :span=\"24\">\n          <a-col :span=\"showTest?12:24\" class=\"setting-left\">\n            <a-form class=\"antd-modal-form\" ref=\"formRef\" :model=\"formState\" :rules=\"validatorRules\">\n              <a-row>\n                <a-col :span=\"24\">\n                  <div class=\"prologue-chunk\">\n                    <a-form-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.modelId\">\n                      <template #label>\n                        <div style=\"display: flex; justify-content: space-between; width: 100%; margin-right: 2px\">\n                          <div class=\"item-title\">AI模型</div>\n                          <div @click=\"handleParamSettingClick('model')\" class=\"knowledge-txt\">\n                            <Icon icon=\"ant-design:setting-outlined\" size=\"13\" style=\"margin-right: 2px\"></Icon>参数配置\n                          </div>\n                        </div>\n                      </template>\n                      <JDictSelectTag\n                        v-model:value=\"formState.modelId\"\n                        placeholder=\"请选择AI模型\"\n                        dict-code=\"airag_model where model_type = 'LLM' and activate_flag = 1,name,id\"\n                        style=\"width: 100%\"\n                        @change=\"handleModelIdChange\"\n                      ></JDictSelectTag>\n                    </a-form-item>\n                  </div>\n                </a-col>\n                <!-- 提示词 -->\n                <a-col :span=\"24\" class=\"mt-10\">\n                  <div class=\"prompt-back\">\n                    <a-form-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.dataValue\" style=\"margin-bottom: 0\">\n                      <template #label>\n                        <div class=\"prompt-title-padding item-title space-between\">\n                          <span>评估器</span>\n                          <a-button size=\"middle\" ghost>\n                            <span style=\"align-items: center; display: flex\" @click=\"generatedPrompt\">\n                              <svg width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n                                <path\n                                  d=\"M18.9839 1.85931C19.1612 1.38023 19.8388 1.38023 20.0161 1.85931L20.5021 3.17278C20.5578 3.3234 20.6766 3.44216 20.8272 3.49789L22.1407 3.98392C22.6198 4.1612 22.6198 4.8388 22.1407 5.01608L20.8272 5.50211C20.6766 5.55784 20.5578 5.6766 20.5021 5.82722L20.0161 7.14069C19.8388 7.61977 19.1612 7.61977 18.9839 7.14069L18.4979 5.82722C18.4422 5.6766 18.3234 5.55784 18.1728 5.50211L16.8593 5.01608C16.3802 4.8388 16.3802 4.1612 16.8593 3.98392L18.1728 3.49789C18.3234 3.44216 18.4422 3.3234 18.4979 3.17278L18.9839 1.85931zM13.5482 4.07793C13.0164 2.64069 10.9836 2.64069 10.4518 4.07793L8.99368 8.01834C8.82648 8.47021 8.47021 8.82648 8.01834 8.99368L4.07793 10.4518C2.64069 10.9836 2.64069 13.0164 4.07793 13.5482L8.01834 15.0063C8.47021 15.1735 8.82648 15.5298 8.99368 15.9817L10.4518 19.9221C10.9836 21.3593 13.0164 21.3593 13.5482 19.9221L15.0063 15.9817C15.1735 15.5298 15.5298 15.1735 15.9817 15.0063L19.9221 13.5482C21.3593 13.0164 21.3593 10.9836 19.9221 10.4518L15.9817 8.99368C15.5298 8.82648 15.1735 8.47021 15.0063 8.01834L13.5482 4.07793zM5.01608 16.8593C4.8388 16.3802 4.1612 16.3802 3.98392 16.8593L3.49789 18.1728C3.44216 18.3234 3.3234 18.4422 3.17278 18.4979L1.85931 18.9839C1.38023 19.1612 1.38023 19.8388 1.85931 20.0161L3.17278 20.5021C3.3234 20.5578 3.44216 20.6766 3.49789 20.8272L3.98392 22.1407C4.1612 22.6198 4.8388 22.6198 5.01608 22.1407L5.50211 20.8272C5.55784 20.6766 5.6766 20.5578 5.82722 20.5021L7.14069 20.0161C7.61977 19.8388 7.61977 19.1612 7.14069 18.9839L5.82722 18.4979C5.6766 18.4422 5.55784 18.3234 5.50211 18.1728L5.01608 16.8593z\"\n                                />\n                              </svg>\n                              <span style=\"margin-left: 4px\">生成</span>\n                            </span>\n                          </a-button>\n                        </div>\n                      </template>\n                      <a-textarea :rows=\"16\" v-model:value=\"formState.dataValue\" placeholder=\"请输入评估提示\" />\n                      <!-- 评估器内容格式 -->\n                      <div class=\"variable-container\">\n                        <div class=\"variable-container-header\">\n                          <Icon icon=\"ant-design:file-text-outlined\" class=\"output-format-icon\" />\n                          <span class=\"variable-format-title\">评估器内容变量要求（点击变量插入到评估器内容）</span>\n                        </div>\n                        <div class=\"variable-container-content\">\n                          <div class=\"variable-tag-wrapper\">\n                            <a-tooltip title=\"评估的输入内容变量（必填）\">\n                              <a-tag color=\"blue\" class=\"variable-tag required-tag\" @click=\"handleTagClick('input')\">input</a-tag>\n                            </a-tooltip>\n                            <a-tooltip title=\"评估的输出内容变量（必填）\">\n                              <a-tag color=\"blue\" class=\"variable-tag required-tag\" @click=\"handleTagClick('output')\">output</a-tag>\n                            </a-tooltip>\n                            <a-tooltip title=\"评估的参考内容变量\">\n                              <a-tag color=\"default\" class=\"variable-tag optional-tag\" @click=\"handleTagClick('reference')\">reference</a-tag>\n                            </a-tooltip>\n                          </div>\n                        </div>\n                      </div>\n                      <!-- 输出格式 -->\n                      <div class=\"output-format-card\">\n                        <div class=\"output-format-header\">\n                          <Icon icon=\"ant-design:file-text-outlined\" class=\"output-format-icon\" />\n                          <span class=\"output-format-title\">输出格式要求</span>\n                        </div>\n                        <div class=\"output-format-content\">\n                          <div class=\"output-item\">\n<!--                            <div class=\"output-item-label\">-->\n<!--                              <span class=\"output-item-title\">得分：</span>-->\n<!--                            </div>-->\n                            <div class=\"output-item-desc\">\n                              得分：最终的得分，必须输出，必须输出一个数字，表示满足Prompt中评分标准的程度。得分范围从\n                              <span class=\"score-range\">0.0</span> 到 <span class=\"score-range\">1.0</span>，<span class=\"score-range\">1.0</span>\n                              表示完全满足评分标准，<span class=\"score-range\">0.0</span> 表示完全不满足评分标准。\n                            </div>\n                          </div>\n                          <div class=\"output-item\">\n                            <div class=\"output-item-label\">\n<!--                              <span class=\"output-item-bullet\">•</span>-->\n<!--                              <span class=\"output-item-title\">原因：</span>-->\n                            </div>\n                            <div class=\"output-item-desc\">\n                              原因：对得分的可读解释。最后，必须用一句话结束理由，该句话为：因此，应该给出的分数是你的评分。\n                            </div>\n                          </div>\n                        </div>\n                      </div>\n                    </a-form-item>\n                  </div>\n                </a-col>\n              </a-row>\n            </a-form>\n            <a-button v-if=\"showTest\" class=\"mt-10 ml\" style=\"float: right\" @click=\"showTest = false\">取消</a-button>\n<!--            <a-button class=\"mt-10\" style=\"float: right\" @click=\"showTest = true\" type=\"primary\">调试</a-button>-->\n          </a-col>\n          <a-col :span=\"12\" class=\"setting-right\" v-if=\"showTest\">\n            <EvaluatorDebug ref=\"debugRef\" :content=\"formState.dataValue\" @run=\"debugRun\"></EvaluatorDebug>\n          </a-col>\n        </a-row>\n      </div>\n    </BasicModal>\n\n    <!-- Ai配置弹窗   -->\n    <AiAppParamsSettingModal @register=\"registerParamsSettingModal\" @ok=\"handleParamsSettingOk\"></AiAppParamsSettingModal>\n    <!-- Ai生成器   -->\n    <AiAppGeneratedPromptModal @register=\"registerAiAppPromptModal\" @ok=\"handleAiAppPromptOk\"></AiAppGeneratedPromptModal>\n    <!-- Ai评估器弹窗   -->\n    <AiragExtDataModal @register=\"registerEvaluatorModal\" @success=\"handleSuccess\"></AiragExtDataModal>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, reactive } from 'vue';\n  import BasicModal from '@/components/Modal/src/BasicModal.vue';\n  import { useModal, useModalInner } from '@/components/Modal';\n  import {Form, message} from 'ant-design-vue';\n  import { defHttp } from '@/utils/http/axios';\n  import JDictSelectTag from '@/components/Form/src/jeecg/components/JDictSelectTag.vue';\n  import AiAppParamsSettingModal from '@/views/super/airag/aiapp/components/AiAppParamsSettingModal.vue';\n  import AiAppGeneratedPromptModal from '@/views/super/airag/aiapp/components/AiAppGeneratedPromptModal.vue';\n  import AiragExtDataModal from './AiragExtDataModal.vue';\n  import EvaluatorDebug from './EvaluatorDebug.vue';\n  import defaultImg from '@/views/super/airag/aiapp/img/ailogo.png';\n  import { getFileAccessHttpUrl, randomString } from '@/utils/common/compUtils';\n  import { cloneDeep } from 'lodash-es';\n  import {debugEvaluator, saveOrUpdate} from '@/views/super/airag/aiprompts/AiragExtData.api';\n\n  //保存或修改\n  const isUpdate = ref<boolean>(false);\n  //uuid\n  const uuid = ref(randomString(16));\n  //showTest 显示调试器\n  const showTest = ref(true);\n  //debugRef 调试器引用\n  const debugRef = ref(null);\n  //form表单数据\n  const formState = reactive<any>({\n    id: '',\n    name: '',\n    dataValue: '',\n    descr: '',\n    modelId: '',\n    metadata: '',\n  });\n  //表单验证\n  const validatorRules = ref<any>({\n    dataValue: [{ required: true, message: '请输入提示词!' }],\n    modelId: [{ required: true, message: '请选择AI模型!' }],\n  });\n  //注册form\n  const useForm = Form.useForm;\n  const { resetFields, validate, validateInfos } = useForm(formState, validatorRules, { immediate: false });\n  const labelCol = ref<any>({ span: 24 });\n  const wrapperCol = ref<any>({ span: 24 });\n  //参数配置\n  const metadata = ref<any>({});\n  // emit\n  const emit = defineEmits(['success', 'register']);\n  //注册modal\n  const [registerModal, { closeModal, setModalProps }] = useModalInner(async (data) => {\n    isUpdate.value = !!data?.isUpdate;\n    clearFormState();\n    resetFields();\n    if (isUpdate.value) {\n      setFormState(data.record);\n    }\n    setModalProps({ bodyStyle: { padding: '10px' } });\n  });\n\n  //注册modal\n  const [registerParamsSettingModal, { openModal: paramsSettingOpen }] = useModal();\n  const [registerAiAppPromptModal, { openModal: aiAppPromptModalOpen }] = useModal();\n  const [registerEvaluatorModal, { openModal: evaluatorModalOpen }] = useModal();\n\n  //编辑\n  function handleEdit() {\n    evaluatorModalOpen(true, { isUpdate: true, showFooter: true, record: {\n        id: formState.id,\n        name: formState.name,\n        descr: formState.descr,\n      } });\n  }\n  /**\n   * 保存\n   */\n  async function handleOk() {\n    try {\n      let values = await validate();\n      metadata.value.modelId = values.modelId;\n      values.metadata = JSON.stringify(cloneDeep(metadata.value));\n      values = Object.assign(formState, values);\n      //提交表单\n      await saveOrUpdate(values, isUpdate.value);\n      setModalProps({ confirmLoading: true });\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n\n  /**\n   * 取消\n   */\n  function handleCancel() {\n    closeModal();\n  }\n\n  /**\n   * 标签点击事件\n   * @param type\n   */\n  function handleTagClick(type) {\n    let label = type=='input'?'## 输入参数':type=='output'?'## 输出参数':'## 参考参数';\n    if(!formState.dataValue){\n      formState.dataValue = `${label}：{{${type}}}`;\n    }else{\n      formState.dataValue += `\\r\\n\\r\\n${label}：{{${type}}}`;\n      // 获取textarea元素并滚动到底部\n      setTimeout(() => {\n        const textarea = document.querySelector('textarea.ant-input') as HTMLTextAreaElement;\n        if (textarea) {\n          textarea.scrollTop = textarea.scrollHeight;\n        }\n      }, 0);\n    }\n  }\n  /**\n   * 关闭弹窗触发列表刷新\n   *\n   * @param value\n   */\n  function visibleChange(value) {\n    if (!value) {\n      emit('success');\n    }\n  }\n  /**\n   * 成功回调\n   */\n  function handleSuccess(data) {\n    setFormState(data);\n    emit('success');\n  }\n\n  /**\n   * 参数配置点击事件\n   * @param value\n   */\n  function handleParamSettingClick(value) {\n    paramsSettingOpen(true, { type: value, metadata: metadata.value });\n  }\n\n  /**\n   * 参数配置确定回调事件\n   *\n   * @param value\n   */\n  function handleParamsSettingOk(value) {\n    Object.assign(metadata.value, value);\n  }\n\n  /**\n   * 获取图标\n   */\n  function getImage() {\n    return formState.icon ? getFileAccessHttpUrl(formState.icon) : defaultImg;\n  }\n\n  /**\n   * 清除参数\n   */\n  function clearFormState() {\n    formState.id = '';\n    formState.name = '';\n    formState.dataValue = '';\n    formState.descr = '';\n    formState.modelId = '';\n    formState.metadata = '';\n  }\n\n  /**\n   * 设置form属性\n   * @param data\n   */\n  function setFormState(data: any) {\n    //赋值\n    Object.assign(formState, data);\n\n    // 如果已有metadata，查询模型信息并更新到metadata中\n    if (data?.metadata) {\n      metadata.value = data.metadata ? JSON.parse(data.metadata) : {};\n      formState.modelId = data.metadata ? JSON.parse(data.metadata).modelId || '' : '';\n    }\n  }\n\n  //============= begin 提示词 ================================\n  /**\n   * 生成提示词\n   */\n  function generatedPrompt() {\n    aiAppPromptModalOpen(true, {});\n  }\n\n  /**\n   * 提示词回调\n   *\n   * @param value\n   */\n  function handleAiAppPromptOk(value) {\n    formState.dataValue = value;\n  }\n  //============= end 提示词 ================================\n  \n  /**\n   * 调试运行\n   */\n  async function debugRun(variables: any[]) {\n    //提示词\n    let sysMessage = formState.dataValue;\n    let userMessage = \"输入的内容：\";\n    //替换变量\n    variables.forEach((item) => {\n      userMessage += `${item.name}:${item.value}`;\n    });\n    //定义返回结果\n    sysMessage += '定义返回格式：\\n\\n 得分：最终的得分，必须输出，必须输出一个数字，表示满足Prompt中评分标准的程度。得分范围从 0.0 到 1.0，1.0 表示完全满足评分标准，0.0 表示完全不满足评分标准。\\n' +\n        '原因：（对得分的可读解释）。最后，必须用一句话结束理由，该句话为：因此，应该给出的分数是(你前面得出的评分)。';\n    console.log('userMessage', userMessage);\n    if(!formState.modelId) {\n      message.warning(\"请选择AI模型\");\n      return;\n    }\n    // 调用调试器运行\n    let loading = debugRef.value?.loading;\n    if (loading) return;\n    debugRef.value.loading = true;\n    let params = { prompts: sysMessage,content:userMessage,modelId:formState.modelId,modelParam:JSON.stringify(formState.metadata) }\n    let res = await debugEvaluator(params).catch(() => debugRef.value.loading = false);\n    debugRef.value.loading = false;\n    if(res.success){\n      debugRef.value.result = res.result\n    }else{\n      message.error(res.message);\n    }\n    console.log(\"debugEvaluator\",res)\n  }\n\n\n  /**\n   * 模型ID变化处理\n   * 查询模型信息并更新到metadata中，供chat组件使用\n   */\n  async function handleModelIdChange(modelId: string) {\n    if (!modelId) {\n      // 如果清空模型，清除模型信息\n      if (metadata.value.modelInfo) {\n        delete metadata.value.modelInfo;\n      }\n      return;\n    }\n    try {\n      const res = await defHttp.get(\n        {\n          url: '/airag/airagModel/queryById',\n          params: { id: modelId },\n        },\n        { isTransformResponse: false }\n      );\n      if (res.success && res.result) {\n        const model = res.result;\n        // 将模型信息添加到metadata中\n        if (!metadata.value) {\n          metadata.value = {};\n        }\n        metadata.value['modelInfo'] = {\n          provider: model.provider || '',\n          modelType: model.modelType || '',\n          modelName: model.modelName || '',\n        };\n      }\n    } catch (e) {\n      console.error('获取模型信息失败', e);\n    }\n  }\n</script>\n\n<style scoped lang=\"less\">\n  .pointer {\n    cursor: pointer;\n  }\n\n  .orchestration,\n  .view {\n    color: #0a3069;\n    font-weight: bold;\n    text-align: center;\n    font-size: 18px;\n    width: 100%;\n  }\n  .type-title {\n    color: #1d2025;\n    margin-bottom: 4px;\n  }\n\n  .type-desc {\n    color: #8f959e;\n    font-weight: 400;\n  }\n\n  .setting-left {\n    padding: 20px;\n    overflow-y: auto;\n    height: (100vh - 15px);\n  }\n\n  .setting-right {\n    overflow-y: auto;\n    height: (100vh - 15px);\n    border-left: 1px solid #dee0e3;\n    padding: 12px;\n  }\n\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-form-item .ant-form-item-label > label) {\n    width: 100%;\n  }\n\n  .knowledge-img {\n    width: 30px;\n    height: 30px;\n  }\n\n  .flow-name {\n    font-size: 14px;\n    font-weight: bold;\n    color: #354052;\n    width: calc(100% - 20px);\n    overflow: hidden;\n    align-content: center;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    display: grid;\n  }\n  .knowledge-name {\n    margin-left: 4px;\n  }\n\n  .knowledge-card {\n    margin-bottom: 10px;\n    margin-right: 10px;\n  }\n\n  .knowledge-icon {\n    display: none !important;\n    position: relative;\n    top: 6px;\n  }\n\n  .knowledge-card:hover {\n    .knowledge-icon {\n      display: block !important;\n    }\n  }\n  .header-img {\n    width: 35px;\n    height: 35px;\n    border-radius: 10px;\n  }\n  .flex {\n    display: flex;\n  }\n  .header-name {\n    color: #354052;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    white-space: nowrap;\n    max-width: 300px;\n    margin-left: 10px;\n    align-content: center;\n  }\n  .prompt-back {\n    background-color: #eef4ff;\n    border-radius: 12px;\n    padding: 2px;\n    border: 1px solid #77b2f8;\n    box-sizing: border-box;\n    margin-left: 5px;\n    textarea {\n      min-height: 250px;\n      max-height: 400px;\n      border: none !important;\n    }\n  }\n  .prompt-title-padding {\n    margin-left: 14px;\n    height: 50px;\n    align-content: center;\n  }\n  .prologue-chunk {\n    background-color: #f2f4f7;\n    border-radius: 12px;\n    padding: 2px 10px 2px 10px;\n    box-sizing: border-box;\n  }\n\n  .prologue-chunk-edit {\n    background-color: #f2f4f7;\n    border-radius: 12px;\n    padding: 2px 0 2px 0;\n    box-sizing: border-box;\n  }\n  .mt-10 {\n    margin-top: 10px;\n  }\n  :deep(.ant-form-item-label) {\n    padding: 0 !important;\n  }\n\n  :deep(.ant-form-item-required) {\n    margin-left: 4px !important;\n  }\n  .knowledge-txt {\n    color: #354052;\n    cursor: pointer;\n    margin-right: 10px;\n    font-size: 12px;\n  }\n  .item-title {\n    color: #111928;\n    font-weight: 400;\n  }\n  :deep(.ant-form-item) {\n    margin-bottom: 5px;\n  }\n  :deep(.vditor) {\n    border: none;\n  }\n  :deep(.vditor-sv) {\n    font-size: 14px;\n  }\n  :deep(.vditor-sv:focus) {\n    background-color: #ffffff;\n  }\n  .space-between {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    width: 100%;\n    button {\n      padding: 0 6px;\n      height: 25px;\n      color: #155aef !important;\n      margin-right: 10px;\n      border: none;\n    }\n  }\n  .ellipsis {\n    text-overflow: ellipsis;\n    overflow: hidden;\n    white-space: nowrap;\n  }\n  .quick-command {\n    display: flex;\n    width: 100%;\n    margin-top: 10px;\n    justify-content: space-between;\n    background-color: #ffffff;\n    padding: 4px 8px 4px;\n    align-items: center;\n    align-content: center;\n    align-self: center;\n    border-radius: 8px;\n    height: 40px;\n    .quick-command-icon {\n      display: none;\n    }\n  }\n  .quick-command:hover {\n    background-color: #eff0f8;\n    .quick-command-icon {\n      display: flex;\n    }\n  }\n  .data-empty-text {\n    color: #757c8f;\n    margin-left: 10px;\n  }\n  .mcp-warning-tip {\n    display: flex;\n    align-items: center;\n    color: #fa8c16;\n    font-size: 12px;\n    line-height: 18px;\n    font-weight: 500;\n  }\n  .flow-icon {\n    width: 34px;\n    height: 34px;\n    border-radius: 10px;\n  }\n  :deep(.ant-card .ant-card-body) {\n    padding: 16px;\n  }\n  .text-status {\n    font-size: 12px;\n    color: #676f83;\n  }\n  .tag-text {\n    display: flow;\n    max-width: 100px;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    height: 20px;\n    font-size: 12px;\n    color: #3a3f4f;\n  }\n  .tag-input {\n    align-self: center;\n    color: #737c97;\n    font-size: 12px;\n    font-style: normal;\n    font-weight: 500;\n    line-height: 16px;\n    margin-right: 6px;\n    text-align: right;\n    white-space: nowrap;\n  }\n  .tags-meadata {\n    padding-inline: 2px;\n    border-radius: 4px;\n    display: flex;\n    font-weight: 500;\n    max-width: 100%;\n  }\n  .text-desc {\n    width: 100%;\n    font-weight: 400;\n    display: inline-block;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    text-wrap: nowrap;\n    font-size: 12px;\n    color: #676f83;\n  }\n\n  /* 输出格式卡片样式 */\n  .output-format-card {\n    background: #f8f9ff;\n    border: 1px solid #e1e5ff;\n    border-radius: 8px;\n    padding: 16px;\n    margin-top: 10px;\n    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n  }\n\n  .output-format-header {\n    display: flex;\n    align-items: center;\n    margin-bottom: 10px;\n    border-bottom: 1px solid #e8ecff;\n    padding-bottom: 8px;\n  }\n\n  .output-format-icon {\n    color: #155aef;\n    font-size: 16px;\n    margin-right: 8px;\n  }\n\n  .output-format-title {\n    font-weight: 600;\n    color: #155aef;\n    font-size: 14px;\n  }\n\n  .output-format-content {\n    display: flex;\n    flex-direction: column;\n    gap: 12px;\n  }\n\n  .output-item {\n    display: flex;\n    flex-direction: column;\n    gap: 4px;\n  }\n\n  .output-item-label {\n    display: flex;\n    align-items: center;\n    gap: 6px;\n  }\n\n  .output-item-bullet {\n    color: #155aef;\n    font-weight: bold;\n    font-size: 14px;\n  }\n\n  .output-item-title {\n    font-weight: 600;\n    color: #354052;\n    font-size: 13px;\n  }\n\n  .output-item-desc {\n    color: #5a6376;\n    font-size: 13px;\n    line-height: 1.5;\n    margin-left: 20px;\n  }\n\n  .score-range {\n    color: #e74c3c;\n    font-weight: 600;\n    background: #fff5f5;\n    padding: 1px 4px;\n    border-radius: 3px;\n    font-size: 12px;\n  }\n  .output-format-card {\n    background: #fafafa;\n    border: 1px solid #e8e8e8;\n    border-radius: 6px;\n    padding: 16px;\n    margin-top: 16px;\n    transition: all 0.3s ease;\n\n    &:hover {\n      border-color: #1890ff;\n      box-shadow: 0 2px 8px rgba(24, 144, 255, 0.15);\n    }\n\n    .output-format-header {\n      display: flex;\n      align-items: center;\n      margin-bottom: 12px;\n      padding-bottom: 8px;\n      border-bottom: 1px solid #e8e8e8;\n\n      .output-format-icon {\n        font-size: 16px;\n        color: #1890ff;\n        margin-right: 8px;\n      }\n\n      .output-format-title {\n        font-size: 14px;\n        font-weight: 500;\n        color: #262626;\n      }\n    }\n\n    .output-format-content {\n      .output-item {\n        margin-bottom: 12px;\n        padding: 8px 12px;\n        background: #fff;\n        border-radius: 4px;\n        border-left: 3px solid #1890ff;\n\n        &:last-child {\n          margin-bottom: 0;\n        }\n\n        .output-item-desc {\n          font-size: 13px;\n          color: #595959;\n          line-height: 1.6;\n\n          .score-range {\n            color: #ff7a45;\n            font-weight: 600;\n            background: rgba(255, 122, 69, 0.1);\n            padding: 2px 6px;\n            border-radius: 4px;\n            margin: 0 2px;\n          }\n        }\n      }\n    }\n  }\n  .variable-container {\n    background: #fafafa;\n    border: 1px solid #e8e8e8;\n    border-radius: 6px;\n    padding: 16px;\n    margin-top: 16px;\n    transition: all 0.3s ease;\n\n    &:hover {\n      border-color: #1890ff;\n      box-shadow: 0 2px 8px rgba(24, 144, 255, 0.15);\n    }\n\n    .variable-container-header {\n      display: flex;\n      align-items: center;\n      margin-bottom: 12px;\n      padding-bottom: 8px;\n      border-bottom: 1px solid #e8e8e8;\n\n      .output-format-icon {\n        font-size: 16px;\n        color: #1890ff;\n        margin-right: 8px;\n      }\n\n      .variable-format-title {\n        font-size: 14px;\n        font-weight: 500;\n        color: #262626;\n      }\n    }\n\n    .variable-container-content {\n      .variable-tag-wrapper {\n        display: flex;\n        flex-wrap: wrap;\n        gap: 8px;\n\n        .variable-tag {\n          cursor: pointer;\n          border-radius: 4px;\n          font-size: 12px;\n          padding: 4px 8px;\n          margin: 0;\n          transition: all 0.3s ease;\n\n          &.required-tag {\n            background-color: #e6f7ff;\n            border: 1px solid #91d5ff;\n            color: #1890ff;\n          }\n\n          &.optional-tag {\n            background-color: #f5f5f5;\n            border: 1px solid #d9d9d9;\n            color: #8c8c8c;\n          }\n\n          &:hover {\n            transform: translateY(-2px);\n            box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);\n          }\n        }\n      }\n    }\n  }\n</style>\n<style lang=\"less\">\n  .ai-prompt-edit-modal {\n    .ant-modal .ant-modal-header {\n      padding: 13px 32px !important;\n    }\n    .jeecg-basic-modal-close > span {\n      margin-left: 0;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiprompts/components/AiPromptSettingModal.vue",
    "content": "<template>\n  <div class=\"p-2\">\n    <BasicModal\n      wrapClassName=\"ai-prompt-edit-modal\"\n      destroyOnClose\n      @register=\"registerModal\"\n      :canFullscreen=\"false\"\n      defaultFullscreen\n      width=\"800px\"\n      :footer=\"null\"\n      @visible-change=\"visibleChange\"\n      @cancel=\"handleCancel\"\n    >\n      <template #title>\n        <div style=\"display: flex; width: 100%; justify-content: space-between; align-items: center\">\n          <div style=\"display: flex\">\n            <img :src=\"getImage()\" class=\"header-img\" />\n            <div class=\"header-name\">{{ formState.name }}</div>\n            <a-tooltip title=\"编辑\">\n              <Icon icon=\"ant-design:edit-outlined\" style=\"margin-left: 4px; cursor: pointer\" color=\"#354052\" size=\"20\" @click=\"handleEdit\"></Icon>\n            </a-tooltip>\n          </div>\n          <div>\n            提示词编排\n            <a-tooltip title=\"AI应用文档\">\n              <a style=\"color: unset\" href=\"https://help.jeecg.com/aigc/guide/app\" target=\"_blank\">\n                <Icon style=\"position: relative; left: 2px; top: 1px\" icon=\"ant-design:question-circle-outlined\"></Icon>\n              </a>\n            </a-tooltip>\n          </div>\n          <div style=\"display: flex\">\n            <a-button @click=\"handleOk\" style=\"margin-right: 30px\" type=\"primary\">保存</a-button>\n          </div>\n        </div>\n      </template>\n      <div style=\"height: 100%; width: 100%\">\n        <a-row :span=\"24\">\n          <a-col :span=\"10\">\n            <div class=\"orchestration\">提示词</div>\n          </a-col>\n          <a-col :span=\"14\">\n            <div class=\"view\">预览</div>\n          </a-col>\n        </a-row>\n        <a-row :span=\"24\">\n          <a-col :span=\"10\" class=\"setting-left\">\n            <a-form class=\"antd-modal-form\" ref=\"formRef\" :model=\"formState\" :rules=\"validatorRules\">\n              <a-row>\n                <a-col :span=\"24\">\n                  <div class=\"prompt-back\">\n                    <a-form-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.content\" style=\"margin-bottom: 0\">\n                      <template #label>\n                        <div class=\"prompt-title-padding item-title space-between\">\n                          <span>提示词</span>\n                          <a-button size=\"middle\" ghost>\n                            <span style=\"align-items: center; display: flex\" @click=\"generatedPrompt\">\n                              <svg width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n                                <path\n                                  d=\"M18.9839 1.85931C19.1612 1.38023 19.8388 1.38023 20.0161 1.85931L20.5021 3.17278C20.5578 3.3234 20.6766 3.44216 20.8272 3.49789L22.1407 3.98392C22.6198 4.1612 22.6198 4.8388 22.1407 5.01608L20.8272 5.50211C20.6766 5.55784 20.5578 5.6766 20.5021 5.82722L20.0161 7.14069C19.8388 7.61977 19.1612 7.61977 18.9839 7.14069L18.4979 5.82722C18.4422 5.6766 18.3234 5.55784 18.1728 5.50211L16.8593 5.01608C16.3802 4.8388 16.3802 4.1612 16.8593 3.98392L18.1728 3.49789C18.3234 3.44216 18.4422 3.3234 18.4979 3.17278L18.9839 1.85931zM13.5482 4.07793C13.0164 2.64069 10.9836 2.64069 10.4518 4.07793L8.99368 8.01834C8.82648 8.47021 8.47021 8.82648 8.01834 8.99368L4.07793 10.4518C2.64069 10.9836 2.64069 13.0164 4.07793 13.5482L8.01834 15.0063C8.47021 15.1735 8.82648 15.5298 8.99368 15.9817L10.4518 19.9221C10.9836 21.3593 13.0164 21.3593 13.5482 19.9221L15.0063 15.9817C15.1735 15.5298 15.5298 15.1735 15.9817 15.0063L19.9221 13.5482C21.3593 13.0164 21.3593 10.9836 19.9221 10.4518L15.9817 8.99368C15.5298 8.82648 15.1735 8.47021 15.0063 8.01834L13.5482 4.07793zM5.01608 16.8593C4.8388 16.3802 4.1612 16.3802 3.98392 16.8593L3.49789 18.1728C3.44216 18.3234 3.3234 18.4422 3.17278 18.4979L1.85931 18.9839C1.38023 19.1612 1.38023 19.8388 1.85931 20.0161L3.17278 20.5021C3.3234 20.5578 3.44216 20.6766 3.49789 20.8272L3.98392 22.1407C4.1612 22.6198 4.8388 22.6198 5.01608 22.1407L5.50211 20.8272C5.55784 20.6766 5.6766 20.5578 5.82722 20.5021L7.14069 20.0161C7.61977 19.8388 7.61977 19.1612 7.14069 18.9839L5.82722 18.4979C5.6766 18.4422 5.55784 18.3234 5.50211 18.1728L5.01608 16.8593z\"\n                                />\n                              </svg>\n                              <span style=\"margin-left: 4px\">生成</span>\n                            </span>\n                          </a-button>\n                        </div>\n                      </template>\n                      <a-textarea :rows=\"8\" v-model:value=\"formState.content\" placeholder=\"请输入提示词\" @change=\"handleContentChange\" />\n                    </a-form-item>\n                  </div>\n                </a-col>\n\n                <a-col :span=\"24\" class=\"mt-10\">\n                  <div class=\"prologue-chunk\">\n                    <a-form-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" v-bind=\"validateInfos.modelId\">\n                      <template #label>\n                        <div style=\"display: flex; justify-content: space-between; width: 100%; margin-right: 2px\">\n                          <div class=\"item-title\">AI模型</div>\n                          <div @click=\"handleParamSettingClick('model')\" class=\"knowledge-txt\">\n                            <Icon icon=\"ant-design:setting-outlined\" size=\"13\" style=\"margin-right: 2px\"></Icon>参数配置\n                          </div>\n                        </div>\n                      </template>\n                      <JDictSelectTag\n                        v-model:value=\"formState.modelId\"\n                        placeholder=\"请选择AI模型\"\n                        dict-code=\"airag_model where model_type = 'LLM' and activate_flag = 1,name,id\"\n                        style=\"width: 100%\"\n                        @change=\"handleModelIdChange\"\n                      ></JDictSelectTag>\n                    </a-form-item>\n                  </div>\n                </a-col>\n                <a-col :span=\"24\" class=\"mt-10\" v-if=\"metadata.promptVariables && metadata.promptVariables.length > 0\">\n                  <div class=\"prologue-chunk\">\n                    <a-form-item :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\">\n                      <template #label>\n                        <div style=\"display: flex; justify-content: space-between; width: 100%; margin-right: 2px\">\n                          <div class=\"item-title\">Prompt 变量</div>\n                        </div>\n                      </template>\n                      <!-- 变量列表容器 -->\n                      <div class=\"prompt-variable-container\">\n                        <!-- 无变量时的空状态 -->\n                        <div v-if=\"!metadata.promptVariables || metadata.promptVariables.length === 0\" class=\"empty-variables\">\n                          <Icon icon=\"ant-design:inbox-outlined\" style=\"font-size: 32px; color: #d9d9d9\" />\n                          <p>暂无变量</p>\n                          <span class=\"empty-hint\">请在提示词中使用 {{ 变量名 }} 格式添加变量</span>\n                        </div>\n\n                        <!-- 变量列表 -->\n                        <div v-else class=\"prompt-variables-list\">\n                          <div\n                            class=\"prompt-variable-item\"\n                            v-for=\"(item, index) in metadata.promptVariables\"\n                            :key=\"index\"\n                            :class=\"{ 'variable-focused': focusedVariable === index }\"\n                          >\n                            <!-- 变量名标签 -->\n                            <div class=\"variable-tag\">\n                              <Icon icon=\"ant-design:tag-outlined\" />\n                              <span class=\"variable-name\">{{ item.name }}</span>\n                            </div>\n\n                            <!-- 变量值输入框 -->\n                            <div class=\"variable-input-wrapper\">\n                              <!-- 附件输入框 -->\n                              <JImageUpload :maxCount=\"1\" v-if=\"item.type === 'FILE'\" v-model:value=\"item.value\"></JImageUpload>\n                              <!-- 文本输入框 -->\n                              <a-input\n                                  v-else\n                                  v-model:value=\"item.value\"\n                                  placeholder=\"请输入变量值\"\n                                  @focus=\"focusedVariable = index\"\n                                  @blur=\"focusedVariable = null\"\n                                  class=\"variable-input\"\n                              >\n                                <template #suffix>\n                                  <Icon v-if=\"item.value\" icon=\"ant-design:check-circle-outlined\" style=\"color: #52c41a\" />\n                                </template>\n                              </a-input>\n                            </div>\n                           \n                            <!-- 类型选择框 -->\n                            <div class=\"variable-input-wrapper\">\n                              <a-select\n                                  v-model:value=\"item.type\"\n                                  placeholder=\"请选择类型\"\n                                  :options=\"[\n                                    { value: 'TEXT', label: '文本' },\n                                    { value: 'FILE', label: '附件' }\n                                  ]\"\n                                  class=\"variable-input\"\n                              >\n                              </a-select>\n                            </div>\n\n                            <!-- 变量操作按钮 -->\n                            <div class=\"variable-actions\">\n                              <a-tooltip title=\"清空值\">\n                                <a-button type=\"text\" size=\"small\" @click=\"item.value = ''\" class=\"action-btn\">\n                                  <Icon icon=\"ant-design:clear-outlined\" />\n                                </a-button>\n                              </a-tooltip>\n                            </div>\n                          </div>\n                        </div>\n                      </div>\n                    </a-form-item>\n                  </div>\n                </a-col>\n              </a-row>\n            </a-form>\n          </a-col>\n          <a-col :span=\"14\" class=\"setting-right\">\n            <chat :uuid=\"uuid\" :formState=\"chatData\" url=\"/airag/app/debug\"></chat>\n          </a-col>\n        </a-row>\n      </div>\n    </BasicModal>\n\n    <!-- Ai配置弹窗   -->\n    <AiAppParamsSettingModal @register=\"registerParamsSettingModal\" @ok=\"handleParamsSettingOk\"></AiAppParamsSettingModal>\n    <!-- Ai生成器   -->\n    <AiAppGeneratedPromptModal @register=\"registerAiAppPromptModal\" @ok=\"handleAiAppPromptOk\"></AiAppGeneratedPromptModal>\n    <!-- Ai提示词弹窗   -->\n    <AiragPromptsModal @register=\"registerPromptModal\" @success=\"handleSuccess\"></AiragPromptsModal>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, reactive, computed, watch } from 'vue';\n  import BasicModal from '@/components/Modal/src/BasicModal.vue';\n  import { useModal, useModalInner } from '@/components/Modal';\n  import { Form } from 'ant-design-vue';\n  import { defHttp } from '@/utils/http/axios';\n  import JDictSelectTag from '@/components/Form/src/jeecg/components/JDictSelectTag.vue';\n  import AiAppParamsSettingModal from '@/views/super/airag/aiapp/components/AiAppParamsSettingModal.vue';\n  import AiAppGeneratedPromptModal from '@/views/super/airag/aiapp/components/AiAppGeneratedPromptModal.vue';\n  import AiragPromptsModal from './AiragPromptsModal.vue';\n  import chat from '@/views/super/airag/aiapp/chat/chat.vue';\n  import defaultImg from '@/views/super/airag/aiapp/img/ailogo.png';\n  import { getFileAccessHttpUrl, randomString } from '@/utils/common/compUtils';\n  import { cloneDeep } from 'lodash-es';\n  import { saveOrUpdate } from '@/views/super/airag/aiprompts/AiragPrompts.api';\n  import { JImageUpload } from \"@/components/Form\";\n\n  //保存或修改\n  const isUpdate = ref<boolean>(false);\n  //uuid\n  const uuid = ref(randomString(16));\n  //form表单数据\n  const formState = reactive<any>({\n    id: '',\n    name: '',\n    promptKey: '',\n    content: '',\n    description: '',\n    modelId: '',\n    modelParam: '',\n  });\n  //表单验证\n  const validatorRules = ref<any>({\n    content: [{ required: true, message: '请输入提示词!' }],\n    modelId: [{ required: true, message: '请选择AI模型!' }],\n  });\n  //注册form\n  const useForm = Form.useForm;\n  const { resetFields, validate, validateInfos } = useForm(formState, validatorRules, { immediate: false });\n  const labelCol = ref<any>({ span: 24 });\n  const wrapperCol = ref<any>({ span: 24 });\n  //参数配置\n  const metadata = ref<any>({});\n  //定义 emit 事件\n  const emit = defineEmits(['success', 'register']);\n  // 添加聚焦变量索引\n  const focusedVariable = ref<number | null>(null);\n  // 提示词\n  const prompt = ref<any>();\n\n  //注册modal\n  const [registerModal, { closeModal, setModalProps }] = useModalInner(async (data) => {\n    isUpdate.value = !!data?.isUpdate;\n    clearFormState();\n    resetFields();\n    if (isUpdate.value) {\n      setFormState(data.record);\n    }\n    setModalProps({ bodyStyle: { padding: '10px' } });\n  });\n\n  //注册modal\n  const [registerParamsSettingModal, { openModal: paramsSettingOpen }] = useModal();\n  const [registerAiAppPromptModal, { openModal: aiAppPromptModalOpen }] = useModal();\n  const [registerPromptModal, { openModal: promptModalOpen }] = useModal();\n\n  const chatData = computed(() => {\n    return {\n      id: formState.id,\n      name: formState.name,\n      prompt: prompt.value,\n      modelId: formState.modelId,\n      metadata: metadata.value?.modelInfo ? JSON.stringify(metadata.value.modelInfo) : '',\n    };\n  });\n\n  watch(\n    () => metadata.value,\n    () => {\n      changePrompt();\n    },\n    {\n      deep: true,\n    }\n  );\n  /**\n   * 改变提示词\n   */\n  function changePrompt() {\n    prompt.value = formState.content;\n    if (metadata.value && metadata.value['promptVariables']) {\n      metadata.value['promptVariables'].forEach((variable) => {\n        if (variable.type === 'FILE') {\n          variable.value = getFileAccessHttpUrl(variable.value);\n        }\n        prompt.value = prompt.value.replace(new RegExp(`{{${variable.name}}}`, 'g'), variable.value);\n      });\n    }\n  }\n\n  /**\n   * 提示词内容改变事件\n   */\n  function handleContentChange() {\n    if (formState.content) {\n      console.log(\"formState.content\",formState.content)\n      let variables = extractVariables(formState.content);\n      console.log(\"variables\",variables)\n      if(variables.length > 0){\n        const promptVariables = metadata.value['promptVariables'];\n        metadata.value['promptVariables'] = variables.map((variable) => ({\n          name: variable,\n          value: promptVariables.find((item) => item.name === variable)?.value || '',\n          type: promptVariables.find((item) => item.name === variable)?.type || 'TEXT'\n        }));\n      }else{\n        metadata.value['promptVariables'] = '';\n      }\n    } else {\n      metadata.value['promptVariables'] = '';\n    }\n  }\n\n  /**\n   * 从提示词中提取变量名\n   * @param str\n   */\n  function extractVariables(str) {\n    // 匹配 {{ 和 }} 之间的内容，非贪婪匹配\n    const regex = /\\{\\{(.*?)\\}\\}/g;\n    const matches = new Set(); // 使用 Set 自动去重\n    let match;\n\n    while ((match = regex.exec(str)) !== null) {\n      matches.add(match[1].trim()); // 去除可能的首尾空格并添加到 Set\n    }\n\n    return Array.from(matches);;\n  }\n\n  //编辑\n  function handleEdit() {\n    promptModalOpen(true, {\n      isUpdate: true,\n      showFooter: true,\n      record: {\n        id: formState.id,\n        name: formState.name,\n        promptKey: formState.promptKey,\n        description: formState.description,\n      },\n    });\n  }\n  /**\n   * 保存\n   */\n  async function handleOk() {\n    try {\n      let values = await validate();\n      values.modelParam = JSON.stringify(cloneDeep(metadata.value));\n      values = Object.assign(formState, values);\n      //提交表单\n      await saveOrUpdate(values, isUpdate.value);\n      setModalProps({ confirmLoading: true });\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n\n  /**\n   * 取消\n   */\n  function handleCancel() {\n    closeModal();\n  }\n\n  /**\n   * 关闭弹窗触发列表刷新\n   *\n   * @param value\n   */\n  function visibleChange(value) {\n    if (!value) {\n      emit('success');\n    }\n  }\n  /**\n   * 成功回调\n   */\n  function handleSuccess(data) {\n    setFormState(data);\n    emit('success');\n  }\n\n  /**\n   * 参数配置点击事件\n   * @param value\n   */\n  function handleParamSettingClick(value) {\n    paramsSettingOpen(true, { type: value, metadata: metadata.value });\n  }\n\n  /**\n   * 参数配置确定回调事件\n   *\n   * @param value\n   */\n  function handleParamsSettingOk(value) {\n    Object.assign(metadata.value, value);\n  }\n\n  /**\n   * 获取图标\n   */\n  function getImage() {\n    return formState.icon ? getFileAccessHttpUrl(formState.icon) : defaultImg;\n  }\n\n  /**\n   * 清除参数\n   */\n  function clearFormState() {\n    formState.id = '';\n    formState.name = '';\n    formState.content = '';\n    formState.description = '';\n    formState.modelId = '';\n    formState.modelParam = '';\n    metadata.value = {};\n    prompt.value = '';\n  }\n\n  /**\n   * 设置form属性\n   * @param data\n   */\n  function setFormState(data: any) {\n    //赋值\n    Object.assign(formState, data);\n\n    // 如果已有modelId，查询模型信息并更新到metadata中\n    if (data.modelId) {\n      metadata.value = data.modelParam ? JSON.parse(data.modelParam) : {};\n    }\n    console.log('设置form属性formState', formState);\n  }\n\n  //============= begin 提示词 ================================\n  /**\n   * 生成提示词\n   */\n  function generatedPrompt() {\n    aiAppPromptModalOpen(true, {});\n  }\n\n  /**\n   * 提示词回调\n   *\n   * @param value\n   */\n  function handleAiAppPromptOk(value) {\n    console.log('handleAiAppPromptOk value', value);\n    formState.content = value;\n  }\n  //============= end 提示词 ================================\n\n  /**\n   * 模型ID变化处理\n   * 查询模型信息并更新到metadata中，供chat组件使用\n   */\n  async function handleModelIdChange(modelId: string) {\n    if (!modelId) {\n      // 如果清空模型，清除模型信息\n      if (metadata.value.modelInfo) {\n        delete metadata.value.modelInfo;\n      }\n      return;\n    }\n    try {\n      const res = await defHttp.get(\n        {\n          url: '/airag/airagModel/queryById',\n          params: { id: modelId },\n        },\n        { isTransformResponse: false }\n      );\n      if (res.success && res.result) {\n        const model = res.result;\n        // 将模型信息添加到metadata中\n        if (!metadata.value) {\n          metadata.value = {};\n        }\n        metadata.value['modelInfo'] = {\n          provider: model.provider || '',\n          modelType: model.modelType || '',\n          modelName: model.modelName || '',\n        };\n      }\n    } catch (e) {\n      console.error('获取模型信息失败', e);\n    }\n  }\n</script>\n\n<style scoped lang=\"less\">\n  .pointer {\n    cursor: pointer;\n  }\n\n  .orchestration,\n  .view {\n    color: #0a3069;\n    font-weight: bold;\n    text-align: center;\n    font-size: 18px;\n    width: 100%;\n    padding-bottom: 10px;\n  }\n  .type-title {\n    color: #1d2025;\n    margin-bottom: 4px;\n  }\n\n  .type-desc {\n    color: #8f959e;\n    font-weight: 400;\n  }\n\n  .setting-left {\n    padding: 20px;\n    overflow-y: auto;\n    height: (100vh - 15px);\n  }\n\n  .setting-right {\n    overflow-y: auto;\n    height: (100vh - 15px);\n    border-left: 1px solid #dee0e3;\n  }\n\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-form-item .ant-form-item-label > label) {\n    width: 100%;\n  }\n\n  .knowledge-img {\n    width: 30px;\n    height: 30px;\n  }\n\n  .flow-name {\n    font-size: 14px;\n    font-weight: bold;\n    color: #354052;\n    width: calc(100% - 20px);\n    overflow: hidden;\n    align-content: center;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    display: grid;\n  }\n  .knowledge-name {\n    margin-left: 4px;\n  }\n\n  .knowledge-card {\n    margin-bottom: 10px;\n    margin-right: 10px;\n  }\n\n  .knowledge-icon {\n    display: none !important;\n    position: relative;\n    top: 6px;\n  }\n\n  .knowledge-card:hover {\n    .knowledge-icon {\n      display: block !important;\n    }\n  }\n  .header-img {\n    width: 35px;\n    height: 35px;\n    border-radius: 10px;\n  }\n  .flex {\n    display: flex;\n  }\n  .header-name {\n    color: #354052;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    white-space: nowrap;\n    max-width: 300px;\n    margin-left: 10px;\n    align-content: center;\n  }\n  .prompt-back {\n    background-color: #eef4ff;\n    border-radius: 12px;\n    padding: 2px;\n    border: 1px solid #77b2f8;\n    box-sizing: border-box;\n    margin-left: 5px;\n    textarea {\n      min-height: 250px;\n      max-height: 400px;\n      border: none !important;\n    }\n  }\n  .prompt-title-padding {\n    margin-left: 14px;\n    height: 50px;\n    align-content: center;\n  }\n  .prologue-chunk {\n    background-color: #f2f4f7;\n    border-radius: 12px;\n    padding: 2px 10px 2px 10px;\n    box-sizing: border-box;\n  }\n\n  .prologue-chunk-edit {\n    background-color: #f2f4f7;\n    border-radius: 12px;\n    padding: 2px 0 2px 0;\n    box-sizing: border-box;\n  }\n  .mt-10 {\n    margin-top: 10px;\n  }\n  :deep(.ant-form-item-label) {\n    padding: 0 !important;\n  }\n\n  :deep(.ant-form-item-required) {\n    margin-left: 4px !important;\n  }\n  .knowledge-txt {\n    color: #354052;\n    cursor: pointer;\n    margin-right: 10px;\n    font-size: 12px;\n  }\n  .item-title {\n    color: #111928;\n    font-weight: 400;\n  }\n  :deep(.ant-form-item) {\n    margin-bottom: 5px;\n  }\n  :deep(.vditor) {\n    border: none;\n  }\n  :deep(.vditor-sv) {\n    font-size: 14px;\n  }\n  :deep(.vditor-sv:focus) {\n    background-color: #ffffff;\n  }\n  .space-between {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    width: 100%;\n    button {\n      padding: 0 6px;\n      height: 25px;\n      color: #155aef !important;\n      margin-right: 10px;\n      border: none;\n    }\n  }\n  .ellipsis {\n    text-overflow: ellipsis;\n    overflow: hidden;\n    white-space: nowrap;\n  }\n  .quick-command {\n    display: flex;\n    width: 100%;\n    margin-top: 10px;\n    justify-content: space-between;\n    background-color: #ffffff;\n    padding: 4px 8px 4px;\n    align-items: center;\n    align-content: center;\n    align-self: center;\n    border-radius: 8px;\n    height: 40px;\n    .quick-command-icon {\n      display: none;\n    }\n  }\n  .quick-command:hover {\n    background-color: #eff0f8;\n    .quick-command-icon {\n      display: flex;\n    }\n  }\n  .data-empty-text {\n    color: #757c8f;\n    margin-left: 10px;\n  }\n  .mcp-warning-tip {\n    display: flex;\n    align-items: center;\n    color: #fa8c16;\n    font-size: 12px;\n    line-height: 18px;\n    font-weight: 500;\n  }\n  .flow-icon {\n    width: 34px;\n    height: 34px;\n    border-radius: 10px;\n  }\n  :deep(.ant-card .ant-card-body) {\n    padding: 16px;\n  }\n  .text-status {\n    font-size: 12px;\n    color: #676f83;\n  }\n  .tag-text {\n    display: flow;\n    max-width: 100px;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    height: 20px;\n    font-size: 12px;\n    color: #3a3f4f;\n  }\n  .tag-input {\n    align-self: center;\n    color: #737c97;\n    font-size: 12px;\n    font-style: normal;\n    font-weight: 500;\n    line-height: 16px;\n    margin-right: 6px;\n    text-align: right;\n    white-space: nowrap;\n  }\n  .tags-meadata {\n    padding-inline: 2px;\n    border-radius: 4px;\n    display: flex;\n    font-weight: 500;\n    max-width: 100%;\n  }\n  .text-desc {\n    width: 100%;\n    font-weight: 400;\n    display: inline-block;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    text-wrap: nowrap;\n    font-size: 12px;\n    color: #676f83;\n  }\n  // 变量信息样式\n  .variable-info {\n    display: flex;\n    align-items: center;\n    color: #676f83;\n    font-size: 12px;\n    font-weight: 500;\n  }\n\n  // 变量容器样式\n  .prompt-variable-container {\n    margin-top: 12px;\n    min-height: 80px;\n  }\n\n  // 空状态样式\n  .empty-variables {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    padding: 30px 20px;\n    background: #fafafa;\n    border-radius: 8px;\n    border: 1px dashed #d9d9d9;\n\n    p {\n      margin: 12px 0 8px;\n      font-size: 16px;\n      color: #676f83;\n    }\n\n    .empty-hint {\n      font-size: 13px;\n      color: #8c8c8c;\n    }\n  }\n\n  // 变量列表样式\n  .prompt-variables-list {\n    display: flex;\n    flex-direction: column;\n    gap: 12px;\n  }\n\n  // 变量项样式\n  .prompt-variable-item {\n    display: flex;\n    align-items: center;\n    padding: 16px;\n    background: white;\n    border-radius: 8px;\n    border: 1px solid #e8e8e8;\n    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n    position: relative;\n    overflow: hidden;\n\n    // 悬停效果\n    &:hover {\n      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n      border-color: #1890ff;\n      transform: translateY(-2px);\n    }\n\n    // 聚焦效果\n    &.variable-focused {\n      border-color: #1890ff;\n      box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.1);\n    }\n\n    // 左侧装饰条\n    &::before {\n      content: '';\n      position: absolute;\n      left: 0;\n      top: 0;\n      bottom: 0;\n      width: 4px;\n      background: #1890ff;\n      opacity: 0;\n      transition: opacity 0.3s;\n    }\n\n    &:hover::before,\n    &.variable-focused::before {\n      opacity: 1;\n    }\n  }\n\n  // 变量标签样式\n  .variable-tag {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    min-width: 120px;\n    padding: 6px 12px;\n    background: #f0f8ff;\n    border-radius: 6px;\n    border: 1px solid #b7e3ff;\n    margin-right: 16px;\n\n    .variable-name {\n      font-weight: 600;\n      color: #1890ff;\n      font-size: 14px;\n    }\n  }\n\n  // 变量输入框包装器\n  .variable-input-wrapper {\n    flex: 1;\n    margin-right: 12px;\n\n    .variable-input {\n      border-radius: 6px;\n      transition: all 0.3s;\n\n      &:hover {\n        border-color: #40a9ff;\n      }\n\n      &:focus,\n      &:focus-within {\n        border-color: #1890ff;\n        box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.1);\n      }\n    }\n  }\n\n  // 变量操作按钮\n  .variable-actions {\n    display: flex;\n    gap: 4px;\n    opacity: 0.7;\n    transition: opacity 0.3s;\n\n    .action-btn {\n      width: 28px;\n      height: 28px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      border-radius: 4px;\n      color: #676f83;\n      transition: all 0.2s;\n\n      &:hover {\n        background: #f0f8ff;\n        color: #1890ff;\n        transform: scale(1.05);\n      }\n    }\n  }\n\n  // 变量项悬停时显示操作按钮\n  .prompt-variable-item:hover .variable-actions {\n    opacity: 1;\n  }\n\n  // 响应式设计\n  @media (max-width: 768px) {\n    .prompt-variable-item {\n      flex-direction: column;\n      align-items: flex-start;\n      padding: 12px;\n\n      .variable-tag {\n        margin-right: 0;\n        margin-bottom: 10px;\n        width: 100%;\n      }\n\n      .variable-input-wrapper {\n        width: 100%;\n        margin-right: 0;\n        margin-bottom: 10px;\n      }\n\n      .variable-actions {\n        width: 100%;\n        justify-content: flex-end;\n        opacity: 1;\n      }\n    }\n  }\n</style>\n<style lang=\"less\">\n  .ai-prompt-edit-modal {\n    .ant-modal .ant-modal-header {\n      padding: 13px 32px !important;\n    }\n    .jeecg-basic-modal-close > span {\n      margin-left: 0;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiprompts/components/AiragDataSetColumnModal.vue",
    "content": "<template>\n  <BasicModal\n    v-bind=\"$attrs\"\n    @register=\"registerModal\"\n    :canFullscreen=\"true\"\n    destroyOnClose\n    title=\"列配置\"\n    okText=\"保存\"\n    :width=\"1000\"\n    @ok=\"handleSubmit\"\n  >\n    <div class=\"dynamic-column-config\">\n      <a-card size=\"small\">\n        <!-- 列配置列表 -->\n        <div class=\"column-list\">\n          <div v-for=\"(element, index) in columns\" :key=\"element.id\" class=\"column-item\">\n            <!-- 操作区域 - 放在右上角 -->\n            <div class=\"action-area\">\n              <a-button type=\"text\" @click=\"handleCopyColumn(element)\" title=\"复制\">\n                <copy-outlined />\n              </a-button>\n              <a-button type=\"text\" danger @click=\"handleRemoveColumn(index)\" :disabled=\"columns.length < 2\" title=\"删除\">\n                <DeleteOutlined />\n              </a-button>\n            </div>\n\n            <!-- 列配置表单 -->\n            <div class=\"column-form\">\n              <div class=\"form-row\">\n                <div class=\"form-item\">\n                  <label class=\"form-label\">名称</label>\n                  <a-input\n                    v-model:value=\"element.name\"\n                    placeholder=\"请输入列名称\"\n                    :class=\"{ 'has-error': !element.name }\"\n                    @blur=\"validateColumn(element)\"\n                  />\n                </div>\n\n                <div class=\"form-item\">\n                  <label class=\"form-label\">数据类型</label>\n                  <a-select v-model:value=\"element.dataType\" placeholder=\"请选择数据类型\" style=\"width: 100%\">\n                    <a-select-option value=\"String\">字符串</a-select-option>\n                    <a-select-option value=\"FILE\">附件</a-select-option>\n                  </a-select>\n                </div>\n\n                <div class=\"form-item\">\n                  <label class=\"form-label\">必填</label>\n                  <a-radio-group v-model:value=\"element.required\">\n                    <a-radio :value=\"true\">是</a-radio>\n                    <a-radio :value=\"false\">否</a-radio>\n                  </a-radio-group>\n                </div>\n              </div>\n\n              <div class=\"form-row\">\n                <div class=\"form-item full-width\">\n                  <label class=\"form-label\">描述</label>\n                  <a-textarea v-model:value=\"element.description\" placeholder=\"请输入列描述\" :rows=\"2\" />\n                </div>\n              </div>\n            </div>\n          </div>\n          <a-button type=\"dashed\" style=\"width: 100%\" @click=\"handleAddColumn\"> <PlusOutlined />添加列 </a-button>\n        </div>\n        <!-- 底部操作按钮 -->\n        <!--        <div class=\"footer-actions\">-->\n        <!--          <a-button type=\"primary\" @click=\"handleSubmit\" :loading=\"loading\"> 创建 </a-button>-->\n        <!--          <a-button @click=\"handleReset\" style=\"margin-left: 8px\"> 重置 </a-button>-->\n        <!--        </div>-->\n      </a-card>\n    </div>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { message } from 'ant-design-vue';\n  import { PlusOutlined, DeleteOutlined, CopyOutlined } from '@ant-design/icons-vue';\n  import { saveOrUpdate } from '../AiragExtData.api';\n  import {JImageUpload} from \"@/components/Form\";\n  // Emits声明\n  const emit = defineEmits(['register', 'success']);\n  // 列配置接口\n  interface ColumnConfig {\n    id: string;\n    name: string;\n    description: string;\n    dataType: string;\n    required: boolean;\n  }\n\n  // 响应式数据\n  const loading = ref(false);\n  const columns = ref<ColumnConfig[]>([\n    {\n      id: generateId(),\n      name: '',\n      description: '',\n      dataType: 'String',\n      required: false,\n    },\n  ]);\n  const defaultColumns = [\n    {\n      id: generateId(),\n      name: 'input',\n      description: '作为输入投递给评测对象',\n      dataType: 'String',\n      required: false,\n    },\n    {\n      id: generateId(),\n      name: 'reference_output',\n      description: '预期理想输出，可作为评估时的参考标准',\n      dataType: 'String',\n      required: false,\n    },\n  ];\n  //数据ID\n  const dataId = ref('');\n  const datasetValue = ref<any>({});\n  // 生成唯一ID\n  function generateId(): string {\n    return Date.now().toString(36) + Math.random().toString(36).substr(2);\n  }\n  //表单赋值\n  const [registerModal, { closeModal }] = useModalInner(async (data) => {\n    console.log('data:', data);\n    dataId.value = data.id;\n    if(data.datasetValue){\n      datasetValue.value = data.datasetValue\n      if(data.datasetValue?.columns && data.datasetValue.columns.length){\n        columns.value = data.datasetValue.columns;\n      }else{\n        columns.value = defaultColumns;\n      }\n    }\n  });\n  // 添加列\n  const handleAddColumn = () => {\n    columns.value.push({\n      id: generateId(),\n      name: '',\n      description: '',\n      dataType: 'String',\n      required: false,\n    });\n  };\n\n  // 删除列\n  const handleRemoveColumn = (index: number) => {\n    if (columns.value.length > 1) {\n      columns.value.splice(index, 1);\n    }\n  };\n  // 复制列\n  const handleCopyColumn = (element) => {\n    columns.value.push({\n      ...element,\n      id: generateId(),\n    });\n  };\n\n  // 验证列配置\n  const validateColumn = (column: ColumnConfig) => {\n    return column.name && column.name.trim() !== '';\n  };\n\n  // 提交配置\n  const handleSubmit = async () => {\n    // 验证数据\n    const invalidColumns = columns.value.filter((col) => !validateColumn(col));\n\n    if (invalidColumns.length > 0) {\n      message.error('请填写所有必填项（名称）');\n      return;\n    }\n\n    loading.value = true;\n\n    try {\n      datasetValue.value.columns = columns.value\n      // 构造提交数据\n      const submitData = {\n        datasetValue: JSON.stringify( datasetValue.value),\n        id: dataId.value,\n      };\n\n      console.log('提交数据:', submitData);\n\n      await saveOrUpdate(submitData, true,false);\n\n      message.success('配置创建成功！');\n      // 关闭弹窗并触发成功事件\n      closeModal();\n      emit('success');\n    } catch (error) {\n      console.error('提交失败:', error);\n    } finally {\n      loading.value = false;\n    }\n  };\n\n  // 重置配置\n  const handleReset = () => {\n    columns.value = [...defaultColumns];\n  };\n</script>\n\n<style lang=\"less\" scoped>\n  .dynamic-column-config {\n    max-width: 1200px;\n    margin: 0 auto;\n    max-height: 70vh; /* 设置最大高度为视口高度的70% */\n    overflow-y: auto; /* 超出时显示垂直滚动条 */\n\n    :deep(.ant-card-head) {\n      border-bottom: 1px solid #f0f0f0;\n    }\n\n    :deep(.ant-card-body) {\n      padding: 12px;\n    }\n\n    :deep(.ant-card-extra) {\n      padding: 0;\n    }\n  }\n\n  .column-list {\n    margin-bottom: 24px;\n  }\n\n  .column-item {\n    position: relative; /* 为绝对定位的操作区域提供参考 */\n    display: flex;\n    align-items: flex-start;\n    gap: 12px;\n    padding: 16px;\n    margin-bottom: 16px;\n    background: #fafafa;\n    border: 1px solid #f0f0f0;\n    border-radius: 6px;\n    transition: all 0.3s;\n\n    &:hover {\n      border-color: #1890ff;\n      background: #f6fbff;\n    }\n\n    /* 操作区域样式 */\n    .action-area {\n      position: absolute;\n      top: 8px;\n      right: 8px;\n\n      :deep(.ant-btn) {\n        width: 24px;\n        height: 24px;\n        min-width: 24px;\n        padding: 0;\n\n        .anticon {\n          font-size: 14px;\n        }\n      }\n    }\n  }\n\n  .column-form {\n    flex: 1;\n    width: 100%; /* 确保表单占满宽度 */\n  }\n\n  .form-row {\n    display: flex;\n    gap: 16px;\n    margin-bottom: 16px;\n\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  .form-item {\n    flex: 1;\n\n    &.full-width {\n      flex: 3;\n    }\n  }\n\n  .form-label {\n    display: block;\n    margin-bottom: 6px;\n    font-weight: 500;\n    color: rgba(0, 0, 0, 0.85);\n\n    &::after {\n      content: '：';\n    }\n  }\n\n  .error-text {\n    color: #ff4d4f;\n    font-size: 12px;\n    margin-top: 4px;\n  }\n\n  .has-error {\n    :deep(.ant-input) {\n      border-color: #ff4d4f;\n    }\n  }\n\n  .form-actions {\n    display: none; /* 隐藏原来的删除按钮区域 */\n  }\n\n  .fixed-columns {\n    margin-top: 24px;\n    padding-top: 24px;\n    border-top: 1px dashed #d9d9d9;\n\n    .tip-text {\n      margin-bottom: 16px;\n      color: #666;\n      font-size: 14px;\n    }\n  }\n\n  .fixed-column-item {\n    margin-bottom: 16px;\n    padding: 16px;\n    background: #f5f5f5;\n    border: 1px solid #e8e8e8;\n    border-radius: 6px;\n\n    &:last-child {\n      margin-bottom: 0;\n    }\n\n    :deep(.ant-input-group-addon) {\n      background: #e6f7ff;\n      color: #1890ff;\n      font-weight: 500;\n    }\n  }\n\n  .footer-actions {\n    display: flex;\n    justify-content: center;\n    margin-top: 32px;\n    padding-top: 8px;\n    border-top: 1px solid #f0f0f0;\n    position: sticky;\n    bottom: 0;\n    background: #fff;\n    padding-bottom: 8px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiprompts/components/AiragDataSetDataDrawer.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"getProps\">\n    <div class=\"dynamic-column-config\">\n      <!-- 列配置列表 -->\n      <div class=\"column-list\">\n        <!-- 移除了 draggable 组件，直接使用 div 渲染列表 -->\n        <div v-for=\"(element, index) in dataSet\" :key=\"index\" class=\"column-item\">\n          <!-- 操作区域 - 放在右上角 -->\n          <div class=\"action-area\">\n            <a-button type=\"text\" danger @click=\"handleRemoveData(index)\" title=\"删除\">\n              <DeleteOutlined />\n            </a-button>\n          </div>\n          <!-- 列配置表单 -->\n          <div class=\"column-form\">\n            <div class=\"form-row\">\n              <div class=\"form-item\" v-for=\"item in columns\" :key=\"item.name\">\n                <label class=\"form-label\">{{ item.name }}</label>\n                <!-- 附件输入框 -->\n                <JImageUpload :maxCount=\"1\" v-if=\"item.dataType === 'FILE'\" v-model:value=\"element[item.name]\"></JImageUpload>\n                <a-input\n                    v-else\n                    v-model:value=\"element[item.name]\"\n                    :placeholder=\"'请输入' + item.name\"\n                    :class=\"{ 'has-error': !element[item.name] }\"\n                    @blur=\"validateColumn(element[item.name])\"\n                />\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <a-button v-if=\"!isUpdate\" type=\"dashed\" style=\"width: 100%\" @click=\"handleAddData\"> <PlusOutlined />添加数据 </a-button>\n    </div>\n  </BasicDrawer>\n</template>\n\n<script lang=\"ts\" setup>\n  import type { DrawerProps } from '/@/components/Drawer';\n  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';\n  import { computed, unref, ref } from 'vue';\n  import { useAttrs } from '@/hooks/core/useAttrs';\n  import { DeleteOutlined, PlusOutlined } from '@ant-design/icons-vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { saveOrUpdate } from '@/views/super/airag/aiprompts/AiragExtData.api';\n  import { message } from 'ant-design-vue';\n  import {JImageUpload} from \"@/components/Form\";\n  // Emits声明\n  const emit = defineEmits(['register', 'success']);\n  const attrs = useAttrs();\n  // 消息提示\n  const { createMessage } = useMessage();\n  // 注册抽屉\n  const [registerDrawer, { closeDrawer }] = useDrawerInner(open);\n  // 抽屉最终props\n  const getProps = computed(() => {\n    let drawerProps: Partial<DrawerProps> = {\n      width: 1000,\n      title: '数据配置',\n      showFooter: true,\n      destroyOnClose: true,\n    };\n    let finalProps: Recordable = {\n      ...unref(attrs),\n      ...drawerProps,\n      okText: '保存',\n      onOk: handleSubmit,\n      onCancel: closeDrawer,\n      onRegister: registerDrawer,\n    };\n    return finalProps;\n  });\n  /** 更新状态 */\n  const isUpdate = ref<boolean>(false);\n  /** dataId */\n  const dataId = ref<any>('');\n  /** 数据列表 */\n  const allData = ref<any>([]);\n  /** 数据列表 */\n  const dataSet = ref<any>([]);\n  // 列配置\n  const columns = ref<any>([]);\n  // 验证数据非空\n  const validateColumn = (value) => {\n    return value && value.trim() !== '';\n  };\n  // 生成唯一ID\n  function generateId(): string {\n    return Date.now().toString(36) + Math.random().toString(36).substr(2);\n  }\n  //添加数据\n  function handleAddData() {\n    dataSet.value.push({\n      id: generateId(),\n    });\n  }\n  //保存数据\n  async function handleSubmit() {\n    // 验证数据\n    const invalidData = dataSet.value.filter((item) => {\n      return columns.value.some((col) => col.required && !validateColumn(item[col.name]));\n    });\n    if (invalidData.length > 0) {\n      createMessage.error('请填写所有必填项（名称）');\n      return;\n    }\n\n    try {\n      // 构造提交数据\n      let dataSource:any = [];\n      if (isUpdate.value) {\n        dataSource = allData.value.map(item =>\n            item.id === dataSet.value[0].id ? dataSet.value[0] : item\n        );\n      } else {\n        dataSource = allData.value.concat(dataSet.value);\n      }\n      const submitData = {\n        datasetValue: JSON.stringify({\n          columns: columns.value,\n          dataSource: dataSource,\n        }),\n        id: dataId.value,\n      };\n\n      console.log('提交数据:', submitData);\n\n      await saveOrUpdate(submitData, true, false);\n\n      message.success('数据保存成功！');\n      // 关闭弹窗并触发成功事件\n      closeDrawer();\n      emit('success');\n    } catch (error) {\n      console.error('提交失败:', error);\n    } finally {\n      //loading.value = false;\n    }\n  }\n  // 删除列\n  const handleRemoveData = (index: number) => {\n    dataSet.value.splice(index, 1);\n  };\n  /** 抽屉开启 */\n  function open(data) {\n    isUpdate.value = data.isUpdate;\n    dataId.value = data?.id || '';\n    allData.value = data?.dataSource || [];\n    columns.value = data?.columns || [];\n    console.log(\"columns.value\",columns.value)\n    if (isUpdate.value) {\n      console.log(\"data?.record\",data?.record)\n      dataSet.value = data?.record?[data?.record] : [];\n    } else {\n      dataSet.value = [];\n    }\n  }\n</script>\n\n<style scoped lang=\"less\">\n  .dynamic-column-config {\n    max-width: 1200px;\n    margin: 0 auto;\n    max-height: calc(100vh - 100px); /* 设置最大高度为视口高度的70% */\n    overflow-y: auto; /* 超出时显示垂直滚动条 */\n\n    :deep(.ant-card-head) {\n      border-bottom: 1px solid #f0f0f0;\n    }\n\n    :deep(.ant-card-body) {\n      padding: 12px;\n    }\n\n    :deep(.ant-card-extra) {\n      padding: 0;\n    }\n  }\n\n  .column-list {\n    margin-bottom: 24px;\n  }\n\n  .column-item {\n    position: relative; /* 为绝对定位的操作区域提供参考 */\n    display: flex;\n    align-items: flex-start;\n    gap: 12px;\n    padding: 16px;\n    margin-bottom: 16px;\n    background: #fafafa;\n    border: 1px solid #f0f0f0;\n    border-radius: 6px;\n    transition: all 0.3s;\n\n    &:hover {\n      border-color: #1890ff;\n      background: #f6fbff;\n    }\n\n    /* 操作区域样式 */\n    .action-area {\n      position: absolute;\n      top: 8px;\n      right: 8px;\n\n      :deep(.ant-btn) {\n        width: 24px;\n        height: 24px;\n        min-width: 24px;\n        padding: 0;\n\n        .anticon {\n          font-size: 14px;\n        }\n      }\n    }\n  }\n\n  .column-form {\n    flex: 1;\n    width: 100%; /* 确保表单占满宽度 */\n  }\n\n  .form-row {\n    display: flex;\n    flex-direction: column;\n    gap: 16px;\n    margin-bottom: 16px;\n\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  .form-item {\n    flex: 1;\n\n    &.full-width {\n      flex: 3;\n    }\n  }\n\n  .form-label {\n    display: block;\n    margin-bottom: 6px;\n    font-weight: 500;\n    color: rgba(0, 0, 0, 0.85);\n\n    &::after {\n      content: '：';\n    }\n  }\n\n  .error-text {\n    color: #ff4d4f;\n    font-size: 12px;\n    margin-top: 4px;\n  }\n\n  .has-error {\n    :deep(.ant-input) {\n      border-color: #ff4d4f;\n    }\n  }\n\n  .form-actions {\n    display: none; /* 隐藏原来的删除按钮区域 */\n  }\n\n  .fixed-columns {\n    margin-top: 24px;\n    padding-top: 24px;\n    border-top: 1px dashed #d9d9d9;\n\n    .tip-text {\n      margin-bottom: 16px;\n      color: #666;\n      font-size: 14px;\n    }\n  }\n\n  .fixed-column-item {\n    margin-bottom: 16px;\n    padding: 16px;\n    background: #f5f5f5;\n    border: 1px solid #e8e8e8;\n    border-radius: 6px;\n\n    &:last-child {\n      margin-bottom: 0;\n    }\n\n    :deep(.ant-input-group-addon) {\n      background: #e6f7ff;\n      color: #1890ff;\n      font-weight: 500;\n    }\n  }\n\n  .footer-actions {\n    display: flex;\n    justify-content: center;\n    margin-top: 32px;\n    padding-top: 8px;\n    border-top: 1px solid #f0f0f0;\n    position: sticky;\n    bottom: 0;\n    background: #fff;\n    padding-bottom: 8px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiprompts/components/AiragDataSetModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" :zIndex=\"999\" @register=\"registerModal\" :canFullscreen=\"true\" :footer=\"null\" defaultFullscreen destroyOnClose title=\"评测集\">\n    <div class=\"modal-content\">\n      <div class=\"top-section\">\n        <div class=\"header-actions\">\n          <a-button type=\"primary\" v-if=\"columns && columns.length > 0\" @click=\"handleAddData\">\n            <Icon icon=\"ant-design:plus-outlined\" />\n            新增数据\n          </a-button>\n          <a-button @click=\"columnConfig\" class=\"config-btn\">\n            <Icon icon=\"ant-design:setting-outlined\" />\n            列配置\n          </a-button>\n        </div>\n      </div>\n      <div class=\"table-container\">\n        <a-table\n            :columns=\"columns\"\n            :dataSource=\"dataSource\"\n            :pagination=\"pagination\"\n            rowKey=\"id\"\n            class=\"data-table\"\n            :scroll=\"{ x: 'max-content' }\"\n        >\n          <template #action=\"{ record }\">\n            <div class=\"action-buttons\">\n              <a-button size=\"small\" @click=\"handleEditDataset(record)\" class=\"action-btn edit-btn\">\n                <Icon icon=\"ant-design:edit-outlined\" />\n              </a-button>\n              <a-button size=\"small\" @click=\"handleDelete(record)\" class=\"action-btn delete-btn\">\n                <Icon icon=\"ant-design:delete-outlined\" />\n              </a-button>\n            </div>\n          </template>\n        </a-table>\n      </div>\n    </div>\n  </BasicModal>\n  <!--自定义列配置  -->\n  <AiragDataSetColumnModal @register=\"registerDataSetColumnModal\" @success=\"reload\" />\n  <!--自定义数据配置  -->\n  <AiragDataSetDataDrawer @register=\"registerDataSetDataDrawer\" @success=\"reload\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref } from 'vue';\nimport { BasicModal, useModal, useModalInner } from '/@/components/Modal';\nimport AiragDataSetColumnModal from './AiragDataSetColumnModal.vue';\nimport AiragDataSetDataDrawer from './AiragDataSetDataDrawer.vue';\nimport {queryById, saveOrUpdate} from '../AiragExtData.api';\nimport { useDrawer } from '@/components/Drawer';\nimport { cloneDeep } from 'lodash-es';\nimport {useMessage} from \"@/hooks/web/useMessage\";\n// Emits声明\nconst emit = defineEmits(['register', 'success']);\nconst { createMessage } = useMessage();\nconst dataId = ref<string>('');\nconst columns = ref<any>([]);\nconst dataSource = ref<any>([]);\nconst datasetValue = ref<any>({});\nconst pagination = ref({\n  total: 0,\n  current: 1,\n  pageSize: 10,\n});\n//表单赋值\nconst [registerModal] = useModalInner(async (data) => {\n  dataId.value = data.record?.id;\n  initData(data.record)\n});\n//注册列配置\nconst [registerDataSetColumnModal, { openModal: openColumnModal }] = useModal();\n//注册数据抽屉\nconst [registerDataSetDataDrawer, { openDrawer }] = useDrawer();\n\n/**\n * 刷新数据\n */\nfunction reload() {\n  queryById({ id: dataId.value }).then((res) => {\n    if (res.success && res.result) {\n      initData(res.result)\n    }\n  });\n  emit('success');\n}\n/**\n * 初始化数据\n */\nfunction initData(result) {\n  dataSource.value = []\n  columns.value = []\n  datasetValue.value = result?.datasetValue ? JSON.parse(result?.datasetValue) : {};\n  if (datasetValue.value?.columns) {\n    datasetValue.value?.columns.forEach((item) => {\n      columns.value.push({\n        title: item.name,\n        dataIndex: item.name,\n        key: item.name,\n        fixed: 'center',\n      });\n    });\n  }\n  dataSource.value = datasetValue.value?.dataSource || [];\n  //是否已经包含操作列\n  const hasAction = columns.value.some(item=>item.key == 'action');\n  if(!hasAction){\n    columns.value.push({\n      title: \"操作\",\n      dataIndex: 'action',\n      key: 'action',\n      fixed: 'right',\n      width: 120,\n      slots: { customRender: 'action' },\n    });\n  }\n}\n/**\n * 打开列配置\n */\nfunction columnConfig() {\n  openColumnModal(true, {\n    id: dataId.value,\n    datasetValue: cloneDeep(datasetValue.value),\n  });\n}\n\n/**\n * 新增数据点击事件\n */\nfunction handleAddData() {\n  if(!datasetValue.value?.columns || datasetValue.value?.columns.length == 0){\n    createMessage.warning('请先配置列信息');\n    return;\n  }\n  openDrawer(true, {\n    id: dataId.value,\n    dataSource:cloneDeep(datasetValue.value.dataSource),\n    columns:cloneDeep(datasetValue.value.columns),\n    isUpdate:false\n  });\n}\n\n/**\n * 编辑数据点击事件\n * @param record\n */\nfunction handleEditDataset(record) {\n  openDrawer(true, {\n    id: dataId.value,\n    dataSource: cloneDeep(dataSource.value),\n    columns: cloneDeep(datasetValue.value?.columns),\n    record: cloneDeep(record),\n    isUpdate:true\n  });\n}\n\n/**\n * 删除数据点击事件\n */\nfunction handleDelete(record) {\n  //删除数据\n  dataSource.value = dataSource.value.filter((item) => item.id !== record.id);\n  refreshDataset()\n}\n\n/**\n *  表单提交事件\n */\nasync function refreshDataset() {\n  //提交表单\n  const submitData = {\n    datasetValue: JSON.stringify({\n      columns: datasetValue.value.columns,\n      dataSource: dataSource.value,\n    }),\n    id: dataId.value,\n  };\n\n  console.log('提交数据:', submitData);\n  await saveOrUpdate(submitData, true, false);\n  reload()\n}\n</script>\n\n<style lang=\"less\" scoped>\n.modal-content {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n}\n\n.top-section {\n  padding: 16px 0;\n  border-bottom: 1px solid #f0f0f0;\n  margin-bottom: 16px;\n}\n\n.header-actions {\n  display: flex;\n  gap: 12px;\n  align-items: center;\n}\n\n.config-btn {\n  color: #1890ff;\n  border-color: #1890ff;\n}\n\n.table-container {\n  flex: 1;\n  overflow: auto;\n}\n\n.data-table {\n  :deep(.ant-table-thead > tr > th) {\n    background-color: #fafafa;\n    font-weight: 600;\n  }\n\n  :deep(.ant-table-tbody > tr:hover) {\n    background-color: #f5f5f5;\n  }\n\n  :deep(.ant-table-pagination) {\n    margin: 16px 0;\n  }\n}\n\n.action-buttons {\n  display: flex;\n  gap: 8px;\n}\n\n.action-btn {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 4px 8px;\n}\n\n.edit-btn {\n  color: #1890ff;\n  border-color: #1890ff;\n\n  &:hover {\n    color: #40a9ff;\n    border-color: #40a9ff;\n  }\n}\n\n.delete-btn {\n  color: #ff4d4f;\n  border-color: #ff4d4f;\n\n  &:hover {\n    color: #ff7875;\n    border-color: #ff7875;\n  }\n}\n\n/** 时间和数字输入框样式 */\n:deep(.ant-input-number) {\n  width: 100%;\n}\n\n:deep(.ant-calendar-picker) {\n  width: 100%;\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiprompts/components/AiragExtDataModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" destroyOnClose :title=\"title\" :maxHeight=\"500\" :width=\"800\" @ok=\"handleSubmit\">\n    <BasicForm @register=\"registerForm\" name=\"AiragExtDataForm\" />\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, computed, unref, reactive } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { formSchema } from '../AiragExtData.data';\n  import { saveOrUpdate } from '../AiragExtData.api';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { getDateByPicker } from '/@/utils';\n  const { createMessage } = useMessage();\n  // Emits声明\n  const emit = defineEmits(['register', 'success']);\n  const isUpdate = ref(true);\n  const isDetail = ref(false);\n  //表单配置\n  const [registerForm, { setProps, resetFields, setFieldsValue, validate, scrollToField }] = useForm({\n    labelWidth: 150,\n    schemas: formSchema,\n    showActionButtonGroup: false,\n    baseColProps: { span: 24 },\n    baseRowStyle: { padding: '0 20px' },\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false, showCancelBtn: !!data?.showFooter, showOkBtn: !!data?.showFooter });\n    isUpdate.value = !!data?.isUpdate;\n    isDetail.value = !!data?.showFooter;\n    if (unref(isUpdate)) {\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n    }\n    // 隐藏底部时禁用整个表单\n    setProps({ disabled: !data?.showFooter });\n  });\n  //设置标题\n  const title = computed(() => (!unref(isUpdate) ? '新增' : !unref(isDetail) ? '详情' : '编辑'));\n  //表单提交事件\n  async function handleSubmit(v) {\n    try {\n      let values = await validate();\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      await saveOrUpdate(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } catch (e) {\n      console.log(\"e\", e)\n      return Promise.reject(e);\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n\n<style lang=\"less\" scoped>\n  /** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-calendar-picker) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiprompts/components/AiragInvokeRecordsDrawer.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"getProps\">\n    <BasicTable @register=\"registerTable\">\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" /> </template\n    ></BasicTable>\n  </BasicDrawer>\n  <AiragTrackDetailModal @register=\"registerTrackDetailModal\" />\n</template>\n\n<script lang=\"ts\" setup>\n  import type { DrawerProps } from '/@/components/Drawer';\n  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';\n  import { computed, unref, ref } from 'vue';\n  import { useAttrs } from '@/hooks/core/useAttrs';\n  import { BasicTable, TableAction } from '@/components/Table';\n  import { useModal } from '@/components/Modal';\n  import { getTrackList, deleteOne } from '@/views/super/airag/aiprompts/AiragExtData.api';\n  import {useListPage} from \"@/hooks/system/useListPage\";\n  import AiragTrackDetailModal from './AiragTrackDetailModal.vue';\n  // Emits声明\n  const attrs = useAttrs();\n  const [registerTrackDetailModal, { openModal }] = useModal();\n  //列配置\n  const trackColumns = ref([\n    { title: '问题', dataIndex: 'userQuery', key: 'userQuery' },\n    { title: '提示词答案', dataIndex: 'promptAnswer', key: 'promptAnswer' },\n    { title: '评估分数', dataIndex: 'answerScore', key: 'answerScore' },\n    { title: '版本号', dataIndex: 'version', key: 'version' },\n  ]);\n  // 注册抽屉\n  const [registerDrawer, { closeDrawer }] = useDrawerInner(open);\n  // 表格定义\n  const { tableContext } = useListPage({\n    designScope: 'agent-config',\n    tableProps: {\n      title: '调用记录',\n      api: getTrackList,\n      columns: trackColumns.value,\n      canResize: false,\n      rowSelection: {\n        columnWidth: 20,\n      },\n      immediate: false,\n      beforeFetch: async (params) => {\n        return Object.assign(params, { metadata: dataId.value });\n      },\n      afterFetch: async (res) => {\n        if (res.length > 0) {\n          res.forEach((item) => {\n            if (item.dataValue) {\n              let dataValue = JSON.parse(item.dataValue);\n              item.answerScore = dataValue.answerScore;\n              item.userQuery = dataValue.userQuery;\n              item.promptAnswer = dataValue.promptAnswer;\n            }\n          });\n        }\n        return res;\n      },\n    },\n  });\n  const [registerTable, { reload }] = tableContext;\n  // 抽屉最终props\n  const getProps = computed(() => {\n    let drawerProps: Partial<DrawerProps> = {\n      width: 1000,\n      title: '调用记录',\n      destroyOnClose: true,\n    };\n    let finalProps: Recordable = {\n      ...unref(attrs),\n      ...drawerProps,\n      onCancel: closeDrawer,\n      onRegister: registerDrawer,\n    };\n    return finalProps;\n  });\n  /** dataId */\n  const dataId = ref<any>('');\n  /** 抽屉开启 */\n  function open(data) {\n    dataId.value = data.record?.id || '';\n    reload();\n  }\n  /**\n   * 删除\n   */\n  function handleDelete(record) {\n    console.log(record, 'record');\n    deleteOne({ id: record.id},reload)\n  }\n\n  /**\n   * 详情\n   * @param record\n   */\n  function handleDetail(record) {\n    openModal(true, { dataValue: record.dataValue });\n  }\n  /*\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft',\n        },\n      },\n    ];\n  }\n</script>\n\n<style scoped lang=\"less\">\n  .dynamic-column-config {\n    max-width: 1200px;\n    margin: 0 auto;\n    max-height: calc(100vh - 100px); /* 设置最大高度为视口高度的70% */\n    overflow-y: auto; /* 超出时显示垂直滚动条 */\n\n    :deep(.ant-card-head) {\n      border-bottom: 1px solid #f0f0f0;\n    }\n\n    :deep(.ant-card-body) {\n      padding: 12px;\n    }\n\n    :deep(.ant-card-extra) {\n      padding: 0;\n    }\n  }\n\n  .column-list {\n    margin-bottom: 24px;\n  }\n\n  .column-item {\n    position: relative; /* 为绝对定位的操作区域提供参考 */\n    display: flex;\n    align-items: flex-start;\n    gap: 12px;\n    padding: 16px;\n    margin-bottom: 16px;\n    background: #fafafa;\n    border: 1px solid #f0f0f0;\n    border-radius: 6px;\n    transition: all 0.3s;\n\n    &:hover {\n      border-color: #1890ff;\n      background: #f6fbff;\n    }\n\n    /* 操作区域样式 */\n    .action-area {\n      position: absolute;\n      top: 8px;\n      right: 8px;\n\n      :deep(.ant-btn) {\n        width: 24px;\n        height: 24px;\n        min-width: 24px;\n        padding: 0;\n\n        .anticon {\n          font-size: 14px;\n        }\n      }\n    }\n  }\n\n  .column-form {\n    flex: 1;\n    width: 100%; /* 确保表单占满宽度 */\n  }\n\n  .form-row {\n    display: flex;\n    flex-direction: column;\n    gap: 16px;\n    margin-bottom: 16px;\n\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  .form-item {\n    flex: 1;\n\n    &.full-width {\n      flex: 3;\n    }\n  }\n\n  .form-label {\n    display: block;\n    margin-bottom: 6px;\n    font-weight: 500;\n    color: rgba(0, 0, 0, 0.85);\n\n    &::after {\n      content: '：';\n    }\n  }\n\n  .error-text {\n    color: #ff4d4f;\n    font-size: 12px;\n    margin-top: 4px;\n  }\n\n  .has-error {\n    :deep(.ant-input) {\n      border-color: #ff4d4f;\n    }\n  }\n\n  .form-actions {\n    display: none; /* 隐藏原来的删除按钮区域 */\n  }\n\n  .fixed-columns {\n    margin-top: 24px;\n    padding-top: 24px;\n    border-top: 1px dashed #d9d9d9;\n\n    .tip-text {\n      margin-bottom: 16px;\n      color: #666;\n      font-size: 14px;\n    }\n  }\n\n  .fixed-column-item {\n    margin-bottom: 16px;\n    padding: 16px;\n    background: #f5f5f5;\n    border: 1px solid #e8e8e8;\n    border-radius: 6px;\n\n    &:last-child {\n      margin-bottom: 0;\n    }\n\n    :deep(.ant-input-group-addon) {\n      background: #e6f7ff;\n      color: #1890ff;\n      font-weight: 500;\n    }\n  }\n\n  .footer-actions {\n    display: flex;\n    justify-content: center;\n    margin-top: 32px;\n    padding-top: 8px;\n    border-top: 1px solid #f0f0f0;\n    position: sticky;\n    bottom: 0;\n    background: #fff;\n    padding-bottom: 8px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiprompts/components/AiragPromptsModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" destroyOnClose :title=\"title\" :maxHeight=\"500\" :width=\"800\" @ok=\"handleSubmit\">\n    <BasicForm @register=\"registerForm\" name=\"AiragPromptsForm\" />\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, computed, unref, reactive } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { formSchema } from '../AiragPrompts.data';\n  import { saveOrUpdate } from '../AiragPrompts.api';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { getDateByPicker } from '/@/utils';\n  const { createMessage } = useMessage();\n  // Emits声明\n  const emit = defineEmits(['register', 'success']);\n  const isUpdate = ref(true);\n  const isDetail = ref(false);\n  //表单配置\n  const [registerForm, { setProps, resetFields, setFieldsValue, validate, scrollToField }] = useForm({\n    labelWidth: 150,\n    schemas: formSchema,\n    showActionButtonGroup: false,\n    baseColProps: { span: 24 },\n    baseRowStyle: { padding: '0 20px' },\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false, showCancelBtn: !!data?.showFooter, showOkBtn: !!data?.showFooter });\n    isUpdate.value = !!data?.isUpdate;\n    isDetail.value = !!data?.showFooter;\n    if (unref(isUpdate)) {\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n    }\n    // 隐藏底部时禁用整个表单\n    setProps({ disabled: !data?.showFooter });\n  });\n  //日期个性化选择\n  const fieldPickers = reactive({});\n  //设置标题\n  const title = computed(() => (!unref(isUpdate) ? '新增' : !unref(isDetail) ? '详情' : '编辑'));\n  //表单提交事件\n  async function handleSubmit(v) {\n    try {\n      let values = await validate();\n      // 预处理日期数据\n      changeDateValue(values);\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      await saveOrUpdate(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success',values);\n    } catch ({ errorFields }) {\n      if (errorFields) {\n        const firstField = errorFields[0];\n        if (firstField) {\n          scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });\n        }\n      }\n      return Promise.reject(errorFields);\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n\n  /**\n   * 处理日期值\n   * @param formData 表单数据\n   */\n  const changeDateValue = (formData) => {\n    if (formData && fieldPickers) {\n      for (let key in fieldPickers) {\n        if (formData[key]) {\n          formData[key] = getDateByPicker(formData[key], fieldPickers[key]);\n        }\n      }\n    }\n  };\n</script>\n\n<style lang=\"less\" scoped>\n  /** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-calendar-picker) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiprompts/components/AiragTrackDetailModal.vue",
    "content": "<template>\n  <BasicModal\n      v-bind=\"$attrs\"\n      @register=\"registerModal\"\n      :canFullscreen=\"true\"\n      :footer=\"null\"\n      destroyOnClose\n      title=\"详情\"\n      wrapClassName=\"track-detail-modal\"\n  >\n    <div class=\"track-detail-container\">\n      <!-- 顶部工具栏 -->\n      <div class=\"toolbar\">\n        <a-button\n            type=\"primary\"\n            size=\"small\"\n            @click=\"toggleFormat\"\n            class=\"format-btn\"\n        >\n          <Icon :icon=\"isFormatted ? 'ant-design:compress-outlined' : 'ant-design:expand-outlined'\" />\n          {{ isFormatted ? '收起' : '展开' }}\n        </a-button>\n      </div>\n\n      <!-- JSON内容显示区域 -->\n      <div class=\"json-content-wrapper\">\n        <div v-if=\"!trackContent\" class=\"empty-state\">\n          <Icon icon=\"ant-design:inbox-outlined\" style=\"font-size: 48px; color: #d9d9d9;\" />\n          <p>暂无轨迹数据</p>\n        </div>\n\n        <div v-else class=\"json-display\">\n          <pre v-if=\"isFormatted\" >{{ formattedJson }}</pre>\n          <pre v-else class=\"raw-json\">{{ trackContent }}</pre>\n        </div>\n      </div>\n\n      <!-- 底部信息栏 -->\n      <div v-if=\"trackContent\" class=\"info-bar\">\n        <span class=\"info-item\">\n          <Icon icon=\"ant-design:info-circle-outlined\" />\n          {{ isFormatted ? '已格式化' : '原始数据' }}\n        </span>\n<!--        <span class=\"info-item\">-->\n<!--          <Icon icon=\"ant-design:file-text-outlined\" />-->\n<!--          字符数: {{ trackContent.length }}-->\n<!--        </span>-->\n      </div>\n    </div>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, computed } from 'vue';\nimport { BasicModal, useModalInner } from '/@/components/Modal';\nimport Icon from '/@/components/Icon/src/Icon.vue';\n\n// 轨迹详情\nconst trackContent = ref('');\nconst isFormatted = ref(true);\n\n// 计算属性：格式化JSON\nconst formattedJson = computed(() => {\n  try {\n    // 尝试解析为JSON并格式化\n    const jsonData = JSON.parse(trackContent.value);\n    return JSON.stringify(jsonData, null, 2);\n  } catch (e) {\n    // 如果不是有效的JSON，返回原始内容\n    return trackContent.value;\n  }\n});\n\n// 切换格式化状态\nconst toggleFormat = () => {\n  isFormatted.value = !isFormatted.value;\n};\n\n// 复制JSON内容\nconst copyJson = async () => {\n  try {\n    const content = isFormatted.value ? formattedJson.value : trackContent.value;\n    await navigator.clipboard.writeText(content);\n    // 这里可以添加一个轻提示\n    console.log('JSON内容已复制到剪贴板');\n  } catch (err) {\n    console.error('复制失败:', err);\n  }\n};\n\n// 表单赋值\nconst [registerModal] = useModalInner(async (data) => {\n  trackContent.value = data?.dataValue || '';\n  // 默认显示格式化内容\n  isFormatted.value = true;\n});\n</script>\n\n<style lang=\"less\" scoped>\n@primary-color: #1890ff;\n@border-color: #e8e8e8;\n@background-color: #f5f7fa;\n@text-color: #262626;\n@text-secondary: #8c8c8c;\n\n.track-detail-container {\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  min-height: 400px;\n}\n\n// 顶部工具栏\n.toolbar {\n  display: flex;\n  justify-content: flex-end;\n  margin-bottom: 16px;\n  padding: 12px 16px;\n  background: @background-color;\n  border-radius: 8px;\n  border: 1px solid @border-color;\n\n  .format-btn {\n    display: flex;\n    align-items: center;\n    gap: 6px;\n    font-size: 14px;\n    transition: all 0.3s;\n\n    &:hover {\n      transform: translateY(-1px);\n      box-shadow: 0 4px 8px rgba(24, 144, 255, 0.2);\n    }\n  }\n}\n\n// JSON内容显示区域\n.json-content-wrapper {\n  flex: 1;\n  overflow: auto;\n  background: white;\n  border: 1px solid @border-color;\n  border-radius: 8px;\n  padding: 16px;\n  position: relative;\n\n  .empty-state {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    height: 200px;\n    color: @text-secondary;\n\n    p {\n      margin-top: 16px;\n      font-size: 16px;\n    }\n  }\n\n  .json-display {\n    pre {\n      margin: 0;\n      padding: 0;\n      font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n      font-size: 14px;\n      line-height: 1.6;\n      white-space: pre-wrap;\n      word-break: break-all;\n      max-height: 500px;\n      overflow: auto;\n    }\n\n    .formatted-json {\n      color: @text-color;\n\n      // JSON语法高亮样式\n      &::before {\n        content: '{';\n        color: #d73a49;\n      }\n\n      &::after {\n        content: '}';\n        color: #d73a49;\n      }\n    }\n\n    .raw-json {\n      color: @text-secondary;\n      background: #fafafa;\n      padding: 12px;\n      border-radius: 4px;\n      border-left: 4px solid @primary-color;\n    }\n  }\n}\n\n// 底部信息栏\n.info-bar {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-top: 16px;\n  padding: 12px 16px;\n  background: @background-color;\n  border-radius: 8px;\n  border: 1px solid @border-color;\n  font-size: 14px;\n  color: @text-secondary;\n\n  .info-item {\n    display: flex;\n    align-items: center;\n    gap: 6px;\n\n    svg {\n      font-size: 16px;\n    }\n  }\n}\n\n// 滚动条样式\n.json-content-wrapper::-webkit-scrollbar,\n.json-display pre::-webkit-scrollbar {\n  width: 8px;\n  height: 8px;\n}\n\n.json-content-wrapper::-webkit-scrollbar-track,\n.json-display pre::-webkit-scrollbar-track {\n  background: #f1f1f1;\n  border-radius: 4px;\n}\n\n.json-content-wrapper::-webkit-scrollbar-thumb,\n.json-display pre::-webkit-scrollbar-thumb {\n  background: #c1c1c1;\n  border-radius: 4px;\n\n  &:hover {\n    background: #a8a8a8;\n  }\n}\n\n// 响应式设计\n@media (max-width: 768px) {\n  .toolbar {\n    padding: 10px 12px;\n  }\n\n  .json-content-wrapper {\n    padding: 12px;\n\n    .json-display pre {\n      font-size: 12px;\n    }\n  }\n\n  .info-bar {\n    flex-direction: column;\n    gap: 8px;\n    align-items: flex-start;\n  }\n}\n</style>\n\n<style lang=\"less\">\n// 模态框样式调整\n.track-detail-modal {\n  .ant-modal-body {\n    padding: 24px;\n    min-height: 500px;\n  }\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiprompts/components/EvaluatorDebug.vue",
    "content": "<template>\n  <div class=\"ai-assessment-container\">\n    <!-- 标题和操作栏 -->\n    <div class=\"assessment-header\">\n      <div class=\"header-left\">\n        <h5 class=\"title\">AI内容评估</h5>\n      </div>\n      <div class=\"header-right\" v-if=\"variable && variable.length > 0\">\n        <a-button type=\"primary\" ghost class=\"clear-btn\" @click=\"handleClear\">\n          <template #icon><DeleteOutlined /></template>\n          清空\n        </a-button>\n        <a-button type=\"primary\" :loading=\"loading\" class=\"run-btn\" @click=\"handleRun\">\n          <template #icon><PlayCircleOutlined /></template>\n          运行\n        </a-button>\n      </div>\n    </div>\n\n    <!-- 评估内容区域 -->\n    <div class=\"assessment-content\" v-if=\"variable && variable.length > 0\">\n      <div class=\"input-section\" v-for=\"item in variable\" :key=\"item.name\">\n        <div class=\"section-header output-header\">\n          <span class=\"section-title\">{{item.name}}</span>\n        </div>\n        <div class=\"section-content output-content\">\n          <a-input v-model:value=\"item.value\" placeholder=\"请输入\" />\n        </div>\n      </div>\n    </div>\n    <div v-else class=\"empty-container\">\n      <Empty\n          :image=\"Empty.PRESENTED_IMAGE_SIMPLE\"\n          description=\"暂无变量\"\n          class=\"custom-empty\"\n      />\n    </div>\n    <!-- 结果内容区域 -->\n    <div class=\"debug-result-container\" v-if=\"result\">\n      <!-- 调试成功提示 -->\n      <div class=\"debug-success\">\n        <div class=\"success-header\">\n          <div class=\"success-icon\">✓</div>\n          <span class=\"success-text\">调试成功</span>\n        </div>\n\n        <!-- 分数显示 -->\n<!--        <div class=\"score-section\">-->\n<!--          <span class=\"score-label\">0 分</span>-->\n<!--          <div class=\"score-note\">-->\n<!--            <span class=\"note-text\">得分仅预览效果，非实际结果。</span>-->\n<!--          </div>-->\n<!--        </div>-->\n\n        <!-- 原因分析 -->\n        <div class=\"reason-section\">\n<!--          <div class=\"reason-label\">原因:</div>-->\n          <div class=\"reason-content\">\n            <span>{{result}}</span>\n          </div>\n        </div>\n\n        <!-- 免责声明 -->\n        <div class=\"disclaimer\">\n          <span class=\"disclaimer-text\">内容由AI生成，无法确保真实准确，仅供参考。</span>\n        </div>\n      </div>\n\n      <!-- 调试失败示例（可选显示） -->\n      <div v-if=\"showFailureExample\" class=\"debug-failure\">\n        <div class=\"failure-header\">\n          <div class=\"failure-icon\">✗</div>\n          <span class=\"failure-text\">调试失败</span>\n        </div>\n\n        <div class=\"error-message\">\n          <span>代码中存在语法错误，请检查后重新调试。</span>\n        </div>\n      </div>\n    </div>\n    \n    <!-- 底部说明 -->\n<!--    <div class=\"assessment-footer\">-->\n<!--      <div class=\"footer-content\">-->\n<!--        <InfoCircleOutlined class=\"footer-icon\" />-->\n<!--        <span>内容由AI生成，无法确保真实准确，仅供参考。</span>-->\n<!--      </div>-->\n<!--    </div>-->\n  </div>\n</template>\n\n<script setup>\nimport { ref, onMounted,watch } from 'vue'\nimport { Empty } from 'ant-design-vue';\nimport {\n  DeleteOutlined,\n  PlayCircleOutlined,\n} from '@ant-design/icons-vue'\n\n// 组件属性\nconst props = defineProps({\n  // 原始内容\n  content: {\n    type: String,\n    default: ``\n  },\n})\n// 控制是否显示失败示例\nconst showFailureExample = ref(false)\n// 运行状态\nconst loading = ref(false)\n// 响应式数据\nconst variable = ref([])\n// 结果\nconst result = ref(\"\")\n// 从内容中提取参数\nconst extractContent = () => {\n  if(props.content){\n    const vars = props.content.match(/{{\\s*([^}\\s]+)\\s*}}/g);\n    if(vars && vars.length > 0){\n      variable.value = vars.map((match) => ({value:\"\",name:match.replace(/{{\\s*|\\s*}}/g, '')}))\n    }\n  }else{\n    variable.value = []\n  }\n}\n\n// 清空操作\nconst handleClear = () => {\n  variable.value.forEach((item) => item.value = '')\n}\n\n// 运行操作\nconst handleRun = () => {\n  // 触发运行事件\n  emit('run', variable.value)\n}\n\n// 定义事件\nconst emit = defineEmits(['clear', 'run'])\n\n// 生命周期\nonMounted(() => {\n  extractContent()\n})\n\n// 监听内容变化\nwatch(() => props.content, extractContent)\n\ndefineExpose({\n  loading,\n  result\n})\n</script>\n\n<style scoped>\n.ai-assessment-container {\n  width: 100%;\n  background: #fafafa;\n  border: 1px solid #e8e8e8;\n  border-radius: 8px;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial;\n  overflow: hidden;\n}\n\n/* 头部样式 */\n.assessment-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 16px 20px;\n  background: #fff;\n  border-bottom: 1px solid #e8e8e8;\n  border-radius: 8px 8px 0 0;\n}\n\n.header-left {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n}\n\n.title {\n  margin: 0;\n  font-size: 14px;\n  font-weight: 600;\n  color: #262626;\n}\n\n.header-right {\n  display: flex;\n  gap: 12px;\n}\n\n.clear-btn {\n  color: #ff4d4f;\n  border-color: #ff4d4f;\n}\n\n.clear-btn:hover {\n  color: #ff7875;\n  border-color: #ff7875;\n}\n\n.run-btn {\n  background: #1890ff;\n  border-color: #1890ff;\n}\n\n.run-btn:hover {\n  background: #40a9ff;\n  border-color: #40a9ff;\n}\n\n/* 内容区域样式 */\n.assessment-content {\n  padding: 20px;\n  display: flex;\n  flex-direction: column;\n  gap: 16px;\n}\n\n/* 通用区块样式 */\n.input-section,\n.output-section {\n  background: #fff;\n  border: 1px solid #e8e8e8;\n  border-radius: 6px;\n  overflow: hidden;\n}\n\n.section-header {\n  display: flex;\n  align-items: center;\n  padding: 12px 16px;\n  border-bottom: 1px solid #f0f0f0;\n}\n\n.section-title {\n  font-size: 14px;\n  font-weight: 500;\n}\n\n/* 输出区域 */\n.output-header {\n  background: #e6f7ff;\n  border-bottom: 1px solid #91d5ff;\n}\n\n.output-icon {\n  color: #1890ff;\n}\n\n.output-content {\n  padding: 16px;\n  background: #e6f7ff;\n  color: #096dd9;\n  font-size: 14px;\n  line-height: 1.5;\n  min-height: 80px;\n}\n\n\n/* 底部样式 */\n.assessment-footer {\n  padding: 12px 20px;\n  background: #fff;\n  border-top: 1px solid #e8e8e8;\n  border-radius: 0 0 8px 8px;\n}\n\n.footer-content {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 12px;\n  color: #8c8c8c;\n}\n\n.footer-icon {\n  font-size: 12px;\n}\n.debug-result-container {\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;\n  max-width: 600px;\n  margin: 20px auto;\n}\n\n/* 成功样式 */\n.debug-success {\n  border: 1px solid #e1e4e8;\n  border-radius: 6px;\n  padding: 16px;\n  background-color: #f6f8fa;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.success-header {\n  display: flex;\n  align-items: center;\n  margin-bottom: 12px;\n}\n\n.success-icon {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 24px;\n  height: 24px;\n  border-radius: 50%;\n  background-color: #2ea44f;\n  color: white;\n  font-weight: bold;\n  font-size: 14px;\n  margin-right: 8px;\n}\n\n.success-text {\n  font-size: 16px;\n  font-weight: 600;\n  color: #24292e;\n}\n\n/* 分数部分 */\n.score-section {\n  margin-bottom: 16px;\n}\n\n.score-label {\n  display: inline-block;\n  font-size: 14px;\n  color: #24292e;\n  margin-bottom: 4px;\n}\n\n.score-note {\n  font-size: 12px;\n  color: #57606a;\n}\n\n.note-text {\n  display: inline-block;\n  padding: 4px 8px;\n  background-color: #f0f0f0;\n  border-radius: 4px;\n}\n\n/* 原因部分 */\n.reason-section {\n  margin-bottom: 16px;\n}\n\n.reason-label {\n  font-size: 14px;\n  font-weight: 600;\n  color: #24292e;\n  margin-bottom: 4px;\n}\n\n.reason-content {\n  font-size: 14px;\n  color: #24292e;\n  padding: 8px 12px;\n  background-color: white;\n  border: 1px solid #d0d7de;\n  border-radius: 4px;\n}\n\n/* 免责声明 */\n.disclaimer {\n  padding: 8px;\n  background-color: #fff8e6;\n  border: 1px solid #ffd33d;\n  border-radius: 4px;\n}\n\n.disclaimer-text {\n  font-size: 12px;\n  color: #57606a;\n  font-style: italic;\n}\n\n/* 失败样式 */\n.debug-failure {\n  margin-top: 20px;\n  border: 1px solid #e1e4e8;\n  border-radius: 6px;\n  padding: 16px;\n  background-color: #fcf2f2;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.failure-header {\n  display: flex;\n  align-items: center;\n  margin-bottom: 12px;\n}\n\n.failure-icon {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 24px;\n  height: 24px;\n  border-radius: 50%;\n  background-color: #cf222e;\n  color: white;\n  font-weight: bold;\n  font-size: 14px;\n  margin-right: 8px;\n}\n\n.failure-text {\n  font-size: 16px;\n  font-weight: 600;\n  color: #cf222e;\n}\n\n.error-message {\n  font-size: 14px;\n  color: #24292e;\n  padding: 8px 12px;\n  background-color: white;\n  border: 1px solid #d0d7de;\n  border-radius: 4px;\n}\n/* 响应式设计 */\n@media (max-width: 768px) {\n  .assessment-header {\n    flex-direction: column;\n    align-items: stretch;\n    gap: 12px;\n  }\n\n  .header-right {\n    justify-content: flex-end;\n  }\n}\n.empty-container {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  min-height: 200px;\n  padding: 40px 0;\n}\n\n.custom-empty {\n  :deep(.ant-empty-image) {\n    height: 80px;\n    margin-bottom: 16px;\n  }\n\n  :deep(.ant-empty-description) {\n    font-size: 14px;\n    color: #8c8c8c;\n  }\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiwriter/AiWriter.vue",
    "content": "<template>\n  <div class=\"writer-wrap\">\n    <div class=\"sidebar\">\n      <AiWriterLeft @generate=\"onGenerate\" />\n    </div>\n    <div class=\"preview\" ref=\"previewRef\">\n      <div class=\"preview-header\">\n        <div class=\"preview-header-left\">\n          <span class=\"preview-title-text\">{{ isEditing ? '编辑' : '预览' }}</span>\n          <a-select\n            v-if=\"historyData && historyData.length\"\n            v-model:value=\"activeVersion\"\n            size=\"small\"\n            class=\"version-select\"\n            @change=\"handleVersionChange\"\n          >\n            <a-select-option :value=\"CURRENT_VERSION_KEY\">当前内容</a-select-option>\n            <a-select-option v-for=\"item in historyData\" :key=\"item.version\" :value=\"item.version\">\n              {{ item.version }}\n            </a-select-option>\n          </a-select>\n          <a-button\n            v-if=\"historyData && historyData.length && activeVersion !== CURRENT_VERSION_KEY\"\n            type=\"link\"\n            size=\"small\"\n            class=\"preview-action-btn version-delete-btn\"\n            @click=\"handleDeleteVersion\"\n          >\n            <DeleteOutlined />\n            删除\n          </a-button>\n        </div>\n        <div class=\"preview-actions\">\n          <a-button v-if=\"!generating\" type=\"link\" size=\"small\" class=\"preview-action-btn custom-save-btn\" @click=\"toggleEdit\">\n            <FormOutlined v-if=\"!isEditing\" />\n            <CheckOutlined v-else />\n            {{ isEditing ? '完成' : '编辑' }}\n          </a-button>\n          <a-button\n            v-if=\"!generating\"\n            type=\"link\"\n            size=\"small\"\n            class=\"preview-action-btn custom-save-btn\"\n            :loading=\"polishLoading\"\n            @click=\"handlePolish\"\n          >\n            <ThunderboltOutlined class=\"preview-actions-icon\" style=\"position: relative; top: 1px\" />\n            润色\n          </a-button>\n          <a-tooltip title=\"保存草稿\">\n            <a-button v-if=\"!generating\" type=\"link\" size=\"small\" class=\"preview-action-btn custom-save-btn\" :loading=\"saving\" @click=\"handleSave\">\n              <SaveOutlined class=\"preview-actions-icon\" />\n              保存\n            </a-button>\n          </a-tooltip>\n          <a-tooltip title=\"复制内容\">\n            <a-button type=\"link\" size=\"small\" class=\"preview-action-btn custom-save-btn\" @click=\"handleCopy\">\n              <CopyOutlined class=\"preview-actions-icon\" />\n              复制\n            </a-button>\n          </a-tooltip>\n        </div>\n      </div>\n      <div v-if=\"!isEditing\" v-html=\"previewMd\" class=\"markdown-container\" @click=\"!generating\" />\n      <div v-else class=\"markdown-editor-container\">\n        <JMarkdownEditor v-model:value=\"writeText\" height=\"100vh\" :preview=\"{ mode: 'view', action: [] }\" />\n      </div>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\n  import { ref, computed, nextTick, onMounted } from 'vue';\n  import AiWriterLeft from './AiWriterLeft.vue';\n  import { defHttp } from '@/utils/http/axios';\n  import { CopyOutlined, ThunderboltOutlined, FormOutlined, CheckOutlined, SaveOutlined, DeleteOutlined } from '@ant-design/icons-vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { copyTextToClipboard } from '/@/hooks/web/useCopyToClipboard';\n  import { Modal } from 'ant-design-vue';\n  import MarkdownIt from 'markdown-it';\n  import mdKatex from '@traptitech/markdown-it-katex';\n  import mila from 'markdown-it-link-attributes';\n  import hljs from 'highlight.js';\n  import JMarkdownEditor from '/@/components/Form/src/jeecg/components/JMarkdownEditor.vue';\n  import '/@/views/super/airag/aiapp/chat/style/github-markdown.less';\n  import '/@/views/super/airag/aiapp/chat/style/highlight.less';\n  import '/@/views/super/airag/aiapp/chat/style/style.less';\n\n  const { createMessage } = useMessage();\n  const writeText = ref<string>('');\n  const previewRef = ref<HTMLElement | null>(null);\n  //生成的loading\n  const generating = ref<boolean>(false);\n  //是否编辑\n  const isEditing = ref<boolean>(false);\n  //润色的loading\n  const polishLoading = ref<boolean>(false);\n  //保存loading\n  const saving = ref<boolean>(false);\n  //左侧的内容\n  const leftData = ref<any>();\n  //历史数据\n  const historyData = ref<any>([]);\n  //ai提示文本\n  const aiText = ref<string>('');\n  //当期版本的key\n  const CURRENT_VERSION_KEY = 'CURRENT';\n  //当前选中的本本\n  const activeVersion = ref<string>(CURRENT_VERSION_KEY);\n  //原始内容\n  const originalContent = ref<string | null>(null);\n  //第一个回复节点之后的内容\n  const afterNodeFinished = ref<boolean>(false);\n  const mdi = new MarkdownIt({\n    html: true,\n    linkify: true,\n    highlight(code, language) {\n      const validLang = !!(language && hljs.getLanguage(language));\n      if (validLang) {\n        const lang = language ?? '';\n        return highlightBlock(hljs.highlight(code, { language: lang }).value, lang);\n      }\n      return highlightBlock(hljs.highlightAuto(code).value, '');\n    },\n  });\n  mdi.use(mila, { attrs: { target: '_blank', rel: 'noopener' } });\n  mdi.use(mdKatex, { blockClass: 'katexmath-block rounded-md p-[10px]', errorColor: ' #cc0000' });\n\n  //返回文本（生成中在末尾追加打点）\n  const previewMd = computed(() => {\n    let content = writeText.value || aiText.value;\n    if (generating.value) {\n      content +=\n        ' <span class=\"typing-dot\"></span><span class=\"typing-dot\" style=\"animation-delay: 0.2s\"></span><span class=\"typing-dot\" style=\"animation-delay: 0.4s\"></span>';\n    }\n    return mdi.render(content);\n  });\n\n  /**\n   * 编辑\n   */\n  function toggleEdit() {\n    if (generating.value) {\n      return;\n    }\n    isEditing.value = !isEditing.value;\n  }\n\n  /**\n   * 复制\n   */\n  function handleCopy() {\n    if (!writeText.value) {\n      createMessage.warning('暂无内容可复制');\n      return;\n    }\n    const success = copyTextToClipboard(writeText.value);\n    if (success) {\n      createMessage.success('复制成功');\n    } else {\n      createMessage.error('复制失败');\n    }\n  }\n\n  function scrollToBottom() {\n    const el = previewRef.value;\n    if (!el) return;\n    el.scrollTop = el.scrollHeight;\n  }\n\n  /**\n   * 生成\n   *\n   * @param data\n   * @param type\n   */\n  async function onGenerate(data, type = '') {\n    isEditing.value = false;\n    data.responseMode = 'streaming';\n    writeText.value = '';\n    generating.value = true;\n    activeVersion.value = CURRENT_VERSION_KEY;\n    if (!type) {\n      leftData.value = data;\n    }\n\n    try {\n      let readableStream = await defHttp\n        .post(\n          {\n            url: '/airag/chat/genAiWriter',\n            params: { ...data },\n            timeout: 5 * 60 * 1000,\n            adapter: 'fetch',\n            responseType: 'stream',\n          },\n          {\n            isTransformResponse: false,\n          }\n        )\n        .catch((res) => {\n          createMessage.warn(res.message ? res.message : '请求出错，请稍后重试！');\n        });\n\n      const reader = readableStream.getReader();\n      const decoder = new TextDecoder('UTF-8');\n      let buffer = '';\n\n      while (true) {\n        const { done, value } = await reader.read();\n        if (done) {\n          break;\n        }\n        let chunk = decoder.decode(value, { stream: true });\n        buffer += chunk;\n\n        // 处理可能被截断的消息\n        const lines = buffer.split('\\n\\n');\n        // 保留最后一个片段（可能不完整）\n        buffer = lines.pop() || '';\n        for (const line of lines) {\n          if (line.startsWith('data:')) {\n            const content = line.replace('data:', '').trim();\n            if(!content){\n              continue;\n            }\n            if(!content.endsWith('}')){\n              buffer = buffer + line;\n              continue;\n            }\n            buffer = \"\";\n            renderText(content)\n          } else {\n            if(!line) {\n              continue;\n            }\n            if(!line.endsWith('}')) {\n              buffer = buffer + line;\n              continue;\n            }\n            buffer = \"\";\n            renderText(line)\n          }\n        }\n      }\n    } catch (e) {\n      console.error('Generation error:', e);\n      writeText.value += '\\n\\n[生成出错]';\n    } finally {\n      // 若服务端结束未触发 MESSAGE_END，兜底关闭生成状态\n      generating.value = false;\n    }\n  }\n\n  /**\n   * 渲染文本\n   *\n   * @param item\n   */\n  function renderText(item) {\n    try {\n      let parse = JSON.parse(item);\n      if(parse.event == 'NODE_FINISHED'){\n        afterNodeFinished.value = true;\n        return;\n      }\n      if (parse.event == 'MESSAGE') {\n        aiText.value = '';\n        if (afterNodeFinished.value) {\n          writeText.value = parse.data.message;\n          afterNodeFinished.value = false;\n        } else {\n          writeText.value += parse.data.message;\n        }\n        generating.value = true;\n        polishLoading.value = true;\n        nextTick(scrollToBottom);\n      }\n      if (parse.event == 'MESSAGE_END') {\n        generating.value = false;\n        if (activeVersion.value === CURRENT_VERSION_KEY) {\n          originalContent.value = writeText.value;\n        }\n        nextTick(scrollToBottom);\n      }\n      if (parse.event == 'ERROR') {\n        writeText.value = parse.data.message ? parse.data.message : '生成失败，请稍后重试！';\n        generating.value = false;\n        polishLoading.value = false;\n        nextTick(scrollToBottom);\n      }\n      \n      //开始加点\n      if (parse.event === 'NODE_STARTED') {\n        if (!parse.data || parse.data.type !== 'end') {\n          if (parse.data.type === 'llm' || parse.data.type === 'reply') {\n            aiText.value = '正在构建响应内容';\n          }\n        }\n      }\n      //流程结束节点\n      if (parse.event == 'FLOW_FINISHED') {\n        if (parse.data && !parse.data.success) {\n          writeText.value = parse.data.message ? parse.data.message : '生成失败，请稍后重试！';\n        }\n        generating.value = false;\n        polishLoading.value = false;\n      }\n    } catch (error) {\n      console.log('Error parsing update:', error);\n    }\n  }\n\n  /**\n   * 代码块\n   * @param str\n   * @param lang\n   */\n  function highlightBlock(str: string, lang?: string) {\n    return `<pre class=\"code-block-wrapper\"><div class=\"code-block-header\"><span class=\"code-block-header__lang\">${lang}</span><span class=\"code-block-header__copy\">复制代码</span></div><code class=\"hljs code-block-body ${lang}\">${str}</code></pre>`;\n  }\n\n\n  /**\n   * 润色\n   */\n  async function handlePolish() {\n    if (!writeText.value) {\n      createMessage.warning('暂无内容可润色');\n      return;\n    }\n    if (generating.value || polishLoading.value) {\n      return;\n    }\n    polishLoading.value = true;\n    const data: any = {\n      prompt: writeText.value,\n      originalContent: '',\n      length: leftData.value.length,\n      format: leftData.value.format,\n      tone: leftData.value.tone,\n      language: leftData.value.language,\n      activeMode: 'polish',\n    };\n    try {\n      await onGenerate(data, 'polish');\n    } finally {\n      polishLoading.value = false;\n    }\n  }\n\n  /**\n   * 保存\n   */\n  async function handleSave() {\n    if (!writeText.value) {\n      createMessage.warning('暂无内容可保存');\n      return;\n    }\n    if (saving.value) {\n      return;\n    }\n    try {\n      saving.value = true;\n      await defHttp.post({ url: '/airag/app/save/article/write', params: { content: writeText.value } });\n      if (activeVersion.value === CURRENT_VERSION_KEY) {\n        originalContent.value = writeText.value;\n      }\n      initHistoryData();\n    } catch (e) {\n      createMessage.error('保存失败，请稍后重试');\n    } finally {\n      saving.value = false;\n    }\n  }\n\n  /**\n   * 初始化历史信息\n   */\n  function initHistoryData() {\n    historyData.value = [];\n    defHttp.get({ url: \"/airag/app/list/article/write\" }, { isTransformResponse: false }).then((res)=>{\n      if(res.success){\n        historyData.value = res.result;\n      }\n    })\n  }\n\n  /**\n   * 版本删除\n   */\n  async function handleDeleteVersion() {\n    if (activeVersion.value === CURRENT_VERSION_KEY) {\n      return;\n    }\n    const target = historyData.value.find((item) => item.version === activeVersion.value);\n    if (!target) {\n      return;\n    }\n    Modal.confirm({\n      title: '删除版本',\n      content: '是否确认删除该版本？',\n      okText: '确定',\n      cancelText: '取消',\n      async onOk() {\n        try {\n          await defHttp.delete(\n            { url: '/airag/app/delete/article/write', params: { version: target.version } },\n            { joinParamsToUrl: true }\n          );\n          historyData.value = historyData.value.filter((item) => item.version !== target.version);\n          activeVersion.value = CURRENT_VERSION_KEY;\n          writeText.value = originalContent.value ?? '';\n        } catch (e) {\n          createMessage.error('删除失败，请稍后重试');\n        }\n      },\n    });\n  }\n\n  /**\n   * 版本切换事件\n   * @param value\n   */\n  function handleVersionChange(value: string) {\n    if (value === CURRENT_VERSION_KEY) {\n      activeVersion.value = value;\n      writeText.value = originalContent.value ?? '';\n      return;\n    }\n    const target = historyData.value.find((item) => item.version === value);\n    if (!target) {\n      return;\n    }\n    activeVersion.value = value;\n    writeText.value = target.content;\n  }\n  \n  onMounted(() => {\n    //初始化的时候加载历史版本\n    initHistoryData();\n  });\n</script>\n\n<style scoped lang=\"less\">\n  .writer-wrap {\n    display: flex;\n    height: 100%;\n    padding: 16px;\n    gap: 16px;\n    background: #fff;\n  }\n\n  .sidebar {\n    width: 340px;\n    flex-shrink: 0;\n    border: 1px solid #eef0f5;\n    border-radius: 12px;\n    padding: 16px;\n    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.03);\n    background: #fff;\n    overflow: visible;\n    position: sticky;\n    top: 16px;\n  }\n  /*begin  头部样式 */\n  .preview {\n    flex: 1;\n    border: 1px solid #eef0f5;\n    border-radius: 12px;\n    padding: 16px 20px;\n    overflow: auto;\n    background: #fafbff;\n    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.03);\n  }\n\n  .preview-header {\n    font-size: 14px;\n    color: #344767;\n    margin-bottom: 12px;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    border-bottom: 1px solid #eef0f5;\n    padding-bottom: 10px;\n  }\n  .preview-header-left {\n    display: flex;\n    align-items: center;\n    gap: 12px;\n  }\n\n  .preview-title-text {\n    font-weight: 500;\n    letter-spacing: 0.5px;\n  }\n\n  .preview-actions {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n  }\n\n  .version-select {\n    min-width: 120px;\n  }\n  \n  .preview-action-btn {\n    padding: 0 14px;\n    font-size: 12px;\n    border-radius: 4px;\n    height: 26px;\n    line-height: 24px;\n  }\n\n  .custom-green-btn {\n    background-color: @primary-color;\n    border-color: @primary-color;\n    color: #ffffff;\n\n    &:hover,\n    &:focus {\n      background-color: @primary-color;\n      border-color: @primary-color;\n      color: #ffffff;\n    }\n  }\n\n  .preview-actions-icon {\n    font-size: 12px;\n    color: white;\n  }\n\n  .custom-save-btn, .version-delete-btn {\n    background-color: #ffffff;\n    border-color: @primary-color;\n    color: @primary-color;\n\n    &:hover,\n    &:focus {\n      background-color: fade(@primary-color, 10%);\n      border-color: @primary-color;\n      color: @primary-color;\n    }\n\n    .preview-actions-icon {\n      color: @primary-color;\n    }\n  }\n  /*end  头部样式 */\n\n  /*begin 编辑器的样式*/\n  .markdown-container {\n    min-height: 300px;\n    padding: 8px 4px 16px 4px;\n    border-radius: 8px;\n    background-color: #fff;\n    cursor: text;\n    :deep(img) {\n      width: 40% !important;\n      max-width: 280px;\n      height: auto;\n      border-radius: 6px;\n      display: block;\n    }\n  }\n\n  .markdown-editor-container {\n    min-height: 300px;\n  }\n\n  :deep(.typing-dot) {\n    display: inline-block;\n    width: 6px;\n    height: 6px;\n    margin-left: 3px;\n    border-radius: 50%;\n    background-color: #999;\n    vertical-align: baseline;\n    animation: typing-dot 1.2s infinite ease-in-out;\n  }\n\n  @keyframes typing-dot {\n    0%,\n    80%,\n    100% {\n      transform: scale(0.6);\n      opacity: 0.6;\n    }\n    40% {\n      transform: scale(1);\n      opacity: 1;\n    }\n  }\n  /*end 编辑器的样式*/\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/aiwriter/AiWriterLeft.vue",
    "content": "<template>\n  <div class=\"writer-sidebar\">\n    <div class=\"mode-tabs\">\n      <div class=\"tab-item\" :class=\"{ active: activeMode === 'compose' }\" @click=\"activeModeClick('compose')\"> 撰写 </div>\n      <div class=\"tab-item\" :class=\"{ active: activeMode === 'reply' }\" @click=\"activeModeClick('reply')\"> 回复 </div>\n    </div>\n\n    <div class=\"form-content\">\n      <a-form layout=\"vertical\">\n        <template v-if=\"activeMode === 'reply'\">\n          <a-form-item>\n            <template #label>\n              <div style=\"display: flex; justify-content: space-between; width: 100%; align-items: center\">\n                <span>原文</span>\n                <span class=\"example-link\" @click=\"fillExample\">示例</span>\n              </div>\n            </template>\n            <a-textarea\n              v-model:value=\"formData.originalContent\"\n              :auto-size=\"{ minRows: 4, maxRows: 6 }\"\n              :maxlength=\"500\"\n              show-count\n              placeholder=\"请输入原文\"\n            />\n          </a-form-item>\n          <a-form-item label=\"回复内容\">\n            <a-textarea\n              v-model:value=\"formData.prompt\"\n              :auto-size=\"{ minRows: 4, maxRows: 6 }\"\n              :maxlength=\"500\"\n              show-count\n              placeholder=\"请输入回复内容\"\n            />\n          </a-form-item>\n        </template>\n        <template v-else>\n          <a-form-item>\n            <template #label>\n              <div style=\"display: flex; justify-content: space-between; width: 100%; align-items: center\">\n                <span>写作内容</span>\n                <span class=\"example-link\" @click=\"fillComposeExample\">示例</span>\n              </div>\n            </template>\n            <a-textarea\n              v-model:value=\"formData.prompt\"\n              :auto-size=\"{ minRows: 6, maxRows: 12 }\"\n              :maxlength=\"500\"\n              show-count\n              placeholder=\"请输入写作内容\"\n            />\n          </a-form-item>\n        </template>\n\n        <a-form-item label=\"长度\">\n          <div class=\"tag-group\">\n            <span\n              v-for=\"item in options.length\"\n              :key=\"item.value\"\n              class=\"custom-tag\"\n              :class=\"{ active: formData.length === item.value }\"\n              @click=\"formData.length = item.value\"\n            >\n              {{ item.label }}\n            </span>\n          </div>\n        </a-form-item>\n\n        <a-form-item label=\"格式\">\n          <div class=\"tag-group\">\n            <span\n              v-for=\"item in options.format\"\n              :key=\"item.value\"\n              class=\"custom-tag\"\n              :class=\"{ active: formData.format === item.value }\"\n              @click=\"formData.format = item.value\"\n            >\n              {{ item.label }}\n            </span>\n          </div>\n        </a-form-item>\n\n        <a-form-item label=\"语气\">\n          <div class=\"tag-group\">\n            <span\n              v-for=\"item in options.tone\"\n              :key=\"item.value\"\n              class=\"custom-tag\"\n              :class=\"{ active: formData.tone === item.value }\"\n              @click=\"formData.tone = item.value\"\n            >\n              {{ item.label }}\n            </span>\n          </div>\n        </a-form-item>\n\n        <a-form-item label=\"语言\">\n          <div class=\"tag-group\">\n            <span\n              v-for=\"item in options.language\"\n              :key=\"item.value\"\n              class=\"custom-tag\"\n              :class=\"{ active: formData.language === item.value }\"\n              @click=\"formData.language = item.value\"\n            >\n              {{ item.label }}\n            </span>\n          </div>\n        </a-form-item>\n      </a-form>\n    </div>\n\n    <div class=\"action-footer\">\n      <a-button @click=\"handleReset\" style=\"margin-right: 10px\">重置</a-button>\n      <a-button type=\"primary\" @click=\"handleGenerate\">生成</a-button>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\n  import { ref, reactive } from 'vue';\n  import { useMessage } from '@/hooks/web/useMessage';\n\n  const emit = defineEmits(['generate', 'reset', 'update:modelValue']);\n  const { createMessage } = useMessage();\n  const activeMode = ref('compose');\n\n  const formData = reactive({\n    prompt: '',\n    originalContent: '',\n    length: '自动',\n    format: '自动',\n    tone: '自动',\n    language: '自动',\n    activeMode: 'compose',\n  });\n\n  const options = {\n    //长度\n    length: [\n      { label: '自动', value: '自动' },\n      { label: '短', value: '短' },\n      { label: '中等', value: '中等' },\n      { label: '长', value: '长' },\n    ],\n    //格式化\n    format: [\n      { label: '自动', value: '自动' },\n      { label: '电子邮件', value: '电子邮件' },\n      { label: '消息', value: '消息' },\n      { label: '评论', value: '评论' },\n      { label: '段落', value: '段落' },\n      { label: '文章', value: '文章' },\n      { label: '博客文章', value: '博客文章' },\n      { label: '想法', value: '想法' },\n      { label: '大纲', value: '大纲' },\n    ],\n    //语气\n    tone: [\n      { label: '自动', value: '自动' },\n      { label: '友善', value: '友善' },\n      { label: '随意', value: '随意' },\n      { label: '专业', value: '专业' },\n      { label: '诙谐', value: '诙谐' },\n      { label: '有趣', value: '有趣' },\n      { label: '正式', value: '正式' },\n    ],\n    //语言\n    language: [\n      { label: '自动', value: '自动' },\n      { label: '中文', value: '中文' },\n      { label: '英文', value: '英文' },\n      { label: '韩语', value: '韩语' },\n      { label: '日语', value: '日语' },\n    ],\n  };\n\n  /**\n   * 撰写和回复切换事件\n   * @param type\n   */\n  function activeModeClick(type) {\n    activeMode.value = type;\n    formData.originalContent = '';\n    formData.prompt = '';\n  }\n\n  /**\n   * 重置\n   */\n  function handleReset() {\n    formData.originalContent = '';\n    formData.prompt = '';\n    formData.length = '自动';\n    formData.format = '自动';\n    formData.tone = '自动';\n    formData.language = '自动';\n    formData.activeMode = 'compose';\n    emit('reset');\n  }\n\n  /**\n   * 生成\n   */\n  function handleGenerate() {\n    if (activeMode.value === 'compose' && !formData.prompt) {\n      createMessage.warn('请填写写作内容!');\n      return;\n    }\n    if (activeMode.value === 'reply' && !formData.prompt) {\n      createMessage.warn('请填写原文!');\n      return;\n    }\n    if (activeMode.value === 'reply' && !formData.originalContent) {\n      createMessage.warn('请填写回复!');\n      return;\n    }\n    formData.activeMode = activeMode.value;\n    emit('generate', { ...formData, mode: activeMode.value });\n  }\n\n  /**\n   * 回复示例\n   */\n  function fillExample() {\n    formData.originalContent = '关于下周一项目进度会议的安排通知。';\n    formData.prompt = '我已收到，下周一会准时前往';\n  }\n\n  /**\n   * 创作示例\n   */\n  function fillComposeExample() {\n    formData.prompt = '介绍一下 Vue3 的整体架构';\n    formData.originalContent = '';\n  }\n</script>\n\n<style scoped lang=\"less\">\n  .writer-sidebar {\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n    position: relative;\n\n    .mode-tabs {\n      display: flex;\n      background: #f1f3f6;\n      border-radius: 8px;\n      padding: 4px;\n      margin-bottom: 16px;\n      flex-shrink: 0;\n      position: sticky;\n      top: 0;\n      z-index: 5;\n\n      .tab-item {\n        flex: 1;\n        text-align: center;\n        padding: 6px 0;\n        font-size: 14px;\n        color: #666;\n        cursor: pointer;\n        border-radius: 6px;\n        transition: all 0.3s;\n\n        &.active {\n          background: #fff;\n          color: #1677ff;\n          font-weight: 500;\n          box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n        }\n      }\n    }\n\n    .form-content {\n      flex: 1;\n      overflow-y: auto;\n      padding-right: 8px;\n\n      &::-webkit-scrollbar {\n        width: 4px;\n      }\n      &::-webkit-scrollbar-thumb {\n        background: #ccc;\n        border-radius: 2px;\n      }\n    }\n\n    .action-footer {\n      padding-top: 16px;\n      display: flex;\n      justify-content: center;\n      border-top: 1px solid #f0f0f0;\n      flex-shrink: 0;\n      position: sticky;\n      bottom: 0;\n      background: #fff;\n      z-index: 5;\n    }\n\n    .tag-group {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 8px;\n    }\n\n    .custom-tag {\n      padding: 2px 10px;\n      border: 1px solid #d9d9d9;\n      border-radius: 4px;\n      font-size: 12px;\n      color: #666;\n      cursor: pointer;\n      transition: all 0.3s;\n      background: #fff;\n\n      &:hover {\n        color: #1677ff;\n        border-color: #1677ff;\n      }\n\n      &.active {\n        color: #1677ff;\n        border-color: #1677ff;\n        background: #e6f7ff;\n      }\n    }\n\n    .example-link {\n      color: #1677ff;\n      cursor: pointer;\n      font-size: 12px;\n      float: right;\n    }\n\n    :deep(.ant-form-item-label) {\n      display: flex;\n      justify-content: space-between;\n      width: 100%;\n\n      > label {\n        flex: 1;\n      }\n\n      .ant-form-item-extra {\n        min-height: unset;\n      }\n    }\n\n    // Custom fix to put extra in label line if possible, but Ant Design puts extra below.\n    // So I used a slot in label or handled it via absolute positioning if needed.\n    // But standard ant form label slot might be better.\n    // Above I used #extra slot which goes below.\n    // I put example-link in #extra slot of form-item in template.\n    // Actually, I should probably put it in the label slot if I want it on the same line.\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/ocr/AiOcr.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { Modal } from 'ant-design-vue';\n\nexport enum Api {\n  list = '/airag/ocr/list',\n  add = '/airag/ocr/add',\n  edit = '/airag/ocr/edit',\n  deleteById = '/airag/ocr/deleteById',\n  flowRun = '/airag/flow/run',\n}\n\n/**\n * 查询ocr列表\n *\n * @param params\n */\nexport const list = (params) => {\n  return defHttp.get({ url: Api.list, params });\n};\n\n/**\n * 添加Orc\n * @param params\n * @param handleSuccess\n */\nexport const addOcr = (params) => {\n  return defHttp.post({ url: Api.add, params });\n};\n\n/**\n * 编辑Orc\n * @param params\n * @param handleSuccess\n */\nexport const editOcr = (params) => {\n  return defHttp.put({ url: Api.edit, params });\n};\n\n/**\n * 根据id删除 Orc\n * @param params\n * @param handleSuccess\n */\nexport const deleteOcrById = (params) => {\n  return defHttp.delete({ url: Api.deleteById, params });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/ocr/AiOcr.data.ts",
    "content": "import { BasicColumn, FormSchema } from '@/components/Table';\n\n//ocr表格\nexport const columns: BasicColumn[] = [\n  {\n    title: '编号',\n    dataIndex: 'id',\n    ifShow: false,\n  },\n  {\n    title: '标题',\n    dataIndex: 'title',\n    ellipsis: true,\n    width: 300,\n  },\n  {\n    title: '提示词',\n    dataIndex: 'prompt',\n    ellipsis: true,\n    width: 300,\n  },\n];\n\n//ocr表单\nexport const schemas: FormSchema[] = [\n  {\n    label: '',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '标题',\n    field: 'title',\n    component: 'Input',\n    required: true,\n  },\n  {\n    label: '提示词',\n    field: 'prompt',\n    component: 'InputTextArea',\n    componentProps: {\n      row: 4,\n      autosize: { minRows: 4, maxRows: 6 },\n    },\n    required: true,\n  },\n];\n\n//ocr解析表单\nexport const analysisSchemas: FormSchema[] = [\n  {\n    label: '',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '图片',\n    field: 'url',\n    component: 'JImageUpload',\n    required: true,\n  },\n  {\n    label: '提示词',\n    field: 'prompt',\n    component: 'InputTextArea',\n    componentProps: {\n      row: 2,\n      autosize: { minRows: 2, maxRows: 2 },\n      placeholder:\"请填写提示词，如提取图片中的文字\"\n    }\n  },\n  {\n    label: '解析结果',\n    field: 'analysisResult',\n    component: 'InputTextArea',\n    componentProps: {\n      row: 10,\n      autosize: { minRows: 10, maxRows: 10 },\n      readonly: true,\n      placeholder:\"解析结果将在这里显示\"\n    },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/ocr/AiOcrList.vue",
    "content": "<template>\n  <div class=\"ocr-page p-2\">\n    <AiOcrAnalysisModal />\n<!--    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      &lt;!&ndash;插槽:table标题&ndash;&gt;\n      <template #tableTitle>\n        <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"handleCreate\">新增</a-button>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n    </BasicTable>-->\n<!--    <AiOcrModal @register=\"registerModal\" @success=\"reload()\"></AiOcrModal>-->\n  </div>\n</template>\n<script lang=\"ts\" name=\"site-list\" setup>\n  import { ref } from 'vue';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { list, deleteOcrById } from './AiOcr.api';\n  import { columns } from './AiOcr.data';\n  import AiOcrModal from './components/AiOcrModal.vue';\n  import AiOcrAnalysisModal from './components/AiOcrAnalysisModal.vue';\n\n  const [registerModal, { openModal }] = useModal();\n  const [registerAnalysisModal, { openModal: openAnalysisModal }] = useModal();\n  \n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext } = useListPage({\n    tableProps: {\n      api: list,\n      columns,\n      useSearchForm: false,\n      pagination: false,\n      actionColumn: {\n        width: 120,\n      },\n      canResize: false,\n    },\n  });\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;\n\n  /**\n   * 新增\n   */\n  function handleCreate() {\n    openModal(true, {});\n  }\n\n  /**\n   * 编辑\n   */\n  function handleEdit(record: Recordable) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n      showFooter: true,\n    });\n  }\n\n  /**\n   * 删除\n   */\n  async function handleDelete(id) {\n    await deleteOcrById({ id: id });\n    reload();\n  }\n\n  /**\n   * 解析\n   * @param record\n   */\n  function handleAnalysis(record){\n    openAnalysisModal(true,{\n      isUpdate: true,\n      record\n    })\n  }\n  \n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '解析',\n        onClick: handleAnalysis.bind(null, record),\n      },\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          placement: 'left',\n          confirm: handleDelete.bind(null, record.id),\n        },\n      },\n    ];\n  }\n</script>\n<style lang=\"less\" scoped>\n  .ocr-page{\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n    gap: 12px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/ocr/components/AiOcrAnalysisModal.vue",
    "content": "<template>\n  <div class=\"analysis-panel\">\n    <div class=\"panel-header\">\n      <div class=\"title\">\n        <span class=\"icon-dot\"></span>\n        <span class=\"main\">智能 OCR 解析</span>\n        <span class=\"sub\">上传图片，快速识别并结构化输出</span>\n      </div>\n      <a-button type=\"primary\" size=\"large\" class=\"parse-btn\" :loading=\"loading\" @click=\"analysisHandleClick\">解析</a-button>\n    </div>\n    <div class=\"form-body\">\n      <a-spin tip=\"解析中，请稍后\" :spinning=\"loading\">\n        <BasicForm @register=\"registerForm\" />\n      </a-spin>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" name=\"AiOcrAnalysis\" setup>\n  import { ref, watch, PropType } from 'vue';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { analysisSchemas } from '../AiOcr.data';\n  import { Api } from '../AiOcr.api';\n  import { defHttp } from '@/utils/http/axios';\n  import { useMessage } from '@/hooks/web/useMessage';\n\n  const { createMessage } = useMessage();\n  const loading = ref<boolean>(false);\n  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n    schemas: analysisSchemas,\n    showActionButtonGroup: false,\n    layout: 'vertical',\n    wrapperCol: { span: 24 },\n  });\n\n  async function analysisHandleClick() {\n    const values = await validate();\n    loading.value = true;\n    await defHttp\n      .post(\n        {\n          url: Api.flowRun,\n          params: {\n            flowId: '1904779811574784002',\n            inputParams: {\n              content: values.prompt ? values.prompt: '解析图片中的文字',\n              images: values.url,\n            },\n            responseMode: 'blocking',\n          },\n          timeout: 5 * 60 * 1000,\n        },\n        {\n          isTransformResponse: false,\n        }\n      )\n      .then((res) => {\n        if (res.success) {\n          //update-begin---author:wangshuai---date:2026-01-14---for: OCR数据返回信息报错，增加try catch---\n          let text = res.result.data.replace(/\\s+/g, '').replace('```json','').replace('```','');\n          let lastText = \"\";\n          try {\n            let parse = JSON.parse(text);\n            lastText = parse.text;\n          } catch (e) {\n            lastText = text;\n          }\n          //update-end---author:wangshuai---date:2026-01-14---for:  OCR数据返回信息报错，增加try catch---\n          setFieldsValue({ analysisResult: lastText });\n        } else {\n          createMessage.warning(res.message);\n        }\n        loading.value = false;\n      }).catch((res)=>{\n          createMessage.warning(res.message);\n          loading.value = false;\n      });\n  }\n</script>\n\n<style lang=\"less\" scoped>\n  .analysis-panel {\n    background: #fff;\n    padding: 20px;\n    border-radius: 16px;\n    border: 1px solid #e6f4ff;\n    box-shadow: 0 12px 30px rgba(22, 119, 255, 0.08), 0 6px 18px rgba(0, 0, 0, 0.06);\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n  }\n  .panel-header {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    margin-bottom: 14px;\n  }\n  .form-body {\n    flex: 1;\n    overflow: auto;\n  }\n  .title {\n    display: inline-flex;\n    align-items: baseline;\n    gap: 10px;\n  }\n  .icon-dot {\n    width: 8px;\n    height: 8px;\n    border-radius: 50%;\n    background: linear-gradient(135deg, #1677ff 0%, #69b1ff 100%);\n    box-shadow: 0 0 0 6px rgba(22, 119, 255, 0.08);\n  }\n  .main {\n    font-size: 18px;\n    font-weight: 600;\n    color: #1f2328;\n  }\n  .sub {\n    font-size: 13px;\n    color: #86909c;\n  }\n  .parse-btn {\n    border-radius: 8px;\n    box-shadow: 0 6px 16px rgba(22, 119, 255, 0.25);\n  }\n  :deep(.ant-form-item) {\n    margin-bottom: 16px;\n  }\n  :deep(.ant-form-item-label > label) {\n    color: #3a3a3a;\n    font-weight: 500;\n  }\n\n\n  :deep(.ant-input-textarea-show-count > .ant-input-textarea) {\n    background: #fafafa;\n    border-radius: 10px;\n    border: 1px solid #e5e6eb;\n    transition: all .2s ease;\n  }\n  :deep(.ant-input:focus),\n  :deep(textarea.ant-input:focus),\n  :deep(.ant-input-focused) {\n    border-color: #1677ff !important;\n    box-shadow: 0 0 0 3px rgba(22, 119, 255, 0.15);\n    background: #fff;\n  }\n  :deep(.ant-upload) {\n    border-radius: 10px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/ocr/components/AiOcrModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"title\" @ok=\"handleSubmit\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\" name=\"AiOcrModal\" setup>\n  import { ref, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { schemas } from '../AiOcr.data';\n  import {addOcr, editOcr} from \"../AiOcr.api\";\n  const title = ref<string>('新增');\n  const isUpdate = ref<boolean>();\n  // 声明Emits\n  const emit = defineEmits(['success', 'register']);\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n    schemas: schemas,\n    showActionButtonGroup: false,\n    layout: 'vertical',\n    wrapperCol: { span: 24 },\n  });\n\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    setModalProps({ confirmLoading: true, bodyStyle:{ padding:'24px'} });\n    isUpdate.value = !!data?.isUpdate;\n    title.value = !unref(isUpdate) ? '新增' : '编辑'\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false });\n    if(unref(isUpdate)){\n      //表单赋值\n      await setFieldsValue({ ...data.record });\n    }\n  });\n\n  //表单提交事件\n  async function handleSubmit() {\n    try {\n      const values = await validate();\n      if(unref(isUpdate)){\n        await editOcr(values);\n      } else{\n        await addOcr(values);\n      }\n      setModalProps({ confirmLoading: true });\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n\n<style lang=\"less\" scoped>\n:deep(.ant-modal-body){\n  padding: 24px !important;\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/wordtpl/EoaWordTemplate.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { useMessage } from '/@/hooks/web/useMessage';\nimport { downloadFile } from '/@/api/common/api';\nimport { message } from 'ant-design-vue';\n\nconst { createConfirm } = useMessage();\n\nenum Api {\n  list = '/airag/word/list',\n  save = '/airag/word/add',\n  edit = '/airag/word/edit',\n  deleteOne = '/airag/word/delete',\n  deleteBatch = '/airag/word/deleteBatch',\n  downloadTpl = '/airag/word/download',\n  parseFile = '/airag/word/parse/file',\n  generateWord = '/airag/word/generate/word',\n  generateResume = '/airag/flow/run',\n}\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) => defHttp.get({ url: Api.list, params });\n\n/**\n * 删除单个\n */\nexport const deleteOne = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.deleteOne, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 批量删除\n * @param params\n */\nexport const batchDelete = (params, handleSuccess) => {\n  createConfirm({\n    iconType: 'warning',\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n/**\n * 保存或者更新\n * @param params\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  const url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({ url: url, params });\n};\n\n/**\n * 下载模版\n * @param params\n */\nexport const downloadTpl = (params) => {\n  return downloadFile(Api.downloadTpl, params.name + '.docx', { id: params.id });\n};\n\n/**\n * 生成word\n * @param params\n */\nexport const generateWord = (fileName, params) => {\n  return defHttp\n    .post(\n      {\n        url: Api.generateWord,\n        params: params,\n        responseType: 'blob',\n      },\n      { isTransformResponse: false }\n    )\n    .then((data) => {\n      if (!data || data.size === 0) {\n        message.warning('文件下载失败');\n        return;\n      }\n      if (typeof window.navigator.msSaveBlob !== 'undefined') {\n        window.navigator.msSaveBlob(new Blob([data]), fileName);\n      } else {\n        const url = window.URL.createObjectURL(new Blob([data]));\n        const link = document.createElement('a');\n        link.style.display = 'none';\n        link.href = url;\n        link.setAttribute('download', fileName);\n        document.body.appendChild(link);\n        link.click();\n        document.body.removeChild(link); //下载完成移除元素\n        window.URL.revokeObjectURL(url); //释放掉blob对象\n      }\n    });\n};\n\n/**\n * 生成简历\n * @param params\n */\nexport const generateResume = (params, handleSuccess) => {\n  return defHttp\n    .post(\n      {\n        url: Api.generateResume,\n        params: params,\n        timeout: 120000,\n        timeoutErrorMessage: '同步数据库超时，已自动刷新',\n      },\n      { isTransformResponse: false }\n    )\n    .then((value) => {\n      handleSuccess(value);\n    });\n};\n\n/**\n * 解析word文档地址\n * @param params\n */\nexport const parseFileUrl = Api.parseFile;\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/wordtpl/EoaWordTemplate.data.ts",
    "content": "import { BasicColumn } from '/@/components/Table';\nimport { FormSchema } from '/@/components/Table';\n//列表数据\nexport const columns: BasicColumn[] = [\n  {\n    title: '模版名称',\n    align: 'center',\n    dataIndex: 'name',\n  },\n  {\n    title: '模版编码',\n    align: 'center',\n    dataIndex: 'code',\n  },\n  // {\n  //   title: '页眉',\n  //   align: 'center',\n  //   dataIndex: 'header',\n  //   ifShow: false,\n  // },\n  // {\n  //   title: '页脚',\n  //   align: 'center',\n  //   dataIndex: 'footer',\n  //   ifShow: false,\n  // },\n  // {\n  //   title: '主体内容',\n  //   align: 'center',\n  //   dataIndex: 'main',\n  //   ifShow: false,\n  // },\n  // {\n  //   title: '页边距',\n  //   align: 'center',\n  //   dataIndex: 'margins',\n  //   ifShow: false,\n  // },\n  // {\n  //   title: '宽度',\n  //   align: 'center',\n  //   dataIndex: 'width',\n  //   ifShow: false,\n  // },\n  // {\n  //   title: '高度',\n  //   align: 'center',\n  //   dataIndex: 'height',\n  //   ifShow: false,\n  // },\n  // {\n  //   title: '纸张方向',\n  //   align: 'center',\n  //   dataIndex: 'paperDirection',\n  //   ifShow: false,\n  // },\n  // {\n  //   title: '水印',\n  //   align: 'center',\n  //   dataIndex: 'watermark',\n  //   ifShow: false,\n  // },\n];\n//查询数据\nexport const searchFormSchema: FormSchema[] = [\n  {\n    label: '模版名称',\n    field: 'name',\n    component: 'Input',\n  },\n  {\n    label: '模版编码',\n    field: 'code',\n    component: 'Input',\n  },\n];\n//表单数据\nexport const formSchema: FormSchema[] = [\n  {\n    label: '模版名称',\n    field: 'name',\n    component: 'Input',\n    dynamicRules: ({ model, schema }) => {\n      return [{ required: true, message: '请输入模版名称!' }];\n    },\n  },\n  {\n    label: '模版编码',\n    field: 'code',\n    component: 'Input',\n    dynamicRules: ({ model, schema }) => {\n      return [\n        { required: true, message: '请输入模版编码!' },\n        { pattern: /^[A-Za-z_]+$/, message: '只能输入英文和下划线!' },\n      ];\n    },\n  },\n  {\n    label: '页眉',\n    field: 'header',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '页脚',\n    field: 'footer',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '主体内容',\n    field: 'main',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '页边距',\n    field: 'margins',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '宽度',\n    field: 'width',\n    component: 'InputNumber',\n    show: false,\n  },\n  {\n    label: '高度',\n    field: 'height',\n    component: 'InputNumber',\n    show: false,\n  },\n  {\n    label: '纸张方向',\n    field: 'paperDirection',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '水印',\n    field: 'watermark',\n    component: 'Input',\n    show: false,\n  },\n  // TODO 主键隐藏字段，目前写死为ID\n  {\n    label: '',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n];\n\n// 高级查询数据\nexport const superQuerySchema = {\n  name: { title: '模版名称', order: 0, view: 'text', type: 'string' },\n  code: { title: '模版编码', order: 1, view: 'text', type: 'string' },\n  header: { title: '页眉', order: 2, view: 'text', type: 'string' },\n  footer: { title: '页脚', order: 3, view: 'text', type: 'string' },\n  main: { title: '主体内容', order: 4, view: 'text', type: 'string' },\n  margins: { title: '页边距', order: 5, view: 'text', type: 'string' },\n  width: { title: '宽度', order: 6, view: 'number', type: 'number' },\n  height: { title: '高度', order: 7, view: 'number', type: 'number' },\n  paperDirection: { title: '纸张方向', order: 8, view: 'text', type: 'string' },\n  watermark: { title: '水印', order: 9, view: 'text', type: 'string' },\n};\n\n/**\n * 流程表单调用这个方法获取formSchema\n * @param param\n */\nexport function getBpmFormSchema(_formData): FormSchema[] {\n  // 默认和原始表单保持一致 如果流程中配置了权限数据，这里需要单独处理formSchema\n  return formSchema;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/wordtpl/EoaWordTemplateList.vue",
    "content": "<template>\n  <div>\n    <!--引用表格-->\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-button type=\"primary\" v-auth=\"'wordtpl:template:add'\" @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\"> 新增 </a-button>\n\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\" />\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button v-auth=\"'wordtpl:template:deleteBatch'\"\n            >批量操作\n            <Icon icon=\"mdi:chevron-down\" />\n          </a-button>\n        </a-dropdown>\n        <!-- 高级查询 -->\n        <super-query :config=\"superQueryConfig\" @search=\"handleSuperQuery\" />\n        <a-button type=\"default\" v-auth=\"'wordtpl:template:add'\" @click=\"handleGenResume\" preIcon=\"ant-design:plus-outlined\"> 生成简历 </a-button>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\" />\n      </template>\n      <!--字段回显插槽-->\n      <template #bodyCell=\"{ column, record, index, text }\"></template>\n    </BasicTable>\n    <!-- 表单区域 -->\n    <EoaWordTemplateModal @register=\"registerModal\" @success=\"handleSuccess\" />\n\n    <BasicModal\n      v-bind=\"$attrs\"\n      :footer=\"null\"\n      :showOkBtn=\"false\"\n      :canFullscreen=\"false\"\n      wrapClassName=\"jee-doc-design-modal no-bottom-scroll\"\n      :style=\"{ top: '0', padding: '0' }\"\n      :defaultFullscreen=\"true\"\n      @register=\"designModal\"\n      destroyOnClose\n    >\n      <DocDesign :content=\"wordDesignContent\" :upload-file-url=\"parseFileUrl\" @save=\"handleDesignSave\" @download=\"handleDesignDownload\" />\n    </BasicModal>\n\n    <BasicModal\n      v-bind=\"$attrs\"\n      :canFullscreen=\"false\"\n      @register=\"generateModal\"\n      title=\"测试模版生成\"\n      :width=\"528\"\n      destroyOnClose\n      @ok=\"handleGenOk\"\n    >\n      <a-form :model=\"genWordData\" :label-col=\"{ span: 6 }\" :wrapper-col=\"{ span: 14 }\">\n        <a-form-item class=\"field-clos\" :label=\"field\" :name=\"field\" v-for=\"field in tplFieldList\">\n          <a-input v-model:value=\"genWordData[field]\" style=\"width:90%\" :placeholder=\"'请输入'+field\"></a-input>\n        </a-form-item>\n      </a-form>\n    </BasicModal>\n\n    <BasicModal :loading=\"resumeLoading\" v-bind=\"$attrs\" :canFullscreen=\"false\" @register=\"resumeModal\" title=\"生成简历\" :width=\"628\" destroyOnClose @ok=\"handleGenResumeOk\">\n      <a-form :model=\"genResumeData\" :label-col=\"{ span: 4 }\" :wrapper-col=\"{ span: 20 }\">\n        <a-form-item class=\"field-clos\" label=\"基础信息\" name=\"content\">\n          <a-input v-model:value=\"genResumeData.content\" style=\"width: 90%\" placeholder=\"请输入基础信息\" />\n        </a-form-item>\n        <a-form-item class=\"field-clos\" label=\"个人介绍\" name=\"profile\">\n          <a-textarea rows=\"8\" v-model:value=\"genResumeData.profile\" style=\"width: 90%\" placeholder=\"请输入个人介绍\" />\n        </a-form-item>\n      </a-form>\n    </BasicModal>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"wordtpl-eoaWordTemplate\" setup>\n  import { ref, reactive, computed, unref } from 'vue';\n  import { BasicTable, useTable, TableAction } from '/src/components/Table';\n  import { BasicModal, useModal } from '/src/components/Modal';\n  import { useListPage } from '/src/hooks/system/useListPage';\n  import EoaWordTemplateModal from './components/EoaWordTemplateModal.vue';\n  import { columns, searchFormSchema, superQuerySchema } from './EoaWordTemplate.data';\n  import { list, deleteOne, batchDelete, saveOrUpdate, downloadTpl, parseFileUrl, generateWord, generateResume } from './EoaWordTemplate.api';\n  import { useUserStore } from '/src/store/modules/user';\n  import { useMessage } from '/src/hooks/web/useMessage';\n  import { getDateByPicker } from '/src/utils';\n  import DocDesign from '/src/components/wordtpl/DocDesign.vue';\n  import { BasicForm } from '@/components/Form';\n  //日期个性化选择\n  const fieldPickers = reactive({});\n  const queryParam = reactive<any>({});\n  const checkedKeys = ref<Array<string | number>>([]);\n  const userStore = useUserStore();\n  const { createMessage } = useMessage();\n  //注册model\n  const [registerModal, { openModal }] = useModal();\n  const [designModal, { openModal: openDesignModal, closeModal: closeDesignModal }] = useModal();\n  const [generateModal, { openModal: openGenModal, closeModal: closeGenModal }] = useModal();\n  const [resumeModal, { openModal: openResumeModal, closeModal: closeResumeModal }] = useModal();\n  //注册table数据\n  const { prefixCls, tableContext } = useListPage({\n    tableProps: {\n      title: 'word模版管理',\n      api: list,\n      columns,\n      canResize: true,\n      formConfig: {\n        //labelWidth: 120,\n        schemas: searchFormSchema,\n        autoSubmitOnEnter: true,\n        showAdvancedButton: true,\n        fieldMapToNumber: [],\n        fieldMapToTime: [],\n      },\n      actionColumn: {\n        width: 200,\n      },\n      beforeFetch: (params) => {\n        if (params && fieldPickers) {\n          for (let key in fieldPickers) {\n            if (params[key]) {\n              params[key] = getDateByPicker(params[key], fieldPickers[key]);\n            }\n          }\n        }\n        return Object.assign(params, queryParam);\n      },\n    },\n  });\n\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;\n\n  const wordDesignContent = reactive({});\n\n  const currentTpl = reactive({});\n  const genWordData = reactive({});\n  const tplFieldList = reactive([]);\n  const genResumeData = reactive({\n    content: '张三；电话：186xxxxxxxx；邮箱：zhangsan@ex.com',\n    profile: '拥有13年开发经验，8年项目管理经验，6年系统架构经验，曾在多个平台级产品中担任核心负责人，具备从0到1搭建平台、从1到100推动演进的能力。',\n  });\n  const resumeLoading = ref(false);\n\n  // 高级查询配置\n  const superQueryConfig = reactive(superQuerySchema);\n\n  /**\n   * 高级查询事件\n   */\n  function handleSuperQuery(params) {\n    Object.keys(params).map((k) => {\n      queryParam[k] = params[k];\n    });\n    reload();\n  }\n\n  /**\n   * 新增事件\n   */\n  function handleAdd() {\n    openModal(true, {\n      isUpdate: false,\n      showFooter: true,\n    });\n  }\n\n  /**\n   * 生成简历事件\n   */\n  function handleGenResume() {\n    openResumeModal(true, {\n      isUpdate: false,\n      showFooter: true,\n    });\n  }\n\n  /**\n   * 编辑事件\n   */\n  function handleEdit(record: Recordable) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n      showFooter: true,\n    });\n  }\n\n  function handleDesign(record: Recordable) {\n    Object.keys(record).map((k) => {\n      wordDesignContent[k] = record[k];\n    });\n    openDesignModal(true, {\n      record,\n    });\n  }\n\n  /**\n   * 详情\n   */\n  function handleDetail(record: Recordable) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n      showFooter: false,\n    });\n  }\n\n  function handleGenWord(record: Recordable) {\n    extractTplFields(record);\n    if(tplFieldList.length > 0){\n      // 如果有字段需要填写，则打开生成模版的弹窗\n      currentTpl.id = record.id;\n      currentTpl.name = record.name;\n      Object.keys(genWordData).forEach((key) => delete genWordData[key]);\n      openGenModal(true, {\n        record,\n      });\n      return;\n    } else {\n      // 如果没有字段需要填写，则直接生成word\n      const params = {\n        templateId: record.id,\n        data: {},\n      };\n      generateWord(record.name + '.docx', params);\n    }\n  }\n\n  function handleGenOk() {\n    const params = {\n      templateId: currentTpl.id,\n      data: genWordData,\n    };\n    generateWord(currentTpl.name + '.docx', params);\n    closeGenModal();\n  }\n\n  function handleGenResumeOk() {\n    let params = {\n      flowId: '1952634605517447170',\n      inputParams: genResumeData,\n      responseMode: 'blocking',\n    };\n    resumeLoading.value = true;\n    generateResume(params, (resp) => {\n      if(resp && resp.success){\n        closeResumeModal();\n        resumeLoading.value = false;\n        reload();\n      }else{\n        createMessage.error('生成简历失败: ' + resp.message);\n        resumeLoading.value = false;\n      }\n    });\n  }\n\n  function extractTplFields(record) {\n    const fields = new Set<string>();\n    if (record.main) {\n      let mainContent = [];\n      // 如果record.main是string\n      if (typeof record.main === 'string') {\n        mainContent = JSON.parse(record.main);\n      } else {\n        mainContent = record.main;\n      }\n      // 先拼接所有 value\n      let contentStr = '';\n      mainContent.forEach((item) => {\n        if (typeof item.value === 'string' && (!item.type || item.type === '')) {\n          contentStr += item.value;\n        }\n      });\n      // 统一正则提取\n      const matches = contentStr.match(/{{(.*?)}}/g);\n      if (matches) {\n        matches.forEach((m) => {\n          const field = m.replace(/[{}]/g, '');\n          fields.add(field);\n        });\n      }\n    }\n    tplFieldList.splice(0, tplFieldList.length, ...Array.from(fields));\n  }\n\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteOne({ id: record.id }, handleSuccess);\n  }\n\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDelete({ ids: selectedRowKeys.value }, handleSuccess);\n  }\n\n  /**\n   * 成功回调\n   */\n  function handleSuccess() {\n    (selectedRowKeys.value = []) && reload();\n  }\n\n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n        auth: 'wordtpl:template:edit',\n      },\n      {\n        label: '设计',\n        onClick: handleDesign.bind(null, record),\n        auth: 'wordtpl:template:design',\n      },\n    ];\n  }\n\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record) {\n    return [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      },\n      {\n        label: '生成word',\n        onClick: handleGenWord.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n          placement: 'topLeft',\n        },\n        auth: 'wordtpl:template:delete',\n      },\n    ];\n  }\n\n  /**\n   * 设计器保存事件\n   * @param content\n   */\n  function handleDesignSave(content) {\n    console.log('表单数据', content);\n    saveOrUpdate(content, true)\n      .then((data) => {\n        // closeDesignModal();\n        reload();\n      })\n      .catch((err) => {\n        createMessage.error('保存失败: ' + err.message);\n      });\n  }\n\n  /**\n   * 设计器下载事件\n   * @param content\n   */\n  function handleDesignDownload(content) {\n    downloadTpl(content);\n  }\n</script>\n\n<style lang=\"less\" scoped>\n  :deep(.ant-picker),\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  .jee-doc-design-modal {\n    &.no-bottom-scroll {\n      .scrollbar__bar {\n        &.is-horizontal {\n          display: none;\n        }\n      }\n    }\n    .ant-modal-header {\n      padding: 0 !important;\n    }\n    .ant-modal-body > .scrollbar {\n      padding-top: 0;\n    }\n    .jeecg-modal-content > .scroll-container {\n      padding: 0 !important;\n    }\n  }\n</style>\n<style lang=\"less\">\n  .jee-doc-design-modal .scroll-container {\n    height: 100vh !important;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/wordtpl/components/EoaWordTemplateForm.vue",
    "content": "<template>\n  <div style=\"min-height: 400px\">\n    <BasicForm @register=\"registerForm\"></BasicForm>\n    <div style=\"width: 100%; text-align: center\" v-if=\"!formDisabled\">\n      <a-button @click=\"submitForm\" pre-icon=\"ant-design:check\" type=\"primary\">提 交</a-button>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { BasicForm, useForm } from '/src/components/Form';\n  import { computed, defineComponent } from 'vue';\n  import { defHttp } from '/src/utils/http/axios';\n  import { propTypes } from '/src/utils/propTypes';\n  import { getBpmFormSchema } from '../EoaWordTemplate.data';\n  import { saveOrUpdate } from '../EoaWordTemplate.api';\n\n  export default defineComponent({\n    name: 'EoaWordTemplateForm',\n    components: {\n      BasicForm,\n    },\n    props: {\n      formData: propTypes.object.def({}),\n      formBpm: propTypes.bool.def(true),\n    },\n    setup(props) {\n      const [registerForm, { setFieldsValue, setProps, getFieldsValue }] = useForm({\n        labelWidth: 150,\n        schemas: getBpmFormSchema(props.formData),\n        showActionButtonGroup: false,\n        baseColProps: { span: 24 },\n      });\n\n      const formDisabled = computed(() => {\n        if (props.formData.disabled === false) {\n          return false;\n        }\n        return true;\n      });\n\n      let formData = {};\n      const queryByIdUrl = '/wordtpl/eoaWordTemplate/queryById';\n      async function initFormData() {\n        let params = { id: props.formData.dataId };\n        const data = await defHttp.get({ url: queryByIdUrl, params });\n        formData = { ...data };\n        //设置表单的值\n        await setFieldsValue(formData);\n        //默认是禁用\n        await setProps({ disabled: formDisabled.value });\n      }\n\n      async function submitForm() {\n        let data = getFieldsValue();\n        let params = Object.assign({}, formData, data);\n        console.log('表单数据', params);\n        await saveOrUpdate(params, true);\n      }\n\n      initFormData();\n\n      return {\n        registerForm,\n        formDisabled,\n        submitForm,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/airag/wordtpl/components/EoaWordTemplateModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" destroyOnClose :title=\"title\" :width=\"800\" @ok=\"handleSubmit\">\n    <BasicForm @register=\"registerForm\" name=\"EoaWordTemplateForm\" />\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, computed, unref, reactive } from 'vue';\n  import { BasicModal, useModalInner } from '/src/components/Modal';\n  import { BasicForm, useForm } from '/src/components/Form';\n  import { formSchema } from '../EoaWordTemplate.data';\n  import { saveOrUpdate } from '../EoaWordTemplate.api';\n  import { useMessage } from '/src/hooks/web/useMessage';\n  import { getDateByPicker } from '/src/utils';\n  const { createMessage } = useMessage();\n  // Emits声明\n  const emit = defineEmits(['register', 'success']);\n  const isUpdate = ref(true);\n  const isDetail = ref(false);\n  //表单配置\n  const [registerForm, { setProps, resetFields, setFieldsValue, validate, scrollToField, updateSchema }] = useForm({\n    labelWidth: 150,\n    schemas: formSchema,\n    showActionButtonGroup: false,\n    baseColProps: { span: 24 },\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false, showCancelBtn: !!data?.showFooter, showOkBtn: !!data?.showFooter });\n    isUpdate.value = !!data?.isUpdate;\n    isDetail.value = !!data?.showFooter;\n    if (unref(isUpdate)) {\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n    }\n    updateSchema([\n      {\n        field: 'code',\n        ifShow: !unref(isUpdate),\n      },\n    ]);\n    // 隐藏底部时禁用整个表单\n    setProps({ disabled: !data?.showFooter });\n  });\n  //日期个性化选择\n  const fieldPickers = reactive({});\n  //设置标题\n  const title = computed(() => (!unref(isUpdate) ? '新增' : !unref(isDetail) ? '详情' : '编辑'));\n  //表单提交事件\n  async function handleSubmit(v) {\n    try {\n      let values = await validate();\n      // 预处理日期数据\n      changeDateValue(values);\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      await saveOrUpdate(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } catch ({ errorFields }) {\n      if (errorFields) {\n        const firstField = errorFields[0];\n        if (firstField) {\n          scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });\n        }\n      }\n      return Promise.reject(errorFields);\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n\n  /**\n   * 处理日期值\n   * @param formData 表单数据\n   */\n  const changeDateValue = (formData) => {\n    if (formData && fieldPickers) {\n      for (let key in fieldPickers) {\n        if (formData[key]) {\n          formData[key] = getDateByPicker(formData[key], fieldPickers[key]);\n        }\n      }\n    }\n  };\n</script>\n\n<style lang=\"less\" scoped>\n  /** 时间和数字输入框样式 */\n  :deep(.ant-input-number) {\n    width: 100%;\n  }\n\n  :deep(.ant-calendar-picker) {\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/super/registerSuper.ts",
    "content": "import type { App } from 'vue';\n\n/**\n * 动态引入 super 下的组件\n */\nexport async function registerSuper(app: App) {\n  const modules = import.meta.glob('./**/register.ts');\n  for (let [url, module] of Object.entries(modules)) {\n    let { register } = await module();\n    if (typeof register === 'function') {\n      await register(app);\n    } else {\n      console.error(`${url} 没有导出 register 函数，无法完成注册！`);\n    }\n  }\n}"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/about/index.vue",
    "content": "<template>\n  <PageWrapper title=\"关于\">\n    <template #headerContent>\n      <div class=\"flex justify-between items-center\">\n        <span class=\"flex-1\">\n          <a :href=\"GITHUB_URL\" target=\"_blank\"> JeecgBoot </a>\n          是一款基于BPM的低代码平台！前后端分离架构 SpringBoot 2.x，SpringCloud，Ant Design&Vue，Mybatis-plus，Shiro，JWT，支持微服务。强大的代码生成器让前后端代码一键生成，实现低代码开发！ JeecgBoot引领新低代码开发模式 OnlineCoding-> 代码生成器-> 手工MERGE， 帮助Java项目解决70%的重复工作，让开发更多关注业务，既能快速提高效率，节省研发成本，同时又不失灵活性！一系列低代码能力：Online表单、Online报表、Online图表、表单设计、流程设计、报表设计、大屏设计 等等...。\n        </span>\n      </div>\n    </template>\n    <Description @register=\"infoRegister\" class=\"enter-y\" />\n    <Description @register=\"register\" class=\"my-4 enter-y\" />\n    <Description @register=\"registerDev\" class=\"enter-y\" />\n  </PageWrapper>\n</template>\n<script lang=\"ts\" setup>\n  import { h } from 'vue';\n  import { Tag } from 'ant-design-vue';\n  import { PageWrapper } from '/@/components/Page';\n  import { Description, DescItem, useDescription } from '/@/components/Description/index';\n  import { GITHUB_URL, SITE_URL, DOC_URL } from '/@/settings/siteSetting';\n\n  const { pkg, lastBuildTime } = __APP_INFO__;\n\n  const { dependencies, devDependencies, name, version } = pkg;\n\n  const schema: DescItem[] = [];\n  const devSchema: DescItem[] = [];\n\n  const commonTagRender = (color: string) => (curVal) => h(Tag, { color }, () => curVal);\n  const commonLinkRender = (text: string) => (href) => h('a', { href, target: '_blank' }, text);\n\n  const infoSchema: DescItem[] = [\n    {\n      label: '版本',\n      field: 'version',\n      render: commonTagRender('blue'),\n    },\n    {\n      label: '最后编译时间',\n      field: 'lastBuildTime',\n      render: commonTagRender('blue'),\n    },\n    {\n      label: '文档地址',\n      field: 'doc',\n      render: commonLinkRender('文档地址'),\n    },\n    {\n      label: '预览地址',\n      field: 'preview',\n      render: commonLinkRender('预览地址'),\n    },\n    {\n      label: 'Github',\n      field: 'github',\n      render: commonLinkRender('Github'),\n    },\n  ];\n\n  const infoData = {\n    version,\n    lastBuildTime,\n    doc: DOC_URL,\n    preview: SITE_URL,\n    github: GITHUB_URL,\n  };\n\n  Object.keys(dependencies).forEach((key) => {\n    schema.push({ field: key, label: key });\n  });\n\n  Object.keys(devDependencies).forEach((key) => {\n    devSchema.push({ field: key, label: key });\n  });\n\n  const [register] = useDescription({\n    title: '生产环境依赖',\n    data: dependencies,\n    schema: schema,\n    column: 3,\n  });\n\n  const [registerDev] = useDescription({\n    title: '开发环境依赖',\n    data: devDependencies,\n    schema: devSchema,\n    column: 3,\n  });\n\n  const [infoRegister] = useDescription({\n    title: '项目信息',\n    data: infoData,\n    schema: infoSchema,\n    column: 2,\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/error-log/DetailModal.vue",
    "content": "<template>\n  <BasicModal :width=\"800\" :title=\"t('sys.errorLog.tableActionDesc')\" v-bind=\"$attrs\">\n    <Description :data=\"info\" @register=\"register\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import type { PropType } from 'vue';\n  import type { ErrorLogInfo } from '/#/store';\n  import { BasicModal } from '/@/components/Modal/index';\n  import { Description, useDescription } from '/@/components/Description/index';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { getDescSchema } from './data';\n\n  defineProps({\n    info: {\n      type: Object as PropType<ErrorLogInfo>,\n      default: null,\n    },\n  });\n\n  const { t } = useI18n();\n\n  const [register] = useDescription({\n    column: 2,\n    schema: getDescSchema()!,\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/error-log/data.tsx",
    "content": "import { Tag } from 'ant-design-vue';\nimport { BasicColumn } from '/@/components/Table/index';\nimport { ErrorTypeEnum } from '/@/enums/exceptionEnum';\nimport { useI18n } from '/@/hooks/web/useI18n';\n\nconst { t } = useI18n();\n\nexport function getColumns(): BasicColumn[] {\n  return [\n    {\n      dataIndex: 'type',\n      title: t('sys.errorLog.tableColumnType'),\n      width: 80,\n      customRender: ({ text }) => {\n        const color =\n          text === ErrorTypeEnum.VUE\n            ? 'green'\n            : text === ErrorTypeEnum.RESOURCE\n            ? 'cyan'\n            : text === ErrorTypeEnum.PROMISE\n            ? 'blue'\n            : ErrorTypeEnum.AJAX\n            ? 'red'\n            : 'purple';\n        return <Tag color={color}>{() => text}</Tag>;\n      },\n    },\n    {\n      dataIndex: 'url',\n      title: 'URL',\n      width: 200,\n    },\n    {\n      dataIndex: 'time',\n      title: t('sys.errorLog.tableColumnDate'),\n      width: 160,\n    },\n    {\n      dataIndex: 'file',\n      title: t('sys.errorLog.tableColumnFile'),\n      width: 200,\n    },\n    {\n      dataIndex: 'name',\n      title: 'Name',\n      width: 200,\n    },\n    {\n      dataIndex: 'message',\n      title: t('sys.errorLog.tableColumnMsg'),\n      width: 300,\n    },\n    {\n      dataIndex: 'stack',\n      title: t('sys.errorLog.tableColumnStackMsg'),\n    },\n  ];\n}\n\nexport function getDescSchema(): any {\n  return getColumns().map((column) => {\n    return {\n      field: column.dataIndex!,\n      label: column.title,\n    };\n  });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/error-log/index.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <template v-for=\"src in imgList\" :key=\"src\">\n      <img :src=\"src\" v-show=\"false\" />\n    </template>\n    <DetailModal :info=\"rowInfo\" @register=\"registerModal\" />\n    <BasicTable @register=\"register\" class=\"error-handle-table\">\n      <template #toolbar>\n        <a-button @click=\"fireVueError\" type=\"primary\">\n          {{ t('sys.errorLog.fireVueError') }}\n        </a-button>\n        <a-button @click=\"fireResourceError\" type=\"primary\">\n          {{ t('sys.errorLog.fireResourceError') }}\n        </a-button>\n        <a-button @click=\"fireAjaxError\" type=\"primary\">\n          {{ t('sys.errorLog.fireAjaxError') }}\n        </a-button>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"[{ label: t('sys.errorLog.tableActionDesc'), onClick: handleDetail.bind(null, record) }]\" />\n      </template>\n    </BasicTable>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import type { ErrorLogInfo } from '/#/store';\n  import { watch, ref, nextTick } from 'vue';\n  import DetailModal from './DetailModal.vue';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table/index';\n  import { useModal } from '/@/components/Modal';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useErrorLogStore } from '/@/store/modules/errorLog';\n  import { fireErrorApi } from '/@/api/demo/error';\n  import { getColumns } from './data';\n  import { cloneDeep } from 'lodash-es';\n\n  const rowInfo = ref<ErrorLogInfo>();\n  const imgList = ref<string[]>([]);\n\n  const { t } = useI18n();\n  const errorLogStore = useErrorLogStore();\n  const [register, { setTableData }] = useTable({\n    title: t('sys.errorLog.tableTitle'),\n    columns: getColumns(),\n    actionColumn: {\n      width: 80,\n      title: 'Action',\n      dataIndex: 'action',\n      slots: { customRender: 'action' },\n    },\n  });\n  const [registerModal, { openModal }] = useModal();\n\n  watch(\n    () => errorLogStore.getErrorLogInfoList,\n    (list) => {\n      nextTick(() => {\n        setTableData(cloneDeep(list));\n      });\n    },\n    {\n      immediate: true,\n    }\n  );\n  const { createMessage } = useMessage();\n  if (import.meta.env.DEV) {\n    createMessage.info(t('sys.errorLog.enableMessage'));\n  }\n  // 查看详情\n  function handleDetail(row: ErrorLogInfo) {\n    rowInfo.value = row;\n    openModal(true);\n  }\n\n  function fireVueError() {\n    throw new Error('fire vue error!');\n  }\n\n  function fireResourceError() {\n    imgList.value.push(`${new Date().getTime()}.png`);\n  }\n\n  async function fireAjaxError() {\n    await fireErrorApi();\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/exception/Exception.vue",
    "content": "<script lang=\"tsx\">\n  import type { PropType } from 'vue';\n  import { Result, Button } from 'ant-design-vue';\n  import { defineComponent, ref, computed, unref } from 'vue';\n  import { ExceptionEnum } from '/@/enums/exceptionEnum';\n  import notDataSvg from '/@/assets/svg/no-data.svg';\n  import netWorkSvg from '/@/assets/svg/net-error.svg';\n  import { useRoute } from 'vue-router';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useGo, useRedo } from '/@/hooks/web/usePage';\n  import { PageEnum } from '/@/enums/pageEnum';\n\n  interface MapValue {\n    title: string;\n    subTitle: string;\n    btnText?: string;\n    icon?: string;\n    handler?: Fn;\n    status?: string;\n  }\n\n  export default defineComponent({\n    name: 'ErrorPage',\n    props: {\n      // 状态码\n      status: {\n        type: Number as PropType<number>,\n        default: ExceptionEnum.PAGE_NOT_FOUND,\n      },\n\n      title: {\n        type: String as PropType<string>,\n        default: '',\n      },\n\n      subTitle: {\n        type: String as PropType<string>,\n        default: '',\n      },\n\n      full: {\n        type: Boolean as PropType<boolean>,\n        default: false,\n      },\n    },\n    setup(props) {\n      const statusMapRef = ref(new Map<string | number, MapValue>());\n\n      const { query } = useRoute();\n      const go = useGo();\n      const redo = useRedo();\n      const { t } = useI18n();\n      const { prefixCls } = useDesign('app-exception-page');\n\n      const getStatus = computed(() => {\n        const { status: routeStatus } = query;\n        const { status } = props;\n        return Number(routeStatus) || status;\n      });\n\n      const getMapValue = computed((): MapValue => {\n        return unref(statusMapRef).get(unref(getStatus)) as MapValue;\n      });\n\n      const backLoginI18n = t('sys.exception.backLogin');\n      const backHomeI18n = t('sys.exception.backHome');\n\n      unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_ACCESS, {\n        title: '403',\n        status: `${ExceptionEnum.PAGE_NOT_ACCESS}`,\n        subTitle: t('sys.exception.subTitle403'),\n        btnText: props.full ? backLoginI18n : backHomeI18n,\n        handler: () => (props.full ? go(PageEnum.BASE_LOGIN) : go()),\n      });\n\n      unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_FOUND, {\n        title: '404',\n        status: `${ExceptionEnum.PAGE_NOT_FOUND}`,\n        subTitle: t('sys.exception.subTitle404'),\n        btnText: props.full ? backLoginI18n : backHomeI18n,\n        handler: () => (props.full ? go(PageEnum.BASE_LOGIN) : go()),\n      });\n\n      unref(statusMapRef).set(ExceptionEnum.ERROR, {\n        title: '500',\n        status: `${ExceptionEnum.ERROR}`,\n        subTitle: t('sys.exception.subTitle500'),\n        btnText: backHomeI18n,\n        handler: () => go(),\n      });\n\n      unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_DATA, {\n        title: t('sys.exception.noDataTitle'),\n        subTitle: '',\n        btnText: t('common.redo'),\n        handler: () => redo(),\n        icon: notDataSvg,\n      });\n\n      unref(statusMapRef).set(ExceptionEnum.NET_WORK_ERROR, {\n        title: t('sys.exception.networkErrorTitle'),\n        subTitle: t('sys.exception.networkErrorSubTitle'),\n        btnText: t('common.redo'),\n        handler: () => redo(),\n        icon: netWorkSvg,\n      });\n\n      return () => {\n        const { title, subTitle, btnText, icon, handler, status } = unref(getMapValue) || {};\n        return (\n          <Result class={prefixCls} status={status as any} title={props.title || title} sub-title={props.subTitle || subTitle}>\n            {{\n              extra: () =>\n                btnText && (\n                  <Button type=\"primary\" onClick={handler}>\n                    {() => btnText}\n                  </Button>\n                ),\n              icon: () => (icon ? <img src={icon} /> : null),\n            }}\n          </Result>\n        );\n      };\n    },\n  });\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-app-exception-page';\n\n  .@{prefix-cls} {\n    display: flex;\n    align-items: center;\n    flex-direction: column;\n\n    .ant-result-icon {\n      img {\n        max-width: 400px;\n        max-height: 300px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/exception/NetworkErrorException.vue",
    "content": "<template>\n  <Exception :status=\"status\" />\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import { Exception } from '/@/views/sys/exception/index';\n  import { ExceptionEnum } from '/@/enums/exceptionEnum';\n\n  const status = ref(ExceptionEnum.NET_WORK_ERROR);\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/exception/NotAccessException.vue",
    "content": "<template>\n  <Exception :status=\"status\" />\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import { Exception } from '/@/views/sys/exception/index';\n  import { ExceptionEnum } from '/@/enums/exceptionEnum';\n\n  const status = ref(ExceptionEnum.PAGE_NOT_ACCESS);\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/exception/NotDataErrorException.vue",
    "content": "<template>\n  <Exception :status=\"status\" />\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import { Exception } from '/@/views/sys/exception/index';\n  import { ExceptionEnum } from '/@/enums/exceptionEnum';\n\n  const status = ref(ExceptionEnum.PAGE_NOT_DATA);\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/exception/ServerErrorException.vue",
    "content": "<template>\n  <Exception :status=\"status\" />\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n  import { Exception } from '/@/views/sys/exception/index';\n  import { ExceptionEnum } from '/@/enums/exceptionEnum';\n\n  const status = ref(ExceptionEnum.ERROR);\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/exception/index.ts",
    "content": "export { default as Exception } from './Exception.vue';\nexport { default as NotAccessException } from './NotAccessException.vue';\nexport { default as NetworkErrorException } from './NetworkErrorException.vue';\nexport { default as NotDataErrorException } from './NotDataErrorException.vue';\nexport { default as ServerErrorException } from './ServerErrorException.vue';\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/forget-password/step1.vue",
    "content": "<template>\n  <Form class=\"p-4 enter-x\" :model=\"formData\" :rules=\"getFormRules\" ref=\"formRef\">\n    <FormItem name=\"mobile\" class=\"enter-x\">\n      <Input size=\"large\" v-model:value=\"formData.mobile\" :placeholder=\"t('sys.login.mobile')\" />\n    </FormItem>\n    <FormItem name=\"sms\" class=\"enter-x\">\n      <CountdownInput size=\"large\" v-model:value=\"formData.sms\" :placeholder=\"t('sys.login.smsCode')\" :sendCodeApi=\"sendCodeApi\" />\n    </FormItem>\n    <FormItem class=\"enter-x\">\n      <Button type=\"primary\" size=\"large\" block @click=\"handleNext\" :loading=\"loading\"> 下一步 </Button>\n      <Button size=\"large\" block class=\"mt-4\" @click=\"handleBackLogin\">\n        {{ t('sys.login.backSignIn') }}\n      </Button>\n    </FormItem>\n  </Form>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, reactive, ref, computed, unref, toRaw } from 'vue';\n\n  import { Form, Input, Button, steps } from 'ant-design-vue';\n  import { CountdownInput } from '/@/components/CountDown';\n\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useLoginState, useFormRules, useFormValid, LoginStateEnum, SmsEnum } from '../login/useLogin';\n  import { phoneVerify, getCaptcha } from '/@/api/sys/user';\n\n  export default defineComponent({\n    name: 'step1',\n    components: {\n      Button,\n      Form,\n      FormItem: Form.Item,\n      Input,\n      CountdownInput,\n    },\n    emits: ['nextStep'],\n    setup(_, { emit }) {\n      const { t } = useI18n();\n      const { handleBackLogin } = useLoginState();\n      const { notification } = useMessage();\n\n      const formRef = ref();\n      const { validForm } = useFormValid(formRef);\n      const { getFormRules } = useFormRules();\n\n      const loading = ref(false);\n      const formData = reactive({\n        mobile: '',\n        sms: '',\n      });\n\n      /**\n       * 下一步\n       */\n      async function handleNext() {\n        const data = await validForm();\n        if (!data) return;\n        const resultInfo = await phoneVerify(\n          toRaw({\n            phone: data.mobile,\n            smscode: data.sms,\n          })\n        );\n        if (resultInfo.success) {\n          let accountInfo = {\n            username: resultInfo.result.username,\n            phone: data.mobile,\n            smscode: resultInfo.result.smscode,\n          };\n          emit('nextStep', accountInfo);\n        } else {\n          notification.error({\n            message: t('sys.api.errorTip'),\n            description: resultInfo.message || t('sys.api.networkExceptionMsg'),\n            duration: 3,\n          });\n        }\n      }\n      //倒计时执行前的函数\n      function sendCodeApi() {\n        return getCaptcha({ mobile: formData.mobile, smsmode: SmsEnum.FORGET_PASSWORD });\n      }\n      return {\n        t,\n        formRef,\n        formData,\n        getFormRules,\n        handleNext,\n        loading,\n        handleBackLogin,\n        sendCodeApi,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/forget-password/step2.vue",
    "content": "<template>\n  <Form class=\"p-4 enter-x\" :model=\"formData\" :rules=\"getFormRules\" ref=\"formRef\">\n    <FormItem name=\"username\" class=\"enter-x\">\n      <Input size=\"large\" v-model:value=\"formData.username\" :placeholder=\"t('sys.login.userName')\" disabled />\n    </FormItem>\n\n    <FormItem name=\"password\" class=\"enter-x\">\n      <StrengthMeter size=\"large\" v-model:value=\"formData.password\" :placeholder=\"t('sys.login.password')\" />\n    </FormItem>\n\n    <FormItem name=\"confirmPassword\" class=\"enter-x\">\n      <InputPassword size=\"large\" visibilityToggle v-model:value=\"formData.confirmPassword\" :placeholder=\"t('sys.login.confirmPassword')\" />\n    </FormItem>\n\n    <FormItem class=\"enter-x\">\n      <Button type=\"primary\" size=\"large\" block @click=\"handlePrev\"> 上一步 </Button>\n      <Button size=\"large\" block class=\"mt-4\" @click=\"handleNext\"> 下一步 </Button>\n    </FormItem>\n  </Form>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, reactive, ref, computed, unref, toRaw, toRefs } from 'vue';\n  import { Form, Input, Button } from 'ant-design-vue';\n  import { StrengthMeter } from '/@/components/StrengthMeter';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useFormRules, useFormValid } from '../login/useLogin';\n  import { passwordChange } from '/@/api/sys/user';\n\n  export default defineComponent({\n    name: 'step2',\n    components: {\n      Button,\n      Form,\n      FormItem: Form.Item,\n      InputPassword: Input.Password,\n      Input,\n      StrengthMeter,\n    },\n    props: {\n      accountInfo: {\n        type: Object,\n        default: () => ({}),\n      },\n    },\n    emits: ['prevStep', 'nextStep'],\n    setup(props, { emit }) {\n      const { t } = useI18n();\n      const { createErrorModal } = useMessage();\n      const { accountInfo } = props;\n      const formRef = ref();\n      const formData = reactive({\n        username: accountInfo.obj.username || '',\n        password: '',\n        confirmPassword: '',\n      });\n      const { getFormRules } = useFormRules(formData);\n      const { validForm } = useFormValid(formRef);\n\n      /**\n       * 上一步\n       */\n      function handlePrev() {\n        emit('prevStep', accountInfo.obj);\n      }\n\n      /**\n       * 下一步\n       */\n      async function handleNext() {\n        const data = await validForm();\n        if (!data) return;\n        const resultInfo = await passwordChange(\n          toRaw({\n            username: data.username,\n            password: data.password,\n            smscode: accountInfo.obj.smscode,\n            phone: accountInfo.obj.phone,\n          })\n        );\n        if (resultInfo.success) {\n          //修改密码\n          emit('nextStep', accountInfo.obj);\n        } else {\n          //错误提示\n          createErrorModal({\n            title: t('sys.api.errorTip'),\n            content: resultInfo.message || t('sys.api.networkExceptionMsg'),\n          });\n        }\n      }\n\n      return {\n        t,\n        formRef,\n        formData,\n        getFormRules,\n        handleNext,\n        handlePrev,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/forget-password/step3.vue",
    "content": "<template>\n  <Result status=\"success\" title=\"更改密码成功\" :sub-title=\"getSubTitle\">\n    <template #extra>\n      <a-button key=\"console\" type=\"primary\" @click=\"finish\"> 返回登录 </a-button>\n    </template>\n  </Result>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref, computed, unref, onMounted, watchEffect, watch } from 'vue';\n  import { Form, Input, Button, Result } from 'ant-design-vue';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useLoginState } from '../login/useLogin';\n  import { useCountdown } from '/@/components/CountDown/src/useCountdown';\n  import { propTypes } from '/@/utils/propTypes';\n\n  export default defineComponent({\n    name: 'step3',\n    components: {\n      Button,\n      Form,\n      FormItem: Form.Item,\n      Input,\n      Result,\n    },\n    props: {\n      accountInfo: {\n        type: Object,\n        default: () => ({}),\n      },\n      count: propTypes.number.def(5),\n    },\n    emits: ['finish'],\n    setup(props, { emit }) {\n      const { t } = useI18n();\n      const { accountInfo } = props;\n      const { handleBackLogin } = useLoginState();\n\n      const { currentCount, start } = useCountdown(props.count);\n      const getSubTitle = computed(() => {\n        return t('sys.login.subTitleText', [unref(currentCount)]);\n      });\n      /**\n       * 倒计时\n       */\n      watchEffect(() => {\n        if (unref(currentCount) === 1) {\n          setTimeout(() => {\n            finish();\n          }, 500);\n        }\n      });\n\n      /**\n       * 结束回调\n       */\n      function finish() {\n        handleBackLogin();\n        emit('finish');\n      }\n\n      onMounted(() => {\n        start();\n      });\n\n      return {\n        getSubTitle,\n        finish,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/iframe/FrameBlank.vue",
    "content": "<template>\n  <div></div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  export default defineComponent({\n    name: 'FrameBlank',\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/iframe/index.vue",
    "content": "<template>\n  <div :class=\"prefixCls\" :style=\"getWrapStyle\">\n    <Spin :spinning=\"loading\" size=\"large\" :style=\"getWrapStyle\">\n      <iframe :src=\"frameSrc\" :class=\"`${prefixCls}__main`\" ref=\"frameRef\" @load=\"hideLoading\"></iframe>\n    </Spin>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import type { CSSProperties } from 'vue';\n  import { ref, unref, computed } from 'vue';\n  import { Spin } from 'ant-design-vue';\n  import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn';\n  import { propTypes } from '/@/utils/propTypes';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useLayoutHeight } from '/@/layouts/default/content/useContentViewHeight';\n\n  defineProps({\n    frameSrc: propTypes.string.def(''),\n  });\n\n  const loading = ref(true);\n  const topRef = ref(50);\n  const heightRef = ref(window.innerHeight);\n  const frameRef = ref<HTMLFrameElement>();\n  const { headerHeightRef } = useLayoutHeight();\n\n  const { prefixCls } = useDesign('iframe-page');\n  useWindowSizeFn(calcHeight, 150, { immediate: true });\n\n  const getWrapStyle = computed((): CSSProperties => {\n    return {\n      height: `${unref(heightRef)}px`,\n    };\n  });\n\n  function calcHeight() {\n    const iframe = unref(frameRef);\n    if (!iframe) {\n      return;\n    }\n    const top = headerHeightRef.value;\n    topRef.value = top;\n    heightRef.value = window.innerHeight - top;\n    const clientHeight = document.documentElement.clientHeight - top;\n    iframe.style.height = `${clientHeight}px`;\n  }\n\n  function hideLoading() {\n    loading.value = false;\n    calcHeight();\n  }\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-iframe-page';\n\n  .@{prefix-cls} {\n    .ant-spin-nested-loading {\n      position: relative;\n      height: 100%;\n\n      .ant-spin-container {\n        width: 100%;\n        height: 100%;\n        padding: 10px;\n      }\n    }\n\n    &__mask {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n    }\n\n    &__main {\n      width: 100%;\n      height: 100%;\n      overflow: hidden;\n      background-color: @component-background;\n      border: 0;\n      box-sizing: border-box;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/lock/LockPage.vue",
    "content": "<template>\n  <div :class=\"prefixCls\" class=\"fixed inset-0 flex h-screen w-screen bg-black items-center justify-center\">\n    <div\n      :class=\"`${prefixCls}__unlock`\"\n      class=\"absolute top-0 left-1/2 flex pt-5 h-16 items-center justify-center sm:text-md xl:text-xl text-white flex-col cursor-pointer transform translate-x-1/2\"\n      @click=\"handleShowForm(false)\"\n      v-show=\"showDate\"\n    >\n      <LockOutlined />\n      <span>{{ t('sys.lock.unlock') }}</span>\n    </div>\n\n    <div class=\"flex w-screen h-screen justify-center items-center\">\n      <div :class=\"`${prefixCls}__hour`\" class=\"relative mr-5 md:mr-20 w-2/5 h-2/5 md:h-4/5\">\n        <span>{{ hour }}</span>\n        <span class=\"meridiem absolute left-5 top-5 text-md xl:text-xl\" v-show=\"showDate\">\n          {{ meridiem }}\n        </span>\n      </div>\n      <div :class=\"`${prefixCls}__minute w-2/5 h-2/5 md:h-4/5 `\">\n        <span> {{ minute }}</span>\n      </div>\n    </div>\n    <transition name=\"fade-slide\">\n      <div :class=\"`${prefixCls}-entry`\" v-show=\"!showDate\">\n        <div :class=\"`${prefixCls}-entry-content`\">\n          <div :class=\"`${prefixCls}-entry__header enter-x`\">\n            <img :src=\"userinfo.avatar || headerImg\" :class=\"`${prefixCls}-entry__header-img`\" />\n            <p :class=\"`${prefixCls}-entry__header-name`\">\n              {{ userinfo.realname }}\n            </p>\n          </div>\n          <InputPassword @change=\"unLock('change')\" @keyup.enter=\"unLock('enter')\" :placeholder=\"t('sys.lock.placeholder')\" class=\"enter-x\" v-model:value=\"password\" />\n          <span :class=\"`${prefixCls}-entry__err-msg enter-x`\" v-if=\"errMsg\">\n            {{ t('sys.lock.alert') }}\n          </span>\n          <div :class=\"`${prefixCls}-entry__footer enter-x`\" style=\"justify-content:center;margin-top: 4px\">\n            <!-- <a-button type=\"link\" size=\"small\" class=\"mt-2 mr-2 enter-x\" :disabled=\"loading\" @click=\"handleShowForm(true)\">\n               {{ t('common.back') }}\n             </a-button>-->\n            <a-button  type=\"link\" size=\"small\" :disabled=\"loading\" @click=\"goLogin\">\n              {{ t('sys.lock.backToLogin') }}\n            </a-button>\n            <!-- <a-button class=\"mt-2\" type=\"link\" size=\"small\" @click=\"unLock()\" :loading=\"loading\">\n               {{ t('sys.lock.entry') }}\n             </a-button>-->\n          </div>\n        </div>\n      </div>\n    </transition>\n\n    <div class=\"absolute bottom-5 w-full text-gray-300 xl:text-xl 2xl:text-3xl text-center enter-y\">\n      <div class=\"text-5xl mb-4 enter-x\" v-show=\"!showDate\">\n        {{ hour }}:{{ minute }} <span class=\"text-3xl\">{{ meridiem }}</span>\n      </div>\n      <div class=\"text-2xl\"> {{ year }}/{{ month }}/{{ day }} {{ week }} </div>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\nimport {ref, computed, onMounted, onUnmounted} from 'vue';\n  import { Input } from 'ant-design-vue';\n  import { useUserStore } from '/@/store/modules/user';\n  import { useLockStore } from '/@/store/modules/lock';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useNow } from './useNow';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { LockOutlined } from '@ant-design/icons-vue';\n  import headerImg from '/@/assets/images/header.jpg';\n\n  const InputPassword = Input.Password;\n\n  const password = ref('');\n  const loading = ref(false);\n  const errMsg = ref(false);\n  const showDate = ref(true);\n\n  const { prefixCls } = useDesign('lock-page');\n  const lockStore = useLockStore();\n  const userStore = useUserStore();\n\n  const { hour, month, minute, meridiem, year, day, week } = useNow(true);\n\n  const { t } = useI18n();\n\n  const userinfo = computed(() => {\n    return userStore.getUserInfo || {};\n  });\n\n  /**\n   * @description: unLock\n   * \n   * @param type enter 回车 change input值发生改变 不提示锁屏密码错误\n   */\n  async function unLock(type) {\n    if (!password.value) {\n      return;\n    }\n    let pwd = password.value;\n    try {\n      loading.value = true;\n      const res = await lockStore.unLock(pwd);\n      if(type === 'enter'){\n        errMsg.value = !res;\n      }\n    } finally {\n      loading.value = false;\n    }\n  }\n\n  function goLogin() {\n    userStore.logout(true);\n    lockStore.resetLockInfo();\n  }\n\n  function handleShowForm(show = false) {\n    showDate.value = show;\n  }\n\n  /**\n   * 监听键盘触发事件\n   * \n   * @param event\n   */\n  function handleKeyDown(event) {\n    if (event.key === 'Escape') {\n      // 处理回车键按下事件\n      handleShowForm(true);\n      password.value = '';\n    }\n  }\n  \n  onMounted(()=>{\n    window.addEventListener('keydown', handleKeyDown);\n  })\n\n  onUnmounted(()=>{\n    window.removeEventListener('keydown', handleKeyDown);\n  })\n\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-lock-page';\n\n  .@{prefix-cls} {\n    z-index: @lock-page-z-index;\n\n    &__unlock {\n      transform: translate(-50%, 0);\n    }\n\n    &__hour,\n    &__minute {\n      display: flex;\n      font-weight: 700;\n      color: #bababa;\n      background-color: #141313;\n      border-radius: 30px;\n      justify-content: center;\n      align-items: center;\n\n      @media screen and (max-width: @screen-md) {\n        span:not(.meridiem) {\n          font-size: 160px;\n        }\n      }\n\n      @media screen and (min-width: @screen-md) {\n        span:not(.meridiem) {\n          font-size: 160px;\n        }\n      }\n\n      @media screen and (max-width: @screen-sm) {\n        span:not(.meridiem) {\n          font-size: 90px;\n        }\n      }\n      @media screen and (min-width: @screen-lg) {\n        span:not(.meridiem) {\n          font-size: 220px;\n        }\n      }\n\n      @media screen and (min-width: @screen-xl) {\n        span:not(.meridiem) {\n          font-size: 260px;\n        }\n      }\n      @media screen and (min-width: @screen-2xl) {\n        span:not(.meridiem) {\n          font-size: 320px;\n        }\n      }\n    }\n\n    &-entry {\n      position: absolute;\n      top: 0;\n      left: 0;\n      display: flex;\n      width: 100%;\n      height: 100%;\n      background-color: rgba(0, 0, 0, 0.5);\n      backdrop-filter: blur(8px);\n      justify-content: center;\n      align-items: center;\n\n      &-content {\n        width: 260px;\n      }\n\n      &__header {\n        text-align: center;\n\n        &-img {\n          width: 70px;\n          margin: 0 auto;\n          border-radius: 50%;\n        }\n\n        &-name {\n          margin-top: 5px;\n          font-weight: 500;\n          color: #bababa;\n        }\n      }\n\n      &__err-msg {\n        display: inline-block;\n        margin-top: 10px;\n        color: @error-color;\n      }\n\n      &__footer {\n        display: flex;\n        justify-content: space-between;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/lock/index.vue",
    "content": "<template>\n  <transition name=\"fade-bottom\" mode=\"out-in\">\n    <LockPage v-if=\"getIsLock\" />\n  </transition>\n</template>\n<script lang=\"ts\" setup>\n  import { computed } from 'vue';\n  import LockPage from './LockPage.vue';\n  import { useLockStore } from '/@/store/modules/lock';\n\n  const lockStore = useLockStore();\n  const getIsLock = computed(() => lockStore?.getLockInfo?.isLock ?? false);\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/lock/useNow.ts",
    "content": "import { dateUtil } from '/@/utils/dateUtil';\nimport { reactive, toRefs } from 'vue';\nimport { tryOnMounted, tryOnUnmounted } from '@vueuse/core';\n\nexport function useNow(immediate = true) {\n  let timer: IntervalHandle;\n\n  const state = reactive({\n    year: 0,\n    month: 0,\n    week: '',\n    day: 0,\n    hour: '',\n    minute: '',\n    second: 0,\n    meridiem: '',\n  });\n\n  const update = () => {\n    const now = dateUtil();\n\n    const h = now.format('HH');\n    const m = now.format('mm');\n    const s = now.get('s');\n\n    state.year = now.get('y');\n    state.month = now.get('M') + 1;\n    state.week = '星期' + ['日', '一', '二', '三', '四', '五', '六'][now.day()];\n    state.day = now.get('date');\n    state.hour = h;\n    state.minute = m;\n    state.second = s;\n\n    state.meridiem = now.format('A');\n  };\n\n  function start() {\n    update();\n    clearInterval(timer);\n    timer = setInterval(() => update(), 1000);\n  }\n\n  function stop() {\n    clearInterval(timer);\n  }\n\n  tryOnMounted(() => {\n    immediate && start();\n  });\n\n  tryOnUnmounted(() => {\n    stop();\n  });\n\n  return {\n    ...toRefs(state),\n    start,\n    stop,\n  };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/login/ForgetPasswordForm.vue",
    "content": "<template>\n  <template v-if=\"getShow\">\n    <!--节点-->\n    <a-steps style=\"margin-bottom: 20px\" :current=\"currentTab\">\n      <a-step title=\"手机验证\" />\n      <a-step title=\"更改密码\" />\n      <a-step title=\"完成\" />\n    </a-steps>\n    <!--组件-->\n    <div>\n      <step1 v-if=\"currentTab === 0\" @nextStep=\"nextStep\" />\n      <step2 v-if=\"currentTab === 1\" @nextStep=\"nextStep\" @prevStep=\"prevStep\" :accountInfo=\"accountInfo\" />\n      <step3 v-if=\"currentTab === 2\" @prevStep=\"prevStep\" @finish=\"finish\" />\n    </div>\n  </template>\n</template>\n<script lang=\"ts\" setup>\n  import { reactive, ref, computed, unref } from 'vue';\n  import { useLoginState, useFormRules, LoginStateEnum } from './useLogin';\n  import step1 from '../forget-password/step1.vue';\n  import step2 from '../forget-password/step2.vue';\n  import step3 from '../forget-password/step3.vue';\n  const { handleBackLogin, getLoginState } = useLoginState();\n  const { getFormRules } = useFormRules();\n\n  const formRef = ref();\n  const loading = ref(false);\n  const currentTab = ref(0);\n  const formData = reactive({\n    account: '',\n    mobile: '',\n    sms: '',\n  });\n  const getShow = computed(() => unref(getLoginState) === LoginStateEnum.RESET_PASSWORD);\n  const accountInfo = reactive({\n    obj: {\n      username: '',\n      phone: '',\n      smscode: '',\n    },\n  });\n  /**\n   * 下一步\n   * @param data\n   */\n  function nextStep(data) {\n    accountInfo.obj = data;\n    if (currentTab.value < 4) {\n      currentTab.value += 1;\n    }\n  }\n  /**\n   * 上一步\n   * @param data\n   */\n  function prevStep(data) {\n    accountInfo.obj = data;\n    if (currentTab.value > 0) {\n      currentTab.value -= 1;\n    }\n  }\n  /**\n   * 结束\n   */\n  function finish() {\n    currentTab.value = 0;\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/login/Login.vue",
    "content": "<template>\n  <div :class=\"prefixCls\" class=\"relative w-full h-full px-4\">\n    <AppLocalePicker class=\"absolute text-white top-4 right-4 enter-x xl:text-gray-600\" :showText=\"false\" v-if=\"!sessionTimeout && showLocale\" />\n    <AppDarkModeToggle class=\"absolute top-3 right-7 enter-x\" v-if=\"!sessionTimeout\" />\n    <span class=\"-enter-x xl:hidden\">\n      <AppLogo :alwaysShowTitle=\"true\" />\n    </span>\n\n    <div class=\"container relative h-full py-2 mx-auto sm:px-10\">\n      <div class=\"flex h-full\">\n        <div class=\"hidden min-h-full pl-4 mr-4 xl:flex xl:flex-col xl:w-6/12\">\n          <AppLogo class=\"-enter-x\" />\n          <div class=\"my-auto\">\n            <img :alt=\"title\" src=\"../../../assets/svg/login-box-bg.svg\" class=\"w-1/2 -mt-16 -enter-x\" />\n            <div class=\"mt-10 font-medium text-white -enter-x\">\n              <span class=\"inline-block mt-4 text-3xl\"> {{ t('sys.login.signInTitle') }}</span>\n            </div>\n            <div class=\"mt-5 font-normal text-white text-md dark:text-gray-500 -enter-x\">\n              {{ t('sys.login.signInDesc') }}\n            </div>\n          </div>\n        </div>\n        <div class=\"flex w-full h-full py-5 xl:h-auto xl:py-0 xl:my-0 xl:w-6/12\">\n          <div\n            :class=\"`${prefixCls}-form`\"\n            class=\"relative w-full px-5 py-8 mx-auto my-auto rounded-md shadow-md xl:ml-16 xl:bg-transparent sm:px-8 xl:p-4 xl:shadow-none sm:w-3/4 lg:w-2/4 xl:w-auto enter-x\"\n          >\n            <LoginForm />\n            <ForgetPasswordForm />\n            <RegisterForm />\n            <MobileForm />\n            <QrCodeForm />\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { computed } from 'vue';\n  import { AppLogo } from '/@/components/Application';\n  import { AppLocalePicker, AppDarkModeToggle } from '/@/components/Application';\n  import LoginForm from './LoginForm.vue';\n  import ForgetPasswordForm from './ForgetPasswordForm.vue';\n  import RegisterForm from './RegisterForm.vue';\n  import MobileForm from './MobileForm.vue';\n  import QrCodeForm from './QrCodeForm.vue';\n  import { useGlobSetting } from '/@/hooks/setting';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useLocaleStore } from '/@/store/modules/locale';\n  import { useLoginState, LoginStateEnum } from './useLogin';\n  defineProps({\n    sessionTimeout: {\n      type: Boolean,\n    },\n  });\n\n  const globSetting = useGlobSetting();\n  const { prefixCls } = useDesign('login');\n  const { t } = useI18n();\n  const localeStore = useLocaleStore();\n  const showLocale = localeStore.getShowPicker;\n  const title = computed(() => globSetting?.title ?? '');\n  const { handleBackLogin } = useLoginState();\n  handleBackLogin();\n</script>\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-login';\n  @logo-prefix-cls: ~'@{namespace}-app-logo';\n  @countdown-prefix-cls: ~'@{namespace}-countdown-input';\n  @dark-bg: #293146;\n\n  html[data-theme='dark'] {\n    .@{prefix-cls} {\n      background-color: @dark-bg;\n\n      &::before {\n        background-image: url(/@/assets/svg/login-bg-dark.svg);\n      }\n\n      .ant-input,\n      .ant-input-password {\n        background-color: #232a3b;\n      }\n\n      .ant-btn:not(.ant-btn-link):not(.ant-btn-primary) {\n        border: 1px solid #4a5569;\n      }\n\n      &-form {\n        background: transparent !important;\n      }\n\n      .app-iconify {\n        color: #fff;\n      }\n    }\n\n    input.fix-auto-fill,\n    .fix-auto-fill input {\n      -webkit-text-fill-color: #c9d1d9 !important;\n      box-shadow: inherit !important;\n    }\n  }\n\n  .@{prefix-cls} {\n    min-height: 100%;\n    overflow: hidden;\n    @media (max-width: @screen-xl) {\n      background-color: #293146;\n\n      .@{prefix-cls}-form {\n        background-color: #fff;\n      }\n    }\n\n    &::before {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      margin-left: -48%;\n      background-image: url(/@/assets/svg/login-bg.svg);\n      background-position: 100%;\n      background-repeat: no-repeat;\n      background-size: auto 100%;\n      content: '';\n      @media (max-width: @screen-xl) {\n        display: none;\n      }\n    }\n\n    .@{logo-prefix-cls} {\n      position: absolute;\n      top: 12px;\n      height: 30px;\n\n      &__title {\n        font-size: 16px;\n        color: #fff;\n      }\n\n      img {\n        width: 32px;\n      }\n    }\n\n    .container {\n      .@{logo-prefix-cls} {\n        display: flex;\n        width: 60%;\n        height: 80px;\n\n        &__title {\n          font-size: 24px;\n          color: #fff;\n        }\n\n        img {\n          width: 48px;\n        }\n      }\n    }\n\n    &-sign-in-way {\n      .anticon {\n        font-size: 22px;\n        color: #888;\n        cursor: pointer;\n\n        &:hover {\n          color: @primary-color;\n        }\n      }\n    }\n\n    input:not([type='checkbox']) {\n      min-width: 360px;\n\n      @media (max-width: @screen-xl) {\n        min-width: 320px;\n      }\n\n      @media (max-width: @screen-lg) {\n        min-width: 260px;\n      }\n\n      @media (max-width: @screen-md) {\n        min-width: 240px;\n      }\n\n      @media (max-width: @screen-sm) {\n        min-width: 160px;\n      }\n    }\n\n    .@{countdown-prefix-cls} input {\n      min-width: unset;\n    }\n\n    .ant-divider-inner-text {\n      font-size: 12px;\n      color: @text-color-secondary;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/login/LoginForm.vue",
    "content": "<template>\n  <LoginFormTitle v-show=\"getShow\" class=\"enter-x\" />\n  <Form class=\"p-4 enter-x\" :model=\"formData\" :rules=\"getFormRules\" ref=\"formRef\" v-show=\"getShow\" @keypress.enter=\"handleLogin\">\n    <FormItem name=\"account\" class=\"enter-x\">\n      <Input size=\"large\" v-model:value=\"formData.account\" :placeholder=\"t('sys.login.userName')\" class=\"fix-auto-fill\" />\n    </FormItem>\n    <FormItem name=\"password\" class=\"enter-x\">\n      <InputPassword size=\"large\" visibilityToggle v-model:value=\"formData.password\" :placeholder=\"t('sys.login.password')\" />\n    </FormItem>\n\n    <!--验证码-->\n    <ARow class=\"enter-x\">\n      <ACol :span=\"12\">\n        <FormItem name=\"inputCode\" class=\"enter-x\">\n          <Input size=\"large\" v-model:value=\"formData.inputCode\" :placeholder=\"t('sys.login.inputCode')\" style=\"min-width: 100px\" />\n        </FormItem>\n      </ACol>\n      <ACol :span=\"8\">\n        <FormItem :style=\"{ 'text-align': 'right', 'margin-left': '20px' }\" class=\"enter-x\">\n          <img\n            v-if=\"randCodeData.requestCodeSuccess\"\n            style=\"margin-top: 2px; max-width: initial\"\n            :src=\"randCodeData.randCodeImage\"\n            @click=\"handleChangeCheckCode\"\n          />\n          <img v-else style=\"margin-top: 2px; max-width: initial\" src=\"../../../assets/images/checkcode.png\" @click=\"handleChangeCheckCode\" />\n        </FormItem>\n      </ACol>\n    </ARow>\n\n    <ARow class=\"enter-x\">\n      <ACol :span=\"12\">\n        <FormItem>\n          <!-- No logic, you need to deal with it yourself -->\n          <Checkbox v-model:checked=\"rememberMe\" size=\"small\">\n            {{ t('sys.login.rememberMe') }}\n          </Checkbox>\n        </FormItem>\n      </ACol>\n      <ACol :span=\"12\">\n        <FormItem :style=\"{ 'text-align': 'right' }\">\n          <!-- No logic, you need to deal with it yourself -->\n          <Button type=\"link\" size=\"small\" @click=\"setLoginState(LoginStateEnum.RESET_PASSWORD)\">\n            {{ t('sys.login.forgetPassword') }}\n          </Button>\n        </FormItem>\n      </ACol>\n    </ARow>\n\n    <FormItem class=\"enter-x\">\n      <Button type=\"primary\" size=\"large\" block @click=\"handleLogin\" :loading=\"loading\">\n        {{ t('sys.login.loginButton') }}\n      </Button>\n      <!-- <Button size=\"large\" class=\"mt-4 enter-x\" block @click=\"handleRegister\">\n              {{ t('sys.login.registerButton') }}\n            </Button> -->\n    </FormItem>\n    <ARow class=\"enter-x\">\n      <ACol :md=\"8\" :xs=\"24\">\n        <Button block @click=\"setLoginState(LoginStateEnum.MOBILE)\">\n          {{ t('sys.login.mobileSignInFormTitle') }}\n        </Button>\n      </ACol>\n      <ACol :md=\"8\" :xs=\"24\" class=\"!my-2 !md:my-0 xs:mx-0 md:mx-2\">\n        <Button block @click=\"setLoginState(LoginStateEnum.QR_CODE)\">\n          {{ t('sys.login.qrSignInFormTitle') }}\n        </Button>\n      </ACol>\n      <ACol :md=\"7\" :xs=\"24\">\n        <Button block @click=\"setLoginState(LoginStateEnum.REGISTER)\">\n          {{ t('sys.login.registerButton') }}\n        </Button>\n      </ACol>\n    </ARow>\n\n    <Divider class=\"enter-x\">{{ t('sys.login.otherSignIn') }}</Divider>\n\n    <div class=\"flex justify-evenly enter-x\" :class=\"`${prefixCls}-sign-in-way`\">\n      <a @click=\"onThirdLogin('github')\" title=\"github\"><GithubFilled /></a>\n      <a @click=\"onThirdLogin('wechat_enterprise')\" title=\"企业微信\"> <icon-font class=\"item-icon\" type=\"icon-qiyeweixin3\" /></a>\n      <a @click=\"onThirdLogin('dingtalk')\" title=\"钉钉\"><DingtalkCircleFilled /></a>\n      <a @click=\"onThirdLogin('wechat_open')\" title=\"微信\"><WechatFilled /></a>\n    </div>\n  </Form>\n  <!-- 第三方登录相关弹框 -->\n  <ThirdModal ref=\"thirdModalRef\"></ThirdModal>\n</template>\n<script lang=\"ts\" setup>\n  import { reactive, ref, toRaw, unref, computed, onMounted } from 'vue';\n\n  import { Checkbox, Form, Input, Row, Col, Button, Divider } from 'ant-design-vue';\n  import { GithubFilled, WechatFilled, DingtalkCircleFilled, createFromIconfontCN } from '@ant-design/icons-vue';\n  import LoginFormTitle from './LoginFormTitle.vue';\n  import ThirdModal from './ThirdModal.vue';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  import { useUserStore } from '/@/store/modules/user';\n  import { LoginStateEnum, useLoginState, useFormRules, useFormValid } from './useLogin';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { getCodeInfo } from '/@/api/sys/user';\n  import {  encryptAESCBC } from '/@/utils/cipher';\n\n  const ACol = Col;\n  const ARow = Row;\n  const FormItem = Form.Item;\n  const InputPassword = Input.Password;\n  const IconFont = createFromIconfontCN({\n    scriptUrl: '//at.alicdn.com/t/font_2316098_umqusozousr.js',\n  });\n  const { t } = useI18n();\n  const { notification, createErrorModal } = useMessage();\n  const { prefixCls } = useDesign('login');\n  const userStore = useUserStore();\n\n  const { setLoginState, getLoginState } = useLoginState();\n  const { getFormRules } = useFormRules();\n\n  const formRef = ref();\n  const thirdModalRef = ref();\n  const loading = ref(false);\n  const rememberMe = ref(false);\n\n  const formData = reactive({\n    account: 'admin',\n    password: '123456',\n    inputCode: '',\n  });\n  const randCodeData = reactive({\n    randCodeImage: '',\n    requestCodeSuccess: false,\n    checkKey: null,\n  });\n\n  const { validForm } = useFormValid(formRef);\n\n  //onKeyStroke('Enter', handleLogin);\n\n  const getShow = computed(() => unref(getLoginState) === LoginStateEnum.LOGIN);\n\n  async function handleLogin() {\n    const data = await validForm();\n    if (!data) return;\n    try {\n      loading.value = true;\n\n      // 密码使用AES加密传输\n      const encryptedPassword = encryptAESCBC(data.password);\n      const { userInfo } = await userStore.login(\n        toRaw({\n          password: encryptedPassword,\n          username: data.account,\n          captcha: data.inputCode,\n          checkKey: randCodeData.checkKey,\n          mode: 'none', //不要默认的错误提示\n        })\n      );\n      if (userInfo) {\n        notification.success({\n          message: t('sys.login.loginSuccessTitle'),\n          description: `${t('sys.login.loginSuccessDesc')}: ${userInfo.realname}`,\n          duration: 3,\n        });\n      }\n    } catch (error) {\n      notification.error({\n        message: t('sys.api.errorTip'),\n        description: error.message || t('sys.api.networkExceptionMsg'),\n        duration: 3,\n      });\n      loading.value = false;\n      handleChangeCheckCode();\n    }\n  }\n  function handleChangeCheckCode() {\n    formData.inputCode = '';\n    // 代码逻辑说明: [QQYUN-10775]验证码可以复用 #7674------------\n    randCodeData.checkKey = new Date().getTime() + Math.random().toString(36).slice(-4); // 1629428467008;\n    getCodeInfo(randCodeData.checkKey).then((res) => {\n      randCodeData.randCodeImage = res;\n      randCodeData.requestCodeSuccess = true;\n    });\n  }\n\n  /**\n   * 第三方登录\n   * @param type\n   */\n  function onThirdLogin(type) {\n    thirdModalRef.value.onThirdLogin(type);\n  }\n  //初始化验证码\n  onMounted(() => {\n    handleChangeCheckCode();\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/login/LoginFormTitle.vue",
    "content": "<template>\n  <h2 class=\"mb-3 text-2xl font-bold text-center xl:text-3xl enter-x xl:text-left\">\n    {{ getFormTitle }}\n  </h2>\n</template>\n<script lang=\"ts\" setup>\n  import { computed, unref } from 'vue';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { LoginStateEnum, useLoginState } from './useLogin';\n\n  const { t } = useI18n();\n\n  const { getLoginState } = useLoginState();\n\n  const getFormTitle = computed(() => {\n    const titleObj = {\n      [LoginStateEnum.RESET_PASSWORD]: t('sys.login.forgetFormTitle'),\n      [LoginStateEnum.LOGIN]: t('sys.login.signInFormTitle'),\n      [LoginStateEnum.REGISTER]: t('sys.login.signUpFormTitle'),\n      [LoginStateEnum.MOBILE]: t('sys.login.mobileSignInFormTitle'),\n      [LoginStateEnum.QR_CODE]: t('sys.login.qrSignInFormTitle'),\n    };\n    return titleObj[unref(getLoginState)];\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/login/LoginSelect.vue",
    "content": "<template>\n  <BasicModal v-bind=\"config\" @register=\"registerModal\" :title=\"currTitle\" wrapClassName=\"loginSelectModal\" v-model:visible=\"visible\" :maxHeight=\"500\">\n    <a-form ref=\"formRef\" :model=\"formState\" :rules=\"rules\" v-bind=\"layout\" :colon=\"false\" class=\"loginSelectForm\">\n      <!--多租户选择-->\n      <a-form-item v-if=\"isMultiTenant\" name=\"tenantId\" :validate-status=\"validate_status\">\n        <!--label内容-->\n        <template #label>\n          <a-tooltip placement=\"topLeft\">\n            <template #title>\n              <span>您隶属于多租户，请选择登录租户</span>\n            </template>\n            <a-avatar style=\"background-color: #87d068\" :size=\"30\"> 租户 </a-avatar>\n          </a-tooltip>\n        </template>\n        <template #extra v-if=\"validate_status == 'error'\">\n          <span style=\"color: #ed6f6f\">请选择登录租户</span>\n        </template>\n        <!--租户下拉内容-->\n        <a-select\n          v-model:value=\"formState.tenantId\"\n          @change=\"handleTenantChange\"\n          placeholder=\"请选择登录租户\"\n          :class=\"{ 'valid-error': validate_status == 'error' }\"\n        >\n          <template v-for=\"tenant in tenantList\" :key=\"tenant.id\">\n            <a-select-option :value=\"tenant.id\">{{ tenant.name }}</a-select-option>\n          </template>\n        </a-select>\n      </a-form-item>\n      <!--多部门选择-->\n      <a-form-item v-if=\"isMultiDepart\" :validate-status=\"validate_status1\" :colon=\"false\">\n        <!--label内容-->\n        <template #label>\n          <a-tooltip placement=\"topLeft\">\n            <template #title>\n              <span>您隶属于多部门，请选择登录部门</span>\n            </template>\n            <a-avatar style=\"background-color: rgb(104, 208, 203)\" :size=\"30\"> 部门 </a-avatar>\n          </a-tooltip>\n        </template>\n        <template #extra v-if=\"validate_status1 == 'error'\">\n          <span style=\"color: #ed6f6f\">请选择登录部门</span>\n        </template>\n        <!--部门下拉内容-->\n        <a-select\n          v-model:value=\"formState.orgCode\"\n          @change=\"handleDepartChange\"\n          placeholder=\"请选择登录部门\"\n          :class=\"{ 'valid-error': validate_status1 == 'error' }\"\n        >\n          <template v-for=\"depart in departList\" :key=\"depart.orgCode\">\n            <a-select-option :value=\"depart.orgCode\">{{ depart.departName }}</a-select-option>\n          </template>\n        </a-select>\n      </a-form-item>\n    </a-form>\n\n    <template #footer>\n      <a-button @click=\"handleSubmit\" type=\"primary\">确认</a-button>\n    </template>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, ref, computed, watch, unref, reactive, UnwrapRef } from 'vue';\n  import { Avatar } from 'ant-design-vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useUserStore } from '/@/store/modules/user';\n  import { defHttp } from '/@/utils/http/axios';\n  interface FormState {\n    orgCode: string | undefined;\n    tenantId: number;\n  }\n  export default defineComponent({\n    name: 'loginSelect',\n    components: {\n      Avatar,\n      BasicModal,\n    },\n    emits: ['success', 'register'],\n    setup(props, { emit }) {\n      const userStore = useUserStore();\n      const { notification } = useMessage();\n      //租户配置\n      const isMultiTenant = ref(false);\n      const tenantList = ref([]);\n      const validate_status = ref('');\n      //部门配置\n      const isMultiDepart = ref(false);\n      const departList = ref([]);\n      const validate_status1 = ref('');\n      //弹窗显隐\n      const visible = ref(false);\n      //登录用户\n      const username = ref('');\n      //表单\n      const formRef = ref();\n      //选择的租户部门信息\n      const formState: UnwrapRef<FormState> = reactive({\n        orgCode: undefined,\n        tenantId: null,\n      });\n\n      const config = {\n        maskClosable: false,\n        closable: false,\n        canFullscreen: false,\n        width: '500px',\n        minHeight: 20,\n        maxHeight: 20,\n      };\n      //弹窗操作\n      const [registerModal, { closeModal }] = useModalInner();\n\n      //当前标题\n      const currTitle = computed(() => {\n        if (unref(isMultiDepart) && unref(isMultiTenant)) {\n          return '请选择租户和部门';\n        } else if (unref(isMultiDepart) && !unref(isMultiTenant)) {\n          return '请选择部门';\n        } else if (!unref(isMultiDepart) && unref(isMultiTenant)) {\n          return '请选择租户';\n        }\n      });\n\n      const rules = ref({\n        tenantId: [{ required: unref(isMultiTenant), type: 'number', message: '请选择租户', trigger: 'change' }],\n        orgCode: [{ required: unref(isMultiDepart), message: '请选择部门', trigger: 'change' }],\n      });\n\n      const layout = {\n        labelCol: { span: 4 },\n        wrapperCol: { span: 18 },\n      };\n      /**\n       * 处理部门情况\n       */\n      function bizDepart(loginResult) {\n        //如果登录接口返回了用户上次登录租户ID，则不需要重新选择\n        if(loginResult.userInfo?.orgCode && loginResult.userInfo?.orgCode!==''){\n          isMultiDepart.value = false;\n          return;\n        }\n        \n        let multi_depart = loginResult.multi_depart;\n        //0:无部门 1:一个部门 2:多个部门\n        if (multi_depart == 0) {\n          // notification.warn({\n          //   message: '提示',\n          //   description: `您尚未归属部门,请确认账号信息`,\n          //   duration: 3,\n          // });\n          isMultiDepart.value = false;\n        } else if (multi_depart == 2) {\n          isMultiDepart.value = true;\n          departList.value = loginResult.departs;\n        } else {\n          isMultiDepart.value = false;\n        }\n      }\n\n      /**\n       * 处理租户情况\n       */\n      function bizTenantList(loginResult) {\n        //如果登录接口返回了用户上次登录租户ID，则不需要重新选择\n        if(loginResult.userInfo?.loginTenantId && loginResult.userInfo?.loginTenantId!==0){\n          isMultiTenant.value = false;\n          return;\n        }\n        \n        let tenantArr = loginResult.tenantList;\n        if (Array.isArray(tenantArr)) {\n          if (tenantArr.length === 0) {\n            isMultiTenant.value = false;\n            userStore.setTenant(formState.tenantId);\n          } else if (tenantArr.length === 1) {\n            formState.tenantId = tenantArr[0].id;\n            isMultiTenant.value = false;\n            userStore.setTenant(formState.tenantId);\n          } else {\n            isMultiTenant.value = true;\n            tenantList.value = tenantArr;\n          }\n        }\n      }\n\n      /**\n       * 确认选中的租户和部门信息\n       */\n      function handleSubmit() {\n        if (unref(isMultiTenant) && !formState.tenantId) {\n          validate_status.value = 'error';\n          return false;\n        }\n        if (unref(isMultiDepart) && !formState.orgCode) {\n          validate_status1.value = 'error';\n          return false;\n        }\n        formRef.value\n          .validate()\n          .then(() => {\n            departResolve()\n              .then(() => {\n                userStore.setTenant(formState.tenantId);\n                emit('success');\n              })\n              .catch((e) => {\n                console.log('登录选择出现问题', e);\n              })\n              .finally(() => {\n                close();\n              });\n          })\n          .catch((err) => {\n            console.log('表单校验未通过error', err);\n          });\n      }\n      /**\n       *切换选择部门\n       */\n      function departResolve() {\n        return new Promise((resolve, reject) => {\n          if (!unref(isMultiDepart) && !unref(isMultiTenant)) {\n            resolve();\n          } else {\n            let params = { orgCode: formState.orgCode,loginTenantId: formState.tenantId, username: unref(username) };\n            defHttp.put({ url: '/sys/selectDepart', params }).then((res) => {\n              if (res.userInfo) {\n                userStore.setUserInfo(res.userInfo);\n                resolve();\n              } else {\n                requestFailed(res);\n                userStore.logout();\n                reject();\n              }\n            });\n          }\n        });\n      }\n\n      /**\n       * 请求失败处理\n       */\n      function requestFailed(err) {\n        notification.error({\n          message: '登录失败',\n          description: ((err.response || {}).data || {}).message || err.message || '请求出现错误，请稍后再试',\n          duration: 4,\n        });\n      }\n\n      /**\n       * 关闭model\n       */\n      function close() {\n        closeModal();\n        reset();\n      }\n      /**\n       * 弹窗打开前处理\n       */\n      async function show(loginResult) {\n        if (loginResult) {\n          username.value = userStore.username;\n          await reset();\n          await bizDepart(loginResult);\n          await bizTenantList(loginResult);\n          if (!unref(isMultiDepart) && !unref(isMultiTenant)) {\n            emit('success', userStore.getUserInfo);\n          } else {\n            visible.value = true;\n          }\n        }\n        //登录弹窗完成后，将登录的标识设置成false\n        loginResult.isLogin = false;\n        userStore.setLoginInfo(loginResult);\n      }\n\n      /**\n       *重置数据\n       */\n      function reset() {\n        tenantList.value = [];\n        validate_status.value = '';\n\n        departList.value = [];\n        validate_status1.value = '';\n      }\n\n      function handleTenantChange(e) {\n        validate_status.value = '';\n      }\n\n      function handleDepartChange(e) {\n        validate_status1.value = '';\n      }\n\n      return {\n        registerModal,\n        visible,\n        tenantList,\n        isMultiTenant,\n        validate_status,\n        isMultiDepart,\n        departList,\n        validate_status1,\n        formState,\n        rules,\n        layout,\n        formRef,\n        currTitle,\n        config,\n        handleTenantChange,\n        handleDepartChange,\n        show,\n        handleSubmit,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .loginSelectForm {\n    margin-bottom: -20px;\n  }\n\n  .loginSelectModal {\n    top: 10px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/login/MobileForm.vue",
    "content": "<template>\n  <template v-if=\"getShow\">\n    <LoginFormTitle class=\"enter-x\" />\n    <Form class=\"p-4 enter-x\" :model=\"formData\" :rules=\"getFormRules\" ref=\"formRef\">\n      <FormItem name=\"mobile\" class=\"enter-x\">\n        <Input size=\"large\" v-model:value=\"formData.mobile\" :placeholder=\"t('sys.login.mobile')\" class=\"fix-auto-fill\" />\n      </FormItem>\n      <FormItem name=\"sms\" class=\"enter-x\">\n        <CountdownInput\n          size=\"large\"\n          class=\"fix-auto-fill\"\n          v-model:value=\"formData.sms\"\n          :placeholder=\"t('sys.login.smsCode')\"\n          :sendCodeApi=\"sendCodeApi\"\n        />\n      </FormItem>\n\n      <FormItem class=\"enter-x\">\n        <Button type=\"primary\" size=\"large\" block @click=\"handleLogin\" :loading=\"loading\">\n          {{ t('sys.login.loginButton') }}\n        </Button>\n        <Button size=\"large\" block class=\"mt-4\" @click=\"handleBackLogin\">\n          {{ t('sys.login.backSignIn') }}\n        </Button>\n      </FormItem>\n    </Form>\n  </template>\n</template>\n<script lang=\"ts\" setup>\n  import { reactive, ref, computed, unref, toRaw } from 'vue';\n  import { Form, Input, Button } from 'ant-design-vue';\n  import { CountdownInput } from '/@/components/CountDown';\n  import LoginFormTitle from './LoginFormTitle.vue';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useLoginState, useFormRules, useFormValid, LoginStateEnum, SmsEnum } from './useLogin';\n  import { useUserStore } from '/@/store/modules/user';\n  import { getCaptcha } from '/@/api/sys/user';\n  const FormItem = Form.Item;\n  const { t } = useI18n();\n  const { handleBackLogin, getLoginState } = useLoginState();\n  const { getFormRules } = useFormRules();\n  const { notification, createErrorModal } = useMessage();\n  const userStore = useUserStore();\n  const formRef = ref();\n  const loading = ref(false);\n  const formData = reactive({\n    mobile: '',\n    sms: '',\n  });\n  const { validForm } = useFormValid(formRef);\n  const getShow = computed(() => unref(getLoginState) === LoginStateEnum.MOBILE);\n  /**\n   * 登录\n   */\n  async function handleLogin() {\n    const data = await validForm();\n    if (!data) return;\n    try {\n      loading.value = true;\n      const userInfo = await userStore.phoneLogin(\n        toRaw({\n          mobile: data.mobile,\n          captcha: data.sms,\n          mode: 'none', //不要默认的错误提示\n        })\n      );\n      if (userInfo) {\n        notification.success({\n          message: t('sys.login.loginSuccessTitle'),\n          description: `${t('sys.login.loginSuccessDesc')}: ${userInfo.realname}`,\n          duration: 3,\n        });\n      }\n    } catch (error) {\n      notification.error({\n        message: t('sys.api.errorTip'),\n        description: error.message || t('sys.api.networkExceptionMsg'),\n        duration: 3,\n      });\n    } finally {\n      loading.value = false;\n    }\n  }\n  //倒计时执行前的函数\n  function sendCodeApi() {\n    // 代码逻辑说明: 【issues/8567】严重：修改密码存在水平越权问题：登录应该用登录模板不应该用忘记密码的模板---\n    return getCaptcha({ mobile: formData.mobile, smsmode: SmsEnum.LOGIN });\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/login/OAuth2Login.vue",
    "content": "<template>\n  <div> </div>\n</template>\n\n<script setup lang=\"ts\">\n  import { ref } from 'vue';\n  import {isOAuth2AppEnv, sysOAuth2Callback, sysOAuth2Login} from '/@/views/sys/login/useLogin';\n  import { useRouter } from 'vue-router';\n  import { PageEnum } from '/@/enums/pageEnum';\n  import { router } from '/@/router';\n  import { useUserStore } from '/@/store/modules/user';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { getAuthCache, getTenantId, getToken } from \"/@/utils/auth\";\n  import { OAUTH2_THIRD_LOGIN_TENANT_ID } from \"@/enums/cacheEnum\";\n  import { defHttp } from \"@/utils/http/axios\";\n  import { requestAuthCode } from \"dingtalk-jsapi\";\n\n  const isOAuth = ref<boolean>(isOAuth2AppEnv());\n  const env = ref<any>({ thirdApp: false, wxWork: false, dingtalk: false });\n  const { currentRoute } = useRouter();\n  const route = currentRoute.value;\n  if (!isOAuth2AppEnv()) {\n    router.replace({ path: PageEnum.BASE_LOGIN, query: route.query });\n  }\n\n  if (isOAuth.value) {\n    checkEnv();\n  }\n\n  /**\n   * 检测当前的环境\n   */\n  function checkEnv() {\n    // 判断当时是否是企业微信环境\n    if (/wxwork/i.test(navigator.userAgent)) {\n      env.value.thirdApp = true;\n      env.value.wxWork = true;\n    }\n    // 判断当时是否是钉钉环境\n    if (/dingtalk/i.test(navigator.userAgent)) {\n      env.value.thirdApp = true;\n      env.value.dingtalk = true;\n    }\n    doOAuth2Login();\n  }\n\n  /**\n   * 进行OAuth2登录操作\n   */\n  function doOAuth2Login() {\n    if (env.value.thirdApp) {\n      // 判断是否携带了Token，是就说明登录成功\n      if (route.query.oauth2LoginToken) {\n        let token = route.query.oauth2LoginToken;\n        //执行登录操作\n        thirdLogin({ token, thirdType: route.query.thirdType,tenantId: getTenantId });\n      } else if (env.value.wxWork) {\n        sysOAuth2Login('wechat_enterprise');\n      } else if (env.value.dingtalk) {\n        //新版钉钉登录\n        dingdingLogin();\n      }\n    }\n  }\n\n  /**\n   * 第三方登录\n   * @param params\n   */\n  function thirdLogin(params) {\n    const userStore = useUserStore();\n    const { notification } = useMessage();\n    const { t } = useI18n();\n    userStore.ThirdLogin(params).then((res) => {\n      if (res && res.userInfo) {\n        notification.success({\n          message: t('sys.login.loginSuccessTitle'),\n          description: `${t('sys.login.loginSuccessDesc')}: ${res.userInfo.realname}`,\n          duration: 3,\n        });\n      } else {\n        notification.error({\n          message: '登录失败',\n          description: ((res.response || {}).data || {}).message || res.message || '请求出现错误，请稍后再试',\n          duration: 4,\n        });\n      }\n    });\n  }\n\n  /**\n   * 钉钉登录\n   */\n  function dingdingLogin() {\n    //先获取钉钉的企业id，如果没有配置 还是走原来的逻辑，走原来的逻辑 需要判断存不存在token，存在token直接去首页\n    let tenantId = getAuthCache(OAUTH2_THIRD_LOGIN_TENANT_ID) || 0;\n    let url = `/sys/thirdLogin/get/corpId/clientId?tenantId=${tenantId}`;\n    // 代码逻辑说明: 不要使用getAction online里面的，要用defHttp---\n    defHttp.get({ url:url },{ isTransformResponse: false }).then((res) => {\n      if (res.success) {\n        if(res.result && res.result.corpId && res.result.clientId){\n          requestAuthCode({ corpId: res.result.corpId, clientId: res.result.clientId }).then((res) => {\n            let { code } = res;\n            sysOAuth2Callback(code);\n          });\n        }else{\n          toOldAuthLogin();\n        }\n      } else {\n        toOldAuthLogin();\n      }\n    }).catch((err) => {\n      toOldAuthLogin();\n    });\n  }\n\n  /**\n   * 旧版钉钉登录\n   */\n  function toOldAuthLogin() {\n    let token = getToken();\n    if (token) {\n      router.replace({ path: PageEnum.BASE_HOME });\n    } else {\n      sysOAuth2Login('dingtalk');\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/login/QrCodeForm.vue",
    "content": "<template>\n  <template v-if=\"getShow\">\n    <LoginFormTitle class=\"enter-x\" />\n    <div class=\"enter-x min-w-64 min-h-64\">\n      <QrCode :value=\"qrCodeUrl\" class=\"enter-x flex justify-center xl:justify-start\" :width=\"280\" />\n      <Divider class=\"enter-x\">{{ scanContent }}</Divider>\n      <Button size=\"large\" block class=\"mt-4 enter-x\" @click=\"handleBackLogin\">\n        {{ t('sys.login.backSignIn') }}\n      </Button>\n    </div>\n  </template>\n</template>\n<script lang=\"ts\" setup>\n  import { computed, onMounted, unref, ref, watch } from 'vue';\n  import LoginFormTitle from './LoginFormTitle.vue';\n  import { Button, Divider } from 'ant-design-vue';\n  import { QrCode } from '/@/components/Qrcode/index';\n  import { useUserStore } from '/@/store/modules/user';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useLoginState, LoginStateEnum } from './useLogin';\n  import { getLoginQrcode, getQrcodeToken } from '/@/api/sys/user';\n  const qrCodeUrl = ref('');\n  let timer: IntervalHandle;\n  const { t } = useI18n();\n  const userStore = useUserStore();\n  const { handleBackLogin, getLoginState } = useLoginState();\n  const state = ref('0');\n  const getShow = computed(() => unref(getLoginState) === LoginStateEnum.QR_CODE);\n  const scanContent = computed(() => {\n    return unref(state) === '0' ? t('sys.login.scanSign') : t('sys.login.scanSuccess');\n  });\n  //加载二维码信息\n  function loadQrCode() {\n    state.value = '0';\n    getLoginQrcode().then((res) => {\n      qrCodeUrl.value = res.qrcodeId;\n      if (res.qrcodeId) {\n        openTimer(res.qrcodeId);\n      }\n    });\n  }\n  //监控扫码状态\n  function watchQrcodeToken(qrcodeId) {\n    getQrcodeToken({ qrcodeId: qrcodeId }).then((res) => {\n      let token = res.token;\n      if (token == '-2') {\n        //二维码过期重新获取\n        loadQrCode();\n        clearInterval(timer);\n      }\n      //扫码成功\n      if (res.success) {\n        state.value = '2';\n        clearInterval(timer);\n        setTimeout(() => {\n          userStore.qrCodeLogin(token);\n        }, 500);\n      }\n    });\n  }\n\n  /** 开启定时器 */\n  function openTimer(qrcodeId) {\n    watchQrcodeToken(qrcodeId);\n    closeTimer();\n    timer = setInterval(() => {\n      watchQrcodeToken(qrcodeId);\n    }, 1500);\n  }\n\n  /** 关闭定时器 */\n  function closeTimer() {\n    if (timer) clearInterval(timer);\n  }\n\n  watch(getShow, (v) => {\n    if (v) {\n      loadQrCode();\n    } else {\n      closeTimer();\n    }\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/login/RegisterForm.vue",
    "content": "<template>\n  <template v-if=\"getShow\">\n    <LoginFormTitle class=\"enter-x\" />\n    <Form class=\"p-4 enter-x\" :model=\"formData\" :rules=\"getFormRules\" ref=\"formRef\">\n      <FormItem name=\"account\" class=\"enter-x\">\n        <Input class=\"fix-auto-fill\" size=\"large\" v-model:value=\"formData.account\" :placeholder=\"t('sys.login.userName')\" />\n      </FormItem>\n      <FormItem name=\"mobile\" class=\"enter-x\">\n        <Input size=\"large\" v-model:value=\"formData.mobile\" :placeholder=\"t('sys.login.mobile')\" class=\"fix-auto-fill\" />\n      </FormItem>\n      <FormItem name=\"sms\" class=\"enter-x\">\n        <CountdownInput\n          size=\"large\"\n          class=\"fix-auto-fill\"\n          v-model:value=\"formData.sms\"\n          :placeholder=\"t('sys.login.smsCode')\"\n          :sendCodeApi=\"sendCodeApi\"\n        />\n      </FormItem>\n      <FormItem name=\"password\" class=\"enter-x\">\n        <StrengthMeter size=\"large\" v-model:value=\"formData.password\" :placeholder=\"t('sys.login.password')\" />\n      </FormItem>\n      <FormItem name=\"confirmPassword\" class=\"enter-x\">\n        <InputPassword size=\"large\" visibilityToggle v-model:value=\"formData.confirmPassword\" :placeholder=\"t('sys.login.confirmPassword')\" />\n      </FormItem>\n\n      <FormItem class=\"enter-x\" name=\"policy\">\n        <!-- No logic, you need to deal with it yourself -->\n        <Checkbox v-model:checked=\"formData.policy\" size=\"small\">\n          {{ t('sys.login.policy') }}\n        </Checkbox>\n      </FormItem>\n\n      <Button type=\"primary\" class=\"enter-x\" size=\"large\" block @click=\"handleRegister\" :loading=\"loading\">\n        {{ t('sys.login.registerButton') }}\n      </Button>\n      <Button size=\"large\" block class=\"mt-4 enter-x\" @click=\"handleBackLogin\">\n        {{ t('sys.login.backSignIn') }}\n      </Button>\n    </Form>\n  </template>\n</template>\n<script lang=\"ts\" setup>\n  import { reactive, ref, unref, computed, toRaw } from 'vue';\n  import LoginFormTitle from './LoginFormTitle.vue';\n  import { Form, Input, Button, Checkbox } from 'ant-design-vue';\n  import { StrengthMeter } from '/@/components/StrengthMeter';\n  import { CountdownInput } from '/@/components/CountDown';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useLoginState, useFormRules, useFormValid, LoginStateEnum, SmsEnum } from './useLogin';\n  import { register, getCaptcha } from '/@/api/sys/user';\n  const FormItem = Form.Item;\n  const InputPassword = Input.Password;\n  const { t } = useI18n();\n  const { handleBackLogin, getLoginState } = useLoginState();\n  const { notification, createErrorModal } = useMessage();\n  const formRef = ref();\n  const loading = ref(false);\n  const formData = reactive({\n    account: '',\n    password: '',\n    confirmPassword: '',\n    mobile: '',\n    sms: '',\n    policy: false,\n  });\n  const { getFormRules } = useFormRules(formData);\n  const { validForm } = useFormValid(formRef);\n  const getShow = computed(() => unref(getLoginState) === LoginStateEnum.REGISTER);\n  /**\n   * 注册\n   */\n  async function handleRegister() {\n    const data = await validForm();\n    if (!data) return;\n    try {\n      loading.value = true;\n      const resultInfo = await register(\n        toRaw({\n          username: data.account,\n          password: data.password,\n          phone: data.mobile,\n          smscode: data.sms,\n        })\n      );\n      if (resultInfo && resultInfo.data.success) {\n        notification.success({\n          description: resultInfo.data.message || t('sys.api.registerMsg'),\n          duration: 3,\n        });\n        handleBackLogin();\n      } else {\n        notification.warning({\n          message: t('sys.api.errorTip'),\n          description: resultInfo.data.message || t('sys.api.networkExceptionMsg'),\n          duration: 3,\n        });\n      }\n    } catch (error) {\n      notification.error({\n        message: t('sys.api.errorTip'),\n        description: error.message || t('sys.api.networkExceptionMsg'),\n        duration: 3,\n      });\n    } finally {\n      loading.value = false;\n    }\n  }\n  //发送验证码的函数\n  function sendCodeApi() {\n    return getCaptcha({ mobile: formData.mobile, smsmode: SmsEnum.REGISTER });\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/login/SessionTimeoutLogin.vue",
    "content": "<template>\n  <transition>\n    <div :class=\"prefixCls\">\n      <Login sessionTimeout />\n    </div>\n  </transition>\n</template>\n<script lang=\"ts\" setup>\n  import { onBeforeUnmount, onMounted, ref } from 'vue';\n  import Login from './Login.vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { useUserStore } from '/@/store/modules/user';\n  import { usePermissionStore } from '/@/store/modules/permission';\n  import { useAppStore } from '/@/store/modules/app';\n  import { PermissionModeEnum } from '/@/enums/appEnum';\n\n  const { prefixCls } = useDesign('st-login');\n  const userStore = useUserStore();\n  const permissionStore = usePermissionStore();\n  const appStore = useAppStore();\n  const userId = ref<Nullable<number | string>>(0);\n\n  const isBackMode = () => {\n    return appStore.getProjectConfig.permissionMode === PermissionModeEnum.BACK;\n  };\n\n  onMounted(() => {\n    // 记录当前的UserId\n    userId.value = userStore.getUserInfo?.userId;\n    console.log('Mounted', userStore.getUserInfo);\n  });\n\n  onBeforeUnmount(() => {\n    if (userId.value && userId.value !== userStore.getUserInfo.userId) {\n      // 登录的不是同一个用户，刷新整个页面以便丢弃之前用户的页面状态\n      document.location.reload();\n    } else if (isBackMode() && permissionStore.getLastBuildMenuTime === 0) {\n      // 后台权限模式下，没有成功加载过菜单，就重新加载整个页面。这通常发生在会话过期后按F5刷新整个页面后载入了本模块这种场景\n      document.location.reload();\n    }\n  });\n</script>\n<style lang=\"less\" scoped>\n  @prefix-cls: ~'@{namespace}-st-login';\n\n  .@{prefix-cls} {\n    position: fixed;\n    z-index: 9999999;\n    width: 100%;\n    height: 100%;\n    background: @component-background;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/login/ThirdModal.vue",
    "content": "<template>\n  <!-- 第三方登录绑定账号密码输入弹框 -->\n  <a-modal title=\"请输入密码\" v-model:open=\"thirdPasswordShow\" @ok=\"thirdLoginCheckPassword\" @cancel=\"thirdLoginNoPassword\">\n    <a-input-password placeholder=\"请输入密码\" v-model:value=\"thirdLoginPassword\" style=\"margin: 15px; width: 80%\" />\n  </a-modal>\n\n  <!-- 第三方登录提示是否绑定账号弹框 -->\n  <a-modal :footer=\"null\" :closable=\"false\" v-model:open=\"thirdConfirmShow\" :class=\"'ant-modal-confirm'\">\n    <div class=\"ant-modal-confirm-body-wrapper\">\n      <div class=\"ant-modal-confirm-body\">\n        <QuestionCircleFilled style=\"color: #faad14\" />\n        <span class=\"ant-modal-confirm-title\">提示</span>\n        <div class=\"ant-modal-confirm-content\"> 已有同名账号存在,请确认是否绑定该账号？ </div>\n      </div>\n      <div class=\"ant-modal-confirm-btns\">\n        <a-button @click=\"thirdLoginUserCreate\" :loading=\"thirdCreateUserLoding\">创建新账号</a-button>\n        <a-button @click=\"thirdLoginUserBind\" type=\"primary\">确认绑定</a-button>\n      </div>\n    </div>\n  </a-modal>\n\n  <!-- 第三方登录绑定手机号 -->\n  <a-modal title=\"绑定手机号\" v-model:open=\"bindingPhoneModal\" :maskClosable=\"false\">\n    <Form class=\"p-4 enter-x\" style=\"margin: 15px 10px\">\n      <FormItem class=\"enter-x\">\n        <a-input size=\"large\" placeholder=\"请输入手机号\" v-model:value=\"thirdPhone\" class=\"fix-auto-fill\">\n          <template #prefix>\n            <Icon icon=\"ant-design:mobile-outlined\" :style=\"{ color: 'rgba(0,0,0,.25)' }\"></Icon>\n          </template>\n        </a-input>\n      </FormItem>\n      <FormItem name=\"sms\" class=\"enter-x\">\n        <CountdownInput size=\"large\" class=\"fix-auto-fill\" v-model:value=\"thirdCaptcha\" placeholder=\"请输入验证码\" :sendCodeApi=\"sendCodeApi\">\n          <template #prefix>\n            <Icon icon=\"ant-design:mail-outlined\" :style=\"{ color: 'rgba(0,0,0,.25)' }\"></Icon>\n          </template>\n        </CountdownInput>\n      </FormItem>\n    </Form>\n    <template #footer>\n      <a-button type=\"primary\" @click=\"thirdHandleOk\">确定</a-button>\n    </template>\n  </a-modal>\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { Form, Input } from 'ant-design-vue';\n  import { CountdownInput } from '/@/components/CountDown';\n  import { useThirdLogin } from '/@/hooks/system/useThirdLogin';\n  import { QuestionCircleFilled } from '@ant-design/icons-vue';\n\n  const FormItem = Form.Item;\n  const InputPassword = Input.Password;\n\n  export default defineComponent({\n    name: 'ThirdModal',\n    components: { FormItem, Form, InputPassword, CountdownInput, QuestionCircleFilled },\n    setup() {\n      return {\n        ...useThirdLogin(),\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/login/TokenLoginPage.vue",
    "content": "<template>\n    <div class=\"app-loading\">\n        <div class=\"app-loading-wrap\">\n            <img src=\"/resource/img/logo.png\" class=\"app-loading-logo\" alt=\"Logo\">\n            <div class=\"app-loading-dots\">\n                <span class=\"dot dot-spin\"><i></i><i></i><i></i><i></i></span>\n            </div>\n            <div class=\"app-loading-title\">JeecgBoot 企业级低代码平台</div>\n        </div>\n    </div>\n</template>\n\n\n<script lang=\"ts\">\n  /**\n   * 地址中携带token，跳转至此页面进行登录操作\n   */\n  import { useRoute, useRouter } from 'vue-router';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useUserStore } from '/@/store/modules/user';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  \n  export default {\n    name: \"TokenLogin\",\n    setup(){\n      const route = useRoute();\n      let router = useRouter();\n      const {createMessage, notification} = useMessage()\n      const {t} = useI18n();\n      const routeQuery:any = route.query;\n      if(!routeQuery){\n        createMessage.warning('参数无效')\n      }\n     \n      const token = routeQuery['loginToken'];\n      if(!token){\n        createMessage.warning('token无效')\n      }\n      const userStore = useUserStore();\n      userStore.ThirdLogin({ token, thirdType:'email', goHome: false }).then(res => {\n        console.log(\"res====>doThirdLogin\",res)\n        if(res && res.userInfo){\n          requestSuccess(res)\n        }else{\n          requestFailed(res)\n        }\n      });\n\n      function requestFailed (err) {\n        notification.error({\n          message: '登录失败',\n          description: ((err.response || {}).data || {}).message || err.message || \"请求出现错误，请稍后再试\",\n          duration: 4,\n        });\n      }\n      \n      function requestSuccess(res){\n        let info = routeQuery.info;\n        if(info){\n          let query = JSON.parse(info);\n          \n          // 代码逻辑说明: QQYUN-4882【简流】节点消息通知 邮箱 点击办理跳到了应用首页\n          let path = '';\n          if(query.isLowApp === 1){\n            path = '/myapps/personalOffice/myTodo'\n          }else{\n            let taskId = query.taskId;\n            path = '/task/handle/' + taskId\n          }\n          \n          router.replace({ path, query });\n          notification.success({\n            message: t('sys.login.loginSuccessTitle'),\n            description: `${t('sys.login.loginSuccessDesc')}: ${res.userInfo.realname}`,\n            duration: 3,\n          });\n        }else{\n          notification.error({\n            message: '参数失效',\n            description: \"页面跳转参数丢失，请查看日志\",\n            duration: 4,\n          });\n        }\n      }\n    }\n  }\n</script>\n\n<style scoped>\n\n    html[data-theme='dark'] .app-loading {\n        background-color: #2c344a;\n    }\n\n    html[data-theme='dark'] .app-loading .app-loading-title {\n        color: rgba(255, 255, 255, 0.85);\n    }\n\n    .app-loading {\n        display: flex;\n        width: 100%;\n        height: 100%;\n        justify-content: center;\n        align-items: center;\n        flex-direction: column;\n        background-color: #f4f7f9;\n    }\n\n    .app-loading .app-loading-wrap {\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        display: flex;\n        -webkit-transform: translate3d(-50%, -50%, 0);\n        transform: translate3d(-50%, -50%, 0);\n        justify-content: center;\n        align-items: center;\n        flex-direction: column;\n    }\n\n    .app-loading .dots {\n        display: flex;\n        padding: 98px;\n        justify-content: center;\n        align-items: center;\n    }\n\n    .app-loading .app-loading-title {\n        display: flex;\n        margin-top: 30px;\n        font-size: 30px;\n        color: rgba(0, 0, 0, 0.85);\n        justify-content: center;\n        align-items: center;\n    }\n\n    .app-loading .app-loading-logo {\n        display: block;\n        width: 90px;\n        margin: 0 auto;\n        margin-bottom: 20px;\n    }\n\n    .dot {\n        position: relative;\n        display: inline-block;\n        width: 48px;\n        height: 48px;\n        margin-top: 30px;\n        font-size: 32px;\n        transform: rotate(45deg);\n        box-sizing: border-box;\n        animation: antRotate 1.2s infinite linear;\n    }\n\n    .dot i {\n        position: absolute;\n        display: block;\n        width: 20px;\n        height: 20px;\n        background-color: #0065cc;\n        border-radius: 100%;\n        opacity: 0.3;\n        transform: scale(0.75);\n        animation: antSpinMove 1s infinite linear alternate;\n        transform-origin: 50% 50%;\n    }\n\n    .dot i:nth-child(1) {\n        top: 0;\n        left: 0;\n    }\n\n    .dot i:nth-child(2) {\n        top: 0;\n        right: 0;\n        -webkit-animation-delay: 0.4s;\n        animation-delay: 0.4s;\n    }\n\n    .dot i:nth-child(3) {\n        right: 0;\n        bottom: 0;\n        -webkit-animation-delay: 0.8s;\n        animation-delay: 0.8s;\n    }\n\n    .dot i:nth-child(4) {\n        bottom: 0;\n        left: 0;\n        -webkit-animation-delay: 1.2s;\n        animation-delay: 1.2s;\n    }\n    @keyframes antRotate {\n        to {\n            -webkit-transform: rotate(405deg);\n            transform: rotate(405deg);\n        }\n    }\n    @-webkit-keyframes antRotate {\n        to {\n            -webkit-transform: rotate(405deg);\n            transform: rotate(405deg);\n        }\n    }\n    @keyframes antSpinMove {\n        to {\n            opacity: 1;\n        }\n    }\n    @-webkit-keyframes antSpinMove {\n        to {\n            opacity: 1;\n        }\n    }\n\n</style>"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/login/useLogin.ts",
    "content": "import type { ValidationRule } from 'ant-design-vue/lib/form/Form';\nimport type { RuleObject } from 'ant-design-vue/lib/form/interface';\nimport { ref, computed, unref, Ref } from 'vue';\nimport { useI18n } from '/@/hooks/web/useI18n';\nimport { checkOnlyUser } from '/@/api/sys/user';\nimport { defHttp } from '/@/utils/http/axios';\nimport { OAUTH2_THIRD_LOGIN_TENANT_ID } from \"/@/enums/cacheEnum\";\nimport { getAuthCache } from \"/@/utils/auth\";\n\nexport enum LoginStateEnum {\n  LOGIN,\n  REGISTER,\n  RESET_PASSWORD,\n  MOBILE,\n  QR_CODE,\n}\n\nexport enum SmsEnum {\n  LOGIN = '0',\n  REGISTER = '1',\n  FORGET_PASSWORD = '2',\n}\nconst currentState = ref(LoginStateEnum.LOGIN);\n\nexport function useLoginState() {\n  function setLoginState(state: LoginStateEnum) {\n    currentState.value = state;\n  }\n\n  const getLoginState = computed(() => currentState.value);\n\n  function handleBackLogin() {\n    setLoginState(LoginStateEnum.LOGIN);\n  }\n\n  return { setLoginState, getLoginState, handleBackLogin };\n}\n\nexport function useFormValid<T extends Object = any>(formRef: Ref<any>) {\n  async function validForm() {\n    const form = unref(formRef);\n    if (!form) return;\n    const data = await form.validate();\n    return data as T;\n  }\n\n  return { validForm };\n}\n\nexport function useFormRules(formData?: Recordable) {\n  const { t } = useI18n();\n\n  const getAccountFormRule = computed(() => createRule(t('sys.login.accountPlaceholder')));\n  const getPasswordFormRule = computed(() => createRule(t('sys.login.passwordPlaceholder')));\n  const getSmsFormRule = computed(() => createRule(t('sys.login.smsPlaceholder')));\n  const getMobileFormRule = computed(() => createRule(t('sys.login.mobilePlaceholder')));\n\n  const getRegisterAccountRule = computed(() => createRegisterAccountRule('account'));\n  const getRegisterMobileRule = computed(() => createRegisterAccountRule('mobile'));\n\n  const validatePolicy = async (_: RuleObject, value: boolean) => {\n    return !value ? Promise.reject(t('sys.login.policyPlaceholder')) : Promise.resolve();\n  };\n\n  const validateConfirmPassword = (password: string) => {\n    return async (_: RuleObject, value: string) => {\n      if (!value) {\n        return Promise.reject(t('sys.login.passwordPlaceholder'));\n      }\n      if (value !== password) {\n        return Promise.reject(t('sys.login.diffPwd'));\n      }\n      return Promise.resolve();\n    };\n  };\n\n  const getFormRules = computed((): { [k: string]: ValidationRule | ValidationRule[] } => {\n    const accountFormRule = unref(getAccountFormRule);\n    const passwordFormRule = unref(getPasswordFormRule);\n    const smsFormRule = unref(getSmsFormRule);\n    const mobileFormRule = unref(getMobileFormRule);\n\n    const registerAccountRule = unref(getRegisterAccountRule);\n    const registerMobileRule = unref(getRegisterMobileRule);\n\n    const mobileRule = {\n      sms: smsFormRule,\n      mobile: mobileFormRule,\n    };\n    switch (unref(currentState)) {\n      // register form rules\n      case LoginStateEnum.REGISTER:\n        return {\n          account: registerAccountRule,\n          password: passwordFormRule,\n          mobile: registerMobileRule,\n          sms: smsFormRule,\n          confirmPassword: [{ validator: validateConfirmPassword(formData?.password), trigger: 'change' }],\n          policy: [{ validator: validatePolicy, trigger: 'change' }],\n        };\n\n      // reset password form rules\n      case LoginStateEnum.RESET_PASSWORD:\n        return {\n          username: accountFormRule,\n          confirmPassword: [{ validator: validateConfirmPassword(formData?.password), trigger: 'change' }],\n          ...mobileRule,\n        };\n\n      // mobile form rules\n      case LoginStateEnum.MOBILE:\n        return mobileRule;\n\n      // login form rules\n      default:\n        return {\n          account: accountFormRule,\n          password: passwordFormRule,\n        };\n    }\n  });\n  return { getFormRules };\n}\n\nfunction createRule(message: string) {\n  return [\n    {\n      required: true,\n      message,\n      trigger: 'change',\n    },\n  ];\n}\nfunction createRegisterAccountRule(type) {\n  return [\n    {\n      validator: type == 'account' ? checkUsername : checkPhone,\n      trigger: 'change',\n    },\n  ];\n}\n\nfunction checkUsername(rule, value, callback) {\n  const { t } = useI18n();\n  if (!value) {\n    return Promise.reject(t('sys.login.accountPlaceholder'));\n  } else {\n    return new Promise((resolve, reject) => {\n      checkOnlyUser({ username: value }).then((res) => {\n        res.success ? resolve() : reject('用户名已存在!');\n      });\n    });\n  }\n}\nasync function checkPhone(rule, value, callback) {\n  const { t } = useI18n();\n  var reg = /^1[3456789]\\d{9}$/;\n  if (!reg.test(value)) {\n    return Promise.reject(new Error('请输入正确手机号'));\n  } else {\n    return new Promise((resolve, reject) => {\n      checkOnlyUser({ phone: value }).then((res) => {\n        res.success ? resolve() : reject('手机号已存在!');\n      });\n    });\n  }\n}\n\n/**\n * 判断是否是OAuth2APP环境\n */\nexport function isOAuth2AppEnv() {\n  return /wxwork|dingtalk/i.test(navigator.userAgent);\n}\n\n/**\n * 判断是否是钉钉环境\n */\nexport function isOAuth2DingAppEnv() {\n  return /dingtalk/i.test(navigator.userAgent);\n}\n\n/**\n * 后台构造oauth2登录地址\n * @param source\n * @param tenantId\n */\nexport function sysOAuth2Login(source) {\n  let url = `${window._CONFIG['domianURL']}/sys/thirdLogin/oauth2/${source}/login`;\n  url += `?state=${encodeURIComponent(window.location.origin)}`;\n  // 代码逻辑说明: [QQYUN-3440]新建企业微信和钉钉配置表，通过租户模式隔离------------\n  let tenantId = getAuthCache(OAUTH2_THIRD_LOGIN_TENANT_ID);\n  if(tenantId){\n    url += `&tenantId=${tenantId}`;\n  }\n  window.location.href = url;\n}\n\n/**\n * 后台callBack\n * @param code\n */\nexport function sysOAuth2Callback(code:string) {\n  let url = `${window._CONFIG['domianURL']}/sys/thirdLogin/oauth2/dingding/login`;\n  url += `?state=${encodeURIComponent(window.location.origin)}&authCode=${code}`;\n  let tenantId = getAuthCache(OAUTH2_THIRD_LOGIN_TENANT_ID);\n  if(tenantId){\n    url += `&tenantId=${tenantId}`;\n  }\n  window.location.href = url;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/sys/redirect/index.vue",
    "content": "<template>\n  <div></div>\n</template>\n<script lang=\"ts\" setup>\n  import { unref } from 'vue';\n  import { useRouter } from 'vue-router';\n  import { useMultipleTabStore } from '/@/store/modules/multipleTab';\n  // 代码逻辑说明: 【QQYUN-7099】动态路由匹配右键重新加载404\n  const { currentRoute, replace } = useRouter();\n  const { params, query } = unref(currentRoute);\n  const { path } = params;\n  const tabStore = useMultipleTabStore();\n  const redirectPageParam = tabStore.redirectPageParam;\n  const _path = Array.isArray(path) ? path.join('/') : path;\n  if (redirectPageParam) {\n    if (redirectPageParam.redirect_type === 'name') {\n      replace({\n        name: redirectPageParam.name,\n        query: redirectPageParam.query,\n        params: redirectPageParam.params,\n      });\n    } else {\n      replace({\n        path: _path.startsWith('/') ? _path : '/' + _path,\n        query,\n      });\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/address/address.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\n\nexport enum Api {\n  list = '/sys/user/queryDepartUserByOrgCode',\n  positionList = '/sys/position/list',\n  queryDepartTreeSync = '/sys/sysDepart/queryDepartTreeSync',\n}\n/**\n * 获取部门树列表\n */\nexport const queryDepartTreeSync = (params?) => defHttp.get({ url: Api.queryDepartTreeSync, params });\n/**\n * 部门用户信息\n */\nexport const list = (params?) => defHttp.get({ url: Api.list, params });\n/**\n * 职务list\n */\nexport const positionList = (params?) => defHttp.get({ url: Api.positionList, params });\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/address/address.data.ts",
    "content": "import { FormSchema } from '/@/components/Form';\nimport { BasicColumn } from '/@/components/Table';\nimport { getDepartName } from \"@/utils/common/compUtils\";\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '姓名',\n    dataIndex: 'realname',\n    width: 100,\n  },\n  {\n    title: '部门',\n    dataIndex: 'departName',\n    customRender:({ text })=>{\n      return getDepartName(text);\n    }\n  },\n  {\n    title: '主岗位',\n    dataIndex: 'postName',\n    customRender:({ text })=>{\n      return getDepartName(text);\n    }\n  },\n  {\n    title: '兼职岗位',\n    dataIndex: 'otherPostName',\n    customRender:({ text })=>{\n      return getDepartName(text);\n    }\n  },\n/*  {\n    title: '职务',\n    dataIndex: 'post',\n    width: 150,\n    slots: { customRender: 'post' },\n  },*/\n  {\n    title: '手机',\n    width: 110,\n    dataIndex: 'phone',\n    customRender:( { record, text })=>{\n      if(record.izHideContact && record.izHideContact === '1'){\n        return '/';\n      }\n      return text;\n    }\n  },\n  {\n    title: '邮箱',\n    width: 180,\n    dataIndex: 'email',\n    customRender:( { record, text })=>{\n      if(record.izHideContact && record.izHideContact === '1'){\n        return text?'/':'';\n      }\n      return text;\n    }\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    label: '姓名',\n    field: 'realname',\n    component: 'Input',\n    colProps: { span: 6 },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/address/components/DepartLeftTree.vue",
    "content": "<template>\n  <a-card :bordered=\"false\" style=\"height: 100%;\" :body-style=\"{ background: backgroundColor }\" >\n    <a-spin :spinning=\"loading\">\n      <a-input-search v-if=\"showSearch\" placeholder=\"按部门名称搜索…\" style=\"margin-bottom: 10px\" @search=\"onSearch\" allowClear />\n      <!--组织机构树-->\n      <template v-if=\"treeData.length > 0\">\n        <a-tree\n          v-if=\"!treeReloading\"\n          :style=\"{ background: backgroundColor }\"\n          showLine\n          :clickRowToExpand=\"false\"\n          :treeData=\"treeData\"\n          :selectedKeys=\"selectedKeys\"\n          :load-data=\"loadChildrenTreeData\"\n          v-model:expandedKeys=\"expandedKeys\"\n          @select=\"onSelect\"\n          style=\"overflow-y: auto;height: calc(100vh - 330px);\"\n        >\n          <template #title=\"{ orgCategory, title, departNameAbbr }\">\n            <TreeIcon :orgCategory=\"orgCategory\" :title=\"getTitle(title,departNameAbbr)\"></TreeIcon>\n          </template>\n        </a-tree>\n      </template>\n      <a-empty v-else description=\"暂无数据\" />\n    </a-spin>\n  </a-card>\n</template>\n\n<script lang=\"ts\" setup>\n  import { inject, nextTick, ref, unref } from 'vue';\n  import { queryDepartTreeSync } from '../address.api';\n  import { searchByKeywords } from '/@/views/system/departUser/depart.user.api';\n  import { Popconfirm } from 'ant-design-vue';\n  import TreeIcon from \"@/components/Form/src/jeecg/components/TreeIcon/TreeIcon.vue\";\n\n  const prefixCls = inject('prefixCls');\n  // 定义props\n  const props = defineProps({\n    // 是否显示搜索框\n    showSearch: {\n      type: Boolean,\n      default: true,\n    },\n    // 背景色\n    backgroundColor: {\n      type: String,\n      default: 'inherit',\n    },\n  });\n  const emit = defineEmits(['select', 'rootTreeData']);\n\n  const loading = ref<boolean>(false);\n  // 部门树列表数据\n  const treeData = ref<any[]>([]);\n  // 当前展开的项\n  const expandedKeys = ref<any[]>([]);\n  // 当前选中的项\n  const selectedKeys = ref<any[]>([]);\n  // 树组件重新加载\n  const treeReloading = ref<boolean>(false);\n  // 当前选中的部门\n  const currentDepart = ref<any>(null);\n  // 搜索关键字\n  const searchKeyword = ref('');\n\n  // 加载顶级部门信息\n  async function loadRootTreeData() {\n    try {\n      loading.value = true;\n      treeData.value = [];\n      const result = await queryDepartTreeSync();\n      if (Array.isArray(result)) {\n        treeData.value = result;\n      }\n      if (expandedKeys.value.length === 0) {\n        autoExpandParentNode();\n      }\n    } finally {\n      loading.value = false;\n    }\n  }\n\n  loadRootTreeData();\n\n  // 加载子级部门信息\n  async function loadChildrenTreeData(treeNode) {\n    try {\n      const result = await queryDepartTreeSync({\n        pid: treeNode.dataRef.id,\n      });\n      if (result.length == 0) {\n        treeNode.dataRef.isLeaf = true;\n      } else {\n        treeNode.dataRef.children = result;\n        if (expandedKeys.value.length > 0) {\n          // 判断获取的子级是否有当前展开的项\n          let subKeys: any[] = [];\n          for (let key of expandedKeys.value) {\n            if (result.findIndex((item) => item.id === key) !== -1) {\n              subKeys.push(key);\n            }\n          }\n          if (subKeys.length > 0) {\n            expandedKeys.value = [...expandedKeys.value];\n          }\n        }\n      }\n      treeData.value = [...treeData.value];\n    } catch (e) {\n      console.error(e);\n    }\n    return Promise.resolve();\n  }\n\n  // 自动展开父节点，只展开一级\n  function autoExpandParentNode() {\n    let item = treeData.value[0];\n    if (item) {\n      if (!item.isLeaf) {\n        expandedKeys.value = [item.key];\n      }\n      reloadTree();\n    }\n  }\n\n  // 重新加载树组件，防止无法默认展开数据\n  async function reloadTree() {\n    await nextTick();\n    treeReloading.value = true;\n    await nextTick();\n    treeReloading.value = false;\n  }\n\n  /**\n   * 设置当前选中的行\n   */\n  function setSelectedKey(key: string, data?: object) {\n    selectedKeys.value = [key];\n    if (data) {\n      currentDepart.value = data;\n      emit('select', data);\n    }\n  }\n\n  // 搜索事件\n  async function onSearch(value: string) {\n    if (value) {\n      try {\n        loading.value = true;\n        treeData.value = [];\n        let result = await searchByKeywords({ keyWord: value, orgCategory: '1,2,4' });\n        if (Array.isArray(result)) {\n          treeData.value = result;\n        }\n        autoExpandParentNode();\n      } finally {\n        loading.value = false;\n      }\n    } else {\n      loadRootTreeData();\n    }\n    searchKeyword.value = value;\n  }\n\n  // 树选择事件\n  function onSelect(selKeys, event) {\n    if (selKeys.length > 0 && selectedKeys.value[0] !== selKeys[0]) {\n      setSelectedKey(selKeys[0], event.selectedNodes[0]);\n    } else {\n      // 这样可以防止用户取消选择\n      setSelectedKey(selectedKeys.value[0]);\n    }\n  }\n\n  /**\n   * 获取标题\n   * @param title 部门名称\n   * @param departNameAbbr 缩写\n   */\n  function getTitle(title, departNameAbbr) {\n    if (departNameAbbr){\n      return departNameAbbr;\n    }\n    return title;\n  }\n\n  defineExpose({\n    loadRootTreeData,\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/address/index.less",
    "content": "//noinspection LessUnresolvedVariable\n@prefix-cls: ~'@{namespace}-address-list';\n\n.@{prefix-cls} {\n  // update-begin-author:liusq date:20230625 for: [issues/563]暗色主题部分失效\n  background-color: @component-background;\n  // update-end-author:liusq date:20230625 for: [issues/563]暗色主题部分失效\n  &--box {\n    .ant-tabs-nav {\n      padding: 0 20px;\n    }\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/address/index.vue",
    "content": "<template>\n  <a-row :class=\"['p-4', `${prefixCls}--box`]\" type=\"flex\" :gutter=\"10\" style=\"max-height: 800px\">\n    <a-col :xl=\"6\" :lg=\"24\" :md=\"24\" style=\"margin-bottom: 10px\">\n      <DepartLeftTree ref=\"leftTree\" @select=\"onTreeSelect\" />\n    </a-col>\n    <a-col :xl=\"18\" :lg=\"24\" :md=\"24\" style=\"margin-bottom: 10px\">\n      <div style=\"height: 100%;\" class=\"address-book\">\n        <!--引用表格-->\n        <BasicTable @register=\"registerTable\">\n          <template #post=\"{ text }\">\n            {{\n              (text || '')\n                .split(',')\n                .map((t) => (positionInfo[t] ? positionInfo[t] : t))\n                .join(',')\n            }}\n          </template>\n          <template #action=\"{ record }\">\n            <TableAction :actions=\"getTableAction(record)\" />\n          </template>\n        </BasicTable>\n      </div>\n    </a-col>\n  </a-row>\n</template>\n\n<script lang=\"ts\" setup>\n  import { provide, ref, unref } from 'vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import DepartLeftTree from './components/DepartLeftTree.vue';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { columns, searchFormSchema } from './address.data';\n  import { list, positionList } from './address.api';\n  import { getCacheByDynKey } from \"@/utils/auth\";\n  import { JEECG_CHAT_UID } from \"@/enums/cacheEnum\";\n\n  const { prefixCls } = useDesign('address-list');\n  provide('prefixCls', prefixCls);\n\n  // 给子组件定义一个ref变量\n  const leftTree = ref();\n\n  // 当前选中的部门code\n  const orgCode = ref('');\n  const positionInfo = ref({});\n\n  // 列表页面公共参数、方法\n  const { tableContext } = useListPage({\n    tableProps: {\n      api: list,\n      columns,\n      // 代码逻辑说明: [VUEN-1485]进入系统管理--通讯录页面后，网页命令行报错------------\n      rowKey: 'id',\n      showIndexColumn: true,\n      formConfig: {\n        schemas: searchFormSchema,\n      },\n      canResize: false,\n      showTableSetting: false,\n      actionColumn:{\n        width: 80\n      },\n      // 请求之前对参数做处理\n      beforeFetch(params) {\n        params.orgCode = orgCode.value;\n      },\n    },\n  });\n  //注册table数据\n  const [registerTable, { reload }] = tableContext;\n\n  // 左侧树选择后触发\n  function onTreeSelect(data) {\n    orgCode.value = data.orgCode;\n    reload();\n  }\n\n  /**\n   * 操作栏\n   * \n   * @param record\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '发消息',\n        onClick: handleSendChat.bind(null, record),\n      },\n    ];\n  }\n  \n  // 查询职务信息\n  async function queryPositionInfo() {\n    const result = await positionList({ pageSize: 99999 });\n    if (result) {\n      let obj = {};\n      result.records.forEach((position) => {\n        obj[position['id']] = position['name'];\n      });\n      positionInfo.value = obj;\n    }\n  }\n  queryPositionInfo();\n  \n  /**\n   * 聊天\n   *\n   * @param record\n   */\n  function handleSendChat(record) {\n    //获取messageId\n    let cacheByDynKey = getCacheByDynKey(JEECG_CHAT_UID);\n    let iframes:any = document.getElementById(\"jChatOnline\");\n    let id = record.id;\n    //发送打开聊天窗口的请求\n    iframes.contentWindow.postMessage({\n      type: \"open-chat\",\n      messageId: cacheByDynKey,\n      data: { id: id, type: \"friend\", groupName: \"\", avatar: record.avatar, username: record.realname }\n    }, \"*\");\n  }\n</script>\n\n<style lang=\"less\">\n  @import './index.less';\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/appVersion/SysAppVersion.vue",
    "content": "<template>\n  <PageWrapper contentFullHeight>\n    <a-card :bordered=\"false\" title=\"版本管理\">\n      <!--编辑模式-->\n      <a-spin v-if=\"active\" :spinning=\"confirmLoading\">\n        <a-form ref=\"formRef\" :model=\"model\" :labelCol=\"labelCol\" :wrapperCol=\"wrapperCol\" :rules=\"validatorRules\">\n          <a-row>\n            <a-col :span=\"24\">\n              <a-form-item label=\"版本\" name=\"appVersion\">\n                <a-input v-model:value=\"model.appVersion\" placeholder=\"请输入版本\" />\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"APP安装apk\" name=\"downloadUrl\">\n                <a-input placeholder=\"设置APP安装apk\" v-model:value=\"model.downloadUrl\">\n                  <template #addonAfter>\n                    <Icon icon=\"ant-design:upload-outlined\" style=\"cursor: pointer\" @click=\"showUploadModal('apk')\" />\n                  </template>\n                </a-input>\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"APP热更新文件\" name=\"wgtUrl\">\n                <a-input placeholder=\"设置APP热更新文件\" v-model:value=\"model.wgtUrl\">\n                  <template #addonAfter>\n                    <Icon icon=\"ant-design:upload-outlined\" style=\"cursor: pointer\" @click=\"showUploadModal('wgt')\" />\n                  </template>\n                </a-input>\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"桌面应用\" name=\"webDownloadUrl\">\n                <a-input placeholder=\"桌面应用安装路径\" v-model:value=\"model.webDownloadUrl\">\n                  <template #addonAfter>\n                    <Icon icon=\"ant-design:upload-outlined\" style=\"cursor: pointer\" @click=\"showUploadModal('web')\" />\n                  </template>\n                </a-input>\n              </a-form-item>\n            </a-col>\n            <a-col :span=\"24\">\n              <a-form-item label=\"更新内容\">\n                <a-textarea :rows=\"4\" v-model:value=\"model.updateNote\" placeholder=\"请输入更新内容\" />\n              </a-form-item>\n            </a-col>\n          </a-row>\n        </a-form>\n        <JUploadModal :value=\"modalValue\" :bizPath=\"filePath\" :maxCount=\"1\" @register=\"registerModel\" @change=\"uploadBack\" />\n      </a-spin>\n      <!--详情模式-->\n      <Description v-else class=\"desc\" :column=\"1\" :data=\"model\" :schema=\"schema\" />\n      <!--底部按钮-->\n      <div class=\"anty-form-btn\" v-if=\"hasPermission('app:edit:version')\">\n        <a-button v-if=\"active\" @click=\"handleSubmit\" type=\"primary\" preIcon=\"ant-design:save-outlined\">保存</a-button>\n        <a-button v-else @click=\"active = true\" type=\"primary\" preIcon=\"ant-design:edit-outlined\">开启编辑模式</a-button>\n      </div>\n    </a-card>\n  </PageWrapper>\n</template>\n\n<script lang=\"ts\" setup name=\"portalapp-sysAppVersion\">\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { usePermission } from '@/hooks/web/usePermission';\n  import { JUploadModal } from '@/components/Form/src/jeecg/components/JUpload';\n  import { useModal } from '@/components/Modal';\n  import { reactive, ref, toRaw, unref, onMounted } from 'vue';\n  import { PageWrapper } from '@/components/Page';\n  import { queryAppVersion, saveAppVersion } from './appVersion.api';\n  import { Description, DescItem } from '/@/components/Description/index';\n\n  const { hasPermission } = usePermission();\n  const { createMessage } = useMessage();\n\n  const [registerModel, { openModal }] = useModal();\n  const confirmLoading = ref(false);\n  const active = ref(false);\n  const formRef = ref<any>(null);\n  const appKey = 'E0CC280';\n  const filePath = 'appVersion';\n  const uploadType = ref('');\n  const modalValue = ref('');\n  const labelCol = {\n    xs: { span: 24 },\n    sm: { span: 5 },\n  };\n  const wrapperCol = {\n    xs: { span: 24 },\n    sm: { span: 16 },\n  };\n  const model = reactive({\n    id: 'E0CC280',\n    appVersion: '',\n    versionNum: 0,\n    updateNote: '',\n    downloadUrl: '',\n    wgtUrl: '',\n    webDownloadUrl: '',\n  });\n\n  /**\n   * 初始化表单数据\n   * @param record\n   */\n  async function initFormData() {\n    const appVersion = await queryAppVersion({ key: appKey });\n    if (appVersion) {\n      Object.assign(model, appVersion);\n    }\n  }\n\n  /**\n   * 提交保存版本信息\n   */\n  function handleSubmit() {\n    const form = unref(formRef);\n    form.validate().then(async () => {\n      let obj = toRaw(model);\n      if (obj.appVersion.indexOf('.') != -1) {\n        obj.versionNum = Number(obj.appVersion.replace(/\\./g, ''));\n      }\n      obj.id = appKey;\n      confirmLoading.value = true;\n      await saveAppVersion(obj);\n      createMessage.success('保存成功');\n      confirmLoading.value = false;\n      active.value = false;\n    }).finally(() => {\n      confirmLoading.value = false;\n    });\n  }\n\n  /**\n   * 显示设置弹窗\n   * @param type\n   */\n  function showUploadModal(type) {\n    uploadType.value = type;\n    modalValue.value = type == 'web'? model.webDownloadUrl :type == 'apk' ? model.downloadUrl : model.wgtUrl;\n    openModal(true, {\n      maxCount: 1,\n      bizPath: filePath,\n    });\n  }\n\n  /**\n   *上传返回\n   */\n  function uploadBack(value) {\n    if (unref(uploadType) == 'apk') {\n      model.downloadUrl = value;\n    } else if (unref(uploadType) == 'wgt') {\n      model.wgtUrl = value;\n    }else{\n      model.webDownloadUrl = value;\n    }\n  }\n  //表单校验规则\n  const validatorRules = {\n    appVersion: [{ required: true, message: '版本不能为空', trigger: 'blur' }],\n    downloadUrl: [{ required: true, message: 'APP安装apk不能为空', trigger: 'change' }],\n    wgtUrl: [{ required: false, message: 'APP热更新文件不能为空', trigger: 'change' }],\n  };\n  // 显示字段\n  const schema: DescItem[] = [\n    {\n      field: 'appVersion',\n      label: '版本',\n    },\n    {\n      field: 'downloadUrl',\n      label: 'APP安装apk',\n    },\n    {\n      field: 'wgtUrl',\n      label: 'APP热更新文件',\n    },\n    {\n      field: 'webDownloadUrl',\n      label: '桌面应用下载地址',\n    },\n    {\n      field: 'updateNote',\n      label: '更新内容',\n    },\n  ];\n\n  onMounted(() => {\n    initFormData();\n  });\n</script>\n\n<style scoped>\n  .anty-form-btn {\n    width: 100%;\n    text-align: center;\n  }\n  .anty-form-btn button {\n    margin: 20px;\n  }\n  .approveDiv span {\n    margin: 0 20px;\n  }\n  .desc {\n    width: 80%;\n    margin: 0 auto;\n  }\n\n  :deep(.ant-descriptions-item-label) {\n    width: 30% !important;\n    min-width: 150px !important;\n  }\n  :deep(.ant-descriptions-item-content) {\n    padding: 16px !important;\n    width: 60% !important;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/appVersion/appVersion.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\n\nenum Api {\n  //查询app版本\n  queryAppVersion = '/sys/version/app3version',\n  //保存app版本\n  saveAppVersion = '/sys/version/saveVersion',\n}\n/**\n * 查询APP版本\n * @param params\n */\nexport const queryAppVersion = (params) => defHttp.get({ url: Api.queryAppVersion, params });\n/**\n * 保存APP版本\n * @param params\n */\nexport const saveAppVersion = (params) => {\n  return defHttp.post({ url: Api.saveAppVersion, params });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/appconfig/ThirdApp.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\n\nenum Api {\n  //第三方登录配置\n  addThirdAppConfig = '/sys/thirdApp/addThirdAppConfig',\n  editThirdAppConfig = '/sys/thirdApp/editThirdAppConfig',\n  getThirdConfigByTenantId = '/sys/thirdApp/getThirdConfigByTenantId',\n  syncDingTalkDepartUserToLocal = '/sys/thirdApp/sync/dingtalk/departAndUser/toLocal',\n  getThirdUserByWechat = '/sys/thirdApp/getThirdUserByWechat',\n  wechatEnterpriseToLocal = '/sys/thirdApp/sync/wechatEnterprise/departAndUser/toLocal',\n  getThirdUserBindByWechat = '/sys/thirdApp/getThirdUserBindByWechat',\n  deleteThirdAccount = '/sys/thirdApp/deleteThirdAccount',\n  deleteThirdAppConfig = '/sys/thirdApp/deleteThirdAppConfig',\n}\n\n/**\n * 第三方配置保存或者更新\n */\nexport const saveOrUpdateThirdConfig = (params, isUpdate) => {\n  let url = isUpdate ? Api.editThirdAppConfig : Api.addThirdAppConfig;\n  return defHttp.post({ url: url, params }, { joinParamsToUrl: true });\n};\n\n/**\n * 获取第三方配置\n * @param params\n */\nexport const getThirdConfigByTenantId = (params) => {\n  return defHttp.get({ url: Api.getThirdConfigByTenantId, params });\n};\n\n/**\n * 同步钉钉部门用户到本地\n * @param params\n */\nexport const syncDingTalkDepartUserToLocal = () => {\n  return defHttp.get({ url: Api.syncDingTalkDepartUserToLocal, timeout: 60000 }, { isTransformResponse: false });\n};\n\n/**\n * 获取企业微信绑定的用户信息\n * @param params\n */\nexport const getThirdUserByWechat = () => {\n  return defHttp.get({ url: Api.getThirdUserByWechat }, { isTransformResponse: false });\n};\n\n/**\n * 同步企业微信用户部门到本地\n * @param params\n */\nexport const wechatEnterpriseToLocal = (params) => {\n  return defHttp.get({ url: Api.wechatEnterpriseToLocal, params }, { isTransformResponse: false });\n};\n\n/**\n * 获取绑定企业微信的用户\n * @param params\n */\nexport const getThirdUserBindByWechat = () => {\n  return defHttp.get({ url: Api.getThirdUserBindByWechat }, { isTransformResponse: false });\n};\n\n/**\n * 根据第三方账号表的id解绑账号\n * @param params\n */\nexport const deleteThirdAccount = (params) => {\n  return defHttp.delete({ url: Api.deleteThirdAccount, params }, { isTransformResponse:false, joinParamsToUrl: true });\n};\n\n/**\n * 根据配置表的id删除第三方配置\n * @param params\n * @param handleSuccess\n */\nexport const deleteThirdAppConfig = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.deleteThirdAppConfig, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/appconfig/ThirdApp.data.ts",
    "content": "//第三方app配置表单\nimport { FormSchema } from '/@/components/Form';\n\n//第三方app表单\nexport const thirdAppFormSchema: FormSchema[] = [\n  {\n    label: 'id',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: 'thirdType',\n    field: 'thirdType',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: 'CorpId',\n    field: 'corpId',\n    component: 'Input',\n    ifShow: ({ values }) => {\n      return values.thirdType === 'dingtalk';\n    },\n    required: true,\n  },\n  {\n    label: 'Agentld',\n    field: 'agentId',\n    component: 'Input',\n    required: true,\n  },\n  {\n    label: 'AppKey',\n    field: 'clientId',\n    component: 'Input',\n    required: true,\n  },\n  {\n    label: 'AppSecret',\n    field: 'clientSecret',\n    component: 'Input',\n    required: true,\n  },{\n    label: '启用',\n    field: 'status',\n    component: 'Switch',\n    componentProps:{\n      checkedChildren:'关闭',\n      checkedValue:1,\n      unCheckedChildren:'开启',\n      unCheckedValue: 0\n    },\n    defaultValue: 1\n  },{\n    label: '租户id',\n    field: 'tenantId',\n    component: 'Input',\n    show: false,\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/appconfig/ThirdAppBindWeEnterpriseModal.vue",
    "content": "<!--弹窗绑定企业微信页面-->\n<template>\n  <BasicModal @register=\"registerModal\" :width=\"800\" :title=\"title\" destroyOnClose>\n    <a-spin :spinning=\"loading\">\n      <div class=\"we-bind\">\n        <a-row :span=\"24\" class=\"we-title-background\">\n          <a-col :span=\"12\" class=\"border-right\">\n            <span>组织用户</span>\n          </a-col>\n          <a-col :span=\"12\" class=\"padding-left\">\n            <span>企业微信用户</span>\n          </a-col>\n        </a-row>\n        <a-row :span=\"24\">\n          <template v-for=\"(item, index) in bindData.jwUserDepartVos\">\n            <a-col :span=\"12\" class=\"border-right padding-left border-bottom\">\n              <div class=\"we-account\">\n                <a-avatar v-if=\"item.avatar\" :src=\"getFileAccessHttpUrl(item.avatar)\" :size=\"28\"></a-avatar>\n                <a-avatar v-else :size=\"28\">\n                  {{ item.realName.length > 2 ? item.realName.substr(0, 2) : item.realName }}\n                </a-avatar>\n                <a-input style=\"margin-left: 20px\" :value=\"item.realName\" readonly />\n              </div>\n            </a-col>\n            <a-col :span=\"12\" class=\"padding-left border-bottom\">\n              <div class=\"we-account\">\n                <span v-if=\"item.wechatUserId || izBind\" class=\"we-remove\"\n                  >{{ item.wechatRealName }} <span style=\"margin-right: 20px\" @click=\"handleRemoveClick(index, item)\">移出</span></span\n                >\n                <a-select\n                  v-else\n                  v-model:value=\"item.wechatUserId\"\n                  :options=\"userList\"\n                  :fieldNames=\"{ label: 'wechatRealName', value: 'wechatUserId' }\"\n                  style=\"width: 200px\"\n                  showSearch\n                  @select=\"(val, option) => handleSelect(val, option, index)\"\n                />\n              </div>\n            </a-col>\n          </template>\n        </a-row>\n      </div>\n    </a-spin>\n    <template #footer>\n      <a-button v-if=\"!izBind\" type=\"primary\" @click=\"handleSubmit\">同步</a-button>\n    </template>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, h, ref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { getThirdUserByWechat, wechatEnterpriseToLocal, getThirdUserBindByWechat, deleteThirdAccount } from './ThirdApp.api';\n  import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';\n  import { useMessage } from '@/hooks/web/useMessage';\n  import { Modal } from 'ant-design-vue';\n  import { useUserStore } from '@/store/modules/user';\n\n  export default defineComponent({\n    name: 'ThirdAppBindWeEnterpriseModal',\n    components: { BasicModal },\n    setup(props, { emit }) {\n      const title = ref<string>('企业微信绑定');\n      //企业微信的绑定数据\n      const bindData = ref<any>({});\n      const loading = ref<boolean>(false);\n      const btnLoading = ref<boolean>(false);\n      const { createMessage } = useMessage();\n      const userList = ref<any>([]);\n      //同步文本信息展示\n      const syncText = ref<string>('');\n      //是否已绑定数据，展示不同的列表\n      const izBind = ref<boolean>(false);\n      const userStore = useUserStore();\n      //表单赋值\n      const [registerModal, { closeModal }] = useModalInner(async (data) => {\n        loading.value = true;\n        console.log('izBind：：', izBind);\n        if (!data.izBind) {\n          await getUnboundData();\n        } else {\n          await getBoundData();\n        }\n        izBind.value = data.izBind;\n      });\n\n      /**\n       * 未绑定的数据\n       */\n      async function getUnboundData() {\n        await getThirdUserByWechat().then((res) => {\n          if (res.success) {\n            let userLists = res.result.userList;\n            bindData.value = res.result;\n            userList.value = res.result.userList;\n            /*   if (userLists && userLists.length > 0) {\n            syncText.value = \"\";\n          } else {\n            syncText.value = \"企业微信用户均已同步\";\n          }*/\n            loading.value = false;\n          } else {\n            createMessage.warning(res.message);\n            loading.value = false;\n          }\n        });\n      }\n\n      /**\n       * 已绑定的数据\n       */\n      async function getBoundData() {\n        await getThirdUserBindByWechat().then((res) => {\n          if (res.success) {\n            bindData.value.jwUserDepartVos = res.result;\n            loading.value = false;\n          } else {\n            createMessage.warn(res.message);\n            loading.value = false;\n          }\n        });\n      }\n\n      /**\n       * 第三方配置点击事件\n       */\n      async function handleSubmit() {\n        btnLoading.value = true;\n        let userList = bindData.value.userList;\n        //重新封装数据，只留用户id和企业微信id即可,还需要把没绑定的用户传给后台\n        let params: any = [];\n        //查询用户绑定的企业微信用户\n        for (const item of bindData.value.jwUserDepartVos) {\n          if (item.wechatUserId) {\n            userList = userList.filter((a) => a.wechatUserId != item.wechatUserId);\n            params.push({\n              wechatUserId: item.wechatUserId,\n              wechatDepartId: item.wechatDepartId,\n              wechatRealName: item.wechatRealName,\n              userId: item.userId,\n            });\n          }\n        }\n        let text: string = '';\n        //查询未被绑定的租户\n        if (userList && userList.length > 0) {\n          for (const item of userList) {\n            params.push({ wechatUserId: item.wechatUserId, wechatDepartId: item.wechatDepartId, wechatRealName: item.wechatRealName });\n          }\n          text = '检测到未绑定的企业微信用户 ' + userList.length + ' 位，平台将会为这 ' + userList.length + ' 位用户创建新的账号';\n        }\n\n        Modal.confirm({\n          title: '确认同步',\n          content: text,\n          okText: '确认',\n          onOk: () => {\n            let json = JSON.stringify(params);\n            console.log('json：：', json);\n            wechatEnterpriseToLocal({ jwUserDepartJson: json })\n              .then((res) => {\n                let options = {};\n                if (res.success) {\n                  if (res.result) {\n                    options = {\n                      width: 600,\n                      title: res.message,\n                      content: () => {\n                        let nodes;\n                        let successInfo = [`成功信息如下：`, renderTextarea(h, res.result.successInfo.map((v, i) => `${i + 1}. ${v}`).join('\\n'))];\n                        if (res.success) {\n                          nodes = [...successInfo, h('br'), `无失败信息！`];\n                        } else {\n                          nodes = [\n                            `失败信息如下：`,\n                            renderTextarea(h, res.result.failInfo.map((v, i) => `${i + 1}. ${v}`).join('\\n')),\n                            h('br'),\n                            ...successInfo,\n                          ];\n                        }\n                        return nodes;\n                      },\n                    };\n                  }\n                  closeModal();\n                  emit('success', options, res);\n                }\n              })\n              .finally(() => {\n                btnLoading.value = false;\n              });\n          },\n        });\n      }\n\n      /**\n       * 下拉框选择事件\n       */\n      function handleSelect(val, option, index) {\n        bindData.value.jwUserDepartVos[index].wechatUserId = option.wechatUserId;\n        bindData.value.jwUserDepartVos[index].wechatRealName = option.wechatRealName;\n        bindData.value.jwUserDepartVos[index].wechatDepartId = option.wechatDepartId;\n        userList.value = userList.value.filter((item) => item.wechatUserId != option.wechatUserId);\n      }\n\n      /**\n       * 移出事件\n       * @param index\n       * @param item\n       */\n      function handleRemoveClick(index, item) {\n        if (!izBind.value) {\n          userList.value.push({\n            wechatUserId: item.wechatUserId,\n            wechatRealName: item.wechatRealName,\n            wechatDepartId: item.wechatDepartId,\n          });\n          bindData.value.jwUserDepartVos[index].wechatUserId = '';\n          bindData.value.jwUserDepartVos[index].wechatRealName = '';\n          bindData.value.jwUserDepartVos[index].wechatDepartId = '';\n        } else {\n          Modal.confirm({\n            title: '确认取消绑定吗',\n            okText: '确认',\n            onOk: async () => {\n              await deleteThirdAccount({ id: item.thirdId, sysUserId: userStore.getUserInfo.id }).then((res) => {\n                if (res.success) {\n                  createMessage.success('取消绑定成功！');\n                  getBoundData();\n                } else {\n                  createMessage.warning(res.message);\n                }\n              });\n            },\n          });\n        }\n      }\n\n      function renderTextarea(h, value) {\n        return h(\n          'div',\n          {\n            id: 'box',\n            style: {\n              minHeight: '100px',\n              border: '1px solid #d9d9d9',\n              fontSize: '14px',\n              maxHeight: '250px',\n              whiteSpace: 'pre',\n              overflow: 'auto',\n              padding: '10px',\n            },\n          },\n          value\n        );\n      }\n\n      return {\n        title,\n        registerModal,\n        handleSubmit,\n        bindData,\n        getFileAccessHttpUrl,\n        loading,\n        userList,\n        handleSelect,\n        handleRemoveClick,\n        btnLoading,\n        izBind,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .we-bind {\n    overflow-y: auto;\n    border: 1px @border-color-base solid;\n    border-bottom: none;\n    .we-title-background {\n      background: @component-background;\n      height: 40px;\n      line-height: 40px;\n      padding: 0 10px;\n    }\n    .we-account {\n      display: flex;\n      height: 40px;\n      line-height: 40px;\n      align-items: center;\n    }\n\n    :deep(.ant-input) {\n      border: none;\n      padding: 0;\n      box-shadow: none;\n    }\n\n    .we-remove {\n      display: flex;\n      justify-content: space-between;\n      width: 100%;\n      cursor: pointer;\n    }\n    .border-right {\n      border-right: 1px @border-color-base solid;\n    }\n    .border-bottom {\n      border-bottom: 1px @border-color-base solid;\n    }\n    .padding-left {\n      padding-left: 10px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/appconfig/ThirdAppConfigList.vue",
    "content": "<template>\n  <div class=\"ding-ding-container\" :class=\"[`${prefixCls}`]\">\n    <div class=\"ding-header\">\n      <ul class=\"ding-menu-tab\">\n        <li :class=\"activeKey === 'ding' ? 'active' : ''\" @click=\"dingLiClick('ding')\"><a>钉钉集成</a></li>\n        <li :class=\"activeKey === 'wechat' ? 'active' : ''\" @click=\"dingLiClick('wechat')\"><a>企业微信集成</a></li>\n      </ul>\n    </div>\n    <div v-show=\"activeKey === 'ding'\" class=\"base-collapse\">\n      <ThirdAppDingTalkConfigForm />\n    </div>\n    <div v-show=\"activeKey === 'wechat'\" class=\"base-collapse\">\n      <ThirdAppWeEnterpriseConfigForm />\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import ThirdAppDingTalkConfigForm from './ThirdAppDingTalkConfigForm.vue';\n  import ThirdAppWeEnterpriseConfigForm from './ThirdAppWeEnterpriseConfigForm.vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  export default defineComponent({\n    name: 'ThirdAppConfigList',\n    components: {\n      ThirdAppDingTalkConfigForm,\n      ThirdAppWeEnterpriseConfigForm,\n    },\n    setup() {\n      const { prefixCls } = useDesign('j-dd-container');\n\n      //选中的key\n      const activeKey = ref<string>('ding');\n\n      /**\n       * tab点击事件\n       * @param key\n       */\n      function dingLiClick(key) {\n        activeKey.value = key;\n      }\n\n      return {\n        activeKey,\n        dingLiClick,\n        prefixCls,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .ding-ding-container {\n    border-radius: 4px;\n    height: calc(100% - 80px);\n    margin: 16px;\n  }\n  .ding-header {\n    align-items: center;\n    /*begin 兼容暗夜模式*/\n    border-bottom: 1px solid @border-color-base;\n    /*end 兼容暗夜模式*/\n    box-sizing: border-box;\n    display: flex;\n    height: 50px;\n    justify-content: space-between;\n    padding: 0 24px;\n\n    ul {\n      margin-bottom: 0;\n    }\n  }\n  .ding-menu-tab {\n    display: flex;\n    height: 100%;\n\n    li {\n      align-items: center;\n      border-bottom: 2px solid transparent;\n      display: flex;\n      height: 100%;\n      margin-right: 38px;\n\n      a {\n        /*begin 兼容暗夜模式*/\n        color: @text-color !important;\n        /*end 兼容暗夜模式*/\n        font-size: 15px;\n        font-weight: 700;\n      }\n    }\n  }\n  .active {\n    border-bottom-color: #2196f3 !important;\n\n    a {\n      color: #333 !important;\n    }\n  }\n  .empty-image{\n    align-items: center;\n    display: flex;\n    flex-direction: column;\n    height: calc(100% - 50px);\n    justify-content: center;\n    width: 100%;\n  }\n</style>\n\n<style lang=\"less\">\n  /* update-begin-author:liusq date:20230625 for: [issues/563]暗色主题部分失效*/\n  @prefix-cls: ~'@{namespace}-j-dd-container';\n  /*begin 兼容暗夜模式*/\n  .@{prefix-cls} {\n    background: @component-background;\n\n    .ding-header {\n      border-bottom: 1px solid @border-color-base;\n    }\n\n    .ding-menu-tab {\n      li {\n        a {\n          color: @text-color !important;\n        }\n      }\n    }\n\n    .ant-collapse-borderless {\n      background-color: @component-background;\n    }\n\n    .ant-collapse{\n      background-color: @component-background;\n    }\n  }\n  /*end 兼容暗夜模式*/\n/* update-end-author:liusq date:20230625 for: [issues/563]暗色主题部分失效*/\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/appconfig/ThirdAppConfigModal.vue",
    "content": "<template>\n  <BasicModal @register=\"registerModal\" :width=\"800\" :title=\"title\" @ok=\"handleSubmit\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { useForm, BasicForm } from '/@/components/Form';\n  import { thirdAppFormSchema } from './ThirdApp.data';\n  import { getThirdConfigByTenantId, saveOrUpdateThirdConfig } from './ThirdApp.api';\n  export default defineComponent({\n    name: 'ThirdAppConfigModal',\n    components: { BasicModal, BasicForm },\n    setup(props, { emit }) {\n      const title = ref<string>('钉钉配置');\n      //表单配置\n      const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n        schemas: thirdAppFormSchema,\n        showActionButtonGroup: false,\n        labelCol: { span: 24 },\n        wrapperCol: { span: 24 },\n      });\n      //表单赋值\n      const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n        setModalProps({ confirmLoading: true });\n        if (data.thirdType == 'dingtalk') {\n          title.value = '钉钉配置';\n        } else {\n          title.value = '企业微信配置';\n        }\n        //重置表单\n        await resetFields();\n        let values = await getThirdConfigByTenantId({ tenantId: data.tenantId, thirdType: data.thirdType });\n        setModalProps({ confirmLoading: false });\n        //表单赋值\n        if (values) {\n          await setFieldsValue(values);\n        } else {\n          await setFieldsValue(data);\n        }\n      });\n\n      /**\n       * 第三方配置点击事件\n       */\n      async function handleSubmit() {\n        let values = await validate();\n        let isUpdate = false;\n        if (values.id) {\n          isUpdate = true;\n        }\n        await saveOrUpdateThirdConfig(values, isUpdate);\n        emit('success');\n        closeModal();\n      }\n\n      return {\n        title,\n        registerForm,\n        registerModal,\n        handleSubmit,\n      };\n    },\n  });\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/appconfig/ThirdAppDingTalkConfigForm.vue",
    "content": "<template>\n  <div class=\"base-collapse\">\n    <div class=\"header\"> 钉钉集成 </div>\n    <a-collapse expand-icon-position=\"right\" :bordered=\"false\">\n      <a-collapse-panel key=\"1\">\n        <template #header>\n          <div style=\"font-size: 16px\"> 1.获取对接信息</div>\n        </template>\n        <div class=\"base-desc\">从钉钉开放平台获取对接信息，即可开始集成以及同步通讯录</div>\n        <div style=\"margin-top: 5px\">\n          <a href='https://help.qiaoqiaoyun.com/expand/dingding.html' target='_blank'>如何获取对接信息?</a>\n        </div>\n      </a-collapse-panel>\n    </a-collapse>\n    <div class=\"sync-padding\">\n      <a-collapse expand-icon-position=\"right\" :bordered=\"false\">\n        <a-collapse-panel key=\"2\">\n          <template #header>\n            <div style=\"width: 100%; justify-content: space-between; display: flex\">\n              <div style=\"font-size: 16px\"> 2.对接信息录入及解绑</div>\n            </div>\n          </template>\n          <div class=\"base-desc\">完成步骤1后，填入Agentld、 AppKey、AppSecret后 可对接应用与同步通讯录</div>\n          <div class=\"flex-flow\">\n            <div class=\"base-title\">CorpId</div>\n            <div class=\"base-message\">\n              <a-input-password v-model:value=\"appConfigData.corpId\" readonly />\n            </div>\n          </div>\n          <div class=\"flex-flow\">\n            <div class=\"base-title\">Agentld</div>\n            <div class=\"base-message\">\n              <a-input-password v-model:value=\"appConfigData.agentId\" readonly />\n            </div>\n          </div>\n          <div class=\"flex-flow\">\n            <div class=\"base-title\">AppKey</div>\n            <div class=\"base-message\">\n              <a-input-password v-model:value=\"appConfigData.clientId\" readonly />\n            </div>\n          </div>\n          <div class=\"flex-flow\">\n            <div class=\"base-title\">AppSecret</div>\n            <div class=\"base-message\">\n              <a-input-password v-model:value=\"appConfigData.clientSecret\" readonly />\n            </div>\n          </div>\n          <div style=\"margin-top: 20px; width: 100%; text-align: right\">\n            <a-button @click=\"dingEditClick\">编辑</a-button>\n            <a-button v-if=\"appConfigData.id\" @click=\"cancelBindClick\" danger style=\"margin-left: 10px\">取消绑定</a-button>\n          </div>\n        </a-collapse-panel>\n      </a-collapse>\n      <div class=\"sync-padding\">\n        <div style=\"font-size: 16px; width: 100%\"> 3.数据同步</div>\n        <div style=\"margin-top: 20px\" class=\"base-desc\">\n          从钉钉同步到本地\n          <ul style='list-style-type: disc;margin-left: 20px;'>\n            <li>同步部门到本地</li>\n            <li>\n              同步部门下的用户到本地\n              <a-tooltip title='同步用户与部门文档'>\n                <a-icon @click='handleIconClick' type=\"question-circle\" class=\"sync-text\"/>\n              </a-tooltip>\n            </li>\n          </ul>\n          <div style=\"float: right\">\n            <a-button :loading=\"btnLoading\" @click=\"syncDingTalk\">{{ !btnLoading ? '同步' : '同步中' }}</a-button>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <ThirdAppConfigModal @register=\"registerAppConfigModal\" @success=\"handleSuccess\" />\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, h, inject, onMounted, reactive, ref, watch } from 'vue';\n  import { getThirdConfigByTenantId, syncDingTalkDepartUserToLocal, deleteThirdAppConfig } from './ThirdApp.api';\n  import { useModal } from '/@/components/Modal';\n  import ThirdAppConfigModal from './ThirdAppConfigModal.vue';\n  import { Modal } from 'ant-design-vue';\n  import { getTenantId } from '/@/utils/auth';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  export default defineComponent({\n    name: 'OrganDingConfigForm',\n    components: {\n      ThirdAppConfigModal,\n    },\n    setup() {\n      const { createMessage } = useMessage();\n      //折叠面板选中key\n      const collapseActiveKey = ref<string>('');\n      //按钮加载事件\n      const btnLoading = ref<boolean>(false);\n      //第三方配置数据\n      const appConfigData = ref<any>({\n        agentId: undefined,\n        clientId: '',\n        clientSecret: '',\n      });\n\n      //企业微信钉钉配置modal\n      const [registerAppConfigModal, { openModal }] = useModal();\n\n      /**\n       * 钉钉编辑\n       */\n      async function dingEditClick() {\n        let tenantId = getTenantId();\n        openModal(true, {\n          tenantId: tenantId,\n          thirdType: 'dingtalk',\n        });\n      }\n\n      /**\n       * 初始化第三方数据\n       */\n      async function initThirdAppConfigData(params) {\n        let values = await getThirdConfigByTenantId(params);\n        if (values) {\n          appConfigData.value = values;\n        } else {\n          appConfigData.value = \"\";\n        }\n      }\n\n      /**\n       * 成功回调\n       */\n      function handleSuccess() {\n        let tenantId = getTenantId();\n        initThirdAppConfigData({ tenantId: tenantId, thirdType: 'dingtalk' });\n      }\n\n      /**\n       * 同步钉钉\n       */\n      async function syncDingTalk() {\n        btnLoading.value = true;\n        await syncDingTalkDepartUserToLocal()\n          .then((res) => {\n            let options = {};\n            if (res.result) {\n              options = {\n                width: 600,\n                title: res.message,\n                content: () => {\n                  let nodes;\n                  let successInfo = [`成功信息如下：`, renderTextarea(h, res.result.successInfo.map((v, i) => `${i + 1}. ${v}`).join('\\n'))];\n                  if (res.success) {\n                    nodes = [...successInfo, h('br'), `无失败信息！`];\n                  } else {\n                    nodes = [\n                      `失败信息如下：`,\n                      renderTextarea(h, res.result.failInfo.map((v, i) => `${i + 1}. ${v}`).join('\\n')),\n                      h('br'),\n                      ...successInfo,\n                    ];\n                  }\n                  return nodes;\n                },\n              };\n            }\n            if (res.success) {\n              if (options != null) {\n                Modal.success(options);\n              } else {\n                createMessage.warning(res.message);\n              }\n            } else {\n              if (options && options.title) {\n                Modal.warning(options)\n              } else {\n                createMessage.warning({\n                  content: res.message || \"同步失败，请检查对接信息录入中是否填写正确，并确认是否已开启钉钉配置！\",\n                  duration: 5\n                });\n              }\n            }\n          })\n          .finally(() => {\n            btnLoading.value = false;\n          });\n      }\n\n      /**\n       * 渲染文本\n       * @param h\n       * @param value\n       */\n      function renderTextarea(h, value) {\n        return h(\n          'div',\n          {\n            id: 'box',\n            style: {\n              minHeight: '100px',\n              border: '1px solid #d9d9d9',\n              fontSize: '14px',\n              maxHeight: '250px',\n              whiteSpace: 'pre',\n              overflow: 'auto',\n              padding: '10px',\n            },\n          },\n          value\n        );\n      }\n\n      /**\n       * 钉钉同步文档\n       */\n      function handleIconClick(){\n        window.open(\"https://help.qiaoqiaoyun.com/expand/dingdingsyn.html\",\"_target\")\n      }\n\n      /**\n       * 取消绑定\n       */\n      function cancelBindClick() {\n        if(!appConfigData.value.id){\n          createMessage.warning(\"请先绑定钉钉应用！\");\n          return;\n        }\n        Modal.confirm({\n          title: '取消绑定',\n          content: '是否要解除当前组织的钉钉应用配置绑定？',\n          okText: '确认',\n          cancelText: '取消',\n          onOk: () => {\n            deleteThirdAppConfig({ id: appConfigData.value.id }, handleSuccess);\n          },\n        });\n      }\n      \n      onMounted(() => {\n        let tenantId = getTenantId();\n        initThirdAppConfigData({ tenantId: tenantId, thirdType: 'dingtalk' });\n      });\n\n      return {\n        appConfigData,\n        collapseActiveKey,\n        registerAppConfigModal,\n        dingEditClick,\n        handleSuccess,\n        syncDingTalk,\n        btnLoading,\n        handleIconClick,\n        cancelBindClick,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .header {\n    align-items: center;\n    box-sizing: border-box;\n    display: flex;\n    height: 50px;\n    justify-content: space-between;\n    font-weight: 700;\n    font-size: 18px;\n    color: @text-color;\n  }\n\n  .flex-flow {\n    display: flex;\n    min-height: 0;\n  }\n\n  .sync-padding {\n    padding: 12px 0 16px;\n    color: @text-color;\n  }\n\n  .base-collapse {\n    margin-top: 20px;\n    padding: 0 24px;\n    font-size: 20px;\n\n    .base-desc {\n      font-size: 14px;\n    }\n\n    .base-title {\n      width: 100px;\n      text-align: left;\n      height: 50px;\n      line-height: 50px;\n    }\n\n    .base-message {\n      width: 100%;\n      height: 50px;\n      line-height: 50px;\n    }\n\n    :deep(.ant-collapse-header) {\n      padding: 12px 0 16px;\n    }\n\n    :deep(.ant-collapse-content-box) {\n      padding-left: 0;\n    }\n  }\n  /*begin 兼容暗夜模式*/\n  //暗黑模式下卡片的边框设置成none\n  [data-theme='dark'] .base-collapse .ant-collapse{\n    border: none !important;\n  }\n  /*end 兼容暗夜模式*/\n  /*文档按钮问号样式*/\n  .sync-text{\n    margin-left: 2px;\n    cursor: pointer;\n    position: relative;\n    top: 2px\n  }\n :deep(.ant-collapse-borderless >.ant-collapse-item:last-child) {border-bottom-width:1px;}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/appconfig/ThirdAppWeEnterpriseConfigForm.vue",
    "content": "<template>\n  <div class=\"base-collapse\">\n    <div class=\"header\"> 企业微信集成 </div>\n    <a-collapse expand-icon-position=\"right\" :bordered=\"false\">\n      <a-collapse-panel key=\"1\">\n        <template #header>\n          <div style=\"font-size: 16px\"> 1.获取对接信息</div>\n        </template>\n        <div class=\"base-desc\">从企业微信平台获取对接信息，即可开始集成以及同步通讯录</div>\n        <div style=\"margin-top: 5px\">\n          <a href=\"https://help.qiaoqiaoyun.com/expand/dingding.html\" target=\"_blank\">如何获取对接信息?</a>\n        </div>\n      </a-collapse-panel>\n    </a-collapse>\n    <div>\n      <a-collapse expand-icon-position=\"right\" :bordered=\"false\">\n        <a-collapse-panel key=\"2\">\n          <template #header>\n            <div style=\"width: 100%; justify-content: space-between; display: flex\">\n              <div style=\"font-size: 16px\"> 2.对接信息录入及解绑</div>\n            </div>\n          </template>\n          <div class=\"flex-flow\">\n            <div class=\"base-title\">Agentld</div>\n            <div class=\"base-message\">\n              <a-input-password v-model:value=\"appConfigData.agentId\" readonly />\n            </div>\n          </div>\n          <div class=\"flex-flow\">\n            <div class=\"base-title\">AppKey</div>\n            <div class=\"base-message\">\n              <a-input-password v-model:value=\"appConfigData.clientId\" readonly />\n            </div>\n          </div>\n          <div class=\"flex-flow\">\n            <div class=\"base-title\">AppSecret</div>\n            <div class=\"base-message\">\n              <a-input-password v-model:value=\"appConfigData.clientSecret\" readonly />\n            </div>\n          </div>\n          <div style=\"margin-top: 20px; width: 100%; text-align: right\">\n            <a-button @click=\"weEnterpriseEditClick\">编辑</a-button>\n            <a-button v-if=\"appConfigData.id\" @click=\"cancelBindClick\" danger style=\"margin-left: 10px\">取消绑定</a-button>\n          </div>\n        </a-collapse-panel>\n      </a-collapse>\n      <div class=\"sync-padding\">\n        <div style=\"font-size: 16px; width: 100%\"> 3.数据同步</div>\n        <div style=\"margin-top: 20px\" class=\"base-desc\">\n          从企业微信同步到敲敲云\n          <a style=\"margin-left: 10px\" @click=\"seeBindWeChat\">查看已绑定的企业微信用户</a>\n          <div style=\"float: right\">\n            <a-button @loading=\"btnLoading\" @click=\"thirdUserByWechat\">同步</a-button>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <ThirdAppConfigModal @register=\"registerAppConfigModal\" @success=\"handleSuccess\" />\n  <ThirdAppBindWeEnterpriseModal @register=\"registerBindAppConfigModal\" @success=\"handleBindSuccess\" />\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, onMounted, ref } from 'vue';\n  import { getThirdConfigByTenantId, deleteThirdAppConfig } from './ThirdApp.api';\n  import ThirdAppConfigModal from './ThirdAppConfigModal.vue';\n  import { useModal } from '/@/components/Modal';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { getTenantId } from '@/utils/auth';\n  import ThirdAppBindWeEnterpriseModal from './ThirdAppBindWeEnterpriseModal.vue';\n  import { Modal } from \"ant-design-vue\";\n\n  export default defineComponent({\n    name: 'ThirdAppWeEnterpriseConfigForm',\n    components: {\n      ThirdAppConfigModal,\n      ThirdAppBindWeEnterpriseModal,\n    },\n    setup() {\n      const btnLoading = ref<boolean>(false);\n      //第三方配置数据\n      const appConfigData = ref<any>({\n        agentId: '',\n        clientId: '',\n        clientSecret: '',\n      });\n      //企业微信钉钉配置modal\n      const [registerAppConfigModal, { openModal }] = useModal();\n      const [registerBindAppConfigModal, { openModal: openBindModal }] = useModal();\n      const { createMessage } = useMessage();\n\n      /**\n       * 初始化数据\n       *\n       * @param params\n       */\n      async function initThirdAppConfigData(params) {\n        let values = await getThirdConfigByTenantId(params);\n        if (values) {\n          appConfigData.value = values;\n        } else {\n          appConfigData.value = \"\";\n        }\n      }\n\n      /**\n       * 企业微信编辑\n       */\n      async function weEnterpriseEditClick() {\n        let tenantId = getTenantId();\n        openModal(true, {\n          tenantId: tenantId,\n          thirdType: 'wechat_enterprise',\n        });\n      }\n\n      /**\n       * 获取企业微信绑定的用户\n       */\n      async function thirdUserByWechat() {\n        openBindModal(true, { izBind: false });\n      }\n\n      /**\n       * 成功回调\n       */\n      function handleSuccess() {\n        let tenantId = getTenantId();\n        initThirdAppConfigData({ tenantId: tenantId, thirdType: 'wechat_enterprise' });\n      }\n\n      /**\n       * 绑定成功返回值\n       *\n       * @param options\n       * @param item\n       */\n      function handleBindSuccess(options, item) {\n        console.log(\"options:::\",options)\n        console.log(\"item:::\",item)\n        if (item.success) {\n          if (options != null) {\n            Modal.success(options);\n          } else {\n            createMessage.warning(item.message);\n          }\n        } else {\n          if (options && options.title) {\n            Modal.warning(options);\n          } else {\n            createMessage.warning({\n              content: '同步失败，请检查对接信息录入中是否填写正确，并确认是否已开启企业微信配置！',\n              duration: 5,\n            });\n          }\n        }\n      }\n      \n      /**\n       * 查看已绑定的企业微信\n       */\n      function seeBindWeChat() {\n        openBindModal(true,{ izBind: true })\n      }\n\n      /**\n       * 取消绑定\n       */\n      function cancelBindClick() {\n        if(!appConfigData.value.id){\n          createMessage.warning(\"请先绑定企业微信应用！\");\n          return;\n        }\n        Modal.confirm({\n          title: '取消绑定',\n          content: '是否要解除当前组织的企业微信应用配置绑定？',\n          okText: '确认',\n          cancelText: '取消',\n          onOk: () => {\n            deleteThirdAppConfig({ id: appConfigData.value.id }, handleSuccess);\n          },\n        });\n      }\n      \n      onMounted(() => {\n        let tenantId = getTenantId();\n        initThirdAppConfigData({ tenantId: tenantId, thirdType: 'wechat_enterprise' });\n      });\n\n      return {\n        appConfigData,\n        weEnterpriseEditClick,\n        registerAppConfigModal,\n        registerBindAppConfigModal,\n        handleSuccess,\n        btnLoading,\n        thirdUserByWechat,\n        handleBindSuccess,\n        seeBindWeChat,\n        cancelBindClick,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .header {\n    align-items: center;\n    box-sizing: border-box;\n    display: flex;\n    height: 50px;\n    justify-content: space-between;\n    font-weight: 700;\n    font-size: 18px;\n    color: @text-color;\n  }\n\n  .flex-flow {\n    display: flex;\n    min-height: 0;\n  }\n\n  .sync-padding {\n    padding: 12px 0 16px;\n    color: @text-color;\n  }\n\n  .base-collapse {\n    margin-top: 20px;\n    padding: 0 24px;\n    font-size: 20px;\n\n    .base-desc {\n      font-size: 14px;\n      color: @text-color;\n    }\n\n    .base-title {\n      width: 100px;\n      text-align: left;\n      height: 50px;\n      line-height: 50px;\n    }\n\n    .base-message {\n      width: 100%;\n      height: 50px;\n      line-height: 50px;\n    }\n\n    :deep(.ant-collapse-header) {\n      padding: 12px 0 16px;\n    }\n\n    :deep(.ant-collapse-content-box) {\n      padding-left: 0;\n    }\n  }\n  /*begin 兼容暗夜模式*/\n  //暗黑模式下卡片的边框设置成none\n  [data-theme='dark'] .base-collapse .ant-collapse {\n    border: none !important;\n  }\n  /*end 兼容暗夜模式*/\n  /*文档按钮问号样式*/\n  .sync-text {\n    margin-left: 2px;\n    cursor: pointer;\n    position: relative;\n    top: 2px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/category/category.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { Modal } from 'ant-design-vue';\n\nenum Api {\n  list = '/sys/category/rootList',\n  save = '/sys/category/add',\n  edit = '/sys/category/edit',\n  deleteCategory = '/sys/category/delete',\n  deleteBatch = '/sys/category/deleteBatch',\n  importExcel = '/sys/category/importExcel',\n  exportXls = '/sys/category/exportXls',\n  loadTreeData = '/sys/category/loadTreeRoot',\n  getChildList = '/sys/category/childList',\n  getChildListBatch = '/sys/category/getChildListBatch',\n}\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n/**\n * 导入api\n * @param params\n */\nexport const getImportUrl = Api.importExcel;\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) => defHttp.get({ url: Api.list, params });\n/**\n * 删除\n */\nexport const deleteCategory = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.deleteCategory, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 批量删除\n * @param params\n */\nexport const batchDeleteCategory = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n/**\n * 保存或者更新\n * @param params\n */\nexport const saveOrUpdateDict = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({ url: url, params });\n};\n/**\n * 查询全部树形节点数据\n * @param params\n */\nexport const loadTreeData = (params) => defHttp.get({ url: Api.loadTreeData, params });\n/**\n * 查询子节点数据\n * @param params\n */\nexport const getChildList = (params) => defHttp.get({ url: Api.getChildList, params });\n/**\n * 批量查询子节点数据\n * @param params\n */\nexport const getChildListBatch = (params) => defHttp.get({ url: Api.getChildListBatch, params }, { isTransformResponse: false });\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/category/category.data.ts",
    "content": "import { BasicColumn } from '/@/components/Table';\nimport { FormSchema } from '/@/components/Table';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '分类名称',\n    dataIndex: 'name',\n    width: 350,\n    align: 'left',\n  },\n  {\n    title: '分类编码',\n    dataIndex: 'code',\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    label: '名称',\n    field: 'name',\n    component: 'JInput',\n    colProps: { span: 6 },\n  },\n  {\n    label: '编码',\n    field: 'code',\n    component: 'JInput',\n    colProps: { span: 6 },\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    label: '',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '父级节点',\n    field: 'pid',\n    component: 'TreeSelect',\n    componentProps: {\n      // 代码逻辑说明: replaceFields已过期，使用fieldNames代替------------\n      fieldNames: {\n        value: 'key',\n      },\n      dropdownStyle: {\n        maxHeight: '50vh',\n      },\n      getPopupContainer: () => document.body,\n    },\n    show: ({ values }) => {\n      return values.pid !== '0';\n    },\n    dynamicDisabled: ({ values }) => {\n      return !!values.id;\n    },\n  },\n  {\n    label: '分类名称',\n    field: 'name',\n    required: true,\n    component: 'Input',\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/category/components/CategoryModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" destroyOnClose width=\"550px\" :title=\"getTitle\" @ok=\"handleSubmit\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/src/components/Modal';\n  import { BasicForm, useForm } from '/src/components/Form';\n  import { formSchema } from '../category.data';\n  import { loadTreeData, saveOrUpdateDict } from '../category.api';\n  // 获取emit\n  const emit = defineEmits(['register', 'success']);\n  const isUpdate = ref(true);\n  const expandedRowKeys = ref([]);\n  const treeData = ref([]);\n  const isSubAdd = ref(false);\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate, updateSchema }] = useForm({\n    schemas: formSchema,\n    showActionButtonGroup: false,\n    labelCol: {\n      xs: { span: 24 },\n      sm: { span: 4 },\n    },\n    wrapperCol: {\n      xs: { span: 24 },\n      sm: { span: 18 },\n    },\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    expandedRowKeys.value = [];\n    setModalProps({ confirmLoading: false, minHeight: 80 });\n    isUpdate.value = !!data?.isUpdate;\n    // 代码逻辑说明: 分类字典data.record为空报错------------\n    isSubAdd.value = !data?.isUpdate && data.record && data.record.id;\n    if (data?.record) {\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n    }\n    //父级节点树信息\n    treeData.value = await loadTreeData({ async: false, pcode: '' });\n    updateSchema({\n      field: 'pid',\n      componentProps: { treeData },\n    });\n  });\n  //设置标题\n  const getTitle = computed(() => (!unref(isUpdate) ? '新增字典' : '编辑字典'));\n\n  /**\n   * 根据pid获取展开的节点\n   * @param pid\n   * @param arr\n   */\n  function getExpandKeysByPid(pid, arr) {\n    if (pid && arr && arr.length > 0) {\n      for (let i = 0; i < arr.length; i++) {\n        if (arr[i].key == pid && unref(expandedRowKeys).indexOf(pid) < 0) {\n          //需要获取同一级的key\n          getSameLevelExpandKeysByPid(arr[i]);\n          expandedRowKeys.value.push(arr[i].key);\n          getExpandKeysByPid(arr[i]['parentId'], unref(treeData));\n        } else {\n          getExpandKeysByPid(pid, arr[i].children);\n        }\n      }\n    }\n  }\n  //表单提交事件\n  async function handleSubmit() {\n    try {\n      let values = await validate();\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      await saveOrUpdateDict(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //展开的节点信息\n      await getExpandKeysByPid(values['pid'], unref(treeData));\n      //刷新列表(isUpdate:是否编辑;values:表单信息;expandedArr:展开的节点信息)\n      emit('success', { isUpdate: unref(isUpdate), isSubAdd:unref(isSubAdd), values: { ...values }, expandedArr: unref(expandedRowKeys).reverse() });\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n\n  /**\n   * 获取同一级的id和同一级的子级id\n   */\n  function getSameLevelExpandKeysByPid(arr) {\n    if (arr.children && arr.children.length > 0) {\n      for (const children of arr.children) {\n        if (unref(expandedRowKeys).indexOf(children.key) < 0 && children.children && children.children.length > 0) {\n          getSameLevelExpandKeysByPid(children);\n          expandedRowKeys.value.push(children.key);\n        }\n      }\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/category/index.vue",
    "content": "<template>\n  <div>\n    <!--引用表格-->\n    <BasicTable\n      @register=\"registerTable\"\n      :rowSelection=\"rowSelection\"\n      :expandedRowKeys=\"expandedRowKeys\"\n      @expand=\"handleExpand\"\n      @fetch-success=\"onFetchSuccess\"\n    >\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"handleCreate\"> 新增</a-button>\n        <a-button type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n        <j-upload-button type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button\n            >批量操作\n            <Icon icon=\"ant-design:down-outlined\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n    </BasicTable>\n    <!--字典弹窗-->\n    <CategoryModal @register=\"registerModal\" @success=\"handleSuccess\" />\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"system-category\" setup>\n  //ts语法\n  import { ref, computed, unref, toRaw, nextTick } from 'vue';\n  import { BasicTable, useTable, TableAction } from '/src/components/Table';\n  import { useDrawer } from '/src/components/Drawer';\n  import CategoryModal from './components/CategoryModal.vue';\n  import { useModal } from '/src/components/Modal';\n  import { useMethods } from '/src/hooks/system/useMethods';\n  import { columns, searchFormSchema } from './category.data';\n  import { list, deleteCategory, batchDeleteCategory, getExportUrl, getImportUrl, getChildList, getChildListBatch } from './category.api';\n  import { useListPage } from '/@/hooks/system/useListPage';\n\n  const expandedRowKeys = ref([]);\n  const { handleExportXls, handleImportXls } = useMethods();\n  //字典model\n  const [registerModal, { openModal }] = useModal();\n  // 列表页面公共参数、方法\n  const { prefixCls, onExportXls, onImportXls, tableContext } = useListPage({\n    designScope: 'category-template',\n    tableProps: {\n      title: '分类字典',\n      api: list,\n      columns: columns,\n      actionColumn: {\n        width: 180,\n      },\n      formConfig: {\n        schemas: searchFormSchema,\n      },\n      isTreeTable: true,\n    },\n    exportConfig: {\n      name: '分类字典列表',\n      url: getExportUrl,\n    },\n    importConfig: {\n      url: getImportUrl,\n    },\n  });\n\n  //注册table数据\n  const [registerTable, { reload, collapseAll, updateTableDataRecord, findTableDataRecord, getDataSource }, { rowSelection, selectedRowKeys }] =\n    tableContext;\n\n  /**\n   * 新增事件\n   */\n  function handleCreate() {\n    openModal(true, {\n      isUpdate: false,\n    });\n  }\n\n  /**\n   * 编辑事件\n   */\n  async function handleEdit(record) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n\n  /**\n   * 详情\n   */\n  async function handleDetail(record) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n      hideFooter: true,\n    });\n  }\n\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteCategory({ id: record.id }, importSuccess);\n  }\n\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    const ids = selectedRowKeys.value.filter((item) => !item.includes('loading'));\n    await batchDeleteCategory({ ids: ids }, importSuccess);\n  }\n  /**\n   * 导入\n   */\n  function importSuccess() {\n    // 代码逻辑说明: [issues/54]树字典，勾选，然后批量删除，系统错误------------\n    (selectedRowKeys.value = []) && reload();\n  }\n  /**\n   * 添加下级\n   */\n  function handleAddSub(record) {\n    openModal(true, {\n      record,\n      isUpdate: false,\n    });\n  }\n  /**\n   * 成功回调\n   */\n  async function handleSuccess({ isUpdate,isSubAdd, values, expandedArr }) {\n    if (isUpdate) {\n      //编辑回调\n      updateTableDataRecord(values.id, values);\n    } else {\n      if (!values['pid']) {\n        //新增根节点\n        reload();\n      } else {\n        //新增子集\n        // 代码逻辑说明: [issue/4550]分类字典数据量过多会造成数据查询时间过长---\n        if(isSubAdd){\n          await expandTreeNode(values.pid);\n        }else{\n          //expandedRowKeys.value = [];\n          for (let key of unref(expandedArr)) {\n            await expandTreeNode(key);\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * 接口请求成功后回调\n   */\n  function onFetchSuccess(result) {\n    getDataByResult(result.items) && loadDataByExpandedRows();\n  }\n  /**\n   * 根据已展开的行查询数据（用于保存后刷新时异步加载子级的数据）\n   */\n  async function loadDataByExpandedRows() {\n    if (unref(expandedRowKeys).length > 0) {\n      const res = await getChildListBatch({ parentIds: unref(expandedRowKeys).join(',') });\n      if (res.success && res.result.records.length > 0) {\n        //已展开的数据批量子节点\n        let records = res.result.records;\n        const listMap = new Map();\n        for (let item of records) {\n          let pid = item['pid'];\n          if (unref(expandedRowKeys).includes(pid)) {\n            let mapList = listMap.get(pid);\n            if (mapList == null) {\n              mapList = [];\n            }\n            mapList.push(item);\n            listMap.set(pid, mapList);\n          }\n        }\n        let childrenMap = listMap;\n        let fn = (list) => {\n          if (list) {\n            list.forEach((data) => {\n              if (unref(expandedRowKeys).includes(data.id)) {\n                data.children = getDataByResult(childrenMap.get(data.id));\n                fn(data.children);\n              }\n            });\n          }\n        };\n        fn(getDataSource());\n      }\n    }\n  }\n  /**\n   * 处理数据集\n   */\n  function getDataByResult(result) {\n    if (result && result.length > 0) {\n      return result.map((item) => {\n        //判断是否标记了带有子节点\n        if (item['hasChild'] == '1') {\n          let loadChild = { id: item.id + '_loadChild', name: 'loading...', isLoading: true };\n          item.children = [loadChild];\n        }\n        return item;\n      });\n    }\n  }\n  /**\n   *树节点展开合并\n   * */\n  async function handleExpand(expanded, record) {\n    // 判断是否是展开状态，展开状态(expanded)并且存在子集(children)并且未加载过(isLoading)的就去查询子节点数据\n    if (expanded) {\n      expandedRowKeys.value.push(record.id);\n      if (record.children.length > 0 && !!record.children[0].isLoading) {\n        let result = await getChildList({ pid: record.id });\n        if (result && result.length > 0) {\n          record.children = getDataByResult(result);\n        } else {\n          record.children = null;\n          record.hasChild = '0';\n        }\n      }\n    } else {\n      let keyIndex = expandedRowKeys.value.indexOf(record.id);\n      if (keyIndex >= 0) {\n        expandedRowKeys.value.splice(keyIndex, 1);\n      }\n    }\n  }\n  /**\n   *操作表格后处理树节点展开合并\n   * */\n  async function expandTreeNode(key) {\n    let record:any = findTableDataRecord(key);\n    // 代码逻辑说明: [issue/4550]分类字典数据量过多会造成数据查询时间过长，显示“接口请求超时,请刷新页面重试!”---\n    if(!expandedRowKeys.value.includes(key)){\n      expandedRowKeys.value.push(key);\n    }\n    let result = await getChildList({ pid: key });\n    if (result && result.length > 0) {\n      record.children = getDataByResult(result);\n    } else {\n      record.children = null;\n      record.hasChild = '0';\n    }\n    updateTableDataRecord(key, record);\n  }\n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '确定删除吗?',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n      {\n        label: '添加下级',\n        onClick: handleAddSub.bind(null, { pid: record.id }),\n      },\n    ];\n  }\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/checkRule/CheckRuleModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" @ok=\"handleSubmit\" :title=\"title\" :width=\"1200\" destroyOnClose>\n    <BasicForm @register=\"registerForm\" />\n\n    <a-tabs v-model:activeKey=\"activeKey\" animated>\n      <a-tab-pane tab=\"局部规则\" key=\"1\" :forceRender=\"true\">\n        <JVxeTable ref=\"vTable1\" toolbar rowNumber dragSort rowSelection :maxHeight=\"580\" :dataSource=\"dataSource1\" :columns=\"columns1\">\n          <template #toolbarAfter>\n            <a-alert type=\"info\" showIcon message=\"局部规则按照你输入的位数有序的校验\" style=\"margin-bottom: 8px\" />\n          </template>\n        </JVxeTable>\n      </a-tab-pane>\n      <a-tab-pane tab=\"全局规则\" key=\"2\" :forceRender=\"true\">\n        <JVxeTable\n          ref=\"vTable2\"\n          toolbar\n          rowNumber\n          dragSort\n          rowSelection\n          :maxHeight=\"580\"\n          :dataSource=\"dataSource2\"\n          :addSetActive=\"false\"\n          :columns=\"columns2\"\n        >\n          <template #toolbarAfter>\n            <a-alert type=\"info\" showIcon message=\"全局规则可校验用户输入的所有字符；全局规则的优先级比局部规则的要高。\" style=\"margin-bottom: 8px\" />\n          </template>\n        </JVxeTable>\n      </a-tab-pane>\n    </a-tabs>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { computed, ref, unref } from 'vue';\n  import { formSchema } from './check.rule.data';\n  import { saveCheckRule, updateCheckRule } from './check.rule.api';\n  import { JVxeTypes, JVxeColumn, JVxeTableInstance } from '/@/components/jeecg/JVxeTable/types';\n  import { pick } from 'lodash-es';\n\n  //设置标题\n  const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));\n  // 声明Emits\n  const emit = defineEmits(['register', 'success']);\n  const isUpdate = ref(true);\n\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate, getFieldsValue }] = useForm({\n    schemas: formSchema,\n    showActionButtonGroup: false,\n  });\n\n  const activeKey = ref('1');\n  let arr1: any[] = [];\n  let dataSource1 = ref(arr1);\n  let arr2: any[] = [];\n  let dataSource2 = ref(arr2);\n\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false });\n    isUpdate.value = !!data?.isUpdate;\n    activeKey.value = '1';\n    dataSource1.value = [];\n    dataSource2.value = [];\n    if (unref(isUpdate)) {\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n\n      let ruleJson = data.record.ruleJson;\n      if (ruleJson) {\n        let ruleList = JSON.parse(ruleJson);\n        // 筛选出全局规则和局部规则\n        let global: any[] = [],\n          design: any[] = [],\n          priority = '1';\n        ruleList.forEach((rule) => {\n          if (rule.digits === '*') {\n            global.push(Object.assign(rule, { priority }));\n          } else {\n            priority = '0';\n            design.push(rule);\n          }\n        });\n        dataSource1.value = design;\n        dataSource2.value = global;\n      }\n    }\n  });\n\n  const vTable1 = ref<JVxeTableInstance>();\n  const vTable2 = ref<JVxeTableInstance>();\n\n  // 验证表格 返回表格数据\n  function validateMyTable(tableRef, key) {\n    return new Promise((resolve, reject) => {\n      tableRef.value!.validateTable().then((errMap) => {\n        if (errMap) {\n          activeKey.value = key;\n          reject();\n        } else {\n          const values = tableRef.value!.getTableData();\n          resolve(values);\n        }\n      });\n    });\n  }\n\n  //表单提交事件\n  async function handleSubmit() {\n    let mainData;\n    let globalValues = [];\n    let designValues = [];\n    validate()\n      .then((formValue) => {\n        mainData = formValue;\n        return validateMyTable(vTable1, '1');\n      })\n      .then((tableData1: []) => {\n        if (tableData1 && tableData1.length > 0) {\n          designValues = tableData1;\n        }\n        return validateMyTable(vTable2, '2');\n      })\n      .then((tableData2: []) => {\n        if (tableData2 && tableData2.length > 0) {\n          globalValues = tableData2;\n        }\n        // 整合两个子表的数据\n        let firstGlobal: any[] = [],\n          afterGlobal: any[] = [];\n        for (let i = 0; i < globalValues.length; i++) {\n          let v: any = globalValues[i];\n          v.digits = '*';\n          if (v.priority === '1') {\n            firstGlobal.push(v);\n          } else {\n            afterGlobal.push(v);\n          }\n        }\n        let concatValues = firstGlobal.concat(designValues).concat(afterGlobal);\n        let subValues = concatValues.map((i) => pick(i, 'digits', 'pattern', 'message'));\n        // 生成 formData，用于传入后台\n        let ruleJson = JSON.stringify(subValues);\n        let formData = Object.assign({}, mainData, { ruleJson });\n        saveOrUpdateFormData(formData);\n      })\n      .catch(() => {\n        setModalProps({ confirmLoading: false });\n        console.error('验证未通过!');\n      });\n  }\n\n  // 表单提交请求\n  async function saveOrUpdateFormData(formData) {\n    try {\n      console.log('表单提交数据', formData);\n      setModalProps({ confirmLoading: true });\n      if (isUpdate.value) {\n        await updateCheckRule(formData);\n      } else {\n        await saveCheckRule(formData);\n      }\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n\n  /**\n   * 校验\n   * @param cellValue\n   * @param callback\n   */\n  const validatePatternHandler = ({ cellValue }, callback) => {\n    try {\n      new RegExp(cellValue);\n      callback(true);\n    } catch (e) {\n      callback(false, '请输入正确的正则表达式');\n    }\n  };\n\n  const columns1 = ref<JVxeColumn[]>([\n    {\n      title: '位数',\n      key: 'digits',\n      type: JVxeTypes.inputNumber,\n      minWidth: 180,\n      validateRules: [\n        { required: true, message: '${title}不能为空' },\n        { pattern: /^[1-9]\\d*$/, message: '请输入零以上的正整数' },\n      ],\n    },\n    {\n      title: '规则（正则表达式）',\n      key: 'pattern',\n      minWidth: 320,\n      type: JVxeTypes.input,\n      validateRules: [{ required: true, message: '规则不能为空' }, { handler: validatePatternHandler }],\n    },\n    {\n      title: '提示文本',\n      key: 'message',\n      minWidth: 180,\n      type: JVxeTypes.input,\n      validateRules: [{ required: true, message: '${title}不能为空' }],\n    },\n  ]);\n\n  const columns2 = ref<JVxeColumn[]>([\n    {\n      title: '优先级',\n      key: 'priority',\n      type: JVxeTypes.select,\n      defaultValue: '1',\n      options: [\n        { title: '优先运行', value: '1' },\n        { title: '最后运行', value: '0' },\n      ],\n      validateRules: [],\n    },\n    {\n      title: '规则（正则表达式）',\n      key: 'pattern',\n      width: '40%',\n      type: JVxeTypes.input,\n      validateRules: [{ required: true, message: '规则不能为空' }, { handler: validatePatternHandler }],\n    },\n    {\n      title: '提示文本',\n      key: 'message',\n      width: '20%',\n      type: JVxeTypes.input,\n      validateRules: [{ required: true, message: '${title}不能为空' }],\n    },\n  ]);\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/checkRule/CheckRuleTestModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" :okButtonProps=\"okButtonProps\" @register=\"registerModal\" destroyOnClose>\n    <BasicForm @register=\"registerForm\" />\n    <div style=\"display: flex; flex-flow: row wrap\">\n      <div style=\"padding: 0 4px\" v-for=\"(str, index) of realTestValue\" :key=\"index\">\n        <a-row>\n          <a-col style=\"text-align: center\">\n            <a-input :value=\"str\" style=\"text-align: center; width: 40px\" />\n          </a-col>\n          <a-col style=\"text-align: center\">{{ index + 1 }}</a-col>\n        </a-row>\n      </div>\n    </div>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { checkRuleInput } from '/@/views/system/checkRule/check.rule.data';\n  import { ref } from 'vue';\n  let realTestValue = ref('');\n  const okButtonProps = {\n    style: { display: 'none' },\n  };\n  const [registerForm, { resetFields, setFieldsValue, validate, getFieldsValue }] = useForm({\n    schemas: checkRuleInput,\n    showActionButtonGroup: false,\n    labelCol: {\n      span: 24,\n    },\n    wrapperCol: {\n      span: 24,\n    },\n  });\n\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    realTestValue.value = '';\n    setModalProps({\n      confirmLoading: false,\n      cancelText: '关闭',\n      title: '功能测试',\n      width: '1000px',\n    });\n    await setFieldsValue({\n      ruleCode: data.ruleCode,\n      testValue: realTestValue,\n    });\n  });\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/checkRule/check.rule.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { Modal } from 'ant-design-vue';\n\nenum Api {\n  list = '/sys/checkRule/list',\n  delete = '/sys/checkRule/delete',\n  deleteBatch = '/sys/checkRule/deleteBatch',\n  exportXls = 'sys/checkRule/exportXls',\n  importXls = 'sys/checkRule/importExcel',\n  checkByCode = '/sys/checkRule/checkByCode',\n  save = '/sys/checkRule/add',\n  edit = '/sys/checkRule/edit',\n}\n\n/**\n * 导出地址\n */\nexport const exportUrl = Api.exportXls;\n/**\n * 导入地址\n */\nexport const importUrl = Api.importXls;\n\n/**\n * 列表查询\n * @param params\n */\nexport const getCheckRuleList = (params) => {\n  return defHttp.get({ url: Api.list, params });\n};\n\n/**\n * 删除\n * @param params\n * @param handleSuccess\n */\nexport const deleteCheckRule = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.delete, data: params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n\n/**\n * 批量删除\n * @param params\n */\nexport const batchDeleteCheckRule = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n\n/**\n * 根据编码校验规则code，校验传入的值是否合法\n * @param ruleCode\n * @param value\n */\nexport const validateCheckRule = (ruleCode, value) => {\n  value = encodeURIComponent(value);\n  let params = { ruleCode, value };\n  return defHttp.get({ url: Api.checkByCode, params }, { isTransformResponse: false });\n};\n\n/**\n * 保存\n * @param params\n */\nexport const saveCheckRule = (params) => {\n  return defHttp.post({ url: Api.save, params });\n};\n\n/**\n * 更新\n * @param params\n */\nexport const updateCheckRule = (params) => {\n  return defHttp.put({ url: Api.edit, params });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/checkRule/check.rule.data.ts",
    "content": "import { BasicColumn, FormSchema } from '/@/components/Table';\nimport { render } from '/@/utils/common/renderUtils';\nimport { duplicateCheckDelay } from '/@/views/system/user/user.api';\nimport { validateCheckRule } from '/@/views/system/checkRule/check.rule.api';\nimport { array } from 'vue-types';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '规则名称',\n    dataIndex: 'ruleName',\n    width: 200,\n    align: 'center',\n  },\n  {\n    title: '规则编码',\n    dataIndex: 'ruleCode',\n    width: 200,\n    align: 'center',\n  },\n  {\n    title: '规则描述',\n    dataIndex: 'ruleDescription',\n    width: 300,\n    align: 'center',\n    customRender: function ({ text }) {\n      return render.renderTip(text, 30);\n    },\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'ruleName',\n    label: '规则名称',\n    component: 'Input',\n    colProps: { span: 6 },\n  },\n  {\n    field: 'ruleCode',\n    label: '规则编码',\n    component: 'Input',\n    colProps: { span: 6 },\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    label: '',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    field: 'ruleName',\n    label: '规则名称',\n    component: 'Input',\n    required: true,\n    colProps: { span: 24 },\n  },\n  {\n    field: 'ruleCode',\n    label: '规则编码',\n    component: 'Input',\n    colProps: { span: 24 },\n    dynamicDisabled: ({ values }) => {\n      return !!values.id;\n    },\n    dynamicRules: ({ model }) => {\n      return [\n        {\n          required: true,\n          validator: (_, value) => {\n            return new Promise((resolve, reject) => {\n              if (!value) {\n                return reject('请输入规则编码！');\n              }\n              let params = {\n                tableName: 'sys_check_rule',\n                fieldName: 'rule_code',\n                fieldVal: value,\n                dataId: model.id,\n              };\n              duplicateCheckDelay(params)\n                .then((res) => {\n                  res.success ? resolve() : reject('规则编码已存在!');\n                })\n                .catch((err) => {\n                  reject(err.message || '校验失败');\n                });\n            });\n          },\n        },\n      ];\n    },\n  },\n  {\n    field: 'ruleDescription',\n    label: '规则描述',\n    colProps: { span: 24 },\n    component: 'InputTextArea',\n    componentProps: {\n      placeholder: '请输入规则描述',\n      rows: 2,\n    },\n  },\n];\n\nexport const checkRuleInput: FormSchema[] = [\n  {\n    label: '123',\n    field: 'ruleCode',\n    component: 'Input',\n    show: false,\n  },\n  {\n    field: 'testValue',\n    label: '需要测试的值:',\n    component: 'Input',\n    componentProps: ({ formModel }) => {\n      return {\n        onChange: (e) => {\n          formModel.testValue = e.target.value;\n        },\n      };\n    },\n    dynamicRules: ({ model }) => {\n      const { ruleCode } = model;\n      return [\n        {\n          required: false,\n          validator: (_, value) => {\n            return new Promise((resolve, reject) => {\n              if (ruleCode && value) {\n                /*console.log({ruleCode,value})*/\n                validateCheckRule(ruleCode, value)\n                  .then((res) => {\n                    //console.log(1233, res)\n                    res['success'] ? resolve() : reject(res['message']);\n                  })\n                  .catch((err) => {\n                    reject(err.message || err);\n                  });\n              } else {\n                resolve();\n              }\n            });\n          },\n        },\n      ];\n    },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/checkRule/index.vue",
    "content": "<template>\n  <div :class=\"prefixCls\">\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-button preIcon=\"ant-design:plus-outlined\" type=\"primary\" @click=\"handleAdd\">新增</a-button>\n        <a-button type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n        <j-upload-button type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                <span>删除</span>\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button>\n            <span>批量操作</span>\n            <Icon icon=\"mdi:chevron-down\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\" />\n      </template>\n    </BasicTable>\n\n    <CheckRuleTestModal @register=\"testModal\"></CheckRuleTestModal>\n    <CheckRuleModal @register=\"registerModal\" @success=\"reload\"></CheckRuleModal>\n  </div>\n</template>\n\n<script name=\"system-fillrule\" lang=\"ts\" setup>\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n\n  import { useModal } from '/@/components/Modal';\n  import {\n    getCheckRuleList,\n    exportUrl,\n    importUrl,\n    deleteCheckRule,\n    batchDeleteCheckRule,\n    validateCheckRule,\n  } from '/@/views/system/checkRule/check.rule.api';\n  import { columns, searchFormSchema } from '/@/views/system/checkRule/check.rule.data';\n  import { ActionItem } from '/@/components/Table';\n\n  import CheckRuleTestModal from '/@/views/system/checkRule/CheckRuleTestModal.vue';\n  const [testModal, { openModal: openTestModal }] = useModal();\n\n  import CheckRuleModal from '/@/views/system/checkRule/CheckRuleModal.vue';\n  const [registerModal, { openModal }] = useModal();\n\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext, createMessage, onExportXls, onImportXls, createSuccessModal } = useListPage({\n    designScope: 'check-rule',\n    tableProps: {\n      title: '编码校验规则管理页面',\n      api: getCheckRuleList,\n      columns: columns,\n      showIndexColumn: true,\n      formConfig: {\n        schemas: searchFormSchema,\n      },\n    },\n    exportConfig: {\n      url: exportUrl,\n      name: '编码校验规则列表',\n    },\n    importConfig: {\n      url: importUrl,\n      success: () => reload(),\n    },\n  });\n  // 注册 ListTable\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;\n\n  /**\n   * 新增事件\n   */\n  function handleAdd() {\n    openModal(true, {\n      isUpdate: false,\n    });\n  }\n\n  /**\n   * 编辑事件\n   */\n  function handleEdit(record) {\n    console.log('record....', record);\n    openModal(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    console.log(12345, record);\n    await deleteCheckRule({ id: record.id }, reload);\n  }\n\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDeleteCheckRule({ ids: selectedRowKeys.value }, () => {\n      selectedRowKeys.value = [];\n      reload();\n    });\n  }\n\n  /**\n   * 功能测试\n   */\n  function testRule(record) {\n    openTestModal(true, { ruleCode: record.ruleCode });\n  }\n\n  /**\n   * 编辑\n   */\n  function getTableAction(record): ActionItem[] {\n    return [{ label: '编辑', onClick: handleEdit.bind(null, record) }];\n  }\n\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record): ActionItem[] {\n    return [\n      { label: '功能测试', onClick: testRule.bind(null, record) },\n      {\n        label: '删除',\n        color: 'error',\n        popConfirm: {\n          title: '确认要删除吗？',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/depart/TenantDepartList.vue",
    "content": "<template>\n  <a-row :class=\"['p-4', `${prefixCls}--box`]\" type=\"flex\" :gutter=\"10\">\n    <a-col :xl=\"12\" :lg=\"24\" :md=\"24\" style=\"margin-bottom: 10px\">\n      <DepartLeftTree\n        v-if=\"showDepart\"\n        ref=\"leftTree\"\n        @select=\"onTreeSelect\"\n        @rootTreeData=\"onRootTreeData\"\n        :isTenantDepart=\"true\"\n        :loginTenantName=\"loginTenantName\"\n      />\n    </a-col>\n    <a-col :xl=\"12\" :lg=\"24\" :md=\"24\" style=\"margin-bottom: 10px\">\n      <div style=\"height: 100%\" :class=\"[`${prefixCls}`]\">\n        <a-tabs v-show=\"departData != null\" defaultActiveKey=\"base-info\">\n          <a-tab-pane tab=\"基本信息\" key=\"base-info\" forceRender style=\"position: relative\">\n            <div style=\"padding: 20px\">\n              <DepartFormTab v-if=\"showDepart\" :data=\"departData\" :rootTreeData=\"rootTreeData\" @success=\"onSuccess\" :isTenantDepart=\"true\" />\n            </div>\n          </a-tab-pane>\n        </a-tabs>\n        <div v-show=\"departData == null\" style=\"padding-top: 40px\">\n          <a-empty description=\"尚未选择部门\" />\n        </div>\n      </div>\n    </a-col>\n  </a-row>\n</template>\n\n<script lang=\"ts\" setup name=\"TenantDepartList\">\n  import { onMounted, provide, ref } from 'vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import DepartLeftTree from '/@/views/system/depart/components/DepartLeftTree.vue';\n  import DepartFormTab from '/@/views/system/depart/components/DepartFormTab.vue';\n  import { getLoginTenantName } from '@/views/system/tenant/tenant.api';\n  import { tenantSaasMessage } from '@/utils/common/compUtils';\n\n  const { prefixCls } = useDesign('tenant-depart-manage');\n  provide('prefixCls', prefixCls);\n\n  // 给子组件定义一个ref变量\n  const leftTree = ref();\n  //是否显示部门\n  const showDepart = ref(false);\n\n  // 当前选中的部门信息\n  const departData = ref({});\n  const rootTreeData = ref<any[]>([]);\n  const loginTenantName = ref<string>('');\n\n  /**\n   * 获取租户名称\n   */\n  getTenantName();\n\n  async function getTenantName() {\n    loginTenantName.value = await getLoginTenantName();\n    if (loginTenantName.value) {\n      showDepart.value = true;\n    } else {\n      showDepart.value = false;\n    }\n  }\n\n  // 左侧树选择后触发\n  function onTreeSelect(data) {\n    departData.value = data;\n  }\n\n  // 左侧树rootTreeData触发\n  function onRootTreeData(data) {\n    rootTreeData.value = data;\n  }\n\n  function onSuccess() {\n    leftTree.value.loadRootTreeData();\n  }\n\n  onMounted(() => {\n    //提示信息\n    tenantSaasMessage('租户部门');\n  });\n</script>\n\n<style lang=\"less\">\n  @prefix-cls: ~'@{namespace}-tenant-depart-manage';\n\n  .@{prefix-cls} {\n    background: @component-background;\n\n    &--box {\n      .ant-tabs-nav {\n        padding: 0 20px;\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/depart/components/DepartDataRuleDrawer.vue",
    "content": "<template>\n  <BasicDrawer title=\"数据规则/按钮权限配置\" :width=\"365\" @close=\"onClose\" @register=\"registerDrawer\">\n    <a-spin :spinning=\"loading\">\n      <a-tabs defaultActiveKey=\"1\">\n        <a-tab-pane tab=\"数据规则\" key=\"1\">\n          <a-checkbox-group v-model:value=\"dataRuleChecked\" v-if=\"dataRuleList.length > 0\">\n            <a-row>\n              <a-col :span=\"24\" v-for=\"(item, index) in dataRuleList\" :key=\"'dr' + index\">\n                <a-checkbox :value=\"item.id\">{{ item.ruleName }}</a-checkbox>\n              </a-col>\n              <a-col :span=\"24\">\n                <div style=\"width: 100%; margin-top: 15px\">\n                  <a-button type=\"primary\" :loading=\"loading\" :size=\"'small'\" preIcon=\"ant-design:save-filled\" @click=\"saveDataRuleForRole\">\n                    <span>点击保存</span>\n                  </a-button>\n                </div>\n              </a-col>\n            </a-row>\n          </a-checkbox-group>\n          <a-empty v-else description=\"无配置信息\" />\n        </a-tab-pane>\n      </a-tabs>\n    </a-spin>\n  </BasicDrawer>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, unref } from 'vue';\n  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';\n\n  import { queryDepartDataRule, saveDepartDataRule } from '../depart.api';\n\n  defineEmits(['register']);\n  const loading = ref<boolean>(false);\n  const departId = ref('');\n  const functionId = ref('');\n  const dataRuleList = ref<Array<any>>([]);\n  const dataRuleChecked = ref<Array<any>>([]);\n\n  // 注册抽屉组件\n  const [registerDrawer, { closeDrawer }] = useDrawerInner((data) => {\n    departId.value = unref(data.departId);\n    functionId.value = unref(data.functionId);\n    loadData();\n  });\n\n  async function loadData() {\n    try {\n      loading.value = true;\n      const { datarule, drChecked } = await queryDepartDataRule(functionId, departId);\n      dataRuleList.value = datarule;\n      if (drChecked) {\n        dataRuleChecked.value = drChecked.split(',');\n      }\n    } finally {\n      loading.value = false;\n    }\n  }\n\n  function saveDataRuleForRole() {\n    let params = {\n      departId: departId.value,\n      permissionId: functionId.value,\n      dataRuleIds: dataRuleChecked.value.join(','),\n    };\n    saveDepartDataRule(params);\n  }\n\n  function onClose() {\n    doReset();\n  }\n\n  function doReset() {\n    functionId.value = '';\n    dataRuleList.value = [];\n    dataRuleChecked.value = [];\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/depart/components/DepartFormModal.vue",
    "content": "<template>\n  <BasicModal :title=\"title\" :width=\"800\" v-bind=\"$attrs\" @ok=\"handleOk\" @register=\"registerModal\">\n    <BasicForm @register=\"registerForm\" >\n      <template #depPostParentId=\"{ model, field }\">\n        <a-tree-select v-model:value=\"depPostValue\" :treeData=\"treeData\" allowClear treeCheckable @select=\"treeSelect\">\n          <template #title=\"{ orgCategory, title }\">\n            <TreeIcon :orgCategory=\"orgCategory\" :title=\"title\"></TreeIcon>\n          </template>\n          <template #tagRender=\"{option}\">\n            <span style=\"margin-left: 10px\" v-if=\"orgNameMap[option.id]\">{{orgNameMap[option.id]}}</span>\n          </template>\n        </a-tree-select>\n      </template>\n    </BasicForm>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { watch, computed, inject, ref, unref, onMounted } from 'vue';\n\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n\n  import { saveOrUpdateDepart } from '../depart.api';\n  import { useBasicFormSchema, orgCategoryOptions } from '../depart.data';\n  import TreeIcon from \"@/components/Form/src/jeecg/components/TreeIcon/TreeIcon.vue\";\n  import { getDepartPathNameByOrgCode } from \"@/utils/common/compUtils\";\n\n  const emit = defineEmits(['success', 'register']);\n  const props = defineProps({\n    rootTreeData: { type: Array, default: () => [] },\n  });\n  const prefixCls = inject('prefixCls');\n  // 当前是否是更新模式\n  const isUpdate = ref<boolean>(false);\n  // 当前的弹窗数据\n  const model = ref<object>({});\n  const title = computed(() => (isUpdate.value ? '编辑' : '新增'));\n  const treeData = ref<any>([]);\n  //上级岗位\n  const depPostValue = ref<any>([]);\n  //上级岗位名称映射\n  const orgNameMap = ref<Record<string, string>>({});\n\n  //注册表单\n  const [registerForm, { resetFields, setFieldsValue, validate, updateSchema }] = useForm({\n    schemas: useBasicFormSchema(treeData).basicFormSchema,\n    showActionButtonGroup: false,\n  });\n\n  // 注册弹窗\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    await resetFields();\n    isUpdate.value = unref(data?.isUpdate);\n    // 当前是否为添加子级\n    let isChild = unref(data?.isChild);\n    let categoryOptions = isChild ? orgCategoryOptions.child : orgCategoryOptions.root;\n    \n    if(data.record?.orgCategory && data.record?.orgCategory === '2'){\n      categoryOptions = orgCategoryOptions.childDepartPost; \n    }\n    if(data.record?.orgCategory && data.record?.orgCategory === '3'){\n      categoryOptions = orgCategoryOptions.childPost; \n    }\n    if(data.record?.depPostParentId){\n      orgNameMap.value[data.record.depPostParentId] = await getDepartPathNameByOrgCode('', '', data.record.depPostParentId);\n      depPostValue.value = [data.record.depPostParentId];\n    }\n    // 隐藏不需要展示的字段\n    updateSchema([\n      {\n        field: 'parentId',\n        show: isChild,\n        componentProps: {\n          // 如果是添加子部门，就禁用该字段\n          disabled: isChild,\n          treeData: props.rootTreeData,\n        },\n      },\n      {\n        field: 'orgCode',\n        show: false,\n      },\n      {\n        field: 'orgCategory',\n        componentProps: { options: categoryOptions },\n      },\n    ]);\n\n    let record = unref(data?.record);\n    if (typeof record !== 'object') {\n      record = {};\n    }\n    let orgCategory = data.record?.orgCategory;\n    let company = orgCategory === '1' || orgCategory === '4';\n    delete data.record?.orgCategory;\n    // 赋默认值\n    record = Object.assign(\n      {\n        departOrder: 0,\n        orgCategory: company?categoryOptions[1].value:categoryOptions[0].value,\n      },\n      record\n    );\n    model.value = record;\n    await setFieldsValue({ ...record });\n  });\n\n  // 提交事件\n  async function handleOk() {\n    try {\n      setModalProps({ confirmLoading: true });\n      let values = await validate();\n      if(depPostValue.value && depPostValue.value.length > 0){\n        values.depPostParentId = depPostValue.value[0];\n      }else{\n        values.depPostParentId = \"\";\n      }\n      //提交表单\n      await saveOrUpdateDepart(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n\n  /**\n   * 树选中事件\n   *\n   * @param info\n   * @param keys\n   */\n  async function treeSelect(keys,info) {\n    if (info.checkable) {\n      //解决闪动问题\n      orgNameMap.value[info.id] = \"\";\n      depPostValue.value = [info.value];\n      orgNameMap.value[info.id] = await getDepartPathNameByOrgCode(info.orgCode,info.label,info.id);\n    } else {\n      depPostValue.value = [];\n    }\n  }\n</script>\n\n<style lang=\"less\" scoped>\n  :deep(.ant-select-selector .ant-select-selection-item){\n    svg {\n      display: none !important;\n    }\n  }\n</style>"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/depart/components/DepartFormTab.vue",
    "content": "<template>\n  <a-spin :spinning=\"loading\">\n    <BasicForm @register=\"registerForm\" >\n      <template #depPostParentId=\"{ model, field }\">\n        <a-tree-select v-model:value=\"depPostValue\" :treeData=\"treeData\" allowClear treeCheckable @select=\"treeSelect\">\n          <template #title=\"{ orgCategory, title }\">\n            <TreeIcon :orgCategory=\"orgCategory\" :title=\"title\"></TreeIcon>\n          </template>\n          <template #tagRender=\"{ option }\">\n            <span style=\"margin-left: 10px\">{{ orgNameMap[option.id] }}</span>\n          </template>\n        </a-tree-select>\n      </template>\n    </BasicForm>\n    <div class=\"j-box-bottom-button offset-20\" style=\"margin-top: 30px\">\n      <div class=\"j-box-bottom-button-float\" :class=\"[`${prefixCls}`]\">\n        <a-button preIcon=\"ant-design:sync-outlined\" @click=\"onReset\">重置</a-button>\n        <a-button type=\"primary\" preIcon=\"ant-design:save-filled\" @click=\"onSubmit\">保存</a-button>\n      </div>\n    </div>\n  </a-spin>\n</template>\n\n<script lang=\"ts\" setup>\n  import { watch, computed, inject, ref, unref, onMounted } from 'vue';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { saveOrUpdateDepart } from '../depart.api';\n  import { useBasicFormSchema, orgCategoryOptions, positionChange } from '../depart.data';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import TreeIcon from \"@/components/Form/src/jeecg/components/TreeIcon/TreeIcon.vue\";\n  import { getDepartPathNameByOrgCode } from '@/utils/common/compUtils';\n\n  const { prefixCls } = useDesign('j-depart-form-content');\n\n  const emit = defineEmits(['success']);\n  const props = defineProps({\n    data: { type: Object, default: () => ({}) },\n    rootTreeData: { type: Array, default: () => [] },\n  });\n  const loading = ref<boolean>(false);\n  // 当前是否是更新模式\n  const isUpdate = ref<boolean>(true);\n  // 当前的弹窗数据\n  const model = ref<object>({});\n  const treeData = ref<any>([]);\n  //上级岗位\n  const depPostValue = ref<any>([]);\n  //上级岗位名称映射\n  const orgNameMap = ref<Record<string, string>>({});\n\n  //注册表单\n  const [registerForm, { resetFields, setFieldsValue, validate, updateSchema }] = useForm({\n    schemas: useBasicFormSchema(treeData).basicFormSchema,\n    showActionButtonGroup: false,\n  });\n\n  const categoryOptions = computed(() => {\n    if (!!props?.data?.parentId) {\n      return orgCategoryOptions.child;\n    } else {\n      return orgCategoryOptions.root;\n    }\n  });\n\n  onMounted(() => {\n    // 禁用字段\n    updateSchema([\n      { field: 'parentId', componentProps: { disabled: true } },\n      { field: 'orgCode', componentProps: { disabled: true } },\n    ]);\n    // data 变化，重填表单\n    watch(\n      () => props.data,\n      async () => {\n        let record = unref(props.data);\n        if (typeof record !== 'object') {\n          record = {};\n        }\n        model.value = record;\n        if (record.depPostParentId) {\n          orgNameMap.value[record.depPostParentId] = await getDepartPathNameByOrgCode('', '', record.depPostParentId);\n          depPostValue.value = [record.depPostParentId];\n        }\n        positionChange(record.positionId, record, treeData);\n        await resetFields();\n        await setFieldsValue({ ...record });\n      },\n      { deep: true, immediate: true }\n    );\n    // 更新 父部门 选项\n    watch(\n      () => props.rootTreeData,\n      async () => {\n        updateSchema([\n          {\n            field: 'parentId',\n            componentProps: { treeData: props.rootTreeData },\n          },\n        ]);\n      },\n      { deep: true, immediate: true }\n    );\n    // 监听并更改 orgCategory options\n    watch(\n      categoryOptions,\n      async () => {\n        updateSchema([\n          {\n            field: 'orgCategory',\n            componentProps: { options: categoryOptions.value },\n          },\n        ]);\n      },\n      { immediate: true }\n    );\n  });\n\n  // 重置表单\n  async function onReset() {\n    await resetFields();\n    await setFieldsValue({ ...model.value });\n  }\n\n  // 提交事件\n  async function onSubmit() {\n    try {\n      loading.value = true;\n      let values = await validate();\n      values = Object.assign({}, model.value, values);\n      if (depPostValue.value && depPostValue.value.length > 0) {\n        values.depPostParentId = depPostValue.value[0];\n      } else {\n        values.depPostParentId = '';\n      }\n      //提交表单\n      await saveOrUpdateDepart(values, isUpdate.value);\n      //刷新列表\n      emit('success');\n      Object.assign(model.value, values);\n    } finally {\n      loading.value = false;\n    }\n  }\n\n  /**\n   * 树选中事件\n   *\n   * @param info\n   * @param keys\n   */\n  async function treeSelect(keys, info) {\n    if (info.checkable) {\n      orgNameMap.value[info.id] = '';\n      depPostValue.value = [info.value];\n      orgNameMap.value[info.id] = await getDepartPathNameByOrgCode(info.orgCode, info.label, info.id);\n    } else {\n      depPostValue.value = [];\n    }\n  }\n</script>\n<style lang=\"less\">\n\n  @prefix-cls: ~'@{namespace}-j-depart-form-content';\n  /*begin 兼容暗夜模式*/\n  .@{prefix-cls} {\n    background: @component-background;\n    border-top: 1px solid @border-color-base;\n  }\n  /*end 兼容暗夜模式*/\n</style>\n<style lang=\"less\" scoped>\n  :deep(.ant-select-selector .ant-select-selection-item){\n    svg{\n      display: none !important;\n    }\n  }\n</style>"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/depart/components/DepartLeftTree.vue",
    "content": "<template>\n  <a-card :bordered=\"false\" style=\"height: 100%\">\n    <div class=\"j-table-operator\" style=\"width: 100%;display: flex;align-items: center\">\n      <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"onAddDepart\">新增</a-button>\n      <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"onAddChildDepart()\">添加下级</a-button>\n      <a-upload name=\"file\" :showUploadList=\"false\" :customRequest=\"onImportXls\" v-if=\"!isTenantDepart\">\n        <a-button type=\"primary\" preIcon=\"ant-design:import-outlined\">导入</a-button>\n      </a-upload>\n      <a-button type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\" v-if=\"!isTenantDepart\">导出</a-button>\n      <template v-if=\"checkedKeys.length > 0\">\n        <a-dropdown>\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"onDeleteBatch\">\n                <icon icon=\"ant-design:delete-outlined\" />\n                <span>删除</span>\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button>\n            <span>批量操作 </span>\n            <icon icon=\"akar-icons:chevron-down\" />\n          </a-button>\n        </a-dropdown>\n      </template>\n      <Icon icon=\"ant-design:question-circle-outlined\" style=\"margin-left: 10px;cursor: pointer\" @click=\"tipShow = true\"></Icon>\n      <div v-if=\"loginTenantName\" style=\"margin-left: 10px;\"\n      >当前登录租户: <span class=\"tenant-name\">{{ loginTenantName }}</span>\n      </div>\n    </div>\n    <a-alert type=\"info\" show-icon class=\"alert\" style=\"margin-bottom: 8px\">\n      <template #message>\n        <template v-if=\"checkedKeys.length > 0\">\n          <span>已选中 {{ checkedKeys.length }} 条记录</span>\n          <a-divider type=\"vertical\" />\n          <a @click=\"checkedKeys = []\">清空</a>\n        </template>\n        <template v-else>\n          <span>未选中任何数据</span>\n        </template>\n      </template>\n    </a-alert>\n    <a-spin :spinning=\"loading\">\n      <a-input-search placeholder=\"按部门名称搜索…\" style=\"margin-bottom: 10px\" @search=\"onSearch\" />\n      <!--组织机构树-->\n      <template v-if=\"treeData.length > 0\">\n        <a-tree\n          v-if=\"!treeReloading\"\n          checkable\n          :clickRowToExpand=\"false\"\n          :treeData=\"treeData\"\n          :selectedKeys=\"selectedKeys\"\n          :checkStrictly=\"checkStrictly\"\n          :load-data=\"loadChildrenTreeData\"\n          :checkedKeys=\"checkedKeys\"\n          v-model:expandedKeys=\"expandedKeys\"\n          @check=\"onCheck\"\n          @select=\"onSelect\"\n          draggable\n          @drop=\"onDrop\"\n          @dragstart=\"onDragStart\"\n          style=\"overflow-y: auto;height: calc(100vh - 330px);\"\n        >\n          <template #title=\"{ key: treeKey, title, dataRef, data }\">\n            <a-dropdown :trigger=\"['contextmenu']\">\n              <Popconfirm\n                :open=\"visibleTreeKey === treeKey\"\n                title=\"确定要删除吗？\"\n                ok-text=\"确定\"\n                cancel-text=\"取消\"\n                placement=\"rightTop\"\n                @confirm=\"onDelete(dataRef)\"\n                @openChange=\"onVisibleChange\"\n              >\n                <TreeIcon :orgCategory=\"dataRef.orgCategory\" :title=\"title\"></TreeIcon>\n              </Popconfirm>\n\n              <template #overlay>\n                <a-menu @click=\"\">\n                  <a-menu-item key=\"1\" @click=\"onAddChildDepart(dataRef)\" v-if=\"data.orgCategory !== '3'\">添加下级</a-menu-item>\n                  <a-menu-item key=\"2\" @click=\"visibleTreeKey = treeKey\">\n                    <span style=\"color: red\">删除</span>\n                  </a-menu-item>\n                </a-menu>\n              </template>\n            </a-dropdown>\n          </template>\n        </a-tree>\n      </template>\n      <a-empty v-else description=\"暂无数据\" />\n    </a-spin>\n    <DepartFormModal :rootTreeData=\"treeData\" @register=\"registerModal\" @success=\"loadRootTreeData\" />\n  </a-card>\n  <a-modal v-model:open=\"tipShow\" :footer=\"null\" title=\"部门规则说明\" :width=\"800\">\n      <ul class=\"departmentalRulesTip\">\n        <li>当前部门机构设置支持集团组织架构，第一级默认为公司，下级可创建子公司、部门和岗位。</li>\n        <li><br/></li>\n        <li>1、岗位下不能添加下级。</li>\n        <li>2、部门下不能直接添加子公司。</li>\n        <li>3、子公司下可继续添加子公司。</li>\n        <li>4、岗位需配置职务级别，岗位的级别高低和上下级关系均以职务级别及上级岗位设置为准。</li>\n        <li>5、董事长岗位仅可选择上级公司（子公司或总公司）各部门的所有岗位为上级岗位。</li>\n        <li>6、非董事长岗位仅可选择当前父级部门及本部门内级别更高的岗位为上级岗位。</li>\n        <li><br/></li>\n        <li><b>特别说明：</b>董事长相关逻辑为固定写死，职务等级“董事长”的表述请勿修改。</li>\n      </ul>\n    <div style=\"height: 10px\"></div>\n  </a-modal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { inject, nextTick, ref, unref, defineEmits, h } from 'vue';\n  import { useModal } from '/@/components/Modal';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useMethods } from '/@/hooks/system/useMethods';\n  import { Api, deleteBatchDepart, queryDepartAndPostTreeSync, updateChangeDepart } from '../depart.api';\n  import { searchByKeywords } from '/@/views/system/departUser/depart.user.api';\n  import DepartFormModal from '/@/views/system/depart/components/DepartFormModal.vue';\n  import { Modal, Popconfirm } from 'ant-design-vue';\n  import TreeIcon from \"@/components/Form/src/jeecg/components/TreeIcon/TreeIcon.vue\";\n\n  const prefixCls = inject('prefixCls');\n  const emit = defineEmits(['select', 'rootTreeData']);\n  const { createMessage } = useMessage();\n  const { handleImportXls, handleExportXls } = useMethods();\n  const props = defineProps({\n    //是否为租户部门\n    isTenantDepart: { default: false, type: Boolean },\n    //当前登录租户\n    loginTenantName: { default: \"\", type: String },\n  })\n\n  const loading = ref<boolean>(false);\n  // 部门树列表数据\n  const treeData = ref<any[]>([]);\n  // 当前选中的项\n  const checkedKeys = ref<any[]>([]);\n  // 当前展开的项\n  const expandedKeys = ref<any[]>([]);\n  // 当前选中的项\n  const selectedKeys = ref<any[]>([]);\n  // 树组件重新加载\n  const treeReloading = ref<boolean>(false);\n  // 树父子是否关联\n  const checkStrictly = ref<boolean>(true);\n  // 当前选中的部门\n  const currentDepart = ref<any>(null);\n  // 控制确认删除提示框是否显示\n  const visibleTreeKey = ref<any>(null);\n  // 搜索关键字\n  const searchKeyword = ref('');\n  // 提示弹窗是否显示\n  const tipShow = ref<boolean>(false);\n\n  // 注册 modal\n  const [registerModal, { openModal }] = useModal();\n\n  // 加载顶级部门信息\n  async function loadRootTreeData() {\n    try {\n      loading.value = true;\n      treeData.value = [];\n      const result = await queryDepartAndPostTreeSync();\n      if (Array.isArray(result)) {\n        treeData.value = result;\n      }\n      if (expandedKeys.value.length === 0) {\n        autoExpandParentNode();\n      } else {\n        if (selectedKeys.value.length === 0) {\n          let item = treeData.value[0];\n          if (item) {\n            // 默认选中第一个\n            setSelectedKey(item.id, item);\n          }\n        } else {\n          emit('select', currentDepart.value);\n        }\n      }\n      emit('rootTreeData', treeData.value);\n    } finally {\n      loading.value = false;\n    }\n  }\n\n  loadRootTreeData();\n\n  // 加载子级部门信息\n  async function loadChildrenTreeData(treeNode) {\n    try {\n      const result = await queryDepartAndPostTreeSync({\n        pid: treeNode.dataRef.id,\n      });\n      if (result.length == 0) {\n        treeNode.dataRef.isLeaf = true;\n      } else {\n        treeNode.dataRef.children = result;\n        if (expandedKeys.value.length > 0) {\n          // 判断获取的子级是否有当前展开的项\n          let subKeys: any[] = [];\n          for (let key of expandedKeys.value) {\n            if (result.findIndex((item) => item.id === key) !== -1) {\n              subKeys.push(key);\n            }\n          }\n          if (subKeys.length > 0) {\n            expandedKeys.value = [...expandedKeys.value];\n          }\n        }\n      }\n      treeData.value = [...treeData.value];\n      emit('rootTreeData', treeData.value);\n    } catch (e) {\n      console.error(e);\n    }\n    return Promise.resolve();\n  }\n\n  // 自动展开父节点，只展开一级\n  function autoExpandParentNode() {\n    let item = treeData.value[0];\n    if (item) {\n      if (!item.isLeaf) {\n        expandedKeys.value = [item.key];\n      }\n      // 默认选中第一个\n      setSelectedKey(item.id, item);\n      reloadTree();\n    } else {\n      emit('select', null);\n    }\n  }\n\n  // 重新加载树组件，防止无法默认展开数据\n  async function reloadTree() {\n    await nextTick();\n    treeReloading.value = true;\n    await nextTick();\n    treeReloading.value = false;\n  }\n\n  /**\n   * 设置当前选中的行\n   */\n  function setSelectedKey(key: string, data?: object) {\n    selectedKeys.value = [key];\n    if (data) {\n      currentDepart.value = data;\n      emit('select', data);\n    }\n  }\n\n  // 添加一级部门\n  function onAddDepart() {\n    openModal(true, { isUpdate: false, isChild: false });\n  }\n\n  // 添加子级部门\n  function onAddChildDepart(data = currentDepart.value) {\n    if (data == null) {\n      createMessage.warning('请先选择一个部门');\n      return;\n    }\n    if(data.orgCategory === '3'){\n      createMessage.warning('岗位下无法添加子级！');\n      return;\n    }\n    const record = { parentId: data.id, orgCategory: data.orgCategory };\n    openModal(true, { isUpdate: false, isChild: true, record });\n  }\n\n  // 搜索事件\n  async function onSearch(value: string) {\n    if (value) {\n      try {\n        loading.value = true;\n        treeData.value = [];\n        let result = await searchByKeywords({ keyWord: value, orgCategory: \"1,2,3,4\" });\n        if (Array.isArray(result)) {\n          treeData.value = result;\n        }\n        autoExpandParentNode();\n      } finally {\n        loading.value = false;\n      }\n    } else {\n      loadRootTreeData();\n    }\n    searchKeyword.value = value;\n  }\n\n  // 树复选框选择事件\n  function onCheck(e) {\n    if (Array.isArray(e)) {\n      checkedKeys.value = e;\n    } else {\n      checkedKeys.value = e.checked;\n    }\n  }\n\n  // 树选择事件\n  function onSelect(selKeys, event) {\n    console.log('select: ', selKeys, event);\n    if (selKeys.length > 0 && selectedKeys.value[0] !== selKeys[0]) {\n      setSelectedKey(selKeys[0], event.selectedNodes[0]);\n    } else {\n      // 这样可以防止用户取消选择\n      setSelectedKey(selectedKeys.value[0]);\n    }\n  }\n\n  /**\n   * 根据 ids 删除部门\n   * @param idListRef array\n   * @param confirm 是否显示确认提示框\n   */\n  async function doDeleteDepart(idListRef, confirm = true) {\n    const idList = unref(idListRef);\n    if (idList.length > 0) {\n      try {\n        loading.value = true;\n        await deleteBatchDepart({ ids: idList.join(',') }, confirm);\n        await loadRootTreeData();\n      } finally {\n        loading.value = false;\n      }\n    }\n  }\n\n  // 删除单个部门\n  async function onDelete(data) {\n    if (data) {\n      onVisibleChange(false);\n      doDeleteDepart([data.id], false);\n    }\n  }\n\n  // 批量删除部门\n  async function onDeleteBatch() {\n    try {\n      await doDeleteDepart(checkedKeys);\n      checkedKeys.value = [];\n    } finally {\n    }\n  }\n\n  function onVisibleChange(visible) {\n    if (!visible) {\n      visibleTreeKey.value = null;\n    }\n  }\n\n  function onImportXls(d) {\n    handleImportXls(d, Api.importExcelUrl, () => {\n      loadRootTreeData();\n    });\n  }\n\n  function onExportXls() {\n    // 代码逻辑说明: 【TV360X-1671】部门管理不支持选中的记录导出---\n    let params = {}\n    if(checkedKeys.value && checkedKeys.value.length > 0) {\n      params['selections'] = checkedKeys.value.join(',')\n    }\n    handleExportXls('部门信息', Api.exportXlsUrl,params);\n  }\n\n  /**\n   * 拖拽开始时，只关闭被拖拽的当前节点\n   * \n   * @param info\n   */\n  function onDragStart(info: any) {\n    const dragKey = info.node?.key;\n    if (!dragKey){\n      return;\n    }\n    // 只关闭被拖拽的当前节点，不关闭其子节点\n    if (expandedKeys.value.includes(dragKey)) {\n      expandedKeys.value = expandedKeys.value.filter(key => key !== dragKey);\n    }\n  }\n  \n  /**\n   * 拖拽结束\n   * @param info\n   */\n  function onDrop (info){\n    const dropKey = info.node.key;\n    const dragKey = info.dragNode.key;\n    const dropPos = info.node.pos.split('-');\n    const dropPosition = info.dropPosition - Number(dropPos[dropPos.length - 1]);\n    const dropTitle = info.node.title;\n    const dragTitle = info.dragNode.title;\n    //禁止拖拽到子节点\n    if (isDescendant(info.dragNode, info.node.key)) {\n      createMessage.warning('不能拖拽到自身后代');\n      return;\n    }\n    if(dropKey === dragKey){\n      createMessage.warning('不能自身拖拽到自身');\n      return;\n    }\n    let pos = \"中\";\n    if(dropPosition === -1){\n      pos = \"上方\";\n    }else if (dropPosition === 1){\n      pos = \"下方\";\n    }\n    let text = \"将【\" + dragTitle + \"】移动到【\" + dropTitle + \"】\" + pos + \"？\";\n    Modal.confirm({\n      title: '确认移动',\n      content: h('div', {}, [\n        h('p', { style: { marginBottom: '12px', fontSize: '14px' } }, text),\n        h('p', { \n          style: { \n            color: '#ff4d4f', \n            fontSize: '13px',\n            margin: '0'\n          } \n        }, '移动后：机构编码会改变，历史业务数据保留原机构编码，此操作不可撤销！')\n      ]),\n      okText: '确认',\n      cancelText: '取消',\n      onOk: () => {\n        updateChangeDepart({ dragId: dragKey, dropId: dropKey, dropPosition: dropPosition, sort: info.dropPosition }).then(res=>{\n          if(res.success){\n            createMessage.success('部门顺序调整成功');\n            //重新加载树\n            treeData.value = [];\n            selectedKeys.value = [];\n            loadRootTreeData();\n          } else {\n            createMessage.error(res.message);\n          }\n        }).catch(e=>{\n          createMessage.error(e.message);\n        })\n      }\n    })\n  }\n\n  /**\n   * 判断目标节点是否在拖拽节点的子树中（避免循环引用）\n   * \n   * @param dragNode\n   * @param targetKey\n   */\n  function isDescendant(dragNode, targetKey) {\n    const stack = [...(dragNode.children ?? [])];\n    while (stack.length) {\n      const node = stack.pop()!;\n      if (node.key === targetKey){\n        return true;\n      }\n      if (node.children){\n        stack.push(...node.children);\n      }\n    }\n    return false;\n  }\n  \n  defineExpose({\n    loadRootTreeData,\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  .departmentalRulesTip{\n    margin: 20px;\n    background-color: #f8f9fb;\n    color: #99a1a9;\n    border-radius: 4px;\n    padding: 12px;\n  }\n  .tenant-name {\n    text-decoration: underline;\n    margin: 5px;\n    font-size: 15px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/depart/components/DepartRankRelation.vue",
    "content": "<template>\n  <a-spin :spinning=\"loading\">\n    <template v-if=\"treeData && treeData.length > 0\">\n      <div style=\"margin-top: 10px;margin-bottom: 10px;display: flex\">\n        <a-button preIcon=\"ant-design:down-outlined\" @click=\"expandAll(true)\" type=\"primary\">展开全部</a-button>\n        <a-button preIcon=\"ant-design:up-outlined\" @click=\"expandAll(false)\" type=\"primary\" style=\"margin-left: 10px\">折叠全部</a-button>\n      </div>\n      <BasicTree\n        :expandedKeys=\"expandedKeys\"\n        :fieldNames=\"{ children: 'children', title: 'title', key: 'value' }\"\n        ref=\"basicTree\"\n        :treeData=\"treeData\"\n        :checkStrictly=\"true\"\n        style=\"height: 500px; overflow: auto\"\n      ></BasicTree>\n    </template>\n    <a-empty v-else description=\"无岗位消息\" />\n  </a-spin>\n</template>\n\n<script lang=\"ts\" setup>\n  import { computed, ref, watch } from 'vue';\n  import { BasicTree } from '/@/components/Tree/index';\n  import { getRankRelation } from '../depart.api';\n\n  const props = defineProps({\n    data: { type: Object, default: () => ({}) },\n  });\n  // 当前选中的部门ID，可能会为空，代表未选择部门\n  const departId = computed(() => props.data?.id);\n\n  const basicTree = ref();\n  const loading = ref<boolean>(false);\n  //树的全部节点信息\n  const treeData = ref<any[]>([]);\n  //选中的key\n  const expandedKeys = ref<any[]>([]);\n  //所有的部门id\n  const departIds = ref<any[]>([]);\n\n  watch(departId, (val) => loadData(val), { immediate: true });\n\n  async function loadData(val) {\n    try {\n      loading.value = true;\n      await getRankRelation({ departId: val }).then((res) => {\n        if (res.success) {\n          treeData.value = res.result;\n          departIds.value = getParentDepartmentIds(res.result);\n        }\n      });\n    } finally {\n      loading.value = false;\n    }\n  }\n\n  /**\n   * 折叠全部\n   *\n   * @param expandAll\n   */\n  async function expandAll(expandAll) {\n    if (!expandAll) {\n      expandedKeys.value = [];\n    } else {\n      expandedKeys.value = departIds.value;\n    }\n  }\n\n  /**\n   * 获取存在子级的部门id\n   * @param departments\n   */\n  function getParentDepartmentIds(departments) {\n    const ids: any = [];\n    departments.forEach((dept) => {\n      // 检查是否有 children 数组且不为空\n      if (dept.children && Array.isArray(dept.children) && dept.children.length > 0) {\n        ids.push(dept.id);\n        // 递归检查子部门是否也有子级\n        ids.push(...getParentDepartmentIds(dept.children));\n      }\n    });\n    return ids;\n  }\n</script>\n\n<style lang=\"less\" scoped>\n  .depart-rule-tree :deep(.scrollbar__bar) {\n    pointer-events: none;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/depart/components/DepartRuleTab.vue",
    "content": "<template>\n  <a-spin :spinning=\"loading\">\n    <template v-if=\"treeData.length > 0\">\n      <BasicTree\n        ref=\"basicTree\"\n        class=\"depart-rule-tree\"\n        checkable\n        :treeData=\"treeData\"\n        :checkedKeys=\"checkedKeys\"\n        :selectedKeys=\"selectedKeys\"\n        :expandedKeys=\"expandedKeys\"\n        :checkStrictly=\"true\"\n        style=\"height: 500px; overflow: auto\"\n        @check=\"onCheck\"\n        @expand=\"onExpand\"\n        @select=\"onSelect\"\n      >\n        <template #title=\"{ slotTitle, ruleFlag }\">\n          <span>{{ slotTitle }}</span>\n          <Icon v-if=\"ruleFlag\" icon=\"ant-design:align-left-outlined\" style=\"margin-left: 5px; color: red\" />\n        </template>\n      </BasicTree>\n    </template>\n    <a-empty v-else description=\"无可配置部门权限\" />\n\n    <div class=\"j-box-bottom-button offset-20\" style=\"margin-top: 30px\">\n      <div class=\"j-box-bottom-button-float\" :class=\"[`${prefixCls}`]\">\n        <a-dropdown :trigger=\"['click']\" placement=\"top\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"3\" @click=\"toggleCheckALL(true)\">{{ t('component.tree.selectAll') }}</a-menu-item>\n              <a-menu-item key=\"4\" @click=\"toggleCheckALL(false)\">{{ t('component.tree.unSelectAll') }}</a-menu-item>\n              <a-menu-item key=\"5\" @click=\"toggleExpandAll(true)\">{{ t('component.tree.expandAll') }}</a-menu-item>\n              <a-menu-item key=\"6\" @click=\"toggleExpandAll(false)\">{{ t('component.tree.unExpandAll') }}</a-menu-item>\n              <a-menu-item key=\"7\" @click=\"toggleRelationAll(false)\">{{ t('component.tree.checkStrictly') }}</a-menu-item>\n              <a-menu-item key=\"8\" @click=\"toggleRelationAll(true)\">{{ t('component.tree.checkUnStrictly') }}</a-menu-item>\n            </a-menu>\n          </template>\n          <a-button style=\"float: left\">\n            树操作\n            <Icon icon=\"ant-design:up-outlined\" />\n          </a-button>\n        </a-dropdown>\n        <a-button type=\"primary\" preIcon=\"ant-design:save-filled\" @click=\"onSubmit\">保存</a-button>\n      </div>\n    </div>\n  </a-spin>\n  <DepartDataRuleDrawer @register=\"registerDataRuleDrawer\" />\n</template>\n\n<script lang=\"ts\" setup>\n  import { watch, computed, inject, ref, nextTick } from 'vue';\n  import { useDrawer } from '/@/components/Drawer';\n  import { BasicTree } from '/@/components/Tree/index';\n  import DepartDataRuleDrawer from './DepartDataRuleDrawer.vue';\n  import { queryRoleTreeList, queryDepartPermission, saveDepartPermission } from '../depart.api';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import { translateTitle } from '/@/utils/common/compUtils';\n  import { DEPART_MANGE_AUTH_CONFIG_KEY } from '/@/enums/cacheEnum';\n  import { useI18n } from '/@/hooks/web/useI18n';\n\n  const { prefixCls } = useDesign('j-depart-form-content');\n  const props = defineProps({\n    data: { type: Object, default: () => ({}) },\n  });\n  // 当前选中的部门ID，可能会为空，代表未选择部门\n  const departId = computed(() => props.data?.id);\n\n  const basicTree = ref();\n  const loading = ref<boolean>(false);\n  //树的全部节点信息\n  const allTreeKeys = ref([]);\n  const treeData = ref<any[]>([]);\n  const expandedKeys = ref<Array<any>>([]);\n  const selectedKeys = ref<Array<any>>([]);\n  const checkedKeys = ref<Array<any>>([]);\n  const lastCheckedKeys = ref<Array<any>>([]);\n  const checkStrictly = ref(false);\n  const { t } = useI18n();\n\n  // 注册数据规则授权弹窗抽屉\n  const [registerDataRuleDrawer, dataRuleDrawer] = useDrawer();\n\n  // onCreated\n  loadData({\n    success: (ids) => {\n      // 代码逻辑说明: 【TV360X-1689】同步系统角色改法加上缓存层级关联等功能\n      const localData = localStorage.getItem(DEPART_MANGE_AUTH_CONFIG_KEY);\n      if (localData) {\n        const obj = JSON.parse(localData);\n        obj.level && toggleRelationAll(obj.level == 'relation' ? false : true);\n        obj.expand && toggleExpandAll(obj.expand == 'openAll' ? true :false);\n      } else {\n        // expandedKeys.value = ids;\n      }\n    }\n  });\n  watch(departId, () => loadDepartPermission(), { immediate: true });\n\n  async function loadData(options: any = {}) {\n    try {\n      loading.value = true;\n      let { treeList, ids } = await queryRoleTreeList();\n      // 代码逻辑说明: 【issues/1169】部门管理功能中的【部门权限】中未翻译 t('') 多语言---\n      treeData.value = translateTitle(treeList);\n      // 代码逻辑说明: 【TV360X-1689】同步系统角色改法加上缓存层级关联等功能\n      allTreeKeys.value = ids;\n      options.success?.(ids);\n    } finally {\n      loading.value = false;\n    }\n  }\n\n  async function loadDepartPermission() {\n    if (departId.value) {\n      try {\n        loading.value = true;\n        let keys = await queryDepartPermission({ departId: departId.value });\n        checkedKeys.value = keys;\n        lastCheckedKeys.value = [...keys];\n      } finally {\n        loading.value = false;\n      }\n    }\n  }\n\n  async function onSubmit() {\n    try {\n      loading.value = true;\n      await saveDepartPermission({\n        departId: departId.value,\n        permissionIds: checkedKeys.value.join(','),\n        lastpermissionIds: lastCheckedKeys.value.join(','),\n      });\n      await loadData();\n      await loadDepartPermission();\n    } finally {\n      loading.value = false;\n    }\n  }\n\n  /**\n   * 点击选中\n   * 2024-07-04\n   * liaozhiyang\n   */\n  function onCheck(o, e) {\n    // checkStrictly: true=>层级独立，false=>层级关联.\n    if (checkStrictly.value) {\n      checkedKeys.value = o.checked ? o.checked : o;\n    } else {\n      const keys = getNodeAllKey(e.node, 'children', 'key');\n      if (e.checked) {\n        // 反复操作下可能会有重复的keys，得用new Set去重下\n        checkedKeys.value = [...new Set([...checkedKeys.value, ...keys])];\n      } else {\n        const result = removeMatchingItems(checkedKeys.value, keys);\n        checkedKeys.value = result;\n      }\n    }\n  }\n  /**\n   * 2024-07-04\n   * liaozhiyang\n   * 删除相匹配数组的项\n   */\n  function removeMatchingItems(arr1, arr2) {\n    // 使用哈希表记录 arr2 中的元素\n    const hashTable = {};\n    for (const item of arr2) {\n      hashTable[item] = true;\n    }\n    // 使用 filter 方法遍历第一个数组，过滤出不在哈希表中存在的项\n    return arr1.filter((item) => !hashTable[item]);\n  }\n  /**\n   * 2024-07-04\n   * liaozhiyang\n   * 获取当前节点及以下所有子孙级的key\n   */\n  function getNodeAllKey(node: any, children: any, key: string) {\n    const result: any = [];\n    result.push(node[key]);\n    const recursion = (data) => {\n      data.forEach((item: any) => {\n        result.push(item[key]);\n        if (item[children]?.length) {\n          recursion(item[children]);\n        }\n      });\n    };\n    node[children]?.length && recursion(node[children]);\n    return result;\n  }\n\n  // tree展开事件\n  function onExpand($expandedKeys) {\n    expandedKeys.value = $expandedKeys;\n  }\n\n  // tree选中事件\n  function onSelect($selectedKeys, { selectedNodes }) {\n    if (selectedNodes[0]?.ruleFlag) {\n      let functionId = $selectedKeys[0];\n      dataRuleDrawer.openDrawer(true, { departId, functionId });\n    }\n    selectedKeys.value = [];\n  }\n\n  // 切换父子关联\n  async function toggleCheckStrictly(flag) {\n    checkStrictly.value = flag;\n    await nextTick();\n    checkedKeys.value = basicTree.value.getCheckedKeys();\n  }\n\n  // 切换展开收起\n  async function toggleExpandAll(flag) {\n    // 代码逻辑说明: 【TV360X-1689】同步系统角色改法加上缓存层级关联等功能\n    if (flag) {\n      expandedKeys.value = allTreeKeys.value;\n      saveLocalOperation('expand', 'openAll');\n    } else {\n      expandedKeys.value = [];\n      saveLocalOperation('expand', 'closeAll');\n    }\n  }\n\n  // 切换全选\n  async function toggleCheckALL(flag) {\n    // 代码逻辑说明: 【TV360X-1689】同步系统角色改法加上缓存层级关联等功能\n    if (flag) {\n      checkedKeys.value = allTreeKeys.value;\n    } else {\n      checkedKeys.value = [];\n    }\n  }\n\n  // 切换层级关联(独立)\n  const toggleRelationAll = (flag) => {\n    // 代码逻辑说明: 【TV360X-1689】同步系统角色改法加上缓存层级关联等功能\n    checkStrictly.value = flag;\n    if (flag) {\n      saveLocalOperation('level', 'standAlone');\n    } else {\n      saveLocalOperation('level', 'relation');\n    }\n  };\n  /**\n   * 2024-07-04\n   * liaozhiyang\n   * 缓存\n   * */\n  const saveLocalOperation = (key, value) => {\n    const localData = localStorage.getItem(DEPART_MANGE_AUTH_CONFIG_KEY);\n    const obj = localData ? JSON.parse(localData) : {};\n    obj[key] = value;\n    localStorage.setItem(DEPART_MANGE_AUTH_CONFIG_KEY, JSON.stringify(obj))\n  };\n</script>\n\n<style lang=\"less\" scoped>\n  // 【VUEN-188】解决滚动条不灵敏的问题\n  .depart-rule-tree :deep(.scrollbar__bar) {\n    pointer-events: none;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/depart/components/DepartUserList.vue",
    "content": "<template>\n  <!--引用表格-->\n  <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n    <!--插槽:table标题-->\n    <template #tableTitle>\n      <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"createUser\" :disabled=\"!orgCode\">新建用户</a-button>\n      <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"selectAddUser\" :disabled=\"!orgCode || props.data?.orgCategory === '3'\"\n        >添加已有用户</a-button\n      >\n    </template>\n    <!-- 插槽：行内操作按钮 -->\n    <template #action=\"{ record }\">\n      <TableAction :actions=\"getTableAction(record)\" />\n    </template>\n  </BasicTable>\n  <UserDrawer @register=\"registerDrawer\" @success=\"onUserDrawerSuccess\" />\n  <UserSelectModal ref=\"userSelectModalRef\" rowKey=\"id\" @register=\"registerSelUserModal\" @getSelectResult=\"onSelectUserOk\" />\n</template>\n\n<script lang=\"ts\" setup>\n  import { computed, inject, ref, watch } from 'vue';\n  import { ActionItem, BasicTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import { useDrawer } from '/@/components/Drawer';\n  import { useListPage } from '/@/hooks/system/useListPage';\n\n  import UserDrawer from '/@/views/system/user/UserDrawer.vue';\n  import UserSelectModal from '/@/components/Form/src/jeecg/components/modal/UserSelectModal.vue';\n  import { queryDepartPostByOrgCode } from '../depart.api';\n  import { ColEx } from '/@/components/Form/src/types';\n  import { userColumns } from '@/views/system/depart/depart.data';\n  import { linkDepartUserBatch } from '@/views/system/departUser/depart.user.api';\n\n  const prefixCls = inject('prefixCls');\n  const props = defineProps({\n    data: { require: true, type: Object },\n  });\n  const userSelectModalRef: any = ref(null);\n  // 当前选中的部门code，可能会为空，代表未选择部门\n  const orgCode = computed(() => props.data?.orgCode);\n  // 当前部门id\n  const departId = computed(() => props.data?.id);\n\n  // 自适应列配置\n  const adaptiveColProps: Partial<ColEx> = {\n    xs: 24, // <576px\n    sm: 24, // ≥576px\n    md: 24, // ≥768px\n    lg: 12, // ≥992px\n    xl: 12, // ≥1200px\n    xxl: 8, // ≥1600px\n  };\n  // 列表页面公共参数、方法\n  const { tableContext, createMessage } = useListPage({\n    tableProps: {\n      api: queryDepartPostByOrgCode,\n      columns: userColumns,\n      canResize: false,\n      rowKey: 'id',\n      formConfig: {\n        // schemas: userInfoSearchFormSchema,\n        baseColProps: adaptiveColProps,\n        labelAlign: 'left',\n        labelCol: {\n          xs: 24,\n          sm: 24,\n          md: 24,\n          lg: 9,\n          xl: 7,\n          xxl: 5,\n        },\n        // 操作按钮配置\n        actionColOptions: {\n          ...adaptiveColProps,\n          style: { textAlign: 'left' },\n        },\n      },\n      tableSetting: { cacheKey: 'depart_user_userInfo' },\n      // 请求之前对参数做处理\n      beforeFetch(params) {\n        return Object.assign(params, { orgCode: orgCode.value });\n      },\n      immediate: !!orgCode.value,\n    },\n  });\n\n  // 注册 ListTable\n  const [registerTable, { reload, setProps, setLoading, updateTableDataRecord }, { rowSelection, selectedRowKeys }] = tableContext;\n\n  watch(\n    () => props.data,\n    () => reload()\n  );\n  //注册drawer\n  const [registerDrawer, { openDrawer, setDrawerProps }] = useDrawer();\n  const [registerUserAuthDrawer, userAuthDrawer] = useDrawer();\n  // 注册用户选择 modal\n  const [registerSelUserModal, selUserModal] = useModal();\n\n  // 清空选择的行\n  function clearSelection() {\n    selectedRowKeys.value = [];\n  }\n\n  // 创建用户\n  async function createUser() {\n    if (!departId.value) {\n      createMessage.warning('请先选择一个部门');\n    } else {\n      let mainDepPostId = '';\n      let selecteddeparts = departId.value;\n      if (props.data?.orgCategory === '3') {\n        mainDepPostId = departId.value;\n        selecteddeparts = props.data.parentId;\n      }\n      openDrawer(true, {\n        isUpdate: false,\n        // 初始化负责部门\n        nextDepartOptions: { value: props.data?.key, label: props.data?.title },\n        //初始化岗位\n        record: {\n          mainDepPostId: mainDepPostId,\n          activitiSync: 1,\n          userIdentity: 1,\n          selecteddeparts: selecteddeparts,\n        },\n      });\n    }\n  }\n\n  // 查看用户详情\n  function showUserDetail(record) {\n    record.activitiSync = record.activitiSync? Number(record.activitiSync) : 1;\n    openDrawer(true, {\n      record,\n      isUpdate: true,\n      showFooter: false,\n    });\n  }\n\n  // 编辑用户信息\n  function editUserInfo(record) {\n    record.activitiSync = record.activitiSync? Number(record.activitiSync) : 1;\n    openDrawer(true, { isUpdate: true, record, departDisabled: true, departPostDisabled: true });\n  }\n\n  // 选择添加已有用户\n  function selectAddUser() {\n    userSelectModalRef.value.rowSelection.selectedRowKeys = [];\n    selUserModal.openModal();\n  }\n\n  // 选择用户成功\n  async function onSelectUserOk(options, userIdList) {\n    if (userIdList.length > 0) {\n      try {\n        setLoading(true);\n        await linkDepartUserBatch(departId.value, userIdList);\n        reload();\n      } finally {\n        setLoading(false);\n      }\n    }\n  }\n\n  /**\n   * 用户抽屉表单成功回调\n   */\n  function onUserDrawerSuccess({ isUpdate, values }) {\n    isUpdate ? updateTableDataRecord(values.id, values) : reload();\n  }\n\n  /**\n   * 操作栏\n   */\n  function getTableAction(record): ActionItem[] {\n    return [\n      { label: '编辑', onClick: editUserInfo.bind(null, record) },\n      { label: '详情', onClick: showUserDetail.bind(null, record) },\n    ];\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/depart/components/DepartmentHeadList.vue",
    "content": "<!-- 部门负责人页面 -->\n<template>\n  <!--引用表格-->\n  <BasicTable @register=\"registerTable\"></BasicTable>\n</template>\n\n<script setup lang=\"ts\" name=\"DepartmentHeadList\">\n  import { BasicTable } from '@/components/Table';\n  import { useListPage } from '@/hooks/system/useListPage';\n  import { userColumns } from '@/views/system/depart/depart.data';\n  import { getDepartmentHead } from '../depart.api';\n  import { computed, watch } from 'vue';\n  const props = defineProps({\n    data: { require: true, type: Object },\n  });\n  // 当前部门id\n  const departId = computed(() => props.data?.id);\n \n  // 列表页面公共参数、方法\n  const { tableContext } = useListPage({\n    tableProps: {\n      api: getDepartmentHead,\n      columns: userColumns,\n      canResize: false,\n      rowKey: 'id',\n      tableSetting: { cacheKey: 'depart_head_list' },\n      // 请求之前对参数做处理\n      beforeFetch(params) {\n        return Object.assign(params, { departId: departId.value });\n      },\n      showActionColumn: false,\n      immediate: !!departId.value,\n    },\n  });\n  // 注册 ListTable\n  const [registerTable, { reload }] = tableContext;\n\n  watch(\n    () => props.data,\n    () => reload()\n  );\n</script>\n\n<style scoped lang=\"less\"></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/depart/depart.api.ts",
    "content": "import { unref } from 'vue';\nimport { defHttp } from '/@/utils/http/axios';\nimport { useMessage } from '/@/hooks/web/useMessage';\n\nconst { createConfirm } = useMessage();\n\nexport enum Api {\n  queryDepartTreeSync = '/sys/sysDepart/queryDepartTreeSync',\n  save = '/sys/sysDepart/add',\n  edit = '/sys/sysDepart/edit',\n  delete = '/sys/sysDepart/delete',\n  deleteBatch = '/sys/sysDepart/deleteBatch',\n  exportXlsUrl = '/sys/sysDepart/exportXls',\n  importExcelUrl = '/sys/sysDepart/importExcel',\n\n  roleQueryTreeList = '/sys/role/queryTreeList',\n  queryDepartPermission = '/sys/permission/queryDepartPermission',\n  saveDepartPermission = '/sys/permission/saveDepartPermission',\n\n  dataRule = '/sys/sysDepartPermission/datarule',\n\n  getCurrentUserDeparts = '/sys/user/getCurrentUserDeparts',\n  selectDepart = '/sys/selectDepart',\n  getUpdateDepartInfo = '/sys/user/getUpdateDepartInfo',\n  doUpdateDepartInfo = '/sys/user/doUpdateDepartInfo',\n  changeDepartChargePerson = '/sys/user/changeDepartChargePerson',\n  //根据部门id获取岗位信息\n  getPositionByDepartId = '/sys/sysDepart/getPositionByDepartId',\n  //根据部门id获取岗位上下级关系\n  getRankRelation = '/sys/sysDepart/getRankRelation',\n  //异步获取部门和岗位\n  queryDepartAndPostTreeSync = '/sys/sysDepart/queryDepartAndPostTreeSync',\n  //获取部门和岗位下的成员\n  queryDepartPostByOrgCode = '/sys/user/queryDepartPostByOrgCode',\n  //更新拖拽部门后的位置\n  updateChangeDepart = '/sys/sysDepart/updateChangeDepart',\n  //获取负责部门\n  getDepartmentHead = '/sys/sysDepart/getDepartmentHead',\n}\n\n/**\n * 获取部门树列表\n */\nexport const queryDepartTreeSync = (params?) => defHttp.get({ url: Api.queryDepartTreeSync, params });\n\n/**\n * 获取部门和岗位树列表\n */\nexport const queryDepartAndPostTreeSync = (params?) => defHttp.get({ url: Api.queryDepartAndPostTreeSync, params });\n\n/**\n * 保存或者更新部门角色\n */\nexport const saveOrUpdateDepart = (params, isUpdate) => {\n  if (isUpdate) {\n    return defHttp.put({ url: Api.edit, params });\n  } else {\n    return defHttp.post({ url: Api.save, params });\n  }\n};\n\n/**\n * 批量删除部门角色\n */\nexport const deleteBatchDepart = (params, confirm = false) => {\n  return new Promise((resolve, reject) => {\n    const doDelete = () => {\n      resolve(defHttp.delete({ url: Api.deleteBatch, params }, { joinParamsToUrl: true }));\n    };\n    if (confirm) {\n      createConfirm({\n        iconType: 'warning',\n        title: '删除',\n        content: '确定要删除吗？',\n        onOk: () => doDelete(),\n        onCancel: () => reject(),\n      });\n    } else {\n      doDelete();\n    }\n  });\n};\n\n/**\n * 获取权限树列表\n */\nexport const queryRoleTreeList = (params?) => defHttp.get({ url: Api.roleQueryTreeList, params });\n/**\n * 查询部门权限\n */\nexport const queryDepartPermission = (params?) => defHttp.get({ url: Api.queryDepartPermission, params });\n/**\n * 保存部门权限\n */\nexport const saveDepartPermission = (params) => defHttp.post({ url: Api.saveDepartPermission, params });\n\n/**\n *  查询部门数据权限列表\n */\nexport const queryDepartDataRule = (functionId, departId, params?) => {\n  let url = `${Api.dataRule}/${unref(functionId)}/${unref(departId)}`;\n  return defHttp.get({ url, params });\n};\n/**\n * 保存部门数据权限\n */\nexport const saveDepartDataRule = (params) => defHttp.post({ url: Api.dataRule, params });\n/**\n * 获取登录用户部门信息\n */\nexport const getUserDeparts = (params?) => defHttp.get({ url: Api.getCurrentUserDeparts, params });\n/**\n * 切换选择部门\n */\nexport const selectDepart = (params?) => defHttp.put({ url: Api.selectDepart, params });\n\n/**\n * 编辑部门前获取部门相关信息\n * @param id\n */\nexport const getUpdateDepartInfo = (id) => defHttp.get({ url: Api.getUpdateDepartInfo, params: {id} });\n\n/**\n * 编辑部门\n * @param params\n */\nexport const doUpdateDepartInfo = (params) => defHttp.put({ url: Api.doUpdateDepartInfo, params });\n\n/**\n * 删除部门\n * @param id\n */\nexport const deleteDepart = (id) => defHttp.delete({ url: Api.delete, params:{ id } }, { joinParamsToUrl: true });\n\n/**\n * 设置负责人 取消负责人\n * @param params\n */\nexport const changeDepartChargePerson = (params) => defHttp.put({ url: Api.changeDepartChargePerson, params });\n\n/**\n * 根据部门id获取岗位信息\n */\nexport const getPositionByDepartId = (params) => defHttp.get({ url: Api.getPositionByDepartId, params }, { isTransformResponse: false });\n\n/**\n * 根据部门id获取岗位上下级关系\n * @param params\n */\nexport const getRankRelation = (params) => defHttp.get({ url: Api.getRankRelation, params }, { isTransformResponse: false });\n\n/**\n * 根据部门或岗位编码获取通讯录成员\n * \n * @param params\n */\nexport const queryDepartPostByOrgCode = (params) => defHttp.get({ url: Api.queryDepartPostByOrgCode, params });\n\n/**\n * 更新拖拽部门后的位置\n * \n * @param params\n */\nexport const updateChangeDepart = (params) => defHttp.put({ url: Api.updateChangeDepart, params },{ isTransformResponse: false });\n\n/**\n * 获取负责部门\n * \n * @param params\n */\nexport const getDepartmentHead = (params) => defHttp.get({ url: Api.getDepartmentHead, params });"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/depart/depart.data.ts",
    "content": "import { FormSchema } from '/@/components/Form';\nimport { getPositionByDepartId } from \"./depart.api\";\nimport { useMessage } from \"@/hooks/web/useMessage\";\nimport { BasicColumn } from \"@/components/Table\";\nimport {\n  getDepartName,\n  getDepartPathName,\n  getDepartPathNameByOrgCode,\n  getMultiDepartPathName\n} from '@/utils/common/compUtils';\nimport { h, ref } from 'vue';\n\nconst { createMessage: $message } = useMessage();\n//部门名称\nconst departNamePath = ref<Record<string, string>>({});\n\n// 部门基础表单\nexport function useBasicFormSchema(treeData) {\n  const basicFormSchema: FormSchema[] = [\n    {\n      field: 'departName',\n      label: '机构名称',\n      component: 'Input',\n      componentProps: {\n        placeholder: '请输入机构/部门名称',\n      },\n      rules: [{ required: true, message: '机构名称不能为空' }],\n    },\n    {\n      field: 'departNameAbbr',\n      label: '机构简称',\n      component: 'Input',\n      componentProps: {\n        placeholder: '请输入机构/部门简称',\n      }\n    },\n    {\n      field: 'parentId',\n      label: '上级部门',\n      component: 'TreeSelect',\n      componentProps: {\n        treeData: [],\n        placeholder: '无',\n        treeCheckAble: true,\n        multiple: true,\n        dropdownStyle: { maxHeight: '200px', overflow: 'auto' },\n        tagRender: (options) => {\n          const { value, label, option } = options;\n          if (departNamePath.value[value]) {\n            return h(\n                'span', {  style: { marginLeft: '10px' } },\n                departNamePath.value[value]\n            );\n          }\n          getDepartPathNameByOrgCode('', label, option.id).then((data) => {\n            departNamePath.value[value] = data;\n          });\n        },\n      },\n    },\n    {\n      field: 'orgCode',\n      label: '机构编码',\n      component: 'Input',\n      componentProps: {\n        placeholder: '请输入机构编码',\n      },\n    },\n    {\n      field: 'orgCategory',\n      label: '机构类型',\n      component: 'RadioButtonGroup',\n      componentProps: { options: [] },\n    },\n    {\n      field: 'positionId',\n      label: '职务级别',\n      component: 'JDictSelectTag',\n      componentProps: ({ formModel, formActionType }) => {\n        return {\n          dictCode: \"sys_position,name,id, 1=1 order by post_level asc\",\n          getPopupContainer: ()=> document.body,\n          onChange: (value) => {\n            formModel.depPostParentId = \"\";\n            return positionChange(value, formModel, treeData);\n          },\n        }\n      },\n      ifShow:({ values })=>{\n        return values.orgCategory === '3'\n      },\n      required: true,\n    },\n    {\n      field: 'depPostParentId',\n      label: '上级岗位',\n      component: 'TreeSelect',\n      ifShow:({ values })=>{\n        return values.orgCategory === '3'\n      },\n      slot: 'depPostParentId',\n    },\n    {\n      field: 'departOrder',\n      label: '排序',\n      component: 'InputNumber',\n      componentProps: {},\n    },\n    {\n      field: 'mobile',\n      label: '电话',\n      component: 'Input',\n      componentProps: {\n        placeholder: '请输入电话',\n      },\n      ifShow:({ values })=>{\n        return values.orgCategory !== '3'\n      },\n    },\n    {\n      field: 'fax',\n      label: '传真',\n      component: 'Input',\n      componentProps: {\n        placeholder: '请输入传真',\n      },\n      ifShow:({ values })=>{\n        return values.orgCategory !== '3'\n      },\n    },\n    {\n      field: 'address',\n      label: '地址',\n      component: 'Input',\n      componentProps: {\n        placeholder: '请输入地址',\n      },\n      ifShow:({ values })=>{\n        return values.orgCategory !== '3'\n      },\n    },\n    {\n      field: 'memo',\n      label: '备注',\n      component: 'InputTextArea',\n      componentProps: {\n        placeholder: '请输入备注',\n      },\n      ifShow:({ values })=>{\n        return values.orgCategory !== '3'\n      },\n    },\n    {\n      field: 'id',\n      label: 'ID',\n      component: 'Input',\n      show: false,\n    },\n  ];\n  return { basicFormSchema };\n}\n\n// 机构类型选项\nexport const orgCategoryOptions = {\n  // 一级部门\n  root: [{ value: '1', label: '公司' }],\n  // 子级部门\n  child: [\n    { value: '4', label: '子公司' },\n    { value: '2', label: '部门' },\n    { value: '3', label: '岗位' },\n  ],\n  //部门岗位\n  childDepartPost: [\n    { value: '2', label: '部门' },\n    { value: '3', label: '岗位' },\n  ],\n  //岗位\n  childPost: [\n    { value: '3', label: '岗位' },\n  ]\n};\n\n/**\n * 用户列表\n */\nexport const userColumns: BasicColumn[] = [\n  {\n    title: '姓名',\n    dataIndex: 'realname',\n    width: 150,\n  },\n  {\n    title: '手机',\n    width: 150,\n    dataIndex: 'phone',\n    customRender:( { record, text })=>{\n      if(record.izHideContact && record.izHideContact === '1'){\n        return '/';\n      }\n      return text;\n    }\n  },\n  {\n    title: '主岗位',\n    dataIndex: 'mainDepPostId',\n    customRender: ({ record, text })=>{\n      if(!text){\n        return '';\n      }\n      return getDepartName(getDepartPathName(record.mainDepPostId_dictText,text,false));\n    },\n    width: 200,\n  },\n  {\n    title: '兼职岗位',\n    dataIndex: 'otherDepPostId',\n    customRender: ({ record, text })=>{\n      if(!text){\n        return '';\n      }\n      return getDepartName(getMultiDepartPathName(record.otherDepPostId_dictText,text));\n    },\n    width: 200,\n  },\n];\n\n/**\n * 职位改变事件\n * @param value\n * @param model\n * @param treeData\n */\nexport function positionChange(value, model, treeData) {\n  if(value && model.parentId){\n    getPositionByDepartId({ parentId: model.parentId, departId: model.id ? model.id:'', positionId: value }).then((res) =>{\n      if(res.success){\n        treeData.value = res.result;\n      }else{\n        treeData.value = [];\n        $message.warning(res.message);\n      }\n    });\n  } else {\n    treeData.value = [];\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/depart/index.less",
    "content": "//noinspection LessUnresolvedVariable\n@prefix-cls: ~'@{namespace}-depart-manage';\n\n.@{prefix-cls} {\n  // update-begin-author:liusq date:20230625 for: [issues/563]暗色主题部分失效\n  background: @component-background;\n  // update-end-author:liusq date:20230625 for: [issues/563]暗色主题部分失效\n\n  &--box {\n    .ant-tabs-nav {\n      padding: 0 20px;\n    }\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/depart/index.vue",
    "content": "<template>\n  <a-row :class=\"['p-4', `${prefixCls}--box`]\" type=\"flex\" :gutter=\"10\">\n    <a-col :xl=\"10\" :lg=\"24\" :md=\"24\" style=\"margin-bottom: 10px\">\n      <DepartLeftTree ref=\"leftTree\" @select=\"onTreeSelect\" @rootTreeData=\"onRootTreeData\" />\n    </a-col>\n    <a-col :xl=\"14\" :lg=\"24\" :md=\"24\" style=\"margin-bottom: 10px\">\n      <div style=\"height: 100%;\" :class=\"[`${prefixCls}`]\">\n        <a-tabs v-show=\"departData != null\" defaultActiveKey=\"base-info\">\n          <a-tab-pane tab=\"基本信息\" key=\"base-info\" forceRender style=\"position: relative\">\n            <div style=\"padding: 20px\">\n              <DepartFormTab :data=\"departData\" :rootTreeData=\"rootTreeData\" @success=\"onSuccess\" />\n            </div>\n          </a-tab-pane>\n          <a-tab-pane tab=\"部门权限\" key=\"role-info\">\n            <div style=\"padding: 0 20px 20px\">\n              <DepartRuleTab :data=\"departData\" />\n            </div>\n          </a-tab-pane>\n          <a-tab-pane tab=\"职级汇报关系\" key=\"rank\">\n            <div style=\"padding: 0 20px 20px\">\n              <DepartRankRelation :data=\"departData\" />\n            </div>\n          </a-tab-pane>\n          <a-tab-pane tab=\"用户列表\" key=\"user\">\n            <div style=\"padding: 0 20px 20px\">\n              <DepartUserList :data=\"departData\" :key=\"reRender\"></DepartUserList>\n            </div>\n          </a-tab-pane>\n          <a-tab-pane tab=\"部门负责人\" key=\"departmentHead\">\n            <DepartmentHeadList :data=\"departData\"></DepartmentHeadList>\n          </a-tab-pane>\n        </a-tabs>\n        <div v-show=\"departData == null\" style=\"padding-top: 40px\">\n          <a-empty description=\"尚未选择部门\" />\n        </div>\n      </div>\n    </a-col>\n  </a-row>\n</template>\n\n<script lang=\"ts\" setup name=\"system-depart\">\n  import { provide, ref } from 'vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import DepartLeftTree from './components/DepartLeftTree.vue';\n  import DepartFormTab from './components/DepartFormTab.vue';\n  import DepartRuleTab from './components/DepartRuleTab.vue';\n  import DepartRankRelation from './components/DepartRankRelation.vue';\n  import DepartUserList from './components/DepartUserList.vue';\n  import DepartmentHeadList from './components/DepartmentHeadList.vue';\n\n  const { prefixCls } = useDesign('depart-manage');\n  provide('prefixCls', prefixCls);\n\n  // 给子组件定义一个ref变量\n  const leftTree = ref();\n\n  // 当前选中的部门信息\n  const departData = ref({});\n  const rootTreeData = ref<any[]>([]);\n  const reRender = ref(-1);\n\n  // 左侧树选择后触发\n  function onTreeSelect(data) {\n    console.log('onTreeSelect: ', data);\n    if (reRender.value == -1) {\n      // 重新渲染组件\n      reRender.value = Math.random();\n    }\n    departData.value = data;\n  }\n\n  // 左侧树rootTreeData触发\n  function onRootTreeData(data) {\n    rootTreeData.value = data;\n  }\n\n  function onSuccess() {\n    leftTree.value.loadRootTreeData();\n  }\n</script>\n\n<style lang=\"less\">\n  @import './index.less';\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/departUser/components/DepartBaseInfoTab.vue",
    "content": "<template>\n  <Description @register=\"registerDesc\" />\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, inject, onMounted, watch } from 'vue';\n  import { queryIdTree } from '../depart.user.api';\n  import { useBaseInfoForm } from '../depart.user.data';\n  import { Description, useDescription } from '/@/components/Description/index';\n\n  const prefixCls = inject('prefixCls');\n  const props = defineProps({\n    data: { require: true, type: Object },\n  });\n  const treeData = ref([]);\n  const { descItems } = useBaseInfoForm(treeData);\n\n  const [registerDesc, { setDescProps }] = useDescription({\n    data: props.data,\n    schema: descItems,\n    column: 1,\n    labelStyle: {\n      width: '180px',\n    },\n  });\n\n  function setData(data) {\n    setDescProps({ data });\n  }\n\n  onMounted(() => {\n    watch(\n      () => props.data,\n      () => setData(props.data),\n      { immediate: true }\n    );\n  });\n  // 动态查询 parentId 组件的 treeData\n  queryIdTree().then((data) => (treeData.value = data));\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/departUser/components/DepartRoleAuthDrawer.vue",
    "content": "<template>\n  <BasicDrawer\n    :width=\"650\"\n    :loading=\"loading\"\n    showFooter\n    okText=\"保存并关闭\"\n    @ok=\"onSubmit(true)\"\n    @close=\"onClose\"\n    @register=\"registerDrawer\"\n  >\n    <template #title>\n      部门角色权限配置\n      <a-dropdown>\n        <Icon icon=\"ant-design:more-outlined\" class=\"more-icon\" />\n        <template #overlay>\n          <a-menu @click=\"treeMenuClick\">\n            <a-menu-item key=\"checkAll\">{{ t('component.tree.selectAll') }}</a-menu-item>\n            <a-menu-item key=\"cancelCheck\">{{ t('component.tree.unSelectAll') }}</a-menu-item>\n            <div class=\"line\"></div>\n            <a-menu-item key=\"openAll\">{{ t('component.tree.expandAll') }}</a-menu-item>\n            <a-menu-item key=\"closeAll\">{{ t('component.tree.unExpandAll') }}</a-menu-item>\n            <div class=\"line\"></div>\n            <a-menu-item key=\"relation\">{{ t('component.tree.checkStrictly') }}</a-menu-item>\n            <a-menu-item key=\"standAlone\">{{ t('component.tree.checkUnStrictly') }}</a-menu-item>\n          </a-menu>\n        </template>\n      </a-dropdown>\n    </template>\n    <div>\n      <a-spin :spinning=\"loading\">\n        <template v-if=\"treeData.length > 0\">\n          <BasicTree\n            title=\"所拥有的部门权限\"\n            checkable\n            :treeData=\"treeData\"\n            :checkedKeys=\"checkedKeys\"\n            :selectedKeys=\"selectedKeys\"\n            :expandedKeys=\"expandedKeys\"\n            :checkStrictly=\"true\"\n            :clickRowToExpand=\"false\"\n            @check=\"onCheck\"\n            @expand=\"onExpand\"\n            @select=\"onSelect\"\n          >\n            <template #title=\"{ slotTitle, ruleFlag }\">\n              <span>{{ slotTitle }}</span>\n              <Icon v-if=\"ruleFlag\" icon=\"ant-design:align-left-outlined\" style=\"margin-left: 5px; color: red\" />\n            </template>\n          </BasicTree>\n        </template>\n        <a-empty v-else description=\"无可配置部门权限\" />\n      </a-spin>\n    </div>\n\n    <template #centerFooter>\n      <a-button type=\"primary\" :loading=\"loading\" ghost @click=\"onSubmit(false)\">仅保存</a-button>\n    </template>\n  </BasicDrawer>\n  <DepartRoleDataRuleDrawer @register=\"registerDataRuleDrawer\" />\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref } from 'vue';\n\n  import { BasicTree } from '/@/components/Tree/index';\n  import { BasicDrawer, useDrawer, useDrawerInner } from '/@/components/Drawer';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import DepartRoleDataRuleDrawer from './DepartRoleDataRuleDrawer.vue';\n  import { queryTreeListForDeptRole, queryDeptRolePermission, saveDeptRolePermission } from '../depart.user.api';\n  import { translateTitle } from \"@/utils/common/compUtils\";\n  import { DEPART_ROLE_AUTH_CONFIG_KEY } from '/@/enums/cacheEnum';\n\n  defineEmits(['register']);\n  const { createMessage } = useMessage();\n  const loading = ref(false);\n  const departId = ref('');\n  const roleId = ref('');\n  const treeData = ref<Array<any>>([]);\n  const checkedKeys = ref<Array<any>>([]);\n  const lastCheckedKeys = ref<Array<any>>([]);\n  const expandedKeys = ref<Array<any>>([]);\n  const selectedKeys = ref<Array<any>>([]);\n  const allTreeKeys = ref<Array<any>>([]);\n  //父子节点选中状态是否关联 true不关联，false关联\n  const checkStrictly = ref(false);\n  const { t } = useI18n();\n\n  // 注册抽屉组件\n  const [registerDrawer, { closeDrawer }] = useDrawerInner((data) => {\n    roleId.value = data.record.id;\n    departId.value = data.record.departId;\n    loadData({\n      success: (ids) => {\n        // 代码逻辑说明: 【TV360X-1619】同步系统角色改法加上缓存，默认层级关联修正原生层级关联bug\n        const localData = localStorage.getItem(DEPART_ROLE_AUTH_CONFIG_KEY);\n        if (localData) {\n          const obj = JSON.parse(localData);\n          obj.level && treeMenuClick({ key: obj.level });\n          obj.expand && treeMenuClick({ key: obj.expand });\n        } else {\n          // expandedKeys.value = ids;\n        }\n      },\n    });\n  });\n  // 注册数据规则授权弹窗抽屉\n  const [registerDataRuleDrawer, dataRuleDrawer] = useDrawer();\n\n  async function loadData(options: any = {}) {\n    try {\n      loading.value = true;\n      // 用户角色授权功能，查询菜单权限树\n      const { ids, treeList } = await queryTreeListForDeptRole({ departId: departId.value });\n      if (ids.length > 0) {\n        allTreeKeys.value = ids;\n        // 代码逻辑说明: 【TV360X-1619】同步系统角色改法加上缓存，默认层级关联修正原生层级关联bug\n        options.success?.(ids);\n        // 代码逻辑说明: 【issues/1169】我的部门功能中的【部门权限】中未翻译 t('') 多语言---\n        treeData.value = translateTitle(treeList);\n        // 查询角色授权\n        checkedKeys.value = await queryDeptRolePermission({ roleId: roleId.value });\n        lastCheckedKeys.value = [checkedKeys.value];\n      } else {\n        reset();\n      }\n    } finally {\n      loading.value = false;\n    }\n  }\n\n  // 重置页面\n  function reset() {\n    treeData.value = [];\n    expandedKeys.value = [];\n    checkedKeys.value = [];\n    lastCheckedKeys.value = [];\n    loading.value = false;\n  }\n\n  /**\n   * 点击选中\n   * 2024-07-04\n   * liaozhiyang\n   */\n  function onCheck(o, e) {\n    // checkStrictly: true=>层级独立，false=>层级关联.\n    if (checkStrictly.value) {\n      checkedKeys.value = o.checked ? o.checked : o;\n    } else {\n      const keys = getNodeAllKey(e.node, 'children', 'key');\n      if (e.checked) {\n        // 反复操作下可能会有重复的keys，得用new Set去重下\n        checkedKeys.value = [...new Set([...checkedKeys.value, ...keys])];\n      } else {\n        const result = removeMatchingItems(checkedKeys.value, keys);\n        checkedKeys.value = result;\n      }\n    }\n  }\n  /**\n   * 2024-07-04\n   * liaozhiyang\n   * 删除相匹配数组的项\n   */\n  function removeMatchingItems(arr1, arr2) {\n    // 使用哈希表记录 arr2 中的元素\n    const hashTable = {};\n    for (const item of arr2) {\n      hashTable[item] = true;\n    }\n    // 使用 filter 方法遍历第一个数组，过滤出不在哈希表中存在的项\n    return arr1.filter((item) => !hashTable[item]);\n  }\n  /**\n   * 2024-07-04\n   * liaozhiyang\n   * 获取当前节点及以下所有子孙级的key\n   */\n  function getNodeAllKey(node: any, children: any, key: string) {\n    const result: any = [];\n    result.push(node[key]);\n    const recursion = (data) => {\n      data.forEach((item: any) => {\n        result.push(item[key]);\n        if (item[children]?.length) {\n          recursion(item[children]);\n        }\n      });\n    };\n    node[children]?.length && recursion(node[children]);\n    return result;\n  }\n\n  // tree展开事件\n  function onExpand($expandedKeys) {\n    expandedKeys.value = $expandedKeys;\n  }\n\n  // tree选中事件\n  function onSelect($selectedKeys, { selectedNodes }) {\n    if (selectedNodes[0]?.ruleFlag) {\n      let functionId = $selectedKeys[0];\n      dataRuleDrawer.openDrawer(true, { roleId, departId, functionId });\n    }\n    selectedKeys.value = [];\n  }\n\n  function doClose() {\n    reset();\n    closeDrawer();\n  }\n\n  function onClose() {\n    reset();\n  }\n\n  async function onSubmit(exit) {\n    try {\n      loading.value = true;\n      let params = {\n        roleId: roleId.value,\n        permissionIds: checkedKeys.value.join(','),\n        lastpermissionIds: lastCheckedKeys.value.join(','),\n      };\n      await saveDeptRolePermission(params);\n      if (exit) {\n        doClose();\n      }\n    } finally {\n      loading.value = false;\n      if (!exit) {\n        loadData();\n      }\n    }\n  }\n\n  /**\n   * 树菜单选择\n   * @param key\n   */\n  function treeMenuClick({ key }) {\n    if (key === 'checkAll') {\n      checkedKeys.value = allTreeKeys.value;\n    } else if (key === 'cancelCheck') {\n      checkedKeys.value = [];\n    } else if (key === 'openAll') {\n      expandedKeys.value = allTreeKeys.value;\n      saveLocalOperation('expand', 'openAll');\n    } else if (key === 'closeAll') {\n      expandedKeys.value = [];\n      saveLocalOperation('expand', 'closeAll');\n    } else if (key === 'relation') {\n      checkStrictly.value = false;\n      saveLocalOperation('level', 'relation');\n    } else {\n      checkStrictly.value = true;\n      saveLocalOperation('level', 'standAlone');\n    }\n  }\n  /**\n   * 2024-07-04\n   * liaozhiyang\n   * */\n  const saveLocalOperation = (key, value) => {\n    const localData = localStorage.getItem(DEPART_ROLE_AUTH_CONFIG_KEY);\n    const obj = localData ? JSON.parse(localData) : {};\n    obj[key] = value;\n    localStorage.setItem(DEPART_ROLE_AUTH_CONFIG_KEY, JSON.stringify(obj));\n  };\n</script>\n<style lang=\"less\" scoped>\n  /** 固定操作按钮 */\n  .jeecg-basic-tree {\n    position: absolute;\n    width: 618px;\n  }\n  .line {\n    height: 1px;\n    width: 100%;\n    border-bottom: 1px solid #f0f0f0;\n  }\n  .more-icon {\n    font-size: 20px !important;\n    color: black;\n    display: inline-flex;\n    float: right;\n    margin-right: 2px;\n    cursor: pointer;\n  }\n  :deep(.jeecg-tree-header) {\n    border-bottom: none;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/departUser/components/DepartRoleDataRuleDrawer.vue",
    "content": "<template>\n  <BasicDrawer title=\"数据规则/按钮权限配置\" :width=\"365\" @close=\"onClose\" @register=\"registerDrawer\">\n    <a-spin :spinning=\"loading\">\n      <a-tabs defaultActiveKey=\"1\">\n        <a-tab-pane tab=\"数据规则\" key=\"1\">\n          <a-checkbox-group v-model:value=\"dataRuleChecked\" v-if=\"dataRuleList.length > 0\">\n            <a-row>\n              <a-col :span=\"24\" v-for=\"(item, index) in dataRuleList\" :key=\"'dr' + index\">\n                <a-checkbox :value=\"item.id\">{{ item.ruleName }}</a-checkbox>\n              </a-col>\n              <a-col :span=\"24\">\n                <div style=\"width: 100%; margin-top: 15px\">\n                  <a-button type=\"primary\" :loading=\"loading\" :size=\"'small'\" preIcon=\"ant-design:save-filled\" @click=\"saveDataRuleForRole\">\n                    <span>点击保存</span>\n                  </a-button>\n                </div>\n              </a-col>\n            </a-row>\n          </a-checkbox-group>\n          <a-empty v-else description=\"无配置信息\" />\n        </a-tab-pane>\n        <!--<a-tab-pane tab=\"按钮权限\" key=\"2\">敬请期待!!!</a-tab-pane>-->\n      </a-tabs>\n    </a-spin>\n  </BasicDrawer>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, unref } from 'vue';\n  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';\n\n  import { queryDepartRoleDataRule, saveDepartRoleDataRule } from '../depart.user.api';\n\n  defineEmits(['register']);\n  const loading = ref<boolean>(false);\n  const departId = ref('');\n  const functionId = ref('');\n  const roleId = ref('');\n  const dataRuleList = ref<Array<any>>([]);\n  const dataRuleChecked = ref<Array<any>>([]);\n\n  // 注册抽屉组件\n  const [registerDrawer, { closeDrawer }] = useDrawerInner((data) => {\n    roleId.value = unref(data.roleId);\n    departId.value = unref(data.departId);\n    functionId.value = unref(data.functionId);\n    loadData();\n  });\n\n  async function loadData() {\n    try {\n      loading.value = true;\n      const { datarule, drChecked } = await queryDepartRoleDataRule(functionId, departId, roleId);\n      dataRuleList.value = datarule;\n      if (drChecked) {\n        dataRuleChecked.value = drChecked.split(',');\n      }\n    } finally {\n      loading.value = false;\n    }\n  }\n\n  function saveDataRuleForRole() {\n    let params = {\n      permissionId: functionId.value,\n      roleId: roleId.value,\n      dataRuleIds: dataRuleChecked.value.join(','),\n    };\n    saveDepartRoleDataRule(params);\n  }\n\n  function onClose() {\n    doReset();\n  }\n\n  function doReset() {\n    functionId.value = '';\n    roleId.value = '';\n    dataRuleList.value = [];\n    dataRuleChecked.value = [];\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/departUser/components/DepartRoleInfoTab.vue",
    "content": "<template>\n  <!--引用表格-->\n  <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n    <!--插槽:table标题-->\n    <template #tableTitle>\n      <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"addDepartRole\" :disabled=\"!departId\">添加部门角色</a-button>\n      <template v-if=\"selectedRowKeys.length > 0\">\n        <a-divider type=\"vertical\" />\n        <a-dropdown>\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"onDeleteDepartRoleBatch\">\n                <icon icon=\"ant-design:delete-outlined\" />\n                <span>删除</span>\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button>\n            <span>批量操作 </span>\n            <icon icon=\"akar-icons:chevron-down\" />\n          </a-button>\n        </a-dropdown>\n      </template>\n    </template>\n    <!-- 插槽：行内操作按钮 -->\n    <template #action=\"{ record }\">\n      <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\" />\n    </template>\n  </BasicTable>\n  <!-- 添加部门弹窗 -->\n  <DepartRoleModal :departId=\"departId\" @register=\"registerFormModal\" @success=\"onFormModalSuccess\" />\n  <DepartRoleAuthDrawer @register=\"registerAuthDrawer\" />\n</template>\n\n<script lang=\"ts\" setup>\n  import { inject, ref, unref, watch, computed, onMounted } from 'vue';\n\n  import { ActionItem, BasicTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import { useDrawer } from '/@/components/Drawer';\n  import { useListPage } from '/@/hooks/system/useListPage';\n\n  import DepartRoleModal from './DepartRoleModal.vue';\n  import DepartRoleAuthDrawer from './DepartRoleAuthDrawer.vue';\n  import { deleteBatchDepartRole, departRoleList } from '../depart.user.api';\n  import { departRoleColumns, departRoleSearchFormSchema } from '../depart.user.data';\n  import { ColEx } from '/@/components/Form/src/types';\n\n  const prefixCls = inject('prefixCls');\n  const props = defineProps({\n    data: { require: true, type: Object },\n  });\n  defineEmits(['register']);\n  // 当前选中的部门ID，可能会为空，代表未选择部门\n  const departId = computed(() => props.data?.id);\n\n  // 自适应列配置\n  const adaptiveColProps: Partial<ColEx> = {\n    xs: 24, // <576px\n    sm: 24, // ≥576px\n    md: 24, // ≥768px\n    lg: 12, // ≥992px\n    xl: 12, // ≥1200px\n    xxl: 8, // ≥1600px\n  };\n  // 列表页面公共参数、方法\n  const { tableContext, createMessage } = useListPage({\n    tableProps: {\n      api: departRoleList,\n      columns: departRoleColumns,\n      canResize: false,\n      formConfig: {\n        labelWidth: 100,\n        schemas: departRoleSearchFormSchema,\n        baseColProps: adaptiveColProps,\n        labelAlign: 'left',\n        labelCol: {\n          xs: 24,\n          sm: 24,\n          md: 24,\n          lg: 9,\n          xl: 7,\n          xxl: 6,\n        },\n        wrapperCol: {},\n        // 操作按钮配置\n        actionColOptions: {\n          ...adaptiveColProps,\n          style: { textAlign: 'left' },\n        },\n        showResetButton: !!departId.value,\n        showSubmitButton: !!departId.value,\n      },\n      // 【issues/1064】列设置的 cacheKey\n      tableSetting: { cacheKey: 'depart_user_departInfo' },\n      // 请求之前对参数做处理\n      beforeFetch(params) {\n        params.deptId = departId.value;\n      },\n      // 代码逻辑说明: 【TV360X-53】未选择部门的情况下，部门角色全查出来了\n      immediate: !!departId.value,\n    },\n  });\n\n  // 注册 ListTable\n  const [registerTable, { reload, setProps, setLoading, updateTableDataRecord }, { rowSelection, selectedRowKeys }] = tableContext;\n\n  // 注册Form弹窗\n  const [registerFormModal, formModal] = useModal();\n  // 注册授权弹窗抽屉\n  const [registerAuthDrawer, authDrawer] = useDrawer();\n\n  // 监听 data 更改，重新加载数据\n  watch(\n    () => props.data,\n    () => reload()\n  );\n  onMounted(() => {\n    // reload();\n  });\n\n  // 清空选择的行\n  function clearSelection() {\n    selectedRowKeys.value = [];\n  }\n\n  // 添加部门角色\n  function addDepartRole() {\n    formModal.openModal(true, {\n      isUpdate: false,\n      record: {},\n    });\n  }\n\n  // 编辑部门角色\n  function editDepartRole(record) {\n    formModal.openModal(true, {\n      isUpdate: true,\n      record: record,\n    });\n  }\n\n  // 授权部门角色\n  function permissionDepartRole(record) {\n    authDrawer.openDrawer(true, { record });\n  }\n\n  // 批量删除部门角色\n  async function deleteDepartRole(idList, confirm) {\n    if (!departId.value) {\n      createMessage.warning('请先选择一个部门');\n    } else {\n      setLoading(true);\n      let ids = unref(idList).join(',');\n      try {\n        await deleteBatchDepartRole({ ids }, confirm);\n        return reload();\n      } finally {\n        setLoading(false);\n      }\n    }\n    return Promise.reject();\n  }\n\n  // 批量删除部门角色事件\n  async function onDeleteDepartRoleBatch() {\n    try {\n      await deleteDepartRole(selectedRowKeys, true);\n      // 批量删除成功后清空选择\n      clearSelection();\n    } catch (e) {}\n  }\n\n  // 表单弹窗成功后的回调\n  function onFormModalSuccess({ isUpdate, values }) {\n    isUpdate ? updateTableDataRecord(values.id, values) : reload();\n  }\n\n  /**\n   * 操作栏\n   */\n  function getTableAction(record): ActionItem[] {\n    return [{ label: '编辑', onClick: editDepartRole.bind(null, record) }];\n  }\n\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record): ActionItem[] {\n    return [\n      { label: '授权', onClick: permissionDepartRole.bind(null, record) },\n      {\n        label: '删除',\n        color: 'error',\n        popConfirm: {\n          title: '确认要删除吗？',\n          confirm: deleteDepartRole.bind(null, [record.id], false),\n        },\n      },\n    ];\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/departUser/components/DepartRoleModal.vue",
    "content": "<template>\n  <BasicModal :title=\"title\" :width=\"800\" v-bind=\"$attrs\" @ok=\"handleOk\" @register=\"registerModal\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { computed, inject, ref, unref } from 'vue';\n\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  // noinspection ES6UnusedImports\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n\n  import { saveOrUpdateDepartRole } from '../depart.user.api';\n  import { departRoleModalFormSchema } from '../depart.user.data';\n\n  const emit = defineEmits(['success', 'register']);\n  const props = defineProps({\n    // 当前部门ID\n    departId: { require: true, type: String },\n  });\n  const prefixCls = inject('prefixCls');\n  // 当前是否是更新模式\n  const isUpdate = ref<boolean>(true);\n  // 当前的弹窗数据\n  const model = ref<object>({});\n  const title = computed(() => (isUpdate.value ? '编辑' : '新增'));\n\n  //注册表单\n  const [registerForm, { resetFields, setFieldsValue, validate, updateSchema }] = useForm({\n    schemas: departRoleModalFormSchema,\n    showActionButtonGroup: false,\n  });\n\n  // 注册弹窗\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    await resetFields();\n    isUpdate.value = unref(data?.isUpdate);\n    // 无论新增还是编辑，都可以设置表单值\n    let record = unref(data?.record);\n    if (typeof record === 'object') {\n      model.value = record;\n      await setFieldsValue({ ...record });\n    }\n  });\n\n  //提交事件\n  async function handleOk() {\n    try {\n      setModalProps({ confirmLoading: true });\n      let values = await validate();\n      values.departId = unref(props.departId);\n      //提交表单\n      await saveOrUpdateDepartRole(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success', { isUpdate: unref(isUpdate), values });\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/departUser/components/DepartRoleUserAuthDrawer.vue",
    "content": "<template>\n  <BasicDrawer title=\"部门角色分配\" :width=\"365\" @close=\"onClose\" @register=\"registerDrawer\">\n    <a-spin :spinning=\"loading\">\n      <template v-if=\"desformList.length > 0\">\n        <a-checkbox-group v-model:value=\"designNameValue\">\n          <a-row>\n            <a-col :span=\"24\" v-for=\"item of desformList\">\n              <a-checkbox :value=\"item.id\">{{ item.roleName }}</a-checkbox>\n            </a-col>\n          </a-row>\n        </a-checkbox-group>\n        <div style=\"width: 100%; margin-top: 15px\">\n          <a-button type=\"primary\" :loading=\"loading\" :size=\"'small'\" preIcon=\"ant-design:save-filled\" @click=\"onSubmit\">\n            <span>点击保存</span>\n          </a-button>\n        </div>\n      </template>\n      <a-empty v-else description=\"无配置信息\" />\n    </a-spin>\n  </BasicDrawer>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, unref } from 'vue';\n  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';\n\n  import { queryDepartRoleByUserId, queryDepartRoleUserList, saveDepartRoleUser } from '../depart.user.api';\n\n  defineEmits(['register']);\n  const loading = ref<boolean>(false);\n  const userId = ref('');\n  const departId = ref('');\n  const oldRoleId = ref('');\n  const desformList = ref<Array<any>>([]);\n  const designNameValue = ref<Array<any>>([]);\n\n  // 注册抽屉组件\n  const [registerDrawer, { closeDrawer }] = useDrawerInner((data) => {\n    userId.value = unref(data.userId);\n    departId.value = unref(data.departId);\n    loadData();\n  });\n\n  async function loadData() {\n    try {\n      loading.value = true;\n      const params = {\n        departId: departId.value,\n        userId: userId.value,\n      };\n      // 查询 DepartRole\n      const [$desformList, $departRoleList] = await Promise.all([queryDepartRoleUserList(params), queryDepartRoleByUserId(params)]);\n      desformList.value = $desformList;\n      designNameValue.value = $departRoleList.map((item) => item.droleId);\n      oldRoleId.value = designNameValue.value.join(',');\n    } finally {\n      loading.value = false;\n    }\n  }\n\n  async function onSubmit() {\n    try {\n      loading.value = true;\n      await saveDepartRoleUser({\n        userId: userId.value,\n        newRoleId: designNameValue.value.join(','),\n        oldRoleId: oldRoleId.value,\n      });\n      doClose();\n    } finally {\n      loading.value = false;\n    }\n  }\n\n  function onClose() {\n    doReset();\n  }\n\n  function doClose() {\n    doReset();\n    closeDrawer();\n  }\n\n  function doReset() {\n    userId.value = '';\n    departId.value = '';\n    oldRoleId.value = '';\n    desformList.value = [];\n    designNameValue.value = [];\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/departUser/components/DepartTree.vue",
    "content": "<template>\n  <div class=\"bg-white m-4 mr-0 overflow-hidden\">\n    <div v-if=\"userIdentity === '2'\" class=\"j-table-operator\" style=\"width: 100%\">\n      <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"onAddChildDepart\">添加下级</a-button>\n      <!--      <a-button type=\"primary\" preIcon=\"ant-design:edit-outlined\" @click=\"editDepart\">编辑</a-button>-->\n      <a-button :disabled=\"!(checkedKeys && checkedKeys.length > 0)\" preIcon=\"ant-design:delete-outlined\" @click=\"onDeleteBatch\">删除</a-button>\n    </div>\n    <a-spin :spinning=\"loading\">\n      <template v-if=\"userIdentity === '2'\">\n        <a-input-search placeholder=\"按部门名称搜索…\" style=\"margin-bottom: 10px\" @search=\"onSearch\" />\n        <!--组织机构树-->\n        <BasicTree\n          v-if=\"!treeReloading\"\n          :toolbar=\"false\"\n          :search=\"false\"\n          :showLine=\"false\"\n          :clickRowToExpand=\"false\"\n          :multiple=\"false\"\n          :checkStrictly=\"true\"\n          :treeData=\"treeData\"\n          :checkedKeys=\"checkedKeys\"\n          :selectedKeys=\"selectedKeys\"\n          :expandedKeys=\"expandedKeys\"\n          :autoExpandParent=\"autoExpandParent\"\n          :beforeRightClick=\"getRightMenuList\"\n          @select=\"onSelect\"\n          @expand=\"onExpand\"\n          @check=\"onCheck\"\n        />\n      </template>\n      <a-empty v-else description=\"普通员工无此权限\" />\n    </a-spin>\n    <DepartFormModal :rootTreeData=\"treeData\" @register=\"registerModal\" @success=\"handleSuccess\" />\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\n  import { inject, nextTick, ref } from 'vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { BasicTree, ContextMenuItem } from '/@/components/Tree';\n  import { queryMyDepartTreeList, searchByKeywords } from '../depart.user.api';\n  import DepartFormModal from '@/views/system/depart/components/DepartFormModal.vue';\n  import { useModal } from '@/components/Modal';\n  import { deleteBatchDepart } from '@/views/system/depart/depart.api';\n\n  const prefixCls = inject('prefixCls');\n  const emit = defineEmits(['select']);\n  const { createMessage } = useMessage();\n\n  let loading = ref<boolean>(false);\n  // 负责部门ID\n  let myDepIds = ref<any[]>([]);\n  // 部门树列表数据\n  let treeData = ref<any[]>([]);\n  // 当前展开的项\n  let expandedKeys = ref<any[]>([]);\n  // 当前选中的项\n  let selectedKeys = ref<any[]>([]);\n  // 当前选中的项\n  let selectedNode = ref<any>({});\n  // 当前选中的项\n  let checkedKeys = ref<any[]>([]);\n  // 是否自动展开父级\n  let autoExpandParent = ref<boolean>(true);\n  // 用户身份(1:普通员工  2:上级)\n  let userIdentity = ref<string>('2');\n  // 树组件重新加载\n  let treeReloading = ref<boolean>(false);\n  // 注册 modal\n  const [registerModal, { openModal }] = useModal();\n  // 加载部门信息\n  function loadDepartTreeData() {\n    loading.value = true;\n    treeReloading.value = true;\n    treeData.value = [];\n    queryMyDepartTreeList()\n      .then((res) => {\n        if (res.success) {\n          if (Array.isArray(res.result)) {\n            treeData.value = res.result;\n            myDepIds.value = res.result.map((item) => item.id);\n            userIdentity.value = res.message;\n            autoExpandParentNode();\n          }\n        } else {\n          createMessage.warning(res.message);\n        }\n      })\n      .finally(async () => {\n        await nextTick();\n        loading.value = false;\n        treeReloading.value = false;\n      });\n  }\n\n  loadDepartTreeData();\n\n  // 自动展开父节点，只展开一级\n  function autoExpandParentNode() {\n    let keys: Array<any> = [];\n    treeData.value.forEach((item, index) => {\n      if (item.children && item.children.length > 0) {\n        keys.push(item.key);\n      }\n      if (index === 0) {\n        // 默认选中第一个\n        setSelectedKey(item.id, item);\n      }\n    });\n    if (keys.length > 0) {\n      reloadTree();\n      expandedKeys.value = keys;\n    }\n  }\n\n  // 添加子级部门\n  function onAddChildDepart() {\n    if (selectedKeys.value && selectedKeys.value.length === 0) {\n      createMessage.warning('请先选择一个部门');\n      return;\n    }\n    const record = { parentId: selectedKeys.value[0] };\n    openModal(true, { isUpdate: false, isChild: true, record });\n  }\n\n  // 编辑部门\n  function editDepart() {\n    if (selectedKeys.value && selectedKeys.value.length === 0) {\n      createMessage.warning('请先选择一个部门');\n      return;\n    }\n    if (myDepIds.value.includes(selectedKeys.value[0])) {\n      createMessage.warning('不能编辑负责部门');\n      return;\n    }\n    console.log('selectedNode', selectedNode.value);\n    openModal(true, { isUpdate: false, isChild: true, record: { ...selectedNode.value } });\n  }\n\n  // 删除部门\n  async function onDeleteBatch() {\n    const idList = checkedKeys.value;\n    if (myDepIds.value.includes(idList[0])) {\n      createMessage.warning('不能删除负责部门');\n      return;\n    }\n    if (idList.length > 0) {\n      try {\n        loading.value = true;\n        await deleteBatchDepart({ ids: idList.join(',') }, true);\n        await loadDepartTreeData();\n      } finally {\n        loading.value = false;\n      }\n    }\n  }\n  // 重新加载树组件，防止无法默认展开数据\n  async function reloadTree() {\n    await nextTick();\n    treeReloading.value = true;\n    await nextTick();\n    treeReloading.value = false;\n  }\n\n  /**\n   * 设置当前选中的行\n   */\n  function setSelectedKey(key: string, data?: object) {\n    selectedKeys.value = [key];\n    checkedKeys.value = [key];\n    if (data) {\n      selectedNode.value = { ...data };\n      emit('select', data);\n    }\n  }\n\n  // 搜索事件\n  function onSearch(value: string) {\n    if (value) {\n      loading.value = true;\n      searchByKeywords({ keyWord: value, myDeptSearch: '1' })\n        .then((result) => {\n          if (Array.isArray(result)) {\n            treeData.value = result;\n          } else {\n            createMessage.warning('未查询到部门信息');\n            treeData.value = [];\n          }\n        })\n        .finally(() => (loading.value = false));\n    } else {\n      loadDepartTreeData();\n    }\n  }\n\n  // 树选择事件\n  function onSelect(selKeys, event) {\n    if (selKeys.length > 0 && selectedKeys.value[0] !== selKeys[0]) {\n      setSelectedKey(selKeys[0], event.selectedNodes[0]);\n    } else {\n      // 这样可以防止用户取消选择\n      setSelectedKey(selectedKeys.value[0]);\n    }\n    checkedKeys.value = [selectedKeys.value[0]];\n  }\n\n  // 树选中事件\n  function onCheck(keys) {\n    if (keys.checked && keys.checked.length > 0) {\n      checkedKeys.value = [...keys.checked];\n    } else {\n      checkedKeys.value = [];\n    }\n  }\n\n  // 树展开事件\n  function onExpand(keys) {\n    expandedKeys.value = keys;\n    autoExpandParent.value = false;\n  }\n\n  //成功回调\n  async function handleSuccess() {\n    await loadDepartTreeData();\n  }\n  /**\n   *\n   * @param node\n   */\n  function getRightMenuList(node: any): ContextMenuItem[] {\n    return [\n      {\n        label: '添加下级',\n        disabled: myDepIds.value.includes(node.key),\n        handler: () => {\n          setSelectedKey(node.key);\n          onAddChildDepart();\n        },\n        icon: 'ant-design:plus-outlined',\n      },\n      {\n        label: '编辑',\n        disabled: myDepIds.value.includes(node.key),\n        handler: () => {\n          setSelectedKey(node.key);\n          const record = { ...node.dataRef };\n          openModal(true, { isUpdate: true, record, isChild: true });\n        },\n        icon: 'ant-design:edit-outlined',\n      },\n    ];\n  }\n</script>\n<style lang=\"less\" scoped>\n  /*升级antd3后，查询框与树贴的太近，样式优化*/\n  :deep(.jeecg-tree-header) {\n    margin-bottom: 6px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/departUser/components/DepartUserInfoTab.vue",
    "content": "<template>\n  <!--引用表格-->\n  <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n    <!--插槽:table标题-->\n    <template #tableTitle>\n      <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"selectAddUser\" :disabled=\"!departId\">添加已有用户</a-button>\n      <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"createUser\" :disabled=\"!departId\">新建用户</a-button>\n      <template v-if=\"selectedRowKeys.length > 0\">\n        <a-dropdown>\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"onUnlinkDepartUserBatch\">\n                <icon icon=\"bx:bx-unlink\" />\n                <span>取消关联</span>\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button>\n            <span>批量操作 </span>\n            <icon icon=\"akar-icons:chevron-down\" />\n          </a-button>\n        </a-dropdown>\n      </template>\n    </template>\n    <!-- 插槽：行内操作按钮 -->\n    <template #action=\"{ record }\">\n      <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\" />\n    </template>\n  </BasicTable>\n  <UserDrawer @register=\"registerDrawer\" @success=\"onUserDrawerSuccess\" />\n  <DepartRoleUserAuthDrawer @register=\"registerUserAuthDrawer\" />\n  <UserSelectModal ref=\"userSelectModalRef\" rowKey=\"id\" @register=\"registerSelUserModal\" @getSelectResult=\"onSelectUserOk\" />\n</template>\n\n<script lang=\"ts\" setup>\n  import { computed, inject, ref, unref, watch } from 'vue';\n  import { ActionItem, BasicTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import { useDrawer } from '/@/components/Drawer';\n  import { useListPage } from '/@/hooks/system/useListPage';\n\n  import UserDrawer from '/@/views/system/user/UserDrawer.vue';\n  import UserSelectModal from '/@/components/Form/src/jeecg/components/modal/UserSelectModal.vue';\n  import DepartRoleUserAuthDrawer from './DepartRoleUserAuthDrawer.vue';\n  import { departUserList, linkDepartUserBatch, unlinkDepartUserBatch } from '../depart.user.api';\n  import { userInfoColumns, userInfoSearchFormSchema } from '../depart.user.data';\n  import { ColEx } from '/@/components/Form/src/types';\n\n  const prefixCls = inject('prefixCls');\n  const props = defineProps({\n    data: { require: true, type: Object },\n  });\n  const userSelectModalRef: any = ref(null);\n  // 当前选中的部门ID，可能会为空，代表未选择部门\n  const departId = computed(() => props.data?.id);\n\n  // 自适应列配置\n  const adaptiveColProps: Partial<ColEx> = {\n    xs: 24, // <576px\n    sm: 24, // ≥576px\n    md: 24, // ≥768px\n    lg: 12, // ≥992px\n    xl: 12, // ≥1200px\n    xxl: 8, // ≥1600px\n  };\n  // 列表页面公共参数、方法\n  const { tableContext, createMessage } = useListPage({\n    tableProps: {\n      api: departUserList,\n      columns: userInfoColumns,\n      canResize: false,\n      formConfig: {\n        schemas: userInfoSearchFormSchema,\n        baseColProps: adaptiveColProps,\n        labelAlign: 'left',\n        labelCol: {\n          xs: 24,\n          sm: 24,\n          md: 24,\n          lg: 9,\n          xl: 7,\n          xxl: 5,\n        },\n        wrapperCol: {},\n        // 操作按钮配置\n        actionColOptions: {\n          ...adaptiveColProps,\n          style: { textAlign: 'left' },\n        },\n        showResetButton: !!departId.value,\n        showSubmitButton: !!departId.value,\n      },\n      // 【issues/1064】列设置的 cacheKey\n      tableSetting: { cacheKey: 'depart_user_userInfo' },\n      // 请求之前对参数做处理\n      beforeFetch(params) {\n        params.depId = departId.value;\n      },\n      // 代码逻辑说明: 【TV360X-1861】没部门时不加载用户信息\n      immediate: !!departId.value,\n    },\n  });\n\n  // 注册 ListTable\n  const [registerTable, { reload, setProps, setLoading, updateTableDataRecord }, { rowSelection, selectedRowKeys }] = tableContext;\n\n  watch(\n    () => props.data,\n    () => reload()\n  );\n  //注册drawer\n  const [registerDrawer, { openDrawer, setDrawerProps }] = useDrawer();\n  const [registerUserAuthDrawer, userAuthDrawer] = useDrawer();\n  // 注册用户选择 modal\n  const [registerSelUserModal, selUserModal] = useModal();\n\n  // 清空选择的行\n  function clearSelection() {\n    selectedRowKeys.value = [];\n  }\n\n  // 查看部门角色\n  function showDepartRole(record) {\n    userAuthDrawer.openDrawer(true, { userId: record.id, departId });\n  }\n\n  // 创建用户\n  function createUser() {\n    if (!departId.value) {\n      createMessage.warning('请先选择一个部门');\n    } else {\n      openDrawer(true, {\n        isUpdate: false,\n        departDisabled: true,\n        // 初始化负责部门\n        nextDepartOptions: { value: props.data?.key, label: props.data?.title },\n        record: {\n          activitiSync: 1,\n          userIdentity: 1,\n          selecteddeparts: departId.value,\n        },\n      });\n    }\n  }\n\n  // 查看用户详情\n  function showUserDetail(record) {\n    openDrawer(true, {\n      record,\n      isUpdate: true,\n      departDisabled: true,\n      showFooter: false,\n    });\n  }\n\n  // 编辑用户信息\n  function editUserInfo(record) {\n    openDrawer(true, { isUpdate: true, record, departDisabled: true });\n  }\n\n  // 选择添加已有用户\n  function selectAddUser() {\n    // 代码逻辑说明: 【TV360X-1613】再次打开还是上次的选中用户，没置空\n    userSelectModalRef.value.rowSelection.selectedRowKeys = [];\n    selUserModal.openModal();\n  }\n\n  // 批量取消关联部门和用户之间的关系\n  async function unlinkDepartUser(idList, confirm) {\n    if (!departId.value) {\n      createMessage.warning('请先选择一个部门');\n    } else {\n      setLoading(true);\n      let userIds = unref(idList).join(',');\n      try {\n        await unlinkDepartUserBatch({ depId: departId.value, userIds }, confirm);\n        return reload();\n      } finally {\n        setLoading(false);\n      }\n    }\n    return Promise.reject();\n  }\n\n  // 批量取消关联事件\n  async function onUnlinkDepartUserBatch() {\n    try {\n      await unlinkDepartUser(selectedRowKeys, true);\n      // 批量删除成功后清空选择\n      clearSelection();\n    } catch (e) {}\n  }\n\n  // 选择用户成功\n  async function onSelectUserOk(options, userIdList) {\n    if (userIdList.length > 0) {\n      try {\n        setLoading(true);\n        await linkDepartUserBatch(departId.value, userIdList);\n        reload();\n      } finally {\n        setLoading(false);\n      }\n    }\n  }\n\n  /**\n   * 用户抽屉表单成功回调\n   */\n  function onUserDrawerSuccess({ isUpdate, values }) {\n    isUpdate ? updateTableDataRecord(values.id, values) : reload();\n  }\n\n  /**\n   * 操作栏\n   */\n  function getTableAction(record): ActionItem[] {\n    return [{ label: '编辑', onClick: editUserInfo.bind(null, record) }];\n  }\n\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record): ActionItem[] {\n    return [\n      { label: '部门角色', onClick: showDepartRole.bind(null, record) },\n      { label: '用户详情', onClick: showUserDetail.bind(null, record) },\n      {\n        label: '取消关联',\n        color: 'error',\n        popConfirm: {\n          title: '确认取消关联吗？',\n          confirm: unlinkDepartUser.bind(null, [record.id], false),\n        },\n      },\n    ];\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/departUser/depart.user.api.ts",
    "content": "import { unref } from 'vue';\nimport { defHttp } from '/@/utils/http/axios';\nimport { useMessage } from '/@/hooks/web/useMessage';\n\nconst { createConfirm } = useMessage();\n\nenum Api {\n  treeList = '/sys/sysDepart/queryMyDeptTreeList',\n  queryIdTree = '/sys/sysDepart/queryIdTree',\n  searchBy = '/sys/sysDepart/searchBy',\n}\n\n// 部门用户API\nenum DepartUserApi {\n  list = '/sys/user/departUserList',\n  link = '/sys/user/editSysDepartWithUser',\n  unlink = '/sys/user/deleteUserInDepartBatch',\n}\n\n// 部门角色API\nenum DepartRoleApi {\n  list = '/sys/sysDepartRole/list',\n  deleteBatch = '/sys/sysDepartRole/deleteBatch',\n  save = '/sys/sysDepartRole/add',\n  edit = '/sys/sysDepartRole/edit',\n  queryTreeListForDeptRole = '/sys/sysDepartPermission/queryTreeListForDeptRole',\n  queryDeptRolePermission = '/sys/sysDepartPermission/queryDeptRolePermission',\n  saveDeptRolePermission = '/sys/sysDepartPermission/saveDeptRolePermission',\n  dataRule = '/sys/sysDepartRole/datarule',\n  getDeptRoleList = '/sys/sysDepartRole/getDeptRoleList',\n  getDeptRoleByUserId = '/sys/sysDepartRole/getDeptRoleByUserId',\n  saveDeptRoleUser = '/sys/sysDepartRole/deptRoleUserAdd',\n}\n\n/**\n * 获取部门树列表\n */\nexport const queryMyDepartTreeList = (params?) => defHttp.get({ url: Api.treeList, params }, { isTransformResponse: false });\n\n/**\n * 查询数据，以树结构形式加载所有部门的名称\n */\nexport const queryIdTree = (params?) => defHttp.get({ url: Api.queryIdTree, params });\n\n/**\n * 根据关键字搜索部门\n */\nexport const searchByKeywords = (params) => defHttp.get({ url: Api.searchBy, params });\n\n/**\n * 查询部门下的用户信息\n */\nexport const departUserList = (params) => defHttp.get({ url: DepartUserApi.list, params });\n\n/**\n * 批量添加部门和用户的关联关系\n *\n * @param departId 部门ID\n * @param userIdList 用户ID列表\n */\nexport const linkDepartUserBatch = (departId: string, userIdList: string[]) =>\n  defHttp.post({ url: DepartUserApi.link, params: { depId: departId, userIdList } });\n\n/**\n * 批量取消部门和用户的关联关系\n */\nexport const unlinkDepartUserBatch = (params, confirm = false) => {\n  return new Promise((resolve, reject) => {\n    const doDelete = () => {\n      resolve(defHttp.delete({ url: DepartUserApi.unlink, params }, { joinParamsToUrl: true }));\n    };\n    if (confirm) {\n      createConfirm({\n        iconType: 'warning',\n        title: '取消关联',\n        content: '确定要取消关联吗？',\n        onOk: () => doDelete(),\n        onCancel: () => reject(),\n      });\n    } else {\n      doDelete();\n    }\n  });\n};\n\n/**\n * 查询部门角色信息\n */\nexport const departRoleList = (params) => defHttp.get({ url: DepartRoleApi.list, params });\n\n/**\n * 保存或者更新部门角色\n */\nexport const saveOrUpdateDepartRole = (params, isUpdate) => {\n  if (isUpdate) {\n    return defHttp.put({ url: DepartRoleApi.edit, params });\n  } else {\n    return defHttp.post({ url: DepartRoleApi.save, params });\n  }\n};\n\n/**\n * 批量删除部门角色\n */\nexport const deleteBatchDepartRole = (params, confirm = false) => {\n  return new Promise((resolve, reject) => {\n    const doDelete = () => {\n      resolve(defHttp.delete({ url: DepartRoleApi.deleteBatch, params }, { joinParamsToUrl: true }));\n    };\n    if (confirm) {\n      createConfirm({\n        iconType: 'warning',\n        title: '删除',\n        content: '确定要删除吗？',\n        onOk: () => doDelete(),\n        onCancel: () => reject(),\n      });\n    } else {\n      doDelete();\n    }\n  });\n};\n\n/**\n * 用户角色授权功能，查询菜单权限树\n */\nexport const queryTreeListForDeptRole = (params) => defHttp.get({ url: DepartRoleApi.queryTreeListForDeptRole, params });\n/**\n * 查询角色授权\n */\nexport const queryDeptRolePermission = (params) => defHttp.get({ url: DepartRoleApi.queryDeptRolePermission, params });\n/**\n * 保存角色授权\n */\nexport const saveDeptRolePermission = (params) => defHttp.post({ url: DepartRoleApi.saveDeptRolePermission, params });\n\n/**\n *  查询部门角色数据权限列表\n */\nexport const queryDepartRoleDataRule = (functionId, departId, roleId, params?) => {\n  let url = `${DepartRoleApi.dataRule}/${unref(functionId)}/${unref(departId)}/${unref(roleId)}`;\n  return defHttp.get({ url, params });\n};\n/**\n * 保存部门角色数据权限\n */\nexport const saveDepartRoleDataRule = (params) => defHttp.post({ url: DepartRoleApi.dataRule, params });\n/**\n * 查询部门角色用户授权\n */\nexport const queryDepartRoleUserList = (params) => defHttp.get({ url: DepartRoleApi.getDeptRoleList, params });\n/**\n * 根据 userId 查询部门角色用户授权\n */\nexport const queryDepartRoleByUserId = (params) => defHttp.get({ url: DepartRoleApi.getDeptRoleByUserId, params });\n/**\n * 保存部门角色用户授权\n */\nexport const saveDepartRoleUser = (params) => defHttp.post({ url: DepartRoleApi.saveDeptRoleUser, params });\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/departUser/depart.user.data.ts",
    "content": "import { Ref } from 'vue';\nimport { duplicateCheckDelay } from '/@/views/system/user/user.api';\nimport { BasicColumn, FormSchema } from '/@/components/Table';\nimport { DescItem } from '/@/components/Description';\nimport { findTree } from '/@/utils/common/compUtils';\n\n// 用户信息 columns\nexport const userInfoColumns: BasicColumn[] = [\n  {\n    title: '用户账号',\n    dataIndex: 'username',\n    width: 150,\n  },\n  {\n    title: '用户名称',\n    dataIndex: 'realname',\n    width: 180,\n  },\n  {\n    title: '部门',\n    dataIndex: 'orgCode',\n    width: 200,\n  },\n  {\n    title: '性别',\n    dataIndex: 'sex_dictText',\n    width: 80,\n  },\n  {\n    title: '电话',\n    dataIndex: 'phone',\n    width: 120,\n  },\n];\n\n// 用户信息查询条件表单\nexport const userInfoSearchFormSchema: FormSchema[] = [\n  {\n    field: 'username',\n    label: '用户账号',\n    component: 'Input',\n  },\n];\n\n// 部门角色 columns\nexport const departRoleColumns: BasicColumn[] = [\n  {\n    title: '部门角色名称',\n    dataIndex: 'roleName',\n    width: 100,\n  },\n  {\n    title: '部门角色编码',\n    dataIndex: 'roleCode',\n    width: 100,\n  },\n  {\n    title: '部门',\n    dataIndex: 'departId_dictText',\n    width: 100,\n  },\n  {\n    title: '备注',\n    dataIndex: 'description',\n    width: 100,\n  },\n];\n\n// 部门角色查询条件表单\nexport const departRoleSearchFormSchema: FormSchema[] = [\n  {\n    field: 'roleName',\n    label: '部门角色名称',\n    component: 'Input',\n  },\n];\n\n// 部门角色弹窗form表单\nexport const departRoleModalFormSchema: FormSchema[] = [\n  {\n    label: 'id',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    field: 'roleName',\n    label: '部门角色名称',\n    component: 'Input',\n    rules: [\n      { required: true, message: '部门角色名称不能为空！' },\n      { min: 2, max: 30, message: '长度在 2 到 30 个字符', trigger: 'blur' },\n    ],\n  },\n  {\n    field: 'roleCode',\n    label: '部门角色编码',\n    component: 'Input',\n    dynamicDisabled: ({ values }) => {\n      return !!values.id;\n    },\n    dynamicRules: ({ model }) => {\n      return [\n        { required: true, message: '部门角色编码不能为空！' },\n        { min: 0, max: 64, message: '长度不能超过 64 个字符', trigger: 'blur' },\n        {\n          validator: (_, value) => {\n            if (/[\\u4E00-\\u9FA5]/g.test(value)) {\n              return Promise.reject('部门角色编码不可输入汉字！');\n            }\n            return new Promise((resolve, reject) => {\n              let params = {\n                tableName: 'sys_depart_role',\n                fieldName: 'role_code',\n                fieldVal: value,\n                dataId: model.id,\n              };\n              duplicateCheckDelay(params)\n                .then((res) => {\n                  res.success ? resolve() : reject(res.message || '校验失败');\n                })\n                .catch((err) => {\n                  reject(err.message || '验证失败');\n                });\n            });\n          },\n        },\n      ];\n    },\n  },\n  {\n    field: 'description',\n    label: '描述',\n    component: 'Input',\n    rules: [{ min: 0, max: 126, message: '长度不能超过 126 个字符', trigger: 'blur' }],\n  },\n];\n\n// 基本信息form\nexport function useBaseInfoForm(treeData: Ref<any[]>) {\n  const descItems: DescItem[] = [\n    {\n      field: 'departName',\n      label: '机构名称',\n    },\n    {\n      field: 'parentId',\n      label: '上级部门',\n      render(val) {\n        if (val) {\n          let data = findTree(treeData.value, (item) => item.key == val);\n          return data?.title ?? val;\n        }\n        return val;\n      },\n    },\n    {\n      field: 'orgCode',\n      label: '机构编码',\n    },\n    {\n      field: 'orgCategory',\n      label: '机构类型',\n      render(val) {\n        if (val === '1') {\n          return '公司';\n        } else if (val === '2') {\n          return '部门';\n        } else if (val === '3') {\n          return '岗位';\n        } else if(val === '4'){\n          return '子公司';\n        }\n        return val;\n      },\n    },\n    {\n      field: 'departOrder',\n      label: '排序',\n    },\n\n    {\n      field: 'mobile',\n      label: '手机号',\n    },\n    {\n      field: 'address',\n      label: '地址',\n    },\n    {\n      field: 'memo',\n      label: '备注',\n    },\n  ];\n\n  return { descItems };\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/departUser/index.less",
    "content": "@prefix-cls: ~'@{namespace}-depart-user';\n\n.@{prefix-cls} {\n  &--tree-search {\n    width: 100%;\n    margin: 10px 0 20px;\n  }\n\n  &--base-info-form {\n    @media (min-width: 576px) {\n      .no-border {\n        border: 0;\n        box-shadow: none;\n      }\n\n      .ant-select.ant-select-disabled {\n        .ant-select-selector {\n          border: 0;\n          color: black;\n          background-color: transparent;\n        }\n\n        .ant-select-selector,\n        .ant-select-selection-item {\n          cursor: text !important;\n          user-select: initial !important;\n        }\n\n        .ant-select-selection-search,\n        .ant-select-arrow {\n          display: none;\n        }\n      }\n    }\n  }\n}\n\n// 夜间模式样式兼容\n[data-theme='dark'] .@{prefix-cls} {\n  &--base-info-form {\n    .ant-select.ant-select-disabled {\n      .ant-select-selector {\n        color: #c9d1d9;\n        background-color: transparent;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/departUser/index.vue",
    "content": "<template>\n  <a-row :class=\"['p-4', `${prefixCls}--box`]\" :gutter=\"10\">\n    <a-col :xl=\"6\" :lg=\"8\" :md=\"10\" :sm=\"24\" style=\"flex: 1\">\n      <a-card :bordered=\"false\" style=\"height: 100%\">\n        <DepartTree @select=\"onTreeSelect\" />\n      </a-card>\n    </a-col>\n    <a-col :xl=\"18\" :lg=\"16\" :md=\"14\" :sm=\"24\" style=\"flex: 1\">\n      <a-card :bordered=\"false\" style=\"height: 100%\">\n        <a-tabs defaultActiveKey=\"user-info\">\n          <a-tab-pane tab=\"基本信息\" key=\"base-info\" forceRender>\n            <DepartBaseInfoTab :data=\"departData\" />\n          </a-tab-pane>\n          <a-tab-pane tab=\"用户信息\" key=\"user-info\">\n            <DepartUserInfoTab :key=\"reRender\" :data=\"departData\" />\n          </a-tab-pane>\n          <a-tab-pane tab=\"部门角色\" key=\"role-info\">\n            <DepartRoleInfoTab :key=\"reRender\" :data=\"departData\" />\n          </a-tab-pane>\n        </a-tabs>\n      </a-card>\n    </a-col>\n  </a-row>\n</template>\n\n<script lang=\"ts\" setup name=\"system-depart-user\">\n  import { provide, ref } from 'vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  import DepartTree from './components/DepartTree.vue';\n  import DepartBaseInfoTab from './components/DepartBaseInfoTab.vue';\n  import DepartUserInfoTab from './components/DepartUserInfoTab.vue';\n  import DepartRoleInfoTab from './components/DepartRoleInfoTab.vue';\n\n  const { prefixCls } = useDesign('depart-user');\n  provide('prefixCls', prefixCls);\n\n  // 当前选中的部门信息\n  let departData = ref({});\n\n  const reRender = ref(-1);\n\n  // 左侧树选择后触发\n  function onTreeSelect(data) {\n    // 代码逻辑说明: 【issues/7658】我的部门无部门列表数据时，点击查询或者重置能查出数据\n    if (reRender.value == -1) {\n      // 重新渲染组件\n      reRender.value = Math.random();\n    }\n    departData.value = data;\n  }\n</script>\n\n<style lang=\"less\">\n  @import './index.less';\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/dict/components/DictItemList.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"$attrs\" @register=\"registerDrawer\" title=\"字典列表\" width=\"800px\">\n    <BasicTable @register=\"registerTable\" :rowClassName=\"getRowClassName\">\n      <template #tableTitle>\n        <a-button type=\"primary\" @click=\"handleCreate\"> 新增</a-button>\n      </template>\n      <template v-slot:bodyCell=\"{column, record, index}\">\n        <template v-if=\"column.dataIndex ==='action'\">\n          <TableAction :actions=\"getTableAction(record)\" />\n        </template>\n      </template>\n     \n    </BasicTable>\n  </BasicDrawer>\n  <DictItemModal @register=\"registerModal\" @success=\"reload\" :dictId=\"dictId\" />\n</template>\n<script lang=\"ts\" setup>\n  import { ref, unref } from 'vue';\n  import { BasicDrawer, useDrawerInner } from '/src/components/Drawer';\n  import { BasicTable, useTable, TableAction } from '/src/components/Table';\n  import { useModal } from '/src/components/Modal';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  import DictItemModal from './DictItemModal.vue';\n  import { dictItemColumns, dictItemSearchFormSchema } from '../dict.data';\n  import { itemList, deleteItem } from '../dict.api';\n  import { ColEx } from '/@/components/Form/src/types';\n\n  const { prefixCls } = useDesign('row-invalid');\n  const dictId = ref('');\n  //字典配置model\n  const [registerModal, { openModal }] = useModal();\n  const [registerDrawer] = useDrawerInner(async (data) => {\n    dictId.value = data.id;\n    setProps({ searchInfo: { dictId: unref(dictId) } });\n    reload();\n  });\n  // 自适应列配置\n  const adaptiveColProps: Partial<ColEx> = {\n    xs: 24, // <576px\n    sm: 24, // ≥576px\n    md: 24, // ≥768px\n    lg: 12, // ≥992px\n    xl: 12, // ≥1200px\n    xxl: 8, // ≥1600px\n  };\n  const [registerTable, { reload, setProps }] = useTable({\n    //需要配置rowKey，否则会有警告\n    rowKey:'dictId',\n    api: itemList,\n    columns: dictItemColumns,\n    formConfig: {\n      baseColProps: adaptiveColProps,\n      labelAlign: 'right',\n      labelCol: {\n        offset: 1,\n        xs: 24,\n        sm: 24,\n        md: 24,\n        lg: 9,\n        xl: 7,\n        xxl: 4,\n      },\n      wrapperCol: {},\n      schemas: dictItemSearchFormSchema,\n      autoSubmitOnEnter: true,\n      actionColOptions: {\n        span: 8\n      }\n    },\n    striped: true,\n    useSearchForm: true,\n    bordered: true,\n    showIndexColumn: false,\n    canResize: false,\n    immediate: false,\n    actionColumn: {\n      width: 100,\n      title: '操作',\n      dataIndex: 'action',\n      //slots: { customRender: 'action' },\n      fixed: undefined,\n    },\n  });\n\n  /**\n   * 新增\n   */\n  function handleCreate() {\n    openModal(true, {\n      isUpdate: false,\n    });\n  }\n\n  /**\n   * 编辑\n   */\n  function handleEdit(record) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n\n  /**\n   * 删除\n   */\n  async function handleDelete(record) {\n    await deleteItem({ id: record.id }, reload);\n  }\n\n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n  function getRowClassName(record) {\n    return record.status == 0 ? prefixCls : '';\n  }\n</script>\n<style scoped lang=\"less\">\n  @prefix-cls: ~'@{namespace}-row-invalid';\n\n  :deep(.@{prefix-cls}) {\n    background: #f4f4f4;\n    color: #bababa;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/dict/components/DictItemModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"getTitle\" @ok=\"handleSubmit\" width=\"800px\">\n    <BasicForm @register=\"registerForm\" >\n      <template #itemColor=\"{ model, field }\">\n        <div class=\"item-tool\">\n          <div\n              v-for=\"(item,index) in Colors\"\n              :style=\"{ color: item[0] }\"\n              :class=\"model.itemColor===item[0]?'item-active':''\"\n              class=\"item-color\"\n              @click=\"itemColorClick(item)\">\n            <div class=\"item-color-border\"></div>\n            <div class=\"item-back\" :style=\"{ background: item[0] }\"></div>\n          </div>\n        </div>\n      </template>\n    </BasicForm>\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { defineProps, ref, computed, unref, reactive } from 'vue';\n  import { BasicModal, useModalInner } from '/src/components/Modal';\n  import { BasicForm, useForm } from '/src/components/Form';\n  import { itemFormSchema } from '../dict.data';\n  import { saveOrUpdateDictItem } from '../dict.api';\n  import { Colors } from '/@/utils/dict/DictColors.js'\n  \n  // 声明Emits\n  const emit = defineEmits(['success', 'register']);\n  const props = defineProps({ dictId: String });\n  const isUpdate = ref(true);\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n    schemas: itemFormSchema,\n    showActionButtonGroup: false,\n    mergeDynamicData: props,\n    labelCol: {\n      xs: { span: 24 },\n      sm: { span: 4 },\n    },\n    wrapperCol: {\n      xs: { span: 24 },\n      sm: { span: 18 },\n    },\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false });\n    isUpdate.value = !!data?.isUpdate;\n    if (unref(isUpdate)) {\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n    }\n  });\n\n  //设置标题\n  const getTitle = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));\n\n  //表单提交事件\n  async function handleSubmit() {\n    try {\n      const values = await validate();\n      values.dictId = props.dictId;\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      await saveOrUpdateDictItem(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n  \n  /**\n   * 字典颜色点击事件\n   * \n   * @param index\n   * @param item\n   * @param model\n   */\n  function itemColorClick(item) {\n    console.log(item)\n    setFieldsValue({ itemColor: item[0] })\n  }\n  \n</script>\n<style lang=\"less\" scoped>\n   /*begin 字典颜色配置样式*/\n  .item-tool{\n    display: flex;\n    flex-wrap: wrap;\n    .item-color{\n      width: 18px;\n      display: flex;\n      justify-content: center;\n      cursor: pointer;\n      align-items: center;\n      margin-right: 10px;\n    }\n    .item-back{\n      width: 18px;\n      height: 18px;\n      border-radius: 50%;\n    }\n  }\n  .item-color-border{\n    visibility: hidden;\n  }\n  .item-active .item-color-border{\n    visibility: visible;\n    position: absolute;\n    border: 1px solid;\n    width: 24px;\n    height: 24px;\n    border-radius: 50%;\n  }\n   /*end 字典颜色配置样式*/\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/dict/components/DictModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"getTitle\" width=\"550px\" @ok=\"handleSubmit\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/src/components/Modal';\n  import { BasicForm, useForm } from '/src/components/Form';\n  import { formSchema } from '../dict.data';\n  import { saveOrUpdateDict } from '../dict.api';\n  // 声明Emits\n  const emit = defineEmits(['register', 'success']);\n  const isUpdate = ref(true);\n  const rowId = ref('');\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n    schemas: formSchema,\n    showActionButtonGroup: false,\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false, minHeight: 80 });\n    isUpdate.value = !!data?.isUpdate;\n    if (unref(isUpdate)) {\n      rowId.value = data.record.id;\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n    }\n  });\n  //设置标题\n  const getTitle = computed(() => (!unref(isUpdate) ? '新增字典' : '编辑字典'));\n  //表单提交事件\n  async function handleSubmit() {\n    try {\n      let values = await validate();\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      await saveOrUpdateDict(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success', { isUpdate: unref(isUpdate), values: { ...values, id: rowId.value } });\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/dict/components/DictRecycleBinModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" title=\"字典回收站\" :showOkBtn=\"false\" width=\"1000px\" destroyOnClose>\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-dropdown v-if=\"checkedKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                批量删除\n              </a-menu-item>\n              <a-menu-item key=\"2\" @click=\"batchHandleRevert\">\n                <Icon icon=\"ant-design:redo-outlined\"></Icon>\n                批量取回\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button\n            >批量操作\n            <Icon icon=\"ant-design:down-outlined\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n    </BasicTable>\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, toRaw } from 'vue';\n  import { BasicModal, useModalInner } from '/src/components/Modal';\n  import { BasicTable, useTable, TableAction } from '/src/components/Table';\n  import { recycleBincolumns } from '../dict.data';\n  import { getRecycleBinList, putRecycleBin, deleteRecycleBin, batchPutRecycleBin, batchDeleteRecycleBin } from '../dict.api';\n  // 声明Emits\n  const emit = defineEmits(['success', 'register']);\n  const checkedKeys = ref<Array<string | number>>([]);\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(() => {\n    checkedKeys.value = [];\n  });\n  //注册table数据\n  const [registerTable, { reload }] = useTable({\n    rowKey: 'id',\n    api: getRecycleBinList,\n    columns: recycleBincolumns,\n    striped: true,\n    useSearchForm: false,\n    showTableSetting: false,\n    clickToRowSelect: false,\n    bordered: true,\n    showIndexColumn: false,\n    pagination: false,\n    tableSetting: { fullScreen: true },\n    canResize: false,\n    actionColumn: {\n      width: 100,\n      title: '操作',\n      dataIndex: 'action',\n      slots: { customRender: 'action' },\n      fixed: undefined,\n    },\n  });\n  /**\n   * 选择列配置\n   */\n  const rowSelection = {\n    type: 'checkbox',\n    columnWidth: 50,\n    selectedRowKeys: checkedKeys,\n    onChange: onSelectChange,\n  };\n  /**\n   * 选择事件\n   */\n  function onSelectChange(selectedRowKeys: (string | number)[]) {\n    checkedKeys.value = selectedRowKeys;\n  }\n  /**\n   * 还原事件\n   */\n  async function handleRevert(record) {\n    await putRecycleBin(record.id, reload);\n    emit('success');\n  }\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteRecycleBin(record.id, reload);\n  }\n  /**\n   * 批量还原事件\n   */\n  function batchHandleRevert() {\n    batchPutRecycleBin({ ids: toRaw(checkedKeys.value).join(',') }, () => {\n      // 代码逻辑说明: 【TV360X-1663】数据字典回收增加批量功能\n      reload();\n      checkedKeys.value = [];\n      emit('success');\n    });\n  }\n  /**\n   * 批量删除事件\n   */\n  function batchHandleDelete() {\n    batchDeleteRecycleBin({ ids: toRaw(checkedKeys.value).join(',') }, () => {\n      // 代码逻辑说明: 【TV360X-1663】数据字典回收增加批量功能\n      checkedKeys.value = [];\n      reload();\n    });\n  }\n  //获取操作栏事件\n  function getTableAction(record) {\n    return [\n      {\n        label: '取回',\n        icon: 'ant-design:redo-outlined',\n        popConfirm: {\n          title: '是否确认取回',\n          confirm: handleRevert.bind(null, record),\n        },\n      },\n      {\n        label: '彻底删除',\n        icon: 'ant-design:scissor-outlined',\n        color: 'error',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/dict/dict.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { Modal } from 'ant-design-vue';\nenum Api {\n  list = '/sys/dict/list',\n  save = '/sys/dict/add',\n  edit = '/sys/dict/edit',\n  duplicateCheck = '/sys/duplicate/check',\n  deleteDict = '/sys/dict/delete',\n  deleteBatch = '/sys/dict/deleteBatch',\n  importExcel = '/sys/dict/importExcel',\n  exportXls = '/sys/dict/exportXls',\n  recycleBinList = '/sys/dict/deleteList',\n  putRecycleBin = '/sys/dict/back',\n  batchPutRecycleBin = '/sys/dict/putRecycleBin',\n  batchDeleteRecycleBin = '/sys/dict/deleteRecycleBin',\n  deleteRecycleBin = '/sys/dict/deletePhysic',\n  itemList = '/sys/dictItem/list',\n  deleteItem = '/sys/dictItem/delete',\n  itemSave = '/sys/dictItem/add',\n  itemEdit = '/sys/dictItem/edit',\n  dictItemCheck = '/sys/dictItem/dictItemCheck',\n  refreshCache = '/sys/dict/refleshCache',\n  queryAllDictItems = '/sys/dict/queryAllDictItems',\n}\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n/**\n * 导入api\n * @param params\n */\nexport const getImportUrl = Api.importExcel;\n/**\n * 字典列表接口\n * @param params\n */\nexport const list = (params) => defHttp.get({ url: Api.list, params });\n/**\n * 删除字典\n */\nexport const deleteDict = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.deleteDict, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 批量删除字典\n * @param params\n */\nexport const batchDeleteDict = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n/**\n * 保存或者更新字典\n * @param params\n */\nexport const saveOrUpdateDict = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({ url: url, params });\n};\n/**\n * 唯一校验\n * @param params\n */\nexport const duplicateCheck = (params) => defHttp.get({ url: Api.duplicateCheck, params }, { isTransformResponse: false });\n/**\n * 字典回收站列表\n * @param params\n */\nexport const getRecycleBinList = (params) => defHttp.get({ url: Api.recycleBinList, params });\n\n/**\n * 回收站批量还原\n * @param params\n */\nexport const batchPutRecycleBin = (params, handleSuccess) => {\n  return defHttp.put({ url: Api.batchPutRecycleBin, params}).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 回收站还原\n * @param params\n */\nexport const putRecycleBin = (id, handleSuccess) => {\n  return defHttp.put({ url: Api.putRecycleBin + `/${id}` }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 回收站批量删除\n * @param params\n */\nexport const batchDeleteRecycleBin = (params, handleSuccess) => {\n  return defHttp.delete({ url: `${Api.batchDeleteRecycleBin}?ids=${params.ids}`}).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 回收站删除\n * @param params\n */\nexport const deleteRecycleBin = (id, handleSuccess) => {\n  return defHttp.delete({ url: Api.deleteRecycleBin + `/${id}` }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 字典配置列表\n * @param params\n */\nexport const itemList = (params) => defHttp.get({ url: Api.itemList, params });\n/**\n * 字典配置删除\n * @param params\n */\nexport const deleteItem = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.deleteItem, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 保存或者更新字典配置\n * @param params\n */\nexport const saveOrUpdateDictItem = (params, isUpdate) => {\n  let url = isUpdate ? Api.itemEdit : Api.itemSave;\n  return defHttp.post({ url: url, params });\n};\n/**\n * 校验字典数据值\n * @param params\n */\nexport const dictItemCheck = (params) => defHttp.get({ url: Api.dictItemCheck, params }, { isTransformResponse: false });\n/**\n * 刷新字典\n * @param params\n */\nexport const refreshCache = () => defHttp.get({ url: Api.refreshCache }, { isTransformResponse: false });\n/**\n * 获取所有字典项\n * @param params\n */\nexport const queryAllDictItems = () => defHttp.get({ url: Api.queryAllDictItems }, { isTransformResponse: false });\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/dict/dict.data.ts",
    "content": "import { BasicColumn } from '/@/components/Table';\nimport { FormSchema } from '/@/components/Table';\nimport { dictItemCheck } from './dict.api';\nimport { rules } from '/@/utils/helper/validator';\nimport { h } from \"vue\";\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '字典名称',\n    dataIndex: 'dictName',\n    width: 240,\n  },\n  {\n    title: '字典编码',\n    dataIndex: 'dictCode',\n    width: 240,\n  },\n  {\n    title: '描述',\n    dataIndex: 'description',\n    // width: 120\n  },\n];\n\nexport const recycleBincolumns: BasicColumn[] = [\n  {\n    title: '字典名称',\n    dataIndex: 'dictName',\n    width: 120,\n  },\n  {\n    title: '字典编码',\n    dataIndex: 'dictCode',\n    width: 120,\n  },\n  {\n    title: '描述',\n    dataIndex: 'description',\n    width: 120,\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    label: '字典名称',\n    field: 'dictName',\n    component: 'JInput',\n    colProps: { span: 6 },\n  },\n  {\n    label: '字典编码',\n    field: 'dictCode',\n    component: 'JInput',\n    colProps: { span: 6 },\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    label: '',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '字典名称',\n    field: 'dictName',\n    required: true,\n    component: 'Input',\n  },\n  {\n    label: '字典编码',\n    field: 'dictCode',\n    component: 'Input',\n    dynamicDisabled: ({ values }) => {\n      return !!values.id;\n    },\n    dynamicRules: ({ model, schema }) => rules.duplicateCheckRule('sys_dict', 'dict_code', model, schema, true),\n  },\n  {\n    label: '描述',\n    field: 'description',\n    component: 'Input',\n  },\n];\n\nexport const dictItemColumns: BasicColumn[] = [\n  {\n    title: '名称',\n    dataIndex: 'itemText',\n    width: 80,\n  },\n  {\n    title: '数据值',\n    dataIndex: 'itemValue',\n    width: 80,\n  },\n  {\n    title: '字典颜色',\n    dataIndex: 'itemColor',\n    width: 80,\n    align:'center',\n    customRender:({ text }) => {\n      return h('div', {\n        style: {\"background\": text, \"width\":\"18px\",\"height\":\"18px\",\"border-radius\":\"50%\",\"margin\":\"0 auto\"}\n      })\n    }\n  },\n];\n\nexport const dictItemSearchFormSchema: FormSchema[] = [\n  {\n    label: '名称',\n    field: 'itemText',\n    component: 'Input',\n  },\n  {\n    label: '状态',\n    field: 'status',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'dict_item_status',\n      stringToNumber: true,\n    },\n  },\n];\n\nexport const itemFormSchema: FormSchema[] = [\n  {\n    label: '',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '名称',\n    field: 'itemText',\n    required: true,\n    component: 'Input',\n  },\n  {\n    label: '数据值',\n    field: 'itemValue',\n    component: 'Input',\n    dynamicRules: ({ values, model }) => {\n      return [\n        {\n          required: true,\n          validator: (_, value) => {\n            if (!value) {\n              return Promise.reject('请输入数据值');\n            }\n            if (new RegExp(\"[`~!@#$^&*()=|{}'.<>《》/?！￥（）—【】‘；：”“。，、？]\").test(value)) {\n              return Promise.reject('数据值不能包含特殊字符！');\n            }\n            return new Promise<void>((resolve, reject) => {\n              let params = {\n                dictId: values.dictId,\n                id: model.id,\n                itemValue: value,\n              };\n              dictItemCheck(params)\n                .then((res) => {\n                  res.success ? resolve() : reject(res.message || '校验失败');\n                })\n                .catch((err) => {\n                  reject(err.message || '验证失败');\n                });\n            });\n          },\n        },\n      ];\n    },\n  },\n  {\n    label: '颜色值',\n    field: 'itemColor',\n    component: 'Input',\n    slot:'itemColor'\n  },\n  {\n    label: '描述',\n    field: 'description',\n    component: 'Input',\n  },\n  {\n    field: 'sortOrder',\n    label: '排序',\n    component: 'InputNumber',\n    defaultValue: 1,\n  },\n  {\n    field: 'status',\n    label: '是否启用',\n    defaultValue: 1,\n    component: 'JDictSelectTag',\n    componentProps: {\n      type: 'radioButton',\n      dictCode: 'dict_item_status',\n      stringToNumber: true,\n    },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/dict/index.vue",
    "content": "<template>\n  <!--引用表格-->\n  <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n    <!--插槽:table标题-->\n    <template #tableTitle>\n      <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"handleCreate\"> 新增</a-button>\n      <a-button type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n      <j-upload-button type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n      <a-button type=\"primary\" @click=\"handlerRefreshCache\" preIcon=\"ant-design:sync-outlined\"> 刷新缓存</a-button>\n      <a-button type=\"primary\" @click=\"openRecycleModal(true)\" preIcon=\"ant-design:hdd-outlined\"> 回收站</a-button>\n\n      <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n        <template #overlay>\n          <a-menu>\n            <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n              <Icon icon=\"ant-design:delete-outlined\"></Icon>\n              删除\n            </a-menu-item>\n          </a-menu>\n        </template>\n        <a-button\n          >批量操作\n          <Icon icon=\"ant-design:down-outlined\"></Icon>\n        </a-button>\n      </a-dropdown>\n    </template>\n    <!--操作栏-->\n    <template #action=\"{ record }\">\n      <TableAction :actions=\"getTableAction(record)\" />\n    </template>\n  </BasicTable>\n  <!--字典弹窗-->\n  <DictModal @register=\"registerModal\" @success=\"handleSuccess\" />\n  <!--字典配置抽屉-->\n  <DictItemList @register=\"registerDrawer\" />\n  <!--回收站弹窗-->\n  <DictRecycleBinModal @register=\"registerModal1\" @success=\"reload\" />\n</template>\n\n<script lang=\"ts\" name=\"system-dict\" setup>\n  //ts语法\n  import { ref, computed, unref } from 'vue';\n  import { BasicTable, TableAction } from '/src/components/Table';\n  import { useDrawer } from '/src/components/Drawer';\n  import { useModal } from '/src/components/Modal';\n  import DictItemList from './components/DictItemList.vue';\n  import DictModal from './components/DictModal.vue';\n  import DictRecycleBinModal from './components/DictRecycleBinModal.vue';\n  import { useMessage } from '/src/hooks/web/useMessage';\n  import { removeAuthCache, setAuthCache } from '/src/utils/auth';\n  import { columns, searchFormSchema } from './dict.data';\n  import { list, deleteDict, batchDeleteDict, getExportUrl, getImportUrl, refreshCache, queryAllDictItems } from './dict.api';\n  import { DB_DICT_DATA_KEY } from '/src/enums/cacheEnum';\n  import { useUserStore } from '/@/store/modules/user';\n\n  const { createMessage } = useMessage();\n  //字典model\n  const [registerModal, { openModal }] = useModal();\n  //字典配置drawer\n  const [registerDrawer, { openDrawer }] = useDrawer();\n  import { useListPage } from '/@/hooks/system/useListPage';\n\n  //回收站model\n  const [registerModal1, { openModal: openRecycleModal }] = useModal();\n\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({\n    designScope: 'dict-template',\n    tableProps: {\n      title: '数据字典',\n      api: list,\n      columns: columns,\n      formConfig: {\n        schemas: searchFormSchema,\n      },\n      actionColumn: {\n        width: 240,\n      },\n    },\n    // 代码逻辑说明: [issues/I5AMDD]导入/导出功能，操作后提示没有传递 export.url/import.url 参数------------\n    exportConfig: {\n      name: '数据字典列表',\n      url: getExportUrl,\n    },\n    importConfig: {\n      url: getImportUrl,\n    },\n  });\n\n  //注册table数据\n  const [registerTable, { reload, updateTableDataRecord }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext;\n\n  /**\n   * 新增事件\n   */\n  function handleCreate() {\n    openModal(true, {\n      isUpdate: false,\n    });\n  }\n  /**\n   * 编辑事件\n   */\n  async function handleEdit(record: Recordable) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n  /**\n   * 详情\n   */\n  async function handleDetail(record) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteDict({ id: record.id }, reload);\n  }\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDeleteDict({ ids: selectedRowKeys.value }, () => {\n      // 代码逻辑说明: 【TV360X-1665】数据字典批量删除后选中也清空\n      reload();\n      selectedRowKeys.value = [];\n      selectedRows.value = [];\n    });\n  }\n  /**\n   * 成功回调\n   */\n  function handleSuccess({ isUpdate, values }) {\n    if (isUpdate) {\n      updateTableDataRecord(values.id, values);\n    } else {\n      reload();\n    }\n  }\n  /**\n   * 刷新缓存\n   */\n  async function handlerRefreshCache() {\n    const result = await refreshCache();\n    if (result.success) {\n      const res = await queryAllDictItems();\n      removeAuthCache(DB_DICT_DATA_KEY);\n      // 代码逻辑说明: 【QQYUN-6417】生产环境字典慢的问题\n      const userStore = useUserStore();\n      userStore.setAllDictItems(res.result);\n      createMessage.success('刷新缓存完成！');\n    } else {\n      createMessage.error('刷新缓存失败！');\n    }\n  }\n  /**\n   * 字典配置\n   */\n  function handleItem(record) {\n    openDrawer(true, {\n      id: record.id,\n    });\n  }\n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '字典配置',\n        onClick: handleItem.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '确定删除吗?',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/examples/demo/DemoModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"title\" @ok=\"handleSubmit\" width=\"40%\">\n    <BasicForm @register=\"registerForm\" :disabled=\"isDisabled\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { formSchema } from './demo.data';\n  import { saveOrUpdateDemo, getDemoById } from './demo.api';\n  // 声明Emits\n  const emit = defineEmits(['register', 'success']);\n  const isUpdate = ref(true);\n\n  //自定义接受参数\n  const props = defineProps({\n    //是否禁用页面\n    isDisabled: {\n      type: Boolean,\n      default: false,\n    },\n  });\n\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n    //labelWidth: 150,\n    schemas: formSchema,\n    showActionButtonGroup: false,\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false, showOkBtn: !props.isDisabled});\n    isUpdate.value = !!data?.isUpdate;\n    if(data.createBy){\n      await setFieldsValue({createBy: data.createBy})\n    }\n    if(data.createTime){\n      await setFieldsValue({createTime: data.createTime})\n    }\n    if (unref(isUpdate)) {\n      //获取详情\n      data.record = await getDemoById({ id: data.record.id });\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n    }\n  });\n  //设置标题\n  const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));\n  //表单提交事件\n  async function handleSubmit(v) {\n    try {\n      let values = await validate();\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      await saveOrUpdateDemo(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success', values);\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/examples/demo/demo.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { Modal } from 'ant-design-vue';\n\nenum Api {\n  list = '/test/jeecgDemo/list',\n  save = '/test/jeecgDemo/add',\n  edit = '/test/jeecgDemo/edit',\n  get = '/test/jeecgDemo/queryById',\n  delete = '/test/jeecgDemo/delete',\n  deleteBatch = '/test/jeecgDemo/deleteBatch',\n  exportXls = '/test/jeecgDemo/exportXls',\n  importExcel = '/test/jeecgDemo/importExcel',\n}\n/**\n * 导出api\n */\nexport const getExportUrl = Api.exportXls;\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n/**\n * 查询示例列表\n * @param params\n */\nexport const getDemoList = (params) => {\n  return defHttp.get({ url: Api.list, params });\n};\n\n/**\n * 保存或者更新示例\n * @param params\n */\nexport const saveOrUpdateDemo = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({ url: url, params });\n};\n\n/**\n * 查询示例详情\n * @param params\n */\nexport const getDemoById = (params) => {\n  return defHttp.get({ url: Api.get, params });\n};\n\n/**\n * 删除示例\n * @param params\n */\nexport const deleteDemo = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.delete, data: params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n\n/**\n * 批量删除示例\n * @param params\n */\nexport const batchDeleteDemo = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/examples/demo/demo.data.ts",
    "content": "import { BasicColumn } from '/@/components/Table';\nimport { FormSchema } from '/@/components/Table';\nimport { render } from '/@/utils/common/renderUtils';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '姓名',\n    dataIndex: 'name',\n    width: 170,\n    align: 'left',\n    resizable: true,\n    sorter: {\n      multiple:1\n    }\n  },\n  {\n    title: '关键词',\n    dataIndex: 'keyWord',\n    width: 130,\n    resizable: true,\n  },\n  {\n    title: '打卡时间',\n    dataIndex: 'punchTime',\n    width: 140,\n    resizable: true,\n  },\n  {\n    title: '工资',\n    dataIndex: 'salaryMoney',\n    width: 140,\n    resizable: true,\n    sorter: {\n      multiple: 2\n    }\n  },\n  {\n    title: '奖金',\n    dataIndex: 'bonusMoney',\n    width: 140,\n    resizable: true,\n  },\n  {\n    title: '性别',\n    dataIndex: 'sex',\n    sorter: {\n      multiple: 3\n    },\n    customRender: ({ record }) => {\n      return render.renderDict(record.sex, 'sex', true);\n      // let v = record.sex ? (record.sex == '1' ? '男' : '女') : '';\n      // return h('span', v);\n    },\n    width: 120,\n    resizable: true,\n  },\n  {\n    title: '生日',\n    dataIndex: 'birthday',\n    width: 120,\n    resizable: true,\n  },\n  {\n    title: '邮箱',\n    dataIndex: 'email',\n    width: 120,\n    resizable: true,\n  },\n  {\n    title: '个人简介',\n    dataIndex: 'content',\n    width: 120,\n    resizable: true,\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'name',\n    label: '姓名',\n    component: 'Input',\n    componentProps: {\n      trim: true,\n    },\n    colProps: { span: 8 },\n  },\n  {\n    field: 'birthday',\n    label: '生日',\n    component: 'RangePicker',\n    componentProps: {\n      valueType: 'Date'\n    },\n    colProps: { span: 8 },\n  },\n  {\n    field: 'age',\n    label: '年龄',\n    component: 'Input',\n    slot: 'age',\n    colProps: { span: 8 },\n  },\n  {\n    field: 'sex',\n    label: '性别',\n    colProps: { span: 8 },\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'sex',\n      placeholder: '请选择性别',\n    },\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    field: 'id',\n    label: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    field: 'createBy',\n    label: 'createBy',\n    component: 'Input',\n    show: false,\n  },\n  {\n    field: 'createTime',\n    label: 'createTime',\n    component: 'Input',\n    show: false,\n  },\n  {\n    field: 'name',\n    label: '名字',\n    component: 'Input',\n    required: true,\n    componentProps: {\n      placeholder: '请输入名字',\n    },\n  },\n  {\n    field: 'keyWord',\n    label: '关键词',\n    component: 'Input',\n    componentProps: {\n      placeholder: '请输入关键词',\n    },\n  },\n  {\n    field: 'punchTime',\n    label: '打卡时间',\n    component: 'DatePicker',\n    componentProps: {\n      showTime: true,\n      valueFormat: 'YYYY-MM-DD HH:mm:ss',\n      placeholder: '请选择打卡时间',\n    },\n  },\n  {\n    field: 'salaryMoney',\n    label: '工资',\n    component: 'Input',\n    componentProps: {\n      placeholder: '请输入工资',\n    },\n  },\n  {\n    field: 'sex',\n    label: '性别',\n    component: 'JDictSelectTag',\n    defaultValue: '1',\n    componentProps: {\n      type: 'radio',\n      dictCode: 'sex',\n      placeholder: '请选择性别',\n    },\n  },\n  {\n    field: 'age',\n    label: '年龄',\n    component: 'InputNumber',\n    defaultValue: 1,\n    componentProps: {\n      placeholder: '请输入年龄',\n    },\n  },\n  {\n    field: 'birthday',\n    label: '生日',\n    component: 'DatePicker',\n    defaultValue: '',\n    componentProps: {\n      valueFormat: 'YYYY-MM-DD',\n      placeholder: '请选择生日',\n    },\n  },\n  {\n    field: 'email',\n    label: '邮箱',\n    component: 'Input',\n    rules: [{ required: false, type: 'email', message: '邮箱格式不正确', trigger: 'blur' }],\n    componentProps: {\n      placeholder: '请输入邮箱',\n    },\n  },\n  {\n    field: 'content',\n    label: '个人简介 - To introduce myself',\n    component: 'InputTextArea',\n    labelLength: 4,\n    componentProps: {\n      placeholder: '请输入个人简介',\n    },\n  },\n  {\n    field: 'updateCount',\n    label: '乐观锁',\n    show: false,\n    component: 'Input',\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/examples/demo/index.vue",
    "content": "<template>\n  <div>\n    <!--自定义查询区域-->\n    <div class=\"jeecg-basic-table-form-container\" @keyup.enter=\"searchQuery\" v-if=\"customSearch\">\n      <a-form ref=\"formRef\" :model=\"queryParam\" :label-col=\"labelCol\" :wrapper-col=\"wrapperCol\">\n        <a-row :gutter=\"24\">\n          <a-col :lg=\"8\">\n            <a-form-item label=\"用户名\">\n              <a-input placeholder=\"请输入名称模糊查询\" v-model:value=\"queryParam.name\"></a-input>\n            </a-form-item>\n          </a-col>\n          <a-col :lg=\"8\">\n            <a-form-item label=\"年龄\">\n              <a-input placeholder=\"最小年龄\" type=\"ge\" v-model:value=\"queryParam.age_begin\" style=\"width: calc(50% - 15px)\"></a-input>\n              <span>~</span>\n              <a-input placeholder=\"最大年龄\" type=\"le\" v-model:value=\"queryParam.age_end\" style=\"width: calc(50% - 15px)\"></a-input>\n            </a-form-item>\n          </a-col>\n          <template v-if=\"toggleSearchStatus\">\n            <a-col :lg=\"8\">\n              <a-form-item label=\"性别\">\n                <JDictSelectTag v-model:value=\"queryParam.sex\" placeholder=\"请选择性别\" dictCode=\"sex\" />\n              </a-form-item>\n            </a-col>\n            <a-col :lg=\"8\">\n              <a-form-item label=\"选择用户\">\n                <JDictSelectTag v-model:value=\"queryParam.id\" placeholder=\"请选择用户\" dictCode=\"demo,name,id\" />\n              </a-form-item>\n            </a-col>\n          </template>\n          <span style=\"float: left; overflow: hidden\" class=\"table-page-search-submitButtons\">\n            <a-col :lg=\"6\">\n              <a-button type=\"primary\" preIcon=\"ant-design:search-outlined\" @click=\"searchQuery\">查询</a-button>\n              <a-button type=\"primary\" preIcon=\"ant-design:reload-outlined\" @click=\"searchReset\" style=\"margin-left: 8px\">重置</a-button>\n              <a @click=\"toggleSearchStatus = !toggleSearchStatus\" style=\"margin-left: 8px\">\n                {{ toggleSearchStatus ? '收起' : '展开' }}\n                <Icon :icon=\"toggleSearchStatus ? 'ant-design:up-outlined' : 'ant-design:down-outlined'\" />\n              </a>\n            </a-col>\n          </span>\n        </a-row>\n      </a-form>\n    </div>\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\" :class=\"{ 'p-4': customSearch }\">\n      <template #form-age=\"{ model, field }\">\n        <a-input placeholder=\"最小年龄\" type=\"ge\" v-model:value=\"min\" style=\"width: calc(50% - 15px)\" @change=\"ageChange(model, field)\"></a-input>\n        <span>~</span>\n        <a-input placeholder=\"最大年龄\" type=\"le\" v-model:value=\"max\" style=\"width: calc(50% - 15px)\" @change=\"ageChange(model, field)\"></a-input>\n      </template>\n      <template #tableTitle>\n        <a-button preIcon=\"ant-design:plus-outlined\" type=\"primary\" @click=\"handleAdd\">新增</a-button>\n        <a-upload name=\"file\" :showUploadList=\"false\" :customRequest=\"(file) => handleImportXls(file, getImportUrl, reload)\">\n          <a-button preIcon=\"ant-design:import-outlined\" type=\"primary\">导入</a-button>\n        </a-upload>\n        <a-button preIcon=\"ant-design:export-outlined\" type=\"primary\" @click=\"handleExportXls('单表示例', getExportUrl,exportParams)\">导出</a-button>\n        <a-button preIcon=\"ant-design:plus-outlined\" type=\"primary\" @click=\"openTab\">打开Tab页</a-button>\n        <a-button preIcon=\"ant-design:retweet-outlined\" type=\"primary\" @click=\"customSearch = !customSearch\">{{\n          customSearch ? '表单配置查询' : '自定义查询'\n        }}</a-button>\n        <a-button preIcon=\"ant-design:import-outlined\" type=\"primary\" @click=\"handleImport\">弹窗导入</a-button>\n\n        <super-query :config=\"superQueryConfig\" @search=\"handleSuperQuery\"/>\n\n        <a-dropdown v-if=\"checkedKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button\n            >批量操作\n            <Icon style=\"fontsize: 12px\" icon=\"ant-design:down-outlined\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getActions(record)\" />\n      </template>\n    </BasicTable>\n    <DemoModal @register=\"registerModal\" @success=\"reload\" :isDisabled=\"isDisabled\"/>\n    <JImportModal @register=\"registerModalJimport\" :url=\"getImportUrl\" online />\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, unref, reactive, toRaw, watch,computed } from 'vue';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import DemoModal from './DemoModal.vue';\n  import JImportModal from '/@/components/Form/src/jeecg/components/JImportModal.vue';\n  import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useMethods } from '/@/hooks/system/useMethods';\n  import { getDemoList, deleteDemo, batchDeleteDemo, getExportUrl, getImportUrl } from './demo.api';\n  import { columns, searchFormSchema } from './demo.data';\n  import { useGo } from '/@/hooks/web/usePage';\n  import { router } from '/@/router';\n  import { filterObj } from '/@/utils/common/compUtils';\n  \n  const go = useGo();\n  const checkedKeys = ref<Array<string | number>>([]);\n  const [registerModal, { openModal }] = useModal();\n  const [registerModalJimport, { openModal: openModalJimport }] = useModal();\n  const { handleExportXls, handleImportXls } = useMethods();\n  const min = ref();\n  const max = ref();\n  const isDisabled = ref(false);\n  \n  const [registerTable, { reload, setProps }] = useTable({\n    title: '单表示例',\n    api: getDemoList,\n    columns,\n    formConfig: {\n      //labelWidth: 120,\n      schemas: searchFormSchema,\n      fieldMapToTime: [['birthday', ['birthday_begin', 'birthday_end'], 'YYYY-MM-DD']],\n      fieldMapToNumber: [['age', ['age_begin', 'age_end']]],\n      autoAdvancedCol: 2,\n      actionColOptions: {\n        style: { textAlign: 'left' },\n      },\n    },\n    //自定义默认多字段排序\n    defSort: [\n      {\n        column: 'name',\n        order: 'desc',\n      },\n      {\n        column: 'sex',\n        order: 'asc',\n      },\n    ],\n    striped: true,\n    useSearchForm: true,\n    showTableSetting: true,\n    clickToRowSelect: false,\n    bordered: true,\n    showIndexColumn: false,\n    tableSetting: { fullScreen: true },\n    canResize: false,\n    rowKey: 'id',\n    actionColumn: {\n      width: 180,\n      title: '操作',\n      dataIndex: 'action',\n      slots: { customRender: 'action' },\n      fixed: undefined,\n    },\n  });\n  /**\n   * 选择列配置\n   */\n  const rowSelection = {\n    type: 'checkbox',\n    columnWidth: 40,\n    selectedRowKeys: checkedKeys,\n    onChange: onSelectChange,\n  };\n\n  function handleImport() {\n    openModalJimport(true);\n  }\n\n  const exportParams = computed(()=>{\n    let paramsForm = {};\n    if (checkedKeys.value && checkedKeys.value.length > 0) {\n      paramsForm['selections'] = checkedKeys.value.join(',');\n    }\n    return filterObj(paramsForm)\n  })\n  /**\n   * 操作列定义\n   * @param record\n   */\n  function getActions(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n\n  /**\n   * 选择事件\n   */\n  function onSelectChange(selectedRowKeys: (string | number)[]) {\n    console.log(\"checkedKeys------>\",checkedKeys)\n    checkedKeys.value = selectedRowKeys;\n  }\n\n  /**\n   * 新增事件\n   */\n  function handleAdd() {\n    isDisabled.value = false;\n    openModal(true, {\n      isUpdate: false,\n    });\n  }\n\n  /**\n   * 编辑事件\n   */\n  function handleEdit(record) {\n    isDisabled.value = false;\n    openModal(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n\n  /**\n   * 详情页面\n   */\n  function handleDetail(record) {\n    isDisabled.value = true;\n    openModal(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteDemo({ id: record.id }, reload);\n  }\n\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDeleteDemo({ ids: checkedKeys.value }, reload);\n  }\n  /**\n   * 年龄修改事件\n   */\n  function ageChange(model, field) {\n    model[field] = [unref(min), unref(max)];\n  }\n\n  /**\n   * 打开tab页面\n   */\n  function openTab() {\n    go(`/comp/jeecg/basic`);\n  }\n  //-----自定义查询----begin--------\n  const formElRef = ref();\n  const labelCol = reactive({\n    xs: { span: 24 },\n    sm: { span: 7 },\n  });\n  const wrapperCol = reactive({\n    xs: { span: 24 },\n    sm: { span: 16 },\n  });\n  const toggleSearchStatus = ref(false);\n  const customSearch = ref(false);\n  const queryParam = reactive({\n    name: '',\n    age_begin: '',\n    age_end: '',\n    sex: '',\n    id: '',\n  });\n  watch(customSearch, () => {\n    setProps({ useSearchForm: !unref(customSearch) });\n  });\n  function searchQuery() {\n    setProps({ searchInfo: toRaw(queryParam) });\n    reload();\n  }\n  function searchReset() {\n    Object.assign(queryParam, { name: '', age_begin: '', age_end: '', sex: '', id: '' });\n    reload();\n  }\n  //自定义查询----end---------\n\n  const superQueryConfig = reactive({\n    name:{ title: \"名称\", view: \"text\", type: \"string\", order: 1 },\n    sex:{ title: \"性别\", view: \"list\", type: \"string\", dictCode:'sex', order: 2 },\n  });\n  \n  function handleSuperQuery(params) {\n    Object.keys(params).map(k=>{\n      queryParam[k] = params[k]\n    });\n    searchQuery();\n  }\n</script>\n<style lang=\"less\" scoped>\n  .jeecg-basic-table-form-container {\n    .table-page-search-submitButtons {\n      display: block;\n      margin-bottom: 24px;\n      white-space: nowrap;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/fillRule/FillRuleModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"title\" @ok=\"handleSubmit\" :width=\"800\" destroyOnClose>\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { formSchema } from './fill.rule.data';\n  import { saveFillRule, updateFillRule } from './fill.rule.api';\n  import {useMessage} from \"@/hooks/web/useMessage\";\n\n  const { createMessage: $message } = useMessage();\n\n  //设置标题\n  const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));\n\n  // 声明Emits\n  const emit = defineEmits(['register', 'success']);\n  const isUpdate = ref(true);\n\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate, getFieldsValue }] = useForm({\n    schemas: formSchema,\n    showActionButtonGroup: false,\n    baseColProps: { span: 12 },\n  });\n\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false });\n    isUpdate.value = !!data?.isUpdate;\n    if (unref(isUpdate)) {\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n    }\n  });\n\n  //表单提交事件\n  async function handleSubmit() {\n    try {\n      let formValue = await validate();\n\n      // 检查参数是否合法\n      let ruleParams = formValue.ruleParams;\n      if (!!ruleParams) {\n        ruleParams = JSON.parse(ruleParams);\n        for (const key of Object.keys(ruleParams)) {\n          // online 保留字检查\n          if (key === 'onl_watch') {\n            $message.error('参数名称不能是onl_watch');\n            return\n          }\n        }\n      }\n\n      setModalProps({ confirmLoading: true });\n      if (isUpdate.value) {\n        let allFieldsValue = getFieldsValue();\n        // 编辑页面 如果表单没有父级下拉框 则提交时候 validate方法不返该值 需要手动设置\n        if (!formValue.parentId && allFieldsValue.parentId) {\n          formValue.parentId = allFieldsValue.parentId;\n        }\n        await updateFillRule(formValue);\n      } else {\n        await saveFillRule(formValue);\n      }\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/fillRule/fill.rule.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { Modal } from 'ant-design-vue';\n\nenum Api {\n  list = '/sys/fillRule/list',\n  test = '/sys/fillRule/testFillRule',\n  save = '/sys/fillRule/add',\n  edit = '/sys/fillRule/edit',\n  delete = '/sys/fillRule/delete',\n  deleteBatch = '/sys/fillRule/deleteBatch',\n  exportXls = '/sys/fillRule/exportXls',\n  importExcel = '/sys/fillRule/importExcel',\n}\n\n/**\n * 导出地址\n */\nexport const exportUrl = Api.exportXls;\n/**\n * 导入地址\n */\nexport const importUrl = Api.importExcel;\n\n/**\n * 列表查询\n * @param params\n */\nexport const getFillRuleList = (params) => {\n  return defHttp.get({ url: Api.list, params });\n};\n\n/**\n * 删除\n * @param params\n * @param handleSuccess\n */\nexport const deleteFillRule = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.delete, data: params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n\n/**\n * 批量删除\n * @param params\n */\nexport const batchDeleteFillRule = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n\n/**\n * 规则功能测试\n * @param params\n */\nexport const handleTest = (params) => {\n  return defHttp.get({ url: Api.test, params }, { isTransformResponse: false });\n};\n\n/**\n * 保存\n * @param params\n */\nexport const saveFillRule = (params) => {\n  return defHttp.post({ url: Api.save, params });\n};\n\n/**\n * 更新\n * @param params\n */\nexport const updateFillRule = (params) => {\n  return defHttp.put({ url: Api.edit, params });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/fillRule/fill.rule.data.ts",
    "content": "import { BasicColumn, FormSchema } from '/@/components/Table';\nimport { duplicateCheckDelay } from '/@/views/system/user/user.api';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '规则名称',\n    dataIndex: 'ruleName',\n    width: 200,\n    align: 'center',\n  },\n  {\n    title: '规则编码',\n    dataIndex: 'ruleCode',\n    width: 200,\n    align: 'center',\n  },\n  {\n    title: '规则实现类',\n    dataIndex: 'ruleClass',\n    width: 300,\n    align: 'center',\n  },\n  {\n    title: '规则参数',\n    dataIndex: 'ruleParams',\n    width: 200,\n    align: 'center',\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'ruleName',\n    label: '规则名称',\n    component: 'Input',\n    colProps: { span: 6 },\n  },\n  {\n    field: 'ruleCode',\n    label: '规则编码',\n    component: 'Input',\n    colProps: { span: 6 },\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    label: '',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    field: 'ruleName',\n    label: '规则名称',\n    component: 'Input',\n    required: true,\n    colProps: { span: 24 },\n  },\n  {\n    field: 'ruleCode',\n    label: '规则编码',\n    component: 'Input',\n    colProps: { span: 24 },\n    dynamicDisabled: ({ values }) => {\n      return !!values.id;\n    },\n    dynamicRules: ({ model }) => {\n      return [\n        {\n          required: true,\n          validator: (_, value) => {\n            return new Promise((resolve, reject) => {\n              if (!value) {\n                return reject('请输入规则编码！');\n              }\n              let params = {\n                tableName: 'sys_fill_rule',\n                fieldName: 'rule_code',\n                fieldVal: value,\n                dataId: model.id,\n              };\n              duplicateCheckDelay(params)\n                .then((res) => {\n                  res.success ? resolve() : reject('规则编码已存在!');\n                })\n                .catch((err) => {\n                  reject(err.message || '校验失败');\n                });\n            });\n          },\n        },\n      ];\n    },\n  },\n  {\n    field: 'ruleClass',\n    label: '规则实现类',\n    component: 'Input',\n    required: true,\n    colProps: { span: 24 },\n  },\n  {\n    field: 'ruleParams',\n    label: '规则参数',\n    colProps: { span: 24 },\n    component: 'JAddInput',\n    componentProps: {\n      min: 0,\n    },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/fillRule/index.vue",
    "content": "<template>\n  <div :class=\"prefixCls\">\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-button preIcon=\"ant-design:plus-outlined\" type=\"primary\" @click=\"handleAdd\">新增</a-button>\n        <a-button type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n        <j-upload-button type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                <span>删除</span>\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button>\n            <span>批量操作</span>\n            <Icon icon=\"mdi:chevron-down\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\" />\n      </template>\n    </BasicTable>\n    <FillRuleModal @register=\"registerModal\" @success=\"reload\" />\n  </div>\n</template>\n\n<script name=\"system-fillrule\" lang=\"ts\" setup>\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { getFillRuleList, exportUrl, importUrl, deleteFillRule, batchDeleteFillRule, handleTest } from '/@/views/system/fillRule/fill.rule.api';\n  import { columns, searchFormSchema } from '/@/views/system/fillRule/fill.rule.data';\n  import { useModal } from '/@/components/Modal';\n  import { ActionItem } from '/@/components/Table';\n  const [registerModal, { openModal }] = useModal();\n  import FillRuleModal from '/@/views/system/fillRule/FillRuleModal.vue';\n\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext, createMessage, createSuccessModal, onExportXls, onImportXls } = useListPage({\n    designScope: 'fill-rule',\n    tableProps: {\n      title: '填值规则管理页面',\n      api: getFillRuleList,\n      columns: columns,\n      showIndexColumn: true,\n      formConfig: {\n        schemas: searchFormSchema,\n      },\n    },\n    exportConfig: {\n      url: exportUrl,\n      name: '填值规则列表',\n    },\n    importConfig: {\n      url: importUrl,\n      success: () => reload(),\n    },\n  });\n  // 注册 ListTable\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;\n\n  /**\n   * 新增事件\n   */\n  function handleAdd() {\n    openModal(true, {\n      isUpdate: false,\n    });\n  }\n\n  /**\n   * 编辑事件\n   */\n  function handleEdit(record) {\n    console.log('record....', record);\n    openModal(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    console.log(12345, record);\n    await deleteFillRule({ id: record.id }, reload);\n  }\n\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDeleteFillRule({ ids: selectedRowKeys.value }, () => {\n      selectedRowKeys.value = [];\n      reload();\n    });\n  }\n\n  /**\n   * 功能测试\n   */\n  function testRule(record) {\n    let params = { ruleCode: record.ruleCode };\n    handleTest(params).then((res) => {\n      if (res.success) {\n        createSuccessModal({\n          title: '填值规则功能测试',\n          content: '生成结果：' + res.result,\n        });\n      } else {\n        createMessage.warn(res.message);\n      }\n    });\n  }\n\n  /**\n   * 编辑\n   */\n  function getTableAction(record): ActionItem[] {\n    return [{ label: '编辑', onClick: handleEdit.bind(null, record) }];\n  }\n\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record): ActionItem[] {\n    return [\n      { label: '功能测试', onClick: testRule.bind(null, record) },\n      {\n        label: '删除',\n        color: 'error',\n        popConfirm: {\n          title: '确认要删除吗？',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/homeConfig/components/HomeConfigModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" title=\"首页配置\" @ok=\"handleSubmit\" :width=\"600\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { formSchema } from '../home.data';\n  import { saveOrUpdate } from '../home.api';\n  // Emits声明\n  const emit = defineEmits(['register', 'success']);\n  const isUpdate = ref(false);\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n    labelWidth: 100,\n    baseRowStyle: { marginTop: '10px' },\n    schemas: formSchema,\n    showActionButtonGroup: false,\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false });\n    isUpdate.value = !!data?.isUpdate;\n    if (unref(isUpdate)) {\n      const record = {...data.values}\n      //表单赋值\n      if (record.relationType == 'USER') {\n        record.userCode = record.roleCode;\n      }\n      //表单赋值\n      if (record.relationType == 'DEFAULT') {\n        record.roleCode = '';\n      }\n      await setFieldsValue({\n        ...record,\n      });\n    }\n  });\n\n  //表单提交事件\n  async function handleSubmit() {\n    try {\n      let values = await validate();\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      if(values.relationType == 'USER'){\n        values.roleCode = values.userCode;\n      }\n      if(values.relationType == 'DEFAULT'){\n        values.roleCode = 'DEF_INDEX_ALL';\n      }\n      await saveOrUpdate(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/homeConfig/home.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { Modal } from 'ant-design-vue';\n\nenum Api {\n  list = '/sys/sysRoleIndex/list',\n  save = '/sys/sysRoleIndex/add',\n  edit = '/sys/sysRoleIndex/edit',\n  deleteIndex = '/sys/sysRoleIndex/delete',\n  deleteBatch = '/sys/sysRoleIndex/deleteBatch',\n  queryIndexByCode = '/sys/sysRoleIndex/queryByCode',\n}\n/**\n * 系统角色列表\n * @param params\n */\nexport const list = (params) => defHttp.get({ url: Api.list, params });\n\n/**\n * 删除角色\n */\nexport const deleteIndex = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.deleteIndex, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 批量删除角色\n * @param params\n */\nexport const batchDelete = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n/**\n * 保存或者更新首页配置\n * @param params\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  const url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({ url: url, params });\n};\n/**\n * 查询首页配置\n * @param params\n */\nexport const queryIndexByCode = (params) => defHttp.get({ url: Api.queryIndexByCode, params }, { isTransformResponse: false });\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/homeConfig/home.data.ts",
    "content": "import { FormSchema } from '/@/components/Table';\n\n//列配置\nexport const columns = [\n  {\n    title: '关联类型(用户/角色)',\n    dataIndex: 'relationType_dictText',\n    width: 80,\n    slots: { customRender: 'relationType' },\n  },\n  {\n    title: '用户/角色编码',\n    dataIndex: 'roleCode',\n    width: 80,\n    slots: { customRender: 'roleCode' },\n  },\n  {\n    title: '首页路由',\n    dataIndex: 'url',\n    width: 100,\n  },\n  {\n    title: '组件地址',\n    dataIndex: 'component',\n    width: 100,\n  },\n  {\n    title: '是否开启',\n    dataIndex: 'status',\n    slots: { customRender: 'status' },\n    width: 60,\n  },\n];\n//查询配置\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'relationType',\n    label: '关联类型',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'relation_type',\n    },\n  },\n  {\n    field: 'route',\n    label: '是否路由菜单',\n    helpMessage: '非路由菜单设置成首页，需开启',\n    component: 'Switch',\n    show: false,\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    field: 'id',\n    label: '',\n    component: 'Input',\n    show: false,\n  },\n  {\n    field: 'relationType',\n    label: '关联类型',\n    component: 'JDictSelectTag',\n    required: true,\n    defaultValue: 'ROLE',\n    componentProps: {\n      dictCode: 'relation_type',\n      type: 'radioButton',\n    },\n  },\n  {\n    label: '角色编码',\n    field: 'roleCode',\n    component: 'JSelectRole',\n    required: true,\n    componentProps: {\n      rowKey: 'roleCode',\n      isRadioSelection: true,\n    },\n    ifShow: ({ values }) => values.relationType == 'ROLE',\n  },\n  {\n    label: '用户编码',\n    field: 'userCode',\n    component: 'JSelectUser',\n    required: true,\n    componentProps: {\n      isRadioSelection: true,\n    },\n    ifShow: ({ values }) => values.relationType == 'USER',\n  },\n  {\n    label: '首页路由',\n    field: 'url',\n    component: 'Input',\n    required: true,\n  },\n  {\n    label: '组件地址',\n    field: 'component',\n    component: 'Input',\n    componentProps: {\n      placeholder: '请输入前端组件',\n    },\n    required: true,\n  },\n  {\n    label: '优先级',\n    field: 'priority',\n    component: 'InputNumber',\n  },\n  {\n    field: 'route',\n    label: '是否路由菜单',\n    helpMessage: '非路由菜单设置成首页，需开启',\n    component: 'Switch',\n    defaultValue: true,\n    show: false,\n  },\n  {\n    label: '是否开启',\n    field: 'status',\n    component: 'JSwitch',\n    defaultValue: '1',\n    componentProps: {\n      options: ['1', '0'],\n    },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/homeConfig/index.vue",
    "content": "<template>\n  <div>\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <template #tableTitle>\n        <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"handleCreate\">新增</a-button>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\" /> 删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button>批量操作<Icon icon=\"mdi:chevron-down\" /></a-button>\n        </a-dropdown>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n      <template #status=\"{ text }\">\n        <a-tag color=\"pink\" v-if=\"text == 0\">禁用</a-tag>\n        <a-tag color=\"#87d068\" v-if=\"text == 1\">启用</a-tag>\n      </template>\n      <template #relationType=\"{ text, record }\">\n        <span>{{ record.roleCode == 'DEF_INDEX_ALL' ? '全局默认' : text }}</span>\n      </template>\n      <template #roleCode=\"{ text, record }\">\n        <span>{{ record.roleCode == 'DEF_INDEX_ALL' ? '菜单默认首页' : text }}</span>\n      </template>\n    </BasicTable>\n    <!--角色首页配置-->\n    <HomeConfigModal @register=\"register\" @success=\"reload\" />\n  </div>\n</template>\n<script lang=\"ts\" name=\"home-config\" setup>\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import HomeConfigModal from './components/HomeConfigModal.vue';\n  import { columns, searchFormSchema } from './home.data';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { list, deleteIndex, batchDelete } from './home.api';\n\n  //弹窗配置\n  const [register, { openModal }] = useModal();\n\n  // 列表页面公共参数、方法\n  const { tableContext } = useListPage({\n    designScope: 'home-config',\n    tableProps: {\n      title: '首页配置',\n      api: list,\n      columns: columns,\n      formConfig: {\n        labelAlign: 'left',\n        labelWidth: 80,\n        schemas: searchFormSchema,\n        baseRowStyle: {\n          marginLeft: '2px',\n        },\n      },\n      actionColumn: {\n        width: 80,\n      },\n      //自定义默认排序\n      defSort: {\n        column: 'id',\n        order: 'desc',\n      },\n    },\n  });\n  const [registerTable, { reload, clearSelectedRowKeys }, { rowSelection, selectedRowKeys }] = tableContext;\n\n  /**\n   * 新增事件\n   */\n  async function handleCreate() {\n    openModal(true, {\n      isUpdate: false,\n    });\n  }\n  /**\n   * 编辑事件\n   */\n  async function handleEdit(record) {\n    openModal(true, {\n      isUpdate: true,\n      values: record,\n    });\n  }\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteIndex({ id: record.id }, () => {\n      reload();\n    });\n  }\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDelete({ ids: selectedRowKeys.value }, () => {\n      clearSelectedRowKeys();\n      reload();\n    });\n  }\n\n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/loginmini/MiniCodelogin.vue",
    "content": "<template>\n  <div class=\"aui-content\">\n    <div class=\"aui-container\">\n      <div class=\"aui-form\">\n        <div class=\"aui-image\">\n          <div class=\"aui-image-text\">\n            <img :src=\"adTextImg\" alt=\"\" />\n          </div>\n        </div>\n        <div class=\"aui-formBox aui-formEwm\">\n          <div class=\"aui-formWell\">\n            <form>\n              <div class=\"aui-flex aui-form-nav investment_title\" style=\"padding-bottom: 19px\">\n                <div class=\"aui-flex-box activeNav\">{{t('sys.login.qrSignInFormTitle')}}</div>\n              </div>\n              <div class=\"aui-form-box\">\n                <div class=\"aui-account\" style=\"padding: 30px 0\">\n                  <div class=\"aui-ewm\">\n                    <QrCode :value=\"qrCodeUrl\" class=\"enter-x flex justify-center xl:justify-start\" :width=\"280\" />\n                  </div>\n                </div>\n              </div>\n              <div class=\"aui-formButton\">\n                <a class=\"aui-linek-code aui-link-register\" @click=\"goBackHandleClick\">{{t('sys.login.backSignIn')}}</a>\n              </div>\n            </form>\n          </div>\n          <div class=\"aui-flex aui-third-text\">\n            <div class=\"aui-flex-box aui-third-border\">\n              <span>{{ t('sys.login.otherSignIn') }}</span>\n            </div>\n          </div>\n          <div class=\"aui-flex\" :class=\"`${prefixCls}-sign-in-way`\">\n            <div class=\"aui-flex-box\">\n              <div class=\"aui-third-login\">\n                <a href=\"\" title=\"github\" @click=\"onThirdLogin('github')\"><GithubFilled /></a>\n              </div>\n            </div>\n            <div class=\"aui-flex-box\">\n              <div class=\"aui-third-login\">\n                <a href=\"\" title=\"企业微信\" @click=\"onThirdLogin('wechat_enterprise')\"><icon-font class=\"item-icon\" type=\"icon-qiyeweixin3\" /></a>\n              </div>\n            </div>\n            <div class=\"aui-flex-box\">\n              <div class=\"aui-third-login\">\n                <a href=\"\" title=\"钉钉\" @click=\"onThirdLogin('dingtalk')\"><DingtalkCircleFilled /></a>\n              </div>\n            </div>\n            <div class=\"aui-flex-box\">\n              <div class=\"aui-third-login\">\n                <a href=\"\" title=\"微信\" @click=\"onThirdLogin('wechat_open')\"><WechatFilled /></a>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <!-- 第三方登录相关弹框 -->\n  <ThirdModal ref=\"thirdModalRef\"></ThirdModal>\n</template>\n\n<script lang=\"ts\" setup name=\"mini-code-login\">\n  import { ref, onUnmounted } from 'vue';\n  import { getLoginQrcode, getQrcodeToken } from '/@/api/sys/user';\n  import { useUserStore } from '/@/store/modules/user';\n  import { QrCode } from '/@/components/Qrcode/index';\n  import ThirdModal from '/@/views/sys/login/ThirdModal.vue';\n  import logoImg from '/@/assets/loginmini/icon/jeecg_logo.png';\n  import adTextImg from '/@/assets/loginmini/icon/jeecg_ad_text.png';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { useDesign } from \"/@/hooks/web/useDesign\";\n  import { GithubFilled, WechatFilled, DingtalkCircleFilled, createFromIconfontCN } from '@ant-design/icons-vue';\n\n  const IconFont = createFromIconfontCN({\n    scriptUrl: '//at.alicdn.com/t/font_2316098_umqusozousr.js',\n  });\n  const { prefixCls } = useDesign('minilogin');\n  const { t } = useI18n();\n  const qrCodeUrl = ref<string>('');\n  let timer: IntervalHandle;\n  const state = ref('0');\n  const thirdModalRef = ref();\n  const userStore = useUserStore();\n  const emit = defineEmits(['go-back', 'success', 'register']);\n\n  //加载二维码信息\n  function loadQrCode() {\n    state.value = '0';\n    getLoginQrcode().then((res) => {\n      qrCodeUrl.value = res.qrcodeId;\n      if (res.qrcodeId) {\n        openTimer(res.qrcodeId);\n      }\n    });\n  }\n  //监控扫码状态\n  function watchQrcodeToken(qrcodeId) {\n    getQrcodeToken({ qrcodeId: qrcodeId }).then((res) => {\n      let token = res.token;\n      if (token == '-2') {\n        //二维码过期重新获取\n        loadQrCode();\n        clearInterval(timer);\n      }\n      //扫码成功\n      if (res.success) {\n        state.value = '2';\n        clearInterval(timer);\n        setTimeout(() => {\n          userStore.qrCodeLogin(token);\n        }, 500);\n      }\n    });\n  }\n\n  /** 开启定时器 */\n  function openTimer(qrcodeId) {\n    watchQrcodeToken(qrcodeId);\n    closeTimer();\n    timer = setInterval(() => {\n      watchQrcodeToken(qrcodeId);\n    }, 1500);\n  }\n\n  /** 关闭定时器 */\n  function closeTimer() {\n    if (timer) clearInterval(timer);\n  }\n\n  /**\n   * 第三方登录\n   * @param type\n   */\n  function onThirdLogin(type) {\n    thirdModalRef.value.onThirdLogin(type);\n  }\n\n  /**\n   * 初始化表单\n   */\n  function initFrom() {\n    loadQrCode();\n  }\n\n  /**\n   * 返回\n   */\n  function goBackHandleClick() {\n    emit('go-back');\n    closeTimer();\n  }\n\n  onUnmounted(() => {\n    closeTimer();\n  });\n\n  defineExpose({\n    initFrom,\n  });\n</script>\n<style lang=\"less\" scoped>\n@import '/@/assets/loginmini/style/home.less';\n@import '/@/assets/loginmini/style/base.less';\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/loginmini/MiniForgotpad.vue",
    "content": "<template>\n  <div class=\"aui-content\">\n    <div class=\"aui-container\">\n      <div class=\"aui-form\">\n        <div class=\"aui-image\">\n          <div class=\"aui-image-text\">\n            <img :src=\"adTextImg\" alt=\"\" />\n          </div>\n        </div>\n        <div class=\"aui-formBox\">\n          <div class=\"aui-formWell\">\n            <div class=\"aui-step-box\">\n              <div class=\"aui-step-item\" :class=\"activeKey === 1 ? 'activeStep' : ''\">\n                <div class=\"aui-step-tags\">\n                  <em>1</em>\n                  <p>{{t('sys.login.authentication')}}</p>\n                </div>\n              </div>\n              <div class=\"aui-step-item\" :class=\"activeKey === 2 ? 'activeStep' : ''\">\n                <div class=\"aui-step-tags\">\n                  <em>2</em>\n                  <p>{{t('sys.login.resetLoginPassword')}}</p>\n                </div>\n              </div>\n              <div class=\"aui-step-item\" :class=\"activeKey === 3 ? 'activeStep' : ''\">\n                <div class=\"aui-step-tags\">\n                  <em>3</em>\n                  <p>{{t('sys.login.resetSuccess')}}</p>\n                </div>\n              </div>\n            </div>\n            <div class=\"\" style=\"height: 230px; position: relative\">\n              <a-form ref=\"formRef\" :model=\"formData\" v-if=\"activeKey === 1\">\n                <!-- 身份验证 begin -->\n                <div class=\"aui-account aui-account-line aui-forgot\">\n                  <a-form-item>\n                    <div class=\"aui-input-line\">\n                      <a-input type=\"text\" :placeholder=\"t('sys.login.mobile')\" v-model:value=\"formData.mobile\" />\n                    </div>\n                  </a-form-item>\n                  <div class=\"aui-input-line\">\n                    <a-form-item>\n                      <a-input type=\"text\" :placeholder=\"t('sys.login.smsCode')\" v-model:value=\"formData.smscode\" />\n                    </a-form-item>\n                    <div v-if=\"showInterval\" class=\"aui-code-line\" @click=\"getLoginCode\">{{t('component.countdown.normalText')}}</div>\n                    <div v-else class=\"aui-code-line\">{{t('component.countdown.sendText',[unref(timeRuning)])}}</div>\n                  </div>\n                </div>\n                <!-- 身份验证 end -->\n              </a-form>\n              <a-form ref=\"pwdFormRef\" :model=\"pwdFormData\" v-else-if=\"activeKey === 2\">\n                <!-- 重置密码 begin -->\n                <div class=\"aui-account aui-account-line aui-forgot\">\n                  <a-form-item>\n                    <div class=\"aui-input-line\">\n                      <a-input type=\"password\" :placeholder=\"t('sys.login.passwordPlaceholder')\" v-model:value=\"pwdFormData.password\" />\n                    </div>\n                  </a-form-item>\n                  <a-form-item>\n                    <div class=\"aui-input-line\">\n                      <a-input type=\"password\" :placeholder=\"t('sys.login.confirmPassword')\" v-model:value=\"pwdFormData.confirmPassword\" />\n                    </div>\n                  </a-form-item>\n                </div>\n                <!-- 重置密码 end -->\n              </a-form>\n                <!-- 重置成功 begin -->\n                <div class=\"aui-success\" v-else>\n                  <div class=\"aui-success-icon\">\n                    <img :src=\"successImg\"/>\n                  </div>\n                  <h3>恭喜您，重置密码成功！</h3>\n                </div>\n                <!-- 重置成功 end -->\n            </div>\n            <div class=\"aui-formButton\" style=\"padding-bottom: 40px\">\n              <div class=\"aui-flex\" v-if=\"activeKey === 1 || activeKey === 2\">\n                <a class=\"aui-link-login aui-flex-box\" @click=\"nextStepClick\">{{t('sys.login.nextStep')}}</a>\n              </div>\n              <div class=\"aui-flex\" v-else>\n                <a class=\"aui-linek-code aui-flex-box\" @click=\"toLogin\">{{t('sys.login.goToLogin')}}</a>\n              </div>\n              <div class=\"aui-flex\">\n                <a class=\"aui-linek-code aui-flex-box\" @click=\"goBack\"> {{ t('sys.login.backSignIn') }}</a>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <!-- 图片验证码弹窗 -->\n  <CaptchaModal @register=\"captchaRegisterModal\" @ok=\"getLoginCode\" />\n</template>\n<script lang=\"ts\" name=\"mini-forgotpad\" setup>\n  import { reactive, ref, toRaw, unref } from 'vue';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { SmsEnum, useFormRules, useFormValid, useLoginState } from '/@/views/sys/login/useLogin';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { getCaptcha, passwordChange, phoneVerify } from '/@/api/sys/user';\n  import logoImg from '/@/assets/loginmini/icon/jeecg_logo.png'\n  import adTextImg from '/@/assets/loginmini/icon/jeecg_ad_text.png'\n  import successImg from '/@/assets/loginmini/icon/icon-success.png'\n  import CaptchaModal from '@/components/jeecg/captcha/CaptchaModal.vue';\n  import { useModal } from \"@/components/Modal\";\n  import { ExceptionEnum } from \"@/enums/exceptionEnum\";\n  const [captchaRegisterModal, { openModal: openCaptchaModal }] = useModal();\n\n  //下一步控制\n  const activeKey = ref<number>(1);\n  const { t } = useI18n();\n  const { handleBackLogin } = useLoginState();\n  const { notification, createMessage, createErrorModal } = useMessage();\n  //是否显示获取验证码\n  const showInterval = ref<boolean>(true);\n  //60s\n  const timeRuning = ref<number>(60);\n  //定时器\n  const timer = ref<any>(null);\n  const formRef = ref();\n  const pwdFormRef = ref();\n  //账号数据\n  const accountInfo = reactive<any>({});\n  //手机号表单\n  const formData = reactive({\n    mobile: '',\n    smscode: '',\n  });\n  //密码表单\n  const pwdFormData = reactive<any>({\n    password: '',\n    confirmPassword: '',\n  });\n  const emit = defineEmits(['go-back', 'success', 'register']);\n\n  /**\n   * 下一步\n   */\n  async function handleNext() {\n    if (!formData.mobile) {\n      createMessage.warn(t('sys.login.mobilePlaceholder'));\n      return;\n    }\n    if (!formData.smscode) {\n      createMessage.warn(t('sys.login.smsPlaceholder'));\n      return;\n    }\n    const resultInfo = await phoneVerify(\n      toRaw({\n        phone: formData.mobile,\n        smscode: formData.smscode,\n      })\n    );\n    if (resultInfo.success) {\n      Object.assign(accountInfo, {\n        username: resultInfo.result.username,\n        phone: formData.mobile,\n        smscode: formData.smscode,\n      });\n      activeKey.value = 2;\n      setTimeout(()=>{\n        pwdFormRef.value.resetFields();\n      },300)\n    } else {\n      notification.error({\n        message: '错误提示',\n        description: resultInfo.message || t('sys.api.networkExceptionMsg'),\n        duration: 3,\n      });\n    }\n  }\n\n  /**\n   * 完成修改密码\n   */\n  async function finishedPwd() {\n    if (!pwdFormData.password) {\n      createMessage.warn(t('sys.login.passwordPlaceholder'));\n      return;\n    }\n    if (!pwdFormData.confirmPassword) {\n      createMessage.warn(t('sys.login.confirmPassword'));\n      return;\n    }\n    if (pwdFormData.password !== pwdFormData.confirmPassword) {\n      createMessage.warn(t('sys.login.diffPwd'));\n      return;\n    }\n    const resultInfo = await passwordChange(\n      toRaw({\n        username: accountInfo.username,\n        password: pwdFormData.password,\n        smscode: accountInfo.smscode,\n        phone: accountInfo.phone,\n      })\n    );\n    if (resultInfo.success) {\n      accountInfo.password = pwdFormData.password;\n      //修改密码\n      activeKey.value = 3;\n    } else {\n      //错误提示\n      createErrorModal({\n        title: t('sys.api.errorTip'),\n        content: resultInfo.message || t('sys.api.networkExceptionMsg'),\n      });\n    }\n  }\n  /**\n   * 下一步\n   */\n  function nextStepClick() {\n    if (unref(activeKey) == 1) {\n      handleNext();\n    } else if (unref(activeKey) == 2) {\n      finishedPwd();\n    }\n  }\n\n  /**\n   * 去登录\n   */\n  function toLogin() {\n    emit('success', { username: accountInfo.username, password: accountInfo.password });\n    initForm();\n  }\n\n  /**\n   * 返回\n   */\n  function goBack() {\n    emit('go-back');\n    initForm();\n  }\n\n  /**\n   * 获取手机验证码\n   */\n  async function getLoginCode() {\n    if (!formData.mobile) {\n      createMessage.warn(t('sys.login.mobilePlaceholder'));\n      return;\n    }\n    // 代码逻辑说明: 【QQYUN-9005】同一个IP，1分钟超过5次短信，则提示需要验证码---\n    const result = await getCaptcha({ mobile: formData.mobile, smsmode: SmsEnum.FORGET_PASSWORD }).catch((res) =>{\n      if(res.code === ExceptionEnum.PHONE_SMS_FAIL_CODE){\n        openCaptchaModal(true, {});\n      }\n    });\n    if (result) {\n      const TIME_COUNT = 60;\n      if (!unref(timer)) {\n        timeRuning.value = TIME_COUNT;\n        showInterval.value = false;\n        timer.value = setInterval(() => {\n          if (unref(timeRuning) > 0 && unref(timeRuning) <= TIME_COUNT) {\n            timeRuning.value = timeRuning.value - 1;\n          } else {\n            showInterval.value = true;\n            clearInterval(unref(timer));\n            timer.value = null;\n          }\n        }, 1000);\n      }\n    }\n  }\n\n  /**\n   * 初始化表单\n   */\n  function initForm() {\n    activeKey.value = 1;\n    Object.assign(formData, { phone: '', smscode: '' });\n    Object.assign(pwdFormData, { password: '', confirmPassword: '' });\n    Object.assign(accountInfo, {});\n    if(unref(timer)){\n      clearInterval(unref(timer));\n      timer.value = null;\n      showInterval.value = true;\n    }\n    setTimeout(()=>{\n      formRef.value.resetFields();\n    },300)\n  }\n\n  defineExpose({\n    initForm,\n  });\n</script>\n<style lang=\"less\" scoped>\n@import '/@/assets/loginmini/style/home.less';\n@import '/@/assets/loginmini/style/base.less';\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/loginmini/MiniLogin.vue",
    "content": "<template>\n  <div :class=\"prefixCls\" class=\"login-background-img\">\n    <AppLocalePicker class=\"absolute top-4 right-4 enter-x xl:text-gray-600\" :showText=\"false\"/>\n    <AppDarkModeToggle class=\"absolute top-3 right-7 enter-x\" />\n    <div class=\"aui-logo\" v-if=\"!getIsMobile\">\n      <div>\n        <h3>\n          <img :src=\"logoImg\" alt=\"jeecg\" />\n        </h3>\n      </div>\n    </div>\n    <div v-else class=\"aui-phone-logo\">\n      <img :src=\"logoImg\" alt=\"jeecg\" />\n    </div>\n    <div v-show=\"type === 'login'\">\n      <div class=\"aui-content\">\n        <div class=\"aui-container\">\n          <div class=\"aui-form\">\n            <div class=\"aui-image\">\n              <div class=\"aui-image-text\">\n                <img :src=\"adTextImg\" />\n              </div>\n            </div>\n            <div class=\"aui-formBox\">\n              <div class=\"aui-formWell\">\n                <div class=\"aui-flex aui-form-nav investment_title\">\n                  <div class=\"aui-flex-box\" :class=\"activeIndex === 'accountLogin' ? 'activeNav on' : ''\" @click=\"loginClick('accountLogin')\"\n                    >{{ t('sys.login.signInFormTitle') }}\n                  </div>\n                  <div class=\"aui-flex-box\" :class=\"activeIndex === 'phoneLogin' ? 'activeNav on' : ''\" @click=\"loginClick('phoneLogin')\"\n                    >{{ t('sys.login.mobileSignInFormTitle') }}\n                  </div>\n                </div>\n                <div class=\"aui-form-box\" style=\"height: 240px\">\n                  <a-form ref=\"loginRef\" :model=\"formData\" v-if=\"activeIndex === 'accountLogin'\" @keyup.enter.native=\"loginHandleClick\">\n                    <div class=\"aui-account\">\n                      <div class=\"aui-inputClear\">\n                        <i class=\"icon icon-code\"></i>\n                        <a-form-item>\n                          <a-input class=\"fix-auto-fill\" :placeholder=\"t('sys.login.userName')\" v-model:value=\"formData.username\" />\n                        </a-form-item>\n                      </div>\n                      <div class=\"aui-inputClear\">\n                        <i class=\"icon icon-password\"></i>\n                        <a-form-item>\n                          <a-input class=\"fix-auto-fill\" type=\"password\" :placeholder=\"t('sys.login.password')\" v-model:value=\"formData.password\" />\n                        </a-form-item>\n                      </div>\n                      <div class=\"aui-inputClear\">\n                        <i class=\"icon icon-code\"></i>\n                        <a-form-item>\n                          <a-input class=\"fix-auto-fill\" type=\"text\" :placeholder=\"t('sys.login.inputCode')\" v-model:value=\"formData.inputCode\" />\n                        </a-form-item>\n                        <div class=\"aui-code\">\n                          <img v-if=\"randCodeData.requestCodeSuccess\" :src=\"randCodeData.randCodeImage\" @click=\"handleChangeCheckCode\" />\n                          <img v-else style=\"margin-top: 2px; max-width: initial\" :src=\"codeImg\" @click=\"handleChangeCheckCode\" />\n                        </div>\n                      </div>\n                      <div class=\"aui-inputClear\" v-if=\"showDepart\">\n                        <i class=\"icon icon-depart\"></i>\n                        <div class=\"JLoginSelectDept\">\n                          <a-select allow-clear style=\"width: 100%\" :bordered=\"false\" v-model:value=\"formData.loginOrgCode\" :placeholder=\"t('sys.login.loginOrgCode')\">\n                            <template #suffixIcon>\n                              <Icon icon=\"ant-design:gold-outline\" />\n                            </template>\n                            <template v-for=\"depart in departList\" :key=\"depart.orgCode\">\n                              <a-select-option :value=\"depart.orgCode\">{{ getShortDeptName(depart.label) }}</a-select-option>\n                            </template>\n                          </a-select>\n                        </div>\n                      </div>\n                      <div class=\"aui-flex\">\n                        <div class=\"aui-flex-box\">\n                          <div class=\"aui-choice\">\n                            <a-checkbox v-model:checked=\"rememberMe\">{{ t('sys.login.rememberMe') }}</a-checkbox>\n                          </div>\n                        </div>\n                        <div class=\"aui-forget\">\n                          <a @click=\"forgetHandelClick\"> {{ t('sys.login.forgetPassword') }}</a>\n                        </div>\n                      </div>\n                    </div>\n                  </a-form>\n                  <a-form v-else ref=\"phoneFormRef\" :model=\"phoneFormData\" @keyup.enter.native=\"loginHandleClick\">\n                    <div class=\"aui-account phone\">\n                      <div class=\"aui-inputClear phoneClear\">\n                        <a-input class=\"fix-auto-fill\" :placeholder=\"t('sys.login.mobile')\" v-model:value=\"phoneFormData.mobile\" />\n                      </div>\n                      <div class=\"aui-inputClear\">\n                        <a-input class=\"fix-auto-fill\" :maxlength=\"6\" :placeholder=\"t('sys.login.smsCode')\" v-model:value=\"phoneFormData.smscode\" />\n                        <div v-if=\"showInterval\" class=\"aui-code\" @click=\"getLoginCode\">\n                          <a>{{ t('component.countdown.normalText') }}</a>\n                        </div>\n                        <div v-else class=\"aui-code\">\n                          <span class=\"aui-get-code code-shape\">{{ t('component.countdown.sendText', [unref(timeRuning)]) }}</span>\n                        </div>\n                      </div>\n                      <div class=\"aui-inputClear\" v-if=\"showDepart\">\n                        <div class=\"JLoginSelectDept\">\n                          <a-select allow-clear style=\"width: 100%\" :bordered=\"false\" v-model:value=\"phoneFormData.loginOrgCode\" :placeholder=\"t('sys.login.loginOrgCode')\">\n                            <template #suffixIcon>\n                              <Icon icon=\"ant-design:gold-outline\" />\n                            </template>\n                            <template v-for=\"depart in departList\" :key=\"depart.orgCode\">\n                              <a-select-option :value=\"depart.orgCode\">{{ getShortDeptName(depart.label) }}</a-select-option>\n                            </template>\n                          </a-select>\n                        </div>\n                      </div>\n                    </div>\n                  </a-form>\n                </div>\n                <div class=\"aui-formButton\">\n                  <div class=\"aui-flex\">\n                    <a-button :loading=\"loginLoading\" class=\"aui-link-login\" type=\"primary\" @click=\"loginHandleClick\">\n                      {{ t('sys.login.loginButton') }}</a-button>\n                  </div>\n                  <div class=\"aui-flex\">\n                    <a class=\"aui-linek-code aui-flex-box\" @click=\"codeHandleClick\">{{ t('sys.login.qrSignInFormTitle') }}</a>\n                  </div>\n                  <div class=\"aui-flex\">\n                    <a class=\"aui-linek-code aui-flex-box\" @click=\"registerHandleClick\">{{ t('sys.login.registerButton') }}</a>\n                  </div>\n                </div>\n              </div>\n              <a-form @keyup.enter.native=\"loginHandleClick\">\n                <div class=\"aui-flex aui-third-text\">\n                  <div class=\"aui-flex-box aui-third-border\">\n                    <span>{{ t('sys.login.otherSignIn') }}</span>\n                  </div>\n                </div>\n                <div class=\"aui-flex\" :class=\"`${prefixCls}-sign-in-way`\">\n                  <div class=\"aui-flex-box\">\n                    <div class=\"aui-third-login\">\n                      <a title=\"github\" @click=\"onThirdLogin('github')\"><GithubFilled /></a>\n                    </div>\n                  </div>\n                  <div class=\"aui-flex-box\">\n                    <div class=\"aui-third-login\">\n                      <a title=\"企业微信\" @click=\"onThirdLogin('wechat_enterprise')\"><icon-font class=\"item-icon\" type=\"icon-qiyeweixin3\" /></a>\n                    </div>\n                  </div>\n                  <div class=\"aui-flex-box\">\n                    <div class=\"aui-third-login\">\n                      <a title=\"钉钉\" @click=\"onThirdLogin('dingtalk')\"><DingtalkCircleFilled /></a>\n                    </div>\n                  </div>\n                  <div class=\"aui-flex-box\">\n                    <div class=\"aui-third-login\">\n                      <a title=\"微信\" @click=\"onThirdLogin('wechat_open')\"><WechatFilled /></a>\n                    </div>\n                  </div>\n                </div>\n              </a-form>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div v-show=\"type === 'forgot'\" :class=\"`${prefixCls}-form`\">\n      <MiniForgotpad ref=\"forgotRef\" @go-back=\"goBack\" @success=\"handleSuccess\" />\n    </div>\n    <div v-show=\"type === 'register'\" :class=\"`${prefixCls}-form`\">\n      <MiniRegister ref=\"registerRef\" @go-back=\"goBack\" @success=\"handleSuccess\" />\n    </div>\n    <div v-show=\"type === 'codeLogin'\" :class=\"`${prefixCls}-form`\">\n      <MiniCodelogin ref=\"codeRef\" @go-back=\"goBack\" @success=\"handleSuccess\" />\n    </div>\n    <!-- 第三方登录相关弹框 -->\n    <ThirdModal ref=\"thirdModalRef\"></ThirdModal>\n\n    <!-- 图片验证码弹窗 -->\n    <CaptchaModal @register=\"captchaRegisterModal\" @ok=\"getLoginCode\" />\n  </div>\n</template>\n<script lang=\"ts\" setup name=\"login-mini\">\n  import { getCaptcha, getCodeInfo } from '/@/api/sys/user';\n  import { computed, onMounted, reactive, ref, toRaw, unref, watch } from 'vue';\n  import codeImg from '/@/assets/images/checkcode.png';\n  import { Rule } from '/@/components/Form';\n  import { useUserStore } from '/@/store/modules/user';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { SmsEnum } from '/@/views/sys/login/useLogin';\n  import ThirdModal from '/@/views/sys/login/ThirdModal.vue';\n  import MiniForgotpad from './MiniForgotpad.vue';\n  import MiniRegister from './MiniRegister.vue';\n  import MiniCodelogin from './MiniCodelogin.vue';\n  import logoImg from '/@/assets/loginmini/icon/jeecg_logo.png';\n  import adTextImg from '/@/assets/loginmini/icon/jeecg_ad_text.png';\n  import { AppLocalePicker, AppDarkModeToggle } from '/@/components/Application';\n  import { useLocaleStore } from '/@/store/modules/locale';\n  import { createLocalStorage } from '/@/utils/cache';\n  import { useDesign } from \"/@/hooks/web/useDesign\";\n  import { useAppInject } from \"/@/hooks/web/useAppInject\";\n  import { GithubFilled, WechatFilled, DingtalkCircleFilled, createFromIconfontCN } from '@ant-design/icons-vue';\n  import CaptchaModal from '@/components/jeecg/captcha/CaptchaModal.vue';\n  import { useModal } from \"@/components/Modal\";\n  import { ExceptionEnum } from \"@/enums/exceptionEnum\";\n  import { encryptAESCBC } from '/@/utils/cipher';\n  import { defHttp } from \"@/utils/http/axios\";\n\n  const IconFont = createFromIconfontCN({\n    scriptUrl: '//at.alicdn.com/t/font_2316098_umqusozousr.js',\n  });\n  const { prefixCls } = useDesign('mini-login');\n  const { notification, createMessage } = useMessage();\n  const userStore = useUserStore();\n  const { t } = useI18n();\n  const $ls = createLocalStorage();\n  const localeStore = useLocaleStore();\n  const showLocale = localeStore.getShowPicker;\n  const randCodeData = reactive<any>({\n    randCodeImage: '',\n    requestCodeSuccess: false,\n    checkKey: null,\n  });\n  // 记住用户名\n  const rememberMe = ref<boolean>(false);\n  const REMEMBER_USERNAME_KEY = 'LOGIN_REMEMBER_USERNAME';\n  //手机号登录还是账号登录\n  const activeIndex = ref<string>('accountLogin');\n  const type = ref<string>('login');\n  //账号登录表单字段\n  const formData = reactive<any>({\n    inputCode: '',\n    username: 'admin',\n    password: '123456',\n    loginOrgCode: '',\n  });\n  //手机登录表单字段\n  const phoneFormData = reactive<any>({\n    mobile: '',\n    smscode: '',\n    loginOrgCode: '',\n  });\n  const loginRef = ref();\n  //第三方登录弹窗\n  const thirdModalRef = ref();\n  //扫码登录\n  const codeRef = ref();\n  //是否显示获取验证码\n  const showInterval = ref<boolean>(true);\n  //60s\n  const timeRuning = ref<number>(60);\n  //定时器\n  const timer = ref<any>(null);\n  //忘记密码\n  const forgotRef = ref();\n  //注册\n  const registerRef = ref();\n  const loginLoading = ref<boolean>(false);\n  const { getIsMobile } = useAppInject();\n  const [captchaRegisterModal, { openModal: openCaptchaModal }] = useModal();\n  defineProps({\n    sessionTimeout: {\n      type: Boolean,\n    },\n  });\n //**********************查询部门逻辑begin**********************************************\n  //用户部门\n  const departList = ref([]);\n  //部门显示\n  const showDepart = computed(()=>{\n    return departList.value.length > 1\n  })\n  //获取部门缩写\n  const getShortDeptName = computed(()=>{\n    return (deptName) => {\n      if (!deptName) return '';\n      if (deptName.length > 18) {\n        return '...' + deptName.substring(deptName.length-18, deptName.length) ;\n      }\n      return deptName;\n    };\n  })\n  //监听验证码和输入框的修改\n  watch(\n      () => [formData.inputCode, phoneFormData.smscode],\n      () => {\n        if ((formData.inputCode && formData.inputCode.length == 4)\n            || (phoneFormData.smscode && phoneFormData.smscode.length == 6)) {\n            checkAccount()\n        }\n      },\n  );\n  /**\n   * 监听账号变化，清除部门信息\n   */\n  watch(\n      () => [formData.username,phoneFormData.mobile,activeIndex.value],\n      () => {\n        formData.loginOrgCode = null;\n        phoneFormData.loginOrgCode = null;\n        departList.value = [];\n        if ((formData.inputCode && formData.inputCode.length == 4)\n            || (phoneFormData.smscode && phoneFormData.smscode.length == 6)) {\n          checkAccount()\n        }\n      }\n  );\n\n  //初始化数据\n  let deptTimer;\n  function checkAccount() {\n    deptTimer && clearTimeout(deptTimer);\n    deptTimer = setTimeout(async () => {\n      let loginType = activeIndex.value === 'accountLogin' ? 'account' : 'phone';\n      // 验证条件提取\n      const isValidAccount = loginType === 'account' && formData.username && formData.password;\n      const isValidPhone = loginType == 'phone' && phoneFormData.mobile && phoneFormData.smscode;\n      let finalFormData = loginType == 'phone' ? {...phoneFormData} : {...formData};\n      if (!isValidAccount && !isValidPhone) {\n        return;\n      }\n      //查询部门信息前，优先进行账户校验\n      if (departList.value && departList.value.length == 0) {\n        let params = {...finalFormData, loginType: activeIndex.value === 'accountLogin' ? 'account' : 'phone'};\n        if (loginType == 'account') {\n          params['password'] = encryptAESCBC(formData.password);\n          params['checkKey'] = randCodeData.checkKey;\n        }\n        const res = await defHttp.post({\n          url: '/sys/loginGetUserDeparts',\n          params: {...params}\n        }, {isTransformResponse: false});\n        if (res.success && res.result) {\n          let {departs,currentOrgCode} = res.result;\n          // 判断当前部门是否在所属的部门列表中\n          if (departs && departs.length > 0) {\n            // 代码逻辑说明: JHHB-790 用户部门变更，会出现这个情况（因为之前设置的这里只切换部门，过滤了公司和岗位信息）\n            const hasCurrentDepart = departs.some(item => item.orgCode == currentOrgCode);\n            formData.loginOrgCode = hasCurrentDepart?currentOrgCode:null;\n            phoneFormData.loginOrgCode = hasCurrentDepart?currentOrgCode:null;\n            departList.value = departs.map((item) => {\n              return {\n                label: item.departName,\n                value: item.orgCode,\n                orgCode: item.orgCode,\n                departName: item.departName,\n              };\n            });\n          }\n        } else {\n          //createMessage.warn(res.message);\n        }\n      }\n    },500)\n  }\n //**********************查询部门逻辑end*************************************************\n  /**\n   * 获取验证码\n   */\n  function handleChangeCheckCode() {\n    formData.inputCode = '';\n    // 代码逻辑说明: [QQYUN-10775]验证码可以复用 #7674------------\n    randCodeData.checkKey = new Date().getTime() + Math.random().toString(36).slice(-4); // 1629428467008;\n    getCodeInfo(randCodeData.checkKey).then((res) => {\n      randCodeData.randCodeImage = res;\n      randCodeData.requestCodeSuccess = true;\n    });\n  }\n\n  /**\n   * 切换登录方式\n   */\n  function loginClick(type) {\n    activeIndex.value = type;\n  }\n\n  /**\n   * 账号或者手机登录\n   */\n  async function loginHandleClick() {\n    if (unref(activeIndex) === 'accountLogin') {\n      accountLogin();\n    } else {\n      //手机号登录\n      phoneLogin();\n    }\n  }\n\n  async function accountLogin() {\n    if (!formData.username) {\n      createMessage.warn(t('sys.login.accountPlaceholder'));\n      return;\n    }\n    if (!formData.password) {\n      createMessage.warn(t('sys.login.passwordPlaceholder'));\n      return;\n    }\n    try {\n      loginLoading.value = true;\n\n      // 密码使用AES加密传输\n      const encryptedPassword = encryptAESCBC(formData.password);\n      const { userInfo } = await userStore.login(\n        toRaw({\n          password: encryptedPassword,\n          username: formData.username,\n          loginOrgCode: formData.loginOrgCode,\n          captcha: formData.inputCode,\n          checkKey: randCodeData.checkKey,\n          mode: 'none', //不要默认的错误提示\n        })\n      );\n      if (userInfo) {\n        notification.success({\n          message: t('sys.login.loginSuccessTitle'),\n          description: `${t('sys.login.loginSuccessDesc')}: ${userInfo.realname}`,\n          duration: 3,\n        });\n        // 登录成功后处理记住用户名\n        if (rememberMe.value && formData.username) {\n          $ls.set(REMEMBER_USERNAME_KEY, formData.username)\n        } else {\n          $ls.remove(REMEMBER_USERNAME_KEY)\n        }\n      }\n    } catch (error) {\n      notification.error({\n        message: t('sys.api.errorTip'),\n        description: error.message || t('sys.login.networkExceptionMsg'),\n        duration: 3,\n      });\n      handleChangeCheckCode();\n    } finally {\n      loginLoading.value = false;\n    }\n  }\n\n  /**\n   * 手机号登录\n   */\n  async function phoneLogin() {\n    if (!phoneFormData.mobile) {\n      createMessage.warn(t('sys.login.mobilePlaceholder'));\n      return;\n    }\n    if (!phoneFormData.smscode) {\n      createMessage.warn(t('sys.login.smsPlaceholder'));\n      return;\n    }\n    try {\n      loginLoading.value = true;\n      const { userInfo }: any = await userStore.phoneLogin({\n        mobile: phoneFormData.mobile,\n        captcha: phoneFormData.smscode,\n        loginOrgCode: phoneFormData.loginOrgCode,\n        mode: 'none', //不要默认的错误提示\n      });\n      if (userInfo) {\n        notification.success({\n          message: t('sys.login.loginSuccessTitle'),\n          description: `${t('sys.login.loginSuccessDesc')}: ${userInfo.realname}`,\n          duration: 3,\n        });\n      }\n    } catch (error) {\n      notification.error({\n        message: t('sys.api.errorTip'),\n        description: error.message || t('sys.login.networkExceptionMsg'),\n        duration: 3,\n      });\n    } finally {\n      loginLoading.value = false;\n    }\n  }\n\n  /**\n   * 获取手机验证码\n   */\n  async function getLoginCode() {\n    if (!phoneFormData.mobile) {\n      createMessage.warn(t('sys.login.mobilePlaceholder'));\n      return;\n    }\n    // 代码逻辑说明: 【issues/8567】严重：修改密码存在水平越权问题：登录应该用登录模板不应该用忘记密码的模板---\n    const result = await getCaptcha({ mobile: phoneFormData.mobile, smsmode: SmsEnum.LOGIN }).catch((res) =>{\n      if(res.code === ExceptionEnum.PHONE_SMS_FAIL_CODE){\n        openCaptchaModal(true, {});\n      }\n    });\n    if (result) {\n      const TIME_COUNT = 60;\n      if (!unref(timer)) {\n        timeRuning.value = TIME_COUNT;\n        showInterval.value = false;\n        timer.value = setInterval(() => {\n          if (unref(timeRuning) > 0 && unref(timeRuning) <= TIME_COUNT) {\n            timeRuning.value = timeRuning.value - 1;\n          } else {\n            showInterval.value = true;\n            clearInterval(unref(timer));\n            timer.value = null;\n          }\n        }, 1000);\n      }\n    }\n  }\n\n  /**\n   * 第三方登录\n   * @param type\n   */\n  function onThirdLogin(type) {\n    thirdModalRef.value.onThirdLogin(type);\n  }\n\n  /**\n   * 忘记密码\n   */\n  function forgetHandelClick() {\n    type.value = 'forgot';\n    setTimeout(() => {\n      forgotRef.value.initForm();\n    }, 300);\n  }\n\n  /**\n   * 返回登录页面\n   */\n  function goBack() {\n    activeIndex.value = 'accountLogin';\n    type.value = 'login';\n  }\n\n  /**\n   * 忘记密码/注册账号回调事件\n   * @param value\n   */\n  function handleSuccess(value) {\n    Object.assign(formData, value);\n    Object.assign(phoneFormData, { mobile: \"\", smscode: \"\" });\n    type.value = 'login';\n    activeIndex.value = 'accountLogin';\n    handleChangeCheckCode();\n  }\n\n  /**\n   * 注册\n   */\n  function registerHandleClick() {\n    type.value = 'register';\n    setTimeout(() => {\n      registerRef.value.initForm();\n    }, 300);\n  }\n\n  /**\n   * 注册\n   */\n  function codeHandleClick() {\n    type.value = 'codeLogin';\n    setTimeout(() => {\n      codeRef.value.initFrom();\n    }, 300);\n  }\n\n  onMounted(() => {\n    //加载验证码\n    handleChangeCheckCode();\n    // 恢复已记住的用户名\n    const saved = $ls.get(REMEMBER_USERNAME_KEY);\n    if (saved) {\n      formData.username = saved;\n      rememberMe.value = true;\n    }\n  });\n</script>\n\n<style lang=\"less\" scoped>\n  @import '/@/assets/loginmini/style/home.less';\n  @import '/@/assets/loginmini/style/base.less';\n\n  :deep(.ant-input:focus) {\n    box-shadow: none;\n  }\n  .aui-get-code {\n    float: right;\n    position: relative;\n    z-index: 3;\n    background: #ffffff;\n    color: #1573e9;\n    border-radius: 100px;\n    padding: 5px 16px;\n    margin: 7px;\n    border: 1px solid #1573e9;\n    top: 12px;\n  }\n\n  .aui-get-code:hover {\n    color: #1573e9;\n  }\n\n  .code-shape {\n    border-color: #dadada !important;\n    color: #aaa !important;\n  }\n\n  :deep(.jeecg-dark-switch){\n    position:absolute;\n    margin-right: 10px;\n  }\n  .aui-link-login{\n    height: 42px;\n    padding: 10px 15px;\n    font-size: 14px;\n    border-radius: 8px;\n    margin-top: 15px;\n    margin-bottom: 8px;\n    flex: 1;\n    color: #fff;\n  }\n  .aui-phone-logo{\n    position: absolute;\n    margin-left: 10px;\n    width: 60px;\n    top:2px;\n    z-index: 4;\n  }\n  .top-3{\n    top: 0.45rem;\n  }\n  .JLoginSelectDept {\n    margin:5px auto;\n    :deep(.ant-select-selection-placeholder) {\n      font-size: 14px;\n      color: #9a9a9a;\n    }\n  }\n</style>\n\n<style lang=\"less\">\n@prefix-cls: ~'@{namespace}-mini-login';\n@dark-bg: #293146;\n\nhtml[data-theme='dark'] {\n  .@{prefix-cls} {\n    background-color: @dark-bg !important;\n    background-image: none;\n\n    &::before {\n      background-image: url(/@/assets/svg/login-bg-dark.svg);\n    }\n    .aui-inputClear{\n      background-color: #232a3b !important;\n    }\n    .ant-input,\n    .ant-input-password {\n      background-color: #232a3b !important;\n    }\n\n    .ant-btn:not(.ant-btn-link):not(.ant-btn-primary) {\n      border: 1px solid #4a5569 !important;\n    }\n\n    &-form {\n      background: @dark-bg !important;\n    }\n\n    .app-iconify {\n      color: #fff !important;\n    }\n    .aui-inputClear input,.aui-input-line input,.aui-choice{\n      color: #c9d1d9 !important;\n    }\n\n    .aui-formBox{\n      background-color: @dark-bg !important;\n    }\n    .aui-third-text span{\n      background-color: @dark-bg !important;\n    }\n    .aui-form-nav .aui-flex-box{\n      color: #c9d1d9 !important;\n    }\n\n    .aui-formButton .aui-linek-code{\n      background:  @dark-bg !important;\n      color: white !important;\n    }\n    .aui-code-line{\n      border-left: none !important;\n    }\n    .ant-checkbox-inner,.aui-success h3{\n      border-color: #c9d1d9;\n    }\n    // 代码逻辑说明: 【QQYUN-6363】这个样式代码有问题，不在里面，导致表达式有问题------------\n    &-sign-in-way {\n      .anticon {\n        font-size: 22px !important;\n        color: #888 !important;\n        cursor: pointer !important;\n\n        &:hover {\n          color: @primary-color !important;\n        }\n      }\n    }\n  }\n\n  input.fix-auto-fill,\n  .fix-auto-fill input {\n    -webkit-text-fill-color: #c9d1d9 !important;\n    box-shadow: inherit !important;\n  }\n\n  .ant-divider-inner-text {\n    font-size: 12px !important;\n    color: @text-color-secondary !important;\n  }\n  .aui-third-login a{\n    background: transparent;\n  }\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/loginmini/MiniRegister.vue",
    "content": "<template>\n  <div class=\"aui-content\">\n    <div class=\"aui-container\">\n      <div class=\"aui-form\">\n        <div class=\"aui-image\">\n          <div class=\"aui-image-text\">\n            <img :src=\"jeecgAdTextImg\" alt=\"\" />\n          </div>\n        </div>\n        <div class=\"aui-formBox\">\n          <div class=\"aui-formWell\">\n            <a-form ref=\"formRef\" :model=\"formData\">\n              <div class=\"aui-flex aui-form-nav aui-clear-left\" style=\"padding-bottom: 21px\">\n                <div class=\"aui-flex-box activeNav on\">{{t('sys.login.signUpFormTitle')}}</div>\n              </div>\n              <div class=\"aui-form-box\">\n                <div class=\"aui-account aui-account-line\">\n                  <a-form-item>\n                    <div class=\"aui-input-line\">\n                      <Icon class=\"aui-icon\" icon=\"ant-design:user-outlined\"/>\n                      <a-input class=\"fix-auto-fill\" type=\"text\" :placeholder=\"t('sys.login.userName')\" v-model:value=\"formData.username\" />\n                    </div>\n                  </a-form-item>\n                  <a-form-item>\n                    <div class=\"aui-input-line\">\n                      <Icon class=\"aui-icon\" icon=\"ant-design:mobile-outlined\"/>\n                      <a-input class=\"fix-auto-fill\" type=\"text\" :placeholder=\"t('sys.login.mobile')\" v-model:value=\"formData.mobile\" />\n                    </div>\n                  </a-form-item>\n                  <a-form-item>\n                    <div class=\"aui-input-line\">\n                      <Icon class=\"aui-icon\" icon=\"ant-design:mail-outlined\"/>\n                      <a-input class=\"fix-auto-fill\" type=\"text\" :placeholder=\"t('sys.login.smsCode')\" v-model:value=\"formData.smscode\" />\n                      <div v-if=\"showInterval\" class=\"aui-code-line\" @click=\"getLoginCode\">{{t('component.countdown.normalText')}}</div>\n                      <div v-else class=\"aui-code-line\">{{t('component.countdown.sendText',[unref(timeRuning)])}}</div>\n                    </div>\n                  </a-form-item>\n                  <a-form-item>\n                    <div class=\"aui-input-line\">\n                      <Icon class=\"aui-icon\" icon=\"ant-design:lock-outlined\"/>\n                      <a-input class=\"fix-auto-fill\" :type=\"pwdIndex==='close'?'password':'text'\" :placeholder=\"t('sys.login.password')\" v-model:value=\"formData.password\" />\n                      <div class=\"aui-eye\">\n                        <img :src=\"eyeKImg\" alt=\"开启\" v-if=\"pwdIndex==='open'\"  @click=\"pwdClick('close')\" />\n                        <img :src=\"eyeGImg\" alt=\"关闭\"  v-else-if=\"pwdIndex==='close'\"  @click=\"pwdClick('open')\" />\n                      </div>\n                    </div>\n                  </a-form-item>\n                  <a-form-item>\n                    <div class=\"aui-input-line\">\n                      <Icon class=\"aui-icon\" icon=\"ant-design:lock-outlined\"/>\n                      <a-input class=\"fix-auto-fill\" :type=\"confirmPwdIndex==='close'?'password':'text'\" :placeholder=\"t('sys.login.confirmPassword')\" v-model:value=\"formData.confirmPassword\" />\n                      <div class=\"aui-eye\">\n                        <img :src=\"eyeKImg\" alt=\"开启\" v-if=\"confirmPwdIndex==='open'\" @click=\"confirmPwdClick('close')\" />\n                        <img :src=\"eyeGImg\" alt=\"关闭\" v-else-if=\"confirmPwdIndex==='close'\" @click=\"confirmPwdClick('open')\" />\n                      </div>\n                    </div>\n                  </a-form-item>\n                  <a-form-item name=\"policy\">\n                    <div class=\"aui-flex\">\n                      <div class=\"aui-flex-box\">\n                        <div class=\"aui-choice\">\n                          <a-checkbox  v-model:checked=\"formData.policy\" />\n                          <span style=\"color: #1b90ff;margin-left: 4px\">{{ t('sys.login.policy') }}</span>\n                        </div>\n                      </div>\n                    </div>\n                  </a-form-item>\n                </div>\n              </div>\n              <div class=\"aui-formButton\">\n                <div class=\"aui-flex\">\n                  <a class=\"aui-link-login aui-flex-box\" @click=\"registerHandleClick\"> {{ t('sys.login.registerButton') }}</a>\n                </div>\n                <div class=\"aui-flex\">\n                  <a class=\"aui-linek-code aui-flex-box\" @click=\"goBackHandleClick\">{{ t('sys.login.backSignIn') }}</a>\n                </div>\n              </div>\n            </a-form>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <!-- 图片验证码弹窗 -->\n  <CaptchaModal @register=\"captchaRegisterModal\" @ok=\"getLoginCode\" />\n</template>\n\n<script lang=\"ts\" setup name=\"mini-register\">\n  import { ref, reactive, unref, toRaw } from 'vue';\n  import { getCaptcha, register } from '/@/api/sys/user';\n  import { SmsEnum } from '/@/views/sys/login/useLogin';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import logoImg from '/@/assets/loginmini/icon/jeecg_logo.png';\n  import jeecgAdTextImg from '/@/assets/loginmini/icon/jeecg_ad_text.png';\n  import eyeKImg from '/@/assets/loginmini/icon/icon-eye-k.png';\n  import eyeGImg from '/@/assets/loginmini/icon/icon-eye-g.png';\n  import { useI18n } from \"/@/hooks/web/useI18n\";\n  import CaptchaModal from '@/components/jeecg/captcha/CaptchaModal.vue';\n  import { useModal } from \"@/components/Modal\";\n  import { ExceptionEnum } from \"@/enums/exceptionEnum\";\n\n  const { t } = useI18n();\n  const { notification, createErrorModal, createMessage } = useMessage();\n  const emit = defineEmits(['go-back', 'success', 'register']);\n  const formRef = ref();\n  const formData = reactive<any>({\n    username: '',\n    mobile: '',\n    smscode: '',\n    password: '',\n    confirmPassword: '',\n    policy: false,\n  });\n  //是否显示获取验证码\n  const showInterval = ref<boolean>(true);\n  //60s\n  const timeRuning = ref<number>(60);\n  //定时器\n  const timer = ref<any>(null);\n  //密码眼睛打开关闭\n  const pwdIndex = ref<string>('close');\n  //确认密码眼睛打开关闭\n  const confirmPwdIndex = ref<string>('close');\n  const [captchaRegisterModal, { openModal: openCaptchaModal }] = useModal();\n\n  /**\n   * 返回\n   */\n  function goBackHandleClick() {\n    emit('go-back');\n    initForm();\n  }\n\n  /**\n   * 获取手机验证码\n   */\n  async function getLoginCode() {\n    if (!formData.mobile) {\n      createMessage.warn(t('sys.login.mobilePlaceholder'));\n      return;\n    }\n    // 代码逻辑说明: 【QQYUN-9005】同一个IP，1分钟超过5次短信，则提示需要验证码---\n    const result = await getCaptcha({ mobile: formData.mobile, smsmode: SmsEnum.REGISTER }).catch((res) =>{\n      if(res.code === ExceptionEnum.PHONE_SMS_FAIL_CODE){\n        openCaptchaModal(true, {});\n      }\n    });\n    if (result) {\n      const TIME_COUNT = 60;\n      if (!unref(timer)) {\n        timeRuning.value = TIME_COUNT;\n        showInterval.value = false;\n        timer.value = setInterval(() => {\n          if (unref(timeRuning) > 0 && unref(timeRuning) <= TIME_COUNT) {\n            timeRuning.value = timeRuning.value - 1;\n          } else {\n            showInterval.value = true;\n            clearInterval(unref(timer));\n            timer.value = null;\n          }\n        }, 1000);\n      }\n    }\n  }\n\n  function registerHandleClick() {\n    if (!formData.username) {\n      createMessage.warn(t('sys.login.accountPlaceholder'));\n      return;\n    }\n    if (!formData.mobile) {\n      createMessage.warn(t('sys.login.mobilePlaceholder'));\n      return;\n    }\n    if (!formData.smscode) {\n      createMessage.warn(t('sys.login.smsPlaceholder'));\n      return;\n    }\n    if (!formData.password) {\n      createMessage.warn(t('sys.login.passwordPlaceholder'));\n      return;\n    }\n    if (!formData.confirmPassword) {\n      createMessage.warn(t('sys.login.confirmPassword'));\n      return;\n    }\n    if (formData.password !== formData.confirmPassword) {\n      createMessage.warn(t('sys.login.diffPwd'));\n      return;\n    }\n    if(!formData.policy){\n      createMessage.warn(t('sys.login.policyPlaceholder'));\n      return;\n    }\n    registerAccount();\n  }\n\n  /**\n   * 注册账号\n   */\n  async function registerAccount() {\n    try {\n      const resultInfo = await register(\n        toRaw({\n          username: formData.username,\n          password: formData.password,\n          phone: formData.mobile,\n          smscode: formData.smscode,\n        })\n      );\n      if (resultInfo && resultInfo.data.success) {\n        notification.success({\n          description: resultInfo.data.message || t('sys.api.registerMsg'),\n          duration: 3,\n        });\n        emit('success', { username: formData.username, password: formData.password });\n        initForm();\n      } else {\n        notification.warning({\n          message: t('sys.api.errorTip'),\n          description: resultInfo.data.message || t('sys.api.networkExceptionMsg'),\n          duration: 3,\n        });\n      }\n    } catch (error) {\n      notification.error({\n        message: t('sys.api.errorTip'),\n        description: error.message || t('sys.api.networkExceptionMsg'),\n        duration: 3,\n      });\n    }\n  }\n\n  /**\n   * 初始化表单\n   */\n  function initForm() {\n    Object.assign(formData,{username:'',mobile: '', smscode: '', password: '', confirmPassword: '', policy: false})\n    if(!unref(timer)){\n      showInterval.value = true;\n      clearInterval(unref(timer));\n      timer.value = null;\n    }\n    formRef.value.resetFields();\n  }\n\n  /**\n   * 密码打开或关闭\n   * @param value\n   */\n  function pwdClick(value) {\n    pwdIndex.value = value;\n  }\n\n  /**\n   * 确认密码打开或关闭\n   * @param value\n   */\n  function confirmPwdClick(value) {\n    confirmPwdIndex.value = value;\n  }\n\n  defineExpose({\n    initForm\n  })\n</script>\n<style lang=\"less\" scoped>\n@import '/@/assets/loginmini/style/home.less';\n@import '/@/assets/loginmini/style/base.less';\n.aui-input-line .aui-icon{\n  position: absolute;\n  z-index: 2;\n  top: 10px;\n  left: 10px;\n  font-size: 20px !important;\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/loginmini/OAuth2Login.vue",
    "content": "<template>\n  <div> </div>\n</template>\n\n<script setup lang=\"ts\">\n  import { ref } from 'vue';\n  import { isOAuth2AppEnv, sysOAuth2Callback, sysOAuth2Login } from '/@/views/sys/login/useLogin';\n  import { useRouter } from 'vue-router';\n  import { PageEnum } from '/@/enums/pageEnum';\n  import { router } from '/@/router';\n  import { useUserStore } from '/@/store/modules/user';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { getAuthCache, getTenantId, getToken } from \"/@/utils/auth\";\n  import { requestAuthCode } from 'dingtalk-jsapi';\n  import { defHttp } from '/@/utils/http/axios';\n  import { OAUTH2_THIRD_LOGIN_TENANT_ID } from \"/@/enums/cacheEnum\";\n\n  const isOAuth = ref<boolean>(isOAuth2AppEnv());\n  const env = ref<any>({ thirdApp: false, wxWork: false, dingtalk: false });\n  const { currentRoute } = useRouter();\n  const route = currentRoute.value;\n  if (!isOAuth2AppEnv()) {\n    router.replace({ path: PageEnum.BASE_LOGIN, query: route.query });\n  }\n\n  if (isOAuth.value) {\n    checkEnv();\n  }\n\n  /**\n   * 检测当前的环境\n   */\n  function checkEnv() {\n    // 判断当时是否是企业微信环境\n    if (/wxwork/i.test(navigator.userAgent)) {\n      env.value.thirdApp = true;\n      env.value.wxWork = true;\n    }\n    // 判断当时是否是钉钉环境\n    if (/dingtalk/i.test(navigator.userAgent)) {\n      env.value.thirdApp = true;\n      env.value.dingtalk = true;\n    }\n    doOAuth2Login();\n  }\n\n  /**\n   * 进行OAuth2登录操作\n   */\n  function doOAuth2Login() {\n    if (env.value.thirdApp) {\n      // 判断是否携带了Token，是就说明登录成功\n      if (route.query.oauth2LoginToken) {\n        let token = route.query.oauth2LoginToken;\n        //执行登录操作\n        thirdLogin({ token, thirdType: route.query.thirdType,tenantId: getTenantId });\n      } else if (env.value.wxWork) {\n        sysOAuth2Login('wechat_enterprise');\n      } else if (env.value.dingtalk) {\n        //新版钉钉登录\n        dingdingLogin();\n      }\n    }\n  }\n\n  /**\n   * 第三方登录\n   * @param params\n   */\n  function thirdLogin(params) {\n    const userStore = useUserStore();\n    const { notification } = useMessage();\n    const { t } = useI18n();\n    userStore.ThirdLogin(params).then((res) => {\n      if (res && res.userInfo) {\n        notification.success({\n          message: t('sys.login.loginSuccessTitle'),\n          description: `${t('sys.login.loginSuccessDesc')}: ${res.userInfo.realname}`,\n          duration: 3,\n        });\n      } else {\n        notification.error({\n          message: t('sys.login.errorTip'),\n          description: ((res.response || {}).data || {}).message || res.message || t('sys.login.networkExceptionMsg'),\n          duration: 4,\n        });\n      }\n    });\n  }\n\n  /**\n   * 钉钉登录\n   */\n  function dingdingLogin() {\n    //先获取钉钉的企业id，如果没有配置 还是走原来的逻辑，走原来的逻辑 需要判断存不存在token，存在token直接去首页\n    let tenantId = getAuthCache(OAUTH2_THIRD_LOGIN_TENANT_ID) || 0;\n    let url = `/sys/thirdLogin/get/corpId/clientId?tenantId=${tenantId}`;\n    // 代码逻辑说明: 不要使用getAction online里面的，要用defHttp---\n    defHttp.get({ url:url },{ isTransformResponse: false }).then((res) => {\n        if (res.success) {\n          if(res.result && res.result.corpId && res.result.clientId){\n            requestAuthCode({ corpId: res.result.corpId, clientId: res.result.clientId }).then((res) => {\n              let { code } = res;\n              sysOAuth2Callback(code);\n            });\n          }else{\n            toOldAuthLogin();\n          }\n        } else {\n          toOldAuthLogin();\n        }\n      }).catch((err) => {\n        toOldAuthLogin();\n      });\n  }\n  \n  /**\n   * 旧版钉钉登录\n   */\n  function toOldAuthLogin() {\n    let token = getToken();\n    if (token) {\n      router.replace({ path: PageEnum.BASE_HOME });\n    } else {\n      sysOAuth2Login('dingtalk');\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/menu/DataRuleList.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"$attrs\" @register=\"registerDrawer\" title=\"数据权限规则\" :width=\"adaptiveWidth\" :rootClassName=\"prefixCls\">\n    <BasicTable @register=\"registerTable\">\n      <template #tableTitle>\n        <a-button type=\"primary\" @click=\"handleCreate\"> 新增</a-button>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n    </BasicTable>\n  </BasicDrawer>\n  <DataRuleModal @register=\"registerModal\" @success=\"reload\" :permissionId=\"permissionId\" />\n</template>\n<script lang=\"ts\" setup>\n  import { ref, unref } from 'vue';\n  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import DataRuleModal from './DataRuleModal.vue';\n  import { dataRuleColumns, dataRuleSearchFormSchema } from './menu.data';\n  import { dataRuleList, deleteRule } from './menu.api';\n  import { ColEx } from '/@/components/Form/src/types';\n  import { useDrawerAdaptiveWidth } from '/@/hooks/jeecg/useAdaptiveWidth';\n  import { useDesign } from '/@/hooks/web/useDesign';\n  const permissionId = ref('');\n  const { adaptiveWidth } = useDrawerAdaptiveWidth();\n  const { prefixCls } = useDesign('sys-menu-dataRulelist');\n  //权限规则model\n  const [registerModal, { openModal }] = useModal();\n  const [registerDrawer] = useDrawerInner(async (data) => {\n    permissionId.value = data.id;\n    setProps({ searchInfo: { permissionId: unref(permissionId) } });\n    reload();\n  });\n  // 自适应列配置\n  const adaptiveColProps: Partial<ColEx> = {\n    xs: 24, // <576px\n    sm: 24, // ≥576px\n    md: 24, // ≥768px\n    lg: 12, // ≥992px\n    xl: 8, // ≥1200px\n    xxl: 8, // ≥1600px\n  };\n  const [registerTable, { reload, setProps }] = useTable({\n    api: dataRuleList,\n    columns: dataRuleColumns,\n    size: 'small',\n    formConfig: {\n      baseColProps: adaptiveColProps,\n      labelAlign: 'right',\n      labelCol: {\n        offset: 1,\n        xs: 24,\n        sm: 24,\n        md: 24,\n        lg: 8,\n        xl: 8,\n        xxl: 8,\n      },\n      wrapperCol: {},\n      schemas: dataRuleSearchFormSchema,\n      autoSubmitOnEnter: true,\n    },\n    striped: true,\n    useSearchForm: true,\n    bordered: true,\n    showIndexColumn: false,\n    showTableSetting: false,\n    canResize: false,\n    immediate: false,\n    actionColumn: {\n      width: 100,\n      title: '操作',\n      dataIndex: 'action',\n      slots: { customRender: 'action' },\n      fixed: undefined,\n    },\n  });\n\n  /**\n   * 新增\n   */\n  function handleCreate() {\n    openModal(true, {\n      isUpdate: false,\n    });\n  }\n\n  /**\n   * 编辑\n   */\n  function handleEdit(record) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n\n  /**\n   * 删除\n   */\n  async function handleDelete(record) {\n    await deleteRule({ id: record.id }, reload);\n  }\n\n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n</script>\n<style lang=\"less\">\n  // -update-begin--author:liaozhiyang---date:20240702---for：【TV360X-1660】菜单管理-数据权限的查询和按钮没间隙\n  @prefix-cls: ~'@{namespace}-sys-menu-dataRulelist';\n  .@{prefix-cls} {\n    .jeecg-basic-table {\n      padding: 0;\n    }\n    .btnArea {\n      .ant-btn {\n        &:last-child {\n          margin-right: 0;\n        }\n        &:first-child {\n          margin-left: 8px;\n        }\n      }\n    }\n  }\n  // -update-end--author:liaozhiyang---date:20240702---for：【TV360X-1660】菜单管理-数据权限的查询和按钮没间隙\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/menu/DataRuleModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"getTitle\" @ok=\"handleSubmit\" width=\"700px\" destroyOnClose>\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { dataRuleFormSchema } from './menu.data';\n  import { saveOrUpdateRule } from './menu.api';\n  // 声明Emits\n  const emit = defineEmits(['success', 'register']);\n  const props = defineProps({ permissionId: String });\n  const isUpdate = ref(true);\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n    schemas: dataRuleFormSchema,\n    showActionButtonGroup: false,\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false });\n    isUpdate.value = !!data?.isUpdate;\n    if (unref(isUpdate)) {\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n    }\n  });\n\n  //设置标题\n  const getTitle = computed(() => (!unref(isUpdate) ? '新增规则' : '编辑规则'));\n\n  //表单提交事件\n  async function handleSubmit() {\n    try {\n      const values = await validate();\n      values.permissionId = props.permissionId;\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      await saveOrUpdateRule(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/menu/MenuDrawer.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"$attrs\" @register=\"registerDrawer\" showFooter :width=\"adaptiveWidth\" :title=\"getTitle\" @ok=\"handleSubmit\">\n    <BasicForm @register=\"registerForm\" class=\"menuForm\" />\n  </BasicDrawer>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed, unref, useAttrs } from 'vue';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { formSchema, ComponentTypes } from './menu.data';\n  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';\n  import { list, saveOrUpdateMenu } from './menu.api';\n  import { useDrawerAdaptiveWidth } from '/@/hooks/jeecg/useAdaptiveWidth';\n  import { useI18n } from \"/@/hooks/web/useI18n\";\n  // 声明Emits\n  const emit = defineEmits(['success', 'register']);\n  const { adaptiveWidth } = useDrawerAdaptiveWidth();\n  const attrs = useAttrs();\n  const isUpdate = ref(true);\n  const menuType = ref(0);\n  const isButton = (type) => type === 2;\n  const [registerForm, { setProps, resetFields, setFieldsValue, updateSchema, validate, clearValidate }] = useForm({\n    labelCol: {\n      md: { span: 4 },\n      sm: { span: 6 },\n    },\n    wrapperCol: {\n      md: { span: 20 },\n      sm: { span: 18 },\n    },\n    schemas: formSchema,\n    showActionButtonGroup: false,\n  });\n\n  const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {\n    await resetFields();\n    setDrawerProps({ confirmLoading: false });\n    isUpdate.value = !!data?.isUpdate;\n    menuType.value = data?.record?.menuType;\n\n    //获取下拉树信息\n    const treeData = await list();\n    updateSchema([\n      {\n        field: 'parentId',\n        // 代码逻辑说明: 【QQYUN-8379】菜单管理页菜单国际化\n        componentProps: { treeData: translateMenu(treeData, 'name') },\n      },\n      {\n        field: 'name',\n        label: isButton(unref(menuType)) ? '按钮/权限' : '菜单名称',\n      },\n      {\n        field: 'url',\n        required: !isButton(unref(menuType)),\n        componentProps: {\n          onChange: (e) => onUrlChange(e.target.value),\n        },\n      },\n    ]);\n\n    // 无论新增还是编辑，都可以设置表单值\n    if (typeof data.record === 'object') {\n      let values = { ...data.record };\n      setFieldsValue(values);\n      onUrlChange(values.url);\n    }\n    //按钮类型情况下，编辑时候清除一下地址的校验\n    if (menuType.value == 2) {\n      clearValidate();\n    }\n    //禁用表单\n    setProps({ disabled: !attrs.showFooter });\n  });\n  //获取弹窗标题\n  const getTitle = computed(() => (!unref(isUpdate) ? '新增菜单' : '编辑菜单'));\n  //提交事件\n  async function handleSubmit() {\n    try {\n      const values = await validate();\n      // iframe兼容\n      if (ComponentTypes.IFrame === values.component) {\n        values.component = values.frameSrc;\n      }\n      setDrawerProps({ confirmLoading: true });\n      //提交表单\n      await saveOrUpdateMenu(values, unref(isUpdate));\n      closeDrawer();\n      emit('success');\n    } finally {\n      setDrawerProps({ confirmLoading: false });\n    }\n  }\n\n  /** url 变化时，动态设置组件名称placeholder */\n  function onUrlChange(url) {\n    let placeholder = '';\n    let httpUrl = url;\n    if (url != null && url != '') {\n      if (url.startsWith('/')) {\n        url = url.substring(1);\n      }\n      url = url.replaceAll('/', '-');\n      // 特殊标记\n      url = url.replaceAll(':', '@');\n      placeholder = `${url}`;\n    } else {\n      placeholder = '请输入组件名称';\n    }\n    updateSchema([{ field: 'componentName', componentProps: { placeholder } }]);\n    // 代码逻辑说明: [QQYUN-4058]菜单添加智能化处理------------\n    if (httpUrl != null && httpUrl != '') {\n      if (httpUrl.startsWith('http://') || httpUrl.startsWith('https://')) {\n        setFieldsValue({ component: httpUrl });\n      }\n    }\n  }\n\n  /**\n  * 2024-03-06\n  * liaozhiyang\n  * 翻译菜单名称\n  */\n  function translateMenu(data, key) {\n    if (data?.length) {\n      const { t } = useI18n();\n      data.forEach((item) => {\n        if (item[key]) {\n          if (item[key].includes(\"t('\") && t) {\n            item[key] = new Function('t', `return ${item[key]}`)(t);\n          }\n        }\n        if (item.children?.length) {\n          translateMenu(item.children, key);\n        }\n      });\n    }\n    return data;\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/menu/index.vue",
    "content": "<template>\n  <div class=\"p-4\">\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <template #tableTitle>\n        <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"handleCreate\"> 新增菜单</a-button>\n        <a-button type=\"primary\" preIcon=\"ic:round-expand\" @click=\"expandAll\">展开全部</a-button>\n        <a-button type=\"primary\" preIcon=\"ic:round-compress\" @click=\"collapseAll\">折叠全部</a-button>\n\n        <a-dropdown v-if=\"checkedKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\" />\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button\n            >批量操作\n            <Icon icon=\"ant-design:down-outlined\" />\n          </a-button>\n        </a-dropdown>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\" />\n      </template>\n    </BasicTable>\n    <MenuDrawer @register=\"registerDrawer\" @success=\"handleSuccess\" :showFooter=\"showFooter\" />\n    <DataRuleList @register=\"registerDrawer1\" />\n  </div>\n</template>\n<script lang=\"ts\" name=\"system-menu\" setup>\n  import { nextTick, ref } from 'vue';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { useDrawer } from '/@/components/Drawer';\n  import MenuDrawer from './MenuDrawer.vue';\n  import DataRuleList from './DataRuleList.vue';\n  import { columns,searchFormSchema } from './menu.data';\n  import { list, deleteMenu, batchDeleteMenu } from './menu.api';\n  import { useDefIndexStore } from \"@/store/modules/defIndex\";\n  import { useI18n } from \"/@/hooks/web/useI18n\";\n\n  const checkedKeys = ref<Array<string | number>>([]);\n  const showFooter = ref(true);\n  const [registerDrawer, { openDrawer }] = useDrawer();\n  const [registerDrawer1, { openDrawer: openDataRule }] = useDrawer();\n  const { t } = useI18n();\n\n  // 自定义菜单名称列渲染\n  columns[0].customRender = function ({ text, record }) {\n    // date-begin--author:liaozhiyang---date:20250716---for：【issues/8317】默认首页菜单名称适配国际化报错\n    let displayText = text;\n    // 先处理国际化，避免在添加默认首页标记后影响国际化检查\n    if (displayText && displayText.includes(\"t('\") && t) {\n      try {\n        displayText = new Function('t', `return ${displayText}`)(t);\n      } catch (error) {\n        console.warn('国际化处理失败:', error);\n        // 如果国际化处理失败，使用原始文本\n        displayText = text;\n      }\n    }\n    // 在国际化处理完成后，再添加默认首页标记\n    const isDefIndex = checkDefIndex(record);\n    if (isDefIndex) {\n      displayText += `（${t('routes.basic.defaultHomePage')}）`;\n    }\n    return displayText;\n    // date-end--author:liaozhiyang---date:20250716---for：【issues/8317】默认首页菜单名称适配国际化报错\n  };\n\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext } = useListPage({\n    tableProps: {\n      title: '菜单列表',\n      api: list,\n      columns: columns,\n      size: 'small',\n      pagination: false,\n      isTreeTable: true,\n      striped: true,\n      useSearchForm: true,\n      showTableSetting: true,\n      bordered: true,\n      showIndexColumn: false,\n      tableSetting: { fullScreen: true },\n      formConfig: {\n        // 代码逻辑说明: 【QQYUN-5873】查询区域lablel默认居左\n        labelWidth: 74,\n        rowProps: { gutter: 24 },\n        schemas: searchFormSchema,\n        autoAdvancedCol: 4,\n        baseColProps: { xs: 24, sm: 12, md: 6, lg: 6, xl: 6, xxl: 6 },\n        actionColOptions: { xs: 24, sm: 12, md: 6, lg: 6, xl: 6, xxl: 6 },\n      },\n      actionColumn: {\n        width: 120,\n      },\n    },\n  });\n  //注册table数据\n  const [registerTable, { reload, expandAll, collapseAll }] = tableContext;\n\n  /**\n   * 选择列配置\n   */\n  const rowSelection = {\n    type: 'checkbox',\n    columnWidth: 30,\n    selectedRowKeys: checkedKeys,\n    onChange: onSelectChange,\n  };\n\n  /**\n   * 选择事件\n   */\n  function onSelectChange(selectedRowKeys: (string | number)[]) {\n    checkedKeys.value = selectedRowKeys;\n  }\n\n  /**\n   * 新增\n   */\n  function handleCreate() {\n    showFooter.value = true;\n    openDrawer(true, {\n      isUpdate: false,\n    });\n  }\n\n  /**\n   * 编辑\n   */\n  function handleEdit(record) {\n    showFooter.value = true;\n    openDrawer(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n  /**\n   * 详情\n   */\n  function handleDetail(record) {\n    showFooter.value = false;\n    openDrawer(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n  /**\n   * 添加下级\n   */\n  function handleAddSub(record) {\n    openDrawer(true, {\n      record: { parentId: record.id, menuType: 1 },\n      isUpdate: false,\n    });\n  }\n  /**\n   * 数据权限弹窗\n   */\n  function handleDataRule(record) {\n    openDataRule(true, { id: record.id });\n  }\n\n  /**\n   * 删除\n   */\n  async function handleDelete(record) {\n    await deleteMenu({ id: record.id }, reload);\n  }\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDeleteMenu({ ids: checkedKeys.value }, () => {\n      // -update-begin--author:liaozhiyang---date:20240702---for：【TV360X-1662】菜单管理、定时任务批量删除清空选中\n      reload();\n      checkedKeys.value = [];\n      // -update-end--author:liaozhiyang---date:20240702---for：【TV360X-1662】菜单管理、定时任务批量删除清空选中\n    });\n  }\n  /**\n   * 成功回调\n   */\n  function handleSuccess() {\n    reload();\n    reloadDefIndex();\n  }\n\n  function onFetchSuccess() {\n    // 演示默认展开所有表项\n    nextTick(expandAll);\n  }\n\n  // --------------- begin 默认首页配置 ------------\n\n  const defIndexStore = useDefIndexStore()\n\n  // 设置默认主页\n  async function handleSetDefIndex(record: Recordable) {\n    defIndexStore.update(record.url, record.component, record.route)\n  }\n\n  /**\n   * 检查是否为默认主页\n   * @param record\n   */\n  function checkDefIndex(record: Recordable) {\n    return defIndexStore.check(record.url)\n  }\n\n  // 重新加载默认首页配置\n  function reloadDefIndex() {\n    try {\n      defIndexStore.query();\n    } catch (e) {\n      console.error(e)\n    }\n  }\n\n  reloadDefIndex()\n\n  // --------------- end 默认首页配置 ------------\n\n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n    ];\n  }\n\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record) {\n    return [\n      // {\n      //   label: '详情',\n      //   onClick: handleDetail.bind(null, record),\n      // },\n      {\n        label: '添加下级',\n        onClick: handleAddSub.bind(null, record),\n      },\n      {\n        label: '数据规则',\n        onClick: handleDataRule.bind(null, record),\n      },\n      {\n        label: '设为默认首页',\n        onClick: handleSetDefIndex.bind(null, record),\n        ifShow: () => !record.internalOrExternal && record.component && !checkDefIndex(record),\n      },\n      {\n        label: '删除',\n        color: 'error',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/menu/menu.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { Modal } from 'ant-design-vue';\n\nenum Api {\n  list = '/sys/permission/list',\n  save = '/sys/permission/add',\n  edit = '/sys/permission/edit',\n  delete = '/sys/permission/delete',\n  deleteBatch = '/sys/permission/deleteBatch',\n  ruleList = '/sys/permission/queryPermissionRule',\n  ruleSave = '/sys/permission/addPermissionRule',\n  ruleEdit = '/sys/permission/editPermissionRule',\n  ruleDelete = '/sys/permission/deletePermissionRule',\n  checkPermDuplication = '/sys/permission/checkPermDuplication',\n}\n\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) => {\n  return defHttp.get({ url: Api.list, params });\n}\n\n/**\n * 删除菜单\n */\nexport const deleteMenu = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.delete, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 批量删除菜单\n * @param params\n */\nexport const batchDeleteMenu = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n/**\n * 保存或者更新菜单\n * @param params\n */\nexport const saveOrUpdateMenu = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({ url: url, params });\n};\n/**\n * 菜单数据权限列表接口\n * @param params\n */\nexport const dataRuleList = (params) => defHttp.get({ url: Api.ruleList, params });\n/**\n * 保存或者更新数据规则\n * @param params\n */\nexport const saveOrUpdateRule = (params, isUpdate) => {\n  let url = isUpdate ? Api.ruleEdit : Api.ruleSave;\n  return defHttp.post({ url: url, params });\n};\n\n/**\n * 删除数据权限\n */\nexport const deleteRule = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.ruleDelete, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 根据code获取字典数值\n * @param params\n */\nexport const ajaxGetDictItems = (params) => defHttp.get({ url: `/sys/dict/getDictItems/${params.code}` });\n\n/**\n * 唯一校验\n * @param params\n */\nexport const getCheckPermDuplication = (params) => defHttp.get({ url: Api.checkPermDuplication, params }, { isTransformResponse: false });\n\n/**\n * 校验菜单是否存在\n * @param model\n * @param schema\n * @param required\n */\nexport const checkPermDuplication=(model, schema, required?)=>{\n  return [\n    {\n      validator: (_, value) => {\n        if (!required) {\n          return Promise.resolve();\n        }\n        if (!value && required) {\n          return Promise.reject(`请输入${schema.label}`);\n        }\n        return new Promise<void>((resolve, reject) => {\n          getCheckPermDuplication({\n            id: model.id,\n            url:model.url,\n            alwaysShow:model.alwaysShow\n          }).then((res) => {\n              res.success ? resolve() : reject(res.message || '校验失败');\n          }).catch((err) => {\n              reject(err.message || '验证失败');\n          });\n        });\n      },\n    },\n  ];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/menu/menu.data.ts",
    "content": "import { BasicColumn } from '/@/components/Table';\nimport { FormSchema } from '/@/components/Table';\nimport { h } from 'vue';\nimport { Icon } from '/@/components/Icon';\nimport { duplicateCheck } from '../user/user.api';\nimport { ajaxGetDictItems ,checkPermDuplication } from './menu.api';\nimport { render } from '/@/utils/common/renderUtils';\n\nconst isDir = (type) => type === 0;\nconst isMenu = (type) => type === 1;\nconst isButton = (type) => type === 2;\n\n// 定义可选择的组件类型\nexport enum ComponentTypes {\n  Default = 'layouts/default/index',\n  IFrame = 'sys/iframe/FrameBlank',\n}\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '菜单名称',\n    dataIndex: 'name',\n    width: 200,\n    align: 'left',\n  },\n  {\n    title: '菜单类型',\n    dataIndex: 'menuType',\n    width: 150,\n    customRender: ({ text }) => {\n      return render.renderDict(text, 'menu_type');\n    },\n  },\n  {\n    title: '图标',\n    dataIndex: 'icon',\n    width: 50,\n    customRender: ({ record }) => {\n      return h(Icon, { icon: record.icon });\n    },\n  },\n  {\n    title: '组件',\n    dataIndex: 'component',\n    align: 'left',\n    width: 150,\n  },\n  {\n    title: '路径',\n    dataIndex: 'url',\n    align: 'left',\n    width: 150,\n  },\n  {\n    title: '排序',\n    dataIndex: 'sortNo',\n    width: 50,\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'name',\n    label: '菜单名称',\n    component: 'Input',\n    colProps: { span: 8 },\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    label: 'id',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    field: 'menuType',\n    label: '菜单类型',\n    component: 'RadioButtonGroup',\n    defaultValue: 0,\n    componentProps: ({ formActionType, formModel }) => {\n      return {\n        options: [\n          { label: '一级菜单', value: 0 },\n          { label: '子菜单', value: 1 },\n          { label: '按钮/权限', value: 2 },\n        ],\n        onChange: (e) => {\n          const { updateSchema, clearValidate } = formActionType;\n          const label = isButton(e) ? '按钮/权限' : '菜单名称';\n          //清除校验\n          clearValidate();\n          updateSchema([\n            {\n              field: 'name',\n              label: label,\n            },\n            {\n              field: 'url',\n              required: !isButton(e),\n            },\n          ]);\n          // 代码逻辑说明: [VUEN-1834]只有一级菜单，才默认值，子菜单的时候，清空------------\n          if (isMenu(e) && !formModel.id && (formModel.component=='layouts/default/index' || formModel.component=='layouts/RouteView')) {\n            formModel.component = '';\n          }\n        },\n      };\n    },\n  },\n  {\n    field: 'name',\n    label: '菜单名称',\n    component: 'Input',\n    required: true,\n  },\n  {\n    field: 'parentId',\n    label: '上级菜单',\n    component: 'TreeSelect',\n    required: true,\n    componentProps: {\n      // 代码逻辑说明: replaceFields已过期，使用fieldNames代替------------\n      fieldNames: {\n        label: 'name',\n        key: 'id',\n        value: 'id',\n      },\n      dropdownStyle: {\n        maxHeight: '50vh',\n      },\n      getPopupContainer: (node) => node?.parentNode,\n    },\n    ifShow: ({ values }) => !isDir(values.menuType),\n  },\n  {\n    field: 'url',\n    label: '访问路径',\n    component: 'Input',\n    required: true,\n    // 代码逻辑说明: [issues/5008]子表数据权限设置不生效\n    ifShow: ({ values }) => !(values.component === ComponentTypes.IFrame && values.internalOrExternal),\n    // 代码逻辑说明: 聚合路由允许路径重复\n     dynamicRules: ({ model, schema,values }) => {\n       return checkPermDuplication(model, schema,  values.menuType !== 2?true:false);\n    },\n  },\n  {\n    field: 'component',\n    label: '前端组件',\n    component: 'Input',\n    componentProps: {\n      placeholder: '请输入前端组件',\n    },\n    defaultValue:'layouts/default/index',\n    required: true,\n    ifShow: ({ values }) => !isButton(values.menuType),\n  },\n  {\n    field: 'componentName',\n    label: '组件名称',\n    component: 'Input',\n    componentProps: {\n      placeholder: '请输入组件名称',\n    },\n    helpMessage: [\n      '此处名称应和vue组件的name属性保持一致。',\n      '组件名称不能重复，主要用于路由缓存功能。',\n      '如果组件名称和vue组件的name属性不一致，则会导致路由缓存失效。',\n      '非必填，留空则会根据访问路径自动生成。',\n    ],\n    defaultValue: '',\n    ifShow: ({ values }) => !isButton(values.menuType),\n  },\n  {\n    field: 'frameSrc',\n    label: 'Iframe地址',\n    component: 'Input',\n    rules: [\n      { required: true, message: '请输入Iframe地址' },\n      { type: 'url', message: '请输入正确的url地址' },\n    ],\n    ifShow: ({ values }) => !isButton(values.menuType) && values.component === ComponentTypes.IFrame,\n  },\n  {\n    field: 'redirect',\n    label: '默认跳转地址',\n    component: 'Input',\n    ifShow: ({ values }) => isDir(values.menuType),\n  },\n  {\n    field: 'perms',\n    label: '授权标识',\n    component: 'Input',\n    ifShow: ({ values }) => isButton(values.menuType),\n    // dynamicRules: ({ model }) => {\n    //   return [\n    //     {\n    //       required: false,\n    //       validator: (_, value) => {\n    //         return new Promise((resolve, reject) => {\n    //           let params = {\n    //             tableName: 'sys_permission',\n    //             fieldName: 'perms',\n    //             fieldVal: value,\n    //             dataId: model.id,\n    //           };\n    //           duplicateCheck(params)\n    //             .then((res) => {\n    //               res.success ? resolve() : reject(res.message || '校验失败');\n    //             })\n    //             .catch((err) => {\n    //               reject(err.message || '校验失败');\n    //             });\n    //         });\n    //       },\n    //     },\n    //   ];\n    // },\n  },\n  {\n    field: 'permsType',\n    label: '授权策略',\n    component: 'RadioGroup',\n    defaultValue: '1',\n    helpMessage: ['可见/可访问(授权后可见/可访问)', '可编辑(未授权时禁用)'],\n    componentProps: {\n      options: [\n        { label: '可见/可访问', value: '1' },\n        { label: '可编辑', value: '2' },\n      ],\n    },\n    ifShow: ({ values }) => isButton(values.menuType),\n  },\n  {\n    field: 'status',\n    label: '状态',\n    component: 'RadioGroup',\n    defaultValue: '1',\n    componentProps: {\n      options: [\n        { label: '有效', value: '1' },\n        { label: '无效', value: '0' },\n      ],\n    },\n    ifShow: ({ values }) => isButton(values.menuType),\n  },\n  {\n    field: 'icon',\n    label: '菜单图标',\n    component: 'IconPicker',\n    ifShow: ({ values }) => !isButton(values.menuType),\n    componentProps: {\n      allowClear: true\n    },\n  },\n  {\n    field: 'sortNo',\n    label: '排序',\n    component: 'InputNumber',\n    defaultValue: 1,\n    ifShow: ({ values }) => !isButton(values.menuType),\n  },\n  {\n    field: 'route',\n    label: '是否路由菜单',\n    component: 'Switch',\n    defaultValue: true,\n    componentProps: {\n      checkedChildren: '是',\n      unCheckedChildren: '否',\n    },\n    ifShow: ({ values }) => !isButton(values.menuType),\n  },\n  {\n    field: 'hidden',\n    label: '隐藏路由',\n    component: 'Switch',\n    defaultValue: 0,\n    componentProps: {\n      checkedChildren: '是',\n      unCheckedChildren: '否',\n    },\n    ifShow: ({ values }) => !isButton(values.menuType),\n  },\n  {\n    field: 'hideTab',\n    label: '隐藏Tab',\n    component: 'Switch',\n    defaultValue: 0,\n    componentProps: {\n      checkedChildren: '是',\n      unCheckedChildren: '否',\n    },\n    ifShow: ({ values }) => !isButton(values.menuType),\n  },\n  {\n    field: 'keepAlive',\n    label: '是否缓存路由',\n    component: 'Switch',\n    defaultValue: false,\n    componentProps: {\n      checkedChildren: '是',\n      unCheckedChildren: '否',\n    },\n    ifShow: ({ values }) => !isButton(values.menuType),\n  },\n  {\n    field: 'alwaysShow',\n    label: '聚合路由',\n    component: 'Switch',\n    defaultValue: false,\n    componentProps: {\n      checkedChildren: '是',\n      unCheckedChildren: '否',\n    },\n    ifShow: ({ values }) => !isButton(values.menuType),\n  },\n  {\n    field: 'internalOrExternal',\n    label: '打开方式',\n    component: 'Switch',\n    defaultValue: false,\n    componentProps: {\n      checkedChildren: '外部',\n      unCheckedChildren: '内部',\n    },\n    ifShow: ({ values }) => !isButton(values.menuType),\n  },\n];\n\nexport const dataRuleColumns: BasicColumn[] = [\n  {\n    title: '规则名称',\n    dataIndex: 'ruleName',\n    width: 150,\n  },\n  {\n    title: '规则字段',\n    dataIndex: 'ruleColumn',\n    width: 100,\n  },\n  {\n    title: '规则值',\n    dataIndex: 'ruleValue',\n    width: 100,\n  },\n];\n\nexport const dataRuleSearchFormSchema: FormSchema[] = [\n  {\n    field: 'ruleName',\n    label: '规则名称',\n    component: 'Input',\n    // colProps: { span: 6 },\n  },\n  {\n    field: 'ruleValue',\n    label: '规则值',\n    component: 'Input',\n    // colProps: { span: 6 },\n  },\n];\n\nexport const dataRuleFormSchema: FormSchema[] = [\n  {\n    label: 'id',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    field: 'ruleName',\n    label: '规则名称',\n    component: 'Input',\n    required: true,\n  },\n  {\n    field: 'ruleColumn',\n    label: '规则字段',\n    component: 'Input',\n    ifShow: ({ values }) => {\n      const ruleConditions = Array.isArray(values.ruleConditions) ? values.ruleConditions[0] : values.ruleConditions;\n      return ruleConditions !== 'USE_SQL_RULES';\n    },\n  },\n  {\n    field: 'ruleConditions',\n    label: '条件规则',\n    required: true,\n    component: 'ApiSelect',\n    componentProps: {\n      api: ajaxGetDictItems,\n      params: { code: 'rule_conditions' },\n      labelField: 'text',\n      valueField: 'value',\n      getPopupContainer: (node) => document.body,\n    },\n  },\n  // 代码逻辑说明: 【TV360X-1864】添加系统变量\n  {\n    field: 'ruleValue',\n    component: 'JInputSelect',\n    label: '规则值',\n    required: true,\n    componentProps: {\n      selectPlaceholder: '可选择系统变量',\n      inputPlaceholder: '请输入',\n      getPopupContainer: () => document.body,\n      selectWidth: '200px',\n      options: [\n        {\n          label: '登录用户账号',\n          value: '#{sys_user_code}',\n        },\n        {\n          label: '登录用户名称',\n          value: '#{sys_user_name}',\n        },\n        {\n          label: '当前日期',\n          value: '#{sys_date}',\n        },\n        {\n          label: '当前时间',\n          value: '#{sys_time}',\n        },\n        {\n          label: '登录用户部门',\n          value: '#{sys_org_code}',\n        },\n        {\n          label: '用户拥有部门',\n          value: '#{sys_multi_org_code}',\n        },\n        {\n          label: '登录用户租户',\n          value: '#{tenant_id}',\n        },\n      ],\n    },\n  },\n  {\n    field: 'status',\n    label: '状态',\n    component: 'RadioButtonGroup',\n    defaultValue: '1',\n    componentProps: {\n      options: [\n        { label: '无效', value: '0' },\n        { label: '有效', value: '1' },\n      ],\n    },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/message/components/SysMessageList.vue",
    "content": "<template>\n  <a-list item-layout=\"horizontal\" :data-source=\"messageList\" :locale=\"locale\">\n    <template #loadMore>\n      <div\n        v-if=\"messageList && messageList.length > 0 && !loadEndStatus && !loadingMoreStatus\"\n        :style=\"{ textAlign: 'center', marginTop: '12px', height: '32px', lineHeight: '32px' }\"\n      >\n        <a-button @click=\"onLoadMore\">加载更多</a-button>\n      </div>\n      <div\n        v-if=\"messageList && messageList.length > 0 && loadEndStatus\"\n        :style=\"{ textAlign: 'center', marginTop: '12px', height: '32px', lineHeight: '32px' }\"\n      >\n        没有更多了\n      </div>\n    </template>\n\n    <template #renderItem=\"{ item }\">\n      <a-list-item :style=\"{ background: item?.izTop && item.izTop == 1 ? '#f7f7f7' : 'auto' }\">\n        <template #actions>\n          <a-rate class=\"antd-rate\" :value=\"item.starFlag=='1'?1:0\" :count=\"1\" @click=\"clickStar(item)\" style=\"cursor: pointer\" disabled />\n        </template>\n\n        <a-list-item-meta>\n          <template #description>\n            <div v-if=\"isFormComment(item)\" style=\"background: #f7f7f7;color: #555;padding: 2px 5px;white-space:nowrap;overflow: hidden\">\n              <div v-html=\"getHtml(item.msgContent)\"></div>\n            </div>\n            <div>\n              {{item.createTime}}\n            </div>\n          </template>\n\n          <template #title>\n            <div style=\"position: relative\">\n           <!--   <span style=\"display: inline-block; position: absolute; left: -16px\">\n                <exclamation-outlined v-if=\"noRead(item)\" title=\"未读消息\" style=\"color: red\" />\n              </span>-->\n\n              <span>{{ getMsgCategory(item) }}</span>\n              <span v-if=\"item.busType == 'bpm' || item.busType == 'bpm_cc' || item.busType == 'msg_node' || item.busType == 'bpm_msg_node'\" class=\"bpm-cuiban-content\" v-html=\"item.msgContent\">\n              </span>\n<!--              <a-tooltip v-else>-->\n<!--                <template #title>-->\n<!--                  <div v-html=\"item.msgContent\"></div>-->\n<!--                </template>-->\n<!--                {{ item.titile }}-->\n<!--              </a-tooltip>-->\n              <span v-else>{{ item.titile }}</span>\n\n              <a @click=\"showMessageDetail(item)\" style=\"margin-left: 16px\">{{ getHrefText(item) }}</a>\n            </div>\n          </template>\n          <template #avatar>\n            <template v-if=\"item.busType=='email'\">\n              <a-badge dot v-if=\"noRead(item)\" class=\"msg-no-read\">\n                <a-avatar style=\"background: #79919d\"><mail-outlined style=\"font-size: 16px\" title=\"未读消息\"/></a-avatar>\n              </a-badge>\n              <a-avatar v-else style=\"background: #79919d\"><mail-outlined style=\"font-size: 16px\"/></a-avatar>\n            </template>\n\n            <template v-else-if=\"item.busType=='bpm_task'\">\n              <a-badge dot v-if=\"noRead(item)\" class=\"msg-no-read\">\n                <a-avatar style=\"background: #79919d\"><interaction-outlined style=\"font-size: 16px\" title=\"未读消息\"/></a-avatar>\n              </a-badge>\n              <a-avatar v-else style=\"background: #79919d\"><interaction-outlined style=\"font-size: 16px\"/></a-avatar>\n            </template>\n\n            <template v-else-if=\"item.busType=='bpm'\">\n              <a-badge dot v-if=\"noRead(item)\" class=\"msg-no-read\">\n                <a-avatar style=\"background: #79919d\"><alert-outlined style=\"font-size: 16px\" title=\"未读消息\"/></a-avatar>\n              </a-badge>\n              <a-avatar v-else style=\"background: #79919d\"><alert-outlined style=\"font-size: 16px\"/></a-avatar>\n            </template>\n\n            <template v-else-if=\"['eoa_co_remind', 'eoa_co_notify'].includes(item.busType)\">\n              <a-badge dot v-if=\"noRead(item)\" class=\"msg-no-read\">\n                <a-avatar style=\"background: #79919d\"><GatewayOutlined style=\"font-size: 16px\" title=\"未读消息\"/></a-avatar>\n              </a-badge>\n              <a-avatar v-else style=\"background: #79919d\"><GatewayOutlined style=\"font-size: 16px\"/></a-avatar>\n            </template>\n\n            <template v-else-if=\"['eoa_sup_remind', 'eoa_sup_notify'].includes(item.busType)\">\n              <a-badge dot v-if=\"noRead(item)\" class=\"msg-no-read\">\n                <a-avatar style=\"background: #79919d\"><AlertOutlined style=\"font-size: 16px\" title=\"未读消息\"/></a-avatar>\n              </a-badge>\n              <a-avatar v-else style=\"background: #79919d\"><AlertOutlined style=\"font-size: 16px\"/></a-avatar>\n            </template>\n\n            <template v-else>\n              <a-badge dot v-if=\"noRead(item)\" class=\"msg-no-read\">\n                <a-avatar style=\"background: #79919d\"><bell-filled style=\"font-size: 16px\" title=\"未读消息\"/></a-avatar>\n              </a-badge>\n              <a-avatar v-else style=\"background: #79919d\"><bell-filled style=\"font-size: 16px\" /></a-avatar>\n            </template>\n          </template>\n        </a-list-item-meta>\n      </a-list-item>\n    </template>\n  </a-list>\n\n  <keep-alive>\n    <component v-if=\"currentModal\" v-bind=\"bindParams\" :key=\"currentModal\" :is=\"currentModal\" @register=\"modalRegCache[currentModal].register\" />\n  </keep-alive>\n</template>\n\n<script>\n\n  import { FilterOutlined, CloseOutlined, BellFilled, ExclamationOutlined, MailOutlined,InteractionOutlined, AlertOutlined, GatewayOutlined } from '@ant-design/icons-vue';\n  import { useSysMessage, useMessageHref } from './useSysMessage';\n  import {getGloablEmojiIndex, useEmojiHtml} from \"/@/components/jeecg/comment/useComment\";\n  import { ref, h, watch } from \"vue\";\n\n  export default {\n    name: 'SysMessageList',\n    components: {\n      FilterOutlined,\n      CloseOutlined,\n      BellFilled,\n      ExclamationOutlined,\n      MailOutlined,\n      InteractionOutlined,\n      AlertOutlined,\n      GatewayOutlined,\n    },\n    props:{\n      star: {\n        type:Boolean,\n        default: false\n      },\n      isLowApp:{\n        type:Boolean,\n        default: false\n      },\n      messageCount: {\n        type: Number,\n        default: 0\n      },\n      cancelStarAfterDel: {\n        type: Boolean,\n        default: false,\n      },\n    },\n    emits:['close', 'detail', 'clear', 'close-modal'],\n    setup(props, {emit}){\n      const { messageList,loadEndStatus,loadingMoreStatus,onLoadMore,noRead, getMsgCategory, getHrefText, searchParams, reset, loadData, updateStarMessage } = useSysMessage(setLocaleText);\n\n      //系统消息\n      const messageCount = ref(0);\n\n      function reload(params){\n        let { fromUser, rangeDateKey, rangeDate, noticeType } = params;\n        searchParams.fromUser = fromUser||'';\n        searchParams.rangeDateKey = rangeDateKey||'';\n        searchParams.rangeDate = rangeDate||[];\n        searchParams.noticeType = noticeType || '';\n        //list列表为空时赋初始值\n        locale.value = { locale: { emptyText: `<a-empty />` }};\n        if(props.star===true){\n          searchParams.starFlag = '1'\n        }else{\n          searchParams.starFlag = ''\n        }\n        reset();\n        loadData();\n      }\n\n      function clickStar(item){\n        console.log(item)\n        updateStarMessage(item);\n        // 代码逻辑说明: 【TV360X-349】通知-标星消息tab列表取消标星后，该条信息从标星列表移除\n        if (item.starFlag == '1' && props.cancelStarAfterDel) {\n          const findIndex = messageList.value.findIndex((item) => item.id === item.id);\n          if (findIndex !== -1) {\n            messageList.value.splice(findIndex, 1);\n            return;\n          }\n        }\n        if(item.starFlag=='1'){\n          item.starFlag = '0'\n        }else{\n          item.starFlag = '1'\n        }\n      }\n\n      // 代码逻辑说明: QQYUN-4744【系统通知】6、系统通知@人后，对方看不到是哪个表单@的，没有超链接\n      const { goPage, currentModal, modalRegCache, bindParams, isFormComment } = useMessageHref(emit, props);\n      //const emojiIndex = inject('$globalEmojiIndex')\n      const emojiIndex = getGloablEmojiIndex()\n      const { getHtml } = useEmojiHtml(emojiIndex);\n\n      function showMessageDetail(record){\n        record.readFlag = '1'\n        goPage(record);\n        emit('close', record.id)\n        // 代码逻辑说明: 【TV360X-791】收到邮件通知，点击回复，应该把通知公告列表关闭---\n        if(record.busType==='email'){\n          emit('close-modal')\n        // 代码逻辑说明: 【JHHB-224】【我的消息】点击去处理后应该关闭弹窗---\n        } else if(['bpm', 'bpm_task', 'tenant_invite'].includes(record.busType)){\n          //判断是否是查看详情\n          if (record.msgAbstract) {\n            try {\n              const json = JSON.parse(record.msgAbstract);\n              //查看详情，非去处理\n              if (json.taskDetail) {\n                return;\n              }\n            } catch (e) {\n              console.error('getHrefText:msgAbstract参数不是JSON格式', record.msgAbstract);\n            }\n          }\n          emit('close-modal');\n        } else if (['eoa_co_notify', 'eoa_co_remind', 'eoa_sup_notify', 'eoa_sup_remind'].includes(record.busType)) {\n          emit('close-modal');\n        }\n      }\n\n      //返回list列表为空数据时展示的内容\n      const locale = ref({});\n\n      /**\n       * 未读点击事件\n       */\n      function noReadClick() {\n        emit('clear')\n      }\n\n      /**\n       * 设置list为空的时候提示文本\n       *\n       */\n      function setLocaleText() {\n        // 代码逻辑说明: 【QQYUN-9105】未读有问题---\n        let rangeDateKey = searchParams.rangeDateKey;\n        let value = messageCount.value;\n        if (value > 0 && !props.star && rangeDateKey && rangeDateKey === '7day') {\n          locale.value = {\n            emptyText: h(\n                'span',\n                {\n                  style: {'color': 'rgb(255,154,0)', 'cursor': 'pointer', 'text-align': 'left', 'display': 'block'},\n                  onClick: () => {\n                    noReadClick();\n                  },\n                }, `还剩余未读消息(${value > 99 ? '99+' : value})`)\n          }\n        } else {\n          locale.value = { locale: {emptyText: `<a-empty />` }};\n        }\n      }\n\n      //监听信息数量\n      watch(() => props.messageCount, (value) => {\n        messageCount.value = value;\n      }, { immediate: true })\n\n      return {\n        messageList,\n        loadEndStatus,\n        loadingMoreStatus,\n        onLoadMore,\n        noRead,\n        getMsgCategory,\n        getHrefText,\n        reload,\n        clickStar,\n        showMessageDetail,\n        isFormComment,\n        getHtml,\n        modalRegCache,\n        currentModal,\n        bindParams,\n        locale,\n      };\n    },\n  };\n</script>\n\n<style scoped lang=\"less\">\n   .msg-no-read{\n     :deep(.ant-badge-dot){\n      top: 5px;\n      right: 3px;\n    }\n  }\n   :deep(.bpm-cuiban-content) p{\n    display: inherit;\n     margin-bottom: 0;\n     margin-top: 0;\n   }\n\n   /** QQYUN-5688 【样式】鼠标放上去怎么不是手 */\n   :deep(.ant-rate-disabled){\n     .ant-rate-star{\n       cursor: pointer !important;\n     }\n   }\n   .antd-rate{\n     :deep(.ant-rate-star-first),\n     :deep(.ant-rate-star-second) {\n       color: #dddddd;\n     }\n     :deep(.ant-rate-star-full .ant-rate-star-second){\n       color: #fadb14 !important;\n     }\n   }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/message/components/SysMessageModal.vue",
    "content": "<template>\n  <BasicModal\n    :canFullscreen=\"false\"\n    :draggable=\"false\"\n    :closable=\"false\"\n    @register=\"registerModal\"\n    wrapClassName=\"sys-msg-modal\"\n    :width=\"800\"\n    :footer=\"null\"\n    destroyOnClose\n  >\n    <template #title>\n      <div class=\"sys-msg-modal-title\">\n        <div class=\"title\"></div>\n        <div class=\"ant-tabs-nav-wrap\">\n          <div class=\"ant-tabs-nav-scroll\">\n            <div class=\"ant-tabs-nav ant-tabs-nav-animated\">\n              <div>\n                <div\n                  @click=\"(e) => handleChangeTab(e, 'all')\"\n                  role=\"tab\"\n                  aria-disabled=\"false\"\n                  aria-selected=\"false\"\n                  class=\"ant-tabs-tab\"\n                  :class=\"{ 'ant-tabs-tab-active': activeKey == 'all' }\"\n                >\n                  全部消息\n                </div>\n                <div\n                  @click=\"(e) => handleChangeTab(e, 'star')\"\n                  role=\"tab\"\n                  aria-disabled=\"false\"\n                  aria-selected=\"true\"\n                  class=\"ant-tabs-tab\"\n                  :class=\"{ 'ant-tabs-tab-active': activeKey == 'star' }\"\n                >\n                  标星消息\n                </div>\n              </div>\n              <div\n                class=\"ant-tabs-ink-bar ant-tabs-ink-bar-animated\"\n                :style=\"{\n                  transform: activeKey == 'all' ? 'translate3d(130px, 0px, 0px)' : 'translate3d(215px, 0px, 0px)',\n                  display: 'block',\n                  width: '88px',\n                  height: '1px'\n                }\"\n              ></div>\n            </div>\n          </div>\n        </div>\n\n        <!-- 头部图标 -->\n        <div class=\"icon-right\">\n          <div class=\"icons\">\n            <a-popover placement=\"bottomRight\" :overlayStyle=\"{ width: '400px' }\" trigger=\"click\" v-model:open=\"showSearch\">\n              <template #content>\n                <div>\n                  <span class=\"search-label\">回复、提到我的人?：</span>\n                  <span style=\"display: inline-block;\">\n                    <div v-if=\"searchParams.fromUser\" class=\"selected-user\">\n                      <span>{{searchParams.realname}}</span>\n                      <span class=\"clear-user-icon\"><close-outlined style=\"font-size: 12px\" @click=\"clearSearchParamsUser\"/></span>\n                    </div>\n                    <a-button v-else type=\"dashed\" shape=\"circle\" @click=\"openSelectPerson\">\n                      <plus-outlined />\n                    </a-button>\n\n                  </span>\n                </div>\n                <div class=\"search-date\">\n                  <div class=\"date-label\">时间：</div>\n                  <div class=\"date-tags\">\n                    <div class=\"tags-container\">\n                      <div v-for=\"item in dateTags\" :class=\"item.active == true ? 'tag active' : 'tag'\" @click=\"handleClickDateTag(item)\">{{\n                        item.text\n                      }}</div>\n                    </div>\n                    <div class=\"cust-range-date\" v-if=\"showRangeDate\">\n                      <a-range-picker v-model:value=\"searchRangeDate\" @change=\"handleChangeSearchDate\" />\n                    </div>\n                  </div>\n                </div>\n\n                <div class=\"search-date\">\n                  <div class=\"date-label\">类型：</div>\n                  <div class=\"date-tags\">\n                    <div class=\"tags-container\">\n                      <div v-for=\"item in noticeTypeOption\" :class=\"item.active == true ? 'tag active flex' : 'tag flex'\" @click=\"handleClickNoticeType(item)\">\n                        <img class=\"notice-type-img\" v-if=\"item.img\" :src=\"item.img\" />\n                        {{ item.text }}\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              </template>\n\n              <span v-if=\"conditionStr\" class=\"anticon filtera\">\n                <img v-if=\"noticeImg\" :src=\"noticeImg\" class=\"notice-type-header-img\">\n                <filter-outlined v-else/>\n                <span style=\"font-size:12px;margin-left: 3px;position: relative;\">{{conditionStr}}</span>\n                <span style=\"display: flex;margin:0 5px;\">\n                  <svg @click=\"clearAll\" t=\"1715689724802\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"10694\" width=\"14\" height=\"14\"><path d=\"M624.593455 23.272727a93.090909 93.090909 0 0 1 93.090909 93.090909v168.587637l143.406545 0.023272a116.363636 116.363636 0 0 1 116.247273 111.313455l0.116363 5.050182V861.090909a116.363636 116.363636 0 0 1-116.363636 116.363636H162.909091a116.363636 116.363636 0 0 1-116.363636-116.363636V401.338182a116.363636 116.363636 0 0 1 116.363636-116.363637l146.664727-0.023272V116.363636a93.090909 93.090909 0 0 1 88.459637-92.974545l4.654545-0.116364zM139.636364 581.818182v279.272727a23.272727 23.272727 0 0 0 23.272727 23.272727h302.545454v-162.909091a46.545455 46.545455 0 1 1 93.09091 0v162.909091h93.090909v-162.909091a46.545455 46.545455 0 1 1 93.090909 0v162.909091h116.363636a23.272727 23.272727 0 0 0 23.272727-23.272727V581.818182H139.636364z m0-93.090909h744.727272v-87.389091a23.272727 23.272727 0 0 0-23.272727-23.272727h-166.679273a69.818182 69.818182 0 0 1-69.818181-69.818182V116.363636h-221.905455v191.883637a69.818182 69.818182 0 0 1-69.818182 69.818182H162.909091a23.272727 23.272727 0 0 0-23.272727 23.272727V488.727273z\" fill=\"currentColor\" p-id=\"10695\"></path></svg>\n                </span>\n              </span>\n              <div v-else style=\"align-content: center;\">\n                 <img v-if=\"noticeImg\" :src=\"noticeImg\" class=\"notice-type-header-img\" style=\"position: relative;top: -2px\">\n                 <filter-outlined v-else />\n              </div>\n            </a-popover>\n            <close-outlined @click=\"closeModal\" />\n          </div>\n        </div>\n      </div>\n    </template>\n\n    <div class=\"sys-message-card\">\n      <a-tabs :activeKey=\"activeKey\" center @tabClick=\"handleChangePanel\" animated>\n        <template #renderTabBar>\n          <div></div>\n        </template>\n\n        <a-tab-pane tab=\"全部消息\" key=\"all\" forceRender>\n          <sys-message-list :isLowApp=\"isLowApp\" ref=\"allMessageRef\" @close=\"hrefThenClose\" @detail=\"showDetailModal\" @clear=\"clearAll\" :messageCount=\"messageCount\" @closeModal=\"closeModal\"/>\n        </a-tab-pane>\n\n        <!-- 标星 -->\n        <a-tab-pane tab=\"标星消息\" key=\"star\" forceRender>\n          <sys-message-list :isLowApp=\"isLowApp\" ref=\"starMessageRef\" star @close=\"hrefThenClose\" @detail=\"showDetailModal\" @clear=\"clearAll\" :messageCount=\"messageCount\" @closeModal=\"closeModal\" :cancelStarAfterDel=\"true\"/>\n        </a-tab-pane>\n      </a-tabs>\n    </div>\n  </BasicModal>\n\n  <user-select-modal isRadioSelection :showButton=\"false\" labelKey=\"realname\" rowKey=\"username\" @register=\"regModal\" @getSelectResult=\"getSelectedUser\"></user-select-modal>\n\n  <DetailModal @register=\"registerDetail\" :zIndex=\"1001\"/>\n</template>\n\n<script>\n  import { BasicModal, useModalInner, useModal } from '/@/components/Modal';\n  import { FilterOutlined, CloseOutlined, BellFilled, ExclamationOutlined, PlusOutlined } from '@ant-design/icons-vue';\n  import JSelectUser from '/@/components/Form/src/jeecg/components/JSelectUser.vue';\n  import { ref, unref, reactive, computed } from 'vue';\n  // import SysMessageList from './SysMessageList.vue'\n  import UserSelectModal from '/@/components/Form/src/jeecg/components/modal/UserSelectModal.vue'\n  import DetailModal from '/@/views/monitor/mynews/DetailModal.vue';\n  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n  import calendar from '/@/assets/icons/calendarNotice.png';\n  import folder from '/@/assets/icons/folderNotice.png';\n  import system from '/@/assets/icons/systemNotice.png';\n  import flow from '/@/assets/icons/flowNotice.png';\n  import collaboration from '/@/assets/icons/collaborationNotice.png';\n  import superviseNotice from '/@/assets/icons/superviseNotice.png';\n  export default {\n    name: 'SysMessageModal',\n    components: {\n      BasicModal,\n      FilterOutlined,\n      CloseOutlined,\n      BellFilled,\n      ExclamationOutlined,\n      JSelectUser,\n      // 代码逻辑说明: 【QQYUN-8241】emoji-mart-vue-fast库异步加载\n      SysMessageList: createAsyncComponent(() => import('./SysMessageList.vue')),\n      // SysMessageList,\n      UserSelectModal,\n      PlusOutlined,\n      DetailModal\n    },\n    props:{\n      messageCount: {\n        type: Number,\n        default: 0\n      }\n    },\n    emits:['register', 'refresh'],\n    setup(_p, {emit}) {\n      const allMessageRef = ref();\n      const starMessageRef = ref();\n      const activeKey = ref('all');\n      //通知类型\n      const noticeType = ref('');\n      //通知类型数组\n      const noticeTypeOption = reactive([\n        { key: 'system', text: '系统通知', active: false, img: system },\n        { key: 'flow', text: '流程通知', active: false, img: flow },\n        { key: 'plan', text: '日程通知', active: false, img: calendar },\n        { key: 'file', text: '知识通知', active: false, img: folder },\n      ]);\n      const noticeImg = ref('');\n      function handleChangeTab(e, key) {\n        activeKey.value = key;\n        loadData();\n      }\n      function handleChangePanel(key) {\n        activeKey.value = key;\n      }\n\n      // 查询区域存储值\n      const searchParams = reactive({\n        fromUser: '',\n        realname: '',\n        rangeDateKey: '7day',\n        rangeDate: [],\n      });\n\n      function loadData(){\n        let params = {\n          fromUser: searchParams.fromUser,\n          rangeDateKey: searchParams.rangeDateKey,\n          rangeDate: searchParams.rangeDate,\n          noticeType: noticeType.value ? noticeType.value:''\n        }\n        if(activeKey.value == 'all'){\n          getRefPromise(allMessageRef).then(() => {\n            allMessageRef.value.reload(params);\n          });\n        }else{\n          starMessageRef.value.reload(params);\n        }\n      }\n\n      const isLowApp = ref(false);\n      //useModalInner\n      const [registerModal, { closeModal }] = useModalInner(async (data) => {\n        showSearch.value = false\n        if(data.noticeType){\n          noticeType.value = data.noticeType;\n          // 代码逻辑说明: 【QQYUN-12998】点击完聊天的系统图标，再点击系统上面的铃铛就不出数据了---\n          for (const item of noticeTypeOption) {\n            if(item.key === data.noticeType){\n              item.active = true;\n              noticeImg.value = item.img;\n            }else{\n              item.active = false;\n            }\n          }\n          delete data.noticeType;\n        }\n        //每次弹窗打开 加载最新的数据\n        loadData();\n        if(data){\n          isLowApp.value = data.isLowApp||false\n        }else{\n          isLowApp.value = false;\n        }\n      });\n\n      const showSearch = ref(false);\n\n      function handleChangeSearchPerson(value, a) {\n        console.log('选择改变', value, a);\n        showSearch.value = true;\n      }\n\n      const dateTags = reactive([\n        { key: 'jt', text: '今天', active: false },\n        { key: 'zt', text: '昨天', active: false },\n        { key: 'qt', text: '前天', active: false },\n        { key: 'bz', text: '本周', active: false },\n        { key: 'sz', text: '上周', active: false },\n        { key: 'by', text: '本月', active: false },\n        { key: 'sy', text: '上月', active: false },\n        { key: '7day', text: '七日', active: true },\n        { key: 'zdy', text: '自定义', active: false },\n      ]);\n      function handleClickDateTag(item) {\n        for (let a of dateTags) {\n          if(a.key != item.key){\n            a.active = false;\n          }\n        }\n        item.active = !item.active;\n        if(item.active == false){\n          searchParams.rangeDateKey = ''\n        }else{\n          searchParams.rangeDateKey = item.key;\n        }\n        if (item.key == 'zdy') {\n          // 自定义日期查询走的是 handleChangeSearchDate\n          if(item.active == false){\n            searchParams.rangeDate = []\n            loadData();\n          }\n        }else{\n          loadData();\n        }\n      }\n      const showRangeDate = computed(() => {\n        let temp = dateTags.filter((i) => i.active == true);\n        if (temp && temp.length > 0) {\n          if (temp[0].text == '自定义') {\n            return true;\n          }\n        }\n        return false;\n      });\n      const searchRangeDate = ref([]);\n      function handleChangeSearchDate(_value, dateStringArray) {\n        searchParams.rangeDate = [...dateStringArray]\n        loadData();\n      }\n\n      function hrefThenClose(id){\n        emit('refresh', id)\n       // closeModal();\n      }\n\n      // 有查询条件值的时候显示该字符串\n      const conditionStr = computed(()=>{\n        const { fromUser, rangeDateKey, realname } = searchParams;\n        if(!fromUser && !rangeDateKey){\n          return ''\n        }\n        let arr = [];\n        if(fromUser){\n          arr.push(realname)\n        }\n        if(rangeDateKey){\n          let rangDates = dateTags.filter(item=>item.key == rangeDateKey);\n          if(rangDates && rangDates.length>0){\n            arr.push(rangDates[0].text)\n          }\n        }\n        return arr.join('、')\n      });\n\n      //注册model\n      const [regModal, { openModal }] = useModal();\n\n      function getSelectedUser(options, value){\n        if(options && options.length>0){\n          searchParams.fromUser = value\n          searchParams.realname = options[0].label;\n        }\n      }\n      \n      function openSelectPerson(){\n        openModal(true, {})\n      }\n\n      function clearSearchParamsUser(){\n        searchParams.fromUser = ''\n        searchParams.realname = ''\n      }\n\n      function clearAll(){\n        searchParams.fromUser='';\n        searchParams.realname='';\n        searchParams.rangeDateKey='';\n        searchParams.rangeDate=[];\n        for (let a of dateTags) {\n          a.active = false;\n        }\n        noticeType.value = \"\";\n        noticeImg.value = \"\";\n        for (const item of noticeTypeOption) {\n          item.active = false;\n        }\n        loadData();\n      }\n\n      function getRefPromise(componentRef) {\n        return new Promise((resolve) => {\n          (function next() {\n            let ref = componentRef.value;\n            if (ref) {\n              resolve(ref);\n            } else {\n              setTimeout(() => {\n                next();\n              }, 100);\n            }\n          })();\n        });\n      }\n      const [registerDetail, { openModal: openDetailModal }] = useModal();\n      function showDetailModal(record){\n        openDetailModal(true, {record: unref(record), isUpdate: true})\n      }\n\n      function handleDetailColse(){\n        loadData();\n      }\n\n      /**\n       * 只是通知\n       * @param item\n       */\n      function handleClickNoticeType(item) {\n        for (let a of noticeTypeOption) {\n          if(a.key !== item.key){\n            a.active = false;\n          }\n        }\n        item.active = !item.active;\n        if(item.active === false){\n          noticeType.value = \"\";\n          noticeImg.value = \"\";\n        }else{\n          noticeType.value = item.key;\n          noticeImg.value = item.img;\n        }\n        loadData();\n      }\n      \n      return {\n        conditionStr,\n        regModal,\n        getSelectedUser,\n        openSelectPerson,\n        clearSearchParamsUser,\n        clearAll,\n\n        registerModal,\n        activeKey,\n        handleChangePanel,\n        handleChangeTab,\n\n        showSearch,\n        searchParams,\n        handleChangeSearchPerson,\n        dateTags,\n        handleClickDateTag,\n        showRangeDate,\n        searchRangeDate,\n        handleChangeSearchDate,\n        closeModal,\n        hrefThenClose,\n\n        allMessageRef,\n        starMessageRef,\n        registerDetail,\n        showDetailModal,\n        isLowApp,\n        handleDetailColse,\n        noticeTypeOption,\n        handleClickNoticeType,\n        noticeImg,\n      };\n    },\n  };\n</script>\n\n<style lang=\"less\">\n\n  @keyframes move22{\n    0%{ transform:translateY(0px); }\n    100%{transform:translateY(600px);}\n  }\n\n\n  .sys-msg-modal {\n    .ant-modal-header {\n      padding-bottom: 0;\n      padding-top: 6px;\n      padding-right: 12px;\n    }\n    .ant-modal-body {\n      height: 550px;\n      overflow-y: auto;\n    }\n    .ant-modal {\n      position: absolute;\n      right: 10px;\n      top: calc(100% - 600px);\n/*      animation-name: move22;\n      animation-duration:0.8s;\n      animation-timing-function:ease;*/\n    }\n  }\n  .sys-msg-modal-title {\n    .title {\n      display: inline-block;\n      width: 120px;\n    }\n    .icon-right {\n      display: inline-block;\n      width: 220px;\n      vertical-align: top;\n\n      .icons {\n        display: flex;\n        height: 100%;\n        flex-direction: row;\n        justify-content: flex-end;\n\n        > span.anticon {\n          padding: 10px;\n          display: inline-block;\n          cursor: pointer;\n        }\n\n        > span.filtera{\n          //background-color: #d3eafd;\n          background-color: #eff1f2;\n          border-radius: 4px;\n          cursor: pointer;\n          height: 27px;\n          padding-top: 7px;\n          margin-top: 3px;\n          line-height: 25px;\n          //color: #2196f3;\n          display: flex;\n\n          >span.anticon{\n            height: auto;\n            line-height: 9px;\n            display: inline-block;\n          }\n        }\n\n\n      }\n    }\n    .ant-tabs-nav-wrap {\n      display: inline-block;\n      width: calc(100% - 340px);\n      .ant-tabs-tab {\n        position: relative;\n        display: inline-flex;\n        align-items: center;\n        padding: 12px 0;\n        font-size: 14px;\n        background: transparent;\n        border: 0;\n        outline: none;\n        cursor: pointer;\n      }\n      .ant-tabs-tab {\n        position: relative;\n        display: inline-flex;\n        align-items: center;\n        padding: 12px 0;\n        font-size: 14px;\n        background: transparent;\n        border: 0;\n        outline: none;\n        cursor: pointer;\n      }\n      .ant-tabs-tab+.ant-tabs-tab {\n         margin: 0 0 0 32px;\n      }\n      .ant-tabs-ink-bar {\n        background: @primary-color;\n      }\n    }\n    .ant-tabs-nav-scroll {\n      text-align: center;\n      font-size: 14px;\n      font-weight: normal;\n    }\n  }\n\n  .sys-message-card {\n  }\n\n  .search-label {\n    font-weight: 500;\n    font-size: 14px !important;\n    color: #757575 !important;\n    display: inline-block;\n    margin-right: 15px !important;\n  }\n  .search-date {\n    display: flex;\n    min-width: 0;\n    margin-top: 15px;\n    .date-label {\n      margin-top: 4px;\n      font-weight: 500;\n      font-size: 14px !important;\n      color: #757575 !important;\n      margin-right: 15px !important;\n    }\n\n    .date-tags {\n      display: -ms-flexbox;\n      display: flex;\n      display: -webkit-flex;\n      -ms-flex-direction: column;\n      -webkit-flex-direction: column;\n      flex-direction: column;\n      -webkit-flex: 1;\n      flex: 1;\n      -ms-flex: 1;\n      .tags-container {\n        display: flex;\n        min-width: 0;\n        -webkit-flex: 1;\n        flex: 1;\n        -ms-flex: 1;\n        flex-wrap: wrap;\n        .tag {\n          background-color: #f5f5f5;\n          border-radius: 17px;\n          font-size: 13px;\n          margin-bottom: 10px;\n          margin-right: 10px;\n          padding: 6px 12px;\n          cursor: pointer;\n          &.active {\n            background-color: #d3eafd !important;\n          }\n        }\n      }\n    }\n  }\n\n  .selected-user{\n    background: #f5f5f5;\n    padding: 2px 14px;\n    border-radius: 30px;\n    .clear-user-icon{\n      margin-left: 5px;\n    }\n  }\n</style>\n<style lang=\"less\" scoped>\n  .notice-type-img{\n      width: 16px;\n      height: 16px;\n      position: relative;\n      top: 2px;\n      margin-right: 1px;\n  }\n  .notice-type-header-img{\n    width: 16px;\n    height: 16px;\n    position: relative;\n    left: 2px;\n    top: 1px;\n  }\n  .flex{\n    display: flex;\n    flex: unset;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/message/components/useSysMessage.ts",
    "content": "import { ref, reactive, nextTick } from 'vue';\nimport { defHttp } from '/@/utils/http/axios';\nimport { getDictItemsByCode } from '/@/utils/dict/index';\nimport { useRouter, useRoute } from 'vue-router'\nimport { useAppStore } from '/@/store/modules/app';\nimport { useTabs } from '/@/hooks/web/useTabs';\nimport { useModal } from '/@/components/Modal';\nimport {useMessage} from \"/@/hooks/web/useMessage\";\n\n/**\n * 列表接口\n * @param params\n */\nconst queryMessageList = (params) => {\n  const url = '/sys/annountCement/vue3List';\n  return defHttp.get({ url, params });\n};\n\n/**\n * 获取消息列表数据\n *\n * setLocaleText 设置未读消息\n */\nexport function useSysMessage(setLocaleText) {\n  const { createMessage } = useMessage();\n  const rangeDateArray = getDictItemsByCode('rangeDate');\n  console.log('+++++++++++++++++++++');\n  console.log('rangeDateArray', rangeDateArray);\n  console.log('+++++++++++++++++++++');\n\n  const messageList = ref<any[]>([]);\n  const pageNo = ref(1)\n  let pageSize = 10;\n\n  const searchParams = reactive({\n    fromUser: '',\n    rangeDateKey: '',\n    rangeDate: [],\n    starFlag: '',\n    noticeType: ''\n  });\n\n\n  function getQueryParams() {\n    let { fromUser, rangeDateKey, rangeDate, starFlag, noticeType } = searchParams;\n    let params = {\n      fromUser,\n      starFlag,\n      rangeDateKey,\n      beginDate: '',\n      endDate: '',\n      pageNo: pageNo.value,\n      pageSize,\n      noticeType\n    };\n    if (rangeDateKey == 'zdy') {\n      params.beginDate = rangeDate[0]+' 00:00:00';\n      params.endDate = rangeDate[1]+' 23:59:59';\n    }\n    return params;\n  }\n\n  // 数据是否加载完了\n  const loadEndStatus = ref(false);\n\n  //请求数据\n  async function loadData() {\n    if(loadEndStatus.value === true){\n      return;\n    }\n    let params = getQueryParams();\n    const data = await queryMessageList(params);\n    console.log('获取结果', data);\n    if(!data || data.length<=0){\n      loadEndStatus.value = true;\n      setLocaleText();\n      return;\n    }\n    if(data.length<pageSize){\n      loadEndStatus.value = true;\n    }\n    pageNo.value = pageNo.value+1\n    let temp:any[] = messageList.value;\n    temp.push(...data);\n    messageList.value = temp;\n    setLocaleText();\n  }\n\n  //重置\n  function reset(){\n    messageList.value = []\n    pageNo.value = 1;\n    loadEndStatus.value = false;\n  }\n\n  //标星\n  async function updateStarMessage(item){\n    const url = '/sys/sysAnnouncementSend/edit';\n    let starFlag = '1';\n    if(item.starFlag==starFlag){\n      starFlag = '0'\n    }\n    const params = {\n      starFlag,\n      id: item.sendId\n    }\n    // 代码逻辑说明: QQYUN-4491【应用】一些小问题  4、标星不需要提示吧\n    const data:any = await defHttp.put({url, params}, {isTransformResponse: false});\n    if(data.success === true){\n    }else{\n      createMessage.warning(data.message)\n    }\n  }\n\n\n  const loadingMoreStatus = ref(false);\n  async function onLoadMore() {\n    loadingMoreStatus.value = true;\n    await loadData();\n    loadingMoreStatus.value = false;\n  }\n\n  function noRead(item) {\n    if (item.readFlag === '1') {\n      return false;\n    }\n    return true;\n  }\n\n  // 消息类型\n  function getMsgCategory(item) {\n    if(item.busType=='email'){\n      return '邮件提醒:';\n    } else if(item.busType=='bpm'){\n      return '流程催办:';\n    } else if(item.busType=='bpm_cc'){\n      return '流程抄送:';\n    }else if(item.busType=='bpm_task'){\n      return '流程任务:';\n    } else if (item.busType == 'eoa_co_remind') {\n      return '协同催办:';\n    } else if (item.busType == 'eoa_co_notify') {\n      return '协同提醒:';\n    } else if (item.busType == 'eoa_sup_remind') {\n      return '督办催办:';\n    } else if (item.busType == 'eoa_sup_notify') {\n      return '督办提醒:';\n    } else if (item.msgCategory == '2') {\n      return '系统消息:';\n    } else if (item.msgCategory == '1') {\n      return '通知公告:';\n    }\n    return '';\n  }\n\n  // QQYUN-4472 来消息了没有提醒--查看详情改为去处理\n  function getHrefText(item) {\n    if(item.busType === 'bpm'|| item.busType === 'bpm_task' || item.busType === 'tenant_invite'){\n      //判断是否是查看详情\n      if (item.msgAbstract) {\n        try {\n          const json = JSON.parse(item.msgAbstract);\n          if (json.taskDetail) {\n            return '查看详情';\n          }\n        } catch (e) {\n          console.error('getHrefText:msgAbstract参数不是JSON格式', item.msgAbstract);\n        }\n      }\n      return '去处理'\n    } else if (['eoa_co_notify', 'eoa_co_remind', 'eoa_sup_notify', 'eoa_sup_remind'].includes(item.busType)) {\n      // 代码逻辑说明: 【JHHB-133】消息列表打开协同工作\n      return '去处理';\n    } else {\n      return '查看详情'\n    }\n  }\n\n  return {\n    messageList,\n    reset,\n    loadData,\n    loadEndStatus,\n    searchParams,\n    updateStarMessage,\n    onLoadMore,\n    noRead,\n    getMsgCategory,\n    getHrefText\n\n  };\n}\n\n/**\n * 用于消息跳转\n */\nexport function useMessageHref(emit, props){\n  //const [registerHistoryModal, { openModal: openHistoryModal }] = useModal();\n  //const [registerTaskModal, { openModal: openTaskModal }] = useModal();\n  // 注册表单弹窗\n  //const [registerDesignFormModal, { openModal: openDesignFormModal }] = useModal();\n  let messageHrefArray: any[] = getDictItemsByCode('messageHref');\n  // 代码逻辑说明: 【JHHB-133】消息列表打开协同工作\n  messageHrefArray = [\n    ...messageHrefArray,\n    { value: 'eoa_co_remind', text: '/collaboration/pending', url: '/collaboration/launch' },\n    { value: 'eoa_co_notify', text: '/collaboration/pending', url: '/collaboration/launch' },\n    { value: 'eoa_sup_notify', text: '/superviser/pending' },\n    { value: 'eoa_sup_remind', text: '/superviser/pending' },\n  ];\n  const router = useRouter();\n  const appStore = useAppStore();\n  const rt = useRoute();\n  const { close: closeTab, closeSameRoute } = useTabs();\n\n  //*********************************[QQYUN-6713]系统通知打开弹窗修改，动态设置弹窗begin******************************************\n  //当前表单弹窗\n  const currentModal = ref<string | null>(null);\n  //当前表单参数\n  const modalParams = ref<Recordable>({});\n  //表单注册缓存\n  const modalRegCache = ref<Recordable>({});\n  //组件绑定参数\n  const bindParams = ref<Recordable>({});\n\n  /**\n   * 根据类型打开不同弹窗\n   * @param type\n   * @param params\n   */\n  async function handleOpenType(type, params) {\n    currentModal.value = null;\n    modalParams.value = { ...params };\n    switch (type) {\n      case 'task':\n        //流程办理\n        bindParams.value = { actionType: 'todo' };\n        currentModal.value = 'ProcessTaskHandleModal';\n        break;\n      case 'history':\n        bindParams.value = {};\n        //历史流程\n        currentModal.value = 'MyTaskHandleModal';\n        break;\n      case 'design':\n        //表单设计\n        currentModal.value = 'DesformViewModal';\n        bindParams.value = {\n          showRecordCopy: false,\n          showRecordShare: false,\n          showRecordSysPrint: false,\n          showDesignFormBtn: false,\n        };\n        break;\n      case 'cgform':\n        //Online表单\n        currentModal.value = 'OnlineAutoModal';\n        bindParams.value = {\n          id: params.formId,\n        }\n        break;\n      default:\n        currentModal.value = null;\n        break;\n    }\n    //注册表单弹窗\n    initModalRegister();\n    await nextTick(() => {\n      if (modalRegCache.value[currentModal.value!]?.isRegister) {\n        console.log('已注冊，走缓存');\n        modalRegCache.value[currentModal.value!].modalMethods.openModal(true, modalParams.value);\n      }\n    });\n  }\n\n  /**\n   * 初始化弹窗注册\n   */\n  function initModalRegister() {\n    //如果当前选择表单为null，就不处理\n    if (!currentModal.value) {\n      return;\n    }\n    //判断缓存中是否存在，不存在就走缓存逻辑\n    if (!modalRegCache.value[currentModal.value]) {\n      const [registerModal, modalMethods] = useModal();\n      modalRegCache.value[currentModal.value] = {\n        isRegister: false,\n        register: bindRegisterModal(registerModal, modalMethods),\n        modalMethods,\n      };\n    }\n  }\n\n  /**\n   * 绑定注册弹窗\n   * @param regFn\n   * @param modalMethod\n   */\n  function bindRegisterModal(regFn, modalMethod) {\n    return async (...args) => {\n      console.log('开始注册：', currentModal.value);\n      await regFn(...args);\n      console.log('注册完成：', currentModal.value);\n      //打开弹窗\n      modalMethod.openModal(true, modalParams.value);\n      //设置缓存标识\n      modalRegCache.value[currentModal.value!].isRegister = true;\n    };\n  }\n  //*************************************[QQYUN-6713]系统通知打开弹窗修改，动态设置弹窗end*********************************************\n  // const defaultPath = '/monitor/mynews';\n  //const bpmPath = '/task/handle/'\n\n  async function goPage(record, openModalFun?){\n    if(!record.busType || record.busType == 'msg_node'){\n      if(!openModalFun){\n        // 从首页的消息通知跳转\n        await goPageFromOuter(record);\n      }else{\n        // 从消息页面列表点击详情查看 直接打开modal\n        openModalFun()\n      }\n      // 代码逻辑说明: QQYUN-4744【系统通知】6、系统通知@人后，对方看不到是哪个表单@的，没有超链接\n    }else if(record.busType == 'comment'){\n      // de\n      let msgAbstract = record.msgAbstract;\n      if(msgAbstract){\n        try {\n          let data = JSON.parse(msgAbstract.toString());\n          if(data.type == 'designForm'){\n            showDesignFormModal(data);\n          } else {\n            showOnlineCgformModal(data);\n          }\n        }catch (e) {\n          console.error('打开评论表单，但是msgAbstract参数不是JSON格式', msgAbstract)\n          if(openModalFun){\n            openModalFun();\n          }\n        }\n      }\n    }else if(record.busType == 'tenant_invite'){\n      if(props.isLowApp===true){\n        router.push({ name:\"myapps-settings-user\", query:{ page:'tenantSetting' }})\n      }else{\n        router.push({ name:\"system-usersetting\", query:{ page:'tenantSetting' }})\n      }\n    }else{\n      if(props && props.isLowApp===true){\n        openLowAppFlowModal(record)\n      }else{\n        await goPageWithBusType(record)\n      }\n    }\n/*    busId: \"1562035005173587970\"\n    busType: \"email\"\n    openPage: \"modules/eoa/email/modals/EoaEmailInForm\"\n    openType: \"component\"*/\n  }\n\n  /**\n   * 打开表单设计器 表单弹窗\n   * @param data\n   */\n  function showDesignFormModal(data) {\n    handleOpenType('design', {\n      mode: 'detail',\n      desformCode: data.code,\n      dataId: data.dataId,\n      isOnline: false,\n    });\n  }\n\n  /**\n   * 打开Online表单 弹窗\n   * @param data\n   */\n  function showOnlineCgformModal(data) {\n    handleOpenType('cgform', {\n      formId: data.formId,\n      isUpdate: true,\n      disableSubmit: true,\n      record: {\n        id: data.dataId,\n      },\n    });\n  }\n\n  /**\n   * 判断是不是表单的评论消息\n   * @param record\n   */\n  function isFormComment(record) {\n    if(record.busType == 'comment'){\n      let msgAbstract = record.msgAbstract;\n      if(msgAbstract){\n        try {\n          let data = JSON.parse(msgAbstract);\n          if(['cgform', 'designForm'].includes(data.type)){\n            return true\n          }\n        }catch (e) {\n          console.error('打开评论表单，但是msgAbstract参数不是JSON格式', msgAbstract)\n        }\n      }\n    }\n    return false\n  }\n\n  /**\n   * 如果是工作流任务 在lowApp中 直接打开modal\n   */\n  function openLowAppFlowModal(record){\n    const { busType, busId, msgAbstract } = record;\n    let temp = messageHrefArray.filter(item=>item.value === busType);\n    if(!temp || temp.length==0){\n      console.error('当前业务类型不识别', busType);\n      return;\n    }\n    if(busType.indexOf('bpm')<0){\n      console.error('low-app不支持跳转邮箱', busType);\n      return;\n    }\n    //固定参数 detailId 用于查询表单数据\n    let query:any = {\n      detailId: busId\n    };\n    // 额外参数处理\n    if(msgAbstract){\n      try {\n        let json = JSON.parse(msgAbstract);\n        Object.keys(json).map(k=>{\n          query[k] = json[k]\n        });\n      }catch (e) {\n        console.error('msgAbstract参数不是JSON格式', msgAbstract)\n      }\n    }\n    console.log(\"busType = \", busType)\n    handleOpenType('task', {\n      record: {\n        id: busId,\n        procInsId: query.procInsId,\n        processDefinitionId: query.processDefinitionId,\n        isDetail: query.taskDetail || 'bpm_cc' == busType\n      }\n    })\n  }\n\n  /**\n   * 根据busType不同跳转不同页面\n   * @param record\n   */\n  async function goPageWithBusType(record){\n    const { busType, busId, msgAbstract } = record;\n    let temp = messageHrefArray.filter(item=>item.value === busType);\n    if(!temp || temp.length==0){\n      console.error('当前业务类型不识别', busType);\n      return;\n    }\n    let path = temp[0].text;\n    if (['eoa_co_notify', 'eoa_co_remind'].includes(busType)) {\n      if (busId.startsWith('coId-')) {\n        path = temp[0].url;\n      } else if (busId.startsWith('nodeId-')) {\n        path = temp[0].text;\n      }\n    }\n    path = path.replace('{DETAIL_ID}', busId)\n    //固定参数 detailId 用于查询表单数据\n    let query:any = {\n      detailId: busId\n    };\n    // 额外参数处理\n    if(msgAbstract){\n      try {\n        let json = JSON.parse(msgAbstract);\n        Object.keys(json).map(k=>{\n          query[k] = json[k]\n        });\n      }catch (e) {\n        console.error('msgAbstract参数不是JSON格式', msgAbstract)\n      }\n    }\n    if(query.taskDetail){\n      // 查看任务详情的弹窗\n      await showHistory(query.procInsId, {taskOriginalId:query.taskId,busType,id:busId,readFlag:record.readFlag})\n    }else{\n      // 跳转路由\n      appStore.setMessageHrefParams(query);\n      if(rt.path.indexOf(path)>=0){\n        await closeTab();\n        await router.replace({ path: path, query:{ time: new Date().getTime() } });\n      }else{\n        closeSameRoute(path)\n        await router.push({ path: path });\n      }\n    }\n  }\n\n  /**\n   * 从首页的消息通知跳转消息列表打开modal\n   * @param record\n   */\n  async function goPageFromOuter(record){\n    //没有定义业务类型 直接跳转我的消息页面\n    emit('detail', record)\n  }\n\n  //===============================================================================================================\n  // 代码逻辑说明: QQYUN-3485 【查看流程】做一个查看页面，非办理页面，只通过流程实例参数即可\n  async function showHistory(processInstanceId, data?) {\n    let { formData, formUrl } = await getTaskInfoForHistory({ processInstanceId });\n    formData['PROCESS_TAB_TYPE'] = 'history';\n    handleOpenType('history', {\n      formData,\n      formUrl,\n      isCc: data && data.busType == 'bpm_cc',\n      record: data,\n      title: '流程历史',\n    });\n  }\n\n  const nodeInfoUrl = '/act/process/extActProcessNode/getHisProcessNodeInfo'\n  const taskNodeInfo = (params) => defHttp.get({ url: nodeInfoUrl, params });\n\n  async function getTaskInfoForHistory(record) {\n    //查询条件\n    let params = { procInstId: record.processInstanceId };\n    const result = await taskNodeInfo(params);\n    console.log('获取历史任务信息', result);\n    let formData: any = {\n      dataId: result.dataId,\n      taskId: record.id,\n      taskDefKey: record.taskId,\n      procInsId: record.processInstanceId,\n      tableName: result.tableName,\n      vars: result.records,\n    };\n    let tempFormUrl = result.formUrl;\n    console.log('获取流程节点表单URL', tempFormUrl);\n    //节点配置表单URL，VUE组件类型对应的拓展参数\n    if (tempFormUrl && tempFormUrl.indexOf('?') != -1 && !isURL(tempFormUrl) && tempFormUrl.indexOf('{{DOMAIN_URL}}') == -1) {\n      tempFormUrl = result.formUrl.split('?')[0];\n      console.log('获取流程节点表单URL（去掉参数）', tempFormUrl);\n      formData.extendUrlParams = getQueryVariable(result.formUrl);\n    }\n    return {\n      formData,\n      formUrl: tempFormUrl,\n    };\n  }\n\n  /**\n   * 获取URL上参数\n   * @param url\n   */\n  function getQueryVariable(url) {\n    if (!url) return;\n\n    let t,\n      n,\n      r,\n      i = url.split('?')[1],\n      s = {};\n    (t = i.split('&')), (r = null), (n = null);\n    for (let o in t) {\n      let u = t[o].indexOf('=');\n      u !== -1 && ((r = t[o].substr(0, u)), (n = t[o].substr(u + 1)), (s[r] = n));\n    }\n    return s;\n  }\n\n  /**\n   * URL地址\n   * @param {*} s\n   */\n  function isURL(s) {\n    return /^http[s]?:\\/\\/.*/.test(s);\n  }\n  //===============================================================================================================\n\n  return {\n    goPage,\n    isFormComment,\n    modalRegCache,\n    currentModal,\n    bindParams,\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/message/manage/ManageDrawer.vue",
    "content": "<template>\n  <BasicDrawer @register=\"registerModal\" title=\"详情\" :width=\"600\" v-bind=\"$attrs\" @ok=\"closeDrawer\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicDrawer>\n</template>\n\n<script lang=\"ts\" setup>\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';\n  import { formSchemas } from './manage.data';\n\n  // 声明 emits\n  const emit = defineEmits(['register']);\n  // 注册 form\n  const [registerForm, { resetFields, setFieldsValue, validate, updateSchema }] = useForm({\n    schemas: formSchemas,\n    showActionButtonGroup: false,\n  });\n  // 注册 modal\n  const [registerModal, { closeDrawer }] = useDrawerInner(async (data) => {\n    await resetFields();\n    await setFieldsValue({ ...data.record });\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/message/manage/index.less",
    "content": "//noinspection LessUnresolvedVariable\n@prefix-cls: ~'@{namespace}-message-manage';\n\n.@{prefix-cls} {\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/message/manage/index.vue",
    "content": "<template>\n  <div :class=\"prefixCls\">\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-dropdown v-if=\"showBatchBtn\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"onDeleteBatch\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                <span>删除</span>\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button>\n            <span>批量操作</span>\n            <Icon icon=\"mdi:chevron-down\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\" />\n      </template>\n    </BasicTable>\n    <ManageDrawer @register=\"registerDrawer\" />\n  </div>\n</template>\n\n<script lang=\"ts\" setup name=\"message-manage\">\n  import { unref, computed } from 'vue';\n  import { ActionItem, BasicTable, TableAction } from '/@/components/Table';\n  import { useDrawer } from '/@/components/Drawer';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import ManageDrawer from './ManageDrawer.vue';\n  import { Api, list, deleteBatch } from './manage.api';\n  import { columns, searchFormSchema } from './manage.data';\n\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext } = useListPage({\n    designScope: 'message-manage',\n    tableProps: {\n      title: '消息中心模板列表数据',\n      api: list,\n      columns: columns,\n      formConfig: {\n        schemas: searchFormSchema,\n      },\n    },\n    exportConfig: {\n      url: Api.exportXls,\n      name: '消息中心模板列表',\n    },\n    importConfig: {\n      url: Api.importXls,\n      success: () => reload(),\n    },\n  });\n\n  // 注册 ListTable\n  const [registerTable, { reload, setLoading }, { rowSelection, selectedRowKeys }] = tableContext;\n  const showBatchBtn = computed(() => selectedRowKeys.value.length > 0);\n\n  const [registerDrawer, { openDrawer }] = useDrawer();\n\n  function onDetail(record) {\n    openDrawer(true, { record: record });\n  }\n\n  function onDelete(record) {\n    if (record) {\n      doDeleteDepart([record.id], false);\n    }\n  }\n\n  async function onDeleteBatch() {\n    try {\n      await doDeleteDepart(selectedRowKeys);\n      selectedRowKeys.value = [];\n    } finally {\n    }\n  }\n\n  /**\n   * 根据 ids 批量删除\n   * @param idListRef array\n   * @param confirm 是否显示确认提示框\n   */\n  async function doDeleteDepart(idListRef, confirm = true) {\n    const idList = unref(idListRef);\n    if (idList.length > 0) {\n      try {\n        setLoading(true);\n        await deleteBatch({ ids: idList.join(',') }, confirm);\n        await reload();\n      } finally {\n        setLoading(false);\n      }\n    }\n  }\n\n  /**\n   * 操作栏\n   */\n  function getTableAction(record): ActionItem[] {\n    return [{ label: '详情', onClick: onDetail.bind(null, record) }];\n  }\n\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record): ActionItem[] {\n    return [\n      {\n        label: '删除',\n        color: 'error',\n        popConfirm: {\n          title: '确认要删除吗？',\n          confirm: onDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n</script>\n\n<style lang=\"less\">\n  @import 'index';\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/message/manage/manage.api.ts",
    "content": "import { unref } from 'vue';\nimport { defHttp } from '/@/utils/http/axios';\nimport { useMessage } from '/@/hooks/web/useMessage';\n\nconst { createConfirm } = useMessage();\n\nexport enum Api {\n  list = '/sys/message/sysMessage/list',\n  delete = '/sys/message/sysMessage/delete',\n  deleteBatch = '/sys/message/sysMessage/deleteBatch',\n  exportXls = 'sys/message/sysMessage/exportXls',\n  importXls = 'sys/message/sysMessage/importExcel',\n  save = '/sys/message/sysMessage/add',\n  edit = '/sys/message/sysMessage/edit',\n}\n\nexport const list = (params) => defHttp.get({ url: Api.list, params });\n\n/**\n * 批量删除\n * @param params\n * @param confirm\n */\nexport const deleteBatch = (params, confirm = false) => {\n  return new Promise((resolve, reject) => {\n    const doDelete = () => {\n      resolve(defHttp.delete({ url: Api.deleteBatch, params }, { joinParamsToUrl: true }));\n    };\n    if (confirm) {\n      createConfirm({\n        iconType: 'warning',\n        title: '删除',\n        content: '确定要删除吗？',\n        onOk: () => doDelete(),\n        onCancel: () => reject(),\n      });\n    } else {\n      doDelete();\n    }\n  });\n};\n\n/**\n * 保存或者更改消息模板\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  if (unref(isUpdate)) {\n    return defHttp.put({ url: Api.edit, params });\n  } else {\n    return defHttp.post({ url: Api.save, params });\n  }\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/message/manage/manage.data.ts",
    "content": "import { BasicColumn, FormSchema } from '/@/components/Table';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '消息标题',\n    dataIndex: 'esTitle',\n    width: 140,\n  },\n  {\n    title: '发送内容',\n    dataIndex: 'esContent',\n    width: 200,\n    // slots: { customRender: 'esContent' },\n  },\n  {\n    title: '接收人',\n    dataIndex: 'esReceiver',\n    width: 140,\n  },\n  {\n    title: '发送次数',\n    dataIndex: 'esSendNum',\n    width: 120,\n  },\n  {\n    title: '发送状态',\n    dataIndex: 'esSendStatus_dictText',\n    width: 120,\n  },\n  {\n    title: '发送时间',\n    dataIndex: 'esSendTime',\n    width: 140,\n  },\n  {\n    title: '发送方式',\n    dataIndex: 'esType_dictText',\n    width: 120,\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    label: '消息标题',\n    field: 'esTitle',\n    component: 'Input',\n  },\n  {\n    label: '发送状态',\n    field: 'esSendStatus',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'msgSendStatus',\n    },\n  },\n  {\n    label: '发送方式',\n    field: 'esType',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'messageType',\n    },\n  },\n];\n\nexport const formSchemas: FormSchema[] = [\n  {\n    label: 'ID',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '消息标题',\n    field: 'esTitle',\n    component: 'Input',\n    componentProps: { readOnly: true },\n  },\n  {\n    label: '发送内容',\n    field: 'esContent',\n    component: 'InputTextArea',\n    componentProps: { readOnly: true },\n  },\n  {\n    label: '发送参数',\n    field: 'esParam',\n    component: 'Input',\n    componentProps: { readOnly: true },\n  },\n\n  {\n    label: '接收人',\n    field: 'esReceiver',\n    component: 'Input',\n    componentProps: { readOnly: true },\n  },\n  {\n    label: '发送方式',\n    field: 'esType',\n    component: 'JDictSelectTag',\n    componentProps: { disabled: true, dictCode: 'messageType' },\n  },\n  {\n    label: '发送时间',\n    field: 'esSendTime',\n    component: 'Input',\n    componentProps: { readOnly: true },\n  },\n  {\n    label: '发送状态',\n    field: 'esSendStatus',\n    component: 'JDictSelectTag',\n    componentProps: { disabled: true, dictCode: 'msgSendStatus' },\n  },\n  {\n    label: '发送次数',\n    field: 'esSendNum',\n    component: 'Input',\n    componentProps: { readOnly: true },\n  },\n  {\n    label: '发送失败原因',\n    field: 'esResult',\n    component: 'Input',\n    componentProps: { readOnly: true },\n  },\n  {\n    label: '备注',\n    field: 'remark',\n    component: 'InputTextArea',\n    componentProps: { readOnly: true },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/message/template/TemplateModal.vue",
    "content": "<template>\n  <BasicModal @register=\"registerModal\" :title=\"title\" :width=\"600\" v-bind=\"$attrs\" @ok=\"onSubmit\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, unref } from 'vue';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { formSchemas } from './template.data';\n  import { saveOrUpdate } from './template.api';\n\n  // 声明 emits\n  const emit = defineEmits(['success', 'register']);\n  const title = ref<string>('');\n  const isUpdate = ref<boolean>(false);\n  // 注册 form\n  // 代码逻辑说明: [VUEN-2807]消息模板加一个查看功能------------\n  const [registerForm, { resetFields, setFieldsValue, validate, updateSchema, setProps }] = useForm({\n    schemas: formSchemas,\n    showActionButtonGroup: false,\n    baseRowStyle: {\n      marginTop: '10px',\n    },\n    labelCol: {\n      span: 5,\n    },\n    wrapperCol: {\n      span: 17,\n    },\n  });\n  // 注册 modal\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    setModalProps({confirmLoading: false,showCancelBtn:!!data?.showFooter,showOkBtn:!!data?.showFooter});\n    isUpdate.value = unref(data.isUpdate);\n    title.value = unref(data.title);\n    await resetFields();\n    await setFieldsValue({ ...data.record });\n    // 隐藏底部时禁用整个表单\n    setProps({ disabled: !data?.showFooter })\n  });\n\n  //表单提交事件\n  async function onSubmit() {\n    try {\n      const values = await validate();\n      setModalProps({ confirmLoading: true });\n      // 提交表单\n      await saveOrUpdate(values, isUpdate);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/message/template/TemplateTestModal.vue",
    "content": "<template>\n  <BasicModal @register=\"registerModal\" title=\"发送测试\" :width=\"800\" v-bind=\"$attrs\" @ok=\"onSubmit\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, unref } from 'vue';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { sendTestFormSchemas } from './template.data';\n  import { sendMessageTest } from './template.api';\n\n  // 声明 emits\n  const emit = defineEmits(['register']);\n  // 注册 form\n  const [registerForm, { resetFields, setFieldsValue, validate, updateSchema }] = useForm({\n    schemas: sendTestFormSchemas,\n    showActionButtonGroup: false,\n  });\n  // 注册 modal\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    await resetFields();\n    await setFieldsValue({ ...unref(data.record) });\n  });\n\n  //表单提交事件\n  async function onSubmit() {\n    try {\n      const values = await validate();\n      setModalProps({ confirmLoading: true });\n      // 提交表单\n      await sendMessageTest(values);\n      //关闭弹窗\n      closeModal();\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/message/template/index.less",
    "content": "//noinspection LessUnresolvedVariable\n@prefix-cls: ~'@{namespace}-message-template';\n\n.@{prefix-cls} {\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/message/template/index.vue",
    "content": "<template>\n  <div :class=\"prefixCls\">\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"onAdd\">新增</a-button>\n        <a-button type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n        <j-upload-button type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n        <a-dropdown v-if=\"showBatchBtn\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"onDeleteBatch\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                <span>删除</span>\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button>\n            <span>批量操作</span>\n            <Icon icon=\"mdi:chevron-down\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\" />\n      </template>\n    </BasicTable>\n    <TemplateModal @register=\"registerModal\" @success=\"reload\" />\n    <TemplateTestModal @register=\"registerTestModal\" />\n  </div>\n</template>\n\n<script lang=\"ts\" setup name=\"message-template\">\n  import { unref, computed, toRaw } from 'vue';\n  import { ActionItem, BasicTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import TemplateModal from './TemplateModal.vue';\n  import TemplateTestModal from './TemplateTestModal.vue';\n  import { Api, saveOrUpdate, list, deleteBatch } from './template.api';\n  import { columns, searchFormSchema } from './template.data';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  const { createMessage } = useMessage();\n\n  // 列表页面公共参数、方法\n  const { prefixCls, onExportXls, onImportXls, tableContext } = useListPage({\n    designScope: 'message-template',\n    tableProps: {\n      title: '消息中心模板列表数据',\n      api: list,\n      columns: columns,\n      formConfig: {\n        schemas: searchFormSchema,\n      },\n    },\n    exportConfig: {\n      url: Api.exportXls,\n      name: '消息中心模板列表',\n    },\n    importConfig: {\n      url: Api.importXls,\n      success: () => reload(),\n    },\n  });\n\n  // 注册 ListTable\n  const [registerTable, { reload, setLoading }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext;\n  const [registerModal, { openModal }] = useModal();\n  const [registerTestModal, testModal] = useModal();\n  const showBatchBtn = computed(() => selectedRowKeys.value.length > 0);\n\n  function onAdd() {\n    openModal(true, {\n      title: '新增消息模板',\n      isUpdate: false,\n      showFooter: true,\n      record: {},\n    });\n  }\n\n  function onEdit(record) {\n    if (record.useStatus === '1') {\n      createMessage.warning('此模板已被应用，禁止编辑!');\n      return;\n    }\n    openModal(true, {\n      title: '修改消息模板',\n      isUpdate: true,\n      record: record,\n      showFooter: true,\n    });\n  }\n\n  function onDelete(record) {\n    if (record) {\n      // 代码逻辑说明: VUEN-1652【bug】应用状态下不允许删除\n      if(record.useStatus == '1'){\n        createMessage.warning('该模板已被应用禁止删除!');\n        return;\n      }\n      doDeleteDepart([record.id], false);\n    }\n  }\n\n  /**\n   * 根据 ids 批量删除\n   * @param idListRef array\n   * @param confirm 是否显示确认提示框\n   */\n  async function doDeleteDepart(idListRef, confirm = true) {\n    const idList = unref(idListRef);\n    if (idList.length > 0) {\n      try {\n        setLoading(true);\n        await deleteBatch({ ids: idList.join(',') }, confirm);\n        await reload();\n      } finally {\n        setLoading(false);\n      }\n    }\n  }\n\n  async function onDeleteBatch() {\n    try {\n      // 代码逻辑说明: VUEN-1652【bug】应用状态下不允许删除\n      let arr = toRaw(selectedRows.value);\n      let temp = arr.filter(item=>item.useStatus=='1')\n      if(temp.length>0){\n        createMessage.warning('选中的模板已被应用禁止删除!');\n        return;\n      }\n      await doDeleteDepart(selectedRowKeys);\n      selectedRowKeys.value = [];\n    } finally {\n    }\n  }\n\n  // 发送消息测试\n  function onSendTest(record) {\n    testModal.openModal(true, { record });\n  }\n\n  /**\n   * 操作栏\n   */\n  function getTableAction(record): ActionItem[] {\n    // 代码逻辑说明: [VUEN-2807]消息模板加一个查看功能------------\n    return [{ label: '查看', onClick: handleDetail.bind(null, record)}, { label: '编辑', onClick: onEdit.bind(null, record) }];\n  }\n\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record): ActionItem[] {\n    return [\n      { label: '应用', onClick: handleUse.bind(null, record) },\n      { label: '停用', onClick: handleNotUse.bind(null, record) },\n      { label: '发送测试', onClick: onSendTest.bind(null, record) },\n      {\n        label: '删除',\n        color: 'error',\n        popConfirm: {\n          title: '确认要删除吗？',\n          confirm: onDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n\n  /**\n   * 应用\n   */\n  async function handleUse(record) {\n    let param = { id: record.id, useStatus: '1' };\n    await saveOrUpdate(param, true);\n    await reload();\n  }\n\n  /**\n   * 停用\n   */\n  async function handleNotUse(record) {\n    let param = { id: record.id, useStatus: '0' };\n    await saveOrUpdate(param, true);\n    await reload();\n  }\n\n  /**\n   * 查看\n   * @param record\n   */\n  function handleDetail(record) {\n    openModal(true,{\n      title: \"消息模板详情\",\n      isUpdate: true,\n      showFooter: false,\n      record:record\n    })\n  }\n</script>\n\n<style lang=\"less\">\n  @import 'index';\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/message/template/template.api.ts",
    "content": "import { unref } from 'vue';\nimport { defHttp } from '/@/utils/http/axios';\nimport { useMessage } from '/@/hooks/web/useMessage';\n\nconst { createConfirm } = useMessage();\n\nexport enum Api {\n  list = '/sys/message/sysMessageTemplate/list',\n  delete = '/sys/message/sysMessageTemplate/delete',\n  deleteBatch = '/sys/message/sysMessageTemplate/deleteBatch',\n  exportXls = 'sys/message/sysMessageTemplate/exportXls',\n  importXls = 'sys/message/sysMessageTemplate/importExcel',\n  save = '/sys/message/sysMessageTemplate/add',\n  edit = '/sys/message/sysMessageTemplate/edit',\n  // 发送测试\n  send = '/sys/message/sysMessageTemplate/sendMsg',\n}\n\nexport const list = (params) => defHttp.get({ url: Api.list, params });\n\n/**\n * 批量删除\n * @param params\n * @param confirm\n */\nexport const deleteBatch = (params, confirm = false) => {\n  return new Promise((resolve, reject) => {\n    const doDelete = () => {\n      resolve(defHttp.delete({ url: Api.deleteBatch, params }, { joinParamsToUrl: true }));\n    };\n    if (confirm) {\n      createConfirm({\n        iconType: 'warning',\n        title: '删除',\n        content: '确定要删除吗？',\n        onOk: () => doDelete(),\n        onCancel: () => reject(),\n      });\n    } else {\n      doDelete();\n    }\n  });\n};\n\n/**\n * 保存或者更改消息模板\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  if (unref(isUpdate)) {\n    return defHttp.put({ url: Api.edit, params });\n  } else {\n    return defHttp.post({ url: Api.save, params });\n  }\n};\n\n/**\n * 发送消息测试\n * @param params\n */\nexport const sendMessageTest = (params) => defHttp.post({ url: Api.send, params });\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/message/template/template.data.ts",
    "content": "import { BasicColumn, FormSchema } from '/@/components/Table';\nimport { rules } from '/@/utils/helper/validator';\nimport { filterDictTextByCache } from '/@/utils/dict/JDictSelectUtil';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '模板标题',\n    dataIndex: 'templateName',\n    width: 80,\n  },\n  {\n    title: '模板编码',\n    dataIndex: 'templateCode',\n    width: 100,\n  },\n  {\n    title: '通知模板',\n    dataIndex: 'templateContent',\n    width: 150,\n  },\n  {\n    title: '模板类型',\n    dataIndex: 'templateType',\n    width: 100,\n    customRender: ({ text }) => filterDictTextByCache('msgType', text),\n  },\n  {\n    title: '是否应用',\n    dataIndex: 'useStatus',\n    width: 90,\n    customRender: function ({ text }) {\n      if (text == '1') {\n        return '是';\n      } else {\n        return '否';\n      }\n    },\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    label: '模板标题',\n    field: 'templateName',\n    component: 'Input',\n  },\n  {\n    label: '模板编码',\n    field: 'templateCode',\n    component: 'Input',\n  },\n  {\n    label: '模板类型',\n    field: 'templateType',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'msgType',\n    },\n  },\n];\n\nexport const formSchemas: FormSchema[] = [\n  {\n    label: 'ID',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '模板标题',\n    field: 'templateName',\n    component: 'Input',\n    required: true,\n  },\n  {\n    label: '模板编码',\n    field: 'templateCode',\n    component: 'Input',\n    required: true,\n    dynamicRules: ({ model, schema }) => {\n      return [ ...rules.duplicateCheckRule('sys_sms_template', 'template_code', model, schema, true)];\n    },\n    // 编辑模式下不可修改编码\n    dynamicDisabled: (params) => !!params.values.id,\n  },\n  {\n    label: '模板类型',\n    field: 'templateType',\n    component: 'JDictSelectTag',\n    defaultValue: '1',\n    componentProps: {\n      dictCode: 'msgType',\n      type: 'radio',\n      placeholder: '请选择模板类型',\n    },\n    required: true,\n  },\n  {\n    label: '模板分类',\n    field: 'templateCategory',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'msgCategory',\n      placeholder: '请选择模板分类',\n    }\n  },\n  {\n    label: '是否应用',\n    field: 'useStatus',\n    component: 'JSwitch',\n    componentProps: {\n      options: ['1', '0'],\n    },\n  },\n  {\n    label: '模板内容',\n    field: 'templateContent',\n    component: 'InputTextArea',\n    componentProps: {\n      autoSize: {\n        minRows: 8,\n        maxRows: 8,\n      },\n    },\n    ifShow: ({ values }) => {\n      return !['2', '4', '5'].includes(values.templateType);\n    },\n  },\n\n  {\n    label: '模板内容',\n    field: 'templateContent',\n    component: 'JEditor',\n    ifShow: ({ values }) => {\n      return ['2', '4'].includes(values.templateType);\n    },\n  },\n  {\n    label: '模板内容',\n    field: 'templateContent',\n    component: 'JMarkdownEditor',\n    ifShow: ({ values }) => {\n      return ['5'].includes(values.templateType);\n    },\n  },\n];\n\nexport const sendTestFormSchemas: FormSchema[] = [\n  {\n    label: '模板编码',\n    field: 'templateCode',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '模板标题',\n    field: 'templateName',\n    component: 'Input',\n    componentProps: { disabled: true },\n  },\n  {\n    label: '模板内容',\n    field: 'templateContent',\n    component: 'InputTextArea',\n    componentProps: { disabled: true, rows: 5 },\n  },\n  {\n    label: '测试数据',\n    field: 'testData',\n    component: 'InputTextArea',\n    required: true,\n    helpMessage: 'JSON数据',\n    defaultValue: '{}',\n    componentProps: {\n      placeholder: '请输入JSON格式测试数据',\n      rows: 5,\n    },\n  },\n  {\n    label: '消息类型',\n    field: 'msgType',\n    component: 'JDictSelectTag',\n    required: true,\n    defaultValue:'system',\n    componentProps: { dictCode: 'messageType',type:'radio' },\n  },\n  {\n    label: '消息接收方',\n    field: 'receiver',\n    required: true,\n    component: 'JSelectUser',\n    componentProps: {\n      labelKey: 'username',\n      rowKey: 'username',\n    },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/notice/DetailModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :width=\"800\" title=\"查看详情\" :showCancelBtn=\"false\" :showOkBtn=\"false\" :maxHeight=\"500\">\n    <template #title>\n      <span class=\"basic-title\">查看详情</span>\n      <div class=\"print-btn\" @click=\"onPrinter\">\n        <Icon icon=\"ant-design:printer-filled\" />\n        <span class=\"print-text\">打印</span>\n      </div>\n    </template>\n    <iframe ref=\"iframeRef\" :src=\"frameSrc\" class=\"detail-iframe\" @load=\"onIframeLoad\"></iframe>\n    <template v-if=\"noticeFiles && noticeFiles.length > 0\">\n      <div class=\"files-title\">相关附件：</div>\n      <template v-for=\"(file, index) in noticeFiles\" :key=\"index\">\n        <div class=\"files-area\">\n          <div class=\"files-area-text\">\n            <span>\n              <paper-clip-outlined />\n              <a\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n                :title=\"file.fileName\"\n                :href=\"getFileAccessHttpUrl(file.filePath)\"\n                class=\"ant-upload-list-item-name\"\n                >{{ file.fileName }}</a\n              >\n            </span>\n          </div>\n          <div class=\"files-area-operate\">\n            <download-outlined class=\"item-icon\" @click=\"handleDownloadFile(file.filePath)\" />\n            <eye-outlined class=\"item-icon\" @click=\"handleViewFile(file.filePath)\" />\n          </div>\n        </div>\n      </template>\n      <a v-if=\"noticeFiles.length > 1\" :href=\"downLoadFiles + '?id=' + noticeId + '&token=' + getToken()\" target=\"_blank\"  style=\"margin: 15px 6px;color: #5ac0fa;\">\n        <download-outlined class=\"item-icon\" style=\"margin-right: 5px\"  /><span>批量下载所有附件</span>\n      </a>\n    </template>\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { propTypes } from '/@/utils/propTypes';\n  import { ref } from 'vue';\n  import { buildUUID } from '@/utils/uuid';\n  import {getElectronFileUrl, getFileAccessHttpUrl} from '@/utils/common/compUtils';\n  import { DownloadOutlined, EyeOutlined, PaperClipOutlined } from '@ant-design/icons-vue';\n  import { encryptByBase64 } from '@/utils/cipher';\n  import { useGlobSetting } from '@/hooks/setting';\n  import { getToken } from \"@/utils/auth\";\n  import {$electron} from \"@/electron\";\n  const glob = useGlobSetting();\n  // 获取props\n  defineProps({\n    frameSrc: propTypes.string.def(''),\n  });\n  /**\n   * 下载文件路径\n   */\n  const downLoadFiles = `${glob.domainUrl}/sys/annountCement/downLoadFiles`;\n\n  //附件内容\n  const noticeFiles = ref([]);\n  //数据ID\n  const noticeId = ref('');\n  //表单赋值\n  const [registerModal] = useModalInner((data) => {\n    noticeFiles.value = [];\n    noticeId.value = data.record.id;\n    if (data.record?.files && data.record?.files.length > 0) {\n      noticeFiles.value = data.record.files.split(',').map((item) => {\n        return {\n          fileName: item.split('/').pop(),\n          filePath: item,\n        };\n      });\n    }\n  });\n  // iframe引用\n  const iframeRef = ref<HTMLIFrameElement>();\n  // 存储当前打印会话ID\n  const printSessionId = ref<string>('');\n  // iframe加载完成后初始化通信\n  const onIframeLoad = () => {\n    printSessionId.value = buildUUID(); // 每次加载生成新的会话ID\n  };\n  //打印\n  function onPrinter() {\n    if (!iframeRef.value) return;\n    console.log('onPrinter', iframeRef.value);\n    iframeRef.value?.contentWindow?.postMessage({ printSessionId: printSessionId.value, type: 'action:print' }, '*');\n  }\n  /**\n   * 下载文件\n   * @param filePath\n   */\n  function handleDownloadFile(filePath) {\n    window.open(getFileAccessHttpUrl(filePath), '_blank');\n  }\n  /**\n   * 预览文件\n   * @param filePath\n   */\n  function handleViewFile(filePath) {\n    if (filePath) {\n      let url = encodeURIComponent(encryptByBase64(filePath));\n      let previewUrl = `${glob.viewUrl}?url=` + url;\n      //update-begin-author:liusq---date:2025-12-16--for: JHHB-1139桌面端 文件预览统一修改 \n      if($electron.isElectron()){\n        previewUrl = getElectronFileUrl(filePath);\n      }\n      //update-end-author:liusq---date:2025-12-16--for: JHHB-1139桌面端 文件预览统一修改\n      window.open(previewUrl, '_blank');\n    }\n  }\n</script>\n\n<style scoped lang=\"less\">\n  .print-btn {\n    position: absolute;\n    top: 20px;\n    right: 100px;\n    cursor: pointer;\n    color: #a3a3a5;\n    z-index: 999;\n    .print-text {\n      margin-left: 5px;\n    }\n    &:hover {\n      color: #40a9ff;\n    }\n  }\n  .detail-iframe {\n    border: 0;\n    width: 100%;\n    height: 100%;\n    min-height: 500px;\n    // -update-begin--author:liaozhiyang---date:20240702---for：【TV360X-1685】通知公告查看出现两个滚动条\n    display: block;\n    // -update-end--author:liaozhiyang---date:20240702---for：【TV360X-1685】通知公告查看出现两个滚动条\n  }\n  .files-title {\n    font-size: 16px;\n    margin: 10px;\n    font-weight: 600;\n    color: #333;\n  }\n  .files-area {\n    display: flex;\n    align-items: center;\n    justify-content: flex-start;\n    margin: 6px;\n    &:hover {\n      background-color: #f5f5f5;\n    }\n    .files-area-text {\n      display: flex;\n      .ant-upload-list-item-name {\n        margin: 0 6px;\n        color: #56befa;\n      }\n    }\n    .files-area-operate {\n      display: flex;\n      margin-left: 10px;\n      .item-icon {\n        cursor: pointer;\n        margin: 0 6px;\n        &:hover {\n          color: #56befa;\n        }\n      }\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/notice/NoticeForm.vue",
    "content": "<template>\n  <div style=\"min-height: 400px\">\n    <BasicForm @register=\"registerForm\">\n      <template #msgTemplate=\"{ model, field }\">\n        <a-select v-model:value=\"model[field]\" placeholder=\"请选择消息模版\" :options=\"templateOption\" @change=\"handleChange\" />\n      </template>\n      <template #msgContent=\"{ model, field }\">\n        <div v-html=\"model[field]\" class=\"article-content\"></div>\n      </template>\n    </BasicForm>\n    <div class=\"footer-btn\" v-if=\"!formDisabled\">\n      <a-button @click=\"submitForm\" pre-icon=\"ant-design:check\" type=\"primary\">提 交</a-button>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup>\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { getBpmFormSchema } from './notice.data';\n  import { getTempList, queryById, saveOrUpdate } from './notice.api';\n  import { computed, ref } from 'vue';\n  // 定义属性\n  const props = defineProps({\n    formData: {\n      type: Object,\n      default: () => ({}),\n    },\n  });\n  //表单禁用\n  const formDisabled = computed(() => {\n    if (props.formData.disabled === false) {\n      return false;\n    }\n    return true;\n  });\n  const templateOption = ref([]);\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n    schemas: getBpmFormSchema(props.formData),\n    showActionButtonGroup: false,\n    disabled: formDisabled.value,\n    labelWidth: 100,\n    baseRowStyle: { marginTop: '10px' },\n    baseColProps: { xs: 24, sm: 12, md: 12, lg: 12, xl: 12, xxl: 12 },\n  });\n\n  //表单提交\n  async function submitForm() {\n    let values = await validate();\n    if (values.msgType === 'ALL') {\n      values.userIds = '';\n    } else {\n      values.userIds += ',';\n    }\n    console.log('表单数据', values);\n    await saveOrUpdate(values, true);\n  }\n  //初始化模板\n  async function initTemplate() {\n    const res = await getTempList({ templateCategory: 'notice', pageSize: 100 });\n    console.log('res', res);\n    if (res.records && res.records.length > 0) {\n      templateOption.value = res.records.map((item) => {\n        return {\n          label: item.templateName,\n          value: item.templateCode,\n          content: item.templateContent,\n        };\n      });\n    }\n  }\n  /**\n   * 模版修改\n   * @param val\n   */\n  function handleChange(val) {\n    const content = templateOption.value.find((item: any) => item.value === val)?.content;\n    if (content) {\n      setFieldsValue({\n        msgContent: content,\n      });\n    }\n  }\n  /**\n   * 加载数据\n   */\n  async function initFormData() {\n    let res = await queryById({ id: props.formData.dataId });\n    if (res.success) {\n      //重置表单\n      await resetFields();\n      const record = res.result;\n      if (record.userIds) {\n        record.userIds = record.userIds.substring(0, record.userIds.length - 1);\n      }\n      //表单赋值\n      await setFieldsValue({\n        ...record,\n      });\n    }\n  }\n  //加载模版\n  initTemplate();\n  //加载数据\n  initFormData();\n</script>\n<style lang=\"less\" scoped>\n  .footer-btn {\n    width: 100%;\n    text-align: center;\n  }\n  .article-content {\n    max-width: 100%;\n    max-height: 500px;\n    overflow-y: auto;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/notice/NoticeModal.vue",
    "content": "<template>\n  <BasicModal\n    v-bind=\"$attrs\"\n    @register=\"registerModal\"\n    @ok=\"handleSubmit\"\n    :title=\"title\"\n    width=\"900px\"\n    wrapClassName=\"notice-cls-modal\"\n    :maxHeight=\"800\"\n    destroyOnClose\n  >\n    <BasicForm @register=\"registerForm\">\n      <template #msgTemplate=\"{ model, field }\">\n        <a-select v-model:value=\"model[field]\" placeholder=\"请选择消息模版\" :options=\"templateOption\" @change=\"handleChange\" />\n      </template>\n    </BasicForm>\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { formSchema } from './notice.data';\n  import { getTempList, saveOrUpdate } from './notice.api';\n  // 声明Emits\n  const emit = defineEmits(['register', 'success']);\n  const isUpdate = ref(true);\n  const record = ref<any>({});\n  const templateOption = ref([]);\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n    schemas: formSchema,\n    showActionButtonGroup: false,\n    labelWidth: 100,\n    baseRowStyle: { marginTop: '10px' },\n    baseColProps: { xs: 24, sm: 12, md: 12, lg: 12, xl: 12, xxl: 12 },\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //加载模版\n    await initTemplate();\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false });\n    isUpdate.value = !!data?.isUpdate;\n    if (unref(isUpdate)) {\n      if (data.record.userIds) {\n        data.record.userIds = data.record.userIds.substring(0, data.record.userIds.length - 1);\n      }\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n      record.value = data.record;\n    } else {\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n    }\n  });\n  //设置标题\n  const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));\n  //表单提交事件\n  async function handleSubmit() {\n    try {\n      let values = await validate();\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      // 代码逻辑说明: [issue#429]新增通知公告提交指定用户参数有undefined ---\n      if(values.msgType==='ALL'){\n        values.userIds = '';\n      }else{\n        values.userIds += ',';\n      }\n      if (isUpdate.value && record.value.sendStatus != '2') {\n        values.sendStatus = '0';\n      }\n      await saveOrUpdate(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n  //初始化模板\n  async function initTemplate() {\n    const res = await getTempList({ templateCategory: 'notice', pageSize: 100 });\n    console.log('res', res);\n    if (res.records && res.records.length > 0) {\n      templateOption.value = res.records.map((item) => {\n        return {\n          label: item.templateName,\n          value: item.templateCode,\n          content: item.templateContent,\n        };\n      });\n    }\n  }\n\n  /**\n   * 模版修改\n   * @param val\n   */\n  function handleChange(val) {\n    const content = templateOption.value.find((item: any) => item.value === val)?.content;\n    if (content) {\n      setFieldsValue({\n        msgContent: content,\n      });\n    }\n  }\n</script>\n<style scoped>\n  .notice-cls-modal {\n    top: 20px !important;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/notice/index.vue",
    "content": "<template>\n  <div>\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <template #tableTitle>\n        <a-button preIcon=\"ant-design:plus-outlined\" type=\"primary\" @click=\"handleAdd\">新建</a-button>\n<!--        <a-button type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>-->\n<!--        <j-upload-button type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>-->\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button\n            >批量操作\n            <Icon style=\"fontsize: 12px\" icon=\"ant-design:down-outlined\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getActions(record)\" :dropDownActions=\"getDropDownAction(record)\" />\n      </template>\n    </BasicTable>\n    <NoticeModal @register=\"registerModal\" @success=\"reload\" />\n    <DetailModal @register=\"register\" :frameSrc=\"iframeUrl\" />\n  </div>\n</template>\n<script lang=\"ts\" name=\"system-notice\" setup>\n  import { ref, onMounted } from 'vue';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import NoticeModal from './NoticeModal.vue';\n  import DetailModal from './DetailModal.vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useGlobSetting } from '/@/hooks/setting';\n  import { getToken } from '/@/utils/auth';\n  import { columns, searchFormSchema } from './notice.data';\n  import { getList, deleteNotice, batchDeleteNotice,editIzTop, getExportUrl, getImportUrl, doReleaseData, doReovkeData } from './notice.api';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { useAppStore } from '/@/store/modules/app';\n\n  const appStore = useAppStore();\n  const glob = useGlobSetting();\n  const [registerModal, { openModal }] = useModal();\n  const [register, { openModal: openDetail }] = useModal();\n  const iframeUrl = ref('');\n  const { createMessage, createConfirm } = useMessage();\n  // 列表页面公共参数、方法\n  const { prefixCls, onExportXls, onImportXls, tableContext, doRequest } = useListPage({\n    designScope: 'notice-template',\n    tableProps: {\n      title: '消息通知',\n      api: getList,\n      columns: columns,\n      formConfig: {\n        schemas: searchFormSchema,\n        fieldMapToTime: [['sendTime', ['sendTime_begin', 'sendTime_end'], 'YYYY-MM-DD']]\n      }\n    },\n    exportConfig: {\n      name: '消息通知列表',\n      url: getExportUrl,\n    },\n    importConfig: {\n      url: getImportUrl,\n    },\n  });\n\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;\n  //流程编码\n  const flowCode = 'dev_sys_announcement_001';\n  /**\n   * 新增事件\n   */\n  function handleAdd(record = {}) {\n    openModal(true, {\n      isUpdate: false,\n      record,\n    });\n  }\n\n  /**\n   * 编辑事件\n   */\n  function handleEdit(record) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteNotice({ id: record.id }, reload);\n  }\n  /**\n   * 置顶操作\n   */\n  async function handleTop(record, izTop) {\n     await editIzTop({ id: record.id, izTop }, reload);\n  }\n\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    doRequest(() => batchDeleteNotice({ ids: selectedRowKeys.value }));\n  }\n  /**\n   * 发布\n   */\n  async function handleRelease(id) {\n    await doReleaseData({ id });\n    reload();\n  }\n  /**\n   * 撤销\n   */\n  async function handleReovke(id) {\n    await doReovkeData({ id });\n    reload();\n  }\n  /**\n   * 查看\n   */\n  function handleDetail(record) {\n    iframeUrl.value = `${glob.uploadUrl}/sys/annountCement/show/${record.id}?token=${getToken()}`;\n    openDetail(true, { record });\n  }\n\n  /**\n   * 操作列定义\n   * @param record\n   */\n  function getActions(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n        ifShow: record.sendStatus == 0 || record.sendStatus == '2',\n      },\n      {\n        label: '查看',\n        onClick: handleDetail.bind(null, record),\n        ifShow: record.sendStatus == 1,\n      },\n    ];\n  }\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record) {\n    return [\n      {\n        label: '删除',\n        ifShow: record.sendStatus != 1,\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n      {\n        label: '发布',\n        ifShow: (!record?.izApproval || record.izApproval == '0') && record.sendStatus == 0,\n        onClick: handleRelease.bind(null, record.id),\n      },\n      {\n        label: '撤销',\n        ifShow: record.sendStatus == 1,\n        popConfirm: {\n          title: '确定要撤销吗？',\n          confirm: handleReovke.bind(null, record.id),\n        },\n      },\n      {\n        label: '发布',\n        ifShow: record.sendStatus == '2',\n        popConfirm: {\n          title: '确定要再次发布吗？',\n          confirm: handleRelease.bind(null, record.id),\n        },\n      },\n      {\n        label: '置顶',\n        onClick: handleTop.bind(null, record, 1),\n        ifShow: record.sendStatus == 1 && record.izTop == 0,\n      },\n      {\n        label: '取消置顶',\n        onClick: handleTop.bind(null, record, 0),\n        ifShow: record.sendStatus == 1 && record.izTop == 1,\n      },\n    ];\n  }\n\n  onMounted(() => {\n    // 代码逻辑说明: 【JHHB-128】转公告\n    const params = appStore.getMessageHrefParams;\n    if (params?.add) {\n      delete params.add;\n      handleAdd(params);\n      appStore.setMessageHrefParams('');\n    }\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/notice/notice.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\n\nenum Api {\n  list = '/sys/annountCement/list',\n  save = '/sys/annountCement/add',\n  edit = '/sys/annountCement/edit',\n  delete = '/sys/annountCement/delete',\n  queryById = '/sys/annountCement/queryById',\n  deleteBatch = '/sys/annountCement/deleteBatch',\n  exportXls = '/sys/annountCement/exportXls',\n  importExcel = '/sys/annountCement/importExcel',\n  releaseData = '/sys/annountCement/doReleaseData',\n  reovkeData = '/sys/annountCement/doReovkeData',\n  editIzTop = '/sys/annountCement/editIzTop',\n  addVisitsNum = '/sys/annountCement/addVisitsNumber',\n  tempList = '/sys/message/sysMessageTemplate/list',\n}\n\n/**\n * 导出url\n */\nexport const getExportUrl = Api.exportXls;\n/**\n * 导入url\n */\nexport const getImportUrl = Api.importExcel;\n/**\n * 查询消息列表\n * @param params\n */\nexport const getList = (params) => {\n  return defHttp.get({ url: Api.list, params });\n};\n\n/**\n * 保存或者更新通告\n * @param params\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  const url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({ url: url, params });\n};\n\n/**\n * 删除通告\n * @param params\n */\nexport const deleteNotice = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.delete, data: params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 置顶编辑\n * @param params\n */\nexport const editIzTop = (params, handleSuccess) => {\n  return defHttp.post({ url: Api.editIzTop, data: params }).then(() => {\n    handleSuccess();\n  });\n};\n\n/**\n * 批量消息公告\n * @param params\n */\nexport const batchDeleteNotice = (params) => defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true });\n\n/**\n * 发布\n * @param id\n */\nexport const doReleaseData = (params) => defHttp.get({ url: Api.releaseData, params });\n/**\n * 撤销\n * @param id\n */\nexport const doReovkeData = (params) => defHttp.get({ url: Api.reovkeData, params });\n/**\n * 新增访问量\n * @param id\n */\nexport const addVisitsNum = (params) => defHttp.get({ url: Api.addVisitsNum, params }, { successMessageMode: 'none' });\n/**\n * 根据ID查询数据\n * @param id\n */\nexport const queryById = (params) => defHttp.get({ url: Api.queryById, params }, { isTransformResponse: false });\n/**\n * 查询模板列表\n * @param params\n */\nexport const getTempList = (params) => {\n  return defHttp.get({ url: Api.tempList, params });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/notice/notice.data.ts",
    "content": "import { BasicColumn, FormSchema } from '/@/components/Table';\nimport { render } from '/@/utils/common/renderUtils';\nimport { h } from 'vue';\nimport { Tinymce } from '@/components/Tinymce';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '标题',\n    width: 150,\n    dataIndex: 'titile',\n  },\n  {\n    title: '消息类型',\n    dataIndex: 'msgCategory',\n    width: 100,\n    customRender: ({ text }) => {\n      return render.renderDict(text, 'msg_category');\n    },\n  },\n  {\n    title: '发布人',\n    width: 100,\n    dataIndex: 'sender_dictText',\n  },\n  {\n    title: '优先级',\n    dataIndex: 'priority',\n    width: 70,\n    customRender: ({ text }) => {\n      const color = text == 'L' ? 'blue' : text == 'M' ? 'yellow' : 'red';\n      return render.renderTag(render.renderDict(text, 'priority'), color);\n    },\n  },\n  {\n    title: '通告对象',\n    dataIndex: 'msgType',\n    width: 100,\n    customRender: ({ text }) => {\n      return render.renderDict(text, 'msg_type');\n    },\n  },\n  {\n    title: '发布状态',\n    dataIndex: 'sendStatus',\n    width: 70,\n    customRender: ({ text }) => {\n      const color = text == '0' ? 'red' : text == '1' ? 'green' : 'gray';\n      return render.renderTag(render.renderDict(text, 'send_status'), color);\n    },\n  },\n  {\n    title: '发布时间',\n    width: 100,\n    dataIndex: 'sendTime',\n  },\n  {\n    title: '撤销时间',\n    width: 100,\n    dataIndex: 'cancelTime',\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'titile',\n    label: '标题',\n    component: 'JInput',\n    colProps: { span: 6 },\n  },\n  {\n    field: 'msgCategory',\n    label: '消息类型',\n    component: 'JDictSelectTag',\n    defaultValue: '1',\n    componentProps: {\n      dictCode: 'msg_category',\n      placeholder: '请选择类型',\n    },\n    colProps: { span: 6 },\n  },\n  {\n    field: 'msgClassify',\n    label: '公告分类',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'notice_type',\n      placeholder: '请选择公告分类',\n    },\n    colProps: { span: 6 },\n  },\n  {\n    field: 'sendTime',\n    label: '发布时间',\n    component: 'RangePicker',\n    componentProps: {\n      valueType: 'Date',\n    },\n    colProps: { span: 6 },\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    field: 'id',\n    label: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    field: 'msgCategory',\n    label: '消息类型',\n    required: true,\n    component: 'JDictSelectTag',\n    defaultValue: '1',\n    componentProps: {\n      type: 'radio',\n      dictCode: 'msg_category',\n      placeholder: '请选择类型',\n    },\n  },\n  {\n    field: 'izTop',\n    label: '是否置顶',\n    defaultValue: '0',\n    component: 'JSwitch',\n    componentProps: {\n      //取值 options\n      options: ['1', '0'],\n      //文本option\n      labelOptions: ['是', '否'],\n      placeholder: '是否置顶',\n      checkedChildren: '是',\n      unCheckedChildren: '否',\n    },\n  },\n  {\n    field: 'titile',\n    label: '通告标题',\n    component: 'Input',\n    required: true,\n    componentProps: {\n      placeholder: '请输入标题',\n    },\n    // 代码逻辑说明: 【TV360X-1632】标题过长保存报错，长度校验\n    dynamicRules() {\n      return [\n        {\n          validator: (_, value) => {\n            return new Promise<void>((resolve, reject) => {\n              if (value.length > 100) {\n                reject('最长100个字符');\n              }\n              resolve();\n            });\n          },\n        },\n      ];\n    },\n  },\n  {\n    field: 'msgAbstract',\n    label: '通告摘要',\n    component: 'InputTextArea',\n    componentProps: {\n      allowClear: true,\n      autoSize: {\n        minRows: 2,\n        maxRows: 5,\n      },\n    },\n    required: true,\n  },\n  // {\n  //   field: 'endTime',\n  //   label: '截至日期',\n  //   component: 'DatePicker',\n  //   componentProps: {\n  //     showTime: true,\n  //     valueFormat: 'YYYY-MM-DD HH:mm:ss',\n  //     placeholder: '请选择截至日期',\n  //   },\n  //   dynamicRules: ({ model }) => rules.endTime(model.startTime, true),\n  // },\n  {\n    field: 'msgType',\n    label: '接收用户',\n    defaultValue: 'ALL',\n    component: 'JDictSelectTag',\n    required: true,\n    componentProps: {\n      type: 'radio',\n      dictCode: 'msg_type',\n      placeholder: '请选择发布范围',\n    },\n  },\n  {\n    field: 'userIds',\n    label: '指定用户',\n    component: 'JSelectUserByDepartment',\n    required: true,\n    componentProps: {\n      rowKey: 'id',\n      // 代码逻辑说明: 【TV360X-1627】通知公告用户选择组件没翻译\n      labelKey: 'realname',\n    },\n    ifShow: ({ values }) => values.msgType == 'USER',\n  },\n  {\n    field: 'msgClassify',\n    label: '公告分类',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'notice_type',\n      placeholder: '请选择公告分类',\n    },\n  },\n  {\n    field: 'priority',\n    label: '优先级别',\n    defaultValue: 'H',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'priority',\n      type: 'radio',\n      placeholder: '请选择优先级',\n    },\n  },\n  {\n    field: 'izApproval',\n    label: '是否审批',\n    component: 'RadioGroup',\n    defaultValue: '0',\n    componentProps: {\n      options: [\n        {\n          label: '是',\n          value: '1',\n        },\n        {\n          label: '否',\n          value: '0',\n        },\n      ],\n    },\n  },\n  {\n    field: 'msgTemplate',\n    label: '公告模版',\n    component: 'Input',\n    slot: 'msgTemplate',\n  },\n  {\n    field: 'files',\n    label: '通告附件',\n    component: 'JUpload',\n    componentProps: {\n      //是否显示选择按钮\n      text: '文件上传',\n      //最大上传数\n      maxCount: 20,\n      //是否显示下载按钮\n      download: true,\n    },\n  },\n  {\n    field: 'msgContent',\n    label: '通告内容',\n    component: 'Input',\n    colProps: { span: 24 },\n    render: render.renderTinymce,\n  },\n];\n\n/**\n * 流程表单调用这个方法获取formSchema\n * @param param\n */\nexport function getBpmFormSchema(_formData): FormSchema[] {\n  // 默认和原始表单保持一致 如果流程中配置了权限数据，这里需要单独处理formSchema\n  return [\n    {\n      field: 'id',\n      label: 'id',\n      component: 'Input',\n      show: false,\n    },\n    {\n      field: 'msgCategory',\n      label: '消息类型',\n      required: true,\n      component: 'JDictSelectTag',\n      defaultValue: '1',\n      componentProps: {\n        type: 'radio',\n        dictCode: 'msg_category',\n        placeholder: '请选择类型',\n      },\n    },\n    {\n      field: 'izTop',\n      label: '是否置顶',\n      defaultValue: '0',\n      component: 'JSwitch',\n      componentProps: {\n        //取值 options\n        options: ['1', '0'],\n        //文本option\n        labelOptions: ['是', '否'],\n        placeholder: '是否置顶',\n        checkedChildren: '是',\n        unCheckedChildren: '否',\n      },\n    },\n    {\n      field: 'titile',\n      label: '通告标题',\n      component: 'Input',\n      required: true,\n      componentProps: {\n        placeholder: '请输入标题',\n      },\n      // 代码逻辑说明: 【TV360X-1632】标题过长保存报错，长度校验\n      dynamicRules() {\n        return [\n          {\n            validator: (_, value) => {\n              return new Promise<void>((resolve, reject) => {\n                if (value.length > 100) {\n                  reject('最长100个字符');\n                }\n                resolve();\n              });\n            },\n          },\n        ];\n      },\n    },\n    {\n      field: 'msgAbstract',\n      label: '通告摘要',\n      component: 'InputTextArea',\n      required: true,\n    },\n    {\n      field: 'msgType',\n      label: '接收用户',\n      defaultValue: 'ALL',\n      component: 'JDictSelectTag',\n      required: true,\n      componentProps: {\n        type: 'radio',\n        dictCode: 'msg_type',\n        placeholder: '请选择发布范围',\n      },\n    },\n    {\n      field: 'userIds',\n      label: '指定用户',\n      component: 'JSelectUserByDepartment',\n      required: true,\n      componentProps: {\n        rowKey: 'id',\n        // 代码逻辑说明: 【TV360X-1627】通知公告用户选择组件没翻译\n        labelKey: 'realname',\n      },\n      ifShow: ({ values }) => values.msgType == 'USER',\n    },\n    {\n      field: 'msgClassify',\n      label: '公告分类',\n      component: 'JDictSelectTag',\n      componentProps: {\n        dictCode: 'notice_type',\n        placeholder: '请选择公告分类',\n      },\n    },\n    {\n      field: 'priority',\n      label: '优先级别',\n      defaultValue: 'H',\n      component: 'JDictSelectTag',\n      componentProps: {\n        dictCode: 'priority',\n        type: 'radio',\n        placeholder: '请选择优先级',\n      },\n    },\n    {\n      field: 'msgTemplate',\n      label: '公告模版',\n      component: 'Input',\n      slot: 'msgTemplate',\n    },\n    {\n      field: 'files',\n      label: '通告附件',\n      component: 'JUpload',\n      componentProps: {\n        //是否显示选择按钮\n        text: '文件上传',\n        //最大上传数\n        maxCount: 2,\n        //是否显示下载按钮\n        download: true,\n      },\n    },\n    {\n      field: 'msgContent',\n      label: '通告内容',\n      component: 'Input',\n      colProps: { span: 24 },\n      ifShow: ({}) => _formData.disabled == false,\n      render: ({ model, field }) => {\n        return h(Tinymce, {\n          showImageUpload: false,\n          disabled: _formData.disabled !== false,\n          height: 300,\n          value: model[field],\n          onChange: (value: string) => {\n            model[field] = value;\n          },\n        });\n      },\n    },\n    {\n      field: 'msgContent',\n      label: '通告内容',\n      component: 'Input',\n      colProps: { span: 24 },\n      ifShow: ({}) => _formData.disabled !== false,\n      slot: 'msgContent',\n    },\n  ];\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/onlineuser/OnlineUser.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\n\nenum Api {\n  list = '/sys/online/list',\n  forceLogout = '/sys/online/forceLogout'\n}\n\n/**\n * 列表\n * @param params\n */\nexport const list = (params) => defHttp.get({ url: Api.list, params });\n\n/**\n * 批量删除角色\n * @param params\n */\nexport const forceLogout = (params) => {\n  return defHttp.post({url:Api.forceLogout,params},{isTransformResponse:false})\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/onlineuser/OnlineUser.data.ts",
    "content": "import { FormSchema } from '/@/components/Table';\nimport { render } from \"/@/utils/common/renderUtils\";\nimport { getToken } from '/@/utils/auth';\n\n//列表\nexport const columns = [\n  {\n    title:'用户账号',\n    align:\"center\",\n    dataIndex: 'username',\n    customRender: ( {text,record} ) => {\n      let token = getToken();\n      if(record.token === token) {\n        return text + '（我）'\n      }\n      return text\n    },\n  },{\n    title:'用户姓名',\n    align:\"center\",\n    dataIndex: 'realname'\n  },{\n    title: '头像',\n    align: \"center\",\n    width: 120,\n    dataIndex: 'avatar',\n    customRender: render.renderAvatar,\n  },{\n    title:'生日',\n    align:\"center\",\n    dataIndex: 'birthday'\n  },{\n    title: '性别',\n    align: \"center\",\n    dataIndex: 'sex',\n    customRender: ({text}) => {\n      return render.renderDict(text, 'sex');\n    }\n  },{\n    title:'手机号',\n    align:\"center\",\n    dataIndex: 'phone'\n  }\n];\n\n//查询区域\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'username',\n    label: '用户账号',\n    component: 'Input',\n    colProps: { span: 6 },\n  }\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/onlineuser/OnlineUserList.vue",
    "content": "<template>\n  <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n    <template #action=\"{ record }\">\n      <TableAction :actions=\"getTableAction(record)\" />\n    </template>\n  </BasicTable>\n</template>\n\n<script lang=\"ts\" name=\"online-user\" setup>\nimport { BasicTable, TableAction } from '/@/components/Table';\nimport { columns, searchFormSchema } from './OnlineUser.data';\nimport { list, forceLogout } from './OnlineUser.api';\nimport { useListPage } from '/@/hooks/system/useListPage';\nimport { useMessage } from \"/@/hooks/web/useMessage\";\n// 列表页面公共参数、方法\nconst { prefixCls, tableContext, onImportXls, onExportXls } = useListPage({\n  designScope: 'online-user',\n  tableProps: {\n    //在线用户rowKey默认id会造成key重复，导致页面出现重复数据\n    rowKey:'token',\n    title: '在线用户',\n    api: list,\n    columns: columns,\n    formConfig: {\n      schemas: searchFormSchema,\n    },\n    actionColumn: {\n      width: 120,\n    },\n    rowSelection: null,\n  },\n});\nconst [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;\nconst $message = useMessage();\n\n//操作栏\nfunction getTableAction(record) {\n  return [\n    {\n      label: '强退',\n      popConfirm: {\n        title: '强制退出用户？',\n        confirm: handleForce.bind(null, record),\n      },\n    },\n  ];\n}\n\n/**\n * 强退\n * @param record\n */\nfunction handleForce(record) {\n   forceLogout({ token: record.token }).then((res)=>{\n     if(res.success){\n       reload();\n       $message.createMessage.success('强制退出用户”'+record.realname+'“成功！');\n     }else{\n       $message.createMessage.warn(res.message);\n     }\n   })\n}\n</script>\n\n<style scoped>\n\n</style>"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/ossfile/index.vue",
    "content": "<template>\n  <div>\n    <!--引用表格-->\n    <BasicTable @register=\"registerTable\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-upload name=\"file\" :showUploadList=\"false\" :action=\"ossAction\" :headers=\"tokenHeader\" :beforeUpload=\"beforeUpload\" @change=\"handleChange\">\n          <a-button type=\"primary\" preIcon=\"ant-design:upload-outlined\">OSS文件上传</a-button>\n        </a-upload>\n        <a-upload\n          name=\"file\"\n          :showUploadList=\"false\"\n          :action=\"minioAction\"\n          :headers=\"tokenHeader\"\n          :beforeUpload=\"beforeUpload\"\n          @change=\"handleChange\"\n        >\n          <a-button type=\"primary\" preIcon=\"ant-design:upload-outlined\">MINIO文件上传</a-button>\n        </a-upload>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n    </BasicTable>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"system-ossfile\" setup>\n  //ts语法\n  import { ref, computed, unref } from 'vue';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { columns, searchFormSchema } from './ossfile.data';\n  import { list, deleteFile, getOssUrl, getMinioUrl } from './ossfile.api';\n  import { useGlobSetting } from '/@/hooks/setting';\n  import { getToken } from '/@/utils/auth';\n  import {encryptByBase64} from \"@/utils/cipher\";\n\n  const { createMessage } = useMessage();\n  const glob = useGlobSetting();\n  const tokenHeader = { 'X-Access-Token': getToken() };\n  //注册table数据\n  const [registerTable, { reload }] = useTable({\n    api: list,\n    rowKey: 'id',\n    columns,\n    formConfig: {\n      labelWidth: 120,\n      schemas: searchFormSchema,\n      autoSubmitOnEnter: true,\n    },\n    striped: true,\n    useSearchForm: true,\n    showTableSetting: true,\n    clickToRowSelect: false,\n    bordered: true,\n    showIndexColumn: false,\n    tableSetting: { fullScreen: true },\n    beforeFetch: (params) => {\n      return Object.assign({ column: 'createTime', order: 'desc' }, params);\n    },\n    actionColumn: {\n      width: 80,\n      title: '操作',\n      dataIndex: 'action',\n      slots: { customRender: 'action' },\n      fixed: undefined,\n    },\n  });\n  /**\n   * 上传url\n   */\n  const ossAction = computed(() => `${glob.uploadUrl}${getOssUrl}`);\n  const minioAction = computed(() => `${glob.uploadUrl}${getMinioUrl}`);\n\n  /**\n   * 预览\n   */\n  function handleView(record) {\n    if (record && record.url) {\n      console.log('glob.onlineUrl', glob.viewUrl);\n      // let filePath = encodeURIComponent(record.url);\n      let url = encodeURIComponent(encryptByBase64(record.url));\n      // //文档采用pdf预览高级模式\n      // if(filePath.endsWith(\".pdf\") || filePath.endsWith(\".doc\") || filePath.endsWith(\".docx\")){\n      //   filePath = filePath\n      // }\n      let previewUrl = `${glob.viewUrl}?url=` + url;\n      \n      window.open(previewUrl, '_blank');\n    }\n  }\n\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteFile({ id: record.id }, reload);\n  }\n\n  /**\n   * 上传前事件\n   */\n  function beforeUpload(file) {\n    var fileType = file.type;\n    if (fileType === 'image') {\n      if (fileType.indexOf('image') < 0) {\n        createMessage.warning('请上传图片');\n        return false;\n      }\n    } else if (fileType === 'file') {\n      if (fileType.indexOf('image') >= 0) {\n        createMessage.warning('请上传文件');\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * 文件上传事件\n   */\n  function handleChange(info) {\n    if (info.file.status === 'done') {\n      if (info.file.response.success) {\n        reload();\n        createMessage.success(`${info.file.name} 上传成功!`);\n      } else {\n        createMessage.error(`${info.file.response.message}`);\n      }\n    } else if (info.file.status === 'error') {\n      createMessage.error(`${info.file.response.message}`);\n    }\n  }\n\n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '预览',\n        onClick: handleView.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/ossfile/ossfile.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\n\nenum Api {\n  list = '/sys/oss/file/list',\n  deleteFile = '/sys/oss/file/delete',\n  ossUpload = '/sys/oss/file/upload',\n  minioUpload = '/sys/upload/uploadMinio',\n}\n\n/**\n * oss上传\n * @param params\n */\nexport const getOssUrl = Api.ossUpload;\n/**\n * minio上传\n * @param params\n */\nexport const getMinioUrl = Api.minioUpload;\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) => defHttp.get({ url: Api.list, params });\n\n/**\n * 删除用户\n */\nexport const deleteFile = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.deleteFile, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/ossfile/ossfile.data.ts",
    "content": "import { BasicColumn } from '/@/components/Table';\nimport { FormSchema } from '/@/components/Table';\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '文件名称',\n    dataIndex: 'fileName',\n    width: 120,\n  },\n  {\n    title: '文件地址',\n    dataIndex: 'url',\n    width: 100,\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    label: '文件名称',\n    field: 'fileName',\n    component: 'Input',\n    colProps: { span: 6 },\n  },\n  {\n    label: '文件地址',\n    field: 'url',\n    component: 'Input',\n    colProps: { span: 6 },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/position/PositionModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"getTitle\" @ok=\"handleSubmit\" :width=\"700\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { formSchema } from './position.data';\n  import { saveOrUpdatePosition, getPositionById } from './position.api';\n  // 声明Emits\n  const emit = defineEmits(['success', 'register']);\n  const isUpdate = ref(true);\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n    //labelWidth: 150,\n    schemas: formSchema,\n    showActionButtonGroup: false,\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false });\n    isUpdate.value = !!data?.isUpdate;\n    if (unref(isUpdate)) {\n      //获取详情\n      data.record = await getPositionById({ id: data.record.id });\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n    }\n  });\n  //设置标题\n  const getTitle = computed(() => (!unref(isUpdate) ? '新增职务级别' : '编辑职务级别'));\n  //表单提交事件\n  async function handleSubmit() {\n    try {\n      const values = await validate();\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      await saveOrUpdatePosition(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n<style lang=\"less\" scoped>\n  :deep(.ant-input-number){\n    width: 100%;\n  }\n</style>"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/position/TenantPositionList.vue",
    "content": "<template>\n  <div>\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <template #tableTitle>\n        <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"handleAdd\">新增</a-button>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button\n            >批量操作\n            <Icon icon=\"ant-design:down-outlined\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getActions(record)\" />\n      </template>\n    </BasicTable>\n    <PositionModal @register=\"registerModal\" @success=\"reload\" />\n  </div>\n</template>\n<script lang=\"ts\" name=\"TenantPositionList\" setup>\n  import { onMounted } from 'vue';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import { getPositionList, deletePosition, batchDeletePosition, getExportUrl, getImportUrl } from './position.api';\n  import { columns, searchFormSchema } from './position.data';\n  import PositionModal from './PositionModal.vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { tenantSaasMessage } from '@/utils/common/compUtils';\n  import { getTenantId } from '@/utils/auth';\n  const [registerModal, { openModal }] = useModal();\n\n  // 列表页面公共参数、方法\n  const { onExportXls, onImportXls, tableContext } = useListPage({\n    tableProps: {\n      title: '租户职务列表',\n      api: getPositionList,\n      columns: columns,\n      formConfig: {\n        schemas: searchFormSchema,\n      },\n      actionColumn: {\n        width: 180,\n      },\n      showIndexColumn: true,\n      defSort: {\n        column: '',\n        order: '',\n      },\n      beforeFetch(params) {\n        return Object.assign({ tenantId: getTenantId() }, params);\n      },\n    },\n    exportConfig: {\n      name: '租户职务列表',\n      url: getExportUrl,\n    },\n    importConfig: {\n      url: getImportUrl,\n    },\n  });\n\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;\n\n  /**\n   * 操作列定义\n   * @param record\n   */\n  function getActions(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n\n  /**\n   * 新增事件\n   */\n  function handleAdd() {\n    openModal(true, {\n      isUpdate: false,\n    });\n  }\n\n  /**\n   * 编辑事件\n   */\n  function handleEdit(record) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deletePosition({ id: record.id }, reload);\n  }\n\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDeletePosition({ ids: selectedRowKeys.value }, () => {\n      selectedRowKeys.value = [];\n      reload();\n    });\n  }\n\n  onMounted(() => {\n    //提示信息\n    tenantSaasMessage('租户职务');\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/position/index.vue",
    "content": "<template>\n  <div>\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <template #tableTitle>\n        <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"handleAdd\">新增</a-button>\n        <a-button type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n        <j-upload-button type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button\n            >批量操作\n            <Icon icon=\"ant-design:down-outlined\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getActions(record)\" />\n      </template>\n    </BasicTable>\n    <PositionModal @register=\"registerModal\" @success=\"reload\" />\n  </div>\n</template>\n<script lang=\"ts\" name=\"system-position\" setup>\n  import { ref } from 'vue';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import { getPositionList, deletePosition, batchDeletePosition, customUpload, getExportUrl, getImportUrl } from './position.api';\n  import { columns, searchFormSchema } from './position.data';\n  import PositionModal from './PositionModal.vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  const { createMessage } = useMessage();\n  const [registerModal, { openModal }] = useModal();\n\n  // 列表页面公共参数、方法\n  const { prefixCls, onExportXls, onImportXls, tableContext } = useListPage({\n    designScope: 'position-template',\n    tableProps: {\n      title: '职务列表',\n      api: getPositionList,\n      columns: columns,\n      formConfig: {\n        schemas: searchFormSchema,\n      },\n      actionColumn: {\n        width: 180,\n      },\n      showIndexColumn: true,\n      defSort: {\n        column: \"\",\n        order: \"\"\n      }\n    },\n    exportConfig: {\n      name: '职务列表',\n      url: getExportUrl,\n    },\n    importConfig: {\n      url: getImportUrl,\n    },\n  });\n\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;\n\n  /**\n   * 操作列定义\n   * @param record\n   */\n  function getActions(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n\n  /**\n   * 新增事件\n   */\n  function handleAdd() {\n    openModal(true, {\n      isUpdate: false,\n    });\n  }\n\n  /**\n   * 编辑事件\n   */\n  function handleEdit(record) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deletePosition({ id: record.id }, reload);\n  }\n\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDeletePosition({ ids: selectedRowKeys.value }, () => {\n      // 代码逻辑说明: 【QQYUN-8334】批量删除之后，按钮未隐藏，选中记录还在\n      selectedRowKeys.value = [];\n      reload();\n    });\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/position/position.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { Modal } from 'ant-design-vue';\n\nenum Api {\n  list = '/sys/position/list',\n  save = '/sys/position/add',\n  edit = '/sys/position/edit',\n  get = '/sys/position/queryById',\n  delete = '/sys/position/delete',\n  importExcel = '/sys/position/importExcel',\n  exportXls = '/sys/position/exportXls',\n  deleteBatch = '/sys/position/deleteBatch',\n}\n/**\n * 导出api\n */\nexport const getExportUrl = Api.exportXls;\n\nexport const getImportUrl = Api.importExcel;\n/**\n * 查询列表\n * @param params\n */\nexport const getPositionList = (params) => {\n  return defHttp.get({ url: Api.list, params });\n};\n\n/**\n * 保存或者更新\n * @param params\n */\nexport const saveOrUpdatePosition = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({ url: url, params });\n};\n\n/**\n * 查询详情\n * @param params\n */\nexport const getPositionById = (params) => {\n  return defHttp.get({ url: Api.get, params });\n};\n\n/**\n * 单条删除\n * @param params\n */\nexport const deletePosition = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.delete, data: params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n\n/**\n * 批量删除\n * @param params\n */\nexport const batchDeletePosition = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n\n/**\n * 自定义上传\n * @param customUpload\n */\nexport const customUpload = (params) => {\n  defHttp.uploadFile({ url: Api.importExcel }, params);\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/position/position.data.ts",
    "content": "import { BasicColumn, FormSchema } from '/@/components/Table';\nimport { rules } from '/@/utils/helper/validator';\n\nexport const columns: BasicColumn[] = [\n  // {\n  //   title: '职务编码',\n  //   dataIndex: 'code',\n  //   width: 200,\n  //   align: 'left',\n  // },\n  {\n    title: '职务级别名称',\n    dataIndex: 'name',\n    align: 'left'\n    // width: 200,\n  },\n  {\n    title: '职务级别(越小级别越高)',\n    dataIndex: 'postLevel',\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'name',\n    label: '职务级别名称',\n    component: 'Input',\n    colProps: { span: 8 },\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    label: '主键',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    field: 'name',\n    label: '职务级别名称',\n    component: 'Input',\n    required: true,\n  },\n  {\n    label: '职务级别',\n    field: 'postLevel',\n    component: 'InputNumber',\n    required: true,\n    componentProps: {\n      min: 1,\n      max: 99\n    },\n    dynamicRules: ({ model, schema }) => {\n      return [{ required: true, message: '请输入职务级别!' }];\n    },\n  },\n  // {\n  //   field: 'code',\n  //   label: '职务编码',\n  //   component: 'Input',\n  //   required: true,\n  //   dynamicDisabled: ({ values }) => {\n  //     return !!values.id;\n  //   },\n  //   dynamicRules: ({ model, schema }) => {\n  //     return rules.duplicateCheckRule('sys_position', 'code', model, schema, true);\n  //   },\n  // },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/role/TenantRoleList.vue",
    "content": "<template>\n  <BasicTable @register=\"registerTable\">\n    <template #tableTitle>\n      <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"handleCreate\"> 新增</a-button>\n      <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n        <template #overlay>\n          <a-menu>\n            <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n              <Icon icon=\"ant-design:delete-outlined\"></Icon>\n              删除\n            </a-menu-item>\n          </a-menu>\n        </template>\n        <a-button\n          >批量操作\n          <Icon icon=\"mdi:chevron-down\"></Icon>\n        </a-button>\n      </a-dropdown>\n      <div style=\"margin-left: 10px;margin-top: 5px\">当前登录租户: <span class=\"tenant-name\">{{loginTenantName}}</span> </div>\n    </template>\n    <template #action=\"{ record }\">\n      <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\" />\n    </template>\n  </BasicTable>\n  <!--角色用户表格-->\n  <RoleUserTable @register=\"roleUserDrawer\" :disableUserEdit=\"true\"/>\n  <!--角色编辑抽屉-->\n  <RoleDrawer @register=\"registerDrawer\" @success=\"reload\" :showFooter=\"showFooter\" />\n  <!--角色详情-->\n  <RoleDesc @register=\"registerDesc\"></RoleDesc>\n</template>\n<script lang=\"ts\" name=\"tenant-role-list\" setup>\n  import { onMounted, ref } from 'vue';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useDrawer } from '/@/components/Drawer';\n  import { useModal } from '/@/components/Modal';\n  import RoleDesc from './components/RoleDesc.vue';\n  import RoleDrawer from './components/RoleDrawer.vue';\n  import RoleUserTable from './components/RoleUserTable.vue';\n  import { columns, searchFormSchema } from './role.data';\n  import { listByTenant, deleteRole, batchDeleteRole, getExportUrl, getImportUrl } from './role.api';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { getLoginTenantName } from \"/@/views/system/tenant/tenant.api\";\n  import { tenantSaasMessage } from \"@/utils/common/compUtils\";\n  \n  const showFooter = ref(true);\n  const [roleUserDrawer, { openDrawer: openRoleUserDrawer }] = useDrawer();\n  const [registerDrawer, { openDrawer }] = useDrawer();\n  const [registerModal, { openModal }] = useModal();\n  const [registerDesc, { openDrawer: openRoleDesc }] = useDrawer();\n  \n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext, onImportXls, onExportXls } = useListPage({\n    designScope: 'role-template',\n    tableProps: {\n      title: '租户角色列表',\n      api: listByTenant,\n      columns: columns,\n      formConfig: {\n        schemas: searchFormSchema,\n      },\n      actionColumn: {\n        width: 120,\n      },\n      rowSelection: null,\n      //自定义默认排序\n      defSort: {\n        column: 'id',\n        order: 'desc',\n      },\n    },\n    exportConfig: {\n      name: '角色列表',\n      url: getExportUrl,\n    },\n    importConfig: {\n      url: getImportUrl,\n    },\n  });\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;\n\n  /**\n   * 新增\n   */\n  function handleCreate() {\n    showFooter.value = true;\n    openDrawer(true, {\n      isUpdate: false,\n    });\n  }\n  /**\n   * 编辑\n   */\n  function handleEdit(record: Recordable) {\n    showFooter.value = true;\n    openDrawer(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n  /**\n   * 详情\n   */\n  function handleDetail(record) {\n    showFooter.value = false;\n    openRoleDesc(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteRole({ id: record.id }, reload);\n  }\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDeleteRole({ ids: selectedRowKeys.value }, reload);\n  }\n  /**\n   * 角色用户\n   */\n  function handleUser(record) {\n    //onSelectChange(selectedRowKeys)\n    openRoleUserDrawer(true, record);\n  }\n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '用户',\n        onClick: handleUser.bind(null, record),\n      },\n    ];\n  }\n\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n\n  const loginTenantName = ref<string>('');\n  \n  getTenantName();\n  \n  async function getTenantName(){\n    loginTenantName.value = await getLoginTenantName();\n  }\n\n  onMounted(()=>{\n    tenantSaasMessage('租户角色')\n  })\n</script>\n\n<style scoped lang=\"less\">\n  .tenant-name{\n    text-decoration:underline;\n    margin: 5px;\n    font-size: 15px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/role/components/RoleDataRuleDrawer.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"$attrs\" @register=\"registerDrawer\" title=\"数据规则配置\" width=\"450px\" destroyOnClose>\n    <a-tabs defaultActiveKey=\"1\">\n      <a-tab-pane tab=\"数据规则\" key=\"1\">\n        <a-checkbox-group v-model:value=\"dataRuleChecked\" v-if=\"dataRuleList.length > 0\">\n          <a-row>\n            <a-col :span=\"24\" v-for=\"(item, index) in dataRuleList\" :key=\"'dr' + index\">\n              <a-checkbox :value=\"item.id\">{{ item.ruleName }}</a-checkbox>\n            </a-col>\n\n            <a-col :span=\"24\">\n              <div style=\"width: 100%; margin-top: 15px\">\n                <a-button @click=\"saveDataRuleForRole\" type=\"primary\" size=\"small\"> <Icon icon=\"ant-design:save-outlined\"></Icon>点击保存</a-button>\n              </div>\n            </a-col>\n          </a-row>\n        </a-checkbox-group>\n        <div v-else><h3>无配置信息!</h3></div>\n      </a-tab-pane>\n    </a-tabs>\n  </BasicDrawer>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, unref } from 'vue';\n  import { BasicDrawer, useDrawerInner } from '/src/components/Drawer';\n  import { useMessage } from '/src/hooks/web/useMessage';\n  import { queryDataRule, saveDataRule } from '../role.api';\n  // 声明Emits\n  const emit = defineEmits(['success', 'register']);\n  const { createMessage } = useMessage();\n  // 声明数据\n  const functionId = ref('');\n  const roleId = ref('');\n  const dataRuleList = ref([]);\n  const dataRuleChecked = ref([]);\n\n  /**\n   * 数据\n   */\n  const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {\n    await reset();\n    setDrawerProps({ confirmLoading: false });\n    //权限的id\n    functionId.value = data.functionId;\n    //角色的id\n    roleId.value = data.roleId;\n    //查询数据\n    const res = await queryDataRule({ functionId: unref(functionId), roleId: unref(roleId) });\n    if (res.success) {\n      dataRuleList.value = res.result.datarule;\n      if (res.result.drChecked) {\n        dataRuleChecked.value = res.result.drChecked.split(',');\n      }\n    }\n  });\n\n  /**\n   * 重置\n   */\n  function reset() {\n    functionId.value = '';\n    roleId.value = '';\n    dataRuleList.value = [];\n    dataRuleChecked.value = [];\n  }\n\n  /**\n   * 提交\n   */\n  async function saveDataRuleForRole() {\n    if (!unref(dataRuleChecked) || unref(dataRuleChecked).length == 0) {\n      createMessage.warning('请注意，现未勾选任何数据权限!');\n    }\n    let params = {\n      permissionId: unref(functionId),\n      roleId: unref(roleId),\n      dataRuleIds: unref(dataRuleChecked).join(','),\n    };\n    await saveDataRule(params);\n    //关闭弹窗\n    closeDrawer();\n    //刷新列表\n    emit('success');\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/role/components/RoleDesc.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"$attrs\" @register=\"registerDrawer\" title=\"角色详情\" width=\"500px\" destroyOnClose>\n    <Description :column=\"1\" :data=\"roleData\" :schema=\"formDescSchema\" />\n  </BasicDrawer>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, useAttrs } from 'vue';\n  import { BasicDrawer, useDrawerInner } from '/src/components/Drawer';\n  import { formDescSchema } from '../role.data';\n  import { Description, useDescription } from '/@/components/Description/index';\n  const emit = defineEmits(['register']);\n  const attrs = useAttrs();\n  const roleData = ref({});\n  const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {\n    setDrawerProps({ confirmLoading: false });\n    roleData.value = data.record;\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/role/components/RoleDrawer.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"$attrs\" @register=\"registerDrawer\" :title=\"getTitle\" width=\"500px\" @ok=\"handleSubmit\" destroyOnClose>\n    <BasicForm @register=\"registerForm\" />\n  </BasicDrawer>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed, unref, useAttrs } from 'vue';\n  import { BasicForm, useForm } from '/src/components/Form';\n  import { BasicDrawer, useDrawerInner } from '/src/components/Drawer';\n  import { BasicTree, TreeItem } from '/src/components/Tree';\n  import { formSchema } from '../role.data';\n  import { saveOrUpdateRole } from '../role.api';\n  // 声明Emits\n  const emit = defineEmits(['success', 'register']);\n  const attrs = useAttrs();\n  const isUpdate = ref(true);\n  const [registerForm, { setProps, resetFields, setFieldsValue, validate }] = useForm({\n    labelWidth: 90,\n    schemas: formSchema,\n    showActionButtonGroup: false,\n  });\n  const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {\n    resetFields();\n    isUpdate.value = !!data?.isUpdate;\n    setDrawerProps({ confirmLoading: false });\n    if (unref(isUpdate)) {\n      setFieldsValue({\n        ...data.record,\n      });\n    }\n    //禁用表单\n    setProps({ disabled: !attrs.showFooter });\n  });\n  /**\n   * 标题\n   */\n  const getTitle = computed(() => (!unref(isUpdate) ? '新增角色' : '编辑角色'));\n  /**\n   * 提交\n   */\n  async function handleSubmit() {\n    try {\n      const values = await validate();\n      setDrawerProps({ confirmLoading: true });\n      //提交表单\n      await saveOrUpdateRole(values, isUpdate.value);\n      closeDrawer();\n      emit('success');\n    } finally {\n      setDrawerProps({ confirmLoading: false });\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/role/components/RoleIndexModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" title=\"首页配置\" @ok=\"handleSubmit\" width=\"40%\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\n  import { ref, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { roleIndexFormSchema } from '../role.data';\n  import { saveOrUpdateRoleIndex, queryIndexByCode } from '../role.api';\n  // Emits声明\n  const emit = defineEmits(['register', 'success']);\n  const isUpdate = ref(true);\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n    labelWidth: 150,\n    schemas: roleIndexFormSchema,\n    showActionButtonGroup: false,\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false });\n    setFieldsValue({ roleCode: data.roleCode });\n    let res = await queryIndexByCode({ roleCode: data.roleCode });\n    isUpdate.value = !!res.result?.id;\n    if (unref(isUpdate)) {\n      //表单赋值\n      await setFieldsValue({\n        ...res.result,\n      });\n    }\n  });\n\n  //表单提交事件\n  async function handleSubmit(v) {\n    try {\n      let values = await validate();\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      await saveOrUpdateRoleIndex(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success', { isUpdate: isUpdate.value, values });\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/role/components/RolePermissionDrawer.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"$attrs\" @register=\"registerDrawer\" width=\"650px\" destroyOnClose showFooter>\n    <template #title>\n      角色权限配置\n      <a-dropdown>\n        <a-button class=\"more-icon\">\n          更多操作\n          <Icon icon=\"ant-design:down-outlined\" size=\"14px\" style=\"position: relative;top: 1px;right: 5px\"></Icon>\n        </a-button>\n        <template #overlay>\n          <a-menu @click=\"treeMenuClick\">\n            <a-menu-item key=\"checkAll\">选择全部</a-menu-item>\n            <a-menu-item key=\"cancelCheck\">取消选择</a-menu-item>\n            <div class=\"line\"></div>\n            <a-menu-item key=\"openAll\">展开全部</a-menu-item>\n            <a-menu-item key=\"closeAll\">折叠全部</a-menu-item>\n            <div class=\"line\"></div>\n            <a-menu-item key=\"relation\">层级关联</a-menu-item>\n            <a-menu-item key=\"standAlone\">层级独立</a-menu-item>\n          </a-menu>\n        </template>\n      </a-dropdown>\n    </template>\n    <BasicTree\n      ref=\"treeRef\"\n      checkable\n      :treeData=\"treeData\"\n      :checkedKeys=\"checkedKeys\"\n      :expandedKeys=\"expandedKeys\"\n      :selectedKeys=\"selectedKeys\"\n      :clickRowToExpand=\"false\"\n      :checkStrictly=\"true\"\n      title=\"所拥有的的权限\"\n      @check=\"onCheck\"\n      @select=\"onTreeNodeSelect\"\n    >\n      <template #title=\"{ slotTitle, ruleFlag }\">\n        {{ slotTitle }}\n        <Icon v-if=\"ruleFlag\" icon=\"ant-design:align-left-outlined\" style=\"margin-left: 5px; color: red\"></Icon>\n      </template>\n    </BasicTree>\n    <!--右下角按钮-->\n    <template #footer>\n      <!-- <PopConfirmButton title=\"确定放弃编辑？\" @confirm=\"closeDrawer\" okText=\"确定\" cancelText=\"取消\"></PopConfirmButton> -->\n      <a-button @click=\"closeDrawer\">取消</a-button>\n      <a-button @click=\"handleSubmit(false)\" type=\"primary\" :loading=\"loading\" ghost style=\"margin-right: 0.8rem\">仅保存</a-button>\n      <a-button @click=\"handleSubmit(true)\" type=\"primary\" :loading=\"loading\">保存并关闭</a-button>\n    </template>\n    <RoleDataRuleDrawer @register=\"registerDrawer1\" />\n  </BasicDrawer>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed, unref, onMounted } from 'vue';\n  import { BasicDrawer, useDrawer, useDrawerInner } from '/@/components/Drawer';\n  import { BasicTree, TreeItem } from '/@/components/Tree';\n  import { PopConfirmButton } from '/@/components/Button';\n  import RoleDataRuleDrawer from './RoleDataRuleDrawer.vue';\n  import { queryTreeListForRole, queryRolePermission, saveRolePermission } from '../role.api';\n  import { useI18n } from \"/@/hooks/web/useI18n\";\n  import { ROLE_AUTH_CONFIG_KEY } from '/@/enums/cacheEnum';\n  const emit = defineEmits(['register']);\n  //树的信息\n  const treeData = ref<TreeItem[]>([]);\n  //树的全部节点信息\n  const allTreeKeys = ref([]);\n  //树的选择节点信息\n  const checkedKeys = ref<any>([]);\n  const defaultCheckedKeys = ref([]);\n  //树的选中的节点信息\n  const selectedKeys = ref([]);\n  const roleId = ref('');\n  //树的实例\n  const treeRef = ref(null);\n  const loading = ref(false);\n\n  //展开折叠的key\n  const expandedKeys = ref<any>([]);\n  //父子节点选中状态是否关联 true不关联，false关联\n  const checkStrictly = ref<boolean>(false);\n  const [registerDrawer1, { openDrawer: openDataRuleDrawer }] = useDrawer();\n  const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {\n    await reset();\n    setDrawerProps({ confirmLoading: false, loading: true });\n    roleId.value = data.roleId;\n    //初始化数据\n    const roleResult = await queryTreeListForRole();\n    // 代码逻辑说明: 【QQYUN-8355】角色权限配置的菜单翻译\n    treeData.value = translateTitle(roleResult.treeList);\n    allTreeKeys.value = roleResult.ids;\n    const localData = localStorage.getItem(ROLE_AUTH_CONFIG_KEY);\n    if (localData) {\n      const obj = JSON.parse(localData);\n      obj.level && treeMenuClick({ key: obj.level });\n      obj.expand && treeMenuClick({ key: obj.expand });\n    } else {\n      expandedKeys.value = roleResult.ids;\n    }\n    //初始化角色菜单数据\n    const permResult = await queryRolePermission({ roleId: unref(roleId) });\n    checkedKeys.value = permResult;\n    defaultCheckedKeys.value = permResult;\n    setDrawerProps({ loading: false });\n  });\n  /**\n  * 2024-02-28\n  * liaozhiyang\n  * 翻译菜单名称\n   */\n  function translateTitle(data) {\n    if (data?.length) {\n      data.forEach((item) => {\n        if (item.slotTitle) {\n          const { t } = useI18n();\n          if (item.slotTitle.includes(\"t('\") && t) {\n            item.slotTitle = new Function('t', `return ${item.slotTitle}`)(t);\n          }\n        }\n        if (item.children?.length) {\n          translateTitle(item.children);\n        }\n      });\n    }\n    return data;\n  }\n  /**\n   * 点击选中\n   * 2024-04-26\n   * liaozhiyang\n   */\n  function onCheck(o, e) {\n    // checkStrictly: true=>层级独立，false=>层级关联.\n    if (checkStrictly.value) {\n      checkedKeys.value = o.checked ? o.checked : o;\n    } else {\n      const keys = getNodeAllKey(e.node, 'children', 'key');\n      if (e.checked) {\n        // 反复操作下可能会有重复的keys，得用new Set去重下\n        checkedKeys.value = [...new Set([...checkedKeys.value, ...keys])];\n      } else {\n        const result = removeMatchingItems(checkedKeys.value, keys);\n        checkedKeys.value = result;\n      }\n    }\n  }\n  /**\n   * 2024-04-26\n   * liaozhiyang\n   * 删除相匹配数组的项\n   */\n  function removeMatchingItems(arr1, arr2) {\n    // 使用哈希表记录 arr2 中的元素\n    const hashTable = {};\n    for (const item of arr2) {\n      hashTable[item] = true;\n    }\n    // 使用 filter 方法遍历第一个数组，过滤出不在哈希表中存在的项\n    return arr1.filter((item) => !hashTable[item]);\n  }\n  /**\n   * 2024-04-26\n   * liaozhiyang\n   * 获取当前节点及以下所有子孙级的key\n   */\n  function getNodeAllKey(node: any, children: any, key: string) {\n    const result: any = [];\n    result.push(node[key]);\n    const recursion = (data) => {\n      data.forEach((item: any) => {\n        result.push(item[key]);\n        if (item[children]?.length) {\n          recursion(item[children]);\n        }\n      });\n    };\n    node[children]?.length && recursion(node[children]);\n    return result;\n  }\n\n  /**\n   * 选中节点，打开数据权限抽屉\n   */\n  function onTreeNodeSelect(key) {\n    if (key && key.length > 0) {\n      selectedKeys.value = key;\n    }\n    openDataRuleDrawer(true, { functionId: unref(selectedKeys)[0], roleId: unref(roleId) });\n  }\n  /**\n   * 数据重置\n   */\n  function reset() {\n    treeData.value = [];\n    allTreeKeys.value = [];\n    checkedKeys.value = [];\n    defaultCheckedKeys.value = [];\n    selectedKeys.value = [];\n    roleId.value = '';\n  }\n  /**\n   * 获取tree实例\n   */\n  function getTree() {\n    const tree = unref(treeRef);\n    if (!tree) {\n      throw new Error('tree is null!');\n    }\n    return tree;\n  }\n  /**\n   * 提交\n   */\n  async function handleSubmit(exit) {\n    let params = {\n      roleId: unref(roleId),\n      permissionIds: unref(getTree().getCheckedKeys()).join(','),\n      lastpermissionIds: unref(defaultCheckedKeys).join(','),\n    };\n    // 代码逻辑说明: issues/352 VUE角色授权重复保存\n    if(loading.value===false){\n      await doSave(params)\n    }else{\n      console.log('请等待上次执行完毕!');\n    }\n    if(exit){\n      // 如果关闭\n      closeDrawer();\n    }else{\n      // 没有关闭需要重新获取选中数据\n      const permResult = await queryRolePermission({ roleId: unref(roleId) });\n      defaultCheckedKeys.value = permResult;\n    }\n  }\n\n  // VUE角色授权重复保存 #352\n  async function doSave(params) {\n    loading.value = true;\n    try {\n      await saveRolePermission(params);\n    } catch (e) {\n      loading.value = false;\n    }\n    setTimeout(()=>{\n      loading.value = false;\n    }, 500)\n  }\n\n  /**\n   * 树菜单选择\n   * @param key\n   */\n  function treeMenuClick({ key }) {\n    if (key === 'checkAll') {\n      checkedKeys.value = allTreeKeys.value;\n    } else if (key === 'cancelCheck') {\n      checkedKeys.value = [];\n    } else if (key === 'openAll') {\n      expandedKeys.value = allTreeKeys.value;\n      saveLocalOperation('expand', 'openAll');\n    } else if (key === 'closeAll') {\n      expandedKeys.value = [];\n      saveLocalOperation('expand', 'closeAll');\n    } else if (key === 'relation') {\n      checkStrictly.value = false;\n      saveLocalOperation('level', 'relation');\n    } else {\n      checkStrictly.value = true;\n      saveLocalOperation('level', 'standAlone');\n    }\n  }\n  /**\n   * 2024-05-31\n   * liaozhiyang\n   * 【TV360X-590】角色授权弹窗操作缓存\n   * */\n  const saveLocalOperation = (key, value) => {\n    const localData = localStorage.getItem(ROLE_AUTH_CONFIG_KEY);\n    const obj = localData ? JSON.parse(localData) : {};\n    obj[key] = value;\n    localStorage.setItem(ROLE_AUTH_CONFIG_KEY, JSON.stringify(obj))\n  };\n</script>\n\n<style lang=\"less\" scoped>\n  /** 固定操作按钮 */\n  .jeecg-basic-tree {\n    position: absolute;\n    width: 618px;\n  }\n  // 代码逻辑说明: 抽屉弹窗标题图标下拉样式------------\n  .line {\n    height: 1px;\n    width: 100%;\n    border-bottom: 1px solid #f0f0f0;\n  }\n  .more-icon {\n/*    font-size: 20px !important;\n    color: black;\n    display: inline-flex;*/\n    float: right;\n    margin-right: 2px;\n    cursor: pointer;\n  }\n  :deep(.jeecg-tree-header) {\n    border-bottom: none;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/role/components/RoleUserTable.vue",
    "content": "<template>\n  <BasicDrawer @register=\"registerBaseDrawer\" title=\"角色用户\" width=\"800\" destroyOnClose>\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <template #tableTitle>\n        <a-button type=\"primary\" @click=\"handleCreate\" v-if=\"!disableUserEdit\"> 新增用户</a-button>\n        <a-button type=\"primary\" @click=\"handleSelect\"> 已有用户</a-button>\n\n        <a-dropdown v-if=\"checkedKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"bx:bx-unlink\"></Icon>\n                取消关联\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button\n            >批量操作\n            <Icon icon=\"ant-design:down-outlined\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n    </BasicTable>\n    <!--用户操作抽屉-->\n    <UserDrawer @register=\"registerDrawer\" @success=\"handleSuccess\" />\n    <!--用户选择弹窗-->\n    <UseSelectModal @register=\"registerModal\" @select=\"selectOk\" />\n  </BasicDrawer>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, watch, unref } from 'vue';\n  import { BasicTable, useTable, TableAction } from '/src/components/Table';\n  import { BasicDrawer, useDrawer, useDrawerInner } from '/src/components/Drawer';\n  import { useModal } from '/src/components/Modal';\n  import UserDrawer from '../../user/UserDrawer.vue';\n  import UseSelectModal from './UseSelectModal.vue';\n  import { userList, deleteUserRole, batchDeleteUserRole, addUserRole } from '../role.api';\n  import { userColumns, searchUserFormSchema } from '../role.data';\n  import { getUserRoles } from '../../user/user.api';\n\n  const emit = defineEmits(['register', 'hideUserList']);\n  const props = defineProps({\n    disableUserEdit: {type:Boolean,default:false}\n  })\n  \n  const checkedKeys = ref<Array<string | number>>([]);\n  const roleId = ref('');\n  const [registerBaseDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {\n    roleId.value = data.id;\n    setProps({ searchInfo: { roleId: data.id } });\n    reload();\n  });\n  //注册drawer\n  const [registerDrawer, { openDrawer }] = useDrawer();\n  //注册drawer\n  const [registerModal, { openModal }] = useModal();\n  const [registerTable, { reload, updateTableDataRecord, setProps }] = useTable({\n    title: '用户列表',\n    api: userList,\n    columns: userColumns,\n    formConfig: {\n      // 代码逻辑说明: 【QQYUN-5685】3、租户角色下,查询居左显示\n      labelWidth: 60,\n      schemas: searchUserFormSchema,\n      autoSubmitOnEnter: true,\n    },\n    striped: true,\n    useSearchForm: true,\n    showTableSetting: true,\n    clickToRowSelect: false,\n    bordered: true,\n    showIndexColumn: false,\n    // 【issues/1064】列设置的 cacheKey\n    tableSetting: { fullScreen: true, cacheKey: 'role_user_table' },\n    canResize: false,\n    rowKey: 'id',\n    actionColumn: {\n      width: 180,\n      title: '操作',\n      dataIndex: 'action',\n      slots: { customRender: 'action' },\n      fixed: undefined,\n    },\n  });\n\n  /**\n   * 选择列配置\n   */\n  const rowSelection = {\n    type: 'checkbox',\n    columnWidth: 50,\n    selectedRowKeys: checkedKeys,\n    onChange: onSelectChange,\n  };\n\n  /**\n   * 选择事件\n   */\n  function onSelectChange(selectedRowKeys: (string | number)[], selectionRows) {\n    checkedKeys.value = selectedRowKeys;\n  }\n\n  /**\n   * 新增\n   */\n  function handleCreate() {\n    openDrawer(true, {\n      isUpdate: false,\n      selectedroles: [roleId.value],\n      isRole: true,\n    });\n  }\n  /**\n   * 编辑\n   */\n  async function handleEdit(record: Recordable) {\n    try {\n      const userRoles = await getUserRoles({ userid: record.id });\n      if (userRoles && userRoles.length > 0) {\n        record.selectedroles = userRoles;\n      }\n    } catch (e) {\n      console.log(e);\n    }\n    openDrawer(true, {\n      record,\n      isUpdate: true,\n      isRole: true,\n    });\n  }\n\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteUserRole({ userId: record.id, roleId: roleId.value }, reload);\n  }\n\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDeleteUserRole({ userIds: checkedKeys.value.join(','), roleId: roleId.value }, () => {\n      // 代码逻辑说明: 【TV360X-1655】批量取消关联之后清空选中记录\n      reload();\n      checkedKeys.value = [];\n    });\n  }\n\n  /**\n   * 成功回调\n   */\n  function handleSuccess({ isUpdate, values }) {\n    isUpdate ? updateTableDataRecord(values.id, values) : reload();\n  }\n  /**\n   * 选择已有用户\n   */\n  function handleSelect() {\n    openModal(true);\n  }\n  /**\n   * 添加已有用户\n   */\n  async function selectOk(val) {\n    await addUserRole({ roleId: roleId.value, userIdList: val }, reload);\n  }\n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n        ifShow: () => !props.disableUserEdit,\n      },\n      {\n        label: '取消关联',\n        popConfirm: {\n          title: '是否确认取消关联',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n</script>\n\n<style scoped>\n  /*update-begin---author:wangshuai ---date:20230703  for：【QQYUN-5685】3、租户角色下,查询居左显示*/\n  :deep(.ant-form-item-control-input-content){\n    text-align: left;\n  }\n  /*update-end---author:wangshuai ---date:20230703  for：【QQYUN-5685】3、租户角色下,查询居左显示*/\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/role/components/UseSelectModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" title=\"用户选择列表\" width=\"1000px\" @ok=\"handleSubmit\" destroyOnClose @openChange=\"handleOpenChange\">\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, unref, toRaw } from 'vue';\n  import { BasicModal, useModalInner } from '/src/components/Modal';\n  import { BasicTable, useTable, TableAction } from '/src/components/Table';\n  import { userColumns, searchUserFormSchema } from '../role.data';\n  import { list } from '../../user/user.api';\n  // 声明Emits\n  const emit = defineEmits(['select', 'register']);\n  const checkedKeys = ref<Array<string | number>>([]);\n  const [registerModal, { setModalProps, closeModal }] = useModalInner();\n  //注册table数据\n  const [registerTable, { reload }] = useTable({\n    api: list,\n    rowKey: 'id',\n    columns: userColumns,\n    formConfig: {\n      labelWidth: 60,\n      schemas: searchUserFormSchema,\n      baseRowStyle: { maxHeight: '20px' },\n      autoSubmitOnEnter: true,\n    },\n    striped: true,\n    useSearchForm: true,\n    showTableSetting: false,\n    bordered: true,\n    showIndexColumn: false,\n    canResize: false,\n  });\n  /**\n   * 选择列配置\n   */\n  const rowSelection = {\n    type: 'checkbox',\n    columnWidth: 50,\n    selectedRowKeys: checkedKeys,\n    onChange: onSelectChange,\n  };\n  /**\n   * 选择事件\n   */\n  function onSelectChange(selectedRowKeys: (string | number)[]) {\n    checkedKeys.value = selectedRowKeys;\n  }\n\n  const handleOpenChange = (visible) => {\n    // -update-begin--author:liaozhiyang---date:20240702---for：【TV360X-1679】系统角色-角色用户再次打开弹窗重置之前选中的状态\n    if (visible) {\n      checkedKeys.value = [];\n    }\n    // -update-end--author:liaozhiyang---date:20240702---for：【TV360X-1679】系统角色-角色用户再次打开弹窗重置之前选中的状态\n  };\n\n  //提交事件\n  function handleSubmit() {\n    setModalProps({ confirmLoading: true });\n    //关闭弹窗\n    closeModal();\n    //刷新列表\n    emit('select', toRaw(unref(checkedKeys)));\n    setModalProps({ confirmLoading: false });\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/role/index.vue",
    "content": "<template>\n  <BasicTable @register=\"registerTable\">\n    <template #tableTitle>\n      <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"handleCreate\"> 新增</a-button>\n      <a-button type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\"> 导出</a-button>\n      <j-upload-button type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">导入</j-upload-button>\n      <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n        <template #overlay>\n          <a-menu>\n            <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n              <Icon icon=\"ant-design:delete-outlined\"></Icon>\n              删除\n            </a-menu-item>\n          </a-menu>\n        </template>\n        <a-button\n          >批量操作\n          <Icon icon=\"mdi:chevron-down\"></Icon>\n        </a-button>\n      </a-dropdown>\n    </template>\n    <template #action=\"{ record }\">\n      <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\" />\n    </template>\n  </BasicTable>\n  <!--角色用户表格-->\n  <RoleUserTable @register=\"roleUserDrawer\" />\n  <!--角色编辑抽屉-->\n  <RoleDrawer @register=\"registerDrawer\" @success=\"reload\" :showFooter=\"showFooter\" />\n  <!--角色详情-->\n  <RoleDesc @register=\"registerDesc\"></RoleDesc>\n  <!--角色菜单授权抽屉-->\n  <RolePermissionDrawer @register=\"rolePermissionDrawer\" />\n  <!--角色首页配置-->\n  <RoleIndexModal @register=\"registerIndexModal\" />\n</template>\n<script lang=\"ts\" name=\"system-role\" setup>\n  import { ref } from 'vue';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useDrawer } from '/@/components/Drawer';\n  import { useModal } from '/@/components/Modal';\n  import RoleDrawer from './components/RoleDrawer.vue';\n  import RoleDesc from './components/RoleDesc.vue';\n  import RolePermissionDrawer from './components/RolePermissionDrawer.vue';\n  import RoleIndexModal from './components/RoleIndexModal.vue';\n  import RoleUserTable from './components/RoleUserTable.vue';\n  import { columns, searchFormSchema } from './role.data';\n  import { list, deleteRole, batchDeleteRole, getExportUrl, getImportUrl } from './role.api';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  const showFooter = ref(true);\n  const [roleUserDrawer, { openDrawer: openRoleUserDrawer }] = useDrawer();\n  const [registerDrawer, { openDrawer }] = useDrawer();\n  const [registerIndexModal, { openModal: openIndexModal }] = useModal();\n  const [rolePermissionDrawer, { openDrawer: openRolePermissionDrawer }] = useDrawer();\n  const [registerDesc, { openDrawer: openRoleDesc }] = useDrawer();\n\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext, onImportXls, onExportXls } = useListPage({\n    designScope: 'role-template',\n    tableProps: {\n      title: '系统角色列表',\n      api: list,\n      columns: columns,\n      formConfig: {\n        // 代码逻辑说明: 【QQYUN-5873】查询区域lablel默认居左\n        labelWidth:65,\n        rowProps: { gutter: 24 },\n        schemas: searchFormSchema,\n      },\n      actionColumn: {\n        width: 120,\n      },\n      rowSelection: null,\n      //自定义默认排序\n      defSort: {\n        column: 'id',\n        order: 'desc',\n      },\n    },\n    exportConfig: {\n      name: '角色列表',\n      url: getExportUrl,\n    },\n    importConfig: {\n      url: getImportUrl,\n    },\n  });\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;\n\n  /**\n   * 新增\n   */\n  function handleCreate() {\n    showFooter.value = true;\n    openDrawer(true, {\n      isUpdate: false,\n    });\n  }\n  /**\n   * 编辑\n   */\n  function handleEdit(record: Recordable) {\n    showFooter.value = true;\n    openDrawer(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n  /**\n   * 详情\n   */\n  function handleDetail(record) {\n    showFooter.value = false;\n    openRoleDesc(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteRole({ id: record.id }, reload);\n  }\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDeleteRole({ ids: selectedRowKeys.value }, reload);\n  }\n  /**\n   * 角色授权弹窗\n   */\n  function handlePerssion(record) {\n    openRolePermissionDrawer(true, { roleId: record.id });\n  }\n  /**\n   * 首页配置弹窗\n   */\n  function handleIndexConfig(roleCode) {\n    openIndexModal(true, { roleCode });\n  }\n  /**\n   * 角色用户\n   */\n  function handleUser(record) {\n    //onSelectChange(selectedRowKeys)\n    openRoleUserDrawer(true, record);\n  }\n  /**\n   * 操作栏\n   */\n  function getTableAction(record) {\n    return [\n      {\n        label: '用户',\n        onClick: handleUser.bind(null, record),\n      },\n      {\n        label: '授权',\n        onClick: handlePerssion.bind(null, record),\n      },\n    ];\n  }\n\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/role/role.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { Modal } from 'ant-design-vue';\n\nenum Api {\n  list = '/sys/role/list',\n  listByTenant = '/sys/role/listByTenant',\n  save = '/sys/role/add',\n  edit = '/sys/role/edit',\n  deleteRole = '/sys/role/delete',\n  deleteBatch = '/sys/role/deleteBatch',\n  exportXls = '/sys/role/exportXls',\n  importExcel = '/sys/role/importExcel',\n  isRoleExist = '/sys/role/checkRoleCode',\n  queryTreeListForRole = '/sys/role/queryTreeList',\n  queryRolePermission = '/sys/permission/queryRolePermission',\n  saveRolePermission = '/sys/permission/saveRolePermission',\n  queryDataRule = '/sys/role/datarule',\n  getParentDesignList = '/act/process/extActDesignFlowData/getDesFormFlows',\n  getRoleDegisnList = '/joa/designform/designFormCommuse/getRoleDegisnList',\n  saveRoleDesign = '/joa/designform/designFormCommuse/sysRoleDesignAdd',\n  userList = '/sys/user/userRoleList',\n  deleteUserRole = '/sys/user/deleteUserRole',\n  batchDeleteUserRole = '/sys/user/deleteUserRoleBatch',\n  addUserRole = '/sys/user/addSysUserRole',\n  saveRoleIndex = '/sys/sysRoleIndex/add',\n  editRoleIndex = '/sys/sysRoleIndex/edit',\n  queryIndexByCode = '/sys/sysRoleIndex/queryByCode',\n}\n/**\n * 导出api\n */\nexport const getExportUrl = Api.exportXls;\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n/**\n * 系统角色列表\n * @param params\n */\nexport const list = (params) => defHttp.get({ url: Api.list, params });\n/**\n * 租户角色列表\n * @param params\n */\nexport const listByTenant = (params) => defHttp.get({ url: Api.listByTenant, params });\n\n/**\n * 删除角色\n */\nexport const deleteRole = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.deleteRole, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 批量删除角色\n * @param params\n */\nexport const batchDeleteRole = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n/**\n * 保存或者更新角色\n * @param params\n */\nexport const saveOrUpdateRole = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({ url: url, params });\n};\n/**\n * 编码校验\n * @param params\n */\n// 代码逻辑说明: 【QQYUN-7415】表单调用接口进行校验的添加防抖\nlet timer;\nexport const isRoleExist = (params) => {\n  return new Promise((resolve, rejected) => {\n    clearTimeout(timer);\n    timer = setTimeout(() => {\n      defHttp\n        .get({ url: Api.isRoleExist, params }, { isTransformResponse: false })\n        .then((res) => {\n          resolve(res);\n        })\n        .catch((error) => {\n          rejected(error);\n        });\n    }, 500);\n  });\n};\n/**\n * 根据角色查询树信息\n */\nexport const queryTreeListForRole = () => defHttp.get({ url: Api.queryTreeListForRole });\n/**\n * 查询角色权限\n */\nexport const queryRolePermission = (params) => defHttp.get({ url: Api.queryRolePermission, params });\n/**\n * 保存角色权限\n */\nexport const saveRolePermission = (params) => defHttp.post({ url: Api.saveRolePermission, params });\n/**\n * 查询角色数据规则\n */\nexport const queryDataRule = (params) =>\n  defHttp.get({ url: `${Api.queryDataRule}/${params.functionId}/${params.roleId}` }, { isTransformResponse: false });\n/**\n * 保存角色数据规则\n */\nexport const saveDataRule = (params) => defHttp.post({ url: Api.queryDataRule, params });\n/**\n * 获取表单数据\n * @return List<Map>\n */\nexport const getParentDesignList = () => defHttp.get({ url: Api.getParentDesignList });\n/**\n * 获取角色表单数据\n * @return List<Map>\n */\nexport const getRoleDegisnList = (params) => defHttp.get({ url: Api.getRoleDegisnList, params });\n/**\n * 提交角色工单信息\n */\nexport const saveRoleDesign = (params) => defHttp.post({ url: Api.saveRoleDesign, params });\n/**\n * 角色列表接口\n * @param params\n */\nexport const userList = (params) => defHttp.get({ url: Api.userList, params });\n/**\n * 删除角色用户\n */\nexport const deleteUserRole = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.deleteUserRole, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 批量删除角色用户\n * @param params\n */\nexport const batchDeleteUserRole = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.batchDeleteUserRole, params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n/**\n * 添加已有用户\n */\nexport const addUserRole = (params, handleSuccess) => {\n  return defHttp.post({ url: Api.addUserRole, params }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 保存或者更新\n * @param params\n * @param isUpdate 是否是更新数据\n */\nexport const saveOrUpdateRoleIndex = (params, isUpdate) => {\n  let url = isUpdate ? Api.editRoleIndex : Api.saveRoleIndex;\n  return defHttp.post({ url: url, params });\n};\n/**\n * 根据code查询首页配置\n * @param params\n */\nexport const queryIndexByCode = (params) => defHttp.get({ url: Api.queryIndexByCode, params }, { isTransformResponse: false });\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/role/role.data.ts",
    "content": "import { FormSchema } from '/@/components/Table';\nimport { isRoleExist } from './role.api';\nexport const columns = [\n  {\n    title: '角色名称',\n    dataIndex: 'roleName',\n    width: 100,\n  },\n  {\n    title: '角色编码',\n    dataIndex: 'roleCode',\n    width: 100,\n  },\n  {\n    title: '创建时间',\n    dataIndex: 'createTime',\n    width: 100,\n  },\n];\n/**\n * 角色用户Columns\n */\nexport const userColumns = [\n  {\n    title: '用户账号',\n    dataIndex: 'username',\n  },\n  {\n    title: '用户姓名',\n    dataIndex: 'realname',\n  },\n  {\n    title: '状态',\n    dataIndex: 'status_dictText',\n    width: 80,\n  },\n];\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'roleName',\n    label: '角色名称',\n    component: 'Input',\n    colProps: { span: 6 },\n  },\n  {\n    field: 'roleCode',\n    label: '角色编码',\n    component: 'Input',\n    colProps: { span: 6 },\n  },\n];\n/**\n * 角色用户搜索form\n */\nexport const searchUserFormSchema: FormSchema[] = [\n  {\n    field: 'username',\n    label: '用户账号',\n    component: 'Input',\n    colProps: { span: 8 },\n    labelWidth: 74,\n  },\n  {\n    field: 'realname',\n    label: '用户名称',\n    component: 'Input',\n    colProps: { span: 8 },\n    labelWidth: 74,\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    field: 'id',\n    label: '',\n    component: 'Input',\n    show: false,\n  },\n  {\n    field: 'roleName',\n    label: '角色名称',\n    required: true,\n    component: 'Input',\n  },\n  {\n    field: 'roleCode',\n    label: '角色编码',\n    required: true,\n    component: 'Input',\n    dynamicDisabled: ({ values }) => {\n      return !!values.id;\n    },\n    dynamicRules: ({ values, model }) => {\n      console.log('values:', values);\n      return [\n        {\n          required: true,\n          validator: (_, value) => {\n            if (!value) {\n              return Promise.reject('请输入角色编码');\n            }\n            if (values) {\n              return new Promise((resolve, reject) => {\n                isRoleExist({ id: model.id, roleCode: value })\n                  .then((res) => {\n                    res.success ? resolve() : reject(res.message || '校验失败');\n                  })\n                  .catch((err) => {\n                    reject(err.message || '验证失败');\n                  });\n              });\n            }\n            return Promise.resolve();\n          },\n        },\n      ];\n    },\n  },\n  {\n    label: '备注',\n    field: 'description',\n    component: 'InputTextArea',\n  },\n];\n\nexport const formDescSchema = [\n  {\n    field: 'roleName',\n    label: '角色名称',\n  },\n  {\n    field: 'roleCode',\n    label: '角色编码',\n  },\n  {\n    label: '备注',\n    field: 'description',\n  },\n];\n\nexport const roleIndexFormSchema: FormSchema[] = [\n  {\n    field: 'id',\n    label: '',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '角色编码',\n    field: 'roleCode',\n    component: 'Input',\n    dynamicDisabled: true,\n  },\n  {\n    label: '首页路由',\n    field: 'url',\n    component: 'Input',\n    required: true,\n    helpMessage: '首页路由的访问地址',\n  },\n  {\n    label: '组件地址',\n    field: 'component',\n    component: 'Input',\n    helpMessage: '首页路由的组件地址',\n    componentProps: {\n      placeholder: '请输入前端组件',\n    },\n    required: true,\n  },\n  {\n    field: 'route',\n    label: '是否路由菜单',\n    helpMessage: '非路由菜单设置成首页，需开启',\n    component: 'Switch',\n    defaultValue: true\n  },\n  {\n    label: '优先级',\n    field: 'priority',\n    component: 'InputNumber',\n  },\n  {\n    label: '是否开启',\n    field: 'status',\n    component: 'JSwitch',\n    componentProps: {\n      options: ['1', '0'],\n    },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tableWhiteList/SysTableWhiteList.api.ts",
    "content": "import {defHttp} from '/@/utils/http/axios';\nimport {Modal} from 'ant-design-vue';\n\nenum Api {\n  list = '/sys/tableWhiteList/list',\n  save = '/sys/tableWhiteList/add',\n  edit = '/sys/tableWhiteList/edit',\n  deleteOne = '/sys/tableWhiteList/delete',\n  deleteBatch = '/sys/tableWhiteList/deleteBatch',\n  importExcel = '/sys/tableWhiteList/importExcel',\n  exportXls = '/sys/tableWhiteList/exportXls',\n}\n\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n/**\n * 列表接口\n * @param params\n */\nexport const list = (params) =>\n  defHttp.get({url: Api.list, params});\n\n/**\n * 删除单个\n * @param params\n * @param handleSuccess\n */\nexport const deleteOne = (params, handleSuccess) => {\n  return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n}\n/**\n * 批量删除\n * @param params\n * @param handleSuccess\n */\nexport const batchDelete = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({\n        url: Api.deleteBatch,\n        data: params\n      }, {joinParamsToUrl: true}).then(() => {\n        handleSuccess();\n      });\n    }\n  });\n}\n/**\n * 保存或者更新\n * @param params\n * @param isUpdate 是否是更新数据\n */\nexport const saveOrUpdate = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({url: url, params});\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tableWhiteList/SysTableWhiteList.data.ts",
    "content": "import {BasicColumn, FormSchema} from '/@/components/Table';\n\nconst statusOptions = [\n  {label: '禁用', value: '0'},\n  {label: '启用', value: '1'},\n]\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '允许的表名',\n    dataIndex: 'tableName',\n  },\n  {\n    title: '允许的字段名',\n    dataIndex: 'fieldName',\n  },\n  {\n    title: '状态',\n    dataIndex: 'status',\n    customRender({text}) {\n      const find = statusOptions.find(opt => opt.value === text);\n      return find?.label || '未知';\n    }\n  },\n  {\n    title: '创建时间',\n    dataIndex: 'createTime',\n  }\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    label: '允许的表名',\n    field: 'tableName',\n    component: 'Input',\n  },\n  {\n    label: '允许的字段名',\n    field: 'fieldName',\n    component: 'Input',\n  },\n  {\n    label: '状态',\n    field: 'status',\n    component: 'Select',\n    componentProps: {\n      options: statusOptions,\n    },\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {label: '', field: 'id', component: 'Input', show: false},\n  {\n    label: '允许的表名',\n    field: 'tableName',\n    component: 'Input',\n    required: true,\n  },\n  {\n    label: '允许的字段名',\n    field: 'fieldName',\n    component: 'Input',\n    required: true,\n    helpMessage: '多个用逗号分割',\n  },\n  {\n    label: '状态',\n    field: 'status',\n    component: 'Select',\n    defaultValue: '1',\n    componentProps: {\n      options: statusOptions,\n    },\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tableWhiteList/SysTableWhiteListList.vue",
    "content": "<template>\n  <div>\n    <!--引用表格-->\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-button type=\"primary\" @click=\"handleAdd\" preIcon=\"ant-design:plus-outlined\">\n          新增\n        </a-button>\n<!--        <a-button type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\">-->\n<!--          导出-->\n<!--        </a-button>-->\n<!--        <j-upload-button type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\">-->\n<!--          导入-->\n<!--        </j-upload-button>-->\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button>\n            批量操作\n            <Icon icon=\"mdi:chevron-down\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction\n          :actions=\"getTableAction(record)\"\n          :dropDownActions=\"getDropDownAction(record)\"\n        />\n      </template>\n    </BasicTable>\n\n    <!-- 表单区域 -->\n    <SysTableWhiteListModal @register=\"registerModal\" @success=\"handleSuccess\"/>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"ahh-sysTableWhiteList\" setup>\nimport {BasicTable, TableAction} from '/@/components/Table';\nimport {useModal} from '/@/components/Modal';\nimport {useListPage} from '/@/hooks/system/useListPage'\nimport SysTableWhiteListModal from './modules/SysTableWhiteListModal.vue'\nimport {columns, searchFormSchema} from './SysTableWhiteList.data';\nimport {batchDelete, deleteOne, getExportUrl, getImportUrl, list} from './SysTableWhiteList.api';\n\n//注册model\nconst [registerModal, {openModal}] = useModal();\n//注册table数据\nconst {prefixCls, tableContext, onExportXls, onImportXls} = useListPage({\n  tableProps: {\n    title: '系统表白名单',\n    api: list,\n    columns,\n    canResize: false,\n    formConfig: {\n      labelWidth: 120,\n      schemas: searchFormSchema,\n      autoSubmitOnEnter: true,\n      showAdvancedButton: true,\n    },\n    actionColumn: {\n      width: 120,\n    },\n  },\n  exportConfig: {\n    name: \"系统表白名单\",\n    url: getExportUrl,\n  },\n  importConfig: {\n    url: getImportUrl\n  },\n})\n\nconst [registerTable, {reload}, {rowSelection, selectedRowKeys}] = tableContext\n\n/**\n * 新增事件\n */\nfunction handleAdd() {\n  openModal(true, {\n    isUpdate: false,\n    showFooter: true,\n  });\n}\n\n/**\n * 编辑事件\n */\nfunction handleEdit(record: Recordable) {\n  openModal(true, {\n    record,\n    isUpdate: true,\n    showFooter: true,\n  });\n}\n\n/**\n * 详情\n */\nfunction handleDetail(record: Recordable) {\n  openModal(true, {\n    record,\n    isUpdate: true,\n    showFooter: false,\n  });\n}\n\n/**\n * 删除事件\n */\nasync function handleDelete(record) {\n  await deleteOne({id: record.id}, reload);\n}\n\n/**\n * 批量删除事件\n */\nasync function batchHandleDelete() {\n  await batchDelete({ids: selectedRowKeys.value}, reload);\n}\n\n/**\n * 成功回调\n */\nfunction handleSuccess({isUpdate, values}) {\n  reload();\n}\n\n/**\n * 操作栏\n */\nfunction getTableAction(record) {\n  return [\n    {\n      label: '编辑',\n      onClick: handleEdit.bind(null, record),\n    }\n  ]\n}\n\n/**\n * 下拉操作栏\n */\nfunction getDropDownAction(record) {\n  return [\n    {\n      label: '详情',\n      onClick: handleDetail.bind(null, record),\n    }, {\n      label: '删除',\n      popConfirm: {\n        title: '是否确认删除',\n        confirm: handleDelete.bind(null, record),\n      }\n    }\n  ]\n}\n</script>\n<style scoped>\n\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tableWhiteList/modules/SysTableWhiteListModal.vue",
    "content": "<template>\n  <BasicModal\n    @register=\"registerModal\"\n    :title=\"title\"\n    width=\"40%\"\n    v-bind=\"$attrs\"\n    @ok=\"handleSubmit\"\n  >\n    <div class=\"content\"> \n      <BasicForm  @register=\"registerForm\"/>\n    </div>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\nimport {computed, ref, unref} from 'vue';\nimport {BasicModal, useModalInner} from '/@/components/Modal';\nimport {BasicForm, useForm} from '/@/components/Form/index';\nimport {formSchema} from '../SysTableWhiteList.data';\nimport {saveOrUpdate} from '../SysTableWhiteList.api';\n// Emits声明\nconst emit = defineEmits(['register', 'success']);\nconst isUpdate = ref(true);\n//表单配置\nconst [registerForm, { resetFields, setFieldsValue, validate, setProps }] = useForm({\n  labelWidth: 120,\n  wrapperCol: null,\n  schemas: formSchema,\n  showActionButtonGroup: false,\n});\n//表单赋值\nconst [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => {\n  //重置表单\n  await resetFields();\n  setModalProps({\n    confirmLoading: false,\n    showCancelBtn: data?.showFooter,\n    showOkBtn: data?.showFooter\n  });\n  isUpdate.value = !!data?.isUpdate;\n  if (unref(isUpdate)) {\n    //表单赋值\n    await setFieldsValue({\n      ...data.record,\n    });\n  }\n  setProps({ disabled: !data?.showFooter })\n});\n//设置标题\nconst title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));\n\n//表单提交事件\nasync function handleSubmit(v) {\n  try {\n    let values = await validate();\n    setModalProps({confirmLoading: true});\n    //提交表单\n    await saveOrUpdate(values, isUpdate.value);\n    //关闭弹窗\n    closeModal();\n    //刷新列表\n    emit('success', {isUpdate: isUpdate.value, values});\n  } finally {\n    setModalProps({confirmLoading: false});\n  }\n}\n</script>\n\n<style lang=\"less\" scoped>\n  .content {\n    padding: 20px 8% 0 4%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/TenantUserList.vue",
    "content": "<template>\n  <div>\n    <!--引用表格-->\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"handleCreate\">新增</a-button>\n        <a-button\n            preIcon=\"ant-design:user-add-outlined\"\n            type=\"primary\"\n            @click=\"handleInvitation\"\n            style=\"margin-right: 5px\">\n            邀请用户加入\n        </a-button>\n        <JThirdAppButton biz-type=\"user\" :selected-row-keys=\"selectedRowKeys\" syncToApp syncToLocal @sync-finally=\"onSyncFinally\" />\n        <a-button type=\"primary\" @click=\"openQuitModal(true, {})\" preIcon=\"ant-design:user-delete-outlined\">离职人员</a-button>\n        <div style=\"margin-left: 10px;margin-top: 5px\"> 当前登录租户: <span class=\"tenant-name\">{{loginTenantName}}</span> </div>\n        <a-tooltip title=\"租户用户更多操作说明\">\n          <a-icon type=\"question-circle\" style=\"margin-left: 8px; cursor: pointer \" @click=\"tipShow = true\"/>\n        </a-tooltip>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\" />\n      </template>\n    </BasicTable>\n    <!--用户抽屉-->\n    <TenantUserDrawer @register=\"registerDrawer\" @success=\"handleSuccess\" />\n    <!-- 离职人员列弹窗 -->\n    <UserQuitModal @register=\"registerQuitModal\" @success=\"reload\" />\n    <!--  变更拥有者弹窗  -->\n    <UserSelectModal @register=\"registerUserModal\" :excludeUserIdList=\"excludeUserIdList\" :maxSelectCount=\"1\" @getSelectResult=\"selectResult\" />\n    <!--  套餐分配弹窗  -->\n    <TenantPackAllotModal @register=\"registerPackAllotModal\"></TenantPackAllotModal>\n    <!--  邀请人弹窗  -->\n    <TenantInviteUserModal @register=\"registerSelUserModal\" @inviteOk=\"handleInviteUserOk\" />\n    <a-modal v-model:open=\"tipShow\" :footer=\"null\" title=\"租户用户更多操作说明\" :width=\"800\">\n      <ul class=\"user-tenant-tip\">\n        <li>移除：将用户从当前租户中移除</li>\n        <li>删除：仅可删除当天创建的用户，删除后可在系统用户回收站恢复</li>\n        <li>离职：非租户创建者可进行离职操作，离职员工可在离职人员列表查看</li>\n        <li>交接：租户创建者可进行租户交接，交接后员工信息可在离职人员列表查看</li>\n      </ul>\n      <div style=\"height: 10px\"></div>\n    </a-modal>\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"tenant-system-user\" setup>\n  //ts语法\n  import { onMounted, ref, unref } from 'vue';\n  import { BasicTable, TableAction, ActionItem } from '/@/components/Table';\n  import UserDrawer from '../user/UserDrawer.vue';\n  import JThirdAppButton from '/@/components/jeecg/thirdApp/JThirdAppButton.vue';\n  import UserQuitModal from '../user/UserQuitModal.vue';\n  import { useDrawer } from '/@/components/Drawer';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { useModal } from '/@/components/Modal';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { columns, searchFormSchema } from '../user/user.data';\n  import { list , deleteUser, batchDeleteUser, getImportUrl, getExportUrl, frozenBatch, getUserTenantPageList, updateUserTenantStatus } from '../user/user.api';\n  // import { usePermission } from '/@/hooks/web/usePermission'\n  // const { hasPermission } = usePermission();\n  import { userTenantColumns, userTenantFormSchema } from '../user/user.data';\n  import { useUserStore } from '/@/store/modules/user';\n  import UserSelectModal from '/@/components/Form/src/jeecg/components/modal/UserSelectModal.vue';\n  import { getTenantId } from \"/@/utils/auth\";\n  import { changeOwenUserTenant } from \"/@/views/system/usersetting/UserSetting.api\";\n  import {getLoginTenantName, invitationUserJoin, leaveTenant} from \"/@/views/system/tenant/tenant.api\";\n  import TenantUserDrawer from './components/TenantUserDrawer.vue';\n  import { sameDay, tenantSaasMessage } from \"@/utils/common/compUtils\";\n  import TenantPackAllotModal from './components/TenantPackAllotModal.vue'\n  import TenantInviteUserModal from \"@/views/system/tenant/components/TenantInviteUserModal.vue\";\n\n  const { createMessage, createConfirm } = useMessage();\n\n  //注册drawer\n  const [registerDrawer, { openDrawer }] = useDrawer();\n  //离职代理人model\n  const [registerQuitAgentModal, { openModal: openQuitAgentModal }] = useModal();\n  //离职用户列表model\n  const [registerQuitModal, { openModal: openQuitModal }] = useModal();\n  //分配套餐弹窗\n  const [registerPackAllotModal, { openModal: openPackAllotModal }] = useModal();\n  const userStore = useUserStore();\n  const createBy = userStore.getUserInfo.username;\n  //弹窗提示显示\n  const tipShow = ref<boolean>(false);\n\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({\n    designScope: 'user-list',\n    tableProps: {\n      title: '租户用户列表',\n      api: getUserTenantPageList,\n      columns: userTenantColumns,\n      size: 'small',\n      formConfig: {\n        schemas: userTenantFormSchema,\n      },\n      actionColumn: {\n        width: 120,\n      },\n      beforeFetch: (params) => {\n        params['userTenantStatus'] = '1,3,4';\n        return Object.assign({ column: 'createTime', order: 'desc' }, params);\n      },\n    },\n  });\n\n  //注册table数据\n  const [registerTable, { reload, updateTableDataRecord }, { rowSelection, selectedRows, selectedRowKeys }] = tableContext;\n\n  /**\n   * 新增事件\n   */\n  function handleCreate() {\n    openDrawer(true, {\n      isUpdate: false,\n      showFooter: true,\n      tenantSaas: true,\n    });\n  }\n  /**\n   * 编辑事件\n   */\n  async function handleEdit(record: Recordable) {\n    openDrawer(true, {\n      record,\n      isUpdate: true,\n      showFooter: true,\n      tenantSaas: true,\n    });\n  }\n  /**\n   * 详情\n   */\n  async function handleDetail(record: Recordable) {\n    openDrawer(true, {\n      record,\n      isUpdate: true,\n      showFooter: false,\n      tenantSaas: true,\n    });\n  }\n\n  /**\n   * 成功回调\n   */\n  function handleSuccess() {\n    reload();\n  }\n\n  /**\n   *同步钉钉和微信回调\n   */\n  function onSyncFinally({ isToLocal }) {\n    // 同步到本地时刷新下数据\n    if (isToLocal) {\n      reload();\n    }\n  }\n\n  /**\n   * 操作栏\n   */\n  function getTableAction(record): ActionItem[] {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n        // ifShow: () => hasPermission('system:user:edit'),\n      },\n    ];\n  }\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record): ActionItem[] {\n    return [\n      {\n        label: '查看详情',\n        onClick: handleDetail.bind(null, record),\n      },\n      {\n        label: '移除用户',\n        onClick: handleLeave.bind(null, record.id),\n      },\n      {\n        label: '删除用户',\n        popConfirm: {\n          title: '是否确认删除该用户',\n          confirm: handleDeleteUser.bind(null, record),\n        },\n        ifShow: () => record.username!== userStore.getUserInfo?.username && sameDay(record.createTime),\n      },\n      {\n        label: '变更拥有者',\n        onClick: handleHandover.bind(null, record),\n        ifShow: () =>{\n          return record.username === record.createBy;\n        }\n      },\n      {\n        label: '同意',\n        onClick: updateStatus.bind(null, record.id, '1'),\n        ifShow: () => {\n          return (record.status === '3' || record.status === '4') && record.createBy === createBy;\n        },\n      },\n      {\n        label: '拒绝',\n        popConfirm: {\n          title: '是否确认拒绝',\n          confirm: updateStatus.bind(null, record.id, '4'),\n        },\n        ifShow: () => {\n          return record.status === '3' && record.createBy === createBy;\n        },\n      },\n      {\n        label: '用户套餐',\n        onClick: handleAllotPack.bind(null, record),\n      }\n    ];\n  }\n\n  /**\n   * 更新用户租户状态\n   * @param id\n   * @param status\n   */\n  function updateStatus(id, status) {\n    updateUserTenantStatus({ userId: id, status: status })\n      .then((res) => {\n        if (res.success) {\n          handleSuccess();\n        } else {\n          createMessage.warning(res.message);\n        }\n      })\n      .catch((e) => {\n        createMessage.warning(e.message);\n      });\n  }\n\n  //============================================ 租户离职交接  ============================================\n  //租户id\n  const tenantId = ref<string>('');\n  //排除自己的编号集合\n  const excludeUserIdList = ref<any>([]);\n  //离职代理人model\n  const [registerUserModal, { openModal: openUserModal }] = useModal();\n  //邀请用户加入弹窗\n  const [registerSelUserModal, { openModal: userOpenModal }] = useModal();\n  const handOverUserName = ref<string>('');\n  \n  /**\n   * 人员交接\n   */\n  function handleHandover(record) {\n    tenantId.value = getTenantId();\n    excludeUserIdList.value = [record.id];\n    //记录一下当前需要交接的用户名\n    handOverUserName.value = record.createBy;\n    openUserModal(true)\n  }\n\n  /**\n   * 用户选择回调\n   * @param options\n   * @param values\n   */\n  function selectResult(options,values) {\n    console.log(values)\n    if(values && values.length>0){\n      let userId = values[0];\n      changeOwenUserTenant({ userId:userId, tenantId:unref(tenantId) }).then((res) =>{\n        if(res.success){\n          createMessage.success(\"交接成功\");\n          let username = userStore.getUserInfo?.username;\n          if(username == handOverUserName.value){\n            userStore.logout(true);\n          }else{\n            reload();\n          }\n        } else {\n          createMessage.warning(res.message);\n        }\n      })\n    }\n  }\n  //============================================  租户离职交接  ============================================\n\n\n  // 代码逻辑说明: 【QQYUN-5723】4、显示当前登录租户------------\n  const loginTenantName = ref<string>('');\n\n  getTenantName();\n\n  async function getTenantName(){\n    loginTenantName.value = await getLoginTenantName();\n  }\n  //update-end---author:wangshuai ---date:20230710  for：【QQYUN-5723】4、显示当前登录租户------------\n  \n\n  /**\n   * 分配套餐\n   * \n   * @param record\n   */\n  function handleAllotPack(record) {\n    openPackAllotModal(true,{\n      record\n    })\n  }\n\n  /**\n   * 删除用户\n   */\n  function handleDeleteUser(record) {\n    deleteUser({ id: record.id }, reload);\n  }\n\n  /**\n   * 邀请用户加入租户\n   */\n  function handleInvitation() {\n    userOpenModal(true, {});\n  }\n  \n  /**\n   * 用户选择回调事件\n   * @param username\n   * @param phone\n   * @param userSelectId\n   */\n  async function handleInviteUserOk(phone, username) {\n    let tId = getTenantId();\n    if (phone) {\n      await invitationUserJoin({ ids: tId, phone: phone });\n      reload();\n    }\n    if (username) {\n      await invitationUserJoin({ ids: tId, username: username });\n      reload();\n    }\n  }\n\n  /**\n   * 请离\n   * @param id\n   */\n  async function handleLeave(id) {\n    await leaveTenant({ userIds: id, tenantId: getTenantId() }, reload)\n  }\n  \n  \n  onMounted(()=>{\n    tenantSaasMessage('租户用户')\n  })\n</script>\n\n<style scoped>\n  .tenant-name{\n    text-decoration:underline;\n    margin: 5px;\n    font-size: 15px;\n  }\n  .user-tenant-tip{\n    margin: 20px;\n    background-color: #f8f9fb;\n    color: #99a1a9;\n    border-radius: 4px;\n    padding: 12px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/components/TenantInviteUserModal.vue",
    "content": "<!--邀请用户加入租户弹窗-->\n<template>\n  <BasicModal @register=\"registerModal\" :width=\"500\" :title=\"title\" @ok=\"handleSubmit\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n\n<script lang=\"ts\">\nimport { BasicModal, useModalInner } from '/@/components/Modal';\nimport { BasicForm, useForm } from '/@/components/Form/index';\nimport { defineComponent, ref } from 'vue';\nexport default defineComponent({\n  name: 'TenantInviteUserModal',\n  components: {\n    BasicModal,\n    BasicForm,\n  },\n  setup(props, { emit }) {\n    const title = ref<string>('邀请成员');\n    const [registerForm, { resetFields, validate }] = useForm({\n      schemas: [\n        {\n          label: '邀请方式',\n          field: 'invitedMode',\n          component: 'RadioButtonGroup',\n          defaultValue: 1,\n          componentProps: {\n            options: [\n              { label: '手机号', value: 1 },\n              { label: '用户账号', value: 2 },\n            ],\n          },\n        },\n        {\n          label: '手机号',\n          field: 'phone',\n          component: 'Input',\n          ifShow: ({ values }) => values.invitedMode === 1,\n          dynamicRules: ({ values }) => {\n            return values.invitedMode === 1\n              ? [\n                  { required: true, message: '请填写手机号' },\n                  { pattern: /^1[3456789]\\d{9}$/, message: '手机号码格式有误' },\n                ]\n              : [{ pattern: /^1[3456789]\\d{9}$/, message: '手机号码格式有误' }];\n          },\n        },\n        {\n          field: 'user',\n          component: 'Input',\n          label: '用户账号',\n          ifShow: ({ values }) => values.invitedMode === 2,\n          dynamicRules: ({ values }) => {\n            return values.invitedMode === 2 ? [{ required: true, message: '请输入用户账号' }] : [];\n          },\n        },\n      ],\n      showActionButtonGroup: false,\n    });\n    //表单赋值\n    const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n      //重置表单\n      await resetFields();\n      setModalProps({ minHeight: 100 });\n    });\n\n    /**\n     * 提交，返回给租户list页面\n     */\n    async function handleSubmit() {\n      let values = await validate();\n      emit('inviteOk', values.phone, values.user);\n      closeModal();\n    }\n\n    return {\n      title,\n      registerModal,\n      registerForm,\n      handleSubmit,\n    };\n  },\n});\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/components/TenantModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"title\" @ok=\"handleSubmit\" width=\"700px\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { formSchema } from '../tenant.data';\n  import { saveOrUpdateTenant, getTenantById } from '../tenant.api';\n  // Emits声明\n  const emit = defineEmits(['register', 'success']);\n  const isUpdate = ref(true);\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate, updateSchema }] = useForm({\n    // labelWidth: 150,\n    schemas: formSchema,\n    showActionButtonGroup: false,\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false });\n    isUpdate.value = !!data?.isUpdate;\n    if (unref(isUpdate)) {\n      // 编辑模式下禁用id字段\n      updateSchema({ field: 'id', dynamicDisabled: true });\n      //获取详情\n      data.record = await getTenantById({ id: data.record.id });\n      //表单赋值\n      await setFieldsValue({\n        ...data.record,\n      });\n    } else {\n      updateSchema({ field: 'id', dynamicDisabled: false });\n    }\n  });\n  //设置标题\n  const title = computed(() => (!unref(isUpdate) ? '新增租户' : '编辑租户'));\n  //表单提交事件\n  async function handleSubmit(v) {\n    try {\n      let values = await validate();\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      await saveOrUpdateTenant(values, isUpdate.value);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/components/TenantPackAllotModal.vue",
    "content": "<!--  用户套餐分配页面 -->\n<template>\n  <BasicModal @register=\"registerModal\" :width=\"500\" title=\"分配套餐\" @ok=\"handleSubmit\">\n    <BasicForm @register=\"registerForm\">\n      <template #packId=\"{ model, field }\">\n        <a-checkbox-group v-model:value=\"model[field]\" :options=\"packOption\"></a-checkbox-group>\n      </template>\n    </BasicForm>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\">\n  import { BasicModal, useModalInner } from '@/components/Modal';\n  import { BasicForm, useForm } from '@/components/Form';\n  import { packUserAllotSchemas } from '@/views/system/tenant/tenant.data';\n  import { listPackByTenantUserId } from '@/views/system/tenant/tenant.api';\n  import { getTenantId } from '@/utils/auth';\n  import { ref, defineComponent } from 'vue';\n\n  export default defineComponent({\n    name: 'TenantCurrentPackList',\n    components: {\n      BasicModal,\n      BasicForm,\n    },\n    setup() {\n      //产品包的option\n      const packOption = ref<any>([]);\n      //表单配置\n      const [registerForm, { resetFields, setFieldsValue, setProps }] = useForm({\n        schemas: packUserAllotSchemas,\n        showActionButtonGroup: false,\n      });\n      //表单赋值\n      const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n        setModalProps({ confirmLoading: false, showCancelBtn: false, showOkBtn: false });\n        //重置表单\n        await resetFields();\n        let tenantId = getTenantId();\n        let result = await listPackByTenantUserId({ tenantId: tenantId, userId: data.record.id });\n        if (result) {\n          if (result.packList) {\n            for (const item of result.packList) {\n              if (item.packCode) {\n                item.label = item.packName + \"(默认产品包)\";\n              } else {\n                item.label = item.packName;\n              }\n              item.value = item.id;\n              item.key = item.id;\n            }\n            packOption.value = result.packList;\n          } else {\n            packOption.value = [];\n          }\n          if(result.userPackIdList){\n            data.record.packId = result.userPackIdList;\n          }\n        }\n        setModalProps({ confirmLoading: false });\n        await setFieldsValue({\n          ...data.record,\n          userId: data.record.id,\n        });\n        setProps({ disabled: true });\n      })\n\n      return {\n        registerForm,\n        registerModal,\n        packOption,\n      };\n    },\n  });\n</script>\n\n<style scoped lang=\"less\"></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/components/TenantRecycleBinModal.vue",
    "content": "<!--回收站-->\n<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" title=\"用户回收站\" :showOkBtn=\"false\" width=\"1000px\" destroyOnClose>\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                批量删除\n              </a-menu-item>\n              <a-menu-item key=\"1\" @click=\"batchHandleRevert\">\n                <Icon icon=\"ant-design:redo-outlined\"></Icon>\n                批量还原\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button\n            >批量操作\n            <Icon icon=\"ant-design:down-outlined\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n    </BasicTable>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup name=\"tenant-recycle-bin-modal\">\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { recycleBinPageList, deleteLogicDeleted, revertTenantLogic } from '../tenant.api';\n  import { recycleColumns, searchRecycleFormSchema } from '../tenant.data';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { Modal } from 'ant-design-vue';\n  import { toRaw, unref } from 'vue';\n\n  const { createMessage: $message } = useMessage();\n  const [registerModal] = useModalInner(() => {});\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({\n    tableProps: {\n      api: recycleBinPageList,\n      columns: recycleColumns,\n      size: 'small',\n      formConfig: {\n        schemas: searchRecycleFormSchema,\n      },\n      actionColumn: {\n        width: 120,\n      },\n      ellipsis: true,\n    },\n  });\n  const emit = defineEmits(['success', 'register']);\n  //注册table数据\n  const [registerTable, { reload, updateTableDataRecord }, { rowSelection, selectedRows, selectedRowKeys }] = tableContext;\n\n  //获取操作栏事件\n  function getTableAction(record) {\n    return [\n      {\n        label: '还原',\n        icon: 'ant-design:redo-outlined',\n        popConfirm: {\n          title: '是否确认还原',\n          confirm: handleRevert.bind(null, record),\n        },\n      },\n      {\n        label: '彻底删除',\n        icon: 'ant-design:scissor-outlined',\n        popConfirm: {\n          title: '是否确认彻底删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n\n  /**\n   * 还原\n   * @param record\n   */\n  function handleRevert(record) {\n    revertTenantLogic({ ids: record.id }, handleSuccess);\n    emit('success');\n  }\n\n  /**\n   * 成功刷新表格\n   */\n  function handleSuccess() {\n    (selectedRowKeys.value = []) && reload();\n  }\n\n  /**\n   * 彻底删除\n   * @param record\n   */\n  async function handleDelete(record) {\n    await deleteLogicDeleted({ ids: record.id }, handleSuccess);\n  }\n\n  /**\n   * 批量彻底删除\n   */\n  function batchHandleDelete() {\n    Modal.confirm({\n      title: '彻底删除',\n      content: '是否确认彻底删除',\n      okText: '确认',\n      cancelText: '取消',\n      onOk: () => {\n        deleteLogicDeleted({ ids: toRaw(unref(selectedRowKeys)).join(',') }, handleSuccess);\n      },\n    });\n  }\n\n  /**\n   * 批量还原\n   */\n  function batchHandleRevert() {\n    Modal.confirm({\n      title: '还原',\n      content: '是否确认还原',\n      okText: '确认',\n      cancelText: '取消',\n      onOk: () => {\n        revertTenantLogic({ ids: toRaw(unref(selectedRowKeys)).join(',') }, handleSuccess);\n        emit('success');\n      },\n    });\n  }\n</script>\n\n<style lang=\"less\" scoped>\n  :deep(.ant-popover-inner-content) {\n    width: 185px !important;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/components/TenantUserDrawer.vue",
    "content": "<template>\n  <BasicDrawer @register=\"registerDrawer\" :title=\"title\" :width=\"580\" destroyOnClose @ok=\"handleSubmit\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicDrawer>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, ref, unref, computed } from 'vue';\n  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';\n  import { BasicForm, useForm } from '/@/components/Form';\n  import { getUserDepartList } from '../../user/user.api';\n  import { tenantUserSchema } from '../tenant.data';\n  import { saveOrUpdateTenantUser } from '../tenant.api';\n\n  export default defineComponent({\n    name: 'TenantUserDrawer',\n    components: {\n      BasicDrawer,\n      BasicForm,\n    },\n    emits: ['success', 'register'],\n    setup(_p, { emit }) {\n      const status = ref<string>('');\n      const isUpdate = ref(false);\n      const title = computed(() => {\n        return isUpdate.value ? '编辑人员' : '添加人员';\n      });\n\n      //表单\n      const [registerForm, { setFieldsValue, resetFields, validate, setProps, clearValidate }] = useForm({\n        schemas: tenantUserSchema,\n        showActionButtonGroup: false,\n        labelCol: { span: 24 },\n        wrapperCol: { span: 24 },\n      });\n\n      const showFooter = ref<boolean>(true);\n      // modal\n      const [registerDrawer, { closeDrawer, setDrawerProps }] = useDrawerInner(async (data) => {\n        isUpdate.value = data.isUpdate;\n        await resetFields();\n        showFooter.value = data?.showFooter ?? true;\n        setDrawerProps({ showFooter: showFooter.value });\n        if (unref(isUpdate)) {\n          const userDepart = await getUserDepartList({ userId: data.record.id });\n          let departData: any = '';\n          if (userDepart && userDepart.length > 0) {\n            departData = userDepart.map((item) => item.value);\n          }\n          let formData = {\n            ...data.record,\n            selecteddeparts: departData,\n            selectedroles: data.record.selectedroles,\n          };\n          status.value = data.status;\n          await setFieldsValue(formData);\n        }\n        // 隐藏底部时禁用整个表单\n        setProps({ disabled: !data?.showFooter });\n        if(!data?.showFooter){\n          await clearValidate();\n        }\n      });\n\n      const confirmLoading = ref<boolean>(false);\n\n      //提交事件\n      async function handleSubmit() {\n        const data: any = await validate();\n        if (!data.username) {\n          data.username = data.phone;\n        }\n        data.password = '123456';\n        confirmLoading.value = true;\n        await saveOrUpdateTenantUser(data, isUpdate.value);\n        confirmLoading.value = false;\n        emit('success');\n        handleClose();\n      }\n\n      /**\n       * 取消\n       */\n      function handleClose() {\n        closeDrawer();\n      }\n\n      return {\n        isUpdate,\n        title,\n        registerForm,\n        registerDrawer,\n        handleSubmit,\n        handleClose,\n        status,\n        confirmLoading,\n      };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/components/TenantUserList.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"title\" @ok=\"handleSubmit\" width=\"800px\">\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <template #tableTitle>\n        <a-button v-if=\"selectedRowKeys.length>0\" preIcon=\"ant-design:delete-outlined\" type=\"primary\" @click=\"handleLeaveBatch\" style=\"margin-right: 5px\">批量请离</a-button>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getActions(record)\" />\n      </template>\n    </BasicTable>\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\nimport { ref, computed, unref } from 'vue';\nimport { BasicModal, useModalInner } from '/@/components/Modal';\nimport { BasicForm, useForm } from '/@/components/Form/index';\nimport { userColumns, userSearchFormSchema } from \"../tenant.data\";\nimport { getTenantUserList, leaveTenant } from \"../tenant.api\";\nimport { useListPage } from \"/@/hooks/system/useListPage\";\nimport { BasicTable, TableAction } from '/@/components/Table';\n\nconst tenantId = ref<number>(0);\n// 列表页面公共参数、方法\nconst { prefixCls, tableContext } = useListPage({\n  designScope: 'tenant-template',\n  tableProps: {\n    api: getTenantUserList,\n    columns: userColumns,\n    immediate:false,\n    formConfig: {\n      schemas: userSearchFormSchema,\n      // 代码逻辑说明: 【QQYUN-5698】样式问题------------\n      labelWidth: 40,\n      actionColOptions: {\n        xs: 24,\n        sm: 8,\n        md: 8,\n        lg: 8,\n        xl: 8,\n        xxl: 8,\n      },\n    },\n    beforeFetch: (params) => {\n      return Object.assign(params, { userTenantId: unref(tenantId) });\n    },\n  },\n});\nconst [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;\n\n// Emits声明\nconst emit = defineEmits(['register', 'success']);\n//表单赋值\nconst [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n  tenantId.value = data.id;\n  success();\n});\n//设置标题\nconst title = '成员';\n//表单提交事件\nasync function handleSubmit(v) {\n  closeModal();\n}\n\nfunction getActions(record) {\n  return [\n    {\n      label: '移除',\n      onClick: handleLeave.bind(null, record.id),\n    },\n  ]\n}\n\n/**\n * 成功\n */\nfunction success() {\n  (selectedRowKeys.value = []) && reload();\n}\n\n/**\n * 请离\n * @param id\n */\nasync function handleLeave(id) {\n  await leaveTenant({userIds:id,tenantId:unref(tenantId)},success)\n}\n\n/**\n * 批量请离\n */\nasync function  handleLeaveBatch(){\n  await leaveTenant({userIds:selectedRowKeys.value.join(\",\"),tenantId:unref(tenantId)},success)\n}\n</script>\n\n<style scoped>\n  /*update-begin---author:wangshuai ---date:20220705  for：查询组件input有后缀，隐藏掉------------*/\n  :deep(.ant-input-suffix){\n    display: none;\n  }\n  /*update-begin---author:wangshuai ---date:20220705  for：查询组件input有后缀，隐藏掉------------*/\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/components/TenantUserRightList.vue",
    "content": "<template>\n  <BasicTable @register=\"registerTable\" style=\"padding-top: 10px\">\n    <template #departNames=\"{ text, record }\">\n      <template v-if=\"text && text.length > 0\">\n        {{ getName(text) }}\n      </template>\n    </template>\n    <template #positionNames=\"{ text, record }\">\n      <template v-if=\"text && text.length > 0\">\n        {{ getName(text) }}\n      </template>\n    </template>\n    <template #tableTitle>\n      <a-button preIcon=\"ant-design:usergroup-add-outlined\" type=\"primary\" @click=\"addUser\" :disabled=\"tenantPackData.izSysn == '1'\">邀请成员</a-button>\n      <a-button preIcon=\"ant-design:rollback-outlined\" @click=\"cancel\">关闭</a-button>\n    </template>\n    <!--操作栏-->\n    <template #action=\"{ record }\">\n      <TableAction :actions=\"getTableAction(record)\" />\n    </template>\n  </BasicTable>\n  <tenant-user-select-modal :multi=\"true\" @register=\"registerUserModal\" @on-select=\"onSelected\" :tenantId=\"getTenantId\"></tenant-user-select-modal>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, defineEmits } from 'vue';\n  import { BasicModal } from '@/components/Modal';\n  import { BasicTable, TableAction } from '@/components/Table';\n  import TenantUserSelectModal from '@/views/system/tenant/components/TenantUserSelectModal.vue';\n  import { addTenantPackUser, deleteTenantPackUser } from '@/views/system/tenant/tenant.api';\n  //注册table数据\n  import { useListPage } from '@/hooks/system/useListPage';\n  import { queryTenantPackUserList } from '@/views/system/tenant/tenant.api';\n  import { tenantPackUserColumns } from '@/views/system/tenant/tenant.data';\n  import { useModal } from '@/components/Modal';\n  import { computed, reactive } from 'vue';\n\n  export default defineComponent({\n    name: 'TenantUserRightList',\n    components: { BasicModal, BasicTable, TableAction, TenantUserSelectModal },\n    emits: ['cancel'],\n    setup(props, { emit }) {\n      const [registerUserModal, { openModal: openUserModal, closeModal: closeUserModal }] = useModal();\n      //获取租户id\n      const getTenantId = computed(() => {\n        return tenantPackData.tenantId;\n      });\n\n      //套餐包信息\n      const tenantPackData = reactive<any>({});\n      const { tableContext } = useListPage({\n        tableProps: {\n          api: queryTenantPackUserList,\n          immediate: false,\n          columns: tenantPackUserColumns,\n          canResize: false,\n          useSearchForm: false,\n          beforeFetch: (params) => {\n            params.tenantId = tenantPackData.tenantId;\n            params.packId = tenantPackData.id;\n            params.status = 1;\n            return params;\n          },\n          actionColumn: {\n            width: 120,\n            fixed: 'right',\n          },\n        },\n      });\n\n      const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;\n\n      /**\n       * 初始化数据\n       * @param value\n       */\n      function initData(value) {\n        console.log('value：：', value);\n        Object.assign(tenantPackData, value);\n        reload();\n      }\n\n      /**\n       * 表格操作列\n       * @param record\n       */\n      function getTableAction(record) {\n        return [\n          {\n            label: '移除',\n            popConfirm: {\n              title: '是否确认移除',\n              confirm: handleDelete.bind(null, record),\n            },\n            ifShow:() => tenantPackData.izSysn != '1'\n          },\n        ];\n      }\n\n      /**\n       * 删除\n       */\n      async function handleDelete(record) {\n        let params = {\n          packId: record.packId,\n          packName: record.packName,\n          tenantId: tenantPackData.tenantId,\n          userId: record.id,\n          realname: record.realname,\n        };\n        await deleteTenantPackUser(params);\n        await reload();\n      }\n\n      /**\n       * 添加用户弹窗\n       */\n      function addUser() {\n        openUserModal(true, {\n          list: [],\n        });\n      }\n\n      /**\n       * 邀请人回调事件\n       * @param arr\n       */\n      async function onSelected(arr) {\n        if (arr && arr.length > 0) {\n          let names: any[] = [];\n          let ids: any[] = [];\n          for (let u of arr) {\n            names.push(u.realname);\n            ids.push(u.id);\n          }\n          let params = {\n            packId: tenantPackData.id,\n            packName: tenantPackData.packName,\n            tenantId: tenantPackData.tenantId,\n            userId: ids.join(','),\n            realname: names.join(','),\n          };\n          await addTenantPackUser(params);\n          await reload();\n          closeUserModal();\n        }\n      }\n\n      /**\n       * 获取部门/职务名称\n       * @param value\n       */\n      function getName(value) {\n        return value.join(',');\n      }\n\n      /**\n       * 关闭\n       */\n      function cancel() {\n        emit('cancel');\n      }\n\n      return {\n        getTableAction,\n        onSelected,\n        registerTable,\n        registerUserModal,\n        getTenantId,\n        rowSelection,\n        addUser,\n        initData,\n        getName,\n        cancel,\n        tenantPackData,\n      };\n    },\n  });\n</script>\n\n<style scoped lang=\"less\"></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/components/TenantUserSelectModal.vue",
    "content": "<!--套餐中使用的用户选择框-->\n<template>\n  <div>\n    <BasicModal\n      v-bind=\"$attrs\"\n      @register=\"register\"\n      :title=\"modalTitle\"\n      width=\"900px\"\n      wrapClassName=\"j-user-select-modal\"\n      @ok=\"handleOk\"\n      destroyOnClose\n    >\n      <BasicTable ref=\"tableRef\" @register=\"registerTable\" :rowSelection=\"rowSelection\">\n        <template #tableTitle></template>\n      </BasicTable>\n    </BasicModal>\n  </div>\n</template>\n<script lang=\"ts\">\n  import { defineComponent, ref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { getTenantUserList } from '../tenant.api';\n  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { userColumns, userSearchFormSchema } from '../tenant.data';\n\n  export default defineComponent({\n    name: 'TenantUserSelectModal',\n    components: {\n      //此处需要异步加载BasicTable\n      BasicModal,\n      BasicTable: createAsyncComponent(() => import('/@/components/Table/src/BasicTable.vue'), {\n        loading: true,\n      }),\n    },\n    props: {\n      //选择框标题\n      modalTitle: {\n        type: String,\n        default: '选择用户',\n      },\n      //查询参数\n      tenantId: {\n        type: Number,\n        default: 0,\n      },\n      //排除用户id的集合\n      excludeUserIdList: {\n        type: Array,\n        default: [],\n      },\n    },\n    emits: ['register', 'on-select'],\n    setup(props, { emit, refs }) {\n      const tableScroll = ref<any>({ x: false });\n      const tableRef = ref();\n      //注册弹框\n      const [register, { closeModal }] = useModalInner(() => {\n        if (window.innerWidth < 900) {\n          tableScroll.value = { x: 900 };\n        } else {\n          tableScroll.value = { x: false };\n        }\n        setTimeout(() => {\n          if (tableRef.value) {\n            tableRef.value.setSelectedRowKeys([]);\n          }\n        }, 800);\n      });\n\n      //定义表格列\n      const columns = [\n        {\n          title: '账号',\n          dataIndex: 'username',\n          width: 40,\n          align: 'left',\n        },\n        {\n          title: '姓名',\n          dataIndex: 'realname',\n          width: 40,\n        },\n        {\n          title: '性别',\n          dataIndex: 'sex_dictText',\n          width: 20,\n        },\n        {\n          title: '手机号码',\n          dataIndex: 'phone',\n          width: 30,\n        },\n        {\n          title: '邮箱',\n          dataIndex: 'email',\n          width: 40,\n        },\n        {\n          title: '状态',\n          dataIndex: 'status_dictText',\n          width: 20,\n        },\n      ];\n\n      // 列表页面公共参数、方法\n      const { prefixCls, tableContext } = useListPage({\n        designScope: 'tenant-template',\n        tableProps: {\n          api: getTenantUserList,\n          columns: userColumns,\n          scroll: { y: 390 },\n          rowKey: 'id',\n          showActionColumn: false,\n          formConfig: {\n            schemas: userSearchFormSchema,\n            labelWidth: 60,\n            actionColOptions: {\n              xs: 24,\n              sm: 8,\n              md: 8,\n              lg: 8,\n              xl: 8,\n              xxl: 8,\n            },\n          },\n          beforeFetch: (params) => {\n            return Object.assign(params, { userTenantId: props.tenantId });\n          },\n        },\n      });\n      const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;\n\n      /**\n       * 确定选择\n       */\n      function handleOk() {\n        //返回选中事件\n        emit('on-select', rowSelection.selectedRows, rowSelection.selectedRowKeys);\n      }\n\n      return {\n        handleOk,\n        register,\n        columns,\n        rowSelection,\n        tableScroll,\n        tableRef,\n        registerTable,\n      };\n    },\n  });\n</script>\n\n<style scoped>\n  :deep(.ant-input-suffix) {\n    display: none;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/index.vue",
    "content": "<template>\n  <div>\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <template #tableTitle>\n        <a-button preIcon=\"ant-design:plus-outlined\" type=\"primary\" @click=\"handleAdd\" style=\"margin-right: 5px\">新增</a-button>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button\n            >批量操作\n            <Icon icon=\"mdi:chevron-down\"></Icon>\n          </a-button>\n        </a-dropdown>\n        <a-button\n          preIcon=\"ant-design:user-add-outlined\"\n          type=\"primary\"\n          @click=\"handleInvitation\"\n          style=\"margin-right: 5px\"\n          :disabled=\"selectedRowKeys.length === 0\"\n          >邀请用户加入</a-button\n        >\n        <a-button\n          preIcon=\"ant-design:sliders-outlined\"\n          type=\"primary\"\n          @click=\"handlePack\"\n          style=\"margin-right: 5px\"\n          :disabled=\"selectedRowKeys.length === 0\"\n          >套餐管理</a-button\n        >\n        <a-button type=\"primary\" @click=\"recycleBinClick\" preIcon=\"ant-design:hdd-outlined\">回收站</a-button>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getActions(record)\" />\n      </template>\n    </BasicTable>\n    <TenantModal @register=\"registerModal\" @success=\"reload\" />\n    <TenantInviteUserModal @register=\"registerSelUserModal\" @inviteOk=\"handleInviteUserOk\"/>\n    <TenantUserModal @register=\"registerTenUserModal\" />\n    <!--  产品包  -->\n    <TenantPackList @register=\"registerPackModal\" />\n    <!--  租户回收站  -->\n    <TenantRecycleBinModal @register=\"registerRecycleBinModal\" @success=\"reload\" />\n  </div>\n</template>\n<script lang=\"ts\" name=\"system-tenant\" setup>\n  import { ref, unref } from 'vue';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import { getTenantList, deleteTenant, batchDeleteTenant, invitationUserJoin } from './tenant.api';\n  import { columns, searchFormSchema } from './tenant.data';\n  import TenantModal from './components/TenantModal.vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import TenantInviteUserModal from './components/TenantInviteUserModal.vue';\n  import TenantUserModal from './components/TenantUserList.vue';\n  import TenantPackList from './pack/TenantPackList.vue';\n  import TenantRecycleBinModal from './components/TenantRecycleBinModal.vue';\n\n  const { createMessage } = useMessage();\n  const [registerModal, { openModal }] = useModal();\n  const [registerSelUserModal, { openModal: userOpenModal }] = useModal();\n  const [registerTenUserModal, { openModal: tenUserOpenModal }] = useModal();\n  const [registerPackModal, { openModal: packModal }] = useModal();\n  const [registerRecycleBinModal, { openModal: recycleBinModal }] = useModal();\n\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext } = useListPage({\n    designScope: 'tenant-template',\n    tableProps: {\n      title: '租户列表',\n      api: getTenantList,\n      columns: columns,\n      formConfig: {\n        schemas: searchFormSchema,\n        fieldMapToTime: [['fieldTime', ['beginDate', 'endDate'], 'YYYY-MM-DD HH:mm:ss']],\n      },\n      actionColumn:{\n        width: 150,\n        fixed:'right'\n      }\n    },\n  });\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext;\n\n  /**\n   * 操作列定义\n   * @param record\n   */\n  function getActions(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          placement: 'left',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n      {\n        label: '用户',\n        onClick: handleSeeUser.bind(null, record.id),\n      },\n    ];\n  }\n\n  /**\n   * 新增事件\n   */\n  function handleAdd() {\n    openModal(true, {\n      isUpdate: false,\n    });\n  }\n\n  /**\n   * 编辑事件\n   */\n  function handleEdit(record) {\n    openModal(true, {\n      record,\n      isUpdate: true,\n    });\n  }\n\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteTenant({ id: record.id }, handleSuccess);\n  }\n\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    await batchDeleteTenant({ ids: selectedRowKeys.value }, handleSuccess);\n  }\n\n  /**\n   * 邀请用户加入租户\n   */\n  function handleInvitation() {\n    userOpenModal(true, {});\n  }\n\n  /**\n   * 用户选择回调事件\n   * @param options\n   * @param phone\n   * @param userSelectId\n   */\n  async function handleInviteUserOk(phone, username) {\n    // 代码逻辑说明: 【QQYUN-4605】后台的邀请谁加入租户，没办法选不是租户下的用户------------\n    if (phone) {\n      await invitationUserJoin({ ids: selectedRowKeys.value.join(','), phone: phone });\n    }\n    if (username) {\n      await invitationUserJoin({ ids: selectedRowKeys.value.join(','), username: username });\n    }\n  }\n\n  /**\n   * 查看用户\n   * @param id\n   */\n  function handleSeeUser(id) {\n    tenUserOpenModal(true, {\n      id: id,\n    });\n  }\n\n  /**\n   * 新增产品包\n   */\n  function handlePack() {\n    if (unref(selectedRowKeys).length > 1) {\n      createMessage.warn('请选择一个');\n      return;\n    }\n    packModal(true, {\n      tenantId: unref(selectedRowKeys.value.join(',')),\n      //我的租户显示新增和编辑产品包\n      showPackAddAndEdit: true\n    });\n  }\n\n  /**\n   * 回收站\n   */\n  function recycleBinClick() {\n    recycleBinModal(true, {});\n  }\n\n  /**\n   * 删除成功之后回调事件\n   */\n  function handleSuccess() {\n    (selectedRowKeys.value = []) && reload();\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/my/MyTenantDetail.vue",
    "content": "<!--我的租户详情-->\n<template>\n  <div class=\"message-set-container\">\n    <div class=\"message-set-box\">\n      <div class=\"message-set-header\">\n        <span class=\"font17\">组织信息</span>\n      </div>\n      <a-form :model=\"formState\">\n        <div class=\"message-set-content\">\n          <div class=\"common-info\">\n            <div class=\"common-info-row\">\n              <div class=\"common-info-row-label\">组织LOGO</div>\n              <div class=\"common-info-row-content\">\n                <JImageUpload v-model:value=\"formState.companyLogo\" @change=\"handleCompanyLogoChange\"></JImageUpload>\n              </div>\n            </div>\n            <div class=\"common-info-row m-top24\">\n              <div class=\"common-info-row-label\">组织名称</div>\n              <span class=\"m-right16\">{{ formState.name }}</span>\n              <span class=\"edit-name\" @click=\"goUpdate('name')\">修改</span>\n            </div>\n            <div class=\"common-info-row m-top24\">\n              <div class=\"common-info-row-label\">组织门牌号</div>\n              <div class=\"common-info-row-content\">\n                <span class=\"pointer\">\n                  <span>{{ formState.houseNumber }}</span>\n                </span>\n              </div>\n            </div>\n            <div class=\"common-info-row m-top24\">\n              <div class=\"common-info-row-label\">组织编号(ID)</div>\n              <div class=\"common-info-row-content\">\n                <span class=\"pointer\">\n                  <span>{{ formState.id }}</span>\n                </span>\n              </div>\n            </div>\n            <div class=\"split-line\"></div>\n            <div class=\"common-info-row\">\n              <div class=\"common-info-row-label\">所在地</div>\n              <span class=\"m-right16\">{{ formState.companyAddress_dictText }}</span>\n              <span class=\"edit-name\" @click=\"goUpdate('companyAddress')\">修改</span>\n            </div>\n            <div class=\"common-info-row m-top24\">\n              <div class=\"common-info-row-label\">所在行业</div>\n              <span class=\"m-right16\">{{ formState.trade_dictText }}</span>\n              <span class=\"edit-name\" @click=\"goUpdate('trade')\">修改</span>\n            </div>\n            <div class=\"common-info-row m-top24\">\n              <div class=\"common-info-row-label\">工作地点</div>\n              <span class=\"m-right16\">{{ formState.workPlace }}</span>\n              <span class=\"edit-name\" @click=\"goUpdate('workPlace')\">修改</span>\n            </div>\n            <div class=\"cancel-split-line\"></div>\n          </div>\n        </div>\n      </a-form>\n    </div>\n  </div>\n  <!-- 组织名称修改弹窗 -->\n  <a-modal v-model:open=\"modalVisible.name\" title=\"修改组织名称\" width=\"500\" destroy-on-close @ok=\"doUpdate('name')\">\n    <a-form ref=\"manageNameRef\" :model=\"updateInfo\" :rules=\"getManageNameRules\">\n      <a-form-item name=\"name\" class=\"form-item-padding\">\n        <div class=\"form-group\">\n              <span class=\"form-label\">\n                组织名称\n                <span class=\"txt-middle red\">*</span>\n              </span>\n          <a-input v-model:value=\"updateInfo.name\" />\n        </div>\n      </a-form-item>\n    </a-form>\n  </a-modal>\n  \n  <!-- 组织所在地弹窗 -->\n  <a-modal v-model:open=\"modalVisible.companyAddress\" title=\"所在地\" width=\"500\" destroy-on-close @ok=\"doUpdate('companyAddress')\">\n    <a-form :model=\"updateInfo\">\n      <a-form-item name=\"companyAddress\" class=\"form-item-padding\">\n        <div style=\"margin-top: 20px\">\n          <j-area-select v-model:value=\"updateInfo.companyAddress\" />\n        </div>\n      </a-form-item>\n    </a-form>\n  </a-modal>\n\n  <!-- 组织所在行业弹窗 -->\n  <a-modal v-model:open=\"modalVisible.trade\" title=\"设置所在行业\" width=\"500\" destroy-on-close @ok=\"doUpdate('trade')\">\n    <a-form :model=\"updateInfo\">\n      <a-form-item name=\"trade\" class=\"form-item-padding\">\n        <div style=\"margin-top: 20px\">\n          <j-dict-select-tag v-model:value=\"updateInfo.trade\" dictCode=\"trade\" />\n        </div>\n      </a-form-item>\n    </a-form>\n  </a-modal>\n\n  <!-- 工作地点弹窗 -->\n  <a-modal v-model:open=\"modalVisible.workPlace\" title=\"设置工作地点\" width=\"500\" destroy-on-close @ok=\"doUpdate('workPlace')\">\n    <a-form ref=\"workPlaceRef\" :model=\"updateInfo\">\n      <a-form-item name=\"name\" class=\"form-item-padding\">\n        <div style=\"margin-top: 20px\">\n          <a-textarea placeholder=\"请填写工作地点\" v-model:value=\"updateInfo.workPlace\" />\n        </div>\n      </a-form-item>\n    </a-form>\n  </a-modal>\n</template>\n<script lang=\"ts\" name=\"tenant-my-tenant-list\" setup>\n  import { onMounted, reactive, ref } from 'vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import {getFileAccessHttpUrl, tenantSaasMessage} from '@/utils/common/compUtils';\n  import { getTenantById, saveOrUpdateTenant } from '@/views/system/tenant/tenant.api';\n  import { getTenantId } from '@/utils/auth';\n  import { getDataByCode, getRealCode, provinceOptions } from '@/components/Form/src/utils/areaDataUtil';\n  import { initDictOptions } from '@/utils/dict';\n  import {createImgPreview} from \"@/components/Preview\";\n  import { JImageUpload } from \"@/components/Form\";\n  // import {updateTenantInfo} from \"@/views/super/myapps/organization/organization.api\";\n  import { defHttp } from \"/@/utils/http/axios\";\n  import JAreaSelect from \"/@/components/Form/src/jeecg/components/JAreaSelect.vue\";\n  import JDictSelectTag from \"/@/components/Form/src/jeecg/components/JDictSelectTag.vue\";\n\n  const { createMessage } = useMessage();\n  const formState = reactive({\n    id: '',\n    name: '',\n    houseNumber: '',\n    companyAddress_dictText: '',\n    trade_dictText: '',\n    workPlace: '',\n    createBy: '',\n    companyLogo: '',\n  });\n  let tradeOptions: any[] = [];\n  //组织名称ref\n  const manageNameRef= ref();\n  // modal显示\n  const modalVisible = reactive<any>({\n    name: false,\n    trade: false,\n    companyAddress: false\n  });\n\n  // 组织名称检验规则\n  const getManageNameRules =  {\n    name: [{ required: true, message: '组织名称不能为空', trigger: 'blur' }],\n  };\n\n  //修改对象\n  const updateInfo = reactive<any>({\n    name: '',\n    trade:'',\n    companyAddress: '',\n    workPlace: '',\n  });\n  \n  /**\n   * 初始化租户信息\n   */\n  async function initTenant() {\n    let result = await getTenantById({ id: getTenantId() });\n    if (result) {\n      if (result.companyAddress) {\n        formState.companyAddress_dictText = getPcaText(result.companyAddress);\n      } else {\n        formState.companyAddress_dictText = '';\n      }\n      if (result.trade) {\n        formState.trade_dictText = await getTradeText(result.trade);\n      } else {\n        formState.trade_dictText = '';\n      }\n      Object.assign(formState, result);\n    }\n  }\n\n  /**\n   * 获取省市区文本\n   * @param code\n   */\n  function getPcaText(code) {\n    let arr = getRealCode(code, 3);\n    console.log(\"arr:::\",arr)\n    let provinces: any = provinceOptions.filter((item) => item.value == arr[0]);\n    let cities: any[] = getDataByCode(arr[0]);\n    let areas: any[] = getDataByCode(arr[1]);\n    let str = '';\n    if (provinces && provinces.length > 0) {\n      str = provinces[0].label;\n      if (cities && cities.length > 0) {\n        let temp1 = cities.filter((item) => item.value == arr[1]);\n        str = str + '/' + temp1[0].label;\n        if (areas && areas.length > 0) {\n          let temp2 = areas.filter((item) => item.value == arr[2]);\n          str = str + '/' + temp2[0].label;\n        }\n      }\n    }\n    return str;\n  }\n\n  /**\n   * 获取行业文本\n   *\n   * @param trade\n   */\n  async function getTradeText(trade) {\n    if (tradeOptions.length == 0) {\n      let options: any = await initDictOptions('trade');\n      tradeOptions = options;\n    }\n    let arr = tradeOptions.filter((item) => item.value == trade);\n    if (arr.length > 0) {\n      return arr[0].label;\n    }\n    return '';\n  }\n\n  /**\n   * 公司logo上传成功事件\n   * \n   * @param val\n   */\n  function handleCompanyLogoChange(val) {\n    if(val){\n      saveOrUpdateTenant({ id: formState.id, companyLogo: val }, true)\n    }\n  }\n\n  /**\n   * 更新打开弹窗\n   * \n   * @param key\n   */\n  function goUpdate(key){\n    modalVisible[key] = true;\n    updateInfo[key] = formState[key];\n  }\n\n  /**\n   * 编辑租户信息\n   * @param params\n   */\n  async function updateTenantInfo(params){\n    return defHttp.put({ url: '/sys/tenant/editOwnTenant', params });\n  }\n\n  /**\n   * 更新数据\n   * @param key\n   */\n  async function doUpdate(key) {\n    if(key=='name'){\n      await manageNameRef.value.validateFields();\n    }\n    //所在地为空报错\n    if(key == 'companyAddress'){\n      if(updateInfo[key] instanceof Array){\n        updateInfo[key] = '';\n      }\n    }\n    let params = {\n      id: formState.id,\n      [key]: updateInfo[key]\n    };\n    await updateTenantInfo(params);\n    initTenant();\n    modalVisible[key] = false\n  }\n\n  onMounted(() => {\n    //提示信息\n    tenantSaasMessage('我的租户');\n    initTenant();\n  });\n</script>\n<style lang=\"less\" scoped>\n  .message-set-container {\n    box-sizing: border-box;\n    flex: 1;\n    margin: 16px;\n    min-height: 0;\n  }\n  .message-set-box {\n    background: #fff;\n    border-radius: 4px;\n    display: flex;\n    flex-direction: column;\n    min-width: 750px;\n    position: relative;\n    height: 100%;\n  }\n  .message-set-header {\n    align-items: center;\n    background: #fff;\n    border-bottom: 1px solid #eaeaea;\n    box-sizing: border-box;\n    color: #333;\n    display: flex;\n    font-weight: 600;\n    height: 57px;\n    line-height: 57px;\n    padding: 0 18px 0 24px;\n  }\n  .message-set-content {\n    box-sizing: border-box;\n    flex: 1;\n    min-height: 0;\n    overflow-x: hidden;\n  }\n  .font17 {\n    font-size: 17px;\n  }\n  .common-info {\n    padding: 20px 24px;\n    background: #ffffff;\n    margin-bottom: 20px;\n  }\n  .common-info-row {\n    color: #333;\n    display: flex;\n    font-size: 13px;\n  }\n  .common-info-row-label {\n    color: #757575;\n    display: flex;\n    justify-content: flex-start;\n    width: 140px;\n  }\n  .common-info-row-content {\n    display: flex;\n    flex: 1;\n    flex-direction: column;\n  }\n  .pointer {\n    cursor: pointer;\n  }\n  .delete-color {\n    color: #f51744;\n    cursor: pointer;\n  }\n  .set-describe {\n    color: #757575;\n    margin-top: 10px !important;\n  }\n  .m-top24 {\n    margin-top: 24px;\n  }\n  .edit-name {\n    border: none;\n    border-radius: 3px;\n    box-sizing: border-box;\n    color: #1e88e5;\n    cursor: pointer;\n    display: inline-block;\n    outline: none;\n    text-shadow: none;\n    user-select: none;\n    vertical-align: middle;\n  }\n  .m-right16 {\n    margin-right: 16px;\n  }\n  .split-line {\n    background: #eaeaea;\n    height: 1px;\n    margin: 40px 0;\n    width: 100%;\n  }\n  .cancel-split-line {\n    background: #eaeaea;\n    height: 1px;\n    margin: 40px 0 20px;\n    width: 100%;\n  }\n  .form-item-padding {\n    padding: 0 24px 22px;\n  }\n  .form-group {\n    display: table;\n    font-size: 13px;\n    position: relative;\n    width: 100%;\n    .form-label {\n      color: #333;\n      font-weight: 600;\n      line-height: 29px;\n    }\n    .txt-middle {\n      vertical-align: middle !important;\n    }\n  }\n  .red {\n    color: red;\n  }\n  .domain-background {\n    height: 56px;\n    margin-top: 6px;\n    width: 100px;\n    margin-left: 142px;\n  }\n  .cancellation {\n    color: #333333;\n    font-size: 20px;\n    font-weight: 700;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n  }\n  :deep(.ant-upload.ant-upload-select){\n    width: 80px !important;\n    height: 80px !important;\n    border: unset !important;\n  }\n  :deep(.ant-upload-list-item-container){\n    width: 80px !important;\n    height: 80px !important;\n    border: unset !important;\n  }\n  .edit-name {\n    border: none;\n    border-radius: 3px;\n    box-sizing: border-box;\n    color: #1e88e5;\n    cursor: pointer;\n    display: inline-block;\n    outline: none;\n    text-shadow: none;\n    user-select: none;\n    vertical-align: middle;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/my/MyTenantList.vue",
    "content": "<template>\n  <div>\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\" @fetch-success=\"onFetchSuccess\">\n      <template #tableTitle>\n        <a-button\n          preIcon=\"ant-design:user-add-outlined\"\n          type=\"primary\"\n          @click=\"handleInvitation\"\n          style=\"margin-right: 5px\"\n          :disabled=\"selectedRowKeys.length === 0\"\n          >邀请用户加入</a-button\n        >\n<!--        <a-button\n          preIcon=\"ant-design:plus-outlined\"\n          type=\"primary\"\n          @click=\"handlePack\"\n          style=\"margin-right: 5px\"\n          :disabled=\"selectedRowKeys.length === 0\"\n          >套餐</a-button\n        >-->\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getActions(record)\" />\n      </template>\n    </BasicTable>\n    <TenantInviteUserModal @register=\"registerSelUserModal\" @inviteOk=\"handleInviteUserOk\" />\n    <TenantUserModal @register=\"registerTenUserModal\" />\n    <!--  产品包  -->\n    <TenantPackList @register=\"registerPackModal\" />\n  </div>\n</template>\n<script lang=\"ts\" name=\"tenant-my-tenant-list\" setup>\n  import { onMounted, ref, unref } from 'vue';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import { invitationUserJoin, getTenantPageListByUserId } from '../tenant.api';\n  import { columns, searchFormSchema } from '../tenant.data';\n  import TenantModal from '../components/TenantModal.vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import TenantInviteUserModal from '../components/TenantInviteUserModal.vue';\n  import TenantUserModal from '../components/TenantUserList.vue';\n  import TenantPackList from '../pack/TenantPackList.vue';\n  import { getTenantId } from '/@/utils/auth';\n  import { useUserStore } from '/@/store/modules/user';\n  import { tenantSaasMessage } from \"@/utils/common/compUtils\";\n\n  const { createMessage } = useMessage();\n  const [registerModal, { openModal }] = useModal();\n  const [registerSelUserModal, { openModal: userOpenModal }] = useModal();\n  const [registerTenUserModal, { openModal: tenUserOpenModal }] = useModal();\n  const [registerPackModal, { openModal: packModal }] = useModal();\n  const userStore = useUserStore();\n\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext } = useListPage({\n    designScope: 'tenant-template',\n    tableProps: {\n      title: '租户列表',\n      api: getTenantPageListByUserId,\n      columns: columns,\n      formConfig: {\n        schemas: searchFormSchema,\n      },\n      actionColumn: {\n        width: 150,\n        fixed: 'right',\n      },\n      rowSelection:{\n        type: \"radio\",\n      },\n      beforeFetch: (params) => {\n        return Object.assign(params, { userTenantStatus: '1,3,4' });\n      },\n    },\n  });\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext;\n\n  // 默认选中当前租户\n  function onFetchSuccess(data) {\n    let items = data.items;\n    console.log('items:', items);\n    // 当前登录租户ID\n    let loginTenantId = getTenantId();\n    console.log('loginTenantId:', loginTenantId);\n    // 如果当前登录租户ID在列表中，则默认选中\n    if (items && items.length > 0 && loginTenantId) {\n      for (let i = 0; i < items.length; i++) {\n        if (items[i].id == loginTenantId) {\n          console.log('items[i].id:', items[i].id);\n          selectedRowKeys.value = [items[i].id];\n          selectedRows.value = [items[i]];\n          return;\n        }\n      }\n    }\n  }\n\n  /**\n   * 操作列定义\n   * @param record\n   */\n  function getActions(record) {\n    return [\n      {\n        label: '用户',\n        onClick: handleSeeUser.bind(null, record.id),\n      },\n    ];\n  }\n\n  /**\n   * 邀请用户加入租户\n   */\n  function handleInvitation() {\n    userOpenModal(true, {});\n  }\n\n  /**\n   * 用户选择回调事件\n   * @param options\n   * @param phone\n   * @param userSelectId\n   */\n  async function handleInviteUserOk(phone, username) {\n    if (phone) {\n      await invitationUserJoin({ ids: selectedRowKeys.value.join(','), phone: phone });\n    }\n    if (username) {\n      await invitationUserJoin({ ids: selectedRowKeys.value.join(','), username: username });\n    }\n  }\n\n  /**\n   * 查看用户\n   * @param id\n   */\n  async function handleSeeUser(id) {\n    tenUserOpenModal(true, {\n      id: id,\n    });\n  }\n\n  /**\n   * 新增产品包\n   */\n  async function handlePack() {\n    if (unref(selectedRowKeys).length > 1) {\n      createMessage.warn('请选择一个');\n      return;\n    }\n    packModal(true, {\n      tenantId: unref(selectedRowKeys.value.join(',')),\n      //我的租户不显示新增和编辑产品包\n      showPackAddAndEdit: false\n    });\n  }\n\n  /**\n   * 删除成功之后回调事件\n   */\n  function handleSuccess() {\n    (selectedRowKeys.value = []) && reload();\n  }\n\n  onMounted(()=>{\n    //提示信息\n    tenantSaasMessage('我的租户')\n  })\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/pack/PackPermissionDrawer.vue",
    "content": "<template>\n  <BasicDrawer v-bind=\"$attrs\" @register=\"registerDrawer\" width=\"650px\" destroyOnClose showFooter>\n    <template #title>\n      权限配置\n      <a-dropdown>\n        <a-button class=\"more-icon\">\n          更多操作\n          <Icon icon=\"ant-design:down-outlined\" size=\"14px\" style=\"position: relative; top: 1px; right: 5px\"></Icon>\n        </a-button>\n        <template #overlay>\n          <a-menu @click=\"treeMenuClick\">\n            <a-menu-item key=\"checkAll\">选择全部</a-menu-item>\n            <a-menu-item key=\"cancelCheck\">取消选择</a-menu-item>\n            <div class=\"line\"></div>\n            <a-menu-item key=\"openAll\">展开全部</a-menu-item>\n            <a-menu-item key=\"closeAll\">折叠全部</a-menu-item>\n            <div class=\"line\"></div>\n            <a-menu-item key=\"relation\">层级关联</a-menu-item>\n            <a-menu-item key=\"standAlone\">层级独立</a-menu-item>\n          </a-menu>\n        </template>\n      </a-dropdown>\n    </template>\n    <BasicTree\n      ref=\"treeRef\"\n      checkable\n      :treeData=\"treeData\"\n      :checkedKeys=\"checkedKeys\"\n      :expandedKeys=\"expandedKeys\"\n      :selectedKeys=\"selectedKeys\"\n      :clickRowToExpand=\"false\"\n      :checkStrictly=\"true\"\n      title=\"所拥有的的权限\"\n      @check=\"onCheck\"\n    >\n      <template #title=\"{ slotTitle, ruleFlag }\">\n        {{ slotTitle }}\n        <Icon v-if=\"ruleFlag\" icon=\"ant-design:align-left-outlined\" style=\"margin-left: 5px; color: red\"></Icon>\n      </template>\n    </BasicTree>\n    <!--右下角按钮-->\n    <template #footer>\n      <!-- <PopConfirmButton title=\"确定放弃编辑？\" @confirm=\"closeDrawer\" okText=\"确定\" cancelText=\"取消\"></PopConfirmButton> -->\n      <a-button @click=\"closeDrawer\">取消</a-button>\n      <a-button @click=\"handleSubmit(false)\" type=\"primary\" :loading=\"loading\" ghost style=\"margin-right: 0.8rem\">仅保存</a-button>\n      <a-button @click=\"handleSubmit(true)\" type=\"primary\" :loading=\"loading\">保存并关闭</a-button>\n    </template>\n  </BasicDrawer>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, unref } from 'vue';\n  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';\n  import { BasicTree, TreeItem } from '/@/components/Tree';\n  import { queryPremTreeList, editPackPermission } from '../tenant.api';\n  import { useI18n } from '/@/hooks/web/useI18n';\n  import { PACK_AUTH_CONFIG_KEY } from '/@/enums/cacheEnum';\n  const emit = defineEmits(['register','success']);\n  //树的信息\n  const treeData = ref<TreeItem[]>([]);\n  //树的全部节点信息\n  const allTreeKeys = ref([]);\n  //树的选择节点信息\n  const checkedKeys = ref<any>([]);\n  //树的选中的节点信息\n  const selectedKeys = ref([]);\n  const packId = ref('');\n  //树的实例\n  const treeRef = ref(null);\n  const loading = ref(false);\n\n  //展开折叠的key\n  const expandedKeys = ref<any>([]);\n  //父子节点选中状态是否关联 true不关联，false关联\n  const checkStrictly = ref<boolean>(false);\n  const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {\n    await reset();\n    setDrawerProps({ confirmLoading: false, loading: true });\n    packId.value = data.packId;\n    //初始化数据\n    const roleResult = await queryPremTreeList();\n    treeData.value = translateTitle(roleResult.treeList);\n    allTreeKeys.value = roleResult.ids;\n    const localData = localStorage.getItem(PACK_AUTH_CONFIG_KEY);\n    if (localData) {\n      const obj = JSON.parse(localData);\n      obj.level && treeMenuClick({ key: obj.level });\n      obj.expand && treeMenuClick({ key: obj.expand });\n    } else {\n      expandedKeys.value = roleResult.ids;\n    }\n\n    //初始化角色菜单数据\n    if(data.permissionIds){\n      checkedKeys.value = data.permissionIds.split(\",\");\n    }\n\n    setDrawerProps({ loading: false });\n  });\n  /**\n   * 翻译菜单名称\n   */\n  function translateTitle(data) {\n    if (data?.length) {\n      data.forEach((item) => {\n        if (item.slotTitle) {\n          const { t } = useI18n();\n          if (item.slotTitle.includes(\"t('\") && t) {\n            item.slotTitle = new Function('t', `return ${item.slotTitle}`)(t);\n          }\n        }\n        if (item.children?.length) {\n          translateTitle(item.children);\n        }\n      });\n    }\n    return data;\n  }\n  /**\n   * 点击选中\n   */\n  function onCheck(o, e) {\n    // checkStrictly: true=>层级独立，false=>层级关联.\n    if (checkStrictly.value) {\n      checkedKeys.value = o.checked ? o.checked : o;\n    } else {\n      const keys = getNodeAllKey(e.node, 'children', 'key');\n      if (e.checked) {\n        // 反复操作下可能会有重复的keys，得用new Set去重下\n        checkedKeys.value = [...new Set([...checkedKeys.value, ...keys])];\n      } else {\n        const result = removeMatchingItems(checkedKeys.value, keys);\n        checkedKeys.value = result;\n      }\n    }\n  }\n  /**\n   * 删除相匹配数组的项\n   */\n  function removeMatchingItems(arr1, arr2) {\n    // 使用哈希表记录 arr2 中的元素\n    const hashTable = {};\n    for (const item of arr2) {\n      hashTable[item] = true;\n    }\n    // 使用 filter 方法遍历第一个数组，过滤出不在哈希表中存在的项\n    return arr1.filter((item) => !hashTable[item]);\n  }\n  /**\n   * 获取当前节点及以下所有子孙级的key\n   */\n  function getNodeAllKey(node: any, children: any, key: string) {\n    const result: any = [];\n    result.push(node[key]);\n    const recursion = (data) => {\n      data.forEach((item: any) => {\n        result.push(item[key]);\n        if (item[children]?.length) {\n          recursion(item[children]);\n        }\n      });\n    };\n    node[children]?.length && recursion(node[children]);\n    return result;\n  }\n  \n  /**\n   * 数据重置\n   */\n  function reset() {\n    treeData.value = [];\n    allTreeKeys.value = [];\n    checkedKeys.value = [];\n    selectedKeys.value = [];\n    packId.value = '';\n  }\n  /**\n   * 获取tree实例\n   */\n  function getTree() {\n    const tree = unref(treeRef);\n    if (!tree) {\n      throw new Error('tree is null!');\n    }\n    return tree;\n  }\n  /**\n   * 提交\n   */\n  async function handleSubmit(exit) {\n    let params = {\n      id: unref(packId),\n      permissionIds: unref(getTree()?.getCheckedKeys()).join(','),\n    };\n    if (loading.value === false) {\n      await doSave(params);\n    } else {\n      console.log('请等待上次执行完毕!');\n    }\n    if (exit) {\n      // 如果关闭\n      closeDrawer();\n    }\n  }\n\n  // VUE角色授权重复保存 #352\n  async function doSave(params) {\n    loading.value = true;\n    try {\n      await editPackPermission(params);\n      emit(\"success\")\n    } catch (e) {\n      loading.value = false;\n    }\n    setTimeout(() => {\n      loading.value = false;\n    }, 500);\n  }\n\n  /**\n   * 树菜单选择\n   * @param key\n   */\n  function treeMenuClick({ key }) {\n    if (key === 'checkAll') {\n      checkedKeys.value = allTreeKeys.value;\n    } else if (key === 'cancelCheck') {\n      checkedKeys.value = [];\n    } else if (key === 'openAll') {\n      expandedKeys.value = allTreeKeys.value;\n      saveLocalOperation('expand', 'openAll');\n    } else if (key === 'closeAll') {\n      expandedKeys.value = [];\n      saveLocalOperation('expand', 'closeAll');\n    } else if (key === 'relation') {\n      checkStrictly.value = false;\n      saveLocalOperation('level', 'relation');\n    } else {\n      checkStrictly.value = true;\n      saveLocalOperation('level', 'standAlone');\n    }\n  }\n  /**\n   * 角色授权弹窗操作缓存\n   */\n  const saveLocalOperation = (key, value) => {\n    const localData = localStorage.getItem(PACK_AUTH_CONFIG_KEY);\n    const obj = localData ? JSON.parse(localData) : {};\n    obj[key] = value;\n    localStorage.setItem(PACK_AUTH_CONFIG_KEY, JSON.stringify(obj));\n  };\n</script>\n\n<style lang=\"less\" scoped>\n  /** 固定操作按钮 */\n  .jeecg-basic-tree {\n    position: absolute;\n    width: 618px;\n  }\n  .line {\n    height: 1px;\n    width: 100%;\n    border-bottom: 1px solid #f0f0f0;\n  }\n  .more-icon {\n    float: right;\n    margin-right: 2px;\n    cursor: pointer;\n  }\n  :deep(.jeecg-tree-header) {\n    border-bottom: none;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/pack/TenantCurrentPackList.vue",
    "content": "<!-- 当前租户下套餐 -->\n<template>\n  <div style=\"display: flex; width: 100%\">\n    <div :style=\"leftStyle\">\n      <BasicTable @register=\"registerTable\">\n        <template #tableTitle>\n          <div style=\"margin-left: 10px; margin-top: 5px\"\n            >当前登录租户: <span class=\"tenant-name\">{{ loginTenantName }}</span>\n          </div>\n        </template>\n        <!--操作栏-->\n        <template #action=\"{ record }\">\n          <TableAction :actions=\"getTableAction(record)\" />\n        </template>\n      </BasicTable>\n    </div>\n    <div v-if=\"showRight\" style=\"width: 49%; transition: width 0.3s\">\n      <TenantUserRightList ref=\"rightListRef\" @cancel=\"handleCancel\"></TenantUserRightList>\n    </div>\n  </div>\n  <TenantPackMenuModal @register=\"registerPackMenu\" @success=\"success\" />\n</template>\n<script lang=\"ts\">\n  import { ref, unref, defineComponent, defineEmits } from 'vue';\n  import { useModal } from '/@/components/Modal';\n  import { packFormSchema, tenantPackColumns } from '../tenant.data';\n  import { getLoginTenantName, packList } from '../tenant.api';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import TenantPackMenuModal from './TenantPackMenuModal.vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { getTenantId } from '/@/utils/auth';\n  import TenantUserRightList from '../components/TenantUserRightList.vue';\n\n  export default defineComponent({\n    name: 'TenantCurrentPackList',\n    components: {\n      TenantUserRightList,\n      BasicTable,\n      TableAction,\n      TenantPackMenuModal,\n    },\n    setup() {\n      const [registerPackMenu, { openModal }] = useModal();\n      const [registerPackUser, { openModal: packUserOpenModal }] = useModal();\n\n      const tenantId = ref<number>();\n      const rightListRef = ref<any>();\n      //是否显示右侧用户列表\n      const showRight = ref<any>();\n      //左侧样式\n      const leftStyle = ref<any>({\n        width: '100%',\n        transition: 'width 0.3s',\n      });\n\n      // 列表页面公共参数、方法\n      const { prefixCls, tableContext } = useListPage({\n        designScope: 'tenant-template',\n        tableProps: {\n          api: packList,\n          columns: tenantPackColumns,\n          immediate: false,\n          formConfig: {\n            schemas: packFormSchema,\n            labelCol: {\n              xxl: 8,\n            },\n            actionColOptions: {\n              xs: 24,\n              sm: 8,\n              md: 8,\n              lg: 8,\n              xl: 8,\n              xxl: 8,\n            },\n          },\n          beforeFetch: (params) => {\n            return Object.assign(params, { tenantId: tenantId.value, status: '1', packType: 'custom' });\n          },\n        },\n      });\n      const [registerTable, { reload }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext;\n      //当前登录的租户名称\n      const loginTenantName = ref<string>('');\n      const { createMessage } = useMessage();\n\n      /**\n       * 获取租户名称\n       */\n      getTenantName();\n\n      async function getTenantName() {\n        let id = getTenantId();\n        if (id) {\n          loginTenantName.value = await getLoginTenantName();\n          tenantId.value = Number(id);\n          await reload();\n        }\n      }\n\n      /**\n       * 表格操作\n       * @param record\n       */\n      function getTableAction(record) {\n        return [\n          {\n            label: '用户',\n            onClick: seeTenantPackUser.bind(null, record),\n          },\n          {\n            label: '权限详情',\n            onClick: handleDetail.bind(null, record),\n          },\n        ];\n      }\n\n      /**\n       * 成功\n       */\n      function success() {\n        (selectedRowKeys.value = []) && reload();\n      }\n\n      /**\n       * 套餐包下面的用户\n       * @param record\n       */\n      function seeTenantPackUser(record) {\n        showRight.value = true;\n        leftStyle.value = {\n          width: '50%',\n          transition: 'width 0.3s',\n        };\n        setTimeout(() => {\n          rightListRef.value.initData(record);\n        }, 300);\n      }\n\n      /**\n       * 详情\n       * @param record\n       */\n      function handleDetail(record) {\n        openModal(true, {\n          isUpdate: true,\n          record: record,\n          tenantId: unref(tenantId),\n          packType: 'custom',\n          showFooter: false,\n        });\n      }\n\n      /**\n       * 关闭回调\n       */\n      function handleCancel() {\n        showRight.value = false;\n        leftStyle.value = {\n          width: '100%',\n          transition: 'width 0.3s',\n        };\n      }\n\n      return {\n        registerPackMenu,\n        success,\n        getTableAction,\n        registerTable,\n        rowSelection,\n        rightListRef,\n        showRight,\n        registerPackUser,\n        loginTenantName,\n        leftStyle,\n        handleCancel,\n      };\n    },\n  });\n</script>\n<style lang=\"less\" scoped>\n  .tenant-name {\n    text-decoration: underline;\n    margin: 5px;\n    font-size: 15px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/pack/TenantDefaultPackList.vue",
    "content": "<template>\n  <div>\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <template #tableTitle>\n        <a-button preIcon=\"ant-design:plus-outlined\" type=\"primary\" @click=\"handleAdd\">租户默认套餐\n        </a-button>\n        <a-button\n          v-if=\"selectedRowKeys.length > 0\"\n          preIcon=\"ant-design:delete-outlined\"\n          type=\"primary\"\n          @click=\"handlePackBatch\"\n          style=\"margin-right: 5px\"\n        >批量删除\n        </a-button>\n        <span style=\"color: #666; font-size: 14px; margin-left: 12px; margin-top: 4px; display: inline-block;\">\n          租户默认套餐是指新建租户时自动拥有的基础套餐，所有租户都将继承这些套餐权限\n        </span>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getActions(record)\" />\n      </template>\n    </BasicTable>\n    <!--  套餐包  -->\n    <TenantPackMenuModal @register=\"registerPackMenuModal\" @success=\"handleSuccess\"/>\n    <PackPermissionDrawer @register=\"registerPackPermDrawer\" @success=\"handleSuccess\"/>\n  </div>\n</template>\n<script lang=\"ts\" name=\"tenant-default-pack\" setup>\n  import { ref, unref } from 'vue';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useModal } from '/@/components/Modal';\n  import { deleteTenantPack, packList } from '../tenant.api';\n  import { defalutPackColumns, defaultPackFormSchema } from \"../tenant.data\";\n  import TenantPackMenuModal from './TenantPackMenuModal.vue';\n  import PackPermissionDrawer from './PackPermissionDrawer.vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { useUserStore } from '/@/store/modules/user';\n  import {Modal} from \"ant-design-vue\";\n  import {useDrawer} from \"@/components/Drawer\";\n\n  const { createMessage } = useMessage();\n  const [registerModal, { openModal }] = useModal();\n  const [registerPackMenuModal, { openModal: packModal }] = useModal();\n  const userStore = useUserStore();\n\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext } = useListPage({\n    designScope: 'tenant-template',\n    tableProps: {\n      api: packList,\n      columns: defalutPackColumns,\n      formConfig: {\n        schemas: defaultPackFormSchema,\n      },\n      beforeFetch: (params) => {\n        return Object.assign(params, { packType: 'default' });\n      },\n    },\n  });\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext;\n  const [registerPackPermDrawer, { openDrawer: openPackPermDrawer }] = useDrawer();\n\n  /**\n   * 操作列定义\n   * @param record\n   */\n  function getActions(record) {\n    return [\n      {\n        label: '授权',\n        onClick: handleRolePrem.bind(null, record),\n      },\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除租户套餐包',\n          confirm: handleDelete.bind(null, record.id),\n        },\n      },\n    ];\n  }\n\n  /**\n   * 编辑套餐包\n   */ \n  function handleAdd() {\n    packModal(true, {\n      isUpdate: false,\n      packType:'default',\n      showFooter: true\n    });\n  }\n  \n  \n  /**\n   * 删除默认套餐包\n   */ \n  async function handleDelete(id) {\n    await deleteTenantPack({ ids: id }, handleSuccess);\n  }\n  /**\n   * 编辑\n   */\n  function handleEdit(record) {\n    packModal(true, {     \n      isUpdate: true,\n      record: record,\n      packType:'default',\n      showFooter: true\n    });\n  }\n\n  /**\n   * 新增套餐包\n   */\n  async function handlePack() {\n    if (unref(selectedRowKeys).length > 1) {\n      createMessage.warn('请选择一个');\n      return;\n    }\n    packModal(true, {\n      tenantId: unref(selectedRowKeys.value.join(',')),\n    });\n  }\n\n  /**\n   * 删除成功之后回调事件\n   */\n  function handleSuccess() {\n    (selectedRowKeys.value = []) && reload();\n  }\n\n  /**\n   * 批量删除套餐包\n   */\n  async function handlePackBatch() {\n    Modal.confirm({\n      title: '删除租户套餐包',\n      content: '是否删除租户套餐包',\n      okText: '确认',\n      cancelText: '取消',\n      onOk: async () => {\n        await deleteTenantPack({ ids: selectedRowKeys.value.join(',')}, handleSuccess);\n      }\n    })\n  }\n\n  /**\n   * 授权\n   * \n   * @param record\n   */\n  function handleRolePrem(record) {\n    openPackPermDrawer(true,{\n      packId: record.id,\n      permissionIds: record.permissionIds\n    })\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/pack/TenantPackList.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"title\" @ok=\"handleSubmit\" width=\"800px\" :showCancelBtn=\"false\" :showOkBtn=\"false\">\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <template #tableTitle>\n        <a-button preIcon=\"ant-design:plus-outlined\" type=\"primary\" @click=\"handleAdd\" style=\"margin-right: 5px\" v-if=\"showPackAddAndEdit\">新增 </a-button>\n        <a-button\n          v-if=\"selectedRowKeys.length > 0\"\n          preIcon=\"ant-design:delete-outlined\"\n          type=\"primary\"\n          @click=\"handlePackBatch\"\n          style=\"margin-right: 5px\"\n          >批量删除\n        </a-button>\n        <a-button\n          preIcon=\"ant-design:sync-outlined\"\n          type=\"primary\"\n          @click=\"handleSyncDefaultPack\"\n          style=\"margin-right: 5px\"\n          >初始化默认套餐\n        </a-button>\n      </template>\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getActions(record)\" :dropDownActions=\"getDropDownAction(record)\" />\n      </template>\n    </BasicTable>\n  </BasicModal>\n  <TenantPackMenuModal @register=\"registerPackMenu\" @success=\"success\" />\n  <TenantPackUserModal @register=\"registerPackUser\" @success=\"success\" />\n  <PackPermissionDrawer @register=\"registerPackPermDrawer\" @success=\"success\"/>\n</template>\n<script lang=\"ts\" setup name=\"tenant-pack-modal\">\n  import { reactive, ref, unref } from 'vue';\n  import { BasicModal, useModal, useModalInner } from '/@/components/Modal';\n  import { packColumns, userColumns, packFormSchema } from '../tenant.data';\n  import { getTenantUserList, leaveTenant, packList, deleteTenantPack, syncDefaultTenantPack } from '../tenant.api';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import TenantPackMenuModal from './TenantPackMenuModal.vue';\n  import {Modal} from \"ant-design-vue\";\n  import TenantPackUserModal from './TenantPackUserModal.vue';\n  import {useMessage} from \"/@/hooks/web/useMessage\";\n  import PackPermissionDrawer from \"@/views/system/tenant/pack/PackPermissionDrawer.vue\";\n  import { useDrawer } from \"@/components/Drawer\";\n\n  const [registerPackMenu, { openModal }] = useModal();\n  const [registerPackUser, { openModal: packUserOpenModal }] = useModal();\n  const [registerPackPermDrawer, { openDrawer: openPackPermDrawer }] = useDrawer();\n  \n  const tenantId = ref<number>(0);\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext } = useListPage({\n    designScope: 'tenant-template',\n    tableProps: {\n      api: packList,\n      columns: packColumns,\n      immediate: false,\n      formConfig: {\n        schemas: packFormSchema,\n        labelCol: {\n          xxl: 8,\n        },\n        actionColOptions: {\n          xs: 24,\n          sm: 8,\n          md: 8,\n          lg: 8,\n          xl: 8,\n          xxl: 8,\n        },\n      },\n      beforeFetch: (params) => {\n        return Object.assign(params, { tenantId: unref(tenantId), packType:'custom' });\n      },\n    },\n  });\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext;\n  // Emits声明\n  const emit = defineEmits(['register', 'success']);\n  //是否显示新增和编辑套餐包\n  const showPackAddAndEdit = ref<boolean>(false);\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    tenantId.value = data.tenantId;\n    showPackAddAndEdit.value = data.showPackAddAndEdit;\n    success();\n  });\n  //设置标题\n  const title = '租户个性化套餐包';\n\n  //表单提交事件\n  async function handleSubmit(v) {\n    closeModal();\n  }\n\n  function getActions(record) {\n    return [\n      {\n        label: '用户',\n        onClick: seeTenantPackUser.bind(null, record),\n      },\n      {\n        label: '授权',\n        onClick: handleRolePrem.bind(null, record),\n        ifShow: ()=>{ return showPackAddAndEdit.value }\n      },\n    ];\n  }\n\n  /**\n   * 成功\n   */\n  function success() {\n    (selectedRowKeys.value = []) && reload();\n  }\n\n  /**\n   * 编辑\n   * @param record\n   */\n  async function handleEdit(record) {\n    openModal(true, {\n      isUpdate: true,\n      record: record,\n      tenantId: unref(tenantId),\n      packType:'custom',\n      showFooter: true\n    });\n  }\n\n  //默认系统套餐包不允许删除,包含(超级管理员、组织账户管理员、组织应用管理员)\n  const packCode = reactive<any>(['superAdmin','accountAdmin','appAdmin']);\n  const { createMessage } = useMessage();\n  \n  /**\n   * 删除套餐包\n   * @param 删除\n   */\n  async function handleDelete(record) {\n    // 代码逻辑说明: 系统默认套餐包不允许删除------------\n    if(packCode.indexOf(record.packCode) != -1){\n        createMessage.warning(\"默认系统套餐包不允许删除\");\n       return;\n    }\n    if(record.packCode && record.packCode.indexOf(\"default\") != -1){\n      createMessage.warning(\"默认套餐包不允许删除\");\n      return;\n    }\n    await deleteTenantPack({ ids: record.id }, success);\n  }\n\n  /**\n   * 批量删除套餐包\n   */\n  async function handlePackBatch() {\n    let value = selectedRows.value;\n    if(value && value.length>0){\n      for (let i = 0; i < value.length; i++) {\n        if(packCode.indexOf(value[i].packCode) != -1){\n          createMessage.warning(\"默认系统套餐包不允许删除\");\n          return;\n        }\n        // 代码逻辑说明: 默认套餐不允许删除---\n        if(value[i].packCode && value[i].packCode.indexOf(\"default\") != -1){\n          createMessage.warning(\"默认套餐包不允许删除\");\n          return;\n        }\n      }\n    }\n    Modal.confirm({\n      title: '删除租户套餐包',\n      content: '是否删除租户套餐包',\n      okText: '确认',\n      cancelText: '取消',\n      onOk: async () => {\n        await deleteTenantPack({ ids: selectedRowKeys.value.join(',')}, success);\n      }\n    })\n  }\n\n  async function handleSyncDefaultPack() {\n    Modal.confirm({\n      title: '初始化默认套餐包',\n      content: '是否初始化默认套餐包',\n      okText: '确认',\n      cancelText: '取消',\n      onOk: async () => {\n        await syncDefaultTenantPack({tenantId: unref(tenantId)}, success);\n      },\n    });\n  }\n\n  /**\n   *\n   * 新增表单\n   */\n  function handleAdd() {\n    openModal(true, {\n      isUpdate: false,\n      tenantId: unref(tenantId),\n      packType:'custom',\n      showFooter: true\n    });\n  }\n\n  /**\n   * 套餐包下面的用户\n   * @param record\n   */\n  function seeTenantPackUser(record) {\n    packUserOpenModal(true,{\n      record:record\n    })\n  }\n\n  /**\n   * 更多\n   * @param record\n   */\n  function getDropDownAction(record) {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n        ifShow: ()=>{ return showPackAddAndEdit.value }\n      },\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除租户套餐包',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ]\n  }\n\n  /**\n   * 详情\n   * @param record\n   */\n  function handleDetail(record) {\n    openModal(true, {\n      isUpdate: true,\n      record: record,\n      tenantId: unref(tenantId),\n      packType:'custom',\n      showFooter: false\n    });\n  }\n\n\n  /**\n   * 授权\n   *\n   * @param record\n   */\n  function handleRolePrem(record) {\n    openPackPermDrawer(true,{\n      packId: record.id,\n      permissionIds: record.permissionIds\n    })\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/pack/TenantPackMenuModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" :title=\"title\" @ok=\"handleSubmit\" width=\"800px\" destroyOnClose>\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup name=\"tenant-pack-menu-modal\">\n  import { ref, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form';\n  import { packMenuFormSchema } from '../tenant.data';\n  import { addPackPermission, editPackPermission } from '../tenant.api';\n\n  const isUpdate = ref<boolean>(false);\n  // Emits声明\n  const emit = defineEmits(['register', 'success']);\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate, setProps }] = useForm({\n    schemas: packMenuFormSchema,\n    showActionButtonGroup: false,\n  });\n  //租户\n  const tenantId = ref<number>();\n  //套餐包类型\n  const packType = ref<number>();\n  //权限\n  const permissionIds = ref<string>();\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    isUpdate.value = !!data?.isUpdate;\n    if(data.tenantId){\n      tenantId.value = data.tenantId;\n    }\n    packType.value = data.packType;\n    if (unref(isUpdate)) {\n      //表单赋值\n      console.log(data.record)\n      await setFieldsValue({ ...data.record });\n      permissionIds.value = data.record.permissionIds;\n    }\n    // 代码逻辑说明: 【QQYUN-5685】2 套餐包增加一个查看：添加底部有没有按钮及表单禁用------------\n    setModalProps({ confirmLoading: false, showCancelBtn:!!data?.showFooter, showOkBtn:!!data?.showFooter });\n    // 隐藏底部时禁用整个表单\n    setProps({ disabled: !data?.showFooter })\n  });\n  //设置标题\n  const title = computed(() => (unref(isUpdate) ? '编辑 租户套餐' : '新增 租户套餐'));\n  //表单提交事件\n  async function handleSubmit(v) {\n    const values = await validate();\n    \n    setModalProps({ confirmLoading: true });\n    values.packType = unref(packType);\n    if(values.packType === 'custom'){\n      values.tenantId = unref(tenantId);\n    }else{\n      values.tenantId = 0;\n    }\n    values.permissionIds = permissionIds.value;\n    if (!unref(isUpdate)) {\n      await addPackPermission(values);\n    } else {\n      await editPackPermission(values);\n    }\n    emit('success');\n    setModalProps({ confirmLoading: false });\n    closeModal();\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/pack/TenantPackUserModal.vue",
    "content": "<template>\n  <BasicModal @register=\"registerModal\" destroyOnClose :title=\"title\" :width=\"1000\" :footer=\"null\">\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <template #departNames=\"{ text, record }\">\n        <template v-if=\"text && text.length > 0\">\n          {{ getName(text) }}\n        </template>\n      </template>\n      <template #positionNames=\"{ text, record }\">\n        <template v-if=\"text && text.length > 0\">\n          {{ getName(text) }}\n        </template>\n      </template>\n      <template #tableTitle>\n        <a-button preIcon=\"ant-design:usergroup-add-outlined\" type=\"primary\" @click=\"addUser\">邀请成员</a-button>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n    </BasicTable>\n    <tenant-user-select-modal :multi=\"true\" @register=\"registerUserModal\" @on-select=\"onSelected\" :tenantId=\"getTenantId\"></tenant-user-select-modal>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\">\n  import { computed, defineComponent, reactive, ref } from 'vue';\n  import { BasicModal, useModal, useModalInner } from '/@/components/Modal';\n  import { BasicTable, TableAction } from '/@/components/Table';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { tenantPackUserColumns } from '../tenant.data';\n  import { queryTenantPackUserList, deleteTenantPackUser, addTenantPackUser } from '../tenant.api';\n  import TenantUserSelectModal from '../components/TenantUserSelectModal.vue';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useUserStore } from '/@/store/modules/user';\n\n  export default defineComponent({\n    name: 'TenantPackUserModal',\n    components: { BasicModal, BasicTable, TableAction, TenantUserSelectModal },\n    setup() {\n      //获取租户id\n      const getTenantId = computed(()=>{\n        return tenantPackData.tenantId;\n      })\n      \n      //套餐包信息\n      const tenantPackData = reactive<any>({});\n      //表单赋值\n      const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n        setModalProps({ confirmLoading: false, showCancelBtn: true, showOkBtn: false });\n        Object.assign(tenantPackData, data.record);\n        await reload();\n      });\n      const { createMessage } = useMessage();\n      //设置标题\n      const title = ref<string>('用户');\n      //注册table数据\n      const { tableContext } = useListPage({\n        tableProps: {\n          api: queryTenantPackUserList,\n          immediate: false,\n          columns: tenantPackUserColumns,\n          canResize: false,\n          useSearchForm: false,\n          beforeFetch: (params) => {\n            params.tenantId = tenantPackData.tenantId;\n            params.packId = tenantPackData.id;\n            params.status = 1;\n            return params;\n          },\n          actionColumn: {\n            width: 120,\n            fixed: 'right',\n          },\n        },\n      });\n      const [registerUserModal, { openModal: openUserModal, closeModal: closeUserModal }] = useModal();\n      const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;\n\n      /**\n       * 获取部门/职务名称\n       * @param value\n       */\n      function getName(value) {\n        return value.join(',');\n      }\n\n      /**\n       * 表格操作列\n       * @param record\n       */\n      function getTableAction(record) {\n        return [\n          {\n            label: '移除',\n            popConfirm: {\n              title: '是否确认移除',\n              confirm: handleDelete.bind(null, record),\n            }\n          },\n        ];\n      }\n\n      /**\n       * 删除\n       */\n      async function handleDelete(record) {\n        let params = {\n          packId: record.packId,\n          packName: record.packName,\n          tenantId: tenantPackData.tenantId,\n          userId: record.id,\n          realname: record.realname,\n        };\n        await deleteTenantPackUser(params);\n        await reload();\n      }\n\n      /**\n       * 添加用户弹窗\n       */\n      function addUser() {\n        openUserModal(true, {\n          list: [],\n        });\n      }\n\n      /**\n       * 邀请人回调事件\n       * @param arr\n       */\n      async function onSelected(arr) {\n        if (arr && arr.length > 0) {\n          let names: any[] = [];\n          let ids: any[] = [];\n          for (let u of arr) {\n            names.push(u.realname);\n            ids.push(u.id);\n          }\n          console.log(tenantPackData);\n          let params = {\n            packId: tenantPackData.id,\n            packName: tenantPackData.packName,\n            tenantId: tenantPackData.tenantId,\n            userId: ids.join(','),\n            realname: names.join(','),\n          };\n          await addTenantPackUser(params);\n          await reload();\n        }\n        closeUserModal();\n      }\n\n      return {\n        title,\n        registerModal,\n        registerTable,\n        rowSelection,\n        getName,\n        getTableAction,\n        registerUserModal,\n        addUser,\n        onSelected,\n        getTenantId,\n      };\n    },\n  });\n</script>\n\n<style lang=\"less\" scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/tenant.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { Modal } from 'ant-design-vue';\nimport { getTenantId } from \"/@/utils/auth\";\n\nenum Api {\n  list = '/sys/tenant/list',\n  save = '/sys/tenant/add',\n  edit = '/sys/tenant/edit',\n  get = '/sys/tenant/queryById',\n  delete = '/sys/tenant/delete',\n  deleteBatch = '/sys/tenant/deleteBatch',\n  getCurrentUserTenants = '/sys/tenant/getCurrentUserTenant',\n  invitationUserJoin = '/sys/tenant/invitationUserJoin',\n  getTenantUserList = '/sys/tenant/getTenantUserList',\n  leaveTenant = '/sys/tenant/leaveTenant',\n  packList = '/sys/tenant/packList',\n  addPackPermission = '/sys/tenant/addPackPermission',\n  editPackPermission = '/sys/tenant/editPackPermission',\n  deleteTenantPack = '/sys/tenant/deleteTenantPack',\n  recycleBinPageList = '/sys/tenant/recycleBinPageList',\n  deleteLogicDeleted = '/sys/tenant/deleteLogicDeleted',\n  revertTenantLogic = '/sys/tenant/revertTenantLogic',\n  syncDefaultPack = '/sys/tenant/syncDefaultPack',\n  //用户产品包关系api\n  queryTenantPackUserList = '/sys/tenant/queryTenantPackUserList',\n  deleteTenantPackUser = '/sys/tenant/deleteTenantPackUser',\n  addTenantPackUser = '/sys/tenant/addTenantPackUser',\n  //获取用户租户列表\n  getTenantPageListByUserId = '/sys/tenant/getTenantPageListByUserId',\n  \n  //新增、编辑用户租户\n  saveUser = '/sys/user/addTenantUser',\n  editUser = '/sys/user/editTenantUser',\n  //根据租户id和用户获取用户的产品包列表和当前用户下的产品包id\n  listPackByTenantUserId = '/sys/tenant/listPackByTenantUserId',\n  // 获取菜单权限\n  queryPremTreeList = '/sys/role/queryTreeList',\n}\n\n/**\n * 查询租户列表\n * @param params\n */\nexport const getTenantList = (params) => {\n  return defHttp.get({ url: Api.list, params });\n};\n\n/**\n * 保存或者更新租户\n * @param params\n */\nexport const saveOrUpdateTenant = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({ url: url, params });\n};\n\n/**\n * 查询租户详情\n * @param params\n */\nexport const getTenantById = (params) => {\n  return defHttp.get({ url: Api.get, params });\n};\n\n/**\n * 删除租户\n * @param params\n */\nexport const deleteTenant = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.delete, data: params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n\n/**\n * 批量删除租户\n * @param params\n */\nexport const batchDeleteTenant = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n\n/**\n * 获取登录用户部门信息\n */\nexport const getUserTenants = (params?) => defHttp.get({ url: Api.getCurrentUserTenants, params });\n\n/**\n * 邀请用户加入租户\n * @param params\n */\nexport const invitationUserJoin = (params) => defHttp.put({ url: Api.invitationUserJoin, params }, { joinParamsToUrl: true });\n\n/**\n * 通过租户id获取数据\n * @param params\n */\nexport const getTenantUserList = (params) => {\n  return defHttp.get({ url: Api.getTenantUserList, params });\n};\n\n/**\n * 用户离开租户\n * @param params\n */\nexport const leaveTenant = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '请离',\n    content: '是否将此用户请离当前租户',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.put({ url: Api.leaveTenant, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n\n/**\n * 获取产品包列表\n * @param params\n */\nexport const packList = (params) => {\n  return defHttp.get({ url: Api.packList, params });\n};\n\n/**\n * 添加菜单\n * @param params\n */\nexport const addPackPermission = (params) => {\n  return defHttp.post({ url: Api.addPackPermission, params });\n};\n\n/**\n * 添加菜单\n * @param params\n */\nexport const editPackPermission = (params) => {\n  return defHttp.put({ url: Api.editPackPermission, params });\n};\n\n/**\n * 删除菜单\n * @param params\n */\nexport const deleteTenantPack = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.deleteTenantPack, data: params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n\n/**\n * 初始化套餐包\n * @param params\n * @param handleSuccess\n */\nexport const syncDefaultTenantPack = (params, handleSuccess) => {\n  return defHttp.post({ url: Api.syncDefaultPack, data: params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n\n/**\n * 获取租户回收站的列表\n * @param params\n */\nexport const recycleBinPageList = (params) => {\n  return defHttp.get({ url: Api.recycleBinPageList, params });\n};\n\n/**\n * 租户彻底删除\n * @param params\n */\nexport const deleteLogicDeleted = (params,handleSuccess) => {\n  return defHttp.delete({ url: Api.deleteLogicDeleted, params },{ joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  }).catch(()=>{\n    handleSuccess();\n  });\n};\n\n/**\n * 租户还原\n * @param params\n */\nexport const revertTenantLogic = (params,handleSuccess) => {\n  return defHttp.put({ url: Api.revertTenantLogic, params },{ joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  })\n};\n\n/**\n * 获取租户产品包下面的用户\n * @param params\n */\nexport const queryTenantPackUserList = (params) => {\n  return defHttp.get({ url: Api.queryTenantPackUserList, params });\n};\n\n/**\n * 移除用户和产品包的关系数据\n * @param params\n */\nexport const deleteTenantPackUser = (params)=>{\n  return defHttp.put({ url: Api.deleteTenantPackUser, params });\n}\n\n/**\n * 添加用户和产品包的关系数据\n * @param params\n */\nexport const addTenantPackUser = (params)=>{\n  return defHttp.post({ url: Api.addTenantPackUser, params });\n}\n\n/**\n * 查询用户租户列表\n * @param params\n */\nexport const getTenantPageListByUserId = (params) => {\n  return defHttp.get({ url: Api.getTenantPageListByUserId, params });\n};\n\n\n/**\n * 获取当前登录租户名称\n */\nexport async function getLoginTenantName() {\n  let tenantId = getTenantId();\n  if(tenantId){\n    let result = await getTenantById({ id:tenantId });\n    if(result){\n      return result.name;\n    }\n  }\n  return \"空\";\n}\n\n/**\n * 保存或者更新用户\n * @param params\n */\nexport const saveOrUpdateTenantUser = (params, isUpdate) => {\n  let url = isUpdate ? Api.editUser : Api.saveUser;\n  return defHttp.post({ url: url, params },{ joinParamsToUrl: true });\n};\n/**\n * 根据租户id和用户获取用户的产品包列表和当前用户下的产品包id\n * \n * @param params\n */\nexport const listPackByTenantUserId = (params) => {\n  return defHttp.get({ url: Api.listPackByTenantUserId, params });\n}\n\n/**\n * 获取菜单树\n */\nexport const queryPremTreeList = () =>{\n  return defHttp.get({ url: Api.queryPremTreeList });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/tenant/tenant.data.ts",
    "content": "import { BasicColumn, FormSchema } from '/@/components/Table';\nimport { getAutoScrollContainer } from '/@/utils/common/compUtils';\nimport { render } from \"/@/utils/common/renderUtils\";\nimport { rules } from \"/@/utils/helper/validator\";\n\nexport const columns: BasicColumn[] = [\n  {\n    title: '租户名称',\n    dataIndex: 'name',\n    width: 200,\n    align: 'left',\n  },\n  {\n    title: '租户编号(ID)',\n    dataIndex: 'id',\n    width: 180,\n  },{\n    title: '组织LOGO',\n    dataIndex: 'companyLogo',\n    width: 100,\n    customRender: ({ text }) => {\n      if(!text){\n        return text;\n      }\n      return render.renderImage({text});\n    },\n  },\n  {\n    dataIndex: 'trade_dictText',\n    title: '所属行业',\n    width: 150\n  },\n  {\n    dataIndex: 'companySize_dictText',\n    title: '公司规模',\n    width: 100\n  },\n  {\n    dataIndex: 'houseNumber',\n    title: '门牌号',\n    width: 100,\n  },\n  // {\n  //   dataIndex: 'position_dictText',\n  //   title: '职级',\n  //   width: 150\n  // },\n  // {\n  //   dataIndex: 'department_dictText',\n  //   title: '部门',\n  //   width: 150\n  // },\n  {\n    dataIndex: 'createBy_dictText',\n    title: '创建者(拥有)',\n    width: 150\n  },\n/*  {\n    title: '开始时间',\n    dataIndex: 'beginDate',\n    sorter: true,\n    width: 180,\n  },\n  {\n    title: '结束时间',\n    dataIndex: 'endDate',\n    sorter: true,\n    width: 180,\n  },*/\n  {\n    title: '状态',\n    dataIndex: 'status_dictText',\n    width: 100,\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    field: 'name',\n    label: '租户名称',\n    component: 'Input',\n    colProps: { span: 8 },\n  },\n  {\n    field: 'status',\n    label: '状态',\n    component: 'Select',\n    componentProps: {\n      options: [\n        { label: '正常', value: 1 },\n        { label: '冻结', value: 0 },\n      ],\n    },\n    colProps: { span: 8 },\n  },\n  // {\n  //   field: 'fieldTime',\n  //   component: 'RangePicker',\n  //   label: '时间字段',\n  //   componentProps: {\n  //     valueType: 'Date',\n  //   },\n  //   colProps: {\n  //     span: 8,\n  //   },\n  // },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    field: 'name',\n    label: '租户名称',\n    component: 'Input',\n    required: true,\n  },\n  {\n    field: 'id',\n    label: '租户编号(ID)',\n    component: 'InputNumber',\n    required: true,\n    ifShow: ({ values }) => {\n      return values.id!=null;\n    },\n  },\n  {\n    field: 'companyLogo',\n    label: '组织LOGO',\n    component: 'JImageUpload',\n    componentProps:{\n      text:'logo'\n    }\n  },\n  {\n    field: 'trade',\n    label: '所属行业',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode:'trade',\n    }\n  }, {\n    field: 'companySize',\n    label: '公司规模',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode:'company_size',\n    }\n  }, {\n    field: 'companyAddress',\n    label: '公司地址',\n    component: 'JAreaSelect',\n    componentProps: {\n      placeholder: '请输入公司地址',\n      rows: 4,\n    }\n  },\n  {\n    field: 'workPlace',\n    label: '工作地点',\n    component: 'InputTextArea',\n    componentProps: {\n      placeholder: '请输入工作地点',\n      rows: 4,\n    }\n  },\n/*  {\n    field: 'beginDate',\n    label: '开始时间',\n    component: 'DatePicker',\n    componentProps: {\n      showTime: true,\n      valueFormat: 'YYYY-MM-DD HH:mm:ss',\n      getPopupContainer: getAutoScrollContainer,\n    },\n  },\n  {\n    field: 'endDate',\n    label: '结束时间',\n    component: 'DatePicker',\n    componentProps: {\n      showTime: true,\n      valueFormat: 'YYYY-MM-DD HH:mm:ss',\n      getPopupContainer: getAutoScrollContainer,\n    },\n  },*/\n  {\n    field: 'houseNumber',\n    label: '门牌号',\n    component: 'Input',\n    dynamicDisabled: true,\n    ifShow: ({ values }) => {\n      return values.id!=null;\n    },\n  },\n  {\n    field: 'position',\n    label: '职级',\n    component: 'JDictSelectTag',\n    componentProps:{\n      dictCode: 'company_rank'\n    }\n  },\n  {\n    field: 'department',\n    label: '部门',\n    component: 'JDictSelectTag',\n    componentProps:{\n      dictCode:'company_department'\n    }\n  },\n  {\n    field: 'status',\n    label: '状态',\n    component: 'RadioButtonGroup',\n    defaultValue: 1,\n    componentProps: {\n      options: [\n        { label: '正常', value: 1 },\n        { label: '冻结', value: 0 },\n      ],\n    },\n  },\n];\n\n//定义用户表格列\nexport const userColumns: BasicColumn[] =[\n  {\n    title: '用户账号',\n    dataIndex: 'username',\n    width: 100,\n    align: 'left',\n  },\n  {\n    title: '用户姓名',\n    dataIndex: 'realname',\n    width: 100,\n  },\n  {\n    title: '性别',\n    dataIndex: 'sex_dictText',\n    width: 100,\n  },\n  {\n    title: '手机号码',\n    dataIndex: 'phone',\n    width: 100,\n  },\n];\n\n//邀请用户搜索表单\nexport const userSearchFormSchema: FormSchema[] = [\n  {\n    field: 'username',\n    label: '账号',\n    component: 'Input',\n  },\n  {\n    field: 'realname',\n    label: '姓名',\n    component: 'Input',\n  },\n];\n\n//套餐包列表\nexport const packColumns: BasicColumn[] = [\n  {\n    title: '套餐包名称',\n    dataIndex: 'packName',\n    width: 100,\n    customRender: ( { record, text }) => {\n      if(record.packCode && record.packCode.indexOf('default') != -1) {\n        return text + '(默认产品包)';\n      } else {\n        return text;\n      }\n    }\n  },\n  {\n    title: '是否自动分配用户',\n    dataIndex: 'izSysn',\n    width: 100,\n    customRender: ( { text }) => {\n      if(text === '1') {\n        return '是';\n      } else {\n        return '否';\n      }\n    }\n  },\n  {\n    title: '状态',\n    dataIndex: 'status',\n    width: 100,\n    customRender: ({ text }) => {\n      if (text === '1') {\n        return '开启';\n      } else {\n        return '关闭';\n      }\n    },\n  },\n  {\n    title: '备注说明',\n    dataIndex: 'remarks',\n    width: 150,\n  },\n];\n\n//套餐包列表\nexport const tenantPackColumns: BasicColumn[] = [\n  {\n    title: '套餐包名称',\n    dataIndex: 'packName',\n    width: 100,\n    customRender: ( { record, text }) => {\n      if(record.packCode && record.packCode.indexOf('default') != -1) {\n        return text + '(默认产品包)';\n      } else {\n        return text;\n      }\n    }\n  },\n  {\n    title: '是否自动分配用户',\n    dataIndex: 'izSysn',\n    width: 100,\n    customRender: ( { text }) => {\n      if(text === '1') {\n        return '是';\n      } else {\n        return '否';\n      }\n    }\n  },\n  {\n    title: '备注说明',\n    dataIndex: 'remarks',\n    width: 150,\n  },\n];\n\n//套餐包列表\nexport const defalutPackColumns: BasicColumn[] = [\n  {\n    title: '默认套餐名称',\n    dataIndex: 'packName',\n    width: 100,\n  },\n  {\n    title: '状态',\n    dataIndex: 'status',\n    width: 100,\n    customRender: ({ text }) => {\n      if (text === '1') {\n        return '开启';\n      } else {\n        return '关闭';\n      }\n    },\n  },\n  {\n    title: '备注说明',\n    dataIndex: 'remarks',\n    width: 150,\n  },\n];\n\n//套餐包搜索表单\nexport const packFormSchema: FormSchema[] = [\n  {\n    field: 'packName',\n    label: '套餐包名',\n    component: 'JInput',\n    colProps: { xxl: 8 },\n  },\n];\n\n//套餐包搜索表单\nexport const defaultPackFormSchema: FormSchema[] = [\n  {\n    field: 'packName',\n    label: '默认套餐名',\n    component: 'JInput',\n    colProps: { xxl: 8 },\n  },\n];\n\n//套餐包表单\nexport const packMenuFormSchema: FormSchema[] = [\n  {\n    field: 'packName',\n    label: '套餐包名称',\n    component: 'Input',\n  },\n/*  {\n    field: 'permissionIds',\n    label: '授权菜单',\n    component: 'JTreeSelect',\n    componentProps: {\n      dict: 'sys_permission,name,id',\n      pidField: 'parent_id',\n      hasChildField:'is_leaf',\n      multiple: true,\n      treeCheckAble:true,\n      treeCheckStrictly: true,\n      converIsLeafVal: 0,\n      getPopupContainer: () => document.body,\n    },\n  },*/\n  {\n    field: 'remarks',\n    label: '备注说明',\n    component: 'InputTextArea',\n  },\n  {\n    field: 'izSysn',\n    label: '自动分配用户',\n    component: 'Switch',\n    componentProps: {\n      checkedValue: \"1\",\n      checkedChildren: '是',\n      unCheckedValue: \"0\",\n      unCheckedChildren: '否',\n    },\n    defaultValue: \"1\",\n    helpMessage: \"默认会自动分配给用户，个性高级套餐，需要租户管理员手工分配人员(拥有更灵活性权限控制)\"\n  },  \n  {\n    field: 'status',\n    label: '开启状态',\n    component: 'Switch',\n    componentProps: {\n      checkedValue: '1',\n      checkedChildren: '开启',\n      unCheckedValue: '0',\n      unCheckedChildren: '关闭',\n    },\n    defaultValue: '1',\n  },\n  {\n    field: 'id',\n    label: '开启状态',\n    component: 'Input',\n    show: false\n  },\n  {\n    field: 'packCode',\n    label: '产品包编码',\n    component: 'Input',\n    show: false\n  },  \n  {\n    field: 'packType',\n    label: '产品包类型',\n    component: 'Input',\n    show: false\n  },\n];\n\n//回收站列表\nexport const recycleColumns : BasicColumn[] = [\n  {\n    title: '租户名称',\n    dataIndex: 'name',\n    width: 100,\n    align: 'left',\n  },\n  {\n    title: '租户编号(ID)',\n    dataIndex: 'id',\n    width: 100,\n  },\n  {\n    title: '组织LOGO',\n    dataIndex: 'companyLogo',\n    width: 100,\n    customRender: ({ text }) => {\n      if(!text){\n        return text;\n      }\n      return render.renderImage({text});\n    },\n  },\n  {\n    dataIndex: 'houseNumber',\n    title: '门牌号',\n    width: 100,\n  }\n]\n\n//租户回收站搜索表单\nexport const searchRecycleFormSchema : FormSchema[] = [\n  {\n    field: 'name',\n    label: '租户名称',\n    component: 'Input',\n  },\n  {\n    field: 'houseNumber',\n    label: '门牌号',\n    component: 'Input',\n  },\n]\n\n//套餐包用户列表\nexport const tenantPackUserColumns: BasicColumn[] = [\n  {\n    title: '用户',\n    dataIndex: 'realname',\n    width: 200,\n  },\n  {\n    title: '部门',\n    dataIndex: 'departNames',\n    width: 200,\n    ellipsis: true,\n    slots: { customRender: 'departNames' }\n  },\n  {\n    title: '职位',\n    dataIndex: 'positionNames',\n    ellipsis: true,\n    width: 200,\n    slots: { customRender: 'positionNames' }\n  }\n]\n\n/**\n * 用户租户新增编辑表单\n */\nexport const tenantUserSchema: FormSchema[] = [\n  { field: 'id', label: 'id', component: 'Input', show: false },\n  { field: 'username', label: 'username', component: 'Input', show: false },\n  {\n    field: 'realname',\n    label: '姓名',\n    component: 'Input',\n    dynamicDisabled: ({ values }) => {\n      return !!values.id;\n    },\n  },\n  {\n    field: 'phone',\n    label: '手机',\n    component: 'Input',\n    dynamicRules: ({ model, schema }) => {\n      if (model.id) {\n        return [];\n      }\n      return [{ ...rules.phone(true)[0] }, { ...rules.duplicateCheckRule('sys_user', 'phone', model, schema, false)[0] }];\n    },\n    dynamicDisabled: ({ values }) => {\n      return !!values.id;\n    },\n  },\n  {\n    field: 'email',\n    label: '邮箱',\n    component: 'Input',\n    dynamicRules: ({ model, schema }) => {\n      if (model.id) {\n        return [];\n      }\n      return [{ ...rules.email(true)[0] }, { ...rules.duplicateCheckRule('sys_user', 'email', model, schema, false)[0] }];\n    },\n    dynamicDisabled: ({ values }) => {\n      return !!values.id;\n    },\n  },\n  { field: 'selecteddeparts', label: '部门', component: 'JSelectDept', componentProps: { checkStrictly: true } },\n /* {\n    field: 'post',\n    label: '职位',\n    component: 'JSelectPosition',\n  },\n  {\n    field: 'workNo',\n    label: '工号',\n    component: 'Input',\n    dynamicRules: ({ model, schema }) => {\n      return [{ required: false, message: '请输入工号' }, { ...rules.duplicateCheckRule('sys_user', 'work_no', model, schema, false)[0] }];\n    },\n  },*/\n  { field: 'relTenantIds', label: '租户', component: 'Input',show:false },\n  { field: 'selectedroles', label: '角色', component: 'Input',show:false },\n];\n\n// 分配用户套餐\nexport const packUserAllotSchemas: FormSchema[] = [\n  { \n    field: 'userId', \n    label: '用户id', \n    component: 'Input',\n    show: false\n  },\n  {\n    field: 'realname',\n    label: '用户姓名',\n    component: 'Input',\n    componentProps:{\n      readonly : true\n    },\n  },\n  {\n    field: 'packId',\n    label: '套餐',\n    component: 'Select',\n    slot: 'packId'\n  }\n];"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/user/PasswordModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" title=\"修改密码\" @ok=\"handleSubmit\">\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n<script lang=\"ts\" name=\"PassWordModal\" setup>\n  import { ref, computed, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { formPasswordSchema } from './user.data';\n  import { changePassword } from './user.api';\n  // 声明Emits\n  const emit = defineEmits(['success', 'register']);\n  //表单配置\n  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({\n    schemas: formPasswordSchema,\n    showActionButtonGroup: false,\n  });\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    //重置表单\n    await resetFields();\n    setModalProps({ confirmLoading: false });\n    //表单赋值\n    await setFieldsValue({ ...data });\n  });\n  //表单提交事件\n  async function handleSubmit() {\n    try {\n      const values = await validate();\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      await changePassword(values);\n      //关闭弹窗\n      closeModal();\n      //刷新列表\n      emit('success');\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/user/UserDrawer.vue",
    "content": "<template>\n  <BasicDrawer\n    v-bind=\"$attrs\"\n    @register=\"registerDrawer\"\n    :title=\"getTitle\"\n    :width=\"adaptiveWidth\"\n    @ok=\"handleSubmit\"\n    :showFooter=\"showFooter\"\n    destroyOnClose\n  >\n    <BasicForm @register=\"registerForm\" />\n  </BasicDrawer>\n</template>\n<script lang=\"ts\" setup>\n  import { defineComponent, ref, computed, unref, useAttrs } from 'vue';\n  import { BasicForm, useForm } from '/@/components/Form/index';\n  import { formSchema } from './user.data';\n  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';\n  import { saveOrUpdateUser, getUserRoles, getUserDepartList, getAllRolesListNoByTenant, getAllRolesList } from './user.api';\n  import { useDrawerAdaptiveWidth } from '/@/hooks/jeecg/useAdaptiveWidth';\n  import { getTenantId } from \"/@/utils/auth\";\n\n  // 声明Emits\n  const emit = defineEmits(['success', 'register']);\n  const attrs = useAttrs();\n  const isUpdate = ref(true);\n  const rowId = ref('');\n  const departOptions = ref([]);\n  let isFormDepartUser = false;\n  //表单配置\n  const [registerForm, { setProps, resetFields, setFieldsValue, validate, updateSchema }] = useForm({\n    labelWidth: 90,\n    schemas: formSchema,\n    showActionButtonGroup: false,\n  });\n  // TODO [VUEN-527] https://www.teambition.com/task/6239beb894b358003fe93626\n  const showFooter = ref(true);\n  //表单赋值\n  const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {\n    await resetFields();\n    showFooter.value = data?.showFooter ?? true;\n    setDrawerProps({ confirmLoading: false, showFooter: showFooter.value });\n    isUpdate.value = !!data?.isUpdate;\n    if (unref(isUpdate)) {\n      rowId.value = data.record.id;\n      //租户信息定义成数组\n   /*   if (data.record.relTenantIds && !Array.isArray(data.record.relTenantIds)) {\n        data.record.relTenantIds = data.record.relTenantIds.split(',');\n      } else {\n        //【issues/I56C5I】用户管理中连续点两次编辑租户配置就丢失了\n        //data.record.relTenantIds = [];\n      }*/\n\n      //查角色/赋值/try catch 处理，不然编辑有问题\n      try {\n        const userRoles = await getUserRoles({ userid: data.record.id });\n        if (userRoles && userRoles.length > 0) {\n          data.record.selectedroles = userRoles;\n        }\n      } catch (error) {}\n\n      //查所属部门/赋值\n      const userDepart = await getUserDepartList({ userId: data.record.id });\n      if (userDepart && userDepart.length > 0) {\n        data.record.selecteddeparts = userDepart;\n        let selectDepartKeys = Array.from(userDepart, ({ key }) => key);\n        data.record.selecteddeparts = selectDepartKeys.join(',');\n        departOptions.value = userDepart.map((item) => {\n          return { label: item.title, value: item.key };\n        });\n      }\n      //负责部门/赋值\n      data.record.departIds && !Array.isArray(data.record.departIds) && (data.record.departIds = data.record.departIds.split(','));\n      // 代码逻辑说明: [issues/772]避免空值显示异常------------\n      data.record.departIds =  (!data.record.departIds || data.record.departIds == '') ? [] : data.record.departIds;\n      data.record.sort = data.record.sort ? data.record.sort: 1000; \n    }\n    //处理角色用户列表情况(和角色列表有关系)\n    data.selectedroles && (await setFieldsValue({ selectedroles: data.selectedroles }));\n    // -update-begin--author:liaozhiyang---date:20240702---for：【TV360X-1737】部门用户编辑接口，增加参数updateFromPage:\"deptUsers\"\n    isFormDepartUser = data?.departDisabled === true ? true : false;\n    // -update-end--author:liaozhiyang---date:20240702---for：【TV360X-1737】部门用户编辑接口，增加参数updateFromPage:\"deptUsers\"\n    //编辑时隐藏密码/角色列表隐藏角色信息/我的部门时隐藏所属部门\n    updateSchema([\n      {\n        field: 'password',\n        // 【QQYUN-8324】\n        ifShow: !unref(isUpdate),\n      },\n      {\n        field: 'confirmPassword',\n        ifShow: !unref(isUpdate),\n      },\n      {\n        field: 'selectedroles',\n        show: !data.isRole,\n      },\n      {\n        field: 'departIds',\n        componentProps: { options: departOptions },\n      },\n      {\n        field: 'selecteddeparts',\n        show: !data?.departDisabled,\n      },\n      {\n        field: 'selectedroles',\n        show: !data?.departDisabled,\n        //判断是否为多租户模式\n        componentProps:{\n          api: data.tenantSaas?getAllRolesList:getAllRolesListNoByTenant\n        }\n      },\n      // 代码逻辑说明: 【issues/4935】租户用户编辑界面中租户下拉框未过滤，显示当前系统所有的租户------------\n      {\n        field: 'relTenantIds',\n        componentProps:{\n          disabled: !!data.tenantSaas,\n        },\n      },\n    ]);\n    // 代码逻辑说明: 【issues/4935】租户用户编辑界面中租户下拉框未过滤，显示当前系统所有的租户------------\n    if(!unref(isUpdate) && data.tenantSaas){\n      await setFieldsValue({ relTenantIds: getTenantId().toString() })\n    }\n    // 无论新增还是编辑，都可以设置表单值\n    if (typeof data.record === 'object') {\n      setFieldsValue({\n        ...data.record,\n      });\n    }\n    // 隐藏底部时禁用整个表单\n    // 代码逻辑说明: VUEN-1117【issue】0523周开源问题\n    setProps({ disabled: !showFooter.value });\n    if(unref(isUpdate)){\n      updateSchema([\n        //修改主岗位和兼职岗位的参数\n        {\n          field: 'mainDepPostId',\n          componentProps: { params: { departIds: data.record.selecteddeparts, parentId: data.record.selecteddeparts } },\n        },\n        {\n          field: 'otherDepPostId',\n          componentProps: { params: { departIds: data.record.selecteddeparts, parentId: data.record.selecteddeparts } },\n        }\n      ]);\n    }\n    //部门管理，新增用户，在岗位下添加人员的时候默认当前岗位为主岗位\n    updateSchema([\n      {\n        field: 'mainDepPostId',\n        defaultValue: data?.mainDepPostId || '',\n      }\n    ])\n  });\n  //获取标题\n  const getTitle = computed(() => {\n    // 代码逻辑说明: 【QQYUN-8389】系统用户详情抽屉title更改\n    if (!unref(isUpdate)) {\n      return '新增用户';\n    } else {\n      return unref(showFooter) ? '编辑用户' : '用户详情';\n    }\n  });\n  const { adaptiveWidth } = useDrawerAdaptiveWidth();\n\n  //提交事件\n  async function handleSubmit() {\n    try {\n      let values = await validate();\n      setDrawerProps({ confirmLoading: true });\n      values.userIdentity === 1 && (values.departIds = '');\n      let isUpdateVal = unref(isUpdate);\n      // -update-begin--author:liaozhiyang---date:20240702---for：【TV360X-1737】部门用户编辑接口，增加参数updateFromPage:\"deptUsers\"\n      let params = values;\n      if (isFormDepartUser) {\n        params = { ...params, updateFromPage: 'deptUsers' };\n      }\n      // -update-end--author:liaozhiyang---date:20240702---for：【TV360X-1737】部门用户编辑接口，增加参数updateFromPage:\"deptUsers\"\n      //提交表单\n      await saveOrUpdateUser(params, isUpdateVal);\n      //关闭弹窗\n      closeDrawer();\n      //刷新列表\n      emit('success',{isUpdateVal ,values});\n    } finally {\n      setDrawerProps({ confirmLoading: false });\n    }\n  }\n</script>\n<style scoped lang=\"less\">\n  :deep(.ant-input-number){\n    width: 100%;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/user/UserQuitModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" title=\"离职人员信息\" :showOkBtn=\"false\" width=\"1000px\" destroyOnClose>\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleRevert\">\n                <Icon icon=\"ant-design:redo-outlined\"></Icon>\n                批量取消\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button\n            >批量操作\n            <Icon icon=\"ant-design:down-outlined\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" />\n      </template>\n    </BasicTable>\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup name=\"user-quit-modal\">\n  import { ref, toRaw, unref } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { recycleColumns } from './user.data';\n  import { getQuitList, putCancelQuit, deleteRecycleBin } from './user.api';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { Modal } from 'ant-design-vue';\n  import { defHttp } from '/@/utils/http/axios';\n\n  const { createConfirm } = useMessage();\n  // 声明Emits\n  const emit = defineEmits(['success', 'register']);\n  const checkedKeys = ref<Array<string | number>>([]);\n  const [registerModal] = useModalInner(() => {\n    checkedKeys.value = [];\n  });\n  //注册table数据\n  const { prefixCls, tableContext } = useListPage({\n    tableProps: {\n      api: getQuitList,\n      columns: recycleColumns,\n      rowKey: 'id',\n      canResize: false,\n      useSearchForm: false,\n      actionColumn: {\n        width: 120,\n      },\n    },\n  });\n  //注册table数据\n  const [registerTable, { reload }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext;\n\n  /**\n   * 取消离职事件\n   * @param record\n   */\n  async function handleCancelQuit(record) {\n    await putCancelQuit({ userIds: record.id, usernames: record.username }, reload);\n    emit('success');\n  }\n  /**\n   * 批量取消离职事件\n   */\n  function batchHandleRevert() {\n    Modal.confirm({\n      title: '取消离职',\n      content: '取消离职交接人也会清空',\n      okText: '确认',\n      cancelText: '取消',\n      onOk: () => {\n        let rowValue = selectedRows.value;\n        let rowData: any = [];\n        for (const value of rowValue) {\n          rowData.push(value.username);\n        }\n        handleCancelQuit({ id: toRaw(unref(selectedRowKeys)).join(','), username: rowData.join(',') });\n      },\n    });\n  }\n\n  //获取操作栏事件\n  function getTableAction(record) {\n    return [\n      {\n        label: '取消离职',\n        icon: 'ant-design:redo-outlined',\n        popConfirm: {\n          title: '是否取消离职,取消离职交接人也会清空',\n          confirm: handleCancelQuit.bind(null, record),\n        },\n      },\n    ];\n  }\n</script>\n\n<style scoped lang=\"less\">\n:deep(.ant-popover-inner-content){\n  width: 185px !important;\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/user/UserRecycleBinModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" title=\"用户回收站\" :showOkBtn=\"false\" width=\"1000px\" destroyOnClose @fullScreen=\"handleFullScreen\">\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\" :scroll=\"scroll\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-dropdown v-if=\"checkedKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                批量删除\n              </a-menu-item>\n              <a-menu-item key=\"1\" @click=\"batchHandleRevert\">\n                <Icon icon=\"ant-design:redo-outlined\"></Icon>\n                批量还原\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button\n            >批量操作\n            <Icon icon=\"ant-design:down-outlined\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <!--操作栏-->\n      <template #bodyCell=\"{ column, record }\">\n        <template v-if=\"column.key === 'action'\">\n          <TableAction :actions=\"getTableAction(record)\" />\n        </template>\n      </template>\n    </BasicTable>\n  </BasicModal>\n</template>\n<script lang=\"ts\" setup>\n  import { ref, toRaw, unref, watch } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { BasicTable, useTable, TableAction } from '/@/components/Table';\n  import { recycleColumns } from './user.data';\n  import { getRecycleBinList, putRecycleBin, deleteRecycleBin } from './user.api';\n  import { useMessage } from '/@/hooks/web/useMessage';\n\n  const { createConfirm } = useMessage();\n  // 声明Emits\n  const emit = defineEmits(['success', 'register']);\n  const checkedKeys = ref<Array<string | number>>([]);\n  const [registerModal] = useModalInner(() => {\n    checkedKeys.value = [];\n  });\n  const scroll = ref({ y: 0 });\n  //注册table数据\n  const [registerTable, { reload }] = useTable({\n    api: getRecycleBinList,\n    columns: recycleColumns,\n    rowKey: 'id',\n    striped: true,\n    useSearchForm: false,\n    showTableSetting: false,\n    clickToRowSelect: false,\n    bordered: true,\n    showIndexColumn: false,\n    pagination: true,\n    tableSetting: { fullScreen: true },\n    canResize: false,\n    actionColumn: {\n      width: 150,\n      title: '操作',\n      dataIndex: 'action',\n      // slots: { customRender: 'action' },\n      fixed: undefined,\n    },\n  });\n  // 代码逻辑说明: 【TV360X-1657】系统用户回收站弹窗分页展示在可视区内\n  const handleFullScreen = (maximize) => {\n    setTableHeight(maximize);\n  };\n  const setTableHeight = (maximize) => {\n    const clientHeight = document.documentElement.clientHeight;\n    scroll.value = {\n      y: clientHeight - (maximize ? 300 : 500),\n    };\n  };\n  setTableHeight(false);\n  watch(\n    checkedKeys,\n    (newValue, oldValue) => {\n      if (checkedKeys.value.length && oldValue.length == 0) {\n        scroll.value = {\n          y: scroll.value.y - 50,\n        };\n      } else if (checkedKeys.value.length == 0 && oldValue.length) {\n        scroll.value = {\n          y: scroll.value.y + 50,\n        };\n      }\n    },\n    { deep: true }\n  );\n  /**\n   * 选择列配置\n   */\n  const rowSelection = {\n    type: 'checkbox',\n    columnWidth: 50,\n    selectedRowKeys: checkedKeys,\n    onChange: onSelectChange,\n  };\n  /**\n   * 选择事件\n   */\n  function onSelectChange(selectedRowKeys: (string | number)[]) {\n    checkedKeys.value = selectedRowKeys;\n  }\n  /**\n   * 还原事件\n   */\n  async function handleRevert(record) {\n    await putRecycleBin({ userIds: record.id }, reload);\n    emit('success');\n  }\n  /**\n   * 批量还原事件\n   */\n  function batchHandleRevert() {\n    handleRevert({ id: toRaw(unref(checkedKeys)).join(',') });\n  }\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    await deleteRecycleBin({ userIds: record.id }, reload);\n  }\n  /**\n   * 批量删除事件\n   */\n  function batchHandleDelete() {\n    createConfirm({\n      iconType: 'warning',\n      title: '删除',\n      content: '确定要永久删除吗？删除后将不可恢复！',\n      onOk: () => handleDelete({ id: toRaw(unref(checkedKeys)).join(',') }),\n      onCancel() {},\n    });\n  }\n  //获取操作栏事件\n  function getTableAction(record) {\n    return [\n      {\n        label: '取回',\n        icon: 'ant-design:redo-outlined',\n        popConfirm: {\n          title: '是否确认还原',\n          confirm: handleRevert.bind(null, record),\n        },\n      },\n      {\n        label: '彻底删除',\n        icon: 'ant-design:scissor-outlined',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n    ];\n  }\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/user/components/ImportExcelProgress.vue",
    "content": "<template>\n  <div>\n    <a-upload\n      :headers=\"headers\"\n      :action=\"uploadAction\"\n      :showUploadList=\"false\"\n      :multiple=\"false\"\n      :maxCount=\"1\"\n      :data=\"uploadData\"\n      accept=\".xls,.xlsx\"\n      @change=\"onFileChange\"\n      :beforeUpload=\"beforeUpload\"\n      ref=\"uploadRef\"\n      style=\"width: 100%\"\n    >\n      <a-button type=\"primary\" preIcon=\"ant-design:import-outlined\" v-if=\"percent === 0 || percent === 100\">{{ btnText }}</a-button>\n      <a-button @click.prevent.stop=\"progressOpen = true\" type=\"primary\" v-else>\n        <LoadingOutlined />\n        导入中\n      </a-button>\n    </a-upload>\n    <a-modal v-model:open=\"progressOpen\" title=\"文件上传\" :body-style=\"{ padding: '20px' }\" :destroyOnClose=\"true\" :footer=\"null\">\n      <div>\n        <div style=\"display: flex\">\n          <div class=\"label\">当前上传文件：</div>\n          <div class=\"file-name\">{{ fileName }}</div>\n        </div>\n        <div style=\"margin-top: 10px; display: flex\">\n          <div class=\"label\">当前文件上传进度:</div>\n          <a-progress :percent=\"percent\" style=\"width: 300px; margin-left: 10px\" :format=\"(percent) => `${percent}%`\"></a-progress>\n        </div>\n      </div>\n    </a-modal>\n  </div>\n</template>\n\n<script lang=\"ts\">\n  import { defineComponent, onUnmounted, ref, computed, watch } from 'vue';\n  import { getTenantId, getToken } from '@/utils/auth';\n  import { randomString } from '@/utils/common/compUtils';\n  import { useMessage } from '@/hooks/web/useMessage';\n  import { useGlobSetting } from '@/hooks/setting';\n  import { defHttp } from '@/utils/http/axios';\n  import { LoadingOutlined } from '@ant-design/icons-vue';\n\n  export default defineComponent({\n    name: 'ImportExcelProgress',\n    components: { LoadingOutlined },\n    props: {\n      //上传路径\n      uploadUrl: {\n        type: String,\n        required: true,\n      },\n      //按钮文字\n      btnText: {\n        type: String,\n        default: '导入',\n      },\n      //上传类型\n      type: {\n        type: String,\n        default: 'user',\n      },\n    },\n    emit: ['success', 'register'],\n    setup(props, { emit }) {\n      const fileName = ref<string>('');\n      //上传数据\n      const uploadData = ref({});\n      //上传请求头\n      const headers = ref({});\n      const { createMessage, createWarningModal } = useMessage();\n      //文件上传定时任务\n      const fileUploadInterval = ref<any>();\n      const glob = useGlobSetting();\n      const progressOpen = ref(false);\n      //上传进度\n      const percent = ref<number>(0);\n      const uploadRef = ref();\n      //随机数\n      const uuid = ref();\n      const baseApiUrl = glob.domainUrl;\n      const uploadAction = computed(() => {\n        return baseApiUrl + props.uploadUrl;\n      });\n      //文件发生改变回调\n      function onFileChange(info) {\n        if (info.file.name) {\n          fileName.value = info.file.name;\n        }\n        if (info.file.status === 'done') {\n          if (info.file.response.success) {\n            if (info.file.response && info.file.response.code === 201) {\n              let {\n                message,\n                result: { msg, fileUrl, fileName },\n              } = info.file.response;\n              let href = glob.uploadUrl + fileUrl;\n              createWarningModal({\n                title: message,\n                centered: false,\n                content: `<div>\n                        <span>${msg}</span><br/> \n                        <span>具体详情请<a href = ${href} download = ${fileName}> 点击下载 </a> </span> \n                      </div>`,\n              });\n              percent.value = 100;\n              emit('success');\n            } else {\n              createMessage.success('文件导入成功!');\n              percent.value = 100;\n              emit('success');\n            }\n          } else {\n            createMessage.error(info.file.response.message || `${info.file.name} 导入失败.`);\n          }\n          clear();\n        } else if (info.file.status === 'error' || (info.file.response && info.file.response.code === 500)) {\n          clear();\n          createMessage.error(info.file.response?.message || `导入失败，可能原因文件超出上传大小，请查看控制台或服务端日志`);\n        }\n      }\n\n      /**\n       * 清除定时器\n       */\n      function clear() {\n        //查看状态 讲以导入的改成导入失败\n        clearInterval(fileUploadInterval.value);\n      }\n\n      /**\n       * 上传之前的回调\n       */\n      function beforeUpload() {\n        percent.value = 1;\n        headers.value = {\n          'X-Access-Token': getToken(),\n          'X-Tenant-Id': getTenantId() ? getTenantId() : '0',\n        };\n        uuid.value = randomString(16);\n        uploadData.value['fileKey'] = uuid.value;\n        progressOpen.value = true;\n        fileUploadInterval.value = setInterval(() => {\n          defHttp\n            .get({ url: '/sys/user/getUploadFileProgress', params: { fileKey: uuid.value, type: props.type } }, { isTransformResponse: false })\n            .then((res) => {\n              if (res.success) {\n                if (res.result) {\n                  percent.value = Math.round(res.result);\n                  if (res.result == 100) {\n                    clear();\n                  }\n                }\n              }\n            })\n            .catch(() => {\n              clear();\n            });\n        }, 2000);\n      }\n\n      onUnmounted(() => {\n        clear();\n      });\n\n      return {\n        fileName,\n        uploadData,\n        headers,\n        onFileChange,\n        beforeUpload,\n        progressOpen,\n        percent,\n        uploadAction,\n        uploadRef,\n      };\n    },\n  });\n</script>\n\n<style scoped lang=\"less\">\n  .label {\n    font-size: 14px;\n    color: #666;\n  }\n  .file-name {\n    color: #151515;\n    font-size: 12px;\n    margin-top: 2px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/user/index.vue",
    "content": "<template>\n  <div>\n    <!--引用表格-->\n    <BasicTable @register=\"registerTable\" :rowSelection=\"rowSelection\">\n      <!--插槽:table标题-->\n      <template #tableTitle>\n        <a-button type=\"primary\" preIcon=\"ant-design:plus-outlined\" @click=\"handleCreate\"> 新增</a-button>\n        <a-button type=\"primary\" preIcon=\"ant-design:export-outlined\" @click=\"onExportXls\" > 导出</a-button>\n<!--        <j-upload-button type=\"primary\" preIcon=\"ant-design:import-outlined\" @click=\"onImportXls\" v-auth=\"'system:user:import'\">导入</j-upload-button>-->\n        <import-excel-progress :upload-url=\"getImportUrl\" @success=\"reload\"></import-excel-progress>\n        <a-button type=\"primary\" @click=\"openModal(true, {})\" preIcon=\"ant-design:hdd-outlined\"> 回收站</a-button>\n        <a-dropdown v-if=\"selectedRowKeys.length > 0\">\n          <template #overlay>\n            <a-menu>\n              <a-menu-item key=\"1\" @click=\"batchHandleDelete\">\n                <Icon icon=\"ant-design:delete-outlined\"></Icon>\n                删除\n              </a-menu-item>\n              <a-menu-item key=\"2\" @click=\"batchFrozen(2)\">\n                <Icon icon=\"ant-design:lock-outlined\"></Icon>\n                冻结\n              </a-menu-item>\n              <a-menu-item key=\"3\" @click=\"batchFrozen(1)\">\n                <Icon icon=\"ant-design:unlock-outlined\"></Icon>\n                解冻\n              </a-menu-item>\n              <a-menu-item v-if=\"hasPermission('system:user:resetPassword')\" key=\"4\" @click=\"batchResetPassword()\">\n                <Icon icon=\"ant-design:reload-outlined\"></Icon>\n                重置密码\n              </a-menu-item>\n            </a-menu>\n          </template>\n          <a-button\n          >批量操作\n            <Icon icon=\"mdi:chevron-down\"></Icon>\n          </a-button>\n        </a-dropdown>\n      </template>\n      <!--操作栏-->\n      <template #action=\"{ record }\">\n        <TableAction :actions=\"getTableAction(record)\" :dropDownActions=\"getDropDownAction(record)\" />\n      </template>\n    </BasicTable>\n    <!--用户抽屉-->\n    <UserDrawer @register=\"registerDrawer\" @success=\"handleSuccess\" />\n    <!--修改密码-->\n    <PasswordModal @register=\"registerPasswordModal\" @success=\"reload\" />\n    <!--回收站-->\n    <UserRecycleBinModal @register=\"registerModal\" @success=\"reload\" />\n    <!-- 离职人员列弹窗 -->\n    <UserQuitModal @register=\"registerQuitModal\" @success=\"reload\" />\n  </div>\n</template>\n\n<script lang=\"ts\" name=\"system-user\" setup>\n  //ts语法\n  import { ref, computed, unref } from 'vue';\n  import { BasicTable, TableAction, ActionItem } from '/@/components/Table';\n  import UserDrawer from './UserDrawer.vue';\n  import UserRecycleBinModal from './UserRecycleBinModal.vue';\n  import PasswordModal from './PasswordModal.vue';\n  import JThirdAppButton from '/@/components/jeecg/thirdApp/JThirdAppButton.vue';\n  import UserQuitModal from './UserQuitModal.vue';\n  import { useDrawer } from '/@/components/Drawer';\n  import { useListPage } from '/@/hooks/system/useListPage';\n  import { useModal } from '/@/components/Modal';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { columns, searchFormSchema } from './user.data';\n  import { listNoCareTenant, deleteUser, batchDeleteUser, getImportUrl, getExportUrl, frozenBatch, resetPassword } from './user.api';\n  import { usePermission } from '/@/hooks/web/usePermission';\n  import ImportExcelProgress from './components/ImportExcelProgress.vue';\n\n  const { createMessage, createConfirm } = useMessage();\n  const { isDisabledAuth, hasPermission } = usePermission();\n  \n  //注册drawer\n  const [registerDrawer, { openDrawer }] = useDrawer();\n  //回收站model\n  const [registerModal, { openModal }] = useModal();\n  //密码model\n  const [registerPasswordModal, { openModal: openPasswordModal }] = useModal();\n  //代理人model\n  const [registerAgentModal, { openModal: openAgentModal }] = useModal();\n  //离职代理人model\n  const [registerQuitAgentModal, { openModal: openQuitAgentModal }] = useModal();\n  //离职用户列表model\n  const [registerQuitModal, { openModal: openQuitModal }] = useModal();\n\n  // 列表页面公共参数、方法\n  const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({\n    designScope: 'user-list',\n    tableProps: {\n      title: '用户列表',\n      api: listNoCareTenant,\n      columns: columns,\n      canResize: true,\n      size: 'small',\n      formConfig: {\n        // labelWidth: 200,\n        schemas: searchFormSchema,\n      },\n      actionColumn: {\n        width: 120,\n      },\n      beforeFetch: (params) => {\n        return Object.assign({ column: 'createTime', order: 'desc' }, params);\n      },\n      defSort: {\n        column: \"\",\n        order: \"\"\n      },\n    },\n    exportConfig: {\n      name: '用户列表',\n      url: getExportUrl,\n    },\n    importConfig: {\n      url: getImportUrl,\n    },\n  });\n\n  //注册table数据\n  const [registerTable, { reload, updateTableDataRecord, clearSelectedRowKeys }, { rowSelection, selectedRows, selectedRowKeys }] = tableContext;\n\n  /**\n   * 新增事件\n   */\n  function handleCreate() {\n    openDrawer(true, {\n      isUpdate: false,\n      showFooter: true,\n      tenantSaas: false,\n    });\n  }\n  /**\n   * 编辑事件\n   */\n  async function handleEdit(record: Recordable) {\n    openDrawer(true, {\n      record,\n      isUpdate: true,\n      showFooter: true,\n      tenantSaas: false,\n    });\n  }\n  /**\n   * 详情\n   */\n  async function handleDetail(record: Recordable) {\n    openDrawer(true, {\n      record,\n      isUpdate: true,\n      showFooter: false,\n      tenantSaas: false,\n    });\n  }\n  /**\n   * 删除事件\n   */\n  async function handleDelete(record) {\n    if ('admin' == record.username) {\n      createMessage.warning('管理员账号不允许此操作！');\n      return;\n    }\n    await deleteUser({ id: record.id }, reload);\n  }\n  /**\n   * 批量删除事件\n   */\n  async function batchHandleDelete() {\n    let hasAdmin = unref(selectedRows).filter((item) => item.username == 'admin');\n    if (unref(hasAdmin).length > 0) {\n      createMessage.warning('管理员账号不允许此操作！');\n      return;\n    }\n    await batchDeleteUser({ ids: selectedRowKeys.value }, () => {\n      selectedRowKeys.value = [];\n      reload();\n    });\n  }\n  /**\n   * 成功回调\n   */\n  function handleSuccess() {\n    reload();\n  }\n\n  /**\n   * 打开修改密码弹窗\n   */\n  function handleChangePassword(username) {\n    openPasswordModal(true, { username });\n  }\n  /**\n   * 冻结解冻\n   */\n  async function handleFrozen(record, status) {\n    if ('admin' == record.username) {\n      createMessage.warning('管理员账号不允许此操作！');\n      return;\n    }\n    await frozenBatch({ ids: record.id, status: status }, reload);\n  }\n  /**\n   * 批量冻结解冻\n   */\n  function batchFrozen(status) {\n    let hasAdmin = selectedRows.value.filter((item) => item.username == 'admin');\n    if (unref(hasAdmin).length > 0) {\n      createMessage.warning('管理员账号不允许此操作！');\n      return;\n    }\n    createConfirm({\n      iconType: 'warning',\n      title: '确认操作',\n      content: '是否' + (status == 1 ? '解冻' : '冻结') + '选中账号?',\n      onOk: async () => {\n        await frozenBatch({ ids: unref(selectedRowKeys).join(','), status: status }, reload);\n      },\n    });\n  }\n  /**\n   * 批量重置密码\n   */\n  function batchResetPassword() {\n    let hasAdmin = selectedRows.value.filter((item) => item.username == 'admin');\n    if (unref(hasAdmin).length > 0) {\n      createMessage.warning('所选用户中包含管理员，管理员账号不允许重置密码！！');\n      return;\n    }\n    if (selectedRows.value.length > 0) {\n      createConfirm({\n        iconType: 'warning',\n        title: '确认操作',\n        content: '是否重置选中的账号密码?',\n        onOk: async () => {\n          const usernames = selectedRows.value.map((item) => item.username).join(',');\n          await resetPassword({ usernames: usernames }, ()=>{reload();clearSelectedRowKeys();});\n        },\n      });\n    }\n  }\n\n\n  /**\n   *同步钉钉和微信回调\n   */\n  function onSyncFinally({ isToLocal }) {\n    // 同步到本地时刷新下数据\n    if (isToLocal) {\n      reload();\n    }\n  }\n\n  /**\n   * 操作栏\n   */\n  function getTableAction(record): ActionItem[] {\n    return [\n      {\n        label: '编辑',\n        onClick: handleEdit.bind(null, record),\n        // ifShow: () => hasPermission('system:user:edit'),\n      },\n    ];\n  }\n  /**\n   * 下拉操作栏\n   */\n  function getDropDownAction(record): ActionItem[] {\n    return [\n      {\n        label: '详情',\n        onClick: handleDetail.bind(null, record),\n      },\n      {\n        label: '密码',\n        //auth: 'user:changepwd',\n        onClick: handleChangePassword.bind(null, record.username),\n      },\n      {\n        label: '删除',\n        popConfirm: {\n          title: '是否确认删除',\n          confirm: handleDelete.bind(null, record),\n        },\n      },\n      {\n        label: '冻结',\n        ifShow: record.status == 1,\n        popConfirm: {\n          title: '确定冻结吗?',\n          confirm: handleFrozen.bind(null, record, 2),\n        },\n      },\n      {\n        label: '解冻',\n        ifShow: record.status == 2,\n        popConfirm: {\n          title: '确定解冻吗?',\n          confirm: handleFrozen.bind(null, record, 1),\n        },\n      },\n    ];\n  }\n\n</script>\n\n<style scoped></style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/user/user.api.ts",
    "content": "import { defHttp } from '/@/utils/http/axios';\nimport { Modal } from 'ant-design-vue';\nimport { isObject } from '/@/utils/is';\nenum Api {\n  listNoCareTenant = '/sys/user/listAll',\n  list = '/sys/user/list',\n  save = '/sys/user/add',\n  edit = '/sys/user/edit',\n  getUserRole = '/sys/user/queryUserRole',\n  duplicateCheck = '/sys/duplicate/check',\n  deleteUser = '/sys/user/delete',\n  deleteBatch = '/sys/user/deleteBatch',\n  importExcel = '/sys/user/importExcel',\n  exportXls = '/sys/user/exportXls',\n  recycleBinList = '/sys/user/recycleBin',\n  putRecycleBin = '/sys/user/putRecycleBin',\n  deleteRecycleBin = '/sys/user/deleteRecycleBin',\n  allRolesList = '/sys/role/queryall',\n  allRolesListNoByTenant = '/sys/role/queryallNoByTenant',\n  allTenantList = '/sys/tenant/queryList',\n  allPostList = '/sys/position/list',\n  userDepartList = '/sys/user/userDepartList',\n  changePassword = '/sys/user/changePassword',\n  frozenBatch = '/sys/user/frozenBatch',\n  getUserAgent = '/sys/sysUserAgent/queryByUserName',\n  userQuitAgent = '/sys/user/userQuitAgent',\n  getQuitList = '/sys/user/getQuitList',\n  putCancelQuit = '/sys/user/putCancelQuit',\n  resetPassword = '/sys/user/resetPassword',\n  updateUserTenantStatus='/sys/tenant/updateUserTenantStatus',\n  getUserTenantPageList='/sys/tenant/getUserTenantPageList',\n  getDepPostIdByDepId = '/sys/sysDepart/getDepPostIdByDepId',\n}\n/**\n * 导出api\n * @param params\n */\nexport const getExportUrl = Api.exportXls;\n/**\n * 导入api\n */\nexport const getImportUrl = Api.importExcel;\n/**\n * 列表接口(查询用户，通过租户隔离)\n * @param params\n */\nexport const list = (params) => defHttp.get({ url: Api.list, params });\n\n/**\n * 列表接口(查询全部用户，不通过租户隔离)\n * @param params\n */\nexport const listNoCareTenant = (params) => defHttp.get({ url: Api.listNoCareTenant, params });\n\n/**\n * 用户角色接口\n * @param params\n */\nexport const getUserRoles = (params) => defHttp.get({ url: Api.getUserRole, params }, { errorMessageMode: 'none' });\n\n/**\n * 删除用户\n */\nexport const deleteUser = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.deleteUser, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 批量删除用户\n * @param params\n */\nexport const batchDeleteUser = (params, handleSuccess) => {\n  Modal.confirm({\n    title: '确认删除',\n    content: '是否删除选中数据',\n    okText: '确认',\n    cancelText: '取消',\n    onOk: () => {\n      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {\n        handleSuccess();\n      });\n    },\n  });\n};\n/**\n * 保存或者更新用户\n * @param params\n */\nexport const saveOrUpdateUser = (params, isUpdate) => {\n  let url = isUpdate ? Api.edit : Api.save;\n  return defHttp.post({ url: url, params });\n};\n/**\n * 唯一校验\n * @param params\n */\nexport const duplicateCheck = (params) => defHttp.get({ url: Api.duplicateCheck, params }, { isTransformResponse: false });\n\n/**\n * 20231215\n * liaozhiyang\n * 唯一校验（ 延迟【防抖】）\n * @param params\n */\nconst timer = {};\nexport const duplicateCheckDelay = (params) => {\n  return new Promise((resove, rejected) => {\n    // -update-begin--author:liaozhiyang---date:20240619---for：【TV360X-1380】表单中使用多个duplicateCheckDelay，validate方法调用时会导致promise被挂起保存不了\n    let key;\n    if (isObject(params)) {\n      key = `${params.tableName}_${params.fieldName}`;\n    } else {\n      key = params;\n    }\n    clearTimeout(timer[key]);\n    // -update-end--author:liaozhiyang---date:20240619---for：【TV360X-1380】表单中使用多个duplicateCheckDelay，validate方法调用时会导致promise被挂起保存不了\n    timer[key] = setTimeout(() => {\n      defHttp\n        .get({ url: Api.duplicateCheck, params }, { isTransformResponse: false })\n        .then((res: any) => {\n          resove(res as any);\n        })\n        .catch((error) => {\n          rejected(error);\n        });\n      delete timer[key];\n    }, 500);\n  });\n};\n/**\n * 获取全部角色（租户隔离）\n * @param params\n */\nexport const getAllRolesList = (params) => defHttp.get({ url: Api.allRolesList, params });\n/**\n * 获取全部角色（不租户隔离）\n * @param params\n */\nexport const getAllRolesListNoByTenant = (params) => defHttp.get({ url: Api.allRolesListNoByTenant, params });\n/**\n * 获取全部租户\n */\nexport const getAllTenantList = (params) => defHttp.get({ url: Api.allTenantList, params });\n/**\n * 获取指定用户负责部门\n */\nexport const getUserDepartList = (params) => defHttp.get({ url: Api.userDepartList, params }, { successMessageMode: 'none' });\n/**\n * 获取全部职务\n */\nexport const getAllPostList = (params) => {\n  return new Promise((resolve) => {\n    defHttp.get({ url: Api.allPostList, params }).then((res) => {\n      resolve(res.records);\n    });\n  });\n};\n/**\n * 回收站列表\n * @param params\n */\nexport const getRecycleBinList = (params) => defHttp.get({ url: Api.recycleBinList, params });\n/**\n * 回收站还原\n * @param params\n */\nexport const putRecycleBin = (params, handleSuccess) => {\n  return defHttp.put({ url: Api.putRecycleBin, params }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 回收站删除\n * @param params\n */\nexport const deleteRecycleBin = (params, handleSuccess) => {\n  return defHttp.delete({ url: Api.deleteRecycleBin, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 修改密码\n * @param params\n */\nexport const changePassword = (params) => {\n  return defHttp.put({ url: Api.changePassword, params });\n};\n/**\n * 冻结解冻\n * @param params\n */\nexport const frozenBatch = (params, handleSuccess) => {\n  return defHttp.put({ url: Api.frozenBatch, params }).then(() => {\n    handleSuccess();\n  });\n};\n/**\n * 重置密码\n * @param params\n */\nexport const resetPassword = (params, handleSuccess) => {\n  return defHttp.put({ url: Api.resetPassword, params },{joinParamsToUrl: true}).then(() => {\n    handleSuccess();\n  });\n};\n\n\n/**\n * 用户离职列表\n * @param params\n */\nexport const getQuitList = (params) => {\n  return defHttp.get({ url: Api.getQuitList, params });\n};\n\n/**\n * 取消离职\n * @param params\n */\nexport const putCancelQuit = (params, handleSuccess) => {\n  return defHttp.put({ url: Api.putCancelQuit, params }, { joinParamsToUrl: true }).then(() => {\n    handleSuccess();\n  });\n};\n\n/**\n * 待审批获取列表数据\n */\nexport const getUserTenantPageList = (params) => {\n  return defHttp.get({ url: Api.getUserTenantPageList, params });\n};\n\n/**\n * 更新租户状态\n * @param params\n */\nexport const updateUserTenantStatus = (params) => {\n  return defHttp.put({ url: Api.updateUserTenantStatus, params }, { joinParamsToUrl: true, isTransformResponse: false });\n};\n\n/**\n * 根据部门id和已选中的部门岗位id获取部门下的岗位id\n * \n * @param params\n */\nexport const getDepPostIdByDepId = (params) => {\n  return defHttp.get({ url: Api.getDepPostIdByDepId, params },{ isTransformResponse: false });\n};\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/user/user.data.ts",
    "content": "import { BasicColumn } from '/@/components/Table';\nimport { FormSchema } from '/@/components/Table';\nimport { getAllRolesListNoByTenant, getDepPostIdByDepId } from './user.api';\nimport { rules } from '/@/utils/helper/validator';\nimport { render } from '/@/utils/common/renderUtils';\nimport { getDepartPathNameByOrgCode, getDepartName, getMultiDepartPathName, getDepartPathName } from '@/utils/common/compUtils';\nimport { h } from 'vue';\nimport { Tag } from 'ant-design-vue';\nexport const columns: BasicColumn[] = [\n  {\n    title: '用户账号',\n    dataIndex: 'username',\n    width: 120,\n    resizable: true,\n  },\n  {\n    title: '用户姓名',\n    dataIndex: 'realname',\n    width: 100,\n    resizable: true,\n  },\n/*  {\n    title: '头像',\n    dataIndex: 'avatar',\n    width: 120,\n    customRender: render.renderAvatar,\n  },*/\n  {\n    title: '性别',\n    dataIndex: 'sex',\n    width: 80,\n    resizable: true,\n    sorter: true,\n    customRender: ({ text }) => {\n      return render.renderDict(text, 'sex');\n    },\n  },\n/*  {\n    title: '生日',\n    dataIndex: 'birthday',\n    width: 100,\n  },*/\n  {\n    title: '手机号',\n    dataIndex: 'phone',\n    width: 100,\n    resizable: true,\n    customRender:( { record, text })=>{\n      if(record.izHideContact && record.izHideContact === '1'){\n        return '/';\n      }\n      return text;\n    }\n  },\n  {\n    title: '部门',\n    width: 150,\n    resizable: true,\n    dataIndex: 'belongDepIds',\n    customRender:( { record, text })=>{\n      if(!text){\n        return '';\n      }\n      return getDepartName(getMultiDepartPathName(record.orgCodeTxt,text));\n    }\n  },\n  {\n    title: '负责部门',\n    width: 150,\n    resizable: true,\n    dataIndex: 'departIds',\n    customRender:( { record, text })=>{\n      if(!text){\n        return '';\n      }\n      return getDepartName(getMultiDepartPathName(record.departIds_dictText,text));\n    }\n  },\n  {\n    title: '主岗位',\n    width: 150,\n    resizable: true,\n    dataIndex: 'mainDepPostId',\n    customRender: ({ record, text })=>{\n      return getDepartName(getDepartPathName(record.mainDepPostId_dictText,text,false));\n    }\n  },\n  {\n    title: '兼职岗位',\n    width: 150,\n    resizable: true,\n    dataIndex: 'otherDepPostId',\n    customRender:({ record, text })=>{\n      if(!text){\n        return '';\n      }\n      return getDepartName(getMultiDepartPathName(record.otherDepPostId_dictText,text));\n    }\n  },\n  {\n    title: '状态',\n    dataIndex: 'status_dictText',\n    width: 80,\n    resizable: true,\n  },\n];\n\nexport const recycleColumns: BasicColumn[] = [\n  {\n    title: '用户账号',\n    dataIndex: 'username',\n    width: 100,\n  },\n  {\n    title: '用户姓名',\n    dataIndex: 'realname',\n    width: 100,\n  },\n  {\n    title: '头像',\n    dataIndex: 'avatar',\n    width: 80,\n    customRender: render.renderAvatar,\n  },\n  {\n    title: '性别',\n    dataIndex: 'sex',\n    width: 80,\n    sorter: true,\n    customRender: ({ text }) => {\n      return render.renderDict(text, 'sex');\n    },\n  },\n];\n\nexport const searchFormSchema: FormSchema[] = [\n  {\n    label: '账号',\n    field: 'username',\n    component: 'JInput',\n    //colProps: { span: 6 },\n  },\n  {\n    label: '名字',\n    field: 'realname',\n    component: 'JInput',\n   //colProps: { span: 6 },\n  },\n  {\n    label: '性别',\n    field: 'sex',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'sex',\n      placeholder: '请选择性别',\n      stringToNumber: true,\n    },\n    //colProps: { span: 6 },\n  },\n  {\n    label: '手机号码',\n    field: 'phone',\n    component: 'Input',\n    //colProps: { span: 6 },\n  },\n  {\n    label: '用户状态',\n    field: 'status',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'user_status',\n      placeholder: '请选择状态',\n      stringToNumber: true,\n    },\n   //colProps: { span: 6 },\n  },\n  {\n    label: '所属部门',\n    field: 'departId',\n    component: 'JSelectDept',\n    componentProps: {\n      placeholder: '请选择所属部门',\n      showButton: false,\n      checkStrictly: true\n    },\n  },\n];\n\nexport const formSchema: FormSchema[] = [\n  {\n    label: '',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n  {\n    label: '用户账号',\n    field: 'username',\n    component: 'Input',\n    required: true,\n    dynamicDisabled: ({ values }) => {\n      return !!values.id;\n    },\n    dynamicRules: ({ model, schema }) => rules.duplicateCheckRule('sys_user', 'username', model, schema, true),\n  },\n  {\n    label: '登录密码',\n    field: 'password',\n    component: 'StrengthMeter',\n    componentProps:{\n      autocomplete: 'new-password',\n    },\n    rules: [\n      {\n        required: true,\n        message: '请输入登录密码',\n      },\n      {\n        pattern: /^(?=.*[a-zA-Z])(?=.*\\d)(?=.*[~!@#$%^&*()_+`\\-={}:\";'<>?,./]).{8,}$/,\n        message: '密码由 8 位及以上数字、大小写字母和特殊符号组成！',\n      },\n    ],\n  },\n  {\n    label: '确认密码',\n    field: 'confirmPassword',\n    component: 'InputPassword',\n    dynamicRules: ({ values }) => rules.confirmPassword(values, true),\n  },\n  {\n    label: '用户姓名',\n    field: 'realname',\n    required: true,\n    component: 'Input',\n  },\n  {\n    label: '工号',\n    field: 'workNo',\n    required: false,\n    component: 'Input',\n    dynamicRules: ({ model, schema }) => rules.duplicateCheckRule('sys_user', 'work_no', model, schema, false),\n  },\n/*  {\n    label: '职务',\n    field: 'post',\n    required: false,\n    component: 'JSelectPosition',\n    componentProps: {\n      labelKey: 'name',\n    },\n  },*/\n  {\n    label: '职务',\n    field: 'positionType',\n    required: false,\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: \"user_position\",\n      mode: 'multiple',\n    },\n  },\n  {\n    label: '角色',\n    field: 'selectedroles',\n    component: 'ApiSelect',\n    componentProps: {\n      mode: 'multiple',\n      api: getAllRolesListNoByTenant,\n      labelField: 'roleName',\n      valueField: 'id',\n      immediate: false,\n    },\n  },\n  {\n    label: '所属部门',\n    field: 'selecteddeparts',\n    component: 'JSelectDept',\n    componentProps: ({ formActionType, formModel }) => {\n      return {\n        sync: false,\n        checkStrictly: true,\n        defaultExpandLevel: 2,\n\n        onSelect: (options, values) => {\n          const { updateSchema } = formActionType;\n          //所属部门修改后更新负责部门下拉框数据\n          updateSchema([\n            //修改主岗位和兼职岗位的参数\n            {\n              field: 'mainDepPostId',\n              componentProps: { params: { departIds: values?values.value.join(\",\"): \"\" } },\n            },\n            {\n              field: 'otherDepPostId',\n              componentProps: { params: { departIds: values?values.value.join(\",\"): \"\" } },\n            }\n          ]);\n          //更新负责部门的option\n          updateDepartOption(options, updateSchema);\n          if(!values){\n            formModel.departIds = [];\n            formModel.mainDepPostId = \"\";\n            formModel.otherDepPostId = \"\";\n            return;\n          }\n          //所属部门修改后更新负责部门数据\n          formModel.departIds && (formModel.departIds = formModel.departIds.filter((item) => values.value.indexOf(item) > -1));\n        },\n        onChange: async (values) => {\n          // 当所属部门发生改变时，需要取消主岗位和兼职岗位的选中值\n          await removeDepPostByDepId(formModel, values, formActionType);\n        }\n      };\n    },\n  },\n  {\n    label: '主岗位',\n    field: 'mainDepPostId',\n    component: 'JSelectDepartPost',\n    componentProps: {\n      rowKey: 'id',\n      multiple: false,\n      izShowDepPath: true,\n    },\n    ifShow:  ({ values }) => {\n      if(!values.selecteddeparts){\n        return false;\n      }\n      return !(values.selecteddeparts instanceof Array && values.selecteddeparts.length == 0);\n    },\n  },\n  {\n    label: '兼职岗位',\n    field: 'otherDepPostId',\n    component: 'JSelectDepartPost',\n    componentProps: {\n      rowKey: 'id',\n      izShowDepPath: true,\n    },\n    ifShow:  ({ values }) => {\n      if(!values.selecteddeparts){\n        return false;\n      }\n      return !(values.selecteddeparts instanceof Array && values.selecteddeparts.length == 0);\n    },\n  },\n  {\n    label: '租户',\n    field: 'relTenantIds',\n    component: 'JSearchSelect',\n    componentProps: {\n      dict:\"sys_tenant,name,id\",\n      async: true,\n      multiple: true\n    },\n  },\n  {\n    label: '身份',\n    field: 'userIdentity',\n    component: 'RadioGroup',\n    defaultValue: 1,\n    componentProps: ({ formModel }) => {\n      return {\n        options: [\n          { label: '普通用户', value: 1, key: '1' },\n          { label: '上级', value: 2, key: '2' },\n        ],\n        onChange: () => {\n          formModel.userIdentity == 1 && (formModel.departIds = []);\n        },\n      };\n    },\n  },\n  {\n    label: '负责部门',\n    field: 'departIds',\n    component: 'Select',\n    componentProps: {\n      mode: 'multiple',\n      tagRender: ({ label, value, closable, onClose }) => {\n        // 计算显示文本：前面省略号 + 后面字符\n        let displayLabel = label;\n        if(displayLabel && label.length >= 20) {\n          displayLabel = \"...\" + displayLabel.substring(label.length - 20);\n        }\n        return h(Tag, {\n          style: {\n            position: 'relative',\n            boxSizing: 'border-box',\n            height: '24px',\n            marginTop: '2px',\n            fontSize: '14px',\n            marginBottom: '2px',\n            lineHeight: '22px',\n            background: 'rgba(51, 51, 51, 0.06)',\n            border: '1px solid rgba(5, 5, 5, 0.06)',\n            borderRadius: '4px',\n            cursor: 'default'\n          },\n          title: label,\n          closable,\n          onClose:(e)=>{\n            e.stopPropagation();\n            onClose();\n          }\n        }, () => displayLabel);\n      }\n    },\n    ifShow: ({ values }) => values.userIdentity == 2,\n  },\n  {\n    label: '排序',\n    field: 'sort',\n    component: 'InputNumber',\n    defaultValue: 1000,\n    componentProps: {\n      min: 1,\n      max: 999999,\n      step: 1,\n      precision: 0\n    }\n  },\n  {\n    label: '头像',\n    field: 'avatar',\n    component: 'JImageUpload',\n    componentProps: {\n      fileMax: 1,\n    },\n  },\n  {\n    label: '生日',\n    field: 'birthday',\n    component: 'DatePicker',\n  },\n  {\n    label: '性别',\n    field: 'sex',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'sex',\n      placeholder: '请选择性别',\n      stringToNumber: true,\n    },\n  },\n  {\n    label: '邮箱',\n    field: 'email',\n    component: 'Input',\n    required: false,\n    dynamicRules: ({ model, schema }) => {\n      return [\n        { ...rules.duplicateCheckRule('sys_user', 'email', model, schema, false)[0], trigger: 'blur' },\n        { ...rules.rule('email', false)[0], trigger: 'blur' },\n      ];\n    },\n  },\n  {\n    label: '手机号码',\n    field: 'phone',\n    component: 'Input',\n    required: true,\n    dynamicRules: ({ model, schema }) => {\n      return [\n        { ...rules.duplicateCheckRule('sys_user', 'phone', model, schema, true)[0], trigger: 'blur' },\n        { pattern: /^1[3456789]\\d{9}$/, message: '手机号码格式有误', trigger: 'blur' },\n      ];\n    },\n  },\n  {\n    label: '座机',\n    field: 'telephone',\n    component: 'Input',\n    rules: [{ pattern: /^0\\d{2,3}-[1-9]\\d{6,7}$/, message: '请输入正确的座机号码' }],\n  },\n  {\n    label: '工作流引擎',\n    field: 'activitiSync',\n    defaultValue: 1,\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'activiti_sync',\n      type: 'radio',\n      stringToNumber: true,\n    },\n  },\n  {\n    label: '隐藏联系方式',\n    field: 'izHideContact',\n    defaultValue: '0',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'yn',\n      type: 'radio',\n    },\n  },\n];\n\nexport const formPasswordSchema: FormSchema[] = [\n  {\n    label: '用户账号',\n    field: 'username',\n    component: 'Input',\n    componentProps: { readOnly: true },\n  },\n  {\n    label: '登录密码',\n    field: 'password',\n    component: 'StrengthMeter',\n    componentProps: {\n      placeholder: '请输入登录密码',\n    },\n    rules: [\n      {\n        required: true,\n        message: '请输入登录密码',\n      },\n      {\n        pattern: /^(?=.*[a-zA-Z])(?=.*\\d)(?=.*[~!@#$%^&*()_+`\\-={}:\";'<>?,./]).{8,}$/,\n        message: '密码由 8 位及以上数字、大小写字母和特殊符号组成！',\n      },\n    ],\n  },\n  {\n    label: '确认密码',\n    field: 'confirmPassword',\n    component: 'InputPassword',\n    dynamicRules: ({ values }) => rules.confirmPassword(values, true),\n  },\n];\n\n\n//租户用户列表\nexport const userTenantColumns: BasicColumn[] = [\n  {\n    title: '用户账号',\n    dataIndex: 'username',\n    width: 120,\n  },\n  {\n    title: '用户姓名',\n    dataIndex: 'realname',\n    width: 100,\n  },\n  {\n    title: '头像',\n    dataIndex: 'avatar',\n    width: 120,\n    customRender: render.renderAvatar,\n  },\n  {\n    title: '手机号',\n    dataIndex: 'phone',\n    width: 100,\n  },\n  {\n    title: '部门',\n    width: 150,\n    dataIndex: 'orgCodeTxt',\n  },\n  {\n    title: '状态',\n    dataIndex: 'status',\n    width: 80,\n    customRender: ({ text }) => {\n      if (text === '1') {\n        return '正常';\n      } else if (text === '3') {\n        return '审批中';\n      } else {\n        return '已拒绝';\n      }\n    },\n  },\n];\n\n//用户租户搜索表单\nexport const userTenantFormSchema: FormSchema[] = [\n  {\n    label: '账号',\n    field: 'username',\n    component: 'Input',\n    colProps: { span: 6 },\n  },\n  {\n    label: '名字',\n    field: 'realname',\n    component: 'Input',\n    colProps: { span: 6 },\n  },\n  {\n    label: '性别',\n    field: 'sex',\n    component: 'JDictSelectTag',\n    componentProps: {\n      dictCode: 'sex',\n      placeholder: '请选择性别',\n      stringToNumber: true,\n    },\n    colProps: { span: 6 },\n  },\n];\n\n\n/**\n * 删除非当前部门下的数据\n * 当所属部门发生改变时，取消主岗位和兼职岗位的选中值\n * \n * @param formModel 表单模型\n * @param values 选中的部门值\n * @param formActionType 表单操作方法\n */\nasync function removeDepPostByDepId(formModel, values, formActionType) {\n  const { setFieldsValue } = formActionType;\n  if (values) {\n    let departIds = \"\";\n    if (values instanceof Array) {\n      departIds = values.join(\",\");\n    } else {\n      departIds = values;\n    }\n    if (departIds) {\n      try {\n        // 查询当前选中部门下的岗位ID\n        const { result } = await getDepPostIdByDepId({ depIds: departIds });\n        const validPostIds = result.split(\",\") || [];\n        \n        // 检查主岗位是否在当前部门下\n        if (formModel.mainDepPostId) {\n          const mainPostId = Array.isArray(formModel.mainDepPostId) \n            ? formModel.mainDepPostId[0] \n            : formModel.mainDepPostId;\n          \n          if (mainPostId && !validPostIds.includes(mainPostId)) {\n            // 主岗位不在当前部门下，清空主岗位\n            setFieldsValue({ mainDepPostId: null });\n            formModel.mainDepPostId = null;\n          }\n        }\n\n        // 检查兼职岗位是否在当前部门下\n        if(typeof formModel.otherDepPostId === \"string\"){\n          formModel.otherDepPostId = formModel.otherDepPostId.split(\",\");\n        }\n        if (formModel.otherDepPostId && Array.isArray(formModel.otherDepPostId)) {\n          const validOtherPosts = formModel.otherDepPostId.filter(postId => \n            validPostIds.includes(postId)\n          );\n          // 有兼职岗位不在当前部门下，更新兼职岗位\n          setFieldsValue({ otherDepPostId: validOtherPosts });\n          formModel.otherDepPostId = validOtherPosts;\n        }\n      } catch (error) {\n        console.error('查询部门岗位失败:', error);\n        // 查询失败时，清空所有岗位选择\n        setFieldsValue({\n          mainDepPostId: null,\n          otherDepPostId: []\n        });\n        formModel.mainDepPostId = null;\n        formModel.otherDepPostId = [];\n      }\n    } else {\n      // 没有选中部门时，清空所有岗位选择\n      setFieldsValue({\n        mainDepPostId: null,\n        otherDepPostId: []\n      });\n      formModel.mainDepPostId = null;\n      formModel.otherDepPostId = [];\n    }\n  }\n}\n\n/**\n * 更新负责部门的options\n *\n * @param options\n * @param updateSchema\n */\nasync function updateDepartOption(options, updateSchema) {\n  if (options && options.length > 0) {\n    // 并行处理所有异步操作\n    const updatedOptions = await Promise.all(\n      options.map(async (item) => {\n        const departPathName = await getDepartPathNameByOrgCode('', item.label, item.value);\n        return { ...item, label: departPathName };\n      })\n    );\n    updateSchema([\n      {\n        field: 'departIds',\n        componentProps: { options: updatedOptions },\n      },\n    ]);\n  } else {\n    updateSchema([\n      {\n        field: 'departIds',\n        componentProps: { options: [] },\n      },\n    ]);\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/user/userDetails.vue",
    "content": "<template>\n  <Description @register=\"register\" class=\"mt-4\" />\n</template>\n<script lang=\"ts\">\n  import { defineComponent } from 'vue';\n  import { Description, DescItem, useDescription } from '/@/components/Description/index';\n  const mockData = {\n    username: 'test',\n    nickName: 'VB',\n    age: '123',\n    phone: '15695909xxx',\n    email: '190848757@qq.com',\n    addr: '厦门市思明区',\n    sex: '男',\n    certy: '3504256199xxxxxxxxx',\n    tag: 'orange',\n  };\n  const schema: DescItem[] = [\n    {\n      field: 'username',\n      label: '用户名',\n    },\n    {\n      field: 'nickName',\n      label: '昵称',\n      render: (curVal, data) => {\n        return `${data.username}-${curVal}`;\n      },\n    },\n    {\n      field: 'phone',\n      label: '联系电话',\n    },\n    {\n      field: 'email',\n      label: '邮箱',\n    },\n    {\n      field: 'addr',\n      label: '地址',\n    },\n  ];\n  export default defineComponent({\n    components: { Description },\n    setup() {\n      const [register] = useDescription({\n        title: 'useDescription',\n        data: mockData,\n        schema: schema,\n      });\n      return { mockData, schema, register };\n    },\n  });\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/usersetting/AccountSetting.vue",
    "content": "<template>\n  <div :class=\"[`${prefixCls}`]\">\n    <div class=\"my-account\">账户</div>\n    <div class=\"account-row-item clearfix\">\n      <div class=\"account-label gray-75\">手机</div>\n      <span class=\"gray\" v-if=\"userDetail.phoneText\">{{ userDetail.phoneText}}</span>\n      <span class=\"pointer blue-e5 phone-margin\" @click=\"updatePhone\" v-if=\"userDetail.phone\">修改</span>\n      <span class=\"pointer blue-e5 phone-margin\" @click=\"bindPhone\" v-else>绑定</span>\n      <!--      <span class=\"pointer blue-e5\" @click=\"unbindPhone\" v-if=\"userDetail.phone\">解绑?</span>-->\n      <!--      <span class=\"pointer blue-e5\" @click=\"unbindPhone\" v-else>绑定?</span>-->\n    </div>\n    <div class=\"account-row-item clearfix\">\n      <div class=\"account-label gray-75\">邮箱</div>\n      <span class=\"gray\">{{ userDetail.email ? userDetail.email : '未填写' }}</span>\n      <span class=\"pointer blue-e5 phone-margin\" @click=\"updateEmail\">修改</span>\n      <!--      <span class=\"pointer blue-e5\" @click=\"unbindEmail\" v-if=\"userDetail.email\">解绑?</span>-->\n      <!--      <span class=\"pointer blue-e5\" @click=\"unbindEmail\" v-else>绑定?</span>-->\n      <!--      <span class=\"pointer blue-e5\" style=\"margin-left:5px\" @click=\"checkEmail\" v-if=\"userDetail.email\">验证?</span>-->\n    </div>\n    <div class=\"account-row-item\">\n      <div class=\"account-label gray-75\">密码</div>\n      <Icon icon=\"ant-design:lock-outlined\" style=\"color: #9e9e9e\" />\n      <span class=\"pointer blue-e5\" style=\"margin-left: 10px\" @click=\"updatePassWord\">修改</span>\n    </div>\n\n    <!--    <div class=\"account-row-item clearfix\">-->\n    <!--      <div class=\"account-label gray-75\">账户注销?</div>-->\n    <!--      <span style=\"color: red\" class=\"pointer\" @click=\"cancellation\">注销?</span>-->\n    <!--    </div>-->\n  </div>\n\n  <UserReplacePhoneModal @register=\"registerModal\" @success=\"initUserDetail\" />\n  <UserReplaceEmailModal @register=\"registerEmailModal\" @success=\"initUserDetail\" />\n  <UserPasswordModal @register=\"registerPassModal\" @success=\"initUserDetail\" />\n  <UserPasswordNotBindPhone @register=\"registerPassNotBindPhoneModal\" @success=\"initUserDetail\" />\n  <UserCancellationModal @register=\"registerCancelModal\" />\n</template>\n<script lang=\"ts\" setup>\n  import { onMounted, ref, reactive } from 'vue';\n  import { CollapseContainer } from '/@/components/Container';\n  import { getUserData } from './UserSetting.api';\n  import { useUserStore } from '/@/store/modules/user';\n  import UserReplacePhoneModal from './commponents/UserPhoneModal.vue';\n  import UserReplaceEmailModal from './commponents/UserEmailModal.vue';\n  import UserPasswordModal from './commponents/UserPasswordModal.vue';\n  import UserPasswordNotBindPhone from './commponents/UserPasswordNotBindPhone.vue';\n  import UserCancellationModal from './commponents/UserCancellationModal.vue';\n  import { useModal } from '/@/components/Modal';\n  import { WechatFilled } from '@ant-design/icons-vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  const { prefixCls } = useDesign('j-user-account-setting-container');\n\n  const userDetail = ref<any>([]);\n  const userStore = useUserStore();\n  const [registerModal, { openModal }] = useModal();\n  const [registerEmailModal, { openModal: openEmailModal }] = useModal();\n  const [registerPassModal, { openModal: openPassModal }] = useModal();\n  const [registerPassNotBindPhoneModal, { openModal: openPassNotBindPhoneModal }] = useModal();\n  const [registerCancelModal, { openModal: openCancelModal }] = useModal();\n\n  const wechatData = reactive<any>({\n    bindWechat: false,\n    name: '昵称',\n  });\n\n  /**\n   * 初始化用户数据\n   */\n  function initUserDetail() {\n    //获取用户数据\n    getUserData().then((res) => {\n      if (res.success) {\n        userDetail.value = res.result;\n        if(res.result.phone){\n          userDetail.value.phoneText = res.result.phone.replace(/(\\d{3})\\d{4}(\\d{4})/, '$1****$2');\n        }\n      }\n    });\n  }\n\n  /**\n   * 修改手机号\n   */\n  function updatePhone() {\n    openModal(true, {\n      record: { phone: userDetail.value.phone, username: userDetail.value.username, id: userDetail.value.id, phoneText: userDetail.value.phoneText },\n    });\n  }\n  \n  /**\n   * 绑定手机号\n   */ \n  function bindPhone() {\n    openModal(true, {\n      record: { username: userDetail.value.username, id: userDetail.value.id },\n    });\n  }\n\n  /**\n   * 修改邮箱\n   */\n  function updateEmail() {\n    openEmailModal(true, {\n      record: { email: userDetail.value.email, id: userDetail.value.id },\n    });\n  }\n\n  /**\n   * 密码修改\n   */\n  function updatePassWord() {\n    //存在手机号手机号修改密码\n    if(userDetail.value.phone){\n      openPassModal(true, {\n        record: { username: userDetail.value.username },\n      });\n    } else {\n      //没有手机号走直接修改密码弹窗\n      openPassNotBindPhoneModal(true, {\n        record: { username: userDetail.value.username },\n      });\n    }\n  }\n\n  /**\n   * 手机号解绑\n   */\n  function unbindPhone() {\n    console.log('手机号解绑');\n  }\n\n  /**\n   * 邮箱解绑\n   */\n  function unbindEmail() {\n    console.log('邮箱解绑');\n  }\n\n  /**\n   * 邮箱验证\n   */\n  function checkEmail() {\n    console.log('邮箱验证');\n  }\n\n  /**\n   * 微信绑定解绑事件\n   */\n  function wechatBind() {\n    console.log('微信绑定解绑事件');\n  }\n\n  /**\n   * 注销事件\n   */\n  function cancellation() {}\n\n  onMounted(() => {\n    initUserDetail();\n  });\n</script>\n<style lang=\"less\">\n    // 代码逻辑说明: [issues/563]暗色主题部分失效\n  @prefix-cls: ~'@{namespace}-j-user-account-setting-container';\n\n  .@{prefix-cls}{\n     padding: 30px 40px 0 20px;\n    .account-row-item {\n      align-items: center;\n      /*begin 兼容暗夜模式*/\n      border-bottom: 1px solid @border-color-base;\n      /*end 兼容暗夜模式*/\n      box-sizing: border-box;\n      display: flex;\n      height: 71px;\n      position: relative;\n    }\n\n    .account-label {\n      text-align: left;\n      width: 160px;\n    }\n\n    .gray-75 {\n      /*begin 兼容暗夜模式*/\n      color: @text-color !important;\n      /*end 兼容暗夜模式*/\n    }\n\n    .pointer {\n      cursor: pointer;\n    }\n\n    .blue-e5 {\n      color: #1e88e5;\n    }\n\n    .phone-margin {\n      margin-left: 24px;\n      margin-right: 24px;\n    }\n\n    .clearfix:after {\n      clear: both;\n    }\n\n    .clearfix:before {\n      content: \"\";\n      display: table;\n    }\n    .my-account{\n      font-size: 17px;\n      font-weight: 700!important;\n      /*begin 兼容暗夜模式*/\n      color: @text-color;\n      /*end 兼容暗夜模式*/\n      margin-bottom: 20px;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/usersetting/BaseSetting.vue",
    "content": "<template>\n  <div class=\"account-padding\" :class=\"[`${prefixCls}`]\">\n    <div class=\"user-setting-top\">\n      <div class=\"account-avatar\">\n        <CropperAvatar\n          :uploadApi=\"uploadImg\"\n          :showBtn=\"false\"\n          :value=\"avatar\"\n          :btnProps=\"{ preIcon: 'ant-design:cloud-upload-outlined' }\"\n          @change=\"updateAvatar\"\n          width=\"80\"\n        />\n        <div class=\"account-right border-bottom\">\n          <div v-if=\"!isEdit\">\n            <span class=\"font-size-17 account-name\">{{ userInfo.realname }}</span>\n            <a-tooltip content=\"编辑姓名\">\n              <Icon class=\"pointer font-size-17 gray-bd account-icon\" icon=\"ant-design:edit-outlined\"\n                    @click=\"editHandleClick\" />\n            </a-tooltip>\n          </div>\n          <div v-else>\n            <a-input ref=\"accountNameEdit\" :maxlength=\"100\" v-model:value=\"userInfo.realname\" @blur=\"editRealName\" />\n          </div>\n          <div class=\"use-day\">\n            使用：<span>{{userInfo.createTimeText}}</span>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class=\"account-data border-bottom\">\n      <!-- 详细资料 -->\n      <div class=\"account-detail\">\n        <div class=\"font-size-15 font-bold font-color-gray\" style=\"margin-bottom: 16px\">详细资料</div>\n        <div class=\"margin-bottom-10 font-size-13\">\n          <span class=\"gray-75 item-label\">生日</span>\n          <span class=\"gray-3\">{{ userInfo.birthday }}</span>\n        </div>\n        <div class=\"margin-bottom-10 font-size-13\">\n          <span class=\"gray-75 item-label\">性别</span>\n          <span class=\"gray-3\">{{ userInfo.sexText }}</span>\n        </div>\n        <div class=\"margin-bottom-10 nowarp font-size-13\">\n          <span class=\"gray-75 item-label\">职位</span>\n          <span class=\"gray-3\">{{ userInfo.postText ? userInfo.postText : \"未填写\" }}</span>\n        </div>\n        <div class=\"font-size-13\">\n          <span class=\"item-label\"></span>\n          <span class=\"item-label pointer\" style=\"color:#1e88e5\" @click=\"openEditModal\">编辑</span>\n        </div>\n      </div>\n      <!-- 联系信息 -->\n      <div class=\"account-info\">\n        <div class=\"font-size-15 font-bold font-color-gray\" style=\"margin-bottom: 16px\">联系信息</div>\n        <div class=\"margin-bottom-10 font-size-13\">\n          <span class=\"gray-75 item-label\">邮箱</span>\n          <span class=\"gray-3\">{{ userInfo.email ? userInfo.email : \"未填写\" }}</span>\n        </div>\n        <div class=\"margin-bottom-10 font-size-13\">\n          <span class=\"gray-75 item-label\">手机</span>\n          <span class=\"gray-3\">{{ userInfo.phone ? userInfo.phone : \"未填写\" }}</span>\n        </div>\n      </div>\n    </div>\n    <div class=\"account-data\">\n      <!-- 个性签名 -->\n      <div class=\"account-detail\">\n        <div class=\"font-size-15 font-bold font-color-gray\" style=\"margin-bottom: 16px\">个性签名</div>\n        <div class=\"font-size-13 flex\">\n          <span class=\"gray-75 item-label\">签名</span>\n          <a-upload\n            accept=\"jpg,jpeg,png\"  \n            :max-count=\"1\"\n            :multiple=\"false\"\n            name = \"file\"\n            :headers=\"uploadHeader\"\n            :action=\"uploadUrl\"\n            v-model:fileList=\"uploadFileList\"\n            @beforeUpload=\"beforeUpload\"\n            @change=\"handleChange\"\n            list-type=\"picture-card\"\n            @preview=\"handlePreview\"\n          >\n            <div v-if=\"uploadVisible\">\n              <UploadOutlined></UploadOutlined>\n              <div class=\"ant-upload-text\">上传</div>\n            </div>\n          </a-upload>\n          <a-modal :width=\"500\" :open=\"previewVisible\" :footer=\"null\" @cancel=\"handleCancel\">\n            <img alt=\"example\" style=\"width: 100%\" :src=\"previewImage\" />\n          </a-modal>\n        </div>\n        <div style=\"font-size: 12px;color:#93a6aa\" class=\"margin-bottom-10\">\n          <p>建议上传尺寸为200*80，大小不超过1M且格式为png或jpeg的图片</p>\n          <p>生成签名方法一：手写扫描进行上传。</p>\n          <p>生成签名方法二：使用在线转换，生成后进行上传。\n            <a href=\"http://www.diyiziti.com/qianming\" target=\"_blank\">http://www.diyiziti.com/qianming</a>\n          </p>\n        </div>\n        <div class=\"margin-bottom-10 font-size-13 flex\" style=\"margin-top: 10px\">\n          <span class=\"gray-75 item-label\">开启状态</span>\n          <a-switch v-model:checked=\"userInfo.signEnable\" :checkedValue=\"1\" :unCheckedValue=\"0\" @change=\"handleEnableSignChange\"></a-switch>\n        </div>\n      </div>\n    </div>\n  </div>\n  <UserAccountModal @register=\"registerModal\" @success=\"getUserDetail\"></UserAccountModal>\n</template>\n<script lang=\"ts\" setup>\nimport { computed, onMounted, ref } from 'vue';\nimport { CollapseContainer } from '/@/components/Container';\nimport { CropperAvatar } from '/@/components/Cropper';\nimport { useMessage } from '/@/hooks/web/useMessage';\nimport headerImg from '/@/assets/images/header.jpg';\nimport { defHttp } from '/@/utils/http/axios';\nimport { useUserStore } from '/@/store/modules/user';\nimport { uploadImg } from '/@/api/sys/upload';\nimport { getFileAccessHttpUrl, getRandom } from '/@/utils/common/compUtils';\nimport dayjs from 'dayjs';\nimport { ajaxGetDictItems, getDictItemsByCode, initDictOptions } from '/@/utils/dict';\nimport { userEdit, getUserData, queryNameByCodes } from './UserSetting.api';\nimport UserAccountModal from './commponents/UserAccountModal.vue';\nimport { useModal } from '/@/components/Modal';\nimport { cloneDeep } from 'lodash-es';\nimport { useDesign } from '/@/hooks/web/useDesign';\nimport { getToken } from \"@/utils/auth\";\nimport { uploadUrl } from \"@/api/common/api\";\nimport { UploadOutlined } from \"@ant-design/icons-vue\";\n\n//TODO 当字典租户隔离时，数据会查不到，默认一个\nconst sexOption = getDictItemsByCode(\"sex\") || [{text:'男',value:'1'},{text:'女',value:'2'}];\nconst { createMessage } = useMessage();\nconst userStore = useUserStore();\n  const { prefixCls } = useDesign('j-base-setting-container');\n//是否编辑\nconst isEdit = ref<boolean>(false);\n//用户信息\nconst userInfo = ref<any>({});\n//编辑时input触发事件\nconst accountNameEdit = ref();\nconst [registerModal, { openModal }] = useModal();\n//头像动态计算\nconst avatar = computed(() => {\n  return getFileAccessHttpUrl(userInfo.value.avatar) || headerImg;\n});\n//headers\nconst uploadHeader = computed(() => {\n  let headers = {};\n  headers['X-Access-Token'] = getToken();\n  return headers;\n});\nconst { createMessage: $message } = useMessage();\n//上传列表\nconst uploadFileList = ref<any>([]);\n//计算是否可以继续上传\nconst uploadVisible = computed(() => {\n  if(!uploadFileList){\n    return true;\n  }\n  return uploadFileList.value.length < 1;\n});\n//图片预览\nconst previewVisible = ref<boolean>(false);\n//图片预览路径\nconst previewImage = ref<string>('');\n\n/**\n * 更新用户头像\n */\nfunction updateAvatar(src: string, data: string) {\n  const userinfo = userStore.getUserInfo;\n  userinfo.avatar = data;\n  userStore.setUserInfo(userinfo);\n  if (data) {\n    updateUserInfo({ avatar: data, id: userinfo.id });\n  }\n}\n\n/**\n * 更新用户信息\n * @params 参数\n */\nfunction updateUserInfo(params) {\n  userEdit(params).then((res) => {\n    if (!res.success) {\n      createMessage.warn(res.message);\n    }\n  });\n}\n\n/**\n * 编辑按钮点击事件\n */\nfunction editHandleClick() {\n  isEdit.value = true;\n  setTimeout(() => {\n    accountNameEdit.value.focus();\n  }, 100);\n}\n\n/**\n * 修改真实姓名\n */\nfunction editRealName() {\n  if (userInfo.value.realname) {\n    updateUserInfo({ realname: userInfo.value.realname, id: userInfo.value.id });\n    userStore.setUserInfo(userInfo.value);\n  } else {\n    createMessage.warn(\"请输入姓名\");\n  }\n  isEdit.value = false;\n}\n\n/**\n * 获取生日信息\n */\nfunction getBirthDay(val) {\n  if (val) {\n    return dayjs(val).format(\"YYYY-MM-DD\");\n  } else {\n    return \"未填写\";\n  }\n}\n\n/**\n * 获取性别\n * @param val\n */\nfunction getSex(val) {\n  let findOption = sexOption.find(item => parseInt(item.value) === val);\n  let sex = \"未填写\";\n  if (findOption) {\n    sex = findOption.text;\n  }\n  return sex;\n}\n\n/**\n * 打开编辑弹窗\n */\nfunction openEditModal() {\n  let value = cloneDeep(userInfo.value);\n  openModal(true, {\n    record: value\n  });\n}\n\n/**\n * 获取用户信息\n */\nfunction getUserDetail() {\n  uploadFileList.value = [];\n  getUserData().then((async res => {\n    if (res.success) {\n      if (res.result) {\n        res.result.sexText = getSex(res.result.sex);\n        res.result.birthday = getBirthDay(res.result.birthday);\n        res.result.createTimeText = getDiffDay(res.result.createTime);\n        userInfo.value = res.result;\n        if(userInfo.value.sign){\n          let sign = userInfo.value.sign;\n          let url = getFileAccessHttpUrl(sign);\n          uploadFileList.value.push({\n            uid: getRandom(10),\n            name: getFileName(sign),\n            status: 'done',\n            url: url,\n            response: {\n              status: 'history',\n              message: sign,\n            },\n          })\n        }\n      } else {\n        userInfo.value = {};\n      }\n    }\n  }));\n}\n\n/**\n * 获取使用时间\n * @param date\n */\nfunction getDiffDay(date) {\n  // 计算两个日期之间的天数差值\n  let totalDays, diffDate\n  let createDate = Date.parse(date);\n  let nowDate = new Date().getTime();\n  // 将两个日期都转换为毫秒格式，然后做差\n  diffDate = Math.abs(nowDate - createDate) // 取相差毫秒数的绝对值\n  totalDays = Math.floor(diffDate / (1000 * 3600 * 24)) // 向下取整\n  return totalDays+\" 天\";\n}\n\n/**\n * 上传图片之前进行验证\n * \n * @param file\n */\nfunction beforeUpload({ file }) {\n  const isJpgOrPng = file.type === \"image/jpeg\" || file.type === \"image/png\" || file.type === \"image/jpg\";\n  if (!isJpgOrPng) {\n    $message.error(\"上传文件格式只能是jpg/png\");\n    return false;\n  }\n  const isLimit = file.size / 1024 / 1024 < 1;\n  if (!isLimit) {\n    $message.error(\"上传图片大小不能超过 1MB!\");\n    return false;\n  }\n  return true;\n}\n\n/**\n * 上传成功事件\n */\nfunction handleChange({ file, fileList }) {\n  if (file.status === 'error') {\n    createMessage.error(`${file.name} 上传失败.`);\n  }\n  if (file.status === 'done' && file.response.success === false) {\n    const failIndex = uploadFileList.value.findIndex((item) => item.uid === file.uid);\n    if (failIndex != -1) {\n      uploadFileList.value.splice(failIndex, 1);\n    }\n    createMessage.warning(file.response.message);\n    return;\n  }\n  if (file.status != 'uploading') {\n    fileList.forEach((file) => {\n      if (file.status === 'done') {\n        //上传成功事件\n        uploadSuccess(file.response.message);\n      }\n    });\n    if (file.status === 'removed') {\n      handleDelete();\n    }\n  }\n}\n\n/**\n * 移除\n */\nfunction handleDelete() {\n  updateUser({ sign: \"\", id: userInfo.value.id },\"删除个性签名成功\")\n}\n\n/**\n * 上传成功事件\n * @param url\n */\nfunction uploadSuccess(url) {\n   updateUser({ sign: url, id: userInfo.value.id },\"上传个性签名成功\")\n}\n\nfunction updateUser(params,message) {\n  userEdit(params).then((res) => {\n    if(res.success){\n      createMessage.success(message);\n    }\n  });\n}\n\n/**\n * 图片预览\n * @param file\n */\nfunction handlePreview(file) {\n  previewImage.value = file.url || file.thumbUrl;\n  previewVisible.value = true;\n}\n\n/**\n * 获取文件名\n * @param path\n */\nfunction getFileName(path) {\n  if (path.lastIndexOf('\\\\') >= 0) {\n    let reg = new RegExp('\\\\\\\\', 'g');\n    path = path.replace(reg, '/');\n  }\n  return path.substring(path.lastIndexOf('/') + 1);\n}\n\n/**\n * 图片预览关闭\n */\nfunction handleCancel() {\n  previewVisible.value = false;\n}\n\n/**\n * 个性签名开启状态更新\n */\nfunction handleEnableSignChange() {\n  updateUser({ signEnable: userInfo.value.signEnable, id: userInfo.value.id },\"修改成功\")\n}\n\nonMounted(async () => {\n  getUserDetail();\n});\n</script>\n\n<style lang=\"less\">\n    // 代码逻辑说明: [issues/563]暗色主题部分失效\n  @prefix-cls: ~'@{namespace}-j-base-setting-container';\n\n  .@{prefix-cls}{\n    .user-setting-top {\n      padding-top: 40px;\n      width: 100%;\n      border-bottom: 1px solid @border-color-base;\n      display: flex;\n      padding-bottom: 40px;\n    }\n\n    .account-avatar {\n      align-items: center;\n      display: flex;\n      margin-right: 30px;\n      flex: 1;\n    }\n\n    .change-avatar {\n      img {\n        display: block;\n        margin-bottom: 15px;\n        border-radius: 50%;\n      }\n    }\n\n    .account-right {\n      margin-left: 25px !important;\n    }\n\n    .font-size-15 {\n      font-size: 15px;\n    }\n\n    .font-size-17 {\n      font-size: 17px;\n    }\n\n    .pointer {\n      cursor: pointer;\n    }\n\n    .account-name {\n      white-space: nowrap;\n      overflow: hidden;\n      width: 200px;\n      text-overflow: ellipsis;\n      line-height: 32px !important;\n      /*begin 兼容暗夜模式*/\n      color: @text-color;\n      /*end 兼容暗夜模式*/\n      font-weight: 500;\n    }\n\n    .gray-bd {\n      color: #bdbdbd;\n    }\n\n    .account-icon {\n      margin-left: 4px;\n    }\n\n    .account-data {\n      width: 100% !important;\n      display: flex;\n      min-width: 0;\n    }\n\n    .account-detail {\n      width: 40%;\n      display: flex;\n      flex-direction: column;\n      padding: 40px 0;\n\n      .item-label {\n        display: inline-block;\n        text-align: left;\n        width: 80px;\n      }\n    }\n\n    .font-bold {\n      font-weight: 700 !important;\n    }\n\n    .margin-bottom-10 {\n      margin-bottom: 10px;\n    }\n\n    .account-info {\n      width: 60%;\n      display: flex;\n      flex-direction: column;\n      padding: 40px 0;\n      box-sizing: border-box;\n      margin-left: 10px;\n\n      .item-label {\n        display: inline-block;\n        text-align: left;\n        width: 80px;\n      }\n    }\n\n    .nowarp {\n      overflow: hidden;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n    }\n\n    .account-padding {\n      padding-left: 20px !important;\n      padding-right: 40px !important;\n    }\n\n    .use-day {\n      /*begin 兼容暗夜模式*/\n      color: @text-color;\n      /*end 兼容暗夜模式*/\n      margin-top: 10px;\n      font-size: 13px;\n      span {\n        color: #1e88e5;\n        margin-left: 5px;\n      }\n    }\n    .font-size-13 {\n      font-size: 13px;\n    }\n    .ant-upload-select,.ant-upload-list-item-container{\n      width: 200px !important;\n      height: 80px !important;\n    }\n    .ant-upload-list-item-thumbnail .ant-upload-list-item-image {\n      object-fit: cover !important;\n    }\n    p{\n      margin-bottom: 5px;\n    }\n    .border-bottom{\n      border-bottom: 1px solid @border-color-base;\n    }\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/usersetting/TenantSetting.vue",
    "content": "<template>\n  <div class=\"tenant-padding\" :class=\"[`${prefixCls}`]\">\n    <div class=\"my-tenant\">\n      <span style=\"flex: 1\">我的组织</span>\n      <span class=\"invited\" @click=\"invitedClick\">我的受邀信息<span class=\"approved-count\" v-if=\"invitedCount>0\">{{invitedCount}}</span></span>\n    </div>\n    <div class=\"tenant-list\" v-if=\"dataSource.length>0\">\n      <div v-for=\"item in dataSource\" class=\"tenant-list-item\" @click=\"drownClick(item)\">\n        <div class=\"tenant-title\">\n          <div class=\"item-left\">\n            <div class=\"item-name\">{{ item.name }}</div>\n            <div class=\"vip-message\">\n              <div class=\"item-house\" @click.stop=\"copyClick(item.houseNumber)\">\n                <span>\n                  组织门牌号：{{ item.houseNumber }}\n                  <Icon icon=\"ant-design:copy-outlined\" style=\"font-size: 13px; margin-left: 2px\" />\n                </span>\n              </div>\n            </div>\n          </div>\n          <div class=\"item-right\">\n            <span v-if=\"item.userTenantStatus === '3'\">\n              <span class=\"pointer examine\">待审核</span>\n              <span class=\"pointer cancel-apply\" @click.stop=\"cancelApplyClick(item.tenantUserId)\">取消申请</span>\n            </span>\n            <span v-else-if=\"item.userTenantStatus === '5'\">\n              <span class=\"pointer examine\" @click=\"joinOrRefuseClick(item.tenantUserId,'1')\">加入</span>\n              <span class=\"pointer cancel-apply\" @click.stop=\"joinOrRefuseClick(item.tenantUserId,'4')\">拒绝</span>\n            </span>\n            <div v-else style=\"width: 75px\"></div>\n            <span style=\"margin-left: 24px\">\n              <Icon v-if=\"item.show\" icon=\"ant-design:down-outlined\" style=\"font-size: 13px; color: #707070\" />\n              <Icon v-else icon=\"ant-design:right-outlined\" style=\"font-size: 13px; color: #707070\" />\n            </span>\n          </div>\n        </div>\n        <div class=\"item-content\" v-show=\"item.show\">\n          <div class=\"content-box\">\n            <div class=\"content-name\"> 组织名片 </div>\n            <div class=\"content-desc\">\n              <div class=\"flex-flow\">\n                <div class=\"content-des-text\">姓名</div>\n                <div style=\"font-size: 13px;color: #000000\">\n                  {{ userDetail.realname }}\n                </div>\n              </div>\n              <div class=\"flex-flow\">\n                <div class=\"content-des-text\">部门</div>\n                <div style=\"font-size: 13px\">\n                  {{ userDetail.orgCodeTxt ? userDetail.orgCodeTxt : '未填写' }}\n                </div>\n              </div>\n              <div class=\"flex-flow\">\n                <div class=\"content-des-text\">职业</div>\n                <div style=\"font-size: 13px\">\n                  {{ userDetail.postText ? userDetail.postText : '未填写' }}\n                </div>\n              </div>\n            </div>\n          </div>\n          <div class=\"footer-box\">\n            <span\n              v-if=\"item.userTenantStatus !== '3'\"\n              @click.stop=\"footerClick('editTenant', item)\"\n              class=\"font-color333 flex-center margin-right40 font-size13 pointer\"\n            >\n              <Icon icon=\"ant-design:edit-outlined\" class=\"footer-icon\" />\n              <span>查看租户名片</span>\n            </span>\n            <span v-else class=\"font-color9e flex-center margin-right40 font-size13\">\n              <Icon icon=\"ant-design:edit-outlined\" class=\"footer-icon\" />\n              <span>查看租户名片</span>\n            </span>\n            <span\n              v-if=\"item.userTenantStatus !== '3'\"\n              @click.stop=\"footerClick('exitTenant', item)\"\n              class=\"font-color333 flex-center margin-right40 font-size13 pointer\"\n            >\n              <Icon icon=\"ant-design:export-outlined\" class=\"footer-icon\" />\n              <span>退出租户</span>\n            </span>\n            <span v-else class=\"font-color9e flex-center margin-right40 font-size13\">\n              <Icon icon=\"ant-design:export-outlined\" class=\"footer-icon\" />\n              <span>退出租户</span>\n            </span>\n          </div>\n        </div>\n      </div>\n    </div>\n    <a-empty v-else description=\"暂无数据\" style=\"position: relative;top: 50px;\"/>\n  </div>\n  <a-modal v-model:open=\"tenantVisible\" width=\"400px\" wrapClassName=\"edit-tenant-setting\">\n    <template #title>\n      <div style=\"font-size: 17px; font-weight: 700\">查看名片</div>\n      <div style=\"color: #9e9e9e; margin-top: 10px; font-size: 13px\"> 名片是您在该组织下的个人信息，只在本组织中展示。 </div>\n    </template>\n    <div style=\"margin-top: 24px; font-size: 13px; padding: 0 24px\">\n      <div class=\"font-color75\">姓名</div>\n      <div class=\"margin-top6 margin-bottom-16\">{{ userDetail.realname }}</div>\n      <div>部门</div>\n      <div class=\"margin-top6 margin-bottom-16\">{{ userDetail.orgCodeTxt ? userDetail.orgCodeTxt : '未填写' }}</div>\n      <div>职位</div>\n      <div class=\"margin-top6 margin-bottom-16\">{{ userDetail.postText ? userDetail.postText : '未填写' }}</div>\n      <div>工作地点</div>\n      <div class=\"margin-top6 margin-bottom-16\">{{ userData.workPlace ? userData.workPlace : '未填写' }}</div>\n      <div>工号</div>\n      <div class=\"margin-top6 margin-bottom-16\">{{ userDetail.workNo ? userDetail.workNo : '未填写' }}</div>\n    </div>\n  </a-modal>\n\n  <!-- 退出租户 -->\n  <a-modal v-model:open=\"cancelVisible\" width=\"800\" destroy-on-close>\n    <template #title>\n      <div class=\"cancellation\">\n        <Icon icon=\"ant-design:warning-outlined\" style=\"font-size: 20px;color: red\"/>\n        退出租户 {{myTenantInfo.name}}\n      </div>\n    </template>\n    <a-form :model=\"formCancelState\" ref=\"cancelTenantRef\">\n      <a-form-item name=\"tenantName\">\n        <a-row :span=\"24\" style=\"padding: 20px 20px 0;font-size: 13px\">\n          <a-col :span=\"24\">\n            请输入租户名称\n          </a-col>\n          <a-col :span=\"24\" style=\"margin-top: 10px\">\n            <a-input v-model:value=\"formCancelState.tenantName\" @change=\"tenantNameChange\"/>\n          </a-col>\n        </a-row>\n      </a-form-item>\n      <a-form-item name=\"loginPassword\">\n        <a-row :span=\"24\" style=\"padding: 0 20px;font-size: 13px\">\n          <a-col :span=\"24\">\n            请输入您的登录密码\n          </a-col>\n          <a-col :span=\"24\" style=\"margin-top: 10px\">\n            <a-input-password v-model:value=\"formCancelState.loginPassword\" />\n          </a-col>\n        </a-row>\n      </a-form-item>\n    </a-form>\n    <template #footer>\n      <a-button type=\"primary\" @click=\"handleOutClick\" :disabled=\"outBtnDisabled\">确定</a-button>\n      <a-button @click=\"handleCancelOutClick\">取消</a-button>\n    </template>\n  </a-modal>\n\n  <a-modal\n    title=\"变更拥有者\"\n    v-model:open=\"owenVisible\"\n    width=\"800\"\n    destroy-on-close\n    :cancelButtonProps=\"{display:'none'}\"\n    @ok=\"changeOwen\">\n      <div style=\"padding: 20px\">\n        <a-row :span=\"24\">\n          <div class=\"change-owen\">\n            只有变更拥有着之后,才能退出\n          </div>\n        </a-row>\n        <a-row :span=\"24\" style=\"margin-top: 10px\">\n          <UserSelect v-model:value=\"tenantOwen\" izExcludeMy/>\n        </a-row>\n      </div>\n  </a-modal>\n  \n  <!-- begin 我的受邀信息 -->\n  <a-modal title=\"我的受邀信息\" v-model:open=\"invitedVisible\" :footer=\"null\">\n      <a-row :span=\"24\" class=\"invited-row\">\n        <a-col :span=\"16\">\n          组织\n        </a-col>\n        <a-col :span=\"8\">\n          操作\n        </a-col>\n      </a-row>\n    <a-row :span=\"24\" class=\"invited-row-list\" v-for=\"item in invitedList\">\n      <a-col :span=\"16\">\n        {{item.name}}\n      </a-col>\n      <a-col :span=\"8\">\n        <span class=\"common\" @click=\"joinOrRefuseClick(item.tenantUserId,'1')\">加入</span>\n        <span class=\"common refuse\" @click=\"joinOrRefuseClick(item.tenantUserId,'4')\">拒绝</span>\n      </a-col>\n    </a-row>\n    <div style=\"height: 20px\"></div>\n  </a-modal>\n  <!-- end 我的受邀信息 -->\n</template>\n\n<script lang=\"ts\" name=\"tenant-setting\" setup>\nimport { onMounted, ref, unref } from \"vue\";\nimport { getTenantListByUserId, cancelApplyTenant, exitUserTenant, changeOwenUserTenant, agreeOrRefuseJoinTenant } from \"./UserSetting.api\";\nimport { useUserStore } from \"/@/store/modules/user\";\nimport { CollapseContainer } from \"/@/components/Container\";\nimport { getFileAccessHttpUrl, userExitChangeLoginTenantId } from \"/@/utils/common/compUtils\";\nimport headerImg from \"/@/assets/images/header.jpg\";\nimport {useMessage} from \"/@/hooks/web/useMessage\";\nimport { initDictOptions } from '/@/utils/dict';\nimport { uniqWith } from 'lodash-es';\nimport { Modal } from 'ant-design-vue';\nimport UserSelect from '/@/components/Form/src/jeecg/components/userSelect/index.vue';\nimport {router} from \"/@/router\";\nimport { useDesign } from '/@/hooks/web/useDesign';\n\nconst { prefixCls } = useDesign('j-user-tenant-setting-container');\n//数据源\nconst dataSource = ref<any>([]);\nconst userStore = useUserStore();\n\n//数据源\nconst { createMessage } = useMessage();\n//部门字典\nconst departOptions = ref<any>([]);\n//租户编辑是或否隐藏\nconst tenantVisible = ref<boolean>(false);\n//用户数据\nconst userData = ref<any>([]);\n//用户\nconst userDetail = ref({\n  realname: userStore.getUserInfo.realname,\n  workNo: userStore.getUserInfo.workNo,\n  orgCodeTxt: userStore.getUserInfo.orgCodeTxt,\n  postText: userStore.getUserInfo.postText,\n});\n/**\n * 初始化租户数据\n */\n  async function initDataSource() {\n  //获取用户数据\n    // 代码逻辑说明: [QQYUN-5608]用户导入后，邀请后,被导入人同意即可,新增被邀信息-----------\n    getTenantListByUserId({ userTenantStatus: '1,3,5' }).then((res) => {\n      if (res.success) {\n        if(res.result && res.result.length>0){\n          let result = res.result;\n          //存放正常和审核中的数组\n          let normal:any = [];\n          //存放受邀的信息\n          let invited:any = [];\n          for (let i = 0; i < result.length; i++) {\n            let status = result[i].userTenantStatus;\n            //状态为邀请的放入invited数组中\n            if(status === '5'){\n              invited.push(result[i]);\n            }\n            normal.push(result[i]);\n          }\n          dataSource.value = normal;\n          invitedList.value = invited;\n          invitedCount.value = invited.length;\n        }else{\n          setInitedValue();\n        }\n      } else {\n        setInitedValue();\n      }\n    });\n  }\n  function setInitedValue() {\n    dataSource.value = [];\n    invitedList.value = [];\n    invitedCount.value = 0;  \n  }\n\n  /**\n   * 复制门户\n   * @param value\n   */\n  function copyClick(value) {\n    // 创建input元素\n    const el = document.createElement('input');\n    // 给input元素赋值需要复制的文本\n    el.setAttribute('value', value);\n    // 将input元素插入页面\n    document.body.appendChild(el);\n    // 选中input元素的文本\n    el.select();\n    // 复制内容到剪贴板\n    document.execCommand('copy');\n    // 删除input元素\n    document.body.removeChild(el);\n    createMessage.success('复制成功');\n  };\n\n  /**\n   * 取消申请\n   * @param id\n   */\n  function cancelApplyClick(id) {\n    Modal.confirm({\n      title: '取消申请',\n      content: '是否取消申请',\n      okText: '确认',\n      cancelText: '取消',\n      onOk: () => {\n        cancelApplyTenant({ tenantId: id }).then((res) => {\n          if (res.success) {\n            createMessage.success('取消申请成功');\n            initDataSource();\n          }else{\n            createMessage.warning(res.message);\n          }\n        }).catch((e)=>{\n           createMessage.warning(e.message);\n        });\n      },\n    });\n  };\n\n  /**\n   * 展开关闭事件\n   */\n  function drownClick(value) {\n    if (!value.show) {\n      value.show = true;\n    } else {\n      value.show = false;\n    }\n  };\n\n  /**\n   * 获取部门文本\n   * @param value\n   */\n  function getDepartText(value) {\n    let arr = departOptions.value.filter((item) => {\n      item.value == value;\n    });\n    if (arr && arr.length > 0) {\n      return arr[0].label;\n    }\n    return '未填写';\n  };\n\n  /**\n   * 底部文本点击事件\n   */\n  function footerClick(type, item) {\n    userData.value = item;\n    //编辑组织名片\n    if (type === 'editTenant') {\n      tenantVisible.value = true;\n    }else if(type === 'exitTenant'){\n      //退出租户\n      formCancelState.value = {loginPassword:'', tenantName:''};\n      outBtnDisabled.value = true;\n      cancelVisible.value = true;\n      myTenantInfo.value = item;\n    }\n  }\n\n  //退出租户弹窗\n  const cancelVisible = ref<boolean>(false);\n  //退出租户数据\n  const formCancelState = ref<any>({});\n  //租户数据\n  const myTenantInfo = ref<any>({});\n  //注销租户弹窗确定按钮是否可以点击\n  const outBtnDisabled = ref<boolean>(true);\n  //拥有者\n  const tenantOwen = ref<string>('');\n  //拥有者弹窗\n  const owenVisible = ref<boolean>(false);\n\n  /**\n   * 租户名称值改变事件\n   */\n  function tenantNameChange() {\n    let name = unref(myTenantInfo).name;\n    let tenantName = unref(formCancelState).tenantName;\n    if(name === tenantName){\n      outBtnDisabled.value = false;\n    }else{\n      outBtnDisabled.value = true;\n    }\n  }\n\n  /**\n   * 退出确定点击事件\n   */\n  async function handleOutClick() {\n    if(!unref(formCancelState).loginPassword){\n        createMessage.warning(\"请输入登录密码\");\n        return;\n    }\n    console.log(\"myTenantInfo::::\",myTenantInfo);\n    await exitUserTenant({ id: unref(myTenantInfo).tenantUserId, loginPassword: unref(formCancelState).loginPassword }).then((res) => {\n      if (res.success) {\n        createMessage.success(res.message);\n        cancelVisible.value = false;\n        initDataSource();\n        // 代码逻辑说明: 【QQYUN-6822】7、登录拥有多个租户身份的用户，退出租户，只剩下一个租户后显示为空---\n        userExitChangeLoginTenantId(unref(myTenantInfo).tenantUserId);\n      } else {\n        if (res.message === 'assignedOwen') {\n          //需要指定变更者\n          owenVisible.value = true;\n          cancelVisible.value = false;\n        // 代码逻辑说明: 【QQYUN-5270】名下租户全部退出后，再次登录，提示租户全部冻结。拥有者提示前往注销------------\n        }else if(res.message === 'cancelTenant'){\n          cancelVisible.value = false;\n          let fullPath = router.currentRoute.value.fullPath;\n          Modal.confirm({\n            title: '您是该组织的拥有者',\n            content: '该组织下没有其他成员，需要您前往注销',\n            okText: '前往注销',\n            okType: 'danger',\n            cancelText: '取消',\n            onOk: () => {\n              if(fullPath === '/system/usersetting'){\n                return;\n              }\n              router.push('/myapps/settings/organization/organMessage/'+unref(myTenantInfo).tenantUserId)\n            }\n          })\n        } else {\n          createMessage.warning(res.message);\n        }\n      }\n    }).catch((res) => {\n      createMessage.warning(res.message);\n    })\n  }\n\n  /**\n   * 退出租户取消事件\n   */\n  function handleCancelOutClick() {\n    cancelVisible.value = false;\n    outBtnDisabled.value = true;\n  }\n\n  /**\n   * 变更拥有着\n   */\n  function changeOwen() {\n    if(!unref(tenantOwen)){\n      createMessage.warning(\"请选择变更拥有者\");\n      return;\n    }\n    changeOwenUserTenant({ userId:unref(tenantOwen), tenantId:unref(myTenantInfo).tenantUserId }).then((res) =>{\n      if(res.success){\n        createMessage.success(res.message);\n        initDataSource();\n        // 代码逻辑说明: 【QQYUN-6822】7、登录拥有多个租户身份的用户，退出租户，只剩下一个租户后显示为空---\n        userExitChangeLoginTenantId(unref(myTenantInfo).tenantUserId);\n      } else {\n        createMessage.warning(res.message);\n      }\n    })\n  }\n  \n  //邀请数量\n  const invitedCount = ref<number>(0);\n  //受邀信息\n  const invitedList = ref<any>([]);\n  //受邀信息弹窗\n  const invitedVisible = ref<boolean>(false);\n\n  /**\n   * 受邀信息点击事件\n   */\n  function invitedClick() {\n    invitedVisible.value = true;\n  }\n\n  /**\n   * 加入组织点击事件\n   */\n  async function joinOrRefuseClick(tenantId,status) {\n    await agreeOrRefuseJoinTenant( { tenantId:Number.parseInt(tenantId), status:status });\n    initDataSource();\n  }\n\n  onMounted(() => {\n    initDataSource();\n  });\n\n</script>\n\n<style lang=\"less\" scoped>\n.tenant-padding{\n  padding: 30px 40px 0 20px;\n}\n.my-tenant{\n  display: flex;\n  font-size: 17px;\n  font-weight: 700!important;\n  /*begin 兼容暗夜模式*/\n  color: @text-color;\n  /*end 兼容暗夜模式*/\n  margin-bottom: 20px;\n  .invited{\n    font-size: 14px;\n    text-align: right;\n    cursor: pointer;\n  }\n}\n.tenant-list{\n  box-sizing: border-box;\n  flex: 1;\n  min-height: 0;\n  overflow-x: hidden;\n}\n.tenant-list-item{\n  /*begin 兼容暗夜模式*/\n  border: 1px solid @border-color-base;\n  /*end 兼容暗夜模式*/\n  box-sizing: border-box;\n  display: flex;\n  flex-direction: column;\n  margin-bottom: 20px;\n  overflow: hidden;\n  padding: 0 25px;\n  width: 100%;\n  .item-name{\n    align-items: center;\n    box-sizing: border-box;\n    display: flex;\n    justify-content: space-between;\n    padding: 14px 0;\n    cursor: pointer;\n    font-size:17px;\n    /*begin 兼容暗夜模式*/\n    color: @text-color;\n    /*end 兼容暗夜模式*/\n    font-weight: 700!important;\n  }\n}\n.tenant-list-item:hover{\n  box-shadow: 0 1px 2px 0 rgba(0,0,0,0.2);\n}\n.pointer {\n  cursor: pointer;\n}\n\n.examine {\n  color: #2c9cff;\n  font-size: 13px;\n}\n\n.cancel-apply {\n  margin-left: 24px;\n  color: red;\n  font-size: 13px;\n}\n\n.item-content {\n  transition: ease-in 2s;\n\n  .content-box {\n    /*begin 兼容暗夜模式*/\n    border-top: 1px solid @border-color-base;\n    /*end 兼容暗夜模式*/\n    box-sizing: border-box;\n    display: flex;\n    padding: 24px 0;\n  }\n\n  .content-name {\n    /*begin 兼容暗夜模式*/\n    color: @text-color;\n    /*end 兼容暗夜模式*/\n    text-align: center;\n    width: 100px;\n    font-size: 13px;\n  }\n\n  .content-desc {\n    flex: 1;\n    min-width: 0;\n  }\n\n  .content-des-text {\n    /*begin 兼容暗夜模式*/\n    color: @text-color;\n    /*end 兼容暗夜模式*/\n    text-align: left;\n    width: 76px;\n    font-size: 13px;\n  }\n}\n\n.flex-flow {\n  display: flex;\n  min-width: 0;\n}\n\n.flex-center {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  min-width: 0;\n}\n\n.footer-box {\n  /*begin 兼容暗夜模式*/\n  border-top: 1px solid @border-color-base;\n  /*end 兼容暗夜模式*/\n  box-sizing: border-box;\n  display: flex;\n  padding: 24px 0;\n  color: #757575;\n}\n\n.margin-right40 {\n  margin-right: 40px;\n}\n\n/*begin 兼容暗夜模式*/\n.font-color333 {\n  color: @text-color;\n  font-weight: normal;\n}\n\n.font-color9e {\n  color: @text-color;\n}\n\n.font-color75 {\n  color: @text-color;\n}\n/*end 兼容暗夜模式*/\n\n.font-size13 {\n  font-size: 13px;\n}\n\n.footer-icon {\n  font-size: 13px !important;\n  margin-right: 13px;\n  position: relative;\n  top: 0px;\n}\n:deep(.edit-tenant-setting) {\n  color: #0a8fe9;\n}\n.margin-top6 {\n  margin-top: 6px;\n}\n.margin-bottom-16 {\n  margin-bottom: 16px;\n}\n.item-right {\n  align-items: center;\n  display: flex;\n  .buy-margin{\n    margin-left: 10px;\n    width: 66px;\n    border-radius: 20px;\n    background: rgba(255, 154, 0, 1);\n    height: 28px;\n    line-height: 28px;\n    cursor: pointer;\n    text-align: center;\n    span{\n      font-size: 14px;\n      font-weight: 400;\n      color: #ffffff;\n    }\n  }\n  .ordinary-user{\n    margin-left: 10px;\n    width: 66px;\n    span{\n      font-size: 14px;\n      font-weight: 400;\n      color: #9e9e9e;\n    }\n  }\n}\n.tenant-title {\n  align-items: center;\n  box-sizing: border-box;\n  display: flex;\n  justify-content: space-between;\n  padding: 24px 0;\n  .vip-message{\n    display: flex;\n    .vip-message-margin{\n      margin-right: 20px;\n    }\n  }\n}\n.change-owen{\n  font-size: 14px;\n  font-weight: 700;\n}\n// 代码逻辑说明: 被邀弹窗样式------------\n.approved-count{\n  background: #ffd2d2;\n  border-radius: 19px;\n  color: red;\n  display: inline-block;\n  font-weight: 500;\n  height: 19px;\n  line-height: 18px;\n  margin-left: 8px;\n  min-width: 19px;\n  padding: 0 6px;\n  text-align: center;\n}\n\n.invited-row{\n  padding: 10px 34px;\n}\n.invited-row-list{\n  padding: 0px 34px;\n  .common{\n    color: #1e88e5;\n    cursor: pointer;\n  }\n  .refuse{\n    color: red;\n    margin-left: 20px;\n  }\n}\n.pointer{\n  cursor: pointer;\n}\n</style>\n\n<style lang=\"less\">\n  // 代码逻辑说明: [issues/563]暗色主题部分失效\n@prefix-cls: ~'@{namespace}-j-user-tenant-setting-container';\n/*begin 兼容暗夜模式*/\n.@{prefix-cls} {\n\n  .my-tenant{\n    color: @text-color;\n  }\n\n  .tenant-list-item{\n    border: 1px solid @border-color-base;\n\n    .item-name{\n      color: @text-color;\n    }\n  }\n\n  .item-content {\n\n    .content-box {\n      border-top: 1px solid @border-color-base;\n    }\n\n    .content-name {\n      color: @text-color;\n    }\n\n    .content-des-text {\n      color: @text-color;\n    }\n  }\n  .footer-box {\n    border-top: 1px solid @border-color-base;\n  }\n\n  /*begin 兼容暗夜模式*/\n  .font-color333 {\n    color: @text-color;\n  }\n\n  .font-color9e {\n    color: @text-color;\n  }\n\n  .font-color75 {\n    color: @text-color;\n  }\n}\n/*end 兼容暗夜模式*/\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/usersetting/UserSetting.api.ts",
    "content": "import { defHttp } from \"/@/utils/http/axios\";\n\nenum Api {\n  userEdit='/sys/user/login/setting/userEdit',\n  getUserData='/sys/user/login/setting/getUserData',\n  queryNameByCodes='/sys/position/queryByCodes',\n  updateMobile='/sys/user/updateMobile',\n  updateUserPassword='/sys/user/passwordChange',\n  getTenantListByUserId = '/sys/tenant/getTenantListByUserId',\n  cancelApplyTenant = '/sys/tenant/cancelApplyTenant',\n  exitUserTenant = '/sys/tenant/exitUserTenant',\n  changeOwenUserTenant = '/sys/tenant/changeOwenUserTenant',\n  getThirdAccountByUserId = '/sys/thirdApp/getThirdAccountByUserId',\n  bindThirdAppAccount = '/sys/thirdApp/bindThirdAppAccount',\n  deleteThirdAccount = '/sys/thirdApp/deleteThirdAccount',\n  agreeOrRefuseJoinTenant = '/sys/tenant/agreeOrRefuseJoinTenant',\n  //更改手机号\n  changePhone = '/sys/user/changePhone',\n  //用户注销\n  userLogOff = '/sys/user/userLogOff',\n  //没有绑定手机号用的修改密码请求地址\n  updatePasswordNotBindPhone = '/sys/user/updatePasswordNotBindPhone',\n}\n\n/**\n * 用户编辑\n * @param params\n */\nexport const userEdit = (params) => {\n  return defHttp.post({ url: Api.userEdit, params },{ isTransformResponse:false });\n}\n\n/**\n * 获取用户信息\n * @param params\n */\nexport const getUserData = () => {\n  return defHttp.get({ url: Api.getUserData },{ isTransformResponse:false });\n}\n\n/**\n * 获取多个职务信息\n * @param params\n */\nexport const queryNameByCodes = (params) => {\n  return defHttp.get({ url: Api.queryNameByCodes, params },{isTransformResponse:false});\n}\n\n/**\n * 修改手机号\n * @param params\n */\nexport const updateMobile = (params) => {\n  return defHttp.put({ url: Api.updateMobile, params },{isTransformResponse:false});\n}\n\n/**\n * 修改密码\n * @param params\n */\nexport const updateUserPassword = (params) => {\n  return defHttp.get({ url: Api.updateUserPassword, params },{isTransformResponse:false});\n}\n\n/**\n * 修改密码\n * @param params\n */\nexport const updatePasswordNotBindPhone = (params) => {\n  return defHttp.put({ url: Api.updatePasswordNotBindPhone, params },{ isTransformResponse:false, joinParamsToUrl: true });\n}\n\n/**\n * 通过用户id获取租户列表\n * @param params\n */\nexport const getTenantListByUserId = (params) => {\n  return defHttp.get({ url: Api.getTenantListByUserId, params }, { isTransformResponse: false });\n};\n\n/**\n * 取消申请\n * @param params\n */\nexport const cancelApplyTenant = (params) => {\n  return defHttp.put({ url: Api.cancelApplyTenant, data: params }, { joinParamsToUrl: true, isTransformResponse: false });\n};\n\n/**\n * 用户退出租户\n * @param params\n */\nexport const exitUserTenant = (params)=>{\n  return defHttp.delete({ url: Api.exitUserTenant, params },{ isTransformResponse: false, joinParamsToUrl: true });\n}\n\n/**\n * 变更租户拥有者\n * @param params\n */\nexport const changeOwenUserTenant = (params)=>{\n  return defHttp.post({ url: Api.changeOwenUserTenant, params },{ isTransformResponse: false, joinParamsToUrl: true });\n}\n\n/**\n * 获取账号第三方信息通过第三方类型\n * @param params\n */\nexport const getThirdAccountByUserId = (params) => {\n  return defHttp.get({ url: Api.getThirdAccountByUserId, params }, { isTransformResponse: false });\n};\n\n/**\n * 根据第三方uuid绑定账号\n * @param params\n */\nexport const bindThirdAppAccount = (params) => {\n  return defHttp.post({ url: Api.bindThirdAppAccount, params }, { isTransformResponse: false, joinParamsToUrl: true });\n};\n\n/**\n * 根据第三方uuid绑定账号\n * @param params\n */\nexport const deleteThirdAccount = (params) => {\n  return defHttp.delete({ url: Api.deleteThirdAccount, params }, { isTransformResponse:false, joinParamsToUrl: true });\n};\n\n/**\n * 同意和拒绝加入租户\n * @param params\n */\nexport const agreeOrRefuseJoinTenant = (params) => {\n  return defHttp.put({ url: Api.agreeOrRefuseJoinTenant, params },{ joinParamsToUrl: true });\n};\n\n/**\n * 更改手机号\n * @param params\n */\nexport const changePhone = (params) => {\n  return defHttp.put({ url: Api.changePhone, params },{ joinParamsToUrl: true, isTransformResponse: false });\n};\n\n/**\n * 用户注销\n * @param params\n */\nexport const userLogOff = (params) => {\n  return defHttp.put({ url: Api.userLogOff, params },{ isTransformResponse:false });\n}\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/usersetting/UserSetting.data.ts",
    "content": "import { FormSchema } from '/@/components/Form/index';\nimport { rules } from '/@/utils/helper/validator';\nimport anquan1 from './icons/anquan1.png'\nimport anquan2 from './icons/anquan2.png'\nimport app1 from './icons/app1.png'\nimport app2 from './icons/app2.png'\nimport geren1 from './icons/geren1.png'\nimport geren2 from './icons/geren2.png'\nimport zuhu1 from './icons/zuhu1.png'\nimport zuhu2 from './icons/zuhu2.png'\nimport { calculateFileSize } from \"/@/utils/common/compUtils\";\nimport { BasicColumn } from \"@/components/Table\";\n\nexport interface ListItem {\n  key: string;\n  title: string;\n  description: string;\n  extra?: string;\n  avatar?: string;\n  color?: string;\n}\n\n// tab的list\nexport const settingList = [\n  {\n    key: '1',\n    name: '个人信息',\n    component: 'BaseSetting',\n    icon:'ant-design:user-outlined',\n    img1: geren1,\n    img2: geren2,\n  },\n  {\n    key: '2',\n    name: '我的组织',\n    component: 'TenantSetting',\n    isSlot:false,\n    icon:'ant-design:team-outlined',\n    img1: zuhu1,\n    img2: zuhu2,\n  },\n   {\n    key: '3',\n    name: '账号安全',\n    component: 'AccountSetting',\n    icon:'ant-design:lock-outlined',\n    img1: anquan1,\n    img2: anquan2,\n  },\n  {\n    key: '4',\n    name: '第三方APP',\n    component: 'WeChatDingSetting',\n    icon: 'ant-design:contacts-outlined',\n    img1: app1,\n    img2: app2,\n  },\n];\n\n\n/**\n * 用户表单\n */\nexport const formSchema: FormSchema[] = [\n  {\n    field: 'realname',\n    component: 'Input',\n    label: '姓名',\n    colProps: { span: 24 },\n    required:true\n  },\n  {\n    field: 'birthday',\n    component: 'DatePicker',\n    label: '生日',\n    colProps: { span: 24 },\n    componentProps:{\n      showTime:false,\n      valueFormat:\"YYYY-MM-DD\",\n      getPopupContainer: () => document.body,\n    },\n  },\n  {\n    field: 'sex',\n    component: 'RadioGroup',\n    label: '性别',\n    colProps: { span: 24 },\n    componentProps:{\n      options: [\n        {\n          label: '男',\n          value: 1,\n        },\n        {\n          label: '女',\n          value: 2,\n        },\n      ],\n    }\n  },\n  {\n    field: 'relTenantIds',\n    component: 'JDictSelectTag',\n    label: '租户',\n    colProps: { span: 24 },\n    componentProps:{\n      mode:'multiple',\n      dictCode:'sys_tenant,name,id',\n      disabled:true\n    }\n  },\n  {\n    field: 'post',\n    component: 'JDictSelectTag',\n    label: '职位',\n    colProps: { span: 24 },\n    componentProps:{\n      mode:'multiple',\n      dictCode:'sys_position,name,id',\n      disabled:true\n    }\n  },\n  {\n    label: '',\n    field: 'id',\n    component: 'Input',\n    show: false,\n  },\n]\n\n//密码弹窗\nexport const formPasswordSchema: FormSchema[] = [\n  {\n    label: '用户账号',\n    field: 'username',\n    component: 'Input',\n    componentProps: { readOnly: true },\n  },\n  {\n    label: '旧密码',\n    field: 'oldpassword',\n    component: 'InputPassword',\n    required: true,\n  },\n  {\n    label: '新密码',\n    field: 'password',\n    component: 'StrengthMeter',\n    componentProps: {\n      placeholder: '请输入新密码',\n    },\n    rules: [\n      {\n        required: true,\n        message: '请输入新密码',\n      },\n    ],\n  },\n  {\n    label: '确认新密码',\n    field: 'confirmpassword',\n    component: 'InputPassword',\n    dynamicRules: ({ values }) => rules.confirmPassword(values, true),\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/usersetting/UserSetting.vue",
    "content": "<template>\n  <ScrollContainer>\n    <div ref=\"wrapperRef\" class=\"user-account-setting\" :class=\"[prefixCls]\">\n      <Tabs tab-position=\"left\" :tabBarStyle=\"tabBarStyle\" @tabClick=\"componentClick\" v-model:activeKey=\"activeKey\">\n        <template v-for=\"item in componentList\" :key=\"item.key\">\n          <TabPane>\n            <template #tab>\n                <span style=\"display:flex;align-items: center;cursor: pointer\">\n                  <!--<Icon :icon=\"item.icon\" class=\"icon-font-color\"/>-->\n                  <span style=\"width: 30px\">\n                    <img v-if=\"activeKey === item.key || isDark\" :src=\"item.img2\" style=\"height: 18px\"/>\n                    <img v-else :src=\"item.img1\" style=\"height: 16px\"/>\n                  </span>\n                  {{item.name}}\n                </span>\n            </template>\n            <component :is=\"item.component\" v-if=\"activeKey === item.key && !item.isSlot\" />\n            <slot name=\"component\" v-if=\"activeKey === item.key && item.isSlot\" />\n          </TabPane>\n        </template>\n      </Tabs>\n    </div>\n  </ScrollContainer>\n</template>\n\n<script lang=\"ts\">\nimport { ref, defineComponent, onMounted, provide, computed } from \"vue\";\nimport { Tabs } from \"ant-design-vue\";\nimport { ScrollContainer } from \"/@/components/Container\";\nimport { settingList } from \"./UserSetting.data\";\nimport BaseSetting from \"./BaseSetting.vue\";\nimport AccountSetting from \"./AccountSetting.vue\";\nimport TenantSetting from \"./TenantSetting.vue\";\nimport WeChatDingSetting from './WeChatDingSetting.vue';\nimport { useRouter } from \"vue-router\";\nimport { useDesign } from '/@/hooks/web/useDesign';\nimport {useRootSetting} from \"/@/hooks/setting/useRootSetting\";\nimport {ThemeEnum} from \"/@/enums/appEnum\";\nexport default defineComponent({\n  components: {\n    ScrollContainer,\n    Tabs,\n    TabPane: Tabs.TabPane,\n    BaseSetting,\n    AccountSetting,\n    TenantSetting,\n    WeChatDingSetting,\n  },\n  props:{\n    componentList:{\n      type:Array,\n      default:settingList\n    }\n  },\n  setup() {\n    const { prefixCls } = useDesign('user-account-setting-container');\n    const { getDarkMode} = useRootSetting();\n    const isDark = computed(() => getDarkMode.value === ThemeEnum.DARK);\n    const activeKey = ref<string>('1');\n    //是否为vip\n    const showVip = ref<boolean>(false);\n    //vip编码\n    const vipCode = ref<string>('');\n    const router = useRouter();\n    const componentList = computed(()=>{\n      if(showVip.value){\n        return settingList;\n      }\n      return settingList.filter((item)=> item.component != 'MyVipSetting');\n    })\n\n    /**\n     * 组件标题点击事件,解决第二次不加载数据\n     * @param key\n     */\n    function componentClick(key) {\n      activeKey.value = key;\n    }\n\n    function goToMyTeantPage(){\n      //update-begin---author:wangshuai ---date:20230721  for：【QQYUN-5726】邀请加入租户加个按钮直接跳转过去------------\n      //如果请求参数包含我的租户，直接跳转过去\n      let query = router.currentRoute.value.query;\n      if(query && query.page === 'tenantSetting'){\n        activeKey.value = \"2\";\n      }\n      //update-end---author:wangshuai ---date:20230721  for：【QQYUN-5726】邀请加入租户加个按钮直接跳转过去------------\n    }\n    \n    onMounted(()=>{\n      goToMyTeantPage();\n    })\n    \n    return {\n      prefixCls,\n      settingList,\n      tabBarStyle: {\n        width: \"220px\",\n        marginBottom: \"200px\"\n      },\n      componentClick,\n      activeKey,\n      isDark\n    };\n  }\n});\n</script>\n<style lang=\"less\" scoped>\n.user-account-setting {\n  margin: 20px;\n\n  .base-title {\n    padding-left: 0;\n  }\n\n  //tabs弹窗左边样式\n  :deep(.ant-tabs-nav){\n    height: 260px;\n  }\n  //tabs弹窗右边边样式\n  :deep(.ant-tabs-content-holder){\n    position: relative;\n    left: 12px;\n    height: auto !important;\n  }\n}\n//tab点击样式\n:deep(.ant-tabs-tab-active){\n  border-radius: 0 20px 20px 0;\n  background-color: #1294f7!important;\n  color: #fff!important;\n  .icon-font-color{\n    color: #fff;\n  }\n}\n:deep(.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn){\n  color: white !important;\n}\n:deep(.ant-tabs-ink-bar){\n  visibility: hidden;\n}\n:deep(.ant-tabs-nav-list){\n  padding-top:14px;\n  padding-right:14px;\n}\n\n.vip-height{\n  //tabs弹窗左边样式\n  :deep(.ant-tabs-nav){\n    height: 310px !important;\n  }\n}\n.vip-background{\n  :deep(.ant-tabs-content-holder){\n    background: transparent;\n  }\n  :deep(.ant-tabs-tabpane){\n    padding-left: 0 !important;\n  }\n}\n</style>\n\n<style lang=\"less\">\n@prefix-cls: ~'@{namespace}-user-account-setting-container';\n\n.@{prefix-cls} {\n  .ant-tabs-tab-active {\n    background-color: @item-active-bg;\n  }\n  //tabs弹窗左边样式\n .ant-tabs-nav{\n    background-color: @component-background;\n  }\n  //tabs弹窗右边边样式\n  .ant-tabs-content-holder{\n    background: @component-background;\n  }\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/usersetting/WeChatDingSetting.vue",
    "content": "<template>\n  <div :class=\"[`${prefixCls}`]\">\n    <div class=\"my-account\">第三方APP</div>\n<!--    <div class=\"account-row-item\">-->\n<!--      <div class=\"account-label gray-75\">企业微信绑定</div>-->\n<!--      <span>-->\n<!--        <icon-font :style=\"!bindEnterpriseData.sysUserId ? { color: '#9e9e9e' } : { color: '#0082EF' }\" class=\"item-icon\" type=\"icon-qiyeweixin3\" />-->\n<!--        <span class=\"gray-75\" style=\"margin-left: 12px\">企业微信</span>-->\n<!--        <span class=\"gray-75\" style=\"margin-left: 8px\" v-if=\"bindEnterpriseData.realname\">{{ '已绑定：' + bindEnterpriseData.realname }}</span>-->\n<!--        <span class=\"blue-e5 pointer\" style=\"margin-left: 24px\" @click=\"wechatEnterpriseBind\">{{-->\n<!--          !bindEnterpriseData.sysUserId ? '绑定' : '解绑'-->\n<!--        }}</span>-->\n<!--      </span>-->\n<!--    </div>-->\n    <div class=\"account-row-item\">\n      <div class=\"account-label gray-75\">钉钉绑定</div>\n      <span>\n        <DingtalkCircleFilled :style=\"!bindDingData.sysUserId ? { color: '#9e9e9e' } : { color: '#007FFF' }\" class=\"item-icon\" />\n        <span class=\"gray-75\" style=\"margin-left: 12px\">钉钉</span>\n        <span class=\"gray-75\" style=\"margin-left: 8px\" v-if=\"bindDingData.realname\">{{ '已绑定：' + bindDingData.realname }}</span>\n        <span class=\"blue-e5 pointer\" style=\"margin-left: 24px\" @click=\"dingDingBind\">{{ !bindDingData.sysUserId ? '绑定' : '解绑' }}</span>\n      </span>\n    </div>\n    <div class=\"account-row-item\">\n      <div class=\"account-label gray-75\">账号绑定</div>\n      <span>\n        <WechatFilled :style=\"!bindWechatData.sysUserId ? { color: '#9e9e9e' } : { color: '#1ec563' }\" class=\"item-icon\" />\n        <span class=\"gray-75\" style=\"margin-left: 12px\">微信</span>\n        <span class=\"gray-75\" style=\"margin-left: 8px\" v-if=\"bindWechatData.realname\">{{ '已绑定：' + bindWechatData.realname }}</span>\n        <span class=\"blue-e5 pointer\" style=\"margin-left: 24px\" @click=\"wechatBind\">{{ !bindWechatData.sysUserId ? '绑定' : '解绑' }}</span>\n      </span>\n    </div>\n  </div>\n</template>\n<script lang=\"ts\" setup name=\"we-chat-ding-setting\">\n  import { onMounted, ref, reactive, unref } from 'vue';\n  import { CollapseContainer } from '/@/components/Container';\n  import { bindThirdAppAccount, deleteThirdAccount, getThirdAccountByUserId } from './UserSetting.api';\n  import { useUserStore } from '/@/store/modules/user';\n  import { useModal } from '/@/components/Modal';\n  import { DingtalkCircleFilled, createFromIconfontCN, WechatFilled } from '@ant-design/icons-vue';\n  import { useGlobSetting } from '/@/hooks/setting';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { Modal } from 'ant-design-vue';\n  import { useDesign } from '/@/hooks/web/useDesign';\n\n  const { prefixCls } = useDesign('j-user-tenant-setting-container');\n\n  const IconFont = createFromIconfontCN({\n    scriptUrl: '//at.alicdn.com/t/font_2316098_umqusozousr.js',\n  });\n  const userStore = useUserStore();\n\n  //绑定微信的数据\n  const bindWechatData = ref<any>({});\n  //绑定钉钉的数据\n  const bindDingData = ref<any>({});\n  //绑定企业微信的数据\n  const bindEnterpriseData = ref<any>({});\n\n  const glob = useGlobSetting();\n  //第三方类型\n  const thirdType = ref('');\n  //第三方用户UUID\n  const thirdUserUuid = ref('');\n  //第三方详情\n  const thirdDetail = ref<any>({});\n  const { createMessage } = useMessage();\n  //windows对象，用于关闭窗口事件\n  const windowsIndex = ref<any>('');\n  //窗口监听事件\n  const receiveMessage = ref<any>('');\n  \n  /**\n   * 初始化钉钉和企业微信数据\n   */\n  async function initUserDetail() {\n    let values = await getThirdAccountByUserId({ thirdType: 'wechat_open,dingtalk,wechat_enterprise' });\n    bindWechatData.value = \"\";\n    bindDingData.value = \"\";\n    bindEnterpriseData.value = \"\";\n    if (values && values.result) {\n      let result = values.result;\n      for (let i = 0; i < result.length; i++) {\n        setThirdDetail(result[i]);\n      }\n    }\n  }\n\n  /**\n   * 企业微信绑定解绑事件\n   */\n  function wechatEnterpriseBind() {\n    console.log('企业微信绑定解绑事件');\n    let data = unref(bindEnterpriseData);\n    if (!data.sysUserId) {\n      onThirdLogin('wechat_enterprise');\n    }else{\n      deleteAccount({ sysUserId: data.sysUserId, id: data.id }, '企业微信');\n    }\n  }\n\n  /**\n   * 钉钉绑定解绑事件\n   */\n  function dingDingBind() {\n    let data = unref(bindDingData);\n    if (!data.sysUserId) {\n      onThirdLogin('dingtalk');\n    } else {\n      deleteAccount({ sysUserId: data.sysUserId, id: data.id }, '钉钉');\n    }\n    console.log('钉钉绑定解绑事件');\n  }\n\n  /**\n   * 微信绑定\n   */\n  function wechatBind() {\n    let data = unref(bindWechatData);\n    if (!data.sysUserId) {\n      onThirdLogin('wechat_open');\n    }else{\n      deleteAccount({ sysUserId: data.sysUserId, id: data.id }, '微信');\n    }\n  }\n\n  /**\n   * 第三方登录\n   * @param source\n   */\n  function onThirdLogin(source) {\n    let url = `${glob.uploadUrl}/sys/thirdLogin/render/${source}`;\n    //窗口为不空关闭\n    console.log(\"unref(windowsIndex) ::\",unref(windowsIndex))\n    if(unref(windowsIndex)){\n      //确保只有一个窗口\n      windowsIndex.value.close();\n      //确保只有一个监听\n      window.removeEventListener('message', unref(receiveMessage),false);\n    }\n    \n    windowsIndex.value = window.open(\n      url,\n      `login ${source}`,\n      'height=500, width=500, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=n o, status=no'\n    );\n    thirdType.value = source;\n    receiveMessage.value = async function (event) {\n      let token = event.data;\n      if (typeof token === 'string') {\n        //如果是字符串类型 说明是token信息\n        if (token === '登录失败') {\n          cmsFailed();\n        } else if (token.includes('绑定手机号')) {\n          let strings = token.split(',');\n          thirdUserUuid.value = strings[1];\n          await bindThirdAccount();\n        }else{\n          if(token){\n            createMessage.warning('该敲敲云账号已被其它第三方账号绑定,请解绑或绑定其它敲敲云账号');\n          }\n        }\n      } else {\n        cmsFailed();\n      }\n      window.removeEventListener('message', unref(receiveMessage),false);\n      windowsIndex.value = \"\";\n    };\n    window.addEventListener('message', unref(receiveMessage), false);\n  }\n\n  /**\n   * 绑定当前用户\n   */\n  async function bindThirdAccount() {\n    if (!unref(thirdUserUuid)) {\n      cmsFailed();\n      return;\n    }\n    let params = { thirdUserUuid: unref(thirdUserUuid), thirdType: unref(thirdType) };\n    await bindThirdAppAccount(params)\n      .then((res) => {\n        if (res.success) {\n          if (res.result) {\n            setThirdDetail(res.result);\n          }\n        } else {\n          createMessage.warning(res.message);\n        }\n      })\n      .catch((res) => {\n        createMessage.warning(res.message);\n      });\n  }\n\n  /**\n   * 失败提示信息\n   */\n  function cmsFailed() {\n    createMessage.warning('第三方账号绑定异常');\n    return;\n  }\n\n  /**\n   * 设置第三方数据\n   * @param value\n   */\n  function setThirdDetail(value) {\n    let type = value.thirdType;\n    if (type == 'wechat_open') {\n      bindWechatData.value = value;\n    } else if (type == 'dingtalk') {\n      bindDingData.value = value;\n    } else if (type == 'wechat_enterprise') {\n      bindEnterpriseData.value = value;\n    }\n  }\n\n  /**\n   * 删除第三方信息表\n   * @param params\n   */\n  async function deleteAccount(params, text) {\n    Modal.confirm({\n      title: '解绑' + text,\n      content: '确定要解绑吗',\n      okText: '确认',\n      cancelText: '取消',\n      onOk: async () => {\n        await deleteThirdAccount(params).then((res) =>{\n          if(res.success){\n            initUserDetail();\n            createMessage.success(res.message)\n          }else{\n            createMessage.warning(res.message)\n          }\n        });\n      },\n    });\n  }\n\n  onMounted(() => {\n    initUserDetail();\n  });\n</script>\n<style lang=\"less\">\n// 代码逻辑说明: [issues/563]暗色主题部分失效\n@prefix-cls: ~'@{namespace}-j-user-tenant-setting-container';\n.@{prefix-cls} {\n   padding: 30px 40px 0 20px;\n  .account-row-item {\n    align-items: center;\n    /*begin 兼容暗夜模式*/\n    border-bottom: 1px solid @border-color-base;\n    /*end 兼容暗夜模式*/\n    box-sizing: border-box;\n    display: flex;\n    height: 71px;\n    position: relative;\n  }\n\n  .account-label {\n    text-align: left;\n    width: 160px;\n  }\n\n  .gray-75 {\n    /*begin 兼容暗夜模式*/\n    color: @text-color !important;\n    /*end 兼容暗夜模式*/\n  }\n\n  .pointer {\n    cursor: pointer;\n  }\n\n  .blue-e5 {\n    color: #1e88e5;\n  }\n\n  .phone-margin {\n    margin-left: 24px;\n    margin-right: 24px;\n  }\n\n  .clearfix:after {\n    clear: both;\n  }\n\n  .clearfix:before {\n    content: '';\n    display: table;\n  }\n\n  .my-account {\n    font-size: 17px;\n    font-weight: 700 !important;\n    /*begin 兼容暗夜模式*/\n    color: @text-color !important;\n    /*end 兼容暗夜模式*/\n    margin-bottom: 20px;\n  }\n  .item-icon {\n    font-size: 16px !important;\n  }\n}\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/usersetting/commponents/UserAccountModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" width=\"500px\"  :title=\"title\" @ok=\"handleSubmit\" destroyOnClose>\n    <BasicForm @register=\"registerForm\" />\n  </BasicModal>\n</template>\n\n<script lang=\"ts\" setup>\nimport { BasicModal, useModalInner } from '/@/components/Modal';\nimport { BasicForm, useForm } from '/@/components/Form';\nimport { formSchema } from '../UserSetting.data';\nimport { ref, unref, defineEmits } from 'vue';\nimport { userEdit } from \"../UserSetting.api\";\nimport { useUserStore } from \"/@/store/modules/user\";\nimport { useMessage } from \"/@/hooks/web/useMessage\";\n\nconst userStore = useUserStore();\nconst { createMessage } = useMessage();\nconst [registerForm, { resetFields, setFieldsValue, validate, updateSchema }] = useForm({\n  schemas: formSchema,\n  showActionButtonGroup: false,\n});\nconst userDetail = ref<any>({});\nconst isUpdate = ref<boolean>(false);\nconst title = ref<string>('');\nconst emit = defineEmits(['register','success']);\nconst [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n  await resetFields();\n  setModalProps({ confirmLoading: false });\n  title.value = '编辑个人资料';\n  if(data.record.post){\n    data.record.post = data.record.post.split(\",\")\n  }\n  if(data.record.relTenantIds){\n    data.record.relTenantIds = data.record.relTenantIds.split(\",\")\n  }\n  userDetail.value = data.record;\n  // 代码逻辑说明: [QQYUN-3976]个人信息 编辑时，刚注册没有设置生日 生日显示有问题------------\n  if(data.record.birthday === '未填写'){\n    data.record.birthday = undefined;\n  }\n  await setFieldsValue({ ...data.record });\n});\n\n/**\n * 数据修改和新增\n */\nasync function handleSubmit() {\n  try {\n    let values = await validate();\n    setModalProps({ confirmLoading: true });\n    //提交表单\n    await userEdit(values).then((res) =>{\n      if(res.success){\n        createMessage.success(res.message)\n      }else{\n        createMessage.warn(res.message)\n      }\n    });\n    //更新缓存\n    Object.assign(userDetail.value,values)\n    userStore.setUserInfo(unref(userDetail));\n    emit('success')\n    //关闭弹窗\n    closeModal();\n  } finally {\n    setModalProps({ confirmLoading: false });\n  }\n}\n</script>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/usersetting/commponents/UserCancellationModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" title=\"注销\" @ok=\"handleSubmit\" destroyOnClose :width=\"400\">\n    <a-form class=\"antd-modal-form\" ref=\"formRef\" :model=\"formState\" :rules=\"validatorRules\">\n      <div class=\"cancellation-tip\">\n        <p style=\"color: red;margin-bottom: 10px !important;\">注销后账号会保留10天，如需恢复请QQ管理员 </p>\n      </div>\n      <a-form-item label=\"\" name=\"phone\" class=\"cancellation-tip\">\n        <div class=\"black font-size-13\" style=\"margin-bottom: 6px\">验证方式</div>\n        <div class=\"pass-padding\">\n          <a-input placeholder=\"请输入手机号\" v-model:value=\"formState.phone\" />\n        </div>\n      </a-form-item>\n      <a-form-item label=\"\" name=\"smscode\" class=\"cancellation-tip\">\n        <CountdownInput v-model:value=\"formState.smscode\" placeholder=\"请输入6位验证码\" :sendCodeApi=\"sendCodeApi\" />\n      </a-form-item>\n    </a-form>\n  </BasicModal>\n</template>\n<script lang=\"ts\" name=\"UserCancellationModal\" setup>\n  import { ref, unref, reactive } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { Rule } from '/@/components/Form/index';\n  import { userLogOff } from '../UserSetting.api';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useUserStore } from '/@/store/modules/user';\n  import { CountdownInput } from '/@/components/CountDown';\n  import { defHttp } from '@/utils/http/axios';\n\n  const { createMessage, createErrorModal } = useMessage();\n  //用户名\n  const username = ref<string>('');\n  const formRef = ref();\n  const formState = reactive({\n    smscode: '',\n    phone: '',\n  });\n  // 声明Emits\n  const emit = defineEmits(['success', 'register']);\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    setModalProps({ confirmLoading: false });\n    username.value = data.record.username;\n    Object.assign(formState, { password: '', smscode: '', phone: '' });\n  });\n  const userStore = useUserStore();\n  const validatorRules: Record<string, Rule[]> = {\n    phone: [{ required: true, message: '请输入手机号' }],\n    smscode: [{ required: true, message: '请输入6位验证码' }],\n  };\n\n  //表单提交事件\n  async function handleSubmit() {\n    try {\n      let values = await formRef.value.validateFields();\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      values.username = unref(username);\n      await userLogOff(values).then((res) => {\n        if (res.success) {\n          createMessage.info({\n            content: '注销成功！',\n            duration: 1,\n          });\n          //返回登录页面\n          setTimeout(() => {\n            userStore.logout(true);\n          }, 1000);\n          //关闭弹窗\n          closeModal();\n        } else {\n          createMessage.warn(res.message);\n        }\n      });\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n\n  /**\n   * 倒计时执行前的函数\n   */\n  function sendCodeApi() {\n    return new Promise((resolve, reject) => {\n      if(!formState.phone){\n        createErrorModal({ title: '错误提示', content: '请输入手机号！' });\n        reject();\n        return;\n      }\n      let params = { phone: formState.phone, username: username.value };\n      defHttp\n        .post({ url: '/sys/user/sendLogOffPhoneSms', params }, { isTransformResponse: false })\n        .then((res) => {\n          if (res.success) {\n            resolve(true);\n          } else {\n            createErrorModal({ title: '错误提示', content: res.message || '未知问题' });\n            reject();\n          }\n        })\n        .catch((res) => {\n          createErrorModal({ title: '错误提示', content: res.message || '未知问题' });\n          reject();\n        });\n    });\n  }\n</script>\n<style lang=\"less\" scoped>\n  .black {\n    color: @text-color;\n  }\n  .font-size-13 {\n    font-size: 13px;\n    line-height: 15px;\n  }\n  .cancellation-tip {\n    padding: 0 10px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/usersetting/commponents/UserEmailModal.vue",
    "content": "<template>\n<BasicModal v-bind=\"$attrs\" @register=\"registerModal\" width=\"500px\"  :title=\"title\" :showCancelBtn=\"false\" :showOkBtn=\"false\">\n  <a-form class=\"antd-modal-form\" ref=\"formRef\" :model=\"formState\" :rules=\"validatorRules\">\n    <a-form-item name=\"email\">\n      <a-input size=\"large\" v-model:value=\"formState.email\" placeholder=\"请输入邮箱\" />\n    </a-form-item>\n    <a-form-item>\n      <a-button size=\"large\" type=\"primary\" block @click=\"updateEmail\">\n        确认\n      </a-button>\n    </a-form-item>\n  </a-form>\n</BasicModal>\n</template>\n\n<script lang=\"ts\" setup name=\"user-replace-email-modal\">\nimport BasicModal from \"/@/components/Modal/src/BasicModal.vue\";\nimport { CountdownInput } from '/@/components/CountDown';\nimport { useUserStore } from \"/@/store/modules/user\";\nimport { useMessage } from \"/@/hooks/web/useMessage\";\nimport { defineEmits, ref, reactive, toRaw } from \"vue\";\nimport { useModalInner } from \"/@/components/Modal\";\nimport { getCaptcha } from \"/@/api/sys/user\";\nimport { SmsEnum } from \"/@/views/sys/login/useLogin\";\nimport { Rule } from \"/@/components/Form\";\nimport { rules } from \"/@/utils/helper/validator\";\nimport { Form } from \"ant-design-vue\";\nimport { updateMobile, userEdit } from \"../UserSetting.api\";\nimport { duplicateCheck } from \"/@/views/system/user/user.api\";\n\nconst userStore = useUserStore();\nconst { createMessage } = useMessage();\nconst formState = reactive<Record<string, any>>({\n  email:'',\n});\nconst formRef = ref();\n\nconst validatorRules: Record<string, Rule[]> = {\n  email: [{...rules.duplicateCheckRule(\"sys_user\",'email',formState,{ label:'邮箱' })[0]},{ required: true, type: 'email', message: '邮箱格式不正确' }],\n};\nconst useForm = Form.useForm;\nconst title = ref<string>('');\nconst emit = defineEmits(['register','success']);\nconst [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n  formRef.value.resetFields();\n  formRef.value.clearValidate();\n  setModalProps({ confirmLoading: false });\n  title.value = '修改邮箱';\n  //赋值\n  data.record.smscode = '';\n  Object.assign(formState, data.record);\n});\n\n/**\n * 更新邮箱\n */\nasync function updateEmail() {\n  await formRef.value.validateFields();\n  userEdit(formState).then((res) =>{\n    if(res.success){\n      createMessage.success(\"修改邮箱成功\")\n      emit(\"success\")\n      closeModal();\n    }else{\n      createMessage.warning(res.message)\n    }\n  })\n}\n</script>\n\n<style scoped>\n\n</style>"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/usersetting/commponents/UserPasswordModal.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\"  @register=\"registerModal\" title=\"修改密码\" @ok=\"handleSubmit\" destroyOnClose :width=\"400\">\n    <a-form class=\"antd-modal-form\" ref=\"formRef\" :model=\"formState\" :rules=\"validatorRules\">\n      <a-form-item name=\"phone\">\n        <div class=\"black font-size-13\">验证手机号</div>\n        <div class=\"pass-padding\">\n          <a-input placeholder=\"请输入手机号\" v-model:value=\"formState.phone\"/>\n        </div>\n      </a-form-item>\n      <a-form-item name=\"smscode\">\n        <CountdownInput v-model:value=\"formState.smscode\" placeholder=\"请输入6位验证码\" :sendCodeApi=\"sendCodeApi\" />\n      </a-form-item>\n      <a-form-item name=\"password\">\n        <span class=\"black font-size-13\">新密码</span>\n        <div class=\"pass-padding\">\n          <a-input-password v-model:value=\"formState.password\" placeholder=\"新密码\" autocomplete=\"new-password\"/>\n        </div>\n        <span class=\"gray-9e font-size-13\">8-20位，需包含字母和数字</span>\n      </a-form-item>\n    </a-form>\n  </BasicModal>\n</template>\n<script lang=\"ts\" name=\"user-pass-word-modal\" setup>\n  import { ref, computed, unref, reactive } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { Rule } from '/@/components/Form/index';\n  import { updateUserPassword } from '../UserSetting.api';\n  import { useMessage } from \"/@/hooks/web/useMessage\";\n  import { useUserStore, useUserStoreWithOut } from \"/@/store/modules/user\";\n  import { getCaptcha } from \"@/api/sys/user\";\n  import { SmsEnum } from \"@/views/sys/login/useLogin\";\n  import { CountdownInput } from '/@/components/CountDown';\n  import { defHttp } from \"@/utils/http/axios\";\n\n  const { createMessage, createErrorModal } = useMessage();\n  //用户名\n  const username = ref<string>('')\n  const formRef = ref();\n  const formState = reactive({\n    oldpassword:'',\n    password:'',\n    smscode:'',\n    phone:'',\n  });\n  // 声明Emits\n  const emit = defineEmits(['success', 'register']);\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    setModalProps({ confirmLoading: false });\n    username.value = data.record.username\n    Object.assign(formState, { password:'', smscode:'', phone:'',})\n  });\n  const userStore = useUserStore();\n  const validatorRules: Record<string, Rule[]> = {\n    password: [{ required: true, validator:checkPassword},{ pattern:/^(?=.*[0-9])(?=.*[a-zA-Z])(.{8,20})$/,message:'8-20位，需包含字母和数字'}],\n    phone: [{ required: true, message: '请输入手机号' }],\n    smscode: [{ required: true, message: '请输入6位验证码' }],\n  };\n\n  //表单提交事件\n  async function handleSubmit() {\n    try {\n      let values = await formRef.value.validateFields();\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      values.username = unref(username);\n      await updateUserPassword(values).then((res) =>{\n        if(res.success){\n          createMessage.info({\n            content:'密码修改成功，请重新登录！3s后自动退出登录',\n            duration: 3\n          })\n          //3s后返回登录页面\n          setTimeout(()=>{\n            userStore.logout(true);\n          },3000)\n          //关闭弹窗\n          closeModal();\n        }else{\n          createMessage.warn(res.message);\n        }\n      });\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n\n  /**\n   * 验证新密码是否为空\n   */\n  function checkPassword(_rule: Rule, value: string) {\n    if(value === ''){\n      return Promise.reject('请输入新密码');\n    }\n    return Promise.resolve();\n  }\n\n  /**\n   * 倒计时执行前的函数\n   */\n  function sendCodeApi() {\n    return new Promise((resolve, reject) => {\n      let params = { mobile: formState.phone };\n      defHttp.post({ url: \"/sys/sendChangePwdSms\", params }, { isTransformResponse: false }).then((res) => {\n        if (res.success) {\n          resolve(true);\n        } else {\n          createErrorModal({ title: '错误提示', content: res.message || '未知问题' });\n          reject();\n        }\n      }).catch((res)=>{\n        createErrorModal({ title: '错误提示', content: res.message || '未知问题' });\n        reject();\n      });\n    });\n  }\n</script>\n<style lang=\"less\" scoped>\n  .black {\n    color: @text-color;\n  }\n  .font-size-13 {\n    font-size: 13px;\n    line-height: 15px;\n  }\n  .gray-9e {\n    color: #9e9e9e;\n  }\n  .float-left {\n    float: left;\n  }\n  .pass-padding {\n    padding-top: 10px;\n    padding-bottom: 10px;\n  }\n  .antd-modal-form {\n    padding: 10px 24px 10px 24px;\n  }\n  :deep(.ant-form-item){\n    margin-bottom: 10px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/usersetting/commponents/UserPasswordNotBindPhone.vue",
    "content": "<template>\n  <BasicModal v-bind=\"$attrs\" @register=\"registerModal\" title=\"修改密码\" @ok=\"handleSubmit\" destroyOnClose :width=\"400\">\n    <a-form class=\"antd-modal-form\" ref=\"formRef\" :model=\"formState\" :rules=\"validatorRules\">\n      <a-form-item name=\"oldPassword\">\n        <div class=\"black font-size-13\">旧密码</div>\n        <div class=\"pass-padding\">\n          <a-input-password placeholder=\"请输入旧密码\" v-model:value=\"formState.oldPassword\" />\n        </div>\n      </a-form-item>\n      <a-form-item name=\"password\">\n        <span class=\"black font-size-13\">新密码</span>\n        <div class=\"pass-padding\">\n          <a-input-password v-model:value=\"formState.password\" placeholder=\"新密码\" autocomplete=\"new-password\" />\n        </div>\n        <span class=\"gray-9e font-size-13\">8-20位，需包含字母和数字</span>\n      </a-form-item>\n    </a-form>\n  </BasicModal>\n</template>\n<script lang=\"ts\" name=\"user-pass-word-modal\" setup>\n  import { ref, unref, reactive } from 'vue';\n  import { BasicModal, useModalInner } from '/@/components/Modal';\n  import { Rule } from '@/components/Form';\n  import { updatePasswordNotBindPhone } from '../UserSetting.api';\n  import { useMessage } from '/@/hooks/web/useMessage';\n  import { useUserStore } from '/@/store/modules/user';\n\n  const { createMessage } = useMessage();\n  //用户名\n  const username = ref<string>('');\n  const formRef = ref();\n  const formState = reactive({\n    oldPassword: '',\n    password: '',\n  });\n  // 声明Emits\n  const emit = defineEmits(['success', 'register']);\n  //表单赋值\n  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n    setModalProps({ confirmLoading: false });\n    username.value = data.record.username;\n    Object.assign(formState, { password: '', oldPassword: '' });\n  });\n  const userStore = useUserStore();\n  const validatorRules: Record<string, Rule[]> = {\n    oldPassword: [{ required: true, message: '请输入旧密码' }],\n    password: [\n      { required: true, validator: checkPassword },\n      { pattern: /^(?=.*[0-9])(?=.*[a-zA-Z])(.{8,20})$/, message: '8-20位，需包含字母和数字' },\n    ],\n  };\n\n  //表单提交事件\n  async function handleSubmit() {\n    try {\n      let values = await formRef.value.validateFields();\n      setModalProps({ confirmLoading: true });\n      //提交表单\n      values.username = unref(username);\n      await updatePasswordNotBindPhone(values).then((res) => {\n        if (res.success) {\n          createMessage.info({\n            content: '密码修改成功，请重新登录！3s后自动退出登录',\n            duration: 3,\n          });\n          //3s后返回登录页面\n          setTimeout(() => {\n            userStore.logout(true);\n          }, 3000);\n          //关闭弹窗\n          closeModal();\n        } else {\n          createMessage.warn(res.message);\n        }\n      });\n    } finally {\n      setModalProps({ confirmLoading: false });\n    }\n  }\n\n  /**\n   * 验证新密码是否为空\n   */\n  function checkPassword(_rule: Rule, value: string) {\n    if (value === '') {\n      return Promise.reject('请输入新密码');\n    }\n    return Promise.resolve();\n  }\n</script>\n<style lang=\"less\" scoped>\n  .black {\n    color: @text-color;\n  }\n  .font-size-13 {\n    font-size: 13px;\n    line-height: 15px;\n  }\n  .gray-9e {\n    color: #9e9e9e;\n  }\n  .float-left {\n    float: left;\n  }\n  .pass-padding {\n    padding-top: 10px;\n    padding-bottom: 10px;\n  }\n  .antd-modal-form {\n    padding: 10px 24px 10px 24px;\n  }\n  :deep(.ant-form-item) {\n    margin-bottom: 10px;\n  }\n</style>\n"
  },
  {
    "path": "jeecgboot-vue3/src/views/system/usersetting/commponents/UserPhoneModal.vue",
    "content": "<template>\n<BasicModal v-bind=\"$attrs\" @register=\"registerModal\" width=\"500px\"  :title=\"title\" :showCancelBtn=\"false\" :showOkBtn=\"false\">\n  <a-form v-if=\"type==='updatePhone'\" class=\"antd-modal-form\" ref=\"updateFormRef\" :model=\"updateFormState\"\n          :rules=\"updateValidatorRules\">\n    <div v-if=\"current === 0\">\n      <a-form-item name=\"phoneText\">\n        <span class=\"black font-size-13\">原手机号</span>\n        <div class=\"phone-padding\">\n          <span>{{ updateFormState.phoneText }}</span>\n        </div>\n      </a-form-item>\n      <a-form-item name=\"smscode\">\n        <span class=\"black font-size-13\">验证码</span>\n        <CountdownInput class=\"phone-padding\" size=\"large\" v-model:value=\"updateFormState.smscode\" placeholder=\"输入6位验证码\"\n                        :sendCodeApi=\"()=>updateSendCodeApi('verifyOriginalPhone')\"/>\n      </a-form-item>\n      <a-form-item>\n        <a-button size=\"large\" type=\"primary\" block @click=\"nextStepClick\">\n          下一步\n        </a-button>\n      </a-form-item>\n    </div>\n    <div v-else-if=\"current === 1\">\n      <a-form-item name=\"newPhone\">\n        <span class=\"black font-size-13\">新手机号</span>\n        <div class=\"phone-padding\">\n          <a-input v-model:value=\"updateFormState.newPhone\" placeholder=\"请输入新手机号\"/>\n        </div>\n      </a-form-item>\n      <a-form-item name=\"smscode\">\n        <span class=\"black font-size-13\">验证码</span>\n        <CountdownInput class=\"phone-padding\" size=\"large\" v-model:value=\"updateFormState.smscode\" placeholder=\"输入6位验证码\"\n                        :sendCodeApi=\"()=>updateSendCodeApi('updatePhone')\"/>\n      </a-form-item>\n      <a-form-item>\n        <a-button size=\"large\" type=\"primary\" block @click=\"finishedClick\">\n          完成\n        </a-button>\n      </a-form-item>\n    </div>\n  </a-form>\n\n  <a-form v-else-if=\"type==='bindPhone'\" class=\"antd-modal-form\" ref=\"formRef\" :model=\"formState\" :rules=\"validatorRules\">\n    <a-form-item  name=\"phone\">\n      <a-input size=\"large\" v-model:value=\"formState.phone\" placeholder=\"请输入手机号\" />\n    </a-form-item>\n    <a-form-item name=\"smscode\">\n      <CountdownInput size=\"large\" v-model:value=\"formState.smscode\" placeholder=\"输入6位验证码\" :sendCodeApi=\"sendCodeApi\" />\n    </a-form-item>\n    <a-form-item>\n      <a-button size=\"large\" type=\"primary\" block @click=\"updatePhone\">\n        确认\n      </a-button>\n    </a-form-item>\n  </a-form>\n</BasicModal>\n</template>\n\n<script lang=\"ts\" setup name=\"user-replace-phone-modal\">\nimport BasicModal from \"/@/components/Modal/src/BasicModal.vue\";\nimport { CountdownInput } from '/@/components/CountDown';\nimport { useUserStore } from \"/@/store/modules/user\";\nimport { useMessage } from \"/@/hooks/web/useMessage\";\nimport { defineEmits, ref, reactive, toRaw } from \"vue\";\nimport { useModalInner } from \"/@/components/Modal\";\nimport { getCaptcha } from \"/@/api/sys/user\";\nimport { SmsEnum } from \"/@/views/sys/login/useLogin\";\nimport { Rule } from \"/@/components/Form\";\nimport { rules } from \"/@/utils/helper/validator\";\nimport { Form } from \"ant-design-vue\";\nimport { updateMobile, changePhone } from \"../UserSetting.api\";\nimport { duplicateCheck } from \"/@/views/system/user/user.api\";\nimport {defHttp} from \"@/utils/http/axios\";\nimport { ExceptionEnum } from \"@/enums/exceptionEnum\";\n\nconst userStore = useUserStore();\nconst { createMessage } = useMessage();\nconst formState = reactive<Record<string, any>>({\n  phone:'',\n  smscode:''\n});\n\n//修改手机号\nconst updateFormState = reactive<Record<string, any>>({\n  phone:'',\n  smscode:'',\n  newPhone:'',\n  phoneText:'',\n  newSmsCode:''\n});\n\nconst formRef = ref();\nconst userData = ref<any>({})\n\nconst validatorRules: Record<string, Rule[]> = {\n  phone: [{...rules.duplicateCheckRule(\"sys_user\",'phone',formState,{ label:'手机号' })[0]},{ pattern: /^1[3456789]\\d{9}$/, message: '手机号码格式有误' }],\n  smscode: [{ required: true,message:'请输入验证码' }],\n};\n\n//修改手机号验证规则\nconst updateValidatorRules: Record<string, Rule[]> = {\n  newPhone: [{...rules.duplicateCheckRule(\"sys_user\",'phone',formState,{ label:'手机号' })[0]},{ pattern: /^1[3456789]\\d{9}$/, message: '手机号码格式有误' }],\n  smscode: [{ required: true,message:'请输入验证码' }],\n  newSmsCode: [{ required: true,message:'请输入验证码' }],\n};\nconst useForm = Form.useForm;\nconst title = ref<string>('');\nconst emit = defineEmits(['register','success']);\n//修改手机号还是绑定手机号\nconst type = ref<string>('updatePhone');\nconst [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {\n  setModalProps({ confirmLoading: false });\n  if(data.record.phone){\n    updateFormState.phone = \"\";\n    updateFormState.smscode = \"\";\n    current.value = 0;\n    title.value = '修改手机号';\n    type.value = \"updatePhone\";\n    Object.assign(updateFormState, data.record);\n  }else{\n    title.value = '绑定手机号';\n    type.value = \"bindPhone\"\n    //赋值\n    data.record.smscode = '';\n    Object.assign(formState, data.record);\n    setTimeout(()=>{\n      formRef.value.resetFields();\n      formRef.value.clearValidate();\n    },300)\n  }\n  userData.value = data.record;\n});\n\n/**\n * 倒计时执行前的函数\n */\nfunction sendCodeApi() {\n  return getCaptcha({ mobile: formState.phone, smsmode: SmsEnum.REGISTER });\n}\n\n/**\n * 倒计时执行前的函数\n * \n * @param type 类型 verifyOriginalPhone 验证员手机号 updatePhone 修改手机号\n */\nfunction updateSendCodeApi(type) {\n  let phone = \"\"\n  if(current.value === 0){\n    phone = updateFormState.phone;\n  }else{\n    phone = updateFormState.newPhone;\n  }\n  let params = { phone: phone,  type: type };\n  return new Promise((resolve, reject) => {\n    defHttp.post({ url: \"/sys/user/sendChangePhoneSms\", params }, { isTransformResponse: false }).then((res) => {\n      console.log(res);\n      if (res.success) {\n        resolve(true);\n      } else {\n        // 代码逻辑说明: 【QQYUN-9005】同一个IP，1分钟超过5次短信，则提示需要验证码---\n        if(res.code != ExceptionEnum.PHONE_SMS_FAIL_CODE){\n          createMessage.error(res.message || '未知问题');\n          reject();\n        }\n        reject(res);\n      }\n    }).catch((res)=>{\n      createMessage.error(res.message || '未知问题');\n      reject();\n    });\n  });\n}\n\n/**\n * 更新手机号\n */\nasync function updatePhone() {\n  await formRef.value.validateFields();\n  updateMobile(formState).then((res) =>{\n    if(res.success){\n      createMessage.success(type.value === \"updatePhone\"?\"修改手机号成功\":\"绑定手机号成功\")\n      emit(\"success\")\n      closeModal();\n    }else{\n      createMessage.warning(res.message)\n    }\n  })\n}\n  //走到第几步\n  const current = ref<number>(0);\n  const updateFormRef = ref();\n\n  /**\n   * 下一步点击事件\n   */\n  async function nextStepClick() {\n    let params = { phone: updateFormState.phone, smscode: updateFormState.smscode, type: 'verifyOriginalPhone' };\n    changeAndVerifyPhone(params,1)\n  }\n\n  /**\n   * 完成\n   */\n  function finishedClick() {\n    changeAndVerifyPhone({ phone: updateFormState.phone, newPhone: updateFormState.newPhone, smscode: updateFormState.smscode, type: 'updatePhone' },0);\n  }\n\n  /**\n   * 修改并验证手机号\n   * @param params\n   * @param index\n   */\n  async function changeAndVerifyPhone(params, index) {\n    await updateFormRef.value.validateFields();\n    changePhone(params).then((res)=>{\n      if(res.success){\n        current.value = index;\n        if(index == 0){\n          createMessage.success(res.message);\n          emit(\"success\");\n          closeModal();\n        }\n        updateFormState.smscode = \"\";\n      }else{\n        createMessage.warn(res.message);\n      }\n    }).catch((res) =>{\n      createMessage.warn(res.message);\n    })\n  }\n</script>\n<style lang=\"less\" scoped>\n  .antd-modal-form {\n    padding: 10px 24px 10px 24px;\n  }\n .black {\n   color: #000000;\n }\n .font-size-13 {\n   font-size: 13px;\n   line-height: 15px;\n }\n  .phone-padding {\n    padding-top: 10px;\n    padding-bottom: 10px;\n  }\n  :deep(.ant-form-item){\n    margin-bottom: 10px;\n  }\n</style>"
  },
  {
    "path": "jeecgboot-vue3/stylelint.config.js",
    "content": "module.exports = {\n  root: true,\n  plugins: ['stylelint-order'],\n  extends: ['stylelint-config-standard', 'stylelint-config-prettier'],\n  rules: {\n    'selector-pseudo-class-no-unknown': [\n      true,\n      {\n        ignorePseudoClasses: ['global'],\n      },\n    ],\n    'selector-pseudo-element-no-unknown': [\n      true,\n      {\n        ignorePseudoElements: ['v-deep'],\n        ignorePseudoElements: ['deep'],\n      },\n    ],\n    'at-rule-no-unknown': [\n      true,\n      {\n        ignoreAtRules: [\n          'tailwind',\n          'apply',\n          'variants',\n          'responsive',\n          'screen',\n          'function',\n          'if',\n          'each',\n          'include',\n          'mixin',\n        ],\n      },\n    ],\n    'no-empty-source': null,\n    'named-grid-areas-no-invalid': null,\n    'unicode-bom': 'never',\n    'no-descending-specificity': null,\n    'font-family-no-missing-generic-family-keyword': null,\n    'declaration-colon-space-after': 'always-single-line',\n    'declaration-colon-space-before': 'never',\n    // 'declaration-block-trailing-semicolon': 'always',\n    'rule-empty-line-before': [\n      'always',\n      {\n        ignore: ['after-comment', 'first-nested'],\n      },\n    ],\n    'unit-no-unknown': [true, { ignoreUnits: ['rpx'] }],\n    'order/order': [\n      [\n        'dollar-variables',\n        'custom-properties',\n        'at-rules',\n        'declarations',\n        {\n          type: 'at-rule',\n          name: 'supports',\n        },\n        {\n          type: 'at-rule',\n          name: 'media',\n        },\n        'rules',\n      ],\n      { severity: 'warning' },\n    ],\n  },\n  ignoreFiles: ['**/*.js', '**/*.jsx', '**/*.tsx', '**/*.ts'],\n};\n"
  },
  {
    "path": "jeecgboot-vue3/tests/__mocks__/fileMock.ts",
    "content": "export default '';\n"
  },
  {
    "path": "jeecgboot-vue3/tests/__mocks__/styleMock.ts",
    "content": "export default {};\n"
  },
  {
    "path": "jeecgboot-vue3/tests/__mocks__/workerMock.ts",
    "content": "export default jest.fn().mockImplementation(() => ({\n  postMessage: jest.fn(),\n  onmessage: jest.fn(),\n  onerror: jest.fn(),\n}));\n"
  },
  {
    "path": "jeecgboot-vue3/tests/server/README.md",
    "content": "# Test Server\n\nIt is used to start the test interface service, which can test the upload, websocket, login and other interfaces.\n\n## Usage\n\n```bash\n\ncd ./test/server\n\nyarn\n\nyarn start\n\n```\n"
  },
  {
    "path": "jeecgboot-vue3/tests/server/controller/FileController.ts",
    "content": "import FileService from '../service/FileService';\n\nclass FileController {\n  private service: FileService = new FileService();\n\n  upload = async (ctx) => {\n    const files = ctx.request.files.file;\n    console.log(files);\n\n    if (files.length === undefined) {\n      this.service.upload(ctx, files, false);\n    } else {\n      this.service.upload(ctx, files, true);\n    }\n  };\n}\n\nexport default new FileController();\n"
  },
  {
    "path": "jeecgboot-vue3/tests/server/controller/UserController.ts",
    "content": "import UserService from '../service/UserService';\n\nclass UserController {\n  private service: UserService = new UserService();\n\n  login = async (ctx) => {\n    ctx.body = await this.service.login();\n  };\n\n  getUserInfoById = async (ctx) => {\n    ctx.body = await this.service.getUserInfoById();\n  };\n}\n\nexport default new UserController();\n"
  },
  {
    "path": "jeecgboot-vue3/tests/server/ecosystem.config.js",
    "content": "const { name } = require('./package.json');\nconst path = require('path');\n\nmodule.exports = {\n  apps: [\n    {\n      name,\n      script: path.resolve(__dirname, './dist/index.js'),\n      instances: require('os').cpus().length,\n      autorestart: true,\n      watch: true,\n      env_production: {\n        NODE_ENV: 'production',\n        PORT: 8080,\n      },\n    },\n  ],\n};\n"
  },
  {
    "path": "jeecgboot-vue3/tests/server/index.ts",
    "content": "import Koa from 'koa';\nimport path from 'path';\nimport Router from 'koa-router';\nimport body from 'koa-body';\nimport cors from 'koa2-cors';\nimport koaStatic from 'koa-static';\nimport websockify from 'koa-websocket';\nimport route from 'koa-route';\n\nimport AppRoutes from './routes';\n\nconst PORT = 3300;\n\nconst app = websockify(new Koa());\n\napp.ws.use(function (ctx, next) {\n  ctx.websocket.send('connection succeeded!');\n  return next(ctx);\n});\n\napp.ws.use(\n  route.all('/test', function (ctx) {\n    // ctx.websocket.send('Hello World');\n    ctx.websocket.on('message', function (message) {\n      // do something with the message from client\n\n      if (message !== 'ping') {\n        const data = JSON.stringify({\n          id: Math.ceil(Math.random() * 1000),\n          time: new Date().getTime(),\n          res: `${message}`,\n        });\n        ctx.websocket.send(data);\n      }\n      console.log(message);\n    });\n  })\n);\n\nconst router = new Router();\n\n// router\nAppRoutes.forEach((route) => router[route.method](route.path, route.action));\n\napp.use(cors());\napp.use(\n  body({\n    encoding: 'gzip',\n    multipart: true,\n    formidable: {\n      // uploadDir: path.join(__dirname, '/upload/'), // 设置文件上传目录\n      keepExtensions: true,\n      maxFieldsSize: 20 * 1024 * 1024,\n    },\n  })\n);\napp.use(router.routes());\napp.use(router.allowedMethods());\napp.use(koaStatic(path.join(__dirname)));\n\napp.listen(PORT, () => {\n  console.log(`Application started successfully: http://localhost:${PORT}`);\n});\n"
  },
  {
    "path": "jeecgboot-vue3/tests/server/nodemon.json",
    "content": "{\n  \"watch\": [\"src\"],\n  \"ext\": \"ts\",\n  \"exec\": \"ts-node -r tsconfig-paths/register index.ts\",\n  \"events\": {\n    \"restart\": \"clear\"\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/tests/server/package.json",
    "content": "{\n  \"name\": \"server\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"start\": \"nodemon\",\n    \"build\": \"rimraf ./dist && tsup ./index.ts --dts --format cjs,esm  \",\n    \"prod\": \"npx pm2 start ecosystem.config.js --env production\",\n    \"restart\": \"pm2 restart ecosystem.config.js --env production\",\n    \"stop\": \"npx pm2 stop ecosystem.config.js\"\n  },\n  \"dependencies\": {\n    \"fs-extra\": \"^10.0.0\",\n    \"koa\": \"^2.13.1\",\n    \"koa-body\": \"^4.2.0\",\n    \"koa-bodyparser\": \"^4.3.0\",\n    \"koa-route\": \"^3.2.0\",\n    \"koa-router\": \"^10.1.1\",\n    \"koa-static\": \"^5.0.0\",\n    \"koa-websocket\": \"^6.0.0\",\n    \"koa2-cors\": \"^2.0.6\"\n  },\n  \"devDependencies\": {\n    \"@types/koa\": \"^2.13.4\",\n    \"@types/koa-bodyparser\": \"^5.0.2\",\n    \"@types/koa-router\": \"^7.4.4\",\n    \"@types/node\": \"^16.7.1\",\n    \"nodemon\": \"^2.0.12\",\n    \"pm2\": \"^5.1.1\",\n    \"rimraf\": \"^3.0.2\",\n    \"ts-node\": \"^10.2.1\",\n    \"tsconfig-paths\": \"^3.11.0\",\n    \"tsup\": \"^4.14.0\",\n    \"typescript\": \"^4.3.5\"\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/tests/server/routes.ts",
    "content": "import UserController from './controller/UserController';\nimport FileController from './controller/FileController';\n\nexport default [\n  // user\n  {\n    path: '/login',\n    method: 'post',\n    action: UserController.login,\n  },\n  {\n    path: '/getUserInfoById',\n    method: 'get',\n    action: UserController.getUserInfoById,\n  },\n\n  // file\n  {\n    path: '/upload',\n    method: 'post',\n    action: FileController.upload,\n  },\n];\n"
  },
  {
    "path": "jeecgboot-vue3/tests/server/service/FileService.ts",
    "content": "import path from 'path';\nimport fs from 'fs-extra';\n\nconst uploadUrl = 'http://localhost:3300/static/upload';\nconst filePath = path.join(__dirname, '../static/upload/');\n\nfs.ensureDir(filePath);\nexport default class UserService {\n  async upload(ctx, files, isMultiple) {\n    let fileReader, fileResource, writeStream;\n\n    const fileFunc = function (file) {\n      fileReader = fs.createReadStream(file.path);\n      fileResource = filePath + `/${file.name}`;\n      console.log(fileResource);\n\n      writeStream = fs.createWriteStream(fileResource);\n      fileReader.pipe(writeStream);\n    };\n\n    const returnFunc = function (flag) {\n      if (flag) {\n        let url = '';\n        for (let i = 0; i < files.length; i++) {\n          url += uploadUrl + `/${files[i].name},`;\n        }\n        url = url.replace(/,$/gi, '');\n        ctx.body = {\n          url: url,\n          code: 0,\n          message: 'upload Success!',\n        };\n      } else {\n        ctx.body = {\n          url: uploadUrl + `/${files.name}`,\n          code: 0,\n          message: 'upload Success!',\n        };\n      }\n    };\n    console.log(isMultiple, files.length);\n\n    if (isMultiple) {\n      for (let i = 0; i < files.length; i++) {\n        const f1 = files[i];\n        fileFunc(f1);\n      }\n    } else {\n      fileFunc(files);\n    }\n    fs.ensureDir(filePath);\n    returnFunc(isMultiple);\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/tests/server/service/UserService.ts",
    "content": "import { Result } from '../utils';\n\nconst fakeUserInfo = {\n  userId: '1',\n  username: 'Jeecg',\n  realname: 'Jeecg Admin',\n  desc: 'manager',\n  password: '123456',\n  token: 'fakeToken1',\n  roles: [\n    {\n      roleName: 'Super Admin',\n      value: 'super',\n    },\n  ],\n};\nexport default class UserService {\n  async login() {\n    return Result.success(fakeUserInfo);\n  }\n\n  async getUserInfoById() {\n    return Result.success(fakeUserInfo);\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/tests/server/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"module\": \"commonjs\",\n    \"declaration\": false,\n    \"removeComments\": true,\n    \"emitDecoratorMetadata\": true,\n    \"experimentalDecorators\": true,\n    \"target\": \"es6\",\n    \"sourceMap\": false,\n    \"esModuleInterop\": true,\n    \"outDir\": \"./dist\",\n    \"baseUrl\": \"./\"\n  },\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "jeecgboot-vue3/tests/server/utils.ts",
    "content": "export class Result {\n  static success(data: any) {\n    return {\n      code: 0,\n      success: true,\n      result: data,\n    };\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/tests/test.spec.ts",
    "content": "// import { mount } from '@vue/test-utils';\n// import { Button } from '/@/components/Button';\n\ntest('if jest is normal.', async () => {\n  expect('jest').toEqual('jest');\n});\n\n// TODO Vue component testing is not supported temporarily\n// test('is a Vue instance.', async () => {\n//   const wrapper = mount(Button, {\n//     slots: {\n//       default: 'Button text',\n//     },\n//   });\n//   expect(wrapper.html()).toContain('Button text');\n// });\n"
  },
  {
    "path": "jeecgboot-vue3/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"esnext\",\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\",\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strictFunctionTypes\": false,\n    \"jsx\": \"preserve\",\n    \"baseUrl\": \".\",\n    \"allowJs\": true,\n    \"sourceMap\": true,\n    \"esModuleInterop\": true,\n    \"resolveJsonModule\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"experimentalDecorators\": true,\n    \"lib\": [\"dom\", \"esnext\"],\n    \"types\": [\"vite/client\", \"jest\"],\n    \"typeRoots\": [\"./node_modules/@types/\", \"./types\",\"./node_modules\"],\n    \"noImplicitAny\": false,\n    \"skipLibCheck\": true,\n    \"paths\": {\n      \"/@/*\": [\"src/*\"],\n      \"/#/*\": [\"types/*\"],\n      \"@/*\": [\"src/*\"],\n      \"#/*\": [\"types/*\"]\n    }\n  },\n  \"include\": [\n    \"tests/**/*.ts\",\n    \"src/**/*.ts\",\n    \"src/**/*.d.ts\",\n    \"src/**/*.tsx\",\n    \"src/**/*.vue\",\n    \"types/**/*.d.ts\",\n    \"types/**/*.ts\",\n    \"build/**/*.ts\",\n    \"build/**/*.d.ts\",\n    \"mock/**/*.ts\",\n    \"vite.config.ts\"\n  ],\n  \"exclude\": [\"node_modules\", \"tests/server/**/*.ts\", \"dist\", \"**/*.js\"]\n}\n"
  },
  {
    "path": "jeecgboot-vue3/types/axios.d.ts",
    "content": "export type ErrorMessageMode = 'none' | 'modal' | 'message' | undefined;\nexport type SuccessMessageMode = 'none' | 'success' | 'error' | undefined;\n\nexport interface RequestOptions {\n  // 将请求参数拼接到url\n  joinParamsToUrl?: boolean;\n  // 格式化请求参数时间\n  formatDate?: boolean;\n  // 是否处理请求结果\n  isTransformResponse?: boolean;\n  // 是否返回本地响应头,需要获取响应头时使用此属性\n  isReturnNativeResponse?: boolean;\n  // 默认将prefix 添加到url\n  joinPrefix?: boolean;\n  // 接口地址，如果保留为空，则使用默认值\n  apiUrl?: string;\n  // 请求拼接路径\n  urlPrefix?: string;\n  // 错误消息提示类型\n  errorMessageMode?: ErrorMessageMode;\n  // 成功消息提示类型\n  successMessageMode?: SuccessMessageMode;\n  // 是否添加时间戳\n  joinTime?: boolean;\n  ignoreCancelToken?: boolean;\n  //是否在标头中发送令牌\n  withToken?: boolean;\n}\n\nexport interface Result<T = any> {\n  code: number;\n  type: 'success' | 'error' | 'warning';\n  message: string;\n  result: T;\n}\n\n//文件上传参数\nexport interface UploadFileParams {\n  // 其他参数\n  data?: Recordable;\n  // 文件参数接口字段名\n  name?: string;\n  // 文件\n  file: File | Blob;\n  // 文件名\n  filename?: string;\n  [key: string]: any;\n}\n//文件返回参数\nexport interface UploadFileCallBack {\n  // 成功回调方法\n  success?: any;\n  // 是否返回响应头,需要获取响应头时使用此属性\n  isReturnResponse?: boolean;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/types/config.d.ts",
    "content": "import { MenuTypeEnum, MenuModeEnum, TriggerEnum, MixSidebarTriggerEnum } from '/@/enums/menuEnum';\nimport {\n  ContentEnum,\n  PermissionModeEnum,\n  ThemeEnum,\n  RouterTransitionEnum,\n  SettingButtonPositionEnum,\n  SessionTimeoutProcessingEnum,\n} from '/@/enums/appEnum';\n\nimport { CacheTypeEnum } from '/@/enums/cacheEnum';\n\nexport type LocaleType = 'zh_CN' | 'en' | 'ru' | 'ja' | 'ko';\n\nexport interface MenuSetting {\n  bgColor: string;\n  fixed: boolean;\n  collapsed: boolean;\n  canDrag: boolean;\n  show: boolean;\n  hidden: boolean;\n  split: boolean;\n  menuWidth: number;\n  mode: MenuModeEnum;\n  type: MenuTypeEnum;\n  theme: ThemeEnum;\n  // 代码逻辑说明: 【QQYUN-8922】左侧导航栏文字颜色调整区分彩色和暗黑\n  isThemeBright: boolean;\n  topMenuAlign: 'start' | 'center' | 'end';\n  trigger: TriggerEnum;\n  accordion: boolean;\n  closeMixSidebarOnChange: boolean;\n  collapsedShowTitle: boolean;\n  mixSideTrigger: MixSidebarTriggerEnum;\n  mixSideFixed: boolean;\n}\n\nexport interface MultiTabsSetting {\n  cache: boolean;\n  show: boolean;\n  showQuick: boolean;\n  canDrag: boolean;\n  showRedo: boolean;\n  showFold: boolean;\n  theme: string;\n}\n\nexport interface HeaderSetting {\n  bgColor: string;\n  fixed: boolean;\n  show: boolean;\n  theme: ThemeEnum;\n  // 是否显示全屏按钮\n  showFullScreen: boolean;\n  // 是否显示锁屏按钮\n  useLockPage: boolean;\n  // 是否显示文档连接\n  showDoc: boolean;\n  // 是否显示消息图标\n  showNotice: boolean;\n  // 是否显示搜索按钮\n  showSearch: boolean;\n}\n\nexport interface LocaleSetting {\n  // 是否显示国际化切换按钮\n  showPicker: boolean;\n  // Current language\n  locale: LocaleType;\n  // default language\n  fallback: LocaleType;\n  // available Locales\n  availableLocales: LocaleType[];\n}\n\nexport interface TransitionSetting {\n  //  Whether to open the page switching animation\n  enable: boolean;\n  // Route basic switching animation\n  basicTransition: RouterTransitionEnum;\n  // Whether to open page switching loading\n  openPageLoading: boolean;\n  // Whether to open the top progress bar\n  openNProgress: boolean;\n}\n\nexport interface ProjectConfig {\n  // Storage location of permission related information\n  permissionCacheType: CacheTypeEnum;\n  // Whether to show the configuration button\n  showSettingButton: boolean;\n  // Whether to show the theme switch button\n  showDarkModeToggle: boolean;\n  // Configure where the button is displayed\n  settingButtonPosition: SettingButtonPositionEnum;\n  // Permission mode\n  permissionMode: PermissionModeEnum;\n  // Session timeout processing\n  sessionTimeoutProcessing: SessionTimeoutProcessingEnum;\n  // Website gray mode, open for possible mourning dates\n  grayMode: boolean;\n  // Whether to turn on the color weak mode\n  colorWeak: boolean;\n  // Theme color\n  themeColor: string;\n  // Theme Mode\n  themeMode: string;\n\n  // The main interface is displayed in full screen, the menu is not displayed, and the top\n  fullContent: boolean;\n  // content width\n  contentMode: ContentEnum;\n  // Whether to display the logo\n  showLogo: boolean;\n  // Whether to show the global footer\n  showFooter: boolean;\n  // menuType: MenuTypeEnum;\n  headerSetting: HeaderSetting;\n  // menuSetting\n  menuSetting: MenuSetting;\n  // Multi-tab settings\n  multiTabsSetting: MultiTabsSetting;\n  // Animation configuration\n  transitionSetting: TransitionSetting;\n  // pageLayout whether to enable keep-alive\n  openKeepAlive: boolean;\n  // Lock screen time\n  lockTime: number;\n  // Show breadcrumbs\n  showBreadCrumb: boolean;\n  // Show breadcrumb icon\n  showBreadCrumbIcon: boolean;\n  // Use error-handler-plugin\n  useErrorHandle: boolean;\n  // Whether to open back to top\n  useOpenBackTop: boolean;\n  // Is it possible to embed iframe pages\n  canEmbedIFramePage: boolean;\n  // Whether to delete unclosed messages and notify when switching the interface\n  closeMessageOnSwitch: boolean;\n  // Whether to cancel the http request that has been sent but not responded when switching the interface.\n  removeAllHttpPending: boolean;\n  aiIconShow: boolean;\n}\n\nexport interface GlobConfig {\n  // Site title\n  title: string;\n  // Service interface url\n  apiUrl: string;\n  domainUrl: string;\n  // Upload url (作废)\n  uploadUrl?: string;\n  openSso?: string;\n  openQianKun?: string;\n  casBaseUrl?: string;\n  // onlineview url\n  viewUrl?: string;\n  //  Service interface url prefix\n  urlPrefix?: string;\n  // Project abbreviation\n  shortName: string;\n  // 短标题\n  shortTitle: string;\n  // 使用新任务弹窗\n  useNewTaskModal: boolean;\n  // 当前是否运行在 electron 平台\n  isElectronPlatform: boolean;\n\n  // 【JEECG作为乾坤子应用】是否以乾坤子应用模式启动\n  isQiankunMicro: boolean;\n  // 【JEECG作为乾坤子应用】乾坤子应用入口\n  qiankunMicroAppEntry?: string;\n}\nexport interface GlobEnvConfig {\n  // Site title\n  VITE_GLOB_APP_TITLE: string;\n  // Service interface url\n  VITE_GLOB_API_URL: string;\n  VITE_USE_MOCK: string;\n  // Service interface url prefix\n  VITE_GLOB_API_URL_PREFIX?: string;\n  // Project abbreviation\n  VITE_GLOB_APP_SHORT_NAME: string;\n  //是否开启单点登录\n  VITE_GLOB_APP_OPEN_SSO: string;\n  //是否开启微应用模式\n  VITE_GLOB_APP_OPEN_QIANKUN: string;\n  //单点服务端地址\n  VITE_GLOB_APP_CAS_BASE_URL: string;\n  VITE_GLOB_DOMAIN_URL: string;\n  // Upload url\n  VITE_GLOB_UPLOAD_URL?: string;\n  // view url\n  VITE_GLOB_ONLINE_VIEW_URL?: string;\n  // 全局隐藏哪些布局，多个用逗号隔开\n  VITE_GLOB_HIDE_LAYOUT_TYPES?: string;\n\n  // 【JEECG作为乾坤子应用】填写后将作为乾坤子应用启动，主应用注册时AppName需保持一致\n  VITE_GLOB_QIANKUN_MICRO_APP_NAME?: string;\n  // 【JEECG作为乾坤子应用】作为乾坤子应用启动时必填，需与qiankun主应用注册子应用时填写的 entry 保持一致\n  VITE_GLOB_QIANKUN_MICRO_APP_ENTRY?: string;\n  //在线文档编辑版本。可选属性：wps, onlyoffice\n  VITE_GLOB_ONLINE_DOCUMENT_VERSION?: string;\n  // 当前运行在什么平台\n  VITE_GLOB_RUN_PLATFORM?: 'web' | 'electron';\n}\n"
  },
  {
    "path": "jeecgboot-vue3/types/global.d.ts",
    "content": "import type { ComponentRenderProxy, VNode, VNodeChild, ComponentPublicInstance, FunctionalComponent, PropType as VuePropType } from 'vue';\n\ndeclare global {\n  const __APP_INFO__: {\n    pkg: {\n      name: string;\n      version: string;\n      dependencies: Recordable<string>;\n      devDependencies: Recordable<string>;\n    };\n    lastBuildTime: string;\n  };\n  // declare interface Window {\n  //   // Global vue app instance\n  //   __APP__: App<Element>;\n  // }\n\n  // vue\n  declare type PropType<T> = VuePropType<T>;\n  declare type VueNode = VNodeChild | JSX.Element | JSX.IntrinsicElements;\n\n  export type Writable<T> = {\n    -readonly [P in keyof T]: T[P];\n  };\n\n  declare type Nullable<T> = T | null;\n  declare type NonNullable<T> = T extends null | undefined ? never : T;\n  declare type Recordable<T = any> = Record<string, T>;\n  declare type ReadonlyRecordable<T = any> = {\n    readonly [key: string]: T;\n  };\n  declare type Indexable<T = any> = {\n    [key: string]: T;\n  };\n  declare type DeepPartial<T> = {\n    [P in keyof T]?: DeepPartial<T[P]>;\n  };\n  declare type TimeoutHandle = ReturnType<typeof setTimeout>;\n  declare type IntervalHandle = ReturnType<typeof setInterval>;\n\n  declare interface ChangeEvent extends Event {\n    target: HTMLInputElement;\n  }\n\n  declare interface WheelEvent {\n    path?: EventTarget[];\n  }\n  interface ImportMetaEnv extends ViteEnv {\n    __: unknown;\n  }\n\n  declare interface ViteEnv {\n    VITE_PORT: number;\n    VITE_USE_MOCK: boolean;\n    VITE_PUBLIC_PATH: string;\n    VITE_PROXY: [string, string][];\n    VITE_GLOB_APP_TITLE: string;\n    VITE_GLOB_APP_SHORT_NAME: string;\n    VITE_USE_CDN: boolean;\n    VITE_BUILD_COMPRESS: 'gzip' | 'brotli' | 'none';\n    VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE: boolean;\n    // 【JEECG作为乾坤子应用】乾坤子应用名，主应用注册时AppName需保持一致\n    VITE_GLOB_QIANKUN_MICRO_APP_NAME?: string;\n    // 【JEECG作为乾坤子应用】非必填，需与qiankun主应用注册子应用时填写的 entry 保持一致\n    VITE_GLOB_QIANKUN_MICRO_APP_ENTRY?: string;\n    // 当前运行在什么平台\n    VITE_GLOB_RUN_PLATFORM?: 'web' | 'electron';\n  }\n\n  declare function parseInt(s: string | number, radix?: number): number;\n\n  declare function parseFloat(string: string | number): number;\n\n  namespace JSX {\n    // tslint:disable no-empty-interface\n    type Element = VNode;\n    // tslint:disable no-empty-interface\n    type ElementClass = ComponentRenderProxy;\n    interface ElementAttributesProperty {\n      $props: any;\n    }\n    interface IntrinsicElements {\n      [elem: string]: any;\n    }\n    interface IntrinsicAttributes {\n      [elem: string]: any;\n    }\n  }\n}\n\ndeclare module 'vue' {\n  export type JSXComponent<Props = any> = { new (): ComponentPublicInstance<Props> } | FunctionalComponent<Props>;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/types/index.d.ts",
    "content": "declare interface Fn<T = any, R = T> {\n  (...arg: T[]): R;\n}\n\ndeclare interface PromiseFn<T = any, R = T> {\n  (...arg: T[]): Promise<R>;\n}\n\ndeclare type RefType<T> = T | null;\n\ndeclare type LabelValueOptions = {\n  label: string;\n  value: any;\n  [key: string]: string | number | boolean;\n}[];\n\ndeclare type EmitType = (event: string, ...args: any[]) => void;\n\ndeclare type TargetContext = '_self' | '_blank';\n\ndeclare interface ComponentElRef<T extends HTMLElement = HTMLDivElement> {\n  $el: T;\n}\n\ndeclare type ComponentRef<T extends HTMLElement = HTMLDivElement> = ComponentElRef<T> | null;\n\ndeclare type ElRef<T extends HTMLElement = HTMLDivElement> = Nullable<T>;\n"
  },
  {
    "path": "jeecgboot-vue3/types/main.d.ts",
    "content": "// 应用参数\nexport type MainAppProps = {\n  container?: HTMLElement;\n  // 隐藏侧边栏（菜单）\n  hideSider?: boolean;\n  // 隐藏顶部\n  hideHeader?: boolean;\n  // 隐藏 多Tab 切换\n  hideMultiTabs?: boolean;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/types/module.d.ts",
    "content": "declare module '*.vue' {\n  import { DefineComponent } from 'vue';\n  const Component: DefineComponent<{}, {}, any>;\n  export default Component;\n}\n\ndeclare module 'ant-design-vue/es/locale/*' {\n  import { Locale } from 'ant-design-vue/types/locale-provider';\n  const locale: Locale & ReadonlyRecordable;\n  export default locale as Locale & ReadonlyRecordable;\n}\n\ndeclare module 'virtual:*' {\n  const result: any;\n  export default result;\n}\n\ndeclare module 'virtual:pwa-register/vue' {\n  import type { Ref } from 'vue';\n\n  export interface RegisterSWOptions {\n    immediate?: boolean;\n    onNeedRefresh?: () => void;\n    onOfflineReady?: () => void;\n    onRegistered?: (registration: ServiceWorkerRegistration | undefined) => void;\n    onRegisterError?: (error: any) => void;\n  }\n\n  export function useRegisterSW(options?: RegisterSWOptions): {\n    needRefresh: Ref<boolean>;\n    offlineReady: Ref<boolean>;\n    updateServiceWorker: (reloadPage?: boolean) => Promise<void>;\n  };\n}\n\n"
  },
  {
    "path": "jeecgboot-vue3/types/store.d.ts",
    "content": "import { ErrorTypeEnum } from '/@/enums/exceptionEnum';\nimport { MenuModeEnum, MenuTypeEnum } from '/@/enums/menuEnum';\nimport { RoleInfo } from '/@/api/sys/model/userModel';\n\n// Lock screen information\nexport interface LockInfo {\n  // Password required\n  pwd?: string | undefined;\n  // Is it locked?\n  isLock?: boolean;\n}\n\n// Error-log information\nexport interface ErrorLogInfo {\n  // Type of error\n  type: ErrorTypeEnum;\n  // Error file\n  file: string;\n  // Error name\n  name?: string;\n  // Error message\n  message: string;\n  // Error stack\n  stack?: string;\n  // Error detail\n  detail: string;\n  // Error url\n  url: string;\n  // Error time\n  time?: string;\n}\n\nexport interface UserInfo {\n  id: string | number;\n  userId: string | number;\n  username: string;\n  realname: string;\n  avatar: string;\n  desc?: string;\n  homePath?: string;\n  tenantid?: string | number;\n  roles: RoleInfo[];\n  orgCode?: string;\n}\n\nexport interface LoginInfo {\n  multi_depart?: string | number;\n  userInfo?: object;\n  departs?: [];\n  tenantList?: [];\n  isLogin?: boolean;\n}\n\nexport interface BeforeMiniState {\n  menuCollapsed?: boolean;\n  menuSplit?: boolean;\n  menuMode?: MenuModeEnum;\n  menuType?: MenuTypeEnum;\n}\n"
  },
  {
    "path": "jeecgboot-vue3/types/utils.d.ts",
    "content": "import type { ComputedRef, Ref } from 'vue';\n\nexport type DynamicProps<T> = {\n  [P in keyof T]: Ref<T[P]> | T[P] | ComputedRef<T[P]>;\n};\n"
  },
  {
    "path": "jeecgboot-vue3/types/vue-router.d.ts",
    "content": "export {};\n\ndeclare module 'vue-router' {\n  interface RouteMeta extends Record<string | number | symbol, unknown> {\n    orderNo?: number;\n    // title\n    title: string;\n    // dynamic router level.\n    dynamicLevel?: number;\n    // dynamic router real route path (For performance).\n    realPath?: string;\n    // Whether to ignore permissions\n    ignoreAuth?: boolean;\n    // role info\n    roles?: RoleEnum[];\n    // Whether not to cache\n    ignoreKeepAlive?: boolean;\n    // Is it fixed on tab\n    affix?: boolean;\n    // icon on tab\n    icon?: string;\n    frameSrc?: string;\n    // current page transition\n    transitionName?: string;\n    // Whether the route has been dynamically added\n    hideBreadcrumb?: boolean;\n    // Hide submenu\n    hideChildrenInMenu?: boolean;\n    // Carrying parameters\n    carryParam?: boolean;\n    // Used internally to mark single-level menus\n    single?: boolean;\n    // Currently active menu\n    currentActiveMenu?: string;\n    // Never show in tab\n    hideTab?: boolean;\n    // Never show in menu\n    hideMenu?: boolean;\n    isLink?: boolean;\n    // only build for Menu\n    ignoreRoute?: boolean;\n    // Hide path for children\n    hidePathForChildren?: boolean;\n  }\n}\n"
  },
  {
    "path": "jeecgboot-vue3/vite.config.ts",
    "content": "import type { UserConfig, ConfigEnv } from 'vite';\nimport pkg from './package.json';\nimport dayjs from 'dayjs';\nimport { loadEnv } from 'vite';\nimport { resolve } from 'path';\nimport { generateModifyVars } from './build/generate/generateModifyVars';\nimport { createProxy } from './build/vite/proxy';\nimport { wrapperEnv } from './build/utils';\nimport { createVitePlugins } from './build/vite/plugin';\nimport { OUTPUT_DIR } from './build/constant';\n\nfunction pathResolve(dir: string) {\n  return resolve(process.cwd(), '.', dir);\n}\n\nconst { dependencies, devDependencies, name, version } = pkg;\nconst __APP_INFO__ = {\n  pkg: { dependencies, devDependencies, name, version },\n  lastBuildTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),\n};\n\nexport default ({ command, mode }: ConfigEnv): UserConfig => {\n  const root = process.cwd();\n\n  const env = loadEnv(mode, root);\n\n  // The boolean type read by loadEnv is a string. This function can be converted to boolean type\n  const viteEnv = wrapperEnv(env);\n\n  const { VITE_PORT, VITE_PUBLIC_PATH, VITE_PROXY } = viteEnv;\n\n  const isBuild = command === 'build';\n\n  const serverOptions: Recordable = {}\n\n  // ----- [begin] 【JEECG作为乾坤子应用】 -----\n  const {VITE_GLOB_QIANKUN_MICRO_APP_NAME, VITE_GLOB_QIANKUN_MICRO_APP_ENTRY} = viteEnv;\n  const isQiankunMicro = VITE_GLOB_QIANKUN_MICRO_APP_NAME != null && VITE_GLOB_QIANKUN_MICRO_APP_NAME !== '';\n  if (isQiankunMicro && !isBuild) {\n    serverOptions.cors = true;\n    serverOptions.origin = VITE_GLOB_QIANKUN_MICRO_APP_ENTRY!.split('/').slice(0, 3).join('/');\n  }\n  // ----- [end] 【JEECG作为乾坤子应用】 -----\n  \n  console.log('[init] Start Port: ', VITE_PORT);\n  console.debug('[init] Vite Proxy Config: ', VITE_PROXY);\n  \n  \n  return {\n    base: isQiankunMicro ? VITE_GLOB_QIANKUN_MICRO_APP_ENTRY : VITE_PUBLIC_PATH,\n    root,\n    resolve: {\n      alias: [\n        {\n          find: 'vue-i18n',\n          replacement: 'vue-i18n/dist/vue-i18n.cjs.js',\n        },\n        // /@/xxxx => src/xxxx\n        {\n          find: /\\/@\\//,\n          replacement: pathResolve('src') + '/',\n        },\n        // /#/xxxx => types/xxxx\n        {\n          find: /\\/#\\//,\n          replacement: pathResolve('types') + '/',\n        },\n        {\n          find: /@\\//,\n          replacement: pathResolve('src') + '/',\n        },\n        // /#/xxxx => types/xxxx\n        {\n          find: /#\\//,\n          replacement: pathResolve('types') + '/',\n        },\n      ],\n    },\n    server: {\n      // Listening on all local IPs\n      host: true,\n      // @ts-ignore\n      https: false,\n      port: VITE_PORT,\n      // Load proxy configuration from .env\n      proxy: createProxy(VITE_PROXY),\n      // 合并 server 配置\n      ...serverOptions,\n    },\n    build: {\n      minify: 'esbuild',\n      target: 'es2015',\n      cssTarget: 'chrome80',\n      outDir: OUTPUT_DIR,\n      rollupOptions: {\n        // 关闭除屑优化，防止删除重要代码，导致打包后功能出现异常\n        treeshake: false,\n        output: {\n          chunkFileNames: 'js/[name]-[hash].js', // 引入文件名的名称\n          entryFileNames: 'js/[name]-[hash].js', // 包的入口文件名称\n          // manualChunks配置 (依赖包从大到小排列)\n          manualChunks: {\n            // vue vue-router合并打包\n            'vue-vendor': ['vue', 'vue-router'],\n            'antd-vue-vendor': ['ant-design-vue','@ant-design/icons-vue','@ant-design/colors'],\n            'vxe-table-vendor': ['vxe-table','vxe-table-plugin-antd','xe-utils'],\n            'emoji-mart-vue-fast': ['emoji-mart-vue-fast'],\n            'china-area-data-vendor': ['china-area-data']\n          },\n        },\n      },\n      // 关闭brotliSize显示可以稍微减少打包时间\n      reportCompressedSize: false,\n      // 提高超大静态资源警告大小\n      chunkSizeWarningLimit: 2000,\n    },\n    esbuild: {\n      //清除全局的console.log和debug\n      drop: isBuild ? ['console', 'debugger'] : [],\n    },\n    define: {\n      // setting vue-i18-next\n      // Suppress warning\n      __INTLIFY_PROD_DEVTOOLS__: false,\n      __APP_INFO__: JSON.stringify(__APP_INFO__),\n    },\n    css: {\n      preprocessorOptions: {\n        less: {\n          modifyVars: generateModifyVars(),\n          javascriptEnabled: true,\n        },\n      },\n    },\n\n    // The vite plugin used by the project. The quantity is large, so it is separately extracted and managed\n    // 预加载构建配置（首屏性能)\n    plugins: createVitePlugins(viteEnv, isBuild, isQiankunMicro),\n    optimizeDeps: {\n      esbuildOptions: {\n        target: 'es2020',\n      },\n      exclude: [\n        //升级vite4后，需要排除online依赖\n        '@jeecg/online',\n        '@jeecg/aiflow',\n      ],\n      // 强制预构建clipboard，解决Vite6对CommonJS模块的严格检查\n      include: ['clipboard']\n    },\n  };\n};\n"
  },
  {
    "path": "start-docker-compose-cloud.bat",
    "content": "@echo off\n:: JEECG Boot 一键启动脚本 (Windows CMD 版)\nchcp 65001 > nul\nset RED=31\nset GREEN=32\n\necho.\necho [1/5] 检查必要工具...\nwhere docker > nul 2>&1 || (\n    echo [错误] 未安装 docker，请先安装 Docker Desktop\n    pause\n    exit /b 1\n)\nwhere docker-compose > nul 2>&1 || (\n    echo [错误] 未安装 docker-compose\n    pause\n    exit /b 1\n)\nwhere mvn > nul 2>&1 || (\n    echo [错误] 未安装 Maven\n    pause\n    exit /b 1\n)\nwhere pnpm > nul 2>&1 || (\n    echo [错误] 未安装 pnpm\n    pause\n    exit /b 1\n)\n\necho [2/5] 设置 hosts 文件...\nset \"entry1=127.0.0.1   jeecg-boot-gateway\"\nset \"entry2=127.0.0.1   jeecg-boot-mysql\"\nset \"hostsFile=C:\\Windows\\System32\\drivers\\etc\\hosts\"\n\nrem 检查第一个条目是否存在\nfindstr /c:\"%entry1%\" \"%hostsFile%\" >nul\nif errorlevel 1 (\n    echo %entry1% >> \"%hostsFile%\"\n    echo 已添加: %entry1%\n) else (\n    echo 已存在: %entry1%\n)\n\nrem 检查第二个条目是否存在\nfindstr /c:\"%entry2%\" \"%hostsFile%\" >nul\nif errorlevel 1 (\n    echo %entry2% >> \"%hostsFile%\"\n    echo 已添加: %entry2%\n) else (\n    echo 已存在: %entry2%\n)\n\nif %errorlevel% neq 0 (\n    echo [错误] 设置 hosts 文件失败，请检查权限！\n    pause\n)\n\necho [3/5] 编译后端项目...\ncd jeecg-boot\ncall mvn clean install -Pdev,SpringCloud\nif %errorlevel% neq 0 (\n    echo [错误] 后端编译失败！\n    pause\n    exit /b 1\n)\ncd ..\n\necho [4/5] 编译前端项目...\ncd jeecgboot-vue3\ncall pnpm install\nif %errorlevel% neq 0 (\n    echo [错误] 前端依赖安装失败！\n    pause\n    exit /b 1\n)\ncall pnpm run build:dockercloud\nif %errorlevel% neq 0 (\n    echo [错误] 前端编译失败！\n    pause\n    exit /b 1\n)\ncd ..\n\necho [5/5] 启动Docker容器...\ndocker-compose -f docker-compose-cloud.yml up -d\n\necho.\necho ========================================\necho   JEECG Boot 启动成功 (请等待1分钟，待所有容器启动成功）\necho ========================================\necho 前端访问:      http://localhost\necho 后端API:      http://localhost:9999\necho.\npause"
  },
  {
    "path": "start-docker-compose-cloud.sh",
    "content": "#!/bin/bash\n# JEECG Boot 一键启动脚本 (Linux Bash 版)\n\nset -e  # 遇到错误时退出脚本\n\n# 检查必要工具\necho \"[1/5] 检查必要工具...\"\ncommand -v docker >/dev/null 2>&1 || { echo \"[错误] 未安装 Docker，请先安装 Docker\"; exit 1; }\ncommand -v docker-compose >/dev/null 2>&1 || { echo \"[错误] 未安装 docker-compose\"; exit 1; }\ncommand -v mvn >/dev/null 2>&1 || { echo \"[错误] 未安装 Maven\"; exit 1; }\ncommand -v pnpm >/dev/null 2>&1 || { echo \"[错误] 未安装 pnpm\"; exit 1; }\n\n# 设置 hosts 文件\necho \"[2/5] 设置 hosts 文件...\"\nentry1=\"127.0.0.1   jeecg-boot-gateway\"\nentry2=\"127.0.0.1   jeecg-boot-mysql\"\nhostsFile=\"/etc/hosts\"\n\n# 检查第一个条目是否存在\nif ! grep -q \"$entry1\" \"$hostsFile\"; then\n    echo \"$entry1\" | sudo tee -a \"$hostsFile\" > /dev/null\n    echo \"已添加: $entry1\"\nelse\n    echo \"已存在: $entry1\"\nfi\n\n# 检查第二个条目是否存在\nif ! grep -q \"$entry2\" \"$hostsFile\"; then\n    echo \"$entry2\" | sudo tee -a \"$hostsFile\" > /dev/null\n    echo \"已添加: $entry2\"\nelse\n    echo \"已存在: $entry2\"\nfi\n\necho \"[3/5] 编译后端项目...\"\ncd jeecg-boot\nmvn clean install -Pdev,SpringCloud\n\necho \"[4/5] 编译前端项目...\"\ncd ../jeecgboot-vue3\npnpm install\npnpm run build:dockercloud\ncd ..\n\necho \"[5/5] 启动Docker容器...\"\ndocker-compose -f docker-compose-cloud.yml up -d\n\necho\necho \"========================================\"\necho \"  JEECG Boot 启动成功 (请等待1分钟，待所有容器启动成功）\"\necho \"========================================\"\necho \"前端访问:      http://localhost\"\necho \"后端API:      http://localhost:9999\"\necho"
  },
  {
    "path": "start-docker-compose.bat",
    "content": "@echo off\n:: JEECG Boot 一键启动脚本 (Windows CMD 版)\nchcp 65001 > nul\nset RED=31\nset GREEN=32\n\necho.\necho [1/5] 检查必要工具...\nwhere docker > nul 2>&1 || (\n    echo [错误] 未安装 docker，请先安装 Docker Desktop\n    pause\n    exit /b 1\n)\nwhere docker-compose > nul 2>&1 || (\n    echo [错误] 未安装 docker-compose\n    pause\n    exit /b 1\n)\nwhere mvn > nul 2>&1 || (\n    echo [错误] 未安装 Maven\n    pause\n    exit /b 1\n)\nwhere pnpm > nul 2>&1 || (\n    echo [错误] 未安装 pnpm\n    pause\n    exit /b 1\n)\n\necho [2/5] 设置 hosts 文件...\nset \"entry1=127.0.0.1   jeecg-boot-system\"\nset \"entry2=127.0.0.1   jeecg-boot-mysql\"\nset \"hostsFile=C:\\Windows\\System32\\drivers\\etc\\hosts\"\n\nrem 检查第一个条目是否存在\nfindstr /c:\"%entry1%\" \"%hostsFile%\" >nul\nif errorlevel 1 (\n    echo %entry1% >> \"%hostsFile%\"\n    echo 已添加: %entry1%\n) else (\n    echo 已存在: %entry1%\n)\n\nrem 检查第二个条目是否存在\nfindstr /c:\"%entry2%\" \"%hostsFile%\" >nul\nif errorlevel 1 (\n    echo %entry2% >> \"%hostsFile%\"\n    echo 已添加: %entry2%\n) else (\n    echo 已存在: %entry2%\n)\n\nif %errorlevel% neq 0 (\n    echo [错误] 设置 hosts 文件失败，请检查权限！\n    pause\n)\n\necho [3/5] 编译后端项目...\ncd jeecg-boot\ncall mvn clean install -Pdocker\nif %errorlevel% neq 0 (\n    echo [错误] 后端编译失败！\n    pause\n    exit /b 1\n)\ncd ..\n\necho [4/5] 编译前端项目...\ncd jeecgboot-vue3\ncall pnpm install\nif %errorlevel% neq 0 (\n    echo [错误] 前端依赖安装失败！\n    pause\n    exit /b 1\n)\ncall pnpm run build:docker\nif %errorlevel% neq 0 (\n    echo [错误] 前端编译失败！\n    pause\n    exit /b 1\n)\ncd ..\n\necho [5/5] 启动Docker容器...\ndocker-compose up -d\n\necho.\necho ========================================\necho   JEECG Boot 启动成功 (请等待1分钟，待所有容器启动成功）\necho ========================================\necho 前端访问:      http://localhost\necho 后端API:      http://localhost:8080/jeecg-boot\necho.\npause"
  },
  {
    "path": "start-docker-compose.sh",
    "content": "#!/bin/bash\n# JEECG Boot 一键启动脚本 (Linux Bash 版)\n\nset -e\n\nRED='\\033[0;31m'\nGREEN='\\033[0;32m'\nNC='\\033[0m' # No Color\n\necho\necho -e \"[1/5] 检查必要工具...\"\n\n# 检查必要工具\ncommand -v docker > /dev/null 2>&1 || { echo -e \"${RED}[错误] 未安装 docker，请先安装 Docker Desktop${NC}\"; exit 1; }\ncommand -v docker-compose > /dev/null 2>&1 || { echo -e \"${RED}[错误] 未安装 docker-compose${NC}\"; exit 1; }\ncommand -v mvn > /dev/null 2>&1 || { echo -e \"${RED}[错误] 未安装 Maven${NC}\"; exit 1; }\ncommand -v pnpm > /dev/null 2>&1 || { echo -e \"${RED}[错误] 未安装 pnpm${NC}\"; exit 1; }\n\necho -e \"[2/5] 设置 hosts 文件...\"\nentry1=\"127.0.0.1   jeecg-boot-system\"\nentry2=\"127.0.0.1   jeecg-boot-mysql\"\nhostsFile=\"/etc/hosts\"\n\n# 检查第一个条目是否存在\nif ! grep -q \"$entry1\" \"$hostsFile\"; then\n    echo \"$entry1\" | sudo tee -a \"$hostsFile\" > /dev/null\n    echo \"已添加: $entry1\"\nelse\n    echo \"已存在: $entry1\"\nfi\n\n# 检查第二个条目是否存在\nif ! grep -q \"$entry2\" \"$hostsFile\"; then\n    echo \"$entry2\" | sudo tee -a \"$hostsFile\" > /dev/null\n    echo \"已添加: $entry2\"\nelse\n    echo \"已存在: $entry2\"\nfi\n\necho -e \"[3/5] 编译后端项目...\"\ncd jeecg-boot\nmvn clean install -Pdocker\n\necho -e \"[4/5] 编译前端项目...\"\ncd ../jeecgboot-vue3\npnpm install\npnpm run build:docker\n\necho -e \"[5/5] 启动Docker容器...\"\ndocker-compose up -d\n\necho\necho \"========================================\"\necho \"  JEECG Boot 启动成功 (请等待1分钟，待所有容器启动成功）\"\necho \"========================================\"\necho \"前端访问:      http://localhost\"\necho \"后端API:      http://localhost:8080/jeecg-boot\"\necho\n"
  }
]